From cf31af77c98033f02eff5dd6b72c31529f3c20bc Mon Sep 17 00:00:00 2001 From: Nicolas Will Date: Fri, 27 Feb 2026 17:17:07 +0100 Subject: [PATCH 0001/2098] Add Micronaut framework support for Java QL Add CodeQL support for Micronaut: add MaD models for HTTP, HTTP client and multipart (sources, sinks and summary propagation), new framework QLL modules (Controller, WebSocket, Config, Data, Security). Add library tests and query tests exercising request inputs, file uploads, HttpClient sinks (SSRF), header sinks (response-splitting) and redirect sinks (open-redirect), plus expected results and extractor options. Include Micronaut 4.x stubs used by the tests. --- .../ext/io.micronaut.http.client.model.yml | 33 + java/ql/lib/ext/io.micronaut.http.model.yml | 38 + .../ext/io.micronaut.http.multipart.model.yml | 10 + .../semmle/code/java/dataflow/FlowSources.qll | 35 + .../frameworks/micronaut/MicronautConfig.qll | 41 + .../micronaut/MicronautController.qll | 142 ++ .../frameworks/micronaut/MicronautData.qll | 32 + .../micronaut/MicronautSecurity.qll | 38 + .../micronaut/MicronautWebSocket.qll | 53 + .../micronaut/MicronautConfigTest.java | 30 + .../micronaut/MicronautControllerTest.java | 95 + .../micronaut/MicronautFileUploadTest.java | 18 + .../micronaut/MicronautHttpClientTest.java | 106 ++ .../micronaut/MicronautHttpRequestTest.java | 67 + .../micronaut/MicronautWebSocketTest.java | 18 + .../frameworks/micronaut/flow.expected | 0 .../frameworks/micronaut/flow.ql | 27 + .../frameworks/micronaut/options | 1 + .../tests/MicronautResponseSplitting.java | 22 + .../semmle/tests/ResponseSplitting.expected | 23 +- .../security/CWE-113/semmle/tests/options | 2 +- .../semmle/tests/MicronautUrlRedirect.java | 25 + .../CWE-601/semmle/tests/UrlRedirect.expected | 24 +- .../security/CWE-601/semmle/tests/options | 2 +- .../security/CWE-918/MicronautSSRF.java | 33 + .../security/CWE-918/RequestForgery.expected | 1677 +++++++++-------- .../test/query-tests/security/CWE-918/options | 2 +- java/ql/test/stubs/micronaut-4.x/LICENSE.txt | 201 ++ .../context/annotation/Property.java | 11 + .../micronaut/context/annotation/Value.java | 10 + .../io/micronaut/data/annotation/Query.java | 10 + .../micronaut/data/annotation/Repository.java | 10 + .../data/repository/CrudRepository.java | 15 + .../data/repository/GenericRepository.java | 4 + .../io/micronaut/http/HttpHeaders.java | 11 + .../io/micronaut/http/HttpMethod.java | 5 + .../io/micronaut/http/HttpParameters.java | 10 + .../io/micronaut/http/HttpRequest.java | 26 + .../io/micronaut/http/HttpResponse.java | 18 + .../io/micronaut/http/HttpStatus.java | 30 + .../io/micronaut/http/MediaType.java | 15 + .../micronaut/http/MutableHttpResponse.java | 11 + .../io/micronaut/http/annotation/Body.java | 10 + .../micronaut/http/annotation/Controller.java | 10 + .../http/annotation/CookieValue.java | 10 + .../http/annotation/CustomHttpMethod.java | 11 + .../io/micronaut/http/annotation/Delete.java | 11 + .../io/micronaut/http/annotation/Error.java | 13 + .../io/micronaut/http/annotation/Get.java | 11 + .../io/micronaut/http/annotation/Head.java | 11 + .../io/micronaut/http/annotation/Header.java | 10 + .../io/micronaut/http/annotation/Options.java | 11 + .../io/micronaut/http/annotation/Part.java | 10 + .../io/micronaut/http/annotation/Patch.java | 11 + .../http/annotation/PathVariable.java | 10 + .../io/micronaut/http/annotation/Post.java | 11 + .../io/micronaut/http/annotation/Put.java | 11 + .../micronaut/http/annotation/QueryValue.java | 10 + .../http/annotation/RequestAttribute.java | 10 + .../http/annotation/RequestBean.java | 11 + .../io/micronaut/http/annotation/Trace.java | 11 + .../http/client/BlockingHttpClient.java | 13 + .../io/micronaut/http/client/HttpClient.java | 5 + .../io/micronaut/http/cookie/Cookie.java | 11 + .../io/micronaut/http/cookie/Cookies.java | 11 + .../http/multipart/CompletedFileUpload.java | 14 + .../io/micronaut/http/uri/UriBuilder.java | 13 + .../security/annotation/Secured.java | 10 + .../micronaut/websocket/WebSocketSession.java | 13 + .../websocket/annotation/OnClose.java | 9 + .../websocket/annotation/OnMessage.java | 9 + .../websocket/annotation/OnOpen.java | 9 + .../websocket/annotation/ServerWebSocket.java | 10 + 73 files changed, 2467 insertions(+), 844 deletions(-) create mode 100644 java/ql/lib/ext/io.micronaut.http.client.model.yml create mode 100644 java/ql/lib/ext/io.micronaut.http.model.yml create mode 100644 java/ql/lib/ext/io.micronaut.http.multipart.model.yml create mode 100644 java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautConfig.qll create mode 100644 java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautController.qll create mode 100644 java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautData.qll create mode 100644 java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautSecurity.qll create mode 100644 java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautWebSocket.qll create mode 100644 java/ql/test/library-tests/frameworks/micronaut/MicronautConfigTest.java create mode 100644 java/ql/test/library-tests/frameworks/micronaut/MicronautControllerTest.java create mode 100644 java/ql/test/library-tests/frameworks/micronaut/MicronautFileUploadTest.java create mode 100644 java/ql/test/library-tests/frameworks/micronaut/MicronautHttpClientTest.java create mode 100644 java/ql/test/library-tests/frameworks/micronaut/MicronautHttpRequestTest.java create mode 100644 java/ql/test/library-tests/frameworks/micronaut/MicronautWebSocketTest.java create mode 100644 java/ql/test/library-tests/frameworks/micronaut/flow.expected create mode 100644 java/ql/test/library-tests/frameworks/micronaut/flow.ql create mode 100644 java/ql/test/library-tests/frameworks/micronaut/options create mode 100644 java/ql/test/query-tests/security/CWE-113/semmle/tests/MicronautResponseSplitting.java create mode 100644 java/ql/test/query-tests/security/CWE-601/semmle/tests/MicronautUrlRedirect.java create mode 100644 java/ql/test/query-tests/security/CWE-918/MicronautSSRF.java create mode 100644 java/ql/test/stubs/micronaut-4.x/LICENSE.txt create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/context/annotation/Property.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/context/annotation/Value.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/data/annotation/Query.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/data/annotation/Repository.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/data/repository/CrudRepository.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/data/repository/GenericRepository.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpHeaders.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpMethod.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpParameters.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpRequest.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpResponse.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpStatus.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/MediaType.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/MutableHttpResponse.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Body.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Controller.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/CookieValue.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/CustomHttpMethod.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Delete.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Error.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Get.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Head.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Header.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Options.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Part.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Patch.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/PathVariable.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Post.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Put.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/QueryValue.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/RequestAttribute.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/RequestBean.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Trace.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/client/BlockingHttpClient.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/client/HttpClient.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/cookie/Cookie.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/cookie/Cookies.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/multipart/CompletedFileUpload.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/http/uri/UriBuilder.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/security/annotation/Secured.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/websocket/WebSocketSession.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/websocket/annotation/OnClose.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/websocket/annotation/OnMessage.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/websocket/annotation/OnOpen.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/websocket/annotation/ServerWebSocket.java diff --git a/java/ql/lib/ext/io.micronaut.http.client.model.yml b/java/ql/lib/ext/io.micronaut.http.client.model.yml new file mode 100644 index 000000000000..05741c4902de --- /dev/null +++ b/java/ql/lib/ext/io.micronaut.http.client.model.yml @@ -0,0 +1,33 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: sinkModel + data: + # HttpClient.toBlocking() returns BlockingHttpClient; retrieve/exchange with String URL are SSRF sinks + - ["io.micronaut.http.client", "BlockingHttpClient", True, "retrieve", "(String)", "", "Argument[0]", "request-forgery", "manual"] + - ["io.micronaut.http.client", "BlockingHttpClient", True, "retrieve", "(String,Class)", "", "Argument[0]", "request-forgery", "manual"] + - ["io.micronaut.http.client", "BlockingHttpClient", True, "exchange", "(String)", "", "Argument[0]", "request-forgery", "manual"] + - ["io.micronaut.http.client", "BlockingHttpClient", True, "exchange", "(String,Class)", "", "Argument[0]", "request-forgery", "manual"] + - addsTo: + pack: codeql/java-all + extensible: summaryModel + data: + # HttpClient.toBlocking() taint propagation + - ["io.micronaut.http.client", "HttpClient", True, "toBlocking", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] + # HttpRequest.GET/POST/PUT/DELETE/PATCH factory methods propagate URI taint + - ["io.micronaut.http", "HttpRequest", True, "GET", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "POST", "(String,Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "PUT", "(String,Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "DELETE", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "PATCH", "(String,Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "HEAD", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "OPTIONS", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + # UriBuilder taint propagation + - ["io.micronaut.http.uri", "UriBuilder", True, "of", "(CharSequence)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http.uri", "UriBuilder", True, "of", "(URI)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http.uri", "UriBuilder", True, "host", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http.uri", "UriBuilder", True, "path", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http.uri", "UriBuilder", True, "queryParam", "(String,Object[])", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http.uri", "UriBuilder", True, "queryParam", "(String,Object[])", "", "Argument[1].ArrayElement", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http.uri", "UriBuilder", True, "fragment", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http.uri", "UriBuilder", True, "build", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] diff --git a/java/ql/lib/ext/io.micronaut.http.model.yml b/java/ql/lib/ext/io.micronaut.http.model.yml new file mode 100644 index 000000000000..53edff0983ec --- /dev/null +++ b/java/ql/lib/ext/io.micronaut.http.model.yml @@ -0,0 +1,38 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: sourceModel + data: + - ["io.micronaut.http", "HttpRequest", True, "getBody", "", "", "ReturnValue", "remote", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "getHeaders", "", "", "ReturnValue", "remote", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "getParameters", "", "", "ReturnValue", "remote", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "getCookies", "", "", "ReturnValue", "remote", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "getUri", "", "", "ReturnValue", "remote", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "getPath", "", "", "ReturnValue", "remote", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "getContentType", "", "", "ReturnValue", "remote", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "getContentLength", "", "", "ReturnValue", "remote", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "getMethodName", "", "", "ReturnValue", "remote", "manual"] + - addsTo: + pack: codeql/java-all + extensible: summaryModel + data: + - ["io.micronaut.http", "HttpHeaders", True, "get", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http", "HttpHeaders", True, "getAll", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http", "HttpHeaders", True, "getFirst", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http", "HttpHeaders", True, "values", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http", "HttpParameters", True, "get", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http", "HttpParameters", True, "getAll", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http", "HttpParameters", True, "getFirst", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http.cookie", "Cookies", True, "get", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http.cookie", "Cookies", True, "getAll", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http.cookie", "Cookies", True, "findCookie", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http.cookie", "Cookie", True, "getValue", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http.cookie", "Cookie", True, "getName", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http.cookie", "Cookie", True, "getDomain", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http.cookie", "Cookie", True, "getPath", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - addsTo: + pack: codeql/java-all + extensible: sinkModel + data: + - ["io.micronaut.http", "MutableHttpResponse", True, "header", "(CharSequence,CharSequence)", "", "Argument[1]", "response-splitting", "manual"] + - ["io.micronaut.http", "HttpResponse", True, "redirect", "(URI)", "", "Argument[0]", "url-redirection", "manual"] diff --git a/java/ql/lib/ext/io.micronaut.http.multipart.model.yml b/java/ql/lib/ext/io.micronaut.http.multipart.model.yml new file mode 100644 index 000000000000..36116e12f08f --- /dev/null +++ b/java/ql/lib/ext/io.micronaut.http.multipart.model.yml @@ -0,0 +1,10 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: sourceModel + data: + - ["io.micronaut.http.multipart", "CompletedFileUpload", True, "getBytes", "", "", "ReturnValue", "remote", "manual"] + - ["io.micronaut.http.multipart", "CompletedFileUpload", True, "getInputStream", "", "", "ReturnValue", "remote", "manual"] + - ["io.micronaut.http.multipart", "CompletedFileUpload", True, "getFilename", "", "", "ReturnValue", "remote", "manual"] + - ["io.micronaut.http.multipart", "CompletedFileUpload", True, "getContentType", "", "", "ReturnValue", "remote", "manual"] + - ["io.micronaut.http.multipart", "CompletedFileUpload", True, "getSize", "", "", "ReturnValue", "remote", "manual"] diff --git a/java/ql/lib/semmle/code/java/dataflow/FlowSources.qll b/java/ql/lib/semmle/code/java/dataflow/FlowSources.qll index 8c6ac60eb24f..41aca7a05c41 100644 --- a/java/ql/lib/semmle/code/java/dataflow/FlowSources.qll +++ b/java/ql/lib/semmle/code/java/dataflow/FlowSources.qll @@ -30,6 +30,9 @@ import semmle.code.java.frameworks.Guice import semmle.code.java.frameworks.struts.StrutsActions import semmle.code.java.frameworks.Thrift import semmle.code.java.frameworks.javaee.jsf.JSFRenderer +import semmle.code.java.frameworks.micronaut.MicronautController +import semmle.code.java.frameworks.micronaut.MicronautWebSocket +import semmle.code.java.frameworks.micronaut.MicronautConfig private import semmle.code.java.dataflow.ExternalFlow private import codeql.threatmodels.ThreatModels @@ -187,6 +190,38 @@ private class AndroidExternalStorageSource extends RemoteFlowSource { override string getSourceType() { result = "Android external storage" } } +private class MicronautHttpInputParameterSource extends RemoteFlowSource { + MicronautHttpInputParameterSource() { + this.asParameter() = any(MicronautRequestMappingParameter mrmp | mrmp.isTaintedInput()) + } + + override string getSourceType() { result = "Micronaut HTTP input parameter" } +} + +private class MicronautWebSocketParameterSource extends RemoteFlowSource { + MicronautWebSocketParameterSource() { this.asParameter() instanceof MicronautWebSocketParameter } + + override string getSourceType() { result = "Micronaut WebSocket parameter" } +} + +private class MicronautConfigSource extends LocalUserInput { + MicronautConfigSource() { + this.asExpr() = any(MicronautConfigField f).getAnAccess() + or + this.asParameter() instanceof MicronautConfigParameter + } + + override string getThreatModel() { result = "environment" } +} + +private class MicronautErrorHandlerSource extends RemoteFlowSource { + MicronautErrorHandlerSource() { + this.asParameter() = any(MicronautErrorHandler h).getARemoteParameter() + } + + override string getSourceType() { result = "Micronaut error handler parameter" } +} + /** Class for `tainted` user input. */ abstract class UserInput extends SourceNode { } diff --git a/java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautConfig.qll b/java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautConfig.qll new file mode 100644 index 000000000000..3d1b3c5126b3 --- /dev/null +++ b/java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautConfig.qll @@ -0,0 +1,41 @@ +/** Provides classes for identifying Micronaut configuration injection sources. */ +overlay[local?] +module; + +import java + +/** The annotation type `@Value` from `io.micronaut.context.annotation`. */ +class MicronautValueAnnotation extends AnnotationType { + MicronautValueAnnotation() { this.hasQualifiedName("io.micronaut.context.annotation", "Value") } +} + +/** The annotation type `@Property` from `io.micronaut.context.annotation`. */ +class MicronautPropertyAnnotation extends AnnotationType { + MicronautPropertyAnnotation() { + this.hasQualifiedName("io.micronaut.context.annotation", "Property") + } +} + +/** + * A field annotated with Micronaut's `@Value` or `@Property` annotation, + * representing an injected configuration value. + */ +class MicronautConfigField extends Field { + MicronautConfigField() { + this.getAnAnnotation().getType() instanceof MicronautValueAnnotation + or + this.getAnAnnotation().getType() instanceof MicronautPropertyAnnotation + } +} + +/** + * A parameter annotated with Micronaut's `@Value` or `@Property` annotation, + * representing an injected configuration value. + */ +class MicronautConfigParameter extends Parameter { + MicronautConfigParameter() { + this.getAnAnnotation().getType() instanceof MicronautValueAnnotation + or + this.getAnAnnotation().getType() instanceof MicronautPropertyAnnotation + } +} diff --git a/java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautController.qll b/java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautController.qll new file mode 100644 index 000000000000..9ceb1c0003b7 --- /dev/null +++ b/java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautController.qll @@ -0,0 +1,142 @@ +/** + * Provides classes for identifying Micronaut HTTP controllers and their request handling methods. + */ +overlay[local?] +module; + +import java + +/** An annotation type that identifies Micronaut controllers. */ +class MicronautControllerAnnotation extends AnnotationType { + MicronautControllerAnnotation() { + this.hasQualifiedName("io.micronaut.http.annotation", "Controller") + } +} + +/** + * A class annotated as a Micronaut `@Controller`. + */ +class MicronautController extends Class { + MicronautController() { + this.getAnAnnotation().getType() instanceof MicronautControllerAnnotation + } +} + +/** An annotation type that identifies Micronaut HTTP method mappings. */ +class MicronautHttpMethodAnnotation extends AnnotationType { + MicronautHttpMethodAnnotation() { + this.getPackage().hasName("io.micronaut.http.annotation") and + this.hasName([ + "Get", "Post", "Put", "Delete", "Patch", "Head", "Options", "Trace", "CustomHttpMethod" + ]) + } +} + +/** + * A method on a Micronaut controller that is executed in response to an HTTP request. + */ +class MicronautRequestMappingMethod extends Method { + MicronautRequestMappingMethod() { + this.getDeclaringType() instanceof MicronautController and + this.getAnAnnotation().getType() instanceof MicronautHttpMethodAnnotation + } + + /** Gets a request mapping parameter. */ + MicronautRequestMappingParameter getARequestParameter() { result = this.getAParameter() } +} + +/** A Micronaut annotation indicating remote user input from HTTP requests. */ +class MicronautHttpInputAnnotation extends Annotation { + MicronautHttpInputAnnotation() { + exists(AnnotationType a | + a = this.getType() and + a.getPackage().hasName("io.micronaut.http.annotation") + | + a.hasName([ + "PathVariable", "QueryValue", "Body", "Header", "CookieValue", "Part", "RequestAttribute" + ]) + ) + } +} + +/** A parameter of a `MicronautRequestMappingMethod`. */ +class MicronautRequestMappingParameter extends Parameter { + MicronautRequestMappingParameter() { this.getCallable() instanceof MicronautRequestMappingMethod } + + /** Holds if the parameter should not be considered a direct source of taint. */ + predicate isNotDirectlyTaintedInput() { + this.getType().(RefType).getAnAncestor().hasQualifiedName("io.micronaut.http", "HttpResponse") + or + this.getType() + .(RefType) + .getAnAncestor() + .hasQualifiedName("io.micronaut.http", "MutableHttpResponse") + or + this.getType().(RefType).getAnAncestor().hasQualifiedName("java.security", "Principal") + or + this.getType().(RefType).getAnAncestor().hasQualifiedName("java.util", "Locale") + or + this.getType().(RefType).getAnAncestor().hasQualifiedName("java.util", "TimeZone") + or + this.getType().(RefType).getAnAncestor().hasQualifiedName("java.time", "ZoneId") + or + // @Value/@Property parameters are configuration injection, not HTTP input + this.getAnAnnotation() + .getType() + .hasQualifiedName("io.micronaut.context.annotation", ["Value", "Property"]) + } + + private predicate isExplicitlyTaintedInput() { + // The MicronautHttpInputAnnotations allow access to the URI path, + // request parameters, cookie values, headers, and the body of the request. + this.getAnAnnotation() instanceof MicronautHttpInputAnnotation + or + // A @RequestBean parameter binds multiple request attributes into a POJO + this.getAnAnnotation().getType() instanceof MicronautRequestBeanAnnotation + or + // An HttpRequest parameter provides access to request data + this.getType() + .(RefType) + .getASourceSupertype*() + .hasQualifiedName("io.micronaut.http", "HttpRequest") + or + // InputStream or Reader parameters allow access to the body of a request + this.getType().(RefType).getAnAncestor() instanceof TypeInputStream + or + this.getType().(RefType).getAnAncestor().hasQualifiedName("java.io", "Reader") + } + + /** Holds if the input is tainted (i.e. comes from user-controlled input). */ + predicate isTaintedInput() { + this.isExplicitlyTaintedInput() + or + not this.isNotDirectlyTaintedInput() + } +} + +/** An annotation type that identifies Micronaut error handler methods. */ +class MicronautErrorAnnotation extends AnnotationType { + MicronautErrorAnnotation() { this.hasQualifiedName("io.micronaut.http.annotation", "Error") } +} + +/** A method annotated with Micronaut's `@Error` that handles exceptions. */ +class MicronautErrorHandler extends Method { + MicronautErrorHandler() { this.getAnAnnotation().getType() instanceof MicronautErrorAnnotation } + + /** Gets a parameter that carries user-controlled request data. */ + Parameter getARemoteParameter() { + result = this.getAParameter() and + result + .getType() + .(RefType) + .getASourceSupertype*() + .hasQualifiedName("io.micronaut.http", "HttpRequest") + } +} + +/** An annotation type that identifies Micronaut request bean parameters. */ +class MicronautRequestBeanAnnotation extends AnnotationType { + MicronautRequestBeanAnnotation() { + this.hasQualifiedName("io.micronaut.http.annotation", "RequestBean") + } +} diff --git a/java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautData.qll b/java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautData.qll new file mode 100644 index 000000000000..0ae6f1e516f9 --- /dev/null +++ b/java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautData.qll @@ -0,0 +1,32 @@ +/** Provides classes for identifying Micronaut Data repositories and query annotations. */ +overlay[local?] +module; + +import java + +/** + * The annotation type `@Query` from `io.micronaut.data.annotation`. + */ +class MicronautQueryAnnotation extends AnnotationType { + MicronautQueryAnnotation() { this.hasQualifiedName("io.micronaut.data.annotation", "Query") } +} + +/** + * The annotation type `@Repository` from `io.micronaut.data.annotation`. + */ +class MicronautRepositoryAnnotation extends AnnotationType { + MicronautRepositoryAnnotation() { + this.hasQualifiedName("io.micronaut.data.annotation", "Repository") + } +} + +/** + * A class annotated with Micronaut's `@Repository` annotation. + */ +class MicronautRepositoryClass extends RefType { + MicronautRepositoryClass() { + this.getAnAnnotation().getType() instanceof MicronautRepositoryAnnotation + or + this.getAnAncestor().hasQualifiedName("io.micronaut.data.repository", "GenericRepository") + } +} diff --git a/java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautSecurity.qll b/java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautSecurity.qll new file mode 100644 index 000000000000..299d64a246e0 --- /dev/null +++ b/java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautSecurity.qll @@ -0,0 +1,38 @@ +/** + * Provides classes for identifying Micronaut Security annotations. + * + * Micronaut Security provides the `@Secured` annotation and integrates + * with standard `@RolesAllowed` for method-level access control. + */ +overlay[local?] +module; + +import java + +/** + * The annotation type `@Secured` from `io.micronaut.security.annotation`. + */ +class MicronautSecuredAnnotation extends AnnotationType { + MicronautSecuredAnnotation() { + this.hasQualifiedName("io.micronaut.security.annotation", "Secured") + } +} + +/** + * A callable (method or constructor) that is annotated with Micronaut's `@Secured` + * annotation, either directly or via its declaring type. + */ +class MicronautSecuredCallable extends Callable { + MicronautSecuredCallable() { + this.getAnAnnotation().getType() instanceof MicronautSecuredAnnotation + or + this.getDeclaringType().getAnAnnotation().getType() instanceof MicronautSecuredAnnotation + } +} + +/** + * A class annotated with Micronaut's `@Secured` annotation. + */ +class MicronautSecuredClass extends Class { + MicronautSecuredClass() { this.getAnAnnotation().getType() instanceof MicronautSecuredAnnotation } +} diff --git a/java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautWebSocket.qll b/java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautWebSocket.qll new file mode 100644 index 000000000000..eafbca58e69c --- /dev/null +++ b/java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautWebSocket.qll @@ -0,0 +1,53 @@ +/** Provides classes for identifying Micronaut WebSocket endpoints. */ +overlay[local?] +module; + +import java + +/** + * The annotation type `@ServerWebSocket` from `io.micronaut.websocket.annotation`. + */ +class MicronautServerWebSocketAnnotation extends AnnotationType { + MicronautServerWebSocketAnnotation() { + this.hasQualifiedName("io.micronaut.websocket.annotation", "ServerWebSocket") + } +} + +/** + * A class annotated with `@ServerWebSocket`, representing a Micronaut WebSocket endpoint. + */ +class MicronautServerWebSocketClass extends Class { + MicronautServerWebSocketClass() { + this.getAnAnnotation().getType() instanceof MicronautServerWebSocketAnnotation + } +} + +/** An annotation type for Micronaut WebSocket message handler methods. */ +class MicronautWebSocketHandlerAnnotation extends AnnotationType { + MicronautWebSocketHandlerAnnotation() { + this.getPackage().hasName("io.micronaut.websocket.annotation") and + this.hasName(["OnMessage", "OnOpen"]) + } +} + +/** + * A method on a Micronaut `@ServerWebSocket` class that handles WebSocket messages. + */ +class MicronautWebSocketMessageHandler extends Method { + MicronautWebSocketMessageHandler() { + this.getDeclaringType() instanceof MicronautServerWebSocketClass and + this.getAnAnnotation().getType() instanceof MicronautWebSocketHandlerAnnotation + } +} + +/** A parameter of a Micronaut WebSocket message handler that receives user-controlled data. */ +class MicronautWebSocketParameter extends Parameter { + MicronautWebSocketParameter() { + this.getCallable() instanceof MicronautWebSocketMessageHandler and + // Exclude WebSocketSession parameters + not this.getType() + .(RefType) + .getAnAncestor() + .hasQualifiedName("io.micronaut.websocket", "WebSocketSession") + } +} diff --git a/java/ql/test/library-tests/frameworks/micronaut/MicronautConfigTest.java b/java/ql/test/library-tests/frameworks/micronaut/MicronautConfigTest.java new file mode 100644 index 000000000000..f5e8a36cda80 --- /dev/null +++ b/java/ql/test/library-tests/frameworks/micronaut/MicronautConfigTest.java @@ -0,0 +1,30 @@ +import io.micronaut.context.annotation.Value; +import io.micronaut.context.annotation.Property; +import io.micronaut.http.annotation.*; + +@Controller("/config") +class MicronautConfigTest { + + void sink(Object o) {} + + @Value("${app.secret}") + String secretValue; + + @Property(name = "app.api-key") + String apiKey; + + @Get("/secret") + void testValueField() { + sink(secretValue); + } + + @Get("/key") + void testPropertyField() { + sink(apiKey); + } + + @Get("/param") + void testValueParam(@Value("${app.name}") String appName) { + sink(appName); + } +} diff --git a/java/ql/test/library-tests/frameworks/micronaut/MicronautControllerTest.java b/java/ql/test/library-tests/frameworks/micronaut/MicronautControllerTest.java new file mode 100644 index 000000000000..3a1b2caaf6a0 --- /dev/null +++ b/java/ql/test/library-tests/frameworks/micronaut/MicronautControllerTest.java @@ -0,0 +1,95 @@ +import io.micronaut.http.annotation.*; +import io.micronaut.http.*; +import java.io.InputStream; +import java.io.Reader; + +@Controller("/test") +class MicronautControllerTest { + + void sink(Object o) {} + + @Get("/path/{id}") + void testPathVariable(@PathVariable String id) { + sink(id); // $hasTaintFlow + } + + @Get("/query") + void testQueryValue(@QueryValue String name) { + sink(name); // $hasTaintFlow + } + + @Post("/body") + void testBody(@Body String body) { + sink(body); // $hasTaintFlow + } + + @Get("/header") + void testHeader(@Header String authorization) { + sink(authorization); // $hasTaintFlow + } + + @Get("/cookie") + void testCookieValue(@CookieValue String sessionId) { + sink(sessionId); // $hasTaintFlow + } + + @Post("/part") + void testPart(@Part String name) { + sink(name); // $hasTaintFlow + } + + @Get("/attr") + void testRequestAttribute(@RequestAttribute String attr) { + sink(attr); // $hasTaintFlow + } + + @Post("/bean") + void testRequestBean(@RequestBean Object bean) { + sink(bean); // $hasTaintFlow + } + + @Get("/implicit") + void testImplicitParam(String implicitParam) { + sink(implicitParam); // $hasTaintFlow + } + + @Get("/request") + void testHttpRequest(HttpRequest request) { + sink(request); // $hasTaintFlow + } + + @Post("/stream") + void testInputStream(InputStream stream) { + sink(stream); // $hasTaintFlow + } + + @Post("/reader") + void testReader(Reader reader) { + sink(reader); // $hasTaintFlow + } + + @Post("/post") + void testPostMethod(@Body String data) { + sink(data); // $hasTaintFlow + } + + @Put("/put") + void testPutMethod(@Body String data) { + sink(data); // $hasTaintFlow + } + + @Delete("/delete/{id}") + void testDeleteMethod(@PathVariable String id) { + sink(id); // $hasTaintFlow + } + + @Patch("/patch") + void testPatchMethod(@Body String data) { + sink(data); // $hasTaintFlow + } + + @io.micronaut.http.annotation.Error + void testErrorHandler(HttpRequest request) { + sink(request); // $hasTaintFlow + } +} diff --git a/java/ql/test/library-tests/frameworks/micronaut/MicronautFileUploadTest.java b/java/ql/test/library-tests/frameworks/micronaut/MicronautFileUploadTest.java new file mode 100644 index 000000000000..3ede38626a38 --- /dev/null +++ b/java/ql/test/library-tests/frameworks/micronaut/MicronautFileUploadTest.java @@ -0,0 +1,18 @@ +import io.micronaut.http.annotation.*; +import io.micronaut.http.multipart.CompletedFileUpload; +import java.io.IOException; + +@Controller("/upload") +class MicronautFileUploadTest { + + void sink(Object o) {} + + @Post("/file") + void testFileUpload(CompletedFileUpload file) throws IOException { + sink(file.getFilename()); // $hasTaintFlow + sink(file.getBytes()); // $hasTaintFlow + sink(file.getInputStream()); // $hasTaintFlow + sink(file.getContentType()); // $hasTaintFlow + sink(file.getSize()); // $hasTaintFlow + } +} diff --git a/java/ql/test/library-tests/frameworks/micronaut/MicronautHttpClientTest.java b/java/ql/test/library-tests/frameworks/micronaut/MicronautHttpClientTest.java new file mode 100644 index 000000000000..86e045f6f8dd --- /dev/null +++ b/java/ql/test/library-tests/frameworks/micronaut/MicronautHttpClientTest.java @@ -0,0 +1,106 @@ +import io.micronaut.http.*; +import io.micronaut.http.client.HttpClient; +import io.micronaut.http.client.BlockingHttpClient; +import io.micronaut.http.uri.UriBuilder; +import java.net.URI; + +class MicronautHttpClientTest { + + void sink(Object o) {} + + String taint() { + return null; + } + + HttpClient client; + + void testRetrieveString() { + String url = taint(); + client.toBlocking().retrieve(url); // $hasTaintFlow + } + + void testRetrieveStringClass() { + String url = taint(); + client.toBlocking().retrieve(url, String.class); // $hasTaintFlow + } + + void testExchangeString() { + String url = taint(); + client.toBlocking().exchange(url); // $hasTaintFlow + } + + void testExchangeStringClass() { + String url = taint(); + client.toBlocking().exchange(url, String.class); // $hasTaintFlow + } + + void testGetFactory() { + HttpRequest req = HttpRequest.GET(taint()); + sink(req); // $hasTaintFlow + } + + void testPostFactory() { + HttpRequest req = HttpRequest.POST(taint(), "body"); + sink(req); // $hasTaintFlow + } + + void testPutFactory() { + HttpRequest req = HttpRequest.PUT(taint(), "body"); + sink(req); // $hasTaintFlow + } + + void testDeleteFactory() { + HttpRequest req = HttpRequest.DELETE(taint()); + sink(req); // $hasTaintFlow + } + + void testPatchFactory() { + HttpRequest req = HttpRequest.PATCH(taint(), "body"); + sink(req); // $hasTaintFlow + } + + void testHeadFactory() { + HttpRequest req = HttpRequest.HEAD(taint()); + sink(req); // $hasTaintFlow + } + + void testOptionsFactory() { + HttpRequest req = HttpRequest.OPTIONS(taint()); + sink(req); // $hasTaintFlow + } + + void testUriBuilderOfCharSequence() { + URI uri = UriBuilder.of(taint()).build(); + sink(uri); // $hasTaintFlow + } + + void testUriBuilderOfUri() { + URI uri = UriBuilder.of(URI.create(taint())).build(); + sink(uri); // $hasTaintFlow + } + + void testUriBuilderHost() { + URI uri = UriBuilder.of("http://example.com").host(taint()).build(); + sink(uri); // $hasTaintFlow + } + + void testUriBuilderPath() { + URI uri = UriBuilder.of("http://example.com").path(taint()).build(); + sink(uri); // $hasTaintFlow + } + + void testUriBuilderQueryParamName() { + URI uri = UriBuilder.of("http://example.com").queryParam(taint(), "value").build(); + sink(uri); // $hasTaintFlow + } + + void testUriBuilderQueryParamValue() { + URI uri = UriBuilder.of("http://example.com").queryParam("key", taint()).build(); + sink(uri); // $hasTaintFlow + } + + void testUriBuilderFragment() { + URI uri = UriBuilder.of("http://example.com").fragment(taint()).build(); + sink(uri); // $hasTaintFlow + } +} diff --git a/java/ql/test/library-tests/frameworks/micronaut/MicronautHttpRequestTest.java b/java/ql/test/library-tests/frameworks/micronaut/MicronautHttpRequestTest.java new file mode 100644 index 000000000000..0fc55343122c --- /dev/null +++ b/java/ql/test/library-tests/frameworks/micronaut/MicronautHttpRequestTest.java @@ -0,0 +1,67 @@ +import io.micronaut.http.annotation.*; +import io.micronaut.http.*; +import io.micronaut.http.cookie.*; + +@Controller("/http") +class MicronautHttpRequestTest { + + void sink(Object o) {} + + @Get("/headers") + void testHeaders(HttpRequest request) { + sink(request.getHeaders()); // $hasTaintFlow + sink(request.getHeaders().get("X-Custom")); // $hasTaintFlow + sink(request.getHeaders().getAll("X-Custom")); // $hasTaintFlow + sink(request.getHeaders().getFirst("X-Custom")); // $hasTaintFlow + sink(request.getHeaders().values()); // $hasTaintFlow + } + + @Get("/params") + void testParameters(HttpRequest request) { + sink(request.getParameters()); // $hasTaintFlow + sink(request.getParameters().get("q")); // $hasTaintFlow + sink(request.getParameters().getAll("q")); // $hasTaintFlow + sink(request.getParameters().getFirst("q")); // $hasTaintFlow + } + + @Get("/cookies") + void testCookies(HttpRequest request) { + sink(request.getCookies()); // $hasTaintFlow + Cookie cookie = request.getCookies().get("session"); + sink(cookie); // $hasTaintFlow + sink(cookie.getValue()); // $hasTaintFlow + sink(cookie.getName()); // $hasTaintFlow + sink(cookie.getDomain()); // $hasTaintFlow + sink(cookie.getPath()); // $hasTaintFlow + sink(request.getCookies().getAll()); // $hasTaintFlow + sink(request.getCookies().findCookie("session")); // $hasTaintFlow + } + + @Get("/uri") + void testUri(HttpRequest request) { + sink(request.getUri()); // $hasTaintFlow + sink(request.getPath()); // $hasTaintFlow + sink(request.getMethodName()); // $hasTaintFlow + } + + @Post("/body") + void testBody(HttpRequest request) { + sink(request.getBody()); // $hasTaintFlow + } + + @Get("/content") + void testContent(HttpRequest request) { + sink(request.getContentType()); // $hasTaintFlow + sink(request.getContentLength()); // $hasTaintFlow + } + + @Get("/redirect") + HttpResponse testRedirect(HttpRequest request) { + return HttpResponse.redirect(request.getUri()); // $hasTaintFlow + } + + @Get("/header-set") + HttpResponse testHeaderSplitting(HttpRequest request) { + return HttpResponse.ok().header("X-Custom", request.getHeaders().get("User-Input")); // $hasTaintFlow + } +} diff --git a/java/ql/test/library-tests/frameworks/micronaut/MicronautWebSocketTest.java b/java/ql/test/library-tests/frameworks/micronaut/MicronautWebSocketTest.java new file mode 100644 index 000000000000..0c46a311b2bd --- /dev/null +++ b/java/ql/test/library-tests/frameworks/micronaut/MicronautWebSocketTest.java @@ -0,0 +1,18 @@ +import io.micronaut.websocket.annotation.*; +import io.micronaut.websocket.WebSocketSession; + +@ServerWebSocket("/chat/{room}") +class MicronautWebSocketTest { + + void sink(Object o) {} + + @OnMessage + void onMessage(String message, WebSocketSession session) { + sink(message); // $hasTaintFlow + } + + @OnOpen + void onOpen(String room, WebSocketSession session) { + sink(room); // $hasTaintFlow + } +} diff --git a/java/ql/test/library-tests/frameworks/micronaut/flow.expected b/java/ql/test/library-tests/frameworks/micronaut/flow.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/java/ql/test/library-tests/frameworks/micronaut/flow.ql b/java/ql/test/library-tests/frameworks/micronaut/flow.ql new file mode 100644 index 000000000000..b72e8d0110cb --- /dev/null +++ b/java/ql/test/library-tests/frameworks/micronaut/flow.ql @@ -0,0 +1,27 @@ +import java +import semmle.code.java.dataflow.TaintTracking +import semmle.code.java.dataflow.FlowSources +import semmle.code.java.security.RequestForgery +import semmle.code.java.security.UrlRedirect +import semmle.code.java.security.ResponseSplitting +import utils.test.InlineFlowTest + +module Config implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { + n.asExpr().(MethodCall).getMethod().hasName("taint") + or + n instanceof ActiveThreatModelSource + } + + predicate isSink(DataFlow::Node n) { + exists(MethodCall ma | ma.getMethod().hasName("sink") | n.asExpr() = ma.getAnArgument()) + or + n instanceof RequestForgerySink + or + n instanceof UrlRedirectSink + or + n instanceof HeaderSplittingSink + } +} + +import TaintFlowTest diff --git a/java/ql/test/library-tests/frameworks/micronaut/options b/java/ql/test/library-tests/frameworks/micronaut/options new file mode 100644 index 000000000000..1dbd9fc24405 --- /dev/null +++ b/java/ql/test/library-tests/frameworks/micronaut/options @@ -0,0 +1 @@ +//semmle-extractor-options: --javac-args -cp ${testdir}/../../../stubs/micronaut-4.x diff --git a/java/ql/test/query-tests/security/CWE-113/semmle/tests/MicronautResponseSplitting.java b/java/ql/test/query-tests/security/CWE-113/semmle/tests/MicronautResponseSplitting.java new file mode 100644 index 000000000000..405bb66fcd4f --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-113/semmle/tests/MicronautResponseSplitting.java @@ -0,0 +1,22 @@ +import io.micronaut.http.annotation.Controller; +import io.micronaut.http.annotation.Get; +import io.micronaut.http.annotation.QueryValue; +import io.micronaut.http.HttpResponse; +import io.micronaut.http.MutableHttpResponse; + +@Controller("/headers") +public class MicronautResponseSplitting { + + @Get("/bad") + public MutableHttpResponse bad(@QueryValue String headerValue) { + // BAD: user-controlled header value + return HttpResponse.ok().header("X-Custom", headerValue); + } + + @Get("/good") + public MutableHttpResponse good(@QueryValue String headerValue) { + // GOOD: sanitized header value by replacing line breaks + String sanitized = headerValue.replace('\n', ' ').replace('\r', ' '); + return HttpResponse.ok().header("X-Custom", sanitized); + } +} diff --git a/java/ql/test/query-tests/security/CWE-113/semmle/tests/ResponseSplitting.expected b/java/ql/test/query-tests/security/CWE-113/semmle/tests/ResponseSplitting.expected index ed597e70eb55..ce0916a03236 100644 --- a/java/ql/test/query-tests/security/CWE-113/semmle/tests/ResponseSplitting.expected +++ b/java/ql/test/query-tests/security/CWE-113/semmle/tests/ResponseSplitting.expected @@ -1,20 +1,25 @@ #select +| MicronautResponseSplitting.java:13:53:13:63 | headerValue | MicronautResponseSplitting.java:11:39:11:68 | headerValue : String | MicronautResponseSplitting.java:13:53:13:63 | headerValue | This header depends on a $@, which may cause a response-splitting vulnerability. | MicronautResponseSplitting.java:11:39:11:68 | headerValue | user-provided value | | ResponseSplitting.java:23:23:23:28 | cookie | ResponseSplitting.java:22:39:22:66 | getParameter(...) : String | ResponseSplitting.java:23:23:23:28 | cookie | This header depends on a $@, which may cause a response-splitting vulnerability. | ResponseSplitting.java:22:39:22:66 | getParameter(...) | user-provided value | | ResponseSplitting.java:28:38:28:72 | getParameter(...) | ResponseSplitting.java:28:38:28:72 | getParameter(...) | ResponseSplitting.java:28:38:28:72 | getParameter(...) | This header depends on a $@, which may cause a response-splitting vulnerability. | ResponseSplitting.java:28:38:28:72 | getParameter(...) | user-provided value | | ResponseSplitting.java:29:38:29:72 | getParameter(...) | ResponseSplitting.java:29:38:29:72 | getParameter(...) | ResponseSplitting.java:29:38:29:72 | getParameter(...) | This header depends on a $@, which may cause a response-splitting vulnerability. | ResponseSplitting.java:29:38:29:72 | getParameter(...) | user-provided value | | ResponseSplitting.java:59:27:59:57 | replaceFirst(...) | ResponseSplitting.java:53:14:53:48 | getParameter(...) : String | ResponseSplitting.java:59:27:59:57 | replaceFirst(...) | This header depends on a $@, which may cause a response-splitting vulnerability. | ResponseSplitting.java:53:14:53:48 | getParameter(...) | user-provided value | edges -| ResponseSplitting.java:22:20:22:67 | new Cookie(...) : Cookie | ResponseSplitting.java:23:23:23:28 | cookie | provenance | Sink:MaD:1 | -| ResponseSplitting.java:22:39:22:66 | getParameter(...) : String | ResponseSplitting.java:22:20:22:67 | new Cookie(...) : Cookie | provenance | Src:MaD:3 MaD:5 | -| ResponseSplitting.java:53:14:53:48 | getParameter(...) : String | ResponseSplitting.java:59:27:59:27 | t : String | provenance | Src:MaD:3 | -| ResponseSplitting.java:59:27:59:27 | t : String | ResponseSplitting.java:59:27:59:57 | replaceFirst(...) | provenance | MaD:4 Sink:MaD:2 | +| MicronautResponseSplitting.java:11:39:11:68 | headerValue : String | MicronautResponseSplitting.java:13:53:13:63 | headerValue | provenance | Sink:MaD:1 | +| ResponseSplitting.java:22:20:22:67 | new Cookie(...) : Cookie | ResponseSplitting.java:23:23:23:28 | cookie | provenance | Sink:MaD:2 | +| ResponseSplitting.java:22:39:22:66 | getParameter(...) : String | ResponseSplitting.java:22:20:22:67 | new Cookie(...) : Cookie | provenance | Src:MaD:4 MaD:6 | +| ResponseSplitting.java:53:14:53:48 | getParameter(...) : String | ResponseSplitting.java:59:27:59:27 | t : String | provenance | Src:MaD:4 | +| ResponseSplitting.java:59:27:59:27 | t : String | ResponseSplitting.java:59:27:59:57 | replaceFirst(...) | provenance | MaD:5 Sink:MaD:3 | models -| 1 | Sink: javax.servlet.http; HttpServletResponse; false; addCookie; ; ; Argument[0]; response-splitting; manual | -| 2 | Sink: javax.servlet.http; HttpServletResponse; false; setHeader; ; ; Argument[0..1]; response-splitting; manual | -| 3 | Source: javax.servlet; ServletRequest; false; getParameter; (String); ; ReturnValue; remote; manual | -| 4 | Summary: java.lang; String; false; replaceFirst; ; ; Argument[this]; ReturnValue; taint; manual | -| 5 | Summary: javax.servlet.http; Cookie; false; Cookie; ; ; Argument[1]; Argument[this]; taint; manual | +| 1 | Sink: io.micronaut.http; MutableHttpResponse; true; header; (CharSequence,CharSequence); ; Argument[1]; response-splitting; manual | +| 2 | Sink: javax.servlet.http; HttpServletResponse; false; addCookie; ; ; Argument[0]; response-splitting; manual | +| 3 | Sink: javax.servlet.http; HttpServletResponse; false; setHeader; ; ; Argument[0..1]; response-splitting; manual | +| 4 | Source: javax.servlet; ServletRequest; false; getParameter; (String); ; ReturnValue; remote; manual | +| 5 | Summary: java.lang; String; false; replaceFirst; ; ; Argument[this]; ReturnValue; taint; manual | +| 6 | Summary: javax.servlet.http; Cookie; false; Cookie; ; ; Argument[1]; Argument[this]; taint; manual | nodes +| MicronautResponseSplitting.java:11:39:11:68 | headerValue : String | semmle.label | headerValue : String | +| MicronautResponseSplitting.java:13:53:13:63 | headerValue | semmle.label | headerValue | | ResponseSplitting.java:22:20:22:67 | new Cookie(...) : Cookie | semmle.label | new Cookie(...) : Cookie | | ResponseSplitting.java:22:39:22:66 | getParameter(...) : String | semmle.label | getParameter(...) : String | | ResponseSplitting.java:23:23:23:28 | cookie | semmle.label | cookie | diff --git a/java/ql/test/query-tests/security/CWE-113/semmle/tests/options b/java/ql/test/query-tests/security/CWE-113/semmle/tests/options index 668a863ac607..2154955f23cb 100644 --- a/java/ql/test/query-tests/security/CWE-113/semmle/tests/options +++ b/java/ql/test/query-tests/security/CWE-113/semmle/tests/options @@ -1 +1 @@ -//semmle-extractor-options: --javac-args -cp ${testdir}/../../../../../stubs/servlet-api-2.4 +//semmle-extractor-options: --javac-args -cp ${testdir}/../../../../../stubs/micronaut-4.x:${testdir}/../../../../../stubs/servlet-api-2.4 diff --git a/java/ql/test/query-tests/security/CWE-601/semmle/tests/MicronautUrlRedirect.java b/java/ql/test/query-tests/security/CWE-601/semmle/tests/MicronautUrlRedirect.java new file mode 100644 index 000000000000..2eeb3b50a113 --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-601/semmle/tests/MicronautUrlRedirect.java @@ -0,0 +1,25 @@ +import io.micronaut.http.annotation.Controller; +import io.micronaut.http.annotation.Get; +import io.micronaut.http.annotation.QueryValue; +import io.micronaut.http.HttpResponse; +import io.micronaut.http.MutableHttpResponse; +import java.net.URI; + +@Controller("/redirect") +public class MicronautUrlRedirect { + + @Get("/bad") + public MutableHttpResponse bad(@QueryValue String target) { + // BAD: user-controlled redirect target + return HttpResponse.redirect(URI.create(target)); + } + + @Get("/good") + public MutableHttpResponse good(@QueryValue String target) { + // GOOD: redirect to a fixed URL + if ("home".equals(target)) { + return HttpResponse.redirect(URI.create("/home")); + } + return HttpResponse.ok(); + } +} diff --git a/java/ql/test/query-tests/security/CWE-601/semmle/tests/UrlRedirect.expected b/java/ql/test/query-tests/security/CWE-601/semmle/tests/UrlRedirect.expected index fdd602c616bf..79c8258c7ba8 100644 --- a/java/ql/test/query-tests/security/CWE-601/semmle/tests/UrlRedirect.expected +++ b/java/ql/test/query-tests/security/CWE-601/semmle/tests/UrlRedirect.expected @@ -1,4 +1,5 @@ #select +| MicronautUrlRedirect.java:14:38:14:55 | create(...) | MicronautUrlRedirect.java:12:39:12:63 | target : String | MicronautUrlRedirect.java:14:38:14:55 | create(...) | Untrusted URL redirection depends on a $@. | MicronautUrlRedirect.java:12:39:12:63 | target | user-provided value | | UrlRedirect2.java:27:25:27:54 | getParameter(...) | UrlRedirect2.java:27:25:27:54 | getParameter(...) | UrlRedirect2.java:27:25:27:54 | getParameter(...) | Untrusted URL redirection depends on a $@. | UrlRedirect2.java:27:25:27:54 | getParameter(...) | user-provided value | | UrlRedirect.java:23:25:23:54 | getParameter(...) | UrlRedirect.java:23:25:23:54 | getParameter(...) | UrlRedirect.java:23:25:23:54 | getParameter(...) | Untrusted URL redirection depends on a $@. | UrlRedirect.java:23:25:23:54 | getParameter(...) | user-provided value | | UrlRedirect.java:32:25:32:67 | weakCleanup(...) | UrlRedirect.java:32:37:32:66 | getParameter(...) : String | UrlRedirect.java:32:25:32:67 | weakCleanup(...) | Untrusted URL redirection depends on a $@. | UrlRedirect.java:32:37:32:66 | getParameter(...) | user-provided value | @@ -6,17 +7,24 @@ | UrlRedirect.java:42:43:42:72 | getParameter(...) | UrlRedirect.java:42:43:42:72 | getParameter(...) | UrlRedirect.java:42:43:42:72 | getParameter(...) | Untrusted URL redirection depends on a $@. | UrlRedirect.java:42:43:42:72 | getParameter(...) | user-provided value | | mad/Test.java:14:22:14:38 | (...)... | mad/Test.java:9:16:9:41 | getParameter(...) : String | mad/Test.java:14:22:14:38 | (...)... | Untrusted URL redirection depends on a $@. | mad/Test.java:9:16:9:41 | getParameter(...) | user-provided value | edges -| UrlRedirect.java:32:37:32:66 | getParameter(...) : String | UrlRedirect.java:32:25:32:67 | weakCleanup(...) | provenance | Src:MaD:2 MaD:3 | -| UrlRedirect.java:32:37:32:66 | getParameter(...) : String | UrlRedirect.java:45:28:45:39 | input : String | provenance | Src:MaD:2 | +| MicronautUrlRedirect.java:12:39:12:63 | target : String | MicronautUrlRedirect.java:14:49:14:54 | target : String | provenance | | +| MicronautUrlRedirect.java:14:49:14:54 | target : String | MicronautUrlRedirect.java:14:38:14:55 | create(...) | provenance | MaD:5 Sink:MaD:1 | +| UrlRedirect.java:32:37:32:66 | getParameter(...) : String | UrlRedirect.java:32:25:32:67 | weakCleanup(...) | provenance | Src:MaD:3 MaD:4 | +| UrlRedirect.java:32:37:32:66 | getParameter(...) : String | UrlRedirect.java:45:28:45:39 | input : String | provenance | Src:MaD:3 | | UrlRedirect.java:45:28:45:39 | input : String | UrlRedirect.java:46:10:46:14 | input : String | provenance | | -| UrlRedirect.java:46:10:46:14 | input : String | UrlRedirect.java:46:10:46:40 | replaceAll(...) : String | provenance | MaD:3 | -| mad/Test.java:9:16:9:41 | getParameter(...) : String | mad/Test.java:14:31:14:38 | source(...) : String | provenance | Src:MaD:2 | -| mad/Test.java:14:31:14:38 | source(...) : String | mad/Test.java:14:22:14:38 | (...)... | provenance | Sink:MaD:1 | +| UrlRedirect.java:46:10:46:14 | input : String | UrlRedirect.java:46:10:46:40 | replaceAll(...) : String | provenance | MaD:4 | +| mad/Test.java:9:16:9:41 | getParameter(...) : String | mad/Test.java:14:31:14:38 | source(...) : String | provenance | Src:MaD:3 | +| mad/Test.java:14:31:14:38 | source(...) : String | mad/Test.java:14:22:14:38 | (...)... | provenance | Sink:MaD:2 | models -| 1 | Sink: org.kohsuke.stapler; HttpResponses; true; redirectTo; (String); ; Argument[0]; url-redirection; ai-manual | -| 2 | Source: javax.servlet; ServletRequest; false; getParameter; (String); ; ReturnValue; remote; manual | -| 3 | Summary: java.lang; String; false; replaceAll; ; ; Argument[this]; ReturnValue; taint; manual | +| 1 | Sink: io.micronaut.http; HttpResponse; true; redirect; (URI); ; Argument[0]; url-redirection; manual | +| 2 | Sink: org.kohsuke.stapler; HttpResponses; true; redirectTo; (String); ; Argument[0]; url-redirection; ai-manual | +| 3 | Source: javax.servlet; ServletRequest; false; getParameter; (String); ; ReturnValue; remote; manual | +| 4 | Summary: java.lang; String; false; replaceAll; ; ; Argument[this]; ReturnValue; taint; manual | +| 5 | Summary: java.net; URI; false; create; ; ; Argument[0]; ReturnValue; taint; manual | nodes +| MicronautUrlRedirect.java:12:39:12:63 | target : String | semmle.label | target : String | +| MicronautUrlRedirect.java:14:38:14:55 | create(...) | semmle.label | create(...) | +| MicronautUrlRedirect.java:14:49:14:54 | target : String | semmle.label | target : String | | UrlRedirect2.java:27:25:27:54 | getParameter(...) | semmle.label | getParameter(...) | | UrlRedirect.java:23:25:23:54 | getParameter(...) | semmle.label | getParameter(...) | | UrlRedirect.java:32:25:32:67 | weakCleanup(...) | semmle.label | weakCleanup(...) | diff --git a/java/ql/test/query-tests/security/CWE-601/semmle/tests/options b/java/ql/test/query-tests/security/CWE-601/semmle/tests/options index 637c329a9143..e0a964b29dc4 100644 --- a/java/ql/test/query-tests/security/CWE-601/semmle/tests/options +++ b/java/ql/test/query-tests/security/CWE-601/semmle/tests/options @@ -1 +1 @@ -//semmle-extractor-options: --javac-args -cp ${testdir}/../../../../../stubs/servlet-api-2.4:${testdir}/../../../../../stubs/stapler-1.263:${testdir}/../../../../../stubs/javax-servlet-2.5:${testdir}/../../../../../stubs/apache-commons-jelly-1.0.1:${testdir}/../../../../../stubs/apache-commons-fileupload-1.4:${testdir}/../../../../../stubs/saxon-xqj-9.x:${testdir}/../../../../../stubs/apache-commons-beanutils:${testdir}/../../../../../stubs/dom4j-2.1.1:${testdir}/../../../../../stubs/apache-commons-lang:${testdir}/../../../../../stubs/jaxen-1.2.0 +//semmle-extractor-options: --javac-args -cp ${testdir}/../../../../../stubs/micronaut-4.x:${testdir}/../../../../../stubs/servlet-api-2.4:${testdir}/../../../../../stubs/stapler-1.263:${testdir}/../../../../../stubs/javax-servlet-2.5:${testdir}/../../../../../stubs/apache-commons-jelly-1.0.1:${testdir}/../../../../../stubs/apache-commons-fileupload-1.4:${testdir}/../../../../../stubs/saxon-xqj-9.x:${testdir}/../../../../../stubs/apache-commons-beanutils:${testdir}/../../../../../stubs/dom4j-2.1.1:${testdir}/../../../../../stubs/apache-commons-lang:${testdir}/../../../../../stubs/jaxen-1.2.0 diff --git a/java/ql/test/query-tests/security/CWE-918/MicronautSSRF.java b/java/ql/test/query-tests/security/CWE-918/MicronautSSRF.java new file mode 100644 index 000000000000..128a0cfa710a --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-918/MicronautSSRF.java @@ -0,0 +1,33 @@ +import io.micronaut.http.annotation.Controller; +import io.micronaut.http.annotation.Get; +import io.micronaut.http.annotation.QueryValue; +import io.micronaut.http.client.HttpClient; +import io.micronaut.http.uri.UriBuilder; +import java.net.URI; + +@Controller("/ssrf") +public class MicronautSSRF { + + private HttpClient client; + + @Get("/retrieve") + public String testRetrieve(@QueryValue String url) { // $ Source + return client.toBlocking().retrieve(url); // $ Alert + } + + @Get("/exchange-string") + public Object testExchangeWithString(@QueryValue String url) { // $ Source + return client.toBlocking().exchange(url); // $ Alert + } + + @Get("/retrieve-typed") + public Object testRetrieveTyped(@QueryValue String url) { // $ Source + return client.toBlocking().retrieve(url, String.class); // $ Alert + } + + @Get("/uri-builder") + public String testUriBuilder(@QueryValue String host) { // $ Source + URI uri = UriBuilder.of("http://example.com").host(host).build(); + return client.toBlocking().retrieve(uri.toString()); // $ Alert + } +} diff --git a/java/ql/test/query-tests/security/CWE-918/RequestForgery.expected b/java/ql/test/query-tests/security/CWE-918/RequestForgery.expected index a0bbc205a39f..9c44be4a3867 100644 --- a/java/ql/test/query-tests/security/CWE-918/RequestForgery.expected +++ b/java/ql/test/query-tests/security/CWE-918/RequestForgery.expected @@ -226,6 +226,10 @@ | JdbcUrlSSRF.java:86:19:86:25 | jdbcUrl | JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:86:19:86:25 | jdbcUrl | Potential server-side request forgery due to a $@. | JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) | user-provided value | | JdbcUrlSSRF.java:87:19:87:25 | jdbcUrl | JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:87:19:87:25 | jdbcUrl | Potential server-side request forgery due to a $@. | JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) | user-provided value | | JdbcUrlSSRF.java:88:19:88:25 | jdbcUrl | JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:88:19:88:25 | jdbcUrl | Potential server-side request forgery due to a $@. | JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) | user-provided value | +| MicronautSSRF.java:15:45:15:47 | url | MicronautSSRF.java:14:32:14:53 | url : String | MicronautSSRF.java:15:45:15:47 | url | Potential server-side request forgery due to a $@. | MicronautSSRF.java:14:32:14:53 | url | user-provided value | +| MicronautSSRF.java:20:45:20:47 | url | MicronautSSRF.java:19:42:19:63 | url : String | MicronautSSRF.java:20:45:20:47 | url | Potential server-side request forgery due to a $@. | MicronautSSRF.java:19:42:19:63 | url | user-provided value | +| MicronautSSRF.java:25:45:25:47 | url | MicronautSSRF.java:24:37:24:58 | url : String | MicronautSSRF.java:25:45:25:47 | url | Potential server-side request forgery due to a $@. | MicronautSSRF.java:24:37:24:58 | url | user-provided value | +| MicronautSSRF.java:31:45:31:58 | toString(...) | MicronautSSRF.java:29:34:29:56 | host : String | MicronautSSRF.java:31:45:31:58 | toString(...) | Potential server-side request forgery due to a $@. | MicronautSSRF.java:29:34:29:56 | host | user-provided value | | ReactiveWebClientSSRF.java:16:52:16:54 | url | ReactiveWebClientSSRF.java:15:26:15:52 | getParameter(...) : String | ReactiveWebClientSSRF.java:16:52:16:54 | url | Potential server-side request forgery due to a $@. | ReactiveWebClientSSRF.java:15:26:15:52 | getParameter(...) | user-provided value | | ReactiveWebClientSSRF.java:35:30:35:32 | url | ReactiveWebClientSSRF.java:32:26:32:52 | getParameter(...) : String | ReactiveWebClientSSRF.java:35:30:35:32 | url | Potential server-side request forgery due to a $@. | ReactiveWebClientSSRF.java:32:26:32:52 | getParameter(...) | user-provided value | | SanitizationTests.java:25:52:25:54 | uri | SanitizationTests.java:22:31:22:57 | getParameter(...) : String | SanitizationTests.java:25:52:25:54 | uri | Potential server-side request forgery due to a $@. | SanitizationTests.java:22:31:22:57 | getParameter(...) | user-provided value | @@ -377,1002 +381,1015 @@ | mad/Test.java:107:15:107:31 | (...)... | mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:107:15:107:31 | (...)... | Potential server-side request forgery due to a $@. | mad/Test.java:26:16:26:41 | getParameter(...) | user-provided value | | mad/Test.java:112:15:112:31 | (...)... | mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:112:15:112:31 | (...)... | Potential server-side request forgery due to a $@. | mad/Test.java:26:16:26:41 | getParameter(...) | user-provided value | edges -| ApacheHttpSSRF.java:27:27:27:53 | getParameter(...) : String | ApacheHttpSSRF.java:28:31:28:34 | sink : String | provenance | Src:MaD:277 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:30:43:30:45 | uri | provenance | Sink:MaD:211 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:32:29:32:31 | uri | provenance | Sink:MaD:217 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:34:26:34:28 | uri | provenance | Sink:MaD:212 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:35:26:35:28 | uri | provenance | Sink:MaD:215 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:36:25:36:27 | uri | provenance | Sink:MaD:216 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:37:28:37:30 | uri | provenance | Sink:MaD:210 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:38:29:38:31 | uri | provenance | Sink:MaD:213 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:39:27:39:29 | uri | provenance | Sink:MaD:218 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:40:27:40:29 | uri | provenance | Sink:MaD:214 | +| ApacheHttpSSRF.java:27:27:27:53 | getParameter(...) : String | ApacheHttpSSRF.java:28:31:28:34 | sink : String | provenance | Src:MaD:280 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:30:43:30:45 | uri | provenance | Sink:MaD:214 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:32:29:32:31 | uri | provenance | Sink:MaD:220 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:34:26:34:28 | uri | provenance | Sink:MaD:215 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:35:26:35:28 | uri | provenance | Sink:MaD:218 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:36:25:36:27 | uri | provenance | Sink:MaD:219 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:37:28:37:30 | uri | provenance | Sink:MaD:213 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:38:29:38:31 | uri | provenance | Sink:MaD:216 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:39:27:39:29 | uri | provenance | Sink:MaD:221 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:40:27:40:29 | uri | provenance | Sink:MaD:217 | | ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:42:62:42:64 | uri : URI | provenance | | | ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:43:41:43:43 | uri : URI | provenance | | | ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:44:41:44:43 | uri : URI | provenance | | | ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:46:77:46:79 | uri : URI | provenance | | | ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:47:56:47:58 | uri : URI | provenance | | | ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:48:56:48:58 | uri : URI | provenance | | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:50:32:50:34 | uri | provenance | Sink:MaD:220 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:51:33:51:35 | uri | provenance | Sink:MaD:224 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:52:32:52:34 | uri | provenance | Sink:MaD:225 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:53:35:53:37 | uri | provenance | Sink:MaD:219 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:54:36:54:38 | uri | provenance | Sink:MaD:222 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:55:33:55:35 | uri | provenance | Sink:MaD:221 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:56:34:56:36 | uri | provenance | Sink:MaD:227 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:57:34:57:36 | uri | provenance | Sink:MaD:223 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:58:43:58:45 | uri | provenance | Sink:MaD:226 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:50:32:50:34 | uri | provenance | Sink:MaD:223 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:51:33:51:35 | uri | provenance | Sink:MaD:227 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:52:32:52:34 | uri | provenance | Sink:MaD:228 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:53:35:53:37 | uri | provenance | Sink:MaD:222 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:54:36:54:38 | uri | provenance | Sink:MaD:225 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:55:33:55:35 | uri | provenance | Sink:MaD:224 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:56:34:56:36 | uri | provenance | Sink:MaD:230 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:57:34:57:36 | uri | provenance | Sink:MaD:226 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:58:43:58:45 | uri | provenance | Sink:MaD:229 | | ApacheHttpSSRF.java:28:31:28:34 | sink : String | ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | provenance | Config | -| ApacheHttpSSRF.java:28:31:28:34 | sink : String | ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | provenance | MaD:285 | -| ApacheHttpSSRF.java:42:62:42:64 | uri : URI | ApacheHttpSSRF.java:42:62:42:75 | toString(...) : String | provenance | MaD:286 | -| ApacheHttpSSRF.java:42:62:42:75 | toString(...) : String | ApacheHttpSSRF.java:42:34:42:82 | new BasicRequestLine(...) | provenance | MaD:295 Sink:MaD:231 | -| ApacheHttpSSRF.java:43:41:43:43 | uri : URI | ApacheHttpSSRF.java:43:41:43:54 | toString(...) | provenance | MaD:286 Sink:MaD:232 | -| ApacheHttpSSRF.java:44:41:44:43 | uri : URI | ApacheHttpSSRF.java:44:41:44:54 | toString(...) | provenance | MaD:286 Sink:MaD:233 | -| ApacheHttpSSRF.java:46:77:46:79 | uri : URI | ApacheHttpSSRF.java:46:77:46:90 | toString(...) : String | provenance | MaD:286 | -| ApacheHttpSSRF.java:46:77:46:90 | toString(...) : String | ApacheHttpSSRF.java:46:49:46:97 | new BasicRequestLine(...) | provenance | MaD:295 Sink:MaD:228 | -| ApacheHttpSSRF.java:47:56:47:58 | uri : URI | ApacheHttpSSRF.java:47:56:47:69 | toString(...) | provenance | MaD:286 Sink:MaD:229 | -| ApacheHttpSSRF.java:48:56:48:58 | uri : URI | ApacheHttpSSRF.java:48:56:48:69 | toString(...) | provenance | MaD:286 Sink:MaD:230 | -| ApacheHttpSSRFVersion5.java:41:30:41:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:42:31:42:37 | uriSink : String | provenance | Src:MaD:277 | +| ApacheHttpSSRF.java:28:31:28:34 | sink : String | ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | provenance | MaD:290 | +| ApacheHttpSSRF.java:42:62:42:64 | uri : URI | ApacheHttpSSRF.java:42:62:42:75 | toString(...) : String | provenance | MaD:291 | +| ApacheHttpSSRF.java:42:62:42:75 | toString(...) : String | ApacheHttpSSRF.java:42:34:42:82 | new BasicRequestLine(...) | provenance | MaD:300 Sink:MaD:234 | +| ApacheHttpSSRF.java:43:41:43:43 | uri : URI | ApacheHttpSSRF.java:43:41:43:54 | toString(...) | provenance | MaD:291 Sink:MaD:235 | +| ApacheHttpSSRF.java:44:41:44:43 | uri : URI | ApacheHttpSSRF.java:44:41:44:54 | toString(...) | provenance | MaD:291 Sink:MaD:236 | +| ApacheHttpSSRF.java:46:77:46:79 | uri : URI | ApacheHttpSSRF.java:46:77:46:90 | toString(...) : String | provenance | MaD:291 | +| ApacheHttpSSRF.java:46:77:46:90 | toString(...) : String | ApacheHttpSSRF.java:46:49:46:97 | new BasicRequestLine(...) | provenance | MaD:300 Sink:MaD:231 | +| ApacheHttpSSRF.java:47:56:47:58 | uri : URI | ApacheHttpSSRF.java:47:56:47:69 | toString(...) | provenance | MaD:291 Sink:MaD:232 | +| ApacheHttpSSRF.java:48:56:48:58 | uri : URI | ApacheHttpSSRF.java:48:56:48:69 | toString(...) | provenance | MaD:291 Sink:MaD:233 | +| ApacheHttpSSRFVersion5.java:41:30:41:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:42:31:42:37 | uriSink : String | provenance | Src:MaD:280 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:49:54:49:56 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:50:54:50:56 | uri | provenance | Sink:MaD:40 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:50:54:50:56 | uri | provenance | Sink:MaD:43 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:51:48:51:50 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:52:48:52:50 | uri | provenance | Sink:MaD:42 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:52:48:52:50 | uri | provenance | Sink:MaD:45 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:55:38:55:40 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:56:38:56:40 | uri | provenance | Sink:MaD:45 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:56:38:56:40 | uri | provenance | Sink:MaD:48 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:59:35:59:37 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:60:35:60:37 | uri | provenance | Sink:MaD:48 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:60:35:60:37 | uri | provenance | Sink:MaD:51 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:63:36:63:38 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:64:36:64:38 | uri | provenance | Sink:MaD:51 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:64:36:64:38 | uri | provenance | Sink:MaD:54 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:67:39:67:41 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:68:39:68:41 | uri | provenance | Sink:MaD:54 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:68:39:68:41 | uri | provenance | Sink:MaD:57 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:71:37:71:39 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:72:37:72:39 | uri | provenance | Sink:MaD:57 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:72:37:72:39 | uri | provenance | Sink:MaD:60 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:75:36:75:38 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:76:36:76:38 | uri | provenance | Sink:MaD:60 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:76:36:76:38 | uri | provenance | Sink:MaD:63 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:79:35:79:37 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:80:35:80:37 | uri | provenance | Sink:MaD:63 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:80:35:80:37 | uri | provenance | Sink:MaD:66 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:83:37:83:39 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:84:37:84:39 | uri | provenance | Sink:MaD:66 | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:88:51:88:53 | uri | provenance | Sink:MaD:68 | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:92:51:92:53 | uri | provenance | Sink:MaD:70 | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:94:45:94:47 | uri | provenance | Sink:MaD:72 | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:97:54:97:56 | uri | provenance | Sink:MaD:74 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:84:37:84:39 | uri | provenance | Sink:MaD:69 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:88:51:88:53 | uri | provenance | Sink:MaD:71 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:92:51:92:53 | uri | provenance | Sink:MaD:73 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:94:45:94:47 | uri | provenance | Sink:MaD:75 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:97:54:97:56 | uri | provenance | Sink:MaD:77 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:98:48:98:50 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:99:48:99:50 | uri | provenance | Sink:MaD:76 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:99:48:99:50 | uri | provenance | Sink:MaD:79 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:103:55:103:57 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:104:55:104:57 | uri | provenance | Sink:MaD:79 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:104:55:104:57 | uri | provenance | Sink:MaD:82 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:105:49:105:51 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:106:49:106:51 | uri | provenance | Sink:MaD:81 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:106:49:106:51 | uri | provenance | Sink:MaD:84 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:109:39:109:41 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:110:39:110:41 | uri | provenance | Sink:MaD:84 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:110:39:110:41 | uri | provenance | Sink:MaD:87 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:113:36:113:38 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:114:36:114:38 | uri | provenance | Sink:MaD:87 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:114:36:114:38 | uri | provenance | Sink:MaD:90 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:117:37:117:39 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:118:37:118:39 | uri | provenance | Sink:MaD:90 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:118:37:118:39 | uri | provenance | Sink:MaD:93 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:121:40:121:42 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:122:40:122:42 | uri | provenance | Sink:MaD:93 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:122:40:122:42 | uri | provenance | Sink:MaD:96 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:125:38:125:40 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:126:38:126:40 | uri | provenance | Sink:MaD:96 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:126:38:126:40 | uri | provenance | Sink:MaD:99 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:129:37:129:39 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:130:37:130:39 | uri | provenance | Sink:MaD:99 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:130:37:130:39 | uri | provenance | Sink:MaD:102 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:133:36:133:38 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:134:36:134:38 | uri | provenance | Sink:MaD:102 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:134:36:134:38 | uri | provenance | Sink:MaD:105 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:137:38:137:40 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:138:38:138:40 | uri | provenance | Sink:MaD:105 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:138:38:138:40 | uri | provenance | Sink:MaD:108 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:141:41:141:43 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:142:41:142:43 | uri | provenance | Sink:MaD:107 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:142:41:142:43 | uri | provenance | Sink:MaD:110 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:144:38:144:40 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:145:38:145:40 | uri | provenance | Sink:MaD:109 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:145:38:145:40 | uri | provenance | Sink:MaD:112 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:147:39:147:41 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:148:39:148:41 | uri | provenance | Sink:MaD:111 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:148:39:148:41 | uri | provenance | Sink:MaD:114 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:150:42:150:44 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:151:42:151:44 | uri | provenance | Sink:MaD:113 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:151:42:151:44 | uri | provenance | Sink:MaD:116 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:153:40:153:42 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:154:40:154:42 | uri | provenance | Sink:MaD:115 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:154:40:154:42 | uri | provenance | Sink:MaD:118 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:156:39:156:41 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:157:39:157:41 | uri | provenance | Sink:MaD:117 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:157:39:157:41 | uri | provenance | Sink:MaD:120 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:159:38:159:40 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:160:38:160:40 | uri | provenance | Sink:MaD:119 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:160:38:160:40 | uri | provenance | Sink:MaD:122 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:164:47:164:49 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:165:47:165:49 | uri | provenance | Sink:MaD:206 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:165:47:165:49 | uri | provenance | Sink:MaD:209 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:167:40:167:42 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:168:40:168:42 | uri | provenance | Sink:MaD:121 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:168:40:168:42 | uri | provenance | Sink:MaD:124 | | ApacheHttpSSRFVersion5.java:42:31:42:37 | uriSink : String | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | provenance | Config | -| ApacheHttpSSRFVersion5.java:42:31:42:37 | uriSink : String | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | provenance | MaD:285 | -| ApacheHttpSSRFVersion5.java:44:31:44:58 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:45:42:45:49 | hostSink : String | provenance | Src:MaD:277 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:48:54:48:57 | host | provenance | Sink:MaD:38 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:54:38:54:41 | host | provenance | Sink:MaD:43 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:58:35:58:38 | host | provenance | Sink:MaD:46 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:62:36:62:39 | host | provenance | Sink:MaD:49 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:66:39:66:42 | host | provenance | Sink:MaD:52 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:70:37:70:40 | host | provenance | Sink:MaD:55 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:74:36:74:39 | host | provenance | Sink:MaD:58 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:78:35:78:38 | host | provenance | Sink:MaD:61 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:82:37:82:40 | host | provenance | Sink:MaD:64 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:87:51:87:54 | host | provenance | Sink:MaD:67 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:91:51:91:54 | host | provenance | Sink:MaD:69 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:93:45:93:48 | host | provenance | Sink:MaD:71 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:96:54:96:57 | host | provenance | Sink:MaD:73 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:102:55:102:58 | host | provenance | Sink:MaD:77 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:108:39:108:42 | host | provenance | Sink:MaD:82 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:112:36:112:39 | host | provenance | Sink:MaD:85 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:116:37:116:40 | host | provenance | Sink:MaD:88 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:120:40:120:43 | host | provenance | Sink:MaD:91 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:124:38:124:41 | host | provenance | Sink:MaD:94 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:128:37:128:40 | host | provenance | Sink:MaD:97 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:132:36:132:39 | host | provenance | Sink:MaD:100 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:136:38:136:41 | host | provenance | Sink:MaD:103 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:162:52:162:55 | host | provenance | Sink:MaD:204 | -| ApacheHttpSSRFVersion5.java:45:42:45:49 | hostSink : String | ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | provenance | MaD:294 | -| ApacheHttpSSRFVersion5.java:49:54:49:56 | uri : URI | ApacheHttpSSRFVersion5.java:49:54:49:67 | toString(...) | provenance | MaD:286 Sink:MaD:39 | -| ApacheHttpSSRFVersion5.java:51:48:51:50 | uri : URI | ApacheHttpSSRFVersion5.java:51:48:51:61 | toString(...) | provenance | MaD:286 Sink:MaD:41 | -| ApacheHttpSSRFVersion5.java:55:38:55:40 | uri : URI | ApacheHttpSSRFVersion5.java:55:38:55:51 | toString(...) | provenance | MaD:286 Sink:MaD:44 | -| ApacheHttpSSRFVersion5.java:59:35:59:37 | uri : URI | ApacheHttpSSRFVersion5.java:59:35:59:48 | toString(...) | provenance | MaD:286 Sink:MaD:47 | -| ApacheHttpSSRFVersion5.java:63:36:63:38 | uri : URI | ApacheHttpSSRFVersion5.java:63:36:63:49 | toString(...) | provenance | MaD:286 Sink:MaD:50 | -| ApacheHttpSSRFVersion5.java:67:39:67:41 | uri : URI | ApacheHttpSSRFVersion5.java:67:39:67:52 | toString(...) | provenance | MaD:286 Sink:MaD:53 | -| ApacheHttpSSRFVersion5.java:71:37:71:39 | uri : URI | ApacheHttpSSRFVersion5.java:71:37:71:50 | toString(...) | provenance | MaD:286 Sink:MaD:56 | -| ApacheHttpSSRFVersion5.java:75:36:75:38 | uri : URI | ApacheHttpSSRFVersion5.java:75:36:75:49 | toString(...) | provenance | MaD:286 Sink:MaD:59 | -| ApacheHttpSSRFVersion5.java:79:35:79:37 | uri : URI | ApacheHttpSSRFVersion5.java:79:35:79:48 | toString(...) | provenance | MaD:286 Sink:MaD:62 | -| ApacheHttpSSRFVersion5.java:83:37:83:39 | uri : URI | ApacheHttpSSRFVersion5.java:83:37:83:50 | toString(...) | provenance | MaD:286 Sink:MaD:65 | -| ApacheHttpSSRFVersion5.java:98:48:98:50 | uri : URI | ApacheHttpSSRFVersion5.java:98:48:98:61 | toString(...) | provenance | MaD:286 Sink:MaD:75 | -| ApacheHttpSSRFVersion5.java:103:55:103:57 | uri : URI | ApacheHttpSSRFVersion5.java:103:55:103:68 | toString(...) | provenance | MaD:286 Sink:MaD:78 | -| ApacheHttpSSRFVersion5.java:105:49:105:51 | uri : URI | ApacheHttpSSRFVersion5.java:105:49:105:62 | toString(...) | provenance | MaD:286 Sink:MaD:80 | -| ApacheHttpSSRFVersion5.java:109:39:109:41 | uri : URI | ApacheHttpSSRFVersion5.java:109:39:109:52 | toString(...) | provenance | MaD:286 Sink:MaD:83 | -| ApacheHttpSSRFVersion5.java:113:36:113:38 | uri : URI | ApacheHttpSSRFVersion5.java:113:36:113:49 | toString(...) | provenance | MaD:286 Sink:MaD:86 | -| ApacheHttpSSRFVersion5.java:117:37:117:39 | uri : URI | ApacheHttpSSRFVersion5.java:117:37:117:50 | toString(...) | provenance | MaD:286 Sink:MaD:89 | -| ApacheHttpSSRFVersion5.java:121:40:121:42 | uri : URI | ApacheHttpSSRFVersion5.java:121:40:121:53 | toString(...) | provenance | MaD:286 Sink:MaD:92 | -| ApacheHttpSSRFVersion5.java:125:38:125:40 | uri : URI | ApacheHttpSSRFVersion5.java:125:38:125:51 | toString(...) | provenance | MaD:286 Sink:MaD:95 | -| ApacheHttpSSRFVersion5.java:129:37:129:39 | uri : URI | ApacheHttpSSRFVersion5.java:129:37:129:50 | toString(...) | provenance | MaD:286 Sink:MaD:98 | -| ApacheHttpSSRFVersion5.java:133:36:133:38 | uri : URI | ApacheHttpSSRFVersion5.java:133:36:133:49 | toString(...) | provenance | MaD:286 Sink:MaD:101 | -| ApacheHttpSSRFVersion5.java:137:38:137:40 | uri : URI | ApacheHttpSSRFVersion5.java:137:38:137:51 | toString(...) | provenance | MaD:286 Sink:MaD:104 | -| ApacheHttpSSRFVersion5.java:141:41:141:43 | uri : URI | ApacheHttpSSRFVersion5.java:141:41:141:54 | toString(...) | provenance | MaD:286 Sink:MaD:106 | -| ApacheHttpSSRFVersion5.java:144:38:144:40 | uri : URI | ApacheHttpSSRFVersion5.java:144:38:144:51 | toString(...) | provenance | MaD:286 Sink:MaD:108 | -| ApacheHttpSSRFVersion5.java:147:39:147:41 | uri : URI | ApacheHttpSSRFVersion5.java:147:39:147:52 | toString(...) | provenance | MaD:286 Sink:MaD:110 | -| ApacheHttpSSRFVersion5.java:150:42:150:44 | uri : URI | ApacheHttpSSRFVersion5.java:150:42:150:55 | toString(...) | provenance | MaD:286 Sink:MaD:112 | -| ApacheHttpSSRFVersion5.java:153:40:153:42 | uri : URI | ApacheHttpSSRFVersion5.java:153:40:153:53 | toString(...) | provenance | MaD:286 Sink:MaD:114 | -| ApacheHttpSSRFVersion5.java:156:39:156:41 | uri : URI | ApacheHttpSSRFVersion5.java:156:39:156:52 | toString(...) | provenance | MaD:286 Sink:MaD:116 | -| ApacheHttpSSRFVersion5.java:159:38:159:40 | uri : URI | ApacheHttpSSRFVersion5.java:159:38:159:51 | toString(...) | provenance | MaD:286 Sink:MaD:118 | -| ApacheHttpSSRFVersion5.java:164:47:164:49 | uri : URI | ApacheHttpSSRFVersion5.java:164:47:164:60 | toString(...) | provenance | MaD:286 Sink:MaD:205 | -| ApacheHttpSSRFVersion5.java:167:40:167:42 | uri : URI | ApacheHttpSSRFVersion5.java:167:40:167:53 | toString(...) | provenance | MaD:286 Sink:MaD:120 | -| ApacheHttpSSRFVersion5.java:180:30:180:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:181:31:181:37 | uriSink : String | provenance | Src:MaD:277 | +| ApacheHttpSSRFVersion5.java:42:31:42:37 | uriSink : String | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | provenance | MaD:290 | +| ApacheHttpSSRFVersion5.java:44:31:44:58 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:45:42:45:49 | hostSink : String | provenance | Src:MaD:280 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:48:54:48:57 | host | provenance | Sink:MaD:41 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:54:38:54:41 | host | provenance | Sink:MaD:46 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:58:35:58:38 | host | provenance | Sink:MaD:49 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:62:36:62:39 | host | provenance | Sink:MaD:52 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:66:39:66:42 | host | provenance | Sink:MaD:55 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:70:37:70:40 | host | provenance | Sink:MaD:58 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:74:36:74:39 | host | provenance | Sink:MaD:61 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:78:35:78:38 | host | provenance | Sink:MaD:64 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:82:37:82:40 | host | provenance | Sink:MaD:67 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:87:51:87:54 | host | provenance | Sink:MaD:70 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:91:51:91:54 | host | provenance | Sink:MaD:72 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:93:45:93:48 | host | provenance | Sink:MaD:74 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:96:54:96:57 | host | provenance | Sink:MaD:76 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:102:55:102:58 | host | provenance | Sink:MaD:80 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:108:39:108:42 | host | provenance | Sink:MaD:85 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:112:36:112:39 | host | provenance | Sink:MaD:88 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:116:37:116:40 | host | provenance | Sink:MaD:91 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:120:40:120:43 | host | provenance | Sink:MaD:94 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:124:38:124:41 | host | provenance | Sink:MaD:97 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:128:37:128:40 | host | provenance | Sink:MaD:100 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:132:36:132:39 | host | provenance | Sink:MaD:103 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:136:38:136:41 | host | provenance | Sink:MaD:106 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:162:52:162:55 | host | provenance | Sink:MaD:207 | +| ApacheHttpSSRFVersion5.java:45:42:45:49 | hostSink : String | ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | provenance | MaD:299 | +| ApacheHttpSSRFVersion5.java:49:54:49:56 | uri : URI | ApacheHttpSSRFVersion5.java:49:54:49:67 | toString(...) | provenance | MaD:291 Sink:MaD:42 | +| ApacheHttpSSRFVersion5.java:51:48:51:50 | uri : URI | ApacheHttpSSRFVersion5.java:51:48:51:61 | toString(...) | provenance | MaD:291 Sink:MaD:44 | +| ApacheHttpSSRFVersion5.java:55:38:55:40 | uri : URI | ApacheHttpSSRFVersion5.java:55:38:55:51 | toString(...) | provenance | MaD:291 Sink:MaD:47 | +| ApacheHttpSSRFVersion5.java:59:35:59:37 | uri : URI | ApacheHttpSSRFVersion5.java:59:35:59:48 | toString(...) | provenance | MaD:291 Sink:MaD:50 | +| ApacheHttpSSRFVersion5.java:63:36:63:38 | uri : URI | ApacheHttpSSRFVersion5.java:63:36:63:49 | toString(...) | provenance | MaD:291 Sink:MaD:53 | +| ApacheHttpSSRFVersion5.java:67:39:67:41 | uri : URI | ApacheHttpSSRFVersion5.java:67:39:67:52 | toString(...) | provenance | MaD:291 Sink:MaD:56 | +| ApacheHttpSSRFVersion5.java:71:37:71:39 | uri : URI | ApacheHttpSSRFVersion5.java:71:37:71:50 | toString(...) | provenance | MaD:291 Sink:MaD:59 | +| ApacheHttpSSRFVersion5.java:75:36:75:38 | uri : URI | ApacheHttpSSRFVersion5.java:75:36:75:49 | toString(...) | provenance | MaD:291 Sink:MaD:62 | +| ApacheHttpSSRFVersion5.java:79:35:79:37 | uri : URI | ApacheHttpSSRFVersion5.java:79:35:79:48 | toString(...) | provenance | MaD:291 Sink:MaD:65 | +| ApacheHttpSSRFVersion5.java:83:37:83:39 | uri : URI | ApacheHttpSSRFVersion5.java:83:37:83:50 | toString(...) | provenance | MaD:291 Sink:MaD:68 | +| ApacheHttpSSRFVersion5.java:98:48:98:50 | uri : URI | ApacheHttpSSRFVersion5.java:98:48:98:61 | toString(...) | provenance | MaD:291 Sink:MaD:78 | +| ApacheHttpSSRFVersion5.java:103:55:103:57 | uri : URI | ApacheHttpSSRFVersion5.java:103:55:103:68 | toString(...) | provenance | MaD:291 Sink:MaD:81 | +| ApacheHttpSSRFVersion5.java:105:49:105:51 | uri : URI | ApacheHttpSSRFVersion5.java:105:49:105:62 | toString(...) | provenance | MaD:291 Sink:MaD:83 | +| ApacheHttpSSRFVersion5.java:109:39:109:41 | uri : URI | ApacheHttpSSRFVersion5.java:109:39:109:52 | toString(...) | provenance | MaD:291 Sink:MaD:86 | +| ApacheHttpSSRFVersion5.java:113:36:113:38 | uri : URI | ApacheHttpSSRFVersion5.java:113:36:113:49 | toString(...) | provenance | MaD:291 Sink:MaD:89 | +| ApacheHttpSSRFVersion5.java:117:37:117:39 | uri : URI | ApacheHttpSSRFVersion5.java:117:37:117:50 | toString(...) | provenance | MaD:291 Sink:MaD:92 | +| ApacheHttpSSRFVersion5.java:121:40:121:42 | uri : URI | ApacheHttpSSRFVersion5.java:121:40:121:53 | toString(...) | provenance | MaD:291 Sink:MaD:95 | +| ApacheHttpSSRFVersion5.java:125:38:125:40 | uri : URI | ApacheHttpSSRFVersion5.java:125:38:125:51 | toString(...) | provenance | MaD:291 Sink:MaD:98 | +| ApacheHttpSSRFVersion5.java:129:37:129:39 | uri : URI | ApacheHttpSSRFVersion5.java:129:37:129:50 | toString(...) | provenance | MaD:291 Sink:MaD:101 | +| ApacheHttpSSRFVersion5.java:133:36:133:38 | uri : URI | ApacheHttpSSRFVersion5.java:133:36:133:49 | toString(...) | provenance | MaD:291 Sink:MaD:104 | +| ApacheHttpSSRFVersion5.java:137:38:137:40 | uri : URI | ApacheHttpSSRFVersion5.java:137:38:137:51 | toString(...) | provenance | MaD:291 Sink:MaD:107 | +| ApacheHttpSSRFVersion5.java:141:41:141:43 | uri : URI | ApacheHttpSSRFVersion5.java:141:41:141:54 | toString(...) | provenance | MaD:291 Sink:MaD:109 | +| ApacheHttpSSRFVersion5.java:144:38:144:40 | uri : URI | ApacheHttpSSRFVersion5.java:144:38:144:51 | toString(...) | provenance | MaD:291 Sink:MaD:111 | +| ApacheHttpSSRFVersion5.java:147:39:147:41 | uri : URI | ApacheHttpSSRFVersion5.java:147:39:147:52 | toString(...) | provenance | MaD:291 Sink:MaD:113 | +| ApacheHttpSSRFVersion5.java:150:42:150:44 | uri : URI | ApacheHttpSSRFVersion5.java:150:42:150:55 | toString(...) | provenance | MaD:291 Sink:MaD:115 | +| ApacheHttpSSRFVersion5.java:153:40:153:42 | uri : URI | ApacheHttpSSRFVersion5.java:153:40:153:53 | toString(...) | provenance | MaD:291 Sink:MaD:117 | +| ApacheHttpSSRFVersion5.java:156:39:156:41 | uri : URI | ApacheHttpSSRFVersion5.java:156:39:156:52 | toString(...) | provenance | MaD:291 Sink:MaD:119 | +| ApacheHttpSSRFVersion5.java:159:38:159:40 | uri : URI | ApacheHttpSSRFVersion5.java:159:38:159:51 | toString(...) | provenance | MaD:291 Sink:MaD:121 | +| ApacheHttpSSRFVersion5.java:164:47:164:49 | uri : URI | ApacheHttpSSRFVersion5.java:164:47:164:60 | toString(...) | provenance | MaD:291 Sink:MaD:208 | +| ApacheHttpSSRFVersion5.java:167:40:167:42 | uri : URI | ApacheHttpSSRFVersion5.java:167:40:167:53 | toString(...) | provenance | MaD:291 Sink:MaD:123 | +| ApacheHttpSSRFVersion5.java:180:30:180:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:181:31:181:37 | uriSink : String | provenance | Src:MaD:280 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:184:56:184:58 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:185:56:185:58 | uri | provenance | Sink:MaD:123 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:185:56:185:58 | uri | provenance | Sink:MaD:126 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:186:50:186:52 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:187:50:187:52 | uri | provenance | Sink:MaD:125 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:187:50:187:52 | uri | provenance | Sink:MaD:128 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:189:40:189:42 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:190:40:190:42 | uri | provenance | Sink:MaD:127 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:190:40:190:42 | uri | provenance | Sink:MaD:130 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:192:37:192:39 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:193:37:193:39 | uri | provenance | Sink:MaD:129 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:193:37:193:39 | uri | provenance | Sink:MaD:132 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:195:38:195:40 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:196:38:196:40 | uri | provenance | Sink:MaD:131 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:196:38:196:40 | uri | provenance | Sink:MaD:134 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:198:41:198:43 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:199:41:199:43 | uri | provenance | Sink:MaD:133 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:199:41:199:43 | uri | provenance | Sink:MaD:136 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:201:39:201:41 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:202:39:202:41 | uri | provenance | Sink:MaD:135 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:202:39:202:41 | uri | provenance | Sink:MaD:138 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:204:38:204:40 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:205:38:205:40 | uri | provenance | Sink:MaD:137 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:205:38:205:40 | uri | provenance | Sink:MaD:140 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:207:37:207:39 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:208:37:208:39 | uri | provenance | Sink:MaD:139 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:208:37:208:39 | uri | provenance | Sink:MaD:142 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:210:39:210:41 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:211:39:211:41 | uri | provenance | Sink:MaD:141 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:211:39:211:41 | uri | provenance | Sink:MaD:144 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:214:28:214:30 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:215:28:215:30 | uri | provenance | Sink:MaD:143 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:215:28:215:30 | uri | provenance | Sink:MaD:146 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:217:25:217:27 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:218:25:218:27 | uri | provenance | Sink:MaD:145 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:218:25:218:27 | uri | provenance | Sink:MaD:148 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:220:26:220:28 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:221:26:221:28 | uri | provenance | Sink:MaD:147 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:221:26:221:28 | uri | provenance | Sink:MaD:150 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:223:29:223:31 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:224:29:224:31 | uri | provenance | Sink:MaD:149 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:224:29:224:31 | uri | provenance | Sink:MaD:152 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:226:27:226:29 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:227:27:227:29 | uri | provenance | Sink:MaD:151 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:227:27:227:29 | uri | provenance | Sink:MaD:154 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:229:26:229:28 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:230:26:230:28 | uri | provenance | Sink:MaD:153 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:230:26:230:28 | uri | provenance | Sink:MaD:156 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:232:25:232:27 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:233:25:233:27 | uri | provenance | Sink:MaD:155 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:233:25:233:27 | uri | provenance | Sink:MaD:158 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:235:27:235:29 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:236:27:236:29 | uri | provenance | Sink:MaD:157 | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:239:46:239:48 | uri | provenance | Sink:MaD:158 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:236:27:236:29 | uri | provenance | Sink:MaD:160 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:239:46:239:48 | uri | provenance | Sink:MaD:161 | | ApacheHttpSSRFVersion5.java:181:31:181:37 | uriSink : String | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | provenance | Config | -| ApacheHttpSSRFVersion5.java:181:31:181:37 | uriSink : String | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | provenance | MaD:285 | -| ApacheHttpSSRFVersion5.java:184:56:184:58 | uri : URI | ApacheHttpSSRFVersion5.java:184:56:184:69 | toString(...) | provenance | MaD:286 Sink:MaD:122 | -| ApacheHttpSSRFVersion5.java:186:50:186:52 | uri : URI | ApacheHttpSSRFVersion5.java:186:50:186:63 | toString(...) | provenance | MaD:286 Sink:MaD:124 | -| ApacheHttpSSRFVersion5.java:189:40:189:42 | uri : URI | ApacheHttpSSRFVersion5.java:189:40:189:53 | toString(...) | provenance | MaD:286 Sink:MaD:126 | -| ApacheHttpSSRFVersion5.java:192:37:192:39 | uri : URI | ApacheHttpSSRFVersion5.java:192:37:192:50 | toString(...) | provenance | MaD:286 Sink:MaD:128 | -| ApacheHttpSSRFVersion5.java:195:38:195:40 | uri : URI | ApacheHttpSSRFVersion5.java:195:38:195:51 | toString(...) | provenance | MaD:286 Sink:MaD:130 | -| ApacheHttpSSRFVersion5.java:198:41:198:43 | uri : URI | ApacheHttpSSRFVersion5.java:198:41:198:54 | toString(...) | provenance | MaD:286 Sink:MaD:132 | -| ApacheHttpSSRFVersion5.java:201:39:201:41 | uri : URI | ApacheHttpSSRFVersion5.java:201:39:201:52 | toString(...) | provenance | MaD:286 Sink:MaD:134 | -| ApacheHttpSSRFVersion5.java:204:38:204:40 | uri : URI | ApacheHttpSSRFVersion5.java:204:38:204:51 | toString(...) | provenance | MaD:286 Sink:MaD:136 | -| ApacheHttpSSRFVersion5.java:207:37:207:39 | uri : URI | ApacheHttpSSRFVersion5.java:207:37:207:50 | toString(...) | provenance | MaD:286 Sink:MaD:138 | -| ApacheHttpSSRFVersion5.java:210:39:210:41 | uri : URI | ApacheHttpSSRFVersion5.java:210:39:210:52 | toString(...) | provenance | MaD:286 Sink:MaD:140 | -| ApacheHttpSSRFVersion5.java:214:28:214:30 | uri : URI | ApacheHttpSSRFVersion5.java:214:28:214:41 | toString(...) | provenance | MaD:286 Sink:MaD:142 | -| ApacheHttpSSRFVersion5.java:217:25:217:27 | uri : URI | ApacheHttpSSRFVersion5.java:217:25:217:38 | toString(...) | provenance | MaD:286 Sink:MaD:144 | -| ApacheHttpSSRFVersion5.java:220:26:220:28 | uri : URI | ApacheHttpSSRFVersion5.java:220:26:220:39 | toString(...) | provenance | MaD:286 Sink:MaD:146 | -| ApacheHttpSSRFVersion5.java:223:29:223:31 | uri : URI | ApacheHttpSSRFVersion5.java:223:29:223:42 | toString(...) | provenance | MaD:286 Sink:MaD:148 | -| ApacheHttpSSRFVersion5.java:226:27:226:29 | uri : URI | ApacheHttpSSRFVersion5.java:226:27:226:40 | toString(...) | provenance | MaD:286 Sink:MaD:150 | -| ApacheHttpSSRFVersion5.java:229:26:229:28 | uri : URI | ApacheHttpSSRFVersion5.java:229:26:229:39 | toString(...) | provenance | MaD:286 Sink:MaD:152 | -| ApacheHttpSSRFVersion5.java:232:25:232:27 | uri : URI | ApacheHttpSSRFVersion5.java:232:25:232:38 | toString(...) | provenance | MaD:286 Sink:MaD:154 | -| ApacheHttpSSRFVersion5.java:235:27:235:29 | uri : URI | ApacheHttpSSRFVersion5.java:235:27:235:40 | toString(...) | provenance | MaD:286 Sink:MaD:156 | -| ApacheHttpSSRFVersion5.java:251:30:251:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:252:31:252:37 | uriSink : String | provenance | Src:MaD:277 | -| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:255:44:255:46 | uri | provenance | Sink:MaD:159 | +| ApacheHttpSSRFVersion5.java:181:31:181:37 | uriSink : String | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | provenance | MaD:290 | +| ApacheHttpSSRFVersion5.java:184:56:184:58 | uri : URI | ApacheHttpSSRFVersion5.java:184:56:184:69 | toString(...) | provenance | MaD:291 Sink:MaD:125 | +| ApacheHttpSSRFVersion5.java:186:50:186:52 | uri : URI | ApacheHttpSSRFVersion5.java:186:50:186:63 | toString(...) | provenance | MaD:291 Sink:MaD:127 | +| ApacheHttpSSRFVersion5.java:189:40:189:42 | uri : URI | ApacheHttpSSRFVersion5.java:189:40:189:53 | toString(...) | provenance | MaD:291 Sink:MaD:129 | +| ApacheHttpSSRFVersion5.java:192:37:192:39 | uri : URI | ApacheHttpSSRFVersion5.java:192:37:192:50 | toString(...) | provenance | MaD:291 Sink:MaD:131 | +| ApacheHttpSSRFVersion5.java:195:38:195:40 | uri : URI | ApacheHttpSSRFVersion5.java:195:38:195:51 | toString(...) | provenance | MaD:291 Sink:MaD:133 | +| ApacheHttpSSRFVersion5.java:198:41:198:43 | uri : URI | ApacheHttpSSRFVersion5.java:198:41:198:54 | toString(...) | provenance | MaD:291 Sink:MaD:135 | +| ApacheHttpSSRFVersion5.java:201:39:201:41 | uri : URI | ApacheHttpSSRFVersion5.java:201:39:201:52 | toString(...) | provenance | MaD:291 Sink:MaD:137 | +| ApacheHttpSSRFVersion5.java:204:38:204:40 | uri : URI | ApacheHttpSSRFVersion5.java:204:38:204:51 | toString(...) | provenance | MaD:291 Sink:MaD:139 | +| ApacheHttpSSRFVersion5.java:207:37:207:39 | uri : URI | ApacheHttpSSRFVersion5.java:207:37:207:50 | toString(...) | provenance | MaD:291 Sink:MaD:141 | +| ApacheHttpSSRFVersion5.java:210:39:210:41 | uri : URI | ApacheHttpSSRFVersion5.java:210:39:210:52 | toString(...) | provenance | MaD:291 Sink:MaD:143 | +| ApacheHttpSSRFVersion5.java:214:28:214:30 | uri : URI | ApacheHttpSSRFVersion5.java:214:28:214:41 | toString(...) | provenance | MaD:291 Sink:MaD:145 | +| ApacheHttpSSRFVersion5.java:217:25:217:27 | uri : URI | ApacheHttpSSRFVersion5.java:217:25:217:38 | toString(...) | provenance | MaD:291 Sink:MaD:147 | +| ApacheHttpSSRFVersion5.java:220:26:220:28 | uri : URI | ApacheHttpSSRFVersion5.java:220:26:220:39 | toString(...) | provenance | MaD:291 Sink:MaD:149 | +| ApacheHttpSSRFVersion5.java:223:29:223:31 | uri : URI | ApacheHttpSSRFVersion5.java:223:29:223:42 | toString(...) | provenance | MaD:291 Sink:MaD:151 | +| ApacheHttpSSRFVersion5.java:226:27:226:29 | uri : URI | ApacheHttpSSRFVersion5.java:226:27:226:40 | toString(...) | provenance | MaD:291 Sink:MaD:153 | +| ApacheHttpSSRFVersion5.java:229:26:229:28 | uri : URI | ApacheHttpSSRFVersion5.java:229:26:229:39 | toString(...) | provenance | MaD:291 Sink:MaD:155 | +| ApacheHttpSSRFVersion5.java:232:25:232:27 | uri : URI | ApacheHttpSSRFVersion5.java:232:25:232:38 | toString(...) | provenance | MaD:291 Sink:MaD:157 | +| ApacheHttpSSRFVersion5.java:235:27:235:29 | uri : URI | ApacheHttpSSRFVersion5.java:235:27:235:40 | toString(...) | provenance | MaD:291 Sink:MaD:159 | +| ApacheHttpSSRFVersion5.java:251:30:251:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:252:31:252:37 | uriSink : String | provenance | Src:MaD:280 | +| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:255:44:255:46 | uri | provenance | Sink:MaD:162 | | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:256:38:256:40 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:257:38:257:40 | uri | provenance | Sink:MaD:161 | +| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:257:38:257:40 | uri | provenance | Sink:MaD:164 | | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:259:28:259:30 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:260:28:260:30 | uri | provenance | Sink:MaD:163 | +| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:260:28:260:30 | uri | provenance | Sink:MaD:166 | | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:262:25:262:27 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:263:25:263:27 | uri | provenance | Sink:MaD:165 | +| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:263:25:263:27 | uri | provenance | Sink:MaD:168 | | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:265:26:265:28 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:266:26:266:28 | uri | provenance | Sink:MaD:167 | +| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:266:26:266:28 | uri | provenance | Sink:MaD:170 | | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:268:29:268:31 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:269:29:269:31 | uri | provenance | Sink:MaD:169 | +| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:269:29:269:31 | uri | provenance | Sink:MaD:172 | | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:271:27:271:29 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:272:27:272:29 | uri | provenance | Sink:MaD:171 | +| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:272:27:272:29 | uri | provenance | Sink:MaD:174 | | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:274:26:274:28 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:275:26:275:28 | uri | provenance | Sink:MaD:173 | +| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:275:26:275:28 | uri | provenance | Sink:MaD:176 | | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:277:25:277:27 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:278:25:278:27 | uri | provenance | Sink:MaD:175 | +| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:278:25:278:27 | uri | provenance | Sink:MaD:178 | | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:280:27:280:29 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:281:27:281:29 | uri | provenance | Sink:MaD:177 | +| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:281:27:281:29 | uri | provenance | Sink:MaD:180 | | ApacheHttpSSRFVersion5.java:252:31:252:37 | uriSink : String | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | provenance | Config | -| ApacheHttpSSRFVersion5.java:252:31:252:37 | uriSink : String | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | provenance | MaD:285 | -| ApacheHttpSSRFVersion5.java:256:38:256:40 | uri : URI | ApacheHttpSSRFVersion5.java:256:38:256:51 | toString(...) | provenance | MaD:286 Sink:MaD:160 | -| ApacheHttpSSRFVersion5.java:259:28:259:30 | uri : URI | ApacheHttpSSRFVersion5.java:259:28:259:41 | toString(...) | provenance | MaD:286 Sink:MaD:162 | -| ApacheHttpSSRFVersion5.java:262:25:262:27 | uri : URI | ApacheHttpSSRFVersion5.java:262:25:262:38 | toString(...) | provenance | MaD:286 Sink:MaD:164 | -| ApacheHttpSSRFVersion5.java:265:26:265:28 | uri : URI | ApacheHttpSSRFVersion5.java:265:26:265:39 | toString(...) | provenance | MaD:286 Sink:MaD:166 | -| ApacheHttpSSRFVersion5.java:268:29:268:31 | uri : URI | ApacheHttpSSRFVersion5.java:268:29:268:42 | toString(...) | provenance | MaD:286 Sink:MaD:168 | -| ApacheHttpSSRFVersion5.java:271:27:271:29 | uri : URI | ApacheHttpSSRFVersion5.java:271:27:271:40 | toString(...) | provenance | MaD:286 Sink:MaD:170 | -| ApacheHttpSSRFVersion5.java:274:26:274:28 | uri : URI | ApacheHttpSSRFVersion5.java:274:26:274:39 | toString(...) | provenance | MaD:286 Sink:MaD:172 | -| ApacheHttpSSRFVersion5.java:277:25:277:27 | uri : URI | ApacheHttpSSRFVersion5.java:277:25:277:38 | toString(...) | provenance | MaD:286 Sink:MaD:174 | -| ApacheHttpSSRFVersion5.java:280:27:280:29 | uri : URI | ApacheHttpSSRFVersion5.java:280:27:280:40 | toString(...) | provenance | MaD:286 Sink:MaD:176 | -| ApacheHttpSSRFVersion5.java:295:30:295:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:296:31:296:37 | uriSink : String | provenance | Src:MaD:277 | +| ApacheHttpSSRFVersion5.java:252:31:252:37 | uriSink : String | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | provenance | MaD:290 | +| ApacheHttpSSRFVersion5.java:256:38:256:40 | uri : URI | ApacheHttpSSRFVersion5.java:256:38:256:51 | toString(...) | provenance | MaD:291 Sink:MaD:163 | +| ApacheHttpSSRFVersion5.java:259:28:259:30 | uri : URI | ApacheHttpSSRFVersion5.java:259:28:259:41 | toString(...) | provenance | MaD:291 Sink:MaD:165 | +| ApacheHttpSSRFVersion5.java:262:25:262:27 | uri : URI | ApacheHttpSSRFVersion5.java:262:25:262:38 | toString(...) | provenance | MaD:291 Sink:MaD:167 | +| ApacheHttpSSRFVersion5.java:265:26:265:28 | uri : URI | ApacheHttpSSRFVersion5.java:265:26:265:39 | toString(...) | provenance | MaD:291 Sink:MaD:169 | +| ApacheHttpSSRFVersion5.java:268:29:268:31 | uri : URI | ApacheHttpSSRFVersion5.java:268:29:268:42 | toString(...) | provenance | MaD:291 Sink:MaD:171 | +| ApacheHttpSSRFVersion5.java:271:27:271:29 | uri : URI | ApacheHttpSSRFVersion5.java:271:27:271:40 | toString(...) | provenance | MaD:291 Sink:MaD:173 | +| ApacheHttpSSRFVersion5.java:274:26:274:28 | uri : URI | ApacheHttpSSRFVersion5.java:274:26:274:39 | toString(...) | provenance | MaD:291 Sink:MaD:175 | +| ApacheHttpSSRFVersion5.java:277:25:277:27 | uri : URI | ApacheHttpSSRFVersion5.java:277:25:277:38 | toString(...) | provenance | MaD:291 Sink:MaD:177 | +| ApacheHttpSSRFVersion5.java:280:27:280:29 | uri : URI | ApacheHttpSSRFVersion5.java:280:27:280:40 | toString(...) | provenance | MaD:291 Sink:MaD:179 | +| ApacheHttpSSRFVersion5.java:295:30:295:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:296:31:296:37 | uriSink : String | provenance | Src:MaD:280 | | ApacheHttpSSRFVersion5.java:296:23:296:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:308:60:308:62 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:296:23:296:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:309:60:309:62 | uri | provenance | Sink:MaD:209 | +| ApacheHttpSSRFVersion5.java:296:23:296:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:309:60:309:62 | uri | provenance | Sink:MaD:212 | | ApacheHttpSSRFVersion5.java:296:23:296:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:313:53:313:55 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:296:23:296:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:314:53:314:55 | uri | provenance | Sink:MaD:209 | +| ApacheHttpSSRFVersion5.java:296:23:296:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:314:53:314:55 | uri | provenance | Sink:MaD:212 | | ApacheHttpSSRFVersion5.java:296:31:296:37 | uriSink : String | ApacheHttpSSRFVersion5.java:296:23:296:38 | new URI(...) : URI | provenance | Config | -| ApacheHttpSSRFVersion5.java:296:31:296:37 | uriSink : String | ApacheHttpSSRFVersion5.java:296:23:296:38 | new URI(...) : URI | provenance | MaD:285 | -| ApacheHttpSSRFVersion5.java:298:31:298:58 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:299:42:299:49 | hostSink : String | provenance | Src:MaD:277 | -| ApacheHttpSSRFVersion5.java:299:29:299:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:303:34:303:37 | host | provenance | Sink:MaD:178 | -| ApacheHttpSSRFVersion5.java:299:29:299:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:304:34:304:37 | host | provenance | Sink:MaD:179 | -| ApacheHttpSSRFVersion5.java:299:42:299:49 | hostSink : String | ApacheHttpSSRFVersion5.java:299:29:299:50 | new HttpHost(...) : HttpHost | provenance | MaD:294 | -| ApacheHttpSSRFVersion5.java:308:60:308:62 | uri : URI | ApacheHttpSSRFVersion5.java:308:60:308:73 | toString(...) | provenance | MaD:286 Sink:MaD:208 | -| ApacheHttpSSRFVersion5.java:313:53:313:55 | uri : URI | ApacheHttpSSRFVersion5.java:313:53:313:66 | toString(...) | provenance | MaD:286 Sink:MaD:208 | -| ApacheHttpSSRFVersion5.java:326:30:326:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:327:31:327:37 | uriSink : String | provenance | Src:MaD:277 | +| ApacheHttpSSRFVersion5.java:296:31:296:37 | uriSink : String | ApacheHttpSSRFVersion5.java:296:23:296:38 | new URI(...) : URI | provenance | MaD:290 | +| ApacheHttpSSRFVersion5.java:298:31:298:58 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:299:42:299:49 | hostSink : String | provenance | Src:MaD:280 | +| ApacheHttpSSRFVersion5.java:299:29:299:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:303:34:303:37 | host | provenance | Sink:MaD:181 | +| ApacheHttpSSRFVersion5.java:299:29:299:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:304:34:304:37 | host | provenance | Sink:MaD:182 | +| ApacheHttpSSRFVersion5.java:299:42:299:49 | hostSink : String | ApacheHttpSSRFVersion5.java:299:29:299:50 | new HttpHost(...) : HttpHost | provenance | MaD:299 | +| ApacheHttpSSRFVersion5.java:308:60:308:62 | uri : URI | ApacheHttpSSRFVersion5.java:308:60:308:73 | toString(...) | provenance | MaD:291 Sink:MaD:211 | +| ApacheHttpSSRFVersion5.java:313:53:313:55 | uri : URI | ApacheHttpSSRFVersion5.java:313:53:313:66 | toString(...) | provenance | MaD:291 Sink:MaD:211 | +| ApacheHttpSSRFVersion5.java:326:30:326:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:327:31:327:37 | uriSink : String | provenance | Src:MaD:280 | | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:333:42:333:44 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:334:42:334:44 | uri | provenance | Sink:MaD:181 | +| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:334:42:334:44 | uri | provenance | Sink:MaD:184 | | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:336:39:336:41 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:337:39:337:41 | uri | provenance | Sink:MaD:183 | +| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:337:39:337:41 | uri | provenance | Sink:MaD:186 | | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:339:40:339:42 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:340:40:340:42 | uri | provenance | Sink:MaD:185 | +| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:340:40:340:42 | uri | provenance | Sink:MaD:188 | | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:342:43:342:45 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:343:43:343:45 | uri | provenance | Sink:MaD:187 | +| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:343:43:343:45 | uri | provenance | Sink:MaD:190 | | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:345:41:345:43 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:346:41:346:43 | uri | provenance | Sink:MaD:189 | +| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:346:41:346:43 | uri | provenance | Sink:MaD:192 | | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:348:40:348:42 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:349:40:349:42 | uri | provenance | Sink:MaD:191 | +| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:349:40:349:42 | uri | provenance | Sink:MaD:194 | | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:351:39:351:41 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:352:39:352:41 | uri | provenance | Sink:MaD:193 | +| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:352:39:352:41 | uri | provenance | Sink:MaD:196 | | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:356:48:356:50 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:357:48:357:50 | uri | provenance | Sink:MaD:206 | +| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:357:48:357:50 | uri | provenance | Sink:MaD:209 | | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:359:41:359:43 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:360:41:360:43 | uri | provenance | Sink:MaD:195 | +| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:360:41:360:43 | uri | provenance | Sink:MaD:198 | | ApacheHttpSSRFVersion5.java:327:31:327:37 | uriSink : String | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | provenance | Config | -| ApacheHttpSSRFVersion5.java:327:31:327:37 | uriSink : String | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | provenance | MaD:285 | -| ApacheHttpSSRFVersion5.java:329:31:329:58 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:330:42:330:49 | hostSink : String | provenance | Src:MaD:277 | -| ApacheHttpSSRFVersion5.java:330:29:330:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:354:53:354:56 | host | provenance | Sink:MaD:204 | -| ApacheHttpSSRFVersion5.java:330:42:330:49 | hostSink : String | ApacheHttpSSRFVersion5.java:330:29:330:50 | new HttpHost(...) : HttpHost | provenance | MaD:294 | -| ApacheHttpSSRFVersion5.java:333:42:333:44 | uri : URI | ApacheHttpSSRFVersion5.java:333:42:333:55 | toString(...) | provenance | MaD:286 Sink:MaD:180 | -| ApacheHttpSSRFVersion5.java:336:39:336:41 | uri : URI | ApacheHttpSSRFVersion5.java:336:39:336:52 | toString(...) | provenance | MaD:286 Sink:MaD:182 | -| ApacheHttpSSRFVersion5.java:339:40:339:42 | uri : URI | ApacheHttpSSRFVersion5.java:339:40:339:53 | toString(...) | provenance | MaD:286 Sink:MaD:184 | -| ApacheHttpSSRFVersion5.java:342:43:342:45 | uri : URI | ApacheHttpSSRFVersion5.java:342:43:342:56 | toString(...) | provenance | MaD:286 Sink:MaD:186 | -| ApacheHttpSSRFVersion5.java:345:41:345:43 | uri : URI | ApacheHttpSSRFVersion5.java:345:41:345:54 | toString(...) | provenance | MaD:286 Sink:MaD:188 | -| ApacheHttpSSRFVersion5.java:348:40:348:42 | uri : URI | ApacheHttpSSRFVersion5.java:348:40:348:53 | toString(...) | provenance | MaD:286 Sink:MaD:190 | -| ApacheHttpSSRFVersion5.java:351:39:351:41 | uri : URI | ApacheHttpSSRFVersion5.java:351:39:351:52 | toString(...) | provenance | MaD:286 Sink:MaD:192 | -| ApacheHttpSSRFVersion5.java:356:48:356:50 | uri : URI | ApacheHttpSSRFVersion5.java:356:48:356:61 | toString(...) | provenance | MaD:286 Sink:MaD:205 | -| ApacheHttpSSRFVersion5.java:359:41:359:43 | uri : URI | ApacheHttpSSRFVersion5.java:359:41:359:54 | toString(...) | provenance | MaD:286 Sink:MaD:194 | -| ApacheHttpSSRFVersion5.java:372:30:372:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:373:31:373:37 | uriSink : String | provenance | Src:MaD:277 | -| ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:380:57:380:59 | uri | provenance | Sink:MaD:197 | -| ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:382:51:382:53 | uri | provenance | Sink:MaD:199 | -| ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:386:50:386:52 | uri | provenance | Sink:MaD:201 | -| ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:388:44:388:46 | uri | provenance | Sink:MaD:203 | -| ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:390:24:390:26 | uri | provenance | Sink:MaD:207 | -| ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:394:24:394:26 | uri | provenance | Sink:MaD:207 | +| ApacheHttpSSRFVersion5.java:327:31:327:37 | uriSink : String | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | provenance | MaD:290 | +| ApacheHttpSSRFVersion5.java:329:31:329:58 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:330:42:330:49 | hostSink : String | provenance | Src:MaD:280 | +| ApacheHttpSSRFVersion5.java:330:29:330:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:354:53:354:56 | host | provenance | Sink:MaD:207 | +| ApacheHttpSSRFVersion5.java:330:42:330:49 | hostSink : String | ApacheHttpSSRFVersion5.java:330:29:330:50 | new HttpHost(...) : HttpHost | provenance | MaD:299 | +| ApacheHttpSSRFVersion5.java:333:42:333:44 | uri : URI | ApacheHttpSSRFVersion5.java:333:42:333:55 | toString(...) | provenance | MaD:291 Sink:MaD:183 | +| ApacheHttpSSRFVersion5.java:336:39:336:41 | uri : URI | ApacheHttpSSRFVersion5.java:336:39:336:52 | toString(...) | provenance | MaD:291 Sink:MaD:185 | +| ApacheHttpSSRFVersion5.java:339:40:339:42 | uri : URI | ApacheHttpSSRFVersion5.java:339:40:339:53 | toString(...) | provenance | MaD:291 Sink:MaD:187 | +| ApacheHttpSSRFVersion5.java:342:43:342:45 | uri : URI | ApacheHttpSSRFVersion5.java:342:43:342:56 | toString(...) | provenance | MaD:291 Sink:MaD:189 | +| ApacheHttpSSRFVersion5.java:345:41:345:43 | uri : URI | ApacheHttpSSRFVersion5.java:345:41:345:54 | toString(...) | provenance | MaD:291 Sink:MaD:191 | +| ApacheHttpSSRFVersion5.java:348:40:348:42 | uri : URI | ApacheHttpSSRFVersion5.java:348:40:348:53 | toString(...) | provenance | MaD:291 Sink:MaD:193 | +| ApacheHttpSSRFVersion5.java:351:39:351:41 | uri : URI | ApacheHttpSSRFVersion5.java:351:39:351:52 | toString(...) | provenance | MaD:291 Sink:MaD:195 | +| ApacheHttpSSRFVersion5.java:356:48:356:50 | uri : URI | ApacheHttpSSRFVersion5.java:356:48:356:61 | toString(...) | provenance | MaD:291 Sink:MaD:208 | +| ApacheHttpSSRFVersion5.java:359:41:359:43 | uri : URI | ApacheHttpSSRFVersion5.java:359:41:359:54 | toString(...) | provenance | MaD:291 Sink:MaD:197 | +| ApacheHttpSSRFVersion5.java:372:30:372:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:373:31:373:37 | uriSink : String | provenance | Src:MaD:280 | +| ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:380:57:380:59 | uri | provenance | Sink:MaD:200 | +| ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:382:51:382:53 | uri | provenance | Sink:MaD:202 | +| ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:386:50:386:52 | uri | provenance | Sink:MaD:204 | +| ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:388:44:388:46 | uri | provenance | Sink:MaD:206 | +| ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:390:24:390:26 | uri | provenance | Sink:MaD:210 | +| ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:394:24:394:26 | uri | provenance | Sink:MaD:210 | | ApacheHttpSSRFVersion5.java:373:31:373:37 | uriSink : String | ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | provenance | Config | -| ApacheHttpSSRFVersion5.java:373:31:373:37 | uriSink : String | ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | provenance | MaD:285 | -| ApacheHttpSSRFVersion5.java:375:31:375:58 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:376:42:376:49 | hostSink : String | provenance | Src:MaD:277 | -| ApacheHttpSSRFVersion5.java:376:29:376:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:379:57:379:60 | host | provenance | Sink:MaD:196 | -| ApacheHttpSSRFVersion5.java:376:29:376:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:381:51:381:54 | host | provenance | Sink:MaD:198 | -| ApacheHttpSSRFVersion5.java:376:29:376:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:385:50:385:53 | host | provenance | Sink:MaD:200 | -| ApacheHttpSSRFVersion5.java:376:29:376:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:387:44:387:47 | host | provenance | Sink:MaD:202 | -| ApacheHttpSSRFVersion5.java:376:42:376:49 | hostSink : String | ApacheHttpSSRFVersion5.java:376:29:376:50 | new HttpHost(...) : HttpHost | provenance | MaD:294 | -| JakartaWsSSRF.java:14:22:14:48 | getParameter(...) : String | JakartaWsSSRF.java:15:23:15:25 | url | provenance | Src:MaD:277 Sink:MaD:3 | -| JavaNetHttpSSRF.java:25:27:25:53 | getParameter(...) : String | JavaNetHttpSSRF.java:26:31:26:34 | sink : String | provenance | Src:MaD:277 | -| JavaNetHttpSSRF.java:26:23:26:35 | new URI(...) : URI | JavaNetHttpSSRF.java:39:59:39:61 | uri | provenance | Sink:MaD:6 | +| ApacheHttpSSRFVersion5.java:373:31:373:37 | uriSink : String | ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | provenance | MaD:290 | +| ApacheHttpSSRFVersion5.java:375:31:375:58 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:376:42:376:49 | hostSink : String | provenance | Src:MaD:280 | +| ApacheHttpSSRFVersion5.java:376:29:376:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:379:57:379:60 | host | provenance | Sink:MaD:199 | +| ApacheHttpSSRFVersion5.java:376:29:376:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:381:51:381:54 | host | provenance | Sink:MaD:201 | +| ApacheHttpSSRFVersion5.java:376:29:376:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:385:50:385:53 | host | provenance | Sink:MaD:203 | +| ApacheHttpSSRFVersion5.java:376:29:376:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:387:44:387:47 | host | provenance | Sink:MaD:205 | +| ApacheHttpSSRFVersion5.java:376:42:376:49 | hostSink : String | ApacheHttpSSRFVersion5.java:376:29:376:50 | new HttpHost(...) : HttpHost | provenance | MaD:299 | +| JakartaWsSSRF.java:14:22:14:48 | getParameter(...) : String | JakartaWsSSRF.java:15:23:15:25 | url | provenance | Src:MaD:280 Sink:MaD:6 | +| JavaNetHttpSSRF.java:25:27:25:53 | getParameter(...) : String | JavaNetHttpSSRF.java:26:31:26:34 | sink : String | provenance | Src:MaD:280 | +| JavaNetHttpSSRF.java:26:23:26:35 | new URI(...) : URI | JavaNetHttpSSRF.java:39:59:39:61 | uri | provenance | Sink:MaD:9 | | JavaNetHttpSSRF.java:26:31:26:34 | sink : String | JavaNetHttpSSRF.java:26:23:26:35 | new URI(...) : URI | provenance | Config | -| JavaNetHttpSSRF.java:26:31:26:34 | sink : String | JavaNetHttpSSRF.java:26:23:26:35 | new URI(...) : URI | provenance | MaD:285 | +| JavaNetHttpSSRF.java:26:31:26:34 | sink : String | JavaNetHttpSSRF.java:26:23:26:35 | new URI(...) : URI | provenance | MaD:290 | | JavaNetHttpSSRF.java:26:31:26:34 | sink : String | JavaNetHttpSSRF.java:27:40:27:43 | sink : String | provenance | | -| JavaNetHttpSSRF.java:27:24:27:57 | new URI(...) : URI | JavaNetHttpSSRF.java:38:65:38:68 | uri2 | provenance | Sink:MaD:5 | +| JavaNetHttpSSRF.java:27:24:27:57 | new URI(...) : URI | JavaNetHttpSSRF.java:38:65:38:68 | uri2 | provenance | Sink:MaD:8 | | JavaNetHttpSSRF.java:27:40:27:43 | sink : String | JavaNetHttpSSRF.java:27:24:27:57 | new URI(...) : URI | provenance | Config | | JavaNetHttpSSRF.java:27:40:27:43 | sink : String | JavaNetHttpSSRF.java:28:32:28:35 | sink : String | provenance | | -| JavaNetHttpSSRF.java:28:24:28:36 | new URL(...) : URL | JavaNetHttpSSRF.java:30:32:30:35 | url1 | provenance | Sink:MaD:9 | -| JavaNetHttpSSRF.java:28:24:28:36 | new URL(...) : URL | JavaNetHttpSSRF.java:33:32:33:35 | url1 | provenance | Sink:MaD:9 | -| JavaNetHttpSSRF.java:28:24:28:36 | new URL(...) : URL | JavaNetHttpSSRF.java:34:30:34:33 | url1 | provenance | Sink:MaD:10 | +| JavaNetHttpSSRF.java:28:24:28:36 | new URL(...) : URL | JavaNetHttpSSRF.java:30:32:30:35 | url1 | provenance | Sink:MaD:12 | +| JavaNetHttpSSRF.java:28:24:28:36 | new URL(...) : URL | JavaNetHttpSSRF.java:33:32:33:35 | url1 | provenance | Sink:MaD:12 | +| JavaNetHttpSSRF.java:28:24:28:36 | new URL(...) : URL | JavaNetHttpSSRF.java:34:30:34:33 | url1 | provenance | Sink:MaD:13 | | JavaNetHttpSSRF.java:28:32:28:35 | sink : String | JavaNetHttpSSRF.java:28:24:28:36 | new URL(...) : URL | provenance | Config | -| JavaNetHttpSSRF.java:28:32:28:35 | sink : String | JavaNetHttpSSRF.java:28:24:28:36 | new URL(...) : URL | provenance | MaD:288 | -| JaxWsSSRF.java:14:22:14:48 | getParameter(...) : String | JaxWsSSRF.java:15:23:15:25 | url | provenance | Src:MaD:277 Sink:MaD:23 | -| JdbcUrlSSRF.java:21:26:21:56 | getParameter(...) : String | JdbcUrlSSRF.java:26:28:26:34 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:17 | -| JdbcUrlSSRF.java:21:26:21:56 | getParameter(...) : String | JdbcUrlSSRF.java:28:41:28:47 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:18 | -| JdbcUrlSSRF.java:21:26:21:56 | getParameter(...) : String | JdbcUrlSSRF.java:29:41:29:47 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:20 | -| JdbcUrlSSRF.java:21:26:21:56 | getParameter(...) : String | JdbcUrlSSRF.java:30:41:30:47 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:19 | -| JdbcUrlSSRF.java:21:26:21:56 | getParameter(...) : String | JdbcUrlSSRF.java:32:27:32:33 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:242 | -| JdbcUrlSSRF.java:40:26:40:56 | getParameter(...) : String | JdbcUrlSSRF.java:43:27:43:33 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:2 | -| JdbcUrlSSRF.java:40:26:40:56 | getParameter(...) : String | JdbcUrlSSRF.java:48:23:48:29 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:2 | -| JdbcUrlSSRF.java:40:26:40:56 | getParameter(...) : String | JdbcUrlSSRF.java:52:38:52:44 | jdbcUrl : String | provenance | Src:MaD:277 | +| JavaNetHttpSSRF.java:28:32:28:35 | sink : String | JavaNetHttpSSRF.java:28:24:28:36 | new URL(...) : URL | provenance | MaD:293 | +| JaxWsSSRF.java:14:22:14:48 | getParameter(...) : String | JaxWsSSRF.java:15:23:15:25 | url | provenance | Src:MaD:280 Sink:MaD:26 | +| JdbcUrlSSRF.java:21:26:21:56 | getParameter(...) : String | JdbcUrlSSRF.java:26:28:26:34 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:20 | +| JdbcUrlSSRF.java:21:26:21:56 | getParameter(...) : String | JdbcUrlSSRF.java:28:41:28:47 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:21 | +| JdbcUrlSSRF.java:21:26:21:56 | getParameter(...) : String | JdbcUrlSSRF.java:29:41:29:47 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:23 | +| JdbcUrlSSRF.java:21:26:21:56 | getParameter(...) : String | JdbcUrlSSRF.java:30:41:30:47 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:22 | +| JdbcUrlSSRF.java:21:26:21:56 | getParameter(...) : String | JdbcUrlSSRF.java:32:27:32:33 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:245 | +| JdbcUrlSSRF.java:40:26:40:56 | getParameter(...) : String | JdbcUrlSSRF.java:43:27:43:33 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:2 | +| JdbcUrlSSRF.java:40:26:40:56 | getParameter(...) : String | JdbcUrlSSRF.java:48:23:48:29 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:2 | +| JdbcUrlSSRF.java:40:26:40:56 | getParameter(...) : String | JdbcUrlSSRF.java:52:38:52:44 | jdbcUrl : String | provenance | Src:MaD:280 | | JdbcUrlSSRF.java:52:9:52:13 | props : Properties | JdbcUrlSSRF.java:54:49:54:53 | props | provenance | Sink:MaD:1 | | JdbcUrlSSRF.java:52:9:52:13 | props [post update] : Properties [] : String | JdbcUrlSSRF.java:54:49:54:53 | props | provenance | Sink:MaD:1 | | JdbcUrlSSRF.java:52:38:52:44 | jdbcUrl : String | JdbcUrlSSRF.java:52:9:52:13 | props : Properties | provenance | Config | -| JdbcUrlSSRF.java:52:38:52:44 | jdbcUrl : String | JdbcUrlSSRF.java:52:9:52:13 | props [post update] : Properties [] : String | provenance | MaD:293 | -| JdbcUrlSSRF.java:60:26:60:56 | getParameter(...) : String | JdbcUrlSSRF.java:65:27:65:33 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:257 | -| JdbcUrlSSRF.java:60:26:60:56 | getParameter(...) : String | JdbcUrlSSRF.java:67:75:67:81 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:258 | -| JdbcUrlSSRF.java:60:26:60:56 | getParameter(...) : String | JdbcUrlSSRF.java:70:75:70:81 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:260 | -| JdbcUrlSSRF.java:60:26:60:56 | getParameter(...) : String | JdbcUrlSSRF.java:73:75:73:81 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:259 | -| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:82:21:82:27 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:235 | -| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:83:21:83:27 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:236 | -| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:84:21:84:27 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:237 | -| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:86:19:86:25 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:238 | -| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:87:19:87:25 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:239 | -| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:88:19:88:25 | jdbcUrl | provenance | Src:MaD:277 Sink:MaD:240 | -| ReactiveWebClientSSRF.java:15:26:15:52 | getParameter(...) : String | ReactiveWebClientSSRF.java:16:52:16:54 | url | provenance | Src:MaD:277 Sink:MaD:274 | -| ReactiveWebClientSSRF.java:32:26:32:52 | getParameter(...) : String | ReactiveWebClientSSRF.java:35:30:35:32 | url | provenance | Src:MaD:277 Sink:MaD:273 | -| SanitizationTests.java:22:23:22:58 | new URI(...) : URI | SanitizationTests.java:25:52:25:54 | uri | provenance | Sink:MaD:6 | +| JdbcUrlSSRF.java:52:38:52:44 | jdbcUrl : String | JdbcUrlSSRF.java:52:9:52:13 | props [post update] : Properties [] : String | provenance | MaD:298 | +| JdbcUrlSSRF.java:60:26:60:56 | getParameter(...) : String | JdbcUrlSSRF.java:65:27:65:33 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:260 | +| JdbcUrlSSRF.java:60:26:60:56 | getParameter(...) : String | JdbcUrlSSRF.java:67:75:67:81 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:261 | +| JdbcUrlSSRF.java:60:26:60:56 | getParameter(...) : String | JdbcUrlSSRF.java:70:75:70:81 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:263 | +| JdbcUrlSSRF.java:60:26:60:56 | getParameter(...) : String | JdbcUrlSSRF.java:73:75:73:81 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:262 | +| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:82:21:82:27 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:238 | +| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:83:21:83:27 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:239 | +| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:84:21:84:27 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:240 | +| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:86:19:86:25 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:241 | +| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:87:19:87:25 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:242 | +| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:88:19:88:25 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:243 | +| MicronautSSRF.java:14:32:14:53 | url : String | MicronautSSRF.java:15:45:15:47 | url | provenance | Sink:MaD:4 | +| MicronautSSRF.java:19:42:19:63 | url : String | MicronautSSRF.java:20:45:20:47 | url | provenance | Sink:MaD:3 | +| MicronautSSRF.java:24:37:24:58 | url : String | MicronautSSRF.java:25:45:25:47 | url | provenance | Sink:MaD:5 | +| MicronautSSRF.java:29:34:29:56 | host : String | MicronautSSRF.java:30:60:30:63 | host : String | provenance | | +| MicronautSSRF.java:30:19:30:64 | host(...) : UriBuilder | MicronautSSRF.java:30:19:30:72 | build(...) : URI | provenance | MaD:281 | +| MicronautSSRF.java:30:19:30:72 | build(...) : URI | MicronautSSRF.java:31:45:31:47 | uri : URI | provenance | | +| MicronautSSRF.java:30:60:30:63 | host : String | MicronautSSRF.java:30:19:30:64 | host(...) : UriBuilder | provenance | MaD:282 | +| MicronautSSRF.java:31:45:31:47 | uri : URI | MicronautSSRF.java:31:45:31:58 | toString(...) | provenance | MaD:291 Sink:MaD:4 | +| ReactiveWebClientSSRF.java:15:26:15:52 | getParameter(...) : String | ReactiveWebClientSSRF.java:16:52:16:54 | url | provenance | Src:MaD:280 Sink:MaD:277 | +| ReactiveWebClientSSRF.java:32:26:32:52 | getParameter(...) : String | ReactiveWebClientSSRF.java:35:30:35:32 | url | provenance | Src:MaD:280 Sink:MaD:276 | +| SanitizationTests.java:22:23:22:58 | new URI(...) : URI | SanitizationTests.java:25:52:25:54 | uri | provenance | Sink:MaD:9 | | SanitizationTests.java:22:23:22:58 | new URI(...) : URI | SanitizationTests.java:25:52:25:54 | uri : URI | provenance | | -| SanitizationTests.java:22:31:22:57 | getParameter(...) : String | SanitizationTests.java:22:23:22:58 | new URI(...) : URI | provenance | Src:MaD:277 Config | -| SanitizationTests.java:22:31:22:57 | getParameter(...) : String | SanitizationTests.java:22:23:22:58 | new URI(...) : URI | provenance | Src:MaD:277 MaD:285 | -| SanitizationTests.java:25:29:25:55 | newBuilder(...) : Builder | SanitizationTests.java:25:29:25:63 | build(...) : HttpRequest | provenance | MaD:283 | -| SanitizationTests.java:25:29:25:63 | build(...) : HttpRequest | SanitizationTests.java:26:25:26:25 | r | provenance | Sink:MaD:4 | -| SanitizationTests.java:25:52:25:54 | uri : URI | SanitizationTests.java:25:29:25:55 | newBuilder(...) : Builder | provenance | MaD:284 | -| SanitizationTests.java:78:33:78:63 | getParameter(...) : String | SanitizationTests.java:79:67:79:76 | unsafeUri3 : String | provenance | Src:MaD:277 | -| SanitizationTests.java:79:36:79:78 | newBuilder(...) : Builder | SanitizationTests.java:79:36:79:86 | build(...) : HttpRequest | provenance | MaD:283 | -| SanitizationTests.java:79:36:79:86 | build(...) : HttpRequest | SanitizationTests.java:80:25:80:32 | unsafer3 | provenance | Sink:MaD:4 | -| SanitizationTests.java:79:59:79:77 | new URI(...) : URI | SanitizationTests.java:79:36:79:78 | newBuilder(...) : Builder | provenance | MaD:284 | -| SanitizationTests.java:79:67:79:76 | unsafeUri3 : String | SanitizationTests.java:79:59:79:77 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:79:67:79:76 | unsafeUri3 : String | SanitizationTests.java:79:59:79:77 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:22:31:22:57 | getParameter(...) : String | SanitizationTests.java:22:23:22:58 | new URI(...) : URI | provenance | Src:MaD:280 Config | +| SanitizationTests.java:22:31:22:57 | getParameter(...) : String | SanitizationTests.java:22:23:22:58 | new URI(...) : URI | provenance | Src:MaD:280 MaD:290 | +| SanitizationTests.java:25:29:25:55 | newBuilder(...) : Builder | SanitizationTests.java:25:29:25:63 | build(...) : HttpRequest | provenance | MaD:288 | +| SanitizationTests.java:25:29:25:63 | build(...) : HttpRequest | SanitizationTests.java:26:25:26:25 | r | provenance | Sink:MaD:7 | +| SanitizationTests.java:25:52:25:54 | uri : URI | SanitizationTests.java:25:29:25:55 | newBuilder(...) : Builder | provenance | MaD:289 | +| SanitizationTests.java:78:33:78:63 | getParameter(...) : String | SanitizationTests.java:79:67:79:76 | unsafeUri3 : String | provenance | Src:MaD:280 | +| SanitizationTests.java:79:36:79:78 | newBuilder(...) : Builder | SanitizationTests.java:79:36:79:86 | build(...) : HttpRequest | provenance | MaD:288 | +| SanitizationTests.java:79:36:79:86 | build(...) : HttpRequest | SanitizationTests.java:80:25:80:32 | unsafer3 | provenance | Sink:MaD:7 | +| SanitizationTests.java:79:59:79:77 | new URI(...) : URI | SanitizationTests.java:79:36:79:78 | newBuilder(...) : Builder | provenance | MaD:289 | +| SanitizationTests.java:79:67:79:76 | unsafeUri3 : String | SanitizationTests.java:79:59:79:77 | new URI(...) | provenance | Config Sink:MaD:9 | +| SanitizationTests.java:79:67:79:76 | unsafeUri3 : String | SanitizationTests.java:79:59:79:77 | new URI(...) | provenance | MaD:290 Sink:MaD:9 | | SanitizationTests.java:79:67:79:76 | unsafeUri3 : String | SanitizationTests.java:79:59:79:77 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:79:67:79:76 | unsafeUri3 : String | SanitizationTests.java:79:59:79:77 | new URI(...) : URI | provenance | MaD:285 | -| SanitizationTests.java:82:49:82:79 | getParameter(...) : String | SanitizationTests.java:83:67:83:76 | unsafeUri4 : String | provenance | Src:MaD:277 | -| SanitizationTests.java:83:36:83:78 | newBuilder(...) : Builder | SanitizationTests.java:83:36:83:86 | build(...) : HttpRequest | provenance | MaD:283 | -| SanitizationTests.java:83:36:83:86 | build(...) : HttpRequest | SanitizationTests.java:84:25:84:32 | unsafer4 | provenance | Sink:MaD:4 | -| SanitizationTests.java:83:59:83:77 | new URI(...) : URI | SanitizationTests.java:83:36:83:78 | newBuilder(...) : Builder | provenance | MaD:284 | -| SanitizationTests.java:83:67:83:76 | unsafeUri4 : String | SanitizationTests.java:83:59:83:77 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:83:67:83:76 | unsafeUri4 : String | SanitizationTests.java:83:59:83:77 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:79:67:79:76 | unsafeUri3 : String | SanitizationTests.java:79:59:79:77 | new URI(...) : URI | provenance | MaD:290 | +| SanitizationTests.java:82:49:82:79 | getParameter(...) : String | SanitizationTests.java:83:67:83:76 | unsafeUri4 : String | provenance | Src:MaD:280 | +| SanitizationTests.java:83:36:83:78 | newBuilder(...) : Builder | SanitizationTests.java:83:36:83:86 | build(...) : HttpRequest | provenance | MaD:288 | +| SanitizationTests.java:83:36:83:86 | build(...) : HttpRequest | SanitizationTests.java:84:25:84:32 | unsafer4 | provenance | Sink:MaD:7 | +| SanitizationTests.java:83:59:83:77 | new URI(...) : URI | SanitizationTests.java:83:36:83:78 | newBuilder(...) : Builder | provenance | MaD:289 | +| SanitizationTests.java:83:67:83:76 | unsafeUri4 : String | SanitizationTests.java:83:59:83:77 | new URI(...) | provenance | Config Sink:MaD:9 | +| SanitizationTests.java:83:67:83:76 | unsafeUri4 : String | SanitizationTests.java:83:59:83:77 | new URI(...) | provenance | MaD:290 Sink:MaD:9 | | SanitizationTests.java:83:67:83:76 | unsafeUri4 : String | SanitizationTests.java:83:59:83:77 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:83:67:83:76 | unsafeUri4 : String | SanitizationTests.java:83:59:83:77 | new URI(...) : URI | provenance | MaD:285 | +| SanitizationTests.java:83:67:83:76 | unsafeUri4 : String | SanitizationTests.java:83:59:83:77 | new URI(...) : URI | provenance | MaD:290 | | SanitizationTests.java:87:13:87:22 | unsafeUri5 [post update] : StringBuilder | SanitizationTests.java:88:67:88:76 | unsafeUri5 : StringBuilder | provenance | | -| SanitizationTests.java:87:31:87:61 | getParameter(...) : String | SanitizationTests.java:87:13:87:22 | unsafeUri5 [post update] : StringBuilder | provenance | Src:MaD:277 MaD:278 | -| SanitizationTests.java:88:36:88:89 | newBuilder(...) : Builder | SanitizationTests.java:88:36:88:97 | build(...) : HttpRequest | provenance | MaD:283 | -| SanitizationTests.java:88:36:88:97 | build(...) : HttpRequest | SanitizationTests.java:89:25:89:32 | unsafer5 | provenance | Sink:MaD:4 | -| SanitizationTests.java:88:59:88:88 | new URI(...) : URI | SanitizationTests.java:88:36:88:89 | newBuilder(...) : Builder | provenance | MaD:284 | -| SanitizationTests.java:88:67:88:76 | unsafeUri5 : StringBuilder | SanitizationTests.java:88:67:88:87 | toString(...) : String | provenance | MaD:280 | -| SanitizationTests.java:88:67:88:87 | toString(...) : String | SanitizationTests.java:88:59:88:88 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:88:67:88:87 | toString(...) : String | SanitizationTests.java:88:59:88:88 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:87:31:87:61 | getParameter(...) : String | SanitizationTests.java:87:13:87:22 | unsafeUri5 [post update] : StringBuilder | provenance | Src:MaD:280 MaD:283 | +| SanitizationTests.java:88:36:88:89 | newBuilder(...) : Builder | SanitizationTests.java:88:36:88:97 | build(...) : HttpRequest | provenance | MaD:288 | +| SanitizationTests.java:88:36:88:97 | build(...) : HttpRequest | SanitizationTests.java:89:25:89:32 | unsafer5 | provenance | Sink:MaD:7 | +| SanitizationTests.java:88:59:88:88 | new URI(...) : URI | SanitizationTests.java:88:36:88:89 | newBuilder(...) : Builder | provenance | MaD:289 | +| SanitizationTests.java:88:67:88:76 | unsafeUri5 : StringBuilder | SanitizationTests.java:88:67:88:87 | toString(...) : String | provenance | MaD:285 | +| SanitizationTests.java:88:67:88:87 | toString(...) : String | SanitizationTests.java:88:59:88:88 | new URI(...) | provenance | Config Sink:MaD:9 | +| SanitizationTests.java:88:67:88:87 | toString(...) : String | SanitizationTests.java:88:59:88:88 | new URI(...) | provenance | MaD:290 Sink:MaD:9 | | SanitizationTests.java:88:67:88:87 | toString(...) : String | SanitizationTests.java:88:59:88:88 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:88:67:88:87 | toString(...) : String | SanitizationTests.java:88:59:88:88 | new URI(...) : URI | provenance | MaD:285 | +| SanitizationTests.java:88:67:88:87 | toString(...) : String | SanitizationTests.java:88:59:88:88 | new URI(...) : URI | provenance | MaD:290 | | SanitizationTests.java:91:40:91:87 | new StringBuilder(...) : StringBuilder | SanitizationTests.java:93:68:93:77 | unafeUri5a : StringBuilder | provenance | | -| SanitizationTests.java:91:58:91:86 | getParameter(...) : String | SanitizationTests.java:91:40:91:87 | new StringBuilder(...) : StringBuilder | provenance | Src:MaD:277 MaD:282 | -| SanitizationTests.java:93:37:93:90 | newBuilder(...) : Builder | SanitizationTests.java:93:37:93:98 | build(...) : HttpRequest | provenance | MaD:283 | -| SanitizationTests.java:93:37:93:98 | build(...) : HttpRequest | SanitizationTests.java:94:25:94:33 | unsafer5a | provenance | Sink:MaD:4 | -| SanitizationTests.java:93:60:93:89 | new URI(...) : URI | SanitizationTests.java:93:37:93:90 | newBuilder(...) : Builder | provenance | MaD:284 | -| SanitizationTests.java:93:68:93:77 | unafeUri5a : StringBuilder | SanitizationTests.java:93:68:93:88 | toString(...) : String | provenance | MaD:280 | -| SanitizationTests.java:93:68:93:88 | toString(...) : String | SanitizationTests.java:93:60:93:89 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:93:68:93:88 | toString(...) : String | SanitizationTests.java:93:60:93:89 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:91:58:91:86 | getParameter(...) : String | SanitizationTests.java:91:40:91:87 | new StringBuilder(...) : StringBuilder | provenance | Src:MaD:280 MaD:287 | +| SanitizationTests.java:93:37:93:90 | newBuilder(...) : Builder | SanitizationTests.java:93:37:93:98 | build(...) : HttpRequest | provenance | MaD:288 | +| SanitizationTests.java:93:37:93:98 | build(...) : HttpRequest | SanitizationTests.java:94:25:94:33 | unsafer5a | provenance | Sink:MaD:7 | +| SanitizationTests.java:93:60:93:89 | new URI(...) : URI | SanitizationTests.java:93:37:93:90 | newBuilder(...) : Builder | provenance | MaD:289 | +| SanitizationTests.java:93:68:93:77 | unafeUri5a : StringBuilder | SanitizationTests.java:93:68:93:88 | toString(...) : String | provenance | MaD:285 | +| SanitizationTests.java:93:68:93:88 | toString(...) : String | SanitizationTests.java:93:60:93:89 | new URI(...) | provenance | Config Sink:MaD:9 | +| SanitizationTests.java:93:68:93:88 | toString(...) : String | SanitizationTests.java:93:60:93:89 | new URI(...) | provenance | MaD:290 Sink:MaD:9 | | SanitizationTests.java:93:68:93:88 | toString(...) : String | SanitizationTests.java:93:60:93:89 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:93:68:93:88 | toString(...) : String | SanitizationTests.java:93:60:93:89 | new URI(...) : URI | provenance | MaD:285 | +| SanitizationTests.java:93:68:93:88 | toString(...) : String | SanitizationTests.java:93:60:93:89 | new URI(...) : URI | provenance | MaD:290 | | SanitizationTests.java:96:41:96:105 | append(...) : StringBuilder | SanitizationTests.java:98:68:98:78 | unsafeUri5b : StringBuilder | provenance | | -| SanitizationTests.java:96:42:96:89 | new StringBuilder(...) : StringBuilder | SanitizationTests.java:96:41:96:105 | append(...) : StringBuilder | provenance | MaD:279 | -| SanitizationTests.java:96:60:96:88 | getParameter(...) : String | SanitizationTests.java:96:42:96:89 | new StringBuilder(...) : StringBuilder | provenance | Src:MaD:277 MaD:282 | -| SanitizationTests.java:98:37:98:91 | newBuilder(...) : Builder | SanitizationTests.java:98:37:98:99 | build(...) : HttpRequest | provenance | MaD:283 | -| SanitizationTests.java:98:37:98:99 | build(...) : HttpRequest | SanitizationTests.java:99:25:99:33 | unsafer5b | provenance | Sink:MaD:4 | -| SanitizationTests.java:98:60:98:90 | new URI(...) : URI | SanitizationTests.java:98:37:98:91 | newBuilder(...) : Builder | provenance | MaD:284 | -| SanitizationTests.java:98:68:98:78 | unsafeUri5b : StringBuilder | SanitizationTests.java:98:68:98:89 | toString(...) : String | provenance | MaD:280 | -| SanitizationTests.java:98:68:98:89 | toString(...) : String | SanitizationTests.java:98:60:98:90 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:98:68:98:89 | toString(...) : String | SanitizationTests.java:98:60:98:90 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:96:42:96:89 | new StringBuilder(...) : StringBuilder | SanitizationTests.java:96:41:96:105 | append(...) : StringBuilder | provenance | MaD:284 | +| SanitizationTests.java:96:60:96:88 | getParameter(...) : String | SanitizationTests.java:96:42:96:89 | new StringBuilder(...) : StringBuilder | provenance | Src:MaD:280 MaD:287 | +| SanitizationTests.java:98:37:98:91 | newBuilder(...) : Builder | SanitizationTests.java:98:37:98:99 | build(...) : HttpRequest | provenance | MaD:288 | +| SanitizationTests.java:98:37:98:99 | build(...) : HttpRequest | SanitizationTests.java:99:25:99:33 | unsafer5b | provenance | Sink:MaD:7 | +| SanitizationTests.java:98:60:98:90 | new URI(...) : URI | SanitizationTests.java:98:37:98:91 | newBuilder(...) : Builder | provenance | MaD:289 | +| SanitizationTests.java:98:68:98:78 | unsafeUri5b : StringBuilder | SanitizationTests.java:98:68:98:89 | toString(...) : String | provenance | MaD:285 | +| SanitizationTests.java:98:68:98:89 | toString(...) : String | SanitizationTests.java:98:60:98:90 | new URI(...) | provenance | Config Sink:MaD:9 | +| SanitizationTests.java:98:68:98:89 | toString(...) : String | SanitizationTests.java:98:60:98:90 | new URI(...) | provenance | MaD:290 Sink:MaD:9 | | SanitizationTests.java:98:68:98:89 | toString(...) : String | SanitizationTests.java:98:60:98:90 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:98:68:98:89 | toString(...) : String | SanitizationTests.java:98:60:98:90 | new URI(...) : URI | provenance | MaD:285 | +| SanitizationTests.java:98:68:98:89 | toString(...) : String | SanitizationTests.java:98:60:98:90 | new URI(...) : URI | provenance | MaD:290 | | SanitizationTests.java:101:41:101:106 | append(...) : StringBuilder | SanitizationTests.java:103:68:103:78 | unsafeUri5c : StringBuilder | provenance | | -| SanitizationTests.java:101:77:101:105 | getParameter(...) : String | SanitizationTests.java:101:41:101:106 | append(...) : StringBuilder | provenance | Src:MaD:277 MaD:278+MaD:279 | -| SanitizationTests.java:103:37:103:91 | newBuilder(...) : Builder | SanitizationTests.java:103:37:103:99 | build(...) : HttpRequest | provenance | MaD:283 | -| SanitizationTests.java:103:37:103:99 | build(...) : HttpRequest | SanitizationTests.java:104:25:104:33 | unsafer5c | provenance | Sink:MaD:4 | -| SanitizationTests.java:103:60:103:90 | new URI(...) : URI | SanitizationTests.java:103:37:103:91 | newBuilder(...) : Builder | provenance | MaD:284 | -| SanitizationTests.java:103:68:103:78 | unsafeUri5c : StringBuilder | SanitizationTests.java:103:68:103:89 | toString(...) : String | provenance | MaD:280 | -| SanitizationTests.java:103:68:103:89 | toString(...) : String | SanitizationTests.java:103:60:103:90 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:103:68:103:89 | toString(...) : String | SanitizationTests.java:103:60:103:90 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:101:77:101:105 | getParameter(...) : String | SanitizationTests.java:101:41:101:106 | append(...) : StringBuilder | provenance | Src:MaD:280 MaD:283+MaD:284 | +| SanitizationTests.java:103:37:103:91 | newBuilder(...) : Builder | SanitizationTests.java:103:37:103:99 | build(...) : HttpRequest | provenance | MaD:288 | +| SanitizationTests.java:103:37:103:99 | build(...) : HttpRequest | SanitizationTests.java:104:25:104:33 | unsafer5c | provenance | Sink:MaD:7 | +| SanitizationTests.java:103:60:103:90 | new URI(...) : URI | SanitizationTests.java:103:37:103:91 | newBuilder(...) : Builder | provenance | MaD:289 | +| SanitizationTests.java:103:68:103:78 | unsafeUri5c : StringBuilder | SanitizationTests.java:103:68:103:89 | toString(...) : String | provenance | MaD:285 | +| SanitizationTests.java:103:68:103:89 | toString(...) : String | SanitizationTests.java:103:60:103:90 | new URI(...) | provenance | Config Sink:MaD:9 | +| SanitizationTests.java:103:68:103:89 | toString(...) : String | SanitizationTests.java:103:60:103:90 | new URI(...) | provenance | MaD:290 Sink:MaD:9 | | SanitizationTests.java:103:68:103:89 | toString(...) : String | SanitizationTests.java:103:60:103:90 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:103:68:103:89 | toString(...) : String | SanitizationTests.java:103:60:103:90 | new URI(...) : URI | provenance | MaD:285 | +| SanitizationTests.java:103:68:103:89 | toString(...) : String | SanitizationTests.java:103:60:103:90 | new URI(...) : URI | provenance | MaD:290 | | SanitizationTests.java:106:33:106:104 | format(...) : String | SanitizationTests.java:107:67:107:76 | unsafeUri6 : String | provenance | | -| SanitizationTests.java:106:33:106:104 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:106:33:106:104 | format(...) : String | provenance | MaD:281 | -| SanitizationTests.java:106:73:106:103 | getParameter(...) : String | SanitizationTests.java:106:33:106:104 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:277 | -| SanitizationTests.java:107:36:107:78 | newBuilder(...) : Builder | SanitizationTests.java:107:36:107:86 | build(...) : HttpRequest | provenance | MaD:283 | -| SanitizationTests.java:107:36:107:86 | build(...) : HttpRequest | SanitizationTests.java:108:25:108:32 | unsafer6 | provenance | Sink:MaD:4 | -| SanitizationTests.java:107:59:107:77 | new URI(...) : URI | SanitizationTests.java:107:36:107:78 | newBuilder(...) : Builder | provenance | MaD:284 | -| SanitizationTests.java:107:67:107:76 | unsafeUri6 : String | SanitizationTests.java:107:59:107:77 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:107:67:107:76 | unsafeUri6 : String | SanitizationTests.java:107:59:107:77 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:106:33:106:104 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:106:33:106:104 | format(...) : String | provenance | MaD:286 | +| SanitizationTests.java:106:73:106:103 | getParameter(...) : String | SanitizationTests.java:106:33:106:104 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:280 | +| SanitizationTests.java:107:36:107:78 | newBuilder(...) : Builder | SanitizationTests.java:107:36:107:86 | build(...) : HttpRequest | provenance | MaD:288 | +| SanitizationTests.java:107:36:107:86 | build(...) : HttpRequest | SanitizationTests.java:108:25:108:32 | unsafer6 | provenance | Sink:MaD:7 | +| SanitizationTests.java:107:59:107:77 | new URI(...) : URI | SanitizationTests.java:107:36:107:78 | newBuilder(...) : Builder | provenance | MaD:289 | +| SanitizationTests.java:107:67:107:76 | unsafeUri6 : String | SanitizationTests.java:107:59:107:77 | new URI(...) | provenance | Config Sink:MaD:9 | +| SanitizationTests.java:107:67:107:76 | unsafeUri6 : String | SanitizationTests.java:107:59:107:77 | new URI(...) | provenance | MaD:290 Sink:MaD:9 | | SanitizationTests.java:107:67:107:76 | unsafeUri6 : String | SanitizationTests.java:107:59:107:77 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:107:67:107:76 | unsafeUri6 : String | SanitizationTests.java:107:59:107:77 | new URI(...) : URI | provenance | MaD:285 | +| SanitizationTests.java:107:67:107:76 | unsafeUri6 : String | SanitizationTests.java:107:59:107:77 | new URI(...) : URI | provenance | MaD:290 | | SanitizationTests.java:110:33:110:110 | format(...) : String | SanitizationTests.java:111:67:111:76 | unsafeUri7 : String | provenance | | -| SanitizationTests.java:110:33:110:110 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:110:33:110:110 | format(...) : String | provenance | MaD:281 | -| SanitizationTests.java:110:56:110:86 | getParameter(...) : String | SanitizationTests.java:110:33:110:110 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:277 | -| SanitizationTests.java:111:36:111:78 | newBuilder(...) : Builder | SanitizationTests.java:111:36:111:86 | build(...) : HttpRequest | provenance | MaD:283 | -| SanitizationTests.java:111:36:111:86 | build(...) : HttpRequest | SanitizationTests.java:112:25:112:32 | unsafer7 | provenance | Sink:MaD:4 | -| SanitizationTests.java:111:59:111:77 | new URI(...) : URI | SanitizationTests.java:111:36:111:78 | newBuilder(...) : Builder | provenance | MaD:284 | -| SanitizationTests.java:111:67:111:76 | unsafeUri7 : String | SanitizationTests.java:111:59:111:77 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:111:67:111:76 | unsafeUri7 : String | SanitizationTests.java:111:59:111:77 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:110:33:110:110 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:110:33:110:110 | format(...) : String | provenance | MaD:286 | +| SanitizationTests.java:110:56:110:86 | getParameter(...) : String | SanitizationTests.java:110:33:110:110 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:280 | +| SanitizationTests.java:111:36:111:78 | newBuilder(...) : Builder | SanitizationTests.java:111:36:111:86 | build(...) : HttpRequest | provenance | MaD:288 | +| SanitizationTests.java:111:36:111:86 | build(...) : HttpRequest | SanitizationTests.java:112:25:112:32 | unsafer7 | provenance | Sink:MaD:7 | +| SanitizationTests.java:111:59:111:77 | new URI(...) : URI | SanitizationTests.java:111:36:111:78 | newBuilder(...) : Builder | provenance | MaD:289 | +| SanitizationTests.java:111:67:111:76 | unsafeUri7 : String | SanitizationTests.java:111:59:111:77 | new URI(...) | provenance | Config Sink:MaD:9 | +| SanitizationTests.java:111:67:111:76 | unsafeUri7 : String | SanitizationTests.java:111:59:111:77 | new URI(...) | provenance | MaD:290 Sink:MaD:9 | | SanitizationTests.java:111:67:111:76 | unsafeUri7 : String | SanitizationTests.java:111:59:111:77 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:111:67:111:76 | unsafeUri7 : String | SanitizationTests.java:111:59:111:77 | new URI(...) : URI | provenance | MaD:285 | +| SanitizationTests.java:111:67:111:76 | unsafeUri7 : String | SanitizationTests.java:111:59:111:77 | new URI(...) : URI | provenance | MaD:290 | | SanitizationTests.java:114:33:114:110 | format(...) : String | SanitizationTests.java:115:67:115:76 | unsafeUri8 : String | provenance | | -| SanitizationTests.java:114:33:114:110 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:114:33:114:110 | format(...) : String | provenance | MaD:281 | -| SanitizationTests.java:114:55:114:85 | getParameter(...) : String | SanitizationTests.java:114:33:114:110 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:277 | -| SanitizationTests.java:115:36:115:78 | newBuilder(...) : Builder | SanitizationTests.java:115:36:115:86 | build(...) : HttpRequest | provenance | MaD:283 | -| SanitizationTests.java:115:36:115:86 | build(...) : HttpRequest | SanitizationTests.java:116:25:116:32 | unsafer8 | provenance | Sink:MaD:4 | -| SanitizationTests.java:115:59:115:77 | new URI(...) : URI | SanitizationTests.java:115:36:115:78 | newBuilder(...) : Builder | provenance | MaD:284 | -| SanitizationTests.java:115:67:115:76 | unsafeUri8 : String | SanitizationTests.java:115:59:115:77 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:115:67:115:76 | unsafeUri8 : String | SanitizationTests.java:115:59:115:77 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:114:33:114:110 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:114:33:114:110 | format(...) : String | provenance | MaD:286 | +| SanitizationTests.java:114:55:114:85 | getParameter(...) : String | SanitizationTests.java:114:33:114:110 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:280 | +| SanitizationTests.java:115:36:115:78 | newBuilder(...) : Builder | SanitizationTests.java:115:36:115:86 | build(...) : HttpRequest | provenance | MaD:288 | +| SanitizationTests.java:115:36:115:86 | build(...) : HttpRequest | SanitizationTests.java:116:25:116:32 | unsafer8 | provenance | Sink:MaD:7 | +| SanitizationTests.java:115:59:115:77 | new URI(...) : URI | SanitizationTests.java:115:36:115:78 | newBuilder(...) : Builder | provenance | MaD:289 | +| SanitizationTests.java:115:67:115:76 | unsafeUri8 : String | SanitizationTests.java:115:59:115:77 | new URI(...) | provenance | Config Sink:MaD:9 | +| SanitizationTests.java:115:67:115:76 | unsafeUri8 : String | SanitizationTests.java:115:59:115:77 | new URI(...) | provenance | MaD:290 Sink:MaD:9 | | SanitizationTests.java:115:67:115:76 | unsafeUri8 : String | SanitizationTests.java:115:59:115:77 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:115:67:115:76 | unsafeUri8 : String | SanitizationTests.java:115:59:115:77 | new URI(...) : URI | provenance | MaD:285 | -| SanitizationTests.java:118:33:118:63 | getParameter(...) : String | SanitizationTests.java:119:67:119:76 | unsafeUri9 : String | provenance | Src:MaD:277 | -| SanitizationTests.java:119:36:119:78 | newBuilder(...) : Builder | SanitizationTests.java:119:36:119:86 | build(...) : HttpRequest | provenance | MaD:283 | -| SanitizationTests.java:119:36:119:86 | build(...) : HttpRequest | SanitizationTests.java:120:25:120:32 | unsafer9 | provenance | Sink:MaD:4 | -| SanitizationTests.java:119:59:119:77 | new URI(...) : URI | SanitizationTests.java:119:36:119:78 | newBuilder(...) : Builder | provenance | MaD:284 | -| SanitizationTests.java:119:67:119:76 | unsafeUri9 : String | SanitizationTests.java:119:59:119:77 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:119:67:119:76 | unsafeUri9 : String | SanitizationTests.java:119:59:119:77 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:115:67:115:76 | unsafeUri8 : String | SanitizationTests.java:115:59:115:77 | new URI(...) : URI | provenance | MaD:290 | +| SanitizationTests.java:118:33:118:63 | getParameter(...) : String | SanitizationTests.java:119:67:119:76 | unsafeUri9 : String | provenance | Src:MaD:280 | +| SanitizationTests.java:119:36:119:78 | newBuilder(...) : Builder | SanitizationTests.java:119:36:119:86 | build(...) : HttpRequest | provenance | MaD:288 | +| SanitizationTests.java:119:36:119:86 | build(...) : HttpRequest | SanitizationTests.java:120:25:120:32 | unsafer9 | provenance | Sink:MaD:7 | +| SanitizationTests.java:119:59:119:77 | new URI(...) : URI | SanitizationTests.java:119:36:119:78 | newBuilder(...) : Builder | provenance | MaD:289 | +| SanitizationTests.java:119:67:119:76 | unsafeUri9 : String | SanitizationTests.java:119:59:119:77 | new URI(...) | provenance | Config Sink:MaD:9 | +| SanitizationTests.java:119:67:119:76 | unsafeUri9 : String | SanitizationTests.java:119:59:119:77 | new URI(...) | provenance | MaD:290 Sink:MaD:9 | | SanitizationTests.java:119:67:119:76 | unsafeUri9 : String | SanitizationTests.java:119:59:119:77 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:119:67:119:76 | unsafeUri9 : String | SanitizationTests.java:119:59:119:77 | new URI(...) : URI | provenance | MaD:285 | +| SanitizationTests.java:119:67:119:76 | unsafeUri9 : String | SanitizationTests.java:119:59:119:77 | new URI(...) : URI | provenance | MaD:290 | | SanitizationTests.java:122:34:122:126 | format(...) : String | SanitizationTests.java:123:68:123:78 | unsafeUri10 : String | provenance | | -| SanitizationTests.java:122:34:122:126 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:122:34:122:126 | format(...) : String | provenance | MaD:281 | -| SanitizationTests.java:122:94:122:125 | getParameter(...) : String | SanitizationTests.java:122:34:122:126 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:277 | -| SanitizationTests.java:123:37:123:80 | newBuilder(...) : Builder | SanitizationTests.java:123:37:123:88 | build(...) : HttpRequest | provenance | MaD:283 | -| SanitizationTests.java:123:37:123:88 | build(...) : HttpRequest | SanitizationTests.java:124:25:124:33 | unsafer10 | provenance | Sink:MaD:4 | -| SanitizationTests.java:123:60:123:79 | new URI(...) : URI | SanitizationTests.java:123:37:123:80 | newBuilder(...) : Builder | provenance | MaD:284 | -| SanitizationTests.java:123:68:123:78 | unsafeUri10 : String | SanitizationTests.java:123:60:123:79 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:123:68:123:78 | unsafeUri10 : String | SanitizationTests.java:123:60:123:79 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:122:34:122:126 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:122:34:122:126 | format(...) : String | provenance | MaD:286 | +| SanitizationTests.java:122:94:122:125 | getParameter(...) : String | SanitizationTests.java:122:34:122:126 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:280 | +| SanitizationTests.java:123:37:123:80 | newBuilder(...) : Builder | SanitizationTests.java:123:37:123:88 | build(...) : HttpRequest | provenance | MaD:288 | +| SanitizationTests.java:123:37:123:88 | build(...) : HttpRequest | SanitizationTests.java:124:25:124:33 | unsafer10 | provenance | Sink:MaD:7 | +| SanitizationTests.java:123:60:123:79 | new URI(...) : URI | SanitizationTests.java:123:37:123:80 | newBuilder(...) : Builder | provenance | MaD:289 | +| SanitizationTests.java:123:68:123:78 | unsafeUri10 : String | SanitizationTests.java:123:60:123:79 | new URI(...) | provenance | Config Sink:MaD:9 | +| SanitizationTests.java:123:68:123:78 | unsafeUri10 : String | SanitizationTests.java:123:60:123:79 | new URI(...) | provenance | MaD:290 Sink:MaD:9 | | SanitizationTests.java:123:68:123:78 | unsafeUri10 : String | SanitizationTests.java:123:60:123:79 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:123:68:123:78 | unsafeUri10 : String | SanitizationTests.java:123:60:123:79 | new URI(...) : URI | provenance | MaD:285 | -| SanitizationTests.java:177:31:177:114 | newBuilder(...) : Builder | SanitizationTests.java:177:31:177:122 | build(...) : HttpRequest | provenance | MaD:283 | -| SanitizationTests.java:177:31:177:122 | build(...) : HttpRequest | SanitizationTests.java:178:25:178:27 | r18 | provenance | Sink:MaD:4 | -| SanitizationTests.java:177:54:177:113 | new URI(...) : URI | SanitizationTests.java:177:31:177:114 | newBuilder(...) : Builder | provenance | MaD:284 | -| SanitizationTests.java:177:62:177:112 | getFromList(...) : String | SanitizationTests.java:177:54:177:113 | new URI(...) | provenance | Config Sink:MaD:6 | -| SanitizationTests.java:177:62:177:112 | getFromList(...) : String | SanitizationTests.java:177:54:177:113 | new URI(...) | provenance | MaD:285 Sink:MaD:6 | +| SanitizationTests.java:123:68:123:78 | unsafeUri10 : String | SanitizationTests.java:123:60:123:79 | new URI(...) : URI | provenance | MaD:290 | +| SanitizationTests.java:177:31:177:114 | newBuilder(...) : Builder | SanitizationTests.java:177:31:177:122 | build(...) : HttpRequest | provenance | MaD:288 | +| SanitizationTests.java:177:31:177:122 | build(...) : HttpRequest | SanitizationTests.java:178:25:178:27 | r18 | provenance | Sink:MaD:7 | +| SanitizationTests.java:177:54:177:113 | new URI(...) : URI | SanitizationTests.java:177:31:177:114 | newBuilder(...) : Builder | provenance | MaD:289 | +| SanitizationTests.java:177:62:177:112 | getFromList(...) : String | SanitizationTests.java:177:54:177:113 | new URI(...) | provenance | Config Sink:MaD:9 | +| SanitizationTests.java:177:62:177:112 | getFromList(...) : String | SanitizationTests.java:177:54:177:113 | new URI(...) | provenance | MaD:290 Sink:MaD:9 | | SanitizationTests.java:177:62:177:112 | getFromList(...) : String | SanitizationTests.java:177:54:177:113 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:177:62:177:112 | getFromList(...) : String | SanitizationTests.java:177:54:177:113 | new URI(...) : URI | provenance | MaD:285 | -| SanitizationTests.java:177:74:177:111 | of(...) : List [] : String | SanitizationTests.java:177:62:177:112 | getFromList(...) : String | provenance | MaD:290 | +| SanitizationTests.java:177:62:177:112 | getFromList(...) : String | SanitizationTests.java:177:54:177:113 | new URI(...) : URI | provenance | MaD:290 | +| SanitizationTests.java:177:74:177:111 | of(...) : List [] : String | SanitizationTests.java:177:62:177:112 | getFromList(...) : String | provenance | MaD:295 | | SanitizationTests.java:177:74:177:111 | of(...) : List [] : String | SanitizationTests.java:199:31:199:112 | list : List [] : String | provenance | | -| SanitizationTests.java:177:82:177:110 | getParameter(...) : String | SanitizationTests.java:177:74:177:111 | of(...) : List [] : String | provenance | Src:MaD:277 MaD:289 | +| SanitizationTests.java:177:82:177:110 | getParameter(...) : String | SanitizationTests.java:177:74:177:111 | of(...) : List [] : String | provenance | Src:MaD:280 MaD:294 | | SanitizationTests.java:199:31:199:112 | list : List [] : String | SanitizationTests.java:200:16:200:19 | list : List [] : String | provenance | | -| SanitizationTests.java:200:16:200:19 | list : List [] : String | SanitizationTests.java:200:16:200:26 | get(...) : String | provenance | MaD:290 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:32:39:32:59 | ... + ... | provenance | Src:MaD:277 Sink:MaD:264 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:33:69:33:82 | fooResourceUrl | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:34:73:34:86 | fooResourceUrl | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:35:87:35:100 | fooResourceUrl | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:38:83:38:96 | fooResourceUrl : String | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:40:105:40:118 | fooResourceUrl : String | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:43:35:43:48 | fooResourceUrl | provenance | Src:MaD:277 Sink:MaD:262 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:44:91:44:104 | fooResourceUrl | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:45:95:45:108 | fooResourceUrl | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:46:109:46:122 | fooResourceUrl | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:49:105:49:118 | fooResourceUrl : String | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:51:127:51:140 | fooResourceUrl : String | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:54:34:54:47 | fooResourceUrl | provenance | Src:MaD:277 Sink:MaD:263 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:55:79:55:92 | fooResourceUrl | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:56:83:56:96 | fooResourceUrl | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:57:97:57:110 | fooResourceUrl | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:60:93:60:106 | fooResourceUrl : String | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:62:115:62:128 | fooResourceUrl : String | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:65:39:65:52 | fooResourceUrl | provenance | Src:MaD:277 Sink:MaD:265 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:66:69:66:82 | fooResourceUrl | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:67:73:67:86 | fooResourceUrl | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:68:87:68:100 | fooResourceUrl | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:71:83:71:96 | fooResourceUrl : String | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:73:105:73:118 | fooResourceUrl : String | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:76:41:76:54 | fooResourceUrl | provenance | Src:MaD:277 Sink:MaD:268 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:77:93:77:106 | fooResourceUrl | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:78:97:78:110 | fooResourceUrl | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:79:111:79:124 | fooResourceUrl | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:82:107:82:120 | fooResourceUrl : String | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:84:129:84:142 | fooResourceUrl : String | provenance | Src:MaD:277 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | provenance | Src:MaD:277 | -| SpringSSRF.java:38:83:38:96 | fooResourceUrl : String | SpringSSRF.java:38:69:38:97 | of(...) | provenance | MaD:291 | -| SpringSSRF.java:40:105:40:118 | fooResourceUrl : String | SpringSSRF.java:40:69:40:119 | of(...) | provenance | MaD:292 | -| SpringSSRF.java:49:105:49:118 | fooResourceUrl : String | SpringSSRF.java:49:91:49:119 | of(...) | provenance | MaD:291 | -| SpringSSRF.java:51:127:51:140 | fooResourceUrl : String | SpringSSRF.java:51:91:51:141 | of(...) | provenance | MaD:292 | -| SpringSSRF.java:60:93:60:106 | fooResourceUrl : String | SpringSSRF.java:60:79:60:107 | of(...) | provenance | MaD:291 | -| SpringSSRF.java:62:115:62:128 | fooResourceUrl : String | SpringSSRF.java:62:79:62:129 | of(...) | provenance | MaD:292 | -| SpringSSRF.java:71:83:71:96 | fooResourceUrl : String | SpringSSRF.java:71:69:71:97 | of(...) | provenance | MaD:291 | -| SpringSSRF.java:73:105:73:118 | fooResourceUrl : String | SpringSSRF.java:73:69:73:119 | of(...) | provenance | MaD:292 | -| SpringSSRF.java:82:107:82:120 | fooResourceUrl : String | SpringSSRF.java:82:93:82:121 | of(...) | provenance | MaD:291 | -| SpringSSRF.java:84:129:84:142 | fooResourceUrl : String | SpringSSRF.java:84:93:84:143 | of(...) | provenance | MaD:292 | -| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:87:40:87:62 | new URI(...) | provenance | Config Sink:MaD:269 | -| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:87:40:87:62 | new URI(...) | provenance | MaD:285 Sink:MaD:269 | +| SanitizationTests.java:200:16:200:19 | list : List [] : String | SanitizationTests.java:200:16:200:26 | get(...) : String | provenance | MaD:295 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:32:39:32:59 | ... + ... | provenance | Src:MaD:280 Sink:MaD:267 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:33:69:33:82 | fooResourceUrl | provenance | Src:MaD:280 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:34:73:34:86 | fooResourceUrl | provenance | Src:MaD:280 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:35:87:35:100 | fooResourceUrl | provenance | Src:MaD:280 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:38:83:38:96 | fooResourceUrl : String | provenance | Src:MaD:280 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:40:105:40:118 | fooResourceUrl : String | provenance | Src:MaD:280 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:43:35:43:48 | fooResourceUrl | provenance | Src:MaD:280 Sink:MaD:265 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:44:91:44:104 | fooResourceUrl | provenance | Src:MaD:280 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:45:95:45:108 | fooResourceUrl | provenance | Src:MaD:280 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:46:109:46:122 | fooResourceUrl | provenance | Src:MaD:280 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:49:105:49:118 | fooResourceUrl : String | provenance | Src:MaD:280 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:51:127:51:140 | fooResourceUrl : String | provenance | Src:MaD:280 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:54:34:54:47 | fooResourceUrl | provenance | Src:MaD:280 Sink:MaD:266 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:55:79:55:92 | fooResourceUrl | provenance | Src:MaD:280 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:56:83:56:96 | fooResourceUrl | provenance | Src:MaD:280 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:57:97:57:110 | fooResourceUrl | provenance | Src:MaD:280 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:60:93:60:106 | fooResourceUrl : String | provenance | Src:MaD:280 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:62:115:62:128 | fooResourceUrl : String | provenance | Src:MaD:280 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:65:39:65:52 | fooResourceUrl | provenance | Src:MaD:280 Sink:MaD:268 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:66:69:66:82 | fooResourceUrl | provenance | Src:MaD:280 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:67:73:67:86 | fooResourceUrl | provenance | Src:MaD:280 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:68:87:68:100 | fooResourceUrl | provenance | Src:MaD:280 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:71:83:71:96 | fooResourceUrl : String | provenance | Src:MaD:280 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:73:105:73:118 | fooResourceUrl : String | provenance | Src:MaD:280 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:76:41:76:54 | fooResourceUrl | provenance | Src:MaD:280 Sink:MaD:271 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:77:93:77:106 | fooResourceUrl | provenance | Src:MaD:280 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:78:97:78:110 | fooResourceUrl | provenance | Src:MaD:280 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:79:111:79:124 | fooResourceUrl | provenance | Src:MaD:280 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:82:107:82:120 | fooResourceUrl : String | provenance | Src:MaD:280 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:84:129:84:142 | fooResourceUrl : String | provenance | Src:MaD:280 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | provenance | Src:MaD:280 | +| SpringSSRF.java:38:83:38:96 | fooResourceUrl : String | SpringSSRF.java:38:69:38:97 | of(...) | provenance | MaD:296 | +| SpringSSRF.java:40:105:40:118 | fooResourceUrl : String | SpringSSRF.java:40:69:40:119 | of(...) | provenance | MaD:297 | +| SpringSSRF.java:49:105:49:118 | fooResourceUrl : String | SpringSSRF.java:49:91:49:119 | of(...) | provenance | MaD:296 | +| SpringSSRF.java:51:127:51:140 | fooResourceUrl : String | SpringSSRF.java:51:91:51:141 | of(...) | provenance | MaD:297 | +| SpringSSRF.java:60:93:60:106 | fooResourceUrl : String | SpringSSRF.java:60:79:60:107 | of(...) | provenance | MaD:296 | +| SpringSSRF.java:62:115:62:128 | fooResourceUrl : String | SpringSSRF.java:62:79:62:129 | of(...) | provenance | MaD:297 | +| SpringSSRF.java:71:83:71:96 | fooResourceUrl : String | SpringSSRF.java:71:69:71:97 | of(...) | provenance | MaD:296 | +| SpringSSRF.java:73:105:73:118 | fooResourceUrl : String | SpringSSRF.java:73:69:73:119 | of(...) | provenance | MaD:297 | +| SpringSSRF.java:82:107:82:120 | fooResourceUrl : String | SpringSSRF.java:82:93:82:121 | of(...) | provenance | MaD:296 | +| SpringSSRF.java:84:129:84:142 | fooResourceUrl : String | SpringSSRF.java:84:93:84:143 | of(...) | provenance | MaD:297 | +| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:87:40:87:62 | new URI(...) | provenance | Config Sink:MaD:272 | +| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:87:40:87:62 | new URI(...) | provenance | MaD:290 Sink:MaD:272 | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:88:92:88:105 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:89:96:89:109 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:90:110:90:123 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:93:106:93:119 | fooResourceUrl : String | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:95:128:95:141 | fooResourceUrl : String | provenance | | -| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:98:42:98:55 | fooResourceUrl | provenance | Sink:MaD:270 | +| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:98:42:98:55 | fooResourceUrl | provenance | Sink:MaD:273 | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:99:80:99:93 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:100:84:100:97 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:101:98:101:111 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:104:94:104:107 | fooResourceUrl : String | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:106:116:106:129 | fooResourceUrl : String | provenance | | -| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:109:40:109:53 | fooResourceUrl | provenance | Sink:MaD:271 | +| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:109:40:109:53 | fooResourceUrl | provenance | Sink:MaD:274 | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:110:92:110:105 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:111:96:111:109 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:112:110:112:123 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:115:106:115:119 | fooResourceUrl : String | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:117:128:117:141 | fooResourceUrl : String | provenance | | -| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:120:30:120:43 | fooResourceUrl | provenance | Sink:MaD:272 | +| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:120:30:120:43 | fooResourceUrl | provenance | Sink:MaD:275 | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:121:68:121:81 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:122:72:122:85 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:123:86:123:99 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:126:82:126:95 | fooResourceUrl : String | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:128:104:128:117 | fooResourceUrl : String | provenance | | -| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:131:33:131:46 | fooResourceUrl | provenance | Sink:MaD:261 | +| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:131:33:131:46 | fooResourceUrl | provenance | Sink:MaD:264 | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:132:49:132:62 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:133:53:133:66 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:134:67:134:80 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:137:63:137:76 | fooResourceUrl : String | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:139:85:139:98 | fooResourceUrl : String | provenance | | -| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:142:41:142:54 | fooResourceUrl | provenance | Sink:MaD:266 | +| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:142:41:142:54 | fooResourceUrl | provenance | Sink:MaD:269 | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:143:57:143:70 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:144:61:144:74 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:145:75:145:88 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:148:71:148:84 | fooResourceUrl : String | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:150:93:150:106 | fooResourceUrl : String | provenance | | -| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:153:42:153:55 | fooResourceUrl | provenance | Sink:MaD:267 | +| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:153:42:153:55 | fooResourceUrl | provenance | Sink:MaD:270 | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:154:58:154:71 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:155:62:155:75 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:156:76:156:89 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:159:72:159:85 | fooResourceUrl : String | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:161:94:161:107 | fooResourceUrl : String | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:166:35:166:48 | fooResourceUrl : String | provenance | | -| SpringSSRF.java:93:106:93:119 | fooResourceUrl : String | SpringSSRF.java:93:92:93:120 | of(...) | provenance | MaD:291 | -| SpringSSRF.java:95:128:95:141 | fooResourceUrl : String | SpringSSRF.java:95:92:95:142 | of(...) | provenance | MaD:292 | -| SpringSSRF.java:104:94:104:107 | fooResourceUrl : String | SpringSSRF.java:104:80:104:108 | of(...) | provenance | MaD:291 | -| SpringSSRF.java:106:116:106:129 | fooResourceUrl : String | SpringSSRF.java:106:80:106:130 | of(...) | provenance | MaD:292 | -| SpringSSRF.java:115:106:115:119 | fooResourceUrl : String | SpringSSRF.java:115:92:115:120 | of(...) | provenance | MaD:291 | -| SpringSSRF.java:117:128:117:141 | fooResourceUrl : String | SpringSSRF.java:117:92:117:142 | of(...) | provenance | MaD:292 | -| SpringSSRF.java:126:82:126:95 | fooResourceUrl : String | SpringSSRF.java:126:68:126:96 | of(...) | provenance | MaD:291 | -| SpringSSRF.java:128:104:128:117 | fooResourceUrl : String | SpringSSRF.java:128:68:128:118 | of(...) | provenance | MaD:292 | -| SpringSSRF.java:137:63:137:76 | fooResourceUrl : String | SpringSSRF.java:137:49:137:77 | of(...) | provenance | MaD:291 | -| SpringSSRF.java:139:85:139:98 | fooResourceUrl : String | SpringSSRF.java:139:49:139:99 | of(...) | provenance | MaD:292 | -| SpringSSRF.java:148:71:148:84 | fooResourceUrl : String | SpringSSRF.java:148:57:148:85 | of(...) | provenance | MaD:291 | -| SpringSSRF.java:150:93:150:106 | fooResourceUrl : String | SpringSSRF.java:150:57:150:107 | of(...) | provenance | MaD:292 | -| SpringSSRF.java:159:72:159:85 | fooResourceUrl : String | SpringSSRF.java:159:58:159:86 | of(...) | provenance | MaD:291 | -| SpringSSRF.java:161:94:161:107 | fooResourceUrl : String | SpringSSRF.java:161:58:161:108 | of(...) | provenance | MaD:292 | -| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:168:44:168:46 | uri | provenance | Sink:MaD:255 | -| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:170:35:170:37 | uri | provenance | Sink:MaD:250 | -| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:171:35:171:37 | uri | provenance | Sink:MaD:256 | -| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:172:38:172:40 | uri | provenance | Sink:MaD:249 | -| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:173:39:173:41 | uri | provenance | Sink:MaD:253 | -| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:174:37:174:39 | uri | provenance | Sink:MaD:254 | -| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:175:36:175:38 | uri | provenance | Sink:MaD:251 | -| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:176:44:176:46 | uri | provenance | Sink:MaD:252 | +| SpringSSRF.java:93:106:93:119 | fooResourceUrl : String | SpringSSRF.java:93:92:93:120 | of(...) | provenance | MaD:296 | +| SpringSSRF.java:95:128:95:141 | fooResourceUrl : String | SpringSSRF.java:95:92:95:142 | of(...) | provenance | MaD:297 | +| SpringSSRF.java:104:94:104:107 | fooResourceUrl : String | SpringSSRF.java:104:80:104:108 | of(...) | provenance | MaD:296 | +| SpringSSRF.java:106:116:106:129 | fooResourceUrl : String | SpringSSRF.java:106:80:106:130 | of(...) | provenance | MaD:297 | +| SpringSSRF.java:115:106:115:119 | fooResourceUrl : String | SpringSSRF.java:115:92:115:120 | of(...) | provenance | MaD:296 | +| SpringSSRF.java:117:128:117:141 | fooResourceUrl : String | SpringSSRF.java:117:92:117:142 | of(...) | provenance | MaD:297 | +| SpringSSRF.java:126:82:126:95 | fooResourceUrl : String | SpringSSRF.java:126:68:126:96 | of(...) | provenance | MaD:296 | +| SpringSSRF.java:128:104:128:117 | fooResourceUrl : String | SpringSSRF.java:128:68:128:118 | of(...) | provenance | MaD:297 | +| SpringSSRF.java:137:63:137:76 | fooResourceUrl : String | SpringSSRF.java:137:49:137:77 | of(...) | provenance | MaD:296 | +| SpringSSRF.java:139:85:139:98 | fooResourceUrl : String | SpringSSRF.java:139:49:139:99 | of(...) | provenance | MaD:297 | +| SpringSSRF.java:148:71:148:84 | fooResourceUrl : String | SpringSSRF.java:148:57:148:85 | of(...) | provenance | MaD:296 | +| SpringSSRF.java:150:93:150:106 | fooResourceUrl : String | SpringSSRF.java:150:57:150:107 | of(...) | provenance | MaD:297 | +| SpringSSRF.java:159:72:159:85 | fooResourceUrl : String | SpringSSRF.java:159:58:159:86 | of(...) | provenance | MaD:296 | +| SpringSSRF.java:161:94:161:107 | fooResourceUrl : String | SpringSSRF.java:161:58:161:108 | of(...) | provenance | MaD:297 | +| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:168:44:168:46 | uri | provenance | Sink:MaD:258 | +| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:170:35:170:37 | uri | provenance | Sink:MaD:253 | +| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:171:35:171:37 | uri | provenance | Sink:MaD:259 | +| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:172:38:172:40 | uri | provenance | Sink:MaD:252 | +| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:173:39:173:41 | uri | provenance | Sink:MaD:256 | +| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:174:37:174:39 | uri | provenance | Sink:MaD:257 | +| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:175:36:175:38 | uri | provenance | Sink:MaD:254 | +| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:176:44:176:46 | uri | provenance | Sink:MaD:255 | | SpringSSRF.java:166:35:166:48 | fooResourceUrl : String | SpringSSRF.java:166:27:166:49 | new URI(...) : URI | provenance | Config | -| SpringSSRF.java:166:35:166:48 | fooResourceUrl : String | SpringSSRF.java:166:27:166:49 | new URI(...) : URI | provenance | MaD:285 | +| SpringSSRF.java:166:35:166:48 | fooResourceUrl : String | SpringSSRF.java:166:27:166:49 | new URI(...) : URI | provenance | MaD:290 | | SpringSSRF.java:166:35:166:48 | fooResourceUrl : String | SpringSSRF.java:179:35:179:48 | fooResourceUrl : String | provenance | | -| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:182:49:182:51 | uri | provenance | Sink:MaD:243 | -| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:183:58:183:60 | uri | provenance | Sink:MaD:244 | -| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:184:57:184:59 | uri | provenance | Sink:MaD:245 | -| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:185:66:185:68 | uri | provenance | Sink:MaD:247 | -| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:186:57:186:59 | uri | provenance | Sink:MaD:246 | -| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:187:66:187:68 | uri | provenance | Sink:MaD:248 | +| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:182:49:182:51 | uri | provenance | Sink:MaD:246 | +| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:183:58:183:60 | uri | provenance | Sink:MaD:247 | +| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:184:57:184:59 | uri | provenance | Sink:MaD:248 | +| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:185:66:185:68 | uri | provenance | Sink:MaD:250 | +| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:186:57:186:59 | uri | provenance | Sink:MaD:249 | +| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:187:66:187:68 | uri | provenance | Sink:MaD:251 | | SpringSSRF.java:179:35:179:48 | fooResourceUrl : String | SpringSSRF.java:179:27:179:49 | new URI(...) : URI | provenance | Config | -| SpringSSRF.java:179:35:179:48 | fooResourceUrl : String | SpringSSRF.java:179:27:179:49 | new URI(...) : URI | provenance | MaD:285 | -| URLClassLoaderSSRF.java:16:26:16:52 | getParameter(...) : String | URLClassLoaderSSRF.java:17:31:17:33 | url : String | provenance | Src:MaD:277 | +| SpringSSRF.java:179:35:179:48 | fooResourceUrl : String | SpringSSRF.java:179:27:179:49 | new URI(...) : URI | provenance | MaD:290 | +| URLClassLoaderSSRF.java:16:26:16:52 | getParameter(...) : String | URLClassLoaderSSRF.java:17:31:17:33 | url : String | provenance | Src:MaD:280 | | URLClassLoaderSSRF.java:17:23:17:34 | new URI(...) : URI | URLClassLoaderSSRF.java:18:74:18:76 | uri : URI | provenance | | | URLClassLoaderSSRF.java:17:31:17:33 | url : String | URLClassLoaderSSRF.java:17:23:17:34 | new URI(...) : URI | provenance | Config | -| URLClassLoaderSSRF.java:17:31:17:33 | url : String | URLClassLoaderSSRF.java:17:23:17:34 | new URI(...) : URI | provenance | MaD:285 | -| URLClassLoaderSSRF.java:18:64:18:85 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:18:64:18:85 | new URL[] | provenance | Sink:MaD:13 | -| URLClassLoaderSSRF.java:18:64:18:85 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:18:64:18:85 | new URL[] | provenance | Sink:MaD:13 | -| URLClassLoaderSSRF.java:18:74:18:76 | uri : URI | URLClassLoaderSSRF.java:18:74:18:84 | toURL(...) : URL | provenance | MaD:287 | +| URLClassLoaderSSRF.java:17:31:17:33 | url : String | URLClassLoaderSSRF.java:17:23:17:34 | new URI(...) : URI | provenance | MaD:290 | +| URLClassLoaderSSRF.java:18:64:18:85 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:18:64:18:85 | new URL[] | provenance | Sink:MaD:16 | +| URLClassLoaderSSRF.java:18:64:18:85 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:18:64:18:85 | new URL[] | provenance | Sink:MaD:16 | +| URLClassLoaderSSRF.java:18:74:18:76 | uri : URI | URLClassLoaderSSRF.java:18:74:18:84 | toURL(...) : URL | provenance | MaD:292 | | URLClassLoaderSSRF.java:18:74:18:84 | toURL(...) : URL | URLClassLoaderSSRF.java:18:64:18:85 | {...} : URL[] [[]] : URL | provenance | | -| URLClassLoaderSSRF.java:28:26:28:52 | getParameter(...) : String | URLClassLoaderSSRF.java:29:31:29:33 | url : String | provenance | Src:MaD:277 | +| URLClassLoaderSSRF.java:28:26:28:52 | getParameter(...) : String | URLClassLoaderSSRF.java:29:31:29:33 | url : String | provenance | Src:MaD:280 | | URLClassLoaderSSRF.java:29:23:29:34 | new URI(...) : URI | URLClassLoaderSSRF.java:30:74:30:76 | uri : URI | provenance | | | URLClassLoaderSSRF.java:29:31:29:33 | url : String | URLClassLoaderSSRF.java:29:23:29:34 | new URI(...) : URI | provenance | Config | -| URLClassLoaderSSRF.java:29:31:29:33 | url : String | URLClassLoaderSSRF.java:29:23:29:34 | new URI(...) : URI | provenance | MaD:285 | -| URLClassLoaderSSRF.java:30:64:30:85 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:30:64:30:85 | new URL[] | provenance | Sink:MaD:14 | -| URLClassLoaderSSRF.java:30:64:30:85 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:30:64:30:85 | new URL[] | provenance | Sink:MaD:14 | -| URLClassLoaderSSRF.java:30:74:30:76 | uri : URI | URLClassLoaderSSRF.java:30:74:30:84 | toURL(...) : URL | provenance | MaD:287 | +| URLClassLoaderSSRF.java:29:31:29:33 | url : String | URLClassLoaderSSRF.java:29:23:29:34 | new URI(...) : URI | provenance | MaD:290 | +| URLClassLoaderSSRF.java:30:64:30:85 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:30:64:30:85 | new URL[] | provenance | Sink:MaD:17 | +| URLClassLoaderSSRF.java:30:64:30:85 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:30:64:30:85 | new URL[] | provenance | Sink:MaD:17 | +| URLClassLoaderSSRF.java:30:74:30:76 | uri : URI | URLClassLoaderSSRF.java:30:74:30:84 | toURL(...) : URL | provenance | MaD:292 | | URLClassLoaderSSRF.java:30:74:30:84 | toURL(...) : URL | URLClassLoaderSSRF.java:30:64:30:85 | {...} : URL[] [[]] : URL | provenance | | -| URLClassLoaderSSRF.java:40:26:40:52 | getParameter(...) : String | URLClassLoaderSSRF.java:41:31:41:33 | url : String | provenance | Src:MaD:277 | +| URLClassLoaderSSRF.java:40:26:40:52 | getParameter(...) : String | URLClassLoaderSSRF.java:41:31:41:33 | url : String | provenance | Src:MaD:280 | | URLClassLoaderSSRF.java:41:23:41:34 | new URI(...) : URI | URLClassLoaderSSRF.java:44:74:44:76 | uri : URI | provenance | | | URLClassLoaderSSRF.java:41:31:41:33 | url : String | URLClassLoaderSSRF.java:41:23:41:34 | new URI(...) : URI | provenance | Config | -| URLClassLoaderSSRF.java:41:31:41:33 | url : String | URLClassLoaderSSRF.java:41:23:41:34 | new URI(...) : URI | provenance | MaD:285 | -| URLClassLoaderSSRF.java:44:64:44:85 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:44:64:44:85 | new URL[] | provenance | Sink:MaD:15 | -| URLClassLoaderSSRF.java:44:64:44:85 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:44:64:44:85 | new URL[] | provenance | Sink:MaD:15 | -| URLClassLoaderSSRF.java:44:74:44:76 | uri : URI | URLClassLoaderSSRF.java:44:74:44:84 | toURL(...) : URL | provenance | MaD:287 | +| URLClassLoaderSSRF.java:41:31:41:33 | url : String | URLClassLoaderSSRF.java:41:23:41:34 | new URI(...) : URI | provenance | MaD:290 | +| URLClassLoaderSSRF.java:44:64:44:85 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:44:64:44:85 | new URL[] | provenance | Sink:MaD:18 | +| URLClassLoaderSSRF.java:44:64:44:85 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:44:64:44:85 | new URL[] | provenance | Sink:MaD:18 | +| URLClassLoaderSSRF.java:44:74:44:76 | uri : URI | URLClassLoaderSSRF.java:44:74:44:84 | toURL(...) : URL | provenance | MaD:292 | | URLClassLoaderSSRF.java:44:74:44:84 | toURL(...) : URL | URLClassLoaderSSRF.java:44:64:44:85 | {...} : URL[] [[]] : URL | provenance | | -| URLClassLoaderSSRF.java:54:26:54:52 | getParameter(...) : String | URLClassLoaderSSRF.java:55:31:55:33 | url : String | provenance | Src:MaD:277 | +| URLClassLoaderSSRF.java:54:26:54:52 | getParameter(...) : String | URLClassLoaderSSRF.java:55:31:55:33 | url : String | provenance | Src:MaD:280 | | URLClassLoaderSSRF.java:55:23:55:34 | new URI(...) : URI | URLClassLoaderSSRF.java:56:82:56:84 | uri : URI | provenance | | | URLClassLoaderSSRF.java:55:31:55:33 | url : String | URLClassLoaderSSRF.java:55:23:55:34 | new URI(...) : URI | provenance | Config | -| URLClassLoaderSSRF.java:55:31:55:33 | url : String | URLClassLoaderSSRF.java:55:23:55:34 | new URI(...) : URI | provenance | MaD:285 | -| URLClassLoaderSSRF.java:56:72:56:93 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:56:72:56:93 | new URL[] | provenance | Sink:MaD:16 | -| URLClassLoaderSSRF.java:56:82:56:84 | uri : URI | URLClassLoaderSSRF.java:56:82:56:92 | toURL(...) : URL | provenance | MaD:287 | +| URLClassLoaderSSRF.java:55:31:55:33 | url : String | URLClassLoaderSSRF.java:55:23:55:34 | new URI(...) : URI | provenance | MaD:290 | +| URLClassLoaderSSRF.java:56:72:56:93 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:56:72:56:93 | new URL[] | provenance | Sink:MaD:19 | +| URLClassLoaderSSRF.java:56:82:56:84 | uri : URI | URLClassLoaderSSRF.java:56:82:56:92 | toURL(...) : URL | provenance | MaD:292 | | URLClassLoaderSSRF.java:56:82:56:92 | toURL(...) : URL | URLClassLoaderSSRF.java:56:72:56:93 | {...} : URL[] [[]] : URL | provenance | | -| URLClassLoaderSSRF.java:66:26:66:52 | getParameter(...) : String | URLClassLoaderSSRF.java:67:31:67:33 | url : String | provenance | Src:MaD:277 | +| URLClassLoaderSSRF.java:66:26:66:52 | getParameter(...) : String | URLClassLoaderSSRF.java:67:31:67:33 | url : String | provenance | Src:MaD:280 | | URLClassLoaderSSRF.java:67:23:67:34 | new URI(...) : URI | URLClassLoaderSSRF.java:70:31:70:33 | uri : URI | provenance | | | URLClassLoaderSSRF.java:67:31:67:33 | url : String | URLClassLoaderSSRF.java:67:23:67:34 | new URI(...) : URI | provenance | Config | -| URLClassLoaderSSRF.java:67:31:67:33 | url : String | URLClassLoaderSSRF.java:67:23:67:34 | new URI(...) : URI | provenance | MaD:285 | -| URLClassLoaderSSRF.java:70:21:70:42 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:70:21:70:42 | new URL[] | provenance | Sink:MaD:11 | -| URLClassLoaderSSRF.java:70:21:70:42 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:70:21:70:42 | new URL[] | provenance | Sink:MaD:11 | -| URLClassLoaderSSRF.java:70:31:70:33 | uri : URI | URLClassLoaderSSRF.java:70:31:70:41 | toURL(...) : URL | provenance | MaD:287 | +| URLClassLoaderSSRF.java:67:31:67:33 | url : String | URLClassLoaderSSRF.java:67:23:67:34 | new URI(...) : URI | provenance | MaD:290 | +| URLClassLoaderSSRF.java:70:21:70:42 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:70:21:70:42 | new URL[] | provenance | Sink:MaD:14 | +| URLClassLoaderSSRF.java:70:21:70:42 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:70:21:70:42 | new URL[] | provenance | Sink:MaD:14 | +| URLClassLoaderSSRF.java:70:31:70:33 | uri : URI | URLClassLoaderSSRF.java:70:31:70:41 | toURL(...) : URL | provenance | MaD:292 | | URLClassLoaderSSRF.java:70:31:70:41 | toURL(...) : URL | URLClassLoaderSSRF.java:70:21:70:42 | {...} : URL[] [[]] : URL | provenance | | -| URLClassLoaderSSRF.java:83:26:83:52 | getParameter(...) : String | URLClassLoaderSSRF.java:84:31:84:33 | url : String | provenance | Src:MaD:277 | +| URLClassLoaderSSRF.java:83:26:83:52 | getParameter(...) : String | URLClassLoaderSSRF.java:84:31:84:33 | url : String | provenance | Src:MaD:280 | | URLClassLoaderSSRF.java:84:23:84:34 | new URI(...) : URI | URLClassLoaderSSRF.java:89:31:89:33 | uri : URI | provenance | | | URLClassLoaderSSRF.java:84:31:84:33 | url : String | URLClassLoaderSSRF.java:84:23:84:34 | new URI(...) : URI | provenance | Config | -| URLClassLoaderSSRF.java:84:31:84:33 | url : String | URLClassLoaderSSRF.java:84:23:84:34 | new URI(...) : URI | provenance | MaD:285 | -| URLClassLoaderSSRF.java:89:21:89:42 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:89:21:89:42 | new URL[] | provenance | Sink:MaD:12 | -| URLClassLoaderSSRF.java:89:21:89:42 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:89:21:89:42 | new URL[] | provenance | Sink:MaD:12 | -| URLClassLoaderSSRF.java:89:31:89:33 | uri : URI | URLClassLoaderSSRF.java:89:31:89:41 | toURL(...) : URL | provenance | MaD:287 | +| URLClassLoaderSSRF.java:84:31:84:33 | url : String | URLClassLoaderSSRF.java:84:23:84:34 | new URI(...) : URI | provenance | MaD:290 | +| URLClassLoaderSSRF.java:89:21:89:42 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:89:21:89:42 | new URL[] | provenance | Sink:MaD:15 | +| URLClassLoaderSSRF.java:89:21:89:42 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:89:21:89:42 | new URL[] | provenance | Sink:MaD:15 | +| URLClassLoaderSSRF.java:89:31:89:33 | uri : URI | URLClassLoaderSSRF.java:89:31:89:41 | toURL(...) : URL | provenance | MaD:292 | | URLClassLoaderSSRF.java:89:31:89:41 | toURL(...) : URL | URLClassLoaderSSRF.java:89:21:89:42 | {...} : URL[] [[]] : URL | provenance | | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:31:40:31:47 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:36:16:36:23 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:38:36:38:43 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:40:16:40:23 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:45:40:45:47 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:47:40:47:47 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:49:36:49:43 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:51:36:51:43 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:53:36:53:43 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:55:44:55:51 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:57:38:57:45 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:59:44:59:51 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:61:53:61:60 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:63:32:63:39 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:65:44:65:51 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:67:32:67:39 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:69:33:69:40 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:71:53:71:60 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:74:58:74:65 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:76:62:76:69 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:78:52:78:59 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:80:34:80:41 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:82:40:82:47 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:84:40:84:47 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:86:50:86:57 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:92:33:92:40 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:97:35:97:42 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:102:32:102:39 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:107:24:107:31 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:112:24:112:31 | source(...) : String | provenance | Src:MaD:277 | -| mad/Test.java:31:40:31:47 | source(...) : String | mad/Test.java:31:24:31:47 | (...)... | provenance | Sink:MaD:7 | -| mad/Test.java:36:16:36:23 | source(...) : String | mad/Test.java:36:10:36:23 | (...)... | provenance | Sink:MaD:9 | -| mad/Test.java:38:36:38:43 | source(...) : String | mad/Test.java:38:28:38:43 | (...)... | provenance | Sink:MaD:8 | -| mad/Test.java:40:16:40:23 | source(...) : String | mad/Test.java:40:10:40:23 | (...)... | provenance | Sink:MaD:10 | -| mad/Test.java:45:40:45:47 | source(...) : String | mad/Test.java:45:32:45:47 | (...)... | provenance | Sink:MaD:11 | -| mad/Test.java:45:40:45:47 | source(...) : String | mad/Test.java:45:32:45:47 | (...)... | provenance | Sink:MaD:11 | -| mad/Test.java:47:40:47:47 | source(...) : String | mad/Test.java:47:32:47:47 | (...)... | provenance | Sink:MaD:12 | -| mad/Test.java:47:40:47:47 | source(...) : String | mad/Test.java:47:32:47:47 | (...)... | provenance | Sink:MaD:12 | -| mad/Test.java:49:36:49:43 | source(...) : String | mad/Test.java:49:28:49:43 | (...)... | provenance | Sink:MaD:13 | -| mad/Test.java:49:36:49:43 | source(...) : String | mad/Test.java:49:28:49:43 | (...)... | provenance | Sink:MaD:13 | -| mad/Test.java:51:36:51:43 | source(...) : String | mad/Test.java:51:28:51:43 | (...)... | provenance | Sink:MaD:14 | -| mad/Test.java:51:36:51:43 | source(...) : String | mad/Test.java:51:28:51:43 | (...)... | provenance | Sink:MaD:14 | -| mad/Test.java:53:36:53:43 | source(...) : String | mad/Test.java:53:28:53:43 | (...)... | provenance | Sink:MaD:15 | -| mad/Test.java:53:36:53:43 | source(...) : String | mad/Test.java:53:28:53:43 | (...)... | provenance | Sink:MaD:15 | -| mad/Test.java:55:44:55:51 | source(...) : String | mad/Test.java:55:36:55:51 | (...)... | provenance | Sink:MaD:16 | -| mad/Test.java:57:38:57:45 | source(...) : String | mad/Test.java:57:32:57:45 | (...)... | provenance | Sink:MaD:25 | -| mad/Test.java:59:44:59:51 | source(...) : String | mad/Test.java:59:38:59:51 | (...)... | provenance | Sink:MaD:26 | -| mad/Test.java:61:53:61:60 | source(...) : String | mad/Test.java:61:47:61:60 | (...)... | provenance | Sink:MaD:24 | -| mad/Test.java:63:32:63:39 | source(...) : String | mad/Test.java:63:26:63:39 | (...)... | provenance | Sink:MaD:28 | -| mad/Test.java:65:44:65:51 | source(...) : String | mad/Test.java:65:38:65:51 | (...)... | provenance | Sink:MaD:29 | -| mad/Test.java:67:32:67:39 | source(...) : String | mad/Test.java:67:26:67:39 | (...)... | provenance | Sink:MaD:27 | -| mad/Test.java:69:33:69:40 | source(...) : String | mad/Test.java:69:27:69:40 | (...)... | provenance | Sink:MaD:22 | -| mad/Test.java:71:53:71:60 | source(...) : String | mad/Test.java:71:47:71:60 | (...)... | provenance | Sink:MaD:30 | -| mad/Test.java:74:58:74:65 | source(...) : String | mad/Test.java:74:50:74:65 | (...)... | provenance | Sink:MaD:32 | -| mad/Test.java:76:62:76:69 | source(...) : String | mad/Test.java:76:50:76:69 | (...)... | provenance | Sink:MaD:31 | -| mad/Test.java:78:52:78:59 | source(...) : String | mad/Test.java:78:43:78:59 | (...)... | provenance | Sink:MaD:33 | -| mad/Test.java:80:34:80:41 | source(...) : String | mad/Test.java:80:25:80:41 | (...)... | provenance | Sink:MaD:34 | -| mad/Test.java:82:40:82:47 | source(...) : String | mad/Test.java:82:31:82:47 | (...)... | provenance | Sink:MaD:35 | -| mad/Test.java:84:40:84:47 | source(...) : String | mad/Test.java:84:31:84:47 | (...)... | provenance | Sink:MaD:36 | -| mad/Test.java:86:50:86:57 | source(...) : String | mad/Test.java:86:41:86:57 | (...)... | provenance | Sink:MaD:37 | -| mad/Test.java:92:33:92:40 | source(...) : String | mad/Test.java:92:24:92:40 | (...)... | provenance | Sink:MaD:21 | -| mad/Test.java:97:35:97:42 | source(...) : String | mad/Test.java:97:29:97:42 | (...)... | provenance | Sink:MaD:234 | -| mad/Test.java:102:32:102:39 | source(...) : String | mad/Test.java:102:26:102:39 | (...)... | provenance | Sink:MaD:241 | -| mad/Test.java:107:24:107:31 | source(...) : String | mad/Test.java:107:15:107:31 | (...)... | provenance | Sink:MaD:276 | -| mad/Test.java:112:24:112:31 | source(...) : String | mad/Test.java:112:15:112:31 | (...)... | provenance | Sink:MaD:275 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:31:40:31:47 | source(...) : String | provenance | Src:MaD:280 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:36:16:36:23 | source(...) : String | provenance | Src:MaD:280 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:38:36:38:43 | source(...) : String | provenance | Src:MaD:280 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:40:16:40:23 | source(...) : String | provenance | Src:MaD:280 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:45:40:45:47 | source(...) : String | provenance | Src:MaD:280 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:47:40:47:47 | source(...) : String | provenance | Src:MaD:280 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:49:36:49:43 | source(...) : String | provenance | Src:MaD:280 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:51:36:51:43 | source(...) : String | provenance | Src:MaD:280 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:53:36:53:43 | source(...) : String | provenance | Src:MaD:280 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:55:44:55:51 | source(...) : String | provenance | Src:MaD:280 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:57:38:57:45 | source(...) : String | provenance | Src:MaD:280 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:59:44:59:51 | source(...) : String | provenance | Src:MaD:280 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:61:53:61:60 | source(...) : String | provenance | Src:MaD:280 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:63:32:63:39 | source(...) : String | provenance | Src:MaD:280 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:65:44:65:51 | source(...) : String | provenance | Src:MaD:280 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:67:32:67:39 | source(...) : String | provenance | Src:MaD:280 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:69:33:69:40 | source(...) : String | provenance | Src:MaD:280 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:71:53:71:60 | source(...) : String | provenance | Src:MaD:280 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:74:58:74:65 | source(...) : String | provenance | Src:MaD:280 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:76:62:76:69 | source(...) : String | provenance | Src:MaD:280 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:78:52:78:59 | source(...) : String | provenance | Src:MaD:280 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:80:34:80:41 | source(...) : String | provenance | Src:MaD:280 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:82:40:82:47 | source(...) : String | provenance | Src:MaD:280 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:84:40:84:47 | source(...) : String | provenance | Src:MaD:280 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:86:50:86:57 | source(...) : String | provenance | Src:MaD:280 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:92:33:92:40 | source(...) : String | provenance | Src:MaD:280 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:97:35:97:42 | source(...) : String | provenance | Src:MaD:280 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:102:32:102:39 | source(...) : String | provenance | Src:MaD:280 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:107:24:107:31 | source(...) : String | provenance | Src:MaD:280 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:112:24:112:31 | source(...) : String | provenance | Src:MaD:280 | +| mad/Test.java:31:40:31:47 | source(...) : String | mad/Test.java:31:24:31:47 | (...)... | provenance | Sink:MaD:10 | +| mad/Test.java:36:16:36:23 | source(...) : String | mad/Test.java:36:10:36:23 | (...)... | provenance | Sink:MaD:12 | +| mad/Test.java:38:36:38:43 | source(...) : String | mad/Test.java:38:28:38:43 | (...)... | provenance | Sink:MaD:11 | +| mad/Test.java:40:16:40:23 | source(...) : String | mad/Test.java:40:10:40:23 | (...)... | provenance | Sink:MaD:13 | +| mad/Test.java:45:40:45:47 | source(...) : String | mad/Test.java:45:32:45:47 | (...)... | provenance | Sink:MaD:14 | +| mad/Test.java:45:40:45:47 | source(...) : String | mad/Test.java:45:32:45:47 | (...)... | provenance | Sink:MaD:14 | +| mad/Test.java:47:40:47:47 | source(...) : String | mad/Test.java:47:32:47:47 | (...)... | provenance | Sink:MaD:15 | +| mad/Test.java:47:40:47:47 | source(...) : String | mad/Test.java:47:32:47:47 | (...)... | provenance | Sink:MaD:15 | +| mad/Test.java:49:36:49:43 | source(...) : String | mad/Test.java:49:28:49:43 | (...)... | provenance | Sink:MaD:16 | +| mad/Test.java:49:36:49:43 | source(...) : String | mad/Test.java:49:28:49:43 | (...)... | provenance | Sink:MaD:16 | +| mad/Test.java:51:36:51:43 | source(...) : String | mad/Test.java:51:28:51:43 | (...)... | provenance | Sink:MaD:17 | +| mad/Test.java:51:36:51:43 | source(...) : String | mad/Test.java:51:28:51:43 | (...)... | provenance | Sink:MaD:17 | +| mad/Test.java:53:36:53:43 | source(...) : String | mad/Test.java:53:28:53:43 | (...)... | provenance | Sink:MaD:18 | +| mad/Test.java:53:36:53:43 | source(...) : String | mad/Test.java:53:28:53:43 | (...)... | provenance | Sink:MaD:18 | +| mad/Test.java:55:44:55:51 | source(...) : String | mad/Test.java:55:36:55:51 | (...)... | provenance | Sink:MaD:19 | +| mad/Test.java:57:38:57:45 | source(...) : String | mad/Test.java:57:32:57:45 | (...)... | provenance | Sink:MaD:28 | +| mad/Test.java:59:44:59:51 | source(...) : String | mad/Test.java:59:38:59:51 | (...)... | provenance | Sink:MaD:29 | +| mad/Test.java:61:53:61:60 | source(...) : String | mad/Test.java:61:47:61:60 | (...)... | provenance | Sink:MaD:27 | +| mad/Test.java:63:32:63:39 | source(...) : String | mad/Test.java:63:26:63:39 | (...)... | provenance | Sink:MaD:31 | +| mad/Test.java:65:44:65:51 | source(...) : String | mad/Test.java:65:38:65:51 | (...)... | provenance | Sink:MaD:32 | +| mad/Test.java:67:32:67:39 | source(...) : String | mad/Test.java:67:26:67:39 | (...)... | provenance | Sink:MaD:30 | +| mad/Test.java:69:33:69:40 | source(...) : String | mad/Test.java:69:27:69:40 | (...)... | provenance | Sink:MaD:25 | +| mad/Test.java:71:53:71:60 | source(...) : String | mad/Test.java:71:47:71:60 | (...)... | provenance | Sink:MaD:33 | +| mad/Test.java:74:58:74:65 | source(...) : String | mad/Test.java:74:50:74:65 | (...)... | provenance | Sink:MaD:35 | +| mad/Test.java:76:62:76:69 | source(...) : String | mad/Test.java:76:50:76:69 | (...)... | provenance | Sink:MaD:34 | +| mad/Test.java:78:52:78:59 | source(...) : String | mad/Test.java:78:43:78:59 | (...)... | provenance | Sink:MaD:36 | +| mad/Test.java:80:34:80:41 | source(...) : String | mad/Test.java:80:25:80:41 | (...)... | provenance | Sink:MaD:37 | +| mad/Test.java:82:40:82:47 | source(...) : String | mad/Test.java:82:31:82:47 | (...)... | provenance | Sink:MaD:38 | +| mad/Test.java:84:40:84:47 | source(...) : String | mad/Test.java:84:31:84:47 | (...)... | provenance | Sink:MaD:39 | +| mad/Test.java:86:50:86:57 | source(...) : String | mad/Test.java:86:41:86:57 | (...)... | provenance | Sink:MaD:40 | +| mad/Test.java:92:33:92:40 | source(...) : String | mad/Test.java:92:24:92:40 | (...)... | provenance | Sink:MaD:24 | +| mad/Test.java:97:35:97:42 | source(...) : String | mad/Test.java:97:29:97:42 | (...)... | provenance | Sink:MaD:237 | +| mad/Test.java:102:32:102:39 | source(...) : String | mad/Test.java:102:26:102:39 | (...)... | provenance | Sink:MaD:244 | +| mad/Test.java:107:24:107:31 | source(...) : String | mad/Test.java:107:15:107:31 | (...)... | provenance | Sink:MaD:279 | +| mad/Test.java:112:24:112:31 | source(...) : String | mad/Test.java:112:15:112:31 | (...)... | provenance | Sink:MaD:278 | models | 1 | Sink: com.zaxxer.hikari; HikariConfig; false; HikariConfig; (Properties); ; Argument[0]; request-forgery; manual | | 2 | Sink: com.zaxxer.hikari; HikariConfig; false; setJdbcUrl; (String); ; Argument[0]; request-forgery; manual | -| 3 | Sink: jakarta.ws.rs.client; Client; true; target; ; ; Argument[0]; request-forgery; manual | -| 4 | Sink: java.net.http; HttpClient; true; send; (HttpRequest,HttpResponse$BodyHandler); ; Argument[0]; request-forgery; ai-manual | -| 5 | Sink: java.net.http; HttpRequest$Builder; false; uri; ; ; Argument[0]; request-forgery; manual | -| 6 | Sink: java.net.http; HttpRequest; false; newBuilder; ; ; Argument[0]; request-forgery; manual | -| 7 | Sink: java.net; DatagramSocket; true; connect; (SocketAddress); ; Argument[0]; request-forgery; ai-manual | -| 8 | Sink: java.net; URL; false; openConnection; (Proxy); ; Argument[0]; request-forgery; ai-manual | -| 9 | Sink: java.net; URL; false; openConnection; ; ; Argument[this]; request-forgery; manual | -| 10 | Sink: java.net; URL; false; openStream; ; ; Argument[this]; request-forgery; manual | -| 11 | Sink: java.net; URLClassLoader; false; URLClassLoader; (String,URL[],ClassLoader); ; Argument[1]; request-forgery; manual | -| 12 | Sink: java.net; URLClassLoader; false; URLClassLoader; (String,URL[],ClassLoader,URLStreamHandlerFactory); ; Argument[1]; request-forgery; manual | -| 13 | Sink: java.net; URLClassLoader; false; URLClassLoader; (URL[]); ; Argument[0]; request-forgery; manual | -| 14 | Sink: java.net; URLClassLoader; false; URLClassLoader; (URL[],ClassLoader); ; Argument[0]; request-forgery; manual | -| 15 | Sink: java.net; URLClassLoader; false; URLClassLoader; (URL[],ClassLoader,URLStreamHandlerFactory); ; Argument[0]; request-forgery; manual | -| 16 | Sink: java.net; URLClassLoader; false; newInstance; ; ; Argument[0]; request-forgery; manual | -| 17 | Sink: java.sql; Driver; false; connect; (String,Properties); ; Argument[0]; request-forgery; manual | -| 18 | Sink: java.sql; DriverManager; false; getConnection; (String); ; Argument[0]; request-forgery; manual | -| 19 | Sink: java.sql; DriverManager; false; getConnection; (String,Properties); ; Argument[0]; request-forgery; manual | -| 20 | Sink: java.sql; DriverManager; false; getConnection; (String,String,String); ; Argument[0]; request-forgery; manual | -| 21 | Sink: javafx.scene.web; WebEngine; false; load; (String); ; Argument[0]; request-forgery; ai-manual | -| 22 | Sink: javax.activation; URLDataSource; true; URLDataSource; ; ; Argument[0]; request-forgery; manual | -| 23 | Sink: javax.ws.rs.client; Client; true; target; ; ; Argument[0]; request-forgery; manual | -| 24 | Sink: org.apache.commons.jelly; JellyContext; true; JellyContext; (JellyContext,URL); ; Argument[1]; request-forgery; ai-manual | -| 25 | Sink: org.apache.commons.jelly; JellyContext; true; JellyContext; (JellyContext,URL,URL); ; Argument[1]; request-forgery; ai-manual | -| 26 | Sink: org.apache.commons.jelly; JellyContext; true; JellyContext; (JellyContext,URL,URL); ; Argument[2]; request-forgery; ai-manual | -| 27 | Sink: org.apache.commons.jelly; JellyContext; true; JellyContext; (URL); ; Argument[0]; request-forgery; ai-manual | -| 28 | Sink: org.apache.commons.jelly; JellyContext; true; JellyContext; (URL,URL); ; Argument[0]; request-forgery; ai-manual | -| 29 | Sink: org.apache.commons.jelly; JellyContext; true; JellyContext; (URL,URL); ; Argument[1]; request-forgery; ai-manual | -| 30 | Sink: org.apache.cxf.catalog; OASISCatalogManager; true; loadCatalog; (URL); ; Argument[0]; request-forgery; manual | -| 31 | Sink: org.apache.cxf.common.classloader; ClassLoaderUtils; true; getURLClassLoader; (List,ClassLoader); ; Argument[0]; request-forgery; manual | -| 32 | Sink: org.apache.cxf.common.classloader; ClassLoaderUtils; true; getURLClassLoader; (URL[],ClassLoader); ; Argument[0]; request-forgery; manual | -| 33 | Sink: org.apache.cxf.resource; ExtendedURIResolver; true; resolve; (String,String); ; Argument[0]; request-forgery; manual | -| 34 | Sink: org.apache.cxf.resource; URIResolver; true; URIResolver; (String); ; Argument[0]; request-forgery; manual | -| 35 | Sink: org.apache.cxf.resource; URIResolver; true; URIResolver; (String,String); ; Argument[1]; request-forgery; manual | -| 36 | Sink: org.apache.cxf.resource; URIResolver; true; URIResolver; (String,String,Class); ; Argument[1]; request-forgery; manual | -| 37 | Sink: org.apache.cxf.resource; URIResolver; true; resolve; (String,String,Class); ; Argument[1]; request-forgery; manual | -| 38 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; create; (Method,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | -| 39 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; create; (Method,String); ; Argument[1]; request-forgery; hq-manual | -| 40 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; create; (Method,URI); ; Argument[1]; request-forgery; hq-manual | -| 41 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; create; (String,String); ; Argument[1]; request-forgery; hq-manual | -| 42 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; create; (String,URI); ; Argument[1]; request-forgery; hq-manual | -| 43 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; delete; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 44 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; delete; (String); ; Argument[0]; request-forgery; hq-manual | -| 45 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; delete; (URI); ; Argument[0]; request-forgery; hq-manual | -| 46 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; get; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 47 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; get; (String); ; Argument[0]; request-forgery; hq-manual | -| 48 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; get; (URI); ; Argument[0]; request-forgery; hq-manual | -| 49 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; head; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 50 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; head; (String); ; Argument[0]; request-forgery; hq-manual | -| 51 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; head; (URI); ; Argument[0]; request-forgery; hq-manual | -| 52 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; options; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 53 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; options; (String); ; Argument[0]; request-forgery; hq-manual | -| 54 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; options; (URI); ; Argument[0]; request-forgery; hq-manual | -| 55 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; patch; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 56 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; patch; (String); ; Argument[0]; request-forgery; hq-manual | -| 57 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; patch; (URI); ; Argument[0]; request-forgery; hq-manual | -| 58 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; post; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 59 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; post; (String); ; Argument[0]; request-forgery; hq-manual | -| 60 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; post; (URI); ; Argument[0]; request-forgery; hq-manual | -| 61 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; put; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 62 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; put; (String); ; Argument[0]; request-forgery; hq-manual | -| 63 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; put; (URI); ; Argument[0]; request-forgery; hq-manual | -| 64 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; trace; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 65 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; trace; (String); ; Argument[0]; request-forgery; hq-manual | -| 66 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; trace; (URI); ; Argument[0]; request-forgery; hq-manual | -| 67 | Sink: org.apache.hc.client5.http.async.methods; ConfigurableHttpRequest; true; ConfigurableHttpRequest; (String,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | -| 68 | Sink: org.apache.hc.client5.http.async.methods; ConfigurableHttpRequest; true; ConfigurableHttpRequest; (String,URI); ; Argument[1]; request-forgery; hq-manual | -| 69 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; SimpleHttpRequest; (Method,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | -| 70 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; SimpleHttpRequest; (Method,URI); ; Argument[1]; request-forgery; hq-manual | -| 71 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; SimpleHttpRequest; (String,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | -| 72 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; SimpleHttpRequest; (String,URI); ; Argument[1]; request-forgery; hq-manual | -| 73 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; create; (Method,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | -| 74 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; create; (Method,URI); ; Argument[1]; request-forgery; hq-manual | -| 75 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; create; (String,String); ; Argument[1]; request-forgery; hq-manual | -| 76 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; create; (String,URI); ; Argument[1]; request-forgery; hq-manual | -| 77 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; create; (Method,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | -| 78 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; create; (Method,String); ; Argument[1]; request-forgery; hq-manual | -| 79 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; create; (Method,URI); ; Argument[1]; request-forgery; hq-manual | -| 80 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; create; (String,String); ; Argument[1]; request-forgery; hq-manual | -| 81 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; create; (String,URI); ; Argument[1]; request-forgery; hq-manual | -| 82 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; delete; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 83 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; delete; (String); ; Argument[0]; request-forgery; hq-manual | -| 84 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; delete; (URI); ; Argument[0]; request-forgery; hq-manual | -| 85 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; get; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 86 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; get; (String); ; Argument[0]; request-forgery; hq-manual | -| 87 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; get; (URI); ; Argument[0]; request-forgery; hq-manual | -| 88 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; head; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 89 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; head; (String); ; Argument[0]; request-forgery; hq-manual | -| 90 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; head; (URI); ; Argument[0]; request-forgery; hq-manual | -| 91 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; options; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 92 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; options; (String); ; Argument[0]; request-forgery; hq-manual | -| 93 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; options; (URI); ; Argument[0]; request-forgery; hq-manual | -| 94 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; patch; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 95 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; patch; (String); ; Argument[0]; request-forgery; hq-manual | -| 96 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; patch; (URI); ; Argument[0]; request-forgery; hq-manual | -| 97 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; post; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 98 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; post; (String); ; Argument[0]; request-forgery; hq-manual | -| 99 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; post; (URI); ; Argument[0]; request-forgery; hq-manual | -| 100 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; put; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 101 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; put; (String); ; Argument[0]; request-forgery; hq-manual | -| 102 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; put; (URI); ; Argument[0]; request-forgery; hq-manual | -| 103 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; trace; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 104 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; trace; (String); ; Argument[0]; request-forgery; hq-manual | -| 105 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; trace; (URI); ; Argument[0]; request-forgery; hq-manual | -| 106 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; delete; (String); ; Argument[0]; request-forgery; hq-manual | -| 107 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; delete; (URI); ; Argument[0]; request-forgery; hq-manual | -| 108 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; get; (String); ; Argument[0]; request-forgery; hq-manual | -| 109 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; get; (URI); ; Argument[0]; request-forgery; hq-manual | -| 110 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; head; (String); ; Argument[0]; request-forgery; hq-manual | -| 111 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; head; (URI); ; Argument[0]; request-forgery; hq-manual | -| 112 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; options; (String); ; Argument[0]; request-forgery; hq-manual | -| 113 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; options; (URI); ; Argument[0]; request-forgery; hq-manual | -| 114 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; patch; (String); ; Argument[0]; request-forgery; hq-manual | -| 115 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; patch; (URI); ; Argument[0]; request-forgery; hq-manual | -| 116 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; post; (String); ; Argument[0]; request-forgery; hq-manual | -| 117 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; post; (URI); ; Argument[0]; request-forgery; hq-manual | -| 118 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; put; (String); ; Argument[0]; request-forgery; hq-manual | -| 119 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; put; (URI); ; Argument[0]; request-forgery; hq-manual | -| 120 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; trace; (String); ; Argument[0]; request-forgery; hq-manual | -| 121 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; trace; (URI); ; Argument[0]; request-forgery; hq-manual | -| 122 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; create; (Method,String); ; Argument[1]; request-forgery; hq-manual | -| 123 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; create; (Method,URI); ; Argument[1]; request-forgery; hq-manual | -| 124 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; create; (String,String); ; Argument[1]; request-forgery; hq-manual | -| 125 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; create; (String,URI); ; Argument[1]; request-forgery; hq-manual | -| 126 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; delete; (String); ; Argument[0]; request-forgery; hq-manual | -| 127 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; delete; (URI); ; Argument[0]; request-forgery; hq-manual | -| 128 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; get; (String); ; Argument[0]; request-forgery; hq-manual | -| 129 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; get; (URI); ; Argument[0]; request-forgery; hq-manual | -| 130 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; head; (String); ; Argument[0]; request-forgery; hq-manual | -| 131 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; head; (URI); ; Argument[0]; request-forgery; hq-manual | -| 132 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; options; (String); ; Argument[0]; request-forgery; hq-manual | -| 133 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; options; (URI); ; Argument[0]; request-forgery; hq-manual | -| 134 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; patch; (String); ; Argument[0]; request-forgery; hq-manual | -| 135 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; patch; (URI); ; Argument[0]; request-forgery; hq-manual | -| 136 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; post; (String); ; Argument[0]; request-forgery; hq-manual | -| 137 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; post; (URI); ; Argument[0]; request-forgery; hq-manual | -| 138 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; put; (String); ; Argument[0]; request-forgery; hq-manual | -| 139 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; put; (URI); ; Argument[0]; request-forgery; hq-manual | -| 140 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; trace; (String); ; Argument[0]; request-forgery; hq-manual | -| 141 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; trace; (URI); ; Argument[0]; request-forgery; hq-manual | -| 142 | Sink: org.apache.hc.client5.http.classic.methods; HttpDelete; true; HttpDelete; (String); ; Argument[0]; request-forgery; hq-manual | -| 143 | Sink: org.apache.hc.client5.http.classic.methods; HttpDelete; true; HttpDelete; (URI); ; Argument[0]; request-forgery; hq-manual | -| 144 | Sink: org.apache.hc.client5.http.classic.methods; HttpGet; true; HttpGet; (String); ; Argument[0]; request-forgery; hq-manual | -| 145 | Sink: org.apache.hc.client5.http.classic.methods; HttpGet; true; HttpGet; (URI); ; Argument[0]; request-forgery; hq-manual | -| 146 | Sink: org.apache.hc.client5.http.classic.methods; HttpHead; true; HttpHead; (String); ; Argument[0]; request-forgery; hq-manual | -| 147 | Sink: org.apache.hc.client5.http.classic.methods; HttpHead; true; HttpHead; (URI); ; Argument[0]; request-forgery; hq-manual | -| 148 | Sink: org.apache.hc.client5.http.classic.methods; HttpOptions; true; HttpOptions; (String); ; Argument[0]; request-forgery; hq-manual | -| 149 | Sink: org.apache.hc.client5.http.classic.methods; HttpOptions; true; HttpOptions; (URI); ; Argument[0]; request-forgery; hq-manual | -| 150 | Sink: org.apache.hc.client5.http.classic.methods; HttpPatch; true; HttpPatch; (String); ; Argument[0]; request-forgery; hq-manual | -| 151 | Sink: org.apache.hc.client5.http.classic.methods; HttpPatch; true; HttpPatch; (URI); ; Argument[0]; request-forgery; hq-manual | -| 152 | Sink: org.apache.hc.client5.http.classic.methods; HttpPost; true; HttpPost; (String); ; Argument[0]; request-forgery; hq-manual | -| 153 | Sink: org.apache.hc.client5.http.classic.methods; HttpPost; true; HttpPost; (URI); ; Argument[0]; request-forgery; hq-manual | -| 154 | Sink: org.apache.hc.client5.http.classic.methods; HttpPut; true; HttpPut; (String); ; Argument[0]; request-forgery; hq-manual | -| 155 | Sink: org.apache.hc.client5.http.classic.methods; HttpPut; true; HttpPut; (URI); ; Argument[0]; request-forgery; hq-manual | -| 156 | Sink: org.apache.hc.client5.http.classic.methods; HttpTrace; true; HttpTrace; (String); ; Argument[0]; request-forgery; hq-manual | -| 157 | Sink: org.apache.hc.client5.http.classic.methods; HttpTrace; true; HttpTrace; (URI); ; Argument[0]; request-forgery; hq-manual | -| 158 | Sink: org.apache.hc.client5.http.classic.methods; HttpUriRequestBase; true; HttpUriRequestBase; (String,URI); ; Argument[1]; request-forgery; hq-manual | -| 159 | Sink: org.apache.hc.client5.http.fluent; Request; true; create; (Method,URI); ; Argument[1]; request-forgery; hq-manual | -| 160 | Sink: org.apache.hc.client5.http.fluent; Request; true; create; (String,String); ; Argument[1]; request-forgery; hq-manual | -| 161 | Sink: org.apache.hc.client5.http.fluent; Request; true; create; (String,URI); ; Argument[1]; request-forgery; hq-manual | -| 162 | Sink: org.apache.hc.client5.http.fluent; Request; true; delete; (String); ; Argument[0]; request-forgery; hq-manual | -| 163 | Sink: org.apache.hc.client5.http.fluent; Request; true; delete; (URI); ; Argument[0]; request-forgery; hq-manual | -| 164 | Sink: org.apache.hc.client5.http.fluent; Request; true; get; (String); ; Argument[0]; request-forgery; hq-manual | -| 165 | Sink: org.apache.hc.client5.http.fluent; Request; true; get; (URI); ; Argument[0]; request-forgery; hq-manual | -| 166 | Sink: org.apache.hc.client5.http.fluent; Request; true; head; (String); ; Argument[0]; request-forgery; hq-manual | -| 167 | Sink: org.apache.hc.client5.http.fluent; Request; true; head; (URI); ; Argument[0]; request-forgery; hq-manual | -| 168 | Sink: org.apache.hc.client5.http.fluent; Request; true; options; (String); ; Argument[0]; request-forgery; hq-manual | -| 169 | Sink: org.apache.hc.client5.http.fluent; Request; true; options; (URI); ; Argument[0]; request-forgery; hq-manual | -| 170 | Sink: org.apache.hc.client5.http.fluent; Request; true; patch; (String); ; Argument[0]; request-forgery; hq-manual | -| 171 | Sink: org.apache.hc.client5.http.fluent; Request; true; patch; (URI); ; Argument[0]; request-forgery; hq-manual | -| 172 | Sink: org.apache.hc.client5.http.fluent; Request; true; post; (String); ; Argument[0]; request-forgery; hq-manual | -| 173 | Sink: org.apache.hc.client5.http.fluent; Request; true; post; (URI); ; Argument[0]; request-forgery; hq-manual | -| 174 | Sink: org.apache.hc.client5.http.fluent; Request; true; put; (String); ; Argument[0]; request-forgery; hq-manual | -| 175 | Sink: org.apache.hc.client5.http.fluent; Request; true; put; (URI); ; Argument[0]; request-forgery; hq-manual | -| 176 | Sink: org.apache.hc.client5.http.fluent; Request; true; trace; (String); ; Argument[0]; request-forgery; hq-manual | -| 177 | Sink: org.apache.hc.client5.http.fluent; Request; true; trace; (URI); ; Argument[0]; request-forgery; hq-manual | -| 178 | Sink: org.apache.hc.core5.http.impl.bootstrap; HttpAsyncRequester; true; connect; (HttpHost,Timeout); ; Argument[0]; request-forgery; hq-manual | -| 179 | Sink: org.apache.hc.core5.http.impl.bootstrap; HttpAsyncRequester; true; connect; (HttpHost,Timeout,Object,FutureCallback); ; Argument[0]; request-forgery; hq-manual | -| 180 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; delete; (String); ; Argument[0]; request-forgery; hq-manual | -| 181 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; delete; (URI); ; Argument[0]; request-forgery; hq-manual | -| 182 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; get; (String); ; Argument[0]; request-forgery; hq-manual | -| 183 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; get; (URI); ; Argument[0]; request-forgery; hq-manual | -| 184 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; head; (String); ; Argument[0]; request-forgery; hq-manual | -| 185 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; head; (URI); ; Argument[0]; request-forgery; hq-manual | -| 186 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; options; (String); ; Argument[0]; request-forgery; hq-manual | -| 187 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; options; (URI); ; Argument[0]; request-forgery; hq-manual | -| 188 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; patch; (String); ; Argument[0]; request-forgery; hq-manual | -| 189 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; patch; (URI); ; Argument[0]; request-forgery; hq-manual | -| 190 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; post; (String); ; Argument[0]; request-forgery; hq-manual | -| 191 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; post; (URI); ; Argument[0]; request-forgery; hq-manual | -| 192 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; put; (String); ; Argument[0]; request-forgery; hq-manual | -| 193 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; put; (URI); ; Argument[0]; request-forgery; hq-manual | -| 194 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; trace; (String); ; Argument[0]; request-forgery; hq-manual | -| 195 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; trace; (URI); ; Argument[0]; request-forgery; hq-manual | -| 196 | Sink: org.apache.hc.core5.http.message; BasicClassicHttpRequest; true; BasicClassicHttpRequest; (Method,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | -| 197 | Sink: org.apache.hc.core5.http.message; BasicClassicHttpRequest; true; BasicClassicHttpRequest; (Method,URI); ; Argument[1]; request-forgery; hq-manual | -| 198 | Sink: org.apache.hc.core5.http.message; BasicClassicHttpRequest; true; BasicClassicHttpRequest; (String,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | -| 199 | Sink: org.apache.hc.core5.http.message; BasicClassicHttpRequest; true; BasicClassicHttpRequest; (String,URI); ; Argument[1]; request-forgery; hq-manual | -| 200 | Sink: org.apache.hc.core5.http.message; BasicHttpRequest; true; BasicHttpRequest; (Method,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | -| 201 | Sink: org.apache.hc.core5.http.message; BasicHttpRequest; true; BasicHttpRequest; (Method,URI); ; Argument[1]; request-forgery; hq-manual | -| 202 | Sink: org.apache.hc.core5.http.message; BasicHttpRequest; true; BasicHttpRequest; (String,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | -| 203 | Sink: org.apache.hc.core5.http.message; BasicHttpRequest; true; BasicHttpRequest; (String,URI); ; Argument[1]; request-forgery; hq-manual | -| 204 | Sink: org.apache.hc.core5.http.support; AbstractRequestBuilder; true; setHttpHost; (HttpHost); ; Argument[0]; request-forgery; hq-manual | -| 205 | Sink: org.apache.hc.core5.http.support; AbstractRequestBuilder; true; setUri; (String); ; Argument[0]; request-forgery; hq-manual | -| 206 | Sink: org.apache.hc.core5.http.support; AbstractRequestBuilder; true; setUri; (URI); ; Argument[0]; request-forgery; hq-manual | -| 207 | Sink: org.apache.hc.core5.http; HttpRequest; true; setUri; (URI); ; Argument[0]; request-forgery; hq-manual | -| 208 | Sink: org.apache.hc.core5.http; HttpRequestFactory; true; newHttpRequest; (String,String); ; Argument[1]; request-forgery; hq-manual | -| 209 | Sink: org.apache.hc.core5.http; HttpRequestFactory; true; newHttpRequest; (String,URI); ; Argument[1]; request-forgery; hq-manual | -| 210 | Sink: org.apache.http.client.methods; HttpDelete; false; HttpDelete; ; ; Argument[0]; request-forgery; manual | -| 211 | Sink: org.apache.http.client.methods; HttpGet; false; HttpGet; ; ; Argument[0]; request-forgery; manual | -| 212 | Sink: org.apache.http.client.methods; HttpHead; false; HttpHead; ; ; Argument[0]; request-forgery; manual | -| 213 | Sink: org.apache.http.client.methods; HttpOptions; false; HttpOptions; ; ; Argument[0]; request-forgery; manual | -| 214 | Sink: org.apache.http.client.methods; HttpPatch; false; HttpPatch; ; ; Argument[0]; request-forgery; manual | -| 215 | Sink: org.apache.http.client.methods; HttpPost; false; HttpPost; ; ; Argument[0]; request-forgery; manual | -| 216 | Sink: org.apache.http.client.methods; HttpPut; false; HttpPut; ; ; Argument[0]; request-forgery; manual | -| 217 | Sink: org.apache.http.client.methods; HttpRequestBase; true; setURI; ; ; Argument[0]; request-forgery; manual | -| 218 | Sink: org.apache.http.client.methods; HttpTrace; false; HttpTrace; ; ; Argument[0]; request-forgery; manual | -| 219 | Sink: org.apache.http.client.methods; RequestBuilder; false; delete; ; ; Argument[0]; request-forgery; manual | -| 220 | Sink: org.apache.http.client.methods; RequestBuilder; false; get; ; ; Argument[0]; request-forgery; manual | -| 221 | Sink: org.apache.http.client.methods; RequestBuilder; false; head; ; ; Argument[0]; request-forgery; manual | -| 222 | Sink: org.apache.http.client.methods; RequestBuilder; false; options; ; ; Argument[0]; request-forgery; manual | -| 223 | Sink: org.apache.http.client.methods; RequestBuilder; false; patch; ; ; Argument[0]; request-forgery; manual | -| 224 | Sink: org.apache.http.client.methods; RequestBuilder; false; post; ; ; Argument[0]; request-forgery; manual | -| 225 | Sink: org.apache.http.client.methods; RequestBuilder; false; put; ; ; Argument[0]; request-forgery; manual | -| 226 | Sink: org.apache.http.client.methods; RequestBuilder; false; setUri; ; ; Argument[0]; request-forgery; manual | -| 227 | Sink: org.apache.http.client.methods; RequestBuilder; false; trace; ; ; Argument[0]; request-forgery; manual | -| 228 | Sink: org.apache.http.message; BasicHttpEntityEnclosingRequest; false; BasicHttpEntityEnclosingRequest; (RequestLine); ; Argument[0]; request-forgery; manual | -| 229 | Sink: org.apache.http.message; BasicHttpEntityEnclosingRequest; false; BasicHttpEntityEnclosingRequest; (String,String); ; Argument[1]; request-forgery; manual | -| 230 | Sink: org.apache.http.message; BasicHttpEntityEnclosingRequest; false; BasicHttpEntityEnclosingRequest; (String,String,ProtocolVersion); ; Argument[1]; request-forgery; manual | -| 231 | Sink: org.apache.http.message; BasicHttpRequest; false; BasicHttpRequest; (RequestLine); ; Argument[0]; request-forgery; manual | -| 232 | Sink: org.apache.http.message; BasicHttpRequest; false; BasicHttpRequest; (String,String); ; Argument[1]; request-forgery; manual | -| 233 | Sink: org.apache.http.message; BasicHttpRequest; false; BasicHttpRequest; (String,String,ProtocolVersion); ; Argument[1]; request-forgery; manual | -| 234 | Sink: org.codehaus.cargo.container.installer; ZipURLInstaller; true; ZipURLInstaller; (URL,String,String); ; Argument[0]; request-forgery; ai-manual | -| 235 | Sink: org.jdbi.v3.core; Jdbi; false; create; (String); ; Argument[0]; request-forgery; manual | -| 236 | Sink: org.jdbi.v3.core; Jdbi; false; create; (String,Properties); ; Argument[0]; request-forgery; manual | -| 237 | Sink: org.jdbi.v3.core; Jdbi; false; create; (String,String,String); ; Argument[0]; request-forgery; manual | -| 238 | Sink: org.jdbi.v3.core; Jdbi; false; open; (String); ; Argument[0]; request-forgery; manual | -| 239 | Sink: org.jdbi.v3.core; Jdbi; false; open; (String,Properties); ; Argument[0]; request-forgery; manual | -| 240 | Sink: org.jdbi.v3.core; Jdbi; false; open; (String,String,String); ; Argument[0]; request-forgery; manual | -| 241 | Sink: org.kohsuke.stapler; HttpResponses; true; staticResource; (URL); ; Argument[0]; request-forgery; ai-manual | -| 242 | Sink: org.springframework.boot.jdbc; DataSourceBuilder; false; url; (String); ; Argument[0]; request-forgery; manual | -| 243 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (HttpMethod,URI); ; Argument[1]; request-forgery; manual | -| 244 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (MultiValueMap,HttpMethod,URI); ; Argument[2]; request-forgery; manual | -| 245 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (Object,HttpMethod,URI); ; Argument[2]; request-forgery; manual | -| 246 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (Object,HttpMethod,URI,Type); ; Argument[2]; request-forgery; manual | -| 247 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (Object,MultiValueMap,HttpMethod,URI); ; Argument[3]; request-forgery; manual | -| 248 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (Object,MultiValueMap,HttpMethod,URI,Type); ; Argument[3]; request-forgery; manual | -| 249 | Sink: org.springframework.http; RequestEntity; false; delete; ; ; Argument[0]; request-forgery; manual | -| 250 | Sink: org.springframework.http; RequestEntity; false; get; ; ; Argument[0]; request-forgery; manual | -| 251 | Sink: org.springframework.http; RequestEntity; false; head; ; ; Argument[0]; request-forgery; manual | -| 252 | Sink: org.springframework.http; RequestEntity; false; method; ; ; Argument[1]; request-forgery; manual | -| 253 | Sink: org.springframework.http; RequestEntity; false; options; ; ; Argument[0]; request-forgery; manual | -| 254 | Sink: org.springframework.http; RequestEntity; false; patch; ; ; Argument[0]; request-forgery; manual | -| 255 | Sink: org.springframework.http; RequestEntity; false; post; ; ; Argument[0]; request-forgery; manual | -| 256 | Sink: org.springframework.http; RequestEntity; false; put; ; ; Argument[0]; request-forgery; manual | -| 257 | Sink: org.springframework.jdbc.datasource; AbstractDriverBasedDataSource; false; setUrl; (String); ; Argument[0]; request-forgery; manual | -| 258 | Sink: org.springframework.jdbc.datasource; DriverManagerDataSource; false; DriverManagerDataSource; (String); ; Argument[0]; request-forgery; manual | -| 259 | Sink: org.springframework.jdbc.datasource; DriverManagerDataSource; false; DriverManagerDataSource; (String,Properties); ; Argument[0]; request-forgery; manual | -| 260 | Sink: org.springframework.jdbc.datasource; DriverManagerDataSource; false; DriverManagerDataSource; (String,String,String); ; Argument[0]; request-forgery; manual | -| 261 | Sink: org.springframework.web.client; RestTemplate; false; delete; ; ; Argument[0]; request-forgery; manual | -| 262 | Sink: org.springframework.web.client; RestTemplate; false; exchange; ; ; Argument[0]; request-forgery; manual | -| 263 | Sink: org.springframework.web.client; RestTemplate; false; execute; ; ; Argument[0]; request-forgery; manual | -| 264 | Sink: org.springframework.web.client; RestTemplate; false; getForEntity; ; ; Argument[0]; request-forgery; manual | -| 265 | Sink: org.springframework.web.client; RestTemplate; false; getForObject; ; ; Argument[0]; request-forgery; manual | -| 266 | Sink: org.springframework.web.client; RestTemplate; false; headForHeaders; ; ; Argument[0]; request-forgery; manual | -| 267 | Sink: org.springframework.web.client; RestTemplate; false; optionsForAllow; ; ; Argument[0]; request-forgery; manual | -| 268 | Sink: org.springframework.web.client; RestTemplate; false; patchForObject; ; ; Argument[0]; request-forgery; manual | -| 269 | Sink: org.springframework.web.client; RestTemplate; false; postForEntity; ; ; Argument[0]; request-forgery; manual | -| 270 | Sink: org.springframework.web.client; RestTemplate; false; postForLocation; ; ; Argument[0]; request-forgery; manual | -| 271 | Sink: org.springframework.web.client; RestTemplate; false; postForObject; ; ; Argument[0]; request-forgery; manual | -| 272 | Sink: org.springframework.web.client; RestTemplate; false; put; ; ; Argument[0]; request-forgery; manual | -| 273 | Sink: org.springframework.web.reactive.function.client; WebClient$Builder; false; baseUrl; ; ; Argument[0]; request-forgery; manual | -| 274 | Sink: org.springframework.web.reactive.function.client; WebClient; false; create; ; ; Argument[0]; request-forgery; manual | -| 275 | Sink: play.libs.ws; StandaloneWSClient; true; url; ; ; Argument[0]; request-forgery; manual | -| 276 | Sink: play.libs.ws; WSClient; true; url; ; ; Argument[0]; request-forgery; manual | -| 277 | Source: javax.servlet; ServletRequest; false; getParameter; (String); ; ReturnValue; remote; manual | -| 278 | Summary: java.lang; AbstractStringBuilder; true; append; ; ; Argument[0]; Argument[this]; taint; manual | -| 279 | Summary: java.lang; AbstractStringBuilder; true; append; ; ; Argument[this]; ReturnValue; value; manual | -| 280 | Summary: java.lang; CharSequence; true; toString; ; ; Argument[this]; ReturnValue; taint; manual | -| 281 | Summary: java.lang; String; false; format; (String,Object[]); ; Argument[1].ArrayElement; ReturnValue; taint; manual | -| 282 | Summary: java.lang; StringBuilder; true; StringBuilder; ; ; Argument[0]; Argument[this]; taint; manual | -| 283 | Summary: java.net.http; HttpRequest$Builder; true; build; (); ; Argument[this]; ReturnValue; taint; df-generated | -| 284 | Summary: java.net.http; HttpRequest; true; newBuilder; (URI); ; Argument[0]; ReturnValue; taint; df-generated | -| 285 | Summary: java.net; URI; false; URI; (String); ; Argument[0]; Argument[this]; taint; manual | -| 286 | Summary: java.net; URI; false; toString; ; ; Argument[this]; ReturnValue; taint; manual | -| 287 | Summary: java.net; URI; false; toURL; ; ; Argument[this]; ReturnValue; taint; manual | -| 288 | Summary: java.net; URL; false; URL; (String); ; Argument[0]; Argument[this]; taint; manual | -| 289 | Summary: java.util; List; false; of; (Object); ; Argument[0]; ReturnValue.Element; value; manual | -| 290 | Summary: java.util; List; true; get; (int); ; Argument[this].Element; ReturnValue; value; manual | -| 291 | Summary: java.util; Map; false; of; ; ; Argument[1]; ReturnValue.MapValue; value; manual | -| 292 | Summary: java.util; Map; false; of; ; ; Argument[3]; ReturnValue.MapValue; value; manual | -| 293 | Summary: java.util; Properties; true; setProperty; (String,String); ; Argument[1]; Argument[this].MapValue; value; manual | -| 294 | Summary: org.apache.hc.core5.http; HttpHost; true; HttpHost; (String); ; Argument[0]; Argument[this]; taint; hq-manual | -| 295 | Summary: org.apache.http.message; BasicRequestLine; false; BasicRequestLine; ; ; Argument[1]; Argument[this]; taint; manual | +| 3 | Sink: io.micronaut.http.client; BlockingHttpClient; true; exchange; (String); ; Argument[0]; request-forgery; manual | +| 4 | Sink: io.micronaut.http.client; BlockingHttpClient; true; retrieve; (String); ; Argument[0]; request-forgery; manual | +| 5 | Sink: io.micronaut.http.client; BlockingHttpClient; true; retrieve; (String,Class); ; Argument[0]; request-forgery; manual | +| 6 | Sink: jakarta.ws.rs.client; Client; true; target; ; ; Argument[0]; request-forgery; manual | +| 7 | Sink: java.net.http; HttpClient; true; send; (HttpRequest,HttpResponse$BodyHandler); ; Argument[0]; request-forgery; ai-manual | +| 8 | Sink: java.net.http; HttpRequest$Builder; false; uri; ; ; Argument[0]; request-forgery; manual | +| 9 | Sink: java.net.http; HttpRequest; false; newBuilder; ; ; Argument[0]; request-forgery; manual | +| 10 | Sink: java.net; DatagramSocket; true; connect; (SocketAddress); ; Argument[0]; request-forgery; ai-manual | +| 11 | Sink: java.net; URL; false; openConnection; (Proxy); ; Argument[0]; request-forgery; ai-manual | +| 12 | Sink: java.net; URL; false; openConnection; ; ; Argument[this]; request-forgery; manual | +| 13 | Sink: java.net; URL; false; openStream; ; ; Argument[this]; request-forgery; manual | +| 14 | Sink: java.net; URLClassLoader; false; URLClassLoader; (String,URL[],ClassLoader); ; Argument[1]; request-forgery; manual | +| 15 | Sink: java.net; URLClassLoader; false; URLClassLoader; (String,URL[],ClassLoader,URLStreamHandlerFactory); ; Argument[1]; request-forgery; manual | +| 16 | Sink: java.net; URLClassLoader; false; URLClassLoader; (URL[]); ; Argument[0]; request-forgery; manual | +| 17 | Sink: java.net; URLClassLoader; false; URLClassLoader; (URL[],ClassLoader); ; Argument[0]; request-forgery; manual | +| 18 | Sink: java.net; URLClassLoader; false; URLClassLoader; (URL[],ClassLoader,URLStreamHandlerFactory); ; Argument[0]; request-forgery; manual | +| 19 | Sink: java.net; URLClassLoader; false; newInstance; ; ; Argument[0]; request-forgery; manual | +| 20 | Sink: java.sql; Driver; false; connect; (String,Properties); ; Argument[0]; request-forgery; manual | +| 21 | Sink: java.sql; DriverManager; false; getConnection; (String); ; Argument[0]; request-forgery; manual | +| 22 | Sink: java.sql; DriverManager; false; getConnection; (String,Properties); ; Argument[0]; request-forgery; manual | +| 23 | Sink: java.sql; DriverManager; false; getConnection; (String,String,String); ; Argument[0]; request-forgery; manual | +| 24 | Sink: javafx.scene.web; WebEngine; false; load; (String); ; Argument[0]; request-forgery; ai-manual | +| 25 | Sink: javax.activation; URLDataSource; true; URLDataSource; ; ; Argument[0]; request-forgery; manual | +| 26 | Sink: javax.ws.rs.client; Client; true; target; ; ; Argument[0]; request-forgery; manual | +| 27 | Sink: org.apache.commons.jelly; JellyContext; true; JellyContext; (JellyContext,URL); ; Argument[1]; request-forgery; ai-manual | +| 28 | Sink: org.apache.commons.jelly; JellyContext; true; JellyContext; (JellyContext,URL,URL); ; Argument[1]; request-forgery; ai-manual | +| 29 | Sink: org.apache.commons.jelly; JellyContext; true; JellyContext; (JellyContext,URL,URL); ; Argument[2]; request-forgery; ai-manual | +| 30 | Sink: org.apache.commons.jelly; JellyContext; true; JellyContext; (URL); ; Argument[0]; request-forgery; ai-manual | +| 31 | Sink: org.apache.commons.jelly; JellyContext; true; JellyContext; (URL,URL); ; Argument[0]; request-forgery; ai-manual | +| 32 | Sink: org.apache.commons.jelly; JellyContext; true; JellyContext; (URL,URL); ; Argument[1]; request-forgery; ai-manual | +| 33 | Sink: org.apache.cxf.catalog; OASISCatalogManager; true; loadCatalog; (URL); ; Argument[0]; request-forgery; manual | +| 34 | Sink: org.apache.cxf.common.classloader; ClassLoaderUtils; true; getURLClassLoader; (List,ClassLoader); ; Argument[0]; request-forgery; manual | +| 35 | Sink: org.apache.cxf.common.classloader; ClassLoaderUtils; true; getURLClassLoader; (URL[],ClassLoader); ; Argument[0]; request-forgery; manual | +| 36 | Sink: org.apache.cxf.resource; ExtendedURIResolver; true; resolve; (String,String); ; Argument[0]; request-forgery; manual | +| 37 | Sink: org.apache.cxf.resource; URIResolver; true; URIResolver; (String); ; Argument[0]; request-forgery; manual | +| 38 | Sink: org.apache.cxf.resource; URIResolver; true; URIResolver; (String,String); ; Argument[1]; request-forgery; manual | +| 39 | Sink: org.apache.cxf.resource; URIResolver; true; URIResolver; (String,String,Class); ; Argument[1]; request-forgery; manual | +| 40 | Sink: org.apache.cxf.resource; URIResolver; true; resolve; (String,String,Class); ; Argument[1]; request-forgery; manual | +| 41 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; create; (Method,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | +| 42 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; create; (Method,String); ; Argument[1]; request-forgery; hq-manual | +| 43 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; create; (Method,URI); ; Argument[1]; request-forgery; hq-manual | +| 44 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; create; (String,String); ; Argument[1]; request-forgery; hq-manual | +| 45 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; create; (String,URI); ; Argument[1]; request-forgery; hq-manual | +| 46 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; delete; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 47 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; delete; (String); ; Argument[0]; request-forgery; hq-manual | +| 48 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; delete; (URI); ; Argument[0]; request-forgery; hq-manual | +| 49 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; get; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 50 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; get; (String); ; Argument[0]; request-forgery; hq-manual | +| 51 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; get; (URI); ; Argument[0]; request-forgery; hq-manual | +| 52 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; head; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 53 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; head; (String); ; Argument[0]; request-forgery; hq-manual | +| 54 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; head; (URI); ; Argument[0]; request-forgery; hq-manual | +| 55 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; options; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 56 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; options; (String); ; Argument[0]; request-forgery; hq-manual | +| 57 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; options; (URI); ; Argument[0]; request-forgery; hq-manual | +| 58 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; patch; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 59 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; patch; (String); ; Argument[0]; request-forgery; hq-manual | +| 60 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; patch; (URI); ; Argument[0]; request-forgery; hq-manual | +| 61 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; post; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 62 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; post; (String); ; Argument[0]; request-forgery; hq-manual | +| 63 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; post; (URI); ; Argument[0]; request-forgery; hq-manual | +| 64 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; put; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 65 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; put; (String); ; Argument[0]; request-forgery; hq-manual | +| 66 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; put; (URI); ; Argument[0]; request-forgery; hq-manual | +| 67 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; trace; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 68 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; trace; (String); ; Argument[0]; request-forgery; hq-manual | +| 69 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; trace; (URI); ; Argument[0]; request-forgery; hq-manual | +| 70 | Sink: org.apache.hc.client5.http.async.methods; ConfigurableHttpRequest; true; ConfigurableHttpRequest; (String,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | +| 71 | Sink: org.apache.hc.client5.http.async.methods; ConfigurableHttpRequest; true; ConfigurableHttpRequest; (String,URI); ; Argument[1]; request-forgery; hq-manual | +| 72 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; SimpleHttpRequest; (Method,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | +| 73 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; SimpleHttpRequest; (Method,URI); ; Argument[1]; request-forgery; hq-manual | +| 74 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; SimpleHttpRequest; (String,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | +| 75 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; SimpleHttpRequest; (String,URI); ; Argument[1]; request-forgery; hq-manual | +| 76 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; create; (Method,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | +| 77 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; create; (Method,URI); ; Argument[1]; request-forgery; hq-manual | +| 78 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; create; (String,String); ; Argument[1]; request-forgery; hq-manual | +| 79 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; create; (String,URI); ; Argument[1]; request-forgery; hq-manual | +| 80 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; create; (Method,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | +| 81 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; create; (Method,String); ; Argument[1]; request-forgery; hq-manual | +| 82 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; create; (Method,URI); ; Argument[1]; request-forgery; hq-manual | +| 83 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; create; (String,String); ; Argument[1]; request-forgery; hq-manual | +| 84 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; create; (String,URI); ; Argument[1]; request-forgery; hq-manual | +| 85 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; delete; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 86 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; delete; (String); ; Argument[0]; request-forgery; hq-manual | +| 87 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; delete; (URI); ; Argument[0]; request-forgery; hq-manual | +| 88 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; get; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 89 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; get; (String); ; Argument[0]; request-forgery; hq-manual | +| 90 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; get; (URI); ; Argument[0]; request-forgery; hq-manual | +| 91 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; head; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 92 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; head; (String); ; Argument[0]; request-forgery; hq-manual | +| 93 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; head; (URI); ; Argument[0]; request-forgery; hq-manual | +| 94 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; options; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 95 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; options; (String); ; Argument[0]; request-forgery; hq-manual | +| 96 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; options; (URI); ; Argument[0]; request-forgery; hq-manual | +| 97 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; patch; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 98 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; patch; (String); ; Argument[0]; request-forgery; hq-manual | +| 99 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; patch; (URI); ; Argument[0]; request-forgery; hq-manual | +| 100 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; post; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 101 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; post; (String); ; Argument[0]; request-forgery; hq-manual | +| 102 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; post; (URI); ; Argument[0]; request-forgery; hq-manual | +| 103 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; put; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 104 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; put; (String); ; Argument[0]; request-forgery; hq-manual | +| 105 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; put; (URI); ; Argument[0]; request-forgery; hq-manual | +| 106 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; trace; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 107 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; trace; (String); ; Argument[0]; request-forgery; hq-manual | +| 108 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; trace; (URI); ; Argument[0]; request-forgery; hq-manual | +| 109 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; delete; (String); ; Argument[0]; request-forgery; hq-manual | +| 110 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; delete; (URI); ; Argument[0]; request-forgery; hq-manual | +| 111 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; get; (String); ; Argument[0]; request-forgery; hq-manual | +| 112 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; get; (URI); ; Argument[0]; request-forgery; hq-manual | +| 113 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; head; (String); ; Argument[0]; request-forgery; hq-manual | +| 114 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; head; (URI); ; Argument[0]; request-forgery; hq-manual | +| 115 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; options; (String); ; Argument[0]; request-forgery; hq-manual | +| 116 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; options; (URI); ; Argument[0]; request-forgery; hq-manual | +| 117 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; patch; (String); ; Argument[0]; request-forgery; hq-manual | +| 118 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; patch; (URI); ; Argument[0]; request-forgery; hq-manual | +| 119 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; post; (String); ; Argument[0]; request-forgery; hq-manual | +| 120 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; post; (URI); ; Argument[0]; request-forgery; hq-manual | +| 121 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; put; (String); ; Argument[0]; request-forgery; hq-manual | +| 122 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; put; (URI); ; Argument[0]; request-forgery; hq-manual | +| 123 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; trace; (String); ; Argument[0]; request-forgery; hq-manual | +| 124 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; trace; (URI); ; Argument[0]; request-forgery; hq-manual | +| 125 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; create; (Method,String); ; Argument[1]; request-forgery; hq-manual | +| 126 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; create; (Method,URI); ; Argument[1]; request-forgery; hq-manual | +| 127 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; create; (String,String); ; Argument[1]; request-forgery; hq-manual | +| 128 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; create; (String,URI); ; Argument[1]; request-forgery; hq-manual | +| 129 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; delete; (String); ; Argument[0]; request-forgery; hq-manual | +| 130 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; delete; (URI); ; Argument[0]; request-forgery; hq-manual | +| 131 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; get; (String); ; Argument[0]; request-forgery; hq-manual | +| 132 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; get; (URI); ; Argument[0]; request-forgery; hq-manual | +| 133 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; head; (String); ; Argument[0]; request-forgery; hq-manual | +| 134 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; head; (URI); ; Argument[0]; request-forgery; hq-manual | +| 135 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; options; (String); ; Argument[0]; request-forgery; hq-manual | +| 136 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; options; (URI); ; Argument[0]; request-forgery; hq-manual | +| 137 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; patch; (String); ; Argument[0]; request-forgery; hq-manual | +| 138 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; patch; (URI); ; Argument[0]; request-forgery; hq-manual | +| 139 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; post; (String); ; Argument[0]; request-forgery; hq-manual | +| 140 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; post; (URI); ; Argument[0]; request-forgery; hq-manual | +| 141 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; put; (String); ; Argument[0]; request-forgery; hq-manual | +| 142 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; put; (URI); ; Argument[0]; request-forgery; hq-manual | +| 143 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; trace; (String); ; Argument[0]; request-forgery; hq-manual | +| 144 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; trace; (URI); ; Argument[0]; request-forgery; hq-manual | +| 145 | Sink: org.apache.hc.client5.http.classic.methods; HttpDelete; true; HttpDelete; (String); ; Argument[0]; request-forgery; hq-manual | +| 146 | Sink: org.apache.hc.client5.http.classic.methods; HttpDelete; true; HttpDelete; (URI); ; Argument[0]; request-forgery; hq-manual | +| 147 | Sink: org.apache.hc.client5.http.classic.methods; HttpGet; true; HttpGet; (String); ; Argument[0]; request-forgery; hq-manual | +| 148 | Sink: org.apache.hc.client5.http.classic.methods; HttpGet; true; HttpGet; (URI); ; Argument[0]; request-forgery; hq-manual | +| 149 | Sink: org.apache.hc.client5.http.classic.methods; HttpHead; true; HttpHead; (String); ; Argument[0]; request-forgery; hq-manual | +| 150 | Sink: org.apache.hc.client5.http.classic.methods; HttpHead; true; HttpHead; (URI); ; Argument[0]; request-forgery; hq-manual | +| 151 | Sink: org.apache.hc.client5.http.classic.methods; HttpOptions; true; HttpOptions; (String); ; Argument[0]; request-forgery; hq-manual | +| 152 | Sink: org.apache.hc.client5.http.classic.methods; HttpOptions; true; HttpOptions; (URI); ; Argument[0]; request-forgery; hq-manual | +| 153 | Sink: org.apache.hc.client5.http.classic.methods; HttpPatch; true; HttpPatch; (String); ; Argument[0]; request-forgery; hq-manual | +| 154 | Sink: org.apache.hc.client5.http.classic.methods; HttpPatch; true; HttpPatch; (URI); ; Argument[0]; request-forgery; hq-manual | +| 155 | Sink: org.apache.hc.client5.http.classic.methods; HttpPost; true; HttpPost; (String); ; Argument[0]; request-forgery; hq-manual | +| 156 | Sink: org.apache.hc.client5.http.classic.methods; HttpPost; true; HttpPost; (URI); ; Argument[0]; request-forgery; hq-manual | +| 157 | Sink: org.apache.hc.client5.http.classic.methods; HttpPut; true; HttpPut; (String); ; Argument[0]; request-forgery; hq-manual | +| 158 | Sink: org.apache.hc.client5.http.classic.methods; HttpPut; true; HttpPut; (URI); ; Argument[0]; request-forgery; hq-manual | +| 159 | Sink: org.apache.hc.client5.http.classic.methods; HttpTrace; true; HttpTrace; (String); ; Argument[0]; request-forgery; hq-manual | +| 160 | Sink: org.apache.hc.client5.http.classic.methods; HttpTrace; true; HttpTrace; (URI); ; Argument[0]; request-forgery; hq-manual | +| 161 | Sink: org.apache.hc.client5.http.classic.methods; HttpUriRequestBase; true; HttpUriRequestBase; (String,URI); ; Argument[1]; request-forgery; hq-manual | +| 162 | Sink: org.apache.hc.client5.http.fluent; Request; true; create; (Method,URI); ; Argument[1]; request-forgery; hq-manual | +| 163 | Sink: org.apache.hc.client5.http.fluent; Request; true; create; (String,String); ; Argument[1]; request-forgery; hq-manual | +| 164 | Sink: org.apache.hc.client5.http.fluent; Request; true; create; (String,URI); ; Argument[1]; request-forgery; hq-manual | +| 165 | Sink: org.apache.hc.client5.http.fluent; Request; true; delete; (String); ; Argument[0]; request-forgery; hq-manual | +| 166 | Sink: org.apache.hc.client5.http.fluent; Request; true; delete; (URI); ; Argument[0]; request-forgery; hq-manual | +| 167 | Sink: org.apache.hc.client5.http.fluent; Request; true; get; (String); ; Argument[0]; request-forgery; hq-manual | +| 168 | Sink: org.apache.hc.client5.http.fluent; Request; true; get; (URI); ; Argument[0]; request-forgery; hq-manual | +| 169 | Sink: org.apache.hc.client5.http.fluent; Request; true; head; (String); ; Argument[0]; request-forgery; hq-manual | +| 170 | Sink: org.apache.hc.client5.http.fluent; Request; true; head; (URI); ; Argument[0]; request-forgery; hq-manual | +| 171 | Sink: org.apache.hc.client5.http.fluent; Request; true; options; (String); ; Argument[0]; request-forgery; hq-manual | +| 172 | Sink: org.apache.hc.client5.http.fluent; Request; true; options; (URI); ; Argument[0]; request-forgery; hq-manual | +| 173 | Sink: org.apache.hc.client5.http.fluent; Request; true; patch; (String); ; Argument[0]; request-forgery; hq-manual | +| 174 | Sink: org.apache.hc.client5.http.fluent; Request; true; patch; (URI); ; Argument[0]; request-forgery; hq-manual | +| 175 | Sink: org.apache.hc.client5.http.fluent; Request; true; post; (String); ; Argument[0]; request-forgery; hq-manual | +| 176 | Sink: org.apache.hc.client5.http.fluent; Request; true; post; (URI); ; Argument[0]; request-forgery; hq-manual | +| 177 | Sink: org.apache.hc.client5.http.fluent; Request; true; put; (String); ; Argument[0]; request-forgery; hq-manual | +| 178 | Sink: org.apache.hc.client5.http.fluent; Request; true; put; (URI); ; Argument[0]; request-forgery; hq-manual | +| 179 | Sink: org.apache.hc.client5.http.fluent; Request; true; trace; (String); ; Argument[0]; request-forgery; hq-manual | +| 180 | Sink: org.apache.hc.client5.http.fluent; Request; true; trace; (URI); ; Argument[0]; request-forgery; hq-manual | +| 181 | Sink: org.apache.hc.core5.http.impl.bootstrap; HttpAsyncRequester; true; connect; (HttpHost,Timeout); ; Argument[0]; request-forgery; hq-manual | +| 182 | Sink: org.apache.hc.core5.http.impl.bootstrap; HttpAsyncRequester; true; connect; (HttpHost,Timeout,Object,FutureCallback); ; Argument[0]; request-forgery; hq-manual | +| 183 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; delete; (String); ; Argument[0]; request-forgery; hq-manual | +| 184 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; delete; (URI); ; Argument[0]; request-forgery; hq-manual | +| 185 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; get; (String); ; Argument[0]; request-forgery; hq-manual | +| 186 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; get; (URI); ; Argument[0]; request-forgery; hq-manual | +| 187 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; head; (String); ; Argument[0]; request-forgery; hq-manual | +| 188 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; head; (URI); ; Argument[0]; request-forgery; hq-manual | +| 189 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; options; (String); ; Argument[0]; request-forgery; hq-manual | +| 190 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; options; (URI); ; Argument[0]; request-forgery; hq-manual | +| 191 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; patch; (String); ; Argument[0]; request-forgery; hq-manual | +| 192 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; patch; (URI); ; Argument[0]; request-forgery; hq-manual | +| 193 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; post; (String); ; Argument[0]; request-forgery; hq-manual | +| 194 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; post; (URI); ; Argument[0]; request-forgery; hq-manual | +| 195 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; put; (String); ; Argument[0]; request-forgery; hq-manual | +| 196 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; put; (URI); ; Argument[0]; request-forgery; hq-manual | +| 197 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; trace; (String); ; Argument[0]; request-forgery; hq-manual | +| 198 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; trace; (URI); ; Argument[0]; request-forgery; hq-manual | +| 199 | Sink: org.apache.hc.core5.http.message; BasicClassicHttpRequest; true; BasicClassicHttpRequest; (Method,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | +| 200 | Sink: org.apache.hc.core5.http.message; BasicClassicHttpRequest; true; BasicClassicHttpRequest; (Method,URI); ; Argument[1]; request-forgery; hq-manual | +| 201 | Sink: org.apache.hc.core5.http.message; BasicClassicHttpRequest; true; BasicClassicHttpRequest; (String,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | +| 202 | Sink: org.apache.hc.core5.http.message; BasicClassicHttpRequest; true; BasicClassicHttpRequest; (String,URI); ; Argument[1]; request-forgery; hq-manual | +| 203 | Sink: org.apache.hc.core5.http.message; BasicHttpRequest; true; BasicHttpRequest; (Method,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | +| 204 | Sink: org.apache.hc.core5.http.message; BasicHttpRequest; true; BasicHttpRequest; (Method,URI); ; Argument[1]; request-forgery; hq-manual | +| 205 | Sink: org.apache.hc.core5.http.message; BasicHttpRequest; true; BasicHttpRequest; (String,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | +| 206 | Sink: org.apache.hc.core5.http.message; BasicHttpRequest; true; BasicHttpRequest; (String,URI); ; Argument[1]; request-forgery; hq-manual | +| 207 | Sink: org.apache.hc.core5.http.support; AbstractRequestBuilder; true; setHttpHost; (HttpHost); ; Argument[0]; request-forgery; hq-manual | +| 208 | Sink: org.apache.hc.core5.http.support; AbstractRequestBuilder; true; setUri; (String); ; Argument[0]; request-forgery; hq-manual | +| 209 | Sink: org.apache.hc.core5.http.support; AbstractRequestBuilder; true; setUri; (URI); ; Argument[0]; request-forgery; hq-manual | +| 210 | Sink: org.apache.hc.core5.http; HttpRequest; true; setUri; (URI); ; Argument[0]; request-forgery; hq-manual | +| 211 | Sink: org.apache.hc.core5.http; HttpRequestFactory; true; newHttpRequest; (String,String); ; Argument[1]; request-forgery; hq-manual | +| 212 | Sink: org.apache.hc.core5.http; HttpRequestFactory; true; newHttpRequest; (String,URI); ; Argument[1]; request-forgery; hq-manual | +| 213 | Sink: org.apache.http.client.methods; HttpDelete; false; HttpDelete; ; ; Argument[0]; request-forgery; manual | +| 214 | Sink: org.apache.http.client.methods; HttpGet; false; HttpGet; ; ; Argument[0]; request-forgery; manual | +| 215 | Sink: org.apache.http.client.methods; HttpHead; false; HttpHead; ; ; Argument[0]; request-forgery; manual | +| 216 | Sink: org.apache.http.client.methods; HttpOptions; false; HttpOptions; ; ; Argument[0]; request-forgery; manual | +| 217 | Sink: org.apache.http.client.methods; HttpPatch; false; HttpPatch; ; ; Argument[0]; request-forgery; manual | +| 218 | Sink: org.apache.http.client.methods; HttpPost; false; HttpPost; ; ; Argument[0]; request-forgery; manual | +| 219 | Sink: org.apache.http.client.methods; HttpPut; false; HttpPut; ; ; Argument[0]; request-forgery; manual | +| 220 | Sink: org.apache.http.client.methods; HttpRequestBase; true; setURI; ; ; Argument[0]; request-forgery; manual | +| 221 | Sink: org.apache.http.client.methods; HttpTrace; false; HttpTrace; ; ; Argument[0]; request-forgery; manual | +| 222 | Sink: org.apache.http.client.methods; RequestBuilder; false; delete; ; ; Argument[0]; request-forgery; manual | +| 223 | Sink: org.apache.http.client.methods; RequestBuilder; false; get; ; ; Argument[0]; request-forgery; manual | +| 224 | Sink: org.apache.http.client.methods; RequestBuilder; false; head; ; ; Argument[0]; request-forgery; manual | +| 225 | Sink: org.apache.http.client.methods; RequestBuilder; false; options; ; ; Argument[0]; request-forgery; manual | +| 226 | Sink: org.apache.http.client.methods; RequestBuilder; false; patch; ; ; Argument[0]; request-forgery; manual | +| 227 | Sink: org.apache.http.client.methods; RequestBuilder; false; post; ; ; Argument[0]; request-forgery; manual | +| 228 | Sink: org.apache.http.client.methods; RequestBuilder; false; put; ; ; Argument[0]; request-forgery; manual | +| 229 | Sink: org.apache.http.client.methods; RequestBuilder; false; setUri; ; ; Argument[0]; request-forgery; manual | +| 230 | Sink: org.apache.http.client.methods; RequestBuilder; false; trace; ; ; Argument[0]; request-forgery; manual | +| 231 | Sink: org.apache.http.message; BasicHttpEntityEnclosingRequest; false; BasicHttpEntityEnclosingRequest; (RequestLine); ; Argument[0]; request-forgery; manual | +| 232 | Sink: org.apache.http.message; BasicHttpEntityEnclosingRequest; false; BasicHttpEntityEnclosingRequest; (String,String); ; Argument[1]; request-forgery; manual | +| 233 | Sink: org.apache.http.message; BasicHttpEntityEnclosingRequest; false; BasicHttpEntityEnclosingRequest; (String,String,ProtocolVersion); ; Argument[1]; request-forgery; manual | +| 234 | Sink: org.apache.http.message; BasicHttpRequest; false; BasicHttpRequest; (RequestLine); ; Argument[0]; request-forgery; manual | +| 235 | Sink: org.apache.http.message; BasicHttpRequest; false; BasicHttpRequest; (String,String); ; Argument[1]; request-forgery; manual | +| 236 | Sink: org.apache.http.message; BasicHttpRequest; false; BasicHttpRequest; (String,String,ProtocolVersion); ; Argument[1]; request-forgery; manual | +| 237 | Sink: org.codehaus.cargo.container.installer; ZipURLInstaller; true; ZipURLInstaller; (URL,String,String); ; Argument[0]; request-forgery; ai-manual | +| 238 | Sink: org.jdbi.v3.core; Jdbi; false; create; (String); ; Argument[0]; request-forgery; manual | +| 239 | Sink: org.jdbi.v3.core; Jdbi; false; create; (String,Properties); ; Argument[0]; request-forgery; manual | +| 240 | Sink: org.jdbi.v3.core; Jdbi; false; create; (String,String,String); ; Argument[0]; request-forgery; manual | +| 241 | Sink: org.jdbi.v3.core; Jdbi; false; open; (String); ; Argument[0]; request-forgery; manual | +| 242 | Sink: org.jdbi.v3.core; Jdbi; false; open; (String,Properties); ; Argument[0]; request-forgery; manual | +| 243 | Sink: org.jdbi.v3.core; Jdbi; false; open; (String,String,String); ; Argument[0]; request-forgery; manual | +| 244 | Sink: org.kohsuke.stapler; HttpResponses; true; staticResource; (URL); ; Argument[0]; request-forgery; ai-manual | +| 245 | Sink: org.springframework.boot.jdbc; DataSourceBuilder; false; url; (String); ; Argument[0]; request-forgery; manual | +| 246 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (HttpMethod,URI); ; Argument[1]; request-forgery; manual | +| 247 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (MultiValueMap,HttpMethod,URI); ; Argument[2]; request-forgery; manual | +| 248 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (Object,HttpMethod,URI); ; Argument[2]; request-forgery; manual | +| 249 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (Object,HttpMethod,URI,Type); ; Argument[2]; request-forgery; manual | +| 250 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (Object,MultiValueMap,HttpMethod,URI); ; Argument[3]; request-forgery; manual | +| 251 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (Object,MultiValueMap,HttpMethod,URI,Type); ; Argument[3]; request-forgery; manual | +| 252 | Sink: org.springframework.http; RequestEntity; false; delete; ; ; Argument[0]; request-forgery; manual | +| 253 | Sink: org.springframework.http; RequestEntity; false; get; ; ; Argument[0]; request-forgery; manual | +| 254 | Sink: org.springframework.http; RequestEntity; false; head; ; ; Argument[0]; request-forgery; manual | +| 255 | Sink: org.springframework.http; RequestEntity; false; method; ; ; Argument[1]; request-forgery; manual | +| 256 | Sink: org.springframework.http; RequestEntity; false; options; ; ; Argument[0]; request-forgery; manual | +| 257 | Sink: org.springframework.http; RequestEntity; false; patch; ; ; Argument[0]; request-forgery; manual | +| 258 | Sink: org.springframework.http; RequestEntity; false; post; ; ; Argument[0]; request-forgery; manual | +| 259 | Sink: org.springframework.http; RequestEntity; false; put; ; ; Argument[0]; request-forgery; manual | +| 260 | Sink: org.springframework.jdbc.datasource; AbstractDriverBasedDataSource; false; setUrl; (String); ; Argument[0]; request-forgery; manual | +| 261 | Sink: org.springframework.jdbc.datasource; DriverManagerDataSource; false; DriverManagerDataSource; (String); ; Argument[0]; request-forgery; manual | +| 262 | Sink: org.springframework.jdbc.datasource; DriverManagerDataSource; false; DriverManagerDataSource; (String,Properties); ; Argument[0]; request-forgery; manual | +| 263 | Sink: org.springframework.jdbc.datasource; DriverManagerDataSource; false; DriverManagerDataSource; (String,String,String); ; Argument[0]; request-forgery; manual | +| 264 | Sink: org.springframework.web.client; RestTemplate; false; delete; ; ; Argument[0]; request-forgery; manual | +| 265 | Sink: org.springframework.web.client; RestTemplate; false; exchange; ; ; Argument[0]; request-forgery; manual | +| 266 | Sink: org.springframework.web.client; RestTemplate; false; execute; ; ; Argument[0]; request-forgery; manual | +| 267 | Sink: org.springframework.web.client; RestTemplate; false; getForEntity; ; ; Argument[0]; request-forgery; manual | +| 268 | Sink: org.springframework.web.client; RestTemplate; false; getForObject; ; ; Argument[0]; request-forgery; manual | +| 269 | Sink: org.springframework.web.client; RestTemplate; false; headForHeaders; ; ; Argument[0]; request-forgery; manual | +| 270 | Sink: org.springframework.web.client; RestTemplate; false; optionsForAllow; ; ; Argument[0]; request-forgery; manual | +| 271 | Sink: org.springframework.web.client; RestTemplate; false; patchForObject; ; ; Argument[0]; request-forgery; manual | +| 272 | Sink: org.springframework.web.client; RestTemplate; false; postForEntity; ; ; Argument[0]; request-forgery; manual | +| 273 | Sink: org.springframework.web.client; RestTemplate; false; postForLocation; ; ; Argument[0]; request-forgery; manual | +| 274 | Sink: org.springframework.web.client; RestTemplate; false; postForObject; ; ; Argument[0]; request-forgery; manual | +| 275 | Sink: org.springframework.web.client; RestTemplate; false; put; ; ; Argument[0]; request-forgery; manual | +| 276 | Sink: org.springframework.web.reactive.function.client; WebClient$Builder; false; baseUrl; ; ; Argument[0]; request-forgery; manual | +| 277 | Sink: org.springframework.web.reactive.function.client; WebClient; false; create; ; ; Argument[0]; request-forgery; manual | +| 278 | Sink: play.libs.ws; StandaloneWSClient; true; url; ; ; Argument[0]; request-forgery; manual | +| 279 | Sink: play.libs.ws; WSClient; true; url; ; ; Argument[0]; request-forgery; manual | +| 280 | Source: javax.servlet; ServletRequest; false; getParameter; (String); ; ReturnValue; remote; manual | +| 281 | Summary: io.micronaut.http.uri; UriBuilder; true; build; (); ; Argument[this]; ReturnValue; taint; manual | +| 282 | Summary: io.micronaut.http.uri; UriBuilder; true; host; (String); ; Argument[0]; ReturnValue; taint; manual | +| 283 | Summary: java.lang; AbstractStringBuilder; true; append; ; ; Argument[0]; Argument[this]; taint; manual | +| 284 | Summary: java.lang; AbstractStringBuilder; true; append; ; ; Argument[this]; ReturnValue; value; manual | +| 285 | Summary: java.lang; CharSequence; true; toString; ; ; Argument[this]; ReturnValue; taint; manual | +| 286 | Summary: java.lang; String; false; format; (String,Object[]); ; Argument[1].ArrayElement; ReturnValue; taint; manual | +| 287 | Summary: java.lang; StringBuilder; true; StringBuilder; ; ; Argument[0]; Argument[this]; taint; manual | +| 288 | Summary: java.net.http; HttpRequest$Builder; true; build; (); ; Argument[this]; ReturnValue; taint; df-generated | +| 289 | Summary: java.net.http; HttpRequest; true; newBuilder; (URI); ; Argument[0]; ReturnValue; taint; df-generated | +| 290 | Summary: java.net; URI; false; URI; (String); ; Argument[0]; Argument[this]; taint; manual | +| 291 | Summary: java.net; URI; false; toString; ; ; Argument[this]; ReturnValue; taint; manual | +| 292 | Summary: java.net; URI; false; toURL; ; ; Argument[this]; ReturnValue; taint; manual | +| 293 | Summary: java.net; URL; false; URL; (String); ; Argument[0]; Argument[this]; taint; manual | +| 294 | Summary: java.util; List; false; of; (Object); ; Argument[0]; ReturnValue.Element; value; manual | +| 295 | Summary: java.util; List; true; get; (int); ; Argument[this].Element; ReturnValue; value; manual | +| 296 | Summary: java.util; Map; false; of; ; ; Argument[1]; ReturnValue.MapValue; value; manual | +| 297 | Summary: java.util; Map; false; of; ; ; Argument[3]; ReturnValue.MapValue; value; manual | +| 298 | Summary: java.util; Properties; true; setProperty; (String,String); ; Argument[1]; Argument[this].MapValue; value; manual | +| 299 | Summary: org.apache.hc.core5.http; HttpHost; true; HttpHost; (String); ; Argument[0]; Argument[this]; taint; hq-manual | +| 300 | Summary: org.apache.http.message; BasicRequestLine; false; BasicRequestLine; ; ; Argument[1]; Argument[this]; taint; manual | nodes | ApacheHttpSSRF.java:27:27:27:53 | getParameter(...) : String | semmle.label | getParameter(...) : String | | ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | semmle.label | new URI(...) : URI | @@ -1726,6 +1743,18 @@ nodes | JdbcUrlSSRF.java:86:19:86:25 | jdbcUrl | semmle.label | jdbcUrl | | JdbcUrlSSRF.java:87:19:87:25 | jdbcUrl | semmle.label | jdbcUrl | | JdbcUrlSSRF.java:88:19:88:25 | jdbcUrl | semmle.label | jdbcUrl | +| MicronautSSRF.java:14:32:14:53 | url : String | semmle.label | url : String | +| MicronautSSRF.java:15:45:15:47 | url | semmle.label | url | +| MicronautSSRF.java:19:42:19:63 | url : String | semmle.label | url : String | +| MicronautSSRF.java:20:45:20:47 | url | semmle.label | url | +| MicronautSSRF.java:24:37:24:58 | url : String | semmle.label | url : String | +| MicronautSSRF.java:25:45:25:47 | url | semmle.label | url | +| MicronautSSRF.java:29:34:29:56 | host : String | semmle.label | host : String | +| MicronautSSRF.java:30:19:30:64 | host(...) : UriBuilder | semmle.label | host(...) : UriBuilder | +| MicronautSSRF.java:30:19:30:72 | build(...) : URI | semmle.label | build(...) : URI | +| MicronautSSRF.java:30:60:30:63 | host : String | semmle.label | host : String | +| MicronautSSRF.java:31:45:31:47 | uri : URI | semmle.label | uri : URI | +| MicronautSSRF.java:31:45:31:58 | toString(...) | semmle.label | toString(...) | | ReactiveWebClientSSRF.java:15:26:15:52 | getParameter(...) : String | semmle.label | getParameter(...) : String | | ReactiveWebClientSSRF.java:16:52:16:54 | url | semmle.label | url | | ReactiveWebClientSSRF.java:32:26:32:52 | getParameter(...) : String | semmle.label | getParameter(...) : String | diff --git a/java/ql/test/query-tests/security/CWE-918/options b/java/ql/test/query-tests/security/CWE-918/options index 6b6efaeca544..ef78ec144309 100644 --- a/java/ql/test/query-tests/security/CWE-918/options +++ b/java/ql/test/query-tests/security/CWE-918/options @@ -1 +1 @@ -//semmle-extractor-options: --javac-args -source 11 -target 11 -cp ${testdir}/../../../stubs/javax-validation-constraints:${testdir}/../../../stubs/springframework-5.8.x:${testdir}/../../../stubs/javax-ws-rs-api-2.1.1:${testdir}/../../../stubs/javax-ws-rs-api-3.0.0:${testdir}/../../../stubs/apache-http-4.4.13/:${testdir}/../../../stubs/projectreactor-3.4.3/:${testdir}/../../../stubs/postgresql-42.3.3/:${testdir}/../../../stubs/HikariCP-3.4.5/:${testdir}/../../../stubs/spring-jdbc-5.3.8/:${testdir}/../../../stubs/jdbi3-core-3.27.2/:${testdir}/../../../stubs/cargo:${testdir}/../../../stubs/javafx-web:${testdir}/../../../stubs/apache-commons-jelly-1.0.1:${testdir}/../../../stubs/dom4j-2.1.1:${testdir}/../../../stubs/jaxen-1.2.0:${testdir}/../../../stubs/stapler-1.263:${testdir}/../../../stubs/javax-servlet-2.5:${testdir}/../../../stubs/apache-commons-fileupload-1.4:${testdir}/../../../stubs/saxon-xqj-9.x:${testdir}/../../../stubs/apache-commons-beanutils:${testdir}/../../../stubs/apache-commons-lang:${testdir}/../../../stubs/apache-http-5:${testdir}/../../../stubs/playframework-2.6.x:${testdir}/../../../stubs/jaxws-api-2.0:${testdir}/../../../stubs/apache-cxf +//semmle-extractor-options: --javac-args -source 11 -target 11 -cp ${testdir}/../../../stubs/micronaut-4.x:${testdir}/../../../stubs/javax-validation-constraints:${testdir}/../../../stubs/springframework-5.8.x:${testdir}/../../../stubs/javax-ws-rs-api-2.1.1:${testdir}/../../../stubs/javax-ws-rs-api-3.0.0:${testdir}/../../../stubs/apache-http-4.4.13/:${testdir}/../../../stubs/projectreactor-3.4.3/:${testdir}/../../../stubs/postgresql-42.3.3/:${testdir}/../../../stubs/HikariCP-3.4.5/:${testdir}/../../../stubs/spring-jdbc-5.3.8/:${testdir}/../../../stubs/jdbi3-core-3.27.2/:${testdir}/../../../stubs/cargo:${testdir}/../../../stubs/javafx-web:${testdir}/../../../stubs/apache-commons-jelly-1.0.1:${testdir}/../../../stubs/dom4j-2.1.1:${testdir}/../../../stubs/jaxen-1.2.0:${testdir}/../../../stubs/stapler-1.263:${testdir}/../../../stubs/javax-servlet-2.5:${testdir}/../../../stubs/apache-commons-fileupload-1.4:${testdir}/../../../stubs/saxon-xqj-9.x:${testdir}/../../../stubs/apache-commons-beanutils:${testdir}/../../../stubs/apache-commons-lang:${testdir}/../../../stubs/apache-http-5:${testdir}/../../../stubs/playframework-2.6.x:${testdir}/../../../stubs/jaxws-api-2.0:${testdir}/../../../stubs/apache-cxf diff --git a/java/ql/test/stubs/micronaut-4.x/LICENSE.txt b/java/ql/test/stubs/micronaut-4.x/LICENSE.txt new file mode 100644 index 000000000000..b5312355281c --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/LICENSE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/context/annotation/Property.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/context/annotation/Property.java new file mode 100644 index 000000000000..01d4eadc6d10 --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/context/annotation/Property.java @@ -0,0 +1,11 @@ +package io.micronaut.context.annotation; + +import java.lang.annotation.*; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD}) +public @interface Property { + String name(); + String defaultValue() default ""; +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/context/annotation/Value.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/context/annotation/Value.java new file mode 100644 index 000000000000..ac8ffd8ed9ca --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/context/annotation/Value.java @@ -0,0 +1,10 @@ +package io.micronaut.context.annotation; + +import java.lang.annotation.*; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD}) +public @interface Value { + String value() default ""; +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/data/annotation/Query.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/data/annotation/Query.java new file mode 100644 index 000000000000..7648782800ff --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/data/annotation/Query.java @@ -0,0 +1,10 @@ +package io.micronaut.data.annotation; + +import java.lang.annotation.*; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD}) +public @interface Query { + String value() default ""; +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/data/annotation/Repository.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/data/annotation/Repository.java new file mode 100644 index 000000000000..2ee674ab54d2 --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/data/annotation/Repository.java @@ -0,0 +1,10 @@ +package io.micronaut.data.annotation; + +import java.lang.annotation.*; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE}) +public @interface Repository { + String value() default ""; +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/data/repository/CrudRepository.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/data/repository/CrudRepository.java new file mode 100644 index 000000000000..22ff8a431bf1 --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/data/repository/CrudRepository.java @@ -0,0 +1,15 @@ +package io.micronaut.data.repository; + +import java.util.Optional; + +public interface CrudRepository extends GenericRepository { + S save(S entity); + Iterable saveAll(Iterable entities); + Optional findById(ID id); + boolean existsById(ID id); + Iterable findAll(); + long count(); + void deleteById(ID id); + void delete(E entity); + void deleteAll(); +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/data/repository/GenericRepository.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/data/repository/GenericRepository.java new file mode 100644 index 000000000000..1e213dd6a60b --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/data/repository/GenericRepository.java @@ -0,0 +1,4 @@ +package io.micronaut.data.repository; + +public interface GenericRepository { +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpHeaders.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpHeaders.java new file mode 100644 index 000000000000..ae68073fcdd5 --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpHeaders.java @@ -0,0 +1,11 @@ +package io.micronaut.http; + +import java.util.List; +import java.util.Optional; + +public interface HttpHeaders { + String get(CharSequence name); + List getAll(CharSequence name); + Optional getFirst(CharSequence name); + java.util.Collection> values(); +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpMethod.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpMethod.java new file mode 100644 index 000000000000..efcb9cb22f44 --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpMethod.java @@ -0,0 +1,5 @@ +package io.micronaut.http; + +public enum HttpMethod { + GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS, TRACE; +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpParameters.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpParameters.java new file mode 100644 index 000000000000..061391dbc3eb --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpParameters.java @@ -0,0 +1,10 @@ +package io.micronaut.http; + +import java.util.List; +import java.util.Optional; + +public interface HttpParameters { + String get(CharSequence name); + List getAll(CharSequence name); + Optional getFirst(CharSequence name); +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpRequest.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpRequest.java new file mode 100644 index 000000000000..5b51dba87f99 --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpRequest.java @@ -0,0 +1,26 @@ +package io.micronaut.http; + +import java.net.URI; +import java.util.Optional; +import io.micronaut.http.cookie.Cookies; + +public interface HttpRequest { + Cookies getCookies(); + HttpHeaders getHeaders(); + HttpParameters getParameters(); + Optional getBody(); + URI getUri(); + String getPath(); + Optional getContentType(); + long getContentLength(); + HttpMethod getMethod(); + String getMethodName(); + + static HttpRequest GET(String uri) { return null; } + static HttpRequest POST(String uri, T body) { return null; } + static HttpRequest PUT(String uri, T body) { return null; } + static HttpRequest DELETE(String uri) { return null; } + static HttpRequest PATCH(String uri, T body) { return null; } + static HttpRequest HEAD(String uri) { return null; } + static HttpRequest OPTIONS(String uri) { return null; } +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpResponse.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpResponse.java new file mode 100644 index 000000000000..7469ea3d5661 --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpResponse.java @@ -0,0 +1,18 @@ +package io.micronaut.http; + +import java.net.URI; +import java.util.Optional; + +public interface HttpResponse { + HttpStatus getStatus(); + int code(); + HttpHeaders getHeaders(); + Optional getBody(); + + static MutableHttpResponse ok() { return null; } + static MutableHttpResponse ok(T body) { return null; } + static MutableHttpResponse redirect(URI location) { return null; } + static MutableHttpResponse notFound() { return null; } + static MutableHttpResponse badRequest() { return null; } + static MutableHttpResponse serverError() { return null; } +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpStatus.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpStatus.java new file mode 100644 index 000000000000..ba0dd346b968 --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpStatus.java @@ -0,0 +1,30 @@ +package io.micronaut.http; + +public enum HttpStatus { + OK(200), + CREATED(201), + ACCEPTED(202), + NO_CONTENT(204), + MOVED_PERMANENTLY(301), + FOUND(302), + SEE_OTHER(303), + NOT_MODIFIED(304), + TEMPORARY_REDIRECT(307), + BAD_REQUEST(400), + UNAUTHORIZED(401), + FORBIDDEN(403), + NOT_FOUND(404), + METHOD_NOT_ALLOWED(405), + INTERNAL_SERVER_ERROR(500), + SERVICE_UNAVAILABLE(503); + + private final int code; + + HttpStatus(int code) { + this.code = code; + } + + public int getCode() { + return code; + } +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/MediaType.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/MediaType.java new file mode 100644 index 000000000000..644af26a8db6 --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/MediaType.java @@ -0,0 +1,15 @@ +package io.micronaut.http; + +public class MediaType { + public static final String APPLICATION_JSON = "application/json"; + public static final String TEXT_PLAIN = "text/plain"; + public static final String TEXT_HTML = "text/html"; + public static final String APPLICATION_FORM_URLENCODED = "application/x-www-form-urlencoded"; + public static final String MULTIPART_FORM_DATA = "multipart/form-data"; + public static final String APPLICATION_XML = "application/xml"; + public static final String APPLICATION_OCTET_STREAM = "application/octet-stream"; + + public MediaType(String name) {} + + public String getName() { return null; } +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/MutableHttpResponse.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/MutableHttpResponse.java new file mode 100644 index 000000000000..37a6db7c917d --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/MutableHttpResponse.java @@ -0,0 +1,11 @@ +package io.micronaut.http; + +public interface MutableHttpResponse extends HttpResponse { + MutableHttpResponse header(CharSequence name, CharSequence value); + MutableHttpResponse headers(java.util.Map headers); + MutableHttpResponse contentType(MediaType mediaType); + MutableHttpResponse contentType(CharSequence mediaType); + MutableHttpResponse status(HttpStatus status); + MutableHttpResponse status(int status); + MutableHttpResponse body(T body); +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Body.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Body.java new file mode 100644 index 000000000000..93942052e0e8 --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Body.java @@ -0,0 +1,10 @@ +package io.micronaut.http.annotation; + +import java.lang.annotation.*; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.PARAMETER}) +public @interface Body { + String value() default ""; +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Controller.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Controller.java new file mode 100644 index 000000000000..184cd210fa8b --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Controller.java @@ -0,0 +1,10 @@ +package io.micronaut.http.annotation; + +import java.lang.annotation.*; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE}) +public @interface Controller { + String value() default "/"; +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/CookieValue.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/CookieValue.java new file mode 100644 index 000000000000..c6a3378b7773 --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/CookieValue.java @@ -0,0 +1,10 @@ +package io.micronaut.http.annotation; + +import java.lang.annotation.*; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.PARAMETER}) +public @interface CookieValue { + String value() default ""; +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/CustomHttpMethod.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/CustomHttpMethod.java new file mode 100644 index 000000000000..a59722cdb170 --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/CustomHttpMethod.java @@ -0,0 +1,11 @@ +package io.micronaut.http.annotation; + +import java.lang.annotation.*; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD}) +public @interface CustomHttpMethod { + String value() default "/"; + String method(); +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Delete.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Delete.java new file mode 100644 index 000000000000..22c32802ec4b --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Delete.java @@ -0,0 +1,11 @@ +package io.micronaut.http.annotation; + +import java.lang.annotation.*; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD}) +public @interface Delete { + String value() default "/"; + String uri() default "/"; +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Error.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Error.java new file mode 100644 index 000000000000..f1fddc4ef280 --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Error.java @@ -0,0 +1,13 @@ +package io.micronaut.http.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface Error { + Class exception() default Throwable.class; + boolean global() default false; +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Get.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Get.java new file mode 100644 index 000000000000..15d50fc111ea --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Get.java @@ -0,0 +1,11 @@ +package io.micronaut.http.annotation; + +import java.lang.annotation.*; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD}) +public @interface Get { + String value() default "/"; + String uri() default "/"; +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Head.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Head.java new file mode 100644 index 000000000000..291e82b1012b --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Head.java @@ -0,0 +1,11 @@ +package io.micronaut.http.annotation; + +import java.lang.annotation.*; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD}) +public @interface Head { + String value() default "/"; + String uri() default "/"; +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Header.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Header.java new file mode 100644 index 000000000000..98da750e1355 --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Header.java @@ -0,0 +1,10 @@ +package io.micronaut.http.annotation; + +import java.lang.annotation.*; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.PARAMETER}) +public @interface Header { + String value() default ""; +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Options.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Options.java new file mode 100644 index 000000000000..f2653ec3ea3b --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Options.java @@ -0,0 +1,11 @@ +package io.micronaut.http.annotation; + +import java.lang.annotation.*; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD}) +public @interface Options { + String value() default "/"; + String uri() default "/"; +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Part.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Part.java new file mode 100644 index 000000000000..39b0f508a9c2 --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Part.java @@ -0,0 +1,10 @@ +package io.micronaut.http.annotation; + +import java.lang.annotation.*; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.PARAMETER}) +public @interface Part { + String value() default ""; +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Patch.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Patch.java new file mode 100644 index 000000000000..5f206769761c --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Patch.java @@ -0,0 +1,11 @@ +package io.micronaut.http.annotation; + +import java.lang.annotation.*; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD}) +public @interface Patch { + String value() default "/"; + String uri() default "/"; +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/PathVariable.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/PathVariable.java new file mode 100644 index 000000000000..08c7365ebe19 --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/PathVariable.java @@ -0,0 +1,10 @@ +package io.micronaut.http.annotation; + +import java.lang.annotation.*; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.PARAMETER}) +public @interface PathVariable { + String value() default ""; +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Post.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Post.java new file mode 100644 index 000000000000..933474e17bfc --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Post.java @@ -0,0 +1,11 @@ +package io.micronaut.http.annotation; + +import java.lang.annotation.*; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD}) +public @interface Post { + String value() default "/"; + String uri() default "/"; +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Put.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Put.java new file mode 100644 index 000000000000..743961bd74ea --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Put.java @@ -0,0 +1,11 @@ +package io.micronaut.http.annotation; + +import java.lang.annotation.*; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD}) +public @interface Put { + String value() default "/"; + String uri() default "/"; +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/QueryValue.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/QueryValue.java new file mode 100644 index 000000000000..3c4378294aa7 --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/QueryValue.java @@ -0,0 +1,10 @@ +package io.micronaut.http.annotation; + +import java.lang.annotation.*; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.PARAMETER}) +public @interface QueryValue { + String value() default ""; +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/RequestAttribute.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/RequestAttribute.java new file mode 100644 index 000000000000..67bd01516816 --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/RequestAttribute.java @@ -0,0 +1,10 @@ +package io.micronaut.http.annotation; + +import java.lang.annotation.*; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.PARAMETER}) +public @interface RequestAttribute { + String value() default ""; +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/RequestBean.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/RequestBean.java new file mode 100644 index 000000000000..d1c69ac82f55 --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/RequestBean.java @@ -0,0 +1,11 @@ +package io.micronaut.http.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.PARAMETER) +public @interface RequestBean { +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Trace.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Trace.java new file mode 100644 index 000000000000..de9b352e6801 --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/annotation/Trace.java @@ -0,0 +1,11 @@ +package io.micronaut.http.annotation; + +import java.lang.annotation.*; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD}) +public @interface Trace { + String value() default "/"; + String uri() default "/"; +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/client/BlockingHttpClient.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/client/BlockingHttpClient.java new file mode 100644 index 000000000000..379ef4049d12 --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/client/BlockingHttpClient.java @@ -0,0 +1,13 @@ +package io.micronaut.http.client; + +import io.micronaut.http.HttpRequest; +import io.micronaut.http.HttpResponse; + +public interface BlockingHttpClient { + HttpResponse exchange(HttpRequest request, Class bodyType); + HttpResponse exchange(HttpRequest request); + String retrieve(String uri); + O retrieve(String uri, Class bodyType); + String exchange(String uri); + HttpResponse exchange(String uri, Class bodyType); +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/client/HttpClient.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/client/HttpClient.java new file mode 100644 index 000000000000..de5278de08ee --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/client/HttpClient.java @@ -0,0 +1,5 @@ +package io.micronaut.http.client; + +public interface HttpClient { + BlockingHttpClient toBlocking(); +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/cookie/Cookie.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/cookie/Cookie.java new file mode 100644 index 000000000000..62f8dd31101d --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/cookie/Cookie.java @@ -0,0 +1,11 @@ +package io.micronaut.http.cookie; + +public interface Cookie { + String getName(); + String getValue(); + String getDomain(); + String getPath(); + boolean isHttpOnly(); + boolean isSecure(); + long getMaxAge(); +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/cookie/Cookies.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/cookie/Cookies.java new file mode 100644 index 000000000000..b35fcb9a6e00 --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/cookie/Cookies.java @@ -0,0 +1,11 @@ +package io.micronaut.http.cookie; + +import java.util.Collection; +import java.util.Optional; +import java.util.Set; + +public interface Cookies { + Set getAll(); + Optional findCookie(CharSequence name); + Cookie get(CharSequence name); +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/multipart/CompletedFileUpload.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/multipart/CompletedFileUpload.java new file mode 100644 index 000000000000..597421bd81c3 --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/multipart/CompletedFileUpload.java @@ -0,0 +1,14 @@ +package io.micronaut.http.multipart; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Optional; +import io.micronaut.http.MediaType; + +public interface CompletedFileUpload { + String getFilename(); + byte[] getBytes() throws IOException; + InputStream getInputStream() throws IOException; + long getSize(); + Optional getContentType(); +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/uri/UriBuilder.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/uri/UriBuilder.java new file mode 100644 index 000000000000..13eeeeb40ed4 --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/uri/UriBuilder.java @@ -0,0 +1,13 @@ +package io.micronaut.http.uri; + +import java.net.URI; + +public interface UriBuilder { + static UriBuilder of(CharSequence uri) { return null; } + static UriBuilder of(URI uri) { return null; } + UriBuilder host(String host); + UriBuilder path(String path); + UriBuilder queryParam(String name, Object... values); + UriBuilder fragment(String fragment); + URI build(); +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/security/annotation/Secured.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/security/annotation/Secured.java new file mode 100644 index 000000000000..a5cb5d0e2502 --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/security/annotation/Secured.java @@ -0,0 +1,10 @@ +package io.micronaut.security.annotation; + +import java.lang.annotation.*; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD, ElementType.TYPE}) +public @interface Secured { + String[] value(); +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/websocket/WebSocketSession.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/websocket/WebSocketSession.java new file mode 100644 index 000000000000..dab20391373e --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/websocket/WebSocketSession.java @@ -0,0 +1,13 @@ +package io.micronaut.websocket; + +import java.util.Optional; +import java.util.Set; + +public interface WebSocketSession { + String getId(); + Set getOpenSessions(); + Optional getCurrentRequest(); + boolean isOpen(); + boolean isSecure(); + void close(); +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/websocket/annotation/OnClose.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/websocket/annotation/OnClose.java new file mode 100644 index 000000000000..ba7fdeef0b9b --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/websocket/annotation/OnClose.java @@ -0,0 +1,9 @@ +package io.micronaut.websocket.annotation; + +import java.lang.annotation.*; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD}) +public @interface OnClose { +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/websocket/annotation/OnMessage.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/websocket/annotation/OnMessage.java new file mode 100644 index 000000000000..cb2cb13e7697 --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/websocket/annotation/OnMessage.java @@ -0,0 +1,9 @@ +package io.micronaut.websocket.annotation; + +import java.lang.annotation.*; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD}) +public @interface OnMessage { +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/websocket/annotation/OnOpen.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/websocket/annotation/OnOpen.java new file mode 100644 index 000000000000..5c1332b006bc --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/websocket/annotation/OnOpen.java @@ -0,0 +1,9 @@ +package io.micronaut.websocket.annotation; + +import java.lang.annotation.*; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD}) +public @interface OnOpen { +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/websocket/annotation/ServerWebSocket.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/websocket/annotation/ServerWebSocket.java new file mode 100644 index 000000000000..e4b873d47206 --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/websocket/annotation/ServerWebSocket.java @@ -0,0 +1,10 @@ +package io.micronaut.websocket.annotation; + +import java.lang.annotation.*; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE}) +public @interface ServerWebSocket { + String value() default "/"; +} From ededc8c6762bca1045289639ab4859c9eb1ccfb4 Mon Sep 17 00:00:00 2001 From: Nicolas Will Date: Fri, 27 Feb 2026 17:22:06 +0100 Subject: [PATCH 0002/2098] Create 2026-02-27-micronaut.md --- java/ql/lib/change-notes/2026-02-27-micronaut.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 java/ql/lib/change-notes/2026-02-27-micronaut.md diff --git a/java/ql/lib/change-notes/2026-02-27-micronaut.md b/java/ql/lib/change-notes/2026-02-27-micronaut.md new file mode 100644 index 000000000000..36c978c372a7 --- /dev/null +++ b/java/ql/lib/change-notes/2026-02-27-micronaut.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added modeling for the Micronaut framework, including HTTP controllers, WebSocket endpoints, configuration injection, data access, security annotations, and HTTP client sinks. From 3869abebea44d8d19e18dda24b1e84c183f0958e Mon Sep 17 00:00:00 2001 From: Nicolas Will Date: Fri, 27 Feb 2026 17:24:02 +0100 Subject: [PATCH 0003/2098] Fix Micronaut ql-for-ql alerts --- .../code/java/frameworks/micronaut/MicronautController.qll | 2 +- java/ql/test/library-tests/frameworks/micronaut/flow.ql | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautController.qll b/java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautController.qll index 9ceb1c0003b7..5be5308b3661 100644 --- a/java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautController.qll +++ b/java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautController.qll @@ -87,7 +87,7 @@ class MicronautRequestMappingParameter extends Parameter { } private predicate isExplicitlyTaintedInput() { - // The MicronautHttpInputAnnotations allow access to the URI path, + // The MicronautHttpInputAnnotation allows access to the URI path, // request parameters, cookie values, headers, and the body of the request. this.getAnAnnotation() instanceof MicronautHttpInputAnnotation or diff --git a/java/ql/test/library-tests/frameworks/micronaut/flow.ql b/java/ql/test/library-tests/frameworks/micronaut/flow.ql index b72e8d0110cb..587269f818c1 100644 --- a/java/ql/test/library-tests/frameworks/micronaut/flow.ql +++ b/java/ql/test/library-tests/frameworks/micronaut/flow.ql @@ -1,6 +1,4 @@ import java -import semmle.code.java.dataflow.TaintTracking -import semmle.code.java.dataflow.FlowSources import semmle.code.java.security.RequestForgery import semmle.code.java.security.UrlRedirect import semmle.code.java.security.ResponseSplitting From 157a1550e01f10d488d5d2cdc6acdb25ae3f82ad Mon Sep 17 00:00:00 2001 From: Nicolas Will Date: Fri, 27 Feb 2026 17:31:52 +0100 Subject: [PATCH 0004/2098] Fix Micronaut local threat model value flow test --- .../taintsources/MicronautConfig.java | 30 +++++++++++++++++++ .../dataflow/taintsources/options | 2 +- 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 java/ql/test/library-tests/dataflow/taintsources/MicronautConfig.java diff --git a/java/ql/test/library-tests/dataflow/taintsources/MicronautConfig.java b/java/ql/test/library-tests/dataflow/taintsources/MicronautConfig.java new file mode 100644 index 000000000000..4b2367fec27e --- /dev/null +++ b/java/ql/test/library-tests/dataflow/taintsources/MicronautConfig.java @@ -0,0 +1,30 @@ +import io.micronaut.context.annotation.Value; +import io.micronaut.context.annotation.Property; +import io.micronaut.http.annotation.*; + +@Controller("/config") +class MicronautConfig { + + private static void sink(Object o) {} + + @Value("${app.secret}") + String secretValue; + + @Property(name = "app.api-key") + String apiKey; + + @Get("/secret") + void testValueField() { + sink(secretValue); // $hasLocalValueFlow + } + + @Get("/key") + void testPropertyField() { + sink(apiKey); // $hasLocalValueFlow + } + + @Get("/param") + void testValueParam(@Value("${app.name}") String appName) { + sink(appName); // $hasLocalValueFlow + } +} diff --git a/java/ql/test/library-tests/dataflow/taintsources/options b/java/ql/test/library-tests/dataflow/taintsources/options index 1ae3d158cec8..04284151d078 100644 --- a/java/ql/test/library-tests/dataflow/taintsources/options +++ b/java/ql/test/library-tests/dataflow/taintsources/options @@ -1 +1 @@ -//semmle-extractor-options: --javac-args -cp ${testdir}/../../../stubs/jakarta.servlet-api-6.0.0:${testdir}/../../../stubs/apache-commons-fileupload-1.4:${testdir}/../../../stubs/javax-servlet-2.5:${testdir}/../../../stubs/servlet-api-2.4:${testdir}/../../../stubs/springframework-5.8.x:${testdir}/../../../stubs/google-android-9.0.0:${testdir}/../../../stubs/playframework-2.6.x:${testdir}/../../../stubs/jackson-databind-2.12:${testdir}/../../../stubs/jackson-core-2.12:${testdir}/../../../stubs/akka-2.6.x:${testdir}/../../../stubs/jwtk-jjwt-0.11.2:${testdir}/../../../stubs/jenkins:${testdir}/../../../stubs/stapler-1.263 \ No newline at end of file +//semmle-extractor-options: --javac-args -cp ${testdir}/../../../stubs/jakarta.servlet-api-6.0.0:${testdir}/../../../stubs/apache-commons-fileupload-1.4:${testdir}/../../../stubs/javax-servlet-2.5:${testdir}/../../../stubs/servlet-api-2.4:${testdir}/../../../stubs/springframework-5.8.x:${testdir}/../../../stubs/google-android-9.0.0:${testdir}/../../../stubs/playframework-2.6.x:${testdir}/../../../stubs/jackson-databind-2.12:${testdir}/../../../stubs/jackson-core-2.12:${testdir}/../../../stubs/akka-2.6.x:${testdir}/../../../stubs/jwtk-jjwt-0.11.2:${testdir}/../../../stubs/jenkins:${testdir}/../../../stubs/stapler-1.263:${testdir}/../../../stubs/micronaut-4.x \ No newline at end of file From ab75d9950c6d06c921d9741182cc3de278fec276 Mon Sep 17 00:00:00 2001 From: Taus Date: Wed, 15 Apr 2026 12:54:41 +0000 Subject: [PATCH 0005/2098] Cargo: upgrade dependencies --- Cargo.lock | 1527 +++++++++++------------ ruby/extractor/Cargo.toml | 10 +- rust/ast-generator/Cargo.toml | 8 +- rust/extractor/Cargo.toml | 50 +- rust/extractor/macros/Cargo.toml | 4 +- shared/tree-sitter-extractor/Cargo.toml | 10 +- 6 files changed, 791 insertions(+), 818 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b6456c841063..71a3dd0eabdd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,9 +10,9 @@ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] @@ -34,9 +34,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.20" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" dependencies = [ "anstyle", "anstyle-parse", @@ -49,26 +49,26 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" [[package]] name = "anstyle-parse" -version = "0.2.7" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.0", ] [[package]] @@ -84,15 +84,15 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.100" +version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" [[package]] name = "argfile" -version = "0.2.1" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a1cc0ba69de57db40674c66f7cf2caee3981ddef084388482c95c0e2133e5e8" +checksum = "99489a733dea0d2930bfa59c243146a8513ce7b0991b9d006647687cc61f53e7" dependencies = [ "fs-err", "os_str_bytes", @@ -110,7 +110,7 @@ version = "0.1.0" dependencies = [ "anyhow", "either", - "itertools 0.14.0", + "itertools", "mustache", "proc-macro2", "quote", @@ -128,6 +128,15 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "atomic-polyfill" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" +dependencies = [ + "critical-section", +] + [[package]] name = "autocfg" version = "1.5.0" @@ -148,16 +157,17 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.4" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" [[package]] name = "borsh" -version = "1.5.7" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce" +checksum = "cfd1e3f8955a5d7de9fab72fc8373fade9fb8a703968cb200ae3dc6cf08e185a" dependencies = [ + "bytes", "cfg_aliases", ] @@ -190,48 +200,44 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" [[package]] -name = "camino" -version = "1.1.12" +name = "byteorder" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0b03af37dad7a14518b7691d81acb0f8222604ad3d1b02f6b4bed5188c0cd5" -dependencies = [ - "serde", -] +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] -name = "cargo-platform" -version = "0.2.0" +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" + +[[package]] +name = "camino" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84982c6c0ae343635a3a4ee6dedef965513735c8b183caa7289fa6e27399ebd4" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" dependencies = [ - "serde", + "serde_core", ] [[package]] -name = "cargo-util-schemas" -version = "0.8.2" +name = "cargo-platform" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dc1a6f7b5651af85774ae5a34b4e8be397d9cf4bc063b7e6dbd99a841837830" +checksum = "87a0c0e6148f11f01f32650a2ea02d532b2ad4e81d8bd41e6e565b5adc5e6082" dependencies = [ - "semver", "serde", - "serde-untagged", - "serde-value", - "thiserror", - "toml 0.8.23", - "unicode-xid", - "url", + "serde_core", ] [[package]] name = "cargo_metadata" -version = "0.21.0" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cfca2aaa699835ba88faf58a06342a314a950d2b9686165e038286c30316868" +checksum = "ef987d17b0a113becdd19d3d0022d04d7ef41f9efe4f3fb63ac44ba61df3ade9" dependencies = [ "camino", "cargo-platform", - "cargo-util-schemas", "semver", "serde", "serde_json", @@ -240,9 +246,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.37" +version = "1.2.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65193589c6404eb80b450d618eaf9a2cafaaafd57ecce47370519ef674a7bd44" +checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20" dependencies = [ "find-msvc-tools", "jobserver", @@ -252,9 +258,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" @@ -263,15 +269,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] -name = "chalk-derive" -version = "0.103.0" +name = "chacha20" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb4899682de915ca7c0b025bdd0a3d34c75fe12184122fda6805a7baddaa293c" +checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", + "cfg-if", + "cpufeatures", + "rand_core", ] [[package]] @@ -286,60 +291,21 @@ dependencies = [ "synstructure", ] -[[package]] -name = "chalk-ir" -version = "0.103.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90a37d2ab99352b4caca135061e7b4ac67024b648c28ed0b787feec4bea4caed" -dependencies = [ - "bitflags 2.9.4", - "chalk-derive 0.103.0", -] - [[package]] name = "chalk-ir" version = "0.104.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7047a516de16226cd17344d41a319d0ea1064bf9e60bd612ab341ab4a34bbfa8" dependencies = [ - "bitflags 2.9.4", - "chalk-derive 0.104.0", -] - -[[package]] -name = "chalk-recursive" -version = "0.103.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c855be60e646664bc37c2496d3dc81ca5ef60520930e5e0f0057a0575aff6c19" -dependencies = [ - "chalk-derive 0.103.0", - "chalk-ir 0.103.0", - "chalk-solve", - "rustc-hash 1.1.0", - "tracing", -] - -[[package]] -name = "chalk-solve" -version = "0.103.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "477ac6cdfd2013e9f93b09b036c2b607a67b2e728f4777b8422d55a79e9e3a34" -dependencies = [ - "chalk-derive 0.103.0", - "chalk-ir 0.103.0", - "ena", - "indexmap 2.11.4", - "itertools 0.12.1", - "petgraph", - "rustc-hash 1.1.0", - "tracing", + "bitflags 2.11.1", + "chalk-derive", ] [[package]] name = "chrono" -version = "0.4.42" +version = "0.4.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" dependencies = [ "iana-time-zone", "js-sys", @@ -351,9 +317,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.48" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2134bb3ea021b78629caa971416385309e0131b351b25e01dc16fb54e1b5fae" +checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" dependencies = [ "clap_builder", "clap_derive", @@ -361,9 +327,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.48" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2ba64afa3c0a6df7fa517765e31314e983f51dda798ffba27b988194fb65dc9" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" dependencies = [ "anstream", "anstyle", @@ -373,9 +339,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.47" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbfd7eae0b0f1a6e63d4b13c9c478de77c2eb546fba158ad50b4203dc24b9f9c" +checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a" dependencies = [ "heck", "proc-macro2", @@ -385,9 +351,18 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.5" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "cobs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror", +] [[package]] name = "codeql-autobuilder-rust" @@ -443,14 +418,14 @@ version = "0.1.0" dependencies = [ "anyhow", "argfile", - "chalk-ir 0.104.0", + "chalk-ir", "chrono", "clap", "codeql-extractor", "dunce", "figment", "glob", - "itertools 0.14.0", + "itertools", "mustache", "num-traits", "ra_ap_base_db", @@ -472,7 +447,7 @@ dependencies = [ "serde", "serde_json", "serde_with", - "toml 0.9.7", + "toml 1.1.2+spec-1.1.0", "tracing", "tracing-flame", "tracing-subscriber", @@ -481,9 +456,9 @@ dependencies = [ [[package]] name = "colorchoice" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] name = "core-foundation-sys" @@ -503,6 +478,15 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f1d92727879fb4f24cec33a35e3bff74035541326cbc12ad44ba8886d1927b0" +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + [[package]] name = "crc32fast" version = "1.5.0" @@ -512,6 +496,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + [[package]] name = "crossbeam-channel" version = "0.5.15" @@ -557,9 +547,9 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "darling" -version = "0.21.3" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" dependencies = [ "darling_core", "darling_macro", @@ -567,11 +557,10 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.21.3" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" dependencies = [ - "fnv", "ident_case", "proc-macro2", "quote", @@ -581,9 +570,9 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.21.3" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ "darling_core", "quote", @@ -615,16 +604,22 @@ dependencies = [ ] [[package]] -name = "displaydoc" -version = "0.2.5" +name = "derive-where" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +checksum = "d08b3a0bcc0d079199cd476b2cae8435016ec11d1c0986c6901c5ac223041534" dependencies = [ "proc-macro2", "quote", "syn", ] +[[package]] +name = "dissimilar" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aeda16ab4059c5fd2a83f2b9c9e9c981327b18aa8e3b313f7e6563799d4f093e" + [[package]] name = "drop_bomb" version = "0.1.5" @@ -649,13 +644,25 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + [[package]] name = "ena" version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" dependencies = [ - "log 0.4.28", + "log 0.4.29", ] [[package]] @@ -728,16 +735,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" -[[package]] -name = "erased-serde" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" -dependencies = [ - "serde", - "typeid", -] - [[package]] name = "figment" version = "0.10.19" @@ -754,15 +751,15 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.1" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fd99930f64d146689264c637b5af2f0233a933bef0d8570e2526bf9e083192d" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" [[package]] name = "fixedbitset" -version = "0.4.2" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" [[package]] name = "flate2" @@ -774,32 +771,17 @@ dependencies = [ "miniz_oxide", ] -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - [[package]] name = "foldhash" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" -[[package]] -name = "form_urlencoded" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] - [[package]] name = "fs-err" -version = "2.11.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" +checksum = "73fde052dbfc920003cfd2c8e2c6e6d4cc7c1091538c3a24226cec0665ab08c0" dependencies = [ "autocfg", ] @@ -821,14 +803,28 @@ checksum = "7ab85b9b05e3978cc9a9cf8fea7f01b494e1a09ed3037e16ba39edc7a29eb61a" [[package]] name = "getrandom" -version = "0.3.3" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" dependencies = [ "cfg-if", "libc", - "r-efi", - "wasi 0.14.5+wasi-0.2.4", + "r-efi 6.0.0", + "rand_core", + "wasip2", + "wasip3", ] [[package]] @@ -845,11 +841,20 @@ checksum = "54a1028dfc5f5df5da8a56a73e6c153c9a9708ec57232470703592a3f18e49f5" dependencies = [ "aho-corasick", "bstr", - "log 0.4.28", + "log 0.4.29", "regex-automata", "regex-syntax", ] +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -873,6 +878,12 @@ dependencies = [ "foldhash", ] +[[package]] +name = "hashbrown" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" + [[package]] name = "hashlink" version = "0.10.0" @@ -882,6 +893,20 @@ dependencies = [ "hashbrown 0.15.5", ] +[[package]] +name = "heapless" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" +dependencies = [ + "atomic-polyfill", + "hash32", + "rustc_version", + "serde", + "spin", + "stable_deref_trait", +] + [[package]] name = "heck" version = "0.5.0" @@ -902,11 +927,11 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "home" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.0", ] [[package]] @@ -919,7 +944,7 @@ dependencies = [ "core-foundation-sys", "iana-time-zone-haiku", "js-sys", - "log 0.4.28", + "log 0.4.29", "wasm-bindgen", "windows-core", ] @@ -934,90 +959,10 @@ dependencies = [ ] [[package]] -name = "icu_collections" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" -dependencies = [ - "displaydoc", - "potential_utf", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.0.0" +name = "id-arena" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" - -[[package]] -name = "icu_properties" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "potential_utf", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" - -[[package]] -name = "icu_provider" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" -dependencies = [ - "displaydoc", - "icu_locale_core", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" [[package]] name = "ident_case" @@ -1025,27 +970,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" -[[package]] -name = "idna" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - [[package]] name = "indexmap" version = "1.9.3" @@ -1059,12 +983,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.11.4" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.15.5", + "hashbrown 0.17.0", "serde", "serde_core", ] @@ -1081,7 +1005,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.1", "inotify-sys", "libc", ] @@ -1105,19 +1029,19 @@ dependencies = [ ] [[package]] -name = "is_terminal_polyfill" -version = "1.70.1" +name = "inventory" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +checksum = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b" +dependencies = [ + "rustversion", +] [[package]] -name = "itertools" -version = "0.12.1" +name = "is_terminal_polyfill" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itertools" @@ -1130,9 +1054,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.15" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jobserver" @@ -1140,7 +1064,7 @@ version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ - "getrandom", + "getrandom 0.3.4", "libc", ] @@ -1192,11 +1116,17 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + [[package]] name = "libc" -version = "0.2.175" +version = "0.2.185" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" +checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f" [[package]] name = "line-index" @@ -1208,12 +1138,6 @@ dependencies = [ "text-size", ] -[[package]] -name = "litemap" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" - [[package]] name = "lock_api" version = "0.4.13" @@ -1230,14 +1154,14 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" dependencies = [ - "log 0.4.28", + "log 0.4.29", ] [[package]] name = "log" -version = "0.4.28" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "matchers" @@ -1250,9 +1174,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.5" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "memoffset" @@ -1274,14 +1198,14 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.4" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" dependencies = [ "libc", - "log 0.4.28", - "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.59.0", + "log 0.4.29", + "wasi", + "windows-sys 0.61.0", ] [[package]] @@ -1315,12 +1239,12 @@ version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.1", "fsevent-sys", "inotify", "kqueue", "libc", - "log 0.4.28", + "log 0.4.29", "mio", "notify-types", "walkdir", @@ -1344,9 +1268,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.1.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" [[package]] name = "num-traits" @@ -1367,11 +1291,20 @@ dependencies = [ "libc", ] +[[package]] +name = "num_threads" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" +dependencies = [ + "libc", +] + [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "once_cell_polyfill" @@ -1385,15 +1318,6 @@ version = "11.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" -[[package]] -name = "ordered-float" -version = "2.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" -dependencies = [ - "num-traits", -] - [[package]] name = "os_str_bytes" version = "7.1.1" @@ -1403,16 +1327,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "papaya" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f92dd0b07c53a0a0c764db2ace8c541dc47320dad97c2200c2a637ab9dd2328f" -dependencies = [ - "equivalent", - "seize", -] - [[package]] name = "parking_lot" version = "0.12.4" @@ -1459,17 +1373,11 @@ dependencies = [ "syn", ] -[[package]] -name = "percent-encoding" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - [[package]] name = "perf-event" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5396562cd2eaa828445d6d34258ae21ee1eb9d40fe626ca7f51c8dccb4af9d66" +checksum = "b4d6393d9238342159080d79b78cb59c67399a8e7ecfa5d410bd614169e4e823" dependencies = [ "libc", "perf-event-open-sys", @@ -1477,28 +1385,29 @@ dependencies = [ [[package]] name = "perf-event-open-sys" -version = "1.0.1" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce9bedf5da2c234fdf2391ede2b90fabf585355f33100689bc364a3ea558561a" +checksum = "7c44fb1c7651a45a3652c4afc6e754e40b3d6e6556f1487e2b230bfc4f33c2a8" dependencies = [ "libc", ] [[package]] name = "petgraph" -version = "0.6.5" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" dependencies = [ "fixedbitset", - "indexmap 2.11.4", + "hashbrown 0.15.5", + "indexmap 2.14.0", ] [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pkg-config" @@ -1513,12 +1422,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" [[package]] -name = "potential_utf" -version = "0.1.3" +name = "postcard" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" dependencies = [ - "zerovec", + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "heapless", + "serde", ] [[package]] @@ -1528,19 +1441,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] -name = "ppv-lite86" -version = "0.2.21" +name = "prettyplease" +version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ - "zerocopy", + "proc-macro2", + "syn", ] [[package]] name = "proc-macro2" -version = "1.0.101" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] @@ -1560,9 +1474,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.41" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] @@ -1573,42 +1487,53 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + [[package]] name = "ra-ap-rustc_abi" -version = "0.123.0" +version = "0.143.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f18c877575c259d127072e9bfc41d985202262fb4d6bfdae3d1252147c2562c2" +checksum = "1d49dbe5d570793b3c3227972a6ac85fc3e830f09b32c3cb3b68cfceebad3b0a" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.1", "ra-ap-rustc_hashes", "ra-ap-rustc_index", "tracing", ] +[[package]] +name = "ra-ap-rustc_ast_ir" +version = "0.143.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0956db62c264a899d15667993cbbd2e8f0b02108712217e2579c61ac30b94b" + [[package]] name = "ra-ap-rustc_hashes" -version = "0.123.0" +version = "0.143.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2439ed1df3472443133b66949f81080dff88089b42f825761455463709ee1cad" +checksum = "7df512084c24f4c96c8cc9a59cbd264301efbc8913d3759b065398024af316c9" dependencies = [ "rustc-stable-hash", ] [[package]] name = "ra-ap-rustc_index" -version = "0.123.0" +version = "0.143.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a24fe0be21be1f8ebc21dcb40129214fb4cefb0f2753f3d46b6dbe656a1a45" +checksum = "bca3a49a928d38ba7927605e5909b6abe77d09ff359e4695c070c3f91d69cc8a" dependencies = [ "ra-ap-rustc_index_macros", - "smallvec", ] [[package]] name = "ra-ap-rustc_index_macros" -version = "0.123.0" +version = "0.143.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "844a27ddcad0116facae2df8e741fd788662cf93dc13029cd864f2b8013b81f9" +checksum = "4463e908a62c64c2a65c1966c2f4995d0e1f8b7dfc85a8b8de2562edf3d89070" dependencies = [ "proc-macro2", "quote", @@ -1617,9 +1542,9 @@ dependencies = [ [[package]] name = "ra-ap-rustc_lexer" -version = "0.121.0" +version = "0.143.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22944e31fb91e9b3e75bcbc91e37d958b8c0825a6160927f2856831d2ce83b36" +checksum = "228e01e1b237adb4bd8793487e1c37019c1e526a8f93716d99602301be267056" dependencies = [ "memchr", "unicode-properties", @@ -1627,47 +1552,81 @@ dependencies = [ ] [[package]] -name = "ra-ap-rustc_lexer" -version = "0.123.0" +name = "ra-ap-rustc_next_trait_solver" +version = "0.143.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b734cfcb577d09877799a22742f1bd398be6c00bc428d9de56d48d11ece5771" +checksum = "10d6f91143011d474bb844d268b0784c6a4c6db57743558b83f5ad34511627f1" dependencies = [ - "memchr", - "unicode-properties", - "unicode-xid", + "derive-where", + "ra-ap-rustc_index", + "ra-ap-rustc_type_ir", + "ra-ap-rustc_type_ir_macros", + "tracing", ] [[package]] name = "ra-ap-rustc_parse_format" -version = "0.121.0" +version = "0.143.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81057891bc2063ad9e353f29462fbc47a0f5072560af34428ae9313aaa5e9d97" +checksum = "37fa8effbc436c0ddd9d7b1421aa3cccf8b94566c841c4e4aa3e09063b8f423f" dependencies = [ - "ra-ap-rustc_lexer 0.121.0", - "rustc-literal-escaper", + "ra-ap-rustc_lexer", + "rustc-literal-escaper 0.0.5", ] [[package]] name = "ra-ap-rustc_pattern_analysis" -version = "0.123.0" +version = "0.143.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b0ee1f059b9dea0818c6c7267478926eee95ba4c7dcf89c8db32fa165d3904" +checksum = "883c843fc27847ad03b8e772dd4a2d2728af4333a6d6821a22dfcfe7136dff3e" dependencies = [ "ra-ap-rustc_index", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", "rustc_apfloat", "smallvec", "tracing", ] +[[package]] +name = "ra-ap-rustc_type_ir" +version = "0.143.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a86e33c46b2b261a173b23f207461a514812a8b2d2d7935bbc685f733eacce10" +dependencies = [ + "arrayvec", + "bitflags 2.11.1", + "derive-where", + "ena", + "indexmap 2.14.0", + "ra-ap-rustc_ast_ir", + "ra-ap-rustc_index", + "ra-ap-rustc_type_ir_macros", + "rustc-hash 2.1.2", + "smallvec", + "thin-vec", + "tracing", +] + +[[package]] +name = "ra-ap-rustc_type_ir_macros" +version = "0.143.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15034c2fcaa5cf302aea6db20eda0f71fffeb0b372d6073cc50f940e974a2a47" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + [[package]] name = "ra_ap_base_db" -version = "0.0.301" +version = "0.0.328" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e876bb2c3e52a8d4e6684526a2d4e81f9d028b939ee4dc5dc775fe10deb44d59" +checksum = "b1567168e7c7b50acf2ffb87bde8937986d4f41c777a2c308298ede9d555c96c" dependencies = [ "dashmap", - "indexmap 2.11.4", + "indexmap 2.14.0", "la-arena", "ra_ap_cfg", "ra_ap_intern", @@ -1675,7 +1634,7 @@ dependencies = [ "ra_ap_span", "ra_ap_syntax", "ra_ap_vfs", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", "salsa", "salsa-macros", "semver", @@ -1685,32 +1644,33 @@ dependencies = [ [[package]] name = "ra_ap_cfg" -version = "0.0.301" +version = "0.0.328" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a0b56eb4536ce6d2431932c4d337aeeaf7bb22c9249b38cbe80677b5881228f" +checksum = "1e1fc8d53014b0ec4c06c9dbf0a810ccd67b3a96de4ef06bd1a248c2295b6a37" dependencies = [ "ra_ap_intern", + "ra_ap_syntax", "ra_ap_tt", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", "tracing", ] [[package]] name = "ra_ap_edition" -version = "0.0.301" +version = "0.0.328" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bdc6cbe42c63ca78611bae82bfc8db24864f33dccc813697c5fde43a0907285" +checksum = "627a8ce8e870632395b7bf053c93039a3d91dda744ccae166ac83650572cfaa2" [[package]] name = "ra_ap_hir" -version = "0.0.301" +version = "0.0.328" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebffdc134eccabc17209d7760cfff7fd12ed18ab6e21188c5e084b97aa38504c" +checksum = "b77616ef81f690a3eba4befd32112780b99f052676b0e7686a22bf79f3fbe2a8" dependencies = [ "arrayvec", "either", - "indexmap 2.11.4", - "itertools 0.14.0", + "itertools", + "ra-ap-rustc_type_ir", "ra_ap_base_db", "ra_ap_cfg", "ra_ap_hir_def", @@ -1721,7 +1681,8 @@ dependencies = [ "ra_ap_stdx", "ra_ap_syntax", "ra_ap_tt", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", + "serde_json", "smallvec", "tracing", "triomphe", @@ -1729,18 +1690,18 @@ dependencies = [ [[package]] name = "ra_ap_hir_def" -version = "0.0.301" +version = "0.0.328" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81d2337ef59550392d42aa997aa1105a3d6d1c2b3a583c777786bc4a0a074fd5" +checksum = "81504dd727efbaf48704a9c0e18e6491cb9848428376ad37146f37f63571ab3c" dependencies = [ "arrayvec", - "bitflags 2.9.4", + "bitflags 2.11.1", "cov-mark", "drop_bomb", "either", "fst", - "indexmap 2.11.4", - "itertools 0.14.0", + "indexmap 2.14.0", + "itertools", "la-arena", "ra-ap-rustc_abi", "ra-ap-rustc_parse_format", @@ -1748,18 +1709,17 @@ dependencies = [ "ra_ap_cfg", "ra_ap_hir_expand", "ra_ap_intern", - "ra_ap_mbe", "ra_ap_query-group-macro", "ra_ap_span", "ra_ap_stdx", "ra_ap_syntax", + "ra_ap_syntax-bridge", "ra_ap_tt", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", "rustc_apfloat", "salsa", "salsa-macros", "smallvec", - "text-size", "thin-vec", "tracing", "triomphe", @@ -1767,13 +1727,13 @@ dependencies = [ [[package]] name = "ra_ap_hir_expand" -version = "0.0.301" +version = "0.0.328" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97cf8ececb2743a819d8299a408e17f164dd1a1004d65936b3d5493b55330326" +checksum = "9980623345a88d4431ce80331e640c494e2e59303e82a2cb1290b4684efdc6e5" dependencies = [ "cov-mark", "either", - "itertools 0.14.0", + "itertools", "ra_ap_base_db", "ra_ap_cfg", "ra_ap_intern", @@ -1785,110 +1745,119 @@ dependencies = [ "ra_ap_syntax", "ra_ap_syntax-bridge", "ra_ap_tt", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", "salsa", "salsa-macros", "smallvec", + "thin-vec", "tracing", "triomphe", ] [[package]] name = "ra_ap_hir_ty" -version = "0.0.301" +version = "0.0.328" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc004e1099ba766a61500c27d34eb5cd336430d0a89a9620315a90d7a202a73a" +checksum = "b822d1b9f0168281bbba34e0c5abada891fa9fc5e0b54e86493e8b075a877973" dependencies = [ "arrayvec", - "bitflags 2.9.4", - "chalk-derive 0.103.0", - "chalk-ir 0.103.0", - "chalk-recursive", - "chalk-solve", "cov-mark", "either", "ena", - "indexmap 2.11.4", - "itertools 0.14.0", + "indexmap 2.14.0", + "itertools", "la-arena", "oorandom", + "petgraph", "ra-ap-rustc_abi", + "ra-ap-rustc_ast_ir", "ra-ap-rustc_index", + "ra-ap-rustc_next_trait_solver", "ra-ap-rustc_pattern_analysis", + "ra-ap-rustc_type_ir", "ra_ap_base_db", "ra_ap_hir_def", "ra_ap_hir_expand", "ra_ap_intern", + "ra_ap_macros", "ra_ap_query-group-macro", "ra_ap_span", "ra_ap_stdx", "ra_ap_syntax", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", "rustc_apfloat", "salsa", "salsa-macros", - "scoped-tls", + "serde", + "serde_derive", "smallvec", + "thin-vec", "tracing", + "tracing-subscriber", + "tracing-tree", "triomphe", "typed-arena", ] [[package]] name = "ra_ap_ide_db" -version = "0.0.301" +version = "0.0.328" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2acb572d6dbeb1c96d0339890ba91298b8f5f0ab22648da4ee2b4ab77dbc3fe" +checksum = "0e250964a32be6c74f1f72e0fd8aea08aaed0535d85a7fd315fe442942185da0" dependencies = [ "arrayvec", - "bitflags 2.9.4", + "bitflags 2.11.1", "cov-mark", "crossbeam-channel", "either", "fst", - "indexmap 2.11.4", - "itertools 0.14.0", + "itertools", "line-index", "memchr", "nohash-hasher", "ra_ap_base_db", "ra_ap_hir", + "ra_ap_macros", "ra_ap_parser", "ra_ap_profile", "ra_ap_query-group-macro", "ra_ap_span", "ra_ap_stdx", "ra_ap_syntax", + "ra_ap_test_fixture", + "ra_ap_test_utils", "ra_ap_vfs", "rayon", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", "salsa", "salsa-macros", + "smallvec", "tracing", "triomphe", ] [[package]] name = "ra_ap_intern" -version = "0.0.301" +version = "0.0.328" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14586c2c4781b69fdd0c505972d9bff8c162a8740537a3ee506faff686d9a20d" +checksum = "df7edf9d14d093b4314b43ed75eaf56d47d870a09b8d0e0e67d17919c30bfb0f" dependencies = [ "dashmap", "hashbrown 0.14.5", - "rustc-hash 2.1.1", + "rayon", + "rustc-hash 2.1.2", "triomphe", ] [[package]] name = "ra_ap_load-cargo" -version = "0.0.301" +version = "0.0.328" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50ce5546b3e3414507ab4d12348d0a28748062e33a1448895c68466d0b015503" +checksum = "184cdaabfb66948938aa4b73ee24f7fa57c1292292c1d87bcad2c616cbd254ea" dependencies = [ "anyhow", "crossbeam-channel", - "itertools 0.14.0", + "itertools", "ra_ap_hir_expand", "ra_ap_ide_db", "ra_ap_intern", @@ -1901,60 +1870,78 @@ dependencies = [ "tracing", ] +[[package]] +name = "ra_ap_macros" +version = "0.0.328" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd338f982b2f7438ee89ca2429ad7181f2f0751fa6b98d8275905c97e2fb8361" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + [[package]] name = "ra_ap_mbe" -version = "0.0.301" +version = "0.0.328" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67333c6405797cb64aafb994b9a179157b30beeda2352e203e800be2b184a22d" +checksum = "81d4c7114f2363c05b6dc7f5f6cdd6c9d6a1ba63410b0cdc80c81d1414da7c72" dependencies = [ "arrayvec", + "bitflags 2.11.1", "cov-mark", - "ra-ap-rustc_lexer 0.123.0", + "ra-ap-rustc_lexer", "ra_ap_intern", "ra_ap_parser", "ra_ap_span", "ra_ap_stdx", "ra_ap_syntax-bridge", "ra_ap_tt", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", + "salsa", "smallvec", ] [[package]] name = "ra_ap_parser" -version = "0.0.301" +version = "0.0.328" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a3b92b8b147c0826b83e70ad44e3c98e94201fc93e1f09396c43b4d7958c22a" +checksum = "c9851f3b6e93971e6c3957966a07154bc35e0f91c0a6980ad71965620df6f737" dependencies = [ "drop_bomb", - "ra-ap-rustc_lexer 0.123.0", + "ra-ap-rustc_lexer", "ra_ap_edition", - "rustc-literal-escaper", + "rustc-literal-escaper 0.0.4", "tracing", + "winnow 0.7.15", ] [[package]] name = "ra_ap_paths" -version = "0.0.301" +version = "0.0.328" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4991f3d57fac0def7822bebfeb159c8d7b58c824bf82044b765c54f2c0971e2" +checksum = "506bbef9963ca9275dd50f5876d68e32a58d47a369ea10bce2be1c758b081c42" dependencies = [ "camino", ] [[package]] name = "ra_ap_proc_macro_api" -version = "0.0.301" +version = "0.0.328" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45db9e2df587d56f0738afa89fb2c100ff7c1e9cbe49e07f6a8b62342832211b" +checksum = "18e0229d5c7daa016a8f4f735194e68baf34ca18b73982ae036a8217874f32e9" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.14.0", + "postcard", "ra_ap_intern", "ra_ap_paths", "ra_ap_span", "ra_ap_stdx", "ra_ap_tt", - "rustc-hash 2.1.1", + "rayon", + "rustc-hash 2.1.2", + "semver", "serde", "serde_derive", "serde_json", @@ -1963,9 +1950,9 @@ dependencies = [ [[package]] name = "ra_ap_profile" -version = "0.0.301" +version = "0.0.328" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19981637b8ee4160e228c815a7fef3944b5c0555d6af41a931be92d68978bc6c" +checksum = "b251c30d8e4df3902a92d10c4899e43403921f72aef12afa2f027a77e4898950" dependencies = [ "cfg-if", "libc", @@ -1975,13 +1962,13 @@ dependencies = [ [[package]] name = "ra_ap_project_model" -version = "0.0.301" +version = "0.0.328" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bda0769fd6ca949fdd5917acb68ddc2c143745614ddd94ef38b376838611cf8" +checksum = "2b04624412e45c7b0f792859be553182ea2360d8a24bf7162ca212840e683a24" dependencies = [ "anyhow", "cargo_metadata", - "itertools 0.14.0", + "itertools", "la-arena", "ra_ap_base_db", "ra_ap_cfg", @@ -1990,21 +1977,22 @@ dependencies = [ "ra_ap_span", "ra_ap_stdx", "ra_ap_toolchain", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", "semver", "serde", "serde_derive", "serde_json", "temp-dir", + "toml 0.9.12+spec-1.1.0", "tracing", "triomphe", ] [[package]] name = "ra_ap_query-group-macro" -version = "0.0.301" +version = "0.0.328" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f182a4b05f004eabaa83250a5de7ea3a13a92c88f3cbe98bfa1880cd9fbce0a" +checksum = "770079ca5addde33d31b7f3fa8d399f0dc29c26f69642a9d5c2a5e623d8af64d" dependencies = [ "proc-macro2", "quote", @@ -2013,29 +2001,29 @@ dependencies = [ [[package]] name = "ra_ap_span" -version = "0.0.301" +version = "0.0.328" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6f9fa2de07f5cccf431674b90e82c1fe1ea2339db3b3869eec44d135de09a4" +checksum = "80a523bc8c85155ccd1db35b6855d37729d339c572b7fc0801c459bb8218976b" dependencies = [ "hashbrown 0.14.5", "la-arena", "ra_ap_stdx", "ra_ap_syntax", "ra_ap_vfs", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", "salsa", "text-size", ] [[package]] name = "ra_ap_stdx" -version = "0.0.301" +version = "0.0.328" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa770adb32896fcba934b464ac3bd179163ba2b0766e275eed5b4e262e08492b" +checksum = "eb22b95e21d08060860056c86af1b47b2cecbac5422baa112d9d138e97c3671a" dependencies = [ "crossbeam-channel", "crossbeam-utils", - "itertools 0.14.0", + "itertools", "jod-thread", "libc", "miow", @@ -2045,17 +2033,18 @@ dependencies = [ [[package]] name = "ra_ap_syntax" -version = "0.0.301" +version = "0.0.328" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e9e1393281ad5c635239d353ed3cfbf28c8d0af03d0c61a3b24b31d1143b17f" +checksum = "ba3d9c469b5635401647b69e01a9930746f08a3cac51d04ad5ae99e66bdd643f" dependencies = [ "either", - "itertools 0.14.0", + "itertools", "ra_ap_parser", "ra_ap_stdx", "rowan", - "rustc-hash 2.1.1", - "rustc-literal-escaper", + "rustc-hash 2.1.2", + "rustc-literal-escaper 0.0.4", + "smallvec", "smol_str", "tracing", "triomphe", @@ -2063,9 +2052,9 @@ dependencies = [ [[package]] name = "ra_ap_syntax-bridge" -version = "0.0.301" +version = "0.0.328" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "684e6ff1008ee5340335888f0453d94bb38950f110059a51f1818c7f6a56a807" +checksum = "b4d3f2e2a1836eeedc2ed2810ece4cdf7ea42284f71b7031eac8448c1cb95b09" dependencies = [ "ra_ap_intern", "ra_ap_parser", @@ -2073,14 +2062,46 @@ dependencies = [ "ra_ap_stdx", "ra_ap_syntax", "ra_ap_tt", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", +] + +[[package]] +name = "ra_ap_test_fixture" +version = "0.0.328" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21d6d353373b4f28f2236ed7843bcee0e4dd0e6a12b339da874460bbefd070ab" +dependencies = [ + "ra_ap_base_db", + "ra_ap_cfg", + "ra_ap_hir_expand", + "ra_ap_intern", + "ra_ap_paths", + "ra_ap_span", + "ra_ap_stdx", + "ra_ap_test_utils", + "ra_ap_tt", + "triomphe", +] + +[[package]] +name = "ra_ap_test_utils" +version = "0.0.328" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d10cbb0402abee7034de5d90ddf7e380d1e21ad0e1dcd2db92c3c87df78723" +dependencies = [ + "dissimilar", + "ra_ap_paths", + "ra_ap_profile", + "ra_ap_stdx", + "rustc-hash 2.1.2", + "text-size", ] [[package]] name = "ra_ap_toolchain" -version = "0.0.301" +version = "0.0.328" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61969c5f72af03a9837e077c2d939d87a5c863623725c461777c352664a3bb03" +checksum = "2fed946c88a9dfa93de7a376a06493c5377a1052ac666ab9e1155f4ea57271c9" dependencies = [ "camino", "home", @@ -2088,38 +2109,41 @@ dependencies = [ [[package]] name = "ra_ap_tt" -version = "0.0.301" +version = "0.0.328" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb87c7b35572c18a580ea811e970b94875fad5ac7cfa8644266a59081044f959" +checksum = "96dfc20add2675d38240a7815755b54f514d91b9dc0336cb3d024901af4faeef" dependencies = [ "arrayvec", - "ra-ap-rustc_lexer 0.123.0", + "indexmap 2.14.0", + "ra-ap-rustc_lexer", "ra_ap_intern", + "ra_ap_span", "ra_ap_stdx", + "rustc-hash 2.1.2", "text-size", ] [[package]] name = "ra_ap_vfs" -version = "0.0.301" +version = "0.0.328" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c174d6b9b7a7f54687df7e00c3e75ed6f082a7943a9afb1d54f33c0c12773de" +checksum = "d69bc10b59435e4d989d10bc0b602a5bd70e1dcc2c5d8513b10585d9e778b440" dependencies = [ "crossbeam-channel", "fst", - "indexmap 2.11.4", + "indexmap 2.14.0", "nohash-hasher", "ra_ap_paths", "ra_ap_stdx", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", "tracing", ] [[package]] name = "ra_ap_vfs-notify" -version = "0.0.301" +version = "0.0.328" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04f6fce8d47c7ce9b8f2cd0e5a55f8fc4878d6043e61f46cde4391d3a5c6086f" +checksum = "07f7f31bb0c5744ba1fe1b1460eeb62274110dfb94e4b6719cf2e7df9410032d" dependencies = [ "crossbeam-channel", "notify", @@ -2127,45 +2151,33 @@ dependencies = [ "ra_ap_stdx", "ra_ap_vfs", "rayon", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", "tracing", "walkdir", ] [[package]] name = "rand" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" -dependencies = [ - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.9.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" dependencies = [ - "ppv-lite86", + "chacha20", + "getrandom 0.4.2", "rand_core", ] [[package]] name = "rand_core" -version = "0.9.3" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" -dependencies = [ - "getrandom", -] +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" [[package]] name = "rayon" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" dependencies = [ "either", "rayon-core", @@ -2187,7 +2199,7 @@ version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.1", ] [[package]] @@ -2212,9 +2224,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.3" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ "aho-corasick", "memchr", @@ -2224,9 +2236,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.11" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", @@ -2235,15 +2247,15 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.6" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] name = "rowan" -version = "0.15.15" +version = "0.15.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a58fa8a7ccff2aec4f39cc45bf5f985cec7125ab271cf681c279fd00192b49" +checksum = "62f509095fc8cc0c8c8564016771d458079c11a8d857e65861f045145c0d3208" dependencies = [ "countme", "hashbrown 0.14.5", @@ -2268,9 +2280,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc-hash" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" [[package]] name = "rustc-literal-escaper" @@ -2278,6 +2290,12 @@ version = "0.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab03008eb631b703dd16978282ae36c73282e7922fe101a4bd072a40ecea7b8b" +[[package]] +name = "rustc-literal-escaper" +version = "0.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4ee29da77c5a54f42697493cd4c9b9f31b74df666a6c04dfc4fde77abe0438b" + [[package]] name = "rustc-stable-hash" version = "0.1.2" @@ -2290,10 +2308,19 @@ version = "0.2.3+llvm-462a31f5a5ab" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "486c2179b4796f65bfe2ee33679acf0927ac83ecf583ad6c91c3b4570911b9ad" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.11.1", "smallvec", ] +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + [[package]] name = "rustversion" version = "1.0.22" @@ -2308,22 +2335,22 @@ checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "salsa" -version = "0.23.0" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e235afdb8e510f38a07138fbe5a0b64691894358a9c0cbd813b1aade110efc9" +checksum = "e2e2aa2fca57727371eeafc975acc8e6f4c52f8166a78035543f6ee1c74c2dcc" dependencies = [ "boxcar", "crossbeam-queue", "crossbeam-utils", "hashbrown 0.15.5", "hashlink", - "indexmap 2.11.4", + "indexmap 2.14.0", "intrusive-collections", - "papaya", + "inventory", "parking_lot", "portable-atomic", "rayon", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", "salsa-macro-rules", "salsa-macros", "smallvec", @@ -2333,15 +2360,15 @@ dependencies = [ [[package]] name = "salsa-macro-rules" -version = "0.23.0" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2edb86a7e9c91f6d30c9ce054312721dbe773a162db27bbfae834d16177b30ce" +checksum = "1bfc2a1e7bf06964105515451d728f2422dedc3a112383324a00b191a5c397a3" [[package]] name = "salsa-macros" -version = "0.23.0" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0778d6e209051bc4e75acfe83bcd7848601ec3dbe9c3dbb982829020e9128af" +checksum = "3d844c1aa34946da46af683b5c27ec1088a3d9d84a2b837a108223fd830220e1" dependencies = [ "proc-macro2", "quote", @@ -2382,35 +2409,20 @@ dependencies = [ "serde_json", ] -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - [[package]] name = "scopeguard" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "seize" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4b8d813387d566f627f3ea1b914c068aac94c40ae27ec43f5f33bde65abefe7" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - [[package]] name = "semver" -version = "1.0.26" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" dependencies = [ "serde", + "serde_core", ] [[package]] @@ -2423,27 +2435,6 @@ dependencies = [ "serde_derive", ] -[[package]] -name = "serde-untagged" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34836a629bcbc6f1afdf0907a744870039b1e14c0561cb26094fa683b158eff3" -dependencies = [ - "erased-serde", - "serde", - "typeid", -] - -[[package]] -name = "serde-value" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" -dependencies = [ - "ordered-float", - "serde", -] - [[package]] name = "serde_core" version = "1.0.228" @@ -2466,51 +2457,41 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.145" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.14.0", "itoa", "memchr", - "ryu", "serde", "serde_core", + "zmij", ] [[package]] name = "serde_spanned" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_spanned" -version = "1.0.2" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5417783452c2be558477e104686f7de5dae53dba813c28435e0e70f82d9b04ee" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" dependencies = [ "serde_core", ] [[package]] name = "serde_with" -version = "3.14.1" +version = "3.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c522100790450cf78eeac1507263d0a350d4d5b30df0c8e1fe051a10c22b376e" +checksum = "dd5414fad8e6907dbdd5bc441a50ae8d6e26151a03b1de04d89a5576de61d01f" dependencies = [ "base64", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.11.4", + "indexmap 2.14.0", "schemars 0.9.0", "schemars 1.0.4", - "serde", - "serde_derive", + "serde_core", "serde_json", "serde_with_macros", "time", @@ -2518,9 +2499,9 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.14.1" +version = "3.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327ada00f7d64abaac1e55a6911e90cf665aa051b9a561c7006c157f4633135e" +checksum = "d3db8978e608f1fe7357e211969fd9abdcae80bac1ba7a3369bb7eb6b404eb65" dependencies = [ "darling", "proc-macro2", @@ -2534,7 +2515,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.14.0", "itoa", "ryu", "serde", @@ -2564,19 +2545,28 @@ checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "smol_str" -version = "0.3.2" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9676b89cd56310a87b93dec47b11af744f34d5fc9f367b829474eec0a891350d" +checksum = "4aaa7368fcf4852a4c2dd92df0cace6a71f2091ca0a23391ce7f3a31833f1523" dependencies = [ "borsh", - "serde", + "serde_core", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", ] [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "streaming-iterator" @@ -2592,9 +2582,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" -version = "2.0.106" +version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", @@ -2632,18 +2622,18 @@ checksum = "144f754d318415ac792f9d69fc87abbbfc043ce2ef041c60f16ad828f638717d" [[package]] name = "thiserror" -version = "2.0.16" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "2.0.16" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", @@ -2661,129 +2651,105 @@ dependencies = [ [[package]] name = "time" -version = "0.3.43" +version = "0.3.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83bde6f1ec10e72d583d91623c939f623002284ef622b87de38cfd546cbf2031" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" dependencies = [ "deranged", + "itoa", + "libc", "num-conv", + "num_threads", "powerfmt", - "serde", + "serde_core", "time-core", "time-macros", ] [[package]] name = "time-core" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" [[package]] name = "time-macros" -version = "0.2.24" +version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" dependencies = [ "num-conv", "time-core", ] -[[package]] -name = "tinystr" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" -dependencies = [ - "displaydoc", - "zerovec", -] - [[package]] name = "toml" -version = "0.8.23" +version = "0.9.12+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" dependencies = [ - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.11", - "toml_edit", + "indexmap 2.14.0", + "serde_core", + "serde_spanned", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", ] [[package]] name = "toml" -version = "0.9.7" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e5e5d9bf2475ac9d4f0d9edab68cc573dc2fd644b0dba36b0c30a92dd9eaa0" +checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.14.0", "serde_core", - "serde_spanned 1.0.2", - "toml_datetime 0.7.2", + "serde_spanned", + "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", "toml_writer", - "winnow", + "winnow 1.0.1", ] [[package]] name = "toml_datetime" -version = "0.6.11" +version = "0.7.5+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" dependencies = [ - "serde", + "serde_core", ] [[package]] name = "toml_datetime" -version = "0.7.2" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f1085dec27c2b6632b04c80b3bb1b4300d6495d1e129693bdda7d91e72eec1" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" dependencies = [ "serde_core", ] -[[package]] -name = "toml_edit" -version = "0.22.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" -dependencies = [ - "indexmap 2.11.4", - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.11", - "toml_write", - "winnow", -] - [[package]] name = "toml_parser" -version = "1.0.3" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cf893c33be71572e0e9aa6dd15e6677937abd686b066eac3f8cd3531688a627" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ - "winnow", + "winnow 1.0.1", ] -[[package]] -name = "toml_write" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" - [[package]] name = "toml_writer" -version = "1.0.3" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d163a63c116ce562a22cda521fcc4d79152e7aba014456fb5eb442f6d6a10109" +checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "pin-project-lite", "tracing-attributes", @@ -2792,9 +2758,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", @@ -2803,9 +2769,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.34" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", "valuable", @@ -2828,16 +2794,16 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" dependencies = [ - "log 0.4.28", + "log 0.4.29", "once_cell", "tracing-core", ] [[package]] name = "tracing-subscriber" -version = "0.3.20" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" dependencies = [ "matchers", "nu-ansi-term", @@ -2846,11 +2812,24 @@ dependencies = [ "sharded-slab", "smallvec", "thread_local", + "time", "tracing", "tracing-core", "tracing-log", ] +[[package]] +name = "tracing-tree" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac87aa03b6a4d5a7e4810d1a80c19601dbe0f8a837e9177f23af721c7ba7beec" +dependencies = [ + "nu-ansi-term", + "tracing-core", + "tracing-log", + "tracing-subscriber", +] + [[package]] name = "tree-sitter" version = "0.25.9" @@ -2913,9 +2892,9 @@ dependencies = [ [[package]] name = "triomphe" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef8f7726da4807b58ea5c96fdc122f80702030edc33b35aff9190a51148ccc85" +checksum = "dd69c5aa8f924c7519d6372789a74eac5b94fb0f8fcf0d4a97eb0bfc3e785f39" dependencies = [ "serde", "stable_deref_trait", @@ -2927,12 +2906,6 @@ version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" -[[package]] -name = "typeid" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" - [[package]] name = "uncased" version = "0.9.10" @@ -2950,9 +2923,9 @@ checksum = "a3e5df347f0bf3ec1d670aad6ca5c6a1859cd9ea61d2113125794654ccced68f" [[package]] name = "unicode-ident" -version = "1.0.19" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-properties" @@ -2972,24 +2945,6 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" -[[package]] -name = "url" -version = "2.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - [[package]] name = "utf8parse" version = "0.2.2" @@ -3025,21 +2980,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] -name = "wasi" -version = "0.14.5+wasi-0.2.4" +name = "wasip2" +version = "1.0.0+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4494f6290a82f5fe584817a676a34b9d6763e8d9d18204009fb31dceca98fd4" +checksum = "03fa2761397e5bd52002cd7e73110c71af2109aca4e521a9f40473fe685b0a24" dependencies = [ - "wasip2", + "wit-bindgen 0.45.1", ] [[package]] -name = "wasip2" -version = "1.0.0+wasi-0.2.4" +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03fa2761397e5bd52002cd7e73110c71af2109aca4e521a9f40473fe685b0a24" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.51.0", ] [[package]] @@ -3062,7 +3017,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e28d1ba982ca7923fd01448d5c30c6864d0a14109560296a162f80f305fb93bb" dependencies = [ "bumpalo", - "log 0.4.28", + "log 0.4.29", "proc-macro2", "quote", "syn", @@ -3101,6 +3056,40 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap 2.14.0", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.11.1", + "hashbrown 0.15.5", + "indexmap 2.14.0", + "semver", +] + [[package]] name = "winapi-util" version = "0.1.11" @@ -3184,15 +3173,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - [[package]] name = "windows-sys" version = "0.60.2" @@ -3342,128 +3322,121 @@ checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winnow" -version = "0.7.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" -dependencies = [ - "memchr", -] - -[[package]] -name = "wit-bindgen" -version = "0.45.1" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c573471f125075647d03df72e026074b7203790d41351cd6edc96f46bcccd36" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" [[package]] -name = "writeable" -version = "0.6.1" +name = "winnow" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" [[package]] -name = "yansi" -version = "1.0.1" +name = "wit-bindgen" +version = "0.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" +checksum = "5c573471f125075647d03df72e026074b7203790d41351cd6edc96f46bcccd36" [[package]] -name = "yoke" -version = "0.8.0" +name = "wit-bindgen" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", + "wit-bindgen-rust-macro", ] [[package]] -name = "yoke-derive" -version = "0.8.0" +name = "wit-bindgen-core" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", + "anyhow", + "heck", + "wit-parser", ] [[package]] -name = "zerocopy" -version = "0.8.27" +name = "wit-bindgen-rust" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" dependencies = [ - "zerocopy-derive", + "anyhow", + "heck", + "indexmap 2.14.0", + "prettyplease", + "syn", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", ] [[package]] -name = "zerocopy-derive" -version = "0.8.27" +name = "wit-bindgen-rust-macro" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" dependencies = [ + "anyhow", + "prettyplease", "proc-macro2", "quote", "syn", + "wit-bindgen-core", + "wit-bindgen-rust", ] [[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" +name = "wit-component" +version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", + "anyhow", + "bitflags 2.11.1", + "indexmap 2.14.0", + "log 0.4.29", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", ] [[package]] -name = "zerotrie" -version = "0.2.2" +name = "wit-parser" +version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" dependencies = [ - "displaydoc", - "yoke", - "zerofrom", + "anyhow", + "id-arena", + "indexmap 2.14.0", + "log 0.4.29", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", ] [[package]] -name = "zerovec" -version = "0.11.4" +name = "yansi" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] -name = "zerovec-derive" -version = "0.11.1" +name = "zmij" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" [[package]] name = "zstd" diff --git a/ruby/extractor/Cargo.toml b/ruby/extractor/Cargo.toml index b6e1ae901198..09c67fd42f8d 100644 --- a/ruby/extractor/Cargo.toml +++ b/ruby/extractor/Cargo.toml @@ -10,13 +10,13 @@ edition = "2024" tree-sitter = ">= 0.23.0" tree-sitter-embedded-template = "0.25.0" tree-sitter-ruby = "0.23.1" -clap = { version = "4.5", features = ["derive"] } +clap = { version = "4.6", features = ["derive"] } tracing = "0.1" -tracing-subscriber = { version = "0.3.20", features = ["env-filter"] } -rayon = "1.11.0" -regex = "1.11.3" +tracing-subscriber = { version = "0.3.23", features = ["env-filter"] } +rayon = "1.12.0" +regex = "1.12.3" encoding = "0.2" lazy_static = "1.5.0" -serde_json = "1.0.145" +serde_json = "1.0.149" codeql-extractor = { path = "../../shared/tree-sitter-extractor" } diff --git a/rust/ast-generator/Cargo.toml b/rust/ast-generator/Cargo.toml index fcba71b696c1..af12188d240a 100644 --- a/rust/ast-generator/Cargo.toml +++ b/rust/ast-generator/Cargo.toml @@ -7,11 +7,11 @@ license = "MIT" # When updating these dependencies, run `rust/update_cargo_deps.sh` [dependencies] ungrammar = "1.16.1" -proc-macro2 = "1.0.101" -quote = "1.0.41" +proc-macro2 = "1.0.106" +quote = "1.0.45" either = "1.15.0" -stdx = {package = "ra_ap_stdx", version = "0.0.301"} +stdx = {package = "ra_ap_stdx", version = "0.0.328"} itertools = "0.14.0" mustache = "0.9.0" serde = { version = "1.0.228", features = ["derive"] } -anyhow = "1.0.100" +anyhow = "1.0.102" diff --git a/rust/extractor/Cargo.toml b/rust/extractor/Cargo.toml index 223d9dfc68c2..41199b7c8f98 100644 --- a/rust/extractor/Cargo.toml +++ b/rust/extractor/Cargo.toml @@ -6,39 +6,39 @@ license = "MIT" # When updating these dependencies, run `rust/update_cargo_deps.sh` [dependencies] -anyhow = "1.0.100" -clap = { version = "4.5.48", features = ["derive"] } +anyhow = "1.0.102" +clap = { version = "4.6.0", features = ["derive"] } figment = { version = "0.10.19", features = ["env", "yaml"] } num-traits = "0.2.19" -ra_ap_base_db = "0.0.301" -ra_ap_hir = "0.0.301" -ra_ap_hir_def = "0.0.301" -ra_ap_ide_db = "0.0.301" -ra_ap_hir_ty = "0.0.301" -ra_ap_hir_expand = "0.0.301" -ra_ap_load-cargo = "0.0.301" -ra_ap_paths = "0.0.301" -ra_ap_project_model = "0.0.301" -ra_ap_syntax = "0.0.301" -ra_ap_vfs = "0.0.301" -ra_ap_parser = "0.0.301" -ra_ap_span = "0.0.301" -ra_ap_cfg = "0.0.301" -ra_ap_intern = "0.0.301" +ra_ap_base_db = "0.0.328" +ra_ap_hir = "0.0.328" +ra_ap_hir_def = "0.0.328" +ra_ap_ide_db = "0.0.328" +ra_ap_hir_ty = "0.0.328" +ra_ap_hir_expand = "0.0.328" +ra_ap_load-cargo = "0.0.328" +ra_ap_paths = "0.0.328" +ra_ap_project_model = "0.0.328" +ra_ap_syntax = "0.0.328" +ra_ap_vfs = "0.0.328" +ra_ap_parser = "0.0.328" +ra_ap_span = "0.0.328" +ra_ap_cfg = "0.0.328" +ra_ap_intern = "0.0.328" serde = "1.0.228" -serde_with = "3.14.1" -triomphe = "0.1.14" -argfile = "0.2.1" +serde_with = "3.18.0" +triomphe = "0.1.15" +argfile = "1.0.0" codeql-extractor = { path = "../../shared/tree-sitter-extractor" } rust-extractor-macros = { path = "macros" } itertools = "0.14.0" glob = "0.3.3" -chrono = { version = "0.4.42", features = ["serde"] } -serde_json = "1.0.145" +chrono = { version = "0.4.44", features = ["serde"] } +serde_json = "1.0.149" dunce = "1.0.5" -toml = "0.9.7" -tracing = "0.1.41" +toml = "1.1.2" +tracing = "0.1.44" tracing-flame = "0.2.0" -tracing-subscriber = "0.3.20" +tracing-subscriber = "0.3.23" chalk-ir = "0.104.0" mustache = "0.9.0" diff --git a/rust/extractor/macros/Cargo.toml b/rust/extractor/macros/Cargo.toml index e2e51876ee7d..7d370713d5d6 100644 --- a/rust/extractor/macros/Cargo.toml +++ b/rust/extractor/macros/Cargo.toml @@ -9,5 +9,5 @@ proc-macro = true # When updating these dependencies, run `rust/update_cargo_deps.sh` [dependencies] -quote = "1.0.41" -syn = { version = "2.0.106", features = ["full"] } +quote = "1.0.45" +syn = { version = "2.0.117", features = ["full"] } diff --git a/shared/tree-sitter-extractor/Cargo.toml b/shared/tree-sitter-extractor/Cargo.toml index d02f02fd5888..a84266b4f87c 100644 --- a/shared/tree-sitter-extractor/Cargo.toml +++ b/shared/tree-sitter-extractor/Cargo.toml @@ -10,18 +10,18 @@ flate2 = "1.1" globset = "0.4" tree-sitter = ">= 0.23.0" tracing = "0.1" -tracing-subscriber = { version = "0.3.20", features = ["env-filter"] } -rayon = "1.11.0" -regex = "1.11.3" +tracing-subscriber = { version = "0.3.23", features = ["env-filter"] } +rayon = "1.12.0" +regex = "1.12.3" encoding = "0.2" lazy_static = "1.5.0" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" -chrono = { version = "0.4.42", features = ["serde"] } +chrono = { version = "0.4.44", features = ["serde"] } num_cpus = "1.17.0" zstd = "0.13.3" [dev-dependencies] tree-sitter-ql = "0.23.1" tree-sitter-json = "0.24.8" -rand = "0.9.2" +rand = "0.10.1" From 12344713cb7dc5bbac5508891e0025423723586a Mon Sep 17 00:00:00 2001 From: Taus Date: Wed, 15 Apr 2026 13:01:10 +0000 Subject: [PATCH 0006/2098] Bazel: regenerate vendored cargo dependencies --- MODULE.bazel | 64 +- ...3.bazel => BUILD.aho-corasick-1.1.4.bazel} | 4 +- ...UILD.android_system_properties-0.1.5.bazel | 2 +- ....6.20.bazel => BUILD.anstream-1.0.0.bazel} | 12 +- ....0.11.bazel => BUILD.anstyle-1.0.14.bazel} | 2 +- ....bazel => BUILD.anstyle-parse-1.0.0.bazel} | 2 +- ....bazel => BUILD.anstyle-query-1.1.5.bazel} | 8 +- .../BUILD.anstyle-wincon-3.0.10.bazel | 2 +- ...0.100.bazel => BUILD.anyhow-1.0.102.bazel} | 10 +- ...-0.2.1.bazel => BUILD.argfile-1.0.0.bazel} | 4 +- ...azel => BUILD.atomic-polyfill-1.0.3.bazel} | 21 +- .../tree_sitter_extractors_deps/BUILD.bazel | 196 +- ....9.4.bazel => BUILD.bitflags-2.11.1.bazel} | 2 +- ...sh-1.5.7.bazel => BUILD.borsh-1.6.1.bazel} | 6 +- .../BUILD.bstr-1.12.0.bazel | 2 +- .../BUILD.byteorder-1.5.0.bazel | 97 + .../BUILD.bytes-1.11.1.bazel | 97 + ...-1.1.12.bazel => BUILD.camino-1.2.2.bazel} | 14 +- ...bazel => BUILD.cargo-platform-0.3.2.bazel} | 6 +- ...azel => BUILD.cargo_metadata-0.23.1.bazel} | 13 +- ....cc-1.2.37.bazel => BUILD.cc-1.2.60.bazel} | 28 +- ...f-1.0.3.bazel => BUILD.cfg-if-1.0.4.bazel} | 2 +- .../BUILD.chacha20-0.10.0.bazel | 151 ++ .../BUILD.chalk-derive-0.104.0.bazel | 6 +- .../BUILD.chalk-ir-0.103.0.bazel | 103 - .../BUILD.chalk-ir-0.104.0.bazel | 2 +- .../BUILD.chalk-recursive-0.103.0.bazel | 106 - .../BUILD.chalk-solve-0.103.0.bazel | 109 - ...0.4.42.bazel => BUILD.chrono-0.4.44.bazel} | 2 +- ...ap-4.5.48.bazel => BUILD.clap-4.6.0.bazel} | 8 +- ...8.bazel => BUILD.clap_builder-4.6.0.bazel} | 10 +- ...47.bazel => BUILD.clap_derive-4.6.0.bazel} | 10 +- ...0.7.5.bazel => BUILD.clap_lex-1.1.0.bazel} | 4 +- ...map-0.8.0.bazel => BUILD.cobs-0.3.0.bazel} | 12 +- ....4.bazel => BUILD.colorchoice-1.0.5.bazel} | 2 +- .../BUILD.cpufeatures-0.3.0.bazel | 118 + .../BUILD.crc32fast-1.5.0.bazel | 2 +- .../BUILD.critical-section-1.2.0.bazel | 97 + ....21.3.bazel => BUILD.darling-0.23.0.bazel} | 6 +- ....bazel => BUILD.darling_core-0.23.0.bazel} | 9 +- ...bazel => BUILD.darling_macro-0.23.0.bazel} | 8 +- .../BUILD.dashmap-6.1.0.bazel | 4 +- .../BUILD.deranged-0.5.3.bazel | 7 + ...5.bazel => BUILD.derive-where-1.6.1.bazel} | 12 +- .../BUILD.dissimilar-1.0.11.bazel | 97 + .../BUILD.embedded-io-0.4.0.bazel | 97 + ....1.bazel => BUILD.embedded-io-0.6.1.bazel} | 4 +- .../BUILD.ena-0.14.3.bazel | 2 +- ...azel => BUILD.find-msvc-tools-0.1.9.bazel} | 2 +- ....2.bazel => BUILD.fixedbitset-0.5.7.bazel} | 4 +- .../BUILD.fnv-1.0.7.bazel | 101 - .../BUILD.form_urlencoded-1.2.2.bazel | 104 - ...-2.11.0.bazel => BUILD.fs-err-3.3.0.bazel} | 6 +- .../BUILD.fsevent-sys-4.1.0.bazel | 2 +- ....3.3.bazel => BUILD.getrandom-0.3.4.bazel} | 60 +- .../BUILD.getrandom-0.4.2.bazel | 252 ++ .../BUILD.globset-0.4.16.bazel | 8 +- ...s-1.0.1.bazel => BUILD.hash32-0.2.1.bazel} | 9 +- .../BUILD.hashbrown-0.17.0.bazel | 97 + ...0.26.bazel => BUILD.heapless-0.7.17.bazel} | 64 +- ...e-0.5.11.bazel => BUILD.home-0.5.12.bazel} | 10 +- .../BUILD.iana-time-zone-0.1.63.bazel | 2 +- .../BUILD.iana-time-zone-haiku-0.1.2.bazel | 2 +- .../BUILD.icu_collections-2.0.0.bazel | 106 - .../BUILD.icu_locale_core-2.0.0.bazel | 109 - .../BUILD.icu_normalizer-2.0.0.bazel | 110 - .../BUILD.icu_properties-2.0.1.bazel | 112 - .../BUILD.icu_provider-2.0.0.bazel | 114 - .../BUILD.id-arena-2.3.0.bazel | 101 + .../BUILD.idna-1.1.0.bazel | 107 - .../BUILD.idna_adapter-1.2.1.bazel | 104 - ...11.4.bazel => BUILD.indexmap-2.14.0.bazel} | 6 +- .../BUILD.inotify-0.11.0.bazel | 4 +- .../BUILD.inotify-sys-0.1.5.bazel | 2 +- ...5.0.bazel => BUILD.inventory-0.3.24.bazel} | 44 +- ...> BUILD.is_terminal_polyfill-1.70.2.bazel} | 2 +- .../BUILD.itertools-0.12.1.bazel | 105 - ...a-1.0.15.bazel => BUILD.itoa-1.0.18.bazel} | 4 +- .../BUILD.jobserver-0.1.34.bazel | 60 +- .../BUILD.js-sys-0.3.78.bazel | 2 +- .../BUILD.kqueue-1.1.1.bazel | 2 +- .../BUILD.kqueue-sys-1.0.4.bazel | 2 +- .../BUILD.leb128fmt-0.1.0.bazel | 97 + ...0.2.175.bazel => BUILD.libc-0.2.185.bazel} | 6 +- .../BUILD.log-0.3.9.bazel | 2 +- ...og-0.4.28.bazel => BUILD.log-0.4.29.bazel} | 2 +- .../BUILD.matchers-0.2.0.bazel | 2 +- ...r-2.7.5.bazel => BUILD.memchr-2.8.0.bazel} | 2 +- ....mio-1.0.4.bazel => BUILD.mio-1.2.0.bazel} | 70 +- .../BUILD.notify-8.2.0.bazel | 50 +- ...0.1.0.bazel => BUILD.num-conv-0.2.1.bazel} | 2 +- .../BUILD.num_cpus-1.17.0.bazel | 76 +- .../BUILD.num_threads-0.1.7.bazel | 124 + ...1.3.bazel => BUILD.once_cell-1.21.4.bazel} | 2 +- .../BUILD.ordered-float-2.10.1.bazel | 104 - .../BUILD.os_str_bytes-7.1.1.bazel | 2 +- .../BUILD.papaya-0.2.3.bazel | 104 - .../BUILD.parking_lot_core-0.9.11.bazel | 56 +- .../BUILD.pear_codegen-0.2.9.bazel | 6 +- ...4.7.bazel => BUILD.perf-event-0.4.8.bazel} | 10 +- ... => BUILD.perf-event-open-sys-4.0.0.bazel} | 4 +- .../BUILD.petgraph-0.8.3.bazel | 102 + ...el => BUILD.pin-project-lite-0.2.17.bazel} | 2 +- ...0.4.6.bazel => BUILD.postcard-1.1.3.bazel} | 12 +- .../BUILD.potential_utf-0.1.3.bazel | 103 - ....bazel => BUILD.prettyplease-0.2.37.bazel} | 17 +- ....bazel => BUILD.proc-macro2-1.0.106.bazel} | 8 +- ...BUILD.proc-macro2-diagnostics-0.10.1.bazel | 6 +- ...-1.0.41.bazel => BUILD.quote-1.0.45.bazel} | 12 +- .../BUILD.r-efi-6.0.0.bazel | 97 + ...el => BUILD.ra-ap-rustc_abi-0.143.0.bazel} | 14 +- .../BUILD.ra-ap-rustc_ast_ir-0.143.0.bazel | 97 + ...=> BUILD.ra-ap-rustc_hashes-0.143.0.bazel} | 2 +- ... => BUILD.ra-ap-rustc_index-0.143.0.bazel} | 9 +- ...LD.ra-ap-rustc_index_macros-0.143.0.bazel} | 8 +- .../BUILD.ra-ap-rustc_lexer-0.123.0.bazel | 102 - ... => BUILD.ra-ap-rustc_lexer-0.143.0.bazel} | 4 +- ...a-ap-rustc_next_trait_solver-0.143.0.bazel | 111 + ...LD.ra-ap-rustc_parse_format-0.143.0.bazel} | 8 +- ...a-ap-rustc_pattern_analysis-0.143.0.bazel} | 10 +- .../BUILD.ra-ap-rustc_type_ir-0.143.0.bazel | 118 + ....ra-ap-rustc_type_ir_macros-0.143.0.bazel} | 14 +- ...azel => BUILD.ra_ap_base_db-0.0.328.bazel} | 43 +- ...01.bazel => BUILD.ra_ap_cfg-0.0.328.bazel} | 18 +- ...azel => BUILD.ra_ap_edition-0.0.328.bazel} | 2 +- ...01.bazel => BUILD.ra_ap_hir-0.0.328.bazel} | 51 +- ...azel => BUILD.ra_ap_hir_def-0.0.328.bazel} | 61 +- ...l => BUILD.ra_ap_hir_expand-0.0.328.bazel} | 57 +- ...bazel => BUILD.ra_ap_hir_ty-0.0.328.bazel} | 69 +- ...bazel => BUILD.ra_ap_ide_db-0.0.328.bazel} | 65 +- ...bazel => BUILD.ra_ap_intern-0.0.328.bazel} | 7 +- ...l => BUILD.ra_ap_load-cargo-0.0.328.bazel} | 42 +- ...bazel => BUILD.ra_ap_macros-0.0.328.bazel} | 14 +- ...01.bazel => BUILD.ra_ap_mbe-0.0.328.bazel} | 32 +- ...bazel => BUILD.ra_ap_parser-0.0.328.bazel} | 12 +- ....bazel => BUILD.ra_ap_paths-0.0.328.bazel} | 4 +- ... BUILD.ra_ap_proc_macro_api-0.0.328.bazel} | 36 +- ...azel => BUILD.ra_ap_profile-0.0.328.bazel} | 42 +- ...> BUILD.ra_ap_project_model-0.0.328.bazel} | 48 +- ...ILD.ra_ap_query-group-macro-0.0.328.bazel} | 8 +- ...1.bazel => BUILD.ra_ap_span-0.0.328.bazel} | 18 +- ...1.bazel => BUILD.ra_ap_stdx-0.0.328.bazel} | 58 +- ...bazel => BUILD.ra_ap_syntax-0.0.328.bazel} | 24 +- ...> BUILD.ra_ap_syntax-bridge-0.0.328.bazel} | 28 +- .../BUILD.ra_ap_test_fixture-0.0.328.bazel | 123 + ...l => BUILD.ra_ap_test_utils-0.0.328.bazel} | 20 +- ...el => BUILD.ra_ap_toolchain-0.0.328.bazel} | 6 +- .../BUILD.ra_ap_tt-0.0.328.bazel | 115 + ...01.bazel => BUILD.ra_ap_vfs-0.0.328.bazel} | 16 +- ...l => BUILD.ra_ap_vfs-notify-0.0.328.bazel} | 20 +- ...nd-0.9.2.bazel => BUILD.rand-0.10.1.bazel} | 12 +- .../BUILD.rand_chacha-0.9.0.bazel | 104 - .../BUILD.rand_core-0.10.1.bazel | 97 + .../BUILD.rand_core-0.9.3.bazel | 104 - ...-1.11.0.bazel => BUILD.rayon-1.12.0.bazel} | 2 +- .../BUILD.redox_syscall-0.5.17.bazel | 2 +- .../BUILD.ref-cast-impl-1.0.24.bazel | 6 +- ...-1.11.3.bazel => BUILD.regex-1.12.3.bazel} | 10 +- ...azel => BUILD.regex-automata-0.4.14.bazel} | 8 +- ....bazel => BUILD.regex-syntax-0.8.10.bazel} | 2 +- ....15.15.bazel => BUILD.rowan-0.15.18.bazel} | 2 +- ...1.1.bazel => BUILD.rustc-hash-2.1.2.bazel} | 2 +- .../BUILD.rustc-literal-escaper-0.0.5.bazel | 97 + ...ustc_apfloat-0.2.3+llvm-462a31f5a5ab.bazel | 2 +- ....bazel => BUILD.rustc_version-0.4.1.bazel} | 13 +- ...-0.23.0.bazel => BUILD.salsa-0.25.2.bazel} | 18 +- ...l => BUILD.salsa-macro-rules-0.25.2.bazel} | 2 +- ....bazel => BUILD.salsa-macros-0.25.2.bazel} | 11 +- .../BUILD.schemars-0.9.0.bazel | 2 +- .../BUILD.schemars-1.0.4.bazel | 2 +- .../BUILD.semver-1.0.28.bazel | 108 + .../BUILD.serde-untagged-0.1.8.bazel | 102 - .../BUILD.serde-value-0.7.0.bazel | 101 - .../BUILD.serde_core-1.0.228.bazel | 2 + .../BUILD.serde_derive-1.0.228.bazel | 6 +- ...5.bazel => BUILD.serde_json-1.0.149.bazel} | 42 +- ....bazel => BUILD.serde_spanned-1.1.1.bazel} | 4 +- ....1.bazel => BUILD.serde_with-3.18.0.bazel} | 7 +- ...l => BUILD.serde_with_macros-3.18.0.bazel} | 10 +- .../BUILD.serde_yaml-0.9.34+deprecated.bazel | 4 +- ...0.3.2.bazel => BUILD.smol_str-0.3.6.bazel} | 4 +- .../BUILD.spin-0.9.8.bazel | 114 + ...l => BUILD.stable_deref_trait-1.2.1.bazel} | 5 +- ...-2.0.106.bazel => BUILD.syn-2.0.117.bazel} | 9 +- .../BUILD.synstructure-0.13.2.bazel | 6 +- ....16.bazel => BUILD.thiserror-2.0.18.bazel} | 8 +- ...azel => BUILD.thiserror-impl-2.0.18.bazel} | 8 +- .../BUILD.thread_local-1.1.9.bazel | 2 +- .../BUILD.time-0.3.43.bazel | 103 - .../BUILD.time-0.3.47.bazel | 221 ++ ....1.6.bazel => BUILD.time-core-0.1.8.bazel} | 4 +- ...4.bazel => BUILD.time-macros-0.2.27.bazel} | 8 +- .../BUILD.tinystr-0.8.1.bazel | 107 - ...zel => BUILD.toml-0.9.12+spec-1.1.0.bazel} | 12 +- ...azel => BUILD.toml-1.1.2+spec-1.1.0.bazel} | 16 +- ...UILD.toml_datetime-0.7.5+spec-1.1.0.bazel} | 2 +- ...UILD.toml_datetime-1.1.1+spec-1.1.0.bazel} | 8 +- .../BUILD.toml_edit-0.22.27.bazel | 110 - ... BUILD.toml_parser-1.1.2+spec-1.1.0.bazel} | 6 +- .../BUILD.toml_write-0.1.2.bazel | 102 - ... BUILD.toml_writer-1.1.1+spec-1.1.0.bazel} | 4 +- ....1.41.bazel => BUILD.tracing-0.1.44.bazel} | 8 +- ... => BUILD.tracing-attributes-0.1.31.bazel} | 8 +- ....bazel => BUILD.tracing-core-0.1.36.bazel} | 4 +- .../BUILD.tracing-flame-0.2.0.bazel | 4 +- .../BUILD.tracing-log-0.2.0.bazel | 6 +- ... => BUILD.tracing-subscriber-0.3.23.bazel} | 13 +- ...5.bazel => BUILD.tracing-tree-0.4.1.bazel} | 16 +- .../BUILD.tree-sitter-0.25.9.bazel | 8 +- ...tree-sitter-embedded-template-0.25.0.bazel | 2 +- .../BUILD.tree-sitter-json-0.24.8.bazel | 2 +- .../BUILD.tree-sitter-ql-0.23.1.bazel | 2 +- .../BUILD.tree-sitter-ruby-0.23.1.bazel | 2 +- ...1.14.bazel => BUILD.triomphe-0.1.15.bazel} | 6 +- ...bazel => BUILD.unicode-ident-1.0.24.bazel} | 4 +- .../BUILD.url-2.5.7.bazel | 108 - .../BUILD.utf8_iter-1.0.4.bazel | 97 - ...sip3-0.4.0+wasi-0.3.0-rc-2026-01-06.bazel} | 8 +- .../BUILD.wasm-bindgen-0.2.101.bazel | 4 +- .../BUILD.wasm-bindgen-backend-0.2.101.bazel | 8 +- .../BUILD.wasm-bindgen-macro-0.2.101.bazel | 2 +- ...D.wasm-bindgen-macro-support-0.2.101.bazel | 6 +- .../BUILD.wasm-bindgen-shared-0.2.101.bazel | 2 +- ...bazel => BUILD.wasm-encoder-0.244.0.bazel} | 12 +- .../BUILD.wasm-metadata-0.244.0.bazel | 103 + .../BUILD.wasmparser-0.244.0.bazel | 111 + .../BUILD.windows-implement-0.60.0.bazel | 6 +- .../BUILD.windows-interface-0.59.1.bazel | 6 +- .../BUILD.windows-sys-0.52.0.bazel | 1 - .../BUILD.windows-sys-0.59.0.bazel | 109 - .../BUILD.windows-sys-0.61.0.bazel | 3 + .../BUILD.winnow-0.7.13.bazel | 102 - .../BUILD.winnow-0.7.15.bazel | 97 + .../BUILD.winnow-1.0.1.bazel | 97 + ...1.bazel => BUILD.wit-bindgen-0.51.0.bazel} | 18 +- .../BUILD.wit-bindgen-core-0.51.0.bazel | 102 + .../BUILD.wit-bindgen-rust-0.51.0.bazel | 173 ++ .../BUILD.wit-bindgen-rust-macro-0.51.0.bazel | 172 ++ ...azel => BUILD.wit-component-0.244.0.bazel} | 21 +- ...2.bazel => BUILD.wit-parser-0.244.0.bazel} | 28 +- .../BUILD.yoke-0.8.0.bazel | 109 - .../BUILD.zerocopy-derive-0.8.27.bazel | 102 - .../BUILD.zerofrom-0.1.6.bazel | 104 - .../BUILD.zerofrom-derive-0.1.6.bazel | 103 - .../BUILD.zerotrie-0.2.2.bazel | 108 - .../BUILD.zerovec-0.11.4.bazel | 109 - .../BUILD.zerovec-derive-0.11.1.bazel | 102 - ...id-1.0.3.bazel => BUILD.zmij-1.0.21.bazel} | 18 +- .../BUILD.zstd-sys-2.0.16+zstd.1.5.7.bazel | 2 +- .../tree_sitter_extractors_deps/defs.bzl | 2078 ++++++++--------- 250 files changed, 6020 insertions(+), 6056 deletions(-) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.aho-corasick-1.1.3.bazel => BUILD.aho-corasick-1.1.4.bazel} (98%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.anstream-0.6.20.bazel => BUILD.anstream-1.0.0.bazel} (93%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.anstyle-1.0.11.bazel => BUILD.anstyle-1.0.14.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.anstyle-parse-0.2.7.bazel => BUILD.anstyle-parse-1.0.0.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.anstyle-query-1.1.4.bazel => BUILD.anstyle-query-1.1.5.bazel} (95%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.anyhow-1.0.100.bazel => BUILD.anyhow-1.0.102.bazel} (97%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.argfile-0.2.1.bazel => BUILD.argfile-1.0.0.bazel} (98%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.zerocopy-0.8.27.bazel => BUILD.atomic-polyfill-1.0.3.bazel} (94%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.bitflags-2.9.4.bazel => BUILD.bitflags-2.11.1.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.borsh-1.5.7.bazel => BUILD.borsh-1.6.1.bazel} (98%) create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.byteorder-1.5.0.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bytes-1.11.1.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.camino-1.1.12.bazel => BUILD.camino-1.2.2.bazel} (95%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.cargo-platform-0.2.0.bazel => BUILD.cargo-platform-0.3.2.bazel} (97%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.cargo_metadata-0.21.0.bazel => BUILD.cargo_metadata-0.23.1.bazel} (92%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.cc-1.2.37.bazel => BUILD.cc-1.2.60.bazel} (86%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.cfg-if-1.0.3.bazel => BUILD.cfg-if-1.0.4.bazel} (99%) create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chacha20-0.10.0.bazel delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-ir-0.103.0.bazel delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-recursive-0.103.0.bazel delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-solve-0.103.0.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.chrono-0.4.42.bazel => BUILD.chrono-0.4.44.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.clap-4.5.48.bazel => BUILD.clap-4.6.0.bazel} (96%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.clap_builder-4.5.48.bazel => BUILD.clap_builder-4.6.0.bazel} (95%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.clap_derive-4.5.47.bazel => BUILD.clap_derive-4.6.0.bazel} (95%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.clap_lex-0.7.5.bazel => BUILD.clap_lex-1.1.0.bazel} (98%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.litemap-0.8.0.bazel => BUILD.cobs-0.3.0.bazel} (96%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.colorchoice-1.0.4.bazel => BUILD.colorchoice-1.0.5.bazel} (99%) create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cpufeatures-0.3.0.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.critical-section-1.2.0.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.darling-0.21.3.bazel => BUILD.darling-0.23.0.bazel} (96%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.darling_core-0.21.3.bazel => BUILD.darling_core-0.23.0.bazel} (95%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.darling_macro-0.21.3.bazel => BUILD.darling_macro-0.23.0.bazel} (96%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.displaydoc-0.2.5.bazel => BUILD.derive-where-1.6.1.bazel} (94%) create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.dissimilar-1.0.11.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.embedded-io-0.4.0.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.writeable-0.6.1.bazel => BUILD.embedded-io-0.6.1.bazel} (98%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.find-msvc-tools-0.1.1.bazel => BUILD.find-msvc-tools-0.1.9.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.fixedbitset-0.4.2.bazel => BUILD.fixedbitset-0.5.7.bazel} (98%) delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fnv-1.0.7.bazel delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.form_urlencoded-1.2.2.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.fs-err-2.11.0.bazel => BUILD.fs-err-3.3.0.bazel} (98%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.getrandom-0.3.3.bazel => BUILD.getrandom-0.3.4.bazel} (86%) create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.getrandom-0.4.2.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.scoped-tls-1.0.1.bazel => BUILD.hash32-0.2.1.bazel} (96%) create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.17.0.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.semver-1.0.26.bazel => BUILD.heapless-0.7.17.bazel} (70%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.home-0.5.11.bazel => BUILD.home-0.5.12.bazel} (94%) delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.icu_collections-2.0.0.bazel delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.icu_locale_core-2.0.0.bazel delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.icu_normalizer-2.0.0.bazel delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.icu_properties-2.0.1.bazel delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.icu_provider-2.0.0.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.id-arena-2.3.0.bazel delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.idna-1.1.0.bazel delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.idna_adapter-1.2.1.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.indexmap-2.11.4.bazel => BUILD.indexmap-2.14.0.bazel} (97%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.seize-0.5.0.bazel => BUILD.inventory-0.3.24.bazel} (82%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.is_terminal_polyfill-1.70.1.bazel => BUILD.is_terminal_polyfill-1.70.2.bazel} (99%) delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.itertools-0.12.1.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.itoa-1.0.15.bazel => BUILD.itoa-1.0.18.bazel} (98%) create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.leb128fmt-0.1.0.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.libc-0.2.175.bazel => BUILD.libc-0.2.185.bazel} (98%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.log-0.4.28.bazel => BUILD.log-0.4.29.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.memchr-2.7.5.bazel => BUILD.memchr-2.8.0.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.mio-1.0.4.bazel => BUILD.mio-1.2.0.bazel} (66%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.num-conv-0.1.0.bazel => BUILD.num-conv-0.2.1.bazel} (99%) create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num_threads-0.1.7.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.once_cell-1.21.3.bazel => BUILD.once_cell-1.21.4.bazel} (99%) delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ordered-float-2.10.1.bazel delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.papaya-0.2.3.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.perf-event-0.4.7.bazel => BUILD.perf-event-0.4.8.bazel} (95%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.perf-event-open-sys-1.0.1.bazel => BUILD.perf-event-open-sys-4.0.0.bazel} (98%) create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.petgraph-0.8.3.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.pin-project-lite-0.2.16.bazel => BUILD.pin-project-lite-0.2.17.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.erased-serde-0.4.6.bazel => BUILD.postcard-1.1.3.bazel} (94%) delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.potential_utf-0.1.3.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.icu_normalizer_data-2.0.0.bazel => BUILD.prettyplease-0.2.37.bazel} (93%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.proc-macro2-1.0.101.bazel => BUILD.proc-macro2-1.0.106.bazel} (96%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.quote-1.0.41.bazel => BUILD.quote-1.0.45.bazel} (96%) create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.r-efi-6.0.0.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra-ap-rustc_abi-0.123.0.bazel => BUILD.ra-ap-rustc_abi-0.143.0.bazel} (91%) create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_ast_ir-0.143.0.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra-ap-rustc_hashes-0.123.0.bazel => BUILD.ra-ap-rustc_hashes-0.143.0.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra-ap-rustc_index-0.123.0.bazel => BUILD.ra-ap-rustc_index-0.143.0.bazel} (94%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra-ap-rustc_index_macros-0.123.0.bazel => BUILD.ra-ap-rustc_index_macros-0.143.0.bazel} (96%) delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_lexer-0.123.0.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra-ap-rustc_lexer-0.121.0.bazel => BUILD.ra-ap-rustc_lexer-0.143.0.bazel} (98%) create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_next_trait_solver-0.143.0.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra-ap-rustc_parse_format-0.121.0.bazel => BUILD.ra-ap-rustc_parse_format-0.143.0.bazel} (95%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra-ap-rustc_pattern_analysis-0.123.0.bazel => BUILD.ra-ap-rustc_pattern_analysis-0.143.0.bazel} (94%) create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_type_ir-0.143.0.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.yoke-derive-0.8.0.bazel => BUILD.ra-ap-rustc_type_ir_macros-0.143.0.bazel} (93%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_base_db-0.0.301.bazel => BUILD.ra_ap_base_db-0.0.328.bazel} (79%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_cfg-0.0.301.bazel => BUILD.ra_ap_cfg-0.0.328.bazel} (88%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_edition-0.0.301.bazel => BUILD.ra_ap_edition-0.0.328.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_hir-0.0.301.bazel => BUILD.ra_ap_hir-0.0.328.bazel} (74%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_hir_def-0.0.301.bazel => BUILD.ra_ap_hir_def-0.0.328.bazel} (73%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_hir_expand-0.0.301.bazel => BUILD.ra_ap_hir_expand-0.0.328.bazel} (73%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_hir_ty-0.0.301.bazel => BUILD.ra_ap_hir_ty-0.0.328.bazel} (68%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_ide_db-0.0.301.bazel => BUILD.ra_ap_ide_db-0.0.328.bazel} (69%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_intern-0.0.301.bazel => BUILD.ra_ap_intern-0.0.328.bazel} (96%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_load-cargo-0.0.301.bazel => BUILD.ra_ap_load-cargo-0.0.328.bazel} (78%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.chalk-derive-0.103.0.bazel => BUILD.ra_ap_macros-0.0.328.bazel} (94%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_mbe-0.0.301.bazel => BUILD.ra_ap_mbe-0.0.328.bazel} (81%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_parser-0.0.301.bazel => BUILD.ra_ap_parser-0.0.328.bazel} (93%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_paths-0.0.301.bazel => BUILD.ra_ap_paths-0.0.328.bazel} (98%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_proc_macro_api-0.0.301.bazel => BUILD.ra_ap_proc_macro_api-0.0.328.bazel} (80%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_profile-0.0.301.bazel => BUILD.ra_ap_profile-0.0.328.bazel} (73%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_project_model-0.0.301.bazel => BUILD.ra_ap_project_model-0.0.328.bazel} (76%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_query-group-macro-0.0.301.bazel => BUILD.ra_ap_query-group-macro-0.0.328.bazel} (96%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_span-0.0.301.bazel => BUILD.ra_ap_span-0.0.328.bazel} (90%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_stdx-0.0.301.bazel => BUILD.ra_ap_stdx-0.0.328.bazel} (80%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_syntax-0.0.301.bazel => BUILD.ra_ap_syntax-0.0.328.bazel} (87%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_syntax-bridge-0.0.301.bazel => BUILD.ra_ap_syntax-bridge-0.0.328.bazel} (84%) create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_test_fixture-0.0.328.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_tt-0.0.301.bazel => BUILD.ra_ap_test_utils-0.0.328.bazel} (87%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_toolchain-0.0.301.bazel => BUILD.ra_ap_toolchain-0.0.328.bazel} (97%) create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_tt-0.0.328.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_vfs-0.0.301.bazel => BUILD.ra_ap_vfs-0.0.328.bazel} (91%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_vfs-notify-0.0.301.bazel => BUILD.ra_ap_vfs-notify-0.0.328.bazel} (89%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.rand-0.9.2.bazel => BUILD.rand-0.10.1.bazel} (95%) delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand_chacha-0.9.0.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand_core-0.10.1.bazel delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand_core-0.9.3.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.rayon-1.11.0.bazel => BUILD.rayon-1.12.0.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.regex-1.11.3.bazel => BUILD.regex-1.12.3.bazel} (94%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.regex-automata-0.4.11.bazel => BUILD.regex-automata-0.4.14.bazel} (96%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.regex-syntax-0.8.6.bazel => BUILD.regex-syntax-0.8.10.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.rowan-0.15.15.bazel => BUILD.rowan-0.15.18.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.rustc-hash-2.1.1.bazel => BUILD.rustc-hash-2.1.2.bazel} (99%) create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-literal-escaper-0.0.5.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.percent-encoding-2.3.2.bazel => BUILD.rustc_version-0.4.1.bazel} (96%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.salsa-0.23.0.bazel => BUILD.salsa-0.25.2.bazel} (92%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.salsa-macro-rules-0.23.0.bazel => BUILD.salsa-macro-rules-0.25.2.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.salsa-macros-0.23.0.bazel => BUILD.salsa-macros-0.25.2.bazel} (95%) create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.semver-1.0.28.bazel delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde-untagged-0.1.8.bazel delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde-value-0.7.0.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.serde_json-1.0.145.bazel => BUILD.serde_json-1.0.149.bazel} (91%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.serde_spanned-1.0.2.bazel => BUILD.serde_spanned-1.1.1.bazel} (98%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.serde_with-3.14.1.bazel => BUILD.serde_with-3.18.0.bazel} (95%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.serde_with_macros-3.14.1.bazel => BUILD.serde_with_macros-3.18.0.bazel} (95%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.smol_str-0.3.2.bazel => BUILD.smol_str-0.3.6.bazel} (98%) create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.spin-0.9.8.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.stable_deref_trait-1.2.0.bazel => BUILD.stable_deref_trait-1.2.1.bazel} (98%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.syn-2.0.106.bazel => BUILD.syn-2.0.117.bazel} (95%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.thiserror-2.0.16.bazel => BUILD.thiserror-2.0.18.bazel} (96%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.thiserror-impl-2.0.16.bazel => BUILD.thiserror-impl-2.0.18.bazel} (96%) delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-0.3.43.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-0.3.47.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.time-core-0.1.6.bazel => BUILD.time-core-0.1.8.bazel} (98%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.time-macros-0.2.24.bazel => BUILD.time-macros-0.2.27.bazel} (96%) delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tinystr-0.8.1.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.toml-0.9.7.bazel => BUILD.toml-0.9.12+spec-1.1.0.bazel} (92%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.toml-0.8.23.bazel => BUILD.toml-1.1.2+spec-1.1.0.bazel} (90%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.toml_datetime-0.7.2.bazel => BUILD.toml_datetime-0.7.5+spec-1.1.0.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.toml_datetime-0.6.11.bazel => BUILD.toml_datetime-1.1.1+spec-1.1.0.bazel} (96%) delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_edit-0.22.27.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.toml_parser-1.0.3.bazel => BUILD.toml_parser-1.1.2+spec-1.1.0.bazel} (97%) delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_write-0.1.2.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.toml_writer-1.0.3.bazel => BUILD.toml_writer-1.1.1+spec-1.1.0.bazel} (98%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.tracing-0.1.41.bazel => BUILD.tracing-0.1.44.bazel} (95%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.tracing-attributes-0.1.30.bazel => BUILD.tracing-attributes-0.1.31.bazel} (96%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.tracing-core-0.1.34.bazel => BUILD.tracing-core-0.1.36.bazel} (98%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.tracing-subscriber-0.3.20.bazel => BUILD.tracing-subscriber-0.3.23.bazel} (93%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.petgraph-0.6.5.bazel => BUILD.tracing-tree-0.4.1.bazel} (92%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.triomphe-0.1.14.bazel => BUILD.triomphe-0.1.15.bazel} (97%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.unicode-ident-1.0.19.bazel => BUILD.unicode-ident-1.0.24.bazel} (98%) delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.url-2.5.7.bazel delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.utf8_iter-1.0.4.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.wasi-0.14.5+wasi-0.2.4.bazel => BUILD.wasip3-0.4.0+wasi-0.3.0-rc-2026-01-06.bazel} (96%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ppv-lite86-0.2.21.bazel => BUILD.wasm-encoder-0.244.0.bazel} (94%) create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-metadata-0.244.0.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasmparser-0.244.0.bazel delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-sys-0.59.0.bazel delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winnow-0.7.13.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winnow-0.7.15.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winnow-1.0.1.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.icu_properties_data-2.0.1.bazel => BUILD.wit-bindgen-0.51.0.bazel} (94%) create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-core-0.51.0.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-rust-0.51.0.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-rust-macro-0.51.0.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.serde_spanned-0.6.9.bazel => BUILD.wit-component-0.244.0.bazel} (86%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.cargo-util-schemas-0.8.2.bazel => BUILD.wit-parser-0.244.0.bazel} (86%) delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.yoke-0.8.0.bazel delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zerocopy-derive-0.8.27.bazel delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zerofrom-0.1.6.bazel delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zerofrom-derive-0.1.6.bazel delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zerotrie-0.2.2.bazel delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zerovec-0.11.4.bazel delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zerovec-derive-0.11.1.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.typeid-1.0.3.bazel => BUILD.zmij-1.0.21.bazel} (95%) diff --git a/MODULE.bazel b/MODULE.bazel index 16b4a4691f8a..dfc9a0c9144a 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -100,11 +100,11 @@ use_repo( tree_sitter_extractors_deps = use_extension("//misc/bazel/3rdparty:tree_sitter_extractors_extension.bzl", "r") use_repo( tree_sitter_extractors_deps, - "vendor_ts__anyhow-1.0.100", - "vendor_ts__argfile-0.2.1", + "vendor_ts__anyhow-1.0.102", + "vendor_ts__argfile-1.0.0", "vendor_ts__chalk-ir-0.104.0", - "vendor_ts__chrono-0.4.42", - "vendor_ts__clap-4.5.48", + "vendor_ts__chrono-0.4.44", + "vendor_ts__clap-4.6.0", "vendor_ts__dunce-1.0.5", "vendor_ts__either-1.15.0", "vendor_ts__encoding-0.2.33", @@ -117,41 +117,41 @@ use_repo( "vendor_ts__mustache-0.9.0", "vendor_ts__num-traits-0.2.19", "vendor_ts__num_cpus-1.17.0", - "vendor_ts__proc-macro2-1.0.101", - "vendor_ts__quote-1.0.41", - "vendor_ts__ra_ap_base_db-0.0.301", - "vendor_ts__ra_ap_cfg-0.0.301", - "vendor_ts__ra_ap_hir-0.0.301", - "vendor_ts__ra_ap_hir_def-0.0.301", - "vendor_ts__ra_ap_hir_expand-0.0.301", - "vendor_ts__ra_ap_hir_ty-0.0.301", - "vendor_ts__ra_ap_ide_db-0.0.301", - "vendor_ts__ra_ap_intern-0.0.301", - "vendor_ts__ra_ap_load-cargo-0.0.301", - "vendor_ts__ra_ap_parser-0.0.301", - "vendor_ts__ra_ap_paths-0.0.301", - "vendor_ts__ra_ap_project_model-0.0.301", - "vendor_ts__ra_ap_span-0.0.301", - "vendor_ts__ra_ap_stdx-0.0.301", - "vendor_ts__ra_ap_syntax-0.0.301", - "vendor_ts__ra_ap_vfs-0.0.301", - "vendor_ts__rand-0.9.2", - "vendor_ts__rayon-1.11.0", - "vendor_ts__regex-1.11.3", + "vendor_ts__proc-macro2-1.0.106", + "vendor_ts__quote-1.0.45", + "vendor_ts__ra_ap_base_db-0.0.328", + "vendor_ts__ra_ap_cfg-0.0.328", + "vendor_ts__ra_ap_hir-0.0.328", + "vendor_ts__ra_ap_hir_def-0.0.328", + "vendor_ts__ra_ap_hir_expand-0.0.328", + "vendor_ts__ra_ap_hir_ty-0.0.328", + "vendor_ts__ra_ap_ide_db-0.0.328", + "vendor_ts__ra_ap_intern-0.0.328", + "vendor_ts__ra_ap_load-cargo-0.0.328", + "vendor_ts__ra_ap_parser-0.0.328", + "vendor_ts__ra_ap_paths-0.0.328", + "vendor_ts__ra_ap_project_model-0.0.328", + "vendor_ts__ra_ap_span-0.0.328", + "vendor_ts__ra_ap_stdx-0.0.328", + "vendor_ts__ra_ap_syntax-0.0.328", + "vendor_ts__ra_ap_vfs-0.0.328", + "vendor_ts__rand-0.10.1", + "vendor_ts__rayon-1.12.0", + "vendor_ts__regex-1.12.3", "vendor_ts__serde-1.0.228", - "vendor_ts__serde_json-1.0.145", - "vendor_ts__serde_with-3.14.1", - "vendor_ts__syn-2.0.106", - "vendor_ts__toml-0.9.7", - "vendor_ts__tracing-0.1.41", + "vendor_ts__serde_json-1.0.149", + "vendor_ts__serde_with-3.18.0", + "vendor_ts__syn-2.0.117", + "vendor_ts__toml-1.1.2-spec-1.1.0", + "vendor_ts__tracing-0.1.44", "vendor_ts__tracing-flame-0.2.0", - "vendor_ts__tracing-subscriber-0.3.20", + "vendor_ts__tracing-subscriber-0.3.23", "vendor_ts__tree-sitter-0.25.9", "vendor_ts__tree-sitter-embedded-template-0.25.0", "vendor_ts__tree-sitter-json-0.24.8", "vendor_ts__tree-sitter-ql-0.23.1", "vendor_ts__tree-sitter-ruby-0.23.1", - "vendor_ts__triomphe-0.1.14", + "vendor_ts__triomphe-0.1.15", "vendor_ts__ungrammar-1.16.1", "vendor_ts__zstd-0.13.3", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.aho-corasick-1.1.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.aho-corasick-1.1.4.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.aho-corasick-1.1.3.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.aho-corasick-1.1.4.bazel index 29ac012c7637..5f173cfeddb3 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.aho-corasick-1.1.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.aho-corasick-1.1.4.bazel @@ -98,8 +98,8 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.1.3", + version = "1.1.4", deps = [ - "@vendor_ts__memchr-2.7.5//:memchr", + "@vendor_ts__memchr-2.8.0//:memchr", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.android_system_properties-0.1.5.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.android_system_properties-0.1.5.bazel index 165cf9da2fdb..ad16f969e7fb 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.android_system_properties-0.1.5.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.android_system_properties-0.1.5.bazel @@ -95,6 +95,6 @@ rust_library( }), version = "0.1.5", deps = [ - "@vendor_ts__libc-0.2.175//:libc", + "@vendor_ts__libc-0.2.185//:libc", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstream-0.6.20.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstream-1.0.0.bazel similarity index 93% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstream-0.6.20.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstream-1.0.0.bazel index bd6489b11e33..e1d853566436 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstream-0.6.20.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstream-1.0.0.bazel @@ -98,13 +98,13 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.6.20", + version = "1.0.0", deps = [ - "@vendor_ts__anstyle-1.0.11//:anstyle", - "@vendor_ts__anstyle-parse-0.2.7//:anstyle_parse", - "@vendor_ts__anstyle-query-1.1.4//:anstyle_query", - "@vendor_ts__colorchoice-1.0.4//:colorchoice", - "@vendor_ts__is_terminal_polyfill-1.70.1//:is_terminal_polyfill", + "@vendor_ts__anstyle-1.0.14//:anstyle", + "@vendor_ts__anstyle-parse-1.0.0//:anstyle_parse", + "@vendor_ts__anstyle-query-1.1.5//:anstyle_query", + "@vendor_ts__colorchoice-1.0.5//:colorchoice", + "@vendor_ts__is_terminal_polyfill-1.70.2//:is_terminal_polyfill", "@vendor_ts__utf8parse-0.2.2//:utf8parse", ] + select({ "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [ diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-1.0.11.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-1.0.14.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-1.0.11.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-1.0.14.bazel index 1739823d66f4..31423b2f54ce 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-1.0.11.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-1.0.14.bazel @@ -97,5 +97,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.11", + version = "1.0.14", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-parse-0.2.7.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-parse-1.0.0.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-parse-0.2.7.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-parse-1.0.0.bazel index d2c9594f554a..e953847f8c00 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-parse-0.2.7.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-parse-1.0.0.bazel @@ -97,7 +97,7 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.2.7", + version = "1.0.0", deps = [ "@vendor_ts__utf8parse-0.2.2//:utf8parse", ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-query-1.1.4.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-query-1.1.5.bazel similarity index 95% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-query-1.1.4.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-query-1.1.5.bazel index fe3361ea4119..4b43c9a2e48e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-query-1.1.4.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-query-1.1.5.bazel @@ -93,16 +93,16 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.1.4", + version = "1.1.5", deps = select({ "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [ - "@vendor_ts__windows-sys-0.60.2//:windows_sys", # cfg(windows) + "@vendor_ts__windows-sys-0.61.0//:windows_sys", # cfg(windows) ], "@rules_rust//rust/platform:i686-pc-windows-msvc": [ - "@vendor_ts__windows-sys-0.60.2//:windows_sys", # cfg(windows) + "@vendor_ts__windows-sys-0.61.0//:windows_sys", # cfg(windows) ], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [ - "@vendor_ts__windows-sys-0.60.2//:windows_sys", # cfg(windows) + "@vendor_ts__windows-sys-0.61.0//:windows_sys", # cfg(windows) ], "//conditions:default": [], }), diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-wincon-3.0.10.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-wincon-3.0.10.bazel index 822d2d90ec43..820fcd42ddee 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-wincon-3.0.10.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-wincon-3.0.10.bazel @@ -95,7 +95,7 @@ rust_library( }), version = "3.0.10", deps = [ - "@vendor_ts__anstyle-1.0.11//:anstyle", + "@vendor_ts__anstyle-1.0.14//:anstyle", ] + select({ "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [ "@vendor_ts__once_cell_polyfill-1.70.1//:once_cell_polyfill", # cfg(windows) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anyhow-1.0.100.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anyhow-1.0.102.bazel similarity index 97% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anyhow-1.0.100.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anyhow-1.0.102.bazel index 48f6fcce1426..99de10c1ab76 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anyhow-1.0.100.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anyhow-1.0.102.bazel @@ -43,7 +43,7 @@ rust_library( "std", ], crate_root = "src/lib.rs", - edition = "2018", + edition = "2021", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -101,9 +101,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.100", + version = "1.0.102", deps = [ - "@vendor_ts__anyhow-1.0.100//:build_script_build", + "@vendor_ts__anyhow-1.0.102//:build_script_build", ], ) @@ -144,7 +144,7 @@ cargo_build_script( "WORKSPACE.bazel", ], ), - edition = "2018", + edition = "2021", pkg_name = "anyhow", rustc_env_files = [ ":cargo_toml_env_vars", @@ -159,7 +159,7 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "1.0.100", + version = "1.0.102", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.argfile-0.2.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.argfile-1.0.0.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.argfile-0.2.1.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.argfile-1.0.0.bazel index 4a1e9ba79158..e8a8c7fd6262 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.argfile-0.2.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.argfile-1.0.0.bazel @@ -96,9 +96,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.2.1", + version = "1.0.0", deps = [ - "@vendor_ts__fs-err-2.11.0//:fs_err", + "@vendor_ts__fs-err-3.3.0//:fs_err", "@vendor_ts__os_str_bytes-7.1.1//:os_str_bytes", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zerocopy-0.8.27.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.atomic-polyfill-1.0.3.bazel similarity index 94% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zerocopy-0.8.27.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.atomic-polyfill-1.0.3.bazel index e0fee3f0f2ec..f20f39c53dca 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zerocopy-0.8.27.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.atomic-polyfill-1.0.3.bazel @@ -21,7 +21,7 @@ cargo_toml_env_vars( ) rust_library( - name = "zerocopy", + name = "atomic_polyfill", srcs = glob( include = ["**/*.rs"], allow_empty = True, @@ -38,9 +38,6 @@ rust_library( "WORKSPACE.bazel", ], ), - crate_features = [ - "simd", - ], crate_root = "src/lib.rs", edition = "2021", rustc_env_files = [ @@ -51,7 +48,7 @@ rust_library( ], tags = [ "cargo-bazel", - "crate-name=zerocopy", + "crate-name=atomic-polyfill", "manual", "noclippy", "norustfmt", @@ -100,9 +97,10 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.8.27", + version = "1.0.3", deps = [ - "@vendor_ts__zerocopy-0.8.27//:build_script_build", + "@vendor_ts__atomic-polyfill-1.0.3//:build_script_build", + "@vendor_ts__critical-section-1.2.0//:critical_section", ], ) @@ -125,9 +123,6 @@ cargo_build_script( "WORKSPACE.bazel", ], ), - crate_features = [ - "simd", - ], crate_name = "build_script_build", crate_root = "build.rs", data = glob( @@ -143,7 +138,7 @@ cargo_build_script( ], ), edition = "2021", - pkg_name = "zerocopy", + pkg_name = "atomic-polyfill", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -152,12 +147,12 @@ cargo_build_script( ], tags = [ "cargo-bazel", - "crate-name=zerocopy", + "crate-name=atomic-polyfill", "manual", "noclippy", "norustfmt", ], - version = "0.8.27", + version = "1.0.3", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bazel index a5cfeccdcea8..b4965e15d280 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bazel @@ -32,26 +32,26 @@ filegroup( # Workspace Member Dependencies alias( - name = "anyhow-1.0.100", - actual = "@vendor_ts__anyhow-1.0.100//:anyhow", + name = "anyhow-1.0.102", + actual = "@vendor_ts__anyhow-1.0.102//:anyhow", tags = ["manual"], ) alias( name = "anyhow", - actual = "@vendor_ts__anyhow-1.0.100//:anyhow", + actual = "@vendor_ts__anyhow-1.0.102//:anyhow", tags = ["manual"], ) alias( - name = "argfile-0.2.1", - actual = "@vendor_ts__argfile-0.2.1//:argfile", + name = "argfile-1.0.0", + actual = "@vendor_ts__argfile-1.0.0//:argfile", tags = ["manual"], ) alias( name = "argfile", - actual = "@vendor_ts__argfile-0.2.1//:argfile", + actual = "@vendor_ts__argfile-1.0.0//:argfile", tags = ["manual"], ) @@ -68,26 +68,26 @@ alias( ) alias( - name = "chrono-0.4.42", - actual = "@vendor_ts__chrono-0.4.42//:chrono", + name = "chrono-0.4.44", + actual = "@vendor_ts__chrono-0.4.44//:chrono", tags = ["manual"], ) alias( name = "chrono", - actual = "@vendor_ts__chrono-0.4.42//:chrono", + actual = "@vendor_ts__chrono-0.4.44//:chrono", tags = ["manual"], ) alias( - name = "clap-4.5.48", - actual = "@vendor_ts__clap-4.5.48//:clap", + name = "clap-4.6.0", + actual = "@vendor_ts__clap-4.6.0//:clap", tags = ["manual"], ) alias( name = "clap", - actual = "@vendor_ts__clap-4.5.48//:clap", + actual = "@vendor_ts__clap-4.6.0//:clap", tags = ["manual"], ) @@ -236,260 +236,260 @@ alias( ) alias( - name = "proc-macro2-1.0.101", - actual = "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", + name = "proc-macro2-1.0.106", + actual = "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", tags = ["manual"], ) alias( name = "proc-macro2", - actual = "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", + actual = "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", tags = ["manual"], ) alias( - name = "quote-1.0.41", - actual = "@vendor_ts__quote-1.0.41//:quote", + name = "quote-1.0.45", + actual = "@vendor_ts__quote-1.0.45//:quote", tags = ["manual"], ) alias( name = "quote", - actual = "@vendor_ts__quote-1.0.41//:quote", + actual = "@vendor_ts__quote-1.0.45//:quote", tags = ["manual"], ) alias( - name = "ra_ap_base_db-0.0.301", - actual = "@vendor_ts__ra_ap_base_db-0.0.301//:ra_ap_base_db", + name = "ra_ap_base_db-0.0.328", + actual = "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db", tags = ["manual"], ) alias( name = "ra_ap_base_db", - actual = "@vendor_ts__ra_ap_base_db-0.0.301//:ra_ap_base_db", + actual = "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db", tags = ["manual"], ) alias( - name = "ra_ap_cfg-0.0.301", - actual = "@vendor_ts__ra_ap_cfg-0.0.301//:ra_ap_cfg", + name = "ra_ap_cfg-0.0.328", + actual = "@vendor_ts__ra_ap_cfg-0.0.328//:ra_ap_cfg", tags = ["manual"], ) alias( name = "ra_ap_cfg", - actual = "@vendor_ts__ra_ap_cfg-0.0.301//:ra_ap_cfg", + actual = "@vendor_ts__ra_ap_cfg-0.0.328//:ra_ap_cfg", tags = ["manual"], ) alias( - name = "ra_ap_hir-0.0.301", - actual = "@vendor_ts__ra_ap_hir-0.0.301//:ra_ap_hir", + name = "ra_ap_hir-0.0.328", + actual = "@vendor_ts__ra_ap_hir-0.0.328//:ra_ap_hir", tags = ["manual"], ) alias( name = "ra_ap_hir", - actual = "@vendor_ts__ra_ap_hir-0.0.301//:ra_ap_hir", + actual = "@vendor_ts__ra_ap_hir-0.0.328//:ra_ap_hir", tags = ["manual"], ) alias( - name = "ra_ap_hir_def-0.0.301", - actual = "@vendor_ts__ra_ap_hir_def-0.0.301//:ra_ap_hir_def", + name = "ra_ap_hir_def-0.0.328", + actual = "@vendor_ts__ra_ap_hir_def-0.0.328//:ra_ap_hir_def", tags = ["manual"], ) alias( name = "ra_ap_hir_def", - actual = "@vendor_ts__ra_ap_hir_def-0.0.301//:ra_ap_hir_def", + actual = "@vendor_ts__ra_ap_hir_def-0.0.328//:ra_ap_hir_def", tags = ["manual"], ) alias( - name = "ra_ap_hir_expand-0.0.301", - actual = "@vendor_ts__ra_ap_hir_expand-0.0.301//:ra_ap_hir_expand", + name = "ra_ap_hir_expand-0.0.328", + actual = "@vendor_ts__ra_ap_hir_expand-0.0.328//:ra_ap_hir_expand", tags = ["manual"], ) alias( name = "ra_ap_hir_expand", - actual = "@vendor_ts__ra_ap_hir_expand-0.0.301//:ra_ap_hir_expand", + actual = "@vendor_ts__ra_ap_hir_expand-0.0.328//:ra_ap_hir_expand", tags = ["manual"], ) alias( - name = "ra_ap_hir_ty-0.0.301", - actual = "@vendor_ts__ra_ap_hir_ty-0.0.301//:ra_ap_hir_ty", + name = "ra_ap_hir_ty-0.0.328", + actual = "@vendor_ts__ra_ap_hir_ty-0.0.328//:ra_ap_hir_ty", tags = ["manual"], ) alias( name = "ra_ap_hir_ty", - actual = "@vendor_ts__ra_ap_hir_ty-0.0.301//:ra_ap_hir_ty", + actual = "@vendor_ts__ra_ap_hir_ty-0.0.328//:ra_ap_hir_ty", tags = ["manual"], ) alias( - name = "ra_ap_ide_db-0.0.301", - actual = "@vendor_ts__ra_ap_ide_db-0.0.301//:ra_ap_ide_db", + name = "ra_ap_ide_db-0.0.328", + actual = "@vendor_ts__ra_ap_ide_db-0.0.328//:ra_ap_ide_db", tags = ["manual"], ) alias( name = "ra_ap_ide_db", - actual = "@vendor_ts__ra_ap_ide_db-0.0.301//:ra_ap_ide_db", + actual = "@vendor_ts__ra_ap_ide_db-0.0.328//:ra_ap_ide_db", tags = ["manual"], ) alias( - name = "ra_ap_intern-0.0.301", - actual = "@vendor_ts__ra_ap_intern-0.0.301//:ra_ap_intern", + name = "ra_ap_intern-0.0.328", + actual = "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern", tags = ["manual"], ) alias( name = "ra_ap_intern", - actual = "@vendor_ts__ra_ap_intern-0.0.301//:ra_ap_intern", + actual = "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern", tags = ["manual"], ) alias( - name = "ra_ap_load-cargo-0.0.301", - actual = "@vendor_ts__ra_ap_load-cargo-0.0.301//:ra_ap_load_cargo", + name = "ra_ap_load-cargo-0.0.328", + actual = "@vendor_ts__ra_ap_load-cargo-0.0.328//:ra_ap_load_cargo", tags = ["manual"], ) alias( name = "ra_ap_load-cargo", - actual = "@vendor_ts__ra_ap_load-cargo-0.0.301//:ra_ap_load_cargo", + actual = "@vendor_ts__ra_ap_load-cargo-0.0.328//:ra_ap_load_cargo", tags = ["manual"], ) alias( - name = "ra_ap_parser-0.0.301", - actual = "@vendor_ts__ra_ap_parser-0.0.301//:ra_ap_parser", + name = "ra_ap_parser-0.0.328", + actual = "@vendor_ts__ra_ap_parser-0.0.328//:ra_ap_parser", tags = ["manual"], ) alias( name = "ra_ap_parser", - actual = "@vendor_ts__ra_ap_parser-0.0.301//:ra_ap_parser", + actual = "@vendor_ts__ra_ap_parser-0.0.328//:ra_ap_parser", tags = ["manual"], ) alias( - name = "ra_ap_paths-0.0.301", - actual = "@vendor_ts__ra_ap_paths-0.0.301//:ra_ap_paths", + name = "ra_ap_paths-0.0.328", + actual = "@vendor_ts__ra_ap_paths-0.0.328//:ra_ap_paths", tags = ["manual"], ) alias( name = "ra_ap_paths", - actual = "@vendor_ts__ra_ap_paths-0.0.301//:ra_ap_paths", + actual = "@vendor_ts__ra_ap_paths-0.0.328//:ra_ap_paths", tags = ["manual"], ) alias( - name = "ra_ap_project_model-0.0.301", - actual = "@vendor_ts__ra_ap_project_model-0.0.301//:ra_ap_project_model", + name = "ra_ap_project_model-0.0.328", + actual = "@vendor_ts__ra_ap_project_model-0.0.328//:ra_ap_project_model", tags = ["manual"], ) alias( name = "ra_ap_project_model", - actual = "@vendor_ts__ra_ap_project_model-0.0.301//:ra_ap_project_model", + actual = "@vendor_ts__ra_ap_project_model-0.0.328//:ra_ap_project_model", tags = ["manual"], ) alias( - name = "ra_ap_span-0.0.301", - actual = "@vendor_ts__ra_ap_span-0.0.301//:ra_ap_span", + name = "ra_ap_span-0.0.328", + actual = "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span", tags = ["manual"], ) alias( name = "ra_ap_span", - actual = "@vendor_ts__ra_ap_span-0.0.301//:ra_ap_span", + actual = "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span", tags = ["manual"], ) alias( - name = "ra_ap_stdx-0.0.301", - actual = "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx", + name = "ra_ap_stdx-0.0.328", + actual = "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", tags = ["manual"], ) alias( - name = "stdx-0.0.301", - actual = "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx", + name = "stdx-0.0.328", + actual = "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", tags = ["manual"], ) alias( name = "stdx", - actual = "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx", + actual = "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", tags = ["manual"], ) alias( - name = "ra_ap_syntax-0.0.301", - actual = "@vendor_ts__ra_ap_syntax-0.0.301//:ra_ap_syntax", + name = "ra_ap_syntax-0.0.328", + actual = "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax", tags = ["manual"], ) alias( name = "ra_ap_syntax", - actual = "@vendor_ts__ra_ap_syntax-0.0.301//:ra_ap_syntax", + actual = "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax", tags = ["manual"], ) alias( - name = "ra_ap_vfs-0.0.301", - actual = "@vendor_ts__ra_ap_vfs-0.0.301//:ra_ap_vfs", + name = "ra_ap_vfs-0.0.328", + actual = "@vendor_ts__ra_ap_vfs-0.0.328//:ra_ap_vfs", tags = ["manual"], ) alias( name = "ra_ap_vfs", - actual = "@vendor_ts__ra_ap_vfs-0.0.301//:ra_ap_vfs", + actual = "@vendor_ts__ra_ap_vfs-0.0.328//:ra_ap_vfs", tags = ["manual"], ) alias( - name = "rand-0.9.2", - actual = "@vendor_ts__rand-0.9.2//:rand", + name = "rand-0.10.1", + actual = "@vendor_ts__rand-0.10.1//:rand", tags = ["manual"], ) alias( name = "rand", - actual = "@vendor_ts__rand-0.9.2//:rand", + actual = "@vendor_ts__rand-0.10.1//:rand", tags = ["manual"], ) alias( - name = "rayon-1.11.0", - actual = "@vendor_ts__rayon-1.11.0//:rayon", + name = "rayon-1.12.0", + actual = "@vendor_ts__rayon-1.12.0//:rayon", tags = ["manual"], ) alias( name = "rayon", - actual = "@vendor_ts__rayon-1.11.0//:rayon", + actual = "@vendor_ts__rayon-1.12.0//:rayon", tags = ["manual"], ) alias( - name = "regex-1.11.3", - actual = "@vendor_ts__regex-1.11.3//:regex", + name = "regex-1.12.3", + actual = "@vendor_ts__regex-1.12.3//:regex", tags = ["manual"], ) alias( name = "regex", - actual = "@vendor_ts__regex-1.11.3//:regex", + actual = "@vendor_ts__regex-1.12.3//:regex", tags = ["manual"], ) @@ -506,62 +506,62 @@ alias( ) alias( - name = "serde_json-1.0.145", - actual = "@vendor_ts__serde_json-1.0.145//:serde_json", + name = "serde_json-1.0.149", + actual = "@vendor_ts__serde_json-1.0.149//:serde_json", tags = ["manual"], ) alias( name = "serde_json", - actual = "@vendor_ts__serde_json-1.0.145//:serde_json", + actual = "@vendor_ts__serde_json-1.0.149//:serde_json", tags = ["manual"], ) alias( - name = "serde_with-3.14.1", - actual = "@vendor_ts__serde_with-3.14.1//:serde_with", + name = "serde_with-3.18.0", + actual = "@vendor_ts__serde_with-3.18.0//:serde_with", tags = ["manual"], ) alias( name = "serde_with", - actual = "@vendor_ts__serde_with-3.14.1//:serde_with", + actual = "@vendor_ts__serde_with-3.18.0//:serde_with", tags = ["manual"], ) alias( - name = "syn-2.0.106", - actual = "@vendor_ts__syn-2.0.106//:syn", + name = "syn-2.0.117", + actual = "@vendor_ts__syn-2.0.117//:syn", tags = ["manual"], ) alias( name = "syn", - actual = "@vendor_ts__syn-2.0.106//:syn", + actual = "@vendor_ts__syn-2.0.117//:syn", tags = ["manual"], ) alias( - name = "toml-0.9.7", - actual = "@vendor_ts__toml-0.9.7//:toml", + name = "toml-1.1.2+spec-1.1.0", + actual = "@vendor_ts__toml-1.1.2-spec-1.1.0//:toml", tags = ["manual"], ) alias( name = "toml", - actual = "@vendor_ts__toml-0.9.7//:toml", + actual = "@vendor_ts__toml-1.1.2-spec-1.1.0//:toml", tags = ["manual"], ) alias( - name = "tracing-0.1.41", - actual = "@vendor_ts__tracing-0.1.41//:tracing", + name = "tracing-0.1.44", + actual = "@vendor_ts__tracing-0.1.44//:tracing", tags = ["manual"], ) alias( name = "tracing", - actual = "@vendor_ts__tracing-0.1.41//:tracing", + actual = "@vendor_ts__tracing-0.1.44//:tracing", tags = ["manual"], ) @@ -578,14 +578,14 @@ alias( ) alias( - name = "tracing-subscriber-0.3.20", - actual = "@vendor_ts__tracing-subscriber-0.3.20//:tracing_subscriber", + name = "tracing-subscriber-0.3.23", + actual = "@vendor_ts__tracing-subscriber-0.3.23//:tracing_subscriber", tags = ["manual"], ) alias( name = "tracing-subscriber", - actual = "@vendor_ts__tracing-subscriber-0.3.20//:tracing_subscriber", + actual = "@vendor_ts__tracing-subscriber-0.3.23//:tracing_subscriber", tags = ["manual"], ) @@ -650,14 +650,14 @@ alias( ) alias( - name = "triomphe-0.1.14", - actual = "@vendor_ts__triomphe-0.1.14//:triomphe", + name = "triomphe-0.1.15", + actual = "@vendor_ts__triomphe-0.1.15//:triomphe", tags = ["manual"], ) alias( name = "triomphe", - actual = "@vendor_ts__triomphe-0.1.14//:triomphe", + actual = "@vendor_ts__triomphe-0.1.15//:triomphe", tags = ["manual"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bitflags-2.9.4.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bitflags-2.11.1.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bitflags-2.9.4.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bitflags-2.11.1.bazel index 1e9bde485ea4..02bd7814aa45 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bitflags-2.9.4.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bitflags-2.11.1.bazel @@ -93,5 +93,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "2.9.4", + version = "2.11.1", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.borsh-1.5.7.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.borsh-1.6.1.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.borsh-1.5.7.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.borsh-1.6.1.bazel index cdf0bd3bcde6..76af71ed47f7 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.borsh-1.5.7.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.borsh-1.6.1.bazel @@ -97,9 +97,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.5.7", + version = "1.6.1", deps = [ - "@vendor_ts__borsh-1.5.7//:build_script_build", + "@vendor_ts__borsh-1.6.1//:build_script_build", ], ) @@ -151,7 +151,7 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "1.5.7", + version = "1.6.1", visibility = ["//visibility:private"], deps = [ "@vendor_ts__cfg_aliases-0.2.1//:cfg_aliases", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bstr-1.12.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bstr-1.12.0.bazel index efe6232bbf79..0e4d1c63f1ba 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bstr-1.12.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bstr-1.12.0.bazel @@ -99,6 +99,6 @@ rust_library( }), version = "1.12.0", deps = [ - "@vendor_ts__memchr-2.7.5//:memchr", + "@vendor_ts__memchr-2.8.0//:memchr", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.byteorder-1.5.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.byteorder-1.5.0.bazel new file mode 100644 index 000000000000..a4c26e134094 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.byteorder-1.5.0.bazel @@ -0,0 +1,97 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "byteorder", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=byteorder", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "1.5.0", +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bytes-1.11.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bytes-1.11.1.bazel new file mode 100644 index 000000000000..d16c296c5adc --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bytes-1.11.1.bazel @@ -0,0 +1,97 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "bytes", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=bytes", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "1.11.1", +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.camino-1.1.12.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.camino-1.2.2.bazel similarity index 95% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.camino-1.1.12.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.camino-1.2.2.bazel index 250bb124b510..92a6e66df847 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.camino-1.1.12.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.camino-1.2.2.bazel @@ -39,11 +39,10 @@ rust_library( ], ), crate_features = [ - "serde", "serde1", ], crate_root = "src/lib.rs", - edition = "2018", + edition = "2021", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -101,10 +100,10 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.1.12", + version = "1.2.2", deps = [ - "@vendor_ts__camino-1.1.12//:build_script_build", - "@vendor_ts__serde-1.0.228//:serde", + "@vendor_ts__camino-1.2.2//:build_script_build", + "@vendor_ts__serde_core-1.0.228//:serde_core", ], ) @@ -128,7 +127,6 @@ cargo_build_script( ], ), crate_features = [ - "serde", "serde1", ], crate_name = "build_script_build", @@ -145,7 +143,7 @@ cargo_build_script( "WORKSPACE.bazel", ], ), - edition = "2018", + edition = "2021", pkg_name = "camino", rustc_env_files = [ ":cargo_toml_env_vars", @@ -160,7 +158,7 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "1.1.12", + version = "1.2.2", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo-platform-0.2.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo-platform-0.3.2.bazel similarity index 97% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo-platform-0.2.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo-platform-0.3.2.bazel index 1a1a383b6390..6571dd77bf9e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo-platform-0.2.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo-platform-0.3.2.bazel @@ -35,7 +35,7 @@ rust_library( ], ), crate_root = "src/lib.rs", - edition = "2021", + edition = "2024", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -93,8 +93,8 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.2.0", + version = "0.3.2", deps = [ - "@vendor_ts__serde-1.0.228//:serde", + "@vendor_ts__serde_core-1.0.228//:serde_core", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo_metadata-0.21.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo_metadata-0.23.1.bazel similarity index 92% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo_metadata-0.21.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo_metadata-0.23.1.bazel index aefea796d4c3..d5fc84ec87a1 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo_metadata-0.21.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo_metadata-0.23.1.bazel @@ -96,14 +96,13 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.21.0", + version = "0.23.1", deps = [ - "@vendor_ts__camino-1.1.12//:camino", - "@vendor_ts__cargo-platform-0.2.0//:cargo_platform", - "@vendor_ts__cargo-util-schemas-0.8.2//:cargo_util_schemas", - "@vendor_ts__semver-1.0.26//:semver", + "@vendor_ts__camino-1.2.2//:camino", + "@vendor_ts__cargo-platform-0.3.2//:cargo_platform", + "@vendor_ts__semver-1.0.28//:semver", "@vendor_ts__serde-1.0.228//:serde", - "@vendor_ts__serde_json-1.0.145//:serde_json", - "@vendor_ts__thiserror-2.0.16//:thiserror", + "@vendor_ts__serde_json-1.0.149//:serde_json", + "@vendor_ts__thiserror-2.0.18//:thiserror", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cc-1.2.37.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cc-1.2.60.bazel similarity index 86% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cc-1.2.37.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cc-1.2.60.bazel index c747c1c3c4fc..daf0f93aca41 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cc-1.2.37.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cc-1.2.60.bazel @@ -96,47 +96,47 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.2.37", + version = "1.2.60", deps = [ - "@vendor_ts__find-msvc-tools-0.1.1//:find_msvc_tools", + "@vendor_ts__find-msvc-tools-0.1.9//:find_msvc_tools", "@vendor_ts__jobserver-0.1.34//:jobserver", "@vendor_ts__shlex-1.3.0//:shlex", ] + select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [ - "@vendor_ts__libc-0.2.175//:libc", # aarch64-apple-darwin + "@vendor_ts__libc-0.2.185//:libc", # aarch64-apple-darwin ], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # aarch64-unknown-linux-gnu + "@vendor_ts__libc-0.2.185//:libc", # aarch64-unknown-linux-gnu ], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # aarch64-unknown-linux-gnu, aarch64-unknown-nixos-gnu + "@vendor_ts__libc-0.2.185//:libc", # aarch64-unknown-linux-gnu, aarch64-unknown-nixos-gnu ], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.175//:libc", # arm-unknown-linux-gnueabi + "@vendor_ts__libc-0.2.185//:libc", # arm-unknown-linux-gnueabi ], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # i686-unknown-linux-gnu + "@vendor_ts__libc-0.2.185//:libc", # i686-unknown-linux-gnu ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # powerpc-unknown-linux-gnu + "@vendor_ts__libc-0.2.185//:libc", # powerpc-unknown-linux-gnu ], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # riscv64gc-unknown-linux-gnu + "@vendor_ts__libc-0.2.185//:libc", # riscv64gc-unknown-linux-gnu ], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # s390x-unknown-linux-gnu + "@vendor_ts__libc-0.2.185//:libc", # s390x-unknown-linux-gnu ], "@rules_rust//rust/platform:x86_64-apple-darwin": [ - "@vendor_ts__libc-0.2.175//:libc", # x86_64-apple-darwin + "@vendor_ts__libc-0.2.185//:libc", # x86_64-apple-darwin ], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [ - "@vendor_ts__libc-0.2.175//:libc", # x86_64-unknown-freebsd + "@vendor_ts__libc-0.2.185//:libc", # x86_64-unknown-freebsd ], "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # x86_64-unknown-linux-gnu + "@vendor_ts__libc-0.2.185//:libc", # x86_64-unknown-linux-gnu ], "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # x86_64-unknown-linux-gnu, x86_64-unknown-nixos-gnu + "@vendor_ts__libc-0.2.185//:libc", # x86_64-unknown-linux-gnu, x86_64-unknown-nixos-gnu ], "//conditions:default": [], }), diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cfg-if-1.0.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cfg-if-1.0.4.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cfg-if-1.0.3.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cfg-if-1.0.4.bazel index 66d5b40eb232..415a85fe18cc 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cfg-if-1.0.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cfg-if-1.0.4.bazel @@ -93,5 +93,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.3", + version = "1.0.4", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chacha20-0.10.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chacha20-0.10.0.bazel new file mode 100644 index 000000000000..7109de2bbe4a --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chacha20-0.10.0.bazel @@ -0,0 +1,151 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "chacha20", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "rng", + ], + crate_root = "src/lib.rs", + edition = "2024", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=chacha20", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.10.0", + deps = [ + "@vendor_ts__cfg-if-1.0.4//:cfg_if", + "@vendor_ts__rand_core-0.10.1//:rand_core", + ] + select({ + "@rules_rust//rust/platform:i686-apple-darwin": [ + "@vendor_ts__cpufeatures-0.3.0//:cpufeatures", # cfg(any(target_arch = "x86_64", target_arch = "x86")) + ], + "@rules_rust//rust/platform:i686-linux-android": [ + "@vendor_ts__cpufeatures-0.3.0//:cpufeatures", # cfg(any(target_arch = "x86_64", target_arch = "x86")) + ], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [ + "@vendor_ts__cpufeatures-0.3.0//:cpufeatures", # cfg(any(target_arch = "x86_64", target_arch = "x86")) + ], + "@rules_rust//rust/platform:i686-unknown-freebsd": [ + "@vendor_ts__cpufeatures-0.3.0//:cpufeatures", # cfg(any(target_arch = "x86_64", target_arch = "x86")) + ], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ + "@vendor_ts__cpufeatures-0.3.0//:cpufeatures", # cfg(any(target_arch = "x86_64", target_arch = "x86")) + ], + "@rules_rust//rust/platform:x86_64-apple-darwin": [ + "@vendor_ts__cpufeatures-0.3.0//:cpufeatures", # cfg(any(target_arch = "x86_64", target_arch = "x86")) + ], + "@rules_rust//rust/platform:x86_64-apple-ios": [ + "@vendor_ts__cpufeatures-0.3.0//:cpufeatures", # cfg(any(target_arch = "x86_64", target_arch = "x86")) + ], + "@rules_rust//rust/platform:x86_64-linux-android": [ + "@vendor_ts__cpufeatures-0.3.0//:cpufeatures", # cfg(any(target_arch = "x86_64", target_arch = "x86")) + ], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [ + "@vendor_ts__cpufeatures-0.3.0//:cpufeatures", # cfg(any(target_arch = "x86_64", target_arch = "x86")) + ], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [ + "@vendor_ts__cpufeatures-0.3.0//:cpufeatures", # cfg(any(target_arch = "x86_64", target_arch = "x86")) + ], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [ + "@vendor_ts__cpufeatures-0.3.0//:cpufeatures", # cfg(any(target_arch = "x86_64", target_arch = "x86")) + ], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [ + "@vendor_ts__cpufeatures-0.3.0//:cpufeatures", # cfg(any(target_arch = "x86_64", target_arch = "x86")) + ], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [ + "@vendor_ts__cpufeatures-0.3.0//:cpufeatures", # cfg(any(target_arch = "x86_64", target_arch = "x86")) + ], + "@rules_rust//rust/platform:x86_64-unknown-none": [ + "@vendor_ts__cpufeatures-0.3.0//:cpufeatures", # cfg(any(target_arch = "x86_64", target_arch = "x86")) + ], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [ + "@vendor_ts__cpufeatures-0.3.0//:cpufeatures", # cfg(any(target_arch = "x86_64", target_arch = "x86")) + ], + "//conditions:default": [], + }), +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-derive-0.104.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-derive-0.104.0.bazel index c7b526db2fb6..b66be433fe88 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-derive-0.104.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-derive-0.104.0.bazel @@ -95,9 +95,9 @@ rust_proc_macro( }), version = "0.104.0", deps = [ - "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", - "@vendor_ts__quote-1.0.41//:quote", - "@vendor_ts__syn-2.0.106//:syn", + "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", + "@vendor_ts__quote-1.0.45//:quote", + "@vendor_ts__syn-2.0.117//:syn", "@vendor_ts__synstructure-0.13.2//:synstructure", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-ir-0.103.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-ir-0.103.0.bazel deleted file mode 100644 index 7f20b012de96..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-ir-0.103.0.bazel +++ /dev/null @@ -1,103 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "chalk_ir", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_root = "src/lib.rs", - edition = "2018", - proc_macro_deps = [ - "@vendor_ts__chalk-derive-0.103.0//:chalk_derive", - ], - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=chalk-ir", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.103.0", - deps = [ - "@vendor_ts__bitflags-2.9.4//:bitflags", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-ir-0.104.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-ir-0.104.0.bazel index 2d796bef0b65..66edc978c74f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-ir-0.104.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-ir-0.104.0.bazel @@ -98,6 +98,6 @@ rust_library( }), version = "0.104.0", deps = [ - "@vendor_ts__bitflags-2.9.4//:bitflags", + "@vendor_ts__bitflags-2.11.1//:bitflags", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-recursive-0.103.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-recursive-0.103.0.bazel deleted file mode 100644 index b5bb39ea428c..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-recursive-0.103.0.bazel +++ /dev/null @@ -1,106 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "chalk_recursive", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_root = "src/lib.rs", - edition = "2018", - proc_macro_deps = [ - "@vendor_ts__chalk-derive-0.103.0//:chalk_derive", - ], - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=chalk-recursive", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.103.0", - deps = [ - "@vendor_ts__chalk-ir-0.103.0//:chalk_ir", - "@vendor_ts__chalk-solve-0.103.0//:chalk_solve", - "@vendor_ts__rustc-hash-1.1.0//:rustc_hash", - "@vendor_ts__tracing-0.1.41//:tracing", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-solve-0.103.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-solve-0.103.0.bazel deleted file mode 100644 index f1124f1108fa..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-solve-0.103.0.bazel +++ /dev/null @@ -1,109 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "chalk_solve", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_root = "src/lib.rs", - edition = "2018", - proc_macro_deps = [ - "@vendor_ts__chalk-derive-0.103.0//:chalk_derive", - ], - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=chalk-solve", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.103.0", - deps = [ - "@vendor_ts__chalk-ir-0.103.0//:chalk_ir", - "@vendor_ts__ena-0.14.3//:ena", - "@vendor_ts__indexmap-2.11.4//:indexmap", - "@vendor_ts__itertools-0.12.1//:itertools", - "@vendor_ts__petgraph-0.6.5//:petgraph", - "@vendor_ts__rustc-hash-1.1.0//:rustc_hash", - "@vendor_ts__tracing-0.1.41//:tracing", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chrono-0.4.42.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chrono-0.4.44.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chrono-0.4.42.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chrono-0.4.44.bazel index 41e2b0285ecc..b672118110f3 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chrono-0.4.42.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chrono-0.4.44.bazel @@ -108,7 +108,7 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.4.42", + version = "0.4.44", deps = [ "@vendor_ts__num-traits-0.2.19//:num_traits", "@vendor_ts__serde-1.0.228//:serde", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap-4.5.48.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap-4.6.0.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap-4.5.48.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap-4.6.0.bazel index 1ef4252fc093..a32bb36907aa 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap-4.5.48.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap-4.6.0.bazel @@ -45,9 +45,9 @@ rust_library( "usage", ], crate_root = "src/lib.rs", - edition = "2021", + edition = "2024", proc_macro_deps = [ - "@vendor_ts__clap_derive-4.5.47//:clap_derive", + "@vendor_ts__clap_derive-4.6.0//:clap_derive", ], rustc_env_files = [ ":cargo_toml_env_vars", @@ -106,8 +106,8 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "4.5.48", + version = "4.6.0", deps = [ - "@vendor_ts__clap_builder-4.5.48//:clap_builder", + "@vendor_ts__clap_builder-4.6.0//:clap_builder", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_builder-4.5.48.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_builder-4.6.0.bazel similarity index 95% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_builder-4.5.48.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_builder-4.6.0.bazel index f15804a69287..e80eda78e4eb 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_builder-4.5.48.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_builder-4.6.0.bazel @@ -43,7 +43,7 @@ rust_library( "usage", ], crate_root = "src/lib.rs", - edition = "2021", + edition = "2024", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -101,11 +101,11 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "4.5.48", + version = "4.6.0", deps = [ - "@vendor_ts__anstream-0.6.20//:anstream", - "@vendor_ts__anstyle-1.0.11//:anstyle", - "@vendor_ts__clap_lex-0.7.5//:clap_lex", + "@vendor_ts__anstream-1.0.0//:anstream", + "@vendor_ts__anstyle-1.0.14//:anstyle", + "@vendor_ts__clap_lex-1.1.0//:clap_lex", "@vendor_ts__strsim-0.11.1//:strsim", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_derive-4.5.47.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_derive-4.6.0.bazel similarity index 95% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_derive-4.5.47.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_derive-4.6.0.bazel index d203b2121e87..efcbd52b0381 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_derive-4.5.47.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_derive-4.6.0.bazel @@ -38,7 +38,7 @@ rust_proc_macro( "default", ], crate_root = "src/lib.rs", - edition = "2021", + edition = "2024", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -96,11 +96,11 @@ rust_proc_macro( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "4.5.47", + version = "4.6.0", deps = [ "@vendor_ts__heck-0.5.0//:heck", - "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", - "@vendor_ts__quote-1.0.41//:quote", - "@vendor_ts__syn-2.0.106//:syn", + "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", + "@vendor_ts__quote-1.0.45//:quote", + "@vendor_ts__syn-2.0.117//:syn", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_lex-0.7.5.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_lex-1.1.0.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_lex-0.7.5.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_lex-1.1.0.bazel index a5a6cca1fe85..701c96d00d9e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_lex-0.7.5.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_lex-1.1.0.bazel @@ -35,7 +35,7 @@ rust_library( ], ), crate_root = "src/lib.rs", - edition = "2021", + edition = "2024", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -93,5 +93,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.7.5", + version = "1.1.0", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.litemap-0.8.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cobs-0.3.0.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.litemap-0.8.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cobs-0.3.0.bazel index 47c9e11a8b9f..658009e8af70 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.litemap-0.8.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cobs-0.3.0.bazel @@ -17,7 +17,7 @@ cargo_toml_env_vars( ) rust_library( - name = "litemap", + name = "cobs", srcs = glob( include = ["**/*.rs"], allow_empty = True, @@ -34,9 +34,6 @@ rust_library( "WORKSPACE.bazel", ], ), - crate_features = [ - "alloc", - ], crate_root = "src/lib.rs", edition = "2021", rustc_env_files = [ @@ -47,7 +44,7 @@ rust_library( ], tags = [ "cargo-bazel", - "crate-name=litemap", + "crate-name=cobs", "manual", "noclippy", "norustfmt", @@ -96,5 +93,8 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.8.0", + version = "0.3.0", + deps = [ + "@vendor_ts__thiserror-2.0.18//:thiserror", + ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.colorchoice-1.0.4.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.colorchoice-1.0.5.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.colorchoice-1.0.4.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.colorchoice-1.0.5.bazel index 5956c5ff8f7f..59b50356c647 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.colorchoice-1.0.4.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.colorchoice-1.0.5.bazel @@ -93,5 +93,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.4", + version = "1.0.5", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cpufeatures-0.3.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cpufeatures-0.3.0.bazel new file mode 100644 index 000000000000..57d9f28db4a8 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cpufeatures-0.3.0.bazel @@ -0,0 +1,118 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "cpufeatures", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2024", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=cpufeatures", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.3.0", + deps = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(target_arch = "aarch64", target_vendor = "apple")) + ], + "@rules_rust//rust/platform:aarch64-apple-ios": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(target_arch = "aarch64", target_vendor = "apple")) + ], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(target_arch = "aarch64", target_vendor = "apple")) + ], + "@rules_rust//rust/platform:aarch64-linux-android": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(target_arch = "aarch64", target_os = "android")) + ], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(target_arch = "aarch64", target_os = "linux")) + ], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(target_arch = "aarch64", target_os = "linux")) + ], + "//conditions:default": [], + }), +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crc32fast-1.5.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crc32fast-1.5.0.bazel index 46c3fb30a597..ee8ffed758d6 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crc32fast-1.5.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crc32fast-1.5.0.bazel @@ -103,7 +103,7 @@ rust_library( }), version = "1.5.0", deps = [ - "@vendor_ts__cfg-if-1.0.3//:cfg_if", + "@vendor_ts__cfg-if-1.0.4//:cfg_if", "@vendor_ts__crc32fast-1.5.0//:build_script_build", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.critical-section-1.2.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.critical-section-1.2.0.bazel new file mode 100644 index 000000000000..0e3cf2f62f41 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.critical-section-1.2.0.bazel @@ -0,0 +1,97 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "critical_section", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2018", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=critical-section", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "1.2.0", +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling-0.21.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling-0.23.0.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling-0.21.3.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling-0.23.0.bazel index a9572a79a814..84da5eac9d94 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling-0.21.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling-0.23.0.bazel @@ -41,7 +41,7 @@ rust_library( crate_root = "src/lib.rs", edition = "2021", proc_macro_deps = [ - "@vendor_ts__darling_macro-0.21.3//:darling_macro", + "@vendor_ts__darling_macro-0.23.0//:darling_macro", ], rustc_env_files = [ ":cargo_toml_env_vars", @@ -100,8 +100,8 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.21.3", + version = "0.23.0", deps = [ - "@vendor_ts__darling_core-0.21.3//:darling_core", + "@vendor_ts__darling_core-0.23.0//:darling_core", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling_core-0.21.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling_core-0.23.0.bazel similarity index 95% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling_core-0.21.3.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling_core-0.23.0.bazel index 22e3ea592f61..a9da47fd6acd 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling_core-0.21.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling_core-0.23.0.bazel @@ -97,13 +97,12 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.21.3", + version = "0.23.0", deps = [ - "@vendor_ts__fnv-1.0.7//:fnv", "@vendor_ts__ident_case-1.0.1//:ident_case", - "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", - "@vendor_ts__quote-1.0.41//:quote", + "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", + "@vendor_ts__quote-1.0.45//:quote", "@vendor_ts__strsim-0.11.1//:strsim", - "@vendor_ts__syn-2.0.106//:syn", + "@vendor_ts__syn-2.0.117//:syn", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling_macro-0.21.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling_macro-0.23.0.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling_macro-0.21.3.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling_macro-0.23.0.bazel index 99c3af7e2e4f..aa8c9c33128a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling_macro-0.21.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling_macro-0.23.0.bazel @@ -93,10 +93,10 @@ rust_proc_macro( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.21.3", + version = "0.23.0", deps = [ - "@vendor_ts__darling_core-0.21.3//:darling_core", - "@vendor_ts__quote-1.0.41//:quote", - "@vendor_ts__syn-2.0.106//:syn", + "@vendor_ts__darling_core-0.23.0//:darling_core", + "@vendor_ts__quote-1.0.45//:quote", + "@vendor_ts__syn-2.0.117//:syn", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.dashmap-6.1.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.dashmap-6.1.0.bazel index c9a20e45392f..d7ee0436f948 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.dashmap-6.1.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.dashmap-6.1.0.bazel @@ -99,11 +99,11 @@ rust_library( }), version = "6.1.0", deps = [ - "@vendor_ts__cfg-if-1.0.3//:cfg_if", + "@vendor_ts__cfg-if-1.0.4//:cfg_if", "@vendor_ts__crossbeam-utils-0.8.21//:crossbeam_utils", "@vendor_ts__hashbrown-0.14.5//:hashbrown", "@vendor_ts__lock_api-0.4.13//:lock_api", - "@vendor_ts__once_cell-1.21.3//:once_cell", + "@vendor_ts__once_cell-1.21.4//:once_cell", "@vendor_ts__parking_lot_core-0.9.11//:parking_lot_core", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.deranged-0.5.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.deranged-0.5.3.bazel index 850713a2e455..bfd0ba3fc282 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.deranged-0.5.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.deranged-0.5.3.bazel @@ -34,6 +34,10 @@ rust_library( "WORKSPACE.bazel", ], ), + crate_features = [ + "default", + "powerfmt", + ], crate_root = "src/lib.rs", edition = "2021", rustc_env_files = [ @@ -94,4 +98,7 @@ rust_library( "//conditions:default": ["@platforms//:incompatible"], }), version = "0.5.3", + deps = [ + "@vendor_ts__powerfmt-0.2.0//:powerfmt", + ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.displaydoc-0.2.5.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.derive-where-1.6.1.bazel similarity index 94% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.displaydoc-0.2.5.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.derive-where-1.6.1.bazel index 41aae8ab1ecc..16396514eeb5 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.displaydoc-0.2.5.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.derive-where-1.6.1.bazel @@ -17,7 +17,7 @@ cargo_toml_env_vars( ) rust_proc_macro( - name = "displaydoc", + name = "derive_where", srcs = glob( include = ["**/*.rs"], allow_empty = True, @@ -44,7 +44,7 @@ rust_proc_macro( ], tags = [ "cargo-bazel", - "crate-name=displaydoc", + "crate-name=derive-where", "manual", "noclippy", "norustfmt", @@ -93,10 +93,10 @@ rust_proc_macro( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.2.5", + version = "1.6.1", deps = [ - "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", - "@vendor_ts__quote-1.0.41//:quote", - "@vendor_ts__syn-2.0.106//:syn", + "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", + "@vendor_ts__quote-1.0.45//:quote", + "@vendor_ts__syn-2.0.117//:syn", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.dissimilar-1.0.11.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.dissimilar-1.0.11.bazel new file mode 100644 index 000000000000..79ee7c7ee72a --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.dissimilar-1.0.11.bazel @@ -0,0 +1,97 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "dissimilar", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=dissimilar", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "1.0.11", +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.embedded-io-0.4.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.embedded-io-0.4.0.bazel new file mode 100644 index 000000000000..1aedeaf25f78 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.embedded-io-0.4.0.bazel @@ -0,0 +1,97 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "embedded_io", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=embedded-io", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.4.0", +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.writeable-0.6.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.embedded-io-0.6.1.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.writeable-0.6.1.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.embedded-io-0.6.1.bazel index 28b6f63ce6fe..cf929d38e539 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.writeable-0.6.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.embedded-io-0.6.1.bazel @@ -17,7 +17,7 @@ cargo_toml_env_vars( ) rust_library( - name = "writeable", + name = "embedded_io", srcs = glob( include = ["**/*.rs"], allow_empty = True, @@ -44,7 +44,7 @@ rust_library( ], tags = [ "cargo-bazel", - "crate-name=writeable", + "crate-name=embedded-io", "manual", "noclippy", "norustfmt", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ena-0.14.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ena-0.14.3.bazel index c59d0a9a3162..ecacffd0328f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ena-0.14.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ena-0.14.3.bazel @@ -95,6 +95,6 @@ rust_library( }), version = "0.14.3", deps = [ - "@vendor_ts__log-0.4.28//:log", + "@vendor_ts__log-0.4.29//:log", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.find-msvc-tools-0.1.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.find-msvc-tools-0.1.9.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.find-msvc-tools-0.1.1.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.find-msvc-tools-0.1.9.bazel index 8fc8c9a81e26..12cd2ecbe0cc 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.find-msvc-tools-0.1.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.find-msvc-tools-0.1.9.bazel @@ -93,5 +93,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.1.1", + version = "0.1.9", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fixedbitset-0.4.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fixedbitset-0.5.7.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fixedbitset-0.4.2.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fixedbitset-0.5.7.bazel index b41f13ec6e51..01336178f130 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fixedbitset-0.4.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fixedbitset-0.5.7.bazel @@ -35,7 +35,7 @@ rust_library( ], ), crate_root = "src/lib.rs", - edition = "2015", + edition = "2021", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -93,5 +93,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.4.2", + version = "0.5.7", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fnv-1.0.7.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fnv-1.0.7.bazel deleted file mode 100644 index 80252992a212..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fnv-1.0.7.bazel +++ /dev/null @@ -1,101 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "fnv", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "default", - "std", - ], - crate_root = "lib.rs", - edition = "2015", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=fnv", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "1.0.7", -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.form_urlencoded-1.2.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.form_urlencoded-1.2.2.bazel deleted file mode 100644 index 7d4cbdcdecb7..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.form_urlencoded-1.2.2.bazel +++ /dev/null @@ -1,104 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "form_urlencoded", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "alloc", - "std", - ], - crate_root = "src/lib.rs", - edition = "2018", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=form_urlencoded", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "1.2.2", - deps = [ - "@vendor_ts__percent-encoding-2.3.2//:percent_encoding", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fs-err-2.11.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fs-err-3.3.0.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fs-err-2.11.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fs-err-3.3.0.bazel index 657e1cd8a4aa..41907be4dc07 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fs-err-2.11.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fs-err-3.3.0.bazel @@ -97,9 +97,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "2.11.0", + version = "3.3.0", deps = [ - "@vendor_ts__fs-err-2.11.0//:build_script_build", + "@vendor_ts__fs-err-3.3.0//:build_script_build", ], ) @@ -151,7 +151,7 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "2.11.0", + version = "3.3.0", visibility = ["//visibility:private"], deps = [ "@vendor_ts__autocfg-1.5.0//:autocfg", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fsevent-sys-4.1.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fsevent-sys-4.1.0.bazel index cb938292839d..31a03fc15cdd 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fsevent-sys-4.1.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fsevent-sys-4.1.0.bazel @@ -95,6 +95,6 @@ rust_library( }), version = "4.1.0", deps = [ - "@vendor_ts__libc-0.2.175//:libc", + "@vendor_ts__libc-0.2.185//:libc", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.getrandom-0.3.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.getrandom-0.3.4.bazel similarity index 86% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.getrandom-0.3.3.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.getrandom-0.3.4.bazel index d09e3ce7a4a5..6b4d1acde83a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.getrandom-0.3.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.getrandom-0.3.4.bazel @@ -100,88 +100,88 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.3.3", + version = "0.3.4", deps = [ - "@vendor_ts__cfg-if-1.0.3//:cfg_if", - "@vendor_ts__getrandom-0.3.3//:build_script_build", + "@vendor_ts__cfg-if-1.0.4//:cfg_if", + "@vendor_ts__getrandom-0.3.4//:build_script_build", ] + select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(any(target_os = "macos", target_os = "openbsd", target_os = "vita", target_os = "emscripten")) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(target_os = "macos", target_os = "openbsd", target_os = "vita", target_os = "emscripten")) ], "@rules_rust//rust/platform:aarch64-apple-ios": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(any(target_os = "ios", target_os = "visionos", target_os = "watchos", target_os = "tvos")) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(target_os = "ios", target_os = "visionos", target_os = "watchos", target_os = "tvos")) ], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(any(target_os = "ios", target_os = "visionos", target_os = "watchos", target_os = "tvos")) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(target_os = "ios", target_os = "visionos", target_os = "watchos", target_os = "tvos")) ], "@rules_rust//rust/platform:aarch64-linux-android": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(any(target_os = "haiku", target_os = "redox", target_os = "nto", target_os = "aix")) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(target_os = "haiku", target_os = "redox", target_os = "nto", target_os = "aix")) ], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], "@rules_rust//rust/platform:armv7-linux-androideabi": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], "@rules_rust//rust/platform:i686-apple-darwin": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(any(target_os = "macos", target_os = "openbsd", target_os = "vita", target_os = "emscripten")) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(target_os = "macos", target_os = "openbsd", target_os = "vita", target_os = "emscripten")) ], "@rules_rust//rust/platform:i686-linux-android": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], "@rules_rust//rust/platform:i686-unknown-freebsd": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(any(target_os = "dragonfly", target_os = "freebsd", target_os = "hurd", target_os = "illumos", target_os = "cygwin", all(target_os = "horizon", target_arch = "arm"))) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(target_os = "dragonfly", target_os = "freebsd", target_os = "hurd", target_os = "illumos", target_os = "cygwin", all(target_os = "horizon", target_arch = "arm"))) ], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(any(target_os = "macos", target_os = "openbsd", target_os = "vita", target_os = "emscripten")) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(target_os = "macos", target_os = "openbsd", target_os = "vita", target_os = "emscripten")) ], "@rules_rust//rust/platform:wasm32-wasip2": [ - "@vendor_ts__wasi-0.14.5-wasi-0.2.4//:wasi", # cfg(all(target_arch = "wasm32", target_os = "wasi", target_env = "p2")) + "@vendor_ts__wasip2-1.0.0-wasi-0.2.4//:wasip2", # cfg(all(target_arch = "wasm32", target_os = "wasi", target_env = "p2")) ], "@rules_rust//rust/platform:x86_64-apple-darwin": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(any(target_os = "macos", target_os = "openbsd", target_os = "vita", target_os = "emscripten")) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(target_os = "macos", target_os = "openbsd", target_os = "vita", target_os = "emscripten")) ], "@rules_rust//rust/platform:x86_64-apple-ios": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(any(target_os = "ios", target_os = "visionos", target_os = "watchos", target_os = "tvos")) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(target_os = "ios", target_os = "visionos", target_os = "watchos", target_os = "tvos")) ], "@rules_rust//rust/platform:x86_64-linux-android": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(any(target_os = "dragonfly", target_os = "freebsd", target_os = "hurd", target_os = "illumos", target_os = "cygwin", all(target_os = "horizon", target_arch = "arm"))) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(target_os = "dragonfly", target_os = "freebsd", target_os = "hurd", target_os = "illumos", target_os = "cygwin", all(target_os = "horizon", target_arch = "arm"))) ], "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], "//conditions:default": [], }), @@ -238,7 +238,7 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "0.3.3", + version = "0.3.4", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.getrandom-0.4.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.getrandom-0.4.2.bazel new file mode 100644 index 000000000000..74aa24668f2a --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.getrandom-0.4.2.bazel @@ -0,0 +1,252 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load( + "@rules_rust//cargo:defs.bzl", + "cargo_build_script", + "cargo_toml_env_vars", +) +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "getrandom", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "std", + "sys_rng", + ], + crate_root = "src/lib.rs", + edition = "2024", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=getrandom", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.4.2", + deps = [ + "@vendor_ts__cfg-if-1.0.4//:cfg_if", + "@vendor_ts__getrandom-0.4.2//:build_script_build", + "@vendor_ts__rand_core-0.10.1//:rand_core", + ] + select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(target_os = "macos", target_os = "openbsd", target_os = "vita", target_os = "emscripten")) + ], + "@rules_rust//rust/platform:aarch64-apple-ios": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(target_os = "ios", target_os = "visionos", target_os = "watchos", target_os = "tvos")) + ], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(target_os = "ios", target_os = "visionos", target_os = "watchos", target_os = "tvos")) + ], + "@rules_rust//rust/platform:aarch64-linux-android": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + ], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + ], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + ], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(target_os = "haiku", target_os = "redox", target_os = "nto", target_os = "aix")) + ], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + ], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + ], + "@rules_rust//rust/platform:armv7-linux-androideabi": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + ], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + ], + "@rules_rust//rust/platform:i686-apple-darwin": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(target_os = "macos", target_os = "openbsd", target_os = "vita", target_os = "emscripten")) + ], + "@rules_rust//rust/platform:i686-linux-android": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + ], + "@rules_rust//rust/platform:i686-unknown-freebsd": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(target_os = "dragonfly", target_os = "freebsd", target_os = "hurd", target_os = "illumos", target_os = "cygwin", all(target_os = "horizon", target_arch = "arm"))) + ], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + ], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + ], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + ], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + ], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(target_os = "macos", target_os = "openbsd", target_os = "vita", target_os = "emscripten")) + ], + "@rules_rust//rust/platform:wasm32-wasip2": [ + "@vendor_ts__wasip2-1.0.0-wasi-0.2.4//:wasip2", # cfg(all(target_arch = "wasm32", target_os = "wasi", target_env = "p2")) + ], + "@rules_rust//rust/platform:x86_64-apple-darwin": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(target_os = "macos", target_os = "openbsd", target_os = "vita", target_os = "emscripten")) + ], + "@rules_rust//rust/platform:x86_64-apple-ios": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(target_os = "ios", target_os = "visionos", target_os = "watchos", target_os = "tvos")) + ], + "@rules_rust//rust/platform:x86_64-linux-android": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + ], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(target_os = "dragonfly", target_os = "freebsd", target_os = "hurd", target_os = "illumos", target_os = "cygwin", all(target_os = "horizon", target_arch = "arm"))) + ], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + ], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + ], + "//conditions:default": [], + }), +) + +cargo_build_script( + name = "_bs", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + "**/*.rs", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "std", + "sys_rng", + ], + crate_name = "build_script_build", + crate_root = "build.rs", + data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + edition = "2024", + pkg_name = "getrandom", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=getrandom", + "manual", + "noclippy", + "norustfmt", + ], + version = "0.4.2", + visibility = ["//visibility:private"], +) + +alias( + name = "build_script_build", + actual = ":_bs", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.globset-0.4.16.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.globset-0.4.16.bazel index 0f83adee8e78..eadca051b955 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.globset-0.4.16.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.globset-0.4.16.bazel @@ -99,10 +99,10 @@ rust_library( }), version = "0.4.16", deps = [ - "@vendor_ts__aho-corasick-1.1.3//:aho_corasick", + "@vendor_ts__aho-corasick-1.1.4//:aho_corasick", "@vendor_ts__bstr-1.12.0//:bstr", - "@vendor_ts__log-0.4.28//:log", - "@vendor_ts__regex-automata-0.4.11//:regex_automata", - "@vendor_ts__regex-syntax-0.8.6//:regex_syntax", + "@vendor_ts__log-0.4.29//:log", + "@vendor_ts__regex-automata-0.4.14//:regex_automata", + "@vendor_ts__regex-syntax-0.8.10//:regex_syntax", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.scoped-tls-1.0.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hash32-0.2.1.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.scoped-tls-1.0.1.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hash32-0.2.1.bazel index 83ffd8145e73..182c9c89fd4e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.scoped-tls-1.0.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hash32-0.2.1.bazel @@ -17,7 +17,7 @@ cargo_toml_env_vars( ) rust_library( - name = "scoped_tls", + name = "hash32", srcs = glob( include = ["**/*.rs"], allow_empty = True, @@ -44,7 +44,7 @@ rust_library( ], tags = [ "cargo-bazel", - "crate-name=scoped-tls", + "crate-name=hash32", "manual", "noclippy", "norustfmt", @@ -93,5 +93,8 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.1", + version = "0.2.1", + deps = [ + "@vendor_ts__byteorder-1.5.0//:byteorder", + ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.17.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.17.0.bazel new file mode 100644 index 000000000000..3dddca9e54da --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.17.0.bazel @@ -0,0 +1,97 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "hashbrown", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2024", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=hashbrown", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.17.0", +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.semver-1.0.26.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.heapless-0.7.17.bazel similarity index 70% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.semver-1.0.26.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.heapless-0.7.17.bazel index a495f639d420..75b7d25c4df4 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.semver-1.0.26.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.heapless-0.7.17.bazel @@ -21,7 +21,7 @@ cargo_toml_env_vars( ) rust_library( - name = "semver", + name = "heapless", srcs = glob( include = ["**/*.rs"], allow_empty = True, @@ -39,9 +39,9 @@ rust_library( ], ), crate_features = [ - "default", + "atomic-polyfill", + "cas", "serde", - "std", ], crate_root = "src/lib.rs", edition = "2018", @@ -53,7 +53,7 @@ rust_library( ], tags = [ "cargo-bazel", - "crate-name=semver", + "crate-name=heapless", "manual", "noclippy", "norustfmt", @@ -102,11 +102,48 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.26", + version = "0.7.17", deps = [ - "@vendor_ts__semver-1.0.26//:build_script_build", + "@vendor_ts__hash32-0.2.1//:hash32", + "@vendor_ts__heapless-0.7.17//:build_script_build", "@vendor_ts__serde-1.0.228//:serde", - ], + "@vendor_ts__stable_deref_trait-1.2.1//:stable_deref_trait", + ] + select({ + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [ + "@vendor_ts__atomic-polyfill-1.0.3//:atomic_polyfill", # riscv32imc-unknown-none-elf + ], + "@rules_rust//rust/platform:x86_64-apple-darwin": [ + "@vendor_ts__spin-0.9.8//:spin", # cfg(target_arch = "x86_64") + ], + "@rules_rust//rust/platform:x86_64-apple-ios": [ + "@vendor_ts__spin-0.9.8//:spin", # cfg(target_arch = "x86_64") + ], + "@rules_rust//rust/platform:x86_64-linux-android": [ + "@vendor_ts__spin-0.9.8//:spin", # cfg(target_arch = "x86_64") + ], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [ + "@vendor_ts__spin-0.9.8//:spin", # cfg(target_arch = "x86_64") + ], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [ + "@vendor_ts__spin-0.9.8//:spin", # cfg(target_arch = "x86_64") + ], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [ + "@vendor_ts__spin-0.9.8//:spin", # cfg(target_arch = "x86_64") + ], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [ + "@vendor_ts__spin-0.9.8//:spin", # cfg(target_arch = "x86_64") + ], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [ + "@vendor_ts__spin-0.9.8//:spin", # cfg(target_arch = "x86_64") + ], + "@rules_rust//rust/platform:x86_64-unknown-none": [ + "@vendor_ts__spin-0.9.8//:spin", # cfg(target_arch = "x86_64") + ], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [ + "@vendor_ts__spin-0.9.8//:spin", # cfg(target_arch = "x86_64") + ], + "//conditions:default": [], + }), ) cargo_build_script( @@ -129,9 +166,9 @@ cargo_build_script( ], ), crate_features = [ - "default", + "atomic-polyfill", + "cas", "serde", - "std", ], crate_name = "build_script_build", crate_root = "build.rs", @@ -148,7 +185,7 @@ cargo_build_script( ], ), edition = "2018", - pkg_name = "semver", + pkg_name = "heapless", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -157,13 +194,16 @@ cargo_build_script( ], tags = [ "cargo-bazel", - "crate-name=semver", + "crate-name=heapless", "manual", "noclippy", "norustfmt", ], - version = "1.0.26", + version = "0.7.17", visibility = ["//visibility:private"], + deps = [ + "@vendor_ts__rustc_version-0.4.1//:rustc_version", + ], ) alias( diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.home-0.5.11.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.home-0.5.12.bazel similarity index 94% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.home-0.5.11.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.home-0.5.12.bazel index 97b2f5a5b94b..8eaa49950537 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.home-0.5.11.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.home-0.5.12.bazel @@ -35,7 +35,7 @@ rust_library( ], ), crate_root = "src/lib.rs", - edition = "2021", + edition = "2024", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -93,16 +93,16 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.5.11", + version = "0.5.12", deps = select({ "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [ - "@vendor_ts__windows-sys-0.59.0//:windows_sys", # cfg(windows) + "@vendor_ts__windows-sys-0.61.0//:windows_sys", # cfg(windows) ], "@rules_rust//rust/platform:i686-pc-windows-msvc": [ - "@vendor_ts__windows-sys-0.59.0//:windows_sys", # cfg(windows) + "@vendor_ts__windows-sys-0.61.0//:windows_sys", # cfg(windows) ], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [ - "@vendor_ts__windows-sys-0.59.0//:windows_sys", # cfg(windows) + "@vendor_ts__windows-sys-0.61.0//:windows_sys", # cfg(windows) ], "//conditions:default": [], }), diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.iana-time-zone-0.1.63.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.iana-time-zone-0.1.63.bazel index d66d4803a463..0f0237cf6b4c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.iana-time-zone-0.1.63.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.iana-time-zone-0.1.63.bazel @@ -127,7 +127,7 @@ rust_library( ], "@rules_rust//rust/platform:wasm32-unknown-unknown": [ "@vendor_ts__js-sys-0.3.78//:js_sys", # cfg(all(target_arch = "wasm32", target_os = "unknown")) - "@vendor_ts__log-0.4.28//:log", # cfg(all(target_arch = "wasm32", target_os = "unknown")) + "@vendor_ts__log-0.4.29//:log", # cfg(all(target_arch = "wasm32", target_os = "unknown")) "@vendor_ts__wasm-bindgen-0.2.101//:wasm_bindgen", # cfg(all(target_arch = "wasm32", target_os = "unknown")) ], "@rules_rust//rust/platform:x86_64-apple-darwin": [ diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.iana-time-zone-haiku-0.1.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.iana-time-zone-haiku-0.1.2.bazel index fe120c046896..4b3b49a6cace 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.iana-time-zone-haiku-0.1.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.iana-time-zone-haiku-0.1.2.bazel @@ -154,7 +154,7 @@ cargo_build_script( version = "0.1.2", visibility = ["//visibility:private"], deps = [ - "@vendor_ts__cc-1.2.37//:cc", + "@vendor_ts__cc-1.2.60//:cc", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.icu_collections-2.0.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.icu_collections-2.0.0.bazel deleted file mode 100644 index 4d6d31338250..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.icu_collections-2.0.0.bazel +++ /dev/null @@ -1,106 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "icu_collections", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_root = "src/lib.rs", - edition = "2021", - proc_macro_deps = [ - "@vendor_ts__displaydoc-0.2.5//:displaydoc", - ], - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=icu_collections", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "2.0.0", - deps = [ - "@vendor_ts__potential_utf-0.1.3//:potential_utf", - "@vendor_ts__yoke-0.8.0//:yoke", - "@vendor_ts__zerofrom-0.1.6//:zerofrom", - "@vendor_ts__zerovec-0.11.4//:zerovec", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.icu_locale_core-2.0.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.icu_locale_core-2.0.0.bazel deleted file mode 100644 index b0cb71a32999..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.icu_locale_core-2.0.0.bazel +++ /dev/null @@ -1,109 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "icu_locale_core", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "zerovec", - ], - crate_root = "src/lib.rs", - edition = "2021", - proc_macro_deps = [ - "@vendor_ts__displaydoc-0.2.5//:displaydoc", - ], - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=icu_locale_core", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "2.0.0", - deps = [ - "@vendor_ts__litemap-0.8.0//:litemap", - "@vendor_ts__tinystr-0.8.1//:tinystr", - "@vendor_ts__writeable-0.6.1//:writeable", - "@vendor_ts__zerovec-0.11.4//:zerovec", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.icu_normalizer-2.0.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.icu_normalizer-2.0.0.bazel deleted file mode 100644 index 460c5de79a2a..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.icu_normalizer-2.0.0.bazel +++ /dev/null @@ -1,110 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "icu_normalizer", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "compiled_data", - ], - crate_root = "src/lib.rs", - edition = "2021", - proc_macro_deps = [ - "@vendor_ts__displaydoc-0.2.5//:displaydoc", - ], - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=icu_normalizer", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "2.0.0", - deps = [ - "@vendor_ts__icu_collections-2.0.0//:icu_collections", - "@vendor_ts__icu_normalizer_data-2.0.0//:icu_normalizer_data", - "@vendor_ts__icu_provider-2.0.0//:icu_provider", - "@vendor_ts__smallvec-1.15.1//:smallvec", - "@vendor_ts__zerovec-0.11.4//:zerovec", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.icu_properties-2.0.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.icu_properties-2.0.1.bazel deleted file mode 100644 index 4416b8253053..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.icu_properties-2.0.1.bazel +++ /dev/null @@ -1,112 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "icu_properties", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "compiled_data", - ], - crate_root = "src/lib.rs", - edition = "2021", - proc_macro_deps = [ - "@vendor_ts__displaydoc-0.2.5//:displaydoc", - ], - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=icu_properties", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "2.0.1", - deps = [ - "@vendor_ts__icu_collections-2.0.0//:icu_collections", - "@vendor_ts__icu_locale_core-2.0.0//:icu_locale_core", - "@vendor_ts__icu_properties_data-2.0.1//:icu_properties_data", - "@vendor_ts__icu_provider-2.0.0//:icu_provider", - "@vendor_ts__potential_utf-0.1.3//:potential_utf", - "@vendor_ts__zerotrie-0.2.2//:zerotrie", - "@vendor_ts__zerovec-0.11.4//:zerovec", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.icu_provider-2.0.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.icu_provider-2.0.0.bazel deleted file mode 100644 index 08e96e830c79..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.icu_provider-2.0.0.bazel +++ /dev/null @@ -1,114 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "icu_provider", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "baked", - "zerotrie", - ], - crate_root = "src/lib.rs", - edition = "2021", - proc_macro_deps = [ - "@vendor_ts__displaydoc-0.2.5//:displaydoc", - ], - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=icu_provider", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "2.0.0", - deps = [ - "@vendor_ts__icu_locale_core-2.0.0//:icu_locale_core", - "@vendor_ts__stable_deref_trait-1.2.0//:stable_deref_trait", - "@vendor_ts__tinystr-0.8.1//:tinystr", - "@vendor_ts__writeable-0.6.1//:writeable", - "@vendor_ts__yoke-0.8.0//:yoke", - "@vendor_ts__zerofrom-0.1.6//:zerofrom", - "@vendor_ts__zerotrie-0.2.2//:zerotrie", - "@vendor_ts__zerovec-0.11.4//:zerovec", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.id-arena-2.3.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.id-arena-2.3.0.bazel new file mode 100644 index 000000000000..7561bcf77875 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.id-arena-2.3.0.bazel @@ -0,0 +1,101 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "id_arena", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "default", + "std", + ], + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=id-arena", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "2.3.0", +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.idna-1.1.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.idna-1.1.0.bazel deleted file mode 100644 index afb404176fd2..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.idna-1.1.0.bazel +++ /dev/null @@ -1,107 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "idna", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "alloc", - "compiled_data", - "std", - ], - crate_root = "src/lib.rs", - edition = "2018", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=idna", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "1.1.0", - deps = [ - "@vendor_ts__idna_adapter-1.2.1//:idna_adapter", - "@vendor_ts__smallvec-1.15.1//:smallvec", - "@vendor_ts__utf8_iter-1.0.4//:utf8_iter", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.idna_adapter-1.2.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.idna_adapter-1.2.1.bazel deleted file mode 100644 index 7f44f43eac20..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.idna_adapter-1.2.1.bazel +++ /dev/null @@ -1,104 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "idna_adapter", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "compiled_data", - ], - crate_root = "src/lib.rs", - edition = "2021", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=idna_adapter", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "1.2.1", - deps = [ - "@vendor_ts__icu_normalizer-2.0.0//:icu_normalizer", - "@vendor_ts__icu_properties-2.0.1//:icu_properties", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.indexmap-2.11.4.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.indexmap-2.14.0.bazel similarity index 97% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.indexmap-2.11.4.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.indexmap-2.14.0.bazel index 53cca2f56778..2728cd8cff29 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.indexmap-2.11.4.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.indexmap-2.14.0.bazel @@ -40,7 +40,7 @@ rust_library( "std", ], crate_root = "src/lib.rs", - edition = "2021", + edition = "2024", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -98,10 +98,10 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "2.11.4", + version = "2.14.0", deps = [ "@vendor_ts__equivalent-1.0.2//:equivalent", - "@vendor_ts__hashbrown-0.15.5//:hashbrown", + "@vendor_ts__hashbrown-0.17.0//:hashbrown", "@vendor_ts__serde_core-1.0.228//:serde_core", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inotify-0.11.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inotify-0.11.0.bazel index 6be5e3be9d96..44ae44447530 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inotify-0.11.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inotify-0.11.0.bazel @@ -95,8 +95,8 @@ rust_library( }), version = "0.11.0", deps = [ - "@vendor_ts__bitflags-2.9.4//:bitflags", + "@vendor_ts__bitflags-2.11.1//:bitflags", "@vendor_ts__inotify-sys-0.1.5//:inotify_sys", - "@vendor_ts__libc-0.2.175//:libc", + "@vendor_ts__libc-0.2.185//:libc", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inotify-sys-0.1.5.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inotify-sys-0.1.5.bazel index 9316b8d907c5..3d7224c6334c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inotify-sys-0.1.5.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inotify-sys-0.1.5.bazel @@ -95,6 +95,6 @@ rust_library( }), version = "0.1.5", deps = [ - "@vendor_ts__libc-0.2.175//:libc", + "@vendor_ts__libc-0.2.185//:libc", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.seize-0.5.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inventory-0.3.24.bazel similarity index 82% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.seize-0.5.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inventory-0.3.24.bazel index 192a60880283..f80d0c4f3e86 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.seize-0.5.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inventory-0.3.24.bazel @@ -17,7 +17,7 @@ cargo_toml_env_vars( ) rust_library( - name = "seize", + name = "inventory", srcs = glob( include = ["**/*.rs"], allow_empty = True, @@ -34,14 +34,26 @@ rust_library( "WORKSPACE.bazel", ], ), - crate_features = [ - "default", - "fast-barrier", - "libc", - "windows-sys", - ], crate_root = "src/lib.rs", edition = "2021", + proc_macro_deps = select({ + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [ + "@vendor_ts__rustversion-1.0.22//:rustversion", # cfg(target_family = "wasm") + ], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [ + "@vendor_ts__rustversion-1.0.22//:rustversion", # cfg(target_family = "wasm") + ], + "@rules_rust//rust/platform:wasm32-wasip1": [ + "@vendor_ts__rustversion-1.0.22//:rustversion", # cfg(target_family = "wasm") + ], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [ + "@vendor_ts__rustversion-1.0.22//:rustversion", # cfg(target_family = "wasm") + ], + "@rules_rust//rust/platform:wasm32-wasip2": [ + "@vendor_ts__rustversion-1.0.22//:rustversion", # cfg(target_family = "wasm") + ], + "//conditions:default": [], + }), rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -50,7 +62,7 @@ rust_library( ], tags = [ "cargo-bazel", - "crate-name=seize", + "crate-name=inventory", "manual", "noclippy", "norustfmt", @@ -99,19 +111,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.5.0", - deps = [ - "@vendor_ts__libc-0.2.175//:libc", - ] + select({ - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [ - "@vendor_ts__windows-sys-0.52.0//:windows_sys", # aarch64-pc-windows-msvc - ], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [ - "@vendor_ts__windows-sys-0.52.0//:windows_sys", # i686-pc-windows-msvc - ], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [ - "@vendor_ts__windows-sys-0.52.0//:windows_sys", # x86_64-pc-windows-msvc - ], - "//conditions:default": [], - }), + version = "0.3.24", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.is_terminal_polyfill-1.70.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.is_terminal_polyfill-1.70.2.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.is_terminal_polyfill-1.70.1.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.is_terminal_polyfill-1.70.2.bazel index 637041b51c3c..d42782128b45 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.is_terminal_polyfill-1.70.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.is_terminal_polyfill-1.70.2.bazel @@ -96,5 +96,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.70.1", + version = "1.70.2", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.itertools-0.12.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.itertools-0.12.1.bazel deleted file mode 100644 index ff3ee2442f86..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.itertools-0.12.1.bazel +++ /dev/null @@ -1,105 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "itertools", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "default", - "use_alloc", - "use_std", - ], - crate_root = "src/lib.rs", - edition = "2018", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=itertools", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.12.1", - deps = [ - "@vendor_ts__either-1.15.0//:either", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.itoa-1.0.15.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.itoa-1.0.18.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.itoa-1.0.15.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.itoa-1.0.18.bazel index 57e6f406e902..034a159fcebd 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.itoa-1.0.15.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.itoa-1.0.18.bazel @@ -35,7 +35,7 @@ rust_library( ], ), crate_root = "src/lib.rs", - edition = "2018", + edition = "2021", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -93,5 +93,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.15", + version = "1.0.18", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jobserver-0.1.34.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jobserver-0.1.34.bazel index 2546f6c8a77f..7516079777f6 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jobserver-0.1.34.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jobserver-0.1.34.bazel @@ -96,94 +96,94 @@ rust_library( version = "0.1.34", deps = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-apple-ios": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-linux-android": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [ - "@vendor_ts__getrandom-0.3.3//:getrandom", # cfg(windows) + "@vendor_ts__getrandom-0.3.4//:getrandom", # cfg(windows) ], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:armv7-linux-androideabi": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:i686-apple-darwin": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:i686-linux-android": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:i686-pc-windows-msvc": [ - "@vendor_ts__getrandom-0.3.3//:getrandom", # cfg(windows) + "@vendor_ts__getrandom-0.3.4//:getrandom", # cfg(windows) ], "@rules_rust//rust/platform:i686-unknown-freebsd": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-apple-darwin": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-apple-ios": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-linux-android": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [ - "@vendor_ts__getrandom-0.3.3//:getrandom", # cfg(windows) + "@vendor_ts__getrandom-0.3.4//:getrandom", # cfg(windows) ], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "//conditions:default": [], }), diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.js-sys-0.3.78.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.js-sys-0.3.78.bazel index 91569ee35263..43035d74ef9e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.js-sys-0.3.78.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.js-sys-0.3.78.bazel @@ -99,7 +99,7 @@ rust_library( }), version = "0.3.78", deps = [ - "@vendor_ts__once_cell-1.21.3//:once_cell", + "@vendor_ts__once_cell-1.21.4//:once_cell", "@vendor_ts__wasm-bindgen-0.2.101//:wasm_bindgen", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.kqueue-1.1.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.kqueue-1.1.1.bazel index 3943bd7e1b94..4bc4116a82af 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.kqueue-1.1.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.kqueue-1.1.1.bazel @@ -96,6 +96,6 @@ rust_library( version = "1.1.1", deps = [ "@vendor_ts__kqueue-sys-1.0.4//:kqueue_sys", - "@vendor_ts__libc-0.2.175//:libc", + "@vendor_ts__libc-0.2.185//:libc", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.kqueue-sys-1.0.4.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.kqueue-sys-1.0.4.bazel index dadf3b16e818..4257e12f1f1b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.kqueue-sys-1.0.4.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.kqueue-sys-1.0.4.bazel @@ -96,6 +96,6 @@ rust_library( version = "1.0.4", deps = [ "@vendor_ts__bitflags-1.3.2//:bitflags", - "@vendor_ts__libc-0.2.175//:libc", + "@vendor_ts__libc-0.2.185//:libc", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.leb128fmt-0.1.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.leb128fmt-0.1.0.bazel new file mode 100644 index 000000000000..a047cb9ea54a --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.leb128fmt-0.1.0.bazel @@ -0,0 +1,97 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "leb128fmt", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=leb128fmt", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.1.0", +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.libc-0.2.175.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.libc-0.2.185.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.libc-0.2.175.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.libc-0.2.185.bazel index b63baa0019d2..f2770b505b77 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.libc-0.2.175.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.libc-0.2.185.bazel @@ -101,9 +101,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.2.175", + version = "0.2.185", deps = [ - "@vendor_ts__libc-0.2.175//:build_script_build", + "@vendor_ts__libc-0.2.185//:build_script_build", ], ) @@ -159,7 +159,7 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "0.2.175", + version = "0.2.185", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.3.9.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.3.9.bazel index 45798b37ab70..42e47567b286 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.3.9.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.3.9.bazel @@ -99,6 +99,6 @@ rust_library( }), version = "0.3.9", deps = [ - "@vendor_ts__log-0.4.28//:log", + "@vendor_ts__log-0.4.29//:log", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.4.28.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.4.29.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.4.28.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.4.29.bazel index 26a8978cb1bf..ddb30f59c320 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.4.28.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.4.29.bazel @@ -96,5 +96,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.4.28", + version = "0.4.29", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.matchers-0.2.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.matchers-0.2.0.bazel index 3e43dd562abe..33d700108c78 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.matchers-0.2.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.matchers-0.2.0.bazel @@ -95,6 +95,6 @@ rust_library( }), version = "0.2.0", deps = [ - "@vendor_ts__regex-automata-0.4.11//:regex_automata", + "@vendor_ts__regex-automata-0.4.14//:regex_automata", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.memchr-2.7.5.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.memchr-2.8.0.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.memchr-2.7.5.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.memchr-2.8.0.bazel index 2338b0077dad..98e6008f7669 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.memchr-2.7.5.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.memchr-2.8.0.bazel @@ -98,5 +98,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "2.7.5", + version = "2.8.0", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.mio-1.0.4.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.mio-1.2.0.bazel similarity index 66% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.mio-1.0.4.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.mio-1.2.0.bazel index 4b6fcc8c864e..41f1dc8f9f15 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.mio-1.0.4.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.mio-1.2.0.bazel @@ -99,111 +99,111 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.4", + version = "1.2.0", deps = [ - "@vendor_ts__log-0.4.28//:log", + "@vendor_ts__log-0.4.29//:log", ] + select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:aarch64-apple-ios": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:aarch64-linux-android": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [ - "@vendor_ts__windows-sys-0.59.0//:windows_sys", # cfg(windows) + "@vendor_ts__windows-sys-0.61.0//:windows_sys", # cfg(windows) ], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:armv7-linux-androideabi": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:i686-apple-darwin": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:i686-linux-android": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:i686-pc-windows-msvc": [ - "@vendor_ts__windows-sys-0.59.0//:windows_sys", # cfg(windows) + "@vendor_ts__windows-sys-0.61.0//:windows_sys", # cfg(windows) ], "@rules_rust//rust/platform:i686-unknown-freebsd": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:wasm32-wasip1": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(target_os = "wasi") + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) "@vendor_ts__wasi-0.11.1-wasi-snapshot-preview1//:wasi", # cfg(target_os = "wasi") ], "@rules_rust//rust/platform:wasm32-wasip1-threads": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(target_os = "wasi") + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) "@vendor_ts__wasi-0.11.1-wasi-snapshot-preview1//:wasi", # cfg(target_os = "wasi") ], "@rules_rust//rust/platform:wasm32-wasip2": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(target_os = "wasi") + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) "@vendor_ts__wasi-0.11.1-wasi-snapshot-preview1//:wasi", # cfg(target_os = "wasi") ], "@rules_rust//rust/platform:x86_64-apple-darwin": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:x86_64-apple-ios": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:x86_64-linux-android": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [ - "@vendor_ts__windows-sys-0.59.0//:windows_sys", # cfg(windows) + "@vendor_ts__windows-sys-0.61.0//:windows_sys", # cfg(windows) ], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "//conditions:default": [], }), diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.notify-8.2.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.notify-8.2.0.bazel index 0c838f2c6c31..15f478f30bb5 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.notify-8.2.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.notify-8.2.0.bazel @@ -100,111 +100,111 @@ rust_library( }), version = "8.2.0", deps = [ - "@vendor_ts__libc-0.2.175//:libc", - "@vendor_ts__log-0.4.28//:log", + "@vendor_ts__libc-0.2.185//:libc", + "@vendor_ts__log-0.4.29//:log", "@vendor_ts__notify-types-2.0.0//:notify_types", "@vendor_ts__walkdir-2.5.0//:walkdir", ] + select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [ - "@vendor_ts__bitflags-2.9.4//:bitflags", # cfg(target_os = "macos") + "@vendor_ts__bitflags-2.11.1//:bitflags", # cfg(target_os = "macos") "@vendor_ts__fsevent-sys-4.1.0//:fsevent_sys", # aarch64-apple-darwin ], "@rules_rust//rust/platform:aarch64-apple-ios": [ "@vendor_ts__kqueue-1.1.1//:kqueue", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) - "@vendor_ts__mio-1.0.4//:mio", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) + "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) ], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ "@vendor_ts__kqueue-1.1.1//:kqueue", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) - "@vendor_ts__mio-1.0.4//:mio", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) + "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) ], "@rules_rust//rust/platform:aarch64-linux-android": [ "@vendor_ts__inotify-0.11.0//:inotify", # cfg(any(target_os = "linux", target_os = "android")) - "@vendor_ts__mio-1.0.4//:mio", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [ "@vendor_ts__windows-sys-0.60.2//:windows_sys", # cfg(windows) ], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [ "@vendor_ts__inotify-0.11.0//:inotify", # cfg(any(target_os = "linux", target_os = "android")) - "@vendor_ts__mio-1.0.4//:mio", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [ "@vendor_ts__inotify-0.11.0//:inotify", # cfg(any(target_os = "linux", target_os = "android")) - "@vendor_ts__mio-1.0.4//:mio", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [ "@vendor_ts__inotify-0.11.0//:inotify", # cfg(any(target_os = "linux", target_os = "android")) - "@vendor_ts__mio-1.0.4//:mio", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [ "@vendor_ts__inotify-0.11.0//:inotify", # cfg(any(target_os = "linux", target_os = "android")) - "@vendor_ts__mio-1.0.4//:mio", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], "@rules_rust//rust/platform:armv7-linux-androideabi": [ "@vendor_ts__inotify-0.11.0//:inotify", # cfg(any(target_os = "linux", target_os = "android")) - "@vendor_ts__mio-1.0.4//:mio", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [ "@vendor_ts__inotify-0.11.0//:inotify", # cfg(any(target_os = "linux", target_os = "android")) - "@vendor_ts__mio-1.0.4//:mio", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], "@rules_rust//rust/platform:i686-apple-darwin": [ - "@vendor_ts__bitflags-2.9.4//:bitflags", # cfg(target_os = "macos") + "@vendor_ts__bitflags-2.11.1//:bitflags", # cfg(target_os = "macos") "@vendor_ts__fsevent-sys-4.1.0//:fsevent_sys", # i686-apple-darwin ], "@rules_rust//rust/platform:i686-linux-android": [ "@vendor_ts__inotify-0.11.0//:inotify", # cfg(any(target_os = "linux", target_os = "android")) - "@vendor_ts__mio-1.0.4//:mio", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], "@rules_rust//rust/platform:i686-pc-windows-msvc": [ "@vendor_ts__windows-sys-0.60.2//:windows_sys", # cfg(windows) ], "@rules_rust//rust/platform:i686-unknown-freebsd": [ "@vendor_ts__kqueue-1.1.1//:kqueue", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) - "@vendor_ts__mio-1.0.4//:mio", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) + "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) ], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ "@vendor_ts__inotify-0.11.0//:inotify", # cfg(any(target_os = "linux", target_os = "android")) - "@vendor_ts__mio-1.0.4//:mio", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ "@vendor_ts__inotify-0.11.0//:inotify", # cfg(any(target_os = "linux", target_os = "android")) - "@vendor_ts__mio-1.0.4//:mio", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [ "@vendor_ts__inotify-0.11.0//:inotify", # cfg(any(target_os = "linux", target_os = "android")) - "@vendor_ts__mio-1.0.4//:mio", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ "@vendor_ts__inotify-0.11.0//:inotify", # cfg(any(target_os = "linux", target_os = "android")) - "@vendor_ts__mio-1.0.4//:mio", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], "@rules_rust//rust/platform:x86_64-apple-darwin": [ - "@vendor_ts__bitflags-2.9.4//:bitflags", # cfg(target_os = "macos") + "@vendor_ts__bitflags-2.11.1//:bitflags", # cfg(target_os = "macos") "@vendor_ts__fsevent-sys-4.1.0//:fsevent_sys", # x86_64-apple-darwin ], "@rules_rust//rust/platform:x86_64-apple-ios": [ "@vendor_ts__kqueue-1.1.1//:kqueue", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) - "@vendor_ts__mio-1.0.4//:mio", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) + "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) ], "@rules_rust//rust/platform:x86_64-linux-android": [ "@vendor_ts__inotify-0.11.0//:inotify", # cfg(any(target_os = "linux", target_os = "android")) - "@vendor_ts__mio-1.0.4//:mio", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [ "@vendor_ts__windows-sys-0.60.2//:windows_sys", # cfg(windows) ], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [ "@vendor_ts__kqueue-1.1.1//:kqueue", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) - "@vendor_ts__mio-1.0.4//:mio", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) + "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) ], "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [ "@vendor_ts__inotify-0.11.0//:inotify", # cfg(any(target_os = "linux", target_os = "android")) - "@vendor_ts__mio-1.0.4//:mio", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [ "@vendor_ts__inotify-0.11.0//:inotify", # cfg(any(target_os = "linux", target_os = "android")) - "@vendor_ts__mio-1.0.4//:mio", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], "//conditions:default": [], }), diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num-conv-0.1.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num-conv-0.2.1.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num-conv-0.1.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num-conv-0.2.1.bazel index 587cbdf418fa..b63f4d82b41c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num-conv-0.1.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num-conv-0.2.1.bazel @@ -93,5 +93,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.1.0", + version = "0.2.1", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num_cpus-1.17.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num_cpus-1.17.0.bazel index 00293e65e2da..8686950c32d9 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num_cpus-1.17.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num_cpus-1.17.0.bazel @@ -96,118 +96,118 @@ rust_library( version = "1.17.0", deps = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:aarch64-apple-ios": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:aarch64-linux-android": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:aarch64-unknown-uefi": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:armv7-linux-androideabi": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:i686-apple-darwin": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:i686-linux-android": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:i686-unknown-freebsd": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:thumbv7em-none-eabi": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:wasm32-unknown-unknown": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:wasm32-wasip1": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:wasm32-wasip1-threads": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:wasm32-wasip2": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:x86_64-apple-darwin": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:x86_64-apple-ios": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:x86_64-linux-android": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:x86_64-unknown-none": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:x86_64-unknown-uefi": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.185//:libc", # cfg(not(windows)) ], "//conditions:default": [], }), diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num_threads-0.1.7.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num_threads-0.1.7.bazel new file mode 100644 index 000000000000..a27523c51bcf --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num_threads-0.1.7.bazel @@ -0,0 +1,124 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "num_threads", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2015", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=num_threads", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.1.7", + deps = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd")) + ], + "@rules_rust//rust/platform:aarch64-apple-ios": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd")) + ], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd")) + ], + "@rules_rust//rust/platform:i686-apple-darwin": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd")) + ], + "@rules_rust//rust/platform:i686-unknown-freebsd": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd")) + ], + "@rules_rust//rust/platform:x86_64-apple-darwin": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd")) + ], + "@rules_rust//rust/platform:x86_64-apple-ios": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd")) + ], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [ + "@vendor_ts__libc-0.2.185//:libc", # cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd")) + ], + "//conditions:default": [], + }), +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.once_cell-1.21.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.once_cell-1.21.4.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.once_cell-1.21.3.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.once_cell-1.21.4.bazel index d10ec0a4bceb..e556134028f4 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.once_cell-1.21.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.once_cell-1.21.4.bazel @@ -99,5 +99,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.21.3", + version = "1.21.4", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ordered-float-2.10.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ordered-float-2.10.1.bazel deleted file mode 100644 index 58f67759d31e..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ordered-float-2.10.1.bazel +++ /dev/null @@ -1,104 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "ordered_float", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "default", - "std", - ], - crate_root = "src/lib.rs", - edition = "2018", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=ordered-float", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "2.10.1", - deps = [ - "@vendor_ts__num-traits-0.2.19//:num_traits", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.os_str_bytes-7.1.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.os_str_bytes-7.1.1.bazel index 05f864c1758a..605d319f7fef 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.os_str_bytes-7.1.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.os_str_bytes-7.1.1.bazel @@ -100,6 +100,6 @@ rust_library( }), version = "7.1.1", deps = [ - "@vendor_ts__memchr-2.7.5//:memchr", + "@vendor_ts__memchr-2.8.0//:memchr", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.papaya-0.2.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.papaya-0.2.3.bazel deleted file mode 100644 index 27bb71298a83..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.papaya-0.2.3.bazel +++ /dev/null @@ -1,104 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "papaya", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "default", - ], - crate_root = "src/lib.rs", - edition = "2021", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=papaya", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.2.3", - deps = [ - "@vendor_ts__equivalent-1.0.2//:equivalent", - "@vendor_ts__seize-0.5.0//:seize", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.parking_lot_core-0.9.11.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.parking_lot_core-0.9.11.bazel index f2199e602c2b..f3a551c78f0c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.parking_lot_core-0.9.11.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.parking_lot_core-0.9.11.bazel @@ -99,99 +99,99 @@ rust_library( }), version = "0.9.11", deps = [ - "@vendor_ts__cfg-if-1.0.3//:cfg_if", + "@vendor_ts__cfg-if-1.0.4//:cfg_if", "@vendor_ts__parking_lot_core-0.9.11//:build_script_build", "@vendor_ts__smallvec-1.15.1//:smallvec", ] + select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-apple-ios": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-linux-android": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [ "@vendor_ts__windows-targets-0.52.6//:windows_targets", # cfg(windows) ], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:armv7-linux-androideabi": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:i686-apple-darwin": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:i686-linux-android": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:i686-pc-windows-msvc": [ "@vendor_ts__windows-targets-0.52.6//:windows_targets", # cfg(windows) ], "@rules_rust//rust/platform:i686-unknown-freebsd": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-apple-darwin": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-apple-ios": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-linux-android": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [ "@vendor_ts__windows-targets-0.52.6//:windows_targets", # cfg(windows) ], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "//conditions:default": [], }), diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pear_codegen-0.2.9.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pear_codegen-0.2.9.bazel index 2b0175999d4a..6badf66e2aef 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pear_codegen-0.2.9.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pear_codegen-0.2.9.bazel @@ -95,9 +95,9 @@ rust_proc_macro( }), version = "0.2.9", deps = [ - "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", + "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", "@vendor_ts__proc-macro2-diagnostics-0.10.1//:proc_macro2_diagnostics", - "@vendor_ts__quote-1.0.41//:quote", - "@vendor_ts__syn-2.0.106//:syn", + "@vendor_ts__quote-1.0.45//:quote", + "@vendor_ts__syn-2.0.117//:syn", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.perf-event-0.4.7.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.perf-event-0.4.8.bazel similarity index 95% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.perf-event-0.4.7.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.perf-event-0.4.8.bazel index 8ba85de58daa..21a10d903c5d 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.perf-event-0.4.7.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.perf-event-0.4.8.bazel @@ -34,6 +34,10 @@ rust_library( "WORKSPACE.bazel", ], ), + crate_features = [ + "default", + "hooks", + ], crate_root = "src/lib.rs", edition = "2018", rustc_env_files = [ @@ -93,9 +97,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.4.7", + version = "0.4.8", deps = [ - "@vendor_ts__libc-0.2.175//:libc", - "@vendor_ts__perf-event-open-sys-1.0.1//:perf_event_open_sys", + "@vendor_ts__libc-0.2.185//:libc", + "@vendor_ts__perf-event-open-sys-4.0.0//:perf_event_open_sys", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.perf-event-open-sys-1.0.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.perf-event-open-sys-4.0.0.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.perf-event-open-sys-1.0.1.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.perf-event-open-sys-4.0.0.bazel index 120842ef4fbb..016be83654e3 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.perf-event-open-sys-1.0.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.perf-event-open-sys-4.0.0.bazel @@ -93,8 +93,8 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.1", + version = "4.0.0", deps = [ - "@vendor_ts__libc-0.2.175//:libc", + "@vendor_ts__libc-0.2.185//:libc", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.petgraph-0.8.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.petgraph-0.8.3.bazel new file mode 100644 index 000000000000..054c06f6350a --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.petgraph-0.8.3.bazel @@ -0,0 +1,102 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "petgraph", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=petgraph", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.8.3", + deps = [ + "@vendor_ts__fixedbitset-0.5.7//:fixedbitset", + "@vendor_ts__hashbrown-0.15.5//:hashbrown", + "@vendor_ts__indexmap-2.14.0//:indexmap", + ], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pin-project-lite-0.2.16.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pin-project-lite-0.2.17.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pin-project-lite-0.2.16.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pin-project-lite-0.2.17.bazel index 9234efd2e0e2..c0fad00dd23e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pin-project-lite-0.2.16.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pin-project-lite-0.2.17.bazel @@ -93,5 +93,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.2.16", + version = "0.2.17", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.erased-serde-0.4.6.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.postcard-1.1.3.bazel similarity index 94% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.erased-serde-0.4.6.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.postcard-1.1.3.bazel index 7c25af547746..8a9c9489923b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.erased-serde-0.4.6.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.postcard-1.1.3.bazel @@ -17,7 +17,7 @@ cargo_toml_env_vars( ) rust_library( - name = "erased_serde", + name = "postcard", srcs = glob( include = ["**/*.rs"], allow_empty = True, @@ -36,6 +36,9 @@ rust_library( ), crate_features = [ "alloc", + "default", + "heapless", + "heapless-cas", ], crate_root = "src/lib.rs", edition = "2021", @@ -47,7 +50,7 @@ rust_library( ], tags = [ "cargo-bazel", - "crate-name=erased-serde", + "crate-name=postcard", "manual", "noclippy", "norustfmt", @@ -96,9 +99,10 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.4.6", + version = "1.1.3", deps = [ + "@vendor_ts__cobs-0.3.0//:cobs", + "@vendor_ts__heapless-0.7.17//:heapless", "@vendor_ts__serde-1.0.228//:serde", - "@vendor_ts__typeid-1.0.3//:typeid", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.potential_utf-0.1.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.potential_utf-0.1.3.bazel deleted file mode 100644 index 4a5d00884b13..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.potential_utf-0.1.3.bazel +++ /dev/null @@ -1,103 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "potential_utf", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "zerovec", - ], - crate_root = "src/lib.rs", - edition = "2021", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=potential_utf", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.1.3", - deps = [ - "@vendor_ts__zerovec-0.11.4//:zerovec", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.icu_normalizer_data-2.0.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.prettyplease-0.2.37.bazel similarity index 93% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.icu_normalizer_data-2.0.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.prettyplease-0.2.37.bazel index f5367ece66c1..ed6e293e5d6b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.icu_normalizer_data-2.0.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.prettyplease-0.2.37.bazel @@ -21,7 +21,7 @@ cargo_toml_env_vars( ) rust_library( - name = "icu_normalizer_data", + name = "prettyplease", srcs = glob( include = ["**/*.rs"], allow_empty = True, @@ -48,7 +48,7 @@ rust_library( ], tags = [ "cargo-bazel", - "crate-name=icu_normalizer_data", + "crate-name=prettyplease", "manual", "noclippy", "norustfmt", @@ -97,9 +97,11 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "2.0.0", + version = "0.2.37", deps = [ - "@vendor_ts__icu_normalizer_data-2.0.0//:build_script_build", + "@vendor_ts__prettyplease-0.2.37//:build_script_build", + "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", + "@vendor_ts__syn-2.0.117//:syn", ], ) @@ -137,7 +139,8 @@ cargo_build_script( ], ), edition = "2021", - pkg_name = "icu_normalizer_data", + links = "prettyplease02", + pkg_name = "prettyplease", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -146,12 +149,12 @@ cargo_build_script( ], tags = [ "cargo-bazel", - "crate-name=icu_normalizer_data", + "crate-name=prettyplease", "manual", "noclippy", "norustfmt", ], - version = "2.0.0", + version = "0.2.37", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.proc-macro2-1.0.101.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.proc-macro2-1.0.106.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.proc-macro2-1.0.101.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.proc-macro2-1.0.106.bazel index bb23160f9b8f..dec96ff20b92 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.proc-macro2-1.0.101.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.proc-macro2-1.0.106.bazel @@ -101,10 +101,10 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.101", + version = "1.0.106", deps = [ - "@vendor_ts__proc-macro2-1.0.101//:build_script_build", - "@vendor_ts__unicode-ident-1.0.19//:unicode_ident", + "@vendor_ts__proc-macro2-1.0.106//:build_script_build", + "@vendor_ts__unicode-ident-1.0.24//:unicode_ident", ], ) @@ -160,7 +160,7 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "1.0.101", + version = "1.0.106", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.proc-macro2-diagnostics-0.10.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.proc-macro2-diagnostics-0.10.1.bazel index 9a309e0d43a0..334933c92a6a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.proc-macro2-diagnostics-0.10.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.proc-macro2-diagnostics-0.10.1.bazel @@ -104,10 +104,10 @@ rust_library( }), version = "0.10.1", deps = [ - "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", + "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", "@vendor_ts__proc-macro2-diagnostics-0.10.1//:build_script_build", - "@vendor_ts__quote-1.0.41//:quote", - "@vendor_ts__syn-2.0.106//:syn", + "@vendor_ts__quote-1.0.45//:quote", + "@vendor_ts__syn-2.0.117//:syn", "@vendor_ts__yansi-1.0.1//:yansi", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.quote-1.0.41.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.quote-1.0.45.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.quote-1.0.41.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.quote-1.0.45.bazel index 621cfb33ab4e..8ffcb2477317 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.quote-1.0.41.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.quote-1.0.45.bazel @@ -43,7 +43,7 @@ rust_library( "proc-macro", ], crate_root = "src/lib.rs", - edition = "2018", + edition = "2021", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -101,10 +101,10 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.41", + version = "1.0.45", deps = [ - "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", - "@vendor_ts__quote-1.0.41//:build_script_build", + "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", + "@vendor_ts__quote-1.0.45//:build_script_build", ], ) @@ -145,7 +145,7 @@ cargo_build_script( "WORKSPACE.bazel", ], ), - edition = "2018", + edition = "2021", pkg_name = "quote", rustc_env_files = [ ":cargo_toml_env_vars", @@ -160,7 +160,7 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "1.0.41", + version = "1.0.45", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.r-efi-6.0.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.r-efi-6.0.0.bazel new file mode 100644 index 000000000000..5ee0d985fe56 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.r-efi-6.0.0.bazel @@ -0,0 +1,97 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "r_efi", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2018", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=r-efi", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "6.0.0", +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_abi-0.123.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_abi-0.143.0.bazel similarity index 91% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_abi-0.123.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_abi-0.143.0.bazel index 6222aecac162..c26dd82ee19d 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_abi-0.123.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_abi-0.143.0.bazel @@ -23,8 +23,8 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra-ap-rustc_hashes-0.123.0//:ra_ap_rustc_hashes": "rustc_hashes", - "@vendor_ts__ra-ap-rustc_index-0.123.0//:ra_ap_rustc_index": "rustc_index", + "@vendor_ts__ra-ap-rustc_hashes-0.143.0//:ra_ap_rustc_hashes": "rustc_hashes", + "@vendor_ts__ra-ap-rustc_index-0.143.0//:ra_ap_rustc_index": "rustc_index", }, compile_data = glob( include = ["**"], @@ -97,11 +97,11 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.123.0", + version = "0.143.0", deps = [ - "@vendor_ts__bitflags-2.9.4//:bitflags", - "@vendor_ts__ra-ap-rustc_hashes-0.123.0//:ra_ap_rustc_hashes", - "@vendor_ts__ra-ap-rustc_index-0.123.0//:ra_ap_rustc_index", - "@vendor_ts__tracing-0.1.41//:tracing", + "@vendor_ts__bitflags-2.11.1//:bitflags", + "@vendor_ts__ra-ap-rustc_hashes-0.143.0//:ra_ap_rustc_hashes", + "@vendor_ts__ra-ap-rustc_index-0.143.0//:ra_ap_rustc_index", + "@vendor_ts__tracing-0.1.44//:tracing", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_ast_ir-0.143.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_ast_ir-0.143.0.bazel new file mode 100644 index 000000000000..3dfb4af1d544 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_ast_ir-0.143.0.bazel @@ -0,0 +1,97 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "ra_ap_rustc_ast_ir", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2024", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=ra-ap-rustc_ast_ir", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.143.0", +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_hashes-0.123.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_hashes-0.143.0.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_hashes-0.123.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_hashes-0.143.0.bazel index 6d510190f025..6b0e793e07f6 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_hashes-0.123.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_hashes-0.143.0.bazel @@ -93,7 +93,7 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.123.0", + version = "0.143.0", deps = [ "@vendor_ts__rustc-stable-hash-0.1.2//:rustc_stable_hash", ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index-0.123.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index-0.143.0.bazel similarity index 94% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index-0.123.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index-0.143.0.bazel index b8d5f8af922f..db5b0ccbd889 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index-0.123.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index-0.143.0.bazel @@ -23,7 +23,7 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra-ap-rustc_index_macros-0.123.0//:ra_ap_rustc_index_macros": "rustc_index_macros", + "@vendor_ts__ra-ap-rustc_index_macros-0.143.0//:ra_ap_rustc_index_macros": "rustc_index_macros", }, compile_data = glob( include = ["**"], @@ -40,7 +40,7 @@ rust_library( crate_root = "src/lib.rs", edition = "2024", proc_macro_deps = [ - "@vendor_ts__ra-ap-rustc_index_macros-0.123.0//:ra_ap_rustc_index_macros", + "@vendor_ts__ra-ap-rustc_index_macros-0.143.0//:ra_ap_rustc_index_macros", ], rustc_env_files = [ ":cargo_toml_env_vars", @@ -99,8 +99,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.123.0", - deps = [ - "@vendor_ts__smallvec-1.15.1//:smallvec", - ], + version = "0.143.0", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index_macros-0.123.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index_macros-0.143.0.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index_macros-0.123.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index_macros-0.143.0.bazel index f25a9e197681..13c12f07ce27 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index_macros-0.123.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index_macros-0.143.0.bazel @@ -93,10 +93,10 @@ rust_proc_macro( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.123.0", + version = "0.143.0", deps = [ - "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", - "@vendor_ts__quote-1.0.41//:quote", - "@vendor_ts__syn-2.0.106//:syn", + "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", + "@vendor_ts__quote-1.0.45//:quote", + "@vendor_ts__syn-2.0.117//:syn", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_lexer-0.123.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_lexer-0.123.0.bazel deleted file mode 100644 index 5ed4bd3f912f..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_lexer-0.123.0.bazel +++ /dev/null @@ -1,102 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "ra_ap_rustc_lexer", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_root = "src/lib.rs", - edition = "2024", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=ra-ap-rustc_lexer", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.123.0", - deps = [ - "@vendor_ts__memchr-2.7.5//:memchr", - "@vendor_ts__unicode-properties-0.1.3//:unicode_properties", - "@vendor_ts__unicode-xid-0.2.6//:unicode_xid", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_lexer-0.121.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_lexer-0.143.0.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_lexer-0.121.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_lexer-0.143.0.bazel index 1ba187aeb8f2..e02e8e09065c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_lexer-0.121.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_lexer-0.143.0.bazel @@ -93,9 +93,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.121.0", + version = "0.143.0", deps = [ - "@vendor_ts__memchr-2.7.5//:memchr", + "@vendor_ts__memchr-2.8.0//:memchr", "@vendor_ts__unicode-properties-0.1.3//:unicode_properties", "@vendor_ts__unicode-xid-0.2.6//:unicode_xid", ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_next_trait_solver-0.143.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_next_trait_solver-0.143.0.bazel new file mode 100644 index 000000000000..8d9cd2fa75a1 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_next_trait_solver-0.143.0.bazel @@ -0,0 +1,111 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "ra_ap_rustc_next_trait_solver", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + aliases = { + "@vendor_ts__ra-ap-rustc_index-0.143.0//:ra_ap_rustc_index": "rustc_index", + "@vendor_ts__ra-ap-rustc_type_ir-0.143.0//:ra_ap_rustc_type_ir": "rustc_type_ir", + "@vendor_ts__ra-ap-rustc_type_ir_macros-0.143.0//:ra_ap_rustc_type_ir_macros": "rustc_type_ir_macros", + }, + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2024", + proc_macro_deps = [ + "@vendor_ts__derive-where-1.6.1//:derive_where", + "@vendor_ts__ra-ap-rustc_type_ir_macros-0.143.0//:ra_ap_rustc_type_ir_macros", + ], + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=ra-ap-rustc_next_trait_solver", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.143.0", + deps = [ + "@vendor_ts__ra-ap-rustc_index-0.143.0//:ra_ap_rustc_index", + "@vendor_ts__ra-ap-rustc_type_ir-0.143.0//:ra_ap_rustc_type_ir", + "@vendor_ts__tracing-0.1.44//:tracing", + ], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_parse_format-0.121.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_parse_format-0.143.0.bazel similarity index 95% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_parse_format-0.121.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_parse_format-0.143.0.bazel index 987599aa9648..9b4e436a3cad 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_parse_format-0.121.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_parse_format-0.143.0.bazel @@ -23,7 +23,7 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra-ap-rustc_lexer-0.121.0//:ra_ap_rustc_lexer": "rustc_lexer", + "@vendor_ts__ra-ap-rustc_lexer-0.143.0//:ra_ap_rustc_lexer": "rustc_lexer", }, compile_data = glob( include = ["**"], @@ -96,9 +96,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.121.0", + version = "0.143.0", deps = [ - "@vendor_ts__ra-ap-rustc_lexer-0.121.0//:ra_ap_rustc_lexer", - "@vendor_ts__rustc-literal-escaper-0.0.4//:rustc_literal_escaper", + "@vendor_ts__ra-ap-rustc_lexer-0.143.0//:ra_ap_rustc_lexer", + "@vendor_ts__rustc-literal-escaper-0.0.5//:rustc_literal_escaper", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_pattern_analysis-0.123.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_pattern_analysis-0.143.0.bazel similarity index 94% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_pattern_analysis-0.123.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_pattern_analysis-0.143.0.bazel index e81038a00849..2f8087c18312 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_pattern_analysis-0.123.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_pattern_analysis-0.143.0.bazel @@ -23,7 +23,7 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra-ap-rustc_index-0.123.0//:ra_ap_rustc_index": "rustc_index", + "@vendor_ts__ra-ap-rustc_index-0.143.0//:ra_ap_rustc_index": "rustc_index", }, compile_data = glob( include = ["**"], @@ -96,12 +96,12 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.123.0", + version = "0.143.0", deps = [ - "@vendor_ts__ra-ap-rustc_index-0.123.0//:ra_ap_rustc_index", - "@vendor_ts__rustc-hash-2.1.1//:rustc_hash", + "@vendor_ts__ra-ap-rustc_index-0.143.0//:ra_ap_rustc_index", + "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", "@vendor_ts__rustc_apfloat-0.2.3-llvm-462a31f5a5ab//:rustc_apfloat", "@vendor_ts__smallvec-1.15.1//:smallvec", - "@vendor_ts__tracing-0.1.41//:tracing", + "@vendor_ts__tracing-0.1.44//:tracing", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_type_ir-0.143.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_type_ir-0.143.0.bazel new file mode 100644 index 000000000000..a1f54dc10b6d --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_type_ir-0.143.0.bazel @@ -0,0 +1,118 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "ra_ap_rustc_type_ir", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + aliases = { + "@vendor_ts__ra-ap-rustc_ast_ir-0.143.0//:ra_ap_rustc_ast_ir": "rustc_ast_ir", + "@vendor_ts__ra-ap-rustc_index-0.143.0//:ra_ap_rustc_index": "rustc_index", + "@vendor_ts__ra-ap-rustc_type_ir_macros-0.143.0//:ra_ap_rustc_type_ir_macros": "rustc_type_ir_macros", + }, + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2024", + proc_macro_deps = [ + "@vendor_ts__derive-where-1.6.1//:derive_where", + "@vendor_ts__ra-ap-rustc_type_ir_macros-0.143.0//:ra_ap_rustc_type_ir_macros", + ], + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=ra-ap-rustc_type_ir", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.143.0", + deps = [ + "@vendor_ts__arrayvec-0.7.6//:arrayvec", + "@vendor_ts__bitflags-2.11.1//:bitflags", + "@vendor_ts__ena-0.14.3//:ena", + "@vendor_ts__indexmap-2.14.0//:indexmap", + "@vendor_ts__ra-ap-rustc_ast_ir-0.143.0//:ra_ap_rustc_ast_ir", + "@vendor_ts__ra-ap-rustc_index-0.143.0//:ra_ap_rustc_index", + "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", + "@vendor_ts__smallvec-1.15.1//:smallvec", + "@vendor_ts__thin-vec-0.2.14//:thin_vec", + "@vendor_ts__tracing-0.1.44//:tracing", + ], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.yoke-derive-0.8.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_type_ir_macros-0.143.0.bazel similarity index 93% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.yoke-derive-0.8.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_type_ir_macros-0.143.0.bazel index 1529534e17b2..899303af5f3f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.yoke-derive-0.8.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_type_ir_macros-0.143.0.bazel @@ -17,7 +17,7 @@ cargo_toml_env_vars( ) rust_proc_macro( - name = "yoke_derive", + name = "ra_ap_rustc_type_ir_macros", srcs = glob( include = ["**/*.rs"], allow_empty = True, @@ -35,7 +35,7 @@ rust_proc_macro( ], ), crate_root = "src/lib.rs", - edition = "2021", + edition = "2024", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -44,7 +44,7 @@ rust_proc_macro( ], tags = [ "cargo-bazel", - "crate-name=yoke-derive", + "crate-name=ra-ap-rustc_type_ir_macros", "manual", "noclippy", "norustfmt", @@ -93,11 +93,11 @@ rust_proc_macro( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.8.0", + version = "0.143.0", deps = [ - "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", - "@vendor_ts__quote-1.0.41//:quote", - "@vendor_ts__syn-2.0.106//:syn", + "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", + "@vendor_ts__quote-1.0.45//:quote", + "@vendor_ts__syn-2.0.117//:syn", "@vendor_ts__synstructure-0.13.2//:synstructure", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_base_db-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_base_db-0.0.328.bazel similarity index 79% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_base_db-0.0.301.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_base_db-0.0.328.bazel index 60cece39191b..42da0d0298c4 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_base_db-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_base_db-0.0.328.bazel @@ -23,12 +23,12 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_cfg-0.0.301//:ra_ap_cfg": "cfg", - "@vendor_ts__ra_ap_intern-0.0.301//:ra_ap_intern": "intern", - "@vendor_ts__ra_ap_query-group-macro-0.0.301//:ra_ap_query_group_macro": "query_group", - "@vendor_ts__ra_ap_span-0.0.301//:ra_ap_span": "span", - "@vendor_ts__ra_ap_syntax-0.0.301//:ra_ap_syntax": "syntax", - "@vendor_ts__ra_ap_vfs-0.0.301//:ra_ap_vfs": "vfs", + "@vendor_ts__ra_ap_cfg-0.0.328//:ra_ap_cfg": "cfg", + "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern": "intern", + "@vendor_ts__ra_ap_query-group-macro-0.0.328//:ra_ap_query_group_macro": "query_group", + "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span": "span", + "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax": "syntax", + "@vendor_ts__ra_ap_vfs-0.0.328//:ra_ap_vfs": "vfs", }, compile_data = glob( include = ["**"], @@ -42,11 +42,14 @@ rust_library( "WORKSPACE.bazel", ], ), + crate_features = [ + "default", + ], crate_root = "src/lib.rs", edition = "2024", proc_macro_deps = [ - "@vendor_ts__ra_ap_query-group-macro-0.0.301//:ra_ap_query_group_macro", - "@vendor_ts__salsa-macros-0.23.0//:salsa_macros", + "@vendor_ts__ra_ap_query-group-macro-0.0.328//:ra_ap_query_group_macro", + "@vendor_ts__salsa-macros-0.25.2//:salsa_macros", ], rustc_env_files = [ ":cargo_toml_env_vars", @@ -105,20 +108,20 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.301", + version = "0.0.328", deps = [ "@vendor_ts__dashmap-6.1.0//:dashmap", - "@vendor_ts__indexmap-2.11.4//:indexmap", + "@vendor_ts__indexmap-2.14.0//:indexmap", "@vendor_ts__la-arena-0.3.1//:la_arena", - "@vendor_ts__ra_ap_cfg-0.0.301//:ra_ap_cfg", - "@vendor_ts__ra_ap_intern-0.0.301//:ra_ap_intern", - "@vendor_ts__ra_ap_span-0.0.301//:ra_ap_span", - "@vendor_ts__ra_ap_syntax-0.0.301//:ra_ap_syntax", - "@vendor_ts__ra_ap_vfs-0.0.301//:ra_ap_vfs", - "@vendor_ts__rustc-hash-2.1.1//:rustc_hash", - "@vendor_ts__salsa-0.23.0//:salsa", - "@vendor_ts__semver-1.0.26//:semver", - "@vendor_ts__tracing-0.1.41//:tracing", - "@vendor_ts__triomphe-0.1.14//:triomphe", + "@vendor_ts__ra_ap_cfg-0.0.328//:ra_ap_cfg", + "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern", + "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span", + "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax", + "@vendor_ts__ra_ap_vfs-0.0.328//:ra_ap_vfs", + "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", + "@vendor_ts__salsa-0.25.2//:salsa", + "@vendor_ts__semver-1.0.28//:semver", + "@vendor_ts__tracing-0.1.44//:tracing", + "@vendor_ts__triomphe-0.1.15//:triomphe", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_cfg-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_cfg-0.0.328.bazel similarity index 88% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_cfg-0.0.301.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_cfg-0.0.328.bazel index 35af421f0231..e02c90697076 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_cfg-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_cfg-0.0.328.bazel @@ -23,8 +23,9 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_intern-0.0.301//:ra_ap_intern": "intern", - "@vendor_ts__ra_ap_tt-0.0.301//:ra_ap_tt": "tt", + "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern": "intern", + "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax": "syntax", + "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt": "tt", }, compile_data = glob( include = ["**"], @@ -39,6 +40,8 @@ rust_library( ], ), crate_features = [ + "default", + "syntax", "tt", ], crate_root = "src/lib.rs", @@ -100,11 +103,12 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.301", + version = "0.0.328", deps = [ - "@vendor_ts__ra_ap_intern-0.0.301//:ra_ap_intern", - "@vendor_ts__ra_ap_tt-0.0.301//:ra_ap_tt", - "@vendor_ts__rustc-hash-2.1.1//:rustc_hash", - "@vendor_ts__tracing-0.1.41//:tracing", + "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern", + "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax", + "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt", + "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", + "@vendor_ts__tracing-0.1.44//:tracing", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_edition-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_edition-0.0.328.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_edition-0.0.301.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_edition-0.0.328.bazel index 50b4f2e87d15..1fa96a118d49 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_edition-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_edition-0.0.328.bazel @@ -93,5 +93,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.301", + version = "0.0.328", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir-0.0.328.bazel similarity index 74% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir-0.0.301.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir-0.0.328.bazel index c1272206d934..ff003137b5de 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir-0.0.328.bazel @@ -23,16 +23,16 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_base_db-0.0.301//:ra_ap_base_db": "base_db", - "@vendor_ts__ra_ap_cfg-0.0.301//:ra_ap_cfg": "cfg", - "@vendor_ts__ra_ap_hir_def-0.0.301//:ra_ap_hir_def": "hir_def", - "@vendor_ts__ra_ap_hir_expand-0.0.301//:ra_ap_hir_expand": "hir_expand", - "@vendor_ts__ra_ap_hir_ty-0.0.301//:ra_ap_hir_ty": "hir_ty", - "@vendor_ts__ra_ap_intern-0.0.301//:ra_ap_intern": "intern", - "@vendor_ts__ra_ap_span-0.0.301//:ra_ap_span": "span", - "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx": "stdx", - "@vendor_ts__ra_ap_syntax-0.0.301//:ra_ap_syntax": "syntax", - "@vendor_ts__ra_ap_tt-0.0.301//:ra_ap_tt": "tt", + "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db": "base_db", + "@vendor_ts__ra_ap_cfg-0.0.328//:ra_ap_cfg": "cfg", + "@vendor_ts__ra_ap_hir_def-0.0.328//:ra_ap_hir_def": "hir_def", + "@vendor_ts__ra_ap_hir_expand-0.0.328//:ra_ap_hir_expand": "hir_expand", + "@vendor_ts__ra_ap_hir_ty-0.0.328//:ra_ap_hir_ty": "hir_ty", + "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern": "intern", + "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span": "span", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", + "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax": "syntax", + "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt": "tt", }, compile_data = glob( include = ["**"], @@ -105,25 +105,26 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.301", + version = "0.0.328", deps = [ "@vendor_ts__arrayvec-0.7.6//:arrayvec", "@vendor_ts__either-1.15.0//:either", - "@vendor_ts__indexmap-2.11.4//:indexmap", "@vendor_ts__itertools-0.14.0//:itertools", - "@vendor_ts__ra_ap_base_db-0.0.301//:ra_ap_base_db", - "@vendor_ts__ra_ap_cfg-0.0.301//:ra_ap_cfg", - "@vendor_ts__ra_ap_hir_def-0.0.301//:ra_ap_hir_def", - "@vendor_ts__ra_ap_hir_expand-0.0.301//:ra_ap_hir_expand", - "@vendor_ts__ra_ap_hir_ty-0.0.301//:ra_ap_hir_ty", - "@vendor_ts__ra_ap_intern-0.0.301//:ra_ap_intern", - "@vendor_ts__ra_ap_span-0.0.301//:ra_ap_span", - "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx", - "@vendor_ts__ra_ap_syntax-0.0.301//:ra_ap_syntax", - "@vendor_ts__ra_ap_tt-0.0.301//:ra_ap_tt", - "@vendor_ts__rustc-hash-2.1.1//:rustc_hash", + "@vendor_ts__ra-ap-rustc_type_ir-0.143.0//:ra_ap_rustc_type_ir", + "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db", + "@vendor_ts__ra_ap_cfg-0.0.328//:ra_ap_cfg", + "@vendor_ts__ra_ap_hir_def-0.0.328//:ra_ap_hir_def", + "@vendor_ts__ra_ap_hir_expand-0.0.328//:ra_ap_hir_expand", + "@vendor_ts__ra_ap_hir_ty-0.0.328//:ra_ap_hir_ty", + "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern", + "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", + "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax", + "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt", + "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", + "@vendor_ts__serde_json-1.0.149//:serde_json", "@vendor_ts__smallvec-1.15.1//:smallvec", - "@vendor_ts__tracing-0.1.41//:tracing", - "@vendor_ts__triomphe-0.1.14//:triomphe", + "@vendor_ts__tracing-0.1.44//:tracing", + "@vendor_ts__triomphe-0.1.15//:triomphe", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_def-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_def-0.0.328.bazel similarity index 73% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_def-0.0.301.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_def-0.0.328.bazel index bd85f440ba5d..ba19f647b52a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_def-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_def-0.0.328.bazel @@ -23,16 +23,16 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_base_db-0.0.301//:ra_ap_base_db": "base_db", - "@vendor_ts__ra_ap_cfg-0.0.301//:ra_ap_cfg": "cfg", - "@vendor_ts__ra_ap_hir_expand-0.0.301//:ra_ap_hir_expand": "hir_expand", - "@vendor_ts__ra_ap_intern-0.0.301//:ra_ap_intern": "intern", - "@vendor_ts__ra_ap_mbe-0.0.301//:ra_ap_mbe": "mbe", - "@vendor_ts__ra_ap_query-group-macro-0.0.301//:ra_ap_query_group_macro": "query_group", - "@vendor_ts__ra_ap_span-0.0.301//:ra_ap_span": "span", - "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx": "stdx", - "@vendor_ts__ra_ap_syntax-0.0.301//:ra_ap_syntax": "syntax", - "@vendor_ts__ra_ap_tt-0.0.301//:ra_ap_tt": "tt", + "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db": "base_db", + "@vendor_ts__ra_ap_cfg-0.0.328//:ra_ap_cfg": "cfg", + "@vendor_ts__ra_ap_hir_expand-0.0.328//:ra_ap_hir_expand": "hir_expand", + "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern": "intern", + "@vendor_ts__ra_ap_query-group-macro-0.0.328//:ra_ap_query_group_macro": "query_group", + "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span": "span", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", + "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax": "syntax", + "@vendor_ts__ra_ap_syntax-bridge-0.0.328//:ra_ap_syntax_bridge": "syntax_bridge", + "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt": "tt", }, compile_data = glob( include = ["**"], @@ -49,8 +49,8 @@ rust_library( crate_root = "src/lib.rs", edition = "2024", proc_macro_deps = [ - "@vendor_ts__ra_ap_query-group-macro-0.0.301//:ra_ap_query_group_macro", - "@vendor_ts__salsa-macros-0.23.0//:salsa_macros", + "@vendor_ts__ra_ap_query-group-macro-0.0.328//:ra_ap_query_group_macro", + "@vendor_ts__salsa-macros-0.25.2//:salsa_macros", ], rustc_env_files = [ ":cargo_toml_env_vars", @@ -109,35 +109,34 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.301", + version = "0.0.328", deps = [ "@vendor_ts__arrayvec-0.7.6//:arrayvec", - "@vendor_ts__bitflags-2.9.4//:bitflags", + "@vendor_ts__bitflags-2.11.1//:bitflags", "@vendor_ts__cov-mark-2.1.0//:cov_mark", "@vendor_ts__drop_bomb-0.1.5//:drop_bomb", "@vendor_ts__either-1.15.0//:either", "@vendor_ts__fst-0.4.7//:fst", - "@vendor_ts__indexmap-2.11.4//:indexmap", + "@vendor_ts__indexmap-2.14.0//:indexmap", "@vendor_ts__itertools-0.14.0//:itertools", "@vendor_ts__la-arena-0.3.1//:la_arena", - "@vendor_ts__ra-ap-rustc_abi-0.123.0//:ra_ap_rustc_abi", - "@vendor_ts__ra-ap-rustc_parse_format-0.121.0//:ra_ap_rustc_parse_format", - "@vendor_ts__ra_ap_base_db-0.0.301//:ra_ap_base_db", - "@vendor_ts__ra_ap_cfg-0.0.301//:ra_ap_cfg", - "@vendor_ts__ra_ap_hir_expand-0.0.301//:ra_ap_hir_expand", - "@vendor_ts__ra_ap_intern-0.0.301//:ra_ap_intern", - "@vendor_ts__ra_ap_mbe-0.0.301//:ra_ap_mbe", - "@vendor_ts__ra_ap_span-0.0.301//:ra_ap_span", - "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx", - "@vendor_ts__ra_ap_syntax-0.0.301//:ra_ap_syntax", - "@vendor_ts__ra_ap_tt-0.0.301//:ra_ap_tt", - "@vendor_ts__rustc-hash-2.1.1//:rustc_hash", + "@vendor_ts__ra-ap-rustc_abi-0.143.0//:ra_ap_rustc_abi", + "@vendor_ts__ra-ap-rustc_parse_format-0.143.0//:ra_ap_rustc_parse_format", + "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db", + "@vendor_ts__ra_ap_cfg-0.0.328//:ra_ap_cfg", + "@vendor_ts__ra_ap_hir_expand-0.0.328//:ra_ap_hir_expand", + "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern", + "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", + "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax", + "@vendor_ts__ra_ap_syntax-bridge-0.0.328//:ra_ap_syntax_bridge", + "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt", + "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", "@vendor_ts__rustc_apfloat-0.2.3-llvm-462a31f5a5ab//:rustc_apfloat", - "@vendor_ts__salsa-0.23.0//:salsa", + "@vendor_ts__salsa-0.25.2//:salsa", "@vendor_ts__smallvec-1.15.1//:smallvec", - "@vendor_ts__text-size-1.1.1//:text_size", "@vendor_ts__thin-vec-0.2.14//:thin_vec", - "@vendor_ts__tracing-0.1.41//:tracing", - "@vendor_ts__triomphe-0.1.14//:triomphe", + "@vendor_ts__tracing-0.1.44//:tracing", + "@vendor_ts__triomphe-0.1.15//:triomphe", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_expand-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_expand-0.0.328.bazel similarity index 73% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_expand-0.0.301.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_expand-0.0.328.bazel index 1593a5a8db93..82ed45d9b5ca 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_expand-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_expand-0.0.328.bazel @@ -23,17 +23,17 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_base_db-0.0.301//:ra_ap_base_db": "base_db", - "@vendor_ts__ra_ap_cfg-0.0.301//:ra_ap_cfg": "cfg", - "@vendor_ts__ra_ap_intern-0.0.301//:ra_ap_intern": "intern", - "@vendor_ts__ra_ap_mbe-0.0.301//:ra_ap_mbe": "mbe", - "@vendor_ts__ra_ap_parser-0.0.301//:ra_ap_parser": "parser", - "@vendor_ts__ra_ap_query-group-macro-0.0.301//:ra_ap_query_group_macro": "query_group", - "@vendor_ts__ra_ap_span-0.0.301//:ra_ap_span": "span", - "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx": "stdx", - "@vendor_ts__ra_ap_syntax-0.0.301//:ra_ap_syntax": "syntax", - "@vendor_ts__ra_ap_syntax-bridge-0.0.301//:ra_ap_syntax_bridge": "syntax_bridge", - "@vendor_ts__ra_ap_tt-0.0.301//:ra_ap_tt": "tt", + "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db": "base_db", + "@vendor_ts__ra_ap_cfg-0.0.328//:ra_ap_cfg": "cfg", + "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern": "intern", + "@vendor_ts__ra_ap_mbe-0.0.328//:ra_ap_mbe": "mbe", + "@vendor_ts__ra_ap_parser-0.0.328//:ra_ap_parser": "parser", + "@vendor_ts__ra_ap_query-group-macro-0.0.328//:ra_ap_query_group_macro": "query_group", + "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span": "span", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", + "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax": "syntax", + "@vendor_ts__ra_ap_syntax-bridge-0.0.328//:ra_ap_syntax_bridge": "syntax_bridge", + "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt": "tt", }, compile_data = glob( include = ["**"], @@ -50,8 +50,8 @@ rust_library( crate_root = "src/lib.rs", edition = "2024", proc_macro_deps = [ - "@vendor_ts__ra_ap_query-group-macro-0.0.301//:ra_ap_query_group_macro", - "@vendor_ts__salsa-macros-0.23.0//:salsa_macros", + "@vendor_ts__ra_ap_query-group-macro-0.0.328//:ra_ap_query_group_macro", + "@vendor_ts__salsa-macros-0.25.2//:salsa_macros", ], rustc_env_files = [ ":cargo_toml_env_vars", @@ -110,25 +110,26 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.301", + version = "0.0.328", deps = [ "@vendor_ts__cov-mark-2.1.0//:cov_mark", "@vendor_ts__either-1.15.0//:either", "@vendor_ts__itertools-0.14.0//:itertools", - "@vendor_ts__ra_ap_base_db-0.0.301//:ra_ap_base_db", - "@vendor_ts__ra_ap_cfg-0.0.301//:ra_ap_cfg", - "@vendor_ts__ra_ap_intern-0.0.301//:ra_ap_intern", - "@vendor_ts__ra_ap_mbe-0.0.301//:ra_ap_mbe", - "@vendor_ts__ra_ap_parser-0.0.301//:ra_ap_parser", - "@vendor_ts__ra_ap_span-0.0.301//:ra_ap_span", - "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx", - "@vendor_ts__ra_ap_syntax-0.0.301//:ra_ap_syntax", - "@vendor_ts__ra_ap_syntax-bridge-0.0.301//:ra_ap_syntax_bridge", - "@vendor_ts__ra_ap_tt-0.0.301//:ra_ap_tt", - "@vendor_ts__rustc-hash-2.1.1//:rustc_hash", - "@vendor_ts__salsa-0.23.0//:salsa", + "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db", + "@vendor_ts__ra_ap_cfg-0.0.328//:ra_ap_cfg", + "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern", + "@vendor_ts__ra_ap_mbe-0.0.328//:ra_ap_mbe", + "@vendor_ts__ra_ap_parser-0.0.328//:ra_ap_parser", + "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", + "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax", + "@vendor_ts__ra_ap_syntax-bridge-0.0.328//:ra_ap_syntax_bridge", + "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt", + "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", + "@vendor_ts__salsa-0.25.2//:salsa", "@vendor_ts__smallvec-1.15.1//:smallvec", - "@vendor_ts__tracing-0.1.41//:tracing", - "@vendor_ts__triomphe-0.1.14//:triomphe", + "@vendor_ts__thin-vec-0.2.14//:thin_vec", + "@vendor_ts__tracing-0.1.44//:tracing", + "@vendor_ts__triomphe-0.1.15//:triomphe", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_ty-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_ty-0.0.328.bazel similarity index 68% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_ty-0.0.301.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_ty-0.0.328.bazel index 2dbbe4f77179..655284645523 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_ty-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_ty-0.0.328.bazel @@ -23,14 +23,15 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_base_db-0.0.301//:ra_ap_base_db": "base_db", - "@vendor_ts__ra_ap_hir_def-0.0.301//:ra_ap_hir_def": "hir_def", - "@vendor_ts__ra_ap_hir_expand-0.0.301//:ra_ap_hir_expand": "hir_expand", - "@vendor_ts__ra_ap_intern-0.0.301//:ra_ap_intern": "intern", - "@vendor_ts__ra_ap_query-group-macro-0.0.301//:ra_ap_query_group_macro": "query_group", - "@vendor_ts__ra_ap_span-0.0.301//:ra_ap_span": "span", - "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx": "stdx", - "@vendor_ts__ra_ap_syntax-0.0.301//:ra_ap_syntax": "syntax", + "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db": "base_db", + "@vendor_ts__ra_ap_hir_def-0.0.328//:ra_ap_hir_def": "hir_def", + "@vendor_ts__ra_ap_hir_expand-0.0.328//:ra_ap_hir_expand": "hir_expand", + "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern": "intern", + "@vendor_ts__ra_ap_macros-0.0.328//:ra_ap_macros": "macros", + "@vendor_ts__ra_ap_query-group-macro-0.0.328//:ra_ap_query_group_macro": "query_group", + "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span": "span", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", + "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax": "syntax", }, compile_data = glob( include = ["**"], @@ -47,9 +48,10 @@ rust_library( crate_root = "src/lib.rs", edition = "2024", proc_macro_deps = [ - "@vendor_ts__chalk-derive-0.103.0//:chalk_derive", - "@vendor_ts__ra_ap_query-group-macro-0.0.301//:ra_ap_query_group_macro", - "@vendor_ts__salsa-macros-0.23.0//:salsa_macros", + "@vendor_ts__ra_ap_macros-0.0.328//:ra_ap_macros", + "@vendor_ts__ra_ap_query-group-macro-0.0.328//:ra_ap_query_group_macro", + "@vendor_ts__salsa-macros-0.25.2//:salsa_macros", + "@vendor_ts__serde_derive-1.0.228//:serde_derive", ], rustc_env_files = [ ":cargo_toml_env_vars", @@ -108,37 +110,40 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.301", + version = "0.0.328", deps = [ "@vendor_ts__arrayvec-0.7.6//:arrayvec", - "@vendor_ts__bitflags-2.9.4//:bitflags", - "@vendor_ts__chalk-ir-0.103.0//:chalk_ir", - "@vendor_ts__chalk-recursive-0.103.0//:chalk_recursive", - "@vendor_ts__chalk-solve-0.103.0//:chalk_solve", "@vendor_ts__cov-mark-2.1.0//:cov_mark", "@vendor_ts__either-1.15.0//:either", "@vendor_ts__ena-0.14.3//:ena", - "@vendor_ts__indexmap-2.11.4//:indexmap", + "@vendor_ts__indexmap-2.14.0//:indexmap", "@vendor_ts__itertools-0.14.0//:itertools", "@vendor_ts__la-arena-0.3.1//:la_arena", "@vendor_ts__oorandom-11.1.5//:oorandom", - "@vendor_ts__ra-ap-rustc_abi-0.123.0//:ra_ap_rustc_abi", - "@vendor_ts__ra-ap-rustc_index-0.123.0//:ra_ap_rustc_index", - "@vendor_ts__ra-ap-rustc_pattern_analysis-0.123.0//:ra_ap_rustc_pattern_analysis", - "@vendor_ts__ra_ap_base_db-0.0.301//:ra_ap_base_db", - "@vendor_ts__ra_ap_hir_def-0.0.301//:ra_ap_hir_def", - "@vendor_ts__ra_ap_hir_expand-0.0.301//:ra_ap_hir_expand", - "@vendor_ts__ra_ap_intern-0.0.301//:ra_ap_intern", - "@vendor_ts__ra_ap_span-0.0.301//:ra_ap_span", - "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx", - "@vendor_ts__ra_ap_syntax-0.0.301//:ra_ap_syntax", - "@vendor_ts__rustc-hash-2.1.1//:rustc_hash", + "@vendor_ts__petgraph-0.8.3//:petgraph", + "@vendor_ts__ra-ap-rustc_abi-0.143.0//:ra_ap_rustc_abi", + "@vendor_ts__ra-ap-rustc_ast_ir-0.143.0//:ra_ap_rustc_ast_ir", + "@vendor_ts__ra-ap-rustc_index-0.143.0//:ra_ap_rustc_index", + "@vendor_ts__ra-ap-rustc_next_trait_solver-0.143.0//:ra_ap_rustc_next_trait_solver", + "@vendor_ts__ra-ap-rustc_pattern_analysis-0.143.0//:ra_ap_rustc_pattern_analysis", + "@vendor_ts__ra-ap-rustc_type_ir-0.143.0//:ra_ap_rustc_type_ir", + "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db", + "@vendor_ts__ra_ap_hir_def-0.0.328//:ra_ap_hir_def", + "@vendor_ts__ra_ap_hir_expand-0.0.328//:ra_ap_hir_expand", + "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern", + "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", + "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax", + "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", "@vendor_ts__rustc_apfloat-0.2.3-llvm-462a31f5a5ab//:rustc_apfloat", - "@vendor_ts__salsa-0.23.0//:salsa", - "@vendor_ts__scoped-tls-1.0.1//:scoped_tls", + "@vendor_ts__salsa-0.25.2//:salsa", + "@vendor_ts__serde-1.0.228//:serde", "@vendor_ts__smallvec-1.15.1//:smallvec", - "@vendor_ts__tracing-0.1.41//:tracing", - "@vendor_ts__triomphe-0.1.14//:triomphe", + "@vendor_ts__thin-vec-0.2.14//:thin_vec", + "@vendor_ts__tracing-0.1.44//:tracing", + "@vendor_ts__tracing-subscriber-0.3.23//:tracing_subscriber", + "@vendor_ts__tracing-tree-0.4.1//:tracing_tree", + "@vendor_ts__triomphe-0.1.15//:triomphe", "@vendor_ts__typed-arena-2.0.2//:typed_arena", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_ide_db-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_ide_db-0.0.328.bazel similarity index 69% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_ide_db-0.0.301.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_ide_db-0.0.328.bazel index 66d015a2efbf..c9160ac9b0f8 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_ide_db-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_ide_db-0.0.328.bazel @@ -23,15 +23,18 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_base_db-0.0.301//:ra_ap_base_db": "base_db", - "@vendor_ts__ra_ap_hir-0.0.301//:ra_ap_hir": "hir", - "@vendor_ts__ra_ap_parser-0.0.301//:ra_ap_parser": "parser", - "@vendor_ts__ra_ap_profile-0.0.301//:ra_ap_profile": "profile", - "@vendor_ts__ra_ap_query-group-macro-0.0.301//:ra_ap_query_group_macro": "query_group", - "@vendor_ts__ra_ap_span-0.0.301//:ra_ap_span": "span", - "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx": "stdx", - "@vendor_ts__ra_ap_syntax-0.0.301//:ra_ap_syntax": "syntax", - "@vendor_ts__ra_ap_vfs-0.0.301//:ra_ap_vfs": "vfs", + "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db": "base_db", + "@vendor_ts__ra_ap_hir-0.0.328//:ra_ap_hir": "hir", + "@vendor_ts__ra_ap_macros-0.0.328//:ra_ap_macros": "macros", + "@vendor_ts__ra_ap_parser-0.0.328//:ra_ap_parser": "parser", + "@vendor_ts__ra_ap_profile-0.0.328//:ra_ap_profile": "profile", + "@vendor_ts__ra_ap_query-group-macro-0.0.328//:ra_ap_query_group_macro": "query_group", + "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span": "span", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", + "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax": "syntax", + "@vendor_ts__ra_ap_test_fixture-0.0.328//:ra_ap_test_fixture": "test_fixture", + "@vendor_ts__ra_ap_test_utils-0.0.328//:ra_ap_test_utils": "test_utils", + "@vendor_ts__ra_ap_vfs-0.0.328//:ra_ap_vfs": "vfs", }, compile_data = glob( include = ["**"], @@ -45,11 +48,15 @@ rust_library( "WORKSPACE.bazel", ], ), + crate_features = [ + "default", + ], crate_root = "src/lib.rs", edition = "2024", proc_macro_deps = [ - "@vendor_ts__ra_ap_query-group-macro-0.0.301//:ra_ap_query_group_macro", - "@vendor_ts__salsa-macros-0.23.0//:salsa_macros", + "@vendor_ts__ra_ap_macros-0.0.328//:ra_ap_macros", + "@vendor_ts__ra_ap_query-group-macro-0.0.328//:ra_ap_query_group_macro", + "@vendor_ts__salsa-macros-0.25.2//:salsa_macros", ], rustc_env_files = [ ":cargo_toml_env_vars", @@ -108,31 +115,33 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.301", + version = "0.0.328", deps = [ "@vendor_ts__arrayvec-0.7.6//:arrayvec", - "@vendor_ts__bitflags-2.9.4//:bitflags", + "@vendor_ts__bitflags-2.11.1//:bitflags", "@vendor_ts__cov-mark-2.1.0//:cov_mark", "@vendor_ts__crossbeam-channel-0.5.15//:crossbeam_channel", "@vendor_ts__either-1.15.0//:either", "@vendor_ts__fst-0.4.7//:fst", - "@vendor_ts__indexmap-2.11.4//:indexmap", "@vendor_ts__itertools-0.14.0//:itertools", "@vendor_ts__line-index-0.1.2//:line_index", - "@vendor_ts__memchr-2.7.5//:memchr", + "@vendor_ts__memchr-2.8.0//:memchr", "@vendor_ts__nohash-hasher-0.2.0//:nohash_hasher", - "@vendor_ts__ra_ap_base_db-0.0.301//:ra_ap_base_db", - "@vendor_ts__ra_ap_hir-0.0.301//:ra_ap_hir", - "@vendor_ts__ra_ap_parser-0.0.301//:ra_ap_parser", - "@vendor_ts__ra_ap_profile-0.0.301//:ra_ap_profile", - "@vendor_ts__ra_ap_span-0.0.301//:ra_ap_span", - "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx", - "@vendor_ts__ra_ap_syntax-0.0.301//:ra_ap_syntax", - "@vendor_ts__ra_ap_vfs-0.0.301//:ra_ap_vfs", - "@vendor_ts__rayon-1.11.0//:rayon", - "@vendor_ts__rustc-hash-2.1.1//:rustc_hash", - "@vendor_ts__salsa-0.23.0//:salsa", - "@vendor_ts__tracing-0.1.41//:tracing", - "@vendor_ts__triomphe-0.1.14//:triomphe", + "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db", + "@vendor_ts__ra_ap_hir-0.0.328//:ra_ap_hir", + "@vendor_ts__ra_ap_parser-0.0.328//:ra_ap_parser", + "@vendor_ts__ra_ap_profile-0.0.328//:ra_ap_profile", + "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", + "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax", + "@vendor_ts__ra_ap_test_fixture-0.0.328//:ra_ap_test_fixture", + "@vendor_ts__ra_ap_test_utils-0.0.328//:ra_ap_test_utils", + "@vendor_ts__ra_ap_vfs-0.0.328//:ra_ap_vfs", + "@vendor_ts__rayon-1.12.0//:rayon", + "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", + "@vendor_ts__salsa-0.25.2//:salsa", + "@vendor_ts__smallvec-1.15.1//:smallvec", + "@vendor_ts__tracing-0.1.44//:tracing", + "@vendor_ts__triomphe-0.1.15//:triomphe", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_intern-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_intern-0.0.328.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_intern-0.0.301.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_intern-0.0.328.bazel index 9216daa25b57..e2b1c874bcbc 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_intern-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_intern-0.0.328.bazel @@ -93,11 +93,12 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.301", + version = "0.0.328", deps = [ "@vendor_ts__dashmap-6.1.0//:dashmap", "@vendor_ts__hashbrown-0.14.5//:hashbrown", - "@vendor_ts__rustc-hash-2.1.1//:rustc_hash", - "@vendor_ts__triomphe-0.1.14//:triomphe", + "@vendor_ts__rayon-1.12.0//:rayon", + "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", + "@vendor_ts__triomphe-0.1.15//:triomphe", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_load-cargo-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_load-cargo-0.0.328.bazel similarity index 78% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_load-cargo-0.0.301.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_load-cargo-0.0.328.bazel index cc43b8dd6306..28c08916e4ef 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_load-cargo-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_load-cargo-0.0.328.bazel @@ -23,15 +23,15 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_hir_expand-0.0.301//:ra_ap_hir_expand": "hir_expand", - "@vendor_ts__ra_ap_ide_db-0.0.301//:ra_ap_ide_db": "ide_db", - "@vendor_ts__ra_ap_intern-0.0.301//:ra_ap_intern": "intern", - "@vendor_ts__ra_ap_proc_macro_api-0.0.301//:ra_ap_proc_macro_api": "proc_macro_api", - "@vendor_ts__ra_ap_project_model-0.0.301//:ra_ap_project_model": "project_model", - "@vendor_ts__ra_ap_span-0.0.301//:ra_ap_span": "span", - "@vendor_ts__ra_ap_tt-0.0.301//:ra_ap_tt": "tt", - "@vendor_ts__ra_ap_vfs-0.0.301//:ra_ap_vfs": "vfs", - "@vendor_ts__ra_ap_vfs-notify-0.0.301//:ra_ap_vfs_notify": "vfs_notify", + "@vendor_ts__ra_ap_hir_expand-0.0.328//:ra_ap_hir_expand": "hir_expand", + "@vendor_ts__ra_ap_ide_db-0.0.328//:ra_ap_ide_db": "ide_db", + "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern": "intern", + "@vendor_ts__ra_ap_proc_macro_api-0.0.328//:ra_ap_proc_macro_api": "proc_macro_api", + "@vendor_ts__ra_ap_project_model-0.0.328//:ra_ap_project_model": "project_model", + "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span": "span", + "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt": "tt", + "@vendor_ts__ra_ap_vfs-0.0.328//:ra_ap_vfs": "vfs", + "@vendor_ts__ra_ap_vfs-notify-0.0.328//:ra_ap_vfs_notify": "vfs_notify", }, compile_data = glob( include = ["**"], @@ -104,20 +104,20 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.301", + version = "0.0.328", deps = [ - "@vendor_ts__anyhow-1.0.100//:anyhow", + "@vendor_ts__anyhow-1.0.102//:anyhow", "@vendor_ts__crossbeam-channel-0.5.15//:crossbeam_channel", "@vendor_ts__itertools-0.14.0//:itertools", - "@vendor_ts__ra_ap_hir_expand-0.0.301//:ra_ap_hir_expand", - "@vendor_ts__ra_ap_ide_db-0.0.301//:ra_ap_ide_db", - "@vendor_ts__ra_ap_intern-0.0.301//:ra_ap_intern", - "@vendor_ts__ra_ap_proc_macro_api-0.0.301//:ra_ap_proc_macro_api", - "@vendor_ts__ra_ap_project_model-0.0.301//:ra_ap_project_model", - "@vendor_ts__ra_ap_span-0.0.301//:ra_ap_span", - "@vendor_ts__ra_ap_tt-0.0.301//:ra_ap_tt", - "@vendor_ts__ra_ap_vfs-0.0.301//:ra_ap_vfs", - "@vendor_ts__ra_ap_vfs-notify-0.0.301//:ra_ap_vfs_notify", - "@vendor_ts__tracing-0.1.41//:tracing", + "@vendor_ts__ra_ap_hir_expand-0.0.328//:ra_ap_hir_expand", + "@vendor_ts__ra_ap_ide_db-0.0.328//:ra_ap_ide_db", + "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern", + "@vendor_ts__ra_ap_proc_macro_api-0.0.328//:ra_ap_proc_macro_api", + "@vendor_ts__ra_ap_project_model-0.0.328//:ra_ap_project_model", + "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span", + "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt", + "@vendor_ts__ra_ap_vfs-0.0.328//:ra_ap_vfs", + "@vendor_ts__ra_ap_vfs-notify-0.0.328//:ra_ap_vfs_notify", + "@vendor_ts__tracing-0.1.44//:tracing", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-derive-0.103.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_macros-0.0.328.bazel similarity index 94% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-derive-0.103.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_macros-0.0.328.bazel index d43c7b6b893d..6411cde26a3b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-derive-0.103.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_macros-0.0.328.bazel @@ -17,7 +17,7 @@ cargo_toml_env_vars( ) rust_proc_macro( - name = "chalk_derive", + name = "ra_ap_macros", srcs = glob( include = ["**/*.rs"], allow_empty = True, @@ -35,7 +35,7 @@ rust_proc_macro( ], ), crate_root = "src/lib.rs", - edition = "2018", + edition = "2024", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -44,7 +44,7 @@ rust_proc_macro( ], tags = [ "cargo-bazel", - "crate-name=chalk-derive", + "crate-name=ra_ap_macros", "manual", "noclippy", "norustfmt", @@ -93,11 +93,11 @@ rust_proc_macro( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.103.0", + version = "0.0.328", deps = [ - "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", - "@vendor_ts__quote-1.0.41//:quote", - "@vendor_ts__syn-2.0.106//:syn", + "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", + "@vendor_ts__quote-1.0.45//:quote", + "@vendor_ts__syn-2.0.117//:syn", "@vendor_ts__synstructure-0.13.2//:synstructure", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_mbe-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_mbe-0.0.328.bazel similarity index 81% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_mbe-0.0.301.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_mbe-0.0.328.bazel index bdf4d2970741..9d7a08379d64 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_mbe-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_mbe-0.0.328.bazel @@ -23,12 +23,12 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_intern-0.0.301//:ra_ap_intern": "intern", - "@vendor_ts__ra_ap_parser-0.0.301//:ra_ap_parser": "parser", - "@vendor_ts__ra_ap_span-0.0.301//:ra_ap_span": "span", - "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx": "stdx", - "@vendor_ts__ra_ap_syntax-bridge-0.0.301//:ra_ap_syntax_bridge": "syntax_bridge", - "@vendor_ts__ra_ap_tt-0.0.301//:ra_ap_tt": "tt", + "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern": "intern", + "@vendor_ts__ra_ap_parser-0.0.328//:ra_ap_parser": "parser", + "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span": "span", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", + "@vendor_ts__ra_ap_syntax-bridge-0.0.328//:ra_ap_syntax_bridge": "syntax_bridge", + "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt": "tt", }, compile_data = glob( include = ["**"], @@ -101,18 +101,20 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.301", + version = "0.0.328", deps = [ "@vendor_ts__arrayvec-0.7.6//:arrayvec", + "@vendor_ts__bitflags-2.11.1//:bitflags", "@vendor_ts__cov-mark-2.1.0//:cov_mark", - "@vendor_ts__ra-ap-rustc_lexer-0.123.0//:ra_ap_rustc_lexer", - "@vendor_ts__ra_ap_intern-0.0.301//:ra_ap_intern", - "@vendor_ts__ra_ap_parser-0.0.301//:ra_ap_parser", - "@vendor_ts__ra_ap_span-0.0.301//:ra_ap_span", - "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx", - "@vendor_ts__ra_ap_syntax-bridge-0.0.301//:ra_ap_syntax_bridge", - "@vendor_ts__ra_ap_tt-0.0.301//:ra_ap_tt", - "@vendor_ts__rustc-hash-2.1.1//:rustc_hash", + "@vendor_ts__ra-ap-rustc_lexer-0.143.0//:ra_ap_rustc_lexer", + "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern", + "@vendor_ts__ra_ap_parser-0.0.328//:ra_ap_parser", + "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", + "@vendor_ts__ra_ap_syntax-bridge-0.0.328//:ra_ap_syntax_bridge", + "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt", + "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", + "@vendor_ts__salsa-0.25.2//:salsa", "@vendor_ts__smallvec-1.15.1//:smallvec", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_parser-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_parser-0.0.328.bazel similarity index 93% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_parser-0.0.301.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_parser-0.0.328.bazel index 2134a4d9cbc2..5e1577c1785a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_parser-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_parser-0.0.328.bazel @@ -23,7 +23,7 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_edition-0.0.301//:ra_ap_edition": "edition", + "@vendor_ts__ra_ap_edition-0.0.328//:ra_ap_edition": "edition", }, compile_data = glob( include = ["**"], @@ -39,7 +39,6 @@ rust_library( ), crate_features = [ "default", - "tracing", ], crate_root = "src/lib.rs", edition = "2024", @@ -100,12 +99,13 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.301", + version = "0.0.328", deps = [ "@vendor_ts__drop_bomb-0.1.5//:drop_bomb", - "@vendor_ts__ra-ap-rustc_lexer-0.123.0//:ra_ap_rustc_lexer", - "@vendor_ts__ra_ap_edition-0.0.301//:ra_ap_edition", + "@vendor_ts__ra-ap-rustc_lexer-0.143.0//:ra_ap_rustc_lexer", + "@vendor_ts__ra_ap_edition-0.0.328//:ra_ap_edition", "@vendor_ts__rustc-literal-escaper-0.0.4//:rustc_literal_escaper", - "@vendor_ts__tracing-0.1.41//:tracing", + "@vendor_ts__tracing-0.1.44//:tracing", + "@vendor_ts__winnow-0.7.15//:winnow", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_paths-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_paths-0.0.328.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_paths-0.0.301.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_paths-0.0.328.bazel index 5210ea74ec8e..6d809a8ca8ab 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_paths-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_paths-0.0.328.bazel @@ -96,8 +96,8 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.301", + version = "0.0.328", deps = [ - "@vendor_ts__camino-1.1.12//:camino", + "@vendor_ts__camino-1.2.2//:camino", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_proc_macro_api-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_proc_macro_api-0.0.328.bazel similarity index 80% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_proc_macro_api-0.0.301.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_proc_macro_api-0.0.328.bazel index 12961c51aec0..bac8656c7c4d 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_proc_macro_api-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_proc_macro_api-0.0.328.bazel @@ -23,11 +23,11 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_intern-0.0.301//:ra_ap_intern": "intern", - "@vendor_ts__ra_ap_paths-0.0.301//:ra_ap_paths": "paths", - "@vendor_ts__ra_ap_span-0.0.301//:ra_ap_span": "span", - "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx": "stdx", - "@vendor_ts__ra_ap_tt-0.0.301//:ra_ap_tt": "tt", + "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern": "intern", + "@vendor_ts__ra_ap_paths-0.0.328//:ra_ap_paths": "paths", + "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span": "span", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", + "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt": "tt", }, compile_data = glob( include = ["**"], @@ -41,6 +41,9 @@ rust_library( "WORKSPACE.bazel", ], ), + crate_features = [ + "default", + ], crate_root = "src/lib.rs", edition = "2024", proc_macro_deps = [ @@ -103,17 +106,20 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.301", + version = "0.0.328", deps = [ - "@vendor_ts__indexmap-2.11.4//:indexmap", - "@vendor_ts__ra_ap_intern-0.0.301//:ra_ap_intern", - "@vendor_ts__ra_ap_paths-0.0.301//:ra_ap_paths", - "@vendor_ts__ra_ap_span-0.0.301//:ra_ap_span", - "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx", - "@vendor_ts__ra_ap_tt-0.0.301//:ra_ap_tt", - "@vendor_ts__rustc-hash-2.1.1//:rustc_hash", + "@vendor_ts__indexmap-2.14.0//:indexmap", + "@vendor_ts__postcard-1.1.3//:postcard", + "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern", + "@vendor_ts__ra_ap_paths-0.0.328//:ra_ap_paths", + "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", + "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt", + "@vendor_ts__rayon-1.12.0//:rayon", + "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", + "@vendor_ts__semver-1.0.28//:semver", "@vendor_ts__serde-1.0.228//:serde", - "@vendor_ts__serde_json-1.0.145//:serde_json", - "@vendor_ts__tracing-0.1.41//:tracing", + "@vendor_ts__serde_json-1.0.149//:serde_json", + "@vendor_ts__tracing-0.1.44//:tracing", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_profile-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_profile-0.0.328.bazel similarity index 73% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_profile-0.0.301.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_profile-0.0.328.bazel index cb28397b3ab3..bc45d3548e53 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_profile-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_profile-0.0.328.bazel @@ -93,61 +93,53 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.301", + version = "0.0.328", deps = [ - "@vendor_ts__cfg-if-1.0.3//:cfg_if", + "@vendor_ts__cfg-if-1.0.4//:cfg_if", ] + select({ "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [ "@vendor_ts__windows-sys-0.60.2//:windows_sys", # cfg(windows) ], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) - "@vendor_ts__perf-event-0.4.7//:perf_event", # cfg(all(target_os = "linux", not(target_env = "ohos"))) + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) + "@vendor_ts__perf-event-0.4.8//:perf_event", # cfg(all(target_os = "linux", not(target_env = "ohos"), any(target_arch = "x86", target_arch = "x86_64", target_arch = "aarch64"))) ], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) - "@vendor_ts__perf-event-0.4.7//:perf_event", # cfg(all(target_os = "linux", not(target_env = "ohos"))) + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) + "@vendor_ts__perf-event-0.4.8//:perf_event", # cfg(all(target_os = "linux", not(target_env = "ohos"), any(target_arch = "x86", target_arch = "x86_64", target_arch = "aarch64"))) ], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) - "@vendor_ts__perf-event-0.4.7//:perf_event", # cfg(all(target_os = "linux", not(target_env = "ohos"))) - ], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [ - "@vendor_ts__perf-event-0.4.7//:perf_event", # cfg(all(target_os = "linux", not(target_env = "ohos"))) + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) ], "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) - "@vendor_ts__perf-event-0.4.7//:perf_event", # cfg(all(target_os = "linux", not(target_env = "ohos"))) + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) ], "@rules_rust//rust/platform:i686-pc-windows-msvc": [ "@vendor_ts__windows-sys-0.60.2//:windows_sys", # cfg(windows) ], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) - "@vendor_ts__perf-event-0.4.7//:perf_event", # cfg(all(target_os = "linux", not(target_env = "ohos"))) + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) + "@vendor_ts__perf-event-0.4.8//:perf_event", # cfg(all(target_os = "linux", not(target_env = "ohos"), any(target_arch = "x86", target_arch = "x86_64", target_arch = "aarch64"))) ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) - "@vendor_ts__perf-event-0.4.7//:perf_event", # cfg(all(target_os = "linux", not(target_env = "ohos"))) + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) ], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) - "@vendor_ts__perf-event-0.4.7//:perf_event", # cfg(all(target_os = "linux", not(target_env = "ohos"))) + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) ], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) - "@vendor_ts__perf-event-0.4.7//:perf_event", # cfg(all(target_os = "linux", not(target_env = "ohos"))) + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) ], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [ "@vendor_ts__windows-sys-0.60.2//:windows_sys", # cfg(windows) ], "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) - "@vendor_ts__perf-event-0.4.7//:perf_event", # cfg(all(target_os = "linux", not(target_env = "ohos"))) + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) + "@vendor_ts__perf-event-0.4.8//:perf_event", # cfg(all(target_os = "linux", not(target_env = "ohos"), any(target_arch = "x86", target_arch = "x86_64", target_arch = "aarch64"))) ], "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) - "@vendor_ts__perf-event-0.4.7//:perf_event", # cfg(all(target_os = "linux", not(target_env = "ohos"))) + "@vendor_ts__libc-0.2.185//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) + "@vendor_ts__perf-event-0.4.8//:perf_event", # cfg(all(target_os = "linux", not(target_env = "ohos"), any(target_arch = "x86", target_arch = "x86_64", target_arch = "aarch64"))) ], "//conditions:default": [], }), diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_project_model-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_project_model-0.0.328.bazel similarity index 76% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_project_model-0.0.301.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_project_model-0.0.328.bazel index 8f551d7bd0b8..a5f7fdd974db 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_project_model-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_project_model-0.0.328.bazel @@ -23,13 +23,13 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_base_db-0.0.301//:ra_ap_base_db": "base_db", - "@vendor_ts__ra_ap_cfg-0.0.301//:ra_ap_cfg": "cfg", - "@vendor_ts__ra_ap_intern-0.0.301//:ra_ap_intern": "intern", - "@vendor_ts__ra_ap_paths-0.0.301//:ra_ap_paths": "paths", - "@vendor_ts__ra_ap_span-0.0.301//:ra_ap_span": "span", - "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx": "stdx", - "@vendor_ts__ra_ap_toolchain-0.0.301//:ra_ap_toolchain": "toolchain", + "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db": "base_db", + "@vendor_ts__ra_ap_cfg-0.0.328//:ra_ap_cfg": "cfg", + "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern": "intern", + "@vendor_ts__ra_ap_paths-0.0.328//:ra_ap_paths": "paths", + "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span": "span", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", + "@vendor_ts__ra_ap_toolchain-0.0.328//:ra_ap_toolchain": "toolchain", }, compile_data = glob( include = ["**"], @@ -43,6 +43,9 @@ rust_library( "WORKSPACE.bazel", ], ), + crate_features = [ + "default", + ], crate_root = "src/lib.rs", edition = "2024", proc_macro_deps = [ @@ -105,25 +108,26 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.301", + version = "0.0.328", deps = [ - "@vendor_ts__anyhow-1.0.100//:anyhow", - "@vendor_ts__cargo_metadata-0.21.0//:cargo_metadata", + "@vendor_ts__anyhow-1.0.102//:anyhow", + "@vendor_ts__cargo_metadata-0.23.1//:cargo_metadata", "@vendor_ts__itertools-0.14.0//:itertools", "@vendor_ts__la-arena-0.3.1//:la_arena", - "@vendor_ts__ra_ap_base_db-0.0.301//:ra_ap_base_db", - "@vendor_ts__ra_ap_cfg-0.0.301//:ra_ap_cfg", - "@vendor_ts__ra_ap_intern-0.0.301//:ra_ap_intern", - "@vendor_ts__ra_ap_paths-0.0.301//:ra_ap_paths", - "@vendor_ts__ra_ap_span-0.0.301//:ra_ap_span", - "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx", - "@vendor_ts__ra_ap_toolchain-0.0.301//:ra_ap_toolchain", - "@vendor_ts__rustc-hash-2.1.1//:rustc_hash", - "@vendor_ts__semver-1.0.26//:semver", + "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db", + "@vendor_ts__ra_ap_cfg-0.0.328//:ra_ap_cfg", + "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern", + "@vendor_ts__ra_ap_paths-0.0.328//:ra_ap_paths", + "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", + "@vendor_ts__ra_ap_toolchain-0.0.328//:ra_ap_toolchain", + "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", + "@vendor_ts__semver-1.0.28//:semver", "@vendor_ts__serde-1.0.228//:serde", - "@vendor_ts__serde_json-1.0.145//:serde_json", + "@vendor_ts__serde_json-1.0.149//:serde_json", "@vendor_ts__temp-dir-0.1.16//:temp_dir", - "@vendor_ts__tracing-0.1.41//:tracing", - "@vendor_ts__triomphe-0.1.14//:triomphe", + "@vendor_ts__toml-0.9.12-spec-1.1.0//:toml", + "@vendor_ts__tracing-0.1.44//:tracing", + "@vendor_ts__triomphe-0.1.15//:triomphe", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_query-group-macro-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_query-group-macro-0.0.328.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_query-group-macro-0.0.301.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_query-group-macro-0.0.328.bazel index ccd6eb8aefa3..0934ecd44f2e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_query-group-macro-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_query-group-macro-0.0.328.bazel @@ -93,10 +93,10 @@ rust_proc_macro( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.301", + version = "0.0.328", deps = [ - "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", - "@vendor_ts__quote-1.0.41//:quote", - "@vendor_ts__syn-2.0.106//:syn", + "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", + "@vendor_ts__quote-1.0.45//:quote", + "@vendor_ts__syn-2.0.117//:syn", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_span-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_span-0.0.328.bazel similarity index 90% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_span-0.0.301.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_span-0.0.328.bazel index 0b47ce033472..6c6249a49ab9 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_span-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_span-0.0.328.bazel @@ -23,9 +23,9 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx": "stdx", - "@vendor_ts__ra_ap_syntax-0.0.301//:ra_ap_syntax": "syntax", - "@vendor_ts__ra_ap_vfs-0.0.301//:ra_ap_vfs": "vfs", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", + "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax": "syntax", + "@vendor_ts__ra_ap_vfs-0.0.328//:ra_ap_vfs": "vfs", }, compile_data = glob( include = ["**"], @@ -102,15 +102,15 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.301", + version = "0.0.328", deps = [ "@vendor_ts__hashbrown-0.14.5//:hashbrown", "@vendor_ts__la-arena-0.3.1//:la_arena", - "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx", - "@vendor_ts__ra_ap_syntax-0.0.301//:ra_ap_syntax", - "@vendor_ts__ra_ap_vfs-0.0.301//:ra_ap_vfs", - "@vendor_ts__rustc-hash-2.1.1//:rustc_hash", - "@vendor_ts__salsa-0.23.0//:salsa", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", + "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax", + "@vendor_ts__ra_ap_vfs-0.0.328//:ra_ap_vfs", + "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", + "@vendor_ts__salsa-0.25.2//:salsa", "@vendor_ts__text-size-1.1.1//:text_size", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_stdx-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_stdx-0.0.328.bazel similarity index 80% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_stdx-0.0.301.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_stdx-0.0.328.bazel index 41c6f4f8cc72..9d4b68cb0e51 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_stdx-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_stdx-0.0.328.bazel @@ -93,106 +93,106 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.301", + version = "0.0.328", deps = [ "@vendor_ts__crossbeam-channel-0.5.15//:crossbeam_channel", "@vendor_ts__crossbeam-utils-0.8.21//:crossbeam_utils", "@vendor_ts__itertools-0.14.0//:itertools", "@vendor_ts__jod-thread-1.0.0//:jod_thread", - "@vendor_ts__tracing-0.1.41//:tracing", + "@vendor_ts__tracing-0.1.44//:tracing", ] + select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-apple-ios": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-linux-android": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [ "@vendor_ts__miow-0.6.1//:miow", # cfg(windows) "@vendor_ts__windows-sys-0.60.2//:windows_sys", # cfg(windows) ], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:armv7-linux-androideabi": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:i686-apple-darwin": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:i686-linux-android": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:i686-pc-windows-msvc": [ "@vendor_ts__miow-0.6.1//:miow", # cfg(windows) "@vendor_ts__windows-sys-0.60.2//:windows_sys", # cfg(windows) ], "@rules_rust//rust/platform:i686-unknown-freebsd": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-apple-darwin": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-apple-ios": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-linux-android": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [ "@vendor_ts__miow-0.6.1//:miow", # cfg(windows) "@vendor_ts__windows-sys-0.60.2//:windows_sys", # cfg(windows) ], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.175//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.185//:libc", # cfg(unix) ], "//conditions:default": [], }), diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-0.0.328.bazel similarity index 87% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-0.0.301.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-0.0.328.bazel index e5548afe6ab0..d4204f3eadbc 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-0.0.328.bazel @@ -23,8 +23,8 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_parser-0.0.301//:ra_ap_parser": "parser", - "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx": "stdx", + "@vendor_ts__ra_ap_parser-0.0.328//:ra_ap_parser": "parser", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", }, compile_data = glob( include = ["**"], @@ -38,6 +38,9 @@ rust_library( "WORKSPACE.bazel", ], ), + crate_features = [ + "default", + ], crate_root = "src/lib.rs", edition = "2024", rustc_env_files = [ @@ -97,18 +100,19 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.301", + version = "0.0.328", deps = [ "@vendor_ts__either-1.15.0//:either", "@vendor_ts__itertools-0.14.0//:itertools", - "@vendor_ts__ra_ap_parser-0.0.301//:ra_ap_parser", - "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx", - "@vendor_ts__rowan-0.15.15//:rowan", - "@vendor_ts__rustc-hash-2.1.1//:rustc_hash", + "@vendor_ts__ra_ap_parser-0.0.328//:ra_ap_parser", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", + "@vendor_ts__rowan-0.15.18//:rowan", + "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", "@vendor_ts__rustc-literal-escaper-0.0.4//:rustc_literal_escaper", - "@vendor_ts__smol_str-0.3.2//:smol_str", - "@vendor_ts__tracing-0.1.41//:tracing", - "@vendor_ts__triomphe-0.1.14//:triomphe", + "@vendor_ts__smallvec-1.15.1//:smallvec", + "@vendor_ts__smol_str-0.3.6//:smol_str", + "@vendor_ts__tracing-0.1.44//:tracing", + "@vendor_ts__triomphe-0.1.15//:triomphe", ], ) exports_files(["rust.ungram"]) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-bridge-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-bridge-0.0.328.bazel similarity index 84% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-bridge-0.0.301.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-bridge-0.0.328.bazel index 646c0f8c2f45..4ce70110ed1a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-bridge-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-bridge-0.0.328.bazel @@ -23,12 +23,12 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_intern-0.0.301//:ra_ap_intern": "intern", - "@vendor_ts__ra_ap_parser-0.0.301//:ra_ap_parser": "parser", - "@vendor_ts__ra_ap_span-0.0.301//:ra_ap_span": "span", - "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx": "stdx", - "@vendor_ts__ra_ap_syntax-0.0.301//:ra_ap_syntax": "syntax", - "@vendor_ts__ra_ap_tt-0.0.301//:ra_ap_tt": "tt", + "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern": "intern", + "@vendor_ts__ra_ap_parser-0.0.328//:ra_ap_parser": "parser", + "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span": "span", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", + "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax": "syntax", + "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt": "tt", }, compile_data = glob( include = ["**"], @@ -101,14 +101,14 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.301", + version = "0.0.328", deps = [ - "@vendor_ts__ra_ap_intern-0.0.301//:ra_ap_intern", - "@vendor_ts__ra_ap_parser-0.0.301//:ra_ap_parser", - "@vendor_ts__ra_ap_span-0.0.301//:ra_ap_span", - "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx", - "@vendor_ts__ra_ap_syntax-0.0.301//:ra_ap_syntax", - "@vendor_ts__ra_ap_tt-0.0.301//:ra_ap_tt", - "@vendor_ts__rustc-hash-2.1.1//:rustc_hash", + "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern", + "@vendor_ts__ra_ap_parser-0.0.328//:ra_ap_parser", + "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", + "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax", + "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt", + "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_test_fixture-0.0.328.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_test_fixture-0.0.328.bazel new file mode 100644 index 000000000000..40941eb64afe --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_test_fixture-0.0.328.bazel @@ -0,0 +1,123 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "ra_ap_test_fixture", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + aliases = { + "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db": "base_db", + "@vendor_ts__ra_ap_cfg-0.0.328//:ra_ap_cfg": "cfg", + "@vendor_ts__ra_ap_hir_expand-0.0.328//:ra_ap_hir_expand": "hir_expand", + "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern": "intern", + "@vendor_ts__ra_ap_paths-0.0.328//:ra_ap_paths": "paths", + "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span": "span", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", + "@vendor_ts__ra_ap_test_utils-0.0.328//:ra_ap_test_utils": "test_utils", + "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt": "tt", + }, + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "default", + ], + crate_root = "src/lib.rs", + edition = "2024", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=ra_ap_test_fixture", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.0.328", + deps = [ + "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db", + "@vendor_ts__ra_ap_cfg-0.0.328//:ra_ap_cfg", + "@vendor_ts__ra_ap_hir_expand-0.0.328//:ra_ap_hir_expand", + "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern", + "@vendor_ts__ra_ap_paths-0.0.328//:ra_ap_paths", + "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", + "@vendor_ts__ra_ap_test_utils-0.0.328//:ra_ap_test_utils", + "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt", + "@vendor_ts__triomphe-0.1.15//:triomphe", + ], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_tt-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_test_utils-0.0.328.bazel similarity index 87% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_tt-0.0.301.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_test_utils-0.0.328.bazel index e5b2117f769c..276ab3e576d8 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_tt-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_test_utils-0.0.328.bazel @@ -17,14 +17,15 @@ cargo_toml_env_vars( ) rust_library( - name = "ra_ap_tt", + name = "ra_ap_test_utils", srcs = glob( include = ["**/*.rs"], allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_intern-0.0.301//:ra_ap_intern": "intern", - "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx": "stdx", + "@vendor_ts__ra_ap_paths-0.0.328//:ra_ap_paths": "paths", + "@vendor_ts__ra_ap_profile-0.0.328//:ra_ap_profile": "profile", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", }, compile_data = glob( include = ["**"], @@ -48,7 +49,7 @@ rust_library( ], tags = [ "cargo-bazel", - "crate-name=ra_ap_tt", + "crate-name=ra_ap_test_utils", "manual", "noclippy", "norustfmt", @@ -97,12 +98,13 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.301", + version = "0.0.328", deps = [ - "@vendor_ts__arrayvec-0.7.6//:arrayvec", - "@vendor_ts__ra-ap-rustc_lexer-0.123.0//:ra_ap_rustc_lexer", - "@vendor_ts__ra_ap_intern-0.0.301//:ra_ap_intern", - "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx", + "@vendor_ts__dissimilar-1.0.11//:dissimilar", + "@vendor_ts__ra_ap_paths-0.0.328//:ra_ap_paths", + "@vendor_ts__ra_ap_profile-0.0.328//:ra_ap_profile", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", + "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", "@vendor_ts__text-size-1.1.1//:text_size", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_toolchain-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_toolchain-0.0.328.bazel similarity index 97% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_toolchain-0.0.301.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_toolchain-0.0.328.bazel index 2956a594ec11..9d73283c8059 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_toolchain-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_toolchain-0.0.328.bazel @@ -93,9 +93,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.301", + version = "0.0.328", deps = [ - "@vendor_ts__camino-1.1.12//:camino", - "@vendor_ts__home-0.5.11//:home", + "@vendor_ts__camino-1.2.2//:camino", + "@vendor_ts__home-0.5.12//:home", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_tt-0.0.328.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_tt-0.0.328.bazel new file mode 100644 index 000000000000..b40b0afeeff4 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_tt-0.0.328.bazel @@ -0,0 +1,115 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "ra_ap_tt", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + aliases = { + "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern": "intern", + "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span": "span", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", + }, + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "default", + ], + crate_root = "src/lib.rs", + edition = "2024", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=ra_ap_tt", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.0.328", + deps = [ + "@vendor_ts__arrayvec-0.7.6//:arrayvec", + "@vendor_ts__indexmap-2.14.0//:indexmap", + "@vendor_ts__ra-ap-rustc_lexer-0.143.0//:ra_ap_rustc_lexer", + "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern", + "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", + "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", + "@vendor_ts__text-size-1.1.1//:text_size", + ], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-0.0.328.bazel similarity index 91% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-0.0.301.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-0.0.328.bazel index 67dd8bdd6104..77cf3adfd1c5 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-0.0.328.bazel @@ -23,8 +23,8 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_paths-0.0.301//:ra_ap_paths": "paths", - "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx": "stdx", + "@vendor_ts__ra_ap_paths-0.0.328//:ra_ap_paths": "paths", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", }, compile_data = glob( include = ["**"], @@ -97,15 +97,15 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.301", + version = "0.0.328", deps = [ "@vendor_ts__crossbeam-channel-0.5.15//:crossbeam_channel", "@vendor_ts__fst-0.4.7//:fst", - "@vendor_ts__indexmap-2.11.4//:indexmap", + "@vendor_ts__indexmap-2.14.0//:indexmap", "@vendor_ts__nohash-hasher-0.2.0//:nohash_hasher", - "@vendor_ts__ra_ap_paths-0.0.301//:ra_ap_paths", - "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx", - "@vendor_ts__rustc-hash-2.1.1//:rustc_hash", - "@vendor_ts__tracing-0.1.41//:tracing", + "@vendor_ts__ra_ap_paths-0.0.328//:ra_ap_paths", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", + "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", + "@vendor_ts__tracing-0.1.44//:tracing", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-notify-0.0.301.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-notify-0.0.328.bazel similarity index 89% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-notify-0.0.301.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-notify-0.0.328.bazel index e0c3859bfa37..5ad594ec7e7e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-notify-0.0.301.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-notify-0.0.328.bazel @@ -23,9 +23,9 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_paths-0.0.301//:ra_ap_paths": "paths", - "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx": "stdx", - "@vendor_ts__ra_ap_vfs-0.0.301//:ra_ap_vfs": "vfs", + "@vendor_ts__ra_ap_paths-0.0.328//:ra_ap_paths": "paths", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", + "@vendor_ts__ra_ap_vfs-0.0.328//:ra_ap_vfs": "vfs", }, compile_data = glob( include = ["**"], @@ -98,16 +98,16 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.301", + version = "0.0.328", deps = [ "@vendor_ts__crossbeam-channel-0.5.15//:crossbeam_channel", "@vendor_ts__notify-8.2.0//:notify", - "@vendor_ts__ra_ap_paths-0.0.301//:ra_ap_paths", - "@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx", - "@vendor_ts__ra_ap_vfs-0.0.301//:ra_ap_vfs", - "@vendor_ts__rayon-1.11.0//:rayon", - "@vendor_ts__rustc-hash-2.1.1//:rustc_hash", - "@vendor_ts__tracing-0.1.41//:tracing", + "@vendor_ts__ra_ap_paths-0.0.328//:ra_ap_paths", + "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", + "@vendor_ts__ra_ap_vfs-0.0.328//:ra_ap_vfs", + "@vendor_ts__rayon-1.12.0//:rayon", + "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", + "@vendor_ts__tracing-0.1.44//:tracing", "@vendor_ts__walkdir-2.5.0//:walkdir", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand-0.9.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand-0.10.1.bazel similarity index 95% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand-0.9.2.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand-0.10.1.bazel index adf2414f3af0..58e4ecd87bd3 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand-0.9.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand-0.10.1.bazel @@ -37,14 +37,13 @@ rust_library( crate_features = [ "alloc", "default", - "os_rng", - "small_rng", "std", "std_rng", + "sys_rng", "thread_rng", ], crate_root = "src/lib.rs", - edition = "2021", + edition = "2024", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -102,9 +101,10 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.9.2", + version = "0.10.1", deps = [ - "@vendor_ts__rand_chacha-0.9.0//:rand_chacha", - "@vendor_ts__rand_core-0.9.3//:rand_core", + "@vendor_ts__chacha20-0.10.0//:chacha20", + "@vendor_ts__getrandom-0.4.2//:getrandom", + "@vendor_ts__rand_core-0.10.1//:rand_core", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand_chacha-0.9.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand_chacha-0.9.0.bazel deleted file mode 100644 index 63fd0014d763..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand_chacha-0.9.0.bazel +++ /dev/null @@ -1,104 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "rand_chacha", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "std", - ], - crate_root = "src/lib.rs", - edition = "2021", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=rand_chacha", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.9.0", - deps = [ - "@vendor_ts__ppv-lite86-0.2.21//:ppv_lite86", - "@vendor_ts__rand_core-0.9.3//:rand_core", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand_core-0.10.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand_core-0.10.1.bazel new file mode 100644 index 000000000000..9522ee36ed3e --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand_core-0.10.1.bazel @@ -0,0 +1,97 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "rand_core", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2024", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=rand_core", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.10.1", +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand_core-0.9.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand_core-0.9.3.bazel deleted file mode 100644 index 0ae8f72c2617..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand_core-0.9.3.bazel +++ /dev/null @@ -1,104 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "rand_core", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "os_rng", - "std", - ], - crate_root = "src/lib.rs", - edition = "2021", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=rand_core", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.9.3", - deps = [ - "@vendor_ts__getrandom-0.3.3//:getrandom", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rayon-1.11.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rayon-1.12.0.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rayon-1.11.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rayon-1.12.0.bazel index c867d354a77c..c51b34ee3989 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rayon-1.11.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rayon-1.12.0.bazel @@ -93,7 +93,7 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.11.0", + version = "1.12.0", deps = [ "@vendor_ts__either-1.15.0//:either", "@vendor_ts__rayon-core-1.13.0//:rayon_core", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.redox_syscall-0.5.17.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.redox_syscall-0.5.17.bazel index ec928fcac82c..51d28b0a867c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.redox_syscall-0.5.17.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.redox_syscall-0.5.17.bazel @@ -95,6 +95,6 @@ rust_library( }), version = "0.5.17", deps = [ - "@vendor_ts__bitflags-2.9.4//:bitflags", + "@vendor_ts__bitflags-2.11.1//:bitflags", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ref-cast-impl-1.0.24.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ref-cast-impl-1.0.24.bazel index 56045a5d8dde..e94704b8c42b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ref-cast-impl-1.0.24.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ref-cast-impl-1.0.24.bazel @@ -95,8 +95,8 @@ rust_proc_macro( }), version = "1.0.24", deps = [ - "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", - "@vendor_ts__quote-1.0.41//:quote", - "@vendor_ts__syn-2.0.106//:syn", + "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", + "@vendor_ts__quote-1.0.45//:quote", + "@vendor_ts__syn-2.0.117//:syn", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-1.11.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-1.12.3.bazel similarity index 94% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-1.11.3.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-1.12.3.bazel index 2dff7cf54448..825fabb29b18 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-1.11.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-1.12.3.bazel @@ -112,11 +112,11 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.11.3", + version = "1.12.3", deps = [ - "@vendor_ts__aho-corasick-1.1.3//:aho_corasick", - "@vendor_ts__memchr-2.7.5//:memchr", - "@vendor_ts__regex-automata-0.4.11//:regex_automata", - "@vendor_ts__regex-syntax-0.8.6//:regex_syntax", + "@vendor_ts__aho-corasick-1.1.4//:aho_corasick", + "@vendor_ts__memchr-2.8.0//:memchr", + "@vendor_ts__regex-automata-0.4.14//:regex_automata", + "@vendor_ts__regex-syntax-0.8.10//:regex_syntax", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-automata-0.4.11.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-automata-0.4.14.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-automata-0.4.11.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-automata-0.4.14.bazel index 77270d5287f7..7d8af771594a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-automata-0.4.11.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-automata-0.4.14.bazel @@ -121,10 +121,10 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.4.11", + version = "0.4.14", deps = [ - "@vendor_ts__aho-corasick-1.1.3//:aho_corasick", - "@vendor_ts__memchr-2.7.5//:memchr", - "@vendor_ts__regex-syntax-0.8.6//:regex_syntax", + "@vendor_ts__aho-corasick-1.1.4//:aho_corasick", + "@vendor_ts__memchr-2.8.0//:memchr", + "@vendor_ts__regex-syntax-0.8.10//:regex_syntax", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-syntax-0.8.6.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-syntax-0.8.10.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-syntax-0.8.6.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-syntax-0.8.10.bazel index 20579d899f00..5f3ae8f1cce0 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-syntax-0.8.6.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-syntax-0.8.10.bazel @@ -105,5 +105,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.8.6", + version = "0.8.10", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rowan-0.15.15.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rowan-0.15.18.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rowan-0.15.15.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rowan-0.15.18.bazel index 45eaa325827e..e9841cd61c3a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rowan-0.15.15.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rowan-0.15.18.bazel @@ -93,7 +93,7 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.15.15", + version = "0.15.18", deps = [ "@vendor_ts__countme-3.0.1//:countme", "@vendor_ts__hashbrown-0.14.5//:hashbrown", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-hash-2.1.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-hash-2.1.2.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-hash-2.1.1.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-hash-2.1.2.bazel index 233e17d90857..a18bdfd0e16b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-hash-2.1.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-hash-2.1.2.bazel @@ -97,5 +97,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "2.1.1", + version = "2.1.2", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-literal-escaper-0.0.5.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-literal-escaper-0.0.5.bazel new file mode 100644 index 000000000000..883772a6b126 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-literal-escaper-0.0.5.bazel @@ -0,0 +1,97 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "rustc_literal_escaper", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=rustc-literal-escaper", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.0.5", +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc_apfloat-0.2.3+llvm-462a31f5a5ab.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc_apfloat-0.2.3+llvm-462a31f5a5ab.bazel index 0bf752345746..2e81799fba5e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc_apfloat-0.2.3+llvm-462a31f5a5ab.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc_apfloat-0.2.3+llvm-462a31f5a5ab.bazel @@ -99,7 +99,7 @@ rust_library( }), version = "0.2.3+llvm-462a31f5a5ab", deps = [ - "@vendor_ts__bitflags-2.9.4//:bitflags", + "@vendor_ts__bitflags-2.11.1//:bitflags", "@vendor_ts__rustc_apfloat-0.2.3-llvm-462a31f5a5ab//:build_script_build", "@vendor_ts__smallvec-1.15.1//:smallvec", ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.percent-encoding-2.3.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc_version-0.4.1.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.percent-encoding-2.3.2.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc_version-0.4.1.bazel index 8a8d1e9e3c97..c93a62d6c6a7 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.percent-encoding-2.3.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc_version-0.4.1.bazel @@ -17,7 +17,7 @@ cargo_toml_env_vars( ) rust_library( - name = "percent_encoding", + name = "rustc_version", srcs = glob( include = ["**/*.rs"], allow_empty = True, @@ -34,10 +34,6 @@ rust_library( "WORKSPACE.bazel", ], ), - crate_features = [ - "alloc", - "std", - ], crate_root = "src/lib.rs", edition = "2018", rustc_env_files = [ @@ -48,7 +44,7 @@ rust_library( ], tags = [ "cargo-bazel", - "crate-name=percent-encoding", + "crate-name=rustc_version", "manual", "noclippy", "norustfmt", @@ -97,5 +93,8 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "2.3.2", + version = "0.4.1", + deps = [ + "@vendor_ts__semver-1.0.28//:semver", + ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-0.23.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-0.25.2.bazel similarity index 92% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-0.23.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-0.25.2.bazel index 25fcd798c654..8514870f47c5 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-0.23.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-0.25.2.bazel @@ -35,7 +35,7 @@ rust_library( ], ), crate_features = [ - "default", + "inventory", "macros", "rayon", "salsa_unstable", @@ -43,7 +43,7 @@ rust_library( crate_root = "src/lib.rs", edition = "2021", proc_macro_deps = [ - "@vendor_ts__salsa-macros-0.23.0//:salsa_macros", + "@vendor_ts__salsa-macros-0.25.2//:salsa_macros", ], rustc_env_files = [ ":cargo_toml_env_vars", @@ -102,23 +102,23 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.23.0", + version = "0.25.2", deps = [ "@vendor_ts__boxcar-0.2.14//:boxcar", "@vendor_ts__crossbeam-queue-0.3.12//:crossbeam_queue", "@vendor_ts__crossbeam-utils-0.8.21//:crossbeam_utils", "@vendor_ts__hashbrown-0.15.5//:hashbrown", "@vendor_ts__hashlink-0.10.0//:hashlink", - "@vendor_ts__indexmap-2.11.4//:indexmap", + "@vendor_ts__indexmap-2.14.0//:indexmap", "@vendor_ts__intrusive-collections-0.9.7//:intrusive_collections", - "@vendor_ts__papaya-0.2.3//:papaya", + "@vendor_ts__inventory-0.3.24//:inventory", "@vendor_ts__parking_lot-0.12.4//:parking_lot", "@vendor_ts__portable-atomic-1.11.1//:portable_atomic", - "@vendor_ts__rayon-1.11.0//:rayon", - "@vendor_ts__rustc-hash-2.1.1//:rustc_hash", - "@vendor_ts__salsa-macro-rules-0.23.0//:salsa_macro_rules", + "@vendor_ts__rayon-1.12.0//:rayon", + "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", + "@vendor_ts__salsa-macro-rules-0.25.2//:salsa_macro_rules", "@vendor_ts__smallvec-1.15.1//:smallvec", "@vendor_ts__thin-vec-0.2.14//:thin_vec", - "@vendor_ts__tracing-0.1.41//:tracing", + "@vendor_ts__tracing-0.1.44//:tracing", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macro-rules-0.23.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macro-rules-0.25.2.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macro-rules-0.23.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macro-rules-0.25.2.bazel index a3cc0e24a369..01b605f0ed6d 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macro-rules-0.23.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macro-rules-0.25.2.bazel @@ -93,5 +93,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.23.0", + version = "0.25.2", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macros-0.23.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macros-0.25.2.bazel similarity index 95% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macros-0.23.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macros-0.25.2.bazel index 5d9bd4b09356..8905ee5100ba 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macros-0.23.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macros-0.25.2.bazel @@ -34,6 +34,9 @@ rust_proc_macro( "WORKSPACE.bazel", ], ), + crate_features = [ + "default", + ], crate_root = "src/lib.rs", edition = "2021", rustc_env_files = [ @@ -93,11 +96,11 @@ rust_proc_macro( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.23.0", + version = "0.25.2", deps = [ - "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", - "@vendor_ts__quote-1.0.41//:quote", - "@vendor_ts__syn-2.0.106//:syn", + "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", + "@vendor_ts__quote-1.0.45//:quote", + "@vendor_ts__syn-2.0.117//:syn", "@vendor_ts__synstructure-0.13.2//:synstructure", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.schemars-0.9.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.schemars-0.9.0.bazel index 69546680a9fb..1e08b806651d 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.schemars-0.9.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.schemars-0.9.0.bazel @@ -98,6 +98,6 @@ rust_library( "@vendor_ts__dyn-clone-1.0.20//:dyn_clone", "@vendor_ts__ref-cast-1.0.24//:ref_cast", "@vendor_ts__serde-1.0.228//:serde", - "@vendor_ts__serde_json-1.0.145//:serde_json", + "@vendor_ts__serde_json-1.0.149//:serde_json", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.schemars-1.0.4.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.schemars-1.0.4.bazel index 1fe84d175b39..2d6ccd8f2a05 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.schemars-1.0.4.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.schemars-1.0.4.bazel @@ -98,6 +98,6 @@ rust_library( "@vendor_ts__dyn-clone-1.0.20//:dyn_clone", "@vendor_ts__ref-cast-1.0.24//:ref_cast", "@vendor_ts__serde-1.0.228//:serde", - "@vendor_ts__serde_json-1.0.145//:serde_json", + "@vendor_ts__serde_json-1.0.149//:serde_json", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.semver-1.0.28.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.semver-1.0.28.bazel new file mode 100644 index 000000000000..5c659d959e2c --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.semver-1.0.28.bazel @@ -0,0 +1,108 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "semver", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + aliases = { + "@vendor_ts__serde_core-1.0.228//:serde_core": "serde", + }, + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "default", + "serde", + "std", + ], + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=semver", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "1.0.28", + deps = [ + "@vendor_ts__serde_core-1.0.228//:serde_core", + ], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde-untagged-0.1.8.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde-untagged-0.1.8.bazel deleted file mode 100644 index 099925888d56..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde-untagged-0.1.8.bazel +++ /dev/null @@ -1,102 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "serde_untagged", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_root = "src/lib.rs", - edition = "2021", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=serde-untagged", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.1.8", - deps = [ - "@vendor_ts__erased-serde-0.4.6//:erased_serde", - "@vendor_ts__serde-1.0.228//:serde", - "@vendor_ts__typeid-1.0.3//:typeid", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde-value-0.7.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde-value-0.7.0.bazel deleted file mode 100644 index 5ccd9ac3b516..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde-value-0.7.0.bazel +++ /dev/null @@ -1,101 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "serde_value", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_root = "src/lib.rs", - edition = "2018", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=serde-value", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.7.0", - deps = [ - "@vendor_ts__ordered-float-2.10.1//:ordered_float", - "@vendor_ts__serde-1.0.228//:serde", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_core-1.0.228.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_core-1.0.228.bazel index 4f597ff13aca..c2eff6baca9e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_core-1.0.228.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_core-1.0.228.bazel @@ -40,6 +40,7 @@ rust_library( ), crate_features = [ "alloc", + "default", "result", "std", ], @@ -129,6 +130,7 @@ cargo_build_script( ), crate_features = [ "alloc", + "default", "result", "std", ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_derive-1.0.228.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_derive-1.0.228.bazel index f6d5b8be14a9..1d49666df317 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_derive-1.0.228.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_derive-1.0.228.bazel @@ -98,8 +98,8 @@ rust_proc_macro( }), version = "1.0.228", deps = [ - "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", - "@vendor_ts__quote-1.0.41//:quote", - "@vendor_ts__syn-2.0.106//:syn", + "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", + "@vendor_ts__quote-1.0.45//:quote", + "@vendor_ts__syn-2.0.117//:syn", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_json-1.0.145.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_json-1.0.149.bazel similarity index 91% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_json-1.0.145.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_json-1.0.149.bazel index eaee1ee4b284..0d8779c67bb8 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_json-1.0.145.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_json-1.0.149.bazel @@ -164,58 +164,58 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.145", + version = "1.0.149", deps = [ - "@vendor_ts__itoa-1.0.15//:itoa", - "@vendor_ts__memchr-2.7.5//:memchr", - "@vendor_ts__ryu-1.0.20//:ryu", + "@vendor_ts__itoa-1.0.18//:itoa", + "@vendor_ts__memchr-2.8.0//:memchr", "@vendor_ts__serde_core-1.0.228//:serde_core", - "@vendor_ts__serde_json-1.0.145//:build_script_build", + "@vendor_ts__serde_json-1.0.149//:build_script_build", + "@vendor_ts__zmij-1.0.21//:zmij", ] + select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [ - "@vendor_ts__indexmap-2.11.4//:indexmap", # aarch64-apple-darwin + "@vendor_ts__indexmap-2.14.0//:indexmap", # aarch64-apple-darwin ], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [ - "@vendor_ts__indexmap-2.11.4//:indexmap", # aarch64-pc-windows-msvc + "@vendor_ts__indexmap-2.14.0//:indexmap", # aarch64-pc-windows-msvc ], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [ - "@vendor_ts__indexmap-2.11.4//:indexmap", # aarch64-unknown-linux-gnu + "@vendor_ts__indexmap-2.14.0//:indexmap", # aarch64-unknown-linux-gnu ], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [ - "@vendor_ts__indexmap-2.11.4//:indexmap", # aarch64-unknown-linux-gnu, aarch64-unknown-nixos-gnu + "@vendor_ts__indexmap-2.14.0//:indexmap", # aarch64-unknown-linux-gnu, aarch64-unknown-nixos-gnu ], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [ - "@vendor_ts__indexmap-2.11.4//:indexmap", # arm-unknown-linux-gnueabi + "@vendor_ts__indexmap-2.14.0//:indexmap", # arm-unknown-linux-gnueabi ], "@rules_rust//rust/platform:i686-pc-windows-msvc": [ - "@vendor_ts__indexmap-2.11.4//:indexmap", # i686-pc-windows-msvc + "@vendor_ts__indexmap-2.14.0//:indexmap", # i686-pc-windows-msvc ], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ - "@vendor_ts__indexmap-2.11.4//:indexmap", # i686-unknown-linux-gnu + "@vendor_ts__indexmap-2.14.0//:indexmap", # i686-unknown-linux-gnu ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ - "@vendor_ts__indexmap-2.11.4//:indexmap", # powerpc-unknown-linux-gnu + "@vendor_ts__indexmap-2.14.0//:indexmap", # powerpc-unknown-linux-gnu ], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [ - "@vendor_ts__indexmap-2.11.4//:indexmap", # riscv64gc-unknown-linux-gnu + "@vendor_ts__indexmap-2.14.0//:indexmap", # riscv64gc-unknown-linux-gnu ], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ - "@vendor_ts__indexmap-2.11.4//:indexmap", # s390x-unknown-linux-gnu + "@vendor_ts__indexmap-2.14.0//:indexmap", # s390x-unknown-linux-gnu ], "@rules_rust//rust/platform:x86_64-apple-darwin": [ - "@vendor_ts__indexmap-2.11.4//:indexmap", # x86_64-apple-darwin + "@vendor_ts__indexmap-2.14.0//:indexmap", # x86_64-apple-darwin ], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [ - "@vendor_ts__indexmap-2.11.4//:indexmap", # x86_64-pc-windows-msvc + "@vendor_ts__indexmap-2.14.0//:indexmap", # x86_64-pc-windows-msvc ], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [ - "@vendor_ts__indexmap-2.11.4//:indexmap", # x86_64-unknown-freebsd + "@vendor_ts__indexmap-2.14.0//:indexmap", # x86_64-unknown-freebsd ], "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [ - "@vendor_ts__indexmap-2.11.4//:indexmap", # x86_64-unknown-linux-gnu + "@vendor_ts__indexmap-2.14.0//:indexmap", # x86_64-unknown-linux-gnu ], "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [ - "@vendor_ts__indexmap-2.11.4//:indexmap", # x86_64-unknown-linux-gnu, x86_64-unknown-nixos-gnu + "@vendor_ts__indexmap-2.14.0//:indexmap", # x86_64-unknown-linux-gnu, x86_64-unknown-nixos-gnu ], "//conditions:default": [], }), @@ -336,7 +336,7 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "1.0.145", + version = "1.0.149", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_spanned-1.0.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_spanned-1.1.1.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_spanned-1.0.2.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_spanned-1.1.1.bazel index ac82ae1e149a..67558f9a3a19 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_spanned-1.0.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_spanned-1.1.1.bazel @@ -40,7 +40,7 @@ rust_library( "std", ], crate_root = "src/lib.rs", - edition = "2021", + edition = "2024", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -98,7 +98,7 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.2", + version = "1.1.1", deps = [ "@vendor_ts__serde_core-1.0.228//:serde_core", ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with-3.14.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with-3.18.0.bazel similarity index 95% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with-3.14.1.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with-3.18.0.bazel index 2500ec6a49ba..5a97a0e42db7 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with-3.14.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with-3.18.0.bazel @@ -43,8 +43,7 @@ rust_library( crate_root = "src/lib.rs", edition = "2021", proc_macro_deps = [ - "@vendor_ts__serde_derive-1.0.228//:serde_derive", - "@vendor_ts__serde_with_macros-3.14.1//:serde_with_macros", + "@vendor_ts__serde_with_macros-3.18.0//:serde_with_macros", ], rustc_env_files = [ ":cargo_toml_env_vars", @@ -103,8 +102,8 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "3.14.1", + version = "3.18.0", deps = [ - "@vendor_ts__serde-1.0.228//:serde", + "@vendor_ts__serde_core-1.0.228//:serde_core", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with_macros-3.14.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with_macros-3.18.0.bazel similarity index 95% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with_macros-3.14.1.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with_macros-3.18.0.bazel index fe552ca2a284..8ee42fdf0b04 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with_macros-3.14.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with_macros-3.18.0.bazel @@ -93,11 +93,11 @@ rust_proc_macro( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "3.14.1", + version = "3.18.0", deps = [ - "@vendor_ts__darling-0.21.3//:darling", - "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", - "@vendor_ts__quote-1.0.41//:quote", - "@vendor_ts__syn-2.0.106//:syn", + "@vendor_ts__darling-0.23.0//:darling", + "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", + "@vendor_ts__quote-1.0.45//:quote", + "@vendor_ts__syn-2.0.117//:syn", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_yaml-0.9.34+deprecated.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_yaml-0.9.34+deprecated.bazel index 42f05a8553a0..0a445c6ff9a9 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_yaml-0.9.34+deprecated.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_yaml-0.9.34+deprecated.bazel @@ -95,8 +95,8 @@ rust_library( }), version = "0.9.34+deprecated", deps = [ - "@vendor_ts__indexmap-2.11.4//:indexmap", - "@vendor_ts__itoa-1.0.15//:itoa", + "@vendor_ts__indexmap-2.14.0//:indexmap", + "@vendor_ts__itoa-1.0.18//:itoa", "@vendor_ts__ryu-1.0.20//:ryu", "@vendor_ts__serde-1.0.228//:serde", "@vendor_ts__unsafe-libyaml-0.2.11//:unsafe_libyaml", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.smol_str-0.3.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.smol_str-0.3.6.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.smol_str-0.3.2.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.smol_str-0.3.6.bazel index 954df9a6361e..020a7b78d55b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.smol_str-0.3.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.smol_str-0.3.6.bazel @@ -39,7 +39,7 @@ rust_library( "std", ], crate_root = "src/lib.rs", - edition = "2021", + edition = "2024", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -97,5 +97,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.3.2", + version = "0.3.6", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.spin-0.9.8.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.spin-0.9.8.bazel new file mode 100644 index 000000000000..c200d2c36f80 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.spin-0.9.8.bazel @@ -0,0 +1,114 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "spin", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + aliases = { + "@vendor_ts__lock_api-0.4.13//:lock_api": "lock_api_crate", + }, + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "barrier", + "default", + "lazy", + "lock_api", + "lock_api_crate", + "mutex", + "once", + "rwlock", + "spin_mutex", + ], + crate_root = "src/lib.rs", + edition = "2015", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=spin", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.9.8", + deps = [ + "@vendor_ts__lock_api-0.4.13//:lock_api", + ], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.stable_deref_trait-1.2.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.stable_deref_trait-1.2.1.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.stable_deref_trait-1.2.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.stable_deref_trait-1.2.1.bazel index a726ed9d70a7..376f789df83a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.stable_deref_trait-1.2.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.stable_deref_trait-1.2.1.bazel @@ -34,9 +34,6 @@ rust_library( "WORKSPACE.bazel", ], ), - crate_features = [ - "alloc", - ], crate_root = "src/lib.rs", edition = "2015", rustc_env_files = [ @@ -96,5 +93,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.2.0", + version = "1.2.1", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.syn-2.0.106.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.syn-2.0.117.bazel similarity index 95% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.syn-2.0.106.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.syn-2.0.117.bazel index 50cde9ced991..b9ef3361a973 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.syn-2.0.106.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.syn-2.0.117.bazel @@ -39,7 +39,6 @@ rust_library( "default", "derive", "extra-traits", - "fold", "full", "parsing", "printing", @@ -106,10 +105,10 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "2.0.106", + version = "2.0.117", deps = [ - "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", - "@vendor_ts__quote-1.0.41//:quote", - "@vendor_ts__unicode-ident-1.0.19//:unicode_ident", + "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", + "@vendor_ts__quote-1.0.45//:quote", + "@vendor_ts__unicode-ident-1.0.24//:unicode_ident", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.synstructure-0.13.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.synstructure-0.13.2.bazel index fa9cc6081a5a..7283c85254ce 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.synstructure-0.13.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.synstructure-0.13.2.bazel @@ -99,8 +99,8 @@ rust_library( }), version = "0.13.2", deps = [ - "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", - "@vendor_ts__quote-1.0.41//:quote", - "@vendor_ts__syn-2.0.106//:syn", + "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", + "@vendor_ts__quote-1.0.45//:quote", + "@vendor_ts__syn-2.0.117//:syn", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-2.0.16.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-2.0.18.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-2.0.16.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-2.0.18.bazel index 3e1ae194c3b9..7ba5989625a1 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-2.0.16.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-2.0.18.bazel @@ -45,7 +45,7 @@ rust_library( crate_root = "src/lib.rs", edition = "2021", proc_macro_deps = [ - "@vendor_ts__thiserror-impl-2.0.16//:thiserror_impl", + "@vendor_ts__thiserror-impl-2.0.18//:thiserror_impl", ], rustc_env_files = [ ":cargo_toml_env_vars", @@ -104,9 +104,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "2.0.16", + version = "2.0.18", deps = [ - "@vendor_ts__thiserror-2.0.16//:build_script_build", + "@vendor_ts__thiserror-2.0.18//:build_script_build", ], ) @@ -162,7 +162,7 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "2.0.16", + version = "2.0.18", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-impl-2.0.16.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-impl-2.0.18.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-impl-2.0.16.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-impl-2.0.18.bazel index 9d87f60d5d14..ef46b223dbb3 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-impl-2.0.16.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-impl-2.0.18.bazel @@ -93,10 +93,10 @@ rust_proc_macro( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "2.0.16", + version = "2.0.18", deps = [ - "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", - "@vendor_ts__quote-1.0.41//:quote", - "@vendor_ts__syn-2.0.106//:syn", + "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", + "@vendor_ts__quote-1.0.45//:quote", + "@vendor_ts__syn-2.0.117//:syn", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thread_local-1.1.9.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thread_local-1.1.9.bazel index 01efca587901..e38f9011ecd3 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thread_local-1.1.9.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thread_local-1.1.9.bazel @@ -95,6 +95,6 @@ rust_library( }), version = "1.1.9", deps = [ - "@vendor_ts__cfg-if-1.0.3//:cfg_if", + "@vendor_ts__cfg-if-1.0.4//:cfg_if", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-0.3.43.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-0.3.43.bazel deleted file mode 100644 index c3ee5405393c..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-0.3.43.bazel +++ /dev/null @@ -1,103 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "time", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_root = "src/lib.rs", - edition = "2021", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=time", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.3.43", - deps = [ - "@vendor_ts__deranged-0.5.3//:deranged", - "@vendor_ts__num-conv-0.1.0//:num_conv", - "@vendor_ts__powerfmt-0.2.0//:powerfmt", - "@vendor_ts__time-core-0.1.6//:time_core", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-0.3.47.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-0.3.47.bazel new file mode 100644 index 000000000000..9f124d45fb4b --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-0.3.47.bazel @@ -0,0 +1,221 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "time", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "alloc", + "default", + "formatting", + "local-offset", + "std", + ], + crate_root = "src/lib.rs", + edition = "2024", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=time", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.3.47", + deps = [ + "@vendor_ts__deranged-0.5.3//:deranged", + "@vendor_ts__itoa-1.0.18//:itoa", + "@vendor_ts__num-conv-0.2.1//:num_conv", + "@vendor_ts__powerfmt-0.2.0//:powerfmt", + "@vendor_ts__time-core-0.1.8//:time_core", + ] + select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [ + "@vendor_ts__libc-0.2.185//:libc", # aarch64-apple-darwin + "@vendor_ts__num_threads-0.1.7//:num_threads", # aarch64-apple-darwin + ], + "@rules_rust//rust/platform:aarch64-apple-ios": [ + "@vendor_ts__libc-0.2.185//:libc", # aarch64-apple-ios + "@vendor_ts__num_threads-0.1.7//:num_threads", # aarch64-apple-ios + ], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ + "@vendor_ts__libc-0.2.185//:libc", # aarch64-apple-ios-sim + "@vendor_ts__num_threads-0.1.7//:num_threads", # aarch64-apple-ios-sim + ], + "@rules_rust//rust/platform:aarch64-linux-android": [ + "@vendor_ts__libc-0.2.185//:libc", # aarch64-linux-android + "@vendor_ts__num_threads-0.1.7//:num_threads", # aarch64-linux-android + ], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [ + "@vendor_ts__libc-0.2.185//:libc", # aarch64-unknown-fuchsia + "@vendor_ts__num_threads-0.1.7//:num_threads", # aarch64-unknown-fuchsia + ], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.185//:libc", # aarch64-unknown-linux-gnu + "@vendor_ts__num_threads-0.1.7//:num_threads", # aarch64-unknown-linux-gnu + ], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [ + "@vendor_ts__libc-0.2.185//:libc", # aarch64-unknown-linux-gnu, aarch64-unknown-nixos-gnu + "@vendor_ts__num_threads-0.1.7//:num_threads", # aarch64-unknown-linux-gnu, aarch64-unknown-nixos-gnu + ], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [ + "@vendor_ts__libc-0.2.185//:libc", # aarch64-unknown-nto-qnx710 + "@vendor_ts__num_threads-0.1.7//:num_threads", # aarch64-unknown-nto-qnx710 + ], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [ + "@vendor_ts__libc-0.2.185//:libc", # arm-unknown-linux-gnueabi + "@vendor_ts__num_threads-0.1.7//:num_threads", # arm-unknown-linux-gnueabi + ], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [ + "@vendor_ts__libc-0.2.185//:libc", # arm-unknown-linux-musleabi + "@vendor_ts__num_threads-0.1.7//:num_threads", # arm-unknown-linux-musleabi + ], + "@rules_rust//rust/platform:armv7-linux-androideabi": [ + "@vendor_ts__libc-0.2.185//:libc", # armv7-linux-androideabi + "@vendor_ts__num_threads-0.1.7//:num_threads", # armv7-linux-androideabi + ], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [ + "@vendor_ts__libc-0.2.185//:libc", # armv7-unknown-linux-gnueabi + "@vendor_ts__num_threads-0.1.7//:num_threads", # armv7-unknown-linux-gnueabi + ], + "@rules_rust//rust/platform:i686-apple-darwin": [ + "@vendor_ts__libc-0.2.185//:libc", # i686-apple-darwin + "@vendor_ts__num_threads-0.1.7//:num_threads", # i686-apple-darwin + ], + "@rules_rust//rust/platform:i686-linux-android": [ + "@vendor_ts__libc-0.2.185//:libc", # i686-linux-android + "@vendor_ts__num_threads-0.1.7//:num_threads", # i686-linux-android + ], + "@rules_rust//rust/platform:i686-unknown-freebsd": [ + "@vendor_ts__libc-0.2.185//:libc", # i686-unknown-freebsd + "@vendor_ts__num_threads-0.1.7//:num_threads", # i686-unknown-freebsd + ], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.185//:libc", # i686-unknown-linux-gnu + "@vendor_ts__num_threads-0.1.7//:num_threads", # i686-unknown-linux-gnu + ], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.185//:libc", # powerpc-unknown-linux-gnu + "@vendor_ts__num_threads-0.1.7//:num_threads", # powerpc-unknown-linux-gnu + ], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.185//:libc", # riscv64gc-unknown-linux-gnu + "@vendor_ts__num_threads-0.1.7//:num_threads", # riscv64gc-unknown-linux-gnu + ], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.185//:libc", # s390x-unknown-linux-gnu + "@vendor_ts__num_threads-0.1.7//:num_threads", # s390x-unknown-linux-gnu + ], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [ + "@vendor_ts__libc-0.2.185//:libc", # wasm32-unknown-emscripten + "@vendor_ts__num_threads-0.1.7//:num_threads", # wasm32-unknown-emscripten + ], + "@rules_rust//rust/platform:x86_64-apple-darwin": [ + "@vendor_ts__libc-0.2.185//:libc", # x86_64-apple-darwin + "@vendor_ts__num_threads-0.1.7//:num_threads", # x86_64-apple-darwin + ], + "@rules_rust//rust/platform:x86_64-apple-ios": [ + "@vendor_ts__libc-0.2.185//:libc", # x86_64-apple-ios + "@vendor_ts__num_threads-0.1.7//:num_threads", # x86_64-apple-ios + ], + "@rules_rust//rust/platform:x86_64-linux-android": [ + "@vendor_ts__libc-0.2.185//:libc", # x86_64-linux-android + "@vendor_ts__num_threads-0.1.7//:num_threads", # x86_64-linux-android + ], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [ + "@vendor_ts__libc-0.2.185//:libc", # x86_64-unknown-freebsd + "@vendor_ts__num_threads-0.1.7//:num_threads", # x86_64-unknown-freebsd + ], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [ + "@vendor_ts__libc-0.2.185//:libc", # x86_64-unknown-fuchsia + "@vendor_ts__num_threads-0.1.7//:num_threads", # x86_64-unknown-fuchsia + ], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.185//:libc", # x86_64-unknown-linux-gnu + "@vendor_ts__num_threads-0.1.7//:num_threads", # x86_64-unknown-linux-gnu + ], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [ + "@vendor_ts__libc-0.2.185//:libc", # x86_64-unknown-linux-gnu, x86_64-unknown-nixos-gnu + "@vendor_ts__num_threads-0.1.7//:num_threads", # x86_64-unknown-linux-gnu, x86_64-unknown-nixos-gnu + ], + "//conditions:default": [], + }), +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-core-0.1.6.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-core-0.1.8.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-core-0.1.6.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-core-0.1.8.bazel index 57d22c65064b..226d665682fa 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-core-0.1.6.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-core-0.1.8.bazel @@ -35,7 +35,7 @@ rust_library( ], ), crate_root = "src/lib.rs", - edition = "2021", + edition = "2024", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -93,5 +93,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.1.6", + version = "0.1.8", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-macros-0.2.24.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-macros-0.2.27.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-macros-0.2.24.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-macros-0.2.27.bazel index 08d61498717e..f240decc636e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-macros-0.2.24.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-macros-0.2.27.bazel @@ -35,7 +35,7 @@ rust_proc_macro( ], ), crate_root = "src/lib.rs", - edition = "2021", + edition = "2024", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -93,9 +93,9 @@ rust_proc_macro( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.2.24", + version = "0.2.27", deps = [ - "@vendor_ts__num-conv-0.1.0//:num_conv", - "@vendor_ts__time-core-0.1.6//:time_core", + "@vendor_ts__num-conv-0.2.1//:num_conv", + "@vendor_ts__time-core-0.1.8//:time_core", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tinystr-0.8.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tinystr-0.8.1.bazel deleted file mode 100644 index 896bfb0dd66a..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tinystr-0.8.1.bazel +++ /dev/null @@ -1,107 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "tinystr", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "alloc", - "zerovec", - ], - crate_root = "src/lib.rs", - edition = "2021", - proc_macro_deps = [ - "@vendor_ts__displaydoc-0.2.5//:displaydoc", - ], - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=tinystr", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.8.1", - deps = [ - "@vendor_ts__zerovec-0.11.4//:zerovec", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml-0.9.7.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml-0.9.12+spec-1.1.0.bazel similarity index 92% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml-0.9.7.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml-0.9.12+spec-1.1.0.bazel index 04609ea84f5a..00dda2eead4c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml-0.9.7.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml-0.9.12+spec-1.1.0.bazel @@ -100,13 +100,13 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.9.7", + version = "0.9.12+spec-1.1.0", deps = [ "@vendor_ts__serde_core-1.0.228//:serde_core", - "@vendor_ts__serde_spanned-1.0.2//:serde_spanned", - "@vendor_ts__toml_datetime-0.7.2//:toml_datetime", - "@vendor_ts__toml_parser-1.0.3//:toml_parser", - "@vendor_ts__toml_writer-1.0.3//:toml_writer", - "@vendor_ts__winnow-0.7.13//:winnow", + "@vendor_ts__serde_spanned-1.1.1//:serde_spanned", + "@vendor_ts__toml_datetime-0.7.5-spec-1.1.0//:toml_datetime", + "@vendor_ts__toml_parser-1.1.2-spec-1.1.0//:toml_parser", + "@vendor_ts__toml_writer-1.1.1-spec-1.1.0//:toml_writer", + "@vendor_ts__winnow-0.7.15//:winnow", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml-0.8.23.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml-1.1.2+spec-1.1.0.bazel similarity index 90% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml-0.8.23.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml-1.1.2+spec-1.1.0.bazel index 50cb78eec1e8..762beea47a0a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml-0.8.23.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml-1.1.2+spec-1.1.0.bazel @@ -38,9 +38,11 @@ rust_library( "default", "display", "parse", + "serde", + "std", ], crate_root = "src/lib.rs", - edition = "2021", + edition = "2024", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -98,11 +100,13 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.8.23", + version = "1.1.2+spec-1.1.0", deps = [ - "@vendor_ts__serde-1.0.228//:serde", - "@vendor_ts__serde_spanned-0.6.9//:serde_spanned", - "@vendor_ts__toml_datetime-0.6.11//:toml_datetime", - "@vendor_ts__toml_edit-0.22.27//:toml_edit", + "@vendor_ts__serde_core-1.0.228//:serde_core", + "@vendor_ts__serde_spanned-1.1.1//:serde_spanned", + "@vendor_ts__toml_datetime-1.1.1-spec-1.1.0//:toml_datetime", + "@vendor_ts__toml_parser-1.1.2-spec-1.1.0//:toml_parser", + "@vendor_ts__toml_writer-1.1.1-spec-1.1.0//:toml_writer", + "@vendor_ts__winnow-1.0.1//:winnow", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_datetime-0.7.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_datetime-0.7.5+spec-1.1.0.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_datetime-0.7.2.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_datetime-0.7.5+spec-1.1.0.bazel index f0a1a3502d03..fc176f8a9b8b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_datetime-0.7.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_datetime-0.7.5+spec-1.1.0.bazel @@ -98,7 +98,7 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.7.2", + version = "0.7.5+spec-1.1.0", deps = [ "@vendor_ts__serde_core-1.0.228//:serde_core", ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_datetime-0.6.11.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_datetime-1.1.1+spec-1.1.0.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_datetime-0.6.11.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_datetime-1.1.1+spec-1.1.0.bazel index 2673acb9f664..f92fd3be64c6 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_datetime-0.6.11.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_datetime-1.1.1+spec-1.1.0.bazel @@ -35,10 +35,12 @@ rust_library( ], ), crate_features = [ + "alloc", "serde", + "std", ], crate_root = "src/lib.rs", - edition = "2021", + edition = "2024", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -96,8 +98,8 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.6.11", + version = "1.1.1+spec-1.1.0", deps = [ - "@vendor_ts__serde-1.0.228//:serde", + "@vendor_ts__serde_core-1.0.228//:serde_core", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_edit-0.22.27.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_edit-0.22.27.bazel deleted file mode 100644 index b8a2048b67fb..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_edit-0.22.27.bazel +++ /dev/null @@ -1,110 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "toml_edit", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "display", - "parse", - "serde", - ], - crate_root = "src/lib.rs", - edition = "2021", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=toml_edit", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.22.27", - deps = [ - "@vendor_ts__indexmap-2.11.4//:indexmap", - "@vendor_ts__serde-1.0.228//:serde", - "@vendor_ts__serde_spanned-0.6.9//:serde_spanned", - "@vendor_ts__toml_datetime-0.6.11//:toml_datetime", - "@vendor_ts__toml_write-0.1.2//:toml_write", - "@vendor_ts__winnow-0.7.13//:winnow", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_parser-1.0.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_parser-1.1.2+spec-1.1.0.bazel similarity index 97% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_parser-1.0.3.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_parser-1.1.2+spec-1.1.0.bazel index 3ad30e38760d..90f7f1d57e21 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_parser-1.0.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_parser-1.1.2+spec-1.1.0.bazel @@ -39,7 +39,7 @@ rust_library( "std", ], crate_root = "src/lib.rs", - edition = "2021", + edition = "2024", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -97,8 +97,8 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.3", + version = "1.1.2+spec-1.1.0", deps = [ - "@vendor_ts__winnow-0.7.13//:winnow", + "@vendor_ts__winnow-1.0.1//:winnow", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_write-0.1.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_write-0.1.2.bazel deleted file mode 100644 index 61e730c79391..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_write-0.1.2.bazel +++ /dev/null @@ -1,102 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "toml_write", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "alloc", - "default", - "std", - ], - crate_root = "src/lib.rs", - edition = "2021", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=toml_write", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.1.2", -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_writer-1.0.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_writer-1.1.1+spec-1.1.0.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_writer-1.0.3.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_writer-1.1.1+spec-1.1.0.bazel index 2bed2419242d..c3005bdd0207 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_writer-1.0.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_writer-1.1.1+spec-1.1.0.bazel @@ -39,7 +39,7 @@ rust_library( "std", ], crate_root = "src/lib.rs", - edition = "2021", + edition = "2024", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -97,5 +97,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.3", + version = "1.1.1+spec-1.1.0", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-0.1.41.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-0.1.44.bazel similarity index 95% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-0.1.41.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-0.1.44.bazel index 183d4cdd5865..e38c76a9b2b5 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-0.1.41.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-0.1.44.bazel @@ -43,7 +43,7 @@ rust_library( crate_root = "src/lib.rs", edition = "2018", proc_macro_deps = [ - "@vendor_ts__tracing-attributes-0.1.30//:tracing_attributes", + "@vendor_ts__tracing-attributes-0.1.31//:tracing_attributes", ], rustc_env_files = [ ":cargo_toml_env_vars", @@ -102,9 +102,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.1.41", + version = "0.1.44", deps = [ - "@vendor_ts__pin-project-lite-0.2.16//:pin_project_lite", - "@vendor_ts__tracing-core-0.1.34//:tracing_core", + "@vendor_ts__pin-project-lite-0.2.17//:pin_project_lite", + "@vendor_ts__tracing-core-0.1.36//:tracing_core", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-attributes-0.1.30.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-attributes-0.1.31.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-attributes-0.1.30.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-attributes-0.1.31.bazel index 8f607d2a3218..6a87d07d6245 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-attributes-0.1.30.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-attributes-0.1.31.bazel @@ -93,10 +93,10 @@ rust_proc_macro( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.1.30", + version = "0.1.31", deps = [ - "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", - "@vendor_ts__quote-1.0.41//:quote", - "@vendor_ts__syn-2.0.106//:syn", + "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", + "@vendor_ts__quote-1.0.45//:quote", + "@vendor_ts__syn-2.0.117//:syn", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-core-0.1.34.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-core-0.1.36.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-core-0.1.34.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-core-0.1.36.bazel index c30ffdd41dfe..aacfb5924369 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-core-0.1.34.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-core-0.1.36.bazel @@ -98,8 +98,8 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.1.34", + version = "0.1.36", deps = [ - "@vendor_ts__once_cell-1.21.3//:once_cell", + "@vendor_ts__once_cell-1.21.4//:once_cell", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-flame-0.2.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-flame-0.2.0.bazel index 23e0eab2f412..dde38953aa25 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-flame-0.2.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-flame-0.2.0.bazel @@ -100,7 +100,7 @@ rust_library( version = "0.2.0", deps = [ "@vendor_ts__lazy_static-1.5.0//:lazy_static", - "@vendor_ts__tracing-0.1.41//:tracing", - "@vendor_ts__tracing-subscriber-0.3.20//:tracing_subscriber", + "@vendor_ts__tracing-0.1.44//:tracing", + "@vendor_ts__tracing-subscriber-0.3.23//:tracing_subscriber", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-log-0.2.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-log-0.2.0.bazel index 9cd5f33c7cd2..e5c9180aca2f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-log-0.2.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-log-0.2.0.bazel @@ -99,8 +99,8 @@ rust_library( }), version = "0.2.0", deps = [ - "@vendor_ts__log-0.4.28//:log", - "@vendor_ts__once_cell-1.21.3//:once_cell", - "@vendor_ts__tracing-core-0.1.34//:tracing_core", + "@vendor_ts__log-0.4.29//:log", + "@vendor_ts__once_cell-1.21.4//:once_cell", + "@vendor_ts__tracing-core-0.1.36//:tracing_core", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-subscriber-0.3.20.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-subscriber-0.3.23.bazel similarity index 93% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-subscriber-0.3.20.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-subscriber-0.3.23.bazel index f0c94ca745b6..5e6f05363a9e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-subscriber-0.3.20.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-subscriber-0.3.23.bazel @@ -40,6 +40,7 @@ rust_library( "default", "env-filter", "fmt", + "local-time", "matchers", "nu-ansi-term", "once_cell", @@ -48,6 +49,7 @@ rust_library( "smallvec", "std", "thread_local", + "time", "tracing", "tracing-log", ], @@ -110,17 +112,18 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.3.20", + version = "0.3.23", deps = [ "@vendor_ts__matchers-0.2.0//:matchers", "@vendor_ts__nu-ansi-term-0.50.1//:nu_ansi_term", - "@vendor_ts__once_cell-1.21.3//:once_cell", - "@vendor_ts__regex-automata-0.4.11//:regex_automata", + "@vendor_ts__once_cell-1.21.4//:once_cell", + "@vendor_ts__regex-automata-0.4.14//:regex_automata", "@vendor_ts__sharded-slab-0.1.7//:sharded_slab", "@vendor_ts__smallvec-1.15.1//:smallvec", "@vendor_ts__thread_local-1.1.9//:thread_local", - "@vendor_ts__tracing-0.1.41//:tracing", - "@vendor_ts__tracing-core-0.1.34//:tracing_core", + "@vendor_ts__time-0.3.47//:time", + "@vendor_ts__tracing-0.1.44//:tracing", + "@vendor_ts__tracing-core-0.1.36//:tracing_core", "@vendor_ts__tracing-log-0.2.0//:tracing_log", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.petgraph-0.6.5.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-tree-0.4.1.bazel similarity index 92% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.petgraph-0.6.5.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-tree-0.4.1.bazel index 1ad22b9f498f..b2df0920ffe4 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.petgraph-0.6.5.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-tree-0.4.1.bazel @@ -17,7 +17,7 @@ cargo_toml_env_vars( ) rust_library( - name = "petgraph", + name = "tracing_tree", srcs = glob( include = ["**/*.rs"], allow_empty = True, @@ -36,9 +36,7 @@ rust_library( ), crate_features = [ "default", - "graphmap", - "matrix_graph", - "stable_graph", + "tracing-log", ], crate_root = "src/lib.rs", edition = "2018", @@ -50,7 +48,7 @@ rust_library( ], tags = [ "cargo-bazel", - "crate-name=petgraph", + "crate-name=tracing-tree", "manual", "noclippy", "norustfmt", @@ -99,9 +97,11 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.6.5", + version = "0.4.1", deps = [ - "@vendor_ts__fixedbitset-0.4.2//:fixedbitset", - "@vendor_ts__indexmap-2.11.4//:indexmap", + "@vendor_ts__nu-ansi-term-0.50.1//:nu_ansi_term", + "@vendor_ts__tracing-core-0.1.36//:tracing_core", + "@vendor_ts__tracing-log-0.2.0//:tracing_log", + "@vendor_ts__tracing-subscriber-0.3.23//:tracing_subscriber", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-0.25.9.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-0.25.9.bazel index fd97779c54c6..90f526621a7b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-0.25.9.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-0.25.9.bazel @@ -103,8 +103,8 @@ rust_library( }), version = "0.25.9", deps = [ - "@vendor_ts__regex-1.11.3//:regex", - "@vendor_ts__regex-syntax-0.8.6//:regex_syntax", + "@vendor_ts__regex-1.12.3//:regex", + "@vendor_ts__regex-syntax-0.8.10//:regex_syntax", "@vendor_ts__streaming-iterator-0.1.9//:streaming_iterator", "@vendor_ts__tree-sitter-0.25.9//:build_script_build", "@vendor_ts__tree-sitter-language-0.1.5//:tree_sitter_language", @@ -167,8 +167,8 @@ cargo_build_script( version = "0.25.9", visibility = ["//visibility:private"], deps = [ - "@vendor_ts__cc-1.2.37//:cc", - "@vendor_ts__serde_json-1.0.145//:serde_json", + "@vendor_ts__cc-1.2.60//:cc", + "@vendor_ts__serde_json-1.0.149//:serde_json", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-embedded-template-0.25.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-embedded-template-0.25.0.bazel index c9dd60b03c0e..e3e92da896c7 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-embedded-template-0.25.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-embedded-template-0.25.0.bazel @@ -155,7 +155,7 @@ cargo_build_script( version = "0.25.0", visibility = ["//visibility:private"], deps = [ - "@vendor_ts__cc-1.2.37//:cc", + "@vendor_ts__cc-1.2.60//:cc", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-json-0.24.8.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-json-0.24.8.bazel index 6b9a7bf0582b..04bbbafb257f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-json-0.24.8.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-json-0.24.8.bazel @@ -155,7 +155,7 @@ cargo_build_script( version = "0.24.8", visibility = ["//visibility:private"], deps = [ - "@vendor_ts__cc-1.2.37//:cc", + "@vendor_ts__cc-1.2.60//:cc", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ql-0.23.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ql-0.23.1.bazel index 0b7ce3a9a29c..a2ec97769c24 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ql-0.23.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ql-0.23.1.bazel @@ -155,7 +155,7 @@ cargo_build_script( version = "0.23.1", visibility = ["//visibility:private"], deps = [ - "@vendor_ts__cc-1.2.37//:cc", + "@vendor_ts__cc-1.2.60//:cc", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ruby-0.23.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ruby-0.23.1.bazel index f939b4b9493c..3352db845fa5 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ruby-0.23.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ruby-0.23.1.bazel @@ -155,7 +155,7 @@ cargo_build_script( version = "0.23.1", visibility = ["//visibility:private"], deps = [ - "@vendor_ts__cc-1.2.37//:cc", + "@vendor_ts__cc-1.2.60//:cc", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.triomphe-0.1.14.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.triomphe-0.1.15.bazel similarity index 97% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.triomphe-0.1.14.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.triomphe-0.1.15.bazel index f1774bfb2f03..74d278eb3bcd 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.triomphe-0.1.14.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.triomphe-0.1.15.bazel @@ -41,7 +41,7 @@ rust_library( "std", ], crate_root = "src/lib.rs", - edition = "2015", + edition = "2021", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -99,9 +99,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.1.14", + version = "0.1.15", deps = [ "@vendor_ts__serde-1.0.228//:serde", - "@vendor_ts__stable_deref_trait-1.2.0//:stable_deref_trait", + "@vendor_ts__stable_deref_trait-1.2.1//:stable_deref_trait", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.unicode-ident-1.0.19.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.unicode-ident-1.0.24.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.unicode-ident-1.0.19.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.unicode-ident-1.0.24.bazel index 75aa1ff078af..27918c9b2b4a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.unicode-ident-1.0.19.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.unicode-ident-1.0.24.bazel @@ -35,7 +35,7 @@ rust_library( ], ), crate_root = "src/lib.rs", - edition = "2018", + edition = "2021", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -93,5 +93,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.19", + version = "1.0.24", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.url-2.5.7.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.url-2.5.7.bazel deleted file mode 100644 index 043bed2ca2c0..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.url-2.5.7.bazel +++ /dev/null @@ -1,108 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "url", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "default", - "serde", - "std", - ], - crate_root = "src/lib.rs", - edition = "2018", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=url", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "2.5.7", - deps = [ - "@vendor_ts__form_urlencoded-1.2.2//:form_urlencoded", - "@vendor_ts__idna-1.1.0//:idna", - "@vendor_ts__percent-encoding-2.3.2//:percent_encoding", - "@vendor_ts__serde-1.0.228//:serde", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.utf8_iter-1.0.4.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.utf8_iter-1.0.4.bazel deleted file mode 100644 index 9ebd1462558c..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.utf8_iter-1.0.4.bazel +++ /dev/null @@ -1,97 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "utf8_iter", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_root = "src/lib.rs", - edition = "2021", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=utf8_iter", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "1.0.4", -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasi-0.14.5+wasi-0.2.4.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasip3-0.4.0+wasi-0.3.0-rc-2026-01-06.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasi-0.14.5+wasi-0.2.4.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasip3-0.4.0+wasi-0.3.0-rc-2026-01-06.bazel index a5826f5cea2e..580c2cef0aab 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasi-0.14.5+wasi-0.2.4.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasip3-0.4.0+wasi-0.3.0-rc-2026-01-06.bazel @@ -17,7 +17,7 @@ cargo_toml_env_vars( ) rust_library( - name = "wasi", + name = "wasip3", srcs = glob( include = ["**/*.rs"], allow_empty = True, @@ -44,7 +44,7 @@ rust_library( ], tags = [ "cargo-bazel", - "crate-name=wasi", + "crate-name=wasip3", "manual", "noclippy", "norustfmt", @@ -93,8 +93,8 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.14.5+wasi-0.2.4", + version = "0.4.0+wasi-0.3.0-rc-2026-01-06", deps = [ - "@vendor_ts__wasip2-1.0.0-wasi-0.2.4//:wasip2", + "@vendor_ts__wit-bindgen-0.51.0//:wit_bindgen", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-0.2.101.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-0.2.101.bazel index 91c146904b67..196c576af5aa 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-0.2.101.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-0.2.101.bazel @@ -109,8 +109,8 @@ rust_library( }), version = "0.2.101", deps = [ - "@vendor_ts__cfg-if-1.0.3//:cfg_if", - "@vendor_ts__once_cell-1.21.3//:once_cell", + "@vendor_ts__cfg-if-1.0.4//:cfg_if", + "@vendor_ts__once_cell-1.21.4//:once_cell", "@vendor_ts__wasm-bindgen-0.2.101//:build_script_build", "@vendor_ts__wasm-bindgen-shared-0.2.101//:wasm_bindgen_shared", ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-backend-0.2.101.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-backend-0.2.101.bazel index 8bd3515bef87..77960d29b6f6 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-backend-0.2.101.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-backend-0.2.101.bazel @@ -96,10 +96,10 @@ rust_library( version = "0.2.101", deps = [ "@vendor_ts__bumpalo-3.19.0//:bumpalo", - "@vendor_ts__log-0.4.28//:log", - "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", - "@vendor_ts__quote-1.0.41//:quote", - "@vendor_ts__syn-2.0.106//:syn", + "@vendor_ts__log-0.4.29//:log", + "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", + "@vendor_ts__quote-1.0.45//:quote", + "@vendor_ts__syn-2.0.117//:syn", "@vendor_ts__wasm-bindgen-shared-0.2.101//:wasm_bindgen_shared", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-macro-0.2.101.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-macro-0.2.101.bazel index 3e207f054b06..1da3ebd7a263 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-macro-0.2.101.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-macro-0.2.101.bazel @@ -95,7 +95,7 @@ rust_proc_macro( }), version = "0.2.101", deps = [ - "@vendor_ts__quote-1.0.41//:quote", + "@vendor_ts__quote-1.0.45//:quote", "@vendor_ts__wasm-bindgen-macro-support-0.2.101//:wasm_bindgen_macro_support", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-macro-support-0.2.101.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-macro-support-0.2.101.bazel index b2276e1a6386..b7bef3511c05 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-macro-support-0.2.101.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-macro-support-0.2.101.bazel @@ -95,9 +95,9 @@ rust_library( }), version = "0.2.101", deps = [ - "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", - "@vendor_ts__quote-1.0.41//:quote", - "@vendor_ts__syn-2.0.106//:syn", + "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", + "@vendor_ts__quote-1.0.45//:quote", + "@vendor_ts__syn-2.0.117//:syn", "@vendor_ts__wasm-bindgen-backend-0.2.101//:wasm_bindgen_backend", "@vendor_ts__wasm-bindgen-shared-0.2.101//:wasm_bindgen_shared", ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-shared-0.2.101.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-shared-0.2.101.bazel index bb7bc40362a1..d8048e89a97b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-shared-0.2.101.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-shared-0.2.101.bazel @@ -99,7 +99,7 @@ rust_library( }), version = "0.2.101", deps = [ - "@vendor_ts__unicode-ident-1.0.19//:unicode_ident", + "@vendor_ts__unicode-ident-1.0.24//:unicode_ident", "@vendor_ts__wasm-bindgen-shared-0.2.101//:build_script_build", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ppv-lite86-0.2.21.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-encoder-0.244.0.bazel similarity index 94% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ppv-lite86-0.2.21.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-encoder-0.244.0.bazel index a4b01dcbc67f..ac2651bb736a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ppv-lite86-0.2.21.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-encoder-0.244.0.bazel @@ -17,7 +17,7 @@ cargo_toml_env_vars( ) rust_library( - name = "ppv_lite86", + name = "wasm_encoder", srcs = glob( include = ["**/*.rs"], allow_empty = True, @@ -35,8 +35,9 @@ rust_library( ], ), crate_features = [ - "simd", + "component-model", "std", + "wasmparser", ], crate_root = "src/lib.rs", edition = "2021", @@ -48,7 +49,7 @@ rust_library( ], tags = [ "cargo-bazel", - "crate-name=ppv-lite86", + "crate-name=wasm-encoder", "manual", "noclippy", "norustfmt", @@ -97,8 +98,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.2.21", + version = "0.244.0", deps = [ - "@vendor_ts__zerocopy-0.8.27//:zerocopy", + "@vendor_ts__leb128fmt-0.1.0//:leb128fmt", + "@vendor_ts__wasmparser-0.244.0//:wasmparser", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-metadata-0.244.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-metadata-0.244.0.bazel new file mode 100644 index 000000000000..5a91b52eac5c --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-metadata-0.244.0.bazel @@ -0,0 +1,103 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "wasm_metadata", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=wasm-metadata", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.244.0", + deps = [ + "@vendor_ts__anyhow-1.0.102//:anyhow", + "@vendor_ts__indexmap-2.14.0//:indexmap", + "@vendor_ts__wasm-encoder-0.244.0//:wasm_encoder", + "@vendor_ts__wasmparser-0.244.0//:wasmparser", + ], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasmparser-0.244.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasmparser-0.244.0.bazel new file mode 100644 index 000000000000..8b1c810b8090 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasmparser-0.244.0.bazel @@ -0,0 +1,111 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "wasmparser", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "component-model", + "features", + "hash-collections", + "simd", + "std", + "validate", + ], + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=wasmparser", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.244.0", + deps = [ + "@vendor_ts__bitflags-2.11.1//:bitflags", + "@vendor_ts__hashbrown-0.15.5//:hashbrown", + "@vendor_ts__indexmap-2.14.0//:indexmap", + "@vendor_ts__semver-1.0.28//:semver", + ], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-implement-0.60.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-implement-0.60.0.bazel index 4477961b0a8f..4c57669e8c53 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-implement-0.60.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-implement-0.60.0.bazel @@ -95,8 +95,8 @@ rust_proc_macro( }), version = "0.60.0", deps = [ - "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", - "@vendor_ts__quote-1.0.41//:quote", - "@vendor_ts__syn-2.0.106//:syn", + "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", + "@vendor_ts__quote-1.0.45//:quote", + "@vendor_ts__syn-2.0.117//:syn", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-interface-0.59.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-interface-0.59.1.bazel index cc4f0390337a..3e3c10462ea9 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-interface-0.59.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-interface-0.59.1.bazel @@ -95,8 +95,8 @@ rust_proc_macro( }), version = "0.59.1", deps = [ - "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", - "@vendor_ts__quote-1.0.41//:quote", - "@vendor_ts__syn-2.0.106//:syn", + "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", + "@vendor_ts__quote-1.0.45//:quote", + "@vendor_ts__syn-2.0.117//:syn", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-sys-0.52.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-sys-0.52.0.bazel index 9aee199dc0a8..5322a02c0786 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-sys-0.52.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-sys-0.52.0.bazel @@ -42,7 +42,6 @@ rust_library( "Win32_Storage_FileSystem", "Win32_System", "Win32_System_Console", - "Win32_System_Threading", "default", ], crate_root = "src/lib.rs", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-sys-0.59.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-sys-0.59.0.bazel deleted file mode 100644 index b3222f2a6588..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-sys-0.59.0.bazel +++ /dev/null @@ -1,109 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "windows_sys", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "Win32", - "Win32_Foundation", - "Win32_System", - "Win32_System_Com", - "Win32_UI", - "Win32_UI_Shell", - "default", - ], - crate_root = "src/lib.rs", - edition = "2021", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=windows-sys", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.59.0", - deps = [ - "@vendor_ts__windows-targets-0.52.6//:windows_targets", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-sys-0.61.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-sys-0.61.0.bazel index a6f072e5b2a9..320d971898d4 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-sys-0.61.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-sys-0.61.0.bazel @@ -43,11 +43,14 @@ rust_library( "Win32_Storage", "Win32_Storage_FileSystem", "Win32_System", + "Win32_System_Com", "Win32_System_Console", "Win32_System_IO", "Win32_System_Pipes", "Win32_System_SystemInformation", "Win32_System_Threading", + "Win32_UI", + "Win32_UI_Shell", "default", ], crate_root = "src/lib.rs", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winnow-0.7.13.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winnow-0.7.13.bazel deleted file mode 100644 index 997a4bf65d4d..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winnow-0.7.13.bazel +++ /dev/null @@ -1,102 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "winnow", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "alloc", - "default", - "std", - ], - crate_root = "src/lib.rs", - edition = "2021", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=winnow", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.7.13", -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winnow-0.7.15.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winnow-0.7.15.bazel new file mode 100644 index 000000000000..156ad002d937 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winnow-0.7.15.bazel @@ -0,0 +1,97 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "winnow", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=winnow", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.7.15", +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winnow-1.0.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winnow-1.0.1.bazel new file mode 100644 index 000000000000..e18bf009650b --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winnow-1.0.1.bazel @@ -0,0 +1,97 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "winnow", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=winnow", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "1.0.1", +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.icu_properties_data-2.0.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-0.51.0.bazel similarity index 94% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.icu_properties_data-2.0.1.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-0.51.0.bazel index e7aa78908e36..17e24365c6b1 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.icu_properties_data-2.0.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-0.51.0.bazel @@ -21,7 +21,7 @@ cargo_toml_env_vars( ) rust_library( - name = "icu_properties_data", + name = "wit_bindgen", srcs = glob( include = ["**/*.rs"], allow_empty = True, @@ -39,7 +39,7 @@ rust_library( ], ), crate_root = "src/lib.rs", - edition = "2021", + edition = "2024", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -48,7 +48,7 @@ rust_library( ], tags = [ "cargo-bazel", - "crate-name=icu_properties_data", + "crate-name=wit-bindgen", "manual", "noclippy", "norustfmt", @@ -97,9 +97,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "2.0.1", + version = "0.51.0", deps = [ - "@vendor_ts__icu_properties_data-2.0.1//:build_script_build", + "@vendor_ts__wit-bindgen-0.51.0//:build_script_build", ], ) @@ -136,8 +136,8 @@ cargo_build_script( "WORKSPACE.bazel", ], ), - edition = "2021", - pkg_name = "icu_properties_data", + edition = "2024", + pkg_name = "wit-bindgen", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -146,12 +146,12 @@ cargo_build_script( ], tags = [ "cargo-bazel", - "crate-name=icu_properties_data", + "crate-name=wit-bindgen", "manual", "noclippy", "norustfmt", ], - version = "2.0.1", + version = "0.51.0", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-core-0.51.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-core-0.51.0.bazel new file mode 100644 index 000000000000..5d5f5e2dfd8e --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-core-0.51.0.bazel @@ -0,0 +1,102 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "wit_bindgen_core", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2024", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=wit-bindgen-core", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.51.0", + deps = [ + "@vendor_ts__anyhow-1.0.102//:anyhow", + "@vendor_ts__heck-0.5.0//:heck", + "@vendor_ts__wit-parser-0.244.0//:wit_parser", + ], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-rust-0.51.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-rust-0.51.0.bazel new file mode 100644 index 000000000000..b2266ab0a05d --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-rust-0.51.0.bazel @@ -0,0 +1,173 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load( + "@rules_rust//cargo:defs.bzl", + "cargo_build_script", + "cargo_toml_env_vars", +) +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "wit_bindgen_rust", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2024", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=wit-bindgen-rust", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.51.0", + deps = [ + "@vendor_ts__anyhow-1.0.102//:anyhow", + "@vendor_ts__heck-0.5.0//:heck", + "@vendor_ts__indexmap-2.14.0//:indexmap", + "@vendor_ts__prettyplease-0.2.37//:prettyplease", + "@vendor_ts__syn-2.0.117//:syn", + "@vendor_ts__wasm-metadata-0.244.0//:wasm_metadata", + "@vendor_ts__wit-bindgen-core-0.51.0//:wit_bindgen_core", + "@vendor_ts__wit-bindgen-rust-0.51.0//:build_script_build", + "@vendor_ts__wit-component-0.244.0//:wit_component", + ], +) + +cargo_build_script( + name = "_bs", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + "**/*.rs", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_name = "build_script_build", + crate_root = "build.rs", + data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + edition = "2024", + link_deps = [ + "@vendor_ts__prettyplease-0.2.37//:prettyplease", + ], + pkg_name = "wit-bindgen-rust", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=wit-bindgen-rust", + "manual", + "noclippy", + "norustfmt", + ], + version = "0.51.0", + visibility = ["//visibility:private"], +) + +alias( + name = "build_script_build", + actual = ":_bs", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-rust-macro-0.51.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-rust-macro-0.51.0.bazel new file mode 100644 index 000000000000..8372f1162962 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-rust-macro-0.51.0.bazel @@ -0,0 +1,172 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load( + "@rules_rust//cargo:defs.bzl", + "cargo_build_script", + "cargo_toml_env_vars", +) +load("@rules_rust//rust:defs.bzl", "rust_proc_macro") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_proc_macro( + name = "wit_bindgen_rust_macro", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2024", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=wit-bindgen-rust-macro", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.51.0", + deps = [ + "@vendor_ts__anyhow-1.0.102//:anyhow", + "@vendor_ts__prettyplease-0.2.37//:prettyplease", + "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", + "@vendor_ts__quote-1.0.45//:quote", + "@vendor_ts__syn-2.0.117//:syn", + "@vendor_ts__wit-bindgen-core-0.51.0//:wit_bindgen_core", + "@vendor_ts__wit-bindgen-rust-0.51.0//:wit_bindgen_rust", + "@vendor_ts__wit-bindgen-rust-macro-0.51.0//:build_script_build", + ], +) + +cargo_build_script( + name = "_bs", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + "**/*.rs", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_name = "build_script_build", + crate_root = "build.rs", + data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + edition = "2024", + link_deps = [ + "@vendor_ts__prettyplease-0.2.37//:prettyplease", + ], + pkg_name = "wit-bindgen-rust-macro", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=wit-bindgen-rust-macro", + "manual", + "noclippy", + "norustfmt", + ], + version = "0.51.0", + visibility = ["//visibility:private"], +) + +alias( + name = "build_script_build", + actual = ":_bs", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_spanned-0.6.9.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-component-0.244.0.bazel similarity index 86% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_spanned-0.6.9.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-component-0.244.0.bazel index c5d9c5336e6a..a6a60adbac3d 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_spanned-0.6.9.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-component-0.244.0.bazel @@ -17,7 +17,7 @@ cargo_toml_env_vars( ) rust_library( - name = "serde_spanned", + name = "wit_component", srcs = glob( include = ["**/*.rs"], allow_empty = True, @@ -34,11 +34,11 @@ rust_library( "WORKSPACE.bazel", ], ), - crate_features = [ - "serde", - ], crate_root = "src/lib.rs", edition = "2021", + proc_macro_deps = [ + "@vendor_ts__serde_derive-1.0.228//:serde_derive", + ], rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -47,7 +47,7 @@ rust_library( ], tags = [ "cargo-bazel", - "crate-name=serde_spanned", + "crate-name=wit-component", "manual", "noclippy", "norustfmt", @@ -96,8 +96,17 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.6.9", + version = "0.244.0", deps = [ + "@vendor_ts__anyhow-1.0.102//:anyhow", + "@vendor_ts__bitflags-2.11.1//:bitflags", + "@vendor_ts__indexmap-2.14.0//:indexmap", + "@vendor_ts__log-0.4.29//:log", "@vendor_ts__serde-1.0.228//:serde", + "@vendor_ts__serde_json-1.0.149//:serde_json", + "@vendor_ts__wasm-encoder-0.244.0//:wasm_encoder", + "@vendor_ts__wasm-metadata-0.244.0//:wasm_metadata", + "@vendor_ts__wasmparser-0.244.0//:wasmparser", + "@vendor_ts__wit-parser-0.244.0//:wit_parser", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo-util-schemas-0.8.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-parser-0.244.0.bazel similarity index 86% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo-util-schemas-0.8.2.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-parser-0.244.0.bazel index 802e8d678083..a4795bc61642 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo-util-schemas-0.8.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-parser-0.244.0.bazel @@ -17,7 +17,7 @@ cargo_toml_env_vars( ) rust_library( - name = "cargo_util_schemas", + name = "wit_parser", srcs = glob( include = ["**/*.rs"], allow_empty = True, @@ -34,8 +34,17 @@ rust_library( "WORKSPACE.bazel", ], ), + crate_features = [ + "decoding", + "default", + "serde", + "serde_json", + ], crate_root = "src/lib.rs", edition = "2021", + proc_macro_deps = [ + "@vendor_ts__serde_derive-1.0.228//:serde_derive", + ], rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -44,7 +53,7 @@ rust_library( ], tags = [ "cargo-bazel", - "crate-name=cargo-util-schemas", + "crate-name=wit-parser", "manual", "noclippy", "norustfmt", @@ -93,15 +102,16 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.8.2", + version = "0.244.0", deps = [ - "@vendor_ts__semver-1.0.26//:semver", + "@vendor_ts__anyhow-1.0.102//:anyhow", + "@vendor_ts__id-arena-2.3.0//:id_arena", + "@vendor_ts__indexmap-2.14.0//:indexmap", + "@vendor_ts__log-0.4.29//:log", + "@vendor_ts__semver-1.0.28//:semver", "@vendor_ts__serde-1.0.228//:serde", - "@vendor_ts__serde-untagged-0.1.8//:serde_untagged", - "@vendor_ts__serde-value-0.7.0//:serde_value", - "@vendor_ts__thiserror-2.0.16//:thiserror", - "@vendor_ts__toml-0.8.23//:toml", + "@vendor_ts__serde_json-1.0.149//:serde_json", "@vendor_ts__unicode-xid-0.2.6//:unicode_xid", - "@vendor_ts__url-2.5.7//:url", + "@vendor_ts__wasmparser-0.244.0//:wasmparser", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.yoke-0.8.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.yoke-0.8.0.bazel deleted file mode 100644 index ecef8b52a73d..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.yoke-0.8.0.bazel +++ /dev/null @@ -1,109 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "yoke", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "alloc", - "derive", - "zerofrom", - ], - crate_root = "src/lib.rs", - edition = "2021", - proc_macro_deps = [ - "@vendor_ts__yoke-derive-0.8.0//:yoke_derive", - ], - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=yoke", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.8.0", - deps = [ - "@vendor_ts__stable_deref_trait-1.2.0//:stable_deref_trait", - "@vendor_ts__zerofrom-0.1.6//:zerofrom", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zerocopy-derive-0.8.27.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zerocopy-derive-0.8.27.bazel deleted file mode 100644 index 11df1449c962..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zerocopy-derive-0.8.27.bazel +++ /dev/null @@ -1,102 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_proc_macro") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_proc_macro( - name = "zerocopy_derive", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_root = "src/lib.rs", - edition = "2021", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=zerocopy-derive", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.8.27", - deps = [ - "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", - "@vendor_ts__quote-1.0.41//:quote", - "@vendor_ts__syn-2.0.106//:syn", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zerofrom-0.1.6.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zerofrom-0.1.6.bazel deleted file mode 100644 index fbb85d748c8f..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zerofrom-0.1.6.bazel +++ /dev/null @@ -1,104 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "zerofrom", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "alloc", - "derive", - ], - crate_root = "src/lib.rs", - edition = "2021", - proc_macro_deps = [ - "@vendor_ts__zerofrom-derive-0.1.6//:zerofrom_derive", - ], - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=zerofrom", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.1.6", -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zerofrom-derive-0.1.6.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zerofrom-derive-0.1.6.bazel deleted file mode 100644 index ff9c1ef21429..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zerofrom-derive-0.1.6.bazel +++ /dev/null @@ -1,103 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_proc_macro") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_proc_macro( - name = "zerofrom_derive", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_root = "src/lib.rs", - edition = "2021", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=zerofrom-derive", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.1.6", - deps = [ - "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", - "@vendor_ts__quote-1.0.41//:quote", - "@vendor_ts__syn-2.0.106//:syn", - "@vendor_ts__synstructure-0.13.2//:synstructure", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zerotrie-0.2.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zerotrie-0.2.2.bazel deleted file mode 100644 index 1bcd44131b7e..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zerotrie-0.2.2.bazel +++ /dev/null @@ -1,108 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "zerotrie", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "yoke", - "zerofrom", - ], - crate_root = "src/lib.rs", - edition = "2021", - proc_macro_deps = [ - "@vendor_ts__displaydoc-0.2.5//:displaydoc", - ], - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=zerotrie", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.2.2", - deps = [ - "@vendor_ts__yoke-0.8.0//:yoke", - "@vendor_ts__zerofrom-0.1.6//:zerofrom", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zerovec-0.11.4.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zerovec-0.11.4.bazel deleted file mode 100644 index a8fe8f8c7e9e..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zerovec-0.11.4.bazel +++ /dev/null @@ -1,109 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "zerovec", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "alloc", - "derive", - "yoke", - ], - crate_root = "src/lib.rs", - edition = "2021", - proc_macro_deps = [ - "@vendor_ts__zerovec-derive-0.11.1//:zerovec_derive", - ], - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=zerovec", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.11.4", - deps = [ - "@vendor_ts__yoke-0.8.0//:yoke", - "@vendor_ts__zerofrom-0.1.6//:zerofrom", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zerovec-derive-0.11.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zerovec-derive-0.11.1.bazel deleted file mode 100644 index ace3c224c5df..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zerovec-derive-0.11.1.bazel +++ /dev/null @@ -1,102 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_proc_macro") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_proc_macro( - name = "zerovec_derive", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_root = "src/lib.rs", - edition = "2021", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=zerovec-derive", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.11.1", - deps = [ - "@vendor_ts__proc-macro2-1.0.101//:proc_macro2", - "@vendor_ts__quote-1.0.41//:quote", - "@vendor_ts__syn-2.0.106//:syn", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.typeid-1.0.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zmij-1.0.21.bazel similarity index 95% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.typeid-1.0.3.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zmij-1.0.21.bazel index 0e5737ac61b9..be61c1bfb32c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.typeid-1.0.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zmij-1.0.21.bazel @@ -21,7 +21,7 @@ cargo_toml_env_vars( ) rust_library( - name = "typeid", + name = "zmij", srcs = glob( include = ["**/*.rs"], allow_empty = True, @@ -39,7 +39,7 @@ rust_library( ], ), crate_root = "src/lib.rs", - edition = "2018", + edition = "2021", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -48,7 +48,7 @@ rust_library( ], tags = [ "cargo-bazel", - "crate-name=typeid", + "crate-name=zmij", "manual", "noclippy", "norustfmt", @@ -97,9 +97,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.3", + version = "1.0.21", deps = [ - "@vendor_ts__typeid-1.0.3//:build_script_build", + "@vendor_ts__zmij-1.0.21//:build_script_build", ], ) @@ -136,8 +136,8 @@ cargo_build_script( "WORKSPACE.bazel", ], ), - edition = "2018", - pkg_name = "typeid", + edition = "2021", + pkg_name = "zmij", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -146,12 +146,12 @@ cargo_build_script( ], tags = [ "cargo-bazel", - "crate-name=typeid", + "crate-name=zmij", "manual", "noclippy", "norustfmt", ], - version = "1.0.3", + version = "1.0.21", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zstd-sys-2.0.16+zstd.1.5.7.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zstd-sys-2.0.16+zstd.1.5.7.bazel index 32a06f947886..e3d0552cb978 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zstd-sys-2.0.16+zstd.1.5.7.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zstd-sys-2.0.16+zstd.1.5.7.bazel @@ -165,7 +165,7 @@ cargo_build_script( version = "2.0.16+zstd.1.5.7", visibility = ["//visibility:private"], deps = [ - "@vendor_ts__cc-1.2.37//:cc", + "@vendor_ts__cc-1.2.60//:cc", "@vendor_ts__pkg-config-0.3.32//:pkg_config", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/defs.bzl b/misc/bazel/3rdparty/tree_sitter_extractors_deps/defs.bzl index bf11bc6c82fa..2d7841c35661 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/defs.bzl +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/defs.bzl @@ -295,14 +295,14 @@ def aliases( _NORMAL_DEPENDENCIES = { "ruby/extractor": { _COMMON_CONDITION: { - "clap": Label("@vendor_ts__clap-4.5.48//:clap"), + "clap": Label("@vendor_ts__clap-4.6.0//:clap"), "encoding": Label("@vendor_ts__encoding-0.2.33//:encoding"), "lazy_static": Label("@vendor_ts__lazy_static-1.5.0//:lazy_static"), - "rayon": Label("@vendor_ts__rayon-1.11.0//:rayon"), - "regex": Label("@vendor_ts__regex-1.11.3//:regex"), - "serde_json": Label("@vendor_ts__serde_json-1.0.145//:serde_json"), - "tracing": Label("@vendor_ts__tracing-0.1.41//:tracing"), - "tracing-subscriber": Label("@vendor_ts__tracing-subscriber-0.3.20//:tracing_subscriber"), + "rayon": Label("@vendor_ts__rayon-1.12.0//:rayon"), + "regex": Label("@vendor_ts__regex-1.12.3//:regex"), + "serde_json": Label("@vendor_ts__serde_json-1.0.149//:serde_json"), + "tracing": Label("@vendor_ts__tracing-0.1.44//:tracing"), + "tracing-subscriber": Label("@vendor_ts__tracing-subscriber-0.3.23//:tracing_subscriber"), "tree-sitter": Label("@vendor_ts__tree-sitter-0.25.9//:tree_sitter"), "tree-sitter-embedded-template": Label("@vendor_ts__tree-sitter-embedded-template-0.25.0//:tree_sitter_embedded_template"), "tree-sitter-ruby": Label("@vendor_ts__tree-sitter-ruby-0.23.1//:tree_sitter_ruby"), @@ -310,14 +310,14 @@ _NORMAL_DEPENDENCIES = { }, "rust/ast-generator": { _COMMON_CONDITION: { - "anyhow": Label("@vendor_ts__anyhow-1.0.100//:anyhow"), + "anyhow": Label("@vendor_ts__anyhow-1.0.102//:anyhow"), "either": Label("@vendor_ts__either-1.15.0//:either"), "itertools": Label("@vendor_ts__itertools-0.14.0//:itertools"), "mustache": Label("@vendor_ts__mustache-0.9.0//:mustache"), - "proc-macro2": Label("@vendor_ts__proc-macro2-1.0.101//:proc_macro2"), - "quote": Label("@vendor_ts__quote-1.0.41//:quote"), + "proc-macro2": Label("@vendor_ts__proc-macro2-1.0.106//:proc_macro2"), + "quote": Label("@vendor_ts__quote-1.0.45//:quote"), "serde": Label("@vendor_ts__serde-1.0.228//:serde"), - "stdx": Label("@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx"), + "stdx": Label("@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx"), "ungrammar": Label("@vendor_ts__ungrammar-1.16.1//:ungrammar"), }, }, @@ -325,62 +325,62 @@ _NORMAL_DEPENDENCIES = { }, "rust/extractor": { _COMMON_CONDITION: { - "anyhow": Label("@vendor_ts__anyhow-1.0.100//:anyhow"), - "argfile": Label("@vendor_ts__argfile-0.2.1//:argfile"), + "anyhow": Label("@vendor_ts__anyhow-1.0.102//:anyhow"), + "argfile": Label("@vendor_ts__argfile-1.0.0//:argfile"), "chalk-ir": Label("@vendor_ts__chalk-ir-0.104.0//:chalk_ir"), - "chrono": Label("@vendor_ts__chrono-0.4.42//:chrono"), - "clap": Label("@vendor_ts__clap-4.5.48//:clap"), + "chrono": Label("@vendor_ts__chrono-0.4.44//:chrono"), + "clap": Label("@vendor_ts__clap-4.6.0//:clap"), "dunce": Label("@vendor_ts__dunce-1.0.5//:dunce"), "figment": Label("@vendor_ts__figment-0.10.19//:figment"), "glob": Label("@vendor_ts__glob-0.3.3//:glob"), "itertools": Label("@vendor_ts__itertools-0.14.0//:itertools"), "mustache": Label("@vendor_ts__mustache-0.9.0//:mustache"), "num-traits": Label("@vendor_ts__num-traits-0.2.19//:num_traits"), - "ra_ap_base_db": Label("@vendor_ts__ra_ap_base_db-0.0.301//:ra_ap_base_db"), - "ra_ap_cfg": Label("@vendor_ts__ra_ap_cfg-0.0.301//:ra_ap_cfg"), - "ra_ap_hir": Label("@vendor_ts__ra_ap_hir-0.0.301//:ra_ap_hir"), - "ra_ap_hir_def": Label("@vendor_ts__ra_ap_hir_def-0.0.301//:ra_ap_hir_def"), - "ra_ap_hir_expand": Label("@vendor_ts__ra_ap_hir_expand-0.0.301//:ra_ap_hir_expand"), - "ra_ap_hir_ty": Label("@vendor_ts__ra_ap_hir_ty-0.0.301//:ra_ap_hir_ty"), - "ra_ap_ide_db": Label("@vendor_ts__ra_ap_ide_db-0.0.301//:ra_ap_ide_db"), - "ra_ap_intern": Label("@vendor_ts__ra_ap_intern-0.0.301//:ra_ap_intern"), - "ra_ap_load-cargo": Label("@vendor_ts__ra_ap_load-cargo-0.0.301//:ra_ap_load_cargo"), - "ra_ap_parser": Label("@vendor_ts__ra_ap_parser-0.0.301//:ra_ap_parser"), - "ra_ap_paths": Label("@vendor_ts__ra_ap_paths-0.0.301//:ra_ap_paths"), - "ra_ap_project_model": Label("@vendor_ts__ra_ap_project_model-0.0.301//:ra_ap_project_model"), - "ra_ap_span": Label("@vendor_ts__ra_ap_span-0.0.301//:ra_ap_span"), - "ra_ap_syntax": Label("@vendor_ts__ra_ap_syntax-0.0.301//:ra_ap_syntax"), - "ra_ap_vfs": Label("@vendor_ts__ra_ap_vfs-0.0.301//:ra_ap_vfs"), + "ra_ap_base_db": Label("@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db"), + "ra_ap_cfg": Label("@vendor_ts__ra_ap_cfg-0.0.328//:ra_ap_cfg"), + "ra_ap_hir": Label("@vendor_ts__ra_ap_hir-0.0.328//:ra_ap_hir"), + "ra_ap_hir_def": Label("@vendor_ts__ra_ap_hir_def-0.0.328//:ra_ap_hir_def"), + "ra_ap_hir_expand": Label("@vendor_ts__ra_ap_hir_expand-0.0.328//:ra_ap_hir_expand"), + "ra_ap_hir_ty": Label("@vendor_ts__ra_ap_hir_ty-0.0.328//:ra_ap_hir_ty"), + "ra_ap_ide_db": Label("@vendor_ts__ra_ap_ide_db-0.0.328//:ra_ap_ide_db"), + "ra_ap_intern": Label("@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern"), + "ra_ap_load-cargo": Label("@vendor_ts__ra_ap_load-cargo-0.0.328//:ra_ap_load_cargo"), + "ra_ap_parser": Label("@vendor_ts__ra_ap_parser-0.0.328//:ra_ap_parser"), + "ra_ap_paths": Label("@vendor_ts__ra_ap_paths-0.0.328//:ra_ap_paths"), + "ra_ap_project_model": Label("@vendor_ts__ra_ap_project_model-0.0.328//:ra_ap_project_model"), + "ra_ap_span": Label("@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span"), + "ra_ap_syntax": Label("@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax"), + "ra_ap_vfs": Label("@vendor_ts__ra_ap_vfs-0.0.328//:ra_ap_vfs"), "serde": Label("@vendor_ts__serde-1.0.228//:serde"), - "serde_json": Label("@vendor_ts__serde_json-1.0.145//:serde_json"), - "serde_with": Label("@vendor_ts__serde_with-3.14.1//:serde_with"), - "toml": Label("@vendor_ts__toml-0.9.7//:toml"), - "tracing": Label("@vendor_ts__tracing-0.1.41//:tracing"), + "serde_json": Label("@vendor_ts__serde_json-1.0.149//:serde_json"), + "serde_with": Label("@vendor_ts__serde_with-3.18.0//:serde_with"), + "toml": Label("@vendor_ts__toml-1.1.2-spec-1.1.0//:toml"), + "tracing": Label("@vendor_ts__tracing-0.1.44//:tracing"), "tracing-flame": Label("@vendor_ts__tracing-flame-0.2.0//:tracing_flame"), - "tracing-subscriber": Label("@vendor_ts__tracing-subscriber-0.3.20//:tracing_subscriber"), - "triomphe": Label("@vendor_ts__triomphe-0.1.14//:triomphe"), + "tracing-subscriber": Label("@vendor_ts__tracing-subscriber-0.3.23//:tracing_subscriber"), + "triomphe": Label("@vendor_ts__triomphe-0.1.15//:triomphe"), }, }, "rust/extractor/macros": { _COMMON_CONDITION: { - "quote": Label("@vendor_ts__quote-1.0.41//:quote"), - "syn": Label("@vendor_ts__syn-2.0.106//:syn"), + "quote": Label("@vendor_ts__quote-1.0.45//:quote"), + "syn": Label("@vendor_ts__syn-2.0.117//:syn"), }, }, "shared/tree-sitter-extractor": { _COMMON_CONDITION: { - "chrono": Label("@vendor_ts__chrono-0.4.42//:chrono"), + "chrono": Label("@vendor_ts__chrono-0.4.44//:chrono"), "encoding": Label("@vendor_ts__encoding-0.2.33//:encoding"), "flate2": Label("@vendor_ts__flate2-1.1.2//:flate2"), "globset": Label("@vendor_ts__globset-0.4.16//:globset"), "lazy_static": Label("@vendor_ts__lazy_static-1.5.0//:lazy_static"), "num_cpus": Label("@vendor_ts__num_cpus-1.17.0//:num_cpus"), - "rayon": Label("@vendor_ts__rayon-1.11.0//:rayon"), - "regex": Label("@vendor_ts__regex-1.11.3//:regex"), + "rayon": Label("@vendor_ts__rayon-1.12.0//:rayon"), + "regex": Label("@vendor_ts__regex-1.12.3//:regex"), "serde": Label("@vendor_ts__serde-1.0.228//:serde"), - "serde_json": Label("@vendor_ts__serde_json-1.0.145//:serde_json"), - "tracing": Label("@vendor_ts__tracing-0.1.41//:tracing"), - "tracing-subscriber": Label("@vendor_ts__tracing-subscriber-0.3.20//:tracing_subscriber"), + "serde_json": Label("@vendor_ts__serde_json-1.0.149//:serde_json"), + "tracing": Label("@vendor_ts__tracing-0.1.44//:tracing"), + "tracing-subscriber": Label("@vendor_ts__tracing-subscriber-0.3.23//:tracing_subscriber"), "tree-sitter": Label("@vendor_ts__tree-sitter-0.25.9//:tree_sitter"), "zstd": Label("@vendor_ts__zstd-0.13.3//:zstd"), }, @@ -394,7 +394,7 @@ _NORMAL_ALIASES = { }, "rust/ast-generator": { _COMMON_CONDITION: { - Label("@vendor_ts__ra_ap_stdx-0.0.301//:ra_ap_stdx"): "stdx", + Label("@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx"): "stdx", }, }, "rust/autobuild": { @@ -426,7 +426,7 @@ _NORMAL_DEV_DEPENDENCIES = { }, "shared/tree-sitter-extractor": { _COMMON_CONDITION: { - "rand": Label("@vendor_ts__rand-0.9.2//:rand"), + "rand": Label("@vendor_ts__rand-0.10.1//:rand"), "tree-sitter-json": Label("@vendor_ts__tree-sitter-json-0.24.8//:tree_sitter_json"), "tree-sitter-ql": Label("@vendor_ts__tree-sitter-ql-0.23.1//:tree_sitter_ql"), }, @@ -591,23 +591,33 @@ _CONDITIONS = { "cfg(all(any(target_arch = \"x86_64\", target_arch = \"arm64ec\"), target_env = \"msvc\", not(windows_raw_dylib)))": ["@rules_rust//rust/platform:x86_64-pc-windows-msvc"], "cfg(all(any(target_os = \"linux\", target_os = \"android\"), not(any(all(target_os = \"linux\", target_env = \"\"), getrandom_backend = \"custom\", getrandom_backend = \"linux_raw\", getrandom_backend = \"rdrand\", getrandom_backend = \"rndr\"))))": ["@rules_rust//rust/platform:aarch64-linux-android", "@rules_rust//rust/platform:aarch64-unknown-linux-gnu", "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu", "@rules_rust//rust/platform:arm-unknown-linux-gnueabi", "@rules_rust//rust/platform:arm-unknown-linux-musleabi", "@rules_rust//rust/platform:armv7-linux-androideabi", "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi", "@rules_rust//rust/platform:i686-linux-android", "@rules_rust//rust/platform:i686-unknown-linux-gnu", "@rules_rust//rust/platform:powerpc-unknown-linux-gnu", "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu", "@rules_rust//rust/platform:s390x-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-linux-android", "@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], "cfg(all(target_arch = \"aarch64\", target_env = \"msvc\", not(windows_raw_dylib)))": ["@rules_rust//rust/platform:aarch64-pc-windows-msvc"], + "cfg(all(target_arch = \"aarch64\", target_os = \"android\"))": ["@rules_rust//rust/platform:aarch64-linux-android"], + "cfg(all(target_arch = \"aarch64\", target_os = \"linux\"))": ["@rules_rust//rust/platform:aarch64-unknown-linux-gnu", "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu"], + "cfg(all(target_arch = \"aarch64\", target_vendor = \"apple\"))": ["@rules_rust//rust/platform:aarch64-apple-darwin", "@rules_rust//rust/platform:aarch64-apple-ios", "@rules_rust//rust/platform:aarch64-apple-ios-sim"], + "cfg(all(target_arch = \"loongarch64\", target_os = \"linux\"))": [], "cfg(all(target_arch = \"wasm32\", target_os = \"unknown\"))": ["@rules_rust//rust/platform:wasm32-unknown-unknown"], "cfg(all(target_arch = \"wasm32\", target_os = \"wasi\", target_env = \"p2\"))": ["@rules_rust//rust/platform:wasm32-wasip2"], + "cfg(all(target_arch = \"wasm32\", target_os = \"wasi\", target_env = \"p3\"))": [], "cfg(all(target_arch = \"x86\", target_env = \"gnu\", not(target_abi = \"llvm\"), not(windows_raw_dylib)))": ["@rules_rust//rust/platform:i686-unknown-linux-gnu"], "cfg(all(target_arch = \"x86\", target_env = \"msvc\", not(windows_raw_dylib)))": ["@rules_rust//rust/platform:i686-pc-windows-msvc"], "cfg(all(target_arch = \"x86_64\", target_env = \"gnu\", not(target_abi = \"llvm\"), not(windows_raw_dylib)))": ["@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], - "cfg(all(target_os = \"linux\", not(target_env = \"ohos\")))": ["@rules_rust//rust/platform:aarch64-unknown-linux-gnu", "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu", "@rules_rust//rust/platform:arm-unknown-linux-gnueabi", "@rules_rust//rust/platform:arm-unknown-linux-musleabi", "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi", "@rules_rust//rust/platform:i686-unknown-linux-gnu", "@rules_rust//rust/platform:powerpc-unknown-linux-gnu", "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu", "@rules_rust//rust/platform:s390x-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], + "cfg(all(target_os = \"linux\", not(target_env = \"ohos\"), any(target_arch = \"x86\", target_arch = \"x86_64\", target_arch = \"aarch64\")))": ["@rules_rust//rust/platform:aarch64-unknown-linux-gnu", "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu", "@rules_rust//rust/platform:i686-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], "cfg(all(target_os = \"linux\", target_env = \"gnu\"))": ["@rules_rust//rust/platform:aarch64-unknown-linux-gnu", "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu", "@rules_rust//rust/platform:arm-unknown-linux-gnueabi", "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi", "@rules_rust//rust/platform:i686-unknown-linux-gnu", "@rules_rust//rust/platform:powerpc-unknown-linux-gnu", "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu", "@rules_rust//rust/platform:s390x-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], "cfg(all(target_os = \"uefi\", getrandom_backend = \"efi_rng\"))": [], "cfg(any())": [], + "cfg(any(target_arch = \"x86_64\", target_arch = \"x86\"))": ["@rules_rust//rust/platform:i686-apple-darwin", "@rules_rust//rust/platform:i686-linux-android", "@rules_rust//rust/platform:i686-pc-windows-msvc", "@rules_rust//rust/platform:i686-unknown-freebsd", "@rules_rust//rust/platform:i686-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-apple-darwin", "@rules_rust//rust/platform:x86_64-apple-ios", "@rules_rust//rust/platform:x86_64-linux-android", "@rules_rust//rust/platform:x86_64-pc-windows-msvc", "@rules_rust//rust/platform:x86_64-unknown-freebsd", "@rules_rust//rust/platform:x86_64-unknown-fuchsia", "@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu", "@rules_rust//rust/platform:x86_64-unknown-none", "@rules_rust//rust/platform:x86_64-unknown-uefi"], "cfg(any(target_os = \"dragonfly\", target_os = \"freebsd\", target_os = \"hurd\", target_os = \"illumos\", target_os = \"cygwin\", all(target_os = \"horizon\", target_arch = \"arm\")))": ["@rules_rust//rust/platform:i686-unknown-freebsd", "@rules_rust//rust/platform:x86_64-unknown-freebsd"], "cfg(any(target_os = \"freebsd\", target_os = \"openbsd\", target_os = \"netbsd\", target_os = \"dragonflybsd\", target_os = \"ios\"))": ["@rules_rust//rust/platform:aarch64-apple-ios", "@rules_rust//rust/platform:aarch64-apple-ios-sim", "@rules_rust//rust/platform:i686-unknown-freebsd", "@rules_rust//rust/platform:x86_64-apple-ios", "@rules_rust//rust/platform:x86_64-unknown-freebsd"], "cfg(any(target_os = \"haiku\", target_os = \"redox\", target_os = \"nto\", target_os = \"aix\"))": ["@rules_rust//rust/platform:aarch64-unknown-nto-qnx710"], "cfg(any(target_os = \"ios\", target_os = \"visionos\", target_os = \"watchos\", target_os = \"tvos\"))": ["@rules_rust//rust/platform:aarch64-apple-ios", "@rules_rust//rust/platform:aarch64-apple-ios-sim", "@rules_rust//rust/platform:x86_64-apple-ios"], "cfg(any(target_os = \"linux\", target_os = \"android\"))": ["@rules_rust//rust/platform:aarch64-linux-android", "@rules_rust//rust/platform:aarch64-unknown-linux-gnu", "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu", "@rules_rust//rust/platform:arm-unknown-linux-gnueabi", "@rules_rust//rust/platform:arm-unknown-linux-musleabi", "@rules_rust//rust/platform:armv7-linux-androideabi", "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi", "@rules_rust//rust/platform:i686-linux-android", "@rules_rust//rust/platform:i686-unknown-linux-gnu", "@rules_rust//rust/platform:powerpc-unknown-linux-gnu", "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu", "@rules_rust//rust/platform:s390x-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-linux-android", "@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], + "cfg(any(target_os = \"macos\", target_os = \"ios\", target_os = \"freebsd\"))": ["@rules_rust//rust/platform:aarch64-apple-darwin", "@rules_rust//rust/platform:aarch64-apple-ios", "@rules_rust//rust/platform:aarch64-apple-ios-sim", "@rules_rust//rust/platform:i686-apple-darwin", "@rules_rust//rust/platform:i686-unknown-freebsd", "@rules_rust//rust/platform:x86_64-apple-darwin", "@rules_rust//rust/platform:x86_64-apple-ios", "@rules_rust//rust/platform:x86_64-unknown-freebsd"], "cfg(any(target_os = \"macos\", target_os = \"openbsd\", target_os = \"vita\", target_os = \"emscripten\"))": ["@rules_rust//rust/platform:aarch64-apple-darwin", "@rules_rust//rust/platform:i686-apple-darwin", "@rules_rust//rust/platform:wasm32-unknown-emscripten", "@rules_rust//rust/platform:x86_64-apple-darwin"], "cfg(any(target_pointer_width = \"8\", target_pointer_width = \"16\", target_pointer_width = \"32\"))": ["@rules_rust//rust/platform:arm-unknown-linux-gnueabi", "@rules_rust//rust/platform:arm-unknown-linux-musleabi", "@rules_rust//rust/platform:armv7-linux-androideabi", "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi", "@rules_rust//rust/platform:i686-apple-darwin", "@rules_rust//rust/platform:i686-linux-android", "@rules_rust//rust/platform:i686-pc-windows-msvc", "@rules_rust//rust/platform:i686-unknown-freebsd", "@rules_rust//rust/platform:i686-unknown-linux-gnu", "@rules_rust//rust/platform:powerpc-unknown-linux-gnu", "@rules_rust//rust/platform:riscv32imc-unknown-none-elf", "@rules_rust//rust/platform:thumbv7em-none-eabi", "@rules_rust//rust/platform:thumbv8m.main-none-eabi", "@rules_rust//rust/platform:wasm32-unknown-emscripten", "@rules_rust//rust/platform:wasm32-unknown-unknown", "@rules_rust//rust/platform:wasm32-wasip1", "@rules_rust//rust/platform:wasm32-wasip1-threads", "@rules_rust//rust/platform:wasm32-wasip2"], + "cfg(any(unix, target_os = \"hermit\", target_os = \"wasi\"))": ["@rules_rust//rust/platform:aarch64-apple-darwin", "@rules_rust//rust/platform:aarch64-apple-ios", "@rules_rust//rust/platform:aarch64-apple-ios-sim", "@rules_rust//rust/platform:aarch64-linux-android", "@rules_rust//rust/platform:aarch64-unknown-fuchsia", "@rules_rust//rust/platform:aarch64-unknown-linux-gnu", "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu", "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710", "@rules_rust//rust/platform:arm-unknown-linux-gnueabi", "@rules_rust//rust/platform:arm-unknown-linux-musleabi", "@rules_rust//rust/platform:armv7-linux-androideabi", "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi", "@rules_rust//rust/platform:i686-apple-darwin", "@rules_rust//rust/platform:i686-linux-android", "@rules_rust//rust/platform:i686-unknown-freebsd", "@rules_rust//rust/platform:i686-unknown-linux-gnu", "@rules_rust//rust/platform:powerpc-unknown-linux-gnu", "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu", "@rules_rust//rust/platform:s390x-unknown-linux-gnu", "@rules_rust//rust/platform:wasm32-unknown-emscripten", "@rules_rust//rust/platform:wasm32-wasip1", "@rules_rust//rust/platform:wasm32-wasip1-threads", "@rules_rust//rust/platform:wasm32-wasip2", "@rules_rust//rust/platform:x86_64-apple-darwin", "@rules_rust//rust/platform:x86_64-apple-ios", "@rules_rust//rust/platform:x86_64-linux-android", "@rules_rust//rust/platform:x86_64-unknown-freebsd", "@rules_rust//rust/platform:x86_64-unknown-fuchsia", "@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], "cfg(not(windows))": ["@rules_rust//rust/platform:aarch64-apple-darwin", "@rules_rust//rust/platform:aarch64-apple-ios", "@rules_rust//rust/platform:aarch64-apple-ios-sim", "@rules_rust//rust/platform:aarch64-linux-android", "@rules_rust//rust/platform:aarch64-unknown-fuchsia", "@rules_rust//rust/platform:aarch64-unknown-linux-gnu", "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu", "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710", "@rules_rust//rust/platform:aarch64-unknown-uefi", "@rules_rust//rust/platform:arm-unknown-linux-gnueabi", "@rules_rust//rust/platform:arm-unknown-linux-musleabi", "@rules_rust//rust/platform:armv7-linux-androideabi", "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi", "@rules_rust//rust/platform:i686-apple-darwin", "@rules_rust//rust/platform:i686-linux-android", "@rules_rust//rust/platform:i686-unknown-freebsd", "@rules_rust//rust/platform:i686-unknown-linux-gnu", "@rules_rust//rust/platform:powerpc-unknown-linux-gnu", "@rules_rust//rust/platform:riscv32imc-unknown-none-elf", "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu", "@rules_rust//rust/platform:riscv64gc-unknown-none-elf", "@rules_rust//rust/platform:s390x-unknown-linux-gnu", "@rules_rust//rust/platform:thumbv7em-none-eabi", "@rules_rust//rust/platform:thumbv8m.main-none-eabi", "@rules_rust//rust/platform:wasm32-unknown-emscripten", "@rules_rust//rust/platform:wasm32-unknown-unknown", "@rules_rust//rust/platform:wasm32-wasip1", "@rules_rust//rust/platform:wasm32-wasip1-threads", "@rules_rust//rust/platform:wasm32-wasip2", "@rules_rust//rust/platform:x86_64-apple-darwin", "@rules_rust//rust/platform:x86_64-apple-ios", "@rules_rust//rust/platform:x86_64-linux-android", "@rules_rust//rust/platform:x86_64-unknown-freebsd", "@rules_rust//rust/platform:x86_64-unknown-fuchsia", "@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu", "@rules_rust//rust/platform:x86_64-unknown-none", "@rules_rust//rust/platform:x86_64-unknown-uefi"], + "cfg(target_arch = \"x86_64\")": ["@rules_rust//rust/platform:x86_64-apple-darwin", "@rules_rust//rust/platform:x86_64-apple-ios", "@rules_rust//rust/platform:x86_64-linux-android", "@rules_rust//rust/platform:x86_64-pc-windows-msvc", "@rules_rust//rust/platform:x86_64-unknown-freebsd", "@rules_rust//rust/platform:x86_64-unknown-fuchsia", "@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu", "@rules_rust//rust/platform:x86_64-unknown-none", "@rules_rust//rust/platform:x86_64-unknown-uefi"], + "cfg(target_family = \"wasm\")": ["@rules_rust//rust/platform:wasm32-unknown-emscripten", "@rules_rust//rust/platform:wasm32-unknown-unknown", "@rules_rust//rust/platform:wasm32-wasip1", "@rules_rust//rust/platform:wasm32-wasip1-threads", "@rules_rust//rust/platform:wasm32-wasip2"], "cfg(target_os = \"android\")": ["@rules_rust//rust/platform:aarch64-linux-android", "@rules_rust//rust/platform:armv7-linux-androideabi", "@rules_rust//rust/platform:i686-linux-android", "@rules_rust//rust/platform:x86_64-linux-android"], "cfg(target_os = \"haiku\")": [], "cfg(target_os = \"hermit\")": [], @@ -629,6 +639,7 @@ _CONDITIONS = { "i686-unknown-freebsd": ["@rules_rust//rust/platform:i686-unknown-freebsd"], "i686-unknown-linux-gnu": ["@rules_rust//rust/platform:i686-unknown-linux-gnu"], "powerpc-unknown-linux-gnu": ["@rules_rust//rust/platform:powerpc-unknown-linux-gnu"], + "riscv32i-unknown-none-elf": [], "riscv32imc-unknown-none-elf": ["@rules_rust//rust/platform:riscv32imc-unknown-none-elf"], "riscv64gc-unknown-linux-gnu": ["@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu"], "riscv64gc-unknown-none-elf": ["@rules_rust//rust/platform:riscv64gc-unknown-none-elf"], @@ -651,6 +662,7 @@ _CONDITIONS = { "x86_64-unknown-nixos-gnu": ["@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], "x86_64-unknown-none": ["@rules_rust//rust/platform:x86_64-unknown-none"], "x86_64-unknown-uefi": ["@rules_rust//rust/platform:x86_64-unknown-uefi"], + "xtensa-esp32s2-none-elf": [], } ############################################################################### @@ -673,12 +685,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__aho-corasick-1.1.3", - sha256 = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916", + name = "vendor_ts__aho-corasick-1.1.4", + sha256 = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301", type = "tar.gz", - urls = ["https://static.crates.io/crates/aho-corasick/1.1.3/download"], - strip_prefix = "aho-corasick-1.1.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.aho-corasick-1.1.3.bazel"), + urls = ["https://static.crates.io/crates/aho-corasick/1.1.4/download"], + strip_prefix = "aho-corasick-1.1.4", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.aho-corasick-1.1.4.bazel"), ) maybe( @@ -703,42 +715,42 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__anstream-0.6.20", - sha256 = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192", + name = "vendor_ts__anstream-1.0.0", + sha256 = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d", type = "tar.gz", - urls = ["https://static.crates.io/crates/anstream/0.6.20/download"], - strip_prefix = "anstream-0.6.20", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.anstream-0.6.20.bazel"), + urls = ["https://static.crates.io/crates/anstream/1.0.0/download"], + strip_prefix = "anstream-1.0.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.anstream-1.0.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__anstyle-1.0.11", - sha256 = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd", + name = "vendor_ts__anstyle-1.0.14", + sha256 = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000", type = "tar.gz", - urls = ["https://static.crates.io/crates/anstyle/1.0.11/download"], - strip_prefix = "anstyle-1.0.11", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.anstyle-1.0.11.bazel"), + urls = ["https://static.crates.io/crates/anstyle/1.0.14/download"], + strip_prefix = "anstyle-1.0.14", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.anstyle-1.0.14.bazel"), ) maybe( http_archive, - name = "vendor_ts__anstyle-parse-0.2.7", - sha256 = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2", + name = "vendor_ts__anstyle-parse-1.0.0", + sha256 = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e", type = "tar.gz", - urls = ["https://static.crates.io/crates/anstyle-parse/0.2.7/download"], - strip_prefix = "anstyle-parse-0.2.7", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.anstyle-parse-0.2.7.bazel"), + urls = ["https://static.crates.io/crates/anstyle-parse/1.0.0/download"], + strip_prefix = "anstyle-parse-1.0.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.anstyle-parse-1.0.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__anstyle-query-1.1.4", - sha256 = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2", + name = "vendor_ts__anstyle-query-1.1.5", + sha256 = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc", type = "tar.gz", - urls = ["https://static.crates.io/crates/anstyle-query/1.1.4/download"], - strip_prefix = "anstyle-query-1.1.4", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.anstyle-query-1.1.4.bazel"), + urls = ["https://static.crates.io/crates/anstyle-query/1.1.5/download"], + strip_prefix = "anstyle-query-1.1.5", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.anstyle-query-1.1.5.bazel"), ) maybe( @@ -753,22 +765,22 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__anyhow-1.0.100", - sha256 = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61", + name = "vendor_ts__anyhow-1.0.102", + sha256 = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c", type = "tar.gz", - urls = ["https://static.crates.io/crates/anyhow/1.0.100/download"], - strip_prefix = "anyhow-1.0.100", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.anyhow-1.0.100.bazel"), + urls = ["https://static.crates.io/crates/anyhow/1.0.102/download"], + strip_prefix = "anyhow-1.0.102", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.anyhow-1.0.102.bazel"), ) maybe( http_archive, - name = "vendor_ts__argfile-0.2.1", - sha256 = "0a1cc0ba69de57db40674c66f7cf2caee3981ddef084388482c95c0e2133e5e8", + name = "vendor_ts__argfile-1.0.0", + sha256 = "99489a733dea0d2930bfa59c243146a8513ce7b0991b9d006647687cc61f53e7", type = "tar.gz", - urls = ["https://static.crates.io/crates/argfile/0.2.1/download"], - strip_prefix = "argfile-0.2.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.argfile-0.2.1.bazel"), + urls = ["https://static.crates.io/crates/argfile/1.0.0/download"], + strip_prefix = "argfile-1.0.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.argfile-1.0.0.bazel"), ) maybe( @@ -791,6 +803,16 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.atomic-0.6.1.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__atomic-polyfill-1.0.3", + sha256 = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4", + type = "tar.gz", + urls = ["https://static.crates.io/crates/atomic-polyfill/1.0.3/download"], + strip_prefix = "atomic-polyfill-1.0.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.atomic-polyfill-1.0.3.bazel"), + ) + maybe( http_archive, name = "vendor_ts__autocfg-1.5.0", @@ -823,22 +845,22 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__bitflags-2.9.4", - sha256 = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394", + name = "vendor_ts__bitflags-2.11.1", + sha256 = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3", type = "tar.gz", - urls = ["https://static.crates.io/crates/bitflags/2.9.4/download"], - strip_prefix = "bitflags-2.9.4", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.bitflags-2.9.4.bazel"), + urls = ["https://static.crates.io/crates/bitflags/2.11.1/download"], + strip_prefix = "bitflags-2.11.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.bitflags-2.11.1.bazel"), ) maybe( http_archive, - name = "vendor_ts__borsh-1.5.7", - sha256 = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce", + name = "vendor_ts__borsh-1.6.1", + sha256 = "cfd1e3f8955a5d7de9fab72fc8373fade9fb8a703968cb200ae3dc6cf08e185a", type = "tar.gz", - urls = ["https://static.crates.io/crates/borsh/1.5.7/download"], - strip_prefix = "borsh-1.5.7", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.borsh-1.5.7.bazel"), + urls = ["https://static.crates.io/crates/borsh/1.6.1/download"], + strip_prefix = "borsh-1.6.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.borsh-1.6.1.bazel"), ) maybe( @@ -883,62 +905,72 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__camino-1.1.12", - sha256 = "dd0b03af37dad7a14518b7691d81acb0f8222604ad3d1b02f6b4bed5188c0cd5", + name = "vendor_ts__byteorder-1.5.0", + sha256 = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b", + type = "tar.gz", + urls = ["https://static.crates.io/crates/byteorder/1.5.0/download"], + strip_prefix = "byteorder-1.5.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.byteorder-1.5.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__bytes-1.11.1", + sha256 = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33", type = "tar.gz", - urls = ["https://static.crates.io/crates/camino/1.1.12/download"], - strip_prefix = "camino-1.1.12", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.camino-1.1.12.bazel"), + urls = ["https://static.crates.io/crates/bytes/1.11.1/download"], + strip_prefix = "bytes-1.11.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.bytes-1.11.1.bazel"), ) maybe( http_archive, - name = "vendor_ts__cargo-platform-0.2.0", - sha256 = "84982c6c0ae343635a3a4ee6dedef965513735c8b183caa7289fa6e27399ebd4", + name = "vendor_ts__camino-1.2.2", + sha256 = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48", type = "tar.gz", - urls = ["https://static.crates.io/crates/cargo-platform/0.2.0/download"], - strip_prefix = "cargo-platform-0.2.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cargo-platform-0.2.0.bazel"), + urls = ["https://static.crates.io/crates/camino/1.2.2/download"], + strip_prefix = "camino-1.2.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.camino-1.2.2.bazel"), ) maybe( http_archive, - name = "vendor_ts__cargo-util-schemas-0.8.2", - sha256 = "7dc1a6f7b5651af85774ae5a34b4e8be397d9cf4bc063b7e6dbd99a841837830", + name = "vendor_ts__cargo-platform-0.3.2", + sha256 = "87a0c0e6148f11f01f32650a2ea02d532b2ad4e81d8bd41e6e565b5adc5e6082", type = "tar.gz", - urls = ["https://static.crates.io/crates/cargo-util-schemas/0.8.2/download"], - strip_prefix = "cargo-util-schemas-0.8.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cargo-util-schemas-0.8.2.bazel"), + urls = ["https://static.crates.io/crates/cargo-platform/0.3.2/download"], + strip_prefix = "cargo-platform-0.3.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cargo-platform-0.3.2.bazel"), ) maybe( http_archive, - name = "vendor_ts__cargo_metadata-0.21.0", - sha256 = "5cfca2aaa699835ba88faf58a06342a314a950d2b9686165e038286c30316868", + name = "vendor_ts__cargo_metadata-0.23.1", + sha256 = "ef987d17b0a113becdd19d3d0022d04d7ef41f9efe4f3fb63ac44ba61df3ade9", type = "tar.gz", - urls = ["https://static.crates.io/crates/cargo_metadata/0.21.0/download"], - strip_prefix = "cargo_metadata-0.21.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cargo_metadata-0.21.0.bazel"), + urls = ["https://static.crates.io/crates/cargo_metadata/0.23.1/download"], + strip_prefix = "cargo_metadata-0.23.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cargo_metadata-0.23.1.bazel"), ) maybe( http_archive, - name = "vendor_ts__cc-1.2.37", - sha256 = "65193589c6404eb80b450d618eaf9a2cafaaafd57ecce47370519ef674a7bd44", + name = "vendor_ts__cc-1.2.60", + sha256 = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20", type = "tar.gz", - urls = ["https://static.crates.io/crates/cc/1.2.37/download"], - strip_prefix = "cc-1.2.37", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cc-1.2.37.bazel"), + urls = ["https://static.crates.io/crates/cc/1.2.60/download"], + strip_prefix = "cc-1.2.60", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cc-1.2.60.bazel"), ) maybe( http_archive, - name = "vendor_ts__cfg-if-1.0.3", - sha256 = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9", + name = "vendor_ts__cfg-if-1.0.4", + sha256 = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801", type = "tar.gz", - urls = ["https://static.crates.io/crates/cfg-if/1.0.3/download"], - strip_prefix = "cfg-if-1.0.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cfg-if-1.0.3.bazel"), + urls = ["https://static.crates.io/crates/cfg-if/1.0.4/download"], + strip_prefix = "cfg-if-1.0.4", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cfg-if-1.0.4.bazel"), ) maybe( @@ -953,12 +985,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__chalk-derive-0.103.0", - sha256 = "eb4899682de915ca7c0b025bdd0a3d34c75fe12184122fda6805a7baddaa293c", + name = "vendor_ts__chacha20-0.10.0", + sha256 = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601", type = "tar.gz", - urls = ["https://static.crates.io/crates/chalk-derive/0.103.0/download"], - strip_prefix = "chalk-derive-0.103.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.chalk-derive-0.103.0.bazel"), + urls = ["https://static.crates.io/crates/chacha20/0.10.0/download"], + strip_prefix = "chacha20-0.10.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.chacha20-0.10.0.bazel"), ) maybe( @@ -971,16 +1003,6 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.chalk-derive-0.104.0.bazel"), ) - maybe( - http_archive, - name = "vendor_ts__chalk-ir-0.103.0", - sha256 = "90a37d2ab99352b4caca135061e7b4ac67024b648c28ed0b787feec4bea4caed", - type = "tar.gz", - urls = ["https://static.crates.io/crates/chalk-ir/0.103.0/download"], - strip_prefix = "chalk-ir-0.103.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.chalk-ir-0.103.0.bazel"), - ) - maybe( http_archive, name = "vendor_ts__chalk-ir-0.104.0", @@ -993,82 +1015,72 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__chalk-recursive-0.103.0", - sha256 = "c855be60e646664bc37c2496d3dc81ca5ef60520930e5e0f0057a0575aff6c19", - type = "tar.gz", - urls = ["https://static.crates.io/crates/chalk-recursive/0.103.0/download"], - strip_prefix = "chalk-recursive-0.103.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.chalk-recursive-0.103.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__chalk-solve-0.103.0", - sha256 = "477ac6cdfd2013e9f93b09b036c2b607a67b2e728f4777b8422d55a79e9e3a34", + name = "vendor_ts__chrono-0.4.44", + sha256 = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0", type = "tar.gz", - urls = ["https://static.crates.io/crates/chalk-solve/0.103.0/download"], - strip_prefix = "chalk-solve-0.103.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.chalk-solve-0.103.0.bazel"), + urls = ["https://static.crates.io/crates/chrono/0.4.44/download"], + strip_prefix = "chrono-0.4.44", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.chrono-0.4.44.bazel"), ) maybe( http_archive, - name = "vendor_ts__chrono-0.4.42", - sha256 = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2", + name = "vendor_ts__clap-4.6.0", + sha256 = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351", type = "tar.gz", - urls = ["https://static.crates.io/crates/chrono/0.4.42/download"], - strip_prefix = "chrono-0.4.42", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.chrono-0.4.42.bazel"), + urls = ["https://static.crates.io/crates/clap/4.6.0/download"], + strip_prefix = "clap-4.6.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.clap-4.6.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__clap-4.5.48", - sha256 = "e2134bb3ea021b78629caa971416385309e0131b351b25e01dc16fb54e1b5fae", + name = "vendor_ts__clap_builder-4.6.0", + sha256 = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f", type = "tar.gz", - urls = ["https://static.crates.io/crates/clap/4.5.48/download"], - strip_prefix = "clap-4.5.48", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.clap-4.5.48.bazel"), + urls = ["https://static.crates.io/crates/clap_builder/4.6.0/download"], + strip_prefix = "clap_builder-4.6.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.clap_builder-4.6.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__clap_builder-4.5.48", - sha256 = "c2ba64afa3c0a6df7fa517765e31314e983f51dda798ffba27b988194fb65dc9", + name = "vendor_ts__clap_derive-4.6.0", + sha256 = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a", type = "tar.gz", - urls = ["https://static.crates.io/crates/clap_builder/4.5.48/download"], - strip_prefix = "clap_builder-4.5.48", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.clap_builder-4.5.48.bazel"), + urls = ["https://static.crates.io/crates/clap_derive/4.6.0/download"], + strip_prefix = "clap_derive-4.6.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.clap_derive-4.6.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__clap_derive-4.5.47", - sha256 = "bbfd7eae0b0f1a6e63d4b13c9c478de77c2eb546fba158ad50b4203dc24b9f9c", + name = "vendor_ts__clap_lex-1.1.0", + sha256 = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9", type = "tar.gz", - urls = ["https://static.crates.io/crates/clap_derive/4.5.47/download"], - strip_prefix = "clap_derive-4.5.47", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.clap_derive-4.5.47.bazel"), + urls = ["https://static.crates.io/crates/clap_lex/1.1.0/download"], + strip_prefix = "clap_lex-1.1.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.clap_lex-1.1.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__clap_lex-0.7.5", - sha256 = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675", + name = "vendor_ts__cobs-0.3.0", + sha256 = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1", type = "tar.gz", - urls = ["https://static.crates.io/crates/clap_lex/0.7.5/download"], - strip_prefix = "clap_lex-0.7.5", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.clap_lex-0.7.5.bazel"), + urls = ["https://static.crates.io/crates/cobs/0.3.0/download"], + strip_prefix = "cobs-0.3.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cobs-0.3.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__colorchoice-1.0.4", - sha256 = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75", + name = "vendor_ts__colorchoice-1.0.5", + sha256 = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570", type = "tar.gz", - urls = ["https://static.crates.io/crates/colorchoice/1.0.4/download"], - strip_prefix = "colorchoice-1.0.4", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.colorchoice-1.0.4.bazel"), + urls = ["https://static.crates.io/crates/colorchoice/1.0.5/download"], + strip_prefix = "colorchoice-1.0.5", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.colorchoice-1.0.5.bazel"), ) maybe( @@ -1101,6 +1113,16 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cov-mark-2.1.0.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__cpufeatures-0.3.0", + sha256 = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201", + type = "tar.gz", + urls = ["https://static.crates.io/crates/cpufeatures/0.3.0/download"], + strip_prefix = "cpufeatures-0.3.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cpufeatures-0.3.0.bazel"), + ) + maybe( http_archive, name = "vendor_ts__crc32fast-1.5.0", @@ -1111,6 +1133,16 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.crc32fast-1.5.0.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__critical-section-1.2.0", + sha256 = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b", + type = "tar.gz", + urls = ["https://static.crates.io/crates/critical-section/1.2.0/download"], + strip_prefix = "critical-section-1.2.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.critical-section-1.2.0.bazel"), + ) + maybe( http_archive, name = "vendor_ts__crossbeam-channel-0.5.15", @@ -1163,32 +1195,32 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__darling-0.21.3", - sha256 = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0", + name = "vendor_ts__darling-0.23.0", + sha256 = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d", type = "tar.gz", - urls = ["https://static.crates.io/crates/darling/0.21.3/download"], - strip_prefix = "darling-0.21.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.darling-0.21.3.bazel"), + urls = ["https://static.crates.io/crates/darling/0.23.0/download"], + strip_prefix = "darling-0.23.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.darling-0.23.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__darling_core-0.21.3", - sha256 = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4", + name = "vendor_ts__darling_core-0.23.0", + sha256 = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0", type = "tar.gz", - urls = ["https://static.crates.io/crates/darling_core/0.21.3/download"], - strip_prefix = "darling_core-0.21.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.darling_core-0.21.3.bazel"), + urls = ["https://static.crates.io/crates/darling_core/0.23.0/download"], + strip_prefix = "darling_core-0.23.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.darling_core-0.23.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__darling_macro-0.21.3", - sha256 = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81", + name = "vendor_ts__darling_macro-0.23.0", + sha256 = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d", type = "tar.gz", - urls = ["https://static.crates.io/crates/darling_macro/0.21.3/download"], - strip_prefix = "darling_macro-0.21.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.darling_macro-0.21.3.bazel"), + urls = ["https://static.crates.io/crates/darling_macro/0.23.0/download"], + strip_prefix = "darling_macro-0.23.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.darling_macro-0.23.0.bazel"), ) maybe( @@ -1213,12 +1245,22 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__displaydoc-0.2.5", - sha256 = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0", + name = "vendor_ts__derive-where-1.6.1", + sha256 = "d08b3a0bcc0d079199cd476b2cae8435016ec11d1c0986c6901c5ac223041534", type = "tar.gz", - urls = ["https://static.crates.io/crates/displaydoc/0.2.5/download"], - strip_prefix = "displaydoc-0.2.5", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.displaydoc-0.2.5.bazel"), + urls = ["https://static.crates.io/crates/derive-where/1.6.1/download"], + strip_prefix = "derive-where-1.6.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.derive-where-1.6.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__dissimilar-1.0.11", + sha256 = "aeda16ab4059c5fd2a83f2b9c9e9c981327b18aa8e3b313f7e6563799d4f093e", + type = "tar.gz", + urls = ["https://static.crates.io/crates/dissimilar/1.0.11/download"], + strip_prefix = "dissimilar-1.0.11", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.dissimilar-1.0.11.bazel"), ) maybe( @@ -1261,6 +1303,26 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.either-1.15.0.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__embedded-io-0.4.0", + sha256 = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced", + type = "tar.gz", + urls = ["https://static.crates.io/crates/embedded-io/0.4.0/download"], + strip_prefix = "embedded-io-0.4.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.embedded-io-0.4.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__embedded-io-0.6.1", + sha256 = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d", + type = "tar.gz", + urls = ["https://static.crates.io/crates/embedded-io/0.6.1/download"], + strip_prefix = "embedded-io-0.6.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.embedded-io-0.6.1.bazel"), + ) + maybe( http_archive, name = "vendor_ts__ena-0.14.3", @@ -1351,16 +1413,6 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.equivalent-1.0.2.bazel"), ) - maybe( - http_archive, - name = "vendor_ts__erased-serde-0.4.6", - sha256 = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7", - type = "tar.gz", - urls = ["https://static.crates.io/crates/erased-serde/0.4.6/download"], - strip_prefix = "erased-serde-0.4.6", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.erased-serde-0.4.6.bazel"), - ) - maybe( http_archive, name = "vendor_ts__figment-0.10.19", @@ -1373,22 +1425,22 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__find-msvc-tools-0.1.1", - sha256 = "7fd99930f64d146689264c637b5af2f0233a933bef0d8570e2526bf9e083192d", + name = "vendor_ts__find-msvc-tools-0.1.9", + sha256 = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582", type = "tar.gz", - urls = ["https://static.crates.io/crates/find-msvc-tools/0.1.1/download"], - strip_prefix = "find-msvc-tools-0.1.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.find-msvc-tools-0.1.1.bazel"), + urls = ["https://static.crates.io/crates/find-msvc-tools/0.1.9/download"], + strip_prefix = "find-msvc-tools-0.1.9", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.find-msvc-tools-0.1.9.bazel"), ) maybe( http_archive, - name = "vendor_ts__fixedbitset-0.4.2", - sha256 = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80", + name = "vendor_ts__fixedbitset-0.5.7", + sha256 = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99", type = "tar.gz", - urls = ["https://static.crates.io/crates/fixedbitset/0.4.2/download"], - strip_prefix = "fixedbitset-0.4.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.fixedbitset-0.4.2.bazel"), + urls = ["https://static.crates.io/crates/fixedbitset/0.5.7/download"], + strip_prefix = "fixedbitset-0.5.7", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.fixedbitset-0.5.7.bazel"), ) maybe( @@ -1401,16 +1453,6 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.flate2-1.1.2.bazel"), ) - maybe( - http_archive, - name = "vendor_ts__fnv-1.0.7", - sha256 = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1", - type = "tar.gz", - urls = ["https://static.crates.io/crates/fnv/1.0.7/download"], - strip_prefix = "fnv-1.0.7", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.fnv-1.0.7.bazel"), - ) - maybe( http_archive, name = "vendor_ts__foldhash-0.1.5", @@ -1423,22 +1465,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__form_urlencoded-1.2.2", - sha256 = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf", - type = "tar.gz", - urls = ["https://static.crates.io/crates/form_urlencoded/1.2.2/download"], - strip_prefix = "form_urlencoded-1.2.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.form_urlencoded-1.2.2.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__fs-err-2.11.0", - sha256 = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41", + name = "vendor_ts__fs-err-3.3.0", + sha256 = "73fde052dbfc920003cfd2c8e2c6e6d4cc7c1091538c3a24226cec0665ab08c0", type = "tar.gz", - urls = ["https://static.crates.io/crates/fs-err/2.11.0/download"], - strip_prefix = "fs-err-2.11.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.fs-err-2.11.0.bazel"), + urls = ["https://static.crates.io/crates/fs-err/3.3.0/download"], + strip_prefix = "fs-err-3.3.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.fs-err-3.3.0.bazel"), ) maybe( @@ -1463,12 +1495,22 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__getrandom-0.3.3", - sha256 = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4", + name = "vendor_ts__getrandom-0.3.4", + sha256 = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd", type = "tar.gz", - urls = ["https://static.crates.io/crates/getrandom/0.3.3/download"], - strip_prefix = "getrandom-0.3.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.getrandom-0.3.3.bazel"), + urls = ["https://static.crates.io/crates/getrandom/0.3.4/download"], + strip_prefix = "getrandom-0.3.4", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.getrandom-0.3.4.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__getrandom-0.4.2", + sha256 = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555", + type = "tar.gz", + urls = ["https://static.crates.io/crates/getrandom/0.4.2/download"], + strip_prefix = "getrandom-0.4.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.getrandom-0.4.2.bazel"), ) maybe( @@ -1491,6 +1533,16 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.globset-0.4.16.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__hash32-0.2.1", + sha256 = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67", + type = "tar.gz", + urls = ["https://static.crates.io/crates/hash32/0.2.1/download"], + strip_prefix = "hash32-0.2.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.hash32-0.2.1.bazel"), + ) + maybe( http_archive, name = "vendor_ts__hashbrown-0.12.3", @@ -1521,6 +1573,16 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.hashbrown-0.15.5.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__hashbrown-0.17.0", + sha256 = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51", + type = "tar.gz", + urls = ["https://static.crates.io/crates/hashbrown/0.17.0/download"], + strip_prefix = "hashbrown-0.17.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.hashbrown-0.17.0.bazel"), + ) + maybe( http_archive, name = "vendor_ts__hashlink-0.10.0", @@ -1531,6 +1593,16 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.hashlink-0.10.0.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__heapless-0.7.17", + sha256 = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f", + type = "tar.gz", + urls = ["https://static.crates.io/crates/heapless/0.7.17/download"], + strip_prefix = "heapless-0.7.17", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.heapless-0.7.17.bazel"), + ) + maybe( http_archive, name = "vendor_ts__heck-0.5.0", @@ -1563,12 +1635,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__home-0.5.11", - sha256 = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf", + name = "vendor_ts__home-0.5.12", + sha256 = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d", type = "tar.gz", - urls = ["https://static.crates.io/crates/home/0.5.11/download"], - strip_prefix = "home-0.5.11", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.home-0.5.11.bazel"), + urls = ["https://static.crates.io/crates/home/0.5.12/download"], + strip_prefix = "home-0.5.12", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.home-0.5.12.bazel"), ) maybe( @@ -1593,72 +1665,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__icu_collections-2.0.0", - sha256 = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47", - type = "tar.gz", - urls = ["https://static.crates.io/crates/icu_collections/2.0.0/download"], - strip_prefix = "icu_collections-2.0.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.icu_collections-2.0.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__icu_locale_core-2.0.0", - sha256 = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a", - type = "tar.gz", - urls = ["https://static.crates.io/crates/icu_locale_core/2.0.0/download"], - strip_prefix = "icu_locale_core-2.0.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.icu_locale_core-2.0.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__icu_normalizer-2.0.0", - sha256 = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979", - type = "tar.gz", - urls = ["https://static.crates.io/crates/icu_normalizer/2.0.0/download"], - strip_prefix = "icu_normalizer-2.0.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.icu_normalizer-2.0.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__icu_normalizer_data-2.0.0", - sha256 = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3", - type = "tar.gz", - urls = ["https://static.crates.io/crates/icu_normalizer_data/2.0.0/download"], - strip_prefix = "icu_normalizer_data-2.0.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.icu_normalizer_data-2.0.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__icu_properties-2.0.1", - sha256 = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b", - type = "tar.gz", - urls = ["https://static.crates.io/crates/icu_properties/2.0.1/download"], - strip_prefix = "icu_properties-2.0.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.icu_properties-2.0.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__icu_properties_data-2.0.1", - sha256 = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632", - type = "tar.gz", - urls = ["https://static.crates.io/crates/icu_properties_data/2.0.1/download"], - strip_prefix = "icu_properties_data-2.0.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.icu_properties_data-2.0.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__icu_provider-2.0.0", - sha256 = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af", + name = "vendor_ts__id-arena-2.3.0", + sha256 = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954", type = "tar.gz", - urls = ["https://static.crates.io/crates/icu_provider/2.0.0/download"], - strip_prefix = "icu_provider-2.0.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.icu_provider-2.0.0.bazel"), + urls = ["https://static.crates.io/crates/id-arena/2.3.0/download"], + strip_prefix = "id-arena-2.3.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.id-arena-2.3.0.bazel"), ) maybe( @@ -1671,26 +1683,6 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ident_case-1.0.1.bazel"), ) - maybe( - http_archive, - name = "vendor_ts__idna-1.1.0", - sha256 = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de", - type = "tar.gz", - urls = ["https://static.crates.io/crates/idna/1.1.0/download"], - strip_prefix = "idna-1.1.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.idna-1.1.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__idna_adapter-1.2.1", - sha256 = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344", - type = "tar.gz", - urls = ["https://static.crates.io/crates/idna_adapter/1.2.1/download"], - strip_prefix = "idna_adapter-1.2.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.idna_adapter-1.2.1.bazel"), - ) - maybe( http_archive, name = "vendor_ts__indexmap-1.9.3", @@ -1703,12 +1695,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__indexmap-2.11.4", - sha256 = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5", + name = "vendor_ts__indexmap-2.14.0", + sha256 = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9", type = "tar.gz", - urls = ["https://static.crates.io/crates/indexmap/2.11.4/download"], - strip_prefix = "indexmap-2.11.4", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.indexmap-2.11.4.bazel"), + urls = ["https://static.crates.io/crates/indexmap/2.14.0/download"], + strip_prefix = "indexmap-2.14.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.indexmap-2.14.0.bazel"), ) maybe( @@ -1753,22 +1745,22 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__is_terminal_polyfill-1.70.1", - sha256 = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf", + name = "vendor_ts__inventory-0.3.24", + sha256 = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b", type = "tar.gz", - urls = ["https://static.crates.io/crates/is_terminal_polyfill/1.70.1/download"], - strip_prefix = "is_terminal_polyfill-1.70.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.is_terminal_polyfill-1.70.1.bazel"), + urls = ["https://static.crates.io/crates/inventory/0.3.24/download"], + strip_prefix = "inventory-0.3.24", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.inventory-0.3.24.bazel"), ) maybe( http_archive, - name = "vendor_ts__itertools-0.12.1", - sha256 = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569", + name = "vendor_ts__is_terminal_polyfill-1.70.2", + sha256 = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695", type = "tar.gz", - urls = ["https://static.crates.io/crates/itertools/0.12.1/download"], - strip_prefix = "itertools-0.12.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.itertools-0.12.1.bazel"), + urls = ["https://static.crates.io/crates/is_terminal_polyfill/1.70.2/download"], + strip_prefix = "is_terminal_polyfill-1.70.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.is_terminal_polyfill-1.70.2.bazel"), ) maybe( @@ -1783,12 +1775,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__itoa-1.0.15", - sha256 = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c", + name = "vendor_ts__itoa-1.0.18", + sha256 = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682", type = "tar.gz", - urls = ["https://static.crates.io/crates/itoa/1.0.15/download"], - strip_prefix = "itoa-1.0.15", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.itoa-1.0.15.bazel"), + urls = ["https://static.crates.io/crates/itoa/1.0.18/download"], + strip_prefix = "itoa-1.0.18", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.itoa-1.0.18.bazel"), ) maybe( @@ -1863,32 +1855,32 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__libc-0.2.175", - sha256 = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543", + name = "vendor_ts__leb128fmt-0.1.0", + sha256 = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2", type = "tar.gz", - urls = ["https://static.crates.io/crates/libc/0.2.175/download"], - strip_prefix = "libc-0.2.175", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.libc-0.2.175.bazel"), + urls = ["https://static.crates.io/crates/leb128fmt/0.1.0/download"], + strip_prefix = "leb128fmt-0.1.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.leb128fmt-0.1.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__line-index-0.1.2", - sha256 = "3e27e0ed5a392a7f5ba0b3808a2afccff16c64933312c84b57618b49d1209bd2", + name = "vendor_ts__libc-0.2.185", + sha256 = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f", type = "tar.gz", - urls = ["https://static.crates.io/crates/line-index/0.1.2/download"], - strip_prefix = "line-index-0.1.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.line-index-0.1.2.bazel"), + urls = ["https://static.crates.io/crates/libc/0.2.185/download"], + strip_prefix = "libc-0.2.185", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.libc-0.2.185.bazel"), ) maybe( http_archive, - name = "vendor_ts__litemap-0.8.0", - sha256 = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956", + name = "vendor_ts__line-index-0.1.2", + sha256 = "3e27e0ed5a392a7f5ba0b3808a2afccff16c64933312c84b57618b49d1209bd2", type = "tar.gz", - urls = ["https://static.crates.io/crates/litemap/0.8.0/download"], - strip_prefix = "litemap-0.8.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.litemap-0.8.0.bazel"), + urls = ["https://static.crates.io/crates/line-index/0.1.2/download"], + strip_prefix = "line-index-0.1.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.line-index-0.1.2.bazel"), ) maybe( @@ -1913,12 +1905,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__log-0.4.28", - sha256 = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432", + name = "vendor_ts__log-0.4.29", + sha256 = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897", type = "tar.gz", - urls = ["https://static.crates.io/crates/log/0.4.28/download"], - strip_prefix = "log-0.4.28", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.log-0.4.28.bazel"), + urls = ["https://static.crates.io/crates/log/0.4.29/download"], + strip_prefix = "log-0.4.29", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.log-0.4.29.bazel"), ) maybe( @@ -1933,12 +1925,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__memchr-2.7.5", - sha256 = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0", + name = "vendor_ts__memchr-2.8.0", + sha256 = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79", type = "tar.gz", - urls = ["https://static.crates.io/crates/memchr/2.7.5/download"], - strip_prefix = "memchr-2.7.5", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.memchr-2.7.5.bazel"), + urls = ["https://static.crates.io/crates/memchr/2.8.0/download"], + strip_prefix = "memchr-2.8.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.memchr-2.8.0.bazel"), ) maybe( @@ -1963,12 +1955,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__mio-1.0.4", - sha256 = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c", + name = "vendor_ts__mio-1.2.0", + sha256 = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1", type = "tar.gz", - urls = ["https://static.crates.io/crates/mio/1.0.4/download"], - strip_prefix = "mio-1.0.4", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.mio-1.0.4.bazel"), + urls = ["https://static.crates.io/crates/mio/1.2.0/download"], + strip_prefix = "mio-1.2.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.mio-1.2.0.bazel"), ) maybe( @@ -2033,12 +2025,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__num-conv-0.1.0", - sha256 = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9", + name = "vendor_ts__num-conv-0.2.1", + sha256 = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967", type = "tar.gz", - urls = ["https://static.crates.io/crates/num-conv/0.1.0/download"], - strip_prefix = "num-conv-0.1.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.num-conv-0.1.0.bazel"), + urls = ["https://static.crates.io/crates/num-conv/0.2.1/download"], + strip_prefix = "num-conv-0.2.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.num-conv-0.2.1.bazel"), ) maybe( @@ -2063,12 +2055,22 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__once_cell-1.21.3", - sha256 = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d", + name = "vendor_ts__num_threads-0.1.7", + sha256 = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9", + type = "tar.gz", + urls = ["https://static.crates.io/crates/num_threads/0.1.7/download"], + strip_prefix = "num_threads-0.1.7", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.num_threads-0.1.7.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__once_cell-1.21.4", + sha256 = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50", type = "tar.gz", - urls = ["https://static.crates.io/crates/once_cell/1.21.3/download"], - strip_prefix = "once_cell-1.21.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.once_cell-1.21.3.bazel"), + urls = ["https://static.crates.io/crates/once_cell/1.21.4/download"], + strip_prefix = "once_cell-1.21.4", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.once_cell-1.21.4.bazel"), ) maybe( @@ -2091,16 +2093,6 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.oorandom-11.1.5.bazel"), ) - maybe( - http_archive, - name = "vendor_ts__ordered-float-2.10.1", - sha256 = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ordered-float/2.10.1/download"], - strip_prefix = "ordered-float-2.10.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ordered-float-2.10.1.bazel"), - ) - maybe( http_archive, name = "vendor_ts__os_str_bytes-7.1.1", @@ -2111,16 +2103,6 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.os_str_bytes-7.1.1.bazel"), ) - maybe( - http_archive, - name = "vendor_ts__papaya-0.2.3", - sha256 = "f92dd0b07c53a0a0c764db2ace8c541dc47320dad97c2200c2a637ab9dd2328f", - type = "tar.gz", - urls = ["https://static.crates.io/crates/papaya/0.2.3/download"], - strip_prefix = "papaya-0.2.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.papaya-0.2.3.bazel"), - ) - maybe( http_archive, name = "vendor_ts__parking_lot-0.12.4", @@ -2163,52 +2145,42 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__percent-encoding-2.3.2", - sha256 = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220", + name = "vendor_ts__perf-event-0.4.8", + sha256 = "b4d6393d9238342159080d79b78cb59c67399a8e7ecfa5d410bd614169e4e823", type = "tar.gz", - urls = ["https://static.crates.io/crates/percent-encoding/2.3.2/download"], - strip_prefix = "percent-encoding-2.3.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.percent-encoding-2.3.2.bazel"), + urls = ["https://static.crates.io/crates/perf-event/0.4.8/download"], + strip_prefix = "perf-event-0.4.8", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.perf-event-0.4.8.bazel"), ) maybe( http_archive, - name = "vendor_ts__perf-event-0.4.7", - sha256 = "5396562cd2eaa828445d6d34258ae21ee1eb9d40fe626ca7f51c8dccb4af9d66", + name = "vendor_ts__perf-event-open-sys-4.0.0", + sha256 = "7c44fb1c7651a45a3652c4afc6e754e40b3d6e6556f1487e2b230bfc4f33c2a8", type = "tar.gz", - urls = ["https://static.crates.io/crates/perf-event/0.4.7/download"], - strip_prefix = "perf-event-0.4.7", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.perf-event-0.4.7.bazel"), + urls = ["https://static.crates.io/crates/perf-event-open-sys/4.0.0/download"], + strip_prefix = "perf-event-open-sys-4.0.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.perf-event-open-sys-4.0.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__perf-event-open-sys-1.0.1", - sha256 = "ce9bedf5da2c234fdf2391ede2b90fabf585355f33100689bc364a3ea558561a", + name = "vendor_ts__petgraph-0.8.3", + sha256 = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455", type = "tar.gz", - urls = ["https://static.crates.io/crates/perf-event-open-sys/1.0.1/download"], - strip_prefix = "perf-event-open-sys-1.0.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.perf-event-open-sys-1.0.1.bazel"), + urls = ["https://static.crates.io/crates/petgraph/0.8.3/download"], + strip_prefix = "petgraph-0.8.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.petgraph-0.8.3.bazel"), ) maybe( http_archive, - name = "vendor_ts__petgraph-0.6.5", - sha256 = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db", + name = "vendor_ts__pin-project-lite-0.2.17", + sha256 = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd", type = "tar.gz", - urls = ["https://static.crates.io/crates/petgraph/0.6.5/download"], - strip_prefix = "petgraph-0.6.5", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.petgraph-0.6.5.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__pin-project-lite-0.2.16", - sha256 = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b", - type = "tar.gz", - urls = ["https://static.crates.io/crates/pin-project-lite/0.2.16/download"], - strip_prefix = "pin-project-lite-0.2.16", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.pin-project-lite-0.2.16.bazel"), + urls = ["https://static.crates.io/crates/pin-project-lite/0.2.17/download"], + strip_prefix = "pin-project-lite-0.2.17", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.pin-project-lite-0.2.17.bazel"), ) maybe( @@ -2233,12 +2205,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__potential_utf-0.1.3", - sha256 = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a", + name = "vendor_ts__postcard-1.1.3", + sha256 = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24", type = "tar.gz", - urls = ["https://static.crates.io/crates/potential_utf/0.1.3/download"], - strip_prefix = "potential_utf-0.1.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.potential_utf-0.1.3.bazel"), + urls = ["https://static.crates.io/crates/postcard/1.1.3/download"], + strip_prefix = "postcard-1.1.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.postcard-1.1.3.bazel"), ) maybe( @@ -2253,22 +2225,22 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__ppv-lite86-0.2.21", - sha256 = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9", + name = "vendor_ts__prettyplease-0.2.37", + sha256 = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b", type = "tar.gz", - urls = ["https://static.crates.io/crates/ppv-lite86/0.2.21/download"], - strip_prefix = "ppv-lite86-0.2.21", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ppv-lite86-0.2.21.bazel"), + urls = ["https://static.crates.io/crates/prettyplease/0.2.37/download"], + strip_prefix = "prettyplease-0.2.37", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.prettyplease-0.2.37.bazel"), ) maybe( http_archive, - name = "vendor_ts__proc-macro2-1.0.101", - sha256 = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de", + name = "vendor_ts__proc-macro2-1.0.106", + sha256 = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934", type = "tar.gz", - urls = ["https://static.crates.io/crates/proc-macro2/1.0.101/download"], - strip_prefix = "proc-macro2-1.0.101", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.proc-macro2-1.0.101.bazel"), + urls = ["https://static.crates.io/crates/proc-macro2/1.0.106/download"], + strip_prefix = "proc-macro2-1.0.106", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.proc-macro2-1.0.106.bazel"), ) maybe( @@ -2283,12 +2255,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__quote-1.0.41", - sha256 = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1", + name = "vendor_ts__quote-1.0.45", + sha256 = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924", type = "tar.gz", - urls = ["https://static.crates.io/crates/quote/1.0.41/download"], - strip_prefix = "quote-1.0.41", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.quote-1.0.41.bazel"), + urls = ["https://static.crates.io/crates/quote/1.0.45/download"], + strip_prefix = "quote-1.0.45", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.quote-1.0.45.bazel"), ) maybe( @@ -2303,372 +2275,432 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__ra-ap-rustc_abi-0.123.0", - sha256 = "f18c877575c259d127072e9bfc41d985202262fb4d6bfdae3d1252147c2562c2", + name = "vendor_ts__r-efi-6.0.0", + sha256 = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra-ap-rustc_abi/0.123.0/download"], - strip_prefix = "ra-ap-rustc_abi-0.123.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_abi-0.123.0.bazel"), + urls = ["https://static.crates.io/crates/r-efi/6.0.0/download"], + strip_prefix = "r-efi-6.0.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.r-efi-6.0.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra-ap-rustc_hashes-0.123.0", - sha256 = "2439ed1df3472443133b66949f81080dff88089b42f825761455463709ee1cad", + name = "vendor_ts__ra-ap-rustc_abi-0.143.0", + sha256 = "1d49dbe5d570793b3c3227972a6ac85fc3e830f09b32c3cb3b68cfceebad3b0a", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra-ap-rustc_hashes/0.123.0/download"], - strip_prefix = "ra-ap-rustc_hashes-0.123.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_hashes-0.123.0.bazel"), + urls = ["https://static.crates.io/crates/ra-ap-rustc_abi/0.143.0/download"], + strip_prefix = "ra-ap-rustc_abi-0.143.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_abi-0.143.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra-ap-rustc_index-0.123.0", - sha256 = "57a24fe0be21be1f8ebc21dcb40129214fb4cefb0f2753f3d46b6dbe656a1a45", + name = "vendor_ts__ra-ap-rustc_ast_ir-0.143.0", + sha256 = "cd0956db62c264a899d15667993cbbd2e8f0b02108712217e2579c61ac30b94b", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra-ap-rustc_index/0.123.0/download"], - strip_prefix = "ra-ap-rustc_index-0.123.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_index-0.123.0.bazel"), + urls = ["https://static.crates.io/crates/ra-ap-rustc_ast_ir/0.143.0/download"], + strip_prefix = "ra-ap-rustc_ast_ir-0.143.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_ast_ir-0.143.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra-ap-rustc_index_macros-0.123.0", - sha256 = "844a27ddcad0116facae2df8e741fd788662cf93dc13029cd864f2b8013b81f9", + name = "vendor_ts__ra-ap-rustc_hashes-0.143.0", + sha256 = "7df512084c24f4c96c8cc9a59cbd264301efbc8913d3759b065398024af316c9", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra-ap-rustc_index_macros/0.123.0/download"], - strip_prefix = "ra-ap-rustc_index_macros-0.123.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_index_macros-0.123.0.bazel"), + urls = ["https://static.crates.io/crates/ra-ap-rustc_hashes/0.143.0/download"], + strip_prefix = "ra-ap-rustc_hashes-0.143.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_hashes-0.143.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra-ap-rustc_lexer-0.121.0", - sha256 = "22944e31fb91e9b3e75bcbc91e37d958b8c0825a6160927f2856831d2ce83b36", + name = "vendor_ts__ra-ap-rustc_index-0.143.0", + sha256 = "bca3a49a928d38ba7927605e5909b6abe77d09ff359e4695c070c3f91d69cc8a", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra-ap-rustc_lexer/0.121.0/download"], - strip_prefix = "ra-ap-rustc_lexer-0.121.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_lexer-0.121.0.bazel"), + urls = ["https://static.crates.io/crates/ra-ap-rustc_index/0.143.0/download"], + strip_prefix = "ra-ap-rustc_index-0.143.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_index-0.143.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra-ap-rustc_lexer-0.123.0", - sha256 = "2b734cfcb577d09877799a22742f1bd398be6c00bc428d9de56d48d11ece5771", + name = "vendor_ts__ra-ap-rustc_index_macros-0.143.0", + sha256 = "4463e908a62c64c2a65c1966c2f4995d0e1f8b7dfc85a8b8de2562edf3d89070", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra-ap-rustc_lexer/0.123.0/download"], - strip_prefix = "ra-ap-rustc_lexer-0.123.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_lexer-0.123.0.bazel"), + urls = ["https://static.crates.io/crates/ra-ap-rustc_index_macros/0.143.0/download"], + strip_prefix = "ra-ap-rustc_index_macros-0.143.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_index_macros-0.143.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra-ap-rustc_parse_format-0.121.0", - sha256 = "81057891bc2063ad9e353f29462fbc47a0f5072560af34428ae9313aaa5e9d97", + name = "vendor_ts__ra-ap-rustc_lexer-0.143.0", + sha256 = "228e01e1b237adb4bd8793487e1c37019c1e526a8f93716d99602301be267056", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra-ap-rustc_parse_format/0.121.0/download"], - strip_prefix = "ra-ap-rustc_parse_format-0.121.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_parse_format-0.121.0.bazel"), + urls = ["https://static.crates.io/crates/ra-ap-rustc_lexer/0.143.0/download"], + strip_prefix = "ra-ap-rustc_lexer-0.143.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_lexer-0.143.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra-ap-rustc_pattern_analysis-0.123.0", - sha256 = "75b0ee1f059b9dea0818c6c7267478926eee95ba4c7dcf89c8db32fa165d3904", + name = "vendor_ts__ra-ap-rustc_next_trait_solver-0.143.0", + sha256 = "10d6f91143011d474bb844d268b0784c6a4c6db57743558b83f5ad34511627f1", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra-ap-rustc_pattern_analysis/0.123.0/download"], - strip_prefix = "ra-ap-rustc_pattern_analysis-0.123.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_pattern_analysis-0.123.0.bazel"), + urls = ["https://static.crates.io/crates/ra-ap-rustc_next_trait_solver/0.143.0/download"], + strip_prefix = "ra-ap-rustc_next_trait_solver-0.143.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_next_trait_solver-0.143.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_base_db-0.0.301", - sha256 = "e876bb2c3e52a8d4e6684526a2d4e81f9d028b939ee4dc5dc775fe10deb44d59", + name = "vendor_ts__ra-ap-rustc_parse_format-0.143.0", + sha256 = "37fa8effbc436c0ddd9d7b1421aa3cccf8b94566c841c4e4aa3e09063b8f423f", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_base_db/0.0.301/download"], - strip_prefix = "ra_ap_base_db-0.0.301", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_base_db-0.0.301.bazel"), + urls = ["https://static.crates.io/crates/ra-ap-rustc_parse_format/0.143.0/download"], + strip_prefix = "ra-ap-rustc_parse_format-0.143.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_parse_format-0.143.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_cfg-0.0.301", - sha256 = "3a0b56eb4536ce6d2431932c4d337aeeaf7bb22c9249b38cbe80677b5881228f", + name = "vendor_ts__ra-ap-rustc_pattern_analysis-0.143.0", + sha256 = "883c843fc27847ad03b8e772dd4a2d2728af4333a6d6821a22dfcfe7136dff3e", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_cfg/0.0.301/download"], - strip_prefix = "ra_ap_cfg-0.0.301", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_cfg-0.0.301.bazel"), + urls = ["https://static.crates.io/crates/ra-ap-rustc_pattern_analysis/0.143.0/download"], + strip_prefix = "ra-ap-rustc_pattern_analysis-0.143.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_pattern_analysis-0.143.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_edition-0.0.301", - sha256 = "1bdc6cbe42c63ca78611bae82bfc8db24864f33dccc813697c5fde43a0907285", + name = "vendor_ts__ra-ap-rustc_type_ir-0.143.0", + sha256 = "a86e33c46b2b261a173b23f207461a514812a8b2d2d7935bbc685f733eacce10", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_edition/0.0.301/download"], - strip_prefix = "ra_ap_edition-0.0.301", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_edition-0.0.301.bazel"), + urls = ["https://static.crates.io/crates/ra-ap-rustc_type_ir/0.143.0/download"], + strip_prefix = "ra-ap-rustc_type_ir-0.143.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_type_ir-0.143.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_hir-0.0.301", - sha256 = "ebffdc134eccabc17209d7760cfff7fd12ed18ab6e21188c5e084b97aa38504c", + name = "vendor_ts__ra-ap-rustc_type_ir_macros-0.143.0", + sha256 = "15034c2fcaa5cf302aea6db20eda0f71fffeb0b372d6073cc50f940e974a2a47", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_hir/0.0.301/download"], - strip_prefix = "ra_ap_hir-0.0.301", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_hir-0.0.301.bazel"), + urls = ["https://static.crates.io/crates/ra-ap-rustc_type_ir_macros/0.143.0/download"], + strip_prefix = "ra-ap-rustc_type_ir_macros-0.143.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_type_ir_macros-0.143.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_hir_def-0.0.301", - sha256 = "81d2337ef59550392d42aa997aa1105a3d6d1c2b3a583c777786bc4a0a074fd5", + name = "vendor_ts__ra_ap_base_db-0.0.328", + sha256 = "b1567168e7c7b50acf2ffb87bde8937986d4f41c777a2c308298ede9d555c96c", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_hir_def/0.0.301/download"], - strip_prefix = "ra_ap_hir_def-0.0.301", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_hir_def-0.0.301.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_base_db/0.0.328/download"], + strip_prefix = "ra_ap_base_db-0.0.328", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_base_db-0.0.328.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_hir_expand-0.0.301", - sha256 = "97cf8ececb2743a819d8299a408e17f164dd1a1004d65936b3d5493b55330326", + name = "vendor_ts__ra_ap_cfg-0.0.328", + sha256 = "1e1fc8d53014b0ec4c06c9dbf0a810ccd67b3a96de4ef06bd1a248c2295b6a37", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_hir_expand/0.0.301/download"], - strip_prefix = "ra_ap_hir_expand-0.0.301", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_hir_expand-0.0.301.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_cfg/0.0.328/download"], + strip_prefix = "ra_ap_cfg-0.0.328", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_cfg-0.0.328.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_hir_ty-0.0.301", - sha256 = "bc004e1099ba766a61500c27d34eb5cd336430d0a89a9620315a90d7a202a73a", + name = "vendor_ts__ra_ap_edition-0.0.328", + sha256 = "627a8ce8e870632395b7bf053c93039a3d91dda744ccae166ac83650572cfaa2", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_hir_ty/0.0.301/download"], - strip_prefix = "ra_ap_hir_ty-0.0.301", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_hir_ty-0.0.301.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_edition/0.0.328/download"], + strip_prefix = "ra_ap_edition-0.0.328", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_edition-0.0.328.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_ide_db-0.0.301", - sha256 = "d2acb572d6dbeb1c96d0339890ba91298b8f5f0ab22648da4ee2b4ab77dbc3fe", + name = "vendor_ts__ra_ap_hir-0.0.328", + sha256 = "b77616ef81f690a3eba4befd32112780b99f052676b0e7686a22bf79f3fbe2a8", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_ide_db/0.0.301/download"], - strip_prefix = "ra_ap_ide_db-0.0.301", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_ide_db-0.0.301.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_hir/0.0.328/download"], + strip_prefix = "ra_ap_hir-0.0.328", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_hir-0.0.328.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_intern-0.0.301", - sha256 = "14586c2c4781b69fdd0c505972d9bff8c162a8740537a3ee506faff686d9a20d", + name = "vendor_ts__ra_ap_hir_def-0.0.328", + sha256 = "81504dd727efbaf48704a9c0e18e6491cb9848428376ad37146f37f63571ab3c", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_intern/0.0.301/download"], - strip_prefix = "ra_ap_intern-0.0.301", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_intern-0.0.301.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_hir_def/0.0.328/download"], + strip_prefix = "ra_ap_hir_def-0.0.328", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_hir_def-0.0.328.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_load-cargo-0.0.301", - sha256 = "50ce5546b3e3414507ab4d12348d0a28748062e33a1448895c68466d0b015503", + name = "vendor_ts__ra_ap_hir_expand-0.0.328", + sha256 = "9980623345a88d4431ce80331e640c494e2e59303e82a2cb1290b4684efdc6e5", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_load-cargo/0.0.301/download"], - strip_prefix = "ra_ap_load-cargo-0.0.301", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_load-cargo-0.0.301.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_hir_expand/0.0.328/download"], + strip_prefix = "ra_ap_hir_expand-0.0.328", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_hir_expand-0.0.328.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_mbe-0.0.301", - sha256 = "67333c6405797cb64aafb994b9a179157b30beeda2352e203e800be2b184a22d", + name = "vendor_ts__ra_ap_hir_ty-0.0.328", + sha256 = "b822d1b9f0168281bbba34e0c5abada891fa9fc5e0b54e86493e8b075a877973", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_mbe/0.0.301/download"], - strip_prefix = "ra_ap_mbe-0.0.301", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_mbe-0.0.301.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_hir_ty/0.0.328/download"], + strip_prefix = "ra_ap_hir_ty-0.0.328", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_hir_ty-0.0.328.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_parser-0.0.301", - sha256 = "3a3b92b8b147c0826b83e70ad44e3c98e94201fc93e1f09396c43b4d7958c22a", + name = "vendor_ts__ra_ap_ide_db-0.0.328", + sha256 = "0e250964a32be6c74f1f72e0fd8aea08aaed0535d85a7fd315fe442942185da0", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_parser/0.0.301/download"], - strip_prefix = "ra_ap_parser-0.0.301", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_parser-0.0.301.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_ide_db/0.0.328/download"], + strip_prefix = "ra_ap_ide_db-0.0.328", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_ide_db-0.0.328.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_paths-0.0.301", - sha256 = "d4991f3d57fac0def7822bebfeb159c8d7b58c824bf82044b765c54f2c0971e2", + name = "vendor_ts__ra_ap_intern-0.0.328", + sha256 = "df7edf9d14d093b4314b43ed75eaf56d47d870a09b8d0e0e67d17919c30bfb0f", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_paths/0.0.301/download"], - strip_prefix = "ra_ap_paths-0.0.301", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_paths-0.0.301.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_intern/0.0.328/download"], + strip_prefix = "ra_ap_intern-0.0.328", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_intern-0.0.328.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_proc_macro_api-0.0.301", - sha256 = "45db9e2df587d56f0738afa89fb2c100ff7c1e9cbe49e07f6a8b62342832211b", + name = "vendor_ts__ra_ap_load-cargo-0.0.328", + sha256 = "184cdaabfb66948938aa4b73ee24f7fa57c1292292c1d87bcad2c616cbd254ea", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_proc_macro_api/0.0.301/download"], - strip_prefix = "ra_ap_proc_macro_api-0.0.301", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_proc_macro_api-0.0.301.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_load-cargo/0.0.328/download"], + strip_prefix = "ra_ap_load-cargo-0.0.328", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_load-cargo-0.0.328.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_profile-0.0.301", - sha256 = "19981637b8ee4160e228c815a7fef3944b5c0555d6af41a931be92d68978bc6c", + name = "vendor_ts__ra_ap_macros-0.0.328", + sha256 = "fd338f982b2f7438ee89ca2429ad7181f2f0751fa6b98d8275905c97e2fb8361", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_profile/0.0.301/download"], - strip_prefix = "ra_ap_profile-0.0.301", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_profile-0.0.301.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_macros/0.0.328/download"], + strip_prefix = "ra_ap_macros-0.0.328", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_macros-0.0.328.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_project_model-0.0.301", - sha256 = "5bda0769fd6ca949fdd5917acb68ddc2c143745614ddd94ef38b376838611cf8", + name = "vendor_ts__ra_ap_mbe-0.0.328", + sha256 = "81d4c7114f2363c05b6dc7f5f6cdd6c9d6a1ba63410b0cdc80c81d1414da7c72", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_project_model/0.0.301/download"], - strip_prefix = "ra_ap_project_model-0.0.301", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_project_model-0.0.301.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_mbe/0.0.328/download"], + strip_prefix = "ra_ap_mbe-0.0.328", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_mbe-0.0.328.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_query-group-macro-0.0.301", - sha256 = "5f182a4b05f004eabaa83250a5de7ea3a13a92c88f3cbe98bfa1880cd9fbce0a", + name = "vendor_ts__ra_ap_parser-0.0.328", + sha256 = "c9851f3b6e93971e6c3957966a07154bc35e0f91c0a6980ad71965620df6f737", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_query-group-macro/0.0.301/download"], - strip_prefix = "ra_ap_query-group-macro-0.0.301", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_query-group-macro-0.0.301.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_parser/0.0.328/download"], + strip_prefix = "ra_ap_parser-0.0.328", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_parser-0.0.328.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_span-0.0.301", - sha256 = "ca6f9fa2de07f5cccf431674b90e82c1fe1ea2339db3b3869eec44d135de09a4", + name = "vendor_ts__ra_ap_paths-0.0.328", + sha256 = "506bbef9963ca9275dd50f5876d68e32a58d47a369ea10bce2be1c758b081c42", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_span/0.0.301/download"], - strip_prefix = "ra_ap_span-0.0.301", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_span-0.0.301.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_paths/0.0.328/download"], + strip_prefix = "ra_ap_paths-0.0.328", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_paths-0.0.328.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_stdx-0.0.301", - sha256 = "aa770adb32896fcba934b464ac3bd179163ba2b0766e275eed5b4e262e08492b", + name = "vendor_ts__ra_ap_proc_macro_api-0.0.328", + sha256 = "18e0229d5c7daa016a8f4f735194e68baf34ca18b73982ae036a8217874f32e9", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_stdx/0.0.301/download"], - strip_prefix = "ra_ap_stdx-0.0.301", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_stdx-0.0.301.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_proc_macro_api/0.0.328/download"], + strip_prefix = "ra_ap_proc_macro_api-0.0.328", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_proc_macro_api-0.0.328.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_syntax-0.0.301", - sha256 = "6e9e1393281ad5c635239d353ed3cfbf28c8d0af03d0c61a3b24b31d1143b17f", + name = "vendor_ts__ra_ap_profile-0.0.328", + sha256 = "b251c30d8e4df3902a92d10c4899e43403921f72aef12afa2f027a77e4898950", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_syntax/0.0.301/download"], - strip_prefix = "ra_ap_syntax-0.0.301", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_syntax-0.0.301.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_profile/0.0.328/download"], + strip_prefix = "ra_ap_profile-0.0.328", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_profile-0.0.328.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_syntax-bridge-0.0.301", - sha256 = "684e6ff1008ee5340335888f0453d94bb38950f110059a51f1818c7f6a56a807", + name = "vendor_ts__ra_ap_project_model-0.0.328", + sha256 = "2b04624412e45c7b0f792859be553182ea2360d8a24bf7162ca212840e683a24", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_syntax-bridge/0.0.301/download"], - strip_prefix = "ra_ap_syntax-bridge-0.0.301", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_syntax-bridge-0.0.301.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_project_model/0.0.328/download"], + strip_prefix = "ra_ap_project_model-0.0.328", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_project_model-0.0.328.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_toolchain-0.0.301", - sha256 = "61969c5f72af03a9837e077c2d939d87a5c863623725c461777c352664a3bb03", + name = "vendor_ts__ra_ap_query-group-macro-0.0.328", + sha256 = "770079ca5addde33d31b7f3fa8d399f0dc29c26f69642a9d5c2a5e623d8af64d", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_toolchain/0.0.301/download"], - strip_prefix = "ra_ap_toolchain-0.0.301", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_toolchain-0.0.301.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_query-group-macro/0.0.328/download"], + strip_prefix = "ra_ap_query-group-macro-0.0.328", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_query-group-macro-0.0.328.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_tt-0.0.301", - sha256 = "fb87c7b35572c18a580ea811e970b94875fad5ac7cfa8644266a59081044f959", + name = "vendor_ts__ra_ap_span-0.0.328", + sha256 = "80a523bc8c85155ccd1db35b6855d37729d339c572b7fc0801c459bb8218976b", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_tt/0.0.301/download"], - strip_prefix = "ra_ap_tt-0.0.301", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_tt-0.0.301.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_span/0.0.328/download"], + strip_prefix = "ra_ap_span-0.0.328", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_span-0.0.328.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_vfs-0.0.301", - sha256 = "6c174d6b9b7a7f54687df7e00c3e75ed6f082a7943a9afb1d54f33c0c12773de", + name = "vendor_ts__ra_ap_stdx-0.0.328", + sha256 = "eb22b95e21d08060860056c86af1b47b2cecbac5422baa112d9d138e97c3671a", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_vfs/0.0.301/download"], - strip_prefix = "ra_ap_vfs-0.0.301", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_vfs-0.0.301.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_stdx/0.0.328/download"], + strip_prefix = "ra_ap_stdx-0.0.328", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_stdx-0.0.328.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_vfs-notify-0.0.301", - sha256 = "04f6fce8d47c7ce9b8f2cd0e5a55f8fc4878d6043e61f46cde4391d3a5c6086f", + name = "vendor_ts__ra_ap_syntax-0.0.328", + sha256 = "ba3d9c469b5635401647b69e01a9930746f08a3cac51d04ad5ae99e66bdd643f", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_vfs-notify/0.0.301/download"], - strip_prefix = "ra_ap_vfs-notify-0.0.301", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_vfs-notify-0.0.301.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_syntax/0.0.328/download"], + strip_prefix = "ra_ap_syntax-0.0.328", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_syntax-0.0.328.bazel"), ) maybe( http_archive, - name = "vendor_ts__rand-0.9.2", - sha256 = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1", + name = "vendor_ts__ra_ap_syntax-bridge-0.0.328", + sha256 = "b4d3f2e2a1836eeedc2ed2810ece4cdf7ea42284f71b7031eac8448c1cb95b09", type = "tar.gz", - urls = ["https://static.crates.io/crates/rand/0.9.2/download"], - strip_prefix = "rand-0.9.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rand-0.9.2.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_syntax-bridge/0.0.328/download"], + strip_prefix = "ra_ap_syntax-bridge-0.0.328", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_syntax-bridge-0.0.328.bazel"), ) maybe( http_archive, - name = "vendor_ts__rand_chacha-0.9.0", - sha256 = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb", + name = "vendor_ts__ra_ap_test_fixture-0.0.328", + sha256 = "21d6d353373b4f28f2236ed7843bcee0e4dd0e6a12b339da874460bbefd070ab", type = "tar.gz", - urls = ["https://static.crates.io/crates/rand_chacha/0.9.0/download"], - strip_prefix = "rand_chacha-0.9.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rand_chacha-0.9.0.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_test_fixture/0.0.328/download"], + strip_prefix = "ra_ap_test_fixture-0.0.328", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_test_fixture-0.0.328.bazel"), ) maybe( http_archive, - name = "vendor_ts__rand_core-0.9.3", - sha256 = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38", + name = "vendor_ts__ra_ap_test_utils-0.0.328", + sha256 = "57d10cbb0402abee7034de5d90ddf7e380d1e21ad0e1dcd2db92c3c87df78723", type = "tar.gz", - urls = ["https://static.crates.io/crates/rand_core/0.9.3/download"], - strip_prefix = "rand_core-0.9.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rand_core-0.9.3.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_test_utils/0.0.328/download"], + strip_prefix = "ra_ap_test_utils-0.0.328", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_test_utils-0.0.328.bazel"), ) maybe( http_archive, - name = "vendor_ts__rayon-1.11.0", - sha256 = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f", + name = "vendor_ts__ra_ap_toolchain-0.0.328", + sha256 = "2fed946c88a9dfa93de7a376a06493c5377a1052ac666ab9e1155f4ea57271c9", type = "tar.gz", - urls = ["https://static.crates.io/crates/rayon/1.11.0/download"], - strip_prefix = "rayon-1.11.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rayon-1.11.0.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_toolchain/0.0.328/download"], + strip_prefix = "ra_ap_toolchain-0.0.328", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_toolchain-0.0.328.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra_ap_tt-0.0.328", + sha256 = "96dfc20add2675d38240a7815755b54f514d91b9dc0336cb3d024901af4faeef", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra_ap_tt/0.0.328/download"], + strip_prefix = "ra_ap_tt-0.0.328", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_tt-0.0.328.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra_ap_vfs-0.0.328", + sha256 = "d69bc10b59435e4d989d10bc0b602a5bd70e1dcc2c5d8513b10585d9e778b440", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra_ap_vfs/0.0.328/download"], + strip_prefix = "ra_ap_vfs-0.0.328", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_vfs-0.0.328.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra_ap_vfs-notify-0.0.328", + sha256 = "07f7f31bb0c5744ba1fe1b1460eeb62274110dfb94e4b6719cf2e7df9410032d", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra_ap_vfs-notify/0.0.328/download"], + strip_prefix = "ra_ap_vfs-notify-0.0.328", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_vfs-notify-0.0.328.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__rand-0.10.1", + sha256 = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207", + type = "tar.gz", + urls = ["https://static.crates.io/crates/rand/0.10.1/download"], + strip_prefix = "rand-0.10.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rand-0.10.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__rand_core-0.10.1", + sha256 = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69", + type = "tar.gz", + urls = ["https://static.crates.io/crates/rand_core/0.10.1/download"], + strip_prefix = "rand_core-0.10.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rand_core-0.10.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__rayon-1.12.0", + sha256 = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d", + type = "tar.gz", + urls = ["https://static.crates.io/crates/rayon/1.12.0/download"], + strip_prefix = "rayon-1.12.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rayon-1.12.0.bazel"), ) maybe( @@ -2713,42 +2745,42 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__regex-1.11.3", - sha256 = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c", + name = "vendor_ts__regex-1.12.3", + sha256 = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276", type = "tar.gz", - urls = ["https://static.crates.io/crates/regex/1.11.3/download"], - strip_prefix = "regex-1.11.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.regex-1.11.3.bazel"), + urls = ["https://static.crates.io/crates/regex/1.12.3/download"], + strip_prefix = "regex-1.12.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.regex-1.12.3.bazel"), ) maybe( http_archive, - name = "vendor_ts__regex-automata-0.4.11", - sha256 = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad", + name = "vendor_ts__regex-automata-0.4.14", + sha256 = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f", type = "tar.gz", - urls = ["https://static.crates.io/crates/regex-automata/0.4.11/download"], - strip_prefix = "regex-automata-0.4.11", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.regex-automata-0.4.11.bazel"), + urls = ["https://static.crates.io/crates/regex-automata/0.4.14/download"], + strip_prefix = "regex-automata-0.4.14", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.regex-automata-0.4.14.bazel"), ) maybe( http_archive, - name = "vendor_ts__regex-syntax-0.8.6", - sha256 = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001", + name = "vendor_ts__regex-syntax-0.8.10", + sha256 = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a", type = "tar.gz", - urls = ["https://static.crates.io/crates/regex-syntax/0.8.6/download"], - strip_prefix = "regex-syntax-0.8.6", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.regex-syntax-0.8.6.bazel"), + urls = ["https://static.crates.io/crates/regex-syntax/0.8.10/download"], + strip_prefix = "regex-syntax-0.8.10", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.regex-syntax-0.8.10.bazel"), ) maybe( http_archive, - name = "vendor_ts__rowan-0.15.15", - sha256 = "32a58fa8a7ccff2aec4f39cc45bf5f985cec7125ab271cf681c279fd00192b49", + name = "vendor_ts__rowan-0.15.18", + sha256 = "62f509095fc8cc0c8c8564016771d458079c11a8d857e65861f045145c0d3208", type = "tar.gz", - urls = ["https://static.crates.io/crates/rowan/0.15.15/download"], - strip_prefix = "rowan-0.15.15", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rowan-0.15.15.bazel"), + urls = ["https://static.crates.io/crates/rowan/0.15.18/download"], + strip_prefix = "rowan-0.15.18", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rowan-0.15.18.bazel"), ) maybe( @@ -2763,12 +2795,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__rustc-hash-2.1.1", - sha256 = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d", + name = "vendor_ts__rustc-hash-2.1.2", + sha256 = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe", type = "tar.gz", - urls = ["https://static.crates.io/crates/rustc-hash/2.1.1/download"], - strip_prefix = "rustc-hash-2.1.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rustc-hash-2.1.1.bazel"), + urls = ["https://static.crates.io/crates/rustc-hash/2.1.2/download"], + strip_prefix = "rustc-hash-2.1.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rustc-hash-2.1.2.bazel"), ) maybe( @@ -2781,6 +2813,16 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rustc-literal-escaper-0.0.4.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__rustc-literal-escaper-0.0.5", + sha256 = "e4ee29da77c5a54f42697493cd4c9b9f31b74df666a6c04dfc4fde77abe0438b", + type = "tar.gz", + urls = ["https://static.crates.io/crates/rustc-literal-escaper/0.0.5/download"], + strip_prefix = "rustc-literal-escaper-0.0.5", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rustc-literal-escaper-0.0.5.bazel"), + ) + maybe( http_archive, name = "vendor_ts__rustc-stable-hash-0.1.2", @@ -2801,6 +2843,16 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rustc_apfloat-0.2.3+llvm-462a31f5a5ab.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__rustc_version-0.4.1", + sha256 = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92", + type = "tar.gz", + urls = ["https://static.crates.io/crates/rustc_version/0.4.1/download"], + strip_prefix = "rustc_version-0.4.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rustc_version-0.4.1.bazel"), + ) + maybe( http_archive, name = "vendor_ts__rustversion-1.0.22", @@ -2823,32 +2875,32 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__salsa-0.23.0", - sha256 = "2e235afdb8e510f38a07138fbe5a0b64691894358a9c0cbd813b1aade110efc9", + name = "vendor_ts__salsa-0.25.2", + sha256 = "e2e2aa2fca57727371eeafc975acc8e6f4c52f8166a78035543f6ee1c74c2dcc", type = "tar.gz", - urls = ["https://static.crates.io/crates/salsa/0.23.0/download"], - strip_prefix = "salsa-0.23.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.salsa-0.23.0.bazel"), + urls = ["https://static.crates.io/crates/salsa/0.25.2/download"], + strip_prefix = "salsa-0.25.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.salsa-0.25.2.bazel"), ) maybe( http_archive, - name = "vendor_ts__salsa-macro-rules-0.23.0", - sha256 = "2edb86a7e9c91f6d30c9ce054312721dbe773a162db27bbfae834d16177b30ce", + name = "vendor_ts__salsa-macro-rules-0.25.2", + sha256 = "1bfc2a1e7bf06964105515451d728f2422dedc3a112383324a00b191a5c397a3", type = "tar.gz", - urls = ["https://static.crates.io/crates/salsa-macro-rules/0.23.0/download"], - strip_prefix = "salsa-macro-rules-0.23.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.salsa-macro-rules-0.23.0.bazel"), + urls = ["https://static.crates.io/crates/salsa-macro-rules/0.25.2/download"], + strip_prefix = "salsa-macro-rules-0.25.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.salsa-macro-rules-0.25.2.bazel"), ) maybe( http_archive, - name = "vendor_ts__salsa-macros-0.23.0", - sha256 = "d0778d6e209051bc4e75acfe83bcd7848601ec3dbe9c3dbb982829020e9128af", + name = "vendor_ts__salsa-macros-0.25.2", + sha256 = "3d844c1aa34946da46af683b5c27ec1088a3d9d84a2b837a108223fd830220e1", type = "tar.gz", - urls = ["https://static.crates.io/crates/salsa-macros/0.23.0/download"], - strip_prefix = "salsa-macros-0.23.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.salsa-macros-0.23.0.bazel"), + urls = ["https://static.crates.io/crates/salsa-macros/0.25.2/download"], + strip_prefix = "salsa-macros-0.25.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.salsa-macros-0.25.2.bazel"), ) maybe( @@ -2881,16 +2933,6 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.schemars-1.0.4.bazel"), ) - maybe( - http_archive, - name = "vendor_ts__scoped-tls-1.0.1", - sha256 = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294", - type = "tar.gz", - urls = ["https://static.crates.io/crates/scoped-tls/1.0.1/download"], - strip_prefix = "scoped-tls-1.0.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.scoped-tls-1.0.1.bazel"), - ) - maybe( http_archive, name = "vendor_ts__scopeguard-1.2.0", @@ -2903,22 +2945,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__seize-0.5.0", - sha256 = "e4b8d813387d566f627f3ea1b914c068aac94c40ae27ec43f5f33bde65abefe7", + name = "vendor_ts__semver-1.0.28", + sha256 = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd", type = "tar.gz", - urls = ["https://static.crates.io/crates/seize/0.5.0/download"], - strip_prefix = "seize-0.5.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.seize-0.5.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__semver-1.0.26", - sha256 = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0", - type = "tar.gz", - urls = ["https://static.crates.io/crates/semver/1.0.26/download"], - strip_prefix = "semver-1.0.26", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.semver-1.0.26.bazel"), + urls = ["https://static.crates.io/crates/semver/1.0.28/download"], + strip_prefix = "semver-1.0.28", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.semver-1.0.28.bazel"), ) maybe( @@ -2931,26 +2963,6 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde-1.0.228.bazel"), ) - maybe( - http_archive, - name = "vendor_ts__serde-untagged-0.1.8", - sha256 = "34836a629bcbc6f1afdf0907a744870039b1e14c0561cb26094fa683b158eff3", - type = "tar.gz", - urls = ["https://static.crates.io/crates/serde-untagged/0.1.8/download"], - strip_prefix = "serde-untagged-0.1.8", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde-untagged-0.1.8.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__serde-value-0.7.0", - sha256 = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c", - type = "tar.gz", - urls = ["https://static.crates.io/crates/serde-value/0.7.0/download"], - strip_prefix = "serde-value-0.7.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde-value-0.7.0.bazel"), - ) - maybe( http_archive, name = "vendor_ts__serde_core-1.0.228", @@ -2973,52 +2985,42 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__serde_json-1.0.145", - sha256 = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c", - type = "tar.gz", - urls = ["https://static.crates.io/crates/serde_json/1.0.145/download"], - strip_prefix = "serde_json-1.0.145", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_json-1.0.145.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__serde_spanned-0.6.9", - sha256 = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3", + name = "vendor_ts__serde_json-1.0.149", + sha256 = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86", type = "tar.gz", - urls = ["https://static.crates.io/crates/serde_spanned/0.6.9/download"], - strip_prefix = "serde_spanned-0.6.9", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_spanned-0.6.9.bazel"), + urls = ["https://static.crates.io/crates/serde_json/1.0.149/download"], + strip_prefix = "serde_json-1.0.149", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_json-1.0.149.bazel"), ) maybe( http_archive, - name = "vendor_ts__serde_spanned-1.0.2", - sha256 = "5417783452c2be558477e104686f7de5dae53dba813c28435e0e70f82d9b04ee", + name = "vendor_ts__serde_spanned-1.1.1", + sha256 = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26", type = "tar.gz", - urls = ["https://static.crates.io/crates/serde_spanned/1.0.2/download"], - strip_prefix = "serde_spanned-1.0.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_spanned-1.0.2.bazel"), + urls = ["https://static.crates.io/crates/serde_spanned/1.1.1/download"], + strip_prefix = "serde_spanned-1.1.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_spanned-1.1.1.bazel"), ) maybe( http_archive, - name = "vendor_ts__serde_with-3.14.1", - sha256 = "c522100790450cf78eeac1507263d0a350d4d5b30df0c8e1fe051a10c22b376e", + name = "vendor_ts__serde_with-3.18.0", + sha256 = "dd5414fad8e6907dbdd5bc441a50ae8d6e26151a03b1de04d89a5576de61d01f", type = "tar.gz", - urls = ["https://static.crates.io/crates/serde_with/3.14.1/download"], - strip_prefix = "serde_with-3.14.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_with-3.14.1.bazel"), + urls = ["https://static.crates.io/crates/serde_with/3.18.0/download"], + strip_prefix = "serde_with-3.18.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_with-3.18.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__serde_with_macros-3.14.1", - sha256 = "327ada00f7d64abaac1e55a6911e90cf665aa051b9a561c7006c157f4633135e", + name = "vendor_ts__serde_with_macros-3.18.0", + sha256 = "d3db8978e608f1fe7357e211969fd9abdcae80bac1ba7a3369bb7eb6b404eb65", type = "tar.gz", - urls = ["https://static.crates.io/crates/serde_with_macros/3.14.1/download"], - strip_prefix = "serde_with_macros-3.14.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_with_macros-3.14.1.bazel"), + urls = ["https://static.crates.io/crates/serde_with_macros/3.18.0/download"], + strip_prefix = "serde_with_macros-3.18.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_with_macros-3.18.0.bazel"), ) maybe( @@ -3063,22 +3065,32 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__smol_str-0.3.2", - sha256 = "9676b89cd56310a87b93dec47b11af744f34d5fc9f367b829474eec0a891350d", + name = "vendor_ts__smol_str-0.3.6", + sha256 = "4aaa7368fcf4852a4c2dd92df0cace6a71f2091ca0a23391ce7f3a31833f1523", type = "tar.gz", - urls = ["https://static.crates.io/crates/smol_str/0.3.2/download"], - strip_prefix = "smol_str-0.3.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.smol_str-0.3.2.bazel"), + urls = ["https://static.crates.io/crates/smol_str/0.3.6/download"], + strip_prefix = "smol_str-0.3.6", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.smol_str-0.3.6.bazel"), ) maybe( http_archive, - name = "vendor_ts__stable_deref_trait-1.2.0", - sha256 = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3", + name = "vendor_ts__spin-0.9.8", + sha256 = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67", type = "tar.gz", - urls = ["https://static.crates.io/crates/stable_deref_trait/1.2.0/download"], - strip_prefix = "stable_deref_trait-1.2.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.stable_deref_trait-1.2.0.bazel"), + urls = ["https://static.crates.io/crates/spin/0.9.8/download"], + strip_prefix = "spin-0.9.8", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.spin-0.9.8.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__stable_deref_trait-1.2.1", + sha256 = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596", + type = "tar.gz", + urls = ["https://static.crates.io/crates/stable_deref_trait/1.2.1/download"], + strip_prefix = "stable_deref_trait-1.2.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.stable_deref_trait-1.2.1.bazel"), ) maybe( @@ -3103,12 +3115,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__syn-2.0.106", - sha256 = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6", + name = "vendor_ts__syn-2.0.117", + sha256 = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99", type = "tar.gz", - urls = ["https://static.crates.io/crates/syn/2.0.106/download"], - strip_prefix = "syn-2.0.106", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.syn-2.0.106.bazel"), + urls = ["https://static.crates.io/crates/syn/2.0.117/download"], + strip_prefix = "syn-2.0.117", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.syn-2.0.117.bazel"), ) maybe( @@ -3153,22 +3165,22 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__thiserror-2.0.16", - sha256 = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0", + name = "vendor_ts__thiserror-2.0.18", + sha256 = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4", type = "tar.gz", - urls = ["https://static.crates.io/crates/thiserror/2.0.16/download"], - strip_prefix = "thiserror-2.0.16", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.thiserror-2.0.16.bazel"), + urls = ["https://static.crates.io/crates/thiserror/2.0.18/download"], + strip_prefix = "thiserror-2.0.18", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.thiserror-2.0.18.bazel"), ) maybe( http_archive, - name = "vendor_ts__thiserror-impl-2.0.16", - sha256 = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960", + name = "vendor_ts__thiserror-impl-2.0.18", + sha256 = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5", type = "tar.gz", - urls = ["https://static.crates.io/crates/thiserror-impl/2.0.16/download"], - strip_prefix = "thiserror-impl-2.0.16", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.thiserror-impl-2.0.16.bazel"), + urls = ["https://static.crates.io/crates/thiserror-impl/2.0.18/download"], + strip_prefix = "thiserror-impl-2.0.18", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.thiserror-impl-2.0.18.bazel"), ) maybe( @@ -3183,152 +3195,122 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__time-0.3.43", - sha256 = "83bde6f1ec10e72d583d91623c939f623002284ef622b87de38cfd546cbf2031", - type = "tar.gz", - urls = ["https://static.crates.io/crates/time/0.3.43/download"], - strip_prefix = "time-0.3.43", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.time-0.3.43.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__time-core-0.1.6", - sha256 = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b", + name = "vendor_ts__time-0.3.47", + sha256 = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c", type = "tar.gz", - urls = ["https://static.crates.io/crates/time-core/0.1.6/download"], - strip_prefix = "time-core-0.1.6", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.time-core-0.1.6.bazel"), + urls = ["https://static.crates.io/crates/time/0.3.47/download"], + strip_prefix = "time-0.3.47", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.time-0.3.47.bazel"), ) maybe( http_archive, - name = "vendor_ts__time-macros-0.2.24", - sha256 = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3", + name = "vendor_ts__time-core-0.1.8", + sha256 = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca", type = "tar.gz", - urls = ["https://static.crates.io/crates/time-macros/0.2.24/download"], - strip_prefix = "time-macros-0.2.24", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.time-macros-0.2.24.bazel"), + urls = ["https://static.crates.io/crates/time-core/0.1.8/download"], + strip_prefix = "time-core-0.1.8", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.time-core-0.1.8.bazel"), ) maybe( http_archive, - name = "vendor_ts__tinystr-0.8.1", - sha256 = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b", + name = "vendor_ts__time-macros-0.2.27", + sha256 = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215", type = "tar.gz", - urls = ["https://static.crates.io/crates/tinystr/0.8.1/download"], - strip_prefix = "tinystr-0.8.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tinystr-0.8.1.bazel"), + urls = ["https://static.crates.io/crates/time-macros/0.2.27/download"], + strip_prefix = "time-macros-0.2.27", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.time-macros-0.2.27.bazel"), ) maybe( http_archive, - name = "vendor_ts__toml-0.8.23", - sha256 = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362", + name = "vendor_ts__toml-0.9.12-spec-1.1.0", + sha256 = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863", type = "tar.gz", - urls = ["https://static.crates.io/crates/toml/0.8.23/download"], - strip_prefix = "toml-0.8.23", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml-0.8.23.bazel"), + urls = ["https://static.crates.io/crates/toml/0.9.12+spec-1.1.0/download"], + strip_prefix = "toml-0.9.12+spec-1.1.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml-0.9.12+spec-1.1.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__toml-0.9.7", - sha256 = "00e5e5d9bf2475ac9d4f0d9edab68cc573dc2fd644b0dba36b0c30a92dd9eaa0", + name = "vendor_ts__toml-1.1.2-spec-1.1.0", + sha256 = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee", type = "tar.gz", - urls = ["https://static.crates.io/crates/toml/0.9.7/download"], - strip_prefix = "toml-0.9.7", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml-0.9.7.bazel"), + urls = ["https://static.crates.io/crates/toml/1.1.2+spec-1.1.0/download"], + strip_prefix = "toml-1.1.2+spec-1.1.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml-1.1.2+spec-1.1.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__toml_datetime-0.6.11", - sha256 = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c", + name = "vendor_ts__toml_datetime-0.7.5-spec-1.1.0", + sha256 = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347", type = "tar.gz", - urls = ["https://static.crates.io/crates/toml_datetime/0.6.11/download"], - strip_prefix = "toml_datetime-0.6.11", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml_datetime-0.6.11.bazel"), + urls = ["https://static.crates.io/crates/toml_datetime/0.7.5+spec-1.1.0/download"], + strip_prefix = "toml_datetime-0.7.5+spec-1.1.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml_datetime-0.7.5+spec-1.1.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__toml_datetime-0.7.2", - sha256 = "32f1085dec27c2b6632b04c80b3bb1b4300d6495d1e129693bdda7d91e72eec1", + name = "vendor_ts__toml_datetime-1.1.1-spec-1.1.0", + sha256 = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7", type = "tar.gz", - urls = ["https://static.crates.io/crates/toml_datetime/0.7.2/download"], - strip_prefix = "toml_datetime-0.7.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml_datetime-0.7.2.bazel"), + urls = ["https://static.crates.io/crates/toml_datetime/1.1.1+spec-1.1.0/download"], + strip_prefix = "toml_datetime-1.1.1+spec-1.1.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml_datetime-1.1.1+spec-1.1.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__toml_edit-0.22.27", - sha256 = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a", + name = "vendor_ts__toml_parser-1.1.2-spec-1.1.0", + sha256 = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526", type = "tar.gz", - urls = ["https://static.crates.io/crates/toml_edit/0.22.27/download"], - strip_prefix = "toml_edit-0.22.27", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml_edit-0.22.27.bazel"), + urls = ["https://static.crates.io/crates/toml_parser/1.1.2+spec-1.1.0/download"], + strip_prefix = "toml_parser-1.1.2+spec-1.1.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml_parser-1.1.2+spec-1.1.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__toml_parser-1.0.3", - sha256 = "4cf893c33be71572e0e9aa6dd15e6677937abd686b066eac3f8cd3531688a627", + name = "vendor_ts__toml_writer-1.1.1-spec-1.1.0", + sha256 = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db", type = "tar.gz", - urls = ["https://static.crates.io/crates/toml_parser/1.0.3/download"], - strip_prefix = "toml_parser-1.0.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml_parser-1.0.3.bazel"), + urls = ["https://static.crates.io/crates/toml_writer/1.1.1+spec-1.1.0/download"], + strip_prefix = "toml_writer-1.1.1+spec-1.1.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml_writer-1.1.1+spec-1.1.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__toml_write-0.1.2", - sha256 = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801", + name = "vendor_ts__tracing-0.1.44", + sha256 = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100", type = "tar.gz", - urls = ["https://static.crates.io/crates/toml_write/0.1.2/download"], - strip_prefix = "toml_write-0.1.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml_write-0.1.2.bazel"), + urls = ["https://static.crates.io/crates/tracing/0.1.44/download"], + strip_prefix = "tracing-0.1.44", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tracing-0.1.44.bazel"), ) maybe( http_archive, - name = "vendor_ts__toml_writer-1.0.3", - sha256 = "d163a63c116ce562a22cda521fcc4d79152e7aba014456fb5eb442f6d6a10109", + name = "vendor_ts__tracing-attributes-0.1.31", + sha256 = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da", type = "tar.gz", - urls = ["https://static.crates.io/crates/toml_writer/1.0.3/download"], - strip_prefix = "toml_writer-1.0.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml_writer-1.0.3.bazel"), + urls = ["https://static.crates.io/crates/tracing-attributes/0.1.31/download"], + strip_prefix = "tracing-attributes-0.1.31", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tracing-attributes-0.1.31.bazel"), ) maybe( http_archive, - name = "vendor_ts__tracing-0.1.41", - sha256 = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0", + name = "vendor_ts__tracing-core-0.1.36", + sha256 = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a", type = "tar.gz", - urls = ["https://static.crates.io/crates/tracing/0.1.41/download"], - strip_prefix = "tracing-0.1.41", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tracing-0.1.41.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__tracing-attributes-0.1.30", - sha256 = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903", - type = "tar.gz", - urls = ["https://static.crates.io/crates/tracing-attributes/0.1.30/download"], - strip_prefix = "tracing-attributes-0.1.30", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tracing-attributes-0.1.30.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__tracing-core-0.1.34", - sha256 = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678", - type = "tar.gz", - urls = ["https://static.crates.io/crates/tracing-core/0.1.34/download"], - strip_prefix = "tracing-core-0.1.34", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tracing-core-0.1.34.bazel"), + urls = ["https://static.crates.io/crates/tracing-core/0.1.36/download"], + strip_prefix = "tracing-core-0.1.36", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tracing-core-0.1.36.bazel"), ) maybe( @@ -3353,12 +3335,22 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__tracing-subscriber-0.3.20", - sha256 = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5", + name = "vendor_ts__tracing-subscriber-0.3.23", + sha256 = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319", type = "tar.gz", - urls = ["https://static.crates.io/crates/tracing-subscriber/0.3.20/download"], - strip_prefix = "tracing-subscriber-0.3.20", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tracing-subscriber-0.3.20.bazel"), + urls = ["https://static.crates.io/crates/tracing-subscriber/0.3.23/download"], + strip_prefix = "tracing-subscriber-0.3.23", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tracing-subscriber-0.3.23.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__tracing-tree-0.4.1", + sha256 = "ac87aa03b6a4d5a7e4810d1a80c19601dbe0f8a837e9177f23af721c7ba7beec", + type = "tar.gz", + urls = ["https://static.crates.io/crates/tracing-tree/0.4.1/download"], + strip_prefix = "tracing-tree-0.4.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tracing-tree-0.4.1.bazel"), ) maybe( @@ -3423,12 +3415,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__triomphe-0.1.14", - sha256 = "ef8f7726da4807b58ea5c96fdc122f80702030edc33b35aff9190a51148ccc85", + name = "vendor_ts__triomphe-0.1.15", + sha256 = "dd69c5aa8f924c7519d6372789a74eac5b94fb0f8fcf0d4a97eb0bfc3e785f39", type = "tar.gz", - urls = ["https://static.crates.io/crates/triomphe/0.1.14/download"], - strip_prefix = "triomphe-0.1.14", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.triomphe-0.1.14.bazel"), + urls = ["https://static.crates.io/crates/triomphe/0.1.15/download"], + strip_prefix = "triomphe-0.1.15", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.triomphe-0.1.15.bazel"), ) maybe( @@ -3441,16 +3433,6 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.typed-arena-2.0.2.bazel"), ) - maybe( - http_archive, - name = "vendor_ts__typeid-1.0.3", - sha256 = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c", - type = "tar.gz", - urls = ["https://static.crates.io/crates/typeid/1.0.3/download"], - strip_prefix = "typeid-1.0.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.typeid-1.0.3.bazel"), - ) - maybe( http_archive, name = "vendor_ts__uncased-0.9.10", @@ -3473,12 +3455,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__unicode-ident-1.0.19", - sha256 = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d", + name = "vendor_ts__unicode-ident-1.0.24", + sha256 = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75", type = "tar.gz", - urls = ["https://static.crates.io/crates/unicode-ident/1.0.19/download"], - strip_prefix = "unicode-ident-1.0.19", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.unicode-ident-1.0.19.bazel"), + urls = ["https://static.crates.io/crates/unicode-ident/1.0.24/download"], + strip_prefix = "unicode-ident-1.0.24", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.unicode-ident-1.0.24.bazel"), ) maybe( @@ -3511,26 +3493,6 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.unsafe-libyaml-0.2.11.bazel"), ) - maybe( - http_archive, - name = "vendor_ts__url-2.5.7", - sha256 = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b", - type = "tar.gz", - urls = ["https://static.crates.io/crates/url/2.5.7/download"], - strip_prefix = "url-2.5.7", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.url-2.5.7.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__utf8_iter-1.0.4", - sha256 = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be", - type = "tar.gz", - urls = ["https://static.crates.io/crates/utf8_iter/1.0.4/download"], - strip_prefix = "utf8_iter-1.0.4", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.utf8_iter-1.0.4.bazel"), - ) - maybe( http_archive, name = "vendor_ts__utf8parse-0.2.2", @@ -3581,16 +3543,6 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wasi-0.11.1+wasi-snapshot-preview1.bazel"), ) - maybe( - http_archive, - name = "vendor_ts__wasi-0.14.5-wasi-0.2.4", - sha256 = "a4494f6290a82f5fe584817a676a34b9d6763e8d9d18204009fb31dceca98fd4", - type = "tar.gz", - urls = ["https://static.crates.io/crates/wasi/0.14.5+wasi-0.2.4/download"], - strip_prefix = "wasi-0.14.5+wasi-0.2.4", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wasi-0.14.5+wasi-0.2.4.bazel"), - ) - maybe( http_archive, name = "vendor_ts__wasip2-1.0.0-wasi-0.2.4", @@ -3601,6 +3553,16 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wasip2-1.0.0+wasi-0.2.4.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__wasip3-0.4.0-wasi-0.3.0-rc-2026-01-06", + sha256 = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5", + type = "tar.gz", + urls = ["https://static.crates.io/crates/wasip3/0.4.0+wasi-0.3.0-rc-2026-01-06/download"], + strip_prefix = "wasip3-0.4.0+wasi-0.3.0-rc-2026-01-06", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wasip3-0.4.0+wasi-0.3.0-rc-2026-01-06.bazel"), + ) + maybe( http_archive, name = "vendor_ts__wasm-bindgen-0.2.101", @@ -3651,6 +3613,36 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wasm-bindgen-shared-0.2.101.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__wasm-encoder-0.244.0", + sha256 = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319", + type = "tar.gz", + urls = ["https://static.crates.io/crates/wasm-encoder/0.244.0/download"], + strip_prefix = "wasm-encoder-0.244.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wasm-encoder-0.244.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__wasm-metadata-0.244.0", + sha256 = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909", + type = "tar.gz", + urls = ["https://static.crates.io/crates/wasm-metadata/0.244.0/download"], + strip_prefix = "wasm-metadata-0.244.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wasm-metadata-0.244.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__wasmparser-0.244.0", + sha256 = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe", + type = "tar.gz", + urls = ["https://static.crates.io/crates/wasmparser/0.244.0/download"], + strip_prefix = "wasmparser-0.244.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wasmparser-0.244.0.bazel"), + ) + maybe( http_archive, name = "vendor_ts__winapi-util-0.1.11", @@ -3741,16 +3733,6 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows-sys-0.52.0.bazel"), ) - maybe( - http_archive, - name = "vendor_ts__windows-sys-0.59.0", - sha256 = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b", - type = "tar.gz", - urls = ["https://static.crates.io/crates/windows-sys/0.59.0/download"], - strip_prefix = "windows-sys-0.59.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows-sys-0.59.0.bazel"), - ) - maybe( http_archive, name = "vendor_ts__windows-sys-0.60.2", @@ -3953,132 +3935,112 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__winnow-0.7.13", - sha256 = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf", - type = "tar.gz", - urls = ["https://static.crates.io/crates/winnow/0.7.13/download"], - strip_prefix = "winnow-0.7.13", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.winnow-0.7.13.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__wit-bindgen-0.45.1", - sha256 = "5c573471f125075647d03df72e026074b7203790d41351cd6edc96f46bcccd36", + name = "vendor_ts__winnow-0.7.15", + sha256 = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945", type = "tar.gz", - urls = ["https://static.crates.io/crates/wit-bindgen/0.45.1/download"], - strip_prefix = "wit-bindgen-0.45.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wit-bindgen-0.45.1.bazel"), + urls = ["https://static.crates.io/crates/winnow/0.7.15/download"], + strip_prefix = "winnow-0.7.15", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.winnow-0.7.15.bazel"), ) maybe( http_archive, - name = "vendor_ts__writeable-0.6.1", - sha256 = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb", + name = "vendor_ts__winnow-1.0.1", + sha256 = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5", type = "tar.gz", - urls = ["https://static.crates.io/crates/writeable/0.6.1/download"], - strip_prefix = "writeable-0.6.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.writeable-0.6.1.bazel"), + urls = ["https://static.crates.io/crates/winnow/1.0.1/download"], + strip_prefix = "winnow-1.0.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.winnow-1.0.1.bazel"), ) maybe( http_archive, - name = "vendor_ts__yansi-1.0.1", - sha256 = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049", - type = "tar.gz", - urls = ["https://static.crates.io/crates/yansi/1.0.1/download"], - strip_prefix = "yansi-1.0.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.yansi-1.0.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__yoke-0.8.0", - sha256 = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc", + name = "vendor_ts__wit-bindgen-0.45.1", + sha256 = "5c573471f125075647d03df72e026074b7203790d41351cd6edc96f46bcccd36", type = "tar.gz", - urls = ["https://static.crates.io/crates/yoke/0.8.0/download"], - strip_prefix = "yoke-0.8.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.yoke-0.8.0.bazel"), + urls = ["https://static.crates.io/crates/wit-bindgen/0.45.1/download"], + strip_prefix = "wit-bindgen-0.45.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wit-bindgen-0.45.1.bazel"), ) maybe( http_archive, - name = "vendor_ts__yoke-derive-0.8.0", - sha256 = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6", + name = "vendor_ts__wit-bindgen-0.51.0", + sha256 = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5", type = "tar.gz", - urls = ["https://static.crates.io/crates/yoke-derive/0.8.0/download"], - strip_prefix = "yoke-derive-0.8.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.yoke-derive-0.8.0.bazel"), + urls = ["https://static.crates.io/crates/wit-bindgen/0.51.0/download"], + strip_prefix = "wit-bindgen-0.51.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wit-bindgen-0.51.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__zerocopy-0.8.27", - sha256 = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c", + name = "vendor_ts__wit-bindgen-core-0.51.0", + sha256 = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc", type = "tar.gz", - urls = ["https://static.crates.io/crates/zerocopy/0.8.27/download"], - strip_prefix = "zerocopy-0.8.27", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.zerocopy-0.8.27.bazel"), + urls = ["https://static.crates.io/crates/wit-bindgen-core/0.51.0/download"], + strip_prefix = "wit-bindgen-core-0.51.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wit-bindgen-core-0.51.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__zerocopy-derive-0.8.27", - sha256 = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831", + name = "vendor_ts__wit-bindgen-rust-0.51.0", + sha256 = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21", type = "tar.gz", - urls = ["https://static.crates.io/crates/zerocopy-derive/0.8.27/download"], - strip_prefix = "zerocopy-derive-0.8.27", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.zerocopy-derive-0.8.27.bazel"), + urls = ["https://static.crates.io/crates/wit-bindgen-rust/0.51.0/download"], + strip_prefix = "wit-bindgen-rust-0.51.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wit-bindgen-rust-0.51.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__zerofrom-0.1.6", - sha256 = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5", + name = "vendor_ts__wit-bindgen-rust-macro-0.51.0", + sha256 = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a", type = "tar.gz", - urls = ["https://static.crates.io/crates/zerofrom/0.1.6/download"], - strip_prefix = "zerofrom-0.1.6", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.zerofrom-0.1.6.bazel"), + urls = ["https://static.crates.io/crates/wit-bindgen-rust-macro/0.51.0/download"], + strip_prefix = "wit-bindgen-rust-macro-0.51.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wit-bindgen-rust-macro-0.51.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__zerofrom-derive-0.1.6", - sha256 = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502", + name = "vendor_ts__wit-component-0.244.0", + sha256 = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2", type = "tar.gz", - urls = ["https://static.crates.io/crates/zerofrom-derive/0.1.6/download"], - strip_prefix = "zerofrom-derive-0.1.6", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.zerofrom-derive-0.1.6.bazel"), + urls = ["https://static.crates.io/crates/wit-component/0.244.0/download"], + strip_prefix = "wit-component-0.244.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wit-component-0.244.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__zerotrie-0.2.2", - sha256 = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595", + name = "vendor_ts__wit-parser-0.244.0", + sha256 = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736", type = "tar.gz", - urls = ["https://static.crates.io/crates/zerotrie/0.2.2/download"], - strip_prefix = "zerotrie-0.2.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.zerotrie-0.2.2.bazel"), + urls = ["https://static.crates.io/crates/wit-parser/0.244.0/download"], + strip_prefix = "wit-parser-0.244.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wit-parser-0.244.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__zerovec-0.11.4", - sha256 = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b", + name = "vendor_ts__yansi-1.0.1", + sha256 = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049", type = "tar.gz", - urls = ["https://static.crates.io/crates/zerovec/0.11.4/download"], - strip_prefix = "zerovec-0.11.4", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.zerovec-0.11.4.bazel"), + urls = ["https://static.crates.io/crates/yansi/1.0.1/download"], + strip_prefix = "yansi-1.0.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.yansi-1.0.1.bazel"), ) maybe( http_archive, - name = "vendor_ts__zerovec-derive-0.11.1", - sha256 = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f", + name = "vendor_ts__zmij-1.0.21", + sha256 = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa", type = "tar.gz", - urls = ["https://static.crates.io/crates/zerovec-derive/0.11.1/download"], - strip_prefix = "zerovec-derive-0.11.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.zerovec-derive-0.11.1.bazel"), + urls = ["https://static.crates.io/crates/zmij/1.0.21/download"], + strip_prefix = "zmij-1.0.21", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.zmij-1.0.21.bazel"), ) maybe( @@ -4112,11 +4074,11 @@ def crate_repositories(): ) return [ - struct(repo = "vendor_ts__anyhow-1.0.100", is_dev_dep = False), - struct(repo = "vendor_ts__argfile-0.2.1", is_dev_dep = False), + struct(repo = "vendor_ts__anyhow-1.0.102", is_dev_dep = False), + struct(repo = "vendor_ts__argfile-1.0.0", is_dev_dep = False), struct(repo = "vendor_ts__chalk-ir-0.104.0", is_dev_dep = False), - struct(repo = "vendor_ts__chrono-0.4.42", is_dev_dep = False), - struct(repo = "vendor_ts__clap-4.5.48", is_dev_dep = False), + struct(repo = "vendor_ts__chrono-0.4.44", is_dev_dep = False), + struct(repo = "vendor_ts__clap-4.6.0", is_dev_dep = False), struct(repo = "vendor_ts__dunce-1.0.5", is_dev_dep = False), struct(repo = "vendor_ts__either-1.15.0", is_dev_dep = False), struct(repo = "vendor_ts__encoding-0.2.33", is_dev_dep = False), @@ -4129,41 +4091,41 @@ def crate_repositories(): struct(repo = "vendor_ts__mustache-0.9.0", is_dev_dep = False), struct(repo = "vendor_ts__num-traits-0.2.19", is_dev_dep = False), struct(repo = "vendor_ts__num_cpus-1.17.0", is_dev_dep = False), - struct(repo = "vendor_ts__proc-macro2-1.0.101", is_dev_dep = False), - struct(repo = "vendor_ts__quote-1.0.41", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_base_db-0.0.301", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_cfg-0.0.301", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_hir-0.0.301", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_hir_def-0.0.301", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_hir_expand-0.0.301", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_hir_ty-0.0.301", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_ide_db-0.0.301", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_intern-0.0.301", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_load-cargo-0.0.301", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_parser-0.0.301", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_paths-0.0.301", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_project_model-0.0.301", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_span-0.0.301", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_stdx-0.0.301", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_syntax-0.0.301", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_vfs-0.0.301", is_dev_dep = False), - struct(repo = "vendor_ts__rayon-1.11.0", is_dev_dep = False), - struct(repo = "vendor_ts__regex-1.11.3", is_dev_dep = False), + struct(repo = "vendor_ts__proc-macro2-1.0.106", is_dev_dep = False), + struct(repo = "vendor_ts__quote-1.0.45", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_base_db-0.0.328", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_cfg-0.0.328", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_hir-0.0.328", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_hir_def-0.0.328", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_hir_expand-0.0.328", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_hir_ty-0.0.328", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_ide_db-0.0.328", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_intern-0.0.328", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_load-cargo-0.0.328", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_parser-0.0.328", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_paths-0.0.328", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_project_model-0.0.328", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_span-0.0.328", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_stdx-0.0.328", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_syntax-0.0.328", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_vfs-0.0.328", is_dev_dep = False), + struct(repo = "vendor_ts__rayon-1.12.0", is_dev_dep = False), + struct(repo = "vendor_ts__regex-1.12.3", is_dev_dep = False), struct(repo = "vendor_ts__serde-1.0.228", is_dev_dep = False), - struct(repo = "vendor_ts__serde_json-1.0.145", is_dev_dep = False), - struct(repo = "vendor_ts__serde_with-3.14.1", is_dev_dep = False), - struct(repo = "vendor_ts__syn-2.0.106", is_dev_dep = False), - struct(repo = "vendor_ts__toml-0.9.7", is_dev_dep = False), - struct(repo = "vendor_ts__tracing-0.1.41", is_dev_dep = False), + struct(repo = "vendor_ts__serde_json-1.0.149", is_dev_dep = False), + struct(repo = "vendor_ts__serde_with-3.18.0", is_dev_dep = False), + struct(repo = "vendor_ts__syn-2.0.117", is_dev_dep = False), + struct(repo = "vendor_ts__toml-1.1.2-spec-1.1.0", is_dev_dep = False), + struct(repo = "vendor_ts__tracing-0.1.44", is_dev_dep = False), struct(repo = "vendor_ts__tracing-flame-0.2.0", is_dev_dep = False), - struct(repo = "vendor_ts__tracing-subscriber-0.3.20", is_dev_dep = False), + struct(repo = "vendor_ts__tracing-subscriber-0.3.23", is_dev_dep = False), struct(repo = "vendor_ts__tree-sitter-0.25.9", is_dev_dep = False), struct(repo = "vendor_ts__tree-sitter-embedded-template-0.25.0", is_dev_dep = False), struct(repo = "vendor_ts__tree-sitter-ruby-0.23.1", is_dev_dep = False), - struct(repo = "vendor_ts__triomphe-0.1.14", is_dev_dep = False), + struct(repo = "vendor_ts__triomphe-0.1.15", is_dev_dep = False), struct(repo = "vendor_ts__ungrammar-1.16.1", is_dev_dep = False), struct(repo = "vendor_ts__zstd-0.13.3", is_dev_dep = False), - struct(repo = "vendor_ts__rand-0.9.2", is_dev_dep = True), + struct(repo = "vendor_ts__rand-0.10.1", is_dev_dep = True), struct(repo = "vendor_ts__tree-sitter-json-0.24.8", is_dev_dep = True), struct(repo = "vendor_ts__tree-sitter-ql-0.23.1", is_dev_dep = True), ] From 5f76c946deeec685a4e93fc60a2f4fec58ec8725 Mon Sep 17 00:00:00 2001 From: Taus Date: Wed, 15 Apr 2026 13:11:27 +0000 Subject: [PATCH 0007/2098] Rust: update rust-analyzer source and run codegen --- MODULE.bazel | 4 +- .../ast-generator/patches/rust-analyzer.patch | 20 +- rust/ast-generator/src/main.rs | 8 +- rust/extractor/src/generated/.generated.list | 2 +- rust/extractor/src/generated/top.rs | 801 ++++++++++++++---- rust/extractor/src/translate/generated.rs | 231 +++-- rust/ql/.generated.list | 100 ++- rust/ql/.gitattributes | 60 +- .../internal/generated/CfgNodes.qll | 49 +- rust/ql/lib/codeql/rust/elements.qll | 12 +- .../ql/lib/codeql/rust/elements/BlockExpr.qll | 1 + rust/ql/lib/codeql/rust/elements/CfgAtom.qll | 9 + .../lib/codeql/rust/elements/CfgAttrMeta.qll | 10 + .../lib/codeql/rust/elements/CfgComposite.qll | 9 + rust/ql/lib/codeql/rust/elements/CfgMeta.qll | 10 + .../lib/codeql/rust/elements/CfgPredicate.qll | 9 + .../codeql/rust/elements/FormatArgsArg.qll | 2 +- .../rust/elements/FormatArgsArgName.qll | 9 + .../lib/codeql/rust/elements/KeyValueMeta.qll | 11 + rust/ql/lib/codeql/rust/elements/Meta.qll | 3 - rust/ql/lib/codeql/rust/elements/PathMeta.qll | 10 + .../lib/codeql/rust/elements/StructField.qll | 2 +- .../codeql/rust/elements/TokenTreeMeta.qll | 11 + .../lib/codeql/rust/elements/TraitAlias.qll | 23 - .../codeql/rust/elements/TryBlockModifier.qll | 10 + .../lib/codeql/rust/elements/UnsafeMeta.qll | 9 + rust/ql/lib/codeql/rust/elements/Variant.qll | 2 +- ...Constructor.qll => CfgAtomConstructor.qll} | 6 +- .../{TraitAliasImpl.qll => CfgAtomImpl.qll} | 16 +- .../internal/CfgAttrMetaConstructor.qll | 14 + .../elements/internal/CfgAttrMetaImpl.qll | 16 + .../internal/CfgCompositeConstructor.qll | 14 + .../elements/internal/CfgCompositeImpl.qll | 16 + .../elements/internal/CfgMetaConstructor.qll | 14 + .../rust/elements/internal/CfgMetaImpl.qll | 16 + .../elements/internal/CfgPredicateImpl.qll | 16 + .../internal/FormatArgsArgNameConstructor.qll | 14 + .../internal/FormatArgsArgNameImpl.qll | 16 + .../internal/KeyValueMetaConstructor.qll | 14 + .../elements/internal/KeyValueMetaImpl.qll | 16 + .../elements/internal/PathMetaConstructor.qll | 14 + .../rust/elements/internal/PathMetaImpl.qll | 16 + .../internal/TokenTreeMetaConstructor.qll | 14 + .../elements/internal/TokenTreeMetaImpl.qll | 16 + .../internal/TryBlockModifierConstructor.qll | 14 + .../internal/TryBlockModifierImpl.qll | 16 + ...structor.qll => UnsafeMetaConstructor.qll} | 6 +- .../rust/elements/internal/UnsafeMetaImpl.qll | 16 + .../elements/internal/generated/BlockExpr.qll | 21 +- .../elements/internal/generated/CfgAtom.qll | 23 + .../internal/generated/CfgAttrMeta.qll | 60 ++ .../internal/generated/CfgComposite.qll | 44 + .../elements/internal/generated/CfgMeta.qll | 39 + .../internal/generated/CfgPredicate.qll | 21 + .../internal/generated/FormatArgsArg.qll | 26 +- .../internal/generated/FormatArgsArgName.qll | 23 + .../internal/generated/KeyValueMeta.qll | 55 ++ .../rust/elements/internal/generated/Meta.qll | 49 +- .../internal/generated/ParentChild.qll | 248 ++++-- .../elements/internal/generated/PathMeta.qll | 37 + .../rust/elements/internal/generated/Raw.qll | 469 ++++++---- .../internal/generated/StructField.qll | 14 +- .../elements/internal/generated/Synth.qll | 288 ++++++- .../internal/generated/SynthConstructors.qll | 12 +- .../internal/generated/TokenTreeMeta.qll | 55 ++ .../internal/generated/TraitAlias.qll | 128 --- .../internal/generated/TryBlockModifier.qll | 44 + .../internal/generated/UnsafeMeta.qll | 42 + .../elements/internal/generated/Variant.qll | 12 +- rust/ql/lib/rust.dbscheme | 227 +++-- .../generated/.generated_tests.list | 2 - .../extractor-tests/generated/.gitattributes | 2 - .../generated/BlockExpr/BlockExpr.ql | 10 +- .../generated/CfgAtom/MISSING_SOURCE.txt | 4 + .../generated/CfgAttrMeta/MISSING_SOURCE.txt | 4 + .../generated/CfgComposite/MISSING_SOURCE.txt | 4 + .../generated/CfgMeta/MISSING_SOURCE.txt | 4 + .../FormatArgsArgName/MISSING_SOURCE.txt | 4 + .../generated/FormatArgsExpr/FormatArgsArg.ql | 8 +- .../generated/KeyValueMeta/MISSING_SOURCE.txt | 4 + .../extractor-tests/generated/Meta/Meta.ql | 22 - .../generated/Meta/gen_meta.rs | 14 - .../generated/PathMeta/MISSING_SOURCE.txt | 4 + .../generated/StructField/StructField.ql | 4 +- .../TokenTreeMeta/MISSING_SOURCE.txt | 4 + .../generated/TraitAlias/TraitAlias.ql | 35 - .../generated/TraitAlias/gen_trait_alias.rs | 8 - .../TryBlockModifier/MISSING_SOURCE.txt | 4 + .../generated/UnsafeMeta/MISSING_SOURCE.txt | 4 + .../generated/Variant/Variant.ql | 4 +- rust/schema/annotations.py | 12 - rust/schema/ast.py | 61 +- 92 files changed, 2866 insertions(+), 1020 deletions(-) create mode 100644 rust/ql/lib/codeql/rust/elements/CfgAtom.qll create mode 100644 rust/ql/lib/codeql/rust/elements/CfgAttrMeta.qll create mode 100644 rust/ql/lib/codeql/rust/elements/CfgComposite.qll create mode 100644 rust/ql/lib/codeql/rust/elements/CfgMeta.qll create mode 100644 rust/ql/lib/codeql/rust/elements/CfgPredicate.qll create mode 100644 rust/ql/lib/codeql/rust/elements/FormatArgsArgName.qll create mode 100644 rust/ql/lib/codeql/rust/elements/KeyValueMeta.qll create mode 100644 rust/ql/lib/codeql/rust/elements/PathMeta.qll create mode 100644 rust/ql/lib/codeql/rust/elements/TokenTreeMeta.qll delete mode 100644 rust/ql/lib/codeql/rust/elements/TraitAlias.qll create mode 100644 rust/ql/lib/codeql/rust/elements/TryBlockModifier.qll create mode 100644 rust/ql/lib/codeql/rust/elements/UnsafeMeta.qll rename rust/ql/lib/codeql/rust/elements/internal/{MetaConstructor.qll => CfgAtomConstructor.qll} (64%) rename rust/ql/lib/codeql/rust/elements/internal/{TraitAliasImpl.qll => CfgAtomImpl.qll} (51%) create mode 100644 rust/ql/lib/codeql/rust/elements/internal/CfgAttrMetaConstructor.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/CfgAttrMetaImpl.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/CfgCompositeConstructor.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/CfgCompositeImpl.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/CfgMetaConstructor.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/CfgMetaImpl.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/CfgPredicateImpl.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/FormatArgsArgNameConstructor.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/FormatArgsArgNameImpl.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/KeyValueMetaConstructor.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/KeyValueMetaImpl.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/PathMetaConstructor.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/PathMetaImpl.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/TokenTreeMetaConstructor.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/TokenTreeMetaImpl.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/TryBlockModifierConstructor.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/TryBlockModifierImpl.qll rename rust/ql/lib/codeql/rust/elements/internal/{TraitAliasConstructor.qll => UnsafeMetaConstructor.qll} (64%) create mode 100644 rust/ql/lib/codeql/rust/elements/internal/UnsafeMetaImpl.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/generated/CfgAtom.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/generated/CfgAttrMeta.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/generated/CfgComposite.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/generated/CfgMeta.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/generated/CfgPredicate.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsArgName.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/generated/KeyValueMeta.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/generated/PathMeta.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/generated/TokenTreeMeta.qll delete mode 100644 rust/ql/lib/codeql/rust/elements/internal/generated/TraitAlias.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/generated/TryBlockModifier.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/generated/UnsafeMeta.qll create mode 100644 rust/ql/test/extractor-tests/generated/CfgAtom/MISSING_SOURCE.txt create mode 100644 rust/ql/test/extractor-tests/generated/CfgAttrMeta/MISSING_SOURCE.txt create mode 100644 rust/ql/test/extractor-tests/generated/CfgComposite/MISSING_SOURCE.txt create mode 100644 rust/ql/test/extractor-tests/generated/CfgMeta/MISSING_SOURCE.txt create mode 100644 rust/ql/test/extractor-tests/generated/FormatArgsArgName/MISSING_SOURCE.txt create mode 100644 rust/ql/test/extractor-tests/generated/KeyValueMeta/MISSING_SOURCE.txt delete mode 100644 rust/ql/test/extractor-tests/generated/Meta/Meta.ql delete mode 100644 rust/ql/test/extractor-tests/generated/Meta/gen_meta.rs create mode 100644 rust/ql/test/extractor-tests/generated/PathMeta/MISSING_SOURCE.txt create mode 100644 rust/ql/test/extractor-tests/generated/TokenTreeMeta/MISSING_SOURCE.txt delete mode 100644 rust/ql/test/extractor-tests/generated/TraitAlias/TraitAlias.ql delete mode 100644 rust/ql/test/extractor-tests/generated/TraitAlias/gen_trait_alias.rs create mode 100644 rust/ql/test/extractor-tests/generated/TryBlockModifier/MISSING_SOURCE.txt create mode 100644 rust/ql/test/extractor-tests/generated/UnsafeMeta/MISSING_SOURCE.txt diff --git a/MODULE.bazel b/MODULE.bazel index dfc9a0c9144a..7fda4b7e42c2 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -159,12 +159,12 @@ use_repo( http_archive = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") # rust-analyzer sources needed by the rust ast-generator (see `rust/ast-generator/README.md`) -RUST_ANALYZER_SRC_TAG = "2025-01-07" +RUST_ANALYZER_SRC_TAG = "2026-04-13" http_archive( name = "rust-analyzer-src", build_file = "//rust/ast-generator:BUILD.rust-analyzer-src.bazel", - integrity = "sha256-eo8mIaUafZL8LOM65bDIIIXw1rNQ/P/x5RK/XUtgo5g=", + integrity = "sha256-UB/+EVx/6j4VGvnb7jfRqPaoc7Uwci3rEt6il+2J1Ds=", patch_args = ["-p1"], patches = [ "//rust/ast-generator:patches/rust-analyzer.patch", diff --git a/rust/ast-generator/patches/rust-analyzer.patch b/rust/ast-generator/patches/rust-analyzer.patch index e799e90f48a4..b8b8e6e6c8f0 100644 --- a/rust/ast-generator/patches/rust-analyzer.patch +++ b/rust/ast-generator/patches/rust-analyzer.patch @@ -1,5 +1,5 @@ diff --git a/xtask/src/codegen/grammar.rs b/xtask/src/codegen/grammar.rs -index e7534582f2..49c96f1be3 100644 +index 257429c..ddbe321 100644 --- a/xtask/src/codegen/grammar.rs +++ b/xtask/src/codegen/grammar.rs @@ -3,7 +3,9 @@ @@ -22,7 +22,7 @@ index e7534582f2..49c96f1be3 100644 use self::ast_src::{AstEnumSrc, AstNodeSrc, AstSrc, Cardinality, Field, KindsSrc}; pub(crate) fn generate(check: bool) { -@@ -624,7 +626,7 @@ fn pluralize(s: &str) -> String { +@@ -775,7 +777,7 @@ fn pluralize(s: &str) -> String { } impl Field { @@ -31,26 +31,26 @@ index e7534582f2..49c96f1be3 100644 matches!(self, Field::Node { cardinality: Cardinality::Many, .. }) } fn token_kind(&self) -> Option { -@@ -636,7 +638,7 @@ impl Field { +@@ -787,7 +789,7 @@ impl Field { _ => None, } } - fn method_name(&self) -> String { + pub fn method_name(&self) -> String { match self { - Field::Token(name) => { - let name = match name.as_str() { -@@ -682,7 +684,7 @@ impl Field { + Field::Token { name, token, .. } => { + if let Some(name) = name { +@@ -836,7 +838,7 @@ impl Field { } } } - fn ty(&self) -> proc_macro2::Ident { + pub fn ty(&self) -> proc_macro2::Ident { match self { - Field::Token(_) => format_ident!("SyntaxToken"), + Field::Token { .. } => format_ident!("SyntaxToken"), Field::Node { ty, .. } => format_ident!("{}", ty), -@@ -699,7 +701,7 @@ fn clean_token_name(name: &str) -> String { - } +@@ -849,7 +851,7 @@ fn clean_token_name(name: &str) -> String { + if cleaned.is_empty() { name.to_owned() } else { cleaned.to_owned() } } -fn lower(grammar: &Grammar) -> AstSrc { @@ -59,7 +59,7 @@ index e7534582f2..49c96f1be3 100644 tokens: "Whitespace Comment String ByteString CString IntNumber FloatNumber Char Byte Ident" diff --git a/xtask/src/codegen/grammar/ast_src.rs b/xtask/src/codegen/grammar/ast_src.rs -index 9269d15423..babe7ca1bf 100644 +index a0abdf0..5f59f97 100644 --- a/xtask/src/codegen/grammar/ast_src.rs +++ b/xtask/src/codegen/grammar/ast_src.rs @@ -1,5 +1,8 @@ diff --git a/rust/ast-generator/src/main.rs b/rust/ast-generator/src/main.rs index b1de337f3aca..fe6865a172fb 100644 --- a/rust/ast-generator/src/main.rs +++ b/rust/ast-generator/src/main.rs @@ -308,10 +308,10 @@ fn write_schema( fn get_fields(node: &AstNodeSrc) -> Vec { let mut result = Vec::new(); for field in &node.fields { - if let Field::Token(name) = field { - if should_predicate_be_extracted(name) { + if let Field::Token { token, .. } = field { + if should_predicate_be_extracted(token) { result.push(FieldInfo { - name: format!("is_{name}"), + name: format!("is_{token}"), ty: FieldType::Predicate, }); } @@ -326,7 +326,7 @@ fn get_fields(node: &AstNodeSrc) -> Vec { continue; } let ty = match field { - Field::Token(_) => continue, + Field::Token { .. } => continue, Field::Node { ty, cardinality, .. } => match cardinality { diff --git a/rust/extractor/src/generated/.generated.list b/rust/extractor/src/generated/.generated.list index 89659a4811dd..2dd94e90ca4c 100644 --- a/rust/extractor/src/generated/.generated.list +++ b/rust/extractor/src/generated/.generated.list @@ -1,2 +1,2 @@ mod.rs 4bcb9def847469aae9d8649461546b7c21ec97cf6e63d3cf394e339915ce65d7 4bcb9def847469aae9d8649461546b7c21ec97cf6e63d3cf394e339915ce65d7 -top.rs ea9c28694da3d0e90d09fc7d31824e35817c34720ea91e7c8bf8e7e74ffe4ee8 ea9c28694da3d0e90d09fc7d31824e35817c34720ea91e7c8bf8e7e74ffe4ee8 +top.rs 3773804c68b168304266d17d0bbe5de721ae138043dcf1ff8679e6562a3b94fc 3773804c68b168304266d17d0bbe5de721ae138043dcf1ff8679e6562a3b94fc diff --git a/rust/extractor/src/generated/top.rs b/rust/extractor/src/generated/top.rs index 1c4fd0f00d61..6b757dfcd048 100644 --- a/rust/extractor/src/generated/top.rs +++ b/rust/extractor/src/generated/top.rs @@ -824,6 +824,42 @@ impl From> for trap::Label { } } +#[derive(Debug)] +pub struct CfgPredicate { + _unused: () +} + +impl trap::TrapClass for CfgPredicate { + fn class_name() -> &'static str { "CfgPredicate" } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme CfgPredicate is a subclass of AstNode + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme CfgPredicate is a subclass of Locatable + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme CfgPredicate is a subclass of Element + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + #[derive(Debug)] pub struct Expr { _unused: () @@ -1003,8 +1039,8 @@ impl From> for trap::Label { #[derive(Debug)] pub struct FormatArgsArg { pub id: trap::TrapId, + pub arg_name: Option>, pub expr: Option>, - pub name: Option>, } impl trap::TrapEntry for FormatArgsArg { @@ -1014,12 +1050,12 @@ impl trap::TrapEntry for FormatArgsArg { fn emit(self, id: trap::Label, out: &mut trap::Writer) { out.add_tuple("format_args_args", vec![id.into()]); + if let Some(v) = self.arg_name { + out.add_tuple("format_args_arg_arg_names", vec![id.into(), v.into()]); + } if let Some(v) = self.expr { out.add_tuple("format_args_arg_exprs", vec![id.into(), v.into()]); } - if let Some(v) = self.name { - out.add_tuple("format_args_arg_names", vec![id.into(), v.into()]); - } } } @@ -1054,6 +1090,52 @@ impl From> for trap::Label { } } +#[derive(Debug)] +pub struct FormatArgsArgName { + pub id: trap::TrapId, +} + +impl trap::TrapEntry for FormatArgsArgName { + fn extract_id(&mut self) -> trap::TrapId { + std::mem::replace(&mut self.id, trap::TrapId::Star) + } + + fn emit(self, id: trap::Label, out: &mut trap::Writer) { + out.add_tuple("format_args_arg_names", vec![id.into()]); + } +} + +impl trap::TrapClass for FormatArgsArgName { + fn class_name() -> &'static str { "FormatArgsArgName" } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme FormatArgsArgName is a subclass of AstNode + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme FormatArgsArgName is a subclass of Locatable + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme FormatArgsArgName is a subclass of Element + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + #[derive(Debug)] pub struct GenericArg { _unused: () @@ -1598,33 +1680,7 @@ impl From> for trap::Label { #[derive(Debug)] pub struct Meta { - pub id: trap::TrapId, - pub expr: Option>, - pub is_unsafe: bool, - pub path: Option>, - pub token_tree: Option>, -} - -impl trap::TrapEntry for Meta { - fn extract_id(&mut self) -> trap::TrapId { - std::mem::replace(&mut self.id, trap::TrapId::Star) - } - - fn emit(self, id: trap::Label, out: &mut trap::Writer) { - out.add_tuple("meta", vec![id.into()]); - if let Some(v) = self.expr { - out.add_tuple("meta_exprs", vec![id.into(), v.into()]); - } - if self.is_unsafe { - out.add_tuple("meta_is_unsafe", vec![id.into()]); - } - if let Some(v) = self.path { - out.add_tuple("meta_paths", vec![id.into(), v.into()]); - } - if let Some(v) = self.token_tree { - out.add_tuple("meta_token_trees", vec![id.into(), v.into()]); - } - } + _unused: () } impl trap::TrapClass for Meta { @@ -2465,7 +2521,7 @@ impl From> for trap::Label { pub struct StructField { pub id: trap::TrapId, pub attrs: Vec>, - pub default: Option>, + pub default_val: Option>, pub is_unsafe: bool, pub name: Option>, pub type_repr: Option>, @@ -2482,8 +2538,8 @@ impl trap::TrapEntry for StructField { for (i, v) in self.attrs.into_iter().enumerate() { out.add_tuple("struct_field_attrs", vec![id.into(), i.into(), v.into()]); } - if let Some(v) = self.default { - out.add_tuple("struct_field_defaults", vec![id.into(), v.into()]); + if let Some(v) = self.default_val { + out.add_tuple("struct_field_default_vals", vec![id.into(), v.into()]); } if self.is_unsafe { out.add_tuple("struct_field_is_unsafe", vec![id.into()]); @@ -2725,6 +2781,60 @@ impl From> for trap::Label { } } +#[derive(Debug)] +pub struct TryBlockModifier { + pub id: trap::TrapId, + pub is_try: bool, + pub type_repr: Option>, +} + +impl trap::TrapEntry for TryBlockModifier { + fn extract_id(&mut self) -> trap::TrapId { + std::mem::replace(&mut self.id, trap::TrapId::Star) + } + + fn emit(self, id: trap::Label, out: &mut trap::Writer) { + out.add_tuple("try_block_modifiers", vec![id.into()]); + if self.is_try { + out.add_tuple("try_block_modifier_is_try", vec![id.into()]); + } + if let Some(v) = self.type_repr { + out.add_tuple("try_block_modifier_type_reprs", vec![id.into(), v.into()]); + } + } +} + +impl trap::TrapClass for TryBlockModifier { + fn class_name() -> &'static str { "TryBlockModifier" } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme TryBlockModifier is a subclass of AstNode + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme TryBlockModifier is a subclass of Locatable + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme TryBlockModifier is a subclass of Element + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + #[derive(Debug)] pub struct TupleField { pub id: trap::TrapId, @@ -4408,40 +4518,276 @@ impl trap::TrapEntry for CastExpr { } } -impl trap::TrapClass for CastExpr { - fn class_name() -> &'static str { "CastExpr" } +impl trap::TrapClass for CastExpr { + fn class_name() -> &'static str { "CastExpr" } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme CastExpr is a subclass of Expr + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme CastExpr is a subclass of AstNode + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme CastExpr is a subclass of Locatable + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme CastExpr is a subclass of Element + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +#[derive(Debug)] +pub struct CfgAtom { + pub id: trap::TrapId, +} + +impl trap::TrapEntry for CfgAtom { + fn extract_id(&mut self) -> trap::TrapId { + std::mem::replace(&mut self.id, trap::TrapId::Star) + } + + fn emit(self, id: trap::Label, out: &mut trap::Writer) { + out.add_tuple("cfg_atoms", vec![id.into()]); + } +} + +impl trap::TrapClass for CfgAtom { + fn class_name() -> &'static str { "CfgAtom" } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme CfgAtom is a subclass of CfgPredicate + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme CfgAtom is a subclass of AstNode + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme CfgAtom is a subclass of Locatable + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme CfgAtom is a subclass of Element + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +#[derive(Debug)] +pub struct CfgAttrMeta { + pub id: trap::TrapId, + pub cfg_predicate: Option>, + pub metas: Vec>, +} + +impl trap::TrapEntry for CfgAttrMeta { + fn extract_id(&mut self) -> trap::TrapId { + std::mem::replace(&mut self.id, trap::TrapId::Star) + } + + fn emit(self, id: trap::Label, out: &mut trap::Writer) { + out.add_tuple("cfg_attr_meta", vec![id.into()]); + if let Some(v) = self.cfg_predicate { + out.add_tuple("cfg_attr_meta_cfg_predicates", vec![id.into(), v.into()]); + } + for (i, v) in self.metas.into_iter().enumerate() { + out.add_tuple("cfg_attr_meta_metas", vec![id.into(), i.into(), v.into()]); + } + } +} + +impl trap::TrapClass for CfgAttrMeta { + fn class_name() -> &'static str { "CfgAttrMeta" } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme CfgAttrMeta is a subclass of Meta + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme CfgAttrMeta is a subclass of AstNode + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme CfgAttrMeta is a subclass of Locatable + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme CfgAttrMeta is a subclass of Element + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +#[derive(Debug)] +pub struct CfgComposite { + pub id: trap::TrapId, + pub cfg_predicates: Vec>, +} + +impl trap::TrapEntry for CfgComposite { + fn extract_id(&mut self) -> trap::TrapId { + std::mem::replace(&mut self.id, trap::TrapId::Star) + } + + fn emit(self, id: trap::Label, out: &mut trap::Writer) { + out.add_tuple("cfg_composites", vec![id.into()]); + for (i, v) in self.cfg_predicates.into_iter().enumerate() { + out.add_tuple("cfg_composite_cfg_predicates", vec![id.into(), i.into(), v.into()]); + } + } +} + +impl trap::TrapClass for CfgComposite { + fn class_name() -> &'static str { "CfgComposite" } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme CfgComposite is a subclass of CfgPredicate + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme CfgComposite is a subclass of AstNode + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme CfgComposite is a subclass of Locatable + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme CfgComposite is a subclass of Element + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +#[derive(Debug)] +pub struct CfgMeta { + pub id: trap::TrapId, + pub cfg_predicate: Option>, +} + +impl trap::TrapEntry for CfgMeta { + fn extract_id(&mut self) -> trap::TrapId { + std::mem::replace(&mut self.id, trap::TrapId::Star) + } + + fn emit(self, id: trap::Label, out: &mut trap::Writer) { + out.add_tuple("cfg_meta", vec![id.into()]); + if let Some(v) = self.cfg_predicate { + out.add_tuple("cfg_meta_cfg_predicates", vec![id.into(), v.into()]); + } + } +} + +impl trap::TrapClass for CfgMeta { + fn class_name() -> &'static str { "CfgMeta" } } -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme CastExpr is a subclass of Expr +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme CfgMeta is a subclass of Meta unsafe { Self::from_untyped(value.as_untyped()) } } } -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme CastExpr is a subclass of AstNode +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme CfgMeta is a subclass of AstNode unsafe { Self::from_untyped(value.as_untyped()) } } } -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme CastExpr is a subclass of Locatable +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme CfgMeta is a subclass of Locatable unsafe { Self::from_untyped(value.as_untyped()) } } } -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme CastExpr is a subclass of Element +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme CfgMeta is a subclass of Element unsafe { Self::from_untyped(value.as_untyped()) } @@ -5651,6 +5997,69 @@ impl From> for trap::Label { } } +#[derive(Debug)] +pub struct KeyValueMeta { + pub id: trap::TrapId, + pub expr: Option>, + pub path: Option>, +} + +impl trap::TrapEntry for KeyValueMeta { + fn extract_id(&mut self) -> trap::TrapId { + std::mem::replace(&mut self.id, trap::TrapId::Star) + } + + fn emit(self, id: trap::Label, out: &mut trap::Writer) { + out.add_tuple("key_value_meta", vec![id.into()]); + if let Some(v) = self.expr { + out.add_tuple("key_value_meta_exprs", vec![id.into(), v.into()]); + } + if let Some(v) = self.path { + out.add_tuple("key_value_meta_paths", vec![id.into(), v.into()]); + } + } +} + +impl trap::TrapClass for KeyValueMeta { + fn class_name() -> &'static str { "KeyValueMeta" } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme KeyValueMeta is a subclass of Meta + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme KeyValueMeta is a subclass of AstNode + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme KeyValueMeta is a subclass of Locatable + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme KeyValueMeta is a subclass of Element + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + #[derive(Debug)] pub struct LabelableExpr { _unused: () @@ -6997,6 +7406,65 @@ impl From> for trap::Label { } } +#[derive(Debug)] +pub struct PathMeta { + pub id: trap::TrapId, + pub path: Option>, +} + +impl trap::TrapEntry for PathMeta { + fn extract_id(&mut self) -> trap::TrapId { + std::mem::replace(&mut self.id, trap::TrapId::Star) + } + + fn emit(self, id: trap::Label, out: &mut trap::Writer) { + out.add_tuple("path_meta", vec![id.into()]); + if let Some(v) = self.path { + out.add_tuple("path_meta_paths", vec![id.into(), v.into()]); + } + } +} + +impl trap::TrapClass for PathMeta { + fn class_name() -> &'static str { "PathMeta" } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme PathMeta is a subclass of Meta + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme PathMeta is a subclass of AstNode + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme PathMeta is a subclass of Locatable + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme PathMeta is a subclass of Element + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + #[derive(Debug)] pub struct PathPat { pub id: trap::TrapId, @@ -8123,6 +8591,69 @@ impl From> for trap::Label { } } +#[derive(Debug)] +pub struct TokenTreeMeta { + pub id: trap::TrapId, + pub path: Option>, + pub token_tree: Option>, +} + +impl trap::TrapEntry for TokenTreeMeta { + fn extract_id(&mut self) -> trap::TrapId { + std::mem::replace(&mut self.id, trap::TrapId::Star) + } + + fn emit(self, id: trap::Label, out: &mut trap::Writer) { + out.add_tuple("token_tree_meta", vec![id.into()]); + if let Some(v) = self.path { + out.add_tuple("token_tree_meta_paths", vec![id.into(), v.into()]); + } + if let Some(v) = self.token_tree { + out.add_tuple("token_tree_meta_token_trees", vec![id.into(), v.into()]); + } + } +} + +impl trap::TrapClass for TokenTreeMeta { + fn class_name() -> &'static str { "TokenTreeMeta" } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme TokenTreeMeta is a subclass of Meta + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme TokenTreeMeta is a subclass of AstNode + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme TokenTreeMeta is a subclass of Locatable + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme TokenTreeMeta is a subclass of Element + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + #[derive(Debug)] pub struct TryExpr { pub id: trap::TrapId, @@ -8687,11 +9218,74 @@ impl From> for trap::Label { } } +#[derive(Debug)] +pub struct UnsafeMeta { + pub id: trap::TrapId, + pub is_unsafe: bool, + pub meta: Option>, +} + +impl trap::TrapEntry for UnsafeMeta { + fn extract_id(&mut self) -> trap::TrapId { + std::mem::replace(&mut self.id, trap::TrapId::Star) + } + + fn emit(self, id: trap::Label, out: &mut trap::Writer) { + out.add_tuple("unsafe_meta", vec![id.into()]); + if self.is_unsafe { + out.add_tuple("unsafe_meta_is_unsafe", vec![id.into()]); + } + if let Some(v) = self.meta { + out.add_tuple("unsafe_meta_meta", vec![id.into(), v.into()]); + } + } +} + +impl trap::TrapClass for UnsafeMeta { + fn class_name() -> &'static str { "UnsafeMeta" } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme UnsafeMeta is a subclass of Meta + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme UnsafeMeta is a subclass of AstNode + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme UnsafeMeta is a subclass of Locatable + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme UnsafeMeta is a subclass of Element + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + #[derive(Debug)] pub struct Variant { pub id: trap::TrapId, pub attrs: Vec>, - pub discriminant: Option>, + pub const_arg: Option>, pub field_list: Option>, pub name: Option>, pub visibility: Option>, @@ -8707,8 +9301,8 @@ impl trap::TrapEntry for Variant { for (i, v) in self.attrs.into_iter().enumerate() { out.add_tuple("variant_attrs", vec![id.into(), i.into(), v.into()]); } - if let Some(v) = self.discriminant { - out.add_tuple("variant_discriminants", vec![id.into(), v.into()]); + if let Some(v) = self.const_arg { + out.add_tuple("variant_const_args", vec![id.into(), v.into()]); } if let Some(v) = self.field_list { out.add_tuple("variant_field_lists", vec![id.into(), v.into()]); @@ -9109,9 +9703,9 @@ pub struct BlockExpr { pub is_const: bool, pub is_gen: bool, pub is_move: bool, - pub is_try: bool, pub is_unsafe: bool, pub stmt_list: Option>, + pub try_block_modifier: Option>, } impl trap::TrapEntry for BlockExpr { @@ -9139,15 +9733,15 @@ impl trap::TrapEntry for BlockExpr { if self.is_move { out.add_tuple("block_expr_is_move", vec![id.into()]); } - if self.is_try { - out.add_tuple("block_expr_is_try", vec![id.into()]); - } if self.is_unsafe { out.add_tuple("block_expr_is_unsafe", vec![id.into()]); } if let Some(v) = self.stmt_list { out.add_tuple("block_expr_stmt_lists", vec![id.into(), v.into()]); } + if let Some(v) = self.try_block_modifier { + out.add_tuple("block_expr_try_block_modifiers", vec![id.into(), v.into()]); + } } } @@ -10069,103 +10663,6 @@ impl From> for trap::Label { } } -#[derive(Debug)] -pub struct TraitAlias { - pub id: trap::TrapId, - pub attrs: Vec>, - pub generic_param_list: Option>, - pub name: Option>, - pub type_bound_list: Option>, - pub visibility: Option>, - pub where_clause: Option>, -} - -impl trap::TrapEntry for TraitAlias { - fn extract_id(&mut self) -> trap::TrapId { - std::mem::replace(&mut self.id, trap::TrapId::Star) - } - - fn emit(self, id: trap::Label, out: &mut trap::Writer) { - out.add_tuple("trait_aliases", vec![id.into()]); - for (i, v) in self.attrs.into_iter().enumerate() { - out.add_tuple("trait_alias_attrs", vec![id.into(), i.into(), v.into()]); - } - if let Some(v) = self.generic_param_list { - out.add_tuple("trait_alias_generic_param_lists", vec![id.into(), v.into()]); - } - if let Some(v) = self.name { - out.add_tuple("trait_alias_names", vec![id.into(), v.into()]); - } - if let Some(v) = self.type_bound_list { - out.add_tuple("trait_alias_type_bound_lists", vec![id.into(), v.into()]); - } - if let Some(v) = self.visibility { - out.add_tuple("trait_alias_visibilities", vec![id.into(), v.into()]); - } - if let Some(v) = self.where_clause { - out.add_tuple("trait_alias_where_clauses", vec![id.into(), v.into()]); - } - } -} - -impl trap::TrapClass for TraitAlias { - fn class_name() -> &'static str { "TraitAlias" } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme TraitAlias is a subclass of Item - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme TraitAlias is a subclass of Stmt - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme TraitAlias is a subclass of AstNode - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme TraitAlias is a subclass of Locatable - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme TraitAlias is a subclass of Element - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme TraitAlias is a subclass of Addressable - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - #[derive(Debug)] pub struct TypeItem { _unused: () diff --git a/rust/extractor/src/translate/generated.rs b/rust/extractor/src/translate/generated.rs index e6cc06419fce..083b52d02b3c 100644 --- a/rust/extractor/src/translate/generated.rs +++ b/rust/extractor/src/translate/generated.rs @@ -53,6 +53,18 @@ impl Translator<'_> { self.post_emit(node, label); Some(label) } + pub(crate) fn emit_cfg_predicate( + &mut self, + node: &ast::CfgPredicate, + ) -> Option> { + let label = match node { + ast::CfgPredicate::CfgAtom(inner) => self.emit_cfg_atom(inner).map(Into::into), + ast::CfgPredicate::CfgComposite(inner) => { + self.emit_cfg_composite(inner).map(Into::into) + } + }?; + Some(label) + } pub(crate) fn emit_expr(&mut self, node: &ast::Expr) -> Option> { let label = match node { ast::Expr::ArrayExpr(inner) => self.emit_array_expr(inner).map(Into::into), @@ -149,6 +161,21 @@ impl Translator<'_> { }?; Some(label) } + pub(crate) fn emit_meta(&mut self, node: &ast::Meta) -> Option> { + if let Some(label) = self.pre_emit(node) { + return Some(label); + } + let label = match node { + ast::Meta::CfgAttrMeta(inner) => self.emit_cfg_attr_meta(inner).map(Into::into), + ast::Meta::CfgMeta(inner) => self.emit_cfg_meta(inner).map(Into::into), + ast::Meta::KeyValueMeta(inner) => self.emit_key_value_meta(inner).map(Into::into), + ast::Meta::PathMeta(inner) => self.emit_path_meta(inner).map(Into::into), + ast::Meta::TokenTreeMeta(inner) => self.emit_token_tree_meta(inner).map(Into::into), + ast::Meta::UnsafeMeta(inner) => self.emit_unsafe_meta(inner).map(Into::into), + }?; + self.post_emit(node, label); + Some(label) + } pub(crate) fn emit_pat(&mut self, node: &ast::Pat) -> Option> { let label = match node { ast::Pat::BoxPat(inner) => self.emit_box_pat(inner).map(Into::into), @@ -226,7 +253,6 @@ impl Translator<'_> { ast::Item::Static(inner) => self.emit_static(inner).map(Into::into), ast::Item::Struct(inner) => self.emit_struct(inner).map(Into::into), ast::Item::Trait(inner) => self.emit_trait(inner).map(Into::into), - ast::Item::TraitAlias(inner) => self.emit_trait_alias(inner).map(Into::into), ast::Item::TypeAlias(inner) => self.emit_type_alias(inner).map(Into::into), ast::Item::Union(inner) => self.emit_union(inner).map(Into::into), ast::Item::Use(inner) => self.emit_use(inner).map(Into::into), @@ -598,10 +624,12 @@ impl Translator<'_> { let is_const = node.const_token().is_some(); let is_gen = node.gen_token().is_some(); let is_move = node.move_token().is_some(); - let is_try = node.try_token().is_some(); let is_unsafe = node.unsafe_token().is_some(); let label = node.label().and_then(|x| self.emit_label(&x)); let stmt_list = node.stmt_list().and_then(|x| self.emit_stmt_list(&x)); + let try_block_modifier = node + .try_block_modifier() + .and_then(|x| self.emit_try_block_modifier(&x)); let label = self.trap.emit(generated::BlockExpr { id: TrapId::Star, attrs, @@ -609,10 +637,10 @@ impl Translator<'_> { is_const, is_gen, is_move, - is_try, is_unsafe, label, stmt_list, + try_block_modifier, }); self.emit_location(label, node); self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); @@ -688,6 +716,63 @@ impl Translator<'_> { self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); Some(label) } + pub(crate) fn emit_cfg_atom( + &mut self, + node: &ast::CfgAtom, + ) -> Option> { + let label = self.trap.emit(generated::CfgAtom { id: TrapId::Star }); + self.emit_location(label, node); + self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); + Some(label) + } + pub(crate) fn emit_cfg_attr_meta( + &mut self, + node: &ast::CfgAttrMeta, + ) -> Option> { + let cfg_predicate = node + .cfg_predicate() + .and_then(|x| self.emit_cfg_predicate(&x)); + let metas = node.metas().filter_map(|x| self.emit_meta(&x)).collect(); + let label = self.trap.emit(generated::CfgAttrMeta { + id: TrapId::Star, + cfg_predicate, + metas, + }); + self.emit_location(label, node); + self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); + Some(label) + } + pub(crate) fn emit_cfg_composite( + &mut self, + node: &ast::CfgComposite, + ) -> Option> { + let cfg_predicates = node + .cfg_predicates() + .filter_map(|x| self.emit_cfg_predicate(&x)) + .collect(); + let label = self.trap.emit(generated::CfgComposite { + id: TrapId::Star, + cfg_predicates, + }); + self.emit_location(label, node); + self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); + Some(label) + } + pub(crate) fn emit_cfg_meta( + &mut self, + node: &ast::CfgMeta, + ) -> Option> { + let cfg_predicate = node + .cfg_predicate() + .and_then(|x| self.emit_cfg_predicate(&x)); + let label = self.trap.emit(generated::CfgMeta { + id: TrapId::Star, + cfg_predicate, + }); + self.emit_location(label, node); + self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); + Some(label) + } pub(crate) fn emit_closure_expr( &mut self, node: &ast::ClosureExpr, @@ -1105,17 +1190,30 @@ impl Translator<'_> { &mut self, node: &ast::FormatArgsArg, ) -> Option> { + let arg_name = node + .arg_name() + .and_then(|x| self.emit_format_args_arg_name(&x)); let expr = node.expr().and_then(|x| self.emit_expr(&x)); - let name = node.name().and_then(|x| self.emit_name(&x)); let label = self.trap.emit(generated::FormatArgsArg { id: TrapId::Star, + arg_name, expr, - name, }); self.emit_location(label, node); self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); Some(label) } + pub(crate) fn emit_format_args_arg_name( + &mut self, + node: &ast::FormatArgsArgName, + ) -> Option> { + let label = self + .trap + .emit(generated::FormatArgsArgName { id: TrapId::Star }); + self.emit_location(label, node); + self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); + Some(label) + } pub(crate) fn emit_format_args_expr( &mut self, node: &ast::FormatArgsExpr, @@ -1313,6 +1411,21 @@ impl Translator<'_> { self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); Some(label) } + pub(crate) fn emit_key_value_meta( + &mut self, + node: &ast::KeyValueMeta, + ) -> Option> { + let expr = node.expr().and_then(|x| self.emit_expr(&x)); + let path = node.path().and_then(|x| self.emit_path(&x)); + let label = self.trap.emit(generated::KeyValueMeta { + id: TrapId::Star, + expr, + path, + }); + self.emit_location(label, node); + self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); + Some(label) + } pub(crate) fn emit_label(&mut self, node: &ast::Label) -> Option> { let lifetime = node.lifetime().and_then(|x| self.emit_lifetime(&x)); let label = self.trap.emit(generated::Label { @@ -1691,26 +1804,6 @@ impl Translator<'_> { self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); Some(label) } - pub(crate) fn emit_meta(&mut self, node: &ast::Meta) -> Option> { - if let Some(label) = self.pre_emit(node) { - return Some(label); - } - let expr = node.expr().and_then(|x| self.emit_expr(&x)); - let is_unsafe = node.unsafe_token().is_some(); - let path = node.path().and_then(|x| self.emit_path(&x)); - let token_tree = node.token_tree().and_then(|x| self.emit_token_tree(&x)); - let label = self.trap.emit(generated::Meta { - id: TrapId::Star, - expr, - is_unsafe, - path, - token_tree, - }); - self.emit_location(label, node); - self.post_emit(node, label); - self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); - Some(label) - } pub(crate) fn emit_method_call_expr( &mut self, node: &ast::MethodCallExpr, @@ -1949,6 +2042,19 @@ impl Translator<'_> { self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); Some(label) } + pub(crate) fn emit_path_meta( + &mut self, + node: &ast::PathMeta, + ) -> Option> { + let path = node.path().and_then(|x| self.emit_path(&x)); + let label = self.trap.emit(generated::PathMeta { + id: TrapId::Star, + path, + }); + self.emit_location(label, node); + self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); + Some(label) + } pub(crate) fn emit_path_pat( &mut self, node: &ast::PathPat, @@ -2150,7 +2256,7 @@ impl Translator<'_> { return None; } let attrs = node.attrs().filter_map(|x| self.emit_attr(&x)).collect(); - let default = node.expr().and_then(|x| self.emit_expr(&x)); + let default_val = node.default_val().and_then(|x| self.emit_const_arg(&x)); let is_unsafe = node.unsafe_token().is_some(); let name = node.name().and_then(|x| self.emit_name(&x)); let type_repr = node.ty().and_then(|x| self.emit_type(&x)); @@ -2158,7 +2264,7 @@ impl Translator<'_> { let label = self.trap.emit(generated::StructField { id: TrapId::Star, attrs, - default, + default_val, is_unsafe, name, type_repr, @@ -2522,6 +2628,21 @@ impl Translator<'_> { self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); Some(label) } + pub(crate) fn emit_token_tree_meta( + &mut self, + node: &ast::TokenTreeMeta, + ) -> Option> { + let path = node.path().and_then(|x| self.emit_path(&x)); + let token_tree = node.token_tree().and_then(|x| self.emit_token_tree(&x)); + let label = self.trap.emit(generated::TokenTreeMeta { + id: TrapId::Star, + path, + token_tree, + }); + self.emit_location(label, node); + self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); + Some(label) + } pub(crate) fn emit_trait(&mut self, node: &ast::Trait) -> Option> { if self.should_be_excluded(node) { return None; @@ -2557,31 +2678,16 @@ impl Translator<'_> { self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); Some(label) } - pub(crate) fn emit_trait_alias( + pub(crate) fn emit_try_block_modifier( &mut self, - node: &ast::TraitAlias, - ) -> Option> { - if self.should_be_excluded(node) { - return None; - } - let attrs = node.attrs().filter_map(|x| self.emit_attr(&x)).collect(); - let generic_param_list = node - .generic_param_list() - .and_then(|x| self.emit_generic_param_list(&x)); - let name = node.name().and_then(|x| self.emit_name(&x)); - let type_bound_list = node - .type_bound_list() - .and_then(|x| self.emit_type_bound_list(&x)); - let visibility = node.visibility().and_then(|x| self.emit_visibility(&x)); - let where_clause = node.where_clause().and_then(|x| self.emit_where_clause(&x)); - let label = self.trap.emit(generated::TraitAlias { + node: &ast::TryBlockModifier, + ) -> Option> { + let is_try = node.try_token().is_some(); + let type_repr = node.ty().and_then(|x| self.emit_type(&x)); + let label = self.trap.emit(generated::TryBlockModifier { id: TrapId::Star, - attrs, - generic_param_list, - name, - type_bound_list, - visibility, - where_clause, + is_try, + type_repr, }); self.emit_location(label, node); self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); @@ -2859,6 +2965,21 @@ impl Translator<'_> { self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); Some(label) } + pub(crate) fn emit_unsafe_meta( + &mut self, + node: &ast::UnsafeMeta, + ) -> Option> { + let is_unsafe = node.unsafe_token().is_some(); + let meta = node.meta().and_then(|x| self.emit_meta(&x)); + let label = self.trap.emit(generated::UnsafeMeta { + id: TrapId::Star, + is_unsafe, + meta, + }); + self.emit_location(label, node); + self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); + Some(label) + } pub(crate) fn emit_use(&mut self, node: &ast::Use) -> Option> { if self.should_be_excluded(node) { return None; @@ -2937,14 +3058,14 @@ impl Translator<'_> { return None; } let attrs = node.attrs().filter_map(|x| self.emit_attr(&x)).collect(); - let discriminant = node.expr().and_then(|x| self.emit_expr(&x)); + let const_arg = node.const_arg().and_then(|x| self.emit_const_arg(&x)); let field_list = node.field_list().and_then(|x| self.emit_field_list(&x)); let name = node.name().and_then(|x| self.emit_name(&x)); let visibility = node.visibility().and_then(|x| self.emit_visibility(&x)); let label = self.trap.emit(generated::Variant { id: TrapId::Star, attrs, - discriminant, + const_arg, field_list, name, visibility, @@ -3093,6 +3214,9 @@ impl HasTrapClass for ast::AssocItem { impl HasTrapClass for ast::ExternItem { type TrapClass = generated::ExternItem; } +impl HasTrapClass for ast::Meta { + type TrapClass = generated::Meta; +} impl HasTrapClass for ast::Item { type TrapClass = generated::Item; } @@ -3108,9 +3232,6 @@ impl HasTrapClass for ast::Fn { impl HasTrapClass for ast::MacroCall { type TrapClass = generated::MacroCall; } -impl HasTrapClass for ast::Meta { - type TrapClass = generated::Meta; -} impl HasTrapClass for ast::PathSegment { type TrapClass = generated::PathSegment; } diff --git a/rust/ql/.generated.list b/rust/ql/.generated.list index 003ede900234..bc9aabe628f3 100644 --- a/rust/ql/.generated.list +++ b/rust/ql/.generated.list @@ -1,4 +1,4 @@ -lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll 3f4499c892277e07380232b2c90138d7c312911ef8af4a89ba0c9c2958da028b d8a8b330f8dc43e009c261a41801893230b6b568f503c17faeae9cea54714075 +lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll 6856901e16b8e54da81700c78abf93268801e77dbca5d3f2d3c63f7e1eeef088 8e4cbe943860b173a519a7b797d9a6af0d3cdcc0514d9e003720a71b51d8cb8c lib/codeql/rust/elements/Abi.qll 485a2e79f6f7bfd1c02a6e795a71e62dede3c3e150149d5f8f18b761253b7208 6159ba175e7ead0dd2e3f2788f49516c306ee11b1a443bd4bdc00b7017d559bd lib/codeql/rust/elements/Addressable.qll 13011bfd2e1556694c3d440cc34af8527da4df49ad92b62f2939d3699ff2cea5 ddb25935f7553a1a384b1abe2e4b4fa90ab50b952dadec32fd867afcb054f4be lib/codeql/rust/elements/ArgList.qll 3d2f6f5542340b80a4c6e944ac17aba0d00727588bb66e501453ac0f80c82f83 afd52700bf5a337f19827846667cd0fb1fea5abbbcbc353828e292a727ea58c9 @@ -28,12 +28,17 @@ lib/codeql/rust/elements/Attr.qll 2cb6a6adf1ff9ee40bc37434320d77d74ae41ff10bbd49 lib/codeql/rust/elements/AwaitExpr.qll d8b37c01f7d27f0ec40d92a533a8f09a06af7ece1ae832b4ea8f2450c1762511 92cdb7ff0efddf26bed2b7b2729fddd197e26c1a11c8fec0c747aab642710c21 lib/codeql/rust/elements/BecomeExpr.qll 7a3cfc4894feb6be1cde664f675b18936434e68ccea52e55314c33d01491e34f 49666eca509b30d44bb02702bda67239c76bf8d9f231022c9cf6ecca123f8616 lib/codeql/rust/elements/BinaryExpr.qll 394522da3bc3a716fc7bc40c3560143ca840f5d210cfcba2a752c3026dd0f725 fbbd6fb79bf16a7d9820613654c584cd7ff3e7a29988f3920b6cfbe746acfd8d -lib/codeql/rust/elements/BlockExpr.qll b5cf57119b15f27d0bc258dfa375b0ef2730c157870ff543f0dc7a8cfe514182 f6a01999606b010c81ef9c6ff1385e6640632b6f5ce067ffeb0ef0af0a0aeb92 +lib/codeql/rust/elements/BlockExpr.qll 1dbf64445aebfa87c5ee5f295b6f47a959d952f86a108d8cca381d787d5cbf3e ac6c46175a10807a886263143095a9454041e54a08e3644e06b5dbc4d394a397 lib/codeql/rust/elements/BoxPat.qll 1b2c3fff171aa6aa238c9460b122f26c79e04577cea67fa856de99842ba873d4 0caf8d23ed6e0997a6b8751def27641582151fba6e24fccf798712a4690b42f1 lib/codeql/rust/elements/BreakExpr.qll 7ca3807a20e9a9a988d1fd7abebf240325ed422fcb45c719ba46272f031f94db dffb7379d3f3ba220acfbd05eb7bb6cfd9cfda211e9c8b1f5240ca5fa61be3fc lib/codeql/rust/elements/CallExpr.qll ee3997f265dc1b6b2fc7134548dd88d509b6bcbc26cf65061a31980f9900ae26 7e86e0ab24ce78c3f592a5614eac083d00f331664f021a438f74e2e0785f4609 lib/codeql/rust/elements/Callable.qll 08a46e987b8fde29069795a536fcd1ad1a96f60341f72293e4d07e20334d554f cfc2be9287000718e5ff3c2a35bb45ffc93fd36d97f2e034888e9aa2ae9af555 lib/codeql/rust/elements/CastExpr.qll 2fe1f36ba31fa29de309baf0a665cfcae67b61c73345e8f9bbd41e8c235fec45 c5b4c1e9dc24eb2357799defcb2df25989075e3a80e8663b74204a1c1b70e29a +lib/codeql/rust/elements/CfgAtom.qll 0567c41550cbcf88f334f0285bac32f87726099f2444108b7842e1ecf8a3a36b 6a3858268921c4a9bb8db9239867b5e46b54d1f5d133a6f19cfd648de4d15b65 +lib/codeql/rust/elements/CfgAttrMeta.qll 85f6503abce5c1c3de06df0c0d2ae8fda4206b94bc8103d54550ad2d84a93fb4 af1e7967d7c9c80f1a4725d8a045d645b247f5aa1a3a462a08eea39c4ab4491f +lib/codeql/rust/elements/CfgComposite.qll 50f624532b6f6086ac507c294da7dc3a96d4154d70541449c89b4395cbe366a7 6aa0c7a1484b02833b7cc7692018f96dd6724b8f76a1e171171b7f5aac69e3a6 +lib/codeql/rust/elements/CfgMeta.qll 583c4561968f787ea1fb7fe8af165273e0f35c2e1efd26364a004edeebee5786 86eca520313dc40b0e523d8941858909c2632eb32c01d74ddb1c524527fbd8eb +lib/codeql/rust/elements/CfgPredicate.qll e86f55f98b8f09fb5da9af550cb6c43089d8deb2e3b83d7e195e9bddc8cf201b ba30cf064ba1236139c8c55bfab204b9256e407db983b42b23319690c7ff5562 lib/codeql/rust/elements/ClosureExpr.qll 69e0b7a7c7a4c348fcada5ad4da22dd2f51747109f856be239cede315a56d695 93400650282e2d4e682b826e9f5f844aa893dda126548e41ea1c703d2bf209ca lib/codeql/rust/elements/Comment.qll fedad50575125e9a64a8a8776a8c1dbf1e76df990f01849d9f0955f9d74cb2a6 8eb1afad1e1007a4f0090fdac65d81726b23eda6517d067fd0185f70f17635ab lib/codeql/rust/elements/Const.qll 5f4d11e01162a06127ba56519efd66d1ecfb5de7c1792fc1c283a56cf2127373 8c618ac774267d25db70cc05a080f8a408dc23ab7e88c0fc543eda8b4d4cb995 @@ -58,7 +63,8 @@ lib/codeql/rust/elements/ForBinder.qll ee29b55cb4c1fa5180cc4ee1236ac089fe9f67ffa lib/codeql/rust/elements/ForExpr.qll a050f60cf6fcc3ce66f5042be1b8096e5207fe2674d7477f9e299091ca99a4bd d7198495139649778894e930163add2d16b5588dd12bd6e094a9aec6863cb16f lib/codeql/rust/elements/ForTypeRepr.qll c85c5e368b9db4a308b55259b3e6b1f4d37050984de43b24971243d6ca6dcec5 51b1c3ddac2fb9616ec44816bcbb549df2c15bbbe674d045a7b1c352c1e335e3 lib/codeql/rust/elements/Format.qll 1b186730710e7e29ea47594998f0b359ad308927f84841adae0c0cb35fc8aeda d6f7bfdda60a529fb9e9a1975628d5bd11aa28a45e295c7526692ac662fd19f8 -lib/codeql/rust/elements/FormatArgsArg.qll a2c23cd512d44dd60b7d65eba52cc3adf6e2fbbcd0588be375daa16002cd7741 d9c5fe183fb228375223d83f857b7a9ee686f1d3e341bcf323d7c6f39652f88b +lib/codeql/rust/elements/FormatArgsArg.qll 822287617367bca322a0157a1671a884b8035821c565c9ec8a29d1d4d154deaf 7a8dc3b18c12f0560574500523001e9babeee28a4b3fe3968ac3f30d89f44b3b +lib/codeql/rust/elements/FormatArgsArgName.qll 1e50d3007b517179bffb257b9a0b65b2651a07d1d3380b165995b8eb3eaff63d 6a1932ea108adaf951013f35ac5fe9cdcc409055c2249240a2eb47c73c503750 lib/codeql/rust/elements/FormatArgsExpr.qll 8127cbe4082f7acc3d8a05298c2c9bea302519b8a6cd2d158a83c516d18fc487 88cf9b3bedd69a1150968f9a465c904bbb6805da0e0b90cfd1fc0dab1f6d9319 lib/codeql/rust/elements/FormatArgument.qll f6fe17ee1481c353dd42edae8b5fa79aeb99dff25b4842ec9a6f267b1837d1e3 5aed19c2daf2383b89ad7fd527375641cff26ddee7afddb89bc0d18d520f4034 lib/codeql/rust/elements/FormatTemplateVariableAccess.qll ff3218a1dda30c232d0ecd9d1c60bbb9f3973456ef0bee1d1a12ad14b1e082b5 e4316291c939800d8b34d477d92be9404a30d52b7eee37302aef3d3205cf4ae0 @@ -75,6 +81,7 @@ lib/codeql/rust/elements/IndexExpr.qll 0e2e9f018d06ae72be0fc4ddbc019a9aacd8a06f4 lib/codeql/rust/elements/InferTypeRepr.qll 1b8bdcb574a7b6e7dd49f4cfb96655a6ccc355744b424b8c2593fe8218090d53 c20a2a5b0346dc277721deb450e732a47812c8e872ffb60aaba351b1708e9477 lib/codeql/rust/elements/Item.qll 59d2ac7b5b111579951bf42f68834ecf6dab47a5fb342ed0841c905b977923ab 0d220ec12a373098b26e6cb3a7b327b2d0c1882c3d9b6de00f4df1e8d00bae68 lib/codeql/rust/elements/ItemList.qll b302d25a7570504e88bfcedf7afc99d25740f320ab27a4a9def1ae66569a4c15 4012a5e43639fa39d5313356ff3ab56c4bb567add1ce012bfede4835406a9571 +lib/codeql/rust/elements/KeyValueMeta.qll b66aeedd5a548ae94ed680c399a32176cb5999f972cc3a434a05b802e5a25264 02944562b4f66e99b8503e1d87a9f1cc4ba80bae49a4108c6f884cc54398a379 lib/codeql/rust/elements/Label.qll a31d41db351af7f99a55b26cdbbc7f13b4e96b660a74e2f1cc90c17ee8df8d73 689f87cb056c8a2aefe1a0bfc2486a32feb44eb3175803c61961a6aeee53d66e lib/codeql/rust/elements/LabelableExpr.qll 598be487cd051b004ab95cbbc3029100069dc9955851c492029d80f230e56f0d 92c49b3cfdaba07982f950e18a8d62dae4e96f5d9ae0d7d2f4292628361f0ddc lib/codeql/rust/elements/LetElse.qll abb12749e1e05047e62f04fcaaf0947acc4dc431be80cb5939308f3531f29700 2799133c6bc84d5bb242a6bce7d26be885b31a3e2d2a7757c46c300b9ef07a20 @@ -99,7 +106,7 @@ lib/codeql/rust/elements/MatchArm.qll c39fd6cc0da24b1ff8d1e42835bcfee7695ad13580 lib/codeql/rust/elements/MatchArmList.qll f221c5e344814fa44db06ab897afdc249e8e88118953116c9c9b745aa2189614 8ff30685e631c5daa6c42390dfb11fd76a4ff2e374013e3dabc67b4c135c0bc4 lib/codeql/rust/elements/MatchExpr.qll e9ef1664f020823b6f4bb72d906a9dc0c1ee6432d4a9a13f7dbdbab2b2b1ee4d 38d71e5c487abcb5682293c573343be66e499a6e131bb630604c120d34b7777b lib/codeql/rust/elements/MatchGuard.qll 58256689a90f24b16401543452c2a32f00d619ddac6c0fe8b65a8cd3e46401bb 8efb2ac03c69a9db687e382331085d7a6cfbf8eca559174ba2727a9549ec7ddd -lib/codeql/rust/elements/Meta.qll b17d7bf605bd0cf4f6d6c6cf4f39a16cfc431d256d45b93663a7569181d36168 815cdfef06231de4b4b1c85e321b8ccb3e22379e5a4e111df9cc9ca6be593841 +lib/codeql/rust/elements/Meta.qll e54802dadd2f1b914a821f9e9335f6088d4782751e36c014e1fcf18eb4134b14 552a5ebbd998cba27fa7ea9b91b387c36ab10964deab546afdba52463ed8661a lib/codeql/rust/elements/MethodCallExpr.qll 914633f304c587addced988a7f161a1a4b3297ce370f6a959b7a042b1c04dace 289a0854d6323df915ee5f268523ee597ba20a37c646bbb2a79c9ed1f7aa2260 lib/codeql/rust/elements/Missing.qll 70e6ac9790314752849c9888443c98223ccfc93a193998b7ce350b2c6ebe8ea4 e2f0623511acaa76b091f748d417714137a8b94f1f2bdbbd177f1c682c786dad lib/codeql/rust/elements/Module.qll 0bc85019177709256f8078d9de2a36f62f848d476225bff7bba1e35f249875c7 3fbb70e0c417a644dd0cada2c364c6e6876cfa16f37960e219c87e49c966c94e @@ -120,6 +127,7 @@ lib/codeql/rust/elements/Path.qll 16264a9c978a3027f623530e386a9ad16541305b252fed lib/codeql/rust/elements/PathAstNode.qll 68160b08272ecde0e636779b7c547f808356d69d1150863b37188ea84e110cab cafa2de0bf3be978854319bbcf5ad1591acd64abd7b0958ff14c96a7529fcc99 lib/codeql/rust/elements/PathExpr.qll 0232228845a2005fc63d6b8aea8b49ff50415e0e90fd18f863ee1d6e44f53c07 47b15cc6ae576d13f14b29ffa4620451accc603ff87071dfe48660dbe018bf36 lib/codeql/rust/elements/PathExprBase.qll bb41092ec690ae926e3233c215dcaf1fd8e161b8a6955151949f492e02dba13a b2257072f8062d31c29c63ee1311b07e0d2eb37075f582cfc76bb542ef773198 +lib/codeql/rust/elements/PathMeta.qll 56021df592b69c9c735db2ebe2b14ee5b5e0a76546d7a6bafaed9d9ba4ff2ba8 23c34dbd742698f9197ce5b48970b77520131ad31c12e2d88cdfd98de0708b3c lib/codeql/rust/elements/PathPat.qll a7069d1dd77ba66814d6c84e135ed2975d7fcf379624079e6a76dc44b5de832e 2294d524b65ab0d038094b2a00f73feb8ab70c8f49fb4d91e9d390073205631d lib/codeql/rust/elements/PathSegment.qll c54e9d03fc76f3b21c0cfe719617d03d2a172a47c8f884a259566dd6c63d23f2 4995473961f723239b8ac52804aeb373ef2ac26df0f3719c4ca67858039f2132 lib/codeql/rust/elements/PathTypeRepr.qll 1b68e119ac82fdf5f421ded88a1739bfb8009c61e2745be11b34c3a025de18aa 48d9b49ee871f3932a0806709b4a21dadfdbe5cef8bab8d71aab69b6e4e7b432 @@ -146,15 +154,16 @@ lib/codeql/rust/elements/Struct.qll e60a859c0112b7a7ce4a4752e936e0d58f413ceb895d lib/codeql/rust/elements/StructExpr.qll 84f384ef74c723796e514186037a91dd9666556f62c717f133ce22e9dda4425f 176497835252cfdfe110e58ebde9fbde553d03e44e07d3e4d8041e835dbf31b9 lib/codeql/rust/elements/StructExprField.qll 3eb9f17ecd1ad38679689eb4ecc169d3a0b5b7a3fc597ae5a957a7aea2f74e4f 8fcd26f266f203004899a60447ba16e7eae4e3a654fbec7f54e26857730ede93 lib/codeql/rust/elements/StructExprFieldList.qll 6efb2ec4889b38556dc679bb89bbd4bd76ed6a60014c41f8e232288fc23b2d52 dc867a0a4710621e04b36bbec7d317d6f360e0d6ac68b79168c8b714babde31d -lib/codeql/rust/elements/StructField.qll c43a552ce22c768c7f4c878501f08ecd4eae3554c5cd885dcd2e8625fe705233 bfd7934835ca41eb70e4064198d9b40ec9812842fb4349e412d1aaf98c3cd625 +lib/codeql/rust/elements/StructField.qll 76e41d8a14d30a3f5a89d1cf28e77265f747824a356711e466fcde3b70e11d39 0fef2c368f53c12db96dcad2eab1bd0ae9cb619711451750bc94b6e31af329dc lib/codeql/rust/elements/StructFieldList.qll ee3cf510d35fad0edfeec68315fbe986a6d5323fbaddcfb688682be9a6508352 8cafe522251f98eb10eb45073e434a814165c25e436850f81b1d73ef88d6ae83 lib/codeql/rust/elements/StructPat.qll cdd1e8417d1c8cb3d14356390d71eb2916a295d95f240f48d4c2fb21bf4398cb 69c3456a13ef3e978a9a145b9e232198a30360f771feb41a917e507410611f6c lib/codeql/rust/elements/StructPatField.qll 856aa7d7c6d9b3c17514cbd12a36164e6e9d5923245770d0af3afb759a15204a 1bd1a294d84ad5e4da24e03b4882b215c50473875014859dbf26555d1f4ec2d5 lib/codeql/rust/elements/StructPatFieldList.qll 44619afedcda047e51ee3e319f738d5c49ff5e3f8811155a3ef9874d12bc091d 6b4412a5b0f3ebc0a9f228129c1727b1d6a1947fc826e62fa8e34b2c7d3864ed lib/codeql/rust/elements/Token.qll e2de97c32e12c7ac9369f8dccabc22d89bfcbf7f6acd99f1aa7faa38eb4ac2b2 888d7e1743e802790e78bae694fedb4aba361b600fb9d9ecf022436f2138e13c lib/codeql/rust/elements/TokenTree.qll 23e57fd945ce509df5122aa46f7971360788945cb7a67ddc229de5f44b80e6e9 18a7834edf5d6808e9126c0ce2e9554211faaf21bf7e9e2fa09aa167654e43a9 +lib/codeql/rust/elements/TokenTreeMeta.qll f784784313490314520f6aa9f4dac0f4fbf990427ed39c36185a9526e8d1726d 9c8a74c34ba908d3e886f3e7b041dbaf46a981e26ecc1b66a22d11c1b5155e3f lib/codeql/rust/elements/Trait.qll f78a917c2f2e5a0dfcd7c36e95ad67b1fa218484ee509610db8ca38453bebd4c 2a12f03870ebf86e104bdc3b61aae8512bfafbbf79a0cff5c3c27a04635926af -lib/codeql/rust/elements/TraitAlias.qll 1d82d043f24dbac04baa7aa3882c6884b8ffbc5d9b97669ce8efb7e2c8d3d2c8 505ba5426e87b3c49721f440fbc9ad6b0e7d89d1b1a51ca3fa3a6cc2d36f8b82 +lib/codeql/rust/elements/TryBlockModifier.qll 1567952cea9392e7af28cbe6b7c4aaf00f231e5caeb1292a6fc515918b2891bf 622cbadf10f955f5558475d8015f16667773dabf7db7bdabcc9dbff5425a9fb8 lib/codeql/rust/elements/TryExpr.qll cb452f53292a1396139f64a35f05bb11501f6b363f8affc9f2d5f1945ad4a647 d60ad731bfe256d0f0b688bdc31708759a3d990c11dee4f1d85ccc0d9e07bec9 lib/codeql/rust/elements/TupleExpr.qll 1b1be270198f9d3db1c28c4caaa4a7fe9b5ae14651f1a10e2891a7d78d6ad18b 4f585aa684dfbff753e342903ddd60ee4d7c374b8bddeb645784d10903c90ae0 lib/codeql/rust/elements/TupleField.qll 8d6288fd79959d5ef3732397c0a05a47fcb09091383058d1dba7268a950f8c32 1518cdd0fd9746d09fcdbecabc2a3ce6b36b6d983883850beed3f55c2bdf2c16 @@ -173,12 +182,13 @@ lib/codeql/rust/elements/UnderscoreExpr.qll 233661b82b87c8cda16d8f2e17965658c3dc lib/codeql/rust/elements/Unextracted.qll 12e60c79ef5b94d72b579b19970622e7b73822ebc13fbcfedfe953527ab1ac36 ec015db2eb12c3c82693ddc71d32d9ab9ef7a958e741e2510681bb707ceca23e lib/codeql/rust/elements/Unimplemented.qll bf624d28163e5c99accda16c0c99f938bec4a3b1b920a463e86fc8529ff5ff02 013bc7777298d250338f835cd494b5a8accea2d6a4f9561851f283ac129a446b lib/codeql/rust/elements/Union.qll e23ca528f8573e77dfa7eca71457e2022c92f22292ce84d021d304e52820ee66 eed20ac3797faaa248bc47ef81fa79a5d5c372b4c6289a075d041a84dd8bd6f4 +lib/codeql/rust/elements/UnsafeMeta.qll 10473d5527b564c69e9290553f000fcd7ae7502c22e3e183372530541bb81b5b 028220efdf4f4c8c24297d5fc7159126b06c6f1e46eff518ddc55caef5e45cf2 lib/codeql/rust/elements/Use.qll fdcf70574403c2f219353211b6930f2f9bc79f41c2594e07548de5a8c6cbb24d e41f2b689fcbeb7b84c7ba8d09592f7561626559318642b73574bbac83f74546 lib/codeql/rust/elements/UseBoundGenericArg.qll f16903f8fff676d3700eaad5490804624391141472ecc3166ccb1f70c794c120 5efda98088d096b42f53ceccae78c05f15c6953525b514d849681cb2cf65b147 lib/codeql/rust/elements/UseBoundGenericArgs.qll 841913cfbb84de14aab1820a5433eae978bbadbb8e6d413b8ba70780c7328335 c9ec9d086cff91d15c3aea64f1080b22b41cdaf64e3c8b192aaaec17604a5d10 lib/codeql/rust/elements/UseTree.qll e67c148f63668319c37914a46ff600692de477242a0129fa1bb9839754c0f830 de9b39d3d078d51ec9130db6579bff13e6297e60556a7214a5c51cbf89d92791 lib/codeql/rust/elements/UseTreeList.qll 92ebfee4392a485b38fb3265fdede7c8f2ed1dbe2ab860aa61b1497c33874d25 a4e677455d20838e422e430eebd73d0a488e34e8c960f375fef7b99e79d4c911 -lib/codeql/rust/elements/Variant.qll 7895461fa728f6c3a7293799c5e6b965b413b679566dcbd40bbe2609db8b6cde b0413547365a301bd9fbb6b266757f956394abad0a77f0e424446e23ec7d83e9 +lib/codeql/rust/elements/Variant.qll affe9c58021358fd93d9c867277b4853c8303caa75521c657c8ba2e0cd45f0d6 44894859e3dde36b727abe8a28198f1ba7c487af839e6d9a2fe2d1bacb59f477 lib/codeql/rust/elements/VariantList.qll 39803fbb873d48202c2a511c00c8eafede06e519894e0fd050c2a85bf5f4aa73 1735f89b2b8f6d5960a276b87ea10e4bb8c848c24a5d5fad7f3add7a4d94b7da lib/codeql/rust/elements/Visibility.qll aa69e8a3fd3b01f6fea0ae2d841a2adc51f4e46dcfc9f8f03c34fbe96f7e24e7 0d475e97e07b73c8da2b53555085b8309d8dc69c113bcb396fc901361dbfe6b8 lib/codeql/rust/elements/WhereClause.qll 4e28e11ceec835a093e469854a4b615e698309cdcbc39ed83810e2e4e7c5953f 4736baf689b87dd6669cb0ef9e27eb2c0f2776ce7f29d7693670bbcea06eb4e4 @@ -236,6 +246,15 @@ lib/codeql/rust/elements/internal/BoxPatConstructor.qll 153f110ba25fd6c889092bfd lib/codeql/rust/elements/internal/BreakExprConstructor.qll 356be043c28e0b34fdf925a119c945632ee883c6f5ebb9a27003c6a8d250afd9 bb77e66b04bb9489340e7506931559b94285c6904b6f9d2f83b214cba4f3cfd5 lib/codeql/rust/elements/internal/CallExprConstructor.qll 742b38e862e2cf82fd1ecc4d4fc5b4782a9c7c07f031452b2bae7aa59d5aa13a cad6e0a8be21d91b20ac2ec16cab9c30eae810b452c0f1992ed87d5c7f4144dc lib/codeql/rust/elements/internal/CastExprConstructor.qll f3d6e10c4731f38a384675aeab3fba47d17b9e15648293787092bb3247ed808d d738a7751dbadb70aa1dcffcf8af7fa61d4cf8029798369a7e8620013afff4ed +lib/codeql/rust/elements/internal/CfgAtomConstructor.qll b71484029b4fdaa5df6b42f6b38c3feb0ad72284e5badf3d8413b78d6d14240b 146c73c0354d67fbccba5eb2fe21918ab441d953e005b4ec5482c80388d9493d +lib/codeql/rust/elements/internal/CfgAtomImpl.qll 47ca5355933e1c405dc2edec7bff9fd9be5132f708d6d7e0237a9f0a809eefa7 965eeca1d9ba5045735b16fa0340c0227f22418e0545f381c4df36eac23cf3fe +lib/codeql/rust/elements/internal/CfgAttrMetaConstructor.qll 8cae731f5e86830dec3367b1c69e807389bc434b4f83ff6e13427e4106ec6f2c 0ced22b35219edf0250a8542062f66641f03c13575a3c71d4d718ce5146288ea +lib/codeql/rust/elements/internal/CfgAttrMetaImpl.qll 2b8a578d52aea3ab218f1337ba2c8737cf16e9c64580b1916860dc66ae3e9025 e92e5e8dc79b1da72873af410b778054df7e22bc9080719d60371bc72bc27043 +lib/codeql/rust/elements/internal/CfgCompositeConstructor.qll 160bfbccdd80c9b9421b33cb302f6fe48bebe80050a01ad72a43f7332100f834 0102cad0255d632cac4ffaf334ce15f9beff9d7eb7d14a50255ef5c0e4b67d7b +lib/codeql/rust/elements/internal/CfgCompositeImpl.qll 840a148dc5c4b213ffdaca6213d6f2dfa3c1dad3f99293f8244baa3bf6902909 36e9291b124c52bb2e4620bead8acf2f9be4a2281eccfd74411adaf91914dd20 +lib/codeql/rust/elements/internal/CfgMetaConstructor.qll 335cb7a36e430b08a12c5548d0a91bbb9a00aaa2f9b0dc7b2fa526882ec0271e 0bd7002f58c1c19c22023d6f03874d84e083e1aa09ec9cac888661d5ad632f6b +lib/codeql/rust/elements/internal/CfgMetaImpl.qll 9d820fb4dee32288e467a8b667ba191588381d8ec2a0ce0e5e8645ee437a16a8 5888fb533768a36d94f56f81058aa0d00c4a2c13721af42bdd30628747698bce +lib/codeql/rust/elements/internal/CfgPredicateImpl.qll 3ba6c6732a7de4df967dd2cb2b4cc99db8aefb2301b75521f1b369052e3a2ec0 c07d4366f98f374f24e235f809946dc513a16203e4c1eb151c8185a5bc79e70d lib/codeql/rust/elements/internal/ClosureExprConstructor.qll a348229d2b25c7ebd43b58461830b7915e92d31ae83436ec831e0c4873f6218a 70a1d2ac33db3ac4da5826b0e8628f2f29a8f9cdfd8e4fd0e488d90ce0031a38 lib/codeql/rust/elements/internal/CommentConstructor.qll 0b4a6a976d667bf7595500dfb91b9cfc87460a501837ba5382d9a8d8321d7736 7d02d8c94a319dc48e7978d5270e33fc5c308d443768ff96b618236d250123f1 lib/codeql/rust/elements/internal/ConstArgConstructor.qll f63021dc1ca2276786da3a981d06c18d7a360b5e75c08bca5d1afece4f7c4a83 487a870cbf5ed6554d671a8e159edd9261d853eba2d28ce2bd459759f47f11f2 @@ -271,6 +290,8 @@ lib/codeql/rust/elements/internal/ForTypeReprConstructor.qll eae141dbe9256ab0eb8 lib/codeql/rust/elements/internal/ForTypeReprImpl.qll dbbcb86626dcba3d5534d461d7306c354a15f800ff37c1d039801b868179b387 f942eebb20fb2603b7bab0e90f3e3f7a3f87dd6229090fc011c692a52164ac90 lib/codeql/rust/elements/internal/FormatArgsArgConstructor.qll 8bd9b4e035ef8adeb3ac510dd68043934c0140facb933be1f240096d01cdfa11 74e9d3bbd8882ae59a7e88935d468e0a90a6529a4e2af6a3d83e93944470f0ee lib/codeql/rust/elements/internal/FormatArgsArgImpl.qll 6a8f55e51e141e4875ed03a7cc65eea49daa349de370b957e1e8c6bc4478425c 7efab8981ccbe75a4843315404674793dda66dde02ba432edbca25c7d355778a +lib/codeql/rust/elements/internal/FormatArgsArgNameConstructor.qll 1d5221a97f0edee8c07fd1140a9409cf7c3e6e90fc226278bbe64cf55d72b5c5 a77954bd52b2aa7b2e6891482001a2600c9365778630baf318ffd05cf1630568 +lib/codeql/rust/elements/internal/FormatArgsArgNameImpl.qll 58576638f78150e84c11ae9c702c1f4ea286460f6476a89f0259c9f7cf34dd36 3befb988d6e8ece20b718cd59bac4a68c458814c3157e4d1d7a513a03fd4bd1e lib/codeql/rust/elements/internal/FormatArgsExprConstructor.qll ce29ff5a839b885b1ab7a02d6a381ae474ab1be3e6ee7dcfd7595bdf28e4b558 63bf957426871905a51ea319662a59e38104c197a1024360aca364dc145b11e8 lib/codeql/rust/elements/internal/FunctionConstructor.qll b50aea579938d03745dfbd8b5fa8498f7f83b967369f63d6875510e09ab7f5d2 19cca32aeaecaf9debc27329e8c39ecec69464bb1d89d7b09908a1d73a8d92a2 lib/codeql/rust/elements/internal/GenericArgImpl.qll fde43bb0e3cb2d8eb9feb02012b0a4f934015f8175ec112dea1077d131f55acb 44842e8075f750ba2876cff28d07284f99188982aa6d674ec863ad90305bf6ae @@ -285,6 +306,8 @@ lib/codeql/rust/elements/internal/IndexExprConstructor.qll 99bdc3d793c4dbd993860 lib/codeql/rust/elements/internal/InferTypeReprConstructor.qll bc5f16853401617fc9c5af8a1287a23c5921df1b615cfbe2d7c7a70145ecfcbd da93bd28ea2daade2cbb0a729be3fbf05f72bc02009565c7bb062e4f68fdb9e7 lib/codeql/rust/elements/internal/ItemListConstructor.qll 08af3bd12536941c3dd4a43c81cc861be24325e242e2593c087a3ce632674291 2fa166159c409d2aaffa73a30babb40829a6de580bd40894d909ee6152801082 lib/codeql/rust/elements/internal/ItemListImpl.qll 195dbe93c334ad2bfc29db530bda9aaea88fc31696b2f230faae9e6c2ecb74a8 e498983a5b2f7a91e2fd336e85ac17e521a18c677784a0788d95bb283f3652e7 +lib/codeql/rust/elements/internal/KeyValueMetaConstructor.qll 946f4df587ae7c77445faec67b0c796e008a10c642e5bdf881f9f75e819a1f93 d2bff94a5f8967fabadb76424917383e1472467db1d90214b1b871ebf8da672d +lib/codeql/rust/elements/internal/KeyValueMetaImpl.qll 6f895ee05d983885ad3624b5c64483f2c9024888ed62781889c589ba6fadb4eb 4004bb1b22c30e27f7e2262e9788d1ad3ea4cb08729d8910140c54663a123b91 lib/codeql/rust/elements/internal/LabelConstructor.qll 1f814c94251e664bfa1b1a606aef995382e40e78d4f953350ec951ee0bc8bd34 3157fb8c7c6bd365a739f217ad73ba1e0b65ccd59b922e5ab034e3449915b36c lib/codeql/rust/elements/internal/LetElseConstructor.qll b2b5d68e5701379a0870aa6278078e09f06aa18ddd14045fc6ae62e90827ece7 7359e70bea8a78bcaf6e6ecc8cc37c5135ae31415b74645594456cc8daa82118 lib/codeql/rust/elements/internal/LetExprConstructor.qll 66f27cbdafb2b72b31d99645ec5ed72f4b762a7d6f5d292d7639dd8b86272972 7da048f4d7f677919c41d5c87ead301eacc12ece634d30b30a8ae1fab580ff30 @@ -317,7 +340,6 @@ lib/codeql/rust/elements/internal/MatchArmListImpl.qll 16de8d9e0768ee42c5069df5c lib/codeql/rust/elements/internal/MatchExprConstructor.qll 0355ca543a0f9ad56697bc2e1e2511fa3f233bc1f6344d9e1c2369106901c696 78622807a1c4bff61b751c715639510146c7a713e0c4f63246e9a2cf302f4875 lib/codeql/rust/elements/internal/MatchGuardConstructor.qll d4cae02d2902fe8d3cb6b9c2796137863f41f55840f6623935a1c99df43f28d8 0c89f2ca71a2fd5a3f365291e784cb779e34ba0542d9285515e1856424cec60d lib/codeql/rust/elements/internal/MatchGuardImpl.qll 489040ca1ea85edda91405fab3d12321b6541d2888c35356d3c14c707bf1468e 2b60223a822b840356a3668da3f9578e6a9b8f683fcdd3dbd99b5354c7d96095 -lib/codeql/rust/elements/internal/MetaConstructor.qll 49ab9aafdcab7785fc5fc9fb8f7c5bb0ae76cf85d0d259c4b3ac4b0eccbbeb56 bc11aef22661077e398b6ca75e3701fd8d0ac94a0e96dc556a6f6de4089d8b8c lib/codeql/rust/elements/internal/MetaImpl.qll ab77681dc271d26b4eb77d792fd9b24fce65b0f4a88056ad09aa9400d26b4b58 270e58d97c03357e92f777ce2bd332e2718e077a7faaa6778941a9d5b14e135d lib/codeql/rust/elements/internal/MethodCallExprConstructor.qll a1b3c4587f0ae60d206980b1d9e6881d998f29d2b592a73421d6a44124c70c20 8d4eaa3eb54653fac17f7d95e9cc833fe1398d27c02b2388cd9af8724a560ded lib/codeql/rust/elements/internal/MissingConstructor.qll aab0b7f2846f14a5914661a18c7c9eae71b9bde2162a3c5e5e8a8ecafa20e854 8f30b00b5b7918a7500786cc749b61695158b5b3cc8e9f2277b6b6bf0f7850a0 @@ -344,6 +366,8 @@ lib/codeql/rust/elements/internal/PathAstNodeImpl.qll 5a38c42a9127fc2071a9e8f091 lib/codeql/rust/elements/internal/PathConstructor.qll 5c6354c28faf9f28f3efee8e19bdb82773adcf4b0c1a38788b06af25bcb6bc4a 3e2aeef7b6b9cda7f7f45a6c8119c98803aa644cf6a492cf0fce318eba40fe8f lib/codeql/rust/elements/internal/PathExprBaseImpl.qll e8b09447ee41b4123f7d94c6b366b2602d8022c9644f1088c670c7794307ab2e 96b9b328771aaf19ba18d0591e85fcc915c0f930b2479b433de3bfdd2ea25249 lib/codeql/rust/elements/internal/PathExprConstructor.qll cf6e0a338a8ed2d1042bdee4c2c49be5827e8c572d8c56e828db265d39e59ae3 36a3d1b7c5cc2cf527616be787b32071b9e2a6613a4f6b3f82e2a3b0e02a516f +lib/codeql/rust/elements/internal/PathMetaConstructor.qll de6ebd053e66f0c72e6acb59c7a7e7326abfe0331e65080cc539030b93c49e32 327a8d8b5a6d721daa763cb5dac83247f9b2d9650be53ce01cbae02b15fbad94 +lib/codeql/rust/elements/internal/PathMetaImpl.qll 052152ec17c827054b1e9fccfc7cd7cb12fc0787e82242fde5724fd7a77b3b39 677460de83898bdfc9f06460ddb5dab2d4d884a88998c879b7eff5018d9b434a lib/codeql/rust/elements/internal/PathPatConstructor.qll 966c4ea22218ef71e000d7ce8dd5b570c39ad96b9239a3aa8a38292e2a9f36d2 8a1f348e9257ffc6e6bedcd70389b8e7ec2a3ed6e7b3733744ddfab284826e57 lib/codeql/rust/elements/internal/PathSegmentConstructor.qll 2d9639e42035dc7e73b7d6ddb8a977beadc6b4492dee4292b2f85b4409344441 c337fc3b9ef56366428772563e3f25f711474d16e860d3e89c1395a95d9e83e7 lib/codeql/rust/elements/internal/PathTypeReprConstructor.qll e05e7be13d48e7f832e735254777692d4be827a745b1fd94b9649d46fe574393 4aa1e6935a4479b61f205265cbbba01ce96d09a680c20d5decf30d1374d484d4 @@ -392,9 +416,11 @@ lib/codeql/rust/elements/internal/StructPatFieldListImpl.qll 046464430ba9cc0a924 lib/codeql/rust/elements/internal/TokenImpl.qll 87629ffee74cacc6e8af5e96e18e62fb0fa4043d3ba1e7360daa880e628f8530 d54e213e39ae2b9bb92ab377dc72d72ba5bca88b72d29032507cdcbef201a215 lib/codeql/rust/elements/internal/TokenTreeConstructor.qll 0be1f838b04ff944560aa477cbe4ab1ad0b3f4ae982de84773faac5902fcae45 254b387adc2e1e3c355651ab958785d0b8babbc0030194234698a1219e9497b3 lib/codeql/rust/elements/internal/TokenTreeImpl.qll 7c16b22a8ff4ad33be25c3d2d43b8f043cab7626538ac5d8938b074dc663b4f4 793e04299d571a8cea2097e6c43136c5e618b31da91ccc68bda334c3d2c3793d -lib/codeql/rust/elements/internal/TraitAliasConstructor.qll d2f159cac53b9d65ec8176b8c8ccb944541cd35c64f0d1ceabb32cd975c000bf 6564981793de762af2775cc729e25054ea788648509d151cbfdbdf99fc9ed364 -lib/codeql/rust/elements/internal/TraitAliasImpl.qll 434cf074a461219ad01ab2f116681213302fc62dabc4131d118b3bc2f2fd1af4 59e6f8893431e563897304e6f22da466c69410cf59206b634b426e8fef93b159 +lib/codeql/rust/elements/internal/TokenTreeMetaConstructor.qll 059903cc9cbc77d753f1e7833bbc6ba42d55d281bdf0a3ec1c79d0224be1613f b387eb1eb56f83ff9b2831552db5f23af9b8b8bd822e277f2c1e95ed88b71c1f +lib/codeql/rust/elements/internal/TokenTreeMetaImpl.qll e0c30c264f05a5b610c6d1c7bdacd804b4188031e3968756e6670d51b9b7ee02 084adcb4898a694a8be217a416b693e8291848f3802d4437a2004384ab079037 lib/codeql/rust/elements/internal/TraitConstructor.qll 1f790e63c32f1a22ae1b039ca585b5fe6ffef6339c1e2bf8bca108febb433035 535cebd676001bfbbb724d8006fa2da94e585951b8fd54c7dc092732214615b5 +lib/codeql/rust/elements/internal/TryBlockModifierConstructor.qll 55a69eced15a1637cb84889e50cf465bbc677baaf4bf3e4e5ab37615018f5803 ee6141225ade44559067474a75b27e3c68dbb149dc9c24dacc1e9d8c791f13f7 +lib/codeql/rust/elements/internal/TryBlockModifierImpl.qll 97ab789b3a0d9f9e851cee967cc92ae28446355e7bfeb7ff598787f18b9fdfa5 6f24a42b5e4c448f3ac447200becbf63b83bf1f26e99fca933f5e4262906d278 lib/codeql/rust/elements/internal/TryExprConstructor.qll 98e3077ebc4d76f687488b344f532b698512af215b66f0a74b5cea8ed180836c b95603c10c262911eeffdf4ccba14849e8443916b360e287963d5f2582d8e434 lib/codeql/rust/elements/internal/TryExprImpl.qll cacf43a49ba518be3f94e4a355f5889861edc41f77601eff27e0ed774eca6651 5f4a6a346ec457d5de89b32419e8b4c2deddc55e2d61dbb59842d7f34aa11c44 lib/codeql/rust/elements/internal/TupleExprConstructor.qll 71c38786723225d3d90399b8a085b2b2664c62256654db9e1288fadd56745b9d 639ad70b49ebadc027127fbdc9de14e5180169a4285908233bc38ccac6f14110 @@ -419,6 +445,8 @@ lib/codeql/rust/elements/internal/UnextractedImpl.qll 5c23df7e448184d76ccab2c227 lib/codeql/rust/elements/internal/UnimplementedConstructor.qll 70b0489fdc75fed389de8203947ed9c8eabb91373a1264eb2c8018ddbb2d9baa 0f2592c1697a2f2f913014ecd73b0e3ff1ec5b038ba1c3a22e7939bf8759e664 lib/codeql/rust/elements/internal/UnimplementedImpl.qll 06771abc088e0a8fc24032c9d2633618e8e40343ef8757a68cc0a70f1617165a 5738f626f1f4f573fdf7dcd5bd57a0948d290ed89342b9160e95ef3c84044f9a lib/codeql/rust/elements/internal/UnionConstructor.qll d650551a1b3ef29c5a770bdad626269cf539ed0c675af954bc847d2c6111f3f6 aca9064ad653a126ab4f03703e96b274587c852dc5e7ff3fea0fec4d45993f10 +lib/codeql/rust/elements/internal/UnsafeMetaConstructor.qll 89c041ebd8ff05137d0244c97b9cd8ea1afffbc1d6d3e6aab906546897d851aa 6da0034021f992ae39977694418a4d8f2fe6b426f54f606a2a089c3896e6eb52 +lib/codeql/rust/elements/internal/UnsafeMetaImpl.qll 38134143aec9d5f48762a1d70330a8899bd3e94265f80b0772e7db3987a7a107 7731646d9a29357c7567a08129d018c4b09982781d8b6cb73d93bcea7f71f0a1 lib/codeql/rust/elements/internal/UseBoundGenericArgImpl.qll 2f90bfd5e43113da1155445bef0334ab84acddef102bd62dfa2ef908717a5d09 dd2fa3c6081d79e1d96360dbdb339128cd944e7b7dc26c449c04f970ee1d7848 lib/codeql/rust/elements/internal/UseBoundGenericArgsConstructor.qll 84d4a959d098fcd1713cb169e15b4945d846121701d2c5709b11e19202c21f2b 93113c92be9bc9f0b8530c308fe482dfeddc7dc827fc44049cecb3eab28df731 lib/codeql/rust/elements/internal/UseBoundGenericArgsImpl.qll 0f98d47c1e09c46dd3da66a4770181a0caae0512b362faaec997af22bb5f4ce7 1919235e50b9d2fee9bd5d407a0bc023a02dbb04b2662349fad5a8d6cfa98069 @@ -470,12 +498,17 @@ lib/codeql/rust/elements/internal/generated/Attr.qll 3f306e301c79f58018f1d5f39b4 lib/codeql/rust/elements/internal/generated/AwaitExpr.qll 1d71af702a1f397fb231fae3e0642b3deeba0cd5a43c1d8fabdff29cac979340 e0bfa007bdecc5a09a266d449d723ae35f5a24fbdfc11e4e48aeea3ec0c5147c lib/codeql/rust/elements/internal/generated/BecomeExpr.qll 7a211b785a4a2f961242d1d73fd031d381aad809f7b600ce7f7f864518bb7242 17a0388680007871748cfdc6621f700a7c2817b9601e1bd817fb48561e7c63ad lib/codeql/rust/elements/internal/generated/BinaryExpr.qll 64e9bd9c571edd6e5f3e7662b956b1d87fa0354ce6fe95da9caf25ac16b66c68 3fca09fdbe879db2ca3293618896a462e96376a2963d15cce3d5b1baac552fcb -lib/codeql/rust/elements/internal/generated/BlockExpr.qll 5a5ddbe34bc478a7bd9b0d07d3b6f017c2d1f20581d859251a963314e6514d1f 9804c30b8b279038b864c52557535f854bd012bacdfe8e5840f1f777c74e52df +lib/codeql/rust/elements/internal/generated/BlockExpr.qll db813fa05eace9769ba2a51bb38c17e58d621cc31cbf88ee8186c23e3734467c 3a2804490c2bdfccfd2b18c2d4c6cd6edefc375a0a7463120a43212d22ce7513 lib/codeql/rust/elements/internal/generated/BoxPat.qll 597bed52f7489e0addce3266f7bee5be7c53d2d1263eceec3a252d041ca0908f b8ccf363ca5f1a988547caf1fd266a55aec7cbf8623578deea99765d264b0151 lib/codeql/rust/elements/internal/generated/BreakExpr.qll 0f428a8b2f4209b134c2ffc3e1c93c30bc6b0e9c9172f140cefa88c1f77d8690 957b39f38ff6befe9061f55bc0b403c2f1c366dd0cf63b874bae6f8216576d76 lib/codeql/rust/elements/internal/generated/CallExpr.qll 6096035ba2ef1ce3e6254d5b8497dcb6cd7570253423c778a9dd7e158f928644 e56caf9ba094ddfc4952ed5072c5f6f139db8029fa6bd6328d1a118e96a1d5fe lib/codeql/rust/elements/internal/generated/Callable.qll 12368b998c771c6b80f54123cea4d3600af7432ab34c9e571bc0bf3894ceb17e 273a9fd9cdae56cf2edbdc9c49b15da49cd5ad04be70acbbe2475c9c50200183 lib/codeql/rust/elements/internal/generated/CastExpr.qll ddc20054b0b339ad4d40298f3461490d25d00af87c876da5ffbc6a11c0832295 f4247307afcd74d80e926f29f8c57e78c50800984483e6b6003a44681e4a71f3 +lib/codeql/rust/elements/internal/generated/CfgAtom.qll 4379fe45c14c3f8d6bdbc2d7879082d1dbcfee00973c91d93a29ed01f9477dad 52488050dddacb84729ddf06cfe1d71c33e052015f1dff544d805ebbf286150d +lib/codeql/rust/elements/internal/generated/CfgAttrMeta.qll 8bbf153628df0e59d5c66bd41788fbbfb83b44e8870b695f5551a8961e7d4464 f605ddb63a1adc2a881e95b6adbbd908e341aca24448cd1441c7021a1eb70ae1 +lib/codeql/rust/elements/internal/generated/CfgComposite.qll 96ea6dc95579b31808d1b6cc10c8a42bb8d2b211fe6092eb62416b225297c15e 37ba82588d34831abf4426b658e1b063044f6093879bc8a704432cb8f99785d8 +lib/codeql/rust/elements/internal/generated/CfgMeta.qll 6e2e5f26a57781af0e46ddcf589f4d33637d304eca28b9c4c4e01108d075c590 015385a2fc33bfb6fbe3d3353861dea36ed00cbcf810e64c36fa46cae140218d +lib/codeql/rust/elements/internal/generated/CfgPredicate.qll 736fe7385e2af5bb86c349bb1b8dd030aef191541f6af24694e3c460b8272f61 4117ee073683eb5fb81bae9e7e49b4ad0991cfcb53e0b7b4160199931a300632 lib/codeql/rust/elements/internal/generated/ClosureExpr.qll 818aff75d86821c670d8ba0720c3270681b3e070140a9c41beab2a811b43eee6 9bf2d1d38f6c4a99d7c058f8ed096141f5ba6a75d2d26a464f0d65ed4e554222 lib/codeql/rust/elements/internal/generated/Comment.qll cd1ef861e3803618f9f78a4ac00516d50ecfecdca1c1d14304dc5327cbe07a3b 8b67345aeb15beb5895212228761ea3496297846c93fd2127b417406ae87c201 lib/codeql/rust/elements/internal/generated/Const.qll 3e606f0198b6461a94964dba7a4d386408f01651d75378eeab251dfceccf49c8 20fe276cded4764bdb1cd50de956bea88d7cd731909c0b84b4abb972b3094959 @@ -501,7 +534,8 @@ lib/codeql/rust/elements/internal/generated/ForBinder.qll 7be6b8e3934db8cd4ac326 lib/codeql/rust/elements/internal/generated/ForExpr.qll 7c497d2c612fd175069037d6d7ff9339e8aec63259757bb56269e9ca8b0114ea dc48c0ad3945868d6bd5e41ca34a41f8ee74d8ba0adc62b440256f59c7f21096 lib/codeql/rust/elements/internal/generated/ForTypeRepr.qll 7daa3b938592b590d604203e7d0fc5c34c2bffe6adcceee5a5e0c681ed16214c f1380179cbdc188ad133c946d9e17e85aed0d77771b319f663d8eada0f7cf17d lib/codeql/rust/elements/internal/generated/Format.qll 934351f8a8ffd914cc3fd88aca8e81bf646236fe34d15e0df7aeeb0b942b203f da9f146e6f52bafd67dcfd3b916692cf8f66031e0b1d5d17fc8dda5eefb99ca0 -lib/codeql/rust/elements/internal/generated/FormatArgsArg.qll c762a4af8609472e285dd1b1aec8251421aec49f8d0e5ce9df2cc5e2722326f8 c8c226b94b32447634b445c62bd9af7e11b93a706f8fa35d2de4fda3ce951926 +lib/codeql/rust/elements/internal/generated/FormatArgsArg.qll e12e470cfe23da78cb82258f7e1e9e263fd11a8ff6b9a31facf130264e1d2f86 31e8419530cff1811937ad24558aa2feaa5198df5eeb9e16b4197e8ce4efdce2 +lib/codeql/rust/elements/internal/generated/FormatArgsArgName.qll 7720d5a024c6487604952bb6a1925fd473d35d959079791acbdd98e5cd1de11e b7b4fa8121aa1f75f9467fb91e87b2a5ced1b1ce65ebe07249b78945433ea3a3 lib/codeql/rust/elements/internal/generated/FormatArgsExpr.qll 8aed8715a27d3af3de56ded4610c6792a25216b1544eb7e57c8b0b37c14bd9c1 590a2b0063d2ecd00bbbd1ce29603c8fd69972e34e6daddf309c915ce4ec1375 lib/codeql/rust/elements/internal/generated/FormatArgument.qll cd05153276e63e689c95d5537fbc7d892615f62e110323759ef02e23a7587407 be2a4531b498f01625effa4c631d51ee8857698b00cfb829074120a0f2696d57 lib/codeql/rust/elements/internal/generated/FormatTemplateVariableAccess.qll a6175214fad445df9234b3ee9bf5147da75baf82473fb8d384b455e3add0dac1 a928db0ff126b2e54a18f5c488232abd1bd6c5eda24591d3c3bb80c6ee71c770 @@ -518,6 +552,7 @@ lib/codeql/rust/elements/internal/generated/IndexExpr.qll cf951fc40f6690e966b4dc lib/codeql/rust/elements/internal/generated/InferTypeRepr.qll 4f101c1cb1278e919f9195cac4aa0c768e304c1881394b500874e7627e62d6c4 dca3f85d0a78ecc8bf030b4324f0d219ffff60784a2ecf565a4257e888dea0ff lib/codeql/rust/elements/internal/generated/Item.qll 03077c9d2f3200ebbc5df5d31f7d9b78a3ae25957ac46899a19a93684b2d7306 6492e341b9d9270c0181da0a5330f588238ced81657041ad1ad343db2bdf210b lib/codeql/rust/elements/internal/generated/ItemList.qll 1571a3ab0f2c7c0d8384549f8eac7f6e6863c42f3ec5d5ea5e01fc26b9f1056f 7b2cade995505f214df9bb2d73143a28b2499f76d88abc56ae8fcc59bf709204 +lib/codeql/rust/elements/internal/generated/KeyValueMeta.qll 0cd628f043ee5d693f602d91cd6d4e3e889beed905d84ae215be2ce0988bd2a9 4fa22e86456df225c14ae10f6c0d2509447efed81ef7bc98a88c61b0f06c1a1c lib/codeql/rust/elements/internal/generated/Label.qll 6630fe16e9d2de6c759ff2684f5b9950bc8566a1525c835c131ebb26f3eea63e 671143775e811fd88ec90961837a6c0ee4db96e54f42efd80c5ae2571661f108 lib/codeql/rust/elements/internal/generated/LabelableExpr.qll 896fd165b438b60d7169e8f30fa2a94946490c4d284e1bbadfec4253b909ee6c 5c6b029ea0b22cf096df2b15fe6f9384ad3e65b50b253cae7f19a2e5ffb04a58 lib/codeql/rust/elements/internal/generated/LetElse.qll 9e6f7057b8cb7d37b0ea79d540520028febe017ed8e9def95927ffa3fcdc1af4 3ee7d344d718898f25eb2a7a646d3c6704e8f1f22b83d0c0ea727cff74161946 @@ -542,7 +577,7 @@ lib/codeql/rust/elements/internal/generated/MatchArm.qll f8c4c955c50f8398159c492 lib/codeql/rust/elements/internal/generated/MatchArmList.qll 12d969ecb267a749918e93beda6ad2e5e5198f1683c7611772a0734a2748b04b 9226ff7cadcab4dc69009f3deeda7320c3cee9f4c5b40d6439a2fe2a9b8e8617 lib/codeql/rust/elements/internal/generated/MatchExpr.qll b686842e7000fd61e3a0598bf245fb4e18167b99eca9162fdfdff0b0963def22 00f1743b1b0f1a92c5a687f5260fda02d80cc5871694cad0d5e7d94bac7fe977 lib/codeql/rust/elements/internal/generated/MatchGuard.qll 58fa1d6979ef22de2bd68574c7ffcf4a021d7543445f68834d879ff8cee3abcb 072f22a7929df3c0e764b2a770b4cdf03504b3053067d9b9008d6655fb5837e1 -lib/codeql/rust/elements/internal/generated/Meta.qll 15e98e8d38f5618b7053057a629b135aae5e105fbf72731833a644fb695244c0 2977b6a0781c89383e87c595b14a39851f27b2508296f3e77466eea44c916188 +lib/codeql/rust/elements/internal/generated/Meta.qll 5c3358c737d504dacfa3227b80ceeead3cdeebbd7498d1d0ac88570cac1d91ec cd04ebdf19cf6710ce43e888211e61b0740aa6298db9a5ec79f29a1301a60b40 lib/codeql/rust/elements/internal/generated/MethodCallExpr.qll ffce98a6a1921822b12ead721cff0878553eb3e049c5d2184a7abce32b6615b4 d1408a0f47ee5764fe7b484494daf6e1f99b1c6a505274c48545b3e650ef8baf lib/codeql/rust/elements/internal/generated/Missing.qll 16735d91df04a4e1ae52fae25db5f59a044e540755734bbab46b5fbb0fe6b0bd 28ca4e49fb7e6b4734be2f2f69e7c224c570344cc160ef80c5a5cd413e750dad lib/codeql/rust/elements/internal/generated/Module.qll ebae5d8963c9fd569c0fbad1d7770abd3fd2479437f236cbce0505ba9f9af52c fa3c382115fed18a26f1a755d8749a201b9489f82c09448a88fb8e9e1435fe5f @@ -558,13 +593,14 @@ lib/codeql/rust/elements/internal/generated/ParamList.qll eaa0cd4402d3665013d47e lib/codeql/rust/elements/internal/generated/ParenExpr.qll 812d2ff65079277f39f15c084657a955a960a7c1c0e96dd60472a58d56b945eb eb8c607f43e1fcbb41f37a10de203a1db806690e10ff4f04d48ed874189cb0eb lib/codeql/rust/elements/internal/generated/ParenPat.qll 24f9dc7fce75827d6fddb856cd48f80168143151b27295c0bab6db5a06567a09 ebadbc6f5498e9ed754b39893ce0763840409a0721036a25b56e1ead7dcc09aa lib/codeql/rust/elements/internal/generated/ParenTypeRepr.qll 03f5c5b96a37adeb845352d7fcea3e098da9050e534972d14ac0f70d60a2d776 ed3d6e5d02086523087adebce4e89e35461eb95f2a66d1d4100fe23fc691b126 -lib/codeql/rust/elements/internal/generated/ParentChild.qll b0e3c13b2ca75faaf0d92b2ca3d70cac7b78b3729aaccf635063cc5836c163af a340e8f34a6d7425f38845e789b4aeb83aec90c11429a68ad6632a5aa132fa57 +lib/codeql/rust/elements/internal/generated/ParentChild.qll 8f1fee0d67dcac880ed20a6bdee5810a85ae752ffc3fb1d5f76d5aa2b9b54d4e 16387ca21c94f237f47b9be9b27589fea090321219c4ab73ab01d03deaea1429 lib/codeql/rust/elements/internal/generated/ParenthesizedArgList.qll d901fdc8142a5b8847cc98fc2afcfd16428b8ace4fbffb457e761b5fd3901a77 5dbb0aea5a13f937da666ccb042494af8f11e776ade1459d16b70a4dd193f9fb lib/codeql/rust/elements/internal/generated/Pat.qll 3605ac062be2f294ee73336e9669027b8b655f4ad55660e1eab35266275154ee 7f9400db2884d336dd1d21df2a8093759c2a110be9bf6482ce8e80ae0fd74ed4 lib/codeql/rust/elements/internal/generated/Path.qll 9b12afb46fc5a9ad3a811b05472621bbecccb900c47504feb7f29d96b28421ca bcacbffc36fb3e0c9b26523b5963af0ffa9fd6b19f00a2a31bdb2316071546bd lib/codeql/rust/elements/internal/generated/PathAstNode.qll b02654422f80e398027069135bb01205358f0ab82ded3408d83d066f300996a3 345e7f92a75bfc71657b223602f60c36f7637d6f2e3798f07e2d2926eea2431b lib/codeql/rust/elements/internal/generated/PathExpr.qll 34ebad4d062ce8b7e517f2ab09d52745fb8455203f4a936df7284ad296638387 ba66781cdbdeb89c27a4bfb2be0f27f85fb34978d699b4e343446fb0d7ad2aa6 lib/codeql/rust/elements/internal/generated/PathExprBase.qll d8218e201b8557fa6d9ca2c30b764e5ad9a04a2e4fb695cc7219bbd7636a6ac2 4ef178426d7095a156f4f8c459b4d16f63abc64336cb50a6cf883a5f7ee09113 +lib/codeql/rust/elements/internal/generated/PathMeta.qll 42cf084a78acb656a86a6a9b3cd893b93176a6ec9fc989a0232f01cfa3cbd228 cccedf3ca1e353d55979354b0baa23d936890ae9581097cfe4b44748ca797f18 lib/codeql/rust/elements/internal/generated/PathPat.qll 003d10a4d18681da67c7b20fcb16b15047cf9cc4b1723e7674ef74e40589cc5a 955e66f6d317ca5562ad1b5b13e1cd230c29e2538b8e86f072795b0fdd8a1c66 lib/codeql/rust/elements/internal/generated/PathSegment.qll 48b452229b644ea323460cd44e258d3ea8482b3e8b4cb14c3b1df581da004fa8 2025badcfab385756009a499e08eecc8ffd7fa590cd2b777adb283eebcc432c6 lib/codeql/rust/elements/internal/generated/PathTypeRepr.qll f12fe234d7fb1a12678b524434fcdd801453d90eb778b9173f7197ff3d957557 a1be605f8937c5bd3a3a9cb277782c24446c9f5ef8363e6f5ee8f6229886b6f6 @@ -573,7 +609,7 @@ lib/codeql/rust/elements/internal/generated/PtrTypeRepr.qll 8d0ea4f6c7f8203340bf lib/codeql/rust/elements/internal/generated/PureSynthConstructors.qll e5b8e69519012bbaae29dcb82d53f7f7ecce368c0358ec27ef6180b228a0057f e5b8e69519012bbaae29dcb82d53f7f7ecce368c0358ec27ef6180b228a0057f lib/codeql/rust/elements/internal/generated/RangeExpr.qll 23cca03bf43535f33b22a38894f70d669787be4e4f5b8fe5c8f7b964d30e9027 18624cef6c6b679eeace2a98737e472432e0ead354cca02192b4d45330f047c9 lib/codeql/rust/elements/internal/generated/RangePat.qll 80826a6a6868a803aa2372e31c52a03e1811a3f1f2abdb469f91ca0bfdd9ecb6 34ee1e208c1690cba505dff2c588837c0cd91e185e2a87d1fe673191962276a9 -lib/codeql/rust/elements/internal/generated/Raw.qll 6e32bd7167d3eece2d22f893a92410129b1bd18e59533b1cf82f72f31465b43a bb25c56118df0e2755be2350cf307c19e6c4d85b2a39388c08f2cc1bad303692 +lib/codeql/rust/elements/internal/generated/Raw.qll 3c0155cada06e8b03749b6607abeca93a865f5935a905043ac91c53d417175cd 6ebbd128c0f426155fcbda9a2efd9c890d108b3ed87068830a756664d90a96c2 lib/codeql/rust/elements/internal/generated/RefExpr.qll 7d995884e3dc1c25fc719f5d7253179344d63650e217e9ff6530285fe7a57f64 f2c3c12551deea4964b66553fb9b6423ee16fec53bd63db4796191aa60dc6c66 lib/codeql/rust/elements/internal/generated/RefPat.qll 456ede39837463ee22a630ec7ab6c8630d3664a8ea206fcc6e4f199e92fa564c 5622062765f32930465ba6b170e986706f159f6070f48adee3c20e24e8df4e05 lib/codeql/rust/elements/internal/generated/RefTypeRepr.qll 5b0663a6d234572fb3e467e276d019415caa95ef006438cc59b7af4e1783161e 0e27c8a8f0e323c0e4d6db01fca821bf07c0864d293cdf96fa891b10820c1e4b @@ -593,17 +629,18 @@ lib/codeql/rust/elements/internal/generated/Struct.qll 56775b98f793c108bd0eb8f35 lib/codeql/rust/elements/internal/generated/StructExpr.qll e77702890561102af38f52d836729e82569c964f8d4c7e680b27992c1ff0f141 23dc51f68107ab0e5c9dd88a6bcc85bb66e8e0f4064cb4d416f50f2ba5db698c lib/codeql/rust/elements/internal/generated/StructExprField.qll 6bdc52ed325fd014495410c619536079b8c404e2247bd2435aa7685dd56c3833 501a30650cf813176ff325a1553da6030f78d14be3f84fea6d38032f4262c6b0 lib/codeql/rust/elements/internal/generated/StructExprFieldList.qll 298d33442d1054922d2f97133a436ee559f1f35b7708523284d1f7eee7ebf443 7febe38a79fadf3dcb53fb8f8caf4c2780f5df55a1f8336269c7b674d53c6272 -lib/codeql/rust/elements/internal/generated/StructField.qll 0ccd678b64b82fdab7ffe9eb74f0d393b22da4459fe72248828896b5204c009c 0faf5a517eccc43141a48809ed35b864341a35764de2dba7442daa899ff4ff69 +lib/codeql/rust/elements/internal/generated/StructField.qll 23c5a0b26936582f43b8bb567825257aab29ee8a3d4ff646ca1dff2e3063bf41 163c446ae52519fd77c1108719e014c41caad205b303848782c45fa50b37b254 lib/codeql/rust/elements/internal/generated/StructFieldList.qll 5da528a51a6a5db9d245772aec462d1767bcc7341e5bedd1dc1bbedd3e4ab920 dac4cee3280eef1136ffc7fbc11b84b754eb6290fc159c6397a39ae91ceeaa13 lib/codeql/rust/elements/internal/generated/StructPat.qll c76fa005c2fd0448a8803233e1e8818c4123301eb66ac5cf69d0b9eaafc61e98 6e0dffccdce24bca20e87d5ba0f0995c9a1ae8983283e71e7dbfcf6fffc67a58 lib/codeql/rust/elements/internal/generated/StructPatField.qll 5b5c7302dbc4a902ca8e69ff31875c867e295a16a626ba3cef29cd0aa248f179 4e192a0df79947f5cb0d47fdbbba7986137a6a40a1be92ae119873e2fad67edf lib/codeql/rust/elements/internal/generated/StructPatFieldList.qll 1a95a1bd9f64fb18e9571657cf2d02a8b13c747048a1f0f74baf31b91f0392ad fc274e414ff4ed54386046505920de92755ad0b4d39a7523cdffa4830bd53b37 -lib/codeql/rust/elements/internal/generated/Synth.qll 3b9f71b9b6b9952c967e1ba74175b74dd563492d5adc00a27e19ab735bf37918 3ef3e4fe71ab08f772ebd68036cba7b2ec4109d706cfb03747aa05835f376628 -lib/codeql/rust/elements/internal/generated/SynthConstructors.qll ec935bac4f775b64c76cd15ab975d885f544e77bf4833fd0f47acd40438fe66f ec935bac4f775b64c76cd15ab975d885f544e77bf4833fd0f47acd40438fe66f +lib/codeql/rust/elements/internal/generated/Synth.qll f3914d3d346fe9dad959b7c7fa88a791860284c848aaa339b800e521195dde08 87a338c138bc8322ddc34b7a265232be294cf7b0a07944b478b8ee9531841e6a +lib/codeql/rust/elements/internal/generated/SynthConstructors.qll aea619227c640e27d715bf57c00bfde840a31d28addc8baee3b38aeb16bdf721 aea619227c640e27d715bf57c00bfde840a31d28addc8baee3b38aeb16bdf721 lib/codeql/rust/elements/internal/generated/Token.qll 77a91a25ca5669703cf3a4353b591cef4d72caa6b0b9db07bb9e005d69c848d1 2fdffc4882ed3a6ca9ac6d1fb5f1ac5a471ca703e2ffdc642885fa558d6e373b lib/codeql/rust/elements/internal/generated/TokenTree.qll 1a3c4f5f30659738641abdd28cb793dab3cfde484196b59656fc0a2767e53511 de2ebb210c7759ef7a6f7ee9f805e1cac879221287281775fc80ba34a5492edf +lib/codeql/rust/elements/internal/generated/TokenTreeMeta.qll 6952cd186e38c4a41131f93754010c8af3c210324d5a8ce3831694aa6be9f2aa 7a23c380fc8aa02c53370e0c68536a7e9fed8aad58185cb0f6110093c3067543 lib/codeql/rust/elements/internal/generated/Trait.qll 8fa41b50fa0f68333534f2b66bb4ec8e103ff09ac8fa5c2cc64bc04beafec205 ce1c9aa6d0e2f05d28aab8e1165c3b9fb8e24681ade0cf6a9df2e8617abeae7e -lib/codeql/rust/elements/internal/generated/TraitAlias.qll 40a296cf89eceaf02a32db90acb42bdc90df10e717bae3ab95bc09d842360a5b af85cf1f8fa46a8b04b763cdcacc6643b83c074c58c1344e485157d2ceb26306 +lib/codeql/rust/elements/internal/generated/TryBlockModifier.qll 812cc73a945abaa51054e7261daf4dc10912f1e331f202186001ed087a962696 a76457699f3f6bc1373276a0de2f14365e573d34e82fd292c6c9261612c0f17e lib/codeql/rust/elements/internal/generated/TryExpr.qll 73052d7d309427a30019ad962ee332d22e7e48b9cc98ee60261ca2df2f433f93 d9dd70bf69eaa22475acd78bea504341e3574742a51ad9118566f39038a02d85 lib/codeql/rust/elements/internal/generated/TupleExpr.qll 98f10bc72d09f98e3be87f41b1a3cbf037f4a7e3d3560dfa6d5759905a8177a5 6a9eb5568c518876b2912371e2b7b774cf5245097c5a0206eda35b749995f00b lib/codeql/rust/elements/internal/generated/TupleField.qll 121f7b35e28b86592f83e00993f9041acbe7ab636db894d03055149c7f15fd32 b1ba9e1182307a44bb5afc11e92d62e7eb2c819ccdfb28ef54943b6fec676827 @@ -622,12 +659,13 @@ lib/codeql/rust/elements/internal/generated/UnderscoreExpr.qll b3780c99c5d57159b lib/codeql/rust/elements/internal/generated/Unextracted.qll 01563dfd769d6dc3c6b8a40d9a4dc0d99a3b6a0c6725c180d2bf4d7633929a17 a93ce90f8c03f4305e59de9c63f089fc7935298fc9a73d091d76933cf63e790c lib/codeql/rust/elements/internal/generated/Unimplemented.qll a3eb304781991bff1227de1e4422b68bf91e7b344e4f6c9e874b324e82a35e60 6bc4839fda3850a56dc993b79ef9ba921008395c8432b184e14438fba4566f21 lib/codeql/rust/elements/internal/generated/Union.qll 4df8fc632f7bcc0cbd564cd1c148c1a2438f26e6a83cd6470e15870120f677fe c74dea0a4ddfd581b9208d7907ea134219cafd217294315acf5c595de38a61f3 +lib/codeql/rust/elements/internal/generated/UnsafeMeta.qll ec5515798be2395a1256460d9272fe023bc604d952eba5d18e13d3e43fc801ff 3ece9a326a7c91d49395e3dc6687a38e2e2736cc20e4b7c534eb7a4e73613264 lib/codeql/rust/elements/internal/generated/Use.qll cf95b5c4756b25bee74113207786e37464ffbc0fb5f776a04c651300afc53753 1fe26b3904db510184cb688cb0eeb0a8dbac7ac15e27a3b572d839743c738393 lib/codeql/rust/elements/internal/generated/UseBoundGenericArg.qll 69162794e871291545ea04f61259b2d000671a96f7ca129f7dd9ed6e984067c4 31de9ebc0634b38e2347e0608b4ea888892f1f2732a2892464078cd8a07b4ee8 lib/codeql/rust/elements/internal/generated/UseBoundGenericArgs.qll cedde7ccf689e3a2a246113be94544c206c56fb1c01b83b074e1f6edd3acfced f022ea4c653d1b5f311917efde8e59be27394ce7f6abf2561bb1e42f93f74adf lib/codeql/rust/elements/internal/generated/UseTree.qll 3d7cbcc8ae76068b8f660c7d5b81b05595026043015cd6b4d42a60ed4c165811 b9f0bcf82feb31f31406e787670fee93e1aa0966bcc0e4cc285c342e88793e4e lib/codeql/rust/elements/internal/generated/UseTreeList.qll 38efaa569b76ca79be047703279388e8f64583a126b98078fbbb6586e0c6eb56 1623a50fd2d3b1e4b85323ad73dd655172f7cbc658d3506aaa6b409e9ebe576e -lib/codeql/rust/elements/internal/generated/Variant.qll fa6909715133049b3dba4622e6262fa30c4a9478b6219ec4fd12e07c58750709 71fc2ddac97fc4c4e6b92a13ee217cccc81dffc7c12295b6bc97c56ad25a92cc +lib/codeql/rust/elements/internal/generated/Variant.qll 7a1aedf6518780d1534147d5a52d14542698befe1d8eb8b78eb10d2664c3a69b 180d6de0826b1a75bf8b1853d539f605bff2eb3794ccb57ff23e5b3ee3171956 lib/codeql/rust/elements/internal/generated/VariantList.qll 3f70bfde982e5c5e8ee45da6ebe149286214f8d40377d5bc5e25df6ae8f3e2d1 22e5f428bf64fd3fd21c537bfa69a46089aad7c363d72c6566474fbe1d75859e lib/codeql/rust/elements/internal/generated/Visibility.qll af1069733c0120fae8610b3ebbcdcebe4b4c9ce4c3e3d9be3f82a93541873625 266106bdff4d7041d017871d755c011e7dd396c5999803d9e46725b6a03a2458 lib/codeql/rust/elements/internal/generated/WhereClause.qll aec72d358689d99741c769b6e8e72b92c1458138c097ec2380e917aa68119ff0 81bb9d303bc0c8d2513dc7a2b8802ec15345b364e6c1e8b300f7860aac219c36 @@ -636,7 +674,7 @@ lib/codeql/rust/elements/internal/generated/WhileExpr.qll 0353aab87c49569e1fbf58 lib/codeql/rust/elements/internal/generated/WildcardPat.qll d74b70b57a0a66bfae017a329352a5b27a6b9e73dd5521d627f680e810c6c59e 4b913b548ba27ff3c82fcd32cf996ff329cb57d176d3bebd0fcef394486ea499 lib/codeql/rust/elements/internal/generated/YeetExpr.qll cac328200872a35337b4bcb15c851afb4743f82c080f9738d295571eb01d7392 94af734eea08129b587fed849b643e7572800e8330c0b57d727d41abda47930b lib/codeql/rust/elements/internal/generated/YieldExpr.qll 37e5f0c1e373a22bbc53d8b7f2c0e1f476e5be5080b8437c5e964f4e83fad79a 4a9a68643401637bf48e5c2b2f74a6bf0ddcb4ff76f6bffb61d436b685621e85 -lib/codeql/rust/elements.qll be9c7606d429b62fcb8686285e8eeff41f45f0dd22feb5b4fd3ea2f3cdfb39be be9c7606d429b62fcb8686285e8eeff41f45f0dd22feb5b4fd3ea2f3cdfb39be +lib/codeql/rust/elements.qll 55ccf59deeb718517703e2aa9e90452736de118032d3bdad4b4ab7295cbb795a 55ccf59deeb718517703e2aa9e90452736de118032d3bdad4b4ab7295cbb795a test/extractor-tests/generated/Abi/Abi.ql 086ed104ab1a7e7fe5c1ed29e03f1719a797c7096c738868bf6ebe872ab8fdaa fe23fe67ab0d9201e1177ea3f844b18ed428e13e3ce77381bf2b6910adfa3a0e test/extractor-tests/generated/ArgList/ArgList.ql da97b5b25418b2aa8cb8df793f48870c89fa00759cdade8ddba60d7f1f4bbc01 acfd5d2caf67282ad2d57b961068472100482d0f770a52a3c00214c647d18c75 test/extractor-tests/generated/ArrayListExpr/ArrayListExpr.ql 42b365276aa43e2cad588338463542d3ce1dd0db3a428621554584b07a1431d5 08a66a8b69af35ee3bc64c35c453a19a6c9881cc6cc7e65275d1fff056121270 @@ -659,11 +697,15 @@ test/extractor-tests/generated/Attr/Attr.ql 88f9a524b557e81006a5079ac6d703c42df0 test/extractor-tests/generated/AwaitExpr/AwaitExpr.ql 93ccb34e00b37deecd6d3019bb47948daffe55a2d5d031c60b4f6fa7a61412a4 5502459743efd8346ab943ff3334545407b21aaf0771bf422be58a5df5d27381 test/extractor-tests/generated/BecomeExpr/BecomeExpr.ql 7076b3f965c680e8f03bccd9ecb4495d03d35a4f460ec43628c19314eae8b49e 961e6e656e467ba389bbc6db39f345d9a8afaae4584d357dfe47484c6afadb99 test/extractor-tests/generated/BinaryExpr/BinaryExpr.ql 4e849e6eaae581f487aa74d09d1106e441c876b06474389687a04df446690a4d 6cd36dfdb0af25396d2219fe2789f898e2393cc3f10a25410b2ede5d216707cd -test/extractor-tests/generated/BlockExpr/BlockExpr.ql cd6ef66de9e56ebb74964e59617d47999fb8c9081e885acece17a3b747a35ae1 6766844c1b87e518688565f2469575af5ca4e0ff4eb0c0b620df73a451d86a0b +test/extractor-tests/generated/BlockExpr/BlockExpr.ql d2917477f9cf09e1548fdbf9a5d835a1c0cec14705b3cbd16831c6a169050339 85937baa90543dc63407c53d69090d16134591f5f0baaf32c927105fb3bab865 test/extractor-tests/generated/BoxPat/BoxPat.ql 854c9ba4e045dbe7ea1666866c1c443a92597df0ce02f4ca5993142925941c39 a22c17cce0bff7d1df51b817d2cb1a61045357f91be14465166971efa5f5daad test/extractor-tests/generated/BreakExpr/BreakExpr.ql c2181211da3dfe983cfca93ead32d5d211e91181899b9477152c58124eaa846d 57e57b926e14db2efb2e88e04699608b2ba9797ee4f6c4f710135b6858982256 test/extractor-tests/generated/CallExpr/CallExpr.ql 16d85d6e5cb68384d0b932fb4506c1855019b819f2c5faa39a4472f39427623a 14df8383948cedaff88f514f7239c1ec8c424720d24e3546cbcd0b689acecdb1 test/extractor-tests/generated/CastExpr/CastExpr.ql 3480ec51072399409b7553ab6139c832db6ed4ca991f3a7a2282a39afe07c6f2 614c8ea7a2fe30d57583dbf84ed7a12743c2aba49d8c6252d31af3ed10853a39 +test/extractor-tests/generated/CfgAtom/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 +test/extractor-tests/generated/CfgAttrMeta/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 +test/extractor-tests/generated/CfgComposite/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 +test/extractor-tests/generated/CfgMeta/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 test/extractor-tests/generated/ClosureExpr/ClosureExpr.ql 675ae07193241fbd710ece4f74f86e9b00f47841299b1c5934f55dbf13a4b4af 21fb0664619c9c889e9491bfd651c2814dcf0f158dd6269937bd0acc18be6b0e test/extractor-tests/generated/Comment/Comment.ql 0e0454911d2cf2e7ef5c6d860b84c57b9d490090914ebcf4fa0e8a70f777f066 cbd1c195276ef163f8d3c122344738c884dc9fb70eb2f9b7067829d735d48c4c test/extractor-tests/generated/Const/Const.ql 97797a56743b519c1990682ccb22af6d997ed5eea1e280b52ad31b16a5836f9e e5289ebcb71a25b7ac0a7e1aa0111e4f3ec83d26b7f83e819509c9b9d756921d @@ -683,8 +725,9 @@ test/extractor-tests/generated/FnPtrTypeRepr/FnPtrTypeRepr.ql 1501730f1e02e9d22b test/extractor-tests/generated/ForBinder/ForBinder.ql c95fd006eaddb9535eda0d527d71cdd5d3745fe464fd809a8d58b8c4dfc8790e 1d8b38059b8a25965eab9a8a1286384aa994d7cac7414b70b63c6a3d6bcf3c39 test/extractor-tests/generated/ForExpr/ForExpr.ql 3bac38bf33e140ae9f88371ec90409f7de867e39cdea46f02b15519b236b57cb aade1baf6e6081b3b9bce5b7e95fe4b7ffe00ea9450fd6e1d6692ad97cf93fe9 test/extractor-tests/generated/ForTypeRepr/ForTypeRepr.ql 5961055988b3a7749fb80e24d924bf1b67b0c52a6c895379beedd66a34bad04f d8ab72fac742314ead1aa0e1fed2535cc6597d278f3eef017bc9f8fd8cde83e7 +test/extractor-tests/generated/FormatArgsArgName/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 test/extractor-tests/generated/FormatArgsExpr/Format.ql 237ed2e01d9a75ee8521d6578333a7b1d566f09ef2102c4efcbb34ea58f2f9e8 09007ce4de701c0d1c0967f4f728ea9e627d9db19431bd9caebbf28ee51a1f36 -test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg.ql 5abcb565dcd2822e2ea142d19b8c92194ee17c71c3db7595248690034559d174 1ffa743fc678701ffeefff6c14c1414bb9158e6756f32380dd590ff44b19ca5a +test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg.ql 30e57945c51bfde4c0cf69e404741548c899450e5dd6622b8caabd1394b10eaf d6d38db1e2ea20ce5f0cd858817fe306397a9ba50eb9be08e132eaf897cb5592 test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr.ql 243c2f9d830f1eae915749e81ac78d3c140280385b0002d10fcc4d2feaf14711 72b90a99a8b1c16baf1e254e1e3463c3ce5409624a2a90829122717d4e5a2b74 test/extractor-tests/generated/FormatArgsExpr/FormatArgument.ql 0a345eb48dba8e535d12a00e88008e71b3ce692fbf8f9686c8885e158635dffe eab1f230fd572474a3f304f97d05bbf4a004c52773aaf2d34f999192244c0b80 test/extractor-tests/generated/FormatArgsExpr/FormatTemplateVariableAccess.ql 24108cdc54feb77c24bb7894744e36e374f0c03d46d6e6c3fcb2012b1ad117f6 05a6b6f51029ee1a15039aa9d738bb1fd7145148f1aad790198fba832572c719 @@ -698,6 +741,7 @@ test/extractor-tests/generated/ImplTraitTypeRepr/ImplTraitTypeRepr.ql 311c6c1e18 test/extractor-tests/generated/IndexExpr/IndexExpr.ql ecfca80175a78b633bf41684a0f8f5eebe0b8a23f8de9ff27142936687711263 27d4832911f7272376a199550d57d8488e75e0eeeeb7abbfb3b135350a30d277 test/extractor-tests/generated/InferTypeRepr/InferTypeRepr.ql 6ba01a9e229e7dfdb2878a0bdbeb6c0888c4a068984b820e7a48d4b84995daa2 7120cafd267e956dbb4af5e19d57237275d334ffe5ff0fb635d65d309381aa46 test/extractor-tests/generated/ItemList/ItemList.ql e29302a9212b07fdaf93618852be30adfac64b292e9a0ddbf63addb803daaa98 7e69a78b0f58ef9344892113799092149024c1352b0965a6326d8a45cd44771a +test/extractor-tests/generated/KeyValueMeta/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 test/extractor-tests/generated/Label/Label.ql da1f302da6cb31e6ccb73c722d9d5cfaad6a26d9869b3fa09fe50b03e26f3d9b 5fbfabfef6567ec6609be1af7859eba8ecb1f7f1878b8fac426e0d7098c17ba1 test/extractor-tests/generated/LetElse/LetElse.ql ec8e7362ce9f903731ed6bfc190fc18a6f60abf150f5cee878a0fb9adaa20b94 2e019b6e246caabe4800ab940bc150bd8e466d59dde87bd614bf064adb703c8f test/extractor-tests/generated/LetExpr/LetExpr.ql 59f70af49ba496559a7ccfe30e737597fb473794d677627d344a9285f85dad33 b59d1f665c600055666a422c4008878cecf17d9ff847cd02b6e0e82ca73073bc @@ -719,7 +763,6 @@ test/extractor-tests/generated/MatchArm/MatchArm.ql 704976bd48e56a0a2fce7c2d9454 test/extractor-tests/generated/MatchArmList/MatchArmList.ql bbc679fe6d8dedf9131d0fa5faa7b44c138c5f56b9cf3cb209fd3ccd614b689c 916c53a2b68646b52f2d28eca2a19218ba9d12eb8edf7c6cc4140dace1bf4e0d test/extractor-tests/generated/MatchExpr/MatchExpr.ql b75a5936401bb5ca38686f1413f5c8267ad685722560a2e9041dacf2f8d54abc 7da57118fe5b1f7f5cbe8d6b5f3ae70816fd4837b1c2e6401b98175b36ca233f test/extractor-tests/generated/MatchGuard/MatchGuard.ql 91de18a0a18d120db568b2c329e5cb26f83e327cf22c5825c555ea17249d7d23 0bcdb25895362128517227c860b9dad76851215c2cdf9b2d0e5cc3534278f4ec -test/extractor-tests/generated/Meta/Meta.ql 43dd1cd669099b38396b316616992af6d84b0c1cee953b19235a00ab3d3bb43c 80b1885809aa074357e21707d1f8c6dca19f0b968ccff43229bb0d5c6fffb2b2 test/extractor-tests/generated/MethodCallExpr/MethodCallExpr.ql 9d5af6b4771a8725fa5b56ccb3e2a33158b18c876546b88e6dc63da1f887910a 494c8c2fe5584aac45c828b38d8bb20c113927a1e909773d4a2dbd3965d26170 test/extractor-tests/generated/Module/Module.ql d7c442fd1b1f4f00da87e2228fc1aeeab0bb86648b2aa06a9dd6f40dbae1ee28 3229388727d14048e87238bcda5fde1bed503e5cac088922381e5833cfc32fa9 test/extractor-tests/generated/Name/Name.ql b2fe417f7c816f71d12622b4f84ece74eba3c128c806266a55b53f8120fa4fb3 8bc65bbf3f2909637485f5db7830d6fc110a94c9b12eefe12d7627f41eae2256 @@ -738,6 +781,7 @@ test/extractor-tests/generated/Path/PathExpr.ql caa2a41b5cc3af837fcf52b49abc5f45 test/extractor-tests/generated/Path/PathPat.ql 8a6a759f4bbf4fa9c23fd235ce4d63f04bd715a86a6e71bba0a324fe1231d947 be23d83e4f6ac209f3f7c382fce6b9bc57db17a26b236bdf8215848285e345ff test/extractor-tests/generated/Path/PathSegment.ql 87774cc2e9d1be7aaf8748d418b151d7ec03fb20fda9430ebabd86ddaebf5538 699545d8eb2d6325bcd2c253d56339bd71170b34e80efe5155189fbbdde9fbbc test/extractor-tests/generated/Path/PathTypeRepr.ql 32023340cb9aa1fbf52a1a3e330c6f3206e1c64c9dce2f795d9e434aa5a1533b f451de0d4941ab79014d2883b46291f9f05f79d479fcdcab387020ab3ed68703 +test/extractor-tests/generated/PathMeta/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 test/extractor-tests/generated/PrefixExpr/PrefixExpr.ql 63e9dbae0d0b46d5e9d60c313e408c4c7ee1a93c5a26fe4c01a632911de961d0 09fcc28bb22553356aebf9ea93811703e5404b88022be8dab61ac81d3b187b75 test/extractor-tests/generated/PtrTypeRepr/PtrTypeRepr.ql d9289bfe1e72d9560b3878e4557f8cfda578ef7bce67eb29d7320921c0ba46a5 f3ea108aa25635bffa7673bb66b2581ce246d3aae86edf878c6f1abca2493c16 test/extractor-tests/generated/RangeExpr/RangeExpr.ql c9776706d933606d1463bb08ed76457ac03a9558f6dac0218ef2012bc5e8e48f 77cafee86abc2680e1f9c925fbe664c05ba1b9a2533b1873242ef01dde1ce308 @@ -760,15 +804,16 @@ test/extractor-tests/generated/Struct/Struct.ql 57e837e3c665d24870d99492c8874441 test/extractor-tests/generated/StructExpr/StructExpr.ql 3b98205260e750cc7adc42b318deef2854cc3b4f921cbcfffc6d701553af3903 368bccf01db2fa069dca30d9fb0878f8e6a88d4ce58b333b24a18620933e4c91 test/extractor-tests/generated/StructExprField/StructExprField.ql b65375963aa24f0d1dd4c10784e32ab8c337ad431462ea1d081a0e456fbb1362 7f5a49e8df03ed0890b51c2e941d636fbbf70445a53d3af2c0f34a04f26bc6ef test/extractor-tests/generated/StructExprFieldList/StructExprFieldList.ql 01dc3ef66d79836a3d372464f05454015648ab093f9547c5d9c5d55271acb718 83625301c097fa38d4e6021ea28b8adc6338076c8c2aa88a86a22aac412839f6 -test/extractor-tests/generated/StructField/StructField.ql dbdb627202975a0ca07ed441449ecc95d9d0764084a49a18e7849164b2e65ce2 8e7f32f28d15104575eaa985e892c162ec775adf3481c227ef618b5668168de7 +test/extractor-tests/generated/StructField/StructField.ql 322229f824f2e2e2c4fb76ff35e343559bbe986982d40ca8739a071ee9778de4 535c3958f316c7106de50aa507f159b99b58cef4707e1f6b0a5ea48913d9c49c test/extractor-tests/generated/StructFieldList/StructFieldList.ql 292170b20f3a55c0cd6a8d78ce99474ca68daf6fb380cffe00b2bd7074e1b73a 404bab780f290ae04d1d71d3c6d4e0092bb3d8c55e956168d2a445cbd6d1f06d test/extractor-tests/generated/StructPat/StructPat.ql 894babd64d3def35717cbeed6eb4799cf9f52e73992822b72fc521c93efb4935 5bd1502b69014d70464b4b76795e1732ac2a6db5d028bea52929cf1998af5f07 test/extractor-tests/generated/StructPatField/StructPatField.ql 92cb6a4b5234359c02d66085b10d41f37b77370491ed478ad6d4d9b12b943ecf 14bc2079763b53bc6ab11356f3bb21820ae9e4dd1b2a42a78665c32181c4ef92 test/extractor-tests/generated/StructPatFieldList/StructPatFieldList.ql a3ba3e99d3c87d5e0ae0ad82cbea3600ac1745e9364d54d8d51224b51a5a09a5 5942ed2722c006bae99de9174249110bfc79594c5ef9a6dfc098ae2be269b8f3 test/extractor-tests/generated/TokenTree/TokenTree.ql 55592f43a6fe99045d0b0b1e2323211d3a3fd64a8c7d2b083f2518d4c3e2e4b0 8eeef2060c80b0918857ba9b3a8543a4b866ca04be3d5ca18aae8a26cbdb836e +test/extractor-tests/generated/TokenTreeMeta/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 test/extractor-tests/generated/Trait/AssocItemList.ql 065c4903992500423d796800e7dc9a5835a07cbada595108f3af6efa72517782 aa797bf5ddefb800d5ca7f49c19c5124b1007e1658129b27c8c3de34427c7f08 test/extractor-tests/generated/Trait/Trait.ql e59d9d97baedc5691f9fb837e3600b1b33808c598971d8abe28121a9c70292b4 0da2808421a1e1acbc61076d4b50c559f2abf02cbd5f69ba15a65457887ff435 -test/extractor-tests/generated/TraitAlias/TraitAlias.ql 9a4bcbf850afd833606f9447493b848e9a5df593198e5fc7a3a5bfb1c4c0782c 1f738eaf245220142d9fe5b88718980494b1e3c5b68609f5ee591056f23ea765 +test/extractor-tests/generated/TryBlockModifier/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 test/extractor-tests/generated/TryExpr/TryExpr.ql 4e3c224a7d5fb8f01654c7d3c79414daa575897cfa6f351fcd5b5832f53a151f d961a497c304c1c5aa1d94e04aed2bf17a2c422e315f05986e1a9027e69dbd2a test/extractor-tests/generated/TupleExpr/TupleExpr.ql 4011d94438903e96fa321285558f5791bee7e1d1fb26be0381586511cf439d1b c6bc8d08a8d5d98d7a52b72d5c597b63754fe12cec653c520833e4b71a9dcea4 test/extractor-tests/generated/TupleField/TupleField.ql ed681b7fee5e68d24db4999389727b2589e5af793d3c2ddc8b1e245713c0e1f8 4f867b29adf91b4bfa5052e16d392c16bf260e858aad11b60c42f1eddb476e61 @@ -783,11 +828,12 @@ test/extractor-tests/generated/TypeBoundList/TypeBoundList.ql 6827529eca62f5e7be test/extractor-tests/generated/TypeParam/TypeParam.ql c5f8f62f2877c719c3cf069f9d0ca83cebc14f7611c6c2dce86c85114ea2635c 751c630986f35a8d0d32fbeb61ca6ff801c96cd1829dbccc874fbf5f5158e98d test/extractor-tests/generated/UnderscoreExpr/UnderscoreExpr.ql a7b7a93104fff28515154cf8e79045d3eea2494b5c46f1caf36639c53b1c64a7 070ee2e1664e3291646ea56681b5c93331f94dcc519deb28622beca3e26e16f3 test/extractor-tests/generated/Union/Union.ql 427757ef5aa4e95fde8f5047263cbbbc7e2614f9efabc51c9a5f9ba8d9b68310 d1d8840a4324e5727e1ecf6e696741e902b807b39ec82686b94211803eb2d0ba +test/extractor-tests/generated/UnsafeMeta/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 test/extractor-tests/generated/Use/Use.ql 1f084f3b49c910c6e01d2a81be2443e84c2836a5855b89874965efaf25d17511 d5bf37ba65f4d280312ca798bae22d2735c00cf91ff05ed6321f69b76b4551bc test/extractor-tests/generated/UseBoundGenericArgs/UseBoundGenericArgs.ql 46ff2cf0fc8b561b21f8dff3230550f2feafbe52a7ea8b28bf183abef94ff241 92646f3bd15a8cf4c23ee9de4d857ac5c147e570ef0eb223423a109b4b79aedf test/extractor-tests/generated/UseTree/UseTree.ql 3c2bc924b54b9af5c95784023d4098924571ba464c5982124acea712c3ce0e93 8d9f963b61a9a8a83efd93438ce8b43d4aa763493338ad9afd2a3dc7a440892d test/extractor-tests/generated/UseTreeList/UseTreeList.ql faff7bfc060d5b0a922f38b37bf586596566186f704c9921651785580e86d684 81e5b90edeef0d3883547844a030e72b555d714de1ed8dded1c22a3772b4449a -test/extractor-tests/generated/Variant/Variant.ql 6b1936698cec413f1645d52e3f4d6d995968d432466241eb823c1ae635c852dd 0b5b0248f09ae01b683ea835299d51fa26f6b5a584e889c538b0f0cf13106d0f +test/extractor-tests/generated/Variant/Variant.ql 0de458e2d04e40e9a0c036e423d05af3617f4423b967e287f0800ccffd345633 921a8ca71390812f174c5220d54dfcfc7105e57ba3c301f5c86301a19d089bda test/extractor-tests/generated/VariantList/VariantList.ql 1c1d82ce3ecfa7daaae1920662510e81892ed899a3c2f785e2ff3670245a03cd 29d4c5ab2b737a92c7525789e10a4aa9848f1a327e34f4e9543018021106b303 test/extractor-tests/generated/Visibility/Visibility.ql 725d47d7444332133df603f9b06592dc40b0f83bf5e21ad4781c5658e001a3aa 2d65a30702a8bb5bc91caf6ae2d0e4c769b3eeb0d72ffbd9cdb81048be4061ad test/extractor-tests/generated/WhereClause/WhereClause.ql a6f0e69ffa6b997cac04d4da442eb8bde517a576840c953abcc40863b9099ba1 7ce888fffc3038d5b18f8c94d3b045815cd45500e1bb3849c05fc874edbeb695 diff --git a/rust/ql/.gitattributes b/rust/ql/.gitattributes index d8004cb5b35e..d4feb85fc476 100644 --- a/rust/ql/.gitattributes +++ b/rust/ql/.gitattributes @@ -36,6 +36,11 @@ /lib/codeql/rust/elements/CallExpr.qll linguist-generated /lib/codeql/rust/elements/Callable.qll linguist-generated /lib/codeql/rust/elements/CastExpr.qll linguist-generated +/lib/codeql/rust/elements/CfgAtom.qll linguist-generated +/lib/codeql/rust/elements/CfgAttrMeta.qll linguist-generated +/lib/codeql/rust/elements/CfgComposite.qll linguist-generated +/lib/codeql/rust/elements/CfgMeta.qll linguist-generated +/lib/codeql/rust/elements/CfgPredicate.qll linguist-generated /lib/codeql/rust/elements/ClosureExpr.qll linguist-generated /lib/codeql/rust/elements/Comment.qll linguist-generated /lib/codeql/rust/elements/Const.qll linguist-generated @@ -61,6 +66,7 @@ /lib/codeql/rust/elements/ForTypeRepr.qll linguist-generated /lib/codeql/rust/elements/Format.qll linguist-generated /lib/codeql/rust/elements/FormatArgsArg.qll linguist-generated +/lib/codeql/rust/elements/FormatArgsArgName.qll linguist-generated /lib/codeql/rust/elements/FormatArgsExpr.qll linguist-generated /lib/codeql/rust/elements/FormatArgument.qll linguist-generated /lib/codeql/rust/elements/FormatTemplateVariableAccess.qll linguist-generated @@ -77,6 +83,7 @@ /lib/codeql/rust/elements/InferTypeRepr.qll linguist-generated /lib/codeql/rust/elements/Item.qll linguist-generated /lib/codeql/rust/elements/ItemList.qll linguist-generated +/lib/codeql/rust/elements/KeyValueMeta.qll linguist-generated /lib/codeql/rust/elements/Label.qll linguist-generated /lib/codeql/rust/elements/LabelableExpr.qll linguist-generated /lib/codeql/rust/elements/LetElse.qll linguist-generated @@ -122,6 +129,7 @@ /lib/codeql/rust/elements/PathAstNode.qll linguist-generated /lib/codeql/rust/elements/PathExpr.qll linguist-generated /lib/codeql/rust/elements/PathExprBase.qll linguist-generated +/lib/codeql/rust/elements/PathMeta.qll linguist-generated /lib/codeql/rust/elements/PathPat.qll linguist-generated /lib/codeql/rust/elements/PathSegment.qll linguist-generated /lib/codeql/rust/elements/PathTypeRepr.qll linguist-generated @@ -155,8 +163,9 @@ /lib/codeql/rust/elements/StructPatFieldList.qll linguist-generated /lib/codeql/rust/elements/Token.qll linguist-generated /lib/codeql/rust/elements/TokenTree.qll linguist-generated +/lib/codeql/rust/elements/TokenTreeMeta.qll linguist-generated /lib/codeql/rust/elements/Trait.qll linguist-generated -/lib/codeql/rust/elements/TraitAlias.qll linguist-generated +/lib/codeql/rust/elements/TryBlockModifier.qll linguist-generated /lib/codeql/rust/elements/TryExpr.qll linguist-generated /lib/codeql/rust/elements/TupleExpr.qll linguist-generated /lib/codeql/rust/elements/TupleField.qll linguist-generated @@ -175,6 +184,7 @@ /lib/codeql/rust/elements/Unextracted.qll linguist-generated /lib/codeql/rust/elements/Unimplemented.qll linguist-generated /lib/codeql/rust/elements/Union.qll linguist-generated +/lib/codeql/rust/elements/UnsafeMeta.qll linguist-generated /lib/codeql/rust/elements/Use.qll linguist-generated /lib/codeql/rust/elements/UseBoundGenericArg.qll linguist-generated /lib/codeql/rust/elements/UseBoundGenericArgs.qll linguist-generated @@ -238,6 +248,15 @@ /lib/codeql/rust/elements/internal/BreakExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/CallExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/CastExprConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/CfgAtomConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/CfgAtomImpl.qll linguist-generated +/lib/codeql/rust/elements/internal/CfgAttrMetaConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/CfgAttrMetaImpl.qll linguist-generated +/lib/codeql/rust/elements/internal/CfgCompositeConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/CfgCompositeImpl.qll linguist-generated +/lib/codeql/rust/elements/internal/CfgMetaConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/CfgMetaImpl.qll linguist-generated +/lib/codeql/rust/elements/internal/CfgPredicateImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ClosureExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/CommentConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ConstArgConstructor.qll linguist-generated @@ -273,6 +292,8 @@ /lib/codeql/rust/elements/internal/ForTypeReprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/FormatArgsArgConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/FormatArgsArgImpl.qll linguist-generated +/lib/codeql/rust/elements/internal/FormatArgsArgNameConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/FormatArgsArgNameImpl.qll linguist-generated /lib/codeql/rust/elements/internal/FormatArgsExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/FunctionConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/GenericArgImpl.qll linguist-generated @@ -287,6 +308,8 @@ /lib/codeql/rust/elements/internal/InferTypeReprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ItemListConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ItemListImpl.qll linguist-generated +/lib/codeql/rust/elements/internal/KeyValueMetaConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/KeyValueMetaImpl.qll linguist-generated /lib/codeql/rust/elements/internal/LabelConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/LetElseConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/LetExprConstructor.qll linguist-generated @@ -319,7 +342,6 @@ /lib/codeql/rust/elements/internal/MatchExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/MatchGuardConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/MatchGuardImpl.qll linguist-generated -/lib/codeql/rust/elements/internal/MetaConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/MetaImpl.qll linguist-generated /lib/codeql/rust/elements/internal/MethodCallExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/MissingConstructor.qll linguist-generated @@ -346,6 +368,8 @@ /lib/codeql/rust/elements/internal/PathConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/PathExprBaseImpl.qll linguist-generated /lib/codeql/rust/elements/internal/PathExprConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/PathMetaConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/PathMetaImpl.qll linguist-generated /lib/codeql/rust/elements/internal/PathPatConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/PathSegmentConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/PathTypeReprConstructor.qll linguist-generated @@ -394,9 +418,11 @@ /lib/codeql/rust/elements/internal/TokenImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TokenTreeConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/TokenTreeImpl.qll linguist-generated -/lib/codeql/rust/elements/internal/TraitAliasConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/TraitAliasImpl.qll linguist-generated +/lib/codeql/rust/elements/internal/TokenTreeMetaConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/TokenTreeMetaImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TraitConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/TryBlockModifierConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/TryBlockModifierImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TryExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/TryExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TupleExprConstructor.qll linguist-generated @@ -421,6 +447,8 @@ /lib/codeql/rust/elements/internal/UnimplementedConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/UnimplementedImpl.qll linguist-generated /lib/codeql/rust/elements/internal/UnionConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/UnsafeMetaConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/UnsafeMetaImpl.qll linguist-generated /lib/codeql/rust/elements/internal/UseBoundGenericArgImpl.qll linguist-generated /lib/codeql/rust/elements/internal/UseBoundGenericArgsConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/UseBoundGenericArgsImpl.qll linguist-generated @@ -478,6 +506,11 @@ /lib/codeql/rust/elements/internal/generated/CallExpr.qll linguist-generated /lib/codeql/rust/elements/internal/generated/Callable.qll linguist-generated /lib/codeql/rust/elements/internal/generated/CastExpr.qll linguist-generated +/lib/codeql/rust/elements/internal/generated/CfgAtom.qll linguist-generated +/lib/codeql/rust/elements/internal/generated/CfgAttrMeta.qll linguist-generated +/lib/codeql/rust/elements/internal/generated/CfgComposite.qll linguist-generated +/lib/codeql/rust/elements/internal/generated/CfgMeta.qll linguist-generated +/lib/codeql/rust/elements/internal/generated/CfgPredicate.qll linguist-generated /lib/codeql/rust/elements/internal/generated/ClosureExpr.qll linguist-generated /lib/codeql/rust/elements/internal/generated/Comment.qll linguist-generated /lib/codeql/rust/elements/internal/generated/Const.qll linguist-generated @@ -504,6 +537,7 @@ /lib/codeql/rust/elements/internal/generated/ForTypeRepr.qll linguist-generated /lib/codeql/rust/elements/internal/generated/Format.qll linguist-generated /lib/codeql/rust/elements/internal/generated/FormatArgsArg.qll linguist-generated +/lib/codeql/rust/elements/internal/generated/FormatArgsArgName.qll linguist-generated /lib/codeql/rust/elements/internal/generated/FormatArgsExpr.qll linguist-generated /lib/codeql/rust/elements/internal/generated/FormatArgument.qll linguist-generated /lib/codeql/rust/elements/internal/generated/FormatTemplateVariableAccess.qll linguist-generated @@ -520,6 +554,7 @@ /lib/codeql/rust/elements/internal/generated/InferTypeRepr.qll linguist-generated /lib/codeql/rust/elements/internal/generated/Item.qll linguist-generated /lib/codeql/rust/elements/internal/generated/ItemList.qll linguist-generated +/lib/codeql/rust/elements/internal/generated/KeyValueMeta.qll linguist-generated /lib/codeql/rust/elements/internal/generated/Label.qll linguist-generated /lib/codeql/rust/elements/internal/generated/LabelableExpr.qll linguist-generated /lib/codeql/rust/elements/internal/generated/LetElse.qll linguist-generated @@ -567,6 +602,7 @@ /lib/codeql/rust/elements/internal/generated/PathAstNode.qll linguist-generated /lib/codeql/rust/elements/internal/generated/PathExpr.qll linguist-generated /lib/codeql/rust/elements/internal/generated/PathExprBase.qll linguist-generated +/lib/codeql/rust/elements/internal/generated/PathMeta.qll linguist-generated /lib/codeql/rust/elements/internal/generated/PathPat.qll linguist-generated /lib/codeql/rust/elements/internal/generated/PathSegment.qll linguist-generated /lib/codeql/rust/elements/internal/generated/PathTypeRepr.qll linguist-generated @@ -604,8 +640,9 @@ /lib/codeql/rust/elements/internal/generated/SynthConstructors.qll linguist-generated /lib/codeql/rust/elements/internal/generated/Token.qll linguist-generated /lib/codeql/rust/elements/internal/generated/TokenTree.qll linguist-generated +/lib/codeql/rust/elements/internal/generated/TokenTreeMeta.qll linguist-generated /lib/codeql/rust/elements/internal/generated/Trait.qll linguist-generated -/lib/codeql/rust/elements/internal/generated/TraitAlias.qll linguist-generated +/lib/codeql/rust/elements/internal/generated/TryBlockModifier.qll linguist-generated /lib/codeql/rust/elements/internal/generated/TryExpr.qll linguist-generated /lib/codeql/rust/elements/internal/generated/TupleExpr.qll linguist-generated /lib/codeql/rust/elements/internal/generated/TupleField.qll linguist-generated @@ -624,6 +661,7 @@ /lib/codeql/rust/elements/internal/generated/Unextracted.qll linguist-generated /lib/codeql/rust/elements/internal/generated/Unimplemented.qll linguist-generated /lib/codeql/rust/elements/internal/generated/Union.qll linguist-generated +/lib/codeql/rust/elements/internal/generated/UnsafeMeta.qll linguist-generated /lib/codeql/rust/elements/internal/generated/Use.qll linguist-generated /lib/codeql/rust/elements/internal/generated/UseBoundGenericArg.qll linguist-generated /lib/codeql/rust/elements/internal/generated/UseBoundGenericArgs.qll linguist-generated @@ -666,6 +704,10 @@ /test/extractor-tests/generated/BreakExpr/BreakExpr.ql linguist-generated /test/extractor-tests/generated/CallExpr/CallExpr.ql linguist-generated /test/extractor-tests/generated/CastExpr/CastExpr.ql linguist-generated +/test/extractor-tests/generated/CfgAtom/MISSING_SOURCE.txt linguist-generated +/test/extractor-tests/generated/CfgAttrMeta/MISSING_SOURCE.txt linguist-generated +/test/extractor-tests/generated/CfgComposite/MISSING_SOURCE.txt linguist-generated +/test/extractor-tests/generated/CfgMeta/MISSING_SOURCE.txt linguist-generated /test/extractor-tests/generated/ClosureExpr/ClosureExpr.ql linguist-generated /test/extractor-tests/generated/Comment/Comment.ql linguist-generated /test/extractor-tests/generated/Const/Const.ql linguist-generated @@ -685,6 +727,7 @@ /test/extractor-tests/generated/ForBinder/ForBinder.ql linguist-generated /test/extractor-tests/generated/ForExpr/ForExpr.ql linguist-generated /test/extractor-tests/generated/ForTypeRepr/ForTypeRepr.ql linguist-generated +/test/extractor-tests/generated/FormatArgsArgName/MISSING_SOURCE.txt linguist-generated /test/extractor-tests/generated/FormatArgsExpr/Format.ql linguist-generated /test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg.ql linguist-generated /test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr.ql linguist-generated @@ -700,6 +743,7 @@ /test/extractor-tests/generated/IndexExpr/IndexExpr.ql linguist-generated /test/extractor-tests/generated/InferTypeRepr/InferTypeRepr.ql linguist-generated /test/extractor-tests/generated/ItemList/ItemList.ql linguist-generated +/test/extractor-tests/generated/KeyValueMeta/MISSING_SOURCE.txt linguist-generated /test/extractor-tests/generated/Label/Label.ql linguist-generated /test/extractor-tests/generated/LetElse/LetElse.ql linguist-generated /test/extractor-tests/generated/LetExpr/LetExpr.ql linguist-generated @@ -721,7 +765,6 @@ /test/extractor-tests/generated/MatchArmList/MatchArmList.ql linguist-generated /test/extractor-tests/generated/MatchExpr/MatchExpr.ql linguist-generated /test/extractor-tests/generated/MatchGuard/MatchGuard.ql linguist-generated -/test/extractor-tests/generated/Meta/Meta.ql linguist-generated /test/extractor-tests/generated/MethodCallExpr/MethodCallExpr.ql linguist-generated /test/extractor-tests/generated/Module/Module.ql linguist-generated /test/extractor-tests/generated/Name/Name.ql linguist-generated @@ -740,6 +783,7 @@ /test/extractor-tests/generated/Path/PathPat.ql linguist-generated /test/extractor-tests/generated/Path/PathSegment.ql linguist-generated /test/extractor-tests/generated/Path/PathTypeRepr.ql linguist-generated +/test/extractor-tests/generated/PathMeta/MISSING_SOURCE.txt linguist-generated /test/extractor-tests/generated/PrefixExpr/PrefixExpr.ql linguist-generated /test/extractor-tests/generated/PtrTypeRepr/PtrTypeRepr.ql linguist-generated /test/extractor-tests/generated/RangeExpr/RangeExpr.ql linguist-generated @@ -768,9 +812,10 @@ /test/extractor-tests/generated/StructPatField/StructPatField.ql linguist-generated /test/extractor-tests/generated/StructPatFieldList/StructPatFieldList.ql linguist-generated /test/extractor-tests/generated/TokenTree/TokenTree.ql linguist-generated +/test/extractor-tests/generated/TokenTreeMeta/MISSING_SOURCE.txt linguist-generated /test/extractor-tests/generated/Trait/AssocItemList.ql linguist-generated /test/extractor-tests/generated/Trait/Trait.ql linguist-generated -/test/extractor-tests/generated/TraitAlias/TraitAlias.ql linguist-generated +/test/extractor-tests/generated/TryBlockModifier/MISSING_SOURCE.txt linguist-generated /test/extractor-tests/generated/TryExpr/TryExpr.ql linguist-generated /test/extractor-tests/generated/TupleExpr/TupleExpr.ql linguist-generated /test/extractor-tests/generated/TupleField/TupleField.ql linguist-generated @@ -785,6 +830,7 @@ /test/extractor-tests/generated/TypeParam/TypeParam.ql linguist-generated /test/extractor-tests/generated/UnderscoreExpr/UnderscoreExpr.ql linguist-generated /test/extractor-tests/generated/Union/Union.ql linguist-generated +/test/extractor-tests/generated/UnsafeMeta/MISSING_SOURCE.txt linguist-generated /test/extractor-tests/generated/Use/Use.ql linguist-generated /test/extractor-tests/generated/UseBoundGenericArgs/UseBoundGenericArgs.ql linguist-generated /test/extractor-tests/generated/UseTree/UseTree.ql linguist-generated diff --git a/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll b/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll index 6aeaa3dd4f4b..c8b4117a9abb 100644 --- a/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll +++ b/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll @@ -507,11 +507,6 @@ module MakeCfgNodes Input> { */ predicate isMove() { node.isMove() } - /** - * Holds if this block expression is try. - */ - predicate isTry() { node.isTry() } - /** * Holds if this block expression is unsafe. */ @@ -526,6 +521,16 @@ module MakeCfgNodes Input> { * Holds if `getStmtList()` exists. */ predicate hasStmtList() { exists(this.getStmtList()) } + + /** + * Gets the try block modifier of this block expression, if it exists. + */ + TryBlockModifier getTryBlockModifier() { result = node.getTryBlockModifier() } + + /** + * Holds if `getTryBlockModifier()` exists. + */ + predicate hasTryBlockModifier() { exists(this.getTryBlockModifier()) } } final private class ParentBoxPat extends ParentAstNode, BoxPat { @@ -1018,8 +1023,6 @@ module MakeCfgNodes Input> { none() or child = this.getExpr() - or - child = this.getName() } } @@ -1038,28 +1041,26 @@ module MakeCfgNodes Input> { FormatArgsArg getFormatArgsArg() { result = node } /** - * Gets the expression of this format arguments argument, if it exists. + * Gets the argument name of this format arguments argument, if it exists. */ - ExprCfgNode getExpr() { - any(ChildMapping mapping).hasCfgChild(node, node.getExpr(), this, result) - } + FormatArgsArgName getArgName() { result = node.getArgName() } /** - * Holds if `getExpr()` exists. + * Holds if `getArgName()` exists. */ - predicate hasExpr() { exists(this.getExpr()) } + predicate hasArgName() { exists(this.getArgName()) } /** - * Gets the name of this format arguments argument, if it exists. + * Gets the expression of this format arguments argument, if it exists. */ - NameCfgNode getName() { - any(ChildMapping mapping).hasCfgChild(node, node.getName(), this, result) + ExprCfgNode getExpr() { + any(ChildMapping mapping).hasCfgChild(node, node.getExpr(), this, result) } /** - * Holds if `getName()` exists. + * Holds if `getExpr()` exists. */ - predicate hasName() { exists(this.getName()) } + predicate hasExpr() { exists(this.getExpr()) } } final private class ParentFormatArgsExpr extends ParentAstNode, FormatArgsExpr { @@ -3558,18 +3559,6 @@ module MakeCfgNodes Input> { cfgNode ) or - pred = "getName" and - parent = - any(Nodes::FormatArgsArgCfgNode cfgNode, FormatArgsArg astNode | - astNode = cfgNode.getFormatArgsArg() and - child = getDesugared(astNode.getName()) and - i = -1 and - hasCfgNode(child) and - not child = cfgNode.getName().getAstNode() - | - cfgNode - ) - or pred = "getArg" and parent = any(Nodes::FormatArgsExprCfgNode cfgNode, FormatArgsExpr astNode | diff --git a/rust/ql/lib/codeql/rust/elements.qll b/rust/ql/lib/codeql/rust/elements.qll index b7ca8fe1ca5c..fdfe2c0cacf0 100644 --- a/rust/ql/lib/codeql/rust/elements.qll +++ b/rust/ql/lib/codeql/rust/elements.qll @@ -39,6 +39,11 @@ import codeql.rust.elements.BreakExpr import codeql.rust.elements.CallExpr import codeql.rust.elements.Callable import codeql.rust.elements.CastExpr +import codeql.rust.elements.CfgAtom +import codeql.rust.elements.CfgAttrMeta +import codeql.rust.elements.CfgComposite +import codeql.rust.elements.CfgMeta +import codeql.rust.elements.CfgPredicate import codeql.rust.elements.ClosureExpr import codeql.rust.elements.Comment import codeql.rust.elements.Const @@ -64,6 +69,7 @@ import codeql.rust.elements.ForExpr import codeql.rust.elements.ForTypeRepr import codeql.rust.elements.Format import codeql.rust.elements.FormatArgsArg +import codeql.rust.elements.FormatArgsArgName import codeql.rust.elements.FormatArgsExpr import codeql.rust.elements.FormatArgument import codeql.rust.elements.FormatTemplateVariableAccess @@ -80,6 +86,7 @@ import codeql.rust.elements.IndexExpr import codeql.rust.elements.InferTypeRepr import codeql.rust.elements.Item import codeql.rust.elements.ItemList +import codeql.rust.elements.KeyValueMeta import codeql.rust.elements.Label import codeql.rust.elements.LabelableExpr import codeql.rust.elements.LetElse @@ -125,6 +132,7 @@ import codeql.rust.elements.Path import codeql.rust.elements.PathAstNode import codeql.rust.elements.PathExpr import codeql.rust.elements.PathExprBase +import codeql.rust.elements.PathMeta import codeql.rust.elements.PathPat import codeql.rust.elements.PathSegment import codeql.rust.elements.PathTypeRepr @@ -158,8 +166,9 @@ import codeql.rust.elements.StructPatField import codeql.rust.elements.StructPatFieldList import codeql.rust.elements.Token import codeql.rust.elements.TokenTree +import codeql.rust.elements.TokenTreeMeta import codeql.rust.elements.Trait -import codeql.rust.elements.TraitAlias +import codeql.rust.elements.TryBlockModifier import codeql.rust.elements.TryExpr import codeql.rust.elements.TupleExpr import codeql.rust.elements.TupleField @@ -178,6 +187,7 @@ import codeql.rust.elements.UnderscoreExpr import codeql.rust.elements.Unextracted import codeql.rust.elements.Unimplemented import codeql.rust.elements.Union +import codeql.rust.elements.UnsafeMeta import codeql.rust.elements.Use import codeql.rust.elements.UseBoundGenericArg import codeql.rust.elements.UseBoundGenericArgs diff --git a/rust/ql/lib/codeql/rust/elements/BlockExpr.qll b/rust/ql/lib/codeql/rust/elements/BlockExpr.qll index 9e87d381525d..8a85ca21310f 100644 --- a/rust/ql/lib/codeql/rust/elements/BlockExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/BlockExpr.qll @@ -7,6 +7,7 @@ private import internal.BlockExprImpl import codeql.rust.elements.Attr import codeql.rust.elements.LabelableExpr import codeql.rust.elements.StmtList +import codeql.rust.elements.TryBlockModifier /** * A block expression. For example: diff --git a/rust/ql/lib/codeql/rust/elements/CfgAtom.qll b/rust/ql/lib/codeql/rust/elements/CfgAtom.qll new file mode 100644 index 000000000000..6aecca369fe9 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/CfgAtom.qll @@ -0,0 +1,9 @@ +// generated by codegen, do not edit +/** + * This module provides the public class `CfgAtom`. + */ + +private import internal.CfgAtomImpl +import codeql.rust.elements.CfgPredicate + +final class CfgAtom = Impl::CfgAtom; diff --git a/rust/ql/lib/codeql/rust/elements/CfgAttrMeta.qll b/rust/ql/lib/codeql/rust/elements/CfgAttrMeta.qll new file mode 100644 index 000000000000..b8c3364f4874 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/CfgAttrMeta.qll @@ -0,0 +1,10 @@ +// generated by codegen, do not edit +/** + * This module provides the public class `CfgAttrMeta`. + */ + +private import internal.CfgAttrMetaImpl +import codeql.rust.elements.CfgPredicate +import codeql.rust.elements.Meta + +final class CfgAttrMeta = Impl::CfgAttrMeta; diff --git a/rust/ql/lib/codeql/rust/elements/CfgComposite.qll b/rust/ql/lib/codeql/rust/elements/CfgComposite.qll new file mode 100644 index 000000000000..61aac82a2709 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/CfgComposite.qll @@ -0,0 +1,9 @@ +// generated by codegen, do not edit +/** + * This module provides the public class `CfgComposite`. + */ + +private import internal.CfgCompositeImpl +import codeql.rust.elements.CfgPredicate + +final class CfgComposite = Impl::CfgComposite; diff --git a/rust/ql/lib/codeql/rust/elements/CfgMeta.qll b/rust/ql/lib/codeql/rust/elements/CfgMeta.qll new file mode 100644 index 000000000000..f32ade7e63c7 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/CfgMeta.qll @@ -0,0 +1,10 @@ +// generated by codegen, do not edit +/** + * This module provides the public class `CfgMeta`. + */ + +private import internal.CfgMetaImpl +import codeql.rust.elements.CfgPredicate +import codeql.rust.elements.Meta + +final class CfgMeta = Impl::CfgMeta; diff --git a/rust/ql/lib/codeql/rust/elements/CfgPredicate.qll b/rust/ql/lib/codeql/rust/elements/CfgPredicate.qll new file mode 100644 index 000000000000..399705fb4a7d --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/CfgPredicate.qll @@ -0,0 +1,9 @@ +// generated by codegen, do not edit +/** + * This module provides the public class `CfgPredicate`. + */ + +private import internal.CfgPredicateImpl +import codeql.rust.elements.AstNode + +final class CfgPredicate = Impl::CfgPredicate; diff --git a/rust/ql/lib/codeql/rust/elements/FormatArgsArg.qll b/rust/ql/lib/codeql/rust/elements/FormatArgsArg.qll index 4946f9789304..2cb12d291fb1 100644 --- a/rust/ql/lib/codeql/rust/elements/FormatArgsArg.qll +++ b/rust/ql/lib/codeql/rust/elements/FormatArgsArg.qll @@ -6,7 +6,7 @@ private import internal.FormatArgsArgImpl import codeql.rust.elements.AstNode import codeql.rust.elements.Expr -import codeql.rust.elements.Name +import codeql.rust.elements.FormatArgsArgName /** * A FormatArgsArg. For example the `"world"` in: diff --git a/rust/ql/lib/codeql/rust/elements/FormatArgsArgName.qll b/rust/ql/lib/codeql/rust/elements/FormatArgsArgName.qll new file mode 100644 index 000000000000..93c5b2185701 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/FormatArgsArgName.qll @@ -0,0 +1,9 @@ +// generated by codegen, do not edit +/** + * This module provides the public class `FormatArgsArgName`. + */ + +private import internal.FormatArgsArgNameImpl +import codeql.rust.elements.AstNode + +final class FormatArgsArgName = Impl::FormatArgsArgName; diff --git a/rust/ql/lib/codeql/rust/elements/KeyValueMeta.qll b/rust/ql/lib/codeql/rust/elements/KeyValueMeta.qll new file mode 100644 index 000000000000..87b2bec9f045 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/KeyValueMeta.qll @@ -0,0 +1,11 @@ +// generated by codegen, do not edit +/** + * This module provides the public class `KeyValueMeta`. + */ + +private import internal.KeyValueMetaImpl +import codeql.rust.elements.Expr +import codeql.rust.elements.Meta +import codeql.rust.elements.Path + +final class KeyValueMeta = Impl::KeyValueMeta; diff --git a/rust/ql/lib/codeql/rust/elements/Meta.qll b/rust/ql/lib/codeql/rust/elements/Meta.qll index 46fcafb43c2f..8086286cd7e4 100644 --- a/rust/ql/lib/codeql/rust/elements/Meta.qll +++ b/rust/ql/lib/codeql/rust/elements/Meta.qll @@ -5,9 +5,6 @@ private import internal.MetaImpl import codeql.rust.elements.AstNode -import codeql.rust.elements.Expr -import codeql.rust.elements.Path -import codeql.rust.elements.TokenTree /** * A meta item in an attribute. diff --git a/rust/ql/lib/codeql/rust/elements/PathMeta.qll b/rust/ql/lib/codeql/rust/elements/PathMeta.qll new file mode 100644 index 000000000000..53fd0ed669e6 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/PathMeta.qll @@ -0,0 +1,10 @@ +// generated by codegen, do not edit +/** + * This module provides the public class `PathMeta`. + */ + +private import internal.PathMetaImpl +import codeql.rust.elements.Meta +import codeql.rust.elements.Path + +final class PathMeta = Impl::PathMeta; diff --git a/rust/ql/lib/codeql/rust/elements/StructField.qll b/rust/ql/lib/codeql/rust/elements/StructField.qll index 6d363a17b12d..d02d9418049c 100644 --- a/rust/ql/lib/codeql/rust/elements/StructField.qll +++ b/rust/ql/lib/codeql/rust/elements/StructField.qll @@ -6,7 +6,7 @@ private import internal.StructFieldImpl import codeql.rust.elements.AstNode import codeql.rust.elements.Attr -import codeql.rust.elements.Expr +import codeql.rust.elements.ConstArg import codeql.rust.elements.Name import codeql.rust.elements.TypeRepr import codeql.rust.elements.Visibility diff --git a/rust/ql/lib/codeql/rust/elements/TokenTreeMeta.qll b/rust/ql/lib/codeql/rust/elements/TokenTreeMeta.qll new file mode 100644 index 000000000000..1299a44550b0 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/TokenTreeMeta.qll @@ -0,0 +1,11 @@ +// generated by codegen, do not edit +/** + * This module provides the public class `TokenTreeMeta`. + */ + +private import internal.TokenTreeMetaImpl +import codeql.rust.elements.Meta +import codeql.rust.elements.Path +import codeql.rust.elements.TokenTree + +final class TokenTreeMeta = Impl::TokenTreeMeta; diff --git a/rust/ql/lib/codeql/rust/elements/TraitAlias.qll b/rust/ql/lib/codeql/rust/elements/TraitAlias.qll deleted file mode 100644 index 956fa76ab212..000000000000 --- a/rust/ql/lib/codeql/rust/elements/TraitAlias.qll +++ /dev/null @@ -1,23 +0,0 @@ -// generated by codegen, do not edit -/** - * This module provides the public class `TraitAlias`. - */ - -private import internal.TraitAliasImpl -import codeql.rust.elements.Attr -import codeql.rust.elements.GenericParamList -import codeql.rust.elements.Item -import codeql.rust.elements.Name -import codeql.rust.elements.TypeBoundList -import codeql.rust.elements.Visibility -import codeql.rust.elements.WhereClause - -/** - * A trait alias. - * - * For example: - * ```rust - * trait Foo = Bar + Baz; - * ``` - */ -final class TraitAlias = Impl::TraitAlias; diff --git a/rust/ql/lib/codeql/rust/elements/TryBlockModifier.qll b/rust/ql/lib/codeql/rust/elements/TryBlockModifier.qll new file mode 100644 index 000000000000..b7265e12f26a --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/TryBlockModifier.qll @@ -0,0 +1,10 @@ +// generated by codegen, do not edit +/** + * This module provides the public class `TryBlockModifier`. + */ + +private import internal.TryBlockModifierImpl +import codeql.rust.elements.AstNode +import codeql.rust.elements.TypeRepr + +final class TryBlockModifier = Impl::TryBlockModifier; diff --git a/rust/ql/lib/codeql/rust/elements/UnsafeMeta.qll b/rust/ql/lib/codeql/rust/elements/UnsafeMeta.qll new file mode 100644 index 000000000000..ec1bec4e7743 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/UnsafeMeta.qll @@ -0,0 +1,9 @@ +// generated by codegen, do not edit +/** + * This module provides the public class `UnsafeMeta`. + */ + +private import internal.UnsafeMetaImpl +import codeql.rust.elements.Meta + +final class UnsafeMeta = Impl::UnsafeMeta; diff --git a/rust/ql/lib/codeql/rust/elements/Variant.qll b/rust/ql/lib/codeql/rust/elements/Variant.qll index dfe5199f1592..983488da4032 100644 --- a/rust/ql/lib/codeql/rust/elements/Variant.qll +++ b/rust/ql/lib/codeql/rust/elements/Variant.qll @@ -6,7 +6,7 @@ private import internal.VariantImpl import codeql.rust.elements.Addressable import codeql.rust.elements.Attr -import codeql.rust.elements.Expr +import codeql.rust.elements.ConstArg import codeql.rust.elements.FieldList import codeql.rust.elements.Name import codeql.rust.elements.Visibility diff --git a/rust/ql/lib/codeql/rust/elements/internal/MetaConstructor.qll b/rust/ql/lib/codeql/rust/elements/internal/CfgAtomConstructor.qll similarity index 64% rename from rust/ql/lib/codeql/rust/elements/internal/MetaConstructor.qll rename to rust/ql/lib/codeql/rust/elements/internal/CfgAtomConstructor.qll index 0cd1ca6bbe9f..7e1b8e962853 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/MetaConstructor.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/CfgAtomConstructor.qll @@ -1,14 +1,14 @@ // generated by codegen, remove this comment if you wish to edit this file /** * This module defines the hook used internally to tweak the characteristic predicate of - * `Meta` synthesized instances. + * `CfgAtom` synthesized instances. * INTERNAL: Do not use. */ private import codeql.rust.elements.internal.generated.Raw /** - * The characteristic predicate of `Meta` synthesized instances. + * The characteristic predicate of `CfgAtom` synthesized instances. * INTERNAL: Do not use. */ -predicate constructMeta(Raw::Meta id) { any() } +predicate constructCfgAtom(Raw::CfgAtom id) { any() } diff --git a/rust/ql/lib/codeql/rust/elements/internal/TraitAliasImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/CfgAtomImpl.qll similarity index 51% rename from rust/ql/lib/codeql/rust/elements/internal/TraitAliasImpl.qll rename to rust/ql/lib/codeql/rust/elements/internal/CfgAtomImpl.qll index c11516896b47..6f1515cb7d1b 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TraitAliasImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/CfgAtomImpl.qll @@ -1,24 +1,16 @@ // generated by codegen, remove this comment if you wish to edit this file /** - * This module provides a hand-modifiable wrapper around the generated class `TraitAlias`. + * This module provides a hand-modifiable wrapper around the generated class `CfgAtom`. * * INTERNAL: Do not use. */ -private import codeql.rust.elements.internal.generated.TraitAlias +private import codeql.rust.elements.internal.generated.CfgAtom /** - * INTERNAL: This module contains the customizable definition of `TraitAlias` and should not + * INTERNAL: This module contains the customizable definition of `CfgAtom` and should not * be referenced directly. */ module Impl { - /** - * A trait alias. - * - * For example: - * ```rust - * trait Foo = Bar + Baz; - * ``` - */ - class TraitAlias extends Generated::TraitAlias { } + class CfgAtom extends Generated::CfgAtom { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/CfgAttrMetaConstructor.qll b/rust/ql/lib/codeql/rust/elements/internal/CfgAttrMetaConstructor.qll new file mode 100644 index 000000000000..585a8c07e3c9 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/CfgAttrMetaConstructor.qll @@ -0,0 +1,14 @@ +// generated by codegen, remove this comment if you wish to edit this file +/** + * This module defines the hook used internally to tweak the characteristic predicate of + * `CfgAttrMeta` synthesized instances. + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.Raw + +/** + * The characteristic predicate of `CfgAttrMeta` synthesized instances. + * INTERNAL: Do not use. + */ +predicate constructCfgAttrMeta(Raw::CfgAttrMeta id) { any() } diff --git a/rust/ql/lib/codeql/rust/elements/internal/CfgAttrMetaImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/CfgAttrMetaImpl.qll new file mode 100644 index 000000000000..5e189d4126de --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/CfgAttrMetaImpl.qll @@ -0,0 +1,16 @@ +// generated by codegen, remove this comment if you wish to edit this file +/** + * This module provides a hand-modifiable wrapper around the generated class `CfgAttrMeta`. + * + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.CfgAttrMeta + +/** + * INTERNAL: This module contains the customizable definition of `CfgAttrMeta` and should not + * be referenced directly. + */ +module Impl { + class CfgAttrMeta extends Generated::CfgAttrMeta { } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/CfgCompositeConstructor.qll b/rust/ql/lib/codeql/rust/elements/internal/CfgCompositeConstructor.qll new file mode 100644 index 000000000000..ad4c42ec5729 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/CfgCompositeConstructor.qll @@ -0,0 +1,14 @@ +// generated by codegen, remove this comment if you wish to edit this file +/** + * This module defines the hook used internally to tweak the characteristic predicate of + * `CfgComposite` synthesized instances. + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.Raw + +/** + * The characteristic predicate of `CfgComposite` synthesized instances. + * INTERNAL: Do not use. + */ +predicate constructCfgComposite(Raw::CfgComposite id) { any() } diff --git a/rust/ql/lib/codeql/rust/elements/internal/CfgCompositeImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/CfgCompositeImpl.qll new file mode 100644 index 000000000000..58c9a10af763 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/CfgCompositeImpl.qll @@ -0,0 +1,16 @@ +// generated by codegen, remove this comment if you wish to edit this file +/** + * This module provides a hand-modifiable wrapper around the generated class `CfgComposite`. + * + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.CfgComposite + +/** + * INTERNAL: This module contains the customizable definition of `CfgComposite` and should not + * be referenced directly. + */ +module Impl { + class CfgComposite extends Generated::CfgComposite { } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/CfgMetaConstructor.qll b/rust/ql/lib/codeql/rust/elements/internal/CfgMetaConstructor.qll new file mode 100644 index 000000000000..3f374993ccd7 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/CfgMetaConstructor.qll @@ -0,0 +1,14 @@ +// generated by codegen, remove this comment if you wish to edit this file +/** + * This module defines the hook used internally to tweak the characteristic predicate of + * `CfgMeta` synthesized instances. + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.Raw + +/** + * The characteristic predicate of `CfgMeta` synthesized instances. + * INTERNAL: Do not use. + */ +predicate constructCfgMeta(Raw::CfgMeta id) { any() } diff --git a/rust/ql/lib/codeql/rust/elements/internal/CfgMetaImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/CfgMetaImpl.qll new file mode 100644 index 000000000000..f3c75352121e --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/CfgMetaImpl.qll @@ -0,0 +1,16 @@ +// generated by codegen, remove this comment if you wish to edit this file +/** + * This module provides a hand-modifiable wrapper around the generated class `CfgMeta`. + * + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.CfgMeta + +/** + * INTERNAL: This module contains the customizable definition of `CfgMeta` and should not + * be referenced directly. + */ +module Impl { + class CfgMeta extends Generated::CfgMeta { } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/CfgPredicateImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/CfgPredicateImpl.qll new file mode 100644 index 000000000000..eda245d0777f --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/CfgPredicateImpl.qll @@ -0,0 +1,16 @@ +// generated by codegen, remove this comment if you wish to edit this file +/** + * This module provides a hand-modifiable wrapper around the generated class `CfgPredicate`. + * + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.CfgPredicate + +/** + * INTERNAL: This module contains the customizable definition of `CfgPredicate` and should not + * be referenced directly. + */ +module Impl { + class CfgPredicate extends Generated::CfgPredicate { } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/FormatArgsArgNameConstructor.qll b/rust/ql/lib/codeql/rust/elements/internal/FormatArgsArgNameConstructor.qll new file mode 100644 index 000000000000..fbed7006a8aa --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/FormatArgsArgNameConstructor.qll @@ -0,0 +1,14 @@ +// generated by codegen, remove this comment if you wish to edit this file +/** + * This module defines the hook used internally to tweak the characteristic predicate of + * `FormatArgsArgName` synthesized instances. + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.Raw + +/** + * The characteristic predicate of `FormatArgsArgName` synthesized instances. + * INTERNAL: Do not use. + */ +predicate constructFormatArgsArgName(Raw::FormatArgsArgName id) { any() } diff --git a/rust/ql/lib/codeql/rust/elements/internal/FormatArgsArgNameImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/FormatArgsArgNameImpl.qll new file mode 100644 index 000000000000..31ead66d0ac2 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/FormatArgsArgNameImpl.qll @@ -0,0 +1,16 @@ +// generated by codegen, remove this comment if you wish to edit this file +/** + * This module provides a hand-modifiable wrapper around the generated class `FormatArgsArgName`. + * + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.FormatArgsArgName + +/** + * INTERNAL: This module contains the customizable definition of `FormatArgsArgName` and should not + * be referenced directly. + */ +module Impl { + class FormatArgsArgName extends Generated::FormatArgsArgName { } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/KeyValueMetaConstructor.qll b/rust/ql/lib/codeql/rust/elements/internal/KeyValueMetaConstructor.qll new file mode 100644 index 000000000000..b9a506a485cc --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/KeyValueMetaConstructor.qll @@ -0,0 +1,14 @@ +// generated by codegen, remove this comment if you wish to edit this file +/** + * This module defines the hook used internally to tweak the characteristic predicate of + * `KeyValueMeta` synthesized instances. + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.Raw + +/** + * The characteristic predicate of `KeyValueMeta` synthesized instances. + * INTERNAL: Do not use. + */ +predicate constructKeyValueMeta(Raw::KeyValueMeta id) { any() } diff --git a/rust/ql/lib/codeql/rust/elements/internal/KeyValueMetaImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/KeyValueMetaImpl.qll new file mode 100644 index 000000000000..ac3befd85b60 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/KeyValueMetaImpl.qll @@ -0,0 +1,16 @@ +// generated by codegen, remove this comment if you wish to edit this file +/** + * This module provides a hand-modifiable wrapper around the generated class `KeyValueMeta`. + * + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.KeyValueMeta + +/** + * INTERNAL: This module contains the customizable definition of `KeyValueMeta` and should not + * be referenced directly. + */ +module Impl { + class KeyValueMeta extends Generated::KeyValueMeta { } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/PathMetaConstructor.qll b/rust/ql/lib/codeql/rust/elements/internal/PathMetaConstructor.qll new file mode 100644 index 000000000000..5d8fd0da4f62 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/PathMetaConstructor.qll @@ -0,0 +1,14 @@ +// generated by codegen, remove this comment if you wish to edit this file +/** + * This module defines the hook used internally to tweak the characteristic predicate of + * `PathMeta` synthesized instances. + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.Raw + +/** + * The characteristic predicate of `PathMeta` synthesized instances. + * INTERNAL: Do not use. + */ +predicate constructPathMeta(Raw::PathMeta id) { any() } diff --git a/rust/ql/lib/codeql/rust/elements/internal/PathMetaImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/PathMetaImpl.qll new file mode 100644 index 000000000000..fd58653419e7 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/PathMetaImpl.qll @@ -0,0 +1,16 @@ +// generated by codegen, remove this comment if you wish to edit this file +/** + * This module provides a hand-modifiable wrapper around the generated class `PathMeta`. + * + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.PathMeta + +/** + * INTERNAL: This module contains the customizable definition of `PathMeta` and should not + * be referenced directly. + */ +module Impl { + class PathMeta extends Generated::PathMeta { } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/TokenTreeMetaConstructor.qll b/rust/ql/lib/codeql/rust/elements/internal/TokenTreeMetaConstructor.qll new file mode 100644 index 000000000000..8cb49c13e668 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/TokenTreeMetaConstructor.qll @@ -0,0 +1,14 @@ +// generated by codegen, remove this comment if you wish to edit this file +/** + * This module defines the hook used internally to tweak the characteristic predicate of + * `TokenTreeMeta` synthesized instances. + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.Raw + +/** + * The characteristic predicate of `TokenTreeMeta` synthesized instances. + * INTERNAL: Do not use. + */ +predicate constructTokenTreeMeta(Raw::TokenTreeMeta id) { any() } diff --git a/rust/ql/lib/codeql/rust/elements/internal/TokenTreeMetaImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TokenTreeMetaImpl.qll new file mode 100644 index 000000000000..b61b222879d8 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/TokenTreeMetaImpl.qll @@ -0,0 +1,16 @@ +// generated by codegen, remove this comment if you wish to edit this file +/** + * This module provides a hand-modifiable wrapper around the generated class `TokenTreeMeta`. + * + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.TokenTreeMeta + +/** + * INTERNAL: This module contains the customizable definition of `TokenTreeMeta` and should not + * be referenced directly. + */ +module Impl { + class TokenTreeMeta extends Generated::TokenTreeMeta { } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/TryBlockModifierConstructor.qll b/rust/ql/lib/codeql/rust/elements/internal/TryBlockModifierConstructor.qll new file mode 100644 index 000000000000..1da4a8262b07 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/TryBlockModifierConstructor.qll @@ -0,0 +1,14 @@ +// generated by codegen, remove this comment if you wish to edit this file +/** + * This module defines the hook used internally to tweak the characteristic predicate of + * `TryBlockModifier` synthesized instances. + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.Raw + +/** + * The characteristic predicate of `TryBlockModifier` synthesized instances. + * INTERNAL: Do not use. + */ +predicate constructTryBlockModifier(Raw::TryBlockModifier id) { any() } diff --git a/rust/ql/lib/codeql/rust/elements/internal/TryBlockModifierImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TryBlockModifierImpl.qll new file mode 100644 index 000000000000..8be62790eeeb --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/TryBlockModifierImpl.qll @@ -0,0 +1,16 @@ +// generated by codegen, remove this comment if you wish to edit this file +/** + * This module provides a hand-modifiable wrapper around the generated class `TryBlockModifier`. + * + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.TryBlockModifier + +/** + * INTERNAL: This module contains the customizable definition of `TryBlockModifier` and should not + * be referenced directly. + */ +module Impl { + class TryBlockModifier extends Generated::TryBlockModifier { } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/TraitAliasConstructor.qll b/rust/ql/lib/codeql/rust/elements/internal/UnsafeMetaConstructor.qll similarity index 64% rename from rust/ql/lib/codeql/rust/elements/internal/TraitAliasConstructor.qll rename to rust/ql/lib/codeql/rust/elements/internal/UnsafeMetaConstructor.qll index ee417d726513..3ffc0efcac72 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TraitAliasConstructor.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/UnsafeMetaConstructor.qll @@ -1,14 +1,14 @@ // generated by codegen, remove this comment if you wish to edit this file /** * This module defines the hook used internally to tweak the characteristic predicate of - * `TraitAlias` synthesized instances. + * `UnsafeMeta` synthesized instances. * INTERNAL: Do not use. */ private import codeql.rust.elements.internal.generated.Raw /** - * The characteristic predicate of `TraitAlias` synthesized instances. + * The characteristic predicate of `UnsafeMeta` synthesized instances. * INTERNAL: Do not use. */ -predicate constructTraitAlias(Raw::TraitAlias id) { any() } +predicate constructUnsafeMeta(Raw::UnsafeMeta id) { any() } diff --git a/rust/ql/lib/codeql/rust/elements/internal/UnsafeMetaImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/UnsafeMetaImpl.qll new file mode 100644 index 000000000000..7da4ed5ace29 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/UnsafeMetaImpl.qll @@ -0,0 +1,16 @@ +// generated by codegen, remove this comment if you wish to edit this file +/** + * This module provides a hand-modifiable wrapper around the generated class `UnsafeMeta`. + * + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.UnsafeMeta + +/** + * INTERNAL: This module contains the customizable definition of `UnsafeMeta` and should not + * be referenced directly. + */ +module Impl { + class UnsafeMeta extends Generated::UnsafeMeta { } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/BlockExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/BlockExpr.qll index 6a01a0c45880..e448e321e646 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/BlockExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/BlockExpr.qll @@ -9,6 +9,7 @@ private import codeql.rust.elements.internal.generated.Raw import codeql.rust.elements.Attr import codeql.rust.elements.internal.LabelableExprImpl::Impl as LabelableExprImpl import codeql.rust.elements.StmtList +import codeql.rust.elements.TryBlockModifier /** * INTERNAL: This module contains the fully generated definition of `BlockExpr` and should not @@ -72,11 +73,6 @@ module Generated { */ predicate isMove() { Synth::convertBlockExprToRaw(this).(Raw::BlockExpr).isMove() } - /** - * Holds if this block expression is try. - */ - predicate isTry() { Synth::convertBlockExprToRaw(this).(Raw::BlockExpr).isTry() } - /** * Holds if this block expression is unsafe. */ @@ -96,5 +92,20 @@ module Generated { * Holds if `getStmtList()` exists. */ final predicate hasStmtList() { exists(this.getStmtList()) } + + /** + * Gets the try block modifier of this block expression, if it exists. + */ + TryBlockModifier getTryBlockModifier() { + result = + Synth::convertTryBlockModifierFromRaw(Synth::convertBlockExprToRaw(this) + .(Raw::BlockExpr) + .getTryBlockModifier()) + } + + /** + * Holds if `getTryBlockModifier()` exists. + */ + final predicate hasTryBlockModifier() { exists(this.getTryBlockModifier()) } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/CfgAtom.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/CfgAtom.qll new file mode 100644 index 000000000000..8243d5ba14a7 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/CfgAtom.qll @@ -0,0 +1,23 @@ +// generated by codegen, do not edit +/** + * This module provides the generated definition of `CfgAtom`. + * INTERNAL: Do not import directly. + */ + +private import codeql.rust.elements.internal.generated.Synth +private import codeql.rust.elements.internal.generated.Raw +import codeql.rust.elements.internal.CfgPredicateImpl::Impl as CfgPredicateImpl + +/** + * INTERNAL: This module contains the fully generated definition of `CfgAtom` and should not + * be referenced directly. + */ +module Generated { + /** + * INTERNAL: Do not reference the `Generated::CfgAtom` class directly. + * Use the subclass `CfgAtom`, where the following predicates are available. + */ + class CfgAtom extends Synth::TCfgAtom, CfgPredicateImpl::CfgPredicate { + override string getAPrimaryQlClass() { result = "CfgAtom" } + } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/CfgAttrMeta.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/CfgAttrMeta.qll new file mode 100644 index 000000000000..0b972b413c53 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/CfgAttrMeta.qll @@ -0,0 +1,60 @@ +// generated by codegen, do not edit +/** + * This module provides the generated definition of `CfgAttrMeta`. + * INTERNAL: Do not import directly. + */ + +private import codeql.rust.elements.internal.generated.Synth +private import codeql.rust.elements.internal.generated.Raw +import codeql.rust.elements.CfgPredicate +import codeql.rust.elements.Meta +import codeql.rust.elements.internal.MetaImpl::Impl as MetaImpl + +/** + * INTERNAL: This module contains the fully generated definition of `CfgAttrMeta` and should not + * be referenced directly. + */ +module Generated { + /** + * INTERNAL: Do not reference the `Generated::CfgAttrMeta` class directly. + * Use the subclass `CfgAttrMeta`, where the following predicates are available. + */ + class CfgAttrMeta extends Synth::TCfgAttrMeta, MetaImpl::Meta { + override string getAPrimaryQlClass() { result = "CfgAttrMeta" } + + /** + * Gets the cfg predicate of this cfg attr meta, if it exists. + */ + CfgPredicate getCfgPredicate() { + result = + Synth::convertCfgPredicateFromRaw(Synth::convertCfgAttrMetaToRaw(this) + .(Raw::CfgAttrMeta) + .getCfgPredicate()) + } + + /** + * Holds if `getCfgPredicate()` exists. + */ + final predicate hasCfgPredicate() { exists(this.getCfgPredicate()) } + + /** + * Gets the `index`th meta of this cfg attr meta (0-based). + */ + Meta getMeta(int index) { + result = + Synth::convertMetaFromRaw(Synth::convertCfgAttrMetaToRaw(this) + .(Raw::CfgAttrMeta) + .getMeta(index)) + } + + /** + * Gets any of the metas of this cfg attr meta. + */ + final Meta getAMeta() { result = this.getMeta(_) } + + /** + * Gets the number of metas of this cfg attr meta. + */ + final int getNumberOfMetas() { result = count(int i | exists(this.getMeta(i))) } + } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/CfgComposite.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/CfgComposite.qll new file mode 100644 index 000000000000..65a5a672baf9 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/CfgComposite.qll @@ -0,0 +1,44 @@ +// generated by codegen, do not edit +/** + * This module provides the generated definition of `CfgComposite`. + * INTERNAL: Do not import directly. + */ + +private import codeql.rust.elements.internal.generated.Synth +private import codeql.rust.elements.internal.generated.Raw +import codeql.rust.elements.CfgPredicate +import codeql.rust.elements.internal.CfgPredicateImpl::Impl as CfgPredicateImpl + +/** + * INTERNAL: This module contains the fully generated definition of `CfgComposite` and should not + * be referenced directly. + */ +module Generated { + /** + * INTERNAL: Do not reference the `Generated::CfgComposite` class directly. + * Use the subclass `CfgComposite`, where the following predicates are available. + */ + class CfgComposite extends Synth::TCfgComposite, CfgPredicateImpl::CfgPredicate { + override string getAPrimaryQlClass() { result = "CfgComposite" } + + /** + * Gets the `index`th cfg predicate of this cfg composite (0-based). + */ + CfgPredicate getCfgPredicate(int index) { + result = + Synth::convertCfgPredicateFromRaw(Synth::convertCfgCompositeToRaw(this) + .(Raw::CfgComposite) + .getCfgPredicate(index)) + } + + /** + * Gets any of the cfg predicates of this cfg composite. + */ + final CfgPredicate getACfgPredicate() { result = this.getCfgPredicate(_) } + + /** + * Gets the number of cfg predicates of this cfg composite. + */ + final int getNumberOfCfgPredicates() { result = count(int i | exists(this.getCfgPredicate(i))) } + } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/CfgMeta.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/CfgMeta.qll new file mode 100644 index 000000000000..d65162b85dda --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/CfgMeta.qll @@ -0,0 +1,39 @@ +// generated by codegen, do not edit +/** + * This module provides the generated definition of `CfgMeta`. + * INTERNAL: Do not import directly. + */ + +private import codeql.rust.elements.internal.generated.Synth +private import codeql.rust.elements.internal.generated.Raw +import codeql.rust.elements.CfgPredicate +import codeql.rust.elements.internal.MetaImpl::Impl as MetaImpl + +/** + * INTERNAL: This module contains the fully generated definition of `CfgMeta` and should not + * be referenced directly. + */ +module Generated { + /** + * INTERNAL: Do not reference the `Generated::CfgMeta` class directly. + * Use the subclass `CfgMeta`, where the following predicates are available. + */ + class CfgMeta extends Synth::TCfgMeta, MetaImpl::Meta { + override string getAPrimaryQlClass() { result = "CfgMeta" } + + /** + * Gets the cfg predicate of this cfg meta, if it exists. + */ + CfgPredicate getCfgPredicate() { + result = + Synth::convertCfgPredicateFromRaw(Synth::convertCfgMetaToRaw(this) + .(Raw::CfgMeta) + .getCfgPredicate()) + } + + /** + * Holds if `getCfgPredicate()` exists. + */ + final predicate hasCfgPredicate() { exists(this.getCfgPredicate()) } + } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/CfgPredicate.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/CfgPredicate.qll new file mode 100644 index 000000000000..f5187ecf1e05 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/CfgPredicate.qll @@ -0,0 +1,21 @@ +// generated by codegen, do not edit +/** + * This module provides the generated definition of `CfgPredicate`. + * INTERNAL: Do not import directly. + */ + +private import codeql.rust.elements.internal.generated.Synth +private import codeql.rust.elements.internal.generated.Raw +import codeql.rust.elements.internal.AstNodeImpl::Impl as AstNodeImpl + +/** + * INTERNAL: This module contains the fully generated definition of `CfgPredicate` and should not + * be referenced directly. + */ +module Generated { + /** + * INTERNAL: Do not reference the `Generated::CfgPredicate` class directly. + * Use the subclass `CfgPredicate`, where the following predicates are available. + */ + class CfgPredicate extends Synth::TCfgPredicate, AstNodeImpl::AstNode { } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsArg.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsArg.qll index 80ca340284fa..2c5ab6fe693c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsArg.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsArg.qll @@ -8,7 +8,7 @@ private import codeql.rust.elements.internal.generated.Synth private import codeql.rust.elements.internal.generated.Raw import codeql.rust.elements.internal.AstNodeImpl::Impl as AstNodeImpl import codeql.rust.elements.Expr -import codeql.rust.elements.Name +import codeql.rust.elements.FormatArgsArgName /** * INTERNAL: This module contains the fully generated definition of `FormatArgsArg` and should not @@ -27,33 +27,33 @@ module Generated { override string getAPrimaryQlClass() { result = "FormatArgsArg" } /** - * Gets the expression of this format arguments argument, if it exists. + * Gets the argument name of this format arguments argument, if it exists. */ - Expr getExpr() { + FormatArgsArgName getArgName() { result = - Synth::convertExprFromRaw(Synth::convertFormatArgsArgToRaw(this) + Synth::convertFormatArgsArgNameFromRaw(Synth::convertFormatArgsArgToRaw(this) .(Raw::FormatArgsArg) - .getExpr()) + .getArgName()) } /** - * Holds if `getExpr()` exists. + * Holds if `getArgName()` exists. */ - final predicate hasExpr() { exists(this.getExpr()) } + final predicate hasArgName() { exists(this.getArgName()) } /** - * Gets the name of this format arguments argument, if it exists. + * Gets the expression of this format arguments argument, if it exists. */ - Name getName() { + Expr getExpr() { result = - Synth::convertNameFromRaw(Synth::convertFormatArgsArgToRaw(this) + Synth::convertExprFromRaw(Synth::convertFormatArgsArgToRaw(this) .(Raw::FormatArgsArg) - .getName()) + .getExpr()) } /** - * Holds if `getName()` exists. + * Holds if `getExpr()` exists. */ - final predicate hasName() { exists(this.getName()) } + final predicate hasExpr() { exists(this.getExpr()) } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsArgName.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsArgName.qll new file mode 100644 index 000000000000..ce83c40e161a --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsArgName.qll @@ -0,0 +1,23 @@ +// generated by codegen, do not edit +/** + * This module provides the generated definition of `FormatArgsArgName`. + * INTERNAL: Do not import directly. + */ + +private import codeql.rust.elements.internal.generated.Synth +private import codeql.rust.elements.internal.generated.Raw +import codeql.rust.elements.internal.AstNodeImpl::Impl as AstNodeImpl + +/** + * INTERNAL: This module contains the fully generated definition of `FormatArgsArgName` and should not + * be referenced directly. + */ +module Generated { + /** + * INTERNAL: Do not reference the `Generated::FormatArgsArgName` class directly. + * Use the subclass `FormatArgsArgName`, where the following predicates are available. + */ + class FormatArgsArgName extends Synth::TFormatArgsArgName, AstNodeImpl::AstNode { + override string getAPrimaryQlClass() { result = "FormatArgsArgName" } + } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/KeyValueMeta.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/KeyValueMeta.qll new file mode 100644 index 000000000000..fba14fb3fc4d --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/KeyValueMeta.qll @@ -0,0 +1,55 @@ +// generated by codegen, do not edit +/** + * This module provides the generated definition of `KeyValueMeta`. + * INTERNAL: Do not import directly. + */ + +private import codeql.rust.elements.internal.generated.Synth +private import codeql.rust.elements.internal.generated.Raw +import codeql.rust.elements.Expr +import codeql.rust.elements.internal.MetaImpl::Impl as MetaImpl +import codeql.rust.elements.Path + +/** + * INTERNAL: This module contains the fully generated definition of `KeyValueMeta` and should not + * be referenced directly. + */ +module Generated { + /** + * INTERNAL: Do not reference the `Generated::KeyValueMeta` class directly. + * Use the subclass `KeyValueMeta`, where the following predicates are available. + */ + class KeyValueMeta extends Synth::TKeyValueMeta, MetaImpl::Meta { + override string getAPrimaryQlClass() { result = "KeyValueMeta" } + + /** + * Gets the expression of this key value meta, if it exists. + */ + Expr getExpr() { + result = + Synth::convertExprFromRaw(Synth::convertKeyValueMetaToRaw(this) + .(Raw::KeyValueMeta) + .getExpr()) + } + + /** + * Holds if `getExpr()` exists. + */ + final predicate hasExpr() { exists(this.getExpr()) } + + /** + * Gets the path of this key value meta, if it exists. + */ + Path getPath() { + result = + Synth::convertPathFromRaw(Synth::convertKeyValueMetaToRaw(this) + .(Raw::KeyValueMeta) + .getPath()) + } + + /** + * Holds if `getPath()` exists. + */ + final predicate hasPath() { exists(this.getPath()) } + } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Meta.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Meta.qll index 27e6c03a3287..aa5181ee326a 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Meta.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Meta.qll @@ -7,9 +7,6 @@ private import codeql.rust.elements.internal.generated.Synth private import codeql.rust.elements.internal.generated.Raw import codeql.rust.elements.internal.AstNodeImpl::Impl as AstNodeImpl -import codeql.rust.elements.Expr -import codeql.rust.elements.Path -import codeql.rust.elements.TokenTree /** * INTERNAL: This module contains the fully generated definition of `Meta` and should not @@ -32,49 +29,5 @@ module Generated { * INTERNAL: Do not reference the `Generated::Meta` class directly. * Use the subclass `Meta`, where the following predicates are available. */ - class Meta extends Synth::TMeta, AstNodeImpl::AstNode { - override string getAPrimaryQlClass() { result = "Meta" } - - /** - * Gets the expression of this meta, if it exists. - */ - Expr getExpr() { - result = Synth::convertExprFromRaw(Synth::convertMetaToRaw(this).(Raw::Meta).getExpr()) - } - - /** - * Holds if `getExpr()` exists. - */ - final predicate hasExpr() { exists(this.getExpr()) } - - /** - * Holds if this meta is unsafe. - */ - predicate isUnsafe() { Synth::convertMetaToRaw(this).(Raw::Meta).isUnsafe() } - - /** - * Gets the path of this meta, if it exists. - */ - Path getPath() { - result = Synth::convertPathFromRaw(Synth::convertMetaToRaw(this).(Raw::Meta).getPath()) - } - - /** - * Holds if `getPath()` exists. - */ - final predicate hasPath() { exists(this.getPath()) } - - /** - * Gets the token tree of this meta, if it exists. - */ - TokenTree getTokenTree() { - result = - Synth::convertTokenTreeFromRaw(Synth::convertMetaToRaw(this).(Raw::Meta).getTokenTree()) - } - - /** - * Holds if `getTokenTree()` exists. - */ - final predicate hasTokenTree() { exists(this.getTokenTree()) } - } + class Meta extends Synth::TMeta, AstNodeImpl::AstNode { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll index c593451b9937..f3c1ee591ab6 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll @@ -188,20 +188,26 @@ private module Impl { private Element getImmediateChildOfFormatArgsArg( FormatArgsArg e, int index, string partialPredicateCall ) { - exists(int n, int nExpr, int nName | + exists(int n, int nArgName, int nExpr | n = 0 and - nExpr = n + 1 and - nName = nExpr + 1 and + nArgName = n + 1 and + nExpr = nArgName + 1 and ( none() or - index = n and result = e.getExpr() and partialPredicateCall = "Expr()" + index = n and result = e.getArgName() and partialPredicateCall = "ArgName()" or - index = nExpr and result = e.getName() and partialPredicateCall = "Name()" + index = nArgName and result = e.getExpr() and partialPredicateCall = "Expr()" ) ) } + private Element getImmediateChildOfFormatArgsArgName( + FormatArgsArgName e, int index, string partialPredicateCall + ) { + none() + } + private Element getImmediateChildOfGenericArgList( GenericArgList e, int index, string partialPredicateCall ) { @@ -339,24 +345,6 @@ private module Impl { ) } - private Element getImmediateChildOfMeta(Meta e, int index, string partialPredicateCall) { - exists(int n, int nExpr, int nPath, int nTokenTree | - n = 0 and - nExpr = n + 1 and - nPath = nExpr + 1 and - nTokenTree = nPath + 1 and - ( - none() - or - index = n and result = e.getExpr() and partialPredicateCall = "Expr()" - or - index = nExpr and result = e.getPath() and partialPredicateCall = "Path()" - or - index = nPath and result = e.getTokenTree() and partialPredicateCall = "TokenTree()" - ) - ) - } - private Element getImmediateChildOfName(Name e, int index, string partialPredicateCall) { none() } private Element getImmediateChildOfParamList(ParamList e, int index, string partialPredicateCall) { @@ -567,11 +555,11 @@ private module Impl { private Element getImmediateChildOfStructField( StructField e, int index, string partialPredicateCall ) { - exists(int n, int nAttr, int nDefault, int nName, int nTypeRepr, int nVisibility | + exists(int n, int nAttr, int nDefaultVal, int nName, int nTypeRepr, int nVisibility | n = 0 and nAttr = n + e.getNumberOfAttrs() and - nDefault = nAttr + 1 and - nName = nDefault + 1 and + nDefaultVal = nAttr + 1 and + nName = nDefaultVal + 1 and nTypeRepr = nName + 1 and nVisibility = nTypeRepr + 1 and ( @@ -580,9 +568,9 @@ private module Impl { result = e.getAttr(index - n) and partialPredicateCall = "Attr(" + (index - n).toString() + ")" or - index = nAttr and result = e.getDefault() and partialPredicateCall = "Default()" + index = nAttr and result = e.getDefaultVal() and partialPredicateCall = "DefaultVal()" or - index = nDefault and result = e.getName() and partialPredicateCall = "Name()" + index = nDefaultVal and result = e.getName() and partialPredicateCall = "Name()" or index = nName and result = e.getTypeRepr() and partialPredicateCall = "TypeRepr()" or @@ -634,6 +622,20 @@ private module Impl { none() } + private Element getImmediateChildOfTryBlockModifier( + TryBlockModifier e, int index, string partialPredicateCall + ) { + exists(int n, int nTypeRepr | + n = 0 and + nTypeRepr = n + 1 and + ( + none() + or + index = n and result = e.getTypeRepr() and partialPredicateCall = "TypeRepr()" + ) + ) + } + private Element getImmediateChildOfTupleField(TupleField e, int index, string partialPredicateCall) { exists(int n, int nAttr, int nTypeRepr, int nVisibility | n = 0 and @@ -1108,6 +1110,55 @@ private module Impl { ) } + private Element getImmediateChildOfCfgAtom(CfgAtom e, int index, string partialPredicateCall) { + none() + } + + private Element getImmediateChildOfCfgAttrMeta( + CfgAttrMeta e, int index, string partialPredicateCall + ) { + exists(int n, int nCfgPredicate, int nMeta | + n = 0 and + nCfgPredicate = n + 1 and + nMeta = nCfgPredicate + e.getNumberOfMetas() and + ( + none() + or + index = n and result = e.getCfgPredicate() and partialPredicateCall = "CfgPredicate()" + or + result = e.getMeta(index - nCfgPredicate) and + partialPredicateCall = "Meta(" + (index - nCfgPredicate).toString() + ")" + ) + ) + } + + private Element getImmediateChildOfCfgComposite( + CfgComposite e, int index, string partialPredicateCall + ) { + exists(int n, int nCfgPredicate | + n = 0 and + nCfgPredicate = n + e.getNumberOfCfgPredicates() and + ( + none() + or + result = e.getCfgPredicate(index - n) and + partialPredicateCall = "CfgPredicate(" + (index - n).toString() + ")" + ) + ) + } + + private Element getImmediateChildOfCfgMeta(CfgMeta e, int index, string partialPredicateCall) { + exists(int n, int nCfgPredicate | + n = 0 and + nCfgPredicate = n + 1 and + ( + none() + or + index = n and result = e.getCfgPredicate() and partialPredicateCall = "CfgPredicate()" + ) + ) + } + private Element getImmediateChildOfClosureExpr( ClosureExpr e, int index, string partialPredicateCall ) { @@ -1393,6 +1444,23 @@ private module Impl { none() } + private Element getImmediateChildOfKeyValueMeta( + KeyValueMeta e, int index, string partialPredicateCall + ) { + exists(int n, int nExpr, int nPath | + n = 0 and + nExpr = n + 1 and + nPath = nExpr + 1 and + ( + none() + or + index = n and result = e.getExpr() and partialPredicateCall = "Expr()" + or + index = nExpr and result = e.getPath() and partialPredicateCall = "Path()" + ) + ) + } + private Element getImmediateChildOfLetExpr(LetExpr e, int index, string partialPredicateCall) { exists(int n, int nAttr, int nScrutinee, int nPat | n = 0 and @@ -1701,6 +1769,18 @@ private module Impl { ) } + private Element getImmediateChildOfPathMeta(PathMeta e, int index, string partialPredicateCall) { + exists(int n, int nPath | + n = 0 and + nPath = n + 1 and + ( + none() + or + index = n and result = e.getPath() and partialPredicateCall = "Path()" + ) + ) + } + private Element getImmediateChildOfPathPat(PathPat e, int index, string partialPredicateCall) { exists(int n, int nPath | n = 0 and @@ -1963,6 +2043,23 @@ private module Impl { ) } + private Element getImmediateChildOfTokenTreeMeta( + TokenTreeMeta e, int index, string partialPredicateCall + ) { + exists(int n, int nPath, int nTokenTree | + n = 0 and + nPath = n + 1 and + nTokenTree = nPath + 1 and + ( + none() + or + index = n and result = e.getPath() and partialPredicateCall = "Path()" + or + index = nPath and result = e.getTokenTree() and partialPredicateCall = "TokenTree()" + ) + ) + } + private Element getImmediateChildOfTryExpr(TryExpr e, int index, string partialPredicateCall) { exists(int n, int nAttr, int nExpr | n = 0 and @@ -2106,12 +2203,24 @@ private module Impl { ) } + private Element getImmediateChildOfUnsafeMeta(UnsafeMeta e, int index, string partialPredicateCall) { + exists(int n, int nMeta | + n = 0 and + nMeta = n + 1 and + ( + none() + or + index = n and result = e.getMeta() and partialPredicateCall = "Meta()" + ) + ) + } + private Element getImmediateChildOfVariant(Variant e, int index, string partialPredicateCall) { - exists(int n, int nAttr, int nDiscriminant, int nFieldList, int nName, int nVisibility | + exists(int n, int nAttr, int nConstArg, int nFieldList, int nName, int nVisibility | n = 0 and nAttr = n + e.getNumberOfAttrs() and - nDiscriminant = nAttr + 1 and - nFieldList = nDiscriminant + 1 and + nConstArg = nAttr + 1 and + nFieldList = nConstArg + 1 and nName = nFieldList + 1 and nVisibility = nName + 1 and ( @@ -2120,9 +2229,9 @@ private module Impl { result = e.getAttr(index - n) and partialPredicateCall = "Attr(" + (index - n).toString() + ")" or - index = nAttr and result = e.getDiscriminant() and partialPredicateCall = "Discriminant()" + index = nAttr and result = e.getConstArg() and partialPredicateCall = "ConstArg()" or - index = nDiscriminant and result = e.getFieldList() and partialPredicateCall = "FieldList()" + index = nConstArg and result = e.getFieldList() and partialPredicateCall = "FieldList()" or index = nFieldList and result = e.getName() and partialPredicateCall = "Name()" or @@ -2242,11 +2351,12 @@ private module Impl { } private Element getImmediateChildOfBlockExpr(BlockExpr e, int index, string partialPredicateCall) { - exists(int n, int nLabel, int nAttr, int nStmtList | + exists(int n, int nLabel, int nAttr, int nStmtList, int nTryBlockModifier | n = 0 and nLabel = n + 1 and nAttr = nLabel + e.getNumberOfAttrs() and nStmtList = nAttr + 1 and + nTryBlockModifier = nStmtList + 1 and ( none() or @@ -2256,6 +2366,10 @@ private module Impl { partialPredicateCall = "Attr(" + (index - nLabel).toString() + ")" or index = nAttr and result = e.getStmtList() and partialPredicateCall = "StmtList()" + or + index = nStmtList and + result = e.getTryBlockModifier() and + partialPredicateCall = "TryBlockModifier()" ) ) } @@ -2526,48 +2640,6 @@ private module Impl { ) } - private Element getImmediateChildOfTraitAlias(TraitAlias e, int index, string partialPredicateCall) { - exists( - int n, int nAttributeMacroExpansion, int nAttr, int nGenericParamList, int nName, - int nTypeBoundList, int nVisibility, int nWhereClause - | - n = 0 and - nAttributeMacroExpansion = n + 1 and - nAttr = nAttributeMacroExpansion + e.getNumberOfAttrs() and - nGenericParamList = nAttr + 1 and - nName = nGenericParamList + 1 and - nTypeBoundList = nName + 1 and - nVisibility = nTypeBoundList + 1 and - nWhereClause = nVisibility + 1 and - ( - none() - or - index = n and - result = e.getAttributeMacroExpansion() and - partialPredicateCall = "AttributeMacroExpansion()" - or - result = e.getAttr(index - nAttributeMacroExpansion) and - partialPredicateCall = "Attr(" + (index - nAttributeMacroExpansion).toString() + ")" - or - index = nAttr and - result = e.getGenericParamList() and - partialPredicateCall = "GenericParamList()" - or - index = nGenericParamList and result = e.getName() and partialPredicateCall = "Name()" - or - index = nName and result = e.getTypeBoundList() and partialPredicateCall = "TypeBoundList()" - or - index = nTypeBoundList and - result = e.getVisibility() and - partialPredicateCall = "Visibility()" - or - index = nVisibility and - result = e.getWhereClause() and - partialPredicateCall = "WhereClause()" - ) - ) - } - private Element getImmediateChildOfUse(Use e, int index, string partialPredicateCall) { exists(int n, int nAttributeMacroExpansion, int nAttr, int nUseTree, int nVisibility | n = 0 and @@ -3045,6 +3117,8 @@ private module Impl { or result = getImmediateChildOfFormatArgsArg(e, index, partialAccessor) or + result = getImmediateChildOfFormatArgsArgName(e, index, partialAccessor) + or result = getImmediateChildOfGenericArgList(e, index, partialAccessor) or result = getImmediateChildOfGenericParamList(e, index, partialAccessor) @@ -3063,8 +3137,6 @@ private module Impl { or result = getImmediateChildOfMatchGuard(e, index, partialAccessor) or - result = getImmediateChildOfMeta(e, index, partialAccessor) - or result = getImmediateChildOfName(e, index, partialAccessor) or result = getImmediateChildOfParamList(e, index, partialAccessor) @@ -3097,6 +3169,8 @@ private module Impl { or result = getImmediateChildOfTokenTree(e, index, partialAccessor) or + result = getImmediateChildOfTryBlockModifier(e, index, partialAccessor) + or result = getImmediateChildOfTupleField(e, index, partialAccessor) or result = getImmediateChildOfTypeBound(e, index, partialAccessor) @@ -3151,6 +3225,14 @@ private module Impl { or result = getImmediateChildOfCastExpr(e, index, partialAccessor) or + result = getImmediateChildOfCfgAtom(e, index, partialAccessor) + or + result = getImmediateChildOfCfgAttrMeta(e, index, partialAccessor) + or + result = getImmediateChildOfCfgComposite(e, index, partialAccessor) + or + result = getImmediateChildOfCfgMeta(e, index, partialAccessor) + or result = getImmediateChildOfClosureExpr(e, index, partialAccessor) or result = getImmediateChildOfComment(e, index, partialAccessor) @@ -3185,6 +3267,8 @@ private module Impl { or result = getImmediateChildOfInferTypeRepr(e, index, partialAccessor) or + result = getImmediateChildOfKeyValueMeta(e, index, partialAccessor) + or result = getImmediateChildOfLetExpr(e, index, partialAccessor) or result = getImmediateChildOfLetStmt(e, index, partialAccessor) @@ -3225,6 +3309,8 @@ private module Impl { or result = getImmediateChildOfParenTypeRepr(e, index, partialAccessor) or + result = getImmediateChildOfPathMeta(e, index, partialAccessor) + or result = getImmediateChildOfPathPat(e, index, partialAccessor) or result = getImmediateChildOfPathTypeRepr(e, index, partialAccessor) @@ -3259,6 +3345,8 @@ private module Impl { or result = getImmediateChildOfStructPat(e, index, partialAccessor) or + result = getImmediateChildOfTokenTreeMeta(e, index, partialAccessor) + or result = getImmediateChildOfTryExpr(e, index, partialAccessor) or result = getImmediateChildOfTupleExpr(e, index, partialAccessor) @@ -3277,6 +3365,8 @@ private module Impl { or result = getImmediateChildOfUnderscoreExpr(e, index, partialAccessor) or + result = getImmediateChildOfUnsafeMeta(e, index, partialAccessor) + or result = getImmediateChildOfVariant(e, index, partialAccessor) or result = getImmediateChildOfWildcardPat(e, index, partialAccessor) @@ -3311,8 +3401,6 @@ private module Impl { or result = getImmediateChildOfTrait(e, index, partialAccessor) or - result = getImmediateChildOfTraitAlias(e, index, partialAccessor) - or result = getImmediateChildOfUse(e, index, partialAccessor) or result = getImmediateChildOfConst(e, index, partialAccessor) diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/PathMeta.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/PathMeta.qll new file mode 100644 index 000000000000..f568d2407e13 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/PathMeta.qll @@ -0,0 +1,37 @@ +// generated by codegen, do not edit +/** + * This module provides the generated definition of `PathMeta`. + * INTERNAL: Do not import directly. + */ + +private import codeql.rust.elements.internal.generated.Synth +private import codeql.rust.elements.internal.generated.Raw +import codeql.rust.elements.internal.MetaImpl::Impl as MetaImpl +import codeql.rust.elements.Path + +/** + * INTERNAL: This module contains the fully generated definition of `PathMeta` and should not + * be referenced directly. + */ +module Generated { + /** + * INTERNAL: Do not reference the `Generated::PathMeta` class directly. + * Use the subclass `PathMeta`, where the following predicates are available. + */ + class PathMeta extends Synth::TPathMeta, MetaImpl::Meta { + override string getAPrimaryQlClass() { result = "PathMeta" } + + /** + * Gets the path of this path meta, if it exists. + */ + Path getPath() { + result = + Synth::convertPathFromRaw(Synth::convertPathMetaToRaw(this).(Raw::PathMeta).getPath()) + } + + /** + * Holds if `getPath()` exists. + */ + final predicate hasPath() { exists(this.getPath()) } + } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll index 01f54e7ab608..c0ab16aa8277 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll @@ -418,6 +418,11 @@ module Raw { int getNumberOfAttrs() { result = count(int i | callable_attrs(this, i, _)) } } + /** + * INTERNAL: Do not use. + */ + class CfgPredicate extends @cfg_predicate, AstNode { } + /** * INTERNAL: Do not use. * The base class for expressions. @@ -538,31 +543,40 @@ module Raw { override string toString() { result = "FormatArgsArg" } /** - * Gets the expression of this format arguments argument, if it exists. + * Gets the argument name of this format arguments argument, if it exists. */ - Expr getExpr() { format_args_arg_exprs(this, result) } + FormatArgsArgName getArgName() { format_args_arg_arg_names(this, result) } /** - * Gets the name of this format arguments argument, if it exists. + * Gets the expression of this format arguments argument, if it exists. */ - Name getName() { format_args_arg_names(this, result) } + Expr getExpr() { format_args_arg_exprs(this, result) } } private Element getImmediateChildOfFormatArgsArg(FormatArgsArg e, int index) { - exists(int n, int nExpr, int nName | + exists(int n, int nArgName, int nExpr | n = 0 and - nExpr = n + 1 and - nName = nExpr + 1 and + nArgName = n + 1 and + nExpr = nArgName + 1 and ( none() or - index = n and result = e.getExpr() + index = n and result = e.getArgName() or - index = nExpr and result = e.getName() + index = nArgName and result = e.getExpr() ) ) } + /** + * INTERNAL: Do not use. + */ + class FormatArgsArgName extends @format_args_arg_name, AstNode { + override string toString() { result = "FormatArgsArgName" } + } + + private Element getImmediateChildOfFormatArgsArgName(FormatArgsArgName e, int index) { none() } + /** * INTERNAL: Do not use. * A generic argument in a generic argument list. @@ -988,47 +1002,7 @@ module Raw { * } * ``` */ - class Meta extends @meta, AstNode { - override string toString() { result = "Meta" } - - /** - * Gets the expression of this meta, if it exists. - */ - Expr getExpr() { meta_exprs(this, result) } - - /** - * Holds if this meta is unsafe. - */ - predicate isUnsafe() { meta_is_unsafe(this) } - - /** - * Gets the path of this meta, if it exists. - */ - Path getPath() { meta_paths(this, result) } - - /** - * Gets the token tree of this meta, if it exists. - */ - TokenTree getTokenTree() { meta_token_trees(this, result) } - } - - private Element getImmediateChildOfMeta(Meta e, int index) { - exists(int n, int nExpr, int nPath, int nTokenTree | - n = 0 and - nExpr = n + 1 and - nPath = nExpr + 1 and - nTokenTree = nPath + 1 and - ( - none() - or - index = n and result = e.getExpr() - or - index = nExpr and result = e.getPath() - or - index = nPath and result = e.getTokenTree() - ) - ) - } + class Meta extends @meta, AstNode { } /** * INTERNAL: Do not use. @@ -1638,9 +1612,9 @@ module Raw { int getNumberOfAttrs() { result = count(int i | struct_field_attrs(this, i, _)) } /** - * Gets the default of this struct field, if it exists. + * Gets the default val of this struct field, if it exists. */ - Expr getDefault() { struct_field_defaults(this, result) } + ConstArg getDefaultVal() { struct_field_default_vals(this, result) } /** * Holds if this struct field is unsafe. @@ -1664,11 +1638,11 @@ module Raw { } private Element getImmediateChildOfStructField(StructField e, int index) { - exists(int n, int nAttr, int nDefault, int nName, int nTypeRepr, int nVisibility | + exists(int n, int nAttr, int nDefaultVal, int nName, int nTypeRepr, int nVisibility | n = 0 and nAttr = n + e.getNumberOfAttrs() and - nDefault = nAttr + 1 and - nName = nDefault + 1 and + nDefaultVal = nAttr + 1 and + nName = nDefaultVal + 1 and nTypeRepr = nName + 1 and nVisibility = nTypeRepr + 1 and ( @@ -1676,9 +1650,9 @@ module Raw { or result = e.getAttr(index - n) or - index = nAttr and result = e.getDefault() + index = nAttr and result = e.getDefaultVal() or - index = nDefault and result = e.getName() + index = nDefaultVal and result = e.getName() or index = nName and result = e.getTypeRepr() or @@ -1806,6 +1780,35 @@ module Raw { private Element getImmediateChildOfTokenTree(TokenTree e, int index) { none() } + /** + * INTERNAL: Do not use. + */ + class TryBlockModifier extends @try_block_modifier, AstNode { + override string toString() { result = "TryBlockModifier" } + + /** + * Holds if this try block modifier is try. + */ + predicate isTry() { try_block_modifier_is_try(this) } + + /** + * Gets the type representation of this try block modifier, if it exists. + */ + TypeRepr getTypeRepr() { try_block_modifier_type_reprs(this, result) } + } + + private Element getImmediateChildOfTryBlockModifier(TryBlockModifier e, int index) { + exists(int n, int nTypeRepr | + n = 0 and + nTypeRepr = n + 1 and + ( + none() + or + index = n and result = e.getTypeRepr() + ) + ) + } + /** * INTERNAL: Do not use. * A field in a tuple struct or tuple variant. @@ -3044,6 +3047,107 @@ module Raw { ) } + /** + * INTERNAL: Do not use. + */ + class CfgAtom extends @cfg_atom, CfgPredicate { + override string toString() { result = "CfgAtom" } + } + + private Element getImmediateChildOfCfgAtom(CfgAtom e, int index) { none() } + + /** + * INTERNAL: Do not use. + */ + class CfgAttrMeta extends @cfg_attr_meta, Meta { + override string toString() { result = "CfgAttrMeta" } + + /** + * Gets the cfg predicate of this cfg attr meta, if it exists. + */ + CfgPredicate getCfgPredicate() { cfg_attr_meta_cfg_predicates(this, result) } + + /** + * Gets the `index`th meta of this cfg attr meta (0-based). + */ + Meta getMeta(int index) { cfg_attr_meta_metas(this, index, result) } + + /** + * Gets the number of metas of this cfg attr meta. + */ + int getNumberOfMetas() { result = count(int i | cfg_attr_meta_metas(this, i, _)) } + } + + private Element getImmediateChildOfCfgAttrMeta(CfgAttrMeta e, int index) { + exists(int n, int nCfgPredicate, int nMeta | + n = 0 and + nCfgPredicate = n + 1 and + nMeta = nCfgPredicate + e.getNumberOfMetas() and + ( + none() + or + index = n and result = e.getCfgPredicate() + or + result = e.getMeta(index - nCfgPredicate) + ) + ) + } + + /** + * INTERNAL: Do not use. + */ + class CfgComposite extends @cfg_composite, CfgPredicate { + override string toString() { result = "CfgComposite" } + + /** + * Gets the `index`th cfg predicate of this cfg composite (0-based). + */ + CfgPredicate getCfgPredicate(int index) { cfg_composite_cfg_predicates(this, index, result) } + + /** + * Gets the number of cfg predicates of this cfg composite. + */ + int getNumberOfCfgPredicates() { + result = count(int i | cfg_composite_cfg_predicates(this, i, _)) + } + } + + private Element getImmediateChildOfCfgComposite(CfgComposite e, int index) { + exists(int n, int nCfgPredicate | + n = 0 and + nCfgPredicate = n + e.getNumberOfCfgPredicates() and + ( + none() + or + result = e.getCfgPredicate(index - n) + ) + ) + } + + /** + * INTERNAL: Do not use. + */ + class CfgMeta extends @cfg_meta, Meta { + override string toString() { result = "CfgMeta" } + + /** + * Gets the cfg predicate of this cfg meta, if it exists. + */ + CfgPredicate getCfgPredicate() { cfg_meta_cfg_predicates(this, result) } + } + + private Element getImmediateChildOfCfgMeta(CfgMeta e, int index) { + exists(int n, int nCfgPredicate | + n = 0 and + nCfgPredicate = n + 1 and + ( + none() + or + index = n and result = e.getCfgPredicate() + ) + ) + } + /** * INTERNAL: Do not use. * A closure expression. For example: @@ -3855,6 +3959,38 @@ module Raw { MacroItems getAttributeMacroExpansion() { item_attribute_macro_expansions(this, result) } } + /** + * INTERNAL: Do not use. + */ + class KeyValueMeta extends @key_value_meta, Meta { + override string toString() { result = "KeyValueMeta" } + + /** + * Gets the expression of this key value meta, if it exists. + */ + Expr getExpr() { key_value_meta_exprs(this, result) } + + /** + * Gets the path of this key value meta, if it exists. + */ + Path getPath() { key_value_meta_paths(this, result) } + } + + private Element getImmediateChildOfKeyValueMeta(KeyValueMeta e, int index) { + exists(int n, int nExpr, int nPath | + n = 0 and + nExpr = n + 1 and + nPath = nExpr + 1 and + ( + none() + or + index = n and result = e.getExpr() + or + index = nExpr and result = e.getPath() + ) + ) + } + /** * INTERNAL: Do not use. * The base class for expressions that can be labeled (`LoopExpr`, `ForExpr`, `WhileExpr` or `BlockExpr`). @@ -4673,6 +4809,30 @@ module Raw { */ class PathExprBase extends @path_expr_base, Expr { } + /** + * INTERNAL: Do not use. + */ + class PathMeta extends @path_meta, Meta { + override string toString() { result = "PathMeta" } + + /** + * Gets the path of this path meta, if it exists. + */ + Path getPath() { path_meta_paths(this, result) } + } + + private Element getImmediateChildOfPathMeta(PathMeta e, int index) { + exists(int n, int nPath | + n = 0 and + nPath = n + 1 and + ( + none() + or + index = n and result = e.getPath() + ) + ) + } + /** * INTERNAL: Do not use. * A path pattern. For example: @@ -5379,6 +5539,38 @@ module Raw { ) } + /** + * INTERNAL: Do not use. + */ + class TokenTreeMeta extends @token_tree_meta, Meta { + override string toString() { result = "TokenTreeMeta" } + + /** + * Gets the path of this token tree meta, if it exists. + */ + Path getPath() { token_tree_meta_paths(this, result) } + + /** + * Gets the token tree of this token tree meta, if it exists. + */ + TokenTree getTokenTree() { token_tree_meta_token_trees(this, result) } + } + + private Element getImmediateChildOfTokenTreeMeta(TokenTreeMeta e, int index) { + exists(int n, int nPath, int nTokenTree | + n = 0 and + nPath = n + 1 and + nTokenTree = nPath + 1 and + ( + none() + or + index = n and result = e.getPath() + or + index = nPath and result = e.getTokenTree() + ) + ) + } + /** * INTERNAL: Do not use. * A try expression using the `?` operator. @@ -5741,6 +5933,35 @@ module Raw { ) } + /** + * INTERNAL: Do not use. + */ + class UnsafeMeta extends @unsafe_meta, Meta { + override string toString() { result = "UnsafeMeta" } + + /** + * Holds if this unsafe meta is unsafe. + */ + predicate isUnsafe() { unsafe_meta_is_unsafe(this) } + + /** + * Gets the meta of this unsafe meta, if it exists. + */ + Meta getMeta() { unsafe_meta_meta(this, result) } + } + + private Element getImmediateChildOfUnsafeMeta(UnsafeMeta e, int index) { + exists(int n, int nMeta | + n = 0 and + nMeta = n + 1 and + ( + none() + or + index = n and result = e.getMeta() + ) + ) + } + /** * INTERNAL: Do not use. * A variant in an enum declaration. @@ -5765,9 +5986,9 @@ module Raw { int getNumberOfAttrs() { result = count(int i | variant_attrs(this, i, _)) } /** - * Gets the discriminant of this variant, if it exists. + * Gets the const argument of this variant, if it exists. */ - Expr getDiscriminant() { variant_discriminants(this, result) } + ConstArg getConstArg() { variant_const_args(this, result) } /** * Gets the field list of this variant, if it exists. @@ -5786,11 +6007,11 @@ module Raw { } private Element getImmediateChildOfVariant(Variant e, int index) { - exists(int n, int nAttr, int nDiscriminant, int nFieldList, int nName, int nVisibility | + exists(int n, int nAttr, int nConstArg, int nFieldList, int nName, int nVisibility | n = 0 and nAttr = n + e.getNumberOfAttrs() and - nDiscriminant = nAttr + 1 and - nFieldList = nDiscriminant + 1 and + nConstArg = nAttr + 1 and + nFieldList = nConstArg + 1 and nName = nFieldList + 1 and nVisibility = nName + 1 and ( @@ -5798,9 +6019,9 @@ module Raw { or result = e.getAttr(index - n) or - index = nAttr and result = e.getDiscriminant() + index = nAttr and result = e.getConstArg() or - index = nDiscriminant and result = e.getFieldList() + index = nConstArg and result = e.getFieldList() or index = nFieldList and result = e.getName() or @@ -6034,11 +6255,6 @@ module Raw { */ predicate isMove() { block_expr_is_move(this) } - /** - * Holds if this block expression is try. - */ - predicate isTry() { block_expr_is_try(this) } - /** * Holds if this block expression is unsafe. */ @@ -6048,14 +6264,20 @@ module Raw { * Gets the statement list of this block expression, if it exists. */ StmtList getStmtList() { block_expr_stmt_lists(this, result) } + + /** + * Gets the try block modifier of this block expression, if it exists. + */ + TryBlockModifier getTryBlockModifier() { block_expr_try_block_modifiers(this, result) } } private Element getImmediateChildOfBlockExpr(BlockExpr e, int index) { - exists(int n, int nLabel, int nAttr, int nStmtList | + exists(int n, int nLabel, int nAttr, int nStmtList, int nTryBlockModifier | n = 0 and nLabel = n + 1 and nAttr = nLabel + e.getNumberOfAttrs() and nStmtList = nAttr + 1 and + nTryBlockModifier = nStmtList + 1 and ( none() or @@ -6064,6 +6286,8 @@ module Raw { result = e.getAttr(index - nLabel) or index = nAttr and result = e.getStmtList() + or + index = nStmtList and result = e.getTryBlockModifier() ) ) } @@ -6674,87 +6898,6 @@ module Raw { ) } - /** - * INTERNAL: Do not use. - * A trait alias. - * - * For example: - * ```rust - * trait Foo = Bar + Baz; - * ``` - */ - class TraitAlias extends @trait_alias, Item { - override string toString() { result = "TraitAlias" } - - /** - * Gets the `index`th attr of this trait alias (0-based). - */ - Attr getAttr(int index) { trait_alias_attrs(this, index, result) } - - /** - * Gets the number of attrs of this trait alias. - */ - int getNumberOfAttrs() { result = count(int i | trait_alias_attrs(this, i, _)) } - - /** - * Gets the generic parameter list of this trait alias, if it exists. - */ - GenericParamList getGenericParamList() { trait_alias_generic_param_lists(this, result) } - - /** - * Gets the name of this trait alias, if it exists. - */ - Name getName() { trait_alias_names(this, result) } - - /** - * Gets the type bound list of this trait alias, if it exists. - */ - TypeBoundList getTypeBoundList() { trait_alias_type_bound_lists(this, result) } - - /** - * Gets the visibility of this trait alias, if it exists. - */ - Visibility getVisibility() { trait_alias_visibilities(this, result) } - - /** - * Gets the where clause of this trait alias, if it exists. - */ - WhereClause getWhereClause() { trait_alias_where_clauses(this, result) } - } - - private Element getImmediateChildOfTraitAlias(TraitAlias e, int index) { - exists( - int n, int nAttributeMacroExpansion, int nAttr, int nGenericParamList, int nName, - int nTypeBoundList, int nVisibility, int nWhereClause - | - n = 0 and - nAttributeMacroExpansion = n + 1 and - nAttr = nAttributeMacroExpansion + e.getNumberOfAttrs() and - nGenericParamList = nAttr + 1 and - nName = nGenericParamList + 1 and - nTypeBoundList = nName + 1 and - nVisibility = nTypeBoundList + 1 and - nWhereClause = nVisibility + 1 and - ( - none() - or - index = n and result = e.getAttributeMacroExpansion() - or - result = e.getAttr(index - nAttributeMacroExpansion) - or - index = nAttr and result = e.getGenericParamList() - or - index = nGenericParamList and result = e.getName() - or - index = nName and result = e.getTypeBoundList() - or - index = nTypeBoundList and result = e.getVisibility() - or - index = nVisibility and result = e.getWhereClause() - ) - ) - } - /** * INTERNAL: Do not use. * An item that defines a type. Either a `Struct`, `Enum`, or `Union`. @@ -7712,6 +7855,8 @@ module Raw { or result = getImmediateChildOfFormatArgsArg(e, index) or + result = getImmediateChildOfFormatArgsArgName(e, index) + or result = getImmediateChildOfGenericArgList(e, index) or result = getImmediateChildOfGenericParamList(e, index) @@ -7730,8 +7875,6 @@ module Raw { or result = getImmediateChildOfMatchGuard(e, index) or - result = getImmediateChildOfMeta(e, index) - or result = getImmediateChildOfName(e, index) or result = getImmediateChildOfParamList(e, index) @@ -7764,6 +7907,8 @@ module Raw { or result = getImmediateChildOfTokenTree(e, index) or + result = getImmediateChildOfTryBlockModifier(e, index) + or result = getImmediateChildOfTupleField(e, index) or result = getImmediateChildOfTypeBound(e, index) @@ -7818,6 +7963,14 @@ module Raw { or result = getImmediateChildOfCastExpr(e, index) or + result = getImmediateChildOfCfgAtom(e, index) + or + result = getImmediateChildOfCfgAttrMeta(e, index) + or + result = getImmediateChildOfCfgComposite(e, index) + or + result = getImmediateChildOfCfgMeta(e, index) + or result = getImmediateChildOfClosureExpr(e, index) or result = getImmediateChildOfComment(e, index) @@ -7852,6 +8005,8 @@ module Raw { or result = getImmediateChildOfInferTypeRepr(e, index) or + result = getImmediateChildOfKeyValueMeta(e, index) + or result = getImmediateChildOfLetExpr(e, index) or result = getImmediateChildOfLetStmt(e, index) @@ -7892,6 +8047,8 @@ module Raw { or result = getImmediateChildOfParenTypeRepr(e, index) or + result = getImmediateChildOfPathMeta(e, index) + or result = getImmediateChildOfPathPat(e, index) or result = getImmediateChildOfPathTypeRepr(e, index) @@ -7926,6 +8083,8 @@ module Raw { or result = getImmediateChildOfStructPat(e, index) or + result = getImmediateChildOfTokenTreeMeta(e, index) + or result = getImmediateChildOfTryExpr(e, index) or result = getImmediateChildOfTupleExpr(e, index) @@ -7944,6 +8103,8 @@ module Raw { or result = getImmediateChildOfUnderscoreExpr(e, index) or + result = getImmediateChildOfUnsafeMeta(e, index) + or result = getImmediateChildOfVariant(e, index) or result = getImmediateChildOfWildcardPat(e, index) @@ -7972,8 +8133,6 @@ module Raw { or result = getImmediateChildOfTrait(e, index) or - result = getImmediateChildOfTraitAlias(e, index) - or result = getImmediateChildOfUse(e, index) or result = getImmediateChildOfConst(e, index) diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/StructField.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/StructField.qll index 9650d4fd2c12..bbad0ec97fc7 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/StructField.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/StructField.qll @@ -8,7 +8,7 @@ private import codeql.rust.elements.internal.generated.Synth private import codeql.rust.elements.internal.generated.Raw import codeql.rust.elements.internal.AstNodeImpl::Impl as AstNodeImpl import codeql.rust.elements.Attr -import codeql.rust.elements.Expr +import codeql.rust.elements.ConstArg import codeql.rust.elements.Name import codeql.rust.elements.TypeRepr import codeql.rust.elements.Visibility @@ -53,19 +53,19 @@ module Generated { final int getNumberOfAttrs() { result = count(int i | exists(this.getAttr(i))) } /** - * Gets the default of this struct field, if it exists. + * Gets the default val of this struct field, if it exists. */ - Expr getDefault() { + ConstArg getDefaultVal() { result = - Synth::convertExprFromRaw(Synth::convertStructFieldToRaw(this) + Synth::convertConstArgFromRaw(Synth::convertStructFieldToRaw(this) .(Raw::StructField) - .getDefault()) + .getDefaultVal()) } /** - * Holds if `getDefault()` exists. + * Holds if `getDefaultVal()` exists. */ - final predicate hasDefault() { exists(this.getDefault()) } + final predicate hasDefaultVal() { exists(this.getDefaultVal()) } /** * Holds if this struct field is unsafe. diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Synth.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Synth.qll index eebd86348e0c..bff6809686f8 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Synth.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Synth.qll @@ -130,6 +130,22 @@ module Synth { * INTERNAL: Do not use. */ TCastExpr(Raw::CastExpr id) { constructCastExpr(id) } or + /** + * INTERNAL: Do not use. + */ + TCfgAtom(Raw::CfgAtom id) { constructCfgAtom(id) } or + /** + * INTERNAL: Do not use. + */ + TCfgAttrMeta(Raw::CfgAttrMeta id) { constructCfgAttrMeta(id) } or + /** + * INTERNAL: Do not use. + */ + TCfgComposite(Raw::CfgComposite id) { constructCfgComposite(id) } or + /** + * INTERNAL: Do not use. + */ + TCfgMeta(Raw::CfgMeta id) { constructCfgMeta(id) } or /** * INTERNAL: Do not use. */ @@ -220,6 +236,10 @@ module Synth { * INTERNAL: Do not use. */ TFormatArgsArg(Raw::FormatArgsArg id) { constructFormatArgsArg(id) } or + /** + * INTERNAL: Do not use. + */ + TFormatArgsArgName(Raw::FormatArgsArgName id) { constructFormatArgsArgName(id) } or /** * INTERNAL: Do not use. */ @@ -278,6 +298,10 @@ module Synth { * INTERNAL: Do not use. */ TItemList(Raw::ItemList id) { constructItemList(id) } or + /** + * INTERNAL: Do not use. + */ + TKeyValueMeta(Raw::KeyValueMeta id) { constructKeyValueMeta(id) } or /** * INTERNAL: Do not use. */ @@ -362,10 +386,6 @@ module Synth { * INTERNAL: Do not use. */ TMatchGuard(Raw::MatchGuard id) { constructMatchGuard(id) } or - /** - * INTERNAL: Do not use. - */ - TMeta(Raw::Meta id) { constructMeta(id) } or /** * INTERNAL: Do not use. */ @@ -434,6 +454,10 @@ module Synth { * INTERNAL: Do not use. */ TPathExpr(Raw::PathExpr id) { constructPathExpr(id) } or + /** + * INTERNAL: Do not use. + */ + TPathMeta(Raw::PathMeta id) { constructPathMeta(id) } or /** * INTERNAL: Do not use. */ @@ -558,6 +582,10 @@ module Synth { * INTERNAL: Do not use. */ TTokenTree(Raw::TokenTree id) { constructTokenTree(id) } or + /** + * INTERNAL: Do not use. + */ + TTokenTreeMeta(Raw::TokenTreeMeta id) { constructTokenTreeMeta(id) } or /** * INTERNAL: Do not use. */ @@ -565,7 +593,7 @@ module Synth { /** * INTERNAL: Do not use. */ - TTraitAlias(Raw::TraitAlias id) { constructTraitAlias(id) } or + TTryBlockModifier(Raw::TryBlockModifier id) { constructTryBlockModifier(id) } or /** * INTERNAL: Do not use. */ @@ -626,6 +654,10 @@ module Synth { * INTERNAL: Do not use. */ TUnion(Raw::Union id) { constructUnion(id) } or + /** + * INTERNAL: Do not use. + */ + TUnsafeMeta(Raw::UnsafeMeta id) { constructUnsafeMeta(id) } or /** * INTERNAL: Do not use. */ @@ -709,22 +741,28 @@ module Synth { */ class TAstNode = TAbi or TAddressable or TArgList or TAsmDirSpec or TAsmOperand or TAsmOperandExpr or - TAsmOption or TAsmPiece or TAsmRegSpec or TAssocItemList or TAttr or TCallable or TExpr or - TExternItemList or TFieldList or TForBinder or TFormatArgsArg or TGenericArg or - TGenericArgList or TGenericParam or TGenericParamList or TItemList or TLabel or TLetElse or - TMacroItems or TMatchArm or TMatchArmList or TMatchGuard or TMeta or TName or TParamBase or - TParamList or TParenthesizedArgList or TPat or TPath or TPathAstNode or TPathSegment or - TRename or TRetTypeRepr or TReturnTypeSyntax or TSourceFile or TStmt or TStmtList or + TAsmOption or TAsmPiece or TAsmRegSpec or TAssocItemList or TAttr or TCallable or + TCfgPredicate or TExpr or TExternItemList or TFieldList or TForBinder or TFormatArgsArg or + TFormatArgsArgName or TGenericArg or TGenericArgList or TGenericParam or + TGenericParamList or TItemList or TLabel or TLetElse or TMacroItems or TMatchArm or + TMatchArmList or TMatchGuard or TMeta or TName or TParamBase or TParamList or + TParenthesizedArgList or TPat or TPath or TPathAstNode or TPathSegment or TRename or + TRetTypeRepr or TReturnTypeSyntax or TSourceFile or TStmt or TStmtList or TStructExprField or TStructExprFieldList or TStructField or TStructPatField or - TStructPatFieldList or TToken or TTokenTree or TTupleField or TTypeBound or - TTypeBoundList or TTypeRepr or TUseBoundGenericArg or TUseBoundGenericArgs or TUseTree or - TUseTreeList or TVariantList or TVisibility or TWhereClause or TWherePred; + TStructPatFieldList or TToken or TTokenTree or TTryBlockModifier or TTupleField or + TTypeBound or TTypeBoundList or TTypeRepr or TUseBoundGenericArg or TUseBoundGenericArgs or + TUseTree or TUseTreeList or TVariantList or TVisibility or TWhereClause or TWherePred; /** * INTERNAL: Do not use. */ class TCallable = TClosureExpr or TFunction; + /** + * INTERNAL: Do not use. + */ + class TCfgPredicate = TCfgAtom or TCfgComposite; + /** * INTERNAL: Do not use. */ @@ -761,7 +799,7 @@ module Synth { */ class TItem = TAsmExpr or TAssocItem or TExternBlock or TExternCrate or TExternItem or TImpl or TMacroDef or - TMacroRules or TModule or TTrait or TTraitAlias or TTypeItem or TUse; + TMacroRules or TModule or TTrait or TTypeItem or TUse; /** * INTERNAL: Do not use. @@ -778,6 +816,12 @@ module Synth { */ class TLoopingExpr = TForExpr or TLoopExpr or TWhileExpr; + /** + * INTERNAL: Do not use. + */ + class TMeta = + TCfgAttrMeta or TCfgMeta or TKeyValueMeta or TPathMeta or TTokenTreeMeta or TUnsafeMeta; + /** * INTERNAL: Do not use. */ @@ -1054,6 +1098,34 @@ module Synth { */ TCastExpr convertCastExprFromRaw(Raw::Element e) { result = TCastExpr(e) } + /** + * INTERNAL: Do not use. + * + * Converts a raw element to a synthesized `TCfgAtom`, if possible. + */ + TCfgAtom convertCfgAtomFromRaw(Raw::Element e) { result = TCfgAtom(e) } + + /** + * INTERNAL: Do not use. + * + * Converts a raw element to a synthesized `TCfgAttrMeta`, if possible. + */ + TCfgAttrMeta convertCfgAttrMetaFromRaw(Raw::Element e) { result = TCfgAttrMeta(e) } + + /** + * INTERNAL: Do not use. + * + * Converts a raw element to a synthesized `TCfgComposite`, if possible. + */ + TCfgComposite convertCfgCompositeFromRaw(Raw::Element e) { result = TCfgComposite(e) } + + /** + * INTERNAL: Do not use. + * + * Converts a raw element to a synthesized `TCfgMeta`, if possible. + */ + TCfgMeta convertCfgMetaFromRaw(Raw::Element e) { result = TCfgMeta(e) } + /** * INTERNAL: Do not use. * @@ -1208,6 +1280,15 @@ module Synth { */ TFormatArgsArg convertFormatArgsArgFromRaw(Raw::Element e) { result = TFormatArgsArg(e) } + /** + * INTERNAL: Do not use. + * + * Converts a raw element to a synthesized `TFormatArgsArgName`, if possible. + */ + TFormatArgsArgName convertFormatArgsArgNameFromRaw(Raw::Element e) { + result = TFormatArgsArgName(e) + } + /** * INTERNAL: Do not use. * @@ -1303,6 +1384,13 @@ module Synth { */ TItemList convertItemListFromRaw(Raw::Element e) { result = TItemList(e) } + /** + * INTERNAL: Do not use. + * + * Converts a raw element to a synthesized `TKeyValueMeta`, if possible. + */ + TKeyValueMeta convertKeyValueMetaFromRaw(Raw::Element e) { result = TKeyValueMeta(e) } + /** * INTERNAL: Do not use. * @@ -1450,13 +1538,6 @@ module Synth { */ TMatchGuard convertMatchGuardFromRaw(Raw::Element e) { result = TMatchGuard(e) } - /** - * INTERNAL: Do not use. - * - * Converts a raw element to a synthesized `TMeta`, if possible. - */ - TMeta convertMetaFromRaw(Raw::Element e) { result = TMeta(e) } - /** * INTERNAL: Do not use. * @@ -1578,6 +1659,13 @@ module Synth { */ TPathExpr convertPathExprFromRaw(Raw::Element e) { result = TPathExpr(e) } + /** + * INTERNAL: Do not use. + * + * Converts a raw element to a synthesized `TPathMeta`, if possible. + */ + TPathMeta convertPathMetaFromRaw(Raw::Element e) { result = TPathMeta(e) } + /** * INTERNAL: Do not use. * @@ -1799,6 +1887,13 @@ module Synth { */ TTokenTree convertTokenTreeFromRaw(Raw::Element e) { result = TTokenTree(e) } + /** + * INTERNAL: Do not use. + * + * Converts a raw element to a synthesized `TTokenTreeMeta`, if possible. + */ + TTokenTreeMeta convertTokenTreeMetaFromRaw(Raw::Element e) { result = TTokenTreeMeta(e) } + /** * INTERNAL: Do not use. * @@ -1809,9 +1904,9 @@ module Synth { /** * INTERNAL: Do not use. * - * Converts a raw element to a synthesized `TTraitAlias`, if possible. + * Converts a raw element to a synthesized `TTryBlockModifier`, if possible. */ - TTraitAlias convertTraitAliasFromRaw(Raw::Element e) { result = TTraitAlias(e) } + TTryBlockModifier convertTryBlockModifierFromRaw(Raw::Element e) { result = TTryBlockModifier(e) } /** * INTERNAL: Do not use. @@ -1918,6 +2013,13 @@ module Synth { */ TUnion convertUnionFromRaw(Raw::Element e) { result = TUnion(e) } + /** + * INTERNAL: Do not use. + * + * Converts a raw element to a synthesized `TUnsafeMeta`, if possible. + */ + TUnsafeMeta convertUnsafeMetaFromRaw(Raw::Element e) { result = TUnsafeMeta(e) } + /** * INTERNAL: Do not use. * @@ -2100,6 +2202,8 @@ module Synth { or result = convertCallableFromRaw(e) or + result = convertCfgPredicateFromRaw(e) + or result = convertExprFromRaw(e) or result = convertExternItemListFromRaw(e) @@ -2110,6 +2214,8 @@ module Synth { or result = convertFormatArgsArgFromRaw(e) or + result = convertFormatArgsArgNameFromRaw(e) + or result = convertGenericArgFromRaw(e) or result = convertGenericArgListFromRaw(e) @@ -2176,6 +2282,8 @@ module Synth { or result = convertTokenTreeFromRaw(e) or + result = convertTryBlockModifierFromRaw(e) + or result = convertTupleFieldFromRaw(e) or result = convertTypeBoundFromRaw(e) @@ -2211,6 +2319,16 @@ module Synth { result = convertFunctionFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TCfgPredicate`, if possible. + */ + TCfgPredicate convertCfgPredicateFromRaw(Raw::Element e) { + result = convertCfgAtomFromRaw(e) + or + result = convertCfgCompositeFromRaw(e) + } + /** * INTERNAL: Do not use. * Converts a raw DB element to a synthesized `TElement`, if possible. @@ -2374,8 +2492,6 @@ module Synth { or result = convertTraitFromRaw(e) or - result = convertTraitAliasFromRaw(e) - or result = convertTypeItemFromRaw(e) or result = convertUseFromRaw(e) @@ -2417,6 +2533,24 @@ module Synth { result = convertWhileExprFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TMeta`, if possible. + */ + TMeta convertMetaFromRaw(Raw::Element e) { + result = convertCfgAttrMetaFromRaw(e) + or + result = convertCfgMetaFromRaw(e) + or + result = convertKeyValueMetaFromRaw(e) + or + result = convertPathMetaFromRaw(e) + or + result = convertTokenTreeMetaFromRaw(e) + or + result = convertUnsafeMetaFromRaw(e) + } + /** * INTERNAL: Do not use. * Converts a raw DB element to a synthesized `TParamBase`, if possible. @@ -2751,6 +2885,30 @@ module Synth { */ Raw::Element convertCastExprToRaw(TCastExpr e) { e = TCastExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TCfgAtom` to a raw DB element, if possible. + */ + Raw::Element convertCfgAtomToRaw(TCfgAtom e) { e = TCfgAtom(result) } + + /** + * INTERNAL: Do not use. + * Converts a synthesized `TCfgAttrMeta` to a raw DB element, if possible. + */ + Raw::Element convertCfgAttrMetaToRaw(TCfgAttrMeta e) { e = TCfgAttrMeta(result) } + + /** + * INTERNAL: Do not use. + * Converts a synthesized `TCfgComposite` to a raw DB element, if possible. + */ + Raw::Element convertCfgCompositeToRaw(TCfgComposite e) { e = TCfgComposite(result) } + + /** + * INTERNAL: Do not use. + * Converts a synthesized `TCfgMeta` to a raw DB element, if possible. + */ + Raw::Element convertCfgMetaToRaw(TCfgMeta e) { e = TCfgMeta(result) } + /** * INTERNAL: Do not use. * Converts a synthesized `TClosureExpr` to a raw DB element, if possible. @@ -2883,6 +3041,14 @@ module Synth { */ Raw::Element convertFormatArgsArgToRaw(TFormatArgsArg e) { e = TFormatArgsArg(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TFormatArgsArgName` to a raw DB element, if possible. + */ + Raw::Element convertFormatArgsArgNameToRaw(TFormatArgsArgName e) { + e = TFormatArgsArgName(result) + } + /** * INTERNAL: Do not use. * Converts a synthesized `TFormatArgsExpr` to a raw DB element, if possible. @@ -2963,6 +3129,12 @@ module Synth { */ Raw::Element convertItemListToRaw(TItemList e) { e = TItemList(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TKeyValueMeta` to a raw DB element, if possible. + */ + Raw::Element convertKeyValueMetaToRaw(TKeyValueMeta e) { e = TKeyValueMeta(result) } + /** * INTERNAL: Do not use. * Converts a synthesized `TLabel` to a raw DB element, if possible. @@ -3089,12 +3261,6 @@ module Synth { */ Raw::Element convertMatchGuardToRaw(TMatchGuard e) { e = TMatchGuard(result) } - /** - * INTERNAL: Do not use. - * Converts a synthesized `TMeta` to a raw DB element, if possible. - */ - Raw::Element convertMetaToRaw(TMeta e) { e = TMeta(result) } - /** * INTERNAL: Do not use. * Converts a synthesized `TMethodCallExpr` to a raw DB element, if possible. @@ -3199,6 +3365,12 @@ module Synth { */ Raw::Element convertPathExprToRaw(TPathExpr e) { e = TPathExpr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TPathMeta` to a raw DB element, if possible. + */ + Raw::Element convertPathMetaToRaw(TPathMeta e) { e = TPathMeta(result) } + /** * INTERNAL: Do not use. * Converts a synthesized `TPathPat` to a raw DB element, if possible. @@ -3389,6 +3561,12 @@ module Synth { */ Raw::Element convertTokenTreeToRaw(TTokenTree e) { e = TTokenTree(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TTokenTreeMeta` to a raw DB element, if possible. + */ + Raw::Element convertTokenTreeMetaToRaw(TTokenTreeMeta e) { e = TTokenTreeMeta(result) } + /** * INTERNAL: Do not use. * Converts a synthesized `TTrait` to a raw DB element, if possible. @@ -3397,9 +3575,9 @@ module Synth { /** * INTERNAL: Do not use. - * Converts a synthesized `TTraitAlias` to a raw DB element, if possible. + * Converts a synthesized `TTryBlockModifier` to a raw DB element, if possible. */ - Raw::Element convertTraitAliasToRaw(TTraitAlias e) { e = TTraitAlias(result) } + Raw::Element convertTryBlockModifierToRaw(TTryBlockModifier e) { e = TTryBlockModifier(result) } /** * INTERNAL: Do not use. @@ -3491,6 +3669,12 @@ module Synth { */ Raw::Element convertUnionToRaw(TUnion e) { e = TUnion(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TUnsafeMeta` to a raw DB element, if possible. + */ + Raw::Element convertUnsafeMetaToRaw(TUnsafeMeta e) { e = TUnsafeMeta(result) } + /** * INTERNAL: Do not use. * Converts a synthesized `TUse` to a raw DB element, if possible. @@ -3660,6 +3844,8 @@ module Synth { or result = convertCallableToRaw(e) or + result = convertCfgPredicateToRaw(e) + or result = convertExprToRaw(e) or result = convertExternItemListToRaw(e) @@ -3670,6 +3856,8 @@ module Synth { or result = convertFormatArgsArgToRaw(e) or + result = convertFormatArgsArgNameToRaw(e) + or result = convertGenericArgToRaw(e) or result = convertGenericArgListToRaw(e) @@ -3736,6 +3924,8 @@ module Synth { or result = convertTokenTreeToRaw(e) or + result = convertTryBlockModifierToRaw(e) + or result = convertTupleFieldToRaw(e) or result = convertTypeBoundToRaw(e) @@ -3771,6 +3961,16 @@ module Synth { result = convertFunctionToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TCfgPredicate` to a raw DB element, if possible. + */ + Raw::Element convertCfgPredicateToRaw(TCfgPredicate e) { + result = convertCfgAtomToRaw(e) + or + result = convertCfgCompositeToRaw(e) + } + /** * INTERNAL: Do not use. * Converts a synthesized `TElement` to a raw DB element, if possible. @@ -3934,8 +4134,6 @@ module Synth { or result = convertTraitToRaw(e) or - result = convertTraitAliasToRaw(e) - or result = convertTypeItemToRaw(e) or result = convertUseToRaw(e) @@ -3977,6 +4175,24 @@ module Synth { result = convertWhileExprToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TMeta` to a raw DB element, if possible. + */ + Raw::Element convertMetaToRaw(TMeta e) { + result = convertCfgAttrMetaToRaw(e) + or + result = convertCfgMetaToRaw(e) + or + result = convertKeyValueMetaToRaw(e) + or + result = convertPathMetaToRaw(e) + or + result = convertTokenTreeMetaToRaw(e) + or + result = convertUnsafeMetaToRaw(e) + } + /** * INTERNAL: Do not use. * Converts a synthesized `TParamBase` to a raw DB element, if possible. diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/SynthConstructors.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/SynthConstructors.qll index 613af726ba4e..40d7f1c5acd7 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/SynthConstructors.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/SynthConstructors.qll @@ -32,6 +32,10 @@ import codeql.rust.elements.internal.BoxPatConstructor import codeql.rust.elements.internal.BreakExprConstructor import codeql.rust.elements.internal.CallExprConstructor import codeql.rust.elements.internal.CastExprConstructor +import codeql.rust.elements.internal.CfgAtomConstructor +import codeql.rust.elements.internal.CfgAttrMetaConstructor +import codeql.rust.elements.internal.CfgCompositeConstructor +import codeql.rust.elements.internal.CfgMetaConstructor import codeql.rust.elements.internal.ClosureExprConstructor import codeql.rust.elements.internal.CommentConstructor import codeql.rust.elements.internal.ConstConstructor @@ -54,6 +58,7 @@ import codeql.rust.elements.internal.ForExprConstructor import codeql.rust.elements.internal.ForTypeReprConstructor import codeql.rust.elements.internal.FormatConstructor import codeql.rust.elements.internal.FormatArgsArgConstructor +import codeql.rust.elements.internal.FormatArgsArgNameConstructor import codeql.rust.elements.internal.FormatArgsExprConstructor import codeql.rust.elements.internal.FormatArgumentConstructor import codeql.rust.elements.internal.FormatTemplateVariableAccessConstructor @@ -67,6 +72,7 @@ import codeql.rust.elements.internal.ImplTraitTypeReprConstructor import codeql.rust.elements.internal.IndexExprConstructor import codeql.rust.elements.internal.InferTypeReprConstructor import codeql.rust.elements.internal.ItemListConstructor +import codeql.rust.elements.internal.KeyValueMetaConstructor import codeql.rust.elements.internal.LabelConstructor import codeql.rust.elements.internal.LetElseConstructor import codeql.rust.elements.internal.LetExprConstructor @@ -88,7 +94,6 @@ import codeql.rust.elements.internal.MatchArmConstructor import codeql.rust.elements.internal.MatchArmListConstructor import codeql.rust.elements.internal.MatchExprConstructor import codeql.rust.elements.internal.MatchGuardConstructor -import codeql.rust.elements.internal.MetaConstructor import codeql.rust.elements.internal.MethodCallExprConstructor import codeql.rust.elements.internal.MissingConstructor import codeql.rust.elements.internal.ModuleConstructor @@ -106,6 +111,7 @@ import codeql.rust.elements.internal.ParenTypeReprConstructor import codeql.rust.elements.internal.ParenthesizedArgListConstructor import codeql.rust.elements.internal.PathConstructor import codeql.rust.elements.internal.PathExprConstructor +import codeql.rust.elements.internal.PathMetaConstructor import codeql.rust.elements.internal.PathPatConstructor import codeql.rust.elements.internal.PathSegmentConstructor import codeql.rust.elements.internal.PathTypeReprConstructor @@ -137,8 +143,9 @@ import codeql.rust.elements.internal.StructPatConstructor import codeql.rust.elements.internal.StructPatFieldConstructor import codeql.rust.elements.internal.StructPatFieldListConstructor import codeql.rust.elements.internal.TokenTreeConstructor +import codeql.rust.elements.internal.TokenTreeMetaConstructor import codeql.rust.elements.internal.TraitConstructor -import codeql.rust.elements.internal.TraitAliasConstructor +import codeql.rust.elements.internal.TryBlockModifierConstructor import codeql.rust.elements.internal.TryExprConstructor import codeql.rust.elements.internal.TupleExprConstructor import codeql.rust.elements.internal.TupleFieldConstructor @@ -154,6 +161,7 @@ import codeql.rust.elements.internal.TypeParamConstructor import codeql.rust.elements.internal.UnderscoreExprConstructor import codeql.rust.elements.internal.UnimplementedConstructor import codeql.rust.elements.internal.UnionConstructor +import codeql.rust.elements.internal.UnsafeMetaConstructor import codeql.rust.elements.internal.UseConstructor import codeql.rust.elements.internal.UseBoundGenericArgsConstructor import codeql.rust.elements.internal.UseTreeConstructor diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/TokenTreeMeta.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/TokenTreeMeta.qll new file mode 100644 index 000000000000..b6d7d0a676a3 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/TokenTreeMeta.qll @@ -0,0 +1,55 @@ +// generated by codegen, do not edit +/** + * This module provides the generated definition of `TokenTreeMeta`. + * INTERNAL: Do not import directly. + */ + +private import codeql.rust.elements.internal.generated.Synth +private import codeql.rust.elements.internal.generated.Raw +import codeql.rust.elements.internal.MetaImpl::Impl as MetaImpl +import codeql.rust.elements.Path +import codeql.rust.elements.TokenTree + +/** + * INTERNAL: This module contains the fully generated definition of `TokenTreeMeta` and should not + * be referenced directly. + */ +module Generated { + /** + * INTERNAL: Do not reference the `Generated::TokenTreeMeta` class directly. + * Use the subclass `TokenTreeMeta`, where the following predicates are available. + */ + class TokenTreeMeta extends Synth::TTokenTreeMeta, MetaImpl::Meta { + override string getAPrimaryQlClass() { result = "TokenTreeMeta" } + + /** + * Gets the path of this token tree meta, if it exists. + */ + Path getPath() { + result = + Synth::convertPathFromRaw(Synth::convertTokenTreeMetaToRaw(this) + .(Raw::TokenTreeMeta) + .getPath()) + } + + /** + * Holds if `getPath()` exists. + */ + final predicate hasPath() { exists(this.getPath()) } + + /** + * Gets the token tree of this token tree meta, if it exists. + */ + TokenTree getTokenTree() { + result = + Synth::convertTokenTreeFromRaw(Synth::convertTokenTreeMetaToRaw(this) + .(Raw::TokenTreeMeta) + .getTokenTree()) + } + + /** + * Holds if `getTokenTree()` exists. + */ + final predicate hasTokenTree() { exists(this.getTokenTree()) } + } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/TraitAlias.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/TraitAlias.qll deleted file mode 100644 index 0ca44b1f577d..000000000000 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/TraitAlias.qll +++ /dev/null @@ -1,128 +0,0 @@ -// generated by codegen, do not edit -/** - * This module provides the generated definition of `TraitAlias`. - * INTERNAL: Do not import directly. - */ - -private import codeql.rust.elements.internal.generated.Synth -private import codeql.rust.elements.internal.generated.Raw -import codeql.rust.elements.Attr -import codeql.rust.elements.GenericParamList -import codeql.rust.elements.internal.ItemImpl::Impl as ItemImpl -import codeql.rust.elements.Name -import codeql.rust.elements.TypeBoundList -import codeql.rust.elements.Visibility -import codeql.rust.elements.WhereClause - -/** - * INTERNAL: This module contains the fully generated definition of `TraitAlias` and should not - * be referenced directly. - */ -module Generated { - /** - * A trait alias. - * - * For example: - * ```rust - * trait Foo = Bar + Baz; - * ``` - * INTERNAL: Do not reference the `Generated::TraitAlias` class directly. - * Use the subclass `TraitAlias`, where the following predicates are available. - */ - class TraitAlias extends Synth::TTraitAlias, ItemImpl::Item { - override string getAPrimaryQlClass() { result = "TraitAlias" } - - /** - * Gets the `index`th attr of this trait alias (0-based). - */ - Attr getAttr(int index) { - result = - Synth::convertAttrFromRaw(Synth::convertTraitAliasToRaw(this) - .(Raw::TraitAlias) - .getAttr(index)) - } - - /** - * Gets any of the attrs of this trait alias. - */ - final Attr getAnAttr() { result = this.getAttr(_) } - - /** - * Gets the number of attrs of this trait alias. - */ - final int getNumberOfAttrs() { result = count(int i | exists(this.getAttr(i))) } - - /** - * Gets the generic parameter list of this trait alias, if it exists. - */ - GenericParamList getGenericParamList() { - result = - Synth::convertGenericParamListFromRaw(Synth::convertTraitAliasToRaw(this) - .(Raw::TraitAlias) - .getGenericParamList()) - } - - /** - * Holds if `getGenericParamList()` exists. - */ - final predicate hasGenericParamList() { exists(this.getGenericParamList()) } - - /** - * Gets the name of this trait alias, if it exists. - */ - Name getName() { - result = - Synth::convertNameFromRaw(Synth::convertTraitAliasToRaw(this).(Raw::TraitAlias).getName()) - } - - /** - * Holds if `getName()` exists. - */ - final predicate hasName() { exists(this.getName()) } - - /** - * Gets the type bound list of this trait alias, if it exists. - */ - TypeBoundList getTypeBoundList() { - result = - Synth::convertTypeBoundListFromRaw(Synth::convertTraitAliasToRaw(this) - .(Raw::TraitAlias) - .getTypeBoundList()) - } - - /** - * Holds if `getTypeBoundList()` exists. - */ - final predicate hasTypeBoundList() { exists(this.getTypeBoundList()) } - - /** - * Gets the visibility of this trait alias, if it exists. - */ - Visibility getVisibility() { - result = - Synth::convertVisibilityFromRaw(Synth::convertTraitAliasToRaw(this) - .(Raw::TraitAlias) - .getVisibility()) - } - - /** - * Holds if `getVisibility()` exists. - */ - final predicate hasVisibility() { exists(this.getVisibility()) } - - /** - * Gets the where clause of this trait alias, if it exists. - */ - WhereClause getWhereClause() { - result = - Synth::convertWhereClauseFromRaw(Synth::convertTraitAliasToRaw(this) - .(Raw::TraitAlias) - .getWhereClause()) - } - - /** - * Holds if `getWhereClause()` exists. - */ - final predicate hasWhereClause() { exists(this.getWhereClause()) } - } -} diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/TryBlockModifier.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/TryBlockModifier.qll new file mode 100644 index 000000000000..e058784736b8 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/TryBlockModifier.qll @@ -0,0 +1,44 @@ +// generated by codegen, do not edit +/** + * This module provides the generated definition of `TryBlockModifier`. + * INTERNAL: Do not import directly. + */ + +private import codeql.rust.elements.internal.generated.Synth +private import codeql.rust.elements.internal.generated.Raw +import codeql.rust.elements.internal.AstNodeImpl::Impl as AstNodeImpl +import codeql.rust.elements.TypeRepr + +/** + * INTERNAL: This module contains the fully generated definition of `TryBlockModifier` and should not + * be referenced directly. + */ +module Generated { + /** + * INTERNAL: Do not reference the `Generated::TryBlockModifier` class directly. + * Use the subclass `TryBlockModifier`, where the following predicates are available. + */ + class TryBlockModifier extends Synth::TTryBlockModifier, AstNodeImpl::AstNode { + override string getAPrimaryQlClass() { result = "TryBlockModifier" } + + /** + * Holds if this try block modifier is try. + */ + predicate isTry() { Synth::convertTryBlockModifierToRaw(this).(Raw::TryBlockModifier).isTry() } + + /** + * Gets the type representation of this try block modifier, if it exists. + */ + TypeRepr getTypeRepr() { + result = + Synth::convertTypeReprFromRaw(Synth::convertTryBlockModifierToRaw(this) + .(Raw::TryBlockModifier) + .getTypeRepr()) + } + + /** + * Holds if `getTypeRepr()` exists. + */ + final predicate hasTypeRepr() { exists(this.getTypeRepr()) } + } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/UnsafeMeta.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/UnsafeMeta.qll new file mode 100644 index 000000000000..e701e6bb1fb8 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/UnsafeMeta.qll @@ -0,0 +1,42 @@ +// generated by codegen, do not edit +/** + * This module provides the generated definition of `UnsafeMeta`. + * INTERNAL: Do not import directly. + */ + +private import codeql.rust.elements.internal.generated.Synth +private import codeql.rust.elements.internal.generated.Raw +import codeql.rust.elements.Meta +import codeql.rust.elements.internal.MetaImpl::Impl as MetaImpl + +/** + * INTERNAL: This module contains the fully generated definition of `UnsafeMeta` and should not + * be referenced directly. + */ +module Generated { + /** + * INTERNAL: Do not reference the `Generated::UnsafeMeta` class directly. + * Use the subclass `UnsafeMeta`, where the following predicates are available. + */ + class UnsafeMeta extends Synth::TUnsafeMeta, MetaImpl::Meta { + override string getAPrimaryQlClass() { result = "UnsafeMeta" } + + /** + * Holds if this unsafe meta is unsafe. + */ + predicate isUnsafe() { Synth::convertUnsafeMetaToRaw(this).(Raw::UnsafeMeta).isUnsafe() } + + /** + * Gets the meta of this unsafe meta, if it exists. + */ + Meta getMeta() { + result = + Synth::convertMetaFromRaw(Synth::convertUnsafeMetaToRaw(this).(Raw::UnsafeMeta).getMeta()) + } + + /** + * Holds if `getMeta()` exists. + */ + final predicate hasMeta() { exists(this.getMeta()) } + } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Variant.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Variant.qll index 7da69072953c..c37995f77a0f 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Variant.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Variant.qll @@ -8,7 +8,7 @@ private import codeql.rust.elements.internal.generated.Synth private import codeql.rust.elements.internal.generated.Raw import codeql.rust.elements.internal.AddressableImpl::Impl as AddressableImpl import codeql.rust.elements.Attr -import codeql.rust.elements.Expr +import codeql.rust.elements.ConstArg import codeql.rust.elements.FieldList import codeql.rust.elements.Name import codeql.rust.elements.Visibility @@ -51,17 +51,17 @@ module Generated { final int getNumberOfAttrs() { result = count(int i | exists(this.getAttr(i))) } /** - * Gets the discriminant of this variant, if it exists. + * Gets the const argument of this variant, if it exists. */ - Expr getDiscriminant() { + ConstArg getConstArg() { result = - Synth::convertExprFromRaw(Synth::convertVariantToRaw(this).(Raw::Variant).getDiscriminant()) + Synth::convertConstArgFromRaw(Synth::convertVariantToRaw(this).(Raw::Variant).getConstArg()) } /** - * Holds if `getDiscriminant()` exists. + * Holds if `getConstArg()` exists. */ - final predicate hasDiscriminant() { exists(this.getDiscriminant()) } + final predicate hasConstArg() { exists(this.getConstArg()) } /** * Gets the field list of this variant, if it exists. diff --git a/rust/ql/lib/rust.dbscheme b/rust/ql/lib/rust.dbscheme index 66a489863649..109496fd2f20 100644 --- a/rust/ql/lib/rust.dbscheme +++ b/rust/ql/lib/rust.dbscheme @@ -189,11 +189,13 @@ named_crates( | @assoc_item_list | @attr | @callable +| @cfg_predicate | @expr | @extern_item_list | @field_list | @for_binder | @format_args_arg +| @format_args_arg_name | @generic_arg | @generic_arg_list | @generic_param @@ -227,6 +229,7 @@ named_crates( | @struct_pat_field_list | @token | @token_tree +| @try_block_modifier | @tuple_field | @type_bound | @type_bound_list @@ -403,6 +406,11 @@ callable_attrs( int attr: @attr ref ); +@cfg_predicate = + @cfg_atom +| @cfg_composite +; + @expr = @array_expr_internal | @asm_expr @@ -476,16 +484,20 @@ format_args_args( unique int id: @format_args_arg ); +#keyset[id] +format_args_arg_arg_names( + int id: @format_args_arg ref, + int arg_name: @format_args_arg_name ref +); + #keyset[id] format_args_arg_exprs( int id: @format_args_arg ref, int expr: @expr ref ); -#keyset[id] format_args_arg_names( - int id: @format_args_arg ref, - int name: @name ref + unique int id: @format_args_arg_name ); @generic_arg = @@ -629,32 +641,14 @@ match_guard_conditions( int condition: @expr ref ); -meta( - unique int id: @meta -); - -#keyset[id] -meta_exprs( - int id: @meta ref, - int expr: @expr ref -); - -#keyset[id] -meta_is_unsafe( - int id: @meta ref -); - -#keyset[id] -meta_paths( - int id: @meta ref, - int path: @path ref -); - -#keyset[id] -meta_token_trees( - int id: @meta ref, - int token_tree: @token_tree ref -); +@meta = + @cfg_attr_meta +| @cfg_meta +| @key_value_meta +| @path_meta +| @token_tree_meta +| @unsafe_meta +; names( unique int id: @name @@ -938,9 +932,9 @@ struct_field_attrs( ); #keyset[id] -struct_field_defaults( +struct_field_default_vals( int id: @struct_field ref, - int default: @expr ref + int default_val: @const_arg ref ); #keyset[id] @@ -1014,6 +1008,21 @@ token_trees( unique int id: @token_tree ); +try_block_modifiers( + unique int id: @try_block_modifier +); + +#keyset[id] +try_block_modifier_is_try( + int id: @try_block_modifier ref +); + +#keyset[id] +try_block_modifier_type_reprs( + int id: @try_block_modifier ref, + int type_repr: @type_repr ref +); + tuple_fields( unique int id: @tuple_field ); @@ -1538,6 +1547,48 @@ cast_expr_type_reprs( int type_repr: @type_repr ref ); +cfg_atoms( + unique int id: @cfg_atom +); + +cfg_attr_meta( + unique int id: @cfg_attr_meta +); + +#keyset[id] +cfg_attr_meta_cfg_predicates( + int id: @cfg_attr_meta ref, + int cfg_predicate: @cfg_predicate ref +); + +#keyset[id, index] +cfg_attr_meta_metas( + int id: @cfg_attr_meta ref, + int index: int ref, + int meta: @meta ref +); + +cfg_composites( + unique int id: @cfg_composite +); + +#keyset[id, index] +cfg_composite_cfg_predicates( + int id: @cfg_composite ref, + int index: int ref, + int cfg_predicate: @cfg_predicate ref +); + +cfg_meta( + unique int id: @cfg_meta +); + +#keyset[id] +cfg_meta_cfg_predicates( + int id: @cfg_meta ref, + int cfg_predicate: @cfg_predicate ref +); + closure_exprs( unique int id: @closure_expr ); @@ -1897,7 +1948,6 @@ infer_type_reprs( | @macro_rules | @module | @trait -| @trait_alias | @type_item | @use ; @@ -1908,6 +1958,22 @@ item_attribute_macro_expansions( int attribute_macro_expansion: @macro_items ref ); +key_value_meta( + unique int id: @key_value_meta +); + +#keyset[id] +key_value_meta_exprs( + int id: @key_value_meta ref, + int expr: @expr ref +); + +#keyset[id] +key_value_meta_paths( + int id: @key_value_meta ref, + int path: @path ref +); + @labelable_expr = @block_expr | @looping_expr @@ -2235,6 +2301,16 @@ paren_type_repr_type_reprs( @path_expr ; +path_meta( + unique int id: @path_meta +); + +#keyset[id] +path_meta_paths( + int id: @path_meta ref, + int path: @path ref +); + path_pats( unique int id: @path_pat ); @@ -2517,6 +2593,22 @@ struct_pat_struct_pat_field_lists( int struct_pat_field_list: @struct_pat_field_list ref ); +token_tree_meta( + unique int id: @token_tree_meta +); + +#keyset[id] +token_tree_meta_paths( + int id: @token_tree_meta ref, + int path: @path ref +); + +#keyset[id] +token_tree_meta_token_trees( + int id: @token_tree_meta ref, + int token_tree: @token_tree ref +); + try_exprs( unique int id: @try_expr ); @@ -2646,6 +2738,21 @@ underscore_expr_attrs( int attr: @attr ref ); +unsafe_meta( + unique int id: @unsafe_meta +); + +#keyset[id] +unsafe_meta_is_unsafe( + int id: @unsafe_meta ref +); + +#keyset[id] +unsafe_meta_meta( + int id: @unsafe_meta ref, + int meta: @meta ref +); + variants( unique int id: @variant ); @@ -2658,9 +2765,9 @@ variant_attrs( ); #keyset[id] -variant_discriminants( +variant_const_args( int id: @variant ref, - int discriminant: @expr ref + int const_arg: @const_arg ref ); #keyset[id] @@ -2782,11 +2889,6 @@ block_expr_is_move( int id: @block_expr ref ); -#keyset[id] -block_expr_is_try( - int id: @block_expr ref -); - #keyset[id] block_expr_is_unsafe( int id: @block_expr ref @@ -2798,6 +2900,12 @@ block_expr_stmt_lists( int stmt_list: @stmt_list ref ); +#keyset[id] +block_expr_try_block_modifiers( + int id: @block_expr ref, + int try_block_modifier: @try_block_modifier ref +); + extern_blocks( unique int id: @extern_block ); @@ -3097,47 +3205,6 @@ trait_where_clauses( int where_clause: @where_clause ref ); -trait_aliases( - unique int id: @trait_alias -); - -#keyset[id, index] -trait_alias_attrs( - int id: @trait_alias ref, - int index: int ref, - int attr: @attr ref -); - -#keyset[id] -trait_alias_generic_param_lists( - int id: @trait_alias ref, - int generic_param_list: @generic_param_list ref -); - -#keyset[id] -trait_alias_names( - int id: @trait_alias ref, - int name: @name ref -); - -#keyset[id] -trait_alias_type_bound_lists( - int id: @trait_alias ref, - int type_bound_list: @type_bound_list ref -); - -#keyset[id] -trait_alias_visibilities( - int id: @trait_alias ref, - int visibility: @visibility ref -); - -#keyset[id] -trait_alias_where_clauses( - int id: @trait_alias ref, - int where_clause: @where_clause ref -); - @type_item = @enum | @struct diff --git a/rust/ql/test/extractor-tests/generated/.generated_tests.list b/rust/ql/test/extractor-tests/generated/.generated_tests.list index 73e2a1b767d3..ae1ef1424dcb 100644 --- a/rust/ql/test/extractor-tests/generated/.generated_tests.list +++ b/rust/ql/test/extractor-tests/generated/.generated_tests.list @@ -78,7 +78,6 @@ MatchArm/gen_match_arm.rs 4f4e717930729b2161b9cf9cd5e2b86b8e919204f5f7d4993d2c4e MatchArmList/gen_match_arm_list.rs 6dcb92591c86771d2aeb762e4274d3e61a7d6c1a42da3dbace1cbc545b474080 6dcb92591c86771d2aeb762e4274d3e61a7d6c1a42da3dbace1cbc545b474080 MatchExpr/gen_match_expr.rs 081c5d4c78cb71ccd13fb37a93d7f525267c51b179f44b5a22ca3297897002a0 081c5d4c78cb71ccd13fb37a93d7f525267c51b179f44b5a22ca3297897002a0 MatchGuard/gen_match_guard.rs f0e84a1f608c0361983c516a40216cea149620a36e0aed7ff39b0b7d77a9ab8a f0e84a1f608c0361983c516a40216cea149620a36e0aed7ff39b0b7d77a9ab8a -Meta/gen_meta.rs 39172a1f7dd02fa3149e7a1fc1dc1f135aa87c84057ee721cd9b373517042b25 39172a1f7dd02fa3149e7a1fc1dc1f135aa87c84057ee721cd9b373517042b25 MethodCallExpr/gen_method_call_expr.rs f696e63c5302f46dcac7bc2914fe899d029996d5064ffe8252cfa173a06f9dd3 f696e63c5302f46dcac7bc2914fe899d029996d5064ffe8252cfa173a06f9dd3 Module/gen_module.rs 815605a604fea1d9276684f8d6738a4e833eacad57ceeb27e2095fc450264fc1 815605a604fea1d9276684f8d6738a4e833eacad57ceeb27e2095fc450264fc1 Name/gen_name.rs 8a7fe65ee632a47d12eaa313e7248ac9210e5a381e9522499ca68f94c39e72c0 8a7fe65ee632a47d12eaa313e7248ac9210e5a381e9522499ca68f94c39e72c0 @@ -125,7 +124,6 @@ StructPatField/gen_struct_pat_field.rs dfdab8cef7dcfee40451744c8d2c7c4ae67fdb8bd StructPatFieldList/gen_struct_pat_field_list.rs 06c0e56c78a6b28909d94d9519ba41ac8a6005741f82b947ef14db51e8cbebd0 06c0e56c78a6b28909d94d9519ba41ac8a6005741f82b947ef14db51e8cbebd0 TokenTree/gen_token_tree.rs 3fdc9a36a1870bb2bedf66c8fe37d368f4ac18488e7118b86e3979d3957a8f94 3fdc9a36a1870bb2bedf66c8fe37d368f4ac18488e7118b86e3979d3957a8f94 Trait/gen_trait.rs bac694993e224f9c6dd86cfb28c54846ae1b3bae45a1e58d3149c884184487ea bac694993e224f9c6dd86cfb28c54846ae1b3bae45a1e58d3149c884184487ea -TraitAlias/gen_trait_alias.rs 425d78a7cb87db7737ceaf713c9a62e0411537374d1bc58c5b1fb80cc25732c9 425d78a7cb87db7737ceaf713c9a62e0411537374d1bc58c5b1fb80cc25732c9 TryExpr/gen_try_expr.rs f60198181a423661f4ed1bf6f98d475f40ada190b7b5fc6af97aa5e45ca29a1e f60198181a423661f4ed1bf6f98d475f40ada190b7b5fc6af97aa5e45ca29a1e TupleExpr/gen_tuple_expr.rs 27e56846b3f08c37c8a345169c2a532b2023d231d46a5bdf586bbc6d8fb36a01 27e56846b3f08c37c8a345169c2a532b2023d231d46a5bdf586bbc6d8fb36a01 TupleField/gen_tuple_field.rs 20507753ddb979a33d0e568ae5ebe466f039e7ab7b8f2e6ce15b28b3e4450615 20507753ddb979a33d0e568ae5ebe466f039e7ab7b8f2e6ce15b28b3e4450615 diff --git a/rust/ql/test/extractor-tests/generated/.gitattributes b/rust/ql/test/extractor-tests/generated/.gitattributes index 660ad73721ab..7ac64a528a53 100644 --- a/rust/ql/test/extractor-tests/generated/.gitattributes +++ b/rust/ql/test/extractor-tests/generated/.gitattributes @@ -80,7 +80,6 @@ /MatchArmList/gen_match_arm_list.rs linguist-generated /MatchExpr/gen_match_expr.rs linguist-generated /MatchGuard/gen_match_guard.rs linguist-generated -/Meta/gen_meta.rs linguist-generated /MethodCallExpr/gen_method_call_expr.rs linguist-generated /Module/gen_module.rs linguist-generated /Name/gen_name.rs linguist-generated @@ -127,7 +126,6 @@ /StructPatFieldList/gen_struct_pat_field_list.rs linguist-generated /TokenTree/gen_token_tree.rs linguist-generated /Trait/gen_trait.rs linguist-generated -/TraitAlias/gen_trait_alias.rs linguist-generated /TryExpr/gen_try_expr.rs linguist-generated /TupleExpr/gen_tuple_expr.rs linguist-generated /TupleField/gen_tuple_field.rs linguist-generated diff --git a/rust/ql/test/extractor-tests/generated/BlockExpr/BlockExpr.ql b/rust/ql/test/extractor-tests/generated/BlockExpr/BlockExpr.ql index 4b69689bb913..b93c97029d36 100644 --- a/rust/ql/test/extractor-tests/generated/BlockExpr/BlockExpr.ql +++ b/rust/ql/test/extractor-tests/generated/BlockExpr/BlockExpr.ql @@ -4,8 +4,8 @@ import TestUtils query predicate instances( BlockExpr x, string isAsync__label, string isAsync, string isConst__label, string isConst, - string isGen__label, string isGen, string isMove__label, string isMove, string isTry__label, - string isTry, string isUnsafe__label, string isUnsafe + string isGen__label, string isGen, string isMove__label, string isMove, string isUnsafe__label, + string isUnsafe ) { toBeTested(x) and not x.isUnknown() and @@ -17,8 +17,6 @@ query predicate instances( (if x.isGen() then isGen = "yes" else isGen = "no") and isMove__label = "isMove:" and (if x.isMove() then isMove = "yes" else isMove = "no") and - isTry__label = "isTry:" and - (if x.isTry() then isTry = "yes" else isTry = "no") and isUnsafe__label = "isUnsafe:" and if x.isUnsafe() then isUnsafe = "yes" else isUnsafe = "no" } @@ -34,3 +32,7 @@ query predicate getAttr(BlockExpr x, int index, Attr getAttr) { query predicate getStmtList(BlockExpr x, StmtList getStmtList) { toBeTested(x) and not x.isUnknown() and getStmtList = x.getStmtList() } + +query predicate getTryBlockModifier(BlockExpr x, TryBlockModifier getTryBlockModifier) { + toBeTested(x) and not x.isUnknown() and getTryBlockModifier = x.getTryBlockModifier() +} diff --git a/rust/ql/test/extractor-tests/generated/CfgAtom/MISSING_SOURCE.txt b/rust/ql/test/extractor-tests/generated/CfgAtom/MISSING_SOURCE.txt new file mode 100644 index 000000000000..7f96b17b1f3c --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/CfgAtom/MISSING_SOURCE.txt @@ -0,0 +1,4 @@ +// generated by codegen, do not edit + +After a source file is added in this directory and codegen is run again, test queries +will appear and this file will be deleted diff --git a/rust/ql/test/extractor-tests/generated/CfgAttrMeta/MISSING_SOURCE.txt b/rust/ql/test/extractor-tests/generated/CfgAttrMeta/MISSING_SOURCE.txt new file mode 100644 index 000000000000..7f96b17b1f3c --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/CfgAttrMeta/MISSING_SOURCE.txt @@ -0,0 +1,4 @@ +// generated by codegen, do not edit + +After a source file is added in this directory and codegen is run again, test queries +will appear and this file will be deleted diff --git a/rust/ql/test/extractor-tests/generated/CfgComposite/MISSING_SOURCE.txt b/rust/ql/test/extractor-tests/generated/CfgComposite/MISSING_SOURCE.txt new file mode 100644 index 000000000000..7f96b17b1f3c --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/CfgComposite/MISSING_SOURCE.txt @@ -0,0 +1,4 @@ +// generated by codegen, do not edit + +After a source file is added in this directory and codegen is run again, test queries +will appear and this file will be deleted diff --git a/rust/ql/test/extractor-tests/generated/CfgMeta/MISSING_SOURCE.txt b/rust/ql/test/extractor-tests/generated/CfgMeta/MISSING_SOURCE.txt new file mode 100644 index 000000000000..7f96b17b1f3c --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/CfgMeta/MISSING_SOURCE.txt @@ -0,0 +1,4 @@ +// generated by codegen, do not edit + +After a source file is added in this directory and codegen is run again, test queries +will appear and this file will be deleted diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsArgName/MISSING_SOURCE.txt b/rust/ql/test/extractor-tests/generated/FormatArgsArgName/MISSING_SOURCE.txt new file mode 100644 index 000000000000..7f96b17b1f3c --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/FormatArgsArgName/MISSING_SOURCE.txt @@ -0,0 +1,4 @@ +// generated by codegen, do not edit + +After a source file is added in this directory and codegen is run again, test queries +will appear and this file will be deleted diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg.ql b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg.ql index d3931f985113..d445d40234d6 100644 --- a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg.ql +++ b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg.ql @@ -4,10 +4,10 @@ import TestUtils query predicate instances(FormatArgsArg x) { toBeTested(x) and not x.isUnknown() } -query predicate getExpr(FormatArgsArg x, Expr getExpr) { - toBeTested(x) and not x.isUnknown() and getExpr = x.getExpr() +query predicate getArgName(FormatArgsArg x, FormatArgsArgName getArgName) { + toBeTested(x) and not x.isUnknown() and getArgName = x.getArgName() } -query predicate getName(FormatArgsArg x, Name getName) { - toBeTested(x) and not x.isUnknown() and getName = x.getName() +query predicate getExpr(FormatArgsArg x, Expr getExpr) { + toBeTested(x) and not x.isUnknown() and getExpr = x.getExpr() } diff --git a/rust/ql/test/extractor-tests/generated/KeyValueMeta/MISSING_SOURCE.txt b/rust/ql/test/extractor-tests/generated/KeyValueMeta/MISSING_SOURCE.txt new file mode 100644 index 000000000000..7f96b17b1f3c --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/KeyValueMeta/MISSING_SOURCE.txt @@ -0,0 +1,4 @@ +// generated by codegen, do not edit + +After a source file is added in this directory and codegen is run again, test queries +will appear and this file will be deleted diff --git a/rust/ql/test/extractor-tests/generated/Meta/Meta.ql b/rust/ql/test/extractor-tests/generated/Meta/Meta.ql deleted file mode 100644 index dd054ea7e993..000000000000 --- a/rust/ql/test/extractor-tests/generated/Meta/Meta.ql +++ /dev/null @@ -1,22 +0,0 @@ -// generated by codegen, do not edit -import codeql.rust.elements -import TestUtils - -query predicate instances(Meta x, string isUnsafe__label, string isUnsafe) { - toBeTested(x) and - not x.isUnknown() and - isUnsafe__label = "isUnsafe:" and - if x.isUnsafe() then isUnsafe = "yes" else isUnsafe = "no" -} - -query predicate getExpr(Meta x, Expr getExpr) { - toBeTested(x) and not x.isUnknown() and getExpr = x.getExpr() -} - -query predicate getPath(Meta x, Path getPath) { - toBeTested(x) and not x.isUnknown() and getPath = x.getPath() -} - -query predicate getTokenTree(Meta x, TokenTree getTokenTree) { - toBeTested(x) and not x.isUnknown() and getTokenTree = x.getTokenTree() -} diff --git a/rust/ql/test/extractor-tests/generated/Meta/gen_meta.rs b/rust/ql/test/extractor-tests/generated/Meta/gen_meta.rs deleted file mode 100644 index 104540323f95..000000000000 --- a/rust/ql/test/extractor-tests/generated/Meta/gen_meta.rs +++ /dev/null @@ -1,14 +0,0 @@ -// generated by codegen, do not edit - -fn test_meta() -> () { - // A meta item in an attribute. - // - // For example: - #[unsafe(lint::name = "reason_for_bypass")] - //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - #[deprecated(since = "1.2.0", note = "Use bar instead", unsafe=true)] - //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - fn foo() { - // ... - } -} diff --git a/rust/ql/test/extractor-tests/generated/PathMeta/MISSING_SOURCE.txt b/rust/ql/test/extractor-tests/generated/PathMeta/MISSING_SOURCE.txt new file mode 100644 index 000000000000..7f96b17b1f3c --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/PathMeta/MISSING_SOURCE.txt @@ -0,0 +1,4 @@ +// generated by codegen, do not edit + +After a source file is added in this directory and codegen is run again, test queries +will appear and this file will be deleted diff --git a/rust/ql/test/extractor-tests/generated/StructField/StructField.ql b/rust/ql/test/extractor-tests/generated/StructField/StructField.ql index 773f282e36b3..6db753a5808b 100644 --- a/rust/ql/test/extractor-tests/generated/StructField/StructField.ql +++ b/rust/ql/test/extractor-tests/generated/StructField/StructField.ql @@ -13,8 +13,8 @@ query predicate getAttr(StructField x, int index, Attr getAttr) { toBeTested(x) and not x.isUnknown() and getAttr = x.getAttr(index) } -query predicate getDefault(StructField x, Expr getDefault) { - toBeTested(x) and not x.isUnknown() and getDefault = x.getDefault() +query predicate getDefaultVal(StructField x, ConstArg getDefaultVal) { + toBeTested(x) and not x.isUnknown() and getDefaultVal = x.getDefaultVal() } query predicate getName(StructField x, Name getName) { diff --git a/rust/ql/test/extractor-tests/generated/TokenTreeMeta/MISSING_SOURCE.txt b/rust/ql/test/extractor-tests/generated/TokenTreeMeta/MISSING_SOURCE.txt new file mode 100644 index 000000000000..7f96b17b1f3c --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/TokenTreeMeta/MISSING_SOURCE.txt @@ -0,0 +1,4 @@ +// generated by codegen, do not edit + +After a source file is added in this directory and codegen is run again, test queries +will appear and this file will be deleted diff --git a/rust/ql/test/extractor-tests/generated/TraitAlias/TraitAlias.ql b/rust/ql/test/extractor-tests/generated/TraitAlias/TraitAlias.ql deleted file mode 100644 index c0fee75678af..000000000000 --- a/rust/ql/test/extractor-tests/generated/TraitAlias/TraitAlias.ql +++ /dev/null @@ -1,35 +0,0 @@ -// generated by codegen, do not edit -import codeql.rust.elements -import TestUtils - -query predicate instances(TraitAlias x) { toBeTested(x) and not x.isUnknown() } - -query predicate getAttributeMacroExpansion(TraitAlias x, MacroItems getAttributeMacroExpansion) { - toBeTested(x) and - not x.isUnknown() and - getAttributeMacroExpansion = x.getAttributeMacroExpansion() -} - -query predicate getAttr(TraitAlias x, int index, Attr getAttr) { - toBeTested(x) and not x.isUnknown() and getAttr = x.getAttr(index) -} - -query predicate getGenericParamList(TraitAlias x, GenericParamList getGenericParamList) { - toBeTested(x) and not x.isUnknown() and getGenericParamList = x.getGenericParamList() -} - -query predicate getName(TraitAlias x, Name getName) { - toBeTested(x) and not x.isUnknown() and getName = x.getName() -} - -query predicate getTypeBoundList(TraitAlias x, TypeBoundList getTypeBoundList) { - toBeTested(x) and not x.isUnknown() and getTypeBoundList = x.getTypeBoundList() -} - -query predicate getVisibility(TraitAlias x, Visibility getVisibility) { - toBeTested(x) and not x.isUnknown() and getVisibility = x.getVisibility() -} - -query predicate getWhereClause(TraitAlias x, WhereClause getWhereClause) { - toBeTested(x) and not x.isUnknown() and getWhereClause = x.getWhereClause() -} diff --git a/rust/ql/test/extractor-tests/generated/TraitAlias/gen_trait_alias.rs b/rust/ql/test/extractor-tests/generated/TraitAlias/gen_trait_alias.rs deleted file mode 100644 index 6fa75a8a08d4..000000000000 --- a/rust/ql/test/extractor-tests/generated/TraitAlias/gen_trait_alias.rs +++ /dev/null @@ -1,8 +0,0 @@ -// generated by codegen, do not edit - -fn test_trait_alias() -> () { - // A trait alias. - // - // For example: - trait Foo = Bar + Baz; -} diff --git a/rust/ql/test/extractor-tests/generated/TryBlockModifier/MISSING_SOURCE.txt b/rust/ql/test/extractor-tests/generated/TryBlockModifier/MISSING_SOURCE.txt new file mode 100644 index 000000000000..7f96b17b1f3c --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/TryBlockModifier/MISSING_SOURCE.txt @@ -0,0 +1,4 @@ +// generated by codegen, do not edit + +After a source file is added in this directory and codegen is run again, test queries +will appear and this file will be deleted diff --git a/rust/ql/test/extractor-tests/generated/UnsafeMeta/MISSING_SOURCE.txt b/rust/ql/test/extractor-tests/generated/UnsafeMeta/MISSING_SOURCE.txt new file mode 100644 index 000000000000..7f96b17b1f3c --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/UnsafeMeta/MISSING_SOURCE.txt @@ -0,0 +1,4 @@ +// generated by codegen, do not edit + +After a source file is added in this directory and codegen is run again, test queries +will appear and this file will be deleted diff --git a/rust/ql/test/extractor-tests/generated/Variant/Variant.ql b/rust/ql/test/extractor-tests/generated/Variant/Variant.ql index 61c142671163..b5e63ff3ceff 100644 --- a/rust/ql/test/extractor-tests/generated/Variant/Variant.ql +++ b/rust/ql/test/extractor-tests/generated/Variant/Variant.ql @@ -8,8 +8,8 @@ query predicate getAttr(Variant x, int index, Attr getAttr) { toBeTested(x) and not x.isUnknown() and getAttr = x.getAttr(index) } -query predicate getDiscriminant(Variant x, Expr getDiscriminant) { - toBeTested(x) and not x.isUnknown() and getDiscriminant = x.getDiscriminant() +query predicate getConstArg(Variant x, ConstArg getConstArg) { + toBeTested(x) and not x.isUnknown() and getConstArg = x.getConstArg() } query predicate getFieldList(Variant x, FieldList getFieldList) { diff --git a/rust/schema/annotations.py b/rust/schema/annotations.py index 6fb45ae05b9a..9443b38b93d3 100644 --- a/rust/schema/annotations.py +++ b/rust/schema/annotations.py @@ -1936,18 +1936,6 @@ class _: """ -@annotate(TraitAlias) -class _: - """ - A trait alias. - - For example: - ```rust - trait Foo = Bar + Baz; - ``` - """ - - @annotate(TryExpr, cfg=True) class _: """ diff --git a/rust/schema/ast.py b/rust/schema/ast.py index 5d8a7393ea6f..bfa9cdad55b1 100644 --- a/rust/schema/ast.py +++ b/rust/schema/ast.py @@ -14,6 +14,9 @@ class AsmPiece(AstNode, ): class AssocItem(AstNode, ): pass +class CfgPredicate(AstNode, ): + pass + class Expr(AstNode, ): pass @@ -29,6 +32,9 @@ class GenericArg(AstNode, ): class GenericParam(AstNode, ): pass +class Meta(AstNode, ): + pass + class Pat(AstNode, ): pass @@ -139,10 +145,10 @@ class BlockExpr(Expr, ): is_const: predicate is_gen: predicate is_move: predicate - is_try: predicate is_unsafe: predicate label: optional["Label"] | child stmt_list: optional["StmtList"] | child + try_block_modifier: optional["TryBlockModifier"] | child class BoxPat(Pat, ): pat: optional["Pat"] | child @@ -162,6 +168,19 @@ class CastExpr(Expr, ): expr: optional["Expr"] | child type_repr: optional["TypeRepr"] | child +class CfgAtom(CfgPredicate, ): + pass + +class CfgAttrMeta(Meta, ): + cfg_predicate: optional["CfgPredicate"] | child + metas: list["Meta"] | child + +class CfgComposite(CfgPredicate, ): + cfg_predicates: list["CfgPredicate"] | child + +class CfgMeta(Meta, ): + cfg_predicate: optional["CfgPredicate"] | child + class ClosureExpr(Expr, ): attrs: list["Attr"] | child closure_body: optional["Expr"] | child @@ -277,8 +296,11 @@ class ForTypeRepr(TypeRepr, ): type_repr: optional["TypeRepr"] | child class FormatArgsArg(AstNode, ): + arg_name: optional["FormatArgsArgName"] | child expr: optional["Expr"] | child - name: optional["Name"] | child + +class FormatArgsArgName(AstNode, ): + pass class FormatArgsExpr(Expr, ): args: list["FormatArgsArg"] | child @@ -331,6 +353,10 @@ class ItemList(AstNode, ): attrs: list["Attr"] | child items: list["Item"] | child +class KeyValueMeta(Meta, ): + expr: optional["Expr"] | child + path: optional["Path"] | child + class Label(AstNode, ): lifetime: optional["Lifetime"] | child @@ -420,12 +446,6 @@ class MatchExpr(Expr, ): class MatchGuard(AstNode, ): condition: optional["Expr"] | child -class Meta(AstNode, ): - expr: optional["Expr"] | child - is_unsafe: predicate - path: optional["Path"] | child - token_tree: optional["TokenTree"] | child - class MethodCallExpr(Expr, ): arg_list: optional["ArgList"] | child attrs: list["Attr"] | child @@ -486,6 +506,9 @@ class PathExpr(Expr, ): attrs: list["Attr"] | child path: optional["Path"] | child +class PathMeta(Meta, ): + path: optional["Path"] | child + class PathPat(Pat, ): path: optional["Path"] | child @@ -536,7 +559,7 @@ class StructExprFieldList(AstNode, ): class StructField(AstNode, ): attrs: list["Attr"] | child - default: optional["Expr"] | child + default_val: optional["ConstArg"] | child is_unsafe: predicate name: optional["Name"] | child type_repr: optional["TypeRepr"] | child @@ -634,6 +657,10 @@ class Struct(TypeItem, Item, ): class TokenTree(AstNode, ): pass +class TokenTreeMeta(Meta, ): + path: optional["Path"] | child + token_tree: optional["TokenTree"] | child + class Trait(Item, ): assoc_item_list: optional["AssocItemList"] | child attrs: list["Attr"] | child @@ -645,13 +672,9 @@ class Trait(Item, ): visibility: optional["Visibility"] | child where_clause: optional["WhereClause"] | child -class TraitAlias(Item, ): - attrs: list["Attr"] | child - generic_param_list: optional["GenericParamList"] | child - name: optional["Name"] | child - type_bound_list: optional["TypeBoundList"] | child - visibility: optional["Visibility"] | child - where_clause: optional["WhereClause"] | child +class TryBlockModifier(AstNode, ): + is_try: predicate + type_repr: optional["TypeRepr"] | child class TryExpr(Expr, ): attrs: list["Attr"] | child @@ -720,6 +743,10 @@ class Union(TypeItem, Item, ): visibility: optional["Visibility"] | child where_clause: optional["WhereClause"] | child +class UnsafeMeta(Meta, ): + is_unsafe: predicate + meta: optional["Meta"] | child + class Use(Item, ): attrs: list["Attr"] | child use_tree: optional["UseTree"] | child @@ -739,7 +766,7 @@ class UseTreeList(AstNode, ): class Variant(AstNode, ): attrs: list["Attr"] | child - discriminant: optional["Expr"] | child + const_arg: optional["ConstArg"] | child field_list: optional["FieldList"] | child name: optional["Name"] | child visibility: optional["Visibility"] | child From ce360c4f17d5345c5a210f6f55b60e98bd38d3f2 Mon Sep 17 00:00:00 2001 From: Taus Date: Wed, 15 Apr 2026 13:26:54 +0000 Subject: [PATCH 0008/2098] Rust: adapt extractor to rust-analyzer 0.0.328 API changes --- rust/extractor/src/config.rs | 8 +++++--- rust/extractor/src/crate_graph.rs | 4 ++-- rust/extractor/src/rust_analyzer.rs | 9 ++++----- rust/extractor/src/translate/base.rs | 30 +++++++++++++++++++++++----- 4 files changed, 36 insertions(+), 15 deletions(-) diff --git a/rust/extractor/src/config.rs b/rust/extractor/src/config.rs index 86d3ab6272c8..f887f85906d5 100644 --- a/rust/extractor/src/config.rs +++ b/rust/extractor/src/config.rs @@ -14,7 +14,7 @@ use ra_ap_ide_db::FxHashMap; use ra_ap_intern::Symbol; use ra_ap_load_cargo::{LoadCargoConfig, ProcMacroServerChoice}; use ra_ap_paths::{AbsPath, AbsPathBuf, Utf8PathBuf}; -use ra_ap_project_model::{CargoConfig, CargoFeatures, CfgOverrides, RustLibSource, Sysroot}; +use ra_ap_project_model::{CargoConfig, CargoFeatures, CfgOverrides, RustLibSource, Sysroot, TargetDirectoryConfig}; use rust_extractor_macros::extractor_cli_config; use serde::{Deserialize, Serialize}; use std::collections::HashSet; @@ -171,12 +171,12 @@ impl Config { .iter() .map(|p| join_path_buf(dir, p)) .collect(), - target_dir: Utf8PathBuf::from_path_buf( + target_dir_config: Utf8PathBuf::from_path_buf( self.cargo_target_dir .clone() .unwrap_or_else(|| self.scratch_dir.join("target")), ) - .ok(), + .map_or(TargetDirectoryConfig::None, TargetDirectoryConfig::Directory), features: self.cargo_features(), target: self.cargo_target.clone(), cfg_overrides: to_cfg_overrides(&self.cargo_cfg_overrides), @@ -192,6 +192,8 @@ impl Config { load_out_dirs_from_check: true, with_proc_macro_server: self.proc_macro_server_choice(dir), prefill_caches: false, + num_worker_threads: 0, + proc_macro_processes: 0, }, ) } diff --git a/rust/extractor/src/crate_graph.rs b/rust/extractor/src/crate_graph.rs index 87f8e4e17b41..7a1505347d68 100644 --- a/rust/extractor/src/crate_graph.rs +++ b/rust/extractor/src/crate_graph.rs @@ -1,7 +1,7 @@ use crate::{generated, trap}; use itertools::Itertools; -use ra_ap_base_db::{Crate, RootQueryDb}; +use ra_ap_base_db::Crate; use ra_ap_cfg::CfgAtom; use ra_ap_ide_db::RootDatabase; use ra_ap_vfs::{Vfs, VfsPath}; @@ -12,7 +12,7 @@ use std::{cmp::Ordering, collections::HashMap, path::PathBuf}; use tracing::error; pub fn extract_crate_graph(trap_provider: &trap::TrapFileProvider, db: &RootDatabase, vfs: &Vfs) { - let crate_graph = db.all_crates(); + let crate_graph = ra_ap_base_db::all_crates(db); // According to the documentation of `CrateGraph`: // Each crate is defined by the `FileId` of its root module, the set of enabled diff --git a/rust/extractor/src/rust_analyzer.rs b/rust/extractor/src/rust_analyzer.rs index 9d3769a24040..9811bd39ce5b 100644 --- a/rust/extractor/src/rust_analyzer.rs +++ b/rust/extractor/src/rust_analyzer.rs @@ -1,6 +1,6 @@ use crate::trap; use itertools::Itertools; -use ra_ap_base_db::{EditionedFileId, FileText, RootQueryDb, SourceDatabase}; +use ra_ap_base_db::{EditionedFileId, FileText, SourceDatabase}; use ra_ap_hir::Semantics; use ra_ap_ide_db::RootDatabase; use ra_ap_load_cargo::{LoadCargoConfig, load_workspace_at}; @@ -115,7 +115,7 @@ impl<'a> RustAnalyzer<'a> { "no text available for the file in the project", )), )?; - let editioned_file_id = semantics.attach_first_edition(file_id).ok_or( + let editioned_file_id = semantics.attach_first_edition_opt(file_id).ok_or( RustAnalyzerNoSemantics::warning("failed to determine rust edition"), )?; Ok((semantics, editioned_file_id, input)) @@ -127,9 +127,8 @@ impl<'a> RustAnalyzer<'a> { match self.get_file_data(path) { Ok((semantics, file_id, input)) => { let source_file = semantics.parse(file_id); - let errors = semantics - .db - .parse_errors(file_id) + let errors = file_id + .parse_errors(semantics.db) .into_iter() .flat_map(|x| x.to_vec()) .collect(); diff --git a/rust/extractor/src/translate/base.rs b/rust/extractor/src/translate/base.rs index 94d8545bb15f..890aee7c12fb 100644 --- a/rust/extractor/src/translate/base.rs +++ b/rust/extractor/src/translate/base.rs @@ -465,9 +465,27 @@ impl<'a> Translator<'a> { pub(crate) fn should_be_excluded(&self, item: &impl ast::HasAttrs) -> bool { self.semantics.is_some_and(|sema| { item.attrs().any(|attr| { - attr.as_simple_call().is_some_and(|(name, tokens)| { - name == "cfg" && sema.check_cfg_attr(&tokens) == Some(false) - }) + let meta = match attr.meta() { + Some(meta) => meta, + None => return false, + }; + let cfg_meta = match ast::CfgMeta::cast(meta.syntax().clone()) { + Some(cfg_meta) => cfg_meta, + None => return false, + }; + let cfg_predicate = match cfg_meta.cfg_predicate() { + Some(pred) => pred, + None => return false, + }; + let cfg_expr = ra_ap_cfg::CfgExpr::parse_from_ast(cfg_predicate); + let file_id = sema.hir_file_for(item.syntax()); + let krate = match file_id.file_id().and_then(|fid| { + sema.file_to_module_defs(fid.file_id(sema.db)).next() + }) { + Some(module) => module.krate(sema.db), + None => return false, + }; + krate.cfg(sema.db).check(&cfg_expr) == Some(false) }) }) } @@ -551,9 +569,9 @@ impl<'a> Translator<'a> { is_const: false, is_gen: false, is_move: false, - is_try: false, is_unsafe: false, stmt_list: Some(stmt_list), + try_block_modifier: None, }); self.emit_location(label, node); self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); @@ -695,7 +713,9 @@ impl<'a> Translator<'a> { let node: ast::Adt = node.clone().into(); let expansions = node .attrs() - .filter_map(|attr| semantics.expand_derive_macro(&attr)) + .filter_map(|attr| attr.meta()) + .filter_map(|meta| semantics.expand_derive_macro(&meta)) + .flatten() .flatten() .filter_map(|expanded| self.process_item_macro_expansion(&node, expanded)) .collect::>(); From 35fc6fbd22e4453b49da746cde2d5ad252b24c7b Mon Sep 17 00:00:00 2001 From: Taus Date: Wed, 15 Apr 2026 13:29:44 +0000 Subject: [PATCH 0009/2098] Rust: update toolchain to 1.91 and apply lint fixes Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- rust-toolchain.toml | 2 +- rust/ast-generator/src/main.rs | 5 ++--- rust/extractor/src/config.rs | 9 +++++++-- rust/extractor/src/main.rs | 10 ++++------ rust/extractor/src/translate/base.rs | 17 ++++++++--------- 5 files changed, 22 insertions(+), 21 deletions(-) diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 242a1af3ed51..60d093c30021 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -5,6 +5,6 @@ # reflected by `MODULE.bazel` in this repository). [toolchain] -channel = "1.88" +channel = "1.91" profile = "minimal" components = [ "clippy", "rustfmt" ] diff --git a/rust/ast-generator/src/main.rs b/rust/ast-generator/src/main.rs index fe6865a172fb..74fe9db9a7ed 100644 --- a/rust/ast-generator/src/main.rs +++ b/rust/ast-generator/src/main.rs @@ -308,14 +308,13 @@ fn write_schema( fn get_fields(node: &AstNodeSrc) -> Vec { let mut result = Vec::new(); for field in &node.fields { - if let Field::Token { token, .. } = field { - if should_predicate_be_extracted(token) { + if let Field::Token { token, .. } = field + && should_predicate_be_extracted(token) { result.push(FieldInfo { name: format!("is_{token}"), ty: FieldType::Predicate, }); } - } } result.extend(get_additional_fields(&node.name)); diff --git a/rust/extractor/src/config.rs b/rust/extractor/src/config.rs index f887f85906d5..0e682bbb06ef 100644 --- a/rust/extractor/src/config.rs +++ b/rust/extractor/src/config.rs @@ -14,7 +14,9 @@ use ra_ap_ide_db::FxHashMap; use ra_ap_intern::Symbol; use ra_ap_load_cargo::{LoadCargoConfig, ProcMacroServerChoice}; use ra_ap_paths::{AbsPath, AbsPathBuf, Utf8PathBuf}; -use ra_ap_project_model::{CargoConfig, CargoFeatures, CfgOverrides, RustLibSource, Sysroot, TargetDirectoryConfig}; +use ra_ap_project_model::{ + CargoConfig, CargoFeatures, CfgOverrides, RustLibSource, Sysroot, TargetDirectoryConfig, +}; use rust_extractor_macros::extractor_cli_config; use serde::{Deserialize, Serialize}; use std::collections::HashSet; @@ -176,7 +178,10 @@ impl Config { .clone() .unwrap_or_else(|| self.scratch_dir.join("target")), ) - .map_or(TargetDirectoryConfig::None, TargetDirectoryConfig::Directory), + .map_or( + TargetDirectoryConfig::None, + TargetDirectoryConfig::Directory, + ), features: self.cargo_features(), target: self.cargo_target.clone(), cfg_overrides: to_cfg_overrides(&self.cargo_cfg_overrides), diff --git a/rust/extractor/src/main.rs b/rust/extractor/src/main.rs index e90badc63cd0..a838ebbafed1 100644 --- a/rust/extractor/src/main.rs +++ b/rust/extractor/src/main.rs @@ -80,8 +80,8 @@ impl<'a> Extractor<'a> { translator.emit_parse_error(&ast, &err); } let no_location = (LineCol { line: 0, col: 0 }, LineCol { line: 0, col: 0 }); - if let Err(RustAnalyzerNoSemantics { severity, reason }) = semantics_info { - if !reason.is_empty() { + if let Err(RustAnalyzerNoSemantics { severity, reason }) = semantics_info + && !reason.is_empty() { let message = format!("semantic analyzer unavailable ({reason})"); let full_message = format!("{message}: macro expansion will be skipped."); translator.emit_diagnostic( @@ -92,7 +92,6 @@ impl<'a> Extractor<'a> { no_location, ); } - } translator.emit_source_file(&ast); translator.emit_truncated_diagnostics_message(); translator.trap.commit().unwrap_or_else(|err| { @@ -300,8 +299,8 @@ fn main() -> anyhow::Result<()> { }; } for (file_id, file) in vfs.iter() { - if let Some(file) = file.as_path().map(<_ as AsRef>::as_ref) { - if file.extension().is_some_and(|ext| ext == "rs") + if let Some(file) = file.as_path().map(<_ as AsRef>::as_ref) + && file.extension().is_some_and(|ext| ext == "rs") && processed_files.insert(file.to_owned()) && db .source_root(db.file_source_root(file_id).source_root_id(db)) @@ -311,7 +310,6 @@ fn main() -> anyhow::Result<()> { extractor.extract_with_semantics(file, &semantics, vfs, library_mode); extractor.archiver.archive(file); } - } } } else { for file in files { diff --git a/rust/extractor/src/translate/base.rs b/rust/extractor/src/translate/base.rs index 890aee7c12fb..fa0cf0e40c71 100644 --- a/rust/extractor/src/translate/base.rs +++ b/rust/extractor/src/translate/base.rs @@ -215,14 +215,13 @@ impl<'a> Translator<'a> { ) { let parent_range = parent.syntax().text_range(); let token_range = token.text_range(); - if let Some(clipped_range) = token_range.intersect(parent_range) { - if let Some(parent_range2) = self.text_range_for_node(parent) { + if let Some(clipped_range) = token_range.intersect(parent_range) + && let Some(parent_range2) = self.text_range_for_node(parent) { let token_range = clipped_range + parent_range2.start() - parent_range.start(); if let Some((start, end)) = self.location(token_range) { self.trap.emit_location(self.label, label, start, end) } } - } } pub fn emit_diagnostic( &mut self, @@ -332,8 +331,8 @@ impl<'a> Translator<'a> { children: SyntaxElementChildren, ) { for child in children { - if let NodeOrToken::Token(token) = child { - if token.kind() == SyntaxKind::COMMENT { + if let NodeOrToken::Token(token) = child + && token.kind() == SyntaxKind::COMMENT { let label = self.trap.emit(generated::Comment { id: TrapId::Star, parent: parent_label, @@ -341,7 +340,6 @@ impl<'a> Translator<'a> { }); self.emit_location_token(label.into(), parent_node, &token); } - } } } fn emit_macro_expansion_parse_errors( @@ -479,9 +477,10 @@ impl<'a> Translator<'a> { }; let cfg_expr = ra_ap_cfg::CfgExpr::parse_from_ast(cfg_predicate); let file_id = sema.hir_file_for(item.syntax()); - let krate = match file_id.file_id().and_then(|fid| { - sema.file_to_module_defs(fid.file_id(sema.db)).next() - }) { + let krate = match file_id + .file_id() + .and_then(|fid| sema.file_to_module_defs(fid.file_id(sema.db)).next()) + { Some(module) => module.krate(sema.db), None => return false, }; From 68ab2fb7383106f41edbe0362f657e9460a84c7d Mon Sep 17 00:00:00 2001 From: Taus Date: Wed, 15 Apr 2026 14:20:38 +0000 Subject: [PATCH 0010/2098] Rust: fix QL references for schema changes and add upgrade/downgrade scripts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix Meta usage: Meta is now abstract with subtypes (PathMeta, KeyValueMeta, TokenTreeMeta, etc.) - Fix FormatArgsArg: getName() replaced by getArgName() returning FormatArgsArgName - Add upgrade script (old → new) and downgrade script (new → old) - Update Definitions.qll, PathResolution.qll, BadCtorInitialization.ql, FormatTemplateVariableAccessConstructor.qll Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../old.dbscheme | 3623 +++++++++++++++++ .../rust.dbscheme | 3556 ++++++++++++++++ .../upgrade.properties | 29 + ...ormatTemplateVariableAccessConstructor.qll | 6 +- .../rust/elements/internal/MetaImpl.qll | 1 - .../lib/codeql/rust/internal/Definitions.qll | 18 +- .../codeql/rust/internal/PathResolution.qll | 24 +- .../old.dbscheme | 3556 ++++++++++++++++ .../rust.dbscheme | 3623 +++++++++++++++++ .../upgrade.properties | 19 + .../security/CWE-696/BadCtorInitialization.ql | 13 +- 11 files changed, 14449 insertions(+), 19 deletions(-) create mode 100644 rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/old.dbscheme create mode 100644 rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/rust.dbscheme create mode 100644 rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.properties create mode 100644 rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/old.dbscheme create mode 100644 rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/rust.dbscheme create mode 100644 rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/upgrade.properties diff --git a/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/old.dbscheme b/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/old.dbscheme new file mode 100644 index 000000000000..109496fd2f20 --- /dev/null +++ b/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/old.dbscheme @@ -0,0 +1,3623 @@ +// generated by codegen, do not edit + +// from ../shared/tree-sitter-extractor/src/generator/prefix.dbscheme +/*- Files and folders -*/ + +/** + * The location of an element. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @file | @folder + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +/*- Empty location -*/ + +empty_location( + int location: @location_default ref +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/*- Diagnostic messages -*/ + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/*- Diagnostic messages: severity -*/ + +case @diagnostic.severity of + 10 = @diagnostic_debug +| 20 = @diagnostic_info +| 30 = @diagnostic_warning +| 40 = @diagnostic_error +; + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error; + +/*- Database metadata -*/ + +/** + * The CLI will automatically emit applicable tuples for this table, + * such as `databaseMetadata("isOverlay", "true")` when building an + * overlay database. + */ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +/*- Overlay support -*/ + +/** + * The CLI will automatically emit tuples for each new/modified/deleted file + * when building an overlay database. + */ +overlayChangedFiles( + string path: string ref +); + + +// from prefix.dbscheme +#keyset[id] +locatable_locations( + int id: @locatable ref, + int location: @location_default ref +); + + +// from schema + +@element = + @extractor_step +| @locatable +| @named_crate +| @unextracted +; + +extractor_steps( + unique int id: @extractor_step, + string action: string ref, + int duration_ms: int ref +); + +#keyset[id] +extractor_step_files( + int id: @extractor_step ref, + int file: @file ref +); + +@locatable = + @ast_node +| @crate +; + +named_crates( + unique int id: @named_crate, + string name: string ref, + int crate: @crate ref +); + +@unextracted = + @missing +| @unimplemented +; + +@ast_node = + @abi +| @addressable +| @arg_list +| @asm_dir_spec +| @asm_operand +| @asm_operand_expr +| @asm_option +| @asm_piece +| @asm_reg_spec +| @assoc_item_list +| @attr +| @callable +| @cfg_predicate +| @expr +| @extern_item_list +| @field_list +| @for_binder +| @format_args_arg +| @format_args_arg_name +| @generic_arg +| @generic_arg_list +| @generic_param +| @generic_param_list +| @item_list +| @label +| @let_else +| @macro_items +| @match_arm +| @match_arm_list +| @match_guard +| @meta +| @name +| @param_base +| @param_list +| @parenthesized_arg_list +| @pat +| @path +| @path_ast_node +| @path_segment +| @rename +| @ret_type_repr +| @return_type_syntax +| @source_file +| @stmt +| @stmt_list +| @struct_expr_field +| @struct_expr_field_list +| @struct_field +| @struct_pat_field +| @struct_pat_field_list +| @token +| @token_tree +| @try_block_modifier +| @tuple_field +| @type_bound +| @type_bound_list +| @type_repr +| @use_bound_generic_arg +| @use_bound_generic_args +| @use_tree +| @use_tree_list +| @variant_list +| @visibility +| @where_clause +| @where_pred +; + +crates( + unique int id: @crate +); + +#keyset[id] +crate_names( + int id: @crate ref, + string name: string ref +); + +#keyset[id] +crate_versions( + int id: @crate ref, + string version: string ref +); + +#keyset[id, index] +crate_cfg_options( + int id: @crate ref, + int index: int ref, + string cfg_option: string ref +); + +#keyset[id, index] +crate_named_dependencies( + int id: @crate ref, + int index: int ref, + int named_dependency: @named_crate ref +); + +missings( + unique int id: @missing +); + +unimplementeds( + unique int id: @unimplemented +); + +abis( + unique int id: @abi +); + +#keyset[id] +abi_abi_strings( + int id: @abi ref, + string abi_string: string ref +); + +@addressable = + @item +| @variant +; + +arg_lists( + unique int id: @arg_list +); + +#keyset[id, index] +arg_list_args( + int id: @arg_list ref, + int index: int ref, + int arg: @expr ref +); + +asm_dir_specs( + unique int id: @asm_dir_spec +); + +@asm_operand = + @asm_const +| @asm_label +| @asm_reg_operand +| @asm_sym +; + +asm_operand_exprs( + unique int id: @asm_operand_expr +); + +#keyset[id] +asm_operand_expr_in_exprs( + int id: @asm_operand_expr ref, + int in_expr: @expr ref +); + +#keyset[id] +asm_operand_expr_out_exprs( + int id: @asm_operand_expr ref, + int out_expr: @expr ref +); + +asm_options( + unique int id: @asm_option +); + +#keyset[id] +asm_option_is_raw( + int id: @asm_option ref +); + +@asm_piece = + @asm_clobber_abi +| @asm_operand_named +| @asm_options_list +; + +asm_reg_specs( + unique int id: @asm_reg_spec +); + +#keyset[id] +asm_reg_spec_identifiers( + int id: @asm_reg_spec ref, + int identifier: @name_ref ref +); + +assoc_item_lists( + unique int id: @assoc_item_list +); + +#keyset[id, index] +assoc_item_list_assoc_items( + int id: @assoc_item_list ref, + int index: int ref, + int assoc_item: @assoc_item ref +); + +#keyset[id, index] +assoc_item_list_attrs( + int id: @assoc_item_list ref, + int index: int ref, + int attr: @attr ref +); + +attrs( + unique int id: @attr +); + +#keyset[id] +attr_meta( + int id: @attr ref, + int meta: @meta ref +); + +@callable = + @closure_expr +| @function +; + +#keyset[id] +callable_param_lists( + int id: @callable ref, + int param_list: @param_list ref +); + +#keyset[id, index] +callable_attrs( + int id: @callable ref, + int index: int ref, + int attr: @attr ref +); + +@cfg_predicate = + @cfg_atom +| @cfg_composite +; + +@expr = + @array_expr_internal +| @asm_expr +| @await_expr +| @become_expr +| @binary_expr +| @break_expr +| @call_expr +| @cast_expr +| @closure_expr +| @continue_expr +| @field_expr +| @format_args_expr +| @if_expr +| @index_expr +| @labelable_expr +| @let_expr +| @literal_expr +| @macro_expr +| @match_expr +| @method_call_expr +| @offset_of_expr +| @paren_expr +| @path_expr_base +| @prefix_expr +| @range_expr +| @ref_expr +| @return_expr +| @struct_expr +| @try_expr +| @tuple_expr +| @underscore_expr +| @yeet_expr +| @yield_expr +; + +extern_item_lists( + unique int id: @extern_item_list +); + +#keyset[id, index] +extern_item_list_attrs( + int id: @extern_item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +extern_item_list_extern_items( + int id: @extern_item_list ref, + int index: int ref, + int extern_item: @extern_item ref +); + +@field_list = + @struct_field_list +| @tuple_field_list +; + +for_binders( + unique int id: @for_binder +); + +#keyset[id] +for_binder_generic_param_lists( + int id: @for_binder ref, + int generic_param_list: @generic_param_list ref +); + +format_args_args( + unique int id: @format_args_arg +); + +#keyset[id] +format_args_arg_arg_names( + int id: @format_args_arg ref, + int arg_name: @format_args_arg_name ref +); + +#keyset[id] +format_args_arg_exprs( + int id: @format_args_arg ref, + int expr: @expr ref +); + +format_args_arg_names( + unique int id: @format_args_arg_name +); + +@generic_arg = + @assoc_type_arg +| @const_arg +| @lifetime_arg +| @type_arg +; + +generic_arg_lists( + unique int id: @generic_arg_list +); + +#keyset[id, index] +generic_arg_list_generic_args( + int id: @generic_arg_list ref, + int index: int ref, + int generic_arg: @generic_arg ref +); + +@generic_param = + @const_param +| @lifetime_param +| @type_param +; + +generic_param_lists( + unique int id: @generic_param_list +); + +#keyset[id, index] +generic_param_list_generic_params( + int id: @generic_param_list ref, + int index: int ref, + int generic_param: @generic_param ref +); + +item_lists( + unique int id: @item_list +); + +#keyset[id, index] +item_list_attrs( + int id: @item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +item_list_items( + int id: @item_list ref, + int index: int ref, + int item: @item ref +); + +labels( + unique int id: @label +); + +#keyset[id] +label_lifetimes( + int id: @label ref, + int lifetime: @lifetime ref +); + +let_elses( + unique int id: @let_else +); + +#keyset[id] +let_else_block_exprs( + int id: @let_else ref, + int block_expr: @block_expr ref +); + +macro_items( + unique int id: @macro_items +); + +#keyset[id, index] +macro_items_items( + int id: @macro_items ref, + int index: int ref, + int item: @item ref +); + +match_arms( + unique int id: @match_arm +); + +#keyset[id, index] +match_arm_attrs( + int id: @match_arm ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_arm_exprs( + int id: @match_arm ref, + int expr: @expr ref +); + +#keyset[id] +match_arm_guards( + int id: @match_arm ref, + int guard: @match_guard ref +); + +#keyset[id] +match_arm_pats( + int id: @match_arm ref, + int pat: @pat ref +); + +match_arm_lists( + unique int id: @match_arm_list +); + +#keyset[id, index] +match_arm_list_arms( + int id: @match_arm_list ref, + int index: int ref, + int arm: @match_arm ref +); + +#keyset[id, index] +match_arm_list_attrs( + int id: @match_arm_list ref, + int index: int ref, + int attr: @attr ref +); + +match_guards( + unique int id: @match_guard +); + +#keyset[id] +match_guard_conditions( + int id: @match_guard ref, + int condition: @expr ref +); + +@meta = + @cfg_attr_meta +| @cfg_meta +| @key_value_meta +| @path_meta +| @token_tree_meta +| @unsafe_meta +; + +names( + unique int id: @name +); + +#keyset[id] +name_texts( + int id: @name ref, + string text: string ref +); + +@param_base = + @param +| @self_param +; + +#keyset[id, index] +param_base_attrs( + int id: @param_base ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +param_base_type_reprs( + int id: @param_base ref, + int type_repr: @type_repr ref +); + +param_lists( + unique int id: @param_list +); + +#keyset[id, index] +param_list_params( + int id: @param_list ref, + int index: int ref, + int param: @param ref +); + +#keyset[id] +param_list_self_params( + int id: @param_list ref, + int self_param: @self_param ref +); + +parenthesized_arg_lists( + unique int id: @parenthesized_arg_list +); + +#keyset[id, index] +parenthesized_arg_list_type_args( + int id: @parenthesized_arg_list ref, + int index: int ref, + int type_arg: @type_arg ref +); + +@pat = + @box_pat +| @const_block_pat +| @ident_pat +| @literal_pat +| @macro_pat +| @or_pat +| @paren_pat +| @path_pat +| @range_pat +| @ref_pat +| @rest_pat +| @slice_pat +| @struct_pat +| @tuple_pat +| @tuple_struct_pat +| @wildcard_pat +; + +paths( + unique int id: @path +); + +#keyset[id] +path_qualifiers( + int id: @path ref, + int qualifier: @path ref +); + +#keyset[id] +path_segments_( + int id: @path ref, + int segment: @path_segment ref +); + +@path_ast_node = + @path_expr +| @path_pat +| @struct_expr +| @struct_pat +| @tuple_struct_pat +; + +#keyset[id] +path_ast_node_paths( + int id: @path_ast_node ref, + int path: @path ref +); + +path_segments( + unique int id: @path_segment +); + +#keyset[id] +path_segment_generic_arg_lists( + int id: @path_segment ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +path_segment_identifiers( + int id: @path_segment ref, + int identifier: @name_ref ref +); + +#keyset[id] +path_segment_parenthesized_arg_lists( + int id: @path_segment ref, + int parenthesized_arg_list: @parenthesized_arg_list ref +); + +#keyset[id] +path_segment_ret_types( + int id: @path_segment ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +path_segment_return_type_syntaxes( + int id: @path_segment ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +path_segment_type_reprs( + int id: @path_segment ref, + int type_repr: @type_repr ref +); + +#keyset[id] +path_segment_trait_type_reprs( + int id: @path_segment ref, + int trait_type_repr: @path_type_repr ref +); + +renames( + unique int id: @rename +); + +#keyset[id] +rename_names( + int id: @rename ref, + int name: @name ref +); + +ret_type_reprs( + unique int id: @ret_type_repr +); + +#keyset[id] +ret_type_repr_type_reprs( + int id: @ret_type_repr ref, + int type_repr: @type_repr ref +); + +return_type_syntaxes( + unique int id: @return_type_syntax +); + +source_files( + unique int id: @source_file +); + +#keyset[id, index] +source_file_attrs( + int id: @source_file ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +source_file_items( + int id: @source_file ref, + int index: int ref, + int item: @item ref +); + +@stmt = + @expr_stmt +| @item +| @let_stmt +; + +stmt_lists( + unique int id: @stmt_list +); + +#keyset[id, index] +stmt_list_attrs( + int id: @stmt_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +stmt_list_statements( + int id: @stmt_list ref, + int index: int ref, + int statement: @stmt ref +); + +#keyset[id] +stmt_list_tail_exprs( + int id: @stmt_list ref, + int tail_expr: @expr ref +); + +struct_expr_fields( + unique int id: @struct_expr_field +); + +#keyset[id, index] +struct_expr_field_attrs( + int id: @struct_expr_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_expr_field_exprs( + int id: @struct_expr_field ref, + int expr: @expr ref +); + +#keyset[id] +struct_expr_field_identifiers( + int id: @struct_expr_field ref, + int identifier: @name_ref ref +); + +struct_expr_field_lists( + unique int id: @struct_expr_field_list +); + +#keyset[id, index] +struct_expr_field_list_attrs( + int id: @struct_expr_field_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +struct_expr_field_list_fields( + int id: @struct_expr_field_list ref, + int index: int ref, + int field: @struct_expr_field ref +); + +#keyset[id] +struct_expr_field_list_spreads( + int id: @struct_expr_field_list ref, + int spread: @expr ref +); + +struct_fields( + unique int id: @struct_field +); + +#keyset[id, index] +struct_field_attrs( + int id: @struct_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_field_default_vals( + int id: @struct_field ref, + int default_val: @const_arg ref +); + +#keyset[id] +struct_field_is_unsafe( + int id: @struct_field ref +); + +#keyset[id] +struct_field_names( + int id: @struct_field ref, + int name: @name ref +); + +#keyset[id] +struct_field_type_reprs( + int id: @struct_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +struct_field_visibilities( + int id: @struct_field ref, + int visibility: @visibility ref +); + +struct_pat_fields( + unique int id: @struct_pat_field +); + +#keyset[id, index] +struct_pat_field_attrs( + int id: @struct_pat_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_pat_field_identifiers( + int id: @struct_pat_field ref, + int identifier: @name_ref ref +); + +#keyset[id] +struct_pat_field_pats( + int id: @struct_pat_field ref, + int pat: @pat ref +); + +struct_pat_field_lists( + unique int id: @struct_pat_field_list +); + +#keyset[id, index] +struct_pat_field_list_fields( + int id: @struct_pat_field_list ref, + int index: int ref, + int field: @struct_pat_field ref +); + +#keyset[id] +struct_pat_field_list_rest_pats( + int id: @struct_pat_field_list ref, + int rest_pat: @rest_pat ref +); + +@token = + @comment +; + +token_trees( + unique int id: @token_tree +); + +try_block_modifiers( + unique int id: @try_block_modifier +); + +#keyset[id] +try_block_modifier_is_try( + int id: @try_block_modifier ref +); + +#keyset[id] +try_block_modifier_type_reprs( + int id: @try_block_modifier ref, + int type_repr: @type_repr ref +); + +tuple_fields( + unique int id: @tuple_field +); + +#keyset[id, index] +tuple_field_attrs( + int id: @tuple_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +tuple_field_type_reprs( + int id: @tuple_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +tuple_field_visibilities( + int id: @tuple_field ref, + int visibility: @visibility ref +); + +type_bounds( + unique int id: @type_bound +); + +#keyset[id] +type_bound_for_binders( + int id: @type_bound ref, + int for_binder: @for_binder ref +); + +#keyset[id] +type_bound_is_async( + int id: @type_bound ref +); + +#keyset[id] +type_bound_is_const( + int id: @type_bound ref +); + +#keyset[id] +type_bound_lifetimes( + int id: @type_bound ref, + int lifetime: @lifetime ref +); + +#keyset[id] +type_bound_type_reprs( + int id: @type_bound ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_bound_use_bound_generic_args( + int id: @type_bound ref, + int use_bound_generic_args: @use_bound_generic_args ref +); + +type_bound_lists( + unique int id: @type_bound_list +); + +#keyset[id, index] +type_bound_list_bounds( + int id: @type_bound_list ref, + int index: int ref, + int bound: @type_bound ref +); + +@type_repr = + @array_type_repr +| @dyn_trait_type_repr +| @fn_ptr_type_repr +| @for_type_repr +| @impl_trait_type_repr +| @infer_type_repr +| @macro_type_repr +| @never_type_repr +| @paren_type_repr +| @path_type_repr +| @ptr_type_repr +| @ref_type_repr +| @slice_type_repr +| @tuple_type_repr +; + +@use_bound_generic_arg = + @lifetime +| @name_ref +; + +use_bound_generic_args( + unique int id: @use_bound_generic_args +); + +#keyset[id, index] +use_bound_generic_args_use_bound_generic_args( + int id: @use_bound_generic_args ref, + int index: int ref, + int use_bound_generic_arg: @use_bound_generic_arg ref +); + +use_trees( + unique int id: @use_tree +); + +#keyset[id] +use_tree_is_glob( + int id: @use_tree ref +); + +#keyset[id] +use_tree_paths( + int id: @use_tree ref, + int path: @path ref +); + +#keyset[id] +use_tree_renames( + int id: @use_tree ref, + int rename: @rename ref +); + +#keyset[id] +use_tree_use_tree_lists( + int id: @use_tree ref, + int use_tree_list: @use_tree_list ref +); + +use_tree_lists( + unique int id: @use_tree_list +); + +#keyset[id, index] +use_tree_list_use_trees( + int id: @use_tree_list ref, + int index: int ref, + int use_tree: @use_tree ref +); + +variant_lists( + unique int id: @variant_list +); + +#keyset[id, index] +variant_list_variants( + int id: @variant_list ref, + int index: int ref, + int variant: @variant ref +); + +visibilities( + unique int id: @visibility +); + +#keyset[id] +visibility_paths( + int id: @visibility ref, + int path: @path ref +); + +where_clauses( + unique int id: @where_clause +); + +#keyset[id, index] +where_clause_predicates( + int id: @where_clause ref, + int index: int ref, + int predicate: @where_pred ref +); + +where_preds( + unique int id: @where_pred +); + +#keyset[id] +where_pred_for_binders( + int id: @where_pred ref, + int for_binder: @for_binder ref +); + +#keyset[id] +where_pred_lifetimes( + int id: @where_pred ref, + int lifetime: @lifetime ref +); + +#keyset[id] +where_pred_type_reprs( + int id: @where_pred ref, + int type_repr: @type_repr ref +); + +#keyset[id] +where_pred_type_bound_lists( + int id: @where_pred ref, + int type_bound_list: @type_bound_list ref +); + +array_expr_internals( + unique int id: @array_expr_internal +); + +#keyset[id, index] +array_expr_internal_attrs( + int id: @array_expr_internal ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +array_expr_internal_exprs( + int id: @array_expr_internal ref, + int index: int ref, + int expr: @expr ref +); + +#keyset[id] +array_expr_internal_is_semicolon( + int id: @array_expr_internal ref +); + +array_type_reprs( + unique int id: @array_type_repr +); + +#keyset[id] +array_type_repr_const_args( + int id: @array_type_repr ref, + int const_arg: @const_arg ref +); + +#keyset[id] +array_type_repr_element_type_reprs( + int id: @array_type_repr ref, + int element_type_repr: @type_repr ref +); + +asm_clobber_abis( + unique int id: @asm_clobber_abi +); + +asm_consts( + unique int id: @asm_const +); + +#keyset[id] +asm_const_exprs( + int id: @asm_const ref, + int expr: @expr ref +); + +#keyset[id] +asm_const_is_const( + int id: @asm_const ref +); + +asm_labels( + unique int id: @asm_label +); + +#keyset[id] +asm_label_block_exprs( + int id: @asm_label ref, + int block_expr: @block_expr ref +); + +asm_operand_nameds( + unique int id: @asm_operand_named +); + +#keyset[id] +asm_operand_named_asm_operands( + int id: @asm_operand_named ref, + int asm_operand: @asm_operand ref +); + +#keyset[id] +asm_operand_named_names( + int id: @asm_operand_named ref, + int name: @name ref +); + +asm_options_lists( + unique int id: @asm_options_list +); + +#keyset[id, index] +asm_options_list_asm_options( + int id: @asm_options_list ref, + int index: int ref, + int asm_option: @asm_option ref +); + +asm_reg_operands( + unique int id: @asm_reg_operand +); + +#keyset[id] +asm_reg_operand_asm_dir_specs( + int id: @asm_reg_operand ref, + int asm_dir_spec: @asm_dir_spec ref +); + +#keyset[id] +asm_reg_operand_asm_operand_exprs( + int id: @asm_reg_operand ref, + int asm_operand_expr: @asm_operand_expr ref +); + +#keyset[id] +asm_reg_operand_asm_reg_specs( + int id: @asm_reg_operand ref, + int asm_reg_spec: @asm_reg_spec ref +); + +asm_syms( + unique int id: @asm_sym +); + +#keyset[id] +asm_sym_paths( + int id: @asm_sym ref, + int path: @path ref +); + +assoc_type_args( + unique int id: @assoc_type_arg +); + +#keyset[id] +assoc_type_arg_const_args( + int id: @assoc_type_arg ref, + int const_arg: @const_arg ref +); + +#keyset[id] +assoc_type_arg_generic_arg_lists( + int id: @assoc_type_arg ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +assoc_type_arg_identifiers( + int id: @assoc_type_arg ref, + int identifier: @name_ref ref +); + +#keyset[id] +assoc_type_arg_param_lists( + int id: @assoc_type_arg ref, + int param_list: @param_list ref +); + +#keyset[id] +assoc_type_arg_ret_types( + int id: @assoc_type_arg ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +assoc_type_arg_return_type_syntaxes( + int id: @assoc_type_arg ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +assoc_type_arg_type_reprs( + int id: @assoc_type_arg ref, + int type_repr: @type_repr ref +); + +#keyset[id] +assoc_type_arg_type_bound_lists( + int id: @assoc_type_arg ref, + int type_bound_list: @type_bound_list ref +); + +await_exprs( + unique int id: @await_expr +); + +#keyset[id, index] +await_expr_attrs( + int id: @await_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +await_expr_exprs( + int id: @await_expr ref, + int expr: @expr ref +); + +become_exprs( + unique int id: @become_expr +); + +#keyset[id, index] +become_expr_attrs( + int id: @become_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +become_expr_exprs( + int id: @become_expr ref, + int expr: @expr ref +); + +binary_exprs( + unique int id: @binary_expr +); + +#keyset[id, index] +binary_expr_attrs( + int id: @binary_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +binary_expr_lhs( + int id: @binary_expr ref, + int lhs: @expr ref +); + +#keyset[id] +binary_expr_operator_names( + int id: @binary_expr ref, + string operator_name: string ref +); + +#keyset[id] +binary_expr_rhs( + int id: @binary_expr ref, + int rhs: @expr ref +); + +box_pats( + unique int id: @box_pat +); + +#keyset[id] +box_pat_pats( + int id: @box_pat ref, + int pat: @pat ref +); + +break_exprs( + unique int id: @break_expr +); + +#keyset[id, index] +break_expr_attrs( + int id: @break_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +break_expr_exprs( + int id: @break_expr ref, + int expr: @expr ref +); + +#keyset[id] +break_expr_lifetimes( + int id: @break_expr ref, + int lifetime: @lifetime ref +); + +call_exprs( + unique int id: @call_expr +); + +#keyset[id] +call_expr_arg_lists( + int id: @call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +call_expr_attrs( + int id: @call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +call_expr_functions( + int id: @call_expr ref, + int function: @expr ref +); + +cast_exprs( + unique int id: @cast_expr +); + +#keyset[id, index] +cast_expr_attrs( + int id: @cast_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +cast_expr_exprs( + int id: @cast_expr ref, + int expr: @expr ref +); + +#keyset[id] +cast_expr_type_reprs( + int id: @cast_expr ref, + int type_repr: @type_repr ref +); + +cfg_atoms( + unique int id: @cfg_atom +); + +cfg_attr_meta( + unique int id: @cfg_attr_meta +); + +#keyset[id] +cfg_attr_meta_cfg_predicates( + int id: @cfg_attr_meta ref, + int cfg_predicate: @cfg_predicate ref +); + +#keyset[id, index] +cfg_attr_meta_metas( + int id: @cfg_attr_meta ref, + int index: int ref, + int meta: @meta ref +); + +cfg_composites( + unique int id: @cfg_composite +); + +#keyset[id, index] +cfg_composite_cfg_predicates( + int id: @cfg_composite ref, + int index: int ref, + int cfg_predicate: @cfg_predicate ref +); + +cfg_meta( + unique int id: @cfg_meta +); + +#keyset[id] +cfg_meta_cfg_predicates( + int id: @cfg_meta ref, + int cfg_predicate: @cfg_predicate ref +); + +closure_exprs( + unique int id: @closure_expr +); + +#keyset[id] +closure_expr_closure_bodies( + int id: @closure_expr ref, + int closure_body: @expr ref +); + +#keyset[id] +closure_expr_for_binders( + int id: @closure_expr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +closure_expr_is_async( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_const( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_gen( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_move( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_static( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_ret_types( + int id: @closure_expr ref, + int ret_type: @ret_type_repr ref +); + +comments( + unique int id: @comment, + int parent: @ast_node ref, + string text: string ref +); + +const_args( + unique int id: @const_arg +); + +#keyset[id] +const_arg_exprs( + int id: @const_arg ref, + int expr: @expr ref +); + +const_block_pats( + unique int id: @const_block_pat +); + +#keyset[id] +const_block_pat_block_exprs( + int id: @const_block_pat ref, + int block_expr: @block_expr ref +); + +#keyset[id] +const_block_pat_is_const( + int id: @const_block_pat ref +); + +const_params( + unique int id: @const_param +); + +#keyset[id, index] +const_param_attrs( + int id: @const_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_param_default_vals( + int id: @const_param ref, + int default_val: @const_arg ref +); + +#keyset[id] +const_param_is_const( + int id: @const_param ref +); + +#keyset[id] +const_param_names( + int id: @const_param ref, + int name: @name ref +); + +#keyset[id] +const_param_type_reprs( + int id: @const_param ref, + int type_repr: @type_repr ref +); + +continue_exprs( + unique int id: @continue_expr +); + +#keyset[id, index] +continue_expr_attrs( + int id: @continue_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +continue_expr_lifetimes( + int id: @continue_expr ref, + int lifetime: @lifetime ref +); + +dyn_trait_type_reprs( + unique int id: @dyn_trait_type_repr +); + +#keyset[id] +dyn_trait_type_repr_type_bound_lists( + int id: @dyn_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +expr_stmts( + unique int id: @expr_stmt +); + +#keyset[id] +expr_stmt_exprs( + int id: @expr_stmt ref, + int expr: @expr ref +); + +field_exprs( + unique int id: @field_expr +); + +#keyset[id, index] +field_expr_attrs( + int id: @field_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +field_expr_containers( + int id: @field_expr ref, + int container: @expr ref +); + +#keyset[id] +field_expr_identifiers( + int id: @field_expr ref, + int identifier: @name_ref ref +); + +fn_ptr_type_reprs( + unique int id: @fn_ptr_type_repr +); + +#keyset[id] +fn_ptr_type_repr_abis( + int id: @fn_ptr_type_repr ref, + int abi: @abi ref +); + +#keyset[id] +fn_ptr_type_repr_is_async( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_const( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_unsafe( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_param_lists( + int id: @fn_ptr_type_repr ref, + int param_list: @param_list ref +); + +#keyset[id] +fn_ptr_type_repr_ret_types( + int id: @fn_ptr_type_repr ref, + int ret_type: @ret_type_repr ref +); + +for_type_reprs( + unique int id: @for_type_repr +); + +#keyset[id] +for_type_repr_for_binders( + int id: @for_type_repr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +for_type_repr_type_reprs( + int id: @for_type_repr ref, + int type_repr: @type_repr ref +); + +format_args_exprs( + unique int id: @format_args_expr +); + +#keyset[id, index] +format_args_expr_args( + int id: @format_args_expr ref, + int index: int ref, + int arg: @format_args_arg ref +); + +#keyset[id, index] +format_args_expr_attrs( + int id: @format_args_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +format_args_expr_templates( + int id: @format_args_expr ref, + int template: @expr ref +); + +ident_pats( + unique int id: @ident_pat +); + +#keyset[id, index] +ident_pat_attrs( + int id: @ident_pat ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ident_pat_is_mut( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_is_ref( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_names( + int id: @ident_pat ref, + int name: @name ref +); + +#keyset[id] +ident_pat_pats( + int id: @ident_pat ref, + int pat: @pat ref +); + +if_exprs( + unique int id: @if_expr +); + +#keyset[id, index] +if_expr_attrs( + int id: @if_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +if_expr_conditions( + int id: @if_expr ref, + int condition: @expr ref +); + +#keyset[id] +if_expr_elses( + int id: @if_expr ref, + int else: @expr ref +); + +#keyset[id] +if_expr_thens( + int id: @if_expr ref, + int then: @block_expr ref +); + +impl_trait_type_reprs( + unique int id: @impl_trait_type_repr +); + +#keyset[id] +impl_trait_type_repr_type_bound_lists( + int id: @impl_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +index_exprs( + unique int id: @index_expr +); + +#keyset[id, index] +index_expr_attrs( + int id: @index_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +index_expr_bases( + int id: @index_expr ref, + int base: @expr ref +); + +#keyset[id] +index_expr_indices( + int id: @index_expr ref, + int index: @expr ref +); + +infer_type_reprs( + unique int id: @infer_type_repr +); + +@item = + @asm_expr +| @assoc_item +| @extern_block +| @extern_crate +| @extern_item +| @impl +| @macro_def +| @macro_rules +| @module +| @trait +| @type_item +| @use +; + +#keyset[id] +item_attribute_macro_expansions( + int id: @item ref, + int attribute_macro_expansion: @macro_items ref +); + +key_value_meta( + unique int id: @key_value_meta +); + +#keyset[id] +key_value_meta_exprs( + int id: @key_value_meta ref, + int expr: @expr ref +); + +#keyset[id] +key_value_meta_paths( + int id: @key_value_meta ref, + int path: @path ref +); + +@labelable_expr = + @block_expr +| @looping_expr +; + +#keyset[id] +labelable_expr_labels( + int id: @labelable_expr ref, + int label: @label ref +); + +let_exprs( + unique int id: @let_expr +); + +#keyset[id, index] +let_expr_attrs( + int id: @let_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_expr_scrutinees( + int id: @let_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +let_expr_pats( + int id: @let_expr ref, + int pat: @pat ref +); + +let_stmts( + unique int id: @let_stmt +); + +#keyset[id, index] +let_stmt_attrs( + int id: @let_stmt ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_stmt_initializers( + int id: @let_stmt ref, + int initializer: @expr ref +); + +#keyset[id] +let_stmt_let_elses( + int id: @let_stmt ref, + int let_else: @let_else ref +); + +#keyset[id] +let_stmt_pats( + int id: @let_stmt ref, + int pat: @pat ref +); + +#keyset[id] +let_stmt_type_reprs( + int id: @let_stmt ref, + int type_repr: @type_repr ref +); + +lifetimes( + unique int id: @lifetime +); + +#keyset[id] +lifetime_texts( + int id: @lifetime ref, + string text: string ref +); + +lifetime_args( + unique int id: @lifetime_arg +); + +#keyset[id] +lifetime_arg_lifetimes( + int id: @lifetime_arg ref, + int lifetime: @lifetime ref +); + +lifetime_params( + unique int id: @lifetime_param +); + +#keyset[id, index] +lifetime_param_attrs( + int id: @lifetime_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +lifetime_param_lifetimes( + int id: @lifetime_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +lifetime_param_type_bound_lists( + int id: @lifetime_param ref, + int type_bound_list: @type_bound_list ref +); + +literal_exprs( + unique int id: @literal_expr +); + +#keyset[id, index] +literal_expr_attrs( + int id: @literal_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +literal_expr_text_values( + int id: @literal_expr ref, + string text_value: string ref +); + +literal_pats( + unique int id: @literal_pat +); + +#keyset[id] +literal_pat_literals( + int id: @literal_pat ref, + int literal: @literal_expr ref +); + +macro_exprs( + unique int id: @macro_expr +); + +#keyset[id] +macro_expr_macro_calls( + int id: @macro_expr ref, + int macro_call: @macro_call ref +); + +macro_pats( + unique int id: @macro_pat +); + +#keyset[id] +macro_pat_macro_calls( + int id: @macro_pat ref, + int macro_call: @macro_call ref +); + +macro_type_reprs( + unique int id: @macro_type_repr +); + +#keyset[id] +macro_type_repr_macro_calls( + int id: @macro_type_repr ref, + int macro_call: @macro_call ref +); + +match_exprs( + unique int id: @match_expr +); + +#keyset[id, index] +match_expr_attrs( + int id: @match_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_expr_scrutinees( + int id: @match_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +match_expr_match_arm_lists( + int id: @match_expr ref, + int match_arm_list: @match_arm_list ref +); + +method_call_exprs( + unique int id: @method_call_expr +); + +#keyset[id] +method_call_expr_arg_lists( + int id: @method_call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +method_call_expr_attrs( + int id: @method_call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +method_call_expr_generic_arg_lists( + int id: @method_call_expr ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +method_call_expr_identifiers( + int id: @method_call_expr ref, + int identifier: @name_ref ref +); + +#keyset[id] +method_call_expr_receivers( + int id: @method_call_expr ref, + int receiver: @expr ref +); + +name_refs( + unique int id: @name_ref +); + +#keyset[id] +name_ref_texts( + int id: @name_ref ref, + string text: string ref +); + +never_type_reprs( + unique int id: @never_type_repr +); + +offset_of_exprs( + unique int id: @offset_of_expr +); + +#keyset[id, index] +offset_of_expr_attrs( + int id: @offset_of_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +offset_of_expr_fields( + int id: @offset_of_expr ref, + int index: int ref, + int field: @name_ref ref +); + +#keyset[id] +offset_of_expr_type_reprs( + int id: @offset_of_expr ref, + int type_repr: @type_repr ref +); + +or_pats( + unique int id: @or_pat +); + +#keyset[id, index] +or_pat_pats( + int id: @or_pat ref, + int index: int ref, + int pat: @pat ref +); + +params( + unique int id: @param +); + +#keyset[id] +param_pats( + int id: @param ref, + int pat: @pat ref +); + +paren_exprs( + unique int id: @paren_expr +); + +#keyset[id, index] +paren_expr_attrs( + int id: @paren_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +paren_expr_exprs( + int id: @paren_expr ref, + int expr: @expr ref +); + +paren_pats( + unique int id: @paren_pat +); + +#keyset[id] +paren_pat_pats( + int id: @paren_pat ref, + int pat: @pat ref +); + +paren_type_reprs( + unique int id: @paren_type_repr +); + +#keyset[id] +paren_type_repr_type_reprs( + int id: @paren_type_repr ref, + int type_repr: @type_repr ref +); + +@path_expr_base = + @path_expr +; + +path_meta( + unique int id: @path_meta +); + +#keyset[id] +path_meta_paths( + int id: @path_meta ref, + int path: @path ref +); + +path_pats( + unique int id: @path_pat +); + +path_type_reprs( + unique int id: @path_type_repr +); + +#keyset[id] +path_type_repr_paths( + int id: @path_type_repr ref, + int path: @path ref +); + +prefix_exprs( + unique int id: @prefix_expr +); + +#keyset[id, index] +prefix_expr_attrs( + int id: @prefix_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +prefix_expr_exprs( + int id: @prefix_expr ref, + int expr: @expr ref +); + +#keyset[id] +prefix_expr_operator_names( + int id: @prefix_expr ref, + string operator_name: string ref +); + +ptr_type_reprs( + unique int id: @ptr_type_repr +); + +#keyset[id] +ptr_type_repr_is_const( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_is_mut( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_type_reprs( + int id: @ptr_type_repr ref, + int type_repr: @type_repr ref +); + +range_exprs( + unique int id: @range_expr +); + +#keyset[id, index] +range_expr_attrs( + int id: @range_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +range_expr_ends( + int id: @range_expr ref, + int end: @expr ref +); + +#keyset[id] +range_expr_operator_names( + int id: @range_expr ref, + string operator_name: string ref +); + +#keyset[id] +range_expr_starts( + int id: @range_expr ref, + int start: @expr ref +); + +range_pats( + unique int id: @range_pat +); + +#keyset[id] +range_pat_ends( + int id: @range_pat ref, + int end: @pat ref +); + +#keyset[id] +range_pat_operator_names( + int id: @range_pat ref, + string operator_name: string ref +); + +#keyset[id] +range_pat_starts( + int id: @range_pat ref, + int start: @pat ref +); + +ref_exprs( + unique int id: @ref_expr +); + +#keyset[id, index] +ref_expr_attrs( + int id: @ref_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ref_expr_exprs( + int id: @ref_expr ref, + int expr: @expr ref +); + +#keyset[id] +ref_expr_is_const( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_mut( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_raw( + int id: @ref_expr ref +); + +ref_pats( + unique int id: @ref_pat +); + +#keyset[id] +ref_pat_is_mut( + int id: @ref_pat ref +); + +#keyset[id] +ref_pat_pats( + int id: @ref_pat ref, + int pat: @pat ref +); + +ref_type_reprs( + unique int id: @ref_type_repr +); + +#keyset[id] +ref_type_repr_is_mut( + int id: @ref_type_repr ref +); + +#keyset[id] +ref_type_repr_lifetimes( + int id: @ref_type_repr ref, + int lifetime: @lifetime ref +); + +#keyset[id] +ref_type_repr_type_reprs( + int id: @ref_type_repr ref, + int type_repr: @type_repr ref +); + +rest_pats( + unique int id: @rest_pat +); + +#keyset[id, index] +rest_pat_attrs( + int id: @rest_pat ref, + int index: int ref, + int attr: @attr ref +); + +return_exprs( + unique int id: @return_expr +); + +#keyset[id, index] +return_expr_attrs( + int id: @return_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +return_expr_exprs( + int id: @return_expr ref, + int expr: @expr ref +); + +self_params( + unique int id: @self_param +); + +#keyset[id] +self_param_is_ref( + int id: @self_param ref +); + +#keyset[id] +self_param_is_mut( + int id: @self_param ref +); + +#keyset[id] +self_param_lifetimes( + int id: @self_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +self_param_names( + int id: @self_param ref, + int name: @name ref +); + +slice_pats( + unique int id: @slice_pat +); + +#keyset[id, index] +slice_pat_pats( + int id: @slice_pat ref, + int index: int ref, + int pat: @pat ref +); + +slice_type_reprs( + unique int id: @slice_type_repr +); + +#keyset[id] +slice_type_repr_type_reprs( + int id: @slice_type_repr ref, + int type_repr: @type_repr ref +); + +struct_exprs( + unique int id: @struct_expr +); + +#keyset[id] +struct_expr_struct_expr_field_lists( + int id: @struct_expr ref, + int struct_expr_field_list: @struct_expr_field_list ref +); + +struct_field_lists( + unique int id: @struct_field_list +); + +#keyset[id, index] +struct_field_list_fields( + int id: @struct_field_list ref, + int index: int ref, + int field: @struct_field ref +); + +struct_pats( + unique int id: @struct_pat +); + +#keyset[id] +struct_pat_struct_pat_field_lists( + int id: @struct_pat ref, + int struct_pat_field_list: @struct_pat_field_list ref +); + +token_tree_meta( + unique int id: @token_tree_meta +); + +#keyset[id] +token_tree_meta_paths( + int id: @token_tree_meta ref, + int path: @path ref +); + +#keyset[id] +token_tree_meta_token_trees( + int id: @token_tree_meta ref, + int token_tree: @token_tree ref +); + +try_exprs( + unique int id: @try_expr +); + +#keyset[id, index] +try_expr_attrs( + int id: @try_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +try_expr_exprs( + int id: @try_expr ref, + int expr: @expr ref +); + +tuple_exprs( + unique int id: @tuple_expr +); + +#keyset[id, index] +tuple_expr_attrs( + int id: @tuple_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +tuple_expr_fields( + int id: @tuple_expr ref, + int index: int ref, + int field: @expr ref +); + +tuple_field_lists( + unique int id: @tuple_field_list +); + +#keyset[id, index] +tuple_field_list_fields( + int id: @tuple_field_list ref, + int index: int ref, + int field: @tuple_field ref +); + +tuple_pats( + unique int id: @tuple_pat +); + +#keyset[id, index] +tuple_pat_fields( + int id: @tuple_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_struct_pats( + unique int id: @tuple_struct_pat +); + +#keyset[id, index] +tuple_struct_pat_fields( + int id: @tuple_struct_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_type_reprs( + unique int id: @tuple_type_repr +); + +#keyset[id, index] +tuple_type_repr_fields( + int id: @tuple_type_repr ref, + int index: int ref, + int field: @type_repr ref +); + +type_args( + unique int id: @type_arg +); + +#keyset[id] +type_arg_type_reprs( + int id: @type_arg ref, + int type_repr: @type_repr ref +); + +type_params( + unique int id: @type_param +); + +#keyset[id, index] +type_param_attrs( + int id: @type_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_param_default_types( + int id: @type_param ref, + int default_type: @type_repr ref +); + +#keyset[id] +type_param_names( + int id: @type_param ref, + int name: @name ref +); + +#keyset[id] +type_param_type_bound_lists( + int id: @type_param ref, + int type_bound_list: @type_bound_list ref +); + +underscore_exprs( + unique int id: @underscore_expr +); + +#keyset[id, index] +underscore_expr_attrs( + int id: @underscore_expr ref, + int index: int ref, + int attr: @attr ref +); + +unsafe_meta( + unique int id: @unsafe_meta +); + +#keyset[id] +unsafe_meta_is_unsafe( + int id: @unsafe_meta ref +); + +#keyset[id] +unsafe_meta_meta( + int id: @unsafe_meta ref, + int meta: @meta ref +); + +variants( + unique int id: @variant +); + +#keyset[id, index] +variant_attrs( + int id: @variant ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +variant_const_args( + int id: @variant ref, + int const_arg: @const_arg ref +); + +#keyset[id] +variant_field_lists( + int id: @variant ref, + int field_list: @field_list ref +); + +#keyset[id] +variant_names( + int id: @variant ref, + int name: @name ref +); + +#keyset[id] +variant_visibilities( + int id: @variant ref, + int visibility: @visibility ref +); + +wildcard_pats( + unique int id: @wildcard_pat +); + +yeet_exprs( + unique int id: @yeet_expr +); + +#keyset[id, index] +yeet_expr_attrs( + int id: @yeet_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yeet_expr_exprs( + int id: @yeet_expr ref, + int expr: @expr ref +); + +yield_exprs( + unique int id: @yield_expr +); + +#keyset[id, index] +yield_expr_attrs( + int id: @yield_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yield_expr_exprs( + int id: @yield_expr ref, + int expr: @expr ref +); + +asm_exprs( + unique int id: @asm_expr +); + +#keyset[id, index] +asm_expr_asm_pieces( + int id: @asm_expr ref, + int index: int ref, + int asm_piece: @asm_piece ref +); + +#keyset[id, index] +asm_expr_attrs( + int id: @asm_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +asm_expr_templates( + int id: @asm_expr ref, + int index: int ref, + int template: @expr ref +); + +@assoc_item = + @const +| @function +| @macro_call +| @type_alias +; + +block_exprs( + unique int id: @block_expr +); + +#keyset[id, index] +block_expr_attrs( + int id: @block_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +block_expr_is_async( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_const( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_gen( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_move( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_unsafe( + int id: @block_expr ref +); + +#keyset[id] +block_expr_stmt_lists( + int id: @block_expr ref, + int stmt_list: @stmt_list ref +); + +#keyset[id] +block_expr_try_block_modifiers( + int id: @block_expr ref, + int try_block_modifier: @try_block_modifier ref +); + +extern_blocks( + unique int id: @extern_block +); + +#keyset[id] +extern_block_abis( + int id: @extern_block ref, + int abi: @abi ref +); + +#keyset[id, index] +extern_block_attrs( + int id: @extern_block ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_block_extern_item_lists( + int id: @extern_block ref, + int extern_item_list: @extern_item_list ref +); + +#keyset[id] +extern_block_is_unsafe( + int id: @extern_block ref +); + +extern_crates( + unique int id: @extern_crate +); + +#keyset[id, index] +extern_crate_attrs( + int id: @extern_crate ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_crate_identifiers( + int id: @extern_crate ref, + int identifier: @name_ref ref +); + +#keyset[id] +extern_crate_renames( + int id: @extern_crate ref, + int rename: @rename ref +); + +#keyset[id] +extern_crate_visibilities( + int id: @extern_crate ref, + int visibility: @visibility ref +); + +@extern_item = + @function +| @macro_call +| @static +| @type_alias +; + +impls( + unique int id: @impl +); + +#keyset[id] +impl_assoc_item_lists( + int id: @impl ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +impl_attrs( + int id: @impl ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +impl_generic_param_lists( + int id: @impl ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +impl_is_const( + int id: @impl ref +); + +#keyset[id] +impl_is_default( + int id: @impl ref +); + +#keyset[id] +impl_is_unsafe( + int id: @impl ref +); + +#keyset[id] +impl_self_ties( + int id: @impl ref, + int self_ty: @type_repr ref +); + +#keyset[id] +impl_traits( + int id: @impl ref, + int trait: @type_repr ref +); + +#keyset[id] +impl_visibilities( + int id: @impl ref, + int visibility: @visibility ref +); + +#keyset[id] +impl_where_clauses( + int id: @impl ref, + int where_clause: @where_clause ref +); + +@looping_expr = + @for_expr +| @loop_expr +| @while_expr +; + +#keyset[id] +looping_expr_loop_bodies( + int id: @looping_expr ref, + int loop_body: @block_expr ref +); + +macro_defs( + unique int id: @macro_def +); + +#keyset[id] +macro_def_args( + int id: @macro_def ref, + int args: @token_tree ref +); + +#keyset[id, index] +macro_def_attrs( + int id: @macro_def ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_def_bodies( + int id: @macro_def ref, + int body: @token_tree ref +); + +#keyset[id] +macro_def_names( + int id: @macro_def ref, + int name: @name ref +); + +#keyset[id] +macro_def_visibilities( + int id: @macro_def ref, + int visibility: @visibility ref +); + +macro_rules( + unique int id: @macro_rules +); + +#keyset[id, index] +macro_rules_attrs( + int id: @macro_rules ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_rules_names( + int id: @macro_rules ref, + int name: @name ref +); + +#keyset[id] +macro_rules_token_trees( + int id: @macro_rules ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_rules_visibilities( + int id: @macro_rules ref, + int visibility: @visibility ref +); + +modules( + unique int id: @module +); + +#keyset[id, index] +module_attrs( + int id: @module ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +module_item_lists( + int id: @module ref, + int item_list: @item_list ref +); + +#keyset[id] +module_names( + int id: @module ref, + int name: @name ref +); + +#keyset[id] +module_visibilities( + int id: @module ref, + int visibility: @visibility ref +); + +path_exprs( + unique int id: @path_expr +); + +#keyset[id, index] +path_expr_attrs( + int id: @path_expr ref, + int index: int ref, + int attr: @attr ref +); + +traits( + unique int id: @trait +); + +#keyset[id] +trait_assoc_item_lists( + int id: @trait ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +trait_attrs( + int id: @trait ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_generic_param_lists( + int id: @trait ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_is_auto( + int id: @trait ref +); + +#keyset[id] +trait_is_unsafe( + int id: @trait ref +); + +#keyset[id] +trait_names( + int id: @trait ref, + int name: @name ref +); + +#keyset[id] +trait_type_bound_lists( + int id: @trait ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_visibilities( + int id: @trait ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_where_clauses( + int id: @trait ref, + int where_clause: @where_clause ref +); + +@type_item = + @enum +| @struct +| @union +; + +#keyset[id, index] +type_item_derive_macro_expansions( + int id: @type_item ref, + int index: int ref, + int derive_macro_expansion: @macro_items ref +); + +#keyset[id, index] +type_item_attrs( + int id: @type_item ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_item_generic_param_lists( + int id: @type_item ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_item_names( + int id: @type_item ref, + int name: @name ref +); + +#keyset[id] +type_item_visibilities( + int id: @type_item ref, + int visibility: @visibility ref +); + +#keyset[id] +type_item_where_clauses( + int id: @type_item ref, + int where_clause: @where_clause ref +); + +uses( + unique int id: @use +); + +#keyset[id, index] +use_attrs( + int id: @use ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +use_use_trees( + int id: @use ref, + int use_tree: @use_tree ref +); + +#keyset[id] +use_visibilities( + int id: @use ref, + int visibility: @visibility ref +); + +consts( + unique int id: @const +); + +#keyset[id, index] +const_attrs( + int id: @const ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_bodies( + int id: @const ref, + int body: @expr ref +); + +#keyset[id] +const_generic_param_lists( + int id: @const ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +const_is_const( + int id: @const ref +); + +#keyset[id] +const_is_default( + int id: @const ref +); + +#keyset[id] +const_names( + int id: @const ref, + int name: @name ref +); + +#keyset[id] +const_type_reprs( + int id: @const ref, + int type_repr: @type_repr ref +); + +#keyset[id] +const_visibilities( + int id: @const ref, + int visibility: @visibility ref +); + +#keyset[id] +const_where_clauses( + int id: @const ref, + int where_clause: @where_clause ref +); + +#keyset[id] +const_has_implementation( + int id: @const ref +); + +enums( + unique int id: @enum +); + +#keyset[id] +enum_variant_lists( + int id: @enum ref, + int variant_list: @variant_list ref +); + +for_exprs( + unique int id: @for_expr +); + +#keyset[id, index] +for_expr_attrs( + int id: @for_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +for_expr_iterables( + int id: @for_expr ref, + int iterable: @expr ref +); + +#keyset[id] +for_expr_pats( + int id: @for_expr ref, + int pat: @pat ref +); + +functions( + unique int id: @function +); + +#keyset[id] +function_abis( + int id: @function ref, + int abi: @abi ref +); + +#keyset[id] +function_function_bodies( + int id: @function ref, + int function_body: @block_expr ref +); + +#keyset[id] +function_generic_param_lists( + int id: @function ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +function_is_async( + int id: @function ref +); + +#keyset[id] +function_is_const( + int id: @function ref +); + +#keyset[id] +function_is_default( + int id: @function ref +); + +#keyset[id] +function_is_gen( + int id: @function ref +); + +#keyset[id] +function_is_unsafe( + int id: @function ref +); + +#keyset[id] +function_names( + int id: @function ref, + int name: @name ref +); + +#keyset[id] +function_ret_types( + int id: @function ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +function_visibilities( + int id: @function ref, + int visibility: @visibility ref +); + +#keyset[id] +function_where_clauses( + int id: @function ref, + int where_clause: @where_clause ref +); + +#keyset[id] +function_has_implementation( + int id: @function ref +); + +loop_exprs( + unique int id: @loop_expr +); + +#keyset[id, index] +loop_expr_attrs( + int id: @loop_expr ref, + int index: int ref, + int attr: @attr ref +); + +macro_calls( + unique int id: @macro_call +); + +#keyset[id, index] +macro_call_attrs( + int id: @macro_call ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_call_paths( + int id: @macro_call ref, + int path: @path ref +); + +#keyset[id] +macro_call_token_trees( + int id: @macro_call ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_call_macro_call_expansions( + int id: @macro_call ref, + int macro_call_expansion: @ast_node ref +); + +statics( + unique int id: @static +); + +#keyset[id, index] +static_attrs( + int id: @static ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +static_bodies( + int id: @static ref, + int body: @expr ref +); + +#keyset[id] +static_is_mut( + int id: @static ref +); + +#keyset[id] +static_is_static( + int id: @static ref +); + +#keyset[id] +static_is_unsafe( + int id: @static ref +); + +#keyset[id] +static_names( + int id: @static ref, + int name: @name ref +); + +#keyset[id] +static_type_reprs( + int id: @static ref, + int type_repr: @type_repr ref +); + +#keyset[id] +static_visibilities( + int id: @static ref, + int visibility: @visibility ref +); + +structs( + unique int id: @struct +); + +#keyset[id] +struct_field_lists_( + int id: @struct ref, + int field_list: @field_list ref +); + +type_aliases( + unique int id: @type_alias +); + +#keyset[id, index] +type_alias_attrs( + int id: @type_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_alias_generic_param_lists( + int id: @type_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_alias_is_default( + int id: @type_alias ref +); + +#keyset[id] +type_alias_names( + int id: @type_alias ref, + int name: @name ref +); + +#keyset[id] +type_alias_type_reprs( + int id: @type_alias ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_alias_type_bound_lists( + int id: @type_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +type_alias_visibilities( + int id: @type_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +type_alias_where_clauses( + int id: @type_alias ref, + int where_clause: @where_clause ref +); + +unions( + unique int id: @union +); + +#keyset[id] +union_struct_field_lists( + int id: @union ref, + int struct_field_list: @struct_field_list ref +); + +while_exprs( + unique int id: @while_expr +); + +#keyset[id, index] +while_expr_attrs( + int id: @while_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +while_expr_conditions( + int id: @while_expr ref, + int condition: @expr ref +); diff --git a/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/rust.dbscheme b/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/rust.dbscheme new file mode 100644 index 000000000000..66a489863649 --- /dev/null +++ b/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/rust.dbscheme @@ -0,0 +1,3556 @@ +// generated by codegen, do not edit + +// from ../shared/tree-sitter-extractor/src/generator/prefix.dbscheme +/*- Files and folders -*/ + +/** + * The location of an element. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @file | @folder + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +/*- Empty location -*/ + +empty_location( + int location: @location_default ref +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/*- Diagnostic messages -*/ + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/*- Diagnostic messages: severity -*/ + +case @diagnostic.severity of + 10 = @diagnostic_debug +| 20 = @diagnostic_info +| 30 = @diagnostic_warning +| 40 = @diagnostic_error +; + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error; + +/*- Database metadata -*/ + +/** + * The CLI will automatically emit applicable tuples for this table, + * such as `databaseMetadata("isOverlay", "true")` when building an + * overlay database. + */ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +/*- Overlay support -*/ + +/** + * The CLI will automatically emit tuples for each new/modified/deleted file + * when building an overlay database. + */ +overlayChangedFiles( + string path: string ref +); + + +// from prefix.dbscheme +#keyset[id] +locatable_locations( + int id: @locatable ref, + int location: @location_default ref +); + + +// from schema + +@element = + @extractor_step +| @locatable +| @named_crate +| @unextracted +; + +extractor_steps( + unique int id: @extractor_step, + string action: string ref, + int duration_ms: int ref +); + +#keyset[id] +extractor_step_files( + int id: @extractor_step ref, + int file: @file ref +); + +@locatable = + @ast_node +| @crate +; + +named_crates( + unique int id: @named_crate, + string name: string ref, + int crate: @crate ref +); + +@unextracted = + @missing +| @unimplemented +; + +@ast_node = + @abi +| @addressable +| @arg_list +| @asm_dir_spec +| @asm_operand +| @asm_operand_expr +| @asm_option +| @asm_piece +| @asm_reg_spec +| @assoc_item_list +| @attr +| @callable +| @expr +| @extern_item_list +| @field_list +| @for_binder +| @format_args_arg +| @generic_arg +| @generic_arg_list +| @generic_param +| @generic_param_list +| @item_list +| @label +| @let_else +| @macro_items +| @match_arm +| @match_arm_list +| @match_guard +| @meta +| @name +| @param_base +| @param_list +| @parenthesized_arg_list +| @pat +| @path +| @path_ast_node +| @path_segment +| @rename +| @ret_type_repr +| @return_type_syntax +| @source_file +| @stmt +| @stmt_list +| @struct_expr_field +| @struct_expr_field_list +| @struct_field +| @struct_pat_field +| @struct_pat_field_list +| @token +| @token_tree +| @tuple_field +| @type_bound +| @type_bound_list +| @type_repr +| @use_bound_generic_arg +| @use_bound_generic_args +| @use_tree +| @use_tree_list +| @variant_list +| @visibility +| @where_clause +| @where_pred +; + +crates( + unique int id: @crate +); + +#keyset[id] +crate_names( + int id: @crate ref, + string name: string ref +); + +#keyset[id] +crate_versions( + int id: @crate ref, + string version: string ref +); + +#keyset[id, index] +crate_cfg_options( + int id: @crate ref, + int index: int ref, + string cfg_option: string ref +); + +#keyset[id, index] +crate_named_dependencies( + int id: @crate ref, + int index: int ref, + int named_dependency: @named_crate ref +); + +missings( + unique int id: @missing +); + +unimplementeds( + unique int id: @unimplemented +); + +abis( + unique int id: @abi +); + +#keyset[id] +abi_abi_strings( + int id: @abi ref, + string abi_string: string ref +); + +@addressable = + @item +| @variant +; + +arg_lists( + unique int id: @arg_list +); + +#keyset[id, index] +arg_list_args( + int id: @arg_list ref, + int index: int ref, + int arg: @expr ref +); + +asm_dir_specs( + unique int id: @asm_dir_spec +); + +@asm_operand = + @asm_const +| @asm_label +| @asm_reg_operand +| @asm_sym +; + +asm_operand_exprs( + unique int id: @asm_operand_expr +); + +#keyset[id] +asm_operand_expr_in_exprs( + int id: @asm_operand_expr ref, + int in_expr: @expr ref +); + +#keyset[id] +asm_operand_expr_out_exprs( + int id: @asm_operand_expr ref, + int out_expr: @expr ref +); + +asm_options( + unique int id: @asm_option +); + +#keyset[id] +asm_option_is_raw( + int id: @asm_option ref +); + +@asm_piece = + @asm_clobber_abi +| @asm_operand_named +| @asm_options_list +; + +asm_reg_specs( + unique int id: @asm_reg_spec +); + +#keyset[id] +asm_reg_spec_identifiers( + int id: @asm_reg_spec ref, + int identifier: @name_ref ref +); + +assoc_item_lists( + unique int id: @assoc_item_list +); + +#keyset[id, index] +assoc_item_list_assoc_items( + int id: @assoc_item_list ref, + int index: int ref, + int assoc_item: @assoc_item ref +); + +#keyset[id, index] +assoc_item_list_attrs( + int id: @assoc_item_list ref, + int index: int ref, + int attr: @attr ref +); + +attrs( + unique int id: @attr +); + +#keyset[id] +attr_meta( + int id: @attr ref, + int meta: @meta ref +); + +@callable = + @closure_expr +| @function +; + +#keyset[id] +callable_param_lists( + int id: @callable ref, + int param_list: @param_list ref +); + +#keyset[id, index] +callable_attrs( + int id: @callable ref, + int index: int ref, + int attr: @attr ref +); + +@expr = + @array_expr_internal +| @asm_expr +| @await_expr +| @become_expr +| @binary_expr +| @break_expr +| @call_expr +| @cast_expr +| @closure_expr +| @continue_expr +| @field_expr +| @format_args_expr +| @if_expr +| @index_expr +| @labelable_expr +| @let_expr +| @literal_expr +| @macro_expr +| @match_expr +| @method_call_expr +| @offset_of_expr +| @paren_expr +| @path_expr_base +| @prefix_expr +| @range_expr +| @ref_expr +| @return_expr +| @struct_expr +| @try_expr +| @tuple_expr +| @underscore_expr +| @yeet_expr +| @yield_expr +; + +extern_item_lists( + unique int id: @extern_item_list +); + +#keyset[id, index] +extern_item_list_attrs( + int id: @extern_item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +extern_item_list_extern_items( + int id: @extern_item_list ref, + int index: int ref, + int extern_item: @extern_item ref +); + +@field_list = + @struct_field_list +| @tuple_field_list +; + +for_binders( + unique int id: @for_binder +); + +#keyset[id] +for_binder_generic_param_lists( + int id: @for_binder ref, + int generic_param_list: @generic_param_list ref +); + +format_args_args( + unique int id: @format_args_arg +); + +#keyset[id] +format_args_arg_exprs( + int id: @format_args_arg ref, + int expr: @expr ref +); + +#keyset[id] +format_args_arg_names( + int id: @format_args_arg ref, + int name: @name ref +); + +@generic_arg = + @assoc_type_arg +| @const_arg +| @lifetime_arg +| @type_arg +; + +generic_arg_lists( + unique int id: @generic_arg_list +); + +#keyset[id, index] +generic_arg_list_generic_args( + int id: @generic_arg_list ref, + int index: int ref, + int generic_arg: @generic_arg ref +); + +@generic_param = + @const_param +| @lifetime_param +| @type_param +; + +generic_param_lists( + unique int id: @generic_param_list +); + +#keyset[id, index] +generic_param_list_generic_params( + int id: @generic_param_list ref, + int index: int ref, + int generic_param: @generic_param ref +); + +item_lists( + unique int id: @item_list +); + +#keyset[id, index] +item_list_attrs( + int id: @item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +item_list_items( + int id: @item_list ref, + int index: int ref, + int item: @item ref +); + +labels( + unique int id: @label +); + +#keyset[id] +label_lifetimes( + int id: @label ref, + int lifetime: @lifetime ref +); + +let_elses( + unique int id: @let_else +); + +#keyset[id] +let_else_block_exprs( + int id: @let_else ref, + int block_expr: @block_expr ref +); + +macro_items( + unique int id: @macro_items +); + +#keyset[id, index] +macro_items_items( + int id: @macro_items ref, + int index: int ref, + int item: @item ref +); + +match_arms( + unique int id: @match_arm +); + +#keyset[id, index] +match_arm_attrs( + int id: @match_arm ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_arm_exprs( + int id: @match_arm ref, + int expr: @expr ref +); + +#keyset[id] +match_arm_guards( + int id: @match_arm ref, + int guard: @match_guard ref +); + +#keyset[id] +match_arm_pats( + int id: @match_arm ref, + int pat: @pat ref +); + +match_arm_lists( + unique int id: @match_arm_list +); + +#keyset[id, index] +match_arm_list_arms( + int id: @match_arm_list ref, + int index: int ref, + int arm: @match_arm ref +); + +#keyset[id, index] +match_arm_list_attrs( + int id: @match_arm_list ref, + int index: int ref, + int attr: @attr ref +); + +match_guards( + unique int id: @match_guard +); + +#keyset[id] +match_guard_conditions( + int id: @match_guard ref, + int condition: @expr ref +); + +meta( + unique int id: @meta +); + +#keyset[id] +meta_exprs( + int id: @meta ref, + int expr: @expr ref +); + +#keyset[id] +meta_is_unsafe( + int id: @meta ref +); + +#keyset[id] +meta_paths( + int id: @meta ref, + int path: @path ref +); + +#keyset[id] +meta_token_trees( + int id: @meta ref, + int token_tree: @token_tree ref +); + +names( + unique int id: @name +); + +#keyset[id] +name_texts( + int id: @name ref, + string text: string ref +); + +@param_base = + @param +| @self_param +; + +#keyset[id, index] +param_base_attrs( + int id: @param_base ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +param_base_type_reprs( + int id: @param_base ref, + int type_repr: @type_repr ref +); + +param_lists( + unique int id: @param_list +); + +#keyset[id, index] +param_list_params( + int id: @param_list ref, + int index: int ref, + int param: @param ref +); + +#keyset[id] +param_list_self_params( + int id: @param_list ref, + int self_param: @self_param ref +); + +parenthesized_arg_lists( + unique int id: @parenthesized_arg_list +); + +#keyset[id, index] +parenthesized_arg_list_type_args( + int id: @parenthesized_arg_list ref, + int index: int ref, + int type_arg: @type_arg ref +); + +@pat = + @box_pat +| @const_block_pat +| @ident_pat +| @literal_pat +| @macro_pat +| @or_pat +| @paren_pat +| @path_pat +| @range_pat +| @ref_pat +| @rest_pat +| @slice_pat +| @struct_pat +| @tuple_pat +| @tuple_struct_pat +| @wildcard_pat +; + +paths( + unique int id: @path +); + +#keyset[id] +path_qualifiers( + int id: @path ref, + int qualifier: @path ref +); + +#keyset[id] +path_segments_( + int id: @path ref, + int segment: @path_segment ref +); + +@path_ast_node = + @path_expr +| @path_pat +| @struct_expr +| @struct_pat +| @tuple_struct_pat +; + +#keyset[id] +path_ast_node_paths( + int id: @path_ast_node ref, + int path: @path ref +); + +path_segments( + unique int id: @path_segment +); + +#keyset[id] +path_segment_generic_arg_lists( + int id: @path_segment ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +path_segment_identifiers( + int id: @path_segment ref, + int identifier: @name_ref ref +); + +#keyset[id] +path_segment_parenthesized_arg_lists( + int id: @path_segment ref, + int parenthesized_arg_list: @parenthesized_arg_list ref +); + +#keyset[id] +path_segment_ret_types( + int id: @path_segment ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +path_segment_return_type_syntaxes( + int id: @path_segment ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +path_segment_type_reprs( + int id: @path_segment ref, + int type_repr: @type_repr ref +); + +#keyset[id] +path_segment_trait_type_reprs( + int id: @path_segment ref, + int trait_type_repr: @path_type_repr ref +); + +renames( + unique int id: @rename +); + +#keyset[id] +rename_names( + int id: @rename ref, + int name: @name ref +); + +ret_type_reprs( + unique int id: @ret_type_repr +); + +#keyset[id] +ret_type_repr_type_reprs( + int id: @ret_type_repr ref, + int type_repr: @type_repr ref +); + +return_type_syntaxes( + unique int id: @return_type_syntax +); + +source_files( + unique int id: @source_file +); + +#keyset[id, index] +source_file_attrs( + int id: @source_file ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +source_file_items( + int id: @source_file ref, + int index: int ref, + int item: @item ref +); + +@stmt = + @expr_stmt +| @item +| @let_stmt +; + +stmt_lists( + unique int id: @stmt_list +); + +#keyset[id, index] +stmt_list_attrs( + int id: @stmt_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +stmt_list_statements( + int id: @stmt_list ref, + int index: int ref, + int statement: @stmt ref +); + +#keyset[id] +stmt_list_tail_exprs( + int id: @stmt_list ref, + int tail_expr: @expr ref +); + +struct_expr_fields( + unique int id: @struct_expr_field +); + +#keyset[id, index] +struct_expr_field_attrs( + int id: @struct_expr_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_expr_field_exprs( + int id: @struct_expr_field ref, + int expr: @expr ref +); + +#keyset[id] +struct_expr_field_identifiers( + int id: @struct_expr_field ref, + int identifier: @name_ref ref +); + +struct_expr_field_lists( + unique int id: @struct_expr_field_list +); + +#keyset[id, index] +struct_expr_field_list_attrs( + int id: @struct_expr_field_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +struct_expr_field_list_fields( + int id: @struct_expr_field_list ref, + int index: int ref, + int field: @struct_expr_field ref +); + +#keyset[id] +struct_expr_field_list_spreads( + int id: @struct_expr_field_list ref, + int spread: @expr ref +); + +struct_fields( + unique int id: @struct_field +); + +#keyset[id, index] +struct_field_attrs( + int id: @struct_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_field_defaults( + int id: @struct_field ref, + int default: @expr ref +); + +#keyset[id] +struct_field_is_unsafe( + int id: @struct_field ref +); + +#keyset[id] +struct_field_names( + int id: @struct_field ref, + int name: @name ref +); + +#keyset[id] +struct_field_type_reprs( + int id: @struct_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +struct_field_visibilities( + int id: @struct_field ref, + int visibility: @visibility ref +); + +struct_pat_fields( + unique int id: @struct_pat_field +); + +#keyset[id, index] +struct_pat_field_attrs( + int id: @struct_pat_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_pat_field_identifiers( + int id: @struct_pat_field ref, + int identifier: @name_ref ref +); + +#keyset[id] +struct_pat_field_pats( + int id: @struct_pat_field ref, + int pat: @pat ref +); + +struct_pat_field_lists( + unique int id: @struct_pat_field_list +); + +#keyset[id, index] +struct_pat_field_list_fields( + int id: @struct_pat_field_list ref, + int index: int ref, + int field: @struct_pat_field ref +); + +#keyset[id] +struct_pat_field_list_rest_pats( + int id: @struct_pat_field_list ref, + int rest_pat: @rest_pat ref +); + +@token = + @comment +; + +token_trees( + unique int id: @token_tree +); + +tuple_fields( + unique int id: @tuple_field +); + +#keyset[id, index] +tuple_field_attrs( + int id: @tuple_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +tuple_field_type_reprs( + int id: @tuple_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +tuple_field_visibilities( + int id: @tuple_field ref, + int visibility: @visibility ref +); + +type_bounds( + unique int id: @type_bound +); + +#keyset[id] +type_bound_for_binders( + int id: @type_bound ref, + int for_binder: @for_binder ref +); + +#keyset[id] +type_bound_is_async( + int id: @type_bound ref +); + +#keyset[id] +type_bound_is_const( + int id: @type_bound ref +); + +#keyset[id] +type_bound_lifetimes( + int id: @type_bound ref, + int lifetime: @lifetime ref +); + +#keyset[id] +type_bound_type_reprs( + int id: @type_bound ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_bound_use_bound_generic_args( + int id: @type_bound ref, + int use_bound_generic_args: @use_bound_generic_args ref +); + +type_bound_lists( + unique int id: @type_bound_list +); + +#keyset[id, index] +type_bound_list_bounds( + int id: @type_bound_list ref, + int index: int ref, + int bound: @type_bound ref +); + +@type_repr = + @array_type_repr +| @dyn_trait_type_repr +| @fn_ptr_type_repr +| @for_type_repr +| @impl_trait_type_repr +| @infer_type_repr +| @macro_type_repr +| @never_type_repr +| @paren_type_repr +| @path_type_repr +| @ptr_type_repr +| @ref_type_repr +| @slice_type_repr +| @tuple_type_repr +; + +@use_bound_generic_arg = + @lifetime +| @name_ref +; + +use_bound_generic_args( + unique int id: @use_bound_generic_args +); + +#keyset[id, index] +use_bound_generic_args_use_bound_generic_args( + int id: @use_bound_generic_args ref, + int index: int ref, + int use_bound_generic_arg: @use_bound_generic_arg ref +); + +use_trees( + unique int id: @use_tree +); + +#keyset[id] +use_tree_is_glob( + int id: @use_tree ref +); + +#keyset[id] +use_tree_paths( + int id: @use_tree ref, + int path: @path ref +); + +#keyset[id] +use_tree_renames( + int id: @use_tree ref, + int rename: @rename ref +); + +#keyset[id] +use_tree_use_tree_lists( + int id: @use_tree ref, + int use_tree_list: @use_tree_list ref +); + +use_tree_lists( + unique int id: @use_tree_list +); + +#keyset[id, index] +use_tree_list_use_trees( + int id: @use_tree_list ref, + int index: int ref, + int use_tree: @use_tree ref +); + +variant_lists( + unique int id: @variant_list +); + +#keyset[id, index] +variant_list_variants( + int id: @variant_list ref, + int index: int ref, + int variant: @variant ref +); + +visibilities( + unique int id: @visibility +); + +#keyset[id] +visibility_paths( + int id: @visibility ref, + int path: @path ref +); + +where_clauses( + unique int id: @where_clause +); + +#keyset[id, index] +where_clause_predicates( + int id: @where_clause ref, + int index: int ref, + int predicate: @where_pred ref +); + +where_preds( + unique int id: @where_pred +); + +#keyset[id] +where_pred_for_binders( + int id: @where_pred ref, + int for_binder: @for_binder ref +); + +#keyset[id] +where_pred_lifetimes( + int id: @where_pred ref, + int lifetime: @lifetime ref +); + +#keyset[id] +where_pred_type_reprs( + int id: @where_pred ref, + int type_repr: @type_repr ref +); + +#keyset[id] +where_pred_type_bound_lists( + int id: @where_pred ref, + int type_bound_list: @type_bound_list ref +); + +array_expr_internals( + unique int id: @array_expr_internal +); + +#keyset[id, index] +array_expr_internal_attrs( + int id: @array_expr_internal ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +array_expr_internal_exprs( + int id: @array_expr_internal ref, + int index: int ref, + int expr: @expr ref +); + +#keyset[id] +array_expr_internal_is_semicolon( + int id: @array_expr_internal ref +); + +array_type_reprs( + unique int id: @array_type_repr +); + +#keyset[id] +array_type_repr_const_args( + int id: @array_type_repr ref, + int const_arg: @const_arg ref +); + +#keyset[id] +array_type_repr_element_type_reprs( + int id: @array_type_repr ref, + int element_type_repr: @type_repr ref +); + +asm_clobber_abis( + unique int id: @asm_clobber_abi +); + +asm_consts( + unique int id: @asm_const +); + +#keyset[id] +asm_const_exprs( + int id: @asm_const ref, + int expr: @expr ref +); + +#keyset[id] +asm_const_is_const( + int id: @asm_const ref +); + +asm_labels( + unique int id: @asm_label +); + +#keyset[id] +asm_label_block_exprs( + int id: @asm_label ref, + int block_expr: @block_expr ref +); + +asm_operand_nameds( + unique int id: @asm_operand_named +); + +#keyset[id] +asm_operand_named_asm_operands( + int id: @asm_operand_named ref, + int asm_operand: @asm_operand ref +); + +#keyset[id] +asm_operand_named_names( + int id: @asm_operand_named ref, + int name: @name ref +); + +asm_options_lists( + unique int id: @asm_options_list +); + +#keyset[id, index] +asm_options_list_asm_options( + int id: @asm_options_list ref, + int index: int ref, + int asm_option: @asm_option ref +); + +asm_reg_operands( + unique int id: @asm_reg_operand +); + +#keyset[id] +asm_reg_operand_asm_dir_specs( + int id: @asm_reg_operand ref, + int asm_dir_spec: @asm_dir_spec ref +); + +#keyset[id] +asm_reg_operand_asm_operand_exprs( + int id: @asm_reg_operand ref, + int asm_operand_expr: @asm_operand_expr ref +); + +#keyset[id] +asm_reg_operand_asm_reg_specs( + int id: @asm_reg_operand ref, + int asm_reg_spec: @asm_reg_spec ref +); + +asm_syms( + unique int id: @asm_sym +); + +#keyset[id] +asm_sym_paths( + int id: @asm_sym ref, + int path: @path ref +); + +assoc_type_args( + unique int id: @assoc_type_arg +); + +#keyset[id] +assoc_type_arg_const_args( + int id: @assoc_type_arg ref, + int const_arg: @const_arg ref +); + +#keyset[id] +assoc_type_arg_generic_arg_lists( + int id: @assoc_type_arg ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +assoc_type_arg_identifiers( + int id: @assoc_type_arg ref, + int identifier: @name_ref ref +); + +#keyset[id] +assoc_type_arg_param_lists( + int id: @assoc_type_arg ref, + int param_list: @param_list ref +); + +#keyset[id] +assoc_type_arg_ret_types( + int id: @assoc_type_arg ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +assoc_type_arg_return_type_syntaxes( + int id: @assoc_type_arg ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +assoc_type_arg_type_reprs( + int id: @assoc_type_arg ref, + int type_repr: @type_repr ref +); + +#keyset[id] +assoc_type_arg_type_bound_lists( + int id: @assoc_type_arg ref, + int type_bound_list: @type_bound_list ref +); + +await_exprs( + unique int id: @await_expr +); + +#keyset[id, index] +await_expr_attrs( + int id: @await_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +await_expr_exprs( + int id: @await_expr ref, + int expr: @expr ref +); + +become_exprs( + unique int id: @become_expr +); + +#keyset[id, index] +become_expr_attrs( + int id: @become_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +become_expr_exprs( + int id: @become_expr ref, + int expr: @expr ref +); + +binary_exprs( + unique int id: @binary_expr +); + +#keyset[id, index] +binary_expr_attrs( + int id: @binary_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +binary_expr_lhs( + int id: @binary_expr ref, + int lhs: @expr ref +); + +#keyset[id] +binary_expr_operator_names( + int id: @binary_expr ref, + string operator_name: string ref +); + +#keyset[id] +binary_expr_rhs( + int id: @binary_expr ref, + int rhs: @expr ref +); + +box_pats( + unique int id: @box_pat +); + +#keyset[id] +box_pat_pats( + int id: @box_pat ref, + int pat: @pat ref +); + +break_exprs( + unique int id: @break_expr +); + +#keyset[id, index] +break_expr_attrs( + int id: @break_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +break_expr_exprs( + int id: @break_expr ref, + int expr: @expr ref +); + +#keyset[id] +break_expr_lifetimes( + int id: @break_expr ref, + int lifetime: @lifetime ref +); + +call_exprs( + unique int id: @call_expr +); + +#keyset[id] +call_expr_arg_lists( + int id: @call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +call_expr_attrs( + int id: @call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +call_expr_functions( + int id: @call_expr ref, + int function: @expr ref +); + +cast_exprs( + unique int id: @cast_expr +); + +#keyset[id, index] +cast_expr_attrs( + int id: @cast_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +cast_expr_exprs( + int id: @cast_expr ref, + int expr: @expr ref +); + +#keyset[id] +cast_expr_type_reprs( + int id: @cast_expr ref, + int type_repr: @type_repr ref +); + +closure_exprs( + unique int id: @closure_expr +); + +#keyset[id] +closure_expr_closure_bodies( + int id: @closure_expr ref, + int closure_body: @expr ref +); + +#keyset[id] +closure_expr_for_binders( + int id: @closure_expr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +closure_expr_is_async( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_const( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_gen( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_move( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_static( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_ret_types( + int id: @closure_expr ref, + int ret_type: @ret_type_repr ref +); + +comments( + unique int id: @comment, + int parent: @ast_node ref, + string text: string ref +); + +const_args( + unique int id: @const_arg +); + +#keyset[id] +const_arg_exprs( + int id: @const_arg ref, + int expr: @expr ref +); + +const_block_pats( + unique int id: @const_block_pat +); + +#keyset[id] +const_block_pat_block_exprs( + int id: @const_block_pat ref, + int block_expr: @block_expr ref +); + +#keyset[id] +const_block_pat_is_const( + int id: @const_block_pat ref +); + +const_params( + unique int id: @const_param +); + +#keyset[id, index] +const_param_attrs( + int id: @const_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_param_default_vals( + int id: @const_param ref, + int default_val: @const_arg ref +); + +#keyset[id] +const_param_is_const( + int id: @const_param ref +); + +#keyset[id] +const_param_names( + int id: @const_param ref, + int name: @name ref +); + +#keyset[id] +const_param_type_reprs( + int id: @const_param ref, + int type_repr: @type_repr ref +); + +continue_exprs( + unique int id: @continue_expr +); + +#keyset[id, index] +continue_expr_attrs( + int id: @continue_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +continue_expr_lifetimes( + int id: @continue_expr ref, + int lifetime: @lifetime ref +); + +dyn_trait_type_reprs( + unique int id: @dyn_trait_type_repr +); + +#keyset[id] +dyn_trait_type_repr_type_bound_lists( + int id: @dyn_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +expr_stmts( + unique int id: @expr_stmt +); + +#keyset[id] +expr_stmt_exprs( + int id: @expr_stmt ref, + int expr: @expr ref +); + +field_exprs( + unique int id: @field_expr +); + +#keyset[id, index] +field_expr_attrs( + int id: @field_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +field_expr_containers( + int id: @field_expr ref, + int container: @expr ref +); + +#keyset[id] +field_expr_identifiers( + int id: @field_expr ref, + int identifier: @name_ref ref +); + +fn_ptr_type_reprs( + unique int id: @fn_ptr_type_repr +); + +#keyset[id] +fn_ptr_type_repr_abis( + int id: @fn_ptr_type_repr ref, + int abi: @abi ref +); + +#keyset[id] +fn_ptr_type_repr_is_async( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_const( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_unsafe( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_param_lists( + int id: @fn_ptr_type_repr ref, + int param_list: @param_list ref +); + +#keyset[id] +fn_ptr_type_repr_ret_types( + int id: @fn_ptr_type_repr ref, + int ret_type: @ret_type_repr ref +); + +for_type_reprs( + unique int id: @for_type_repr +); + +#keyset[id] +for_type_repr_for_binders( + int id: @for_type_repr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +for_type_repr_type_reprs( + int id: @for_type_repr ref, + int type_repr: @type_repr ref +); + +format_args_exprs( + unique int id: @format_args_expr +); + +#keyset[id, index] +format_args_expr_args( + int id: @format_args_expr ref, + int index: int ref, + int arg: @format_args_arg ref +); + +#keyset[id, index] +format_args_expr_attrs( + int id: @format_args_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +format_args_expr_templates( + int id: @format_args_expr ref, + int template: @expr ref +); + +ident_pats( + unique int id: @ident_pat +); + +#keyset[id, index] +ident_pat_attrs( + int id: @ident_pat ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ident_pat_is_mut( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_is_ref( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_names( + int id: @ident_pat ref, + int name: @name ref +); + +#keyset[id] +ident_pat_pats( + int id: @ident_pat ref, + int pat: @pat ref +); + +if_exprs( + unique int id: @if_expr +); + +#keyset[id, index] +if_expr_attrs( + int id: @if_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +if_expr_conditions( + int id: @if_expr ref, + int condition: @expr ref +); + +#keyset[id] +if_expr_elses( + int id: @if_expr ref, + int else: @expr ref +); + +#keyset[id] +if_expr_thens( + int id: @if_expr ref, + int then: @block_expr ref +); + +impl_trait_type_reprs( + unique int id: @impl_trait_type_repr +); + +#keyset[id] +impl_trait_type_repr_type_bound_lists( + int id: @impl_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +index_exprs( + unique int id: @index_expr +); + +#keyset[id, index] +index_expr_attrs( + int id: @index_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +index_expr_bases( + int id: @index_expr ref, + int base: @expr ref +); + +#keyset[id] +index_expr_indices( + int id: @index_expr ref, + int index: @expr ref +); + +infer_type_reprs( + unique int id: @infer_type_repr +); + +@item = + @asm_expr +| @assoc_item +| @extern_block +| @extern_crate +| @extern_item +| @impl +| @macro_def +| @macro_rules +| @module +| @trait +| @trait_alias +| @type_item +| @use +; + +#keyset[id] +item_attribute_macro_expansions( + int id: @item ref, + int attribute_macro_expansion: @macro_items ref +); + +@labelable_expr = + @block_expr +| @looping_expr +; + +#keyset[id] +labelable_expr_labels( + int id: @labelable_expr ref, + int label: @label ref +); + +let_exprs( + unique int id: @let_expr +); + +#keyset[id, index] +let_expr_attrs( + int id: @let_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_expr_scrutinees( + int id: @let_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +let_expr_pats( + int id: @let_expr ref, + int pat: @pat ref +); + +let_stmts( + unique int id: @let_stmt +); + +#keyset[id, index] +let_stmt_attrs( + int id: @let_stmt ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_stmt_initializers( + int id: @let_stmt ref, + int initializer: @expr ref +); + +#keyset[id] +let_stmt_let_elses( + int id: @let_stmt ref, + int let_else: @let_else ref +); + +#keyset[id] +let_stmt_pats( + int id: @let_stmt ref, + int pat: @pat ref +); + +#keyset[id] +let_stmt_type_reprs( + int id: @let_stmt ref, + int type_repr: @type_repr ref +); + +lifetimes( + unique int id: @lifetime +); + +#keyset[id] +lifetime_texts( + int id: @lifetime ref, + string text: string ref +); + +lifetime_args( + unique int id: @lifetime_arg +); + +#keyset[id] +lifetime_arg_lifetimes( + int id: @lifetime_arg ref, + int lifetime: @lifetime ref +); + +lifetime_params( + unique int id: @lifetime_param +); + +#keyset[id, index] +lifetime_param_attrs( + int id: @lifetime_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +lifetime_param_lifetimes( + int id: @lifetime_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +lifetime_param_type_bound_lists( + int id: @lifetime_param ref, + int type_bound_list: @type_bound_list ref +); + +literal_exprs( + unique int id: @literal_expr +); + +#keyset[id, index] +literal_expr_attrs( + int id: @literal_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +literal_expr_text_values( + int id: @literal_expr ref, + string text_value: string ref +); + +literal_pats( + unique int id: @literal_pat +); + +#keyset[id] +literal_pat_literals( + int id: @literal_pat ref, + int literal: @literal_expr ref +); + +macro_exprs( + unique int id: @macro_expr +); + +#keyset[id] +macro_expr_macro_calls( + int id: @macro_expr ref, + int macro_call: @macro_call ref +); + +macro_pats( + unique int id: @macro_pat +); + +#keyset[id] +macro_pat_macro_calls( + int id: @macro_pat ref, + int macro_call: @macro_call ref +); + +macro_type_reprs( + unique int id: @macro_type_repr +); + +#keyset[id] +macro_type_repr_macro_calls( + int id: @macro_type_repr ref, + int macro_call: @macro_call ref +); + +match_exprs( + unique int id: @match_expr +); + +#keyset[id, index] +match_expr_attrs( + int id: @match_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_expr_scrutinees( + int id: @match_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +match_expr_match_arm_lists( + int id: @match_expr ref, + int match_arm_list: @match_arm_list ref +); + +method_call_exprs( + unique int id: @method_call_expr +); + +#keyset[id] +method_call_expr_arg_lists( + int id: @method_call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +method_call_expr_attrs( + int id: @method_call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +method_call_expr_generic_arg_lists( + int id: @method_call_expr ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +method_call_expr_identifiers( + int id: @method_call_expr ref, + int identifier: @name_ref ref +); + +#keyset[id] +method_call_expr_receivers( + int id: @method_call_expr ref, + int receiver: @expr ref +); + +name_refs( + unique int id: @name_ref +); + +#keyset[id] +name_ref_texts( + int id: @name_ref ref, + string text: string ref +); + +never_type_reprs( + unique int id: @never_type_repr +); + +offset_of_exprs( + unique int id: @offset_of_expr +); + +#keyset[id, index] +offset_of_expr_attrs( + int id: @offset_of_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +offset_of_expr_fields( + int id: @offset_of_expr ref, + int index: int ref, + int field: @name_ref ref +); + +#keyset[id] +offset_of_expr_type_reprs( + int id: @offset_of_expr ref, + int type_repr: @type_repr ref +); + +or_pats( + unique int id: @or_pat +); + +#keyset[id, index] +or_pat_pats( + int id: @or_pat ref, + int index: int ref, + int pat: @pat ref +); + +params( + unique int id: @param +); + +#keyset[id] +param_pats( + int id: @param ref, + int pat: @pat ref +); + +paren_exprs( + unique int id: @paren_expr +); + +#keyset[id, index] +paren_expr_attrs( + int id: @paren_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +paren_expr_exprs( + int id: @paren_expr ref, + int expr: @expr ref +); + +paren_pats( + unique int id: @paren_pat +); + +#keyset[id] +paren_pat_pats( + int id: @paren_pat ref, + int pat: @pat ref +); + +paren_type_reprs( + unique int id: @paren_type_repr +); + +#keyset[id] +paren_type_repr_type_reprs( + int id: @paren_type_repr ref, + int type_repr: @type_repr ref +); + +@path_expr_base = + @path_expr +; + +path_pats( + unique int id: @path_pat +); + +path_type_reprs( + unique int id: @path_type_repr +); + +#keyset[id] +path_type_repr_paths( + int id: @path_type_repr ref, + int path: @path ref +); + +prefix_exprs( + unique int id: @prefix_expr +); + +#keyset[id, index] +prefix_expr_attrs( + int id: @prefix_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +prefix_expr_exprs( + int id: @prefix_expr ref, + int expr: @expr ref +); + +#keyset[id] +prefix_expr_operator_names( + int id: @prefix_expr ref, + string operator_name: string ref +); + +ptr_type_reprs( + unique int id: @ptr_type_repr +); + +#keyset[id] +ptr_type_repr_is_const( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_is_mut( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_type_reprs( + int id: @ptr_type_repr ref, + int type_repr: @type_repr ref +); + +range_exprs( + unique int id: @range_expr +); + +#keyset[id, index] +range_expr_attrs( + int id: @range_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +range_expr_ends( + int id: @range_expr ref, + int end: @expr ref +); + +#keyset[id] +range_expr_operator_names( + int id: @range_expr ref, + string operator_name: string ref +); + +#keyset[id] +range_expr_starts( + int id: @range_expr ref, + int start: @expr ref +); + +range_pats( + unique int id: @range_pat +); + +#keyset[id] +range_pat_ends( + int id: @range_pat ref, + int end: @pat ref +); + +#keyset[id] +range_pat_operator_names( + int id: @range_pat ref, + string operator_name: string ref +); + +#keyset[id] +range_pat_starts( + int id: @range_pat ref, + int start: @pat ref +); + +ref_exprs( + unique int id: @ref_expr +); + +#keyset[id, index] +ref_expr_attrs( + int id: @ref_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ref_expr_exprs( + int id: @ref_expr ref, + int expr: @expr ref +); + +#keyset[id] +ref_expr_is_const( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_mut( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_raw( + int id: @ref_expr ref +); + +ref_pats( + unique int id: @ref_pat +); + +#keyset[id] +ref_pat_is_mut( + int id: @ref_pat ref +); + +#keyset[id] +ref_pat_pats( + int id: @ref_pat ref, + int pat: @pat ref +); + +ref_type_reprs( + unique int id: @ref_type_repr +); + +#keyset[id] +ref_type_repr_is_mut( + int id: @ref_type_repr ref +); + +#keyset[id] +ref_type_repr_lifetimes( + int id: @ref_type_repr ref, + int lifetime: @lifetime ref +); + +#keyset[id] +ref_type_repr_type_reprs( + int id: @ref_type_repr ref, + int type_repr: @type_repr ref +); + +rest_pats( + unique int id: @rest_pat +); + +#keyset[id, index] +rest_pat_attrs( + int id: @rest_pat ref, + int index: int ref, + int attr: @attr ref +); + +return_exprs( + unique int id: @return_expr +); + +#keyset[id, index] +return_expr_attrs( + int id: @return_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +return_expr_exprs( + int id: @return_expr ref, + int expr: @expr ref +); + +self_params( + unique int id: @self_param +); + +#keyset[id] +self_param_is_ref( + int id: @self_param ref +); + +#keyset[id] +self_param_is_mut( + int id: @self_param ref +); + +#keyset[id] +self_param_lifetimes( + int id: @self_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +self_param_names( + int id: @self_param ref, + int name: @name ref +); + +slice_pats( + unique int id: @slice_pat +); + +#keyset[id, index] +slice_pat_pats( + int id: @slice_pat ref, + int index: int ref, + int pat: @pat ref +); + +slice_type_reprs( + unique int id: @slice_type_repr +); + +#keyset[id] +slice_type_repr_type_reprs( + int id: @slice_type_repr ref, + int type_repr: @type_repr ref +); + +struct_exprs( + unique int id: @struct_expr +); + +#keyset[id] +struct_expr_struct_expr_field_lists( + int id: @struct_expr ref, + int struct_expr_field_list: @struct_expr_field_list ref +); + +struct_field_lists( + unique int id: @struct_field_list +); + +#keyset[id, index] +struct_field_list_fields( + int id: @struct_field_list ref, + int index: int ref, + int field: @struct_field ref +); + +struct_pats( + unique int id: @struct_pat +); + +#keyset[id] +struct_pat_struct_pat_field_lists( + int id: @struct_pat ref, + int struct_pat_field_list: @struct_pat_field_list ref +); + +try_exprs( + unique int id: @try_expr +); + +#keyset[id, index] +try_expr_attrs( + int id: @try_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +try_expr_exprs( + int id: @try_expr ref, + int expr: @expr ref +); + +tuple_exprs( + unique int id: @tuple_expr +); + +#keyset[id, index] +tuple_expr_attrs( + int id: @tuple_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +tuple_expr_fields( + int id: @tuple_expr ref, + int index: int ref, + int field: @expr ref +); + +tuple_field_lists( + unique int id: @tuple_field_list +); + +#keyset[id, index] +tuple_field_list_fields( + int id: @tuple_field_list ref, + int index: int ref, + int field: @tuple_field ref +); + +tuple_pats( + unique int id: @tuple_pat +); + +#keyset[id, index] +tuple_pat_fields( + int id: @tuple_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_struct_pats( + unique int id: @tuple_struct_pat +); + +#keyset[id, index] +tuple_struct_pat_fields( + int id: @tuple_struct_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_type_reprs( + unique int id: @tuple_type_repr +); + +#keyset[id, index] +tuple_type_repr_fields( + int id: @tuple_type_repr ref, + int index: int ref, + int field: @type_repr ref +); + +type_args( + unique int id: @type_arg +); + +#keyset[id] +type_arg_type_reprs( + int id: @type_arg ref, + int type_repr: @type_repr ref +); + +type_params( + unique int id: @type_param +); + +#keyset[id, index] +type_param_attrs( + int id: @type_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_param_default_types( + int id: @type_param ref, + int default_type: @type_repr ref +); + +#keyset[id] +type_param_names( + int id: @type_param ref, + int name: @name ref +); + +#keyset[id] +type_param_type_bound_lists( + int id: @type_param ref, + int type_bound_list: @type_bound_list ref +); + +underscore_exprs( + unique int id: @underscore_expr +); + +#keyset[id, index] +underscore_expr_attrs( + int id: @underscore_expr ref, + int index: int ref, + int attr: @attr ref +); + +variants( + unique int id: @variant +); + +#keyset[id, index] +variant_attrs( + int id: @variant ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +variant_discriminants( + int id: @variant ref, + int discriminant: @expr ref +); + +#keyset[id] +variant_field_lists( + int id: @variant ref, + int field_list: @field_list ref +); + +#keyset[id] +variant_names( + int id: @variant ref, + int name: @name ref +); + +#keyset[id] +variant_visibilities( + int id: @variant ref, + int visibility: @visibility ref +); + +wildcard_pats( + unique int id: @wildcard_pat +); + +yeet_exprs( + unique int id: @yeet_expr +); + +#keyset[id, index] +yeet_expr_attrs( + int id: @yeet_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yeet_expr_exprs( + int id: @yeet_expr ref, + int expr: @expr ref +); + +yield_exprs( + unique int id: @yield_expr +); + +#keyset[id, index] +yield_expr_attrs( + int id: @yield_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yield_expr_exprs( + int id: @yield_expr ref, + int expr: @expr ref +); + +asm_exprs( + unique int id: @asm_expr +); + +#keyset[id, index] +asm_expr_asm_pieces( + int id: @asm_expr ref, + int index: int ref, + int asm_piece: @asm_piece ref +); + +#keyset[id, index] +asm_expr_attrs( + int id: @asm_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +asm_expr_templates( + int id: @asm_expr ref, + int index: int ref, + int template: @expr ref +); + +@assoc_item = + @const +| @function +| @macro_call +| @type_alias +; + +block_exprs( + unique int id: @block_expr +); + +#keyset[id, index] +block_expr_attrs( + int id: @block_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +block_expr_is_async( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_const( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_gen( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_move( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_try( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_unsafe( + int id: @block_expr ref +); + +#keyset[id] +block_expr_stmt_lists( + int id: @block_expr ref, + int stmt_list: @stmt_list ref +); + +extern_blocks( + unique int id: @extern_block +); + +#keyset[id] +extern_block_abis( + int id: @extern_block ref, + int abi: @abi ref +); + +#keyset[id, index] +extern_block_attrs( + int id: @extern_block ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_block_extern_item_lists( + int id: @extern_block ref, + int extern_item_list: @extern_item_list ref +); + +#keyset[id] +extern_block_is_unsafe( + int id: @extern_block ref +); + +extern_crates( + unique int id: @extern_crate +); + +#keyset[id, index] +extern_crate_attrs( + int id: @extern_crate ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_crate_identifiers( + int id: @extern_crate ref, + int identifier: @name_ref ref +); + +#keyset[id] +extern_crate_renames( + int id: @extern_crate ref, + int rename: @rename ref +); + +#keyset[id] +extern_crate_visibilities( + int id: @extern_crate ref, + int visibility: @visibility ref +); + +@extern_item = + @function +| @macro_call +| @static +| @type_alias +; + +impls( + unique int id: @impl +); + +#keyset[id] +impl_assoc_item_lists( + int id: @impl ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +impl_attrs( + int id: @impl ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +impl_generic_param_lists( + int id: @impl ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +impl_is_const( + int id: @impl ref +); + +#keyset[id] +impl_is_default( + int id: @impl ref +); + +#keyset[id] +impl_is_unsafe( + int id: @impl ref +); + +#keyset[id] +impl_self_ties( + int id: @impl ref, + int self_ty: @type_repr ref +); + +#keyset[id] +impl_traits( + int id: @impl ref, + int trait: @type_repr ref +); + +#keyset[id] +impl_visibilities( + int id: @impl ref, + int visibility: @visibility ref +); + +#keyset[id] +impl_where_clauses( + int id: @impl ref, + int where_clause: @where_clause ref +); + +@looping_expr = + @for_expr +| @loop_expr +| @while_expr +; + +#keyset[id] +looping_expr_loop_bodies( + int id: @looping_expr ref, + int loop_body: @block_expr ref +); + +macro_defs( + unique int id: @macro_def +); + +#keyset[id] +macro_def_args( + int id: @macro_def ref, + int args: @token_tree ref +); + +#keyset[id, index] +macro_def_attrs( + int id: @macro_def ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_def_bodies( + int id: @macro_def ref, + int body: @token_tree ref +); + +#keyset[id] +macro_def_names( + int id: @macro_def ref, + int name: @name ref +); + +#keyset[id] +macro_def_visibilities( + int id: @macro_def ref, + int visibility: @visibility ref +); + +macro_rules( + unique int id: @macro_rules +); + +#keyset[id, index] +macro_rules_attrs( + int id: @macro_rules ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_rules_names( + int id: @macro_rules ref, + int name: @name ref +); + +#keyset[id] +macro_rules_token_trees( + int id: @macro_rules ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_rules_visibilities( + int id: @macro_rules ref, + int visibility: @visibility ref +); + +modules( + unique int id: @module +); + +#keyset[id, index] +module_attrs( + int id: @module ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +module_item_lists( + int id: @module ref, + int item_list: @item_list ref +); + +#keyset[id] +module_names( + int id: @module ref, + int name: @name ref +); + +#keyset[id] +module_visibilities( + int id: @module ref, + int visibility: @visibility ref +); + +path_exprs( + unique int id: @path_expr +); + +#keyset[id, index] +path_expr_attrs( + int id: @path_expr ref, + int index: int ref, + int attr: @attr ref +); + +traits( + unique int id: @trait +); + +#keyset[id] +trait_assoc_item_lists( + int id: @trait ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +trait_attrs( + int id: @trait ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_generic_param_lists( + int id: @trait ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_is_auto( + int id: @trait ref +); + +#keyset[id] +trait_is_unsafe( + int id: @trait ref +); + +#keyset[id] +trait_names( + int id: @trait ref, + int name: @name ref +); + +#keyset[id] +trait_type_bound_lists( + int id: @trait ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_visibilities( + int id: @trait ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_where_clauses( + int id: @trait ref, + int where_clause: @where_clause ref +); + +trait_aliases( + unique int id: @trait_alias +); + +#keyset[id, index] +trait_alias_attrs( + int id: @trait_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_alias_generic_param_lists( + int id: @trait_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_alias_names( + int id: @trait_alias ref, + int name: @name ref +); + +#keyset[id] +trait_alias_type_bound_lists( + int id: @trait_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_alias_visibilities( + int id: @trait_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_alias_where_clauses( + int id: @trait_alias ref, + int where_clause: @where_clause ref +); + +@type_item = + @enum +| @struct +| @union +; + +#keyset[id, index] +type_item_derive_macro_expansions( + int id: @type_item ref, + int index: int ref, + int derive_macro_expansion: @macro_items ref +); + +#keyset[id, index] +type_item_attrs( + int id: @type_item ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_item_generic_param_lists( + int id: @type_item ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_item_names( + int id: @type_item ref, + int name: @name ref +); + +#keyset[id] +type_item_visibilities( + int id: @type_item ref, + int visibility: @visibility ref +); + +#keyset[id] +type_item_where_clauses( + int id: @type_item ref, + int where_clause: @where_clause ref +); + +uses( + unique int id: @use +); + +#keyset[id, index] +use_attrs( + int id: @use ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +use_use_trees( + int id: @use ref, + int use_tree: @use_tree ref +); + +#keyset[id] +use_visibilities( + int id: @use ref, + int visibility: @visibility ref +); + +consts( + unique int id: @const +); + +#keyset[id, index] +const_attrs( + int id: @const ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_bodies( + int id: @const ref, + int body: @expr ref +); + +#keyset[id] +const_generic_param_lists( + int id: @const ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +const_is_const( + int id: @const ref +); + +#keyset[id] +const_is_default( + int id: @const ref +); + +#keyset[id] +const_names( + int id: @const ref, + int name: @name ref +); + +#keyset[id] +const_type_reprs( + int id: @const ref, + int type_repr: @type_repr ref +); + +#keyset[id] +const_visibilities( + int id: @const ref, + int visibility: @visibility ref +); + +#keyset[id] +const_where_clauses( + int id: @const ref, + int where_clause: @where_clause ref +); + +#keyset[id] +const_has_implementation( + int id: @const ref +); + +enums( + unique int id: @enum +); + +#keyset[id] +enum_variant_lists( + int id: @enum ref, + int variant_list: @variant_list ref +); + +for_exprs( + unique int id: @for_expr +); + +#keyset[id, index] +for_expr_attrs( + int id: @for_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +for_expr_iterables( + int id: @for_expr ref, + int iterable: @expr ref +); + +#keyset[id] +for_expr_pats( + int id: @for_expr ref, + int pat: @pat ref +); + +functions( + unique int id: @function +); + +#keyset[id] +function_abis( + int id: @function ref, + int abi: @abi ref +); + +#keyset[id] +function_function_bodies( + int id: @function ref, + int function_body: @block_expr ref +); + +#keyset[id] +function_generic_param_lists( + int id: @function ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +function_is_async( + int id: @function ref +); + +#keyset[id] +function_is_const( + int id: @function ref +); + +#keyset[id] +function_is_default( + int id: @function ref +); + +#keyset[id] +function_is_gen( + int id: @function ref +); + +#keyset[id] +function_is_unsafe( + int id: @function ref +); + +#keyset[id] +function_names( + int id: @function ref, + int name: @name ref +); + +#keyset[id] +function_ret_types( + int id: @function ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +function_visibilities( + int id: @function ref, + int visibility: @visibility ref +); + +#keyset[id] +function_where_clauses( + int id: @function ref, + int where_clause: @where_clause ref +); + +#keyset[id] +function_has_implementation( + int id: @function ref +); + +loop_exprs( + unique int id: @loop_expr +); + +#keyset[id, index] +loop_expr_attrs( + int id: @loop_expr ref, + int index: int ref, + int attr: @attr ref +); + +macro_calls( + unique int id: @macro_call +); + +#keyset[id, index] +macro_call_attrs( + int id: @macro_call ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_call_paths( + int id: @macro_call ref, + int path: @path ref +); + +#keyset[id] +macro_call_token_trees( + int id: @macro_call ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_call_macro_call_expansions( + int id: @macro_call ref, + int macro_call_expansion: @ast_node ref +); + +statics( + unique int id: @static +); + +#keyset[id, index] +static_attrs( + int id: @static ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +static_bodies( + int id: @static ref, + int body: @expr ref +); + +#keyset[id] +static_is_mut( + int id: @static ref +); + +#keyset[id] +static_is_static( + int id: @static ref +); + +#keyset[id] +static_is_unsafe( + int id: @static ref +); + +#keyset[id] +static_names( + int id: @static ref, + int name: @name ref +); + +#keyset[id] +static_type_reprs( + int id: @static ref, + int type_repr: @type_repr ref +); + +#keyset[id] +static_visibilities( + int id: @static ref, + int visibility: @visibility ref +); + +structs( + unique int id: @struct +); + +#keyset[id] +struct_field_lists_( + int id: @struct ref, + int field_list: @field_list ref +); + +type_aliases( + unique int id: @type_alias +); + +#keyset[id, index] +type_alias_attrs( + int id: @type_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_alias_generic_param_lists( + int id: @type_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_alias_is_default( + int id: @type_alias ref +); + +#keyset[id] +type_alias_names( + int id: @type_alias ref, + int name: @name ref +); + +#keyset[id] +type_alias_type_reprs( + int id: @type_alias ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_alias_type_bound_lists( + int id: @type_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +type_alias_visibilities( + int id: @type_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +type_alias_where_clauses( + int id: @type_alias ref, + int where_clause: @where_clause ref +); + +unions( + unique int id: @union +); + +#keyset[id] +union_struct_field_lists( + int id: @union ref, + int struct_field_list: @struct_field_list ref +); + +while_exprs( + unique int id: @while_expr +); + +#keyset[id, index] +while_expr_attrs( + int id: @while_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +while_expr_conditions( + int id: @while_expr ref, + int condition: @expr ref +); diff --git a/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.properties b/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.properties new file mode 100644 index 000000000000..6d4e1d708ba6 --- /dev/null +++ b/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.properties @@ -0,0 +1,29 @@ +description: Downgrade from rust-analyzer 0.0.328 to 0.0.301 +compatibility: partial + +format_args_arg_arg_names.rel: delete +format_args_arg_names.rel: delete +struct_field_default_vals.rel: delete +variant_const_args.rel: delete +try_block_modifiers.rel: delete +try_block_modifier_is_try.rel: delete +try_block_modifier_type_reprs.rel: delete +cfg_atoms.rel: delete +cfg_attr_meta.rel: delete +cfg_attr_meta_cfg_predicates.rel: delete +cfg_attr_meta_metas.rel: delete +cfg_composites.rel: delete +cfg_composite_cfg_predicates.rel: delete +cfg_meta.rel: delete +cfg_meta_cfg_predicates.rel: delete +key_value_meta.rel: delete +key_value_meta_exprs.rel: delete +key_value_meta_paths.rel: delete +path_meta.rel: delete +path_meta_paths.rel: delete +token_tree_meta.rel: delete +token_tree_meta_paths.rel: delete +token_tree_meta_token_trees.rel: delete +unsafe_meta.rel: delete +unsafe_meta_is_unsafe.rel: delete +unsafe_meta_meta.rel: delete diff --git a/rust/ql/lib/codeql/rust/elements/internal/FormatTemplateVariableAccessConstructor.qll b/rust/ql/lib/codeql/rust/elements/internal/FormatTemplateVariableAccessConstructor.qll index 40cb174a0710..95f01f85c953 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/FormatTemplateVariableAccessConstructor.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/FormatTemplateVariableAccessConstructor.qll @@ -35,8 +35,8 @@ private predicate formatArgsHasArg( } pragma[nomagic] -private predicate formatArgsHasArgName(Raw::FormatArgsExpr parent, string name) { - parent.getArg(_).getName().getText() = name +private predicate formatArgsHasArgName(Raw::FormatArgsExpr parent) { + exists(parent.getArg(_).getArgName()) } /** @@ -48,6 +48,6 @@ predicate unboundNamedFormatArgument( ) { exists(string name | formatArgsHasArg(parent, arg, name, index, kind) and - not formatArgsHasArgName(parent, name) + not formatArgsHasArgName(parent) ) } diff --git a/rust/ql/lib/codeql/rust/elements/internal/MetaImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/MetaImpl.qll index bbac494ed3c9..3c496845cec4 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/MetaImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/MetaImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `Meta`. * diff --git a/rust/ql/lib/codeql/rust/internal/Definitions.qll b/rust/ql/lib/codeql/rust/internal/Definitions.qll index aedcc3fc69c5..aa0c5146b41f 100644 --- a/rust/ql/lib/codeql/rust/internal/Definitions.qll +++ b/rust/ql/lib/codeql/rust/internal/Definitions.qll @@ -8,6 +8,7 @@ private import codeql.rust.elements.Variable private import codeql.rust.elements.Locatable private import codeql.rust.elements.FormatArgsExpr private import codeql.rust.elements.FormatArgsArg +private import codeql.rust.elements.FormatArgsArgName private import codeql.rust.elements.Format private import codeql.rust.elements.MacroCall private import codeql.rust.elements.NamedFormatArgument @@ -33,7 +34,7 @@ private module Cached { cached newtype TDef = TVariable(Variable v) or - TFormatArgsArgName(Name name) { name = any(FormatArgsArg a).getName() } or + TFormatArgsArgDef(FormatArgsArgName name) { name = any(FormatArgsArg a).getArgName() } or TFormatArgsArgIndex(Expr e) { e = any(FormatArgsArg a).getExpr() } or TItemNode(ItemNode i) @@ -58,7 +59,7 @@ class Definition extends Cached::TDef { /** Gets the location of this variable. */ Location getLocation() { result = this.asVariable().getLocation() or - result = this.asName().getLocation() or + result = this.asFormatArgsArgName().getLocation() or result = this.asExpr().getLocation() or result = this.asItemNode().getLocation() } @@ -66,8 +67,8 @@ class Definition extends Cached::TDef { /** Gets this definition as a `Variable` */ Variable asVariable() { this = Cached::TVariable(result) } - /** Gets this definition as a `Name` */ - Name asName() { this = Cached::TFormatArgsArgName(result) } + /** Gets this definition as a format argument name */ + FormatArgsArgName asFormatArgsArgName() { this = Cached::TFormatArgsArgDef(result) } /** Gets this definition as an `Expr` */ Expr asExpr() { this = Cached::TFormatArgsArgIndex(result) } @@ -79,7 +80,7 @@ class Definition extends Cached::TDef { string toString() { result = this.asExpr().toString() or result = this.asVariable().toString() or - result = this.asName().getText() or + result = this.asFormatArgsArgName().toString() or result = this.asItemNode().toString() } } @@ -95,17 +96,16 @@ private class LocalVariableUse extends Use instanceof VariableAccess { } private class NamedFormatArgumentUse extends Use instanceof NamedFormatArgument { - private Name def; + private FormatArgsArgName def; NamedFormatArgumentUse() { exists(FormatArgsExpr parent | parent = this.getParent().getParent() and - parent.getAnArg().getName() = def and - this.getName() = def.getText() + parent.getAnArg().getArgName() = def ) } - override Definition getDefinition() { result.asName() = def } + override Definition getDefinition() { result.asFormatArgsArgName() = def } override string getUseType() { result = "format argument" } } diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index 10d18786880b..1d5f090705a4 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -49,6 +49,20 @@ private import codeql.rust.internal.CachedStages private import codeql.rust.frameworks.stdlib.Builtins as Builtins private import codeql.util.Option +/** Gets the path of a `Meta` node, regardless of its concrete subtype. */ +pragma[nomagic] +private Path getMetaPath(Meta m) { + result = m.(PathMeta).getPath() + or + result = m.(KeyValueMeta).getPath() + or + result = m.(TokenTreeMeta).getPath() +} + +/** Gets the expression of a `Meta` node, regardless of its concrete subtype. */ +pragma[nomagic] +private Expr getMetaExpr(Meta m) { result = m.(KeyValueMeta).getExpr() } + private newtype TNamespace = TTypeNamespace() or TValueNamespace() or @@ -263,7 +277,7 @@ abstract class ItemNode extends Locatable { pragma[nomagic] final Attr getAttr(string name) { result = this.getAnAttr() and - result.getMeta().getPath().(PathExt).isUnqualified(name) + getMetaPath(result.getMeta()).(PathExt).isUnqualified(name) } final predicate hasAttr(string name) { exists(this.getAttr(name)) } @@ -1348,7 +1362,7 @@ private predicate fileModuleInlineLate(SourceFile f, string name, Folder folder) */ private Meta getPathAttrMeta(Module m) { result = m.getAnAttr().getMeta() and - result.getPath().getText() = "path" + getMetaPath(result).getText() = "path" } /** @@ -1412,7 +1426,7 @@ private predicate pathAttrImport(Folder f, Module m, string relativePath) { exists(Meta meta | f = m.getFile().getParentContainer() and meta = getPathAttrMeta(m) and - relativePath = meta.getExpr().(LiteralExpr).getTextValue().regexpCapture("\"(.+)\"", 1) + relativePath = getMetaExpr(meta).(LiteralExpr).getTextValue().regexpCapture("\"(.+)\"", 1) ) } @@ -1793,7 +1807,7 @@ private module DollarCrateResolution { or exists(ItemNode type | expansion = type.(TypeItem).getDeriveMacroExpansion(_) and - macroDefPath = type.getAttr("derive").getMeta().getPath() + macroDefPath = getMetaPath(type.getAttr("derive").getMeta()) ) } @@ -1952,7 +1966,7 @@ private predicate pathUsesNamespace(PathExt p, Namespace n) { ( p = any(MacroCall mc).getPath() or - p = any(Meta m).getPath() + p = getMetaPath(any(Meta m)) ) } diff --git a/rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/old.dbscheme b/rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/old.dbscheme new file mode 100644 index 000000000000..66a489863649 --- /dev/null +++ b/rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/old.dbscheme @@ -0,0 +1,3556 @@ +// generated by codegen, do not edit + +// from ../shared/tree-sitter-extractor/src/generator/prefix.dbscheme +/*- Files and folders -*/ + +/** + * The location of an element. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @file | @folder + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +/*- Empty location -*/ + +empty_location( + int location: @location_default ref +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/*- Diagnostic messages -*/ + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/*- Diagnostic messages: severity -*/ + +case @diagnostic.severity of + 10 = @diagnostic_debug +| 20 = @diagnostic_info +| 30 = @diagnostic_warning +| 40 = @diagnostic_error +; + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error; + +/*- Database metadata -*/ + +/** + * The CLI will automatically emit applicable tuples for this table, + * such as `databaseMetadata("isOverlay", "true")` when building an + * overlay database. + */ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +/*- Overlay support -*/ + +/** + * The CLI will automatically emit tuples for each new/modified/deleted file + * when building an overlay database. + */ +overlayChangedFiles( + string path: string ref +); + + +// from prefix.dbscheme +#keyset[id] +locatable_locations( + int id: @locatable ref, + int location: @location_default ref +); + + +// from schema + +@element = + @extractor_step +| @locatable +| @named_crate +| @unextracted +; + +extractor_steps( + unique int id: @extractor_step, + string action: string ref, + int duration_ms: int ref +); + +#keyset[id] +extractor_step_files( + int id: @extractor_step ref, + int file: @file ref +); + +@locatable = + @ast_node +| @crate +; + +named_crates( + unique int id: @named_crate, + string name: string ref, + int crate: @crate ref +); + +@unextracted = + @missing +| @unimplemented +; + +@ast_node = + @abi +| @addressable +| @arg_list +| @asm_dir_spec +| @asm_operand +| @asm_operand_expr +| @asm_option +| @asm_piece +| @asm_reg_spec +| @assoc_item_list +| @attr +| @callable +| @expr +| @extern_item_list +| @field_list +| @for_binder +| @format_args_arg +| @generic_arg +| @generic_arg_list +| @generic_param +| @generic_param_list +| @item_list +| @label +| @let_else +| @macro_items +| @match_arm +| @match_arm_list +| @match_guard +| @meta +| @name +| @param_base +| @param_list +| @parenthesized_arg_list +| @pat +| @path +| @path_ast_node +| @path_segment +| @rename +| @ret_type_repr +| @return_type_syntax +| @source_file +| @stmt +| @stmt_list +| @struct_expr_field +| @struct_expr_field_list +| @struct_field +| @struct_pat_field +| @struct_pat_field_list +| @token +| @token_tree +| @tuple_field +| @type_bound +| @type_bound_list +| @type_repr +| @use_bound_generic_arg +| @use_bound_generic_args +| @use_tree +| @use_tree_list +| @variant_list +| @visibility +| @where_clause +| @where_pred +; + +crates( + unique int id: @crate +); + +#keyset[id] +crate_names( + int id: @crate ref, + string name: string ref +); + +#keyset[id] +crate_versions( + int id: @crate ref, + string version: string ref +); + +#keyset[id, index] +crate_cfg_options( + int id: @crate ref, + int index: int ref, + string cfg_option: string ref +); + +#keyset[id, index] +crate_named_dependencies( + int id: @crate ref, + int index: int ref, + int named_dependency: @named_crate ref +); + +missings( + unique int id: @missing +); + +unimplementeds( + unique int id: @unimplemented +); + +abis( + unique int id: @abi +); + +#keyset[id] +abi_abi_strings( + int id: @abi ref, + string abi_string: string ref +); + +@addressable = + @item +| @variant +; + +arg_lists( + unique int id: @arg_list +); + +#keyset[id, index] +arg_list_args( + int id: @arg_list ref, + int index: int ref, + int arg: @expr ref +); + +asm_dir_specs( + unique int id: @asm_dir_spec +); + +@asm_operand = + @asm_const +| @asm_label +| @asm_reg_operand +| @asm_sym +; + +asm_operand_exprs( + unique int id: @asm_operand_expr +); + +#keyset[id] +asm_operand_expr_in_exprs( + int id: @asm_operand_expr ref, + int in_expr: @expr ref +); + +#keyset[id] +asm_operand_expr_out_exprs( + int id: @asm_operand_expr ref, + int out_expr: @expr ref +); + +asm_options( + unique int id: @asm_option +); + +#keyset[id] +asm_option_is_raw( + int id: @asm_option ref +); + +@asm_piece = + @asm_clobber_abi +| @asm_operand_named +| @asm_options_list +; + +asm_reg_specs( + unique int id: @asm_reg_spec +); + +#keyset[id] +asm_reg_spec_identifiers( + int id: @asm_reg_spec ref, + int identifier: @name_ref ref +); + +assoc_item_lists( + unique int id: @assoc_item_list +); + +#keyset[id, index] +assoc_item_list_assoc_items( + int id: @assoc_item_list ref, + int index: int ref, + int assoc_item: @assoc_item ref +); + +#keyset[id, index] +assoc_item_list_attrs( + int id: @assoc_item_list ref, + int index: int ref, + int attr: @attr ref +); + +attrs( + unique int id: @attr +); + +#keyset[id] +attr_meta( + int id: @attr ref, + int meta: @meta ref +); + +@callable = + @closure_expr +| @function +; + +#keyset[id] +callable_param_lists( + int id: @callable ref, + int param_list: @param_list ref +); + +#keyset[id, index] +callable_attrs( + int id: @callable ref, + int index: int ref, + int attr: @attr ref +); + +@expr = + @array_expr_internal +| @asm_expr +| @await_expr +| @become_expr +| @binary_expr +| @break_expr +| @call_expr +| @cast_expr +| @closure_expr +| @continue_expr +| @field_expr +| @format_args_expr +| @if_expr +| @index_expr +| @labelable_expr +| @let_expr +| @literal_expr +| @macro_expr +| @match_expr +| @method_call_expr +| @offset_of_expr +| @paren_expr +| @path_expr_base +| @prefix_expr +| @range_expr +| @ref_expr +| @return_expr +| @struct_expr +| @try_expr +| @tuple_expr +| @underscore_expr +| @yeet_expr +| @yield_expr +; + +extern_item_lists( + unique int id: @extern_item_list +); + +#keyset[id, index] +extern_item_list_attrs( + int id: @extern_item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +extern_item_list_extern_items( + int id: @extern_item_list ref, + int index: int ref, + int extern_item: @extern_item ref +); + +@field_list = + @struct_field_list +| @tuple_field_list +; + +for_binders( + unique int id: @for_binder +); + +#keyset[id] +for_binder_generic_param_lists( + int id: @for_binder ref, + int generic_param_list: @generic_param_list ref +); + +format_args_args( + unique int id: @format_args_arg +); + +#keyset[id] +format_args_arg_exprs( + int id: @format_args_arg ref, + int expr: @expr ref +); + +#keyset[id] +format_args_arg_names( + int id: @format_args_arg ref, + int name: @name ref +); + +@generic_arg = + @assoc_type_arg +| @const_arg +| @lifetime_arg +| @type_arg +; + +generic_arg_lists( + unique int id: @generic_arg_list +); + +#keyset[id, index] +generic_arg_list_generic_args( + int id: @generic_arg_list ref, + int index: int ref, + int generic_arg: @generic_arg ref +); + +@generic_param = + @const_param +| @lifetime_param +| @type_param +; + +generic_param_lists( + unique int id: @generic_param_list +); + +#keyset[id, index] +generic_param_list_generic_params( + int id: @generic_param_list ref, + int index: int ref, + int generic_param: @generic_param ref +); + +item_lists( + unique int id: @item_list +); + +#keyset[id, index] +item_list_attrs( + int id: @item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +item_list_items( + int id: @item_list ref, + int index: int ref, + int item: @item ref +); + +labels( + unique int id: @label +); + +#keyset[id] +label_lifetimes( + int id: @label ref, + int lifetime: @lifetime ref +); + +let_elses( + unique int id: @let_else +); + +#keyset[id] +let_else_block_exprs( + int id: @let_else ref, + int block_expr: @block_expr ref +); + +macro_items( + unique int id: @macro_items +); + +#keyset[id, index] +macro_items_items( + int id: @macro_items ref, + int index: int ref, + int item: @item ref +); + +match_arms( + unique int id: @match_arm +); + +#keyset[id, index] +match_arm_attrs( + int id: @match_arm ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_arm_exprs( + int id: @match_arm ref, + int expr: @expr ref +); + +#keyset[id] +match_arm_guards( + int id: @match_arm ref, + int guard: @match_guard ref +); + +#keyset[id] +match_arm_pats( + int id: @match_arm ref, + int pat: @pat ref +); + +match_arm_lists( + unique int id: @match_arm_list +); + +#keyset[id, index] +match_arm_list_arms( + int id: @match_arm_list ref, + int index: int ref, + int arm: @match_arm ref +); + +#keyset[id, index] +match_arm_list_attrs( + int id: @match_arm_list ref, + int index: int ref, + int attr: @attr ref +); + +match_guards( + unique int id: @match_guard +); + +#keyset[id] +match_guard_conditions( + int id: @match_guard ref, + int condition: @expr ref +); + +meta( + unique int id: @meta +); + +#keyset[id] +meta_exprs( + int id: @meta ref, + int expr: @expr ref +); + +#keyset[id] +meta_is_unsafe( + int id: @meta ref +); + +#keyset[id] +meta_paths( + int id: @meta ref, + int path: @path ref +); + +#keyset[id] +meta_token_trees( + int id: @meta ref, + int token_tree: @token_tree ref +); + +names( + unique int id: @name +); + +#keyset[id] +name_texts( + int id: @name ref, + string text: string ref +); + +@param_base = + @param +| @self_param +; + +#keyset[id, index] +param_base_attrs( + int id: @param_base ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +param_base_type_reprs( + int id: @param_base ref, + int type_repr: @type_repr ref +); + +param_lists( + unique int id: @param_list +); + +#keyset[id, index] +param_list_params( + int id: @param_list ref, + int index: int ref, + int param: @param ref +); + +#keyset[id] +param_list_self_params( + int id: @param_list ref, + int self_param: @self_param ref +); + +parenthesized_arg_lists( + unique int id: @parenthesized_arg_list +); + +#keyset[id, index] +parenthesized_arg_list_type_args( + int id: @parenthesized_arg_list ref, + int index: int ref, + int type_arg: @type_arg ref +); + +@pat = + @box_pat +| @const_block_pat +| @ident_pat +| @literal_pat +| @macro_pat +| @or_pat +| @paren_pat +| @path_pat +| @range_pat +| @ref_pat +| @rest_pat +| @slice_pat +| @struct_pat +| @tuple_pat +| @tuple_struct_pat +| @wildcard_pat +; + +paths( + unique int id: @path +); + +#keyset[id] +path_qualifiers( + int id: @path ref, + int qualifier: @path ref +); + +#keyset[id] +path_segments_( + int id: @path ref, + int segment: @path_segment ref +); + +@path_ast_node = + @path_expr +| @path_pat +| @struct_expr +| @struct_pat +| @tuple_struct_pat +; + +#keyset[id] +path_ast_node_paths( + int id: @path_ast_node ref, + int path: @path ref +); + +path_segments( + unique int id: @path_segment +); + +#keyset[id] +path_segment_generic_arg_lists( + int id: @path_segment ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +path_segment_identifiers( + int id: @path_segment ref, + int identifier: @name_ref ref +); + +#keyset[id] +path_segment_parenthesized_arg_lists( + int id: @path_segment ref, + int parenthesized_arg_list: @parenthesized_arg_list ref +); + +#keyset[id] +path_segment_ret_types( + int id: @path_segment ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +path_segment_return_type_syntaxes( + int id: @path_segment ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +path_segment_type_reprs( + int id: @path_segment ref, + int type_repr: @type_repr ref +); + +#keyset[id] +path_segment_trait_type_reprs( + int id: @path_segment ref, + int trait_type_repr: @path_type_repr ref +); + +renames( + unique int id: @rename +); + +#keyset[id] +rename_names( + int id: @rename ref, + int name: @name ref +); + +ret_type_reprs( + unique int id: @ret_type_repr +); + +#keyset[id] +ret_type_repr_type_reprs( + int id: @ret_type_repr ref, + int type_repr: @type_repr ref +); + +return_type_syntaxes( + unique int id: @return_type_syntax +); + +source_files( + unique int id: @source_file +); + +#keyset[id, index] +source_file_attrs( + int id: @source_file ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +source_file_items( + int id: @source_file ref, + int index: int ref, + int item: @item ref +); + +@stmt = + @expr_stmt +| @item +| @let_stmt +; + +stmt_lists( + unique int id: @stmt_list +); + +#keyset[id, index] +stmt_list_attrs( + int id: @stmt_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +stmt_list_statements( + int id: @stmt_list ref, + int index: int ref, + int statement: @stmt ref +); + +#keyset[id] +stmt_list_tail_exprs( + int id: @stmt_list ref, + int tail_expr: @expr ref +); + +struct_expr_fields( + unique int id: @struct_expr_field +); + +#keyset[id, index] +struct_expr_field_attrs( + int id: @struct_expr_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_expr_field_exprs( + int id: @struct_expr_field ref, + int expr: @expr ref +); + +#keyset[id] +struct_expr_field_identifiers( + int id: @struct_expr_field ref, + int identifier: @name_ref ref +); + +struct_expr_field_lists( + unique int id: @struct_expr_field_list +); + +#keyset[id, index] +struct_expr_field_list_attrs( + int id: @struct_expr_field_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +struct_expr_field_list_fields( + int id: @struct_expr_field_list ref, + int index: int ref, + int field: @struct_expr_field ref +); + +#keyset[id] +struct_expr_field_list_spreads( + int id: @struct_expr_field_list ref, + int spread: @expr ref +); + +struct_fields( + unique int id: @struct_field +); + +#keyset[id, index] +struct_field_attrs( + int id: @struct_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_field_defaults( + int id: @struct_field ref, + int default: @expr ref +); + +#keyset[id] +struct_field_is_unsafe( + int id: @struct_field ref +); + +#keyset[id] +struct_field_names( + int id: @struct_field ref, + int name: @name ref +); + +#keyset[id] +struct_field_type_reprs( + int id: @struct_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +struct_field_visibilities( + int id: @struct_field ref, + int visibility: @visibility ref +); + +struct_pat_fields( + unique int id: @struct_pat_field +); + +#keyset[id, index] +struct_pat_field_attrs( + int id: @struct_pat_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_pat_field_identifiers( + int id: @struct_pat_field ref, + int identifier: @name_ref ref +); + +#keyset[id] +struct_pat_field_pats( + int id: @struct_pat_field ref, + int pat: @pat ref +); + +struct_pat_field_lists( + unique int id: @struct_pat_field_list +); + +#keyset[id, index] +struct_pat_field_list_fields( + int id: @struct_pat_field_list ref, + int index: int ref, + int field: @struct_pat_field ref +); + +#keyset[id] +struct_pat_field_list_rest_pats( + int id: @struct_pat_field_list ref, + int rest_pat: @rest_pat ref +); + +@token = + @comment +; + +token_trees( + unique int id: @token_tree +); + +tuple_fields( + unique int id: @tuple_field +); + +#keyset[id, index] +tuple_field_attrs( + int id: @tuple_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +tuple_field_type_reprs( + int id: @tuple_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +tuple_field_visibilities( + int id: @tuple_field ref, + int visibility: @visibility ref +); + +type_bounds( + unique int id: @type_bound +); + +#keyset[id] +type_bound_for_binders( + int id: @type_bound ref, + int for_binder: @for_binder ref +); + +#keyset[id] +type_bound_is_async( + int id: @type_bound ref +); + +#keyset[id] +type_bound_is_const( + int id: @type_bound ref +); + +#keyset[id] +type_bound_lifetimes( + int id: @type_bound ref, + int lifetime: @lifetime ref +); + +#keyset[id] +type_bound_type_reprs( + int id: @type_bound ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_bound_use_bound_generic_args( + int id: @type_bound ref, + int use_bound_generic_args: @use_bound_generic_args ref +); + +type_bound_lists( + unique int id: @type_bound_list +); + +#keyset[id, index] +type_bound_list_bounds( + int id: @type_bound_list ref, + int index: int ref, + int bound: @type_bound ref +); + +@type_repr = + @array_type_repr +| @dyn_trait_type_repr +| @fn_ptr_type_repr +| @for_type_repr +| @impl_trait_type_repr +| @infer_type_repr +| @macro_type_repr +| @never_type_repr +| @paren_type_repr +| @path_type_repr +| @ptr_type_repr +| @ref_type_repr +| @slice_type_repr +| @tuple_type_repr +; + +@use_bound_generic_arg = + @lifetime +| @name_ref +; + +use_bound_generic_args( + unique int id: @use_bound_generic_args +); + +#keyset[id, index] +use_bound_generic_args_use_bound_generic_args( + int id: @use_bound_generic_args ref, + int index: int ref, + int use_bound_generic_arg: @use_bound_generic_arg ref +); + +use_trees( + unique int id: @use_tree +); + +#keyset[id] +use_tree_is_glob( + int id: @use_tree ref +); + +#keyset[id] +use_tree_paths( + int id: @use_tree ref, + int path: @path ref +); + +#keyset[id] +use_tree_renames( + int id: @use_tree ref, + int rename: @rename ref +); + +#keyset[id] +use_tree_use_tree_lists( + int id: @use_tree ref, + int use_tree_list: @use_tree_list ref +); + +use_tree_lists( + unique int id: @use_tree_list +); + +#keyset[id, index] +use_tree_list_use_trees( + int id: @use_tree_list ref, + int index: int ref, + int use_tree: @use_tree ref +); + +variant_lists( + unique int id: @variant_list +); + +#keyset[id, index] +variant_list_variants( + int id: @variant_list ref, + int index: int ref, + int variant: @variant ref +); + +visibilities( + unique int id: @visibility +); + +#keyset[id] +visibility_paths( + int id: @visibility ref, + int path: @path ref +); + +where_clauses( + unique int id: @where_clause +); + +#keyset[id, index] +where_clause_predicates( + int id: @where_clause ref, + int index: int ref, + int predicate: @where_pred ref +); + +where_preds( + unique int id: @where_pred +); + +#keyset[id] +where_pred_for_binders( + int id: @where_pred ref, + int for_binder: @for_binder ref +); + +#keyset[id] +where_pred_lifetimes( + int id: @where_pred ref, + int lifetime: @lifetime ref +); + +#keyset[id] +where_pred_type_reprs( + int id: @where_pred ref, + int type_repr: @type_repr ref +); + +#keyset[id] +where_pred_type_bound_lists( + int id: @where_pred ref, + int type_bound_list: @type_bound_list ref +); + +array_expr_internals( + unique int id: @array_expr_internal +); + +#keyset[id, index] +array_expr_internal_attrs( + int id: @array_expr_internal ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +array_expr_internal_exprs( + int id: @array_expr_internal ref, + int index: int ref, + int expr: @expr ref +); + +#keyset[id] +array_expr_internal_is_semicolon( + int id: @array_expr_internal ref +); + +array_type_reprs( + unique int id: @array_type_repr +); + +#keyset[id] +array_type_repr_const_args( + int id: @array_type_repr ref, + int const_arg: @const_arg ref +); + +#keyset[id] +array_type_repr_element_type_reprs( + int id: @array_type_repr ref, + int element_type_repr: @type_repr ref +); + +asm_clobber_abis( + unique int id: @asm_clobber_abi +); + +asm_consts( + unique int id: @asm_const +); + +#keyset[id] +asm_const_exprs( + int id: @asm_const ref, + int expr: @expr ref +); + +#keyset[id] +asm_const_is_const( + int id: @asm_const ref +); + +asm_labels( + unique int id: @asm_label +); + +#keyset[id] +asm_label_block_exprs( + int id: @asm_label ref, + int block_expr: @block_expr ref +); + +asm_operand_nameds( + unique int id: @asm_operand_named +); + +#keyset[id] +asm_operand_named_asm_operands( + int id: @asm_operand_named ref, + int asm_operand: @asm_operand ref +); + +#keyset[id] +asm_operand_named_names( + int id: @asm_operand_named ref, + int name: @name ref +); + +asm_options_lists( + unique int id: @asm_options_list +); + +#keyset[id, index] +asm_options_list_asm_options( + int id: @asm_options_list ref, + int index: int ref, + int asm_option: @asm_option ref +); + +asm_reg_operands( + unique int id: @asm_reg_operand +); + +#keyset[id] +asm_reg_operand_asm_dir_specs( + int id: @asm_reg_operand ref, + int asm_dir_spec: @asm_dir_spec ref +); + +#keyset[id] +asm_reg_operand_asm_operand_exprs( + int id: @asm_reg_operand ref, + int asm_operand_expr: @asm_operand_expr ref +); + +#keyset[id] +asm_reg_operand_asm_reg_specs( + int id: @asm_reg_operand ref, + int asm_reg_spec: @asm_reg_spec ref +); + +asm_syms( + unique int id: @asm_sym +); + +#keyset[id] +asm_sym_paths( + int id: @asm_sym ref, + int path: @path ref +); + +assoc_type_args( + unique int id: @assoc_type_arg +); + +#keyset[id] +assoc_type_arg_const_args( + int id: @assoc_type_arg ref, + int const_arg: @const_arg ref +); + +#keyset[id] +assoc_type_arg_generic_arg_lists( + int id: @assoc_type_arg ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +assoc_type_arg_identifiers( + int id: @assoc_type_arg ref, + int identifier: @name_ref ref +); + +#keyset[id] +assoc_type_arg_param_lists( + int id: @assoc_type_arg ref, + int param_list: @param_list ref +); + +#keyset[id] +assoc_type_arg_ret_types( + int id: @assoc_type_arg ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +assoc_type_arg_return_type_syntaxes( + int id: @assoc_type_arg ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +assoc_type_arg_type_reprs( + int id: @assoc_type_arg ref, + int type_repr: @type_repr ref +); + +#keyset[id] +assoc_type_arg_type_bound_lists( + int id: @assoc_type_arg ref, + int type_bound_list: @type_bound_list ref +); + +await_exprs( + unique int id: @await_expr +); + +#keyset[id, index] +await_expr_attrs( + int id: @await_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +await_expr_exprs( + int id: @await_expr ref, + int expr: @expr ref +); + +become_exprs( + unique int id: @become_expr +); + +#keyset[id, index] +become_expr_attrs( + int id: @become_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +become_expr_exprs( + int id: @become_expr ref, + int expr: @expr ref +); + +binary_exprs( + unique int id: @binary_expr +); + +#keyset[id, index] +binary_expr_attrs( + int id: @binary_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +binary_expr_lhs( + int id: @binary_expr ref, + int lhs: @expr ref +); + +#keyset[id] +binary_expr_operator_names( + int id: @binary_expr ref, + string operator_name: string ref +); + +#keyset[id] +binary_expr_rhs( + int id: @binary_expr ref, + int rhs: @expr ref +); + +box_pats( + unique int id: @box_pat +); + +#keyset[id] +box_pat_pats( + int id: @box_pat ref, + int pat: @pat ref +); + +break_exprs( + unique int id: @break_expr +); + +#keyset[id, index] +break_expr_attrs( + int id: @break_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +break_expr_exprs( + int id: @break_expr ref, + int expr: @expr ref +); + +#keyset[id] +break_expr_lifetimes( + int id: @break_expr ref, + int lifetime: @lifetime ref +); + +call_exprs( + unique int id: @call_expr +); + +#keyset[id] +call_expr_arg_lists( + int id: @call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +call_expr_attrs( + int id: @call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +call_expr_functions( + int id: @call_expr ref, + int function: @expr ref +); + +cast_exprs( + unique int id: @cast_expr +); + +#keyset[id, index] +cast_expr_attrs( + int id: @cast_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +cast_expr_exprs( + int id: @cast_expr ref, + int expr: @expr ref +); + +#keyset[id] +cast_expr_type_reprs( + int id: @cast_expr ref, + int type_repr: @type_repr ref +); + +closure_exprs( + unique int id: @closure_expr +); + +#keyset[id] +closure_expr_closure_bodies( + int id: @closure_expr ref, + int closure_body: @expr ref +); + +#keyset[id] +closure_expr_for_binders( + int id: @closure_expr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +closure_expr_is_async( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_const( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_gen( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_move( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_static( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_ret_types( + int id: @closure_expr ref, + int ret_type: @ret_type_repr ref +); + +comments( + unique int id: @comment, + int parent: @ast_node ref, + string text: string ref +); + +const_args( + unique int id: @const_arg +); + +#keyset[id] +const_arg_exprs( + int id: @const_arg ref, + int expr: @expr ref +); + +const_block_pats( + unique int id: @const_block_pat +); + +#keyset[id] +const_block_pat_block_exprs( + int id: @const_block_pat ref, + int block_expr: @block_expr ref +); + +#keyset[id] +const_block_pat_is_const( + int id: @const_block_pat ref +); + +const_params( + unique int id: @const_param +); + +#keyset[id, index] +const_param_attrs( + int id: @const_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_param_default_vals( + int id: @const_param ref, + int default_val: @const_arg ref +); + +#keyset[id] +const_param_is_const( + int id: @const_param ref +); + +#keyset[id] +const_param_names( + int id: @const_param ref, + int name: @name ref +); + +#keyset[id] +const_param_type_reprs( + int id: @const_param ref, + int type_repr: @type_repr ref +); + +continue_exprs( + unique int id: @continue_expr +); + +#keyset[id, index] +continue_expr_attrs( + int id: @continue_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +continue_expr_lifetimes( + int id: @continue_expr ref, + int lifetime: @lifetime ref +); + +dyn_trait_type_reprs( + unique int id: @dyn_trait_type_repr +); + +#keyset[id] +dyn_trait_type_repr_type_bound_lists( + int id: @dyn_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +expr_stmts( + unique int id: @expr_stmt +); + +#keyset[id] +expr_stmt_exprs( + int id: @expr_stmt ref, + int expr: @expr ref +); + +field_exprs( + unique int id: @field_expr +); + +#keyset[id, index] +field_expr_attrs( + int id: @field_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +field_expr_containers( + int id: @field_expr ref, + int container: @expr ref +); + +#keyset[id] +field_expr_identifiers( + int id: @field_expr ref, + int identifier: @name_ref ref +); + +fn_ptr_type_reprs( + unique int id: @fn_ptr_type_repr +); + +#keyset[id] +fn_ptr_type_repr_abis( + int id: @fn_ptr_type_repr ref, + int abi: @abi ref +); + +#keyset[id] +fn_ptr_type_repr_is_async( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_const( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_unsafe( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_param_lists( + int id: @fn_ptr_type_repr ref, + int param_list: @param_list ref +); + +#keyset[id] +fn_ptr_type_repr_ret_types( + int id: @fn_ptr_type_repr ref, + int ret_type: @ret_type_repr ref +); + +for_type_reprs( + unique int id: @for_type_repr +); + +#keyset[id] +for_type_repr_for_binders( + int id: @for_type_repr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +for_type_repr_type_reprs( + int id: @for_type_repr ref, + int type_repr: @type_repr ref +); + +format_args_exprs( + unique int id: @format_args_expr +); + +#keyset[id, index] +format_args_expr_args( + int id: @format_args_expr ref, + int index: int ref, + int arg: @format_args_arg ref +); + +#keyset[id, index] +format_args_expr_attrs( + int id: @format_args_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +format_args_expr_templates( + int id: @format_args_expr ref, + int template: @expr ref +); + +ident_pats( + unique int id: @ident_pat +); + +#keyset[id, index] +ident_pat_attrs( + int id: @ident_pat ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ident_pat_is_mut( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_is_ref( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_names( + int id: @ident_pat ref, + int name: @name ref +); + +#keyset[id] +ident_pat_pats( + int id: @ident_pat ref, + int pat: @pat ref +); + +if_exprs( + unique int id: @if_expr +); + +#keyset[id, index] +if_expr_attrs( + int id: @if_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +if_expr_conditions( + int id: @if_expr ref, + int condition: @expr ref +); + +#keyset[id] +if_expr_elses( + int id: @if_expr ref, + int else: @expr ref +); + +#keyset[id] +if_expr_thens( + int id: @if_expr ref, + int then: @block_expr ref +); + +impl_trait_type_reprs( + unique int id: @impl_trait_type_repr +); + +#keyset[id] +impl_trait_type_repr_type_bound_lists( + int id: @impl_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +index_exprs( + unique int id: @index_expr +); + +#keyset[id, index] +index_expr_attrs( + int id: @index_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +index_expr_bases( + int id: @index_expr ref, + int base: @expr ref +); + +#keyset[id] +index_expr_indices( + int id: @index_expr ref, + int index: @expr ref +); + +infer_type_reprs( + unique int id: @infer_type_repr +); + +@item = + @asm_expr +| @assoc_item +| @extern_block +| @extern_crate +| @extern_item +| @impl +| @macro_def +| @macro_rules +| @module +| @trait +| @trait_alias +| @type_item +| @use +; + +#keyset[id] +item_attribute_macro_expansions( + int id: @item ref, + int attribute_macro_expansion: @macro_items ref +); + +@labelable_expr = + @block_expr +| @looping_expr +; + +#keyset[id] +labelable_expr_labels( + int id: @labelable_expr ref, + int label: @label ref +); + +let_exprs( + unique int id: @let_expr +); + +#keyset[id, index] +let_expr_attrs( + int id: @let_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_expr_scrutinees( + int id: @let_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +let_expr_pats( + int id: @let_expr ref, + int pat: @pat ref +); + +let_stmts( + unique int id: @let_stmt +); + +#keyset[id, index] +let_stmt_attrs( + int id: @let_stmt ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_stmt_initializers( + int id: @let_stmt ref, + int initializer: @expr ref +); + +#keyset[id] +let_stmt_let_elses( + int id: @let_stmt ref, + int let_else: @let_else ref +); + +#keyset[id] +let_stmt_pats( + int id: @let_stmt ref, + int pat: @pat ref +); + +#keyset[id] +let_stmt_type_reprs( + int id: @let_stmt ref, + int type_repr: @type_repr ref +); + +lifetimes( + unique int id: @lifetime +); + +#keyset[id] +lifetime_texts( + int id: @lifetime ref, + string text: string ref +); + +lifetime_args( + unique int id: @lifetime_arg +); + +#keyset[id] +lifetime_arg_lifetimes( + int id: @lifetime_arg ref, + int lifetime: @lifetime ref +); + +lifetime_params( + unique int id: @lifetime_param +); + +#keyset[id, index] +lifetime_param_attrs( + int id: @lifetime_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +lifetime_param_lifetimes( + int id: @lifetime_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +lifetime_param_type_bound_lists( + int id: @lifetime_param ref, + int type_bound_list: @type_bound_list ref +); + +literal_exprs( + unique int id: @literal_expr +); + +#keyset[id, index] +literal_expr_attrs( + int id: @literal_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +literal_expr_text_values( + int id: @literal_expr ref, + string text_value: string ref +); + +literal_pats( + unique int id: @literal_pat +); + +#keyset[id] +literal_pat_literals( + int id: @literal_pat ref, + int literal: @literal_expr ref +); + +macro_exprs( + unique int id: @macro_expr +); + +#keyset[id] +macro_expr_macro_calls( + int id: @macro_expr ref, + int macro_call: @macro_call ref +); + +macro_pats( + unique int id: @macro_pat +); + +#keyset[id] +macro_pat_macro_calls( + int id: @macro_pat ref, + int macro_call: @macro_call ref +); + +macro_type_reprs( + unique int id: @macro_type_repr +); + +#keyset[id] +macro_type_repr_macro_calls( + int id: @macro_type_repr ref, + int macro_call: @macro_call ref +); + +match_exprs( + unique int id: @match_expr +); + +#keyset[id, index] +match_expr_attrs( + int id: @match_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_expr_scrutinees( + int id: @match_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +match_expr_match_arm_lists( + int id: @match_expr ref, + int match_arm_list: @match_arm_list ref +); + +method_call_exprs( + unique int id: @method_call_expr +); + +#keyset[id] +method_call_expr_arg_lists( + int id: @method_call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +method_call_expr_attrs( + int id: @method_call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +method_call_expr_generic_arg_lists( + int id: @method_call_expr ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +method_call_expr_identifiers( + int id: @method_call_expr ref, + int identifier: @name_ref ref +); + +#keyset[id] +method_call_expr_receivers( + int id: @method_call_expr ref, + int receiver: @expr ref +); + +name_refs( + unique int id: @name_ref +); + +#keyset[id] +name_ref_texts( + int id: @name_ref ref, + string text: string ref +); + +never_type_reprs( + unique int id: @never_type_repr +); + +offset_of_exprs( + unique int id: @offset_of_expr +); + +#keyset[id, index] +offset_of_expr_attrs( + int id: @offset_of_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +offset_of_expr_fields( + int id: @offset_of_expr ref, + int index: int ref, + int field: @name_ref ref +); + +#keyset[id] +offset_of_expr_type_reprs( + int id: @offset_of_expr ref, + int type_repr: @type_repr ref +); + +or_pats( + unique int id: @or_pat +); + +#keyset[id, index] +or_pat_pats( + int id: @or_pat ref, + int index: int ref, + int pat: @pat ref +); + +params( + unique int id: @param +); + +#keyset[id] +param_pats( + int id: @param ref, + int pat: @pat ref +); + +paren_exprs( + unique int id: @paren_expr +); + +#keyset[id, index] +paren_expr_attrs( + int id: @paren_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +paren_expr_exprs( + int id: @paren_expr ref, + int expr: @expr ref +); + +paren_pats( + unique int id: @paren_pat +); + +#keyset[id] +paren_pat_pats( + int id: @paren_pat ref, + int pat: @pat ref +); + +paren_type_reprs( + unique int id: @paren_type_repr +); + +#keyset[id] +paren_type_repr_type_reprs( + int id: @paren_type_repr ref, + int type_repr: @type_repr ref +); + +@path_expr_base = + @path_expr +; + +path_pats( + unique int id: @path_pat +); + +path_type_reprs( + unique int id: @path_type_repr +); + +#keyset[id] +path_type_repr_paths( + int id: @path_type_repr ref, + int path: @path ref +); + +prefix_exprs( + unique int id: @prefix_expr +); + +#keyset[id, index] +prefix_expr_attrs( + int id: @prefix_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +prefix_expr_exprs( + int id: @prefix_expr ref, + int expr: @expr ref +); + +#keyset[id] +prefix_expr_operator_names( + int id: @prefix_expr ref, + string operator_name: string ref +); + +ptr_type_reprs( + unique int id: @ptr_type_repr +); + +#keyset[id] +ptr_type_repr_is_const( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_is_mut( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_type_reprs( + int id: @ptr_type_repr ref, + int type_repr: @type_repr ref +); + +range_exprs( + unique int id: @range_expr +); + +#keyset[id, index] +range_expr_attrs( + int id: @range_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +range_expr_ends( + int id: @range_expr ref, + int end: @expr ref +); + +#keyset[id] +range_expr_operator_names( + int id: @range_expr ref, + string operator_name: string ref +); + +#keyset[id] +range_expr_starts( + int id: @range_expr ref, + int start: @expr ref +); + +range_pats( + unique int id: @range_pat +); + +#keyset[id] +range_pat_ends( + int id: @range_pat ref, + int end: @pat ref +); + +#keyset[id] +range_pat_operator_names( + int id: @range_pat ref, + string operator_name: string ref +); + +#keyset[id] +range_pat_starts( + int id: @range_pat ref, + int start: @pat ref +); + +ref_exprs( + unique int id: @ref_expr +); + +#keyset[id, index] +ref_expr_attrs( + int id: @ref_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ref_expr_exprs( + int id: @ref_expr ref, + int expr: @expr ref +); + +#keyset[id] +ref_expr_is_const( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_mut( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_raw( + int id: @ref_expr ref +); + +ref_pats( + unique int id: @ref_pat +); + +#keyset[id] +ref_pat_is_mut( + int id: @ref_pat ref +); + +#keyset[id] +ref_pat_pats( + int id: @ref_pat ref, + int pat: @pat ref +); + +ref_type_reprs( + unique int id: @ref_type_repr +); + +#keyset[id] +ref_type_repr_is_mut( + int id: @ref_type_repr ref +); + +#keyset[id] +ref_type_repr_lifetimes( + int id: @ref_type_repr ref, + int lifetime: @lifetime ref +); + +#keyset[id] +ref_type_repr_type_reprs( + int id: @ref_type_repr ref, + int type_repr: @type_repr ref +); + +rest_pats( + unique int id: @rest_pat +); + +#keyset[id, index] +rest_pat_attrs( + int id: @rest_pat ref, + int index: int ref, + int attr: @attr ref +); + +return_exprs( + unique int id: @return_expr +); + +#keyset[id, index] +return_expr_attrs( + int id: @return_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +return_expr_exprs( + int id: @return_expr ref, + int expr: @expr ref +); + +self_params( + unique int id: @self_param +); + +#keyset[id] +self_param_is_ref( + int id: @self_param ref +); + +#keyset[id] +self_param_is_mut( + int id: @self_param ref +); + +#keyset[id] +self_param_lifetimes( + int id: @self_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +self_param_names( + int id: @self_param ref, + int name: @name ref +); + +slice_pats( + unique int id: @slice_pat +); + +#keyset[id, index] +slice_pat_pats( + int id: @slice_pat ref, + int index: int ref, + int pat: @pat ref +); + +slice_type_reprs( + unique int id: @slice_type_repr +); + +#keyset[id] +slice_type_repr_type_reprs( + int id: @slice_type_repr ref, + int type_repr: @type_repr ref +); + +struct_exprs( + unique int id: @struct_expr +); + +#keyset[id] +struct_expr_struct_expr_field_lists( + int id: @struct_expr ref, + int struct_expr_field_list: @struct_expr_field_list ref +); + +struct_field_lists( + unique int id: @struct_field_list +); + +#keyset[id, index] +struct_field_list_fields( + int id: @struct_field_list ref, + int index: int ref, + int field: @struct_field ref +); + +struct_pats( + unique int id: @struct_pat +); + +#keyset[id] +struct_pat_struct_pat_field_lists( + int id: @struct_pat ref, + int struct_pat_field_list: @struct_pat_field_list ref +); + +try_exprs( + unique int id: @try_expr +); + +#keyset[id, index] +try_expr_attrs( + int id: @try_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +try_expr_exprs( + int id: @try_expr ref, + int expr: @expr ref +); + +tuple_exprs( + unique int id: @tuple_expr +); + +#keyset[id, index] +tuple_expr_attrs( + int id: @tuple_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +tuple_expr_fields( + int id: @tuple_expr ref, + int index: int ref, + int field: @expr ref +); + +tuple_field_lists( + unique int id: @tuple_field_list +); + +#keyset[id, index] +tuple_field_list_fields( + int id: @tuple_field_list ref, + int index: int ref, + int field: @tuple_field ref +); + +tuple_pats( + unique int id: @tuple_pat +); + +#keyset[id, index] +tuple_pat_fields( + int id: @tuple_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_struct_pats( + unique int id: @tuple_struct_pat +); + +#keyset[id, index] +tuple_struct_pat_fields( + int id: @tuple_struct_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_type_reprs( + unique int id: @tuple_type_repr +); + +#keyset[id, index] +tuple_type_repr_fields( + int id: @tuple_type_repr ref, + int index: int ref, + int field: @type_repr ref +); + +type_args( + unique int id: @type_arg +); + +#keyset[id] +type_arg_type_reprs( + int id: @type_arg ref, + int type_repr: @type_repr ref +); + +type_params( + unique int id: @type_param +); + +#keyset[id, index] +type_param_attrs( + int id: @type_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_param_default_types( + int id: @type_param ref, + int default_type: @type_repr ref +); + +#keyset[id] +type_param_names( + int id: @type_param ref, + int name: @name ref +); + +#keyset[id] +type_param_type_bound_lists( + int id: @type_param ref, + int type_bound_list: @type_bound_list ref +); + +underscore_exprs( + unique int id: @underscore_expr +); + +#keyset[id, index] +underscore_expr_attrs( + int id: @underscore_expr ref, + int index: int ref, + int attr: @attr ref +); + +variants( + unique int id: @variant +); + +#keyset[id, index] +variant_attrs( + int id: @variant ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +variant_discriminants( + int id: @variant ref, + int discriminant: @expr ref +); + +#keyset[id] +variant_field_lists( + int id: @variant ref, + int field_list: @field_list ref +); + +#keyset[id] +variant_names( + int id: @variant ref, + int name: @name ref +); + +#keyset[id] +variant_visibilities( + int id: @variant ref, + int visibility: @visibility ref +); + +wildcard_pats( + unique int id: @wildcard_pat +); + +yeet_exprs( + unique int id: @yeet_expr +); + +#keyset[id, index] +yeet_expr_attrs( + int id: @yeet_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yeet_expr_exprs( + int id: @yeet_expr ref, + int expr: @expr ref +); + +yield_exprs( + unique int id: @yield_expr +); + +#keyset[id, index] +yield_expr_attrs( + int id: @yield_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yield_expr_exprs( + int id: @yield_expr ref, + int expr: @expr ref +); + +asm_exprs( + unique int id: @asm_expr +); + +#keyset[id, index] +asm_expr_asm_pieces( + int id: @asm_expr ref, + int index: int ref, + int asm_piece: @asm_piece ref +); + +#keyset[id, index] +asm_expr_attrs( + int id: @asm_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +asm_expr_templates( + int id: @asm_expr ref, + int index: int ref, + int template: @expr ref +); + +@assoc_item = + @const +| @function +| @macro_call +| @type_alias +; + +block_exprs( + unique int id: @block_expr +); + +#keyset[id, index] +block_expr_attrs( + int id: @block_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +block_expr_is_async( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_const( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_gen( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_move( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_try( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_unsafe( + int id: @block_expr ref +); + +#keyset[id] +block_expr_stmt_lists( + int id: @block_expr ref, + int stmt_list: @stmt_list ref +); + +extern_blocks( + unique int id: @extern_block +); + +#keyset[id] +extern_block_abis( + int id: @extern_block ref, + int abi: @abi ref +); + +#keyset[id, index] +extern_block_attrs( + int id: @extern_block ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_block_extern_item_lists( + int id: @extern_block ref, + int extern_item_list: @extern_item_list ref +); + +#keyset[id] +extern_block_is_unsafe( + int id: @extern_block ref +); + +extern_crates( + unique int id: @extern_crate +); + +#keyset[id, index] +extern_crate_attrs( + int id: @extern_crate ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_crate_identifiers( + int id: @extern_crate ref, + int identifier: @name_ref ref +); + +#keyset[id] +extern_crate_renames( + int id: @extern_crate ref, + int rename: @rename ref +); + +#keyset[id] +extern_crate_visibilities( + int id: @extern_crate ref, + int visibility: @visibility ref +); + +@extern_item = + @function +| @macro_call +| @static +| @type_alias +; + +impls( + unique int id: @impl +); + +#keyset[id] +impl_assoc_item_lists( + int id: @impl ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +impl_attrs( + int id: @impl ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +impl_generic_param_lists( + int id: @impl ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +impl_is_const( + int id: @impl ref +); + +#keyset[id] +impl_is_default( + int id: @impl ref +); + +#keyset[id] +impl_is_unsafe( + int id: @impl ref +); + +#keyset[id] +impl_self_ties( + int id: @impl ref, + int self_ty: @type_repr ref +); + +#keyset[id] +impl_traits( + int id: @impl ref, + int trait: @type_repr ref +); + +#keyset[id] +impl_visibilities( + int id: @impl ref, + int visibility: @visibility ref +); + +#keyset[id] +impl_where_clauses( + int id: @impl ref, + int where_clause: @where_clause ref +); + +@looping_expr = + @for_expr +| @loop_expr +| @while_expr +; + +#keyset[id] +looping_expr_loop_bodies( + int id: @looping_expr ref, + int loop_body: @block_expr ref +); + +macro_defs( + unique int id: @macro_def +); + +#keyset[id] +macro_def_args( + int id: @macro_def ref, + int args: @token_tree ref +); + +#keyset[id, index] +macro_def_attrs( + int id: @macro_def ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_def_bodies( + int id: @macro_def ref, + int body: @token_tree ref +); + +#keyset[id] +macro_def_names( + int id: @macro_def ref, + int name: @name ref +); + +#keyset[id] +macro_def_visibilities( + int id: @macro_def ref, + int visibility: @visibility ref +); + +macro_rules( + unique int id: @macro_rules +); + +#keyset[id, index] +macro_rules_attrs( + int id: @macro_rules ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_rules_names( + int id: @macro_rules ref, + int name: @name ref +); + +#keyset[id] +macro_rules_token_trees( + int id: @macro_rules ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_rules_visibilities( + int id: @macro_rules ref, + int visibility: @visibility ref +); + +modules( + unique int id: @module +); + +#keyset[id, index] +module_attrs( + int id: @module ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +module_item_lists( + int id: @module ref, + int item_list: @item_list ref +); + +#keyset[id] +module_names( + int id: @module ref, + int name: @name ref +); + +#keyset[id] +module_visibilities( + int id: @module ref, + int visibility: @visibility ref +); + +path_exprs( + unique int id: @path_expr +); + +#keyset[id, index] +path_expr_attrs( + int id: @path_expr ref, + int index: int ref, + int attr: @attr ref +); + +traits( + unique int id: @trait +); + +#keyset[id] +trait_assoc_item_lists( + int id: @trait ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +trait_attrs( + int id: @trait ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_generic_param_lists( + int id: @trait ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_is_auto( + int id: @trait ref +); + +#keyset[id] +trait_is_unsafe( + int id: @trait ref +); + +#keyset[id] +trait_names( + int id: @trait ref, + int name: @name ref +); + +#keyset[id] +trait_type_bound_lists( + int id: @trait ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_visibilities( + int id: @trait ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_where_clauses( + int id: @trait ref, + int where_clause: @where_clause ref +); + +trait_aliases( + unique int id: @trait_alias +); + +#keyset[id, index] +trait_alias_attrs( + int id: @trait_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_alias_generic_param_lists( + int id: @trait_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_alias_names( + int id: @trait_alias ref, + int name: @name ref +); + +#keyset[id] +trait_alias_type_bound_lists( + int id: @trait_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_alias_visibilities( + int id: @trait_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_alias_where_clauses( + int id: @trait_alias ref, + int where_clause: @where_clause ref +); + +@type_item = + @enum +| @struct +| @union +; + +#keyset[id, index] +type_item_derive_macro_expansions( + int id: @type_item ref, + int index: int ref, + int derive_macro_expansion: @macro_items ref +); + +#keyset[id, index] +type_item_attrs( + int id: @type_item ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_item_generic_param_lists( + int id: @type_item ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_item_names( + int id: @type_item ref, + int name: @name ref +); + +#keyset[id] +type_item_visibilities( + int id: @type_item ref, + int visibility: @visibility ref +); + +#keyset[id] +type_item_where_clauses( + int id: @type_item ref, + int where_clause: @where_clause ref +); + +uses( + unique int id: @use +); + +#keyset[id, index] +use_attrs( + int id: @use ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +use_use_trees( + int id: @use ref, + int use_tree: @use_tree ref +); + +#keyset[id] +use_visibilities( + int id: @use ref, + int visibility: @visibility ref +); + +consts( + unique int id: @const +); + +#keyset[id, index] +const_attrs( + int id: @const ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_bodies( + int id: @const ref, + int body: @expr ref +); + +#keyset[id] +const_generic_param_lists( + int id: @const ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +const_is_const( + int id: @const ref +); + +#keyset[id] +const_is_default( + int id: @const ref +); + +#keyset[id] +const_names( + int id: @const ref, + int name: @name ref +); + +#keyset[id] +const_type_reprs( + int id: @const ref, + int type_repr: @type_repr ref +); + +#keyset[id] +const_visibilities( + int id: @const ref, + int visibility: @visibility ref +); + +#keyset[id] +const_where_clauses( + int id: @const ref, + int where_clause: @where_clause ref +); + +#keyset[id] +const_has_implementation( + int id: @const ref +); + +enums( + unique int id: @enum +); + +#keyset[id] +enum_variant_lists( + int id: @enum ref, + int variant_list: @variant_list ref +); + +for_exprs( + unique int id: @for_expr +); + +#keyset[id, index] +for_expr_attrs( + int id: @for_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +for_expr_iterables( + int id: @for_expr ref, + int iterable: @expr ref +); + +#keyset[id] +for_expr_pats( + int id: @for_expr ref, + int pat: @pat ref +); + +functions( + unique int id: @function +); + +#keyset[id] +function_abis( + int id: @function ref, + int abi: @abi ref +); + +#keyset[id] +function_function_bodies( + int id: @function ref, + int function_body: @block_expr ref +); + +#keyset[id] +function_generic_param_lists( + int id: @function ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +function_is_async( + int id: @function ref +); + +#keyset[id] +function_is_const( + int id: @function ref +); + +#keyset[id] +function_is_default( + int id: @function ref +); + +#keyset[id] +function_is_gen( + int id: @function ref +); + +#keyset[id] +function_is_unsafe( + int id: @function ref +); + +#keyset[id] +function_names( + int id: @function ref, + int name: @name ref +); + +#keyset[id] +function_ret_types( + int id: @function ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +function_visibilities( + int id: @function ref, + int visibility: @visibility ref +); + +#keyset[id] +function_where_clauses( + int id: @function ref, + int where_clause: @where_clause ref +); + +#keyset[id] +function_has_implementation( + int id: @function ref +); + +loop_exprs( + unique int id: @loop_expr +); + +#keyset[id, index] +loop_expr_attrs( + int id: @loop_expr ref, + int index: int ref, + int attr: @attr ref +); + +macro_calls( + unique int id: @macro_call +); + +#keyset[id, index] +macro_call_attrs( + int id: @macro_call ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_call_paths( + int id: @macro_call ref, + int path: @path ref +); + +#keyset[id] +macro_call_token_trees( + int id: @macro_call ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_call_macro_call_expansions( + int id: @macro_call ref, + int macro_call_expansion: @ast_node ref +); + +statics( + unique int id: @static +); + +#keyset[id, index] +static_attrs( + int id: @static ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +static_bodies( + int id: @static ref, + int body: @expr ref +); + +#keyset[id] +static_is_mut( + int id: @static ref +); + +#keyset[id] +static_is_static( + int id: @static ref +); + +#keyset[id] +static_is_unsafe( + int id: @static ref +); + +#keyset[id] +static_names( + int id: @static ref, + int name: @name ref +); + +#keyset[id] +static_type_reprs( + int id: @static ref, + int type_repr: @type_repr ref +); + +#keyset[id] +static_visibilities( + int id: @static ref, + int visibility: @visibility ref +); + +structs( + unique int id: @struct +); + +#keyset[id] +struct_field_lists_( + int id: @struct ref, + int field_list: @field_list ref +); + +type_aliases( + unique int id: @type_alias +); + +#keyset[id, index] +type_alias_attrs( + int id: @type_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_alias_generic_param_lists( + int id: @type_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_alias_is_default( + int id: @type_alias ref +); + +#keyset[id] +type_alias_names( + int id: @type_alias ref, + int name: @name ref +); + +#keyset[id] +type_alias_type_reprs( + int id: @type_alias ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_alias_type_bound_lists( + int id: @type_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +type_alias_visibilities( + int id: @type_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +type_alias_where_clauses( + int id: @type_alias ref, + int where_clause: @where_clause ref +); + +unions( + unique int id: @union +); + +#keyset[id] +union_struct_field_lists( + int id: @union ref, + int struct_field_list: @struct_field_list ref +); + +while_exprs( + unique int id: @while_expr +); + +#keyset[id, index] +while_expr_attrs( + int id: @while_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +while_expr_conditions( + int id: @while_expr ref, + int condition: @expr ref +); diff --git a/rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/rust.dbscheme b/rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/rust.dbscheme new file mode 100644 index 000000000000..109496fd2f20 --- /dev/null +++ b/rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/rust.dbscheme @@ -0,0 +1,3623 @@ +// generated by codegen, do not edit + +// from ../shared/tree-sitter-extractor/src/generator/prefix.dbscheme +/*- Files and folders -*/ + +/** + * The location of an element. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @file | @folder + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +/*- Empty location -*/ + +empty_location( + int location: @location_default ref +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/*- Diagnostic messages -*/ + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/*- Diagnostic messages: severity -*/ + +case @diagnostic.severity of + 10 = @diagnostic_debug +| 20 = @diagnostic_info +| 30 = @diagnostic_warning +| 40 = @diagnostic_error +; + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error; + +/*- Database metadata -*/ + +/** + * The CLI will automatically emit applicable tuples for this table, + * such as `databaseMetadata("isOverlay", "true")` when building an + * overlay database. + */ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +/*- Overlay support -*/ + +/** + * The CLI will automatically emit tuples for each new/modified/deleted file + * when building an overlay database. + */ +overlayChangedFiles( + string path: string ref +); + + +// from prefix.dbscheme +#keyset[id] +locatable_locations( + int id: @locatable ref, + int location: @location_default ref +); + + +// from schema + +@element = + @extractor_step +| @locatable +| @named_crate +| @unextracted +; + +extractor_steps( + unique int id: @extractor_step, + string action: string ref, + int duration_ms: int ref +); + +#keyset[id] +extractor_step_files( + int id: @extractor_step ref, + int file: @file ref +); + +@locatable = + @ast_node +| @crate +; + +named_crates( + unique int id: @named_crate, + string name: string ref, + int crate: @crate ref +); + +@unextracted = + @missing +| @unimplemented +; + +@ast_node = + @abi +| @addressable +| @arg_list +| @asm_dir_spec +| @asm_operand +| @asm_operand_expr +| @asm_option +| @asm_piece +| @asm_reg_spec +| @assoc_item_list +| @attr +| @callable +| @cfg_predicate +| @expr +| @extern_item_list +| @field_list +| @for_binder +| @format_args_arg +| @format_args_arg_name +| @generic_arg +| @generic_arg_list +| @generic_param +| @generic_param_list +| @item_list +| @label +| @let_else +| @macro_items +| @match_arm +| @match_arm_list +| @match_guard +| @meta +| @name +| @param_base +| @param_list +| @parenthesized_arg_list +| @pat +| @path +| @path_ast_node +| @path_segment +| @rename +| @ret_type_repr +| @return_type_syntax +| @source_file +| @stmt +| @stmt_list +| @struct_expr_field +| @struct_expr_field_list +| @struct_field +| @struct_pat_field +| @struct_pat_field_list +| @token +| @token_tree +| @try_block_modifier +| @tuple_field +| @type_bound +| @type_bound_list +| @type_repr +| @use_bound_generic_arg +| @use_bound_generic_args +| @use_tree +| @use_tree_list +| @variant_list +| @visibility +| @where_clause +| @where_pred +; + +crates( + unique int id: @crate +); + +#keyset[id] +crate_names( + int id: @crate ref, + string name: string ref +); + +#keyset[id] +crate_versions( + int id: @crate ref, + string version: string ref +); + +#keyset[id, index] +crate_cfg_options( + int id: @crate ref, + int index: int ref, + string cfg_option: string ref +); + +#keyset[id, index] +crate_named_dependencies( + int id: @crate ref, + int index: int ref, + int named_dependency: @named_crate ref +); + +missings( + unique int id: @missing +); + +unimplementeds( + unique int id: @unimplemented +); + +abis( + unique int id: @abi +); + +#keyset[id] +abi_abi_strings( + int id: @abi ref, + string abi_string: string ref +); + +@addressable = + @item +| @variant +; + +arg_lists( + unique int id: @arg_list +); + +#keyset[id, index] +arg_list_args( + int id: @arg_list ref, + int index: int ref, + int arg: @expr ref +); + +asm_dir_specs( + unique int id: @asm_dir_spec +); + +@asm_operand = + @asm_const +| @asm_label +| @asm_reg_operand +| @asm_sym +; + +asm_operand_exprs( + unique int id: @asm_operand_expr +); + +#keyset[id] +asm_operand_expr_in_exprs( + int id: @asm_operand_expr ref, + int in_expr: @expr ref +); + +#keyset[id] +asm_operand_expr_out_exprs( + int id: @asm_operand_expr ref, + int out_expr: @expr ref +); + +asm_options( + unique int id: @asm_option +); + +#keyset[id] +asm_option_is_raw( + int id: @asm_option ref +); + +@asm_piece = + @asm_clobber_abi +| @asm_operand_named +| @asm_options_list +; + +asm_reg_specs( + unique int id: @asm_reg_spec +); + +#keyset[id] +asm_reg_spec_identifiers( + int id: @asm_reg_spec ref, + int identifier: @name_ref ref +); + +assoc_item_lists( + unique int id: @assoc_item_list +); + +#keyset[id, index] +assoc_item_list_assoc_items( + int id: @assoc_item_list ref, + int index: int ref, + int assoc_item: @assoc_item ref +); + +#keyset[id, index] +assoc_item_list_attrs( + int id: @assoc_item_list ref, + int index: int ref, + int attr: @attr ref +); + +attrs( + unique int id: @attr +); + +#keyset[id] +attr_meta( + int id: @attr ref, + int meta: @meta ref +); + +@callable = + @closure_expr +| @function +; + +#keyset[id] +callable_param_lists( + int id: @callable ref, + int param_list: @param_list ref +); + +#keyset[id, index] +callable_attrs( + int id: @callable ref, + int index: int ref, + int attr: @attr ref +); + +@cfg_predicate = + @cfg_atom +| @cfg_composite +; + +@expr = + @array_expr_internal +| @asm_expr +| @await_expr +| @become_expr +| @binary_expr +| @break_expr +| @call_expr +| @cast_expr +| @closure_expr +| @continue_expr +| @field_expr +| @format_args_expr +| @if_expr +| @index_expr +| @labelable_expr +| @let_expr +| @literal_expr +| @macro_expr +| @match_expr +| @method_call_expr +| @offset_of_expr +| @paren_expr +| @path_expr_base +| @prefix_expr +| @range_expr +| @ref_expr +| @return_expr +| @struct_expr +| @try_expr +| @tuple_expr +| @underscore_expr +| @yeet_expr +| @yield_expr +; + +extern_item_lists( + unique int id: @extern_item_list +); + +#keyset[id, index] +extern_item_list_attrs( + int id: @extern_item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +extern_item_list_extern_items( + int id: @extern_item_list ref, + int index: int ref, + int extern_item: @extern_item ref +); + +@field_list = + @struct_field_list +| @tuple_field_list +; + +for_binders( + unique int id: @for_binder +); + +#keyset[id] +for_binder_generic_param_lists( + int id: @for_binder ref, + int generic_param_list: @generic_param_list ref +); + +format_args_args( + unique int id: @format_args_arg +); + +#keyset[id] +format_args_arg_arg_names( + int id: @format_args_arg ref, + int arg_name: @format_args_arg_name ref +); + +#keyset[id] +format_args_arg_exprs( + int id: @format_args_arg ref, + int expr: @expr ref +); + +format_args_arg_names( + unique int id: @format_args_arg_name +); + +@generic_arg = + @assoc_type_arg +| @const_arg +| @lifetime_arg +| @type_arg +; + +generic_arg_lists( + unique int id: @generic_arg_list +); + +#keyset[id, index] +generic_arg_list_generic_args( + int id: @generic_arg_list ref, + int index: int ref, + int generic_arg: @generic_arg ref +); + +@generic_param = + @const_param +| @lifetime_param +| @type_param +; + +generic_param_lists( + unique int id: @generic_param_list +); + +#keyset[id, index] +generic_param_list_generic_params( + int id: @generic_param_list ref, + int index: int ref, + int generic_param: @generic_param ref +); + +item_lists( + unique int id: @item_list +); + +#keyset[id, index] +item_list_attrs( + int id: @item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +item_list_items( + int id: @item_list ref, + int index: int ref, + int item: @item ref +); + +labels( + unique int id: @label +); + +#keyset[id] +label_lifetimes( + int id: @label ref, + int lifetime: @lifetime ref +); + +let_elses( + unique int id: @let_else +); + +#keyset[id] +let_else_block_exprs( + int id: @let_else ref, + int block_expr: @block_expr ref +); + +macro_items( + unique int id: @macro_items +); + +#keyset[id, index] +macro_items_items( + int id: @macro_items ref, + int index: int ref, + int item: @item ref +); + +match_arms( + unique int id: @match_arm +); + +#keyset[id, index] +match_arm_attrs( + int id: @match_arm ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_arm_exprs( + int id: @match_arm ref, + int expr: @expr ref +); + +#keyset[id] +match_arm_guards( + int id: @match_arm ref, + int guard: @match_guard ref +); + +#keyset[id] +match_arm_pats( + int id: @match_arm ref, + int pat: @pat ref +); + +match_arm_lists( + unique int id: @match_arm_list +); + +#keyset[id, index] +match_arm_list_arms( + int id: @match_arm_list ref, + int index: int ref, + int arm: @match_arm ref +); + +#keyset[id, index] +match_arm_list_attrs( + int id: @match_arm_list ref, + int index: int ref, + int attr: @attr ref +); + +match_guards( + unique int id: @match_guard +); + +#keyset[id] +match_guard_conditions( + int id: @match_guard ref, + int condition: @expr ref +); + +@meta = + @cfg_attr_meta +| @cfg_meta +| @key_value_meta +| @path_meta +| @token_tree_meta +| @unsafe_meta +; + +names( + unique int id: @name +); + +#keyset[id] +name_texts( + int id: @name ref, + string text: string ref +); + +@param_base = + @param +| @self_param +; + +#keyset[id, index] +param_base_attrs( + int id: @param_base ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +param_base_type_reprs( + int id: @param_base ref, + int type_repr: @type_repr ref +); + +param_lists( + unique int id: @param_list +); + +#keyset[id, index] +param_list_params( + int id: @param_list ref, + int index: int ref, + int param: @param ref +); + +#keyset[id] +param_list_self_params( + int id: @param_list ref, + int self_param: @self_param ref +); + +parenthesized_arg_lists( + unique int id: @parenthesized_arg_list +); + +#keyset[id, index] +parenthesized_arg_list_type_args( + int id: @parenthesized_arg_list ref, + int index: int ref, + int type_arg: @type_arg ref +); + +@pat = + @box_pat +| @const_block_pat +| @ident_pat +| @literal_pat +| @macro_pat +| @or_pat +| @paren_pat +| @path_pat +| @range_pat +| @ref_pat +| @rest_pat +| @slice_pat +| @struct_pat +| @tuple_pat +| @tuple_struct_pat +| @wildcard_pat +; + +paths( + unique int id: @path +); + +#keyset[id] +path_qualifiers( + int id: @path ref, + int qualifier: @path ref +); + +#keyset[id] +path_segments_( + int id: @path ref, + int segment: @path_segment ref +); + +@path_ast_node = + @path_expr +| @path_pat +| @struct_expr +| @struct_pat +| @tuple_struct_pat +; + +#keyset[id] +path_ast_node_paths( + int id: @path_ast_node ref, + int path: @path ref +); + +path_segments( + unique int id: @path_segment +); + +#keyset[id] +path_segment_generic_arg_lists( + int id: @path_segment ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +path_segment_identifiers( + int id: @path_segment ref, + int identifier: @name_ref ref +); + +#keyset[id] +path_segment_parenthesized_arg_lists( + int id: @path_segment ref, + int parenthesized_arg_list: @parenthesized_arg_list ref +); + +#keyset[id] +path_segment_ret_types( + int id: @path_segment ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +path_segment_return_type_syntaxes( + int id: @path_segment ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +path_segment_type_reprs( + int id: @path_segment ref, + int type_repr: @type_repr ref +); + +#keyset[id] +path_segment_trait_type_reprs( + int id: @path_segment ref, + int trait_type_repr: @path_type_repr ref +); + +renames( + unique int id: @rename +); + +#keyset[id] +rename_names( + int id: @rename ref, + int name: @name ref +); + +ret_type_reprs( + unique int id: @ret_type_repr +); + +#keyset[id] +ret_type_repr_type_reprs( + int id: @ret_type_repr ref, + int type_repr: @type_repr ref +); + +return_type_syntaxes( + unique int id: @return_type_syntax +); + +source_files( + unique int id: @source_file +); + +#keyset[id, index] +source_file_attrs( + int id: @source_file ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +source_file_items( + int id: @source_file ref, + int index: int ref, + int item: @item ref +); + +@stmt = + @expr_stmt +| @item +| @let_stmt +; + +stmt_lists( + unique int id: @stmt_list +); + +#keyset[id, index] +stmt_list_attrs( + int id: @stmt_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +stmt_list_statements( + int id: @stmt_list ref, + int index: int ref, + int statement: @stmt ref +); + +#keyset[id] +stmt_list_tail_exprs( + int id: @stmt_list ref, + int tail_expr: @expr ref +); + +struct_expr_fields( + unique int id: @struct_expr_field +); + +#keyset[id, index] +struct_expr_field_attrs( + int id: @struct_expr_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_expr_field_exprs( + int id: @struct_expr_field ref, + int expr: @expr ref +); + +#keyset[id] +struct_expr_field_identifiers( + int id: @struct_expr_field ref, + int identifier: @name_ref ref +); + +struct_expr_field_lists( + unique int id: @struct_expr_field_list +); + +#keyset[id, index] +struct_expr_field_list_attrs( + int id: @struct_expr_field_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +struct_expr_field_list_fields( + int id: @struct_expr_field_list ref, + int index: int ref, + int field: @struct_expr_field ref +); + +#keyset[id] +struct_expr_field_list_spreads( + int id: @struct_expr_field_list ref, + int spread: @expr ref +); + +struct_fields( + unique int id: @struct_field +); + +#keyset[id, index] +struct_field_attrs( + int id: @struct_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_field_default_vals( + int id: @struct_field ref, + int default_val: @const_arg ref +); + +#keyset[id] +struct_field_is_unsafe( + int id: @struct_field ref +); + +#keyset[id] +struct_field_names( + int id: @struct_field ref, + int name: @name ref +); + +#keyset[id] +struct_field_type_reprs( + int id: @struct_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +struct_field_visibilities( + int id: @struct_field ref, + int visibility: @visibility ref +); + +struct_pat_fields( + unique int id: @struct_pat_field +); + +#keyset[id, index] +struct_pat_field_attrs( + int id: @struct_pat_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_pat_field_identifiers( + int id: @struct_pat_field ref, + int identifier: @name_ref ref +); + +#keyset[id] +struct_pat_field_pats( + int id: @struct_pat_field ref, + int pat: @pat ref +); + +struct_pat_field_lists( + unique int id: @struct_pat_field_list +); + +#keyset[id, index] +struct_pat_field_list_fields( + int id: @struct_pat_field_list ref, + int index: int ref, + int field: @struct_pat_field ref +); + +#keyset[id] +struct_pat_field_list_rest_pats( + int id: @struct_pat_field_list ref, + int rest_pat: @rest_pat ref +); + +@token = + @comment +; + +token_trees( + unique int id: @token_tree +); + +try_block_modifiers( + unique int id: @try_block_modifier +); + +#keyset[id] +try_block_modifier_is_try( + int id: @try_block_modifier ref +); + +#keyset[id] +try_block_modifier_type_reprs( + int id: @try_block_modifier ref, + int type_repr: @type_repr ref +); + +tuple_fields( + unique int id: @tuple_field +); + +#keyset[id, index] +tuple_field_attrs( + int id: @tuple_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +tuple_field_type_reprs( + int id: @tuple_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +tuple_field_visibilities( + int id: @tuple_field ref, + int visibility: @visibility ref +); + +type_bounds( + unique int id: @type_bound +); + +#keyset[id] +type_bound_for_binders( + int id: @type_bound ref, + int for_binder: @for_binder ref +); + +#keyset[id] +type_bound_is_async( + int id: @type_bound ref +); + +#keyset[id] +type_bound_is_const( + int id: @type_bound ref +); + +#keyset[id] +type_bound_lifetimes( + int id: @type_bound ref, + int lifetime: @lifetime ref +); + +#keyset[id] +type_bound_type_reprs( + int id: @type_bound ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_bound_use_bound_generic_args( + int id: @type_bound ref, + int use_bound_generic_args: @use_bound_generic_args ref +); + +type_bound_lists( + unique int id: @type_bound_list +); + +#keyset[id, index] +type_bound_list_bounds( + int id: @type_bound_list ref, + int index: int ref, + int bound: @type_bound ref +); + +@type_repr = + @array_type_repr +| @dyn_trait_type_repr +| @fn_ptr_type_repr +| @for_type_repr +| @impl_trait_type_repr +| @infer_type_repr +| @macro_type_repr +| @never_type_repr +| @paren_type_repr +| @path_type_repr +| @ptr_type_repr +| @ref_type_repr +| @slice_type_repr +| @tuple_type_repr +; + +@use_bound_generic_arg = + @lifetime +| @name_ref +; + +use_bound_generic_args( + unique int id: @use_bound_generic_args +); + +#keyset[id, index] +use_bound_generic_args_use_bound_generic_args( + int id: @use_bound_generic_args ref, + int index: int ref, + int use_bound_generic_arg: @use_bound_generic_arg ref +); + +use_trees( + unique int id: @use_tree +); + +#keyset[id] +use_tree_is_glob( + int id: @use_tree ref +); + +#keyset[id] +use_tree_paths( + int id: @use_tree ref, + int path: @path ref +); + +#keyset[id] +use_tree_renames( + int id: @use_tree ref, + int rename: @rename ref +); + +#keyset[id] +use_tree_use_tree_lists( + int id: @use_tree ref, + int use_tree_list: @use_tree_list ref +); + +use_tree_lists( + unique int id: @use_tree_list +); + +#keyset[id, index] +use_tree_list_use_trees( + int id: @use_tree_list ref, + int index: int ref, + int use_tree: @use_tree ref +); + +variant_lists( + unique int id: @variant_list +); + +#keyset[id, index] +variant_list_variants( + int id: @variant_list ref, + int index: int ref, + int variant: @variant ref +); + +visibilities( + unique int id: @visibility +); + +#keyset[id] +visibility_paths( + int id: @visibility ref, + int path: @path ref +); + +where_clauses( + unique int id: @where_clause +); + +#keyset[id, index] +where_clause_predicates( + int id: @where_clause ref, + int index: int ref, + int predicate: @where_pred ref +); + +where_preds( + unique int id: @where_pred +); + +#keyset[id] +where_pred_for_binders( + int id: @where_pred ref, + int for_binder: @for_binder ref +); + +#keyset[id] +where_pred_lifetimes( + int id: @where_pred ref, + int lifetime: @lifetime ref +); + +#keyset[id] +where_pred_type_reprs( + int id: @where_pred ref, + int type_repr: @type_repr ref +); + +#keyset[id] +where_pred_type_bound_lists( + int id: @where_pred ref, + int type_bound_list: @type_bound_list ref +); + +array_expr_internals( + unique int id: @array_expr_internal +); + +#keyset[id, index] +array_expr_internal_attrs( + int id: @array_expr_internal ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +array_expr_internal_exprs( + int id: @array_expr_internal ref, + int index: int ref, + int expr: @expr ref +); + +#keyset[id] +array_expr_internal_is_semicolon( + int id: @array_expr_internal ref +); + +array_type_reprs( + unique int id: @array_type_repr +); + +#keyset[id] +array_type_repr_const_args( + int id: @array_type_repr ref, + int const_arg: @const_arg ref +); + +#keyset[id] +array_type_repr_element_type_reprs( + int id: @array_type_repr ref, + int element_type_repr: @type_repr ref +); + +asm_clobber_abis( + unique int id: @asm_clobber_abi +); + +asm_consts( + unique int id: @asm_const +); + +#keyset[id] +asm_const_exprs( + int id: @asm_const ref, + int expr: @expr ref +); + +#keyset[id] +asm_const_is_const( + int id: @asm_const ref +); + +asm_labels( + unique int id: @asm_label +); + +#keyset[id] +asm_label_block_exprs( + int id: @asm_label ref, + int block_expr: @block_expr ref +); + +asm_operand_nameds( + unique int id: @asm_operand_named +); + +#keyset[id] +asm_operand_named_asm_operands( + int id: @asm_operand_named ref, + int asm_operand: @asm_operand ref +); + +#keyset[id] +asm_operand_named_names( + int id: @asm_operand_named ref, + int name: @name ref +); + +asm_options_lists( + unique int id: @asm_options_list +); + +#keyset[id, index] +asm_options_list_asm_options( + int id: @asm_options_list ref, + int index: int ref, + int asm_option: @asm_option ref +); + +asm_reg_operands( + unique int id: @asm_reg_operand +); + +#keyset[id] +asm_reg_operand_asm_dir_specs( + int id: @asm_reg_operand ref, + int asm_dir_spec: @asm_dir_spec ref +); + +#keyset[id] +asm_reg_operand_asm_operand_exprs( + int id: @asm_reg_operand ref, + int asm_operand_expr: @asm_operand_expr ref +); + +#keyset[id] +asm_reg_operand_asm_reg_specs( + int id: @asm_reg_operand ref, + int asm_reg_spec: @asm_reg_spec ref +); + +asm_syms( + unique int id: @asm_sym +); + +#keyset[id] +asm_sym_paths( + int id: @asm_sym ref, + int path: @path ref +); + +assoc_type_args( + unique int id: @assoc_type_arg +); + +#keyset[id] +assoc_type_arg_const_args( + int id: @assoc_type_arg ref, + int const_arg: @const_arg ref +); + +#keyset[id] +assoc_type_arg_generic_arg_lists( + int id: @assoc_type_arg ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +assoc_type_arg_identifiers( + int id: @assoc_type_arg ref, + int identifier: @name_ref ref +); + +#keyset[id] +assoc_type_arg_param_lists( + int id: @assoc_type_arg ref, + int param_list: @param_list ref +); + +#keyset[id] +assoc_type_arg_ret_types( + int id: @assoc_type_arg ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +assoc_type_arg_return_type_syntaxes( + int id: @assoc_type_arg ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +assoc_type_arg_type_reprs( + int id: @assoc_type_arg ref, + int type_repr: @type_repr ref +); + +#keyset[id] +assoc_type_arg_type_bound_lists( + int id: @assoc_type_arg ref, + int type_bound_list: @type_bound_list ref +); + +await_exprs( + unique int id: @await_expr +); + +#keyset[id, index] +await_expr_attrs( + int id: @await_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +await_expr_exprs( + int id: @await_expr ref, + int expr: @expr ref +); + +become_exprs( + unique int id: @become_expr +); + +#keyset[id, index] +become_expr_attrs( + int id: @become_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +become_expr_exprs( + int id: @become_expr ref, + int expr: @expr ref +); + +binary_exprs( + unique int id: @binary_expr +); + +#keyset[id, index] +binary_expr_attrs( + int id: @binary_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +binary_expr_lhs( + int id: @binary_expr ref, + int lhs: @expr ref +); + +#keyset[id] +binary_expr_operator_names( + int id: @binary_expr ref, + string operator_name: string ref +); + +#keyset[id] +binary_expr_rhs( + int id: @binary_expr ref, + int rhs: @expr ref +); + +box_pats( + unique int id: @box_pat +); + +#keyset[id] +box_pat_pats( + int id: @box_pat ref, + int pat: @pat ref +); + +break_exprs( + unique int id: @break_expr +); + +#keyset[id, index] +break_expr_attrs( + int id: @break_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +break_expr_exprs( + int id: @break_expr ref, + int expr: @expr ref +); + +#keyset[id] +break_expr_lifetimes( + int id: @break_expr ref, + int lifetime: @lifetime ref +); + +call_exprs( + unique int id: @call_expr +); + +#keyset[id] +call_expr_arg_lists( + int id: @call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +call_expr_attrs( + int id: @call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +call_expr_functions( + int id: @call_expr ref, + int function: @expr ref +); + +cast_exprs( + unique int id: @cast_expr +); + +#keyset[id, index] +cast_expr_attrs( + int id: @cast_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +cast_expr_exprs( + int id: @cast_expr ref, + int expr: @expr ref +); + +#keyset[id] +cast_expr_type_reprs( + int id: @cast_expr ref, + int type_repr: @type_repr ref +); + +cfg_atoms( + unique int id: @cfg_atom +); + +cfg_attr_meta( + unique int id: @cfg_attr_meta +); + +#keyset[id] +cfg_attr_meta_cfg_predicates( + int id: @cfg_attr_meta ref, + int cfg_predicate: @cfg_predicate ref +); + +#keyset[id, index] +cfg_attr_meta_metas( + int id: @cfg_attr_meta ref, + int index: int ref, + int meta: @meta ref +); + +cfg_composites( + unique int id: @cfg_composite +); + +#keyset[id, index] +cfg_composite_cfg_predicates( + int id: @cfg_composite ref, + int index: int ref, + int cfg_predicate: @cfg_predicate ref +); + +cfg_meta( + unique int id: @cfg_meta +); + +#keyset[id] +cfg_meta_cfg_predicates( + int id: @cfg_meta ref, + int cfg_predicate: @cfg_predicate ref +); + +closure_exprs( + unique int id: @closure_expr +); + +#keyset[id] +closure_expr_closure_bodies( + int id: @closure_expr ref, + int closure_body: @expr ref +); + +#keyset[id] +closure_expr_for_binders( + int id: @closure_expr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +closure_expr_is_async( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_const( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_gen( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_move( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_static( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_ret_types( + int id: @closure_expr ref, + int ret_type: @ret_type_repr ref +); + +comments( + unique int id: @comment, + int parent: @ast_node ref, + string text: string ref +); + +const_args( + unique int id: @const_arg +); + +#keyset[id] +const_arg_exprs( + int id: @const_arg ref, + int expr: @expr ref +); + +const_block_pats( + unique int id: @const_block_pat +); + +#keyset[id] +const_block_pat_block_exprs( + int id: @const_block_pat ref, + int block_expr: @block_expr ref +); + +#keyset[id] +const_block_pat_is_const( + int id: @const_block_pat ref +); + +const_params( + unique int id: @const_param +); + +#keyset[id, index] +const_param_attrs( + int id: @const_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_param_default_vals( + int id: @const_param ref, + int default_val: @const_arg ref +); + +#keyset[id] +const_param_is_const( + int id: @const_param ref +); + +#keyset[id] +const_param_names( + int id: @const_param ref, + int name: @name ref +); + +#keyset[id] +const_param_type_reprs( + int id: @const_param ref, + int type_repr: @type_repr ref +); + +continue_exprs( + unique int id: @continue_expr +); + +#keyset[id, index] +continue_expr_attrs( + int id: @continue_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +continue_expr_lifetimes( + int id: @continue_expr ref, + int lifetime: @lifetime ref +); + +dyn_trait_type_reprs( + unique int id: @dyn_trait_type_repr +); + +#keyset[id] +dyn_trait_type_repr_type_bound_lists( + int id: @dyn_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +expr_stmts( + unique int id: @expr_stmt +); + +#keyset[id] +expr_stmt_exprs( + int id: @expr_stmt ref, + int expr: @expr ref +); + +field_exprs( + unique int id: @field_expr +); + +#keyset[id, index] +field_expr_attrs( + int id: @field_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +field_expr_containers( + int id: @field_expr ref, + int container: @expr ref +); + +#keyset[id] +field_expr_identifiers( + int id: @field_expr ref, + int identifier: @name_ref ref +); + +fn_ptr_type_reprs( + unique int id: @fn_ptr_type_repr +); + +#keyset[id] +fn_ptr_type_repr_abis( + int id: @fn_ptr_type_repr ref, + int abi: @abi ref +); + +#keyset[id] +fn_ptr_type_repr_is_async( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_const( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_unsafe( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_param_lists( + int id: @fn_ptr_type_repr ref, + int param_list: @param_list ref +); + +#keyset[id] +fn_ptr_type_repr_ret_types( + int id: @fn_ptr_type_repr ref, + int ret_type: @ret_type_repr ref +); + +for_type_reprs( + unique int id: @for_type_repr +); + +#keyset[id] +for_type_repr_for_binders( + int id: @for_type_repr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +for_type_repr_type_reprs( + int id: @for_type_repr ref, + int type_repr: @type_repr ref +); + +format_args_exprs( + unique int id: @format_args_expr +); + +#keyset[id, index] +format_args_expr_args( + int id: @format_args_expr ref, + int index: int ref, + int arg: @format_args_arg ref +); + +#keyset[id, index] +format_args_expr_attrs( + int id: @format_args_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +format_args_expr_templates( + int id: @format_args_expr ref, + int template: @expr ref +); + +ident_pats( + unique int id: @ident_pat +); + +#keyset[id, index] +ident_pat_attrs( + int id: @ident_pat ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ident_pat_is_mut( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_is_ref( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_names( + int id: @ident_pat ref, + int name: @name ref +); + +#keyset[id] +ident_pat_pats( + int id: @ident_pat ref, + int pat: @pat ref +); + +if_exprs( + unique int id: @if_expr +); + +#keyset[id, index] +if_expr_attrs( + int id: @if_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +if_expr_conditions( + int id: @if_expr ref, + int condition: @expr ref +); + +#keyset[id] +if_expr_elses( + int id: @if_expr ref, + int else: @expr ref +); + +#keyset[id] +if_expr_thens( + int id: @if_expr ref, + int then: @block_expr ref +); + +impl_trait_type_reprs( + unique int id: @impl_trait_type_repr +); + +#keyset[id] +impl_trait_type_repr_type_bound_lists( + int id: @impl_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +index_exprs( + unique int id: @index_expr +); + +#keyset[id, index] +index_expr_attrs( + int id: @index_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +index_expr_bases( + int id: @index_expr ref, + int base: @expr ref +); + +#keyset[id] +index_expr_indices( + int id: @index_expr ref, + int index: @expr ref +); + +infer_type_reprs( + unique int id: @infer_type_repr +); + +@item = + @asm_expr +| @assoc_item +| @extern_block +| @extern_crate +| @extern_item +| @impl +| @macro_def +| @macro_rules +| @module +| @trait +| @type_item +| @use +; + +#keyset[id] +item_attribute_macro_expansions( + int id: @item ref, + int attribute_macro_expansion: @macro_items ref +); + +key_value_meta( + unique int id: @key_value_meta +); + +#keyset[id] +key_value_meta_exprs( + int id: @key_value_meta ref, + int expr: @expr ref +); + +#keyset[id] +key_value_meta_paths( + int id: @key_value_meta ref, + int path: @path ref +); + +@labelable_expr = + @block_expr +| @looping_expr +; + +#keyset[id] +labelable_expr_labels( + int id: @labelable_expr ref, + int label: @label ref +); + +let_exprs( + unique int id: @let_expr +); + +#keyset[id, index] +let_expr_attrs( + int id: @let_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_expr_scrutinees( + int id: @let_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +let_expr_pats( + int id: @let_expr ref, + int pat: @pat ref +); + +let_stmts( + unique int id: @let_stmt +); + +#keyset[id, index] +let_stmt_attrs( + int id: @let_stmt ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_stmt_initializers( + int id: @let_stmt ref, + int initializer: @expr ref +); + +#keyset[id] +let_stmt_let_elses( + int id: @let_stmt ref, + int let_else: @let_else ref +); + +#keyset[id] +let_stmt_pats( + int id: @let_stmt ref, + int pat: @pat ref +); + +#keyset[id] +let_stmt_type_reprs( + int id: @let_stmt ref, + int type_repr: @type_repr ref +); + +lifetimes( + unique int id: @lifetime +); + +#keyset[id] +lifetime_texts( + int id: @lifetime ref, + string text: string ref +); + +lifetime_args( + unique int id: @lifetime_arg +); + +#keyset[id] +lifetime_arg_lifetimes( + int id: @lifetime_arg ref, + int lifetime: @lifetime ref +); + +lifetime_params( + unique int id: @lifetime_param +); + +#keyset[id, index] +lifetime_param_attrs( + int id: @lifetime_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +lifetime_param_lifetimes( + int id: @lifetime_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +lifetime_param_type_bound_lists( + int id: @lifetime_param ref, + int type_bound_list: @type_bound_list ref +); + +literal_exprs( + unique int id: @literal_expr +); + +#keyset[id, index] +literal_expr_attrs( + int id: @literal_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +literal_expr_text_values( + int id: @literal_expr ref, + string text_value: string ref +); + +literal_pats( + unique int id: @literal_pat +); + +#keyset[id] +literal_pat_literals( + int id: @literal_pat ref, + int literal: @literal_expr ref +); + +macro_exprs( + unique int id: @macro_expr +); + +#keyset[id] +macro_expr_macro_calls( + int id: @macro_expr ref, + int macro_call: @macro_call ref +); + +macro_pats( + unique int id: @macro_pat +); + +#keyset[id] +macro_pat_macro_calls( + int id: @macro_pat ref, + int macro_call: @macro_call ref +); + +macro_type_reprs( + unique int id: @macro_type_repr +); + +#keyset[id] +macro_type_repr_macro_calls( + int id: @macro_type_repr ref, + int macro_call: @macro_call ref +); + +match_exprs( + unique int id: @match_expr +); + +#keyset[id, index] +match_expr_attrs( + int id: @match_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_expr_scrutinees( + int id: @match_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +match_expr_match_arm_lists( + int id: @match_expr ref, + int match_arm_list: @match_arm_list ref +); + +method_call_exprs( + unique int id: @method_call_expr +); + +#keyset[id] +method_call_expr_arg_lists( + int id: @method_call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +method_call_expr_attrs( + int id: @method_call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +method_call_expr_generic_arg_lists( + int id: @method_call_expr ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +method_call_expr_identifiers( + int id: @method_call_expr ref, + int identifier: @name_ref ref +); + +#keyset[id] +method_call_expr_receivers( + int id: @method_call_expr ref, + int receiver: @expr ref +); + +name_refs( + unique int id: @name_ref +); + +#keyset[id] +name_ref_texts( + int id: @name_ref ref, + string text: string ref +); + +never_type_reprs( + unique int id: @never_type_repr +); + +offset_of_exprs( + unique int id: @offset_of_expr +); + +#keyset[id, index] +offset_of_expr_attrs( + int id: @offset_of_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +offset_of_expr_fields( + int id: @offset_of_expr ref, + int index: int ref, + int field: @name_ref ref +); + +#keyset[id] +offset_of_expr_type_reprs( + int id: @offset_of_expr ref, + int type_repr: @type_repr ref +); + +or_pats( + unique int id: @or_pat +); + +#keyset[id, index] +or_pat_pats( + int id: @or_pat ref, + int index: int ref, + int pat: @pat ref +); + +params( + unique int id: @param +); + +#keyset[id] +param_pats( + int id: @param ref, + int pat: @pat ref +); + +paren_exprs( + unique int id: @paren_expr +); + +#keyset[id, index] +paren_expr_attrs( + int id: @paren_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +paren_expr_exprs( + int id: @paren_expr ref, + int expr: @expr ref +); + +paren_pats( + unique int id: @paren_pat +); + +#keyset[id] +paren_pat_pats( + int id: @paren_pat ref, + int pat: @pat ref +); + +paren_type_reprs( + unique int id: @paren_type_repr +); + +#keyset[id] +paren_type_repr_type_reprs( + int id: @paren_type_repr ref, + int type_repr: @type_repr ref +); + +@path_expr_base = + @path_expr +; + +path_meta( + unique int id: @path_meta +); + +#keyset[id] +path_meta_paths( + int id: @path_meta ref, + int path: @path ref +); + +path_pats( + unique int id: @path_pat +); + +path_type_reprs( + unique int id: @path_type_repr +); + +#keyset[id] +path_type_repr_paths( + int id: @path_type_repr ref, + int path: @path ref +); + +prefix_exprs( + unique int id: @prefix_expr +); + +#keyset[id, index] +prefix_expr_attrs( + int id: @prefix_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +prefix_expr_exprs( + int id: @prefix_expr ref, + int expr: @expr ref +); + +#keyset[id] +prefix_expr_operator_names( + int id: @prefix_expr ref, + string operator_name: string ref +); + +ptr_type_reprs( + unique int id: @ptr_type_repr +); + +#keyset[id] +ptr_type_repr_is_const( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_is_mut( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_type_reprs( + int id: @ptr_type_repr ref, + int type_repr: @type_repr ref +); + +range_exprs( + unique int id: @range_expr +); + +#keyset[id, index] +range_expr_attrs( + int id: @range_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +range_expr_ends( + int id: @range_expr ref, + int end: @expr ref +); + +#keyset[id] +range_expr_operator_names( + int id: @range_expr ref, + string operator_name: string ref +); + +#keyset[id] +range_expr_starts( + int id: @range_expr ref, + int start: @expr ref +); + +range_pats( + unique int id: @range_pat +); + +#keyset[id] +range_pat_ends( + int id: @range_pat ref, + int end: @pat ref +); + +#keyset[id] +range_pat_operator_names( + int id: @range_pat ref, + string operator_name: string ref +); + +#keyset[id] +range_pat_starts( + int id: @range_pat ref, + int start: @pat ref +); + +ref_exprs( + unique int id: @ref_expr +); + +#keyset[id, index] +ref_expr_attrs( + int id: @ref_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ref_expr_exprs( + int id: @ref_expr ref, + int expr: @expr ref +); + +#keyset[id] +ref_expr_is_const( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_mut( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_raw( + int id: @ref_expr ref +); + +ref_pats( + unique int id: @ref_pat +); + +#keyset[id] +ref_pat_is_mut( + int id: @ref_pat ref +); + +#keyset[id] +ref_pat_pats( + int id: @ref_pat ref, + int pat: @pat ref +); + +ref_type_reprs( + unique int id: @ref_type_repr +); + +#keyset[id] +ref_type_repr_is_mut( + int id: @ref_type_repr ref +); + +#keyset[id] +ref_type_repr_lifetimes( + int id: @ref_type_repr ref, + int lifetime: @lifetime ref +); + +#keyset[id] +ref_type_repr_type_reprs( + int id: @ref_type_repr ref, + int type_repr: @type_repr ref +); + +rest_pats( + unique int id: @rest_pat +); + +#keyset[id, index] +rest_pat_attrs( + int id: @rest_pat ref, + int index: int ref, + int attr: @attr ref +); + +return_exprs( + unique int id: @return_expr +); + +#keyset[id, index] +return_expr_attrs( + int id: @return_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +return_expr_exprs( + int id: @return_expr ref, + int expr: @expr ref +); + +self_params( + unique int id: @self_param +); + +#keyset[id] +self_param_is_ref( + int id: @self_param ref +); + +#keyset[id] +self_param_is_mut( + int id: @self_param ref +); + +#keyset[id] +self_param_lifetimes( + int id: @self_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +self_param_names( + int id: @self_param ref, + int name: @name ref +); + +slice_pats( + unique int id: @slice_pat +); + +#keyset[id, index] +slice_pat_pats( + int id: @slice_pat ref, + int index: int ref, + int pat: @pat ref +); + +slice_type_reprs( + unique int id: @slice_type_repr +); + +#keyset[id] +slice_type_repr_type_reprs( + int id: @slice_type_repr ref, + int type_repr: @type_repr ref +); + +struct_exprs( + unique int id: @struct_expr +); + +#keyset[id] +struct_expr_struct_expr_field_lists( + int id: @struct_expr ref, + int struct_expr_field_list: @struct_expr_field_list ref +); + +struct_field_lists( + unique int id: @struct_field_list +); + +#keyset[id, index] +struct_field_list_fields( + int id: @struct_field_list ref, + int index: int ref, + int field: @struct_field ref +); + +struct_pats( + unique int id: @struct_pat +); + +#keyset[id] +struct_pat_struct_pat_field_lists( + int id: @struct_pat ref, + int struct_pat_field_list: @struct_pat_field_list ref +); + +token_tree_meta( + unique int id: @token_tree_meta +); + +#keyset[id] +token_tree_meta_paths( + int id: @token_tree_meta ref, + int path: @path ref +); + +#keyset[id] +token_tree_meta_token_trees( + int id: @token_tree_meta ref, + int token_tree: @token_tree ref +); + +try_exprs( + unique int id: @try_expr +); + +#keyset[id, index] +try_expr_attrs( + int id: @try_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +try_expr_exprs( + int id: @try_expr ref, + int expr: @expr ref +); + +tuple_exprs( + unique int id: @tuple_expr +); + +#keyset[id, index] +tuple_expr_attrs( + int id: @tuple_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +tuple_expr_fields( + int id: @tuple_expr ref, + int index: int ref, + int field: @expr ref +); + +tuple_field_lists( + unique int id: @tuple_field_list +); + +#keyset[id, index] +tuple_field_list_fields( + int id: @tuple_field_list ref, + int index: int ref, + int field: @tuple_field ref +); + +tuple_pats( + unique int id: @tuple_pat +); + +#keyset[id, index] +tuple_pat_fields( + int id: @tuple_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_struct_pats( + unique int id: @tuple_struct_pat +); + +#keyset[id, index] +tuple_struct_pat_fields( + int id: @tuple_struct_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_type_reprs( + unique int id: @tuple_type_repr +); + +#keyset[id, index] +tuple_type_repr_fields( + int id: @tuple_type_repr ref, + int index: int ref, + int field: @type_repr ref +); + +type_args( + unique int id: @type_arg +); + +#keyset[id] +type_arg_type_reprs( + int id: @type_arg ref, + int type_repr: @type_repr ref +); + +type_params( + unique int id: @type_param +); + +#keyset[id, index] +type_param_attrs( + int id: @type_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_param_default_types( + int id: @type_param ref, + int default_type: @type_repr ref +); + +#keyset[id] +type_param_names( + int id: @type_param ref, + int name: @name ref +); + +#keyset[id] +type_param_type_bound_lists( + int id: @type_param ref, + int type_bound_list: @type_bound_list ref +); + +underscore_exprs( + unique int id: @underscore_expr +); + +#keyset[id, index] +underscore_expr_attrs( + int id: @underscore_expr ref, + int index: int ref, + int attr: @attr ref +); + +unsafe_meta( + unique int id: @unsafe_meta +); + +#keyset[id] +unsafe_meta_is_unsafe( + int id: @unsafe_meta ref +); + +#keyset[id] +unsafe_meta_meta( + int id: @unsafe_meta ref, + int meta: @meta ref +); + +variants( + unique int id: @variant +); + +#keyset[id, index] +variant_attrs( + int id: @variant ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +variant_const_args( + int id: @variant ref, + int const_arg: @const_arg ref +); + +#keyset[id] +variant_field_lists( + int id: @variant ref, + int field_list: @field_list ref +); + +#keyset[id] +variant_names( + int id: @variant ref, + int name: @name ref +); + +#keyset[id] +variant_visibilities( + int id: @variant ref, + int visibility: @visibility ref +); + +wildcard_pats( + unique int id: @wildcard_pat +); + +yeet_exprs( + unique int id: @yeet_expr +); + +#keyset[id, index] +yeet_expr_attrs( + int id: @yeet_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yeet_expr_exprs( + int id: @yeet_expr ref, + int expr: @expr ref +); + +yield_exprs( + unique int id: @yield_expr +); + +#keyset[id, index] +yield_expr_attrs( + int id: @yield_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yield_expr_exprs( + int id: @yield_expr ref, + int expr: @expr ref +); + +asm_exprs( + unique int id: @asm_expr +); + +#keyset[id, index] +asm_expr_asm_pieces( + int id: @asm_expr ref, + int index: int ref, + int asm_piece: @asm_piece ref +); + +#keyset[id, index] +asm_expr_attrs( + int id: @asm_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +asm_expr_templates( + int id: @asm_expr ref, + int index: int ref, + int template: @expr ref +); + +@assoc_item = + @const +| @function +| @macro_call +| @type_alias +; + +block_exprs( + unique int id: @block_expr +); + +#keyset[id, index] +block_expr_attrs( + int id: @block_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +block_expr_is_async( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_const( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_gen( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_move( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_unsafe( + int id: @block_expr ref +); + +#keyset[id] +block_expr_stmt_lists( + int id: @block_expr ref, + int stmt_list: @stmt_list ref +); + +#keyset[id] +block_expr_try_block_modifiers( + int id: @block_expr ref, + int try_block_modifier: @try_block_modifier ref +); + +extern_blocks( + unique int id: @extern_block +); + +#keyset[id] +extern_block_abis( + int id: @extern_block ref, + int abi: @abi ref +); + +#keyset[id, index] +extern_block_attrs( + int id: @extern_block ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_block_extern_item_lists( + int id: @extern_block ref, + int extern_item_list: @extern_item_list ref +); + +#keyset[id] +extern_block_is_unsafe( + int id: @extern_block ref +); + +extern_crates( + unique int id: @extern_crate +); + +#keyset[id, index] +extern_crate_attrs( + int id: @extern_crate ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_crate_identifiers( + int id: @extern_crate ref, + int identifier: @name_ref ref +); + +#keyset[id] +extern_crate_renames( + int id: @extern_crate ref, + int rename: @rename ref +); + +#keyset[id] +extern_crate_visibilities( + int id: @extern_crate ref, + int visibility: @visibility ref +); + +@extern_item = + @function +| @macro_call +| @static +| @type_alias +; + +impls( + unique int id: @impl +); + +#keyset[id] +impl_assoc_item_lists( + int id: @impl ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +impl_attrs( + int id: @impl ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +impl_generic_param_lists( + int id: @impl ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +impl_is_const( + int id: @impl ref +); + +#keyset[id] +impl_is_default( + int id: @impl ref +); + +#keyset[id] +impl_is_unsafe( + int id: @impl ref +); + +#keyset[id] +impl_self_ties( + int id: @impl ref, + int self_ty: @type_repr ref +); + +#keyset[id] +impl_traits( + int id: @impl ref, + int trait: @type_repr ref +); + +#keyset[id] +impl_visibilities( + int id: @impl ref, + int visibility: @visibility ref +); + +#keyset[id] +impl_where_clauses( + int id: @impl ref, + int where_clause: @where_clause ref +); + +@looping_expr = + @for_expr +| @loop_expr +| @while_expr +; + +#keyset[id] +looping_expr_loop_bodies( + int id: @looping_expr ref, + int loop_body: @block_expr ref +); + +macro_defs( + unique int id: @macro_def +); + +#keyset[id] +macro_def_args( + int id: @macro_def ref, + int args: @token_tree ref +); + +#keyset[id, index] +macro_def_attrs( + int id: @macro_def ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_def_bodies( + int id: @macro_def ref, + int body: @token_tree ref +); + +#keyset[id] +macro_def_names( + int id: @macro_def ref, + int name: @name ref +); + +#keyset[id] +macro_def_visibilities( + int id: @macro_def ref, + int visibility: @visibility ref +); + +macro_rules( + unique int id: @macro_rules +); + +#keyset[id, index] +macro_rules_attrs( + int id: @macro_rules ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_rules_names( + int id: @macro_rules ref, + int name: @name ref +); + +#keyset[id] +macro_rules_token_trees( + int id: @macro_rules ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_rules_visibilities( + int id: @macro_rules ref, + int visibility: @visibility ref +); + +modules( + unique int id: @module +); + +#keyset[id, index] +module_attrs( + int id: @module ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +module_item_lists( + int id: @module ref, + int item_list: @item_list ref +); + +#keyset[id] +module_names( + int id: @module ref, + int name: @name ref +); + +#keyset[id] +module_visibilities( + int id: @module ref, + int visibility: @visibility ref +); + +path_exprs( + unique int id: @path_expr +); + +#keyset[id, index] +path_expr_attrs( + int id: @path_expr ref, + int index: int ref, + int attr: @attr ref +); + +traits( + unique int id: @trait +); + +#keyset[id] +trait_assoc_item_lists( + int id: @trait ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +trait_attrs( + int id: @trait ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_generic_param_lists( + int id: @trait ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_is_auto( + int id: @trait ref +); + +#keyset[id] +trait_is_unsafe( + int id: @trait ref +); + +#keyset[id] +trait_names( + int id: @trait ref, + int name: @name ref +); + +#keyset[id] +trait_type_bound_lists( + int id: @trait ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_visibilities( + int id: @trait ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_where_clauses( + int id: @trait ref, + int where_clause: @where_clause ref +); + +@type_item = + @enum +| @struct +| @union +; + +#keyset[id, index] +type_item_derive_macro_expansions( + int id: @type_item ref, + int index: int ref, + int derive_macro_expansion: @macro_items ref +); + +#keyset[id, index] +type_item_attrs( + int id: @type_item ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_item_generic_param_lists( + int id: @type_item ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_item_names( + int id: @type_item ref, + int name: @name ref +); + +#keyset[id] +type_item_visibilities( + int id: @type_item ref, + int visibility: @visibility ref +); + +#keyset[id] +type_item_where_clauses( + int id: @type_item ref, + int where_clause: @where_clause ref +); + +uses( + unique int id: @use +); + +#keyset[id, index] +use_attrs( + int id: @use ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +use_use_trees( + int id: @use ref, + int use_tree: @use_tree ref +); + +#keyset[id] +use_visibilities( + int id: @use ref, + int visibility: @visibility ref +); + +consts( + unique int id: @const +); + +#keyset[id, index] +const_attrs( + int id: @const ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_bodies( + int id: @const ref, + int body: @expr ref +); + +#keyset[id] +const_generic_param_lists( + int id: @const ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +const_is_const( + int id: @const ref +); + +#keyset[id] +const_is_default( + int id: @const ref +); + +#keyset[id] +const_names( + int id: @const ref, + int name: @name ref +); + +#keyset[id] +const_type_reprs( + int id: @const ref, + int type_repr: @type_repr ref +); + +#keyset[id] +const_visibilities( + int id: @const ref, + int visibility: @visibility ref +); + +#keyset[id] +const_where_clauses( + int id: @const ref, + int where_clause: @where_clause ref +); + +#keyset[id] +const_has_implementation( + int id: @const ref +); + +enums( + unique int id: @enum +); + +#keyset[id] +enum_variant_lists( + int id: @enum ref, + int variant_list: @variant_list ref +); + +for_exprs( + unique int id: @for_expr +); + +#keyset[id, index] +for_expr_attrs( + int id: @for_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +for_expr_iterables( + int id: @for_expr ref, + int iterable: @expr ref +); + +#keyset[id] +for_expr_pats( + int id: @for_expr ref, + int pat: @pat ref +); + +functions( + unique int id: @function +); + +#keyset[id] +function_abis( + int id: @function ref, + int abi: @abi ref +); + +#keyset[id] +function_function_bodies( + int id: @function ref, + int function_body: @block_expr ref +); + +#keyset[id] +function_generic_param_lists( + int id: @function ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +function_is_async( + int id: @function ref +); + +#keyset[id] +function_is_const( + int id: @function ref +); + +#keyset[id] +function_is_default( + int id: @function ref +); + +#keyset[id] +function_is_gen( + int id: @function ref +); + +#keyset[id] +function_is_unsafe( + int id: @function ref +); + +#keyset[id] +function_names( + int id: @function ref, + int name: @name ref +); + +#keyset[id] +function_ret_types( + int id: @function ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +function_visibilities( + int id: @function ref, + int visibility: @visibility ref +); + +#keyset[id] +function_where_clauses( + int id: @function ref, + int where_clause: @where_clause ref +); + +#keyset[id] +function_has_implementation( + int id: @function ref +); + +loop_exprs( + unique int id: @loop_expr +); + +#keyset[id, index] +loop_expr_attrs( + int id: @loop_expr ref, + int index: int ref, + int attr: @attr ref +); + +macro_calls( + unique int id: @macro_call +); + +#keyset[id, index] +macro_call_attrs( + int id: @macro_call ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_call_paths( + int id: @macro_call ref, + int path: @path ref +); + +#keyset[id] +macro_call_token_trees( + int id: @macro_call ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_call_macro_call_expansions( + int id: @macro_call ref, + int macro_call_expansion: @ast_node ref +); + +statics( + unique int id: @static +); + +#keyset[id, index] +static_attrs( + int id: @static ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +static_bodies( + int id: @static ref, + int body: @expr ref +); + +#keyset[id] +static_is_mut( + int id: @static ref +); + +#keyset[id] +static_is_static( + int id: @static ref +); + +#keyset[id] +static_is_unsafe( + int id: @static ref +); + +#keyset[id] +static_names( + int id: @static ref, + int name: @name ref +); + +#keyset[id] +static_type_reprs( + int id: @static ref, + int type_repr: @type_repr ref +); + +#keyset[id] +static_visibilities( + int id: @static ref, + int visibility: @visibility ref +); + +structs( + unique int id: @struct +); + +#keyset[id] +struct_field_lists_( + int id: @struct ref, + int field_list: @field_list ref +); + +type_aliases( + unique int id: @type_alias +); + +#keyset[id, index] +type_alias_attrs( + int id: @type_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_alias_generic_param_lists( + int id: @type_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_alias_is_default( + int id: @type_alias ref +); + +#keyset[id] +type_alias_names( + int id: @type_alias ref, + int name: @name ref +); + +#keyset[id] +type_alias_type_reprs( + int id: @type_alias ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_alias_type_bound_lists( + int id: @type_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +type_alias_visibilities( + int id: @type_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +type_alias_where_clauses( + int id: @type_alias ref, + int where_clause: @where_clause ref +); + +unions( + unique int id: @union +); + +#keyset[id] +union_struct_field_lists( + int id: @union ref, + int struct_field_list: @struct_field_list ref +); + +while_exprs( + unique int id: @while_expr +); + +#keyset[id, index] +while_expr_attrs( + int id: @while_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +while_expr_conditions( + int id: @while_expr ref, + int condition: @expr ref +); diff --git a/rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/upgrade.properties b/rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/upgrade.properties new file mode 100644 index 000000000000..e8888f4d7321 --- /dev/null +++ b/rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/upgrade.properties @@ -0,0 +1,19 @@ +description: Upgrade from rust-analyzer 0.0.301 to 0.0.328 +compatibility: partial + +block_expr_is_try.rel: delete +meta.rel: delete +meta_exprs.rel: delete +meta_is_unsafe.rel: delete +meta_paths.rel: delete +meta_token_trees.rel: delete +format_args_arg_names.rel: delete +struct_field_defaults.rel: delete +variant_discriminants.rel: delete +trait_aliases.rel: delete +trait_alias_attrs.rel: delete +trait_alias_generic_param_lists.rel: delete +trait_alias_names.rel: delete +trait_alias_type_bound_lists.rel: delete +trait_alias_visibilities.rel: delete +trait_alias_where_clauses.rel: delete diff --git a/rust/ql/src/queries/security/CWE-696/BadCtorInitialization.ql b/rust/ql/src/queries/security/CWE-696/BadCtorInitialization.ql index 7a206856adf8..04a991b9a004 100644 --- a/rust/ql/src/queries/security/CWE-696/BadCtorInitialization.ql +++ b/rust/ql/src/queries/security/CWE-696/BadCtorInitialization.ql @@ -12,6 +12,17 @@ */ import rust +private import codeql.rust.elements.PathMeta +private import codeql.rust.elements.KeyValueMeta +private import codeql.rust.elements.TokenTreeMeta + +private Path getMetaPath(Meta m) { + result = m.(PathMeta).getPath() + or + result = m.(KeyValueMeta).getPath() + or + result = m.(TokenTreeMeta).getPath() +} /** * A `#[ctor]` or `#[dtor]` attribute, that is, a source for this query. @@ -20,7 +31,7 @@ class CtorAttr extends Attr { string whichAttr; CtorAttr() { - whichAttr = this.getMeta().getPath().getText() and + whichAttr = getMetaPath(this.getMeta()).getText() and whichAttr = ["ctor", "dtor"] } From 87472288c30b51d2426cf1ae19ee636149209d38 Mon Sep 17 00:00:00 2001 From: Taus Date: Wed, 15 Apr 2026 15:12:41 +0000 Subject: [PATCH 0011/2098] Rust: fix formatting and codegen drift Re-run cargo fmt after clippy --fix to ensure consistent formatting. Re-run codegen to update generated file tracking for MetaImpl.qll. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- rust/ast-generator/src/main.rs | 13 +++--- rust/extractor/src/main.rs | 41 ++++++++++--------- rust/extractor/src/translate/base.rs | 28 +++++++------ rust/ql/.generated.list | 1 - rust/ql/.gitattributes | 1 - .../rust/elements/internal/MetaImpl.qll | 1 + 6 files changed, 44 insertions(+), 41 deletions(-) diff --git a/rust/ast-generator/src/main.rs b/rust/ast-generator/src/main.rs index 74fe9db9a7ed..9e5120847a54 100644 --- a/rust/ast-generator/src/main.rs +++ b/rust/ast-generator/src/main.rs @@ -309,12 +309,13 @@ fn get_fields(node: &AstNodeSrc) -> Vec { let mut result = Vec::new(); for field in &node.fields { if let Field::Token { token, .. } = field - && should_predicate_be_extracted(token) { - result.push(FieldInfo { - name: format!("is_{token}"), - ty: FieldType::Predicate, - }); - } + && should_predicate_be_extracted(token) + { + result.push(FieldInfo { + name: format!("is_{token}"), + ty: FieldType::Predicate, + }); + } } result.extend(get_additional_fields(&node.name)); diff --git a/rust/extractor/src/main.rs b/rust/extractor/src/main.rs index a838ebbafed1..d4c6e5352f7d 100644 --- a/rust/extractor/src/main.rs +++ b/rust/extractor/src/main.rs @@ -81,17 +81,18 @@ impl<'a> Extractor<'a> { } let no_location = (LineCol { line: 0, col: 0 }, LineCol { line: 0, col: 0 }); if let Err(RustAnalyzerNoSemantics { severity, reason }) = semantics_info - && !reason.is_empty() { - let message = format!("semantic analyzer unavailable ({reason})"); - let full_message = format!("{message}: macro expansion will be skipped."); - translator.emit_diagnostic( - severity, - "semantics".to_owned(), - message, - full_message, - no_location, - ); - } + && !reason.is_empty() + { + let message = format!("semantic analyzer unavailable ({reason})"); + let full_message = format!("{message}: macro expansion will be skipped."); + translator.emit_diagnostic( + severity, + "semantics".to_owned(), + message, + full_message, + no_location, + ); + } translator.emit_source_file(&ast); translator.emit_truncated_diagnostics_message(); translator.trap.commit().unwrap_or_else(|err| { @@ -301,15 +302,15 @@ fn main() -> anyhow::Result<()> { for (file_id, file) in vfs.iter() { if let Some(file) = file.as_path().map(<_ as AsRef>::as_ref) && file.extension().is_some_and(|ext| ext == "rs") - && processed_files.insert(file.to_owned()) - && db - .source_root(db.file_source_root(file_id).source_root_id(db)) - .source_root(db) - .is_library - { - extractor.extract_with_semantics(file, &semantics, vfs, library_mode); - extractor.archiver.archive(file); - } + && processed_files.insert(file.to_owned()) + && db + .source_root(db.file_source_root(file_id).source_root_id(db)) + .source_root(db) + .is_library + { + extractor.extract_with_semantics(file, &semantics, vfs, library_mode); + extractor.archiver.archive(file); + } } } else { for file in files { diff --git a/rust/extractor/src/translate/base.rs b/rust/extractor/src/translate/base.rs index fa0cf0e40c71..403e69c50c39 100644 --- a/rust/extractor/src/translate/base.rs +++ b/rust/extractor/src/translate/base.rs @@ -216,12 +216,13 @@ impl<'a> Translator<'a> { let parent_range = parent.syntax().text_range(); let token_range = token.text_range(); if let Some(clipped_range) = token_range.intersect(parent_range) - && let Some(parent_range2) = self.text_range_for_node(parent) { - let token_range = clipped_range + parent_range2.start() - parent_range.start(); - if let Some((start, end)) = self.location(token_range) { - self.trap.emit_location(self.label, label, start, end) - } + && let Some(parent_range2) = self.text_range_for_node(parent) + { + let token_range = clipped_range + parent_range2.start() - parent_range.start(); + if let Some((start, end)) = self.location(token_range) { + self.trap.emit_location(self.label, label, start, end) } + } } pub fn emit_diagnostic( &mut self, @@ -332,14 +333,15 @@ impl<'a> Translator<'a> { ) { for child in children { if let NodeOrToken::Token(token) = child - && token.kind() == SyntaxKind::COMMENT { - let label = self.trap.emit(generated::Comment { - id: TrapId::Star, - parent: parent_label, - text: token.text().to_owned(), - }); - self.emit_location_token(label.into(), parent_node, &token); - } + && token.kind() == SyntaxKind::COMMENT + { + let label = self.trap.emit(generated::Comment { + id: TrapId::Star, + parent: parent_label, + text: token.text().to_owned(), + }); + self.emit_location_token(label.into(), parent_node, &token); + } } } fn emit_macro_expansion_parse_errors( diff --git a/rust/ql/.generated.list b/rust/ql/.generated.list index bc9aabe628f3..9f8a07e67b09 100644 --- a/rust/ql/.generated.list +++ b/rust/ql/.generated.list @@ -340,7 +340,6 @@ lib/codeql/rust/elements/internal/MatchArmListImpl.qll 16de8d9e0768ee42c5069df5c lib/codeql/rust/elements/internal/MatchExprConstructor.qll 0355ca543a0f9ad56697bc2e1e2511fa3f233bc1f6344d9e1c2369106901c696 78622807a1c4bff61b751c715639510146c7a713e0c4f63246e9a2cf302f4875 lib/codeql/rust/elements/internal/MatchGuardConstructor.qll d4cae02d2902fe8d3cb6b9c2796137863f41f55840f6623935a1c99df43f28d8 0c89f2ca71a2fd5a3f365291e784cb779e34ba0542d9285515e1856424cec60d lib/codeql/rust/elements/internal/MatchGuardImpl.qll 489040ca1ea85edda91405fab3d12321b6541d2888c35356d3c14c707bf1468e 2b60223a822b840356a3668da3f9578e6a9b8f683fcdd3dbd99b5354c7d96095 -lib/codeql/rust/elements/internal/MetaImpl.qll ab77681dc271d26b4eb77d792fd9b24fce65b0f4a88056ad09aa9400d26b4b58 270e58d97c03357e92f777ce2bd332e2718e077a7faaa6778941a9d5b14e135d lib/codeql/rust/elements/internal/MethodCallExprConstructor.qll a1b3c4587f0ae60d206980b1d9e6881d998f29d2b592a73421d6a44124c70c20 8d4eaa3eb54653fac17f7d95e9cc833fe1398d27c02b2388cd9af8724a560ded lib/codeql/rust/elements/internal/MissingConstructor.qll aab0b7f2846f14a5914661a18c7c9eae71b9bde2162a3c5e5e8a8ecafa20e854 8f30b00b5b7918a7500786cc749b61695158b5b3cc8e9f2277b6b6bf0f7850a0 lib/codeql/rust/elements/internal/MissingImpl.qll e81caa383797dfe837cf101fb78d23ab150b32fef7b47ffcc5489bfcd942ac3e 9f3212d45d77e5888e435e7babd55c1e6b42c3c16f5b1f71170ac41f93ee8d0b diff --git a/rust/ql/.gitattributes b/rust/ql/.gitattributes index d4feb85fc476..6dc4ce6b105f 100644 --- a/rust/ql/.gitattributes +++ b/rust/ql/.gitattributes @@ -342,7 +342,6 @@ /lib/codeql/rust/elements/internal/MatchExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/MatchGuardConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/MatchGuardImpl.qll linguist-generated -/lib/codeql/rust/elements/internal/MetaImpl.qll linguist-generated /lib/codeql/rust/elements/internal/MethodCallExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/MissingConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/MissingImpl.qll linguist-generated diff --git a/rust/ql/lib/codeql/rust/elements/internal/MetaImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/MetaImpl.qll index 3c496845cec4..295decd667a9 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/MetaImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/MetaImpl.qll @@ -11,6 +11,7 @@ private import codeql.rust.elements.internal.generated.Meta * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A meta item in an attribute. * From 87a0ed190f01119dba4e18530dd2989b6f6f20ab Mon Sep 17 00:00:00 2001 From: Taus Date: Wed, 15 Apr 2026 15:29:00 +0000 Subject: [PATCH 0012/2098] Rust: fix LoadCargoConfig defaults (proc_macro_processes must be >= 1) Setting proc_macro_processes to 0 causes an index-out-of-bounds panic in ProcMacroServerPool::new when the proc macro server is enabled. Use the same defaults as rust-analyzer itself (1 each). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- rust/extractor/src/config.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rust/extractor/src/config.rs b/rust/extractor/src/config.rs index 0e682bbb06ef..7677025a66f2 100644 --- a/rust/extractor/src/config.rs +++ b/rust/extractor/src/config.rs @@ -197,8 +197,8 @@ impl Config { load_out_dirs_from_check: true, with_proc_macro_server: self.proc_macro_server_choice(dir), prefill_caches: false, - num_worker_threads: 0, - proc_macro_processes: 0, + num_worker_threads: 1, + proc_macro_processes: 1, }, ) } From 6057c79231b62125663e54f057c4220ed88d00d7 Mon Sep 17 00:00:00 2001 From: Taus Date: Wed, 15 Apr 2026 16:58:12 +0000 Subject: [PATCH 0013/2098] Rust: fix upgrade script and update test expectations - Remove format_args_arg_names from upgrade delete list (table exists in both schemas with different columns) - Accept updated .expected files for schema changes Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../upgrade.properties | 1 - .../canonical_path/canonical_paths.expected | 3 - .../generated/Attr/Attr.expected | 2 +- .../generated/BlockExpr/BlockExpr.expected | 7 +- .../FormatArgsExpr/FormatArgsArg.expected | 6 +- .../generated/MacroItems/MacroItems.expected | 2 - .../StructField/StructField.expected | 2 +- .../generated/Variant/Variant.expected | 2 +- .../macro-expansion/PrintAst.expected | 233 +------- .../macro-expansion/test.expected | 21 +- .../macro-in-library/PrintAst.expected | 2 +- .../web_frameworks/InlineFlow.expected | 6 +- .../web_frameworks/TaintSources.expected | 16 +- .../definitions/Definitions.expected | 6 +- .../security/CWE-079/actix/XSS.expected | 6 +- .../security/CWE-614/InsecureCookie.expected | 528 ++++-------------- .../CWE-696/BadCTorInitialization.expected | 8 +- .../UncontrolledAllocationSize.expected | 196 ++++--- .../CWE-825/AccessInvalidPointer.expected | 4 + 19 files changed, 272 insertions(+), 779 deletions(-) diff --git a/rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/upgrade.properties b/rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/upgrade.properties index e8888f4d7321..c130c0f83810 100644 --- a/rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/upgrade.properties +++ b/rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/upgrade.properties @@ -7,7 +7,6 @@ meta_exprs.rel: delete meta_is_unsafe.rel: delete meta_paths.rel: delete meta_token_trees.rel: delete -format_args_arg_names.rel: delete struct_field_defaults.rel: delete variant_discriminants.rel: delete trait_aliases.rel: delete diff --git a/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected b/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected index cfdb7fc723b0..5778e6f3a83a 100644 --- a/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected +++ b/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected @@ -4,9 +4,6 @@ | lib.rs:1:1:1:18 | mod anonymous | test::anonymous | | lib.rs:2:1:2:16 | mod regular | test::regular | | regular.rs:1:1:2:18 | struct Struct | test::regular::Struct | -| regular.rs:2:12:2:17 | fn eq | ::eq | -| regular.rs:2:12:2:17 | impl ...::Eq for Struct::<...> { ... } | | -| regular.rs:2:12:2:17 | impl ...::PartialEq for Struct::<...> { ... } | | | regular.rs:4:1:6:1 | trait Trait | test::regular::Trait | | regular.rs:5:5:5:16 | fn f | <_ as test::regular::Trait>::f | | regular.rs:8:1:10:1 | impl Trait for Struct { ... } | | diff --git a/rust/ql/test/extractor-tests/generated/Attr/Attr.expected b/rust/ql/test/extractor-tests/generated/Attr/Attr.expected index 1272453173d9..98a72a41f18a 100644 --- a/rust/ql/test/extractor-tests/generated/Attr/Attr.expected +++ b/rust/ql/test/extractor-tests/generated/Attr/Attr.expected @@ -1,4 +1,4 @@ instances | gen_attr.rs:7:5:7:20 | Attr | getMeta -| gen_attr.rs:7:5:7:20 | Attr | gen_attr.rs:7:7:7:19 | Meta | +| gen_attr.rs:7:5:7:20 | Attr | gen_attr.rs:7:7:7:19 | TokenTreeMeta | diff --git a/rust/ql/test/extractor-tests/generated/BlockExpr/BlockExpr.expected b/rust/ql/test/extractor-tests/generated/BlockExpr/BlockExpr.expected index 0423524834b7..843d156ff9a6 100644 --- a/rust/ql/test/extractor-tests/generated/BlockExpr/BlockExpr.expected +++ b/rust/ql/test/extractor-tests/generated/BlockExpr/BlockExpr.expected @@ -1,7 +1,7 @@ instances -| gen_block_expr.rs:3:28:12:1 | { ... } | isAsync: | no | isConst: | no | isGen: | no | isMove: | no | isTry: | no | isUnsafe: | no | -| gen_block_expr.rs:5:5:7:5 | { ... } | isAsync: | no | isConst: | no | isGen: | no | isMove: | no | isTry: | no | isUnsafe: | no | -| gen_block_expr.rs:8:5:11:5 | 'label: { ... } | isAsync: | no | isConst: | no | isGen: | no | isMove: | no | isTry: | no | isUnsafe: | no | +| gen_block_expr.rs:3:28:12:1 | { ... } | isAsync: | no | isConst: | no | isGen: | no | isMove: | no | isUnsafe: | no | +| gen_block_expr.rs:5:5:7:5 | { ... } | isAsync: | no | isConst: | no | isGen: | no | isMove: | no | isUnsafe: | no | +| gen_block_expr.rs:8:5:11:5 | 'label: { ... } | isAsync: | no | isConst: | no | isGen: | no | isMove: | no | isUnsafe: | no | getLabel | gen_block_expr.rs:8:5:11:5 | 'label: { ... } | gen_block_expr.rs:8:5:8:11 | 'label | getAttr @@ -9,3 +9,4 @@ getStmtList | gen_block_expr.rs:3:28:12:1 | { ... } | gen_block_expr.rs:3:28:12:1 | StmtList | | gen_block_expr.rs:5:5:7:5 | { ... } | gen_block_expr.rs:5:5:7:5 | StmtList | | gen_block_expr.rs:8:5:11:5 | 'label: { ... } | gen_block_expr.rs:8:13:11:5 | StmtList | +getTryBlockModifier diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg.expected b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg.expected index 32a73ae1c7c4..01c549f29a1a 100644 --- a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg.expected +++ b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg.expected @@ -15,6 +15,9 @@ instances | gen_format_argument.rs:7:34:7:38 | FormatArgsArg | | gen_format_argument.rs:7:41:7:45 | FormatArgsArg | | gen_format_argument.rs:7:48:7:56 | FormatArgsArg | +getArgName +| gen_format_args_expr.rs:7:35:7:37 | FormatArgsArg | gen_format_args_expr.rs:7:35:7:36 | FormatArgsArgName | +| gen_format_args_expr.rs:7:40:7:42 | FormatArgsArg | gen_format_args_expr.rs:7:40:7:41 | FormatArgsArgName | getExpr | gen_format.rs:5:26:5:32 | FormatArgsArg | gen_format.rs:5:26:5:32 | "world" | | gen_format.rs:12:35:12:38 | FormatArgsArg | gen_format.rs:12:35:12:38 | name | @@ -32,6 +35,3 @@ getExpr | gen_format_argument.rs:7:34:7:38 | FormatArgsArg | gen_format_argument.rs:7:34:7:38 | value | | gen_format_argument.rs:7:41:7:45 | FormatArgsArg | gen_format_argument.rs:7:41:7:45 | width | | gen_format_argument.rs:7:48:7:56 | FormatArgsArg | gen_format_argument.rs:7:48:7:56 | precision | -getName -| gen_format_args_expr.rs:7:35:7:37 | FormatArgsArg | gen_format_args_expr.rs:7:35:7:35 | a | -| gen_format_args_expr.rs:7:40:7:42 | FormatArgsArg | gen_format_args_expr.rs:7:40:7:40 | b | diff --git a/rust/ql/test/extractor-tests/generated/MacroItems/MacroItems.expected b/rust/ql/test/extractor-tests/generated/MacroItems/MacroItems.expected index 156893a07eba..c7b6ab807aac 100644 --- a/rust/ql/test/extractor-tests/generated/MacroItems/MacroItems.expected +++ b/rust/ql/test/extractor-tests/generated/MacroItems/MacroItems.expected @@ -1,7 +1,5 @@ instances | gen_macro_items.rs:5:5:5:12 | MacroItems | -| gen_macro_items.rs:13:12:13:14 | MacroItems | getItem | gen_macro_items.rs:5:5:5:12 | MacroItems | 0 | gen_macro_items.rs:5:5:5:38 | use ...::Path | | gen_macro_items.rs:5:5:5:12 | MacroItems | 1 | gen_macro_items.rs:5:5:5:38 | fn get_parent | -| gen_macro_items.rs:13:12:13:14 | MacroItems | 0 | gen_macro_items.rs:13:12:13:14 | impl ...::Debug for Bar::<...> { ... } | diff --git a/rust/ql/test/extractor-tests/generated/StructField/StructField.expected b/rust/ql/test/extractor-tests/generated/StructField/StructField.expected index 285d3530c66f..981fafb354ca 100644 --- a/rust/ql/test/extractor-tests/generated/StructField/StructField.expected +++ b/rust/ql/test/extractor-tests/generated/StructField/StructField.expected @@ -1,7 +1,7 @@ instances | gen_struct_field.rs:7:16:7:21 | x: i32 | isUnsafe: | no | getAttr -getDefault +getDefaultVal getName | gen_struct_field.rs:7:16:7:21 | x: i32 | gen_struct_field.rs:7:16:7:16 | x | getTypeRepr diff --git a/rust/ql/test/extractor-tests/generated/Variant/Variant.expected b/rust/ql/test/extractor-tests/generated/Variant/Variant.expected index 4c67e1684b00..112c0a3522a5 100644 --- a/rust/ql/test/extractor-tests/generated/Variant/Variant.expected +++ b/rust/ql/test/extractor-tests/generated/Variant/Variant.expected @@ -3,7 +3,7 @@ instances | gen_variant.rs:7:17:7:22 | B | | gen_variant.rs:7:25:7:36 | C | getAttr -getDiscriminant +getConstArg getFieldList | gen_variant.rs:7:17:7:22 | B | gen_variant.rs:7:18:7:22 | TupleFieldList | | gen_variant.rs:7:25:7:36 | C | gen_variant.rs:7:27:7:36 | StructFieldList | diff --git a/rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected b/rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected index 6f0b278d062e..e45cbadf0d21 100644 --- a/rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected +++ b/rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected @@ -203,7 +203,7 @@ macro_expansion.rs: # 8| getStmtList(): [StmtList] StmtList # 8| getName(): [Name] inner_1 # 7| getAttr(0): [Attr] Attr -# 7| getMeta(): [Meta] Meta +# 7| getMeta(): [TokenTreeMeta] TokenTreeMeta # 7| getPath(): [Path] repeat # 7| getSegment(): [PathSegment] repeat # 7| getIdentifier(): [NameRef] repeat @@ -251,7 +251,7 @@ macro_expansion.rs: # 8| getStmtList(): [StmtList] StmtList # 8| getName(): [Name] inner_1 # 7| getAttr(0): [Attr] Attr -# 7| getMeta(): [Meta] Meta +# 7| getMeta(): [TokenTreeMeta] TokenTreeMeta # 7| getPath(): [Path] repeat # 7| getSegment(): [PathSegment] repeat # 7| getIdentifier(): [NameRef] repeat @@ -273,7 +273,7 @@ macro_expansion.rs: # 4| getName(): [Name] foo_new # 4| getVisibility(): [Visibility] pub # 3| getAttr(0): [Attr] Attr -# 3| getMeta(): [Meta] Meta +# 3| getMeta(): [PathMeta] PathMeta # 3| getPath(): [Path] add_one # 3| getSegment(): [PathSegment] add_one # 3| getIdentifier(): [NameRef] add_one @@ -294,7 +294,7 @@ macro_expansion.rs: # 16| getName(): [Name] bar_0_new # 16| getVisibility(): [Visibility] pub # 15| getAttr(0): [Attr] Attr -# 15| getMeta(): [Meta] Meta +# 15| getMeta(): [PathMeta] PathMeta # 15| getPath(): [Path] add_one # 15| getSegment(): [PathSegment] add_one # 15| getIdentifier(): [NameRef] add_one @@ -313,25 +313,25 @@ macro_expansion.rs: # 16| getName(): [Name] bar_1_new # 16| getVisibility(): [Visibility] pub # 15| getAttr(0): [Attr] Attr -# 15| getMeta(): [Meta] Meta +# 15| getMeta(): [PathMeta] PathMeta # 15| getPath(): [Path] add_one # 15| getSegment(): [PathSegment] add_one # 15| getIdentifier(): [NameRef] add_one # 14| getAttr(0): [Attr] Attr -# 14| getMeta(): [Meta] Meta +# 14| getMeta(): [TokenTreeMeta] TokenTreeMeta # 14| getPath(): [Path] repeat # 14| getSegment(): [PathSegment] repeat # 14| getIdentifier(): [NameRef] repeat # 14| getTokenTree(): [TokenTree] TokenTree # 15| getAttr(1): [Attr] Attr -# 15| getMeta(): [Meta] Meta +# 15| getMeta(): [PathMeta] PathMeta # 15| getPath(): [Path] add_one # 15| getSegment(): [PathSegment] add_one # 15| getIdentifier(): [NameRef] add_one # 18| getItem(3): [Function] (item with attribute macro expansion) # 18| getAttributeMacroExpansion(): [MacroItems] MacroItems # 18| getAttr(0): [Attr] Attr -# 18| getMeta(): [Meta] Meta +# 18| getMeta(): [PathMeta] PathMeta # 18| getPath(): [Path] erase # 18| getSegment(): [PathSegment] erase # 18| getIdentifier(): [NameRef] erase @@ -496,7 +496,7 @@ macro_expansion.rs: # 32| getName(): [Name] bzz_2 # 32| getVisibility(): [Visibility] pub # 31| getAttr(0): [Attr] Attr -# 31| getMeta(): [Meta] Meta +# 31| getMeta(): [TokenTreeMeta] TokenTreeMeta # 31| getPath(): [Path] repeat # 31| getSegment(): [PathSegment] repeat # 31| getIdentifier(): [NameRef] repeat @@ -631,7 +631,7 @@ macro_expansion.rs: # 63| getItem(12): [Function] fn documented # 64| getParamList(): [ParamList] ParamList # 63| getAttr(0): [Attr] Attr -# 63| getMeta(): [Meta] Meta +# 63| getMeta(): [KeyValueMeta] KeyValueMeta # 63| getExpr(): [MacroExpr] MacroExpr # 63| getMacroCall(): [MacroCall] include_str!... # 63| getPath(): [Path] include_str @@ -720,96 +720,8 @@ macro_expansion.rs: # 79| getSegment(): [PathSegment] i32 # 79| getIdentifier(): [NameRef] i32 # 83| getItem(17): [Struct] struct MyDerive -# 84| getDeriveMacroExpansion(0): [MacroItems] MacroItems -# 84| getItem(0): [Impl] impl ...::Debug for MyDerive::<...> { ... } -# 84| getAssocItemList(): [AssocItemList] AssocItemList -# 84| getAssocItem(0): [Function] fn fmt -# 83| getParamList(): [ParamList] ParamList -# 83| getParam(0): [Param] ...: ... -# 83| getTypeRepr(): [RefTypeRepr] RefTypeRepr -# 83| getTypeRepr(): [PathTypeRepr] ...::Formatter -# 83| getPath(): [Path] ...::Formatter -# 83| getQualifier(): [Path] ...::fmt -# 83| getQualifier(): [Path] $crate -# 83| getSegment(): [PathSegment] $crate -# 83| getIdentifier(): [NameRef] $crate -# 83| getSegment(): [PathSegment] fmt -# 83| getIdentifier(): [NameRef] fmt -# 83| getSegment(): [PathSegment] Formatter -# 83| getIdentifier(): [NameRef] Formatter -# 83| getPat(): [IdentPat] f -# 83| getName(): [Name] f -# 83| getSelfParam(): [SelfParam] SelfParam -# 83| getName(): [Name] self -# 84| getFunctionBody(): [BlockExpr] { ... } -# 84| getStmtList(): [StmtList] StmtList -# 84| getTailExpr(): [MatchExpr] match self { ... } -# 83| getScrutinee(): [VariableAccess] self -# 83| getPath(): [Path] self -# 83| getSegment(): [PathSegment] self -# 83| getIdentifier(): [NameRef] self -# 84| getMatchArmList(): [MatchArmList] MatchArmList -# 84| getArm(0): [MatchArm] ... => ... -# 85| getExpr(): [MethodCallExpr] ... .finish() -# 83| getArgList(): [ArgList] ArgList -# 83| getIdentifier(): [NameRef] finish -# 85| getReceiver(): [MethodCallExpr] ... .field(...) -# 85| getArgList(): [ArgList] ArgList -# 83| getArg(0): [StringLiteralExpr] "field" -# 85| getArg(1): [RefExpr] &field -# 85| getExpr(): [VariableAccess] field -# 85| getPath(): [Path] field -# 85| getSegment(): [PathSegment] field -# 85| getIdentifier(): [NameRef] field -# 83| getIdentifier(): [NameRef] field -# 83| getReceiver(): [MethodCallExpr] f.debug_struct(...) -# 83| getArgList(): [ArgList] ArgList -# 83| getArg(0): [StringLiteralExpr] "MyDerive" -# 83| getIdentifier(): [NameRef] debug_struct -# 83| getReceiver(): [VariableAccess] f -# 83| getPath(): [Path] f -# 83| getSegment(): [PathSegment] f -# 83| getIdentifier(): [NameRef] f -# 84| getPat(): [StructPat] MyDerive {...} -# 84| getPath(): [Path] MyDerive -# 84| getSegment(): [PathSegment] MyDerive -# 84| getIdentifier(): [NameRef] MyDerive -# 85| getStructPatFieldList(): [StructPatFieldList] StructPatFieldList -# 85| getField(0): [StructPatField] field: ... -# 85| getIdentifier(): [NameRef] field -# 85| getPat(): [IdentPat] field -# 85| getName(): [Name] field -# 83| getName(): [Name] fmt -# 83| getRetType(): [RetTypeRepr] RetTypeRepr -# 83| getTypeRepr(): [PathTypeRepr] ...::Result -# 83| getPath(): [Path] ...::Result -# 83| getQualifier(): [Path] ...::fmt -# 83| getQualifier(): [Path] $crate -# 83| getSegment(): [PathSegment] $crate -# 83| getIdentifier(): [NameRef] $crate -# 83| getSegment(): [PathSegment] fmt -# 83| getIdentifier(): [NameRef] fmt -# 83| getSegment(): [PathSegment] Result -# 83| getIdentifier(): [NameRef] Result -# 83| getGenericParamList(): [GenericParamList] <...> -# 84| getSelfTy(): [PathTypeRepr] MyDerive::<...> -# 84| getPath(): [Path] MyDerive::<...> -# 84| getSegment(): [PathSegment] MyDerive::<...> -# 83| getGenericArgList(): [GenericArgList] <...> -# 84| getIdentifier(): [NameRef] MyDerive -# 83| getTrait(): [PathTypeRepr] ...::Debug -# 83| getPath(): [Path] ...::Debug -# 83| getQualifier(): [Path] ...::fmt -# 83| getQualifier(): [Path] $crate -# 83| getSegment(): [PathSegment] $crate -# 83| getIdentifier(): [NameRef] $crate -# 83| getSegment(): [PathSegment] fmt -# 83| getIdentifier(): [NameRef] fmt -# 83| getSegment(): [PathSegment] Debug -# 83| getIdentifier(): [NameRef] Debug -# 83| getWhereClause(): [WhereClause] WhereClause # 83| getAttr(0): [Attr] Attr -# 83| getMeta(): [Meta] Meta +# 83| getMeta(): [TokenTreeMeta] TokenTreeMeta # 83| getPath(): [Path] derive # 83| getSegment(): [PathSegment] derive # 83| getIdentifier(): [NameRef] derive @@ -823,117 +735,8 @@ macro_expansion.rs: # 85| getSegment(): [PathSegment] usize # 85| getIdentifier(): [NameRef] usize # 88| getItem(18): [Enum] enum MyDeriveEnum -# 89| getDeriveMacroExpansion(0): [MacroItems] MacroItems -# 89| getItem(0): [Impl] impl ...::PartialEq for MyDeriveEnum::<...> { ... } -# 89| getAssocItemList(): [AssocItemList] AssocItemList -# 89| getAssocItem(0): [Function] fn eq -# 88| getParamList(): [ParamList] ParamList -# 88| getParam(0): [Param] ...: ... -# 88| getTypeRepr(): [RefTypeRepr] RefTypeRepr -# 88| getTypeRepr(): [PathTypeRepr] Self -# 88| getPath(): [Path] Self -# 88| getSegment(): [PathSegment] Self -# 88| getIdentifier(): [NameRef] Self -# 88| getPat(): [IdentPat] other -# 88| getName(): [Name] other -# 88| getSelfParam(): [SelfParam] SelfParam -# 88| getName(): [Name] self -# 89| getFunctionBody(): [BlockExpr] { ... } -# 89| getStmtList(): [StmtList] StmtList -# 89| getTailExpr(): [MatchExpr] match ... { ... } -# 88| getScrutinee(): [TupleExpr] TupleExpr -# 88| getField(0): [VariableAccess] self -# 88| getPath(): [Path] self -# 88| getSegment(): [PathSegment] self -# 88| getIdentifier(): [NameRef] self -# 88| getField(1): [VariableAccess] other -# 88| getPath(): [Path] other -# 88| getSegment(): [PathSegment] other -# 88| getIdentifier(): [NameRef] other -# 89| getMatchArmList(): [MatchArmList] MatchArmList -# 89| getArm(0): [MatchArm] ... => true -# 88| getExpr(): [BooleanLiteralExpr] true -# 89| getPat(): [TuplePat] TuplePat -# 89| getField(0): [PathPat] ...::Variant1 -# 89| getPath(): [Path] ...::Variant1 -# 89| getQualifier(): [Path] MyDeriveEnum -# 89| getSegment(): [PathSegment] MyDeriveEnum -# 89| getIdentifier(): [NameRef] MyDeriveEnum -# 90| getSegment(): [PathSegment] Variant1 -# 90| getIdentifier(): [NameRef] Variant1 -# 89| getField(1): [PathPat] ...::Variant1 -# 89| getPath(): [Path] ...::Variant1 -# 89| getQualifier(): [Path] MyDeriveEnum -# 89| getSegment(): [PathSegment] MyDeriveEnum -# 89| getIdentifier(): [NameRef] MyDeriveEnum -# 90| getSegment(): [PathSegment] Variant1 -# 90| getIdentifier(): [NameRef] Variant1 -# 89| getArm(1): [MatchArm] ... => true -# 88| getExpr(): [BooleanLiteralExpr] true -# 89| getPat(): [TuplePat] TuplePat -# 89| getField(0): [PathPat] ...::Variant2 -# 89| getPath(): [Path] ...::Variant2 -# 89| getQualifier(): [Path] MyDeriveEnum -# 89| getSegment(): [PathSegment] MyDeriveEnum -# 89| getIdentifier(): [NameRef] MyDeriveEnum -# 91| getSegment(): [PathSegment] Variant2 -# 91| getIdentifier(): [NameRef] Variant2 -# 89| getField(1): [PathPat] ...::Variant2 -# 89| getPath(): [Path] ...::Variant2 -# 89| getQualifier(): [Path] MyDeriveEnum -# 89| getSegment(): [PathSegment] MyDeriveEnum -# 89| getIdentifier(): [NameRef] MyDeriveEnum -# 91| getSegment(): [PathSegment] Variant2 -# 91| getIdentifier(): [NameRef] Variant2 -# 88| getArm(2): [MatchArm] ... => false -# 88| getExpr(): [BooleanLiteralExpr] false -# 88| getPat(): [IdentPat] _unused -# 88| getName(): [Name] _unused -# 88| getName(): [Name] eq -# 88| getRetType(): [RetTypeRepr] RetTypeRepr -# 88| getTypeRepr(): [PathTypeRepr] bool -# 88| getPath(): [Path] bool -# 88| getSegment(): [PathSegment] bool -# 88| getIdentifier(): [NameRef] bool -# 88| getGenericParamList(): [GenericParamList] <...> -# 89| getSelfTy(): [PathTypeRepr] MyDeriveEnum::<...> -# 89| getPath(): [Path] MyDeriveEnum::<...> -# 89| getSegment(): [PathSegment] MyDeriveEnum::<...> -# 88| getGenericArgList(): [GenericArgList] <...> -# 89| getIdentifier(): [NameRef] MyDeriveEnum -# 88| getTrait(): [PathTypeRepr] ...::PartialEq -# 88| getPath(): [Path] ...::PartialEq -# 88| getQualifier(): [Path] ...::cmp -# 88| getQualifier(): [Path] $crate -# 88| getSegment(): [PathSegment] $crate -# 88| getIdentifier(): [NameRef] $crate -# 88| getSegment(): [PathSegment] cmp -# 88| getIdentifier(): [NameRef] cmp -# 88| getSegment(): [PathSegment] PartialEq -# 88| getIdentifier(): [NameRef] PartialEq -# 88| getWhereClause(): [WhereClause] WhereClause -# 89| getDeriveMacroExpansion(1): [MacroItems] MacroItems -# 89| getItem(0): [Impl] impl ...::Eq for MyDeriveEnum::<...> { ... } -# 88| getAssocItemList(): [AssocItemList] AssocItemList -# 88| getGenericParamList(): [GenericParamList] <...> -# 89| getSelfTy(): [PathTypeRepr] MyDeriveEnum::<...> -# 89| getPath(): [Path] MyDeriveEnum::<...> -# 89| getSegment(): [PathSegment] MyDeriveEnum::<...> -# 88| getGenericArgList(): [GenericArgList] <...> -# 89| getIdentifier(): [NameRef] MyDeriveEnum -# 88| getTrait(): [PathTypeRepr] ...::Eq -# 88| getPath(): [Path] ...::Eq -# 88| getQualifier(): [Path] ...::cmp -# 88| getQualifier(): [Path] $crate -# 88| getSegment(): [PathSegment] $crate -# 88| getIdentifier(): [NameRef] $crate -# 88| getSegment(): [PathSegment] cmp -# 88| getIdentifier(): [NameRef] cmp -# 88| getSegment(): [PathSegment] Eq -# 88| getIdentifier(): [NameRef] Eq -# 88| getWhereClause(): [WhereClause] WhereClause # 88| getAttr(0): [Attr] Attr -# 88| getMeta(): [Meta] Meta +# 88| getMeta(): [TokenTreeMeta] TokenTreeMeta # 88| getPath(): [Path] derive # 88| getSegment(): [PathSegment] derive # 88| getIdentifier(): [NameRef] derive @@ -989,7 +792,7 @@ macro_expansion.rs: # 98| getSegment(): [PathSegment] MyTrait # 98| getIdentifier(): [NameRef] MyTrait # 98| getAttr(0): [Attr] Attr -# 98| getMeta(): [Meta] Meta +# 98| getMeta(): [TokenTreeMeta] TokenTreeMeta # 98| getPath(): [Path] derive # 98| getSegment(): [PathSegment] derive # 98| getIdentifier(): [NameRef] derive @@ -1051,7 +854,7 @@ proc_macro.rs: # 5| getPat(): [IdentPat] item # 5| getName(): [Name] item # 4| getAttr(0): [Attr] Attr -# 4| getMeta(): [Meta] Meta +# 4| getMeta(): [PathMeta] PathMeta # 4| getPath(): [Path] proc_macro_attribute # 4| getSegment(): [PathSegment] proc_macro_attribute # 4| getIdentifier(): [NameRef] proc_macro_attribute @@ -1627,7 +1430,7 @@ proc_macro.rs: # 16| getStmtList(): [StmtList] StmtList # 16| getStatement(0): [LetStmt] let ... = ... # 15| getAttr(0): [Attr] Attr -# 15| getMeta(): [Meta] Meta +# 15| getMeta(): [TokenTreeMeta] TokenTreeMeta # 15| getPath(): [Path] allow # 15| getSegment(): [PathSegment] allow # 15| getIdentifier(): [NameRef] allow @@ -2068,7 +1871,7 @@ proc_macro.rs: # 21| getPat(): [IdentPat] item # 21| getName(): [Name] item # 20| getAttr(0): [Attr] Attr -# 20| getMeta(): [Meta] Meta +# 20| getMeta(): [PathMeta] PathMeta # 20| getPath(): [Path] proc_macro_attribute # 20| getSegment(): [PathSegment] proc_macro_attribute # 20| getIdentifier(): [NameRef] proc_macro_attribute @@ -2511,7 +2314,7 @@ proc_macro.rs: # 32| getPat(): [IdentPat] _item # 32| getName(): [Name] _item # 31| getAttr(0): [Attr] Attr -# 31| getMeta(): [Meta] Meta +# 31| getMeta(): [PathMeta] PathMeta # 31| getPath(): [Path] proc_macro_attribute # 31| getSegment(): [PathSegment] proc_macro_attribute # 31| getIdentifier(): [NameRef] proc_macro_attribute @@ -2543,7 +2346,7 @@ proc_macro.rs: # 37| getPat(): [IdentPat] input # 37| getName(): [Name] input # 36| getAttr(0): [Attr] Attr -# 36| getMeta(): [Meta] Meta +# 36| getMeta(): [TokenTreeMeta] TokenTreeMeta # 36| getPath(): [Path] proc_macro_derive # 36| getSegment(): [PathSegment] proc_macro_derive # 36| getIdentifier(): [NameRef] proc_macro_derive diff --git a/rust/ql/test/extractor-tests/macro-expansion/test.expected b/rust/ql/test/extractor-tests/macro-expansion/test.expected index f47a7455e916..50632f16bfe6 100644 --- a/rust/ql/test/extractor-tests/macro-expansion/test.expected +++ b/rust/ql/test/extractor-tests/macro-expansion/test.expected @@ -15,23 +15,20 @@ attribute_macros | macro_expansion.rs:31:5:34:5 | (item with attribute macro expansion) | 1 | macro_expansion.rs:32:5:34:5 | fn bzz_1 | | macro_expansion.rs:31:5:34:5 | (item with attribute macro expansion) | 2 | macro_expansion.rs:32:5:34:5 | fn bzz_2 | derive_macros -| macro_expansion.rs:83:1:86:1 | struct MyDerive | 0 | 0 | macro_expansion.rs:84:8:85:9 | impl ...::Debug for MyDerive::<...> { ... } | -| macro_expansion.rs:88:1:92:1 | enum MyDeriveEnum | 0 | 0 | macro_expansion.rs:89:6:91:12 | impl ...::PartialEq for MyDeriveEnum::<...> { ... } | -| macro_expansion.rs:88:1:92:1 | enum MyDeriveEnum | 1 | 0 | macro_expansion.rs:89:6:89:17 | impl ...::Eq for MyDeriveEnum::<...> { ... } | | macro_expansion.rs:98:1:102:1 | union MyDeriveUnion | 0 | 0 | macro_expansion.rs:99:7:99:19 | Const | | macro_expansion.rs:98:1:102:1 | union MyDeriveUnion | 0 | 1 | macro_expansion.rs:99:7:99:19 | impl MyTrait for MyDeriveUnion { ... } | macro_calls | macro_expansion.rs:5:9:5:35 | concat!... | macro_expansion.rs:5:17:5:34 | "Hello world!" | | macro_expansion.rs:5:9:5:35 | concat!... | macro_expansion.rs:5:17:5:34 | "Hello world!" | -| macro_expansion.rs:31:5:31:16 | ...::format_args_nl!... | macro_expansion.rs:31:5:31:16 | FormatArgsExpr | -| macro_expansion.rs:31:5:31:16 | ...::format_args_nl!... | macro_expansion.rs:31:5:31:16 | FormatArgsExpr | -| macro_expansion.rs:31:5:31:16 | ...::format_args_nl!... | macro_expansion.rs:31:5:31:16 | FormatArgsExpr | -| macro_expansion.rs:31:5:31:16 | println!... | macro_expansion.rs:31:5:31:16 | { ... } | -| macro_expansion.rs:31:5:31:16 | println!... | macro_expansion.rs:31:5:31:16 | { ... } | -| macro_expansion.rs:31:5:31:16 | println!... | macro_expansion.rs:31:5:31:16 | { ... } | -| macro_expansion.rs:33:9:33:16 | hello!... | macro_expansion.rs:31:5:31:16 | { ... } | -| macro_expansion.rs:33:9:33:16 | hello!... | macro_expansion.rs:31:5:31:16 | { ... } | -| macro_expansion.rs:33:9:33:16 | hello!... | macro_expansion.rs:31:5:31:16 | { ... } | +| macro_expansion.rs:31:7:31:15 | ...::format_args_nl!... | macro_expansion.rs:31:7:31:15 | FormatArgsExpr | +| macro_expansion.rs:31:7:31:15 | ...::format_args_nl!... | macro_expansion.rs:31:7:31:15 | FormatArgsExpr | +| macro_expansion.rs:31:7:31:15 | ...::format_args_nl!... | macro_expansion.rs:31:7:31:15 | FormatArgsExpr | +| macro_expansion.rs:31:7:31:15 | println!... | macro_expansion.rs:31:7:31:15 | { ... } | +| macro_expansion.rs:31:7:31:15 | println!... | macro_expansion.rs:31:7:31:15 | { ... } | +| macro_expansion.rs:31:7:31:15 | println!... | macro_expansion.rs:31:7:31:15 | { ... } | +| macro_expansion.rs:33:9:33:16 | hello!... | macro_expansion.rs:31:7:31:15 | { ... } | +| macro_expansion.rs:33:9:33:16 | hello!... | macro_expansion.rs:31:7:31:15 | { ... } | +| macro_expansion.rs:33:9:33:16 | hello!... | macro_expansion.rs:31:7:31:15 | { ... } | | macro_expansion.rs:44:5:44:13 | def_x!... | macro_expansion.rs:44:5:44:10 | MacroItems | | macro_expansion.rs:53:9:53:25 | concat!... | macro_expansion.rs:53:17:53:24 | "xy" | | macro_expansion.rs:55:9:58:5 | my_macro!... | macro_expansion.rs:56:9:57:13 | MacroExpr | diff --git a/rust/ql/test/extractor-tests/macro-in-library/PrintAst.expected b/rust/ql/test/extractor-tests/macro-in-library/PrintAst.expected index aa0fc42f81d8..78b3d8cc786e 100644 --- a/rust/ql/test/extractor-tests/macro-in-library/PrintAst.expected +++ b/rust/ql/test/extractor-tests/macro-in-library/PrintAst.expected @@ -50,7 +50,7 @@ proc_macro.rs: # 5| getSegment(): [PathSegment] TokenStream # 5| getIdentifier(): [NameRef] TokenStream # 4| getAttr(0): [Attr] Attr -# 4| getMeta(): [Meta] Meta +# 4| getMeta(): [PathMeta] PathMeta # 4| getPath(): [Path] proc_macro_attribute # 4| getSegment(): [PathSegment] proc_macro_attribute # 4| getIdentifier(): [NameRef] proc_macro_attribute diff --git a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected index d3c65fac62ff..7b8a4b97e60a 100644 --- a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected @@ -39,7 +39,7 @@ edges | test.rs:107:22:107:25 | path | test.rs:107:22:107:38 | path.into_inner() | provenance | MaD:11 | | test.rs:107:22:107:38 | path.into_inner() | test.rs:107:13:107:18 | TuplePat | provenance | | | test.rs:115:33:115:65 | ...: ...::Query::<...> | test.rs:116:14:116:14 | a | provenance | | -| test.rs:121:5:121:20 | to | test.rs:122:33:122:55 | ...: ...::Path::<...> | provenance | Src:MaD:4 | +| test.rs:121:7:121:19 | to | test.rs:122:33:122:55 | ...: ...::Path::<...> | provenance | Src:MaD:4 | | test.rs:122:33:122:55 | ...: ...::Path::<...> | test.rs:123:17:123:20 | path | provenance | | | test.rs:123:13:123:13 | a | test.rs:124:14:124:14 | a | provenance | | | test.rs:123:17:123:20 | path | test.rs:123:17:123:33 | path.into_inner() | provenance | MaD:11 | @@ -108,7 +108,7 @@ nodes | test.rs:110:14:110:14 | b | semmle.label | b | | test.rs:115:33:115:65 | ...: ...::Query::<...> | semmle.label | ...: ...::Query::<...> | | test.rs:116:14:116:14 | a | semmle.label | a | -| test.rs:121:5:121:20 | to | semmle.label | to | +| test.rs:121:7:121:19 | to | semmle.label | to | | test.rs:122:33:122:55 | ...: ...::Path::<...> | semmle.label | ...: ...::Path::<...> | | test.rs:123:13:123:13 | a | semmle.label | a | | test.rs:123:17:123:20 | path | semmle.label | path | @@ -172,7 +172,7 @@ testFailures | test.rs:109:14:109:14 | a | test.rs:132:45:132:46 | to | test.rs:109:14:109:14 | a | $@ | test.rs:132:45:132:46 | to | to | | test.rs:110:14:110:14 | b | test.rs:132:45:132:46 | to | test.rs:110:14:110:14 | b | $@ | test.rs:132:45:132:46 | to | to | | test.rs:116:14:116:14 | a | test.rs:133:41:133:42 | to | test.rs:116:14:116:14 | a | $@ | test.rs:133:41:133:42 | to | to | -| test.rs:124:14:124:14 | a | test.rs:121:5:121:20 | to | test.rs:124:14:124:14 | a | $@ | test.rs:121:5:121:20 | to | to | +| test.rs:124:14:124:14 | a | test.rs:121:7:121:19 | to | test.rs:124:14:124:14 | a | $@ | test.rs:121:7:121:19 | to | to | | test.rs:148:14:148:23 | a.as_str() | test.rs:200:30:200:32 | get | test.rs:148:14:148:23 | a.as_str() | $@ | test.rs:200:30:200:32 | get | get | | test.rs:149:14:149:25 | a.as_bytes() | test.rs:200:30:200:32 | get | test.rs:149:14:149:25 | a.as_bytes() | $@ | test.rs:200:30:200:32 | get | get | | test.rs:150:14:150:14 | a | test.rs:200:30:200:32 | get | test.rs:150:14:150:14 | a | $@ | test.rs:200:30:200:32 | get | get | diff --git a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/TaintSources.expected b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/TaintSources.expected index 146406e7192c..6ff9e7cfa031 100644 --- a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/TaintSources.expected +++ b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/TaintSources.expected @@ -3,14 +3,14 @@ | test.rs:48:14:48:30 | MyStruct {...} | Flow source 'RemoteSource' of type remote (DEFAULT). | | test.rs:58:14:58:15 | ms | Flow source 'RemoteSource' of type remote (DEFAULT). | | test.rs:68:15:68:15 | a | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:121:5:121:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:121:5:121:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:121:5:121:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:121:5:121:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:121:5:121:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:121:5:121:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:121:5:121:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:121:5:121:20 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:121:7:121:19 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:121:7:121:19 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:121:7:121:19 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:121:7:121:19 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:121:7:121:19 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:121:7:121:19 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:121:7:121:19 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:121:7:121:19 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | | test.rs:131:41:131:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | | test.rs:131:41:131:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | | test.rs:131:41:131:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | diff --git a/rust/ql/test/library-tests/definitions/Definitions.expected b/rust/ql/test/library-tests/definitions/Definitions.expected index 23ad4e291de3..2ab25620188e 100644 --- a/rust/ql/test/library-tests/definitions/Definitions.expected +++ b/rust/ql/test/library-tests/definitions/Definitions.expected @@ -10,9 +10,9 @@ | main.rs:20:13:20:14 | S2 | main.rs:16:5:16:24 | struct S2 | path | | main.rs:20:16:20:16 | x | main.rs:19:20:19:20 | x | local variable | | main.rs:29:5:29:11 | println | {EXTERNAL LOCATION} | MacroRules | path | -| main.rs:29:22:29:26 | value | main.rs:29:50:29:54 | value | format argument | -| main.rs:29:29:29:33 | width | main.rs:26:9:26:13 | width | local variable | -| main.rs:29:36:29:44 | precision | main.rs:27:9:27:17 | precision | local variable | +| main.rs:29:22:29:26 | value | main.rs:29:50:29:56 | FormatArgsArgName | format argument | +| main.rs:29:29:29:33 | width | main.rs:29:50:29:56 | FormatArgsArgName | format argument | +| main.rs:29:36:29:44 | precision | main.rs:29:50:29:56 | FormatArgsArgName | format argument | | main.rs:30:5:30:11 | println | {EXTERNAL LOCATION} | MacroRules | path | | main.rs:30:22:30:22 | 0 | main.rs:30:34:30:38 | value | format argument | | main.rs:30:25:30:25 | 1 | main.rs:30:41:30:45 | width | format argument | diff --git a/rust/ql/test/query-tests/security/CWE-079/actix/XSS.expected b/rust/ql/test/query-tests/security/CWE-079/actix/XSS.expected index 9667a9216e6f..c388b6d58f09 100644 --- a/rust/ql/test/query-tests/security/CWE-079/actix/XSS.expected +++ b/rust/ql/test/query-tests/security/CWE-079/actix/XSS.expected @@ -1,7 +1,7 @@ #select -| main.rs:25:5:25:13 | ...::new | main.rs:8:1:8:18 | to | main.rs:25:5:25:13 | ...::new | Cross-site scripting vulnerability due to a $@. | main.rs:8:1:8:18 | to | user-provided value | +| main.rs:25:5:25:13 | ...::new | main.rs:8:3:8:17 | to | main.rs:25:5:25:13 | ...::new | Cross-site scripting vulnerability due to a $@. | main.rs:8:3:8:17 | to | user-provided value | edges -| main.rs:8:1:8:18 | to | main.rs:9:29:9:51 | ...: ...::Path::<...> | provenance | Src:MaD:2 | +| main.rs:8:3:8:17 | to | main.rs:9:29:9:51 | ...: ...::Path::<...> | provenance | Src:MaD:2 | | main.rs:9:29:9:51 | ...: ...::Path::<...> | main.rs:10:22:10:25 | path | provenance | | | main.rs:10:9:10:18 | user_input | main.rs:13:9:22:18 | MacroExpr | provenance | | | main.rs:10:22:10:25 | path | main.rs:10:22:10:38 | path.into_inner() | provenance | MaD:3 | @@ -19,7 +19,7 @@ models | 4 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | | 5 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes -| main.rs:8:1:8:18 | to | semmle.label | to | +| main.rs:8:3:8:17 | to | semmle.label | to | | main.rs:9:29:9:51 | ...: ...::Path::<...> | semmle.label | ...: ...::Path::<...> | | main.rs:10:9:10:18 | user_input | semmle.label | user_input | | main.rs:10:22:10:25 | path | semmle.label | path | diff --git a/rust/ql/test/query-tests/security/CWE-614/InsecureCookie.expected b/rust/ql/test/query-tests/security/CWE-614/InsecureCookie.expected index 7decd880f595..15f6280fa524 100644 --- a/rust/ql/test/query-tests/security/CWE-614/InsecureCookie.expected +++ b/rust/ql/test/query-tests/security/CWE-614/InsecureCookie.expected @@ -23,325 +23,111 @@ | main.rs:49:41:49:45 | build | main.rs:49:5:49:25 | ...::build(...) | main.rs:49:41:49:45 | build | Cookie attribute 'Secure' is not set to true. | | main.rs:50:56:50:60 | build | main.rs:50:5:50:40 | ...::build(...) | main.rs:50:56:50:60 | build | Cookie attribute 'Secure' is not set to true. | | main.rs:53:65:53:69 | build | main.rs:53:5:53:49 | ... .secure(...) | main.rs:53:65:53:69 | build | Cookie attribute 'Secure' is not set to true. | -| main.rs:59:9:59:11 | add | main.rs:58:17:58:27 | ...::new | main.rs:59:9:59:11 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:60:9:60:20 | add_original | main.rs:58:17:58:27 | ...::new | main.rs:60:9:60:20 | add_original | Cookie attribute 'Secure' is not set to true. | -| main.rs:64:9:64:11 | add | main.rs:63:5:63:5 | [SSA] a | main.rs:64:9:64:11 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:64:9:64:11 | add | main.rs:63:5:63:5 | a | main.rs:64:9:64:11 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:69:16:69:18 | add | main.rs:68:17:68:29 | ...::named | main.rs:69:16:69:18 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:70:16:70:27 | add_original | main.rs:63:5:63:5 | [SSA] a | main.rs:70:16:70:27 | add_original | Cookie attribute 'Secure' is not set to true. | -| main.rs:70:16:70:27 | add_original | main.rs:63:5:63:5 | a | main.rs:70:16:70:27 | add_original | Cookie attribute 'Secure' is not set to true. | -| main.rs:72:16:72:18 | add | main.rs:71:5:71:5 | [SSA] b | main.rs:72:16:72:18 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:72:16:72:18 | add | main.rs:71:5:71:5 | b | main.rs:72:16:72:18 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:78:17:78:19 | add | main.rs:77:17:77:28 | ...::from | main.rs:78:17:78:19 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:79:17:79:28 | add_original | main.rs:63:5:63:5 | [SSA] a | main.rs:79:17:79:28 | add_original | Cookie attribute 'Secure' is not set to true. | -| main.rs:79:17:79:28 | add_original | main.rs:63:5:63:5 | a | main.rs:79:17:79:28 | add_original | Cookie attribute 'Secure' is not set to true. | -| main.rs:83:17:83:19 | add | main.rs:77:17:77:28 | ...::from | main.rs:83:17:83:19 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:88:9:88:11 | add | main.rs:87:17:87:28 | ...::from | main.rs:88:9:88:11 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:94:9:94:11 | add | main.rs:87:17:87:28 | ...::from | main.rs:94:9:94:11 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:123:13:123:18 | insert | main.rs:122:13:122:41 | ...::new | main.rs:123:13:123:18 | insert | Cookie attribute 'Secure' is not set to true. | -| main.rs:131:13:131:18 | insert | main.rs:130:13:130:13 | b | main.rs:131:13:131:18 | insert | Cookie attribute 'Secure' is not set to true. | -| main.rs:147:13:147:18 | insert | main.rs:146:13:146:13 | f | main.rs:147:13:147:18 | insert | Cookie attribute 'Secure' is not set to true. | | main.rs:152:13:152:18 | insert | main.rs:151:13:151:42 | ...::from | main.rs:152:13:152:18 | insert | Cookie attribute 'Secure' is not set to true. | -| main.rs:156:13:156:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:156:13:156:18 | insert | Cookie attribute 'Secure' is not set to true. | -| main.rs:157:13:157:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:157:13:157:18 | insert | Cookie attribute 'Secure' is not set to true. | -| main.rs:158:13:158:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:158:13:158:18 | insert | Cookie attribute 'Secure' is not set to true. | -| main.rs:159:13:159:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:159:13:159:18 | insert | Cookie attribute 'Secure' is not set to true. | -| main.rs:160:13:160:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:160:13:160:18 | insert | Cookie attribute 'Secure' is not set to true. | -| main.rs:161:13:161:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:161:13:161:18 | insert | Cookie attribute 'Secure' is not set to true. | -| main.rs:162:13:162:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:162:13:162:18 | insert | Cookie attribute 'Secure' is not set to true. | -| main.rs:163:13:163:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:163:13:163:18 | insert | Cookie attribute 'Secure' is not set to true. | -| main.rs:164:13:164:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:164:13:164:18 | insert | Cookie attribute 'Secure' is not set to true. | -| main.rs:165:13:165:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:165:13:165:18 | insert | Cookie attribute 'Secure' is not set to true. | -| main.rs:166:13:166:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:166:13:166:18 | insert | Cookie attribute 'Secure' is not set to true. | -| main.rs:167:13:167:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:167:13:167:18 | insert | Cookie attribute 'Secure' is not set to true. | | main.rs:173:61:173:65 | build | main.rs:173:22:173:34 | ...::build | main.rs:173:61:173:65 | build | Cookie attribute 'Secure' is not set to true. | | main.rs:197:55:197:60 | finish | main.rs:197:5:197:39 | ...::build(...) | main.rs:197:55:197:60 | finish | Cookie attribute 'Secure' is not set to true. | | main.rs:198:65:198:70 | finish | main.rs:198:5:198:39 | ...::build(...) | main.rs:198:65:198:70 | finish | Cookie attribute 'Secure' is not set to true. | -| main.rs:202:9:202:11 | add | main.rs:201:5:201:11 | [SSA] cookie1 | main.rs:202:9:202:11 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:202:9:202:11 | add | main.rs:201:5:201:11 | cookie1 | main.rs:202:9:202:11 | add | Cookie attribute 'Secure' is not set to true. | | main.rs:212:41:212:46 | finish | main.rs:212:5:212:22 | ...::build | main.rs:212:41:212:46 | finish | Cookie attribute 'Secure' is not set to true. | -| main.rs:215:9:215:11 | add | main.rs:214:19:214:34 | ...::new | main.rs:215:9:215:11 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:219:9:219:11 | add | main.rs:218:5:218:11 | [SSA] cookie2 | main.rs:219:9:219:11 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:219:9:219:11 | add | main.rs:218:5:218:11 | cookie2 | main.rs:219:9:219:11 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:229:9:229:11 | add | main.rs:228:5:228:11 | [SSA] cookie1 | main.rs:229:9:229:11 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:229:9:229:11 | add | main.rs:228:5:228:11 | cookie1 | main.rs:229:9:229:11 | add | Cookie attribute 'Secure' is not set to true. | | main.rs:242:9:242:41 | ...::new | main.rs:241:29:241:62 | ...::new(...) | main.rs:242:9:242:41 | ...::new | Cookie attribute 'Secure' is not set to true. | | main.rs:245:9:245:41 | ...::new | main.rs:244:30:244:63 | ...::new(...) | main.rs:245:9:245:41 | ...::new | Cookie attribute 'Secure' is not set to true. | | main.rs:259:59:259:64 | finish | main.rs:259:5:259:43 | ...::build(...) | main.rs:259:59:259:64 | finish | Cookie attribute 'Secure' is not set to true. | | main.rs:260:69:260:74 | finish | main.rs:260:5:260:43 | ...::build(...) | main.rs:260:69:260:74 | finish | Cookie attribute 'Secure' is not set to true. | -| main.rs:264:9:264:11 | add | main.rs:263:5:263:11 | [SSA] cookie1 | main.rs:264:9:264:11 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:264:9:264:11 | add | main.rs:263:5:263:11 | cookie1 | main.rs:264:9:264:11 | add | Cookie attribute 'Secure' is not set to true. | | main.rs:274:45:274:50 | finish | main.rs:274:5:274:26 | ...::build | main.rs:274:45:274:50 | finish | Cookie attribute 'Secure' is not set to true. | -| main.rs:277:9:277:11 | add | main.rs:276:19:276:38 | ...::new | main.rs:277:9:277:11 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:281:9:281:11 | add | main.rs:280:5:280:11 | [SSA] cookie2 | main.rs:281:9:281:11 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:281:9:281:11 | add | main.rs:280:5:280:11 | cookie2 | main.rs:281:9:281:11 | add | Cookie attribute 'Secure' is not set to true. | edges -| main.rs:8:19:8:50 | ...::build(...) | main.rs:8:19:8:64 | ... .secure(...) | provenance | MaD:35 | +| main.rs:8:19:8:50 | ...::build(...) | main.rs:8:19:8:64 | ... .secure(...) | provenance | MaD:9 | | main.rs:8:19:8:64 | ... .secure(...) | main.rs:8:66:8:70 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:16:19:16:31 | ...::build | main.rs:16:19:16:50 | ...::build(...) | provenance | Src:MaD:15 MaD:15 | +| main.rs:16:19:16:31 | ...::build | main.rs:16:19:16:50 | ...::build(...) | provenance | Src:MaD:6 MaD:6 | | main.rs:16:19:16:50 | ...::build(...) | main.rs:16:52:16:56 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:20:5:20:36 | ...::build(...) | main.rs:20:5:20:54 | ... .secure(...) | provenance | MaD:35 | +| main.rs:20:5:20:36 | ...::build(...) | main.rs:20:5:20:54 | ... .secure(...) | provenance | MaD:9 | | main.rs:20:5:20:54 | ... .secure(...) | main.rs:20:56:20:60 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:21:5:21:36 | ...::build(...) | main.rs:21:5:21:55 | ... .secure(...) | provenance | MaD:35 | +| main.rs:21:5:21:36 | ...::build(...) | main.rs:21:5:21:55 | ... .secure(...) | provenance | MaD:9 | | main.rs:21:5:21:55 | ... .secure(...) | main.rs:21:57:21:61 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:25:5:25:36 | ...::build(...) | main.rs:25:5:25:52 | ... .secure(...) | provenance | MaD:35 | +| main.rs:25:5:25:36 | ...::build(...) | main.rs:25:5:25:52 | ... .secure(...) | provenance | MaD:9 | | main.rs:25:5:25:52 | ... .secure(...) | main.rs:25:54:25:58 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:26:5:26:36 | ...::build(...) | main.rs:26:5:26:50 | ... .secure(...) | provenance | MaD:35 | +| main.rs:26:5:26:36 | ...::build(...) | main.rs:26:5:26:50 | ... .secure(...) | provenance | MaD:9 | | main.rs:26:5:26:50 | ... .secure(...) | main.rs:26:52:26:56 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:27:5:27:36 | ...::build(...) | main.rs:27:5:27:51 | ... .secure(...) | provenance | MaD:35 | +| main.rs:27:5:27:36 | ...::build(...) | main.rs:27:5:27:51 | ... .secure(...) | provenance | MaD:9 | | main.rs:27:5:27:51 | ... .secure(...) | main.rs:27:53:27:57 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:28:5:28:36 | ...::build(...) | main.rs:28:5:28:60 | ... .secure(...) | provenance | MaD:35 | +| main.rs:28:5:28:36 | ...::build(...) | main.rs:28:5:28:60 | ... .secure(...) | provenance | MaD:9 | | main.rs:28:5:28:60 | ... .secure(...) | main.rs:28:62:28:66 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:29:5:29:36 | ...::build(...) | main.rs:29:5:29:60 | ... .secure(...) | provenance | MaD:35 | +| main.rs:29:5:29:36 | ...::build(...) | main.rs:29:5:29:60 | ... .secure(...) | provenance | MaD:9 | | main.rs:29:5:29:60 | ... .secure(...) | main.rs:29:62:29:66 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:33:9:33:40 | ...::build(...) | main.rs:33:9:33:58 | ... .secure(...) | provenance | MaD:35 | +| main.rs:33:9:33:40 | ...::build(...) | main.rs:33:9:33:58 | ... .secure(...) | provenance | MaD:9 | | main.rs:33:9:33:58 | ... .secure(...) | main.rs:33:60:33:64 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:35:9:35:40 | ...::build(...) | main.rs:35:9:35:58 | ... .secure(...) | provenance | MaD:35 | +| main.rs:35:9:35:40 | ...::build(...) | main.rs:35:9:35:58 | ... .secure(...) | provenance | MaD:9 | | main.rs:35:9:35:58 | ... .secure(...) | main.rs:35:60:35:64 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:39:5:39:39 | ...::new(...) | main.rs:39:5:39:53 | ... .secure(...) | provenance | MaD:35 | +| main.rs:39:5:39:39 | ...::new(...) | main.rs:39:5:39:53 | ... .secure(...) | provenance | MaD:9 | | main.rs:39:5:39:53 | ... .secure(...) | main.rs:39:55:39:59 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:40:5:40:50 | ... .expires(...) | main.rs:40:5:40:64 | ... .secure(...) | provenance | MaD:35 | +| main.rs:40:5:40:50 | ... .expires(...) | main.rs:40:5:40:64 | ... .secure(...) | provenance | MaD:9 | | main.rs:40:5:40:64 | ... .secure(...) | main.rs:40:66:40:70 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:41:5:41:79 | ... .max_age(...) | main.rs:41:5:41:93 | ... .secure(...) | provenance | MaD:35 | +| main.rs:41:5:41:79 | ... .max_age(...) | main.rs:41:5:41:93 | ... .secure(...) | provenance | MaD:9 | | main.rs:41:5:41:93 | ... .secure(...) | main.rs:41:95:41:99 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:42:5:42:58 | ... .domain(...) | main.rs:42:5:42:72 | ... .secure(...) | provenance | MaD:35 | +| main.rs:42:5:42:58 | ... .domain(...) | main.rs:42:5:42:72 | ... .secure(...) | provenance | MaD:9 | | main.rs:42:5:42:72 | ... .secure(...) | main.rs:42:74:42:78 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:43:5:43:46 | ... .path(...) | main.rs:43:5:43:60 | ... .secure(...) | provenance | MaD:35 | +| main.rs:43:5:43:46 | ... .path(...) | main.rs:43:5:43:60 | ... .secure(...) | provenance | MaD:9 | | main.rs:43:5:43:60 | ... .secure(...) | main.rs:43:62:43:66 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:44:5:44:52 | ... .http_only(...) | main.rs:44:5:44:66 | ... .secure(...) | provenance | MaD:35 | +| main.rs:44:5:44:52 | ... .http_only(...) | main.rs:44:5:44:66 | ... .secure(...) | provenance | MaD:9 | | main.rs:44:5:44:66 | ... .secure(...) | main.rs:44:68:44:72 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:45:5:45:72 | ... .same_site(...) | main.rs:45:5:45:86 | ... .secure(...) | provenance | MaD:35 | +| main.rs:45:5:45:72 | ... .same_site(...) | main.rs:45:5:45:86 | ... .secure(...) | provenance | MaD:9 | | main.rs:45:5:45:86 | ... .secure(...) | main.rs:45:88:45:92 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:46:5:46:48 | ... .permanent() | main.rs:46:5:46:62 | ... .secure(...) | provenance | MaD:35 | +| main.rs:46:5:46:48 | ... .permanent() | main.rs:46:5:46:62 | ... .secure(...) | provenance | MaD:9 | | main.rs:46:5:46:62 | ... .secure(...) | main.rs:46:64:46:68 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:47:5:47:46 | ... .removal() | main.rs:47:5:47:60 | ... .secure(...) | provenance | MaD:35 | +| main.rs:47:5:47:46 | ... .removal() | main.rs:47:5:47:60 | ... .secure(...) | provenance | MaD:9 | | main.rs:47:5:47:60 | ... .secure(...) | main.rs:47:62:47:66 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:48:5:48:36 | ...::build(...) | main.rs:48:5:48:50 | ... .secure(...) | provenance | MaD:35 | +| main.rs:48:5:48:36 | ...::build(...) | main.rs:48:5:48:50 | ... .secure(...) | provenance | MaD:9 | | main.rs:48:5:48:50 | ... .secure(...) | main.rs:48:52:48:57 | finish | provenance | MaD:3 Sink:MaD:3 | -| main.rs:49:5:49:25 | ...::build(...) | main.rs:49:5:49:39 | ... .secure(...) | provenance | MaD:35 | +| main.rs:49:5:49:25 | ...::build(...) | main.rs:49:5:49:39 | ... .secure(...) | provenance | MaD:9 | | main.rs:49:5:49:39 | ... .secure(...) | main.rs:49:41:49:45 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:50:5:50:40 | ...::build(...) | main.rs:50:5:50:54 | ... .secure(...) | provenance | MaD:35 | +| main.rs:50:5:50:40 | ...::build(...) | main.rs:50:5:50:54 | ... .secure(...) | provenance | MaD:9 | | main.rs:50:5:50:54 | ... .secure(...) | main.rs:50:56:50:60 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:53:5:53:49 | ... .secure(...) | main.rs:53:5:53:63 | ... .secure(...) | provenance | MaD:35 | +| main.rs:53:5:53:49 | ... .secure(...) | main.rs:53:5:53:63 | ... .secure(...) | provenance | MaD:9 | | main.rs:53:5:53:63 | ... .secure(...) | main.rs:53:65:53:69 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:58:9:58:13 | mut a | main.rs:59:13:59:13 | a | provenance | | -| main.rs:58:9:58:13 | mut a | main.rs:60:22:60:22 | a | provenance | | -| main.rs:58:17:58:27 | ...::new | main.rs:58:17:58:44 | ...::new(...) | provenance | Src:MaD:17 MaD:17 | -| main.rs:58:17:58:44 | ...::new(...) | main.rs:58:9:58:13 | mut a | provenance | | -| main.rs:59:13:59:13 | a | main.rs:59:13:59:21 | a.clone() | provenance | MaD:18 | -| main.rs:59:13:59:21 | a.clone() | main.rs:59:9:59:11 | add | provenance | MaD:4 Sink:MaD:4 | -| main.rs:60:22:60:22 | a | main.rs:60:22:60:30 | a.clone() | provenance | MaD:18 | -| main.rs:60:22:60:30 | a.clone() | main.rs:60:9:60:20 | add_original | provenance | MaD:5 Sink:MaD:5 | -| main.rs:63:5:63:5 | [SSA] a | main.rs:64:13:64:13 | a | provenance | | -| main.rs:63:5:63:5 | [SSA] a | main.rs:70:29:70:29 | a | provenance | | -| main.rs:63:5:63:5 | [SSA] a | main.rs:79:30:79:30 | a | provenance | | -| main.rs:63:5:63:5 | a | main.rs:64:13:64:13 | a | provenance | | -| main.rs:63:5:63:5 | a | main.rs:70:29:70:29 | a | provenance | | -| main.rs:63:5:63:5 | a | main.rs:79:30:79:30 | a | provenance | | -| main.rs:64:13:64:13 | a | main.rs:64:13:64:21 | a.clone() | provenance | MaD:18 | -| main.rs:64:13:64:21 | a.clone() | main.rs:64:9:64:11 | add | provenance | MaD:4 Sink:MaD:4 | -| main.rs:68:9:68:13 | mut b | main.rs:69:20:69:20 | b | provenance | | -| main.rs:68:17:68:29 | ...::named | main.rs:68:17:68:37 | ...::named(...) | provenance | Src:MaD:16 MaD:16 | -| main.rs:68:17:68:37 | ...::named(...) | main.rs:68:9:68:13 | mut b | provenance | | -| main.rs:69:20:69:20 | b | main.rs:69:20:69:28 | b.clone() | provenance | MaD:18 | -| main.rs:69:20:69:28 | b.clone() | main.rs:69:16:69:18 | add | provenance | MaD:8 Sink:MaD:8 | -| main.rs:70:29:70:29 | a | main.rs:70:29:70:37 | a.clone() | provenance | MaD:18 | -| main.rs:70:29:70:37 | a.clone() | main.rs:70:16:70:27 | add_original | provenance | MaD:9 Sink:MaD:9 | -| main.rs:71:5:71:5 | [SSA] b | main.rs:72:20:72:20 | b | provenance | | -| main.rs:71:5:71:5 | b | main.rs:72:20:72:20 | b | provenance | | -| main.rs:72:20:72:20 | b | main.rs:72:20:72:28 | b.clone() | provenance | MaD:18 | -| main.rs:72:20:72:28 | b.clone() | main.rs:72:16:72:18 | add | provenance | MaD:8 Sink:MaD:8 | -| main.rs:77:9:77:13 | mut c | main.rs:78:21:78:21 | c | provenance | | -| main.rs:77:9:77:13 | mut c | main.rs:83:21:83:21 | c | provenance | | -| main.rs:77:17:77:28 | ...::from | main.rs:77:17:77:36 | ...::from(...) | provenance | Src:MaD:14 MaD:14 | -| main.rs:77:17:77:36 | ...::from(...) | main.rs:77:9:77:13 | mut c | provenance | | -| main.rs:78:21:78:21 | c | main.rs:78:21:78:29 | c.clone() | provenance | MaD:18 | -| main.rs:78:21:78:29 | c.clone() | main.rs:78:17:78:19 | add | provenance | MaD:6 Sink:MaD:6 | -| main.rs:79:30:79:30 | a | main.rs:79:30:79:38 | a.clone() | provenance | MaD:18 | -| main.rs:79:30:79:38 | a.clone() | main.rs:79:17:79:28 | add_original | provenance | MaD:7 Sink:MaD:7 | -| main.rs:83:21:83:21 | c | main.rs:83:21:83:29 | c.clone() | provenance | MaD:18 | -| main.rs:83:21:83:29 | c.clone() | main.rs:83:17:83:19 | add | provenance | MaD:6 Sink:MaD:6 | -| main.rs:87:9:87:13 | mut d | main.rs:88:13:88:13 | d | provenance | | -| main.rs:87:9:87:13 | mut d | main.rs:94:13:94:13 | d | provenance | | -| main.rs:87:17:87:28 | ...::from | main.rs:87:17:87:36 | ...::from(...) | provenance | Src:MaD:14 MaD:14 | -| main.rs:87:17:87:36 | ...::from(...) | main.rs:87:9:87:13 | mut d | provenance | | -| main.rs:88:13:88:13 | d | main.rs:88:13:88:21 | d.clone() | provenance | MaD:18 | -| main.rs:88:13:88:21 | d.clone() | main.rs:88:9:88:11 | add | provenance | MaD:4 Sink:MaD:4 | -| main.rs:94:13:94:13 | d | main.rs:94:13:94:21 | d.clone() | provenance | MaD:18 | -| main.rs:94:13:94:21 | d.clone() | main.rs:94:9:94:11 | add | provenance | MaD:4 Sink:MaD:4 | -| main.rs:114:5:114:17 | ...::build | main.rs:114:5:114:36 | ...::build(...) | provenance | Src:MaD:15 MaD:15 | -| main.rs:114:5:114:36 | ...::build(...) | main.rs:114:5:114:54 | ... .partitioned(...) | provenance | MaD:33 | +| main.rs:114:5:114:17 | ...::build | main.rs:114:5:114:36 | ...::build(...) | provenance | Src:MaD:6 MaD:6 | +| main.rs:114:5:114:36 | ...::build(...) | main.rs:114:5:114:54 | ... .partitioned(...) | provenance | MaD:7 | | main.rs:114:5:114:54 | ... .partitioned(...) | main.rs:114:56:114:60 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:122:9:122:9 | a | main.rs:123:20:123:20 | a | provenance | | -| main.rs:122:13:122:41 | ...::new | main.rs:122:13:122:58 | ...::new(...) | provenance | Src:MaD:13 MaD:13 | -| main.rs:122:13:122:58 | ...::new(...) | main.rs:122:9:122:9 | a | provenance | | -| main.rs:123:20:123:20 | a | main.rs:123:20:123:28 | a.clone() | provenance | MaD:18 | -| main.rs:123:20:123:28 | a.clone() | main.rs:123:13:123:18 | insert | provenance | MaD:1 Sink:MaD:1 | -| main.rs:130:9:130:9 | c | main.rs:131:20:131:20 | c | provenance | | -| main.rs:130:9:130:9 | c | main.rs:134:13:134:13 | c | provenance | | -| main.rs:130:13:130:13 | b | main.rs:130:13:130:31 | b.set_secure(...) | provenance | MaD:28 | -| main.rs:130:13:130:31 | b.set_secure(...) | main.rs:130:9:130:9 | c | provenance | | -| main.rs:131:20:131:20 | c | main.rs:131:20:131:28 | c.clone() | provenance | MaD:18 | -| main.rs:131:20:131:28 | c.clone() | main.rs:131:13:131:18 | insert | provenance | MaD:1 Sink:MaD:1 | -| main.rs:134:9:134:9 | d | main.rs:135:20:135:20 | d | provenance | | -| main.rs:134:13:134:13 | c | main.rs:134:13:134:35 | c.set_partitioned(...) | provenance | MaD:25 | -| main.rs:134:13:134:35 | c.set_partitioned(...) | main.rs:134:9:134:9 | d | provenance | | -| main.rs:135:20:135:20 | d | main.rs:135:20:135:28 | d.clone() | provenance | MaD:18 | -| main.rs:135:20:135:28 | d.clone() | main.rs:135:13:135:18 | insert | provenance | MaD:1 Sink:MaD:1 | -| main.rs:146:9:146:9 | g | main.rs:147:20:147:20 | g | provenance | | -| main.rs:146:13:146:13 | f | main.rs:146:13:146:31 | f.set_secure(...) | provenance | MaD:28 | -| main.rs:146:13:146:31 | f.set_secure(...) | main.rs:146:9:146:9 | g | provenance | | -| main.rs:147:20:147:20 | g | main.rs:147:20:147:28 | g.clone() | provenance | MaD:18 | -| main.rs:147:20:147:28 | g.clone() | main.rs:147:13:147:18 | insert | provenance | MaD:1 Sink:MaD:1 | | main.rs:151:9:151:9 | h | main.rs:152:20:152:20 | h | provenance | | -| main.rs:151:13:151:42 | ...::from | main.rs:151:13:151:61 | ...::from(...) | provenance | Src:MaD:12 MaD:12 | +| main.rs:151:13:151:42 | ...::from | main.rs:151:13:151:61 | ...::from(...) | provenance | Src:MaD:5 MaD:5 | | main.rs:151:13:151:61 | ...::from(...) | main.rs:151:9:151:9 | h | provenance | | | main.rs:152:20:152:20 | h | main.rs:152:13:152:18 | insert | provenance | MaD:1 Sink:MaD:1 | -| main.rs:155:9:155:9 | i | main.rs:156:20:156:20 | i | provenance | | -| main.rs:155:9:155:9 | i | main.rs:157:20:157:20 | i | provenance | | -| main.rs:155:9:155:9 | i | main.rs:158:20:158:20 | i | provenance | | -| main.rs:155:9:155:9 | i | main.rs:159:20:159:20 | i | provenance | | -| main.rs:155:9:155:9 | i | main.rs:160:20:160:20 | i | provenance | | -| main.rs:155:9:155:9 | i | main.rs:161:20:161:20 | i | provenance | | -| main.rs:155:9:155:9 | i | main.rs:162:20:162:20 | i | provenance | | -| main.rs:155:9:155:9 | i | main.rs:163:20:163:20 | i | provenance | | -| main.rs:155:9:155:9 | i | main.rs:164:20:164:20 | i | provenance | | -| main.rs:155:9:155:9 | i | main.rs:165:20:165:20 | i | provenance | | -| main.rs:155:9:155:9 | i | main.rs:166:20:166:20 | i | provenance | | -| main.rs:155:9:155:9 | i | main.rs:167:20:167:20 | i | provenance | | -| main.rs:155:13:155:41 | ...::new | main.rs:155:13:155:58 | ...::new(...) | provenance | Src:MaD:13 MaD:13 | -| main.rs:155:13:155:58 | ...::new(...) | main.rs:155:9:155:9 | i | provenance | | -| main.rs:156:20:156:20 | i | main.rs:156:20:156:28 | i.clone() | provenance | MaD:18 | -| main.rs:156:20:156:28 | i.clone() | main.rs:156:20:156:46 | ... .set_name(...) | provenance | MaD:24 | -| main.rs:156:20:156:46 | ... .set_name(...) | main.rs:156:13:156:18 | insert | provenance | MaD:1 Sink:MaD:1 | -| main.rs:157:20:157:20 | i | main.rs:157:20:157:28 | i.clone() | provenance | MaD:18 | -| main.rs:157:20:157:28 | i.clone() | main.rs:157:20:157:48 | ... .set_value(...) | provenance | MaD:29 | -| main.rs:157:20:157:48 | ... .set_value(...) | main.rs:157:13:157:18 | insert | provenance | MaD:1 Sink:MaD:1 | -| main.rs:158:20:158:20 | i | main.rs:158:20:158:28 | i.clone() | provenance | MaD:18 | -| main.rs:158:20:158:28 | i.clone() | main.rs:158:20:158:48 | ... .set_http_only(...) | provenance | MaD:22 | -| main.rs:158:20:158:48 | ... .set_http_only(...) | main.rs:158:13:158:18 | insert | provenance | MaD:1 Sink:MaD:1 | -| main.rs:159:20:159:20 | i | main.rs:159:20:159:28 | i.clone() | provenance | MaD:18 | -| main.rs:159:20:159:28 | i.clone() | main.rs:159:20:159:70 | ... .set_same_site(...) | provenance | MaD:27 | -| main.rs:159:20:159:70 | ... .set_same_site(...) | main.rs:159:13:159:18 | insert | provenance | MaD:1 Sink:MaD:1 | -| main.rs:160:20:160:20 | i | main.rs:160:20:160:28 | i.clone() | provenance | MaD:18 | -| main.rs:160:20:160:28 | i.clone() | main.rs:160:20:160:46 | ... .set_max_age(...) | provenance | MaD:23 | -| main.rs:160:20:160:46 | ... .set_max_age(...) | main.rs:160:13:160:18 | insert | provenance | MaD:1 Sink:MaD:1 | -| main.rs:161:20:161:20 | i | main.rs:161:20:161:28 | i.clone() | provenance | MaD:18 | -| main.rs:161:20:161:28 | i.clone() | main.rs:161:20:161:42 | ... .set_path(...) | provenance | MaD:26 | -| main.rs:161:20:161:42 | ... .set_path(...) | main.rs:161:13:161:18 | insert | provenance | MaD:1 Sink:MaD:1 | -| main.rs:162:20:162:20 | i | main.rs:162:20:162:28 | i.clone() | provenance | MaD:18 | -| main.rs:162:20:162:28 | i.clone() | main.rs:162:20:162:41 | ... .unset_path() | provenance | MaD:32 | -| main.rs:162:20:162:41 | ... .unset_path() | main.rs:162:13:162:18 | insert | provenance | MaD:1 Sink:MaD:1 | -| main.rs:163:20:163:20 | i | main.rs:163:20:163:28 | i.clone() | provenance | MaD:18 | -| main.rs:163:20:163:28 | i.clone() | main.rs:163:20:163:54 | ... .set_domain(...) | provenance | MaD:20 | -| main.rs:163:20:163:54 | ... .set_domain(...) | main.rs:163:13:163:18 | insert | provenance | MaD:1 Sink:MaD:1 | -| main.rs:164:20:164:20 | i | main.rs:164:20:164:28 | i.clone() | provenance | MaD:18 | -| main.rs:164:20:164:28 | i.clone() | main.rs:164:20:164:43 | ... .unset_domain() | provenance | MaD:30 | -| main.rs:164:20:164:43 | ... .unset_domain() | main.rs:164:13:164:18 | insert | provenance | MaD:1 Sink:MaD:1 | -| main.rs:165:20:165:20 | i | main.rs:165:20:165:28 | i.clone() | provenance | MaD:18 | -| main.rs:165:20:165:28 | i.clone() | main.rs:165:20:165:46 | ... .set_expires(...) | provenance | MaD:21 | -| main.rs:165:20:165:46 | ... .set_expires(...) | main.rs:165:13:165:18 | insert | provenance | MaD:1 Sink:MaD:1 | -| main.rs:166:20:166:20 | i | main.rs:166:20:166:28 | i.clone() | provenance | MaD:18 | -| main.rs:166:20:166:28 | i.clone() | main.rs:166:20:166:44 | ... .unset_expires() | provenance | MaD:31 | -| main.rs:166:20:166:44 | ... .unset_expires() | main.rs:166:13:166:18 | insert | provenance | MaD:1 Sink:MaD:1 | -| main.rs:167:20:167:20 | i | main.rs:167:20:167:28 | i.clone() | provenance | MaD:18 | -| main.rs:167:20:167:28 | i.clone() | main.rs:167:20:167:45 | ... .make_permanent() | provenance | MaD:19 | -| main.rs:167:20:167:45 | ... .make_permanent() | main.rs:167:13:167:18 | insert | provenance | MaD:1 Sink:MaD:1 | -| main.rs:173:22:173:34 | ...::build | main.rs:173:22:173:59 | ...::build(...) | provenance | Src:MaD:15 MaD:15 | +| main.rs:173:22:173:34 | ...::build | main.rs:173:22:173:59 | ...::build(...) | provenance | Src:MaD:6 MaD:6 | | main.rs:173:22:173:59 | ...::build(...) | main.rs:173:61:173:65 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:197:5:197:39 | ...::build(...) | main.rs:197:5:197:53 | ... .secure(...) | provenance | MaD:35 | +| main.rs:197:5:197:39 | ...::build(...) | main.rs:197:5:197:53 | ... .secure(...) | provenance | MaD:9 | | main.rs:197:5:197:53 | ... .secure(...) | main.rs:197:55:197:60 | finish | provenance | MaD:3 Sink:MaD:3 | -| main.rs:198:5:198:39 | ...::build(...) | main.rs:198:5:198:53 | ... .secure(...) | provenance | MaD:35 | -| main.rs:198:5:198:53 | ... .secure(...) | main.rs:198:5:198:63 | ... .path(...) | provenance | MaD:34 | +| main.rs:198:5:198:39 | ...::build(...) | main.rs:198:5:198:53 | ... .secure(...) | provenance | MaD:9 | +| main.rs:198:5:198:53 | ... .secure(...) | main.rs:198:5:198:63 | ... .path(...) | provenance | MaD:8 | | main.rs:198:5:198:63 | ... .path(...) | main.rs:198:65:198:70 | finish | provenance | MaD:3 Sink:MaD:3 | -| main.rs:201:5:201:11 | [SSA] cookie1 | main.rs:202:13:202:19 | cookie1 | provenance | | -| main.rs:201:5:201:11 | cookie1 | main.rs:202:13:202:19 | cookie1 | provenance | | -| main.rs:202:13:202:19 | cookie1 | main.rs:202:13:202:27 | cookie1.clone() | provenance | MaD:18 | -| main.rs:202:13:202:27 | cookie1.clone() | main.rs:202:9:202:11 | add | provenance | MaD:4 Sink:MaD:4 | -| main.rs:212:5:212:22 | ...::build | main.rs:212:5:212:39 | ...::build(...) | provenance | Src:MaD:15 MaD:15 | +| main.rs:212:5:212:22 | ...::build | main.rs:212:5:212:39 | ...::build(...) | provenance | Src:MaD:6 MaD:6 | | main.rs:212:5:212:39 | ...::build(...) | main.rs:212:41:212:46 | finish | provenance | MaD:3 Sink:MaD:3 | -| main.rs:214:9:214:15 | cookie3 | main.rs:215:13:215:19 | cookie3 | provenance | | -| main.rs:214:19:214:34 | ...::new | main.rs:214:19:214:51 | ...::new(...) | provenance | Src:MaD:17 MaD:17 | -| main.rs:214:19:214:51 | ...::new(...) | main.rs:214:9:214:15 | cookie3 | provenance | | -| main.rs:215:13:215:19 | cookie3 | main.rs:215:13:215:27 | cookie3.clone() | provenance | MaD:18 | -| main.rs:215:13:215:27 | cookie3.clone() | main.rs:215:9:215:11 | add | provenance | MaD:4 Sink:MaD:4 | -| main.rs:218:5:218:11 | [SSA] cookie2 | main.rs:219:13:219:19 | cookie2 | provenance | | -| main.rs:218:5:218:11 | cookie2 | main.rs:219:13:219:19 | cookie2 | provenance | | -| main.rs:219:13:219:19 | cookie2 | main.rs:219:13:219:27 | cookie2.clone() | provenance | MaD:18 | -| main.rs:219:13:219:27 | cookie2.clone() | main.rs:219:9:219:11 | add | provenance | MaD:4 Sink:MaD:4 | -| main.rs:228:5:228:11 | [SSA] cookie1 | main.rs:229:13:229:19 | cookie1 | provenance | | -| main.rs:228:5:228:11 | cookie1 | main.rs:229:13:229:19 | cookie1 | provenance | | -| main.rs:229:13:229:19 | cookie1 | main.rs:229:13:229:27 | cookie1.clone() | provenance | MaD:18 | -| main.rs:229:13:229:27 | cookie1.clone() | main.rs:229:9:229:11 | add | provenance | MaD:11 Sink:MaD:11 | | main.rs:241:9:241:25 | cookie_config_bad | main.rs:242:43:242:59 | cookie_config_bad | provenance | | -| main.rs:241:29:241:62 | ...::new(...) | main.rs:241:29:241:76 | ... .secure(...) | provenance | MaD:38 | +| main.rs:241:29:241:62 | ...::new(...) | main.rs:241:29:241:76 | ... .secure(...) | provenance | MaD:12 | | main.rs:241:29:241:76 | ... .secure(...) | main.rs:241:9:241:25 | cookie_config_bad | provenance | | -| main.rs:242:43:242:59 | cookie_config_bad | main.rs:242:9:242:41 | ...::new | provenance | MaD:10 Sink:MaD:10 | +| main.rs:242:43:242:59 | cookie_config_bad | main.rs:242:9:242:41 | ...::new | provenance | MaD:4 Sink:MaD:4 | | main.rs:244:9:244:26 | cookie_config_bad2 | main.rs:245:43:245:60 | cookie_config_bad2 | provenance | | -| main.rs:244:30:244:63 | ...::new(...) | main.rs:244:30:244:77 | ... .secure(...) | provenance | MaD:38 | -| main.rs:244:30:244:77 | ... .secure(...) | main.rs:244:30:244:90 | ... .name(...) | provenance | MaD:36 | -| main.rs:244:30:244:90 | ... .name(...) | main.rs:244:30:244:100 | ... .path(...) | provenance | MaD:37 | +| main.rs:244:30:244:63 | ...::new(...) | main.rs:244:30:244:77 | ... .secure(...) | provenance | MaD:12 | +| main.rs:244:30:244:77 | ... .secure(...) | main.rs:244:30:244:90 | ... .name(...) | provenance | MaD:10 | +| main.rs:244:30:244:90 | ... .name(...) | main.rs:244:30:244:100 | ... .path(...) | provenance | MaD:11 | | main.rs:244:30:244:100 | ... .path(...) | main.rs:244:9:244:26 | cookie_config_bad2 | provenance | | -| main.rs:245:43:245:60 | cookie_config_bad2 | main.rs:245:9:245:41 | ...::new | provenance | MaD:10 Sink:MaD:10 | -| main.rs:259:5:259:43 | ...::build(...) | main.rs:259:5:259:57 | ... .secure(...) | provenance | MaD:35 | +| main.rs:245:43:245:60 | cookie_config_bad2 | main.rs:245:9:245:41 | ...::new | provenance | MaD:4 Sink:MaD:4 | +| main.rs:259:5:259:43 | ...::build(...) | main.rs:259:5:259:57 | ... .secure(...) | provenance | MaD:9 | | main.rs:259:5:259:57 | ... .secure(...) | main.rs:259:59:259:64 | finish | provenance | MaD:3 Sink:MaD:3 | -| main.rs:260:5:260:43 | ...::build(...) | main.rs:260:5:260:57 | ... .secure(...) | provenance | MaD:35 | -| main.rs:260:5:260:57 | ... .secure(...) | main.rs:260:5:260:67 | ... .path(...) | provenance | MaD:34 | +| main.rs:260:5:260:43 | ...::build(...) | main.rs:260:5:260:57 | ... .secure(...) | provenance | MaD:9 | +| main.rs:260:5:260:57 | ... .secure(...) | main.rs:260:5:260:67 | ... .path(...) | provenance | MaD:8 | | main.rs:260:5:260:67 | ... .path(...) | main.rs:260:69:260:74 | finish | provenance | MaD:3 Sink:MaD:3 | -| main.rs:263:5:263:11 | [SSA] cookie1 | main.rs:264:13:264:19 | cookie1 | provenance | | -| main.rs:263:5:263:11 | cookie1 | main.rs:264:13:264:19 | cookie1 | provenance | | -| main.rs:264:13:264:19 | cookie1 | main.rs:264:13:264:27 | cookie1.clone() | provenance | MaD:18 | -| main.rs:264:13:264:27 | cookie1.clone() | main.rs:264:9:264:11 | add | provenance | MaD:4 Sink:MaD:4 | -| main.rs:274:5:274:26 | ...::build | main.rs:274:5:274:43 | ...::build(...) | provenance | Src:MaD:15 MaD:15 | +| main.rs:274:5:274:26 | ...::build | main.rs:274:5:274:43 | ...::build(...) | provenance | Src:MaD:6 MaD:6 | | main.rs:274:5:274:43 | ...::build(...) | main.rs:274:45:274:50 | finish | provenance | MaD:3 Sink:MaD:3 | -| main.rs:276:9:276:15 | cookie3 | main.rs:277:13:277:19 | cookie3 | provenance | | -| main.rs:276:19:276:38 | ...::new | main.rs:276:19:276:55 | ...::new(...) | provenance | Src:MaD:17 MaD:17 | -| main.rs:276:19:276:55 | ...::new(...) | main.rs:276:9:276:15 | cookie3 | provenance | | -| main.rs:277:13:277:19 | cookie3 | main.rs:277:13:277:27 | cookie3.clone() | provenance | MaD:18 | -| main.rs:277:13:277:27 | cookie3.clone() | main.rs:277:9:277:11 | add | provenance | MaD:4 Sink:MaD:4 | -| main.rs:280:5:280:11 | [SSA] cookie2 | main.rs:281:13:281:19 | cookie2 | provenance | | -| main.rs:280:5:280:11 | cookie2 | main.rs:281:13:281:19 | cookie2 | provenance | | -| main.rs:281:13:281:19 | cookie2 | main.rs:281:13:281:27 | cookie2.clone() | provenance | MaD:18 | -| main.rs:281:13:281:27 | cookie2.clone() | main.rs:281:9:281:11 | add | provenance | MaD:4 Sink:MaD:4 | models | 1 | Sink: ::insert; Argument[0]; cookie-use | | 2 | Sink: ::build; Argument[self]; cookie-use | | 3 | Sink: ::finish; Argument[self]; cookie-use | -| 4 | Sink: ::add; Argument[0]; cookie-use | -| 5 | Sink: ::add_original; Argument[0]; cookie-use | -| 6 | Sink: ::add; Argument[0]; cookie-use | -| 7 | Sink: ::add_original; Argument[0]; cookie-use | -| 8 | Sink: ::add; Argument[0]; cookie-use | -| 9 | Sink: ::add_original; Argument[0]; cookie-use | -| 10 | Sink: ::new; Argument[0]; cookie-use | -| 11 | Sink: ::add; Argument[0]; cookie-use | -| 12 | Source: ::from; ReturnValue; cookie-create | -| 13 | Source: ::new; ReturnValue; cookie-create | -| 14 | Source: ::from; ReturnValue; cookie-create | -| 15 | Source: ::build; ReturnValue; cookie-create | -| 16 | Source: ::named; ReturnValue; cookie-create | -| 17 | Source: ::new; ReturnValue; cookie-create | -| 18 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | -| 19 | Summary: ::make_permanent; Argument[self]; ReturnValue; taint | -| 20 | Summary: ::set_domain; Argument[self]; ReturnValue; taint | -| 21 | Summary: ::set_expires; Argument[self]; ReturnValue; taint | -| 22 | Summary: ::set_http_only; Argument[self]; ReturnValue; taint | -| 23 | Summary: ::set_max_age; Argument[self]; ReturnValue; taint | -| 24 | Summary: ::set_name; Argument[self]; ReturnValue; taint | -| 25 | Summary: ::set_partitioned; Argument[self].OptionalBarrier[cookie-partitioned-arg0]; ReturnValue; taint | -| 26 | Summary: ::set_path; Argument[self]; ReturnValue; taint | -| 27 | Summary: ::set_same_site; Argument[self]; ReturnValue; taint | -| 28 | Summary: ::set_secure; Argument[self].OptionalBarrier[cookie-secure-arg0]; ReturnValue; taint | -| 29 | Summary: ::set_value; Argument[self]; ReturnValue; taint | -| 30 | Summary: ::unset_domain; Argument[self]; ReturnValue; taint | -| 31 | Summary: ::unset_expires; Argument[self]; ReturnValue; taint | -| 32 | Summary: ::unset_path; Argument[self]; ReturnValue; taint | -| 33 | Summary: ::partitioned; Argument[self].OptionalBarrier[cookie-partitioned-arg0]; ReturnValue; taint | -| 34 | Summary: ::path; Argument[self]; ReturnValue; taint | -| 35 | Summary: ::secure; Argument[self].OptionalBarrier[cookie-secure-arg0]; ReturnValue; taint | -| 36 | Summary: ::name; Argument[self]; ReturnValue; taint | -| 37 | Summary: ::path; Argument[self]; ReturnValue; taint | -| 38 | Summary: ::secure; Argument[self].OptionalBarrier[cookie-secure-arg0]; ReturnValue; taint | +| 4 | Sink: ::new; Argument[0]; cookie-use | +| 5 | Source: ::from; ReturnValue; cookie-create | +| 6 | Source: ::build; ReturnValue; cookie-create | +| 7 | Summary: ::partitioned; Argument[self].OptionalBarrier[cookie-partitioned-arg0]; ReturnValue; taint | +| 8 | Summary: ::path; Argument[self]; ReturnValue; taint | +| 9 | Summary: ::secure; Argument[self].OptionalBarrier[cookie-secure-arg0]; ReturnValue; taint | +| 10 | Summary: ::name; Argument[self]; ReturnValue; taint | +| 11 | Summary: ::path; Argument[self]; ReturnValue; taint | +| 12 | Summary: ::secure; Argument[self].OptionalBarrier[cookie-secure-arg0]; ReturnValue; taint | nodes | main.rs:8:19:8:50 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:8:19:8:64 | ... .secure(...) | semmle.label | ... .secure(...) | @@ -415,139 +201,15 @@ nodes | main.rs:53:5:53:49 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:53:5:53:63 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:53:65:53:69 | build | semmle.label | build | -| main.rs:58:9:58:13 | mut a | semmle.label | mut a | -| main.rs:58:17:58:27 | ...::new | semmle.label | ...::new | -| main.rs:58:17:58:44 | ...::new(...) | semmle.label | ...::new(...) | -| main.rs:59:9:59:11 | add | semmle.label | add | -| main.rs:59:13:59:13 | a | semmle.label | a | -| main.rs:59:13:59:21 | a.clone() | semmle.label | a.clone() | -| main.rs:60:9:60:20 | add_original | semmle.label | add_original | -| main.rs:60:22:60:22 | a | semmle.label | a | -| main.rs:60:22:60:30 | a.clone() | semmle.label | a.clone() | -| main.rs:63:5:63:5 | [SSA] a | semmle.label | [SSA] a | -| main.rs:63:5:63:5 | a | semmle.label | a | -| main.rs:64:9:64:11 | add | semmle.label | add | -| main.rs:64:13:64:13 | a | semmle.label | a | -| main.rs:64:13:64:21 | a.clone() | semmle.label | a.clone() | -| main.rs:68:9:68:13 | mut b | semmle.label | mut b | -| main.rs:68:17:68:29 | ...::named | semmle.label | ...::named | -| main.rs:68:17:68:37 | ...::named(...) | semmle.label | ...::named(...) | -| main.rs:69:16:69:18 | add | semmle.label | add | -| main.rs:69:20:69:20 | b | semmle.label | b | -| main.rs:69:20:69:28 | b.clone() | semmle.label | b.clone() | -| main.rs:70:16:70:27 | add_original | semmle.label | add_original | -| main.rs:70:29:70:29 | a | semmle.label | a | -| main.rs:70:29:70:37 | a.clone() | semmle.label | a.clone() | -| main.rs:71:5:71:5 | [SSA] b | semmle.label | [SSA] b | -| main.rs:71:5:71:5 | b | semmle.label | b | -| main.rs:72:16:72:18 | add | semmle.label | add | -| main.rs:72:20:72:20 | b | semmle.label | b | -| main.rs:72:20:72:28 | b.clone() | semmle.label | b.clone() | -| main.rs:77:9:77:13 | mut c | semmle.label | mut c | -| main.rs:77:17:77:28 | ...::from | semmle.label | ...::from | -| main.rs:77:17:77:36 | ...::from(...) | semmle.label | ...::from(...) | -| main.rs:78:17:78:19 | add | semmle.label | add | -| main.rs:78:21:78:21 | c | semmle.label | c | -| main.rs:78:21:78:29 | c.clone() | semmle.label | c.clone() | -| main.rs:79:17:79:28 | add_original | semmle.label | add_original | -| main.rs:79:30:79:30 | a | semmle.label | a | -| main.rs:79:30:79:38 | a.clone() | semmle.label | a.clone() | -| main.rs:83:17:83:19 | add | semmle.label | add | -| main.rs:83:21:83:21 | c | semmle.label | c | -| main.rs:83:21:83:29 | c.clone() | semmle.label | c.clone() | -| main.rs:87:9:87:13 | mut d | semmle.label | mut d | -| main.rs:87:17:87:28 | ...::from | semmle.label | ...::from | -| main.rs:87:17:87:36 | ...::from(...) | semmle.label | ...::from(...) | -| main.rs:88:9:88:11 | add | semmle.label | add | -| main.rs:88:13:88:13 | d | semmle.label | d | -| main.rs:88:13:88:21 | d.clone() | semmle.label | d.clone() | -| main.rs:94:9:94:11 | add | semmle.label | add | -| main.rs:94:13:94:13 | d | semmle.label | d | -| main.rs:94:13:94:21 | d.clone() | semmle.label | d.clone() | | main.rs:114:5:114:17 | ...::build | semmle.label | ...::build | | main.rs:114:5:114:36 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:114:5:114:54 | ... .partitioned(...) | semmle.label | ... .partitioned(...) | | main.rs:114:56:114:60 | build | semmle.label | build | -| main.rs:122:9:122:9 | a | semmle.label | a | -| main.rs:122:13:122:41 | ...::new | semmle.label | ...::new | -| main.rs:122:13:122:58 | ...::new(...) | semmle.label | ...::new(...) | -| main.rs:123:13:123:18 | insert | semmle.label | insert | -| main.rs:123:20:123:20 | a | semmle.label | a | -| main.rs:123:20:123:28 | a.clone() | semmle.label | a.clone() | -| main.rs:130:9:130:9 | c | semmle.label | c | -| main.rs:130:13:130:13 | b | semmle.label | b | -| main.rs:130:13:130:31 | b.set_secure(...) | semmle.label | b.set_secure(...) | -| main.rs:131:13:131:18 | insert | semmle.label | insert | -| main.rs:131:20:131:20 | c | semmle.label | c | -| main.rs:131:20:131:28 | c.clone() | semmle.label | c.clone() | -| main.rs:134:9:134:9 | d | semmle.label | d | -| main.rs:134:13:134:13 | c | semmle.label | c | -| main.rs:134:13:134:35 | c.set_partitioned(...) | semmle.label | c.set_partitioned(...) | -| main.rs:135:13:135:18 | insert | semmle.label | insert | -| main.rs:135:20:135:20 | d | semmle.label | d | -| main.rs:135:20:135:28 | d.clone() | semmle.label | d.clone() | -| main.rs:146:9:146:9 | g | semmle.label | g | -| main.rs:146:13:146:13 | f | semmle.label | f | -| main.rs:146:13:146:31 | f.set_secure(...) | semmle.label | f.set_secure(...) | -| main.rs:147:13:147:18 | insert | semmle.label | insert | -| main.rs:147:20:147:20 | g | semmle.label | g | -| main.rs:147:20:147:28 | g.clone() | semmle.label | g.clone() | | main.rs:151:9:151:9 | h | semmle.label | h | | main.rs:151:13:151:42 | ...::from | semmle.label | ...::from | | main.rs:151:13:151:61 | ...::from(...) | semmle.label | ...::from(...) | | main.rs:152:13:152:18 | insert | semmle.label | insert | | main.rs:152:20:152:20 | h | semmle.label | h | -| main.rs:155:9:155:9 | i | semmle.label | i | -| main.rs:155:13:155:41 | ...::new | semmle.label | ...::new | -| main.rs:155:13:155:58 | ...::new(...) | semmle.label | ...::new(...) | -| main.rs:156:13:156:18 | insert | semmle.label | insert | -| main.rs:156:20:156:20 | i | semmle.label | i | -| main.rs:156:20:156:28 | i.clone() | semmle.label | i.clone() | -| main.rs:156:20:156:46 | ... .set_name(...) | semmle.label | ... .set_name(...) | -| main.rs:157:13:157:18 | insert | semmle.label | insert | -| main.rs:157:20:157:20 | i | semmle.label | i | -| main.rs:157:20:157:28 | i.clone() | semmle.label | i.clone() | -| main.rs:157:20:157:48 | ... .set_value(...) | semmle.label | ... .set_value(...) | -| main.rs:158:13:158:18 | insert | semmle.label | insert | -| main.rs:158:20:158:20 | i | semmle.label | i | -| main.rs:158:20:158:28 | i.clone() | semmle.label | i.clone() | -| main.rs:158:20:158:48 | ... .set_http_only(...) | semmle.label | ... .set_http_only(...) | -| main.rs:159:13:159:18 | insert | semmle.label | insert | -| main.rs:159:20:159:20 | i | semmle.label | i | -| main.rs:159:20:159:28 | i.clone() | semmle.label | i.clone() | -| main.rs:159:20:159:70 | ... .set_same_site(...) | semmle.label | ... .set_same_site(...) | -| main.rs:160:13:160:18 | insert | semmle.label | insert | -| main.rs:160:20:160:20 | i | semmle.label | i | -| main.rs:160:20:160:28 | i.clone() | semmle.label | i.clone() | -| main.rs:160:20:160:46 | ... .set_max_age(...) | semmle.label | ... .set_max_age(...) | -| main.rs:161:13:161:18 | insert | semmle.label | insert | -| main.rs:161:20:161:20 | i | semmle.label | i | -| main.rs:161:20:161:28 | i.clone() | semmle.label | i.clone() | -| main.rs:161:20:161:42 | ... .set_path(...) | semmle.label | ... .set_path(...) | -| main.rs:162:13:162:18 | insert | semmle.label | insert | -| main.rs:162:20:162:20 | i | semmle.label | i | -| main.rs:162:20:162:28 | i.clone() | semmle.label | i.clone() | -| main.rs:162:20:162:41 | ... .unset_path() | semmle.label | ... .unset_path() | -| main.rs:163:13:163:18 | insert | semmle.label | insert | -| main.rs:163:20:163:20 | i | semmle.label | i | -| main.rs:163:20:163:28 | i.clone() | semmle.label | i.clone() | -| main.rs:163:20:163:54 | ... .set_domain(...) | semmle.label | ... .set_domain(...) | -| main.rs:164:13:164:18 | insert | semmle.label | insert | -| main.rs:164:20:164:20 | i | semmle.label | i | -| main.rs:164:20:164:28 | i.clone() | semmle.label | i.clone() | -| main.rs:164:20:164:43 | ... .unset_domain() | semmle.label | ... .unset_domain() | -| main.rs:165:13:165:18 | insert | semmle.label | insert | -| main.rs:165:20:165:20 | i | semmle.label | i | -| main.rs:165:20:165:28 | i.clone() | semmle.label | i.clone() | -| main.rs:165:20:165:46 | ... .set_expires(...) | semmle.label | ... .set_expires(...) | -| main.rs:166:13:166:18 | insert | semmle.label | insert | -| main.rs:166:20:166:20 | i | semmle.label | i | -| main.rs:166:20:166:28 | i.clone() | semmle.label | i.clone() | -| main.rs:166:20:166:44 | ... .unset_expires() | semmle.label | ... .unset_expires() | -| main.rs:167:13:167:18 | insert | semmle.label | insert | -| main.rs:167:20:167:20 | i | semmle.label | i | -| main.rs:167:20:167:28 | i.clone() | semmle.label | i.clone() | -| main.rs:167:20:167:45 | ... .make_permanent() | semmle.label | ... .make_permanent() | | main.rs:173:22:173:34 | ...::build | semmle.label | ...::build | | main.rs:173:22:173:59 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:173:61:173:65 | build | semmle.label | build | @@ -558,30 +220,9 @@ nodes | main.rs:198:5:198:53 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:198:5:198:63 | ... .path(...) | semmle.label | ... .path(...) | | main.rs:198:65:198:70 | finish | semmle.label | finish | -| main.rs:201:5:201:11 | [SSA] cookie1 | semmle.label | [SSA] cookie1 | -| main.rs:201:5:201:11 | cookie1 | semmle.label | cookie1 | -| main.rs:202:9:202:11 | add | semmle.label | add | -| main.rs:202:13:202:19 | cookie1 | semmle.label | cookie1 | -| main.rs:202:13:202:27 | cookie1.clone() | semmle.label | cookie1.clone() | | main.rs:212:5:212:22 | ...::build | semmle.label | ...::build | | main.rs:212:5:212:39 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:212:41:212:46 | finish | semmle.label | finish | -| main.rs:214:9:214:15 | cookie3 | semmle.label | cookie3 | -| main.rs:214:19:214:34 | ...::new | semmle.label | ...::new | -| main.rs:214:19:214:51 | ...::new(...) | semmle.label | ...::new(...) | -| main.rs:215:9:215:11 | add | semmle.label | add | -| main.rs:215:13:215:19 | cookie3 | semmle.label | cookie3 | -| main.rs:215:13:215:27 | cookie3.clone() | semmle.label | cookie3.clone() | -| main.rs:218:5:218:11 | [SSA] cookie2 | semmle.label | [SSA] cookie2 | -| main.rs:218:5:218:11 | cookie2 | semmle.label | cookie2 | -| main.rs:219:9:219:11 | add | semmle.label | add | -| main.rs:219:13:219:19 | cookie2 | semmle.label | cookie2 | -| main.rs:219:13:219:27 | cookie2.clone() | semmle.label | cookie2.clone() | -| main.rs:228:5:228:11 | [SSA] cookie1 | semmle.label | [SSA] cookie1 | -| main.rs:228:5:228:11 | cookie1 | semmle.label | cookie1 | -| main.rs:229:9:229:11 | add | semmle.label | add | -| main.rs:229:13:229:19 | cookie1 | semmle.label | cookie1 | -| main.rs:229:13:229:27 | cookie1.clone() | semmle.label | cookie1.clone() | | main.rs:241:9:241:25 | cookie_config_bad | semmle.label | cookie_config_bad | | main.rs:241:29:241:62 | ...::new(...) | semmle.label | ...::new(...) | | main.rs:241:29:241:76 | ... .secure(...) | semmle.label | ... .secure(...) | @@ -601,23 +242,58 @@ nodes | main.rs:260:5:260:57 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:260:5:260:67 | ... .path(...) | semmle.label | ... .path(...) | | main.rs:260:69:260:74 | finish | semmle.label | finish | -| main.rs:263:5:263:11 | [SSA] cookie1 | semmle.label | [SSA] cookie1 | -| main.rs:263:5:263:11 | cookie1 | semmle.label | cookie1 | -| main.rs:264:9:264:11 | add | semmle.label | add | -| main.rs:264:13:264:19 | cookie1 | semmle.label | cookie1 | -| main.rs:264:13:264:27 | cookie1.clone() | semmle.label | cookie1.clone() | | main.rs:274:5:274:26 | ...::build | semmle.label | ...::build | | main.rs:274:5:274:43 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:274:45:274:50 | finish | semmle.label | finish | -| main.rs:276:9:276:15 | cookie3 | semmle.label | cookie3 | -| main.rs:276:19:276:38 | ...::new | semmle.label | ...::new | -| main.rs:276:19:276:55 | ...::new(...) | semmle.label | ...::new(...) | -| main.rs:277:9:277:11 | add | semmle.label | add | -| main.rs:277:13:277:19 | cookie3 | semmle.label | cookie3 | -| main.rs:277:13:277:27 | cookie3.clone() | semmle.label | cookie3.clone() | -| main.rs:280:5:280:11 | [SSA] cookie2 | semmle.label | [SSA] cookie2 | -| main.rs:280:5:280:11 | cookie2 | semmle.label | cookie2 | -| main.rs:281:9:281:11 | add | semmle.label | add | -| main.rs:281:13:281:19 | cookie2 | semmle.label | cookie2 | -| main.rs:281:13:281:27 | cookie2.clone() | semmle.label | cookie2.clone() | subpaths +testFailures +| main.rs:58:47:58:57 | //... | Missing result: Source | +| main.rs:59:25:59:56 | //... | Missing result: Alert[rust/insecure-cookie] | +| main.rs:60:34:60:65 | //... | Missing result: Alert[rust/insecure-cookie] | +| main.rs:63:26:63:36 | //... | Missing result: Source | +| main.rs:64:25:64:56 | //... | Missing result: Alert[rust/insecure-cookie] | +| main.rs:68:40:68:50 | //... | Missing result: Source | +| main.rs:69:32:69:63 | //... | Missing result: Alert[rust/insecure-cookie] | +| main.rs:70:41:70:72 | //... | Missing result: Alert[rust/insecure-cookie] | +| main.rs:71:30:71:40 | //... | Missing result: Source | +| main.rs:72:32:72:63 | //... | Missing result: Alert[rust/insecure-cookie] | +| main.rs:77:39:77:49 | //... | Missing result: Source | +| main.rs:78:33:78:64 | //... | Missing result: Alert[rust/insecure-cookie] | +| main.rs:79:42:79:73 | //... | Missing result: Alert[rust/insecure-cookie] | +| main.rs:83:33:83:64 | //... | Missing result: Alert[rust/insecure-cookie] | +| main.rs:87:39:87:49 | //... | Missing result: Source | +| main.rs:88:25:88:56 | //... | Missing result: Alert[rust/insecure-cookie] | +| main.rs:94:25:94:66 | //... | Fixed spurious result: Alert[rust/insecure-cookie] | +| main.rs:122:61:122:71 | //... | Missing result: Source | +| main.rs:123:32:123:63 | //... | Missing result: Alert[rust/insecure-cookie] | +| main.rs:130:34:130:44 | //... | Missing result: Source | +| main.rs:131:32:131:63 | //... | Missing result: Alert[rust/insecure-cookie] | +| main.rs:146:34:146:44 | //... | Missing result: Source | +| main.rs:147:32:147:63 | //... | Missing result: Alert[rust/insecure-cookie] | +| main.rs:155:61:155:71 | //... | Missing result: Source | +| main.rs:156:50:156:81 | //... | Missing result: Alert[rust/insecure-cookie] | +| main.rs:157:52:157:83 | //... | Missing result: Alert[rust/insecure-cookie] | +| main.rs:158:52:158:83 | //... | Missing result: Alert[rust/insecure-cookie] | +| main.rs:159:74:159:105 | //... | Missing result: Alert[rust/insecure-cookie] | +| main.rs:160:50:160:81 | //... | Missing result: Alert[rust/insecure-cookie] | +| main.rs:161:46:161:77 | //... | Missing result: Alert[rust/insecure-cookie] | +| main.rs:162:45:162:76 | //... | Missing result: Alert[rust/insecure-cookie] | +| main.rs:163:58:163:89 | //... | Missing result: Alert[rust/insecure-cookie] | +| main.rs:164:47:164:78 | //... | Missing result: Alert[rust/insecure-cookie] | +| main.rs:165:50:165:81 | //... | Missing result: Alert[rust/insecure-cookie] | +| main.rs:166:48:166:79 | //... | Missing result: Alert[rust/insecure-cookie] | +| main.rs:167:49:167:80 | //... | Missing result: Alert[rust/insecure-cookie] | +| main.rs:201:32:201:42 | //... | Missing result: Source | +| main.rs:202:31:202:62 | //... | Missing result: Alert[rust/insecure-cookie] | +| main.rs:214:54:214:64 | //... | Missing result: Source | +| main.rs:215:31:215:62 | //... | Missing result: Alert[rust/insecure-cookie] | +| main.rs:218:31:218:41 | //... | Missing result: Source | +| main.rs:219:31:219:62 | //... | Missing result: Alert[rust/insecure-cookie] | +| main.rs:228:32:228:42 | //... | Missing result: Source | +| main.rs:229:31:229:62 | //... | Missing result: Alert[rust/insecure-cookie] | +| main.rs:263:32:263:42 | //... | Missing result: Source | +| main.rs:264:31:264:62 | //... | Missing result: Alert[rust/insecure-cookie] | +| main.rs:276:58:276:68 | //... | Missing result: Source | +| main.rs:277:31:277:62 | //... | Missing result: Alert[rust/insecure-cookie] | +| main.rs:280:31:280:41 | //... | Missing result: Source | +| main.rs:281:31:281:62 | //... | Missing result: Alert[rust/insecure-cookie] | 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 cf0f287e4f7b..7430d3bacfc3 100644 --- a/rust/ql/test/query-tests/security/CWE-696/BadCTorInitialization.expected +++ b/rust/ql/test/query-tests/security/CWE-696/BadCTorInitialization.expected @@ -22,8 +22,8 @@ | test.rs:125:9:125:44 | ... .write_all(...) | test.rs:128:1:128:7 | Attr | test.rs:125:9:125:44 | ... .write_all(...) | Call to ... .write_all(...) from the standard library in a function with the ctor attribute. | | test.rs:125:9:125:44 | ... .write_all(...) | test.rs:144:1:144:7 | Attr | test.rs:125:9:125:44 | ... .write_all(...) | Call to ... .write_all(...) from the standard library in a function with the ctor attribute. | | test.rs:125:9:125:44 | ... .write_all(...) | test.rs:150:1:150:7 | Attr | test.rs:125:9:125:44 | ... .write_all(...) | Call to ... .write_all(...) from the standard library in a function with the ctor attribute. | -| test.rs:168:1:168:7 | ... .write(...) | test.rs:168:1:168:7 | Attr | test.rs:168:1:168:7 | ... .write(...) | Call to ... .write(...) from the standard library in a function with the ctor attribute. | -| test.rs:168:1:168:7 | ...::stdout(...) | test.rs:168:1:168:7 | Attr | test.rs:168:1:168:7 | ...::stdout(...) | Call to ...::stdout(...) from the standard library in a function with the ctor attribute. | +| test.rs:168:3:168:6 | ... .write(...) | test.rs:168:1:168:7 | Attr | test.rs:168:3:168:6 | ... .write(...) | Call to ... .write(...) from the standard library in a function with the ctor attribute. | +| test.rs:168:3:168:6 | ...::stdout(...) | test.rs:168:1:168:7 | Attr | test.rs:168:3:168:6 | ...::stdout(...) | Call to ...::stdout(...) from the standard library in a function with the ctor attribute. | edges | test.rs:28:1:28:13 | Attr | test.rs:29:4:31:1 | fn bad1_1 | | test.rs:29:4:31:1 | fn bad1_1 | test.rs:30:9:30:25 | ...::stdout(...) | @@ -65,5 +65,5 @@ edges | test.rs:151:4:153:1 | fn bad3_4 | test.rs:152:5:152:12 | bad3_3(...) | | test.rs:152:5:152:12 | bad3_3(...) | test.rs:145:4:148:1 | fn bad3_3 | | test.rs:168:1:168:7 | Attr | test.rs:169:4:171:1 | fn bad4_1 | -| test.rs:169:4:171:1 | fn bad4_1 | test.rs:168:1:168:7 | ... .write(...) | -| test.rs:169:4:171:1 | fn bad4_1 | test.rs:168:1:168:7 | ...::stdout(...) | +| test.rs:169:4:171:1 | fn bad4_1 | test.rs:168:3:168:6 | ... .write(...) | +| test.rs:169:4:171:1 | fn bad4_1 | test.rs:168:3:168:6 | ...::stdout(...) | diff --git a/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected b/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected index 477dbee0e0f4..dca47ef0cdc2 100644 --- a/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected +++ b/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected @@ -42,16 +42,21 @@ | main.rs:210:40:210:50 | grow_zeroed | main.rs:339:13:339:26 | ...::args | main.rs:210:40:210:50 | grow_zeroed | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | | main.rs:213:36:213:41 | shrink | main.rs:339:13:339:26 | ...::args | main.rs:213:36:213:41 | shrink | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | | main.rs:219:13:219:24 | ...::malloc | main.rs:339:13:339:26 | ...::args | main.rs:219:13:219:24 | ...::malloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | +| main.rs:219:13:219:24 | ...::malloc | main.rs:339:13:339:26 | ...::args | main.rs:219:13:219:24 | ...::malloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | | main.rs:220:13:220:31 | ...::aligned_alloc | main.rs:339:13:339:26 | ...::args | main.rs:220:13:220:31 | ...::aligned_alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | | main.rs:222:13:222:24 | ...::calloc | main.rs:339:13:339:26 | ...::args | main.rs:222:13:222:24 | ...::calloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | +| main.rs:222:13:222:24 | ...::calloc | main.rs:339:13:339:26 | ...::args | main.rs:222:13:222:24 | ...::calloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | +| main.rs:223:13:223:24 | ...::calloc | main.rs:339:13:339:26 | ...::args | main.rs:223:13:223:24 | ...::calloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | | main.rs:223:13:223:24 | ...::calloc | main.rs:339:13:339:26 | ...::args | main.rs:223:13:223:24 | ...::calloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | | main.rs:224:13:224:25 | ...::realloc | main.rs:339:13:339:26 | ...::args | main.rs:224:13:224:25 | ...::realloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | +| main.rs:224:13:224:25 | ...::realloc | main.rs:339:13:339:26 | ...::args | main.rs:224:13:224:25 | ...::realloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | | main.rs:228:13:228:41 | ...::try_with_capacity | main.rs:339:13:339:26 | ...::args | main.rs:228:13:228:41 | ...::try_with_capacity | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | | main.rs:229:13:229:37 | ...::with_capacity | main.rs:339:13:339:26 | ...::args | main.rs:229:13:229:37 | ...::with_capacity | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | | main.rs:230:13:230:44 | ...::try_with_capacity_in | main.rs:339:13:339:26 | ...::args | main.rs:230:13:230:44 | ...::try_with_capacity_in | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | | main.rs:231:13:231:40 | ...::with_capacity_in | main.rs:339:13:339:26 | ...::args | main.rs:231:13:231:40 | ...::with_capacity_in | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | | main.rs:287:22:287:38 | ...::alloc | main.rs:311:25:311:38 | ...::args | main.rs:287:22:287:38 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:311:25:311:38 | ...::args | user-provided value | | main.rs:331:13:331:24 | ...::malloc | main.rs:339:13:339:26 | ...::args | main.rs:331:13:331:24 | ...::malloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | +| main.rs:331:13:331:24 | ...::malloc | main.rs:339:13:339:26 | ...::args | main.rs:331:13:331:24 | ...::malloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | edges | main.rs:12:36:12:43 | ...: usize | main.rs:18:41:18:41 | v | provenance | | | main.rs:18:41:18:41 | v | main.rs:18:13:18:31 | ...::realloc | provenance | MaD:17 Sink:MaD:17 | @@ -60,43 +65,43 @@ edges | main.rs:18:41:18:41 | v | main.rs:32:60:32:60 | v | provenance | | | main.rs:18:41:18:41 | v | main.rs:35:49:35:49 | v | provenance | | | main.rs:20:9:20:10 | l2 | main.rs:21:31:21:32 | l2 | provenance | | -| main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | main.rs:20:14:20:63 | ... .unwrap() | provenance | MaD:41 | +| main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | main.rs:20:14:20:63 | ... .unwrap() | provenance | MaD:44 | | main.rs:20:14:20:63 | ... .unwrap() | main.rs:20:9:20:10 | l2 | provenance | | -| main.rs:20:50:20:50 | v | main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | provenance | MaD:33 | +| main.rs:20:50:20:50 | v | main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | provenance | MaD:36 | | main.rs:21:31:21:32 | l2 | main.rs:21:13:21:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:21:31:21:32 | l2 | main.rs:22:31:22:32 | l2 | provenance | | | main.rs:21:31:21:32 | l2 | main.rs:23:31:23:32 | l2 | provenance | | | main.rs:21:31:21:32 | l2 | main.rs:24:38:24:39 | l2 | provenance | | -| main.rs:22:31:22:32 | l2 | main.rs:22:31:22:44 | l2.align_to(...) [Ok] | provenance | MaD:27 | -| main.rs:22:31:22:44 | l2.align_to(...) [Ok] | main.rs:22:31:22:53 | ... .unwrap() | provenance | MaD:41 | +| main.rs:22:31:22:32 | l2 | main.rs:22:31:22:44 | l2.align_to(...) [Ok] | provenance | MaD:30 | +| main.rs:22:31:22:44 | l2.align_to(...) [Ok] | main.rs:22:31:22:53 | ... .unwrap() | provenance | MaD:44 | | main.rs:22:31:22:53 | ... .unwrap() | main.rs:22:13:22:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:23:31:23:32 | l2 | main.rs:23:31:23:44 | l2.align_to(...) [Ok] | provenance | MaD:27 | -| main.rs:23:31:23:44 | l2.align_to(...) [Ok] | main.rs:23:31:23:53 | ... .unwrap() | provenance | MaD:41 | -| main.rs:23:31:23:53 | ... .unwrap() | main.rs:23:31:23:68 | ... .pad_to_align() | provenance | MaD:35 | +| main.rs:23:31:23:32 | l2 | main.rs:23:31:23:44 | l2.align_to(...) [Ok] | provenance | MaD:30 | +| main.rs:23:31:23:44 | l2.align_to(...) [Ok] | main.rs:23:31:23:53 | ... .unwrap() | provenance | MaD:44 | +| main.rs:23:31:23:53 | ... .unwrap() | main.rs:23:31:23:68 | ... .pad_to_align() | provenance | MaD:38 | | main.rs:23:31:23:68 | ... .pad_to_align() | main.rs:23:13:23:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:24:38:24:39 | l2 | main.rs:24:13:24:36 | ...::alloc_zeroed | provenance | MaD:16 Sink:MaD:16 | | main.rs:29:9:29:10 | l4 | main.rs:30:31:30:32 | l4 | provenance | | | main.rs:29:14:29:64 | ...::from_size_align_unchecked(...) | main.rs:29:9:29:10 | l4 | provenance | | -| main.rs:29:60:29:60 | v | main.rs:29:14:29:64 | ...::from_size_align_unchecked(...) | provenance | MaD:34 | +| main.rs:29:60:29:60 | v | main.rs:29:14:29:64 | ...::from_size_align_unchecked(...) | provenance | MaD:37 | | main.rs:30:31:30:32 | l4 | main.rs:30:13:30:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:32:9:32:10 | l5 | main.rs:33:31:33:32 | l5 | provenance | | | main.rs:32:14:32:118 | ...::from_size_align_unchecked(...) | main.rs:32:9:32:10 | l5 | provenance | | -| main.rs:32:60:32:60 | v | main.rs:32:60:32:89 | ... * ... | provenance | MaD:25 | -| main.rs:32:60:32:89 | ... * ... | main.rs:32:14:32:118 | ...::from_size_align_unchecked(...) | provenance | MaD:34 | +| main.rs:32:60:32:60 | v | main.rs:32:60:32:89 | ... * ... | provenance | MaD:28 | +| main.rs:32:60:32:89 | ... * ... | main.rs:32:14:32:118 | ...::from_size_align_unchecked(...) | provenance | MaD:37 | | main.rs:33:31:33:32 | l5 | main.rs:33:13:33:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:35:9:35:10 | s6 | main.rs:36:60:36:61 | s6 | provenance | | | main.rs:35:14:35:54 | ... + ... | main.rs:35:9:35:10 | s6 | provenance | | -| main.rs:35:15:35:49 | ... * ... | main.rs:35:14:35:54 | ... + ... | provenance | MaD:24 | -| main.rs:35:49:35:49 | v | main.rs:35:15:35:49 | ... * ... | provenance | MaD:25 | +| main.rs:35:15:35:49 | ... * ... | main.rs:35:14:35:54 | ... + ... | provenance | MaD:27 | +| main.rs:35:49:35:49 | v | main.rs:35:15:35:49 | ... * ... | provenance | MaD:28 | | main.rs:36:9:36:10 | l6 | main.rs:37:31:37:32 | l6 | provenance | | | main.rs:36:14:36:65 | ...::from_size_align_unchecked(...) | main.rs:36:9:36:10 | l6 | provenance | | -| main.rs:36:60:36:61 | s6 | main.rs:36:14:36:65 | ...::from_size_align_unchecked(...) | provenance | MaD:34 | +| main.rs:36:60:36:61 | s6 | main.rs:36:14:36:65 | ...::from_size_align_unchecked(...) | provenance | MaD:37 | | main.rs:37:31:37:32 | l6 | main.rs:37:13:37:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:37:31:37:32 | l6 | main.rs:39:60:39:61 | l6 | provenance | | | main.rs:39:9:39:10 | l7 | main.rs:40:31:40:32 | l7 | provenance | | | main.rs:39:14:39:72 | ...::from_size_align_unchecked(...) | main.rs:39:9:39:10 | l7 | provenance | | -| main.rs:39:60:39:61 | l6 | main.rs:39:60:39:68 | l6.size() | provenance | MaD:38 | -| main.rs:39:60:39:68 | l6.size() | main.rs:39:14:39:72 | ...::from_size_align_unchecked(...) | provenance | MaD:34 | +| main.rs:39:60:39:61 | l6 | main.rs:39:60:39:68 | l6.size() | provenance | MaD:41 | +| main.rs:39:60:39:68 | l6.size() | main.rs:39:14:39:72 | ...::from_size_align_unchecked(...) | provenance | MaD:37 | | main.rs:40:31:40:32 | l7 | main.rs:40:13:40:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:43:44:43:51 | ...: usize | main.rs:50:41:50:41 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:51:41:51:41 | v | provenance | | @@ -104,27 +109,27 @@ edges | main.rs:43:44:43:51 | ...: usize | main.rs:54:48:54:48 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:58:34:58:34 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:67:46:67:46 | v | provenance | | -| main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | main.rs:50:31:50:51 | ... .unwrap() [tuple.0] | provenance | MaD:41 | +| main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | main.rs:50:31:50:51 | ... .unwrap() [tuple.0] | provenance | MaD:44 | | main.rs:50:31:50:51 | ... .unwrap() [tuple.0] | main.rs:50:31:50:53 | ... .0 | provenance | | | main.rs:50:31:50:53 | ... .0 | main.rs:50:13:50:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:50:41:50:41 | v | main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:36 | -| main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | main.rs:51:31:51:55 | ... .unwrap() [tuple.0] | provenance | MaD:41 | +| main.rs:50:41:50:41 | v | main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:39 | +| main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | main.rs:51:31:51:55 | ... .unwrap() [tuple.0] | provenance | MaD:44 | | main.rs:51:31:51:55 | ... .unwrap() [tuple.0] | main.rs:51:31:51:57 | ... .0 | provenance | | | main.rs:51:31:51:57 | ... .0 | main.rs:51:13:51:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:51:41:51:41 | v | main.rs:51:41:51:45 | ... + ... | provenance | MaD:24 | -| main.rs:51:41:51:45 | ... + ... | main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:36 | -| main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | main.rs:53:31:53:58 | ... .unwrap() | provenance | MaD:41 | +| main.rs:51:41:51:41 | v | main.rs:51:41:51:45 | ... + ... | provenance | MaD:27 | +| main.rs:51:41:51:45 | ... + ... | main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:39 | +| main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | main.rs:53:31:53:58 | ... .unwrap() | provenance | MaD:44 | | main.rs:53:31:53:58 | ... .unwrap() | main.rs:53:13:53:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:53:48:53:48 | v | main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | provenance | MaD:37 | -| main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | main.rs:54:31:54:63 | ... .unwrap() | provenance | MaD:41 | +| main.rs:53:48:53:48 | v | main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | provenance | MaD:40 | +| main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | main.rs:54:31:54:63 | ... .unwrap() | provenance | MaD:44 | | main.rs:54:31:54:63 | ... .unwrap() | main.rs:54:13:54:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:54:48:54:48 | v | main.rs:54:48:54:53 | ... * ... | provenance | MaD:25 | -| main.rs:54:48:54:53 | ... * ... | main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | provenance | MaD:37 | +| main.rs:54:48:54:48 | v | main.rs:54:48:54:53 | ... * ... | provenance | MaD:28 | +| main.rs:54:48:54:53 | ... * ... | main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | provenance | MaD:40 | | main.rs:58:9:58:20 | TuplePat [tuple.0] | main.rs:58:10:58:11 | k1 | provenance | | | main.rs:58:10:58:11 | k1 | main.rs:59:31:59:32 | k1 | provenance | | -| main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | main.rs:58:24:58:66 | ... .expect(...) [tuple.0] | provenance | MaD:40 | +| main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | main.rs:58:24:58:66 | ... .expect(...) [tuple.0] | provenance | MaD:43 | | main.rs:58:24:58:66 | ... .expect(...) [tuple.0] | main.rs:58:9:58:20 | TuplePat [tuple.0] | provenance | | -| main.rs:58:34:58:34 | v | main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | provenance | MaD:36 | +| main.rs:58:34:58:34 | v | main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | provenance | MaD:39 | | main.rs:59:31:59:32 | k1 | main.rs:59:13:59:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:59:31:59:32 | k1 | main.rs:60:34:60:35 | k1 | provenance | | | main.rs:59:31:59:32 | k1 | main.rs:62:24:62:25 | k1 | provenance | | @@ -132,32 +137,32 @@ edges | main.rs:59:31:59:32 | k1 | main.rs:65:31:65:32 | k1 | provenance | | | main.rs:60:9:60:20 | TuplePat [tuple.0] | main.rs:60:10:60:11 | k2 | provenance | | | main.rs:60:10:60:11 | k2 | main.rs:61:31:61:32 | k2 | provenance | | -| main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | main.rs:60:24:60:45 | ... .unwrap() [tuple.0] | provenance | MaD:41 | +| main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | main.rs:60:24:60:45 | ... .unwrap() [tuple.0] | provenance | MaD:44 | | main.rs:60:24:60:45 | ... .unwrap() [tuple.0] | main.rs:60:9:60:20 | TuplePat [tuple.0] | provenance | | -| main.rs:60:34:60:35 | k1 | main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | provenance | MaD:29 | +| main.rs:60:34:60:35 | k1 | main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | provenance | MaD:32 | | main.rs:61:31:61:32 | k2 | main.rs:61:13:61:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:62:9:62:20 | TuplePat [tuple.0] | main.rs:62:10:62:11 | k3 | provenance | | | main.rs:62:10:62:11 | k3 | main.rs:63:31:63:32 | k3 | provenance | | -| main.rs:62:24:62:25 | k1 | main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | provenance | MaD:30 | -| main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | main.rs:62:24:62:45 | ... .unwrap() [tuple.0] | provenance | MaD:41 | +| main.rs:62:24:62:25 | k1 | main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | provenance | MaD:33 | +| main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | main.rs:62:24:62:45 | ... .unwrap() [tuple.0] | provenance | MaD:44 | | main.rs:62:24:62:45 | ... .unwrap() [tuple.0] | main.rs:62:9:62:20 | TuplePat [tuple.0] | provenance | | | main.rs:63:31:63:32 | k3 | main.rs:63:13:63:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | main.rs:64:31:64:59 | ... .unwrap() | provenance | MaD:41 | +| main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | main.rs:64:31:64:59 | ... .unwrap() | provenance | MaD:44 | | main.rs:64:31:64:59 | ... .unwrap() | main.rs:64:13:64:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:64:48:64:49 | k1 | main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | provenance | MaD:31 | -| main.rs:65:31:65:32 | k1 | main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | provenance | MaD:32 | -| main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | main.rs:65:31:65:59 | ... .unwrap() | provenance | MaD:41 | +| main.rs:64:48:64:49 | k1 | main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | provenance | MaD:34 | +| main.rs:65:31:65:32 | k1 | main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | provenance | MaD:35 | +| main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | main.rs:65:31:65:59 | ... .unwrap() | provenance | MaD:44 | | main.rs:65:31:65:59 | ... .unwrap() | main.rs:65:13:65:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:67:9:67:10 | l4 | main.rs:68:31:68:32 | l4 | provenance | | -| main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | main.rs:67:14:67:56 | ... .unwrap() | provenance | MaD:41 | +| main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | main.rs:67:14:67:56 | ... .unwrap() | provenance | MaD:44 | | main.rs:67:14:67:56 | ... .unwrap() | main.rs:67:9:67:10 | l4 | provenance | | -| main.rs:67:46:67:46 | v | main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | +| main.rs:67:46:67:46 | v | main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | provenance | MaD:31 | | main.rs:68:31:68:32 | l4 | main.rs:68:13:68:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:86:35:86:42 | ...: usize | main.rs:87:54:87:54 | v | provenance | | | main.rs:87:9:87:14 | layout | main.rs:88:31:88:36 | layout | provenance | | -| main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | main.rs:87:18:87:67 | ... .unwrap() | provenance | MaD:41 | +| main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | main.rs:87:18:87:67 | ... .unwrap() | provenance | MaD:44 | | main.rs:87:18:87:67 | ... .unwrap() | main.rs:87:9:87:14 | layout | provenance | | -| main.rs:87:54:87:54 | v | main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | provenance | MaD:33 | +| main.rs:87:54:87:54 | v | main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | provenance | MaD:36 | | main.rs:88:31:88:36 | layout | main.rs:88:13:88:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:91:38:91:45 | ...: usize | main.rs:92:47:92:47 | v | provenance | | | main.rs:91:38:91:45 | ...: usize | main.rs:101:51:101:51 | v | provenance | | @@ -168,16 +173,16 @@ edges | main.rs:91:38:91:45 | ...: usize | main.rs:161:55:161:55 | v | provenance | | | main.rs:92:9:92:10 | l1 | main.rs:96:35:96:36 | l1 | provenance | | | main.rs:92:9:92:10 | l1 | main.rs:102:35:102:36 | l1 | provenance | | -| main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | main.rs:92:14:92:57 | ... .unwrap() | provenance | MaD:41 | +| main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | main.rs:92:14:92:57 | ... .unwrap() | provenance | MaD:44 | | main.rs:92:14:92:57 | ... .unwrap() | main.rs:92:9:92:10 | l1 | provenance | | -| main.rs:92:47:92:47 | v | main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | +| main.rs:92:47:92:47 | v | main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | provenance | MaD:31 | | main.rs:96:35:96:36 | l1 | main.rs:96:17:96:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:96:35:96:36 | l1 | main.rs:109:35:109:36 | l1 | provenance | | | main.rs:96:35:96:36 | l1 | main.rs:111:35:111:36 | l1 | provenance | | | main.rs:101:13:101:14 | l3 | main.rs:103:35:103:36 | l3 | provenance | | -| main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | main.rs:101:18:101:61 | ... .unwrap() | provenance | MaD:41 | +| main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | main.rs:101:18:101:61 | ... .unwrap() | provenance | MaD:44 | | main.rs:101:18:101:61 | ... .unwrap() | main.rs:101:13:101:14 | l3 | provenance | | -| main.rs:101:51:101:51 | v | main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | +| main.rs:101:51:101:51 | v | main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | provenance | MaD:31 | | main.rs:102:35:102:36 | l1 | main.rs:102:17:102:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:102:35:102:36 | l1 | main.rs:109:35:109:36 | l1 | provenance | | | main.rs:102:35:102:36 | l1 | main.rs:111:35:111:36 | l1 | provenance | | @@ -188,28 +193,28 @@ edges | main.rs:111:35:111:36 | l1 | main.rs:111:17:111:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:111:35:111:36 | l1 | main.rs:146:35:146:36 | l1 | provenance | | | main.rs:145:13:145:14 | l9 | main.rs:148:35:148:36 | l9 | provenance | | -| main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | main.rs:145:18:145:61 | ... .unwrap() | provenance | MaD:41 | +| main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | main.rs:145:18:145:61 | ... .unwrap() | provenance | MaD:44 | | main.rs:145:18:145:61 | ... .unwrap() | main.rs:145:13:145:14 | l9 | provenance | | -| main.rs:145:51:145:51 | v | main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | +| main.rs:145:51:145:51 | v | main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | provenance | MaD:31 | | main.rs:146:35:146:36 | l1 | main.rs:146:17:146:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:146:35:146:36 | l1 | main.rs:177:31:177:32 | l1 | provenance | | | main.rs:148:35:148:36 | l9 | main.rs:148:17:148:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:151:9:151:11 | l10 | main.rs:152:31:152:33 | l10 | provenance | | -| main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | main.rs:151:15:151:78 | ... .unwrap() | provenance | MaD:41 | +| main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | main.rs:151:15:151:78 | ... .unwrap() | provenance | MaD:44 | | main.rs:151:15:151:78 | ... .unwrap() | main.rs:151:9:151:11 | l10 | provenance | | -| main.rs:151:48:151:68 | ...::min(...) | main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | -| main.rs:151:62:151:62 | v | main.rs:151:48:151:68 | ...::min(...) | provenance | MaD:43 | +| main.rs:151:48:151:68 | ...::min(...) | main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | provenance | MaD:31 | +| main.rs:151:62:151:62 | v | main.rs:151:48:151:68 | ...::min(...) | provenance | MaD:46 | | main.rs:152:31:152:33 | l10 | main.rs:152:13:152:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:154:9:154:11 | l11 | main.rs:155:31:155:33 | l11 | provenance | | -| main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | main.rs:154:15:154:78 | ... .unwrap() | provenance | MaD:41 | +| main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | main.rs:154:15:154:78 | ... .unwrap() | provenance | MaD:44 | | main.rs:154:15:154:78 | ... .unwrap() | main.rs:154:9:154:11 | l11 | provenance | | -| main.rs:154:48:154:68 | ...::max(...) | main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | -| main.rs:154:62:154:62 | v | main.rs:154:48:154:68 | ...::max(...) | provenance | MaD:42 | +| main.rs:154:48:154:68 | ...::max(...) | main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | provenance | MaD:31 | +| main.rs:154:62:154:62 | v | main.rs:154:48:154:68 | ...::max(...) | provenance | MaD:45 | | main.rs:155:31:155:33 | l11 | main.rs:155:13:155:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:161:13:161:15 | l13 | main.rs:162:35:162:37 | l13 | provenance | | -| main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | main.rs:161:19:161:68 | ... .unwrap() | provenance | MaD:41 | +| main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | main.rs:161:19:161:68 | ... .unwrap() | provenance | MaD:44 | | main.rs:161:19:161:68 | ... .unwrap() | main.rs:161:13:161:15 | l13 | provenance | | -| main.rs:161:55:161:55 | v | main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | provenance | MaD:33 | +| main.rs:161:55:161:55 | v | main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | provenance | MaD:36 | | main.rs:162:35:162:37 | l13 | main.rs:162:17:162:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:162:35:162:37 | l13 | main.rs:169:35:169:37 | l13 | provenance | | | main.rs:169:35:169:37 | l13 | main.rs:169:17:169:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | @@ -217,9 +222,9 @@ edges | main.rs:183:29:183:36 | ...: usize | main.rs:192:46:192:46 | v | provenance | | | main.rs:183:29:183:36 | ...: usize | main.rs:202:48:202:48 | v | provenance | | | main.rs:192:9:192:10 | l2 | main.rs:193:38:193:39 | l2 | provenance | | -| main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | main.rs:192:14:192:56 | ... .unwrap() | provenance | MaD:41 | +| main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | main.rs:192:14:192:56 | ... .unwrap() | provenance | MaD:44 | | main.rs:192:14:192:56 | ... .unwrap() | main.rs:192:9:192:10 | l2 | provenance | | -| main.rs:192:46:192:46 | v | main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | +| main.rs:192:46:192:46 | v | main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | provenance | MaD:31 | | main.rs:193:38:193:39 | l2 | main.rs:193:32:193:36 | alloc | provenance | MaD:12 Sink:MaD:12 | | main.rs:193:38:193:39 | l2 | main.rs:194:45:194:46 | l2 | provenance | | | main.rs:194:45:194:46 | l2 | main.rs:194:32:194:43 | alloc_zeroed | provenance | MaD:13 Sink:MaD:13 | @@ -240,14 +245,18 @@ edges | main.rs:213:51:213:52 | l2 | main.rs:213:36:213:41 | shrink | provenance | MaD:11 Sink:MaD:11 | | main.rs:217:27:217:34 | ...: usize | main.rs:219:26:219:26 | v | provenance | | | main.rs:219:26:219:26 | v | main.rs:219:13:219:24 | ...::malloc | provenance | MaD:20 Sink:MaD:20 | +| main.rs:219:26:219:26 | v | main.rs:219:13:219:24 | ...::malloc | provenance | MaD:23 Sink:MaD:23 | | main.rs:219:26:219:26 | v | main.rs:220:36:220:36 | v | provenance | | | main.rs:220:36:220:36 | v | main.rs:220:13:220:31 | ...::aligned_alloc | provenance | MaD:18 Sink:MaD:18 | | main.rs:220:36:220:36 | v | main.rs:222:30:222:30 | v | provenance | | | main.rs:222:30:222:30 | v | main.rs:222:13:222:24 | ...::calloc | provenance | MaD:19 Sink:MaD:19 | +| main.rs:222:30:222:30 | v | main.rs:222:13:222:24 | ...::calloc | provenance | MaD:22 Sink:MaD:22 | | main.rs:222:30:222:30 | v | main.rs:223:26:223:26 | v | provenance | | | main.rs:223:26:223:26 | v | main.rs:223:13:223:24 | ...::calloc | provenance | MaD:19 Sink:MaD:19 | +| main.rs:223:26:223:26 | v | main.rs:223:13:223:24 | ...::calloc | provenance | MaD:22 Sink:MaD:22 | | main.rs:223:26:223:26 | v | main.rs:224:31:224:31 | v | provenance | | | main.rs:224:31:224:31 | v | main.rs:224:13:224:25 | ...::realloc | provenance | MaD:21 Sink:MaD:21 | +| main.rs:224:31:224:31 | v | main.rs:224:13:224:25 | ...::realloc | provenance | MaD:24 Sink:MaD:24 | | main.rs:227:24:227:31 | ...: usize | main.rs:228:43:228:43 | v | provenance | | | main.rs:228:43:228:43 | v | main.rs:228:13:228:41 | ...::try_with_capacity | provenance | MaD:3 Sink:MaD:3 | | main.rs:228:43:228:43 | v | main.rs:229:39:229:39 | v | provenance | | @@ -258,21 +267,22 @@ edges | main.rs:231:42:231:42 | v | main.rs:231:13:231:40 | ...::with_capacity_in | provenance | MaD:6 Sink:MaD:6 | | main.rs:282:24:282:41 | ...: String | main.rs:283:21:283:30 | user_input | provenance | | | main.rs:283:9:283:17 | num_bytes | main.rs:285:54:285:62 | num_bytes | provenance | | -| main.rs:283:21:283:30 | user_input | main.rs:283:21:283:47 | user_input.parse() [Ok] | provenance | MaD:26 | +| main.rs:283:21:283:30 | user_input | main.rs:283:21:283:47 | user_input.parse() [Ok] | provenance | MaD:29 | | main.rs:283:21:283:47 | user_input.parse() [Ok] | main.rs:283:21:283:48 | TryExpr | provenance | | -| main.rs:283:21:283:48 | TryExpr | main.rs:283:21:283:77 | ... * ... | provenance | MaD:25 | +| main.rs:283:21:283:48 | TryExpr | main.rs:283:21:283:77 | ... * ... | provenance | MaD:28 | | main.rs:283:21:283:77 | ... * ... | main.rs:283:9:283:17 | num_bytes | provenance | | | main.rs:285:9:285:14 | layout | main.rs:287:40:287:45 | layout | provenance | | -| main.rs:285:18:285:66 | ...::from_size_align(...) [Ok] | main.rs:285:18:285:75 | ... .unwrap() | provenance | MaD:41 | +| main.rs:285:18:285:66 | ...::from_size_align(...) [Ok] | main.rs:285:18:285:75 | ... .unwrap() | provenance | MaD:44 | | main.rs:285:18:285:75 | ... .unwrap() | main.rs:285:9:285:14 | layout | provenance | | -| main.rs:285:54:285:62 | num_bytes | main.rs:285:18:285:66 | ...::from_size_align(...) [Ok] | provenance | MaD:33 | +| main.rs:285:54:285:62 | num_bytes | main.rs:285:18:285:66 | ...::from_size_align(...) [Ok] | provenance | MaD:36 | | main.rs:287:40:287:45 | layout | main.rs:287:22:287:38 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:311:25:311:38 | ...::args | main.rs:311:25:311:40 | ...::args(...) [element] | provenance | Src:MaD:22 | -| main.rs:311:25:311:40 | ...::args(...) [element] | main.rs:311:25:311:47 | ... .nth(...) [Some] | provenance | MaD:23 | -| main.rs:311:25:311:47 | ... .nth(...) [Some] | main.rs:311:25:311:74 | ... .unwrap_or(...) | provenance | MaD:39 | +| main.rs:311:25:311:38 | ...::args | main.rs:311:25:311:40 | ...::args(...) [element] | provenance | Src:MaD:25 | +| main.rs:311:25:311:40 | ...::args(...) [element] | main.rs:311:25:311:47 | ... .nth(...) [Some] | provenance | MaD:26 | +| main.rs:311:25:311:47 | ... .nth(...) [Some] | main.rs:311:25:311:74 | ... .unwrap_or(...) | provenance | MaD:42 | | main.rs:311:25:311:74 | ... .unwrap_or(...) | main.rs:282:24:282:41 | ...: String | provenance | | | main.rs:317:26:317:33 | ...: usize | main.rs:331:26:331:26 | a | provenance | | | main.rs:331:26:331:26 | a | main.rs:331:13:331:24 | ...::malloc | provenance | MaD:20 Sink:MaD:20 | +| main.rs:331:26:331:26 | a | main.rs:331:13:331:24 | ...::malloc | provenance | MaD:23 Sink:MaD:23 | | main.rs:339:9:339:9 | v | main.rs:342:34:342:34 | v | provenance | | | main.rs:339:9:339:9 | v | main.rs:343:42:343:42 | v | provenance | | | main.rs:339:9:339:9 | v | main.rs:344:36:344:36 | v | provenance | | @@ -280,11 +290,11 @@ edges | main.rs:339:9:339:9 | v | main.rs:346:25:346:25 | v | provenance | | | main.rs:339:9:339:9 | v | main.rs:347:22:347:22 | v | provenance | | | main.rs:339:9:339:9 | v | main.rs:349:24:349:24 | v | provenance | | -| main.rs:339:13:339:26 | ...::args | main.rs:339:13:339:28 | ...::args(...) [element] | provenance | Src:MaD:22 | -| main.rs:339:13:339:28 | ...::args(...) [element] | main.rs:339:13:339:35 | ... .nth(...) [Some] | provenance | MaD:23 | -| main.rs:339:13:339:35 | ... .nth(...) [Some] | main.rs:339:13:339:65 | ... .unwrap_or(...) | provenance | MaD:39 | -| main.rs:339:13:339:65 | ... .unwrap_or(...) | main.rs:339:13:339:82 | ... .parse() [Ok] | provenance | MaD:26 | -| main.rs:339:13:339:82 | ... .parse() [Ok] | main.rs:339:13:339:91 | ... .unwrap() | provenance | MaD:41 | +| main.rs:339:13:339:26 | ...::args | main.rs:339:13:339:28 | ...::args(...) [element] | provenance | Src:MaD:25 | +| main.rs:339:13:339:28 | ...::args(...) [element] | main.rs:339:13:339:35 | ... .nth(...) [Some] | provenance | MaD:26 | +| main.rs:339:13:339:35 | ... .nth(...) [Some] | main.rs:339:13:339:65 | ... .unwrap_or(...) | provenance | MaD:42 | +| main.rs:339:13:339:65 | ... .unwrap_or(...) | main.rs:339:13:339:82 | ... .parse() [Ok] | provenance | MaD:29 | +| main.rs:339:13:339:82 | ... .parse() [Ok] | main.rs:339:13:339:91 | ... .unwrap() | provenance | MaD:44 | | main.rs:339:13:339:91 | ... .unwrap() | main.rs:339:9:339:9 | v | provenance | | | main.rs:342:34:342:34 | v | main.rs:12:36:12:43 | ...: usize | provenance | | | main.rs:343:42:343:42 | v | main.rs:43:44:43:51 | ...: usize | provenance | | @@ -315,28 +325,31 @@ models | 19 | Sink: libc::unix::calloc; Argument[0,1]; alloc-size | | 20 | Sink: libc::unix::malloc; Argument[0]; alloc-size | | 21 | Sink: libc::unix::realloc; Argument[1]; alloc-size | -| 22 | Source: std::env::args; ReturnValue.Element; commandargs | -| 23 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 24 | Summary: <_ as core::ops::arith::Add>::add; Argument[self,0]; ReturnValue; taint | -| 25 | Summary: <_ as core::ops::arith::Mul>::mul; Argument[self,0]; ReturnValue; taint | -| 26 | Summary: ::deref; Argument[self]; ReturnValue; value | -| 27 | Summary: ::align_to; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 28 | Summary: ::array; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 29 | Summary: ::extend; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | -| 30 | Summary: ::extend; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | -| 31 | Summary: ::extend_packed; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 32 | Summary: ::extend_packed; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 33 | Summary: ::from_size_align; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 34 | Summary: ::from_size_align_unchecked; Argument[0]; ReturnValue; taint | -| 35 | Summary: ::pad_to_align; Argument[self].Reference; ReturnValue; taint | -| 36 | Summary: ::repeat; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | -| 37 | Summary: ::repeat_packed; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 38 | Summary: ::size; Argument[self].Reference; ReturnValue; taint | -| 39 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 40 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 41 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 42 | Summary: core::cmp::max; Argument[0]; ReturnValue; value | -| 43 | Summary: core::cmp::min; Argument[0]; ReturnValue; value | +| 22 | Sink: libc::windows::calloc; Argument[0,1]; alloc-size | +| 23 | Sink: libc::windows::malloc; Argument[0]; alloc-size | +| 24 | Sink: libc::windows::realloc; Argument[1]; alloc-size | +| 25 | Source: std::env::args; ReturnValue.Element; commandargs | +| 26 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 27 | Summary: <_ as core::ops::arith::Add>::add; Argument[self,0]; ReturnValue; taint | +| 28 | Summary: <_ as core::ops::arith::Mul>::mul; Argument[self,0]; ReturnValue; taint | +| 29 | Summary: ::deref; Argument[self]; ReturnValue; value | +| 30 | Summary: ::align_to; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 31 | Summary: ::array; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 32 | Summary: ::extend; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | +| 33 | Summary: ::extend; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | +| 34 | Summary: ::extend_packed; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 35 | Summary: ::extend_packed; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 36 | Summary: ::from_size_align; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 37 | Summary: ::from_size_align_unchecked; Argument[0]; ReturnValue; taint | +| 38 | Summary: ::pad_to_align; Argument[self].Reference; ReturnValue; taint | +| 39 | Summary: ::repeat; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | +| 40 | Summary: ::repeat_packed; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 41 | Summary: ::size; Argument[self].Reference; ReturnValue; taint | +| 42 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 43 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 44 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 45 | Summary: core::cmp::max; Argument[0]; ReturnValue; value | +| 46 | Summary: core::cmp::min; Argument[0]; ReturnValue; value | nodes | main.rs:12:36:12:43 | ...: usize | semmle.label | ...: usize | | main.rs:18:13:18:31 | ...::realloc | semmle.label | ...::realloc | @@ -526,14 +539,18 @@ nodes | main.rs:213:51:213:52 | l2 | semmle.label | l2 | | main.rs:217:27:217:34 | ...: usize | semmle.label | ...: usize | | main.rs:219:13:219:24 | ...::malloc | semmle.label | ...::malloc | +| main.rs:219:13:219:24 | ...::malloc | semmle.label | ...::malloc | | main.rs:219:26:219:26 | v | semmle.label | v | | main.rs:220:13:220:31 | ...::aligned_alloc | semmle.label | ...::aligned_alloc | | main.rs:220:36:220:36 | v | semmle.label | v | | main.rs:222:13:222:24 | ...::calloc | semmle.label | ...::calloc | +| main.rs:222:13:222:24 | ...::calloc | semmle.label | ...::calloc | | main.rs:222:30:222:30 | v | semmle.label | v | | main.rs:223:13:223:24 | ...::calloc | semmle.label | ...::calloc | +| main.rs:223:13:223:24 | ...::calloc | semmle.label | ...::calloc | | main.rs:223:26:223:26 | v | semmle.label | v | | main.rs:224:13:224:25 | ...::realloc | semmle.label | ...::realloc | +| main.rs:224:13:224:25 | ...::realloc | semmle.label | ...::realloc | | main.rs:224:31:224:31 | v | semmle.label | v | | main.rs:227:24:227:31 | ...: usize | semmle.label | ...: usize | | main.rs:228:13:228:41 | ...::try_with_capacity | semmle.label | ...::try_with_capacity | @@ -562,6 +579,7 @@ nodes | main.rs:311:25:311:74 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | | main.rs:317:26:317:33 | ...: usize | semmle.label | ...: usize | | main.rs:331:13:331:24 | ...::malloc | semmle.label | ...::malloc | +| main.rs:331:13:331:24 | ...::malloc | semmle.label | ...::malloc | | main.rs:331:26:331:26 | a | semmle.label | a | | main.rs:339:9:339:9 | v | semmle.label | v | | main.rs:339:13:339:26 | ...::args | semmle.label | ...::args | diff --git a/rust/ql/test/query-tests/security/CWE-825/AccessInvalidPointer.expected b/rust/ql/test/query-tests/security/CWE-825/AccessInvalidPointer.expected index d3b5456063ff..0993171ab96a 100644 --- a/rust/ql/test/query-tests/security/CWE-825/AccessInvalidPointer.expected +++ b/rust/ql/test/query-tests/security/CWE-825/AccessInvalidPointer.expected @@ -9,6 +9,7 @@ | deallocation.rs:90:7:90:8 | m2 | deallocation.rs:70:3:70:21 | ...::dealloc | deallocation.rs:90:7:90:8 | m2 | This operation dereferences a pointer that may be $@. | deallocation.rs:70:3:70:21 | ...::dealloc | invalid | | deallocation.rs:95:5:95:31 | ...::write::<...> | deallocation.rs:70:3:70:21 | ...::dealloc | deallocation.rs:95:5:95:31 | ...::write::<...> | This operation dereferences a pointer that may be $@. | deallocation.rs:70:3:70:21 | ...::dealloc | invalid | | deallocation.rs:115:13:115:18 | my_ptr | deallocation.rs:112:3:112:12 | ...::free | deallocation.rs:115:13:115:18 | my_ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:112:3:112:12 | ...::free | invalid | +| deallocation.rs:115:13:115:18 | my_ptr | deallocation.rs:112:3:112:12 | ...::free | deallocation.rs:115:13:115:18 | my_ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:112:3:112:12 | ...::free | invalid | | deallocation.rs:130:14:130:15 | p1 | deallocation.rs:123:23:123:40 | ...::dangling | deallocation.rs:130:14:130:15 | p1 | This operation dereferences a pointer that may be $@. | deallocation.rs:123:23:123:40 | ...::dangling | invalid | | deallocation.rs:131:14:131:15 | p2 | deallocation.rs:124:21:124:42 | ...::dangling_mut | deallocation.rs:131:14:131:15 | p2 | This operation dereferences a pointer that may be $@. | deallocation.rs:124:21:124:42 | ...::dangling_mut | invalid | | deallocation.rs:132:14:132:15 | p3 | deallocation.rs:125:23:125:36 | ...::null | deallocation.rs:132:14:132:15 | p3 | This operation dereferences a pointer that may be $@. | deallocation.rs:125:23:125:36 | ...::null | invalid | @@ -43,6 +44,7 @@ edges | deallocation.rs:70:23:70:35 | [post] m2 as ... | deallocation.rs:95:33:95:34 | m2 | provenance | | | deallocation.rs:95:33:95:34 | m2 | deallocation.rs:95:5:95:31 | ...::write::<...> | provenance | MaD:2 Sink:MaD:2 | | deallocation.rs:112:3:112:12 | ...::free | deallocation.rs:112:14:112:40 | [post] my_ptr as ... | provenance | Src:MaD:9 MaD:9 | +| deallocation.rs:112:3:112:12 | ...::free | deallocation.rs:112:14:112:40 | [post] my_ptr as ... | provenance | Src:MaD:10 MaD:10 | | deallocation.rs:112:14:112:40 | [post] my_ptr as ... | deallocation.rs:115:13:115:18 | my_ptr | provenance | | | deallocation.rs:123:6:123:7 | p1 | deallocation.rs:130:14:130:15 | p1 | provenance | | | deallocation.rs:123:23:123:40 | ...::dangling | deallocation.rs:123:23:123:42 | ...::dangling(...) | provenance | Src:MaD:4 MaD:4 | @@ -92,6 +94,7 @@ models | 7 | Source: core::ptr::null; ReturnValue; pointer-invalidate | | 8 | Source: core::ptr::null_mut; ReturnValue; pointer-invalidate | | 9 | Source: libc::unix::free; Argument[0]; pointer-invalidate | +| 10 | Source: libc::windows::free; Argument[0]; pointer-invalidate | nodes | deallocation.rs:20:3:20:21 | ...::dealloc | semmle.label | ...::dealloc | | deallocation.rs:20:23:20:24 | [post] m1 | semmle.label | [post] m1 | @@ -110,6 +113,7 @@ nodes | deallocation.rs:95:5:95:31 | ...::write::<...> | semmle.label | ...::write::<...> | | deallocation.rs:95:33:95:34 | m2 | semmle.label | m2 | | deallocation.rs:112:3:112:12 | ...::free | semmle.label | ...::free | +| deallocation.rs:112:3:112:12 | ...::free | semmle.label | ...::free | | deallocation.rs:112:14:112:40 | [post] my_ptr as ... | semmle.label | [post] my_ptr as ... | | deallocation.rs:115:13:115:18 | my_ptr | semmle.label | my_ptr | | deallocation.rs:123:6:123:7 | p1 | semmle.label | p1 | From 1bd08217faa2f5d0b3bf12a626fe16d899af6b0e Mon Sep 17 00:00:00 2001 From: Taus Date: Wed, 15 Apr 2026 19:25:40 +0000 Subject: [PATCH 0014/2098] Rust: fix downgrade script (same format_args_arg_names issue) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.properties | 1 - 1 file changed, 1 deletion(-) diff --git a/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.properties b/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.properties index 6d4e1d708ba6..30fc1c731cab 100644 --- a/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.properties +++ b/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.properties @@ -2,7 +2,6 @@ description: Downgrade from rust-analyzer 0.0.328 to 0.0.301 compatibility: partial format_args_arg_arg_names.rel: delete -format_args_arg_names.rel: delete struct_field_default_vals.rel: delete variant_const_args.rel: delete try_block_modifiers.rel: delete From ac27c207113bca37f74b097646df4ec174b29cad Mon Sep 17 00:00:00 2001 From: Taus Date: Thu, 16 Apr 2026 14:12:59 +0000 Subject: [PATCH 0015/2098] Rust: fix consistency test failures from rust-analyzer upgrade - Exclude macro-expanded and attribute paths from PathResolutionConsistency (tokio::main and similar attribute macros resolve to multiple proc macro fns) - Exclude "macro expansion failed" warnings from ExtractionConsistency (compile_error! and undefined macros are expected to fail expansion) - Update pre-existing consistency expectations (net multipleResolvedTargets) - Update type-inference.expected for new RA results Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../ExtractionConsistency.ql | 4 +++- .../internal/PathResolutionConsistency.qll | 4 ++++ .../ExtractionConsistency.expected | 2 -- .../PathResolutionConsistency.expected | 3 +++ .../TypeInferenceConsistency.expected | 4 ++++ .../type-inference/type-inference.expected | 23 ++++++++++++------- .../ExtractionConsistency.expected | 1 - .../PathResolutionConsistency.expected | 6 +++++ .../PathResolutionConsistency.expected | 12 ++++++++++ .../PathResolutionConsistency.expected | 9 ++++++++ .../PathResolutionConsistency.expected | 3 +++ .../PathResolutionConsistency.expected | 2 ++ .../TypeInferenceConsistency.expected | 8 +++++++ 13 files changed, 69 insertions(+), 12 deletions(-) create mode 100644 rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/TypeInferenceConsistency.expected create mode 100644 rust/ql/test/query-tests/security/CWE-295/CONSISTENCY/PathResolutionConsistency.expected create mode 100644 rust/ql/test/query-tests/security/CWE-311/CONSISTENCY/PathResolutionConsistency.expected create mode 100644 rust/ql/test/query-tests/security/CWE-770/CONSISTENCY/PathResolutionConsistency.expected create mode 100644 rust/ql/test/query-tests/security/CWE-825/CONSISTENCY/PathResolutionConsistency.expected create mode 100644 rust/ql/test/query-tests/security/CWE-918/CONSISTENCY/PathResolutionConsistency.expected create mode 100644 rust/ql/test/query-tests/security/CWE-918/CONSISTENCY/TypeInferenceConsistency.expected diff --git a/rust/ql/consistency-queries/ExtractionConsistency.ql b/rust/ql/consistency-queries/ExtractionConsistency.ql index c6e9bcdc2cb7..e07ed64df075 100644 --- a/rust/ql/consistency-queries/ExtractionConsistency.ql +++ b/rust/ql/consistency-queries/ExtractionConsistency.ql @@ -12,5 +12,7 @@ query predicate extractionError(ExtractionError ee) { } query predicate extractionWarning(ExtractionWarning ew) { - not exists(ew.getLocation()) or ew.getLocation().fromSource() + (not exists(ew.getLocation()) or ew.getLocation().fromSource()) and + // macro expansion failures are expected for macros like compile_error! and panic! + not ew.getMessage().matches("macro expansion failed for%") } diff --git a/rust/ql/lib/codeql/rust/internal/PathResolutionConsistency.qll b/rust/ql/lib/codeql/rust/internal/PathResolutionConsistency.qll index 807225d1615a..37de5d358151 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolutionConsistency.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolutionConsistency.qll @@ -8,6 +8,9 @@ private import PathResolution /** Holds if `p` may resolve to multiple items including `i`. */ query predicate multiplePathResolutions(Path p, ItemNode i) { p.fromSource() and + not p.(AstNode).isInMacroExpansion() and + // exclude paths inside attributes (e.g. `#[tokio::main]`) + not p.getParentNode*() instanceof Attr and i = resolvePath(p) and // `panic` is defined in both `std` and `core`; both are included in the prelude not p.getText() = "panic" and @@ -26,6 +29,7 @@ query predicate multiplePathResolutions(Path p, ItemNode i) { /** Holds if `ie` has multiple resolved targets including `target`. */ query predicate multipleResolvedTargets(InvocationExpr ie, Addressable target) { + not ie.(AstNode).isInMacroExpansion() and target = ie.getResolvedTarget() and strictcount(ie.getResolvedTarget()) > 1 } diff --git a/rust/ql/test/extractor-tests/macro-expansion/CONSISTENCY/ExtractionConsistency.expected b/rust/ql/test/extractor-tests/macro-expansion/CONSISTENCY/ExtractionConsistency.expected index 5c472b07a14f..e69de29bb2d1 100644 --- a/rust/ql/test/extractor-tests/macro-expansion/CONSISTENCY/ExtractionConsistency.expected +++ b/rust/ql/test/extractor-tests/macro-expansion/CONSISTENCY/ExtractionConsistency.expected @@ -1,2 +0,0 @@ -extractionWarning -| macro_expansion.rs:56:9:56:31 | macro expansion failed for 'concat' | diff --git a/rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/PathResolutionConsistency.expected index e69de29bb2d1..4388f45f296e 100644 --- a/rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/PathResolutionConsistency.expected @@ -0,0 +1,3 @@ +multipleResolvedTargets +| test.rs:23:26:23:66 | ... .text() | +| test.rs:26:26:26:67 | ... .bytes() | diff --git a/rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/TypeInferenceConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/TypeInferenceConsistency.expected new file mode 100644 index 000000000000..2242144075b9 --- /dev/null +++ b/rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/TypeInferenceConsistency.expected @@ -0,0 +1,4 @@ +nonUniqueCertainType +| test.rs:23:26:23:52 | ...::get(...) | dyn(Output).T | +| test.rs:26:26:26:52 | ...::get(...) | dyn(Output).T | +| test.rs:29:24:29:50 | ...::get(...) | dyn(Output).T | diff --git a/rust/ql/test/library-tests/type-inference/type-inference.expected b/rust/ql/test/library-tests/type-inference/type-inference.expected index 5e870ae6ca5d..0832235788df 100644 --- a/rust/ql/test/library-tests/type-inference/type-inference.expected +++ b/rust/ql/test/library-tests/type-inference/type-inference.expected @@ -3669,7 +3669,6 @@ inferCertainType | main.rs:2405:18:2405:42 | ...::method(...) | | main.rs:2369:5:2369:20 | S1 | | main.rs:2405:18:2405:42 | ...::method(...) | T | main.rs:2371:5:2372:14 | S2 | | main.rs:2405:29:2405:41 | ...::default(...) | | main.rs:2369:5:2369:20 | S1 | -| main.rs:2409:21:2409:33 | ...::default(...) | | main.rs:2371:5:2372:14 | S2 | | main.rs:2410:13:2410:15 | x10 | | main.rs:2392:5:2394:5 | S5 | | main.rs:2410:13:2410:15 | x10 | T5 | main.rs:2371:5:2372:14 | S2 | | main.rs:2410:19:2413:9 | S5::<...> {...} | | main.rs:2392:5:2394:5 | S5 | @@ -3680,7 +3679,6 @@ inferCertainType | main.rs:2415:19:2415:33 | S5 {...} | | main.rs:2392:5:2394:5 | S5 | | main.rs:2416:13:2416:15 | x13 | | main.rs:2392:5:2394:5 | S5 | | main.rs:2416:19:2419:9 | S5 {...} | | main.rs:2392:5:2394:5 | S5 | -| main.rs:2418:20:2418:32 | ...::default(...) | | main.rs:2371:5:2372:14 | S2 | | main.rs:2420:13:2420:15 | x14 | | {EXTERNAL LOCATION} | i32 | | main.rs:2420:19:2420:48 | foo::<...>(...) | | {EXTERNAL LOCATION} | i32 | | main.rs:2421:13:2421:15 | x15 | | main.rs:2369:5:2369:20 | S1 | @@ -12269,10 +12267,7 @@ inferType | main.rs:2408:18:2408:22 | S4(...) | T4 | {EXTERNAL LOCATION} | i32 | | main.rs:2408:21:2408:21 | 0 | | {EXTERNAL LOCATION} | i32 | | main.rs:2409:13:2409:14 | x9 | | main.rs:2390:5:2390:27 | S4 | -| main.rs:2409:13:2409:14 | x9 | T4 | main.rs:2371:5:2372:14 | S2 | | main.rs:2409:18:2409:34 | S4(...) | | main.rs:2390:5:2390:27 | S4 | -| main.rs:2409:18:2409:34 | S4(...) | T4 | main.rs:2371:5:2372:14 | S2 | -| main.rs:2409:21:2409:33 | ...::default(...) | | main.rs:2371:5:2372:14 | S2 | | main.rs:2410:13:2410:15 | x10 | | main.rs:2392:5:2394:5 | S5 | | main.rs:2410:13:2410:15 | x10 | T5 | main.rs:2371:5:2372:14 | S2 | | main.rs:2410:19:2413:9 | S5::<...> {...} | | main.rs:2392:5:2394:5 | S5 | @@ -12289,10 +12284,7 @@ inferType | main.rs:2415:19:2415:33 | S5 {...} | T5 | {EXTERNAL LOCATION} | i32 | | main.rs:2415:31:2415:31 | 0 | | {EXTERNAL LOCATION} | i32 | | main.rs:2416:13:2416:15 | x13 | | main.rs:2392:5:2394:5 | S5 | -| main.rs:2416:13:2416:15 | x13 | T5 | main.rs:2371:5:2372:14 | S2 | | main.rs:2416:19:2419:9 | S5 {...} | | main.rs:2392:5:2394:5 | S5 | -| main.rs:2416:19:2419:9 | S5 {...} | T5 | main.rs:2371:5:2372:14 | S2 | -| main.rs:2418:20:2418:32 | ...::default(...) | | main.rs:2371:5:2372:14 | S2 | | main.rs:2420:13:2420:15 | x14 | | {EXTERNAL LOCATION} | i32 | | main.rs:2420:19:2420:48 | foo::<...>(...) | | {EXTERNAL LOCATION} | i32 | | main.rs:2420:30:2420:47 | ...::default(...) | | {EXTERNAL LOCATION} | i32 | @@ -15861,3 +15853,18 @@ inferType | regressions.rs:179:24:179:27 | S(...) | T | {EXTERNAL LOCATION} | i32 | | regressions.rs:179:26:179:26 | 1 | | {EXTERNAL LOCATION} | i32 | testFailures +| main.rs:1308:44:1308:62 | //... | Missing result: target=default | +| main.rs:2406:48:2406:80 | //... | Missing result: target=default | +| main.rs:2409:37:2409:69 | //... | Missing result: target=default | +| main.rs:2409:37:2409:69 | //... | Missing result: type=x9:T4.S2 | +| main.rs:2412:40:2412:58 | //... | Missing result: target=default | +| main.rs:2416:22:2416:40 | //... | Missing result: type=x13:T5.S2 | +| main.rs:2418:35:2418:53 | //... | Missing result: target=default | +| main.rs:2574:41:2574:59 | //... | Missing result: target=default | +| main.rs:2698:37:2698:64 | //... | Missing result: target=default | +| overloading.rs:58:67:58:125 | //... | Missing result: target=default | +| overloading.rs:60:68:60:132 | //... | Missing result: target=default | +| overloading.rs:64:68:64:126 | //... | Missing result: target=default | +| overloading.rs:66:69:66:133 | //... | Missing result: target=default | +| overloading.rs:368:37:368:64 | //... | Missing result: target=default | +| overloading.rs:398:57:398:84 | //... | Missing result: target=default | diff --git a/rust/ql/test/query-tests/diagnostics/CONSISTENCY/ExtractionConsistency.expected b/rust/ql/test/query-tests/diagnostics/CONSISTENCY/ExtractionConsistency.expected index 82c29ac7f2b0..5b4796faa8c5 100644 --- a/rust/ql/test/query-tests/diagnostics/CONSISTENCY/ExtractionConsistency.expected +++ b/rust/ql/test/query-tests/diagnostics/CONSISTENCY/ExtractionConsistency.expected @@ -5,4 +5,3 @@ extractionWarning | does_not_compile.rs:2:21:2:20 | expected SEMICOLON | | does_not_compile.rs:2:26:2:25 | expected SEMICOLON | | error.rs:2:5:2:17 | An error! | -| my_macro.rs:17:9:17:27 | macro expansion failed for 'myUndefinedMacro' | diff --git a/rust/ql/test/query-tests/security/CWE-295/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-295/CONSISTENCY/PathResolutionConsistency.expected new file mode 100644 index 000000000000..e4c71e75287c --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-295/CONSISTENCY/PathResolutionConsistency.expected @@ -0,0 +1,6 @@ +multipleResolvedTargets +| main.rs:36:16:36:41 | ...::builder(...) | +| main.rs:46:16:46:44 | ...::new(...) | +multiplePathResolutions +| main.rs:36:16:36:30 | ...::Client | +| main.rs:46:16:46:37 | ...::ClientBuilder | diff --git a/rust/ql/test/query-tests/security/CWE-311/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-311/CONSISTENCY/PathResolutionConsistency.expected new file mode 100644 index 000000000000..e0fbd93fd64a --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-311/CONSISTENCY/PathResolutionConsistency.expected @@ -0,0 +1,12 @@ +multipleResolvedTargets +| main.rs:20:18:20:39 | ...::new(...) | +| main.rs:21:5:21:20 | client.post(...) | +| main.rs:21:5:21:33 | ... .body(...) | +| main.rs:21:5:21:40 | ... .send() | +| main.rs:34:18:34:39 | ...::new(...) | +| main.rs:35:5:35:36 | client.request(...) | +| main.rs:35:5:35:49 | ... .body(...) | +| main.rs:35:5:35:56 | ... .send() | +multiplePathResolutions +| main.rs:20:18:20:32 | ...::Client | +| main.rs:34:18:34:32 | ...::Client | diff --git a/rust/ql/test/query-tests/security/CWE-770/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-770/CONSISTENCY/PathResolutionConsistency.expected new file mode 100644 index 000000000000..8fdcfa97d675 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-770/CONSISTENCY/PathResolutionConsistency.expected @@ -0,0 +1,9 @@ +multipleResolvedTargets +| main.rs:218:14:218:30 | ...::malloc(...) | +| main.rs:219:13:219:27 | ...::malloc(...) | +| main.rs:220:13:220:37 | ...::aligned_alloc(...) | +| main.rs:221:13:221:37 | ...::aligned_alloc(...) | +| main.rs:222:13:222:31 | ...::calloc(...) | +| main.rs:223:13:223:55 | ...::calloc(...) | +| main.rs:224:13:224:32 | ...::realloc(...) | +| main.rs:331:13:331:27 | ...::malloc(...) | diff --git a/rust/ql/test/query-tests/security/CWE-825/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-825/CONSISTENCY/PathResolutionConsistency.expected new file mode 100644 index 000000000000..850ba012c153 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-825/CONSISTENCY/PathResolutionConsistency.expected @@ -0,0 +1,3 @@ +multipleResolvedTargets +| deallocation.rs:106:16:106:32 | ...::malloc(...) | +| deallocation.rs:112:3:112:41 | ...::free(...) | diff --git a/rust/ql/test/query-tests/security/CWE-918/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-918/CONSISTENCY/PathResolutionConsistency.expected new file mode 100644 index 000000000000..ac7fc3cad3f0 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-918/CONSISTENCY/PathResolutionConsistency.expected @@ -0,0 +1,2 @@ +multiplePathResolutions +| request_forgery_tests.rs:79:5:79:18 | ...::runtime | diff --git a/rust/ql/test/query-tests/security/CWE-918/CONSISTENCY/TypeInferenceConsistency.expected b/rust/ql/test/query-tests/security/CWE-918/CONSISTENCY/TypeInferenceConsistency.expected new file mode 100644 index 000000000000..b70ece5bb153 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-918/CONSISTENCY/TypeInferenceConsistency.expected @@ -0,0 +1,8 @@ +nonUniqueCertainType +| request_forgery_tests.rs:8:24:8:46 | ...::get(...) | dyn(Output).T | +| request_forgery_tests.rs:17:25:17:42 | ...::get(...) | dyn(Output).T | +| request_forgery_tests.rs:21:25:21:42 | ...::get(...) | dyn(Output).T | +| request_forgery_tests.rs:25:25:25:42 | ...::get(...) | dyn(Output).T | +| request_forgery_tests.rs:31:29:31:51 | ...::get(...) | dyn(Output).T | +| request_forgery_tests.rs:37:37:37:59 | ...::get(...) | dyn(Output).T | +| request_forgery_tests.rs:68:28:68:43 | ...::get(...) | dyn(Output).T | From f66f82ce59032397d5339a479b74cb7c1e8beed0 Mon Sep 17 00:00:00 2001 From: Taus Date: Thu, 16 Apr 2026 20:31:11 +0000 Subject: [PATCH 0016/2098] Rust: fix downgrade script - add missing block_expr_try_block_modifiers Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../upgrade.properties | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.properties b/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.properties index 30fc1c731cab..a17d7f22b27e 100644 --- a/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.properties +++ b/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.properties @@ -1,12 +1,7 @@ description: Downgrade from rust-analyzer 0.0.328 to 0.0.301 compatibility: partial -format_args_arg_arg_names.rel: delete -struct_field_default_vals.rel: delete -variant_const_args.rel: delete -try_block_modifiers.rel: delete -try_block_modifier_is_try.rel: delete -try_block_modifier_type_reprs.rel: delete +block_expr_try_block_modifiers.rel: delete cfg_atoms.rel: delete cfg_attr_meta.rel: delete cfg_attr_meta_cfg_predicates.rel: delete @@ -15,14 +10,20 @@ cfg_composites.rel: delete cfg_composite_cfg_predicates.rel: delete cfg_meta.rel: delete cfg_meta_cfg_predicates.rel: delete +format_args_arg_arg_names.rel: delete key_value_meta.rel: delete key_value_meta_exprs.rel: delete key_value_meta_paths.rel: delete path_meta.rel: delete path_meta_paths.rel: delete +struct_field_default_vals.rel: delete token_tree_meta.rel: delete token_tree_meta_paths.rel: delete token_tree_meta_token_trees.rel: delete +try_block_modifier_is_try.rel: delete +try_block_modifiers.rel: delete +try_block_modifier_type_reprs.rel: delete unsafe_meta.rel: delete unsafe_meta_is_unsafe.rel: delete unsafe_meta_meta.rel: delete +variant_const_args.rel: delete From a2ecf6571156d33df8ce3ec36e87aa959b3c55b0 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 22 May 2026 17:14:42 +0200 Subject: [PATCH 0017/2098] Rust: accept test changes --- .../library-tests/type-inference/type-inference.expected | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rust/ql/test/library-tests/type-inference/type-inference.expected b/rust/ql/test/library-tests/type-inference/type-inference.expected index 4d1ae6a72624..137b6cab0153 100644 --- a/rust/ql/test/library-tests/type-inference/type-inference.expected +++ b/rust/ql/test/library-tests/type-inference/type-inference.expected @@ -15848,11 +15848,11 @@ inferType | regressions.rs:179:26:179:26 | 1 | | {EXTERNAL LOCATION} | i32 | testFailures | main.rs:1308:44:1308:62 | //... | Missing result: target=default | -| main.rs:2406:48:2406:80 | //... | Missing result: target=default | -| main.rs:2409:37:2409:69 | //... | Missing result: target=default | -| main.rs:2409:37:2409:69 | //... | Missing result: type=x9:T4.S2 | +| main.rs:2406:48:2406:84 | //... | Missing result: target=default | +| main.rs:2409:37:2409:73 | //... | Missing result: target=default | +| main.rs:2409:37:2409:73 | //... | Missing result: type=x9@S4:S2 | | main.rs:2412:40:2412:58 | //... | Missing result: target=default | -| main.rs:2416:22:2416:40 | //... | Missing result: type=x13:T5.S2 | +| main.rs:2416:22:2416:44 | //... | Missing result: type=x13@S5:S2 | | main.rs:2418:35:2418:53 | //... | Missing result: target=default | | main.rs:2574:41:2574:59 | //... | Missing result: target=default | | main.rs:2698:37:2698:64 | //... | Missing result: target=default | From 7f2bda10661935680f0aeb664fbd7e92d7d90dc9 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Tue, 26 May 2026 18:17:38 +0200 Subject: [PATCH 0018/2098] Rust: Add full upgrade script for dbscheme migration Adds upgrade.ql with transformations for all schema changes from rust-analyzer 0.0.301 to 0.0.328: - Meta split into PathMeta/KeyValueMeta/TokenTreeMeta/UnsafeMeta - TraitAlias merged into Trait - BlockExpr.isTry() -> TryBlockModifier - StructField.getDefault() -> getDefaultVal() returning ConstArg - Variant.getDiscriminant() -> getConstArg() returning ConstArg - FormatArgsArg.getName() -> getArgName() returning FormatArgsArgName Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../upgrade.properties | 30 ++- .../upgrade.ql | 205 ++++++++++++++++++ 2 files changed, 234 insertions(+), 1 deletion(-) create mode 100644 rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/upgrade.ql diff --git a/rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/upgrade.properties b/rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/upgrade.properties index c130c0f83810..55145c26245b 100644 --- a/rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/upgrade.properties +++ b/rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/upgrade.properties @@ -1,14 +1,29 @@ description: Upgrade from rust-analyzer 0.0.301 to 0.0.328 -compatibility: partial +compatibility: full block_expr_is_try.rel: delete +format_args_arg_names.rel: run upgrade.ql new_format_args_arg_names +format_args_arg_arg_names.rel: run upgrade.ql new_format_args_arg_arg_names meta.rel: delete meta_exprs.rel: delete meta_is_unsafe.rel: delete meta_paths.rel: delete meta_token_trees.rel: delete +path_meta.rel: run upgrade.ql new_path_meta +path_meta_paths.rel: run upgrade.ql new_path_meta_paths +key_value_meta.rel: run upgrade.ql new_key_value_meta +key_value_meta_exprs.rel: run upgrade.ql new_key_value_meta_exprs +key_value_meta_paths.rel: run upgrade.ql new_key_value_meta_paths +token_tree_meta.rel: run upgrade.ql new_token_tree_meta +token_tree_meta_paths.rel: run upgrade.ql new_token_tree_meta_paths +token_tree_meta_token_trees.rel: run upgrade.ql new_token_tree_meta_token_trees +unsafe_meta.rel: run upgrade.ql new_unsafe_meta +unsafe_meta_is_unsafe.rel: run upgrade.ql new_unsafe_meta_is_unsafe +unsafe_meta_meta.rel: run upgrade.ql new_unsafe_meta_meta struct_field_defaults.rel: delete +struct_field_default_vals.rel: run upgrade.ql new_struct_field_default_vals variant_discriminants.rel: delete +variant_const_args.rel: run upgrade.ql new_variant_const_args trait_aliases.rel: delete trait_alias_attrs.rel: delete trait_alias_generic_param_lists.rel: delete @@ -16,3 +31,16 @@ trait_alias_names.rel: delete trait_alias_type_bound_lists.rel: delete trait_alias_visibilities.rel: delete trait_alias_where_clauses.rel: delete +try_block_modifiers.rel: run upgrade.ql new_try_block_modifiers +try_block_modifier_is_try.rel: run upgrade.ql new_try_block_modifier_is_try +block_expr_try_block_modifiers.rel: run upgrade.ql new_block_expr_try_block_modifiers +const_args.rel: run upgrade.ql new_const_args +const_arg_exprs.rel: run upgrade.ql new_const_arg_exprs +traits.rel: run upgrade.ql new_traits +trait_attrs.rel: run upgrade.ql new_trait_attrs +trait_generic_param_lists.rel: run upgrade.ql new_trait_generic_param_lists +trait_names.rel: run upgrade.ql new_trait_names +trait_type_bound_lists.rel: run upgrade.ql new_trait_type_bound_lists +trait_visibilities.rel: run upgrade.ql new_trait_visibilities +trait_where_clauses.rel: run upgrade.ql new_trait_where_clauses +locatable_locations.rel: run upgrade.ql new_locatable_locations diff --git a/rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/upgrade.ql b/rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/upgrade.ql new file mode 100644 index 000000000000..db588965363a --- /dev/null +++ b/rust/ql/lib/upgrades/66a489863649185f4a9770f894505803059a1312/upgrade.ql @@ -0,0 +1,205 @@ +class Element extends @element { + string toString() { none() } +} + +class Location extends @location_default { + string toString() { none() } +} + +private predicate oldMetaHasExpr(Element meta) { meta_exprs(meta, _) } + +private predicate oldMetaHasPath(Element meta) { meta_paths(meta, _) } + +private predicate oldMetaHasTokenTree(Element meta) { meta_token_trees(meta, _) } + +private predicate oldMetaIsPath(Element meta) { + oldMetaHasPath(meta) and not oldMetaHasExpr(meta) and not oldMetaHasTokenTree(meta) +} + +private predicate oldMetaIsKeyValue(Element meta) { oldMetaHasPath(meta) and oldMetaHasExpr(meta) } + +private predicate oldMetaIsTokenTree(Element meta) { + oldMetaHasPath(meta) and oldMetaHasTokenTree(meta) and not oldMetaHasExpr(meta) +} + +private predicate oldMetaHasInnerShape(Element meta) { + oldMetaIsPath(meta) or oldMetaIsKeyValue(meta) or oldMetaIsTokenTree(meta) +} + +newtype TAddedElement = + TFormatArgsArgName(Element arg, Element name) { format_args_arg_names(arg, name) } or + TTryBlockModifier(Element block) { block_expr_is_try(block) } or + TStructFieldDefaultConstArg(Element field, Element expr) { struct_field_defaults(field, expr) } or + TVariantDiscriminantConstArg(Element variant, Element expr) { + variant_discriminants(variant, expr) + } or + TUnsafePathMeta(Element meta) { meta_is_unsafe(meta) and oldMetaIsPath(meta) } or + TUnsafeKeyValueMeta(Element meta) { meta_is_unsafe(meta) and oldMetaIsKeyValue(meta) } or + TUnsafeTokenTreeMeta(Element meta) { meta_is_unsafe(meta) and oldMetaIsTokenTree(meta) } + +module Fresh = QlBuiltins::NewEntity; + +class TNewElement = @element or Fresh::EntityId; + +class NewElement extends TNewElement { + string toString() { none() } +} + +private predicate isFreshInnerMeta(NewElement id, Element oldMeta) { + id = Fresh::map(TUnsafePathMeta(oldMeta)) or + id = Fresh::map(TUnsafeKeyValueMeta(oldMeta)) or + id = Fresh::map(TUnsafeTokenTreeMeta(oldMeta)) +} + +query predicate new_format_args_arg_names(NewElement id) { + id = Fresh::map(TFormatArgsArgName(_, _)) +} + +query predicate new_format_args_arg_arg_names(Element id, NewElement arg_name) { + arg_name = Fresh::map(TFormatArgsArgName(id, _)) +} + +query predicate new_try_block_modifiers(NewElement id) { id = Fresh::map(TTryBlockModifier(_)) } + +query predicate new_try_block_modifier_is_try(NewElement id) { + id = Fresh::map(TTryBlockModifier(_)) +} + +query predicate new_block_expr_try_block_modifiers(Element id, NewElement try_block_modifier) { + try_block_modifier = Fresh::map(TTryBlockModifier(id)) +} + +query predicate new_const_args(NewElement id) { + const_args(id) or + id = Fresh::map(TStructFieldDefaultConstArg(_, _)) or + id = Fresh::map(TVariantDiscriminantConstArg(_, _)) +} + +query predicate new_const_arg_exprs(NewElement id, Element expr) { + const_arg_exprs(id, expr) or + id = Fresh::map(TStructFieldDefaultConstArg(_, expr)) or + id = Fresh::map(TVariantDiscriminantConstArg(_, expr)) +} + +query predicate new_struct_field_default_vals(Element id, NewElement default_val) { + default_val = Fresh::map(TStructFieldDefaultConstArg(id, _)) +} + +query predicate new_variant_const_args(Element id, NewElement const_arg) { + const_arg = Fresh::map(TVariantDiscriminantConstArg(id, _)) +} + +query predicate new_traits(Element id) { traits(id) or trait_aliases(id) } + +query predicate new_trait_attrs(Element id, int index, Element attr) { + trait_attrs(id, index, attr) or trait_alias_attrs(id, index, attr) +} + +query predicate new_trait_generic_param_lists(Element id, Element generic_param_list) { + trait_generic_param_lists(id, generic_param_list) or + trait_alias_generic_param_lists(id, generic_param_list) +} + +query predicate new_trait_names(Element id, Element name) { + trait_names(id, name) or trait_alias_names(id, name) +} + +query predicate new_trait_type_bound_lists(Element id, Element type_bound_list) { + trait_type_bound_lists(id, type_bound_list) or trait_alias_type_bound_lists(id, type_bound_list) +} + +query predicate new_trait_visibilities(Element id, Element visibility) { + trait_visibilities(id, visibility) or trait_alias_visibilities(id, visibility) +} + +query predicate new_trait_where_clauses(Element id, Element where_clause) { + trait_where_clauses(id, where_clause) or trait_alias_where_clauses(id, where_clause) +} + +query predicate new_path_meta(NewElement id) { + meta(id) and not meta_is_unsafe(id) and oldMetaIsPath(id) + or + id = Fresh::map(TUnsafePathMeta(_)) +} + +query predicate new_path_meta_paths(NewElement id, Element path) { + meta_paths(id, path) and not meta_is_unsafe(id) and oldMetaIsPath(id) + or + exists(Element oldMeta | id = Fresh::map(TUnsafePathMeta(oldMeta)) and meta_paths(oldMeta, path)) +} + +query predicate new_key_value_meta(NewElement id) { + meta(id) and not meta_is_unsafe(id) and oldMetaIsKeyValue(id) + or + id = Fresh::map(TUnsafeKeyValueMeta(_)) +} + +query predicate new_key_value_meta_exprs(NewElement id, Element expr) { + meta_exprs(id, expr) and not meta_is_unsafe(id) and oldMetaIsKeyValue(id) + or + exists(Element oldMeta | + id = Fresh::map(TUnsafeKeyValueMeta(oldMeta)) and meta_exprs(oldMeta, expr) + ) +} + +query predicate new_key_value_meta_paths(NewElement id, Element path) { + meta_paths(id, path) and not meta_is_unsafe(id) and oldMetaIsKeyValue(id) + or + exists(Element oldMeta | + id = Fresh::map(TUnsafeKeyValueMeta(oldMeta)) and meta_paths(oldMeta, path) + ) +} + +query predicate new_token_tree_meta(NewElement id) { + meta(id) and not meta_is_unsafe(id) and oldMetaIsTokenTree(id) + or + id = Fresh::map(TUnsafeTokenTreeMeta(_)) +} + +query predicate new_token_tree_meta_paths(NewElement id, Element path) { + meta_paths(id, path) and not meta_is_unsafe(id) and oldMetaIsTokenTree(id) + or + exists(Element oldMeta | + id = Fresh::map(TUnsafeTokenTreeMeta(oldMeta)) and meta_paths(oldMeta, path) + ) +} + +query predicate new_token_tree_meta_token_trees(NewElement id, Element token_tree) { + meta_token_trees(id, token_tree) and not meta_is_unsafe(id) and oldMetaIsTokenTree(id) + or + exists(Element oldMeta | + id = Fresh::map(TUnsafeTokenTreeMeta(oldMeta)) and meta_token_trees(oldMeta, token_tree) + ) +} + +query predicate new_unsafe_meta(Element id) { meta_is_unsafe(id) } + +query predicate new_unsafe_meta_is_unsafe(Element id) { meta_is_unsafe(id) } + +query predicate new_unsafe_meta_meta(Element id, NewElement inner) { + meta_is_unsafe(id) and oldMetaHasInnerShape(id) and isFreshInnerMeta(inner, id) +} + +query predicate new_locatable_locations(NewElement id, Location location) { + locatable_locations(id, location) + or + exists(Element arg, Element name | + id = Fresh::map(TFormatArgsArgName(arg, name)) and locatable_locations(name, location) + ) + or + exists(Element block | + id = Fresh::map(TTryBlockModifier(block)) and locatable_locations(block, location) + ) + or + exists(Element field, Element expr | + id = Fresh::map(TStructFieldDefaultConstArg(field, expr)) and + locatable_locations(expr, location) + ) + or + exists(Element variant, Element expr | + id = Fresh::map(TVariantDiscriminantConstArg(variant, expr)) and + locatable_locations(expr, location) + ) + or + exists(Element oldMeta | isFreshInnerMeta(id, oldMeta) and locatable_locations(oldMeta, location)) +} From 25ab2e0280b06801183ecf1ff570bdfae8ce79a5 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Wed, 27 May 2026 09:33:18 +0200 Subject: [PATCH 0019/2098] Rust: Add full downgrade script for dbscheme migration Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../upgrade.properties | 32 +++- .../upgrade.ql | 174 ++++++++++++++++++ 2 files changed, 205 insertions(+), 1 deletion(-) create mode 100644 rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.ql diff --git a/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.properties b/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.properties index a17d7f22b27e..1bd49f3382b4 100644 --- a/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.properties +++ b/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.properties @@ -1,7 +1,8 @@ description: Downgrade from rust-analyzer 0.0.328 to 0.0.301 -compatibility: partial +compatibility: full block_expr_try_block_modifiers.rel: delete +block_expr_is_try.rel: run upgrade.ql new_block_expr_is_try cfg_atoms.rel: delete cfg_attr_meta.rel: delete cfg_attr_meta_cfg_predicates.rel: delete @@ -10,16 +11,44 @@ cfg_composites.rel: delete cfg_composite_cfg_predicates.rel: delete cfg_meta.rel: delete cfg_meta_cfg_predicates.rel: delete +const_args.rel: run upgrade.ql new_const_args +const_arg_exprs.rel: run upgrade.ql new_const_arg_exprs format_args_arg_arg_names.rel: delete +format_args_arg_names.rel: run upgrade.ql new_format_args_arg_names key_value_meta.rel: delete key_value_meta_exprs.rel: delete key_value_meta_paths.rel: delete +locatable_locations.rel: run upgrade.ql new_locatable_locations +meta.rel: run upgrade.ql new_meta +meta_exprs.rel: run upgrade.ql new_meta_exprs +meta_is_unsafe.rel: run upgrade.ql new_meta_is_unsafe +meta_paths.rel: run upgrade.ql new_meta_paths +meta_token_trees.rel: run upgrade.ql new_meta_token_trees +names.rel: run upgrade.ql new_names path_meta.rel: delete path_meta_paths.rel: delete struct_field_default_vals.rel: delete +struct_field_defaults.rel: run upgrade.ql new_struct_field_defaults token_tree_meta.rel: delete token_tree_meta_paths.rel: delete token_tree_meta_token_trees.rel: delete +trait_assoc_item_lists.rel: run upgrade.ql new_trait_assoc_item_lists +trait_attrs.rel: run upgrade.ql new_trait_attrs +trait_generic_param_lists.rel: run upgrade.ql new_trait_generic_param_lists +trait_is_auto.rel: run upgrade.ql new_trait_is_auto +trait_is_unsafe.rel: run upgrade.ql new_trait_is_unsafe +trait_names.rel: run upgrade.ql new_trait_names +trait_type_bound_lists.rel: run upgrade.ql new_trait_type_bound_lists +trait_visibilities.rel: run upgrade.ql new_trait_visibilities +trait_where_clauses.rel: run upgrade.ql new_trait_where_clauses +trait_aliases.rel: run upgrade.ql new_trait_aliases +trait_alias_attrs.rel: run upgrade.ql new_trait_alias_attrs +trait_alias_generic_param_lists.rel: run upgrade.ql new_trait_alias_generic_param_lists +trait_alias_names.rel: run upgrade.ql new_trait_alias_names +trait_alias_type_bound_lists.rel: run upgrade.ql new_trait_alias_type_bound_lists +trait_alias_visibilities.rel: run upgrade.ql new_trait_alias_visibilities +trait_alias_where_clauses.rel: run upgrade.ql new_trait_alias_where_clauses +traits.rel: run upgrade.ql new_traits try_block_modifier_is_try.rel: delete try_block_modifiers.rel: delete try_block_modifier_type_reprs.rel: delete @@ -27,3 +56,4 @@ unsafe_meta.rel: delete unsafe_meta_is_unsafe.rel: delete unsafe_meta_meta.rel: delete variant_const_args.rel: delete +variant_discriminants.rel: run upgrade.ql new_variant_discriminants diff --git a/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.ql b/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.ql new file mode 100644 index 000000000000..6cad9ea7277e --- /dev/null +++ b/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.ql @@ -0,0 +1,174 @@ +class Element extends @element { + string toString() { none() } +} + +class Location extends @location_default { + string toString() { none() } +} + +private predicate wrapperConstArg(Element id) { + struct_field_default_vals(_, id) or variant_const_args(_, id) +} + +private predicate traitIsAlias(Element id) { + traits(id) and trait_type_bound_lists(id, _) and not trait_assoc_item_lists(id, _) +} + +private predicate sourceMeta(Element id) { + path_meta(id) or + key_value_meta(id) or + token_tree_meta(id) or + unsafe_meta(id) or + cfg_meta(id) or + cfg_attr_meta(id) +} + +private predicate unsafeInnerMeta(Element id) { + unsafe_meta_meta(_, id) +} + +private predicate metaPath(Element id, Element path) { + path_meta_paths(id, path) or key_value_meta_paths(id, path) or token_tree_meta_paths(id, path) +} + +private predicate metaExpr(Element id, Element expr) { + key_value_meta_exprs(id, expr) +} + +private predicate metaTokenTree(Element id, Element tokenTree) { + token_tree_meta_token_trees(id, tokenTree) +} + +private predicate deletedElement(Element id) { + wrapperConstArg(id) or + unsafeInnerMeta(id) or + cfg_atoms(id) or + cfg_composites(id) or + try_block_modifiers(id) +} + +query predicate new_block_expr_is_try(Element id) { + exists(Element modifier | block_expr_try_block_modifiers(id, modifier) and try_block_modifier_is_try(modifier)) +} + +query predicate new_names(Element id) { + names(id) or format_args_arg_names(id) +} + +query predicate new_format_args_arg_names(Element id, Element name) { + format_args_arg_arg_names(id, name) +} + +query predicate new_const_args(Element id) { + const_args(id) and not wrapperConstArg(id) +} + +query predicate new_const_arg_exprs(Element id, Element expr) { + const_arg_exprs(id, expr) and not wrapperConstArg(id) +} + +query predicate new_struct_field_defaults(Element id, Element expr) { + exists(Element constArg | struct_field_default_vals(id, constArg) and const_arg_exprs(constArg, expr)) +} + +query predicate new_variant_discriminants(Element id, Element expr) { + exists(Element constArg | variant_const_args(id, constArg) and const_arg_exprs(constArg, expr)) +} + +query predicate new_meta(Element id) { + sourceMeta(id) and not unsafeInnerMeta(id) +} + +query predicate new_meta_paths(Element id, Element path) { + metaPath(id, path) and not unsafeInnerMeta(id) + or + exists(Element inner | unsafe_meta_meta(id, inner) and metaPath(inner, path)) +} + +query predicate new_meta_exprs(Element id, Element expr) { + metaExpr(id, expr) and not unsafeInnerMeta(id) + or + exists(Element inner | unsafe_meta_meta(id, inner) and metaExpr(inner, expr)) +} + +query predicate new_meta_token_trees(Element id, Element tokenTree) { + metaTokenTree(id, tokenTree) and not unsafeInnerMeta(id) + or + exists(Element inner | unsafe_meta_meta(id, inner) and metaTokenTree(inner, tokenTree)) +} + +query predicate new_meta_is_unsafe(Element id) { + unsafe_meta_is_unsafe(id) +} + +query predicate new_traits(Element id) { + traits(id) and not traitIsAlias(id) +} + +query predicate new_trait_assoc_item_lists(Element id, Element assocItemList) { + trait_assoc_item_lists(id, assocItemList) and not traitIsAlias(id) +} + +query predicate new_trait_attrs(Element id, int index, Element attr) { + trait_attrs(id, index, attr) and not traitIsAlias(id) +} + +query predicate new_trait_generic_param_lists(Element id, Element genericParamList) { + trait_generic_param_lists(id, genericParamList) and not traitIsAlias(id) +} + +query predicate new_trait_is_auto(Element id) { + trait_is_auto(id) and not traitIsAlias(id) +} + +query predicate new_trait_is_unsafe(Element id) { + trait_is_unsafe(id) and not traitIsAlias(id) +} + +query predicate new_trait_names(Element id, Element name) { + trait_names(id, name) and not traitIsAlias(id) +} + +query predicate new_trait_type_bound_lists(Element id, Element typeBoundList) { + trait_type_bound_lists(id, typeBoundList) and not traitIsAlias(id) +} + +query predicate new_trait_visibilities(Element id, Element visibility) { + trait_visibilities(id, visibility) and not traitIsAlias(id) +} + +query predicate new_trait_where_clauses(Element id, Element whereClause) { + trait_where_clauses(id, whereClause) and not traitIsAlias(id) +} + +query predicate new_trait_aliases(Element id) { + traitIsAlias(id) +} + +query predicate new_trait_alias_attrs(Element id, int index, Element attr) { + trait_attrs(id, index, attr) and traitIsAlias(id) +} + +query predicate new_trait_alias_generic_param_lists(Element id, Element genericParamList) { + trait_generic_param_lists(id, genericParamList) and traitIsAlias(id) +} + +query predicate new_trait_alias_names(Element id, Element name) { + trait_names(id, name) and traitIsAlias(id) +} + +query predicate new_trait_alias_type_bound_lists(Element id, Element typeBoundList) { + trait_type_bound_lists(id, typeBoundList) and traitIsAlias(id) +} + +query predicate new_trait_alias_visibilities(Element id, Element visibility) { + trait_visibilities(id, visibility) and traitIsAlias(id) +} + +query predicate new_trait_alias_where_clauses(Element id, Element whereClause) { + trait_where_clauses(id, whereClause) and traitIsAlias(id) +} + +query predicate new_locatable_locations(Element id, Location location) { + locatable_locations(id, location) and not deletedElement(id) +} From f4faf4cd45882eef6cdccf076778c70886fa776a Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Wed, 27 May 2026 10:32:22 +0200 Subject: [PATCH 0020/2098] Rust: Filter downgraded comments on removed nodes Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../upgrade.properties | 1 + .../109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.ql | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.properties b/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.properties index 1bd49f3382b4..9cba151b6f06 100644 --- a/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.properties +++ b/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.properties @@ -11,6 +11,7 @@ cfg_composites.rel: delete cfg_composite_cfg_predicates.rel: delete cfg_meta.rel: delete cfg_meta_cfg_predicates.rel: delete +comments.rel: run upgrade.ql new_comments const_args.rel: run upgrade.ql new_const_args const_arg_exprs.rel: run upgrade.ql new_const_arg_exprs format_args_arg_arg_names.rel: delete diff --git a/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.ql b/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.ql index 6cad9ea7277e..ab0c3052dad2 100644 --- a/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.ql +++ b/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.ql @@ -44,6 +44,7 @@ private predicate deletedElement(Element id) { unsafeInnerMeta(id) or cfg_atoms(id) or cfg_composites(id) or + format_args_arg_names(id) or try_block_modifiers(id) } @@ -67,6 +68,10 @@ query predicate new_const_arg_exprs(Element id, Element expr) { const_arg_exprs(id, expr) and not wrapperConstArg(id) } +query predicate new_comments(Element id, Element parent, string text) { + comments(id, parent, text) and not deletedElement(parent) +} + query predicate new_struct_field_defaults(Element id, Element expr) { exists(Element constArg | struct_field_default_vals(id, constArg) and const_arg_exprs(constArg, expr)) } From b89d9ad1e043f642ba2f729ed4b4c64fe58ab722 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Wed, 27 May 2026 10:34:57 +0200 Subject: [PATCH 0021/2098] Rust: Drop locations for downgraded comments Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../upgrade.ql | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.ql b/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.ql index ab0c3052dad2..d162d3a6bbdf 100644 --- a/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.ql +++ b/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.ql @@ -39,7 +39,7 @@ private predicate metaTokenTree(Element id, Element tokenTree) { token_tree_meta_token_trees(id, tokenTree) } -private predicate deletedElement(Element id) { +private predicate deletedAstNode(Element id) { wrapperConstArg(id) or unsafeInnerMeta(id) or cfg_atoms(id) or @@ -48,6 +48,12 @@ private predicate deletedElement(Element id) { try_block_modifiers(id) } +private predicate deletedElement(Element id) { + deletedAstNode(id) + or + exists(Element parent, string text | comments(id, parent, text) and deletedAstNode(parent)) +} + query predicate new_block_expr_is_try(Element id) { exists(Element modifier | block_expr_try_block_modifiers(id, modifier) and try_block_modifier_is_try(modifier)) } @@ -69,7 +75,7 @@ query predicate new_const_arg_exprs(Element id, Element expr) { } query predicate new_comments(Element id, Element parent, string text) { - comments(id, parent, text) and not deletedElement(parent) + comments(id, parent, text) and not deletedAstNode(parent) } query predicate new_struct_field_defaults(Element id, Element expr) { From 63d8bb7d5b678a6542e7b57c67268e17ea9404f6 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Thu, 28 May 2026 09:00:54 +0200 Subject: [PATCH 0022/2098] Rust: Format downgrade query Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../upgrade.ql | 48 +++++++------------ 1 file changed, 16 insertions(+), 32 deletions(-) diff --git a/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.ql b/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.ql index d162d3a6bbdf..4fff5c8ddba3 100644 --- a/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.ql +++ b/rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/upgrade.ql @@ -23,17 +23,13 @@ private predicate sourceMeta(Element id) { cfg_attr_meta(id) } -private predicate unsafeInnerMeta(Element id) { - unsafe_meta_meta(_, id) -} +private predicate unsafeInnerMeta(Element id) { unsafe_meta_meta(_, id) } private predicate metaPath(Element id, Element path) { path_meta_paths(id, path) or key_value_meta_paths(id, path) or token_tree_meta_paths(id, path) } -private predicate metaExpr(Element id, Element expr) { - key_value_meta_exprs(id, expr) -} +private predicate metaExpr(Element id, Element expr) { key_value_meta_exprs(id, expr) } private predicate metaTokenTree(Element id, Element tokenTree) { token_tree_meta_token_trees(id, tokenTree) @@ -55,20 +51,18 @@ private predicate deletedElement(Element id) { } query predicate new_block_expr_is_try(Element id) { - exists(Element modifier | block_expr_try_block_modifiers(id, modifier) and try_block_modifier_is_try(modifier)) + exists(Element modifier | + block_expr_try_block_modifiers(id, modifier) and try_block_modifier_is_try(modifier) + ) } -query predicate new_names(Element id) { - names(id) or format_args_arg_names(id) -} +query predicate new_names(Element id) { names(id) or format_args_arg_names(id) } query predicate new_format_args_arg_names(Element id, Element name) { format_args_arg_arg_names(id, name) } -query predicate new_const_args(Element id) { - const_args(id) and not wrapperConstArg(id) -} +query predicate new_const_args(Element id) { const_args(id) and not wrapperConstArg(id) } query predicate new_const_arg_exprs(Element id, Element expr) { const_arg_exprs(id, expr) and not wrapperConstArg(id) @@ -79,16 +73,16 @@ query predicate new_comments(Element id, Element parent, string text) { } query predicate new_struct_field_defaults(Element id, Element expr) { - exists(Element constArg | struct_field_default_vals(id, constArg) and const_arg_exprs(constArg, expr)) + exists(Element constArg | + struct_field_default_vals(id, constArg) and const_arg_exprs(constArg, expr) + ) } query predicate new_variant_discriminants(Element id, Element expr) { exists(Element constArg | variant_const_args(id, constArg) and const_arg_exprs(constArg, expr)) } -query predicate new_meta(Element id) { - sourceMeta(id) and not unsafeInnerMeta(id) -} +query predicate new_meta(Element id) { sourceMeta(id) and not unsafeInnerMeta(id) } query predicate new_meta_paths(Element id, Element path) { metaPath(id, path) and not unsafeInnerMeta(id) @@ -108,13 +102,9 @@ query predicate new_meta_token_trees(Element id, Element tokenTree) { exists(Element inner | unsafe_meta_meta(id, inner) and metaTokenTree(inner, tokenTree)) } -query predicate new_meta_is_unsafe(Element id) { - unsafe_meta_is_unsafe(id) -} +query predicate new_meta_is_unsafe(Element id) { unsafe_meta_is_unsafe(id) } -query predicate new_traits(Element id) { - traits(id) and not traitIsAlias(id) -} +query predicate new_traits(Element id) { traits(id) and not traitIsAlias(id) } query predicate new_trait_assoc_item_lists(Element id, Element assocItemList) { trait_assoc_item_lists(id, assocItemList) and not traitIsAlias(id) @@ -128,13 +118,9 @@ query predicate new_trait_generic_param_lists(Element id, Element genericParamLi trait_generic_param_lists(id, genericParamList) and not traitIsAlias(id) } -query predicate new_trait_is_auto(Element id) { - trait_is_auto(id) and not traitIsAlias(id) -} +query predicate new_trait_is_auto(Element id) { trait_is_auto(id) and not traitIsAlias(id) } -query predicate new_trait_is_unsafe(Element id) { - trait_is_unsafe(id) and not traitIsAlias(id) -} +query predicate new_trait_is_unsafe(Element id) { trait_is_unsafe(id) and not traitIsAlias(id) } query predicate new_trait_names(Element id, Element name) { trait_names(id, name) and not traitIsAlias(id) @@ -152,9 +138,7 @@ query predicate new_trait_where_clauses(Element id, Element whereClause) { trait_where_clauses(id, whereClause) and not traitIsAlias(id) } -query predicate new_trait_aliases(Element id) { - traitIsAlias(id) -} +query predicate new_trait_aliases(Element id) { traitIsAlias(id) } query predicate new_trait_alias_attrs(Element id, int index, Element attr) { trait_attrs(id, index, attr) and traitIsAlias(id) From 612b9237da553762c57c0aa902ef20d6bb25ffdc Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 2 Jun 2026 16:36:01 +0100 Subject: [PATCH 0023/2098] Rust: Undo hiding some warnings in the extraction consistency check query. --- rust/ql/consistency-queries/ExtractionConsistency.ql | 4 +--- .../CONSISTENCY/ExtractionConsistency.expected | 2 ++ .../diagnostics/CONSISTENCY/ExtractionConsistency.expected | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/rust/ql/consistency-queries/ExtractionConsistency.ql b/rust/ql/consistency-queries/ExtractionConsistency.ql index e07ed64df075..26ce4c31ecc4 100644 --- a/rust/ql/consistency-queries/ExtractionConsistency.ql +++ b/rust/ql/consistency-queries/ExtractionConsistency.ql @@ -12,7 +12,5 @@ query predicate extractionError(ExtractionError ee) { } query predicate extractionWarning(ExtractionWarning ew) { - (not exists(ew.getLocation()) or ew.getLocation().fromSource()) and - // macro expansion failures are expected for macros like compile_error! and panic! - not ew.getMessage().matches("macro expansion failed for%") + (not exists(ew.getLocation()) or ew.getLocation().fromSource()) } diff --git a/rust/ql/test/extractor-tests/macro-expansion/CONSISTENCY/ExtractionConsistency.expected b/rust/ql/test/extractor-tests/macro-expansion/CONSISTENCY/ExtractionConsistency.expected index e69de29bb2d1..5c472b07a14f 100644 --- a/rust/ql/test/extractor-tests/macro-expansion/CONSISTENCY/ExtractionConsistency.expected +++ b/rust/ql/test/extractor-tests/macro-expansion/CONSISTENCY/ExtractionConsistency.expected @@ -0,0 +1,2 @@ +extractionWarning +| macro_expansion.rs:56:9:56:31 | macro expansion failed for 'concat' | diff --git a/rust/ql/test/query-tests/diagnostics/CONSISTENCY/ExtractionConsistency.expected b/rust/ql/test/query-tests/diagnostics/CONSISTENCY/ExtractionConsistency.expected index 5b4796faa8c5..82c29ac7f2b0 100644 --- a/rust/ql/test/query-tests/diagnostics/CONSISTENCY/ExtractionConsistency.expected +++ b/rust/ql/test/query-tests/diagnostics/CONSISTENCY/ExtractionConsistency.expected @@ -5,3 +5,4 @@ extractionWarning | does_not_compile.rs:2:21:2:20 | expected SEMICOLON | | does_not_compile.rs:2:26:2:25 | expected SEMICOLON | | error.rs:2:5:2:17 | An error! | +| my_macro.rs:17:9:17:27 | macro expansion failed for 'myUndefinedMacro' | From 9024cbaecb2e6501df1adcafdb382f72542b5743 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 2 Jun 2026 17:04:45 +0100 Subject: [PATCH 0024/2098] Rust: Remove redundant brackets. --- rust/ql/consistency-queries/ExtractionConsistency.ql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust/ql/consistency-queries/ExtractionConsistency.ql b/rust/ql/consistency-queries/ExtractionConsistency.ql index 26ce4c31ecc4..c6e9bcdc2cb7 100644 --- a/rust/ql/consistency-queries/ExtractionConsistency.ql +++ b/rust/ql/consistency-queries/ExtractionConsistency.ql @@ -12,5 +12,5 @@ query predicate extractionError(ExtractionError ee) { } query predicate extractionWarning(ExtractionWarning ew) { - (not exists(ew.getLocation()) or ew.getLocation().fromSource()) + not exists(ew.getLocation()) or ew.getLocation().fromSource() } From db9d781f369fb3edcd11738388b224a0e415f5b1 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 2 Jun 2026 18:07:43 +0100 Subject: [PATCH 0025/2098] Rust: More impacted test expectations. --- .../sources/database/CONSISTENCY/ExtractionConsistency.expected | 2 ++ .../sources/file/CONSISTENCY/ExtractionConsistency.expected | 2 ++ .../sources/stdin/CONSISTENCY/ExtractionConsistency.expected | 2 ++ .../CWE-079/warp/CONSISTENCY/ExtractionConsistency.expected | 2 ++ 4 files changed, 8 insertions(+) create mode 100644 rust/ql/test/library-tests/dataflow/sources/database/CONSISTENCY/ExtractionConsistency.expected create mode 100644 rust/ql/test/library-tests/dataflow/sources/file/CONSISTENCY/ExtractionConsistency.expected create mode 100644 rust/ql/test/library-tests/dataflow/sources/stdin/CONSISTENCY/ExtractionConsistency.expected create mode 100644 rust/ql/test/query-tests/security/CWE-079/warp/CONSISTENCY/ExtractionConsistency.expected diff --git a/rust/ql/test/library-tests/dataflow/sources/database/CONSISTENCY/ExtractionConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/database/CONSISTENCY/ExtractionConsistency.expected new file mode 100644 index 000000000000..61ef42d077a4 --- /dev/null +++ b/rust/ql/test/library-tests/dataflow/sources/database/CONSISTENCY/ExtractionConsistency.expected @@ -0,0 +1,2 @@ +extractionWarning +| test.rs:221:7:221:10 | macro expansion failed for 'panic' | diff --git a/rust/ql/test/library-tests/dataflow/sources/file/CONSISTENCY/ExtractionConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/file/CONSISTENCY/ExtractionConsistency.expected new file mode 100644 index 000000000000..9f7a9af6e891 --- /dev/null +++ b/rust/ql/test/library-tests/dataflow/sources/file/CONSISTENCY/ExtractionConsistency.expected @@ -0,0 +1,2 @@ +extractionWarning +| test.rs:326:7:326:10 | macro expansion failed for 'panic' | diff --git a/rust/ql/test/library-tests/dataflow/sources/stdin/CONSISTENCY/ExtractionConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/stdin/CONSISTENCY/ExtractionConsistency.expected new file mode 100644 index 000000000000..1669b7895193 --- /dev/null +++ b/rust/ql/test/library-tests/dataflow/sources/stdin/CONSISTENCY/ExtractionConsistency.expected @@ -0,0 +1,2 @@ +extractionWarning +| test.rs:218:7:218:10 | macro expansion failed for 'panic' | diff --git a/rust/ql/test/query-tests/security/CWE-079/warp/CONSISTENCY/ExtractionConsistency.expected b/rust/ql/test/query-tests/security/CWE-079/warp/CONSISTENCY/ExtractionConsistency.expected new file mode 100644 index 000000000000..133438cef21c --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-079/warp/CONSISTENCY/ExtractionConsistency.expected @@ -0,0 +1,2 @@ +extractionWarning +| main.rs:1:1:1:1 | macro expansion failed for 'panic' | From 00d297693c94d82b785233ddf532386d0efc5a82 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 3 Jun 2026 11:03:32 +0100 Subject: [PATCH 0026/2098] Rust: More impacted test expectations (2). --- .../ExtractionConsistency.expected | 2 ++ .../ExtractionConsistency.expected | 2 ++ .../ExtractionConsistency.expected | 2 ++ .../ExtractionConsistency.expected | 22 +++++++++++++++++++ 4 files changed, 28 insertions(+) create mode 100644 rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/ExtractionConsistency.expected create mode 100644 rust/ql/test/library-tests/dataflow/sources/web_frameworks/CONSISTENCY/ExtractionConsistency.expected create mode 100644 rust/ql/test/query-tests/security/CWE-079/axum/CONSISTENCY/ExtractionConsistency.expected create mode 100644 rust/ql/test/query-tests/security/CWE-696/CONSISTENCY/ExtractionConsistency.expected diff --git a/rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/ExtractionConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/ExtractionConsistency.expected new file mode 100644 index 000000000000..bc5b5c896a5a --- /dev/null +++ b/rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/ExtractionConsistency.expected @@ -0,0 +1,2 @@ +extractionWarning +| test.rs:563:7:563:10 | macro expansion failed for 'panic' | diff --git a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/CONSISTENCY/ExtractionConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/CONSISTENCY/ExtractionConsistency.expected new file mode 100644 index 000000000000..eb9d8e47d74c --- /dev/null +++ b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/CONSISTENCY/ExtractionConsistency.expected @@ -0,0 +1,2 @@ +extractionWarning +| test.rs:267:62:267:62 | macro expansion failed for 'panic' | diff --git a/rust/ql/test/query-tests/security/CWE-079/axum/CONSISTENCY/ExtractionConsistency.expected b/rust/ql/test/query-tests/security/CWE-079/axum/CONSISTENCY/ExtractionConsistency.expected new file mode 100644 index 000000000000..39c3a932a0ba --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-079/axum/CONSISTENCY/ExtractionConsistency.expected @@ -0,0 +1,2 @@ +extractionWarning +| main.rs:19:46:19:46 | macro expansion failed for 'panic' | diff --git a/rust/ql/test/query-tests/security/CWE-696/CONSISTENCY/ExtractionConsistency.expected b/rust/ql/test/query-tests/security/CWE-696/CONSISTENCY/ExtractionConsistency.expected new file mode 100644 index 000000000000..e63e6374ba5b --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-696/CONSISTENCY/ExtractionConsistency.expected @@ -0,0 +1,22 @@ +extractionWarning +| test.rs:16:10:19:5 | macro expansion failed for 'compile_error' | +| test.rs:23:17:24:9 | macro expansion failed for 'compile_error' | +| test.rs:28:3:28:12 | macro expansion failed for 'compile_error' | +| test.rs:33:3:33:12 | macro expansion failed for 'compile_error' | +| test.rs:39:3:39:12 | macro expansion failed for 'compile_error' | +| test.rs:50:3:50:6 | macro expansion failed for 'compile_error' | +| test.rs:55:3:55:6 | macro expansion failed for 'compile_error' | +| test.rs:60:3:60:6 | macro expansion failed for 'compile_error' | +| test.rs:65:3:65:6 | macro expansion failed for 'compile_error' | +| test.rs:73:3:73:6 | macro expansion failed for 'compile_error' | +| test.rs:78:3:78:6 | macro expansion failed for 'compile_error' | +| test.rs:87:3:87:6 | macro expansion failed for 'compile_error' | +| test.rs:94:3:94:6 | macro expansion failed for 'compile_error' | +| test.rs:99:3:99:12 | macro expansion failed for 'compile_error' | +| test.rs:104:3:104:12 | macro expansion failed for 'compile_error' | +| test.rs:112:3:112:12 | macro expansion failed for 'compile_error' | +| test.rs:128:3:128:6 | macro expansion failed for 'compile_error' | +| test.rs:139:3:139:6 | macro expansion failed for 'compile_error' | +| test.rs:144:3:144:6 | macro expansion failed for 'compile_error' | +| test.rs:150:3:150:6 | macro expansion failed for 'compile_error' | +| test.rs:168:3:168:6 | macro expansion failed for 'compile_error' | From 85b2fcedf4eaa131480adb94c61e9f37a64370d9 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 2 Jun 2026 17:15:18 +0100 Subject: [PATCH 0027/2098] Rust: Undo another change to the consistency check queries. --- rust/ql/lib/codeql/rust/internal/PathResolutionConsistency.qll | 3 --- .../sources/net/CONSISTENCY/PathResolutionConsistency.expected | 3 +++ .../CWE-918/CONSISTENCY/PathResolutionConsistency.expected | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/rust/ql/lib/codeql/rust/internal/PathResolutionConsistency.qll b/rust/ql/lib/codeql/rust/internal/PathResolutionConsistency.qll index 37de5d358151..e3416b1480b0 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolutionConsistency.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolutionConsistency.qll @@ -8,9 +8,6 @@ private import PathResolution /** Holds if `p` may resolve to multiple items including `i`. */ query predicate multiplePathResolutions(Path p, ItemNode i) { p.fromSource() and - not p.(AstNode).isInMacroExpansion() and - // exclude paths inside attributes (e.g. `#[tokio::main]`) - not p.getParentNode*() instanceof Attr and i = resolvePath(p) and // `panic` is defined in both `std` and `core`; both are included in the prelude not p.getText() = "panic" and diff --git a/rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/PathResolutionConsistency.expected index 4388f45f296e..5be3b1490017 100644 --- a/rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/PathResolutionConsistency.expected @@ -1,3 +1,6 @@ multipleResolvedTargets | test.rs:23:26:23:66 | ... .text() | | test.rs:26:26:26:67 | ... .bytes() | +multiplePathResolutions +| test.rs:517:3:517:13 | ...::main | +| test.rs:563:5:563:6 | ...::runtime | diff --git a/rust/ql/test/query-tests/security/CWE-918/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-918/CONSISTENCY/PathResolutionConsistency.expected index ac7fc3cad3f0..eb6f8590fbdd 100644 --- a/rust/ql/test/query-tests/security/CWE-918/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/query-tests/security/CWE-918/CONSISTENCY/PathResolutionConsistency.expected @@ -1,2 +1,4 @@ multiplePathResolutions +| request_forgery_tests.rs:60:7:60:17 | ...::main | +| request_forgery_tests.rs:64:9:64:11 | ...::runtime | | request_forgery_tests.rs:79:5:79:18 | ...::runtime | From 436be5c20bdd0790c170c70815e8bcd431f6f6c9 Mon Sep 17 00:00:00 2001 From: Kristen Newbury Date: Fri, 10 Jul 2026 19:36:53 -0400 Subject: [PATCH 0028/2098] Add implementation for technique to customize environmentCheck in actions queries --- actions/ql/lib/actions.qll | 2 ++ actions/ql/lib/codeql/actions/config/Config.qll | 16 ++++++++++++++++ .../codeql/actions/config/ConfigExtensions.qll | 12 ++++++++++++ .../codeql/actions/security/ControlChecks.qll | 14 +++++++++++++- actions/ql/lib/ext/config/customize_checks.yml | 9 +++++++++ .../ql/lib/ext/config/deployment_environment.yml | 6 ++++++ 6 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 actions/ql/lib/ext/config/customize_checks.yml create mode 100644 actions/ql/lib/ext/config/deployment_environment.yml diff --git a/actions/ql/lib/actions.qll b/actions/ql/lib/actions.qll index 2c1d1cee9259..a1ee60b1694d 100644 --- a/actions/ql/lib/actions.qll +++ b/actions/ql/lib/actions.qll @@ -1 +1,3 @@ import codeql.actions.Ast + +abstract class CustomEnvEnable extends Environment { } diff --git a/actions/ql/lib/codeql/actions/config/Config.qll b/actions/ql/lib/codeql/actions/config/Config.qll index e6359c142582..72f1b7614594 100644 --- a/actions/ql/lib/codeql/actions/config/Config.qll +++ b/actions/ql/lib/codeql/actions/config/Config.qll @@ -164,3 +164,19 @@ predicate untrustedGhCommandDataModel(string cmd_regex, string flag) { predicate actionsPermissionsDataModel(string action, string permission) { Extensions::actionsPermissionsDataModel(action, permission) } + +/** + * MaD models for deployment environments + * Fields: + * - name: deployment environment name, e.g. `Public CI` + */ +predicate enabledDeploymentEnvironmentDataModel(string name) { + Extensions::enabledDeploymentEnvironmentDataModel(name) +} + +/** + * `EnvironmentCheck` implementation model. + */ +predicate selectDeploymentEnvironmentDataModel(string selected) { + Extensions::selectDeploymentEnvironmentDataModel(selected) +} diff --git a/actions/ql/lib/codeql/actions/config/ConfigExtensions.qll b/actions/ql/lib/codeql/actions/config/ConfigExtensions.qll index 87a919359404..e0ca6a4da340 100644 --- a/actions/ql/lib/codeql/actions/config/ConfigExtensions.qll +++ b/actions/ql/lib/codeql/actions/config/ConfigExtensions.qll @@ -88,3 +88,15 @@ extensible predicate untrustedGhCommandDataModel(string cmd_regex, string flag); * - see https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/controlling-permissions-for-github_token for documentation of token permissions. */ extensible predicate actionsPermissionsDataModel(string action, string permission); + +/** + * Holds for deployment environments that exist for a given repository. + * Requires this to be externally supplied but once done can be used to + * toggle precision of whether that suffices or not as a control check. + */ +extensible predicate enabledDeploymentEnvironmentDataModel(string name); + +/** + * Selects which deployment environments model to use to implement `EnvironmentCheck`. + */ +extensible predicate selectDeploymentEnvironmentDataModel(string mechanism); diff --git a/actions/ql/lib/codeql/actions/security/ControlChecks.qll b/actions/ql/lib/codeql/actions/security/ControlChecks.qll index 4d3dbc38c657..e95b2271f811 100644 --- a/actions/ql/lib/codeql/actions/security/ControlChecks.qll +++ b/actions/ql/lib/codeql/actions/security/ControlChecks.qll @@ -277,10 +277,22 @@ abstract class LabelCheck extends ControlCheck { } class EnvironmentCheck extends ControlCheck instanceof Environment { + EnvironmentCheck() { + exists(string selected | + selectDeploymentEnvironmentDataModel(selected) and + if selected = "EnvironmentCheckMaD" + then enabledDeploymentEnvironmentDataModel(this.(Environment).getName()) + else + if selected = "EnvironmentCheckCustomQL" + then this instanceof CustomEnvEnable + else this instanceof Environment + ) + } + // Environment checks are not effective against any mutable attacks // they do actually protect against untrusted code execution (sha) override predicate protectsCategoryAndEvent(string category, string event) { - event = actor_is_attacker_event() and category = any_category() + event = actor_is_attacker_event() and category = toctou_category() or event = actor_not_attacker_event() and category = non_toctou_category() } diff --git a/actions/ql/lib/ext/config/customize_checks.yml b/actions/ql/lib/ext/config/customize_checks.yml new file mode 100644 index 000000000000..c630d8be80c7 --- /dev/null +++ b/actions/ql/lib/ext/config/customize_checks.yml @@ -0,0 +1,9 @@ +extensions: + - addsTo: + pack: codeql/actions-all + extensible: selectDeploymentEnvironmentDataModel + data: + # The possible values this can take are: + # EnvironmentCheckCustomQL - for a custom QL implementation for the sufficient EnvironmentCheck. + # EnvironmentCheckMaD - for a custom MaD list of deployment environments that are relevant to a database. + - [""] \ No newline at end of file diff --git a/actions/ql/lib/ext/config/deployment_environment.yml b/actions/ql/lib/ext/config/deployment_environment.yml new file mode 100644 index 000000000000..6517614139e0 --- /dev/null +++ b/actions/ql/lib/ext/config/deployment_environment.yml @@ -0,0 +1,6 @@ +extensions: + - addsTo: + pack: codeql/actions-all + extensible: enabledDeploymentEnvironmentDataModel + data: + - [""] \ No newline at end of file From cdffef8684c2f2608eee4f691b536a7882310468 Mon Sep 17 00:00:00 2001 From: Kristen Newbury Date: Fri, 10 Jul 2026 19:58:23 -0400 Subject: [PATCH 0029/2098] Fix accidental change in ControlChecks.qll --- actions/ql/lib/codeql/actions/security/ControlChecks.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actions/ql/lib/codeql/actions/security/ControlChecks.qll b/actions/ql/lib/codeql/actions/security/ControlChecks.qll index e95b2271f811..4a68d50549dc 100644 --- a/actions/ql/lib/codeql/actions/security/ControlChecks.qll +++ b/actions/ql/lib/codeql/actions/security/ControlChecks.qll @@ -292,7 +292,7 @@ class EnvironmentCheck extends ControlCheck instanceof Environment { // Environment checks are not effective against any mutable attacks // they do actually protect against untrusted code execution (sha) override predicate protectsCategoryAndEvent(string category, string event) { - event = actor_is_attacker_event() and category = toctou_category() + event = actor_is_attacker_event() and category = any_category() or event = actor_not_attacker_event() and category = non_toctou_category() } From fbde76e0775911b1dce07202a04b1a8e9ee5fa76 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Tue, 14 Jul 2026 13:26:40 +0200 Subject: [PATCH 0030/2098] C#: Add some GOOD dead store of local test examples. --- .../Dead Code/DeadStoreOfLocal/DeadStoreOfLocal.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/csharp/ql/test/query-tests/Dead Code/DeadStoreOfLocal/DeadStoreOfLocal.cs b/csharp/ql/test/query-tests/Dead Code/DeadStoreOfLocal/DeadStoreOfLocal.cs index 03a6644fe800..23ba1a655d05 100644 --- a/csharp/ql/test/query-tests/Dead Code/DeadStoreOfLocal/DeadStoreOfLocal.cs +++ b/csharp/ql/test/query-tests/Dead Code/DeadStoreOfLocal/DeadStoreOfLocal.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; public class DeadStoreOfLocal { @@ -484,3 +485,16 @@ void Pi() Console.WriteLine($"Pi, {pi,align:F3}"); } } + +class LinqFields +{ + private readonly IEnumerable QueryBackedField = + from x1 in new[] { 1, 2, 3 } + where x1 > 1 + select x1; // GOOD: The query range variable is used by the LINQ expression. + + public static readonly IEnumerable StaticQueryBackedField = + from x2 in new[] { 1, 2, 3 } + where x2 > 1 + select x2; // GOOD: The query range variable is used by the LINQ expression. +} From 6a40b86ff0bfd1bd675bf59096c9d1af8d42d10b Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Tue, 14 Jul 2026 13:27:55 +0200 Subject: [PATCH 0031/2098] C#: Update test expected output. --- .../DeadStoreOfLocal.expected | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/csharp/ql/test/query-tests/Dead Code/DeadStoreOfLocal/DeadStoreOfLocal.expected b/csharp/ql/test/query-tests/Dead Code/DeadStoreOfLocal/DeadStoreOfLocal.expected index 2073fce06a77..4bbcf8565293 100644 --- a/csharp/ql/test/query-tests/Dead Code/DeadStoreOfLocal/DeadStoreOfLocal.expected +++ b/csharp/ql/test/query-tests/Dead Code/DeadStoreOfLocal/DeadStoreOfLocal.expected @@ -1,21 +1,25 @@ -| DeadStoreOfLocal.cs:12:13:12:20 | Int32 x = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:12:13:12:13 | x | x | -| DeadStoreOfLocal.cs:19:21:19:25 | ... = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:18:13:18:13 | x | x | -| DeadStoreOfLocal.cs:44:13:44:20 | Int32 x = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:44:13:44:13 | x | x | -| DeadStoreOfLocal.cs:50:9:50:14 | ... += ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:49:13:49:13 | x | x | -| DeadStoreOfLocal.cs:56:9:56:11 | ...++ | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:55:13:55:13 | x | x | -| DeadStoreOfLocal.cs:82:22:82:24 | String val | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:82:22:82:24 | val | val | -| DeadStoreOfLocal.cs:101:13:101:37 | ... = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:94:40:94:44 | extra | extra | -| DeadStoreOfLocal.cs:104:13:104:37 | ... = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:94:16:94:20 | info1 | info1 | -| DeadStoreOfLocal.cs:142:26:142:27 | Exception ex | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:142:26:142:27 | ex | ex | -| DeadStoreOfLocal.cs:246:17:246:24 | Int32 y = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:246:17:246:17 | y | y | -| DeadStoreOfLocal.cs:261:17:261:21 | Int32 x = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:261:17:261:17 | x | x | -| DeadStoreOfLocal.cs:300:23:300:28 | Object v1 | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:300:27:300:28 | v1 | v1 | -| DeadStoreOfLocal.cs:314:18:314:23 | Object v2 | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:314:22:314:23 | v2 | v2 | -| DeadStoreOfLocal.cs:331:9:331:32 | ... = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:327:23:327:23 | b | b | -| DeadStoreOfLocal.cs:372:13:372:20 | String s = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:372:13:372:13 | s | s | -| DeadStoreOfLocal.cs:472:20:472:76 | FileStream y = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:472:20:472:20 | y | y | +#select +| DeadStoreOfLocal.cs:13:13:13:20 | Int32 x = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:13:13:13:13 | x | x | +| DeadStoreOfLocal.cs:20:21:20:25 | ... = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:19:13:19:13 | x | x | +| DeadStoreOfLocal.cs:45:13:45:20 | Int32 x = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:45:13:45:13 | x | x | +| DeadStoreOfLocal.cs:51:9:51:14 | ... += ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:50:13:50:13 | x | x | +| DeadStoreOfLocal.cs:57:9:57:11 | ...++ | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:56:13:56:13 | x | x | +| DeadStoreOfLocal.cs:83:22:83:24 | String val | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:83:22:83:24 | val | val | +| DeadStoreOfLocal.cs:102:13:102:37 | ... = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:95:40:95:44 | extra | extra | +| DeadStoreOfLocal.cs:105:13:105:37 | ... = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:95:16:95:20 | info1 | info1 | +| DeadStoreOfLocal.cs:143:26:143:27 | Exception ex | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:143:26:143:27 | ex | ex | +| DeadStoreOfLocal.cs:247:17:247:24 | Int32 y = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:247:17:247:17 | y | y | +| DeadStoreOfLocal.cs:262:17:262:21 | Int32 x = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:262:17:262:17 | x | x | +| DeadStoreOfLocal.cs:301:23:301:28 | Object v1 | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:301:27:301:28 | v1 | v1 | +| DeadStoreOfLocal.cs:315:18:315:23 | Object v2 | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:315:22:315:23 | v2 | v2 | +| DeadStoreOfLocal.cs:332:9:332:32 | ... = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:328:23:328:23 | b | b | +| DeadStoreOfLocal.cs:373:13:373:20 | String s = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:373:13:373:13 | s | s | +| DeadStoreOfLocal.cs:473:20:473:76 | FileStream y = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:473:20:473:20 | y | y | +| DeadStoreOfLocal.cs:497:9:497:36 | Int32 x2 = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:497:14:497:15 | x2 | x2 | | DeadStoreOfLocalBad.cs:7:13:7:48 | Boolean success = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocalBad.cs:7:13:7:19 | success | success | | DeadStoreOfLocalBad.cs:23:32:23:32 | FormatException e | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocalBad.cs:23:32:23:32 | e | e | | DeadStoreOfLocalBad.cs:32:22:32:22 | String s | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocalBad.cs:32:22:32:22 | s | s | | DeadStoreOfLocalBad.cs:39:18:39:22 | Int32 i | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocalBad.cs:39:22:39:22 | i | i | | DeadStoreOfLocalBad.cs:49:18:49:25 | String s | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocalBad.cs:49:25:49:25 | s | s | +testFailures +| DeadStoreOfLocal.cs:497:9:497:36 | This assignment to $@ is useless, since its value is never read. | Unexpected result: Alert | From 6d0e0793ed0ebe576d47a19afdb5fe217c2c282a Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Tue, 14 Jul 2026 13:33:12 +0200 Subject: [PATCH 0032/2098] C#: Consider the static constructor the enclosing callable for static member initialization. Note that a class can only have ONE static constructor (so it will be unique). --- csharp/ql/lib/semmle/code/csharp/ExprOrStmtParent.qll | 3 +++ 1 file changed, 3 insertions(+) diff --git a/csharp/ql/lib/semmle/code/csharp/ExprOrStmtParent.qll b/csharp/ql/lib/semmle/code/csharp/ExprOrStmtParent.qll index 2cf09707459d..493337a8edd4 100644 --- a/csharp/ql/lib/semmle/code/csharp/ExprOrStmtParent.qll +++ b/csharp/ql/lib/semmle/code/csharp/ExprOrStmtParent.qll @@ -6,6 +6,7 @@ import csharp private import internal.Location +private import controlflow.internal.ControlFlowGraph /** * INTERNAL: Do not use. @@ -145,6 +146,8 @@ private module Cached { parent*(cfe, c.(Constructor).getObjectInitializerCall()) or parent*(cfe, any(AssignExpr init | c.(ObjectInitMethod).initializes(init))) + or + parent*(cfe, any(Expr init | Initializers::staticMemberInitializer(c, init))) } /** Holds if the enclosing statement of expression `e` is `s`. */ From dbf8c6a3ae45601cbc66c430a2c09942cafb2500 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Tue, 14 Jul 2026 13:34:46 +0200 Subject: [PATCH 0033/2098] C#: Update test expected output. --- .../Dead Code/DeadStoreOfLocal/DeadStoreOfLocal.expected | 4 ---- 1 file changed, 4 deletions(-) diff --git a/csharp/ql/test/query-tests/Dead Code/DeadStoreOfLocal/DeadStoreOfLocal.expected b/csharp/ql/test/query-tests/Dead Code/DeadStoreOfLocal/DeadStoreOfLocal.expected index 4bbcf8565293..27ddb157eca3 100644 --- a/csharp/ql/test/query-tests/Dead Code/DeadStoreOfLocal/DeadStoreOfLocal.expected +++ b/csharp/ql/test/query-tests/Dead Code/DeadStoreOfLocal/DeadStoreOfLocal.expected @@ -1,4 +1,3 @@ -#select | DeadStoreOfLocal.cs:13:13:13:20 | Int32 x = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:13:13:13:13 | x | x | | DeadStoreOfLocal.cs:20:21:20:25 | ... = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:19:13:19:13 | x | x | | DeadStoreOfLocal.cs:45:13:45:20 | Int32 x = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:45:13:45:13 | x | x | @@ -15,11 +14,8 @@ | DeadStoreOfLocal.cs:332:9:332:32 | ... = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:328:23:328:23 | b | b | | DeadStoreOfLocal.cs:373:13:373:20 | String s = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:373:13:373:13 | s | s | | DeadStoreOfLocal.cs:473:20:473:76 | FileStream y = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:473:20:473:20 | y | y | -| DeadStoreOfLocal.cs:497:9:497:36 | Int32 x2 = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:497:14:497:15 | x2 | x2 | | DeadStoreOfLocalBad.cs:7:13:7:48 | Boolean success = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocalBad.cs:7:13:7:19 | success | success | | DeadStoreOfLocalBad.cs:23:32:23:32 | FormatException e | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocalBad.cs:23:32:23:32 | e | e | | DeadStoreOfLocalBad.cs:32:22:32:22 | String s | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocalBad.cs:32:22:32:22 | s | s | | DeadStoreOfLocalBad.cs:39:18:39:22 | Int32 i | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocalBad.cs:39:22:39:22 | i | i | | DeadStoreOfLocalBad.cs:49:18:49:25 | String s | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocalBad.cs:49:25:49:25 | s | s | -testFailures -| DeadStoreOfLocal.cs:497:9:497:36 | This assignment to $@ is useless, since its value is never read. | Unexpected result: Alert | From 485aee7617ac0d65333d0d4eb2b5ec63d01290b4 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Wed, 15 Jul 2026 15:50:14 +0200 Subject: [PATCH 0034/2098] C#: Add change-note. --- .../2026-07-15-static-member-enclosing-callable.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 csharp/ql/src/change-notes/2026-07-15-static-member-enclosing-callable.md diff --git a/csharp/ql/src/change-notes/2026-07-15-static-member-enclosing-callable.md b/csharp/ql/src/change-notes/2026-07-15-static-member-enclosing-callable.md new file mode 100644 index 000000000000..267f212a991e --- /dev/null +++ b/csharp/ql/src/change-notes/2026-07-15-static-member-enclosing-callable.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Static constructors are now used as the enclosing callable for static member initializer expressions. This improves the precision of a range of queries, including `cs/useless-assignment-to-local` and `cs/dereferenced-value-may-be-null`. From a549f49b840a9956812e0458774140343a64ffe5 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 16 Jul 2026 09:07:57 +0200 Subject: [PATCH 0035/2098] C#: Add nameof virtual method in constructor test case. --- .../VirtualCallInConstructorOrDestructor.cs | 4 ++++ ...rtualCallInConstructorOrDestructor.expected | 18 +++++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/csharp/ql/test/query-tests/Bad Practices/VirtualCallInConstructorOrDestructor/VirtualCallInConstructorOrDestructor.cs b/csharp/ql/test/query-tests/Bad Practices/VirtualCallInConstructorOrDestructor/VirtualCallInConstructorOrDestructor.cs index 6db005e00cef..f654c1c0a659 100644 --- a/csharp/ql/test/query-tests/Bad Practices/VirtualCallInConstructorOrDestructor/VirtualCallInConstructorOrDestructor.cs +++ b/csharp/ql/test/query-tests/Bad Practices/VirtualCallInConstructorOrDestructor/VirtualCallInConstructorOrDestructor.cs @@ -15,6 +15,7 @@ public void f_nonvirtual() { } public void f_interface() { } public virtual int p_virtual { get { return 0; } } + public virtual string p_virtual_string { get { return ""; } } public virtual int p_sealed { get { return 0; } } public int p_nonvirtual { get { return 0; } } @@ -55,11 +56,14 @@ class C : B a = f_sealed; // GOOD a = f_nonvirtual; // GOOD a = f_interface; // GOOD + var f_name = nameof(f_virtual); // GOOD // Property access int i = p_virtual; // $ Alert // BAD i = p_sealed; // GOOD i = p_nonvirtual; // GOOD + var p_name = nameof(p_virtual_string); // GOOD + var p_length_name = nameof(p_virtual_string.Length); // GOOD // Indexer access i = this[0]; // $ Alert // BAD diff --git a/csharp/ql/test/query-tests/Bad Practices/VirtualCallInConstructorOrDestructor/VirtualCallInConstructorOrDestructor.expected b/csharp/ql/test/query-tests/Bad Practices/VirtualCallInConstructorOrDestructor/VirtualCallInConstructorOrDestructor.expected index 8a97e61bf8cf..4a01b5a57870 100644 --- a/csharp/ql/test/query-tests/Bad Practices/VirtualCallInConstructorOrDestructor/VirtualCallInConstructorOrDestructor.expected +++ b/csharp/ql/test/query-tests/Bad Practices/VirtualCallInConstructorOrDestructor/VirtualCallInConstructorOrDestructor.expected @@ -1,5 +1,13 @@ -| VirtualCallInConstructorOrDestructor.cs:45:13:45:23 | call to method f_virtual | Avoid virtual calls in a constructor or destructor. | -| VirtualCallInConstructorOrDestructor.cs:54:17:54:25 | access to method f_virtual | Avoid virtual calls in a constructor or destructor. | -| VirtualCallInConstructorOrDestructor.cs:60:21:60:29 | access to property p_virtual | Avoid virtual calls in a constructor or destructor. | -| VirtualCallInConstructorOrDestructor.cs:65:17:65:23 | access to indexer | Avoid virtual calls in a constructor or destructor. | -| VirtualCallInConstructorOrDestructor.cs:70:13:70:21 | access to event e_virtual | Avoid virtual calls in a constructor or destructor. | +#select +| VirtualCallInConstructorOrDestructor.cs:46:13:46:23 | call to method f_virtual | Avoid virtual calls in a constructor or destructor. | +| VirtualCallInConstructorOrDestructor.cs:55:17:55:25 | access to method f_virtual | Avoid virtual calls in a constructor or destructor. | +| VirtualCallInConstructorOrDestructor.cs:59:33:59:41 | access to method f_virtual | Avoid virtual calls in a constructor or destructor. | +| VirtualCallInConstructorOrDestructor.cs:62:21:62:29 | access to property p_virtual | Avoid virtual calls in a constructor or destructor. | +| VirtualCallInConstructorOrDestructor.cs:65:33:65:48 | access to property p_virtual_string | Avoid virtual calls in a constructor or destructor. | +| VirtualCallInConstructorOrDestructor.cs:66:40:66:55 | access to property p_virtual_string | Avoid virtual calls in a constructor or destructor. | +| VirtualCallInConstructorOrDestructor.cs:69:17:69:23 | access to indexer | Avoid virtual calls in a constructor or destructor. | +| VirtualCallInConstructorOrDestructor.cs:74:13:74:21 | access to event e_virtual | Avoid virtual calls in a constructor or destructor. | +testFailures +| VirtualCallInConstructorOrDestructor.cs:59:33:59:41 | Avoid virtual calls in a constructor or destructor. | Unexpected result: Alert | +| VirtualCallInConstructorOrDestructor.cs:65:33:65:48 | Avoid virtual calls in a constructor or destructor. | Unexpected result: Alert | +| VirtualCallInConstructorOrDestructor.cs:66:40:66:55 | Avoid virtual calls in a constructor or destructor. | Unexpected result: Alert | From be6f771bc8531d8cdecaaec4a2950b72d9b0a20d Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 16 Jul 2026 09:15:19 +0200 Subject: [PATCH 0036/2098] C#: Use any instead of exists. --- .../VirtualCallInConstructorOrDestructor.ql | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/csharp/ql/src/Bad Practices/VirtualCallInConstructorOrDestructor.ql b/csharp/ql/src/Bad Practices/VirtualCallInConstructorOrDestructor.ql index a29b39d33a10..8e2919f678ce 100644 --- a/csharp/ql/src/Bad Practices/VirtualCallInConstructorOrDestructor.ql +++ b/csharp/ql/src/Bad Practices/VirtualCallInConstructorOrDestructor.ql @@ -34,17 +34,15 @@ predicate overriddenSealed(RefType t, Virtualizable d) { } predicate virtualAccessWithThisQualifier(Expr e, Member d) { - exists(VirtualMethodCall c | - c = e and c.getTarget() = d and c.hasThisQualifier() and not c.isImplicit() - ) + e = any(VirtualMethodCall c | c.getTarget() = d and c.hasThisQualifier() and not c.isImplicit()) or - exists(VirtualMethodAccess c | c = e and c.getTarget() = d and c.hasThisQualifier()) + e = any(VirtualMethodAccess c | c.getTarget() = d and c.hasThisQualifier()) or - exists(VirtualPropertyAccess c | c = e and c.getTarget() = d and c.hasThisQualifier()) + e = any(VirtualPropertyAccess c | c.getTarget() = d and c.hasThisQualifier()) or - exists(VirtualIndexerAccess c | c = e and c.getTarget() = d and c.hasThisQualifier()) + e = any(VirtualIndexerAccess c | c.getTarget() = d and c.hasThisQualifier()) or - exists(VirtualEventAccess c | c = e and c.getTarget() = d and c.hasThisQualifier()) + e = any(VirtualEventAccess c | c.getTarget() = d and c.hasThisQualifier()) } from Expr e From 4d8f1503612ad14c26e6d14b556f1fb3035f75fb Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 16 Jul 2026 09:19:01 +0200 Subject: [PATCH 0037/2098] C#: Allow virtual method/indexer/property/event access in nameof expressions in cs/virtual-call-in-constructor. --- .../ql/src/Bad Practices/VirtualCallInConstructorOrDestructor.ql | 1 + 1 file changed, 1 insertion(+) diff --git a/csharp/ql/src/Bad Practices/VirtualCallInConstructorOrDestructor.ql b/csharp/ql/src/Bad Practices/VirtualCallInConstructorOrDestructor.ql index 8e2919f678ce..5effa2f27650 100644 --- a/csharp/ql/src/Bad Practices/VirtualCallInConstructorOrDestructor.ql +++ b/csharp/ql/src/Bad Practices/VirtualCallInConstructorOrDestructor.ql @@ -19,6 +19,7 @@ predicate virtualCallToSelfInConstructor(Expr e) { (c instanceof Constructor or c instanceof Destructor) and t = c.getDeclaringType() and virtualAccessWithThisQualifier(e, d) and + not e = any(NameOfExpr ne).getAccess().getAChildExpr*() and t.getABaseType*() = d.getDeclaringType() and not t.isSealed() and not overriddenSealed(t.getABaseType*(), d) From f7250f2b9aebae525eae73874cf468572741c5e4 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 16 Jul 2026 09:49:12 +0200 Subject: [PATCH 0038/2098] C#: Update test expected output. --- .../VirtualCallInConstructorOrDestructor.expected | 8 -------- 1 file changed, 8 deletions(-) diff --git a/csharp/ql/test/query-tests/Bad Practices/VirtualCallInConstructorOrDestructor/VirtualCallInConstructorOrDestructor.expected b/csharp/ql/test/query-tests/Bad Practices/VirtualCallInConstructorOrDestructor/VirtualCallInConstructorOrDestructor.expected index 4a01b5a57870..e2925c9cbd7b 100644 --- a/csharp/ql/test/query-tests/Bad Practices/VirtualCallInConstructorOrDestructor/VirtualCallInConstructorOrDestructor.expected +++ b/csharp/ql/test/query-tests/Bad Practices/VirtualCallInConstructorOrDestructor/VirtualCallInConstructorOrDestructor.expected @@ -1,13 +1,5 @@ -#select | VirtualCallInConstructorOrDestructor.cs:46:13:46:23 | call to method f_virtual | Avoid virtual calls in a constructor or destructor. | | VirtualCallInConstructorOrDestructor.cs:55:17:55:25 | access to method f_virtual | Avoid virtual calls in a constructor or destructor. | -| VirtualCallInConstructorOrDestructor.cs:59:33:59:41 | access to method f_virtual | Avoid virtual calls in a constructor or destructor. | | VirtualCallInConstructorOrDestructor.cs:62:21:62:29 | access to property p_virtual | Avoid virtual calls in a constructor or destructor. | -| VirtualCallInConstructorOrDestructor.cs:65:33:65:48 | access to property p_virtual_string | Avoid virtual calls in a constructor or destructor. | -| VirtualCallInConstructorOrDestructor.cs:66:40:66:55 | access to property p_virtual_string | Avoid virtual calls in a constructor or destructor. | | VirtualCallInConstructorOrDestructor.cs:69:17:69:23 | access to indexer | Avoid virtual calls in a constructor or destructor. | | VirtualCallInConstructorOrDestructor.cs:74:13:74:21 | access to event e_virtual | Avoid virtual calls in a constructor or destructor. | -testFailures -| VirtualCallInConstructorOrDestructor.cs:59:33:59:41 | Avoid virtual calls in a constructor or destructor. | Unexpected result: Alert | -| VirtualCallInConstructorOrDestructor.cs:65:33:65:48 | Avoid virtual calls in a constructor or destructor. | Unexpected result: Alert | -| VirtualCallInConstructorOrDestructor.cs:66:40:66:55 | Avoid virtual calls in a constructor or destructor. | Unexpected result: Alert | From b52ea33566ef7bd5e5c36e5578bf1bab66a494cf Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 16 Jul 2026 09:58:04 +0200 Subject: [PATCH 0039/2098] C#: Add change-note. --- .../change-notes/2026-07-16-virtual-call-in-constructor.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 csharp/ql/src/change-notes/2026-07-16-virtual-call-in-constructor.md diff --git a/csharp/ql/src/change-notes/2026-07-16-virtual-call-in-constructor.md b/csharp/ql/src/change-notes/2026-07-16-virtual-call-in-constructor.md new file mode 100644 index 000000000000..bd1f5f99a4f5 --- /dev/null +++ b/csharp/ql/src/change-notes/2026-07-16-virtual-call-in-constructor.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The query `cs/virtual-call-in-constructor` has been improved. Uses of virtual members in `nameof` expressions are no longer reported, since they are not calls. From 62408d8518eb3c8a498ec198376f165c19777740 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 16 Jul 2026 11:05:49 +0200 Subject: [PATCH 0040/2098] C#: Add some generic override modelgenerator test cases. --- .../modelgenerator/dataflow/Summaries.cs | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/csharp/ql/test/utils/modelgenerator/dataflow/Summaries.cs b/csharp/ql/test/utils/modelgenerator/dataflow/Summaries.cs index 4c85b397ac1f..0ccfe69b7a98 100644 --- a/csharp/ql/test/utils/modelgenerator/dataflow/Summaries.cs +++ b/csharp/ql/test/utils/modelgenerator/dataflow/Summaries.cs @@ -278,6 +278,77 @@ public void AddToGenericList(List input, S data) } } +public class GenericWithVirtual1 +{ + // heuristic-summary=Models;GenericWithVirtual1;true;ReturnParam;(T);;Argument[0];ReturnValue;value;df-generated + // contentbased-summary=Models;GenericWithVirtual1;true;ReturnParam;(T);;Argument[0];ReturnValue;value;dfc-generated + public virtual T ReturnParam(T input) + { + return input; + } + + // Missing model. Should have been lifted. + // SPURIOUS-neutral=Models;GenericWithVirtual1;StubImplementation;(T);summary;df-generated + public virtual T StubImplementation(T input) + { + throw null; + } +} + +public class DerivedGenericWithVirtual : GenericWithVirtual1 +{ + // SPURIOUS-heuristic-summary=Models;DerivedGenericWithVirtual;true;ReturnParam;(System.String);;Argument[0];ReturnValue;value;df-generated + // SPURIOUS-contentbased-summary=Models;DerivedGenericWithVirtual;true;ReturnParam;(System.String);;Argument[0];ReturnValue;value;dfc-generated + public override string ReturnParam(string input) + { + return input; + } + + // SPURIOUS-heuristic-summary=Models;DerivedGenericWithVirtual;true;StubImplementation;(System.String);;Argument[0];ReturnValue;value;df-generated + // SPURIOUS-contentbased-summary=Models;DerivedGenericWithVirtual;true;StubImplementation;(System.String);;Argument[0];ReturnValue;value;dfc-generated + public override string StubImplementation(string input) + { + return input; + } +} + +public class GenericWithVirtual2 +{ + // heuristic-summary=Models;GenericWithVirtual2;true;ReturnParam;(T);;Argument[0];ReturnValue;value;df-generated + // contentbased-summary=Models;GenericWithVirtual2;true;ReturnParam;(T);;Argument[0];ReturnValue;value;dfc-generated + public virtual T ReturnParam(T input) + { + return input; + } + + // Missing model. Should have been lifted. + // SPURIOUS-neutral=Models;GenericWithVirtual2;StubImplementation;(T);summary;df-generated + + public virtual T StubImplementation(T input) + { + throw null; + } +} + +public class NestedGenericWithVirtual : GenericWithVirtual2 { } + +public class DerivedNestedGenericWithVirtual : NestedGenericWithVirtual +{ + // SPURIOUS-heuristic-summary=Models;DerivedNestedGenericWithVirtual;true;ReturnParam;(System.String);;Argument[0];ReturnValue;value;df-generated + // SPURIOUS-contentbased-summary=Models;DerivedNestedGenericWithVirtual;true;ReturnParam;(System.String);;Argument[0];ReturnValue;value;dfc-generated + public override string ReturnParam(string input) + { + return input; + } + + // SPURIOUS-heuristic-summary=Models;DerivedNestedGenericWithVirtual;true;StubImplementation;(System.String);;Argument[0];ReturnValue;value;df-generated + // SPURIOUS-contentbased-summary=Models;DerivedNestedGenericWithVirtual;true;StubImplementation;(System.String);;Argument[0];ReturnValue;value;dfc-generated + public override string StubImplementation(string input) + { + return input; + } +} + public abstract class BaseClassFlow { // heuristic-summary=Models;BaseClassFlow;true;ReturnParam;(System.Object);;Argument[0];ReturnValue;value;df-generated From 541cde98e0bb554f174efeb29bb03f02407c8b9c Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 16 Jul 2026 12:23:53 +0200 Subject: [PATCH 0041/2098] C#: Lift models to unbound declarations. --- csharp/ql/src/utils/modelgenerator/internal/CaptureModels.qll | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/csharp/ql/src/utils/modelgenerator/internal/CaptureModels.qll b/csharp/ql/src/utils/modelgenerator/internal/CaptureModels.qll index 5b1b9e4ae65c..df030529550a 100644 --- a/csharp/ql/src/utils/modelgenerator/internal/CaptureModels.qll +++ b/csharp/ql/src/utils/modelgenerator/internal/CaptureModels.qll @@ -213,7 +213,8 @@ module SummaryModelGeneratorInput implements SummaryModelGeneratorInputSig { } private Callable getARelevantOverrideeOrImplementee(Overridable m) { - m.overridesOrImplements(result) and relevant(result) + exists(Callable c | m.overridesOrImplements(c) and result = c.getUnboundDeclaration()) and + relevant(result) } /** From 3fca6734f3d81a77275f5e966690d76eb1117a6d Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 16 Jul 2026 12:24:33 +0200 Subject: [PATCH 0042/2098] C#: Update model generator expected test output. --- .../modelgenerator/dataflow/Summaries.cs | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/csharp/ql/test/utils/modelgenerator/dataflow/Summaries.cs b/csharp/ql/test/utils/modelgenerator/dataflow/Summaries.cs index 0ccfe69b7a98..afab366f2158 100644 --- a/csharp/ql/test/utils/modelgenerator/dataflow/Summaries.cs +++ b/csharp/ql/test/utils/modelgenerator/dataflow/Summaries.cs @@ -287,8 +287,6 @@ public virtual T ReturnParam(T input) return input; } - // Missing model. Should have been lifted. - // SPURIOUS-neutral=Models;GenericWithVirtual1;StubImplementation;(T);summary;df-generated public virtual T StubImplementation(T input) { throw null; @@ -297,15 +295,15 @@ public virtual T StubImplementation(T input) public class DerivedGenericWithVirtual : GenericWithVirtual1 { - // SPURIOUS-heuristic-summary=Models;DerivedGenericWithVirtual;true;ReturnParam;(System.String);;Argument[0];ReturnValue;value;df-generated - // SPURIOUS-contentbased-summary=Models;DerivedGenericWithVirtual;true;ReturnParam;(System.String);;Argument[0];ReturnValue;value;dfc-generated + // heuristic-summary=Models;GenericWithVirtual1;true;ReturnParam;(T);;Argument[0];ReturnValue;value;df-generated + // contentbased-summary=Models;GenericWithVirtual1;true;ReturnParam;(T);;Argument[0];ReturnValue;value;dfc-generated public override string ReturnParam(string input) { return input; } - // SPURIOUS-heuristic-summary=Models;DerivedGenericWithVirtual;true;StubImplementation;(System.String);;Argument[0];ReturnValue;value;df-generated - // SPURIOUS-contentbased-summary=Models;DerivedGenericWithVirtual;true;StubImplementation;(System.String);;Argument[0];ReturnValue;value;dfc-generated + // heuristic-summary=Models;GenericWithVirtual1;true;StubImplementation;(T);;Argument[0];ReturnValue;value;df-generated + // contentbased-summary=Models;GenericWithVirtual1;true;StubImplementation;(T);;Argument[0];ReturnValue;value;dfc-generated public override string StubImplementation(string input) { return input; @@ -321,9 +319,6 @@ public virtual T ReturnParam(T input) return input; } - // Missing model. Should have been lifted. - // SPURIOUS-neutral=Models;GenericWithVirtual2;StubImplementation;(T);summary;df-generated - public virtual T StubImplementation(T input) { throw null; @@ -334,15 +329,15 @@ public class NestedGenericWithVirtual : GenericWithVirtual2 { } public class DerivedNestedGenericWithVirtual : NestedGenericWithVirtual { - // SPURIOUS-heuristic-summary=Models;DerivedNestedGenericWithVirtual;true;ReturnParam;(System.String);;Argument[0];ReturnValue;value;df-generated - // SPURIOUS-contentbased-summary=Models;DerivedNestedGenericWithVirtual;true;ReturnParam;(System.String);;Argument[0];ReturnValue;value;dfc-generated + // heuristic-summary=Models;GenericWithVirtual2;true;ReturnParam;(T);;Argument[0];ReturnValue;value;df-generated + // contentbased-summary=Models;GenericWithVirtual2;true;ReturnParam;(T);;Argument[0];ReturnValue;value;dfc-generated public override string ReturnParam(string input) { return input; } - // SPURIOUS-heuristic-summary=Models;DerivedNestedGenericWithVirtual;true;StubImplementation;(System.String);;Argument[0];ReturnValue;value;df-generated - // SPURIOUS-contentbased-summary=Models;DerivedNestedGenericWithVirtual;true;StubImplementation;(System.String);;Argument[0];ReturnValue;value;dfc-generated + // heuristic-summary=Models;GenericWithVirtual2;true;StubImplementation;(T);;Argument[0];ReturnValue;value;df-generated + // contentbased-summary=Models;GenericWithVirtual2;true;StubImplementation;(T);;Argument[0];ReturnValue;value;dfc-generated public override string StubImplementation(string input) { return input; From 0b365b3622bcaf72e7da345ebbf99b6a39d06257 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 16 Jul 2026 12:26:07 +0200 Subject: [PATCH 0043/2098] Java: Lift models to source (unbound) declarations. --- java/ql/src/utils/modelgenerator/internal/CaptureModels.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/ql/src/utils/modelgenerator/internal/CaptureModels.qll b/java/ql/src/utils/modelgenerator/internal/CaptureModels.qll index f02f9a5b623d..2fe9079a9f7f 100644 --- a/java/ql/src/utils/modelgenerator/internal/CaptureModels.qll +++ b/java/ql/src/utils/modelgenerator/internal/CaptureModels.qll @@ -167,7 +167,7 @@ module SummaryModelGeneratorInput implements SummaryModelGeneratorInputSig { Parameter asParameter(NodeExtended node) { result = node.asParameter() } private J::Method getARelevantOverride(J::Method m) { - result = m.getAnOverride() and + result = m.getAnOverride().getSourceDeclaration() and relevant(result) and // Other exclusions for overrides. not m instanceof J::ToStringMethod From f184d28ddae49ad9efd200e25c6eaf909b06442b Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 16 Jul 2026 14:39:28 +0200 Subject: [PATCH 0044/2098] Java: Add java generics test cases. --- .../modelgenerator/dataflow/p/Generics.java | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 java/ql/test/utils/modelgenerator/dataflow/p/Generics.java diff --git a/java/ql/test/utils/modelgenerator/dataflow/p/Generics.java b/java/ql/test/utils/modelgenerator/dataflow/p/Generics.java new file mode 100644 index 000000000000..46d81c8bb7ae --- /dev/null +++ b/java/ql/test/utils/modelgenerator/dataflow/p/Generics.java @@ -0,0 +1,62 @@ +package p; + +public class Generics { + + public class Generic1 { + // heuristic-summary=p;Generics$Generic1;true;ReturnParam;(Object);;Argument[0];ReturnValue;value;df-generated + // contentbased-summary=p;Generics$Generic1;true;ReturnParam;(Object);;Argument[0];ReturnValue;value;dfc-generated + public T ReturnParam(T input) { + return input; + } + + public T StubImplementation(T input) { + return null; + } + } + + public class DerivedGeneric extends Generic1 { + // heuristic-summary=p;Generics$Generic1;true;ReturnParam;(Object);;Argument[0];ReturnValue;value;df-generated + // contentbased-summary=p;Generics$Generic1;true;ReturnParam;(Object);;Argument[0];ReturnValue;value;dfc-generated + @Override + public String ReturnParam(String input) { + return input; + } + + // heuristic-summary=p;Generics$Generic1;true;StubImplementation;(Object);;Argument[0];ReturnValue;value;df-generated + // contentbased-summary=p;Generics$Generic1;true;StubImplementation;(Object);;Argument[0];ReturnValue;value;dfc-generated + @Override + public String StubImplementation(String input) { + return input; + } + } + + public class Generic2 { + // heuristic-summary=p;Generics$Generic2;true;ReturnParam;(Object);;Argument[0];ReturnValue;value;df-generated + // contentbased-summary=p;Generics$Generic2;true;ReturnParam;(Object);;Argument[0];ReturnValue;value;dfc-generated + public T ReturnParam(T input) { + return input; + } + + public T StubImplementation(T input) { + return null; + } + } + + public class NestedGeneric extends Generic2 { } + + public class DerivedNestedGeneric extends NestedGeneric { + // heuristic-summary=p;Generics$Generic2;true;ReturnParam;(Object);;Argument[0];ReturnValue;value;df-generated + // contentbased-summary=p;Generics$Generic2;true;ReturnParam;(Object);;Argument[0];ReturnValue;value;dfc-generated + @Override + public String ReturnParam(String input) { + return input; + } + + // heuristic-summary=p;Generics$Generic2;true;StubImplementation;(Object);;Argument[0];ReturnValue;value;df-generated + // contentbased-summary=p;Generics$Generic2;true;StubImplementation;(Object);;Argument[0];ReturnValue;value;dfc-generated + @Override + public String StubImplementation(String input) { + return input; + } + } +} From 57903295aa20d83d70de38d9e270ab3098c50b4d Mon Sep 17 00:00:00 2001 From: Kristen Newbury Date: Tue, 21 Jul 2026 16:03:50 -0400 Subject: [PATCH 0045/2098] Address review comments --- actions/ql/lib/actions.qll | 2 -- actions/ql/lib/codeql/actions/config/Config.qll | 7 ------- .../lib/codeql/actions/config/ConfigExtensions.qll | 5 ----- .../lib/codeql/actions/security/ControlChecks.qll | 13 ++++--------- actions/ql/lib/ext/config/customize_checks.yml | 9 --------- .../ql/lib/ext/config/deployment_environment.yml | 3 +-- 6 files changed, 5 insertions(+), 34 deletions(-) delete mode 100644 actions/ql/lib/ext/config/customize_checks.yml diff --git a/actions/ql/lib/actions.qll b/actions/ql/lib/actions.qll index a1ee60b1694d..2c1d1cee9259 100644 --- a/actions/ql/lib/actions.qll +++ b/actions/ql/lib/actions.qll @@ -1,3 +1 @@ import codeql.actions.Ast - -abstract class CustomEnvEnable extends Environment { } diff --git a/actions/ql/lib/codeql/actions/config/Config.qll b/actions/ql/lib/codeql/actions/config/Config.qll index 72f1b7614594..27e24514c091 100644 --- a/actions/ql/lib/codeql/actions/config/Config.qll +++ b/actions/ql/lib/codeql/actions/config/Config.qll @@ -173,10 +173,3 @@ predicate actionsPermissionsDataModel(string action, string permission) { predicate enabledDeploymentEnvironmentDataModel(string name) { Extensions::enabledDeploymentEnvironmentDataModel(name) } - -/** - * `EnvironmentCheck` implementation model. - */ -predicate selectDeploymentEnvironmentDataModel(string selected) { - Extensions::selectDeploymentEnvironmentDataModel(selected) -} diff --git a/actions/ql/lib/codeql/actions/config/ConfigExtensions.qll b/actions/ql/lib/codeql/actions/config/ConfigExtensions.qll index e0ca6a4da340..f8cdc8e66c6a 100644 --- a/actions/ql/lib/codeql/actions/config/ConfigExtensions.qll +++ b/actions/ql/lib/codeql/actions/config/ConfigExtensions.qll @@ -95,8 +95,3 @@ extensible predicate actionsPermissionsDataModel(string action, string permissio * toggle precision of whether that suffices or not as a control check. */ extensible predicate enabledDeploymentEnvironmentDataModel(string name); - -/** - * Selects which deployment environments model to use to implement `EnvironmentCheck`. - */ -extensible predicate selectDeploymentEnvironmentDataModel(string mechanism); diff --git a/actions/ql/lib/codeql/actions/security/ControlChecks.qll b/actions/ql/lib/codeql/actions/security/ControlChecks.qll index 4a68d50549dc..7bde120e432a 100644 --- a/actions/ql/lib/codeql/actions/security/ControlChecks.qll +++ b/actions/ql/lib/codeql/actions/security/ControlChecks.qll @@ -278,15 +278,10 @@ abstract class LabelCheck extends ControlCheck { class EnvironmentCheck extends ControlCheck instanceof Environment { EnvironmentCheck() { - exists(string selected | - selectDeploymentEnvironmentDataModel(selected) and - if selected = "EnvironmentCheckMaD" - then enabledDeploymentEnvironmentDataModel(this.(Environment).getName()) - else - if selected = "EnvironmentCheckCustomQL" - then this instanceof CustomEnvEnable - else this instanceof Environment - ) + // if there are any custom tuples use those + if enabledDeploymentEnvironmentDataModel(_) + then enabledDeploymentEnvironmentDataModel(this.(Environment).getName()) + else this instanceof Environment } // Environment checks are not effective against any mutable attacks diff --git a/actions/ql/lib/ext/config/customize_checks.yml b/actions/ql/lib/ext/config/customize_checks.yml deleted file mode 100644 index c630d8be80c7..000000000000 --- a/actions/ql/lib/ext/config/customize_checks.yml +++ /dev/null @@ -1,9 +0,0 @@ -extensions: - - addsTo: - pack: codeql/actions-all - extensible: selectDeploymentEnvironmentDataModel - data: - # The possible values this can take are: - # EnvironmentCheckCustomQL - for a custom QL implementation for the sufficient EnvironmentCheck. - # EnvironmentCheckMaD - for a custom MaD list of deployment environments that are relevant to a database. - - [""] \ No newline at end of file diff --git a/actions/ql/lib/ext/config/deployment_environment.yml b/actions/ql/lib/ext/config/deployment_environment.yml index 6517614139e0..eed2911c2758 100644 --- a/actions/ql/lib/ext/config/deployment_environment.yml +++ b/actions/ql/lib/ext/config/deployment_environment.yml @@ -2,5 +2,4 @@ extensions: - addsTo: pack: codeql/actions-all extensible: enabledDeploymentEnvironmentDataModel - data: - - [""] \ No newline at end of file + data: [] \ No newline at end of file From 854b5e8d8b169248840d83c318fdb9f3e9dfb184 Mon Sep 17 00:00:00 2001 From: Kristen Newbury Date: Wed, 22 Jul 2026 10:27:25 -0400 Subject: [PATCH 0046/2098] Add ControlCheck library test --- .../basic/.github/workflows/controlcheck.yml | 16 ++++++++++++++++ .../basic/controlchecktest.expected | 1 + .../library-tests/basic/controlchecktest.ext.yml | 8 ++++++++ .../test/library-tests/basic/controlchecktest.ql | 5 +++++ 4 files changed, 30 insertions(+) create mode 100644 actions/ql/test/library-tests/basic/.github/workflows/controlcheck.yml create mode 100644 actions/ql/test/library-tests/basic/controlchecktest.expected create mode 100644 actions/ql/test/library-tests/basic/controlchecktest.ext.yml create mode 100644 actions/ql/test/library-tests/basic/controlchecktest.ql diff --git a/actions/ql/test/library-tests/basic/.github/workflows/controlcheck.yml b/actions/ql/test/library-tests/basic/.github/workflows/controlcheck.yml new file mode 100644 index 000000000000..bd8ba15784b4 --- /dev/null +++ b/actions/ql/test/library-tests/basic/.github/workflows/controlcheck.yml @@ -0,0 +1,16 @@ +on: + pull_request_target: + types: [Created] +jobs: + test1: + environment: EnvironmentInRepo + runs-on: ubuntu-latest + steps: + - name: Test 1 + run: echo "test1" + test2: + environment: EnvironmentNotInRepo + runs-on: ubuntu-latest + steps: + - name: Test 2 + run: echo "test2" \ No newline at end of file diff --git a/actions/ql/test/library-tests/basic/controlchecktest.expected b/actions/ql/test/library-tests/basic/controlchecktest.expected new file mode 100644 index 000000000000..ac2f7ac38aa1 --- /dev/null +++ b/actions/ql/test/library-tests/basic/controlchecktest.expected @@ -0,0 +1 @@ +| .github/workflows/controlcheck.yml:6:18:6:34 | EnvironmentInRepo | diff --git a/actions/ql/test/library-tests/basic/controlchecktest.ext.yml b/actions/ql/test/library-tests/basic/controlchecktest.ext.yml new file mode 100644 index 000000000000..c20b01db5a22 --- /dev/null +++ b/actions/ql/test/library-tests/basic/controlchecktest.ext.yml @@ -0,0 +1,8 @@ +extensions: + - addsTo: + pack: codeql/actions-all + extensible: enabledDeploymentEnvironmentDataModel + data: + # assumed to exist in a repo where controlcheck.yml exists + # realisitically would need to be manually/externally provided + - ["EnvironmentInRepo"] \ No newline at end of file diff --git a/actions/ql/test/library-tests/basic/controlchecktest.ql b/actions/ql/test/library-tests/basic/controlchecktest.ql new file mode 100644 index 000000000000..1daba58fe749 --- /dev/null +++ b/actions/ql/test/library-tests/basic/controlchecktest.ql @@ -0,0 +1,5 @@ +import actions +import codeql.actions.security.ControlChecks + +from ControlCheck c +select c From 07e3e346dd8028d553d748e9ac9dbc32750b2d2c Mon Sep 17 00:00:00 2001 From: Kristen Newbury Date: Wed, 22 Jul 2026 12:00:39 -0400 Subject: [PATCH 0047/2098] Add change note ControlCheck change --- .../2026-07-22-environment-check-sanitizer-mad.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 actions/ql/lib/change-notes/2026-07-22-environment-check-sanitizer-mad.md diff --git a/actions/ql/lib/change-notes/2026-07-22-environment-check-sanitizer-mad.md b/actions/ql/lib/change-notes/2026-07-22-environment-check-sanitizer-mad.md new file mode 100644 index 000000000000..ef901cdc7603 --- /dev/null +++ b/actions/ql/lib/change-notes/2026-07-22-environment-check-sanitizer-mad.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added an option to `EnvironmentCheck` to become specified by a MaD model, otherwise it will continue as the default it previously was. Without adding models to `actions/ql/lib/ext/config/deployment_environment.yml` the behavior of every query will be unchanged. When models are added queries using `ControlCheck` may find more results in cases where an enironment is no longer a sufficient sanitizer. \ No newline at end of file From 5927a8683a9ab26b3df1ce8f05fb3ea2f10d2d39 Mon Sep 17 00:00:00 2001 From: Kristen Newbury Date: Wed, 22 Jul 2026 12:01:34 -0400 Subject: [PATCH 0048/2098] Fix spelling mistake in doc --- actions/ql/test/library-tests/basic/controlchecktest.ext.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actions/ql/test/library-tests/basic/controlchecktest.ext.yml b/actions/ql/test/library-tests/basic/controlchecktest.ext.yml index c20b01db5a22..96ded8ff2b2c 100644 --- a/actions/ql/test/library-tests/basic/controlchecktest.ext.yml +++ b/actions/ql/test/library-tests/basic/controlchecktest.ext.yml @@ -4,5 +4,5 @@ extensions: extensible: enabledDeploymentEnvironmentDataModel data: # assumed to exist in a repo where controlcheck.yml exists - # realisitically would need to be manually/externally provided + # realistically would need to be manually/externally provided - ["EnvironmentInRepo"] \ No newline at end of file From a9d1b4be39cba19643c84ec25bdcb8e1e54be519 Mon Sep 17 00:00:00 2001 From: Kristen Newbury Date: Wed, 22 Jul 2026 12:05:13 -0400 Subject: [PATCH 0049/2098] Improve doc --- actions/ql/lib/codeql/actions/config/ConfigExtensions.qll | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/actions/ql/lib/codeql/actions/config/ConfigExtensions.qll b/actions/ql/lib/codeql/actions/config/ConfigExtensions.qll index f8cdc8e66c6a..4ee438fc63cb 100644 --- a/actions/ql/lib/codeql/actions/config/ConfigExtensions.qll +++ b/actions/ql/lib/codeql/actions/config/ConfigExtensions.qll @@ -90,8 +90,10 @@ extensible predicate untrustedGhCommandDataModel(string cmd_regex, string flag); extensible predicate actionsPermissionsDataModel(string action, string permission); /** - * Holds for deployment environments that exist for a given repository. + * Holds for deployment environments that exist with `name` for a given repository. + * * - 'name' is the name of the environment defined. + * E.g. for the deployment environment `environment: EnvironmentInRepo`, `name` is `EnvironmentInRepo`. * Requires this to be externally supplied but once done can be used to - * toggle precision of whether that suffices or not as a control check. + * toggle precision of whether that suffices or not as a control check by contributing to `EnvironmentCheck`. */ extensible predicate enabledDeploymentEnvironmentDataModel(string name); From 1e6e8577da8fbdf116ed9dca3e63636ae02e9819 Mon Sep 17 00:00:00 2001 From: Kristen Newbury Date: Thu, 23 Jul 2026 10:55:33 -0400 Subject: [PATCH 0050/2098] Fix missing test expected file adjustments, expected --- .../library-tests/basic/commands.expected | 2 + .../ql/test/library-tests/basic/test.expected | 73 +++++++++++++++++++ 2 files changed, 75 insertions(+) diff --git a/actions/ql/test/library-tests/basic/commands.expected b/actions/ql/test/library-tests/basic/commands.expected index 82ea1739b28a..adbcdb5a40a7 100644 --- a/actions/ql/test/library-tests/basic/commands.expected +++ b/actions/ql/test/library-tests/basic/commands.expected @@ -16,6 +16,8 @@ | .github/workflows/commands.yml:28:9:31:2 | Run Step | wc -l | | .github/workflows/commands.yml:34:9:37:6 | Run Step | command1 | | .github/workflows/commands.yml:34:9:37:6 | Run Step | command2 | +| .github/workflows/controlcheck.yml:9:9:11:2 | Run Step | echo "test1" | +| .github/workflows/controlcheck.yml:15:9:16:25 | Run Step | echo "test2" | | .github/workflows/expression_nodes.yml:7:9:8:6 | Run Step | LINE 1echo '${{ github.event.comment.body }}' | | .github/workflows/expression_nodes.yml:8:9:10:6 | Run Step | LINE 1 echo '${{ github.event.comment.body }}' | | .github/workflows/expression_nodes.yml:10:9:13:6 | Run Step | LINE 1 echo '${{ github.event.comment.body }}' | diff --git a/actions/ql/test/library-tests/basic/test.expected b/actions/ql/test/library-tests/basic/test.expected index 4de3336aba7b..7c1c560c87e1 100644 --- a/actions/ql/test/library-tests/basic/test.expected +++ b/actions/ql/test/library-tests/basic/test.expected @@ -1,5 +1,6 @@ files | .github/workflows/commands.yml:0:0:0:0 | .github/workflows/commands.yml | +| .github/workflows/controlcheck.yml:0:0:0:0 | .github/workflows/controlcheck.yml | | .github/workflows/expression_nodes.yml:0:0:0:0 | .github/workflows/expression_nodes.yml | | .github/workflows/many_strings.yml:0:0:0:0 | .github/workflows/many_strings.yml | | .github/workflows/multiline2.yml:0:0:0:0 | .github/workflows/multiline2.yml | @@ -7,8 +8,10 @@ files | .github/workflows/poisonable_steps.yml:0:0:0:0 | .github/workflows/poisonable_steps.yml | | .github/workflows/shell.yml:0:0:0:0 | .github/workflows/shell.yml | | .github/workflows/test.yml:0:0:0:0 | .github/workflows/test.yml | +| controlchecktest.ext.yml:0:0:0:0 | controlchecktest.ext.yml | workflows | .github/workflows/commands.yml:1:1:39:30 | on: push | +| .github/workflows/controlcheck.yml:1:1:16:25 | on: | | .github/workflows/expression_nodes.yml:1:1:21:47 | on: issue_comment | | .github/workflows/many_strings.yml:1:1:18:1211 | on: | | .github/workflows/multiline2.yml:1:1:89:35 | on: | @@ -21,6 +24,8 @@ compositeActions jobs | .github/workflows/commands.yml:9:5:31:2 | Job: local_commands | | .github/workflows/commands.yml:32:5:39:30 | Job: local_commands2 | +| .github/workflows/controlcheck.yml:6:5:11:2 | Job: test1 | +| .github/workflows/controlcheck.yml:12:5:16:25 | Job: test2 | | .github/workflows/expression_nodes.yml:5:5:21:47 | Job: echo-chamber | | .github/workflows/many_strings.yml:9:5:18:1211 | Job: Test | | .github/workflows/multiline2.yml:9:5:89:35 | Job: Test | @@ -35,6 +40,8 @@ jobs localJobs | .github/workflows/commands.yml:9:5:31:2 | Job: local_commands | | .github/workflows/commands.yml:32:5:39:30 | Job: local_commands2 | +| .github/workflows/controlcheck.yml:6:5:11:2 | Job: test1 | +| .github/workflows/controlcheck.yml:12:5:16:25 | Job: test2 | | .github/workflows/expression_nodes.yml:5:5:21:47 | Job: echo-chamber | | .github/workflows/many_strings.yml:9:5:18:1211 | Job: Test | | .github/workflows/multiline2.yml:9:5:89:35 | Job: Test | @@ -57,6 +64,8 @@ steps | .github/workflows/commands.yml:28:9:31:2 | Run Step | | .github/workflows/commands.yml:34:9:37:6 | Run Step | | .github/workflows/commands.yml:37:9:39:30 | Run Step | +| .github/workflows/controlcheck.yml:9:9:11:2 | Run Step | +| .github/workflows/controlcheck.yml:15:9:16:25 | Run Step | | .github/workflows/expression_nodes.yml:7:9:8:6 | Run Step | | .github/workflows/expression_nodes.yml:8:9:10:6 | Run Step | | .github/workflows/expression_nodes.yml:10:9:13:6 | Run Step | @@ -180,6 +189,10 @@ runStepChildren | .github/workflows/commands.yml:34:9:37:6 | Run Step | .github/workflows/commands.yml:35:14:36:30 | command1 ; command2\n | | .github/workflows/commands.yml:37:9:39:30 | Run Step | .github/workflows/commands.yml:37:16:37:19 | pwsh | | .github/workflows/commands.yml:37:9:39:30 | Run Step | .github/workflows/commands.yml:38:14:39:30 | command3 \| command4\n | +| .github/workflows/controlcheck.yml:9:9:11:2 | Run Step | .github/workflows/controlcheck.yml:9:15:9:20 | Test 1 | +| .github/workflows/controlcheck.yml:9:9:11:2 | Run Step | .github/workflows/controlcheck.yml:10:14:10:25 | echo "test1" | +| .github/workflows/controlcheck.yml:15:9:16:25 | Run Step | .github/workflows/controlcheck.yml:15:15:15:20 | Test 2 | +| .github/workflows/controlcheck.yml:15:9:16:25 | Run Step | .github/workflows/controlcheck.yml:16:14:16:25 | echo "test2" | | .github/workflows/expression_nodes.yml:7:9:8:6 | Run Step | .github/workflows/expression_nodes.yml:7:14:7:58 | LINE 1echo '${{ github.event.comment.body }}' | | .github/workflows/expression_nodes.yml:8:9:10:6 | Run Step | .github/workflows/expression_nodes.yml:8:14:9:57 | LINE 1 echo '${{ github.event.comment.body }}'\n | | .github/workflows/expression_nodes.yml:10:9:13:6 | Run Step | .github/workflows/expression_nodes.yml:10:14:12:53 | LINE 1 echo '${{ github.event.comment.body }}'\nLINE 2 echo '${{github.event.issue.body}}'\n | @@ -347,6 +360,43 @@ parentNodes | .github/workflows/commands.yml:38:14:39:30 | command3 \| command4\n | .github/workflows/commands.yml:1:1:39:30 | on: push | | .github/workflows/commands.yml:38:14:39:30 | command3 \| command4\n | .github/workflows/commands.yml:32:5:39:30 | Job: local_commands2 | | .github/workflows/commands.yml:38:14:39:30 | command3 \| command4\n | .github/workflows/commands.yml:37:9:39:30 | Run Step | +| .github/workflows/controlcheck.yml:2:3:2:21 | pull_request_target | .github/workflows/controlcheck.yml:2:3:3:21 | pull_request_target: | +| .github/workflows/controlcheck.yml:2:3:3:21 | pull_request_target: | .github/workflows/controlcheck.yml:1:1:16:25 | on: | +| .github/workflows/controlcheck.yml:3:13:3:19 | Created | .github/workflows/controlcheck.yml:1:1:16:25 | on: | +| .github/workflows/controlcheck.yml:3:13:3:19 | Created | .github/workflows/controlcheck.yml:2:3:2:21 | pull_request_target | +| .github/workflows/controlcheck.yml:3:13:3:19 | Created | .github/workflows/controlcheck.yml:2:3:3:21 | pull_request_target: | +| .github/workflows/controlcheck.yml:6:5:11:2 | Job: test1 | .github/workflows/controlcheck.yml:1:1:16:25 | on: | +| .github/workflows/controlcheck.yml:6:18:6:34 | EnvironmentInRepo | .github/workflows/controlcheck.yml:1:1:16:25 | on: | +| .github/workflows/controlcheck.yml:6:18:6:34 | EnvironmentInRepo | .github/workflows/controlcheck.yml:1:1:16:25 | on: | +| .github/workflows/controlcheck.yml:6:18:6:34 | EnvironmentInRepo | .github/workflows/controlcheck.yml:6:5:11:2 | Job: test1 | +| .github/workflows/controlcheck.yml:6:18:6:34 | EnvironmentInRepo | .github/workflows/controlcheck.yml:6:5:11:2 | Job: test1 | +| .github/workflows/controlcheck.yml:6:18:6:34 | EnvironmentInRepo | .github/workflows/controlcheck.yml:6:18:6:34 | EnvironmentInRepo | +| .github/workflows/controlcheck.yml:6:18:6:34 | EnvironmentInRepo | .github/workflows/controlcheck.yml:6:18:6:34 | EnvironmentInRepo | +| .github/workflows/controlcheck.yml:7:14:7:26 | ubuntu-latest | .github/workflows/controlcheck.yml:1:1:16:25 | on: | +| .github/workflows/controlcheck.yml:7:14:7:26 | ubuntu-latest | .github/workflows/controlcheck.yml:6:5:11:2 | Job: test1 | +| .github/workflows/controlcheck.yml:9:9:11:2 | Run Step | .github/workflows/controlcheck.yml:6:5:11:2 | Job: test1 | +| .github/workflows/controlcheck.yml:9:15:9:20 | Test 1 | .github/workflows/controlcheck.yml:1:1:16:25 | on: | +| .github/workflows/controlcheck.yml:9:15:9:20 | Test 1 | .github/workflows/controlcheck.yml:6:5:11:2 | Job: test1 | +| .github/workflows/controlcheck.yml:9:15:9:20 | Test 1 | .github/workflows/controlcheck.yml:9:9:11:2 | Run Step | +| .github/workflows/controlcheck.yml:10:14:10:25 | echo "test1" | .github/workflows/controlcheck.yml:1:1:16:25 | on: | +| .github/workflows/controlcheck.yml:10:14:10:25 | echo "test1" | .github/workflows/controlcheck.yml:6:5:11:2 | Job: test1 | +| .github/workflows/controlcheck.yml:10:14:10:25 | echo "test1" | .github/workflows/controlcheck.yml:9:9:11:2 | Run Step | +| .github/workflows/controlcheck.yml:12:5:16:25 | Job: test2 | .github/workflows/controlcheck.yml:1:1:16:25 | on: | +| .github/workflows/controlcheck.yml:12:18:12:37 | EnvironmentNotInRepo | .github/workflows/controlcheck.yml:1:1:16:25 | on: | +| .github/workflows/controlcheck.yml:12:18:12:37 | EnvironmentNotInRepo | .github/workflows/controlcheck.yml:1:1:16:25 | on: | +| .github/workflows/controlcheck.yml:12:18:12:37 | EnvironmentNotInRepo | .github/workflows/controlcheck.yml:12:5:16:25 | Job: test2 | +| .github/workflows/controlcheck.yml:12:18:12:37 | EnvironmentNotInRepo | .github/workflows/controlcheck.yml:12:5:16:25 | Job: test2 | +| .github/workflows/controlcheck.yml:12:18:12:37 | EnvironmentNotInRepo | .github/workflows/controlcheck.yml:12:18:12:37 | EnvironmentNotInRepo | +| .github/workflows/controlcheck.yml:12:18:12:37 | EnvironmentNotInRepo | .github/workflows/controlcheck.yml:12:18:12:37 | EnvironmentNotInRepo | +| .github/workflows/controlcheck.yml:13:14:13:26 | ubuntu-latest | .github/workflows/controlcheck.yml:1:1:16:25 | on: | +| .github/workflows/controlcheck.yml:13:14:13:26 | ubuntu-latest | .github/workflows/controlcheck.yml:12:5:16:25 | Job: test2 | +| .github/workflows/controlcheck.yml:15:9:16:25 | Run Step | .github/workflows/controlcheck.yml:12:5:16:25 | Job: test2 | +| .github/workflows/controlcheck.yml:15:15:15:20 | Test 2 | .github/workflows/controlcheck.yml:1:1:16:25 | on: | +| .github/workflows/controlcheck.yml:15:15:15:20 | Test 2 | .github/workflows/controlcheck.yml:12:5:16:25 | Job: test2 | +| .github/workflows/controlcheck.yml:15:15:15:20 | Test 2 | .github/workflows/controlcheck.yml:15:9:16:25 | Run Step | +| .github/workflows/controlcheck.yml:16:14:16:25 | echo "test2" | .github/workflows/controlcheck.yml:1:1:16:25 | on: | +| .github/workflows/controlcheck.yml:16:14:16:25 | echo "test2" | .github/workflows/controlcheck.yml:12:5:16:25 | Job: test2 | +| .github/workflows/controlcheck.yml:16:14:16:25 | echo "test2" | .github/workflows/controlcheck.yml:15:9:16:25 | Run Step | | .github/workflows/expression_nodes.yml:1:5:1:17 | issue_comment | .github/workflows/expression_nodes.yml:1:1:21:47 | on: issue_comment | | .github/workflows/expression_nodes.yml:1:5:1:17 | issue_comment | .github/workflows/expression_nodes.yml:1:1:21:47 | on: issue_comment | | .github/workflows/expression_nodes.yml:1:5:1:17 | issue_comment | .github/workflows/expression_nodes.yml:1:5:1:17 | issue_comment | @@ -905,6 +955,16 @@ cfgNodes | .github/workflows/commands.yml:35:14:36:30 | command1 ; command2\n | | .github/workflows/commands.yml:37:9:39:30 | Run Step | | .github/workflows/commands.yml:38:14:39:30 | command3 \| command4\n | +| .github/workflows/controlcheck.yml:1:1:16:25 | enter on: | +| .github/workflows/controlcheck.yml:1:1:16:25 | exit on: | +| .github/workflows/controlcheck.yml:1:1:16:25 | exit on: (normal) | +| .github/workflows/controlcheck.yml:1:1:16:25 | on: | +| .github/workflows/controlcheck.yml:6:5:11:2 | Job: test1 | +| .github/workflows/controlcheck.yml:9:9:11:2 | Run Step | +| .github/workflows/controlcheck.yml:10:14:10:25 | echo "test1" | +| .github/workflows/controlcheck.yml:12:5:16:25 | Job: test2 | +| .github/workflows/controlcheck.yml:15:9:16:25 | Run Step | +| .github/workflows/controlcheck.yml:16:14:16:25 | echo "test2" | | .github/workflows/expression_nodes.yml:1:1:21:47 | enter on: issue_comment | | .github/workflows/expression_nodes.yml:1:1:21:47 | exit on: issue_comment | | .github/workflows/expression_nodes.yml:1:1:21:47 | exit on: issue_comment (normal) | @@ -1140,6 +1200,12 @@ dfNodes | .github/workflows/commands.yml:35:14:36:30 | command1 ; command2\n | | .github/workflows/commands.yml:37:9:39:30 | Run Step | | .github/workflows/commands.yml:38:14:39:30 | command3 \| command4\n | +| .github/workflows/controlcheck.yml:6:5:11:2 | Job: test1 | +| .github/workflows/controlcheck.yml:9:9:11:2 | Run Step | +| .github/workflows/controlcheck.yml:10:14:10:25 | echo "test1" | +| .github/workflows/controlcheck.yml:12:5:16:25 | Job: test2 | +| .github/workflows/controlcheck.yml:15:9:16:25 | Run Step | +| .github/workflows/controlcheck.yml:16:14:16:25 | echo "test2" | | .github/workflows/expression_nodes.yml:5:5:21:47 | Job: echo-chamber | | .github/workflows/expression_nodes.yml:7:9:8:6 | Run Step | | .github/workflows/expression_nodes.yml:7:14:7:58 | LINE 1echo '${{ github.event.comment.body }}' | @@ -1353,6 +1419,12 @@ nodeLocations | .github/workflows/commands.yml:35:14:36:30 | command1 ; command2\n | .github/workflows/commands.yml:35:14:36:30 | .github/workflows/commands.yml@35:14:36:30 | | .github/workflows/commands.yml:37:9:39:30 | Run Step | .github/workflows/commands.yml:37:9:39:30 | .github/workflows/commands.yml@37:9:39:30 | | .github/workflows/commands.yml:38:14:39:30 | command3 \| command4\n | .github/workflows/commands.yml:38:14:39:30 | .github/workflows/commands.yml@38:14:39:30 | +| .github/workflows/controlcheck.yml:6:5:11:2 | Job: test1 | .github/workflows/controlcheck.yml:6:5:11:2 | .github/workflows/controlcheck.yml@6:5:11:2 | +| .github/workflows/controlcheck.yml:9:9:11:2 | Run Step | .github/workflows/controlcheck.yml:9:9:11:2 | .github/workflows/controlcheck.yml@9:9:11:2 | +| .github/workflows/controlcheck.yml:10:14:10:25 | echo "test1" | .github/workflows/controlcheck.yml:10:14:10:25 | .github/workflows/controlcheck.yml@10:14:10:25 | +| .github/workflows/controlcheck.yml:12:5:16:25 | Job: test2 | .github/workflows/controlcheck.yml:12:5:16:25 | .github/workflows/controlcheck.yml@12:5:16:25 | +| .github/workflows/controlcheck.yml:15:9:16:25 | Run Step | .github/workflows/controlcheck.yml:15:9:16:25 | .github/workflows/controlcheck.yml@15:9:16:25 | +| .github/workflows/controlcheck.yml:16:14:16:25 | echo "test2" | .github/workflows/controlcheck.yml:16:14:16:25 | .github/workflows/controlcheck.yml@16:14:16:25 | | .github/workflows/expression_nodes.yml:5:5:21:47 | Job: echo-chamber | .github/workflows/expression_nodes.yml:5:5:21:47 | .github/workflows/expression_nodes.yml@5:5:21:47 | | .github/workflows/expression_nodes.yml:7:9:8:6 | Run Step | .github/workflows/expression_nodes.yml:7:9:8:6 | .github/workflows/expression_nodes.yml@7:9:8:6 | | .github/workflows/expression_nodes.yml:7:14:7:58 | LINE 1echo '${{ github.event.comment.body }}' | .github/workflows/expression_nodes.yml:7:14:7:58 | .github/workflows/expression_nodes.yml@7:14:7:58 | @@ -1541,6 +1613,7 @@ nodeLocations | .github/workflows/test.yml:40:20:40:53 | needs.job1.outputs.job_output | .github/workflows/test.yml:40:20:40:53 | .github/workflows/test.yml@40:20:40:53 | scopes | .github/workflows/commands.yml:1:1:39:30 | on: push | +| .github/workflows/controlcheck.yml:1:1:16:25 | on: | | .github/workflows/expression_nodes.yml:1:1:21:47 | on: issue_comment | | .github/workflows/many_strings.yml:1:1:18:1211 | on: | | .github/workflows/multiline2.yml:1:1:89:35 | on: | From 4c821dd0055ad0ca86e6300c96ecfd303219a0c2 Mon Sep 17 00:00:00 2001 From: Mauro Baluda Date: Tue, 28 Jul 2026 10:58:12 +0200 Subject: [PATCH 0051/2098] Update java/ql/lib/ext/io.micronaut.http.model.yml Co-authored-by: Owen Mansel-Chan <62447351+owen-mc@users.noreply.github.com> --- java/ql/lib/ext/io.micronaut.http.model.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/ql/lib/ext/io.micronaut.http.model.yml b/java/ql/lib/ext/io.micronaut.http.model.yml index 53edff0983ec..5fd2053e4e29 100644 --- a/java/ql/lib/ext/io.micronaut.http.model.yml +++ b/java/ql/lib/ext/io.micronaut.http.model.yml @@ -4,8 +4,8 @@ extensions: extensible: sourceModel data: - ["io.micronaut.http", "HttpRequest", True, "getBody", "", "", "ReturnValue", "remote", "manual"] - - ["io.micronaut.http", "HttpRequest", True, "getHeaders", "", "", "ReturnValue", "remote", "manual"] - - ["io.micronaut.http", "HttpRequest", True, "getParameters", "", "", "ReturnValue", "remote", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "getHeaders", "", "", "ReturnValue.Element.MapValue.Element", "remote", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "getParameters", "", "", "ReturnValue.Element.MapValue.Element.Element.MapValue", "remote", "manual"] - ["io.micronaut.http", "HttpRequest", True, "getCookies", "", "", "ReturnValue", "remote", "manual"] - ["io.micronaut.http", "HttpRequest", True, "getUri", "", "", "ReturnValue", "remote", "manual"] - ["io.micronaut.http", "HttpRequest", True, "getPath", "", "", "ReturnValue", "remote", "manual"] From 2512213851a3b8e645632aeed1b2ae89ca64080f Mon Sep 17 00:00:00 2001 From: Mauro Baluda Date: Tue, 28 Jul 2026 10:58:30 +0200 Subject: [PATCH 0052/2098] Update java/ql/test/library-tests/frameworks/micronaut/MicronautConfigTest.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../frameworks/micronaut/MicronautConfigTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/java/ql/test/library-tests/frameworks/micronaut/MicronautConfigTest.java b/java/ql/test/library-tests/frameworks/micronaut/MicronautConfigTest.java index f5e8a36cda80..f8cd7a446690 100644 --- a/java/ql/test/library-tests/frameworks/micronaut/MicronautConfigTest.java +++ b/java/ql/test/library-tests/frameworks/micronaut/MicronautConfigTest.java @@ -15,16 +15,16 @@ void sink(Object o) {} @Get("/secret") void testValueField() { - sink(secretValue); + sink(secretValue); // $hasTaintFlow } @Get("/key") void testPropertyField() { - sink(apiKey); + sink(apiKey); // $hasTaintFlow } @Get("/param") void testValueParam(@Value("${app.name}") String appName) { - sink(appName); + sink(appName); // $hasTaintFlow } } From 3bf0c86ad9258c08a5c8b172864ead23c3a131c3 Mon Sep 17 00:00:00 2001 From: Mauro Baluda Date: Tue, 28 Jul 2026 10:59:48 +0200 Subject: [PATCH 0053/2098] Update java/ql/test/library-tests/dataflow/taintsources/MicronautConfig.java Co-authored-by: Owen Mansel-Chan <62447351+owen-mc@users.noreply.github.com> --- .../library-tests/dataflow/taintsources/MicronautConfig.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/java/ql/test/library-tests/dataflow/taintsources/MicronautConfig.java b/java/ql/test/library-tests/dataflow/taintsources/MicronautConfig.java index 4b2367fec27e..2661a4ac70b6 100644 --- a/java/ql/test/library-tests/dataflow/taintsources/MicronautConfig.java +++ b/java/ql/test/library-tests/dataflow/taintsources/MicronautConfig.java @@ -23,6 +23,11 @@ void testPropertyField() { sink(apiKey); // $hasLocalValueFlow } + @Get("/param") + void testPropertyParam(@Property(name = "app.api-key") String appName) { + sink(appName); // $hasLocalValueFlow + } + @Get("/param") void testValueParam(@Value("${app.name}") String appName) { sink(appName); // $hasLocalValueFlow From 6ac1a72c6100b6bc309754448c2f234b5be6ad77 Mon Sep 17 00:00:00 2001 From: Nicolas Will Date: Tue, 28 Jul 2026 21:03:58 +0200 Subject: [PATCH 0054/2098] Address Micronaut modeling review feedback --- .../io.micronaut.context.annotation.model.yml | 7 + .../ext/io.micronaut.http.client.model.yml | 44 +- java/ql/lib/ext/io.micronaut.http.model.yml | 59 +- .../lib/ext/io.micronaut.http.uri.model.yml | 28 + .../semmle/code/java/dataflow/FlowSources.qll | 11 - .../frameworks/micronaut/MicronautConfig.qll | 41 - .../micronaut/MicronautController.qll | 56 +- .../micronaut/MicronautWebSocket.qll | 6 +- .../micronaut/MicronautConfigTest.java | 30 - .../micronaut/MicronautControllerTest.java | 33 +- .../micronaut/MicronautHttpClientTest.java | 78 + .../micronaut/MicronautHttpRequestTest.java | 22 +- .../micronaut/MicronautWebSocketTest.java | 8 + .../tests/MicronautResponseSplitting.java | 7 + .../semmle/tests/ResponseSplitting.expected | 34 +- .../semmle/tests/MicronautUrlRedirect.java | 15 + .../CWE-601/semmle/tests/UrlRedirect.expected | 43 +- .../security/CWE-918/MicronautSSRF.java | 16 + .../security/CWE-918/RequestForgery.expected | 1727 +++++++++-------- .../convert/value/ConvertibleMultiValues.java | 10 + .../core/convert/value/ConvertibleValues.java | 15 + .../io/micronaut/core/type/Argument.java | 4 + .../io/micronaut/http/HttpHeaders.java | 9 +- .../io/micronaut/http/HttpParameters.java | 8 +- .../io/micronaut/http/HttpRequest.java | 9 + .../io/micronaut/http/HttpResponse.java | 3 + .../http/client/BlockingHttpClient.java | 9 + .../io/micronaut/http/client/HttpClient.java | 14 + .../io/micronaut/http/uri/UriBuilder.java | 6 + .../io/micronaut/websocket/CloseReason.java | 4 + 30 files changed, 1303 insertions(+), 1053 deletions(-) create mode 100644 java/ql/lib/ext/io.micronaut.context.annotation.model.yml create mode 100644 java/ql/lib/ext/io.micronaut.http.uri.model.yml delete mode 100644 java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautConfig.qll delete mode 100644 java/ql/test/library-tests/frameworks/micronaut/MicronautConfigTest.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/core/convert/value/ConvertibleMultiValues.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/core/convert/value/ConvertibleValues.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/core/type/Argument.java create mode 100644 java/ql/test/stubs/micronaut-4.x/io/micronaut/websocket/CloseReason.java diff --git a/java/ql/lib/ext/io.micronaut.context.annotation.model.yml b/java/ql/lib/ext/io.micronaut.context.annotation.model.yml new file mode 100644 index 000000000000..816b47eaf5d3 --- /dev/null +++ b/java/ql/lib/ext/io.micronaut.context.annotation.model.yml @@ -0,0 +1,7 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: sourceModel + data: + - ["io.micronaut.context.annotation", "Property", True, "", "", "Annotated", "", "environment", "manual"] + - ["io.micronaut.context.annotation", "Value", True, "", "", "Annotated", "", "environment", "manual"] diff --git a/java/ql/lib/ext/io.micronaut.http.client.model.yml b/java/ql/lib/ext/io.micronaut.http.client.model.yml index 05741c4902de..1ecbe3c2b869 100644 --- a/java/ql/lib/ext/io.micronaut.http.client.model.yml +++ b/java/ql/lib/ext/io.micronaut.http.client.model.yml @@ -3,31 +3,33 @@ extensions: pack: codeql/java-all extensible: sinkModel data: - # HttpClient.toBlocking() returns BlockingHttpClient; retrieve/exchange with String URL are SSRF sinks - - ["io.micronaut.http.client", "BlockingHttpClient", True, "retrieve", "(String)", "", "Argument[0]", "request-forgery", "manual"] - - ["io.micronaut.http.client", "BlockingHttpClient", True, "retrieve", "(String,Class)", "", "Argument[0]", "request-forgery", "manual"] + - ["io.micronaut.http.client", "BlockingHttpClient", True, "exchange", "(HttpRequest)", "", "Argument[0]", "request-forgery", "manual"] + - ["io.micronaut.http.client", "BlockingHttpClient", True, "exchange", "(HttpRequest,Argument)", "", "Argument[0]", "request-forgery", "manual"] + - ["io.micronaut.http.client", "BlockingHttpClient", True, "exchange", "(HttpRequest,Argument,Argument)", "", "Argument[0]", "request-forgery", "manual"] + - ["io.micronaut.http.client", "BlockingHttpClient", True, "exchange", "(HttpRequest,Class)", "", "Argument[0]", "request-forgery", "manual"] - ["io.micronaut.http.client", "BlockingHttpClient", True, "exchange", "(String)", "", "Argument[0]", "request-forgery", "manual"] - ["io.micronaut.http.client", "BlockingHttpClient", True, "exchange", "(String,Class)", "", "Argument[0]", "request-forgery", "manual"] + - ["io.micronaut.http.client", "BlockingHttpClient", True, "exchange", "(String,Class,Class)", "", "Argument[0]", "request-forgery", "manual"] + - ["io.micronaut.http.client", "BlockingHttpClient", True, "retrieve", "(HttpRequest)", "", "Argument[0]", "request-forgery", "manual"] + - ["io.micronaut.http.client", "BlockingHttpClient", True, "retrieve", "(HttpRequest,Argument)", "", "Argument[0]", "request-forgery", "manual"] + - ["io.micronaut.http.client", "BlockingHttpClient", True, "retrieve", "(HttpRequest,Argument,Argument)", "", "Argument[0]", "request-forgery", "manual"] + - ["io.micronaut.http.client", "BlockingHttpClient", True, "retrieve", "(HttpRequest,Class)", "", "Argument[0]", "request-forgery", "manual"] + - ["io.micronaut.http.client", "BlockingHttpClient", True, "retrieve", "(String)", "", "Argument[0]", "request-forgery", "manual"] + - ["io.micronaut.http.client", "BlockingHttpClient", True, "retrieve", "(String,Class)", "", "Argument[0]", "request-forgery", "manual"] + - ["io.micronaut.http.client", "BlockingHttpClient", True, "retrieve", "(String,Class,Class)", "", "Argument[0]", "request-forgery", "manual"] + - ["io.micronaut.http.client", "HttpClient", True, "exchange", "(HttpRequest)", "", "Argument[0]", "request-forgery", "manual"] + - ["io.micronaut.http.client", "HttpClient", True, "exchange", "(HttpRequest,Argument)", "", "Argument[0]", "request-forgery", "manual"] + - ["io.micronaut.http.client", "HttpClient", True, "exchange", "(HttpRequest,Argument,Argument)", "", "Argument[0]", "request-forgery", "manual"] + - ["io.micronaut.http.client", "HttpClient", True, "exchange", "(HttpRequest,Class)", "", "Argument[0]", "request-forgery", "manual"] + - ["io.micronaut.http.client", "HttpClient", True, "exchange", "(String)", "", "Argument[0]", "request-forgery", "manual"] + - ["io.micronaut.http.client", "HttpClient", True, "exchange", "(String,Class)", "", "Argument[0]", "request-forgery", "manual"] + - ["io.micronaut.http.client", "HttpClient", True, "retrieve", "(HttpRequest)", "", "Argument[0]", "request-forgery", "manual"] + - ["io.micronaut.http.client", "HttpClient", True, "retrieve", "(HttpRequest,Argument)", "", "Argument[0]", "request-forgery", "manual"] + - ["io.micronaut.http.client", "HttpClient", True, "retrieve", "(HttpRequest,Argument,Argument)", "", "Argument[0]", "request-forgery", "manual"] + - ["io.micronaut.http.client", "HttpClient", True, "retrieve", "(HttpRequest,Class)", "", "Argument[0]", "request-forgery", "manual"] + - ["io.micronaut.http.client", "HttpClient", True, "retrieve", "(String)", "", "Argument[0]", "request-forgery", "manual"] - addsTo: pack: codeql/java-all extensible: summaryModel data: - # HttpClient.toBlocking() taint propagation - ["io.micronaut.http.client", "HttpClient", True, "toBlocking", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - # HttpRequest.GET/POST/PUT/DELETE/PATCH factory methods propagate URI taint - - ["io.micronaut.http", "HttpRequest", True, "GET", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["io.micronaut.http", "HttpRequest", True, "POST", "(String,Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["io.micronaut.http", "HttpRequest", True, "PUT", "(String,Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["io.micronaut.http", "HttpRequest", True, "DELETE", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["io.micronaut.http", "HttpRequest", True, "PATCH", "(String,Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["io.micronaut.http", "HttpRequest", True, "HEAD", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["io.micronaut.http", "HttpRequest", True, "OPTIONS", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - # UriBuilder taint propagation - - ["io.micronaut.http.uri", "UriBuilder", True, "of", "(CharSequence)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["io.micronaut.http.uri", "UriBuilder", True, "of", "(URI)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["io.micronaut.http.uri", "UriBuilder", True, "host", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["io.micronaut.http.uri", "UriBuilder", True, "path", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["io.micronaut.http.uri", "UriBuilder", True, "queryParam", "(String,Object[])", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["io.micronaut.http.uri", "UriBuilder", True, "queryParam", "(String,Object[])", "", "Argument[1].ArrayElement", "ReturnValue", "taint", "manual"] - - ["io.micronaut.http.uri", "UriBuilder", True, "fragment", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["io.micronaut.http.uri", "UriBuilder", True, "build", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] diff --git a/java/ql/lib/ext/io.micronaut.http.model.yml b/java/ql/lib/ext/io.micronaut.http.model.yml index 5fd2053e4e29..6e6d30ff2681 100644 --- a/java/ql/lib/ext/io.micronaut.http.model.yml +++ b/java/ql/lib/ext/io.micronaut.http.model.yml @@ -4,35 +4,56 @@ extensions: extensible: sourceModel data: - ["io.micronaut.http", "HttpRequest", True, "getBody", "", "", "ReturnValue", "remote", "manual"] - - ["io.micronaut.http", "HttpRequest", True, "getHeaders", "", "", "ReturnValue.Element.MapValue.Element", "remote", "manual"] - - ["io.micronaut.http", "HttpRequest", True, "getParameters", "", "", "ReturnValue.Element.MapValue.Element.Element.MapValue", "remote", "manual"] - - ["io.micronaut.http", "HttpRequest", True, "getCookies", "", "", "ReturnValue", "remote", "manual"] - - ["io.micronaut.http", "HttpRequest", True, "getUri", "", "", "ReturnValue", "remote", "manual"] - - ["io.micronaut.http", "HttpRequest", True, "getPath", "", "", "ReturnValue", "remote", "manual"] - - ["io.micronaut.http", "HttpRequest", True, "getContentType", "", "", "ReturnValue", "remote", "manual"] - ["io.micronaut.http", "HttpRequest", True, "getContentLength", "", "", "ReturnValue", "remote", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "getContentType", "", "", "ReturnValue", "remote", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "getCookies", "", "", "ReturnValue", "remote", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "getHeaders", "", "", "ReturnValue", "remote", "manual"] - ["io.micronaut.http", "HttpRequest", True, "getMethodName", "", "", "ReturnValue", "remote", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "getParameters", "", "", "ReturnValue", "remote", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "getPath", "", "", "ReturnValue", "remote", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "getUri", "", "", "ReturnValue", "remote", "manual"] - addsTo: pack: codeql/java-all extensible: summaryModel data: - - ["io.micronaut.http", "HttpHeaders", True, "get", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - - ["io.micronaut.http", "HttpHeaders", True, "getAll", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - - ["io.micronaut.http", "HttpHeaders", True, "getFirst", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - - ["io.micronaut.http", "HttpHeaders", True, "values", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - - ["io.micronaut.http", "HttpParameters", True, "get", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - - ["io.micronaut.http", "HttpParameters", True, "getAll", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - - ["io.micronaut.http", "HttpParameters", True, "getFirst", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - - ["io.micronaut.http.cookie", "Cookies", True, "get", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - - ["io.micronaut.http.cookie", "Cookies", True, "getAll", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - - ["io.micronaut.http.cookie", "Cookies", True, "findCookie", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - - ["io.micronaut.http.cookie", "Cookie", True, "getValue", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - - ["io.micronaut.http.cookie", "Cookie", True, "getName", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.core.convert.value", "ConvertibleMultiValues", True, "get", "", "", "Argument[this].Element.MapValue", "ReturnValue", "taint", "manual"] + - ["io.micronaut.core.convert.value", "ConvertibleMultiValues", True, "getAll", "", "", "Argument[this].Element.MapValue", "ReturnValue", "value", "manual"] + - ["io.micronaut.core.convert.value", "ConvertibleMultiValues", True, "getFirst", "", "", "Argument[this].Element.MapValue", "ReturnValue", "taint", "manual"] + - ["io.micronaut.core.convert.value", "ConvertibleValues", True, "asMap", "", "", "Argument[this].Element.MapValue", "ReturnValue.MapValue", "taint", "manual"] + - ["io.micronaut.core.convert.value", "ConvertibleValues", True, "asProperties", "", "", "Argument[this].Element.MapValue", "ReturnValue.MapValue", "taint", "manual"] + - ["io.micronaut.core.convert.value", "ConvertibleValues", True, "getValue", "", "", "Argument[this].Element.MapValue", "ReturnValue", "taint", "manual"] + - ["io.micronaut.core.convert.value", "ConvertibleValues", True, "subMap", "", "", "Argument[this].Element.MapValue", "ReturnValue.MapValue", "taint", "manual"] + - ["io.micronaut.core.convert.value", "ConvertibleValues", True, "values", "", "", "Argument[this].Element.MapValue", "ReturnValue.Element", "taint", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "DELETE", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "DELETE", "(String,Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "DELETE", "(URI)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "DELETE", "(URI,Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "GET", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "GET", "(URI)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "HEAD", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "HEAD", "(URI)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "OPTIONS", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "OPTIONS", "(URI)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "PATCH", "(String,Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "PATCH", "(URI,Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "POST", "(String,Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "POST", "(URI,Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "PUT", "(String,Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http", "HttpRequest", True, "PUT", "(URI,Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["io.micronaut.http.cookie", "Cookie", True, "getDomain", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http.cookie", "Cookie", True, "getName", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["io.micronaut.http.cookie", "Cookie", True, "getPath", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http.cookie", "Cookie", True, "getValue", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http.cookie", "Cookies", True, "findCookie", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http.cookie", "Cookies", True, "get", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http.cookie", "Cookies", True, "getAll", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - addsTo: pack: codeql/java-all extensible: sinkModel data: - - ["io.micronaut.http", "MutableHttpResponse", True, "header", "(CharSequence,CharSequence)", "", "Argument[1]", "response-splitting", "manual"] + - ["io.micronaut.http", "HttpResponse", True, "permanentRedirect", "(URI)", "", "Argument[0]", "url-redirection", "manual"] - ["io.micronaut.http", "HttpResponse", True, "redirect", "(URI)", "", "Argument[0]", "url-redirection", "manual"] + - ["io.micronaut.http", "HttpResponse", True, "seeOther", "(URI)", "", "Argument[0]", "url-redirection", "manual"] + - ["io.micronaut.http", "HttpResponse", True, "temporaryRedirect", "(URI)", "", "Argument[0]", "url-redirection", "manual"] + - ["io.micronaut.http", "MutableHttpResponse", True, "header", "(CharSequence,CharSequence)", "", "Argument[1]", "response-splitting", "manual"] + - ["io.micronaut.http", "MutableHttpResponse", True, "headers", "(Map)", "", "Argument[0]", "response-splitting", "manual"] diff --git a/java/ql/lib/ext/io.micronaut.http.uri.model.yml b/java/ql/lib/ext/io.micronaut.http.uri.model.yml new file mode 100644 index 000000000000..61ce1391b93a --- /dev/null +++ b/java/ql/lib/ext/io.micronaut.http.uri.model.yml @@ -0,0 +1,28 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: summaryModel + data: + - ["io.micronaut.http.uri", "UriBuilder", True, "build", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http.uri", "UriBuilder", True, "expand", "(Map)", "", "Argument[0].MapValue", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http.uri", "UriBuilder", True, "expand", "(Map)", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http.uri", "UriBuilder", True, "fragment", "(String)", "", "Argument[0]", "Argument[this]", "taint", "manual"] + - ["io.micronaut.http.uri", "UriBuilder", True, "fragment", "(String)", "", "Argument[this]", "ReturnValue", "value", "manual"] + - ["io.micronaut.http.uri", "UriBuilder", True, "host", "(String)", "", "Argument[0]", "Argument[this]", "taint", "manual"] + - ["io.micronaut.http.uri", "UriBuilder", True, "host", "(String)", "", "Argument[this]", "ReturnValue", "value", "manual"] + - ["io.micronaut.http.uri", "UriBuilder", True, "of", "(CharSequence)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http.uri", "UriBuilder", True, "of", "(URI)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http.uri", "UriBuilder", True, "path", "(String)", "", "Argument[0]", "Argument[this]", "taint", "manual"] + - ["io.micronaut.http.uri", "UriBuilder", True, "path", "(String)", "", "Argument[this]", "ReturnValue", "value", "manual"] + - ["io.micronaut.http.uri", "UriBuilder", True, "queryParam", "(String,Object[])", "", "Argument[0]", "Argument[this]", "taint", "manual"] + - ["io.micronaut.http.uri", "UriBuilder", True, "queryParam", "(String,Object[])", "", "Argument[1].ArrayElement", "Argument[this]", "taint", "manual"] + - ["io.micronaut.http.uri", "UriBuilder", True, "queryParam", "(String,Object[])", "", "Argument[this]", "ReturnValue", "value", "manual"] + - ["io.micronaut.http.uri", "UriBuilder", True, "replacePath", "(String)", "", "Argument[0]", "Argument[this]", "taint", "manual"] + - ["io.micronaut.http.uri", "UriBuilder", True, "replacePath", "(String)", "", "Argument[this]", "ReturnValue", "value", "manual"] + - ["io.micronaut.http.uri", "UriBuilder", True, "replaceQueryParam", "(String,Object[])", "", "Argument[0]", "Argument[this]", "taint", "manual"] + - ["io.micronaut.http.uri", "UriBuilder", True, "replaceQueryParam", "(String,Object[])", "", "Argument[1].ArrayElement", "Argument[this]", "taint", "manual"] + - ["io.micronaut.http.uri", "UriBuilder", True, "replaceQueryParam", "(String,Object[])", "", "Argument[this]", "ReturnValue", "value", "manual"] + - ["io.micronaut.http.uri", "UriBuilder", True, "scheme", "(String)", "", "Argument[0]", "Argument[this]", "taint", "manual"] + - ["io.micronaut.http.uri", "UriBuilder", True, "scheme", "(String)", "", "Argument[this]", "ReturnValue", "value", "manual"] + - ["io.micronaut.http.uri", "UriBuilder", True, "userInfo", "(String)", "", "Argument[0]", "Argument[this]", "taint", "manual"] + - ["io.micronaut.http.uri", "UriBuilder", True, "userInfo", "(String)", "", "Argument[this]", "ReturnValue", "value", "manual"] diff --git a/java/ql/lib/semmle/code/java/dataflow/FlowSources.qll b/java/ql/lib/semmle/code/java/dataflow/FlowSources.qll index 41aca7a05c41..565ceb01a7b8 100644 --- a/java/ql/lib/semmle/code/java/dataflow/FlowSources.qll +++ b/java/ql/lib/semmle/code/java/dataflow/FlowSources.qll @@ -32,7 +32,6 @@ import semmle.code.java.frameworks.Thrift import semmle.code.java.frameworks.javaee.jsf.JSFRenderer import semmle.code.java.frameworks.micronaut.MicronautController import semmle.code.java.frameworks.micronaut.MicronautWebSocket -import semmle.code.java.frameworks.micronaut.MicronautConfig private import semmle.code.java.dataflow.ExternalFlow private import codeql.threatmodels.ThreatModels @@ -204,16 +203,6 @@ private class MicronautWebSocketParameterSource extends RemoteFlowSource { override string getSourceType() { result = "Micronaut WebSocket parameter" } } -private class MicronautConfigSource extends LocalUserInput { - MicronautConfigSource() { - this.asExpr() = any(MicronautConfigField f).getAnAccess() - or - this.asParameter() instanceof MicronautConfigParameter - } - - override string getThreatModel() { result = "environment" } -} - private class MicronautErrorHandlerSource extends RemoteFlowSource { MicronautErrorHandlerSource() { this.asParameter() = any(MicronautErrorHandler h).getARemoteParameter() diff --git a/java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautConfig.qll b/java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautConfig.qll deleted file mode 100644 index 3d1b3c5126b3..000000000000 --- a/java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautConfig.qll +++ /dev/null @@ -1,41 +0,0 @@ -/** Provides classes for identifying Micronaut configuration injection sources. */ -overlay[local?] -module; - -import java - -/** The annotation type `@Value` from `io.micronaut.context.annotation`. */ -class MicronautValueAnnotation extends AnnotationType { - MicronautValueAnnotation() { this.hasQualifiedName("io.micronaut.context.annotation", "Value") } -} - -/** The annotation type `@Property` from `io.micronaut.context.annotation`. */ -class MicronautPropertyAnnotation extends AnnotationType { - MicronautPropertyAnnotation() { - this.hasQualifiedName("io.micronaut.context.annotation", "Property") - } -} - -/** - * A field annotated with Micronaut's `@Value` or `@Property` annotation, - * representing an injected configuration value. - */ -class MicronautConfigField extends Field { - MicronautConfigField() { - this.getAnAnnotation().getType() instanceof MicronautValueAnnotation - or - this.getAnAnnotation().getType() instanceof MicronautPropertyAnnotation - } -} - -/** - * A parameter annotated with Micronaut's `@Value` or `@Property` annotation, - * representing an injected configuration value. - */ -class MicronautConfigParameter extends Parameter { - MicronautConfigParameter() { - this.getAnAnnotation().getType() instanceof MicronautValueAnnotation - or - this.getAnAnnotation().getType() instanceof MicronautPropertyAnnotation - } -} diff --git a/java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautController.qll b/java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautController.qll index 5be5308b3661..c0ca30d97995 100644 --- a/java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautController.qll +++ b/java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautController.qll @@ -59,6 +59,25 @@ class MicronautHttpInputAnnotation extends Annotation { } } +/** Holds if `parameter` is explicitly bound to remote HTTP request data. */ +private predicate isExplicitlyTaintedInput(Parameter parameter) { + parameter.getAnAnnotation() instanceof MicronautHttpInputAnnotation + or + parameter.getAnAnnotation().getType() instanceof MicronautRequestBeanAnnotation + or + parameter + .getType() + .(RefType) + .getASourceSupertype*() + .hasQualifiedName("io.micronaut.http", ["HttpRequest", "HttpHeaders", "HttpParameters"]) + or + parameter + .getType() + .(RefType) + .getASourceSupertype*() + .hasQualifiedName("io.micronaut.http.cookie", "Cookies") +} + /** A parameter of a `MicronautRequestMappingMethod`. */ class MicronautRequestMappingParameter extends Parameter { MicronautRequestMappingParameter() { this.getCallable() instanceof MicronautRequestMappingMethod } @@ -67,11 +86,6 @@ class MicronautRequestMappingParameter extends Parameter { predicate isNotDirectlyTaintedInput() { this.getType().(RefType).getAnAncestor().hasQualifiedName("io.micronaut.http", "HttpResponse") or - this.getType() - .(RefType) - .getAnAncestor() - .hasQualifiedName("io.micronaut.http", "MutableHttpResponse") - or this.getType().(RefType).getAnAncestor().hasQualifiedName("java.security", "Principal") or this.getType().(RefType).getAnAncestor().hasQualifiedName("java.util", "Locale") @@ -80,35 +94,19 @@ class MicronautRequestMappingParameter extends Parameter { or this.getType().(RefType).getAnAncestor().hasQualifiedName("java.time", "ZoneId") or + this.getType().(RefType).getAnAncestor() instanceof TypeInputStream + or + this.getType().(RefType).getAnAncestor().hasQualifiedName("java.io", "Reader") + or // @Value/@Property parameters are configuration injection, not HTTP input this.getAnAnnotation() .getType() .hasQualifiedName("io.micronaut.context.annotation", ["Value", "Property"]) } - private predicate isExplicitlyTaintedInput() { - // The MicronautHttpInputAnnotation allows access to the URI path, - // request parameters, cookie values, headers, and the body of the request. - this.getAnAnnotation() instanceof MicronautHttpInputAnnotation - or - // A @RequestBean parameter binds multiple request attributes into a POJO - this.getAnAnnotation().getType() instanceof MicronautRequestBeanAnnotation - or - // An HttpRequest parameter provides access to request data - this.getType() - .(RefType) - .getASourceSupertype*() - .hasQualifiedName("io.micronaut.http", "HttpRequest") - or - // InputStream or Reader parameters allow access to the body of a request - this.getType().(RefType).getAnAncestor() instanceof TypeInputStream - or - this.getType().(RefType).getAnAncestor().hasQualifiedName("java.io", "Reader") - } - /** Holds if the input is tainted (i.e. comes from user-controlled input). */ predicate isTaintedInput() { - this.isExplicitlyTaintedInput() + isExplicitlyTaintedInput(this) or not this.isNotDirectlyTaintedInput() } @@ -126,11 +124,7 @@ class MicronautErrorHandler extends Method { /** Gets a parameter that carries user-controlled request data. */ Parameter getARemoteParameter() { result = this.getAParameter() and - result - .getType() - .(RefType) - .getASourceSupertype*() - .hasQualifiedName("io.micronaut.http", "HttpRequest") + isExplicitlyTaintedInput(result) } } diff --git a/java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautWebSocket.qll b/java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautWebSocket.qll index eafbca58e69c..8f4fdfb58f30 100644 --- a/java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautWebSocket.qll +++ b/java/ql/lib/semmle/code/java/frameworks/micronaut/MicronautWebSocket.qll @@ -26,7 +26,7 @@ class MicronautServerWebSocketClass extends Class { class MicronautWebSocketHandlerAnnotation extends AnnotationType { MicronautWebSocketHandlerAnnotation() { this.getPackage().hasName("io.micronaut.websocket.annotation") and - this.hasName(["OnMessage", "OnOpen"]) + this.hasName(["OnClose", "OnMessage", "OnOpen"]) } } @@ -44,10 +44,10 @@ class MicronautWebSocketMessageHandler extends Method { class MicronautWebSocketParameter extends Parameter { MicronautWebSocketParameter() { this.getCallable() instanceof MicronautWebSocketMessageHandler and - // Exclude WebSocketSession parameters + // Exclude framework-provided WebSocket lifecycle parameters not this.getType() .(RefType) .getAnAncestor() - .hasQualifiedName("io.micronaut.websocket", "WebSocketSession") + .hasQualifiedName("io.micronaut.websocket", ["CloseReason", "WebSocketSession"]) } } diff --git a/java/ql/test/library-tests/frameworks/micronaut/MicronautConfigTest.java b/java/ql/test/library-tests/frameworks/micronaut/MicronautConfigTest.java deleted file mode 100644 index f8cd7a446690..000000000000 --- a/java/ql/test/library-tests/frameworks/micronaut/MicronautConfigTest.java +++ /dev/null @@ -1,30 +0,0 @@ -import io.micronaut.context.annotation.Value; -import io.micronaut.context.annotation.Property; -import io.micronaut.http.annotation.*; - -@Controller("/config") -class MicronautConfigTest { - - void sink(Object o) {} - - @Value("${app.secret}") - String secretValue; - - @Property(name = "app.api-key") - String apiKey; - - @Get("/secret") - void testValueField() { - sink(secretValue); // $hasTaintFlow - } - - @Get("/key") - void testPropertyField() { - sink(apiKey); // $hasTaintFlow - } - - @Get("/param") - void testValueParam(@Value("${app.name}") String appName) { - sink(appName); // $hasTaintFlow - } -} diff --git a/java/ql/test/library-tests/frameworks/micronaut/MicronautControllerTest.java b/java/ql/test/library-tests/frameworks/micronaut/MicronautControllerTest.java index 3a1b2caaf6a0..4bc38d949b12 100644 --- a/java/ql/test/library-tests/frameworks/micronaut/MicronautControllerTest.java +++ b/java/ql/test/library-tests/frameworks/micronaut/MicronautControllerTest.java @@ -1,5 +1,6 @@ import io.micronaut.http.annotation.*; import io.micronaut.http.*; +import io.micronaut.http.cookie.Cookies; import java.io.InputStream; import java.io.Reader; @@ -58,14 +59,29 @@ void testHttpRequest(HttpRequest request) { sink(request); // $hasTaintFlow } + @Get("/headers") + void testHttpHeaders(HttpHeaders headers) { + sink(headers); // $hasTaintFlow + } + + @Get("/parameters") + void testHttpParameters(HttpParameters parameters) { + sink(parameters); // $hasTaintFlow + } + + @Get("/cookies") + void testCookies(Cookies cookies) { + sink(cookies); // $hasTaintFlow + } + @Post("/stream") - void testInputStream(InputStream stream) { + void testInputStream(@Body InputStream stream) { sink(stream); // $hasTaintFlow } @Post("/reader") void testReader(Reader reader) { - sink(reader); // $hasTaintFlow + sink(reader); } @Post("/post") @@ -92,4 +108,17 @@ void testPatchMethod(@Body String data) { void testErrorHandler(HttpRequest request) { sink(request); // $hasTaintFlow } + + @io.micronaut.http.annotation.Error + void testAnnotatedErrorHandler(@Header String header, @RequestBean Object bean) { + sink(header); // $hasTaintFlow + sink(bean); // $hasTaintFlow + } + + @io.micronaut.http.annotation.Error + void testErrorHandlerCarriers(HttpHeaders headers, HttpParameters parameters, Cookies cookies) { + sink(headers); // $hasTaintFlow + sink(parameters); // $hasTaintFlow + sink(cookies); // $hasTaintFlow + } } diff --git a/java/ql/test/library-tests/frameworks/micronaut/MicronautHttpClientTest.java b/java/ql/test/library-tests/frameworks/micronaut/MicronautHttpClientTest.java index 86e045f6f8dd..b073266a5012 100644 --- a/java/ql/test/library-tests/frameworks/micronaut/MicronautHttpClientTest.java +++ b/java/ql/test/library-tests/frameworks/micronaut/MicronautHttpClientTest.java @@ -2,7 +2,9 @@ import io.micronaut.http.client.HttpClient; import io.micronaut.http.client.BlockingHttpClient; import io.micronaut.http.uri.UriBuilder; +import io.micronaut.core.type.Argument; import java.net.URI; +import java.util.Collections; class MicronautHttpClientTest { @@ -34,6 +36,39 @@ void testExchangeStringClass() { client.toBlocking().exchange(url, String.class); // $hasTaintFlow } + void testRetrieveStringClassClass() { + client.toBlocking().retrieve(taint(), String.class, Object.class); // $hasTaintFlow + } + + void testExchangeStringClassClass() { + client.toBlocking().exchange(taint(), String.class, Object.class); // $hasTaintFlow + } + + void testBlockingRequest() { + client.toBlocking().retrieve(HttpRequest.GET(taint())); // $hasTaintFlow + client.toBlocking().retrieve(HttpRequest.GET(taint()), String.class); // $hasTaintFlow + client.toBlocking().retrieve(HttpRequest.GET(taint()), new Argument()); // $hasTaintFlow + client.toBlocking().retrieve(HttpRequest.GET(taint()), new Argument(), new Argument()); // $hasTaintFlow + client.toBlocking().exchange(HttpRequest.GET(taint())); // $hasTaintFlow + client.toBlocking().exchange(HttpRequest.GET(taint()), String.class); // $hasTaintFlow + client.toBlocking().exchange(HttpRequest.GET(taint()), new Argument()); // $hasTaintFlow + client.toBlocking().exchange(HttpRequest.GET(taint()), new Argument(), new Argument()); // $hasTaintFlow + } + + void testNonBlockingClient() { + client.retrieve(taint()); // $hasTaintFlow + client.exchange(taint()); // $hasTaintFlow + client.exchange(taint(), String.class); // $hasTaintFlow + client.retrieve(HttpRequest.GET(taint())); // $hasTaintFlow + client.retrieve(HttpRequest.GET(taint()), String.class); // $hasTaintFlow + client.retrieve(HttpRequest.GET(taint()), new Argument()); // $hasTaintFlow + client.retrieve(HttpRequest.GET(taint()), new Argument(), new Argument()); // $hasTaintFlow + client.exchange(HttpRequest.GET(taint())); // $hasTaintFlow + client.exchange(HttpRequest.GET(taint()), String.class); // $hasTaintFlow + client.exchange(HttpRequest.GET(taint()), new Argument()); // $hasTaintFlow + client.exchange(HttpRequest.GET(taint()), new Argument(), new Argument()); // $hasTaintFlow + } + void testGetFactory() { HttpRequest req = HttpRequest.GET(taint()); sink(req); // $hasTaintFlow @@ -69,6 +104,21 @@ void testOptionsFactory() { sink(req); // $hasTaintFlow } + void testUriFactories() { + sink(HttpRequest.GET(URI.create(taint()))); // $hasTaintFlow + sink(HttpRequest.POST(URI.create(taint()), "body")); // $hasTaintFlow + sink(HttpRequest.PUT(URI.create(taint()), "body")); // $hasTaintFlow + sink(HttpRequest.DELETE(URI.create(taint()))); // $hasTaintFlow + sink(HttpRequest.DELETE(URI.create(taint()), "body")); // $hasTaintFlow + sink(HttpRequest.PATCH(URI.create(taint()), "body")); // $hasTaintFlow + sink(HttpRequest.HEAD(URI.create(taint()))); // $hasTaintFlow + sink(HttpRequest.OPTIONS(URI.create(taint()))); // $hasTaintFlow + } + + void testDeleteFactoryWithBody() { + sink(HttpRequest.DELETE(taint(), "body")); // $hasTaintFlow + } + void testUriBuilderOfCharSequence() { URI uri = UriBuilder.of(taint()).build(); sink(uri); // $hasTaintFlow @@ -103,4 +153,32 @@ void testUriBuilderFragment() { URI uri = UriBuilder.of("http://example.com").fragment(taint()).build(); sink(uri); // $hasTaintFlow } + + void testUriBuilderMutation() { + UriBuilder builder = UriBuilder.of("http://example.com"); + builder.host(taint()); + sink(builder.build()); // $hasTaintFlow + } + + void testUriBuilderReplaceQueryParam() { + URI uri = UriBuilder.of("http://example.com").replaceQueryParam("key", taint()).build(); + sink(uri); // $hasTaintFlow + } + + void testUriBuilderAdditionalFluentMethods() { + sink(UriBuilder.of("http://example.com").scheme(taint()).build()); // $hasTaintFlow + sink(UriBuilder.of("http://example.com").userInfo(taint()).build()); // $hasTaintFlow + sink(UriBuilder.of("http://example.com").replacePath(taint()).build()); // $hasTaintFlow + } + + void testUriBuilderExpandBuilder() { + URI uri = UriBuilder.of(taint()).expand(Collections.singletonMap("id", "value")); + sink(uri); // $hasTaintFlow + } + + void testUriBuilderExpandValue() { + URI uri = UriBuilder.of("http://example.com/{id}") + .expand(Collections.singletonMap("id", taint())); + sink(uri); // $hasTaintFlow + } } diff --git a/java/ql/test/library-tests/frameworks/micronaut/MicronautHttpRequestTest.java b/java/ql/test/library-tests/frameworks/micronaut/MicronautHttpRequestTest.java index 0fc55343122c..b3340b6c6cb6 100644 --- a/java/ql/test/library-tests/frameworks/micronaut/MicronautHttpRequestTest.java +++ b/java/ql/test/library-tests/frameworks/micronaut/MicronautHttpRequestTest.java @@ -1,6 +1,8 @@ import io.micronaut.http.annotation.*; import io.micronaut.http.*; import io.micronaut.http.cookie.*; +import java.util.List; +import java.util.Map; @Controller("/http") class MicronautHttpRequestTest { @@ -11,17 +13,27 @@ void sink(Object o) {} void testHeaders(HttpRequest request) { sink(request.getHeaders()); // $hasTaintFlow sink(request.getHeaders().get("X-Custom")); // $hasTaintFlow - sink(request.getHeaders().getAll("X-Custom")); // $hasTaintFlow - sink(request.getHeaders().getFirst("X-Custom")); // $hasTaintFlow - sink(request.getHeaders().values()); // $hasTaintFlow + sink(request.getHeaders().getAll("X-Custom").get(0)); // $hasTaintFlow + sink(request.getHeaders().getFirst("X-Custom").get()); // $hasTaintFlow + sink(request.getHeaders().getValue("X-Custom").get(0)); // $hasTaintFlow + sink(request.getHeaders().values().iterator().next().get(0)); // $hasTaintFlow + sink(request.getHeaders().asMap().get("X-Custom").get(0)); // $hasTaintFlow + sink(request.getHeaders().asProperties().get("X-Custom")); // $hasTaintFlow + sink(request.getHeaders().subMap("X", List.class).get("Custom").get(0)); // $hasTaintFlow + for (Map.Entry> header : request.getHeaders()) { + sink(header.getValue().get(0)); // $hasTaintFlow + } } @Get("/params") void testParameters(HttpRequest request) { sink(request.getParameters()); // $hasTaintFlow sink(request.getParameters().get("q")); // $hasTaintFlow - sink(request.getParameters().getAll("q")); // $hasTaintFlow - sink(request.getParameters().getFirst("q")); // $hasTaintFlow + sink(request.getParameters().getAll("q").get(0)); // $hasTaintFlow + sink(request.getParameters().getFirst("q").get()); // $hasTaintFlow + sink(request.getParameters().getValue("q").get(0)); // $hasTaintFlow + sink(request.getParameters().values().iterator().next().get(0)); // $hasTaintFlow + sink(request.getParameters().asMap().get("q").get(0)); // $hasTaintFlow } @Get("/cookies") diff --git a/java/ql/test/library-tests/frameworks/micronaut/MicronautWebSocketTest.java b/java/ql/test/library-tests/frameworks/micronaut/MicronautWebSocketTest.java index 0c46a311b2bd..99f7a575a22b 100644 --- a/java/ql/test/library-tests/frameworks/micronaut/MicronautWebSocketTest.java +++ b/java/ql/test/library-tests/frameworks/micronaut/MicronautWebSocketTest.java @@ -1,4 +1,5 @@ import io.micronaut.websocket.annotation.*; +import io.micronaut.websocket.CloseReason; import io.micronaut.websocket.WebSocketSession; @ServerWebSocket("/chat/{room}") @@ -15,4 +16,11 @@ void onMessage(String message, WebSocketSession session) { void onOpen(String room, WebSocketSession session) { sink(room); // $hasTaintFlow } + + @OnClose + void onClose(String room, CloseReason reason, WebSocketSession session) { + sink(room); // $hasTaintFlow + sink(reason); + sink(session); + } } diff --git a/java/ql/test/query-tests/security/CWE-113/semmle/tests/MicronautResponseSplitting.java b/java/ql/test/query-tests/security/CWE-113/semmle/tests/MicronautResponseSplitting.java index 405bb66fcd4f..4ba35f86959a 100644 --- a/java/ql/test/query-tests/security/CWE-113/semmle/tests/MicronautResponseSplitting.java +++ b/java/ql/test/query-tests/security/CWE-113/semmle/tests/MicronautResponseSplitting.java @@ -3,6 +3,7 @@ import io.micronaut.http.annotation.QueryValue; import io.micronaut.http.HttpResponse; import io.micronaut.http.MutableHttpResponse; +import java.util.Collections; @Controller("/headers") public class MicronautResponseSplitting { @@ -19,4 +20,10 @@ public MutableHttpResponse good(@QueryValue String headerValue) { String sanitized = headerValue.replace('\n', ' ').replace('\r', ' '); return HttpResponse.ok().header("X-Custom", sanitized); } + + @Get("/bad-map") + public MutableHttpResponse badMap(@QueryValue String headerValue) { + // BAD: user-controlled header value + return HttpResponse.ok().headers(Collections.singletonMap("X-Custom", headerValue)); + } } diff --git a/java/ql/test/query-tests/security/CWE-113/semmle/tests/ResponseSplitting.expected b/java/ql/test/query-tests/security/CWE-113/semmle/tests/ResponseSplitting.expected index ce0916a03236..5be152141515 100644 --- a/java/ql/test/query-tests/security/CWE-113/semmle/tests/ResponseSplitting.expected +++ b/java/ql/test/query-tests/security/CWE-113/semmle/tests/ResponseSplitting.expected @@ -1,25 +1,33 @@ #select -| MicronautResponseSplitting.java:13:53:13:63 | headerValue | MicronautResponseSplitting.java:11:39:11:68 | headerValue : String | MicronautResponseSplitting.java:13:53:13:63 | headerValue | This header depends on a $@, which may cause a response-splitting vulnerability. | MicronautResponseSplitting.java:11:39:11:68 | headerValue | user-provided value | +| MicronautResponseSplitting.java:14:53:14:63 | headerValue | MicronautResponseSplitting.java:12:39:12:68 | headerValue : String | MicronautResponseSplitting.java:14:53:14:63 | headerValue | This header depends on a $@, which may cause a response-splitting vulnerability. | MicronautResponseSplitting.java:12:39:12:68 | headerValue | user-provided value | +| MicronautResponseSplitting.java:27:42:27:90 | singletonMap(...) | MicronautResponseSplitting.java:25:42:25:71 | headerValue : String | MicronautResponseSplitting.java:27:42:27:90 | singletonMap(...) | This header depends on a $@, which may cause a response-splitting vulnerability. | MicronautResponseSplitting.java:25:42:25:71 | headerValue | user-provided value | | ResponseSplitting.java:23:23:23:28 | cookie | ResponseSplitting.java:22:39:22:66 | getParameter(...) : String | ResponseSplitting.java:23:23:23:28 | cookie | This header depends on a $@, which may cause a response-splitting vulnerability. | ResponseSplitting.java:22:39:22:66 | getParameter(...) | user-provided value | | ResponseSplitting.java:28:38:28:72 | getParameter(...) | ResponseSplitting.java:28:38:28:72 | getParameter(...) | ResponseSplitting.java:28:38:28:72 | getParameter(...) | This header depends on a $@, which may cause a response-splitting vulnerability. | ResponseSplitting.java:28:38:28:72 | getParameter(...) | user-provided value | | ResponseSplitting.java:29:38:29:72 | getParameter(...) | ResponseSplitting.java:29:38:29:72 | getParameter(...) | ResponseSplitting.java:29:38:29:72 | getParameter(...) | This header depends on a $@, which may cause a response-splitting vulnerability. | ResponseSplitting.java:29:38:29:72 | getParameter(...) | user-provided value | | ResponseSplitting.java:59:27:59:57 | replaceFirst(...) | ResponseSplitting.java:53:14:53:48 | getParameter(...) : String | ResponseSplitting.java:59:27:59:57 | replaceFirst(...) | This header depends on a $@, which may cause a response-splitting vulnerability. | ResponseSplitting.java:53:14:53:48 | getParameter(...) | user-provided value | edges -| MicronautResponseSplitting.java:11:39:11:68 | headerValue : String | MicronautResponseSplitting.java:13:53:13:63 | headerValue | provenance | Sink:MaD:1 | -| ResponseSplitting.java:22:20:22:67 | new Cookie(...) : Cookie | ResponseSplitting.java:23:23:23:28 | cookie | provenance | Sink:MaD:2 | -| ResponseSplitting.java:22:39:22:66 | getParameter(...) : String | ResponseSplitting.java:22:20:22:67 | new Cookie(...) : Cookie | provenance | Src:MaD:4 MaD:6 | -| ResponseSplitting.java:53:14:53:48 | getParameter(...) : String | ResponseSplitting.java:59:27:59:27 | t : String | provenance | Src:MaD:4 | -| ResponseSplitting.java:59:27:59:27 | t : String | ResponseSplitting.java:59:27:59:57 | replaceFirst(...) | provenance | MaD:5 Sink:MaD:3 | +| MicronautResponseSplitting.java:12:39:12:68 | headerValue : String | MicronautResponseSplitting.java:14:53:14:63 | headerValue | provenance | Sink:MaD:1 | +| MicronautResponseSplitting.java:25:42:25:71 | headerValue : String | MicronautResponseSplitting.java:27:79:27:89 | headerValue : String | provenance | | +| MicronautResponseSplitting.java:27:79:27:89 | headerValue : String | MicronautResponseSplitting.java:27:42:27:90 | singletonMap(...) | provenance | MaD:7 Sink:MaD:2 | +| ResponseSplitting.java:22:20:22:67 | new Cookie(...) : Cookie | ResponseSplitting.java:23:23:23:28 | cookie | provenance | Sink:MaD:3 | +| ResponseSplitting.java:22:39:22:66 | getParameter(...) : String | ResponseSplitting.java:22:20:22:67 | new Cookie(...) : Cookie | provenance | Src:MaD:5 MaD:8 | +| ResponseSplitting.java:53:14:53:48 | getParameter(...) : String | ResponseSplitting.java:59:27:59:27 | t : String | provenance | Src:MaD:5 | +| ResponseSplitting.java:59:27:59:27 | t : String | ResponseSplitting.java:59:27:59:57 | replaceFirst(...) | provenance | MaD:6 Sink:MaD:4 | models | 1 | Sink: io.micronaut.http; MutableHttpResponse; true; header; (CharSequence,CharSequence); ; Argument[1]; response-splitting; manual | -| 2 | Sink: javax.servlet.http; HttpServletResponse; false; addCookie; ; ; Argument[0]; response-splitting; manual | -| 3 | Sink: javax.servlet.http; HttpServletResponse; false; setHeader; ; ; Argument[0..1]; response-splitting; manual | -| 4 | Source: javax.servlet; ServletRequest; false; getParameter; (String); ; ReturnValue; remote; manual | -| 5 | Summary: java.lang; String; false; replaceFirst; ; ; Argument[this]; ReturnValue; taint; manual | -| 6 | Summary: javax.servlet.http; Cookie; false; Cookie; ; ; Argument[1]; Argument[this]; taint; manual | +| 2 | Sink: io.micronaut.http; MutableHttpResponse; true; headers; (Map); ; Argument[0]; response-splitting; manual | +| 3 | Sink: javax.servlet.http; HttpServletResponse; false; addCookie; ; ; Argument[0]; response-splitting; manual | +| 4 | Sink: javax.servlet.http; HttpServletResponse; false; setHeader; ; ; Argument[0..1]; response-splitting; manual | +| 5 | Source: javax.servlet; ServletRequest; false; getParameter; (String); ; ReturnValue; remote; manual | +| 6 | Summary: java.lang; String; false; replaceFirst; ; ; Argument[this]; ReturnValue; taint; manual | +| 7 | Summary: java.util; Collections; false; singletonMap; (Object,Object); ; Argument[1]; ReturnValue.MapValue; value; manual | +| 8 | Summary: javax.servlet.http; Cookie; false; Cookie; ; ; Argument[1]; Argument[this]; taint; manual | nodes -| MicronautResponseSplitting.java:11:39:11:68 | headerValue : String | semmle.label | headerValue : String | -| MicronautResponseSplitting.java:13:53:13:63 | headerValue | semmle.label | headerValue | +| MicronautResponseSplitting.java:12:39:12:68 | headerValue : String | semmle.label | headerValue : String | +| MicronautResponseSplitting.java:14:53:14:63 | headerValue | semmle.label | headerValue | +| MicronautResponseSplitting.java:25:42:25:71 | headerValue : String | semmle.label | headerValue : String | +| MicronautResponseSplitting.java:27:42:27:90 | singletonMap(...) | semmle.label | singletonMap(...) | +| MicronautResponseSplitting.java:27:79:27:89 | headerValue : String | semmle.label | headerValue : String | | ResponseSplitting.java:22:20:22:67 | new Cookie(...) : Cookie | semmle.label | new Cookie(...) : Cookie | | ResponseSplitting.java:22:39:22:66 | getParameter(...) : String | semmle.label | getParameter(...) : String | | ResponseSplitting.java:23:23:23:28 | cookie | semmle.label | cookie | diff --git a/java/ql/test/query-tests/security/CWE-601/semmle/tests/MicronautUrlRedirect.java b/java/ql/test/query-tests/security/CWE-601/semmle/tests/MicronautUrlRedirect.java index 2eeb3b50a113..6b3b5331a027 100644 --- a/java/ql/test/query-tests/security/CWE-601/semmle/tests/MicronautUrlRedirect.java +++ b/java/ql/test/query-tests/security/CWE-601/semmle/tests/MicronautUrlRedirect.java @@ -22,4 +22,19 @@ public MutableHttpResponse good(@QueryValue String target) { } return HttpResponse.ok(); } + + @Get("/permanent") + public MutableHttpResponse permanent(@QueryValue String target) { + return HttpResponse.permanentRedirect(URI.create(target)); + } + + @Get("/see-other") + public MutableHttpResponse seeOther(@QueryValue String target) { + return HttpResponse.seeOther(URI.create(target)); + } + + @Get("/temporary") + public MutableHttpResponse temporary(@QueryValue String target) { + return HttpResponse.temporaryRedirect(URI.create(target)); + } } diff --git a/java/ql/test/query-tests/security/CWE-601/semmle/tests/UrlRedirect.expected b/java/ql/test/query-tests/security/CWE-601/semmle/tests/UrlRedirect.expected index 79c8258c7ba8..4e311cdd5609 100644 --- a/java/ql/test/query-tests/security/CWE-601/semmle/tests/UrlRedirect.expected +++ b/java/ql/test/query-tests/security/CWE-601/semmle/tests/UrlRedirect.expected @@ -1,5 +1,8 @@ #select | MicronautUrlRedirect.java:14:38:14:55 | create(...) | MicronautUrlRedirect.java:12:39:12:63 | target : String | MicronautUrlRedirect.java:14:38:14:55 | create(...) | Untrusted URL redirection depends on a $@. | MicronautUrlRedirect.java:12:39:12:63 | target | user-provided value | +| MicronautUrlRedirect.java:28:47:28:64 | create(...) | MicronautUrlRedirect.java:27:45:27:69 | target : String | MicronautUrlRedirect.java:28:47:28:64 | create(...) | Untrusted URL redirection depends on a $@. | MicronautUrlRedirect.java:27:45:27:69 | target | user-provided value | +| MicronautUrlRedirect.java:33:38:33:55 | create(...) | MicronautUrlRedirect.java:32:44:32:68 | target : String | MicronautUrlRedirect.java:33:38:33:55 | create(...) | Untrusted URL redirection depends on a $@. | MicronautUrlRedirect.java:32:44:32:68 | target | user-provided value | +| MicronautUrlRedirect.java:38:47:38:64 | create(...) | MicronautUrlRedirect.java:37:45:37:69 | target : String | MicronautUrlRedirect.java:38:47:38:64 | create(...) | Untrusted URL redirection depends on a $@. | MicronautUrlRedirect.java:37:45:37:69 | target | user-provided value | | UrlRedirect2.java:27:25:27:54 | getParameter(...) | UrlRedirect2.java:27:25:27:54 | getParameter(...) | UrlRedirect2.java:27:25:27:54 | getParameter(...) | Untrusted URL redirection depends on a $@. | UrlRedirect2.java:27:25:27:54 | getParameter(...) | user-provided value | | UrlRedirect.java:23:25:23:54 | getParameter(...) | UrlRedirect.java:23:25:23:54 | getParameter(...) | UrlRedirect.java:23:25:23:54 | getParameter(...) | Untrusted URL redirection depends on a $@. | UrlRedirect.java:23:25:23:54 | getParameter(...) | user-provided value | | UrlRedirect.java:32:25:32:67 | weakCleanup(...) | UrlRedirect.java:32:37:32:66 | getParameter(...) : String | UrlRedirect.java:32:25:32:67 | weakCleanup(...) | Untrusted URL redirection depends on a $@. | UrlRedirect.java:32:37:32:66 | getParameter(...) | user-provided value | @@ -8,23 +11,41 @@ | mad/Test.java:14:22:14:38 | (...)... | mad/Test.java:9:16:9:41 | getParameter(...) : String | mad/Test.java:14:22:14:38 | (...)... | Untrusted URL redirection depends on a $@. | mad/Test.java:9:16:9:41 | getParameter(...) | user-provided value | edges | MicronautUrlRedirect.java:12:39:12:63 | target : String | MicronautUrlRedirect.java:14:49:14:54 | target : String | provenance | | -| MicronautUrlRedirect.java:14:49:14:54 | target : String | MicronautUrlRedirect.java:14:38:14:55 | create(...) | provenance | MaD:5 Sink:MaD:1 | -| UrlRedirect.java:32:37:32:66 | getParameter(...) : String | UrlRedirect.java:32:25:32:67 | weakCleanup(...) | provenance | Src:MaD:3 MaD:4 | -| UrlRedirect.java:32:37:32:66 | getParameter(...) : String | UrlRedirect.java:45:28:45:39 | input : String | provenance | Src:MaD:3 | +| MicronautUrlRedirect.java:14:49:14:54 | target : String | MicronautUrlRedirect.java:14:38:14:55 | create(...) | provenance | MaD:8 Sink:MaD:2 | +| MicronautUrlRedirect.java:27:45:27:69 | target : String | MicronautUrlRedirect.java:28:58:28:63 | target : String | provenance | | +| MicronautUrlRedirect.java:28:58:28:63 | target : String | MicronautUrlRedirect.java:28:47:28:64 | create(...) | provenance | MaD:8 Sink:MaD:1 | +| MicronautUrlRedirect.java:32:44:32:68 | target : String | MicronautUrlRedirect.java:33:49:33:54 | target : String | provenance | | +| MicronautUrlRedirect.java:33:49:33:54 | target : String | MicronautUrlRedirect.java:33:38:33:55 | create(...) | provenance | MaD:8 Sink:MaD:3 | +| MicronautUrlRedirect.java:37:45:37:69 | target : String | MicronautUrlRedirect.java:38:58:38:63 | target : String | provenance | | +| MicronautUrlRedirect.java:38:58:38:63 | target : String | MicronautUrlRedirect.java:38:47:38:64 | create(...) | provenance | MaD:8 Sink:MaD:4 | +| UrlRedirect.java:32:37:32:66 | getParameter(...) : String | UrlRedirect.java:32:25:32:67 | weakCleanup(...) | provenance | Src:MaD:6 MaD:7 | +| UrlRedirect.java:32:37:32:66 | getParameter(...) : String | UrlRedirect.java:45:28:45:39 | input : String | provenance | Src:MaD:6 | | UrlRedirect.java:45:28:45:39 | input : String | UrlRedirect.java:46:10:46:14 | input : String | provenance | | -| UrlRedirect.java:46:10:46:14 | input : String | UrlRedirect.java:46:10:46:40 | replaceAll(...) : String | provenance | MaD:4 | -| mad/Test.java:9:16:9:41 | getParameter(...) : String | mad/Test.java:14:31:14:38 | source(...) : String | provenance | Src:MaD:3 | -| mad/Test.java:14:31:14:38 | source(...) : String | mad/Test.java:14:22:14:38 | (...)... | provenance | Sink:MaD:2 | +| UrlRedirect.java:46:10:46:14 | input : String | UrlRedirect.java:46:10:46:40 | replaceAll(...) : String | provenance | MaD:7 | +| mad/Test.java:9:16:9:41 | getParameter(...) : String | mad/Test.java:14:31:14:38 | source(...) : String | provenance | Src:MaD:6 | +| mad/Test.java:14:31:14:38 | source(...) : String | mad/Test.java:14:22:14:38 | (...)... | provenance | Sink:MaD:5 | models -| 1 | Sink: io.micronaut.http; HttpResponse; true; redirect; (URI); ; Argument[0]; url-redirection; manual | -| 2 | Sink: org.kohsuke.stapler; HttpResponses; true; redirectTo; (String); ; Argument[0]; url-redirection; ai-manual | -| 3 | Source: javax.servlet; ServletRequest; false; getParameter; (String); ; ReturnValue; remote; manual | -| 4 | Summary: java.lang; String; false; replaceAll; ; ; Argument[this]; ReturnValue; taint; manual | -| 5 | Summary: java.net; URI; false; create; ; ; Argument[0]; ReturnValue; taint; manual | +| 1 | Sink: io.micronaut.http; HttpResponse; true; permanentRedirect; (URI); ; Argument[0]; url-redirection; manual | +| 2 | Sink: io.micronaut.http; HttpResponse; true; redirect; (URI); ; Argument[0]; url-redirection; manual | +| 3 | Sink: io.micronaut.http; HttpResponse; true; seeOther; (URI); ; Argument[0]; url-redirection; manual | +| 4 | Sink: io.micronaut.http; HttpResponse; true; temporaryRedirect; (URI); ; Argument[0]; url-redirection; manual | +| 5 | Sink: org.kohsuke.stapler; HttpResponses; true; redirectTo; (String); ; Argument[0]; url-redirection; ai-manual | +| 6 | Source: javax.servlet; ServletRequest; false; getParameter; (String); ; ReturnValue; remote; manual | +| 7 | Summary: java.lang; String; false; replaceAll; ; ; Argument[this]; ReturnValue; taint; manual | +| 8 | Summary: java.net; URI; false; create; ; ; Argument[0]; ReturnValue; taint; manual | nodes | MicronautUrlRedirect.java:12:39:12:63 | target : String | semmle.label | target : String | | MicronautUrlRedirect.java:14:38:14:55 | create(...) | semmle.label | create(...) | | MicronautUrlRedirect.java:14:49:14:54 | target : String | semmle.label | target : String | +| MicronautUrlRedirect.java:27:45:27:69 | target : String | semmle.label | target : String | +| MicronautUrlRedirect.java:28:47:28:64 | create(...) | semmle.label | create(...) | +| MicronautUrlRedirect.java:28:58:28:63 | target : String | semmle.label | target : String | +| MicronautUrlRedirect.java:32:44:32:68 | target : String | semmle.label | target : String | +| MicronautUrlRedirect.java:33:38:33:55 | create(...) | semmle.label | create(...) | +| MicronautUrlRedirect.java:33:49:33:54 | target : String | semmle.label | target : String | +| MicronautUrlRedirect.java:37:45:37:69 | target : String | semmle.label | target : String | +| MicronautUrlRedirect.java:38:47:38:64 | create(...) | semmle.label | create(...) | +| MicronautUrlRedirect.java:38:58:38:63 | target : String | semmle.label | target : String | | UrlRedirect2.java:27:25:27:54 | getParameter(...) | semmle.label | getParameter(...) | | UrlRedirect.java:23:25:23:54 | getParameter(...) | semmle.label | getParameter(...) | | UrlRedirect.java:32:25:32:67 | weakCleanup(...) | semmle.label | weakCleanup(...) | diff --git a/java/ql/test/query-tests/security/CWE-918/MicronautSSRF.java b/java/ql/test/query-tests/security/CWE-918/MicronautSSRF.java index 128a0cfa710a..8426390a35f6 100644 --- a/java/ql/test/query-tests/security/CWE-918/MicronautSSRF.java +++ b/java/ql/test/query-tests/security/CWE-918/MicronautSSRF.java @@ -2,6 +2,7 @@ import io.micronaut.http.annotation.Get; import io.micronaut.http.annotation.QueryValue; import io.micronaut.http.client.HttpClient; +import io.micronaut.http.HttpRequest; import io.micronaut.http.uri.UriBuilder; import java.net.URI; @@ -30,4 +31,19 @@ public String testUriBuilder(@QueryValue String host) { // $ Source URI uri = UriBuilder.of("http://example.com").host(host).build(); return client.toBlocking().retrieve(uri.toString()); // $ Alert } + + @Get("/blocking-request") + public Object testBlockingRequest(@QueryValue String url) { // $ Source + return client.toBlocking().exchange(HttpRequest.GET(url)); // $ Alert + } + + @Get("/non-blocking") + public Object testNonBlocking(@QueryValue String url) { // $ Source + return client.exchange(url); // $ Alert + } + + @Get("/non-blocking-request") + public Object testNonBlockingRequest(@QueryValue String url) { // $ Source + return client.exchange(HttpRequest.GET(url)); // $ Alert + } } diff --git a/java/ql/test/query-tests/security/CWE-918/RequestForgery.expected b/java/ql/test/query-tests/security/CWE-918/RequestForgery.expected index 9c44be4a3867..6974c8f5cf56 100644 --- a/java/ql/test/query-tests/security/CWE-918/RequestForgery.expected +++ b/java/ql/test/query-tests/security/CWE-918/RequestForgery.expected @@ -226,10 +226,13 @@ | JdbcUrlSSRF.java:86:19:86:25 | jdbcUrl | JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:86:19:86:25 | jdbcUrl | Potential server-side request forgery due to a $@. | JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) | user-provided value | | JdbcUrlSSRF.java:87:19:87:25 | jdbcUrl | JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:87:19:87:25 | jdbcUrl | Potential server-side request forgery due to a $@. | JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) | user-provided value | | JdbcUrlSSRF.java:88:19:88:25 | jdbcUrl | JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:88:19:88:25 | jdbcUrl | Potential server-side request forgery due to a $@. | JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) | user-provided value | -| MicronautSSRF.java:15:45:15:47 | url | MicronautSSRF.java:14:32:14:53 | url : String | MicronautSSRF.java:15:45:15:47 | url | Potential server-side request forgery due to a $@. | MicronautSSRF.java:14:32:14:53 | url | user-provided value | -| MicronautSSRF.java:20:45:20:47 | url | MicronautSSRF.java:19:42:19:63 | url : String | MicronautSSRF.java:20:45:20:47 | url | Potential server-side request forgery due to a $@. | MicronautSSRF.java:19:42:19:63 | url | user-provided value | -| MicronautSSRF.java:25:45:25:47 | url | MicronautSSRF.java:24:37:24:58 | url : String | MicronautSSRF.java:25:45:25:47 | url | Potential server-side request forgery due to a $@. | MicronautSSRF.java:24:37:24:58 | url | user-provided value | -| MicronautSSRF.java:31:45:31:58 | toString(...) | MicronautSSRF.java:29:34:29:56 | host : String | MicronautSSRF.java:31:45:31:58 | toString(...) | Potential server-side request forgery due to a $@. | MicronautSSRF.java:29:34:29:56 | host | user-provided value | +| MicronautSSRF.java:16:45:16:47 | url | MicronautSSRF.java:15:32:15:53 | url : String | MicronautSSRF.java:16:45:16:47 | url | Potential server-side request forgery due to a $@. | MicronautSSRF.java:15:32:15:53 | url | user-provided value | +| MicronautSSRF.java:21:45:21:47 | url | MicronautSSRF.java:20:42:20:63 | url : String | MicronautSSRF.java:21:45:21:47 | url | Potential server-side request forgery due to a $@. | MicronautSSRF.java:20:42:20:63 | url | user-provided value | +| MicronautSSRF.java:26:45:26:47 | url | MicronautSSRF.java:25:37:25:58 | url : String | MicronautSSRF.java:26:45:26:47 | url | Potential server-side request forgery due to a $@. | MicronautSSRF.java:25:37:25:58 | url | user-provided value | +| MicronautSSRF.java:32:45:32:58 | toString(...) | MicronautSSRF.java:30:34:30:56 | host : String | MicronautSSRF.java:32:45:32:58 | toString(...) | Potential server-side request forgery due to a $@. | MicronautSSRF.java:30:34:30:56 | host | user-provided value | +| MicronautSSRF.java:37:45:37:64 | GET(...) | MicronautSSRF.java:36:39:36:60 | url : String | MicronautSSRF.java:37:45:37:64 | GET(...) | Potential server-side request forgery due to a $@. | MicronautSSRF.java:36:39:36:60 | url | user-provided value | +| MicronautSSRF.java:42:32:42:34 | url | MicronautSSRF.java:41:35:41:56 | url : String | MicronautSSRF.java:42:32:42:34 | url | Potential server-side request forgery due to a $@. | MicronautSSRF.java:41:35:41:56 | url | user-provided value | +| MicronautSSRF.java:47:32:47:51 | GET(...) | MicronautSSRF.java:46:42:46:63 | url : String | MicronautSSRF.java:47:32:47:51 | GET(...) | Potential server-side request forgery due to a $@. | MicronautSSRF.java:46:42:46:63 | url | user-provided value | | ReactiveWebClientSSRF.java:16:52:16:54 | url | ReactiveWebClientSSRF.java:15:26:15:52 | getParameter(...) : String | ReactiveWebClientSSRF.java:16:52:16:54 | url | Potential server-side request forgery due to a $@. | ReactiveWebClientSSRF.java:15:26:15:52 | getParameter(...) | user-provided value | | ReactiveWebClientSSRF.java:35:30:35:32 | url | ReactiveWebClientSSRF.java:32:26:32:52 | getParameter(...) : String | ReactiveWebClientSSRF.java:35:30:35:32 | url | Potential server-side request forgery due to a $@. | ReactiveWebClientSSRF.java:32:26:32:52 | getParameter(...) | user-provided value | | SanitizationTests.java:25:52:25:54 | uri | SanitizationTests.java:22:31:22:57 | getParameter(...) : String | SanitizationTests.java:25:52:25:54 | uri | Potential server-side request forgery due to a $@. | SanitizationTests.java:22:31:22:57 | getParameter(...) | user-provided value | @@ -381,1015 +384,1025 @@ | mad/Test.java:107:15:107:31 | (...)... | mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:107:15:107:31 | (...)... | Potential server-side request forgery due to a $@. | mad/Test.java:26:16:26:41 | getParameter(...) | user-provided value | | mad/Test.java:112:15:112:31 | (...)... | mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:112:15:112:31 | (...)... | Potential server-side request forgery due to a $@. | mad/Test.java:26:16:26:41 | getParameter(...) | user-provided value | edges -| ApacheHttpSSRF.java:27:27:27:53 | getParameter(...) : String | ApacheHttpSSRF.java:28:31:28:34 | sink : String | provenance | Src:MaD:280 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:30:43:30:45 | uri | provenance | Sink:MaD:214 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:32:29:32:31 | uri | provenance | Sink:MaD:220 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:34:26:34:28 | uri | provenance | Sink:MaD:215 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:35:26:35:28 | uri | provenance | Sink:MaD:218 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:36:25:36:27 | uri | provenance | Sink:MaD:219 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:37:28:37:30 | uri | provenance | Sink:MaD:213 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:38:29:38:31 | uri | provenance | Sink:MaD:216 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:39:27:39:29 | uri | provenance | Sink:MaD:221 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:40:27:40:29 | uri | provenance | Sink:MaD:217 | +| ApacheHttpSSRF.java:27:27:27:53 | getParameter(...) : String | ApacheHttpSSRF.java:28:31:28:34 | sink : String | provenance | Src:MaD:283 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:30:43:30:45 | uri | provenance | Sink:MaD:217 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:32:29:32:31 | uri | provenance | Sink:MaD:223 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:34:26:34:28 | uri | provenance | Sink:MaD:218 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:35:26:35:28 | uri | provenance | Sink:MaD:221 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:36:25:36:27 | uri | provenance | Sink:MaD:222 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:37:28:37:30 | uri | provenance | Sink:MaD:216 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:38:29:38:31 | uri | provenance | Sink:MaD:219 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:39:27:39:29 | uri | provenance | Sink:MaD:224 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:40:27:40:29 | uri | provenance | Sink:MaD:220 | | ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:42:62:42:64 | uri : URI | provenance | | | ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:43:41:43:43 | uri : URI | provenance | | | ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:44:41:44:43 | uri : URI | provenance | | | ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:46:77:46:79 | uri : URI | provenance | | | ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:47:56:47:58 | uri : URI | provenance | | | ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:48:56:48:58 | uri : URI | provenance | | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:50:32:50:34 | uri | provenance | Sink:MaD:223 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:51:33:51:35 | uri | provenance | Sink:MaD:227 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:52:32:52:34 | uri | provenance | Sink:MaD:228 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:53:35:53:37 | uri | provenance | Sink:MaD:222 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:54:36:54:38 | uri | provenance | Sink:MaD:225 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:55:33:55:35 | uri | provenance | Sink:MaD:224 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:56:34:56:36 | uri | provenance | Sink:MaD:230 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:57:34:57:36 | uri | provenance | Sink:MaD:226 | -| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:58:43:58:45 | uri | provenance | Sink:MaD:229 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:50:32:50:34 | uri | provenance | Sink:MaD:226 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:51:33:51:35 | uri | provenance | Sink:MaD:230 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:52:32:52:34 | uri | provenance | Sink:MaD:231 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:53:35:53:37 | uri | provenance | Sink:MaD:225 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:54:36:54:38 | uri | provenance | Sink:MaD:228 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:55:33:55:35 | uri | provenance | Sink:MaD:227 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:56:34:56:36 | uri | provenance | Sink:MaD:233 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:57:34:57:36 | uri | provenance | Sink:MaD:229 | +| ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | ApacheHttpSSRF.java:58:43:58:45 | uri | provenance | Sink:MaD:232 | | ApacheHttpSSRF.java:28:31:28:34 | sink : String | ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | provenance | Config | -| ApacheHttpSSRF.java:28:31:28:34 | sink : String | ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | provenance | MaD:290 | -| ApacheHttpSSRF.java:42:62:42:64 | uri : URI | ApacheHttpSSRF.java:42:62:42:75 | toString(...) : String | provenance | MaD:291 | -| ApacheHttpSSRF.java:42:62:42:75 | toString(...) : String | ApacheHttpSSRF.java:42:34:42:82 | new BasicRequestLine(...) | provenance | MaD:300 Sink:MaD:234 | -| ApacheHttpSSRF.java:43:41:43:43 | uri : URI | ApacheHttpSSRF.java:43:41:43:54 | toString(...) | provenance | MaD:291 Sink:MaD:235 | -| ApacheHttpSSRF.java:44:41:44:43 | uri : URI | ApacheHttpSSRF.java:44:41:44:54 | toString(...) | provenance | MaD:291 Sink:MaD:236 | -| ApacheHttpSSRF.java:46:77:46:79 | uri : URI | ApacheHttpSSRF.java:46:77:46:90 | toString(...) : String | provenance | MaD:291 | -| ApacheHttpSSRF.java:46:77:46:90 | toString(...) : String | ApacheHttpSSRF.java:46:49:46:97 | new BasicRequestLine(...) | provenance | MaD:300 Sink:MaD:231 | -| ApacheHttpSSRF.java:47:56:47:58 | uri : URI | ApacheHttpSSRF.java:47:56:47:69 | toString(...) | provenance | MaD:291 Sink:MaD:232 | -| ApacheHttpSSRF.java:48:56:48:58 | uri : URI | ApacheHttpSSRF.java:48:56:48:69 | toString(...) | provenance | MaD:291 Sink:MaD:233 | -| ApacheHttpSSRFVersion5.java:41:30:41:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:42:31:42:37 | uriSink : String | provenance | Src:MaD:280 | +| ApacheHttpSSRF.java:28:31:28:34 | sink : String | ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | provenance | MaD:295 | +| ApacheHttpSSRF.java:42:62:42:64 | uri : URI | ApacheHttpSSRF.java:42:62:42:75 | toString(...) : String | provenance | MaD:296 | +| ApacheHttpSSRF.java:42:62:42:75 | toString(...) : String | ApacheHttpSSRF.java:42:34:42:82 | new BasicRequestLine(...) | provenance | MaD:305 Sink:MaD:237 | +| ApacheHttpSSRF.java:43:41:43:43 | uri : URI | ApacheHttpSSRF.java:43:41:43:54 | toString(...) | provenance | MaD:296 Sink:MaD:238 | +| ApacheHttpSSRF.java:44:41:44:43 | uri : URI | ApacheHttpSSRF.java:44:41:44:54 | toString(...) | provenance | MaD:296 Sink:MaD:239 | +| ApacheHttpSSRF.java:46:77:46:79 | uri : URI | ApacheHttpSSRF.java:46:77:46:90 | toString(...) : String | provenance | MaD:296 | +| ApacheHttpSSRF.java:46:77:46:90 | toString(...) : String | ApacheHttpSSRF.java:46:49:46:97 | new BasicRequestLine(...) | provenance | MaD:305 Sink:MaD:234 | +| ApacheHttpSSRF.java:47:56:47:58 | uri : URI | ApacheHttpSSRF.java:47:56:47:69 | toString(...) | provenance | MaD:296 Sink:MaD:235 | +| ApacheHttpSSRF.java:48:56:48:58 | uri : URI | ApacheHttpSSRF.java:48:56:48:69 | toString(...) | provenance | MaD:296 Sink:MaD:236 | +| ApacheHttpSSRFVersion5.java:41:30:41:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:42:31:42:37 | uriSink : String | provenance | Src:MaD:283 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:49:54:49:56 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:50:54:50:56 | uri | provenance | Sink:MaD:43 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:50:54:50:56 | uri | provenance | Sink:MaD:46 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:51:48:51:50 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:52:48:52:50 | uri | provenance | Sink:MaD:45 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:52:48:52:50 | uri | provenance | Sink:MaD:48 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:55:38:55:40 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:56:38:56:40 | uri | provenance | Sink:MaD:48 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:56:38:56:40 | uri | provenance | Sink:MaD:51 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:59:35:59:37 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:60:35:60:37 | uri | provenance | Sink:MaD:51 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:60:35:60:37 | uri | provenance | Sink:MaD:54 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:63:36:63:38 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:64:36:64:38 | uri | provenance | Sink:MaD:54 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:64:36:64:38 | uri | provenance | Sink:MaD:57 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:67:39:67:41 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:68:39:68:41 | uri | provenance | Sink:MaD:57 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:68:39:68:41 | uri | provenance | Sink:MaD:60 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:71:37:71:39 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:72:37:72:39 | uri | provenance | Sink:MaD:60 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:72:37:72:39 | uri | provenance | Sink:MaD:63 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:75:36:75:38 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:76:36:76:38 | uri | provenance | Sink:MaD:63 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:76:36:76:38 | uri | provenance | Sink:MaD:66 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:79:35:79:37 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:80:35:80:37 | uri | provenance | Sink:MaD:66 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:80:35:80:37 | uri | provenance | Sink:MaD:69 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:83:37:83:39 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:84:37:84:39 | uri | provenance | Sink:MaD:69 | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:88:51:88:53 | uri | provenance | Sink:MaD:71 | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:92:51:92:53 | uri | provenance | Sink:MaD:73 | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:94:45:94:47 | uri | provenance | Sink:MaD:75 | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:97:54:97:56 | uri | provenance | Sink:MaD:77 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:84:37:84:39 | uri | provenance | Sink:MaD:72 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:88:51:88:53 | uri | provenance | Sink:MaD:74 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:92:51:92:53 | uri | provenance | Sink:MaD:76 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:94:45:94:47 | uri | provenance | Sink:MaD:78 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:97:54:97:56 | uri | provenance | Sink:MaD:80 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:98:48:98:50 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:99:48:99:50 | uri | provenance | Sink:MaD:79 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:99:48:99:50 | uri | provenance | Sink:MaD:82 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:103:55:103:57 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:104:55:104:57 | uri | provenance | Sink:MaD:82 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:104:55:104:57 | uri | provenance | Sink:MaD:85 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:105:49:105:51 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:106:49:106:51 | uri | provenance | Sink:MaD:84 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:106:49:106:51 | uri | provenance | Sink:MaD:87 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:109:39:109:41 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:110:39:110:41 | uri | provenance | Sink:MaD:87 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:110:39:110:41 | uri | provenance | Sink:MaD:90 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:113:36:113:38 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:114:36:114:38 | uri | provenance | Sink:MaD:90 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:114:36:114:38 | uri | provenance | Sink:MaD:93 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:117:37:117:39 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:118:37:118:39 | uri | provenance | Sink:MaD:93 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:118:37:118:39 | uri | provenance | Sink:MaD:96 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:121:40:121:42 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:122:40:122:42 | uri | provenance | Sink:MaD:96 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:122:40:122:42 | uri | provenance | Sink:MaD:99 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:125:38:125:40 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:126:38:126:40 | uri | provenance | Sink:MaD:99 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:126:38:126:40 | uri | provenance | Sink:MaD:102 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:129:37:129:39 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:130:37:130:39 | uri | provenance | Sink:MaD:102 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:130:37:130:39 | uri | provenance | Sink:MaD:105 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:133:36:133:38 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:134:36:134:38 | uri | provenance | Sink:MaD:105 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:134:36:134:38 | uri | provenance | Sink:MaD:108 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:137:38:137:40 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:138:38:138:40 | uri | provenance | Sink:MaD:108 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:138:38:138:40 | uri | provenance | Sink:MaD:111 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:141:41:141:43 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:142:41:142:43 | uri | provenance | Sink:MaD:110 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:142:41:142:43 | uri | provenance | Sink:MaD:113 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:144:38:144:40 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:145:38:145:40 | uri | provenance | Sink:MaD:112 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:145:38:145:40 | uri | provenance | Sink:MaD:115 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:147:39:147:41 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:148:39:148:41 | uri | provenance | Sink:MaD:114 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:148:39:148:41 | uri | provenance | Sink:MaD:117 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:150:42:150:44 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:151:42:151:44 | uri | provenance | Sink:MaD:116 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:151:42:151:44 | uri | provenance | Sink:MaD:119 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:153:40:153:42 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:154:40:154:42 | uri | provenance | Sink:MaD:118 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:154:40:154:42 | uri | provenance | Sink:MaD:121 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:156:39:156:41 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:157:39:157:41 | uri | provenance | Sink:MaD:120 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:157:39:157:41 | uri | provenance | Sink:MaD:123 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:159:38:159:40 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:160:38:160:40 | uri | provenance | Sink:MaD:122 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:160:38:160:40 | uri | provenance | Sink:MaD:125 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:164:47:164:49 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:165:47:165:49 | uri | provenance | Sink:MaD:209 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:165:47:165:49 | uri | provenance | Sink:MaD:212 | | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:167:40:167:42 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:168:40:168:42 | uri | provenance | Sink:MaD:124 | +| ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:168:40:168:42 | uri | provenance | Sink:MaD:127 | | ApacheHttpSSRFVersion5.java:42:31:42:37 | uriSink : String | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | provenance | Config | -| ApacheHttpSSRFVersion5.java:42:31:42:37 | uriSink : String | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | provenance | MaD:290 | -| ApacheHttpSSRFVersion5.java:44:31:44:58 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:45:42:45:49 | hostSink : String | provenance | Src:MaD:280 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:48:54:48:57 | host | provenance | Sink:MaD:41 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:54:38:54:41 | host | provenance | Sink:MaD:46 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:58:35:58:38 | host | provenance | Sink:MaD:49 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:62:36:62:39 | host | provenance | Sink:MaD:52 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:66:39:66:42 | host | provenance | Sink:MaD:55 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:70:37:70:40 | host | provenance | Sink:MaD:58 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:74:36:74:39 | host | provenance | Sink:MaD:61 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:78:35:78:38 | host | provenance | Sink:MaD:64 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:82:37:82:40 | host | provenance | Sink:MaD:67 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:87:51:87:54 | host | provenance | Sink:MaD:70 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:91:51:91:54 | host | provenance | Sink:MaD:72 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:93:45:93:48 | host | provenance | Sink:MaD:74 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:96:54:96:57 | host | provenance | Sink:MaD:76 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:102:55:102:58 | host | provenance | Sink:MaD:80 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:108:39:108:42 | host | provenance | Sink:MaD:85 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:112:36:112:39 | host | provenance | Sink:MaD:88 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:116:37:116:40 | host | provenance | Sink:MaD:91 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:120:40:120:43 | host | provenance | Sink:MaD:94 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:124:38:124:41 | host | provenance | Sink:MaD:97 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:128:37:128:40 | host | provenance | Sink:MaD:100 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:132:36:132:39 | host | provenance | Sink:MaD:103 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:136:38:136:41 | host | provenance | Sink:MaD:106 | -| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:162:52:162:55 | host | provenance | Sink:MaD:207 | -| ApacheHttpSSRFVersion5.java:45:42:45:49 | hostSink : String | ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | provenance | MaD:299 | -| ApacheHttpSSRFVersion5.java:49:54:49:56 | uri : URI | ApacheHttpSSRFVersion5.java:49:54:49:67 | toString(...) | provenance | MaD:291 Sink:MaD:42 | -| ApacheHttpSSRFVersion5.java:51:48:51:50 | uri : URI | ApacheHttpSSRFVersion5.java:51:48:51:61 | toString(...) | provenance | MaD:291 Sink:MaD:44 | -| ApacheHttpSSRFVersion5.java:55:38:55:40 | uri : URI | ApacheHttpSSRFVersion5.java:55:38:55:51 | toString(...) | provenance | MaD:291 Sink:MaD:47 | -| ApacheHttpSSRFVersion5.java:59:35:59:37 | uri : URI | ApacheHttpSSRFVersion5.java:59:35:59:48 | toString(...) | provenance | MaD:291 Sink:MaD:50 | -| ApacheHttpSSRFVersion5.java:63:36:63:38 | uri : URI | ApacheHttpSSRFVersion5.java:63:36:63:49 | toString(...) | provenance | MaD:291 Sink:MaD:53 | -| ApacheHttpSSRFVersion5.java:67:39:67:41 | uri : URI | ApacheHttpSSRFVersion5.java:67:39:67:52 | toString(...) | provenance | MaD:291 Sink:MaD:56 | -| ApacheHttpSSRFVersion5.java:71:37:71:39 | uri : URI | ApacheHttpSSRFVersion5.java:71:37:71:50 | toString(...) | provenance | MaD:291 Sink:MaD:59 | -| ApacheHttpSSRFVersion5.java:75:36:75:38 | uri : URI | ApacheHttpSSRFVersion5.java:75:36:75:49 | toString(...) | provenance | MaD:291 Sink:MaD:62 | -| ApacheHttpSSRFVersion5.java:79:35:79:37 | uri : URI | ApacheHttpSSRFVersion5.java:79:35:79:48 | toString(...) | provenance | MaD:291 Sink:MaD:65 | -| ApacheHttpSSRFVersion5.java:83:37:83:39 | uri : URI | ApacheHttpSSRFVersion5.java:83:37:83:50 | toString(...) | provenance | MaD:291 Sink:MaD:68 | -| ApacheHttpSSRFVersion5.java:98:48:98:50 | uri : URI | ApacheHttpSSRFVersion5.java:98:48:98:61 | toString(...) | provenance | MaD:291 Sink:MaD:78 | -| ApacheHttpSSRFVersion5.java:103:55:103:57 | uri : URI | ApacheHttpSSRFVersion5.java:103:55:103:68 | toString(...) | provenance | MaD:291 Sink:MaD:81 | -| ApacheHttpSSRFVersion5.java:105:49:105:51 | uri : URI | ApacheHttpSSRFVersion5.java:105:49:105:62 | toString(...) | provenance | MaD:291 Sink:MaD:83 | -| ApacheHttpSSRFVersion5.java:109:39:109:41 | uri : URI | ApacheHttpSSRFVersion5.java:109:39:109:52 | toString(...) | provenance | MaD:291 Sink:MaD:86 | -| ApacheHttpSSRFVersion5.java:113:36:113:38 | uri : URI | ApacheHttpSSRFVersion5.java:113:36:113:49 | toString(...) | provenance | MaD:291 Sink:MaD:89 | -| ApacheHttpSSRFVersion5.java:117:37:117:39 | uri : URI | ApacheHttpSSRFVersion5.java:117:37:117:50 | toString(...) | provenance | MaD:291 Sink:MaD:92 | -| ApacheHttpSSRFVersion5.java:121:40:121:42 | uri : URI | ApacheHttpSSRFVersion5.java:121:40:121:53 | toString(...) | provenance | MaD:291 Sink:MaD:95 | -| ApacheHttpSSRFVersion5.java:125:38:125:40 | uri : URI | ApacheHttpSSRFVersion5.java:125:38:125:51 | toString(...) | provenance | MaD:291 Sink:MaD:98 | -| ApacheHttpSSRFVersion5.java:129:37:129:39 | uri : URI | ApacheHttpSSRFVersion5.java:129:37:129:50 | toString(...) | provenance | MaD:291 Sink:MaD:101 | -| ApacheHttpSSRFVersion5.java:133:36:133:38 | uri : URI | ApacheHttpSSRFVersion5.java:133:36:133:49 | toString(...) | provenance | MaD:291 Sink:MaD:104 | -| ApacheHttpSSRFVersion5.java:137:38:137:40 | uri : URI | ApacheHttpSSRFVersion5.java:137:38:137:51 | toString(...) | provenance | MaD:291 Sink:MaD:107 | -| ApacheHttpSSRFVersion5.java:141:41:141:43 | uri : URI | ApacheHttpSSRFVersion5.java:141:41:141:54 | toString(...) | provenance | MaD:291 Sink:MaD:109 | -| ApacheHttpSSRFVersion5.java:144:38:144:40 | uri : URI | ApacheHttpSSRFVersion5.java:144:38:144:51 | toString(...) | provenance | MaD:291 Sink:MaD:111 | -| ApacheHttpSSRFVersion5.java:147:39:147:41 | uri : URI | ApacheHttpSSRFVersion5.java:147:39:147:52 | toString(...) | provenance | MaD:291 Sink:MaD:113 | -| ApacheHttpSSRFVersion5.java:150:42:150:44 | uri : URI | ApacheHttpSSRFVersion5.java:150:42:150:55 | toString(...) | provenance | MaD:291 Sink:MaD:115 | -| ApacheHttpSSRFVersion5.java:153:40:153:42 | uri : URI | ApacheHttpSSRFVersion5.java:153:40:153:53 | toString(...) | provenance | MaD:291 Sink:MaD:117 | -| ApacheHttpSSRFVersion5.java:156:39:156:41 | uri : URI | ApacheHttpSSRFVersion5.java:156:39:156:52 | toString(...) | provenance | MaD:291 Sink:MaD:119 | -| ApacheHttpSSRFVersion5.java:159:38:159:40 | uri : URI | ApacheHttpSSRFVersion5.java:159:38:159:51 | toString(...) | provenance | MaD:291 Sink:MaD:121 | -| ApacheHttpSSRFVersion5.java:164:47:164:49 | uri : URI | ApacheHttpSSRFVersion5.java:164:47:164:60 | toString(...) | provenance | MaD:291 Sink:MaD:208 | -| ApacheHttpSSRFVersion5.java:167:40:167:42 | uri : URI | ApacheHttpSSRFVersion5.java:167:40:167:53 | toString(...) | provenance | MaD:291 Sink:MaD:123 | -| ApacheHttpSSRFVersion5.java:180:30:180:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:181:31:181:37 | uriSink : String | provenance | Src:MaD:280 | +| ApacheHttpSSRFVersion5.java:42:31:42:37 | uriSink : String | ApacheHttpSSRFVersion5.java:42:23:42:38 | new URI(...) : URI | provenance | MaD:295 | +| ApacheHttpSSRFVersion5.java:44:31:44:58 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:45:42:45:49 | hostSink : String | provenance | Src:MaD:283 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:48:54:48:57 | host | provenance | Sink:MaD:44 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:54:38:54:41 | host | provenance | Sink:MaD:49 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:58:35:58:38 | host | provenance | Sink:MaD:52 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:62:36:62:39 | host | provenance | Sink:MaD:55 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:66:39:66:42 | host | provenance | Sink:MaD:58 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:70:37:70:40 | host | provenance | Sink:MaD:61 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:74:36:74:39 | host | provenance | Sink:MaD:64 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:78:35:78:38 | host | provenance | Sink:MaD:67 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:82:37:82:40 | host | provenance | Sink:MaD:70 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:87:51:87:54 | host | provenance | Sink:MaD:73 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:91:51:91:54 | host | provenance | Sink:MaD:75 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:93:45:93:48 | host | provenance | Sink:MaD:77 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:96:54:96:57 | host | provenance | Sink:MaD:79 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:102:55:102:58 | host | provenance | Sink:MaD:83 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:108:39:108:42 | host | provenance | Sink:MaD:88 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:112:36:112:39 | host | provenance | Sink:MaD:91 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:116:37:116:40 | host | provenance | Sink:MaD:94 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:120:40:120:43 | host | provenance | Sink:MaD:97 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:124:38:124:41 | host | provenance | Sink:MaD:100 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:128:37:128:40 | host | provenance | Sink:MaD:103 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:132:36:132:39 | host | provenance | Sink:MaD:106 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:136:38:136:41 | host | provenance | Sink:MaD:109 | +| ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:162:52:162:55 | host | provenance | Sink:MaD:210 | +| ApacheHttpSSRFVersion5.java:45:42:45:49 | hostSink : String | ApacheHttpSSRFVersion5.java:45:29:45:50 | new HttpHost(...) : HttpHost | provenance | MaD:304 | +| ApacheHttpSSRFVersion5.java:49:54:49:56 | uri : URI | ApacheHttpSSRFVersion5.java:49:54:49:67 | toString(...) | provenance | MaD:296 Sink:MaD:45 | +| ApacheHttpSSRFVersion5.java:51:48:51:50 | uri : URI | ApacheHttpSSRFVersion5.java:51:48:51:61 | toString(...) | provenance | MaD:296 Sink:MaD:47 | +| ApacheHttpSSRFVersion5.java:55:38:55:40 | uri : URI | ApacheHttpSSRFVersion5.java:55:38:55:51 | toString(...) | provenance | MaD:296 Sink:MaD:50 | +| ApacheHttpSSRFVersion5.java:59:35:59:37 | uri : URI | ApacheHttpSSRFVersion5.java:59:35:59:48 | toString(...) | provenance | MaD:296 Sink:MaD:53 | +| ApacheHttpSSRFVersion5.java:63:36:63:38 | uri : URI | ApacheHttpSSRFVersion5.java:63:36:63:49 | toString(...) | provenance | MaD:296 Sink:MaD:56 | +| ApacheHttpSSRFVersion5.java:67:39:67:41 | uri : URI | ApacheHttpSSRFVersion5.java:67:39:67:52 | toString(...) | provenance | MaD:296 Sink:MaD:59 | +| ApacheHttpSSRFVersion5.java:71:37:71:39 | uri : URI | ApacheHttpSSRFVersion5.java:71:37:71:50 | toString(...) | provenance | MaD:296 Sink:MaD:62 | +| ApacheHttpSSRFVersion5.java:75:36:75:38 | uri : URI | ApacheHttpSSRFVersion5.java:75:36:75:49 | toString(...) | provenance | MaD:296 Sink:MaD:65 | +| ApacheHttpSSRFVersion5.java:79:35:79:37 | uri : URI | ApacheHttpSSRFVersion5.java:79:35:79:48 | toString(...) | provenance | MaD:296 Sink:MaD:68 | +| ApacheHttpSSRFVersion5.java:83:37:83:39 | uri : URI | ApacheHttpSSRFVersion5.java:83:37:83:50 | toString(...) | provenance | MaD:296 Sink:MaD:71 | +| ApacheHttpSSRFVersion5.java:98:48:98:50 | uri : URI | ApacheHttpSSRFVersion5.java:98:48:98:61 | toString(...) | provenance | MaD:296 Sink:MaD:81 | +| ApacheHttpSSRFVersion5.java:103:55:103:57 | uri : URI | ApacheHttpSSRFVersion5.java:103:55:103:68 | toString(...) | provenance | MaD:296 Sink:MaD:84 | +| ApacheHttpSSRFVersion5.java:105:49:105:51 | uri : URI | ApacheHttpSSRFVersion5.java:105:49:105:62 | toString(...) | provenance | MaD:296 Sink:MaD:86 | +| ApacheHttpSSRFVersion5.java:109:39:109:41 | uri : URI | ApacheHttpSSRFVersion5.java:109:39:109:52 | toString(...) | provenance | MaD:296 Sink:MaD:89 | +| ApacheHttpSSRFVersion5.java:113:36:113:38 | uri : URI | ApacheHttpSSRFVersion5.java:113:36:113:49 | toString(...) | provenance | MaD:296 Sink:MaD:92 | +| ApacheHttpSSRFVersion5.java:117:37:117:39 | uri : URI | ApacheHttpSSRFVersion5.java:117:37:117:50 | toString(...) | provenance | MaD:296 Sink:MaD:95 | +| ApacheHttpSSRFVersion5.java:121:40:121:42 | uri : URI | ApacheHttpSSRFVersion5.java:121:40:121:53 | toString(...) | provenance | MaD:296 Sink:MaD:98 | +| ApacheHttpSSRFVersion5.java:125:38:125:40 | uri : URI | ApacheHttpSSRFVersion5.java:125:38:125:51 | toString(...) | provenance | MaD:296 Sink:MaD:101 | +| ApacheHttpSSRFVersion5.java:129:37:129:39 | uri : URI | ApacheHttpSSRFVersion5.java:129:37:129:50 | toString(...) | provenance | MaD:296 Sink:MaD:104 | +| ApacheHttpSSRFVersion5.java:133:36:133:38 | uri : URI | ApacheHttpSSRFVersion5.java:133:36:133:49 | toString(...) | provenance | MaD:296 Sink:MaD:107 | +| ApacheHttpSSRFVersion5.java:137:38:137:40 | uri : URI | ApacheHttpSSRFVersion5.java:137:38:137:51 | toString(...) | provenance | MaD:296 Sink:MaD:110 | +| ApacheHttpSSRFVersion5.java:141:41:141:43 | uri : URI | ApacheHttpSSRFVersion5.java:141:41:141:54 | toString(...) | provenance | MaD:296 Sink:MaD:112 | +| ApacheHttpSSRFVersion5.java:144:38:144:40 | uri : URI | ApacheHttpSSRFVersion5.java:144:38:144:51 | toString(...) | provenance | MaD:296 Sink:MaD:114 | +| ApacheHttpSSRFVersion5.java:147:39:147:41 | uri : URI | ApacheHttpSSRFVersion5.java:147:39:147:52 | toString(...) | provenance | MaD:296 Sink:MaD:116 | +| ApacheHttpSSRFVersion5.java:150:42:150:44 | uri : URI | ApacheHttpSSRFVersion5.java:150:42:150:55 | toString(...) | provenance | MaD:296 Sink:MaD:118 | +| ApacheHttpSSRFVersion5.java:153:40:153:42 | uri : URI | ApacheHttpSSRFVersion5.java:153:40:153:53 | toString(...) | provenance | MaD:296 Sink:MaD:120 | +| ApacheHttpSSRFVersion5.java:156:39:156:41 | uri : URI | ApacheHttpSSRFVersion5.java:156:39:156:52 | toString(...) | provenance | MaD:296 Sink:MaD:122 | +| ApacheHttpSSRFVersion5.java:159:38:159:40 | uri : URI | ApacheHttpSSRFVersion5.java:159:38:159:51 | toString(...) | provenance | MaD:296 Sink:MaD:124 | +| ApacheHttpSSRFVersion5.java:164:47:164:49 | uri : URI | ApacheHttpSSRFVersion5.java:164:47:164:60 | toString(...) | provenance | MaD:296 Sink:MaD:211 | +| ApacheHttpSSRFVersion5.java:167:40:167:42 | uri : URI | ApacheHttpSSRFVersion5.java:167:40:167:53 | toString(...) | provenance | MaD:296 Sink:MaD:126 | +| ApacheHttpSSRFVersion5.java:180:30:180:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:181:31:181:37 | uriSink : String | provenance | Src:MaD:283 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:184:56:184:58 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:185:56:185:58 | uri | provenance | Sink:MaD:126 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:185:56:185:58 | uri | provenance | Sink:MaD:129 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:186:50:186:52 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:187:50:187:52 | uri | provenance | Sink:MaD:128 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:187:50:187:52 | uri | provenance | Sink:MaD:131 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:189:40:189:42 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:190:40:190:42 | uri | provenance | Sink:MaD:130 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:190:40:190:42 | uri | provenance | Sink:MaD:133 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:192:37:192:39 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:193:37:193:39 | uri | provenance | Sink:MaD:132 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:193:37:193:39 | uri | provenance | Sink:MaD:135 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:195:38:195:40 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:196:38:196:40 | uri | provenance | Sink:MaD:134 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:196:38:196:40 | uri | provenance | Sink:MaD:137 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:198:41:198:43 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:199:41:199:43 | uri | provenance | Sink:MaD:136 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:199:41:199:43 | uri | provenance | Sink:MaD:139 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:201:39:201:41 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:202:39:202:41 | uri | provenance | Sink:MaD:138 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:202:39:202:41 | uri | provenance | Sink:MaD:141 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:204:38:204:40 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:205:38:205:40 | uri | provenance | Sink:MaD:140 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:205:38:205:40 | uri | provenance | Sink:MaD:143 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:207:37:207:39 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:208:37:208:39 | uri | provenance | Sink:MaD:142 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:208:37:208:39 | uri | provenance | Sink:MaD:145 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:210:39:210:41 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:211:39:211:41 | uri | provenance | Sink:MaD:144 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:211:39:211:41 | uri | provenance | Sink:MaD:147 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:214:28:214:30 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:215:28:215:30 | uri | provenance | Sink:MaD:146 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:215:28:215:30 | uri | provenance | Sink:MaD:149 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:217:25:217:27 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:218:25:218:27 | uri | provenance | Sink:MaD:148 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:218:25:218:27 | uri | provenance | Sink:MaD:151 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:220:26:220:28 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:221:26:221:28 | uri | provenance | Sink:MaD:150 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:221:26:221:28 | uri | provenance | Sink:MaD:153 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:223:29:223:31 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:224:29:224:31 | uri | provenance | Sink:MaD:152 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:224:29:224:31 | uri | provenance | Sink:MaD:155 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:226:27:226:29 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:227:27:227:29 | uri | provenance | Sink:MaD:154 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:227:27:227:29 | uri | provenance | Sink:MaD:157 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:229:26:229:28 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:230:26:230:28 | uri | provenance | Sink:MaD:156 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:230:26:230:28 | uri | provenance | Sink:MaD:159 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:232:25:232:27 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:233:25:233:27 | uri | provenance | Sink:MaD:158 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:233:25:233:27 | uri | provenance | Sink:MaD:161 | | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:235:27:235:29 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:236:27:236:29 | uri | provenance | Sink:MaD:160 | -| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:239:46:239:48 | uri | provenance | Sink:MaD:161 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:236:27:236:29 | uri | provenance | Sink:MaD:163 | +| ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:239:46:239:48 | uri | provenance | Sink:MaD:164 | | ApacheHttpSSRFVersion5.java:181:31:181:37 | uriSink : String | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | provenance | Config | -| ApacheHttpSSRFVersion5.java:181:31:181:37 | uriSink : String | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | provenance | MaD:290 | -| ApacheHttpSSRFVersion5.java:184:56:184:58 | uri : URI | ApacheHttpSSRFVersion5.java:184:56:184:69 | toString(...) | provenance | MaD:291 Sink:MaD:125 | -| ApacheHttpSSRFVersion5.java:186:50:186:52 | uri : URI | ApacheHttpSSRFVersion5.java:186:50:186:63 | toString(...) | provenance | MaD:291 Sink:MaD:127 | -| ApacheHttpSSRFVersion5.java:189:40:189:42 | uri : URI | ApacheHttpSSRFVersion5.java:189:40:189:53 | toString(...) | provenance | MaD:291 Sink:MaD:129 | -| ApacheHttpSSRFVersion5.java:192:37:192:39 | uri : URI | ApacheHttpSSRFVersion5.java:192:37:192:50 | toString(...) | provenance | MaD:291 Sink:MaD:131 | -| ApacheHttpSSRFVersion5.java:195:38:195:40 | uri : URI | ApacheHttpSSRFVersion5.java:195:38:195:51 | toString(...) | provenance | MaD:291 Sink:MaD:133 | -| ApacheHttpSSRFVersion5.java:198:41:198:43 | uri : URI | ApacheHttpSSRFVersion5.java:198:41:198:54 | toString(...) | provenance | MaD:291 Sink:MaD:135 | -| ApacheHttpSSRFVersion5.java:201:39:201:41 | uri : URI | ApacheHttpSSRFVersion5.java:201:39:201:52 | toString(...) | provenance | MaD:291 Sink:MaD:137 | -| ApacheHttpSSRFVersion5.java:204:38:204:40 | uri : URI | ApacheHttpSSRFVersion5.java:204:38:204:51 | toString(...) | provenance | MaD:291 Sink:MaD:139 | -| ApacheHttpSSRFVersion5.java:207:37:207:39 | uri : URI | ApacheHttpSSRFVersion5.java:207:37:207:50 | toString(...) | provenance | MaD:291 Sink:MaD:141 | -| ApacheHttpSSRFVersion5.java:210:39:210:41 | uri : URI | ApacheHttpSSRFVersion5.java:210:39:210:52 | toString(...) | provenance | MaD:291 Sink:MaD:143 | -| ApacheHttpSSRFVersion5.java:214:28:214:30 | uri : URI | ApacheHttpSSRFVersion5.java:214:28:214:41 | toString(...) | provenance | MaD:291 Sink:MaD:145 | -| ApacheHttpSSRFVersion5.java:217:25:217:27 | uri : URI | ApacheHttpSSRFVersion5.java:217:25:217:38 | toString(...) | provenance | MaD:291 Sink:MaD:147 | -| ApacheHttpSSRFVersion5.java:220:26:220:28 | uri : URI | ApacheHttpSSRFVersion5.java:220:26:220:39 | toString(...) | provenance | MaD:291 Sink:MaD:149 | -| ApacheHttpSSRFVersion5.java:223:29:223:31 | uri : URI | ApacheHttpSSRFVersion5.java:223:29:223:42 | toString(...) | provenance | MaD:291 Sink:MaD:151 | -| ApacheHttpSSRFVersion5.java:226:27:226:29 | uri : URI | ApacheHttpSSRFVersion5.java:226:27:226:40 | toString(...) | provenance | MaD:291 Sink:MaD:153 | -| ApacheHttpSSRFVersion5.java:229:26:229:28 | uri : URI | ApacheHttpSSRFVersion5.java:229:26:229:39 | toString(...) | provenance | MaD:291 Sink:MaD:155 | -| ApacheHttpSSRFVersion5.java:232:25:232:27 | uri : URI | ApacheHttpSSRFVersion5.java:232:25:232:38 | toString(...) | provenance | MaD:291 Sink:MaD:157 | -| ApacheHttpSSRFVersion5.java:235:27:235:29 | uri : URI | ApacheHttpSSRFVersion5.java:235:27:235:40 | toString(...) | provenance | MaD:291 Sink:MaD:159 | -| ApacheHttpSSRFVersion5.java:251:30:251:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:252:31:252:37 | uriSink : String | provenance | Src:MaD:280 | -| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:255:44:255:46 | uri | provenance | Sink:MaD:162 | +| ApacheHttpSSRFVersion5.java:181:31:181:37 | uriSink : String | ApacheHttpSSRFVersion5.java:181:23:181:38 | new URI(...) : URI | provenance | MaD:295 | +| ApacheHttpSSRFVersion5.java:184:56:184:58 | uri : URI | ApacheHttpSSRFVersion5.java:184:56:184:69 | toString(...) | provenance | MaD:296 Sink:MaD:128 | +| ApacheHttpSSRFVersion5.java:186:50:186:52 | uri : URI | ApacheHttpSSRFVersion5.java:186:50:186:63 | toString(...) | provenance | MaD:296 Sink:MaD:130 | +| ApacheHttpSSRFVersion5.java:189:40:189:42 | uri : URI | ApacheHttpSSRFVersion5.java:189:40:189:53 | toString(...) | provenance | MaD:296 Sink:MaD:132 | +| ApacheHttpSSRFVersion5.java:192:37:192:39 | uri : URI | ApacheHttpSSRFVersion5.java:192:37:192:50 | toString(...) | provenance | MaD:296 Sink:MaD:134 | +| ApacheHttpSSRFVersion5.java:195:38:195:40 | uri : URI | ApacheHttpSSRFVersion5.java:195:38:195:51 | toString(...) | provenance | MaD:296 Sink:MaD:136 | +| ApacheHttpSSRFVersion5.java:198:41:198:43 | uri : URI | ApacheHttpSSRFVersion5.java:198:41:198:54 | toString(...) | provenance | MaD:296 Sink:MaD:138 | +| ApacheHttpSSRFVersion5.java:201:39:201:41 | uri : URI | ApacheHttpSSRFVersion5.java:201:39:201:52 | toString(...) | provenance | MaD:296 Sink:MaD:140 | +| ApacheHttpSSRFVersion5.java:204:38:204:40 | uri : URI | ApacheHttpSSRFVersion5.java:204:38:204:51 | toString(...) | provenance | MaD:296 Sink:MaD:142 | +| ApacheHttpSSRFVersion5.java:207:37:207:39 | uri : URI | ApacheHttpSSRFVersion5.java:207:37:207:50 | toString(...) | provenance | MaD:296 Sink:MaD:144 | +| ApacheHttpSSRFVersion5.java:210:39:210:41 | uri : URI | ApacheHttpSSRFVersion5.java:210:39:210:52 | toString(...) | provenance | MaD:296 Sink:MaD:146 | +| ApacheHttpSSRFVersion5.java:214:28:214:30 | uri : URI | ApacheHttpSSRFVersion5.java:214:28:214:41 | toString(...) | provenance | MaD:296 Sink:MaD:148 | +| ApacheHttpSSRFVersion5.java:217:25:217:27 | uri : URI | ApacheHttpSSRFVersion5.java:217:25:217:38 | toString(...) | provenance | MaD:296 Sink:MaD:150 | +| ApacheHttpSSRFVersion5.java:220:26:220:28 | uri : URI | ApacheHttpSSRFVersion5.java:220:26:220:39 | toString(...) | provenance | MaD:296 Sink:MaD:152 | +| ApacheHttpSSRFVersion5.java:223:29:223:31 | uri : URI | ApacheHttpSSRFVersion5.java:223:29:223:42 | toString(...) | provenance | MaD:296 Sink:MaD:154 | +| ApacheHttpSSRFVersion5.java:226:27:226:29 | uri : URI | ApacheHttpSSRFVersion5.java:226:27:226:40 | toString(...) | provenance | MaD:296 Sink:MaD:156 | +| ApacheHttpSSRFVersion5.java:229:26:229:28 | uri : URI | ApacheHttpSSRFVersion5.java:229:26:229:39 | toString(...) | provenance | MaD:296 Sink:MaD:158 | +| ApacheHttpSSRFVersion5.java:232:25:232:27 | uri : URI | ApacheHttpSSRFVersion5.java:232:25:232:38 | toString(...) | provenance | MaD:296 Sink:MaD:160 | +| ApacheHttpSSRFVersion5.java:235:27:235:29 | uri : URI | ApacheHttpSSRFVersion5.java:235:27:235:40 | toString(...) | provenance | MaD:296 Sink:MaD:162 | +| ApacheHttpSSRFVersion5.java:251:30:251:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:252:31:252:37 | uriSink : String | provenance | Src:MaD:283 | +| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:255:44:255:46 | uri | provenance | Sink:MaD:165 | | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:256:38:256:40 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:257:38:257:40 | uri | provenance | Sink:MaD:164 | +| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:257:38:257:40 | uri | provenance | Sink:MaD:167 | | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:259:28:259:30 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:260:28:260:30 | uri | provenance | Sink:MaD:166 | +| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:260:28:260:30 | uri | provenance | Sink:MaD:169 | | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:262:25:262:27 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:263:25:263:27 | uri | provenance | Sink:MaD:168 | +| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:263:25:263:27 | uri | provenance | Sink:MaD:171 | | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:265:26:265:28 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:266:26:266:28 | uri | provenance | Sink:MaD:170 | +| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:266:26:266:28 | uri | provenance | Sink:MaD:173 | | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:268:29:268:31 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:269:29:269:31 | uri | provenance | Sink:MaD:172 | +| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:269:29:269:31 | uri | provenance | Sink:MaD:175 | | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:271:27:271:29 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:272:27:272:29 | uri | provenance | Sink:MaD:174 | +| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:272:27:272:29 | uri | provenance | Sink:MaD:177 | | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:274:26:274:28 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:275:26:275:28 | uri | provenance | Sink:MaD:176 | +| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:275:26:275:28 | uri | provenance | Sink:MaD:179 | | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:277:25:277:27 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:278:25:278:27 | uri | provenance | Sink:MaD:178 | +| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:278:25:278:27 | uri | provenance | Sink:MaD:181 | | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:280:27:280:29 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:281:27:281:29 | uri | provenance | Sink:MaD:180 | +| ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:281:27:281:29 | uri | provenance | Sink:MaD:183 | | ApacheHttpSSRFVersion5.java:252:31:252:37 | uriSink : String | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | provenance | Config | -| ApacheHttpSSRFVersion5.java:252:31:252:37 | uriSink : String | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | provenance | MaD:290 | -| ApacheHttpSSRFVersion5.java:256:38:256:40 | uri : URI | ApacheHttpSSRFVersion5.java:256:38:256:51 | toString(...) | provenance | MaD:291 Sink:MaD:163 | -| ApacheHttpSSRFVersion5.java:259:28:259:30 | uri : URI | ApacheHttpSSRFVersion5.java:259:28:259:41 | toString(...) | provenance | MaD:291 Sink:MaD:165 | -| ApacheHttpSSRFVersion5.java:262:25:262:27 | uri : URI | ApacheHttpSSRFVersion5.java:262:25:262:38 | toString(...) | provenance | MaD:291 Sink:MaD:167 | -| ApacheHttpSSRFVersion5.java:265:26:265:28 | uri : URI | ApacheHttpSSRFVersion5.java:265:26:265:39 | toString(...) | provenance | MaD:291 Sink:MaD:169 | -| ApacheHttpSSRFVersion5.java:268:29:268:31 | uri : URI | ApacheHttpSSRFVersion5.java:268:29:268:42 | toString(...) | provenance | MaD:291 Sink:MaD:171 | -| ApacheHttpSSRFVersion5.java:271:27:271:29 | uri : URI | ApacheHttpSSRFVersion5.java:271:27:271:40 | toString(...) | provenance | MaD:291 Sink:MaD:173 | -| ApacheHttpSSRFVersion5.java:274:26:274:28 | uri : URI | ApacheHttpSSRFVersion5.java:274:26:274:39 | toString(...) | provenance | MaD:291 Sink:MaD:175 | -| ApacheHttpSSRFVersion5.java:277:25:277:27 | uri : URI | ApacheHttpSSRFVersion5.java:277:25:277:38 | toString(...) | provenance | MaD:291 Sink:MaD:177 | -| ApacheHttpSSRFVersion5.java:280:27:280:29 | uri : URI | ApacheHttpSSRFVersion5.java:280:27:280:40 | toString(...) | provenance | MaD:291 Sink:MaD:179 | -| ApacheHttpSSRFVersion5.java:295:30:295:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:296:31:296:37 | uriSink : String | provenance | Src:MaD:280 | +| ApacheHttpSSRFVersion5.java:252:31:252:37 | uriSink : String | ApacheHttpSSRFVersion5.java:252:23:252:38 | new URI(...) : URI | provenance | MaD:295 | +| ApacheHttpSSRFVersion5.java:256:38:256:40 | uri : URI | ApacheHttpSSRFVersion5.java:256:38:256:51 | toString(...) | provenance | MaD:296 Sink:MaD:166 | +| ApacheHttpSSRFVersion5.java:259:28:259:30 | uri : URI | ApacheHttpSSRFVersion5.java:259:28:259:41 | toString(...) | provenance | MaD:296 Sink:MaD:168 | +| ApacheHttpSSRFVersion5.java:262:25:262:27 | uri : URI | ApacheHttpSSRFVersion5.java:262:25:262:38 | toString(...) | provenance | MaD:296 Sink:MaD:170 | +| ApacheHttpSSRFVersion5.java:265:26:265:28 | uri : URI | ApacheHttpSSRFVersion5.java:265:26:265:39 | toString(...) | provenance | MaD:296 Sink:MaD:172 | +| ApacheHttpSSRFVersion5.java:268:29:268:31 | uri : URI | ApacheHttpSSRFVersion5.java:268:29:268:42 | toString(...) | provenance | MaD:296 Sink:MaD:174 | +| ApacheHttpSSRFVersion5.java:271:27:271:29 | uri : URI | ApacheHttpSSRFVersion5.java:271:27:271:40 | toString(...) | provenance | MaD:296 Sink:MaD:176 | +| ApacheHttpSSRFVersion5.java:274:26:274:28 | uri : URI | ApacheHttpSSRFVersion5.java:274:26:274:39 | toString(...) | provenance | MaD:296 Sink:MaD:178 | +| ApacheHttpSSRFVersion5.java:277:25:277:27 | uri : URI | ApacheHttpSSRFVersion5.java:277:25:277:38 | toString(...) | provenance | MaD:296 Sink:MaD:180 | +| ApacheHttpSSRFVersion5.java:280:27:280:29 | uri : URI | ApacheHttpSSRFVersion5.java:280:27:280:40 | toString(...) | provenance | MaD:296 Sink:MaD:182 | +| ApacheHttpSSRFVersion5.java:295:30:295:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:296:31:296:37 | uriSink : String | provenance | Src:MaD:283 | | ApacheHttpSSRFVersion5.java:296:23:296:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:308:60:308:62 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:296:23:296:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:309:60:309:62 | uri | provenance | Sink:MaD:212 | +| ApacheHttpSSRFVersion5.java:296:23:296:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:309:60:309:62 | uri | provenance | Sink:MaD:215 | | ApacheHttpSSRFVersion5.java:296:23:296:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:313:53:313:55 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:296:23:296:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:314:53:314:55 | uri | provenance | Sink:MaD:212 | +| ApacheHttpSSRFVersion5.java:296:23:296:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:314:53:314:55 | uri | provenance | Sink:MaD:215 | | ApacheHttpSSRFVersion5.java:296:31:296:37 | uriSink : String | ApacheHttpSSRFVersion5.java:296:23:296:38 | new URI(...) : URI | provenance | Config | -| ApacheHttpSSRFVersion5.java:296:31:296:37 | uriSink : String | ApacheHttpSSRFVersion5.java:296:23:296:38 | new URI(...) : URI | provenance | MaD:290 | -| ApacheHttpSSRFVersion5.java:298:31:298:58 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:299:42:299:49 | hostSink : String | provenance | Src:MaD:280 | -| ApacheHttpSSRFVersion5.java:299:29:299:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:303:34:303:37 | host | provenance | Sink:MaD:181 | -| ApacheHttpSSRFVersion5.java:299:29:299:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:304:34:304:37 | host | provenance | Sink:MaD:182 | -| ApacheHttpSSRFVersion5.java:299:42:299:49 | hostSink : String | ApacheHttpSSRFVersion5.java:299:29:299:50 | new HttpHost(...) : HttpHost | provenance | MaD:299 | -| ApacheHttpSSRFVersion5.java:308:60:308:62 | uri : URI | ApacheHttpSSRFVersion5.java:308:60:308:73 | toString(...) | provenance | MaD:291 Sink:MaD:211 | -| ApacheHttpSSRFVersion5.java:313:53:313:55 | uri : URI | ApacheHttpSSRFVersion5.java:313:53:313:66 | toString(...) | provenance | MaD:291 Sink:MaD:211 | -| ApacheHttpSSRFVersion5.java:326:30:326:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:327:31:327:37 | uriSink : String | provenance | Src:MaD:280 | +| ApacheHttpSSRFVersion5.java:296:31:296:37 | uriSink : String | ApacheHttpSSRFVersion5.java:296:23:296:38 | new URI(...) : URI | provenance | MaD:295 | +| ApacheHttpSSRFVersion5.java:298:31:298:58 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:299:42:299:49 | hostSink : String | provenance | Src:MaD:283 | +| ApacheHttpSSRFVersion5.java:299:29:299:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:303:34:303:37 | host | provenance | Sink:MaD:184 | +| ApacheHttpSSRFVersion5.java:299:29:299:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:304:34:304:37 | host | provenance | Sink:MaD:185 | +| ApacheHttpSSRFVersion5.java:299:42:299:49 | hostSink : String | ApacheHttpSSRFVersion5.java:299:29:299:50 | new HttpHost(...) : HttpHost | provenance | MaD:304 | +| ApacheHttpSSRFVersion5.java:308:60:308:62 | uri : URI | ApacheHttpSSRFVersion5.java:308:60:308:73 | toString(...) | provenance | MaD:296 Sink:MaD:214 | +| ApacheHttpSSRFVersion5.java:313:53:313:55 | uri : URI | ApacheHttpSSRFVersion5.java:313:53:313:66 | toString(...) | provenance | MaD:296 Sink:MaD:214 | +| ApacheHttpSSRFVersion5.java:326:30:326:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:327:31:327:37 | uriSink : String | provenance | Src:MaD:283 | | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:333:42:333:44 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:334:42:334:44 | uri | provenance | Sink:MaD:184 | +| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:334:42:334:44 | uri | provenance | Sink:MaD:187 | | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:336:39:336:41 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:337:39:337:41 | uri | provenance | Sink:MaD:186 | +| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:337:39:337:41 | uri | provenance | Sink:MaD:189 | | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:339:40:339:42 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:340:40:340:42 | uri | provenance | Sink:MaD:188 | +| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:340:40:340:42 | uri | provenance | Sink:MaD:191 | | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:342:43:342:45 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:343:43:343:45 | uri | provenance | Sink:MaD:190 | +| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:343:43:343:45 | uri | provenance | Sink:MaD:193 | | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:345:41:345:43 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:346:41:346:43 | uri | provenance | Sink:MaD:192 | +| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:346:41:346:43 | uri | provenance | Sink:MaD:195 | | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:348:40:348:42 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:349:40:349:42 | uri | provenance | Sink:MaD:194 | +| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:349:40:349:42 | uri | provenance | Sink:MaD:197 | | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:351:39:351:41 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:352:39:352:41 | uri | provenance | Sink:MaD:196 | +| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:352:39:352:41 | uri | provenance | Sink:MaD:199 | | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:356:48:356:50 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:357:48:357:50 | uri | provenance | Sink:MaD:209 | +| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:357:48:357:50 | uri | provenance | Sink:MaD:212 | | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:359:41:359:43 | uri : URI | provenance | | -| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:360:41:360:43 | uri | provenance | Sink:MaD:198 | +| ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:360:41:360:43 | uri | provenance | Sink:MaD:201 | | ApacheHttpSSRFVersion5.java:327:31:327:37 | uriSink : String | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | provenance | Config | -| ApacheHttpSSRFVersion5.java:327:31:327:37 | uriSink : String | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | provenance | MaD:290 | -| ApacheHttpSSRFVersion5.java:329:31:329:58 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:330:42:330:49 | hostSink : String | provenance | Src:MaD:280 | -| ApacheHttpSSRFVersion5.java:330:29:330:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:354:53:354:56 | host | provenance | Sink:MaD:207 | -| ApacheHttpSSRFVersion5.java:330:42:330:49 | hostSink : String | ApacheHttpSSRFVersion5.java:330:29:330:50 | new HttpHost(...) : HttpHost | provenance | MaD:299 | -| ApacheHttpSSRFVersion5.java:333:42:333:44 | uri : URI | ApacheHttpSSRFVersion5.java:333:42:333:55 | toString(...) | provenance | MaD:291 Sink:MaD:183 | -| ApacheHttpSSRFVersion5.java:336:39:336:41 | uri : URI | ApacheHttpSSRFVersion5.java:336:39:336:52 | toString(...) | provenance | MaD:291 Sink:MaD:185 | -| ApacheHttpSSRFVersion5.java:339:40:339:42 | uri : URI | ApacheHttpSSRFVersion5.java:339:40:339:53 | toString(...) | provenance | MaD:291 Sink:MaD:187 | -| ApacheHttpSSRFVersion5.java:342:43:342:45 | uri : URI | ApacheHttpSSRFVersion5.java:342:43:342:56 | toString(...) | provenance | MaD:291 Sink:MaD:189 | -| ApacheHttpSSRFVersion5.java:345:41:345:43 | uri : URI | ApacheHttpSSRFVersion5.java:345:41:345:54 | toString(...) | provenance | MaD:291 Sink:MaD:191 | -| ApacheHttpSSRFVersion5.java:348:40:348:42 | uri : URI | ApacheHttpSSRFVersion5.java:348:40:348:53 | toString(...) | provenance | MaD:291 Sink:MaD:193 | -| ApacheHttpSSRFVersion5.java:351:39:351:41 | uri : URI | ApacheHttpSSRFVersion5.java:351:39:351:52 | toString(...) | provenance | MaD:291 Sink:MaD:195 | -| ApacheHttpSSRFVersion5.java:356:48:356:50 | uri : URI | ApacheHttpSSRFVersion5.java:356:48:356:61 | toString(...) | provenance | MaD:291 Sink:MaD:208 | -| ApacheHttpSSRFVersion5.java:359:41:359:43 | uri : URI | ApacheHttpSSRFVersion5.java:359:41:359:54 | toString(...) | provenance | MaD:291 Sink:MaD:197 | -| ApacheHttpSSRFVersion5.java:372:30:372:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:373:31:373:37 | uriSink : String | provenance | Src:MaD:280 | -| ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:380:57:380:59 | uri | provenance | Sink:MaD:200 | -| ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:382:51:382:53 | uri | provenance | Sink:MaD:202 | -| ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:386:50:386:52 | uri | provenance | Sink:MaD:204 | -| ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:388:44:388:46 | uri | provenance | Sink:MaD:206 | -| ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:390:24:390:26 | uri | provenance | Sink:MaD:210 | -| ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:394:24:394:26 | uri | provenance | Sink:MaD:210 | +| ApacheHttpSSRFVersion5.java:327:31:327:37 | uriSink : String | ApacheHttpSSRFVersion5.java:327:23:327:38 | new URI(...) : URI | provenance | MaD:295 | +| ApacheHttpSSRFVersion5.java:329:31:329:58 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:330:42:330:49 | hostSink : String | provenance | Src:MaD:283 | +| ApacheHttpSSRFVersion5.java:330:29:330:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:354:53:354:56 | host | provenance | Sink:MaD:210 | +| ApacheHttpSSRFVersion5.java:330:42:330:49 | hostSink : String | ApacheHttpSSRFVersion5.java:330:29:330:50 | new HttpHost(...) : HttpHost | provenance | MaD:304 | +| ApacheHttpSSRFVersion5.java:333:42:333:44 | uri : URI | ApacheHttpSSRFVersion5.java:333:42:333:55 | toString(...) | provenance | MaD:296 Sink:MaD:186 | +| ApacheHttpSSRFVersion5.java:336:39:336:41 | uri : URI | ApacheHttpSSRFVersion5.java:336:39:336:52 | toString(...) | provenance | MaD:296 Sink:MaD:188 | +| ApacheHttpSSRFVersion5.java:339:40:339:42 | uri : URI | ApacheHttpSSRFVersion5.java:339:40:339:53 | toString(...) | provenance | MaD:296 Sink:MaD:190 | +| ApacheHttpSSRFVersion5.java:342:43:342:45 | uri : URI | ApacheHttpSSRFVersion5.java:342:43:342:56 | toString(...) | provenance | MaD:296 Sink:MaD:192 | +| ApacheHttpSSRFVersion5.java:345:41:345:43 | uri : URI | ApacheHttpSSRFVersion5.java:345:41:345:54 | toString(...) | provenance | MaD:296 Sink:MaD:194 | +| ApacheHttpSSRFVersion5.java:348:40:348:42 | uri : URI | ApacheHttpSSRFVersion5.java:348:40:348:53 | toString(...) | provenance | MaD:296 Sink:MaD:196 | +| ApacheHttpSSRFVersion5.java:351:39:351:41 | uri : URI | ApacheHttpSSRFVersion5.java:351:39:351:52 | toString(...) | provenance | MaD:296 Sink:MaD:198 | +| ApacheHttpSSRFVersion5.java:356:48:356:50 | uri : URI | ApacheHttpSSRFVersion5.java:356:48:356:61 | toString(...) | provenance | MaD:296 Sink:MaD:211 | +| ApacheHttpSSRFVersion5.java:359:41:359:43 | uri : URI | ApacheHttpSSRFVersion5.java:359:41:359:54 | toString(...) | provenance | MaD:296 Sink:MaD:200 | +| ApacheHttpSSRFVersion5.java:372:30:372:56 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:373:31:373:37 | uriSink : String | provenance | Src:MaD:283 | +| ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:380:57:380:59 | uri | provenance | Sink:MaD:203 | +| ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:382:51:382:53 | uri | provenance | Sink:MaD:205 | +| ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:386:50:386:52 | uri | provenance | Sink:MaD:207 | +| ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:388:44:388:46 | uri | provenance | Sink:MaD:209 | +| ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:390:24:390:26 | uri | provenance | Sink:MaD:213 | +| ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | ApacheHttpSSRFVersion5.java:394:24:394:26 | uri | provenance | Sink:MaD:213 | | ApacheHttpSSRFVersion5.java:373:31:373:37 | uriSink : String | ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | provenance | Config | -| ApacheHttpSSRFVersion5.java:373:31:373:37 | uriSink : String | ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | provenance | MaD:290 | -| ApacheHttpSSRFVersion5.java:375:31:375:58 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:376:42:376:49 | hostSink : String | provenance | Src:MaD:280 | -| ApacheHttpSSRFVersion5.java:376:29:376:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:379:57:379:60 | host | provenance | Sink:MaD:199 | -| ApacheHttpSSRFVersion5.java:376:29:376:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:381:51:381:54 | host | provenance | Sink:MaD:201 | -| ApacheHttpSSRFVersion5.java:376:29:376:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:385:50:385:53 | host | provenance | Sink:MaD:203 | -| ApacheHttpSSRFVersion5.java:376:29:376:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:387:44:387:47 | host | provenance | Sink:MaD:205 | -| ApacheHttpSSRFVersion5.java:376:42:376:49 | hostSink : String | ApacheHttpSSRFVersion5.java:376:29:376:50 | new HttpHost(...) : HttpHost | provenance | MaD:299 | -| JakartaWsSSRF.java:14:22:14:48 | getParameter(...) : String | JakartaWsSSRF.java:15:23:15:25 | url | provenance | Src:MaD:280 Sink:MaD:6 | -| JavaNetHttpSSRF.java:25:27:25:53 | getParameter(...) : String | JavaNetHttpSSRF.java:26:31:26:34 | sink : String | provenance | Src:MaD:280 | -| JavaNetHttpSSRF.java:26:23:26:35 | new URI(...) : URI | JavaNetHttpSSRF.java:39:59:39:61 | uri | provenance | Sink:MaD:9 | +| ApacheHttpSSRFVersion5.java:373:31:373:37 | uriSink : String | ApacheHttpSSRFVersion5.java:373:23:373:38 | new URI(...) : URI | provenance | MaD:295 | +| ApacheHttpSSRFVersion5.java:375:31:375:58 | getParameter(...) : String | ApacheHttpSSRFVersion5.java:376:42:376:49 | hostSink : String | provenance | Src:MaD:283 | +| ApacheHttpSSRFVersion5.java:376:29:376:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:379:57:379:60 | host | provenance | Sink:MaD:202 | +| ApacheHttpSSRFVersion5.java:376:29:376:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:381:51:381:54 | host | provenance | Sink:MaD:204 | +| ApacheHttpSSRFVersion5.java:376:29:376:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:385:50:385:53 | host | provenance | Sink:MaD:206 | +| ApacheHttpSSRFVersion5.java:376:29:376:50 | new HttpHost(...) : HttpHost | ApacheHttpSSRFVersion5.java:387:44:387:47 | host | provenance | Sink:MaD:208 | +| ApacheHttpSSRFVersion5.java:376:42:376:49 | hostSink : String | ApacheHttpSSRFVersion5.java:376:29:376:50 | new HttpHost(...) : HttpHost | provenance | MaD:304 | +| JakartaWsSSRF.java:14:22:14:48 | getParameter(...) : String | JakartaWsSSRF.java:15:23:15:25 | url | provenance | Src:MaD:283 Sink:MaD:9 | +| JavaNetHttpSSRF.java:25:27:25:53 | getParameter(...) : String | JavaNetHttpSSRF.java:26:31:26:34 | sink : String | provenance | Src:MaD:283 | +| JavaNetHttpSSRF.java:26:23:26:35 | new URI(...) : URI | JavaNetHttpSSRF.java:39:59:39:61 | uri | provenance | Sink:MaD:12 | | JavaNetHttpSSRF.java:26:31:26:34 | sink : String | JavaNetHttpSSRF.java:26:23:26:35 | new URI(...) : URI | provenance | Config | -| JavaNetHttpSSRF.java:26:31:26:34 | sink : String | JavaNetHttpSSRF.java:26:23:26:35 | new URI(...) : URI | provenance | MaD:290 | +| JavaNetHttpSSRF.java:26:31:26:34 | sink : String | JavaNetHttpSSRF.java:26:23:26:35 | new URI(...) : URI | provenance | MaD:295 | | JavaNetHttpSSRF.java:26:31:26:34 | sink : String | JavaNetHttpSSRF.java:27:40:27:43 | sink : String | provenance | | -| JavaNetHttpSSRF.java:27:24:27:57 | new URI(...) : URI | JavaNetHttpSSRF.java:38:65:38:68 | uri2 | provenance | Sink:MaD:8 | +| JavaNetHttpSSRF.java:27:24:27:57 | new URI(...) : URI | JavaNetHttpSSRF.java:38:65:38:68 | uri2 | provenance | Sink:MaD:11 | | JavaNetHttpSSRF.java:27:40:27:43 | sink : String | JavaNetHttpSSRF.java:27:24:27:57 | new URI(...) : URI | provenance | Config | | JavaNetHttpSSRF.java:27:40:27:43 | sink : String | JavaNetHttpSSRF.java:28:32:28:35 | sink : String | provenance | | -| JavaNetHttpSSRF.java:28:24:28:36 | new URL(...) : URL | JavaNetHttpSSRF.java:30:32:30:35 | url1 | provenance | Sink:MaD:12 | -| JavaNetHttpSSRF.java:28:24:28:36 | new URL(...) : URL | JavaNetHttpSSRF.java:33:32:33:35 | url1 | provenance | Sink:MaD:12 | -| JavaNetHttpSSRF.java:28:24:28:36 | new URL(...) : URL | JavaNetHttpSSRF.java:34:30:34:33 | url1 | provenance | Sink:MaD:13 | +| JavaNetHttpSSRF.java:28:24:28:36 | new URL(...) : URL | JavaNetHttpSSRF.java:30:32:30:35 | url1 | provenance | Sink:MaD:15 | +| JavaNetHttpSSRF.java:28:24:28:36 | new URL(...) : URL | JavaNetHttpSSRF.java:33:32:33:35 | url1 | provenance | Sink:MaD:15 | +| JavaNetHttpSSRF.java:28:24:28:36 | new URL(...) : URL | JavaNetHttpSSRF.java:34:30:34:33 | url1 | provenance | Sink:MaD:16 | | JavaNetHttpSSRF.java:28:32:28:35 | sink : String | JavaNetHttpSSRF.java:28:24:28:36 | new URL(...) : URL | provenance | Config | -| JavaNetHttpSSRF.java:28:32:28:35 | sink : String | JavaNetHttpSSRF.java:28:24:28:36 | new URL(...) : URL | provenance | MaD:293 | -| JaxWsSSRF.java:14:22:14:48 | getParameter(...) : String | JaxWsSSRF.java:15:23:15:25 | url | provenance | Src:MaD:280 Sink:MaD:26 | -| JdbcUrlSSRF.java:21:26:21:56 | getParameter(...) : String | JdbcUrlSSRF.java:26:28:26:34 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:20 | -| JdbcUrlSSRF.java:21:26:21:56 | getParameter(...) : String | JdbcUrlSSRF.java:28:41:28:47 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:21 | -| JdbcUrlSSRF.java:21:26:21:56 | getParameter(...) : String | JdbcUrlSSRF.java:29:41:29:47 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:23 | -| JdbcUrlSSRF.java:21:26:21:56 | getParameter(...) : String | JdbcUrlSSRF.java:30:41:30:47 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:22 | -| JdbcUrlSSRF.java:21:26:21:56 | getParameter(...) : String | JdbcUrlSSRF.java:32:27:32:33 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:245 | -| JdbcUrlSSRF.java:40:26:40:56 | getParameter(...) : String | JdbcUrlSSRF.java:43:27:43:33 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:2 | -| JdbcUrlSSRF.java:40:26:40:56 | getParameter(...) : String | JdbcUrlSSRF.java:48:23:48:29 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:2 | -| JdbcUrlSSRF.java:40:26:40:56 | getParameter(...) : String | JdbcUrlSSRF.java:52:38:52:44 | jdbcUrl : String | provenance | Src:MaD:280 | +| JavaNetHttpSSRF.java:28:32:28:35 | sink : String | JavaNetHttpSSRF.java:28:24:28:36 | new URL(...) : URL | provenance | MaD:298 | +| JaxWsSSRF.java:14:22:14:48 | getParameter(...) : String | JaxWsSSRF.java:15:23:15:25 | url | provenance | Src:MaD:283 Sink:MaD:29 | +| JdbcUrlSSRF.java:21:26:21:56 | getParameter(...) : String | JdbcUrlSSRF.java:26:28:26:34 | jdbcUrl | provenance | Src:MaD:283 Sink:MaD:23 | +| JdbcUrlSSRF.java:21:26:21:56 | getParameter(...) : String | JdbcUrlSSRF.java:28:41:28:47 | jdbcUrl | provenance | Src:MaD:283 Sink:MaD:24 | +| JdbcUrlSSRF.java:21:26:21:56 | getParameter(...) : String | JdbcUrlSSRF.java:29:41:29:47 | jdbcUrl | provenance | Src:MaD:283 Sink:MaD:26 | +| JdbcUrlSSRF.java:21:26:21:56 | getParameter(...) : String | JdbcUrlSSRF.java:30:41:30:47 | jdbcUrl | provenance | Src:MaD:283 Sink:MaD:25 | +| JdbcUrlSSRF.java:21:26:21:56 | getParameter(...) : String | JdbcUrlSSRF.java:32:27:32:33 | jdbcUrl | provenance | Src:MaD:283 Sink:MaD:248 | +| JdbcUrlSSRF.java:40:26:40:56 | getParameter(...) : String | JdbcUrlSSRF.java:43:27:43:33 | jdbcUrl | provenance | Src:MaD:283 Sink:MaD:2 | +| JdbcUrlSSRF.java:40:26:40:56 | getParameter(...) : String | JdbcUrlSSRF.java:48:23:48:29 | jdbcUrl | provenance | Src:MaD:283 Sink:MaD:2 | +| JdbcUrlSSRF.java:40:26:40:56 | getParameter(...) : String | JdbcUrlSSRF.java:52:38:52:44 | jdbcUrl : String | provenance | Src:MaD:283 | | JdbcUrlSSRF.java:52:9:52:13 | props : Properties | JdbcUrlSSRF.java:54:49:54:53 | props | provenance | Sink:MaD:1 | | JdbcUrlSSRF.java:52:9:52:13 | props [post update] : Properties [] : String | JdbcUrlSSRF.java:54:49:54:53 | props | provenance | Sink:MaD:1 | | JdbcUrlSSRF.java:52:38:52:44 | jdbcUrl : String | JdbcUrlSSRF.java:52:9:52:13 | props : Properties | provenance | Config | -| JdbcUrlSSRF.java:52:38:52:44 | jdbcUrl : String | JdbcUrlSSRF.java:52:9:52:13 | props [post update] : Properties [] : String | provenance | MaD:298 | -| JdbcUrlSSRF.java:60:26:60:56 | getParameter(...) : String | JdbcUrlSSRF.java:65:27:65:33 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:260 | -| JdbcUrlSSRF.java:60:26:60:56 | getParameter(...) : String | JdbcUrlSSRF.java:67:75:67:81 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:261 | -| JdbcUrlSSRF.java:60:26:60:56 | getParameter(...) : String | JdbcUrlSSRF.java:70:75:70:81 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:263 | -| JdbcUrlSSRF.java:60:26:60:56 | getParameter(...) : String | JdbcUrlSSRF.java:73:75:73:81 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:262 | -| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:82:21:82:27 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:238 | -| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:83:21:83:27 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:239 | -| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:84:21:84:27 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:240 | -| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:86:19:86:25 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:241 | -| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:87:19:87:25 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:242 | -| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:88:19:88:25 | jdbcUrl | provenance | Src:MaD:280 Sink:MaD:243 | -| MicronautSSRF.java:14:32:14:53 | url : String | MicronautSSRF.java:15:45:15:47 | url | provenance | Sink:MaD:4 | -| MicronautSSRF.java:19:42:19:63 | url : String | MicronautSSRF.java:20:45:20:47 | url | provenance | Sink:MaD:3 | -| MicronautSSRF.java:24:37:24:58 | url : String | MicronautSSRF.java:25:45:25:47 | url | provenance | Sink:MaD:5 | -| MicronautSSRF.java:29:34:29:56 | host : String | MicronautSSRF.java:30:60:30:63 | host : String | provenance | | -| MicronautSSRF.java:30:19:30:64 | host(...) : UriBuilder | MicronautSSRF.java:30:19:30:72 | build(...) : URI | provenance | MaD:281 | -| MicronautSSRF.java:30:19:30:72 | build(...) : URI | MicronautSSRF.java:31:45:31:47 | uri : URI | provenance | | -| MicronautSSRF.java:30:60:30:63 | host : String | MicronautSSRF.java:30:19:30:64 | host(...) : UriBuilder | provenance | MaD:282 | -| MicronautSSRF.java:31:45:31:47 | uri : URI | MicronautSSRF.java:31:45:31:58 | toString(...) | provenance | MaD:291 Sink:MaD:4 | -| ReactiveWebClientSSRF.java:15:26:15:52 | getParameter(...) : String | ReactiveWebClientSSRF.java:16:52:16:54 | url | provenance | Src:MaD:280 Sink:MaD:277 | -| ReactiveWebClientSSRF.java:32:26:32:52 | getParameter(...) : String | ReactiveWebClientSSRF.java:35:30:35:32 | url | provenance | Src:MaD:280 Sink:MaD:276 | -| SanitizationTests.java:22:23:22:58 | new URI(...) : URI | SanitizationTests.java:25:52:25:54 | uri | provenance | Sink:MaD:9 | +| JdbcUrlSSRF.java:52:38:52:44 | jdbcUrl : String | JdbcUrlSSRF.java:52:9:52:13 | props [post update] : Properties [] : String | provenance | MaD:303 | +| JdbcUrlSSRF.java:60:26:60:56 | getParameter(...) : String | JdbcUrlSSRF.java:65:27:65:33 | jdbcUrl | provenance | Src:MaD:283 Sink:MaD:263 | +| JdbcUrlSSRF.java:60:26:60:56 | getParameter(...) : String | JdbcUrlSSRF.java:67:75:67:81 | jdbcUrl | provenance | Src:MaD:283 Sink:MaD:264 | +| JdbcUrlSSRF.java:60:26:60:56 | getParameter(...) : String | JdbcUrlSSRF.java:70:75:70:81 | jdbcUrl | provenance | Src:MaD:283 Sink:MaD:266 | +| JdbcUrlSSRF.java:60:26:60:56 | getParameter(...) : String | JdbcUrlSSRF.java:73:75:73:81 | jdbcUrl | provenance | Src:MaD:283 Sink:MaD:265 | +| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:82:21:82:27 | jdbcUrl | provenance | Src:MaD:283 Sink:MaD:241 | +| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:83:21:83:27 | jdbcUrl | provenance | Src:MaD:283 Sink:MaD:242 | +| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:84:21:84:27 | jdbcUrl | provenance | Src:MaD:283 Sink:MaD:243 | +| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:86:19:86:25 | jdbcUrl | provenance | Src:MaD:283 Sink:MaD:244 | +| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:87:19:87:25 | jdbcUrl | provenance | Src:MaD:283 Sink:MaD:245 | +| JdbcUrlSSRF.java:80:26:80:56 | getParameter(...) : String | JdbcUrlSSRF.java:88:19:88:25 | jdbcUrl | provenance | Src:MaD:283 Sink:MaD:246 | +| MicronautSSRF.java:15:32:15:53 | url : String | MicronautSSRF.java:16:45:16:47 | url | provenance | Sink:MaD:5 | +| MicronautSSRF.java:20:42:20:63 | url : String | MicronautSSRF.java:21:45:21:47 | url | provenance | Sink:MaD:4 | +| MicronautSSRF.java:25:37:25:58 | url : String | MicronautSSRF.java:26:45:26:47 | url | provenance | Sink:MaD:6 | +| MicronautSSRF.java:30:34:30:56 | host : String | MicronautSSRF.java:31:60:31:63 | host : String | provenance | | +| MicronautSSRF.java:31:19:31:64 | host(...) : UriBuilder | MicronautSSRF.java:31:19:31:72 | build(...) : URI | provenance | MaD:284 | +| MicronautSSRF.java:31:19:31:72 | build(...) : URI | MicronautSSRF.java:32:45:32:47 | uri : URI | provenance | | +| MicronautSSRF.java:31:60:31:63 | host : String | MicronautSSRF.java:31:19:31:64 | host(...) : UriBuilder | provenance | MaD:285+MaD:286 | +| MicronautSSRF.java:32:45:32:47 | uri : URI | MicronautSSRF.java:32:45:32:58 | toString(...) | provenance | MaD:296 Sink:MaD:5 | +| MicronautSSRF.java:36:39:36:60 | url : String | MicronautSSRF.java:37:61:37:63 | url : String | provenance | | +| MicronautSSRF.java:37:61:37:63 | url : String | MicronautSSRF.java:37:45:37:64 | GET(...) | provenance | MaD:287 Sink:MaD:3 | +| MicronautSSRF.java:41:35:41:56 | url : String | MicronautSSRF.java:42:32:42:34 | url | provenance | Sink:MaD:8 | +| MicronautSSRF.java:46:42:46:63 | url : String | MicronautSSRF.java:47:48:47:50 | url : String | provenance | | +| MicronautSSRF.java:47:48:47:50 | url : String | MicronautSSRF.java:47:32:47:51 | GET(...) | provenance | MaD:287 Sink:MaD:7 | +| ReactiveWebClientSSRF.java:15:26:15:52 | getParameter(...) : String | ReactiveWebClientSSRF.java:16:52:16:54 | url | provenance | Src:MaD:283 Sink:MaD:280 | +| ReactiveWebClientSSRF.java:32:26:32:52 | getParameter(...) : String | ReactiveWebClientSSRF.java:35:30:35:32 | url | provenance | Src:MaD:283 Sink:MaD:279 | +| SanitizationTests.java:22:23:22:58 | new URI(...) : URI | SanitizationTests.java:25:52:25:54 | uri | provenance | Sink:MaD:12 | | SanitizationTests.java:22:23:22:58 | new URI(...) : URI | SanitizationTests.java:25:52:25:54 | uri : URI | provenance | | -| SanitizationTests.java:22:31:22:57 | getParameter(...) : String | SanitizationTests.java:22:23:22:58 | new URI(...) : URI | provenance | Src:MaD:280 Config | -| SanitizationTests.java:22:31:22:57 | getParameter(...) : String | SanitizationTests.java:22:23:22:58 | new URI(...) : URI | provenance | Src:MaD:280 MaD:290 | -| SanitizationTests.java:25:29:25:55 | newBuilder(...) : Builder | SanitizationTests.java:25:29:25:63 | build(...) : HttpRequest | provenance | MaD:288 | -| SanitizationTests.java:25:29:25:63 | build(...) : HttpRequest | SanitizationTests.java:26:25:26:25 | r | provenance | Sink:MaD:7 | -| SanitizationTests.java:25:52:25:54 | uri : URI | SanitizationTests.java:25:29:25:55 | newBuilder(...) : Builder | provenance | MaD:289 | -| SanitizationTests.java:78:33:78:63 | getParameter(...) : String | SanitizationTests.java:79:67:79:76 | unsafeUri3 : String | provenance | Src:MaD:280 | -| SanitizationTests.java:79:36:79:78 | newBuilder(...) : Builder | SanitizationTests.java:79:36:79:86 | build(...) : HttpRequest | provenance | MaD:288 | -| SanitizationTests.java:79:36:79:86 | build(...) : HttpRequest | SanitizationTests.java:80:25:80:32 | unsafer3 | provenance | Sink:MaD:7 | -| SanitizationTests.java:79:59:79:77 | new URI(...) : URI | SanitizationTests.java:79:36:79:78 | newBuilder(...) : Builder | provenance | MaD:289 | -| SanitizationTests.java:79:67:79:76 | unsafeUri3 : String | SanitizationTests.java:79:59:79:77 | new URI(...) | provenance | Config Sink:MaD:9 | -| SanitizationTests.java:79:67:79:76 | unsafeUri3 : String | SanitizationTests.java:79:59:79:77 | new URI(...) | provenance | MaD:290 Sink:MaD:9 | +| SanitizationTests.java:22:31:22:57 | getParameter(...) : String | SanitizationTests.java:22:23:22:58 | new URI(...) : URI | provenance | Src:MaD:283 Config | +| SanitizationTests.java:22:31:22:57 | getParameter(...) : String | SanitizationTests.java:22:23:22:58 | new URI(...) : URI | provenance | Src:MaD:283 MaD:295 | +| SanitizationTests.java:25:29:25:55 | newBuilder(...) : Builder | SanitizationTests.java:25:29:25:63 | build(...) : HttpRequest | provenance | MaD:293 | +| SanitizationTests.java:25:29:25:63 | build(...) : HttpRequest | SanitizationTests.java:26:25:26:25 | r | provenance | Sink:MaD:10 | +| SanitizationTests.java:25:52:25:54 | uri : URI | SanitizationTests.java:25:29:25:55 | newBuilder(...) : Builder | provenance | MaD:294 | +| SanitizationTests.java:78:33:78:63 | getParameter(...) : String | SanitizationTests.java:79:67:79:76 | unsafeUri3 : String | provenance | Src:MaD:283 | +| SanitizationTests.java:79:36:79:78 | newBuilder(...) : Builder | SanitizationTests.java:79:36:79:86 | build(...) : HttpRequest | provenance | MaD:293 | +| SanitizationTests.java:79:36:79:86 | build(...) : HttpRequest | SanitizationTests.java:80:25:80:32 | unsafer3 | provenance | Sink:MaD:10 | +| SanitizationTests.java:79:59:79:77 | new URI(...) : URI | SanitizationTests.java:79:36:79:78 | newBuilder(...) : Builder | provenance | MaD:294 | +| SanitizationTests.java:79:67:79:76 | unsafeUri3 : String | SanitizationTests.java:79:59:79:77 | new URI(...) | provenance | Config Sink:MaD:12 | +| SanitizationTests.java:79:67:79:76 | unsafeUri3 : String | SanitizationTests.java:79:59:79:77 | new URI(...) | provenance | MaD:295 Sink:MaD:12 | | SanitizationTests.java:79:67:79:76 | unsafeUri3 : String | SanitizationTests.java:79:59:79:77 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:79:67:79:76 | unsafeUri3 : String | SanitizationTests.java:79:59:79:77 | new URI(...) : URI | provenance | MaD:290 | -| SanitizationTests.java:82:49:82:79 | getParameter(...) : String | SanitizationTests.java:83:67:83:76 | unsafeUri4 : String | provenance | Src:MaD:280 | -| SanitizationTests.java:83:36:83:78 | newBuilder(...) : Builder | SanitizationTests.java:83:36:83:86 | build(...) : HttpRequest | provenance | MaD:288 | -| SanitizationTests.java:83:36:83:86 | build(...) : HttpRequest | SanitizationTests.java:84:25:84:32 | unsafer4 | provenance | Sink:MaD:7 | -| SanitizationTests.java:83:59:83:77 | new URI(...) : URI | SanitizationTests.java:83:36:83:78 | newBuilder(...) : Builder | provenance | MaD:289 | -| SanitizationTests.java:83:67:83:76 | unsafeUri4 : String | SanitizationTests.java:83:59:83:77 | new URI(...) | provenance | Config Sink:MaD:9 | -| SanitizationTests.java:83:67:83:76 | unsafeUri4 : String | SanitizationTests.java:83:59:83:77 | new URI(...) | provenance | MaD:290 Sink:MaD:9 | +| SanitizationTests.java:79:67:79:76 | unsafeUri3 : String | SanitizationTests.java:79:59:79:77 | new URI(...) : URI | provenance | MaD:295 | +| SanitizationTests.java:82:49:82:79 | getParameter(...) : String | SanitizationTests.java:83:67:83:76 | unsafeUri4 : String | provenance | Src:MaD:283 | +| SanitizationTests.java:83:36:83:78 | newBuilder(...) : Builder | SanitizationTests.java:83:36:83:86 | build(...) : HttpRequest | provenance | MaD:293 | +| SanitizationTests.java:83:36:83:86 | build(...) : HttpRequest | SanitizationTests.java:84:25:84:32 | unsafer4 | provenance | Sink:MaD:10 | +| SanitizationTests.java:83:59:83:77 | new URI(...) : URI | SanitizationTests.java:83:36:83:78 | newBuilder(...) : Builder | provenance | MaD:294 | +| SanitizationTests.java:83:67:83:76 | unsafeUri4 : String | SanitizationTests.java:83:59:83:77 | new URI(...) | provenance | Config Sink:MaD:12 | +| SanitizationTests.java:83:67:83:76 | unsafeUri4 : String | SanitizationTests.java:83:59:83:77 | new URI(...) | provenance | MaD:295 Sink:MaD:12 | | SanitizationTests.java:83:67:83:76 | unsafeUri4 : String | SanitizationTests.java:83:59:83:77 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:83:67:83:76 | unsafeUri4 : String | SanitizationTests.java:83:59:83:77 | new URI(...) : URI | provenance | MaD:290 | +| SanitizationTests.java:83:67:83:76 | unsafeUri4 : String | SanitizationTests.java:83:59:83:77 | new URI(...) : URI | provenance | MaD:295 | | SanitizationTests.java:87:13:87:22 | unsafeUri5 [post update] : StringBuilder | SanitizationTests.java:88:67:88:76 | unsafeUri5 : StringBuilder | provenance | | -| SanitizationTests.java:87:31:87:61 | getParameter(...) : String | SanitizationTests.java:87:13:87:22 | unsafeUri5 [post update] : StringBuilder | provenance | Src:MaD:280 MaD:283 | -| SanitizationTests.java:88:36:88:89 | newBuilder(...) : Builder | SanitizationTests.java:88:36:88:97 | build(...) : HttpRequest | provenance | MaD:288 | -| SanitizationTests.java:88:36:88:97 | build(...) : HttpRequest | SanitizationTests.java:89:25:89:32 | unsafer5 | provenance | Sink:MaD:7 | -| SanitizationTests.java:88:59:88:88 | new URI(...) : URI | SanitizationTests.java:88:36:88:89 | newBuilder(...) : Builder | provenance | MaD:289 | -| SanitizationTests.java:88:67:88:76 | unsafeUri5 : StringBuilder | SanitizationTests.java:88:67:88:87 | toString(...) : String | provenance | MaD:285 | -| SanitizationTests.java:88:67:88:87 | toString(...) : String | SanitizationTests.java:88:59:88:88 | new URI(...) | provenance | Config Sink:MaD:9 | -| SanitizationTests.java:88:67:88:87 | toString(...) : String | SanitizationTests.java:88:59:88:88 | new URI(...) | provenance | MaD:290 Sink:MaD:9 | +| SanitizationTests.java:87:31:87:61 | getParameter(...) : String | SanitizationTests.java:87:13:87:22 | unsafeUri5 [post update] : StringBuilder | provenance | Src:MaD:283 MaD:288 | +| SanitizationTests.java:88:36:88:89 | newBuilder(...) : Builder | SanitizationTests.java:88:36:88:97 | build(...) : HttpRequest | provenance | MaD:293 | +| SanitizationTests.java:88:36:88:97 | build(...) : HttpRequest | SanitizationTests.java:89:25:89:32 | unsafer5 | provenance | Sink:MaD:10 | +| SanitizationTests.java:88:59:88:88 | new URI(...) : URI | SanitizationTests.java:88:36:88:89 | newBuilder(...) : Builder | provenance | MaD:294 | +| SanitizationTests.java:88:67:88:76 | unsafeUri5 : StringBuilder | SanitizationTests.java:88:67:88:87 | toString(...) : String | provenance | MaD:290 | +| SanitizationTests.java:88:67:88:87 | toString(...) : String | SanitizationTests.java:88:59:88:88 | new URI(...) | provenance | Config Sink:MaD:12 | +| SanitizationTests.java:88:67:88:87 | toString(...) : String | SanitizationTests.java:88:59:88:88 | new URI(...) | provenance | MaD:295 Sink:MaD:12 | | SanitizationTests.java:88:67:88:87 | toString(...) : String | SanitizationTests.java:88:59:88:88 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:88:67:88:87 | toString(...) : String | SanitizationTests.java:88:59:88:88 | new URI(...) : URI | provenance | MaD:290 | +| SanitizationTests.java:88:67:88:87 | toString(...) : String | SanitizationTests.java:88:59:88:88 | new URI(...) : URI | provenance | MaD:295 | | SanitizationTests.java:91:40:91:87 | new StringBuilder(...) : StringBuilder | SanitizationTests.java:93:68:93:77 | unafeUri5a : StringBuilder | provenance | | -| SanitizationTests.java:91:58:91:86 | getParameter(...) : String | SanitizationTests.java:91:40:91:87 | new StringBuilder(...) : StringBuilder | provenance | Src:MaD:280 MaD:287 | -| SanitizationTests.java:93:37:93:90 | newBuilder(...) : Builder | SanitizationTests.java:93:37:93:98 | build(...) : HttpRequest | provenance | MaD:288 | -| SanitizationTests.java:93:37:93:98 | build(...) : HttpRequest | SanitizationTests.java:94:25:94:33 | unsafer5a | provenance | Sink:MaD:7 | -| SanitizationTests.java:93:60:93:89 | new URI(...) : URI | SanitizationTests.java:93:37:93:90 | newBuilder(...) : Builder | provenance | MaD:289 | -| SanitizationTests.java:93:68:93:77 | unafeUri5a : StringBuilder | SanitizationTests.java:93:68:93:88 | toString(...) : String | provenance | MaD:285 | -| SanitizationTests.java:93:68:93:88 | toString(...) : String | SanitizationTests.java:93:60:93:89 | new URI(...) | provenance | Config Sink:MaD:9 | -| SanitizationTests.java:93:68:93:88 | toString(...) : String | SanitizationTests.java:93:60:93:89 | new URI(...) | provenance | MaD:290 Sink:MaD:9 | +| SanitizationTests.java:91:58:91:86 | getParameter(...) : String | SanitizationTests.java:91:40:91:87 | new StringBuilder(...) : StringBuilder | provenance | Src:MaD:283 MaD:292 | +| SanitizationTests.java:93:37:93:90 | newBuilder(...) : Builder | SanitizationTests.java:93:37:93:98 | build(...) : HttpRequest | provenance | MaD:293 | +| SanitizationTests.java:93:37:93:98 | build(...) : HttpRequest | SanitizationTests.java:94:25:94:33 | unsafer5a | provenance | Sink:MaD:10 | +| SanitizationTests.java:93:60:93:89 | new URI(...) : URI | SanitizationTests.java:93:37:93:90 | newBuilder(...) : Builder | provenance | MaD:294 | +| SanitizationTests.java:93:68:93:77 | unafeUri5a : StringBuilder | SanitizationTests.java:93:68:93:88 | toString(...) : String | provenance | MaD:290 | +| SanitizationTests.java:93:68:93:88 | toString(...) : String | SanitizationTests.java:93:60:93:89 | new URI(...) | provenance | Config Sink:MaD:12 | +| SanitizationTests.java:93:68:93:88 | toString(...) : String | SanitizationTests.java:93:60:93:89 | new URI(...) | provenance | MaD:295 Sink:MaD:12 | | SanitizationTests.java:93:68:93:88 | toString(...) : String | SanitizationTests.java:93:60:93:89 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:93:68:93:88 | toString(...) : String | SanitizationTests.java:93:60:93:89 | new URI(...) : URI | provenance | MaD:290 | +| SanitizationTests.java:93:68:93:88 | toString(...) : String | SanitizationTests.java:93:60:93:89 | new URI(...) : URI | provenance | MaD:295 | | SanitizationTests.java:96:41:96:105 | append(...) : StringBuilder | SanitizationTests.java:98:68:98:78 | unsafeUri5b : StringBuilder | provenance | | -| SanitizationTests.java:96:42:96:89 | new StringBuilder(...) : StringBuilder | SanitizationTests.java:96:41:96:105 | append(...) : StringBuilder | provenance | MaD:284 | -| SanitizationTests.java:96:60:96:88 | getParameter(...) : String | SanitizationTests.java:96:42:96:89 | new StringBuilder(...) : StringBuilder | provenance | Src:MaD:280 MaD:287 | -| SanitizationTests.java:98:37:98:91 | newBuilder(...) : Builder | SanitizationTests.java:98:37:98:99 | build(...) : HttpRequest | provenance | MaD:288 | -| SanitizationTests.java:98:37:98:99 | build(...) : HttpRequest | SanitizationTests.java:99:25:99:33 | unsafer5b | provenance | Sink:MaD:7 | -| SanitizationTests.java:98:60:98:90 | new URI(...) : URI | SanitizationTests.java:98:37:98:91 | newBuilder(...) : Builder | provenance | MaD:289 | -| SanitizationTests.java:98:68:98:78 | unsafeUri5b : StringBuilder | SanitizationTests.java:98:68:98:89 | toString(...) : String | provenance | MaD:285 | -| SanitizationTests.java:98:68:98:89 | toString(...) : String | SanitizationTests.java:98:60:98:90 | new URI(...) | provenance | Config Sink:MaD:9 | -| SanitizationTests.java:98:68:98:89 | toString(...) : String | SanitizationTests.java:98:60:98:90 | new URI(...) | provenance | MaD:290 Sink:MaD:9 | +| SanitizationTests.java:96:42:96:89 | new StringBuilder(...) : StringBuilder | SanitizationTests.java:96:41:96:105 | append(...) : StringBuilder | provenance | MaD:289 | +| SanitizationTests.java:96:60:96:88 | getParameter(...) : String | SanitizationTests.java:96:42:96:89 | new StringBuilder(...) : StringBuilder | provenance | Src:MaD:283 MaD:292 | +| SanitizationTests.java:98:37:98:91 | newBuilder(...) : Builder | SanitizationTests.java:98:37:98:99 | build(...) : HttpRequest | provenance | MaD:293 | +| SanitizationTests.java:98:37:98:99 | build(...) : HttpRequest | SanitizationTests.java:99:25:99:33 | unsafer5b | provenance | Sink:MaD:10 | +| SanitizationTests.java:98:60:98:90 | new URI(...) : URI | SanitizationTests.java:98:37:98:91 | newBuilder(...) : Builder | provenance | MaD:294 | +| SanitizationTests.java:98:68:98:78 | unsafeUri5b : StringBuilder | SanitizationTests.java:98:68:98:89 | toString(...) : String | provenance | MaD:290 | +| SanitizationTests.java:98:68:98:89 | toString(...) : String | SanitizationTests.java:98:60:98:90 | new URI(...) | provenance | Config Sink:MaD:12 | +| SanitizationTests.java:98:68:98:89 | toString(...) : String | SanitizationTests.java:98:60:98:90 | new URI(...) | provenance | MaD:295 Sink:MaD:12 | | SanitizationTests.java:98:68:98:89 | toString(...) : String | SanitizationTests.java:98:60:98:90 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:98:68:98:89 | toString(...) : String | SanitizationTests.java:98:60:98:90 | new URI(...) : URI | provenance | MaD:290 | +| SanitizationTests.java:98:68:98:89 | toString(...) : String | SanitizationTests.java:98:60:98:90 | new URI(...) : URI | provenance | MaD:295 | | SanitizationTests.java:101:41:101:106 | append(...) : StringBuilder | SanitizationTests.java:103:68:103:78 | unsafeUri5c : StringBuilder | provenance | | -| SanitizationTests.java:101:77:101:105 | getParameter(...) : String | SanitizationTests.java:101:41:101:106 | append(...) : StringBuilder | provenance | Src:MaD:280 MaD:283+MaD:284 | -| SanitizationTests.java:103:37:103:91 | newBuilder(...) : Builder | SanitizationTests.java:103:37:103:99 | build(...) : HttpRequest | provenance | MaD:288 | -| SanitizationTests.java:103:37:103:99 | build(...) : HttpRequest | SanitizationTests.java:104:25:104:33 | unsafer5c | provenance | Sink:MaD:7 | -| SanitizationTests.java:103:60:103:90 | new URI(...) : URI | SanitizationTests.java:103:37:103:91 | newBuilder(...) : Builder | provenance | MaD:289 | -| SanitizationTests.java:103:68:103:78 | unsafeUri5c : StringBuilder | SanitizationTests.java:103:68:103:89 | toString(...) : String | provenance | MaD:285 | -| SanitizationTests.java:103:68:103:89 | toString(...) : String | SanitizationTests.java:103:60:103:90 | new URI(...) | provenance | Config Sink:MaD:9 | -| SanitizationTests.java:103:68:103:89 | toString(...) : String | SanitizationTests.java:103:60:103:90 | new URI(...) | provenance | MaD:290 Sink:MaD:9 | +| SanitizationTests.java:101:77:101:105 | getParameter(...) : String | SanitizationTests.java:101:41:101:106 | append(...) : StringBuilder | provenance | Src:MaD:283 MaD:288+MaD:289 | +| SanitizationTests.java:103:37:103:91 | newBuilder(...) : Builder | SanitizationTests.java:103:37:103:99 | build(...) : HttpRequest | provenance | MaD:293 | +| SanitizationTests.java:103:37:103:99 | build(...) : HttpRequest | SanitizationTests.java:104:25:104:33 | unsafer5c | provenance | Sink:MaD:10 | +| SanitizationTests.java:103:60:103:90 | new URI(...) : URI | SanitizationTests.java:103:37:103:91 | newBuilder(...) : Builder | provenance | MaD:294 | +| SanitizationTests.java:103:68:103:78 | unsafeUri5c : StringBuilder | SanitizationTests.java:103:68:103:89 | toString(...) : String | provenance | MaD:290 | +| SanitizationTests.java:103:68:103:89 | toString(...) : String | SanitizationTests.java:103:60:103:90 | new URI(...) | provenance | Config Sink:MaD:12 | +| SanitizationTests.java:103:68:103:89 | toString(...) : String | SanitizationTests.java:103:60:103:90 | new URI(...) | provenance | MaD:295 Sink:MaD:12 | | SanitizationTests.java:103:68:103:89 | toString(...) : String | SanitizationTests.java:103:60:103:90 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:103:68:103:89 | toString(...) : String | SanitizationTests.java:103:60:103:90 | new URI(...) : URI | provenance | MaD:290 | +| SanitizationTests.java:103:68:103:89 | toString(...) : String | SanitizationTests.java:103:60:103:90 | new URI(...) : URI | provenance | MaD:295 | | SanitizationTests.java:106:33:106:104 | format(...) : String | SanitizationTests.java:107:67:107:76 | unsafeUri6 : String | provenance | | -| SanitizationTests.java:106:33:106:104 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:106:33:106:104 | format(...) : String | provenance | MaD:286 | -| SanitizationTests.java:106:73:106:103 | getParameter(...) : String | SanitizationTests.java:106:33:106:104 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:280 | -| SanitizationTests.java:107:36:107:78 | newBuilder(...) : Builder | SanitizationTests.java:107:36:107:86 | build(...) : HttpRequest | provenance | MaD:288 | -| SanitizationTests.java:107:36:107:86 | build(...) : HttpRequest | SanitizationTests.java:108:25:108:32 | unsafer6 | provenance | Sink:MaD:7 | -| SanitizationTests.java:107:59:107:77 | new URI(...) : URI | SanitizationTests.java:107:36:107:78 | newBuilder(...) : Builder | provenance | MaD:289 | -| SanitizationTests.java:107:67:107:76 | unsafeUri6 : String | SanitizationTests.java:107:59:107:77 | new URI(...) | provenance | Config Sink:MaD:9 | -| SanitizationTests.java:107:67:107:76 | unsafeUri6 : String | SanitizationTests.java:107:59:107:77 | new URI(...) | provenance | MaD:290 Sink:MaD:9 | +| SanitizationTests.java:106:33:106:104 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:106:33:106:104 | format(...) : String | provenance | MaD:291 | +| SanitizationTests.java:106:73:106:103 | getParameter(...) : String | SanitizationTests.java:106:33:106:104 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:283 | +| SanitizationTests.java:107:36:107:78 | newBuilder(...) : Builder | SanitizationTests.java:107:36:107:86 | build(...) : HttpRequest | provenance | MaD:293 | +| SanitizationTests.java:107:36:107:86 | build(...) : HttpRequest | SanitizationTests.java:108:25:108:32 | unsafer6 | provenance | Sink:MaD:10 | +| SanitizationTests.java:107:59:107:77 | new URI(...) : URI | SanitizationTests.java:107:36:107:78 | newBuilder(...) : Builder | provenance | MaD:294 | +| SanitizationTests.java:107:67:107:76 | unsafeUri6 : String | SanitizationTests.java:107:59:107:77 | new URI(...) | provenance | Config Sink:MaD:12 | +| SanitizationTests.java:107:67:107:76 | unsafeUri6 : String | SanitizationTests.java:107:59:107:77 | new URI(...) | provenance | MaD:295 Sink:MaD:12 | | SanitizationTests.java:107:67:107:76 | unsafeUri6 : String | SanitizationTests.java:107:59:107:77 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:107:67:107:76 | unsafeUri6 : String | SanitizationTests.java:107:59:107:77 | new URI(...) : URI | provenance | MaD:290 | +| SanitizationTests.java:107:67:107:76 | unsafeUri6 : String | SanitizationTests.java:107:59:107:77 | new URI(...) : URI | provenance | MaD:295 | | SanitizationTests.java:110:33:110:110 | format(...) : String | SanitizationTests.java:111:67:111:76 | unsafeUri7 : String | provenance | | -| SanitizationTests.java:110:33:110:110 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:110:33:110:110 | format(...) : String | provenance | MaD:286 | -| SanitizationTests.java:110:56:110:86 | getParameter(...) : String | SanitizationTests.java:110:33:110:110 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:280 | -| SanitizationTests.java:111:36:111:78 | newBuilder(...) : Builder | SanitizationTests.java:111:36:111:86 | build(...) : HttpRequest | provenance | MaD:288 | -| SanitizationTests.java:111:36:111:86 | build(...) : HttpRequest | SanitizationTests.java:112:25:112:32 | unsafer7 | provenance | Sink:MaD:7 | -| SanitizationTests.java:111:59:111:77 | new URI(...) : URI | SanitizationTests.java:111:36:111:78 | newBuilder(...) : Builder | provenance | MaD:289 | -| SanitizationTests.java:111:67:111:76 | unsafeUri7 : String | SanitizationTests.java:111:59:111:77 | new URI(...) | provenance | Config Sink:MaD:9 | -| SanitizationTests.java:111:67:111:76 | unsafeUri7 : String | SanitizationTests.java:111:59:111:77 | new URI(...) | provenance | MaD:290 Sink:MaD:9 | +| SanitizationTests.java:110:33:110:110 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:110:33:110:110 | format(...) : String | provenance | MaD:291 | +| SanitizationTests.java:110:56:110:86 | getParameter(...) : String | SanitizationTests.java:110:33:110:110 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:283 | +| SanitizationTests.java:111:36:111:78 | newBuilder(...) : Builder | SanitizationTests.java:111:36:111:86 | build(...) : HttpRequest | provenance | MaD:293 | +| SanitizationTests.java:111:36:111:86 | build(...) : HttpRequest | SanitizationTests.java:112:25:112:32 | unsafer7 | provenance | Sink:MaD:10 | +| SanitizationTests.java:111:59:111:77 | new URI(...) : URI | SanitizationTests.java:111:36:111:78 | newBuilder(...) : Builder | provenance | MaD:294 | +| SanitizationTests.java:111:67:111:76 | unsafeUri7 : String | SanitizationTests.java:111:59:111:77 | new URI(...) | provenance | Config Sink:MaD:12 | +| SanitizationTests.java:111:67:111:76 | unsafeUri7 : String | SanitizationTests.java:111:59:111:77 | new URI(...) | provenance | MaD:295 Sink:MaD:12 | | SanitizationTests.java:111:67:111:76 | unsafeUri7 : String | SanitizationTests.java:111:59:111:77 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:111:67:111:76 | unsafeUri7 : String | SanitizationTests.java:111:59:111:77 | new URI(...) : URI | provenance | MaD:290 | +| SanitizationTests.java:111:67:111:76 | unsafeUri7 : String | SanitizationTests.java:111:59:111:77 | new URI(...) : URI | provenance | MaD:295 | | SanitizationTests.java:114:33:114:110 | format(...) : String | SanitizationTests.java:115:67:115:76 | unsafeUri8 : String | provenance | | -| SanitizationTests.java:114:33:114:110 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:114:33:114:110 | format(...) : String | provenance | MaD:286 | -| SanitizationTests.java:114:55:114:85 | getParameter(...) : String | SanitizationTests.java:114:33:114:110 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:280 | -| SanitizationTests.java:115:36:115:78 | newBuilder(...) : Builder | SanitizationTests.java:115:36:115:86 | build(...) : HttpRequest | provenance | MaD:288 | -| SanitizationTests.java:115:36:115:86 | build(...) : HttpRequest | SanitizationTests.java:116:25:116:32 | unsafer8 | provenance | Sink:MaD:7 | -| SanitizationTests.java:115:59:115:77 | new URI(...) : URI | SanitizationTests.java:115:36:115:78 | newBuilder(...) : Builder | provenance | MaD:289 | -| SanitizationTests.java:115:67:115:76 | unsafeUri8 : String | SanitizationTests.java:115:59:115:77 | new URI(...) | provenance | Config Sink:MaD:9 | -| SanitizationTests.java:115:67:115:76 | unsafeUri8 : String | SanitizationTests.java:115:59:115:77 | new URI(...) | provenance | MaD:290 Sink:MaD:9 | +| SanitizationTests.java:114:33:114:110 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:114:33:114:110 | format(...) : String | provenance | MaD:291 | +| SanitizationTests.java:114:55:114:85 | getParameter(...) : String | SanitizationTests.java:114:33:114:110 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:283 | +| SanitizationTests.java:115:36:115:78 | newBuilder(...) : Builder | SanitizationTests.java:115:36:115:86 | build(...) : HttpRequest | provenance | MaD:293 | +| SanitizationTests.java:115:36:115:86 | build(...) : HttpRequest | SanitizationTests.java:116:25:116:32 | unsafer8 | provenance | Sink:MaD:10 | +| SanitizationTests.java:115:59:115:77 | new URI(...) : URI | SanitizationTests.java:115:36:115:78 | newBuilder(...) : Builder | provenance | MaD:294 | +| SanitizationTests.java:115:67:115:76 | unsafeUri8 : String | SanitizationTests.java:115:59:115:77 | new URI(...) | provenance | Config Sink:MaD:12 | +| SanitizationTests.java:115:67:115:76 | unsafeUri8 : String | SanitizationTests.java:115:59:115:77 | new URI(...) | provenance | MaD:295 Sink:MaD:12 | | SanitizationTests.java:115:67:115:76 | unsafeUri8 : String | SanitizationTests.java:115:59:115:77 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:115:67:115:76 | unsafeUri8 : String | SanitizationTests.java:115:59:115:77 | new URI(...) : URI | provenance | MaD:290 | -| SanitizationTests.java:118:33:118:63 | getParameter(...) : String | SanitizationTests.java:119:67:119:76 | unsafeUri9 : String | provenance | Src:MaD:280 | -| SanitizationTests.java:119:36:119:78 | newBuilder(...) : Builder | SanitizationTests.java:119:36:119:86 | build(...) : HttpRequest | provenance | MaD:288 | -| SanitizationTests.java:119:36:119:86 | build(...) : HttpRequest | SanitizationTests.java:120:25:120:32 | unsafer9 | provenance | Sink:MaD:7 | -| SanitizationTests.java:119:59:119:77 | new URI(...) : URI | SanitizationTests.java:119:36:119:78 | newBuilder(...) : Builder | provenance | MaD:289 | -| SanitizationTests.java:119:67:119:76 | unsafeUri9 : String | SanitizationTests.java:119:59:119:77 | new URI(...) | provenance | Config Sink:MaD:9 | -| SanitizationTests.java:119:67:119:76 | unsafeUri9 : String | SanitizationTests.java:119:59:119:77 | new URI(...) | provenance | MaD:290 Sink:MaD:9 | +| SanitizationTests.java:115:67:115:76 | unsafeUri8 : String | SanitizationTests.java:115:59:115:77 | new URI(...) : URI | provenance | MaD:295 | +| SanitizationTests.java:118:33:118:63 | getParameter(...) : String | SanitizationTests.java:119:67:119:76 | unsafeUri9 : String | provenance | Src:MaD:283 | +| SanitizationTests.java:119:36:119:78 | newBuilder(...) : Builder | SanitizationTests.java:119:36:119:86 | build(...) : HttpRequest | provenance | MaD:293 | +| SanitizationTests.java:119:36:119:86 | build(...) : HttpRequest | SanitizationTests.java:120:25:120:32 | unsafer9 | provenance | Sink:MaD:10 | +| SanitizationTests.java:119:59:119:77 | new URI(...) : URI | SanitizationTests.java:119:36:119:78 | newBuilder(...) : Builder | provenance | MaD:294 | +| SanitizationTests.java:119:67:119:76 | unsafeUri9 : String | SanitizationTests.java:119:59:119:77 | new URI(...) | provenance | Config Sink:MaD:12 | +| SanitizationTests.java:119:67:119:76 | unsafeUri9 : String | SanitizationTests.java:119:59:119:77 | new URI(...) | provenance | MaD:295 Sink:MaD:12 | | SanitizationTests.java:119:67:119:76 | unsafeUri9 : String | SanitizationTests.java:119:59:119:77 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:119:67:119:76 | unsafeUri9 : String | SanitizationTests.java:119:59:119:77 | new URI(...) : URI | provenance | MaD:290 | +| SanitizationTests.java:119:67:119:76 | unsafeUri9 : String | SanitizationTests.java:119:59:119:77 | new URI(...) : URI | provenance | MaD:295 | | SanitizationTests.java:122:34:122:126 | format(...) : String | SanitizationTests.java:123:68:123:78 | unsafeUri10 : String | provenance | | -| SanitizationTests.java:122:34:122:126 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:122:34:122:126 | format(...) : String | provenance | MaD:286 | -| SanitizationTests.java:122:94:122:125 | getParameter(...) : String | SanitizationTests.java:122:34:122:126 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:280 | -| SanitizationTests.java:123:37:123:80 | newBuilder(...) : Builder | SanitizationTests.java:123:37:123:88 | build(...) : HttpRequest | provenance | MaD:288 | -| SanitizationTests.java:123:37:123:88 | build(...) : HttpRequest | SanitizationTests.java:124:25:124:33 | unsafer10 | provenance | Sink:MaD:7 | -| SanitizationTests.java:123:60:123:79 | new URI(...) : URI | SanitizationTests.java:123:37:123:80 | newBuilder(...) : Builder | provenance | MaD:289 | -| SanitizationTests.java:123:68:123:78 | unsafeUri10 : String | SanitizationTests.java:123:60:123:79 | new URI(...) | provenance | Config Sink:MaD:9 | -| SanitizationTests.java:123:68:123:78 | unsafeUri10 : String | SanitizationTests.java:123:60:123:79 | new URI(...) | provenance | MaD:290 Sink:MaD:9 | +| SanitizationTests.java:122:34:122:126 | new ..[] { .. } : Object[] [[]] : String | SanitizationTests.java:122:34:122:126 | format(...) : String | provenance | MaD:291 | +| SanitizationTests.java:122:94:122:125 | getParameter(...) : String | SanitizationTests.java:122:34:122:126 | new ..[] { .. } : Object[] [[]] : String | provenance | Src:MaD:283 | +| SanitizationTests.java:123:37:123:80 | newBuilder(...) : Builder | SanitizationTests.java:123:37:123:88 | build(...) : HttpRequest | provenance | MaD:293 | +| SanitizationTests.java:123:37:123:88 | build(...) : HttpRequest | SanitizationTests.java:124:25:124:33 | unsafer10 | provenance | Sink:MaD:10 | +| SanitizationTests.java:123:60:123:79 | new URI(...) : URI | SanitizationTests.java:123:37:123:80 | newBuilder(...) : Builder | provenance | MaD:294 | +| SanitizationTests.java:123:68:123:78 | unsafeUri10 : String | SanitizationTests.java:123:60:123:79 | new URI(...) | provenance | Config Sink:MaD:12 | +| SanitizationTests.java:123:68:123:78 | unsafeUri10 : String | SanitizationTests.java:123:60:123:79 | new URI(...) | provenance | MaD:295 Sink:MaD:12 | | SanitizationTests.java:123:68:123:78 | unsafeUri10 : String | SanitizationTests.java:123:60:123:79 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:123:68:123:78 | unsafeUri10 : String | SanitizationTests.java:123:60:123:79 | new URI(...) : URI | provenance | MaD:290 | -| SanitizationTests.java:177:31:177:114 | newBuilder(...) : Builder | SanitizationTests.java:177:31:177:122 | build(...) : HttpRequest | provenance | MaD:288 | -| SanitizationTests.java:177:31:177:122 | build(...) : HttpRequest | SanitizationTests.java:178:25:178:27 | r18 | provenance | Sink:MaD:7 | -| SanitizationTests.java:177:54:177:113 | new URI(...) : URI | SanitizationTests.java:177:31:177:114 | newBuilder(...) : Builder | provenance | MaD:289 | -| SanitizationTests.java:177:62:177:112 | getFromList(...) : String | SanitizationTests.java:177:54:177:113 | new URI(...) | provenance | Config Sink:MaD:9 | -| SanitizationTests.java:177:62:177:112 | getFromList(...) : String | SanitizationTests.java:177:54:177:113 | new URI(...) | provenance | MaD:290 Sink:MaD:9 | +| SanitizationTests.java:123:68:123:78 | unsafeUri10 : String | SanitizationTests.java:123:60:123:79 | new URI(...) : URI | provenance | MaD:295 | +| SanitizationTests.java:177:31:177:114 | newBuilder(...) : Builder | SanitizationTests.java:177:31:177:122 | build(...) : HttpRequest | provenance | MaD:293 | +| SanitizationTests.java:177:31:177:122 | build(...) : HttpRequest | SanitizationTests.java:178:25:178:27 | r18 | provenance | Sink:MaD:10 | +| SanitizationTests.java:177:54:177:113 | new URI(...) : URI | SanitizationTests.java:177:31:177:114 | newBuilder(...) : Builder | provenance | MaD:294 | +| SanitizationTests.java:177:62:177:112 | getFromList(...) : String | SanitizationTests.java:177:54:177:113 | new URI(...) | provenance | Config Sink:MaD:12 | +| SanitizationTests.java:177:62:177:112 | getFromList(...) : String | SanitizationTests.java:177:54:177:113 | new URI(...) | provenance | MaD:295 Sink:MaD:12 | | SanitizationTests.java:177:62:177:112 | getFromList(...) : String | SanitizationTests.java:177:54:177:113 | new URI(...) : URI | provenance | Config | -| SanitizationTests.java:177:62:177:112 | getFromList(...) : String | SanitizationTests.java:177:54:177:113 | new URI(...) : URI | provenance | MaD:290 | -| SanitizationTests.java:177:74:177:111 | of(...) : List [] : String | SanitizationTests.java:177:62:177:112 | getFromList(...) : String | provenance | MaD:295 | +| SanitizationTests.java:177:62:177:112 | getFromList(...) : String | SanitizationTests.java:177:54:177:113 | new URI(...) : URI | provenance | MaD:295 | +| SanitizationTests.java:177:74:177:111 | of(...) : List [] : String | SanitizationTests.java:177:62:177:112 | getFromList(...) : String | provenance | MaD:300 | | SanitizationTests.java:177:74:177:111 | of(...) : List [] : String | SanitizationTests.java:199:31:199:112 | list : List [] : String | provenance | | -| SanitizationTests.java:177:82:177:110 | getParameter(...) : String | SanitizationTests.java:177:74:177:111 | of(...) : List [] : String | provenance | Src:MaD:280 MaD:294 | +| SanitizationTests.java:177:82:177:110 | getParameter(...) : String | SanitizationTests.java:177:74:177:111 | of(...) : List [] : String | provenance | Src:MaD:283 MaD:299 | | SanitizationTests.java:199:31:199:112 | list : List [] : String | SanitizationTests.java:200:16:200:19 | list : List [] : String | provenance | | -| SanitizationTests.java:200:16:200:19 | list : List [] : String | SanitizationTests.java:200:16:200:26 | get(...) : String | provenance | MaD:295 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:32:39:32:59 | ... + ... | provenance | Src:MaD:280 Sink:MaD:267 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:33:69:33:82 | fooResourceUrl | provenance | Src:MaD:280 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:34:73:34:86 | fooResourceUrl | provenance | Src:MaD:280 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:35:87:35:100 | fooResourceUrl | provenance | Src:MaD:280 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:38:83:38:96 | fooResourceUrl : String | provenance | Src:MaD:280 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:40:105:40:118 | fooResourceUrl : String | provenance | Src:MaD:280 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:43:35:43:48 | fooResourceUrl | provenance | Src:MaD:280 Sink:MaD:265 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:44:91:44:104 | fooResourceUrl | provenance | Src:MaD:280 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:45:95:45:108 | fooResourceUrl | provenance | Src:MaD:280 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:46:109:46:122 | fooResourceUrl | provenance | Src:MaD:280 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:49:105:49:118 | fooResourceUrl : String | provenance | Src:MaD:280 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:51:127:51:140 | fooResourceUrl : String | provenance | Src:MaD:280 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:54:34:54:47 | fooResourceUrl | provenance | Src:MaD:280 Sink:MaD:266 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:55:79:55:92 | fooResourceUrl | provenance | Src:MaD:280 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:56:83:56:96 | fooResourceUrl | provenance | Src:MaD:280 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:57:97:57:110 | fooResourceUrl | provenance | Src:MaD:280 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:60:93:60:106 | fooResourceUrl : String | provenance | Src:MaD:280 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:62:115:62:128 | fooResourceUrl : String | provenance | Src:MaD:280 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:65:39:65:52 | fooResourceUrl | provenance | Src:MaD:280 Sink:MaD:268 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:66:69:66:82 | fooResourceUrl | provenance | Src:MaD:280 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:67:73:67:86 | fooResourceUrl | provenance | Src:MaD:280 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:68:87:68:100 | fooResourceUrl | provenance | Src:MaD:280 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:71:83:71:96 | fooResourceUrl : String | provenance | Src:MaD:280 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:73:105:73:118 | fooResourceUrl : String | provenance | Src:MaD:280 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:76:41:76:54 | fooResourceUrl | provenance | Src:MaD:280 Sink:MaD:271 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:77:93:77:106 | fooResourceUrl | provenance | Src:MaD:280 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:78:97:78:110 | fooResourceUrl | provenance | Src:MaD:280 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:79:111:79:124 | fooResourceUrl | provenance | Src:MaD:280 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:82:107:82:120 | fooResourceUrl : String | provenance | Src:MaD:280 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:84:129:84:142 | fooResourceUrl : String | provenance | Src:MaD:280 | -| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | provenance | Src:MaD:280 | -| SpringSSRF.java:38:83:38:96 | fooResourceUrl : String | SpringSSRF.java:38:69:38:97 | of(...) | provenance | MaD:296 | -| SpringSSRF.java:40:105:40:118 | fooResourceUrl : String | SpringSSRF.java:40:69:40:119 | of(...) | provenance | MaD:297 | -| SpringSSRF.java:49:105:49:118 | fooResourceUrl : String | SpringSSRF.java:49:91:49:119 | of(...) | provenance | MaD:296 | -| SpringSSRF.java:51:127:51:140 | fooResourceUrl : String | SpringSSRF.java:51:91:51:141 | of(...) | provenance | MaD:297 | -| SpringSSRF.java:60:93:60:106 | fooResourceUrl : String | SpringSSRF.java:60:79:60:107 | of(...) | provenance | MaD:296 | -| SpringSSRF.java:62:115:62:128 | fooResourceUrl : String | SpringSSRF.java:62:79:62:129 | of(...) | provenance | MaD:297 | -| SpringSSRF.java:71:83:71:96 | fooResourceUrl : String | SpringSSRF.java:71:69:71:97 | of(...) | provenance | MaD:296 | -| SpringSSRF.java:73:105:73:118 | fooResourceUrl : String | SpringSSRF.java:73:69:73:119 | of(...) | provenance | MaD:297 | -| SpringSSRF.java:82:107:82:120 | fooResourceUrl : String | SpringSSRF.java:82:93:82:121 | of(...) | provenance | MaD:296 | -| SpringSSRF.java:84:129:84:142 | fooResourceUrl : String | SpringSSRF.java:84:93:84:143 | of(...) | provenance | MaD:297 | -| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:87:40:87:62 | new URI(...) | provenance | Config Sink:MaD:272 | -| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:87:40:87:62 | new URI(...) | provenance | MaD:290 Sink:MaD:272 | +| SanitizationTests.java:200:16:200:19 | list : List [] : String | SanitizationTests.java:200:16:200:26 | get(...) : String | provenance | MaD:300 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:32:39:32:59 | ... + ... | provenance | Src:MaD:283 Sink:MaD:270 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:33:69:33:82 | fooResourceUrl | provenance | Src:MaD:283 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:34:73:34:86 | fooResourceUrl | provenance | Src:MaD:283 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:35:87:35:100 | fooResourceUrl | provenance | Src:MaD:283 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:38:83:38:96 | fooResourceUrl : String | provenance | Src:MaD:283 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:40:105:40:118 | fooResourceUrl : String | provenance | Src:MaD:283 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:43:35:43:48 | fooResourceUrl | provenance | Src:MaD:283 Sink:MaD:268 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:44:91:44:104 | fooResourceUrl | provenance | Src:MaD:283 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:45:95:45:108 | fooResourceUrl | provenance | Src:MaD:283 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:46:109:46:122 | fooResourceUrl | provenance | Src:MaD:283 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:49:105:49:118 | fooResourceUrl : String | provenance | Src:MaD:283 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:51:127:51:140 | fooResourceUrl : String | provenance | Src:MaD:283 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:54:34:54:47 | fooResourceUrl | provenance | Src:MaD:283 Sink:MaD:269 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:55:79:55:92 | fooResourceUrl | provenance | Src:MaD:283 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:56:83:56:96 | fooResourceUrl | provenance | Src:MaD:283 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:57:97:57:110 | fooResourceUrl | provenance | Src:MaD:283 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:60:93:60:106 | fooResourceUrl : String | provenance | Src:MaD:283 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:62:115:62:128 | fooResourceUrl : String | provenance | Src:MaD:283 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:65:39:65:52 | fooResourceUrl | provenance | Src:MaD:283 Sink:MaD:271 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:66:69:66:82 | fooResourceUrl | provenance | Src:MaD:283 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:67:73:67:86 | fooResourceUrl | provenance | Src:MaD:283 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:68:87:68:100 | fooResourceUrl | provenance | Src:MaD:283 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:71:83:71:96 | fooResourceUrl : String | provenance | Src:MaD:283 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:73:105:73:118 | fooResourceUrl : String | provenance | Src:MaD:283 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:76:41:76:54 | fooResourceUrl | provenance | Src:MaD:283 Sink:MaD:274 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:77:93:77:106 | fooResourceUrl | provenance | Src:MaD:283 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:78:97:78:110 | fooResourceUrl | provenance | Src:MaD:283 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:79:111:79:124 | fooResourceUrl | provenance | Src:MaD:283 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:82:107:82:120 | fooResourceUrl : String | provenance | Src:MaD:283 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:84:129:84:142 | fooResourceUrl : String | provenance | Src:MaD:283 | +| SpringSSRF.java:28:33:28:60 | getParameter(...) : String | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | provenance | Src:MaD:283 | +| SpringSSRF.java:38:83:38:96 | fooResourceUrl : String | SpringSSRF.java:38:69:38:97 | of(...) | provenance | MaD:301 | +| SpringSSRF.java:40:105:40:118 | fooResourceUrl : String | SpringSSRF.java:40:69:40:119 | of(...) | provenance | MaD:302 | +| SpringSSRF.java:49:105:49:118 | fooResourceUrl : String | SpringSSRF.java:49:91:49:119 | of(...) | provenance | MaD:301 | +| SpringSSRF.java:51:127:51:140 | fooResourceUrl : String | SpringSSRF.java:51:91:51:141 | of(...) | provenance | MaD:302 | +| SpringSSRF.java:60:93:60:106 | fooResourceUrl : String | SpringSSRF.java:60:79:60:107 | of(...) | provenance | MaD:301 | +| SpringSSRF.java:62:115:62:128 | fooResourceUrl : String | SpringSSRF.java:62:79:62:129 | of(...) | provenance | MaD:302 | +| SpringSSRF.java:71:83:71:96 | fooResourceUrl : String | SpringSSRF.java:71:69:71:97 | of(...) | provenance | MaD:301 | +| SpringSSRF.java:73:105:73:118 | fooResourceUrl : String | SpringSSRF.java:73:69:73:119 | of(...) | provenance | MaD:302 | +| SpringSSRF.java:82:107:82:120 | fooResourceUrl : String | SpringSSRF.java:82:93:82:121 | of(...) | provenance | MaD:301 | +| SpringSSRF.java:84:129:84:142 | fooResourceUrl : String | SpringSSRF.java:84:93:84:143 | of(...) | provenance | MaD:302 | +| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:87:40:87:62 | new URI(...) | provenance | Config Sink:MaD:275 | +| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:87:40:87:62 | new URI(...) | provenance | MaD:295 Sink:MaD:275 | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:88:92:88:105 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:89:96:89:109 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:90:110:90:123 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:93:106:93:119 | fooResourceUrl : String | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:95:128:95:141 | fooResourceUrl : String | provenance | | -| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:98:42:98:55 | fooResourceUrl | provenance | Sink:MaD:273 | +| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:98:42:98:55 | fooResourceUrl | provenance | Sink:MaD:276 | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:99:80:99:93 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:100:84:100:97 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:101:98:101:111 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:104:94:104:107 | fooResourceUrl : String | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:106:116:106:129 | fooResourceUrl : String | provenance | | -| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:109:40:109:53 | fooResourceUrl | provenance | Sink:MaD:274 | +| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:109:40:109:53 | fooResourceUrl | provenance | Sink:MaD:277 | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:110:92:110:105 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:111:96:111:109 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:112:110:112:123 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:115:106:115:119 | fooResourceUrl : String | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:117:128:117:141 | fooResourceUrl : String | provenance | | -| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:120:30:120:43 | fooResourceUrl | provenance | Sink:MaD:275 | +| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:120:30:120:43 | fooResourceUrl | provenance | Sink:MaD:278 | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:121:68:121:81 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:122:72:122:85 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:123:86:123:99 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:126:82:126:95 | fooResourceUrl : String | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:128:104:128:117 | fooResourceUrl : String | provenance | | -| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:131:33:131:46 | fooResourceUrl | provenance | Sink:MaD:264 | +| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:131:33:131:46 | fooResourceUrl | provenance | Sink:MaD:267 | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:132:49:132:62 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:133:53:133:66 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:134:67:134:80 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:137:63:137:76 | fooResourceUrl : String | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:139:85:139:98 | fooResourceUrl : String | provenance | | -| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:142:41:142:54 | fooResourceUrl | provenance | Sink:MaD:269 | +| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:142:41:142:54 | fooResourceUrl | provenance | Sink:MaD:272 | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:143:57:143:70 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:144:61:144:74 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:145:75:145:88 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:148:71:148:84 | fooResourceUrl : String | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:150:93:150:106 | fooResourceUrl : String | provenance | | -| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:153:42:153:55 | fooResourceUrl | provenance | Sink:MaD:270 | +| SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:153:42:153:55 | fooResourceUrl | provenance | Sink:MaD:273 | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:154:58:154:71 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:155:62:155:75 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:156:76:156:89 | fooResourceUrl | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:159:72:159:85 | fooResourceUrl : String | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:161:94:161:107 | fooResourceUrl : String | provenance | | | SpringSSRF.java:87:48:87:61 | fooResourceUrl : String | SpringSSRF.java:166:35:166:48 | fooResourceUrl : String | provenance | | -| SpringSSRF.java:93:106:93:119 | fooResourceUrl : String | SpringSSRF.java:93:92:93:120 | of(...) | provenance | MaD:296 | -| SpringSSRF.java:95:128:95:141 | fooResourceUrl : String | SpringSSRF.java:95:92:95:142 | of(...) | provenance | MaD:297 | -| SpringSSRF.java:104:94:104:107 | fooResourceUrl : String | SpringSSRF.java:104:80:104:108 | of(...) | provenance | MaD:296 | -| SpringSSRF.java:106:116:106:129 | fooResourceUrl : String | SpringSSRF.java:106:80:106:130 | of(...) | provenance | MaD:297 | -| SpringSSRF.java:115:106:115:119 | fooResourceUrl : String | SpringSSRF.java:115:92:115:120 | of(...) | provenance | MaD:296 | -| SpringSSRF.java:117:128:117:141 | fooResourceUrl : String | SpringSSRF.java:117:92:117:142 | of(...) | provenance | MaD:297 | -| SpringSSRF.java:126:82:126:95 | fooResourceUrl : String | SpringSSRF.java:126:68:126:96 | of(...) | provenance | MaD:296 | -| SpringSSRF.java:128:104:128:117 | fooResourceUrl : String | SpringSSRF.java:128:68:128:118 | of(...) | provenance | MaD:297 | -| SpringSSRF.java:137:63:137:76 | fooResourceUrl : String | SpringSSRF.java:137:49:137:77 | of(...) | provenance | MaD:296 | -| SpringSSRF.java:139:85:139:98 | fooResourceUrl : String | SpringSSRF.java:139:49:139:99 | of(...) | provenance | MaD:297 | -| SpringSSRF.java:148:71:148:84 | fooResourceUrl : String | SpringSSRF.java:148:57:148:85 | of(...) | provenance | MaD:296 | -| SpringSSRF.java:150:93:150:106 | fooResourceUrl : String | SpringSSRF.java:150:57:150:107 | of(...) | provenance | MaD:297 | -| SpringSSRF.java:159:72:159:85 | fooResourceUrl : String | SpringSSRF.java:159:58:159:86 | of(...) | provenance | MaD:296 | -| SpringSSRF.java:161:94:161:107 | fooResourceUrl : String | SpringSSRF.java:161:58:161:108 | of(...) | provenance | MaD:297 | -| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:168:44:168:46 | uri | provenance | Sink:MaD:258 | -| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:170:35:170:37 | uri | provenance | Sink:MaD:253 | -| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:171:35:171:37 | uri | provenance | Sink:MaD:259 | -| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:172:38:172:40 | uri | provenance | Sink:MaD:252 | -| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:173:39:173:41 | uri | provenance | Sink:MaD:256 | -| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:174:37:174:39 | uri | provenance | Sink:MaD:257 | -| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:175:36:175:38 | uri | provenance | Sink:MaD:254 | -| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:176:44:176:46 | uri | provenance | Sink:MaD:255 | +| SpringSSRF.java:93:106:93:119 | fooResourceUrl : String | SpringSSRF.java:93:92:93:120 | of(...) | provenance | MaD:301 | +| SpringSSRF.java:95:128:95:141 | fooResourceUrl : String | SpringSSRF.java:95:92:95:142 | of(...) | provenance | MaD:302 | +| SpringSSRF.java:104:94:104:107 | fooResourceUrl : String | SpringSSRF.java:104:80:104:108 | of(...) | provenance | MaD:301 | +| SpringSSRF.java:106:116:106:129 | fooResourceUrl : String | SpringSSRF.java:106:80:106:130 | of(...) | provenance | MaD:302 | +| SpringSSRF.java:115:106:115:119 | fooResourceUrl : String | SpringSSRF.java:115:92:115:120 | of(...) | provenance | MaD:301 | +| SpringSSRF.java:117:128:117:141 | fooResourceUrl : String | SpringSSRF.java:117:92:117:142 | of(...) | provenance | MaD:302 | +| SpringSSRF.java:126:82:126:95 | fooResourceUrl : String | SpringSSRF.java:126:68:126:96 | of(...) | provenance | MaD:301 | +| SpringSSRF.java:128:104:128:117 | fooResourceUrl : String | SpringSSRF.java:128:68:128:118 | of(...) | provenance | MaD:302 | +| SpringSSRF.java:137:63:137:76 | fooResourceUrl : String | SpringSSRF.java:137:49:137:77 | of(...) | provenance | MaD:301 | +| SpringSSRF.java:139:85:139:98 | fooResourceUrl : String | SpringSSRF.java:139:49:139:99 | of(...) | provenance | MaD:302 | +| SpringSSRF.java:148:71:148:84 | fooResourceUrl : String | SpringSSRF.java:148:57:148:85 | of(...) | provenance | MaD:301 | +| SpringSSRF.java:150:93:150:106 | fooResourceUrl : String | SpringSSRF.java:150:57:150:107 | of(...) | provenance | MaD:302 | +| SpringSSRF.java:159:72:159:85 | fooResourceUrl : String | SpringSSRF.java:159:58:159:86 | of(...) | provenance | MaD:301 | +| SpringSSRF.java:161:94:161:107 | fooResourceUrl : String | SpringSSRF.java:161:58:161:108 | of(...) | provenance | MaD:302 | +| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:168:44:168:46 | uri | provenance | Sink:MaD:261 | +| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:170:35:170:37 | uri | provenance | Sink:MaD:256 | +| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:171:35:171:37 | uri | provenance | Sink:MaD:262 | +| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:172:38:172:40 | uri | provenance | Sink:MaD:255 | +| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:173:39:173:41 | uri | provenance | Sink:MaD:259 | +| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:174:37:174:39 | uri | provenance | Sink:MaD:260 | +| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:175:36:175:38 | uri | provenance | Sink:MaD:257 | +| SpringSSRF.java:166:27:166:49 | new URI(...) : URI | SpringSSRF.java:176:44:176:46 | uri | provenance | Sink:MaD:258 | | SpringSSRF.java:166:35:166:48 | fooResourceUrl : String | SpringSSRF.java:166:27:166:49 | new URI(...) : URI | provenance | Config | -| SpringSSRF.java:166:35:166:48 | fooResourceUrl : String | SpringSSRF.java:166:27:166:49 | new URI(...) : URI | provenance | MaD:290 | +| SpringSSRF.java:166:35:166:48 | fooResourceUrl : String | SpringSSRF.java:166:27:166:49 | new URI(...) : URI | provenance | MaD:295 | | SpringSSRF.java:166:35:166:48 | fooResourceUrl : String | SpringSSRF.java:179:35:179:48 | fooResourceUrl : String | provenance | | -| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:182:49:182:51 | uri | provenance | Sink:MaD:246 | -| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:183:58:183:60 | uri | provenance | Sink:MaD:247 | -| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:184:57:184:59 | uri | provenance | Sink:MaD:248 | -| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:185:66:185:68 | uri | provenance | Sink:MaD:250 | -| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:186:57:186:59 | uri | provenance | Sink:MaD:249 | -| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:187:66:187:68 | uri | provenance | Sink:MaD:251 | +| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:182:49:182:51 | uri | provenance | Sink:MaD:249 | +| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:183:58:183:60 | uri | provenance | Sink:MaD:250 | +| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:184:57:184:59 | uri | provenance | Sink:MaD:251 | +| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:185:66:185:68 | uri | provenance | Sink:MaD:253 | +| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:186:57:186:59 | uri | provenance | Sink:MaD:252 | +| SpringSSRF.java:179:27:179:49 | new URI(...) : URI | SpringSSRF.java:187:66:187:68 | uri | provenance | Sink:MaD:254 | | SpringSSRF.java:179:35:179:48 | fooResourceUrl : String | SpringSSRF.java:179:27:179:49 | new URI(...) : URI | provenance | Config | -| SpringSSRF.java:179:35:179:48 | fooResourceUrl : String | SpringSSRF.java:179:27:179:49 | new URI(...) : URI | provenance | MaD:290 | -| URLClassLoaderSSRF.java:16:26:16:52 | getParameter(...) : String | URLClassLoaderSSRF.java:17:31:17:33 | url : String | provenance | Src:MaD:280 | +| SpringSSRF.java:179:35:179:48 | fooResourceUrl : String | SpringSSRF.java:179:27:179:49 | new URI(...) : URI | provenance | MaD:295 | +| URLClassLoaderSSRF.java:16:26:16:52 | getParameter(...) : String | URLClassLoaderSSRF.java:17:31:17:33 | url : String | provenance | Src:MaD:283 | | URLClassLoaderSSRF.java:17:23:17:34 | new URI(...) : URI | URLClassLoaderSSRF.java:18:74:18:76 | uri : URI | provenance | | | URLClassLoaderSSRF.java:17:31:17:33 | url : String | URLClassLoaderSSRF.java:17:23:17:34 | new URI(...) : URI | provenance | Config | -| URLClassLoaderSSRF.java:17:31:17:33 | url : String | URLClassLoaderSSRF.java:17:23:17:34 | new URI(...) : URI | provenance | MaD:290 | -| URLClassLoaderSSRF.java:18:64:18:85 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:18:64:18:85 | new URL[] | provenance | Sink:MaD:16 | -| URLClassLoaderSSRF.java:18:64:18:85 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:18:64:18:85 | new URL[] | provenance | Sink:MaD:16 | -| URLClassLoaderSSRF.java:18:74:18:76 | uri : URI | URLClassLoaderSSRF.java:18:74:18:84 | toURL(...) : URL | provenance | MaD:292 | +| URLClassLoaderSSRF.java:17:31:17:33 | url : String | URLClassLoaderSSRF.java:17:23:17:34 | new URI(...) : URI | provenance | MaD:295 | +| URLClassLoaderSSRF.java:18:64:18:85 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:18:64:18:85 | new URL[] | provenance | Sink:MaD:19 | +| URLClassLoaderSSRF.java:18:64:18:85 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:18:64:18:85 | new URL[] | provenance | Sink:MaD:19 | +| URLClassLoaderSSRF.java:18:74:18:76 | uri : URI | URLClassLoaderSSRF.java:18:74:18:84 | toURL(...) : URL | provenance | MaD:297 | | URLClassLoaderSSRF.java:18:74:18:84 | toURL(...) : URL | URLClassLoaderSSRF.java:18:64:18:85 | {...} : URL[] [[]] : URL | provenance | | -| URLClassLoaderSSRF.java:28:26:28:52 | getParameter(...) : String | URLClassLoaderSSRF.java:29:31:29:33 | url : String | provenance | Src:MaD:280 | +| URLClassLoaderSSRF.java:28:26:28:52 | getParameter(...) : String | URLClassLoaderSSRF.java:29:31:29:33 | url : String | provenance | Src:MaD:283 | | URLClassLoaderSSRF.java:29:23:29:34 | new URI(...) : URI | URLClassLoaderSSRF.java:30:74:30:76 | uri : URI | provenance | | | URLClassLoaderSSRF.java:29:31:29:33 | url : String | URLClassLoaderSSRF.java:29:23:29:34 | new URI(...) : URI | provenance | Config | -| URLClassLoaderSSRF.java:29:31:29:33 | url : String | URLClassLoaderSSRF.java:29:23:29:34 | new URI(...) : URI | provenance | MaD:290 | -| URLClassLoaderSSRF.java:30:64:30:85 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:30:64:30:85 | new URL[] | provenance | Sink:MaD:17 | -| URLClassLoaderSSRF.java:30:64:30:85 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:30:64:30:85 | new URL[] | provenance | Sink:MaD:17 | -| URLClassLoaderSSRF.java:30:74:30:76 | uri : URI | URLClassLoaderSSRF.java:30:74:30:84 | toURL(...) : URL | provenance | MaD:292 | +| URLClassLoaderSSRF.java:29:31:29:33 | url : String | URLClassLoaderSSRF.java:29:23:29:34 | new URI(...) : URI | provenance | MaD:295 | +| URLClassLoaderSSRF.java:30:64:30:85 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:30:64:30:85 | new URL[] | provenance | Sink:MaD:20 | +| URLClassLoaderSSRF.java:30:64:30:85 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:30:64:30:85 | new URL[] | provenance | Sink:MaD:20 | +| URLClassLoaderSSRF.java:30:74:30:76 | uri : URI | URLClassLoaderSSRF.java:30:74:30:84 | toURL(...) : URL | provenance | MaD:297 | | URLClassLoaderSSRF.java:30:74:30:84 | toURL(...) : URL | URLClassLoaderSSRF.java:30:64:30:85 | {...} : URL[] [[]] : URL | provenance | | -| URLClassLoaderSSRF.java:40:26:40:52 | getParameter(...) : String | URLClassLoaderSSRF.java:41:31:41:33 | url : String | provenance | Src:MaD:280 | +| URLClassLoaderSSRF.java:40:26:40:52 | getParameter(...) : String | URLClassLoaderSSRF.java:41:31:41:33 | url : String | provenance | Src:MaD:283 | | URLClassLoaderSSRF.java:41:23:41:34 | new URI(...) : URI | URLClassLoaderSSRF.java:44:74:44:76 | uri : URI | provenance | | | URLClassLoaderSSRF.java:41:31:41:33 | url : String | URLClassLoaderSSRF.java:41:23:41:34 | new URI(...) : URI | provenance | Config | -| URLClassLoaderSSRF.java:41:31:41:33 | url : String | URLClassLoaderSSRF.java:41:23:41:34 | new URI(...) : URI | provenance | MaD:290 | -| URLClassLoaderSSRF.java:44:64:44:85 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:44:64:44:85 | new URL[] | provenance | Sink:MaD:18 | -| URLClassLoaderSSRF.java:44:64:44:85 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:44:64:44:85 | new URL[] | provenance | Sink:MaD:18 | -| URLClassLoaderSSRF.java:44:74:44:76 | uri : URI | URLClassLoaderSSRF.java:44:74:44:84 | toURL(...) : URL | provenance | MaD:292 | +| URLClassLoaderSSRF.java:41:31:41:33 | url : String | URLClassLoaderSSRF.java:41:23:41:34 | new URI(...) : URI | provenance | MaD:295 | +| URLClassLoaderSSRF.java:44:64:44:85 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:44:64:44:85 | new URL[] | provenance | Sink:MaD:21 | +| URLClassLoaderSSRF.java:44:64:44:85 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:44:64:44:85 | new URL[] | provenance | Sink:MaD:21 | +| URLClassLoaderSSRF.java:44:74:44:76 | uri : URI | URLClassLoaderSSRF.java:44:74:44:84 | toURL(...) : URL | provenance | MaD:297 | | URLClassLoaderSSRF.java:44:74:44:84 | toURL(...) : URL | URLClassLoaderSSRF.java:44:64:44:85 | {...} : URL[] [[]] : URL | provenance | | -| URLClassLoaderSSRF.java:54:26:54:52 | getParameter(...) : String | URLClassLoaderSSRF.java:55:31:55:33 | url : String | provenance | Src:MaD:280 | +| URLClassLoaderSSRF.java:54:26:54:52 | getParameter(...) : String | URLClassLoaderSSRF.java:55:31:55:33 | url : String | provenance | Src:MaD:283 | | URLClassLoaderSSRF.java:55:23:55:34 | new URI(...) : URI | URLClassLoaderSSRF.java:56:82:56:84 | uri : URI | provenance | | | URLClassLoaderSSRF.java:55:31:55:33 | url : String | URLClassLoaderSSRF.java:55:23:55:34 | new URI(...) : URI | provenance | Config | -| URLClassLoaderSSRF.java:55:31:55:33 | url : String | URLClassLoaderSSRF.java:55:23:55:34 | new URI(...) : URI | provenance | MaD:290 | -| URLClassLoaderSSRF.java:56:72:56:93 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:56:72:56:93 | new URL[] | provenance | Sink:MaD:19 | -| URLClassLoaderSSRF.java:56:82:56:84 | uri : URI | URLClassLoaderSSRF.java:56:82:56:92 | toURL(...) : URL | provenance | MaD:292 | +| URLClassLoaderSSRF.java:55:31:55:33 | url : String | URLClassLoaderSSRF.java:55:23:55:34 | new URI(...) : URI | provenance | MaD:295 | +| URLClassLoaderSSRF.java:56:72:56:93 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:56:72:56:93 | new URL[] | provenance | Sink:MaD:22 | +| URLClassLoaderSSRF.java:56:82:56:84 | uri : URI | URLClassLoaderSSRF.java:56:82:56:92 | toURL(...) : URL | provenance | MaD:297 | | URLClassLoaderSSRF.java:56:82:56:92 | toURL(...) : URL | URLClassLoaderSSRF.java:56:72:56:93 | {...} : URL[] [[]] : URL | provenance | | -| URLClassLoaderSSRF.java:66:26:66:52 | getParameter(...) : String | URLClassLoaderSSRF.java:67:31:67:33 | url : String | provenance | Src:MaD:280 | +| URLClassLoaderSSRF.java:66:26:66:52 | getParameter(...) : String | URLClassLoaderSSRF.java:67:31:67:33 | url : String | provenance | Src:MaD:283 | | URLClassLoaderSSRF.java:67:23:67:34 | new URI(...) : URI | URLClassLoaderSSRF.java:70:31:70:33 | uri : URI | provenance | | | URLClassLoaderSSRF.java:67:31:67:33 | url : String | URLClassLoaderSSRF.java:67:23:67:34 | new URI(...) : URI | provenance | Config | -| URLClassLoaderSSRF.java:67:31:67:33 | url : String | URLClassLoaderSSRF.java:67:23:67:34 | new URI(...) : URI | provenance | MaD:290 | -| URLClassLoaderSSRF.java:70:21:70:42 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:70:21:70:42 | new URL[] | provenance | Sink:MaD:14 | -| URLClassLoaderSSRF.java:70:21:70:42 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:70:21:70:42 | new URL[] | provenance | Sink:MaD:14 | -| URLClassLoaderSSRF.java:70:31:70:33 | uri : URI | URLClassLoaderSSRF.java:70:31:70:41 | toURL(...) : URL | provenance | MaD:292 | +| URLClassLoaderSSRF.java:67:31:67:33 | url : String | URLClassLoaderSSRF.java:67:23:67:34 | new URI(...) : URI | provenance | MaD:295 | +| URLClassLoaderSSRF.java:70:21:70:42 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:70:21:70:42 | new URL[] | provenance | Sink:MaD:17 | +| URLClassLoaderSSRF.java:70:21:70:42 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:70:21:70:42 | new URL[] | provenance | Sink:MaD:17 | +| URLClassLoaderSSRF.java:70:31:70:33 | uri : URI | URLClassLoaderSSRF.java:70:31:70:41 | toURL(...) : URL | provenance | MaD:297 | | URLClassLoaderSSRF.java:70:31:70:41 | toURL(...) : URL | URLClassLoaderSSRF.java:70:21:70:42 | {...} : URL[] [[]] : URL | provenance | | -| URLClassLoaderSSRF.java:83:26:83:52 | getParameter(...) : String | URLClassLoaderSSRF.java:84:31:84:33 | url : String | provenance | Src:MaD:280 | +| URLClassLoaderSSRF.java:83:26:83:52 | getParameter(...) : String | URLClassLoaderSSRF.java:84:31:84:33 | url : String | provenance | Src:MaD:283 | | URLClassLoaderSSRF.java:84:23:84:34 | new URI(...) : URI | URLClassLoaderSSRF.java:89:31:89:33 | uri : URI | provenance | | | URLClassLoaderSSRF.java:84:31:84:33 | url : String | URLClassLoaderSSRF.java:84:23:84:34 | new URI(...) : URI | provenance | Config | -| URLClassLoaderSSRF.java:84:31:84:33 | url : String | URLClassLoaderSSRF.java:84:23:84:34 | new URI(...) : URI | provenance | MaD:290 | -| URLClassLoaderSSRF.java:89:21:89:42 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:89:21:89:42 | new URL[] | provenance | Sink:MaD:15 | -| URLClassLoaderSSRF.java:89:21:89:42 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:89:21:89:42 | new URL[] | provenance | Sink:MaD:15 | -| URLClassLoaderSSRF.java:89:31:89:33 | uri : URI | URLClassLoaderSSRF.java:89:31:89:41 | toURL(...) : URL | provenance | MaD:292 | +| URLClassLoaderSSRF.java:84:31:84:33 | url : String | URLClassLoaderSSRF.java:84:23:84:34 | new URI(...) : URI | provenance | MaD:295 | +| URLClassLoaderSSRF.java:89:21:89:42 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:89:21:89:42 | new URL[] | provenance | Sink:MaD:18 | +| URLClassLoaderSSRF.java:89:21:89:42 | {...} : URL[] [[]] : URL | URLClassLoaderSSRF.java:89:21:89:42 | new URL[] | provenance | Sink:MaD:18 | +| URLClassLoaderSSRF.java:89:31:89:33 | uri : URI | URLClassLoaderSSRF.java:89:31:89:41 | toURL(...) : URL | provenance | MaD:297 | | URLClassLoaderSSRF.java:89:31:89:41 | toURL(...) : URL | URLClassLoaderSSRF.java:89:21:89:42 | {...} : URL[] [[]] : URL | provenance | | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:31:40:31:47 | source(...) : String | provenance | Src:MaD:280 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:36:16:36:23 | source(...) : String | provenance | Src:MaD:280 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:38:36:38:43 | source(...) : String | provenance | Src:MaD:280 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:40:16:40:23 | source(...) : String | provenance | Src:MaD:280 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:45:40:45:47 | source(...) : String | provenance | Src:MaD:280 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:47:40:47:47 | source(...) : String | provenance | Src:MaD:280 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:49:36:49:43 | source(...) : String | provenance | Src:MaD:280 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:51:36:51:43 | source(...) : String | provenance | Src:MaD:280 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:53:36:53:43 | source(...) : String | provenance | Src:MaD:280 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:55:44:55:51 | source(...) : String | provenance | Src:MaD:280 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:57:38:57:45 | source(...) : String | provenance | Src:MaD:280 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:59:44:59:51 | source(...) : String | provenance | Src:MaD:280 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:61:53:61:60 | source(...) : String | provenance | Src:MaD:280 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:63:32:63:39 | source(...) : String | provenance | Src:MaD:280 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:65:44:65:51 | source(...) : String | provenance | Src:MaD:280 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:67:32:67:39 | source(...) : String | provenance | Src:MaD:280 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:69:33:69:40 | source(...) : String | provenance | Src:MaD:280 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:71:53:71:60 | source(...) : String | provenance | Src:MaD:280 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:74:58:74:65 | source(...) : String | provenance | Src:MaD:280 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:76:62:76:69 | source(...) : String | provenance | Src:MaD:280 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:78:52:78:59 | source(...) : String | provenance | Src:MaD:280 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:80:34:80:41 | source(...) : String | provenance | Src:MaD:280 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:82:40:82:47 | source(...) : String | provenance | Src:MaD:280 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:84:40:84:47 | source(...) : String | provenance | Src:MaD:280 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:86:50:86:57 | source(...) : String | provenance | Src:MaD:280 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:92:33:92:40 | source(...) : String | provenance | Src:MaD:280 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:97:35:97:42 | source(...) : String | provenance | Src:MaD:280 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:102:32:102:39 | source(...) : String | provenance | Src:MaD:280 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:107:24:107:31 | source(...) : String | provenance | Src:MaD:280 | -| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:112:24:112:31 | source(...) : String | provenance | Src:MaD:280 | -| mad/Test.java:31:40:31:47 | source(...) : String | mad/Test.java:31:24:31:47 | (...)... | provenance | Sink:MaD:10 | -| mad/Test.java:36:16:36:23 | source(...) : String | mad/Test.java:36:10:36:23 | (...)... | provenance | Sink:MaD:12 | -| mad/Test.java:38:36:38:43 | source(...) : String | mad/Test.java:38:28:38:43 | (...)... | provenance | Sink:MaD:11 | -| mad/Test.java:40:16:40:23 | source(...) : String | mad/Test.java:40:10:40:23 | (...)... | provenance | Sink:MaD:13 | -| mad/Test.java:45:40:45:47 | source(...) : String | mad/Test.java:45:32:45:47 | (...)... | provenance | Sink:MaD:14 | -| mad/Test.java:45:40:45:47 | source(...) : String | mad/Test.java:45:32:45:47 | (...)... | provenance | Sink:MaD:14 | -| mad/Test.java:47:40:47:47 | source(...) : String | mad/Test.java:47:32:47:47 | (...)... | provenance | Sink:MaD:15 | -| mad/Test.java:47:40:47:47 | source(...) : String | mad/Test.java:47:32:47:47 | (...)... | provenance | Sink:MaD:15 | -| mad/Test.java:49:36:49:43 | source(...) : String | mad/Test.java:49:28:49:43 | (...)... | provenance | Sink:MaD:16 | -| mad/Test.java:49:36:49:43 | source(...) : String | mad/Test.java:49:28:49:43 | (...)... | provenance | Sink:MaD:16 | -| mad/Test.java:51:36:51:43 | source(...) : String | mad/Test.java:51:28:51:43 | (...)... | provenance | Sink:MaD:17 | -| mad/Test.java:51:36:51:43 | source(...) : String | mad/Test.java:51:28:51:43 | (...)... | provenance | Sink:MaD:17 | -| mad/Test.java:53:36:53:43 | source(...) : String | mad/Test.java:53:28:53:43 | (...)... | provenance | Sink:MaD:18 | -| mad/Test.java:53:36:53:43 | source(...) : String | mad/Test.java:53:28:53:43 | (...)... | provenance | Sink:MaD:18 | -| mad/Test.java:55:44:55:51 | source(...) : String | mad/Test.java:55:36:55:51 | (...)... | provenance | Sink:MaD:19 | -| mad/Test.java:57:38:57:45 | source(...) : String | mad/Test.java:57:32:57:45 | (...)... | provenance | Sink:MaD:28 | -| mad/Test.java:59:44:59:51 | source(...) : String | mad/Test.java:59:38:59:51 | (...)... | provenance | Sink:MaD:29 | -| mad/Test.java:61:53:61:60 | source(...) : String | mad/Test.java:61:47:61:60 | (...)... | provenance | Sink:MaD:27 | -| mad/Test.java:63:32:63:39 | source(...) : String | mad/Test.java:63:26:63:39 | (...)... | provenance | Sink:MaD:31 | -| mad/Test.java:65:44:65:51 | source(...) : String | mad/Test.java:65:38:65:51 | (...)... | provenance | Sink:MaD:32 | -| mad/Test.java:67:32:67:39 | source(...) : String | mad/Test.java:67:26:67:39 | (...)... | provenance | Sink:MaD:30 | -| mad/Test.java:69:33:69:40 | source(...) : String | mad/Test.java:69:27:69:40 | (...)... | provenance | Sink:MaD:25 | -| mad/Test.java:71:53:71:60 | source(...) : String | mad/Test.java:71:47:71:60 | (...)... | provenance | Sink:MaD:33 | -| mad/Test.java:74:58:74:65 | source(...) : String | mad/Test.java:74:50:74:65 | (...)... | provenance | Sink:MaD:35 | -| mad/Test.java:76:62:76:69 | source(...) : String | mad/Test.java:76:50:76:69 | (...)... | provenance | Sink:MaD:34 | -| mad/Test.java:78:52:78:59 | source(...) : String | mad/Test.java:78:43:78:59 | (...)... | provenance | Sink:MaD:36 | -| mad/Test.java:80:34:80:41 | source(...) : String | mad/Test.java:80:25:80:41 | (...)... | provenance | Sink:MaD:37 | -| mad/Test.java:82:40:82:47 | source(...) : String | mad/Test.java:82:31:82:47 | (...)... | provenance | Sink:MaD:38 | -| mad/Test.java:84:40:84:47 | source(...) : String | mad/Test.java:84:31:84:47 | (...)... | provenance | Sink:MaD:39 | -| mad/Test.java:86:50:86:57 | source(...) : String | mad/Test.java:86:41:86:57 | (...)... | provenance | Sink:MaD:40 | -| mad/Test.java:92:33:92:40 | source(...) : String | mad/Test.java:92:24:92:40 | (...)... | provenance | Sink:MaD:24 | -| mad/Test.java:97:35:97:42 | source(...) : String | mad/Test.java:97:29:97:42 | (...)... | provenance | Sink:MaD:237 | -| mad/Test.java:102:32:102:39 | source(...) : String | mad/Test.java:102:26:102:39 | (...)... | provenance | Sink:MaD:244 | -| mad/Test.java:107:24:107:31 | source(...) : String | mad/Test.java:107:15:107:31 | (...)... | provenance | Sink:MaD:279 | -| mad/Test.java:112:24:112:31 | source(...) : String | mad/Test.java:112:15:112:31 | (...)... | provenance | Sink:MaD:278 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:31:40:31:47 | source(...) : String | provenance | Src:MaD:283 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:36:16:36:23 | source(...) : String | provenance | Src:MaD:283 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:38:36:38:43 | source(...) : String | provenance | Src:MaD:283 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:40:16:40:23 | source(...) : String | provenance | Src:MaD:283 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:45:40:45:47 | source(...) : String | provenance | Src:MaD:283 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:47:40:47:47 | source(...) : String | provenance | Src:MaD:283 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:49:36:49:43 | source(...) : String | provenance | Src:MaD:283 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:51:36:51:43 | source(...) : String | provenance | Src:MaD:283 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:53:36:53:43 | source(...) : String | provenance | Src:MaD:283 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:55:44:55:51 | source(...) : String | provenance | Src:MaD:283 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:57:38:57:45 | source(...) : String | provenance | Src:MaD:283 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:59:44:59:51 | source(...) : String | provenance | Src:MaD:283 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:61:53:61:60 | source(...) : String | provenance | Src:MaD:283 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:63:32:63:39 | source(...) : String | provenance | Src:MaD:283 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:65:44:65:51 | source(...) : String | provenance | Src:MaD:283 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:67:32:67:39 | source(...) : String | provenance | Src:MaD:283 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:69:33:69:40 | source(...) : String | provenance | Src:MaD:283 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:71:53:71:60 | source(...) : String | provenance | Src:MaD:283 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:74:58:74:65 | source(...) : String | provenance | Src:MaD:283 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:76:62:76:69 | source(...) : String | provenance | Src:MaD:283 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:78:52:78:59 | source(...) : String | provenance | Src:MaD:283 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:80:34:80:41 | source(...) : String | provenance | Src:MaD:283 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:82:40:82:47 | source(...) : String | provenance | Src:MaD:283 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:84:40:84:47 | source(...) : String | provenance | Src:MaD:283 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:86:50:86:57 | source(...) : String | provenance | Src:MaD:283 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:92:33:92:40 | source(...) : String | provenance | Src:MaD:283 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:97:35:97:42 | source(...) : String | provenance | Src:MaD:283 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:102:32:102:39 | source(...) : String | provenance | Src:MaD:283 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:107:24:107:31 | source(...) : String | provenance | Src:MaD:283 | +| mad/Test.java:26:16:26:41 | getParameter(...) : String | mad/Test.java:112:24:112:31 | source(...) : String | provenance | Src:MaD:283 | +| mad/Test.java:31:40:31:47 | source(...) : String | mad/Test.java:31:24:31:47 | (...)... | provenance | Sink:MaD:13 | +| mad/Test.java:36:16:36:23 | source(...) : String | mad/Test.java:36:10:36:23 | (...)... | provenance | Sink:MaD:15 | +| mad/Test.java:38:36:38:43 | source(...) : String | mad/Test.java:38:28:38:43 | (...)... | provenance | Sink:MaD:14 | +| mad/Test.java:40:16:40:23 | source(...) : String | mad/Test.java:40:10:40:23 | (...)... | provenance | Sink:MaD:16 | +| mad/Test.java:45:40:45:47 | source(...) : String | mad/Test.java:45:32:45:47 | (...)... | provenance | Sink:MaD:17 | +| mad/Test.java:45:40:45:47 | source(...) : String | mad/Test.java:45:32:45:47 | (...)... | provenance | Sink:MaD:17 | +| mad/Test.java:47:40:47:47 | source(...) : String | mad/Test.java:47:32:47:47 | (...)... | provenance | Sink:MaD:18 | +| mad/Test.java:47:40:47:47 | source(...) : String | mad/Test.java:47:32:47:47 | (...)... | provenance | Sink:MaD:18 | +| mad/Test.java:49:36:49:43 | source(...) : String | mad/Test.java:49:28:49:43 | (...)... | provenance | Sink:MaD:19 | +| mad/Test.java:49:36:49:43 | source(...) : String | mad/Test.java:49:28:49:43 | (...)... | provenance | Sink:MaD:19 | +| mad/Test.java:51:36:51:43 | source(...) : String | mad/Test.java:51:28:51:43 | (...)... | provenance | Sink:MaD:20 | +| mad/Test.java:51:36:51:43 | source(...) : String | mad/Test.java:51:28:51:43 | (...)... | provenance | Sink:MaD:20 | +| mad/Test.java:53:36:53:43 | source(...) : String | mad/Test.java:53:28:53:43 | (...)... | provenance | Sink:MaD:21 | +| mad/Test.java:53:36:53:43 | source(...) : String | mad/Test.java:53:28:53:43 | (...)... | provenance | Sink:MaD:21 | +| mad/Test.java:55:44:55:51 | source(...) : String | mad/Test.java:55:36:55:51 | (...)... | provenance | Sink:MaD:22 | +| mad/Test.java:57:38:57:45 | source(...) : String | mad/Test.java:57:32:57:45 | (...)... | provenance | Sink:MaD:31 | +| mad/Test.java:59:44:59:51 | source(...) : String | mad/Test.java:59:38:59:51 | (...)... | provenance | Sink:MaD:32 | +| mad/Test.java:61:53:61:60 | source(...) : String | mad/Test.java:61:47:61:60 | (...)... | provenance | Sink:MaD:30 | +| mad/Test.java:63:32:63:39 | source(...) : String | mad/Test.java:63:26:63:39 | (...)... | provenance | Sink:MaD:34 | +| mad/Test.java:65:44:65:51 | source(...) : String | mad/Test.java:65:38:65:51 | (...)... | provenance | Sink:MaD:35 | +| mad/Test.java:67:32:67:39 | source(...) : String | mad/Test.java:67:26:67:39 | (...)... | provenance | Sink:MaD:33 | +| mad/Test.java:69:33:69:40 | source(...) : String | mad/Test.java:69:27:69:40 | (...)... | provenance | Sink:MaD:28 | +| mad/Test.java:71:53:71:60 | source(...) : String | mad/Test.java:71:47:71:60 | (...)... | provenance | Sink:MaD:36 | +| mad/Test.java:74:58:74:65 | source(...) : String | mad/Test.java:74:50:74:65 | (...)... | provenance | Sink:MaD:38 | +| mad/Test.java:76:62:76:69 | source(...) : String | mad/Test.java:76:50:76:69 | (...)... | provenance | Sink:MaD:37 | +| mad/Test.java:78:52:78:59 | source(...) : String | mad/Test.java:78:43:78:59 | (...)... | provenance | Sink:MaD:39 | +| mad/Test.java:80:34:80:41 | source(...) : String | mad/Test.java:80:25:80:41 | (...)... | provenance | Sink:MaD:40 | +| mad/Test.java:82:40:82:47 | source(...) : String | mad/Test.java:82:31:82:47 | (...)... | provenance | Sink:MaD:41 | +| mad/Test.java:84:40:84:47 | source(...) : String | mad/Test.java:84:31:84:47 | (...)... | provenance | Sink:MaD:42 | +| mad/Test.java:86:50:86:57 | source(...) : String | mad/Test.java:86:41:86:57 | (...)... | provenance | Sink:MaD:43 | +| mad/Test.java:92:33:92:40 | source(...) : String | mad/Test.java:92:24:92:40 | (...)... | provenance | Sink:MaD:27 | +| mad/Test.java:97:35:97:42 | source(...) : String | mad/Test.java:97:29:97:42 | (...)... | provenance | Sink:MaD:240 | +| mad/Test.java:102:32:102:39 | source(...) : String | mad/Test.java:102:26:102:39 | (...)... | provenance | Sink:MaD:247 | +| mad/Test.java:107:24:107:31 | source(...) : String | mad/Test.java:107:15:107:31 | (...)... | provenance | Sink:MaD:282 | +| mad/Test.java:112:24:112:31 | source(...) : String | mad/Test.java:112:15:112:31 | (...)... | provenance | Sink:MaD:281 | models | 1 | Sink: com.zaxxer.hikari; HikariConfig; false; HikariConfig; (Properties); ; Argument[0]; request-forgery; manual | | 2 | Sink: com.zaxxer.hikari; HikariConfig; false; setJdbcUrl; (String); ; Argument[0]; request-forgery; manual | -| 3 | Sink: io.micronaut.http.client; BlockingHttpClient; true; exchange; (String); ; Argument[0]; request-forgery; manual | -| 4 | Sink: io.micronaut.http.client; BlockingHttpClient; true; retrieve; (String); ; Argument[0]; request-forgery; manual | -| 5 | Sink: io.micronaut.http.client; BlockingHttpClient; true; retrieve; (String,Class); ; Argument[0]; request-forgery; manual | -| 6 | Sink: jakarta.ws.rs.client; Client; true; target; ; ; Argument[0]; request-forgery; manual | -| 7 | Sink: java.net.http; HttpClient; true; send; (HttpRequest,HttpResponse$BodyHandler); ; Argument[0]; request-forgery; ai-manual | -| 8 | Sink: java.net.http; HttpRequest$Builder; false; uri; ; ; Argument[0]; request-forgery; manual | -| 9 | Sink: java.net.http; HttpRequest; false; newBuilder; ; ; Argument[0]; request-forgery; manual | -| 10 | Sink: java.net; DatagramSocket; true; connect; (SocketAddress); ; Argument[0]; request-forgery; ai-manual | -| 11 | Sink: java.net; URL; false; openConnection; (Proxy); ; Argument[0]; request-forgery; ai-manual | -| 12 | Sink: java.net; URL; false; openConnection; ; ; Argument[this]; request-forgery; manual | -| 13 | Sink: java.net; URL; false; openStream; ; ; Argument[this]; request-forgery; manual | -| 14 | Sink: java.net; URLClassLoader; false; URLClassLoader; (String,URL[],ClassLoader); ; Argument[1]; request-forgery; manual | -| 15 | Sink: java.net; URLClassLoader; false; URLClassLoader; (String,URL[],ClassLoader,URLStreamHandlerFactory); ; Argument[1]; request-forgery; manual | -| 16 | Sink: java.net; URLClassLoader; false; URLClassLoader; (URL[]); ; Argument[0]; request-forgery; manual | -| 17 | Sink: java.net; URLClassLoader; false; URLClassLoader; (URL[],ClassLoader); ; Argument[0]; request-forgery; manual | -| 18 | Sink: java.net; URLClassLoader; false; URLClassLoader; (URL[],ClassLoader,URLStreamHandlerFactory); ; Argument[0]; request-forgery; manual | -| 19 | Sink: java.net; URLClassLoader; false; newInstance; ; ; Argument[0]; request-forgery; manual | -| 20 | Sink: java.sql; Driver; false; connect; (String,Properties); ; Argument[0]; request-forgery; manual | -| 21 | Sink: java.sql; DriverManager; false; getConnection; (String); ; Argument[0]; request-forgery; manual | -| 22 | Sink: java.sql; DriverManager; false; getConnection; (String,Properties); ; Argument[0]; request-forgery; manual | -| 23 | Sink: java.sql; DriverManager; false; getConnection; (String,String,String); ; Argument[0]; request-forgery; manual | -| 24 | Sink: javafx.scene.web; WebEngine; false; load; (String); ; Argument[0]; request-forgery; ai-manual | -| 25 | Sink: javax.activation; URLDataSource; true; URLDataSource; ; ; Argument[0]; request-forgery; manual | -| 26 | Sink: javax.ws.rs.client; Client; true; target; ; ; Argument[0]; request-forgery; manual | -| 27 | Sink: org.apache.commons.jelly; JellyContext; true; JellyContext; (JellyContext,URL); ; Argument[1]; request-forgery; ai-manual | -| 28 | Sink: org.apache.commons.jelly; JellyContext; true; JellyContext; (JellyContext,URL,URL); ; Argument[1]; request-forgery; ai-manual | -| 29 | Sink: org.apache.commons.jelly; JellyContext; true; JellyContext; (JellyContext,URL,URL); ; Argument[2]; request-forgery; ai-manual | -| 30 | Sink: org.apache.commons.jelly; JellyContext; true; JellyContext; (URL); ; Argument[0]; request-forgery; ai-manual | -| 31 | Sink: org.apache.commons.jelly; JellyContext; true; JellyContext; (URL,URL); ; Argument[0]; request-forgery; ai-manual | -| 32 | Sink: org.apache.commons.jelly; JellyContext; true; JellyContext; (URL,URL); ; Argument[1]; request-forgery; ai-manual | -| 33 | Sink: org.apache.cxf.catalog; OASISCatalogManager; true; loadCatalog; (URL); ; Argument[0]; request-forgery; manual | -| 34 | Sink: org.apache.cxf.common.classloader; ClassLoaderUtils; true; getURLClassLoader; (List,ClassLoader); ; Argument[0]; request-forgery; manual | -| 35 | Sink: org.apache.cxf.common.classloader; ClassLoaderUtils; true; getURLClassLoader; (URL[],ClassLoader); ; Argument[0]; request-forgery; manual | -| 36 | Sink: org.apache.cxf.resource; ExtendedURIResolver; true; resolve; (String,String); ; Argument[0]; request-forgery; manual | -| 37 | Sink: org.apache.cxf.resource; URIResolver; true; URIResolver; (String); ; Argument[0]; request-forgery; manual | -| 38 | Sink: org.apache.cxf.resource; URIResolver; true; URIResolver; (String,String); ; Argument[1]; request-forgery; manual | -| 39 | Sink: org.apache.cxf.resource; URIResolver; true; URIResolver; (String,String,Class); ; Argument[1]; request-forgery; manual | -| 40 | Sink: org.apache.cxf.resource; URIResolver; true; resolve; (String,String,Class); ; Argument[1]; request-forgery; manual | -| 41 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; create; (Method,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | -| 42 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; create; (Method,String); ; Argument[1]; request-forgery; hq-manual | -| 43 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; create; (Method,URI); ; Argument[1]; request-forgery; hq-manual | -| 44 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; create; (String,String); ; Argument[1]; request-forgery; hq-manual | -| 45 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; create; (String,URI); ; Argument[1]; request-forgery; hq-manual | -| 46 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; delete; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 47 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; delete; (String); ; Argument[0]; request-forgery; hq-manual | -| 48 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; delete; (URI); ; Argument[0]; request-forgery; hq-manual | -| 49 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; get; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 50 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; get; (String); ; Argument[0]; request-forgery; hq-manual | -| 51 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; get; (URI); ; Argument[0]; request-forgery; hq-manual | -| 52 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; head; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 53 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; head; (String); ; Argument[0]; request-forgery; hq-manual | -| 54 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; head; (URI); ; Argument[0]; request-forgery; hq-manual | -| 55 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; options; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 56 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; options; (String); ; Argument[0]; request-forgery; hq-manual | -| 57 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; options; (URI); ; Argument[0]; request-forgery; hq-manual | -| 58 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; patch; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 59 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; patch; (String); ; Argument[0]; request-forgery; hq-manual | -| 60 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; patch; (URI); ; Argument[0]; request-forgery; hq-manual | -| 61 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; post; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 62 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; post; (String); ; Argument[0]; request-forgery; hq-manual | -| 63 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; post; (URI); ; Argument[0]; request-forgery; hq-manual | -| 64 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; put; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 65 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; put; (String); ; Argument[0]; request-forgery; hq-manual | -| 66 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; put; (URI); ; Argument[0]; request-forgery; hq-manual | -| 67 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; trace; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 68 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; trace; (String); ; Argument[0]; request-forgery; hq-manual | -| 69 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; trace; (URI); ; Argument[0]; request-forgery; hq-manual | -| 70 | Sink: org.apache.hc.client5.http.async.methods; ConfigurableHttpRequest; true; ConfigurableHttpRequest; (String,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | -| 71 | Sink: org.apache.hc.client5.http.async.methods; ConfigurableHttpRequest; true; ConfigurableHttpRequest; (String,URI); ; Argument[1]; request-forgery; hq-manual | -| 72 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; SimpleHttpRequest; (Method,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | -| 73 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; SimpleHttpRequest; (Method,URI); ; Argument[1]; request-forgery; hq-manual | -| 74 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; SimpleHttpRequest; (String,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | -| 75 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; SimpleHttpRequest; (String,URI); ; Argument[1]; request-forgery; hq-manual | -| 76 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; create; (Method,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | -| 77 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; create; (Method,URI); ; Argument[1]; request-forgery; hq-manual | -| 78 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; create; (String,String); ; Argument[1]; request-forgery; hq-manual | -| 79 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; create; (String,URI); ; Argument[1]; request-forgery; hq-manual | -| 80 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; create; (Method,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | -| 81 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; create; (Method,String); ; Argument[1]; request-forgery; hq-manual | -| 82 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; create; (Method,URI); ; Argument[1]; request-forgery; hq-manual | -| 83 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; create; (String,String); ; Argument[1]; request-forgery; hq-manual | -| 84 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; create; (String,URI); ; Argument[1]; request-forgery; hq-manual | -| 85 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; delete; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 86 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; delete; (String); ; Argument[0]; request-forgery; hq-manual | -| 87 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; delete; (URI); ; Argument[0]; request-forgery; hq-manual | -| 88 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; get; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 89 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; get; (String); ; Argument[0]; request-forgery; hq-manual | -| 90 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; get; (URI); ; Argument[0]; request-forgery; hq-manual | -| 91 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; head; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 92 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; head; (String); ; Argument[0]; request-forgery; hq-manual | -| 93 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; head; (URI); ; Argument[0]; request-forgery; hq-manual | -| 94 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; options; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 95 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; options; (String); ; Argument[0]; request-forgery; hq-manual | -| 96 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; options; (URI); ; Argument[0]; request-forgery; hq-manual | -| 97 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; patch; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 98 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; patch; (String); ; Argument[0]; request-forgery; hq-manual | -| 99 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; patch; (URI); ; Argument[0]; request-forgery; hq-manual | -| 100 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; post; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 101 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; post; (String); ; Argument[0]; request-forgery; hq-manual | -| 102 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; post; (URI); ; Argument[0]; request-forgery; hq-manual | -| 103 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; put; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 104 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; put; (String); ; Argument[0]; request-forgery; hq-manual | -| 105 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; put; (URI); ; Argument[0]; request-forgery; hq-manual | -| 106 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; trace; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | -| 107 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; trace; (String); ; Argument[0]; request-forgery; hq-manual | -| 108 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; trace; (URI); ; Argument[0]; request-forgery; hq-manual | -| 109 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; delete; (String); ; Argument[0]; request-forgery; hq-manual | -| 110 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; delete; (URI); ; Argument[0]; request-forgery; hq-manual | -| 111 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; get; (String); ; Argument[0]; request-forgery; hq-manual | -| 112 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; get; (URI); ; Argument[0]; request-forgery; hq-manual | -| 113 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; head; (String); ; Argument[0]; request-forgery; hq-manual | -| 114 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; head; (URI); ; Argument[0]; request-forgery; hq-manual | -| 115 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; options; (String); ; Argument[0]; request-forgery; hq-manual | -| 116 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; options; (URI); ; Argument[0]; request-forgery; hq-manual | -| 117 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; patch; (String); ; Argument[0]; request-forgery; hq-manual | -| 118 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; patch; (URI); ; Argument[0]; request-forgery; hq-manual | -| 119 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; post; (String); ; Argument[0]; request-forgery; hq-manual | -| 120 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; post; (URI); ; Argument[0]; request-forgery; hq-manual | -| 121 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; put; (String); ; Argument[0]; request-forgery; hq-manual | -| 122 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; put; (URI); ; Argument[0]; request-forgery; hq-manual | -| 123 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; trace; (String); ; Argument[0]; request-forgery; hq-manual | -| 124 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; trace; (URI); ; Argument[0]; request-forgery; hq-manual | -| 125 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; create; (Method,String); ; Argument[1]; request-forgery; hq-manual | -| 126 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; create; (Method,URI); ; Argument[1]; request-forgery; hq-manual | -| 127 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; create; (String,String); ; Argument[1]; request-forgery; hq-manual | -| 128 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; create; (String,URI); ; Argument[1]; request-forgery; hq-manual | -| 129 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; delete; (String); ; Argument[0]; request-forgery; hq-manual | -| 130 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; delete; (URI); ; Argument[0]; request-forgery; hq-manual | -| 131 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; get; (String); ; Argument[0]; request-forgery; hq-manual | -| 132 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; get; (URI); ; Argument[0]; request-forgery; hq-manual | -| 133 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; head; (String); ; Argument[0]; request-forgery; hq-manual | -| 134 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; head; (URI); ; Argument[0]; request-forgery; hq-manual | -| 135 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; options; (String); ; Argument[0]; request-forgery; hq-manual | -| 136 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; options; (URI); ; Argument[0]; request-forgery; hq-manual | -| 137 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; patch; (String); ; Argument[0]; request-forgery; hq-manual | -| 138 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; patch; (URI); ; Argument[0]; request-forgery; hq-manual | -| 139 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; post; (String); ; Argument[0]; request-forgery; hq-manual | -| 140 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; post; (URI); ; Argument[0]; request-forgery; hq-manual | -| 141 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; put; (String); ; Argument[0]; request-forgery; hq-manual | -| 142 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; put; (URI); ; Argument[0]; request-forgery; hq-manual | -| 143 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; trace; (String); ; Argument[0]; request-forgery; hq-manual | -| 144 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; trace; (URI); ; Argument[0]; request-forgery; hq-manual | -| 145 | Sink: org.apache.hc.client5.http.classic.methods; HttpDelete; true; HttpDelete; (String); ; Argument[0]; request-forgery; hq-manual | -| 146 | Sink: org.apache.hc.client5.http.classic.methods; HttpDelete; true; HttpDelete; (URI); ; Argument[0]; request-forgery; hq-manual | -| 147 | Sink: org.apache.hc.client5.http.classic.methods; HttpGet; true; HttpGet; (String); ; Argument[0]; request-forgery; hq-manual | -| 148 | Sink: org.apache.hc.client5.http.classic.methods; HttpGet; true; HttpGet; (URI); ; Argument[0]; request-forgery; hq-manual | -| 149 | Sink: org.apache.hc.client5.http.classic.methods; HttpHead; true; HttpHead; (String); ; Argument[0]; request-forgery; hq-manual | -| 150 | Sink: org.apache.hc.client5.http.classic.methods; HttpHead; true; HttpHead; (URI); ; Argument[0]; request-forgery; hq-manual | -| 151 | Sink: org.apache.hc.client5.http.classic.methods; HttpOptions; true; HttpOptions; (String); ; Argument[0]; request-forgery; hq-manual | -| 152 | Sink: org.apache.hc.client5.http.classic.methods; HttpOptions; true; HttpOptions; (URI); ; Argument[0]; request-forgery; hq-manual | -| 153 | Sink: org.apache.hc.client5.http.classic.methods; HttpPatch; true; HttpPatch; (String); ; Argument[0]; request-forgery; hq-manual | -| 154 | Sink: org.apache.hc.client5.http.classic.methods; HttpPatch; true; HttpPatch; (URI); ; Argument[0]; request-forgery; hq-manual | -| 155 | Sink: org.apache.hc.client5.http.classic.methods; HttpPost; true; HttpPost; (String); ; Argument[0]; request-forgery; hq-manual | -| 156 | Sink: org.apache.hc.client5.http.classic.methods; HttpPost; true; HttpPost; (URI); ; Argument[0]; request-forgery; hq-manual | -| 157 | Sink: org.apache.hc.client5.http.classic.methods; HttpPut; true; HttpPut; (String); ; Argument[0]; request-forgery; hq-manual | -| 158 | Sink: org.apache.hc.client5.http.classic.methods; HttpPut; true; HttpPut; (URI); ; Argument[0]; request-forgery; hq-manual | -| 159 | Sink: org.apache.hc.client5.http.classic.methods; HttpTrace; true; HttpTrace; (String); ; Argument[0]; request-forgery; hq-manual | -| 160 | Sink: org.apache.hc.client5.http.classic.methods; HttpTrace; true; HttpTrace; (URI); ; Argument[0]; request-forgery; hq-manual | -| 161 | Sink: org.apache.hc.client5.http.classic.methods; HttpUriRequestBase; true; HttpUriRequestBase; (String,URI); ; Argument[1]; request-forgery; hq-manual | -| 162 | Sink: org.apache.hc.client5.http.fluent; Request; true; create; (Method,URI); ; Argument[1]; request-forgery; hq-manual | -| 163 | Sink: org.apache.hc.client5.http.fluent; Request; true; create; (String,String); ; Argument[1]; request-forgery; hq-manual | -| 164 | Sink: org.apache.hc.client5.http.fluent; Request; true; create; (String,URI); ; Argument[1]; request-forgery; hq-manual | -| 165 | Sink: org.apache.hc.client5.http.fluent; Request; true; delete; (String); ; Argument[0]; request-forgery; hq-manual | -| 166 | Sink: org.apache.hc.client5.http.fluent; Request; true; delete; (URI); ; Argument[0]; request-forgery; hq-manual | -| 167 | Sink: org.apache.hc.client5.http.fluent; Request; true; get; (String); ; Argument[0]; request-forgery; hq-manual | -| 168 | Sink: org.apache.hc.client5.http.fluent; Request; true; get; (URI); ; Argument[0]; request-forgery; hq-manual | -| 169 | Sink: org.apache.hc.client5.http.fluent; Request; true; head; (String); ; Argument[0]; request-forgery; hq-manual | -| 170 | Sink: org.apache.hc.client5.http.fluent; Request; true; head; (URI); ; Argument[0]; request-forgery; hq-manual | -| 171 | Sink: org.apache.hc.client5.http.fluent; Request; true; options; (String); ; Argument[0]; request-forgery; hq-manual | -| 172 | Sink: org.apache.hc.client5.http.fluent; Request; true; options; (URI); ; Argument[0]; request-forgery; hq-manual | -| 173 | Sink: org.apache.hc.client5.http.fluent; Request; true; patch; (String); ; Argument[0]; request-forgery; hq-manual | -| 174 | Sink: org.apache.hc.client5.http.fluent; Request; true; patch; (URI); ; Argument[0]; request-forgery; hq-manual | -| 175 | Sink: org.apache.hc.client5.http.fluent; Request; true; post; (String); ; Argument[0]; request-forgery; hq-manual | -| 176 | Sink: org.apache.hc.client5.http.fluent; Request; true; post; (URI); ; Argument[0]; request-forgery; hq-manual | -| 177 | Sink: org.apache.hc.client5.http.fluent; Request; true; put; (String); ; Argument[0]; request-forgery; hq-manual | -| 178 | Sink: org.apache.hc.client5.http.fluent; Request; true; put; (URI); ; Argument[0]; request-forgery; hq-manual | -| 179 | Sink: org.apache.hc.client5.http.fluent; Request; true; trace; (String); ; Argument[0]; request-forgery; hq-manual | -| 180 | Sink: org.apache.hc.client5.http.fluent; Request; true; trace; (URI); ; Argument[0]; request-forgery; hq-manual | -| 181 | Sink: org.apache.hc.core5.http.impl.bootstrap; HttpAsyncRequester; true; connect; (HttpHost,Timeout); ; Argument[0]; request-forgery; hq-manual | -| 182 | Sink: org.apache.hc.core5.http.impl.bootstrap; HttpAsyncRequester; true; connect; (HttpHost,Timeout,Object,FutureCallback); ; Argument[0]; request-forgery; hq-manual | -| 183 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; delete; (String); ; Argument[0]; request-forgery; hq-manual | -| 184 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; delete; (URI); ; Argument[0]; request-forgery; hq-manual | -| 185 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; get; (String); ; Argument[0]; request-forgery; hq-manual | -| 186 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; get; (URI); ; Argument[0]; request-forgery; hq-manual | -| 187 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; head; (String); ; Argument[0]; request-forgery; hq-manual | -| 188 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; head; (URI); ; Argument[0]; request-forgery; hq-manual | -| 189 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; options; (String); ; Argument[0]; request-forgery; hq-manual | -| 190 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; options; (URI); ; Argument[0]; request-forgery; hq-manual | -| 191 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; patch; (String); ; Argument[0]; request-forgery; hq-manual | -| 192 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; patch; (URI); ; Argument[0]; request-forgery; hq-manual | -| 193 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; post; (String); ; Argument[0]; request-forgery; hq-manual | -| 194 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; post; (URI); ; Argument[0]; request-forgery; hq-manual | -| 195 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; put; (String); ; Argument[0]; request-forgery; hq-manual | -| 196 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; put; (URI); ; Argument[0]; request-forgery; hq-manual | -| 197 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; trace; (String); ; Argument[0]; request-forgery; hq-manual | -| 198 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; trace; (URI); ; Argument[0]; request-forgery; hq-manual | -| 199 | Sink: org.apache.hc.core5.http.message; BasicClassicHttpRequest; true; BasicClassicHttpRequest; (Method,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | -| 200 | Sink: org.apache.hc.core5.http.message; BasicClassicHttpRequest; true; BasicClassicHttpRequest; (Method,URI); ; Argument[1]; request-forgery; hq-manual | -| 201 | Sink: org.apache.hc.core5.http.message; BasicClassicHttpRequest; true; BasicClassicHttpRequest; (String,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | -| 202 | Sink: org.apache.hc.core5.http.message; BasicClassicHttpRequest; true; BasicClassicHttpRequest; (String,URI); ; Argument[1]; request-forgery; hq-manual | -| 203 | Sink: org.apache.hc.core5.http.message; BasicHttpRequest; true; BasicHttpRequest; (Method,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | -| 204 | Sink: org.apache.hc.core5.http.message; BasicHttpRequest; true; BasicHttpRequest; (Method,URI); ; Argument[1]; request-forgery; hq-manual | -| 205 | Sink: org.apache.hc.core5.http.message; BasicHttpRequest; true; BasicHttpRequest; (String,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | -| 206 | Sink: org.apache.hc.core5.http.message; BasicHttpRequest; true; BasicHttpRequest; (String,URI); ; Argument[1]; request-forgery; hq-manual | -| 207 | Sink: org.apache.hc.core5.http.support; AbstractRequestBuilder; true; setHttpHost; (HttpHost); ; Argument[0]; request-forgery; hq-manual | -| 208 | Sink: org.apache.hc.core5.http.support; AbstractRequestBuilder; true; setUri; (String); ; Argument[0]; request-forgery; hq-manual | -| 209 | Sink: org.apache.hc.core5.http.support; AbstractRequestBuilder; true; setUri; (URI); ; Argument[0]; request-forgery; hq-manual | -| 210 | Sink: org.apache.hc.core5.http; HttpRequest; true; setUri; (URI); ; Argument[0]; request-forgery; hq-manual | -| 211 | Sink: org.apache.hc.core5.http; HttpRequestFactory; true; newHttpRequest; (String,String); ; Argument[1]; request-forgery; hq-manual | -| 212 | Sink: org.apache.hc.core5.http; HttpRequestFactory; true; newHttpRequest; (String,URI); ; Argument[1]; request-forgery; hq-manual | -| 213 | Sink: org.apache.http.client.methods; HttpDelete; false; HttpDelete; ; ; Argument[0]; request-forgery; manual | -| 214 | Sink: org.apache.http.client.methods; HttpGet; false; HttpGet; ; ; Argument[0]; request-forgery; manual | -| 215 | Sink: org.apache.http.client.methods; HttpHead; false; HttpHead; ; ; Argument[0]; request-forgery; manual | -| 216 | Sink: org.apache.http.client.methods; HttpOptions; false; HttpOptions; ; ; Argument[0]; request-forgery; manual | -| 217 | Sink: org.apache.http.client.methods; HttpPatch; false; HttpPatch; ; ; Argument[0]; request-forgery; manual | -| 218 | Sink: org.apache.http.client.methods; HttpPost; false; HttpPost; ; ; Argument[0]; request-forgery; manual | -| 219 | Sink: org.apache.http.client.methods; HttpPut; false; HttpPut; ; ; Argument[0]; request-forgery; manual | -| 220 | Sink: org.apache.http.client.methods; HttpRequestBase; true; setURI; ; ; Argument[0]; request-forgery; manual | -| 221 | Sink: org.apache.http.client.methods; HttpTrace; false; HttpTrace; ; ; Argument[0]; request-forgery; manual | -| 222 | Sink: org.apache.http.client.methods; RequestBuilder; false; delete; ; ; Argument[0]; request-forgery; manual | -| 223 | Sink: org.apache.http.client.methods; RequestBuilder; false; get; ; ; Argument[0]; request-forgery; manual | -| 224 | Sink: org.apache.http.client.methods; RequestBuilder; false; head; ; ; Argument[0]; request-forgery; manual | -| 225 | Sink: org.apache.http.client.methods; RequestBuilder; false; options; ; ; Argument[0]; request-forgery; manual | -| 226 | Sink: org.apache.http.client.methods; RequestBuilder; false; patch; ; ; Argument[0]; request-forgery; manual | -| 227 | Sink: org.apache.http.client.methods; RequestBuilder; false; post; ; ; Argument[0]; request-forgery; manual | -| 228 | Sink: org.apache.http.client.methods; RequestBuilder; false; put; ; ; Argument[0]; request-forgery; manual | -| 229 | Sink: org.apache.http.client.methods; RequestBuilder; false; setUri; ; ; Argument[0]; request-forgery; manual | -| 230 | Sink: org.apache.http.client.methods; RequestBuilder; false; trace; ; ; Argument[0]; request-forgery; manual | -| 231 | Sink: org.apache.http.message; BasicHttpEntityEnclosingRequest; false; BasicHttpEntityEnclosingRequest; (RequestLine); ; Argument[0]; request-forgery; manual | -| 232 | Sink: org.apache.http.message; BasicHttpEntityEnclosingRequest; false; BasicHttpEntityEnclosingRequest; (String,String); ; Argument[1]; request-forgery; manual | -| 233 | Sink: org.apache.http.message; BasicHttpEntityEnclosingRequest; false; BasicHttpEntityEnclosingRequest; (String,String,ProtocolVersion); ; Argument[1]; request-forgery; manual | -| 234 | Sink: org.apache.http.message; BasicHttpRequest; false; BasicHttpRequest; (RequestLine); ; Argument[0]; request-forgery; manual | -| 235 | Sink: org.apache.http.message; BasicHttpRequest; false; BasicHttpRequest; (String,String); ; Argument[1]; request-forgery; manual | -| 236 | Sink: org.apache.http.message; BasicHttpRequest; false; BasicHttpRequest; (String,String,ProtocolVersion); ; Argument[1]; request-forgery; manual | -| 237 | Sink: org.codehaus.cargo.container.installer; ZipURLInstaller; true; ZipURLInstaller; (URL,String,String); ; Argument[0]; request-forgery; ai-manual | -| 238 | Sink: org.jdbi.v3.core; Jdbi; false; create; (String); ; Argument[0]; request-forgery; manual | -| 239 | Sink: org.jdbi.v3.core; Jdbi; false; create; (String,Properties); ; Argument[0]; request-forgery; manual | -| 240 | Sink: org.jdbi.v3.core; Jdbi; false; create; (String,String,String); ; Argument[0]; request-forgery; manual | -| 241 | Sink: org.jdbi.v3.core; Jdbi; false; open; (String); ; Argument[0]; request-forgery; manual | -| 242 | Sink: org.jdbi.v3.core; Jdbi; false; open; (String,Properties); ; Argument[0]; request-forgery; manual | -| 243 | Sink: org.jdbi.v3.core; Jdbi; false; open; (String,String,String); ; Argument[0]; request-forgery; manual | -| 244 | Sink: org.kohsuke.stapler; HttpResponses; true; staticResource; (URL); ; Argument[0]; request-forgery; ai-manual | -| 245 | Sink: org.springframework.boot.jdbc; DataSourceBuilder; false; url; (String); ; Argument[0]; request-forgery; manual | -| 246 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (HttpMethod,URI); ; Argument[1]; request-forgery; manual | -| 247 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (MultiValueMap,HttpMethod,URI); ; Argument[2]; request-forgery; manual | -| 248 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (Object,HttpMethod,URI); ; Argument[2]; request-forgery; manual | -| 249 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (Object,HttpMethod,URI,Type); ; Argument[2]; request-forgery; manual | -| 250 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (Object,MultiValueMap,HttpMethod,URI); ; Argument[3]; request-forgery; manual | -| 251 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (Object,MultiValueMap,HttpMethod,URI,Type); ; Argument[3]; request-forgery; manual | -| 252 | Sink: org.springframework.http; RequestEntity; false; delete; ; ; Argument[0]; request-forgery; manual | -| 253 | Sink: org.springframework.http; RequestEntity; false; get; ; ; Argument[0]; request-forgery; manual | -| 254 | Sink: org.springframework.http; RequestEntity; false; head; ; ; Argument[0]; request-forgery; manual | -| 255 | Sink: org.springframework.http; RequestEntity; false; method; ; ; Argument[1]; request-forgery; manual | -| 256 | Sink: org.springframework.http; RequestEntity; false; options; ; ; Argument[0]; request-forgery; manual | -| 257 | Sink: org.springframework.http; RequestEntity; false; patch; ; ; Argument[0]; request-forgery; manual | -| 258 | Sink: org.springframework.http; RequestEntity; false; post; ; ; Argument[0]; request-forgery; manual | -| 259 | Sink: org.springframework.http; RequestEntity; false; put; ; ; Argument[0]; request-forgery; manual | -| 260 | Sink: org.springframework.jdbc.datasource; AbstractDriverBasedDataSource; false; setUrl; (String); ; Argument[0]; request-forgery; manual | -| 261 | Sink: org.springframework.jdbc.datasource; DriverManagerDataSource; false; DriverManagerDataSource; (String); ; Argument[0]; request-forgery; manual | -| 262 | Sink: org.springframework.jdbc.datasource; DriverManagerDataSource; false; DriverManagerDataSource; (String,Properties); ; Argument[0]; request-forgery; manual | -| 263 | Sink: org.springframework.jdbc.datasource; DriverManagerDataSource; false; DriverManagerDataSource; (String,String,String); ; Argument[0]; request-forgery; manual | -| 264 | Sink: org.springframework.web.client; RestTemplate; false; delete; ; ; Argument[0]; request-forgery; manual | -| 265 | Sink: org.springframework.web.client; RestTemplate; false; exchange; ; ; Argument[0]; request-forgery; manual | -| 266 | Sink: org.springframework.web.client; RestTemplate; false; execute; ; ; Argument[0]; request-forgery; manual | -| 267 | Sink: org.springframework.web.client; RestTemplate; false; getForEntity; ; ; Argument[0]; request-forgery; manual | -| 268 | Sink: org.springframework.web.client; RestTemplate; false; getForObject; ; ; Argument[0]; request-forgery; manual | -| 269 | Sink: org.springframework.web.client; RestTemplate; false; headForHeaders; ; ; Argument[0]; request-forgery; manual | -| 270 | Sink: org.springframework.web.client; RestTemplate; false; optionsForAllow; ; ; Argument[0]; request-forgery; manual | -| 271 | Sink: org.springframework.web.client; RestTemplate; false; patchForObject; ; ; Argument[0]; request-forgery; manual | -| 272 | Sink: org.springframework.web.client; RestTemplate; false; postForEntity; ; ; Argument[0]; request-forgery; manual | -| 273 | Sink: org.springframework.web.client; RestTemplate; false; postForLocation; ; ; Argument[0]; request-forgery; manual | -| 274 | Sink: org.springframework.web.client; RestTemplate; false; postForObject; ; ; Argument[0]; request-forgery; manual | -| 275 | Sink: org.springframework.web.client; RestTemplate; false; put; ; ; Argument[0]; request-forgery; manual | -| 276 | Sink: org.springframework.web.reactive.function.client; WebClient$Builder; false; baseUrl; ; ; Argument[0]; request-forgery; manual | -| 277 | Sink: org.springframework.web.reactive.function.client; WebClient; false; create; ; ; Argument[0]; request-forgery; manual | -| 278 | Sink: play.libs.ws; StandaloneWSClient; true; url; ; ; Argument[0]; request-forgery; manual | -| 279 | Sink: play.libs.ws; WSClient; true; url; ; ; Argument[0]; request-forgery; manual | -| 280 | Source: javax.servlet; ServletRequest; false; getParameter; (String); ; ReturnValue; remote; manual | -| 281 | Summary: io.micronaut.http.uri; UriBuilder; true; build; (); ; Argument[this]; ReturnValue; taint; manual | -| 282 | Summary: io.micronaut.http.uri; UriBuilder; true; host; (String); ; Argument[0]; ReturnValue; taint; manual | -| 283 | Summary: java.lang; AbstractStringBuilder; true; append; ; ; Argument[0]; Argument[this]; taint; manual | -| 284 | Summary: java.lang; AbstractStringBuilder; true; append; ; ; Argument[this]; ReturnValue; value; manual | -| 285 | Summary: java.lang; CharSequence; true; toString; ; ; Argument[this]; ReturnValue; taint; manual | -| 286 | Summary: java.lang; String; false; format; (String,Object[]); ; Argument[1].ArrayElement; ReturnValue; taint; manual | -| 287 | Summary: java.lang; StringBuilder; true; StringBuilder; ; ; Argument[0]; Argument[this]; taint; manual | -| 288 | Summary: java.net.http; HttpRequest$Builder; true; build; (); ; Argument[this]; ReturnValue; taint; df-generated | -| 289 | Summary: java.net.http; HttpRequest; true; newBuilder; (URI); ; Argument[0]; ReturnValue; taint; df-generated | -| 290 | Summary: java.net; URI; false; URI; (String); ; Argument[0]; Argument[this]; taint; manual | -| 291 | Summary: java.net; URI; false; toString; ; ; Argument[this]; ReturnValue; taint; manual | -| 292 | Summary: java.net; URI; false; toURL; ; ; Argument[this]; ReturnValue; taint; manual | -| 293 | Summary: java.net; URL; false; URL; (String); ; Argument[0]; Argument[this]; taint; manual | -| 294 | Summary: java.util; List; false; of; (Object); ; Argument[0]; ReturnValue.Element; value; manual | -| 295 | Summary: java.util; List; true; get; (int); ; Argument[this].Element; ReturnValue; value; manual | -| 296 | Summary: java.util; Map; false; of; ; ; Argument[1]; ReturnValue.MapValue; value; manual | -| 297 | Summary: java.util; Map; false; of; ; ; Argument[3]; ReturnValue.MapValue; value; manual | -| 298 | Summary: java.util; Properties; true; setProperty; (String,String); ; Argument[1]; Argument[this].MapValue; value; manual | -| 299 | Summary: org.apache.hc.core5.http; HttpHost; true; HttpHost; (String); ; Argument[0]; Argument[this]; taint; hq-manual | -| 300 | Summary: org.apache.http.message; BasicRequestLine; false; BasicRequestLine; ; ; Argument[1]; Argument[this]; taint; manual | +| 3 | Sink: io.micronaut.http.client; BlockingHttpClient; true; exchange; (HttpRequest); ; Argument[0]; request-forgery; manual | +| 4 | Sink: io.micronaut.http.client; BlockingHttpClient; true; exchange; (String); ; Argument[0]; request-forgery; manual | +| 5 | Sink: io.micronaut.http.client; BlockingHttpClient; true; retrieve; (String); ; Argument[0]; request-forgery; manual | +| 6 | Sink: io.micronaut.http.client; BlockingHttpClient; true; retrieve; (String,Class); ; Argument[0]; request-forgery; manual | +| 7 | Sink: io.micronaut.http.client; HttpClient; true; exchange; (HttpRequest); ; Argument[0]; request-forgery; manual | +| 8 | Sink: io.micronaut.http.client; HttpClient; true; exchange; (String); ; Argument[0]; request-forgery; manual | +| 9 | Sink: jakarta.ws.rs.client; Client; true; target; ; ; Argument[0]; request-forgery; manual | +| 10 | Sink: java.net.http; HttpClient; true; send; (HttpRequest,HttpResponse$BodyHandler); ; Argument[0]; request-forgery; ai-manual | +| 11 | Sink: java.net.http; HttpRequest$Builder; false; uri; ; ; Argument[0]; request-forgery; manual | +| 12 | Sink: java.net.http; HttpRequest; false; newBuilder; ; ; Argument[0]; request-forgery; manual | +| 13 | Sink: java.net; DatagramSocket; true; connect; (SocketAddress); ; Argument[0]; request-forgery; ai-manual | +| 14 | Sink: java.net; URL; false; openConnection; (Proxy); ; Argument[0]; request-forgery; ai-manual | +| 15 | Sink: java.net; URL; false; openConnection; ; ; Argument[this]; request-forgery; manual | +| 16 | Sink: java.net; URL; false; openStream; ; ; Argument[this]; request-forgery; manual | +| 17 | Sink: java.net; URLClassLoader; false; URLClassLoader; (String,URL[],ClassLoader); ; Argument[1]; request-forgery; manual | +| 18 | Sink: java.net; URLClassLoader; false; URLClassLoader; (String,URL[],ClassLoader,URLStreamHandlerFactory); ; Argument[1]; request-forgery; manual | +| 19 | Sink: java.net; URLClassLoader; false; URLClassLoader; (URL[]); ; Argument[0]; request-forgery; manual | +| 20 | Sink: java.net; URLClassLoader; false; URLClassLoader; (URL[],ClassLoader); ; Argument[0]; request-forgery; manual | +| 21 | Sink: java.net; URLClassLoader; false; URLClassLoader; (URL[],ClassLoader,URLStreamHandlerFactory); ; Argument[0]; request-forgery; manual | +| 22 | Sink: java.net; URLClassLoader; false; newInstance; ; ; Argument[0]; request-forgery; manual | +| 23 | Sink: java.sql; Driver; false; connect; (String,Properties); ; Argument[0]; request-forgery; manual | +| 24 | Sink: java.sql; DriverManager; false; getConnection; (String); ; Argument[0]; request-forgery; manual | +| 25 | Sink: java.sql; DriverManager; false; getConnection; (String,Properties); ; Argument[0]; request-forgery; manual | +| 26 | Sink: java.sql; DriverManager; false; getConnection; (String,String,String); ; Argument[0]; request-forgery; manual | +| 27 | Sink: javafx.scene.web; WebEngine; false; load; (String); ; Argument[0]; request-forgery; ai-manual | +| 28 | Sink: javax.activation; URLDataSource; true; URLDataSource; ; ; Argument[0]; request-forgery; manual | +| 29 | Sink: javax.ws.rs.client; Client; true; target; ; ; Argument[0]; request-forgery; manual | +| 30 | Sink: org.apache.commons.jelly; JellyContext; true; JellyContext; (JellyContext,URL); ; Argument[1]; request-forgery; ai-manual | +| 31 | Sink: org.apache.commons.jelly; JellyContext; true; JellyContext; (JellyContext,URL,URL); ; Argument[1]; request-forgery; ai-manual | +| 32 | Sink: org.apache.commons.jelly; JellyContext; true; JellyContext; (JellyContext,URL,URL); ; Argument[2]; request-forgery; ai-manual | +| 33 | Sink: org.apache.commons.jelly; JellyContext; true; JellyContext; (URL); ; Argument[0]; request-forgery; ai-manual | +| 34 | Sink: org.apache.commons.jelly; JellyContext; true; JellyContext; (URL,URL); ; Argument[0]; request-forgery; ai-manual | +| 35 | Sink: org.apache.commons.jelly; JellyContext; true; JellyContext; (URL,URL); ; Argument[1]; request-forgery; ai-manual | +| 36 | Sink: org.apache.cxf.catalog; OASISCatalogManager; true; loadCatalog; (URL); ; Argument[0]; request-forgery; manual | +| 37 | Sink: org.apache.cxf.common.classloader; ClassLoaderUtils; true; getURLClassLoader; (List,ClassLoader); ; Argument[0]; request-forgery; manual | +| 38 | Sink: org.apache.cxf.common.classloader; ClassLoaderUtils; true; getURLClassLoader; (URL[],ClassLoader); ; Argument[0]; request-forgery; manual | +| 39 | Sink: org.apache.cxf.resource; ExtendedURIResolver; true; resolve; (String,String); ; Argument[0]; request-forgery; manual | +| 40 | Sink: org.apache.cxf.resource; URIResolver; true; URIResolver; (String); ; Argument[0]; request-forgery; manual | +| 41 | Sink: org.apache.cxf.resource; URIResolver; true; URIResolver; (String,String); ; Argument[1]; request-forgery; manual | +| 42 | Sink: org.apache.cxf.resource; URIResolver; true; URIResolver; (String,String,Class); ; Argument[1]; request-forgery; manual | +| 43 | Sink: org.apache.cxf.resource; URIResolver; true; resolve; (String,String,Class); ; Argument[1]; request-forgery; manual | +| 44 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; create; (Method,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | +| 45 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; create; (Method,String); ; Argument[1]; request-forgery; hq-manual | +| 46 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; create; (Method,URI); ; Argument[1]; request-forgery; hq-manual | +| 47 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; create; (String,String); ; Argument[1]; request-forgery; hq-manual | +| 48 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; create; (String,URI); ; Argument[1]; request-forgery; hq-manual | +| 49 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; delete; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 50 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; delete; (String); ; Argument[0]; request-forgery; hq-manual | +| 51 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; delete; (URI); ; Argument[0]; request-forgery; hq-manual | +| 52 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; get; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 53 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; get; (String); ; Argument[0]; request-forgery; hq-manual | +| 54 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; get; (URI); ; Argument[0]; request-forgery; hq-manual | +| 55 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; head; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 56 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; head; (String); ; Argument[0]; request-forgery; hq-manual | +| 57 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; head; (URI); ; Argument[0]; request-forgery; hq-manual | +| 58 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; options; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 59 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; options; (String); ; Argument[0]; request-forgery; hq-manual | +| 60 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; options; (URI); ; Argument[0]; request-forgery; hq-manual | +| 61 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; patch; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 62 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; patch; (String); ; Argument[0]; request-forgery; hq-manual | +| 63 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; patch; (URI); ; Argument[0]; request-forgery; hq-manual | +| 64 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; post; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 65 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; post; (String); ; Argument[0]; request-forgery; hq-manual | +| 66 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; post; (URI); ; Argument[0]; request-forgery; hq-manual | +| 67 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; put; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 68 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; put; (String); ; Argument[0]; request-forgery; hq-manual | +| 69 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; put; (URI); ; Argument[0]; request-forgery; hq-manual | +| 70 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; trace; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 71 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; trace; (String); ; Argument[0]; request-forgery; hq-manual | +| 72 | Sink: org.apache.hc.client5.http.async.methods; BasicHttpRequests; true; trace; (URI); ; Argument[0]; request-forgery; hq-manual | +| 73 | Sink: org.apache.hc.client5.http.async.methods; ConfigurableHttpRequest; true; ConfigurableHttpRequest; (String,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | +| 74 | Sink: org.apache.hc.client5.http.async.methods; ConfigurableHttpRequest; true; ConfigurableHttpRequest; (String,URI); ; Argument[1]; request-forgery; hq-manual | +| 75 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; SimpleHttpRequest; (Method,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | +| 76 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; SimpleHttpRequest; (Method,URI); ; Argument[1]; request-forgery; hq-manual | +| 77 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; SimpleHttpRequest; (String,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | +| 78 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; SimpleHttpRequest; (String,URI); ; Argument[1]; request-forgery; hq-manual | +| 79 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; create; (Method,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | +| 80 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; create; (Method,URI); ; Argument[1]; request-forgery; hq-manual | +| 81 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; create; (String,String); ; Argument[1]; request-forgery; hq-manual | +| 82 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequest; true; create; (String,URI); ; Argument[1]; request-forgery; hq-manual | +| 83 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; create; (Method,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | +| 84 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; create; (Method,String); ; Argument[1]; request-forgery; hq-manual | +| 85 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; create; (Method,URI); ; Argument[1]; request-forgery; hq-manual | +| 86 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; create; (String,String); ; Argument[1]; request-forgery; hq-manual | +| 87 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; create; (String,URI); ; Argument[1]; request-forgery; hq-manual | +| 88 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; delete; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 89 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; delete; (String); ; Argument[0]; request-forgery; hq-manual | +| 90 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; delete; (URI); ; Argument[0]; request-forgery; hq-manual | +| 91 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; get; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 92 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; get; (String); ; Argument[0]; request-forgery; hq-manual | +| 93 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; get; (URI); ; Argument[0]; request-forgery; hq-manual | +| 94 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; head; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 95 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; head; (String); ; Argument[0]; request-forgery; hq-manual | +| 96 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; head; (URI); ; Argument[0]; request-forgery; hq-manual | +| 97 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; options; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 98 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; options; (String); ; Argument[0]; request-forgery; hq-manual | +| 99 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; options; (URI); ; Argument[0]; request-forgery; hq-manual | +| 100 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; patch; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 101 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; patch; (String); ; Argument[0]; request-forgery; hq-manual | +| 102 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; patch; (URI); ; Argument[0]; request-forgery; hq-manual | +| 103 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; post; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 104 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; post; (String); ; Argument[0]; request-forgery; hq-manual | +| 105 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; post; (URI); ; Argument[0]; request-forgery; hq-manual | +| 106 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; put; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 107 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; put; (String); ; Argument[0]; request-forgery; hq-manual | +| 108 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; put; (URI); ; Argument[0]; request-forgery; hq-manual | +| 109 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; trace; (HttpHost,String); ; Argument[0]; request-forgery; hq-manual | +| 110 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; trace; (String); ; Argument[0]; request-forgery; hq-manual | +| 111 | Sink: org.apache.hc.client5.http.async.methods; SimpleHttpRequests; true; trace; (URI); ; Argument[0]; request-forgery; hq-manual | +| 112 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; delete; (String); ; Argument[0]; request-forgery; hq-manual | +| 113 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; delete; (URI); ; Argument[0]; request-forgery; hq-manual | +| 114 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; get; (String); ; Argument[0]; request-forgery; hq-manual | +| 115 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; get; (URI); ; Argument[0]; request-forgery; hq-manual | +| 116 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; head; (String); ; Argument[0]; request-forgery; hq-manual | +| 117 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; head; (URI); ; Argument[0]; request-forgery; hq-manual | +| 118 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; options; (String); ; Argument[0]; request-forgery; hq-manual | +| 119 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; options; (URI); ; Argument[0]; request-forgery; hq-manual | +| 120 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; patch; (String); ; Argument[0]; request-forgery; hq-manual | +| 121 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; patch; (URI); ; Argument[0]; request-forgery; hq-manual | +| 122 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; post; (String); ; Argument[0]; request-forgery; hq-manual | +| 123 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; post; (URI); ; Argument[0]; request-forgery; hq-manual | +| 124 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; put; (String); ; Argument[0]; request-forgery; hq-manual | +| 125 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; put; (URI); ; Argument[0]; request-forgery; hq-manual | +| 126 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; trace; (String); ; Argument[0]; request-forgery; hq-manual | +| 127 | Sink: org.apache.hc.client5.http.async.methods; SimpleRequestBuilder; true; trace; (URI); ; Argument[0]; request-forgery; hq-manual | +| 128 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; create; (Method,String); ; Argument[1]; request-forgery; hq-manual | +| 129 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; create; (Method,URI); ; Argument[1]; request-forgery; hq-manual | +| 130 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; create; (String,String); ; Argument[1]; request-forgery; hq-manual | +| 131 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; create; (String,URI); ; Argument[1]; request-forgery; hq-manual | +| 132 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; delete; (String); ; Argument[0]; request-forgery; hq-manual | +| 133 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; delete; (URI); ; Argument[0]; request-forgery; hq-manual | +| 134 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; get; (String); ; Argument[0]; request-forgery; hq-manual | +| 135 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; get; (URI); ; Argument[0]; request-forgery; hq-manual | +| 136 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; head; (String); ; Argument[0]; request-forgery; hq-manual | +| 137 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; head; (URI); ; Argument[0]; request-forgery; hq-manual | +| 138 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; options; (String); ; Argument[0]; request-forgery; hq-manual | +| 139 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; options; (URI); ; Argument[0]; request-forgery; hq-manual | +| 140 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; patch; (String); ; Argument[0]; request-forgery; hq-manual | +| 141 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; patch; (URI); ; Argument[0]; request-forgery; hq-manual | +| 142 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; post; (String); ; Argument[0]; request-forgery; hq-manual | +| 143 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; post; (URI); ; Argument[0]; request-forgery; hq-manual | +| 144 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; put; (String); ; Argument[0]; request-forgery; hq-manual | +| 145 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; put; (URI); ; Argument[0]; request-forgery; hq-manual | +| 146 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; trace; (String); ; Argument[0]; request-forgery; hq-manual | +| 147 | Sink: org.apache.hc.client5.http.classic.methods; ClassicHttpRequests; true; trace; (URI); ; Argument[0]; request-forgery; hq-manual | +| 148 | Sink: org.apache.hc.client5.http.classic.methods; HttpDelete; true; HttpDelete; (String); ; Argument[0]; request-forgery; hq-manual | +| 149 | Sink: org.apache.hc.client5.http.classic.methods; HttpDelete; true; HttpDelete; (URI); ; Argument[0]; request-forgery; hq-manual | +| 150 | Sink: org.apache.hc.client5.http.classic.methods; HttpGet; true; HttpGet; (String); ; Argument[0]; request-forgery; hq-manual | +| 151 | Sink: org.apache.hc.client5.http.classic.methods; HttpGet; true; HttpGet; (URI); ; Argument[0]; request-forgery; hq-manual | +| 152 | Sink: org.apache.hc.client5.http.classic.methods; HttpHead; true; HttpHead; (String); ; Argument[0]; request-forgery; hq-manual | +| 153 | Sink: org.apache.hc.client5.http.classic.methods; HttpHead; true; HttpHead; (URI); ; Argument[0]; request-forgery; hq-manual | +| 154 | Sink: org.apache.hc.client5.http.classic.methods; HttpOptions; true; HttpOptions; (String); ; Argument[0]; request-forgery; hq-manual | +| 155 | Sink: org.apache.hc.client5.http.classic.methods; HttpOptions; true; HttpOptions; (URI); ; Argument[0]; request-forgery; hq-manual | +| 156 | Sink: org.apache.hc.client5.http.classic.methods; HttpPatch; true; HttpPatch; (String); ; Argument[0]; request-forgery; hq-manual | +| 157 | Sink: org.apache.hc.client5.http.classic.methods; HttpPatch; true; HttpPatch; (URI); ; Argument[0]; request-forgery; hq-manual | +| 158 | Sink: org.apache.hc.client5.http.classic.methods; HttpPost; true; HttpPost; (String); ; Argument[0]; request-forgery; hq-manual | +| 159 | Sink: org.apache.hc.client5.http.classic.methods; HttpPost; true; HttpPost; (URI); ; Argument[0]; request-forgery; hq-manual | +| 160 | Sink: org.apache.hc.client5.http.classic.methods; HttpPut; true; HttpPut; (String); ; Argument[0]; request-forgery; hq-manual | +| 161 | Sink: org.apache.hc.client5.http.classic.methods; HttpPut; true; HttpPut; (URI); ; Argument[0]; request-forgery; hq-manual | +| 162 | Sink: org.apache.hc.client5.http.classic.methods; HttpTrace; true; HttpTrace; (String); ; Argument[0]; request-forgery; hq-manual | +| 163 | Sink: org.apache.hc.client5.http.classic.methods; HttpTrace; true; HttpTrace; (URI); ; Argument[0]; request-forgery; hq-manual | +| 164 | Sink: org.apache.hc.client5.http.classic.methods; HttpUriRequestBase; true; HttpUriRequestBase; (String,URI); ; Argument[1]; request-forgery; hq-manual | +| 165 | Sink: org.apache.hc.client5.http.fluent; Request; true; create; (Method,URI); ; Argument[1]; request-forgery; hq-manual | +| 166 | Sink: org.apache.hc.client5.http.fluent; Request; true; create; (String,String); ; Argument[1]; request-forgery; hq-manual | +| 167 | Sink: org.apache.hc.client5.http.fluent; Request; true; create; (String,URI); ; Argument[1]; request-forgery; hq-manual | +| 168 | Sink: org.apache.hc.client5.http.fluent; Request; true; delete; (String); ; Argument[0]; request-forgery; hq-manual | +| 169 | Sink: org.apache.hc.client5.http.fluent; Request; true; delete; (URI); ; Argument[0]; request-forgery; hq-manual | +| 170 | Sink: org.apache.hc.client5.http.fluent; Request; true; get; (String); ; Argument[0]; request-forgery; hq-manual | +| 171 | Sink: org.apache.hc.client5.http.fluent; Request; true; get; (URI); ; Argument[0]; request-forgery; hq-manual | +| 172 | Sink: org.apache.hc.client5.http.fluent; Request; true; head; (String); ; Argument[0]; request-forgery; hq-manual | +| 173 | Sink: org.apache.hc.client5.http.fluent; Request; true; head; (URI); ; Argument[0]; request-forgery; hq-manual | +| 174 | Sink: org.apache.hc.client5.http.fluent; Request; true; options; (String); ; Argument[0]; request-forgery; hq-manual | +| 175 | Sink: org.apache.hc.client5.http.fluent; Request; true; options; (URI); ; Argument[0]; request-forgery; hq-manual | +| 176 | Sink: org.apache.hc.client5.http.fluent; Request; true; patch; (String); ; Argument[0]; request-forgery; hq-manual | +| 177 | Sink: org.apache.hc.client5.http.fluent; Request; true; patch; (URI); ; Argument[0]; request-forgery; hq-manual | +| 178 | Sink: org.apache.hc.client5.http.fluent; Request; true; post; (String); ; Argument[0]; request-forgery; hq-manual | +| 179 | Sink: org.apache.hc.client5.http.fluent; Request; true; post; (URI); ; Argument[0]; request-forgery; hq-manual | +| 180 | Sink: org.apache.hc.client5.http.fluent; Request; true; put; (String); ; Argument[0]; request-forgery; hq-manual | +| 181 | Sink: org.apache.hc.client5.http.fluent; Request; true; put; (URI); ; Argument[0]; request-forgery; hq-manual | +| 182 | Sink: org.apache.hc.client5.http.fluent; Request; true; trace; (String); ; Argument[0]; request-forgery; hq-manual | +| 183 | Sink: org.apache.hc.client5.http.fluent; Request; true; trace; (URI); ; Argument[0]; request-forgery; hq-manual | +| 184 | Sink: org.apache.hc.core5.http.impl.bootstrap; HttpAsyncRequester; true; connect; (HttpHost,Timeout); ; Argument[0]; request-forgery; hq-manual | +| 185 | Sink: org.apache.hc.core5.http.impl.bootstrap; HttpAsyncRequester; true; connect; (HttpHost,Timeout,Object,FutureCallback); ; Argument[0]; request-forgery; hq-manual | +| 186 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; delete; (String); ; Argument[0]; request-forgery; hq-manual | +| 187 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; delete; (URI); ; Argument[0]; request-forgery; hq-manual | +| 188 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; get; (String); ; Argument[0]; request-forgery; hq-manual | +| 189 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; get; (URI); ; Argument[0]; request-forgery; hq-manual | +| 190 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; head; (String); ; Argument[0]; request-forgery; hq-manual | +| 191 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; head; (URI); ; Argument[0]; request-forgery; hq-manual | +| 192 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; options; (String); ; Argument[0]; request-forgery; hq-manual | +| 193 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; options; (URI); ; Argument[0]; request-forgery; hq-manual | +| 194 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; patch; (String); ; Argument[0]; request-forgery; hq-manual | +| 195 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; patch; (URI); ; Argument[0]; request-forgery; hq-manual | +| 196 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; post; (String); ; Argument[0]; request-forgery; hq-manual | +| 197 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; post; (URI); ; Argument[0]; request-forgery; hq-manual | +| 198 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; put; (String); ; Argument[0]; request-forgery; hq-manual | +| 199 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; put; (URI); ; Argument[0]; request-forgery; hq-manual | +| 200 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; trace; (String); ; Argument[0]; request-forgery; hq-manual | +| 201 | Sink: org.apache.hc.core5.http.io.support; ClassicRequestBuilder; true; trace; (URI); ; Argument[0]; request-forgery; hq-manual | +| 202 | Sink: org.apache.hc.core5.http.message; BasicClassicHttpRequest; true; BasicClassicHttpRequest; (Method,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | +| 203 | Sink: org.apache.hc.core5.http.message; BasicClassicHttpRequest; true; BasicClassicHttpRequest; (Method,URI); ; Argument[1]; request-forgery; hq-manual | +| 204 | Sink: org.apache.hc.core5.http.message; BasicClassicHttpRequest; true; BasicClassicHttpRequest; (String,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | +| 205 | Sink: org.apache.hc.core5.http.message; BasicClassicHttpRequest; true; BasicClassicHttpRequest; (String,URI); ; Argument[1]; request-forgery; hq-manual | +| 206 | Sink: org.apache.hc.core5.http.message; BasicHttpRequest; true; BasicHttpRequest; (Method,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | +| 207 | Sink: org.apache.hc.core5.http.message; BasicHttpRequest; true; BasicHttpRequest; (Method,URI); ; Argument[1]; request-forgery; hq-manual | +| 208 | Sink: org.apache.hc.core5.http.message; BasicHttpRequest; true; BasicHttpRequest; (String,HttpHost,String); ; Argument[1]; request-forgery; hq-manual | +| 209 | Sink: org.apache.hc.core5.http.message; BasicHttpRequest; true; BasicHttpRequest; (String,URI); ; Argument[1]; request-forgery; hq-manual | +| 210 | Sink: org.apache.hc.core5.http.support; AbstractRequestBuilder; true; setHttpHost; (HttpHost); ; Argument[0]; request-forgery; hq-manual | +| 211 | Sink: org.apache.hc.core5.http.support; AbstractRequestBuilder; true; setUri; (String); ; Argument[0]; request-forgery; hq-manual | +| 212 | Sink: org.apache.hc.core5.http.support; AbstractRequestBuilder; true; setUri; (URI); ; Argument[0]; request-forgery; hq-manual | +| 213 | Sink: org.apache.hc.core5.http; HttpRequest; true; setUri; (URI); ; Argument[0]; request-forgery; hq-manual | +| 214 | Sink: org.apache.hc.core5.http; HttpRequestFactory; true; newHttpRequest; (String,String); ; Argument[1]; request-forgery; hq-manual | +| 215 | Sink: org.apache.hc.core5.http; HttpRequestFactory; true; newHttpRequest; (String,URI); ; Argument[1]; request-forgery; hq-manual | +| 216 | Sink: org.apache.http.client.methods; HttpDelete; false; HttpDelete; ; ; Argument[0]; request-forgery; manual | +| 217 | Sink: org.apache.http.client.methods; HttpGet; false; HttpGet; ; ; Argument[0]; request-forgery; manual | +| 218 | Sink: org.apache.http.client.methods; HttpHead; false; HttpHead; ; ; Argument[0]; request-forgery; manual | +| 219 | Sink: org.apache.http.client.methods; HttpOptions; false; HttpOptions; ; ; Argument[0]; request-forgery; manual | +| 220 | Sink: org.apache.http.client.methods; HttpPatch; false; HttpPatch; ; ; Argument[0]; request-forgery; manual | +| 221 | Sink: org.apache.http.client.methods; HttpPost; false; HttpPost; ; ; Argument[0]; request-forgery; manual | +| 222 | Sink: org.apache.http.client.methods; HttpPut; false; HttpPut; ; ; Argument[0]; request-forgery; manual | +| 223 | Sink: org.apache.http.client.methods; HttpRequestBase; true; setURI; ; ; Argument[0]; request-forgery; manual | +| 224 | Sink: org.apache.http.client.methods; HttpTrace; false; HttpTrace; ; ; Argument[0]; request-forgery; manual | +| 225 | Sink: org.apache.http.client.methods; RequestBuilder; false; delete; ; ; Argument[0]; request-forgery; manual | +| 226 | Sink: org.apache.http.client.methods; RequestBuilder; false; get; ; ; Argument[0]; request-forgery; manual | +| 227 | Sink: org.apache.http.client.methods; RequestBuilder; false; head; ; ; Argument[0]; request-forgery; manual | +| 228 | Sink: org.apache.http.client.methods; RequestBuilder; false; options; ; ; Argument[0]; request-forgery; manual | +| 229 | Sink: org.apache.http.client.methods; RequestBuilder; false; patch; ; ; Argument[0]; request-forgery; manual | +| 230 | Sink: org.apache.http.client.methods; RequestBuilder; false; post; ; ; Argument[0]; request-forgery; manual | +| 231 | Sink: org.apache.http.client.methods; RequestBuilder; false; put; ; ; Argument[0]; request-forgery; manual | +| 232 | Sink: org.apache.http.client.methods; RequestBuilder; false; setUri; ; ; Argument[0]; request-forgery; manual | +| 233 | Sink: org.apache.http.client.methods; RequestBuilder; false; trace; ; ; Argument[0]; request-forgery; manual | +| 234 | Sink: org.apache.http.message; BasicHttpEntityEnclosingRequest; false; BasicHttpEntityEnclosingRequest; (RequestLine); ; Argument[0]; request-forgery; manual | +| 235 | Sink: org.apache.http.message; BasicHttpEntityEnclosingRequest; false; BasicHttpEntityEnclosingRequest; (String,String); ; Argument[1]; request-forgery; manual | +| 236 | Sink: org.apache.http.message; BasicHttpEntityEnclosingRequest; false; BasicHttpEntityEnclosingRequest; (String,String,ProtocolVersion); ; Argument[1]; request-forgery; manual | +| 237 | Sink: org.apache.http.message; BasicHttpRequest; false; BasicHttpRequest; (RequestLine); ; Argument[0]; request-forgery; manual | +| 238 | Sink: org.apache.http.message; BasicHttpRequest; false; BasicHttpRequest; (String,String); ; Argument[1]; request-forgery; manual | +| 239 | Sink: org.apache.http.message; BasicHttpRequest; false; BasicHttpRequest; (String,String,ProtocolVersion); ; Argument[1]; request-forgery; manual | +| 240 | Sink: org.codehaus.cargo.container.installer; ZipURLInstaller; true; ZipURLInstaller; (URL,String,String); ; Argument[0]; request-forgery; ai-manual | +| 241 | Sink: org.jdbi.v3.core; Jdbi; false; create; (String); ; Argument[0]; request-forgery; manual | +| 242 | Sink: org.jdbi.v3.core; Jdbi; false; create; (String,Properties); ; Argument[0]; request-forgery; manual | +| 243 | Sink: org.jdbi.v3.core; Jdbi; false; create; (String,String,String); ; Argument[0]; request-forgery; manual | +| 244 | Sink: org.jdbi.v3.core; Jdbi; false; open; (String); ; Argument[0]; request-forgery; manual | +| 245 | Sink: org.jdbi.v3.core; Jdbi; false; open; (String,Properties); ; Argument[0]; request-forgery; manual | +| 246 | Sink: org.jdbi.v3.core; Jdbi; false; open; (String,String,String); ; Argument[0]; request-forgery; manual | +| 247 | Sink: org.kohsuke.stapler; HttpResponses; true; staticResource; (URL); ; Argument[0]; request-forgery; ai-manual | +| 248 | Sink: org.springframework.boot.jdbc; DataSourceBuilder; false; url; (String); ; Argument[0]; request-forgery; manual | +| 249 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (HttpMethod,URI); ; Argument[1]; request-forgery; manual | +| 250 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (MultiValueMap,HttpMethod,URI); ; Argument[2]; request-forgery; manual | +| 251 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (Object,HttpMethod,URI); ; Argument[2]; request-forgery; manual | +| 252 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (Object,HttpMethod,URI,Type); ; Argument[2]; request-forgery; manual | +| 253 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (Object,MultiValueMap,HttpMethod,URI); ; Argument[3]; request-forgery; manual | +| 254 | Sink: org.springframework.http; RequestEntity; false; RequestEntity; (Object,MultiValueMap,HttpMethod,URI,Type); ; Argument[3]; request-forgery; manual | +| 255 | Sink: org.springframework.http; RequestEntity; false; delete; ; ; Argument[0]; request-forgery; manual | +| 256 | Sink: org.springframework.http; RequestEntity; false; get; ; ; Argument[0]; request-forgery; manual | +| 257 | Sink: org.springframework.http; RequestEntity; false; head; ; ; Argument[0]; request-forgery; manual | +| 258 | Sink: org.springframework.http; RequestEntity; false; method; ; ; Argument[1]; request-forgery; manual | +| 259 | Sink: org.springframework.http; RequestEntity; false; options; ; ; Argument[0]; request-forgery; manual | +| 260 | Sink: org.springframework.http; RequestEntity; false; patch; ; ; Argument[0]; request-forgery; manual | +| 261 | Sink: org.springframework.http; RequestEntity; false; post; ; ; Argument[0]; request-forgery; manual | +| 262 | Sink: org.springframework.http; RequestEntity; false; put; ; ; Argument[0]; request-forgery; manual | +| 263 | Sink: org.springframework.jdbc.datasource; AbstractDriverBasedDataSource; false; setUrl; (String); ; Argument[0]; request-forgery; manual | +| 264 | Sink: org.springframework.jdbc.datasource; DriverManagerDataSource; false; DriverManagerDataSource; (String); ; Argument[0]; request-forgery; manual | +| 265 | Sink: org.springframework.jdbc.datasource; DriverManagerDataSource; false; DriverManagerDataSource; (String,Properties); ; Argument[0]; request-forgery; manual | +| 266 | Sink: org.springframework.jdbc.datasource; DriverManagerDataSource; false; DriverManagerDataSource; (String,String,String); ; Argument[0]; request-forgery; manual | +| 267 | Sink: org.springframework.web.client; RestTemplate; false; delete; ; ; Argument[0]; request-forgery; manual | +| 268 | Sink: org.springframework.web.client; RestTemplate; false; exchange; ; ; Argument[0]; request-forgery; manual | +| 269 | Sink: org.springframework.web.client; RestTemplate; false; execute; ; ; Argument[0]; request-forgery; manual | +| 270 | Sink: org.springframework.web.client; RestTemplate; false; getForEntity; ; ; Argument[0]; request-forgery; manual | +| 271 | Sink: org.springframework.web.client; RestTemplate; false; getForObject; ; ; Argument[0]; request-forgery; manual | +| 272 | Sink: org.springframework.web.client; RestTemplate; false; headForHeaders; ; ; Argument[0]; request-forgery; manual | +| 273 | Sink: org.springframework.web.client; RestTemplate; false; optionsForAllow; ; ; Argument[0]; request-forgery; manual | +| 274 | Sink: org.springframework.web.client; RestTemplate; false; patchForObject; ; ; Argument[0]; request-forgery; manual | +| 275 | Sink: org.springframework.web.client; RestTemplate; false; postForEntity; ; ; Argument[0]; request-forgery; manual | +| 276 | Sink: org.springframework.web.client; RestTemplate; false; postForLocation; ; ; Argument[0]; request-forgery; manual | +| 277 | Sink: org.springframework.web.client; RestTemplate; false; postForObject; ; ; Argument[0]; request-forgery; manual | +| 278 | Sink: org.springframework.web.client; RestTemplate; false; put; ; ; Argument[0]; request-forgery; manual | +| 279 | Sink: org.springframework.web.reactive.function.client; WebClient$Builder; false; baseUrl; ; ; Argument[0]; request-forgery; manual | +| 280 | Sink: org.springframework.web.reactive.function.client; WebClient; false; create; ; ; Argument[0]; request-forgery; manual | +| 281 | Sink: play.libs.ws; StandaloneWSClient; true; url; ; ; Argument[0]; request-forgery; manual | +| 282 | Sink: play.libs.ws; WSClient; true; url; ; ; Argument[0]; request-forgery; manual | +| 283 | Source: javax.servlet; ServletRequest; false; getParameter; (String); ; ReturnValue; remote; manual | +| 284 | Summary: io.micronaut.http.uri; UriBuilder; true; build; (); ; Argument[this]; ReturnValue; taint; manual | +| 285 | Summary: io.micronaut.http.uri; UriBuilder; true; host; (String); ; Argument[0]; Argument[this]; taint; manual | +| 286 | Summary: io.micronaut.http.uri; UriBuilder; true; host; (String); ; Argument[this]; ReturnValue; value; manual | +| 287 | Summary: io.micronaut.http; HttpRequest; true; GET; (String); ; Argument[0]; ReturnValue; taint; manual | +| 288 | Summary: java.lang; AbstractStringBuilder; true; append; ; ; Argument[0]; Argument[this]; taint; manual | +| 289 | Summary: java.lang; AbstractStringBuilder; true; append; ; ; Argument[this]; ReturnValue; value; manual | +| 290 | Summary: java.lang; CharSequence; true; toString; ; ; Argument[this]; ReturnValue; taint; manual | +| 291 | Summary: java.lang; String; false; format; (String,Object[]); ; Argument[1].ArrayElement; ReturnValue; taint; manual | +| 292 | Summary: java.lang; StringBuilder; true; StringBuilder; ; ; Argument[0]; Argument[this]; taint; manual | +| 293 | Summary: java.net.http; HttpRequest$Builder; true; build; (); ; Argument[this]; ReturnValue; taint; df-generated | +| 294 | Summary: java.net.http; HttpRequest; true; newBuilder; (URI); ; Argument[0]; ReturnValue; taint; df-generated | +| 295 | Summary: java.net; URI; false; URI; (String); ; Argument[0]; Argument[this]; taint; manual | +| 296 | Summary: java.net; URI; false; toString; ; ; Argument[this]; ReturnValue; taint; manual | +| 297 | Summary: java.net; URI; false; toURL; ; ; Argument[this]; ReturnValue; taint; manual | +| 298 | Summary: java.net; URL; false; URL; (String); ; Argument[0]; Argument[this]; taint; manual | +| 299 | Summary: java.util; List; false; of; (Object); ; Argument[0]; ReturnValue.Element; value; manual | +| 300 | Summary: java.util; List; true; get; (int); ; Argument[this].Element; ReturnValue; value; manual | +| 301 | Summary: java.util; Map; false; of; ; ; Argument[1]; ReturnValue.MapValue; value; manual | +| 302 | Summary: java.util; Map; false; of; ; ; Argument[3]; ReturnValue.MapValue; value; manual | +| 303 | Summary: java.util; Properties; true; setProperty; (String,String); ; Argument[1]; Argument[this].MapValue; value; manual | +| 304 | Summary: org.apache.hc.core5.http; HttpHost; true; HttpHost; (String); ; Argument[0]; Argument[this]; taint; hq-manual | +| 305 | Summary: org.apache.http.message; BasicRequestLine; false; BasicRequestLine; ; ; Argument[1]; Argument[this]; taint; manual | nodes | ApacheHttpSSRF.java:27:27:27:53 | getParameter(...) : String | semmle.label | getParameter(...) : String | | ApacheHttpSSRF.java:28:23:28:35 | new URI(...) : URI | semmle.label | new URI(...) : URI | @@ -1743,18 +1756,26 @@ nodes | JdbcUrlSSRF.java:86:19:86:25 | jdbcUrl | semmle.label | jdbcUrl | | JdbcUrlSSRF.java:87:19:87:25 | jdbcUrl | semmle.label | jdbcUrl | | JdbcUrlSSRF.java:88:19:88:25 | jdbcUrl | semmle.label | jdbcUrl | -| MicronautSSRF.java:14:32:14:53 | url : String | semmle.label | url : String | -| MicronautSSRF.java:15:45:15:47 | url | semmle.label | url | -| MicronautSSRF.java:19:42:19:63 | url : String | semmle.label | url : String | -| MicronautSSRF.java:20:45:20:47 | url | semmle.label | url | -| MicronautSSRF.java:24:37:24:58 | url : String | semmle.label | url : String | -| MicronautSSRF.java:25:45:25:47 | url | semmle.label | url | -| MicronautSSRF.java:29:34:29:56 | host : String | semmle.label | host : String | -| MicronautSSRF.java:30:19:30:64 | host(...) : UriBuilder | semmle.label | host(...) : UriBuilder | -| MicronautSSRF.java:30:19:30:72 | build(...) : URI | semmle.label | build(...) : URI | -| MicronautSSRF.java:30:60:30:63 | host : String | semmle.label | host : String | -| MicronautSSRF.java:31:45:31:47 | uri : URI | semmle.label | uri : URI | -| MicronautSSRF.java:31:45:31:58 | toString(...) | semmle.label | toString(...) | +| MicronautSSRF.java:15:32:15:53 | url : String | semmle.label | url : String | +| MicronautSSRF.java:16:45:16:47 | url | semmle.label | url | +| MicronautSSRF.java:20:42:20:63 | url : String | semmle.label | url : String | +| MicronautSSRF.java:21:45:21:47 | url | semmle.label | url | +| MicronautSSRF.java:25:37:25:58 | url : String | semmle.label | url : String | +| MicronautSSRF.java:26:45:26:47 | url | semmle.label | url | +| MicronautSSRF.java:30:34:30:56 | host : String | semmle.label | host : String | +| MicronautSSRF.java:31:19:31:64 | host(...) : UriBuilder | semmle.label | host(...) : UriBuilder | +| MicronautSSRF.java:31:19:31:72 | build(...) : URI | semmle.label | build(...) : URI | +| MicronautSSRF.java:31:60:31:63 | host : String | semmle.label | host : String | +| MicronautSSRF.java:32:45:32:47 | uri : URI | semmle.label | uri : URI | +| MicronautSSRF.java:32:45:32:58 | toString(...) | semmle.label | toString(...) | +| MicronautSSRF.java:36:39:36:60 | url : String | semmle.label | url : String | +| MicronautSSRF.java:37:45:37:64 | GET(...) | semmle.label | GET(...) | +| MicronautSSRF.java:37:61:37:63 | url : String | semmle.label | url : String | +| MicronautSSRF.java:41:35:41:56 | url : String | semmle.label | url : String | +| MicronautSSRF.java:42:32:42:34 | url | semmle.label | url | +| MicronautSSRF.java:46:42:46:63 | url : String | semmle.label | url : String | +| MicronautSSRF.java:47:32:47:51 | GET(...) | semmle.label | GET(...) | +| MicronautSSRF.java:47:48:47:50 | url : String | semmle.label | url : String | | ReactiveWebClientSSRF.java:15:26:15:52 | getParameter(...) : String | semmle.label | getParameter(...) : String | | ReactiveWebClientSSRF.java:16:52:16:54 | url | semmle.label | url | | ReactiveWebClientSSRF.java:32:26:32:52 | getParameter(...) : String | semmle.label | getParameter(...) : String | diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/core/convert/value/ConvertibleMultiValues.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/core/convert/value/ConvertibleMultiValues.java new file mode 100644 index 000000000000..2635af3d75cb --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/core/convert/value/ConvertibleMultiValues.java @@ -0,0 +1,10 @@ +package io.micronaut.core.convert.value; + +import java.util.List; +import java.util.Optional; + +public interface ConvertibleMultiValues extends ConvertibleValues> { + V get(CharSequence name); + List getAll(CharSequence name); + Optional getFirst(CharSequence name); +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/core/convert/value/ConvertibleValues.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/core/convert/value/ConvertibleValues.java new file mode 100644 index 000000000000..bb32d5493578 --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/core/convert/value/ConvertibleValues.java @@ -0,0 +1,15 @@ +package io.micronaut.core.convert.value; + +import java.util.Collection; +import java.util.Iterator; +import java.util.Map; +import java.util.Properties; + +public interface ConvertibleValues extends Iterable> { + Map asMap(); + Properties asProperties(); + V getValue(CharSequence name); + Iterator> iterator(); + Map subMap(String prefix, Class valueType); + Collection values(); +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/core/type/Argument.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/core/type/Argument.java new file mode 100644 index 000000000000..bc9c5da866c6 --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/core/type/Argument.java @@ -0,0 +1,4 @@ +package io.micronaut.core.type; + +public class Argument { +} diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpHeaders.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpHeaders.java index ae68073fcdd5..440e1928b813 100644 --- a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpHeaders.java +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpHeaders.java @@ -1,11 +1,6 @@ package io.micronaut.http; -import java.util.List; -import java.util.Optional; +import io.micronaut.core.convert.value.ConvertibleMultiValues; -public interface HttpHeaders { - String get(CharSequence name); - List getAll(CharSequence name); - Optional getFirst(CharSequence name); - java.util.Collection> values(); +public interface HttpHeaders extends ConvertibleMultiValues { } diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpParameters.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpParameters.java index 061391dbc3eb..2d0253d1304e 100644 --- a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpParameters.java +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpParameters.java @@ -1,10 +1,6 @@ package io.micronaut.http; -import java.util.List; -import java.util.Optional; +import io.micronaut.core.convert.value.ConvertibleMultiValues; -public interface HttpParameters { - String get(CharSequence name); - List getAll(CharSequence name); - Optional getFirst(CharSequence name); +public interface HttpParameters extends ConvertibleMultiValues { } diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpRequest.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpRequest.java index 5b51dba87f99..15429d6d4be4 100644 --- a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpRequest.java +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpRequest.java @@ -17,10 +17,19 @@ public interface HttpRequest { String getMethodName(); static HttpRequest GET(String uri) { return null; } + static HttpRequest GET(URI uri) { return null; } static HttpRequest POST(String uri, T body) { return null; } + static HttpRequest POST(URI uri, T body) { return null; } static HttpRequest PUT(String uri, T body) { return null; } + static HttpRequest PUT(URI uri, T body) { return null; } static HttpRequest DELETE(String uri) { return null; } + static HttpRequest DELETE(String uri, T body) { return null; } + static HttpRequest DELETE(URI uri) { return null; } + static HttpRequest DELETE(URI uri, T body) { return null; } static HttpRequest PATCH(String uri, T body) { return null; } + static HttpRequest PATCH(URI uri, T body) { return null; } static HttpRequest HEAD(String uri) { return null; } + static HttpRequest HEAD(URI uri) { return null; } static HttpRequest OPTIONS(String uri) { return null; } + static HttpRequest OPTIONS(URI uri) { return null; } } diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpResponse.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpResponse.java index 7469ea3d5661..c56f8f2ab3fe 100644 --- a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpResponse.java +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/HttpResponse.java @@ -12,6 +12,9 @@ public interface HttpResponse { static MutableHttpResponse ok() { return null; } static MutableHttpResponse ok(T body) { return null; } static MutableHttpResponse redirect(URI location) { return null; } + static MutableHttpResponse permanentRedirect(URI location) { return null; } + static MutableHttpResponse seeOther(URI location) { return null; } + static MutableHttpResponse temporaryRedirect(URI location) { return null; } static MutableHttpResponse notFound() { return null; } static MutableHttpResponse badRequest() { return null; } static MutableHttpResponse serverError() { return null; } diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/client/BlockingHttpClient.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/client/BlockingHttpClient.java index 379ef4049d12..e22737a0a703 100644 --- a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/client/BlockingHttpClient.java +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/client/BlockingHttpClient.java @@ -2,12 +2,21 @@ import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; +import io.micronaut.core.type.Argument; public interface BlockingHttpClient { HttpResponse exchange(HttpRequest request, Class bodyType); + HttpResponse exchange(HttpRequest request, Argument bodyType); + HttpResponse exchange(HttpRequest request, Argument bodyType, Argument errorType); HttpResponse exchange(HttpRequest request); + String retrieve(HttpRequest request); + O retrieve(HttpRequest request, Class bodyType); + O retrieve(HttpRequest request, Argument bodyType); + O retrieve(HttpRequest request, Argument bodyType, Argument errorType); String retrieve(String uri); O retrieve(String uri, Class bodyType); + O retrieve(String uri, Class bodyType, Class errorType); String exchange(String uri); HttpResponse exchange(String uri, Class bodyType); + HttpResponse exchange(String uri, Class bodyType, Class errorType); } diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/client/HttpClient.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/client/HttpClient.java index de5278de08ee..f0b53483926b 100644 --- a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/client/HttpClient.java +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/client/HttpClient.java @@ -1,5 +1,19 @@ package io.micronaut.http.client; +import io.micronaut.http.HttpRequest; +import io.micronaut.core.type.Argument; + public interface HttpClient { BlockingHttpClient toBlocking(); + Object exchange(HttpRequest request); + Object exchange(HttpRequest request, Class bodyType); + Object exchange(HttpRequest request, Argument bodyType); + Object exchange(HttpRequest request, Argument bodyType, Argument errorType); + Object exchange(String uri); + Object exchange(String uri, Class bodyType); + Object retrieve(HttpRequest request); + Object retrieve(HttpRequest request, Class bodyType); + Object retrieve(HttpRequest request, Argument bodyType); + Object retrieve(HttpRequest request, Argument bodyType, Argument errorType); + Object retrieve(String uri); } diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/uri/UriBuilder.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/uri/UriBuilder.java index 13eeeeb40ed4..028bde03179c 100644 --- a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/uri/UriBuilder.java +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/uri/UriBuilder.java @@ -1,6 +1,7 @@ package io.micronaut.http.uri; import java.net.URI; +import java.util.Map; public interface UriBuilder { static UriBuilder of(CharSequence uri) { return null; } @@ -8,6 +9,11 @@ public interface UriBuilder { UriBuilder host(String host); UriBuilder path(String path); UriBuilder queryParam(String name, Object... values); + UriBuilder replacePath(String path); + UriBuilder replaceQueryParam(String name, Object... values); + UriBuilder scheme(String scheme); + UriBuilder userInfo(String userInfo); UriBuilder fragment(String fragment); URI build(); + URI expand(Map values); } diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/websocket/CloseReason.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/websocket/CloseReason.java new file mode 100644 index 000000000000..47be261e3cfc --- /dev/null +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/websocket/CloseReason.java @@ -0,0 +1,4 @@ +package io.micronaut.websocket; + +public class CloseReason { +} From 26b37ad6bcfd094d9bc8edbc2cd9c1349c3d88d7 Mon Sep 17 00:00:00 2001 From: Nicolas Will Date: Wed, 29 Jul 2026 02:57:23 +0200 Subject: [PATCH 0055/2098] Correct Micronaut cookie and map coverage --- .../micronaut/MicronautControllerTest.java | 5 +++ .../micronaut/MicronautHttpRequestTest.java | 6 ++++ .../tests/MicronautResponseSplitting.java | 20 +++++++++++ .../semmle/tests/ResponseSplitting.expected | 33 ++++++++++++------- .../io/micronaut/http/cookie/Cookies.java | 4 +-- 5 files changed, 54 insertions(+), 14 deletions(-) diff --git a/java/ql/test/library-tests/frameworks/micronaut/MicronautControllerTest.java b/java/ql/test/library-tests/frameworks/micronaut/MicronautControllerTest.java index 4bc38d949b12..ee4d30a0f570 100644 --- a/java/ql/test/library-tests/frameworks/micronaut/MicronautControllerTest.java +++ b/java/ql/test/library-tests/frameworks/micronaut/MicronautControllerTest.java @@ -1,6 +1,7 @@ import io.micronaut.http.annotation.*; import io.micronaut.http.*; import io.micronaut.http.cookie.Cookies; +import io.micronaut.http.cookie.Cookie; import java.io.InputStream; import java.io.Reader; @@ -72,6 +73,10 @@ void testHttpParameters(HttpParameters parameters) { @Get("/cookies") void testCookies(Cookies cookies) { sink(cookies); // $hasTaintFlow + sink(cookies.getValue("session")); // $hasTaintFlow + for (java.util.Map.Entry entry : cookies) { + sink(entry.getValue()); // $hasTaintFlow + } } @Post("/stream") diff --git a/java/ql/test/library-tests/frameworks/micronaut/MicronautHttpRequestTest.java b/java/ql/test/library-tests/frameworks/micronaut/MicronautHttpRequestTest.java index b3340b6c6cb6..42d94165f6ef 100644 --- a/java/ql/test/library-tests/frameworks/micronaut/MicronautHttpRequestTest.java +++ b/java/ql/test/library-tests/frameworks/micronaut/MicronautHttpRequestTest.java @@ -47,6 +47,12 @@ void testCookies(HttpRequest request) { sink(cookie.getPath()); // $hasTaintFlow sink(request.getCookies().getAll()); // $hasTaintFlow sink(request.getCookies().findCookie("session")); // $hasTaintFlow + sink(request.getCookies().getValue("session")); // $hasTaintFlow + sink(request.getCookies().values().iterator().next()); // $hasTaintFlow + sink(request.getCookies().asMap().get("session")); // $hasTaintFlow + for (Map.Entry entry : request.getCookies()) { + sink(entry.getValue()); // $hasTaintFlow + } } @Get("/uri") diff --git a/java/ql/test/query-tests/security/CWE-113/semmle/tests/MicronautResponseSplitting.java b/java/ql/test/query-tests/security/CWE-113/semmle/tests/MicronautResponseSplitting.java index 4ba35f86959a..f95566722f88 100644 --- a/java/ql/test/query-tests/security/CWE-113/semmle/tests/MicronautResponseSplitting.java +++ b/java/ql/test/query-tests/security/CWE-113/semmle/tests/MicronautResponseSplitting.java @@ -4,6 +4,8 @@ import io.micronaut.http.HttpResponse; import io.micronaut.http.MutableHttpResponse; import java.util.Collections; +import java.util.HashMap; +import java.util.Map; @Controller("/headers") public class MicronautResponseSplitting { @@ -26,4 +28,22 @@ public MutableHttpResponse badMap(@QueryValue String headerValue) { // BAD: user-controlled header value return HttpResponse.ok().headers(Collections.singletonMap("X-Custom", headerValue)); } + + @Get("/bad-map-mutation") + public MutableHttpResponse badMapMutation(@QueryValue String headerValue) { + Map headers = new HashMap<>(); + headers.put("X-Custom", headerValue); + return HttpResponse.ok().headers(headers); + } + + @Get("/good-map") + public MutableHttpResponse goodMap() { + return HttpResponse.ok().headers(Collections.singletonMap("X-Custom", "safe")); + } + + @Get("/good-map-sanitized") + public MutableHttpResponse goodMapSanitized(@QueryValue String headerValue) { + String sanitized = headerValue.replace('\n', ' ').replace('\r', ' '); + return HttpResponse.ok().headers(Collections.singletonMap("X-Custom", sanitized)); + } } diff --git a/java/ql/test/query-tests/security/CWE-113/semmle/tests/ResponseSplitting.expected b/java/ql/test/query-tests/security/CWE-113/semmle/tests/ResponseSplitting.expected index 5be152141515..3aaffd3ece3f 100644 --- a/java/ql/test/query-tests/security/CWE-113/semmle/tests/ResponseSplitting.expected +++ b/java/ql/test/query-tests/security/CWE-113/semmle/tests/ResponseSplitting.expected @@ -1,16 +1,20 @@ #select -| MicronautResponseSplitting.java:14:53:14:63 | headerValue | MicronautResponseSplitting.java:12:39:12:68 | headerValue : String | MicronautResponseSplitting.java:14:53:14:63 | headerValue | This header depends on a $@, which may cause a response-splitting vulnerability. | MicronautResponseSplitting.java:12:39:12:68 | headerValue | user-provided value | -| MicronautResponseSplitting.java:27:42:27:90 | singletonMap(...) | MicronautResponseSplitting.java:25:42:25:71 | headerValue : String | MicronautResponseSplitting.java:27:42:27:90 | singletonMap(...) | This header depends on a $@, which may cause a response-splitting vulnerability. | MicronautResponseSplitting.java:25:42:25:71 | headerValue | user-provided value | +| MicronautResponseSplitting.java:16:53:16:63 | headerValue | MicronautResponseSplitting.java:14:39:14:68 | headerValue : String | MicronautResponseSplitting.java:16:53:16:63 | headerValue | This header depends on a $@, which may cause a response-splitting vulnerability. | MicronautResponseSplitting.java:14:39:14:68 | headerValue | user-provided value | +| MicronautResponseSplitting.java:29:42:29:90 | singletonMap(...) | MicronautResponseSplitting.java:27:42:27:71 | headerValue : String | MicronautResponseSplitting.java:29:42:29:90 | singletonMap(...) | This header depends on a $@, which may cause a response-splitting vulnerability. | MicronautResponseSplitting.java:27:42:27:71 | headerValue | user-provided value | +| MicronautResponseSplitting.java:36:42:36:48 | headers | MicronautResponseSplitting.java:33:50:33:79 | headerValue : String | MicronautResponseSplitting.java:36:42:36:48 | headers | This header depends on a $@, which may cause a response-splitting vulnerability. | MicronautResponseSplitting.java:33:50:33:79 | headerValue | user-provided value | | ResponseSplitting.java:23:23:23:28 | cookie | ResponseSplitting.java:22:39:22:66 | getParameter(...) : String | ResponseSplitting.java:23:23:23:28 | cookie | This header depends on a $@, which may cause a response-splitting vulnerability. | ResponseSplitting.java:22:39:22:66 | getParameter(...) | user-provided value | | ResponseSplitting.java:28:38:28:72 | getParameter(...) | ResponseSplitting.java:28:38:28:72 | getParameter(...) | ResponseSplitting.java:28:38:28:72 | getParameter(...) | This header depends on a $@, which may cause a response-splitting vulnerability. | ResponseSplitting.java:28:38:28:72 | getParameter(...) | user-provided value | | ResponseSplitting.java:29:38:29:72 | getParameter(...) | ResponseSplitting.java:29:38:29:72 | getParameter(...) | ResponseSplitting.java:29:38:29:72 | getParameter(...) | This header depends on a $@, which may cause a response-splitting vulnerability. | ResponseSplitting.java:29:38:29:72 | getParameter(...) | user-provided value | | ResponseSplitting.java:59:27:59:57 | replaceFirst(...) | ResponseSplitting.java:53:14:53:48 | getParameter(...) : String | ResponseSplitting.java:59:27:59:57 | replaceFirst(...) | This header depends on a $@, which may cause a response-splitting vulnerability. | ResponseSplitting.java:53:14:53:48 | getParameter(...) | user-provided value | edges -| MicronautResponseSplitting.java:12:39:12:68 | headerValue : String | MicronautResponseSplitting.java:14:53:14:63 | headerValue | provenance | Sink:MaD:1 | -| MicronautResponseSplitting.java:25:42:25:71 | headerValue : String | MicronautResponseSplitting.java:27:79:27:89 | headerValue : String | provenance | | -| MicronautResponseSplitting.java:27:79:27:89 | headerValue : String | MicronautResponseSplitting.java:27:42:27:90 | singletonMap(...) | provenance | MaD:7 Sink:MaD:2 | +| MicronautResponseSplitting.java:14:39:14:68 | headerValue : String | MicronautResponseSplitting.java:16:53:16:63 | headerValue | provenance | Sink:MaD:1 | +| MicronautResponseSplitting.java:27:42:27:71 | headerValue : String | MicronautResponseSplitting.java:29:79:29:89 | headerValue : String | provenance | | +| MicronautResponseSplitting.java:29:79:29:89 | headerValue : String | MicronautResponseSplitting.java:29:42:29:90 | singletonMap(...) | provenance | MaD:7 Sink:MaD:2 | +| MicronautResponseSplitting.java:33:50:33:79 | headerValue : String | MicronautResponseSplitting.java:35:33:35:43 | headerValue : String | provenance | | +| MicronautResponseSplitting.java:35:9:35:15 | headers [post update] : HashMap [] : String | MicronautResponseSplitting.java:36:42:36:48 | headers | provenance | Sink:MaD:2 | +| MicronautResponseSplitting.java:35:33:35:43 | headerValue : String | MicronautResponseSplitting.java:35:9:35:15 | headers [post update] : HashMap [] : String | provenance | MaD:8 | | ResponseSplitting.java:22:20:22:67 | new Cookie(...) : Cookie | ResponseSplitting.java:23:23:23:28 | cookie | provenance | Sink:MaD:3 | -| ResponseSplitting.java:22:39:22:66 | getParameter(...) : String | ResponseSplitting.java:22:20:22:67 | new Cookie(...) : Cookie | provenance | Src:MaD:5 MaD:8 | +| ResponseSplitting.java:22:39:22:66 | getParameter(...) : String | ResponseSplitting.java:22:20:22:67 | new Cookie(...) : Cookie | provenance | Src:MaD:5 MaD:9 | | ResponseSplitting.java:53:14:53:48 | getParameter(...) : String | ResponseSplitting.java:59:27:59:27 | t : String | provenance | Src:MaD:5 | | ResponseSplitting.java:59:27:59:27 | t : String | ResponseSplitting.java:59:27:59:57 | replaceFirst(...) | provenance | MaD:6 Sink:MaD:4 | models @@ -21,13 +25,18 @@ models | 5 | Source: javax.servlet; ServletRequest; false; getParameter; (String); ; ReturnValue; remote; manual | | 6 | Summary: java.lang; String; false; replaceFirst; ; ; Argument[this]; ReturnValue; taint; manual | | 7 | Summary: java.util; Collections; false; singletonMap; (Object,Object); ; Argument[1]; ReturnValue.MapValue; value; manual | -| 8 | Summary: javax.servlet.http; Cookie; false; Cookie; ; ; Argument[1]; Argument[this]; taint; manual | +| 8 | Summary: java.util; Map; true; put; (Object,Object); ; Argument[1]; Argument[this].MapValue; value; manual | +| 9 | Summary: javax.servlet.http; Cookie; false; Cookie; ; ; Argument[1]; Argument[this]; taint; manual | nodes -| MicronautResponseSplitting.java:12:39:12:68 | headerValue : String | semmle.label | headerValue : String | -| MicronautResponseSplitting.java:14:53:14:63 | headerValue | semmle.label | headerValue | -| MicronautResponseSplitting.java:25:42:25:71 | headerValue : String | semmle.label | headerValue : String | -| MicronautResponseSplitting.java:27:42:27:90 | singletonMap(...) | semmle.label | singletonMap(...) | -| MicronautResponseSplitting.java:27:79:27:89 | headerValue : String | semmle.label | headerValue : String | +| MicronautResponseSplitting.java:14:39:14:68 | headerValue : String | semmle.label | headerValue : String | +| MicronautResponseSplitting.java:16:53:16:63 | headerValue | semmle.label | headerValue | +| MicronautResponseSplitting.java:27:42:27:71 | headerValue : String | semmle.label | headerValue : String | +| MicronautResponseSplitting.java:29:42:29:90 | singletonMap(...) | semmle.label | singletonMap(...) | +| MicronautResponseSplitting.java:29:79:29:89 | headerValue : String | semmle.label | headerValue : String | +| MicronautResponseSplitting.java:33:50:33:79 | headerValue : String | semmle.label | headerValue : String | +| MicronautResponseSplitting.java:35:9:35:15 | headers [post update] : HashMap [] : String | semmle.label | headers [post update] : HashMap [] : String | +| MicronautResponseSplitting.java:35:33:35:43 | headerValue : String | semmle.label | headerValue : String | +| MicronautResponseSplitting.java:36:42:36:48 | headers | semmle.label | headers | | ResponseSplitting.java:22:20:22:67 | new Cookie(...) : Cookie | semmle.label | new Cookie(...) : Cookie | | ResponseSplitting.java:22:39:22:66 | getParameter(...) : String | semmle.label | getParameter(...) : String | | ResponseSplitting.java:23:23:23:28 | cookie | semmle.label | cookie | diff --git a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/cookie/Cookies.java b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/cookie/Cookies.java index b35fcb9a6e00..6a24e572918f 100644 --- a/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/cookie/Cookies.java +++ b/java/ql/test/stubs/micronaut-4.x/io/micronaut/http/cookie/Cookies.java @@ -1,10 +1,10 @@ package io.micronaut.http.cookie; -import java.util.Collection; +import io.micronaut.core.convert.value.ConvertibleValues; import java.util.Optional; import java.util.Set; -public interface Cookies { +public interface Cookies extends ConvertibleValues { Set getAll(); Optional findCookie(CharSequence name); Cookie get(CharSequence name); From 761de929ca15540ff4e9c200a0e94a273904f5ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaroslav=20Loba=C4=8Devski?= Date: Sun, 19 Jul 2026 07:01:24 +0000 Subject: [PATCH 0056/2098] Account cache poisoning queries for read-only access on low-trust triggers --- .../actions/security/CachePoisoningQuery.qll | 31 ++++++++- .../actions/security/CodeInjectionQuery.qll | 14 +--- .../CWE-349/CachePoisoningViaCodeInjection.md | 31 +++++---- .../CWE-349/CachePoisoningViaCodeInjection.ql | 1 + .../CWE-349/CachePoisoningViaDirectCache.md | 66 ++++++------------- .../CWE-349/CachePoisoningViaDirectCache.ql | 12 +--- .../CachePoisoningViaPoisonableStep.md | 28 +++++--- .../CachePoisoningViaPoisonableStep.ql | 12 +--- ...26-07-18-read-only-default-branch-cache.md | 4 ++ .../workflows/cache_write_capable_push.yml | 10 +++ .../cache_write_capable_workflow_dispatch.yml | 17 +++++ .../CachePoisoningViaCodeInjection.expected | 3 +- .../CachePoisoningViaDirectCache.expected | 9 +-- .../CachePoisoningViaPoisonableStep.expected | 10 +-- 14 files changed, 131 insertions(+), 117 deletions(-) create mode 100644 actions/ql/src/change-notes/2026-07-18-read-only-default-branch-cache.md create mode 100644 actions/ql/test/query-tests/Security/CWE-349/.github/workflows/cache_write_capable_push.yml create mode 100644 actions/ql/test/query-tests/Security/CWE-349/.github/workflows/cache_write_capable_workflow_dispatch.yml diff --git a/actions/ql/lib/codeql/actions/security/CachePoisoningQuery.qll b/actions/ql/lib/codeql/actions/security/CachePoisoningQuery.qll index e5c5a3655101..52ceb9a94e0c 100644 --- a/actions/ql/lib/codeql/actions/security/CachePoisoningQuery.qll +++ b/actions/ql/lib/codeql/actions/security/CachePoisoningQuery.qll @@ -5,8 +5,8 @@ string defaultBranchTriggerEvent() { [ "check_run", "check_suite", "delete", "discussion", "discussion_comment", "fork", "gollum", "issue_comment", "issues", "label", "milestone", "project", "project_card", "project_column", - "public", "pull_request_comment", "pull_request_target", "repository_dispatch", "schedule", - "watch", "workflow_run" + "public", "pull_request_comment", "pull_request_target", "repository_dispatch", + "registry_package", "page_build", "schedule", "watch", "workflow_dispatch", "workflow_run" ] } @@ -42,6 +42,33 @@ predicate runsOnDefaultBranch(Event e) { ) } +private string defaultBranchCacheWriteEvent() { + result = + [ + "push", "workflow_dispatch", "repository_dispatch", "delete", "registry_package", + "page_build", "schedule" + ] +} + +private predicate eventHasDefaultBranchCacheWriteAccess(Event event) { + runsOnDefaultBranch(event) and event.getName() = defaultBranchCacheWriteEvent() +} + +/** Holds if `job` can write to the cache scope of the default branch for `event`. */ +predicate hasDefaultBranchCacheWriteAccess(LocalJob job, Event event) { + job.getATriggerEvent() = event and + ( + eventHasDefaultBranchCacheWriteAccess(event) + or + // the workflow caller runs in the context of the default branch + event.getName() = "workflow_call" and + exists(ExternalJob caller | + job.getEnclosingWorkflow().(ReusableWorkflow).getACaller() = caller and + eventHasDefaultBranchCacheWriteAccess(caller.getATriggerEvent()) + ) + ) +} + abstract class CacheWritingStep extends Step { abstract string getPath(); } diff --git a/actions/ql/lib/codeql/actions/security/CodeInjectionQuery.qll b/actions/ql/lib/codeql/actions/security/CodeInjectionQuery.qll index 3d5b8852b850..2afa68244091 100644 --- a/actions/ql/lib/codeql/actions/security/CodeInjectionQuery.qll +++ b/actions/ql/lib/codeql/actions/security/CodeInjectionQuery.qll @@ -29,22 +29,10 @@ Event getRelevantCachePoisoningEventForSink(DataFlow::Node sink) { exists(LocalJob job | job = sink.asExpr().getEnclosingJob() and job.getATriggerEvent() = result and - // job can be triggered by an external user - result.isExternallyTriggerable() and // excluding privileged workflows since they can be exploited in easier circumstances // which is covered by `actions/code-injection/critical` not job.isPrivilegedExternallyTriggerable(result) and - ( - // the workflow runs in the context of the default branch - runsOnDefaultBranch(result) - or - // the workflow caller runs in the context of the default branch - result.getName() = "workflow_call" and - exists(ExternalJob caller | - caller.getCallee() = job.getLocation().getFile().getRelativePath() and - runsOnDefaultBranch(caller.getATriggerEvent()) - ) - ) + hasDefaultBranchCacheWriteAccess(job, result) ) } diff --git a/actions/ql/src/Security/CWE-349/CachePoisoningViaCodeInjection.md b/actions/ql/src/Security/CWE-349/CachePoisoningViaCodeInjection.md index f75028a27e61..0ef3199e0fd9 100644 --- a/actions/ql/src/Security/CWE-349/CachePoisoningViaCodeInjection.md +++ b/actions/ql/src/Security/CWE-349/CachePoisoningViaCodeInjection.md @@ -34,48 +34,55 @@ Due to the above design, if something is cached in the context of the default br ## Example +GitHub gives workflows triggered by low-trust events, such as `issue_comment`, +`pull_request_target`, and `workflow_run`, read-only access to the default branch cache scope. +This query therefore reports only workflows whose trigger can write to that scope. + ### Incorrect Usage -The following workflow is vulnerable to code injection in a non-privileged job but in the context of the default branch. +The following workflow interpolates a commit message directly into a script on a push to the +default branch. A commit message originating from a merged contribution may contain shell syntax, +which can expose the cache write token and allow the default branch cache to be poisoned. ```yaml name: Vulnerable Workflow on: - issue_comment: - types: [created] + push: + branches: [main] jobs: - pr-comment: + build: permissions: {} runs-on: ubuntu-latest steps: - run: | - echo ${{ github.event.comment.body }} + echo ${{ github.event.head_commit.message }} ``` ### Correct Usage -The following workflow is not vulnerable to code injections even if it runs in the context of the default branch. +The following workflow passes the commit message through an environment variable, so the shell +does not interpret its contents as code. ```yaml name: Secure Workflow on: - issue_comment: - types: [created] + push: + branches: [main] jobs: - pr-comment: + build: permissions: {} runs-on: ubuntu-latest steps: - env: - BODY: ${{ github.event.comment.body }} + MESSAGE: ${{ github.event.head_commit.message }} run: | - echo "$BODY" + echo "$MESSAGE" ``` ## References - Adnan Khan's Blog: [The Monsters in Your Build Cache – GitHub Actions Cache Poisoning](https://adnanthekhan.com/2024/05/06/the-monsters-in-your-build-cache-github-actions-cache-poisoning/). -- GitHub Docs: [GitHub Actions Caching Documentation](https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows). +- GitHub Docs: [Cache access for low-trust workflow triggers](https://docs.github.com/actions/reference/workflows-and-actions/dependency-caching#cache-access-for-low-trust-workflow-triggers). - Scribe Security Blog: [Cache Poisoning in GitHub Actions](https://scribesecurity.com/blog/github-cache-poisoning/). diff --git a/actions/ql/src/Security/CWE-349/CachePoisoningViaCodeInjection.ql b/actions/ql/src/Security/CWE-349/CachePoisoningViaCodeInjection.ql index 2fe792aba1e6..b970288ac31b 100644 --- a/actions/ql/src/Security/CWE-349/CachePoisoningViaCodeInjection.ql +++ b/actions/ql/src/Security/CWE-349/CachePoisoningViaCodeInjection.ql @@ -22,6 +22,7 @@ from CodeInjectionFlow::PathNode source, CodeInjectionFlow::PathNode sink, Event where CodeInjectionFlow::flowPath(source, sink) and event = getRelevantCachePoisoningEventForSink(sink.getNode()) and + source.getNode().(RemoteFlowSource).getEventName() = event.getName() and // the checkout is not controlled by an access check not exists(ControlCheck check | check.protects(source.getNode().asExpr(), event, "code-injection") diff --git a/actions/ql/src/Security/CWE-349/CachePoisoningViaDirectCache.md b/actions/ql/src/Security/CWE-349/CachePoisoningViaDirectCache.md index 849b771a8ff0..a22c41ad3e3a 100644 --- a/actions/ql/src/Security/CWE-349/CachePoisoningViaDirectCache.md +++ b/actions/ql/src/Security/CWE-349/CachePoisoningViaDirectCache.md @@ -34,35 +34,39 @@ Due to the above design, if something is cached in the context of the default br ## Example +GitHub gives workflows triggered by low-trust events, such as `issue_comment`, +`pull_request_target`, and `workflow_run`, read-only access to the default branch cache scope. +This query therefore reports only workflows whose trigger can write to that scope. + ### Incorrect Usage -The following workflow is caching an attacker-controlled file (`large_file`) in the context of the default branch. +The following write-capable manually dispatched workflow accepts a revision without validation, +fetches files from it, and saves those files in the default branch cache. This is unsafe if an +untrusted integration or automation can influence the dispatch input. ```yaml name: Vulnerable Workflow on: - issue_comment: - types: [created] + workflow_dispatch: + inputs: + head_sha: + required: true jobs: - pr-comment: + cache: permissions: read-all runs-on: ubuntu-latest steps: - - uses: xt0rted/pull-request-comment-branch@v2 - id: comment-branch - - uses: actions/checkout@v3 - with: - ref: ${{ steps.comment-branch.outputs.head_sha }} - - name: Set up Python 3.10 - uses: actions/setup-python@v5 - - name: Cache pip dependencies + - env: + HEAD_SHA: ${{ github.event.inputs.head_sha }} + run: | + git fetch origin "$HEAD_SHA" + git checkout "$HEAD_SHA" + - name: Cache fetched files uses: actions/cache@v4 - id: cache-pip with: - path: ~/.cache/pip - key: ${{ runner.os }}-pip-${{ hashFiles('**/pyproject.toml') }} - restore-keys: ${{ runner.os }}-pip- + path: . + key: dispatched-${{ github.event.inputs.head_sha }} ``` ### Correct Usage @@ -91,36 +95,8 @@ jobs: restore-keys: ${{ runner.os }}-pip- ``` -Note, that the example above doesn't allow using secrets if the Pull Request originates from a fork. In case secrets are needed, `pull_request_target` with labels as `safe to test` can be used, but the code in Pull Request must be manually reviewed before applying the label. - -```yaml -name: Secure Workflow -on: - pull_request_target: - types: [labeled] - -jobs: - pr-comment: - if: contains(github.event.pull_request.labels.*.name, 'safe to test') - permissions: read-all - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - with: - ref: ${{ github.event.pull_request.head.sha}} - - name: Set up Python 3.10 - uses: actions/setup-python@v5 - - name: Cache pip dependencies - uses: actions/cache@v4 - id: cache-pip - with: - path: ~/.cache/pip - key: ${{ runner.os }}-pip-${{ hashFiles('**/pyproject.toml') }} - restore-keys: ${{ runner.os }}-pip- -``` - ## References - Adnan Khan's Blog: [The Monsters in Your Build Cache – GitHub Actions Cache Poisoning](https://adnanthekhan.com/2024/05/06/the-monsters-in-your-build-cache-github-actions-cache-poisoning/). -- GitHub Docs: [GitHub Actions Caching Documentation](https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows). +- GitHub Docs: [Cache access for low-trust workflow triggers](https://docs.github.com/actions/reference/workflows-and-actions/dependency-caching#cache-access-for-low-trust-workflow-triggers). - Scribe Security Blog: [Cache Poisoning in GitHub Actions](https://scribesecurity.com/blog/github-cache-poisoning/). diff --git a/actions/ql/src/Security/CWE-349/CachePoisoningViaDirectCache.ql b/actions/ql/src/Security/CWE-349/CachePoisoningViaDirectCache.ql index 85a0f53df1dc..b410f92b68a1 100644 --- a/actions/ql/src/Security/CWE-349/CachePoisoningViaDirectCache.ql +++ b/actions/ql/src/Security/CWE-349/CachePoisoningViaDirectCache.ql @@ -40,17 +40,7 @@ where job.getATriggerEvent() = event and // job can be triggered by an external user event.isExternallyTriggerable() and - ( - // the workflow runs in the context of the default branch - runsOnDefaultBranch(event) - or - // the workflow's caller runs in the context of the default branch - event.getName() = "workflow_call" and - exists(ExternalJob caller | - caller.getCallee() = job.getLocation().getFile().getRelativePath() and - runsOnDefaultBranch(caller.getATriggerEvent()) - ) - ) and + hasDefaultBranchCacheWriteAccess(job, event) and // the job writes to the cache // (No need to follow the checkout/download step since the cache is normally write after the job completes) job.getAStep() = step and diff --git a/actions/ql/src/Security/CWE-349/CachePoisoningViaPoisonableStep.md b/actions/ql/src/Security/CWE-349/CachePoisoningViaPoisonableStep.md index fefd6d61a44d..e5fd868609c4 100644 --- a/actions/ql/src/Security/CWE-349/CachePoisoningViaPoisonableStep.md +++ b/actions/ql/src/Security/CWE-349/CachePoisoningViaPoisonableStep.md @@ -34,25 +34,35 @@ Due to the above design, if something is cached in the context of the default br ## Example +GitHub gives workflows triggered by low-trust events, such as `issue_comment`, +`pull_request_target`, and `workflow_run`, read-only access to the default branch cache scope. +This query therefore reports only workflows whose trigger can write to that scope. + ### Incorrect Usage -The following workflow runs untrusted code in a non-privileged job but in the context of the default branch. +The following write-capable manually dispatched workflow fetches an unvalidated revision and then +executes code from it. The executed code can use the cache token to poison the default branch cache +if an untrusted integration or automation can influence the dispatch input. ```yaml name: Vulnerable Workflow on: - pull_request_target: - branches: [main] -permissions: {} + workflow_dispatch: + inputs: + head_sha: + required: true jobs: test: + permissions: {} runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - with: - ref: ${{ github.event.pull_request.head.sha }} + - env: + HEAD_SHA: ${{ github.event.inputs.head_sha }} + run: | + git fetch origin "$HEAD_SHA" + git checkout "$HEAD_SHA" - name: Run tests - run: ./run_tests.sh + run: npm install ``` ### Correct Usage @@ -79,5 +89,5 @@ jobs: ## References - Adnan Khan's Blog: [The Monsters in Your Build Cache – GitHub Actions Cache Poisoning](https://adnanthekhan.com/2024/05/06/the-monsters-in-your-build-cache-github-actions-cache-poisoning/). -- GitHub Docs: [GitHub Actions Caching Documentation](https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows). +- GitHub Docs: [Cache access for low-trust workflow triggers](https://docs.github.com/actions/reference/workflows-and-actions/dependency-caching#cache-access-for-low-trust-workflow-triggers). - Scribe Security Blog: [Cache Poisoning in GitHub Actions](https://scribesecurity.com/blog/github-cache-poisoning/). diff --git a/actions/ql/src/Security/CWE-349/CachePoisoningViaPoisonableStep.ql b/actions/ql/src/Security/CWE-349/CachePoisoningViaPoisonableStep.ql index 95adcfaf78ec..f8466179caeb 100644 --- a/actions/ql/src/Security/CWE-349/CachePoisoningViaPoisonableStep.ql +++ b/actions/ql/src/Security/CWE-349/CachePoisoningViaPoisonableStep.ql @@ -40,17 +40,7 @@ where job.getATriggerEvent() = event and // job can be triggered by an external user event.isExternallyTriggerable() and - ( - // the workflow runs in the context of the default branch - runsOnDefaultBranch(event) - or - // the workflow's caller runs in the context of the default branch - event.getName() = "workflow_call" and - exists(ExternalJob caller | - caller.getCallee() = job.getLocation().getFile().getRelativePath() and - runsOnDefaultBranch(caller.getATriggerEvent()) - ) - ) and + hasDefaultBranchCacheWriteAccess(job, event) and // the job executes checked-out code // (The cache specific token can be leaked even for non-privileged workflows) source.getAFollowingStep() = step and diff --git a/actions/ql/src/change-notes/2026-07-18-read-only-default-branch-cache.md b/actions/ql/src/change-notes/2026-07-18-read-only-default-branch-cache.md new file mode 100644 index 000000000000..9952be542003 --- /dev/null +++ b/actions/ql/src/change-notes/2026-07-18-read-only-default-branch-cache.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `actions/cache-poisoning/code-injection`, `actions/cache-poisoning/direct-cache`, and `actions/cache-poisoning/poisonable-step` queries now account for read-only cache access on low-trust triggers that run in the default branch scope. Results are retained for triggers that GitHub allows to write to that cache scope. diff --git a/actions/ql/test/query-tests/Security/CWE-349/.github/workflows/cache_write_capable_push.yml b/actions/ql/test/query-tests/Security/CWE-349/.github/workflows/cache_write_capable_push.yml new file mode 100644 index 000000000000..b9fbe2d2d0b4 --- /dev/null +++ b/actions/ql/test/query-tests/Security/CWE-349/.github/workflows/cache_write_capable_push.yml @@ -0,0 +1,10 @@ +on: + push: + branches: [main] + +jobs: + injection: + permissions: {} + runs-on: ubuntu-latest + steps: + - run: echo "${{ github.event.head_commit.message }}" \ No newline at end of file diff --git a/actions/ql/test/query-tests/Security/CWE-349/.github/workflows/cache_write_capable_workflow_dispatch.yml b/actions/ql/test/query-tests/Security/CWE-349/.github/workflows/cache_write_capable_workflow_dispatch.yml new file mode 100644 index 000000000000..74695bc76942 --- /dev/null +++ b/actions/ql/test/query-tests/Security/CWE-349/.github/workflows/cache_write_capable_workflow_dispatch.yml @@ -0,0 +1,17 @@ +on: workflow_dispatch + +jobs: + cache: + permissions: {} + runs-on: ubuntu-latest + steps: + - env: + HEAD_SHA: ${{ github.event.inputs.head_sha }} + run: | + git fetch origin "$HEAD_SHA" + git checkout "$HEAD_SHA" + - run: npm install + - uses: actions/cache@v4 + with: + path: .npm + key: workflow-dispatch diff --git a/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaCodeInjection.expected b/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaCodeInjection.expected index 9cfac091f675..8cfbf6c2965c 100644 --- a/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaCodeInjection.expected +++ b/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaCodeInjection.expected @@ -1,10 +1,11 @@ edges | .github/workflows/code_injection2.yml:12:9:16:6 | Uses Step: modified_files | .github/workflows/code_injection2.yml:16:21:16:70 | steps.modified_files.outputs.files_modified | provenance | | nodes +| .github/workflows/cache_write_capable_push.yml:10:21:10:59 | github.event.head_commit.message | semmle.label | github.event.head_commit.message | | .github/workflows/code_injection1.yml:11:17:11:48 | github.event.comment.body | semmle.label | github.event.comment.body | | .github/workflows/code_injection2.yml:12:9:16:6 | Uses Step: modified_files | semmle.label | Uses Step: modified_files | | .github/workflows/code_injection2.yml:16:21:16:70 | steps.modified_files.outputs.files_modified | semmle.label | steps.modified_files.outputs.files_modified | | .github/workflows/neg_code_injection1.yml:11:17:11:48 | github.event.comment.body | semmle.label | github.event.comment.body | subpaths #select -| .github/workflows/code_injection1.yml:11:17:11:48 | github.event.comment.body | .github/workflows/code_injection1.yml:11:17:11:48 | github.event.comment.body | .github/workflows/code_injection1.yml:11:17:11:48 | github.event.comment.body | Unprivileged code injection in $@, which may lead to cache poisoning ($@). | .github/workflows/code_injection1.yml:11:17:11:48 | github.event.comment.body | ${{ github.event.comment.body }} | .github/workflows/code_injection1.yml:2:3:2:15 | issue_comment | issue_comment | +| .github/workflows/cache_write_capable_push.yml:10:21:10:59 | github.event.head_commit.message | .github/workflows/cache_write_capable_push.yml:10:21:10:59 | github.event.head_commit.message | .github/workflows/cache_write_capable_push.yml:10:21:10:59 | github.event.head_commit.message | Unprivileged code injection in $@, which may lead to cache poisoning ($@). | .github/workflows/cache_write_capable_push.yml:10:21:10:59 | github.event.head_commit.message | ${{ github.event.head_commit.message }} | .github/workflows/cache_write_capable_push.yml:2:3:2:6 | push | push | diff --git a/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaDirectCache.expected b/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaDirectCache.expected index 4cc8536b5943..8d0b858d0035 100644 --- a/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaDirectCache.expected +++ b/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaDirectCache.expected @@ -1,4 +1,6 @@ edges +| .github/workflows/cache_write_capable_workflow_dispatch.yml:8:9:13:6 | Run Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:13:9:14:6 | Run Step | +| .github/workflows/cache_write_capable_workflow_dispatch.yml:13:9:14:6 | Run Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:14:9:17:33 | Uses Step | | .github/workflows/code_injection2.yml:12:9:16:6 | Uses Step: modified_files | .github/workflows/code_injection2.yml:16:9:16:71 | Run Step | | .github/workflows/direct_cache1.yml:10:9:13:6 | Uses Step: comment-branch | .github/workflows/direct_cache1.yml:13:9:18:6 | Uses Step | | .github/workflows/direct_cache1.yml:13:9:18:6 | Uses Step | .github/workflows/direct_cache1.yml:18:9:22:6 | Uses Step | @@ -44,9 +46,4 @@ edges | .github/workflows/poisonable_step5.yml:17:9:22:6 | Uses Step | .github/workflows/poisonable_step5.yml:22:9:24:6 | Uses Step | | .github/workflows/poisonable_step5.yml:22:9:24:6 | Uses Step | .github/workflows/poisonable_step5.yml:24:9:28:31 | Uses Step | #select -| .github/workflows/direct_cache1.yml:18:9:22:6 | Uses Step | .github/workflows/direct_cache1.yml:13:9:18:6 | Uses Step | .github/workflows/direct_cache1.yml:18:9:22:6 | Uses Step | Potential cache poisoning in the context of the default branch due to privilege checkout of untrusted code. ($@). | .github/workflows/direct_cache1.yml:2:3:2:15 | issue_comment | issue_comment | -| .github/workflows/direct_cache2.yml:14:9:18:6 | Uses Step | .github/workflows/direct_cache2.yml:11:9:14:6 | Uses Step | .github/workflows/direct_cache2.yml:14:9:18:6 | Uses Step | Potential cache poisoning in the context of the default branch due to privilege checkout of untrusted code. ($@). | .github/workflows/direct_cache2.yml:3:5:3:23 | pull_request_target | pull_request_target | -| .github/workflows/direct_cache3.yml:19:9:23:6 | Uses Step | .github/workflows/direct_cache3.yml:14:9:19:6 | Uses Step | .github/workflows/direct_cache3.yml:19:9:23:6 | Uses Step | Potential cache poisoning in the context of the default branch due to privilege checkout of untrusted code. ($@). | .github/workflows/direct_cache3.yml:2:3:2:15 | issue_comment | issue_comment | -| .github/workflows/direct_cache4.yml:17:9:21:6 | Uses Step | .github/workflows/direct_cache4.yml:14:9:17:6 | Uses Step | .github/workflows/direct_cache4.yml:17:9:21:6 | Uses Step | Potential cache poisoning in the context of the default branch due to privilege checkout of untrusted code. ($@). | .github/workflows/direct_cache4.yml:4:3:4:21 | pull_request_target | pull_request_target | -| .github/workflows/direct_cache5.yml:17:9:21:6 | Uses Step | .github/workflows/direct_cache5.yml:14:9:17:6 | Uses Step | .github/workflows/direct_cache5.yml:17:9:21:6 | Uses Step | Potential cache poisoning in the context of the default branch due to privilege checkout of untrusted code. ($@). | .github/workflows/direct_cache5.yml:4:3:4:21 | pull_request_target | pull_request_target | -| .github/workflows/direct_cache6.yml:20:9:26:46 | Uses Step: cache-pip | .github/workflows/direct_cache6.yml:13:9:16:6 | Uses Step | .github/workflows/direct_cache6.yml:20:9:26:46 | Uses Step: cache-pip | Potential cache poisoning in the context of the default branch due to privilege checkout of untrusted code. ($@). | .github/workflows/direct_cache6.yml:4:3:4:21 | pull_request_target | pull_request_target | +| .github/workflows/cache_write_capable_workflow_dispatch.yml:14:9:17:33 | Uses Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:8:9:13:6 | Run Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:14:9:17:33 | Uses Step | Potential cache poisoning in the context of the default branch due to privilege checkout of untrusted code. ($@). | .github/workflows/cache_write_capable_workflow_dispatch.yml:1:5:1:21 | workflow_dispatch | workflow_dispatch | diff --git a/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaPoisonableStep.expected b/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaPoisonableStep.expected index 6b1a3e873134..ba48d939eda7 100644 --- a/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaPoisonableStep.expected +++ b/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaPoisonableStep.expected @@ -1,4 +1,6 @@ edges +| .github/workflows/cache_write_capable_workflow_dispatch.yml:8:9:13:6 | Run Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:13:9:14:6 | Run Step | +| .github/workflows/cache_write_capable_workflow_dispatch.yml:13:9:14:6 | Run Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:14:9:17:33 | Uses Step | | .github/workflows/code_injection2.yml:12:9:16:6 | Uses Step: modified_files | .github/workflows/code_injection2.yml:16:9:16:71 | Run Step | | .github/workflows/direct_cache1.yml:10:9:13:6 | Uses Step: comment-branch | .github/workflows/direct_cache1.yml:13:9:18:6 | Uses Step | | .github/workflows/direct_cache1.yml:13:9:18:6 | Uses Step | .github/workflows/direct_cache1.yml:18:9:22:6 | Uses Step | @@ -44,10 +46,4 @@ edges | .github/workflows/poisonable_step5.yml:17:9:22:6 | Uses Step | .github/workflows/poisonable_step5.yml:22:9:24:6 | Uses Step | | .github/workflows/poisonable_step5.yml:22:9:24:6 | Uses Step | .github/workflows/poisonable_step5.yml:24:9:28:31 | Uses Step | #select -| .github/workflows/poisonable_step1.yml:15:9:17:2 | Run Step | .github/workflows/poisonable_step1.yml:12:9:15:6 | Uses Step | .github/workflows/poisonable_step1.yml:15:9:17:2 | Run Step | Potential cache poisoning in the context of the default branch due to privilege checkout of untrusted code. ($@). | .github/workflows/poisonable_step1.yml:2:3:2:15 | issue_comment | issue_comment | -| .github/workflows/poisonable_step1.yml:26:9:28:2 | Uses Step | .github/workflows/poisonable_step1.yml:23:9:26:6 | Uses Step | .github/workflows/poisonable_step1.yml:26:9:28:2 | Uses Step | Potential cache poisoning in the context of the default branch due to privilege checkout of untrusted code. ($@). | .github/workflows/poisonable_step1.yml:2:3:2:15 | issue_comment | issue_comment | -| .github/workflows/poisonable_step1.yml:37:9:37:75 | Run Step | .github/workflows/poisonable_step1.yml:34:9:37:6 | Uses Step | .github/workflows/poisonable_step1.yml:37:9:37:75 | Run Step | Potential cache poisoning in the context of the default branch due to privilege checkout of untrusted code. ($@). | .github/workflows/poisonable_step1.yml:2:3:2:15 | issue_comment | issue_comment | -| .github/workflows/poisonable_step2.yml:22:9:26:31 | Uses Step | .github/workflows/poisonable_step2.yml:15:9:20:6 | Uses Step | .github/workflows/poisonable_step2.yml:22:9:26:31 | Uses Step | Potential cache poisoning in the context of the default branch due to privilege checkout of untrusted code. ($@). | .github/workflows/poisonable_step2.yml:5:3:5:21 | pull_request_target | pull_request_target | -| .github/workflows/poisonable_step3.yml:19:7:19:32 | Run Step | .github/workflows/poisonable_step3.yml:13:7:19:4 | Uses Step | .github/workflows/poisonable_step3.yml:19:7:19:32 | Run Step | Potential cache poisoning in the context of the default branch due to privilege checkout of untrusted code. ($@). | .github/workflows/poisonable_step3.yml:4:3:4:21 | pull_request_target | pull_request_target | -| .github/workflows/poisonable_step4.yml:18:9:18:19 | Run Step | .github/workflows/poisonable_step4.yml:13:9:18:6 | Uses Step | .github/workflows/poisonable_step4.yml:18:9:18:19 | Run Step | Potential cache poisoning in the context of the default branch due to privilege checkout of untrusted code. ($@). | .github/workflows/poisonable_step4.yml:3:3:3:21 | pull_request_target | pull_request_target | -| .github/workflows/poisonable_step5.yml:24:9:28:31 | Uses Step | .github/workflows/poisonable_step5.yml:17:9:22:6 | Uses Step | .github/workflows/poisonable_step5.yml:24:9:28:31 | Uses Step | Potential cache poisoning in the context of the default branch due to privilege checkout of untrusted code. ($@). | .github/workflows/poisonable_step5.yml:3:3:3:21 | pull_request_target | pull_request_target | +| .github/workflows/cache_write_capable_workflow_dispatch.yml:13:9:14:6 | Run Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:8:9:13:6 | Run Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:13:9:14:6 | Run Step | Potential cache poisoning in the context of the default branch due to privilege checkout of untrusted code. ($@). | .github/workflows/cache_write_capable_workflow_dispatch.yml:1:5:1:21 | workflow_dispatch | workflow_dispatch | From 754e40ba72950614ea7249398fb79956310c72b2 Mon Sep 17 00:00:00 2001 From: JarLob Date: Thu, 30 Jul 2026 19:05:20 +0300 Subject: [PATCH 0057/2098] Optimize Actions event source matching Bind event-property and event-context matching to source expressions so code-injection queries avoid materializing global source/event relations. --- .../codeql/actions/dataflow/FlowSources.qll | 64 ++++++++++++------- 1 file changed, 42 insertions(+), 22 deletions(-) diff --git a/actions/ql/lib/codeql/actions/dataflow/FlowSources.qll b/actions/ql/lib/codeql/actions/dataflow/FlowSources.qll index 18cc4322c81b..b4a279ac1151 100644 --- a/actions/ql/lib/codeql/actions/dataflow/FlowSources.qll +++ b/actions/ql/lib/codeql/actions/dataflow/FlowSources.qll @@ -52,29 +52,41 @@ class GitHubCtxSource extends RemoteFlowSource { override string getEventName() { result = event } } +bindingset[expression] +private predicate untrustedEventProperty(Expression expression, string kind) { + exists(string regexp | + untrustedEventPropertiesDataModel(regexp, kind) and + not kind = "json" and + normalizeExpr(expression.getExpression()).regexpMatch("(?i)\\s*" + wrapRegexp(regexp) + ".*") + ) +} + +bindingset[expression, event] +private predicate expressionContainsEventContext(Expression expression, string event) { + exists(string contextPrefix | + contextTriggerDataModel(event, contextPrefix) and + normalizeExpr(expression.getExpression()).matches("%" + contextPrefix + "%") + ) +} + class GitHubEventCtxSource extends RemoteFlowSource { string flag; string context; string event; GitHubEventCtxSource() { - exists(Expression e, string regexp | + exists(Expression e | this.asExpr() = e and context = e.getExpression() and ( // the context is available for the job trigger events event = e.getATriggerEvent().getName() and - exists(string context_prefix | - contextTriggerDataModel(event, context_prefix) and - normalizeExpr(context).matches("%" + context_prefix + "%") - ) + expressionContainsEventContext(e, event) or not exists(e.getATriggerEvent()) and event = "unknown" ) and - untrustedEventPropertiesDataModel(regexp, flag) and - not flag = "json" and - normalizeExpr(context).regexpMatch("(?i)\\s*" + wrapRegexp(regexp) + ".*") + untrustedEventProperty(e, flag) ) } @@ -177,32 +189,40 @@ class GitHubEventPathSource extends RemoteFlowSource, CommandSource { override Run getEnclosingRun() { result = run } } +bindingset[expression, event] +private predicate jsonSourceForEvent(Expression expression, string event) { + exists(string context, string regexp, string contextPrefix | + context = expression.getExpression() and + untrustedEventPropertiesDataModel(regexp, _) and + contextTriggerDataModel(event, contextPrefix) and + normalizeExpr(context).matches("%" + contextPrefix + "%") and + normalizeExpr(context).regexpMatch("(?i).*" + wrapJsonRegexp(regexp) + ".*") + ) + or + exists(string context, string regexp, string kind | + context = expression.getExpression() and + untrustedEventPropertiesDataModel(regexp, kind) and + contextTriggerDataModel(event, _) and + normalizeExpr(context).regexpMatch("(?i).*" + wrapJsonRegexp("\\bgithub.event\\b") + ".*") + ) +} + class GitHubEventJsonSource extends RemoteFlowSource { string flag; string event; GitHubEventJsonSource() { - exists(Expression e, string context, string regexp | + exists(Expression e | this.asExpr() = e and - context = e.getExpression() and - untrustedEventPropertiesDataModel(regexp, _) and ( // only contexts for the triggering events are considered tainted. // eg: for `pull_request`, we only consider `github.event.pull_request` event = e.getEnclosingWorkflow().getATriggerEvent().getName() and - exists(string context_prefix | - contextTriggerDataModel(event, context_prefix) and - normalizeExpr(context).matches("%" + context_prefix + "%") - ) and - normalizeExpr(context).regexpMatch("(?i).*" + wrapJsonRegexp(regexp) + ".*") - or - // github.event is tainted for all triggers - event = e.getEnclosingWorkflow().getATriggerEvent().getName() and - contextTriggerDataModel(e.getEnclosingWorkflow().getATriggerEvent().getName(), _) and - normalizeExpr(context).regexpMatch("(?i).*" + wrapJsonRegexp("\\bgithub.event\\b") + ".*") + jsonSourceForEvent(e, event) or not exists(e.getATriggerEvent()) and - event = "unknown" + event = "unknown" and + exists(string regexp, string kind | untrustedEventPropertiesDataModel(regexp, kind)) ) and flag = "json" ) From d2f52440807585a8637906c720f8b6c3147c342c Mon Sep 17 00:00:00 2001 From: JarLob Date: Thu, 30 Jul 2026 19:39:25 +0300 Subject: [PATCH 0058/2098] Address cache poisoning review feedback --- .../ql/lib/codeql/actions/dataflow/FlowSources.qll | 6 +++--- .../cache_write_capable_workflow_dispatch.yml | 12 ++++++++++-- .../CWE-349/CachePoisoningViaDirectCache.expected | 7 ++++--- .../CWE-349/CachePoisoningViaPoisonableStep.expected | 7 ++++--- 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/actions/ql/lib/codeql/actions/dataflow/FlowSources.qll b/actions/ql/lib/codeql/actions/dataflow/FlowSources.qll index b4a279ac1151..f44a4603df19 100644 --- a/actions/ql/lib/codeql/actions/dataflow/FlowSources.qll +++ b/actions/ql/lib/codeql/actions/dataflow/FlowSources.qll @@ -199,9 +199,9 @@ private predicate jsonSourceForEvent(Expression expression, string event) { normalizeExpr(context).regexpMatch("(?i).*" + wrapJsonRegexp(regexp) + ".*") ) or - exists(string context, string regexp, string kind | + exists(string context | context = expression.getExpression() and - untrustedEventPropertiesDataModel(regexp, kind) and + untrustedEventPropertiesDataModel(_, _) and contextTriggerDataModel(event, _) and normalizeExpr(context).regexpMatch("(?i).*" + wrapJsonRegexp("\\bgithub.event\\b") + ".*") ) @@ -222,7 +222,7 @@ class GitHubEventJsonSource extends RemoteFlowSource { or not exists(e.getATriggerEvent()) and event = "unknown" and - exists(string regexp, string kind | untrustedEventPropertiesDataModel(regexp, kind)) + untrustedEventPropertiesDataModel(_, _) ) and flag = "json" ) diff --git a/actions/ql/test/query-tests/Security/CWE-349/.github/workflows/cache_write_capable_workflow_dispatch.yml b/actions/ql/test/query-tests/Security/CWE-349/.github/workflows/cache_write_capable_workflow_dispatch.yml index 74695bc76942..5b9510222ac7 100644 --- a/actions/ql/test/query-tests/Security/CWE-349/.github/workflows/cache_write_capable_workflow_dispatch.yml +++ b/actions/ql/test/query-tests/Security/CWE-349/.github/workflows/cache_write_capable_workflow_dispatch.yml @@ -1,15 +1,23 @@ -on: workflow_dispatch +on: + workflow_dispatch: + inputs: + head_sha: + description: Commit SHA to test + required: true + type: string jobs: cache: permissions: {} runs-on: ubuntu-latest steps: + - uses: actions/checkout@v4 - env: HEAD_SHA: ${{ github.event.inputs.head_sha }} run: | + [[ "$HEAD_SHA" =~ ^[0-9a-fA-F]{40}$ ]] || exit 1 git fetch origin "$HEAD_SHA" - git checkout "$HEAD_SHA" + git checkout --detach "$HEAD_SHA" - run: npm install - uses: actions/cache@v4 with: diff --git a/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaDirectCache.expected b/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaDirectCache.expected index 8d0b858d0035..0491a0de4e8d 100644 --- a/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaDirectCache.expected +++ b/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaDirectCache.expected @@ -1,6 +1,7 @@ edges -| .github/workflows/cache_write_capable_workflow_dispatch.yml:8:9:13:6 | Run Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:13:9:14:6 | Run Step | -| .github/workflows/cache_write_capable_workflow_dispatch.yml:13:9:14:6 | Run Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:14:9:17:33 | Uses Step | +| .github/workflows/cache_write_capable_workflow_dispatch.yml:14:9:15:6 | Uses Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:15:9:21:6 | Run Step | +| .github/workflows/cache_write_capable_workflow_dispatch.yml:15:9:21:6 | Run Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:21:9:22:6 | Run Step | +| .github/workflows/cache_write_capable_workflow_dispatch.yml:21:9:22:6 | Run Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:22:9:25:33 | Uses Step | | .github/workflows/code_injection2.yml:12:9:16:6 | Uses Step: modified_files | .github/workflows/code_injection2.yml:16:9:16:71 | Run Step | | .github/workflows/direct_cache1.yml:10:9:13:6 | Uses Step: comment-branch | .github/workflows/direct_cache1.yml:13:9:18:6 | Uses Step | | .github/workflows/direct_cache1.yml:13:9:18:6 | Uses Step | .github/workflows/direct_cache1.yml:18:9:22:6 | Uses Step | @@ -46,4 +47,4 @@ edges | .github/workflows/poisonable_step5.yml:17:9:22:6 | Uses Step | .github/workflows/poisonable_step5.yml:22:9:24:6 | Uses Step | | .github/workflows/poisonable_step5.yml:22:9:24:6 | Uses Step | .github/workflows/poisonable_step5.yml:24:9:28:31 | Uses Step | #select -| .github/workflows/cache_write_capable_workflow_dispatch.yml:14:9:17:33 | Uses Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:8:9:13:6 | Run Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:14:9:17:33 | Uses Step | Potential cache poisoning in the context of the default branch due to privilege checkout of untrusted code. ($@). | .github/workflows/cache_write_capable_workflow_dispatch.yml:1:5:1:21 | workflow_dispatch | workflow_dispatch | +| .github/workflows/cache_write_capable_workflow_dispatch.yml:22:9:25:33 | Uses Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:15:9:21:6 | Run Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:22:9:25:33 | Uses Step | Potential cache poisoning in the context of the default branch due to privilege checkout of untrusted code. ($@). | .github/workflows/cache_write_capable_workflow_dispatch.yml:2:3:2:19 | workflow_dispatch | workflow_dispatch | diff --git a/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaPoisonableStep.expected b/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaPoisonableStep.expected index ba48d939eda7..0b637891d8e0 100644 --- a/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaPoisonableStep.expected +++ b/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaPoisonableStep.expected @@ -1,6 +1,7 @@ edges -| .github/workflows/cache_write_capable_workflow_dispatch.yml:8:9:13:6 | Run Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:13:9:14:6 | Run Step | -| .github/workflows/cache_write_capable_workflow_dispatch.yml:13:9:14:6 | Run Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:14:9:17:33 | Uses Step | +| .github/workflows/cache_write_capable_workflow_dispatch.yml:14:9:15:6 | Uses Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:15:9:21:6 | Run Step | +| .github/workflows/cache_write_capable_workflow_dispatch.yml:15:9:21:6 | Run Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:21:9:22:6 | Run Step | +| .github/workflows/cache_write_capable_workflow_dispatch.yml:21:9:22:6 | Run Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:22:9:25:33 | Uses Step | | .github/workflows/code_injection2.yml:12:9:16:6 | Uses Step: modified_files | .github/workflows/code_injection2.yml:16:9:16:71 | Run Step | | .github/workflows/direct_cache1.yml:10:9:13:6 | Uses Step: comment-branch | .github/workflows/direct_cache1.yml:13:9:18:6 | Uses Step | | .github/workflows/direct_cache1.yml:13:9:18:6 | Uses Step | .github/workflows/direct_cache1.yml:18:9:22:6 | Uses Step | @@ -46,4 +47,4 @@ edges | .github/workflows/poisonable_step5.yml:17:9:22:6 | Uses Step | .github/workflows/poisonable_step5.yml:22:9:24:6 | Uses Step | | .github/workflows/poisonable_step5.yml:22:9:24:6 | Uses Step | .github/workflows/poisonable_step5.yml:24:9:28:31 | Uses Step | #select -| .github/workflows/cache_write_capable_workflow_dispatch.yml:13:9:14:6 | Run Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:8:9:13:6 | Run Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:13:9:14:6 | Run Step | Potential cache poisoning in the context of the default branch due to privilege checkout of untrusted code. ($@). | .github/workflows/cache_write_capable_workflow_dispatch.yml:1:5:1:21 | workflow_dispatch | workflow_dispatch | +| .github/workflows/cache_write_capable_workflow_dispatch.yml:21:9:22:6 | Run Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:15:9:21:6 | Run Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:21:9:22:6 | Run Step | Potential cache poisoning in the context of the default branch due to privilege checkout of untrusted code. ($@). | .github/workflows/cache_write_capable_workflow_dispatch.yml:2:3:2:19 | workflow_dispatch | workflow_dispatch | From 8a89360ebfa998c9510b6a4c2d5fa3c7e64ce0a7 Mon Sep 17 00:00:00 2001 From: JarLob Date: Fri, 31 Jul 2026 14:45:05 +0300 Subject: [PATCH 0059/2098] Constrain Actions source helper evaluation --- actions/ql/lib/codeql/actions/dataflow/FlowSources.qll | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/actions/ql/lib/codeql/actions/dataflow/FlowSources.qll b/actions/ql/lib/codeql/actions/dataflow/FlowSources.qll index f44a4603df19..8b0a2a33eb55 100644 --- a/actions/ql/lib/codeql/actions/dataflow/FlowSources.qll +++ b/actions/ql/lib/codeql/actions/dataflow/FlowSources.qll @@ -53,15 +53,17 @@ class GitHubCtxSource extends RemoteFlowSource { } bindingset[expression] +pragma[inline_late] private predicate untrustedEventProperty(Expression expression, string kind) { exists(string regexp | untrustedEventPropertiesDataModel(regexp, kind) and - not kind = "json" and + kind != "json" and normalizeExpr(expression.getExpression()).regexpMatch("(?i)\\s*" + wrapRegexp(regexp) + ".*") ) } bindingset[expression, event] +pragma[inline_late] private predicate expressionContainsEventContext(Expression expression, string event) { exists(string contextPrefix | contextTriggerDataModel(event, contextPrefix) and @@ -190,6 +192,7 @@ class GitHubEventPathSource extends RemoteFlowSource, CommandSource { } bindingset[expression, event] +pragma[inline_late] private predicate jsonSourceForEvent(Expression expression, string event) { exists(string context, string regexp, string contextPrefix | context = expression.getExpression() and From 1900b61ce01df5f1505f5a0212f7182f724baebc Mon Sep 17 00:00:00 2001 From: JarLob Date: Fri, 31 Jul 2026 15:11:22 +0300 Subject: [PATCH 0060/2098] Add tests --- .../cache_write_capable_reusable_workflow.yml | 45 +++++++++++++++++++ ...write_capable_reusable_workflow_caller.yml | 16 +++++++ .../CachePoisoningViaCodeInjection.expected | 2 + .../CachePoisoningViaDirectCache.expected | 5 +++ .../CachePoisoningViaPoisonableStep.expected | 5 +++ 5 files changed, 73 insertions(+) create mode 100644 actions/ql/test/query-tests/Security/CWE-349/.github/workflows/cache_write_capable_reusable_workflow.yml create mode 100644 actions/ql/test/query-tests/Security/CWE-349/.github/workflows/cache_write_capable_reusable_workflow_caller.yml diff --git a/actions/ql/test/query-tests/Security/CWE-349/.github/workflows/cache_write_capable_reusable_workflow.yml b/actions/ql/test/query-tests/Security/CWE-349/.github/workflows/cache_write_capable_reusable_workflow.yml new file mode 100644 index 000000000000..99a474f99508 --- /dev/null +++ b/actions/ql/test/query-tests/Security/CWE-349/.github/workflows/cache_write_capable_reusable_workflow.yml @@ -0,0 +1,45 @@ +on: + workflow_call: + inputs: + head_sha: + required: false + type: string + +jobs: + direct-cache: + if: github.event_name == 'workflow_dispatch' + permissions: {} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - env: + HEAD_SHA: ${{ inputs.head_sha }} + run: | + [[ "$HEAD_SHA" =~ ^[0-9a-fA-F]{40}$ ]] || exit 1 + git fetch origin "$HEAD_SHA" + git checkout --detach "$HEAD_SHA" + - uses: actions/cache@v4 + with: + path: .npm + key: reusable-direct-cache + + poisonable-step: + if: github.event_name == 'workflow_dispatch' + permissions: {} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - env: + HEAD_SHA: ${{ inputs.head_sha }} + run: | + [[ "$HEAD_SHA" =~ ^[0-9a-fA-F]{40}$ ]] || exit 1 + git fetch origin "$HEAD_SHA" + git checkout --detach "$HEAD_SHA" + - run: npm install + + code-injection: + if: github.event_name == 'push' + permissions: {} + runs-on: ubuntu-latest + steps: + - run: echo "${{ github.event.head_commit.message }}" \ No newline at end of file diff --git a/actions/ql/test/query-tests/Security/CWE-349/.github/workflows/cache_write_capable_reusable_workflow_caller.yml b/actions/ql/test/query-tests/Security/CWE-349/.github/workflows/cache_write_capable_reusable_workflow_caller.yml new file mode 100644 index 000000000000..9f0f5841f89e --- /dev/null +++ b/actions/ql/test/query-tests/Security/CWE-349/.github/workflows/cache_write_capable_reusable_workflow_caller.yml @@ -0,0 +1,16 @@ +on: + push: + branches: [main] + workflow_dispatch: + inputs: + head_sha: + description: Commit SHA to test + required: true + type: string + +jobs: + reusable: + permissions: {} + uses: ./.github/workflows/cache_write_capable_reusable_workflow.yml + with: + head_sha: ${{ github.event.inputs.head_sha }} \ No newline at end of file diff --git a/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaCodeInjection.expected b/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaCodeInjection.expected index 8cfbf6c2965c..e8d1d96486ab 100644 --- a/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaCodeInjection.expected +++ b/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaCodeInjection.expected @@ -2,6 +2,7 @@ edges | .github/workflows/code_injection2.yml:12:9:16:6 | Uses Step: modified_files | .github/workflows/code_injection2.yml:16:21:16:70 | steps.modified_files.outputs.files_modified | provenance | | nodes | .github/workflows/cache_write_capable_push.yml:10:21:10:59 | github.event.head_commit.message | semmle.label | github.event.head_commit.message | +| .github/workflows/cache_write_capable_reusable_workflow.yml:45:21:45:59 | github.event.head_commit.message | semmle.label | github.event.head_commit.message | | .github/workflows/code_injection1.yml:11:17:11:48 | github.event.comment.body | semmle.label | github.event.comment.body | | .github/workflows/code_injection2.yml:12:9:16:6 | Uses Step: modified_files | semmle.label | Uses Step: modified_files | | .github/workflows/code_injection2.yml:16:21:16:70 | steps.modified_files.outputs.files_modified | semmle.label | steps.modified_files.outputs.files_modified | @@ -9,3 +10,4 @@ nodes subpaths #select | .github/workflows/cache_write_capable_push.yml:10:21:10:59 | github.event.head_commit.message | .github/workflows/cache_write_capable_push.yml:10:21:10:59 | github.event.head_commit.message | .github/workflows/cache_write_capable_push.yml:10:21:10:59 | github.event.head_commit.message | Unprivileged code injection in $@, which may lead to cache poisoning ($@). | .github/workflows/cache_write_capable_push.yml:10:21:10:59 | github.event.head_commit.message | ${{ github.event.head_commit.message }} | .github/workflows/cache_write_capable_push.yml:2:3:2:6 | push | push | +| .github/workflows/cache_write_capable_reusable_workflow.yml:45:21:45:59 | github.event.head_commit.message | .github/workflows/cache_write_capable_reusable_workflow.yml:45:21:45:59 | github.event.head_commit.message | .github/workflows/cache_write_capable_reusable_workflow.yml:45:21:45:59 | github.event.head_commit.message | Unprivileged code injection in $@, which may lead to cache poisoning ($@). | .github/workflows/cache_write_capable_reusable_workflow.yml:45:21:45:59 | github.event.head_commit.message | ${{ github.event.head_commit.message }} | .github/workflows/cache_write_capable_reusable_workflow_caller.yml:2:3:2:6 | push | push | diff --git a/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaDirectCache.expected b/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaDirectCache.expected index 0491a0de4e8d..ad5e6e972c89 100644 --- a/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaDirectCache.expected +++ b/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaDirectCache.expected @@ -1,4 +1,8 @@ edges +| .github/workflows/cache_write_capable_reusable_workflow.yml:14:9:15:6 | Uses Step | .github/workflows/cache_write_capable_reusable_workflow.yml:15:9:21:6 | Run Step | +| .github/workflows/cache_write_capable_reusable_workflow.yml:15:9:21:6 | Run Step | .github/workflows/cache_write_capable_reusable_workflow.yml:21:9:26:2 | Uses Step | +| .github/workflows/cache_write_capable_reusable_workflow.yml:31:9:32:6 | Uses Step | .github/workflows/cache_write_capable_reusable_workflow.yml:32:9:38:6 | Run Step | +| .github/workflows/cache_write_capable_reusable_workflow.yml:32:9:38:6 | Run Step | .github/workflows/cache_write_capable_reusable_workflow.yml:38:9:40:2 | Run Step | | .github/workflows/cache_write_capable_workflow_dispatch.yml:14:9:15:6 | Uses Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:15:9:21:6 | Run Step | | .github/workflows/cache_write_capable_workflow_dispatch.yml:15:9:21:6 | Run Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:21:9:22:6 | Run Step | | .github/workflows/cache_write_capable_workflow_dispatch.yml:21:9:22:6 | Run Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:22:9:25:33 | Uses Step | @@ -47,4 +51,5 @@ edges | .github/workflows/poisonable_step5.yml:17:9:22:6 | Uses Step | .github/workflows/poisonable_step5.yml:22:9:24:6 | Uses Step | | .github/workflows/poisonable_step5.yml:22:9:24:6 | Uses Step | .github/workflows/poisonable_step5.yml:24:9:28:31 | Uses Step | #select +| .github/workflows/cache_write_capable_reusable_workflow.yml:21:9:26:2 | Uses Step | .github/workflows/cache_write_capable_reusable_workflow.yml:15:9:21:6 | Run Step | .github/workflows/cache_write_capable_reusable_workflow.yml:21:9:26:2 | Uses Step | Potential cache poisoning in the context of the default branch due to privilege checkout of untrusted code. ($@). | .github/workflows/cache_write_capable_reusable_workflow_caller.yml:4:3:4:19 | workflow_dispatch | workflow_dispatch | | .github/workflows/cache_write_capable_workflow_dispatch.yml:22:9:25:33 | Uses Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:15:9:21:6 | Run Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:22:9:25:33 | Uses Step | Potential cache poisoning in the context of the default branch due to privilege checkout of untrusted code. ($@). | .github/workflows/cache_write_capable_workflow_dispatch.yml:2:3:2:19 | workflow_dispatch | workflow_dispatch | diff --git a/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaPoisonableStep.expected b/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaPoisonableStep.expected index 0b637891d8e0..4460256416cf 100644 --- a/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaPoisonableStep.expected +++ b/actions/ql/test/query-tests/Security/CWE-349/CachePoisoningViaPoisonableStep.expected @@ -1,4 +1,8 @@ edges +| .github/workflows/cache_write_capable_reusable_workflow.yml:14:9:15:6 | Uses Step | .github/workflows/cache_write_capable_reusable_workflow.yml:15:9:21:6 | Run Step | +| .github/workflows/cache_write_capable_reusable_workflow.yml:15:9:21:6 | Run Step | .github/workflows/cache_write_capable_reusable_workflow.yml:21:9:26:2 | Uses Step | +| .github/workflows/cache_write_capable_reusable_workflow.yml:31:9:32:6 | Uses Step | .github/workflows/cache_write_capable_reusable_workflow.yml:32:9:38:6 | Run Step | +| .github/workflows/cache_write_capable_reusable_workflow.yml:32:9:38:6 | Run Step | .github/workflows/cache_write_capable_reusable_workflow.yml:38:9:40:2 | Run Step | | .github/workflows/cache_write_capable_workflow_dispatch.yml:14:9:15:6 | Uses Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:15:9:21:6 | Run Step | | .github/workflows/cache_write_capable_workflow_dispatch.yml:15:9:21:6 | Run Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:21:9:22:6 | Run Step | | .github/workflows/cache_write_capable_workflow_dispatch.yml:21:9:22:6 | Run Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:22:9:25:33 | Uses Step | @@ -47,4 +51,5 @@ edges | .github/workflows/poisonable_step5.yml:17:9:22:6 | Uses Step | .github/workflows/poisonable_step5.yml:22:9:24:6 | Uses Step | | .github/workflows/poisonable_step5.yml:22:9:24:6 | Uses Step | .github/workflows/poisonable_step5.yml:24:9:28:31 | Uses Step | #select +| .github/workflows/cache_write_capable_reusable_workflow.yml:38:9:40:2 | Run Step | .github/workflows/cache_write_capable_reusable_workflow.yml:32:9:38:6 | Run Step | .github/workflows/cache_write_capable_reusable_workflow.yml:38:9:40:2 | Run Step | Potential cache poisoning in the context of the default branch due to privilege checkout of untrusted code. ($@). | .github/workflows/cache_write_capable_reusable_workflow_caller.yml:4:3:4:19 | workflow_dispatch | workflow_dispatch | | .github/workflows/cache_write_capable_workflow_dispatch.yml:21:9:22:6 | Run Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:15:9:21:6 | Run Step | .github/workflows/cache_write_capable_workflow_dispatch.yml:21:9:22:6 | Run Step | Potential cache poisoning in the context of the default branch due to privilege checkout of untrusted code. ($@). | .github/workflows/cache_write_capable_workflow_dispatch.yml:2:3:2:19 | workflow_dispatch | workflow_dispatch | From cd7f6b768c08a5be67ce2a3e6d741def117540fc Mon Sep 17 00:00:00 2001 From: JarLob Date: Fri, 31 Jul 2026 16:18:14 +0300 Subject: [PATCH 0061/2098] Remove unreachable workflow_call cache access handling Reusable workflow jobs inherit their callers' trigger events and do not expose workflow_call through getATriggerEvent(). Remove the branch that assumed otherwise, and add coverage for caller resolution and inherited events. --- .../actions/security/CachePoisoningQuery.qll | 16 +++++----------- .../.github/workflows/caller.yml | 5 +++++ .../.github/workflows/reusable.yml | 7 +++++++ .../reusable-workflow-callers/test.expected | 1 + .../reusable-workflow-callers/test.ql | 9 +++++++++ 5 files changed, 27 insertions(+), 11 deletions(-) create mode 100644 actions/ql/test/library-tests/reusable-workflow-callers/.github/workflows/caller.yml create mode 100644 actions/ql/test/library-tests/reusable-workflow-callers/.github/workflows/reusable.yml create mode 100644 actions/ql/test/library-tests/reusable-workflow-callers/test.expected create mode 100644 actions/ql/test/library-tests/reusable-workflow-callers/test.ql diff --git a/actions/ql/lib/codeql/actions/security/CachePoisoningQuery.qll b/actions/ql/lib/codeql/actions/security/CachePoisoningQuery.qll index 52ceb9a94e0c..41529c489ff0 100644 --- a/actions/ql/lib/codeql/actions/security/CachePoisoningQuery.qll +++ b/actions/ql/lib/codeql/actions/security/CachePoisoningQuery.qll @@ -54,19 +54,13 @@ private predicate eventHasDefaultBranchCacheWriteAccess(Event event) { runsOnDefaultBranch(event) and event.getName() = defaultBranchCacheWriteEvent() } -/** Holds if `job` can write to the cache scope of the default branch for `event`. */ +/** + * Holds if `job` can write to the cache scope of the default branch for `event`. + * Reusable workflow jobs inherit their caller's trigger event. + */ predicate hasDefaultBranchCacheWriteAccess(LocalJob job, Event event) { job.getATriggerEvent() = event and - ( - eventHasDefaultBranchCacheWriteAccess(event) - or - // the workflow caller runs in the context of the default branch - event.getName() = "workflow_call" and - exists(ExternalJob caller | - job.getEnclosingWorkflow().(ReusableWorkflow).getACaller() = caller and - eventHasDefaultBranchCacheWriteAccess(caller.getATriggerEvent()) - ) - ) + eventHasDefaultBranchCacheWriteAccess(event) } abstract class CacheWritingStep extends Step { diff --git a/actions/ql/test/library-tests/reusable-workflow-callers/.github/workflows/caller.yml b/actions/ql/test/library-tests/reusable-workflow-callers/.github/workflows/caller.yml new file mode 100644 index 000000000000..12f3016f5d07 --- /dev/null +++ b/actions/ql/test/library-tests/reusable-workflow-callers/.github/workflows/caller.yml @@ -0,0 +1,5 @@ +on: workflow_dispatch + +jobs: + call-reusable: + uses: ./.github/workflows/reusable.yml \ No newline at end of file diff --git a/actions/ql/test/library-tests/reusable-workflow-callers/.github/workflows/reusable.yml b/actions/ql/test/library-tests/reusable-workflow-callers/.github/workflows/reusable.yml new file mode 100644 index 000000000000..f27aeb584fbd --- /dev/null +++ b/actions/ql/test/library-tests/reusable-workflow-callers/.github/workflows/reusable.yml @@ -0,0 +1,7 @@ +on: workflow_call + +jobs: + build: + runs-on: ubuntu-latest + steps: + - run: echo build \ No newline at end of file diff --git a/actions/ql/test/library-tests/reusable-workflow-callers/test.expected b/actions/ql/test/library-tests/reusable-workflow-callers/test.expected new file mode 100644 index 000000000000..4d2bad7a2bf1 --- /dev/null +++ b/actions/ql/test/library-tests/reusable-workflow-callers/test.expected @@ -0,0 +1 @@ +| .github/workflows/reusable.yml:1:1:7:23 | on: workflow_call | .github/workflows/caller.yml:5:5:5:42 | Job: call-reusable | .github/workflows/reusable.yml:5:5:7:23 | Job: build | workflow_dispatch | diff --git a/actions/ql/test/library-tests/reusable-workflow-callers/test.ql b/actions/ql/test/library-tests/reusable-workflow-callers/test.ql new file mode 100644 index 000000000000..544db1647332 --- /dev/null +++ b/actions/ql/test/library-tests/reusable-workflow-callers/test.ql @@ -0,0 +1,9 @@ +import actions + +from ReusableWorkflow workflow, ExternalJob caller, LocalJob job, Event event +where + workflow.getACaller() = caller and + job.getEnclosingWorkflow() = workflow and + caller.getATriggerEvent() = event and + job.getATriggerEvent() = event +select workflow, caller, job, event.getName() From 5b8d0ffaf415436d6ac592542ff88943e42b20aa Mon Sep 17 00:00:00 2001 From: JarLob Date: Fri, 31 Jul 2026 00:56:20 +0300 Subject: [PATCH 0062/2098] C#: Separate ASP.NET Core controller helper methods --- .../frameworks/microsoft/AspNetCore.qll | 84 +++++++++++-------- .../security/dataflow/UrlRedirectQuery.qll | 3 +- 2 files changed, 52 insertions(+), 35 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll index 350465052d1a..fe841bb34f56 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll @@ -189,38 +189,61 @@ class MicrosoftAspNetCoreMvcControllerBaseClass extends Class { } } +private predicate isPotentialMicrosoftAspNetCoreMvcController(Class controller) { + controller = + any(Class c | + ( + exists(Assembly a | + a.getName() = ["Microsoft.AspNetCore.Mvc.Core", "Microsoft.AspNetCore.Mvc.ViewFeatures"] + ) or + exists(UsingNamespaceDirective ns | + ns.getImportedNamespace() instanceof MicrosoftAspNetCoreMvcNamespace + ) + ) and + c.isPublic() and + not c instanceof Generic and + ( + c.getABaseType*() instanceof MicrosoftAspNetCoreMvcControllerBaseClass + or + c.getABaseType*().getName().matches("%Controller") + or + c.getABaseType*() + .getAnAttribute() + .getType() + .getABaseType*() + // ApiControllerAttribute is derived from ControllerAttribute + .hasFullyQualifiedName("Microsoft.AspNetCore.Mvc", "ControllerAttribute") + ) and + not c.getABaseType*().getAnAttribute() instanceof MicrosoftAspNetCoreMvcNonControllerAttribute + ) +} + +/** A class treated as an owner of ASP.NET Core MVC controller helper methods. */ +class MicrosoftAspNetCoreMvcControllerHelperClass extends Class { + MicrosoftAspNetCoreMvcControllerHelperClass() { + isPotentialMicrosoftAspNetCoreMvcController(this) + } + + /** Gets a `Redirect*`, `Accepted*`, or `Created*` method. */ + Method getAResponseMethod() { + result = this.getAMethod() and + ( + result.getName().matches("Redirect%") + or + result.getName().matches("Accepted%") + or + result.getName().matches("Created%") + ) + } +} + /** * A valid ASP.NET Core controller according to: * https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/actions?view=aspnetcore-3.1 * https://github.com/dotnet/aspnetcore/blob/b3c93967ba508b8ef139add27132d9483c1a9eb4/src/Mvc/Mvc.Core/src/Controllers/ControllerFeatureProvider.cs#L39-L75 */ class MicrosoftAspNetCoreMvcController extends Class { - MicrosoftAspNetCoreMvcController() { - ( - exists(Assembly a | - a.getName() = ["Microsoft.AspNetCore.Mvc.Core", "Microsoft.AspNetCore.Mvc.ViewFeatures"] - ) or - exists(UsingNamespaceDirective ns | - ns.getImportedNamespace() instanceof MicrosoftAspNetCoreMvcNamespace - ) - ) and - this.isPublic() and - not this instanceof Generic and - ( - this.getABaseType*() instanceof MicrosoftAspNetCoreMvcControllerBaseClass - or - this.getABaseType*().getName().matches("%Controller") - or - this.getABaseType*() - .getAnAttribute() - .getType() - .getABaseType*() - // ApiControllerAttribute is derived from ControllerAttribute - .hasFullyQualifiedName("Microsoft.AspNetCore.Mvc", "ControllerAttribute") - ) and - not this.getABaseType*().getAnAttribute() instanceof - MicrosoftAspNetCoreMvcNonControllerAttribute - } + MicrosoftAspNetCoreMvcController() { isPotentialMicrosoftAspNetCoreMvcController(this) } /** Gets an action method for this controller. */ Method getAnActionMethod() { @@ -232,14 +255,7 @@ class MicrosoftAspNetCoreMvcController extends Class { /** Gets a `Redirect*` method. */ Method getARedirectMethod() { - result = this.getAMethod() and - ( - result.getName().matches("Redirect%") - or - result.getName().matches("Accepted%") - or - result.getName().matches("Created%") - ) + result = this.(MicrosoftAspNetCoreMvcControllerHelperClass).getAResponseMethod() } } diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/UrlRedirectQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/UrlRedirectQuery.qll index bad6c990fa7b..1e53fccaaea1 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/UrlRedirectQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/UrlRedirectQuery.qll @@ -251,7 +251,8 @@ class AspNetCoreRedirectSink extends Sink { AspNetCoreRedirectSink() { exists(MethodCall mc | mc.getTarget() = any(MicrosoftAspNetCoreHttpHttpResponse response).getRedirectMethod() or - mc.getTarget() = any(MicrosoftAspNetCoreMvcController response).getARedirectMethod() + mc.getTarget() = + any(MicrosoftAspNetCoreMvcControllerHelperClass response).getAResponseMethod() | // Response.Redirect uses 'location' parameter this.getExpr() = mc.getArgumentForName("location") From 1f7d000b2774e80db9a0842b978d008d403300fa Mon Sep 17 00:00:00 2001 From: JarLob Date: Fri, 31 Jul 2026 01:12:58 +0300 Subject: [PATCH 0063/2098] C#: Align ASP.NET Core controller discovery --- .../frameworks/microsoft/AspNetCore.qll | 50 +++++++++-- .../aspremote/aspRemoteFlowSource.expected | 1 - .../frameworks/microsoft/AspNetCore.cs | 83 +++++++++++++++++++ .../frameworks/microsoft/AspNetCore.expected | 7 +- .../microsoft/AspNetCoreActions.expected | 15 ++++ .../frameworks/microsoft/AspNetCoreActions.ql | 9 ++ 6 files changed, 156 insertions(+), 9 deletions(-) create mode 100644 csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected create mode 100644 csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.ql diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll index fe841bb34f56..9c77dd2e03fc 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll @@ -2,6 +2,7 @@ import csharp import semmle.code.csharp.frameworks.Microsoft +private import semmle.code.csharp.frameworks.System /** The `Microsoft.AspNetCore` namespace. */ class MicrosoftAspNetCoreNamespace extends Namespace { @@ -218,6 +219,46 @@ private predicate isPotentialMicrosoftAspNetCoreMvcController(Class controller) ) } +private predicate isDefaultMicrosoftAspNetCoreMvcController(Class controller) { + ( + exists(Assembly a | + a.getName() = ["Microsoft.AspNetCore.Mvc.Core", "Microsoft.AspNetCore.Mvc.ViewFeatures"] + ) or + exists(UsingNamespaceDirective ns | + ns.getImportedNamespace() instanceof MicrosoftAspNetCoreMvcNamespace + ) + ) and + controller instanceof NonNestedType and + controller.isPublic() and + not controller.isAbstract() and + not controller instanceof Generic and + ( + controller.getName().toLowerCase().matches("%controller") + or + controller.getABaseType*() instanceof MicrosoftAspNetCoreMvcControllerBaseClass + or + controller + .getABaseType*() + .getAnAttribute() + .getType() + .getABaseType*() + .hasFullyQualifiedName("Microsoft.AspNetCore.Mvc", "ControllerAttribute") + ) and + not controller.getABaseType*().getAnAttribute() instanceof + MicrosoftAspNetCoreMvcNonControllerAttribute +} + +private predicate isDefaultMicrosoftAspNetCoreMvcAction(Class controller, Method method) { + controller.hasMember(method) and + method.isPublic() and + not method.isStatic() and + not method.isAbstract() and + not method.getUnboundDeclaration() instanceof UnboundGenericMethod and + not method.getOverridee*().getAnAttribute() instanceof MicrosoftAspNetCoreMvcNonActionAttribute and + not method.getOverridee*().getDeclaringType() instanceof ObjectType and + not method instanceof DisposeMethod +} + /** A class treated as an owner of ASP.NET Core MVC controller helper methods. */ class MicrosoftAspNetCoreMvcControllerHelperClass extends Class { MicrosoftAspNetCoreMvcControllerHelperClass() { @@ -243,15 +284,10 @@ class MicrosoftAspNetCoreMvcControllerHelperClass extends Class { * https://github.com/dotnet/aspnetcore/blob/b3c93967ba508b8ef139add27132d9483c1a9eb4/src/Mvc/Mvc.Core/src/Controllers/ControllerFeatureProvider.cs#L39-L75 */ class MicrosoftAspNetCoreMvcController extends Class { - MicrosoftAspNetCoreMvcController() { isPotentialMicrosoftAspNetCoreMvcController(this) } + MicrosoftAspNetCoreMvcController() { isDefaultMicrosoftAspNetCoreMvcController(this) } /** Gets an action method for this controller. */ - Method getAnActionMethod() { - result = this.getAMethod() and - result.isPublic() and - not result.isStatic() and - not result.getAnAttribute() instanceof MicrosoftAspNetCoreMvcNonActionAttribute - } + Method getAnActionMethod() { isDefaultMicrosoftAspNetCoreMvcAction(this, result) } /** Gets a `Redirect*` method. */ Method getARedirectMethod() { diff --git a/csharp/ql/test/library-tests/dataflow/flowsources/aspremote/aspRemoteFlowSource.expected b/csharp/ql/test/library-tests/dataflow/flowsources/aspremote/aspRemoteFlowSource.expected index ef7a8f3cd784..2d725fae7601 100644 --- a/csharp/ql/test/library-tests/dataflow/flowsources/aspremote/aspRemoteFlowSource.expected +++ b/csharp/ql/test/library-tests/dataflow/flowsources/aspremote/aspRemoteFlowSource.expected @@ -13,7 +13,6 @@ remoteFlowSources | AspRemoteFlowSource.cs:53:63:53:73 | mapPutParam | | AspRemoteFlowSource.cs:54:69:54:82 | mapDeleteParam | | AspRemoteFlowSource.cs:56:41:56:44 | item | -| AspRemoteFlowSource.cs:64:43:64:47 | param | | AspRemoteFlowSource.cs:71:34:71:35 | id | | AspRemoteFlowSource.cs:73:35:73:41 | command | | AspRemoteFlowSource.cs:73:48:73:52 | count | diff --git a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs index bcf0c766f340..967ea1d03a3e 100644 --- a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs +++ b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs @@ -101,3 +101,86 @@ public string Index() return "This is Home Controller"; } } + +// has case-insensitive suffix "Controller" +public class LowerCasecontroller +{ + public void Action() { } +} + +// derives from ControllerBase, whose [Controller] attribute is inherited +public class Products : ControllerBase +{ + public void List() { } +} + +// is a nested type +public class ControllerContainer +{ + public class NestedController + { + public void Action() { } + } +} + +// only this base class has the Controller suffix +public class PlainController +{ + public void BaseAction() { } +} + +public class DerivedFromPlain : PlainController +{ + public void DerivedAction() { } +} + +// is a closed subclass of an open generic controller +public class GenericBaseController : ControllerBase +{ + public void GenericBaseAction(string input) { } +} + +public class ClosedGenericController : GenericBaseController +{ + public void ClosedAction(string input) { } +} + +[Controller] +public abstract class AbstractActionBase +{ + public abstract void AbstractAction(string input); + + public void InheritedAction(string input) { } + + [NonAction] + public virtual void InheritedNonAction(string input) { } +} + +public class ConcreteActionEndpoint : AbstractActionBase +{ + public override void AbstractAction(string input) { } + + public override void InheritedNonAction(string input) { } +} + +public class ActionCasesController : ControllerBase, System.IDisposable +{ + public void PublicAction(string input) { } + + public static void StaticAction(string input) { } + + public void GenericAction(T input) { } + + [NonAction] + public void ExplicitNonAction(string input) { } + + public override string ToString() => "action cases"; + + public void Dispose() { } + + protected void ProtectedAction(string input) { } + + internal void InternalAction(string input) { } + + private void PrivateAction(string input) { } +} diff --git a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected index e9866698ccdc..809e657405e3 100644 --- a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected +++ b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected @@ -4,4 +4,9 @@ | AspNetCore.cs:32:14:32:28 | HomeController3 | | AspNetCore.cs:42:14:42:28 | HomeController4 | | AspNetCore.cs:51:14:51:28 | HomeController5 | -| AspNetCore.cs:60:23:60:37 | HomeController6 | +| AspNetCore.cs:106:14:106:32 | LowerCasecontroller | +| AspNetCore.cs:112:14:112:21 | Products | +| AspNetCore.cs:127:14:127:28 | PlainController | +| AspNetCore.cs:143:14:143:36 | ClosedGenericController | +| AspNetCore.cs:159:14:159:35 | ConcreteActionEndpoint | +| AspNetCore.cs:166:14:166:34 | ActionCasesController | diff --git a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected new file mode 100644 index 000000000000..98307a1521ad --- /dev/null +++ b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected @@ -0,0 +1,15 @@ +| AspNetCore.cs:4:14:4:27 | HomeController | AspNetCore.cs:6:19:6:23 | Index | +| AspNetCore.cs:13:14:13:28 | HomeController1 | AspNetCore.cs:15:19:15:23 | Index | +| AspNetCore.cs:22:14:22:28 | HomeController2 | AspNetCore.cs:24:19:24:23 | Index | +| AspNetCore.cs:32:14:32:28 | HomeController3 | AspNetCore.cs:34:19:34:23 | Index | +| AspNetCore.cs:42:14:42:28 | HomeController4 | AspNetCore.cs:44:19:44:23 | Index | +| AspNetCore.cs:51:14:51:28 | HomeController5 | AspNetCore.cs:44:19:44:23 | Index | +| AspNetCore.cs:51:14:51:28 | HomeController5 | AspNetCore.cs:53:19:53:23 | Index | +| AspNetCore.cs:106:14:106:32 | LowerCasecontroller | AspNetCore.cs:108:17:108:22 | Action | +| AspNetCore.cs:112:14:112:21 | Products | AspNetCore.cs:114:17:114:20 | List | +| AspNetCore.cs:127:14:127:28 | PlainController | AspNetCore.cs:129:17:129:26 | BaseAction | +| AspNetCore.cs:143:14:143:36 | ClosedGenericController | AspNetCore.cs:140:17:140:33 | GenericBaseAction | +| AspNetCore.cs:143:14:143:36 | ClosedGenericController | AspNetCore.cs:145:17:145:28 | ClosedAction | +| AspNetCore.cs:159:14:159:35 | ConcreteActionEndpoint | AspNetCore.cs:153:17:153:31 | InheritedAction | +| AspNetCore.cs:159:14:159:35 | ConcreteActionEndpoint | AspNetCore.cs:161:26:161:39 | AbstractAction | +| AspNetCore.cs:166:14:166:34 | ActionCasesController | AspNetCore.cs:168:17:168:28 | PublicAction | diff --git a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.ql b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.ql new file mode 100644 index 000000000000..f4e927cd0b07 --- /dev/null +++ b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.ql @@ -0,0 +1,9 @@ +import csharp +import semmle.code.csharp.frameworks.microsoft.AspNetCore + +from MicrosoftAspNetCoreMvcController controller, Method action +where + controller.fromSource() and + action = controller.getAnActionMethod() and + action.fromSource() +select controller, action From 9921b891fe320884467fecdb8f07e58f9749675c Mon Sep 17 00:00:00 2001 From: JarLob Date: Fri, 31 Jul 2026 01:19:44 +0300 Subject: [PATCH 0064/2098] C#: Exclude injected MVC services from remote input --- .../security/dataflow/flowsources/Remote.qll | 14 +++++- .../aspremote/AspRemoteFlowSource.cs | 22 +++++++++ .../aspremote/aspRemoteFlowSource.expected | 45 ++++++++++--------- 3 files changed, 60 insertions(+), 21 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Remote.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Remote.qll index 68c06a1828de..d0358f6803fc 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Remote.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Remote.qll @@ -306,7 +306,19 @@ class AspNetCoreActionMethodParameter extends AspNetCoreRemoteFlowSource, DataFl AspNetCoreActionMethodParameter() { exists(Parameter p | p = this.getParameter() and - p.fromSource() + p.fromSource() and + not exists(Attribute attr, ValueOrRefType attributeBase | attr = p.getAnAttribute() | + attributeBase = attr.getType().getABaseType*() and + ( + attributeBase + .getABaseInterface*() + .hasFullyQualifiedName("Microsoft.AspNetCore.Http.Metadata", "IFromServiceMetadata") + or + attributeBase + .hasFullyQualifiedName("Microsoft.Extensions.DependencyInjection", + "FromKeyedServicesAttribute") + ) + ) | p = any(MicrosoftAspNetCoreMvcController c).getAnActionMethod().getAParameter() ) diff --git a/csharp/ql/test/library-tests/dataflow/flowsources/aspremote/AspRemoteFlowSource.cs b/csharp/ql/test/library-tests/dataflow/flowsources/aspremote/AspRemoteFlowSource.cs index 5bc8025f231b..d7b085ef61fd 100644 --- a/csharp/ql/test/library-tests/dataflow/flowsources/aspremote/AspRemoteFlowSource.cs +++ b/csharp/ql/test/library-tests/dataflow/flowsources/aspremote/AspRemoteFlowSource.cs @@ -1,5 +1,6 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.DependencyInjection; using System; namespace Testing @@ -21,6 +22,27 @@ public object MyAction(ViewModel viewModel) { throw null; } + + public void BindingSources( + string ordinary, + [FromQuery] string fromQuery, + [FromBody] string fromBody, + [FromRoute] string fromRoute, + [FromHeader] string fromHeader, + [FromServices] IRequestService fromServices, + [CustomFromServices] IRequestService customFromServices, + [FromKeyedServices("cache")] IRequestService fromKeyedServices, + [CustomFromKeyedServices] IRequestService customFromKeyedServices) + { } + } + + public interface IRequestService { } + + public sealed class CustomFromServicesAttribute : FromServicesAttribute { } + + public sealed class CustomFromKeyedServicesAttribute : FromKeyedServicesAttribute + { + public CustomFromKeyedServicesAttribute() : base("custom") { } } public class Item diff --git a/csharp/ql/test/library-tests/dataflow/flowsources/aspremote/aspRemoteFlowSource.expected b/csharp/ql/test/library-tests/dataflow/flowsources/aspremote/aspRemoteFlowSource.expected index 2d725fae7601..6ba2741857b5 100644 --- a/csharp/ql/test/library-tests/dataflow/flowsources/aspremote/aspRemoteFlowSource.expected +++ b/csharp/ql/test/library-tests/dataflow/flowsources/aspremote/aspRemoteFlowSource.expected @@ -1,22 +1,27 @@ remoteFlowSourceMembers -| AspRemoteFlowSource.cs:10:23:10:31 | RequestId | -| AspRemoteFlowSource.cs:11:23:11:36 | RequestIdField | -| AspRemoteFlowSource.cs:28:23:28:29 | Tainted | +| AspRemoteFlowSource.cs:11:23:11:31 | RequestId | +| AspRemoteFlowSource.cs:12:23:12:36 | RequestIdField | +| AspRemoteFlowSource.cs:50:23:50:29 | Tainted | remoteFlowSources -| AspRemoteFlowSource.cs:20:42:20:50 | viewModel | -| AspRemoteFlowSource.cs:35:42:35:46 | param | -| AspRemoteFlowSource.cs:43:58:43:63 | newUrl | -| AspRemoteFlowSource.cs:44:61:44:65 | myApi | -| AspRemoteFlowSource.cs:44:75:44:79 | myUrl | -| AspRemoteFlowSource.cs:46:46:46:56 | lambdaParam | -| AspRemoteFlowSource.cs:52:65:52:76 | mapPostParam | -| AspRemoteFlowSource.cs:53:63:53:73 | mapPutParam | -| AspRemoteFlowSource.cs:54:69:54:82 | mapDeleteParam | -| AspRemoteFlowSource.cs:56:41:56:44 | item | -| AspRemoteFlowSource.cs:71:34:71:35 | id | -| AspRemoteFlowSource.cs:73:35:73:41 | command | -| AspRemoteFlowSource.cs:73:48:73:52 | count | -| AspRemoteFlowSource.cs:75:40:75:43 | data | -| AspRemoteFlowSource.cs:77:34:77:38 | value | -| AspRemoteFlowSource.cs:79:37:79:42 | itemId | -| AspRemoteFlowSource.cs:92:35:92:46 | derivedParam | +| AspRemoteFlowSource.cs:21:42:21:50 | viewModel | +| AspRemoteFlowSource.cs:27:20:27:27 | ordinary | +| AspRemoteFlowSource.cs:28:32:28:40 | fromQuery | +| AspRemoteFlowSource.cs:29:31:29:38 | fromBody | +| AspRemoteFlowSource.cs:30:32:30:40 | fromRoute | +| AspRemoteFlowSource.cs:31:33:31:42 | fromHeader | +| AspRemoteFlowSource.cs:57:42:57:46 | param | +| AspRemoteFlowSource.cs:65:58:65:63 | newUrl | +| AspRemoteFlowSource.cs:66:61:66:65 | myApi | +| AspRemoteFlowSource.cs:66:75:66:79 | myUrl | +| AspRemoteFlowSource.cs:68:46:68:56 | lambdaParam | +| AspRemoteFlowSource.cs:74:65:74:76 | mapPostParam | +| AspRemoteFlowSource.cs:75:63:75:73 | mapPutParam | +| AspRemoteFlowSource.cs:76:69:76:82 | mapDeleteParam | +| AspRemoteFlowSource.cs:78:41:78:44 | item | +| AspRemoteFlowSource.cs:93:34:93:35 | id | +| AspRemoteFlowSource.cs:95:35:95:41 | command | +| AspRemoteFlowSource.cs:95:48:95:52 | count | +| AspRemoteFlowSource.cs:97:40:97:43 | data | +| AspRemoteFlowSource.cs:99:34:99:38 | value | +| AspRemoteFlowSource.cs:101:37:101:42 | itemId | +| AspRemoteFlowSource.cs:114:35:114:46 | derivedParam | From 526f4383424cfcc965d8de07d27436c8648fec43 Mon Sep 17 00:00:00 2001 From: JarLob Date: Fri, 31 Jul 2026 01:38:08 +0300 Subject: [PATCH 0065/2098] C#: Scope convention-based controllers to MVC apps --- .../Controllers.expected | 3 + .../Controllers.ql | 6 ++ .../GeneratedController.cs | 6 ++ .../GeneratedControllers.csproj | 5 + .../IncludedControllers/IncludedController.cs | 6 ++ .../IncludedControllers.csproj | 5 + .../Unrelated/ThrottlingController.cs | 4 + .../Unrelated/Unrelated.csproj | 5 + .../WebApp/ApplicationParts.cs | 3 + .../WebApp/Program.cs | 12 +++ .../WebApp/WebApp.csproj | 9 ++ .../WebApp/WebPocoController.cs | 4 + .../global.json | 5 + .../aspnetcore_controller_discovery/test.py | 7 ++ .../frameworks/microsoft/AspNetCore.qll | 91 +++++++++++++++---- .../frameworks/microsoft/AspNetCore.cs | 9 ++ .../frameworks/microsoft/AspNetCore.expected | 24 ++--- .../microsoft/AspNetCoreActions.expected | 30 +++--- 18 files changed, 190 insertions(+), 44 deletions(-) create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.ql create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/GeneratedControllers/GeneratedController.cs create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/GeneratedControllers/GeneratedControllers.csproj create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/IncludedControllers/IncludedController.cs create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/IncludedControllers/IncludedControllers.csproj create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Unrelated/ThrottlingController.cs create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Unrelated/Unrelated.csproj create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/ApplicationParts.cs create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/Program.cs create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/WebApp.csproj create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/WebPocoController.cs create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/global.json create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/test.py diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected new file mode 100644 index 000000000000..730310ba30a3 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected @@ -0,0 +1,3 @@ +| GeneratedController.cs | GeneratedController | +| IncludedController.cs | IncludedController | +| WebPocoController.cs | WebPocoController | \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.ql b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.ql new file mode 100644 index 000000000000..325f55434f5f --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.ql @@ -0,0 +1,6 @@ +import csharp +import semmle.code.csharp.frameworks.microsoft.AspNetCore + +from MicrosoftAspNetCoreMvcController controller +where controller.fromSource() +select controller.getFile().getBaseName(), controller.getName() diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/GeneratedControllers/GeneratedController.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/GeneratedControllers/GeneratedController.cs new file mode 100644 index 000000000000..0fe26a40d27b --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/GeneratedControllers/GeneratedController.cs @@ -0,0 +1,6 @@ +namespace GeneratedControllers; + +public class GeneratedController +{ + public void Action(string input) => _ = GetType().Name + input; +} \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/GeneratedControllers/GeneratedControllers.csproj b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/GeneratedControllers/GeneratedControllers.csproj new file mode 100644 index 000000000000..10f1ac4e07e4 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/GeneratedControllers/GeneratedControllers.csproj @@ -0,0 +1,5 @@ + + + net10.0 + + \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/IncludedControllers/IncludedController.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/IncludedControllers/IncludedController.cs new file mode 100644 index 000000000000..04704dd9b064 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/IncludedControllers/IncludedController.cs @@ -0,0 +1,6 @@ +namespace IncludedControllers; + +public class IncludedController +{ + public void Action(string input) => _ = GetType().Name + input; +} \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/IncludedControllers/IncludedControllers.csproj b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/IncludedControllers/IncludedControllers.csproj new file mode 100644 index 000000000000..10f1ac4e07e4 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/IncludedControllers/IncludedControllers.csproj @@ -0,0 +1,5 @@ + + + net10.0 + + \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Unrelated/ThrottlingController.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Unrelated/ThrottlingController.cs new file mode 100644 index 000000000000..d4277061e9fa --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Unrelated/ThrottlingController.cs @@ -0,0 +1,4 @@ +public class ThrottlingController +{ + public void Initialize(string input) => _ = GetType().Name + input; +} \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Unrelated/Unrelated.csproj b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Unrelated/Unrelated.csproj new file mode 100644 index 000000000000..10f1ac4e07e4 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Unrelated/Unrelated.csproj @@ -0,0 +1,5 @@ + + + net10.0 + + \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/ApplicationParts.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/ApplicationParts.cs new file mode 100644 index 000000000000..a7622ef5f9be --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/ApplicationParts.cs @@ -0,0 +1,3 @@ +using Microsoft.AspNetCore.Mvc.ApplicationParts; + +[assembly: ApplicationPart("GeneratedControllers")] \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/Program.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/Program.cs new file mode 100644 index 000000000000..8db4f837d75d --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/Program.cs @@ -0,0 +1,12 @@ +using IncludedControllers; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; + +var builder = WebApplication.CreateBuilder(args); +builder.Services + .AddControllers() + .AddApplicationPart(typeof(IncludedController).Assembly); + +var app = builder.Build(); +app.MapControllers(); +app.Run(); \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/WebApp.csproj b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/WebApp.csproj new file mode 100644 index 000000000000..56bc24531254 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/WebApp.csproj @@ -0,0 +1,9 @@ + + + net10.0 + + + + + + \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/WebPocoController.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/WebPocoController.cs new file mode 100644 index 000000000000..338ebd5abe67 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/WebPocoController.cs @@ -0,0 +1,4 @@ +public class WebPocoController +{ + public void Action(string input) => _ = GetType().Name + input; +} \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/global.json b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/global.json new file mode 100644 index 000000000000..7307ac0a4729 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/global.json @@ -0,0 +1,5 @@ +{ + "sdk": { + "version": "10.0.201" + } +} \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/test.py b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/test.py new file mode 100644 index 000000000000..66f5e8666b02 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/test.py @@ -0,0 +1,7 @@ +def test(codeql, csharp): + codeql.database.create( + command=[ + "dotnet build -t:Rebuild WebApp/WebApp.csproj", + "dotnet build -t:Rebuild Unrelated/Unrelated.csproj", + ] + ) \ No newline at end of file diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll index 9c77dd2e03fc..e49f6f509984 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll @@ -2,6 +2,7 @@ import csharp import semmle.code.csharp.frameworks.Microsoft +private import semmle.code.csharp.commons.Compilation private import semmle.code.csharp.frameworks.System /** The `Microsoft.AspNetCore` namespace. */ @@ -219,30 +220,86 @@ private predicate isPotentialMicrosoftAspNetCoreMvcController(Class controller) ) } +private Compilation getACompilationFor(Element element) { + result.getAFileCompiled() = element.getFile() +} + +private Assembly getAnAssemblyFor(Type type) { + result = getACompilationFor(type).getOutputAssembly() +} + +private predicate isMicrosoftAspNetCoreMvcRegistration(MethodCall call) { + call.getTarget() + .hasFullyQualifiedName("Microsoft.Extensions.DependencyInjection", + ["MvcServiceCollectionExtensions", "MvcCoreServiceCollectionExtensions"], + ["AddControllers", "AddControllersWithViews", "AddMvc", "AddMvcCore"]) +} + +private predicate isMicrosoftAspNetCoreMvcApplication(Compilation compilation) { + exists(MethodCall registration | + isMicrosoftAspNetCoreMvcRegistration(registration) and + compilation.getAFileCompiled() = registration.getFile() + ) +} + +private predicate isMicrosoftAspNetCoreMvcAddApplicationPart(MethodCall call) { + call.getTarget() + .hasFullyQualifiedName("Microsoft.Extensions.DependencyInjection", + ["MvcCoreMvcBuilderExtensions", "MvcCoreMvcCoreBuilderExtensions"], "AddApplicationPart") +} + +private predicate isMicrosoftAspNetCoreMvcApplicationPart(Compilation application, Assembly part) { + part = application.getOutputAssembly() + or + exists(AssemblyAttribute attr, StringLiteral assemblyName | + application.getAFileCompiled() = attr.getFile() and + attr.getType() + .hasFullyQualifiedName("Microsoft.AspNetCore.Mvc.ApplicationParts", + "ApplicationPartAttribute") and + assemblyName = attr.getArgument(0) and + assemblyName.getValue() = part.getName() + ) + or + exists(MethodCall addPart, PropertyAccess assemblyAccess, TypeofExpr typeOf, Type partType | + application.getAFileCompiled() = addPart.getFile() and + isMicrosoftAspNetCoreMvcAddApplicationPart(addPart) and + assemblyAccess = addPart.getArgumentForName("assembly") and + assemblyAccess.getTarget().hasName("Assembly") and + assemblyAccess.getQualifier() = typeOf and + partType = typeOf.getTypeAccess().getTarget() and + part = getAnAssemblyFor(partType) + ) +} + +private predicate isInMicrosoftAspNetCoreMvcApplication(Class controller) { + exists(Compilation application, Assembly controllerAssembly | + isMicrosoftAspNetCoreMvcApplication(application) and + controllerAssembly = getAnAssemblyFor(controller) and + isMicrosoftAspNetCoreMvcApplicationPart(application, controllerAssembly) + ) +} + +private predicate hasMicrosoftAspNetCoreMvcControllerIdentity(Class controller) { + controller.getABaseType*() instanceof MicrosoftAspNetCoreMvcControllerBaseClass + or + controller + .getABaseType*() + .getAnAttribute() + .getType() + .getABaseType*() + .hasFullyQualifiedName("Microsoft.AspNetCore.Mvc", "ControllerAttribute") +} + private predicate isDefaultMicrosoftAspNetCoreMvcController(Class controller) { - ( - exists(Assembly a | - a.getName() = ["Microsoft.AspNetCore.Mvc.Core", "Microsoft.AspNetCore.Mvc.ViewFeatures"] - ) or - exists(UsingNamespaceDirective ns | - ns.getImportedNamespace() instanceof MicrosoftAspNetCoreMvcNamespace - ) - ) and controller instanceof NonNestedType and controller.isPublic() and not controller.isAbstract() and not controller instanceof Generic and ( - controller.getName().toLowerCase().matches("%controller") - or - controller.getABaseType*() instanceof MicrosoftAspNetCoreMvcControllerBaseClass + hasMicrosoftAspNetCoreMvcControllerIdentity(controller) or - controller - .getABaseType*() - .getAnAttribute() - .getType() - .getABaseType*() - .hasFullyQualifiedName("Microsoft.AspNetCore.Mvc", "ControllerAttribute") + controller.getName().toLowerCase().matches("%controller") and + isInMicrosoftAspNetCoreMvcApplication(controller) ) and not controller.getABaseType*().getAnAttribute() instanceof MicrosoftAspNetCoreMvcNonControllerAttribute diff --git a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs index 967ea1d03a3e..aa9af201259c 100644 --- a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs +++ b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs @@ -1,4 +1,13 @@ using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.DependencyInjection; + +public static class MvcRegistration +{ + public static void Register(IServiceCollection services) + { + services.AddControllers(); + } +} // has sufix "Controller" public class HomeController diff --git a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected index 809e657405e3..f62e295c1080 100644 --- a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected +++ b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected @@ -1,12 +1,12 @@ -| AspNetCore.cs:4:14:4:27 | HomeController | -| AspNetCore.cs:13:14:13:28 | HomeController1 | -| AspNetCore.cs:22:14:22:28 | HomeController2 | -| AspNetCore.cs:32:14:32:28 | HomeController3 | -| AspNetCore.cs:42:14:42:28 | HomeController4 | -| AspNetCore.cs:51:14:51:28 | HomeController5 | -| AspNetCore.cs:106:14:106:32 | LowerCasecontroller | -| AspNetCore.cs:112:14:112:21 | Products | -| AspNetCore.cs:127:14:127:28 | PlainController | -| AspNetCore.cs:143:14:143:36 | ClosedGenericController | -| AspNetCore.cs:159:14:159:35 | ConcreteActionEndpoint | -| AspNetCore.cs:166:14:166:34 | ActionCasesController | +| AspNetCore.cs:13:14:13:27 | HomeController | +| AspNetCore.cs:22:14:22:28 | HomeController1 | +| AspNetCore.cs:31:14:31:28 | HomeController2 | +| AspNetCore.cs:41:14:41:28 | HomeController3 | +| AspNetCore.cs:51:14:51:28 | HomeController4 | +| AspNetCore.cs:60:14:60:28 | HomeController5 | +| AspNetCore.cs:115:14:115:32 | LowerCasecontroller | +| AspNetCore.cs:121:14:121:21 | Products | +| AspNetCore.cs:136:14:136:28 | PlainController | +| AspNetCore.cs:152:14:152:36 | ClosedGenericController | +| AspNetCore.cs:168:14:168:35 | ConcreteActionEndpoint | +| AspNetCore.cs:175:14:175:34 | ActionCasesController | diff --git a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected index 98307a1521ad..bd8e266fcd8a 100644 --- a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected +++ b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected @@ -1,15 +1,15 @@ -| AspNetCore.cs:4:14:4:27 | HomeController | AspNetCore.cs:6:19:6:23 | Index | -| AspNetCore.cs:13:14:13:28 | HomeController1 | AspNetCore.cs:15:19:15:23 | Index | -| AspNetCore.cs:22:14:22:28 | HomeController2 | AspNetCore.cs:24:19:24:23 | Index | -| AspNetCore.cs:32:14:32:28 | HomeController3 | AspNetCore.cs:34:19:34:23 | Index | -| AspNetCore.cs:42:14:42:28 | HomeController4 | AspNetCore.cs:44:19:44:23 | Index | -| AspNetCore.cs:51:14:51:28 | HomeController5 | AspNetCore.cs:44:19:44:23 | Index | -| AspNetCore.cs:51:14:51:28 | HomeController5 | AspNetCore.cs:53:19:53:23 | Index | -| AspNetCore.cs:106:14:106:32 | LowerCasecontroller | AspNetCore.cs:108:17:108:22 | Action | -| AspNetCore.cs:112:14:112:21 | Products | AspNetCore.cs:114:17:114:20 | List | -| AspNetCore.cs:127:14:127:28 | PlainController | AspNetCore.cs:129:17:129:26 | BaseAction | -| AspNetCore.cs:143:14:143:36 | ClosedGenericController | AspNetCore.cs:140:17:140:33 | GenericBaseAction | -| AspNetCore.cs:143:14:143:36 | ClosedGenericController | AspNetCore.cs:145:17:145:28 | ClosedAction | -| AspNetCore.cs:159:14:159:35 | ConcreteActionEndpoint | AspNetCore.cs:153:17:153:31 | InheritedAction | -| AspNetCore.cs:159:14:159:35 | ConcreteActionEndpoint | AspNetCore.cs:161:26:161:39 | AbstractAction | -| AspNetCore.cs:166:14:166:34 | ActionCasesController | AspNetCore.cs:168:17:168:28 | PublicAction | +| AspNetCore.cs:13:14:13:27 | HomeController | AspNetCore.cs:15:19:15:23 | Index | +| AspNetCore.cs:22:14:22:28 | HomeController1 | AspNetCore.cs:24:19:24:23 | Index | +| AspNetCore.cs:31:14:31:28 | HomeController2 | AspNetCore.cs:33:19:33:23 | Index | +| AspNetCore.cs:41:14:41:28 | HomeController3 | AspNetCore.cs:43:19:43:23 | Index | +| AspNetCore.cs:51:14:51:28 | HomeController4 | AspNetCore.cs:53:19:53:23 | Index | +| AspNetCore.cs:60:14:60:28 | HomeController5 | AspNetCore.cs:53:19:53:23 | Index | +| AspNetCore.cs:60:14:60:28 | HomeController5 | AspNetCore.cs:62:19:62:23 | Index | +| AspNetCore.cs:115:14:115:32 | LowerCasecontroller | AspNetCore.cs:117:17:117:22 | Action | +| AspNetCore.cs:121:14:121:21 | Products | AspNetCore.cs:123:17:123:20 | List | +| AspNetCore.cs:136:14:136:28 | PlainController | AspNetCore.cs:138:17:138:26 | BaseAction | +| AspNetCore.cs:152:14:152:36 | ClosedGenericController | AspNetCore.cs:149:17:149:33 | GenericBaseAction | +| AspNetCore.cs:152:14:152:36 | ClosedGenericController | AspNetCore.cs:154:17:154:28 | ClosedAction | +| AspNetCore.cs:168:14:168:35 | ConcreteActionEndpoint | AspNetCore.cs:162:17:162:31 | InheritedAction | +| AspNetCore.cs:168:14:168:35 | ConcreteActionEndpoint | AspNetCore.cs:170:26:170:39 | AbstractAction | +| AspNetCore.cs:175:14:175:34 | ActionCasesController | AspNetCore.cs:177:17:177:28 | PublicAction | From 93dac2c9e49509d0403bd42ce77389cc9f746705 Mon Sep 17 00:00:00 2001 From: JarLob Date: Fri, 31 Jul 2026 01:48:06 +0300 Subject: [PATCH 0066/2098] C#: Account for MVC endpoint mappings --- .../AttributePocoController.cs | 8 ++ .../AttributeWebApp/AttributeWebApp.csproj | 5 ++ .../ConventionOnlyController.cs | 4 + .../AttributeWebApp/Program.cs | 9 +++ .../Controllers.expected | 8 +- .../UnmappedWebApp/Program.cs | 8 ++ .../UnmappedWebApp/StructuralController.cs | 6 ++ .../UnmappedWebApp/UnmappedPocoController.cs | 4 + .../UnmappedWebApp/UnmappedWebApp.csproj | 5 ++ .../WebApp/Program.cs | 4 +- .../aspnetcore_controller_discovery/test.py | 4 +- .../frameworks/microsoft/AspNetCore.qll | 77 +++++++++++++++++-- .../frameworks/microsoft/AspNetCore.cs | 5 +- .../frameworks/microsoft/AspNetCore.expected | 24 +++--- .../microsoft/AspNetCoreActions.expected | 30 ++++---- 15 files changed, 160 insertions(+), 41 deletions(-) create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/AttributePocoController.cs create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/AttributeWebApp.csproj create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/ConventionOnlyController.cs create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/Program.cs create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/Program.cs create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/StructuralController.cs create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/UnmappedPocoController.cs create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/UnmappedWebApp.csproj diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/AttributePocoController.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/AttributePocoController.cs new file mode 100644 index 000000000000..f4427cc21c48 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/AttributePocoController.cs @@ -0,0 +1,8 @@ +using Microsoft.AspNetCore.Mvc; + +[Route("api/attribute")] +public class AttributePocoController +{ + [HttpGet] + public void Action(string input) => _ = GetType().Name + input; +} \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/AttributeWebApp.csproj b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/AttributeWebApp.csproj new file mode 100644 index 000000000000..bddc74e0c784 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/AttributeWebApp.csproj @@ -0,0 +1,5 @@ + + + net10.0 + + \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/ConventionOnlyController.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/ConventionOnlyController.cs new file mode 100644 index 000000000000..f1222ad5f181 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/ConventionOnlyController.cs @@ -0,0 +1,4 @@ +public class ConventionOnlyController +{ + public void Action(string input) => _ = GetType().Name + input; +} \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/Program.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/Program.cs new file mode 100644 index 000000000000..8d74291b16a8 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/Program.cs @@ -0,0 +1,9 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; + +var builder = WebApplication.CreateBuilder(args); +builder.Services.AddControllers(); + +var app = builder.Build(); +app.MapControllers(); +app.Run(); \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected index 730310ba30a3..22c2ca299300 100644 --- a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected @@ -1,3 +1,5 @@ -| GeneratedController.cs | GeneratedController | -| IncludedController.cs | IncludedController | -| WebPocoController.cs | WebPocoController | \ No newline at end of file +| AttributePocoController.cs | AttributePocoController | +| GeneratedController.cs | GeneratedController | +| IncludedController.cs | IncludedController | +| StructuralController.cs | StructuralController | +| WebPocoController.cs | WebPocoController | \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/Program.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/Program.cs new file mode 100644 index 000000000000..6cf99003feb3 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/Program.cs @@ -0,0 +1,8 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; + +var builder = WebApplication.CreateBuilder(args); +builder.Services.AddControllers(); + +var app = builder.Build(); +app.Run(); \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/StructuralController.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/StructuralController.cs new file mode 100644 index 000000000000..dd9e5e2534b5 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/StructuralController.cs @@ -0,0 +1,6 @@ +using Microsoft.AspNetCore.Mvc; + +public class StructuralController : ControllerBase +{ + public void Action(string input) => _ = GetType().Name + input; +} \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/UnmappedPocoController.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/UnmappedPocoController.cs new file mode 100644 index 000000000000..99514ceb2c3f --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/UnmappedPocoController.cs @@ -0,0 +1,4 @@ +public class UnmappedPocoController +{ + public void Action(string input) => _ = GetType().Name + input; +} \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/UnmappedWebApp.csproj b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/UnmappedWebApp.csproj new file mode 100644 index 000000000000..bddc74e0c784 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/UnmappedWebApp.csproj @@ -0,0 +1,5 @@ + + + net10.0 + + \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/Program.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/Program.cs index 8db4f837d75d..a58be59888d9 100644 --- a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/Program.cs +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/Program.cs @@ -8,5 +8,5 @@ .AddApplicationPart(typeof(IncludedController).Assembly); var app = builder.Build(); -app.MapControllers(); -app.Run(); \ No newline at end of file +app.MapControllerRoute("default", "{controller}/{action}"); +app.Run(); diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/test.py b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/test.py index 66f5e8666b02..8e705bd10c06 100644 --- a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/test.py +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/test.py @@ -2,6 +2,8 @@ def test(codeql, csharp): codeql.database.create( command=[ "dotnet build -t:Rebuild WebApp/WebApp.csproj", + "dotnet build -t:Rebuild AttributeWebApp/AttributeWebApp.csproj", + "dotnet build -t:Rebuild UnmappedWebApp/UnmappedWebApp.csproj", "dotnet build -t:Rebuild Unrelated/Unrelated.csproj", ] - ) \ No newline at end of file + ) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll index e49f6f509984..1717ebc218f0 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll @@ -271,11 +271,71 @@ private predicate isMicrosoftAspNetCoreMvcApplicationPart(Compilation applicatio ) } -private predicate isInMicrosoftAspNetCoreMvcApplication(Class controller) { - exists(Compilation application, Assembly controllerAssembly | - isMicrosoftAspNetCoreMvcApplication(application) and - controllerAssembly = getAnAssemblyFor(controller) and - isMicrosoftAspNetCoreMvcApplicationPart(application, controllerAssembly) +private predicate isInMicrosoftAspNetCoreMvcApplication(Class controller, Compilation application) { + isMicrosoftAspNetCoreMvcApplication(application) and + isMicrosoftAspNetCoreMvcApplicationPart(application, getAnAssemblyFor(controller)) +} + +private predicate hasMicrosoftAspNetCoreMvcAttributeRoute(Class controller) { + exists(Attribute attr | + ( + attr = controller.getABaseType*().getAnAttribute() + or + exists(Method method | + controller.hasMember(method) and + attr = method.getOverridee*().getAnAttribute() + ) + ) and + attr.getType() + .getABaseType*() + .getABaseInterface*() + .hasFullyQualifiedName("Microsoft.AspNetCore.Mvc.Routing", "IRouteTemplateProvider") + ) +} + +private predicate isMicrosoftAspNetCoreMvcConventionalEndpointMapping(MethodCall call) { + call.getTarget() + .hasFullyQualifiedName("Microsoft.AspNetCore.Builder", + "ControllerEndpointRouteBuilderExtensions", + [ + "MapAreaControllerRoute", "MapControllerRoute", "MapDefaultControllerRoute", + "MapDynamicControllerRoute" + ]) + or + call.getTarget() + .hasFullyQualifiedName("Microsoft.AspNetCore.Builder", "MvcApplicationBuilderExtensions", + "UseMvcWithDefaultRoute") + or + call.getTarget() + .hasFullyQualifiedName("Microsoft.AspNetCore.Builder", "MvcApplicationBuilderExtensions", + "UseMvc") and + exists(call.getArgumentForName("configureRoutes")) + or + call.getTarget() + .hasFullyQualifiedName("Microsoft.AspNetCore.Builder", "MvcAreaRouteBuilderExtensions", + "MapAreaRoute") +} + +private predicate isMicrosoftAspNetCoreMvcAttributeEndpointMapping(MethodCall call) { + call.getTarget() + .hasFullyQualifiedName("Microsoft.AspNetCore.Builder", + "ControllerEndpointRouteBuilderExtensions", "MapControllers") + or + call.getTarget() + .hasFullyQualifiedName("Microsoft.AspNetCore.Builder", "MvcApplicationBuilderExtensions", + "UseMvc") and + not exists(call.getArgumentForName("configureRoutes")) +} + +private predicate hasMicrosoftAspNetCoreMvcEndpointMapping(Compilation application, Class controller) { + exists(MethodCall mapping | + application.getAFileCompiled() = mapping.getFile() and + ( + isMicrosoftAspNetCoreMvcConventionalEndpointMapping(mapping) + or + isMicrosoftAspNetCoreMvcAttributeEndpointMapping(mapping) and + hasMicrosoftAspNetCoreMvcAttributeRoute(controller) + ) ) } @@ -298,8 +358,11 @@ private predicate isDefaultMicrosoftAspNetCoreMvcController(Class controller) { ( hasMicrosoftAspNetCoreMvcControllerIdentity(controller) or - controller.getName().toLowerCase().matches("%controller") and - isInMicrosoftAspNetCoreMvcApplication(controller) + exists(Compilation application | + controller.getName().toLowerCase().matches("%controller") and + isInMicrosoftAspNetCoreMvcApplication(controller, application) and + hasMicrosoftAspNetCoreMvcEndpointMapping(application, controller) + ) ) and not controller.getABaseType*().getAnAttribute() instanceof MicrosoftAspNetCoreMvcNonControllerAttribute diff --git a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs index aa9af201259c..7e0c880a766e 100644 --- a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs +++ b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs @@ -1,11 +1,14 @@ using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.DependencyInjection; public static class MvcRegistration { - public static void Register(IServiceCollection services) + public static void Register(IServiceCollection services, IEndpointRouteBuilder endpoints) { services.AddControllers(); + endpoints.MapControllerRoute("default", "{controller}/{action}"); } } diff --git a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected index f62e295c1080..444058a4add4 100644 --- a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected +++ b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected @@ -1,12 +1,12 @@ -| AspNetCore.cs:13:14:13:27 | HomeController | -| AspNetCore.cs:22:14:22:28 | HomeController1 | -| AspNetCore.cs:31:14:31:28 | HomeController2 | -| AspNetCore.cs:41:14:41:28 | HomeController3 | -| AspNetCore.cs:51:14:51:28 | HomeController4 | -| AspNetCore.cs:60:14:60:28 | HomeController5 | -| AspNetCore.cs:115:14:115:32 | LowerCasecontroller | -| AspNetCore.cs:121:14:121:21 | Products | -| AspNetCore.cs:136:14:136:28 | PlainController | -| AspNetCore.cs:152:14:152:36 | ClosedGenericController | -| AspNetCore.cs:168:14:168:35 | ConcreteActionEndpoint | -| AspNetCore.cs:175:14:175:34 | ActionCasesController | +| AspNetCore.cs:16:14:16:27 | HomeController | +| AspNetCore.cs:25:14:25:28 | HomeController1 | +| AspNetCore.cs:34:14:34:28 | HomeController2 | +| AspNetCore.cs:44:14:44:28 | HomeController3 | +| AspNetCore.cs:54:14:54:28 | HomeController4 | +| AspNetCore.cs:63:14:63:28 | HomeController5 | +| AspNetCore.cs:118:14:118:32 | LowerCasecontroller | +| AspNetCore.cs:124:14:124:21 | Products | +| AspNetCore.cs:139:14:139:28 | PlainController | +| AspNetCore.cs:155:14:155:36 | ClosedGenericController | +| AspNetCore.cs:171:14:171:35 | ConcreteActionEndpoint | +| AspNetCore.cs:178:14:178:34 | ActionCasesController | diff --git a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected index bd8e266fcd8a..c3222a0cbf4d 100644 --- a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected +++ b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected @@ -1,15 +1,15 @@ -| AspNetCore.cs:13:14:13:27 | HomeController | AspNetCore.cs:15:19:15:23 | Index | -| AspNetCore.cs:22:14:22:28 | HomeController1 | AspNetCore.cs:24:19:24:23 | Index | -| AspNetCore.cs:31:14:31:28 | HomeController2 | AspNetCore.cs:33:19:33:23 | Index | -| AspNetCore.cs:41:14:41:28 | HomeController3 | AspNetCore.cs:43:19:43:23 | Index | -| AspNetCore.cs:51:14:51:28 | HomeController4 | AspNetCore.cs:53:19:53:23 | Index | -| AspNetCore.cs:60:14:60:28 | HomeController5 | AspNetCore.cs:53:19:53:23 | Index | -| AspNetCore.cs:60:14:60:28 | HomeController5 | AspNetCore.cs:62:19:62:23 | Index | -| AspNetCore.cs:115:14:115:32 | LowerCasecontroller | AspNetCore.cs:117:17:117:22 | Action | -| AspNetCore.cs:121:14:121:21 | Products | AspNetCore.cs:123:17:123:20 | List | -| AspNetCore.cs:136:14:136:28 | PlainController | AspNetCore.cs:138:17:138:26 | BaseAction | -| AspNetCore.cs:152:14:152:36 | ClosedGenericController | AspNetCore.cs:149:17:149:33 | GenericBaseAction | -| AspNetCore.cs:152:14:152:36 | ClosedGenericController | AspNetCore.cs:154:17:154:28 | ClosedAction | -| AspNetCore.cs:168:14:168:35 | ConcreteActionEndpoint | AspNetCore.cs:162:17:162:31 | InheritedAction | -| AspNetCore.cs:168:14:168:35 | ConcreteActionEndpoint | AspNetCore.cs:170:26:170:39 | AbstractAction | -| AspNetCore.cs:175:14:175:34 | ActionCasesController | AspNetCore.cs:177:17:177:28 | PublicAction | +| AspNetCore.cs:16:14:16:27 | HomeController | AspNetCore.cs:18:19:18:23 | Index | +| AspNetCore.cs:25:14:25:28 | HomeController1 | AspNetCore.cs:27:19:27:23 | Index | +| AspNetCore.cs:34:14:34:28 | HomeController2 | AspNetCore.cs:36:19:36:23 | Index | +| AspNetCore.cs:44:14:44:28 | HomeController3 | AspNetCore.cs:46:19:46:23 | Index | +| AspNetCore.cs:54:14:54:28 | HomeController4 | AspNetCore.cs:56:19:56:23 | Index | +| AspNetCore.cs:63:14:63:28 | HomeController5 | AspNetCore.cs:56:19:56:23 | Index | +| AspNetCore.cs:63:14:63:28 | HomeController5 | AspNetCore.cs:65:19:65:23 | Index | +| AspNetCore.cs:118:14:118:32 | LowerCasecontroller | AspNetCore.cs:120:17:120:22 | Action | +| AspNetCore.cs:124:14:124:21 | Products | AspNetCore.cs:126:17:126:20 | List | +| AspNetCore.cs:139:14:139:28 | PlainController | AspNetCore.cs:141:17:141:26 | BaseAction | +| AspNetCore.cs:155:14:155:36 | ClosedGenericController | AspNetCore.cs:152:17:152:33 | GenericBaseAction | +| AspNetCore.cs:155:14:155:36 | ClosedGenericController | AspNetCore.cs:157:17:157:28 | ClosedAction | +| AspNetCore.cs:171:14:171:35 | ConcreteActionEndpoint | AspNetCore.cs:165:17:165:31 | InheritedAction | +| AspNetCore.cs:171:14:171:35 | ConcreteActionEndpoint | AspNetCore.cs:173:26:173:39 | AbstractAction | +| AspNetCore.cs:178:14:178:34 | ActionCasesController | AspNetCore.cs:180:17:180:28 | PublicAction | From 17d49362c3fb2d1b15da488f93b3d8b1154e7139 Mon Sep 17 00:00:00 2001 From: JarLob Date: Fri, 31 Jul 2026 02:31:02 +0300 Subject: [PATCH 0067/2098] C#: Reduce ASP.NET Core action lookup cost --- .../frameworks/microsoft/AspNetCore.qll | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll index 1717ebc218f0..f031777d8ca9 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll @@ -368,17 +368,6 @@ private predicate isDefaultMicrosoftAspNetCoreMvcController(Class controller) { MicrosoftAspNetCoreMvcNonControllerAttribute } -private predicate isDefaultMicrosoftAspNetCoreMvcAction(Class controller, Method method) { - controller.hasMember(method) and - method.isPublic() and - not method.isStatic() and - not method.isAbstract() and - not method.getUnboundDeclaration() instanceof UnboundGenericMethod and - not method.getOverridee*().getAnAttribute() instanceof MicrosoftAspNetCoreMvcNonActionAttribute and - not method.getOverridee*().getDeclaringType() instanceof ObjectType and - not method instanceof DisposeMethod -} - /** A class treated as an owner of ASP.NET Core MVC controller helper methods. */ class MicrosoftAspNetCoreMvcControllerHelperClass extends Class { MicrosoftAspNetCoreMvcControllerHelperClass() { @@ -407,7 +396,16 @@ class MicrosoftAspNetCoreMvcController extends Class { MicrosoftAspNetCoreMvcController() { isDefaultMicrosoftAspNetCoreMvcController(this) } /** Gets an action method for this controller. */ - Method getAnActionMethod() { isDefaultMicrosoftAspNetCoreMvcAction(this, result) } + Method getAnActionMethod() { + this.hasMember(result) and + result.isPublic() and + not result.isStatic() and + not result.isAbstract() and + not result.getUnboundDeclaration() instanceof UnboundGenericMethod and + not result.getOverridee*().getAnAttribute() instanceof MicrosoftAspNetCoreMvcNonActionAttribute and + not result.getOverridee*().getDeclaringType() instanceof ObjectType and + not result instanceof DisposeMethod + } /** Gets a `Redirect*` method. */ Method getARedirectMethod() { From 1d59e69674d8d430085f8d92688f20c0e813944e Mon Sep 17 00:00:00 2001 From: JarLob Date: Fri, 31 Jul 2026 02:42:01 +0300 Subject: [PATCH 0068/2098] C#: Document ASP.NET Core controller discovery --- .../2026-07-31-aspnet-core-controller-discovery.md | 4 ++++ .../code/csharp/frameworks/microsoft/AspNetCore.qll | 9 ++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 csharp/ql/lib/change-notes/2026-07-31-aspnet-core-controller-discovery.md diff --git a/csharp/ql/lib/change-notes/2026-07-31-aspnet-core-controller-discovery.md b/csharp/ql/lib/change-notes/2026-07-31-aspnet-core-controller-discovery.md new file mode 100644 index 000000000000..a55f736a1e84 --- /dev/null +++ b/csharp/ql/lib/change-notes/2026-07-31-aspnet-core-controller-discovery.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Improved ASP.NET Core MVC controller and action discovery to more closely match runtime behavior, including application parts, endpoint mappings, inherited actions, and controller and action exclusions. Service-injected action parameters are no longer modeled as remote input. diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll index f031777d8ca9..03936c7c4537 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll @@ -388,9 +388,12 @@ class MicrosoftAspNetCoreMvcControllerHelperClass extends Class { } /** - * A valid ASP.NET Core controller according to: - * https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/actions?view=aspnetcore-3.1 - * https://github.com/dotnet/aspnetcore/blob/b3c93967ba508b8ef139add27132d9483c1a9eb4/src/Mvc/Mvc.Core/src/Controllers/ControllerFeatureProvider.cs#L39-L75 + * An ASP.NET Core MVC controller, as described by: + * https://learn.microsoft.com/en-us/aspnet/core/mvc/controllers/actions + * https://learn.microsoft.com/en-us/aspnet/core/mvc/advanced/app-parts + * https://learn.microsoft.com/en-us/aspnet/core/mvc/controllers/routing + * https://github.com/dotnet/aspnetcore/blob/747d2cdb584079a0c7309115979f13c331fb7df7/src/Mvc/Mvc.Core/src/Controllers/ControllerFeatureProvider.cs#L20-L75 + * https://github.com/dotnet/aspnetcore/blob/747d2cdb584079a0c7309115979f13c331fb7df7/src/Mvc/Mvc.Core/src/ApplicationModels/DefaultApplicationModelProvider.cs#L410-L459 */ class MicrosoftAspNetCoreMvcController extends Class { MicrosoftAspNetCoreMvcController() { isDefaultMicrosoftAspNetCoreMvcController(this) } From 4cdb6121a0b40aba5aa084eba7ce208077aef535 Mon Sep 17 00:00:00 2001 From: JarLob Date: Fri, 31 Jul 2026 18:10:24 +0300 Subject: [PATCH 0069/2098] Address pull request comments --- .../semmle/code/csharp/frameworks/microsoft/AspNetCore.qll | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll index 03936c7c4537..a469fc98e9eb 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll @@ -328,6 +328,7 @@ private predicate isMicrosoftAspNetCoreMvcAttributeEndpointMapping(MethodCall ca } private predicate hasMicrosoftAspNetCoreMvcEndpointMapping(Compilation application, Class controller) { + isInMicrosoftAspNetCoreMvcApplication(controller, application) and exists(MethodCall mapping | application.getAFileCompiled() = mapping.getFile() and ( @@ -360,7 +361,6 @@ private predicate isDefaultMicrosoftAspNetCoreMvcController(Class controller) { or exists(Compilation application | controller.getName().toLowerCase().matches("%controller") and - isInMicrosoftAspNetCoreMvcApplication(controller, application) and hasMicrosoftAspNetCoreMvcEndpointMapping(application, controller) ) ) and @@ -410,7 +410,7 @@ class MicrosoftAspNetCoreMvcController extends Class { not result instanceof DisposeMethod } - /** Gets a `Redirect*` method. */ + /** Gets a `Redirect*`, `Accepted*`, or `Created*` method. */ Method getARedirectMethod() { result = this.(MicrosoftAspNetCoreMvcControllerHelperClass).getAResponseMethod() } From dac78929a61d243637b7b81edce5e57c7056cf00 Mon Sep 17 00:00:00 2001 From: JarLob Date: Fri, 31 Jul 2026 18:20:18 +0300 Subject: [PATCH 0070/2098] Use don't care expression --- .../semmle/code/csharp/frameworks/microsoft/AspNetCore.qll | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll index a469fc98e9eb..79d001d8279d 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll @@ -359,10 +359,8 @@ private predicate isDefaultMicrosoftAspNetCoreMvcController(Class controller) { ( hasMicrosoftAspNetCoreMvcControllerIdentity(controller) or - exists(Compilation application | - controller.getName().toLowerCase().matches("%controller") and - hasMicrosoftAspNetCoreMvcEndpointMapping(application, controller) - ) + controller.getName().toLowerCase().matches("%controller") and + hasMicrosoftAspNetCoreMvcEndpointMapping(_, controller) ) and not controller.getABaseType*().getAnAttribute() instanceof MicrosoftAspNetCoreMvcNonControllerAttribute From 731af157a48c09637ae75ecb57d939e0381b4216 Mon Sep 17 00:00:00 2001 From: JarLob Date: Fri, 31 Jul 2026 18:53:14 +0300 Subject: [PATCH 0071/2098] C#: Model MVC fallback controller mappings --- .../Controllers.expected | 12 +++++----- .../AdminAreaFallbackController.cs | 9 ++++++++ .../UnmappedWebApp/FallbackOnlyController.cs | 4 ++++ .../OtherAreaFallbackController.cs | 9 ++++++++ .../UnmappedWebApp/Program.cs | 4 +++- .../frameworks/microsoft/AspNetCore.qll | 22 +++++++++++++++++++ 6 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/AdminAreaFallbackController.cs create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/FallbackOnlyController.cs create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/OtherAreaFallbackController.cs diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected index 22c2ca299300..5b1b4a6edada 100644 --- a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected @@ -1,5 +1,7 @@ -| AttributePocoController.cs | AttributePocoController | -| GeneratedController.cs | GeneratedController | -| IncludedController.cs | IncludedController | -| StructuralController.cs | StructuralController | -| WebPocoController.cs | WebPocoController | \ No newline at end of file +| AdminAreaFallbackController.cs | AreaFallbackController | +| AttributePocoController.cs | AttributePocoController | +| FallbackOnlyController.cs | FallbackOnlyController | +| GeneratedController.cs | GeneratedController | +| IncludedController.cs | IncludedController | +| StructuralController.cs | StructuralController | +| WebPocoController.cs | WebPocoController | diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/AdminAreaFallbackController.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/AdminAreaFallbackController.cs new file mode 100644 index 000000000000..c64aea73ddd1 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/AdminAreaFallbackController.cs @@ -0,0 +1,9 @@ +using Microsoft.AspNetCore.Mvc; + +namespace AdminArea; + +[Area("Admin")] +public class AreaFallbackController +{ + public void Index(string input) => _ = GetType().Name + input; +} diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/FallbackOnlyController.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/FallbackOnlyController.cs new file mode 100644 index 000000000000..1716d49f2296 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/FallbackOnlyController.cs @@ -0,0 +1,4 @@ +public class FallbackOnlyController +{ + public void Index(string input) => _ = GetType().Name + input; +} diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/OtherAreaFallbackController.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/OtherAreaFallbackController.cs new file mode 100644 index 000000000000..10849896f531 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/OtherAreaFallbackController.cs @@ -0,0 +1,9 @@ +using Microsoft.AspNetCore.Mvc; + +namespace OtherArea; + +[Area("Other")] +public class AreaFallbackController +{ + public void Index(string input) => _ = GetType().Name + input; +} diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/Program.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/Program.cs index 6cf99003feb3..bb27696d84b5 100644 --- a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/Program.cs +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/Program.cs @@ -5,4 +5,6 @@ builder.Services.AddControllers(); var app = builder.Build(); -app.Run(); \ No newline at end of file +app.MapFallbackToController("Index", "FallbackOnly"); +app.MapFallbackToAreaController("admin/{*path:nonfile}", "Index", "AreaFallback", "Admin"); +app.Run(); diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll index 79d001d8279d..d3c4c0bf6aba 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll @@ -327,6 +327,26 @@ private predicate isMicrosoftAspNetCoreMvcAttributeEndpointMapping(MethodCall ca not exists(call.getArgumentForName("configureRoutes")) } +private predicate isMicrosoftAspNetCoreMvcFallbackEndpointMapping(MethodCall call, Class controller) { + call.getTarget() + .hasFullyQualifiedName("Microsoft.AspNetCore.Builder", + "ControllerEndpointRouteBuilderExtensions", + ["MapFallbackToAreaController", "MapFallbackToController"]) and + call.getArgumentForName("controller").getValue().toLowerCase() + "controller" = + controller.getName().toLowerCase() and + ( + call.getTarget().hasName("MapFallbackToController") + or + call.getTarget().hasName("MapFallbackToAreaController") and + exists(Attribute area | + area = controller.getABaseType*().getAnAttribute() and + area.getType().hasFullyQualifiedName("Microsoft.AspNetCore.Mvc", "AreaAttribute") and + area.getArgument(0).getValue().toLowerCase() = + call.getArgumentForName("area").getValue().toLowerCase() + ) + ) +} + private predicate hasMicrosoftAspNetCoreMvcEndpointMapping(Compilation application, Class controller) { isInMicrosoftAspNetCoreMvcApplication(controller, application) and exists(MethodCall mapping | @@ -336,6 +356,8 @@ private predicate hasMicrosoftAspNetCoreMvcEndpointMapping(Compilation applicati or isMicrosoftAspNetCoreMvcAttributeEndpointMapping(mapping) and hasMicrosoftAspNetCoreMvcAttributeRoute(controller) + or + isMicrosoftAspNetCoreMvcFallbackEndpointMapping(mapping, controller) ) ) } From c38a11eb4d53836b215c1207d9e82d6c3e65d951 Mon Sep 17 00:00:00 2001 From: JarLob Date: Fri, 31 Jul 2026 20:49:52 +0300 Subject: [PATCH 0072/2098] C#: Fix controller discovery test fixtures --- .../Controllers.expected | 14 +++++++------- .../Security Features/CWE-089/SqlInjection.cs | 2 ++ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected index 5b1b4a6edada..d6ee73a2694f 100644 --- a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected @@ -1,7 +1,7 @@ -| AdminAreaFallbackController.cs | AreaFallbackController | -| AttributePocoController.cs | AttributePocoController | -| FallbackOnlyController.cs | FallbackOnlyController | -| GeneratedController.cs | GeneratedController | -| IncludedController.cs | IncludedController | -| StructuralController.cs | StructuralController | -| WebPocoController.cs | WebPocoController | +| AdminAreaFallbackController.cs | AreaFallbackController | +| AttributePocoController.cs | AttributePocoController | +| FallbackOnlyController.cs | FallbackOnlyController | +| GeneratedController.cs | GeneratedController | +| IncludedController.cs | IncludedController | +| StructuralController.cs | StructuralController | +| WebPocoController.cs | WebPocoController | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-089/SqlInjection.cs b/csharp/ql/test/query-tests/Security Features/CWE-089/SqlInjection.cs index e7dd2f732603..a35dddb5b662 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-089/SqlInjection.cs +++ b/csharp/ql/test/query-tests/Security Features/CWE-089/SqlInjection.cs @@ -139,4 +139,6 @@ public async Task GetUserById([FromRoute] string userId, Cancella return Ok(); } } + + public class ConcreteController : MyController { } } From cbdc74e2500a1d030e56244e632d971c91eac3c1 Mon Sep 17 00:00:00 2001 From: Keshav Malik Date: Sat, 1 Aug 2026 20:26:29 +0530 Subject: [PATCH 0073/2098] JS: Track response data through promises --- ...2026-08-01-client-response-promise-data.md | 4 + .../javascript/frameworks/ClientRequests.qll | 12 + .../Xss.expected | 250 ++++++++++++++++++ .../fetch-promise-chain.js | 145 ++++++++++ .../non-fetch-promise-chain.js | 47 ++++ 5 files changed, 458 insertions(+) create mode 100644 javascript/ql/lib/change-notes/2026-08-01-client-response-promise-data.md create mode 100644 javascript/ql/test/query-tests/Security/CWE-079/DomBasedXssWithResponseThreat/fetch-promise-chain.js create mode 100644 javascript/ql/test/query-tests/Security/CWE-079/DomBasedXssWithResponseThreat/non-fetch-promise-chain.js diff --git a/javascript/ql/lib/change-notes/2026-08-01-client-response-promise-data.md b/javascript/ql/lib/change-notes/2026-08-01-client-response-promise-data.md new file mode 100644 index 000000000000..7213d64a830d --- /dev/null +++ b/javascript/ql/lib/change-notes/2026-08-01-client-response-promise-data.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* JavaScript security queries using the `response` threat model now track promise-wrapped client response data into promise fulfillment values. This may improve results for queries such as `js/xss` when response data is consumed through `.then(...)` chains. diff --git a/javascript/ql/lib/semmle/javascript/frameworks/ClientRequests.qll b/javascript/ql/lib/semmle/javascript/frameworks/ClientRequests.qll index 9da93400ef92..fabf0a6d38f5 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/ClientRequests.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/ClientRequests.qll @@ -1016,6 +1016,18 @@ module ClientRequest { override string getSourceType() { result = "HTTP response data" } } + /** + * A taint step from promise-wrapped response data to the value that the promise resolves to. + */ + private class ClientRequestResponsePromiseStep extends TaintTracking::SharedTaintStep { + override predicate promiseStep(DataFlow::Node node1, DataFlow::Node node2) { + exists(ClientRequest r | + r.getAResponseDataNode(_, true).getALocalSource().flowsTo(node1) and + PromiseFlow::loadStep(node1, node2, Promises::valueProp()) + ) + } + } + /** * An additional taint step that captures taint propagation from the receiver of fetch response methods * (such as "json", "text", "blob", and "arrayBuffer") to the call result. diff --git a/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXssWithResponseThreat/Xss.expected b/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXssWithResponseThreat/Xss.expected index 99cafddc41d2..8d4eae0a7083 100644 --- a/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXssWithResponseThreat/Xss.expected +++ b/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXssWithResponseThreat/Xss.expected @@ -1,5 +1,19 @@ #select +| fetch-promise-chain.js:21:47:21:49 | row | fetch-promise-chain.js:7:3:7:12 | fetch(url) | fetch-promise-chain.js:21:47:21:49 | row | Cross-site scripting vulnerability due to $@. | fetch-promise-chain.js:7:3:7:12 | fetch(url) | user-provided value | +| fetch-promise-chain.js:30:33:30:36 | text | fetch-promise-chain.js:27:3:27:23 | fetch(" ... ssage") | fetch-promise-chain.js:30:33:30:36 | text | Cross-site scripting vulnerability due to $@. | fetch-promise-chain.js:27:3:27:23 | fetch(" ... ssage") | user-provided value | +| fetch-promise-chain.js:47:33:47:44 | data.message | fetch-promise-chain.js:43:19:43:39 | fetch(" ... ssage") | fetch-promise-chain.js:47:33:47:44 | data.message | Cross-site scripting vulnerability due to $@. | fetch-promise-chain.js:43:19:43:39 | fetch(" ... ssage") | user-provided value | +| fetch-promise-chain.js:57:33:57:36 | text | fetch-promise-chain.js:53:13:53:33 | fetch(" ... ssage") | fetch-promise-chain.js:57:33:57:36 | text | Cross-site scripting vulnerability due to $@. | fetch-promise-chain.js:53:13:53:33 | fetch(" ... ssage") | user-provided value | +| fetch-promise-chain.js:67:55:67:66 | item.message | fetch-promise-chain.js:62:3:62:23 | fetch(" ... ssage") | fetch-promise-chain.js:67:55:67:66 | item.message | Cross-site scripting vulnerability due to $@. | fetch-promise-chain.js:62:3:62:23 | fetch(" ... ssage") | user-provided value | +| fetch-promise-chain.js:76:33:76:39 | message | fetch-promise-chain.js:73:3:73:23 | fetch(" ... ssage") | fetch-promise-chain.js:76:33:76:39 | message | Cross-site scripting vulnerability due to $@. | fetch-promise-chain.js:73:3:73:23 | fetch(" ... ssage") | user-provided value | +| fetch-promise-chain.js:84:33:84:44 | data.message | fetch-promise-chain.js:81:3:81:23 | fetch(" ... ssage") | fetch-promise-chain.js:84:33:84:44 | data.message | Cross-site scripting vulnerability due to $@. | fetch-promise-chain.js:81:3:81:23 | fetch(" ... ssage") | user-provided value | +| fetch-promise-chain.js:93:31:93:42 | data.message | fetch-promise-chain.js:90:5:90:25 | fetch(" ... ssage") | fetch-promise-chain.js:93:31:93:42 | data.message | Cross-site scripting vulnerability due to $@. | fetch-promise-chain.js:90:5:90:25 | fetch(" ... ssage") | user-provided value | +| fetch-promise-chain.js:102:33:102:47 | payload.message | fetch-promise-chain.js:98:3:98:23 | fetch(" ... ssage") | fetch-promise-chain.js:102:33:102:47 | payload.message | Cross-site scripting vulnerability due to $@. | fetch-promise-chain.js:98:3:98:23 | fetch(" ... ssage") | user-provided value | | interceptors.js:9:56:9:72 | userGeneratedHtml | interceptors.js:7:6:7:13 | response | interceptors.js:9:56:9:72 | userGeneratedHtml | Cross-site scripting vulnerability due to $@. | interceptors.js:7:6:7:13 | response | user-provided value | +| non-fetch-promise-chain.js:5:33:5:36 | body | non-fetch-promise-chain.js:3:3:3:35 | rp("htt ... ssage") | non-fetch-promise-chain.js:5:33:5:36 | body | Cross-site scripting vulnerability due to $@. | non-fetch-promise-chain.js:3:3:3:35 | rp("htt ... ssage") | user-provided value | +| non-fetch-promise-chain.js:13:33:13:44 | data.message | non-fetch-promise-chain.js:11:3:11:56 | rp({ ur ... true }) | non-fetch-promise-chain.js:13:33:13:44 | data.message | Cross-site scripting vulnerability due to $@. | non-fetch-promise-chain.js:11:3:11:56 | rp({ ur ... true }) | user-provided value | +| non-fetch-promise-chain.js:21:31:21:51 | respons ... message | non-fetch-promise-chain.js:19:19:19:58 | axios.g ... ssage") | non-fetch-promise-chain.js:21:31:21:51 | respons ... message | Cross-site scripting vulnerability due to $@. | non-fetch-promise-chain.js:19:19:19:58 | axios.g ... ssage") | user-provided value | +| non-fetch-promise-chain.js:29:33:29:53 | respons ... message | non-fetch-promise-chain.js:27:3:27:46 | needle( ... ssage") | non-fetch-promise-chain.js:29:33:29:53 | respons ... message | Cross-site scripting vulnerability due to $@. | non-fetch-promise-chain.js:27:3:27:46 | needle( ... ssage") | user-provided value | +| non-fetch-promise-chain.js:37:33:37:45 | response.text | non-fetch-promise-chain.js:35:3:35:47 | superag ... ssage") | non-fetch-promise-chain.js:37:33:37:45 | response.text | Cross-site scripting vulnerability due to $@. | non-fetch-promise-chain.js:35:3:35:47 | superag ... ssage") | user-provided value | | test.jsx:27:29:27:32 | data | test.jsx:5:28:5:63 | fetch(" ... ntent") | test.jsx:27:29:27:32 | data | Cross-site scripting vulnerability due to $@. | test.jsx:5:28:5:63 | fetch(" ... ntent") | user-provided value | | test.ts:21:57:21:76 | response.description | test.ts:8:9:8:79 | this.#h ... query') | test.ts:21:57:21:76 | response.description | Cross-site scripting vulnerability due to $@. | test.ts:8:9:8:79 | this.#h ... query') | user-provided value | | test.ts:24:36:24:90 | `

${ ... o}

` | test.ts:8:9:8:79 | this.#h ... query') | test.ts:24:36:24:90 | `

${ ... o}

` | Cross-site scripting vulnerability due to $@. | test.ts:8:9:8:79 | this.#h ... query') | user-provided value | @@ -19,9 +33,121 @@ | testUseQueries2.vue:40:10:40:23 | v-html=data3 | testUseQueries2.vue:12:28:12:41 | fetch("${id}") | testUseQueries2.vue:40:10:40:23 | v-html=data3 | Cross-site scripting vulnerability due to $@. | testUseQueries2.vue:12:28:12:41 | fetch("${id}") | user-provided value | | testUseQueries.vue:25:10:25:23 | v-html=data2 | testUseQueries.vue:11:36:11:49 | fetch("${id}") | testUseQueries.vue:25:10:25:23 | v-html=data2 | Cross-site scripting vulnerability due to $@. | testUseQueries.vue:11:36:11:49 | fetch("${id}") | user-provided value | edges +| fetch-promise-chain.js:7:3:7:12 | fetch(url) | fetch-promise-chain.js:8:11:8:18 | response | provenance | | +| fetch-promise-chain.js:7:3:8:38 | fetch(u ... json()) [PromiseValue] | fetch-promise-chain.js:9:11:9:14 | data | provenance | | +| fetch-promise-chain.js:8:11:8:18 | response | fetch-promise-chain.js:8:23:8:30 | response | provenance | | +| fetch-promise-chain.js:8:23:8:30 | response | fetch-promise-chain.js:8:23:8:37 | response.json() | provenance | | +| fetch-promise-chain.js:8:23:8:37 | response.json() | fetch-promise-chain.js:7:3:8:38 | fetch(u ... json()) [PromiseValue] | provenance | | +| fetch-promise-chain.js:9:11:9:14 | data | fetch-promise-chain.js:13:7:13:10 | data | provenance | | +| fetch-promise-chain.js:13:7:13:10 | data | fetch-promise-chain.js:13:7:13:16 | data.items | provenance | | +| fetch-promise-chain.js:13:7:13:16 | data.items | fetch-promise-chain.js:13:26:13:29 | item | provenance | | +| fetch-promise-chain.js:13:26:13:29 | item | fetch-promise-chain.js:14:55:14:58 | item | provenance | | +| fetch-promise-chain.js:13:26:13:29 | item | fetch-promise-chain.js:16:17:16:20 | item | provenance | | +| fetch-promise-chain.js:13:26:13:29 | item | fetch-promise-chain.js:17:17:17:20 | item | provenance | | +| fetch-promise-chain.js:13:26:13:29 | item | fetch-promise-chain.js:18:17:18:20 | item | provenance | | +| fetch-promise-chain.js:14:15:14:18 | link | fetch-promise-chain.js:19:17:19:20 | link | provenance | | +| fetch-promise-chain.js:14:22:14:88 | `` | fetch-promise-chain.js:14:15:14:18 | link | provenance | | +| fetch-promise-chain.js:14:55:14:58 | item | fetch-promise-chain.js:14:55:14:68 | item.messageId | provenance | | +| fetch-promise-chain.js:14:55:14:68 | item.messageId | fetch-promise-chain.js:14:22:14:88 | `` | provenance | | +| fetch-promise-chain.js:15:15:15:17 | row | fetch-promise-chain.js:21:47:21:49 | row | provenance | | +| fetch-promise-chain.js:15:21:20:14 | `\\n ... ` | fetch-promise-chain.js:15:15:15:17 | row | provenance | | +| fetch-promise-chain.js:16:17:16:20 | item | fetch-promise-chain.js:16:17:16:32 | item.createdDate | provenance | | +| fetch-promise-chain.js:16:17:16:32 | item.createdDate | fetch-promise-chain.js:15:21:20:14 | `\\n ... ` | provenance | | +| fetch-promise-chain.js:17:17:17:20 | item | fetch-promise-chain.js:17:17:17:30 | item.messageId | provenance | | +| fetch-promise-chain.js:17:17:17:30 | item.messageId | fetch-promise-chain.js:15:21:20:14 | `\\n ... ` | provenance | | +| fetch-promise-chain.js:18:17:18:20 | item | fetch-promise-chain.js:18:17:18:33 | item.target ?? "" | provenance | | +| fetch-promise-chain.js:18:17:18:33 | item.target ?? "" | fetch-promise-chain.js:15:21:20:14 | `\\n ... ` | provenance | | +| fetch-promise-chain.js:19:17:19:20 | link | fetch-promise-chain.js:15:21:20:14 | `\\n ... ` | provenance | | +| fetch-promise-chain.js:27:3:27:23 | fetch(" ... ssage") | fetch-promise-chain.js:28:11:28:18 | response | provenance | | +| fetch-promise-chain.js:27:3:28:38 | fetch(" ... text()) [PromiseValue] | fetch-promise-chain.js:29:11:29:14 | text | provenance | | +| fetch-promise-chain.js:28:11:28:18 | response | fetch-promise-chain.js:28:23:28:30 | response | provenance | | +| fetch-promise-chain.js:28:23:28:30 | response | fetch-promise-chain.js:28:23:28:37 | response.text() | provenance | | +| fetch-promise-chain.js:28:23:28:37 | response.text() | fetch-promise-chain.js:27:3:28:38 | fetch(" ... text()) [PromiseValue] | provenance | | +| fetch-promise-chain.js:29:11:29:14 | text | fetch-promise-chain.js:30:33:30:36 | text | provenance | | +| fetch-promise-chain.js:43:9:43:15 | request | fetch-promise-chain.js:44:3:44:9 | request | provenance | | +| fetch-promise-chain.js:43:19:43:39 | fetch(" ... ssage") | fetch-promise-chain.js:43:9:43:15 | request | provenance | | +| fetch-promise-chain.js:44:3:44:9 | request | fetch-promise-chain.js:45:11:45:18 | response | provenance | | +| fetch-promise-chain.js:44:3:45:38 | request ... json()) [PromiseValue] | fetch-promise-chain.js:46:11:46:14 | data | provenance | | +| fetch-promise-chain.js:45:11:45:18 | response | fetch-promise-chain.js:45:23:45:30 | response | provenance | | +| fetch-promise-chain.js:45:23:45:30 | response | fetch-promise-chain.js:45:23:45:37 | response.json() | provenance | | +| fetch-promise-chain.js:45:23:45:37 | response.json() | fetch-promise-chain.js:44:3:45:38 | request ... json()) [PromiseValue] | provenance | | +| fetch-promise-chain.js:46:11:46:14 | data | fetch-promise-chain.js:47:33:47:36 | data | provenance | | +| fetch-promise-chain.js:47:33:47:36 | data | fetch-promise-chain.js:47:33:47:44 | data.message | provenance | | +| fetch-promise-chain.js:53:3:53:9 | request | fetch-promise-chain.js:54:3:54:9 | request | provenance | | +| fetch-promise-chain.js:53:13:53:33 | fetch(" ... ssage") | fetch-promise-chain.js:53:3:53:9 | request | provenance | | +| fetch-promise-chain.js:54:3:54:9 | request | fetch-promise-chain.js:55:11:55:18 | response | provenance | | +| fetch-promise-chain.js:54:3:55:38 | request ... text()) [PromiseValue] | fetch-promise-chain.js:56:11:56:14 | text | provenance | | +| fetch-promise-chain.js:55:11:55:18 | response | fetch-promise-chain.js:55:23:55:30 | response | provenance | | +| fetch-promise-chain.js:55:23:55:30 | response | fetch-promise-chain.js:55:23:55:37 | response.text() | provenance | | +| fetch-promise-chain.js:55:23:55:37 | response.text() | fetch-promise-chain.js:54:3:55:38 | request ... text()) [PromiseValue] | provenance | | +| fetch-promise-chain.js:56:11:56:14 | text | fetch-promise-chain.js:57:33:57:36 | text | provenance | | +| fetch-promise-chain.js:62:3:62:23 | fetch(" ... ssage") | fetch-promise-chain.js:63:11:63:18 | response | provenance | | +| fetch-promise-chain.js:62:3:63:38 | fetch(" ... json()) [PromiseValue] | fetch-promise-chain.js:62:3:64:29 | fetch(" ... .items) [PromiseValue] | provenance | | +| fetch-promise-chain.js:62:3:63:38 | fetch(" ... json()) [PromiseValue] | fetch-promise-chain.js:64:11:64:14 | data | provenance | | +| fetch-promise-chain.js:62:3:64:29 | fetch(" ... .items) [PromiseValue] | fetch-promise-chain.js:65:11:65:15 | items | provenance | | +| fetch-promise-chain.js:63:11:63:18 | response | fetch-promise-chain.js:63:23:63:30 | response | provenance | | +| fetch-promise-chain.js:63:23:63:30 | response | fetch-promise-chain.js:63:23:63:37 | response.json() | provenance | | +| fetch-promise-chain.js:63:23:63:37 | response.json() | fetch-promise-chain.js:62:3:63:38 | fetch(" ... json()) [PromiseValue] | provenance | | +| fetch-promise-chain.js:64:11:64:14 | data | fetch-promise-chain.js:64:19:64:22 | data | provenance | | +| fetch-promise-chain.js:64:19:64:22 | data | fetch-promise-chain.js:64:19:64:28 | data.items | provenance | | +| fetch-promise-chain.js:65:11:65:15 | items | fetch-promise-chain.js:66:7:66:11 | items | provenance | | +| fetch-promise-chain.js:66:7:66:11 | items | fetch-promise-chain.js:66:21:66:24 | item | provenance | | +| fetch-promise-chain.js:66:21:66:24 | item | fetch-promise-chain.js:67:55:67:58 | item | provenance | | +| fetch-promise-chain.js:67:55:67:58 | item | fetch-promise-chain.js:67:55:67:66 | item.message | provenance | | +| fetch-promise-chain.js:73:3:73:23 | fetch(" ... ssage") | fetch-promise-chain.js:74:11:74:18 | response | provenance | | +| fetch-promise-chain.js:73:3:74:38 | fetch(" ... json()) [PromiseValue] | fetch-promise-chain.js:75:12:75:22 | { message } | provenance | | +| fetch-promise-chain.js:74:11:74:18 | response | fetch-promise-chain.js:74:23:74:30 | response | provenance | | +| fetch-promise-chain.js:74:23:74:30 | response | fetch-promise-chain.js:74:23:74:37 | response.json() | provenance | | +| fetch-promise-chain.js:74:23:74:37 | response.json() | fetch-promise-chain.js:73:3:74:38 | fetch(" ... json()) [PromiseValue] | provenance | | +| fetch-promise-chain.js:75:12:75:22 | { message } | fetch-promise-chain.js:75:14:75:20 | message | provenance | | +| fetch-promise-chain.js:75:14:75:20 | message | fetch-promise-chain.js:76:33:76:39 | message | provenance | | +| fetch-promise-chain.js:81:3:81:23 | fetch(" ... ssage") | fetch-promise-chain.js:82:17:82:24 | response | provenance | | +| fetch-promise-chain.js:81:3:82:50 | fetch(" ... json()) [PromiseValue] | fetch-promise-chain.js:83:11:83:14 | data | provenance | | +| fetch-promise-chain.js:82:17:82:24 | response | fetch-promise-chain.js:82:35:82:42 | response | provenance | | +| fetch-promise-chain.js:82:29:82:49 | await r ... .json() | fetch-promise-chain.js:81:3:82:50 | fetch(" ... json()) [PromiseValue] | provenance | | +| fetch-promise-chain.js:82:35:82:42 | response | fetch-promise-chain.js:82:35:82:49 | response.json() | provenance | | +| fetch-promise-chain.js:82:35:82:49 | response.json() | fetch-promise-chain.js:82:29:82:49 | await r ... .json() | provenance | | +| fetch-promise-chain.js:83:11:83:14 | data | fetch-promise-chain.js:84:33:84:36 | data | provenance | | +| fetch-promise-chain.js:84:33:84:36 | data | fetch-promise-chain.js:84:33:84:44 | data.message | provenance | | +| fetch-promise-chain.js:89:3:92:4 | Promise ... ))\\n ]) [PromiseValue, 0] | fetch-promise-chain.js:92:12:92:17 | [data] [0] | provenance | | +| fetch-promise-chain.js:89:15:92:3 | [\\n f ... ())\\n ] [0, PromiseValue] | fetch-promise-chain.js:89:3:92:4 | Promise ... ))\\n ]) [PromiseValue, 0] | provenance | | +| fetch-promise-chain.js:90:5:90:25 | fetch(" ... ssage") | fetch-promise-chain.js:91:13:91:20 | response | provenance | | +| fetch-promise-chain.js:90:5:91:40 | fetch(" ... json()) [PromiseValue] | fetch-promise-chain.js:89:15:92:3 | [\\n f ... ())\\n ] [0, PromiseValue] | provenance | | +| fetch-promise-chain.js:91:13:91:20 | response | fetch-promise-chain.js:91:25:91:32 | response | provenance | | +| fetch-promise-chain.js:91:25:91:32 | response | fetch-promise-chain.js:91:25:91:39 | response.json() | provenance | | +| fetch-promise-chain.js:91:25:91:39 | response.json() | fetch-promise-chain.js:90:5:91:40 | fetch(" ... json()) [PromiseValue] | provenance | | +| fetch-promise-chain.js:92:12:92:17 | [data] [0] | fetch-promise-chain.js:92:13:92:16 | data | provenance | | +| fetch-promise-chain.js:92:13:92:16 | data | fetch-promise-chain.js:92:13:92:16 | data | provenance | | +| fetch-promise-chain.js:92:13:92:16 | data | fetch-promise-chain.js:93:31:93:34 | data | provenance | | +| fetch-promise-chain.js:93:31:93:34 | data | fetch-promise-chain.js:93:31:93:42 | data.message | provenance | | +| fetch-promise-chain.js:98:3:98:23 | fetch(" ... ssage") | fetch-promise-chain.js:99:11:99:18 | response | provenance | | +| fetch-promise-chain.js:98:3:99:38 | fetch(" ... json()) [PromiseValue] | fetch-promise-chain.js:100:11:100:14 | data | provenance | | +| fetch-promise-chain.js:99:11:99:18 | response | fetch-promise-chain.js:99:23:99:30 | response | provenance | | +| fetch-promise-chain.js:99:23:99:30 | response | fetch-promise-chain.js:99:23:99:37 | response.json() | provenance | | +| fetch-promise-chain.js:99:23:99:37 | response.json() | fetch-promise-chain.js:98:3:99:38 | fetch(" ... json()) [PromiseValue] | provenance | | +| fetch-promise-chain.js:100:11:100:14 | data | fetch-promise-chain.js:101:23:101:26 | data | provenance | | +| fetch-promise-chain.js:101:13:101:19 | payload | fetch-promise-chain.js:102:33:102:39 | payload | provenance | | +| fetch-promise-chain.js:101:23:101:26 | data | fetch-promise-chain.js:101:13:101:19 | payload | provenance | | +| fetch-promise-chain.js:102:33:102:39 | payload | fetch-promise-chain.js:102:33:102:47 | payload.message | provenance | | | interceptors.js:7:6:7:13 | response | interceptors.js:8:35:8:42 | response | provenance | | | interceptors.js:8:15:8:31 | userGeneratedHtml | interceptors.js:9:56:9:72 | userGeneratedHtml | provenance | | | interceptors.js:8:35:8:42 | response | interceptors.js:8:15:8:31 | userGeneratedHtml | provenance | | +| non-fetch-promise-chain.js:3:3:3:35 | rp("htt ... ssage") | non-fetch-promise-chain.js:4:11:4:14 | body | provenance | | +| non-fetch-promise-chain.js:4:11:4:14 | body | non-fetch-promise-chain.js:5:33:5:36 | body | provenance | | +| non-fetch-promise-chain.js:11:3:11:56 | rp({ ur ... true }) | non-fetch-promise-chain.js:12:11:12:14 | data | provenance | | +| non-fetch-promise-chain.js:12:11:12:14 | data | non-fetch-promise-chain.js:13:33:13:36 | data | provenance | | +| non-fetch-promise-chain.js:13:33:13:36 | data | non-fetch-promise-chain.js:13:33:13:44 | data.message | provenance | | +| non-fetch-promise-chain.js:19:9:19:15 | request | non-fetch-promise-chain.js:20:3:20:9 | request | provenance | | +| non-fetch-promise-chain.js:19:19:19:58 | axios.g ... ssage") | non-fetch-promise-chain.js:19:9:19:15 | request | provenance | | +| non-fetch-promise-chain.js:20:3:20:9 | request | non-fetch-promise-chain.js:20:16:20:23 | response | provenance | | +| non-fetch-promise-chain.js:20:16:20:23 | response | non-fetch-promise-chain.js:21:31:21:38 | response | provenance | | +| non-fetch-promise-chain.js:21:31:21:38 | response | non-fetch-promise-chain.js:21:31:21:51 | respons ... message | provenance | | +| non-fetch-promise-chain.js:27:3:27:46 | needle( ... ssage") | non-fetch-promise-chain.js:28:11:28:18 | response | provenance | | +| non-fetch-promise-chain.js:28:11:28:18 | response | non-fetch-promise-chain.js:29:33:29:40 | response | provenance | | +| non-fetch-promise-chain.js:29:33:29:40 | response | non-fetch-promise-chain.js:29:33:29:53 | respons ... message | provenance | | +| non-fetch-promise-chain.js:35:3:35:47 | superag ... ssage") | non-fetch-promise-chain.js:36:11:36:18 | response | provenance | | +| non-fetch-promise-chain.js:36:11:36:18 | response | non-fetch-promise-chain.js:37:33:37:40 | response | provenance | | +| non-fetch-promise-chain.js:37:33:37:40 | response | non-fetch-promise-chain.js:37:33:37:45 | response.text | provenance | | | test.jsx:5:11:5:18 | response | test.jsx:6:24:6:31 | response | provenance | | | test.jsx:5:22:5:63 | await f ... ntent") | test.jsx:5:11:5:18 | response | provenance | | | test.jsx:5:28:5:63 | fetch(" ... ntent") | test.jsx:5:22:5:63 | await f ... ntent") | provenance | | @@ -100,10 +226,133 @@ edges | testUseQueries.vue:12:20:12:34 | response.json() | testUseQueries.vue:18:22:18:36 | results[0].data | provenance | | | testUseQueries.vue:18:22:18:36 | results[0].data | testUseQueries.vue:25:10:25:23 | v-html=data2 | provenance | | nodes +| fetch-promise-chain.js:7:3:7:12 | fetch(url) | semmle.label | fetch(url) | +| fetch-promise-chain.js:7:3:8:38 | fetch(u ... json()) [PromiseValue] | semmle.label | fetch(u ... json()) [PromiseValue] | +| fetch-promise-chain.js:8:11:8:18 | response | semmle.label | response | +| fetch-promise-chain.js:8:23:8:30 | response | semmle.label | response | +| fetch-promise-chain.js:8:23:8:37 | response.json() | semmle.label | response.json() | +| fetch-promise-chain.js:9:11:9:14 | data | semmle.label | data | +| fetch-promise-chain.js:13:7:13:10 | data | semmle.label | data | +| fetch-promise-chain.js:13:7:13:16 | data.items | semmle.label | data.items | +| fetch-promise-chain.js:13:26:13:29 | item | semmle.label | item | +| fetch-promise-chain.js:14:15:14:18 | link | semmle.label | link | +| fetch-promise-chain.js:14:22:14:88 | `` | semmle.label | `` | +| fetch-promise-chain.js:14:55:14:58 | item | semmle.label | item | +| fetch-promise-chain.js:14:55:14:68 | item.messageId | semmle.label | item.messageId | +| fetch-promise-chain.js:15:15:15:17 | row | semmle.label | row | +| fetch-promise-chain.js:15:21:20:14 | `\\n ... ` | semmle.label | `\\n ... ` | +| fetch-promise-chain.js:16:17:16:20 | item | semmle.label | item | +| fetch-promise-chain.js:16:17:16:32 | item.createdDate | semmle.label | item.createdDate | +| fetch-promise-chain.js:17:17:17:20 | item | semmle.label | item | +| fetch-promise-chain.js:17:17:17:30 | item.messageId | semmle.label | item.messageId | +| fetch-promise-chain.js:18:17:18:20 | item | semmle.label | item | +| fetch-promise-chain.js:18:17:18:33 | item.target ?? "" | semmle.label | item.target ?? "" | +| fetch-promise-chain.js:19:17:19:20 | link | semmle.label | link | +| fetch-promise-chain.js:21:47:21:49 | row | semmle.label | row | +| fetch-promise-chain.js:27:3:27:23 | fetch(" ... ssage") | semmle.label | fetch(" ... ssage") | +| fetch-promise-chain.js:27:3:28:38 | fetch(" ... text()) [PromiseValue] | semmle.label | fetch(" ... text()) [PromiseValue] | +| fetch-promise-chain.js:28:11:28:18 | response | semmle.label | response | +| fetch-promise-chain.js:28:23:28:30 | response | semmle.label | response | +| fetch-promise-chain.js:28:23:28:37 | response.text() | semmle.label | response.text() | +| fetch-promise-chain.js:29:11:29:14 | text | semmle.label | text | +| fetch-promise-chain.js:30:33:30:36 | text | semmle.label | text | +| fetch-promise-chain.js:43:9:43:15 | request | semmle.label | request | +| fetch-promise-chain.js:43:19:43:39 | fetch(" ... ssage") | semmle.label | fetch(" ... ssage") | +| fetch-promise-chain.js:44:3:44:9 | request | semmle.label | request | +| fetch-promise-chain.js:44:3:45:38 | request ... json()) [PromiseValue] | semmle.label | request ... json()) [PromiseValue] | +| fetch-promise-chain.js:45:11:45:18 | response | semmle.label | response | +| fetch-promise-chain.js:45:23:45:30 | response | semmle.label | response | +| fetch-promise-chain.js:45:23:45:37 | response.json() | semmle.label | response.json() | +| fetch-promise-chain.js:46:11:46:14 | data | semmle.label | data | +| fetch-promise-chain.js:47:33:47:36 | data | semmle.label | data | +| fetch-promise-chain.js:47:33:47:44 | data.message | semmle.label | data.message | +| fetch-promise-chain.js:53:3:53:9 | request | semmle.label | request | +| fetch-promise-chain.js:53:13:53:33 | fetch(" ... ssage") | semmle.label | fetch(" ... ssage") | +| fetch-promise-chain.js:54:3:54:9 | request | semmle.label | request | +| fetch-promise-chain.js:54:3:55:38 | request ... text()) [PromiseValue] | semmle.label | request ... text()) [PromiseValue] | +| fetch-promise-chain.js:55:11:55:18 | response | semmle.label | response | +| fetch-promise-chain.js:55:23:55:30 | response | semmle.label | response | +| fetch-promise-chain.js:55:23:55:37 | response.text() | semmle.label | response.text() | +| fetch-promise-chain.js:56:11:56:14 | text | semmle.label | text | +| fetch-promise-chain.js:57:33:57:36 | text | semmle.label | text | +| fetch-promise-chain.js:62:3:62:23 | fetch(" ... ssage") | semmle.label | fetch(" ... ssage") | +| fetch-promise-chain.js:62:3:63:38 | fetch(" ... json()) [PromiseValue] | semmle.label | fetch(" ... json()) [PromiseValue] | +| fetch-promise-chain.js:62:3:64:29 | fetch(" ... .items) [PromiseValue] | semmle.label | fetch(" ... .items) [PromiseValue] | +| fetch-promise-chain.js:63:11:63:18 | response | semmle.label | response | +| fetch-promise-chain.js:63:23:63:30 | response | semmle.label | response | +| fetch-promise-chain.js:63:23:63:37 | response.json() | semmle.label | response.json() | +| fetch-promise-chain.js:64:11:64:14 | data | semmle.label | data | +| fetch-promise-chain.js:64:19:64:22 | data | semmle.label | data | +| fetch-promise-chain.js:64:19:64:28 | data.items | semmle.label | data.items | +| fetch-promise-chain.js:65:11:65:15 | items | semmle.label | items | +| fetch-promise-chain.js:66:7:66:11 | items | semmle.label | items | +| fetch-promise-chain.js:66:21:66:24 | item | semmle.label | item | +| fetch-promise-chain.js:67:55:67:58 | item | semmle.label | item | +| fetch-promise-chain.js:67:55:67:66 | item.message | semmle.label | item.message | +| fetch-promise-chain.js:73:3:73:23 | fetch(" ... ssage") | semmle.label | fetch(" ... ssage") | +| fetch-promise-chain.js:73:3:74:38 | fetch(" ... json()) [PromiseValue] | semmle.label | fetch(" ... json()) [PromiseValue] | +| fetch-promise-chain.js:74:11:74:18 | response | semmle.label | response | +| fetch-promise-chain.js:74:23:74:30 | response | semmle.label | response | +| fetch-promise-chain.js:74:23:74:37 | response.json() | semmle.label | response.json() | +| fetch-promise-chain.js:75:12:75:22 | { message } | semmle.label | { message } | +| fetch-promise-chain.js:75:14:75:20 | message | semmle.label | message | +| fetch-promise-chain.js:76:33:76:39 | message | semmle.label | message | +| fetch-promise-chain.js:81:3:81:23 | fetch(" ... ssage") | semmle.label | fetch(" ... ssage") | +| fetch-promise-chain.js:81:3:82:50 | fetch(" ... json()) [PromiseValue] | semmle.label | fetch(" ... json()) [PromiseValue] | +| fetch-promise-chain.js:82:17:82:24 | response | semmle.label | response | +| fetch-promise-chain.js:82:29:82:49 | await r ... .json() | semmle.label | await r ... .json() | +| fetch-promise-chain.js:82:35:82:42 | response | semmle.label | response | +| fetch-promise-chain.js:82:35:82:49 | response.json() | semmle.label | response.json() | +| fetch-promise-chain.js:83:11:83:14 | data | semmle.label | data | +| fetch-promise-chain.js:84:33:84:36 | data | semmle.label | data | +| fetch-promise-chain.js:84:33:84:44 | data.message | semmle.label | data.message | +| fetch-promise-chain.js:89:3:92:4 | Promise ... ))\\n ]) [PromiseValue, 0] | semmle.label | Promise ... ))\\n ]) [PromiseValue, 0] | +| fetch-promise-chain.js:89:15:92:3 | [\\n f ... ())\\n ] [0, PromiseValue] | semmle.label | [\\n f ... ())\\n ] [0, PromiseValue] | +| fetch-promise-chain.js:90:5:90:25 | fetch(" ... ssage") | semmle.label | fetch(" ... ssage") | +| fetch-promise-chain.js:90:5:91:40 | fetch(" ... json()) [PromiseValue] | semmle.label | fetch(" ... json()) [PromiseValue] | +| fetch-promise-chain.js:91:13:91:20 | response | semmle.label | response | +| fetch-promise-chain.js:91:25:91:32 | response | semmle.label | response | +| fetch-promise-chain.js:91:25:91:39 | response.json() | semmle.label | response.json() | +| fetch-promise-chain.js:92:12:92:17 | [data] [0] | semmle.label | [data] [0] | +| fetch-promise-chain.js:92:13:92:16 | data | semmle.label | data | +| fetch-promise-chain.js:92:13:92:16 | data | semmle.label | data | +| fetch-promise-chain.js:93:31:93:34 | data | semmle.label | data | +| fetch-promise-chain.js:93:31:93:42 | data.message | semmle.label | data.message | +| fetch-promise-chain.js:98:3:98:23 | fetch(" ... ssage") | semmle.label | fetch(" ... ssage") | +| fetch-promise-chain.js:98:3:99:38 | fetch(" ... json()) [PromiseValue] | semmle.label | fetch(" ... json()) [PromiseValue] | +| fetch-promise-chain.js:99:11:99:18 | response | semmle.label | response | +| fetch-promise-chain.js:99:23:99:30 | response | semmle.label | response | +| fetch-promise-chain.js:99:23:99:37 | response.json() | semmle.label | response.json() | +| fetch-promise-chain.js:100:11:100:14 | data | semmle.label | data | +| fetch-promise-chain.js:101:13:101:19 | payload | semmle.label | payload | +| fetch-promise-chain.js:101:23:101:26 | data | semmle.label | data | +| fetch-promise-chain.js:102:33:102:39 | payload | semmle.label | payload | +| fetch-promise-chain.js:102:33:102:47 | payload.message | semmle.label | payload.message | | interceptors.js:7:6:7:13 | response | semmle.label | response | | interceptors.js:8:15:8:31 | userGeneratedHtml | semmle.label | userGeneratedHtml | | interceptors.js:8:35:8:42 | response | semmle.label | response | | interceptors.js:9:56:9:72 | userGeneratedHtml | semmle.label | userGeneratedHtml | +| non-fetch-promise-chain.js:3:3:3:35 | rp("htt ... ssage") | semmle.label | rp("htt ... ssage") | +| non-fetch-promise-chain.js:4:11:4:14 | body | semmle.label | body | +| non-fetch-promise-chain.js:5:33:5:36 | body | semmle.label | body | +| non-fetch-promise-chain.js:11:3:11:56 | rp({ ur ... true }) | semmle.label | rp({ ur ... true }) | +| non-fetch-promise-chain.js:12:11:12:14 | data | semmle.label | data | +| non-fetch-promise-chain.js:13:33:13:36 | data | semmle.label | data | +| non-fetch-promise-chain.js:13:33:13:44 | data.message | semmle.label | data.message | +| non-fetch-promise-chain.js:19:9:19:15 | request | semmle.label | request | +| non-fetch-promise-chain.js:19:19:19:58 | axios.g ... ssage") | semmle.label | axios.g ... ssage") | +| non-fetch-promise-chain.js:20:3:20:9 | request | semmle.label | request | +| non-fetch-promise-chain.js:20:16:20:23 | response | semmle.label | response | +| non-fetch-promise-chain.js:21:31:21:38 | response | semmle.label | response | +| non-fetch-promise-chain.js:21:31:21:51 | respons ... message | semmle.label | respons ... message | +| non-fetch-promise-chain.js:27:3:27:46 | needle( ... ssage") | semmle.label | needle( ... ssage") | +| non-fetch-promise-chain.js:28:11:28:18 | response | semmle.label | response | +| non-fetch-promise-chain.js:29:33:29:40 | response | semmle.label | response | +| non-fetch-promise-chain.js:29:33:29:53 | respons ... message | semmle.label | respons ... message | +| non-fetch-promise-chain.js:35:3:35:47 | superag ... ssage") | semmle.label | superag ... ssage") | +| non-fetch-promise-chain.js:36:11:36:18 | response | semmle.label | response | +| non-fetch-promise-chain.js:37:33:37:40 | response | semmle.label | response | +| non-fetch-promise-chain.js:37:33:37:45 | response.text | semmle.label | response.text | | test.jsx:5:11:5:18 | response | semmle.label | response | | test.jsx:5:22:5:63 | await f ... ntent") | semmle.label | await f ... ntent") | | test.jsx:5:28:5:63 | fetch(" ... ntent") | semmle.label | fetch(" ... ntent") | @@ -197,3 +446,4 @@ nodes | testUseQueries.vue:18:22:18:36 | results[0].data | semmle.label | results[0].data | | testUseQueries.vue:25:10:25:23 | v-html=data2 | semmle.label | v-html=data2 | subpaths +| fetch-promise-chain.js:62:3:63:38 | fetch(" ... json()) [PromiseValue] | fetch-promise-chain.js:64:11:64:14 | data | fetch-promise-chain.js:64:19:64:28 | data.items | fetch-promise-chain.js:62:3:64:29 | fetch(" ... .items) [PromiseValue] | diff --git a/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXssWithResponseThreat/fetch-promise-chain.js b/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXssWithResponseThreat/fetch-promise-chain.js new file mode 100644 index 000000000000..ee6f6731f136 --- /dev/null +++ b/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXssWithResponseThreat/fetch-promise-chain.js @@ -0,0 +1,145 @@ +function insertMessageRows(pageSize, continuationToken) { + let url = "?handler=LoadMessageLogs&pageSize=" + pageSize; + if (continuationToken) { + url += "&continuationToken=" + encodeURIComponent(continuationToken); + } + + fetch(url) // $ Source[js/xss] + .then(response => response.json()) + .then(data => { + const tbody = document.querySelector("#tblMessageLogs tbody"); + tbody.innerHTML = ""; + + data.items.forEach(item => { + const link = `View message`; + const row = ` + ${item.createdDate} + ${item.messageId} + ${item.target ?? ""} + ${link} + `; + tbody.insertAdjacentHTML("beforeend", row); // $ Alert[js/xss] + }); + }); +} + +function insertPlainTextResponse() { + fetch("/api/message") // $ Source[js/xss] + .then(response => response.text()) + .then(text => { + document.body.innerHTML = text; // $ Alert[js/xss] + }); +} + +function assignTextContent() { + fetch("/api/message") + .then(response => response.json()) + .then(data => { + document.body.textContent = data.message; + }); +} + +function insertAliasedFetchResponse() { + const request = fetch("/api/message"); // $ Source[js/xss] + request + .then(response => response.json()) + .then(data => { + document.body.innerHTML = data.message; // $ Alert[js/xss] + }); +} + +function insertReassignedFetchResponse() { + let request; + request = fetch("/api/message"); // $ Source[js/xss] + request + .then(response => response.text()) + .then(text => { + document.body.innerHTML = text; // $ Alert[js/xss] + }); +} + +function insertMessageAfterMultipleThenHops() { + fetch("/api/message") // $ Source[js/xss] + .then(response => response.json()) + .then(data => data.items) + .then(items => { + items.forEach(item => { + document.body.insertAdjacentHTML("beforeend", item.message); // $ Alert[js/xss] + }); + }); +} + +function insertDestructuredMessage() { + fetch("/api/message") // $ Source[js/xss] + .then(response => response.json()) + .then(({ message }) => { + document.body.innerHTML = message; // $ Alert[js/xss] + }); +} + +function insertMessageFromAsyncThenCallback() { + fetch("/api/message") // $ Source[js/xss] + .then(async response => await response.json()) + .then(data => { + document.body.innerHTML = data.message; // $ Alert[js/xss] + }); +} + +function insertPromiseAllMessage() { + Promise.all([ + fetch("/api/message") // $ Source[js/xss] + .then(response => response.json()) + ]).then(([data]) => { + document.body.innerHTML = data.message; // $ Alert[js/xss] + }); +} + +function insertAliasedDataMessage() { + fetch("/api/message") // $ Source[js/xss] + .then(response => response.json()) + .then(data => { + const payload = data; + document.body.innerHTML = payload.message; // $ Alert[js/xss] + }); +} + +function insertSanitizedHtml() { + fetch("/api/message") + .then(response => response.text()) + .then(text => { + document.body.innerHTML = DOMPurify.sanitize(text); + }); +} + +function assignInputValue() { + fetch("/api/message") + .then(response => response.text()) + .then(text => { + document.querySelector("input").value = text; + }); +} + +function assignSafeAttributes() { + fetch("/api/message") + .then(response => response.text()) + .then(text => { + const element = document.querySelector("div"); + element.setAttribute("title", text); + element.setAttribute("aria-label", text); + }); +} + +function catchDoesNotInventResponseValue() { + fetch("/api/message") + .catch(error => { + document.body.innerHTML = error.message; + }); +} + +function finallyDoesNotInventResponseValue() { + let text = ""; + fetch("/api/message") + .finally(() => { + document.body.innerHTML = text; + }); +} diff --git a/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXssWithResponseThreat/non-fetch-promise-chain.js b/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXssWithResponseThreat/non-fetch-promise-chain.js new file mode 100644 index 000000000000..2996c9012fa8 --- /dev/null +++ b/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXssWithResponseThreat/non-fetch-promise-chain.js @@ -0,0 +1,47 @@ +function insertRequestPromiseBody() { + const rp = require("request-promise-native"); + rp("https://example.com/message") // $ Source[js/xss] + .then(body => { + document.body.innerHTML = body; // $ Alert[js/xss] + }); +} + +function insertRequestPromiseJsonBody() { + const rp = require("request-promise"); + rp({ uri: "https://example.com/message", json: true }) // $ Source[js/xss] + .then(data => { + document.body.innerHTML = data.message; // $ Alert[js/xss] + }); +} + +function insertAxiosResponseData() { + const axios = require("axios"); + const request = axios.get("https://example.com/message"); // $ Source[js/xss] + request.then(response => { + document.body.innerHTML = response.data.message; // $ Alert[js/xss] + }); +} + +function insertNeedleResponseBody() { + const needle = require("needle"); + needle("get", "https://example.com/message") // $ Source[js/xss] + .then(response => { + document.body.innerHTML = response.body.message; // $ Alert[js/xss] + }); +} + +function insertSuperagentResponseText() { + const superagent = require("superagent"); + superagent.get("https://example.com/message") // $ Source[js/xss] + .then(response => { + document.body.innerHTML = response.text; // $ Alert[js/xss] + }); +} + +function assignAxiosResponseToInputValue() { + const axios = require("axios"); + axios.get("https://example.com/message") + .then(response => { + document.querySelector("input").value = response.data.message; + }); +} From dc16cbe01b10f1a3f7a234701b2ca64dafacab31 Mon Sep 17 00:00:00 2001 From: "Piotr P. Karwasz" Date: Sun, 28 Jun 2026 00:11:26 +0200 Subject: [PATCH 0074/2098] Java: model org.apache.commons.xml XmlFactories as safe XXE sources Recognize the hardened JAXP factories returned by `org.apache.commons.xml.XmlFactories` (Apache Commons XML) as safely configured, so parsers created from them are no longer reported by the XXE query (CWE-611). Adds an extensible `SafeXmlFactorySource` class to XmlParsers.qll and wires it into the five existing safe-factory flow sources (DocumentBuilderFactory, SAXParserFactory, XMLInputFactory, TransformerFactory, SchemaFactory). `newXPathFactory` is matched for completeness but has no XXE safety chain to feed. The framework model lives in the existing frameworks/apache/CommonsXml.qll. Includes a test stub, safe-case tests, and a change note. Assisted-By: Claude Opus 4.8 (1M context) --- ...2026-08-02-apache-commons-xml-factories.md | 5 ++ .../java/frameworks/apache/CommonsXml.qll | 22 +++++++ .../semmle/code/java/security/XmlParsers.qll | 19 ++++++ .../security/CWE-611/XmlFactoriesTests.java | 62 +++++++++++++++++++ .../test/query-tests/security/CWE-611/options | 2 +- .../org/apache/commons/xml/XmlFactories.java | 39 ++++++++++++ 6 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 java/ql/lib/change-notes/2026-08-02-apache-commons-xml-factories.md create mode 100644 java/ql/test/query-tests/security/CWE-611/XmlFactoriesTests.java create mode 100644 java/ql/test/stubs/apache-commons-xml-0.1.0/org/apache/commons/xml/XmlFactories.java diff --git a/java/ql/lib/change-notes/2026-08-02-apache-commons-xml-factories.md b/java/ql/lib/change-notes/2026-08-02-apache-commons-xml-factories.md new file mode 100644 index 000000000000..6ec4686065be --- /dev/null +++ b/java/ql/lib/change-notes/2026-08-02-apache-commons-xml-factories.md @@ -0,0 +1,5 @@ +--- +category: feature +--- +* Factories returned by the Apache Commons XML (`org.apache.commons.xml.XmlFactories`) hardening library are now recognized as safely configured by the XXE query. +* A new extensible class `SafeXmlFactorySource` was added to `semmle.code.java.security.XmlParsers` for modeling sources of pre-hardened JAXP factories. diff --git a/java/ql/lib/semmle/code/java/frameworks/apache/CommonsXml.qll b/java/ql/lib/semmle/code/java/frameworks/apache/CommonsXml.qll index 163bd773dad0..aa6d840a0782 100644 --- a/java/ql/lib/semmle/code/java/frameworks/apache/CommonsXml.qll +++ b/java/ql/lib/semmle/code/java/frameworks/apache/CommonsXml.qll @@ -90,3 +90,25 @@ private module SafeDigesterFlowConfig implements DataFlow::ConfigSig { } private module SafeDigesterFlow = DataFlow::Global; + +/** + * A call to one of the `org.apache.commons.xml.XmlFactories.newXxxFactory()` methods + * of the Apache Commons XML library. + * + * Every such method returns a fresh JAXP factory that has already been hardened against + * XML external entity (XXE) attacks, so any parser created from it is treated as safe. + * + * `newXPathFactory` is matched for completeness, but the XXE model has no `XPathFactory` + * safety chain (the XXE sink for XPath is the document being evaluated, not the factory), + * so it currently has no effect on XXE results. + */ +private class CommonsXmlSafeXmlFactory extends SafeXmlFactorySource, MethodCall { + CommonsXmlSafeXmlFactory() { + this.getMethod().getDeclaringType().hasQualifiedName("org.apache.commons.xml", "XmlFactories") and + this.getMethod() + .hasName([ + "newDocumentBuilderFactory", "newSAXParserFactory", "newXMLInputFactory", + "newTransformerFactory", "newSchemaFactory", "newXPathFactory" + ]) + } +} diff --git a/java/ql/lib/semmle/code/java/security/XmlParsers.qll b/java/ql/lib/semmle/code/java/security/XmlParsers.qll index 602076996a77..4a30ded19e3a 100644 --- a/java/ql/lib/semmle/code/java/security/XmlParsers.qll +++ b/java/ql/lib/semmle/code/java/security/XmlParsers.qll @@ -56,6 +56,15 @@ abstract class ParserConfig extends MethodCall { } } +/** + * An expression that evaluates to a JAXP parser factory (such as a + * `DocumentBuilderFactory` or `SAXParserFactory`) that has already been hardened + * against XML external entity (XXE) attacks, for example by a helper library. + * + * Extend this class to model additional sources of pre-hardened JAXP factories. + */ +abstract class SafeXmlFactorySource extends Expr { } + /* * https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html#jaxp-documentbuilderfactory-saxparserfactory-and-dom4j */ @@ -156,6 +165,8 @@ private class DocumentBuilderConstruction extends MethodCall { private predicate safeDocumentBuilderFactoryNode(DataFlow::Node src) { src.asExpr() instanceof SafeDocumentBuilderFactory + or + src.asExpr().(SafeXmlFactorySource).getType() instanceof DocumentBuilderFactory } private module SafeDocumentBuilderFactoryToDocumentBuilderConstructionFlow = @@ -219,6 +230,8 @@ class XmlInputFactoryStreamReader extends XmlParserCall { private predicate safeXmlInputFactoryNode(DataFlow::Node src) { src.asExpr() instanceof SafeXmlInputFactory + or + src.asExpr().(SafeXmlFactorySource).getType() instanceof XmlInputFactory } private module SafeXmlInputFactoryToXmlInputFactoryReaderFlow = @@ -456,6 +469,8 @@ class SafeSaxParserFactory extends VarAccess { private predicate safeSaxParserFactoryNode(DataFlow::Node src) { src.asExpr() instanceof SafeSaxParserFactory + or + src.asExpr().(SafeXmlFactorySource).getType() instanceof SaxParserFactory } private module SafeSaxParserFactoryToNewSaxParserFlow = @@ -831,6 +846,8 @@ class TransformerFactoryConfig extends TransformerConfig { private predicate safeTransformerFactoryNode(DataFlow::Node src) { src.asExpr() instanceof SafeTransformerFactory + or + src.asExpr().(SafeXmlFactorySource).getType() instanceof TransformerFactory } private module SafeTransformerFactoryFlow = DataFlow::SimpleGlobal; @@ -920,6 +937,8 @@ class SchemaFactoryNewSchema extends XmlParserCall { private predicate safeSchemaFactoryNode(DataFlow::Node src) { src.asExpr() instanceof SafeSchemaFactory + or + src.asExpr().(SafeXmlFactorySource).getType() instanceof SchemaFactory } private module SafeSchemaFactoryToSchemaFactoryNewSchemaFlow = diff --git a/java/ql/test/query-tests/security/CWE-611/XmlFactoriesTests.java b/java/ql/test/query-tests/security/CWE-611/XmlFactoriesTests.java new file mode 100644 index 000000000000..ebb1b54e3382 --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-611/XmlFactoriesTests.java @@ -0,0 +1,62 @@ +import java.net.Socket; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; +import javax.xml.stream.XMLInputFactory; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.stream.StreamSource; +import javax.xml.validation.Schema; +import javax.xml.validation.SchemaFactory; + +import org.xml.sax.XMLReader; +import org.xml.sax.helpers.DefaultHandler; + +import org.apache.commons.xml.XmlFactories; + +// Every factory returned by `org.apache.commons.xml.XmlFactories` is already hardened against +// XXE, so the parsers created from them must not be reported. +public class XmlFactoriesTests { + + public void hardenedDocumentBuilder(Socket sock) throws Exception { + DocumentBuilderFactory factory = XmlFactories.newDocumentBuilderFactory(); + DocumentBuilder builder = factory.newDocumentBuilder(); + builder.parse(sock.getInputStream()); // safe + } + + public void hardenedDocumentBuilderChained(Socket sock) throws Exception { + XmlFactories.newDocumentBuilderFactory().newDocumentBuilder().parse(sock.getInputStream()); // safe + } + + public void hardenedSaxParser(Socket sock) throws Exception { + SAXParserFactory factory = XmlFactories.newSAXParserFactory(); + SAXParser parser = factory.newSAXParser(); + parser.parse(sock.getInputStream(), new DefaultHandler()); // safe + } + + public void hardenedSaxParserXmlReader(Socket sock) throws Exception { + SAXParser parser = XmlFactories.newSAXParserFactory().newSAXParser(); + XMLReader reader = parser.getXMLReader(); + reader.parse(new org.xml.sax.InputSource(sock.getInputStream())); // safe + } + + public void hardenedXmlInputFactory(Socket sock) throws Exception { + XMLInputFactory factory = XmlFactories.newXMLInputFactory(); + factory.createXMLStreamReader(sock.getInputStream()); // safe + factory.createXMLEventReader(sock.getInputStream()); // safe + } + + public void hardenedTransformer(Socket sock) throws Exception { + TransformerFactory tf = XmlFactories.newTransformerFactory(); + Transformer transformer = tf.newTransformer(); + transformer.transform(new StreamSource(sock.getInputStream()), null); // safe + tf.newTransformer(new StreamSource(sock.getInputStream())); // safe + } + + public void hardenedSchema(Socket sock) throws Exception { + SchemaFactory factory = XmlFactories.newSchemaFactory(); + Schema schema = factory.newSchema(new StreamSource(sock.getInputStream())); // safe + } +} diff --git a/java/ql/test/query-tests/security/CWE-611/options b/java/ql/test/query-tests/security/CWE-611/options index 190e6b2af0c6..1d6e3c40b307 100644 --- a/java/ql/test/query-tests/security/CWE-611/options +++ b/java/ql/test/query-tests/security/CWE-611/options @@ -1 +1 @@ -//semmle-extractor-options: --javac-args -cp ${testdir}/../../../stubs/jdom-1.1.3:${testdir}/../../../stubs/dom4j-2.1.1:${testdir}/../../../stubs/simple-xml-2.7.1:${testdir}/../../../stubs/jaxb-api-2.3.1:${testdir}/../../../stubs/jaxen-1.2.0:${testdir}/../../../stubs/apache-commons-digester3-3.2:${testdir}/../../../stubs/servlet-api-2.4/:${testdir}/../../../stubs/rundeck-api-java-client-13.2:${testdir}/../../../stubs/springframework-5.8.x/:${testdir}/../../../stubs/mdht-1.2.0/:${testdir}/../../../stubs/woodstox-core-6.4.0 +//semmle-extractor-options: --javac-args -cp ${testdir}/../../../stubs/jdom-1.1.3:${testdir}/../../../stubs/dom4j-2.1.1:${testdir}/../../../stubs/simple-xml-2.7.1:${testdir}/../../../stubs/jaxb-api-2.3.1:${testdir}/../../../stubs/jaxen-1.2.0:${testdir}/../../../stubs/apache-commons-digester3-3.2:${testdir}/../../../stubs/servlet-api-2.4/:${testdir}/../../../stubs/rundeck-api-java-client-13.2:${testdir}/../../../stubs/springframework-5.8.x/:${testdir}/../../../stubs/mdht-1.2.0/:${testdir}/../../../stubs/woodstox-core-6.4.0:${testdir}/../../../stubs/apache-commons-xml-0.1.0 diff --git a/java/ql/test/stubs/apache-commons-xml-0.1.0/org/apache/commons/xml/XmlFactories.java b/java/ql/test/stubs/apache-commons-xml-0.1.0/org/apache/commons/xml/XmlFactories.java new file mode 100644 index 000000000000..733a3f5aad33 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-xml-0.1.0/org/apache/commons/xml/XmlFactories.java @@ -0,0 +1,39 @@ +// Minimal stub of org.apache.commons.xml.XmlFactories for testing purposes + +package org.apache.commons.xml; + +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.SAXParserFactory; +import javax.xml.stream.XMLInputFactory; +import javax.xml.transform.TransformerFactory; +import javax.xml.validation.SchemaFactory; +import javax.xml.xpath.XPathFactory; + +public final class XmlFactories { + + public static DocumentBuilderFactory newDocumentBuilderFactory() { + return null; + } + + public static SAXParserFactory newSAXParserFactory() { + return null; + } + + public static SchemaFactory newSchemaFactory() { + return null; + } + + public static TransformerFactory newTransformerFactory() { + return null; + } + + public static XMLInputFactory newXMLInputFactory() { + return null; + } + + public static XPathFactory newXPathFactory() { + return null; + } + + private XmlFactories() {} +} From 1d6ac57dd63a91b85a02a5b0bc5490510d6aa1f6 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Mon, 3 Aug 2026 15:36:47 +0200 Subject: [PATCH 0075/2098] Rust: Restore built-in derive macro expansion under rust-analyzer 0.0.328 rust-analyzer 0.0.317 re-modeled built-in derives (`Debug`, `PartialEq`, `Eq`, ...) as synthetic impls rather than syntactic macro expansions, so `Semantics::expand_derive_macro` returns nothing for them and the 0.0.328 upgrade silently dropped their extraction. This regressed queries that depend on the derived impls (e.g. `rust/insecure-cookie`). Reconstruct the expansions extractor-side by re-running the still-public built-in derive expander over the ADT and emitting the resulting `impl` items. Synthesized nodes are not in the semantics cache, so their source locations are resolved through the expansion span map instead of `Semantics::original_range`. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 86c6ce1d-a625-491a-94ea-eae08d3cc1be --- Cargo.lock | 1 + MODULE.bazel | 1 + .../tree_sitter_extractors_deps/BUILD.bazel | 12 + .../tree_sitter_extractors_deps/defs.bzl | 2 + rust/extractor/Cargo.toml | 1 + rust/extractor/src/translate/base.rs | 105 +++- .../canonical_path/canonical_paths.expected | 3 + .../generated/MacroItems/MacroItems.expected | 2 + .../macro-expansion/PrintAst.expected | 197 +++++++ .../macro-expansion/test.expected | 3 + .../type-inference/type-inference.expected | 23 +- .../security/CWE-614/InsecureCookie.expected | 528 ++++++++++++++---- 12 files changed, 750 insertions(+), 128 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a6fc6ddca7ff..4c787086bddc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -505,6 +505,7 @@ dependencies = [ "ra_ap_project_model", "ra_ap_span", "ra_ap_syntax", + "ra_ap_syntax-bridge", "ra_ap_vfs", "rust-extractor-macros", "serde", diff --git a/MODULE.bazel b/MODULE.bazel index 9ecf728200fb..e06b7ce9bbdc 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -135,6 +135,7 @@ use_repo( "vendor_ts__ra_ap_span-0.0.328", "vendor_ts__ra_ap_stdx-0.0.328", "vendor_ts__ra_ap_syntax-0.0.328", + "vendor_ts__ra_ap_syntax-bridge-0.0.328", "vendor_ts__ra_ap_vfs-0.0.328", "vendor_ts__rand-0.10.1", "vendor_ts__rayon-1.12.0", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bazel index 8d1a63e1e5ef..579a8a61fd86 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bazel @@ -457,6 +457,18 @@ alias( tags = ["manual"], ) +alias( + name = "ra_ap_syntax-bridge-0.0.328", + actual = "@vendor_ts__ra_ap_syntax-bridge-0.0.328//:ra_ap_syntax_bridge", + tags = ["manual"], +) + +alias( + name = "ra_ap_syntax-bridge", + actual = "@vendor_ts__ra_ap_syntax-bridge-0.0.328//:ra_ap_syntax_bridge", + tags = ["manual"], +) + alias( name = "ra_ap_vfs-0.0.328", actual = "@vendor_ts__ra_ap_vfs-0.0.328//:ra_ap_vfs", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/defs.bzl b/misc/bazel/3rdparty/tree_sitter_extractors_deps/defs.bzl index 75ec0cf7fd85..a1542cc9cda4 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/defs.bzl +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/defs.bzl @@ -350,6 +350,7 @@ _NORMAL_DEPENDENCIES = { "ra_ap_project_model": Label("@vendor_ts__ra_ap_project_model-0.0.328//:ra_ap_project_model"), "ra_ap_span": Label("@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span"), "ra_ap_syntax": Label("@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax"), + "ra_ap_syntax-bridge": Label("@vendor_ts__ra_ap_syntax-bridge-0.0.328//:ra_ap_syntax_bridge"), "ra_ap_vfs": Label("@vendor_ts__ra_ap_vfs-0.0.328//:ra_ap_vfs"), "serde": Label("@vendor_ts__serde-1.0.228//:serde"), "serde_json": Label("@vendor_ts__serde_json-1.0.150//:serde_json"), @@ -4498,6 +4499,7 @@ def crate_repositories(): struct(repo = "vendor_ts__ra_ap_span-0.0.328", is_dev_dep = False), struct(repo = "vendor_ts__ra_ap_stdx-0.0.328", is_dev_dep = False), struct(repo = "vendor_ts__ra_ap_syntax-0.0.328", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_syntax-bridge-0.0.328", is_dev_dep = False), struct(repo = "vendor_ts__ra_ap_vfs-0.0.328", is_dev_dep = False), struct(repo = "vendor_ts__rayon-1.12.0", is_dev_dep = False), struct(repo = "vendor_ts__regex-1.12.3", is_dev_dep = False), diff --git a/rust/extractor/Cargo.toml b/rust/extractor/Cargo.toml index 41199b7c8f98..60376b5b67e8 100644 --- a/rust/extractor/Cargo.toml +++ b/rust/extractor/Cargo.toml @@ -20,6 +20,7 @@ ra_ap_load-cargo = "0.0.328" ra_ap_paths = "0.0.328" ra_ap_project_model = "0.0.328" ra_ap_syntax = "0.0.328" +ra_ap_syntax-bridge = "0.0.328" ra_ap_vfs = "0.0.328" ra_ap_parser = "0.0.328" ra_ap_span = "0.0.328" diff --git a/rust/extractor/src/translate/base.rs b/rust/extractor/src/translate/base.rs index 403e69c50c39..62ff3d5fa10e 100644 --- a/rust/extractor/src/translate/base.rs +++ b/rust/extractor/src/translate/base.rs @@ -6,16 +6,19 @@ use crate::trap::{Label, TrapClass}; use ra_ap_base_db::EditionedFileId; use ra_ap_hir::Semantics; use ra_ap_hir::db::ExpandDatabase; -use ra_ap_hir_expand::{ExpandResult, ExpandTo, InFile}; +use ra_ap_hir_expand::builtin::{BuiltinDeriveExpander, find_builtin_derive}; +use ra_ap_hir_expand::span_map::ExpansionSpanMap; +use ra_ap_hir_expand::{ExpandResult, ExpandTo, InFile, map_node_range_up_rooted}; use ra_ap_ide_db::RootDatabase; use ra_ap_ide_db::line_index::{LineCol, LineIndex}; -use ra_ap_parser::SyntaxKind; +use ra_ap_parser::{SyntaxKind, TopEntryPoint}; use ra_ap_span::TextSize; use ra_ap_syntax::ast::HasAttrs; use ra_ap_syntax::{ AstNode, NodeOrToken, SyntaxElementChildren, SyntaxError, SyntaxNode, SyntaxToken, TextRange, ast, }; +use ra_ap_syntax_bridge::{DocCommentDesugarMode, syntax_node_to_token_tree, token_tree_to_syntax_node}; impl Emission for Translator<'_> { fn pre_emit(&mut self, node: &ast::Item) -> Option> { @@ -128,6 +131,10 @@ pub struct Translator<'a> { source_kind: SourceKind, pub(crate) macro_context_depth: usize, diagnostic_count: usize, + /// When emitting a reconstructed built-in derive expansion, holds the span map of the + /// synthesized syntax tree. Those nodes are not registered in the semantics cache, so + /// locations are resolved through this map instead of `Semantics::original_range`. + builtin_derive_span_map: Option, } const UNKNOWN_LOCATION: (LineCol, LineCol) = @@ -154,6 +161,7 @@ impl<'a> Translator<'a> { source_kind, macro_context_depth: 0, diagnostic_count: 0, + builtin_derive_span_map: None, } } fn location(&self, range: TextRange) -> Option<(LineCol, LineCol)> { @@ -177,6 +185,15 @@ impl<'a> Translator<'a> { } pub fn text_range_for_node(&mut self, node: &impl ast::AstNode) -> Option { + if let Some(span_map) = self.builtin_derive_span_map.as_ref() { + // Nodes synthesized by a reconstructed built-in derive expansion are not in the + // semantics cache; resolve their original source range through the expansion span map. + let semantics = self.semantics.as_ref()?; + let file_id = self.file_id?; + let file_range = + map_node_range_up_rooted(semantics.db, span_map, node.syntax().text_range())?; + return (file_id == file_range.file_id).then_some(file_range.range); + } if let Some(semantics) = self.semantics.as_ref() { let file_range = semantics.original_range(node.syntax()); let file_id = self.file_id?; @@ -411,6 +428,11 @@ impl<'a> Translator<'a> { // way as from version 0.0.274 rust-analyser only expands in the context of an expansion return; } + if self.builtin_derive_span_map.is_some() { + // inside a reconstructed built-in derive expansion the macro call is not registered in + // the semantics cache, so it cannot (and need not) be expanded further + return; + } if let Some(expanded) = self .semantics .as_ref() @@ -582,7 +604,8 @@ impl<'a> Translator<'a> { fn is_attribute_macro_target(&self, node: &ast::Item) -> bool { // rust-analyzer considers as an `attr_macro_call` also a plain macro call, but we want to // process that differently (in `extract_macro_call_expanded`) - !matches!(node, ast::Item::MacroCall(_)) + self.builtin_derive_span_map.is_none() + && !matches!(node, ast::Item::MacroCall(_)) && self.semantics.is_some_and(|semantics| { let file = semantics.hir_file_for(node.syntax()); let node = InFile::new(file, node); @@ -703,6 +726,51 @@ impl<'a> Translator<'a> { } } + /// Reconstructs the expansion of a built-in derive macro (e.g. `Debug`, `PartialEq`). + /// + /// Since rust-analyzer 0.0.317 built-in derives are modeled as synthetic impls rather than + /// syntactic macro expansions, `Semantics::expand_derive_macro` no longer returns anything for + /// them. We re-run the still-public built-in derive expander over the ADT and emit the resulting + /// `impl` items ourselves. The synthesized nodes are not registered in the semantics + /// cache, so `builtin_derive_span_map` is set for the duration of the emission to route their + /// locations through the expansion span map. + fn emit_builtin_derive_expansion( + &mut self, + adt: &ast::Adt, + expander: BuiltinDeriveExpander, + ) -> Option> { + let semantics = self.semantics?; + let db = semantics.db; + let file_id = semantics.hir_file_for(adt.syntax()); + let span_map = db.span_map(file_id); + let call_site = span_map.span_for_range(adt.syntax().text_range()); + let input = syntax_node_to_token_tree( + adt.syntax(), + span_map.as_ref(), + call_site, + DocCommentDesugarMode::ProcMacro, + ); + let ExpandResult { value: output, err } = expander.expander()(db, call_site, &input); + let edition = self.file_id?.edition(db); + let (parsed, output_span_map) = + token_tree_to_syntax_node(&output, TopEntryPoint::MacroItems, &mut |_| edition); + let items = ast::MacroItems::cast(parsed.syntax_node())?; + if let Some(err) = err { + let rendered = err.render_to_string(db); + self.emit_diagnostic_for_node( + adt, + DiagnosticSeverity::Warning, + "item_expansion".to_owned(), + format!("built-in derive expansion failed ({})", rendered.kind), + rendered.message, + ); + } + let previous = self.builtin_derive_span_map.replace(output_span_map); + let result = self.emit_macro_items(&items); + self.builtin_derive_span_map = previous; + result + } + pub(crate) fn emit_derive_expansion( &mut self, node: &(impl Into + Clone), @@ -712,14 +780,29 @@ impl<'a> Translator<'a> { return; }; let node: ast::Adt = node.clone().into(); - let expansions = node - .attrs() - .filter_map(|attr| attr.meta()) - .filter_map(|meta| semantics.expand_derive_macro(&meta)) - .flatten() - .flatten() - .filter_map(|expanded| self.process_item_macro_expansion(&node, expanded)) - .collect::>(); + let mut expansions = Vec::new(); + for meta in node.attrs().filter_map(|attr| attr.meta()) { + let Some(expanded) = semantics.expand_derive_macro(&meta) else { + continue; + }; + // `resolve_derive_macro` yields one entry per derive, including built-in ones for which + // `expand_derive_macro` returns `None`; we use it to recover the built-in expander. + let resolved = semantics.resolve_derive_macro(&meta).unwrap_or_default(); + for (i, expanded) in expanded.into_iter().enumerate() { + let label = if let Some(expanded) = expanded { + self.process_item_macro_expansion(&node, expanded) + } else if let Some(expander) = resolved + .get(i) + .and_then(|m| m.as_ref()) + .and_then(|m| find_builtin_derive(&m.name(semantics.db))) + { + self.emit_builtin_derive_expansion(&node, expander) + } else { + None + }; + expansions.extend(label); + } + } generated::TypeItem::emit_derive_macro_expansions( label.into(), expansions, diff --git a/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected b/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected index 5778e6f3a83a..b6187932ec9b 100644 --- a/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected +++ b/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected @@ -3,6 +3,9 @@ | {EXTERNAL LOCATION} | fn trim | ::trim | | lib.rs:1:1:1:18 | mod anonymous | test::anonymous | | lib.rs:2:1:2:16 | mod regular | test::regular | +| regular.rs:1:1:2:18 | fn eq | ::eq | +| regular.rs:1:1:2:18 | impl ...::Eq for Struct::<...> { ... } | | +| regular.rs:1:1:2:18 | impl ...::PartialEq for Struct::<...> { ... } | | | regular.rs:1:1:2:18 | struct Struct | test::regular::Struct | | regular.rs:4:1:6:1 | trait Trait | test::regular::Trait | | regular.rs:5:5:5:16 | fn f | <_ as test::regular::Trait>::f | diff --git a/rust/ql/test/extractor-tests/generated/MacroItems/MacroItems.expected b/rust/ql/test/extractor-tests/generated/MacroItems/MacroItems.expected index c7b6ab807aac..a3560c0fdef1 100644 --- a/rust/ql/test/extractor-tests/generated/MacroItems/MacroItems.expected +++ b/rust/ql/test/extractor-tests/generated/MacroItems/MacroItems.expected @@ -1,5 +1,7 @@ instances | gen_macro_items.rs:5:5:5:12 | MacroItems | +| gen_macro_items.rs:12:5:13:15 | MacroItems | getItem | gen_macro_items.rs:5:5:5:12 | MacroItems | 0 | gen_macro_items.rs:5:5:5:38 | use ...::Path | | gen_macro_items.rs:5:5:5:12 | MacroItems | 1 | gen_macro_items.rs:5:5:5:38 | fn get_parent | +| gen_macro_items.rs:12:5:13:15 | MacroItems | 0 | gen_macro_items.rs:12:5:13:15 | impl ...::Debug for Bar::<...> { ... } | diff --git a/rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected b/rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected index a12af2dc3ed9..672ce3d5bbe6 100644 --- a/rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected +++ b/rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected @@ -720,6 +720,94 @@ macro_expansion.rs: # 79| getSegment(): [PathSegment] i32 # 79| getIdentifier(): [NameRef] i32 # 83| getItem(17): [Struct] struct MyDerive +# 83| getDeriveMacroExpansion(0): [MacroItems] MacroItems +# 83| getItem(0): [Impl] impl ...::Debug for MyDerive::<...> { ... } +# 83| getAssocItemList(): [AssocItemList] AssocItemList +# 83| getAssocItem(0): [Function] fn fmt +# 83| getParamList(): [ParamList] ParamList +# 83| getParam(0): [Param] ...: ... +# 83| getTypeRepr(): [RefTypeRepr] RefTypeRepr +# 83| getTypeRepr(): [PathTypeRepr] ...::Formatter +# 83| getPath(): [Path] ...::Formatter +# 83| getQualifier(): [Path] ...::fmt +# 83| getQualifier(): [Path] $crate +# 83| getSegment(): [PathSegment] $crate +# 83| getIdentifier(): [NameRef] $crate +# 83| getSegment(): [PathSegment] fmt +# 83| getIdentifier(): [NameRef] fmt +# 83| getSegment(): [PathSegment] Formatter +# 83| getIdentifier(): [NameRef] Formatter +# 83| getPat(): [IdentPat] f +# 83| getName(): [Name] f +# 83| getSelfParam(): [SelfParam] SelfParam +# 83| getName(): [Name] self +# 83| getFunctionBody(): [BlockExpr] { ... } +# 83| getStmtList(): [StmtList] StmtList +# 83| getTailExpr(): [MatchExpr] match self { ... } +# 83| getScrutinee(): [VariableAccess] self +# 83| getPath(): [Path] self +# 83| getSegment(): [PathSegment] self +# 83| getIdentifier(): [NameRef] self +# 83| getMatchArmList(): [MatchArmList] MatchArmList +# 83| getArm(0): [MatchArm] ... => ... +# 83| getExpr(): [MethodCallExpr] ... .finish() +# 83| getArgList(): [ArgList] ArgList +# 83| getIdentifier(): [NameRef] finish +# 83| getReceiver(): [MethodCallExpr] ... .field(...) +# 83| getArgList(): [ArgList] ArgList +# 83| getArg(0): [StringLiteralExpr] "field" +# 83| getArg(1): [RefExpr] &field +# 85| getExpr(): [VariableAccess] field +# 85| getPath(): [Path] field +# 85| getSegment(): [PathSegment] field +# 85| getIdentifier(): [NameRef] field +# 83| getIdentifier(): [NameRef] field +# 83| getReceiver(): [MethodCallExpr] f.debug_struct(...) +# 83| getArgList(): [ArgList] ArgList +# 83| getArg(0): [StringLiteralExpr] "MyDerive" +# 83| getIdentifier(): [NameRef] debug_struct +# 83| getReceiver(): [VariableAccess] f +# 83| getPath(): [Path] f +# 83| getSegment(): [PathSegment] f +# 83| getIdentifier(): [NameRef] f +# 83| getPat(): [StructPat] MyDerive {...} +# 84| getPath(): [Path] MyDerive +# 84| getSegment(): [PathSegment] MyDerive +# 84| getIdentifier(): [NameRef] MyDerive +# 83| getStructPatFieldList(): [StructPatFieldList] StructPatFieldList +# 83| getField(0): [StructPatField] field: ... +# 85| getIdentifier(): [NameRef] field +# 85| getPat(): [IdentPat] field +# 85| getName(): [Name] field +# 83| getName(): [Name] fmt +# 83| getRetType(): [RetTypeRepr] RetTypeRepr +# 83| getTypeRepr(): [PathTypeRepr] ...::Result +# 83| getPath(): [Path] ...::Result +# 83| getQualifier(): [Path] ...::fmt +# 83| getQualifier(): [Path] $crate +# 83| getSegment(): [PathSegment] $crate +# 83| getIdentifier(): [NameRef] $crate +# 83| getSegment(): [PathSegment] fmt +# 83| getIdentifier(): [NameRef] fmt +# 83| getSegment(): [PathSegment] Result +# 83| getIdentifier(): [NameRef] Result +# 83| getGenericParamList(): [GenericParamList] <...> +# 83| getSelfTy(): [PathTypeRepr] MyDerive::<...> +# 83| getPath(): [Path] MyDerive::<...> +# 83| getSegment(): [PathSegment] MyDerive::<...> +# 83| getGenericArgList(): [GenericArgList] <...> +# 84| getIdentifier(): [NameRef] MyDerive +# 83| getTrait(): [PathTypeRepr] ...::Debug +# 83| getPath(): [Path] ...::Debug +# 83| getQualifier(): [Path] ...::fmt +# 83| getQualifier(): [Path] $crate +# 83| getSegment(): [PathSegment] $crate +# 83| getIdentifier(): [NameRef] $crate +# 83| getSegment(): [PathSegment] fmt +# 83| getIdentifier(): [NameRef] fmt +# 83| getSegment(): [PathSegment] Debug +# 83| getIdentifier(): [NameRef] Debug +# 83| getWhereClause(): [WhereClause] WhereClause # 83| getAttr(0): [Attr] Attr # 83| getMeta(): [TokenTreeMeta] TokenTreeMeta # 83| getPath(): [Path] derive @@ -735,6 +823,115 @@ macro_expansion.rs: # 85| getSegment(): [PathSegment] usize # 85| getIdentifier(): [NameRef] usize # 88| getItem(18): [Enum] enum MyDeriveEnum +# 88| getDeriveMacroExpansion(0): [MacroItems] MacroItems +# 88| getItem(0): [Impl] impl ...::PartialEq for MyDeriveEnum::<...> { ... } +# 88| getAssocItemList(): [AssocItemList] AssocItemList +# 88| getAssocItem(0): [Function] fn eq +# 88| getParamList(): [ParamList] ParamList +# 88| getParam(0): [Param] ...: ... +# 88| getTypeRepr(): [RefTypeRepr] RefTypeRepr +# 88| getTypeRepr(): [PathTypeRepr] Self +# 88| getPath(): [Path] Self +# 88| getSegment(): [PathSegment] Self +# 88| getIdentifier(): [NameRef] Self +# 88| getPat(): [IdentPat] other +# 88| getName(): [Name] other +# 88| getSelfParam(): [SelfParam] SelfParam +# 88| getName(): [Name] self +# 88| getFunctionBody(): [BlockExpr] { ... } +# 88| getStmtList(): [StmtList] StmtList +# 88| getTailExpr(): [MatchExpr] match ... { ... } +# 88| getScrutinee(): [TupleExpr] TupleExpr +# 88| getField(0): [VariableAccess] self +# 88| getPath(): [Path] self +# 88| getSegment(): [PathSegment] self +# 88| getIdentifier(): [NameRef] self +# 88| getField(1): [VariableAccess] other +# 88| getPath(): [Path] other +# 88| getSegment(): [PathSegment] other +# 88| getIdentifier(): [NameRef] other +# 88| getMatchArmList(): [MatchArmList] MatchArmList +# 88| getArm(0): [MatchArm] ... => true +# 88| getExpr(): [BooleanLiteralExpr] true +# 88| getPat(): [TuplePat] TuplePat +# 88| getField(0): [PathPat] ...::Variant1 +# 88| getPath(): [Path] ...::Variant1 +# 89| getQualifier(): [Path] MyDeriveEnum +# 89| getSegment(): [PathSegment] MyDeriveEnum +# 89| getIdentifier(): [NameRef] MyDeriveEnum +# 90| getSegment(): [PathSegment] Variant1 +# 90| getIdentifier(): [NameRef] Variant1 +# 88| getField(1): [PathPat] ...::Variant1 +# 88| getPath(): [Path] ...::Variant1 +# 89| getQualifier(): [Path] MyDeriveEnum +# 89| getSegment(): [PathSegment] MyDeriveEnum +# 89| getIdentifier(): [NameRef] MyDeriveEnum +# 90| getSegment(): [PathSegment] Variant1 +# 90| getIdentifier(): [NameRef] Variant1 +# 88| getArm(1): [MatchArm] ... => true +# 88| getExpr(): [BooleanLiteralExpr] true +# 88| getPat(): [TuplePat] TuplePat +# 88| getField(0): [PathPat] ...::Variant2 +# 88| getPath(): [Path] ...::Variant2 +# 89| getQualifier(): [Path] MyDeriveEnum +# 89| getSegment(): [PathSegment] MyDeriveEnum +# 89| getIdentifier(): [NameRef] MyDeriveEnum +# 91| getSegment(): [PathSegment] Variant2 +# 91| getIdentifier(): [NameRef] Variant2 +# 88| getField(1): [PathPat] ...::Variant2 +# 88| getPath(): [Path] ...::Variant2 +# 89| getQualifier(): [Path] MyDeriveEnum +# 89| getSegment(): [PathSegment] MyDeriveEnum +# 89| getIdentifier(): [NameRef] MyDeriveEnum +# 91| getSegment(): [PathSegment] Variant2 +# 91| getIdentifier(): [NameRef] Variant2 +# 88| getArm(2): [MatchArm] ... => false +# 88| getExpr(): [BooleanLiteralExpr] false +# 88| getPat(): [IdentPat] _unused +# 88| getName(): [Name] _unused +# 88| getName(): [Name] eq +# 88| getRetType(): [RetTypeRepr] RetTypeRepr +# 88| getTypeRepr(): [PathTypeRepr] bool +# 88| getPath(): [Path] bool +# 88| getSegment(): [PathSegment] bool +# 88| getIdentifier(): [NameRef] bool +# 88| getGenericParamList(): [GenericParamList] <...> +# 88| getSelfTy(): [PathTypeRepr] MyDeriveEnum::<...> +# 88| getPath(): [Path] MyDeriveEnum::<...> +# 88| getSegment(): [PathSegment] MyDeriveEnum::<...> +# 88| getGenericArgList(): [GenericArgList] <...> +# 89| getIdentifier(): [NameRef] MyDeriveEnum +# 88| getTrait(): [PathTypeRepr] ...::PartialEq +# 88| getPath(): [Path] ...::PartialEq +# 88| getQualifier(): [Path] ...::cmp +# 88| getQualifier(): [Path] $crate +# 88| getSegment(): [PathSegment] $crate +# 88| getIdentifier(): [NameRef] $crate +# 88| getSegment(): [PathSegment] cmp +# 88| getIdentifier(): [NameRef] cmp +# 88| getSegment(): [PathSegment] PartialEq +# 88| getIdentifier(): [NameRef] PartialEq +# 88| getWhereClause(): [WhereClause] WhereClause +# 88| getDeriveMacroExpansion(1): [MacroItems] MacroItems +# 88| getItem(0): [Impl] impl ...::Eq for MyDeriveEnum::<...> { ... } +# 88| getAssocItemList(): [AssocItemList] AssocItemList +# 88| getGenericParamList(): [GenericParamList] <...> +# 88| getSelfTy(): [PathTypeRepr] MyDeriveEnum::<...> +# 88| getPath(): [Path] MyDeriveEnum::<...> +# 88| getSegment(): [PathSegment] MyDeriveEnum::<...> +# 88| getGenericArgList(): [GenericArgList] <...> +# 89| getIdentifier(): [NameRef] MyDeriveEnum +# 88| getTrait(): [PathTypeRepr] ...::Eq +# 88| getPath(): [Path] ...::Eq +# 88| getQualifier(): [Path] ...::cmp +# 88| getQualifier(): [Path] $crate +# 88| getSegment(): [PathSegment] $crate +# 88| getIdentifier(): [NameRef] $crate +# 88| getSegment(): [PathSegment] cmp +# 88| getIdentifier(): [NameRef] cmp +# 88| getSegment(): [PathSegment] Eq +# 88| getIdentifier(): [NameRef] Eq +# 88| getWhereClause(): [WhereClause] WhereClause # 88| getAttr(0): [Attr] Attr # 88| getMeta(): [TokenTreeMeta] TokenTreeMeta # 88| getPath(): [Path] derive diff --git a/rust/ql/test/extractor-tests/macro-expansion/test.expected b/rust/ql/test/extractor-tests/macro-expansion/test.expected index 985be0f6b7dd..108fa52ced94 100644 --- a/rust/ql/test/extractor-tests/macro-expansion/test.expected +++ b/rust/ql/test/extractor-tests/macro-expansion/test.expected @@ -15,6 +15,9 @@ attribute_macros | macro_expansion.rs:31:5:34:5 | (item with attribute macro expansion) | 1 | macro_expansion.rs:32:5:34:5 | fn bzz_1 | | macro_expansion.rs:31:5:34:5 | (item with attribute macro expansion) | 2 | macro_expansion.rs:32:5:34:5 | fn bzz_2 | derive_macros +| macro_expansion.rs:83:1:86:1 | struct MyDerive | 0 | 0 | macro_expansion.rs:83:1:86:1 | impl ...::Debug for MyDerive::<...> { ... } | +| macro_expansion.rs:88:1:92:1 | enum MyDeriveEnum | 0 | 0 | macro_expansion.rs:88:1:92:1 | impl ...::PartialEq for MyDeriveEnum::<...> { ... } | +| macro_expansion.rs:88:1:92:1 | enum MyDeriveEnum | 1 | 0 | macro_expansion.rs:88:1:92:1 | impl ...::Eq for MyDeriveEnum::<...> { ... } | | macro_expansion.rs:98:1:102:1 | union MyDeriveUnion | 0 | 0 | macro_expansion.rs:99:7:99:19 | const CONST_MyDeriveUnion | | macro_expansion.rs:98:1:102:1 | union MyDeriveUnion | 0 | 1 | macro_expansion.rs:99:7:99:19 | impl MyTrait for MyDeriveUnion { ... } | macro_calls diff --git a/rust/ql/test/library-tests/type-inference/type-inference.expected b/rust/ql/test/library-tests/type-inference/type-inference.expected index 137b6cab0153..3344fc45f74f 100644 --- a/rust/ql/test/library-tests/type-inference/type-inference.expected +++ b/rust/ql/test/library-tests/type-inference/type-inference.expected @@ -3669,6 +3669,7 @@ inferCertainType | main.rs:2405:18:2405:42 | ...::method(...) | | main.rs:2369:5:2369:20 | S1 | | main.rs:2405:18:2405:42 | ...::method(...) | T | main.rs:2371:5:2372:14 | S2 | | main.rs:2405:29:2405:41 | ...::default(...) | | main.rs:2369:5:2369:20 | S1 | +| main.rs:2409:21:2409:33 | ...::default(...) | | main.rs:2371:5:2372:14 | S2 | | main.rs:2410:13:2410:15 | x10 | | main.rs:2392:5:2394:5 | S5 | | main.rs:2410:13:2410:15 | x10 | T5 | main.rs:2371:5:2372:14 | S2 | | main.rs:2410:19:2413:9 | S5::<...> {...} | | main.rs:2392:5:2394:5 | S5 | @@ -3679,6 +3680,7 @@ inferCertainType | main.rs:2415:19:2415:33 | S5 {...} | | main.rs:2392:5:2394:5 | S5 | | main.rs:2416:13:2416:15 | x13 | | main.rs:2392:5:2394:5 | S5 | | main.rs:2416:19:2419:9 | S5 {...} | | main.rs:2392:5:2394:5 | S5 | +| main.rs:2418:20:2418:32 | ...::default(...) | | main.rs:2371:5:2372:14 | S2 | | main.rs:2420:13:2420:15 | x14 | | {EXTERNAL LOCATION} | i32 | | main.rs:2420:19:2420:48 | foo::<...>(...) | | {EXTERNAL LOCATION} | i32 | | main.rs:2421:13:2421:15 | x15 | | main.rs:2369:5:2369:20 | S1 | @@ -12267,7 +12269,10 @@ inferType | main.rs:2408:18:2408:22 | S4(...) | T4 | {EXTERNAL LOCATION} | i32 | | main.rs:2408:21:2408:21 | 0 | | {EXTERNAL LOCATION} | i32 | | main.rs:2409:13:2409:14 | x9 | | main.rs:2390:5:2390:27 | S4 | +| main.rs:2409:13:2409:14 | x9 | T4 | main.rs:2371:5:2372:14 | S2 | | main.rs:2409:18:2409:34 | S4(...) | | main.rs:2390:5:2390:27 | S4 | +| main.rs:2409:18:2409:34 | S4(...) | T4 | main.rs:2371:5:2372:14 | S2 | +| main.rs:2409:21:2409:33 | ...::default(...) | | main.rs:2371:5:2372:14 | S2 | | main.rs:2410:13:2410:15 | x10 | | main.rs:2392:5:2394:5 | S5 | | main.rs:2410:13:2410:15 | x10 | T5 | main.rs:2371:5:2372:14 | S2 | | main.rs:2410:19:2413:9 | S5::<...> {...} | | main.rs:2392:5:2394:5 | S5 | @@ -12284,7 +12289,10 @@ inferType | main.rs:2415:19:2415:33 | S5 {...} | T5 | {EXTERNAL LOCATION} | i32 | | main.rs:2415:31:2415:31 | 0 | | {EXTERNAL LOCATION} | i32 | | main.rs:2416:13:2416:15 | x13 | | main.rs:2392:5:2394:5 | S5 | +| main.rs:2416:13:2416:15 | x13 | T5 | main.rs:2371:5:2372:14 | S2 | | main.rs:2416:19:2419:9 | S5 {...} | | main.rs:2392:5:2394:5 | S5 | +| main.rs:2416:19:2419:9 | S5 {...} | T5 | main.rs:2371:5:2372:14 | S2 | +| main.rs:2418:20:2418:32 | ...::default(...) | | main.rs:2371:5:2372:14 | S2 | | main.rs:2420:13:2420:15 | x14 | | {EXTERNAL LOCATION} | i32 | | main.rs:2420:19:2420:48 | foo::<...>(...) | | {EXTERNAL LOCATION} | i32 | | main.rs:2420:30:2420:47 | ...::default(...) | | {EXTERNAL LOCATION} | i32 | @@ -15847,18 +15855,3 @@ inferType | regressions.rs:179:24:179:27 | S(...) | T | {EXTERNAL LOCATION} | i32 | | regressions.rs:179:26:179:26 | 1 | | {EXTERNAL LOCATION} | i32 | testFailures -| main.rs:1308:44:1308:62 | //... | Missing result: target=default | -| main.rs:2406:48:2406:84 | //... | Missing result: target=default | -| main.rs:2409:37:2409:73 | //... | Missing result: target=default | -| main.rs:2409:37:2409:73 | //... | Missing result: type=x9@S4:S2 | -| main.rs:2412:40:2412:58 | //... | Missing result: target=default | -| main.rs:2416:22:2416:44 | //... | Missing result: type=x13@S5:S2 | -| main.rs:2418:35:2418:53 | //... | Missing result: target=default | -| main.rs:2574:41:2574:59 | //... | Missing result: target=default | -| main.rs:2698:37:2698:64 | //... | Missing result: target=default | -| overloading.rs:58:67:58:125 | //... | Missing result: target=default | -| overloading.rs:60:68:60:132 | //... | Missing result: target=default | -| overloading.rs:64:68:64:126 | //... | Missing result: target=default | -| overloading.rs:66:69:66:133 | //... | Missing result: target=default | -| overloading.rs:368:37:368:64 | //... | Missing result: target=default | -| overloading.rs:398:57:398:84 | //... | Missing result: target=default | diff --git a/rust/ql/test/query-tests/security/CWE-614/InsecureCookie.expected b/rust/ql/test/query-tests/security/CWE-614/InsecureCookie.expected index 15f6280fa524..7decd880f595 100644 --- a/rust/ql/test/query-tests/security/CWE-614/InsecureCookie.expected +++ b/rust/ql/test/query-tests/security/CWE-614/InsecureCookie.expected @@ -23,111 +23,325 @@ | main.rs:49:41:49:45 | build | main.rs:49:5:49:25 | ...::build(...) | main.rs:49:41:49:45 | build | Cookie attribute 'Secure' is not set to true. | | main.rs:50:56:50:60 | build | main.rs:50:5:50:40 | ...::build(...) | main.rs:50:56:50:60 | build | Cookie attribute 'Secure' is not set to true. | | main.rs:53:65:53:69 | build | main.rs:53:5:53:49 | ... .secure(...) | main.rs:53:65:53:69 | build | Cookie attribute 'Secure' is not set to true. | +| main.rs:59:9:59:11 | add | main.rs:58:17:58:27 | ...::new | main.rs:59:9:59:11 | add | Cookie attribute 'Secure' is not set to true. | +| main.rs:60:9:60:20 | add_original | main.rs:58:17:58:27 | ...::new | main.rs:60:9:60:20 | add_original | Cookie attribute 'Secure' is not set to true. | +| main.rs:64:9:64:11 | add | main.rs:63:5:63:5 | [SSA] a | main.rs:64:9:64:11 | add | Cookie attribute 'Secure' is not set to true. | +| main.rs:64:9:64:11 | add | main.rs:63:5:63:5 | a | main.rs:64:9:64:11 | add | Cookie attribute 'Secure' is not set to true. | +| main.rs:69:16:69:18 | add | main.rs:68:17:68:29 | ...::named | main.rs:69:16:69:18 | add | Cookie attribute 'Secure' is not set to true. | +| main.rs:70:16:70:27 | add_original | main.rs:63:5:63:5 | [SSA] a | main.rs:70:16:70:27 | add_original | Cookie attribute 'Secure' is not set to true. | +| main.rs:70:16:70:27 | add_original | main.rs:63:5:63:5 | a | main.rs:70:16:70:27 | add_original | Cookie attribute 'Secure' is not set to true. | +| main.rs:72:16:72:18 | add | main.rs:71:5:71:5 | [SSA] b | main.rs:72:16:72:18 | add | Cookie attribute 'Secure' is not set to true. | +| main.rs:72:16:72:18 | add | main.rs:71:5:71:5 | b | main.rs:72:16:72:18 | add | Cookie attribute 'Secure' is not set to true. | +| main.rs:78:17:78:19 | add | main.rs:77:17:77:28 | ...::from | main.rs:78:17:78:19 | add | Cookie attribute 'Secure' is not set to true. | +| main.rs:79:17:79:28 | add_original | main.rs:63:5:63:5 | [SSA] a | main.rs:79:17:79:28 | add_original | Cookie attribute 'Secure' is not set to true. | +| main.rs:79:17:79:28 | add_original | main.rs:63:5:63:5 | a | main.rs:79:17:79:28 | add_original | Cookie attribute 'Secure' is not set to true. | +| main.rs:83:17:83:19 | add | main.rs:77:17:77:28 | ...::from | main.rs:83:17:83:19 | add | Cookie attribute 'Secure' is not set to true. | +| main.rs:88:9:88:11 | add | main.rs:87:17:87:28 | ...::from | main.rs:88:9:88:11 | add | Cookie attribute 'Secure' is not set to true. | +| main.rs:94:9:94:11 | add | main.rs:87:17:87:28 | ...::from | main.rs:94:9:94:11 | add | Cookie attribute 'Secure' is not set to true. | +| main.rs:123:13:123:18 | insert | main.rs:122:13:122:41 | ...::new | main.rs:123:13:123:18 | insert | Cookie attribute 'Secure' is not set to true. | +| main.rs:131:13:131:18 | insert | main.rs:130:13:130:13 | b | main.rs:131:13:131:18 | insert | Cookie attribute 'Secure' is not set to true. | +| main.rs:147:13:147:18 | insert | main.rs:146:13:146:13 | f | main.rs:147:13:147:18 | insert | Cookie attribute 'Secure' is not set to true. | | main.rs:152:13:152:18 | insert | main.rs:151:13:151:42 | ...::from | main.rs:152:13:152:18 | insert | Cookie attribute 'Secure' is not set to true. | +| main.rs:156:13:156:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:156:13:156:18 | insert | Cookie attribute 'Secure' is not set to true. | +| main.rs:157:13:157:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:157:13:157:18 | insert | Cookie attribute 'Secure' is not set to true. | +| main.rs:158:13:158:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:158:13:158:18 | insert | Cookie attribute 'Secure' is not set to true. | +| main.rs:159:13:159:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:159:13:159:18 | insert | Cookie attribute 'Secure' is not set to true. | +| main.rs:160:13:160:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:160:13:160:18 | insert | Cookie attribute 'Secure' is not set to true. | +| main.rs:161:13:161:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:161:13:161:18 | insert | Cookie attribute 'Secure' is not set to true. | +| main.rs:162:13:162:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:162:13:162:18 | insert | Cookie attribute 'Secure' is not set to true. | +| main.rs:163:13:163:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:163:13:163:18 | insert | Cookie attribute 'Secure' is not set to true. | +| main.rs:164:13:164:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:164:13:164:18 | insert | Cookie attribute 'Secure' is not set to true. | +| main.rs:165:13:165:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:165:13:165:18 | insert | Cookie attribute 'Secure' is not set to true. | +| main.rs:166:13:166:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:166:13:166:18 | insert | Cookie attribute 'Secure' is not set to true. | +| main.rs:167:13:167:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:167:13:167:18 | insert | Cookie attribute 'Secure' is not set to true. | | main.rs:173:61:173:65 | build | main.rs:173:22:173:34 | ...::build | main.rs:173:61:173:65 | build | Cookie attribute 'Secure' is not set to true. | | main.rs:197:55:197:60 | finish | main.rs:197:5:197:39 | ...::build(...) | main.rs:197:55:197:60 | finish | Cookie attribute 'Secure' is not set to true. | | main.rs:198:65:198:70 | finish | main.rs:198:5:198:39 | ...::build(...) | main.rs:198:65:198:70 | finish | Cookie attribute 'Secure' is not set to true. | +| main.rs:202:9:202:11 | add | main.rs:201:5:201:11 | [SSA] cookie1 | main.rs:202:9:202:11 | add | Cookie attribute 'Secure' is not set to true. | +| main.rs:202:9:202:11 | add | main.rs:201:5:201:11 | cookie1 | main.rs:202:9:202:11 | add | Cookie attribute 'Secure' is not set to true. | | main.rs:212:41:212:46 | finish | main.rs:212:5:212:22 | ...::build | main.rs:212:41:212:46 | finish | Cookie attribute 'Secure' is not set to true. | +| main.rs:215:9:215:11 | add | main.rs:214:19:214:34 | ...::new | main.rs:215:9:215:11 | add | Cookie attribute 'Secure' is not set to true. | +| main.rs:219:9:219:11 | add | main.rs:218:5:218:11 | [SSA] cookie2 | main.rs:219:9:219:11 | add | Cookie attribute 'Secure' is not set to true. | +| main.rs:219:9:219:11 | add | main.rs:218:5:218:11 | cookie2 | main.rs:219:9:219:11 | add | Cookie attribute 'Secure' is not set to true. | +| main.rs:229:9:229:11 | add | main.rs:228:5:228:11 | [SSA] cookie1 | main.rs:229:9:229:11 | add | Cookie attribute 'Secure' is not set to true. | +| main.rs:229:9:229:11 | add | main.rs:228:5:228:11 | cookie1 | main.rs:229:9:229:11 | add | Cookie attribute 'Secure' is not set to true. | | main.rs:242:9:242:41 | ...::new | main.rs:241:29:241:62 | ...::new(...) | main.rs:242:9:242:41 | ...::new | Cookie attribute 'Secure' is not set to true. | | main.rs:245:9:245:41 | ...::new | main.rs:244:30:244:63 | ...::new(...) | main.rs:245:9:245:41 | ...::new | Cookie attribute 'Secure' is not set to true. | | main.rs:259:59:259:64 | finish | main.rs:259:5:259:43 | ...::build(...) | main.rs:259:59:259:64 | finish | Cookie attribute 'Secure' is not set to true. | | main.rs:260:69:260:74 | finish | main.rs:260:5:260:43 | ...::build(...) | main.rs:260:69:260:74 | finish | Cookie attribute 'Secure' is not set to true. | +| main.rs:264:9:264:11 | add | main.rs:263:5:263:11 | [SSA] cookie1 | main.rs:264:9:264:11 | add | Cookie attribute 'Secure' is not set to true. | +| main.rs:264:9:264:11 | add | main.rs:263:5:263:11 | cookie1 | main.rs:264:9:264:11 | add | Cookie attribute 'Secure' is not set to true. | | main.rs:274:45:274:50 | finish | main.rs:274:5:274:26 | ...::build | main.rs:274:45:274:50 | finish | Cookie attribute 'Secure' is not set to true. | +| main.rs:277:9:277:11 | add | main.rs:276:19:276:38 | ...::new | main.rs:277:9:277:11 | add | Cookie attribute 'Secure' is not set to true. | +| main.rs:281:9:281:11 | add | main.rs:280:5:280:11 | [SSA] cookie2 | main.rs:281:9:281:11 | add | Cookie attribute 'Secure' is not set to true. | +| main.rs:281:9:281:11 | add | main.rs:280:5:280:11 | cookie2 | main.rs:281:9:281:11 | add | Cookie attribute 'Secure' is not set to true. | edges -| main.rs:8:19:8:50 | ...::build(...) | main.rs:8:19:8:64 | ... .secure(...) | provenance | MaD:9 | +| main.rs:8:19:8:50 | ...::build(...) | main.rs:8:19:8:64 | ... .secure(...) | provenance | MaD:35 | | main.rs:8:19:8:64 | ... .secure(...) | main.rs:8:66:8:70 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:16:19:16:31 | ...::build | main.rs:16:19:16:50 | ...::build(...) | provenance | Src:MaD:6 MaD:6 | +| main.rs:16:19:16:31 | ...::build | main.rs:16:19:16:50 | ...::build(...) | provenance | Src:MaD:15 MaD:15 | | main.rs:16:19:16:50 | ...::build(...) | main.rs:16:52:16:56 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:20:5:20:36 | ...::build(...) | main.rs:20:5:20:54 | ... .secure(...) | provenance | MaD:9 | +| main.rs:20:5:20:36 | ...::build(...) | main.rs:20:5:20:54 | ... .secure(...) | provenance | MaD:35 | | main.rs:20:5:20:54 | ... .secure(...) | main.rs:20:56:20:60 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:21:5:21:36 | ...::build(...) | main.rs:21:5:21:55 | ... .secure(...) | provenance | MaD:9 | +| main.rs:21:5:21:36 | ...::build(...) | main.rs:21:5:21:55 | ... .secure(...) | provenance | MaD:35 | | main.rs:21:5:21:55 | ... .secure(...) | main.rs:21:57:21:61 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:25:5:25:36 | ...::build(...) | main.rs:25:5:25:52 | ... .secure(...) | provenance | MaD:9 | +| main.rs:25:5:25:36 | ...::build(...) | main.rs:25:5:25:52 | ... .secure(...) | provenance | MaD:35 | | main.rs:25:5:25:52 | ... .secure(...) | main.rs:25:54:25:58 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:26:5:26:36 | ...::build(...) | main.rs:26:5:26:50 | ... .secure(...) | provenance | MaD:9 | +| main.rs:26:5:26:36 | ...::build(...) | main.rs:26:5:26:50 | ... .secure(...) | provenance | MaD:35 | | main.rs:26:5:26:50 | ... .secure(...) | main.rs:26:52:26:56 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:27:5:27:36 | ...::build(...) | main.rs:27:5:27:51 | ... .secure(...) | provenance | MaD:9 | +| main.rs:27:5:27:36 | ...::build(...) | main.rs:27:5:27:51 | ... .secure(...) | provenance | MaD:35 | | main.rs:27:5:27:51 | ... .secure(...) | main.rs:27:53:27:57 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:28:5:28:36 | ...::build(...) | main.rs:28:5:28:60 | ... .secure(...) | provenance | MaD:9 | +| main.rs:28:5:28:36 | ...::build(...) | main.rs:28:5:28:60 | ... .secure(...) | provenance | MaD:35 | | main.rs:28:5:28:60 | ... .secure(...) | main.rs:28:62:28:66 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:29:5:29:36 | ...::build(...) | main.rs:29:5:29:60 | ... .secure(...) | provenance | MaD:9 | +| main.rs:29:5:29:36 | ...::build(...) | main.rs:29:5:29:60 | ... .secure(...) | provenance | MaD:35 | | main.rs:29:5:29:60 | ... .secure(...) | main.rs:29:62:29:66 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:33:9:33:40 | ...::build(...) | main.rs:33:9:33:58 | ... .secure(...) | provenance | MaD:9 | +| main.rs:33:9:33:40 | ...::build(...) | main.rs:33:9:33:58 | ... .secure(...) | provenance | MaD:35 | | main.rs:33:9:33:58 | ... .secure(...) | main.rs:33:60:33:64 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:35:9:35:40 | ...::build(...) | main.rs:35:9:35:58 | ... .secure(...) | provenance | MaD:9 | +| main.rs:35:9:35:40 | ...::build(...) | main.rs:35:9:35:58 | ... .secure(...) | provenance | MaD:35 | | main.rs:35:9:35:58 | ... .secure(...) | main.rs:35:60:35:64 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:39:5:39:39 | ...::new(...) | main.rs:39:5:39:53 | ... .secure(...) | provenance | MaD:9 | +| main.rs:39:5:39:39 | ...::new(...) | main.rs:39:5:39:53 | ... .secure(...) | provenance | MaD:35 | | main.rs:39:5:39:53 | ... .secure(...) | main.rs:39:55:39:59 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:40:5:40:50 | ... .expires(...) | main.rs:40:5:40:64 | ... .secure(...) | provenance | MaD:9 | +| main.rs:40:5:40:50 | ... .expires(...) | main.rs:40:5:40:64 | ... .secure(...) | provenance | MaD:35 | | main.rs:40:5:40:64 | ... .secure(...) | main.rs:40:66:40:70 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:41:5:41:79 | ... .max_age(...) | main.rs:41:5:41:93 | ... .secure(...) | provenance | MaD:9 | +| main.rs:41:5:41:79 | ... .max_age(...) | main.rs:41:5:41:93 | ... .secure(...) | provenance | MaD:35 | | main.rs:41:5:41:93 | ... .secure(...) | main.rs:41:95:41:99 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:42:5:42:58 | ... .domain(...) | main.rs:42:5:42:72 | ... .secure(...) | provenance | MaD:9 | +| main.rs:42:5:42:58 | ... .domain(...) | main.rs:42:5:42:72 | ... .secure(...) | provenance | MaD:35 | | main.rs:42:5:42:72 | ... .secure(...) | main.rs:42:74:42:78 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:43:5:43:46 | ... .path(...) | main.rs:43:5:43:60 | ... .secure(...) | provenance | MaD:9 | +| main.rs:43:5:43:46 | ... .path(...) | main.rs:43:5:43:60 | ... .secure(...) | provenance | MaD:35 | | main.rs:43:5:43:60 | ... .secure(...) | main.rs:43:62:43:66 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:44:5:44:52 | ... .http_only(...) | main.rs:44:5:44:66 | ... .secure(...) | provenance | MaD:9 | +| main.rs:44:5:44:52 | ... .http_only(...) | main.rs:44:5:44:66 | ... .secure(...) | provenance | MaD:35 | | main.rs:44:5:44:66 | ... .secure(...) | main.rs:44:68:44:72 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:45:5:45:72 | ... .same_site(...) | main.rs:45:5:45:86 | ... .secure(...) | provenance | MaD:9 | +| main.rs:45:5:45:72 | ... .same_site(...) | main.rs:45:5:45:86 | ... .secure(...) | provenance | MaD:35 | | main.rs:45:5:45:86 | ... .secure(...) | main.rs:45:88:45:92 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:46:5:46:48 | ... .permanent() | main.rs:46:5:46:62 | ... .secure(...) | provenance | MaD:9 | +| main.rs:46:5:46:48 | ... .permanent() | main.rs:46:5:46:62 | ... .secure(...) | provenance | MaD:35 | | main.rs:46:5:46:62 | ... .secure(...) | main.rs:46:64:46:68 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:47:5:47:46 | ... .removal() | main.rs:47:5:47:60 | ... .secure(...) | provenance | MaD:9 | +| main.rs:47:5:47:46 | ... .removal() | main.rs:47:5:47:60 | ... .secure(...) | provenance | MaD:35 | | main.rs:47:5:47:60 | ... .secure(...) | main.rs:47:62:47:66 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:48:5:48:36 | ...::build(...) | main.rs:48:5:48:50 | ... .secure(...) | provenance | MaD:9 | +| main.rs:48:5:48:36 | ...::build(...) | main.rs:48:5:48:50 | ... .secure(...) | provenance | MaD:35 | | main.rs:48:5:48:50 | ... .secure(...) | main.rs:48:52:48:57 | finish | provenance | MaD:3 Sink:MaD:3 | -| main.rs:49:5:49:25 | ...::build(...) | main.rs:49:5:49:39 | ... .secure(...) | provenance | MaD:9 | +| main.rs:49:5:49:25 | ...::build(...) | main.rs:49:5:49:39 | ... .secure(...) | provenance | MaD:35 | | main.rs:49:5:49:39 | ... .secure(...) | main.rs:49:41:49:45 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:50:5:50:40 | ...::build(...) | main.rs:50:5:50:54 | ... .secure(...) | provenance | MaD:9 | +| main.rs:50:5:50:40 | ...::build(...) | main.rs:50:5:50:54 | ... .secure(...) | provenance | MaD:35 | | main.rs:50:5:50:54 | ... .secure(...) | main.rs:50:56:50:60 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:53:5:53:49 | ... .secure(...) | main.rs:53:5:53:63 | ... .secure(...) | provenance | MaD:9 | +| main.rs:53:5:53:49 | ... .secure(...) | main.rs:53:5:53:63 | ... .secure(...) | provenance | MaD:35 | | main.rs:53:5:53:63 | ... .secure(...) | main.rs:53:65:53:69 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:114:5:114:17 | ...::build | main.rs:114:5:114:36 | ...::build(...) | provenance | Src:MaD:6 MaD:6 | -| main.rs:114:5:114:36 | ...::build(...) | main.rs:114:5:114:54 | ... .partitioned(...) | provenance | MaD:7 | +| main.rs:58:9:58:13 | mut a | main.rs:59:13:59:13 | a | provenance | | +| main.rs:58:9:58:13 | mut a | main.rs:60:22:60:22 | a | provenance | | +| main.rs:58:17:58:27 | ...::new | main.rs:58:17:58:44 | ...::new(...) | provenance | Src:MaD:17 MaD:17 | +| main.rs:58:17:58:44 | ...::new(...) | main.rs:58:9:58:13 | mut a | provenance | | +| main.rs:59:13:59:13 | a | main.rs:59:13:59:21 | a.clone() | provenance | MaD:18 | +| main.rs:59:13:59:21 | a.clone() | main.rs:59:9:59:11 | add | provenance | MaD:4 Sink:MaD:4 | +| main.rs:60:22:60:22 | a | main.rs:60:22:60:30 | a.clone() | provenance | MaD:18 | +| main.rs:60:22:60:30 | a.clone() | main.rs:60:9:60:20 | add_original | provenance | MaD:5 Sink:MaD:5 | +| main.rs:63:5:63:5 | [SSA] a | main.rs:64:13:64:13 | a | provenance | | +| main.rs:63:5:63:5 | [SSA] a | main.rs:70:29:70:29 | a | provenance | | +| main.rs:63:5:63:5 | [SSA] a | main.rs:79:30:79:30 | a | provenance | | +| main.rs:63:5:63:5 | a | main.rs:64:13:64:13 | a | provenance | | +| main.rs:63:5:63:5 | a | main.rs:70:29:70:29 | a | provenance | | +| main.rs:63:5:63:5 | a | main.rs:79:30:79:30 | a | provenance | | +| main.rs:64:13:64:13 | a | main.rs:64:13:64:21 | a.clone() | provenance | MaD:18 | +| main.rs:64:13:64:21 | a.clone() | main.rs:64:9:64:11 | add | provenance | MaD:4 Sink:MaD:4 | +| main.rs:68:9:68:13 | mut b | main.rs:69:20:69:20 | b | provenance | | +| main.rs:68:17:68:29 | ...::named | main.rs:68:17:68:37 | ...::named(...) | provenance | Src:MaD:16 MaD:16 | +| main.rs:68:17:68:37 | ...::named(...) | main.rs:68:9:68:13 | mut b | provenance | | +| main.rs:69:20:69:20 | b | main.rs:69:20:69:28 | b.clone() | provenance | MaD:18 | +| main.rs:69:20:69:28 | b.clone() | main.rs:69:16:69:18 | add | provenance | MaD:8 Sink:MaD:8 | +| main.rs:70:29:70:29 | a | main.rs:70:29:70:37 | a.clone() | provenance | MaD:18 | +| main.rs:70:29:70:37 | a.clone() | main.rs:70:16:70:27 | add_original | provenance | MaD:9 Sink:MaD:9 | +| main.rs:71:5:71:5 | [SSA] b | main.rs:72:20:72:20 | b | provenance | | +| main.rs:71:5:71:5 | b | main.rs:72:20:72:20 | b | provenance | | +| main.rs:72:20:72:20 | b | main.rs:72:20:72:28 | b.clone() | provenance | MaD:18 | +| main.rs:72:20:72:28 | b.clone() | main.rs:72:16:72:18 | add | provenance | MaD:8 Sink:MaD:8 | +| main.rs:77:9:77:13 | mut c | main.rs:78:21:78:21 | c | provenance | | +| main.rs:77:9:77:13 | mut c | main.rs:83:21:83:21 | c | provenance | | +| main.rs:77:17:77:28 | ...::from | main.rs:77:17:77:36 | ...::from(...) | provenance | Src:MaD:14 MaD:14 | +| main.rs:77:17:77:36 | ...::from(...) | main.rs:77:9:77:13 | mut c | provenance | | +| main.rs:78:21:78:21 | c | main.rs:78:21:78:29 | c.clone() | provenance | MaD:18 | +| main.rs:78:21:78:29 | c.clone() | main.rs:78:17:78:19 | add | provenance | MaD:6 Sink:MaD:6 | +| main.rs:79:30:79:30 | a | main.rs:79:30:79:38 | a.clone() | provenance | MaD:18 | +| main.rs:79:30:79:38 | a.clone() | main.rs:79:17:79:28 | add_original | provenance | MaD:7 Sink:MaD:7 | +| main.rs:83:21:83:21 | c | main.rs:83:21:83:29 | c.clone() | provenance | MaD:18 | +| main.rs:83:21:83:29 | c.clone() | main.rs:83:17:83:19 | add | provenance | MaD:6 Sink:MaD:6 | +| main.rs:87:9:87:13 | mut d | main.rs:88:13:88:13 | d | provenance | | +| main.rs:87:9:87:13 | mut d | main.rs:94:13:94:13 | d | provenance | | +| main.rs:87:17:87:28 | ...::from | main.rs:87:17:87:36 | ...::from(...) | provenance | Src:MaD:14 MaD:14 | +| main.rs:87:17:87:36 | ...::from(...) | main.rs:87:9:87:13 | mut d | provenance | | +| main.rs:88:13:88:13 | d | main.rs:88:13:88:21 | d.clone() | provenance | MaD:18 | +| main.rs:88:13:88:21 | d.clone() | main.rs:88:9:88:11 | add | provenance | MaD:4 Sink:MaD:4 | +| main.rs:94:13:94:13 | d | main.rs:94:13:94:21 | d.clone() | provenance | MaD:18 | +| main.rs:94:13:94:21 | d.clone() | main.rs:94:9:94:11 | add | provenance | MaD:4 Sink:MaD:4 | +| main.rs:114:5:114:17 | ...::build | main.rs:114:5:114:36 | ...::build(...) | provenance | Src:MaD:15 MaD:15 | +| main.rs:114:5:114:36 | ...::build(...) | main.rs:114:5:114:54 | ... .partitioned(...) | provenance | MaD:33 | | main.rs:114:5:114:54 | ... .partitioned(...) | main.rs:114:56:114:60 | build | provenance | MaD:2 Sink:MaD:2 | +| main.rs:122:9:122:9 | a | main.rs:123:20:123:20 | a | provenance | | +| main.rs:122:13:122:41 | ...::new | main.rs:122:13:122:58 | ...::new(...) | provenance | Src:MaD:13 MaD:13 | +| main.rs:122:13:122:58 | ...::new(...) | main.rs:122:9:122:9 | a | provenance | | +| main.rs:123:20:123:20 | a | main.rs:123:20:123:28 | a.clone() | provenance | MaD:18 | +| main.rs:123:20:123:28 | a.clone() | main.rs:123:13:123:18 | insert | provenance | MaD:1 Sink:MaD:1 | +| main.rs:130:9:130:9 | c | main.rs:131:20:131:20 | c | provenance | | +| main.rs:130:9:130:9 | c | main.rs:134:13:134:13 | c | provenance | | +| main.rs:130:13:130:13 | b | main.rs:130:13:130:31 | b.set_secure(...) | provenance | MaD:28 | +| main.rs:130:13:130:31 | b.set_secure(...) | main.rs:130:9:130:9 | c | provenance | | +| main.rs:131:20:131:20 | c | main.rs:131:20:131:28 | c.clone() | provenance | MaD:18 | +| main.rs:131:20:131:28 | c.clone() | main.rs:131:13:131:18 | insert | provenance | MaD:1 Sink:MaD:1 | +| main.rs:134:9:134:9 | d | main.rs:135:20:135:20 | d | provenance | | +| main.rs:134:13:134:13 | c | main.rs:134:13:134:35 | c.set_partitioned(...) | provenance | MaD:25 | +| main.rs:134:13:134:35 | c.set_partitioned(...) | main.rs:134:9:134:9 | d | provenance | | +| main.rs:135:20:135:20 | d | main.rs:135:20:135:28 | d.clone() | provenance | MaD:18 | +| main.rs:135:20:135:28 | d.clone() | main.rs:135:13:135:18 | insert | provenance | MaD:1 Sink:MaD:1 | +| main.rs:146:9:146:9 | g | main.rs:147:20:147:20 | g | provenance | | +| main.rs:146:13:146:13 | f | main.rs:146:13:146:31 | f.set_secure(...) | provenance | MaD:28 | +| main.rs:146:13:146:31 | f.set_secure(...) | main.rs:146:9:146:9 | g | provenance | | +| main.rs:147:20:147:20 | g | main.rs:147:20:147:28 | g.clone() | provenance | MaD:18 | +| main.rs:147:20:147:28 | g.clone() | main.rs:147:13:147:18 | insert | provenance | MaD:1 Sink:MaD:1 | | main.rs:151:9:151:9 | h | main.rs:152:20:152:20 | h | provenance | | -| main.rs:151:13:151:42 | ...::from | main.rs:151:13:151:61 | ...::from(...) | provenance | Src:MaD:5 MaD:5 | +| main.rs:151:13:151:42 | ...::from | main.rs:151:13:151:61 | ...::from(...) | provenance | Src:MaD:12 MaD:12 | | main.rs:151:13:151:61 | ...::from(...) | main.rs:151:9:151:9 | h | provenance | | | main.rs:152:20:152:20 | h | main.rs:152:13:152:18 | insert | provenance | MaD:1 Sink:MaD:1 | -| main.rs:173:22:173:34 | ...::build | main.rs:173:22:173:59 | ...::build(...) | provenance | Src:MaD:6 MaD:6 | +| main.rs:155:9:155:9 | i | main.rs:156:20:156:20 | i | provenance | | +| main.rs:155:9:155:9 | i | main.rs:157:20:157:20 | i | provenance | | +| main.rs:155:9:155:9 | i | main.rs:158:20:158:20 | i | provenance | | +| main.rs:155:9:155:9 | i | main.rs:159:20:159:20 | i | provenance | | +| main.rs:155:9:155:9 | i | main.rs:160:20:160:20 | i | provenance | | +| main.rs:155:9:155:9 | i | main.rs:161:20:161:20 | i | provenance | | +| main.rs:155:9:155:9 | i | main.rs:162:20:162:20 | i | provenance | | +| main.rs:155:9:155:9 | i | main.rs:163:20:163:20 | i | provenance | | +| main.rs:155:9:155:9 | i | main.rs:164:20:164:20 | i | provenance | | +| main.rs:155:9:155:9 | i | main.rs:165:20:165:20 | i | provenance | | +| main.rs:155:9:155:9 | i | main.rs:166:20:166:20 | i | provenance | | +| main.rs:155:9:155:9 | i | main.rs:167:20:167:20 | i | provenance | | +| main.rs:155:13:155:41 | ...::new | main.rs:155:13:155:58 | ...::new(...) | provenance | Src:MaD:13 MaD:13 | +| main.rs:155:13:155:58 | ...::new(...) | main.rs:155:9:155:9 | i | provenance | | +| main.rs:156:20:156:20 | i | main.rs:156:20:156:28 | i.clone() | provenance | MaD:18 | +| main.rs:156:20:156:28 | i.clone() | main.rs:156:20:156:46 | ... .set_name(...) | provenance | MaD:24 | +| main.rs:156:20:156:46 | ... .set_name(...) | main.rs:156:13:156:18 | insert | provenance | MaD:1 Sink:MaD:1 | +| main.rs:157:20:157:20 | i | main.rs:157:20:157:28 | i.clone() | provenance | MaD:18 | +| main.rs:157:20:157:28 | i.clone() | main.rs:157:20:157:48 | ... .set_value(...) | provenance | MaD:29 | +| main.rs:157:20:157:48 | ... .set_value(...) | main.rs:157:13:157:18 | insert | provenance | MaD:1 Sink:MaD:1 | +| main.rs:158:20:158:20 | i | main.rs:158:20:158:28 | i.clone() | provenance | MaD:18 | +| main.rs:158:20:158:28 | i.clone() | main.rs:158:20:158:48 | ... .set_http_only(...) | provenance | MaD:22 | +| main.rs:158:20:158:48 | ... .set_http_only(...) | main.rs:158:13:158:18 | insert | provenance | MaD:1 Sink:MaD:1 | +| main.rs:159:20:159:20 | i | main.rs:159:20:159:28 | i.clone() | provenance | MaD:18 | +| main.rs:159:20:159:28 | i.clone() | main.rs:159:20:159:70 | ... .set_same_site(...) | provenance | MaD:27 | +| main.rs:159:20:159:70 | ... .set_same_site(...) | main.rs:159:13:159:18 | insert | provenance | MaD:1 Sink:MaD:1 | +| main.rs:160:20:160:20 | i | main.rs:160:20:160:28 | i.clone() | provenance | MaD:18 | +| main.rs:160:20:160:28 | i.clone() | main.rs:160:20:160:46 | ... .set_max_age(...) | provenance | MaD:23 | +| main.rs:160:20:160:46 | ... .set_max_age(...) | main.rs:160:13:160:18 | insert | provenance | MaD:1 Sink:MaD:1 | +| main.rs:161:20:161:20 | i | main.rs:161:20:161:28 | i.clone() | provenance | MaD:18 | +| main.rs:161:20:161:28 | i.clone() | main.rs:161:20:161:42 | ... .set_path(...) | provenance | MaD:26 | +| main.rs:161:20:161:42 | ... .set_path(...) | main.rs:161:13:161:18 | insert | provenance | MaD:1 Sink:MaD:1 | +| main.rs:162:20:162:20 | i | main.rs:162:20:162:28 | i.clone() | provenance | MaD:18 | +| main.rs:162:20:162:28 | i.clone() | main.rs:162:20:162:41 | ... .unset_path() | provenance | MaD:32 | +| main.rs:162:20:162:41 | ... .unset_path() | main.rs:162:13:162:18 | insert | provenance | MaD:1 Sink:MaD:1 | +| main.rs:163:20:163:20 | i | main.rs:163:20:163:28 | i.clone() | provenance | MaD:18 | +| main.rs:163:20:163:28 | i.clone() | main.rs:163:20:163:54 | ... .set_domain(...) | provenance | MaD:20 | +| main.rs:163:20:163:54 | ... .set_domain(...) | main.rs:163:13:163:18 | insert | provenance | MaD:1 Sink:MaD:1 | +| main.rs:164:20:164:20 | i | main.rs:164:20:164:28 | i.clone() | provenance | MaD:18 | +| main.rs:164:20:164:28 | i.clone() | main.rs:164:20:164:43 | ... .unset_domain() | provenance | MaD:30 | +| main.rs:164:20:164:43 | ... .unset_domain() | main.rs:164:13:164:18 | insert | provenance | MaD:1 Sink:MaD:1 | +| main.rs:165:20:165:20 | i | main.rs:165:20:165:28 | i.clone() | provenance | MaD:18 | +| main.rs:165:20:165:28 | i.clone() | main.rs:165:20:165:46 | ... .set_expires(...) | provenance | MaD:21 | +| main.rs:165:20:165:46 | ... .set_expires(...) | main.rs:165:13:165:18 | insert | provenance | MaD:1 Sink:MaD:1 | +| main.rs:166:20:166:20 | i | main.rs:166:20:166:28 | i.clone() | provenance | MaD:18 | +| main.rs:166:20:166:28 | i.clone() | main.rs:166:20:166:44 | ... .unset_expires() | provenance | MaD:31 | +| main.rs:166:20:166:44 | ... .unset_expires() | main.rs:166:13:166:18 | insert | provenance | MaD:1 Sink:MaD:1 | +| main.rs:167:20:167:20 | i | main.rs:167:20:167:28 | i.clone() | provenance | MaD:18 | +| main.rs:167:20:167:28 | i.clone() | main.rs:167:20:167:45 | ... .make_permanent() | provenance | MaD:19 | +| main.rs:167:20:167:45 | ... .make_permanent() | main.rs:167:13:167:18 | insert | provenance | MaD:1 Sink:MaD:1 | +| main.rs:173:22:173:34 | ...::build | main.rs:173:22:173:59 | ...::build(...) | provenance | Src:MaD:15 MaD:15 | | main.rs:173:22:173:59 | ...::build(...) | main.rs:173:61:173:65 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:197:5:197:39 | ...::build(...) | main.rs:197:5:197:53 | ... .secure(...) | provenance | MaD:9 | +| main.rs:197:5:197:39 | ...::build(...) | main.rs:197:5:197:53 | ... .secure(...) | provenance | MaD:35 | | main.rs:197:5:197:53 | ... .secure(...) | main.rs:197:55:197:60 | finish | provenance | MaD:3 Sink:MaD:3 | -| main.rs:198:5:198:39 | ...::build(...) | main.rs:198:5:198:53 | ... .secure(...) | provenance | MaD:9 | -| main.rs:198:5:198:53 | ... .secure(...) | main.rs:198:5:198:63 | ... .path(...) | provenance | MaD:8 | +| main.rs:198:5:198:39 | ...::build(...) | main.rs:198:5:198:53 | ... .secure(...) | provenance | MaD:35 | +| main.rs:198:5:198:53 | ... .secure(...) | main.rs:198:5:198:63 | ... .path(...) | provenance | MaD:34 | | main.rs:198:5:198:63 | ... .path(...) | main.rs:198:65:198:70 | finish | provenance | MaD:3 Sink:MaD:3 | -| main.rs:212:5:212:22 | ...::build | main.rs:212:5:212:39 | ...::build(...) | provenance | Src:MaD:6 MaD:6 | +| main.rs:201:5:201:11 | [SSA] cookie1 | main.rs:202:13:202:19 | cookie1 | provenance | | +| main.rs:201:5:201:11 | cookie1 | main.rs:202:13:202:19 | cookie1 | provenance | | +| main.rs:202:13:202:19 | cookie1 | main.rs:202:13:202:27 | cookie1.clone() | provenance | MaD:18 | +| main.rs:202:13:202:27 | cookie1.clone() | main.rs:202:9:202:11 | add | provenance | MaD:4 Sink:MaD:4 | +| main.rs:212:5:212:22 | ...::build | main.rs:212:5:212:39 | ...::build(...) | provenance | Src:MaD:15 MaD:15 | | main.rs:212:5:212:39 | ...::build(...) | main.rs:212:41:212:46 | finish | provenance | MaD:3 Sink:MaD:3 | +| main.rs:214:9:214:15 | cookie3 | main.rs:215:13:215:19 | cookie3 | provenance | | +| main.rs:214:19:214:34 | ...::new | main.rs:214:19:214:51 | ...::new(...) | provenance | Src:MaD:17 MaD:17 | +| main.rs:214:19:214:51 | ...::new(...) | main.rs:214:9:214:15 | cookie3 | provenance | | +| main.rs:215:13:215:19 | cookie3 | main.rs:215:13:215:27 | cookie3.clone() | provenance | MaD:18 | +| main.rs:215:13:215:27 | cookie3.clone() | main.rs:215:9:215:11 | add | provenance | MaD:4 Sink:MaD:4 | +| main.rs:218:5:218:11 | [SSA] cookie2 | main.rs:219:13:219:19 | cookie2 | provenance | | +| main.rs:218:5:218:11 | cookie2 | main.rs:219:13:219:19 | cookie2 | provenance | | +| main.rs:219:13:219:19 | cookie2 | main.rs:219:13:219:27 | cookie2.clone() | provenance | MaD:18 | +| main.rs:219:13:219:27 | cookie2.clone() | main.rs:219:9:219:11 | add | provenance | MaD:4 Sink:MaD:4 | +| main.rs:228:5:228:11 | [SSA] cookie1 | main.rs:229:13:229:19 | cookie1 | provenance | | +| main.rs:228:5:228:11 | cookie1 | main.rs:229:13:229:19 | cookie1 | provenance | | +| main.rs:229:13:229:19 | cookie1 | main.rs:229:13:229:27 | cookie1.clone() | provenance | MaD:18 | +| main.rs:229:13:229:27 | cookie1.clone() | main.rs:229:9:229:11 | add | provenance | MaD:11 Sink:MaD:11 | | main.rs:241:9:241:25 | cookie_config_bad | main.rs:242:43:242:59 | cookie_config_bad | provenance | | -| main.rs:241:29:241:62 | ...::new(...) | main.rs:241:29:241:76 | ... .secure(...) | provenance | MaD:12 | +| main.rs:241:29:241:62 | ...::new(...) | main.rs:241:29:241:76 | ... .secure(...) | provenance | MaD:38 | | main.rs:241:29:241:76 | ... .secure(...) | main.rs:241:9:241:25 | cookie_config_bad | provenance | | -| main.rs:242:43:242:59 | cookie_config_bad | main.rs:242:9:242:41 | ...::new | provenance | MaD:4 Sink:MaD:4 | +| main.rs:242:43:242:59 | cookie_config_bad | main.rs:242:9:242:41 | ...::new | provenance | MaD:10 Sink:MaD:10 | | main.rs:244:9:244:26 | cookie_config_bad2 | main.rs:245:43:245:60 | cookie_config_bad2 | provenance | | -| main.rs:244:30:244:63 | ...::new(...) | main.rs:244:30:244:77 | ... .secure(...) | provenance | MaD:12 | -| main.rs:244:30:244:77 | ... .secure(...) | main.rs:244:30:244:90 | ... .name(...) | provenance | MaD:10 | -| main.rs:244:30:244:90 | ... .name(...) | main.rs:244:30:244:100 | ... .path(...) | provenance | MaD:11 | +| main.rs:244:30:244:63 | ...::new(...) | main.rs:244:30:244:77 | ... .secure(...) | provenance | MaD:38 | +| main.rs:244:30:244:77 | ... .secure(...) | main.rs:244:30:244:90 | ... .name(...) | provenance | MaD:36 | +| main.rs:244:30:244:90 | ... .name(...) | main.rs:244:30:244:100 | ... .path(...) | provenance | MaD:37 | | main.rs:244:30:244:100 | ... .path(...) | main.rs:244:9:244:26 | cookie_config_bad2 | provenance | | -| main.rs:245:43:245:60 | cookie_config_bad2 | main.rs:245:9:245:41 | ...::new | provenance | MaD:4 Sink:MaD:4 | -| main.rs:259:5:259:43 | ...::build(...) | main.rs:259:5:259:57 | ... .secure(...) | provenance | MaD:9 | +| main.rs:245:43:245:60 | cookie_config_bad2 | main.rs:245:9:245:41 | ...::new | provenance | MaD:10 Sink:MaD:10 | +| main.rs:259:5:259:43 | ...::build(...) | main.rs:259:5:259:57 | ... .secure(...) | provenance | MaD:35 | | main.rs:259:5:259:57 | ... .secure(...) | main.rs:259:59:259:64 | finish | provenance | MaD:3 Sink:MaD:3 | -| main.rs:260:5:260:43 | ...::build(...) | main.rs:260:5:260:57 | ... .secure(...) | provenance | MaD:9 | -| main.rs:260:5:260:57 | ... .secure(...) | main.rs:260:5:260:67 | ... .path(...) | provenance | MaD:8 | +| main.rs:260:5:260:43 | ...::build(...) | main.rs:260:5:260:57 | ... .secure(...) | provenance | MaD:35 | +| main.rs:260:5:260:57 | ... .secure(...) | main.rs:260:5:260:67 | ... .path(...) | provenance | MaD:34 | | main.rs:260:5:260:67 | ... .path(...) | main.rs:260:69:260:74 | finish | provenance | MaD:3 Sink:MaD:3 | -| main.rs:274:5:274:26 | ...::build | main.rs:274:5:274:43 | ...::build(...) | provenance | Src:MaD:6 MaD:6 | +| main.rs:263:5:263:11 | [SSA] cookie1 | main.rs:264:13:264:19 | cookie1 | provenance | | +| main.rs:263:5:263:11 | cookie1 | main.rs:264:13:264:19 | cookie1 | provenance | | +| main.rs:264:13:264:19 | cookie1 | main.rs:264:13:264:27 | cookie1.clone() | provenance | MaD:18 | +| main.rs:264:13:264:27 | cookie1.clone() | main.rs:264:9:264:11 | add | provenance | MaD:4 Sink:MaD:4 | +| main.rs:274:5:274:26 | ...::build | main.rs:274:5:274:43 | ...::build(...) | provenance | Src:MaD:15 MaD:15 | | main.rs:274:5:274:43 | ...::build(...) | main.rs:274:45:274:50 | finish | provenance | MaD:3 Sink:MaD:3 | +| main.rs:276:9:276:15 | cookie3 | main.rs:277:13:277:19 | cookie3 | provenance | | +| main.rs:276:19:276:38 | ...::new | main.rs:276:19:276:55 | ...::new(...) | provenance | Src:MaD:17 MaD:17 | +| main.rs:276:19:276:55 | ...::new(...) | main.rs:276:9:276:15 | cookie3 | provenance | | +| main.rs:277:13:277:19 | cookie3 | main.rs:277:13:277:27 | cookie3.clone() | provenance | MaD:18 | +| main.rs:277:13:277:27 | cookie3.clone() | main.rs:277:9:277:11 | add | provenance | MaD:4 Sink:MaD:4 | +| main.rs:280:5:280:11 | [SSA] cookie2 | main.rs:281:13:281:19 | cookie2 | provenance | | +| main.rs:280:5:280:11 | cookie2 | main.rs:281:13:281:19 | cookie2 | provenance | | +| main.rs:281:13:281:19 | cookie2 | main.rs:281:13:281:27 | cookie2.clone() | provenance | MaD:18 | +| main.rs:281:13:281:27 | cookie2.clone() | main.rs:281:9:281:11 | add | provenance | MaD:4 Sink:MaD:4 | models | 1 | Sink: ::insert; Argument[0]; cookie-use | | 2 | Sink: ::build; Argument[self]; cookie-use | | 3 | Sink: ::finish; Argument[self]; cookie-use | -| 4 | Sink: ::new; Argument[0]; cookie-use | -| 5 | Source: ::from; ReturnValue; cookie-create | -| 6 | Source: ::build; ReturnValue; cookie-create | -| 7 | Summary: ::partitioned; Argument[self].OptionalBarrier[cookie-partitioned-arg0]; ReturnValue; taint | -| 8 | Summary: ::path; Argument[self]; ReturnValue; taint | -| 9 | Summary: ::secure; Argument[self].OptionalBarrier[cookie-secure-arg0]; ReturnValue; taint | -| 10 | Summary: ::name; Argument[self]; ReturnValue; taint | -| 11 | Summary: ::path; Argument[self]; ReturnValue; taint | -| 12 | Summary: ::secure; Argument[self].OptionalBarrier[cookie-secure-arg0]; ReturnValue; taint | +| 4 | Sink: ::add; Argument[0]; cookie-use | +| 5 | Sink: ::add_original; Argument[0]; cookie-use | +| 6 | Sink: ::add; Argument[0]; cookie-use | +| 7 | Sink: ::add_original; Argument[0]; cookie-use | +| 8 | Sink: ::add; Argument[0]; cookie-use | +| 9 | Sink: ::add_original; Argument[0]; cookie-use | +| 10 | Sink: ::new; Argument[0]; cookie-use | +| 11 | Sink: ::add; Argument[0]; cookie-use | +| 12 | Source: ::from; ReturnValue; cookie-create | +| 13 | Source: ::new; ReturnValue; cookie-create | +| 14 | Source: ::from; ReturnValue; cookie-create | +| 15 | Source: ::build; ReturnValue; cookie-create | +| 16 | Source: ::named; ReturnValue; cookie-create | +| 17 | Source: ::new; ReturnValue; cookie-create | +| 18 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | +| 19 | Summary: ::make_permanent; Argument[self]; ReturnValue; taint | +| 20 | Summary: ::set_domain; Argument[self]; ReturnValue; taint | +| 21 | Summary: ::set_expires; Argument[self]; ReturnValue; taint | +| 22 | Summary: ::set_http_only; Argument[self]; ReturnValue; taint | +| 23 | Summary: ::set_max_age; Argument[self]; ReturnValue; taint | +| 24 | Summary: ::set_name; Argument[self]; ReturnValue; taint | +| 25 | Summary: ::set_partitioned; Argument[self].OptionalBarrier[cookie-partitioned-arg0]; ReturnValue; taint | +| 26 | Summary: ::set_path; Argument[self]; ReturnValue; taint | +| 27 | Summary: ::set_same_site; Argument[self]; ReturnValue; taint | +| 28 | Summary: ::set_secure; Argument[self].OptionalBarrier[cookie-secure-arg0]; ReturnValue; taint | +| 29 | Summary: ::set_value; Argument[self]; ReturnValue; taint | +| 30 | Summary: ::unset_domain; Argument[self]; ReturnValue; taint | +| 31 | Summary: ::unset_expires; Argument[self]; ReturnValue; taint | +| 32 | Summary: ::unset_path; Argument[self]; ReturnValue; taint | +| 33 | Summary: ::partitioned; Argument[self].OptionalBarrier[cookie-partitioned-arg0]; ReturnValue; taint | +| 34 | Summary: ::path; Argument[self]; ReturnValue; taint | +| 35 | Summary: ::secure; Argument[self].OptionalBarrier[cookie-secure-arg0]; ReturnValue; taint | +| 36 | Summary: ::name; Argument[self]; ReturnValue; taint | +| 37 | Summary: ::path; Argument[self]; ReturnValue; taint | +| 38 | Summary: ::secure; Argument[self].OptionalBarrier[cookie-secure-arg0]; ReturnValue; taint | nodes | main.rs:8:19:8:50 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:8:19:8:64 | ... .secure(...) | semmle.label | ... .secure(...) | @@ -201,15 +415,139 @@ nodes | main.rs:53:5:53:49 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:53:5:53:63 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:53:65:53:69 | build | semmle.label | build | +| main.rs:58:9:58:13 | mut a | semmle.label | mut a | +| main.rs:58:17:58:27 | ...::new | semmle.label | ...::new | +| main.rs:58:17:58:44 | ...::new(...) | semmle.label | ...::new(...) | +| main.rs:59:9:59:11 | add | semmle.label | add | +| main.rs:59:13:59:13 | a | semmle.label | a | +| main.rs:59:13:59:21 | a.clone() | semmle.label | a.clone() | +| main.rs:60:9:60:20 | add_original | semmle.label | add_original | +| main.rs:60:22:60:22 | a | semmle.label | a | +| main.rs:60:22:60:30 | a.clone() | semmle.label | a.clone() | +| main.rs:63:5:63:5 | [SSA] a | semmle.label | [SSA] a | +| main.rs:63:5:63:5 | a | semmle.label | a | +| main.rs:64:9:64:11 | add | semmle.label | add | +| main.rs:64:13:64:13 | a | semmle.label | a | +| main.rs:64:13:64:21 | a.clone() | semmle.label | a.clone() | +| main.rs:68:9:68:13 | mut b | semmle.label | mut b | +| main.rs:68:17:68:29 | ...::named | semmle.label | ...::named | +| main.rs:68:17:68:37 | ...::named(...) | semmle.label | ...::named(...) | +| main.rs:69:16:69:18 | add | semmle.label | add | +| main.rs:69:20:69:20 | b | semmle.label | b | +| main.rs:69:20:69:28 | b.clone() | semmle.label | b.clone() | +| main.rs:70:16:70:27 | add_original | semmle.label | add_original | +| main.rs:70:29:70:29 | a | semmle.label | a | +| main.rs:70:29:70:37 | a.clone() | semmle.label | a.clone() | +| main.rs:71:5:71:5 | [SSA] b | semmle.label | [SSA] b | +| main.rs:71:5:71:5 | b | semmle.label | b | +| main.rs:72:16:72:18 | add | semmle.label | add | +| main.rs:72:20:72:20 | b | semmle.label | b | +| main.rs:72:20:72:28 | b.clone() | semmle.label | b.clone() | +| main.rs:77:9:77:13 | mut c | semmle.label | mut c | +| main.rs:77:17:77:28 | ...::from | semmle.label | ...::from | +| main.rs:77:17:77:36 | ...::from(...) | semmle.label | ...::from(...) | +| main.rs:78:17:78:19 | add | semmle.label | add | +| main.rs:78:21:78:21 | c | semmle.label | c | +| main.rs:78:21:78:29 | c.clone() | semmle.label | c.clone() | +| main.rs:79:17:79:28 | add_original | semmle.label | add_original | +| main.rs:79:30:79:30 | a | semmle.label | a | +| main.rs:79:30:79:38 | a.clone() | semmle.label | a.clone() | +| main.rs:83:17:83:19 | add | semmle.label | add | +| main.rs:83:21:83:21 | c | semmle.label | c | +| main.rs:83:21:83:29 | c.clone() | semmle.label | c.clone() | +| main.rs:87:9:87:13 | mut d | semmle.label | mut d | +| main.rs:87:17:87:28 | ...::from | semmle.label | ...::from | +| main.rs:87:17:87:36 | ...::from(...) | semmle.label | ...::from(...) | +| main.rs:88:9:88:11 | add | semmle.label | add | +| main.rs:88:13:88:13 | d | semmle.label | d | +| main.rs:88:13:88:21 | d.clone() | semmle.label | d.clone() | +| main.rs:94:9:94:11 | add | semmle.label | add | +| main.rs:94:13:94:13 | d | semmle.label | d | +| main.rs:94:13:94:21 | d.clone() | semmle.label | d.clone() | | main.rs:114:5:114:17 | ...::build | semmle.label | ...::build | | main.rs:114:5:114:36 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:114:5:114:54 | ... .partitioned(...) | semmle.label | ... .partitioned(...) | | main.rs:114:56:114:60 | build | semmle.label | build | +| main.rs:122:9:122:9 | a | semmle.label | a | +| main.rs:122:13:122:41 | ...::new | semmle.label | ...::new | +| main.rs:122:13:122:58 | ...::new(...) | semmle.label | ...::new(...) | +| main.rs:123:13:123:18 | insert | semmle.label | insert | +| main.rs:123:20:123:20 | a | semmle.label | a | +| main.rs:123:20:123:28 | a.clone() | semmle.label | a.clone() | +| main.rs:130:9:130:9 | c | semmle.label | c | +| main.rs:130:13:130:13 | b | semmle.label | b | +| main.rs:130:13:130:31 | b.set_secure(...) | semmle.label | b.set_secure(...) | +| main.rs:131:13:131:18 | insert | semmle.label | insert | +| main.rs:131:20:131:20 | c | semmle.label | c | +| main.rs:131:20:131:28 | c.clone() | semmle.label | c.clone() | +| main.rs:134:9:134:9 | d | semmle.label | d | +| main.rs:134:13:134:13 | c | semmle.label | c | +| main.rs:134:13:134:35 | c.set_partitioned(...) | semmle.label | c.set_partitioned(...) | +| main.rs:135:13:135:18 | insert | semmle.label | insert | +| main.rs:135:20:135:20 | d | semmle.label | d | +| main.rs:135:20:135:28 | d.clone() | semmle.label | d.clone() | +| main.rs:146:9:146:9 | g | semmle.label | g | +| main.rs:146:13:146:13 | f | semmle.label | f | +| main.rs:146:13:146:31 | f.set_secure(...) | semmle.label | f.set_secure(...) | +| main.rs:147:13:147:18 | insert | semmle.label | insert | +| main.rs:147:20:147:20 | g | semmle.label | g | +| main.rs:147:20:147:28 | g.clone() | semmle.label | g.clone() | | main.rs:151:9:151:9 | h | semmle.label | h | | main.rs:151:13:151:42 | ...::from | semmle.label | ...::from | | main.rs:151:13:151:61 | ...::from(...) | semmle.label | ...::from(...) | | main.rs:152:13:152:18 | insert | semmle.label | insert | | main.rs:152:20:152:20 | h | semmle.label | h | +| main.rs:155:9:155:9 | i | semmle.label | i | +| main.rs:155:13:155:41 | ...::new | semmle.label | ...::new | +| main.rs:155:13:155:58 | ...::new(...) | semmle.label | ...::new(...) | +| main.rs:156:13:156:18 | insert | semmle.label | insert | +| main.rs:156:20:156:20 | i | semmle.label | i | +| main.rs:156:20:156:28 | i.clone() | semmle.label | i.clone() | +| main.rs:156:20:156:46 | ... .set_name(...) | semmle.label | ... .set_name(...) | +| main.rs:157:13:157:18 | insert | semmle.label | insert | +| main.rs:157:20:157:20 | i | semmle.label | i | +| main.rs:157:20:157:28 | i.clone() | semmle.label | i.clone() | +| main.rs:157:20:157:48 | ... .set_value(...) | semmle.label | ... .set_value(...) | +| main.rs:158:13:158:18 | insert | semmle.label | insert | +| main.rs:158:20:158:20 | i | semmle.label | i | +| main.rs:158:20:158:28 | i.clone() | semmle.label | i.clone() | +| main.rs:158:20:158:48 | ... .set_http_only(...) | semmle.label | ... .set_http_only(...) | +| main.rs:159:13:159:18 | insert | semmle.label | insert | +| main.rs:159:20:159:20 | i | semmle.label | i | +| main.rs:159:20:159:28 | i.clone() | semmle.label | i.clone() | +| main.rs:159:20:159:70 | ... .set_same_site(...) | semmle.label | ... .set_same_site(...) | +| main.rs:160:13:160:18 | insert | semmle.label | insert | +| main.rs:160:20:160:20 | i | semmle.label | i | +| main.rs:160:20:160:28 | i.clone() | semmle.label | i.clone() | +| main.rs:160:20:160:46 | ... .set_max_age(...) | semmle.label | ... .set_max_age(...) | +| main.rs:161:13:161:18 | insert | semmle.label | insert | +| main.rs:161:20:161:20 | i | semmle.label | i | +| main.rs:161:20:161:28 | i.clone() | semmle.label | i.clone() | +| main.rs:161:20:161:42 | ... .set_path(...) | semmle.label | ... .set_path(...) | +| main.rs:162:13:162:18 | insert | semmle.label | insert | +| main.rs:162:20:162:20 | i | semmle.label | i | +| main.rs:162:20:162:28 | i.clone() | semmle.label | i.clone() | +| main.rs:162:20:162:41 | ... .unset_path() | semmle.label | ... .unset_path() | +| main.rs:163:13:163:18 | insert | semmle.label | insert | +| main.rs:163:20:163:20 | i | semmle.label | i | +| main.rs:163:20:163:28 | i.clone() | semmle.label | i.clone() | +| main.rs:163:20:163:54 | ... .set_domain(...) | semmle.label | ... .set_domain(...) | +| main.rs:164:13:164:18 | insert | semmle.label | insert | +| main.rs:164:20:164:20 | i | semmle.label | i | +| main.rs:164:20:164:28 | i.clone() | semmle.label | i.clone() | +| main.rs:164:20:164:43 | ... .unset_domain() | semmle.label | ... .unset_domain() | +| main.rs:165:13:165:18 | insert | semmle.label | insert | +| main.rs:165:20:165:20 | i | semmle.label | i | +| main.rs:165:20:165:28 | i.clone() | semmle.label | i.clone() | +| main.rs:165:20:165:46 | ... .set_expires(...) | semmle.label | ... .set_expires(...) | +| main.rs:166:13:166:18 | insert | semmle.label | insert | +| main.rs:166:20:166:20 | i | semmle.label | i | +| main.rs:166:20:166:28 | i.clone() | semmle.label | i.clone() | +| main.rs:166:20:166:44 | ... .unset_expires() | semmle.label | ... .unset_expires() | +| main.rs:167:13:167:18 | insert | semmle.label | insert | +| main.rs:167:20:167:20 | i | semmle.label | i | +| main.rs:167:20:167:28 | i.clone() | semmle.label | i.clone() | +| main.rs:167:20:167:45 | ... .make_permanent() | semmle.label | ... .make_permanent() | | main.rs:173:22:173:34 | ...::build | semmle.label | ...::build | | main.rs:173:22:173:59 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:173:61:173:65 | build | semmle.label | build | @@ -220,9 +558,30 @@ nodes | main.rs:198:5:198:53 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:198:5:198:63 | ... .path(...) | semmle.label | ... .path(...) | | main.rs:198:65:198:70 | finish | semmle.label | finish | +| main.rs:201:5:201:11 | [SSA] cookie1 | semmle.label | [SSA] cookie1 | +| main.rs:201:5:201:11 | cookie1 | semmle.label | cookie1 | +| main.rs:202:9:202:11 | add | semmle.label | add | +| main.rs:202:13:202:19 | cookie1 | semmle.label | cookie1 | +| main.rs:202:13:202:27 | cookie1.clone() | semmle.label | cookie1.clone() | | main.rs:212:5:212:22 | ...::build | semmle.label | ...::build | | main.rs:212:5:212:39 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:212:41:212:46 | finish | semmle.label | finish | +| main.rs:214:9:214:15 | cookie3 | semmle.label | cookie3 | +| main.rs:214:19:214:34 | ...::new | semmle.label | ...::new | +| main.rs:214:19:214:51 | ...::new(...) | semmle.label | ...::new(...) | +| main.rs:215:9:215:11 | add | semmle.label | add | +| main.rs:215:13:215:19 | cookie3 | semmle.label | cookie3 | +| main.rs:215:13:215:27 | cookie3.clone() | semmle.label | cookie3.clone() | +| main.rs:218:5:218:11 | [SSA] cookie2 | semmle.label | [SSA] cookie2 | +| main.rs:218:5:218:11 | cookie2 | semmle.label | cookie2 | +| main.rs:219:9:219:11 | add | semmle.label | add | +| main.rs:219:13:219:19 | cookie2 | semmle.label | cookie2 | +| main.rs:219:13:219:27 | cookie2.clone() | semmle.label | cookie2.clone() | +| main.rs:228:5:228:11 | [SSA] cookie1 | semmle.label | [SSA] cookie1 | +| main.rs:228:5:228:11 | cookie1 | semmle.label | cookie1 | +| main.rs:229:9:229:11 | add | semmle.label | add | +| main.rs:229:13:229:19 | cookie1 | semmle.label | cookie1 | +| main.rs:229:13:229:27 | cookie1.clone() | semmle.label | cookie1.clone() | | main.rs:241:9:241:25 | cookie_config_bad | semmle.label | cookie_config_bad | | main.rs:241:29:241:62 | ...::new(...) | semmle.label | ...::new(...) | | main.rs:241:29:241:76 | ... .secure(...) | semmle.label | ... .secure(...) | @@ -242,58 +601,23 @@ nodes | main.rs:260:5:260:57 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:260:5:260:67 | ... .path(...) | semmle.label | ... .path(...) | | main.rs:260:69:260:74 | finish | semmle.label | finish | +| main.rs:263:5:263:11 | [SSA] cookie1 | semmle.label | [SSA] cookie1 | +| main.rs:263:5:263:11 | cookie1 | semmle.label | cookie1 | +| main.rs:264:9:264:11 | add | semmle.label | add | +| main.rs:264:13:264:19 | cookie1 | semmle.label | cookie1 | +| main.rs:264:13:264:27 | cookie1.clone() | semmle.label | cookie1.clone() | | main.rs:274:5:274:26 | ...::build | semmle.label | ...::build | | main.rs:274:5:274:43 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:274:45:274:50 | finish | semmle.label | finish | +| main.rs:276:9:276:15 | cookie3 | semmle.label | cookie3 | +| main.rs:276:19:276:38 | ...::new | semmle.label | ...::new | +| main.rs:276:19:276:55 | ...::new(...) | semmle.label | ...::new(...) | +| main.rs:277:9:277:11 | add | semmle.label | add | +| main.rs:277:13:277:19 | cookie3 | semmle.label | cookie3 | +| main.rs:277:13:277:27 | cookie3.clone() | semmle.label | cookie3.clone() | +| main.rs:280:5:280:11 | [SSA] cookie2 | semmle.label | [SSA] cookie2 | +| main.rs:280:5:280:11 | cookie2 | semmle.label | cookie2 | +| main.rs:281:9:281:11 | add | semmle.label | add | +| main.rs:281:13:281:19 | cookie2 | semmle.label | cookie2 | +| main.rs:281:13:281:27 | cookie2.clone() | semmle.label | cookie2.clone() | subpaths -testFailures -| main.rs:58:47:58:57 | //... | Missing result: Source | -| main.rs:59:25:59:56 | //... | Missing result: Alert[rust/insecure-cookie] | -| main.rs:60:34:60:65 | //... | Missing result: Alert[rust/insecure-cookie] | -| main.rs:63:26:63:36 | //... | Missing result: Source | -| main.rs:64:25:64:56 | //... | Missing result: Alert[rust/insecure-cookie] | -| main.rs:68:40:68:50 | //... | Missing result: Source | -| main.rs:69:32:69:63 | //... | Missing result: Alert[rust/insecure-cookie] | -| main.rs:70:41:70:72 | //... | Missing result: Alert[rust/insecure-cookie] | -| main.rs:71:30:71:40 | //... | Missing result: Source | -| main.rs:72:32:72:63 | //... | Missing result: Alert[rust/insecure-cookie] | -| main.rs:77:39:77:49 | //... | Missing result: Source | -| main.rs:78:33:78:64 | //... | Missing result: Alert[rust/insecure-cookie] | -| main.rs:79:42:79:73 | //... | Missing result: Alert[rust/insecure-cookie] | -| main.rs:83:33:83:64 | //... | Missing result: Alert[rust/insecure-cookie] | -| main.rs:87:39:87:49 | //... | Missing result: Source | -| main.rs:88:25:88:56 | //... | Missing result: Alert[rust/insecure-cookie] | -| main.rs:94:25:94:66 | //... | Fixed spurious result: Alert[rust/insecure-cookie] | -| main.rs:122:61:122:71 | //... | Missing result: Source | -| main.rs:123:32:123:63 | //... | Missing result: Alert[rust/insecure-cookie] | -| main.rs:130:34:130:44 | //... | Missing result: Source | -| main.rs:131:32:131:63 | //... | Missing result: Alert[rust/insecure-cookie] | -| main.rs:146:34:146:44 | //... | Missing result: Source | -| main.rs:147:32:147:63 | //... | Missing result: Alert[rust/insecure-cookie] | -| main.rs:155:61:155:71 | //... | Missing result: Source | -| main.rs:156:50:156:81 | //... | Missing result: Alert[rust/insecure-cookie] | -| main.rs:157:52:157:83 | //... | Missing result: Alert[rust/insecure-cookie] | -| main.rs:158:52:158:83 | //... | Missing result: Alert[rust/insecure-cookie] | -| main.rs:159:74:159:105 | //... | Missing result: Alert[rust/insecure-cookie] | -| main.rs:160:50:160:81 | //... | Missing result: Alert[rust/insecure-cookie] | -| main.rs:161:46:161:77 | //... | Missing result: Alert[rust/insecure-cookie] | -| main.rs:162:45:162:76 | //... | Missing result: Alert[rust/insecure-cookie] | -| main.rs:163:58:163:89 | //... | Missing result: Alert[rust/insecure-cookie] | -| main.rs:164:47:164:78 | //... | Missing result: Alert[rust/insecure-cookie] | -| main.rs:165:50:165:81 | //... | Missing result: Alert[rust/insecure-cookie] | -| main.rs:166:48:166:79 | //... | Missing result: Alert[rust/insecure-cookie] | -| main.rs:167:49:167:80 | //... | Missing result: Alert[rust/insecure-cookie] | -| main.rs:201:32:201:42 | //... | Missing result: Source | -| main.rs:202:31:202:62 | //... | Missing result: Alert[rust/insecure-cookie] | -| main.rs:214:54:214:64 | //... | Missing result: Source | -| main.rs:215:31:215:62 | //... | Missing result: Alert[rust/insecure-cookie] | -| main.rs:218:31:218:41 | //... | Missing result: Source | -| main.rs:219:31:219:62 | //... | Missing result: Alert[rust/insecure-cookie] | -| main.rs:228:32:228:42 | //... | Missing result: Source | -| main.rs:229:31:229:62 | //... | Missing result: Alert[rust/insecure-cookie] | -| main.rs:263:32:263:42 | //... | Missing result: Source | -| main.rs:264:31:264:62 | //... | Missing result: Alert[rust/insecure-cookie] | -| main.rs:276:58:276:68 | //... | Missing result: Source | -| main.rs:277:31:277:62 | //... | Missing result: Alert[rust/insecure-cookie] | -| main.rs:280:31:280:41 | //... | Missing result: Source | -| main.rs:281:31:281:62 | //... | Missing result: Alert[rust/insecure-cookie] | From 76140a69070b9bc78422961ec13f593b8d0cb5c6 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Mon, 3 Aug 2026 17:56:36 +0200 Subject: [PATCH 0076/2098] Rust: Add change note for rust-analyzer 0.0.328 upgrade Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- rust/ql/lib/change-notes/2026-08-03-rust-analyzer-0.0.328.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 rust/ql/lib/change-notes/2026-08-03-rust-analyzer-0.0.328.md diff --git a/rust/ql/lib/change-notes/2026-08-03-rust-analyzer-0.0.328.md b/rust/ql/lib/change-notes/2026-08-03-rust-analyzer-0.0.328.md new file mode 100644 index 000000000000..d9403a8b62aa --- /dev/null +++ b/rust/ql/lib/change-notes/2026-08-03-rust-analyzer-0.0.328.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The Rust extractor has been upgraded to use `rust-analyzer` version 0.0.328. As a result, the AST exposed by the Rust libraries has changed: the `TraitAlias` class has been removed, `cfg` attributes are now modeled by the new `CfgMeta`, `CfgAtom`, `CfgComposite`, `CfgPredicate`, and `CfgAttrMeta` classes, and the `Meta` class has been refined into the `KeyValueMeta`, `PathMeta`, `TokenTreeMeta`, and `UnsafeMeta` subclasses. New `TryBlockModifier` and `FormatArgsArgName` classes have also been added. From 50648628bfbd8e1720292d54e8827b890bf5f899 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Mon, 3 Aug 2026 18:03:08 +0200 Subject: [PATCH 0077/2098] Rust: fix clippy lints surfaced by the 1.91 toolchain bump Collapse nested `if let`/`if` into let-chains (edition 2024) in tree-sitter-extractor and add an explicit `'_` lifetime in yeast, as required by clippy under the new toolchain. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../tree-sitter-extractor/src/diagnostics.rs | 34 +++++++++---------- .../src/extractor/mod.rs | 16 ++++----- .../src/generator/ql_gen.rs | 8 ++--- .../tree-sitter-extractor/src/node_types.rs | 8 ++--- shared/yeast/src/lib.rs | 2 +- 5 files changed, 34 insertions(+), 34 deletions(-) diff --git a/shared/tree-sitter-extractor/src/diagnostics.rs b/shared/tree-sitter-extractor/src/diagnostics.rs index cd6f685e639e..412647ee07a5 100644 --- a/shared/tree-sitter-extractor/src/diagnostics.rs +++ b/shared/tree-sitter-extractor/src/diagnostics.rs @@ -119,24 +119,24 @@ impl LogWriter { Some(Severity::Note) => tracing::info!("{}", full_error_message), None => tracing::debug!("{}", full_error_message), } - if self.inner.is_none() { - if let Some(path) = self.path.as_ref() { - match std::fs::OpenOptions::new() - .create(true) - .append(true) - .open(path) - { - Err(e) => { - tracing::error!( - "Could not open log file '{}': {}", - &path.to_string_lossy(), - e - ); - self.path = None; - self.inner = None - } - Ok(file) => self.inner = Some(std::io::BufWriter::new(file)), + if self.inner.is_none() + && let Some(path) = self.path.as_ref() + { + match std::fs::OpenOptions::new() + .create(true) + .append(true) + .open(path) + { + Err(e) => { + tracing::error!( + "Could not open log file '{}': {}", + &path.to_string_lossy(), + e + ); + self.path = None; + self.inner = None } + Ok(file) => self.inner = Some(std::io::BufWriter::new(file)), } } if let Some(mut writer) = self.inner.as_mut() { diff --git a/shared/tree-sitter-extractor/src/extractor/mod.rs b/shared/tree-sitter-extractor/src/extractor/mod.rs index 1a8b9e820164..13ee3264133b 100644 --- a/shared/tree-sitter-extractor/src/extractor/mod.rs +++ b/shared/tree-sitter-extractor/src/extractor/mod.rs @@ -904,10 +904,10 @@ impl<'a> Visitor<'a> { if tp == single_type { return true; } - if let EntryKind::Union { members } = &self.schema.get(single_type).unwrap().kind { - if self.type_matches_set(tp, members) { - return true; - } + if let EntryKind::Union { members } = &self.schema.get(single_type).unwrap().kind + && self.type_matches_set(tp, members) + { + return true; } } node_types::FieldTypeInfo::Multiple { types, .. } => { @@ -926,10 +926,10 @@ impl<'a> Visitor<'a> { return true; } for other in types.iter() { - if let EntryKind::Union { members } = &self.schema.get(other).unwrap().kind { - if self.type_matches_set(tp, members) { - return true; - } + if let EntryKind::Union { members } = &self.schema.get(other).unwrap().kind + && self.type_matches_set(tp, members) + { + return true; } } false diff --git a/shared/tree-sitter-extractor/src/generator/ql_gen.rs b/shared/tree-sitter-extractor/src/generator/ql_gen.rs index fe6f9a2a828b..237ed9ddb968 100644 --- a/shared/tree-sitter-extractor/src/generator/ql_gen.rs +++ b/shared/tree-sitter-extractor/src/generator/ql_gen.rs @@ -834,10 +834,10 @@ pub fn convert_nodes(nodes: &node_types::NodeTypeMap) -> Vec> { let mut token_kinds = BTreeSet::new(); let direct_supertypes = compute_direct_supertypes(nodes); for (type_name, node) in nodes { - if let node_types::EntryKind::Token { .. } = &node.kind { - if type_name.named { - token_kinds.insert(&type_name.kind); - } + if let node_types::EntryKind::Token { .. } = &node.kind + && type_name.named + { + token_kinds.insert(&type_name.kind); } } diff --git a/shared/tree-sitter-extractor/src/node_types.rs b/shared/tree-sitter-extractor/src/node_types.rs index 4c67c2e4f20e..65217c8a28b6 100644 --- a/shared/tree-sitter-extractor/src/node_types.rs +++ b/shared/tree-sitter-extractor/src/node_types.rs @@ -355,10 +355,10 @@ fn escape_name(name: &str) -> String { let mut result = String::new(); // If there's a leading underscore, replace it with 'underscore_'. - if let Some(c) = name.chars().next() { - if c == '_' { - result.push_str("underscore"); - } + if let Some(c) = name.chars().next() + && c == '_' + { + result.push_str("underscore"); } for c in name.chars() { match c { diff --git a/shared/yeast/src/lib.rs b/shared/yeast/src/lib.rs index cf06d2d2c17b..c290246541f5 100644 --- a/shared/yeast/src/lib.rs +++ b/shared/yeast/src/lib.rs @@ -492,7 +492,7 @@ impl Ast { } } - pub fn walk(&self) -> AstCursor { + pub fn walk(&self) -> AstCursor<'_> { AstCursor::new(self) } From 1ff0e75f4d3b02603c92450bd3076b89743c32c6 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Mon, 3 Aug 2026 18:09:05 +0200 Subject: [PATCH 0078/2098] Rust: fix rustfmt formatting of ra_ap_syntax_bridge import The rust-analyzer 0.0.328 upgrade changed the ra_ap_syntax_bridge import in rust/extractor/src/translate/base.rs to a single line that exceeds the max width, causing the rust-code CI job to fail at cargo fmt --check. Wrap the import so cargo fmt --check passes. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- rust/extractor/src/translate/base.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rust/extractor/src/translate/base.rs b/rust/extractor/src/translate/base.rs index 62ff3d5fa10e..cb498e40bfe9 100644 --- a/rust/extractor/src/translate/base.rs +++ b/rust/extractor/src/translate/base.rs @@ -18,7 +18,9 @@ use ra_ap_syntax::{ AstNode, NodeOrToken, SyntaxElementChildren, SyntaxError, SyntaxNode, SyntaxToken, TextRange, ast, }; -use ra_ap_syntax_bridge::{DocCommentDesugarMode, syntax_node_to_token_tree, token_tree_to_syntax_node}; +use ra_ap_syntax_bridge::{ + DocCommentDesugarMode, syntax_node_to_token_tree, token_tree_to_syntax_node, +}; impl Emission for Translator<'_> { fn pre_emit(&mut self, node: &ast::Item) -> Option> { From 126c29234c7a78c126fbffbb9916535e61269c51 Mon Sep 17 00:00:00 2001 From: Nicolas Will Date: Tue, 4 Aug 2026 15:51:24 +0200 Subject: [PATCH 0079/2098] Fix Micronaut inline test expectations --- .../taintsources/MicronautConfig.java | 8 +- .../micronaut/MicronautControllerTest.java | 52 ++++----- .../micronaut/MicronautFileUploadTest.java | 10 +- .../micronaut/MicronautHttpClientTest.java | 110 +++++++++--------- .../micronaut/MicronautHttpRequestTest.java | 74 ++++++------ .../micronaut/MicronautWebSocketTest.java | 6 +- .../tests/MicronautResponseSplitting.java | 12 +- .../semmle/tests/MicronautUrlRedirect.java | 16 +-- 8 files changed, 144 insertions(+), 144 deletions(-) diff --git a/java/ql/test/library-tests/dataflow/taintsources/MicronautConfig.java b/java/ql/test/library-tests/dataflow/taintsources/MicronautConfig.java index 2661a4ac70b6..a2dcca0b5cf1 100644 --- a/java/ql/test/library-tests/dataflow/taintsources/MicronautConfig.java +++ b/java/ql/test/library-tests/dataflow/taintsources/MicronautConfig.java @@ -15,21 +15,21 @@ private static void sink(Object o) {} @Get("/secret") void testValueField() { - sink(secretValue); // $hasLocalValueFlow + sink(secretValue); // $ hasLocalValueFlow } @Get("/key") void testPropertyField() { - sink(apiKey); // $hasLocalValueFlow + sink(apiKey); // $ hasLocalValueFlow } @Get("/param") void testPropertyParam(@Property(name = "app.api-key") String appName) { - sink(appName); // $hasLocalValueFlow + sink(appName); // $ hasLocalValueFlow } @Get("/param") void testValueParam(@Value("${app.name}") String appName) { - sink(appName); // $hasLocalValueFlow + sink(appName); // $ hasLocalValueFlow } } diff --git a/java/ql/test/library-tests/frameworks/micronaut/MicronautControllerTest.java b/java/ql/test/library-tests/frameworks/micronaut/MicronautControllerTest.java index ee4d30a0f570..582a10829ead 100644 --- a/java/ql/test/library-tests/frameworks/micronaut/MicronautControllerTest.java +++ b/java/ql/test/library-tests/frameworks/micronaut/MicronautControllerTest.java @@ -12,76 +12,76 @@ void sink(Object o) {} @Get("/path/{id}") void testPathVariable(@PathVariable String id) { - sink(id); // $hasTaintFlow + sink(id); // $ hasTaintFlow } @Get("/query") void testQueryValue(@QueryValue String name) { - sink(name); // $hasTaintFlow + sink(name); // $ hasTaintFlow } @Post("/body") void testBody(@Body String body) { - sink(body); // $hasTaintFlow + sink(body); // $ hasTaintFlow } @Get("/header") void testHeader(@Header String authorization) { - sink(authorization); // $hasTaintFlow + sink(authorization); // $ hasTaintFlow } @Get("/cookie") void testCookieValue(@CookieValue String sessionId) { - sink(sessionId); // $hasTaintFlow + sink(sessionId); // $ hasTaintFlow } @Post("/part") void testPart(@Part String name) { - sink(name); // $hasTaintFlow + sink(name); // $ hasTaintFlow } @Get("/attr") void testRequestAttribute(@RequestAttribute String attr) { - sink(attr); // $hasTaintFlow + sink(attr); // $ hasTaintFlow } @Post("/bean") void testRequestBean(@RequestBean Object bean) { - sink(bean); // $hasTaintFlow + sink(bean); // $ hasTaintFlow } @Get("/implicit") void testImplicitParam(String implicitParam) { - sink(implicitParam); // $hasTaintFlow + sink(implicitParam); // $ hasTaintFlow } @Get("/request") void testHttpRequest(HttpRequest request) { - sink(request); // $hasTaintFlow + sink(request); // $ hasTaintFlow } @Get("/headers") void testHttpHeaders(HttpHeaders headers) { - sink(headers); // $hasTaintFlow + sink(headers); // $ hasTaintFlow } @Get("/parameters") void testHttpParameters(HttpParameters parameters) { - sink(parameters); // $hasTaintFlow + sink(parameters); // $ hasTaintFlow } @Get("/cookies") void testCookies(Cookies cookies) { - sink(cookies); // $hasTaintFlow - sink(cookies.getValue("session")); // $hasTaintFlow + sink(cookies); // $ hasTaintFlow + sink(cookies.getValue("session")); // $ hasTaintFlow for (java.util.Map.Entry entry : cookies) { - sink(entry.getValue()); // $hasTaintFlow + sink(entry.getValue()); // $ hasTaintFlow } } @Post("/stream") void testInputStream(@Body InputStream stream) { - sink(stream); // $hasTaintFlow + sink(stream); // $ hasTaintFlow } @Post("/reader") @@ -91,39 +91,39 @@ void testReader(Reader reader) { @Post("/post") void testPostMethod(@Body String data) { - sink(data); // $hasTaintFlow + sink(data); // $ hasTaintFlow } @Put("/put") void testPutMethod(@Body String data) { - sink(data); // $hasTaintFlow + sink(data); // $ hasTaintFlow } @Delete("/delete/{id}") void testDeleteMethod(@PathVariable String id) { - sink(id); // $hasTaintFlow + sink(id); // $ hasTaintFlow } @Patch("/patch") void testPatchMethod(@Body String data) { - sink(data); // $hasTaintFlow + sink(data); // $ hasTaintFlow } @io.micronaut.http.annotation.Error void testErrorHandler(HttpRequest request) { - sink(request); // $hasTaintFlow + sink(request); // $ hasTaintFlow } @io.micronaut.http.annotation.Error void testAnnotatedErrorHandler(@Header String header, @RequestBean Object bean) { - sink(header); // $hasTaintFlow - sink(bean); // $hasTaintFlow + sink(header); // $ hasTaintFlow + sink(bean); // $ hasTaintFlow } @io.micronaut.http.annotation.Error void testErrorHandlerCarriers(HttpHeaders headers, HttpParameters parameters, Cookies cookies) { - sink(headers); // $hasTaintFlow - sink(parameters); // $hasTaintFlow - sink(cookies); // $hasTaintFlow + sink(headers); // $ hasTaintFlow + sink(parameters); // $ hasTaintFlow + sink(cookies); // $ hasTaintFlow } } diff --git a/java/ql/test/library-tests/frameworks/micronaut/MicronautFileUploadTest.java b/java/ql/test/library-tests/frameworks/micronaut/MicronautFileUploadTest.java index 3ede38626a38..7cff0859358c 100644 --- a/java/ql/test/library-tests/frameworks/micronaut/MicronautFileUploadTest.java +++ b/java/ql/test/library-tests/frameworks/micronaut/MicronautFileUploadTest.java @@ -9,10 +9,10 @@ void sink(Object o) {} @Post("/file") void testFileUpload(CompletedFileUpload file) throws IOException { - sink(file.getFilename()); // $hasTaintFlow - sink(file.getBytes()); // $hasTaintFlow - sink(file.getInputStream()); // $hasTaintFlow - sink(file.getContentType()); // $hasTaintFlow - sink(file.getSize()); // $hasTaintFlow + sink(file.getFilename()); // $ hasTaintFlow + sink(file.getBytes()); // $ hasTaintFlow + sink(file.getInputStream()); // $ hasTaintFlow + sink(file.getContentType()); // $ hasTaintFlow + sink(file.getSize()); // $ hasTaintFlow } } diff --git a/java/ql/test/library-tests/frameworks/micronaut/MicronautHttpClientTest.java b/java/ql/test/library-tests/frameworks/micronaut/MicronautHttpClientTest.java index b073266a5012..6bac6e838006 100644 --- a/java/ql/test/library-tests/frameworks/micronaut/MicronautHttpClientTest.java +++ b/java/ql/test/library-tests/frameworks/micronaut/MicronautHttpClientTest.java @@ -18,167 +18,167 @@ String taint() { void testRetrieveString() { String url = taint(); - client.toBlocking().retrieve(url); // $hasTaintFlow + client.toBlocking().retrieve(url); // $ hasTaintFlow } void testRetrieveStringClass() { String url = taint(); - client.toBlocking().retrieve(url, String.class); // $hasTaintFlow + client.toBlocking().retrieve(url, String.class); // $ hasTaintFlow } void testExchangeString() { String url = taint(); - client.toBlocking().exchange(url); // $hasTaintFlow + client.toBlocking().exchange(url); // $ hasTaintFlow } void testExchangeStringClass() { String url = taint(); - client.toBlocking().exchange(url, String.class); // $hasTaintFlow + client.toBlocking().exchange(url, String.class); // $ hasTaintFlow } void testRetrieveStringClassClass() { - client.toBlocking().retrieve(taint(), String.class, Object.class); // $hasTaintFlow + client.toBlocking().retrieve(taint(), String.class, Object.class); // $ hasTaintFlow } void testExchangeStringClassClass() { - client.toBlocking().exchange(taint(), String.class, Object.class); // $hasTaintFlow + client.toBlocking().exchange(taint(), String.class, Object.class); // $ hasTaintFlow } void testBlockingRequest() { - client.toBlocking().retrieve(HttpRequest.GET(taint())); // $hasTaintFlow - client.toBlocking().retrieve(HttpRequest.GET(taint()), String.class); // $hasTaintFlow - client.toBlocking().retrieve(HttpRequest.GET(taint()), new Argument()); // $hasTaintFlow - client.toBlocking().retrieve(HttpRequest.GET(taint()), new Argument(), new Argument()); // $hasTaintFlow - client.toBlocking().exchange(HttpRequest.GET(taint())); // $hasTaintFlow - client.toBlocking().exchange(HttpRequest.GET(taint()), String.class); // $hasTaintFlow - client.toBlocking().exchange(HttpRequest.GET(taint()), new Argument()); // $hasTaintFlow - client.toBlocking().exchange(HttpRequest.GET(taint()), new Argument(), new Argument()); // $hasTaintFlow + client.toBlocking().retrieve(HttpRequest.GET(taint())); // $ hasTaintFlow + client.toBlocking().retrieve(HttpRequest.GET(taint()), String.class); // $ hasTaintFlow + client.toBlocking().retrieve(HttpRequest.GET(taint()), new Argument()); // $ hasTaintFlow + client.toBlocking().retrieve(HttpRequest.GET(taint()), new Argument(), new Argument()); // $ hasTaintFlow + client.toBlocking().exchange(HttpRequest.GET(taint())); // $ hasTaintFlow + client.toBlocking().exchange(HttpRequest.GET(taint()), String.class); // $ hasTaintFlow + client.toBlocking().exchange(HttpRequest.GET(taint()), new Argument()); // $ hasTaintFlow + client.toBlocking().exchange(HttpRequest.GET(taint()), new Argument(), new Argument()); // $ hasTaintFlow } void testNonBlockingClient() { - client.retrieve(taint()); // $hasTaintFlow - client.exchange(taint()); // $hasTaintFlow - client.exchange(taint(), String.class); // $hasTaintFlow - client.retrieve(HttpRequest.GET(taint())); // $hasTaintFlow - client.retrieve(HttpRequest.GET(taint()), String.class); // $hasTaintFlow - client.retrieve(HttpRequest.GET(taint()), new Argument()); // $hasTaintFlow - client.retrieve(HttpRequest.GET(taint()), new Argument(), new Argument()); // $hasTaintFlow - client.exchange(HttpRequest.GET(taint())); // $hasTaintFlow - client.exchange(HttpRequest.GET(taint()), String.class); // $hasTaintFlow - client.exchange(HttpRequest.GET(taint()), new Argument()); // $hasTaintFlow - client.exchange(HttpRequest.GET(taint()), new Argument(), new Argument()); // $hasTaintFlow + client.retrieve(taint()); // $ hasTaintFlow + client.exchange(taint()); // $ hasTaintFlow + client.exchange(taint(), String.class); // $ hasTaintFlow + client.retrieve(HttpRequest.GET(taint())); // $ hasTaintFlow + client.retrieve(HttpRequest.GET(taint()), String.class); // $ hasTaintFlow + client.retrieve(HttpRequest.GET(taint()), new Argument()); // $ hasTaintFlow + client.retrieve(HttpRequest.GET(taint()), new Argument(), new Argument()); // $ hasTaintFlow + client.exchange(HttpRequest.GET(taint())); // $ hasTaintFlow + client.exchange(HttpRequest.GET(taint()), String.class); // $ hasTaintFlow + client.exchange(HttpRequest.GET(taint()), new Argument()); // $ hasTaintFlow + client.exchange(HttpRequest.GET(taint()), new Argument(), new Argument()); // $ hasTaintFlow } void testGetFactory() { HttpRequest req = HttpRequest.GET(taint()); - sink(req); // $hasTaintFlow + sink(req); // $ hasTaintFlow } void testPostFactory() { HttpRequest req = HttpRequest.POST(taint(), "body"); - sink(req); // $hasTaintFlow + sink(req); // $ hasTaintFlow } void testPutFactory() { HttpRequest req = HttpRequest.PUT(taint(), "body"); - sink(req); // $hasTaintFlow + sink(req); // $ hasTaintFlow } void testDeleteFactory() { HttpRequest req = HttpRequest.DELETE(taint()); - sink(req); // $hasTaintFlow + sink(req); // $ hasTaintFlow } void testPatchFactory() { HttpRequest req = HttpRequest.PATCH(taint(), "body"); - sink(req); // $hasTaintFlow + sink(req); // $ hasTaintFlow } void testHeadFactory() { HttpRequest req = HttpRequest.HEAD(taint()); - sink(req); // $hasTaintFlow + sink(req); // $ hasTaintFlow } void testOptionsFactory() { HttpRequest req = HttpRequest.OPTIONS(taint()); - sink(req); // $hasTaintFlow + sink(req); // $ hasTaintFlow } void testUriFactories() { - sink(HttpRequest.GET(URI.create(taint()))); // $hasTaintFlow - sink(HttpRequest.POST(URI.create(taint()), "body")); // $hasTaintFlow - sink(HttpRequest.PUT(URI.create(taint()), "body")); // $hasTaintFlow - sink(HttpRequest.DELETE(URI.create(taint()))); // $hasTaintFlow - sink(HttpRequest.DELETE(URI.create(taint()), "body")); // $hasTaintFlow - sink(HttpRequest.PATCH(URI.create(taint()), "body")); // $hasTaintFlow - sink(HttpRequest.HEAD(URI.create(taint()))); // $hasTaintFlow - sink(HttpRequest.OPTIONS(URI.create(taint()))); // $hasTaintFlow + sink(HttpRequest.GET(URI.create(taint()))); // $ hasTaintFlow + sink(HttpRequest.POST(URI.create(taint()), "body")); // $ hasTaintFlow + sink(HttpRequest.PUT(URI.create(taint()), "body")); // $ hasTaintFlow + sink(HttpRequest.DELETE(URI.create(taint()))); // $ hasTaintFlow + sink(HttpRequest.DELETE(URI.create(taint()), "body")); // $ hasTaintFlow + sink(HttpRequest.PATCH(URI.create(taint()), "body")); // $ hasTaintFlow + sink(HttpRequest.HEAD(URI.create(taint()))); // $ hasTaintFlow + sink(HttpRequest.OPTIONS(URI.create(taint()))); // $ hasTaintFlow } void testDeleteFactoryWithBody() { - sink(HttpRequest.DELETE(taint(), "body")); // $hasTaintFlow + sink(HttpRequest.DELETE(taint(), "body")); // $ hasTaintFlow } void testUriBuilderOfCharSequence() { URI uri = UriBuilder.of(taint()).build(); - sink(uri); // $hasTaintFlow + sink(uri); // $ hasTaintFlow } void testUriBuilderOfUri() { URI uri = UriBuilder.of(URI.create(taint())).build(); - sink(uri); // $hasTaintFlow + sink(uri); // $ hasTaintFlow } void testUriBuilderHost() { URI uri = UriBuilder.of("http://example.com").host(taint()).build(); - sink(uri); // $hasTaintFlow + sink(uri); // $ hasTaintFlow } void testUriBuilderPath() { URI uri = UriBuilder.of("http://example.com").path(taint()).build(); - sink(uri); // $hasTaintFlow + sink(uri); // $ hasTaintFlow } void testUriBuilderQueryParamName() { URI uri = UriBuilder.of("http://example.com").queryParam(taint(), "value").build(); - sink(uri); // $hasTaintFlow + sink(uri); // $ hasTaintFlow } void testUriBuilderQueryParamValue() { URI uri = UriBuilder.of("http://example.com").queryParam("key", taint()).build(); - sink(uri); // $hasTaintFlow + sink(uri); // $ hasTaintFlow } void testUriBuilderFragment() { URI uri = UriBuilder.of("http://example.com").fragment(taint()).build(); - sink(uri); // $hasTaintFlow + sink(uri); // $ hasTaintFlow } void testUriBuilderMutation() { UriBuilder builder = UriBuilder.of("http://example.com"); builder.host(taint()); - sink(builder.build()); // $hasTaintFlow + sink(builder.build()); // $ hasTaintFlow } void testUriBuilderReplaceQueryParam() { URI uri = UriBuilder.of("http://example.com").replaceQueryParam("key", taint()).build(); - sink(uri); // $hasTaintFlow + sink(uri); // $ hasTaintFlow } void testUriBuilderAdditionalFluentMethods() { - sink(UriBuilder.of("http://example.com").scheme(taint()).build()); // $hasTaintFlow - sink(UriBuilder.of("http://example.com").userInfo(taint()).build()); // $hasTaintFlow - sink(UriBuilder.of("http://example.com").replacePath(taint()).build()); // $hasTaintFlow + sink(UriBuilder.of("http://example.com").scheme(taint()).build()); // $ hasTaintFlow + sink(UriBuilder.of("http://example.com").userInfo(taint()).build()); // $ hasTaintFlow + sink(UriBuilder.of("http://example.com").replacePath(taint()).build()); // $ hasTaintFlow } void testUriBuilderExpandBuilder() { URI uri = UriBuilder.of(taint()).expand(Collections.singletonMap("id", "value")); - sink(uri); // $hasTaintFlow + sink(uri); // $ hasTaintFlow } void testUriBuilderExpandValue() { URI uri = UriBuilder.of("http://example.com/{id}") .expand(Collections.singletonMap("id", taint())); - sink(uri); // $hasTaintFlow + sink(uri); // $ hasTaintFlow } } diff --git a/java/ql/test/library-tests/frameworks/micronaut/MicronautHttpRequestTest.java b/java/ql/test/library-tests/frameworks/micronaut/MicronautHttpRequestTest.java index 42d94165f6ef..63f637a97990 100644 --- a/java/ql/test/library-tests/frameworks/micronaut/MicronautHttpRequestTest.java +++ b/java/ql/test/library-tests/frameworks/micronaut/MicronautHttpRequestTest.java @@ -11,75 +11,75 @@ void sink(Object o) {} @Get("/headers") void testHeaders(HttpRequest request) { - sink(request.getHeaders()); // $hasTaintFlow - sink(request.getHeaders().get("X-Custom")); // $hasTaintFlow - sink(request.getHeaders().getAll("X-Custom").get(0)); // $hasTaintFlow - sink(request.getHeaders().getFirst("X-Custom").get()); // $hasTaintFlow - sink(request.getHeaders().getValue("X-Custom").get(0)); // $hasTaintFlow - sink(request.getHeaders().values().iterator().next().get(0)); // $hasTaintFlow - sink(request.getHeaders().asMap().get("X-Custom").get(0)); // $hasTaintFlow - sink(request.getHeaders().asProperties().get("X-Custom")); // $hasTaintFlow - sink(request.getHeaders().subMap("X", List.class).get("Custom").get(0)); // $hasTaintFlow + sink(request.getHeaders()); // $ hasTaintFlow + sink(request.getHeaders().get("X-Custom")); // $ hasTaintFlow + sink(request.getHeaders().getAll("X-Custom").get(0)); // $ hasTaintFlow + sink(request.getHeaders().getFirst("X-Custom").get()); // $ hasTaintFlow + sink(request.getHeaders().getValue("X-Custom").get(0)); // $ hasTaintFlow + sink(request.getHeaders().values().iterator().next().get(0)); // $ hasTaintFlow + sink(request.getHeaders().asMap().get("X-Custom").get(0)); // $ hasTaintFlow + sink(request.getHeaders().asProperties().get("X-Custom")); // $ hasTaintFlow + sink(request.getHeaders().subMap("X", List.class).get("Custom").get(0)); // $ hasTaintFlow for (Map.Entry> header : request.getHeaders()) { - sink(header.getValue().get(0)); // $hasTaintFlow + sink(header.getValue().get(0)); // $ hasTaintFlow } } @Get("/params") void testParameters(HttpRequest request) { - sink(request.getParameters()); // $hasTaintFlow - sink(request.getParameters().get("q")); // $hasTaintFlow - sink(request.getParameters().getAll("q").get(0)); // $hasTaintFlow - sink(request.getParameters().getFirst("q").get()); // $hasTaintFlow - sink(request.getParameters().getValue("q").get(0)); // $hasTaintFlow - sink(request.getParameters().values().iterator().next().get(0)); // $hasTaintFlow - sink(request.getParameters().asMap().get("q").get(0)); // $hasTaintFlow + sink(request.getParameters()); // $ hasTaintFlow + sink(request.getParameters().get("q")); // $ hasTaintFlow + sink(request.getParameters().getAll("q").get(0)); // $ hasTaintFlow + sink(request.getParameters().getFirst("q").get()); // $ hasTaintFlow + sink(request.getParameters().getValue("q").get(0)); // $ hasTaintFlow + sink(request.getParameters().values().iterator().next().get(0)); // $ hasTaintFlow + sink(request.getParameters().asMap().get("q").get(0)); // $ hasTaintFlow } @Get("/cookies") void testCookies(HttpRequest request) { - sink(request.getCookies()); // $hasTaintFlow + sink(request.getCookies()); // $ hasTaintFlow Cookie cookie = request.getCookies().get("session"); - sink(cookie); // $hasTaintFlow - sink(cookie.getValue()); // $hasTaintFlow - sink(cookie.getName()); // $hasTaintFlow - sink(cookie.getDomain()); // $hasTaintFlow - sink(cookie.getPath()); // $hasTaintFlow - sink(request.getCookies().getAll()); // $hasTaintFlow - sink(request.getCookies().findCookie("session")); // $hasTaintFlow - sink(request.getCookies().getValue("session")); // $hasTaintFlow - sink(request.getCookies().values().iterator().next()); // $hasTaintFlow - sink(request.getCookies().asMap().get("session")); // $hasTaintFlow + sink(cookie); // $ hasTaintFlow + sink(cookie.getValue()); // $ hasTaintFlow + sink(cookie.getName()); // $ hasTaintFlow + sink(cookie.getDomain()); // $ hasTaintFlow + sink(cookie.getPath()); // $ hasTaintFlow + sink(request.getCookies().getAll()); // $ hasTaintFlow + sink(request.getCookies().findCookie("session")); // $ hasTaintFlow + sink(request.getCookies().getValue("session")); // $ hasTaintFlow + sink(request.getCookies().values().iterator().next()); // $ hasTaintFlow + sink(request.getCookies().asMap().get("session")); // $ hasTaintFlow for (Map.Entry entry : request.getCookies()) { - sink(entry.getValue()); // $hasTaintFlow + sink(entry.getValue()); // $ hasTaintFlow } } @Get("/uri") void testUri(HttpRequest request) { - sink(request.getUri()); // $hasTaintFlow - sink(request.getPath()); // $hasTaintFlow - sink(request.getMethodName()); // $hasTaintFlow + sink(request.getUri()); // $ hasTaintFlow + sink(request.getPath()); // $ hasTaintFlow + sink(request.getMethodName()); // $ hasTaintFlow } @Post("/body") void testBody(HttpRequest request) { - sink(request.getBody()); // $hasTaintFlow + sink(request.getBody()); // $ hasTaintFlow } @Get("/content") void testContent(HttpRequest request) { - sink(request.getContentType()); // $hasTaintFlow - sink(request.getContentLength()); // $hasTaintFlow + sink(request.getContentType()); // $ hasTaintFlow + sink(request.getContentLength()); // $ hasTaintFlow } @Get("/redirect") HttpResponse testRedirect(HttpRequest request) { - return HttpResponse.redirect(request.getUri()); // $hasTaintFlow + return HttpResponse.redirect(request.getUri()); // $ hasTaintFlow } @Get("/header-set") HttpResponse testHeaderSplitting(HttpRequest request) { - return HttpResponse.ok().header("X-Custom", request.getHeaders().get("User-Input")); // $hasTaintFlow + return HttpResponse.ok().header("X-Custom", request.getHeaders().get("User-Input")); // $ hasTaintFlow } } diff --git a/java/ql/test/library-tests/frameworks/micronaut/MicronautWebSocketTest.java b/java/ql/test/library-tests/frameworks/micronaut/MicronautWebSocketTest.java index 99f7a575a22b..b019dca7af68 100644 --- a/java/ql/test/library-tests/frameworks/micronaut/MicronautWebSocketTest.java +++ b/java/ql/test/library-tests/frameworks/micronaut/MicronautWebSocketTest.java @@ -9,17 +9,17 @@ void sink(Object o) {} @OnMessage void onMessage(String message, WebSocketSession session) { - sink(message); // $hasTaintFlow + sink(message); // $ hasTaintFlow } @OnOpen void onOpen(String room, WebSocketSession session) { - sink(room); // $hasTaintFlow + sink(room); // $ hasTaintFlow } @OnClose void onClose(String room, CloseReason reason, WebSocketSession session) { - sink(room); // $hasTaintFlow + sink(room); // $ hasTaintFlow sink(reason); sink(session); } diff --git a/java/ql/test/query-tests/security/CWE-113/semmle/tests/MicronautResponseSplitting.java b/java/ql/test/query-tests/security/CWE-113/semmle/tests/MicronautResponseSplitting.java index f95566722f88..52381734c75a 100644 --- a/java/ql/test/query-tests/security/CWE-113/semmle/tests/MicronautResponseSplitting.java +++ b/java/ql/test/query-tests/security/CWE-113/semmle/tests/MicronautResponseSplitting.java @@ -11,9 +11,9 @@ public class MicronautResponseSplitting { @Get("/bad") - public MutableHttpResponse bad(@QueryValue String headerValue) { + public MutableHttpResponse bad(@QueryValue String headerValue) { // $ Source // BAD: user-controlled header value - return HttpResponse.ok().header("X-Custom", headerValue); + return HttpResponse.ok().header("X-Custom", headerValue); // $ Alert } @Get("/good") @@ -24,16 +24,16 @@ public MutableHttpResponse good(@QueryValue String headerValue) { } @Get("/bad-map") - public MutableHttpResponse badMap(@QueryValue String headerValue) { + public MutableHttpResponse badMap(@QueryValue String headerValue) { // $ Source // BAD: user-controlled header value - return HttpResponse.ok().headers(Collections.singletonMap("X-Custom", headerValue)); + return HttpResponse.ok().headers(Collections.singletonMap("X-Custom", headerValue)); // $ Alert } @Get("/bad-map-mutation") - public MutableHttpResponse badMapMutation(@QueryValue String headerValue) { + public MutableHttpResponse badMapMutation(@QueryValue String headerValue) { // $ Source Map headers = new HashMap<>(); headers.put("X-Custom", headerValue); - return HttpResponse.ok().headers(headers); + return HttpResponse.ok().headers(headers); // $ Alert } @Get("/good-map") diff --git a/java/ql/test/query-tests/security/CWE-601/semmle/tests/MicronautUrlRedirect.java b/java/ql/test/query-tests/security/CWE-601/semmle/tests/MicronautUrlRedirect.java index 6b3b5331a027..755d0e51cdc2 100644 --- a/java/ql/test/query-tests/security/CWE-601/semmle/tests/MicronautUrlRedirect.java +++ b/java/ql/test/query-tests/security/CWE-601/semmle/tests/MicronautUrlRedirect.java @@ -9,9 +9,9 @@ public class MicronautUrlRedirect { @Get("/bad") - public MutableHttpResponse bad(@QueryValue String target) { + public MutableHttpResponse bad(@QueryValue String target) { // $ Source // BAD: user-controlled redirect target - return HttpResponse.redirect(URI.create(target)); + return HttpResponse.redirect(URI.create(target)); // $ Alert } @Get("/good") @@ -24,17 +24,17 @@ public MutableHttpResponse good(@QueryValue String target) { } @Get("/permanent") - public MutableHttpResponse permanent(@QueryValue String target) { - return HttpResponse.permanentRedirect(URI.create(target)); + public MutableHttpResponse permanent(@QueryValue String target) { // $ Source + return HttpResponse.permanentRedirect(URI.create(target)); // $ Alert } @Get("/see-other") - public MutableHttpResponse seeOther(@QueryValue String target) { - return HttpResponse.seeOther(URI.create(target)); + public MutableHttpResponse seeOther(@QueryValue String target) { // $ Source + return HttpResponse.seeOther(URI.create(target)); // $ Alert } @Get("/temporary") - public MutableHttpResponse temporary(@QueryValue String target) { - return HttpResponse.temporaryRedirect(URI.create(target)); + public MutableHttpResponse temporary(@QueryValue String target) { // $ Source + return HttpResponse.temporaryRedirect(URI.create(target)); // $ Alert } } From 369cd160ef536da6bb753ff118c7c61976cb5cff Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Tue, 4 Aug 2026 16:18:33 +0200 Subject: [PATCH 0080/2098] CODEOWNERS: make language coverage team responsible for more Rust and C++ code --- CODEOWNERS | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CODEOWNERS b/CODEOWNERS index 9cbda8244467..0c09972f903c 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -24,8 +24,14 @@ /rust/ @github/codeql-rust /rust/extractor/ @github/codeql-rust @github/code-scanning-language-coverage /shared/ @github/codeql-shared-libraries-reviewers +/shared/cpp @github/code-scanning-language-coverage +/shared/yeast @github/code-scanning-language-coverage +/shared/yeast-macros @github/code-scanning-language-coverage +/shared/yeast-schema @github/code-scanning-language-coverage /swift/ @github/codeql-swift /swift/extractor/ @github/codeql-swift @github/code-scanning-language-coverage +/unified/extractor @github/code-scanning-language-coverage +/unified/swift-syntax-rs @github/code-scanning-language-coverage /misc/codegen/ @github/codeql-swift /java/kotlin-extractor/ @github/codeql-kotlin @github/code-scanning-language-coverage /java/ql/test-kotlin1/ @github/codeql-kotlin From 9292c219611f60a84d399cca210b068722fae684 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Tue, 4 Aug 2026 16:40:10 +0200 Subject: [PATCH 0081/2098] CODEOWNERS: Add missing `/` --- CODEOWNERS | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index 0c09972f903c..bceaafdbc07c 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -24,14 +24,14 @@ /rust/ @github/codeql-rust /rust/extractor/ @github/codeql-rust @github/code-scanning-language-coverage /shared/ @github/codeql-shared-libraries-reviewers -/shared/cpp @github/code-scanning-language-coverage -/shared/yeast @github/code-scanning-language-coverage -/shared/yeast-macros @github/code-scanning-language-coverage -/shared/yeast-schema @github/code-scanning-language-coverage +/shared/cpp/ @github/code-scanning-language-coverage +/shared/yeast/ @github/code-scanning-language-coverage +/shared/yeast-macros/ @github/code-scanning-language-coverage +/shared/yeast-schema/ @github/code-scanning-language-coverage /swift/ @github/codeql-swift /swift/extractor/ @github/codeql-swift @github/code-scanning-language-coverage -/unified/extractor @github/code-scanning-language-coverage -/unified/swift-syntax-rs @github/code-scanning-language-coverage +/unified/extractor/ @github/code-scanning-language-coverage +/unified/swift-syntax-rs/ @github/code-scanning-language-coverage /misc/codegen/ @github/codeql-swift /java/kotlin-extractor/ @github/codeql-kotlin @github/code-scanning-language-coverage /java/ql/test-kotlin1/ @github/codeql-kotlin From 22c5ab2c265064cbf9b60069908bf8a2a77b5c83 Mon Sep 17 00:00:00 2001 From: JarLob Date: Tue, 4 Aug 2026 23:34:52 +0300 Subject: [PATCH 0082/2098] Remove SelfHostedQuery completely --- .../2026-08-03-deprecate-self-hosted-query.md | 4 -- ...-08-04-remove-self-hosted-query-library.md | 4 ++ .../actions/security/SelfHostedQuery.qll | 52 ------------------- 3 files changed, 4 insertions(+), 56 deletions(-) delete mode 100644 actions/ql/lib/change-notes/2026-08-03-deprecate-self-hosted-query.md create mode 100644 actions/ql/lib/change-notes/2026-08-04-remove-self-hosted-query-library.md delete mode 100644 actions/ql/lib/codeql/actions/security/SelfHostedQuery.qll diff --git a/actions/ql/lib/change-notes/2026-08-03-deprecate-self-hosted-query.md b/actions/ql/lib/change-notes/2026-08-03-deprecate-self-hosted-query.md deleted file mode 100644 index 932a9e7ca49a..000000000000 --- a/actions/ql/lib/change-notes/2026-08-03-deprecate-self-hosted-query.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: deprecated ---- -* The `codeql.actions.security.SelfHostedQuery` module has been deprecated because runner labels do not reliably distinguish self-hosted runners from managed runners. \ No newline at end of file diff --git a/actions/ql/lib/change-notes/2026-08-04-remove-self-hosted-query-library.md b/actions/ql/lib/change-notes/2026-08-04-remove-self-hosted-query-library.md new file mode 100644 index 000000000000..562b519e001a --- /dev/null +++ b/actions/ql/lib/change-notes/2026-08-04-remove-self-hosted-query-library.md @@ -0,0 +1,4 @@ +--- +category: breaking +--- +* The `codeql.actions.security.SelfHostedQuery` module has been removed because runner labels do not reliably distinguish self-hosted runners from managed runners. diff --git a/actions/ql/lib/codeql/actions/security/SelfHostedQuery.qll b/actions/ql/lib/codeql/actions/security/SelfHostedQuery.qll deleted file mode 100644 index b3f7bdaf24d3..000000000000 --- a/actions/ql/lib/codeql/actions/security/SelfHostedQuery.qll +++ /dev/null @@ -1,52 +0,0 @@ -/** - * DEPRECATED: Runner labels do not reliably distinguish self-hosted runners from managed runners. - */ -deprecated module; - -import actions - -bindingset[runner] -predicate isGithubHostedRunner(string runner) { - // The list of github hosted repos: - // https://github.com/actions/runner-images/blob/main/README.md#available-images - // https://docs.github.com/en/enterprise-cloud@latest/actions/how-tos/write-workflows/choose-where-workflows-run/choose-the-runner-for-a-job#standard-github-hosted-runners-for-public-repositories - runner.toLowerCase().regexpMatch("^ubuntu-([0-9.]+|latest|slim)(-arm)?$") or - runner.toLowerCase().regexpMatch("^macos-([0-9]+|latest)(-x?large|-intel)?$") or - runner.toLowerCase().regexpMatch("^windows-([0-9.]+|latest)(-vs[0-9.]+)?(-arm)?$") -} - -bindingset[runner] -predicate is3rdPartyHostedRunner(string runner) { - runner.toLowerCase().regexpMatch("^(buildjet|warp)-[a-z0-9-]+$") -} - -/** - * This predicate uses data available in the workflow file to identify self-hosted runners. - * It does not know if the repository is public or private. - * It is a best-effort approach to identify self-hosted runners. - */ -predicate staticallyIdentifiedSelfHostedRunner(Job job) { - exists(string label | - job.getATriggerEvent().getName() = - [ - "issue_comment", "pull_request", "pull_request_review", "pull_request_review_comment", - "pull_request_target", "workflow_run" - ] and - label = job.getARunsOnLabel() and - not isGithubHostedRunner(label) and - not is3rdPartyHostedRunner(label) - ) -} - -/** - * This predicate uses data available in the job log files to identify self-hosted runners. - * It is a best-effort approach to identify self-hosted runners. - */ -predicate dynamicallyIdentifiedSelfHostedRunner(Job job) { - exists(string runner_info | - repositoryDataModel("public", _) and - workflowDataModel(job.getEnclosingWorkflow().getLocation().getFile().getRelativePath(), _, - job.getId(), _, _, runner_info) and - runner_info.indexOf("self-hosted:true") > 0 - ) -} From 2e4a1745b602f6f252ceca6914fb8935e0e4dee2 Mon Sep 17 00:00:00 2001 From: Chad Bentz <1760475+felickz@users.noreply.github.com> Date: Tue, 4 Aug 2026 17:19:08 -0400 Subject: [PATCH 0083/2098] Java: model R2DBC SQL injection sinks Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: fb2a5047-e061-44ba-b6df-198390190733 --- .../2026-08-04-spring-r2dbc-sql-injection.md | 4 ++++ java/ql/lib/ext/io.r2dbc.spi.model.yml | 7 +++++++ .../ext/org.springframework.r2dbc.core.model.yml | 12 ++++++++++++ .../CWE-089/semmle/examples/SpringJdbc.java | 11 +++++++++++ .../CWE-089/semmle/examples/io/r2dbc/spi/Batch.java | 5 +++++ .../semmle/examples/io/r2dbc/spi/Connection.java | 5 +++++ .../semmle/examples/io/r2dbc/spi/Statement.java | 4 ++++ .../springframework/r2dbc/core/DatabaseClient.java | 13 +++++++++++++ 8 files changed, 61 insertions(+) create mode 100644 java/ql/lib/change-notes/2026-08-04-spring-r2dbc-sql-injection.md create mode 100644 java/ql/lib/ext/io.r2dbc.spi.model.yml create mode 100644 java/ql/lib/ext/org.springframework.r2dbc.core.model.yml create mode 100644 java/ql/test/query-tests/security/CWE-089/semmle/examples/io/r2dbc/spi/Batch.java create mode 100644 java/ql/test/query-tests/security/CWE-089/semmle/examples/io/r2dbc/spi/Connection.java create mode 100644 java/ql/test/query-tests/security/CWE-089/semmle/examples/io/r2dbc/spi/Statement.java create mode 100644 java/ql/test/query-tests/security/CWE-089/semmle/examples/org/springframework/r2dbc/core/DatabaseClient.java diff --git a/java/ql/lib/change-notes/2026-08-04-spring-r2dbc-sql-injection.md b/java/ql/lib/change-notes/2026-08-04-spring-r2dbc-sql-injection.md new file mode 100644 index 000000000000..a8d4de85e4cb --- /dev/null +++ b/java/ql/lib/change-notes/2026-08-04-spring-r2dbc-sql-injection.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added SQL injection sink models for Spring R2DBC `DatabaseClient` and the R2DBC SPI. diff --git a/java/ql/lib/ext/io.r2dbc.spi.model.yml b/java/ql/lib/ext/io.r2dbc.spi.model.yml new file mode 100644 index 000000000000..9515bee9fe57 --- /dev/null +++ b/java/ql/lib/ext/io.r2dbc.spi.model.yml @@ -0,0 +1,7 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: sinkModel + data: + - ["io.r2dbc.spi", "Connection", True, "createStatement", "(String)", "", "Argument[0]", "sql-injection", "manual"] + - ["io.r2dbc.spi", "Batch", True, "add", "(String)", "", "Argument[0]", "sql-injection", "manual"] diff --git a/java/ql/lib/ext/org.springframework.r2dbc.core.model.yml b/java/ql/lib/ext/org.springframework.r2dbc.core.model.yml new file mode 100644 index 000000000000..5b186d3efe5b --- /dev/null +++ b/java/ql/lib/ext/org.springframework.r2dbc.core.model.yml @@ -0,0 +1,12 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: sinkModel + data: + - ["org.springframework.r2dbc.core", "DatabaseClient", True, "sql", "(String)", "", "Argument[0]", "sql-injection", "manual"] + - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "fetch", "", "", "Argument[this]", "sql-injection", "manual"] + - addsTo: + pack: codeql/java-all + extensible: summaryModel + data: + - ["org.springframework.r2dbc.core", "DatabaseClient", True, "sql", "(java.util.function.Supplier)", "", "Argument[0].ReturnValue", "ReturnValue", "taint", "manual"] diff --git a/java/ql/test/query-tests/security/CWE-089/semmle/examples/SpringJdbc.java b/java/ql/test/query-tests/security/CWE-089/semmle/examples/SpringJdbc.java index 2772ce95536a..627469caefb5 100644 --- a/java/ql/test/query-tests/security/CWE-089/semmle/examples/SpringJdbc.java +++ b/java/ql/test/query-tests/security/CWE-089/semmle/examples/SpringJdbc.java @@ -1,5 +1,8 @@ import java.sql.ResultSet; import java.util.Map; +import java.util.function.Supplier; +import io.r2dbc.spi.Batch; +import io.r2dbc.spi.Connection; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; import org.springframework.jdbc.core.namedparam.SqlParameterSource; @@ -13,6 +16,7 @@ import org.springframework.jdbc.object.SqlFunction; import org.springframework.jdbc.object.SqlUpdate; import org.springframework.jdbc.object.UpdatableSqlQuery; +import org.springframework.r2dbc.core.DatabaseClient; public class SpringJdbc { @@ -80,4 +84,11 @@ public static void test(JdbcTemplate template, NamedParameterJdbcOperations name namedParamTemplate.update(source(), null, null, null); // $ sqlInjection } + public static void testR2dbc(DatabaseClient client, Connection connection, Batch batch) { + client.sql(source()); // $ sqlInjection + client.sql((Supplier) SpringJdbc::source).fetch(); // $ sqlInjection + connection.createStatement(source()); // $ sqlInjection + batch.add(source()); // $ sqlInjection + } + } \ No newline at end of file diff --git a/java/ql/test/query-tests/security/CWE-089/semmle/examples/io/r2dbc/spi/Batch.java b/java/ql/test/query-tests/security/CWE-089/semmle/examples/io/r2dbc/spi/Batch.java new file mode 100644 index 000000000000..dda062e2362f --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-089/semmle/examples/io/r2dbc/spi/Batch.java @@ -0,0 +1,5 @@ +package io.r2dbc.spi; + +public interface Batch { + Batch add(String sql); +} diff --git a/java/ql/test/query-tests/security/CWE-089/semmle/examples/io/r2dbc/spi/Connection.java b/java/ql/test/query-tests/security/CWE-089/semmle/examples/io/r2dbc/spi/Connection.java new file mode 100644 index 000000000000..76a2c0076236 --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-089/semmle/examples/io/r2dbc/spi/Connection.java @@ -0,0 +1,5 @@ +package io.r2dbc.spi; + +public interface Connection { + Statement createStatement(String sql); +} diff --git a/java/ql/test/query-tests/security/CWE-089/semmle/examples/io/r2dbc/spi/Statement.java b/java/ql/test/query-tests/security/CWE-089/semmle/examples/io/r2dbc/spi/Statement.java new file mode 100644 index 000000000000..6080305243b7 --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-089/semmle/examples/io/r2dbc/spi/Statement.java @@ -0,0 +1,4 @@ +package io.r2dbc.spi; + +public interface Statement { +} diff --git a/java/ql/test/query-tests/security/CWE-089/semmle/examples/org/springframework/r2dbc/core/DatabaseClient.java b/java/ql/test/query-tests/security/CWE-089/semmle/examples/org/springframework/r2dbc/core/DatabaseClient.java new file mode 100644 index 000000000000..a2c5f3ea781e --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-089/semmle/examples/org/springframework/r2dbc/core/DatabaseClient.java @@ -0,0 +1,13 @@ +package org.springframework.r2dbc.core; + +import java.util.function.Supplier; + +public interface DatabaseClient { + GenericExecuteSpec sql(String sql); + + GenericExecuteSpec sql(Supplier sqlSupplier); + + interface GenericExecuteSpec { + Object fetch(); + } +} From e079fdf269431eb8fcac4a99192bd166eb099fdc Mon Sep 17 00:00:00 2001 From: Chad Bentz <1760475+felickz@users.noreply.github.com> Date: Tue, 4 Aug 2026 18:34:02 -0400 Subject: [PATCH 0084/2098] Java: cover R2DBC fluent execution paths Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: fb2a5047-e061-44ba-b6df-198390190733 --- .../org.springframework.r2dbc.core.model.yml | 15 ++++++++ .../CWE-089/semmle/examples/SpringJdbc.java | 17 ++++++++++ .../r2dbc/core/DatabaseClient.java | 34 +++++++++++++++++++ .../r2dbc/core/StatementFilterFunction.java | 4 +++ 4 files changed, 70 insertions(+) create mode 100644 java/ql/test/query-tests/security/CWE-089/semmle/examples/org/springframework/r2dbc/core/StatementFilterFunction.java diff --git a/java/ql/lib/ext/org.springframework.r2dbc.core.model.yml b/java/ql/lib/ext/org.springframework.r2dbc.core.model.yml index 5b186d3efe5b..d388e72fdcc9 100644 --- a/java/ql/lib/ext/org.springframework.r2dbc.core.model.yml +++ b/java/ql/lib/ext/org.springframework.r2dbc.core.model.yml @@ -5,8 +5,23 @@ extensions: data: - ["org.springframework.r2dbc.core", "DatabaseClient", True, "sql", "(String)", "", "Argument[0]", "sql-injection", "manual"] - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "fetch", "", "", "Argument[this]", "sql-injection", "manual"] + - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "then", "", "", "Argument[this]", "sql-injection", "manual"] + - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "map", "(java.util.function.Function)", "", "Argument[this]", "sql-injection", "manual"] + - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "map", "(java.util.function.BiFunction)", "", "Argument[this]", "sql-injection", "manual"] + - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "mapValue", "(Class)", "", "Argument[this]", "sql-injection", "manual"] + - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "mapProperties", "(Class)", "", "Argument[this]", "sql-injection", "manual"] + - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "flatMap", "(java.util.function.Function)", "", "Argument[this]", "sql-injection", "manual"] - addsTo: pack: codeql/java-all extensible: summaryModel data: - ["org.springframework.r2dbc.core", "DatabaseClient", True, "sql", "(java.util.function.Supplier)", "", "Argument[0].ReturnValue", "ReturnValue", "taint", "manual"] + - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "bind", "(int,Object)", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "bind", "(String,Object)", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "bindNull", "(int,Class)", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "bindNull", "(String,Class)", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "bindValues", "(List)", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "bindValues", "(Map)", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "bindProperties", "(Object)", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "filter", "(java.util.function.Function)", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "filter", "(org.springframework.r2dbc.core.StatementFilterFunction)", "", "Argument[this]", "ReturnValue", "taint", "manual"] diff --git a/java/ql/test/query-tests/security/CWE-089/semmle/examples/SpringJdbc.java b/java/ql/test/query-tests/security/CWE-089/semmle/examples/SpringJdbc.java index 627469caefb5..5646c9da3ef1 100644 --- a/java/ql/test/query-tests/security/CWE-089/semmle/examples/SpringJdbc.java +++ b/java/ql/test/query-tests/security/CWE-089/semmle/examples/SpringJdbc.java @@ -87,6 +87,23 @@ public static void test(JdbcTemplate template, NamedParameterJdbcOperations name public static void testR2dbc(DatabaseClient client, Connection connection, Batch batch) { client.sql(source()); // $ sqlInjection client.sql((Supplier) SpringJdbc::source).fetch(); // $ sqlInjection + client.sql((Supplier) SpringJdbc::source).then(); // $ sqlInjection + client.sql((Supplier) SpringJdbc::source).map(row -> row); // $ sqlInjection + client.sql((Supplier) SpringJdbc::source).map((row, metadata) -> row); // $ sqlInjection + client.sql((Supplier) SpringJdbc::source).flatMap(row -> row); // $ sqlInjection + client.sql((Supplier) SpringJdbc::source).mapValue(String.class); // $ sqlInjection + client.sql((Supplier) SpringJdbc::source).mapProperties(String.class); // $ sqlInjection + client.sql((Supplier) SpringJdbc::source) + .bind(0, "value") + .bind("name", "value") + .bindNull(0, String.class) + .bindNull("name", String.class) + .bindValues(java.util.List.of("value")) + .bindValues(java.util.Map.of("name", "value")) + .bindProperties(new Object()) + .filter(statement -> statement) + .filter((org.springframework.r2dbc.core.StatementFilterFunction) null) // $ sqlInjection + .fetch(); connection.createStatement(source()); // $ sqlInjection batch.add(source()); // $ sqlInjection } diff --git a/java/ql/test/query-tests/security/CWE-089/semmle/examples/org/springframework/r2dbc/core/DatabaseClient.java b/java/ql/test/query-tests/security/CWE-089/semmle/examples/org/springframework/r2dbc/core/DatabaseClient.java index a2c5f3ea781e..f36da8510dc5 100644 --- a/java/ql/test/query-tests/security/CWE-089/semmle/examples/org/springframework/r2dbc/core/DatabaseClient.java +++ b/java/ql/test/query-tests/security/CWE-089/semmle/examples/org/springframework/r2dbc/core/DatabaseClient.java @@ -1,5 +1,9 @@ package org.springframework.r2dbc.core; +import java.util.List; +import java.util.Map; +import java.util.function.BiFunction; +import java.util.function.Function; import java.util.function.Supplier; public interface DatabaseClient { @@ -8,6 +12,36 @@ public interface DatabaseClient { GenericExecuteSpec sql(Supplier sqlSupplier); interface GenericExecuteSpec { + GenericExecuteSpec bind(int index, Object value); + + GenericExecuteSpec bind(String name, Object value); + + GenericExecuteSpec bindNull(int index, Class type); + + GenericExecuteSpec bindNull(String name, Class type); + + GenericExecuteSpec bindValues(List values); + + GenericExecuteSpec bindValues(Map values); + + GenericExecuteSpec bindProperties(Object source); + + GenericExecuteSpec filter(Function filterFunction); + + GenericExecuteSpec filter(StatementFilterFunction filterFunction); + Object fetch(); + + Object then(); + + Object map(Function mappingFunction); + + Object map(BiFunction mappingFunction); + + Object mapValue(Class mappedClass); + + Object mapProperties(Class mappedClass); + + Object flatMap(Function mappingFunction); } } diff --git a/java/ql/test/query-tests/security/CWE-089/semmle/examples/org/springframework/r2dbc/core/StatementFilterFunction.java b/java/ql/test/query-tests/security/CWE-089/semmle/examples/org/springframework/r2dbc/core/StatementFilterFunction.java new file mode 100644 index 000000000000..871c6dae9670 --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-089/semmle/examples/org/springframework/r2dbc/core/StatementFilterFunction.java @@ -0,0 +1,4 @@ +package org.springframework.r2dbc.core; + +public interface StatementFilterFunction { +} From 90b78c980a7ccf1caf0bfa120b1de3d053ea0d3c Mon Sep 17 00:00:00 2001 From: Chad Bentz <1760475+felickz@users.noreply.github.com> Date: Tue, 4 Aug 2026 18:45:52 -0400 Subject: [PATCH 0085/2098] Java: add R2DBC SPI SQL injection sinks Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: fb2a5047-e061-44ba-b6df-198390190733 --- java/ql/lib/ext/io.r2dbc.spi.model.yml | 4 ++++ .../security/CWE-089/semmle/examples/SpringJdbc.java | 5 +++++ .../CWE-089/semmle/examples/io/r2dbc/spi/Connection.java | 6 ++++++ .../CWE-089/semmle/examples/io/r2dbc/spi/Statement.java | 1 + 4 files changed, 16 insertions(+) diff --git a/java/ql/lib/ext/io.r2dbc.spi.model.yml b/java/ql/lib/ext/io.r2dbc.spi.model.yml index 9515bee9fe57..7edfcdc36643 100644 --- a/java/ql/lib/ext/io.r2dbc.spi.model.yml +++ b/java/ql/lib/ext/io.r2dbc.spi.model.yml @@ -5,3 +5,7 @@ extensions: data: - ["io.r2dbc.spi", "Connection", True, "createStatement", "(String)", "", "Argument[0]", "sql-injection", "manual"] - ["io.r2dbc.spi", "Batch", True, "add", "(String)", "", "Argument[0]", "sql-injection", "manual"] + - ["io.r2dbc.spi", "Connection", True, "createSavepoint", "(String)", "", "Argument[0]", "sql-injection", "manual"] + - ["io.r2dbc.spi", "Connection", True, "releaseSavepoint", "(String)", "", "Argument[0]", "sql-injection", "manual"] + - ["io.r2dbc.spi", "Connection", True, "rollbackTransactionToSavepoint", "(String)", "", "Argument[0]", "sql-injection", "manual"] + - ["io.r2dbc.spi", "Statement", True, "returnGeneratedValues", "(String[])", "", "Argument[0]", "sql-injection", "manual"] diff --git a/java/ql/test/query-tests/security/CWE-089/semmle/examples/SpringJdbc.java b/java/ql/test/query-tests/security/CWE-089/semmle/examples/SpringJdbc.java index 5646c9da3ef1..656e9c69abf4 100644 --- a/java/ql/test/query-tests/security/CWE-089/semmle/examples/SpringJdbc.java +++ b/java/ql/test/query-tests/security/CWE-089/semmle/examples/SpringJdbc.java @@ -106,6 +106,11 @@ public static void testR2dbc(DatabaseClient client, Connection connection, Batch .fetch(); connection.createStatement(source()); // $ sqlInjection batch.add(source()); // $ sqlInjection + connection.createSavepoint(source()); // $ sqlInjection + connection.releaseSavepoint(source()); // $ sqlInjection + connection.rollbackTransactionToSavepoint(source()); // $ sqlInjection + connection.createStatement("INSERT INTO test VALUES (1)") + .returnGeneratedValues(source()); // $ sqlInjection } } \ No newline at end of file diff --git a/java/ql/test/query-tests/security/CWE-089/semmle/examples/io/r2dbc/spi/Connection.java b/java/ql/test/query-tests/security/CWE-089/semmle/examples/io/r2dbc/spi/Connection.java index 76a2c0076236..0269be9693c5 100644 --- a/java/ql/test/query-tests/security/CWE-089/semmle/examples/io/r2dbc/spi/Connection.java +++ b/java/ql/test/query-tests/security/CWE-089/semmle/examples/io/r2dbc/spi/Connection.java @@ -2,4 +2,10 @@ public interface Connection { Statement createStatement(String sql); + + void createSavepoint(String name); + + void releaseSavepoint(String name); + + void rollbackTransactionToSavepoint(String name); } diff --git a/java/ql/test/query-tests/security/CWE-089/semmle/examples/io/r2dbc/spi/Statement.java b/java/ql/test/query-tests/security/CWE-089/semmle/examples/io/r2dbc/spi/Statement.java index 6080305243b7..216629d0dad3 100644 --- a/java/ql/test/query-tests/security/CWE-089/semmle/examples/io/r2dbc/spi/Statement.java +++ b/java/ql/test/query-tests/security/CWE-089/semmle/examples/io/r2dbc/spi/Statement.java @@ -1,4 +1,5 @@ package io.r2dbc.spi; public interface Statement { + Statement returnGeneratedValues(String... columns); } From 50555f4c4379aa0b4dca5137b7edd66724a51e07 Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 5 Aug 2026 09:56:39 +0200 Subject: [PATCH 0086/2098] JS: Update supported TypeScript language version Even though we're not using the new Go-based TypeScript compiler under the hood, we can still handle TypeScript 7.0 codebases, so bumping to that version. --- docs/codeql/reusables/supported-versions-compilers.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/codeql/reusables/supported-versions-compilers.rst b/docs/codeql/reusables/supported-versions-compilers.rst index 69def9ffeb19..881b8aef448a 100644 --- a/docs/codeql/reusables/supported-versions-compilers.rst +++ b/docs/codeql/reusables/supported-versions-compilers.rst @@ -27,7 +27,7 @@ Ruby [10]_,"up to 3.3",Not applicable,"``.rb``, ``.erb``, ``.gemspec``, ``Gemfile``" Rust [11]_,"Rust editions 2021 and 2024","Rust compiler","``.rs``, ``Cargo.toml``" Swift [12]_ [13]_,"Swift 5.4-6.3","Swift compiler","``.swift``" - TypeScript [14]_,"2.6-5.9",Standard TypeScript compiler,"``.ts``, ``.tsx``, ``.mts``, ``.cts``" + TypeScript [14]_,"2.6-7.0",Standard TypeScript compiler,"``.ts``, ``.tsx``, ``.mts``, ``.cts``" .. container:: footnote-group From ab2d6f762ecf26de1b556eb5d836f51a4c2063bc Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Wed, 5 Aug 2026 10:44:30 +0200 Subject: [PATCH 0087/2098] Ruby: Exclude vendored library parameters from taint sources. --- ruby/ql/lib/codeql/ruby/frameworks/core/Gem.qll | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ruby/ql/lib/codeql/ruby/frameworks/core/Gem.qll b/ruby/ql/lib/codeql/ruby/frameworks/core/Gem.qll index f0e5725eef0d..5a7c65f3d88f 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/core/Gem.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/core/Gem.qll @@ -90,6 +90,9 @@ module Gem { result = this.getAPublicModule().getStmt(_).(SingletonClass) } + /** Holds if this gem is vendored in this codebase. */ + predicate isVendored() { File.super.getParentContainer+().getBaseName() = "vendor" } + /** Gets a parameter from an exported method, which is an input to this gem. */ DataFlow::ParameterNode getAnInputParameter() { exists(MethodBase method | @@ -107,6 +110,7 @@ module Gem { DataFlow::ParameterNode getALibraryInput() { exists(GemSpec spec | exists(spec.getName()) and // we only consider `.gemspec` files that have a name + not spec.isVendored() and // if the gem is vendored its parameters are not external inputs result = spec.getAnInputParameter() ) } From 1430dfe4b91ca386063049bd292040a784d3b357 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Wed, 5 Aug 2026 10:58:26 +0200 Subject: [PATCH 0088/2098] Ruby: Add change note. --- ruby/ql/lib/change-notes/2026-08-05-vendored-lib-taint.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 ruby/ql/lib/change-notes/2026-08-05-vendored-lib-taint.md diff --git a/ruby/ql/lib/change-notes/2026-08-05-vendored-lib-taint.md b/ruby/ql/lib/change-notes/2026-08-05-vendored-lib-taint.md new file mode 100644 index 000000000000..e5eab2447c30 --- /dev/null +++ b/ruby/ql/lib/change-notes/2026-08-05-vendored-lib-taint.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Removed library input to vendored gems from the set of taint sources. This should reduce false positives for `rb/polynomial-redos`, `rb/regex/badly-anchored-regexp`, `rb/unsafe-code-construction`, `rb/html-constructed-from-input`, and `rb/shell-command-constructed-from-input` whenever vendoring is used. From 6bfc70500d527038f35ff96fb7c0bdba96d3f06a Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Wed, 5 Aug 2026 11:31:31 +0200 Subject: [PATCH 0089/2098] Python: Update doc to refect that we support Python 3.14 --- docs/codeql/reusables/supported-versions-compilers.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/codeql/reusables/supported-versions-compilers.rst b/docs/codeql/reusables/supported-versions-compilers.rst index 881b8aef448a..15b21cc94b04 100644 --- a/docs/codeql/reusables/supported-versions-compilers.rst +++ b/docs/codeql/reusables/supported-versions-compilers.rst @@ -23,7 +23,7 @@ Eclipse compiler for Java (ECJ) [7]_",``.java`` Kotlin,"Kotlin 1.8.0 to 2.4.1\ *x*","kotlinc",``.kt`` JavaScript,ECMAScript 2022 or lower,Not applicable,"``.js``, ``.jsx``, ``.mjs``, ``.es``, ``.es6``, ``.htm``, ``.html``, ``.xhtm``, ``.xhtml``, ``.vue``, ``.hbs``, ``.ejs``, ``.njk``, ``.json``, ``.yaml``, ``.yml``, ``.raml``, ``.xml`` [8]_" - Python [9]_,"2.7, 3.5, 3.6, 3.7, 3.8, 3.9, 3.10, 3.11, 3.12, 3.13",Not applicable,``.py`` + Python [9]_,"2.7, 3.5, 3.6, 3.7, 3.8, 3.9, 3.10, 3.11, 3.12, 3.13, 3.14",Not applicable,``.py`` Ruby [10]_,"up to 3.3",Not applicable,"``.rb``, ``.erb``, ``.gemspec``, ``Gemfile``" Rust [11]_,"Rust editions 2021 and 2024","Rust compiler","``.rs``, ``Cargo.toml``" Swift [12]_ [13]_,"Swift 5.4-6.3","Swift compiler","``.swift``" From 69e4a8fe646b3fd451e30af8e694246e7afadce2 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 30 Jul 2026 12:40:52 +0200 Subject: [PATCH 0090/2098] Ruby: Fix ExprReturnNode to handle Rescue, Ensure, and Else. --- .../dataflow/internal/DataFlowPrivate.qll | 28 ++++++++++++------- .../implicit-return/implicit-return.expected | 20 +++++++++++++ .../implicit-return/implicit_return.rb | 10 +++---- 3 files changed, 43 insertions(+), 15 deletions(-) diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll index 9f3042ebb5b7..466b08922819 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll @@ -1643,16 +1643,24 @@ private module ReturnNodes { } } - pragma[noinline] - private AstNode implicitReturn(Callable c, ExprNode n) { - exists(CfgNodes::ExprCfgNode en | - en = n.getExprNode() and - en.getASuccessor().(CfgNodes::AnnotatedExitNode).isNormal() and - n.(NodeImpl).getCfgScope() = c and - result = en.getExpr() - ) + private AstNode desugar(AstNode n) { + result = n.getDesugared() + or + not exists(n.getDesugared()) and + result = n + } + + private Expr getLast(StmtSequence s) { + result = getLast(s.(BodyStmt).getElse()) or - result = implicitReturn(c, n).getParent() + result = getLast(s.(BodyStmt).getARescue().getBody()) + or + not exists(s.(BodyStmt).getElse()) and + exists(Stmt last | last = s.getLastStmt() | + result = getLast(last) + or + result = last and not last instanceof StmtSequence + ) } /** @@ -1661,7 +1669,7 @@ private module ReturnNodes { * last thing that is evaluated in the body of the callable. */ class ExprReturnNode extends SourceReturnNode, ExprNode { - ExprReturnNode() { exists(Callable c | implicitReturn(c, this) = c.getBody().getAStmt()) } + ExprReturnNode() { this.getExprNode().getExpr() = desugar(getLast(any(Callable c).getBody())) } override ReturnKind getKindSource() { exists(CfgScope scope | scope = this.(NodeImpl).getCfgScope() | diff --git a/ruby/ql/test/library-tests/dataflow/implicit-return/implicit-return.expected b/ruby/ql/test/library-tests/dataflow/implicit-return/implicit-return.expected index 979cc77777b7..631423bedd17 100644 --- a/ruby/ql/test/library-tests/dataflow/implicit-return/implicit-return.expected +++ b/ruby/ql/test/library-tests/dataflow/implicit-return/implicit-return.expected @@ -1,10 +1,30 @@ models edges | implicit_return.rb:12:3:12:11 | call to source | implicit_return.rb:15:6:15:11 | call to m_body | provenance | | +| implicit_return.rb:19:3:19:11 | call to source | implicit_return.rb:24:6:24:18 | call to m_body_ensure | provenance | | +| implicit_return.rb:30:3:30:11 | call to source | implicit_return.rb:33:6:33:13 | call to m_rescue | provenance | | +| implicit_return.rb:39:3:39:11 | call to source | implicit_return.rb:44:6:44:20 | call to m_rescue_ensure | provenance | | +| implicit_return.rb:52:3:52:11 | call to source | implicit_return.rb:55:6:55:11 | call to m_else | provenance | | +| implicit_return.rb:63:3:63:11 | call to source | implicit_return.rb:68:6:68:18 | call to m_else_ensure | provenance | | nodes | implicit_return.rb:12:3:12:11 | call to source | semmle.label | call to source | | implicit_return.rb:15:6:15:11 | call to m_body | semmle.label | call to m_body | +| implicit_return.rb:19:3:19:11 | call to source | semmle.label | call to source | +| implicit_return.rb:24:6:24:18 | call to m_body_ensure | semmle.label | call to m_body_ensure | +| implicit_return.rb:30:3:30:11 | call to source | semmle.label | call to source | +| implicit_return.rb:33:6:33:13 | call to m_rescue | semmle.label | call to m_rescue | +| implicit_return.rb:39:3:39:11 | call to source | semmle.label | call to source | +| implicit_return.rb:44:6:44:20 | call to m_rescue_ensure | semmle.label | call to m_rescue_ensure | +| implicit_return.rb:52:3:52:11 | call to source | semmle.label | call to source | +| implicit_return.rb:55:6:55:11 | call to m_else | semmle.label | call to m_else | +| implicit_return.rb:63:3:63:11 | call to source | semmle.label | call to source | +| implicit_return.rb:68:6:68:18 | call to m_else_ensure | semmle.label | call to m_else_ensure | subpaths testFailures #select | implicit_return.rb:15:6:15:11 | call to m_body | implicit_return.rb:12:3:12:11 | call to source | implicit_return.rb:15:6:15:11 | call to m_body | $@ | implicit_return.rb:12:3:12:11 | call to source | call to source | +| implicit_return.rb:24:6:24:18 | call to m_body_ensure | implicit_return.rb:19:3:19:11 | call to source | implicit_return.rb:24:6:24:18 | call to m_body_ensure | $@ | implicit_return.rb:19:3:19:11 | call to source | call to source | +| implicit_return.rb:33:6:33:13 | call to m_rescue | implicit_return.rb:30:3:30:11 | call to source | implicit_return.rb:33:6:33:13 | call to m_rescue | $@ | implicit_return.rb:30:3:30:11 | call to source | call to source | +| implicit_return.rb:44:6:44:20 | call to m_rescue_ensure | implicit_return.rb:39:3:39:11 | call to source | implicit_return.rb:44:6:44:20 | call to m_rescue_ensure | $@ | implicit_return.rb:39:3:39:11 | call to source | call to source | +| implicit_return.rb:55:6:55:11 | call to m_else | implicit_return.rb:52:3:52:11 | call to source | implicit_return.rb:55:6:55:11 | call to m_else | $@ | implicit_return.rb:52:3:52:11 | call to source | call to source | +| implicit_return.rb:68:6:68:18 | call to m_else_ensure | implicit_return.rb:63:3:63:11 | call to source | implicit_return.rb:68:6:68:18 | call to m_else_ensure | $@ | implicit_return.rb:63:3:63:11 | call to source | call to source | diff --git a/ruby/ql/test/library-tests/dataflow/implicit-return/implicit_return.rb b/ruby/ql/test/library-tests/dataflow/implicit-return/implicit_return.rb index 2ea215902f02..3ff507723ff1 100644 --- a/ruby/ql/test/library-tests/dataflow/implicit-return/implicit_return.rb +++ b/ruby/ql/test/library-tests/dataflow/implicit-return/implicit_return.rb @@ -21,7 +21,7 @@ def m_body_ensure source(20) end -sink(m_body_ensure) # $ MISSING: hasValueFlow=2 +sink(m_body_ensure) # $ hasValueFlow=2 # Implicit return from a `rescue` clause. def m_rescue @@ -30,7 +30,7 @@ def m_rescue source(3) end -sink(m_rescue) # $ MISSING: hasValueFlow=3 +sink(m_rescue) # $ hasValueFlow=3 # Implicit return from a `rescue` clause when an `ensure` clause is present. def m_rescue_ensure @@ -41,7 +41,7 @@ def m_rescue_ensure source(40) end -sink(m_rescue_ensure) # $ MISSING: hasValueFlow=4 +sink(m_rescue_ensure) # $ hasValueFlow=4 # Implicit return from an `else` clause. def m_else @@ -52,7 +52,7 @@ def m_else source(5) end -sink(m_else) # $ MISSING: hasValueFlow=5 +sink(m_else) # $ hasValueFlow=5 # Implicit return from an `else` clause when an `ensure` clause is present. def m_else_ensure @@ -65,4 +65,4 @@ def m_else_ensure nil end -sink(m_else_ensure) # $ MISSING: hasValueFlow=6 +sink(m_else_ensure) # $ hasValueFlow=6 From cea1106a50759fb2576842e723805b5b4956fe27 Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 5 Aug 2026 11:45:33 +0200 Subject: [PATCH 0091/2098] unified: Fix extraction of type parameter bounds and constraints --- .../extractor/src/languages/swift/swift.rs | 50 ++++++++++ ...ic-class-parameters-and-constraints.output | 94 +++++++++++++++++++ ...ric-class-parameters-and-constraints.swift | 2 + 3 files changed, 146 insertions(+) create mode 100644 unified/extractor/tests/corpus/swift/types/generic-class-parameters-and-constraints.output create mode 100644 unified/extractor/tests/corpus/swift/types/generic-class-parameters-and-constraints.swift diff --git a/unified/extractor/src/languages/swift/swift.rs b/unified/extractor/src/languages/swift/swift.rs index 000601b7215c..407f36bea2ba 100644 --- a/unified/extractor/src/languages/swift/swift.rs +++ b/unified/extractor/src/languages/swift/swift.rs @@ -1065,19 +1065,51 @@ fn translation_rules() -> Vec> { // A nominal type's `inheritanceClause` (`: Base, Proto`) becomes a list // of `base_type`s, one per inherited type. Each declaration keyword // gets its own rule; the bodies are identical but for the keyword. + rule!( + (genericParameter + attributes: _* @attrs + specifier: _? @@spec + name: @@name + inheritedType: _? @bound) + => + (type_parameter + modifier: {attrs} + modifier: (modifier #{spec})? + name: (identifier #{name}) + bound: {bound}) + ), + rule!( + (genericRequirement + requirement: (conformanceRequirement leftType: @ty rightType: @bound)) + => + (bound_type_constraint type: {ty} bound: {bound}) + ), + rule!( + (genericRequirement + requirement: (sameTypeRequirement leftType: @left rightType: @right)) + => + (equality_type_constraint left: {left} right: {right}) + ), // Class declaration with body containing members rule!( (classDecl classKeyword: @kind modifiers: _* @mods name: @name + genericParameterClause: (genericParameterClause + parameters: _* @params + genericWhereClause: (genericWhereClause requirements: _* @parameter_constraints)?)? inheritanceClause: (inheritanceClause inheritedTypes: (inheritedType type: @bases)*)? + genericWhereClause: (genericWhereClause requirements: _* @declaration_constraints)? memberBlock: (memberBlock members: _* @members)) => (class_like_declaration modifier: (modifier #{kind}) modifier: {mods} name: (identifier #{name}) + type_parameter: {params} + type_constraint: {parameter_constraints} + type_constraint: {declaration_constraints} base_type: {bases.into_iter().map(|ty| tree!((base_type type: {ty})))} member: {members}) ), @@ -1087,13 +1119,20 @@ fn translation_rules() -> Vec> { enumKeyword: @kind modifiers: _* @mods name: @name + genericParameterClause: (genericParameterClause + parameters: _* @params + genericWhereClause: (genericWhereClause requirements: _* @parameter_constraints)?)? inheritanceClause: (inheritanceClause inheritedTypes: (inheritedType type: @bases)*)? + genericWhereClause: (genericWhereClause requirements: _* @declaration_constraints)? memberBlock: (memberBlock members: _* @members)) => (class_like_declaration modifier: (modifier #{kind}) modifier: {mods} name: (identifier #{name}) + type_parameter: {params} + type_constraint: {parameter_constraints} + type_constraint: {declaration_constraints} base_type: {bases.into_iter().map(|ty| tree!((base_type type: {ty})))} member: {members}) ), @@ -1103,13 +1142,20 @@ fn translation_rules() -> Vec> { structKeyword: @kind modifiers: _* @mods name: @name + genericParameterClause: (genericParameterClause + parameters: _* @params + genericWhereClause: (genericWhereClause requirements: _* @parameter_constraints)?)? inheritanceClause: (inheritanceClause inheritedTypes: (inheritedType type: @bases)*)? + genericWhereClause: (genericWhereClause requirements: _* @declaration_constraints)? memberBlock: (memberBlock members: _* @members)) => (class_like_declaration modifier: (modifier #{kind}) modifier: {mods} name: (identifier #{name}) + type_parameter: {params} + type_constraint: {parameter_constraints} + type_constraint: {declaration_constraints} base_type: {bases.into_iter().map(|ty| tree!((base_type type: {ty})))} member: {members}) ), @@ -1119,13 +1165,17 @@ fn translation_rules() -> Vec> { protocolKeyword: @kind modifiers: _* @mods name: @name + genericParameterClause: (genericParameterClause parameters: _* @params)? inheritanceClause: (inheritanceClause inheritedTypes: (inheritedType type: @bases)*)? + genericWhereClause: (genericWhereClause requirements: _* @declaration_constraints)? memberBlock: (memberBlock members: _* @members)) => (class_like_declaration modifier: (modifier #{kind}) modifier: {mods} name: (identifier #{name}) + type_parameter: {params} + type_constraint: {declaration_constraints} base_type: {bases.into_iter().map(|ty| tree!((base_type type: {ty})))} member: {members}) ), diff --git a/unified/extractor/tests/corpus/swift/types/generic-class-parameters-and-constraints.output b/unified/extractor/tests/corpus/swift/types/generic-class-parameters-and-constraints.output new file mode 100644 index 000000000000..26b17599ae00 --- /dev/null +++ b/unified/extractor/tests/corpus/swift/types/generic-class-parameters-and-constraints.output @@ -0,0 +1,94 @@ +class Box where U: Equatable, U == T { +} + +--- + +sourceFile + endOfFileToken: endOfFile + statements: + codeBlockItem + item: + classDecl + attributes: + name: identifier "Box" + genericParameterClause: + genericParameterClause + parameters: + genericParameter + colon: : + attributes: + name: identifier "T" + trailingComma: , + inheritedType: + identifierType + name: identifier "Equatable" + genericParameter + attributes: + name: identifier "U" + leftAngle: < + rightAngle: > + genericWhereClause: + genericWhereClause + requirements: + genericRequirement + trailingComma: , + requirement: + conformanceRequirement + colon: : + leftType: + identifierType + name: identifier "U" + rightType: + identifierType + name: identifier "Equatable" + genericRequirement + requirement: + sameTypeRequirement + equal: binaryOperator "==" + leftType: + identifierType + name: identifier "U" + rightType: + identifierType + name: identifier "T" + whereKeyword: where + memberBlock: + memberBlock + leftBrace: { + rightBrace: } + members: + modifiers: + classKeyword: class + +--- + +top_level + body: + block + stmt: + class_like_declaration + modifier: modifier "class" + name: identifier "Box" + type_parameter: + type_parameter + name: identifier "T" + bound: + named_type_expr + name: identifier "Equatable" + type_parameter + name: identifier "U" + type_constraint: + bound_type_constraint + type: + named_type_expr + name: identifier "U" + bound: + named_type_expr + name: identifier "Equatable" + equality_type_constraint + left: + named_type_expr + name: identifier "U" + right: + named_type_expr + name: identifier "T" diff --git a/unified/extractor/tests/corpus/swift/types/generic-class-parameters-and-constraints.swift b/unified/extractor/tests/corpus/swift/types/generic-class-parameters-and-constraints.swift new file mode 100644 index 000000000000..80c882308a51 --- /dev/null +++ b/unified/extractor/tests/corpus/swift/types/generic-class-parameters-and-constraints.swift @@ -0,0 +1,2 @@ +class Box where U: Equatable, U == T { +} From e0e3406dcd9b6042c82972d7920e2e4fdf3d1981 Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 5 Aug 2026 11:46:42 +0200 Subject: [PATCH 0092/2098] unified: Support . in name test annotations --- unified/ql/test/library-tests/variables/variables.ql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/ql/test/library-tests/variables/variables.ql b/unified/ql/test/library-tests/variables/variables.ql index cf653afebd9d..26d5913075e7 100644 --- a/unified/ql/test/library-tests/variables/variables.ql +++ b/unified/ql/test/library-tests/variables/variables.ql @@ -13,7 +13,7 @@ predicate plainCommentAt(string filepath, int line, string text) { predicate keyValueCommentAt(string filepath, int line, string key, string value) { exists(string text, string regexp, string match | plainCommentAt(filepath, line, text) and - regexp = "(\\w+)=(\\w+)" and + regexp = "(\\w+)=([\\w.]+)" and match = text.regexpFind(regexp, _, _) and key = match.regexpCapture(regexp, 1) and value = match.regexpCapture(regexp, 2) From eef277aafbc4cdab0aca5d67e1b5fb166e04be77 Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 5 Aug 2026 11:47:00 +0200 Subject: [PATCH 0093/2098] unified: Add more local name binding test cases --- .../library-tests/variables/class_scope.swift | 73 +++++++++++++++++++ .../test/library-tests/variables/test.swift | 2 +- .../library-tests/variables/top_level.swift | 17 +++++ 3 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 unified/ql/test/library-tests/variables/class_scope.swift create mode 100644 unified/ql/test/library-tests/variables/top_level.swift diff --git a/unified/ql/test/library-tests/variables/class_scope.swift b/unified/ql/test/library-tests/variables/class_scope.swift new file mode 100644 index 000000000000..a4a85d23f084 --- /dev/null +++ b/unified/ql/test/library-tests/variables/class_scope.swift @@ -0,0 +1,73 @@ +class A { + static func static_before() { + print(staticVar) // $ access=staticVar + B(); // $ access=A.B + let b: B = nil // $ access=A.B + let c: C = nil // $ access=A.C + } + func instance_before() { + print(instanceVar) // $ access=instanceVar + B(); // $ access=A.B + let b: B = nil // $ access=A.B + let c: C = nil // $ access=A.C + } + + private static let staticVar = 123 + private let instanceVar = 456 + + class B {} // name=A.B + typealias C = B // $ access=A.B // name=A.C + + static func static_after() { + print(staticVar) // $ access=staticVar + B(); // $ access=A.B + let b: B = nil // $ access=A.B + let c: C = nil // $ access=A.C + + } + func instance_after() { + print(instanceVar) // $ access=instanceVar + B(); // $ access=A.B + let b: B = nil // $ access=A.B + let c: C = nil // $ access=A.C + } +} + +class Base {} // name=top.Base + +// Base types and type parameter bounds can't see members in the class body +class C : Base { // $ access=top.Base + class Base {} // name=C.Base +} + +class D { // $ access=top.Base + class Base {} // name=D.Base +} + +class E where T : Base { // $ access=top.Base access=T + class Base {} // name=E.Base +} + +// Base types and type parameter bounds can see type parameters +class F : + D { // $ access=TypeParamF access=D +} + +class G> { // $ access=TypeParamG access=D +} + +class H where + TypeParamH : Base { // $ access=TypeParamH access=top.Base +} + +// Type parameter bounds can see other type parameters, even if declared later +class I< + T1 : D, // $ access=D access=I.T2 + T2> { // name=I.T2 +} + +// Members can see type parameters. +class J { + let x: TypeParamI; // $ access=TypeParamI +} diff --git a/unified/ql/test/library-tests/variables/test.swift b/unified/ql/test/library-tests/variables/test.swift index e4280dc5b408..b5d0469e8a44 100644 --- a/unified/ql/test/library-tests/variables/test.swift +++ b/unified/ql/test/library-tests/variables/test.swift @@ -343,7 +343,7 @@ enum E38 { } // Switch with a multi-pattern case that binds 'x' in each pattern -func t38(value: E38) { +func t38(value: E38) { // $ access=E38 switch value { // $ access=value case .a(let x), // $ access=x1 // name=x1 .b(let x): // $ access=x1 diff --git a/unified/ql/test/library-tests/variables/top_level.swift b/unified/ql/test/library-tests/variables/top_level.swift new file mode 100644 index 000000000000..a7ea16ef10b8 --- /dev/null +++ b/unified/ql/test/library-tests/variables/top_level.swift @@ -0,0 +1,17 @@ +func use_before() { + print(x) // $ access=top.x + B(); // $ access=top.B + let b: B = nil // $ access=top.B + let c: C = nil // $ access=top.C +} + +let x = 123 // name=top.x +class B {} // name=top.B +typealias C = B // $ access=top.B // name=top.C + +func use_after() { + print(x) // $ access=top.x + B(); // $ access=top.B + let b: B = nil // $ access=top.B + let c: C = nil // $ access=top.C +} From 3b51c4ce97d44606ace08c5222d1c26bb6bc42b9 Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 5 Aug 2026 11:59:40 +0200 Subject: [PATCH 0094/2098] unified: add MISSING annotations --- .../library-tests/variables/class_scope.swift | 50 +++++++++---------- .../test/library-tests/variables/test.swift | 2 +- .../library-tests/variables/top_level.swift | 16 +++--- 3 files changed, 34 insertions(+), 34 deletions(-) diff --git a/unified/ql/test/library-tests/variables/class_scope.swift b/unified/ql/test/library-tests/variables/class_scope.swift index a4a85d23f084..275c484fb8ac 100644 --- a/unified/ql/test/library-tests/variables/class_scope.swift +++ b/unified/ql/test/library-tests/variables/class_scope.swift @@ -1,73 +1,73 @@ class A { static func static_before() { - print(staticVar) // $ access=staticVar - B(); // $ access=A.B - let b: B = nil // $ access=A.B - let c: C = nil // $ access=A.C + print(staticVar) // $ MISSING: access=staticVar + B(); // $ MISSING: access=A.B + let b: B = nil // $ MISSING: access=A.B + let c: C = nil // $ MISSING: access=A.C } func instance_before() { - print(instanceVar) // $ access=instanceVar - B(); // $ access=A.B - let b: B = nil // $ access=A.B - let c: C = nil // $ access=A.C + print(instanceVar) // $ MISSING: access=instanceVar + B(); // $ MISSING: access=A.B + let b: B = nil // $ MISSING: access=A.B + let c: C = nil // $ MISSING: access=A.C } private static let staticVar = 123 private let instanceVar = 456 class B {} // name=A.B - typealias C = B // $ access=A.B // name=A.C + typealias C = B // $ MISSING: access=A.B // name=A.C static func static_after() { - print(staticVar) // $ access=staticVar - B(); // $ access=A.B - let b: B = nil // $ access=A.B - let c: C = nil // $ access=A.C + print(staticVar) // $ MISSING: access=staticVar + B(); // $ MISSING: access=A.B + let b: B = nil // $ MISSING: access=A.B + let c: C = nil // $ MISSING: access=A.C } func instance_after() { - print(instanceVar) // $ access=instanceVar - B(); // $ access=A.B - let b: B = nil // $ access=A.B - let c: C = nil // $ access=A.C + print(instanceVar) // $ MISSING: access=instanceVar + B(); // $ MISSING: access=A.B + let b: B = nil // $ MISSING: access=A.B + let c: C = nil // $ MISSING: access=A.C } } class Base {} // name=top.Base // Base types and type parameter bounds can't see members in the class body -class C : Base { // $ access=top.Base +class C : Base { // $ MISSING: access=top.Base class Base {} // name=C.Base } -class D { // $ access=top.Base +class D { // $ MISSING: access=top.Base class Base {} // name=D.Base } -class E where T : Base { // $ access=top.Base access=T +class E where T : Base { // $ MISSING: access=T access=top.Base class Base {} // name=E.Base } // Base types and type parameter bounds can see type parameters class F : - D { // $ access=TypeParamF access=D + D { // $ MISSING: access=D access=TypeParamF } class G> { // $ access=TypeParamG access=D + D> { // $ MISSING: access=D access=TypeParamG } class H where - TypeParamH : Base { // $ access=TypeParamH access=top.Base + TypeParamH : Base { // $ MISSING: access=TypeParamH access=top.Base } // Type parameter bounds can see other type parameters, even if declared later class I< - T1 : D, // $ access=D access=I.T2 + T1 : D, // $ MISSING: access=D access=I.T2 T2> { // name=I.T2 } // Members can see type parameters. class J { - let x: TypeParamI; // $ access=TypeParamI + let x: TypeParamI; // $ MISSING: access=TypeParamI } diff --git a/unified/ql/test/library-tests/variables/test.swift b/unified/ql/test/library-tests/variables/test.swift index b5d0469e8a44..37ba0f5282eb 100644 --- a/unified/ql/test/library-tests/variables/test.swift +++ b/unified/ql/test/library-tests/variables/test.swift @@ -343,7 +343,7 @@ enum E38 { } // Switch with a multi-pattern case that binds 'x' in each pattern -func t38(value: E38) { // $ access=E38 +func t38(value: E38) { // $ MISSING: access=E38 switch value { // $ access=value case .a(let x), // $ access=x1 // name=x1 .b(let x): // $ access=x1 diff --git a/unified/ql/test/library-tests/variables/top_level.swift b/unified/ql/test/library-tests/variables/top_level.swift index a7ea16ef10b8..9489b950d4f3 100644 --- a/unified/ql/test/library-tests/variables/top_level.swift +++ b/unified/ql/test/library-tests/variables/top_level.swift @@ -1,17 +1,17 @@ func use_before() { - print(x) // $ access=top.x - B(); // $ access=top.B - let b: B = nil // $ access=top.B - let c: C = nil // $ access=top.C + print(x) // $ MISSING: access=top.x + B(); // $ MISSING: access=top.B + let b: B = nil // $ MISSING: access=top.B + let c: C = nil // $ MISSING: access=top.C } let x = 123 // name=top.x class B {} // name=top.B -typealias C = B // $ access=top.B // name=top.C +typealias C = B // $ MISSING: access=top.B // name=top.C func use_after() { print(x) // $ access=top.x - B(); // $ access=top.B - let b: B = nil // $ access=top.B - let c: C = nil // $ access=top.C + B(); // $ MISSING: access=top.B + let b: B = nil // $ MISSING: access=top.B + let c: C = nil // $ MISSING: access=top.C } From 7d1b1e47511609656f89903e7d705a37a7c13348 Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 5 Aug 2026 11:47:25 +0200 Subject: [PATCH 0095/2098] unified: Track more kinds of names as local variables --- .../lib/codeql/unified/internal/AstExtra.qll | 5 ++ .../lib/codeql/unified/internal/Variables.qll | 60 ++++++++++++++++--- .../library-tests/variables/class_scope.swift | 50 ++++++++-------- .../test/library-tests/variables/test.swift | 2 +- .../library-tests/variables/top_level.swift | 16 ++--- 5 files changed, 91 insertions(+), 42 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/AstExtra.qll b/unified/ql/lib/codeql/unified/internal/AstExtra.qll index e14043dc46d2..378712b86cb9 100644 --- a/unified/ql/lib/codeql/unified/internal/AstExtra.qll +++ b/unified/ql/lib/codeql/unified/internal/AstExtra.qll @@ -52,4 +52,9 @@ module Public { result = this.getValue().regexpCapture("(?s)/\\*(.*)\\*/", 1) } } + + /** A `Stmt` at the top-level. */ + final class TopLevelStmt extends Stmt { + TopLevelStmt() { this = any(TopLevel t).getBody().getAStmt() } + } } diff --git a/unified/ql/lib/codeql/unified/internal/Variables.qll b/unified/ql/lib/codeql/unified/internal/Variables.qll index 49cad56d05db..7a05ce409e6f 100644 --- a/unified/ql/lib/codeql/unified/internal/Variables.qll +++ b/unified/ql/lib/codeql/unified/internal/Variables.qll @@ -130,6 +130,8 @@ private module LocalNameBindingInput implements LocalNameBindingInputSig { // $ MISSING: access=top.Base +class D { // $ MISSING: access=top.Base SPURIOUS: access=D.Base class Base {} // name=D.Base } -class E where T : Base { // $ MISSING: access=T access=top.Base +class E where T : Base { // $ access=T MISSING: access=top.Base SPURIOUS: access=E.Base class Base {} // name=E.Base } // Base types and type parameter bounds can see type parameters class F : - D { // $ MISSING: access=D access=TypeParamF + D { // $ access=D access=TypeParamF } class G> { // $ MISSING: access=D access=TypeParamG + D> { // $ access=D access=TypeParamG } class H where - TypeParamH : Base { // $ MISSING: access=TypeParamH access=top.Base + TypeParamH : Base { // $ access=TypeParamH access=top.Base } // Type parameter bounds can see other type parameters, even if declared later class I< - T1 : D, // $ MISSING: access=D access=I.T2 + T1 : D, // $ access=D access=I.T2 T2> { // name=I.T2 } // Members can see type parameters. class J { - let x: TypeParamI; // $ MISSING: access=TypeParamI + let x: TypeParamI; // $ access=TypeParamI } diff --git a/unified/ql/test/library-tests/variables/test.swift b/unified/ql/test/library-tests/variables/test.swift index 37ba0f5282eb..b5d0469e8a44 100644 --- a/unified/ql/test/library-tests/variables/test.swift +++ b/unified/ql/test/library-tests/variables/test.swift @@ -343,7 +343,7 @@ enum E38 { } // Switch with a multi-pattern case that binds 'x' in each pattern -func t38(value: E38) { // $ MISSING: access=E38 +func t38(value: E38) { // $ access=E38 switch value { // $ access=value case .a(let x), // $ access=x1 // name=x1 .b(let x): // $ access=x1 diff --git a/unified/ql/test/library-tests/variables/top_level.swift b/unified/ql/test/library-tests/variables/top_level.swift index 9489b950d4f3..a7ea16ef10b8 100644 --- a/unified/ql/test/library-tests/variables/top_level.swift +++ b/unified/ql/test/library-tests/variables/top_level.swift @@ -1,17 +1,17 @@ func use_before() { - print(x) // $ MISSING: access=top.x - B(); // $ MISSING: access=top.B - let b: B = nil // $ MISSING: access=top.B - let c: C = nil // $ MISSING: access=top.C + print(x) // $ access=top.x + B(); // $ access=top.B + let b: B = nil // $ access=top.B + let c: C = nil // $ access=top.C } let x = 123 // name=top.x class B {} // name=top.B -typealias C = B // $ MISSING: access=top.B // name=top.C +typealias C = B // $ access=top.B // name=top.C func use_after() { print(x) // $ access=top.x - B(); // $ MISSING: access=top.B - let b: B = nil // $ MISSING: access=top.B - let c: C = nil // $ MISSING: access=top.C + B(); // $ access=top.B + let b: B = nil // $ access=top.B + let c: C = nil // $ access=top.C } From 5d851e4d7ac2f35979431a50203e07cb6f34a955 Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 5 Aug 2026 11:47:25 +0200 Subject: [PATCH 0096/2098] unified: More precise scoping inside classes --- .../ql/lib/codeql/unified/internal/Variables.qll | 15 +++++++++++++++ .../library-tests/variables/class_scope.swift | 6 +++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/Variables.qll b/unified/ql/lib/codeql/unified/internal/Variables.qll index 7a05ce409e6f..7151b17ad3c3 100644 --- a/unified/ql/lib/codeql/unified/internal/Variables.qll +++ b/unified/ql/lib/codeql/unified/internal/Variables.qll @@ -90,6 +90,20 @@ private module LocalNameBindingInput implements LocalNameBindingInputSig { // $ MISSING: access=top.Base SPURIOUS: access=D.Base +class D { // $ access=top.Base class Base {} // name=D.Base } -class E where T : Base { // $ access=T MISSING: access=top.Base SPURIOUS: access=E.Base +class E where T : Base { // $ access=T access=top.Base class Base {} // name=E.Base } From 3e25c6aaf3e483c3431fdb8e426b31306cf8e565 Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 5 Aug 2026 11:28:10 +0200 Subject: [PATCH 0097/2098] unified: Rename Variables.qll -> LocalNameBinding.qll --- .../unified/internal/{Variables.qll => LocalNameBinding.qll} | 0 unified/ql/lib/unified.qll | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename unified/ql/lib/codeql/unified/internal/{Variables.qll => LocalNameBinding.qll} (100%) diff --git a/unified/ql/lib/codeql/unified/internal/Variables.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll similarity index 100% rename from unified/ql/lib/codeql/unified/internal/Variables.qll rename to unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll diff --git a/unified/ql/lib/unified.qll b/unified/ql/lib/unified.qll index fad4b3ef9e67..67d6ce7558ea 100644 --- a/unified/ql/lib/unified.qll +++ b/unified/ql/lib/unified.qll @@ -6,4 +6,4 @@ import codeql.Locations import codeql.files.FileSystem import codeql.unified.internal.Ast::UnifiedFinal import codeql.unified.internal.AstExtra::Public -import codeql.unified.internal.Variables::Public +import codeql.unified.internal.LocalNameBinding::Public From 6df74d7c3e6c0e2d2420bbda6dcc45ef61d50b93 Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 5 Aug 2026 11:30:12 +0200 Subject: [PATCH 0098/2098] unified: Rename 'variables' test --- .../{variables => local-name-binding}/class_scope.swift | 0 .../variables.expected => local-name-binding/test.expected} | 0 .../{variables/variables.ql => local-name-binding/test.ql} | 0 .../library-tests/{variables => local-name-binding}/test.swift | 0 .../{variables => local-name-binding}/top_level.swift | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename unified/ql/test/library-tests/{variables => local-name-binding}/class_scope.swift (100%) rename unified/ql/test/library-tests/{variables/variables.expected => local-name-binding/test.expected} (100%) rename unified/ql/test/library-tests/{variables/variables.ql => local-name-binding/test.ql} (100%) rename unified/ql/test/library-tests/{variables => local-name-binding}/test.swift (100%) rename unified/ql/test/library-tests/{variables => local-name-binding}/top_level.swift (100%) diff --git a/unified/ql/test/library-tests/variables/class_scope.swift b/unified/ql/test/library-tests/local-name-binding/class_scope.swift similarity index 100% rename from unified/ql/test/library-tests/variables/class_scope.swift rename to unified/ql/test/library-tests/local-name-binding/class_scope.swift diff --git a/unified/ql/test/library-tests/variables/variables.expected b/unified/ql/test/library-tests/local-name-binding/test.expected similarity index 100% rename from unified/ql/test/library-tests/variables/variables.expected rename to unified/ql/test/library-tests/local-name-binding/test.expected diff --git a/unified/ql/test/library-tests/variables/variables.ql b/unified/ql/test/library-tests/local-name-binding/test.ql similarity index 100% rename from unified/ql/test/library-tests/variables/variables.ql rename to unified/ql/test/library-tests/local-name-binding/test.ql diff --git a/unified/ql/test/library-tests/variables/test.swift b/unified/ql/test/library-tests/local-name-binding/test.swift similarity index 100% rename from unified/ql/test/library-tests/variables/test.swift rename to unified/ql/test/library-tests/local-name-binding/test.swift diff --git a/unified/ql/test/library-tests/variables/top_level.swift b/unified/ql/test/library-tests/local-name-binding/top_level.swift similarity index 100% rename from unified/ql/test/library-tests/variables/top_level.swift rename to unified/ql/test/library-tests/local-name-binding/top_level.swift From 686a07d7a5dd47ec5bcdbf2ef562bc236560933e Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 5 Aug 2026 11:24:45 +0200 Subject: [PATCH 0099/2098] unified: Rename 'Variable' API to use LocalName terminology These can also refer to type names and module names, so 'Variable' is not an appropriate term. Actual variables will be introduced at a later stage. --- .../unified/internal/LocalNameBinding.qll | 54 +++++++++++++------ .../library-tests/local-name-binding/test.ql | 13 ++--- 2 files changed, 44 insertions(+), 23 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index 7151b17ad3c3..3f84fe4fcdcb 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -311,26 +311,46 @@ module LocalNameBindingOutput = LocalNameBinding -private Variable getVariableAt(string name, string filepath, int line) { +private LocalName getVariableAt(string name, string filepath, int line) { VariableAccessTest::declAt(result, filepath, line) and result.getName() = name } -query predicate ambiguousVariable(Variable v, string name, string filepath, int line) { +query predicate ambiguousVariable(LocalName v, string name, string filepath, int line) { v = getVariableAt(name, filepath, line) and strictcount(getVariableAt(name, filepath, line)) >= 2 } From a5faaefa53d8142982f8806763531aa882af1938 Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 5 Aug 2026 13:32:34 +0200 Subject: [PATCH 0100/2098] unified: Two refactorings - Use PotentialLocalNameAccess to define accessCand(), not the other way around - Use the Identifier as the definingNode, not wrappers like NameExpr --- .../unified/internal/LocalNameBinding.qll | 57 +++++++++---------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index 3f84fe4fcdcb..8ab88b12352b 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -251,6 +251,11 @@ private module LocalNameBindingInput implements LocalNameBindingInputSig; @@ -329,7 +325,7 @@ module Public { } /** - * An AST node that is a possibly reference to a local name, but could also refer to a member + * An identifier node that is a possibly reference to a local name, but could also refer to a member * visible through imports or inheritance. * * For example, the type annotation `C` below is a potential access to `class C`, but could @@ -341,16 +337,19 @@ module Public { * } * ``` */ -class PotentialLocalNameAccess extends LocalNameBindingOutput::LocalAccess { - LocalName getLocalName() { result = super.getLocal() } - - Identifier getIdentifier() { - result = this.(NameExpr).getIdentifier() +class PotentialLocalNameAccess extends Identifier { + PotentialLocalNameAccess() { + this = any(NameExpr e).getIdentifier() + or + this = any(NamePattern e).getIdentifier() or - result = this.(NamePattern).getIdentifier() + this = any(NamedTypeExpr e | not exists(e.getQualifier())).getName() or - result = this + this = any(FunctionDeclaration f).getName() + // TODO: include other declaration kinds here } - string getName() { result = this.getIdentifier().getValue() } + LocalName getLocalName() { result = this.(LocalNameBindingOutput::LocalAccess).getLocal() } + + string getName() { result = this.getValue() } } From 179ae25ab83948842f9703867f0876d37743c4e0 Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 5 Aug 2026 13:39:29 +0200 Subject: [PATCH 0101/2098] unified: Also include declaration site access --- .../ql/lib/codeql/unified/internal/LocalNameBinding.qll | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index 8ab88b12352b..6fb4f2fa2ab5 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -184,7 +184,7 @@ private module LocalNameBindingInput implements LocalNameBindingInputSig Date: Wed, 5 Aug 2026 14:16:23 +0200 Subject: [PATCH 0102/2098] unified: Replace getDefiningNode() with isDeclarationSite() --- .../ql/lib/codeql/unified/internal/LocalNameBinding.qll | 3 --- unified/ql/test/library-tests/local-name-binding/test.ql | 7 ++++++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index 6fb4f2fa2ab5..5e60e005df39 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -316,9 +316,6 @@ module Public { /** Gets the location of this local name's first declaration */ Location getLocation() { result = super.getLocation() } - /** Gets the AST node defining this local name. */ - AstNode getDefiningNode() { result = super.getDefiningNode() } - /** Gets the name of this local, as a string. */ string getName() { result = super.getName() } } diff --git a/unified/ql/test/library-tests/local-name-binding/test.ql b/unified/ql/test/library-tests/local-name-binding/test.ql index 61fb9520e7df..0fcae36dd31e 100644 --- a/unified/ql/test/library-tests/local-name-binding/test.ql +++ b/unified/ql/test/library-tests/local-name-binding/test.ql @@ -37,10 +37,15 @@ module VariableAccessTest implements TestSig { ) } + private PotentialLocalNameAccess getUniqueDeclarationSite(LocalName name) { + result = + unique(PotentialLocalNameAccess ac | ac.isDeclarationSite() and ac.getLocalName() = name) + } + predicate hasActualResult(Location location, string element, string tag, string value) { exists(PotentialLocalNameAccess va, LocalName v | v = va.getLocalName() and - not va = v.getDefiningNode() and + not va = getUniqueDeclarationSite(v) and // no need to annotate declaration site, if there is only one location = va.getLocation() and element = va.toString() and decl(v, value) and From 012b1ae9d7ce11e4a9b2fcfc591f0235822ec6f4 Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 5 Aug 2026 14:17:16 +0200 Subject: [PATCH 0103/2098] unified: Minor doc comment update --- unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index 5e60e005df39..c978eccff0ac 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -1,5 +1,5 @@ /** - * Provides classes for reasoning about lexically scoped variables and references to these. + * Provides classes for reasoning about lexically scoped names and references to these. */ private import unified From a3a54c358b9048e5ba2cc9b621ea53d98846e2f5 Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 5 Aug 2026 14:29:21 +0200 Subject: [PATCH 0104/2098] unified: fix typo --- unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index c978eccff0ac..8c78a187b766 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -322,7 +322,7 @@ module Public { } /** - * An identifier node that is a possibly reference to a local name, but could also refer to a member + * An identifier node that is possibly a reference to a local name, but could also refer to a member * visible through imports or inheritance. * * For example, the type annotation `C` below is a potential access to `class C`, but could From 6e89c7b8f1d2435904d791c51d5a85f02d056d34 Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 5 Aug 2026 15:11:33 +0200 Subject: [PATCH 0105/2098] unified: Add mappings for type parameters on functions and type aliases --- .../extractor/src/languages/swift/swift.rs | 6 ++ .../swift/functions/generic-function.output | 3 + .../swift/functions/generic-type-alias.output | 77 +++++++++++++++++++ .../swift/functions/generic-type-alias.swift | 1 + 4 files changed, 87 insertions(+) create mode 100644 unified/extractor/tests/corpus/swift/functions/generic-type-alias.output create mode 100644 unified/extractor/tests/corpus/swift/functions/generic-type-alias.swift diff --git a/unified/extractor/src/languages/swift/swift.rs b/unified/extractor/src/languages/swift/swift.rs index 407f36bea2ba..1a355aaffb85 100644 --- a/unified/extractor/src/languages/swift/swift.rs +++ b/unified/extractor/src/languages/swift/swift.rs @@ -568,6 +568,7 @@ fn translation_rules() -> Vec> { rule!( (functionDecl name: @name + genericParameterClause: (genericParameterClause parameters: _* @type_params)? signature: (functionSignature parameterClause: (functionParameterClause parameters: _* @params) returnClause: (returnClause type: @ret)?) @@ -575,6 +576,7 @@ fn translation_rules() -> Vec> { => (function_declaration name: (identifier #{name}) + type_parameter: {type_params} parameter: {params} return_type: {ret} body: (block stmt: {body})) @@ -582,12 +584,14 @@ fn translation_rules() -> Vec> { rule!( (functionDecl name: @name + genericParameterClause: (genericParameterClause parameters: _* @type_params)? signature: (functionSignature parameterClause: (functionParameterClause parameters: _* @params) returnClause: (returnClause type: @ret)?)) => (function_declaration name: (identifier #{name}) + type_parameter: {type_params} parameter: {params} return_type: {ret} body: (block)) @@ -1230,11 +1234,13 @@ fn translation_rules() -> Vec> { (typeAliasDecl modifiers: _* @mods name: @@name + genericParameterClause: (genericParameterClause parameters: _* @type_params)? initializer: (typeInitializerClause value: @val)) => (type_alias_declaration modifier: {mods} name: (identifier #{name}) + type_parameter: {type_params} r#type: {val}) ), // Associated type declaration (with optional bound) diff --git a/unified/extractor/tests/corpus/swift/functions/generic-function.output b/unified/extractor/tests/corpus/swift/functions/generic-function.output index d09aac2744a2..dc7831410e23 100644 --- a/unified/extractor/tests/corpus/swift/functions/generic-function.output +++ b/unified/extractor/tests/corpus/swift/functions/generic-function.output @@ -65,6 +65,9 @@ top_level stmt: function_declaration name: identifier "identity" + type_parameter: + type_parameter + name: identifier "T" parameter: parameter external_name: identifier "_" diff --git a/unified/extractor/tests/corpus/swift/functions/generic-type-alias.output b/unified/extractor/tests/corpus/swift/functions/generic-type-alias.output new file mode 100644 index 000000000000..36737bd95bda --- /dev/null +++ b/unified/extractor/tests/corpus/swift/functions/generic-type-alias.output @@ -0,0 +1,77 @@ +typealias Box = Dictionary + +--- + +sourceFile + endOfFileToken: endOfFile + statements: + codeBlockItem + item: + typeAliasDecl + attributes: + name: identifier "Box" + genericParameterClause: + genericParameterClause + parameters: + genericParameter + colon: : + attributes: + name: identifier "T" + trailingComma: , + inheritedType: + identifierType + name: identifier "Equatable" + genericParameter + attributes: + name: identifier "U" + leftAngle: < + rightAngle: > + modifiers: + initializer: + typeInitializerClause + equal: = + value: + identifierType + name: identifier "Dictionary" + genericArgumentClause: + genericArgumentClause + arguments: + genericArgument + trailingComma: , + argument: + identifierType + name: identifier "T" + genericArgument + argument: + identifierType + name: identifier "U" + leftAngle: < + rightAngle: > + typealiasKeyword: typealias + +--- + +top_level + body: + block + stmt: + type_alias_declaration + name: identifier "Box" + type_parameter: + type_parameter + name: identifier "T" + bound: + named_type_expr + name: identifier "Equatable" + type_parameter + name: identifier "U" + type: + generic_type_expr + base: + named_type_expr + name: identifier "Dictionary" + type_argument: + named_type_expr + name: identifier "T" + named_type_expr + name: identifier "U" diff --git a/unified/extractor/tests/corpus/swift/functions/generic-type-alias.swift b/unified/extractor/tests/corpus/swift/functions/generic-type-alias.swift new file mode 100644 index 000000000000..831f552bab1a --- /dev/null +++ b/unified/extractor/tests/corpus/swift/functions/generic-type-alias.swift @@ -0,0 +1 @@ +typealias Box = Dictionary From 5a302d5e64b8922cd5b44eb32fb1df4c4b5e721a Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 5 Aug 2026 15:14:41 +0200 Subject: [PATCH 0106/2098] unified: Add name binding tests --- .../library-tests/local-name-binding/class_scope.swift | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/unified/ql/test/library-tests/local-name-binding/class_scope.swift b/unified/ql/test/library-tests/local-name-binding/class_scope.swift index d02ce69c8b53..e206aa0e5515 100644 --- a/unified/ql/test/library-tests/local-name-binding/class_scope.swift +++ b/unified/ql/test/library-tests/local-name-binding/class_scope.swift @@ -71,3 +71,11 @@ class I< class J { let x: TypeParamI; // $ access=TypeParamI } + +typealias Alias = + D; // $ access=D access=TypeParamAlias + +func foo(x: FooT) // $ access=FooT + -> D { // $ access=D access=FooT + let x: FooT = nil // $ access=FooT +} From 74e46ba70eeb634b7c6f205d80d2c5690faa4766 Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 5 Aug 2026 15:34:11 +0200 Subject: [PATCH 0107/2098] unified: Add mappings for constructor calls with generic arguments --- .../extractor/src/languages/swift/swift.rs | 14 +++ .../generic-specialization-expression.output | 9 +- ...onstructor-call-with-type-arguments.output | 106 ++++++++++++++++++ ...constructor-call-with-type-arguments.swift | 3 + 4 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 unified/extractor/tests/corpus/swift/functions/constructor-call-with-type-arguments.output create mode 100644 unified/extractor/tests/corpus/swift/functions/constructor-call-with-type-arguments.swift diff --git a/unified/extractor/src/languages/swift/swift.rs b/unified/extractor/src/languages/swift/swift.rs index 1a355aaffb85..ccc1cc7f725d 100644 --- a/unified/extractor/src/languages/swift/swift.rs +++ b/unified/extractor/src/languages/swift/swift.rs @@ -185,6 +185,20 @@ fn translation_rules() -> Vec> { // the target AST has no expression-level discard (only `ignore_pattern`, // which is a pattern), so it becomes a `name_expr` over the `_` token. rule!((discardAssignmentExpr wildcard: @@w) => (name_expr identifier: (identifier #{w}))), + // A generic specialization in expression position (`C`, + // `Array`) is represented by swift-syntax as a + // `genericSpecializationExpr`. When used as a call target + // (`C()`), this should become a `call_expr` whose callee is a + // `generic_type_expr`, so we map it directly to that shape. + rule!( + (genericSpecializationExpr + expression: (declReferenceExpr baseName: @name) + genericArgumentClause: (genericArgumentClause arguments: (genericArgument argument: @args)*)) + => + (generic_type_expr + base: (named_type_expr name: (identifier #{name})) + type_argument: {args}) + ), // ---- Operators ---- // The parser front-end folds operator chains into nested // `infixOperatorExpr`s by precedence (see swift-syntax-rs), so diff --git a/unified/extractor/tests/corpus/swift/expressions/generic-specialization-expression.output b/unified/extractor/tests/corpus/swift/expressions/generic-specialization-expression.output index 4f3bd0214411..94cdf978b9d2 100644 --- a/unified/extractor/tests/corpus/swift/expressions/generic-specialization-expression.output +++ b/unified/extractor/tests/corpus/swift/expressions/generic-specialization-expression.output @@ -53,4 +53,11 @@ top_level identifier: identifier "numbers" value: call_expr - callee: unsupported_node "Array" + callee: + generic_type_expr + base: + named_type_expr + name: identifier "Array" + type_argument: + named_type_expr + name: identifier "Int" diff --git a/unified/extractor/tests/corpus/swift/functions/constructor-call-with-type-arguments.output b/unified/extractor/tests/corpus/swift/functions/constructor-call-with-type-arguments.output new file mode 100644 index 000000000000..37afdfa0d639 --- /dev/null +++ b/unified/extractor/tests/corpus/swift/functions/constructor-call-with-type-arguments.output @@ -0,0 +1,106 @@ +class Foo {} +class C {} +let x = C() + +--- + +sourceFile + endOfFileToken: endOfFile + statements: + codeBlockItem + item: + classDecl + attributes: + name: identifier "Foo" + memberBlock: + memberBlock + leftBrace: { + rightBrace: } + members: + modifiers: + classKeyword: class + codeBlockItem + item: + classDecl + attributes: + name: identifier "C" + genericParameterClause: + genericParameterClause + parameters: + genericParameter + attributes: + name: identifier "T" + leftAngle: < + rightAngle: > + memberBlock: + memberBlock + leftBrace: { + rightBrace: } + members: + modifiers: + classKeyword: class + codeBlockItem + item: + variableDecl + attributes: + modifiers: + bindingSpecifier: let + bindings: + patternBinding + initializer: + initializerClause + equal: = + value: + functionCallExpr + leftParen: ( + rightParen: ) + arguments: + additionalTrailingClosures: + calledExpression: + genericSpecializationExpr + expression: + declReferenceExpr + baseName: identifier "C" + genericArgumentClause: + genericArgumentClause + arguments: + genericArgument + argument: + identifierType + name: identifier "Foo" + leftAngle: < + rightAngle: > + pattern: + identifierPattern + identifier: identifier "x" + +--- + +top_level + body: + block + stmt: + class_like_declaration + modifier: modifier "class" + name: identifier "Foo" + class_like_declaration + modifier: modifier "class" + name: identifier "C" + type_parameter: + type_parameter + name: identifier "T" + variable_declaration + modifier: modifier "let" + pattern: + name_pattern + identifier: identifier "x" + value: + call_expr + callee: + generic_type_expr + base: + named_type_expr + name: identifier "C" + type_argument: + named_type_expr + name: identifier "Foo" diff --git a/unified/extractor/tests/corpus/swift/functions/constructor-call-with-type-arguments.swift b/unified/extractor/tests/corpus/swift/functions/constructor-call-with-type-arguments.swift new file mode 100644 index 000000000000..c5a122cb3806 --- /dev/null +++ b/unified/extractor/tests/corpus/swift/functions/constructor-call-with-type-arguments.swift @@ -0,0 +1,3 @@ +class Foo {} +class C {} +let x = C() From aaa2c1c22f9de8652173e2698ea037cb04b32788 Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 5 Aug 2026 15:35:04 +0200 Subject: [PATCH 0108/2098] unified: Add test with generic constructor call --- .../ql/test/library-tests/local-name-binding/class_scope.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/unified/ql/test/library-tests/local-name-binding/class_scope.swift b/unified/ql/test/library-tests/local-name-binding/class_scope.swift index e206aa0e5515..5e251b8e6a0d 100644 --- a/unified/ql/test/library-tests/local-name-binding/class_scope.swift +++ b/unified/ql/test/library-tests/local-name-binding/class_scope.swift @@ -78,4 +78,5 @@ typealias Alias = func foo(x: FooT) // $ access=FooT -> D { // $ access=D access=FooT let x: FooT = nil // $ access=FooT + return D() // $ access=D access=FooT } From 619ef2f2474bdc243715589a47f6fc8588a3dc74 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema <93738568+jketema@users.noreply.github.com> Date: Wed, 5 Aug 2026 14:09:39 +0000 Subject: [PATCH 0109/2098] Unified: Factor out the supported platforms --- unified/platforms.bzl | 9 +++++++++ unified/swift-syntax-rs/BUILD.bazel | 23 +++++++---------------- 2 files changed, 16 insertions(+), 16 deletions(-) create mode 100644 unified/platforms.bzl diff --git a/unified/platforms.bzl b/unified/platforms.bzl new file mode 100644 index 000000000000..29560c75b3c4 --- /dev/null +++ b/unified/platforms.bzl @@ -0,0 +1,9 @@ +"""Shared platform constraint for the unified extractor.""" + +# swift-syntax requires a Swift toolchain, which is only available +# through rules_swift. +UNIFIED_SUPPORTED_PLATFORMS = select({ + "@platforms//os:linux": [], + "@platforms//os:macos": [], + "//conditions:default": ["@platforms//:incompatible"], +}) diff --git a/unified/swift-syntax-rs/BUILD.bazel b/unified/swift-syntax-rs/BUILD.bazel index db451e5b7b9a..8f2a5886fd22 100644 --- a/unified/swift-syntax-rs/BUILD.bazel +++ b/unified/swift-syntax-rs/BUILD.bazel @@ -1,6 +1,7 @@ load("@rules_rust//rust:defs.bzl", "rust_binary", "rust_library", "rust_test") load("@rules_shell//shell:sh_binary.bzl", "sh_binary") load("//misc/bazel:pkg.bzl", "codeql_pkg_runfiles") +load("//unified:platforms.bzl", "UNIFIED_SUPPORTED_PLATFORMS") load(":swift_runtime.bzl", "swift_runtime_libs") load(":xcode_transition.bzl", "xcode_transition_swift_library") @@ -11,23 +12,13 @@ swift_runtime_libs( toolchain = "@swift_toolchain_ubuntu22.04//:files", ) -# Targets in this package require a Swift toolchain (Linux or macOS). -# `select()` gives us OR-of-OSes; other platforms get marked incompatible -# so `bazel build/test //...` skips them cleanly. -# -_SWIFT_SUPPORTED_PLATFORMS = select({ - "@platforms//os:linux": [], - "@platforms//os:macos": [], - "//conditions:default": ["@platforms//:incompatible"], -}) - # Swift FFI shim: wraps swift-syntax and exposes a small C ABI. The Rust # targets below link against its `CcInfo`. xcode_transition_swift_library( name = "swift_syntax_ffi", srcs = ["swift/Sources/SwiftSyntaxFFI/SwiftSyntaxFFI.swift"], module_name = "SwiftSyntaxFFI", - target_compatible_with = _SWIFT_SUPPORTED_PLATFORMS, + target_compatible_with = UNIFIED_SUPPORTED_PLATFORMS, deps = [ "@swift-syntax//:SwiftOperators", "@swift-syntax//:SwiftParser", @@ -44,7 +35,7 @@ rust_library( exclude = ["src/main.rs"], ), edition = "2024", - target_compatible_with = _SWIFT_SUPPORTED_PLATFORMS, + target_compatible_with = UNIFIED_SUPPORTED_PLATFORMS, deps = [ ":swift_syntax_ffi", ], @@ -68,7 +59,7 @@ rust_binary( "@platforms//os:linux": [":swift_runtime_libs"], }), edition = "2024", - target_compatible_with = _SWIFT_SUPPORTED_PLATFORMS, + target_compatible_with = UNIFIED_SUPPORTED_PLATFORMS, deps = [":swift_syntax_rs"], ) @@ -79,7 +70,7 @@ sh_binary( name = "swift-syntax-parse", srcs = ["swift-syntax-parse.sh"], data = [":swift-syntax-parse.real"], - target_compatible_with = _SWIFT_SUPPORTED_PLATFORMS, + target_compatible_with = UNIFIED_SUPPORTED_PLATFORMS, ) # Packaged form for the extractor pack: the wrapper (as `swift-syntax-parse`), @@ -90,7 +81,7 @@ codeql_pkg_runfiles( # original filename. excludes = ["swift-syntax-parse.sh"], exes = [":swift-syntax-parse"], - target_compatible_with = _SWIFT_SUPPORTED_PLATFORMS, + target_compatible_with = UNIFIED_SUPPORTED_PLATFORMS, visibility = ["//unified:__pkg__"], ) @@ -103,5 +94,5 @@ rust_test( "@platforms//os:linux": [":swift_runtime_libs"], }), edition = "2024", - target_compatible_with = _SWIFT_SUPPORTED_PLATFORMS, + target_compatible_with = UNIFIED_SUPPORTED_PLATFORMS, ) From 1d824fec58b97a2c7fd74c54bda0051d3011d935 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema <93738568+jketema@users.noreply.github.com> Date: Wed, 5 Aug 2026 14:43:26 +0000 Subject: [PATCH 0110/2098] Unified: Add swift-syntax build dependency to the extractor --- Cargo.lock | 1 + unified/extractor/BUILD.bazel | 13 +++++++++++++ unified/extractor/Cargo.toml | 1 + 3 files changed, 15 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 24479c721561..bebfc2da57cc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -449,6 +449,7 @@ dependencies = [ "rayon", "regex", "serde_json", + "swift-syntax-rs", "tracing", "tracing-subscriber", "yeast", diff --git a/unified/extractor/BUILD.bazel b/unified/extractor/BUILD.bazel index 58b32d9fc5c3..dea196ada0e5 100644 --- a/unified/extractor/BUILD.bazel +++ b/unified/extractor/BUILD.bazel @@ -1,5 +1,12 @@ load("//misc/bazel:rust.bzl", "codeql_rust_binary") load("//misc/bazel/3rdparty/tree_sitter_extractors_deps:defs.bzl", "aliases", "all_crate_deps") +load("//unified:platforms.bzl", "UNIFIED_SUPPORTED_PLATFORMS") +load("//unified/swift-syntax-rs:swift_runtime.bzl", "swift_runtime_libs") + +swift_runtime_libs( + name = "swift_runtime_libs", + toolchain = "@swift_toolchain_ubuntu22.04//:files", +) exports_files(["Cargo.toml"]) @@ -11,14 +18,20 @@ codeql_rust_binary( "ast_types.yml", "swift_node_types.yml", ], + data = select({ + "@platforms//os:macos": [], + "@platforms//os:linux": [":swift_runtime_libs"], + }), proc_macro_deps = all_crate_deps( proc_macro = True, ), + target_compatible_with = UNIFIED_SUPPORTED_PLATFORMS, visibility = ["//visibility:public"], deps = all_crate_deps( normal = True, ) + [ "//shared/tree-sitter-extractor", "//shared/yeast", + "//unified/swift-syntax-rs:swift_syntax_rs", ], ) diff --git a/unified/extractor/Cargo.toml b/unified/extractor/Cargo.toml index be333298f1ad..607afc40458b 100644 --- a/unified/extractor/Cargo.toml +++ b/unified/extractor/Cargo.toml @@ -18,3 +18,4 @@ serde_json = "1.0.145" codeql-extractor = { path = "../../shared/tree-sitter-extractor" } yeast = { path = "../../shared/yeast" } +swift-syntax-rs = { path = "../swift-syntax-rs" } From ad1bd59054fad537c58c753846c2d71d05364961 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema <93738568+jketema@users.noreply.github.com> Date: Wed, 5 Aug 2026 14:56:05 +0000 Subject: [PATCH 0111/2098] Unified: Call the swift code directly instead of going through a binary --- .../extractor/src/languages/swift/parse.rs | 109 +----------------- unified/extractor/tests/corpus_tests.rs | 22 ---- 2 files changed, 5 insertions(+), 126 deletions(-) diff --git a/unified/extractor/src/languages/swift/parse.rs b/unified/extractor/src/languages/swift/parse.rs index c8633f1a27a5..2abc589332c8 100644 --- a/unified/extractor/src/languages/swift/parse.rs +++ b/unified/extractor/src/languages/swift/parse.rs @@ -1,33 +1,18 @@ -//! Swift front-end parser: shells out to the separate `swift-syntax-parse` -//! binary (which links swift-syntax) to obtain a JSON syntax tree, then adapts -//! that JSON into a `yeast::Ast` via the pure-Rust [`swift_adapter`] module. -//! -//! Running the parser in a separate process keeps the Swift toolchain out of -//! the extractor's own build: the extractor never links Swift, so working on -//! other (e.g. tree-sitter based) languages needs no Swift toolchain. Each call -//! spawns the parser afresh; a longer-lived parser process could be swapped in -//! behind this same seam later without touching the extraction pipeline. - -use std::io::Write; -use std::process::{Command, Stdio}; +//! Swift front-end parser: calls into the `swift-syntax-rs` crate (which links +//! swift-syntax) to obtain a JSON syntax tree, then adapts that JSON into a +//! `yeast::Ast` via the pure-Rust [`swift_adapter`] module. use codeql_extractor::extractor::ParsedTree; use super::swift_adapter; -/// Environment variable naming the `swift-syntax-parse` executable. When unset, -/// the parser is resolved next to the extractor executable, then on `PATH`. -const PARSE_BIN_ENV: &str = "CODEQL_EXTRACTOR_UNIFIED_SWIFT_SYNTAX_PARSE"; - -/// Base name of the `swift-syntax-parse` executable as shipped / looked up. -const PARSE_BIN_NAME: &str = "swift-syntax-parse"; - /// Parse Swift `source` into a [`ParsedTree`] (a raw `yeast::Ast` plus /// side-channel `extra` tokens), ready to be desugared via `run_from_ast`. pub fn parse(source: &[u8]) -> Result { let source = std::str::from_utf8(source).map_err(|e| format!("Swift source is not valid UTF-8: {e}"))?; - let json = run_parser(source)?; + let json = + swift_syntax_rs::parse_to_json(source).map_err(|e| format!("Swift parser failed: {e}"))?; let mut adapted = swift_adapter::json_to_ast(&json)?; adapted.ast.set_source(source.as_bytes().to_vec()); Ok(ParsedTree { @@ -35,87 +20,3 @@ pub fn parse(source: &[u8]) -> Result { extras: adapted.extras, }) } - -/// The `swift-syntax-parse` executable to invoke, resolved in priority order: -/// -/// 1. the `CODEQL_EXTRACTOR_UNIFIED_SWIFT_SYNTAX_PARSE` override, if set; -/// 2. a copy shipped next to the extractor executable — this is how the CodeQL -/// extractor pack lays it out (`tools//{extractor, -/// swift-syntax-parse}`), so a packaged extractor is self-contained with no -/// environment setup; -/// 3. a bare `swift-syntax-parse`, looked up on `PATH`. -fn parse_bin() -> String { - if let Ok(bin) = std::env::var(PARSE_BIN_ENV) { - if !bin.is_empty() { - return bin; - } - } - if let Ok(exe) = std::env::current_exe() { - if let Some(sibling) = exe.parent().map(|dir| dir.join(PARSE_BIN_NAME)) { - if sibling.is_file() { - return sibling.to_string_lossy().into_owned(); - } - } - } - PARSE_BIN_NAME.to_string() -} - -/// Whether the `swift-syntax-parse` executable can be launched at all. -/// -/// This reports availability of the *executable*, deliberately not whether -/// parsing succeeds: a binary that launches but then crashes or emits invalid -/// JSON is still "available", so callers run and surface the failure rather -/// than silently skipping. Only a genuinely missing/unlaunchable binary (e.g. -/// no Swift toolchain is installed) reports `false`. -pub fn binary_available() -> bool { - match Command::new(parse_bin()) - .stdin(Stdio::null()) - .stdout(Stdio::null()) - .stderr(Stdio::null()) - .spawn() - { - Ok(mut child) => { - let _ = child.wait(); - true - } - Err(e) if e.kind() == std::io::ErrorKind::NotFound => false, - // Any other spawn failure (e.g. a permissions problem) is a genuine - // issue worth surfacing, so treat the parser as available and let the - // caller fail rather than masking it as "unavailable". - Err(_) => true, - } -} - -/// Run the external parser, feeding `source` on stdin and returning its JSON -/// stdout. -fn run_parser(source: &str) -> Result { - let bin = parse_bin(); - let mut child = Command::new(&bin) - .stdin(Stdio::piped()) - .stdout(Stdio::piped()) - .stderr(Stdio::piped()) - .spawn() - .map_err(|e| format!("failed to spawn Swift parser `{bin}`: {e}"))?; - - // The parser reads all of stdin before writing any stdout, so writing the - // whole source and then closing stdin (by dropping it) cannot deadlock. - child - .stdin - .take() - .expect("child stdin was piped") - .write_all(source.as_bytes()) - .map_err(|e| format!("failed to write source to Swift parser `{bin}`: {e}"))?; - - let output = child - .wait_with_output() - .map_err(|e| format!("failed to run Swift parser `{bin}`: {e}"))?; - if !output.status.success() { - return Err(format!( - "Swift parser `{bin}` failed ({}): {}", - output.status, - String::from_utf8_lossy(&output.stderr).trim() - )); - } - String::from_utf8(output.stdout) - .map_err(|e| format!("Swift parser produced non-UTF-8 output: {e}")) -} diff --git a/unified/extractor/tests/corpus_tests.rs b/unified/extractor/tests/corpus_tests.rs index b2700b999b7c..39cbab3194c7 100644 --- a/unified/extractor/tests/corpus_tests.rs +++ b/unified/extractor/tests/corpus_tests.rs @@ -20,20 +20,6 @@ fn update_mode_enabled() -> bool { .unwrap_or(false) } -/// Whether the external swift-syntax parser is available. When the parser -/// binary genuinely cannot be found/launched (e.g. no Swift toolchain, and -/// neither `CODEQL_EXTRACTOR_UNIFIED_SWIFT_SYNTAX_PARSE` nor a `swift-syntax-parse` -/// on `PATH`), the corpus test is skipped rather than failed — it cannot run -/// without the Swift-backed parser. -/// -/// Crucially this checks only that the executable *launches*: a parser that is -/// present but crashes, emits invalid JSON, or otherwise regresses is -/// considered available, so the suite runs and fails (rather than silently -/// skipping the very failures CI needs to catch). -fn parser_available() -> bool { - languages::swift_parse::binary_available() -} - /// Parse a corpus `.output` file. The file holds a single test case made of /// three sections separated by `---` delimiter lines: /// @@ -112,14 +98,6 @@ fn collect_corpus_stems(dir: &Path, out: &mut Vec) { #[test] fn test_corpus() { - if !parser_available() { - eprintln!( - "skipping test_corpus: the swift-syntax parser is unavailable \ - (set CODEQL_EXTRACTOR_UNIFIED_SWIFT_SYNTAX_PARSE or put \ - `swift-syntax-parse` on PATH)" - ); - return; - } let update_mode = update_mode_enabled(); let all_languages = languages::all_language_specs(); let corpus_dir = Path::new("tests/corpus"); From 1226971cfba1e69e178d0e9f5dd64f9b51c26ba5 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema <93738568+jketema@users.noreply.github.com> Date: Wed, 5 Aug 2026 15:19:10 +0000 Subject: [PATCH 0112/2098] Unified: Remove the `SWIFT`/`SWITFC` environment hacks Just assume `swift`/`swiftc` are on the path. --- unified/swift-syntax-rs/build.rs | 30 +++++++----------------------- 1 file changed, 7 insertions(+), 23 deletions(-) diff --git a/unified/swift-syntax-rs/build.rs b/unified/swift-syntax-rs/build.rs index 6a58ddb4d8da..1056c5a62518 100644 --- a/unified/swift-syntax-rs/build.rs +++ b/unified/swift-syntax-rs/build.rs @@ -20,8 +20,6 @@ fn main() { ] { println!("cargo:rerun-if-changed={}", input.display()); } - println!("cargo:rerun-if-env-changed=SWIFT"); - println!("cargo:rerun-if-env-changed=SWIFTC"); // Build the Swift FFI package as a release dynamic library. // @@ -33,7 +31,7 @@ fn main() { // then fail — at link time, which is fair: they genuinely need Swift (and CI // builds go through Bazel anyway). A Swift toolchain that *is* present but // whose build fails is still surfaced as a hard error below. - let mut command = Command::new(swift_bin()); + let mut command = Command::new("swift"); command .args(["build", "-c", "release"]) .current_dir(&swift_dir); @@ -42,12 +40,11 @@ fn main() { Ok(status) => status, Err(e) => { println!( - "cargo:warning=skipping the Swift FFI build: failed to run `{swift} build`: {e}. \ - Install a Swift toolchain (see https://www.swift.org/install/, e.g. via swiftly) \ - and ensure `swift` is on PATH, or set the `SWIFT` environment variable, to build \ - or test this crate. `cargo check`/`fmt`/`clippy` work without it. The pinned \ - version is in `.swift-version`.", - swift = swift_bin(), + "cargo:warning=skipping the Swift FFI build: failed to run `swift build`: {e}. \ + Install a Swift toolchain (see https://www.swift.org/install/, e.g. via \ + swiftly) and ensure `swift` is on PATH to build or test this crate. \ + `cargo check`/`fmt`/`clippy` work without it. The pinned version is in \ + `.swift-version`." ); return; } @@ -70,7 +67,7 @@ fn main() { /// Query the active Swift toolchain for the directory containing its runtime /// shared libraries (e.g. `libswiftCore.so`). fn swift_runtime_dir() -> Option { - let output = Command::new(swiftc_bin()) + let output = Command::new("swiftc") .arg("-print-target-info") .output() .ok()?; @@ -94,19 +91,6 @@ fn swift_runtime_dir() -> Option { Some(PathBuf::from(resource_path).join(if cfg!(target_os = "macos") { "macosx" } else { "linux" })) } -/// The `swift` driver to invoke: `$SWIFT` if set, otherwise `swift` from `PATH`. -/// This keeps the build tool-agnostic — any Swift install works; no particular -/// version manager is required. -fn swift_bin() -> String { - env::var("SWIFT").unwrap_or_else(|_| "swift".to_string()) -} - -/// The `swiftc` compiler to invoke: `$SWIFTC` if set, otherwise `swiftc` from -/// `PATH`. -fn swiftc_bin() -> String { - env::var("SWIFTC").unwrap_or_else(|_| "swiftc".to_string()) -} - /// Some environments (notably GitHub Codespaces) inject /// `GIT_CONFIG_KEY_0=safe.bareRepository` / `GIT_CONFIG_VALUE_0=explicit`, which /// breaks the cached bare git repositories `swift build` uses. When exactly that From d85deef514bdc072b4e8ae1b697b192a63f02d24 Mon Sep 17 00:00:00 2001 From: Keshav Malik Date: Wed, 5 Aug 2026 22:38:06 +0530 Subject: [PATCH 0113/2098] Detect unpinned reusable workflows --- .../Security/CWE-829/UnpinnedActionsTag.md | 18 ++++++++-- .../Security/CWE-829/UnpinnedActionsTag.ql | 36 ++++++++++++------- .../2026-08-05-unpinned-reusable-workflows.md | 4 +++ .../workflows/unpinned_reusable_workflows.yml | 35 ++++++++++++++++++ .../CWE-829/UnpinnedActionsTag.expected | 18 ++++++++++ 5 files changed, 97 insertions(+), 14 deletions(-) create mode 100644 actions/ql/src/change-notes/2026-08-05-unpinned-reusable-workflows.md create mode 100644 actions/ql/test/query-tests/Security/CWE-829/.github/workflows/unpinned_reusable_workflows.yml diff --git a/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.md b/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.md index 16551e9c89a7..b8c7435adddf 100644 --- a/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.md +++ b/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.md @@ -1,10 +1,10 @@ ## Overview -Using a tag for a 3rd party Action that is not pinned to a commit can lead to executing an untrusted Action through a supply chain attack. +Using a mutable tag or branch for an Action or reusable workflow can lead to executing untrusted code through a supply chain attack. ## Recommendation -Pinning an action to a full length commit SHA is currently the only way to use a non-immutable action as an immutable release. Pinning to a particular SHA helps mitigate the risk of a bad actor adding a backdoor to the action's repository, as they would need to generate a SHA-1 collision for a valid Git object payload. When selecting a SHA, you should verify it is from the action's repository and not a repository fork. +Pinning an Action or reusable workflow to a full length commit SHA is currently the only way to use a mutable reference as an immutable release. Pinning to a particular SHA helps mitigate the risk of a bad actor adding a backdoor to the referenced repository, as they would need to generate a SHA-1 collision for a valid Git object payload. When selecting a SHA, you should verify it is from the intended repository and not a repository fork. ## Example @@ -14,12 +14,26 @@ Pinning an action to a full length commit SHA is currently the only way to use a - uses: tj-actions/changed-files@v44 ``` +```yaml +jobs: + call-workflow: + uses: example/actions/.github/workflows/build.yml@main +``` + ### Correct Usage ```yaml - uses: tj-actions/changed-files@c65cd883420fd2eb864698a825fc4162dd94482c # v44 ``` +```yaml +jobs: + call-workflow: + uses: example/actions/.github/workflows/build.yml@25b062c917b0c75f8b47d8469aff6c94ffd89abb +``` + ## References - GitHub Docs: [Using third-party actions](https://docs.github.com/en/actions/security-for-github-actions/security-guides/security-hardening-for-github-actions#using-third-party-actions). +- GitHub Docs: [Reusing third-party workflows](https://docs.github.com/en/actions/reference/security/secure-use#reusing-third-party-workflows). +- GitHub Docs: [Workflow syntax for reusable workflow calls](https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_iduses). diff --git a/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql b/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql index 530b8e48e0f5..9a4bc007bb51 100644 --- a/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql +++ b/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql @@ -1,6 +1,6 @@ /** - * @name Unpinned tag for a non-immutable Action in workflow or composite action - * @description Using a tag for a non-immutable Action that is not pinned to a commit can lead to executing an untrusted Action through a supply chain attack. + * @name Unpinned tag for a non-immutable Action or reusable workflow + * @description Using a mutable reference for a non-immutable Action or reusable workflow can lead to executing untrusted code through a supply chain attack. * @kind problem * @security-severity 5.0 * @problem.severity warning @@ -33,7 +33,7 @@ private predicate isPinnedContainer(string version) { bindingset[nwo] private predicate isContainerImage(string nwo) { nwo.regexpMatch("^docker://.+") } -private predicate getStepContainerName(UsesStep uses, string name) { +private predicate hasUsesContainerName(Uses uses, string name) { exists(Workflow workflow | uses.getEnclosingWorkflow() = workflow and ( @@ -43,20 +43,32 @@ private predicate getStepContainerName(UsesStep uses, string name) { ) ) or - exists(CompositeAction action | - uses.getEnclosingCompositeAction() = action and + exists(UsesStep step, CompositeAction action | + uses = step and + step.getEnclosingCompositeAction() = action and name = action.getLocation().getFile().getBaseName() ) } -from UsesStep uses, string nwo, string version, string name +from Uses uses, string nwo, string version, string name, string message where uses.getCallee() = nwo and - getStepContainerName(uses, name) and + hasUsesContainerName(uses, name) and uses.getVersion() = version and not isTrustedOwner(nwo) and - not (if isContainerImage(nwo) then isPinnedContainer(version) else isPinnedCommit(version)) and - not isImmutableAction(uses, nwo) -select uses.getCalleeNode(), - "Unpinned 3rd party Action '" + name + "' step $@ uses '" + nwo + "' with ref '" + version + - "', not a pinned commit hash", uses, uses.toString() + not ( + if uses instanceof UsesStep and isContainerImage(nwo) + then isPinnedContainer(version) + else isPinnedCommit(version) + ) and + not exists(UsesStep step | uses = step and isImmutableAction(step, nwo)) and + if uses instanceof ExternalJob + then + message = + "Job $@ in '" + name + "' uses reusable workflow '" + nwo + "' with ref '" + version + + "', not a pinned commit hash" + else + message = + "Unpinned 3rd party Action '" + name + "' step $@ uses '" + nwo + "' with ref '" + version + + "', not a pinned commit hash" +select uses.getCalleeNode(), message, uses, uses.toString() diff --git a/actions/ql/src/change-notes/2026-08-05-unpinned-reusable-workflows.md b/actions/ql/src/change-notes/2026-08-05-unpinned-reusable-workflows.md new file mode 100644 index 000000000000..6269fdec14e6 --- /dev/null +++ b/actions/ql/src/change-notes/2026-08-05-unpinned-reusable-workflows.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `actions/unpinned-tag` query now detects mutable references to reusable workflows. diff --git a/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/unpinned_reusable_workflows.yml b/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/unpinned_reusable_workflows.yml new file mode 100644 index 000000000000..72ce6b4dd05b --- /dev/null +++ b/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/unpinned_reusable_workflows.yml @@ -0,0 +1,35 @@ +name: Reusable workflow pinning + +on: + pull_request: + +jobs: + unpinned-tag: + uses: example/actions/.github/workflows/build.yml@v2 + + unpinned-branch: + uses: example/actions/.github/workflows/build.yml@main + + unpinned-branch-with-slash: + uses: example/actions/.github/workflows/build.yml@release/v2 + + unpinned-short-sha: + uses: example/actions/.github/workflows/build.yml@25b062c917b0c75f8b47d8469aff6c94ffd89ab + + pinned-sha1: + uses: example/actions/.github/workflows/build.yml@25b062c917b0c75f8b47d8469aff6c94ffd89abb + + pinned-sha256: + uses: example/actions/.github/workflows/build.yml@25b062c917b0c75f8b47d8469aff6c94ffd89abb25b062c917b0c75f8b47d84d + + pinned-uppercase-sha1: + uses: example/actions/.github/workflows/build.yml@25B062C917B0C75F8B47D8469AFF6C94FFD89ABB + + trusted-owner: + uses: actions/reusable-workflows/.github/workflows/build.yml@main + + local-workflow: + uses: ./.github/workflows/reusable_local.yml + + local-workflow-dollar: + uses: $/.github/workflows/reusable_local.yml diff --git a/actions/ql/test/query-tests/Security/CWE-829/UnpinnedActionsTag.expected b/actions/ql/test/query-tests/Security/CWE-829/UnpinnedActionsTag.expected index 14cff70c3804..05f9cf3d8fd5 100644 --- a/actions/ql/test/query-tests/Security/CWE-829/UnpinnedActionsTag.expected +++ b/actions/ql/test/query-tests/Security/CWE-829/UnpinnedActionsTag.expected @@ -8,6 +8,10 @@ | .github/workflows/auto_ci.yml:94:15:94:39 | codecov/codecov-action@v3 | Unpinned 3rd party Action 'Python CI' step $@ uses 'codecov/codecov-action' with ref 'v3', not a pinned commit hash | .github/workflows/auto_ci.yml:93:9:96:6 | Uses Step | Uses Step | | .github/workflows/auto_ci.yml:111:15:111:48 | peter-evans/create-pull-request@v5 | Unpinned 3rd party Action 'Python CI' step $@ uses 'peter-evans/create-pull-request' with ref 'v5', not a pinned commit hash | .github/workflows/auto_ci.yml:108:9:119:6 | Uses Step: create_pr | Uses Step: create_pr | | .github/workflows/auto_ci.yml:127:15:127:56 | thollander/actions-comment-pull-request@v2 | Unpinned 3rd party Action 'Python CI' step $@ uses 'thollander/actions-comment-pull-request' with ref 'v2', not a pinned commit hash | .github/workflows/auto_ci.yml:125:9:133:6 | Uses Step | Uses Step | +| .github/workflows/external/TestOrg/TestRepo/.github/workflows/build_nested.yml:9:11:9:59 | TestOrg/TestRepo/.github/workflows/build.yml@main | Job $@ in 'build_nested.yml' uses reusable workflow 'TestOrg/TestRepo/.github/workflows/build.yml' with ref 'main', not a pinned commit hash | .github/workflows/external/TestOrg/TestRepo/.github/workflows/build_nested.yml:9:5:13:7 | Job: build | Job: build | +| .github/workflows/external/TestOrg/TestRepo/.github/workflows/build_nested_branching.yml:27:11:27:66 | TestOrg/TestRepo/.github/workflows/build_nested.yml@main | Job $@ in 'build_nested_branching.yml' uses reusable workflow 'TestOrg/TestRepo/.github/workflows/build_nested.yml' with ref 'main', not a pinned commit hash | .github/workflows/external/TestOrg/TestRepo/.github/workflows/build_nested_branching.yml:26:5:30:2 | Job: build_safe | Job: build_safe | +| .github/workflows/external/TestOrg/TestRepo/.github/workflows/build_nested_branching.yml:31:11:31:66 | TestOrg/TestRepo/.github/workflows/build_nested.yml@main | Job $@ in 'build_nested_branching.yml' uses reusable workflow 'TestOrg/TestRepo/.github/workflows/build_nested.yml' with ref 'main', not a pinned commit hash | .github/workflows/external/TestOrg/TestRepo/.github/workflows/build_nested_branching.yml:31:5:33:43 | Job: build_unsafe | Job: build_unsafe | +| .github/workflows/formal.yml:12:11:12:60 | TestOrg/TestRepo/.github/workflows/formal.yml@main | Job $@ in 'Test Formalities' uses reusable workflow 'TestOrg/TestRepo/.github/workflows/formal.yml' with ref 'main', not a pinned commit hash | .github/workflows/formal.yml:11:5:12:61 | Job: build | Job: build | | .github/workflows/issue_comment_3rd_party_action.yml:14:15:14:52 | xt0rted/pull-request-comment-branch@v2 | Unpinned 3rd party Action 'PR head from 3rd party action' step $@ uses 'xt0rted/pull-request-comment-branch' with ref 'v2', not a pinned commit hash | .github/workflows/issue_comment_3rd_party_action.yml:12:9:16:6 | Uses Step: comment-branch | Uses Step: comment-branch | | .github/workflows/issue_comment_3rd_party_action.yml:27:15:27:52 | xt0rted/pull-request-comment-branch@v2 | Unpinned 3rd party Action 'PR head from 3rd party action' step $@ uses 'xt0rted/pull-request-comment-branch' with ref 'v2', not a pinned commit hash | .github/workflows/issue_comment_3rd_party_action.yml:25:9:30:6 | Uses Step: comment-branch | Uses Step: comment-branch | | .github/workflows/issue_comment_3rd_party_action.yml:41:15:41:42 | eficode/resolve-pr-refs@main | Unpinned 3rd party Action 'PR head from 3rd party action' step $@ uses 'eficode/resolve-pr-refs' with ref 'main', not a pinned commit hash | .github/workflows/issue_comment_3rd_party_action.yml:39:9:45:6 | Uses Step: refs | Uses Step: refs | @@ -28,10 +32,24 @@ | .github/workflows/pr-workflow.yml:449:15:449:43 | cachix/install-nix-action@v20 | Unpinned 3rd party Action 'pr-workflow' step $@ uses 'cachix/install-nix-action' with ref 'v20', not a pinned commit hash | .github/workflows/pr-workflow.yml:449:9:452:6 | Uses Step | Uses Step | | .github/workflows/pr-workflow.yml:452:15:452:60 | DeterminateSystems/magic-nix-cache-action@main | Unpinned 3rd party Action 'pr-workflow' step $@ uses 'DeterminateSystems/magic-nix-cache-action' with ref 'main', not a pinned commit hash | .github/workflows/pr-workflow.yml:452:9:453:6 | Uses Step | Uses Step | | .github/workflows/pr-workflow.yml:453:15:453:41 | cachix/cachix-action@master | Unpinned 3rd party Action 'pr-workflow' step $@ uses 'cachix/cachix-action' with ref 'master', not a pinned commit hash | .github/workflows/pr-workflow.yml:453:9:459:6 | Uses Step | Uses Step | +| .github/workflows/reusable_caller1.yaml:8:11:8:62 | TestOrg/TestRepo/.github/workflows/reusable.yml@main | Job $@ in 'assets-test' uses reusable workflow 'TestOrg/TestRepo/.github/workflows/reusable.yml' with ref 'main', not a pinned commit hash | .github/workflows/reusable_caller1.yaml:8:5:10:56 | Job: check-execution-context | Job: check-execution-context | +| .github/workflows/reusable_caller2.yaml:8:11:8:62 | TestOrg/TestRepo/.github/workflows/reusable.yml@main | Job $@ in 'assets-test' uses reusable workflow 'TestOrg/TestRepo/.github/workflows/reusable.yml' with ref 'main', not a pinned commit hash | .github/workflows/reusable_caller2.yaml:8:5:10:56 | Job: check-execution-context | Job: check-execution-context | | .github/workflows/test7.yml:25:15:25:34 | pnpm/action-setup@v3 | Unpinned 3rd party Action 'Benchmark' step $@ uses 'pnpm/action-setup' with ref 'v3', not a pinned commit hash | .github/workflows/test7.yml:24:9:27:6 | Uses Step | Uses Step | | .github/workflows/test13.yml:15:13:15:53 | sushichop/action-repository-permission@v2 | Unpinned 3rd party Action 'test13.yml' step $@ uses 'sushichop/action-repository-permission' with ref 'v2', not a pinned commit hash | .github/workflows/test13.yml:14:7:20:4 | Uses Step | Uses Step | | .github/workflows/test17.yml:20:21:20:63 | sonarsource/sonarcloud-github-action@master | Unpinned 3rd party Action 'Sonar' step $@ uses 'sonarsource/sonarcloud-github-action' with ref 'master', not a pinned commit hash | .github/workflows/test17.yml:19:15:23:58 | Uses Step | Uses Step | | .github/workflows/test18.yml:37:21:37:63 | sonarsource/sonarcloud-github-action@master | Unpinned 3rd party Action 'Sonar' step $@ uses 'sonarsource/sonarcloud-github-action' with ref 'master', not a pinned commit hash | .github/workflows/test18.yml:36:15:40:58 | Uses Step | Uses Step | +| .github/workflows/unpinned_reusable_workflows.yml:8:11:8:56 | example/actions/.github/workflows/build.yml@v2 | Job $@ in 'Reusable workflow pinning' uses reusable workflow 'example/actions/.github/workflows/build.yml' with ref 'v2', not a pinned commit hash | .github/workflows/unpinned_reusable_workflows.yml:8:5:10:2 | Job: unpinned-tag | Job: unpinned-tag | +| .github/workflows/unpinned_reusable_workflows.yml:11:11:11:58 | example/actions/.github/workflows/build.yml@main | Job $@ in 'Reusable workflow pinning' uses reusable workflow 'example/actions/.github/workflows/build.yml' with ref 'main', not a pinned commit hash | .github/workflows/unpinned_reusable_workflows.yml:11:5:13:2 | Job: unpinned-branch | Job: unpinned-branch | +| .github/workflows/unpinned_reusable_workflows.yml:14:11:14:64 | example/actions/.github/workflows/build.yml@release/v2 | Job $@ in 'Reusable workflow pinning' uses reusable workflow 'example/actions/.github/workflows/build.yml' with ref 'release/v2', not a pinned commit hash | .github/workflows/unpinned_reusable_workflows.yml:14:5:16:2 | Job: unpinned-branch-with-slash | Job: unpinned-branch-with-slash | +| .github/workflows/unpinned_reusable_workflows.yml:17:11:17:93 | example/actions/.github/workflows/build.yml@25b062c917b0c75f8b47d8469aff6c94ffd89ab | Job $@ in 'Reusable workflow pinning' uses reusable workflow 'example/actions/.github/workflows/build.yml' with ref '25b062c917b0c75f8b47d8469aff6c94ffd89ab', not a pinned commit hash | .github/workflows/unpinned_reusable_workflows.yml:17:5:19:2 | Job: unpinned-short-sha | Job: unpinned-short-sha | | .github/workflows/unpinned_tags.yml:10:13:10:22 | foo/bar@v1 | Unpinned 3rd party Action 'unpinned_tags.yml' step $@ uses 'foo/bar' with ref 'v1', not a pinned commit hash | .github/workflows/unpinned_tags.yml:10:7:11:4 | Uses Step | Uses Step | | .github/workflows/unpinned_tags.yml:12:13:12:35 | docker://foo/bar@latest | Unpinned 3rd party Action 'unpinned_tags.yml' step $@ uses 'docker://foo/bar' with ref 'latest', not a pinned commit hash | .github/workflows/unpinned_tags.yml:12:7:13:4 | Uses Step | Uses Step | | .github/workflows/unpinned_tags.yml:19:13:19:70 | foo/bar@a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2a1b2c3d4e5 | Unpinned 3rd party Action 'unpinned_tags.yml' step $@ uses 'foo/bar' with ref 'a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2a1b2c3d4e5', not a pinned commit hash | .github/workflows/unpinned_tags.yml:19:7:19:71 | Uses Step | Uses Step | +| .github/workflows/untrusted_checkout_permission_check_reusable2.yml:24:11:24:59 | TestOrg/TestRepo/.github/workflows/build.yml@main | Job $@ in 'untrusted_checkout_permission_check_reusable2.yml' uses reusable workflow 'TestOrg/TestRepo/.github/workflows/build.yml' with ref 'main', not a pinned commit hash | .github/workflows/untrusted_checkout_permission_check_reusable2.yml:24:5:27:2 | Job: build_unsafe | Job: build_unsafe | +| .github/workflows/untrusted_checkout_permission_check_reusable2.yml:29:11:29:59 | TestOrg/TestRepo/.github/workflows/build.yml@main | Job $@ in 'untrusted_checkout_permission_check_reusable2.yml' uses reusable workflow 'TestOrg/TestRepo/.github/workflows/build.yml' with ref 'main', not a pinned commit hash | .github/workflows/untrusted_checkout_permission_check_reusable2.yml:28:5:31:101 | Job: build_safe | Job: build_safe | +| .github/workflows/untrusted_checkout_permission_check_reusable.yml:24:11:24:59 | TestOrg/TestRepo/.github/workflows/build.yml@main | Job $@ in 'untrusted_checkout_permission_check_reusable.yml' uses reusable workflow 'TestOrg/TestRepo/.github/workflows/build.yml' with ref 'main', not a pinned commit hash | .github/workflows/untrusted_checkout_permission_check_reusable.yml:23:5:26:101 | Job: build | Job: build | +| .github/workflows/untrusted_checkout_permission_check_reusable_branching_nested.yml:6:11:6:76 | TestOrg/TestRepo/.github/workflows/build_nested_branching.yml@main | Job $@ in 'untrusted_checkout_permission_check_reusable_branching_nested.yml' uses reusable workflow 'TestOrg/TestRepo/.github/workflows/build_nested_branching.yml' with ref 'main', not a pinned commit hash | .github/workflows/untrusted_checkout_permission_check_reusable_branching_nested.yml:6:5:8:60 | Job: build | Job: build | +| .github/workflows/untrusted_checkout_permission_check_reusable_level2.yml:24:11:24:66 | TestOrg/TestRepo/.github/workflows/build_nested.yml@main | Job $@ in 'untrusted_checkout_permission_check_reusable_level2.yml' uses reusable workflow 'TestOrg/TestRepo/.github/workflows/build_nested.yml' with ref 'main', not a pinned commit hash | .github/workflows/untrusted_checkout_permission_check_reusable_level2.yml:23:5:26:101 | Job: build | Job: build | +| .github/workflows/untrusted_checkout_permission_check_reusable_no_needs.yml:24:11:24:66 | TestOrg/TestRepo/.github/workflows/build_nested.yml@main | Job $@ in 'untrusted_checkout_permission_check_reusable_no_needs.yml' uses reusable workflow 'TestOrg/TestRepo/.github/workflows/build_nested.yml' with ref 'main', not a pinned commit hash | .github/workflows/untrusted_checkout_permission_check_reusable_no_needs.yml:24:5:26:60 | Job: build | Job: build | +| .github/workflows/untrusted_checkout_two_callers_both_protected.yml:24:11:24:59 | TestOrg/TestRepo/.github/workflows/build.yml@main | Job $@ in 'untrusted_checkout_two_callers_both_protected.yml' uses reusable workflow 'TestOrg/TestRepo/.github/workflows/build.yml' with ref 'main', not a pinned commit hash | .github/workflows/untrusted_checkout_two_callers_both_protected.yml:23:5:27:2 | Job: caller-a | Job: caller-a | +| .github/workflows/untrusted_checkout_two_callers_both_protected.yml:46:11:46:59 | TestOrg/TestRepo/.github/workflows/build.yml@main | Job $@ in 'untrusted_checkout_two_callers_both_protected.yml' uses reusable workflow 'TestOrg/TestRepo/.github/workflows/build.yml' with ref 'main', not a pinned commit hash | .github/workflows/untrusted_checkout_two_callers_both_protected.yml:45:5:48:60 | Job: caller-b | Job: caller-b | From 9a31d09b33312604bac3939b2b6576ead5f2f525 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 6 Aug 2026 08:29:51 +0200 Subject: [PATCH 0114/2098] unified: Update debugScopeGraph.ql --- unified/ql/lib/codeql/unified/internal/dev/debugScopeGraph.ql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/dev/debugScopeGraph.ql b/unified/ql/lib/codeql/unified/internal/dev/debugScopeGraph.ql index 2f9376b1732e..a77f8912d6fa 100644 --- a/unified/ql/lib/codeql/unified/internal/dev/debugScopeGraph.ql +++ b/unified/ql/lib/codeql/unified/internal/dev/debugScopeGraph.ql @@ -6,7 +6,7 @@ */ private import unified -private import codeql.unified.internal.Variables +private import codeql.unified.internal.LocalNameBinding /** * Holds if `node` should be shown in the graph. From 51f3acf10440280792366439d81f9d0e44076f89 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 6 Aug 2026 09:34:07 +0200 Subject: [PATCH 0115/2098] Rust: Add test for missing flow through captured variables --- rust/ql/lib/codeql/rust/controlflow/internal/Scope.qll | 3 ++- .../library-tests/dataflow/lambdas/external_file.rs | 5 +++++ .../library-tests/dataflow/lambdas/inline-flow.ext.yml | 6 ++++++ rust/ql/test/library-tests/dataflow/lambdas/main.rs | 10 ++++++++++ 4 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 rust/ql/test/library-tests/dataflow/lambdas/external_file.rs create mode 100644 rust/ql/test/library-tests/dataflow/lambdas/inline-flow.ext.yml diff --git a/rust/ql/lib/codeql/rust/controlflow/internal/Scope.qll b/rust/ql/lib/codeql/rust/controlflow/internal/Scope.qll index 303920ce7d0e..3ee1430f556e 100644 --- a/rust/ql/lib/codeql/rust/controlflow/internal/Scope.qll +++ b/rust/ql/lib/codeql/rust/controlflow/internal/Scope.qll @@ -35,7 +35,8 @@ final class CallableScope extends CfgScopeImpl, Callable { CallableScope() { // A function without a body corresponds to a trait method signature and // should not have a CFG scope. - this.hasBody() + this.hasBody() and + this.fromSource() // exclude stubs in tests defined using `additionalExternalFile` } override predicate scopeFirst(AstNode first) { diff --git a/rust/ql/test/library-tests/dataflow/lambdas/external_file.rs b/rust/ql/test/library-tests/dataflow/lambdas/external_file.rs new file mode 100644 index 000000000000..190733fd482a --- /dev/null +++ b/rust/ql/test/library-tests/dataflow/lambdas/external_file.rs @@ -0,0 +1,5 @@ +pub fn may_invoke_callback1(f: F) {} + +pub fn may_invoke_callback2(f: F) {} + +pub fn may_invoke_callback3(f: impl Fn(i64)) {} diff --git a/rust/ql/test/library-tests/dataflow/lambdas/inline-flow.ext.yml b/rust/ql/test/library-tests/dataflow/lambdas/inline-flow.ext.yml new file mode 100644 index 000000000000..542463856481 --- /dev/null +++ b/rust/ql/test/library-tests/dataflow/lambdas/inline-flow.ext.yml @@ -0,0 +1,6 @@ +extensions: + - addsTo: + pack: codeql/rust-all + extensible: additionalExternalFile + data: + - ["external_file.rs"] diff --git a/rust/ql/test/library-tests/dataflow/lambdas/main.rs b/rust/ql/test/library-tests/dataflow/lambdas/main.rs index 66295f004a22..817409bbc369 100644 --- a/rust/ql/test/library-tests/dataflow/lambdas/main.rs +++ b/rust/ql/test/library-tests/dataflow/lambdas/main.rs @@ -102,6 +102,16 @@ fn test_apply_wrap() { apply_wrap(|x| sink(x), 0); } +mod external_file; +use external_file::*; + +fn test_external_call() { + let a = source(81); + may_invoke_callback1(|x| sink(a)); // $ MISSING: hasValueFlow=81 + may_invoke_callback2(|x| sink(a)); // $ MISSING: hasValueFlow=81 + may_invoke_callback3(|x| sink(a)); // $ MISSING: hasValueFlow=81 +} + fn main() { closure_flow_out(); closure_flow_in(); From e9bd6988c82d0d085f82beb96f5d31aea720b4a4 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 6 Aug 2026 09:51:47 +0200 Subject: [PATCH 0116/2098] Rust: Assume callbacks will be invoked in library functions --- .../rust/dataflow/internal/DataFlowImpl.qll | 2 +- .../rust/dataflow/internal/ModelsAsData.qll | 34 +++++++++++++++++++ .../dataflow/lambdas/inline-flow.expected | 16 +++++++++ .../library-tests/dataflow/lambdas/main.rs | 6 ++-- 4 files changed, 54 insertions(+), 4 deletions(-) diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll index c18ac5e026b1..f466249ada99 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll @@ -440,7 +440,7 @@ module RustDataFlowGen implements InputSig or result = "self" and this.isSelf() or - result = "closure self" and this.isClosureSelf() + result = "closure-self" and this.isClosureSelf() } ParamBase getParameterIn(ParamList ps) { diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll b/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll index 8652b93f4aa9..e49d5cc21d29 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll @@ -58,6 +58,9 @@ private import codeql.rust.dataflow.FlowBarrier private import codeql.rust.dataflow.FlowSummary private import codeql.rust.dataflow.FlowSource private import codeql.rust.dataflow.FlowSink +private import codeql.rust.internal.typeinference.FunctionType +private import codeql.rust.internal.typeinference.TypeMention +private import codeql.rust.frameworks.stdlib.Stdlib /** * Holds if in a call to the function with canonical path `path`, the value referred @@ -207,6 +210,37 @@ private class SummarizedCallableFromModel extends SummarizedCallable::Range { } } +/** + * Holds if library function `f` has a callback at position `n`. In this case we + * add a flow model that achieves the effect of simulating that the callback is + * invoked, which is needed for flow through captured variables to work. + */ +private predicate mayInvokeCallback(Function f, int n) { + exists(TypeMention tm, Trait trait | + tm = f.getParam(n).getTypeRepr() and + trait = getALookupTrait(f, tm.getType()) and + trait.getSupertrait*() instanceof FnOnceTrait and + not f.fromSource() + ) +} + +private class SummarizedCallableWithCallback extends SummarizedCallable::Range { + private int pos; + + SummarizedCallableWithCallback() { mayInvokeCallback(this, pos) } + + override predicate propagatesFlow( + string input, string output, boolean preservesValue, Provenance p, boolean isExact, string model + ) { + input = "Argument[" + pos + "]" and + output = "Argument[" + pos + "].Parameter[closure-self]" and + preservesValue = true and + p = "hq-generated" and + isExact = true and + model = "heuristic-callback" + } +} + private class FlowSourceFromModel extends FlowSource::Range { private string path; diff --git a/rust/ql/test/library-tests/dataflow/lambdas/inline-flow.expected b/rust/ql/test/library-tests/dataflow/lambdas/inline-flow.expected index ca4bbe77479a..049c30c06add 100644 --- a/rust/ql/test/library-tests/dataflow/lambdas/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/lambdas/inline-flow.expected @@ -55,6 +55,12 @@ edges | main.rs:100:13:100:22 | source(...) | main.rs:100:9:100:9 | b | provenance | | | main.rs:101:17:101:17 | ... | main.rs:101:25:101:25 | x | provenance | | | main.rs:101:29:101:29 | b | main.rs:93:33:93:38 | ...: i64 | provenance | | +| main.rs:109:13:109:22 | source(...) | main.rs:110:26:110:36 | \|...\| ... : ... => .. [captured a] | provenance | | +| main.rs:109:13:109:22 | source(...) | main.rs:111:26:111:36 | \|...\| ... : ... => .. [captured a] | provenance | | +| main.rs:109:13:109:22 | source(...) | main.rs:112:26:112:36 | \|...\| ... : ... => .. [captured a] | provenance | | +| main.rs:110:26:110:36 | \|...\| ... : ... => .. [captured a] | main.rs:110:35:110:35 | a | provenance | heuristic-callback | +| main.rs:111:26:111:36 | \|...\| ... : ... => .. [captured a] | main.rs:111:35:111:35 | a | provenance | heuristic-callback | +| main.rs:112:26:112:36 | \|...\| ... : ... => .. [captured a] | main.rs:112:35:112:35 | a | provenance | heuristic-callback | nodes | main.rs:10:20:10:52 | if cond {...} else {...} | semmle.label | if cond {...} else {...} | | main.rs:10:30:10:39 | source(...) | semmle.label | source(...) | @@ -121,6 +127,13 @@ nodes | main.rs:101:17:101:17 | ... | semmle.label | ... | | main.rs:101:25:101:25 | x | semmle.label | x | | main.rs:101:29:101:29 | b | semmle.label | b | +| main.rs:109:13:109:22 | source(...) | semmle.label | source(...) | +| main.rs:110:26:110:36 | \|...\| ... : ... => .. [captured a] | semmle.label | \|...\| ... : ... => .. [captured a] | +| main.rs:110:35:110:35 | a | semmle.label | a | +| main.rs:111:26:111:36 | \|...\| ... : ... => .. [captured a] | semmle.label | \|...\| ... : ... => .. [captured a] | +| main.rs:111:35:111:35 | a | semmle.label | a | +| main.rs:112:26:112:36 | \|...\| ... : ... => .. [captured a] | semmle.label | \|...\| ... : ... => .. [captured a] | +| main.rs:112:35:112:35 | a | semmle.label | a | subpaths | main.rs:29:21:29:21 | a | main.rs:27:20:27:23 | ... | main.rs:27:26:27:52 | if cond {...} else {...} | main.rs:29:13:29:22 | f(...) | | main.rs:77:21:77:21 | a | main.rs:66:24:66:32 | ...: i64 | main.rs:66:42:72:1 | { ... } | main.rs:77:13:77:22 | f(...) | @@ -140,3 +153,6 @@ testFailures | main.rs:99:25:99:25 | x | main.rs:100:13:100:22 | source(...) | main.rs:99:25:99:25 | x | $@ | main.rs:100:13:100:22 | source(...) | source(...) | | main.rs:101:25:101:25 | x | main.rs:98:13:98:22 | source(...) | main.rs:101:25:101:25 | x | $@ | main.rs:98:13:98:22 | source(...) | source(...) | | main.rs:101:25:101:25 | x | main.rs:100:13:100:22 | source(...) | main.rs:101:25:101:25 | x | $@ | main.rs:100:13:100:22 | source(...) | source(...) | +| main.rs:110:35:110:35 | a | main.rs:109:13:109:22 | source(...) | main.rs:110:35:110:35 | a | $@ | main.rs:109:13:109:22 | source(...) | source(...) | +| main.rs:111:35:111:35 | a | main.rs:109:13:109:22 | source(...) | main.rs:111:35:111:35 | a | $@ | main.rs:109:13:109:22 | source(...) | source(...) | +| main.rs:112:35:112:35 | a | main.rs:109:13:109:22 | source(...) | main.rs:112:35:112:35 | a | $@ | main.rs:109:13:109:22 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/lambdas/main.rs b/rust/ql/test/library-tests/dataflow/lambdas/main.rs index 817409bbc369..476a7570e018 100644 --- a/rust/ql/test/library-tests/dataflow/lambdas/main.rs +++ b/rust/ql/test/library-tests/dataflow/lambdas/main.rs @@ -107,9 +107,9 @@ use external_file::*; fn test_external_call() { let a = source(81); - may_invoke_callback1(|x| sink(a)); // $ MISSING: hasValueFlow=81 - may_invoke_callback2(|x| sink(a)); // $ MISSING: hasValueFlow=81 - may_invoke_callback3(|x| sink(a)); // $ MISSING: hasValueFlow=81 + may_invoke_callback1(|x| sink(a)); // $ hasValueFlow=81 + may_invoke_callback2(|x| sink(a)); // $ hasValueFlow=81 + may_invoke_callback3(|x| sink(a)); // $ hasValueFlow=81 } fn main() { From 4e2ac7cf2674cfdb0e1df82c15fe669d044ea9a7 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema <93738568+jketema@users.noreply.github.com> Date: Thu, 6 Aug 2026 08:58:21 +0000 Subject: [PATCH 0117/2098] Unified: Clean up remainders of the standalone Swift parser --- unified/BUILD.bazel | 15 +---- unified/extractor/BUILD.bazel | 10 +-- unified/swift-syntax-rs/BUILD.bazel | 61 +++++++------------ unified/swift-syntax-rs/swift-syntax-parse.sh | 12 ---- 4 files changed, 25 insertions(+), 73 deletions(-) delete mode 100755 unified/swift-syntax-rs/swift-syntax-parse.sh diff --git a/unified/BUILD.bazel b/unified/BUILD.bazel index 405500d7d407..1539c7fd2f9d 100644 --- a/unified/BUILD.bazel +++ b/unified/BUILD.bazel @@ -43,19 +43,9 @@ codeql_pkg_files( name = "extractor-arch", exes = [ "//unified/extractor", - ], - prefix = "tools/{CODEQL_PLATFORM}", -) - -# The Swift front-end parser (wrapper + real binary + bundled Swift runtime), -# shipped next to the extractor. Only on platforms where swift-syntax builds -# (Linux/macOS); elsewhere the group is empty so the pack still builds (Swift -# extraction is simply unavailable there). -pkg_filegroup( - name = "swift-syntax-parse-arch", - srcs = select_os( + ] + select_os( + linux = ["//unified/swift-syntax-rs:swift_runtime_libs"], otherwise = [], - posix = ["//unified/swift-syntax-rs:swift-syntax-parse-pkg"], ), prefix = "tools/{CODEQL_PLATFORM}", ) @@ -66,7 +56,6 @@ codeql_pack( ":codeql-extractor-yml", ":dbscheme-group", ":extractor-arch", - ":swift-syntax-parse-arch", "//unified/tools", ], ) diff --git a/unified/extractor/BUILD.bazel b/unified/extractor/BUILD.bazel index dea196ada0e5..8b175d7fc756 100644 --- a/unified/extractor/BUILD.bazel +++ b/unified/extractor/BUILD.bazel @@ -1,12 +1,6 @@ load("//misc/bazel:rust.bzl", "codeql_rust_binary") load("//misc/bazel/3rdparty/tree_sitter_extractors_deps:defs.bzl", "aliases", "all_crate_deps") load("//unified:platforms.bzl", "UNIFIED_SUPPORTED_PLATFORMS") -load("//unified/swift-syntax-rs:swift_runtime.bzl", "swift_runtime_libs") - -swift_runtime_libs( - name = "swift_runtime_libs", - toolchain = "@swift_toolchain_ubuntu22.04//:files", -) exports_files(["Cargo.toml"]) @@ -19,8 +13,8 @@ codeql_rust_binary( "swift_node_types.yml", ], data = select({ - "@platforms//os:macos": [], - "@platforms//os:linux": [":swift_runtime_libs"], + "@platforms//os:linux": ["//unified/swift-syntax-rs:swift_runtime_libs"], + "//conditions:default": [], }), proc_macro_deps = all_crate_deps( proc_macro = True, diff --git a/unified/swift-syntax-rs/BUILD.bazel b/unified/swift-syntax-rs/BUILD.bazel index 8f2a5886fd22..0f04f3e9182c 100644 --- a/unified/swift-syntax-rs/BUILD.bazel +++ b/unified/swift-syntax-rs/BUILD.bazel @@ -1,6 +1,5 @@ +load("@rules_cc//cc:defs.bzl", "cc_library") load("@rules_rust//rust:defs.bzl", "rust_binary", "rust_library", "rust_test") -load("@rules_shell//shell:sh_binary.bzl", "sh_binary") -load("//misc/bazel:pkg.bzl", "codeql_pkg_runfiles") load("//unified:platforms.bzl", "UNIFIED_SUPPORTED_PLATFORMS") load(":swift_runtime.bzl", "swift_runtime_libs") load(":xcode_transition.bzl", "xcode_transition_swift_library") @@ -12,8 +11,18 @@ swift_runtime_libs( toolchain = "@swift_toolchain_ubuntu22.04//:files", ) -# Swift FFI shim: wraps swift-syntax and exposes a small C ABI. The Rust -# targets below link against its `CcInfo`. +# The `$ORIGIN` runpath makes an executable look beside itself instead, so +# we find the Swift runtime libraries we bundle with the extractor. +cc_library( + name = "swift_runtime_rpath", + linkopts = select({ + "@platforms//os:linux": ["-Wl,-rpath,$$ORIGIN"], + "//conditions:default": [], + }), + target_compatible_with = UNIFIED_SUPPORTED_PLATFORMS, +) + +# Swift FFI shim: wraps swift-syntax and exposes a small C ABI. xcode_transition_swift_library( name = "swift_syntax_ffi", srcs = ["swift/Sources/SwiftSyntaxFFI/SwiftSyntaxFFI.swift"], @@ -27,7 +36,7 @@ xcode_transition_swift_library( ) # Safe Rust bindings on top of the C ABI. Under Bazel the Swift side comes -# from `:swift_syntax_ffi`; `build.rs` is only used by the `cargo` workflow. +# from `:swift_syntax_ffi`. rust_library( name = "swift_syntax_rs", srcs = glob( @@ -37,61 +46,33 @@ rust_library( edition = "2024", target_compatible_with = UNIFIED_SUPPORTED_PLATFORMS, deps = [ + ":swift_runtime_rpath", ":swift_syntax_ffi", ], ) -# The Swift front-end parser. We ship it like `//swift/extractor`: a small shell -# wrapper (`swift-syntax-parse`) sets `LD_LIBRARY_PATH`/`DYLD_LIBRARY_PATH` to its -# own directory and execs the real binary (`swift-syntax-parse.real`); the Swift -# runtime shared libraries are packaged alongside them. `parse.rs` resolves the -# wrapper as a sibling of the extractor executable. +# A debugging aid, for looking at the raw swift-syntax JSON for some input: +# +# echo 'let x = 1' | bazel run //unified/swift-syntax-rs:swift-syntax-parse rust_binary( - name = "swift-syntax-parse.real", + name = "swift-syntax-parse", srcs = ["src/main.rs"], - # Target name carries `.real` (invalid in a crate name), so set it explicitly. - crate_name = "swift_syntax_parse", - # On Linux, carry the toolchain's runtime shared libraries as runfiles so - # they get packaged next to the binary. On macOS the OS provides the Swift - # runtime, so nothing extra is bundled. data = select({ - "@platforms//os:macos": [], "@platforms//os:linux": [":swift_runtime_libs"], + "//conditions:default": [], }), edition = "2024", target_compatible_with = UNIFIED_SUPPORTED_PLATFORMS, deps = [":swift_syntax_rs"], ) -# `swift-syntax-parse` wrapper (see `swift-syntax-parse.sh`). Its runfiles carry -# the real binary and the runtime libraries; packaging flattens them into one -# directory. -sh_binary( - name = "swift-syntax-parse", - srcs = ["swift-syntax-parse.sh"], - data = [":swift-syntax-parse.real"], - target_compatible_with = UNIFIED_SUPPORTED_PLATFORMS, -) - -# Packaged form for the extractor pack: the wrapper (as `swift-syntax-parse`), -# the real binary, and the runtime libraries, flattened into one directory. -codeql_pkg_runfiles( - name = "swift-syntax-parse-pkg", - # The `.sh` source is shipped as `swift-syntax-parse` (the wrapper); drop the - # original filename. - excludes = ["swift-syntax-parse.sh"], - exes = [":swift-syntax-parse"], - target_compatible_with = UNIFIED_SUPPORTED_PLATFORMS, - visibility = ["//unified:__pkg__"], -) - rust_test( name = "swift_syntax_rs_test", size = "small", crate = ":swift_syntax_rs", data = select({ - "@platforms//os:macos": [], "@platforms//os:linux": [":swift_runtime_libs"], + "//conditions:default": [], }), edition = "2024", target_compatible_with = UNIFIED_SUPPORTED_PLATFORMS, diff --git a/unified/swift-syntax-rs/swift-syntax-parse.sh b/unified/swift-syntax-rs/swift-syntax-parse.sh deleted file mode 100755 index 811697c820c6..000000000000 --- a/unified/swift-syntax-rs/swift-syntax-parse.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -# Wrapper that lets the shipped `swift-syntax-parse` find its Swift runtime -# libraries, which are packaged in the same directory as this script (and the -# real binary). Mirrors `swift/extractor/extractor.sh`. -if [[ "$(uname)" == Darwin ]]; then - export DYLD_LIBRARY_PATH=$(dirname "$0") -else - export LD_LIBRARY_PATH=$(dirname "$0") -fi - -exec -a "$0" "$0.real" "$@" From 08359ecc226d5123663d93ef5a5dbe3d1e3983d4 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 6 Aug 2026 11:38:33 +0200 Subject: [PATCH 0118/2098] unified: Standardsize toString doc --- unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index 8c78a187b766..0df235d521fd 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -310,7 +310,7 @@ module Public { * A representative for a lexically scoped entity, such as a local variable, type name, or module name. */ class LocalName instanceof LocalNameBindingOutput::Local { - /** Gets the name of this local, as a string. */ + /** Gets a textual representation of this local entity. */ string toString() { result = super.toString() } /** Gets the location of this local name's first declaration */ From c782bf39866ea423eb69395fe8cb4401da267fde Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 6 Aug 2026 11:43:53 +0200 Subject: [PATCH 0119/2098] Shared: Shadow isAfterValue on ControlFlowNode. --- .../codeql/controlflow/ControlFlowGraph.qll | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll index 2b5ae0402847..920da5dd04ef 100644 --- a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll +++ b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll @@ -2053,6 +2053,33 @@ module Make0 Ast> { result = this.getASuccessor(any(ExceptionSuccessor t)) } + /* + * Note that the following 3 predicates, `isAfterValue`, + * `isAfterTrue`, and `isAfterFalse`, shadow their counterparts in + * `PreControlFlowNode`, and that their semantics are slightly + * different. + * + * This is because, in `PreControlFlowNode`, during CFG construction, + * we need to identify the control flow node that results from the + * evaluation of an AST node to a certain value, but that control + * flow node may or may not encode that fact. In contrast, in + * `ControlFlowNode`, we instead want to know what the node actually + * encodes. + */ + + /** Holds if this node indicates that `n` evaluates to the value `t`. */ + predicate isAfterValue(AstNode n, ConditionalSuccessor t) { this = TAfterValueNode(n, t) } + + /** Holds if this node indicates that `n` evaluates to the value `true`. */ + predicate isAfterTrue(AstNode n) { + this = TAfterValueNode(n, any(BooleanSuccessor b | b.getValue() = true)) + } + + /** Holds if this node indicates that `n` evaluates to the value `false`. */ + predicate isAfterFalse(AstNode n) { + this = TAfterValueNode(n, any(BooleanSuccessor b | b.getValue() = false)) + } + /** * Holds if this node dominates `that` node. * From 8d9792ab7d46fae73a451033c2320d095732580a Mon Sep 17 00:00:00 2001 From: Jeroen Ketema <93738568+jketema@users.noreply.github.com> Date: Thu, 6 Aug 2026 09:55:59 +0000 Subject: [PATCH 0120/2098] Unified: Make test runnable under Bazel --- unified/extractor/BUILD.bazel | 52 +++++++++++++++++++++++++ unified/extractor/tests/corpus_tests.rs | 21 +++++++++- 2 files changed, 72 insertions(+), 1 deletion(-) diff --git a/unified/extractor/BUILD.bazel b/unified/extractor/BUILD.bazel index 8b175d7fc756..7959ffe384ad 100644 --- a/unified/extractor/BUILD.bazel +++ b/unified/extractor/BUILD.bazel @@ -1,3 +1,4 @@ +load("@rules_rust//rust:defs.bzl", "rust_test") load("//misc/bazel:rust.bzl", "codeql_rust_binary") load("//misc/bazel/3rdparty/tree_sitter_extractors_deps:defs.bzl", "aliases", "all_crate_deps") load("//unified:platforms.bzl", "UNIFIED_SUPPORTED_PLATFORMS") @@ -29,3 +30,54 @@ codeql_rust_binary( "//unified/swift-syntax-rs:swift_syntax_rs", ], ) + +_TESTS = { + "corpus_tests": { + "data": glob(["tests/corpus/**"]), + "compile_data": [], + "size": "medium", + }, + # `include_str!`s a checked-in `parse_to_json` dump. + "swift_syntax_pipeline": { + "data": [], + "compile_data": glob(["tests/fixtures/**"]), + "size": "small", + }, +} + +[ + rust_test( + name = test_name, + size = spec["size"], + srcs = ["tests/%s.rs" % test_name] + glob(["src/**/*.rs"]), + aliases = aliases(), + compile_data = [ + "ast_types.yml", + "swift_node_types.yml", + ] + spec["compile_data"], + crate_root = "tests/%s.rs" % test_name, + data = spec["data"] + select({ + "@platforms//os:linux": ["//unified/swift-syntax-rs:swift_runtime_libs"], + "//conditions:default": [], + }), + edition = "2024", + proc_macro_deps = all_crate_deps( + proc_macro = True, + ), + rustc_flags = ["--cfg=bazel"], + target_compatible_with = UNIFIED_SUPPORTED_PLATFORMS, + deps = all_crate_deps( + normal = True, + ) + [ + "//shared/tree-sitter-extractor", + "//shared/yeast", + "//unified/swift-syntax-rs:swift_syntax_rs", + ], + ) + for test_name, spec in _TESTS.items() +] + +test_suite( + name = "all_tests", + tests = [":%s" % test_name for test_name in _TESTS], +) diff --git a/unified/extractor/tests/corpus_tests.rs b/unified/extractor/tests/corpus_tests.rs index 39cbab3194c7..319503ce4b63 100644 --- a/unified/extractor/tests/corpus_tests.rs +++ b/unified/extractor/tests/corpus_tests.rs @@ -96,11 +96,30 @@ fn collect_corpus_stems(dir: &Path, out: &mut Vec) { } } +#[cfg(bazel)] +fn corpus_dir() -> std::path::PathBuf { + let base = std::path::PathBuf::from( + std::env::var("RUNFILES_DIR").expect("RUNFILES_DIR not set"), + ); + std::fs::read_dir(&base) + .expect("failed to read RUNFILES_DIR") + .filter_map(Result::ok) + .map(|entry| entry.path().join("unified/extractor/tests/corpus")) + .find(|path| path.exists()) + .expect("corpus not found under any runfiles repo root") +} + +#[cfg(not(bazel))] +fn corpus_dir() -> std::path::PathBuf { + std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("tests/corpus") +} + + #[test] fn test_corpus() { let update_mode = update_mode_enabled(); let all_languages = languages::all_language_specs(); - let corpus_dir = Path::new("tests/corpus"); + let corpus_dir = corpus_dir(); for lang in all_languages { let output_schema = yeast::node_types_yaml::schema_from_yaml(languages::OUTPUT_AST_SCHEMA) From fae4a92773122bad91bde11242d67826ad69252b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 6 Aug 2026 10:37:58 +0000 Subject: [PATCH 0121/2098] Release preparation for version 2.26.3 --- actions/ql/lib/CHANGELOG.md | 10 ++++++++++ .../2026-07-27-merge-group-event-source.md | 4 ---- ...-08-04-remove-self-hosted-query-library.md | 4 ---- actions/ql/lib/change-notes/released/0.5.0.md | 9 +++++++++ actions/ql/lib/codeql-pack.release.yml | 2 +- actions/ql/lib/qlpack.yml | 2 +- actions/ql/src/CHANGELOG.md | 19 +++++++++++++++++++ .../2026-07-18-envvar-injection-precision.md | 4 ---- ...26-07-18-read-only-default-branch-cache.md | 4 ---- .../2026-07-28-checkout-provenance.md | 4 ---- .../2026-07-28-output-clobbering-regex.md | 4 ---- .../2026-07-28-schedule-event-mapping.md | 4 ---- ...26-07-29-output-clobbering-jq-precision.md | 4 ---- .../2026-07-29-output-clobbering-messages.md | 4 ---- ...-cache-poisoning-code-injection-wording.md | 4 ---- .../ql/src/change-notes/released/0.6.33.md | 18 ++++++++++++++++++ actions/ql/src/codeql-pack.release.yml | 2 +- actions/ql/src/qlpack.yml | 2 +- cpp/ql/lib/CHANGELOG.md | 6 ++++++ .../change-notes/2026-07-28-winreg-sources.md | 4 ---- cpp/ql/lib/change-notes/released/12.0.2.md | 5 +++++ cpp/ql/lib/codeql-pack.release.yml | 2 +- cpp/ql/lib/qlpack.yml | 2 +- cpp/ql/src/CHANGELOG.md | 4 ++++ cpp/ql/src/change-notes/released/1.8.1.md | 3 +++ cpp/ql/src/codeql-pack.release.yml | 2 +- cpp/ql/src/qlpack.yml | 2 +- .../ql/campaigns/Solorigate/lib/CHANGELOG.md | 4 ++++ .../lib/change-notes/released/1.7.72.md | 3 +++ .../Solorigate/lib/codeql-pack.release.yml | 2 +- csharp/ql/campaigns/Solorigate/lib/qlpack.yml | 2 +- .../ql/campaigns/Solorigate/src/CHANGELOG.md | 4 ++++ .../src/change-notes/released/1.7.72.md | 3 +++ .../Solorigate/src/codeql-pack.release.yml | 2 +- csharp/ql/campaigns/Solorigate/src/qlpack.yml | 2 +- csharp/ql/lib/CHANGELOG.md | 4 ++++ csharp/ql/lib/change-notes/released/7.1.2.md | 3 +++ csharp/ql/lib/codeql-pack.release.yml | 2 +- csharp/ql/lib/qlpack.yml | 2 +- csharp/ql/src/CHANGELOG.md | 4 ++++ csharp/ql/src/change-notes/released/1.9.1.md | 3 +++ csharp/ql/src/codeql-pack.release.yml | 2 +- csharp/ql/src/qlpack.yml | 2 +- go/ql/consistency-queries/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.55.md | 3 +++ .../codeql-pack.release.yml | 2 +- go/ql/consistency-queries/qlpack.yml | 2 +- go/ql/lib/CHANGELOG.md | 4 ++++ go/ql/lib/change-notes/released/7.2.3.md | 3 +++ go/ql/lib/codeql-pack.release.yml | 2 +- go/ql/lib/qlpack.yml | 2 +- go/ql/src/CHANGELOG.md | 4 ++++ go/ql/src/change-notes/released/1.6.8.md | 3 +++ go/ql/src/codeql-pack.release.yml | 2 +- go/ql/src/qlpack.yml | 2 +- java/ql/lib/CHANGELOG.md | 4 ++++ java/ql/lib/change-notes/released/9.2.3.md | 3 +++ java/ql/lib/codeql-pack.release.yml | 2 +- java/ql/lib/qlpack.yml | 2 +- java/ql/src/CHANGELOG.md | 4 ++++ java/ql/src/change-notes/released/1.11.8.md | 3 +++ java/ql/src/codeql-pack.release.yml | 2 +- java/ql/src/qlpack.yml | 2 +- javascript/ql/lib/CHANGELOG.md | 15 +++++++++++++++ .../2026-07-07-sails-action2-inputs.md | 4 ---- .../2026-07-16-vue-router-useRoute-query.md | 5 ----- .../2026-07-31-file-scoped-models.md | 6 ------ ...2026-08-01-client-response-promise-data.md | 4 ---- .../ql/lib/change-notes/released/2.9.0.md | 14 ++++++++++++++ javascript/ql/lib/codeql-pack.release.yml | 2 +- javascript/ql/lib/qlpack.yml | 2 +- javascript/ql/src/CHANGELOG.md | 6 ++++++ .../2.4.3.md} | 7 ++++--- javascript/ql/src/codeql-pack.release.yml | 2 +- javascript/ql/src/qlpack.yml | 2 +- misc/suite-helpers/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.55.md | 3 +++ misc/suite-helpers/codeql-pack.release.yml | 2 +- misc/suite-helpers/qlpack.yml | 2 +- python/ql/lib/CHANGELOG.md | 4 ++++ python/ql/lib/change-notes/released/7.2.3.md | 3 +++ python/ql/lib/codeql-pack.release.yml | 2 +- python/ql/lib/qlpack.yml | 2 +- python/ql/src/CHANGELOG.md | 4 ++++ python/ql/src/change-notes/released/1.8.8.md | 3 +++ python/ql/src/codeql-pack.release.yml | 2 +- python/ql/src/qlpack.yml | 2 +- ruby/ql/lib/CHANGELOG.md | 6 ++++++ .../6.0.3.md} | 7 ++++--- ruby/ql/lib/codeql-pack.release.yml | 2 +- ruby/ql/lib/qlpack.yml | 2 +- ruby/ql/src/CHANGELOG.md | 4 ++++ ruby/ql/src/change-notes/released/1.6.8.md | 3 +++ ruby/ql/src/codeql-pack.release.yml | 2 +- ruby/ql/src/qlpack.yml | 2 +- rust/ql/lib/CHANGELOG.md | 4 ++++ rust/ql/lib/change-notes/released/0.2.19.md | 3 +++ rust/ql/lib/codeql-pack.release.yml | 2 +- rust/ql/lib/qlpack.yml | 2 +- rust/ql/src/CHANGELOG.md | 4 ++++ rust/ql/src/change-notes/released/0.1.40.md | 3 +++ rust/ql/src/codeql-pack.release.yml | 2 +- rust/ql/src/qlpack.yml | 2 +- shared/concepts/CHANGELOG.md | 4 ++++ .../concepts/change-notes/released/0.0.29.md | 3 +++ shared/concepts/codeql-pack.release.yml | 2 +- shared/concepts/qlpack.yml | 2 +- shared/controlflow/CHANGELOG.md | 4 ++++ .../change-notes/released/2.0.39.md | 3 +++ shared/controlflow/codeql-pack.release.yml | 2 +- shared/controlflow/qlpack.yml | 2 +- shared/dataflow/CHANGELOG.md | 4 ++++ .../dataflow/change-notes/released/2.1.11.md | 3 +++ shared/dataflow/codeql-pack.release.yml | 2 +- shared/dataflow/qlpack.yml | 2 +- shared/mad/CHANGELOG.md | 4 ++++ shared/mad/change-notes/released/1.0.55.md | 3 +++ shared/mad/codeql-pack.release.yml | 2 +- shared/mad/qlpack.yml | 2 +- shared/namebinding/CHANGELOG.md | 4 ++++ .../change-notes/released/0.0.4.md | 3 +++ shared/namebinding/codeql-pack.release.yml | 2 +- shared/namebinding/qlpack.yml | 2 +- shared/quantum/CHANGELOG.md | 4 ++++ .../quantum/change-notes/released/0.0.33.md | 3 +++ shared/quantum/codeql-pack.release.yml | 2 +- shared/quantum/qlpack.yml | 2 +- shared/rangeanalysis/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.55.md | 3 +++ shared/rangeanalysis/codeql-pack.release.yml | 2 +- shared/rangeanalysis/qlpack.yml | 2 +- shared/regex/CHANGELOG.md | 4 ++++ shared/regex/change-notes/released/1.0.55.md | 3 +++ shared/regex/codeql-pack.release.yml | 2 +- shared/regex/qlpack.yml | 2 +- shared/ssa/CHANGELOG.md | 4 ++++ shared/ssa/change-notes/released/2.0.31.md | 3 +++ shared/ssa/codeql-pack.release.yml | 2 +- shared/ssa/qlpack.yml | 2 +- shared/threat-models/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.55.md | 3 +++ shared/threat-models/codeql-pack.release.yml | 2 +- shared/threat-models/qlpack.yml | 2 +- shared/tutorial/CHANGELOG.md | 4 ++++ .../tutorial/change-notes/released/1.0.55.md | 3 +++ shared/tutorial/codeql-pack.release.yml | 2 +- shared/tutorial/qlpack.yml | 2 +- shared/typeflow/CHANGELOG.md | 4 ++++ .../typeflow/change-notes/released/1.0.55.md | 3 +++ shared/typeflow/codeql-pack.release.yml | 2 +- shared/typeflow/qlpack.yml | 2 +- shared/typeinference/CHANGELOG.md | 4 ++++ .../change-notes/released/0.0.36.md | 3 +++ shared/typeinference/codeql-pack.release.yml | 2 +- shared/typeinference/qlpack.yml | 2 +- shared/typetracking/CHANGELOG.md | 4 ++++ .../change-notes/released/2.0.39.md | 3 +++ shared/typetracking/codeql-pack.release.yml | 2 +- shared/typetracking/qlpack.yml | 2 +- shared/typos/CHANGELOG.md | 4 ++++ shared/typos/change-notes/released/1.0.55.md | 3 +++ shared/typos/codeql-pack.release.yml | 2 +- shared/typos/qlpack.yml | 2 +- shared/util/CHANGELOG.md | 4 ++++ shared/util/change-notes/released/2.0.42.md | 3 +++ shared/util/codeql-pack.release.yml | 2 +- shared/util/qlpack.yml | 2 +- shared/xml/CHANGELOG.md | 4 ++++ shared/xml/change-notes/released/1.0.55.md | 3 +++ shared/xml/codeql-pack.release.yml | 2 +- shared/xml/qlpack.yml | 2 +- shared/yaml/CHANGELOG.md | 4 ++++ shared/yaml/change-notes/released/1.0.55.md | 3 +++ shared/yaml/codeql-pack.release.yml | 2 +- shared/yaml/qlpack.yml | 2 +- swift/ql/lib/CHANGELOG.md | 4 ++++ swift/ql/lib/change-notes/released/6.8.1.md | 3 +++ swift/ql/lib/codeql-pack.release.yml | 2 +- swift/ql/lib/qlpack.yml | 2 +- swift/ql/src/CHANGELOG.md | 4 ++++ swift/ql/src/change-notes/released/1.3.8.md | 3 +++ swift/ql/src/codeql-pack.release.yml | 2 +- swift/ql/src/qlpack.yml | 2 +- 183 files changed, 452 insertions(+), 153 deletions(-) delete mode 100644 actions/ql/lib/change-notes/2026-07-27-merge-group-event-source.md delete mode 100644 actions/ql/lib/change-notes/2026-08-04-remove-self-hosted-query-library.md create mode 100644 actions/ql/lib/change-notes/released/0.5.0.md delete mode 100644 actions/ql/src/change-notes/2026-07-18-envvar-injection-precision.md delete mode 100644 actions/ql/src/change-notes/2026-07-18-read-only-default-branch-cache.md delete mode 100644 actions/ql/src/change-notes/2026-07-28-checkout-provenance.md delete mode 100644 actions/ql/src/change-notes/2026-07-28-output-clobbering-regex.md delete mode 100644 actions/ql/src/change-notes/2026-07-28-schedule-event-mapping.md delete mode 100644 actions/ql/src/change-notes/2026-07-29-output-clobbering-jq-precision.md delete mode 100644 actions/ql/src/change-notes/2026-07-29-output-clobbering-messages.md delete mode 100644 actions/ql/src/change-notes/2026-07-31-cache-poisoning-code-injection-wording.md create mode 100644 actions/ql/src/change-notes/released/0.6.33.md delete mode 100644 cpp/ql/lib/change-notes/2026-07-28-winreg-sources.md create mode 100644 cpp/ql/lib/change-notes/released/12.0.2.md create mode 100644 cpp/ql/src/change-notes/released/1.8.1.md create mode 100644 csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.72.md create mode 100644 csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.72.md create mode 100644 csharp/ql/lib/change-notes/released/7.1.2.md create mode 100644 csharp/ql/src/change-notes/released/1.9.1.md create mode 100644 go/ql/consistency-queries/change-notes/released/1.0.55.md create mode 100644 go/ql/lib/change-notes/released/7.2.3.md create mode 100644 go/ql/src/change-notes/released/1.6.8.md create mode 100644 java/ql/lib/change-notes/released/9.2.3.md create mode 100644 java/ql/src/change-notes/released/1.11.8.md delete mode 100644 javascript/ql/lib/change-notes/2026-07-07-sails-action2-inputs.md delete mode 100644 javascript/ql/lib/change-notes/2026-07-16-vue-router-useRoute-query.md delete mode 100644 javascript/ql/lib/change-notes/2026-07-31-file-scoped-models.md delete mode 100644 javascript/ql/lib/change-notes/2026-08-01-client-response-promise-data.md create mode 100644 javascript/ql/lib/change-notes/released/2.9.0.md rename javascript/ql/src/change-notes/{2026-07-22-fastify-rate-limit.md => released/2.4.3.md} (71%) create mode 100644 misc/suite-helpers/change-notes/released/1.0.55.md create mode 100644 python/ql/lib/change-notes/released/7.2.3.md create mode 100644 python/ql/src/change-notes/released/1.8.8.md rename ruby/ql/lib/change-notes/{2026-08-05-vendored-lib-taint.md => released/6.0.3.md} (87%) create mode 100644 ruby/ql/src/change-notes/released/1.6.8.md create mode 100644 rust/ql/lib/change-notes/released/0.2.19.md create mode 100644 rust/ql/src/change-notes/released/0.1.40.md create mode 100644 shared/concepts/change-notes/released/0.0.29.md create mode 100644 shared/controlflow/change-notes/released/2.0.39.md create mode 100644 shared/dataflow/change-notes/released/2.1.11.md create mode 100644 shared/mad/change-notes/released/1.0.55.md create mode 100644 shared/namebinding/change-notes/released/0.0.4.md create mode 100644 shared/quantum/change-notes/released/0.0.33.md create mode 100644 shared/rangeanalysis/change-notes/released/1.0.55.md create mode 100644 shared/regex/change-notes/released/1.0.55.md create mode 100644 shared/ssa/change-notes/released/2.0.31.md create mode 100644 shared/threat-models/change-notes/released/1.0.55.md create mode 100644 shared/tutorial/change-notes/released/1.0.55.md create mode 100644 shared/typeflow/change-notes/released/1.0.55.md create mode 100644 shared/typeinference/change-notes/released/0.0.36.md create mode 100644 shared/typetracking/change-notes/released/2.0.39.md create mode 100644 shared/typos/change-notes/released/1.0.55.md create mode 100644 shared/util/change-notes/released/2.0.42.md create mode 100644 shared/xml/change-notes/released/1.0.55.md create mode 100644 shared/yaml/change-notes/released/1.0.55.md create mode 100644 swift/ql/lib/change-notes/released/6.8.1.md create mode 100644 swift/ql/src/change-notes/released/1.3.8.md diff --git a/actions/ql/lib/CHANGELOG.md b/actions/ql/lib/CHANGELOG.md index 630b089310b9..ea32d9c07193 100644 --- a/actions/ql/lib/CHANGELOG.md +++ b/actions/ql/lib/CHANGELOG.md @@ -1,3 +1,13 @@ +## 0.5.0 + +### Breaking Changes + +* The `codeql.actions.security.SelfHostedQuery` module has been removed because runner labels do not reliably distinguish self-hosted runners from managed runners. + +### Minor Analysis Improvements + +* GitHub Actions analysis now recognizes untrusted data in `github.event.merge_group` for workflows triggered by the `merge_group` event. + ## 0.4.40 ### Minor Analysis Improvements diff --git a/actions/ql/lib/change-notes/2026-07-27-merge-group-event-source.md b/actions/ql/lib/change-notes/2026-07-27-merge-group-event-source.md deleted file mode 100644 index 41b39b6c452f..000000000000 --- a/actions/ql/lib/change-notes/2026-07-27-merge-group-event-source.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* GitHub Actions analysis now recognizes untrusted data in `github.event.merge_group` for workflows triggered by the `merge_group` event. \ No newline at end of file diff --git a/actions/ql/lib/change-notes/2026-08-04-remove-self-hosted-query-library.md b/actions/ql/lib/change-notes/2026-08-04-remove-self-hosted-query-library.md deleted file mode 100644 index 562b519e001a..000000000000 --- a/actions/ql/lib/change-notes/2026-08-04-remove-self-hosted-query-library.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: breaking ---- -* The `codeql.actions.security.SelfHostedQuery` module has been removed because runner labels do not reliably distinguish self-hosted runners from managed runners. diff --git a/actions/ql/lib/change-notes/released/0.5.0.md b/actions/ql/lib/change-notes/released/0.5.0.md new file mode 100644 index 000000000000..3e89301899bd --- /dev/null +++ b/actions/ql/lib/change-notes/released/0.5.0.md @@ -0,0 +1,9 @@ +## 0.5.0 + +### Breaking Changes + +* The `codeql.actions.security.SelfHostedQuery` module has been removed because runner labels do not reliably distinguish self-hosted runners from managed runners. + +### Minor Analysis Improvements + +* GitHub Actions analysis now recognizes untrusted data in `github.event.merge_group` for workflows triggered by the `merge_group` event. diff --git a/actions/ql/lib/codeql-pack.release.yml b/actions/ql/lib/codeql-pack.release.yml index 8f5be10acbe6..30e271c5361c 100644 --- a/actions/ql/lib/codeql-pack.release.yml +++ b/actions/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.4.40 +lastReleaseVersion: 0.5.0 diff --git a/actions/ql/lib/qlpack.yml b/actions/ql/lib/qlpack.yml index 5111dd27cc89..859c7eb4a6f4 100644 --- a/actions/ql/lib/qlpack.yml +++ b/actions/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-all -version: 0.4.41-dev +version: 0.5.0 library: true warnOnImplicitThis: true dependencies: diff --git a/actions/ql/src/CHANGELOG.md b/actions/ql/src/CHANGELOG.md index bc013b962f80..84f8321799d8 100644 --- a/actions/ql/src/CHANGELOG.md +++ b/actions/ql/src/CHANGELOG.md @@ -1,3 +1,22 @@ +## 0.6.33 + +### Query Metadata Changes + +* The name and alert message of the `actions/cache-poisoning/code-injection` query have been reworded for clarity. + +### Minor Analysis Improvements + +* The `actions/output-clobbering/high` query no longer reports simple `jq` path filters when their output remains JSON-encoded. Raw-output modes, complex filters, and unrecognized options remain reportable. +* GitHub Actions queries now correctly classify the `schedule` event when determining whether a workflow is externally triggerable. +* The `actions/envvar-injection/critical` query now requires the untrusted source and privileged context to originate from the same trigger event. The environment variable injection queries also no longer treat pull request head labels as injection-capable because they cannot contain newlines. +* The `actions/cache-poisoning/code-injection`, `actions/cache-poisoning/direct-cache`, and `actions/cache-poisoning/poisonable-step` queries now account for read-only cache access on low-trust triggers that run in the default branch scope. Results are retained for triggers that GitHub allows to write to that cache scope. + +### Bug Fixes + +* The `actions/output-clobbering/high` query now provides messages tailored to the affected output channel and includes expanded documentation and recommendations. +* The `actions/cache-poisoning/poisonable-step` and `actions/untrusted-checkout/critical` queries now start paths at the expressions that control untrusted checkouts and link their alert messages to those expressions. +* Fixed a performance issue in the `actions/output-clobbering/high` query caused by using unescaped source-code input in a regular expression. + ## 0.6.32 No user-facing changes. diff --git a/actions/ql/src/change-notes/2026-07-18-envvar-injection-precision.md b/actions/ql/src/change-notes/2026-07-18-envvar-injection-precision.md deleted file mode 100644 index c5bc9ba79bf1..000000000000 --- a/actions/ql/src/change-notes/2026-07-18-envvar-injection-precision.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The `actions/envvar-injection/critical` query now requires the untrusted source and privileged context to originate from the same trigger event. The environment variable injection queries also no longer treat pull request head labels as injection-capable because they cannot contain newlines. diff --git a/actions/ql/src/change-notes/2026-07-18-read-only-default-branch-cache.md b/actions/ql/src/change-notes/2026-07-18-read-only-default-branch-cache.md deleted file mode 100644 index 9952be542003..000000000000 --- a/actions/ql/src/change-notes/2026-07-18-read-only-default-branch-cache.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The `actions/cache-poisoning/code-injection`, `actions/cache-poisoning/direct-cache`, and `actions/cache-poisoning/poisonable-step` queries now account for read-only cache access on low-trust triggers that run in the default branch scope. Results are retained for triggers that GitHub allows to write to that cache scope. diff --git a/actions/ql/src/change-notes/2026-07-28-checkout-provenance.md b/actions/ql/src/change-notes/2026-07-28-checkout-provenance.md deleted file mode 100644 index 9a1bb29be1d9..000000000000 --- a/actions/ql/src/change-notes/2026-07-28-checkout-provenance.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: fix ---- -* The `actions/cache-poisoning/poisonable-step` and `actions/untrusted-checkout/critical` queries now start paths at the expressions that control untrusted checkouts and link their alert messages to those expressions. diff --git a/actions/ql/src/change-notes/2026-07-28-output-clobbering-regex.md b/actions/ql/src/change-notes/2026-07-28-output-clobbering-regex.md deleted file mode 100644 index d9e84a447c91..000000000000 --- a/actions/ql/src/change-notes/2026-07-28-output-clobbering-regex.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: fix ---- -* Fixed a performance issue in the `actions/output-clobbering/high` query caused by using unescaped source-code input in a regular expression. diff --git a/actions/ql/src/change-notes/2026-07-28-schedule-event-mapping.md b/actions/ql/src/change-notes/2026-07-28-schedule-event-mapping.md deleted file mode 100644 index ff949c266d08..000000000000 --- a/actions/ql/src/change-notes/2026-07-28-schedule-event-mapping.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* GitHub Actions queries now correctly classify the `schedule` event when determining whether a workflow is externally triggerable. diff --git a/actions/ql/src/change-notes/2026-07-29-output-clobbering-jq-precision.md b/actions/ql/src/change-notes/2026-07-29-output-clobbering-jq-precision.md deleted file mode 100644 index 9fba403a5715..000000000000 --- a/actions/ql/src/change-notes/2026-07-29-output-clobbering-jq-precision.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The `actions/output-clobbering/high` query no longer reports simple `jq` path filters when their output remains JSON-encoded. Raw-output modes, complex filters, and unrecognized options remain reportable. diff --git a/actions/ql/src/change-notes/2026-07-29-output-clobbering-messages.md b/actions/ql/src/change-notes/2026-07-29-output-clobbering-messages.md deleted file mode 100644 index 4abb7a029762..000000000000 --- a/actions/ql/src/change-notes/2026-07-29-output-clobbering-messages.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: fix ---- -* The `actions/output-clobbering/high` query now provides messages tailored to the affected output channel and includes expanded documentation and recommendations. diff --git a/actions/ql/src/change-notes/2026-07-31-cache-poisoning-code-injection-wording.md b/actions/ql/src/change-notes/2026-07-31-cache-poisoning-code-injection-wording.md deleted file mode 100644 index 8e2ade04f8b0..000000000000 --- a/actions/ql/src/change-notes/2026-07-31-cache-poisoning-code-injection-wording.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: queryMetadata ---- -* The name and alert message of the `actions/cache-poisoning/code-injection` query have been reworded for clarity. \ No newline at end of file diff --git a/actions/ql/src/change-notes/released/0.6.33.md b/actions/ql/src/change-notes/released/0.6.33.md new file mode 100644 index 000000000000..86351b4c9158 --- /dev/null +++ b/actions/ql/src/change-notes/released/0.6.33.md @@ -0,0 +1,18 @@ +## 0.6.33 + +### Query Metadata Changes + +* The name and alert message of the `actions/cache-poisoning/code-injection` query have been reworded for clarity. + +### Minor Analysis Improvements + +* The `actions/output-clobbering/high` query no longer reports simple `jq` path filters when their output remains JSON-encoded. Raw-output modes, complex filters, and unrecognized options remain reportable. +* GitHub Actions queries now correctly classify the `schedule` event when determining whether a workflow is externally triggerable. +* The `actions/envvar-injection/critical` query now requires the untrusted source and privileged context to originate from the same trigger event. The environment variable injection queries also no longer treat pull request head labels as injection-capable because they cannot contain newlines. +* The `actions/cache-poisoning/code-injection`, `actions/cache-poisoning/direct-cache`, and `actions/cache-poisoning/poisonable-step` queries now account for read-only cache access on low-trust triggers that run in the default branch scope. Results are retained for triggers that GitHub allows to write to that cache scope. + +### Bug Fixes + +* The `actions/output-clobbering/high` query now provides messages tailored to the affected output channel and includes expanded documentation and recommendations. +* The `actions/cache-poisoning/poisonable-step` and `actions/untrusted-checkout/critical` queries now start paths at the expressions that control untrusted checkouts and link their alert messages to those expressions. +* Fixed a performance issue in the `actions/output-clobbering/high` query caused by using unescaped source-code input in a regular expression. diff --git a/actions/ql/src/codeql-pack.release.yml b/actions/ql/src/codeql-pack.release.yml index 6c5978280b02..ce257a8193e6 100644 --- a/actions/ql/src/codeql-pack.release.yml +++ b/actions/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.6.32 +lastReleaseVersion: 0.6.33 diff --git a/actions/ql/src/qlpack.yml b/actions/ql/src/qlpack.yml index 6d2a221c1b4a..648a6fb436fa 100644 --- a/actions/ql/src/qlpack.yml +++ b/actions/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-queries -version: 0.6.33-dev +version: 0.6.33 library: false warnOnImplicitThis: true groups: [actions, queries] diff --git a/cpp/ql/lib/CHANGELOG.md b/cpp/ql/lib/CHANGELOG.md index f5f7d195fa61..04ad4bba646b 100644 --- a/cpp/ql/lib/CHANGELOG.md +++ b/cpp/ql/lib/CHANGELOG.md @@ -1,3 +1,9 @@ +## 12.0.2 + +### Minor Analysis Improvements + +* Added flow source models for `RegQueryValue` and related functions from the `winreg.h` Windows header. + ## 12.0.1 No user-facing changes. diff --git a/cpp/ql/lib/change-notes/2026-07-28-winreg-sources.md b/cpp/ql/lib/change-notes/2026-07-28-winreg-sources.md deleted file mode 100644 index 9a70926b9984..000000000000 --- a/cpp/ql/lib/change-notes/2026-07-28-winreg-sources.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added flow source models for `RegQueryValue` and related functions from the `winreg.h` Windows header. \ No newline at end of file diff --git a/cpp/ql/lib/change-notes/released/12.0.2.md b/cpp/ql/lib/change-notes/released/12.0.2.md new file mode 100644 index 000000000000..cecfb536211f --- /dev/null +++ b/cpp/ql/lib/change-notes/released/12.0.2.md @@ -0,0 +1,5 @@ +## 12.0.2 + +### Minor Analysis Improvements + +* Added flow source models for `RegQueryValue` and related functions from the `winreg.h` Windows header. diff --git a/cpp/ql/lib/codeql-pack.release.yml b/cpp/ql/lib/codeql-pack.release.yml index 95ce69d8d492..500fb3b8051e 100644 --- a/cpp/ql/lib/codeql-pack.release.yml +++ b/cpp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 12.0.1 +lastReleaseVersion: 12.0.2 diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index 2932987ec152..fd32327163ba 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-all -version: 12.0.2-dev +version: 12.0.2 groups: cpp dbscheme: semmlecode.cpp.dbscheme extractor: cpp diff --git a/cpp/ql/src/CHANGELOG.md b/cpp/ql/src/CHANGELOG.md index 945a605d7e3d..bc3adffadcdc 100644 --- a/cpp/ql/src/CHANGELOG.md +++ b/cpp/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.8.1 + +No user-facing changes. + ## 1.8.0 ### Query Metadata Changes diff --git a/cpp/ql/src/change-notes/released/1.8.1.md b/cpp/ql/src/change-notes/released/1.8.1.md new file mode 100644 index 000000000000..0b1a7cdad10a --- /dev/null +++ b/cpp/ql/src/change-notes/released/1.8.1.md @@ -0,0 +1,3 @@ +## 1.8.1 + +No user-facing changes. diff --git a/cpp/ql/src/codeql-pack.release.yml b/cpp/ql/src/codeql-pack.release.yml index dc8a37cc443d..28a7c123ae84 100644 --- a/cpp/ql/src/codeql-pack.release.yml +++ b/cpp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.8.0 +lastReleaseVersion: 1.8.1 diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml index ad0a0cd8943b..8495d389e7fb 100644 --- a/cpp/ql/src/qlpack.yml +++ b/cpp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-queries -version: 1.8.1-dev +version: 1.8.1 groups: - cpp - queries diff --git a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md index a8774769b98c..f1ee51f9d945 100644 --- a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.7.72 + +No user-facing changes. + ## 1.7.71 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.72.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.72.md new file mode 100644 index 000000000000..9ff61fe3c5d3 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.72.md @@ -0,0 +1,3 @@ +## 1.7.72 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml index 9cb591428908..33d595a3ea10 100644 --- a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.71 +lastReleaseVersion: 1.7.72 diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml index 9968c6570e7d..8333936d134a 100644 --- a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-all -version: 1.7.72-dev +version: 1.7.72 groups: - csharp - solorigate diff --git a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md index a8774769b98c..f1ee51f9d945 100644 --- a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.7.72 + +No user-facing changes. + ## 1.7.71 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.72.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.72.md new file mode 100644 index 000000000000..9ff61fe3c5d3 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.72.md @@ -0,0 +1,3 @@ +## 1.7.72 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml index 9cb591428908..33d595a3ea10 100644 --- a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.71 +lastReleaseVersion: 1.7.72 diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml index 9ccab68881a5..5379a3416f94 100644 --- a/csharp/ql/campaigns/Solorigate/src/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-queries -version: 1.7.72-dev +version: 1.7.72 groups: - csharp - solorigate diff --git a/csharp/ql/lib/CHANGELOG.md b/csharp/ql/lib/CHANGELOG.md index 3ea969a9e9a5..ccfde0f7f8fb 100644 --- a/csharp/ql/lib/CHANGELOG.md +++ b/csharp/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 7.1.2 + +No user-facing changes. + ## 7.1.1 No user-facing changes. diff --git a/csharp/ql/lib/change-notes/released/7.1.2.md b/csharp/ql/lib/change-notes/released/7.1.2.md new file mode 100644 index 000000000000..d55cf91e2492 --- /dev/null +++ b/csharp/ql/lib/change-notes/released/7.1.2.md @@ -0,0 +1,3 @@ +## 7.1.2 + +No user-facing changes. diff --git a/csharp/ql/lib/codeql-pack.release.yml b/csharp/ql/lib/codeql-pack.release.yml index 8e970df6cae3..547681cc4408 100644 --- a/csharp/ql/lib/codeql-pack.release.yml +++ b/csharp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 7.1.1 +lastReleaseVersion: 7.1.2 diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index 035a38389157..82fec250fc95 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-all -version: 7.1.2-dev +version: 7.1.2 groups: csharp dbscheme: semmlecode.csharp.dbscheme extractor: csharp diff --git a/csharp/ql/src/CHANGELOG.md b/csharp/ql/src/CHANGELOG.md index f3aee337480f..6fab89a5cac1 100644 --- a/csharp/ql/src/CHANGELOG.md +++ b/csharp/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.9.1 + +No user-facing changes. + ## 1.9.0 ### Query Metadata Changes diff --git a/csharp/ql/src/change-notes/released/1.9.1.md b/csharp/ql/src/change-notes/released/1.9.1.md new file mode 100644 index 000000000000..bc5c4bd30411 --- /dev/null +++ b/csharp/ql/src/change-notes/released/1.9.1.md @@ -0,0 +1,3 @@ +## 1.9.1 + +No user-facing changes. diff --git a/csharp/ql/src/codeql-pack.release.yml b/csharp/ql/src/codeql-pack.release.yml index df17dc3a3662..29c886b15136 100644 --- a/csharp/ql/src/codeql-pack.release.yml +++ b/csharp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.9.0 +lastReleaseVersion: 1.9.1 diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml index 8d3728935138..647d273d52bc 100644 --- a/csharp/ql/src/qlpack.yml +++ b/csharp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-queries -version: 1.9.1-dev +version: 1.9.1 groups: - csharp - queries diff --git a/go/ql/consistency-queries/CHANGELOG.md b/go/ql/consistency-queries/CHANGELOG.md index d75ab9a9e2d7..3a3948e7bf27 100644 --- a/go/ql/consistency-queries/CHANGELOG.md +++ b/go/ql/consistency-queries/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.55 + +No user-facing changes. + ## 1.0.54 No user-facing changes. diff --git a/go/ql/consistency-queries/change-notes/released/1.0.55.md b/go/ql/consistency-queries/change-notes/released/1.0.55.md new file mode 100644 index 000000000000..fd53dce64a9f --- /dev/null +++ b/go/ql/consistency-queries/change-notes/released/1.0.55.md @@ -0,0 +1,3 @@ +## 1.0.55 + +No user-facing changes. diff --git a/go/ql/consistency-queries/codeql-pack.release.yml b/go/ql/consistency-queries/codeql-pack.release.yml index c3c3b0f4418a..3c942a6b4ea3 100644 --- a/go/ql/consistency-queries/codeql-pack.release.yml +++ b/go/ql/consistency-queries/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.54 +lastReleaseVersion: 1.0.55 diff --git a/go/ql/consistency-queries/qlpack.yml b/go/ql/consistency-queries/qlpack.yml index e21cc5f01830..3ade0367079d 100644 --- a/go/ql/consistency-queries/qlpack.yml +++ b/go/ql/consistency-queries/qlpack.yml @@ -1,5 +1,5 @@ name: codeql-go-consistency-queries -version: 1.0.55-dev +version: 1.0.55 groups: - go - queries diff --git a/go/ql/lib/CHANGELOG.md b/go/ql/lib/CHANGELOG.md index 4b594f8f7405..14c075851e29 100644 --- a/go/ql/lib/CHANGELOG.md +++ b/go/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 7.2.3 + +No user-facing changes. + ## 7.2.2 ### Minor Analysis Improvements diff --git a/go/ql/lib/change-notes/released/7.2.3.md b/go/ql/lib/change-notes/released/7.2.3.md new file mode 100644 index 000000000000..ba04214fb88d --- /dev/null +++ b/go/ql/lib/change-notes/released/7.2.3.md @@ -0,0 +1,3 @@ +## 7.2.3 + +No user-facing changes. diff --git a/go/ql/lib/codeql-pack.release.yml b/go/ql/lib/codeql-pack.release.yml index fa4a7164fb7b..7d0dee6395ee 100644 --- a/go/ql/lib/codeql-pack.release.yml +++ b/go/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 7.2.2 +lastReleaseVersion: 7.2.3 diff --git a/go/ql/lib/qlpack.yml b/go/ql/lib/qlpack.yml index 47c1077e0992..d11fb5937d3b 100644 --- a/go/ql/lib/qlpack.yml +++ b/go/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-all -version: 7.2.3-dev +version: 7.2.3 groups: go dbscheme: go.dbscheme extractor: go diff --git a/go/ql/src/CHANGELOG.md b/go/ql/src/CHANGELOG.md index 6d012f9d2a4d..9dfd046bec53 100644 --- a/go/ql/src/CHANGELOG.md +++ b/go/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.6.8 + +No user-facing changes. + ## 1.6.7 No user-facing changes. diff --git a/go/ql/src/change-notes/released/1.6.8.md b/go/ql/src/change-notes/released/1.6.8.md new file mode 100644 index 000000000000..0a5d9b06c55e --- /dev/null +++ b/go/ql/src/change-notes/released/1.6.8.md @@ -0,0 +1,3 @@ +## 1.6.8 + +No user-facing changes. diff --git a/go/ql/src/codeql-pack.release.yml b/go/ql/src/codeql-pack.release.yml index 0b49adeac7da..fbc11aa62b75 100644 --- a/go/ql/src/codeql-pack.release.yml +++ b/go/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.6.7 +lastReleaseVersion: 1.6.8 diff --git a/go/ql/src/qlpack.yml b/go/ql/src/qlpack.yml index 25a573adf8a0..61ae6f2fe439 100644 --- a/go/ql/src/qlpack.yml +++ b/go/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-queries -version: 1.6.8-dev +version: 1.6.8 groups: - go - queries diff --git a/java/ql/lib/CHANGELOG.md b/java/ql/lib/CHANGELOG.md index 83910f155a3c..2fd58088dab6 100644 --- a/java/ql/lib/CHANGELOG.md +++ b/java/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 9.2.3 + +No user-facing changes. + ## 9.2.2 ### Minor Analysis Improvements diff --git a/java/ql/lib/change-notes/released/9.2.3.md b/java/ql/lib/change-notes/released/9.2.3.md new file mode 100644 index 000000000000..c0cdbd68de76 --- /dev/null +++ b/java/ql/lib/change-notes/released/9.2.3.md @@ -0,0 +1,3 @@ +## 9.2.3 + +No user-facing changes. diff --git a/java/ql/lib/codeql-pack.release.yml b/java/ql/lib/codeql-pack.release.yml index 41cfa549b0a6..39a6208d44d2 100644 --- a/java/ql/lib/codeql-pack.release.yml +++ b/java/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 9.2.2 +lastReleaseVersion: 9.2.3 diff --git a/java/ql/lib/qlpack.yml b/java/ql/lib/qlpack.yml index 782d89ff8172..e8e9de7cd03c 100644 --- a/java/ql/lib/qlpack.yml +++ b/java/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-all -version: 9.2.3-dev +version: 9.2.3 groups: java dbscheme: config/semmlecode.dbscheme extractor: java diff --git a/java/ql/src/CHANGELOG.md b/java/ql/src/CHANGELOG.md index 3fd98c386b69..b31db924d53d 100644 --- a/java/ql/src/CHANGELOG.md +++ b/java/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.11.8 + +No user-facing changes. + ## 1.11.7 No user-facing changes. diff --git a/java/ql/src/change-notes/released/1.11.8.md b/java/ql/src/change-notes/released/1.11.8.md new file mode 100644 index 000000000000..0783473b96d3 --- /dev/null +++ b/java/ql/src/change-notes/released/1.11.8.md @@ -0,0 +1,3 @@ +## 1.11.8 + +No user-facing changes. diff --git a/java/ql/src/codeql-pack.release.yml b/java/ql/src/codeql-pack.release.yml index da245378bca5..1235b98cb049 100644 --- a/java/ql/src/codeql-pack.release.yml +++ b/java/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.11.7 +lastReleaseVersion: 1.11.8 diff --git a/java/ql/src/qlpack.yml b/java/ql/src/qlpack.yml index f85ddd4d3f6a..e22f77c81351 100644 --- a/java/ql/src/qlpack.yml +++ b/java/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-queries -version: 1.11.8-dev +version: 1.11.8 groups: - java - queries diff --git a/javascript/ql/lib/CHANGELOG.md b/javascript/ql/lib/CHANGELOG.md index c0217aee81e7..0f509e829b05 100644 --- a/javascript/ql/lib/CHANGELOG.md +++ b/javascript/ql/lib/CHANGELOG.md @@ -1,3 +1,18 @@ +## 2.9.0 + +### Major Analysis Improvements + +* It is now possible for custom models to refer to specific files in the codebase, using a package name of form `file:`. The model should describe the public exports + of that file. This can be used to derive sources and sinks in code that imports the file, but note that sources and sinks will not generally be placed within the file itself. + For example, a source model `['file:lib/service.js', 'Member[getData].ReturnValue', 'remote']` could identify `require('../lib/service').getData()` as a source. + +### Minor Analysis Improvements + +* JavaScript security queries using the `response` threat model now track promise-wrapped client response data into promise fulfillment values. This may improve results for queries such as `js/xss` when response data is consumed through `.then(...)` chains. +* The route object returned by Vue Router's `useRoute()` Composition API is now recognized as a client-side remote flow source, covering its `query`, `params`, `path`, `fullPath`, and `hash` members. These members are additionally reported under the corresponding `browser-url-query`, `browser-url-path`, and `browser-url-fragment` threat models. +* Added flow models for Vue's `ref`, `shallowRef`, `toRef`, `reactive`, and `computed` Composition API helpers. +* Added support for treating declared `inputs` properties in Sails Action2 controller files as remote flow sources. This may improve results for security queries such as `js/path-injection`. + ## 2.8.2 No user-facing changes. diff --git a/javascript/ql/lib/change-notes/2026-07-07-sails-action2-inputs.md b/javascript/ql/lib/change-notes/2026-07-07-sails-action2-inputs.md deleted file mode 100644 index 72b5fda6137b..000000000000 --- a/javascript/ql/lib/change-notes/2026-07-07-sails-action2-inputs.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added support for treating declared `inputs` properties in Sails Action2 controller files as remote flow sources. This may improve results for security queries such as `js/path-injection`. diff --git a/javascript/ql/lib/change-notes/2026-07-16-vue-router-useRoute-query.md b/javascript/ql/lib/change-notes/2026-07-16-vue-router-useRoute-query.md deleted file mode 100644 index 973af15aae03..000000000000 --- a/javascript/ql/lib/change-notes/2026-07-16-vue-router-useRoute-query.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: minorAnalysis ---- -* The route object returned by Vue Router's `useRoute()` Composition API is now recognized as a client-side remote flow source, covering its `query`, `params`, `path`, `fullPath`, and `hash` members. These members are additionally reported under the corresponding `browser-url-query`, `browser-url-path`, and `browser-url-fragment` threat models. -* Added flow models for Vue's `ref`, `shallowRef`, `toRef`, `reactive`, and `computed` Composition API helpers. diff --git a/javascript/ql/lib/change-notes/2026-07-31-file-scoped-models.md b/javascript/ql/lib/change-notes/2026-07-31-file-scoped-models.md deleted file mode 100644 index b3df112a1f1d..000000000000 --- a/javascript/ql/lib/change-notes/2026-07-31-file-scoped-models.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -category: majorAnalysis ---- -* It is now possible for custom models to refer to specific files in the codebase, using a package name of form `file:`. The model should describe the public exports - of that file. This can be used to derive sources and sinks in code that imports the file, but note that sources and sinks will not generally be placed within the file itself. - For example, a source model `['file:lib/service.js', 'Member[getData].ReturnValue', 'remote']` could identify `require('../lib/service').getData()` as a source. diff --git a/javascript/ql/lib/change-notes/2026-08-01-client-response-promise-data.md b/javascript/ql/lib/change-notes/2026-08-01-client-response-promise-data.md deleted file mode 100644 index 7213d64a830d..000000000000 --- a/javascript/ql/lib/change-notes/2026-08-01-client-response-promise-data.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* JavaScript security queries using the `response` threat model now track promise-wrapped client response data into promise fulfillment values. This may improve results for queries such as `js/xss` when response data is consumed through `.then(...)` chains. diff --git a/javascript/ql/lib/change-notes/released/2.9.0.md b/javascript/ql/lib/change-notes/released/2.9.0.md new file mode 100644 index 000000000000..6892fa665580 --- /dev/null +++ b/javascript/ql/lib/change-notes/released/2.9.0.md @@ -0,0 +1,14 @@ +## 2.9.0 + +### Major Analysis Improvements + +* It is now possible for custom models to refer to specific files in the codebase, using a package name of form `file:`. The model should describe the public exports + of that file. This can be used to derive sources and sinks in code that imports the file, but note that sources and sinks will not generally be placed within the file itself. + For example, a source model `['file:lib/service.js', 'Member[getData].ReturnValue', 'remote']` could identify `require('../lib/service').getData()` as a source. + +### Minor Analysis Improvements + +* JavaScript security queries using the `response` threat model now track promise-wrapped client response data into promise fulfillment values. This may improve results for queries such as `js/xss` when response data is consumed through `.then(...)` chains. +* The route object returned by Vue Router's `useRoute()` Composition API is now recognized as a client-side remote flow source, covering its `query`, `params`, `path`, `fullPath`, and `hash` members. These members are additionally reported under the corresponding `browser-url-query`, `browser-url-path`, and `browser-url-fragment` threat models. +* Added flow models for Vue's `ref`, `shallowRef`, `toRef`, `reactive`, and `computed` Composition API helpers. +* Added support for treating declared `inputs` properties in Sails Action2 controller files as remote flow sources. This may improve results for security queries such as `js/path-injection`. diff --git a/javascript/ql/lib/codeql-pack.release.yml b/javascript/ql/lib/codeql-pack.release.yml index 49d300fe06bf..d6329a574932 100644 --- a/javascript/ql/lib/codeql-pack.release.yml +++ b/javascript/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.8.2 +lastReleaseVersion: 2.9.0 diff --git a/javascript/ql/lib/qlpack.yml b/javascript/ql/lib/qlpack.yml index 6e10c05aa596..a8caae8cf334 100644 --- a/javascript/ql/lib/qlpack.yml +++ b/javascript/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-all -version: 2.8.3-dev +version: 2.9.0 groups: javascript dbscheme: semmlecode.javascript.dbscheme extractor: javascript diff --git a/javascript/ql/src/CHANGELOG.md b/javascript/ql/src/CHANGELOG.md index 2e8bcd543c25..87b01cbc4afa 100644 --- a/javascript/ql/src/CHANGELOG.md +++ b/javascript/ql/src/CHANGELOG.md @@ -1,3 +1,9 @@ +## 2.4.3 + +### Minor Analysis Improvements + +* The `js/missing-rate-limiting` query now recognizes the `@fastify/rate-limit` package as a rate limiter. + ## 2.4.2 No user-facing changes. diff --git a/javascript/ql/src/change-notes/2026-07-22-fastify-rate-limit.md b/javascript/ql/src/change-notes/released/2.4.3.md similarity index 71% rename from javascript/ql/src/change-notes/2026-07-22-fastify-rate-limit.md rename to javascript/ql/src/change-notes/released/2.4.3.md index 55e23b9dc111..11f57d32a7a9 100644 --- a/javascript/ql/src/change-notes/2026-07-22-fastify-rate-limit.md +++ b/javascript/ql/src/change-notes/released/2.4.3.md @@ -1,4 +1,5 @@ ---- -category: minorAnalysis ---- +## 2.4.3 + +### Minor Analysis Improvements + * The `js/missing-rate-limiting` query now recognizes the `@fastify/rate-limit` package as a rate limiter. diff --git a/javascript/ql/src/codeql-pack.release.yml b/javascript/ql/src/codeql-pack.release.yml index 660b0f7e51c9..2520785bcc40 100644 --- a/javascript/ql/src/codeql-pack.release.yml +++ b/javascript/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.4.2 +lastReleaseVersion: 2.4.3 diff --git a/javascript/ql/src/qlpack.yml b/javascript/ql/src/qlpack.yml index 1c534df4d85b..b21af7515f5b 100644 --- a/javascript/ql/src/qlpack.yml +++ b/javascript/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-queries -version: 2.4.3-dev +version: 2.4.3 groups: - javascript - queries diff --git a/misc/suite-helpers/CHANGELOG.md b/misc/suite-helpers/CHANGELOG.md index 2e398f4824df..dd22444f54fe 100644 --- a/misc/suite-helpers/CHANGELOG.md +++ b/misc/suite-helpers/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.55 + +No user-facing changes. + ## 1.0.54 No user-facing changes. diff --git a/misc/suite-helpers/change-notes/released/1.0.55.md b/misc/suite-helpers/change-notes/released/1.0.55.md new file mode 100644 index 000000000000..fd53dce64a9f --- /dev/null +++ b/misc/suite-helpers/change-notes/released/1.0.55.md @@ -0,0 +1,3 @@ +## 1.0.55 + +No user-facing changes. diff --git a/misc/suite-helpers/codeql-pack.release.yml b/misc/suite-helpers/codeql-pack.release.yml index c3c3b0f4418a..3c942a6b4ea3 100644 --- a/misc/suite-helpers/codeql-pack.release.yml +++ b/misc/suite-helpers/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.54 +lastReleaseVersion: 1.0.55 diff --git a/misc/suite-helpers/qlpack.yml b/misc/suite-helpers/qlpack.yml index 12203ff110fa..dff0d253cbce 100644 --- a/misc/suite-helpers/qlpack.yml +++ b/misc/suite-helpers/qlpack.yml @@ -1,4 +1,4 @@ name: codeql/suite-helpers -version: 1.0.55-dev +version: 1.0.55 groups: shared warnOnImplicitThis: true diff --git a/python/ql/lib/CHANGELOG.md b/python/ql/lib/CHANGELOG.md index e36b11806aa3..2a6de92ecbce 100644 --- a/python/ql/lib/CHANGELOG.md +++ b/python/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 7.2.3 + +No user-facing changes. + ## 7.2.2 No user-facing changes. diff --git a/python/ql/lib/change-notes/released/7.2.3.md b/python/ql/lib/change-notes/released/7.2.3.md new file mode 100644 index 000000000000..ba04214fb88d --- /dev/null +++ b/python/ql/lib/change-notes/released/7.2.3.md @@ -0,0 +1,3 @@ +## 7.2.3 + +No user-facing changes. diff --git a/python/ql/lib/codeql-pack.release.yml b/python/ql/lib/codeql-pack.release.yml index fa4a7164fb7b..7d0dee6395ee 100644 --- a/python/ql/lib/codeql-pack.release.yml +++ b/python/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 7.2.2 +lastReleaseVersion: 7.2.3 diff --git a/python/ql/lib/qlpack.yml b/python/ql/lib/qlpack.yml index 51fbf227e0b9..d8914df8750b 100644 --- a/python/ql/lib/qlpack.yml +++ b/python/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-all -version: 7.2.3-dev +version: 7.2.3 groups: python dbscheme: semmlecode.python.dbscheme extractor: python diff --git a/python/ql/src/CHANGELOG.md b/python/ql/src/CHANGELOG.md index 154686ec4aa9..97904c1bd7af 100644 --- a/python/ql/src/CHANGELOG.md +++ b/python/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.8.8 + +No user-facing changes. + ## 1.8.7 No user-facing changes. diff --git a/python/ql/src/change-notes/released/1.8.8.md b/python/ql/src/change-notes/released/1.8.8.md new file mode 100644 index 000000000000..fcbf14e0fd9b --- /dev/null +++ b/python/ql/src/change-notes/released/1.8.8.md @@ -0,0 +1,3 @@ +## 1.8.8 + +No user-facing changes. diff --git a/python/ql/src/codeql-pack.release.yml b/python/ql/src/codeql-pack.release.yml index 353f6d821ebe..d224b6ac3595 100644 --- a/python/ql/src/codeql-pack.release.yml +++ b/python/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.8.7 +lastReleaseVersion: 1.8.8 diff --git a/python/ql/src/qlpack.yml b/python/ql/src/qlpack.yml index 7d54edbaa03f..1aca14fd33ae 100644 --- a/python/ql/src/qlpack.yml +++ b/python/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-queries -version: 1.8.8-dev +version: 1.8.8 groups: - python - queries diff --git a/ruby/ql/lib/CHANGELOG.md b/ruby/ql/lib/CHANGELOG.md index d79eaed159e4..146fdb46d43c 100644 --- a/ruby/ql/lib/CHANGELOG.md +++ b/ruby/ql/lib/CHANGELOG.md @@ -1,3 +1,9 @@ +## 6.0.3 + +### Minor Analysis Improvements + +* Removed library input to vendored gems from the set of taint sources. This should reduce false positives for `rb/polynomial-redos`, `rb/regex/badly-anchored-regexp`, `rb/unsafe-code-construction`, `rb/html-constructed-from-input`, and `rb/shell-command-constructed-from-input` whenever vendoring is used. + ## 6.0.2 No user-facing changes. diff --git a/ruby/ql/lib/change-notes/2026-08-05-vendored-lib-taint.md b/ruby/ql/lib/change-notes/released/6.0.3.md similarity index 87% rename from ruby/ql/lib/change-notes/2026-08-05-vendored-lib-taint.md rename to ruby/ql/lib/change-notes/released/6.0.3.md index e5eab2447c30..81e3925ea383 100644 --- a/ruby/ql/lib/change-notes/2026-08-05-vendored-lib-taint.md +++ b/ruby/ql/lib/change-notes/released/6.0.3.md @@ -1,4 +1,5 @@ ---- -category: minorAnalysis ---- +## 6.0.3 + +### Minor Analysis Improvements + * Removed library input to vendored gems from the set of taint sources. This should reduce false positives for `rb/polynomial-redos`, `rb/regex/badly-anchored-regexp`, `rb/unsafe-code-construction`, `rb/html-constructed-from-input`, and `rb/shell-command-constructed-from-input` whenever vendoring is used. diff --git a/ruby/ql/lib/codeql-pack.release.yml b/ruby/ql/lib/codeql-pack.release.yml index 70437ec53b89..304c17ad4092 100644 --- a/ruby/ql/lib/codeql-pack.release.yml +++ b/ruby/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 6.0.2 +lastReleaseVersion: 6.0.3 diff --git a/ruby/ql/lib/qlpack.yml b/ruby/ql/lib/qlpack.yml index 29d38c9a1948..597e6242c9dd 100644 --- a/ruby/ql/lib/qlpack.yml +++ b/ruby/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-all -version: 6.0.3-dev +version: 6.0.3 groups: ruby extractor: ruby dbscheme: ruby.dbscheme diff --git a/ruby/ql/src/CHANGELOG.md b/ruby/ql/src/CHANGELOG.md index 781cbbe6d9f7..a8502538032b 100644 --- a/ruby/ql/src/CHANGELOG.md +++ b/ruby/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.6.8 + +No user-facing changes. + ## 1.6.7 No user-facing changes. diff --git a/ruby/ql/src/change-notes/released/1.6.8.md b/ruby/ql/src/change-notes/released/1.6.8.md new file mode 100644 index 000000000000..0a5d9b06c55e --- /dev/null +++ b/ruby/ql/src/change-notes/released/1.6.8.md @@ -0,0 +1,3 @@ +## 1.6.8 + +No user-facing changes. diff --git a/ruby/ql/src/codeql-pack.release.yml b/ruby/ql/src/codeql-pack.release.yml index 0b49adeac7da..fbc11aa62b75 100644 --- a/ruby/ql/src/codeql-pack.release.yml +++ b/ruby/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.6.7 +lastReleaseVersion: 1.6.8 diff --git a/ruby/ql/src/qlpack.yml b/ruby/ql/src/qlpack.yml index f73004c8530d..60d063996d4a 100644 --- a/ruby/ql/src/qlpack.yml +++ b/ruby/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-queries -version: 1.6.8-dev +version: 1.6.8 groups: - ruby - queries diff --git a/rust/ql/lib/CHANGELOG.md b/rust/ql/lib/CHANGELOG.md index c4da1d50e0aa..6e7ca1f1f10a 100644 --- a/rust/ql/lib/CHANGELOG.md +++ b/rust/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.19 + +No user-facing changes. + ## 0.2.18 No user-facing changes. diff --git a/rust/ql/lib/change-notes/released/0.2.19.md b/rust/ql/lib/change-notes/released/0.2.19.md new file mode 100644 index 000000000000..40c7c07e47b7 --- /dev/null +++ b/rust/ql/lib/change-notes/released/0.2.19.md @@ -0,0 +1,3 @@ +## 0.2.19 + +No user-facing changes. diff --git a/rust/ql/lib/codeql-pack.release.yml b/rust/ql/lib/codeql-pack.release.yml index 22e36b609026..b37d10786472 100644 --- a/rust/ql/lib/codeql-pack.release.yml +++ b/rust/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.2.18 +lastReleaseVersion: 0.2.19 diff --git a/rust/ql/lib/qlpack.yml b/rust/ql/lib/qlpack.yml index 14e8ab08f4d9..9f013c345d61 100644 --- a/rust/ql/lib/qlpack.yml +++ b/rust/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rust-all -version: 0.2.19-dev +version: 0.2.19 groups: rust extractor: rust dbscheme: rust.dbscheme diff --git a/rust/ql/src/CHANGELOG.md b/rust/ql/src/CHANGELOG.md index 1732a4853b12..e6a2f67fac00 100644 --- a/rust/ql/src/CHANGELOG.md +++ b/rust/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.40 + +No user-facing changes. + ## 0.1.39 No user-facing changes. diff --git a/rust/ql/src/change-notes/released/0.1.40.md b/rust/ql/src/change-notes/released/0.1.40.md new file mode 100644 index 000000000000..f7aacd7a077e --- /dev/null +++ b/rust/ql/src/change-notes/released/0.1.40.md @@ -0,0 +1,3 @@ +## 0.1.40 + +No user-facing changes. diff --git a/rust/ql/src/codeql-pack.release.yml b/rust/ql/src/codeql-pack.release.yml index 2ae59ee1c0ae..676d88550b91 100644 --- a/rust/ql/src/codeql-pack.release.yml +++ b/rust/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.1.39 +lastReleaseVersion: 0.1.40 diff --git a/rust/ql/src/qlpack.yml b/rust/ql/src/qlpack.yml index 74a67365b1da..a4a357bff44f 100644 --- a/rust/ql/src/qlpack.yml +++ b/rust/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rust-queries -version: 0.1.40-dev +version: 0.1.40 groups: - rust - queries diff --git a/shared/concepts/CHANGELOG.md b/shared/concepts/CHANGELOG.md index 772a7934b5c2..9acabbed4e46 100644 --- a/shared/concepts/CHANGELOG.md +++ b/shared/concepts/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.29 + +No user-facing changes. + ## 0.0.28 No user-facing changes. diff --git a/shared/concepts/change-notes/released/0.0.29.md b/shared/concepts/change-notes/released/0.0.29.md new file mode 100644 index 000000000000..4428927c79d5 --- /dev/null +++ b/shared/concepts/change-notes/released/0.0.29.md @@ -0,0 +1,3 @@ +## 0.0.29 + +No user-facing changes. diff --git a/shared/concepts/codeql-pack.release.yml b/shared/concepts/codeql-pack.release.yml index 3462db7d348f..c81f18131208 100644 --- a/shared/concepts/codeql-pack.release.yml +++ b/shared/concepts/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.28 +lastReleaseVersion: 0.0.29 diff --git a/shared/concepts/qlpack.yml b/shared/concepts/qlpack.yml index c5f8b2831ab0..b00bbb9f887b 100644 --- a/shared/concepts/qlpack.yml +++ b/shared/concepts/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/concepts -version: 0.0.29-dev +version: 0.0.29 groups: shared library: true dependencies: diff --git a/shared/controlflow/CHANGELOG.md b/shared/controlflow/CHANGELOG.md index 1cd70884e88b..9abcc742814f 100644 --- a/shared/controlflow/CHANGELOG.md +++ b/shared/controlflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.39 + +No user-facing changes. + ## 2.0.38 No user-facing changes. diff --git a/shared/controlflow/change-notes/released/2.0.39.md b/shared/controlflow/change-notes/released/2.0.39.md new file mode 100644 index 000000000000..887d030df420 --- /dev/null +++ b/shared/controlflow/change-notes/released/2.0.39.md @@ -0,0 +1,3 @@ +## 2.0.39 + +No user-facing changes. diff --git a/shared/controlflow/codeql-pack.release.yml b/shared/controlflow/codeql-pack.release.yml index 4ec9eb0980cf..063a268e5f9f 100644 --- a/shared/controlflow/codeql-pack.release.yml +++ b/shared/controlflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.38 +lastReleaseVersion: 2.0.39 diff --git a/shared/controlflow/qlpack.yml b/shared/controlflow/qlpack.yml index e4358bf4e80d..d3cc00f776ed 100644 --- a/shared/controlflow/qlpack.yml +++ b/shared/controlflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/controlflow -version: 2.0.39-dev +version: 2.0.39 groups: shared library: true dependencies: diff --git a/shared/dataflow/CHANGELOG.md b/shared/dataflow/CHANGELOG.md index 957500952a2d..8b981f92142e 100644 --- a/shared/dataflow/CHANGELOG.md +++ b/shared/dataflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.1.11 + +No user-facing changes. + ## 2.1.10 No user-facing changes. diff --git a/shared/dataflow/change-notes/released/2.1.11.md b/shared/dataflow/change-notes/released/2.1.11.md new file mode 100644 index 000000000000..16b106c2f6c9 --- /dev/null +++ b/shared/dataflow/change-notes/released/2.1.11.md @@ -0,0 +1,3 @@ +## 2.1.11 + +No user-facing changes. diff --git a/shared/dataflow/codeql-pack.release.yml b/shared/dataflow/codeql-pack.release.yml index 66c655c4b892..768e745f3b43 100644 --- a/shared/dataflow/codeql-pack.release.yml +++ b/shared/dataflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.1.10 +lastReleaseVersion: 2.1.11 diff --git a/shared/dataflow/qlpack.yml b/shared/dataflow/qlpack.yml index a9aa3a70f451..3c53868dc3ce 100644 --- a/shared/dataflow/qlpack.yml +++ b/shared/dataflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/dataflow -version: 2.1.11-dev +version: 2.1.11 groups: shared library: true dependencies: diff --git a/shared/mad/CHANGELOG.md b/shared/mad/CHANGELOG.md index b1e3e366b72c..3a981e317c75 100644 --- a/shared/mad/CHANGELOG.md +++ b/shared/mad/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.55 + +No user-facing changes. + ## 1.0.54 No user-facing changes. diff --git a/shared/mad/change-notes/released/1.0.55.md b/shared/mad/change-notes/released/1.0.55.md new file mode 100644 index 000000000000..fd53dce64a9f --- /dev/null +++ b/shared/mad/change-notes/released/1.0.55.md @@ -0,0 +1,3 @@ +## 1.0.55 + +No user-facing changes. diff --git a/shared/mad/codeql-pack.release.yml b/shared/mad/codeql-pack.release.yml index c3c3b0f4418a..3c942a6b4ea3 100644 --- a/shared/mad/codeql-pack.release.yml +++ b/shared/mad/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.54 +lastReleaseVersion: 1.0.55 diff --git a/shared/mad/qlpack.yml b/shared/mad/qlpack.yml index a160bab98f55..72caf44fdad2 100644 --- a/shared/mad/qlpack.yml +++ b/shared/mad/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/mad -version: 1.0.55-dev +version: 1.0.55 groups: shared library: true dependencies: diff --git a/shared/namebinding/CHANGELOG.md b/shared/namebinding/CHANGELOG.md index d7831747b120..4ffbff1e0c4e 100644 --- a/shared/namebinding/CHANGELOG.md +++ b/shared/namebinding/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.4 + +No user-facing changes. + ## 0.0.3 No user-facing changes. diff --git a/shared/namebinding/change-notes/released/0.0.4.md b/shared/namebinding/change-notes/released/0.0.4.md new file mode 100644 index 000000000000..eefe286a4d88 --- /dev/null +++ b/shared/namebinding/change-notes/released/0.0.4.md @@ -0,0 +1,3 @@ +## 0.0.4 + +No user-facing changes. diff --git a/shared/namebinding/codeql-pack.release.yml b/shared/namebinding/codeql-pack.release.yml index a24b693d1e7a..ec411a674bcd 100644 --- a/shared/namebinding/codeql-pack.release.yml +++ b/shared/namebinding/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.3 +lastReleaseVersion: 0.0.4 diff --git a/shared/namebinding/qlpack.yml b/shared/namebinding/qlpack.yml index ecb08c95dda6..587b6de4f125 100644 --- a/shared/namebinding/qlpack.yml +++ b/shared/namebinding/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/namebinding -version: 0.0.4-dev +version: 0.0.4 groups: shared library: true dependencies: diff --git a/shared/quantum/CHANGELOG.md b/shared/quantum/CHANGELOG.md index 24dc81f3aa2c..66b8fa3444bb 100644 --- a/shared/quantum/CHANGELOG.md +++ b/shared/quantum/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.33 + +No user-facing changes. + ## 0.0.32 No user-facing changes. diff --git a/shared/quantum/change-notes/released/0.0.33.md b/shared/quantum/change-notes/released/0.0.33.md new file mode 100644 index 000000000000..0b46f1130fac --- /dev/null +++ b/shared/quantum/change-notes/released/0.0.33.md @@ -0,0 +1,3 @@ +## 0.0.33 + +No user-facing changes. diff --git a/shared/quantum/codeql-pack.release.yml b/shared/quantum/codeql-pack.release.yml index 714fcfc18281..dff9e7f6ea97 100644 --- a/shared/quantum/codeql-pack.release.yml +++ b/shared/quantum/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.32 +lastReleaseVersion: 0.0.33 diff --git a/shared/quantum/qlpack.yml b/shared/quantum/qlpack.yml index 6a7a0abe44a2..c26d83a0a25f 100644 --- a/shared/quantum/qlpack.yml +++ b/shared/quantum/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/quantum -version: 0.0.33-dev +version: 0.0.33 groups: shared library: true dependencies: diff --git a/shared/rangeanalysis/CHANGELOG.md b/shared/rangeanalysis/CHANGELOG.md index d3f599dc28ff..3a874c765ab7 100644 --- a/shared/rangeanalysis/CHANGELOG.md +++ b/shared/rangeanalysis/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.55 + +No user-facing changes. + ## 1.0.54 No user-facing changes. diff --git a/shared/rangeanalysis/change-notes/released/1.0.55.md b/shared/rangeanalysis/change-notes/released/1.0.55.md new file mode 100644 index 000000000000..fd53dce64a9f --- /dev/null +++ b/shared/rangeanalysis/change-notes/released/1.0.55.md @@ -0,0 +1,3 @@ +## 1.0.55 + +No user-facing changes. diff --git a/shared/rangeanalysis/codeql-pack.release.yml b/shared/rangeanalysis/codeql-pack.release.yml index c3c3b0f4418a..3c942a6b4ea3 100644 --- a/shared/rangeanalysis/codeql-pack.release.yml +++ b/shared/rangeanalysis/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.54 +lastReleaseVersion: 1.0.55 diff --git a/shared/rangeanalysis/qlpack.yml b/shared/rangeanalysis/qlpack.yml index d37c35c424e8..d8b0292bfdae 100644 --- a/shared/rangeanalysis/qlpack.yml +++ b/shared/rangeanalysis/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rangeanalysis -version: 1.0.55-dev +version: 1.0.55 groups: shared library: true dependencies: diff --git a/shared/regex/CHANGELOG.md b/shared/regex/CHANGELOG.md index 4b02993bb99f..bbfe25191a71 100644 --- a/shared/regex/CHANGELOG.md +++ b/shared/regex/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.55 + +No user-facing changes. + ## 1.0.54 No user-facing changes. diff --git a/shared/regex/change-notes/released/1.0.55.md b/shared/regex/change-notes/released/1.0.55.md new file mode 100644 index 000000000000..fd53dce64a9f --- /dev/null +++ b/shared/regex/change-notes/released/1.0.55.md @@ -0,0 +1,3 @@ +## 1.0.55 + +No user-facing changes. diff --git a/shared/regex/codeql-pack.release.yml b/shared/regex/codeql-pack.release.yml index c3c3b0f4418a..3c942a6b4ea3 100644 --- a/shared/regex/codeql-pack.release.yml +++ b/shared/regex/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.54 +lastReleaseVersion: 1.0.55 diff --git a/shared/regex/qlpack.yml b/shared/regex/qlpack.yml index eb4f9f9bff24..187bb5f5af95 100644 --- a/shared/regex/qlpack.yml +++ b/shared/regex/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/regex -version: 1.0.55-dev +version: 1.0.55 groups: shared library: true dependencies: diff --git a/shared/ssa/CHANGELOG.md b/shared/ssa/CHANGELOG.md index 2bc90a791ab0..b742fb0a2601 100644 --- a/shared/ssa/CHANGELOG.md +++ b/shared/ssa/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.31 + +No user-facing changes. + ## 2.0.30 No user-facing changes. diff --git a/shared/ssa/change-notes/released/2.0.31.md b/shared/ssa/change-notes/released/2.0.31.md new file mode 100644 index 000000000000..b3cd05e3de4d --- /dev/null +++ b/shared/ssa/change-notes/released/2.0.31.md @@ -0,0 +1,3 @@ +## 2.0.31 + +No user-facing changes. diff --git a/shared/ssa/codeql-pack.release.yml b/shared/ssa/codeql-pack.release.yml index 19c804295854..783d47207cda 100644 --- a/shared/ssa/codeql-pack.release.yml +++ b/shared/ssa/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.30 +lastReleaseVersion: 2.0.31 diff --git a/shared/ssa/qlpack.yml b/shared/ssa/qlpack.yml index 30c04dc81b95..a66e5225abd0 100644 --- a/shared/ssa/qlpack.yml +++ b/shared/ssa/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ssa -version: 2.0.31-dev +version: 2.0.31 groups: shared library: true dependencies: diff --git a/shared/threat-models/CHANGELOG.md b/shared/threat-models/CHANGELOG.md index d75ab9a9e2d7..3a3948e7bf27 100644 --- a/shared/threat-models/CHANGELOG.md +++ b/shared/threat-models/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.55 + +No user-facing changes. + ## 1.0.54 No user-facing changes. diff --git a/shared/threat-models/change-notes/released/1.0.55.md b/shared/threat-models/change-notes/released/1.0.55.md new file mode 100644 index 000000000000..fd53dce64a9f --- /dev/null +++ b/shared/threat-models/change-notes/released/1.0.55.md @@ -0,0 +1,3 @@ +## 1.0.55 + +No user-facing changes. diff --git a/shared/threat-models/codeql-pack.release.yml b/shared/threat-models/codeql-pack.release.yml index c3c3b0f4418a..3c942a6b4ea3 100644 --- a/shared/threat-models/codeql-pack.release.yml +++ b/shared/threat-models/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.54 +lastReleaseVersion: 1.0.55 diff --git a/shared/threat-models/qlpack.yml b/shared/threat-models/qlpack.yml index 785d18c741c0..93ab66cfc33f 100644 --- a/shared/threat-models/qlpack.yml +++ b/shared/threat-models/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/threat-models -version: 1.0.55-dev +version: 1.0.55 library: true groups: shared dataExtensions: diff --git a/shared/tutorial/CHANGELOG.md b/shared/tutorial/CHANGELOG.md index 34f695126455..267dbfeb562f 100644 --- a/shared/tutorial/CHANGELOG.md +++ b/shared/tutorial/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.55 + +No user-facing changes. + ## 1.0.54 No user-facing changes. diff --git a/shared/tutorial/change-notes/released/1.0.55.md b/shared/tutorial/change-notes/released/1.0.55.md new file mode 100644 index 000000000000..fd53dce64a9f --- /dev/null +++ b/shared/tutorial/change-notes/released/1.0.55.md @@ -0,0 +1,3 @@ +## 1.0.55 + +No user-facing changes. diff --git a/shared/tutorial/codeql-pack.release.yml b/shared/tutorial/codeql-pack.release.yml index c3c3b0f4418a..3c942a6b4ea3 100644 --- a/shared/tutorial/codeql-pack.release.yml +++ b/shared/tutorial/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.54 +lastReleaseVersion: 1.0.55 diff --git a/shared/tutorial/qlpack.yml b/shared/tutorial/qlpack.yml index d8d6ee9cdaa8..0a6f77df0754 100644 --- a/shared/tutorial/qlpack.yml +++ b/shared/tutorial/qlpack.yml @@ -1,7 +1,7 @@ name: codeql/tutorial description: Library for the CodeQL detective tutorials, helping new users learn to write CodeQL queries. -version: 1.0.55-dev +version: 1.0.55 groups: shared library: true warnOnImplicitThis: true diff --git a/shared/typeflow/CHANGELOG.md b/shared/typeflow/CHANGELOG.md index 906d6b96ebea..90dc2603d772 100644 --- a/shared/typeflow/CHANGELOG.md +++ b/shared/typeflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.55 + +No user-facing changes. + ## 1.0.54 No user-facing changes. diff --git a/shared/typeflow/change-notes/released/1.0.55.md b/shared/typeflow/change-notes/released/1.0.55.md new file mode 100644 index 000000000000..fd53dce64a9f --- /dev/null +++ b/shared/typeflow/change-notes/released/1.0.55.md @@ -0,0 +1,3 @@ +## 1.0.55 + +No user-facing changes. diff --git a/shared/typeflow/codeql-pack.release.yml b/shared/typeflow/codeql-pack.release.yml index c3c3b0f4418a..3c942a6b4ea3 100644 --- a/shared/typeflow/codeql-pack.release.yml +++ b/shared/typeflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.54 +lastReleaseVersion: 1.0.55 diff --git a/shared/typeflow/qlpack.yml b/shared/typeflow/qlpack.yml index e7d3ae0279be..deb074f38410 100644 --- a/shared/typeflow/qlpack.yml +++ b/shared/typeflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeflow -version: 1.0.55-dev +version: 1.0.55 groups: shared library: true dependencies: diff --git a/shared/typeinference/CHANGELOG.md b/shared/typeinference/CHANGELOG.md index 4916c26d385a..cd72576290a7 100644 --- a/shared/typeinference/CHANGELOG.md +++ b/shared/typeinference/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.36 + +No user-facing changes. + ## 0.0.35 No user-facing changes. diff --git a/shared/typeinference/change-notes/released/0.0.36.md b/shared/typeinference/change-notes/released/0.0.36.md new file mode 100644 index 000000000000..14c56d238da9 --- /dev/null +++ b/shared/typeinference/change-notes/released/0.0.36.md @@ -0,0 +1,3 @@ +## 0.0.36 + +No user-facing changes. diff --git a/shared/typeinference/codeql-pack.release.yml b/shared/typeinference/codeql-pack.release.yml index 143c97892032..b6df3a024ee6 100644 --- a/shared/typeinference/codeql-pack.release.yml +++ b/shared/typeinference/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.35 +lastReleaseVersion: 0.0.36 diff --git a/shared/typeinference/qlpack.yml b/shared/typeinference/qlpack.yml index 4d48222f41aa..b2bef17c8c5a 100644 --- a/shared/typeinference/qlpack.yml +++ b/shared/typeinference/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeinference -version: 0.0.36-dev +version: 0.0.36 groups: shared library: true dependencies: diff --git a/shared/typetracking/CHANGELOG.md b/shared/typetracking/CHANGELOG.md index a0ddc0dabdb0..8226f0232aff 100644 --- a/shared/typetracking/CHANGELOG.md +++ b/shared/typetracking/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.39 + +No user-facing changes. + ## 2.0.38 No user-facing changes. diff --git a/shared/typetracking/change-notes/released/2.0.39.md b/shared/typetracking/change-notes/released/2.0.39.md new file mode 100644 index 000000000000..887d030df420 --- /dev/null +++ b/shared/typetracking/change-notes/released/2.0.39.md @@ -0,0 +1,3 @@ +## 2.0.39 + +No user-facing changes. diff --git a/shared/typetracking/codeql-pack.release.yml b/shared/typetracking/codeql-pack.release.yml index 4ec9eb0980cf..063a268e5f9f 100644 --- a/shared/typetracking/codeql-pack.release.yml +++ b/shared/typetracking/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.38 +lastReleaseVersion: 2.0.39 diff --git a/shared/typetracking/qlpack.yml b/shared/typetracking/qlpack.yml index e9fb4f6c0447..b4c98d2ed55b 100644 --- a/shared/typetracking/qlpack.yml +++ b/shared/typetracking/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typetracking -version: 2.0.39-dev +version: 2.0.39 groups: shared library: true dependencies: diff --git a/shared/typos/CHANGELOG.md b/shared/typos/CHANGELOG.md index 1f1760051700..2cad9992afb8 100644 --- a/shared/typos/CHANGELOG.md +++ b/shared/typos/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.55 + +No user-facing changes. + ## 1.0.54 No user-facing changes. diff --git a/shared/typos/change-notes/released/1.0.55.md b/shared/typos/change-notes/released/1.0.55.md new file mode 100644 index 000000000000..fd53dce64a9f --- /dev/null +++ b/shared/typos/change-notes/released/1.0.55.md @@ -0,0 +1,3 @@ +## 1.0.55 + +No user-facing changes. diff --git a/shared/typos/codeql-pack.release.yml b/shared/typos/codeql-pack.release.yml index c3c3b0f4418a..3c942a6b4ea3 100644 --- a/shared/typos/codeql-pack.release.yml +++ b/shared/typos/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.54 +lastReleaseVersion: 1.0.55 diff --git a/shared/typos/qlpack.yml b/shared/typos/qlpack.yml index 9218a86a215b..7f17b05eb5dc 100644 --- a/shared/typos/qlpack.yml +++ b/shared/typos/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typos -version: 1.0.55-dev +version: 1.0.55 groups: shared library: true warnOnImplicitThis: true diff --git a/shared/util/CHANGELOG.md b/shared/util/CHANGELOG.md index 587c0a00aa15..55fa9e7730b5 100644 --- a/shared/util/CHANGELOG.md +++ b/shared/util/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.42 + +No user-facing changes. + ## 2.0.41 No user-facing changes. diff --git a/shared/util/change-notes/released/2.0.42.md b/shared/util/change-notes/released/2.0.42.md new file mode 100644 index 000000000000..85ba02702b9f --- /dev/null +++ b/shared/util/change-notes/released/2.0.42.md @@ -0,0 +1,3 @@ +## 2.0.42 + +No user-facing changes. diff --git a/shared/util/codeql-pack.release.yml b/shared/util/codeql-pack.release.yml index dcd61b02de59..000a2d0de2d1 100644 --- a/shared/util/codeql-pack.release.yml +++ b/shared/util/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.41 +lastReleaseVersion: 2.0.42 diff --git a/shared/util/qlpack.yml b/shared/util/qlpack.yml index 0a58c95a984d..85d435b88027 100644 --- a/shared/util/qlpack.yml +++ b/shared/util/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/util -version: 2.0.42-dev +version: 2.0.42 groups: shared library: true dependencies: null diff --git a/shared/xml/CHANGELOG.md b/shared/xml/CHANGELOG.md index 15640e5c1cbd..0901e77ebb22 100644 --- a/shared/xml/CHANGELOG.md +++ b/shared/xml/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.55 + +No user-facing changes. + ## 1.0.54 No user-facing changes. diff --git a/shared/xml/change-notes/released/1.0.55.md b/shared/xml/change-notes/released/1.0.55.md new file mode 100644 index 000000000000..fd53dce64a9f --- /dev/null +++ b/shared/xml/change-notes/released/1.0.55.md @@ -0,0 +1,3 @@ +## 1.0.55 + +No user-facing changes. diff --git a/shared/xml/codeql-pack.release.yml b/shared/xml/codeql-pack.release.yml index c3c3b0f4418a..3c942a6b4ea3 100644 --- a/shared/xml/codeql-pack.release.yml +++ b/shared/xml/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.54 +lastReleaseVersion: 1.0.55 diff --git a/shared/xml/qlpack.yml b/shared/xml/qlpack.yml index d1c821414117..2e4d61f11abe 100644 --- a/shared/xml/qlpack.yml +++ b/shared/xml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/xml -version: 1.0.55-dev +version: 1.0.55 groups: shared library: true dependencies: diff --git a/shared/yaml/CHANGELOG.md b/shared/yaml/CHANGELOG.md index e45ca7c51319..9ff01d7f1b17 100644 --- a/shared/yaml/CHANGELOG.md +++ b/shared/yaml/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.55 + +No user-facing changes. + ## 1.0.54 No user-facing changes. diff --git a/shared/yaml/change-notes/released/1.0.55.md b/shared/yaml/change-notes/released/1.0.55.md new file mode 100644 index 000000000000..fd53dce64a9f --- /dev/null +++ b/shared/yaml/change-notes/released/1.0.55.md @@ -0,0 +1,3 @@ +## 1.0.55 + +No user-facing changes. diff --git a/shared/yaml/codeql-pack.release.yml b/shared/yaml/codeql-pack.release.yml index c3c3b0f4418a..3c942a6b4ea3 100644 --- a/shared/yaml/codeql-pack.release.yml +++ b/shared/yaml/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.54 +lastReleaseVersion: 1.0.55 diff --git a/shared/yaml/qlpack.yml b/shared/yaml/qlpack.yml index 272b9f20f8fc..5c5a36fa69f3 100644 --- a/shared/yaml/qlpack.yml +++ b/shared/yaml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/yaml -version: 1.0.55-dev +version: 1.0.55 groups: shared library: true warnOnImplicitThis: true diff --git a/swift/ql/lib/CHANGELOG.md b/swift/ql/lib/CHANGELOG.md index 168e31e76c18..ffad5ee2398a 100644 --- a/swift/ql/lib/CHANGELOG.md +++ b/swift/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 6.8.1 + +No user-facing changes. + ## 6.8.0 ### Major Analysis Improvements diff --git a/swift/ql/lib/change-notes/released/6.8.1.md b/swift/ql/lib/change-notes/released/6.8.1.md new file mode 100644 index 000000000000..eb2ce653fc0f --- /dev/null +++ b/swift/ql/lib/change-notes/released/6.8.1.md @@ -0,0 +1,3 @@ +## 6.8.1 + +No user-facing changes. diff --git a/swift/ql/lib/codeql-pack.release.yml b/swift/ql/lib/codeql-pack.release.yml index 78131e1dceb7..49874c2924ed 100644 --- a/swift/ql/lib/codeql-pack.release.yml +++ b/swift/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 6.8.0 +lastReleaseVersion: 6.8.1 diff --git a/swift/ql/lib/qlpack.yml b/swift/ql/lib/qlpack.yml index 46bbe03047d3..856752875cd8 100644 --- a/swift/ql/lib/qlpack.yml +++ b/swift/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-all -version: 6.8.1-dev +version: 6.8.1 groups: swift extractor: swift dbscheme: swift.dbscheme diff --git a/swift/ql/src/CHANGELOG.md b/swift/ql/src/CHANGELOG.md index 0063b69f12b3..826ee7e9d4e9 100644 --- a/swift/ql/src/CHANGELOG.md +++ b/swift/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.3.8 + +No user-facing changes. + ## 1.3.7 No user-facing changes. diff --git a/swift/ql/src/change-notes/released/1.3.8.md b/swift/ql/src/change-notes/released/1.3.8.md new file mode 100644 index 000000000000..c7f5b27e47ec --- /dev/null +++ b/swift/ql/src/change-notes/released/1.3.8.md @@ -0,0 +1,3 @@ +## 1.3.8 + +No user-facing changes. diff --git a/swift/ql/src/codeql-pack.release.yml b/swift/ql/src/codeql-pack.release.yml index 2f4b67be43f7..898725a6deb4 100644 --- a/swift/ql/src/codeql-pack.release.yml +++ b/swift/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.3.7 +lastReleaseVersion: 1.3.8 diff --git a/swift/ql/src/qlpack.yml b/swift/ql/src/qlpack.yml index a738635a8d07..91be0e594012 100644 --- a/swift/ql/src/qlpack.yml +++ b/swift/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-queries -version: 1.3.8-dev +version: 1.3.8 groups: - swift - queries From 808ef1538fb9fff541df76895d8670dd3cd42a1c Mon Sep 17 00:00:00 2001 From: Jeroen Ketema <93738568+jketema@users.noreply.github.com> Date: Thu, 6 Aug 2026 10:13:48 +0000 Subject: [PATCH 0122/2098] Unified: Ensure extractor can find the Swift `.so` when built with cargo --- unified/extractor/build.rs | 10 ++++++++++ unified/swift-syntax-rs/Cargo.toml | 1 + unified/swift-syntax-rs/build.rs | 2 ++ 3 files changed, 13 insertions(+) create mode 100644 unified/extractor/build.rs diff --git a/unified/extractor/build.rs b/unified/extractor/build.rs new file mode 100644 index 000000000000..bf4053308e9f --- /dev/null +++ b/unified/extractor/build.rs @@ -0,0 +1,10 @@ +fn main() { + if let Ok(dir) = std::env::var("DEP_SWIFTSYNTAXFFI_LIBDIR") { + println!("cargo:rustc-link-search=native={dir}"); + println!("cargo:rustc-link-lib=dylib=SwiftSyntaxFFI"); + println!("cargo:rustc-link-arg=-Wl,-rpath,{dir}"); + } + if let Ok(dir) = std::env::var("DEP_SWIFTSYNTAXFFI_RUNTIMEDIR") { + println!("cargo:rustc-link-arg=-Wl,-rpath,{dir}"); + } +} diff --git a/unified/swift-syntax-rs/Cargo.toml b/unified/swift-syntax-rs/Cargo.toml index 6957fb0e50e9..38470341060a 100644 --- a/unified/swift-syntax-rs/Cargo.toml +++ b/unified/swift-syntax-rs/Cargo.toml @@ -4,6 +4,7 @@ description = "Rust wrapper around the swift-syntax package for parsing Swift so version = "0.1.0" authors = ["GitHub"] edition = "2024" +links = "SwiftSyntaxFFI" [lib] name = "swift_syntax_rs" diff --git a/unified/swift-syntax-rs/build.rs b/unified/swift-syntax-rs/build.rs index 1056c5a62518..f1fc4b3df7cd 100644 --- a/unified/swift-syntax-rs/build.rs +++ b/unified/swift-syntax-rs/build.rs @@ -56,11 +56,13 @@ fn main() { println!("cargo:rustc-link-search=native={}", build_dir.display()); println!("cargo:rustc-link-lib=dylib=SwiftSyntaxFFI"); println!("cargo:rustc-link-arg=-Wl,-rpath,{}", build_dir.display()); + println!("cargo:libdir={}", build_dir.display()); // The executable also needs to find the Swift runtime libraries at run time. if let Some(runtime) = swift_runtime_dir() { println!("cargo:rustc-link-search=native={}", runtime.display()); println!("cargo:rustc-link-arg=-Wl,-rpath,{}", runtime.display()); + println!("cargo:runtimedir={}", runtime.display()); } } From 1740d1700ff557f92b31295ad325ffa916b3fea2 Mon Sep 17 00:00:00 2001 From: Henry Mercer Date: Thu, 6 Aug 2026 11:48:00 +0100 Subject: [PATCH 0123/2098] JS: Fix minor wording issues in changelog --- javascript/ql/lib/CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/javascript/ql/lib/CHANGELOG.md b/javascript/ql/lib/CHANGELOG.md index 0f509e829b05..6ac06fe87b99 100644 --- a/javascript/ql/lib/CHANGELOG.md +++ b/javascript/ql/lib/CHANGELOG.md @@ -2,14 +2,14 @@ ### Major Analysis Improvements -* It is now possible for custom models to refer to specific files in the codebase, using a package name of form `file:`. The model should describe the public exports +* It is now possible for custom models to refer to specific files in the codebase, using a package name of the form `file:`. The model should describe the public exports of that file. This can be used to derive sources and sinks in code that imports the file, but note that sources and sinks will not generally be placed within the file itself. For example, a source model `['file:lib/service.js', 'Member[getData].ReturnValue', 'remote']` could identify `require('../lib/service').getData()` as a source. ### Minor Analysis Improvements * JavaScript security queries using the `response` threat model now track promise-wrapped client response data into promise fulfillment values. This may improve results for queries such as `js/xss` when response data is consumed through `.then(...)` chains. -* The route object returned by Vue Router's `useRoute()` Composition API is now recognized as a client-side remote flow source, covering its `query`, `params`, `path`, `fullPath`, and `hash` members. These members are additionally reported under the corresponding `browser-url-query`, `browser-url-path`, and `browser-url-fragment` threat models. +* The route object returned by Vue Router's `useRoute()` Composition API is now recognized as a client-side remote flow source, covering its `query`, `params`, `path`, `fullPath`, and `hash` members. These members are additionally reported under the `browser-url-query`, `browser-url-path`, and `browser-url-fragment` threat models. * Added flow models for Vue's `ref`, `shallowRef`, `toRef`, `reactive`, and `computed` Composition API helpers. * Added support for treating declared `inputs` properties in Sails Action2 controller files as remote flow sources. This may improve results for security queries such as `js/path-injection`. From 8887b2ec68c37b68956feba65e1b2402b4afb3df Mon Sep 17 00:00:00 2001 From: Henry Mercer Date: Thu, 6 Aug 2026 11:53:51 +0100 Subject: [PATCH 0124/2098] Ruby: Tweak changelog note for readability --- ruby/ql/lib/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruby/ql/lib/CHANGELOG.md b/ruby/ql/lib/CHANGELOG.md index 146fdb46d43c..55c64cb527cb 100644 --- a/ruby/ql/lib/CHANGELOG.md +++ b/ruby/ql/lib/CHANGELOG.md @@ -2,7 +2,7 @@ ### Minor Analysis Improvements -* Removed library input to vendored gems from the set of taint sources. This should reduce false positives for `rb/polynomial-redos`, `rb/regex/badly-anchored-regexp`, `rb/unsafe-code-construction`, `rb/html-constructed-from-input`, and `rb/shell-command-constructed-from-input` whenever vendoring is used. +* Parameters of methods exported by vendored gems are no longer treated as flow sources, since such methods are only called from within the codebase. This should reduce false positives for `rb/polynomial-redos`, `rb/regex/badly-anchored-regexp`, `rb/unsafe-code-construction`, `rb/html-constructed-from-input`, and `rb/shell-command-constructed-from-input` in codebases that vendor their dependencies. ## 6.0.2 From 47d6b113fc32d029a766f9210e1c7a4b5a32de9f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 6 Aug 2026 11:29:35 +0000 Subject: [PATCH 0125/2098] Post-release preparation for codeql-cli-2.26.3 --- actions/ql/lib/qlpack.yml | 2 +- actions/ql/src/qlpack.yml | 2 +- cpp/ql/lib/qlpack.yml | 2 +- cpp/ql/src/qlpack.yml | 2 +- csharp/ql/campaigns/Solorigate/lib/qlpack.yml | 2 +- csharp/ql/campaigns/Solorigate/src/qlpack.yml | 2 +- csharp/ql/lib/qlpack.yml | 2 +- csharp/ql/src/qlpack.yml | 2 +- go/ql/consistency-queries/qlpack.yml | 2 +- go/ql/lib/qlpack.yml | 2 +- go/ql/src/qlpack.yml | 2 +- java/ql/lib/qlpack.yml | 2 +- java/ql/src/qlpack.yml | 2 +- javascript/ql/lib/qlpack.yml | 2 +- javascript/ql/src/qlpack.yml | 2 +- misc/suite-helpers/qlpack.yml | 2 +- python/ql/lib/qlpack.yml | 2 +- python/ql/src/qlpack.yml | 2 +- ruby/ql/lib/qlpack.yml | 2 +- ruby/ql/src/qlpack.yml | 2 +- rust/ql/lib/qlpack.yml | 2 +- rust/ql/src/qlpack.yml | 2 +- shared/concepts/qlpack.yml | 2 +- shared/controlflow/qlpack.yml | 2 +- shared/dataflow/qlpack.yml | 2 +- shared/mad/qlpack.yml | 2 +- shared/namebinding/qlpack.yml | 2 +- shared/quantum/qlpack.yml | 2 +- shared/rangeanalysis/qlpack.yml | 2 +- shared/regex/qlpack.yml | 2 +- shared/ssa/qlpack.yml | 2 +- shared/threat-models/qlpack.yml | 2 +- shared/tutorial/qlpack.yml | 2 +- shared/typeflow/qlpack.yml | 2 +- shared/typeinference/qlpack.yml | 2 +- shared/typetracking/qlpack.yml | 2 +- shared/typos/qlpack.yml | 2 +- shared/util/qlpack.yml | 2 +- shared/xml/qlpack.yml | 2 +- shared/yaml/qlpack.yml | 2 +- swift/ql/lib/qlpack.yml | 2 +- swift/ql/src/qlpack.yml | 2 +- 42 files changed, 42 insertions(+), 42 deletions(-) diff --git a/actions/ql/lib/qlpack.yml b/actions/ql/lib/qlpack.yml index 859c7eb4a6f4..d34e010773d5 100644 --- a/actions/ql/lib/qlpack.yml +++ b/actions/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-all -version: 0.5.0 +version: 0.5.1-dev library: true warnOnImplicitThis: true dependencies: diff --git a/actions/ql/src/qlpack.yml b/actions/ql/src/qlpack.yml index 648a6fb436fa..7fd1cb7e8d76 100644 --- a/actions/ql/src/qlpack.yml +++ b/actions/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-queries -version: 0.6.33 +version: 0.6.34-dev library: false warnOnImplicitThis: true groups: [actions, queries] diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index fd32327163ba..0d952a0c1bf9 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-all -version: 12.0.2 +version: 12.0.3-dev groups: cpp dbscheme: semmlecode.cpp.dbscheme extractor: cpp diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml index 8495d389e7fb..278570c799c1 100644 --- a/cpp/ql/src/qlpack.yml +++ b/cpp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-queries -version: 1.8.1 +version: 1.8.2-dev groups: - cpp - queries diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml index 8333936d134a..0cfb3ff63b60 100644 --- a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-all -version: 1.7.72 +version: 1.7.73-dev groups: - csharp - solorigate diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml index 5379a3416f94..6b8fec930b4c 100644 --- a/csharp/ql/campaigns/Solorigate/src/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-queries -version: 1.7.72 +version: 1.7.73-dev groups: - csharp - solorigate diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index 82fec250fc95..508cf13c8ff8 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-all -version: 7.1.2 +version: 7.1.3-dev groups: csharp dbscheme: semmlecode.csharp.dbscheme extractor: csharp diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml index 647d273d52bc..4ef09838698b 100644 --- a/csharp/ql/src/qlpack.yml +++ b/csharp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-queries -version: 1.9.1 +version: 1.9.2-dev groups: - csharp - queries diff --git a/go/ql/consistency-queries/qlpack.yml b/go/ql/consistency-queries/qlpack.yml index 3ade0367079d..60858d6a6abe 100644 --- a/go/ql/consistency-queries/qlpack.yml +++ b/go/ql/consistency-queries/qlpack.yml @@ -1,5 +1,5 @@ name: codeql-go-consistency-queries -version: 1.0.55 +version: 1.0.56-dev groups: - go - queries diff --git a/go/ql/lib/qlpack.yml b/go/ql/lib/qlpack.yml index d11fb5937d3b..f9e43b1c5c5f 100644 --- a/go/ql/lib/qlpack.yml +++ b/go/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-all -version: 7.2.3 +version: 7.2.4-dev groups: go dbscheme: go.dbscheme extractor: go diff --git a/go/ql/src/qlpack.yml b/go/ql/src/qlpack.yml index 61ae6f2fe439..85593d15c062 100644 --- a/go/ql/src/qlpack.yml +++ b/go/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-queries -version: 1.6.8 +version: 1.6.9-dev groups: - go - queries diff --git a/java/ql/lib/qlpack.yml b/java/ql/lib/qlpack.yml index e8e9de7cd03c..1dd82feca5c3 100644 --- a/java/ql/lib/qlpack.yml +++ b/java/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-all -version: 9.2.3 +version: 9.2.4-dev groups: java dbscheme: config/semmlecode.dbscheme extractor: java diff --git a/java/ql/src/qlpack.yml b/java/ql/src/qlpack.yml index e22f77c81351..058109d0e15f 100644 --- a/java/ql/src/qlpack.yml +++ b/java/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-queries -version: 1.11.8 +version: 1.11.9-dev groups: - java - queries diff --git a/javascript/ql/lib/qlpack.yml b/javascript/ql/lib/qlpack.yml index a8caae8cf334..ede19f219f4a 100644 --- a/javascript/ql/lib/qlpack.yml +++ b/javascript/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-all -version: 2.9.0 +version: 2.9.1-dev groups: javascript dbscheme: semmlecode.javascript.dbscheme extractor: javascript diff --git a/javascript/ql/src/qlpack.yml b/javascript/ql/src/qlpack.yml index b21af7515f5b..0637027f116e 100644 --- a/javascript/ql/src/qlpack.yml +++ b/javascript/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-queries -version: 2.4.3 +version: 2.4.4-dev groups: - javascript - queries diff --git a/misc/suite-helpers/qlpack.yml b/misc/suite-helpers/qlpack.yml index dff0d253cbce..7ced46ab5f70 100644 --- a/misc/suite-helpers/qlpack.yml +++ b/misc/suite-helpers/qlpack.yml @@ -1,4 +1,4 @@ name: codeql/suite-helpers -version: 1.0.55 +version: 1.0.56-dev groups: shared warnOnImplicitThis: true diff --git a/python/ql/lib/qlpack.yml b/python/ql/lib/qlpack.yml index d8914df8750b..03adb1ffdb0d 100644 --- a/python/ql/lib/qlpack.yml +++ b/python/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-all -version: 7.2.3 +version: 7.2.4-dev groups: python dbscheme: semmlecode.python.dbscheme extractor: python diff --git a/python/ql/src/qlpack.yml b/python/ql/src/qlpack.yml index 1aca14fd33ae..fbc81c7cc67f 100644 --- a/python/ql/src/qlpack.yml +++ b/python/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-queries -version: 1.8.8 +version: 1.8.9-dev groups: - python - queries diff --git a/ruby/ql/lib/qlpack.yml b/ruby/ql/lib/qlpack.yml index 597e6242c9dd..06d3ec94a09b 100644 --- a/ruby/ql/lib/qlpack.yml +++ b/ruby/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-all -version: 6.0.3 +version: 6.0.4-dev groups: ruby extractor: ruby dbscheme: ruby.dbscheme diff --git a/ruby/ql/src/qlpack.yml b/ruby/ql/src/qlpack.yml index 60d063996d4a..5254397baeea 100644 --- a/ruby/ql/src/qlpack.yml +++ b/ruby/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-queries -version: 1.6.8 +version: 1.6.9-dev groups: - ruby - queries diff --git a/rust/ql/lib/qlpack.yml b/rust/ql/lib/qlpack.yml index 9f013c345d61..540d610d6973 100644 --- a/rust/ql/lib/qlpack.yml +++ b/rust/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rust-all -version: 0.2.19 +version: 0.2.20-dev groups: rust extractor: rust dbscheme: rust.dbscheme diff --git a/rust/ql/src/qlpack.yml b/rust/ql/src/qlpack.yml index a4a357bff44f..81689b84b84c 100644 --- a/rust/ql/src/qlpack.yml +++ b/rust/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rust-queries -version: 0.1.40 +version: 0.1.41-dev groups: - rust - queries diff --git a/shared/concepts/qlpack.yml b/shared/concepts/qlpack.yml index b00bbb9f887b..396702b47ac7 100644 --- a/shared/concepts/qlpack.yml +++ b/shared/concepts/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/concepts -version: 0.0.29 +version: 0.0.30-dev groups: shared library: true dependencies: diff --git a/shared/controlflow/qlpack.yml b/shared/controlflow/qlpack.yml index d3cc00f776ed..d8cef947cef8 100644 --- a/shared/controlflow/qlpack.yml +++ b/shared/controlflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/controlflow -version: 2.0.39 +version: 2.0.40-dev groups: shared library: true dependencies: diff --git a/shared/dataflow/qlpack.yml b/shared/dataflow/qlpack.yml index 3c53868dc3ce..3d006f14f1e9 100644 --- a/shared/dataflow/qlpack.yml +++ b/shared/dataflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/dataflow -version: 2.1.11 +version: 2.1.12-dev groups: shared library: true dependencies: diff --git a/shared/mad/qlpack.yml b/shared/mad/qlpack.yml index 72caf44fdad2..512f38311c1c 100644 --- a/shared/mad/qlpack.yml +++ b/shared/mad/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/mad -version: 1.0.55 +version: 1.0.56-dev groups: shared library: true dependencies: diff --git a/shared/namebinding/qlpack.yml b/shared/namebinding/qlpack.yml index 587b6de4f125..f7148fda4b99 100644 --- a/shared/namebinding/qlpack.yml +++ b/shared/namebinding/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/namebinding -version: 0.0.4 +version: 0.0.5-dev groups: shared library: true dependencies: diff --git a/shared/quantum/qlpack.yml b/shared/quantum/qlpack.yml index c26d83a0a25f..e6d49cdd37fb 100644 --- a/shared/quantum/qlpack.yml +++ b/shared/quantum/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/quantum -version: 0.0.33 +version: 0.0.34-dev groups: shared library: true dependencies: diff --git a/shared/rangeanalysis/qlpack.yml b/shared/rangeanalysis/qlpack.yml index d8b0292bfdae..1a2c8789b3c0 100644 --- a/shared/rangeanalysis/qlpack.yml +++ b/shared/rangeanalysis/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rangeanalysis -version: 1.0.55 +version: 1.0.56-dev groups: shared library: true dependencies: diff --git a/shared/regex/qlpack.yml b/shared/regex/qlpack.yml index 187bb5f5af95..93d5bd2a5b9e 100644 --- a/shared/regex/qlpack.yml +++ b/shared/regex/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/regex -version: 1.0.55 +version: 1.0.56-dev groups: shared library: true dependencies: diff --git a/shared/ssa/qlpack.yml b/shared/ssa/qlpack.yml index a66e5225abd0..fae71bc1f950 100644 --- a/shared/ssa/qlpack.yml +++ b/shared/ssa/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ssa -version: 2.0.31 +version: 2.0.32-dev groups: shared library: true dependencies: diff --git a/shared/threat-models/qlpack.yml b/shared/threat-models/qlpack.yml index 93ab66cfc33f..6717a88aa990 100644 --- a/shared/threat-models/qlpack.yml +++ b/shared/threat-models/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/threat-models -version: 1.0.55 +version: 1.0.56-dev library: true groups: shared dataExtensions: diff --git a/shared/tutorial/qlpack.yml b/shared/tutorial/qlpack.yml index 0a6f77df0754..2f41f25c2f2a 100644 --- a/shared/tutorial/qlpack.yml +++ b/shared/tutorial/qlpack.yml @@ -1,7 +1,7 @@ name: codeql/tutorial description: Library for the CodeQL detective tutorials, helping new users learn to write CodeQL queries. -version: 1.0.55 +version: 1.0.56-dev groups: shared library: true warnOnImplicitThis: true diff --git a/shared/typeflow/qlpack.yml b/shared/typeflow/qlpack.yml index deb074f38410..2f25d00ba810 100644 --- a/shared/typeflow/qlpack.yml +++ b/shared/typeflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeflow -version: 1.0.55 +version: 1.0.56-dev groups: shared library: true dependencies: diff --git a/shared/typeinference/qlpack.yml b/shared/typeinference/qlpack.yml index b2bef17c8c5a..8f5e25ee40f5 100644 --- a/shared/typeinference/qlpack.yml +++ b/shared/typeinference/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeinference -version: 0.0.36 +version: 0.0.37-dev groups: shared library: true dependencies: diff --git a/shared/typetracking/qlpack.yml b/shared/typetracking/qlpack.yml index b4c98d2ed55b..546ade1b9009 100644 --- a/shared/typetracking/qlpack.yml +++ b/shared/typetracking/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typetracking -version: 2.0.39 +version: 2.0.40-dev groups: shared library: true dependencies: diff --git a/shared/typos/qlpack.yml b/shared/typos/qlpack.yml index 7f17b05eb5dc..8ab53a9e282c 100644 --- a/shared/typos/qlpack.yml +++ b/shared/typos/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typos -version: 1.0.55 +version: 1.0.56-dev groups: shared library: true warnOnImplicitThis: true diff --git a/shared/util/qlpack.yml b/shared/util/qlpack.yml index 85d435b88027..f24d0b264364 100644 --- a/shared/util/qlpack.yml +++ b/shared/util/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/util -version: 2.0.42 +version: 2.0.43-dev groups: shared library: true dependencies: null diff --git a/shared/xml/qlpack.yml b/shared/xml/qlpack.yml index 2e4d61f11abe..99d7e6f74a93 100644 --- a/shared/xml/qlpack.yml +++ b/shared/xml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/xml -version: 1.0.55 +version: 1.0.56-dev groups: shared library: true dependencies: diff --git a/shared/yaml/qlpack.yml b/shared/yaml/qlpack.yml index 5c5a36fa69f3..530e0c8452e1 100644 --- a/shared/yaml/qlpack.yml +++ b/shared/yaml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/yaml -version: 1.0.55 +version: 1.0.56-dev groups: shared library: true warnOnImplicitThis: true diff --git a/swift/ql/lib/qlpack.yml b/swift/ql/lib/qlpack.yml index 856752875cd8..78f6f1947d9f 100644 --- a/swift/ql/lib/qlpack.yml +++ b/swift/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-all -version: 6.8.1 +version: 6.8.2-dev groups: swift extractor: swift dbscheme: swift.dbscheme diff --git a/swift/ql/src/qlpack.yml b/swift/ql/src/qlpack.yml index 91be0e594012..26e142611198 100644 --- a/swift/ql/src/qlpack.yml +++ b/swift/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-queries -version: 1.3.8 +version: 1.3.9-dev groups: - swift - queries From c2d938389fe29ebf0e34d0585cc1d587bdb4b225 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Thu, 6 Aug 2026 14:16:58 +0200 Subject: [PATCH 0126/2098] Address Copilot review comments --- unified/extractor/build.rs | 2 ++ unified/extractor/tests/corpus_tests.rs | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/unified/extractor/build.rs b/unified/extractor/build.rs index bf4053308e9f..22db82bc0ff3 100644 --- a/unified/extractor/build.rs +++ b/unified/extractor/build.rs @@ -1,4 +1,6 @@ fn main() { + println!("cargo:rustc-check-cfg=cfg(bazel)"); + if let Ok(dir) = std::env::var("DEP_SWIFTSYNTAXFFI_LIBDIR") { println!("cargo:rustc-link-search=native={dir}"); println!("cargo:rustc-link-lib=dylib=SwiftSyntaxFFI"); diff --git a/unified/extractor/tests/corpus_tests.rs b/unified/extractor/tests/corpus_tests.rs index 319503ce4b63..f0a3c448f12b 100644 --- a/unified/extractor/tests/corpus_tests.rs +++ b/unified/extractor/tests/corpus_tests.rs @@ -114,7 +114,6 @@ fn corpus_dir() -> std::path::PathBuf { std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("tests/corpus") } - #[test] fn test_corpus() { let update_mode = update_mode_enabled(); From fc66e89940515130b20758aa33245b7fca422034 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Thu, 6 Aug 2026 15:08:59 +0200 Subject: [PATCH 0127/2098] Yeast: silence warning ``` warning: hiding a lifetime that's elided elsewhere is confusing --> external/ql+/shared/yeast/src/lib.rs:495:17 | 495 | pub fn walk(&self) -> AstCursor { | ^^^^^ ^^^^^^^^^ the same lifetime is hidden here | | | the lifetime is elided here | = help: the same lifetime is referred to in inconsistent ways, making the signature confusing = note: `#[warn(mismatched_lifetime_syntaxes)]` on by default help: use `'_` for type paths | 495 | pub fn walk(&self) -> AstCursor<'_> { | ++++ warning: 1 warning emitted ``` --- shared/yeast/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/yeast/src/lib.rs b/shared/yeast/src/lib.rs index cf06d2d2c17b..c290246541f5 100644 --- a/shared/yeast/src/lib.rs +++ b/shared/yeast/src/lib.rs @@ -492,7 +492,7 @@ impl Ast { } } - pub fn walk(&self) -> AstCursor { + pub fn walk(&self) -> AstCursor<'_> { AstCursor::new(self) } From 51c5d65d6c357bbef60a3d99ff6f10698f76bef6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 6 Aug 2026 15:07:11 +0000 Subject: [PATCH 0128/2098] Sync unified docs with PR #22290 (in-process swift-syntax-rs parsing) Co-authored-by: jketema <93738568+jketema@users.noreply.github.com> --- unified/AGENTS.md | 14 +++++++------- unified/swift-syntax-rs/README.md | 23 +++++++++++------------ 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/unified/AGENTS.md b/unified/AGENTS.md index 9c9bbbb534cb..1de07ee2eab9 100644 --- a/unified/AGENTS.md +++ b/unified/AGENTS.md @@ -8,9 +8,10 @@ by Apple's swift-syntax rather than by tree-sitter. - To build the extractor, run `scripts/create-extractor-pack.sh` ## Swift Parser -- Swift source is parsed by `swift-syntax-parse`, a small Swift/Rust binary in - `swift-syntax-rs` that wraps Apple's swift-syntax and emits the parse tree as - JSON. There is no grammar in this repository to edit. +- Swift source is parsed by the `swift-syntax-rs` crate, which wraps Apple's + swift-syntax. The extractor calls `swift_syntax_rs::parse_to_json` in-process + to obtain the parse tree as JSON — there is no separate parser binary and no + grammar in this repository to edit. - `extractor/src/languages/swift/adapter.rs` converts that JSON into a yeast AST. @@ -23,10 +24,9 @@ by Apple's swift-syntax rather than by tree-sitter. - The mapping from the parse tree to the target AST is found in `extractor/src/languages/swift/swift.rs` - To run tests for the parser and mapping, run `cargo test` in the `extractor` - directory. The tests need the `swift-syntax-parse` binary: point - `CODEQL_EXTRACTOR_UNIFIED_SWIFT_SYNTAX_PARSE` at it, or put it on `PATH`. - Corpus tests skip themselves when it cannot be found, so check for skips - before concluding a change is clean. + directory. Since the parser is linked in-process, this needs a working Swift + toolchain (so `swift-syntax-rs` can build). The tests can also be run under + Bazel via `bazel test //unified/extractor:all_tests`. - Extractor test cases are located at `extractor/tests/corpus/swift/*/*.swift`. diff --git a/unified/swift-syntax-rs/README.md b/unified/swift-syntax-rs/README.md index 7d15c6f2c23e..8a93e4739d9d 100644 --- a/unified/swift-syntax-rs/README.md +++ b/unified/swift-syntax-rs/README.md @@ -132,27 +132,22 @@ The build does not depend on any particular version manager. You need: (currently `6.3.2`), used to build `swift-syntax` `603.0.2`. Install it any way you like — [swift.org](https://www.swift.org/install/) or [swiftly](https://www.swift.org/swiftly/) (which reads `.swift-version`), or a - system package. Just make sure `swift` is on your `PATH` (or point `build.rs` - at it with the `SWIFT` environment variable). + system package. Just make sure `swift` (and `swiftc`) are on your `PATH` — + `build.rs` invokes them directly and does not read any environment variable + to locate them. On Debian/Ubuntu the Swift runtime also needs `libncurses6` (and related libs) available on the system. ## Building & testing -With `cargo` and `swift` on `PATH`: +With `cargo` and `swift`/`swiftc` on `PATH`: ```sh cargo build cargo test ``` -If your `swift`/`swiftc` are not on `PATH`, point the build at them explicitly: - -```sh -SWIFT=/path/to/swift SWIFTC=/path/to/swiftc cargo build -``` - The first build compiles `swift-syntax` and can take several minutes. ## Building with Bazel (CI) @@ -170,6 +165,10 @@ bazel test //unified/swift-syntax-rs:swift_syntax_rs_test bazel run //unified/swift-syntax-rs:swift-syntax-parse < some.swift ``` +The `swift-syntax-parse` binary is a debugging aid for looking at the raw +swift-syntax JSON for some input; it is not shipped as part of the extractor +pack, which links `swift-syntax-rs` directly instead. + Requirements: - **`clang`** must be installed on the runner. `rules_swift` requires the Bazel @@ -221,9 +220,9 @@ echo 'let x = 1' | cargo run --bin swift-syntax-parse The JSON tree is consumed by the CodeQL extractor, which converts it into a [`yeast::Ast`](../../shared/yeast) — the in-memory format its rewrite rules operate on. That adapter is a pure-Rust module living in the extractor -(`unified/extractor/src/languages/swift/adapter.rs`), so the extractor never -needs the Swift toolchain: it consumes the JSON produced out-of-process by this -crate's `parse_to_json` / the `swift-syntax-parse` binary. +(`unified/extractor/src/languages/swift/adapter.rs`). The extractor links +`swift-syntax-rs` directly and consumes the JSON produced in-process by this +crate's `parse_to_json`. ## Layout From 381ef187952851f6f4d69022b7a1f24d8400dccc Mon Sep 17 00:00:00 2001 From: Jeroen Ketema <93738568+jketema@users.noreply.github.com> Date: Thu, 6 Aug 2026 17:17:25 +0200 Subject: [PATCH 0129/2098] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- unified/AGENTS.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/unified/AGENTS.md b/unified/AGENTS.md index 1de07ee2eab9..bbd271764f45 100644 --- a/unified/AGENTS.md +++ b/unified/AGENTS.md @@ -10,8 +10,8 @@ by Apple's swift-syntax rather than by tree-sitter. ## Swift Parser - Swift source is parsed by the `swift-syntax-rs` crate, which wraps Apple's swift-syntax. The extractor calls `swift_syntax_rs::parse_to_json` in-process - to obtain the parse tree as JSON — there is no separate parser binary and no - grammar in this repository to edit. + to obtain the parse tree as JSON; the extractor does not invoke a separate + parser binary, and there is no grammar in this repository to edit. - `extractor/src/languages/swift/adapter.rs` converts that JSON into a yeast AST. From 1e6ef80a7e2de97b4b45f36ce2365330af65d644 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 6 Aug 2026 21:35:30 +0200 Subject: [PATCH 0130/2098] Rust: Add another captured varible flow test --- .../ql/test/library-tests/dataflow/lambdas/external_file.rs | 6 ++++++ .../library-tests/dataflow/lambdas/inline-flow.expected | 5 +++++ rust/ql/test/library-tests/dataflow/lambdas/main.rs | 1 + 3 files changed, 12 insertions(+) diff --git a/rust/ql/test/library-tests/dataflow/lambdas/external_file.rs b/rust/ql/test/library-tests/dataflow/lambdas/external_file.rs index 190733fd482a..c43269e48c16 100644 --- a/rust/ql/test/library-tests/dataflow/lambdas/external_file.rs +++ b/rust/ql/test/library-tests/dataflow/lambdas/external_file.rs @@ -3,3 +3,9 @@ pub fn may_invoke_callback1(f: F) {} pub fn may_invoke_callback2(f: F) {} pub fn may_invoke_callback3(f: impl Fn(i64)) {} + +pub fn may_invoke_callback4(f: T) +where + T: for<'a> FnOnce(&'a mut i64), +{ +} diff --git a/rust/ql/test/library-tests/dataflow/lambdas/inline-flow.expected b/rust/ql/test/library-tests/dataflow/lambdas/inline-flow.expected index 049c30c06add..08fb2a66015e 100644 --- a/rust/ql/test/library-tests/dataflow/lambdas/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/lambdas/inline-flow.expected @@ -58,9 +58,11 @@ edges | main.rs:109:13:109:22 | source(...) | main.rs:110:26:110:36 | \|...\| ... : ... => .. [captured a] | provenance | | | main.rs:109:13:109:22 | source(...) | main.rs:111:26:111:36 | \|...\| ... : ... => .. [captured a] | provenance | | | main.rs:109:13:109:22 | source(...) | main.rs:112:26:112:36 | \|...\| ... : ... => .. [captured a] | provenance | | +| main.rs:109:13:109:22 | source(...) | main.rs:113:26:113:36 | \|...\| ... : ... => .. [captured a] | provenance | | | main.rs:110:26:110:36 | \|...\| ... : ... => .. [captured a] | main.rs:110:35:110:35 | a | provenance | heuristic-callback | | main.rs:111:26:111:36 | \|...\| ... : ... => .. [captured a] | main.rs:111:35:111:35 | a | provenance | heuristic-callback | | main.rs:112:26:112:36 | \|...\| ... : ... => .. [captured a] | main.rs:112:35:112:35 | a | provenance | heuristic-callback | +| main.rs:113:26:113:36 | \|...\| ... : ... => .. [captured a] | main.rs:113:35:113:35 | a | provenance | heuristic-callback | nodes | main.rs:10:20:10:52 | if cond {...} else {...} | semmle.label | if cond {...} else {...} | | main.rs:10:30:10:39 | source(...) | semmle.label | source(...) | @@ -134,6 +136,8 @@ nodes | main.rs:111:35:111:35 | a | semmle.label | a | | main.rs:112:26:112:36 | \|...\| ... : ... => .. [captured a] | semmle.label | \|...\| ... : ... => .. [captured a] | | main.rs:112:35:112:35 | a | semmle.label | a | +| main.rs:113:26:113:36 | \|...\| ... : ... => .. [captured a] | semmle.label | \|...\| ... : ... => .. [captured a] | +| main.rs:113:35:113:35 | a | semmle.label | a | subpaths | main.rs:29:21:29:21 | a | main.rs:27:20:27:23 | ... | main.rs:27:26:27:52 | if cond {...} else {...} | main.rs:29:13:29:22 | f(...) | | main.rs:77:21:77:21 | a | main.rs:66:24:66:32 | ...: i64 | main.rs:66:42:72:1 | { ... } | main.rs:77:13:77:22 | f(...) | @@ -156,3 +160,4 @@ testFailures | main.rs:110:35:110:35 | a | main.rs:109:13:109:22 | source(...) | main.rs:110:35:110:35 | a | $@ | main.rs:109:13:109:22 | source(...) | source(...) | | main.rs:111:35:111:35 | a | main.rs:109:13:109:22 | source(...) | main.rs:111:35:111:35 | a | $@ | main.rs:109:13:109:22 | source(...) | source(...) | | main.rs:112:35:112:35 | a | main.rs:109:13:109:22 | source(...) | main.rs:112:35:112:35 | a | $@ | main.rs:109:13:109:22 | source(...) | source(...) | +| main.rs:113:35:113:35 | a | main.rs:109:13:109:22 | source(...) | main.rs:113:35:113:35 | a | $@ | main.rs:109:13:109:22 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/lambdas/main.rs b/rust/ql/test/library-tests/dataflow/lambdas/main.rs index 476a7570e018..742974eaab9c 100644 --- a/rust/ql/test/library-tests/dataflow/lambdas/main.rs +++ b/rust/ql/test/library-tests/dataflow/lambdas/main.rs @@ -110,6 +110,7 @@ fn test_external_call() { may_invoke_callback1(|x| sink(a)); // $ hasValueFlow=81 may_invoke_callback2(|x| sink(a)); // $ hasValueFlow=81 may_invoke_callback3(|x| sink(a)); // $ hasValueFlow=81 + may_invoke_callback4(|x| sink(a)); // $ hasValueFlow=81 } fn main() { From 60baec6745bbe75ee416244bacb0d353370b191b Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 6 Aug 2026 20:33:53 +0200 Subject: [PATCH 0131/2098] unified: Add test showing problem with literal getValue() getValue() returns an empty string for various literals --- unified/ql/test/library-tests/BasicTest/strings.swift | 1 + unified/ql/test/library-tests/BasicTest/test.expected | 2 ++ unified/ql/test/library-tests/BasicTest/test.ql | 2 ++ 3 files changed, 5 insertions(+) create mode 100644 unified/ql/test/library-tests/BasicTest/strings.swift diff --git a/unified/ql/test/library-tests/BasicTest/strings.swift b/unified/ql/test/library-tests/BasicTest/strings.swift new file mode 100644 index 000000000000..db9ae84e980b --- /dev/null +++ b/unified/ql/test/library-tests/BasicTest/strings.swift @@ -0,0 +1 @@ +let x = "hello" diff --git a/unified/ql/test/library-tests/BasicTest/test.expected b/unified/ql/test/library-tests/BasicTest/test.expected index b9f4eafe8653..6043574bef25 100644 --- a/unified/ql/test/library-tests/BasicTest/test.expected +++ b/unified/ql/test/library-tests/BasicTest/test.expected @@ -35,3 +35,5 @@ nameExpr | test.swift:87:38:87:43 | NameExpr | values | | test.swift:87:49:87:57 | NameExpr | transform | unsupported +stringValue +| strings.swift:1:9:1:15 | | | diff --git a/unified/ql/test/library-tests/BasicTest/test.ql b/unified/ql/test/library-tests/BasicTest/test.ql index 5e70f9303687..8e30af381d61 100644 --- a/unified/ql/test/library-tests/BasicTest/test.ql +++ b/unified/ql/test/library-tests/BasicTest/test.ql @@ -3,3 +3,5 @@ import unified query predicate nameExpr(NameExpr node, string value) { value = node.getIdentifier().getValue() } query predicate unsupported(UnsupportedNode node, string value) { value = node.getValue() } + +query predicate stringValue(StringLiteral e, string value) { value = e.getValue() } From 51fe2730855f84aa1e26cf91fc3d3ec0749a253f Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 6 Aug 2026 20:32:46 +0200 Subject: [PATCH 0132/2098] unified: Fix extraction of literals --- unified/extractor/src/languages/swift/swift.rs | 12 ++++++------ .../ql/test/library-tests/BasicTest/test.expected | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/unified/extractor/src/languages/swift/swift.rs b/unified/extractor/src/languages/swift/swift.rs index ccc1cc7f725d..e76e7ef212d4 100644 --- a/unified/extractor/src/languages/swift/swift.rs +++ b/unified/extractor/src/languages/swift/swift.rs @@ -158,12 +158,12 @@ fn translation_rules() -> Vec> { // swift-syntax does not distinguish the lexical integer/string forms // (hex/binary/octal, single- vs multi-line, raw): each is a single // `*LiteralExpr` kind, so one rule per literal type suffices. - rule!((integerLiteralExpr) => (int_literal)), - rule!((floatLiteralExpr) => (float_literal)), - rule!((booleanLiteralExpr) => (boolean_literal)), - rule!((nilLiteralExpr) => (builtin_expr)), - rule!((stringLiteralExpr) => (string_literal)), - rule!((regexLiteralExpr) => (regex_literal)), + rule!((integerLiteralExpr) @@node => (int_literal #{node})), + rule!((floatLiteralExpr) @@node => (float_literal #{node})), + rule!((booleanLiteralExpr) @@node => (boolean_literal #{node})), + rule!((nilLiteralExpr) @@node => (builtin_expr #{node})), + rule!((stringLiteralExpr) @@node => (string_literal #{node})), + rule!((regexLiteralExpr) @@node => (regex_literal #{node})), // ---- Names ---- // A function reference spelled with argument labels (`f(x:y:z:)`) is a // `declReferenceExpr` carrying `argumentNames`. Mark it unsupported for diff --git a/unified/ql/test/library-tests/BasicTest/test.expected b/unified/ql/test/library-tests/BasicTest/test.expected index 6043574bef25..301cd90ca2a5 100644 --- a/unified/ql/test/library-tests/BasicTest/test.expected +++ b/unified/ql/test/library-tests/BasicTest/test.expected @@ -36,4 +36,4 @@ nameExpr | test.swift:87:49:87:57 | NameExpr | transform | unsupported stringValue -| strings.swift:1:9:1:15 | | | +| strings.swift:1:9:1:15 | "hello" | "hello" | From b71ff8f233772efd41db45affde7f8b0a2a04b00 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 6 Aug 2026 10:00:57 +0200 Subject: [PATCH 0133/2098] unified: Factor some code into CommentUtil.qll --- unified/ql/lib/utils/test/CommentUtil.qll | 20 +++++++++++++++++++ .../library-tests/local-name-binding/test.ql | 20 +------------------ 2 files changed, 21 insertions(+), 19 deletions(-) create mode 100644 unified/ql/lib/utils/test/CommentUtil.qll diff --git a/unified/ql/lib/utils/test/CommentUtil.qll b/unified/ql/lib/utils/test/CommentUtil.qll new file mode 100644 index 000000000000..6747aed57187 --- /dev/null +++ b/unified/ql/lib/utils/test/CommentUtil.qll @@ -0,0 +1,20 @@ +private import unified + +/** Holds if a comment with `text` appears at `filepath:line`, excluding the text in a `$` section. */ +predicate plainCommentAt(string filepath, int line, string text) { + exists(Comment comment | + comment.getLocation().hasLocationInfo(filepath, line, _, _, _) and + text = comment.getCommentText().regexpReplaceAll("\\$([^/]|/[^/])*", "") + ) +} + +/** Holds if a `key=value` comment appears on `filepath:line` (not in the `$` section). */ +predicate keyValueCommentAt(string filepath, int line, string key, string value) { + exists(string text, string regexp, string match | + plainCommentAt(filepath, line, text) and + regexp = "(\\w+)=([\\w.]+)" and + match = text.regexpFind(regexp, _, _) and + key = match.regexpCapture(regexp, 1) and + value = match.regexpCapture(regexp, 2) + ) +} diff --git a/unified/ql/test/library-tests/local-name-binding/test.ql b/unified/ql/test/library-tests/local-name-binding/test.ql index 0fcae36dd31e..e430f16ba48d 100644 --- a/unified/ql/test/library-tests/local-name-binding/test.ql +++ b/unified/ql/test/library-tests/local-name-binding/test.ql @@ -1,26 +1,8 @@ import unified import utils.test.InlineExpectationsTest +import utils.test.CommentUtil import codeql.unified.internal.LocalNameBinding -/** Holds if a comment with `text` appears at `filepath:line`, excluding the text in a `$` section. */ -predicate plainCommentAt(string filepath, int line, string text) { - exists(Comment comment | - comment.getLocation().hasLocationInfo(filepath, line, _, _, _) and - text = comment.getCommentText().regexpReplaceAll("\\$([^/]|/[^/])*", "") - ) -} - -/** Holds if a `key=value` comment appears on `filepath:line` (not in the `$` section). */ -predicate keyValueCommentAt(string filepath, int line, string key, string value) { - exists(string text, string regexp, string match | - plainCommentAt(filepath, line, text) and - regexp = "(\\w+)=([\\w.]+)" and - match = text.regexpFind(regexp, _, _) and - key = match.regexpCapture(regexp, 1) and - value = match.regexpCapture(regexp, 2) - ) -} - module VariableAccessTest implements TestSig { string getARelevantTag() { result = "access" } From c9fc793d008fe7542b1b3dcb783e88dbe7a3c4f2 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 6 Aug 2026 11:00:46 +0200 Subject: [PATCH 0134/2098] unified: Fix mapping for compound type names --- .../extractor/src/languages/swift/swift.rs | 10 +- .../corpus/swift/types/qualified-type.output | 139 ++++++++++++++++++ .../corpus/swift/types/qualified-type.swift | 8 + 3 files changed, 154 insertions(+), 3 deletions(-) create mode 100644 unified/extractor/tests/corpus/swift/types/qualified-type.output create mode 100644 unified/extractor/tests/corpus/swift/types/qualified-type.swift diff --git a/unified/extractor/src/languages/swift/swift.rs b/unified/extractor/src/languages/swift/swift.rs index e76e7ef212d4..77314ceb678c 100644 --- a/unified/extractor/src/languages/swift/swift.rs +++ b/unified/extractor/src/languages/swift/swift.rs @@ -1014,9 +1014,13 @@ fn translation_rules() -> Vec> { // A named type (`Int`). `identifierType.name` is the type-name token. rule!((identifierType name: @@n) => (named_type_expr name: (identifier #{n}))), // A qualified type (`Outer.Inner`, `NSString.CompareOptions`). swift-syntax - // nests these as `memberType` nodes; we keep the whole dotted path as the - // opaque `named_type_expr` name. - rule!((memberType) @ty => (named_type_expr name: (identifier #{ty}))), + // nests these as `memberType` nodes; preserve the nesting in the + // named_type_expr qualifier field. + rule!( + (memberType baseType: @base name: @@name) + => + (named_type_expr qualifier: {base} name: (identifier #{name})) + ), // Sugared types desugar to `generic_type_expr`: `T?` -> Optional, // `[T]` -> Array, `[K: V]` -> Dictionary. rule!( diff --git a/unified/extractor/tests/corpus/swift/types/qualified-type.output b/unified/extractor/tests/corpus/swift/types/qualified-type.output new file mode 100644 index 000000000000..f561dc6ab2dc --- /dev/null +++ b/unified/extractor/tests/corpus/swift/types/qualified-type.output @@ -0,0 +1,139 @@ +struct Outer { + struct Inner { + struct Deep {} + } +} + +let value: Outer.Inner +let nested: Outer.Inner.Deep + +--- + +sourceFile + endOfFileToken: endOfFile + statements: + codeBlockItem + item: + structDecl + attributes: + name: identifier "Outer" + memberBlock: + memberBlock + leftBrace: { + rightBrace: } + members: + memberBlockItem + decl: + structDecl + attributes: + name: identifier "Inner" + memberBlock: + memberBlock + leftBrace: { + rightBrace: } + members: + memberBlockItem + decl: + structDecl + attributes: + name: identifier "Deep" + memberBlock: + memberBlock + leftBrace: { + rightBrace: } + members: + modifiers: + structKeyword: struct + modifiers: + structKeyword: struct + modifiers: + structKeyword: struct + codeBlockItem + item: + variableDecl + attributes: + modifiers: + bindingSpecifier: let + bindings: + patternBinding + pattern: + identifierPattern + identifier: identifier "value" + typeAnnotation: + typeAnnotation + colon: : + type: + memberType + name: identifier "Inner" + baseType: + identifierType + name: identifier "Outer" + period: . + codeBlockItem + item: + variableDecl + attributes: + modifiers: + bindingSpecifier: let + bindings: + patternBinding + pattern: + identifierPattern + identifier: identifier "nested" + typeAnnotation: + typeAnnotation + colon: : + type: + memberType + name: identifier "Deep" + baseType: + memberType + name: identifier "Inner" + baseType: + identifierType + name: identifier "Outer" + period: . + period: . + +--- + +top_level + body: + block + stmt: + class_like_declaration + modifier: modifier "struct" + name: identifier "Outer" + member: + class_like_declaration + modifier: modifier "struct" + name: identifier "Inner" + member: + class_like_declaration + modifier: modifier "struct" + name: identifier "Deep" + variable_declaration + modifier: modifier "let" + pattern: + name_pattern + identifier: identifier "value" + type: + named_type_expr + qualifier: + named_type_expr + name: identifier "Outer" + name: identifier "Inner" + variable_declaration + modifier: modifier "let" + pattern: + name_pattern + identifier: identifier "nested" + type: + named_type_expr + qualifier: + named_type_expr + qualifier: + named_type_expr + name: identifier "Outer" + name: identifier "Inner" + name: identifier "Deep" diff --git a/unified/extractor/tests/corpus/swift/types/qualified-type.swift b/unified/extractor/tests/corpus/swift/types/qualified-type.swift new file mode 100644 index 000000000000..9c5fbae3cf7b --- /dev/null +++ b/unified/extractor/tests/corpus/swift/types/qualified-type.swift @@ -0,0 +1,8 @@ +struct Outer { + struct Inner { + struct Deep {} + } +} + +let value: Outer.Inner +let nested: Outer.Inner.Deep From f50c80a753b4c6c83092a21d978b4bcd32dc6474 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 6 Aug 2026 10:47:36 +0200 Subject: [PATCH 0135/2098] unified: Initial static name binding pass This supports only a minimal set of features but sets up the structure we'll be using for supporting more features. --- .../lib/codeql/unified/internal/FacadeAst.qll | 8 + .../unified/internal/LocalNameBinding.qll | 67 ++++-- .../unified/internal/NameBindingPlugin.qll | 37 ++++ .../internal/NameBindingPluginSwift.qll | 24 +++ .../unified/internal/StaticNameBinding.qll | 197 ++++++++++++++++++ ...Graph.ql => debugLocalNameBindingGraph.ql} | 6 +- .../dev/debugStaticNameBindingGraph.ql | 16 ++ .../static-name-binding/test.expected | 0 .../library-tests/static-name-binding/test.ql | 51 +++++ .../static-name-binding/test.swift | 44 ++++ 10 files changed, 428 insertions(+), 22 deletions(-) create mode 100644 unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll create mode 100644 unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll create mode 100644 unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll rename unified/ql/lib/codeql/unified/internal/dev/{debugScopeGraph.ql => debugLocalNameBindingGraph.ql} (72%) create mode 100644 unified/ql/lib/codeql/unified/internal/dev/debugStaticNameBindingGraph.ql create mode 100644 unified/ql/test/library-tests/static-name-binding/test.expected create mode 100644 unified/ql/test/library-tests/static-name-binding/test.ql create mode 100644 unified/ql/test/library-tests/static-name-binding/test.swift diff --git a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll index a25fb3447c1e..a5d057135d87 100644 --- a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll +++ b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll @@ -17,6 +17,14 @@ module Unified { mod.getValue() = text ) } + + /** Gets the nearest enclosing class declaration, possibly this node itself. */ + ClassLikeDeclaration getEnclosingClass() { + result = this + or + not this instanceof ClassLikeDeclaration and + result = this.getParent().getEnclosingClass() + } } /** The base class for all patterns. */ diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index 0df235d521fd..59f94b433ba7 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -184,79 +184,92 @@ private module LocalNameBindingInput implements LocalNameBindingInputSig; module Public { @@ -319,6 +334,20 @@ module Public { /** Gets the name of this local, as a string. */ string getName() { result = super.getName() } } + + /** An identifier that appears as the declaration site of a name, such as the `x` in `let x = 123`. */ + class NameDeclaration extends Identifier { + NameDeclaration() { LocalNameBindingInput::bindingContext(this, _, _) } + + /** Gets the statement-like node declaring this name, such as a `VariableDeclaration` or `CatchClause`. */ + AstNode getDeclaration() { LocalNameBindingInput::bindingContext(this, _, result) } + + /** Gets the name being declared. */ + string getName() { result = this.getValue() } + + /** Gets the representative for the local name introduced by this declaration. */ + LocalName getLocalName() { result = this.(LocalNameBindingOutput::LocalAccess).getLocal() } + } } /** @@ -342,7 +371,7 @@ class PotentialLocalNameAccess extends Identifier { or this = any(NamedTypeExpr e | not exists(e.getQualifier())).getName() or - LocalNameBindingInput::bindingContext(this, _) + this instanceof NameDeclaration } LocalName getLocalName() { result = this.(LocalNameBindingOutput::LocalAccess).getLocal() } @@ -350,5 +379,5 @@ class PotentialLocalNameAccess extends Identifier { string getName() { result = this.getValue() } /** Holds if this is one of the declaration sites for a name, such as the `x` in `let x = 123`. */ - predicate isDeclarationSite() { LocalNameBindingInput::bindingContext(this, _) } + predicate isDeclarationSite() { this instanceof NameDeclaration } } diff --git a/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll b/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll new file mode 100644 index 000000000000..5ef34d6fe2da --- /dev/null +++ b/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll @@ -0,0 +1,37 @@ +private import unified +private import codeql.util.Unit +private import codeql.unified.internal.NameBindingPluginSwift // ensure overrides are seen + +/** Extension point for language-specific inputs to name binding. */ +class NameBindingPlugin extends Unit { + /** + * Holds if `member` is an instance member. + * + * The caller has already restricted `member` to be a member of `cls`, and + * ensured that `member` is a `VariableDeclaration` or `FunctionDeclaration`. + */ + bindingset[cls, member] + predicate isInstanceMember(ClassLikeDeclaration cls, Member member) { none() } + + /** + * Holds if `member` is only visible in its local scope, and can thus be entirely resolved + * by local name-binding, suppressing any store-steps that would otherwise be induced from the member. + * + * Need only be implemented for members that occur in the context of class or top-level, as other + * contexts are considered local already. + */ + predicate isPrivateToLocalScope(Member member) { none() } +} + +/** Holds if `member` is an instance member. */ +predicate isInstanceMember(Member member) { + (member instanceof VariableDeclaration or member instanceof FunctionDeclaration) and + exists(ClassLikeDeclaration cls | cls.getAMember() = member | + any(NameBindingPlugin p).isInstanceMember(cls, member) + ) +} + +/** Holds if `member` is only visible in its local scope. */ +predicate isPrivateToLocalScope(Member member) { + any(NameBindingPlugin p).isPrivateToLocalScope(member) +} diff --git a/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll b/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll new file mode 100644 index 000000000000..98d30c5d779f --- /dev/null +++ b/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll @@ -0,0 +1,24 @@ +/** + * Provides Swift-specific name binding rules. + */ + +private import unified +private import codeql.unified.internal.NameBindingPlugin + +class NameBindingPluginSwift extends NameBindingPlugin { + // Note: For now we assume all code is Swift, but in the future we must restrict these rules to Swift-files + bindingset[cls, member] + override predicate isInstanceMember(ClassLikeDeclaration cls, Member member) { + exists(cls) and + not member.hasModifier(["static", "class", "enum_case"]) + } + + override predicate isPrivateToLocalScope(Member member) { + // Private top-level members + member = any(TopLevel top).getBody().getAStmt() and + member.hasModifier(["private", "fileprivate"]) + // + // Note: Private class members can be seen within type-extensions in the same file, + // so we can't declare those private to their local scope. + } +} diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll new file mode 100644 index 000000000000..f662a46b7de3 --- /dev/null +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -0,0 +1,197 @@ +/** + * Provides classes for reasoning about static references to the members of classes and top-levels. + */ + +private import unified +private import codeql.unified.internal.LocalNameBinding +private import codeql.unified.internal.NameBindingPlugin + +private newtype TNameBindingNode = + TIdentifier(Identifier n) or + TLocalName(LocalName local) or + TExportedNamespace(ClassLikeDeclaration cls) + +/** + * A node in a graph, in which name-binding rules are represented as edges between nodes. + */ +class NameBindingNode extends TNameBindingNode { + predicate isIdentifier(Identifier n) { this = TIdentifier(n) } + + Identifier asIdentifier() { this.isIdentifier(result) } + + predicate isLocalName(LocalName local) { this = TLocalName(local) } + + /** Holds if this represents the set of static members available in the given namespace (currently restricted to classes) */ + predicate isExportedNamespace(ClassLikeDeclaration cls) { this = TExportedNamespace(cls) } + + string toString() { + exists(Identifier n | this.isIdentifier(n) and result = "Identifier(" + n + ")") + or + exists(LocalName local | this.isLocalName(local) and result = "LocalName(" + local + ")") + or + exists(ClassLikeDeclaration cls | + this.isExportedNamespace(cls) and result = "ExportedNamespace(" + cls + ")" + ) + } + + Location getLocation() { + exists(Identifier n | this.isIdentifier(n) and result = n.getLocation()) + or + exists(LocalName local | this.isLocalName(local) and result = local.getLocation()) + or + exists(ClassLikeDeclaration cls | this.isExportedNamespace(cls) and result = cls.getLocation()) + } +} + +Identifier getIdentifierFromRef(AstNode n) { + result = n.(NameExpr).getIdentifier() + or + result = n.(NamePattern).getIdentifier() + or + result = n.(MemberAccessExpr).getMember() + or + result = n.(NamedTypeExpr).getName() +} + +NameBindingNode getNodeFromRef(AstNode n) { result.isIdentifier(getIdentifierFromRef(n)) } + +predicate readStep(NameBindingNode node1, string name, NameBindingNode node2) { + exists(MemberAccessExpr expr | + node1 = getNodeFromRef(expr.getBase()) and + name = expr.getMember().getValue() and + node2 = getNodeFromRef(expr) + ) + or + exists(NamedTypeExpr expr | + node1 = getNodeFromRef(expr.getQualifier()) and + name = expr.getName().getValue() and + node2 = getNodeFromRef(expr) + ) +} + +predicate storeStep(NameBindingNode node1, string name, NameBindingNode node2) { + exists(ClassLikeDeclaration cls, Member member, NameDeclaration nameDecl | + member = cls.getAMember() and + not isInstanceMember(member) and + not isPrivateToLocalScope(member) and + nameDecl.getDeclaration() = member + | + node1.isIdentifier(nameDecl) and + name = nameDecl.getName() and + node2.isExportedNamespace(cls) + ) +} + +predicate valueStep(NameBindingNode node1, NameBindingNode node2) { + exists(PotentialLocalNameAccess access | + access.isDeclarationSite() and + node1.isIdentifier(access) and + node2.isLocalName(access.getLocalName()) + or + node1.isLocalName(access.getLocalName()) and + node2.isIdentifier(access) + ) + or + exists(ClassLikeDeclaration cls | + node1.isExportedNamespace(cls) and + node2.isIdentifier(cls.getName()) + ) +} + +signature module TrackInputSig { + /** Holds if the forward-flow of `node` should be tracked. */ + predicate shouldTrack(NameBindingNode node); +} + +/** Creates a module for tracking flow through the name-binding graph. */ +module Track { + private import Input + + /** Gets a name-binding node to which `node` can flow. */ + NameBindingNode track(NameBindingNode node) { + shouldTrack(node) and + result = node + or + exists(NameBindingNode prev | prev = track(node) | valueStepEx(prev, result)) + } +} + +/** + * Holds if `node1 -> node2` is derived by combining a store and a read step. + */ +pragma[nomagic] +private predicate derivedStoreReadStep(NameBindingNode node1, NameBindingNode node2) { + exists(NamespaceNode namespace, string name | + node1 = namespace.getMember(name) and + readStep(namespace.ref(), name, node2) + ) +} + +/** Holds if there is an effective value step `node1 -> node2`. */ +pragma[inline] +private predicate valueStepEx(NameBindingNode node1, NameBindingNode node2) { + valueStep(node1, node2) + or + derivedStoreReadStep(node1, node2) +} + +/** A name-binding node that has members. */ +class NamespaceNode extends NameBindingNode { + NamespaceNode() { storeStep(_, _, this) } + + /** Gets a name-binding node that may refer to this namespace. */ + NameBindingNode ref() { result = TrackNamespace::track(this) } + + /** Gets a member of this namespace of the given name. */ + NameBindingNode getMember(string name) { storeStep(result, name, this) } +} + +private module TrackNamespaceInput implements TrackInputSig { + predicate shouldTrack(NameBindingNode node) { node instanceof NamespaceNode } +} + +private module TrackNamespace = Track; + +private module TrackNameDeclarationInput implements TrackInputSig { + predicate shouldTrack(NameBindingNode node) { node.isIdentifier(any(NameDeclaration d)) } +} + +private module TrackNameDeclaration = Track; + +/** Gets a name-binding node that may refer to the given declaration. */ +NameBindingNode trackNameDeclaration(NameDeclaration decl) { + exists(NameBindingNode start | + start.isIdentifier(decl) and + result = TrackNameDeclaration::track(start) + ) +} + +/** Holds if `node` should be included in the debug view. */ +private signature predicate relevantFileSig(File node); + +module DebugGraph { + private predicate relevantNode(NameBindingNode node) { + relevantFile(node.getLocation().getFile()) + } + + query predicate nodes(NameBindingNode node, string key, string value) { + relevantNode(node) and + key = "semmle.label" and + value = node.toString() + } + + query predicate edges(NameBindingNode node1, NameBindingNode node2, string key, string value) { + key = "semmle.label" and + ( + valueStep(node1, node2) and value = "" + or + exists(string name | + readStep(node1, name, node2) and + value = "read(" + name + ")" + or + storeStep(node1, name, node2) and + value = "store(" + name + ")" + ) + ) + } +} diff --git a/unified/ql/lib/codeql/unified/internal/dev/debugScopeGraph.ql b/unified/ql/lib/codeql/unified/internal/dev/debugLocalNameBindingGraph.ql similarity index 72% rename from unified/ql/lib/codeql/unified/internal/dev/debugScopeGraph.ql rename to unified/ql/lib/codeql/unified/internal/dev/debugLocalNameBindingGraph.ql index a77f8912d6fa..71887f476f16 100644 --- a/unified/ql/lib/codeql/unified/internal/dev/debugScopeGraph.ql +++ b/unified/ql/lib/codeql/unified/internal/dev/debugLocalNameBindingGraph.ql @@ -1,8 +1,8 @@ /** - * @name Debug scope graph - * @description Renders the graph used to perform local variable lookups + * @name Debug local name-binding graph + * @description Renders the graph used to perform local name lookups * @kind graph - * @id unified/debug-scope-graph + * @id unified/debug-local-name-binding-graph */ private import unified diff --git a/unified/ql/lib/codeql/unified/internal/dev/debugStaticNameBindingGraph.ql b/unified/ql/lib/codeql/unified/internal/dev/debugStaticNameBindingGraph.ql new file mode 100644 index 000000000000..740943fc66db --- /dev/null +++ b/unified/ql/lib/codeql/unified/internal/dev/debugStaticNameBindingGraph.ql @@ -0,0 +1,16 @@ +/** + * @name Debug static name-binding graph + * @description Renders the graph used to perform static name lookups + * @kind graph + * @id unified/debug-static-name-binding-graph + */ + +private import unified +private import codeql.unified.internal.StaticNameBinding + +/** + * Holds if graphs related to `file` should be shown in the graph. + */ +predicate relevantFile(File file) { file.getBaseName() = "test.swift" } + +import DebugGraph diff --git a/unified/ql/test/library-tests/static-name-binding/test.expected b/unified/ql/test/library-tests/static-name-binding/test.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/unified/ql/test/library-tests/static-name-binding/test.ql b/unified/ql/test/library-tests/static-name-binding/test.ql new file mode 100644 index 000000000000..272606e2bd20 --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/test.ql @@ -0,0 +1,51 @@ +import unified +import utils.test.InlineExpectationsTest +import utils.test.CommentUtil +import codeql.unified.internal.StaticNameBinding + +module StaticDeclAccess implements TestSig { + string getARelevantTag() { result = "access" } + + private string deriveClassName(ClassLikeDeclaration cls) { + not exists(cls.getParent().getEnclosingClass()) and + result = cls.getName().getValue() + or + result = deriveClassName(cls.getParent().getEnclosingClass()) + "." + cls.getName().getValue() + } + + private string defaultName(NameDeclaration decl) { + exists(ClassLikeDeclaration cls | + decl.getDeclaration() = cls.getAMember() and + result = deriveClassName(cls) + "." + decl.getName() + ) + or + not decl.getDeclaration() = any(ClassLikeDeclaration cls).getAMember() and + result = decl.getName() + } + + additional predicate declAt(NameDeclaration v, string filepath, int line) { + v.getLocation().hasLocationInfo(filepath, line, _, _, _) + } + + private predicate decl(NameDeclaration v, string alias) { + exists(string filepath, int line | declAt(v, filepath, line) | + keyValueCommentAt(filepath, line, "name", alias) + or + not keyValueCommentAt(filepath, line, "name", _) and + alias = defaultName(v) + ) + } + + predicate hasActualResult(Location location, string element, string tag, string value) { + exists(NameDeclaration decl, Identifier access | + access = trackNameDeclaration(decl).asIdentifier() and + not access instanceof NameDeclaration and + location = access.getLocation() and + element = access.toString() and + decl(decl, value) and + tag = "access" + ) + } +} + +import MakeTest diff --git a/unified/ql/test/library-tests/static-name-binding/test.swift b/unified/ql/test/library-tests/static-name-binding/test.swift new file mode 100644 index 000000000000..7698e714291f --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/test.swift @@ -0,0 +1,44 @@ +class B {} // name=top.B + +class A { + class B { + class C {} + } +} + +let x1: B = nil; // $ access=top.B +let x2: A.B = nil; // $ access=A access=A.B +let x3: A.B.C = nil; // $ access=A access=A.B access=A.B.C + +class D { + let x1: B = nil; // $ access=top.B + let x2: A.B = nil; // $ access=A access=A.B + let x3: A.B.C = nil; // $ access=A access=A.B access=A.B.C + + func member() { + let x1: B = nil; // $ access=top.B + let x2: A.B = nil; // $ access=A access=A.B + let x3: A.B.C = nil; // $ access=A access=A.B access=A.B.C + } +} + +class E { + class A { + class B { + } + } + + let x1: A = nil; // $ access=E.A + let x2: A.B = nil; // $ access=E.A access=E.A.B +} + +class F { + static let field = 1 + static let (a,b) = (1,2) + + static func foo() { + F.field // $ access=F access=F.field + F.a // $ access=F access=F.a + F.b // $ access=F access=F.b + } +} From 375924ed293e340815c86d37618a842b1fa32807 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 6 Aug 2026 11:48:48 +0200 Subject: [PATCH 0136/2098] unified: Track through aliases --- .../unified/internal/StaticNameBinding.qll | 28 +++++++++++++------ .../static-name-binding/test.swift | 9 ++++++ 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index f662a46b7de3..3f60b2b28c85 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -101,6 +101,8 @@ predicate valueStep(NameBindingNode node1, NameBindingNode node2) { signature module TrackInputSig { /** Holds if the forward-flow of `node` should be tracked. */ predicate shouldTrack(NameBindingNode node); + + default predicate additionalValueStep(NameBindingNode node1, NameBindingNode node2) { none() } } /** Creates a module for tracking flow through the name-binding graph. */ @@ -114,6 +116,16 @@ module Track { or exists(NameBindingNode prev | prev = track(node) | valueStepEx(prev, result)) } + + /** Holds if there is an effective value step `node1 -> node2`. */ + pragma[inline] + private predicate valueStepEx(NameBindingNode node1, NameBindingNode node2) { + valueStep(node1, node2) + or + derivedStoreReadStep(node1, node2) + or + additionalValueStep(node1, node2) + } } /** @@ -127,14 +139,6 @@ private predicate derivedStoreReadStep(NameBindingNode node1, NameBindingNode no ) } -/** Holds if there is an effective value step `node1 -> node2`. */ -pragma[inline] -private predicate valueStepEx(NameBindingNode node1, NameBindingNode node2) { - valueStep(node1, node2) - or - derivedStoreReadStep(node1, node2) -} - /** A name-binding node that has members. */ class NamespaceNode extends NameBindingNode { NamespaceNode() { storeStep(_, _, this) } @@ -148,6 +152,14 @@ class NamespaceNode extends NameBindingNode { private module TrackNamespaceInput implements TrackInputSig { predicate shouldTrack(NameBindingNode node) { node instanceof NamespaceNode } + + predicate additionalValueStep(NameBindingNode node1, NameBindingNode node2) { + // Namespace-tracking goes through aliases, but declaration-tracking does not + exists(TypeAliasDeclaration decl | + node1 = getNodeFromRef(decl.getType()) and + node2.isIdentifier(decl.getName()) + ) + } } private module TrackNamespace = Track; diff --git a/unified/ql/test/library-tests/static-name-binding/test.swift b/unified/ql/test/library-tests/static-name-binding/test.swift index 7698e714291f..27453ec34351 100644 --- a/unified/ql/test/library-tests/static-name-binding/test.swift +++ b/unified/ql/test/library-tests/static-name-binding/test.swift @@ -42,3 +42,12 @@ class F { F.b // $ access=F access=F.b } } + +typealias G = A // $ access=A + +// Members can be accessed through aliases, but references to the alias itself do not bypass the alias. +class H { + let x1: G = nil; // $ access=G + let x2: G.B = nil; // $ access=G access=A.B + let x3: G.B.C = nil; // $ access=G access=A.B access=A.B.C +} From db8b97a0ddcdd3e514abb457a431797ad0844916 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 6 Aug 2026 12:48:41 +0200 Subject: [PATCH 0137/2098] unified: Add inheritance steps --- .../unified/internal/StaticNameBinding.qll | 33 +++++++++++++++++-- .../static-name-binding/inheritance.swift | 19 +++++++++++ 2 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 unified/ql/test/library-tests/static-name-binding/inheritance.swift diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 3f60b2b28c85..ca1f670fb8ff 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -98,6 +98,14 @@ predicate valueStep(NameBindingNode node1, NameBindingNode node2) { ) } +predicate inheritanceStep(NameBindingNode supertype, NameBindingNode subtype) { + exists(ClassLikeDeclaration cls, BaseType base | + base = cls.getABaseType() and + supertype = getNodeFromRef(base.getType()) and + subtype.isExportedNamespace(cls) + ) +} + signature module TrackInputSig { /** Holds if the forward-flow of `node` should be tracked. */ predicate shouldTrack(NameBindingNode node); @@ -141,13 +149,31 @@ private predicate derivedStoreReadStep(NameBindingNode node1, NameBindingNode no /** A name-binding node that has members. */ class NamespaceNode extends NameBindingNode { - NamespaceNode() { storeStep(_, _, this) } + NamespaceNode() { storeStep(_, _, this) or inheritanceStep(_, this) } /** Gets a name-binding node that may refer to this namespace. */ NameBindingNode ref() { result = TrackNamespace::track(this) } + /** Gets an own (non-inherited) member of this namespace of the given name. */ + NameBindingNode getOwnMember(string name) { storeStep(result, name, this) } + + /** Holds if this namespace has an own-member of the given name */ + predicate hasOwnMember(string name) { exists(this.getOwnMember(name)) } + + /** Gets a namespace from which this namespace inherits directly. */ + NamespaceNode getAnInheritanceParent() { inheritanceStep(result.ref(), this) } + + /** Gets a namespace that directly inherits from this one. */ + NamespaceNode getAnInheritanceChild() { result.getAnInheritanceParent() = this } + /** Gets a member of this namespace of the given name. */ - NameBindingNode getMember(string name) { storeStep(result, name, this) } + pragma[nomagic] + NameBindingNode getMember(string name) { + result = this.getOwnMember(name) + or + not this.hasOwnMember(name) and + result = this.getAnInheritanceParent().getMember(name) + } } private module TrackNamespaceInput implements TrackInputSig { @@ -204,6 +230,9 @@ module DebugGraph { storeStep(node1, name, node2) and value = "store(" + name + ")" ) + or + inheritanceStep(node1, node2) and + value = "inheritedBy" ) } } diff --git a/unified/ql/test/library-tests/static-name-binding/inheritance.swift b/unified/ql/test/library-tests/static-name-binding/inheritance.swift new file mode 100644 index 000000000000..fcf1967d4842 --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/inheritance.swift @@ -0,0 +1,19 @@ +class A { + class B { + class C {} + } +} + +class D: A {} // $ access=A +class E: D.B {} // $ access=D access=A.B + +// Members of base classes can be accessed through derived classes +func t1() { + let x1: D = nil; // $ access=D + let x2: D.B = nil; // $ access=D access=A.B + let x3: D.B.C = nil; // $ access=D access=A.B access=A.B.C + + // The base class of 'E' is itself resolved through inheritance + let x4: E = nil; // $ access=E + let x5: E.C = nil; // $ access=E access=A.B.C +} From 6341bba0e198901e753c2bbe0deb4b49870012eb Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 6 Aug 2026 13:36:29 +0200 Subject: [PATCH 0138/2098] unified: Support unqualified access --- .../codeql/namebinding/LocalNameBinding.qll | 29 +++++++++++++++++ .../unified/internal/LocalNameBinding.qll | 9 ++++++ .../unified/internal/StaticNameBinding.qll | 31 ++++++++++++++++++- .../unqualified-access.swift | 20 ++++++++++++ 4 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 unified/ql/test/library-tests/static-name-binding/unqualified-access.swift diff --git a/shared/namebinding/codeql/namebinding/LocalNameBinding.qll b/shared/namebinding/codeql/namebinding/LocalNameBinding.qll index 57c792027ba8..c4d4abdead45 100644 --- a/shared/namebinding/codeql/namebinding/LocalNameBinding.qll +++ b/shared/namebinding/codeql/namebinding/LocalNameBinding.qll @@ -136,6 +136,12 @@ signature module LocalNameBindingInputSig { * full control of scope resolution for specific types of references. */ default predicate lookupStartsAt(AstNode n, AstNode scope) { none() } + + /** + * Holds if the set of names available in `scope` is not known ahead of time, + * and thus any lookup chain that goes through `scope` may need to be reconciled at a later stage. + */ + default predicate uncertainScope(AstNode scope) { none() } } /** @@ -154,6 +160,8 @@ module LocalNameBinding implicitDeclInScope(_, this) or isTopScope(this) + or + uncertainScope(this) } } @@ -353,6 +361,27 @@ module LocalNameBinding ) } + /** + * Holds if `name`, when resolved from `lookup`, may resolve to one of the uncertain members of `scope`. + */ + pragma[nomagic] + private predicate lookupInUncertainScope(string name, Scope lookup, Scope scope) { + lookupInScope(name, lookup, scope) and + uncertainScope(scope) and + not declInScope(_, name, scope) and + not implicitDeclInScope(name, scope) + } + + /** + * Gets an uncertain scope that the given `accessCand` pair may resolve to. + */ + AstNode getAnUncertainScope(AstNode access, string name) { + exists(Scope lookup | + accessCandInLookupScope(access, name, lookup) and + lookupInUncertainScope(name, lookup, result) + ) + } + cached private newtype TLocal = TExplicitLocal(AstNode definingNode, string name, AstNode scope) { diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index 59f94b433ba7..97268e05af3f 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -314,6 +314,15 @@ private module LocalNameBindingInput implements LocalNameBindingInputSig Date: Thu, 6 Aug 2026 15:37:52 +0200 Subject: [PATCH 0139/2098] unified: Allow numbers in key=value comments --- unified/ql/lib/utils/test/CommentUtil.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/ql/lib/utils/test/CommentUtil.qll b/unified/ql/lib/utils/test/CommentUtil.qll index 6747aed57187..bd6f887a4010 100644 --- a/unified/ql/lib/utils/test/CommentUtil.qll +++ b/unified/ql/lib/utils/test/CommentUtil.qll @@ -12,7 +12,7 @@ predicate plainCommentAt(string filepath, int line, string text) { predicate keyValueCommentAt(string filepath, int line, string key, string value) { exists(string text, string regexp, string match | plainCommentAt(filepath, line, text) and - regexp = "(\\w+)=([\\w.]+)" and + regexp = "(\\w+)=([\\w.0-9]+)" and match = text.regexpFind(regexp, _, _) and key = match.regexpCapture(regexp, 1) and value = match.regexpCapture(regexp, 2) From 7e3a4e36a31e0faae3e3d5715fd2b80be2790e7d Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 6 Aug 2026 15:41:46 +0200 Subject: [PATCH 0140/2098] unified: Cross-file name binding --- unified/ql/lib/codeql/files/FileSystem.qll | 2 + .../lib/codeql/unified/internal/FacadeAst.qll | 27 +++++++ .../unified/internal/LocalNameBinding.qll | 4 + .../unified/internal/NameBindingPlugin.qll | 41 ++++++++++ .../internal/NameBindingPluginSwift.qll | 76 +++++++++++++++++++ .../unified/internal/StaticNameBinding.qll | 62 ++++++++++++++- .../package1/Package.swift | 11 +++ .../package1/Sources/Target1/File1.swift | 2 + .../package1/Sources/Target1/File2.swift | 1 + .../package1/Sources/Target2/File3.swift | 1 + 10 files changed, 224 insertions(+), 3 deletions(-) create mode 100644 unified/ql/test/library-tests/static-name-binding/package1/Package.swift create mode 100644 unified/ql/test/library-tests/static-name-binding/package1/Sources/Target1/File1.swift create mode 100644 unified/ql/test/library-tests/static-name-binding/package1/Sources/Target1/File2.swift create mode 100644 unified/ql/test/library-tests/static-name-binding/package1/Sources/Target2/File3.swift diff --git a/unified/ql/lib/codeql/files/FileSystem.qll b/unified/ql/lib/codeql/files/FileSystem.qll index 6cc771fad9d2..a50c1cd3432a 100644 --- a/unified/ql/lib/codeql/files/FileSystem.qll +++ b/unified/ql/lib/codeql/files/FileSystem.qll @@ -31,6 +31,8 @@ class Container = Impl::Container; class Folder = Impl::Folder; +module Folder = Impl::Folder; + /** A file. */ class File extends Container, Impl::File { /** Holds if this file was extracted from ordinary source code. */ diff --git a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll index a5d057135d87..cb00bae7eeca 100644 --- a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll +++ b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll @@ -4,12 +4,17 @@ overlay[local?] module; +private import codeql.files.FileSystem + module Unified { private import Ast::Unified as G import G /** The base class for all AST nodes. */ class AstNode extends G::AstNode { + /** Gets the file containing this AST node. */ + File getFile() { result = this.getLocation().getFile() } + /** Holds if this AST node has a modifier with the given text. */ predicate hasModifier(string text) { exists(Modifier mod | @@ -27,6 +32,28 @@ module Unified { } } + /** An expression */ + class Expr extends G::Expr { + /** Gets the string value of this expression, if it is a known string constant. */ + string getStringValue() { + // TODO: we'll want to cook the string literals extractor-side, but for now + // just strip the quotes here and ignore escape sequences. + result = this.(StringLiteral).getValue().regexpCapture("\"(.*)\"", 1) + } + } + + /** A function call */ + class CallExpr extends G::CallExpr { + /** Gets the named argument with the given `name`. */ + Expr getNamedArgument(string name) { + exists(Argument arg | + arg = this.getAnArgument() and + arg.getName().getValue() = name and + result = arg.getValue() + ) + } + } + /** The base class for all patterns. */ class Pattern extends G::Pattern { /** Gets the immediately-enclosing pattern in which this is a nested pattern. */ diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index 97268e05af3f..faa2be5fe43e 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -322,6 +322,10 @@ private module LocalNameBindingInput implements LocalNameBindingInputSig; diff --git a/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll b/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll index 98d30c5d779f..b2bba1763ed7 100644 --- a/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll +++ b/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll @@ -22,3 +22,79 @@ class NameBindingPluginSwift extends NameBindingPlugin { // so we can't declare those private to their local scope. } } + +private predicate predefinedSourceFolders(string folder, int ordering) { + folder = "Sources,Source,src,srcs".splitAt(",", ordering) +} + +bindingset[targetKind] +private predicate predefinedSourceFoldersByTarget(string targetKind, string folder, int ordering) { + predefinedSourceFolders(folder, ordering) + or + ordering = -1 and + ( + targetKind = "testTarget" and + folder = "Tests" + or + targetKind = "plugin" and + folder = "Plugins" + ) +} + +/** + * A call to `.target()` or similar target spec, in a `Package.swift` file. + */ +class SwiftPackageTarget extends ModuleScopeRepr, CallExpr { + private string targetKind; + + SwiftPackageTarget() { + this.getFile().getBaseName() = "Package.swift" and + this.getCallee().(MemberAccessExpr).getMember().getValue() = targetKind and + targetKind = + [ + "target", "executableTarget", "testTarget", "systemLibrary", "binaryTarget", "plugin", + "macro" + ] + } + + Folder getFolder() { result = this.getFile().getParentContainer() } + + /** Gets the intermediate folder such as `Sources/` containing the sources, but without the target name. */ + Folder getSourceMidFolder() { + result = + min(int i, string name, Folder subfolder | + predefinedSourceFoldersByTarget(targetKind, name, i) and + subfolder = this.getFolder().getFolder(name) + | + subfolder order by i + ) + } + + /** Gets the source folder to use if no explicit `path:` if given, typically `Sources/` */ + Folder getDefaultSourceFolder() { + exists(Folder subfolder | subfolder = this.getSourceMidFolder() | + result = subfolder.getFolder(this.getName()) + or + not exists(subfolder.getFolder(this.getName())) and + result = subfolder + ) + } + + string getName() { result = this.getNamedArgument("name").getStringValue() } + + string getExplicitPath() { result = this.getNamedArgument("path").getStringValue() } + + override predicate shouldInclude(Container c, string path) { + c = this.getFolder() and + path = this.getExplicitPath() + "/**/*.swift" + or + not exists(this.getExplicitPath()) and + c = this.getDefaultSourceFolder() and + path = "**/*.swift" + } + + override predicate hasImportableName(string name) { + targetKind = "target" and + name = this.getName() + } +} diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index f976520a7258..02ce277bc895 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -10,7 +10,13 @@ private newtype TNameBindingNode = TIdentifier(Identifier n) or TLocalName(LocalName local) or TExportedNamespace(ClassLikeDeclaration cls) or - TLocalNamespace(ClassLikeDeclaration cls) + TLocalNamespace(AstNode n) { + n = any(TopLevel t) or // Module names come in scope here + n = any(TopLevel t).getBody() or // Imported names come in scope here (shadowing module names) + n instanceof ClassLikeDeclaration + } or + TModuleScope(ModuleScopeRepr repr) or + TModuleRoot() /** * A node in a graph, in which name-binding rules are represented as edges between nodes. @@ -25,8 +31,14 @@ class NameBindingNode extends TNameBindingNode { /** Holds if this represents the set of static members available in the given namespace (currently restricted to classes) */ predicate isExportedNamespace(ClassLikeDeclaration cls) { this = TExportedNamespace(cls) } - /** Holds if this represents the set of members that can be accessed unqualified within the given scope (currently restricted to classes) */ - predicate isLocalNamespace(ClassLikeDeclaration cls) { this = TLocalNamespace(cls) } + /** Holds if this represents the set of members that can be accessed unqualified within the given scope. */ + predicate isLocalNamespace(AstNode n) { this = TLocalNamespace(n) } + + /** Holds if this represents the given module scope. */ + predicate isModuleScopeNode(ModuleScopeRepr repr) { this = TModuleScope(repr) } + + /** Holds if this represents the root namespace in which all named modules are members. */ + predicate isModuleRoot() { this = TModuleRoot() } string toString() { exists(Identifier n | this.isIdentifier(n) and result = "Identifier(" + n + ")") @@ -40,6 +52,12 @@ class NameBindingNode extends TNameBindingNode { exists(ClassLikeDeclaration cls | this.isLocalNamespace(cls) and result = "LocalNamespace(" + cls + ")" ) + or + exists(ModuleScopeRepr repr | + this.isModuleScopeNode(repr) and result = "ModuleScope(" + repr + ")" + ) + or + this.isModuleRoot() and result = "ModuleRoot" } Location getLocation() { @@ -50,6 +68,11 @@ class NameBindingNode extends TNameBindingNode { exists(ClassLikeDeclaration cls | this.isExportedNamespace(cls) and result = cls.getLocation()) or exists(ClassLikeDeclaration cls | this.isLocalNamespace(cls) and result = cls.getLocation()) + or + exists(ModuleScopeRepr repr | this.isModuleScopeNode(repr) and result = repr.getLocation()) + or + this.isModuleRoot() and + exists(ModuleScopeRepr repr | result = repr.getLocation()) } } @@ -65,12 +88,21 @@ Identifier getIdentifierFromRef(AstNode n) { NameBindingNode getNodeFromRef(AstNode n) { result.isIdentifier(getIdentifierFromRef(n)) } +NameBindingNode getModuleNodeFromFile(File f) { + exists(ModuleScopeRepr mod | + mod.getAnIncludedFile() = f and + result.isModuleScopeNode(mod) + ) +} + /** Gets the name-binding node associated with the given uncertain scope node. */ private NameBindingNode getNodeFromUncertainScope(AstNode n) { exists(ClassLikeDeclaration cls | n = cls.getAMember() and // note: must align with LocalNameBindingInput::uncertainScope result.isLocalNamespace(cls) ) + or + result.isLocalNamespace(n) } predicate readStep(NameBindingNode node1, string name, NameBindingNode node2) { @@ -104,6 +136,22 @@ predicate storeStep(NameBindingNode node1, string name, NameBindingNode node2) { name = nameDecl.getName() and node2.isExportedNamespace(cls) ) + or + exists(TopLevel top, Stmt stmt, NameDeclaration nameDecl | + stmt = top.getBody().getAStmt() and + not isPrivateToLocalScope(stmt) and + nameDecl.getDeclaration() = stmt + | + node1.isIdentifier(nameDecl) and + name = nameDecl.getName() and + node2 = getModuleNodeFromFile(top.getFile()) + ) + or + exists(ModuleScopeRepr mod | + node1.isModuleScopeNode(mod) and + mod.hasImportableName(name) and + node2.isModuleRoot() + ) } predicate valueStep(NameBindingNode node1, NameBindingNode node2) { @@ -125,6 +173,14 @@ predicate valueStep(NameBindingNode node1, NameBindingNode node2) { node1.isExportedNamespace(cls) and node2.isLocalNamespace(cls) ) + or + exists(TopLevel top | + node1.isModuleRoot() and + node2.isLocalNamespace(top) // module names in outermost scope + or + node1 = getModuleNodeFromFile(top.getFile()) and + node2.isLocalNamespace(top.getBody()) // implicitly import own module + ) } predicate inheritanceStep(NameBindingNode supertype, NameBindingNode subtype) { diff --git a/unified/ql/test/library-tests/static-name-binding/package1/Package.swift b/unified/ql/test/library-tests/static-name-binding/package1/Package.swift new file mode 100644 index 000000000000..0789887c4b4c --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/package1/Package.swift @@ -0,0 +1,11 @@ +// swift-tools-version: 5.9 + +import PackageDescription + +let package = Package( + name: "Package1", + targets: [ + .target(name: "Target1"), + .target(name: "Target2"), + ] +) diff --git a/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target1/File1.swift b/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target1/File1.swift new file mode 100644 index 000000000000..fff0a56e90f3 --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target1/File1.swift @@ -0,0 +1,2 @@ +let x: A; // $ access=Target1.A +let y: Target2.A; // $ access=Target2.A diff --git a/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target1/File2.swift b/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target1/File2.swift new file mode 100644 index 000000000000..fa515af0eaf5 --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target1/File2.swift @@ -0,0 +1 @@ +class A {} // name=Target1.A diff --git a/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target2/File3.swift b/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target2/File3.swift new file mode 100644 index 000000000000..47c3f4da77ed --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target2/File3.swift @@ -0,0 +1 @@ +class A {} // name=Target2.A From 574a5c95059dafcf6227fe86d3140054a8b9802d Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 7 Aug 2026 08:38:58 +0200 Subject: [PATCH 0141/2098] unified: Handle bracketed generic array constructors --- .../extractor/src/languages/swift/swift.rs | 16 ++++ .../expressions/array-type-constructor.output | 74 +++++++++++++++++++ .../expressions/array-type-constructor.swift | 1 + 3 files changed, 91 insertions(+) create mode 100644 unified/extractor/tests/corpus/swift/expressions/array-type-constructor.output create mode 100644 unified/extractor/tests/corpus/swift/expressions/array-type-constructor.swift diff --git a/unified/extractor/src/languages/swift/swift.rs b/unified/extractor/src/languages/swift/swift.rs index 77314ceb678c..b192669ae9a2 100644 --- a/unified/extractor/src/languages/swift/swift.rs +++ b/unified/extractor/src/languages/swift/swift.rs @@ -633,6 +633,22 @@ fn translation_rules() -> Vec> { default: {val})) } ), + // Swift's `[T](...)` array-type constructor syntax is parsed as a call + // whose callee is an `arrayExpr` containing `T`. For a generic `T`, + // translating that callee as an array literal would place a type + // expression in an expression-only element field. Normalize it to an + // `Array` generic type constructor instead. + rule!( + (functionCallExpr + calledExpression: (arrayExpr elements: (arrayElement expression: (genericSpecializationExpr) @element)) + arguments: _* @args) + => + (call_expr + callee: (generic_type_expr + base: (named_type_expr name: (identifier "Array")) + type_argument: {element}) + argument: {args}) + ), // A function/method call (`foo(1, 2)`). `calledExpression` is the callee // and `arguments` is an (elided) list of `labeledExpr`, each translated // to an `argument` below. A trailing closure (`xs.map { … }`) becomes a diff --git a/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.output b/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.output new file mode 100644 index 000000000000..e721ba9cfde2 --- /dev/null +++ b/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.output @@ -0,0 +1,74 @@ +let values = [Result]() + +--- + +sourceFile + endOfFileToken: endOfFile + statements: + codeBlockItem + item: + variableDecl + attributes: + modifiers: + bindingSpecifier: let + bindings: + patternBinding + initializer: + initializerClause + equal: = + value: + functionCallExpr + leftParen: ( + rightParen: ) + arguments: + additionalTrailingClosures: + calledExpression: + arrayExpr + elements: + arrayElement + expression: + genericSpecializationExpr + expression: + declReferenceExpr + baseName: identifier "Result" + genericArgumentClause: + genericArgumentClause + arguments: + genericArgument + argument: + identifierType + name: identifier "Void" + leftAngle: < + rightAngle: > + leftSquare: [ + rightSquare: ] + pattern: + identifierPattern + identifier: identifier "values" + +--- + +top_level + body: + block + stmt: + variable_declaration + modifier: modifier "let" + pattern: + name_pattern + identifier: identifier "values" + value: + call_expr + callee: + generic_type_expr + base: + named_type_expr + name: identifier "Array" + type_argument: + generic_type_expr + base: + named_type_expr + name: identifier "Result" + type_argument: + named_type_expr + name: identifier "Void" diff --git a/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.swift b/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.swift new file mode 100644 index 000000000000..b3cccb6ae2a1 --- /dev/null +++ b/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.swift @@ -0,0 +1 @@ +let values = [Result]() \ No newline at end of file From 55b96f1f7bad28bdc8a806d04e8378d3ad68ef7e Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 7 Aug 2026 08:44:40 +0200 Subject: [PATCH 0142/2098] unified: Handle bracketed generic array metatypes --- .../extractor/src/languages/swift/swift.rs | 14 ++++ .../expressions/array-type-metatype.output | 75 +++++++++++++++++++ .../expressions/array-type-metatype.swift | 1 + 3 files changed, 90 insertions(+) create mode 100644 unified/extractor/tests/corpus/swift/expressions/array-type-metatype.output create mode 100644 unified/extractor/tests/corpus/swift/expressions/array-type-metatype.swift diff --git a/unified/extractor/src/languages/swift/swift.rs b/unified/extractor/src/languages/swift/swift.rs index b192669ae9a2..a52ec352cca2 100644 --- a/unified/extractor/src/languages/swift/swift.rs +++ b/unified/extractor/src/languages/swift/swift.rs @@ -699,6 +699,20 @@ fn translation_rules() -> Vec> { // `declReferenceExpr`; pull its `baseName` out as the member identifier. // A leading-dot access (`.foo`) has no explicit base — the base is an // `inferred_type_expr`. The base-ful form is matched first. + // A bracketed generic array type used as a metatype or static-member + // base (`[T].self`) is parsed as an `arrayExpr`; preserve its type + // meaning as `Array` rather than an array literal. + rule!( + (memberAccessExpr + base: (arrayExpr elements: (arrayElement expression: (genericSpecializationExpr) @element)) + declName: (declReferenceExpr baseName: @member)) + => + (member_access_expr + base: (generic_type_expr + base: (named_type_expr name: (identifier "Array")) + type_argument: {element}) + member: (identifier #{member})) + ), rule!( (memberAccessExpr base: @base declName: (declReferenceExpr baseName: @member)) => diff --git a/unified/extractor/tests/corpus/swift/expressions/array-type-metatype.output b/unified/extractor/tests/corpus/swift/expressions/array-type-metatype.output new file mode 100644 index 000000000000..f06917190b3a --- /dev/null +++ b/unified/extractor/tests/corpus/swift/expressions/array-type-metatype.output @@ -0,0 +1,75 @@ +let type = [Result].self + +--- + +sourceFile + endOfFileToken: endOfFile + statements: + codeBlockItem + item: + variableDecl + attributes: + modifiers: + bindingSpecifier: let + bindings: + patternBinding + initializer: + initializerClause + equal: = + value: + memberAccessExpr + period: . + declName: + declReferenceExpr + baseName: self + base: + arrayExpr + elements: + arrayElement + expression: + genericSpecializationExpr + expression: + declReferenceExpr + baseName: identifier "Result" + genericArgumentClause: + genericArgumentClause + arguments: + genericArgument + argument: + identifierType + name: identifier "Void" + leftAngle: < + rightAngle: > + leftSquare: [ + rightSquare: ] + pattern: + identifierPattern + identifier: identifier "type" + +--- + +top_level + body: + block + stmt: + variable_declaration + modifier: modifier "let" + pattern: + name_pattern + identifier: identifier "type" + value: + member_access_expr + base: + generic_type_expr + base: + named_type_expr + name: identifier "Array" + type_argument: + generic_type_expr + base: + named_type_expr + name: identifier "Result" + type_argument: + named_type_expr + name: identifier "Void" + member: identifier "self" diff --git a/unified/extractor/tests/corpus/swift/expressions/array-type-metatype.swift b/unified/extractor/tests/corpus/swift/expressions/array-type-metatype.swift new file mode 100644 index 000000000000..d0ee51283459 --- /dev/null +++ b/unified/extractor/tests/corpus/swift/expressions/array-type-metatype.swift @@ -0,0 +1 @@ +let type = [Result].self \ No newline at end of file From 171aa7a623660f63214181a073673896e82ec8ce Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 7 Aug 2026 08:56:30 +0200 Subject: [PATCH 0143/2098] unified: Use '.' as location for inferred_type_expr --- unified/extractor/src/languages/swift/swift.rs | 4 ++-- .../corpus/swift/functions/leading-dot-expression-call.output | 2 +- .../swift/functions/leading-dot-expression-value.output | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/unified/extractor/src/languages/swift/swift.rs b/unified/extractor/src/languages/swift/swift.rs index a52ec352cca2..065e91ad3be4 100644 --- a/unified/extractor/src/languages/swift/swift.rs +++ b/unified/extractor/src/languages/swift/swift.rs @@ -719,9 +719,9 @@ fn translation_rules() -> Vec> { (member_access_expr base: {base} member: (identifier #{member})) ), rule!( - (memberAccessExpr declName: (declReferenceExpr baseName: @member)) + (memberAccessExpr period: @dot declName: (declReferenceExpr baseName: @member)) => - (member_access_expr base: (inferred_type_expr) member: (identifier #{member})) + (member_access_expr base: (inferred_type_expr #{dot}) member: (identifier #{member})) ), // Control transfer, one rule per keyword. `return` carries an optional // value; `break` / `continue` an optional target label; `throw` its diff --git a/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-call.output b/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-call.output index d0a844d02afa..a5b38e1e2bea 100644 --- a/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-call.output +++ b/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-call.output @@ -51,7 +51,7 @@ top_level call_expr callee: member_access_expr - base: inferred_type_expr ".some" + base: inferred_type_expr "." member: identifier "some" argument: argument diff --git a/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-value.output b/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-value.output index bec014593d91..41128b61818e 100644 --- a/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-value.output +++ b/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-value.output @@ -39,5 +39,5 @@ top_level identifier: identifier "x" value: member_access_expr - base: inferred_type_expr ".foo" + base: inferred_type_expr "." member: identifier "foo" From a9792e5be85e83c20ad60840beb3ea5396086393 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 7 Aug 2026 08:35:30 +0200 Subject: [PATCH 0144/2098] unified: Fix handling of exprPattern --- .../extractor/src/languages/swift/swift.rs | 144 +++++++++------- .../nested-enum-case-pattern.output | 160 ++++++++++++++++++ .../nested-enum-case-pattern.swift | 6 + .../optional-enum-case-binding.output | 117 +++++++++++++ .../optional-enum-case-binding.swift | 3 + 5 files changed, 368 insertions(+), 62 deletions(-) create mode 100644 unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output create mode 100644 unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.swift create mode 100644 unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.output create mode 100644 unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.swift diff --git a/unified/extractor/src/languages/swift/swift.rs b/unified/extractor/src/languages/swift/swift.rs index 065e91ad3be4..556345c18d21 100644 --- a/unified/extractor/src/languages/swift/swift.rs +++ b/unified/extractor/src/languages/swift/swift.rs @@ -158,12 +158,30 @@ fn translation_rules() -> Vec> { // swift-syntax does not distinguish the lexical integer/string forms // (hex/binary/octal, single- vs multi-line, raw): each is a single // `*LiteralExpr` kind, so one rule per literal type suffices. - rule!((integerLiteralExpr) @@node => (int_literal #{node})), - rule!((floatLiteralExpr) @@node => (float_literal #{node})), - rule!((booleanLiteralExpr) @@node => (boolean_literal #{node})), - rule!((nilLiteralExpr) @@node => (builtin_expr #{node})), - rule!((stringLiteralExpr) @@node => (string_literal #{node})), - rule!((regexLiteralExpr) @@node => (regex_literal #{node})), + rule!((integerLiteralExpr) @@node => expr { + let value = tree!((int_literal #{node})); + if ctx.in_pattern { tree!((expr_equality_pattern expr: {value})) } else { value } + }), + rule!((floatLiteralExpr) @@node => expr { + let value = tree!((float_literal #{node})); + if ctx.in_pattern { tree!((expr_equality_pattern expr: {value})) } else { value } + }), + rule!((booleanLiteralExpr) @@node => expr { + let value = tree!((boolean_literal #{node})); + if ctx.in_pattern { tree!((expr_equality_pattern expr: {value})) } else { value } + }), + rule!((nilLiteralExpr) @@node => expr { + let value = tree!((builtin_expr #{node})); + if ctx.in_pattern { tree!((expr_equality_pattern expr: {value})) } else { value } + }), + rule!((stringLiteralExpr) @@node => expr { + let value = tree!((string_literal #{node})); + if ctx.in_pattern { tree!((expr_equality_pattern expr: {value})) } else { value } + }), + rule!((regexLiteralExpr) @@node => expr { + let value = tree!((regex_literal #{node})); + if ctx.in_pattern { tree!((expr_equality_pattern expr: {value})) } else { value } + }), // ---- Names ---- // A function reference spelled with argument labels (`f(x:y:z:)`) is a // `declReferenceExpr` carrying `argumentNames`. Mark it unsupported for @@ -176,6 +194,14 @@ fn translation_rules() -> Vec> { => (unsupported_node) ), + rule!((declReferenceExpr baseName: (identifier) @name) => expr { + let name = tree!((name_expr identifier: (identifier #{name}))); + if ctx.in_pattern { + tree!((expr_equality_pattern expr: {name})) + } else { + name + } + }), // A bare name reference (`x`), and an operator used as a value (`+` in // `reduce(0, +)`), are both `declReferenceExpr`; its `baseName` is the // referenced identifier / operator symbol. @@ -507,29 +533,6 @@ fn translation_rules() -> Vec> { // introduces a new binding; it unwraps to its inner pattern (a // `name_pattern`). rule!((valueBindingPattern pattern: @p) => pattern { p }), - // An enum-case pattern with associated values (`case .foo(let x)`, - // `case Color.foo(let x)`) is an expression pattern wrapping a call of a - // member access. It becomes a `constructor_pattern`; its arguments are - // translated as pattern elements (see the `labeledExpr` rules, gated by - // `ctx.in_pattern`). Matched before the generic `expressionPattern` rule. - // The base is optional: a leading-dot form (`.foo`) has none, so the - // constructor's base is an `inferred_type_expr`. - rule!( - (expressionPattern expression: (functionCallExpr - calledExpression: (memberAccessExpr base: _? @base period: @dot declName: (declReferenceExpr baseName: @name)) - arguments: _* @@args)) - => - constructor_pattern { - ctx.in_pattern = true; - let elements = ctx.translate(args)?; - let base = base.unwrap_or_else(|| tree!((inferred_type_expr #{dot}))); - tree!((constructor_pattern - constructor: (member_access_expr - base: {base} - member: (identifier #{name})) - element: {elements})) - } - ), // A tuple destructuring pattern (`let (a, b) = …`). A labelled element // (`let (x: a) = …`) carries its label through as the `pattern_element` // key; unlabelled elements have no key. @@ -544,36 +547,16 @@ fn translation_rules() -> Vec> { // handling in the future. (Redundant with the catch-all fallback, but // kept as a signpost.) rule!((isTypePattern) => (unsupported_node)), - // A standalone wildcard pattern (`case _:`, `if case _`): swift-syntax - // models the bare `_` as an `expressionPattern` wrapping a - // `discardAssignmentExpr`. Matched before the generic `expressionPattern` - // rule so `_` becomes an `ignore_pattern` rather than an equality match. - // (Wildcards *inside* an enum-case argument list are handled by the - // `labeledExpr`/`discardAssignmentExpr` rules.) - rule!((expressionPattern expression: (discardAssignmentExpr)) => (ignore_pattern)), // A wildcard *binding* pattern (`let _ = x`, `for _ in xs`). swift-syntax - // models this as a `wildcardPattern` — distinct from the `_` *match* - // pattern above, which is an `expressionPattern` over a - // `discardAssignmentExpr`. + // models this as a `wildcardPattern`, distinct from the `_` match form + // handled by the context-aware `discardAssignmentExpr` rule. rule!((wildcardPattern) => (ignore_pattern)), - // A tuple pattern in a match position (`case (let a, 3):`) is parsed by - // swift-syntax as an `expressionPattern` wrapping a `tupleExpr` — unlike a - // binding tuple (`let (a, b)`), which is a real `tuplePattern`. Recognise - // it as a `tuple_pattern`; its `labeledExpr` elements translate to - // `pattern_element`s under `ctx.in_pattern` (a binding element becomes a - // `name_pattern`, any other expression an `expr_equality_pattern`). - rule!( - (expressionPattern expression: (tupleExpr elements: _* @@els)) - => - tuple_pattern { - ctx.in_pattern = true; - let elements = ctx.translate(els)?; - tree!((tuple_pattern element: {elements})) - } - ), - // A bare expression pattern (`case 1:`, `case someConstant:`) matches by - // equality. - rule!((expressionPattern expression: @e) => (expr_equality_pattern expr: {e})), + // An expression pattern only establishes pattern context; its child + // determines the concrete pattern shape. + rule!((expressionPattern expression: @@e) => expr { + ctx.in_pattern = true; + ctx.translate(e)?.into_iter().next().ok_or("expression pattern has no child")? + }), // ---- Functions ---- // A function declaration (parameters/return type/body optional). The // parameters and return type nest under `signature`; the body is a @@ -661,7 +644,13 @@ fn translation_rules() -> Vec> { rule!( (functionCallExpr calledExpression: @callee arguments: _* @args) => - (call_expr callee: {callee} argument: {args}) + expr { + if ctx.in_pattern { + tree!((constructor_pattern constructor: {callee} element: {args})) + } else { + tree!((call_expr callee: {callee} argument: {args})) + } + } ), // A call argument or an enum-case pattern argument. When translating an // enum-case `constructor_pattern`'s arguments (`ctx.in_pattern`), a @@ -672,6 +661,27 @@ fn translation_rules() -> Vec> { // Otherwise the argument keeps its label as the `name` and its value. // The pattern-only shapes (`patternExpr`, `discardAssignmentExpr`) are // matched first; they never occur as ordinary call arguments. + rule!( + (labeledExpr + label: _? @@lbl + expression: (functionCallExpr + calledExpression: @constructor + arguments: _* @elements)) + => + argument { + if ctx.in_pattern { + tree!((pattern_element + key: (identifier #{lbl})? + pattern: (constructor_pattern + constructor: {constructor} + element: {elements}))) + } else { + tree!((argument + name: (identifier #{lbl})? + value: (call_expr callee: {constructor} argument: {elements}))) + } + } + ), rule!( (labeledExpr label: _? @@lbl expression: (patternExpr pattern: @p)) => @@ -689,7 +699,7 @@ fn translation_rules() -> Vec> { if ctx.in_pattern { tree!((pattern_element key: (identifier #{lbl})? - pattern: (expr_equality_pattern expr: {val}))) + pattern: {val})) } else { tree!((argument name: (identifier #{lbl})? value: {val})) } @@ -933,7 +943,18 @@ fn translation_rules() -> Vec> { ), // ---- Optionals and errors ---- // Optional chaining — unwrap the marker - rule!((optionalChainingExpr expression: @inner) => expr { inner }), + rule!((optionalChainingExpr expression: @@inner) => expr { + let inner = ctx.translate(inner)?.into_iter().next().ok_or("optional chaining expression has no child")?; + if ctx.in_pattern { + tree!((constructor_pattern + constructor: (member_access_expr + base: (named_type_expr name: (identifier "Optional")) + member: (identifier "some")) + element: (pattern_element pattern: {inner}))) + } else { + inner + } + }), // try/try?/try! expr → unary_expr with operator "try", "try?" or "try!" rule!( (tryExpr questionOrExclamationMark: _? @@m expression: @e) @@ -1023,8 +1044,7 @@ fn translation_rules() -> Vec> { // becomes a `modifier`; its source text is the modifier spelling. rule!((attribute) @m => (modifier #{m})), rule!((declModifier) @m => (modifier #{m})), - // A `super` expression. (`self` needs no rule: swift-syntax models it as - // an ordinary `declReferenceExpr`, already mapped to a `name_expr`.) + // A `super` expression. rule!((superExpr) => (super_expr)), // Type expressions. A generic type applied with explicit arguments // (`Set`) becomes a `generic_type_expr` whose `base` is the type diff --git a/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output b/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output new file mode 100644 index 000000000000..22d9b86bf996 --- /dev/null +++ b/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output @@ -0,0 +1,160 @@ +switch event { +case let .received(.some(value), timestamp): + print(value, timestamp) +default: + break +} + +--- + +sourceFile + endOfFileToken: endOfFile + statements: + codeBlockItem + item: + expressionStmt + expression: + switchExpr + leftBrace: { + rightBrace: } + cases: + switchCase + label: + switchCaseLabel + colon: : + caseKeyword: case + caseItems: + switchCaseItem + pattern: + valueBindingPattern + pattern: + expressionPattern + expression: + functionCallExpr + leftParen: ( + rightParen: ) + arguments: + labeledExpr + expression: + functionCallExpr + leftParen: ( + rightParen: ) + arguments: + labeledExpr + expression: + patternExpr + pattern: + identifierPattern + identifier: identifier "value" + additionalTrailingClosures: + calledExpression: + memberAccessExpr + period: . + declName: + declReferenceExpr + baseName: identifier "some" + trailingComma: , + labeledExpr + expression: + patternExpr + pattern: + identifierPattern + identifier: identifier "timestamp" + additionalTrailingClosures: + calledExpression: + memberAccessExpr + period: . + declName: + declReferenceExpr + baseName: identifier "received" + bindingSpecifier: let + statements: + codeBlockItem + item: + functionCallExpr + leftParen: ( + rightParen: ) + arguments: + labeledExpr + expression: + declReferenceExpr + baseName: identifier "value" + trailingComma: , + labeledExpr + expression: + declReferenceExpr + baseName: identifier "timestamp" + additionalTrailingClosures: + calledExpression: + declReferenceExpr + baseName: identifier "print" + switchCase + label: + switchDefaultLabel + colon: : + defaultKeyword: default + statements: + codeBlockItem + item: + breakStmt + breakKeyword: break + subject: + declReferenceExpr + baseName: identifier "event" + switchKeyword: switch + +--- + +top_level + body: + block + stmt: + switch_expr + value: + name_expr + identifier: identifier "event" + case: + switch_case + pattern: + constructor_pattern + constructor: + member_access_expr + base: inferred_type_expr "." + member: identifier "received" + element: + pattern_element + pattern: + constructor_pattern + constructor: + member_access_expr + base: inferred_type_expr "." + member: identifier "some" + element: + pattern_element + pattern: + name_pattern + identifier: identifier "value" + pattern_element + pattern: + name_pattern + identifier: identifier "timestamp" + body: + block + stmt: + call_expr + callee: + name_expr + identifier: identifier "print" + argument: + argument + value: + name_expr + identifier: identifier "value" + argument + value: + name_expr + identifier: identifier "timestamp" + switch_case + body: + block + stmt: break_expr "break" diff --git a/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.swift b/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.swift new file mode 100644 index 000000000000..c603e2a3b12c --- /dev/null +++ b/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.swift @@ -0,0 +1,6 @@ +switch event { +case let .received(.some(value), timestamp): + print(value, timestamp) +default: + break +} \ No newline at end of file diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.output new file mode 100644 index 000000000000..7b1eb1eea3b4 --- /dev/null +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.output @@ -0,0 +1,117 @@ +if case .some(let value)? = input { + print(value) +} + +--- + +sourceFile + endOfFileToken: endOfFile + statements: + codeBlockItem + item: + expressionStmt + expression: + ifExpr + body: + codeBlock + leftBrace: { + rightBrace: } + statements: + codeBlockItem + item: + functionCallExpr + leftParen: ( + rightParen: ) + arguments: + labeledExpr + expression: + declReferenceExpr + baseName: identifier "value" + additionalTrailingClosures: + calledExpression: + declReferenceExpr + baseName: identifier "print" + conditions: + conditionElement + condition: + matchingPatternCondition + initializer: + initializerClause + equal: = + value: + declReferenceExpr + baseName: identifier "input" + pattern: + expressionPattern + expression: + optionalChainingExpr + expression: + functionCallExpr + leftParen: ( + rightParen: ) + arguments: + labeledExpr + expression: + patternExpr + pattern: + valueBindingPattern + pattern: + identifierPattern + identifier: identifier "value" + bindingSpecifier: let + additionalTrailingClosures: + calledExpression: + memberAccessExpr + period: . + declName: + declReferenceExpr + baseName: identifier "some" + questionMark: ? + caseKeyword: case + ifKeyword: if + +--- + +top_level + body: + block + stmt: + if_expr + condition: + pattern_guard_expr + pattern: + constructor_pattern + constructor: + member_access_expr + base: + named_type_expr + name: identifier "Optional" + member: identifier "some" + element: + pattern_element + pattern: + constructor_pattern + constructor: + member_access_expr + base: inferred_type_expr "." + member: identifier "some" + element: + pattern_element + pattern: + name_pattern + identifier: identifier "value" + value: + name_expr + identifier: identifier "input" + then: + block + stmt: + call_expr + callee: + name_expr + identifier: identifier "print" + argument: + argument + value: + name_expr + identifier: identifier "value" diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.swift b/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.swift new file mode 100644 index 000000000000..ef9eac3661c9 --- /dev/null +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.swift @@ -0,0 +1,3 @@ +if case .some(let value)? = input { + print(value) +} \ No newline at end of file From 8080bac9cf5f681ca9efeacce6498794b1134521 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 7 Aug 2026 08:59:44 +0200 Subject: [PATCH 0145/2098] unified: Add newlines at EOF --- .../corpus/swift/control-flow/nested-enum-case-pattern.swift | 2 +- .../tests/corpus/swift/expressions/array-type-constructor.swift | 2 +- .../tests/corpus/swift/expressions/array-type-metatype.swift | 2 +- .../swift/optionals-and-errors/optional-enum-case-binding.swift | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.swift b/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.swift index c603e2a3b12c..876d9995aee6 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.swift +++ b/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.swift @@ -3,4 +3,4 @@ case let .received(.some(value), timestamp): print(value, timestamp) default: break -} \ No newline at end of file +} diff --git a/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.swift b/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.swift index b3cccb6ae2a1..49191aee851d 100644 --- a/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.swift +++ b/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.swift @@ -1 +1 @@ -let values = [Result]() \ No newline at end of file +let values = [Result]() diff --git a/unified/extractor/tests/corpus/swift/expressions/array-type-metatype.swift b/unified/extractor/tests/corpus/swift/expressions/array-type-metatype.swift index d0ee51283459..85d770be76cb 100644 --- a/unified/extractor/tests/corpus/swift/expressions/array-type-metatype.swift +++ b/unified/extractor/tests/corpus/swift/expressions/array-type-metatype.swift @@ -1 +1 @@ -let type = [Result].self \ No newline at end of file +let type = [Result].self diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.swift b/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.swift index ef9eac3661c9..c0e58852bef1 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.swift +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.swift @@ -1,3 +1,3 @@ if case .some(let value)? = input { print(value) -} \ No newline at end of file +} From 0cf2871385d5bb8140ded73738500cd50f680bc4 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 7 Aug 2026 09:42:19 +0200 Subject: [PATCH 0146/2098] unified: Update comment The restriction to classes was more permanent that anticipated, since top-level scopes instead target a TModuleScope --- unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 02ce277bc895..8f7b7ae7404e 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -28,7 +28,7 @@ class NameBindingNode extends TNameBindingNode { predicate isLocalName(LocalName local) { this = TLocalName(local) } - /** Holds if this represents the set of static members available in the given namespace (currently restricted to classes) */ + /** Holds if this represents the set of static members available in the given namespace. */ predicate isExportedNamespace(ClassLikeDeclaration cls) { this = TExportedNamespace(cls) } /** Holds if this represents the set of members that can be accessed unqualified within the given scope. */ From a3f21a5a20bf63b4dcff1b6ac011817963420170 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 7 Aug 2026 10:44:24 +0200 Subject: [PATCH 0147/2098] unified: Support scoped imports Scoped imports like 'import class B.C' are mapped to an AST of form ImportDeclartion pattern: NamePattern "C" importedExpr: MemberAccessExpr base: "B" member: "C" The NamePattern introduces a local alias for 'C', but unlike type aliases we also resolve to the ultimate target, when it's coming through an import. --- unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll | 5 +++++ .../static-name-binding/package1/Sources/Target1/File2.swift | 5 +++++ .../static-name-binding/package1/Sources/Target2/File3.swift | 4 ++++ 3 files changed, 14 insertions(+) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 8f7b7ae7404e..adf505281eb9 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -181,6 +181,11 @@ predicate valueStep(NameBindingNode node1, NameBindingNode node2) { node1 = getModuleNodeFromFile(top.getFile()) and node2.isLocalNamespace(top.getBody()) // implicitly import own module ) + or + exists(ImportDeclaration imprt | + node1 = getNodeFromRef(imprt.getImportedExpr()) and + node2 = getNodeFromRef(imprt.getPattern()) + ) } predicate inheritanceStep(NameBindingNode supertype, NameBindingNode subtype) { diff --git a/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target1/File2.swift b/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target1/File2.swift index fa515af0eaf5..4705d8f65558 100644 --- a/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target1/File2.swift +++ b/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target1/File2.swift @@ -1 +1,6 @@ class A {} // name=Target1.A + +private import class Target2.B // $ access=Target2.B // name=LocalB + +// Note: currently the local name 'B' introduced by the scoped import is also resolved as a target +private let x: B.C; // $ access=Target2.B access=Target2.B.C access=LocalB diff --git a/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target2/File3.swift b/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target2/File3.swift index 47c3f4da77ed..c49329b168f3 100644 --- a/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target2/File3.swift +++ b/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target2/File3.swift @@ -1 +1,5 @@ class A {} // name=Target2.A + +class B { // name=Target2.B + class C {} // name=Target2.B.C +} From 50f934bbc4f0836c87786548e08b95b24d7a8d8f Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 7 Aug 2026 10:55:32 +0200 Subject: [PATCH 0148/2098] unified: Don't track trivial name aliasse --- .../unified/internal/StaticNameBinding.qll | 20 ++++++++++++++++++- .../package1/Sources/Target1/File2.swift | 5 ++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index adf505281eb9..5afbf1ab6bb2 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -280,8 +280,26 @@ private module TrackNamespaceInput implements TrackInputSig { private module TrackNamespace = Track; +/** + * Holds if `decl` is a trivial local alias for an imported name. + * + * Declaration-tracking usually stops at type-aliases, but trivial aliases + * will be passed through. + */ +predicate isTrivialNameAlias(NameDeclaration decl) { + exists(ImportDeclaration imprt | + decl = getIdentifierFromRef(imprt.getPattern()) and + decl.getName() = getIdentifierFromRef(imprt.getImportedExpr()).getValue() + ) +} + private module TrackNameDeclarationInput implements TrackInputSig { - predicate shouldTrack(NameBindingNode node) { node.isIdentifier(any(NameDeclaration d)) } + predicate shouldTrack(NameBindingNode node) { + exists(NameDeclaration decl | + node.isIdentifier(decl) and + not isTrivialNameAlias(decl) + ) + } } private module TrackNameDeclaration = Track; diff --git a/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target1/File2.swift b/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target1/File2.swift index 4705d8f65558..62dbfcbf5c04 100644 --- a/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target1/File2.swift +++ b/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target1/File2.swift @@ -1,6 +1,5 @@ class A {} // name=Target1.A -private import class Target2.B // $ access=Target2.B // name=LocalB +private import class Target2.B // $ access=Target2.B -// Note: currently the local name 'B' introduced by the scoped import is also resolved as a target -private let x: B.C; // $ access=Target2.B access=Target2.B.C access=LocalB +private let x: B.C; // $ access=Target2.B access=Target2.B.C From cfa81b13ab707def142edd65ffd17aa1b08441c2 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Fri, 7 Aug 2026 13:22:58 +0200 Subject: [PATCH 0149/2098] Ruby: Switch regex tracking from TypeTracking to DataFlow. --- .../ruby/regexp/internal/RegExpTracking.qll | 196 ++++-------------- 1 file changed, 36 insertions(+), 160 deletions(-) diff --git a/ruby/ql/lib/codeql/ruby/regexp/internal/RegExpTracking.qll b/ruby/ql/lib/codeql/ruby/regexp/internal/RegExpTracking.qll index 5d70b7d164a2..7229ccfd9125 100644 --- a/ruby/ql/lib/codeql/ruby/regexp/internal/RegExpTracking.qll +++ b/ruby/ql/lib/codeql/ruby/regexp/internal/RegExpTracking.qll @@ -55,175 +55,59 @@ DataFlow::Node stringSink() { /** Gets a node where regular expressions that flow to the node are used. */ DataFlow::Node regSink() { result = any(RegexExecution exec).getRegex() } -private signature module TypeTrackInputSig { - DataFlow::LocalSourceNode start(TypeTracker t, DataFlow::Node start); +private module RegexConfig implements DataFlow::StateConfigSig { + private newtype TFlowState = + TStringState() or + TRegExpState() - predicate end(DataFlow::Node n); + class FlowState = TFlowState; - predicate additionalStep(DataFlow::Node nodeFrom, DataFlow::LocalSourceNode nodeTo); -} - -/** - * Provides a version of type tracking where we first prune for reachable nodes, - * before doing the type tracking computation. - */ -private module PrunedTypeTrack { - private predicate additionalStep( - DataFlow::LocalSourceNode nodeFrom, DataFlow::LocalSourceNode nodeTo - ) { - Input::additionalStep(nodeFrom.getALocalUse(), nodeTo) - } - - /** Gets a node that is forwards reachable by type-tracking. */ - pragma[nomagic] - private DataFlow::LocalSourceNode forward(TypeTracker t) { - result = Input::start(t, _) + predicate isSource(DataFlow::Node source, FlowState state) { + state = TStringState() and source = strStart() or - exists(TypeTracker t2 | result = forward(t2).track(t2, t)) - or - exists(TypeTracker t2 | t2 = t.continue() | additionalStep(forward(t2), result)) + state = TRegExpState() and source = regStart() } - bindingset[result, tbt] - pragma[inline_late] - pragma[noopt] - private DataFlow::LocalSourceNode forwardLateInline(TypeBackTracker tbt) { - exists(TypeTracker tt | - result = forward(tt) and - tt = tbt.getACompatibleTypeTracker() - ) + predicate isSink(DataFlow::Node sink, FlowState state) { + state = TStringState() and sink = stringSink() + or + state = TRegExpState() and sink = regSink() } - /** Gets a node that is backwards reachable by type-tracking. */ - pragma[nomagic] - private DataFlow::LocalSourceNode backwards(TypeBackTracker t) { - result = forwardLateInline(t) and + predicate isAdditionalFlowStep( + DataFlow::Node node1, FlowState state1, DataFlow::Node node2, FlowState state2 + ) { + regFromString(node1, node2) and state1 = TStringState() and state2 = TRegExpState() + or + state1 = TStringState() and + state2 = TStringState() and ( - t.start() and - Input::end(result.getALocalUse()) + // include taint flow through `String` summaries + TaintTrackingPrivate::summaryThroughStepTaint(node1, node2, any(String::SummarizedCallable c)) or - exists(TypeBackTracker t2 | result = backwards(t2).backtrack(t2, t)) + // string concatenations, and + exists(CfgNodes::ExprNodes::OperationCfgNode op | + op = node2.asExpr() and + op.getAnOperand() = node1.asExpr() and + op.getExpr().(Ast::BinaryOperation).getOperator() = "+" + ) or - exists(TypeBackTracker t2 | t2 = t.continue() | additionalStep(result, backwards(t2))) - ) - } - - bindingset[result, tt] - pragma[inline_late] - pragma[noopt] - private DataFlow::LocalSourceNode backwardsInlineLate(TypeTracker tt) { - exists(TypeBackTracker tbt | - result = backwards(tbt) and - tt = tbt.getACompatibleTypeTracker() - ) - } - - /** Holds if `n` is forwards and backwards reachable with type tracker `t`. */ - pragma[nomagic] - private predicate reached(DataFlow::LocalSourceNode n, TypeTracker t) { - n = forward(t) and - n = backwardsInlineLate(t) - } - - pragma[nomagic] - private TypeTracker stepReached( - TypeTracker t, DataFlow::LocalSourceNode nodeFrom, DataFlow::LocalSourceNode nodeTo - ) { - exists(StepSummary summary | - step(nodeFrom, nodeTo, summary) and - reached(nodeFrom, t) and - reached(nodeTo, result) and - result = append(t, summary) - ) - or - additionalStep(nodeFrom, nodeTo) and - reached(nodeFrom, pragma[only_bind_into](t)) and - reached(nodeTo, pragma[only_bind_into](t)) and - result = t.continue() - } - - /** Gets a node that has been tracked from the start node `start`. */ - DataFlow::LocalSourceNode track(DataFlow::Node start, TypeTracker t) { - t.start() and - result = Input::start(t, start) and - reached(result, t) - or - exists(TypeTracker t2 | t = stepReached(t2, track(start, t2), result)) - } -} - -/** Holds if `inputStr` is compiled to a regular expression that is returned at `call`. */ -pragma[nomagic] -private predicate regFromString(DataFlow::LocalSourceNode inputStr, DataFlow::CallNode call) { - exists(DataFlow::Node mid | - inputStr.flowsTo(mid) and - call = API::getTopLevelMember("Regexp").getAMethodCall(["compile", "new"]) and - mid = call.getArgument(0) - ) -} - -private module StringTypeTrackInput implements TypeTrackInputSig { - DataFlow::LocalSourceNode start(TypeTracker t, DataFlow::Node start) { - start = strStart() and t.start() and result = start - } - - predicate end(DataFlow::Node n) { - n = stringSink() or - regFromString(n, _) - } - - predicate additionalStep(DataFlow::Node nodeFrom, DataFlow::LocalSourceNode nodeTo) { - // include taint flow through `String` summaries - TaintTrackingPrivate::summaryThroughStepTaint(nodeFrom, nodeTo, - any(String::SummarizedCallable c)) - or - // string concatenations, and - exists(CfgNodes::ExprNodes::OperationCfgNode op | - op = nodeTo.asExpr() and - op.getAnOperand() = nodeFrom.asExpr() and - op.getExpr().(Ast::BinaryOperation).getOperator() = "+" + // string interpolations + node1.asExpr() = + node2.asExpr().(CfgNodes::ExprNodes::StringlikeLiteralCfgNode).getAComponent() ) - or - // string interpolations - nodeFrom.asExpr() = - nodeTo.asExpr().(CfgNodes::ExprNodes::StringlikeLiteralCfgNode).getAComponent() } } -/** - * Gets a node that has been tracked from the string constant `start` to some node. - * This is used to figure out where `start` is evaluated as a regular expression against an input string, - * or where `start` is compiled into a regular expression. - */ -private predicate trackStrings = PrunedTypeTrack::track/2; +private module RegexTracking = DataFlow::GlobalWithState; -/** Holds if `strConst` flows to a regex compilation (tracked by `t`), where the resulting regular expression is stored in `reg`. */ +/** Holds if `inputStr` is compiled to a regular expression that is returned at `call`. */ pragma[nomagic] -private predicate regFromStringStart(DataFlow::Node strConst, TypeTracker t, DataFlow::CallNode reg) { - regFromString(trackStrings(strConst, t), reg) and - exists(t.continue()) -} - -private module RegTypeTrackInput implements TypeTrackInputSig { - DataFlow::LocalSourceNode start(TypeTracker t, DataFlow::Node start) { - start = regStart() and - t.start() and - result = start - or - regFromStringStart(start, t, result) - } - - predicate end(DataFlow::Node n) { n = regSink() } - - predicate additionalStep(DataFlow::Node nodeFrom, DataFlow::LocalSourceNode nodeTo) { none() } +private predicate regFromString(DataFlow::Node inputStr, DataFlow::CallNode call) { + call = API::getTopLevelMember("Regexp").getAMethodCall(["compile", "new"]) and + inputStr = call.getArgument(0) } -/** - * Gets a node that has been tracked from the regular expression `start` to some node. - * This is used to figure out where `start` is executed against an input string. - */ -private predicate trackRegs = PrunedTypeTrack::track/2; - /** Gets a node that references a regular expression. */ private DataFlow::LocalSourceNode trackRegexpType(TypeTracker t) { t.start() and @@ -240,12 +124,4 @@ DataFlow::Node trackRegexpType() { trackRegexpType(TypeTracker::end()).flowsTo(r /** Gets a node holding a value for the regular expression that is evaluated at `re`. */ cached -DataFlow::Node regExpSource(DataFlow::Node re) { - exists(DataFlow::LocalSourceNode end | end = trackStrings(result, TypeTracker::end()) | - end.getALocalUse() = re and re = stringSink() - ) - or - exists(DataFlow::LocalSourceNode end | end = trackRegs(result, TypeTracker::end()) | - end.getALocalUse() = re and re = regSink() - ) -} +DataFlow::Node regExpSource(DataFlow::Node re) { RegexTracking::flow(result, re) } From a79c32ae9f5fe61bfb12de2b61ef9cd88b3fc03f Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 7 Aug 2026 13:46:59 +0200 Subject: [PATCH 0150/2098] unified: Bulk imports --- .../unified/internal/LocalNameBinding.qll | 3 +++ .../unified/internal/NameBindingPlugin.qll | 4 +-- .../internal/NameBindingPluginSwift.qll | 5 +++- .../unified/internal/StaticNameBinding.qll | 27 ++++++++++++++++++- .../package1/Sources/Target1/File3.swift | 4 +++ 5 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 unified/ql/test/library-tests/static-name-binding/package1/Sources/Target1/File3.swift diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index faa2be5fe43e..a7ab44dbbb8e 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -326,6 +326,9 @@ private module LocalNameBindingInput implements LocalNameBindingInputSig Date: Fri, 7 Aug 2026 13:48:21 +0200 Subject: [PATCH 0151/2098] unified: Fix access level in test case Program was not valid unless these were public --- .../package1/Sources/Target2/File3.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target2/File3.swift b/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target2/File3.swift index c49329b168f3..8309118a867b 100644 --- a/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target2/File3.swift +++ b/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target2/File3.swift @@ -1,5 +1,5 @@ -class A {} // name=Target2.A +public class A {} // name=Target2.A -class B { // name=Target2.B - class C {} // name=Target2.B.C +public class B { // name=Target2.B + public class C {} // name=Target2.B.C } From a2b6c1f76ab2f1f0432b767a6dee3f39d8bc8eaf Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Fri, 7 Aug 2026 13:48:55 +0200 Subject: [PATCH 0152/2098] Ruby: Accept test improvement. --- .../IncompleteHostnameRegExp/IncompleteHostnameRegExp.expected | 1 + .../IncompleteHostnameRegExp/tst-IncompleteHostnameRegExp.rb | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ruby/ql/test/query-tests/security/cwe-020/IncompleteHostnameRegExp/IncompleteHostnameRegExp.expected b/ruby/ql/test/query-tests/security/cwe-020/IncompleteHostnameRegExp/IncompleteHostnameRegExp.expected index 097f43c33e70..00f8d91f99d3 100644 --- a/ruby/ql/test/query-tests/security/cwe-020/IncompleteHostnameRegExp/IncompleteHostnameRegExp.expected +++ b/ruby/ql/test/query-tests/security/cwe-020/IncompleteHostnameRegExp/IncompleteHostnameRegExp.expected @@ -16,6 +16,7 @@ | tst-IncompleteHostnameRegExp.rb:20:14:20:31 | ^test.example.com$ | This regular expression has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.rb:20:13:20:26 | "#{...}$" | here | | tst-IncompleteHostnameRegExp.rb:22:24:22:40 | test.example.com$ | This string, which is used as a regular expression $@, has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.rb:23:13:23:29 | ...[...] | here | | tst-IncompleteHostnameRegExp.rb:28:24:28:40 | test.example.com$ | This string, which is used as a regular expression $@, has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.rb:63:20:63:36 | ...[...] | here | +| tst-IncompleteHostnameRegExp.rb:30:27:30:43 | test.example.com$ | This string, which is used as a regular expression $@, has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.rb:66:20:66:36 | ...[...] | here | | tst-IncompleteHostnameRegExp.rb:37:3:37:53 | ^(https?:)?\\/\\/((service\|www).)?example.com(?=$\|\\/) | This regular expression has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.rb:37:2:37:54 | /^(https?:)?\\/\\/((service\|www).../ | here | | tst-IncompleteHostnameRegExp.rb:38:3:38:43 | ^(http\|https):\\/\\/www.example.com\\/p\\/f\\/ | This regular expression has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.rb:38:2:38:44 | /^(http\|https):\\/\\/www.example.../ | here | | tst-IncompleteHostnameRegExp.rb:39:5:39:30 | http:\\/\\/sub.example.com\\/ | This regular expression has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.rb:39:2:39:33 | /^(http:\\/\\/sub.example.com\\/)/ | here | diff --git a/ruby/ql/test/query-tests/security/cwe-020/IncompleteHostnameRegExp/tst-IncompleteHostnameRegExp.rb b/ruby/ql/test/query-tests/security/cwe-020/IncompleteHostnameRegExp/tst-IncompleteHostnameRegExp.rb index 50e2e257dcec..20c7522ba1cf 100644 --- a/ruby/ql/test/query-tests/security/cwe-020/IncompleteHostnameRegExp/tst-IncompleteHostnameRegExp.rb +++ b/ruby/ql/test/query-tests/security/cwe-020/IncompleteHostnameRegExp/tst-IncompleteHostnameRegExp.rb @@ -27,7 +27,7 @@ def foo convert1({ hostname: 'test.example.com$' }); # $ Alert // NOT OK - domains = [ { hostname: 'test.example.com$' } ]; # $ MISSING: Alert # NOT OK - but not flagged due to limitations of TypeTracking. + domains = [ { hostname: 'test.example.com$' } ]; # $ Alert // NOT OK From 659da08a38f0b6954cff3dc5c351c5e33b4baca0 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 7 Aug 2026 13:53:21 +0200 Subject: [PATCH 0153/2098] unified: Fix incorrect expectation Module names can only be referenced by an import declaration, they cannot appear directly on front of a type name unless the module is also imported. --- .../static-name-binding/package1/Sources/Target1/File1.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target1/File1.swift b/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target1/File1.swift index fff0a56e90f3..1c9d6f81d06c 100644 --- a/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target1/File1.swift +++ b/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target1/File1.swift @@ -1,2 +1,2 @@ let x: A; // $ access=Target1.A -let y: Target2.A; // $ access=Target2.A +let y: Target2.A; // $ SPURIOUS: access=Target2.A From 35c54b15c7ed6916a38244497e10349fdc7539e7 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 7 Aug 2026 14:26:12 +0200 Subject: [PATCH 0154/2098] unified: Fix toString and getLocation for TLocalNamespace --- .../ql/lib/codeql/unified/internal/StaticNameBinding.qll | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 8a58e640b470..9c9967920704 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -54,9 +54,7 @@ class NameBindingNode extends TNameBindingNode { this.isExportedNamespace(cls) and result = "ExportedNamespace(" + cls + ")" ) or - exists(ClassLikeDeclaration cls | - this.isLocalNamespace(cls) and result = "LocalNamespace(" + cls + ")" - ) + exists(AstNode n | this.isLocalNamespace(n) and result = "LocalNamespace(" + n + ")") or exists(ModuleScopeRepr repr | this.isModuleScopeNode(repr) and result = "ModuleScope(" + repr + ")" @@ -74,7 +72,7 @@ class NameBindingNode extends TNameBindingNode { or exists(ClassLikeDeclaration cls | this.isExportedNamespace(cls) and result = cls.getLocation()) or - exists(ClassLikeDeclaration cls | this.isLocalNamespace(cls) and result = cls.getLocation()) + exists(AstNode n | this.isLocalNamespace(n) and result = n.getLocation()) or exists(ModuleScopeRepr repr | this.isModuleScopeNode(repr) and result = repr.getLocation()) or From af2f5a2654394ff56975db8db6625f89958b0098 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 7 Aug 2026 14:26:27 +0200 Subject: [PATCH 0155/2098] unified: Remove location of TModuleRoot --- unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll | 3 --- 1 file changed, 3 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 9c9967920704..a753cc5cce55 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -75,9 +75,6 @@ class NameBindingNode extends TNameBindingNode { exists(AstNode n | this.isLocalNamespace(n) and result = n.getLocation()) or exists(ModuleScopeRepr repr | this.isModuleScopeNode(repr) and result = repr.getLocation()) - or - this.isModuleRoot() and - exists(ModuleScopeRepr repr | result = repr.getLocation()) } } From 7f959bff17c9657cafbd41f947930f8503f67107 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 21 Jul 2026 10:01:38 +0000 Subject: [PATCH 0156/2098] C++: Copy Ruby regex library and tests verbatim --- .../semmle/code/cpp/regex/RegexTreeView.qll | 1235 +++++++++++++++++ .../code/cpp/regex/internal/ParseRegExp.qll | 1037 ++++++++++++++ .../test/library-tests/regex/parse.expected | 489 +++++++ cpp/ql/test/library-tests/regex/parse.ql | 27 + .../test/library-tests/regex/regexp.expected | 270 ++++ cpp/ql/test/library-tests/regex/regexp.ql | 11 + cpp/ql/test/library-tests/regex/regexp.rb | 82 ++ 7 files changed, 3151 insertions(+) create mode 100644 cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll create mode 100644 cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll create mode 100644 cpp/ql/test/library-tests/regex/parse.expected create mode 100644 cpp/ql/test/library-tests/regex/parse.ql create mode 100644 cpp/ql/test/library-tests/regex/regexp.expected create mode 100644 cpp/ql/test/library-tests/regex/regexp.ql create mode 100644 cpp/ql/test/library-tests/regex/regexp.rb diff --git a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll new file mode 100644 index 000000000000..51df17008817 --- /dev/null +++ b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll @@ -0,0 +1,1235 @@ +/** Provides a class hierarchy corresponding to a parse tree of regular expressions. */ + +private import internal.ParseRegExp +private import codeql.util.Numbers +private import codeql.ruby.ast.Literal as Ast +private import codeql.Locations +private import codeql.regex.nfa.NfaUtils as NfaUtils +private import codeql.regex.RegexTreeView +// exporting as RegexTreeView, and in the top-level scope. +import Impl as RegexTreeView +import Impl + +/** Gets the parse tree resulting from parsing `re`, if such has been constructed. */ +RegExpTerm getParsedRegExp(Ast::RegExpLiteral re) { + result.getRegExp() = re and result.isRootTerm() +} + +/** + * An element containing a regular expression term, that is, either + * a string literal (parsed as a regular expression) + * or another regular expression term. + * + * For sequences and alternations, we require at least one child. + * Otherwise, we wish to represent the term differently. + * This avoids multiple representations of the same term. + */ +private newtype TRegExpParent = + /** A string literal used as a regular expression */ + TRegExpLiteral(RegExp re) or + /** A quantified term */ + TRegExpQuantifier(RegExp re, int start, int end) { re.qualifiedItem(start, end, _, _) } or + /** A sequence term */ + TRegExpSequence(RegExp re, int start, int end) { re.sequence(start, end) } or + /** An alternation term */ + TRegExpAlt(RegExp re, int start, int end) { re.alternation(start, end) } or + /** A character class term */ + TRegExpCharacterClass(RegExp re, int start, int end) { re.charSet(start, end) } or + /** A character range term */ + TRegExpCharacterRange(RegExp re, int start, int end) { re.charRange(_, start, _, _, end) } or + /** A group term */ + TRegExpGroup(RegExp re, int start, int end) { re.group(start, end) } or + /** A special character */ + TRegExpSpecialChar(RegExp re, int start, int end) { re.specialCharacter(start, end, _) } or + /** A normal character */ + TRegExpNormalChar(RegExp re, int start, int end) { + re.normalCharacterSequence(start, end) + or + re.escapedCharacter(start, end) and + not re.specialCharacter(start, end, _) + } or + /** A back reference */ + TRegExpBackRef(RegExp re, int start, int end) { re.backreference(start, end) } or + /** A named character property */ + TRegExpNamedCharacterProperty(RegExp re, int start, int end) { + re.namedCharacterProperty(start, end, _) + } + +/** An implementation that statisfies the RegexTreeView signature. */ +private module Impl implements RegexTreeViewSig { + /** + * An element containing a regular expression term, that is, either + * a string literal (parsed as a regular expression) + * or another regular expression term. + */ + class RegExpParent extends TRegExpParent { + /** Gets a textual representation of this element. */ + string toString() { result = "RegExpParent" } + + /** Gets the `i`th child term. */ + RegExpTerm getChild(int i) { none() } + + /** Gets a child term . */ + final RegExpTerm getAChild() { result = this.getChild(_) } + + /** Gets the number of child terms. */ + int getNumChild() { result = count(this.getAChild()) } + + /** Gets the last child term of this element. */ + RegExpTerm getLastChild() { result = this.getChild(this.getNumChild() - 1) } + + /** + * Gets the name of a primary CodeQL class to which this regular + * expression term belongs. + */ + string getAPrimaryQlClass() { result = "RegExpParent" } + + /** + * Gets a comma-separated list of the names of the primary CodeQL classes to + * which this regular expression term belongs. + */ + final string getPrimaryQlClasses() { result = concat(this.getAPrimaryQlClass(), ",") } + } + + /** A string literal used as a regular expression */ + class RegExpLiteral extends TRegExpLiteral, RegExpParent { + RegExp re; + + RegExpLiteral() { this = TRegExpLiteral(re) } + + override RegExpTerm getChild(int i) { + i = 0 and result.getRegExp() = re and result.isRootTerm() + } + + /** Holds if dot, `.`, matches all characters, including newlines. */ + predicate isDotAll() { re.isDotAll() } + + /** Holds if this regex matching is case-insensitive for this regex. */ + predicate isIgnoreCase() { re.isIgnoreCase() } + + /** Get a string representing all modes for this regex. */ + string getFlags() { result = re.getFlags() } + + /** Gets the primary QL class for this regex. */ + override string getAPrimaryQlClass() { result = "RegExpLiteral" } + } + + /** + * A regular expression term, that is, a syntactic part of a regular expression. + */ + class RegExpTerm extends RegExpParent { + RegExp re; + int start; + int end; + + RegExpTerm() { + this = TRegExpAlt(re, start, end) + or + this = TRegExpBackRef(re, start, end) + or + this = TRegExpCharacterClass(re, start, end) + or + this = TRegExpCharacterRange(re, start, end) + or + this = TRegExpNormalChar(re, start, end) + or + this = TRegExpGroup(re, start, end) + or + this = TRegExpQuantifier(re, start, end) + or + this = TRegExpSequence(re, start, end) and + exists(seqChild(re, start, end, 1)) // if a sequence does not have more than one element, it should be treated as that element instead. + or + this = TRegExpSpecialChar(re, start, end) + or + this = TRegExpNamedCharacterProperty(re, start, end) + } + + /** + * Gets the outermost term of this regular expression. + */ + RegExpTerm getRootTerm() { + this.isRootTerm() and result = this + or + result = this.getParent().(RegExpTerm).getRootTerm() + } + + /** + * Holds if this term is part of a string literal + * that is interpreted as a regular expression. + */ + predicate isUsedAsRegExp() { any() } + + /** + * Holds if this is the root term of a regular expression. + */ + predicate isRootTerm() { start = 0 and end = re.getText().length() } + + override RegExpTerm getChild(int i) { + result = this.(RegExpAlt).getChild(i) + or + result = this.(RegExpBackRef).getChild(i) + or + result = this.(RegExpCharacterClass).getChild(i) + or + result = this.(RegExpCharacterRange).getChild(i) + or + result = this.(RegExpNormalChar).getChild(i) + or + result = this.(RegExpGroup).getChild(i) + or + result = this.(RegExpQuantifier).getChild(i) + or + result = this.(RegExpSequence).getChild(i) + or + result = this.(RegExpSpecialChar).getChild(i) + or + result = this.(RegExpNamedCharacterProperty).getChild(i) + } + + /** + * Gets the parent term of this regular expression term, or the + * regular expression literal if this is the root term. + */ + RegExpParent getParent() { result.getAChild() = this } + + /** Gets the associated `RegExp`. */ + RegExp getRegExp() { result = re } + + /** Gets the offset at which this term starts. */ + int getStart() { result = start } + + /** Gets the offset at which this term ends. */ + int getEnd() { result = end } + + override string toString() { result = re.getText().substring(start, end) } + + /** + * Gets the location of the surrounding regex, as locations inside the regex do not exist. + * To get location information corresponding to the term inside the regex, + * use `hasLocationInfo`. + */ + Location getLocation() { result = re.getLocation() } + + pragma[noinline] + private predicate componentHasLocationInfo( + int i, string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + re.getComponent(i) + .getLocation() + .hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + } + + /** Holds if this term is found at the specified location offsets. */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + exists(int re_start | + this.componentHasLocationInfo(0, filepath, startline, re_start, _, _) and + this.componentHasLocationInfo(re.getNumberOfComponents() - 1, filepath, _, _, endline, _) and + startcolumn = re_start + start and + endcolumn = re_start + end - 1 + ) + } + + /** Gets the file in which this term is found. */ + File getFile() { result = this.getLocation().getFile() } + + /** Gets the raw source text of this term. */ + string getRawValue() { result = this.toString() } + + /** Gets the string literal in which this term is found. */ + RegExpLiteral getLiteral() { result = TRegExpLiteral(re) } + + /** Gets the regular expression term that is matched (textually) before this one, if any. */ + RegExpTerm getPredecessor() { + exists(RegExpTerm parent | parent = this.getParent() | + result = parent.(RegExpSequence).previousElement(this) + or + not exists(parent.(RegExpSequence).previousElement(this)) and + not parent instanceof RegExpSubPattern and + result = parent.getPredecessor() + ) + } + + /** Gets the regular expression term that is matched (textually) after this one, if any. */ + RegExpTerm getSuccessor() { + exists(RegExpTerm parent | parent = this.getParent() | + result = parent.(RegExpSequence).nextElement(this) + or + not exists(parent.(RegExpSequence).nextElement(this)) and + not parent instanceof RegExpSubPattern and + result = parent.getSuccessor() + ) + } + + /** + * Gets the single string this regular-expression term matches. + * + * This predicate is only defined for (sequences/groups of) constant regular + * expressions. In particular, terms involving zero-width assertions like `^` + * or `\b` are not considered to have a constant value. + * + * Note that this predicate does not take flags of the enclosing + * regular-expression literal into account. + */ + string getConstantValue() { none() } + + /** + * Gets a string that is matched by this regular-expression term. + */ + string getAMatchedString() { result = this.getConstantValue() } + + /** Gets the primary QL class for this term. */ + override string getAPrimaryQlClass() { result = "RegExpTerm" } + + /** Holds if this regular expression term can match the empty string. */ + predicate isNullable() { none() } + } + + /** + * A quantified regular expression term. + * + * Example: + * + * ``` + * ((ECMA|Java)[sS]cript)* + * ``` + */ + class RegExpQuantifier extends RegExpTerm, TRegExpQuantifier { + int part_end; + boolean may_repeat_forever; + + RegExpQuantifier() { + this = TRegExpQuantifier(re, start, end) and + re.qualifiedPart(start, part_end, end, _, may_repeat_forever) + } + + override RegExpTerm getChild(int i) { + i = 0 and + result.getRegExp() = re and + result.getStart() = start and + result.getEnd() = part_end + } + + /** Hols if this term may match an unlimited number of times. */ + predicate mayRepeatForever() { may_repeat_forever = true } + + /** Gets the qualifier for this term. That is e.g "?" for "a?". */ + string getQualifier() { result = re.getText().substring(part_end, end) } + + override string getAPrimaryQlClass() { result = "RegExpQuantifier" } + } + + /** + * A regular expression term that permits unlimited repetitions. + */ + class InfiniteRepetitionQuantifier extends RegExpQuantifier { + InfiniteRepetitionQuantifier() { this.mayRepeatForever() } + + override string getAPrimaryQlClass() { result = "InfiniteRepetitionQuantifier" } + } + + /** + * A star-quantified term. + * + * Example: + * + * ``` + * \w* + * ``` + */ + class RegExpStar extends InfiniteRepetitionQuantifier { + RegExpStar() { this.getQualifier().charAt(0) = "*" } + + override string getAPrimaryQlClass() { result = "RegExpStar" } + + override predicate isNullable() { any() } + } + + /** + * A plus-quantified term. + * + * Example: + * + * ``` + * \w+ + * ``` + */ + class RegExpPlus extends InfiniteRepetitionQuantifier { + RegExpPlus() { this.getQualifier().charAt(0) = "+" } + + override string getAPrimaryQlClass() { result = "RegExpPlus" } + + override predicate isNullable() { this.getAChild().isNullable() } + } + + /** + * An optional term. + * + * Example: + * + * ``` + * ;? + * ``` + */ + class RegExpOpt extends RegExpQuantifier { + RegExpOpt() { this.getQualifier().charAt(0) = "?" } + + override string getAPrimaryQlClass() { result = "RegExpOpt" } + + override predicate isNullable() { any() } + } + + /** + * A range-quantified term + * + * Examples: + * + * ``` + * \w{2,4} + * \w{2,} + * \w{2} + * ``` + */ + class RegExpRange extends RegExpQuantifier { + string upper; + string lower; + + RegExpRange() { re.multiples(part_end, end, lower, upper) } + + override string getAPrimaryQlClass() { result = "RegExpRange" } + + /** Gets the string defining the upper bound of this range, if any. */ + string getUpper() { result = upper } + + /** Gets the string defining the lower bound of this range, if any. */ + string getLower() { result = lower } + + /** + * Gets the upper bound of the range, if any. + * + * If there is no upper bound, any number of repetitions is allowed. + * For a term of the form `r{lo}`, both the lower and the upper bound + * are `lo`. + */ + int getUpperBound() { result = this.getUpper().toInt() } + + /** Gets the lower bound of the range. */ + int getLowerBound() { result = this.getLower().toInt() } + + override predicate isNullable() { this.getAChild().isNullable() or this.getLowerBound() = 0 } + } + + /** + * A sequence term. + * + * Example: + * + * ``` + * (ECMA|Java)Script + * ``` + * + * This is a sequence with the elements `(ECMA|Java)` and `Script`. + */ + class RegExpSequence extends RegExpTerm, TRegExpSequence { + RegExpSequence() { + this = TRegExpSequence(re, start, end) and + exists(seqChild(re, start, end, 1)) // if a sequence does not have more than one element, it should be treated as that element instead. + } + + override RegExpTerm getChild(int i) { result = seqChild(re, start, end, i) } + + /** Gets the element preceding `element` in this sequence. */ + RegExpTerm previousElement(RegExpTerm element) { element = this.nextElement(result) } + + /** Gets the element following `element` in this sequence. */ + RegExpTerm nextElement(RegExpTerm element) { + exists(int i | + element = this.getChild(i) and + result = this.getChild(i + 1) + ) + } + + override string getConstantValue() { result = this.getConstantValue(0) } + + /** + * Gets the single string matched by the `i`th child and all following + * children of this sequence, if any. + */ + private string getConstantValue(int i) { + i = this.getNumChild() and + result = "" + or + result = this.getChild(i).getConstantValue() + this.getConstantValue(i + 1) + } + + override string getAPrimaryQlClass() { result = "RegExpSequence" } + + override predicate isNullable() { + forall(RegExpTerm child | child = this.getAChild() | child.isNullable()) + } + } + + pragma[nomagic] + private int seqChildEnd(RegExp re, int start, int end, int i) { + result = seqChild(re, start, end, i).getEnd() + } + + // moved out so we can use it in the charpred + private RegExpTerm seqChild(RegExp re, int start, int end, int i) { + re.sequence(start, end) and + ( + i = 0 and + result.getRegExp() = re and + result.getStart() = start and + exists(int itemEnd | + re.item(start, itemEnd) and + result.getEnd() = itemEnd + ) + or + i > 0 and + result.getRegExp() = re and + exists(int itemStart | itemStart = seqChildEnd(re, start, end, i - 1) | + result.getStart() = itemStart and + re.item(itemStart, result.getEnd()) + ) + ) + } + + /** + * An alternative term, that is, a term of the form `a|b`. + * + * Example: + * + * ``` + * ECMA|Java + * ``` + */ + class RegExpAlt extends RegExpTerm, TRegExpAlt { + RegExpAlt() { this = TRegExpAlt(re, start, end) } + + override RegExpTerm getChild(int i) { + i = 0 and + result.getRegExp() = re and + result.getStart() = start and + exists(int part_end | + re.alternationOption(start, end, start, part_end) and + result.getEnd() = part_end + ) + or + i > 0 and + result.getRegExp() = re and + exists(int part_start | + part_start = this.getChild(i - 1).getEnd() + 1 // allow for the | + | + result.getStart() = part_start and + re.alternationOption(start, end, part_start, result.getEnd()) + ) + } + + /** Gets an alternative of this term. */ + RegExpTerm getAlternative() { result = this.getAChild() } + + override string getAMatchedString() { result = this.getAlternative().getAMatchedString() } + + override string getAPrimaryQlClass() { result = "RegExpAlt" } + + override predicate isNullable() { this.getAChild().isNullable() } + } + + /** + * A character escape in a regular expression. + * + * Example: + * + * ``` + * \. + * ``` + */ + class RegExpCharEscape = RegExpEscape; + + /** + * An escaped regular expression term, that is, a regular expression + * term starting with a backslash, which is not a backreference. + * + * Example: + * + * ``` + * \. + * \w + * ``` + */ + class RegExpEscape extends RegExpNormalChar { + RegExpEscape() { re.escapedCharacter(start, end) } + + /** + * Gets the name of the escaped; for example, `w` for `\w`. + * TODO: Handle named escapes. + */ + override string getValue() { + not this.isUnicode() and + this.isIdentityEscape() and + result = this.getUnescaped() + or + this.getUnescaped() = "n" and result = "\n" + or + this.getUnescaped() = "r" and result = "\r" + or + this.getUnescaped() = "t" and result = "\t" + or + this.getUnescaped() = "f" and result = 12.toUnicode() + or + this.getUnescaped() = "v" and result = 11.toUnicode() + or + this.isUnicode() and + result = this.getUnicode() + } + + /** Holds if this terms name is given by the part following the escape character. */ + predicate isIdentityEscape() { + not this.getUnescaped() in ["n", "r", "t", "f", "v"] and not this.isUnicode() + } + + override string getAPrimaryQlClass() { result = "RegExpEscape" } + + /** Gets the part of the term following the escape character. That is e.g. "w" if the term is "\w". */ + string getUnescaped() { result = this.getText().suffix(1) } + + /** + * Gets the text for this escape. That is e.g. "\w". + */ + private string getText() { result = re.getText().substring(start, end) } + + /** + * Holds if this is a unicode escape. + */ + private predicate isUnicode() { this.getText().prefix(2) = ["\\u", "\\U"] } + + /** + * Gets the unicode char for this escape. + * E.g. for `\u0061` this returns "a". + */ + private string getUnicode() { + this.isUnicode() and + result = parseHexInt(this.getText().suffix(2)).toUnicode() + } + } + + /** + * A word boundary, that is, a regular expression term of the form `\b`. + */ + class RegExpWordBoundary extends RegExpSpecialChar { + RegExpWordBoundary() { this.getChar() = "\\b" } + + override predicate isNullable() { none() } + } + + /** + * A non-word boundary, that is, a regular expression term of the form `\B`. + */ + class RegExpNonWordBoundary extends RegExpSpecialChar { + RegExpNonWordBoundary() { this.getChar() = "\\B" } + + override string getAPrimaryQlClass() { result = "RegExpNonWordBoundary" } + } + + /** + * A character class escape in a regular expression. + * That is, an escaped character that denotes multiple characters. + * + * Examples: + * + * ``` + * \w + * \S + * ``` + */ + class RegExpCharacterClassEscape extends RegExpEscape { + RegExpCharacterClassEscape() { this.getValue() in ["d", "D", "s", "S", "w", "W", "h", "H"] } + + override RegExpTerm getChild(int i) { none() } + + override string getAPrimaryQlClass() { result = "RegExpCharacterClassEscape" } + + override predicate isNullable() { none() } + } + + /** + * A character class in a regular expression. + * + * Examples: + * + * ```rb + * /[a-fA-F0-9]/ + * /[^abc]/ + * ``` + */ + class RegExpCharacterClass extends RegExpTerm, TRegExpCharacterClass { + RegExpCharacterClass() { this = TRegExpCharacterClass(re, start, end) } + + /** Holds if this character class is inverted, matching the opposite of its content. */ + predicate isInverted() { re.getChar(start + 1) = "^" } + + /** Holds if this character class can match anything. */ + predicate isUniversalClass() { + // [^] + this.isInverted() and not exists(this.getAChild()) + or + // [\w\W] and similar + not this.isInverted() and + exists(string cce1, string cce2 | + cce1 = this.getAChild().(RegExpCharacterClassEscape).getValue() and + cce2 = this.getAChild().(RegExpCharacterClassEscape).getValue() + | + cce1 != cce2 and cce1.toLowerCase() = cce2.toLowerCase() + ) + } + + override RegExpTerm getChild(int i) { + i = 0 and + result.getRegExp() = re and + exists(int itemStart, int itemEnd | + result.getStart() = itemStart and + re.charSetStart(start, itemStart) and + re.charSetChild(start, itemStart, itemEnd) and + result.getEnd() = itemEnd + ) + or + i > 0 and + result.getRegExp() = re and + exists(int itemStart | itemStart = this.getChild(i - 1).getEnd() | + result.getStart() = itemStart and + re.charSetChild(start, itemStart, result.getEnd()) + ) + } + + override string getAMatchedString() { + not this.isInverted() and result = this.getAChild().getAMatchedString() + } + + override string getAPrimaryQlClass() { result = "RegExpCharacterClass" } + + override predicate isNullable() { none() } + } + + /** + * A character range in a character class in a regular expression. + * + * Example: + * + * ``` + * a-z + * ``` + */ + class RegExpCharacterRange extends RegExpTerm, TRegExpCharacterRange { + int lower_end; + int upper_start; + + RegExpCharacterRange() { + this = TRegExpCharacterRange(re, start, end) and + re.charRange(_, start, lower_end, upper_start, end) + } + + /** Holds if this range goes from `lo` to `hi`, in effect is `lo-hi`. */ + predicate isRange(string lo, string hi) { + lo = re.getText().substring(start, lower_end) and + hi = re.getText().substring(upper_start, end) + } + + override RegExpTerm getChild(int i) { + i = 0 and + result.getRegExp() = re and + result.getStart() = start and + result.getEnd() = lower_end + or + i = 1 and + result.getRegExp() = re and + result.getStart() = upper_start and + result.getEnd() = end + } + + override string getAPrimaryQlClass() { result = "RegExpCharacterRange" } + + override predicate isNullable() { none() } + } + + /** + * A normal character in a regular expression, that is, a character + * without special meaning. This includes escaped characters. + * + * Examples: + * ``` + * t + * \t + * ``` + */ + additional class RegExpNormalChar extends RegExpTerm, TRegExpNormalChar { + RegExpNormalChar() { this = TRegExpNormalChar(re, start, end) } + + /** + * Holds if this constant represents a valid Unicode character (as opposed + * to a surrogate code point that does not correspond to a character by itself.) + */ + predicate isCharacter() { any() } + + /** Gets the string representation of the char matched by this term. */ + string getValue() { result = re.getText().substring(start, end) } + + override RegExpTerm getChild(int i) { none() } + + override string getAPrimaryQlClass() { result = "RegExpNormalChar" } + } + + /** + * A constant regular expression term, that is, a regular expression + * term matching a single string. Currently, this will always be a single character. + * + * Example: + * + * ``` + * a + * ``` + */ + class RegExpConstant extends RegExpTerm { + string value; + + RegExpConstant() { + this = TRegExpNormalChar(re, start, end) and + not this instanceof RegExpCharacterClassEscape and + // exclude chars in qualifiers + // TODO: push this into regex library + not exists(int qstart, int qend | re.qualifiedPart(_, qstart, qend, _, _) | + qstart <= start and end <= qend + ) and + value = this.(RegExpNormalChar).getValue() + or + this = TRegExpSpecialChar(re, start, end) and + re.inCharSet(start) and + value = this.(RegExpSpecialChar).getChar() + } + + /** + * Holds if this constant represents a valid Unicode character (as opposed + * to a surrogate code point that does not correspond to a character by itself.) + */ + predicate isCharacter() { any() } + + /** Gets the string matched by this constant term. */ + string getValue() { result = value } + + override RegExpTerm getChild(int i) { none() } + + override string getConstantValue() { result = this.getValue() } + + override string getAPrimaryQlClass() { result = "RegExpConstant" } + + override predicate isNullable() { none() } + } + + /** + * A grouped regular expression. + * + * Examples: + * + * ``` + * (ECMA|Java) + * (?:ECMA|Java) + * (?['"]) + * ``` + */ + class RegExpGroup extends RegExpTerm, TRegExpGroup { + RegExpGroup() { this = TRegExpGroup(re, start, end) } + + /** + * Gets the index of this capture group within the enclosing regular + * expression literal. + * + * For example, in the regular expression `/((a?).)(?:b)/`, the + * group `((a?).)` has index 1, the group `(a?)` nested inside it + * has index 2, and the group `(?:b)` has no index, since it is + * not a capture group. + */ + int getNumber() { result = re.getGroupNumber(start, end) } + + /** Holds if this is a capture group. */ + predicate isCapture() { exists(this.getNumber()) } + + /** Holds if this is a named capture group. */ + predicate isNamed() { exists(this.getName()) } + + /** Gets the name of this capture group, if any. */ + string getName() { result = re.getGroupName(start, end) } + + override RegExpTerm getChild(int i) { + result.getRegExp() = re and + i = 0 and + re.groupContents(start, end, result.getStart(), result.getEnd()) + } + + override string getConstantValue() { result = this.getAChild().getConstantValue() } + + override string getAMatchedString() { result = this.getAChild().getAMatchedString() } + + override string getAPrimaryQlClass() { result = "RegExpGroup" } + + override predicate isNullable() { this.getAChild().isNullable() } + } + + /** + * A special character in a regular expression. + * + * Examples: + * ``` + * ^ + * $ + * . + * ``` + */ + additional class RegExpSpecialChar extends RegExpTerm, TRegExpSpecialChar { + string char; + + RegExpSpecialChar() { + this = TRegExpSpecialChar(re, start, end) and + re.specialCharacter(start, end, char) + } + + /** + * Holds if this constant represents a valid Unicode character (as opposed + * to a surrogate code point that does not correspond to a character by itself.) + */ + predicate isCharacter() { any() } + + /** Gets the char for this term. */ + string getChar() { result = char } + + override RegExpTerm getChild(int i) { none() } + + override string getAPrimaryQlClass() { result = "RegExpSpecialChar" } + } + + /** + * A dot regular expression. + * + * Example: + * + * ``` + * . + * ``` + */ + class RegExpDot extends RegExpSpecialChar { + RegExpDot() { this.getChar() = "." } + + override string getAPrimaryQlClass() { result = "RegExpDot" } + + override predicate isNullable() { none() } + } + + /** + * A term that matches a specific position between characters in the string. + * + * Example: + * + * ``` + * \A + * ``` + */ + class RegExpAnchor extends RegExpSpecialChar { + RegExpAnchor() { this.getChar() = ["^", "$", "\\A", "\\Z", "\\z"] } + + override string getAPrimaryQlClass() { result = "RegExpAnchor" } + } + + /** + * A dollar assertion `$` or `\Z` matching the end of a line. + * + * Example: + * + * ``` + * $ + * ``` + */ + class RegExpDollar extends RegExpAnchor { + RegExpDollar() { this.getChar() = ["$", "\\Z", "\\z"] } + + override string getAPrimaryQlClass() { result = "RegExpDollar" } + + override predicate isNullable() { any() } + } + + /** + * A caret assertion `^` or `\A` matching the beginning of a line. + * + * Example: + * + * ``` + * ^ + * ``` + */ + class RegExpCaret extends RegExpAnchor { + RegExpCaret() { this.getChar() = ["^", "\\A"] } + + override string getAPrimaryQlClass() { result = "RegExpCaret" } + + override predicate isNullable() { any() } + } + + /** + * A zero-width match, that is, either an empty group or an assertion. + * + * Examples: + * ``` + * () + * (?=\w) + * ``` + */ + additional class RegExpZeroWidthMatch extends RegExpGroup { + RegExpZeroWidthMatch() { re.zeroWidthMatch(start, end) } + + override RegExpTerm getChild(int i) { none() } + + override string getAPrimaryQlClass() { result = "RegExpZeroWidthMatch" } + + override predicate isNullable() { any() } + } + + /** + * A zero-width lookahead or lookbehind assertion. + * + * Examples: + * + * ``` + * (?=\w) + * (?!\n) + * (?<=\.) + * (?` + * in a regular expression. + * + * Examples: + * + * ``` + * \1 + * (?P=quote) + * ``` + */ + class RegExpBackRef extends RegExpTerm, TRegExpBackRef { + RegExpBackRef() { this = TRegExpBackRef(re, start, end) } + + /** + * Gets the number of the capture group this back reference refers to, if any. + */ + int getNumber() { result = re.getBackRefNumber(start, end) } + + /** + * Gets the name of the capture group this back reference refers to, if any. + */ + string getName() { result = re.getBackRefName(start, end) } + + /** Gets the capture group this back reference refers to. */ + RegExpGroup getGroup() { + result.getLiteral() = this.getLiteral() and + ( + result.getNumber() = this.getNumber() or + result.getName() = this.getName() + ) + } + + override RegExpTerm getChild(int i) { none() } + + override string getAPrimaryQlClass() { result = "RegExpBackRef" } + + override predicate isNullable() { this.getGroup().isNullable() } + } + + /** + * A named character property. For example, the POSIX bracket expression + * `[[:digit:]]`. + */ + additional class RegExpNamedCharacterProperty extends RegExpTerm, TRegExpNamedCharacterProperty { + RegExpNamedCharacterProperty() { this = TRegExpNamedCharacterProperty(re, start, end) } + + override RegExpTerm getChild(int i) { none() } + + override string getAPrimaryQlClass() { result = "RegExpNamedCharacterProperty" } + + /** + * Gets the property name. For example, in `\p{Space}`, the result is + * `"Space"`. + */ + string getName() { result = re.getCharacterPropertyName(start, end) } + + /** + * Holds if the property is inverted. For example, it holds for `\p{^Digit}`, + * which matches non-digits. + */ + predicate isInverted() { re.namedCharacterPropertyIsInverted(start, end) } + } + + class Top = RegExpParent; + + /** + * Holds if `term` is an escape class representing e.g. `\d`. + * `clazz` is which character class it represents, e.g. "d" for `\d`. + */ + predicate isEscapeClass(RegExpTerm term, string clazz) { + exists(RegExpCharacterClassEscape escape | term = escape | escape.getValue() = clazz) + or + // TODO: expand to cover more properties + exists(RegExpNamedCharacterProperty escape | term = escape | + escape.getName().toLowerCase() = "digit" and + if escape.isInverted() then clazz = "D" else clazz = "d" + or + escape.getName().toLowerCase() = "space" and + if escape.isInverted() then clazz = "S" else clazz = "s" + or + escape.getName().toLowerCase() = "word" and + if escape.isInverted() then clazz = "W" else clazz = "w" + ) + } + + /** + * Holds if the regular expression should not be considered. + */ + predicate isExcluded(RegExpParent parent) { + parent.(RegExpTerm).getRegExp().(Ast::RegExpLiteral).hasFreeSpacingFlag() // exclude free-spacing mode regexes + } + + /** + * Holds if `term` is a possessive quantifier. + * Not currently implemented, but is used by the shared library. + */ + predicate isPossessive(RegExpQuantifier term) { none() } + + /** + * Holds if the regex that `term` is part of is used in a way that ignores any leading prefix of the input it's matched against. + * Not yet implemented for Ruby. + */ + predicate matchesAnyPrefix(RegExpTerm term) { any() } + + /** + * Holds if the regex that `term` is part of is used in a way that ignores any trailing suffix of the input it's matched against. + * Not yet implemented for Ruby. + */ + predicate matchesAnySuffix(RegExpTerm term) { any() } + + /** + * Holds if `root` has the `i` flag for case-insensitive matching. + */ + predicate isIgnoreCase(RegExpTerm root) { + root.isRootTerm() and + root.getLiteral().isIgnoreCase() + } + + /** + * Holds if `root` has the `s` flag for multi-line matching. + */ + predicate isDotAll(RegExpTerm root) { + root.isRootTerm() and + root.getLiteral().isDotAll() + } +} diff --git a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll new file mode 100644 index 000000000000..d35d9353bf13 --- /dev/null +++ b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll @@ -0,0 +1,1037 @@ +/** + * Library for parsing for Ruby regular expressions. + * + * N.B. does not yet handle stripping whitespace and comments in regexes with + * the `x` (free-spacing) flag. + */ + +private import codeql.ruby.AST as Ast +private import codeql.Locations + +/** + * A `StringlikeLiteral` containing a regular expression term, that is, either + * a regular expression literal, or a string literal used in a context where + * it is parsed as regular expression. + */ +abstract class RegExp extends Ast::StringlikeLiteral { + /** + * Holds if this `RegExp` has the `s` flag for multi-line matching. + */ + predicate isDotAll() { none() } + + /** + * Holds if this `RegExp` has the `i` flag for case-insensitive matching. + */ + predicate isIgnoreCase() { none() } + + /** + * Gets the flags for this `RegExp`, or the empty string if it has no flags. + */ + string getFlags() { result = "" } + + /** + * Helper predicate for `charSetStart(int start, int end)`. + * + * In order to identify left brackets ('[') which actually start a character class, + * we perform a left to right scan of the string. + * + * To avoid negative recursion we return a boolean. See `escaping`, + * the helper for `escapingChar`, for a clean use of this pattern. + * + * result is true for those start chars that actually mark a start of a char set. + */ + boolean charSetStart(int pos) { + exists(int index | + // is opening bracket + this.charSetDelimiter(index, pos) = true and + ( + // if this is the first bracket, `pos` starts a char set + index = 1 and result = true + or + // if the previous char set delimiter was not a closing bracket, `pos` does + // not start a char set. This is needed to handle cases such as `[[]` (a + // char set that matches the `[` char) + index > 1 and + not this.charSetDelimiter(index - 1, _) = false and + result = false + or + // special handling of cases such as `[][]` (the character-set of the characters `]` and `[`). + exists(int prevClosingBracketPos | + // previous bracket is a closing bracket + this.charSetDelimiter(index - 1, prevClosingBracketPos) = false and + if + // check if the character that comes before the previous closing bracket + // is an opening bracket (taking `^` into account) + // check if the character that comes before the previous closing bracket + // is an opening bracket (taking `^` into account) + exists(int posBeforePrevClosingBracket | + if this.getChar(prevClosingBracketPos - 1) = "^" + then posBeforePrevClosingBracket = prevClosingBracketPos - 2 + else posBeforePrevClosingBracket = prevClosingBracketPos - 1 + | + this.charSetDelimiter(index - 2, posBeforePrevClosingBracket) = true + ) + then + // brackets without anything in between is not valid character ranges, so + // the first closing bracket in `[]]` and `[^]]` does not count, + // + // and we should _not_ mark the second opening bracket in `[][]` and `[^][]` + // as starting a new char set. ^ ^ + exists(int posBeforePrevClosingBracket | + this.charSetDelimiter(index - 2, posBeforePrevClosingBracket) = true + | + result = this.charSetStart(posBeforePrevClosingBracket).booleanNot() + ) + else + // if not, `pos` does in fact mark a real start of a character range + result = true + ) + ) + ) + } + + /** + * Helper predicate for chars that could be character-set delimiters. + * Holds if the (non-escaped) char at `pos` in the string, is the (one-based) `index` occurrence of a bracket (`[` or `]`) in the string. + * Result if `true` is the char is `[`, and `false` if the char is `]`. + */ + boolean charSetDelimiter(int index, int pos) { + pos = + rank[index](int p | + (this.nonEscapedCharAt(p) = "[" or this.nonEscapedCharAt(p) = "]") and + // Brackets that art part of POSIX expressions should not count as + // char-set delimiters. + not exists(int x, int y | + this.posixStyleNamedCharacterProperty(x, y, _) and pos >= x and pos < y + ) + ) and + ( + this.nonEscapedCharAt(pos) = "[" and result = true + or + this.nonEscapedCharAt(pos) = "]" and result = false + ) + } + + /** Holds if a character set starts between `start` and `end`. */ + predicate charSetStart(int start, int end) { + this.charSetStart(start) = true and + ( + this.getChar(start + 1) = "^" and end = start + 2 + or + not this.getChar(start + 1) = "^" and end = start + 1 + ) + } + + /** Whether there is a character class, between start (inclusive) and end (exclusive) */ + predicate charSet(int start, int end) { + exists(int innerStart, int innerEnd | + this.charSetStart(start, innerStart) and + not this.charSetStart(_, start) + | + end = innerEnd + 1 and + innerEnd = + min(int e | + e > innerStart and + this.nonEscapedCharAt(e) = "]" and + not exists(int x, int y | + this.posixStyleNamedCharacterProperty(x, y, _) and e >= x and e < y + ) + | + e + ) + ) + } + + /** + * Holds if the character set starting at `charsetStart` contains either + * a character or a `-` found between `start` and `end`. + */ + private predicate charSetToken(int charsetStart, int index, int tokenStart, int tokenEnd) { + tokenStart = + rank[index](int start, int end | this.charSetToken(charsetStart, start, end) | start) and + this.charSetToken(charsetStart, tokenStart, tokenEnd) + } + + /** + * Holds if the character set starting at `charsetStart` contains either + * a character or a `-` found between `start` and `end`. + */ + private predicate charSetToken(int charsetStart, int start, int end) { + this.charSetStart(charsetStart, start) and + ( + this.escapedCharacter(start, end) + or + this.namedCharacterProperty(start, end, _) + or + exists(this.nonEscapedCharAt(start)) and end = start + 1 + ) + or + this.charSetToken(charsetStart, _, start) and + ( + this.escapedCharacter(start, end) + or + this.namedCharacterProperty(start, end, _) + or + exists(this.nonEscapedCharAt(start)) and + end = start + 1 and + not this.getChar(start) = "]" + ) + } + + /** + * Holds if the character set starting at `charsetStart` contains either + * a character or a range found between `start` and `end`. + */ + predicate charSetChild(int charsetStart, int start, int end) { + this.charSetToken(charsetStart, start, end) and + not exists(int rangeStart, int rangeEnd | + this.charRange(charsetStart, rangeStart, _, _, rangeEnd) and + rangeStart <= start and + rangeEnd >= end + ) + or + this.charRange(charsetStart, start, _, _, end) + } + + /** + * Holds if the character set starting at `charsetStart` contains a character range + * with lower bound found between `start` and `lowerEnd` + * and upper bound found between `upperStart` and `end`. + */ + predicate charRange(int charsetStart, int start, int lowerEnd, int upperStart, int end) { + exists(int index | + this.charRangeEnd(charsetStart, index) = true and + this.charSetToken(charsetStart, index - 2, start, lowerEnd) and + this.charSetToken(charsetStart, index, upperStart, end) + ) + } + + /** + * Helper predicate for `charRange`. + * We can determine where character ranges end by a left to right sweep. + * + * To avoid negative recursion we return a boolean. See `escaping`, + * the helper for `escapingChar`, for a clean use of this pattern. + */ + private boolean charRangeEnd(int charsetStart, int index) { + this.charSetToken(charsetStart, index, _, _) and + ( + index in [1, 2] and result = false + or + index > 2 and + exists(int connectorStart | + this.charSetToken(charsetStart, index - 1, connectorStart, _) and + this.nonEscapedCharAt(connectorStart) = "-" and + result = + this.charRangeEnd(charsetStart, index - 2) + .booleanNot() + .booleanAnd(this.charRangeEnd(charsetStart, index - 1).booleanNot()) + ) + or + not exists(int connectorStart | + this.charSetToken(charsetStart, index - 1, connectorStart, _) and + this.nonEscapedCharAt(connectorStart) = "-" + ) and + result = false + ) + } + + /** Holds if the character at `pos` is a "\" that is actually escaping what comes after. */ + predicate escapingChar(int pos) { this.escaping(pos) = true } + + /** + * Helper predicate for `escapingChar`. + * In order to avoid negative recursion, we return a boolean. + * This way, we can refer to `escaping(pos - 1).booleanNot()` + * rather than to a negated version of `escaping(pos)`. + */ + private boolean escaping(int pos) { + pos = -1 and result = false + or + this.getChar(pos) = "\\" and result = this.escaping(pos - 1).booleanNot() + or + this.getChar(pos) != "\\" and result = false + } + + /** Gets the text of this regex */ + string getText() { + exists(Ast::ConstantValue c | c = this.getConstantValue() | + result = [this.getConstantValue().getString(), this.getConstantValue().getRegExp()] + ) + } + + /** Gets the `i`th character of this regex */ + string getChar(int i) { result = this.getText().charAt(i) } + + /** Gets the `i`th character of this regex, unless it is part of a character escape sequence. */ + string nonEscapedCharAt(int i) { + result = this.getText().charAt(i) and + not exists(int x, int y | this.escapedCharacter(x, y) and i in [x .. y - 1]) + } + + private predicate isOptionDivider(int i) { this.nonEscapedCharAt(i) = "|" } + + private predicate isGroupEnd(int i) { this.nonEscapedCharAt(i) = ")" and not this.inCharSet(i) } + + private predicate isGroupStart(int i) { this.nonEscapedCharAt(i) = "(" and not this.inCharSet(i) } + + /** + * Holds if the `i`th character could not be parsed. + */ + predicate failedToParse(int i) { + exists(this.getChar(i)) and + not exists(int start, int end | + this.topLevel(start, end) and + start <= i and + end > i + ) + } + + /** Matches named character properties such as `\p{Word}` and `[[:digit:]]` */ + predicate namedCharacterProperty(int start, int end, string name) { + this.pStyleNamedCharacterProperty(start, end, name) or + this.posixStyleNamedCharacterProperty(start, end, name) + } + + /** Gets the name of the character property in start,end */ + string getCharacterPropertyName(int start, int end) { + this.namedCharacterProperty(start, end, result) + } + + /** Matches a POSIX bracket expression such as `[:alnum:]` within a character class. */ + private predicate posixStyleNamedCharacterProperty(int start, int end, string name) { + this.getChar(start) = "[" and + this.getChar(start + 1) = ":" and + end = + min(int e | + e > start and + this.getChar(e - 2) = ":" and + this.getChar(e - 1) = "]" + | + e + ) and + exists(int nameStart | + this.getChar(start + 2) = "^" and nameStart = start + 3 + or + not this.getChar(start + 2) = "^" and nameStart = start + 2 + | + name = this.getText().substring(nameStart, end - 2) + ) + } + + /** + * Matches named character properties. For example: + * - `\p{Space}` + * - `\P{Digit}` upper-case P means inverted + * - `\p{^Word}` caret also means inverted + * + * These can occur both inside and outside of character classes. + */ + private predicate pStyleNamedCharacterProperty(int start, int end, string name) { + this.escapingChar(start) and + this.getChar(start + 1) in ["p", "P"] and + this.getChar(start + 2) = "{" and + this.getChar(end - 1) = "}" and + end > start and + not exists(int i | start + 2 < i and i < end - 1 | this.getChar(i) = "}") and + exists(int nameStart | + this.getChar(start + 3) = "^" and nameStart = start + 4 + or + not this.getChar(start + 3) = "^" and nameStart = start + 3 + | + name = this.getText().substring(nameStart, end - 1) + ) + } + + /** + * Holds if the named character property is inverted. Examples for which it holds: + * - `\P{Digit}` upper-case P means inverted + * - `\p{^Word}` caret also means inverted + * - `[[:^digit:]]` + * + * Examples for which it doesn't hold: + * - `\p{Word}` + * - `\P{^Space}` - upper-case P and caret cancel each other out + * - `[[:alnum:]]` + */ + predicate namedCharacterPropertyIsInverted(int start, int end) { + this.pStyleNamedCharacterProperty(start, end, _) and + exists(boolean upperP, boolean caret | + (if this.getChar(start + 1) = "P" then upperP = true else upperP = false) and + (if this.getChar(start + 3) = "^" then caret = true else caret = false) + | + upperP.booleanXor(caret) = true + ) + or + this.posixStyleNamedCharacterProperty(start, end, _) and + this.getChar(start + 3) = "^" + } + + /** + * Holds if an escaped character is found between `start` and `end`. + * Escaped characters include hex values, octal values and named escapes, + * but excludes backreferences. + */ + predicate escapedCharacter(int start, int end) { + this.escapingChar(start) and + not this.numberedBackreference(start, _, _) and + not this.namedBackreference(start, _, _) and + not this.pStyleNamedCharacterProperty(start, _, _) and + ( + // hex char \xhh + this.getChar(start + 1) = "x" and end = start + 4 + or + // wide hex char \uhhhh + this.getChar(start + 1) = "u" and end = start + 6 + or + // escape not handled above; update when adding a new case + not this.getChar(start + 1) in ["x", "u"] and + not exists(this.getChar(start + 1).toInt()) and + end = start + 2 + ) + } + + /** + * Holds if the character at `index` is inside a character set. + */ + predicate inCharSet(int index) { + exists(int x, int y | this.charSet(x, y) and index in [x + 1 .. y - 2]) + } + + /** + * Holds if the character at `index` is inside a posix bracket. + */ + predicate inPosixBracket(int index) { + exists(int x, int y | + this.posixStyleNamedCharacterProperty(x, y, _) and index in [x + 1 .. y - 2] + ) + } + + /** + * 'simple' characters are any that don't alter the parsing of the regex. + */ + private predicate simpleCharacter(int start, int end) { + end = start + 1 and + not this.charSet(start, _) and + not this.charSet(_, start + 1) and + not exists(int x, int y | + this.posixStyleNamedCharacterProperty(x, y, _) and + start >= x and + end <= y + ) and + exists(string c | c = this.getChar(start) | + exists(int x, int y, int z | + this.charSet(x, z) and + this.charSetStart(x, y) + | + start = y + or + start = z - 2 + or + start > y and start < z - 2 and not this.charRange(_, _, start, end, _) + ) + or + not this.inCharSet(start) and + not c = "(" and + not c = "[" and + not c = ")" and + not c = "|" and + not this.qualifier(start, _, _, _) + ) + } + + /** + * Holds if a simple or escaped character is found between `start` and `end`. + */ + predicate character(int start, int end) { + ( + this.simpleCharacter(start, end) and + not exists(int x, int y | this.escapedCharacter(x, y) and x <= start and y >= end) + or + this.escapedCharacter(start, end) + ) and + not exists(int x, int y | this.groupStart(x, y) and x <= start and y >= end) and + not exists(int x, int y | this.backreference(x, y) and x <= start and y >= end) and + not exists(int x, int y | + this.pStyleNamedCharacterProperty(x, y, _) and x <= start and y >= end + ) and + not exists(int x, int y | this.multiples(x, y, _, _) and x <= start and y >= end) + } + + /** + * Holds if a normal character is found between `start` and `end`. + */ + predicate normalCharacter(int start, int end) { + end = start + 1 and + this.character(start, end) and + not this.specialCharacter(start, end, _) + } + + /** + * Holds if a special character is found between `start` and `end`. + */ + predicate specialCharacter(int start, int end, string char) { + this.character(start, end) and + not this.inCharSet(start) and + ( + end = start + 1 and + char = this.getChar(start) and + (char = "$" or char = "^" or char = ".") + or + end = start + 2 and + this.escapingChar(start) and + char = this.getText().substring(start, end) and + char = ["\\A", "\\Z", "\\z", "\\G", "\\b", "\\B"] + ) + } + + /** + * Holds if the range [start:end) consists of only 'normal' characters. + */ + predicate normalCharacterSequence(int start, int end) { + // a normal character inside a character set is interpreted on its own + this.normalCharacter(start, end) and + this.inCharSet(start) + or + // a maximal run of normal characters is considered as one constant + exists(int s, int e | + e = max(int i | this.normalCharacterRun(s, i)) and + not this.inCharSet(s) + | + // 'abc' can be considered one constant, but + // 'abc+' has to be broken up into 'ab' and 'c+', + // as the qualifier only applies to 'c'. + if this.qualifier(e, _, _, _) + then + end = e and start = e - 1 + or + end = e - 1 and start = s and start < end + else ( + end = e and + start = s + ) + ) + } + + private predicate normalCharacterRun(int start, int end) { + ( + this.normalCharacterRun(start, end - 1) + or + start = end - 1 and not this.normalCharacter(start - 1, start) + ) and + this.normalCharacter(end - 1, end) + } + + private predicate characterItem(int start, int end) { + this.normalCharacterSequence(start, end) or + this.escapedCharacter(start, end) or + this.specialCharacter(start, end, _) + } + + /** Whether the text in the range `start,end` is a group */ + predicate group(int start, int end) { + this.groupContents(start, end, _, _) + or + this.emptyGroup(start, end) + } + + /** Gets the number of the group in start,end */ + int getGroupNumber(int start, int end) { + this.group(start, end) and + not this.nonCapturingGroupStart(start, _) and + result = + count(int i | this.group(i, _) and i < start and not this.nonCapturingGroupStart(i, _)) + 1 + } + + /** Gets the name, if it has one, of the group in start,end */ + string getGroupName(int start, int end) { + this.group(start, end) and + exists(int nameEnd | + this.namedGroupStart(start, nameEnd) and + result = this.getText().substring(start + 3, nameEnd - 1) + ) + } + + /** Whether the text in the range start, end is a group and can match the empty string. */ + predicate zeroWidthMatch(int start, int end) { + this.emptyGroup(start, end) + or + this.negativeAssertionGroup(start, end) + or + this.positiveLookaheadAssertionGroup(start, end) + or + this.positiveLookbehindAssertionGroup(start, end) + } + + /** Holds if an empty group is found between `start` and `end`. */ + predicate emptyGroup(int start, int end) { + exists(int endm1 | end = endm1 + 1 | + this.groupStart(start, endm1) and + this.isGroupEnd(endm1) + ) + } + + private predicate emptyMatchAtStartGroup(int start, int end) { + this.emptyGroup(start, end) + or + this.negativeAssertionGroup(start, end) + or + this.positiveLookaheadAssertionGroup(start, end) + } + + private predicate emptyMatchAtEndGroup(int start, int end) { + this.emptyGroup(start, end) + or + this.negativeAssertionGroup(start, end) + or + this.positiveLookbehindAssertionGroup(start, end) + } + + private predicate negativeAssertionGroup(int start, int end) { + exists(int inStart | + this.negativeLookaheadAssertionStart(start, inStart) + or + this.negativeLookbehindAssertionStart(start, inStart) + | + this.groupContents(start, end, inStart, _) + ) + } + + /** Holds if a negative lookahead is found between `start` and `end` */ + predicate negativeLookaheadAssertionGroup(int start, int end) { + exists(int inStart | this.negativeLookaheadAssertionStart(start, inStart) | + this.groupContents(start, end, inStart, _) + ) + } + + /** Holds if a negative lookbehind is found between `start` and `end` */ + predicate negativeLookbehindAssertionGroup(int start, int end) { + exists(int inStart | this.negativeLookbehindAssertionStart(start, inStart) | + this.groupContents(start, end, inStart, _) + ) + } + + /** Holds if a positive lookahead is found between `start` and `end` */ + predicate positiveLookaheadAssertionGroup(int start, int end) { + exists(int inStart | this.lookaheadAssertionStart(start, inStart) | + this.groupContents(start, end, inStart, _) + ) + } + + /** Holds if a positive lookbehind is found between `start` and `end` */ + predicate positiveLookbehindAssertionGroup(int start, int end) { + exists(int inStart | this.lookbehindAssertionStart(start, inStart) | + this.groupContents(start, end, inStart, _) + ) + } + + private predicate groupStart(int start, int end) { + this.nonCapturingGroupStart(start, end) + or + this.namedGroupStart(start, end) + or + this.lookaheadAssertionStart(start, end) + or + this.negativeLookaheadAssertionStart(start, end) + or + this.lookbehindAssertionStart(start, end) + or + this.negativeLookbehindAssertionStart(start, end) + or + this.commentGroupStart(start, end) + or + this.simpleGroupStart(start, end) + } + + /** Matches the start of a non-capturing group, e.g. `(?:` */ + private predicate nonCapturingGroupStart(int start, int end) { + this.isGroupStart(start) and + this.getChar(start + 1) = "?" and + this.getChar(start + 2) = [":", "=", "<", "!", "#"] and + end = start + 3 + } + + /** Matches the start of a simple group, e.g. `(a+)`. */ + private predicate simpleGroupStart(int start, int end) { + this.isGroupStart(start) and + this.getChar(start + 1) != "?" and + end = start + 1 + } + + /** + * Matches the start of a named group, such as: + * - `(?\w+)` + * - `(?'name'\w+)` + */ + private predicate namedGroupStart(int start, int end) { + this.isGroupStart(start) and + this.getChar(start + 1) = "?" and + ( + this.getChar(start + 2) = "<" and + not this.getChar(start + 3) = "=" and // (?<=foo) is a positive lookbehind assertion + not this.getChar(start + 3) = "!" and // (? start + 3 and this.getChar(i) = ">") and + end = nameEnd + 1 + ) + or + this.getChar(start + 2) = "'" and + exists(int nameEnd | + nameEnd = min(int i | i > start + 2 and this.getChar(i) = "'") and end = nameEnd + 1 + ) + ) + } + + /** Matches the start of a positive lookahead assertion, i.e. `(?=`. */ + private predicate lookaheadAssertionStart(int start, int end) { + this.isGroupStart(start) and + this.getChar(start + 1) = "?" and + this.getChar(start + 2) = "=" and + end = start + 3 + } + + /** Matches the start of a negative lookahead assertion, i.e. `(?!`. */ + private predicate negativeLookaheadAssertionStart(int start, int end) { + this.isGroupStart(start) and + this.getChar(start + 1) = "?" and + this.getChar(start + 2) = "!" and + end = start + 3 + } + + /** Matches the start of a positive lookbehind assertion, i.e. `(?<=`. */ + private predicate lookbehindAssertionStart(int start, int end) { + this.isGroupStart(start) and + this.getChar(start + 1) = "?" and + this.getChar(start + 2) = "<" and + this.getChar(start + 3) = "=" and + end = start + 4 + } + + /** Matches the start of a negative lookbehind assertion, i.e. `(?`. */ + predicate namedBackreference(int start, int end, string name) { + this.escapingChar(start) and + this.getChar(start + 1) = "k" and + this.getChar(start + 2) = "<" and + exists(int nameEnd | nameEnd = min(int i | i > start + 3 and this.getChar(i) = ">") | + end = nameEnd + 1 and + name = this.getText().substring(start + 3, nameEnd) + ) + } + + /** Matches a numbered backreference, e.g. `\1`. */ + predicate numberedBackreference(int start, int end, int value) { + this.escapingChar(start) and + not this.getChar(start + 1) = "0" and + exists(string text, string svalue, int len | + end = start + len and + text = this.getText() and + len in [2 .. 3] + | + svalue = text.substring(start + 1, start + len) and + value = svalue.toInt() and + not exists(text.substring(start + 1, start + len + 1).toInt()) and + value > 0 + ) + } + + /** Whether the text in the range `start,end` is a back reference */ + predicate backreference(int start, int end) { + this.numberedBackreference(start, end, _) + or + this.namedBackreference(start, end, _) + } + + /** Gets the number of the back reference in start,end */ + int getBackRefNumber(int start, int end) { this.numberedBackreference(start, end, result) } + + /** Gets the name, if it has one, of the back reference in start,end */ + string getBackRefName(int start, int end) { this.namedBackreference(start, end, result) } + + private predicate baseItem(int start, int end) { + this.characterItem(start, end) and + not exists(int x, int y | this.charSet(x, y) and x <= start and y >= end) + or + this.group(start, end) + or + this.charSet(start, end) + or + this.backreference(start, end) + or + this.pStyleNamedCharacterProperty(start, end, _) + } + + private predicate qualifier(int start, int end, boolean maybeEmpty, boolean mayRepeatForever) { + this.shortQualifier(start, end, maybeEmpty, mayRepeatForever) and + not this.getChar(end) = "?" + or + exists(int shortEnd | this.shortQualifier(start, shortEnd, maybeEmpty, mayRepeatForever) | + if this.getChar(shortEnd) = "?" then end = shortEnd + 1 else end = shortEnd + ) + } + + private predicate shortQualifier(int start, int end, boolean maybeEmpty, boolean mayRepeatForever) { + ( + this.getChar(start) = "+" and maybeEmpty = false and mayRepeatForever = true + or + this.getChar(start) = "*" and maybeEmpty = true and mayRepeatForever = true + or + this.getChar(start) = "?" and maybeEmpty = true and mayRepeatForever = false + ) and + end = start + 1 + or + exists(string lower, string upper | + this.multiples(start, end, lower, upper) and + (if lower = "" or lower.toInt() = 0 then maybeEmpty = true else maybeEmpty = false) and + if upper = "" then mayRepeatForever = true else mayRepeatForever = false + ) + } + + /** + * Holds if a repetition quantifier is found between `start` and `end`, + * with the given lower and upper bounds. If a bound is omitted, the corresponding + * string is empty. + */ + predicate multiples(int start, int end, string lower, string upper) { + exists(string text, string match, string inner | + text = this.getText() and + end = start + match.length() and + inner = match.substring(1, match.length() - 1) + | + match = text.regexpFind("\\{[0-9]+\\}", _, start) and + lower = inner and + upper = lower + or + match = text.regexpFind("\\{[0-9]*,[0-9]*\\}", _, start) and + exists(int commaIndex | + commaIndex = inner.indexOf(",") and + lower = inner.prefix(commaIndex) and + upper = inner.suffix(commaIndex + 1) + ) + ) + } + + /** + * Whether the text in the range start,end is a qualified item, where item is a character, + * a character set or a group. + */ + predicate qualifiedItem(int start, int end, boolean maybeEmpty, boolean mayRepeatForever) { + this.qualifiedPart(start, _, end, maybeEmpty, mayRepeatForever) + } + + /** + * Holds if a qualified part is found between `start` and `partEnd` and the qualifier is + * found between `partEnd` and `end`. + * + * `maybeEmpty` is true if the part is optional. + * `mayRepeatForever` is true if the part may be repeated unboundedly. + */ + predicate qualifiedPart( + int start, int partEnd, int end, boolean maybeEmpty, boolean mayRepeatForever + ) { + this.baseItem(start, partEnd) and + this.qualifier(partEnd, end, maybeEmpty, mayRepeatForever) + } + + /** Holds if the range `start`, `end` contains a character, a quantifier, a character set or a group. */ + predicate item(int start, int end) { + this.qualifiedItem(start, end, _, _) + or + this.baseItem(start, end) and not this.qualifier(end, _, _, _) + } + + private predicate subsequence(int start, int end) { + ( + start = 0 or + this.groupStart(_, start) or + this.isOptionDivider(start - 1) + ) and + this.item(start, end) + or + exists(int mid | + this.subsequence(start, mid) and + this.item(mid, end) + ) + } + + /** + * Whether the text in the range start,end is a sequence of 1 or more items, where an item is a character, + * a character set or a group. + */ + predicate sequence(int start, int end) { + this.sequenceOrQualified(start, end) and + not this.qualifiedItem(start, end, _, _) + } + + private predicate sequenceOrQualified(int start, int end) { + this.subsequence(start, end) and + not this.itemStart(end) + } + + private predicate itemStart(int start) { + this.characterItem(start, _) or + this.isGroupStart(start) or + this.charSet(start, _) or + this.backreference(start, _) or + this.namedCharacterProperty(start, _, _) + } + + private predicate itemEnd(int end) { + this.characterItem(_, end) + or + exists(int endm1 | this.isGroupEnd(endm1) and end = endm1 + 1) + or + this.charSet(_, end) + or + this.qualifier(_, end, _, _) + } + + private predicate topLevel(int start, int end) { + this.subalternation(start, end, _) and + not this.isOptionDivider(end) + } + + private predicate subalternation(int start, int end, int itemStart) { + this.sequenceOrQualified(start, end) and + not this.isOptionDivider(start - 1) and + itemStart = start + or + start = end and + not this.itemEnd(start) and + this.isOptionDivider(end) and + itemStart = start + or + exists(int mid | + this.subalternation(start, mid, _) and + this.isOptionDivider(mid) and + itemStart = mid + 1 + | + this.sequenceOrQualified(itemStart, end) + or + not this.itemStart(end) and end = itemStart + ) + } + + /** + * Whether the text in the range start,end is an alternation + */ + predicate alternation(int start, int end) { + not this.inCharSet(start) and + this.topLevel(start, end) and + exists(int less | this.subalternation(start, less, _) and less < end) + } + + /** + * Whether the text in the range start,end is an alternation and the text in partStart, partEnd is one of the + * options in that alternation. + */ + predicate alternationOption(int start, int end, int partStart, int partEnd) { + this.alternation(start, end) and + this.subalternation(start, partEnd, partStart) + } + + /** A part of the regex that may match the start of the string. */ + private predicate firstPart(int start, int end) { + start = 0 and end = this.getText().length() + or + exists(int x | this.firstPart(x, end) | + this.emptyMatchAtStartGroup(x, start) + or + this.qualifiedItem(x, start, true, _) + or + // ^ and \A match the start of the string + this.specialCharacter(x, start, ["^", "\\A"]) + ) + or + exists(int y | this.firstPart(start, y) | + this.item(start, end) + or + this.qualifiedPart(start, end, y, _, _) + ) + or + exists(int x, int y | this.firstPart(x, y) | + this.groupContents(x, y, start, end) + or + this.alternationOption(x, y, start, end) + ) + } + + /** A part of the regex that may match the end of the string. */ + private predicate lastPart(int start, int end) { + start = 0 and end = this.getText().length() + or + exists(int y | this.lastPart(start, y) | + this.emptyMatchAtEndGroup(end, y) + or + this.qualifiedItem(end, y, true, _) + or + // $, \Z, and \z match the end of the string. + this.specialCharacter(end, y, ["$", "\\Z", "\\z"]) + ) + or + this.lastPart(_, end) and + this.item(start, end) + or + exists(int y | this.lastPart(start, y) | this.qualifiedPart(start, end, y, _, _)) + or + exists(int x, int y | this.lastPart(x, y) | + this.groupContents(x, y, start, end) + or + this.alternationOption(x, y, start, end) + ) + } + + /** + * Whether the item at [start, end) is one of the first items + * to be matched. + */ + predicate firstItem(int start, int end) { + ( + this.characterItem(start, end) + or + this.qualifiedItem(start, end, _, _) + or + this.charSet(start, end) + ) and + this.firstPart(start, end) + } + + /** + * Whether the item at [start, end) is one of the last items + * to be matched. + */ + predicate lastItem(int start, int end) { + ( + this.characterItem(start, end) + or + this.qualifiedItem(start, end, _, _) + or + this.charSet(start, end) + ) and + this.lastPart(start, end) + } +} diff --git a/cpp/ql/test/library-tests/regex/parse.expected b/cpp/ql/test/library-tests/regex/parse.expected new file mode 100644 index 000000000000..3df78cdb4fbf --- /dev/null +++ b/cpp/ql/test/library-tests/regex/parse.expected @@ -0,0 +1,489 @@ +regexp.rb: +# 5| [RegExpConstant, RegExpNormalChar] abc + +# 8| [RegExpConstant, RegExpNormalChar] a + +# 8| [RegExpStar] a* +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a + +# 8| [RegExpSequence] a*b+c?d +#-----| 0 -> [RegExpStar] a* +#-----| 1 -> [RegExpPlus] b+ +#-----| 2 -> [RegExpOpt] c? +#-----| 3 -> [RegExpConstant, RegExpNormalChar] d + +# 8| [RegExpConstant, RegExpNormalChar] b + +# 8| [RegExpPlus] b+ +#-----| 0 -> [RegExpConstant, RegExpNormalChar] b + +# 8| [RegExpConstant, RegExpNormalChar] c + +# 8| [RegExpOpt] c? +#-----| 0 -> [RegExpConstant, RegExpNormalChar] c + +# 8| [RegExpConstant, RegExpNormalChar] d + +# 9| [RegExpConstant, RegExpNormalChar] a + +# 9| [RegExpRange] a{4,8} +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a + +# 10| [RegExpConstant, RegExpNormalChar] a + +# 10| [RegExpRange] a{,8} +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a + +# 11| [RegExpConstant, RegExpNormalChar] a + +# 11| [InfiniteRepetitionQuantifier, RegExpRange] a{3,} +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a + +# 12| [RegExpConstant, RegExpNormalChar] a + +# 12| [RegExpRange] a{7} +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a + +# 15| [RegExpConstant, RegExpNormalChar] foo + +# 15| [RegExpAlt] foo|bar +#-----| 0 -> [RegExpConstant, RegExpNormalChar] foo +#-----| 1 -> [RegExpConstant, RegExpNormalChar] bar + +# 15| [RegExpConstant, RegExpNormalChar] bar + +# 18| [RegExpCharacterClass] [abc] +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpNormalChar] b +#-----| 2 -> [RegExpConstant, RegExpNormalChar] c + +# 18| [RegExpConstant, RegExpNormalChar] a + +# 18| [RegExpConstant, RegExpNormalChar] b + +# 18| [RegExpConstant, RegExpNormalChar] c + +# 19| [RegExpCharacterClass] [a-fA-F0-9_] +#-----| 0 -> [RegExpCharacterRange] a-f +#-----| 1 -> [RegExpCharacterRange] A-F +#-----| 2 -> [RegExpCharacterRange] 0-9 +#-----| 3 -> [RegExpConstant, RegExpNormalChar] _ + +# 19| [RegExpConstant, RegExpNormalChar] a + +# 19| [RegExpCharacterRange] a-f +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpNormalChar] f + +# 19| [RegExpConstant, RegExpNormalChar] f + +# 19| [RegExpConstant, RegExpNormalChar] A + +# 19| [RegExpCharacterRange] A-F +#-----| 0 -> [RegExpConstant, RegExpNormalChar] A +#-----| 1 -> [RegExpConstant, RegExpNormalChar] F + +# 19| [RegExpConstant, RegExpNormalChar] F + +# 19| [RegExpConstant, RegExpNormalChar] 0 + +# 19| [RegExpCharacterRange] 0-9 +#-----| 0 -> [RegExpConstant, RegExpNormalChar] 0 +#-----| 1 -> [RegExpConstant, RegExpNormalChar] 9 + +# 19| [RegExpConstant, RegExpNormalChar] 9 + +# 19| [RegExpConstant, RegExpNormalChar] _ + +# 20| [RegExpCaret] \A + +# 20| [RegExpSequence] \A[+-]?\d+ +#-----| 0 -> [RegExpCaret] \A +#-----| 1 -> [RegExpOpt] [+-]? +#-----| 2 -> [RegExpPlus] \d+ + +# 20| [RegExpCharacterClass] [+-] +#-----| 0 -> [RegExpConstant, RegExpNormalChar] + +#-----| 1 -> [RegExpConstant, RegExpNormalChar] - + +# 20| [RegExpOpt] [+-]? +#-----| 0 -> [RegExpCharacterClass] [+-] + +# 20| [RegExpConstant, RegExpNormalChar] + + +# 20| [RegExpConstant, RegExpNormalChar] - + +# 20| [RegExpCharacterClassEscape] \d + +# 20| [RegExpPlus] \d+ +#-----| 0 -> [RegExpCharacterClassEscape] \d + +# 21| [RegExpCharacterClass] [\w] +#-----| 0 -> [RegExpCharacterClassEscape] \w + +# 21| [RegExpPlus] [\w]+ +#-----| 0 -> [RegExpCharacterClass] [\w] + +# 21| [RegExpCharacterClassEscape] \w + +# 22| [RegExpConstant, RegExpEscape] \[ + +# 22| [RegExpSequence] \[\][123] +#-----| 0 -> [RegExpConstant, RegExpEscape] \[ +#-----| 1 -> [RegExpConstant, RegExpEscape] \] +#-----| 2 -> [RegExpCharacterClass] [123] + +# 22| [RegExpConstant, RegExpEscape] \] + +# 22| [RegExpCharacterClass] [123] +#-----| 0 -> [RegExpConstant, RegExpNormalChar] 1 +#-----| 1 -> [RegExpConstant, RegExpNormalChar] 2 +#-----| 2 -> [RegExpConstant, RegExpNormalChar] 3 + +# 22| [RegExpConstant, RegExpNormalChar] 1 + +# 22| [RegExpConstant, RegExpNormalChar] 2 + +# 22| [RegExpConstant, RegExpNormalChar] 3 + +# 23| [RegExpCharacterClass] [^A-Z] +#-----| 0 -> [RegExpCharacterRange] A-Z + +# 23| [RegExpConstant, RegExpNormalChar] A + +# 23| [RegExpCharacterRange] A-Z +#-----| 0 -> [RegExpConstant, RegExpNormalChar] A +#-----| 1 -> [RegExpConstant, RegExpNormalChar] Z + +# 23| [RegExpConstant, RegExpNormalChar] Z + +# 24| [RegExpCharacterClass] []] +#-----| 0 -> [RegExpConstant, RegExpNormalChar] ] + +# 24| [RegExpConstant, RegExpNormalChar] ] + +# 25| [RegExpCharacterClass] [^]] +#-----| 0 -> [RegExpConstant, RegExpNormalChar] ] + +# 25| [RegExpConstant, RegExpNormalChar] ] + +# 26| [RegExpCharacterClass] [^-] +#-----| 0 -> [RegExpConstant, RegExpNormalChar] - + +# 26| [RegExpConstant, RegExpNormalChar] - + +# 27| [RegExpCharacterClass] [|] +#-----| 0 -> [RegExpConstant, RegExpNormalChar] | + +# 27| [RegExpConstant, RegExpNormalChar] | + +# 30| [RegExpCharacterClass] [[a-f] +#-----| 0 -> [RegExpConstant, RegExpNormalChar] [ +#-----| 1 -> [RegExpCharacterRange] a-f + +# 30| [RegExpSequence] [[a-f]A-F] +#-----| 0 -> [RegExpCharacterClass] [[a-f] +#-----| 1 -> [RegExpConstant, RegExpNormalChar] A-F] + +# 30| [RegExpConstant, RegExpNormalChar] [ + +# 30| [RegExpConstant, RegExpNormalChar] a + +# 30| [RegExpCharacterRange] a-f +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpNormalChar] f + +# 30| [RegExpConstant, RegExpNormalChar] f + +# 30| [RegExpConstant, RegExpNormalChar] A-F] + +# 33| [RegExpDot] . + +# 33| [RegExpStar] .* +#-----| 0 -> [RegExpDot] . + +# 34| [RegExpDot] . + +# 34| [RegExpStar] .* +#-----| 0 -> [RegExpDot] . + +# 35| [RegExpCharacterClassEscape] \w + +# 35| [RegExpPlus] \w+ +#-----| 0 -> [RegExpCharacterClassEscape] \w + +# 35| [RegExpSequence] \w+\W +#-----| 0 -> [RegExpPlus] \w+ +#-----| 1 -> [RegExpCharacterClassEscape] \W + +# 35| [RegExpCharacterClassEscape] \W + +# 36| [RegExpCharacterClassEscape] \s + +# 36| [RegExpSequence] \s\S +#-----| 0 -> [RegExpCharacterClassEscape] \s +#-----| 1 -> [RegExpCharacterClassEscape] \S + +# 36| [RegExpCharacterClassEscape] \S + +# 37| [RegExpCharacterClassEscape] \d + +# 37| [RegExpSequence] \d\D +#-----| 0 -> [RegExpCharacterClassEscape] \d +#-----| 1 -> [RegExpCharacterClassEscape] \D + +# 37| [RegExpCharacterClassEscape] \D + +# 38| [RegExpCharacterClassEscape] \h + +# 38| [RegExpSequence] \h\H +#-----| 0 -> [RegExpCharacterClassEscape] \h +#-----| 1 -> [RegExpCharacterClassEscape] \H + +# 38| [RegExpCharacterClassEscape] \H + +# 39| [RegExpConstant, RegExpEscape] \n + +# 39| [RegExpSequence] \n\r\t +#-----| 0 -> [RegExpConstant, RegExpEscape] \n +#-----| 1 -> [RegExpConstant, RegExpEscape] \r +#-----| 2 -> [RegExpConstant, RegExpEscape] \t + +# 39| [RegExpConstant, RegExpEscape] \r + +# 39| [RegExpConstant, RegExpEscape] \t + +# 42| [RegExpSpecialChar] \G + +# 42| [RegExpSequence] \Gabc +#-----| 0 -> [RegExpSpecialChar] \G +#-----| 1 -> [RegExpConstant, RegExpNormalChar] abc + +# 42| [RegExpConstant, RegExpNormalChar] abc + +# 43| [RegExpSpecialChar] \b + +# 43| [RegExpSequence] \b!a\B +#-----| 0 -> [RegExpSpecialChar] \b +#-----| 1 -> [RegExpConstant, RegExpNormalChar] !a +#-----| 2 -> [RegExpNonWordBoundary] \B + +# 43| [RegExpConstant, RegExpNormalChar] !a + +# 43| [RegExpNonWordBoundary] \B + +# 46| [RegExpGroup] (foo) +#-----| 0 -> [RegExpConstant, RegExpNormalChar] foo + +# 46| [RegExpStar] (foo)* +#-----| 0 -> [RegExpGroup] (foo) + +# 46| [RegExpSequence] (foo)*bar +#-----| 0 -> [RegExpStar] (foo)* +#-----| 1 -> [RegExpConstant, RegExpNormalChar] bar + +# 46| [RegExpConstant, RegExpNormalChar] foo + +# 46| [RegExpConstant, RegExpNormalChar] bar + +# 47| [RegExpConstant, RegExpNormalChar] fo + +# 47| [RegExpSequence] fo(o|b)ar +#-----| 0 -> [RegExpConstant, RegExpNormalChar] fo +#-----| 1 -> [RegExpGroup] (o|b) +#-----| 2 -> [RegExpConstant, RegExpNormalChar] ar + +# 47| [RegExpGroup] (o|b) +#-----| 0 -> [RegExpAlt] o|b + +# 47| [RegExpConstant, RegExpNormalChar] o + +# 47| [RegExpAlt] o|b +#-----| 0 -> [RegExpConstant, RegExpNormalChar] o +#-----| 1 -> [RegExpConstant, RegExpNormalChar] b + +# 47| [RegExpConstant, RegExpNormalChar] b + +# 47| [RegExpConstant, RegExpNormalChar] ar + +# 48| [RegExpGroup] (a|b|cd) +#-----| 0 -> [RegExpAlt] a|b|cd + +# 48| [RegExpSequence] (a|b|cd)e +#-----| 0 -> [RegExpGroup] (a|b|cd) +#-----| 1 -> [RegExpConstant, RegExpNormalChar] e + +# 48| [RegExpConstant, RegExpNormalChar] a + +# 48| [RegExpAlt] a|b|cd +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpNormalChar] b +#-----| 2 -> [RegExpConstant, RegExpNormalChar] cd + +# 48| [RegExpConstant, RegExpNormalChar] b + +# 48| [RegExpConstant, RegExpNormalChar] cd + +# 48| [RegExpConstant, RegExpNormalChar] e + +# 49| [RegExpGroup] (?::+) +#-----| 0 -> [RegExpPlus] :+ + +# 49| [RegExpSequence] (?::+)\w +#-----| 0 -> [RegExpGroup] (?::+) +#-----| 1 -> [RegExpCharacterClassEscape] \w + +# 49| [RegExpConstant, RegExpNormalChar] : + +# 49| [RegExpPlus] :+ +#-----| 0 -> [RegExpConstant, RegExpNormalChar] : + +# 49| [RegExpCharacterClassEscape] \w + +# 52| [RegExpGroup] (?\w+) +#-----| 0 -> [RegExpPlus] \w+ + +# 52| [RegExpCharacterClassEscape] \w + +# 52| [RegExpPlus] \w+ +#-----| 0 -> [RegExpCharacterClassEscape] \w + +# 53| [RegExpGroup] (?'foo'fo+) +#-----| 0 -> [RegExpSequence] fo+ + +# 53| [RegExpConstant, RegExpNormalChar] f + +# 53| [RegExpSequence] fo+ +#-----| 0 -> [RegExpConstant, RegExpNormalChar] f +#-----| 1 -> [RegExpPlus] o+ + +# 53| [RegExpConstant, RegExpNormalChar] o + +# 53| [RegExpPlus] o+ +#-----| 0 -> [RegExpConstant, RegExpNormalChar] o + +# 56| [RegExpGroup] (a+) +#-----| 0 -> [RegExpPlus] a+ + +# 56| [RegExpSequence] (a+)b+\1 +#-----| 0 -> [RegExpGroup] (a+) +#-----| 1 -> [RegExpPlus] b+ +#-----| 2 -> [RegExpBackRef] \1 + +# 56| [RegExpConstant, RegExpNormalChar] a + +# 56| [RegExpPlus] a+ +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a + +# 56| [RegExpConstant, RegExpNormalChar] b + +# 56| [RegExpPlus] b+ +#-----| 0 -> [RegExpConstant, RegExpNormalChar] b + +# 56| [RegExpBackRef] \1 + +# 57| [RegExpGroup] (?q+) +#-----| 0 -> [RegExpPlus] q+ + +# 57| [RegExpSequence] (?q+)\s+\k+ +#-----| 0 -> [RegExpGroup] (?q+) +#-----| 1 -> [RegExpPlus] \s+ +#-----| 2 -> [RegExpPlus] \k+ + +# 57| [RegExpConstant, RegExpNormalChar] q + +# 57| [RegExpPlus] q+ +#-----| 0 -> [RegExpConstant, RegExpNormalChar] q + +# 57| [RegExpCharacterClassEscape] \s + +# 57| [RegExpPlus] \s+ +#-----| 0 -> [RegExpCharacterClassEscape] \s + +# 57| [RegExpBackRef] \k + +# 57| [RegExpPlus] \k+ +#-----| 0 -> [RegExpBackRef] \k + +# 60| [RegExpNamedCharacterProperty] \p{Word} + +# 60| [RegExpStar] \p{Word}* +#-----| 0 -> [RegExpNamedCharacterProperty] \p{Word} + +# 61| [RegExpNamedCharacterProperty] \P{Digit} + +# 61| [RegExpPlus] \P{Digit}+ +#-----| 0 -> [RegExpNamedCharacterProperty] \P{Digit} + +# 62| [RegExpNamedCharacterProperty] \p{^Alnum} + +# 62| [RegExpRange] \p{^Alnum}{2,3} +#-----| 0 -> [RegExpNamedCharacterProperty] \p{^Alnum} + +# 63| [RegExpCharacterClass] [a-f\p{Digit}] +#-----| 0 -> [RegExpCharacterRange] a-f +#-----| 1 -> [RegExpNamedCharacterProperty] \p{Digit} + +# 63| [RegExpPlus] [a-f\p{Digit}]+ +#-----| 0 -> [RegExpCharacterClass] [a-f\p{Digit}] + +# 63| [RegExpConstant, RegExpNormalChar] a + +# 63| [RegExpCharacterRange] a-f +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpNormalChar] f + +# 63| [RegExpConstant, RegExpNormalChar] f + +# 63| [RegExpNamedCharacterProperty] \p{Digit} + +# 66| [RegExpCharacterClass] [[:alpha:]] +#-----| 0 -> [RegExpNamedCharacterProperty] [:alpha:] + +# 66| [RegExpSequence] [[:alpha:]][[:digit:]] +#-----| 0 -> [RegExpCharacterClass] [[:alpha:]] +#-----| 1 -> [RegExpCharacterClass] [[:digit:]] + +# 66| [RegExpNamedCharacterProperty] [:alpha:] + +# 66| [RegExpCharacterClass] [[:digit:]] +#-----| 0 -> [RegExpNamedCharacterProperty] [:digit:] + +# 66| [RegExpNamedCharacterProperty] [:digit:] + +# 69| [RegExpCharacterClass] [[:alpha:][:digit:]] +#-----| 0 -> [RegExpNamedCharacterProperty] [:alpha:] +#-----| 1 -> [RegExpNamedCharacterProperty] [:digit:] + +# 69| [RegExpNamedCharacterProperty] [:alpha:] + +# 69| [RegExpNamedCharacterProperty] [:digit:] + +# 72| [RegExpCharacterClass] [A-F[:digit:]a-f] +#-----| 0 -> [RegExpCharacterRange] A-F +#-----| 1 -> [RegExpNamedCharacterProperty] [:digit:] +#-----| 2 -> [RegExpCharacterRange] a-f + +# 72| [RegExpConstant, RegExpNormalChar] A + +# 72| [RegExpCharacterRange] A-F +#-----| 0 -> [RegExpConstant, RegExpNormalChar] A +#-----| 1 -> [RegExpConstant, RegExpNormalChar] F + +# 72| [RegExpConstant, RegExpNormalChar] F + +# 72| [RegExpNamedCharacterProperty] [:digit:] + +# 72| [RegExpConstant, RegExpNormalChar] a + +# 72| [RegExpCharacterRange] a-f +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpNormalChar] f + +# 72| [RegExpConstant, RegExpNormalChar] f + +# 75| [RegExpNamedCharacterProperty] [:digit:] + +# 79| [RegExpConstant, RegExpNormalChar] abc + +# 82| [RegExpConstant, RegExpEscape] \u{987 diff --git a/cpp/ql/test/library-tests/regex/parse.ql b/cpp/ql/test/library-tests/regex/parse.ql new file mode 100644 index 000000000000..9bc804ada4de --- /dev/null +++ b/cpp/ql/test/library-tests/regex/parse.ql @@ -0,0 +1,27 @@ +/** + * @kind graph + */ + +import codeql.Locations +import codeql.ruby.Regexp as RE + +query predicate nodes(RE::RegExpTerm n, string attr, string val) { + attr = "semmle.label" and + val = "[" + concat(n.getAPrimaryQlClass(), ", ") + "] " + n.toString() + or + attr = "semmle.order" and + val = + any(int i | + n = + rank[i](RE::RegExpTerm t, string fp, int sl, int sc, int el, int ec | + t.hasLocationInfo(fp, sl, sc, el, ec) + | + t order by fp, sl, sc, el, ec, t.toString() + ) + ).toString() +} + +query predicate edges(RE::RegExpTerm pred, RE::RegExpTerm succ, string attr, string val) { + attr in ["semmle.label", "semmle.order"] and + val = any(int i | succ = pred.getChild(i)).toString() +} diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected new file mode 100644 index 000000000000..e464b5ce5ea5 --- /dev/null +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -0,0 +1,270 @@ +groupName +| regexp.rb:52:2:52:11 | (?\\w+) | id | +| regexp.rb:53:2:53:12 | (?'foo'fo+) | foo | +| regexp.rb:57:2:57:11 | (?q+) | qux | +groupNumber +| regexp.rb:46:2:46:6 | (foo) | 1 | +| regexp.rb:47:4:47:8 | (o\|b) | 1 | +| regexp.rb:48:2:48:9 | (a\|b\|cd) | 1 | +| regexp.rb:53:2:53:12 | (?'foo'fo+) | 1 | +| regexp.rb:56:2:56:5 | (a+) | 1 | +term +| regexp.rb:5:2:5:4 | abc | RegExpConstant,RegExpNormalChar | +| regexp.rb:8:2:8:2 | a | RegExpConstant,RegExpNormalChar | +| regexp.rb:8:2:8:3 | a* | RegExpStar | +| regexp.rb:8:2:8:8 | a*b+c?d | RegExpSequence | +| regexp.rb:8:4:8:4 | b | RegExpConstant,RegExpNormalChar | +| regexp.rb:8:4:8:5 | b+ | RegExpPlus | +| regexp.rb:8:6:8:6 | c | RegExpConstant,RegExpNormalChar | +| regexp.rb:8:6:8:7 | c? | RegExpOpt | +| regexp.rb:8:8:8:8 | d | RegExpConstant,RegExpNormalChar | +| regexp.rb:9:2:9:2 | a | RegExpConstant,RegExpNormalChar | +| regexp.rb:9:2:9:7 | a{4,8} | RegExpRange | +| regexp.rb:10:2:10:2 | a | RegExpConstant,RegExpNormalChar | +| regexp.rb:10:2:10:6 | a{,8} | RegExpRange | +| regexp.rb:11:2:11:2 | a | RegExpConstant,RegExpNormalChar | +| regexp.rb:11:2:11:6 | a{3,} | InfiniteRepetitionQuantifier,RegExpRange | +| regexp.rb:12:2:12:2 | a | RegExpConstant,RegExpNormalChar | +| regexp.rb:12:2:12:5 | a{7} | RegExpRange | +| regexp.rb:15:2:15:4 | foo | RegExpConstant,RegExpNormalChar | +| regexp.rb:15:2:15:8 | foo\|bar | RegExpAlt | +| regexp.rb:15:6:15:8 | bar | RegExpConstant,RegExpNormalChar | +| regexp.rb:18:2:18:6 | [abc] | RegExpCharacterClass | +| regexp.rb:18:3:18:3 | a | RegExpConstant,RegExpNormalChar | +| regexp.rb:18:4:18:4 | b | RegExpConstant,RegExpNormalChar | +| regexp.rb:18:5:18:5 | c | RegExpConstant,RegExpNormalChar | +| regexp.rb:19:2:19:13 | [a-fA-F0-9_] | RegExpCharacterClass | +| regexp.rb:19:3:19:3 | a | RegExpConstant,RegExpNormalChar | +| regexp.rb:19:3:19:5 | a-f | RegExpCharacterRange | +| regexp.rb:19:5:19:5 | f | RegExpConstant,RegExpNormalChar | +| regexp.rb:19:6:19:6 | A | RegExpConstant,RegExpNormalChar | +| regexp.rb:19:6:19:8 | A-F | RegExpCharacterRange | +| regexp.rb:19:8:19:8 | F | RegExpConstant,RegExpNormalChar | +| regexp.rb:19:9:19:9 | 0 | RegExpConstant,RegExpNormalChar | +| regexp.rb:19:9:19:11 | 0-9 | RegExpCharacterRange | +| regexp.rb:19:11:19:11 | 9 | RegExpConstant,RegExpNormalChar | +| regexp.rb:19:12:19:12 | _ | RegExpConstant,RegExpNormalChar | +| regexp.rb:20:2:20:3 | \\A | RegExpCaret | +| regexp.rb:20:2:20:11 | \\A[+-]?\\d+ | RegExpSequence | +| regexp.rb:20:4:20:7 | [+-] | RegExpCharacterClass | +| regexp.rb:20:4:20:8 | [+-]? | RegExpOpt | +| regexp.rb:20:5:20:5 | + | RegExpConstant,RegExpNormalChar | +| regexp.rb:20:6:20:6 | - | RegExpConstant,RegExpNormalChar | +| regexp.rb:20:9:20:10 | \\d | RegExpCharacterClassEscape | +| regexp.rb:20:9:20:11 | \\d+ | RegExpPlus | +| regexp.rb:21:2:21:5 | [\\w] | RegExpCharacterClass | +| regexp.rb:21:2:21:6 | [\\w]+ | RegExpPlus | +| regexp.rb:21:3:21:4 | \\w | RegExpCharacterClassEscape | +| regexp.rb:22:2:22:3 | \\[ | RegExpConstant,RegExpEscape | +| regexp.rb:22:2:22:10 | \\[\\][123] | RegExpSequence | +| regexp.rb:22:4:22:5 | \\] | RegExpConstant,RegExpEscape | +| regexp.rb:22:6:22:10 | [123] | RegExpCharacterClass | +| regexp.rb:22:7:22:7 | 1 | RegExpConstant,RegExpNormalChar | +| regexp.rb:22:8:22:8 | 2 | RegExpConstant,RegExpNormalChar | +| regexp.rb:22:9:22:9 | 3 | RegExpConstant,RegExpNormalChar | +| regexp.rb:23:2:23:7 | [^A-Z] | RegExpCharacterClass | +| regexp.rb:23:4:23:4 | A | RegExpConstant,RegExpNormalChar | +| regexp.rb:23:4:23:6 | A-Z | RegExpCharacterRange | +| regexp.rb:23:6:23:6 | Z | RegExpConstant,RegExpNormalChar | +| regexp.rb:24:2:24:4 | []] | RegExpCharacterClass | +| regexp.rb:24:3:24:3 | ] | RegExpConstant,RegExpNormalChar | +| regexp.rb:25:2:25:5 | [^]] | RegExpCharacterClass | +| regexp.rb:25:4:25:4 | ] | RegExpConstant,RegExpNormalChar | +| regexp.rb:26:2:26:5 | [^-] | RegExpCharacterClass | +| regexp.rb:26:4:26:4 | - | RegExpConstant,RegExpNormalChar | +| regexp.rb:27:2:27:4 | [\|] | RegExpCharacterClass | +| regexp.rb:27:3:27:3 | \| | RegExpConstant,RegExpNormalChar | +| regexp.rb:30:2:30:7 | [[a-f] | RegExpCharacterClass | +| regexp.rb:30:2:30:11 | [[a-f]A-F] | RegExpSequence | +| regexp.rb:30:3:30:3 | [ | RegExpConstant,RegExpNormalChar | +| regexp.rb:30:4:30:4 | a | RegExpConstant,RegExpNormalChar | +| regexp.rb:30:4:30:6 | a-f | RegExpCharacterRange | +| regexp.rb:30:6:30:6 | f | RegExpConstant,RegExpNormalChar | +| regexp.rb:30:8:30:11 | A-F] | RegExpConstant,RegExpNormalChar | +| regexp.rb:33:2:33:2 | . | RegExpDot | +| regexp.rb:33:2:33:3 | .* | RegExpStar | +| regexp.rb:34:2:34:2 | . | RegExpDot | +| regexp.rb:34:2:34:3 | .* | RegExpStar | +| regexp.rb:35:2:35:3 | \\w | RegExpCharacterClassEscape | +| regexp.rb:35:2:35:4 | \\w+ | RegExpPlus | +| regexp.rb:35:2:35:6 | \\w+\\W | RegExpSequence | +| regexp.rb:35:5:35:6 | \\W | RegExpCharacterClassEscape | +| regexp.rb:36:2:36:3 | \\s | RegExpCharacterClassEscape | +| regexp.rb:36:2:36:5 | \\s\\S | RegExpSequence | +| regexp.rb:36:4:36:5 | \\S | RegExpCharacterClassEscape | +| regexp.rb:37:2:37:3 | \\d | RegExpCharacterClassEscape | +| regexp.rb:37:2:37:5 | \\d\\D | RegExpSequence | +| regexp.rb:37:4:37:5 | \\D | RegExpCharacterClassEscape | +| regexp.rb:38:2:38:3 | \\h | RegExpCharacterClassEscape | +| regexp.rb:38:2:38:5 | \\h\\H | RegExpSequence | +| regexp.rb:38:4:38:5 | \\H | RegExpCharacterClassEscape | +| regexp.rb:39:2:39:3 | \\n | RegExpConstant,RegExpEscape | +| regexp.rb:39:2:39:7 | \\n\\r\\t | RegExpSequence | +| regexp.rb:39:4:39:5 | \\r | RegExpConstant,RegExpEscape | +| regexp.rb:39:6:39:7 | \\t | RegExpConstant,RegExpEscape | +| regexp.rb:42:2:42:3 | \\G | RegExpSpecialChar | +| regexp.rb:42:2:42:6 | \\Gabc | RegExpSequence | +| regexp.rb:42:4:42:6 | abc | RegExpConstant,RegExpNormalChar | +| regexp.rb:43:2:43:3 | \\b | RegExpSpecialChar | +| regexp.rb:43:2:43:7 | \\b!a\\B | RegExpSequence | +| regexp.rb:43:4:43:5 | !a | RegExpConstant,RegExpNormalChar | +| regexp.rb:43:6:43:7 | \\B | RegExpNonWordBoundary | +| regexp.rb:46:2:46:6 | (foo) | RegExpGroup | +| regexp.rb:46:2:46:7 | (foo)* | RegExpStar | +| regexp.rb:46:2:46:10 | (foo)*bar | RegExpSequence | +| regexp.rb:46:3:46:5 | foo | RegExpConstant,RegExpNormalChar | +| regexp.rb:46:8:46:10 | bar | RegExpConstant,RegExpNormalChar | +| regexp.rb:47:2:47:3 | fo | RegExpConstant,RegExpNormalChar | +| regexp.rb:47:2:47:10 | fo(o\|b)ar | RegExpSequence | +| regexp.rb:47:4:47:8 | (o\|b) | RegExpGroup | +| regexp.rb:47:5:47:5 | o | RegExpConstant,RegExpNormalChar | +| regexp.rb:47:5:47:7 | o\|b | RegExpAlt | +| regexp.rb:47:7:47:7 | b | RegExpConstant,RegExpNormalChar | +| regexp.rb:47:9:47:10 | ar | RegExpConstant,RegExpNormalChar | +| regexp.rb:48:2:48:9 | (a\|b\|cd) | RegExpGroup | +| regexp.rb:48:2:48:10 | (a\|b\|cd)e | RegExpSequence | +| regexp.rb:48:3:48:3 | a | RegExpConstant,RegExpNormalChar | +| regexp.rb:48:3:48:8 | a\|b\|cd | RegExpAlt | +| regexp.rb:48:5:48:5 | b | RegExpConstant,RegExpNormalChar | +| regexp.rb:48:7:48:8 | cd | RegExpConstant,RegExpNormalChar | +| regexp.rb:48:10:48:10 | e | RegExpConstant,RegExpNormalChar | +| regexp.rb:49:2:49:7 | (?::+) | RegExpGroup | +| regexp.rb:49:2:49:9 | (?::+)\\w | RegExpSequence | +| regexp.rb:49:5:49:5 | : | RegExpConstant,RegExpNormalChar | +| regexp.rb:49:5:49:6 | :+ | RegExpPlus | +| regexp.rb:49:8:49:9 | \\w | RegExpCharacterClassEscape | +| regexp.rb:52:2:52:11 | (?\\w+) | RegExpGroup | +| regexp.rb:52:8:52:9 | \\w | RegExpCharacterClassEscape | +| regexp.rb:52:8:52:10 | \\w+ | RegExpPlus | +| regexp.rb:53:2:53:12 | (?'foo'fo+) | RegExpGroup | +| regexp.rb:53:9:53:9 | f | RegExpConstant,RegExpNormalChar | +| regexp.rb:53:9:53:11 | fo+ | RegExpSequence | +| regexp.rb:53:10:53:10 | o | RegExpConstant,RegExpNormalChar | +| regexp.rb:53:10:53:11 | o+ | RegExpPlus | +| regexp.rb:56:2:56:5 | (a+) | RegExpGroup | +| regexp.rb:56:2:56:9 | (a+)b+\\1 | RegExpSequence | +| regexp.rb:56:3:56:3 | a | RegExpConstant,RegExpNormalChar | +| regexp.rb:56:3:56:4 | a+ | RegExpPlus | +| regexp.rb:56:6:56:6 | b | RegExpConstant,RegExpNormalChar | +| regexp.rb:56:6:56:7 | b+ | RegExpPlus | +| regexp.rb:56:8:56:9 | \\1 | RegExpBackRef | +| regexp.rb:57:2:57:11 | (?q+) | RegExpGroup | +| regexp.rb:57:2:57:22 | (?q+)\\s+\\k+ | RegExpSequence | +| regexp.rb:57:9:57:9 | q | RegExpConstant,RegExpNormalChar | +| regexp.rb:57:9:57:10 | q+ | RegExpPlus | +| regexp.rb:57:12:57:13 | \\s | RegExpCharacterClassEscape | +| regexp.rb:57:12:57:14 | \\s+ | RegExpPlus | +| regexp.rb:57:15:57:21 | \\k | RegExpBackRef | +| regexp.rb:57:15:57:22 | \\k+ | RegExpPlus | +| regexp.rb:60:2:60:9 | \\p{Word} | RegExpNamedCharacterProperty | +| regexp.rb:60:2:60:10 | \\p{Word}* | RegExpStar | +| regexp.rb:61:2:61:10 | \\P{Digit} | RegExpNamedCharacterProperty | +| regexp.rb:61:2:61:11 | \\P{Digit}+ | RegExpPlus | +| regexp.rb:62:2:62:11 | \\p{^Alnum} | RegExpNamedCharacterProperty | +| regexp.rb:62:2:62:16 | \\p{^Alnum}{2,3} | RegExpRange | +| regexp.rb:63:2:63:15 | [a-f\\p{Digit}] | RegExpCharacterClass | +| regexp.rb:63:2:63:16 | [a-f\\p{Digit}]+ | RegExpPlus | +| regexp.rb:63:3:63:3 | a | RegExpConstant,RegExpNormalChar | +| regexp.rb:63:3:63:5 | a-f | RegExpCharacterRange | +| regexp.rb:63:5:63:5 | f | RegExpConstant,RegExpNormalChar | +| regexp.rb:63:6:63:14 | \\p{Digit} | RegExpNamedCharacterProperty | +| regexp.rb:66:2:66:12 | [[:alpha:]] | RegExpCharacterClass | +| regexp.rb:66:2:66:23 | [[:alpha:]][[:digit:]] | RegExpSequence | +| regexp.rb:66:3:66:11 | [:alpha:] | RegExpNamedCharacterProperty | +| regexp.rb:66:13:66:23 | [[:digit:]] | RegExpCharacterClass | +| regexp.rb:66:14:66:22 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.rb:69:2:69:21 | [[:alpha:][:digit:]] | RegExpCharacterClass | +| regexp.rb:69:3:69:11 | [:alpha:] | RegExpNamedCharacterProperty | +| regexp.rb:69:12:69:20 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.rb:72:2:72:18 | [A-F[:digit:]a-f] | RegExpCharacterClass | +| regexp.rb:72:3:72:3 | A | RegExpConstant,RegExpNormalChar | +| regexp.rb:72:3:72:5 | A-F | RegExpCharacterRange | +| regexp.rb:72:5:72:5 | F | RegExpConstant,RegExpNormalChar | +| regexp.rb:72:6:72:14 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.rb:72:15:72:15 | a | RegExpConstant,RegExpNormalChar | +| regexp.rb:72:15:72:17 | a-f | RegExpCharacterRange | +| regexp.rb:72:17:72:17 | f | RegExpConstant,RegExpNormalChar | +| regexp.rb:75:2:75:10 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.rb:79:2:79:4 | abc | RegExpConstant,RegExpNormalChar | +| regexp.rb:82:2:82:7 | \\u{987 | RegExpConstant,RegExpEscape | +regExpNormalCharValue +| regexp.rb:5:2:5:4 | abc | abc | +| regexp.rb:8:2:8:2 | a | a | +| regexp.rb:8:4:8:4 | b | b | +| regexp.rb:8:6:8:6 | c | c | +| regexp.rb:8:8:8:8 | d | d | +| regexp.rb:9:2:9:2 | a | a | +| regexp.rb:10:2:10:2 | a | a | +| regexp.rb:11:2:11:2 | a | a | +| regexp.rb:12:2:12:2 | a | a | +| regexp.rb:15:2:15:4 | foo | foo | +| regexp.rb:15:6:15:8 | bar | bar | +| regexp.rb:18:3:18:3 | a | a | +| regexp.rb:18:4:18:4 | b | b | +| regexp.rb:18:5:18:5 | c | c | +| regexp.rb:19:3:19:3 | a | a | +| regexp.rb:19:5:19:5 | f | f | +| regexp.rb:19:6:19:6 | A | A | +| regexp.rb:19:8:19:8 | F | F | +| regexp.rb:19:9:19:9 | 0 | 0 | +| regexp.rb:19:11:19:11 | 9 | 9 | +| regexp.rb:19:12:19:12 | _ | _ | +| regexp.rb:20:5:20:5 | + | + | +| regexp.rb:20:6:20:6 | - | - | +| regexp.rb:20:9:20:10 | \\d | d | +| regexp.rb:21:3:21:4 | \\w | w | +| regexp.rb:22:2:22:3 | \\[ | [ | +| regexp.rb:22:4:22:5 | \\] | ] | +| regexp.rb:22:7:22:7 | 1 | 1 | +| regexp.rb:22:8:22:8 | 2 | 2 | +| regexp.rb:22:9:22:9 | 3 | 3 | +| regexp.rb:23:4:23:4 | A | A | +| regexp.rb:23:6:23:6 | Z | Z | +| regexp.rb:24:3:24:3 | ] | ] | +| regexp.rb:25:4:25:4 | ] | ] | +| regexp.rb:26:4:26:4 | - | - | +| regexp.rb:27:3:27:3 | \| | \| | +| regexp.rb:30:3:30:3 | [ | [ | +| regexp.rb:30:4:30:4 | a | a | +| regexp.rb:30:6:30:6 | f | f | +| regexp.rb:30:8:30:11 | A-F] | A-F] | +| regexp.rb:35:2:35:3 | \\w | w | +| regexp.rb:35:5:35:6 | \\W | W | +| regexp.rb:36:2:36:3 | \\s | s | +| regexp.rb:36:4:36:5 | \\S | S | +| regexp.rb:37:2:37:3 | \\d | d | +| regexp.rb:37:4:37:5 | \\D | D | +| regexp.rb:38:2:38:3 | \\h | h | +| regexp.rb:38:4:38:5 | \\H | H | +| regexp.rb:39:2:39:3 | \\n | \n | +| regexp.rb:39:4:39:5 | \\r | \r | +| regexp.rb:39:6:39:7 | \\t | \t | +| regexp.rb:42:4:42:6 | abc | abc | +| regexp.rb:43:4:43:5 | !a | !a | +| regexp.rb:46:3:46:5 | foo | foo | +| regexp.rb:46:8:46:10 | bar | bar | +| regexp.rb:47:2:47:3 | fo | fo | +| regexp.rb:47:5:47:5 | o | o | +| regexp.rb:47:7:47:7 | b | b | +| regexp.rb:47:9:47:10 | ar | ar | +| regexp.rb:48:3:48:3 | a | a | +| regexp.rb:48:5:48:5 | b | b | +| regexp.rb:48:7:48:8 | cd | cd | +| regexp.rb:48:10:48:10 | e | e | +| regexp.rb:49:5:49:5 | : | : | +| regexp.rb:49:8:49:9 | \\w | w | +| regexp.rb:52:8:52:9 | \\w | w | +| regexp.rb:53:9:53:9 | f | f | +| regexp.rb:53:10:53:10 | o | o | +| regexp.rb:56:3:56:3 | a | a | +| regexp.rb:56:6:56:6 | b | b | +| regexp.rb:57:9:57:9 | q | q | +| regexp.rb:57:12:57:13 | \\s | s | +| regexp.rb:63:3:63:3 | a | a | +| regexp.rb:63:5:63:5 | f | f | +| regexp.rb:72:3:72:3 | A | A | +| regexp.rb:72:5:72:5 | F | F | +| regexp.rb:72:15:72:15 | a | a | +| regexp.rb:72:17:72:17 | f | f | +| regexp.rb:79:2:79:4 | abc | abc | +| regexp.rb:82:2:82:7 | \\u{987 | \u0987 | diff --git a/cpp/ql/test/library-tests/regex/regexp.ql b/cpp/ql/test/library-tests/regex/regexp.ql new file mode 100644 index 000000000000..90fd09ab1be8 --- /dev/null +++ b/cpp/ql/test/library-tests/regex/regexp.ql @@ -0,0 +1,11 @@ +import codeql.ruby.Regexp + +query predicate groupName(RegExpGroup g, string name) { name = g.getName() } + +query predicate groupNumber(RegExpGroup g, int number) { number = g.getNumber() } + +query predicate term(RegExpTerm term, string c) { c = term.getPrimaryQlClasses() } + +query predicate regExpNormalCharValue(RegExpNormalChar term, string value) { + value = term.getValue() +} diff --git a/cpp/ql/test/library-tests/regex/regexp.rb b/cpp/ql/test/library-tests/regex/regexp.rb new file mode 100644 index 000000000000..a68c4878094f --- /dev/null +++ b/cpp/ql/test/library-tests/regex/regexp.rb @@ -0,0 +1,82 @@ +# Empty +// + +# Basic sequence +/abc/ + +# Repetition +/a*b+c?d/ +/a{4,8}/ +/a{,8}/ +/a{3,}/ +/a{7}/ + +# Alternation +/foo|bar/ + +# Character classes +/[abc]/ +/[a-fA-F0-9_]/ +/\A[+-]?\d+/ +/[\w]+/ +/\[\][123]/ +/[^A-Z]/ +/[]]/ # MRI gives a warning, but accepts this as matching ']' +/[^]]/ # MRI gives a warning, but accepts this as matching anything except ']' +/[^-]/ +/[|]/ + +# Nested character classes +/[[a-f]A-F]/ # BAD - not parsed correctly + +# Meta-character classes +/.*/ +/.*/m +/\w+\W/ +/\s\S/ +/\d\D/ +/\h\H/ +/\n\r\t/ + +# Anchors +/\Gabc/ +/\b!a\B/ + +# Groups +/(foo)*bar/ +/fo(o|b)ar/ +/(a|b|cd)e/ +/(?::+)\w/ # Non-capturing group matching colons + +# Named groups +/(?\w+)/ +/(?'foo'fo+)/ + +# Backreferences +/(a+)b+\1/ +/(?q+)\s+\k+/ + +# Named character properties using the p-style syntax +/\p{Word}*/ +/\P{Digit}+/ +/\p{^Alnum}{2,3}/ +/[a-f\p{Digit}]+/ # Also valid inside character classes + +# Two separate character classes, each containing a single POSIX bracket expression +/[[:alpha:]][[:digit:]]/ + +# A single character class containing two POSIX bracket expressions +/[[:alpha:][:digit:]]/ + +# A single character class containing two ranges and one POSIX bracket expression +/[A-F[:digit:]a-f]/ + +# *Not* a POSIX bracket expression; just a regular character class. +/[:digit:]/ + +# Simple constant interpolation +A = "a" +/#{A}bc/ + +# unicode +/\u{9879}/ \ No newline at end of file From 40967258559bb0ff34ef462687e5b1f16bf137bc Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Tue, 21 Jul 2026 16:10:30 +0200 Subject: [PATCH 0157/2098] C++: Make regex library compile --- cpp/ql/lib/qlpack.yml | 1 + .../semmle/code/cpp/regex/RegexTreeView.qll | 44 +++++++------------ .../code/cpp/regex/internal/ParseRegExp.qll | 17 +++---- cpp/ql/test/library-tests/regex/parse.ql | 9 ++-- .../regex/{regexp.rb => regexp.cpp} | 0 cpp/ql/test/library-tests/regex/regexp.ql | 2 +- 6 files changed, 28 insertions(+), 45 deletions(-) rename cpp/ql/test/library-tests/regex/{regexp.rb => regexp.cpp} (100%) diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index 0d952a0c1bf9..04f48ffa72c5 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -10,6 +10,7 @@ dependencies: codeql/mad: ${workspace} codeql/quantum: ${workspace} codeql/rangeanalysis: ${workspace} + codeql/regex: ${workspace} codeql/ssa: ${workspace} codeql/typeflow: ${workspace} codeql/tutorial: ${workspace} diff --git a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll index 51df17008817..a0a116f2fe01 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll @@ -1,17 +1,17 @@ -/** Provides a class hierarchy corresponding to a parse tree of regular expressions. */ +/** + * Provides a class hierarchy corresponding to a parse tree of C++ regular expressions. + */ private import internal.ParseRegExp private import codeql.util.Numbers -private import codeql.ruby.ast.Literal as Ast -private import codeql.Locations -private import codeql.regex.nfa.NfaUtils as NfaUtils +private import semmle.code.cpp.exprs.Literal private import codeql.regex.RegexTreeView // exporting as RegexTreeView, and in the top-level scope. import Impl as RegexTreeView import Impl /** Gets the parse tree resulting from parsing `re`, if such has been constructed. */ -RegExpTerm getParsedRegExp(Ast::RegExpLiteral re) { +RegExpTerm getParsedRegExp(StringLiteral re) { result.getRegExp() = re and result.isRootTerm() } @@ -55,7 +55,7 @@ private newtype TRegExpParent = re.namedCharacterProperty(start, end, _) } -/** An implementation that statisfies the RegexTreeView signature. */ +/** An implementation that satisfies the RegexTreeView signature. */ private module Impl implements RegexTreeViewSig { /** * An element containing a regular expression term, that is, either @@ -211,24 +211,14 @@ private module Impl implements RegexTreeViewSig { */ Location getLocation() { result = re.getLocation() } - pragma[noinline] - private predicate componentHasLocationInfo( - int i, string filepath, int startline, int startcolumn, int endline, int endcolumn - ) { - re.getComponent(i) - .getLocation() - .hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) - } - /** Holds if this term is found at the specified location offsets. */ predicate hasLocationInfo( string filepath, int startline, int startcolumn, int endline, int endcolumn ) { exists(int re_start | - this.componentHasLocationInfo(0, filepath, startline, re_start, _, _) and - this.componentHasLocationInfo(re.getNumberOfComponents() - 1, filepath, _, _, endline, _) and - startcolumn = re_start + start and - endcolumn = re_start + end - 1 + re.getLocation().hasLocationInfo(filepath, startline, re_start, endline, _) and + startcolumn = re_start + 1 + start and + endcolumn = re_start + 1 + end - 1 ) } @@ -312,7 +302,7 @@ private module Impl implements RegexTreeViewSig { result.getEnd() = part_end } - /** Hols if this term may match an unlimited number of times. */ + /** Hodls if this term may match an unlimited number of times. */ predicate mayRepeatForever() { may_repeat_forever = true } /** Gets the qualifier for this term. That is e.g "?" for "a?". */ @@ -660,9 +650,9 @@ private module Impl implements RegexTreeViewSig { * * Examples: * - * ```rb - * /[a-fA-F0-9]/ - * /[^abc]/ + * ```cpp + * "[a-fA-F0-9]" + * "[^abc]" * ``` */ class RegExpCharacterClass extends RegExpTerm, TRegExpCharacterClass { @@ -1195,9 +1185,7 @@ private module Impl implements RegexTreeViewSig { /** * Holds if the regular expression should not be considered. */ - predicate isExcluded(RegExpParent parent) { - parent.(RegExpTerm).getRegExp().(Ast::RegExpLiteral).hasFreeSpacingFlag() // exclude free-spacing mode regexes - } + predicate isExcluded(RegExpParent parent) { none() } /** * Holds if `term` is a possessive quantifier. @@ -1207,13 +1195,13 @@ private module Impl implements RegexTreeViewSig { /** * Holds if the regex that `term` is part of is used in a way that ignores any leading prefix of the input it's matched against. - * Not yet implemented for Ruby. + * Not yet implemented for C++. */ predicate matchesAnyPrefix(RegExpTerm term) { any() } /** * Holds if the regex that `term` is part of is used in a way that ignores any trailing suffix of the input it's matched against. - * Not yet implemented for Ruby. + * Not yet implemented for C++. */ predicate matchesAnySuffix(RegExpTerm term) { any() } diff --git a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll index d35d9353bf13..d9163bb3af05 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll @@ -1,19 +1,18 @@ /** - * Library for parsing for Ruby regular expressions. + * Library for parsing for C++ regular expressions. * * N.B. does not yet handle stripping whitespace and comments in regexes with * the `x` (free-spacing) flag. */ -private import codeql.ruby.AST as Ast -private import codeql.Locations +private import semmle.code.cpp.exprs.Literal /** - * A `StringlikeLiteral` containing a regular expression term, that is, either + * A C++ string literal containing a regular expression term, that is, either * a regular expression literal, or a string literal used in a context where - * it is parsed as regular expression. + * it is parsed as a regular expression. */ -abstract class RegExp extends Ast::StringlikeLiteral { +abstract class RegExp extends StringLiteral { /** * Holds if this `RegExp` has the `s` flag for multi-line matching. */ @@ -254,11 +253,7 @@ abstract class RegExp extends Ast::StringlikeLiteral { } /** Gets the text of this regex */ - string getText() { - exists(Ast::ConstantValue c | c = this.getConstantValue() | - result = [this.getConstantValue().getString(), this.getConstantValue().getRegExp()] - ) - } + string getText() { result = this.getValue() } /** Gets the `i`th character of this regex */ string getChar(int i) { result = this.getText().charAt(i) } diff --git a/cpp/ql/test/library-tests/regex/parse.ql b/cpp/ql/test/library-tests/regex/parse.ql index 9bc804ada4de..ba9a04ab9bd7 100644 --- a/cpp/ql/test/library-tests/regex/parse.ql +++ b/cpp/ql/test/library-tests/regex/parse.ql @@ -2,10 +2,9 @@ * @kind graph */ -import codeql.Locations -import codeql.ruby.Regexp as RE +import semmle.code.cpp.regex.RegexTreeView -query predicate nodes(RE::RegExpTerm n, string attr, string val) { +query predicate nodes(RegExpTerm n, string attr, string val) { attr = "semmle.label" and val = "[" + concat(n.getAPrimaryQlClass(), ", ") + "] " + n.toString() or @@ -13,7 +12,7 @@ query predicate nodes(RE::RegExpTerm n, string attr, string val) { val = any(int i | n = - rank[i](RE::RegExpTerm t, string fp, int sl, int sc, int el, int ec | + rank[i](RegExpTerm t, string fp, int sl, int sc, int el, int ec | t.hasLocationInfo(fp, sl, sc, el, ec) | t order by fp, sl, sc, el, ec, t.toString() @@ -21,7 +20,7 @@ query predicate nodes(RE::RegExpTerm n, string attr, string val) { ).toString() } -query predicate edges(RE::RegExpTerm pred, RE::RegExpTerm succ, string attr, string val) { +query predicate edges(RegExpTerm pred, RegExpTerm succ, string attr, string val) { attr in ["semmle.label", "semmle.order"] and val = any(int i | succ = pred.getChild(i)).toString() } diff --git a/cpp/ql/test/library-tests/regex/regexp.rb b/cpp/ql/test/library-tests/regex/regexp.cpp similarity index 100% rename from cpp/ql/test/library-tests/regex/regexp.rb rename to cpp/ql/test/library-tests/regex/regexp.cpp diff --git a/cpp/ql/test/library-tests/regex/regexp.ql b/cpp/ql/test/library-tests/regex/regexp.ql index 90fd09ab1be8..e167cb1a7bb0 100644 --- a/cpp/ql/test/library-tests/regex/regexp.ql +++ b/cpp/ql/test/library-tests/regex/regexp.ql @@ -1,4 +1,4 @@ -import codeql.ruby.Regexp +import semmle.code.cpp.regex.RegexTreeView query predicate groupName(RegExpGroup g, string name) { name = g.getName() } From cc4f5bd6bde5a0cc8d97c6c1c6992a89ed3e3086 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Tue, 21 Jul 2026 16:29:30 +0200 Subject: [PATCH 0158/2098] C++: Make regex test work Note that we are currently still implementing what Ruby thinks a regex is. This is not correct as C++ by default uses a variant of ECMAScript regexes. We will address this in the follow-up commits. --- .../test/library-tests/regex/parse.expected | 358 ++++++------ cpp/ql/test/library-tests/regex/parse.ql | 6 + cpp/ql/test/library-tests/regex/regexp.cpp | 173 +++--- .../test/library-tests/regex/regexp.expected | 530 +++++++++--------- cpp/ql/test/library-tests/regex/regexp.ql | 6 + 5 files changed, 545 insertions(+), 528 deletions(-) diff --git a/cpp/ql/test/library-tests/regex/parse.expected b/cpp/ql/test/library-tests/regex/parse.expected index 3df78cdb4fbf..13d74f0e5616 100644 --- a/cpp/ql/test/library-tests/regex/parse.expected +++ b/cpp/ql/test/library-tests/regex/parse.expected @@ -1,489 +1,487 @@ -regexp.rb: -# 5| [RegExpConstant, RegExpNormalChar] abc +regexp.cpp: +# 18| [RegExpConstant, RegExpNormalChar] abc -# 8| [RegExpConstant, RegExpNormalChar] a +# 21| [RegExpConstant, RegExpNormalChar] a -# 8| [RegExpStar] a* +# 21| [RegExpStar] a* #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 8| [RegExpSequence] a*b+c?d +# 21| [RegExpSequence] a*b+c?d #-----| 0 -> [RegExpStar] a* #-----| 1 -> [RegExpPlus] b+ #-----| 2 -> [RegExpOpt] c? #-----| 3 -> [RegExpConstant, RegExpNormalChar] d -# 8| [RegExpConstant, RegExpNormalChar] b +# 21| [RegExpConstant, RegExpNormalChar] b -# 8| [RegExpPlus] b+ +# 21| [RegExpPlus] b+ #-----| 0 -> [RegExpConstant, RegExpNormalChar] b -# 8| [RegExpConstant, RegExpNormalChar] c +# 21| [RegExpConstant, RegExpNormalChar] c -# 8| [RegExpOpt] c? +# 21| [RegExpOpt] c? #-----| 0 -> [RegExpConstant, RegExpNormalChar] c -# 8| [RegExpConstant, RegExpNormalChar] d +# 21| [RegExpConstant, RegExpNormalChar] d -# 9| [RegExpConstant, RegExpNormalChar] a +# 22| [RegExpConstant, RegExpNormalChar] a -# 9| [RegExpRange] a{4,8} +# 22| [RegExpRange] a{4,8} #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 10| [RegExpConstant, RegExpNormalChar] a +# 23| [RegExpConstant, RegExpNormalChar] a -# 10| [RegExpRange] a{,8} +# 23| [RegExpRange] a{,8} #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 11| [RegExpConstant, RegExpNormalChar] a +# 24| [RegExpConstant, RegExpNormalChar] a -# 11| [InfiniteRepetitionQuantifier, RegExpRange] a{3,} +# 24| [InfiniteRepetitionQuantifier, RegExpRange] a{3,} #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 12| [RegExpConstant, RegExpNormalChar] a +# 25| [RegExpConstant, RegExpNormalChar] a -# 12| [RegExpRange] a{7} +# 25| [RegExpRange] a{7} #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 15| [RegExpConstant, RegExpNormalChar] foo +# 28| [RegExpConstant, RegExpNormalChar] foo -# 15| [RegExpAlt] foo|bar +# 28| [RegExpAlt] foo|bar #-----| 0 -> [RegExpConstant, RegExpNormalChar] foo #-----| 1 -> [RegExpConstant, RegExpNormalChar] bar -# 15| [RegExpConstant, RegExpNormalChar] bar +# 28| [RegExpConstant, RegExpNormalChar] bar -# 18| [RegExpCharacterClass] [abc] +# 31| [RegExpCharacterClass] [abc] #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] b #-----| 2 -> [RegExpConstant, RegExpNormalChar] c -# 18| [RegExpConstant, RegExpNormalChar] a +# 31| [RegExpConstant, RegExpNormalChar] a -# 18| [RegExpConstant, RegExpNormalChar] b +# 31| [RegExpConstant, RegExpNormalChar] b -# 18| [RegExpConstant, RegExpNormalChar] c +# 31| [RegExpConstant, RegExpNormalChar] c -# 19| [RegExpCharacterClass] [a-fA-F0-9_] +# 32| [RegExpCharacterClass] [a-fA-F0-9_] #-----| 0 -> [RegExpCharacterRange] a-f #-----| 1 -> [RegExpCharacterRange] A-F #-----| 2 -> [RegExpCharacterRange] 0-9 #-----| 3 -> [RegExpConstant, RegExpNormalChar] _ -# 19| [RegExpConstant, RegExpNormalChar] a +# 32| [RegExpConstant, RegExpNormalChar] a -# 19| [RegExpCharacterRange] a-f +# 32| [RegExpCharacterRange] a-f #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] f -# 19| [RegExpConstant, RegExpNormalChar] f +# 32| [RegExpConstant, RegExpNormalChar] f -# 19| [RegExpConstant, RegExpNormalChar] A +# 32| [RegExpConstant, RegExpNormalChar] A -# 19| [RegExpCharacterRange] A-F +# 32| [RegExpCharacterRange] A-F #-----| 0 -> [RegExpConstant, RegExpNormalChar] A #-----| 1 -> [RegExpConstant, RegExpNormalChar] F -# 19| [RegExpConstant, RegExpNormalChar] F +# 32| [RegExpConstant, RegExpNormalChar] F -# 19| [RegExpConstant, RegExpNormalChar] 0 +# 32| [RegExpConstant, RegExpNormalChar] 0 -# 19| [RegExpCharacterRange] 0-9 +# 32| [RegExpCharacterRange] 0-9 #-----| 0 -> [RegExpConstant, RegExpNormalChar] 0 #-----| 1 -> [RegExpConstant, RegExpNormalChar] 9 -# 19| [RegExpConstant, RegExpNormalChar] 9 +# 32| [RegExpConstant, RegExpNormalChar] 9 -# 19| [RegExpConstant, RegExpNormalChar] _ +# 32| [RegExpConstant, RegExpNormalChar] _ -# 20| [RegExpCaret] \A +# 33| [RegExpCaret] \A -# 20| [RegExpSequence] \A[+-]?\d+ +# 33| [RegExpSequence] \A[+-]?\d+ #-----| 0 -> [RegExpCaret] \A #-----| 1 -> [RegExpOpt] [+-]? #-----| 2 -> [RegExpPlus] \d+ -# 20| [RegExpCharacterClass] [+-] +# 33| [RegExpCharacterClass] [+-] #-----| 0 -> [RegExpConstant, RegExpNormalChar] + #-----| 1 -> [RegExpConstant, RegExpNormalChar] - -# 20| [RegExpOpt] [+-]? +# 33| [RegExpOpt] [+-]? #-----| 0 -> [RegExpCharacterClass] [+-] -# 20| [RegExpConstant, RegExpNormalChar] + +# 33| [RegExpConstant, RegExpNormalChar] + -# 20| [RegExpConstant, RegExpNormalChar] - +# 33| [RegExpConstant, RegExpNormalChar] - -# 20| [RegExpCharacterClassEscape] \d +# 33| [RegExpCharacterClassEscape] \d -# 20| [RegExpPlus] \d+ +# 33| [RegExpPlus] \d+ #-----| 0 -> [RegExpCharacterClassEscape] \d -# 21| [RegExpCharacterClass] [\w] +# 34| [RegExpCharacterClass] [\w] #-----| 0 -> [RegExpCharacterClassEscape] \w -# 21| [RegExpPlus] [\w]+ +# 34| [RegExpPlus] [\w]+ #-----| 0 -> [RegExpCharacterClass] [\w] -# 21| [RegExpCharacterClassEscape] \w +# 34| [RegExpCharacterClassEscape] \w -# 22| [RegExpConstant, RegExpEscape] \[ +# 35| [RegExpConstant, RegExpEscape] \[ -# 22| [RegExpSequence] \[\][123] +# 35| [RegExpSequence] \[\][123] #-----| 0 -> [RegExpConstant, RegExpEscape] \[ #-----| 1 -> [RegExpConstant, RegExpEscape] \] #-----| 2 -> [RegExpCharacterClass] [123] -# 22| [RegExpConstant, RegExpEscape] \] +# 35| [RegExpConstant, RegExpEscape] \] -# 22| [RegExpCharacterClass] [123] +# 35| [RegExpCharacterClass] [123] #-----| 0 -> [RegExpConstant, RegExpNormalChar] 1 #-----| 1 -> [RegExpConstant, RegExpNormalChar] 2 #-----| 2 -> [RegExpConstant, RegExpNormalChar] 3 -# 22| [RegExpConstant, RegExpNormalChar] 1 +# 35| [RegExpConstant, RegExpNormalChar] 1 -# 22| [RegExpConstant, RegExpNormalChar] 2 +# 35| [RegExpConstant, RegExpNormalChar] 2 -# 22| [RegExpConstant, RegExpNormalChar] 3 +# 35| [RegExpConstant, RegExpNormalChar] 3 -# 23| [RegExpCharacterClass] [^A-Z] +# 36| [RegExpCharacterClass] [^A-Z] #-----| 0 -> [RegExpCharacterRange] A-Z -# 23| [RegExpConstant, RegExpNormalChar] A +# 36| [RegExpConstant, RegExpNormalChar] A -# 23| [RegExpCharacterRange] A-Z +# 36| [RegExpCharacterRange] A-Z #-----| 0 -> [RegExpConstant, RegExpNormalChar] A #-----| 1 -> [RegExpConstant, RegExpNormalChar] Z -# 23| [RegExpConstant, RegExpNormalChar] Z +# 36| [RegExpConstant, RegExpNormalChar] Z -# 24| [RegExpCharacterClass] []] +# 37| [RegExpCharacterClass] []] #-----| 0 -> [RegExpConstant, RegExpNormalChar] ] -# 24| [RegExpConstant, RegExpNormalChar] ] +# 37| [RegExpConstant, RegExpNormalChar] ] -# 25| [RegExpCharacterClass] [^]] +# 38| [RegExpCharacterClass] [^]] #-----| 0 -> [RegExpConstant, RegExpNormalChar] ] -# 25| [RegExpConstant, RegExpNormalChar] ] +# 38| [RegExpConstant, RegExpNormalChar] ] -# 26| [RegExpCharacterClass] [^-] +# 39| [RegExpCharacterClass] [^-] #-----| 0 -> [RegExpConstant, RegExpNormalChar] - -# 26| [RegExpConstant, RegExpNormalChar] - +# 39| [RegExpConstant, RegExpNormalChar] - -# 27| [RegExpCharacterClass] [|] +# 40| [RegExpCharacterClass] [|] #-----| 0 -> [RegExpConstant, RegExpNormalChar] | -# 27| [RegExpConstant, RegExpNormalChar] | +# 40| [RegExpConstant, RegExpNormalChar] | -# 30| [RegExpCharacterClass] [[a-f] +# 43| [RegExpCharacterClass] [[a-f] #-----| 0 -> [RegExpConstant, RegExpNormalChar] [ #-----| 1 -> [RegExpCharacterRange] a-f -# 30| [RegExpSequence] [[a-f]A-F] +# 43| [RegExpSequence] [[a-f]A-F] #-----| 0 -> [RegExpCharacterClass] [[a-f] #-----| 1 -> [RegExpConstant, RegExpNormalChar] A-F] -# 30| [RegExpConstant, RegExpNormalChar] [ +# 43| [RegExpConstant, RegExpNormalChar] [ -# 30| [RegExpConstant, RegExpNormalChar] a +# 43| [RegExpConstant, RegExpNormalChar] a -# 30| [RegExpCharacterRange] a-f +# 43| [RegExpCharacterRange] a-f #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] f -# 30| [RegExpConstant, RegExpNormalChar] f +# 43| [RegExpConstant, RegExpNormalChar] f -# 30| [RegExpConstant, RegExpNormalChar] A-F] +# 43| [RegExpConstant, RegExpNormalChar] A-F] -# 33| [RegExpDot] . +# 46| [RegExpDot] . -# 33| [RegExpStar] .* +# 46| [RegExpStar] .* #-----| 0 -> [RegExpDot] . -# 34| [RegExpDot] . +# 47| [RegExpDot] . -# 34| [RegExpStar] .* +# 47| [RegExpStar] .* #-----| 0 -> [RegExpDot] . -# 35| [RegExpCharacterClassEscape] \w +# 48| [RegExpCharacterClassEscape] \w -# 35| [RegExpPlus] \w+ +# 48| [RegExpPlus] \w+ #-----| 0 -> [RegExpCharacterClassEscape] \w -# 35| [RegExpSequence] \w+\W +# 48| [RegExpSequence] \w+\W #-----| 0 -> [RegExpPlus] \w+ #-----| 1 -> [RegExpCharacterClassEscape] \W -# 35| [RegExpCharacterClassEscape] \W +# 48| [RegExpCharacterClassEscape] \W -# 36| [RegExpCharacterClassEscape] \s +# 49| [RegExpCharacterClassEscape] \s -# 36| [RegExpSequence] \s\S +# 49| [RegExpSequence] \s\S #-----| 0 -> [RegExpCharacterClassEscape] \s #-----| 1 -> [RegExpCharacterClassEscape] \S -# 36| [RegExpCharacterClassEscape] \S +# 49| [RegExpCharacterClassEscape] \S -# 37| [RegExpCharacterClassEscape] \d +# 50| [RegExpCharacterClassEscape] \d -# 37| [RegExpSequence] \d\D +# 50| [RegExpSequence] \d\D #-----| 0 -> [RegExpCharacterClassEscape] \d #-----| 1 -> [RegExpCharacterClassEscape] \D -# 37| [RegExpCharacterClassEscape] \D +# 50| [RegExpCharacterClassEscape] \D -# 38| [RegExpCharacterClassEscape] \h +# 51| [RegExpCharacterClassEscape] \h -# 38| [RegExpSequence] \h\H +# 51| [RegExpSequence] \h\H #-----| 0 -> [RegExpCharacterClassEscape] \h #-----| 1 -> [RegExpCharacterClassEscape] \H -# 38| [RegExpCharacterClassEscape] \H +# 51| [RegExpCharacterClassEscape] \H -# 39| [RegExpConstant, RegExpEscape] \n +# 52| [RegExpConstant, RegExpEscape] \n -# 39| [RegExpSequence] \n\r\t +# 52| [RegExpSequence] \n\r\t #-----| 0 -> [RegExpConstant, RegExpEscape] \n #-----| 1 -> [RegExpConstant, RegExpEscape] \r #-----| 2 -> [RegExpConstant, RegExpEscape] \t -# 39| [RegExpConstant, RegExpEscape] \r +# 52| [RegExpConstant, RegExpEscape] \r -# 39| [RegExpConstant, RegExpEscape] \t +# 52| [RegExpConstant, RegExpEscape] \t -# 42| [RegExpSpecialChar] \G +# 55| [RegExpSpecialChar] \G -# 42| [RegExpSequence] \Gabc +# 55| [RegExpSequence] \Gabc #-----| 0 -> [RegExpSpecialChar] \G #-----| 1 -> [RegExpConstant, RegExpNormalChar] abc -# 42| [RegExpConstant, RegExpNormalChar] abc +# 55| [RegExpConstant, RegExpNormalChar] abc -# 43| [RegExpSpecialChar] \b +# 56| [RegExpSpecialChar] \b -# 43| [RegExpSequence] \b!a\B +# 56| [RegExpSequence] \b!a\B #-----| 0 -> [RegExpSpecialChar] \b #-----| 1 -> [RegExpConstant, RegExpNormalChar] !a #-----| 2 -> [RegExpNonWordBoundary] \B -# 43| [RegExpConstant, RegExpNormalChar] !a +# 56| [RegExpConstant, RegExpNormalChar] !a -# 43| [RegExpNonWordBoundary] \B +# 56| [RegExpNonWordBoundary] \B -# 46| [RegExpGroup] (foo) +# 59| [RegExpGroup] (foo) #-----| 0 -> [RegExpConstant, RegExpNormalChar] foo -# 46| [RegExpStar] (foo)* +# 59| [RegExpStar] (foo)* #-----| 0 -> [RegExpGroup] (foo) -# 46| [RegExpSequence] (foo)*bar +# 59| [RegExpSequence] (foo)*bar #-----| 0 -> [RegExpStar] (foo)* #-----| 1 -> [RegExpConstant, RegExpNormalChar] bar -# 46| [RegExpConstant, RegExpNormalChar] foo +# 59| [RegExpConstant, RegExpNormalChar] foo -# 46| [RegExpConstant, RegExpNormalChar] bar +# 59| [RegExpConstant, RegExpNormalChar] bar -# 47| [RegExpConstant, RegExpNormalChar] fo +# 60| [RegExpConstant, RegExpNormalChar] fo -# 47| [RegExpSequence] fo(o|b)ar +# 60| [RegExpSequence] fo(o|b)ar #-----| 0 -> [RegExpConstant, RegExpNormalChar] fo #-----| 1 -> [RegExpGroup] (o|b) #-----| 2 -> [RegExpConstant, RegExpNormalChar] ar -# 47| [RegExpGroup] (o|b) +# 60| [RegExpGroup] (o|b) #-----| 0 -> [RegExpAlt] o|b -# 47| [RegExpConstant, RegExpNormalChar] o +# 60| [RegExpConstant, RegExpNormalChar] o -# 47| [RegExpAlt] o|b +# 60| [RegExpAlt] o|b #-----| 0 -> [RegExpConstant, RegExpNormalChar] o #-----| 1 -> [RegExpConstant, RegExpNormalChar] b -# 47| [RegExpConstant, RegExpNormalChar] b +# 60| [RegExpConstant, RegExpNormalChar] b -# 47| [RegExpConstant, RegExpNormalChar] ar +# 60| [RegExpConstant, RegExpNormalChar] ar -# 48| [RegExpGroup] (a|b|cd) +# 61| [RegExpGroup] (a|b|cd) #-----| 0 -> [RegExpAlt] a|b|cd -# 48| [RegExpSequence] (a|b|cd)e +# 61| [RegExpSequence] (a|b|cd)e #-----| 0 -> [RegExpGroup] (a|b|cd) #-----| 1 -> [RegExpConstant, RegExpNormalChar] e -# 48| [RegExpConstant, RegExpNormalChar] a +# 61| [RegExpConstant, RegExpNormalChar] a -# 48| [RegExpAlt] a|b|cd +# 61| [RegExpAlt] a|b|cd #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] b #-----| 2 -> [RegExpConstant, RegExpNormalChar] cd -# 48| [RegExpConstant, RegExpNormalChar] b +# 61| [RegExpConstant, RegExpNormalChar] b -# 48| [RegExpConstant, RegExpNormalChar] cd +# 61| [RegExpConstant, RegExpNormalChar] cd -# 48| [RegExpConstant, RegExpNormalChar] e +# 61| [RegExpConstant, RegExpNormalChar] e -# 49| [RegExpGroup] (?::+) +# 62| [RegExpGroup] (?::+) #-----| 0 -> [RegExpPlus] :+ -# 49| [RegExpSequence] (?::+)\w +# 62| [RegExpSequence] (?::+)\w #-----| 0 -> [RegExpGroup] (?::+) #-----| 1 -> [RegExpCharacterClassEscape] \w -# 49| [RegExpConstant, RegExpNormalChar] : +# 62| [RegExpConstant, RegExpNormalChar] : -# 49| [RegExpPlus] :+ +# 62| [RegExpPlus] :+ #-----| 0 -> [RegExpConstant, RegExpNormalChar] : -# 49| [RegExpCharacterClassEscape] \w +# 62| [RegExpCharacterClassEscape] \w -# 52| [RegExpGroup] (?\w+) +# 65| [RegExpGroup] (?\w+) #-----| 0 -> [RegExpPlus] \w+ -# 52| [RegExpCharacterClassEscape] \w +# 65| [RegExpCharacterClassEscape] \w -# 52| [RegExpPlus] \w+ +# 65| [RegExpPlus] \w+ #-----| 0 -> [RegExpCharacterClassEscape] \w -# 53| [RegExpGroup] (?'foo'fo+) +# 66| [RegExpGroup] (?'foo'fo+) #-----| 0 -> [RegExpSequence] fo+ -# 53| [RegExpConstant, RegExpNormalChar] f +# 66| [RegExpConstant, RegExpNormalChar] f -# 53| [RegExpSequence] fo+ +# 66| [RegExpSequence] fo+ #-----| 0 -> [RegExpConstant, RegExpNormalChar] f #-----| 1 -> [RegExpPlus] o+ -# 53| [RegExpConstant, RegExpNormalChar] o +# 66| [RegExpConstant, RegExpNormalChar] o -# 53| [RegExpPlus] o+ +# 66| [RegExpPlus] o+ #-----| 0 -> [RegExpConstant, RegExpNormalChar] o -# 56| [RegExpGroup] (a+) +# 69| [RegExpGroup] (a+) #-----| 0 -> [RegExpPlus] a+ -# 56| [RegExpSequence] (a+)b+\1 +# 69| [RegExpSequence] (a+)b+\1 #-----| 0 -> [RegExpGroup] (a+) #-----| 1 -> [RegExpPlus] b+ #-----| 2 -> [RegExpBackRef] \1 -# 56| [RegExpConstant, RegExpNormalChar] a +# 69| [RegExpConstant, RegExpNormalChar] a -# 56| [RegExpPlus] a+ +# 69| [RegExpPlus] a+ #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 56| [RegExpConstant, RegExpNormalChar] b +# 69| [RegExpConstant, RegExpNormalChar] b -# 56| [RegExpPlus] b+ +# 69| [RegExpPlus] b+ #-----| 0 -> [RegExpConstant, RegExpNormalChar] b -# 56| [RegExpBackRef] \1 +# 69| [RegExpBackRef] \1 -# 57| [RegExpGroup] (?q+) +# 70| [RegExpGroup] (?q+) #-----| 0 -> [RegExpPlus] q+ -# 57| [RegExpSequence] (?q+)\s+\k+ +# 70| [RegExpSequence] (?q+)\s+\k+ #-----| 0 -> [RegExpGroup] (?q+) #-----| 1 -> [RegExpPlus] \s+ #-----| 2 -> [RegExpPlus] \k+ -# 57| [RegExpConstant, RegExpNormalChar] q +# 70| [RegExpConstant, RegExpNormalChar] q -# 57| [RegExpPlus] q+ +# 70| [RegExpPlus] q+ #-----| 0 -> [RegExpConstant, RegExpNormalChar] q -# 57| [RegExpCharacterClassEscape] \s +# 70| [RegExpCharacterClassEscape] \s -# 57| [RegExpPlus] \s+ +# 70| [RegExpPlus] \s+ #-----| 0 -> [RegExpCharacterClassEscape] \s -# 57| [RegExpBackRef] \k +# 70| [RegExpBackRef] \k -# 57| [RegExpPlus] \k+ +# 70| [RegExpPlus] \k+ #-----| 0 -> [RegExpBackRef] \k -# 60| [RegExpNamedCharacterProperty] \p{Word} +# 73| [RegExpNamedCharacterProperty] \p{Word} -# 60| [RegExpStar] \p{Word}* +# 73| [RegExpStar] \p{Word}* #-----| 0 -> [RegExpNamedCharacterProperty] \p{Word} -# 61| [RegExpNamedCharacterProperty] \P{Digit} +# 74| [RegExpNamedCharacterProperty] \P{Digit} -# 61| [RegExpPlus] \P{Digit}+ +# 74| [RegExpPlus] \P{Digit}+ #-----| 0 -> [RegExpNamedCharacterProperty] \P{Digit} -# 62| [RegExpNamedCharacterProperty] \p{^Alnum} +# 75| [RegExpNamedCharacterProperty] \p{^Alnum} -# 62| [RegExpRange] \p{^Alnum}{2,3} +# 75| [RegExpRange] \p{^Alnum}{2,3} #-----| 0 -> [RegExpNamedCharacterProperty] \p{^Alnum} -# 63| [RegExpCharacterClass] [a-f\p{Digit}] +# 76| [RegExpCharacterClass] [a-f\p{Digit}] #-----| 0 -> [RegExpCharacterRange] a-f #-----| 1 -> [RegExpNamedCharacterProperty] \p{Digit} -# 63| [RegExpPlus] [a-f\p{Digit}]+ +# 76| [RegExpPlus] [a-f\p{Digit}]+ #-----| 0 -> [RegExpCharacterClass] [a-f\p{Digit}] -# 63| [RegExpConstant, RegExpNormalChar] a +# 76| [RegExpConstant, RegExpNormalChar] a -# 63| [RegExpCharacterRange] a-f +# 76| [RegExpCharacterRange] a-f #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] f -# 63| [RegExpConstant, RegExpNormalChar] f +# 76| [RegExpConstant, RegExpNormalChar] f -# 63| [RegExpNamedCharacterProperty] \p{Digit} +# 76| [RegExpNamedCharacterProperty] \p{Digit} -# 66| [RegExpCharacterClass] [[:alpha:]] +# 79| [RegExpCharacterClass] [[:alpha:]] #-----| 0 -> [RegExpNamedCharacterProperty] [:alpha:] -# 66| [RegExpSequence] [[:alpha:]][[:digit:]] +# 79| [RegExpSequence] [[:alpha:]][[:digit:]] #-----| 0 -> [RegExpCharacterClass] [[:alpha:]] #-----| 1 -> [RegExpCharacterClass] [[:digit:]] -# 66| [RegExpNamedCharacterProperty] [:alpha:] +# 79| [RegExpNamedCharacterProperty] [:alpha:] -# 66| [RegExpCharacterClass] [[:digit:]] +# 79| [RegExpCharacterClass] [[:digit:]] #-----| 0 -> [RegExpNamedCharacterProperty] [:digit:] -# 66| [RegExpNamedCharacterProperty] [:digit:] +# 79| [RegExpNamedCharacterProperty] [:digit:] -# 69| [RegExpCharacterClass] [[:alpha:][:digit:]] +# 82| [RegExpCharacterClass] [[:alpha:][:digit:]] #-----| 0 -> [RegExpNamedCharacterProperty] [:alpha:] #-----| 1 -> [RegExpNamedCharacterProperty] [:digit:] -# 69| [RegExpNamedCharacterProperty] [:alpha:] +# 82| [RegExpNamedCharacterProperty] [:alpha:] -# 69| [RegExpNamedCharacterProperty] [:digit:] +# 82| [RegExpNamedCharacterProperty] [:digit:] -# 72| [RegExpCharacterClass] [A-F[:digit:]a-f] +# 85| [RegExpCharacterClass] [A-F[:digit:]a-f] #-----| 0 -> [RegExpCharacterRange] A-F #-----| 1 -> [RegExpNamedCharacterProperty] [:digit:] #-----| 2 -> [RegExpCharacterRange] a-f -# 72| [RegExpConstant, RegExpNormalChar] A +# 85| [RegExpConstant, RegExpNormalChar] A -# 72| [RegExpCharacterRange] A-F +# 85| [RegExpCharacterRange] A-F #-----| 0 -> [RegExpConstant, RegExpNormalChar] A #-----| 1 -> [RegExpConstant, RegExpNormalChar] F -# 72| [RegExpConstant, RegExpNormalChar] F +# 85| [RegExpConstant, RegExpNormalChar] F -# 72| [RegExpNamedCharacterProperty] [:digit:] +# 85| [RegExpNamedCharacterProperty] [:digit:] -# 72| [RegExpConstant, RegExpNormalChar] a +# 85| [RegExpConstant, RegExpNormalChar] a -# 72| [RegExpCharacterRange] a-f +# 85| [RegExpCharacterRange] a-f #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] f -# 72| [RegExpConstant, RegExpNormalChar] f +# 85| [RegExpConstant, RegExpNormalChar] f -# 75| [RegExpNamedCharacterProperty] [:digit:] +# 88| [RegExpNamedCharacterProperty] [:digit:] -# 79| [RegExpConstant, RegExpNormalChar] abc - -# 82| [RegExpConstant, RegExpEscape] \u{987 +# 91| [RegExpConstant, RegExpEscape] \u{987 diff --git a/cpp/ql/test/library-tests/regex/parse.ql b/cpp/ql/test/library-tests/regex/parse.ql index ba9a04ab9bd7..2e9debf3784a 100644 --- a/cpp/ql/test/library-tests/regex/parse.ql +++ b/cpp/ql/test/library-tests/regex/parse.ql @@ -2,8 +2,14 @@ * @kind graph */ +import semmle.code.cpp.regex.internal.ParseRegExp import semmle.code.cpp.regex.RegexTreeView +// Stop gap for missing flow configs +class RegExpTest extends RegExp { + RegExpTest() { any() } +} + query predicate nodes(RegExpTerm n, string attr, string val) { attr = "semmle.label" and val = "[" + concat(n.getAPrimaryQlClass(), ", ") + "] " + n.toString() diff --git a/cpp/ql/test/library-tests/regex/regexp.cpp b/cpp/ql/test/library-tests/regex/regexp.cpp index a68c4878094f..944cf3aa2dbb 100644 --- a/cpp/ql/test/library-tests/regex/regexp.cpp +++ b/cpp/ql/test/library-tests/regex/regexp.cpp @@ -1,82 +1,91 @@ -# Empty -// - -# Basic sequence -/abc/ - -# Repetition -/a*b+c?d/ -/a{4,8}/ -/a{,8}/ -/a{3,}/ -/a{7}/ - -# Alternation -/foo|bar/ - -# Character classes -/[abc]/ -/[a-fA-F0-9_]/ -/\A[+-]?\d+/ -/[\w]+/ -/\[\][123]/ -/[^A-Z]/ -/[]]/ # MRI gives a warning, but accepts this as matching ']' -/[^]]/ # MRI gives a warning, but accepts this as matching anything except ']' -/[^-]/ -/[|]/ - -# Nested character classes -/[[a-f]A-F]/ # BAD - not parsed correctly - -# Meta-character classes -/.*/ -/.*/m -/\w+\W/ -/\s\S/ -/\d\D/ -/\h\H/ -/\n\r\t/ - -# Anchors -/\Gabc/ -/\b!a\B/ - -# Groups -/(foo)*bar/ -/fo(o|b)ar/ -/(a|b|cd)e/ -/(?::+)\w/ # Non-capturing group matching colons - -# Named groups -/(?\w+)/ -/(?'foo'fo+)/ - -# Backreferences -/(a+)b+\1/ -/(?q+)\s+\k+/ - -# Named character properties using the p-style syntax -/\p{Word}*/ -/\P{Digit}+/ -/\p{^Alnum}{2,3}/ -/[a-f\p{Digit}]+/ # Also valid inside character classes - -# Two separate character classes, each containing a single POSIX bracket expression -/[[:alpha:]][[:digit:]]/ - -# A single character class containing two POSIX bracket expressions -/[[:alpha:][:digit:]]/ - -# A single character class containing two ranges and one POSIX bracket expression -/[A-F[:digit:]a-f]/ - -# *Not* a POSIX bracket expression; just a regular character class. -/[:digit:]/ - -# Simple constant interpolation -A = "a" -/#{A}bc/ - -# unicode -/\u{9879}/ \ No newline at end of file +// semmle-extractor-options: -std=c++17 + +namespace std { + template + class basic_regex { + public: + basic_regex(const CharT *s) {} + basic_regex(const CharT *s, int flags) {} + basic_regex &assign(const CharT *s) { return *this; } + }; + typedef basic_regex regex; +} // namespace std + +// Empty +std::regex r_empty(""); + +// Basic sequence +std::regex r_abc("abc"); + +// Repetition +std::regex r_rep1("a*b+c?d"); +std::regex r_rep2("a{4,8}"); +std::regex r_rep3("a{,8}"); +std::regex r_rep4("a{3,}"); +std::regex r_rep5("a{7}"); + +// Alternation +std::regex r_alt("foo|bar"); + +// Character classes +std::regex r_cc1("[abc]"); +std::regex r_cc2("[a-fA-F0-9_]"); +std::regex r_cc3("\\A[+-]?\\d+"); +std::regex r_cc4("[\\w]+"); +std::regex r_cc5("\\[\\][123]"); +std::regex r_cc6("[^A-Z]"); +std::regex r_cc7("[]]"); // MRI gives a warning, but accepts this as matching ']' +std::regex r_cc8("[^]]"); // MRI gives a warning, but accepts this as matching anything except ']' +std::regex r_cc9("[^-]"); +std::regex r_cc10("[|]"); + +// Nested character classes (BAD - not parsed correctly) +std::regex r_nested("[[a-f]A-F]"); + +// Meta-character classes +std::regex r_meta1(".*"); +std::regex r_meta1m(".*"); // /.*/m mode variant — mode flags are constructor args in C++ +std::regex r_meta2("\\w+\\W"); +std::regex r_meta3("\\s\\S"); +std::regex r_meta4("\\d\\D"); +std::regex r_meta5("\\h\\H"); +std::regex r_meta6("\\n\\r\\t"); + +// Anchors +std::regex r_anc1("\\Gabc"); +std::regex r_anc2("\\b!a\\B"); + +// Groups +std::regex r_grp1("(foo)*bar"); +std::regex r_grp2("fo(o|b)ar"); +std::regex r_grp3("(a|b|cd)e"); +std::regex r_grp4("(?::+)\\w"); // Non-capturing group matching colons + +// Named groups +std::regex r_ng1("(?\\w+)"); +std::regex r_ng2("(?'foo'fo+)"); // single-quote named-group form + +// Backreferences +std::regex r_bref1("(a+)b+\\1"); +std::regex r_bref2("(?q+)\\s+\\k+"); + +// Named character properties using the p-style syntax +std::regex r_prop1("\\p{Word}*"); +std::regex r_prop2("\\P{Digit}+"); +std::regex r_prop3("\\p{^Alnum}{2,3}"); +std::regex r_prop4("[a-f\\p{Digit}]+"); // Also valid inside character classes + +// Two separate character classes, each containing a single POSIX bracket expression +std::regex r_posix1("[[:alpha:]][[:digit:]]"); + +// A single character class containing two POSIX bracket expressions +std::regex r_posix2("[[:alpha:][:digit:]]"); + +// A single character class containing two ranges and one POSIX bracket expression +std::regex r_posix3("[A-F[:digit:]a-f]"); + +// *Not* a POSIX bracket expression; just a regular character class. +std::regex r_posix4("[:digit:]"); + +// unicode +std::regex r_uni("\\u{9879}"); diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index e464b5ce5ea5..6b2409e7c7c0 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -1,270 +1,268 @@ groupName -| regexp.rb:52:2:52:11 | (?\\w+) | id | -| regexp.rb:53:2:53:12 | (?'foo'fo+) | foo | -| regexp.rb:57:2:57:11 | (?q+) | qux | +| regexp.cpp:65:19:65:28 | (?\\w+) | id | +| regexp.cpp:66:19:66:29 | (?'foo'fo+) | foo | +| regexp.cpp:70:21:70:30 | (?q+) | qux | groupNumber -| regexp.rb:46:2:46:6 | (foo) | 1 | -| regexp.rb:47:4:47:8 | (o\|b) | 1 | -| regexp.rb:48:2:48:9 | (a\|b\|cd) | 1 | -| regexp.rb:53:2:53:12 | (?'foo'fo+) | 1 | -| regexp.rb:56:2:56:5 | (a+) | 1 | +| regexp.cpp:59:20:59:24 | (foo) | 1 | +| regexp.cpp:60:22:60:26 | (o\|b) | 1 | +| regexp.cpp:61:20:61:27 | (a\|b\|cd) | 1 | +| regexp.cpp:66:19:66:29 | (?'foo'fo+) | 1 | +| regexp.cpp:69:21:69:24 | (a+) | 1 | term -| regexp.rb:5:2:5:4 | abc | RegExpConstant,RegExpNormalChar | -| regexp.rb:8:2:8:2 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:8:2:8:3 | a* | RegExpStar | -| regexp.rb:8:2:8:8 | a*b+c?d | RegExpSequence | -| regexp.rb:8:4:8:4 | b | RegExpConstant,RegExpNormalChar | -| regexp.rb:8:4:8:5 | b+ | RegExpPlus | -| regexp.rb:8:6:8:6 | c | RegExpConstant,RegExpNormalChar | -| regexp.rb:8:6:8:7 | c? | RegExpOpt | -| regexp.rb:8:8:8:8 | d | RegExpConstant,RegExpNormalChar | -| regexp.rb:9:2:9:2 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:9:2:9:7 | a{4,8} | RegExpRange | -| regexp.rb:10:2:10:2 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:10:2:10:6 | a{,8} | RegExpRange | -| regexp.rb:11:2:11:2 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:11:2:11:6 | a{3,} | InfiniteRepetitionQuantifier,RegExpRange | -| regexp.rb:12:2:12:2 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:12:2:12:5 | a{7} | RegExpRange | -| regexp.rb:15:2:15:4 | foo | RegExpConstant,RegExpNormalChar | -| regexp.rb:15:2:15:8 | foo\|bar | RegExpAlt | -| regexp.rb:15:6:15:8 | bar | RegExpConstant,RegExpNormalChar | -| regexp.rb:18:2:18:6 | [abc] | RegExpCharacterClass | -| regexp.rb:18:3:18:3 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:18:4:18:4 | b | RegExpConstant,RegExpNormalChar | -| regexp.rb:18:5:18:5 | c | RegExpConstant,RegExpNormalChar | -| regexp.rb:19:2:19:13 | [a-fA-F0-9_] | RegExpCharacterClass | -| regexp.rb:19:3:19:3 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:19:3:19:5 | a-f | RegExpCharacterRange | -| regexp.rb:19:5:19:5 | f | RegExpConstant,RegExpNormalChar | -| regexp.rb:19:6:19:6 | A | RegExpConstant,RegExpNormalChar | -| regexp.rb:19:6:19:8 | A-F | RegExpCharacterRange | -| regexp.rb:19:8:19:8 | F | RegExpConstant,RegExpNormalChar | -| regexp.rb:19:9:19:9 | 0 | RegExpConstant,RegExpNormalChar | -| regexp.rb:19:9:19:11 | 0-9 | RegExpCharacterRange | -| regexp.rb:19:11:19:11 | 9 | RegExpConstant,RegExpNormalChar | -| regexp.rb:19:12:19:12 | _ | RegExpConstant,RegExpNormalChar | -| regexp.rb:20:2:20:3 | \\A | RegExpCaret | -| regexp.rb:20:2:20:11 | \\A[+-]?\\d+ | RegExpSequence | -| regexp.rb:20:4:20:7 | [+-] | RegExpCharacterClass | -| regexp.rb:20:4:20:8 | [+-]? | RegExpOpt | -| regexp.rb:20:5:20:5 | + | RegExpConstant,RegExpNormalChar | -| regexp.rb:20:6:20:6 | - | RegExpConstant,RegExpNormalChar | -| regexp.rb:20:9:20:10 | \\d | RegExpCharacterClassEscape | -| regexp.rb:20:9:20:11 | \\d+ | RegExpPlus | -| regexp.rb:21:2:21:5 | [\\w] | RegExpCharacterClass | -| regexp.rb:21:2:21:6 | [\\w]+ | RegExpPlus | -| regexp.rb:21:3:21:4 | \\w | RegExpCharacterClassEscape | -| regexp.rb:22:2:22:3 | \\[ | RegExpConstant,RegExpEscape | -| regexp.rb:22:2:22:10 | \\[\\][123] | RegExpSequence | -| regexp.rb:22:4:22:5 | \\] | RegExpConstant,RegExpEscape | -| regexp.rb:22:6:22:10 | [123] | RegExpCharacterClass | -| regexp.rb:22:7:22:7 | 1 | RegExpConstant,RegExpNormalChar | -| regexp.rb:22:8:22:8 | 2 | RegExpConstant,RegExpNormalChar | -| regexp.rb:22:9:22:9 | 3 | RegExpConstant,RegExpNormalChar | -| regexp.rb:23:2:23:7 | [^A-Z] | RegExpCharacterClass | -| regexp.rb:23:4:23:4 | A | RegExpConstant,RegExpNormalChar | -| regexp.rb:23:4:23:6 | A-Z | RegExpCharacterRange | -| regexp.rb:23:6:23:6 | Z | RegExpConstant,RegExpNormalChar | -| regexp.rb:24:2:24:4 | []] | RegExpCharacterClass | -| regexp.rb:24:3:24:3 | ] | RegExpConstant,RegExpNormalChar | -| regexp.rb:25:2:25:5 | [^]] | RegExpCharacterClass | -| regexp.rb:25:4:25:4 | ] | RegExpConstant,RegExpNormalChar | -| regexp.rb:26:2:26:5 | [^-] | RegExpCharacterClass | -| regexp.rb:26:4:26:4 | - | RegExpConstant,RegExpNormalChar | -| regexp.rb:27:2:27:4 | [\|] | RegExpCharacterClass | -| regexp.rb:27:3:27:3 | \| | RegExpConstant,RegExpNormalChar | -| regexp.rb:30:2:30:7 | [[a-f] | RegExpCharacterClass | -| regexp.rb:30:2:30:11 | [[a-f]A-F] | RegExpSequence | -| regexp.rb:30:3:30:3 | [ | RegExpConstant,RegExpNormalChar | -| regexp.rb:30:4:30:4 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:30:4:30:6 | a-f | RegExpCharacterRange | -| regexp.rb:30:6:30:6 | f | RegExpConstant,RegExpNormalChar | -| regexp.rb:30:8:30:11 | A-F] | RegExpConstant,RegExpNormalChar | -| regexp.rb:33:2:33:2 | . | RegExpDot | -| regexp.rb:33:2:33:3 | .* | RegExpStar | -| regexp.rb:34:2:34:2 | . | RegExpDot | -| regexp.rb:34:2:34:3 | .* | RegExpStar | -| regexp.rb:35:2:35:3 | \\w | RegExpCharacterClassEscape | -| regexp.rb:35:2:35:4 | \\w+ | RegExpPlus | -| regexp.rb:35:2:35:6 | \\w+\\W | RegExpSequence | -| regexp.rb:35:5:35:6 | \\W | RegExpCharacterClassEscape | -| regexp.rb:36:2:36:3 | \\s | RegExpCharacterClassEscape | -| regexp.rb:36:2:36:5 | \\s\\S | RegExpSequence | -| regexp.rb:36:4:36:5 | \\S | RegExpCharacterClassEscape | -| regexp.rb:37:2:37:3 | \\d | RegExpCharacterClassEscape | -| regexp.rb:37:2:37:5 | \\d\\D | RegExpSequence | -| regexp.rb:37:4:37:5 | \\D | RegExpCharacterClassEscape | -| regexp.rb:38:2:38:3 | \\h | RegExpCharacterClassEscape | -| regexp.rb:38:2:38:5 | \\h\\H | RegExpSequence | -| regexp.rb:38:4:38:5 | \\H | RegExpCharacterClassEscape | -| regexp.rb:39:2:39:3 | \\n | RegExpConstant,RegExpEscape | -| regexp.rb:39:2:39:7 | \\n\\r\\t | RegExpSequence | -| regexp.rb:39:4:39:5 | \\r | RegExpConstant,RegExpEscape | -| regexp.rb:39:6:39:7 | \\t | RegExpConstant,RegExpEscape | -| regexp.rb:42:2:42:3 | \\G | RegExpSpecialChar | -| regexp.rb:42:2:42:6 | \\Gabc | RegExpSequence | -| regexp.rb:42:4:42:6 | abc | RegExpConstant,RegExpNormalChar | -| regexp.rb:43:2:43:3 | \\b | RegExpSpecialChar | -| regexp.rb:43:2:43:7 | \\b!a\\B | RegExpSequence | -| regexp.rb:43:4:43:5 | !a | RegExpConstant,RegExpNormalChar | -| regexp.rb:43:6:43:7 | \\B | RegExpNonWordBoundary | -| regexp.rb:46:2:46:6 | (foo) | RegExpGroup | -| regexp.rb:46:2:46:7 | (foo)* | RegExpStar | -| regexp.rb:46:2:46:10 | (foo)*bar | RegExpSequence | -| regexp.rb:46:3:46:5 | foo | RegExpConstant,RegExpNormalChar | -| regexp.rb:46:8:46:10 | bar | RegExpConstant,RegExpNormalChar | -| regexp.rb:47:2:47:3 | fo | RegExpConstant,RegExpNormalChar | -| regexp.rb:47:2:47:10 | fo(o\|b)ar | RegExpSequence | -| regexp.rb:47:4:47:8 | (o\|b) | RegExpGroup | -| regexp.rb:47:5:47:5 | o | RegExpConstant,RegExpNormalChar | -| regexp.rb:47:5:47:7 | o\|b | RegExpAlt | -| regexp.rb:47:7:47:7 | b | RegExpConstant,RegExpNormalChar | -| regexp.rb:47:9:47:10 | ar | RegExpConstant,RegExpNormalChar | -| regexp.rb:48:2:48:9 | (a\|b\|cd) | RegExpGroup | -| regexp.rb:48:2:48:10 | (a\|b\|cd)e | RegExpSequence | -| regexp.rb:48:3:48:3 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:48:3:48:8 | a\|b\|cd | RegExpAlt | -| regexp.rb:48:5:48:5 | b | RegExpConstant,RegExpNormalChar | -| regexp.rb:48:7:48:8 | cd | RegExpConstant,RegExpNormalChar | -| regexp.rb:48:10:48:10 | e | RegExpConstant,RegExpNormalChar | -| regexp.rb:49:2:49:7 | (?::+) | RegExpGroup | -| regexp.rb:49:2:49:9 | (?::+)\\w | RegExpSequence | -| regexp.rb:49:5:49:5 | : | RegExpConstant,RegExpNormalChar | -| regexp.rb:49:5:49:6 | :+ | RegExpPlus | -| regexp.rb:49:8:49:9 | \\w | RegExpCharacterClassEscape | -| regexp.rb:52:2:52:11 | (?\\w+) | RegExpGroup | -| regexp.rb:52:8:52:9 | \\w | RegExpCharacterClassEscape | -| regexp.rb:52:8:52:10 | \\w+ | RegExpPlus | -| regexp.rb:53:2:53:12 | (?'foo'fo+) | RegExpGroup | -| regexp.rb:53:9:53:9 | f | RegExpConstant,RegExpNormalChar | -| regexp.rb:53:9:53:11 | fo+ | RegExpSequence | -| regexp.rb:53:10:53:10 | o | RegExpConstant,RegExpNormalChar | -| regexp.rb:53:10:53:11 | o+ | RegExpPlus | -| regexp.rb:56:2:56:5 | (a+) | RegExpGroup | -| regexp.rb:56:2:56:9 | (a+)b+\\1 | RegExpSequence | -| regexp.rb:56:3:56:3 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:56:3:56:4 | a+ | RegExpPlus | -| regexp.rb:56:6:56:6 | b | RegExpConstant,RegExpNormalChar | -| regexp.rb:56:6:56:7 | b+ | RegExpPlus | -| regexp.rb:56:8:56:9 | \\1 | RegExpBackRef | -| regexp.rb:57:2:57:11 | (?q+) | RegExpGroup | -| regexp.rb:57:2:57:22 | (?q+)\\s+\\k+ | RegExpSequence | -| regexp.rb:57:9:57:9 | q | RegExpConstant,RegExpNormalChar | -| regexp.rb:57:9:57:10 | q+ | RegExpPlus | -| regexp.rb:57:12:57:13 | \\s | RegExpCharacterClassEscape | -| regexp.rb:57:12:57:14 | \\s+ | RegExpPlus | -| regexp.rb:57:15:57:21 | \\k | RegExpBackRef | -| regexp.rb:57:15:57:22 | \\k+ | RegExpPlus | -| regexp.rb:60:2:60:9 | \\p{Word} | RegExpNamedCharacterProperty | -| regexp.rb:60:2:60:10 | \\p{Word}* | RegExpStar | -| regexp.rb:61:2:61:10 | \\P{Digit} | RegExpNamedCharacterProperty | -| regexp.rb:61:2:61:11 | \\P{Digit}+ | RegExpPlus | -| regexp.rb:62:2:62:11 | \\p{^Alnum} | RegExpNamedCharacterProperty | -| regexp.rb:62:2:62:16 | \\p{^Alnum}{2,3} | RegExpRange | -| regexp.rb:63:2:63:15 | [a-f\\p{Digit}] | RegExpCharacterClass | -| regexp.rb:63:2:63:16 | [a-f\\p{Digit}]+ | RegExpPlus | -| regexp.rb:63:3:63:3 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:63:3:63:5 | a-f | RegExpCharacterRange | -| regexp.rb:63:5:63:5 | f | RegExpConstant,RegExpNormalChar | -| regexp.rb:63:6:63:14 | \\p{Digit} | RegExpNamedCharacterProperty | -| regexp.rb:66:2:66:12 | [[:alpha:]] | RegExpCharacterClass | -| regexp.rb:66:2:66:23 | [[:alpha:]][[:digit:]] | RegExpSequence | -| regexp.rb:66:3:66:11 | [:alpha:] | RegExpNamedCharacterProperty | -| regexp.rb:66:13:66:23 | [[:digit:]] | RegExpCharacterClass | -| regexp.rb:66:14:66:22 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.rb:69:2:69:21 | [[:alpha:][:digit:]] | RegExpCharacterClass | -| regexp.rb:69:3:69:11 | [:alpha:] | RegExpNamedCharacterProperty | -| regexp.rb:69:12:69:20 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.rb:72:2:72:18 | [A-F[:digit:]a-f] | RegExpCharacterClass | -| regexp.rb:72:3:72:3 | A | RegExpConstant,RegExpNormalChar | -| regexp.rb:72:3:72:5 | A-F | RegExpCharacterRange | -| regexp.rb:72:5:72:5 | F | RegExpConstant,RegExpNormalChar | -| regexp.rb:72:6:72:14 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.rb:72:15:72:15 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:72:15:72:17 | a-f | RegExpCharacterRange | -| regexp.rb:72:17:72:17 | f | RegExpConstant,RegExpNormalChar | -| regexp.rb:75:2:75:10 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.rb:79:2:79:4 | abc | RegExpConstant,RegExpNormalChar | -| regexp.rb:82:2:82:7 | \\u{987 | RegExpConstant,RegExpEscape | +| regexp.cpp:18:19:18:21 | abc | RegExpConstant,RegExpNormalChar | +| regexp.cpp:21:20:21:20 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:21:20:21:21 | a* | RegExpStar | +| regexp.cpp:21:20:21:26 | a*b+c?d | RegExpSequence | +| regexp.cpp:21:22:21:22 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:21:22:21:23 | b+ | RegExpPlus | +| regexp.cpp:21:24:21:24 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:21:24:21:25 | c? | RegExpOpt | +| regexp.cpp:21:26:21:26 | d | RegExpConstant,RegExpNormalChar | +| regexp.cpp:22:20:22:20 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:22:20:22:25 | a{4,8} | RegExpRange | +| regexp.cpp:23:20:23:20 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:23:20:23:24 | a{,8} | RegExpRange | +| regexp.cpp:24:20:24:20 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:24:20:24:24 | a{3,} | InfiniteRepetitionQuantifier,RegExpRange | +| regexp.cpp:25:20:25:20 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:25:20:25:23 | a{7} | RegExpRange | +| regexp.cpp:28:19:28:21 | foo | RegExpConstant,RegExpNormalChar | +| regexp.cpp:28:19:28:25 | foo\|bar | RegExpAlt | +| regexp.cpp:28:23:28:25 | bar | RegExpConstant,RegExpNormalChar | +| regexp.cpp:31:19:31:23 | [abc] | RegExpCharacterClass | +| regexp.cpp:31:20:31:20 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:31:21:31:21 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:31:22:31:22 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:32:19:32:30 | [a-fA-F0-9_] | RegExpCharacterClass | +| regexp.cpp:32:20:32:20 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:32:20:32:22 | a-f | RegExpCharacterRange | +| regexp.cpp:32:22:32:22 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:32:23:32:23 | A | RegExpConstant,RegExpNormalChar | +| regexp.cpp:32:23:32:25 | A-F | RegExpCharacterRange | +| regexp.cpp:32:25:32:25 | F | RegExpConstant,RegExpNormalChar | +| regexp.cpp:32:26:32:26 | 0 | RegExpConstant,RegExpNormalChar | +| regexp.cpp:32:26:32:28 | 0-9 | RegExpCharacterRange | +| regexp.cpp:32:28:32:28 | 9 | RegExpConstant,RegExpNormalChar | +| regexp.cpp:32:29:32:29 | _ | RegExpConstant,RegExpNormalChar | +| regexp.cpp:33:19:33:20 | \\A | RegExpCaret | +| regexp.cpp:33:19:33:28 | \\A[+-]?\\d+ | RegExpSequence | +| regexp.cpp:33:21:33:24 | [+-] | RegExpCharacterClass | +| regexp.cpp:33:21:33:25 | [+-]? | RegExpOpt | +| regexp.cpp:33:22:33:22 | + | RegExpConstant,RegExpNormalChar | +| regexp.cpp:33:23:33:23 | - | RegExpConstant,RegExpNormalChar | +| regexp.cpp:33:26:33:27 | \\d | RegExpCharacterClassEscape | +| regexp.cpp:33:26:33:28 | \\d+ | RegExpPlus | +| regexp.cpp:34:19:34:22 | [\\w] | RegExpCharacterClass | +| regexp.cpp:34:19:34:23 | [\\w]+ | RegExpPlus | +| regexp.cpp:34:20:34:21 | \\w | RegExpCharacterClassEscape | +| regexp.cpp:35:19:35:20 | \\[ | RegExpConstant,RegExpEscape | +| regexp.cpp:35:19:35:27 | \\[\\][123] | RegExpSequence | +| regexp.cpp:35:21:35:22 | \\] | RegExpConstant,RegExpEscape | +| regexp.cpp:35:23:35:27 | [123] | RegExpCharacterClass | +| regexp.cpp:35:24:35:24 | 1 | RegExpConstant,RegExpNormalChar | +| regexp.cpp:35:25:35:25 | 2 | RegExpConstant,RegExpNormalChar | +| regexp.cpp:35:26:35:26 | 3 | RegExpConstant,RegExpNormalChar | +| regexp.cpp:36:19:36:24 | [^A-Z] | RegExpCharacterClass | +| regexp.cpp:36:21:36:21 | A | RegExpConstant,RegExpNormalChar | +| regexp.cpp:36:21:36:23 | A-Z | RegExpCharacterRange | +| regexp.cpp:36:23:36:23 | Z | RegExpConstant,RegExpNormalChar | +| regexp.cpp:37:19:37:21 | []] | RegExpCharacterClass | +| regexp.cpp:37:20:37:20 | ] | RegExpConstant,RegExpNormalChar | +| regexp.cpp:38:19:38:22 | [^]] | RegExpCharacterClass | +| regexp.cpp:38:21:38:21 | ] | RegExpConstant,RegExpNormalChar | +| regexp.cpp:39:19:39:22 | [^-] | RegExpCharacterClass | +| regexp.cpp:39:21:39:21 | - | RegExpConstant,RegExpNormalChar | +| regexp.cpp:40:20:40:22 | [\|] | RegExpCharacterClass | +| regexp.cpp:40:21:40:21 | \| | RegExpConstant,RegExpNormalChar | +| regexp.cpp:43:22:43:27 | [[a-f] | RegExpCharacterClass | +| regexp.cpp:43:22:43:31 | [[a-f]A-F] | RegExpSequence | +| regexp.cpp:43:23:43:23 | [ | RegExpConstant,RegExpNormalChar | +| regexp.cpp:43:24:43:24 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:43:24:43:26 | a-f | RegExpCharacterRange | +| regexp.cpp:43:26:43:26 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:43:28:43:31 | A-F] | RegExpConstant,RegExpNormalChar | +| regexp.cpp:46:21:46:21 | . | RegExpDot | +| regexp.cpp:46:21:46:22 | .* | RegExpStar | +| regexp.cpp:47:22:47:22 | . | RegExpDot | +| regexp.cpp:47:22:47:23 | .* | RegExpStar | +| regexp.cpp:48:21:48:22 | \\w | RegExpCharacterClassEscape | +| regexp.cpp:48:21:48:23 | \\w+ | RegExpPlus | +| regexp.cpp:48:21:48:25 | \\w+\\W | RegExpSequence | +| regexp.cpp:48:24:48:25 | \\W | RegExpCharacterClassEscape | +| regexp.cpp:49:21:49:22 | \\s | RegExpCharacterClassEscape | +| regexp.cpp:49:21:49:24 | \\s\\S | RegExpSequence | +| regexp.cpp:49:23:49:24 | \\S | RegExpCharacterClassEscape | +| regexp.cpp:50:21:50:22 | \\d | RegExpCharacterClassEscape | +| regexp.cpp:50:21:50:24 | \\d\\D | RegExpSequence | +| regexp.cpp:50:23:50:24 | \\D | RegExpCharacterClassEscape | +| regexp.cpp:51:21:51:22 | \\h | RegExpCharacterClassEscape | +| regexp.cpp:51:21:51:24 | \\h\\H | RegExpSequence | +| regexp.cpp:51:23:51:24 | \\H | RegExpCharacterClassEscape | +| regexp.cpp:52:21:52:22 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:52:21:52:26 | \\n\\r\\t | RegExpSequence | +| regexp.cpp:52:23:52:24 | \\r | RegExpConstant,RegExpEscape | +| regexp.cpp:52:25:52:26 | \\t | RegExpConstant,RegExpEscape | +| regexp.cpp:55:20:55:21 | \\G | RegExpSpecialChar | +| regexp.cpp:55:20:55:24 | \\Gabc | RegExpSequence | +| regexp.cpp:55:22:55:24 | abc | RegExpConstant,RegExpNormalChar | +| regexp.cpp:56:20:56:21 | \\b | RegExpSpecialChar | +| regexp.cpp:56:20:56:25 | \\b!a\\B | RegExpSequence | +| regexp.cpp:56:22:56:23 | !a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:56:24:56:25 | \\B | RegExpNonWordBoundary | +| regexp.cpp:59:20:59:24 | (foo) | RegExpGroup | +| regexp.cpp:59:20:59:25 | (foo)* | RegExpStar | +| regexp.cpp:59:20:59:28 | (foo)*bar | RegExpSequence | +| regexp.cpp:59:21:59:23 | foo | RegExpConstant,RegExpNormalChar | +| regexp.cpp:59:26:59:28 | bar | RegExpConstant,RegExpNormalChar | +| regexp.cpp:60:20:60:21 | fo | RegExpConstant,RegExpNormalChar | +| regexp.cpp:60:20:60:28 | fo(o\|b)ar | RegExpSequence | +| regexp.cpp:60:22:60:26 | (o\|b) | RegExpGroup | +| regexp.cpp:60:23:60:23 | o | RegExpConstant,RegExpNormalChar | +| regexp.cpp:60:23:60:25 | o\|b | RegExpAlt | +| regexp.cpp:60:25:60:25 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:60:27:60:28 | ar | RegExpConstant,RegExpNormalChar | +| regexp.cpp:61:20:61:27 | (a\|b\|cd) | RegExpGroup | +| regexp.cpp:61:20:61:28 | (a\|b\|cd)e | RegExpSequence | +| regexp.cpp:61:21:61:21 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:61:21:61:26 | a\|b\|cd | RegExpAlt | +| regexp.cpp:61:23:61:23 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:61:25:61:26 | cd | RegExpConstant,RegExpNormalChar | +| regexp.cpp:61:28:61:28 | e | RegExpConstant,RegExpNormalChar | +| regexp.cpp:62:20:62:25 | (?::+) | RegExpGroup | +| regexp.cpp:62:20:62:27 | (?::+)\\w | RegExpSequence | +| regexp.cpp:62:23:62:23 | : | RegExpConstant,RegExpNormalChar | +| regexp.cpp:62:23:62:24 | :+ | RegExpPlus | +| regexp.cpp:62:26:62:27 | \\w | RegExpCharacterClassEscape | +| regexp.cpp:65:19:65:28 | (?\\w+) | RegExpGroup | +| regexp.cpp:65:25:65:26 | \\w | RegExpCharacterClassEscape | +| regexp.cpp:65:25:65:27 | \\w+ | RegExpPlus | +| regexp.cpp:66:19:66:29 | (?'foo'fo+) | RegExpGroup | +| regexp.cpp:66:26:66:26 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:66:26:66:28 | fo+ | RegExpSequence | +| regexp.cpp:66:27:66:27 | o | RegExpConstant,RegExpNormalChar | +| regexp.cpp:66:27:66:28 | o+ | RegExpPlus | +| regexp.cpp:69:21:69:24 | (a+) | RegExpGroup | +| regexp.cpp:69:21:69:28 | (a+)b+\\1 | RegExpSequence | +| regexp.cpp:69:22:69:22 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:69:22:69:23 | a+ | RegExpPlus | +| regexp.cpp:69:25:69:25 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:69:25:69:26 | b+ | RegExpPlus | +| regexp.cpp:69:27:69:28 | \\1 | RegExpBackRef | +| regexp.cpp:70:21:70:30 | (?q+) | RegExpGroup | +| regexp.cpp:70:21:70:41 | (?q+)\\s+\\k+ | RegExpSequence | +| regexp.cpp:70:28:70:28 | q | RegExpConstant,RegExpNormalChar | +| regexp.cpp:70:28:70:29 | q+ | RegExpPlus | +| regexp.cpp:70:31:70:32 | \\s | RegExpCharacterClassEscape | +| regexp.cpp:70:31:70:33 | \\s+ | RegExpPlus | +| regexp.cpp:70:34:70:40 | \\k | RegExpBackRef | +| regexp.cpp:70:34:70:41 | \\k+ | RegExpPlus | +| regexp.cpp:73:21:73:28 | \\p{Word} | RegExpNamedCharacterProperty | +| regexp.cpp:73:21:73:29 | \\p{Word}* | RegExpStar | +| regexp.cpp:74:21:74:29 | \\P{Digit} | RegExpNamedCharacterProperty | +| regexp.cpp:74:21:74:30 | \\P{Digit}+ | RegExpPlus | +| regexp.cpp:75:21:75:30 | \\p{^Alnum} | RegExpNamedCharacterProperty | +| regexp.cpp:75:21:75:35 | \\p{^Alnum}{2,3} | RegExpRange | +| regexp.cpp:76:21:76:34 | [a-f\\p{Digit}] | RegExpCharacterClass | +| regexp.cpp:76:21:76:35 | [a-f\\p{Digit}]+ | RegExpPlus | +| regexp.cpp:76:22:76:22 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:76:22:76:24 | a-f | RegExpCharacterRange | +| regexp.cpp:76:24:76:24 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:76:25:76:33 | \\p{Digit} | RegExpNamedCharacterProperty | +| regexp.cpp:79:22:79:32 | [[:alpha:]] | RegExpCharacterClass | +| regexp.cpp:79:22:79:43 | [[:alpha:]][[:digit:]] | RegExpSequence | +| regexp.cpp:79:23:79:31 | [:alpha:] | RegExpNamedCharacterProperty | +| regexp.cpp:79:33:79:43 | [[:digit:]] | RegExpCharacterClass | +| regexp.cpp:79:34:79:42 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:82:22:82:41 | [[:alpha:][:digit:]] | RegExpCharacterClass | +| regexp.cpp:82:23:82:31 | [:alpha:] | RegExpNamedCharacterProperty | +| regexp.cpp:82:32:82:40 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:85:22:85:38 | [A-F[:digit:]a-f] | RegExpCharacterClass | +| regexp.cpp:85:23:85:23 | A | RegExpConstant,RegExpNormalChar | +| regexp.cpp:85:23:85:25 | A-F | RegExpCharacterRange | +| regexp.cpp:85:25:85:25 | F | RegExpConstant,RegExpNormalChar | +| regexp.cpp:85:26:85:34 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:85:35:85:35 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:85:35:85:37 | a-f | RegExpCharacterRange | +| regexp.cpp:85:37:85:37 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:88:22:88:30 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:91:19:91:24 | \\u{987 | RegExpConstant,RegExpEscape | regExpNormalCharValue -| regexp.rb:5:2:5:4 | abc | abc | -| regexp.rb:8:2:8:2 | a | a | -| regexp.rb:8:4:8:4 | b | b | -| regexp.rb:8:6:8:6 | c | c | -| regexp.rb:8:8:8:8 | d | d | -| regexp.rb:9:2:9:2 | a | a | -| regexp.rb:10:2:10:2 | a | a | -| regexp.rb:11:2:11:2 | a | a | -| regexp.rb:12:2:12:2 | a | a | -| regexp.rb:15:2:15:4 | foo | foo | -| regexp.rb:15:6:15:8 | bar | bar | -| regexp.rb:18:3:18:3 | a | a | -| regexp.rb:18:4:18:4 | b | b | -| regexp.rb:18:5:18:5 | c | c | -| regexp.rb:19:3:19:3 | a | a | -| regexp.rb:19:5:19:5 | f | f | -| regexp.rb:19:6:19:6 | A | A | -| regexp.rb:19:8:19:8 | F | F | -| regexp.rb:19:9:19:9 | 0 | 0 | -| regexp.rb:19:11:19:11 | 9 | 9 | -| regexp.rb:19:12:19:12 | _ | _ | -| regexp.rb:20:5:20:5 | + | + | -| regexp.rb:20:6:20:6 | - | - | -| regexp.rb:20:9:20:10 | \\d | d | -| regexp.rb:21:3:21:4 | \\w | w | -| regexp.rb:22:2:22:3 | \\[ | [ | -| regexp.rb:22:4:22:5 | \\] | ] | -| regexp.rb:22:7:22:7 | 1 | 1 | -| regexp.rb:22:8:22:8 | 2 | 2 | -| regexp.rb:22:9:22:9 | 3 | 3 | -| regexp.rb:23:4:23:4 | A | A | -| regexp.rb:23:6:23:6 | Z | Z | -| regexp.rb:24:3:24:3 | ] | ] | -| regexp.rb:25:4:25:4 | ] | ] | -| regexp.rb:26:4:26:4 | - | - | -| regexp.rb:27:3:27:3 | \| | \| | -| regexp.rb:30:3:30:3 | [ | [ | -| regexp.rb:30:4:30:4 | a | a | -| regexp.rb:30:6:30:6 | f | f | -| regexp.rb:30:8:30:11 | A-F] | A-F] | -| regexp.rb:35:2:35:3 | \\w | w | -| regexp.rb:35:5:35:6 | \\W | W | -| regexp.rb:36:2:36:3 | \\s | s | -| regexp.rb:36:4:36:5 | \\S | S | -| regexp.rb:37:2:37:3 | \\d | d | -| regexp.rb:37:4:37:5 | \\D | D | -| regexp.rb:38:2:38:3 | \\h | h | -| regexp.rb:38:4:38:5 | \\H | H | -| regexp.rb:39:2:39:3 | \\n | \n | -| regexp.rb:39:4:39:5 | \\r | \r | -| regexp.rb:39:6:39:7 | \\t | \t | -| regexp.rb:42:4:42:6 | abc | abc | -| regexp.rb:43:4:43:5 | !a | !a | -| regexp.rb:46:3:46:5 | foo | foo | -| regexp.rb:46:8:46:10 | bar | bar | -| regexp.rb:47:2:47:3 | fo | fo | -| regexp.rb:47:5:47:5 | o | o | -| regexp.rb:47:7:47:7 | b | b | -| regexp.rb:47:9:47:10 | ar | ar | -| regexp.rb:48:3:48:3 | a | a | -| regexp.rb:48:5:48:5 | b | b | -| regexp.rb:48:7:48:8 | cd | cd | -| regexp.rb:48:10:48:10 | e | e | -| regexp.rb:49:5:49:5 | : | : | -| regexp.rb:49:8:49:9 | \\w | w | -| regexp.rb:52:8:52:9 | \\w | w | -| regexp.rb:53:9:53:9 | f | f | -| regexp.rb:53:10:53:10 | o | o | -| regexp.rb:56:3:56:3 | a | a | -| regexp.rb:56:6:56:6 | b | b | -| regexp.rb:57:9:57:9 | q | q | -| regexp.rb:57:12:57:13 | \\s | s | -| regexp.rb:63:3:63:3 | a | a | -| regexp.rb:63:5:63:5 | f | f | -| regexp.rb:72:3:72:3 | A | A | -| regexp.rb:72:5:72:5 | F | F | -| regexp.rb:72:15:72:15 | a | a | -| regexp.rb:72:17:72:17 | f | f | -| regexp.rb:79:2:79:4 | abc | abc | -| regexp.rb:82:2:82:7 | \\u{987 | \u0987 | +| regexp.cpp:18:19:18:21 | abc | abc | +| regexp.cpp:21:20:21:20 | a | a | +| regexp.cpp:21:22:21:22 | b | b | +| regexp.cpp:21:24:21:24 | c | c | +| regexp.cpp:21:26:21:26 | d | d | +| regexp.cpp:22:20:22:20 | a | a | +| regexp.cpp:23:20:23:20 | a | a | +| regexp.cpp:24:20:24:20 | a | a | +| regexp.cpp:25:20:25:20 | a | a | +| regexp.cpp:28:19:28:21 | foo | foo | +| regexp.cpp:28:23:28:25 | bar | bar | +| regexp.cpp:31:20:31:20 | a | a | +| regexp.cpp:31:21:31:21 | b | b | +| regexp.cpp:31:22:31:22 | c | c | +| regexp.cpp:32:20:32:20 | a | a | +| regexp.cpp:32:22:32:22 | f | f | +| regexp.cpp:32:23:32:23 | A | A | +| regexp.cpp:32:25:32:25 | F | F | +| regexp.cpp:32:26:32:26 | 0 | 0 | +| regexp.cpp:32:28:32:28 | 9 | 9 | +| regexp.cpp:32:29:32:29 | _ | _ | +| regexp.cpp:33:22:33:22 | + | + | +| regexp.cpp:33:23:33:23 | - | - | +| regexp.cpp:33:26:33:27 | \\d | d | +| regexp.cpp:34:20:34:21 | \\w | w | +| regexp.cpp:35:19:35:20 | \\[ | [ | +| regexp.cpp:35:21:35:22 | \\] | ] | +| regexp.cpp:35:24:35:24 | 1 | 1 | +| regexp.cpp:35:25:35:25 | 2 | 2 | +| regexp.cpp:35:26:35:26 | 3 | 3 | +| regexp.cpp:36:21:36:21 | A | A | +| regexp.cpp:36:23:36:23 | Z | Z | +| regexp.cpp:37:20:37:20 | ] | ] | +| regexp.cpp:38:21:38:21 | ] | ] | +| regexp.cpp:39:21:39:21 | - | - | +| regexp.cpp:40:21:40:21 | \| | \| | +| regexp.cpp:43:23:43:23 | [ | [ | +| regexp.cpp:43:24:43:24 | a | a | +| regexp.cpp:43:26:43:26 | f | f | +| regexp.cpp:43:28:43:31 | A-F] | A-F] | +| regexp.cpp:48:21:48:22 | \\w | w | +| regexp.cpp:48:24:48:25 | \\W | W | +| regexp.cpp:49:21:49:22 | \\s | s | +| regexp.cpp:49:23:49:24 | \\S | S | +| regexp.cpp:50:21:50:22 | \\d | d | +| regexp.cpp:50:23:50:24 | \\D | D | +| regexp.cpp:51:21:51:22 | \\h | h | +| regexp.cpp:51:23:51:24 | \\H | H | +| regexp.cpp:52:21:52:22 | \\n | \n | +| regexp.cpp:52:23:52:24 | \\r | \r | +| regexp.cpp:52:25:52:26 | \\t | \t | +| regexp.cpp:55:22:55:24 | abc | abc | +| regexp.cpp:56:22:56:23 | !a | !a | +| regexp.cpp:59:21:59:23 | foo | foo | +| regexp.cpp:59:26:59:28 | bar | bar | +| regexp.cpp:60:20:60:21 | fo | fo | +| regexp.cpp:60:23:60:23 | o | o | +| regexp.cpp:60:25:60:25 | b | b | +| regexp.cpp:60:27:60:28 | ar | ar | +| regexp.cpp:61:21:61:21 | a | a | +| regexp.cpp:61:23:61:23 | b | b | +| regexp.cpp:61:25:61:26 | cd | cd | +| regexp.cpp:61:28:61:28 | e | e | +| regexp.cpp:62:23:62:23 | : | : | +| regexp.cpp:62:26:62:27 | \\w | w | +| regexp.cpp:65:25:65:26 | \\w | w | +| regexp.cpp:66:26:66:26 | f | f | +| regexp.cpp:66:27:66:27 | o | o | +| regexp.cpp:69:22:69:22 | a | a | +| regexp.cpp:69:25:69:25 | b | b | +| regexp.cpp:70:28:70:28 | q | q | +| regexp.cpp:70:31:70:32 | \\s | s | +| regexp.cpp:76:22:76:22 | a | a | +| regexp.cpp:76:24:76:24 | f | f | +| regexp.cpp:85:23:85:23 | A | A | +| regexp.cpp:85:25:85:25 | F | F | +| regexp.cpp:85:35:85:35 | a | a | +| regexp.cpp:85:37:85:37 | f | f | +| regexp.cpp:91:19:91:24 | \\u{987 | \u0987 | diff --git a/cpp/ql/test/library-tests/regex/regexp.ql b/cpp/ql/test/library-tests/regex/regexp.ql index e167cb1a7bb0..a29717199e24 100644 --- a/cpp/ql/test/library-tests/regex/regexp.ql +++ b/cpp/ql/test/library-tests/regex/regexp.ql @@ -1,5 +1,11 @@ +import semmle.code.cpp.regex.internal.ParseRegExp import semmle.code.cpp.regex.RegexTreeView +// Stop gap for missing flow configs +class RegExpTest extends RegExp { + RegExpTest() { any() } +} + query predicate groupName(RegExpGroup g, string name) { name = g.getName() } query predicate groupNumber(RegExpGroup g, int number) { number = g.getNumber() } From d5d73f675024b88f67c704cc044a6f73c60401ab Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 23 Jul 2026 10:01:18 +0000 Subject: [PATCH 0159/2098] C++: Add location tests for all literal prefixes --- .../library-tests/regex/locations.expected | 55 ++++++++ cpp/ql/test/library-tests/regex/locations.ql | 11 ++ .../test/library-tests/regex/parse.expected | 132 ++++++++++++++++++ cpp/ql/test/library-tests/regex/regexp.cpp | 16 ++- .../test/library-tests/regex/regexp.expected | 84 +++++++++++ 5 files changed, 297 insertions(+), 1 deletion(-) create mode 100644 cpp/ql/test/library-tests/regex/locations.expected create mode 100644 cpp/ql/test/library-tests/regex/locations.ql diff --git a/cpp/ql/test/library-tests/regex/locations.expected b/cpp/ql/test/library-tests/regex/locations.expected new file mode 100644 index 000000000000..ea409e1dab94 --- /dev/null +++ b/cpp/ql/test/library-tests/regex/locations.expected @@ -0,0 +1,55 @@ +| regexp.cpp:18:19:18:21 | abc | regexp.cpp | 18 | 19 | 18 | 21 | +| regexp.cpp:21:20:21:26 | a*b+c?d | regexp.cpp | 21 | 20 | 21 | 26 | +| regexp.cpp:22:20:22:25 | a{4,8} | regexp.cpp | 22 | 20 | 22 | 25 | +| regexp.cpp:23:20:23:24 | a{,8} | regexp.cpp | 23 | 20 | 23 | 24 | +| regexp.cpp:24:20:24:24 | a{3,} | regexp.cpp | 24 | 20 | 24 | 24 | +| regexp.cpp:25:20:25:23 | a{7} | regexp.cpp | 25 | 20 | 25 | 23 | +| regexp.cpp:28:19:28:25 | foo\|bar | regexp.cpp | 28 | 19 | 28 | 25 | +| regexp.cpp:31:19:31:23 | [abc] | regexp.cpp | 31 | 19 | 31 | 23 | +| regexp.cpp:32:19:32:30 | [a-fA-F0-9_] | regexp.cpp | 32 | 19 | 32 | 30 | +| regexp.cpp:33:19:33:28 | \\A[+-]?\\d+ | regexp.cpp | 33 | 19 | 33 | 28 | +| regexp.cpp:34:19:34:23 | [\\w]+ | regexp.cpp | 34 | 19 | 34 | 23 | +| regexp.cpp:35:19:35:27 | \\[\\][123] | regexp.cpp | 35 | 19 | 35 | 27 | +| regexp.cpp:36:19:36:24 | [^A-Z] | regexp.cpp | 36 | 19 | 36 | 24 | +| regexp.cpp:37:19:37:21 | []] | regexp.cpp | 37 | 19 | 37 | 21 | +| regexp.cpp:38:19:38:22 | [^]] | regexp.cpp | 38 | 19 | 38 | 22 | +| regexp.cpp:39:19:39:22 | [^-] | regexp.cpp | 39 | 19 | 39 | 22 | +| regexp.cpp:40:20:40:22 | [\|] | regexp.cpp | 40 | 20 | 40 | 22 | +| regexp.cpp:43:22:43:31 | [[a-f]A-F] | regexp.cpp | 43 | 22 | 43 | 31 | +| regexp.cpp:46:21:46:22 | .* | regexp.cpp | 46 | 21 | 46 | 22 | +| regexp.cpp:47:22:47:23 | .* | regexp.cpp | 47 | 22 | 47 | 23 | +| regexp.cpp:48:21:48:25 | \\w+\\W | regexp.cpp | 48 | 21 | 48 | 25 | +| regexp.cpp:49:21:49:24 | \\s\\S | regexp.cpp | 49 | 21 | 49 | 24 | +| regexp.cpp:50:21:50:24 | \\d\\D | regexp.cpp | 50 | 21 | 50 | 24 | +| regexp.cpp:51:21:51:24 | \\h\\H | regexp.cpp | 51 | 21 | 51 | 24 | +| regexp.cpp:52:21:52:26 | \\n\\r\\t | regexp.cpp | 52 | 21 | 52 | 26 | +| regexp.cpp:55:20:55:24 | \\Gabc | regexp.cpp | 55 | 20 | 55 | 24 | +| regexp.cpp:56:20:56:25 | \\b!a\\B | regexp.cpp | 56 | 20 | 56 | 25 | +| regexp.cpp:59:20:59:28 | (foo)*bar | regexp.cpp | 59 | 20 | 59 | 28 | +| regexp.cpp:60:20:60:28 | fo(o\|b)ar | regexp.cpp | 60 | 20 | 60 | 28 | +| regexp.cpp:61:20:61:28 | (a\|b\|cd)e | regexp.cpp | 61 | 20 | 61 | 28 | +| regexp.cpp:62:20:62:27 | (?::+)\\w | regexp.cpp | 62 | 20 | 62 | 27 | +| regexp.cpp:65:19:65:28 | (?\\w+) | regexp.cpp | 65 | 19 | 65 | 28 | +| regexp.cpp:66:19:66:29 | (?'foo'fo+) | regexp.cpp | 66 | 19 | 66 | 29 | +| regexp.cpp:69:21:69:28 | (a+)b+\\1 | regexp.cpp | 69 | 21 | 69 | 28 | +| regexp.cpp:70:21:70:41 | (?q+)\\s+\\k+ | regexp.cpp | 70 | 21 | 70 | 41 | +| regexp.cpp:73:21:73:29 | \\p{Word}* | regexp.cpp | 73 | 21 | 73 | 29 | +| regexp.cpp:74:21:74:30 | \\P{Digit}+ | regexp.cpp | 74 | 21 | 74 | 30 | +| regexp.cpp:75:21:75:35 | \\p{^Alnum}{2,3} | regexp.cpp | 75 | 21 | 75 | 35 | +| regexp.cpp:76:21:76:35 | [a-f\\p{Digit}]+ | regexp.cpp | 76 | 21 | 76 | 35 | +| regexp.cpp:79:22:79:43 | [[:alpha:]][[:digit:]] | regexp.cpp | 79 | 22 | 79 | 43 | +| regexp.cpp:82:22:82:41 | [[:alpha:][:digit:]] | regexp.cpp | 82 | 22 | 82 | 41 | +| regexp.cpp:85:22:85:38 | [A-F[:digit:]a-f] | regexp.cpp | 85 | 22 | 85 | 38 | +| regexp.cpp:88:22:88:30 | [:digit:] | regexp.cpp | 88 | 22 | 88 | 30 | +| regexp.cpp:94:25:94:28 | a\\nb | regexp.cpp | 94 | 25 | 94 | 28 | +| regexp.cpp:95:36:95:39 | a\\nc | regexp.cpp | 95 | 36 | 95 | 39 | +| regexp.cpp:96:37:96:40 | a\\nc | regexp.cpp | 96 | 37 | 96 | 40 | +| regexp.cpp:97:37:97:40 | a\\nc | regexp.cpp | 97 | 37 | 97 | 40 | +| regexp.cpp:98:37:98:40 | a\\nc | regexp.cpp | 98 | 37 | 98 | 40 | +| regexp.cpp:99:21:99:24 | a\\nc | regexp.cpp | 99 | 21 | 99 | 24 | +| regexp.cpp:100:37:100:40 | a\\nc | regexp.cpp | 100 | 37 | 100 | 40 | +| regexp.cpp:101:38:101:41 | a\\nc | regexp.cpp | 101 | 38 | 101 | 41 | +| regexp.cpp:102:38:102:41 | a\\nc | regexp.cpp | 102 | 38 | 102 | 41 | +| regexp.cpp:103:38:103:41 | a\\nc | regexp.cpp | 103 | 38 | 103 | 41 | +| regexp.cpp:104:22:104:25 | a\\nc | regexp.cpp | 104 | 22 | 104 | 25 | +| regexp.cpp:105:24:105:27 | a\\nc | regexp.cpp | 105 | 24 | 105 | 27 | diff --git a/cpp/ql/test/library-tests/regex/locations.ql b/cpp/ql/test/library-tests/regex/locations.ql new file mode 100644 index 000000000000..0b6e23f2b79a --- /dev/null +++ b/cpp/ql/test/library-tests/regex/locations.ql @@ -0,0 +1,11 @@ +import semmle.code.cpp.regex.internal.ParseRegExp +import semmle.code.cpp.regex.RegexTreeView + +// Stop gap for missing flow configs +class RegExpTest extends RegExp { + RegExpTest() { any() } +} + +from RegExpTerm t, string file, int sl, int sc, int el, int ec +where t.isRootTerm() and t.hasLocationInfo(file, sl, sc, el, ec) +select t, file, sl, sc, el, ec diff --git a/cpp/ql/test/library-tests/regex/parse.expected b/cpp/ql/test/library-tests/regex/parse.expected index 13d74f0e5616..ebbd892e145f 100644 --- a/cpp/ql/test/library-tests/regex/parse.expected +++ b/cpp/ql/test/library-tests/regex/parse.expected @@ -485,3 +485,135 @@ regexp.cpp: # 88| [RegExpNamedCharacterProperty] [:digit:] # 91| [RegExpConstant, RegExpEscape] \u{987 + +# 94| [RegExpConstant, RegExpNormalChar] a + +# 94| [RegExpSequence] a\nb +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpEscape] \n +#-----| 2 -> [RegExpConstant, RegExpNormalChar] b + +# 94| [RegExpConstant, RegExpEscape] \n + +# 94| [RegExpConstant, RegExpNormalChar] b + +# 95| [RegExpConstant, RegExpNormalChar] a + +# 95| [RegExpSequence] a\nc +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpEscape] \n +#-----| 2 -> [RegExpConstant, RegExpNormalChar] c + +# 95| [RegExpConstant, RegExpEscape] \n + +# 95| [RegExpConstant, RegExpNormalChar] c + +# 96| [RegExpConstant, RegExpNormalChar] a + +# 96| [RegExpSequence] a\nc +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpEscape] \n +#-----| 2 -> [RegExpConstant, RegExpNormalChar] c + +# 96| [RegExpConstant, RegExpEscape] \n + +# 96| [RegExpConstant, RegExpNormalChar] c + +# 97| [RegExpConstant, RegExpNormalChar] a + +# 97| [RegExpSequence] a\nc +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpEscape] \n +#-----| 2 -> [RegExpConstant, RegExpNormalChar] c + +# 97| [RegExpConstant, RegExpEscape] \n + +# 97| [RegExpConstant, RegExpNormalChar] c + +# 98| [RegExpConstant, RegExpNormalChar] a + +# 98| [RegExpSequence] a\nc +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpEscape] \n +#-----| 2 -> [RegExpConstant, RegExpNormalChar] c + +# 98| [RegExpConstant, RegExpEscape] \n + +# 98| [RegExpConstant, RegExpNormalChar] c + +# 99| [RegExpConstant, RegExpNormalChar] a + +# 99| [RegExpSequence] a\nc +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpEscape] \n +#-----| 2 -> [RegExpConstant, RegExpNormalChar] c + +# 99| [RegExpConstant, RegExpEscape] \n + +# 99| [RegExpConstant, RegExpNormalChar] c + +# 100| [RegExpConstant, RegExpNormalChar] a + +# 100| [RegExpSequence] a\nc +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpEscape] \n +#-----| 2 -> [RegExpConstant, RegExpNormalChar] c + +# 100| [RegExpConstant, RegExpEscape] \n + +# 100| [RegExpConstant, RegExpNormalChar] c + +# 101| [RegExpConstant, RegExpNormalChar] a + +# 101| [RegExpSequence] a\nc +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpEscape] \n +#-----| 2 -> [RegExpConstant, RegExpNormalChar] c + +# 101| [RegExpConstant, RegExpEscape] \n + +# 101| [RegExpConstant, RegExpNormalChar] c + +# 102| [RegExpConstant, RegExpNormalChar] a + +# 102| [RegExpSequence] a\nc +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpEscape] \n +#-----| 2 -> [RegExpConstant, RegExpNormalChar] c + +# 102| [RegExpConstant, RegExpEscape] \n + +# 102| [RegExpConstant, RegExpNormalChar] c + +# 103| [RegExpConstant, RegExpNormalChar] a + +# 103| [RegExpSequence] a\nc +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpEscape] \n +#-----| 2 -> [RegExpConstant, RegExpNormalChar] c + +# 103| [RegExpConstant, RegExpEscape] \n + +# 103| [RegExpConstant, RegExpNormalChar] c + +# 104| [RegExpConstant, RegExpNormalChar] a + +# 104| [RegExpSequence] a\nc +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpEscape] \n +#-----| 2 -> [RegExpConstant, RegExpNormalChar] c + +# 104| [RegExpConstant, RegExpEscape] \n + +# 104| [RegExpConstant, RegExpNormalChar] c + +# 105| [RegExpConstant, RegExpNormalChar] a + +# 105| [RegExpSequence] a\nc +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpEscape] \n +#-----| 2 -> [RegExpConstant, RegExpNormalChar] c + +# 105| [RegExpConstant, RegExpEscape] \n + +# 105| [RegExpConstant, RegExpNormalChar] c diff --git a/cpp/ql/test/library-tests/regex/regexp.cpp b/cpp/ql/test/library-tests/regex/regexp.cpp index 944cf3aa2dbb..6561a265e22e 100644 --- a/cpp/ql/test/library-tests/regex/regexp.cpp +++ b/cpp/ql/test/library-tests/regex/regexp.cpp @@ -1,4 +1,4 @@ -// semmle-extractor-options: -std=c++17 +// semmle-extractor-options: -std=c++20 namespace std { template @@ -89,3 +89,17 @@ std::regex r_posix4("[:digit:]"); // unicode std::regex r_uni("\\u{9879}"); + +// String literal spellings for location tests +std::regex r_loc_plain("a\\nb"); +std::basic_regex r_loc_L(L"a\\nc"); +std::basic_regex r_loc_u8(u8"a\\nc"); +std::basic_regex r_loc_u(u"a\\nc"); +std::basic_regex r_loc_U(U"a\\nc"); +std::regex r_loc_R(R"(a\nc)"); +std::basic_regex r_loc_LR(LR"(a\nc)"); +std::basic_regex r_loc_u8R(u8R"(a\nc)"); +std::basic_regex r_loc_uR(uR"(a\nc)"); +std::basic_regex r_loc_UR(UR"(a\nc)"); +std::regex r_loc_Rx(R"x(a\nc)x"); +std::regex r_loc_Rfoo(R"foo(a\nc)foo"); diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index 6b2409e7c7c0..120815749f38 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -186,6 +186,54 @@ term | regexp.cpp:85:37:85:37 | f | RegExpConstant,RegExpNormalChar | | regexp.cpp:88:22:88:30 | [:digit:] | RegExpNamedCharacterProperty | | regexp.cpp:91:19:91:24 | \\u{987 | RegExpConstant,RegExpEscape | +| regexp.cpp:94:25:94:25 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:94:25:94:28 | a\\nb | RegExpSequence | +| regexp.cpp:94:26:94:27 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:94:28:94:28 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:95:36:95:36 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:95:36:95:39 | a\\nc | RegExpSequence | +| regexp.cpp:95:37:95:38 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:95:39:95:39 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:96:37:96:37 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:96:37:96:40 | a\\nc | RegExpSequence | +| regexp.cpp:96:38:96:39 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:96:40:96:40 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:97:37:97:37 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:97:37:97:40 | a\\nc | RegExpSequence | +| regexp.cpp:97:38:97:39 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:97:40:97:40 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:98:37:98:37 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:98:37:98:40 | a\\nc | RegExpSequence | +| regexp.cpp:98:38:98:39 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:98:40:98:40 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:99:21:99:21 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:99:21:99:24 | a\\nc | RegExpSequence | +| regexp.cpp:99:22:99:23 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:99:24:99:24 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:100:37:100:37 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:100:37:100:40 | a\\nc | RegExpSequence | +| regexp.cpp:100:38:100:39 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:100:40:100:40 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:101:38:101:38 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:101:38:101:41 | a\\nc | RegExpSequence | +| regexp.cpp:101:39:101:40 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:101:41:101:41 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:102:38:102:38 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:102:38:102:41 | a\\nc | RegExpSequence | +| regexp.cpp:102:39:102:40 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:102:41:102:41 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:103:38:103:38 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:103:38:103:41 | a\\nc | RegExpSequence | +| regexp.cpp:103:39:103:40 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:103:41:103:41 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:104:22:104:22 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:104:22:104:25 | a\\nc | RegExpSequence | +| regexp.cpp:104:23:104:24 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:104:25:104:25 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:105:24:105:24 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:105:24:105:27 | a\\nc | RegExpSequence | +| regexp.cpp:105:25:105:26 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:105:27:105:27 | c | RegExpConstant,RegExpNormalChar | regExpNormalCharValue | regexp.cpp:18:19:18:21 | abc | abc | | regexp.cpp:21:20:21:20 | a | a | @@ -266,3 +314,39 @@ regExpNormalCharValue | regexp.cpp:85:35:85:35 | a | a | | regexp.cpp:85:37:85:37 | f | f | | regexp.cpp:91:19:91:24 | \\u{987 | \u0987 | +| regexp.cpp:94:25:94:25 | a | a | +| regexp.cpp:94:26:94:27 | \\n | \n | +| regexp.cpp:94:28:94:28 | b | b | +| regexp.cpp:95:36:95:36 | a | a | +| regexp.cpp:95:37:95:38 | \\n | \n | +| regexp.cpp:95:39:95:39 | c | c | +| regexp.cpp:96:37:96:37 | a | a | +| regexp.cpp:96:38:96:39 | \\n | \n | +| regexp.cpp:96:40:96:40 | c | c | +| regexp.cpp:97:37:97:37 | a | a | +| regexp.cpp:97:38:97:39 | \\n | \n | +| regexp.cpp:97:40:97:40 | c | c | +| regexp.cpp:98:37:98:37 | a | a | +| regexp.cpp:98:38:98:39 | \\n | \n | +| regexp.cpp:98:40:98:40 | c | c | +| regexp.cpp:99:21:99:21 | a | a | +| regexp.cpp:99:22:99:23 | \\n | \n | +| regexp.cpp:99:24:99:24 | c | c | +| regexp.cpp:100:37:100:37 | a | a | +| regexp.cpp:100:38:100:39 | \\n | \n | +| regexp.cpp:100:40:100:40 | c | c | +| regexp.cpp:101:38:101:38 | a | a | +| regexp.cpp:101:39:101:40 | \\n | \n | +| regexp.cpp:101:41:101:41 | c | c | +| regexp.cpp:102:38:102:38 | a | a | +| regexp.cpp:102:39:102:40 | \\n | \n | +| regexp.cpp:102:41:102:41 | c | c | +| regexp.cpp:103:38:103:38 | a | a | +| regexp.cpp:103:39:103:40 | \\n | \n | +| regexp.cpp:103:41:103:41 | c | c | +| regexp.cpp:104:22:104:22 | a | a | +| regexp.cpp:104:23:104:24 | \\n | \n | +| regexp.cpp:104:25:104:25 | c | c | +| regexp.cpp:105:24:105:24 | a | a | +| regexp.cpp:105:25:105:26 | \\n | \n | +| regexp.cpp:105:27:105:27 | c | c | From 322c1c02f3d73d284fd283c5f507c57abc7bb47a Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Thu, 23 Jul 2026 15:07:45 +0200 Subject: [PATCH 0160/2098] C++: Add `RawStringLiteral` class --- cpp/ql/lib/semmle/code/cpp/exprs/Literal.qll | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/cpp/ql/lib/semmle/code/cpp/exprs/Literal.qll b/cpp/ql/lib/semmle/code/cpp/exprs/Literal.qll index 31e2b5135b42..7238ea2a35ed 100644 --- a/cpp/ql/lib/semmle/code/cpp/exprs/Literal.qll +++ b/cpp/ql/lib/semmle/code/cpp/exprs/Literal.qll @@ -133,6 +133,19 @@ class StringLiteral extends TextLiteral { override string getAPrimaryQlClass() { result = "StringLiteral" } } +/** + * A C++ raw string literal. For example: + * ``` + * const char *s1 = R"(abcdef)"; + * const wchar_t *s2 = LR"x(123456)x"; + * ``` + */ +class RawStringLiteral extends StringLiteral { + RawStringLiteral() { this.getValueText().regexpMatch("[^\"]*R\".*\\(.*") } + + override string getAPrimaryQlClass() { result = "RawStringLiteral" } +} + /** * An octal literal. For example: * ``` From fd929e2d1fa3190b21d0d1987e6eba6be0f44bc3 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Thu, 23 Jul 2026 15:08:48 +0200 Subject: [PATCH 0161/2098] C++: Fix regex starting location Strings can have a prefix in C++, which affects the location. --- .../semmle/code/cpp/regex/RegexTreeView.qll | 27 ++- .../library-tests/regex/locations.expected | 22 +-- .../test/library-tests/regex/regexp.expected | 154 +++++++++--------- 3 files changed, 109 insertions(+), 94 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll index a0a116f2fe01..23b621e66f17 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll @@ -11,9 +11,7 @@ import Impl as RegexTreeView import Impl /** Gets the parse tree resulting from parsing `re`, if such has been constructed. */ -RegExpTerm getParsedRegExp(StringLiteral re) { - result.getRegExp() = re and result.isRootTerm() -} +RegExpTerm getParsedRegExp(StringLiteral re) { result.getRegExp() = re and result.isRootTerm() } /** * An element containing a regular expression term, that is, either @@ -211,14 +209,31 @@ private module Impl implements RegexTreeViewSig { */ Location getLocation() { result = re.getLocation() } + /** + * Gets the number of source characters from the start of the string literal + * to the first content character (i.e., past the opening delimiter). + */ + private int regexpContentOffset() { + exists(string vt | vt = re.getValueText() | + // Find the '(' that opens the raw content. + re instanceof RawStringLiteral and + result = 1 + min(int i | vt.charAt(i) = "(") + or + // Find the opening '"'. + not re instanceof RawStringLiteral and + result = 1 + min(int i | vt.charAt(i) = "\"") + ) + } + /** Holds if this term is found at the specified location offsets. */ predicate hasLocationInfo( string filepath, int startline, int startcolumn, int endline, int endcolumn ) { - exists(int re_start | + exists(int re_start, int offset | re.getLocation().hasLocationInfo(filepath, startline, re_start, endline, _) and - startcolumn = re_start + 1 + start and - endcolumn = re_start + 1 + end - 1 + offset = this.regexpContentOffset() and + startcolumn = re_start + offset + start and + endcolumn = re_start + offset + end - 1 ) } diff --git a/cpp/ql/test/library-tests/regex/locations.expected b/cpp/ql/test/library-tests/regex/locations.expected index ea409e1dab94..d3cfc7d61c73 100644 --- a/cpp/ql/test/library-tests/regex/locations.expected +++ b/cpp/ql/test/library-tests/regex/locations.expected @@ -42,14 +42,14 @@ | regexp.cpp:85:22:85:38 | [A-F[:digit:]a-f] | regexp.cpp | 85 | 22 | 85 | 38 | | regexp.cpp:88:22:88:30 | [:digit:] | regexp.cpp | 88 | 22 | 88 | 30 | | regexp.cpp:94:25:94:28 | a\\nb | regexp.cpp | 94 | 25 | 94 | 28 | -| regexp.cpp:95:36:95:39 | a\\nc | regexp.cpp | 95 | 36 | 95 | 39 | -| regexp.cpp:96:37:96:40 | a\\nc | regexp.cpp | 96 | 37 | 96 | 40 | -| regexp.cpp:97:37:97:40 | a\\nc | regexp.cpp | 97 | 37 | 97 | 40 | -| regexp.cpp:98:37:98:40 | a\\nc | regexp.cpp | 98 | 37 | 98 | 40 | -| regexp.cpp:99:21:99:24 | a\\nc | regexp.cpp | 99 | 21 | 99 | 24 | -| regexp.cpp:100:37:100:40 | a\\nc | regexp.cpp | 100 | 37 | 100 | 40 | -| regexp.cpp:101:38:101:41 | a\\nc | regexp.cpp | 101 | 38 | 101 | 41 | -| regexp.cpp:102:38:102:41 | a\\nc | regexp.cpp | 102 | 38 | 102 | 41 | -| regexp.cpp:103:38:103:41 | a\\nc | regexp.cpp | 103 | 38 | 103 | 41 | -| regexp.cpp:104:22:104:25 | a\\nc | regexp.cpp | 104 | 22 | 104 | 25 | -| regexp.cpp:105:24:105:27 | a\\nc | regexp.cpp | 105 | 24 | 105 | 27 | +| regexp.cpp:95:37:95:40 | a\\nc | regexp.cpp | 95 | 37 | 95 | 40 | +| regexp.cpp:96:39:96:42 | a\\nc | regexp.cpp | 96 | 39 | 96 | 42 | +| regexp.cpp:97:38:97:41 | a\\nc | regexp.cpp | 97 | 38 | 97 | 41 | +| regexp.cpp:98:38:98:41 | a\\nc | regexp.cpp | 98 | 38 | 98 | 41 | +| regexp.cpp:99:23:99:26 | a\\nc | regexp.cpp | 99 | 23 | 99 | 26 | +| regexp.cpp:100:40:100:43 | a\\nc | regexp.cpp | 100 | 40 | 100 | 43 | +| regexp.cpp:101:42:101:45 | a\\nc | regexp.cpp | 101 | 42 | 101 | 45 | +| regexp.cpp:102:41:102:44 | a\\nc | regexp.cpp | 102 | 41 | 102 | 44 | +| regexp.cpp:103:41:103:44 | a\\nc | regexp.cpp | 103 | 41 | 103 | 44 | +| regexp.cpp:104:25:104:28 | a\\nc | regexp.cpp | 104 | 25 | 104 | 28 | +| regexp.cpp:105:29:105:32 | a\\nc | regexp.cpp | 105 | 29 | 105 | 32 | diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index 120815749f38..e11a7cfea99e 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -190,50 +190,50 @@ term | regexp.cpp:94:25:94:28 | a\\nb | RegExpSequence | | regexp.cpp:94:26:94:27 | \\n | RegExpConstant,RegExpEscape | | regexp.cpp:94:28:94:28 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:95:36:95:36 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:95:36:95:39 | a\\nc | RegExpSequence | -| regexp.cpp:95:37:95:38 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:95:39:95:39 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:96:37:96:37 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:96:37:96:40 | a\\nc | RegExpSequence | -| regexp.cpp:96:38:96:39 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:96:40:96:40 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:97:37:97:37 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:97:37:97:40 | a\\nc | RegExpSequence | -| regexp.cpp:97:38:97:39 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:97:40:97:40 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:98:37:98:37 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:98:37:98:40 | a\\nc | RegExpSequence | -| regexp.cpp:98:38:98:39 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:98:40:98:40 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:99:21:99:21 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:99:21:99:24 | a\\nc | RegExpSequence | -| regexp.cpp:99:22:99:23 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:99:24:99:24 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:100:37:100:37 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:100:37:100:40 | a\\nc | RegExpSequence | -| regexp.cpp:100:38:100:39 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:100:40:100:40 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:101:38:101:38 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:101:38:101:41 | a\\nc | RegExpSequence | -| regexp.cpp:101:39:101:40 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:101:41:101:41 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:102:38:102:38 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:102:38:102:41 | a\\nc | RegExpSequence | -| regexp.cpp:102:39:102:40 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:102:41:102:41 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:103:38:103:38 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:103:38:103:41 | a\\nc | RegExpSequence | -| regexp.cpp:103:39:103:40 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:103:41:103:41 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:104:22:104:22 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:104:22:104:25 | a\\nc | RegExpSequence | -| regexp.cpp:104:23:104:24 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:104:25:104:25 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:105:24:105:24 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:105:24:105:27 | a\\nc | RegExpSequence | -| regexp.cpp:105:25:105:26 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:105:27:105:27 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:95:37:95:37 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:95:37:95:40 | a\\nc | RegExpSequence | +| regexp.cpp:95:38:95:39 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:95:40:95:40 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:96:39:96:39 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:96:39:96:42 | a\\nc | RegExpSequence | +| regexp.cpp:96:40:96:41 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:96:42:96:42 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:97:38:97:38 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:97:38:97:41 | a\\nc | RegExpSequence | +| regexp.cpp:97:39:97:40 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:97:41:97:41 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:98:38:98:38 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:98:38:98:41 | a\\nc | RegExpSequence | +| regexp.cpp:98:39:98:40 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:98:41:98:41 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:99:23:99:23 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:99:23:99:26 | a\\nc | RegExpSequence | +| regexp.cpp:99:24:99:25 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:99:26:99:26 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:100:40:100:40 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:100:40:100:43 | a\\nc | RegExpSequence | +| regexp.cpp:100:41:100:42 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:100:43:100:43 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:101:42:101:42 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:101:42:101:45 | a\\nc | RegExpSequence | +| regexp.cpp:101:43:101:44 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:101:45:101:45 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:102:41:102:41 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:102:41:102:44 | a\\nc | RegExpSequence | +| regexp.cpp:102:42:102:43 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:102:44:102:44 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:103:41:103:41 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:103:41:103:44 | a\\nc | RegExpSequence | +| regexp.cpp:103:42:103:43 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:103:44:103:44 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:104:25:104:25 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:104:25:104:28 | a\\nc | RegExpSequence | +| regexp.cpp:104:26:104:27 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:104:28:104:28 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:105:29:105:29 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:105:29:105:32 | a\\nc | RegExpSequence | +| regexp.cpp:105:30:105:31 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:105:32:105:32 | c | RegExpConstant,RegExpNormalChar | regExpNormalCharValue | regexp.cpp:18:19:18:21 | abc | abc | | regexp.cpp:21:20:21:20 | a | a | @@ -317,36 +317,36 @@ regExpNormalCharValue | regexp.cpp:94:25:94:25 | a | a | | regexp.cpp:94:26:94:27 | \\n | \n | | regexp.cpp:94:28:94:28 | b | b | -| regexp.cpp:95:36:95:36 | a | a | -| regexp.cpp:95:37:95:38 | \\n | \n | -| regexp.cpp:95:39:95:39 | c | c | -| regexp.cpp:96:37:96:37 | a | a | -| regexp.cpp:96:38:96:39 | \\n | \n | -| regexp.cpp:96:40:96:40 | c | c | -| regexp.cpp:97:37:97:37 | a | a | -| regexp.cpp:97:38:97:39 | \\n | \n | -| regexp.cpp:97:40:97:40 | c | c | -| regexp.cpp:98:37:98:37 | a | a | -| regexp.cpp:98:38:98:39 | \\n | \n | -| regexp.cpp:98:40:98:40 | c | c | -| regexp.cpp:99:21:99:21 | a | a | -| regexp.cpp:99:22:99:23 | \\n | \n | -| regexp.cpp:99:24:99:24 | c | c | -| regexp.cpp:100:37:100:37 | a | a | -| regexp.cpp:100:38:100:39 | \\n | \n | -| regexp.cpp:100:40:100:40 | c | c | -| regexp.cpp:101:38:101:38 | a | a | -| regexp.cpp:101:39:101:40 | \\n | \n | -| regexp.cpp:101:41:101:41 | c | c | -| regexp.cpp:102:38:102:38 | a | a | -| regexp.cpp:102:39:102:40 | \\n | \n | -| regexp.cpp:102:41:102:41 | c | c | -| regexp.cpp:103:38:103:38 | a | a | -| regexp.cpp:103:39:103:40 | \\n | \n | -| regexp.cpp:103:41:103:41 | c | c | -| regexp.cpp:104:22:104:22 | a | a | -| regexp.cpp:104:23:104:24 | \\n | \n | -| regexp.cpp:104:25:104:25 | c | c | -| regexp.cpp:105:24:105:24 | a | a | -| regexp.cpp:105:25:105:26 | \\n | \n | -| regexp.cpp:105:27:105:27 | c | c | +| regexp.cpp:95:37:95:37 | a | a | +| regexp.cpp:95:38:95:39 | \\n | \n | +| regexp.cpp:95:40:95:40 | c | c | +| regexp.cpp:96:39:96:39 | a | a | +| regexp.cpp:96:40:96:41 | \\n | \n | +| regexp.cpp:96:42:96:42 | c | c | +| regexp.cpp:97:38:97:38 | a | a | +| regexp.cpp:97:39:97:40 | \\n | \n | +| regexp.cpp:97:41:97:41 | c | c | +| regexp.cpp:98:38:98:38 | a | a | +| regexp.cpp:98:39:98:40 | \\n | \n | +| regexp.cpp:98:41:98:41 | c | c | +| regexp.cpp:99:23:99:23 | a | a | +| regexp.cpp:99:24:99:25 | \\n | \n | +| regexp.cpp:99:26:99:26 | c | c | +| regexp.cpp:100:40:100:40 | a | a | +| regexp.cpp:100:41:100:42 | \\n | \n | +| regexp.cpp:100:43:100:43 | c | c | +| regexp.cpp:101:42:101:42 | a | a | +| regexp.cpp:101:43:101:44 | \\n | \n | +| regexp.cpp:101:45:101:45 | c | c | +| regexp.cpp:102:41:102:41 | a | a | +| regexp.cpp:102:42:102:43 | \\n | \n | +| regexp.cpp:102:44:102:44 | c | c | +| regexp.cpp:103:41:103:41 | a | a | +| regexp.cpp:103:42:103:43 | \\n | \n | +| regexp.cpp:103:44:103:44 | c | c | +| regexp.cpp:104:25:104:25 | a | a | +| regexp.cpp:104:26:104:27 | \\n | \n | +| regexp.cpp:104:28:104:28 | c | c | +| regexp.cpp:105:29:105:29 | a | a | +| regexp.cpp:105:30:105:31 | \\n | \n | +| regexp.cpp:105:32:105:32 | c | c | From eb53e5655aeea71402fcfaea2caaf02b07799c56 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 23 Jul 2026 10:04:43 +0000 Subject: [PATCH 0162/2098] C++: Remove Ruby-only \A/\Z/\z/\G anchors from regex grammar --- .../semmle/code/cpp/regex/RegexTreeView.qll | 12 +++---- .../code/cpp/regex/internal/ParseRegExp.qll | 10 +++--- .../library-tests/regex/locations.expected | 3 -- .../test/library-tests/regex/parse.expected | 36 ------------------- cpp/ql/test/library-tests/regex/regexp.cpp | 6 ++-- .../test/library-tests/regex/regexp.expected | 17 --------- 6 files changed, 14 insertions(+), 70 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll index 23b621e66f17..1c42fb80709e 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll @@ -936,17 +936,17 @@ private module Impl implements RegexTreeViewSig { * Example: * * ``` - * \A + * ^ * ``` */ class RegExpAnchor extends RegExpSpecialChar { - RegExpAnchor() { this.getChar() = ["^", "$", "\\A", "\\Z", "\\z"] } + RegExpAnchor() { this.getChar() = ["^", "$"] } override string getAPrimaryQlClass() { result = "RegExpAnchor" } } /** - * A dollar assertion `$` or `\Z` matching the end of a line. + * A dollar assertion `$` matching the end of a line. * * Example: * @@ -955,7 +955,7 @@ private module Impl implements RegexTreeViewSig { * ``` */ class RegExpDollar extends RegExpAnchor { - RegExpDollar() { this.getChar() = ["$", "\\Z", "\\z"] } + RegExpDollar() { this.getChar() = "$" } override string getAPrimaryQlClass() { result = "RegExpDollar" } @@ -963,7 +963,7 @@ private module Impl implements RegexTreeViewSig { } /** - * A caret assertion `^` or `\A` matching the beginning of a line. + * A caret assertion `^` matching the beginning of a line. * * Example: * @@ -972,7 +972,7 @@ private module Impl implements RegexTreeViewSig { * ``` */ class RegExpCaret extends RegExpAnchor { - RegExpCaret() { this.getChar() = ["^", "\\A"] } + RegExpCaret() { this.getChar() = "^" } override string getAPrimaryQlClass() { result = "RegExpCaret" } diff --git a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll index d9163bb3af05..a7d0d38919a1 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll @@ -476,7 +476,7 @@ abstract class RegExp extends StringLiteral { end = start + 2 and this.escapingChar(start) and char = this.getText().substring(start, end) and - char = ["\\A", "\\Z", "\\z", "\\G", "\\b", "\\B"] + char = ["\\b", "\\B"] ) } @@ -958,8 +958,8 @@ abstract class RegExp extends StringLiteral { or this.qualifiedItem(x, start, true, _) or - // ^ and \A match the start of the string - this.specialCharacter(x, start, ["^", "\\A"]) + // ^ matches the start of the string + this.specialCharacter(x, start, "^") ) or exists(int y | this.firstPart(start, y) | @@ -984,8 +984,8 @@ abstract class RegExp extends StringLiteral { or this.qualifiedItem(end, y, true, _) or - // $, \Z, and \z match the end of the string. - this.specialCharacter(end, y, ["$", "\\Z", "\\z"]) + // $ matches the end of the string. + this.specialCharacter(end, y, "$") ) or this.lastPart(_, end) and diff --git a/cpp/ql/test/library-tests/regex/locations.expected b/cpp/ql/test/library-tests/regex/locations.expected index d3cfc7d61c73..d7912bdf1677 100644 --- a/cpp/ql/test/library-tests/regex/locations.expected +++ b/cpp/ql/test/library-tests/regex/locations.expected @@ -7,7 +7,6 @@ | regexp.cpp:28:19:28:25 | foo\|bar | regexp.cpp | 28 | 19 | 28 | 25 | | regexp.cpp:31:19:31:23 | [abc] | regexp.cpp | 31 | 19 | 31 | 23 | | regexp.cpp:32:19:32:30 | [a-fA-F0-9_] | regexp.cpp | 32 | 19 | 32 | 30 | -| regexp.cpp:33:19:33:28 | \\A[+-]?\\d+ | regexp.cpp | 33 | 19 | 33 | 28 | | regexp.cpp:34:19:34:23 | [\\w]+ | regexp.cpp | 34 | 19 | 34 | 23 | | regexp.cpp:35:19:35:27 | \\[\\][123] | regexp.cpp | 35 | 19 | 35 | 27 | | regexp.cpp:36:19:36:24 | [^A-Z] | regexp.cpp | 36 | 19 | 36 | 24 | @@ -17,13 +16,11 @@ | regexp.cpp:40:20:40:22 | [\|] | regexp.cpp | 40 | 20 | 40 | 22 | | regexp.cpp:43:22:43:31 | [[a-f]A-F] | regexp.cpp | 43 | 22 | 43 | 31 | | regexp.cpp:46:21:46:22 | .* | regexp.cpp | 46 | 21 | 46 | 22 | -| regexp.cpp:47:22:47:23 | .* | regexp.cpp | 47 | 22 | 47 | 23 | | regexp.cpp:48:21:48:25 | \\w+\\W | regexp.cpp | 48 | 21 | 48 | 25 | | regexp.cpp:49:21:49:24 | \\s\\S | regexp.cpp | 49 | 21 | 49 | 24 | | regexp.cpp:50:21:50:24 | \\d\\D | regexp.cpp | 50 | 21 | 50 | 24 | | regexp.cpp:51:21:51:24 | \\h\\H | regexp.cpp | 51 | 21 | 51 | 24 | | regexp.cpp:52:21:52:26 | \\n\\r\\t | regexp.cpp | 52 | 21 | 52 | 26 | -| regexp.cpp:55:20:55:24 | \\Gabc | regexp.cpp | 55 | 20 | 55 | 24 | | regexp.cpp:56:20:56:25 | \\b!a\\B | regexp.cpp | 56 | 20 | 56 | 25 | | regexp.cpp:59:20:59:28 | (foo)*bar | regexp.cpp | 59 | 20 | 59 | 28 | | regexp.cpp:60:20:60:28 | fo(o\|b)ar | regexp.cpp | 60 | 20 | 60 | 28 | diff --git a/cpp/ql/test/library-tests/regex/parse.expected b/cpp/ql/test/library-tests/regex/parse.expected index ebbd892e145f..e2a783d2c702 100644 --- a/cpp/ql/test/library-tests/regex/parse.expected +++ b/cpp/ql/test/library-tests/regex/parse.expected @@ -95,29 +95,6 @@ regexp.cpp: # 32| [RegExpConstant, RegExpNormalChar] _ -# 33| [RegExpCaret] \A - -# 33| [RegExpSequence] \A[+-]?\d+ -#-----| 0 -> [RegExpCaret] \A -#-----| 1 -> [RegExpOpt] [+-]? -#-----| 2 -> [RegExpPlus] \d+ - -# 33| [RegExpCharacterClass] [+-] -#-----| 0 -> [RegExpConstant, RegExpNormalChar] + -#-----| 1 -> [RegExpConstant, RegExpNormalChar] - - -# 33| [RegExpOpt] [+-]? -#-----| 0 -> [RegExpCharacterClass] [+-] - -# 33| [RegExpConstant, RegExpNormalChar] + - -# 33| [RegExpConstant, RegExpNormalChar] - - -# 33| [RegExpCharacterClassEscape] \d - -# 33| [RegExpPlus] \d+ -#-----| 0 -> [RegExpCharacterClassEscape] \d - # 34| [RegExpCharacterClass] [\w] #-----| 0 -> [RegExpCharacterClassEscape] \w @@ -202,11 +179,6 @@ regexp.cpp: # 46| [RegExpStar] .* #-----| 0 -> [RegExpDot] . -# 47| [RegExpDot] . - -# 47| [RegExpStar] .* -#-----| 0 -> [RegExpDot] . - # 48| [RegExpCharacterClassEscape] \w # 48| [RegExpPlus] \w+ @@ -253,14 +225,6 @@ regexp.cpp: # 52| [RegExpConstant, RegExpEscape] \t -# 55| [RegExpSpecialChar] \G - -# 55| [RegExpSequence] \Gabc -#-----| 0 -> [RegExpSpecialChar] \G -#-----| 1 -> [RegExpConstant, RegExpNormalChar] abc - -# 55| [RegExpConstant, RegExpNormalChar] abc - # 56| [RegExpSpecialChar] \b # 56| [RegExpSequence] \b!a\B diff --git a/cpp/ql/test/library-tests/regex/regexp.cpp b/cpp/ql/test/library-tests/regex/regexp.cpp index 6561a265e22e..dcbc6b0f5841 100644 --- a/cpp/ql/test/library-tests/regex/regexp.cpp +++ b/cpp/ql/test/library-tests/regex/regexp.cpp @@ -30,7 +30,7 @@ std::regex r_alt("foo|bar"); // Character classes std::regex r_cc1("[abc]"); std::regex r_cc2("[a-fA-F0-9_]"); -std::regex r_cc3("\\A[+-]?\\d+"); + std::regex r_cc4("[\\w]+"); std::regex r_cc5("\\[\\][123]"); std::regex r_cc6("[^A-Z]"); @@ -44,7 +44,7 @@ std::regex r_nested("[[a-f]A-F]"); // Meta-character classes std::regex r_meta1(".*"); -std::regex r_meta1m(".*"); // /.*/m mode variant — mode flags are constructor args in C++ + std::regex r_meta2("\\w+\\W"); std::regex r_meta3("\\s\\S"); std::regex r_meta4("\\d\\D"); @@ -52,7 +52,7 @@ std::regex r_meta5("\\h\\H"); std::regex r_meta6("\\n\\r\\t"); // Anchors -std::regex r_anc1("\\Gabc"); + std::regex r_anc2("\\b!a\\B"); // Groups diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index e11a7cfea99e..8a3af59875e9 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -44,14 +44,6 @@ term | regexp.cpp:32:26:32:28 | 0-9 | RegExpCharacterRange | | regexp.cpp:32:28:32:28 | 9 | RegExpConstant,RegExpNormalChar | | regexp.cpp:32:29:32:29 | _ | RegExpConstant,RegExpNormalChar | -| regexp.cpp:33:19:33:20 | \\A | RegExpCaret | -| regexp.cpp:33:19:33:28 | \\A[+-]?\\d+ | RegExpSequence | -| regexp.cpp:33:21:33:24 | [+-] | RegExpCharacterClass | -| regexp.cpp:33:21:33:25 | [+-]? | RegExpOpt | -| regexp.cpp:33:22:33:22 | + | RegExpConstant,RegExpNormalChar | -| regexp.cpp:33:23:33:23 | - | RegExpConstant,RegExpNormalChar | -| regexp.cpp:33:26:33:27 | \\d | RegExpCharacterClassEscape | -| regexp.cpp:33:26:33:28 | \\d+ | RegExpPlus | | regexp.cpp:34:19:34:22 | [\\w] | RegExpCharacterClass | | regexp.cpp:34:19:34:23 | [\\w]+ | RegExpPlus | | regexp.cpp:34:20:34:21 | \\w | RegExpCharacterClassEscape | @@ -83,8 +75,6 @@ term | regexp.cpp:43:28:43:31 | A-F] | RegExpConstant,RegExpNormalChar | | regexp.cpp:46:21:46:21 | . | RegExpDot | | regexp.cpp:46:21:46:22 | .* | RegExpStar | -| regexp.cpp:47:22:47:22 | . | RegExpDot | -| regexp.cpp:47:22:47:23 | .* | RegExpStar | | regexp.cpp:48:21:48:22 | \\w | RegExpCharacterClassEscape | | regexp.cpp:48:21:48:23 | \\w+ | RegExpPlus | | regexp.cpp:48:21:48:25 | \\w+\\W | RegExpSequence | @@ -102,9 +92,6 @@ term | regexp.cpp:52:21:52:26 | \\n\\r\\t | RegExpSequence | | regexp.cpp:52:23:52:24 | \\r | RegExpConstant,RegExpEscape | | regexp.cpp:52:25:52:26 | \\t | RegExpConstant,RegExpEscape | -| regexp.cpp:55:20:55:21 | \\G | RegExpSpecialChar | -| regexp.cpp:55:20:55:24 | \\Gabc | RegExpSequence | -| regexp.cpp:55:22:55:24 | abc | RegExpConstant,RegExpNormalChar | | regexp.cpp:56:20:56:21 | \\b | RegExpSpecialChar | | regexp.cpp:56:20:56:25 | \\b!a\\B | RegExpSequence | | regexp.cpp:56:22:56:23 | !a | RegExpConstant,RegExpNormalChar | @@ -256,9 +243,6 @@ regExpNormalCharValue | regexp.cpp:32:26:32:26 | 0 | 0 | | regexp.cpp:32:28:32:28 | 9 | 9 | | regexp.cpp:32:29:32:29 | _ | _ | -| regexp.cpp:33:22:33:22 | + | + | -| regexp.cpp:33:23:33:23 | - | - | -| regexp.cpp:33:26:33:27 | \\d | d | | regexp.cpp:34:20:34:21 | \\w | w | | regexp.cpp:35:19:35:20 | \\[ | [ | | regexp.cpp:35:21:35:22 | \\] | ] | @@ -286,7 +270,6 @@ regExpNormalCharValue | regexp.cpp:52:21:52:22 | \\n | \n | | regexp.cpp:52:23:52:24 | \\r | \r | | regexp.cpp:52:25:52:26 | \\t | \t | -| regexp.cpp:55:22:55:24 | abc | abc | | regexp.cpp:56:22:56:23 | !a | !a | | regexp.cpp:59:21:59:23 | foo | foo | | regexp.cpp:59:26:59:28 | bar | bar | From 6e71f00bbc6f2874591c53bedb0a1d7a0850dd3f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 23 Jul 2026 10:06:02 +0000 Subject: [PATCH 0163/2098] C++: Remove Ruby-only \h and \H character class escapes --- cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll | 2 +- cpp/ql/test/library-tests/regex/locations.expected | 1 - cpp/ql/test/library-tests/regex/parse.expected | 8 -------- cpp/ql/test/library-tests/regex/regexp.cpp | 2 +- cpp/ql/test/library-tests/regex/regexp.expected | 5 ----- 5 files changed, 2 insertions(+), 16 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll index 1c42fb80709e..4ed66a945a32 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll @@ -651,7 +651,7 @@ private module Impl implements RegexTreeViewSig { * ``` */ class RegExpCharacterClassEscape extends RegExpEscape { - RegExpCharacterClassEscape() { this.getValue() in ["d", "D", "s", "S", "w", "W", "h", "H"] } + RegExpCharacterClassEscape() { this.getValue() in ["d", "D", "s", "S", "w", "W"] } override RegExpTerm getChild(int i) { none() } diff --git a/cpp/ql/test/library-tests/regex/locations.expected b/cpp/ql/test/library-tests/regex/locations.expected index d7912bdf1677..c85866cef176 100644 --- a/cpp/ql/test/library-tests/regex/locations.expected +++ b/cpp/ql/test/library-tests/regex/locations.expected @@ -19,7 +19,6 @@ | regexp.cpp:48:21:48:25 | \\w+\\W | regexp.cpp | 48 | 21 | 48 | 25 | | regexp.cpp:49:21:49:24 | \\s\\S | regexp.cpp | 49 | 21 | 49 | 24 | | regexp.cpp:50:21:50:24 | \\d\\D | regexp.cpp | 50 | 21 | 50 | 24 | -| regexp.cpp:51:21:51:24 | \\h\\H | regexp.cpp | 51 | 21 | 51 | 24 | | regexp.cpp:52:21:52:26 | \\n\\r\\t | regexp.cpp | 52 | 21 | 52 | 26 | | regexp.cpp:56:20:56:25 | \\b!a\\B | regexp.cpp | 56 | 20 | 56 | 25 | | regexp.cpp:59:20:59:28 | (foo)*bar | regexp.cpp | 59 | 20 | 59 | 28 | diff --git a/cpp/ql/test/library-tests/regex/parse.expected b/cpp/ql/test/library-tests/regex/parse.expected index e2a783d2c702..7296e9d3b0ec 100644 --- a/cpp/ql/test/library-tests/regex/parse.expected +++ b/cpp/ql/test/library-tests/regex/parse.expected @@ -206,14 +206,6 @@ regexp.cpp: # 50| [RegExpCharacterClassEscape] \D -# 51| [RegExpCharacterClassEscape] \h - -# 51| [RegExpSequence] \h\H -#-----| 0 -> [RegExpCharacterClassEscape] \h -#-----| 1 -> [RegExpCharacterClassEscape] \H - -# 51| [RegExpCharacterClassEscape] \H - # 52| [RegExpConstant, RegExpEscape] \n # 52| [RegExpSequence] \n\r\t diff --git a/cpp/ql/test/library-tests/regex/regexp.cpp b/cpp/ql/test/library-tests/regex/regexp.cpp index dcbc6b0f5841..7386b8ec5c6a 100644 --- a/cpp/ql/test/library-tests/regex/regexp.cpp +++ b/cpp/ql/test/library-tests/regex/regexp.cpp @@ -48,7 +48,7 @@ std::regex r_meta1(".*"); std::regex r_meta2("\\w+\\W"); std::regex r_meta3("\\s\\S"); std::regex r_meta4("\\d\\D"); -std::regex r_meta5("\\h\\H"); + std::regex r_meta6("\\n\\r\\t"); // Anchors diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index 8a3af59875e9..69a757ff4147 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -85,9 +85,6 @@ term | regexp.cpp:50:21:50:22 | \\d | RegExpCharacterClassEscape | | regexp.cpp:50:21:50:24 | \\d\\D | RegExpSequence | | regexp.cpp:50:23:50:24 | \\D | RegExpCharacterClassEscape | -| regexp.cpp:51:21:51:22 | \\h | RegExpCharacterClassEscape | -| regexp.cpp:51:21:51:24 | \\h\\H | RegExpSequence | -| regexp.cpp:51:23:51:24 | \\H | RegExpCharacterClassEscape | | regexp.cpp:52:21:52:22 | \\n | RegExpConstant,RegExpEscape | | regexp.cpp:52:21:52:26 | \\n\\r\\t | RegExpSequence | | regexp.cpp:52:23:52:24 | \\r | RegExpConstant,RegExpEscape | @@ -265,8 +262,6 @@ regExpNormalCharValue | regexp.cpp:49:23:49:24 | \\S | S | | regexp.cpp:50:21:50:22 | \\d | d | | regexp.cpp:50:23:50:24 | \\D | D | -| regexp.cpp:51:21:51:22 | \\h | h | -| regexp.cpp:51:23:51:24 | \\H | H | | regexp.cpp:52:21:52:22 | \\n | \n | | regexp.cpp:52:23:52:24 | \\r | \r | | regexp.cpp:52:25:52:26 | \\t | \t | From a471af97cadbbc398651bed5017d24730fcc15f6 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Thu, 23 Jul 2026 16:07:08 +0200 Subject: [PATCH 0164/2098] C++: Remove Ruby-style \p and \P named character properties --- .../semmle/code/cpp/regex/RegexTreeView.qll | 6 +-- .../code/cpp/regex/internal/ParseRegExp.qll | 51 ++----------------- .../library-tests/regex/locations.expected | 8 +-- .../test/library-tests/regex/parse.expected | 37 +++++++++----- cpp/ql/test/library-tests/regex/regexp.cpp | 10 ++-- .../test/library-tests/regex/regexp.expected | 21 ++++---- 6 files changed, 50 insertions(+), 83 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll index 4ed66a945a32..86214f910972 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll @@ -1163,13 +1163,13 @@ private module Impl implements RegexTreeViewSig { override string getAPrimaryQlClass() { result = "RegExpNamedCharacterProperty" } /** - * Gets the property name. For example, in `\p{Space}`, the result is - * `"Space"`. + * Gets the property name. For example, in `[[:digit:]]`, the result is + * `"digit"`. */ string getName() { result = re.getCharacterPropertyName(start, end) } /** - * Holds if the property is inverted. For example, it holds for `\p{^Digit}`, + * Holds if the property is inverted. For example, it holds for `[[:^digit:]]`, * which matches non-digits. */ predicate isInverted() { re.namedCharacterPropertyIsInverted(start, end) } diff --git a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll index a7d0d38919a1..cdb196f55cda 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll @@ -282,9 +282,8 @@ abstract class RegExp extends StringLiteral { ) } - /** Matches named character properties such as `\p{Word}` and `[[:digit:]]` */ + /** Matches named character properties such as `[[:digit:]]`. */ predicate namedCharacterProperty(int start, int end, string name) { - this.pStyleNamedCharacterProperty(start, end, name) or this.posixStyleNamedCharacterProperty(start, end, name) } @@ -315,49 +314,11 @@ abstract class RegExp extends StringLiteral { } /** - * Matches named character properties. For example: - * - `\p{Space}` - * - `\P{Digit}` upper-case P means inverted - * - `\p{^Word}` caret also means inverted + * Holds if the named character property is inverted. This, e.g., holds for `[[:^digit:]]`. * - * These can occur both inside and outside of character classes. - */ - private predicate pStyleNamedCharacterProperty(int start, int end, string name) { - this.escapingChar(start) and - this.getChar(start + 1) in ["p", "P"] and - this.getChar(start + 2) = "{" and - this.getChar(end - 1) = "}" and - end > start and - not exists(int i | start + 2 < i and i < end - 1 | this.getChar(i) = "}") and - exists(int nameStart | - this.getChar(start + 3) = "^" and nameStart = start + 4 - or - not this.getChar(start + 3) = "^" and nameStart = start + 3 - | - name = this.getText().substring(nameStart, end - 1) - ) - } - - /** - * Holds if the named character property is inverted. Examples for which it holds: - * - `\P{Digit}` upper-case P means inverted - * - `\p{^Word}` caret also means inverted - * - `[[:^digit:]]` - * - * Examples for which it doesn't hold: - * - `\p{Word}` - * - `\P{^Space}` - upper-case P and caret cancel each other out - * - `[[:alnum:]]` + * This does not hold for, e.g., `[[:alnum:]]`. */ predicate namedCharacterPropertyIsInverted(int start, int end) { - this.pStyleNamedCharacterProperty(start, end, _) and - exists(boolean upperP, boolean caret | - (if this.getChar(start + 1) = "P" then upperP = true else upperP = false) and - (if this.getChar(start + 3) = "^" then caret = true else caret = false) - | - upperP.booleanXor(caret) = true - ) - or this.posixStyleNamedCharacterProperty(start, end, _) and this.getChar(start + 3) = "^" } @@ -371,7 +332,6 @@ abstract class RegExp extends StringLiteral { this.escapingChar(start) and not this.numberedBackreference(start, _, _) and not this.namedBackreference(start, _, _) and - not this.pStyleNamedCharacterProperty(start, _, _) and ( // hex char \xhh this.getChar(start + 1) = "x" and end = start + 4 @@ -447,9 +407,6 @@ abstract class RegExp extends StringLiteral { ) and not exists(int x, int y | this.groupStart(x, y) and x <= start and y >= end) and not exists(int x, int y | this.backreference(x, y) and x <= start and y >= end) and - not exists(int x, int y | - this.pStyleNamedCharacterProperty(x, y, _) and x <= start and y >= end - ) and not exists(int x, int y | this.multiples(x, y, _, _) and x <= start and y >= end) } @@ -776,8 +733,6 @@ abstract class RegExp extends StringLiteral { this.charSet(start, end) or this.backreference(start, end) - or - this.pStyleNamedCharacterProperty(start, end, _) } private predicate qualifier(int start, int end, boolean maybeEmpty, boolean mayRepeatForever) { diff --git a/cpp/ql/test/library-tests/regex/locations.expected b/cpp/ql/test/library-tests/regex/locations.expected index c85866cef176..f6b6303ee427 100644 --- a/cpp/ql/test/library-tests/regex/locations.expected +++ b/cpp/ql/test/library-tests/regex/locations.expected @@ -29,10 +29,10 @@ | regexp.cpp:66:19:66:29 | (?'foo'fo+) | regexp.cpp | 66 | 19 | 66 | 29 | | regexp.cpp:69:21:69:28 | (a+)b+\\1 | regexp.cpp | 69 | 21 | 69 | 28 | | regexp.cpp:70:21:70:41 | (?q+)\\s+\\k+ | regexp.cpp | 70 | 21 | 70 | 41 | -| regexp.cpp:73:21:73:29 | \\p{Word}* | regexp.cpp | 73 | 21 | 73 | 29 | -| regexp.cpp:74:21:74:30 | \\P{Digit}+ | regexp.cpp | 74 | 21 | 74 | 30 | -| regexp.cpp:75:21:75:35 | \\p{^Alnum}{2,3} | regexp.cpp | 75 | 21 | 75 | 35 | -| regexp.cpp:76:21:76:35 | [a-f\\p{Digit}]+ | regexp.cpp | 76 | 21 | 76 | 35 | +| regexp.cpp:73:21:73:32 | [[:alnum:]]* | regexp.cpp | 73 | 21 | 73 | 32 | +| regexp.cpp:74:21:74:32 | [[:digit:]]+ | regexp.cpp | 74 | 21 | 74 | 32 | +| regexp.cpp:75:21:75:36 | [[:alnum:]]{2,3} | regexp.cpp | 75 | 21 | 75 | 36 | +| regexp.cpp:76:21:76:35 | [a-f[:digit:]]+ | regexp.cpp | 76 | 21 | 76 | 35 | | regexp.cpp:79:22:79:43 | [[:alpha:]][[:digit:]] | regexp.cpp | 79 | 22 | 79 | 43 | | regexp.cpp:82:22:82:41 | [[:alpha:][:digit:]] | regexp.cpp | 82 | 22 | 82 | 41 | | regexp.cpp:85:22:85:38 | [A-F[:digit:]a-f] | regexp.cpp | 85 | 22 | 85 | 38 | diff --git a/cpp/ql/test/library-tests/regex/parse.expected b/cpp/ql/test/library-tests/regex/parse.expected index 7296e9d3b0ec..024f588889b0 100644 --- a/cpp/ql/test/library-tests/regex/parse.expected +++ b/cpp/ql/test/library-tests/regex/parse.expected @@ -361,27 +361,36 @@ regexp.cpp: # 70| [RegExpPlus] \k+ #-----| 0 -> [RegExpBackRef] \k -# 73| [RegExpNamedCharacterProperty] \p{Word} +# 73| [RegExpCharacterClass] [[:alnum:]] +#-----| 0 -> [RegExpNamedCharacterProperty] [:alnum:] -# 73| [RegExpStar] \p{Word}* -#-----| 0 -> [RegExpNamedCharacterProperty] \p{Word} +# 73| [RegExpStar] [[:alnum:]]* +#-----| 0 -> [RegExpCharacterClass] [[:alnum:]] -# 74| [RegExpNamedCharacterProperty] \P{Digit} +# 73| [RegExpNamedCharacterProperty] [:alnum:] -# 74| [RegExpPlus] \P{Digit}+ -#-----| 0 -> [RegExpNamedCharacterProperty] \P{Digit} +# 74| [RegExpCharacterClass] [[:digit:]] +#-----| 0 -> [RegExpNamedCharacterProperty] [:digit:] + +# 74| [RegExpPlus] [[:digit:]]+ +#-----| 0 -> [RegExpCharacterClass] [[:digit:]] + +# 74| [RegExpNamedCharacterProperty] [:digit:] -# 75| [RegExpNamedCharacterProperty] \p{^Alnum} +# 75| [RegExpCharacterClass] [[:alnum:]] +#-----| 0 -> [RegExpNamedCharacterProperty] [:alnum:] -# 75| [RegExpRange] \p{^Alnum}{2,3} -#-----| 0 -> [RegExpNamedCharacterProperty] \p{^Alnum} +# 75| [RegExpRange] [[:alnum:]]{2,3} +#-----| 0 -> [RegExpCharacterClass] [[:alnum:]] -# 76| [RegExpCharacterClass] [a-f\p{Digit}] +# 75| [RegExpNamedCharacterProperty] [:alnum:] + +# 76| [RegExpCharacterClass] [a-f[:digit:]] #-----| 0 -> [RegExpCharacterRange] a-f -#-----| 1 -> [RegExpNamedCharacterProperty] \p{Digit} +#-----| 1 -> [RegExpNamedCharacterProperty] [:digit:] -# 76| [RegExpPlus] [a-f\p{Digit}]+ -#-----| 0 -> [RegExpCharacterClass] [a-f\p{Digit}] +# 76| [RegExpPlus] [a-f[:digit:]]+ +#-----| 0 -> [RegExpCharacterClass] [a-f[:digit:]] # 76| [RegExpConstant, RegExpNormalChar] a @@ -391,7 +400,7 @@ regexp.cpp: # 76| [RegExpConstant, RegExpNormalChar] f -# 76| [RegExpNamedCharacterProperty] \p{Digit} +# 76| [RegExpNamedCharacterProperty] [:digit:] # 79| [RegExpCharacterClass] [[:alpha:]] #-----| 0 -> [RegExpNamedCharacterProperty] [:alpha:] diff --git a/cpp/ql/test/library-tests/regex/regexp.cpp b/cpp/ql/test/library-tests/regex/regexp.cpp index 7386b8ec5c6a..c5f8780ce9d8 100644 --- a/cpp/ql/test/library-tests/regex/regexp.cpp +++ b/cpp/ql/test/library-tests/regex/regexp.cpp @@ -69,11 +69,11 @@ std::regex r_ng2("(?'foo'fo+)"); // single-quote named-group form std::regex r_bref1("(a+)b+\\1"); std::regex r_bref2("(?q+)\\s+\\k+"); -// Named character properties using the p-style syntax -std::regex r_prop1("\\p{Word}*"); -std::regex r_prop2("\\P{Digit}+"); -std::regex r_prop3("\\p{^Alnum}{2,3}"); -std::regex r_prop4("[a-f\\p{Digit}]+"); // Also valid inside character classes +// Named character properties using a single POSIX bracket expression +std::regex r_prop1("[[:alnum:]]*"); +std::regex r_prop2("[[:digit:]]+"); +std::regex r_prop3("[[:alnum:]]{2,3}"); +std::regex r_prop4("[a-f[:digit:]]+"); // Also valid inside character classes // Two separate character classes, each containing a single POSIX bracket expression std::regex r_posix1("[[:alpha:]][[:digit:]]"); diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index 69a757ff4147..c1da19559675 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -140,18 +140,21 @@ term | regexp.cpp:70:31:70:33 | \\s+ | RegExpPlus | | regexp.cpp:70:34:70:40 | \\k | RegExpBackRef | | regexp.cpp:70:34:70:41 | \\k+ | RegExpPlus | -| regexp.cpp:73:21:73:28 | \\p{Word} | RegExpNamedCharacterProperty | -| regexp.cpp:73:21:73:29 | \\p{Word}* | RegExpStar | -| regexp.cpp:74:21:74:29 | \\P{Digit} | RegExpNamedCharacterProperty | -| regexp.cpp:74:21:74:30 | \\P{Digit}+ | RegExpPlus | -| regexp.cpp:75:21:75:30 | \\p{^Alnum} | RegExpNamedCharacterProperty | -| regexp.cpp:75:21:75:35 | \\p{^Alnum}{2,3} | RegExpRange | -| regexp.cpp:76:21:76:34 | [a-f\\p{Digit}] | RegExpCharacterClass | -| regexp.cpp:76:21:76:35 | [a-f\\p{Digit}]+ | RegExpPlus | +| regexp.cpp:73:21:73:31 | [[:alnum:]] | RegExpCharacterClass | +| regexp.cpp:73:21:73:32 | [[:alnum:]]* | RegExpStar | +| regexp.cpp:73:22:73:30 | [:alnum:] | RegExpNamedCharacterProperty | +| regexp.cpp:74:21:74:31 | [[:digit:]] | RegExpCharacterClass | +| regexp.cpp:74:21:74:32 | [[:digit:]]+ | RegExpPlus | +| regexp.cpp:74:22:74:30 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:75:21:75:31 | [[:alnum:]] | RegExpCharacterClass | +| regexp.cpp:75:21:75:36 | [[:alnum:]]{2,3} | RegExpRange | +| regexp.cpp:75:22:75:30 | [:alnum:] | RegExpNamedCharacterProperty | +| regexp.cpp:76:21:76:34 | [a-f[:digit:]] | RegExpCharacterClass | +| regexp.cpp:76:21:76:35 | [a-f[:digit:]]+ | RegExpPlus | | regexp.cpp:76:22:76:22 | a | RegExpConstant,RegExpNormalChar | | regexp.cpp:76:22:76:24 | a-f | RegExpCharacterRange | | regexp.cpp:76:24:76:24 | f | RegExpConstant,RegExpNormalChar | -| regexp.cpp:76:25:76:33 | \\p{Digit} | RegExpNamedCharacterProperty | +| regexp.cpp:76:25:76:33 | [:digit:] | RegExpNamedCharacterProperty | | regexp.cpp:79:22:79:32 | [[:alpha:]] | RegExpCharacterClass | | regexp.cpp:79:22:79:43 | [[:alpha:]][[:digit:]] | RegExpSequence | | regexp.cpp:79:23:79:31 | [:alpha:] | RegExpNamedCharacterProperty | From c3fd9660085ef71083804936d4683ace11f8b9f7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 23 Jul 2026 10:09:02 +0000 Subject: [PATCH 0165/2098] C++: Remove Ruby-style (?#...) comment groups --- .../semmle/code/cpp/regex/internal/ParseRegExp.qll | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll index cdb196f55cda..810ffdc5f5b9 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll @@ -590,8 +590,6 @@ abstract class RegExp extends StringLiteral { or this.negativeLookbehindAssertionStart(start, end) or - this.commentGroupStart(start, end) - or this.simpleGroupStart(start, end) } @@ -599,7 +597,7 @@ abstract class RegExp extends StringLiteral { private predicate nonCapturingGroupStart(int start, int end) { this.isGroupStart(start) and this.getChar(start + 1) = "?" and - this.getChar(start + 2) = [":", "=", "<", "!", "#"] and + this.getChar(start + 2) = [":", "=", "<", "!"] and end = start + 3 } @@ -668,14 +666,6 @@ abstract class RegExp extends StringLiteral { end = start + 4 } - /** Matches the start of a comment group, i.e. `(?#`. */ - private predicate commentGroupStart(int start, int end) { - this.isGroupStart(start) and - this.getChar(start + 1) = "?" and - this.getChar(start + 2) = "#" and - end = start + 3 - } - /** Matches the contents of a group. */ predicate groupContents(int start, int end, int inStart, int inEnd) { this.groupStart(start, inStart) and From b2d076671d1d22afe010f82aa78a5e625adf53a8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 23 Jul 2026 10:10:15 +0000 Subject: [PATCH 0166/2098] C++: Remove single-quote named capture groups --- .../semmle/code/cpp/regex/internal/ParseRegExp.qll | 6 ------ cpp/ql/test/library-tests/regex/locations.expected | 1 - cpp/ql/test/library-tests/regex/parse.expected | 14 -------------- cpp/ql/test/library-tests/regex/regexp.cpp | 2 +- cpp/ql/test/library-tests/regex/regexp.expected | 9 --------- 5 files changed, 1 insertion(+), 31 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll index 810ffdc5f5b9..18b7459f2d85 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll @@ -611,7 +611,6 @@ abstract class RegExp extends StringLiteral { /** * Matches the start of a named group, such as: * - `(?\w+)` - * - `(?'name'\w+)` */ private predicate namedGroupStart(int start, int end) { this.isGroupStart(start) and @@ -624,11 +623,6 @@ abstract class RegExp extends StringLiteral { nameEnd = min(int i | i > start + 3 and this.getChar(i) = ">") and end = nameEnd + 1 ) - or - this.getChar(start + 2) = "'" and - exists(int nameEnd | - nameEnd = min(int i | i > start + 2 and this.getChar(i) = "'") and end = nameEnd + 1 - ) ) } diff --git a/cpp/ql/test/library-tests/regex/locations.expected b/cpp/ql/test/library-tests/regex/locations.expected index f6b6303ee427..9dc8a639c4af 100644 --- a/cpp/ql/test/library-tests/regex/locations.expected +++ b/cpp/ql/test/library-tests/regex/locations.expected @@ -26,7 +26,6 @@ | regexp.cpp:61:20:61:28 | (a\|b\|cd)e | regexp.cpp | 61 | 20 | 61 | 28 | | regexp.cpp:62:20:62:27 | (?::+)\\w | regexp.cpp | 62 | 20 | 62 | 27 | | regexp.cpp:65:19:65:28 | (?\\w+) | regexp.cpp | 65 | 19 | 65 | 28 | -| regexp.cpp:66:19:66:29 | (?'foo'fo+) | regexp.cpp | 66 | 19 | 66 | 29 | | regexp.cpp:69:21:69:28 | (a+)b+\\1 | regexp.cpp | 69 | 21 | 69 | 28 | | regexp.cpp:70:21:70:41 | (?q+)\\s+\\k+ | regexp.cpp | 70 | 21 | 70 | 41 | | regexp.cpp:73:21:73:32 | [[:alnum:]]* | regexp.cpp | 73 | 21 | 73 | 32 | diff --git a/cpp/ql/test/library-tests/regex/parse.expected b/cpp/ql/test/library-tests/regex/parse.expected index 024f588889b0..fcc4149fcd65 100644 --- a/cpp/ql/test/library-tests/regex/parse.expected +++ b/cpp/ql/test/library-tests/regex/parse.expected @@ -304,20 +304,6 @@ regexp.cpp: # 65| [RegExpPlus] \w+ #-----| 0 -> [RegExpCharacterClassEscape] \w -# 66| [RegExpGroup] (?'foo'fo+) -#-----| 0 -> [RegExpSequence] fo+ - -# 66| [RegExpConstant, RegExpNormalChar] f - -# 66| [RegExpSequence] fo+ -#-----| 0 -> [RegExpConstant, RegExpNormalChar] f -#-----| 1 -> [RegExpPlus] o+ - -# 66| [RegExpConstant, RegExpNormalChar] o - -# 66| [RegExpPlus] o+ -#-----| 0 -> [RegExpConstant, RegExpNormalChar] o - # 69| [RegExpGroup] (a+) #-----| 0 -> [RegExpPlus] a+ diff --git a/cpp/ql/test/library-tests/regex/regexp.cpp b/cpp/ql/test/library-tests/regex/regexp.cpp index c5f8780ce9d8..b696f2f7fd3d 100644 --- a/cpp/ql/test/library-tests/regex/regexp.cpp +++ b/cpp/ql/test/library-tests/regex/regexp.cpp @@ -63,7 +63,7 @@ std::regex r_grp4("(?::+)\\w"); // Non-capturing group matching colons // Named groups std::regex r_ng1("(?\\w+)"); -std::regex r_ng2("(?'foo'fo+)"); // single-quote named-group form + // Backreferences std::regex r_bref1("(a+)b+\\1"); diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index c1da19559675..8df6563f06ea 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -1,12 +1,10 @@ groupName | regexp.cpp:65:19:65:28 | (?\\w+) | id | -| regexp.cpp:66:19:66:29 | (?'foo'fo+) | foo | | regexp.cpp:70:21:70:30 | (?q+) | qux | groupNumber | regexp.cpp:59:20:59:24 | (foo) | 1 | | regexp.cpp:60:22:60:26 | (o\|b) | 1 | | regexp.cpp:61:20:61:27 | (a\|b\|cd) | 1 | -| regexp.cpp:66:19:66:29 | (?'foo'fo+) | 1 | | regexp.cpp:69:21:69:24 | (a+) | 1 | term | regexp.cpp:18:19:18:21 | abc | RegExpConstant,RegExpNormalChar | @@ -120,11 +118,6 @@ term | regexp.cpp:65:19:65:28 | (?\\w+) | RegExpGroup | | regexp.cpp:65:25:65:26 | \\w | RegExpCharacterClassEscape | | regexp.cpp:65:25:65:27 | \\w+ | RegExpPlus | -| regexp.cpp:66:19:66:29 | (?'foo'fo+) | RegExpGroup | -| regexp.cpp:66:26:66:26 | f | RegExpConstant,RegExpNormalChar | -| regexp.cpp:66:26:66:28 | fo+ | RegExpSequence | -| regexp.cpp:66:27:66:27 | o | RegExpConstant,RegExpNormalChar | -| regexp.cpp:66:27:66:28 | o+ | RegExpPlus | | regexp.cpp:69:21:69:24 | (a+) | RegExpGroup | | regexp.cpp:69:21:69:28 | (a+)b+\\1 | RegExpSequence | | regexp.cpp:69:22:69:22 | a | RegExpConstant,RegExpNormalChar | @@ -282,8 +275,6 @@ regExpNormalCharValue | regexp.cpp:62:23:62:23 | : | : | | regexp.cpp:62:26:62:27 | \\w | w | | regexp.cpp:65:25:65:26 | \\w | w | -| regexp.cpp:66:26:66:26 | f | f | -| regexp.cpp:66:27:66:27 | o | o | | regexp.cpp:69:22:69:22 | a | a | | regexp.cpp:69:25:69:25 | b | b | | regexp.cpp:70:28:70:28 | q | q | From 985a2ba6be458e6a0d55658fa03eda733abed04b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 23 Jul 2026 10:12:01 +0000 Subject: [PATCH 0167/2098] C++: Remove named capture groups --- .../semmle/code/cpp/regex/RegexTreeView.qll | 11 +------ .../code/cpp/regex/internal/ParseRegExp.qll | 31 +------------------ .../library-tests/regex/locations.expected | 2 -- .../test/library-tests/regex/parse.expected | 31 ------------------- cpp/ql/test/library-tests/regex/regexp.cpp | 6 ++-- .../test/library-tests/regex/regexp.expected | 17 ---------- cpp/ql/test/library-tests/regex/regexp.ql | 2 -- 7 files changed, 5 insertions(+), 95 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll index 86214f910972..21e7ec428d40 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll @@ -860,12 +860,6 @@ private module Impl implements RegexTreeViewSig { /** Holds if this is a capture group. */ predicate isCapture() { exists(this.getNumber()) } - /** Holds if this is a named capture group. */ - predicate isNamed() { exists(this.getName()) } - - /** Gets the name of this capture group, if any. */ - string getName() { result = re.getGroupName(start, end) } - override RegExpTerm getChild(int i) { result.getRegExp() = re and i = 0 and @@ -1138,10 +1132,7 @@ private module Impl implements RegexTreeViewSig { /** Gets the capture group this back reference refers to. */ RegExpGroup getGroup() { result.getLiteral() = this.getLiteral() and - ( - result.getNumber() = this.getNumber() or - result.getName() = this.getName() - ) + result.getNumber() = this.getNumber() } override RegExpTerm getChild(int i) { none() } diff --git a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll index 18b7459f2d85..47011350b131 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll @@ -495,15 +495,6 @@ abstract class RegExp extends StringLiteral { count(int i | this.group(i, _) and i < start and not this.nonCapturingGroupStart(i, _)) + 1 } - /** Gets the name, if it has one, of the group in start,end */ - string getGroupName(int start, int end) { - this.group(start, end) and - exists(int nameEnd | - this.namedGroupStart(start, nameEnd) and - result = this.getText().substring(start + 3, nameEnd - 1) - ) - } - /** Whether the text in the range start, end is a group and can match the empty string. */ predicate zeroWidthMatch(int start, int end) { this.emptyGroup(start, end) @@ -580,8 +571,6 @@ abstract class RegExp extends StringLiteral { private predicate groupStart(int start, int end) { this.nonCapturingGroupStart(start, end) or - this.namedGroupStart(start, end) - or this.lookaheadAssertionStart(start, end) or this.negativeLookaheadAssertionStart(start, end) @@ -597,7 +586,7 @@ abstract class RegExp extends StringLiteral { private predicate nonCapturingGroupStart(int start, int end) { this.isGroupStart(start) and this.getChar(start + 1) = "?" and - this.getChar(start + 2) = [":", "=", "<", "!"] and + this.getChar(start + 2) = [":", "=", "!"] and end = start + 3 } @@ -608,24 +597,6 @@ abstract class RegExp extends StringLiteral { end = start + 1 } - /** - * Matches the start of a named group, such as: - * - `(?\w+)` - */ - private predicate namedGroupStart(int start, int end) { - this.isGroupStart(start) and - this.getChar(start + 1) = "?" and - ( - this.getChar(start + 2) = "<" and - not this.getChar(start + 3) = "=" and // (?<=foo) is a positive lookbehind assertion - not this.getChar(start + 3) = "!" and // (? start + 3 and this.getChar(i) = ">") and - end = nameEnd + 1 - ) - ) - } - /** Matches the start of a positive lookahead assertion, i.e. `(?=`. */ private predicate lookaheadAssertionStart(int start, int end) { this.isGroupStart(start) and diff --git a/cpp/ql/test/library-tests/regex/locations.expected b/cpp/ql/test/library-tests/regex/locations.expected index 9dc8a639c4af..74433c987cdb 100644 --- a/cpp/ql/test/library-tests/regex/locations.expected +++ b/cpp/ql/test/library-tests/regex/locations.expected @@ -25,9 +25,7 @@ | regexp.cpp:60:20:60:28 | fo(o\|b)ar | regexp.cpp | 60 | 20 | 60 | 28 | | regexp.cpp:61:20:61:28 | (a\|b\|cd)e | regexp.cpp | 61 | 20 | 61 | 28 | | regexp.cpp:62:20:62:27 | (?::+)\\w | regexp.cpp | 62 | 20 | 62 | 27 | -| regexp.cpp:65:19:65:28 | (?\\w+) | regexp.cpp | 65 | 19 | 65 | 28 | | regexp.cpp:69:21:69:28 | (a+)b+\\1 | regexp.cpp | 69 | 21 | 69 | 28 | -| regexp.cpp:70:21:70:41 | (?q+)\\s+\\k+ | regexp.cpp | 70 | 21 | 70 | 41 | | regexp.cpp:73:21:73:32 | [[:alnum:]]* | regexp.cpp | 73 | 21 | 73 | 32 | | regexp.cpp:74:21:74:32 | [[:digit:]]+ | regexp.cpp | 74 | 21 | 74 | 32 | | regexp.cpp:75:21:75:36 | [[:alnum:]]{2,3} | regexp.cpp | 75 | 21 | 75 | 36 | diff --git a/cpp/ql/test/library-tests/regex/parse.expected b/cpp/ql/test/library-tests/regex/parse.expected index fcc4149fcd65..f4430d70df43 100644 --- a/cpp/ql/test/library-tests/regex/parse.expected +++ b/cpp/ql/test/library-tests/regex/parse.expected @@ -296,14 +296,6 @@ regexp.cpp: # 62| [RegExpCharacterClassEscape] \w -# 65| [RegExpGroup] (?\w+) -#-----| 0 -> [RegExpPlus] \w+ - -# 65| [RegExpCharacterClassEscape] \w - -# 65| [RegExpPlus] \w+ -#-----| 0 -> [RegExpCharacterClassEscape] \w - # 69| [RegExpGroup] (a+) #-----| 0 -> [RegExpPlus] a+ @@ -324,29 +316,6 @@ regexp.cpp: # 69| [RegExpBackRef] \1 -# 70| [RegExpGroup] (?q+) -#-----| 0 -> [RegExpPlus] q+ - -# 70| [RegExpSequence] (?q+)\s+\k+ -#-----| 0 -> [RegExpGroup] (?q+) -#-----| 1 -> [RegExpPlus] \s+ -#-----| 2 -> [RegExpPlus] \k+ - -# 70| [RegExpConstant, RegExpNormalChar] q - -# 70| [RegExpPlus] q+ -#-----| 0 -> [RegExpConstant, RegExpNormalChar] q - -# 70| [RegExpCharacterClassEscape] \s - -# 70| [RegExpPlus] \s+ -#-----| 0 -> [RegExpCharacterClassEscape] \s - -# 70| [RegExpBackRef] \k - -# 70| [RegExpPlus] \k+ -#-----| 0 -> [RegExpBackRef] \k - # 73| [RegExpCharacterClass] [[:alnum:]] #-----| 0 -> [RegExpNamedCharacterProperty] [:alnum:] diff --git a/cpp/ql/test/library-tests/regex/regexp.cpp b/cpp/ql/test/library-tests/regex/regexp.cpp index b696f2f7fd3d..6fed37ac70d2 100644 --- a/cpp/ql/test/library-tests/regex/regexp.cpp +++ b/cpp/ql/test/library-tests/regex/regexp.cpp @@ -61,13 +61,13 @@ std::regex r_grp2("fo(o|b)ar"); std::regex r_grp3("(a|b|cd)e"); std::regex r_grp4("(?::+)\\w"); // Non-capturing group matching colons -// Named groups -std::regex r_ng1("(?\\w+)"); + + // Backreferences std::regex r_bref1("(a+)b+\\1"); -std::regex r_bref2("(?q+)\\s+\\k+"); + // Named character properties using a single POSIX bracket expression std::regex r_prop1("[[:alnum:]]*"); diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index 8df6563f06ea..413ac7ebe2bc 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -1,6 +1,3 @@ -groupName -| regexp.cpp:65:19:65:28 | (?\\w+) | id | -| regexp.cpp:70:21:70:30 | (?q+) | qux | groupNumber | regexp.cpp:59:20:59:24 | (foo) | 1 | | regexp.cpp:60:22:60:26 | (o\|b) | 1 | @@ -115,9 +112,6 @@ term | regexp.cpp:62:23:62:23 | : | RegExpConstant,RegExpNormalChar | | regexp.cpp:62:23:62:24 | :+ | RegExpPlus | | regexp.cpp:62:26:62:27 | \\w | RegExpCharacterClassEscape | -| regexp.cpp:65:19:65:28 | (?\\w+) | RegExpGroup | -| regexp.cpp:65:25:65:26 | \\w | RegExpCharacterClassEscape | -| regexp.cpp:65:25:65:27 | \\w+ | RegExpPlus | | regexp.cpp:69:21:69:24 | (a+) | RegExpGroup | | regexp.cpp:69:21:69:28 | (a+)b+\\1 | RegExpSequence | | regexp.cpp:69:22:69:22 | a | RegExpConstant,RegExpNormalChar | @@ -125,14 +119,6 @@ term | regexp.cpp:69:25:69:25 | b | RegExpConstant,RegExpNormalChar | | regexp.cpp:69:25:69:26 | b+ | RegExpPlus | | regexp.cpp:69:27:69:28 | \\1 | RegExpBackRef | -| regexp.cpp:70:21:70:30 | (?q+) | RegExpGroup | -| regexp.cpp:70:21:70:41 | (?q+)\\s+\\k+ | RegExpSequence | -| regexp.cpp:70:28:70:28 | q | RegExpConstant,RegExpNormalChar | -| regexp.cpp:70:28:70:29 | q+ | RegExpPlus | -| regexp.cpp:70:31:70:32 | \\s | RegExpCharacterClassEscape | -| regexp.cpp:70:31:70:33 | \\s+ | RegExpPlus | -| regexp.cpp:70:34:70:40 | \\k | RegExpBackRef | -| regexp.cpp:70:34:70:41 | \\k+ | RegExpPlus | | regexp.cpp:73:21:73:31 | [[:alnum:]] | RegExpCharacterClass | | regexp.cpp:73:21:73:32 | [[:alnum:]]* | RegExpStar | | regexp.cpp:73:22:73:30 | [:alnum:] | RegExpNamedCharacterProperty | @@ -274,11 +260,8 @@ regExpNormalCharValue | regexp.cpp:61:28:61:28 | e | e | | regexp.cpp:62:23:62:23 | : | : | | regexp.cpp:62:26:62:27 | \\w | w | -| regexp.cpp:65:25:65:26 | \\w | w | | regexp.cpp:69:22:69:22 | a | a | | regexp.cpp:69:25:69:25 | b | b | -| regexp.cpp:70:28:70:28 | q | q | -| regexp.cpp:70:31:70:32 | \\s | s | | regexp.cpp:76:22:76:22 | a | a | | regexp.cpp:76:24:76:24 | f | f | | regexp.cpp:85:23:85:23 | A | A | diff --git a/cpp/ql/test/library-tests/regex/regexp.ql b/cpp/ql/test/library-tests/regex/regexp.ql index a29717199e24..b8eb41e12dbb 100644 --- a/cpp/ql/test/library-tests/regex/regexp.ql +++ b/cpp/ql/test/library-tests/regex/regexp.ql @@ -6,8 +6,6 @@ class RegExpTest extends RegExp { RegExpTest() { any() } } -query predicate groupName(RegExpGroup g, string name) { name = g.getName() } - query predicate groupNumber(RegExpGroup g, int number) { number = g.getNumber() } query predicate term(RegExpTerm term, string c) { c = term.getPrimaryQlClasses() } From bb96e9029646eb9d2f8957be622871b030507879 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 23 Jul 2026 10:13:23 +0000 Subject: [PATCH 0168/2098] C++: Remove named backreferences --- .../lib/semmle/code/cpp/regex/RegexTreeView.qll | 10 ++-------- .../code/cpp/regex/internal/ParseRegExp.qll | 17 ----------------- 2 files changed, 2 insertions(+), 25 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll index 21e7ec428d40..7e42c2b16943 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll @@ -1106,14 +1106,13 @@ private module Impl implements RegexTreeViewSig { } /** - * A back reference, that is, a term of the form `\i` or `\k` - * in a regular expression. + * A back reference, that is, a term of the form `\i` in a regular + * expression. * * Examples: * * ``` * \1 - * (?P=quote) * ``` */ class RegExpBackRef extends RegExpTerm, TRegExpBackRef { @@ -1124,11 +1123,6 @@ private module Impl implements RegexTreeViewSig { */ int getNumber() { result = re.getBackRefNumber(start, end) } - /** - * Gets the name of the capture group this back reference refers to, if any. - */ - string getName() { result = re.getBackRefName(start, end) } - /** Gets the capture group this back reference refers to. */ RegExpGroup getGroup() { result.getLiteral() = this.getLiteral() and diff --git a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll index 47011350b131..3b7596fb17e9 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll @@ -331,7 +331,6 @@ abstract class RegExp extends StringLiteral { predicate escapedCharacter(int start, int end) { this.escapingChar(start) and not this.numberedBackreference(start, _, _) and - not this.namedBackreference(start, _, _) and ( // hex char \xhh this.getChar(start + 1) = "x" and end = start + 4 @@ -639,17 +638,6 @@ abstract class RegExp extends StringLiteral { this.isGroupEnd(inEnd) } - /** Matches a named backreference, e.g. `\k`. */ - predicate namedBackreference(int start, int end, string name) { - this.escapingChar(start) and - this.getChar(start + 1) = "k" and - this.getChar(start + 2) = "<" and - exists(int nameEnd | nameEnd = min(int i | i > start + 3 and this.getChar(i) = ">") | - end = nameEnd + 1 and - name = this.getText().substring(start + 3, nameEnd) - ) - } - /** Matches a numbered backreference, e.g. `\1`. */ predicate numberedBackreference(int start, int end, int value) { this.escapingChar(start) and @@ -669,16 +657,11 @@ abstract class RegExp extends StringLiteral { /** Whether the text in the range `start,end` is a back reference */ predicate backreference(int start, int end) { this.numberedBackreference(start, end, _) - or - this.namedBackreference(start, end, _) } /** Gets the number of the back reference in start,end */ int getBackRefNumber(int start, int end) { this.numberedBackreference(start, end, result) } - /** Gets the name, if it has one, of the back reference in start,end */ - string getBackRefName(int start, int end) { this.namedBackreference(start, end, result) } - private predicate baseItem(int start, int end) { this.characterItem(start, end) and not exists(int x, int y | this.charSet(x, y) and x <= start and y >= end) From da931e4ba304cfaf045f324d6de290ba7284bc76 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 23 Jul 2026 10:15:43 +0000 Subject: [PATCH 0169/2098] C++: Remove lookbehind assertions --- .../semmle/code/cpp/regex/RegexTreeView.qll | 44 +----------------- .../code/cpp/regex/internal/ParseRegExp.qll | 46 +------------------ 2 files changed, 3 insertions(+), 87 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll index 7e42c2b16943..313fe32f1a7b 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll @@ -993,15 +993,13 @@ private module Impl implements RegexTreeViewSig { } /** - * A zero-width lookahead or lookbehind assertion. + * A zero-width lookahead assertion. * * Examples: * * ``` * (?=\w) * (?!\n) - * (?<=\.) - * (? Date: Fri, 24 Jul 2026 11:14:41 +0200 Subject: [PATCH 0170/2098] C++: Remove {,m} quantifier form --- cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll | 2 +- cpp/ql/test/library-tests/regex/locations.expected | 1 - cpp/ql/test/library-tests/regex/parse.expected | 5 ----- cpp/ql/test/library-tests/regex/regexp.cpp | 2 +- cpp/ql/test/library-tests/regex/regexp.expected | 3 --- 5 files changed, 2 insertions(+), 11 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll index 5a0569b8594a..84590db2172c 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll @@ -670,7 +670,7 @@ abstract class RegExp extends StringLiteral { lower = inner and upper = lower or - match = text.regexpFind("\\{[0-9]*,[0-9]*\\}", _, start) and + match = text.regexpFind("\\{[0-9]+,[0-9]*\\}", _, start) and exists(int commaIndex | commaIndex = inner.indexOf(",") and lower = inner.prefix(commaIndex) and diff --git a/cpp/ql/test/library-tests/regex/locations.expected b/cpp/ql/test/library-tests/regex/locations.expected index 74433c987cdb..6da60c274849 100644 --- a/cpp/ql/test/library-tests/regex/locations.expected +++ b/cpp/ql/test/library-tests/regex/locations.expected @@ -1,7 +1,6 @@ | regexp.cpp:18:19:18:21 | abc | regexp.cpp | 18 | 19 | 18 | 21 | | regexp.cpp:21:20:21:26 | a*b+c?d | regexp.cpp | 21 | 20 | 21 | 26 | | regexp.cpp:22:20:22:25 | a{4,8} | regexp.cpp | 22 | 20 | 22 | 25 | -| regexp.cpp:23:20:23:24 | a{,8} | regexp.cpp | 23 | 20 | 23 | 24 | | regexp.cpp:24:20:24:24 | a{3,} | regexp.cpp | 24 | 20 | 24 | 24 | | regexp.cpp:25:20:25:23 | a{7} | regexp.cpp | 25 | 20 | 25 | 23 | | regexp.cpp:28:19:28:25 | foo\|bar | regexp.cpp | 28 | 19 | 28 | 25 | diff --git a/cpp/ql/test/library-tests/regex/parse.expected b/cpp/ql/test/library-tests/regex/parse.expected index f4430d70df43..62fd2c5b60cb 100644 --- a/cpp/ql/test/library-tests/regex/parse.expected +++ b/cpp/ql/test/library-tests/regex/parse.expected @@ -29,11 +29,6 @@ regexp.cpp: # 22| [RegExpRange] a{4,8} #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 23| [RegExpConstant, RegExpNormalChar] a - -# 23| [RegExpRange] a{,8} -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a - # 24| [RegExpConstant, RegExpNormalChar] a # 24| [InfiniteRepetitionQuantifier, RegExpRange] a{3,} diff --git a/cpp/ql/test/library-tests/regex/regexp.cpp b/cpp/ql/test/library-tests/regex/regexp.cpp index 6fed37ac70d2..ede36252b6f6 100644 --- a/cpp/ql/test/library-tests/regex/regexp.cpp +++ b/cpp/ql/test/library-tests/regex/regexp.cpp @@ -20,7 +20,7 @@ std::regex r_abc("abc"); // Repetition std::regex r_rep1("a*b+c?d"); std::regex r_rep2("a{4,8}"); -std::regex r_rep3("a{,8}"); + std::regex r_rep4("a{3,}"); std::regex r_rep5("a{7}"); diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index 413ac7ebe2bc..1eb1b1e5ff02 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -15,8 +15,6 @@ term | regexp.cpp:21:26:21:26 | d | RegExpConstant,RegExpNormalChar | | regexp.cpp:22:20:22:20 | a | RegExpConstant,RegExpNormalChar | | regexp.cpp:22:20:22:25 | a{4,8} | RegExpRange | -| regexp.cpp:23:20:23:20 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:23:20:23:24 | a{,8} | RegExpRange | | regexp.cpp:24:20:24:20 | a | RegExpConstant,RegExpNormalChar | | regexp.cpp:24:20:24:24 | a{3,} | InfiniteRepetitionQuantifier,RegExpRange | | regexp.cpp:25:20:25:20 | a | RegExpConstant,RegExpNormalChar | @@ -207,7 +205,6 @@ regExpNormalCharValue | regexp.cpp:21:24:21:24 | c | c | | regexp.cpp:21:26:21:26 | d | d | | regexp.cpp:22:20:22:20 | a | a | -| regexp.cpp:23:20:23:20 | a | a | | regexp.cpp:24:20:24:20 | a | a | | regexp.cpp:25:20:25:20 | a | a | | regexp.cpp:28:19:28:21 | foo | foo | From 64a9a754a47a1f49d7bc2611e3fbb80c093933e5 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 7 Aug 2026 16:12:23 +0200 Subject: [PATCH 0171/2098] C++: Remove inverted named character properties --- .../semmle/code/cpp/regex/RegexTreeView.qll | 12 +++--------- .../code/cpp/regex/internal/ParseRegExp.qll | 18 +----------------- 2 files changed, 4 insertions(+), 26 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll index 313fe32f1a7b..e9b27d27a79d 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll @@ -1112,12 +1112,6 @@ private module Impl implements RegexTreeViewSig { * `"digit"`. */ string getName() { result = re.getCharacterPropertyName(start, end) } - - /** - * Holds if the property is inverted. For example, it holds for `[[:^digit:]]`, - * which matches non-digits. - */ - predicate isInverted() { re.namedCharacterPropertyIsInverted(start, end) } } class Top = RegExpParent; @@ -1132,13 +1126,13 @@ private module Impl implements RegexTreeViewSig { // TODO: expand to cover more properties exists(RegExpNamedCharacterProperty escape | term = escape | escape.getName().toLowerCase() = "digit" and - if escape.isInverted() then clazz = "D" else clazz = "d" + clazz = "d" or escape.getName().toLowerCase() = "space" and - if escape.isInverted() then clazz = "S" else clazz = "s" + clazz = "s" or escape.getName().toLowerCase() = "word" and - if escape.isInverted() then clazz = "W" else clazz = "w" + clazz = "w" ) } diff --git a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll index 84590db2172c..b6029c187a7a 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll @@ -304,23 +304,7 @@ abstract class RegExp extends StringLiteral { | e ) and - exists(int nameStart | - this.getChar(start + 2) = "^" and nameStart = start + 3 - or - not this.getChar(start + 2) = "^" and nameStart = start + 2 - | - name = this.getText().substring(nameStart, end - 2) - ) - } - - /** - * Holds if the named character property is inverted. This, e.g., holds for `[[:^digit:]]`. - * - * This does not hold for, e.g., `[[:alnum:]]`. - */ - predicate namedCharacterPropertyIsInverted(int start, int end) { - this.posixStyleNamedCharacterProperty(start, end, _) and - this.getChar(start + 3) = "^" + name = this.getText().substring(start + 2, end - 2) } /** From 24251de5ea4b8a6729a4b9ed267c0bffb67713f1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 23 Jul 2026 10:16:18 +0000 Subject: [PATCH 0172/2098] C++: Add control-escape tests (pre-fix) Clean up test source while here --- .../library-tests/regex/locations.expected | 90 +-- .../test/library-tests/regex/parse.expected | 382 ++++++------ cpp/ql/test/library-tests/regex/regexp.cpp | 36 +- .../test/library-tests/regex/regexp.expected | 566 +++++++++--------- 4 files changed, 548 insertions(+), 526 deletions(-) diff --git a/cpp/ql/test/library-tests/regex/locations.expected b/cpp/ql/test/library-tests/regex/locations.expected index 6da60c274849..8bcd383853d0 100644 --- a/cpp/ql/test/library-tests/regex/locations.expected +++ b/cpp/ql/test/library-tests/regex/locations.expected @@ -1,47 +1,49 @@ | regexp.cpp:18:19:18:21 | abc | regexp.cpp | 18 | 19 | 18 | 21 | | regexp.cpp:21:20:21:26 | a*b+c?d | regexp.cpp | 21 | 20 | 21 | 26 | | regexp.cpp:22:20:22:25 | a{4,8} | regexp.cpp | 22 | 20 | 22 | 25 | -| regexp.cpp:24:20:24:24 | a{3,} | regexp.cpp | 24 | 20 | 24 | 24 | -| regexp.cpp:25:20:25:23 | a{7} | regexp.cpp | 25 | 20 | 25 | 23 | -| regexp.cpp:28:19:28:25 | foo\|bar | regexp.cpp | 28 | 19 | 28 | 25 | -| regexp.cpp:31:19:31:23 | [abc] | regexp.cpp | 31 | 19 | 31 | 23 | -| regexp.cpp:32:19:32:30 | [a-fA-F0-9_] | regexp.cpp | 32 | 19 | 32 | 30 | -| regexp.cpp:34:19:34:23 | [\\w]+ | regexp.cpp | 34 | 19 | 34 | 23 | -| regexp.cpp:35:19:35:27 | \\[\\][123] | regexp.cpp | 35 | 19 | 35 | 27 | -| regexp.cpp:36:19:36:24 | [^A-Z] | regexp.cpp | 36 | 19 | 36 | 24 | -| regexp.cpp:37:19:37:21 | []] | regexp.cpp | 37 | 19 | 37 | 21 | -| regexp.cpp:38:19:38:22 | [^]] | regexp.cpp | 38 | 19 | 38 | 22 | -| regexp.cpp:39:19:39:22 | [^-] | regexp.cpp | 39 | 19 | 39 | 22 | -| regexp.cpp:40:20:40:22 | [\|] | regexp.cpp | 40 | 20 | 40 | 22 | -| regexp.cpp:43:22:43:31 | [[a-f]A-F] | regexp.cpp | 43 | 22 | 43 | 31 | -| regexp.cpp:46:21:46:22 | .* | regexp.cpp | 46 | 21 | 46 | 22 | -| regexp.cpp:48:21:48:25 | \\w+\\W | regexp.cpp | 48 | 21 | 48 | 25 | -| regexp.cpp:49:21:49:24 | \\s\\S | regexp.cpp | 49 | 21 | 49 | 24 | -| regexp.cpp:50:21:50:24 | \\d\\D | regexp.cpp | 50 | 21 | 50 | 24 | -| regexp.cpp:52:21:52:26 | \\n\\r\\t | regexp.cpp | 52 | 21 | 52 | 26 | -| regexp.cpp:56:20:56:25 | \\b!a\\B | regexp.cpp | 56 | 20 | 56 | 25 | -| regexp.cpp:59:20:59:28 | (foo)*bar | regexp.cpp | 59 | 20 | 59 | 28 | -| regexp.cpp:60:20:60:28 | fo(o\|b)ar | regexp.cpp | 60 | 20 | 60 | 28 | -| regexp.cpp:61:20:61:28 | (a\|b\|cd)e | regexp.cpp | 61 | 20 | 61 | 28 | -| regexp.cpp:62:20:62:27 | (?::+)\\w | regexp.cpp | 62 | 20 | 62 | 27 | -| regexp.cpp:69:21:69:28 | (a+)b+\\1 | regexp.cpp | 69 | 21 | 69 | 28 | -| regexp.cpp:73:21:73:32 | [[:alnum:]]* | regexp.cpp | 73 | 21 | 73 | 32 | -| regexp.cpp:74:21:74:32 | [[:digit:]]+ | regexp.cpp | 74 | 21 | 74 | 32 | -| regexp.cpp:75:21:75:36 | [[:alnum:]]{2,3} | regexp.cpp | 75 | 21 | 75 | 36 | -| regexp.cpp:76:21:76:35 | [a-f[:digit:]]+ | regexp.cpp | 76 | 21 | 76 | 35 | -| regexp.cpp:79:22:79:43 | [[:alpha:]][[:digit:]] | regexp.cpp | 79 | 22 | 79 | 43 | -| regexp.cpp:82:22:82:41 | [[:alpha:][:digit:]] | regexp.cpp | 82 | 22 | 82 | 41 | -| regexp.cpp:85:22:85:38 | [A-F[:digit:]a-f] | regexp.cpp | 85 | 22 | 85 | 38 | -| regexp.cpp:88:22:88:30 | [:digit:] | regexp.cpp | 88 | 22 | 88 | 30 | -| regexp.cpp:94:25:94:28 | a\\nb | regexp.cpp | 94 | 25 | 94 | 28 | -| regexp.cpp:95:37:95:40 | a\\nc | regexp.cpp | 95 | 37 | 95 | 40 | -| regexp.cpp:96:39:96:42 | a\\nc | regexp.cpp | 96 | 39 | 96 | 42 | -| regexp.cpp:97:38:97:41 | a\\nc | regexp.cpp | 97 | 38 | 97 | 41 | -| regexp.cpp:98:38:98:41 | a\\nc | regexp.cpp | 98 | 38 | 98 | 41 | -| regexp.cpp:99:23:99:26 | a\\nc | regexp.cpp | 99 | 23 | 99 | 26 | -| regexp.cpp:100:40:100:43 | a\\nc | regexp.cpp | 100 | 40 | 100 | 43 | -| regexp.cpp:101:42:101:45 | a\\nc | regexp.cpp | 101 | 42 | 101 | 45 | -| regexp.cpp:102:41:102:44 | a\\nc | regexp.cpp | 102 | 41 | 102 | 44 | -| regexp.cpp:103:41:103:44 | a\\nc | regexp.cpp | 103 | 41 | 103 | 44 | -| regexp.cpp:104:25:104:28 | a\\nc | regexp.cpp | 104 | 25 | 104 | 28 | -| regexp.cpp:105:29:105:32 | a\\nc | regexp.cpp | 105 | 29 | 105 | 32 | +| regexp.cpp:23:20:23:24 | a{3,} | regexp.cpp | 23 | 20 | 23 | 24 | +| regexp.cpp:24:20:24:23 | a{7} | regexp.cpp | 24 | 20 | 24 | 23 | +| regexp.cpp:27:19:27:25 | foo\|bar | regexp.cpp | 27 | 19 | 27 | 25 | +| regexp.cpp:30:19:30:23 | [abc] | regexp.cpp | 30 | 19 | 30 | 23 | +| regexp.cpp:31:19:31:30 | [a-fA-F0-9_] | regexp.cpp | 31 | 19 | 31 | 30 | +| regexp.cpp:32:19:32:23 | [\\w]+ | regexp.cpp | 32 | 19 | 32 | 23 | +| regexp.cpp:33:19:33:27 | \\[\\][123] | regexp.cpp | 33 | 19 | 33 | 27 | +| regexp.cpp:34:19:34:24 | [^A-Z] | regexp.cpp | 34 | 19 | 34 | 24 | +| regexp.cpp:35:19:35:21 | []] | regexp.cpp | 35 | 19 | 35 | 21 | +| regexp.cpp:36:19:36:22 | [^]] | regexp.cpp | 36 | 19 | 36 | 22 | +| regexp.cpp:37:19:37:22 | [^-] | regexp.cpp | 37 | 19 | 37 | 22 | +| regexp.cpp:38:19:38:21 | [\|] | regexp.cpp | 38 | 19 | 38 | 21 | +| regexp.cpp:41:22:41:31 | [[a-f]A-F] | regexp.cpp | 41 | 22 | 41 | 31 | +| regexp.cpp:44:21:44:22 | .* | regexp.cpp | 44 | 21 | 44 | 22 | +| regexp.cpp:45:21:45:25 | \\w+\\W | regexp.cpp | 45 | 21 | 45 | 25 | +| regexp.cpp:46:21:46:24 | \\s\\S | regexp.cpp | 46 | 21 | 46 | 24 | +| regexp.cpp:47:21:47:24 | \\d\\D | regexp.cpp | 47 | 21 | 47 | 24 | +| regexp.cpp:48:21:48:26 | \\n\\r\\t | regexp.cpp | 48 | 21 | 48 | 26 | +| regexp.cpp:51:20:51:25 | \\b!a\\B | regexp.cpp | 51 | 20 | 51 | 25 | +| regexp.cpp:54:20:54:28 | (foo)*bar | regexp.cpp | 54 | 20 | 54 | 28 | +| regexp.cpp:55:20:55:28 | fo(o\|b)ar | regexp.cpp | 55 | 20 | 55 | 28 | +| regexp.cpp:56:20:56:28 | (a\|b\|cd)e | regexp.cpp | 56 | 20 | 56 | 28 | +| regexp.cpp:57:20:57:27 | (?::+)\\w | regexp.cpp | 57 | 20 | 57 | 27 | +| regexp.cpp:60:21:60:28 | (a+)b+\\1 | regexp.cpp | 60 | 21 | 60 | 28 | +| regexp.cpp:63:21:63:32 | [[:alnum:]]* | regexp.cpp | 63 | 21 | 63 | 32 | +| regexp.cpp:64:21:64:32 | [[:digit:]]+ | regexp.cpp | 64 | 21 | 64 | 32 | +| regexp.cpp:65:21:65:36 | [[:alnum:]]{2,3} | regexp.cpp | 65 | 21 | 65 | 36 | +| regexp.cpp:66:21:66:35 | [a-f[:digit:]]+ | regexp.cpp | 66 | 21 | 66 | 35 | +| regexp.cpp:69:22:69:43 | [[:alpha:]][[:digit:]] | regexp.cpp | 69 | 22 | 69 | 43 | +| regexp.cpp:72:22:72:41 | [[:alpha:][:digit:]] | regexp.cpp | 72 | 22 | 72 | 41 | +| regexp.cpp:75:22:75:38 | [A-F[:digit:]a-f] | regexp.cpp | 75 | 22 | 75 | 38 | +| regexp.cpp:78:22:78:30 | [:digit:] | regexp.cpp | 78 | 22 | 78 | 30 | +| regexp.cpp:84:21:84:23 | \\cA | regexp.cpp | 84 | 21 | 84 | 23 | +| regexp.cpp:85:21:85:25 | [\\cZ] | regexp.cpp | 85 | 21 | 85 | 25 | +| regexp.cpp:88:25:88:28 | a\\nb | regexp.cpp | 88 | 25 | 88 | 28 | +| regexp.cpp:89:37:89:40 | a\\nc | regexp.cpp | 89 | 37 | 89 | 40 | +| regexp.cpp:90:39:90:42 | a\\nc | regexp.cpp | 90 | 39 | 90 | 42 | +| regexp.cpp:91:38:91:41 | a\\nc | regexp.cpp | 91 | 38 | 91 | 41 | +| regexp.cpp:92:38:92:41 | a\\nc | regexp.cpp | 92 | 38 | 92 | 41 | +| regexp.cpp:93:23:93:26 | a\\nc | regexp.cpp | 93 | 23 | 93 | 26 | +| regexp.cpp:94:40:94:43 | a\\nc | regexp.cpp | 94 | 40 | 94 | 43 | +| regexp.cpp:95:42:95:45 | a\\nc | regexp.cpp | 95 | 42 | 95 | 45 | +| regexp.cpp:96:41:96:44 | a\\nc | regexp.cpp | 96 | 41 | 96 | 44 | +| regexp.cpp:97:41:97:44 | a\\nc | regexp.cpp | 97 | 41 | 97 | 44 | +| regexp.cpp:98:25:98:28 | a\\nc | regexp.cpp | 98 | 25 | 98 | 28 | +| regexp.cpp:99:29:99:32 | a\\nc | regexp.cpp | 99 | 29 | 99 | 32 | diff --git a/cpp/ql/test/library-tests/regex/parse.expected b/cpp/ql/test/library-tests/regex/parse.expected index 62fd2c5b60cb..49498ec0d230 100644 --- a/cpp/ql/test/library-tests/regex/parse.expected +++ b/cpp/ql/test/library-tests/regex/parse.expected @@ -29,506 +29,522 @@ regexp.cpp: # 22| [RegExpRange] a{4,8} #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 24| [RegExpConstant, RegExpNormalChar] a +# 23| [RegExpConstant, RegExpNormalChar] a -# 24| [InfiniteRepetitionQuantifier, RegExpRange] a{3,} +# 23| [InfiniteRepetitionQuantifier, RegExpRange] a{3,} #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 25| [RegExpConstant, RegExpNormalChar] a +# 24| [RegExpConstant, RegExpNormalChar] a -# 25| [RegExpRange] a{7} +# 24| [RegExpRange] a{7} #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 28| [RegExpConstant, RegExpNormalChar] foo +# 27| [RegExpConstant, RegExpNormalChar] foo -# 28| [RegExpAlt] foo|bar +# 27| [RegExpAlt] foo|bar #-----| 0 -> [RegExpConstant, RegExpNormalChar] foo #-----| 1 -> [RegExpConstant, RegExpNormalChar] bar -# 28| [RegExpConstant, RegExpNormalChar] bar +# 27| [RegExpConstant, RegExpNormalChar] bar -# 31| [RegExpCharacterClass] [abc] +# 30| [RegExpCharacterClass] [abc] #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] b #-----| 2 -> [RegExpConstant, RegExpNormalChar] c -# 31| [RegExpConstant, RegExpNormalChar] a +# 30| [RegExpConstant, RegExpNormalChar] a -# 31| [RegExpConstant, RegExpNormalChar] b +# 30| [RegExpConstant, RegExpNormalChar] b -# 31| [RegExpConstant, RegExpNormalChar] c +# 30| [RegExpConstant, RegExpNormalChar] c -# 32| [RegExpCharacterClass] [a-fA-F0-9_] +# 31| [RegExpCharacterClass] [a-fA-F0-9_] #-----| 0 -> [RegExpCharacterRange] a-f #-----| 1 -> [RegExpCharacterRange] A-F #-----| 2 -> [RegExpCharacterRange] 0-9 #-----| 3 -> [RegExpConstant, RegExpNormalChar] _ -# 32| [RegExpConstant, RegExpNormalChar] a +# 31| [RegExpConstant, RegExpNormalChar] a -# 32| [RegExpCharacterRange] a-f +# 31| [RegExpCharacterRange] a-f #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] f -# 32| [RegExpConstant, RegExpNormalChar] f +# 31| [RegExpConstant, RegExpNormalChar] f -# 32| [RegExpConstant, RegExpNormalChar] A +# 31| [RegExpConstant, RegExpNormalChar] A -# 32| [RegExpCharacterRange] A-F +# 31| [RegExpCharacterRange] A-F #-----| 0 -> [RegExpConstant, RegExpNormalChar] A #-----| 1 -> [RegExpConstant, RegExpNormalChar] F -# 32| [RegExpConstant, RegExpNormalChar] F +# 31| [RegExpConstant, RegExpNormalChar] F -# 32| [RegExpConstant, RegExpNormalChar] 0 +# 31| [RegExpConstant, RegExpNormalChar] 0 -# 32| [RegExpCharacterRange] 0-9 +# 31| [RegExpCharacterRange] 0-9 #-----| 0 -> [RegExpConstant, RegExpNormalChar] 0 #-----| 1 -> [RegExpConstant, RegExpNormalChar] 9 -# 32| [RegExpConstant, RegExpNormalChar] 9 +# 31| [RegExpConstant, RegExpNormalChar] 9 -# 32| [RegExpConstant, RegExpNormalChar] _ +# 31| [RegExpConstant, RegExpNormalChar] _ -# 34| [RegExpCharacterClass] [\w] +# 32| [RegExpCharacterClass] [\w] #-----| 0 -> [RegExpCharacterClassEscape] \w -# 34| [RegExpPlus] [\w]+ +# 32| [RegExpPlus] [\w]+ #-----| 0 -> [RegExpCharacterClass] [\w] -# 34| [RegExpCharacterClassEscape] \w +# 32| [RegExpCharacterClassEscape] \w -# 35| [RegExpConstant, RegExpEscape] \[ +# 33| [RegExpConstant, RegExpEscape] \[ -# 35| [RegExpSequence] \[\][123] +# 33| [RegExpSequence] \[\][123] #-----| 0 -> [RegExpConstant, RegExpEscape] \[ #-----| 1 -> [RegExpConstant, RegExpEscape] \] #-----| 2 -> [RegExpCharacterClass] [123] -# 35| [RegExpConstant, RegExpEscape] \] +# 33| [RegExpConstant, RegExpEscape] \] -# 35| [RegExpCharacterClass] [123] +# 33| [RegExpCharacterClass] [123] #-----| 0 -> [RegExpConstant, RegExpNormalChar] 1 #-----| 1 -> [RegExpConstant, RegExpNormalChar] 2 #-----| 2 -> [RegExpConstant, RegExpNormalChar] 3 -# 35| [RegExpConstant, RegExpNormalChar] 1 +# 33| [RegExpConstant, RegExpNormalChar] 1 -# 35| [RegExpConstant, RegExpNormalChar] 2 +# 33| [RegExpConstant, RegExpNormalChar] 2 -# 35| [RegExpConstant, RegExpNormalChar] 3 +# 33| [RegExpConstant, RegExpNormalChar] 3 -# 36| [RegExpCharacterClass] [^A-Z] +# 34| [RegExpCharacterClass] [^A-Z] #-----| 0 -> [RegExpCharacterRange] A-Z -# 36| [RegExpConstant, RegExpNormalChar] A +# 34| [RegExpConstant, RegExpNormalChar] A -# 36| [RegExpCharacterRange] A-Z +# 34| [RegExpCharacterRange] A-Z #-----| 0 -> [RegExpConstant, RegExpNormalChar] A #-----| 1 -> [RegExpConstant, RegExpNormalChar] Z -# 36| [RegExpConstant, RegExpNormalChar] Z +# 34| [RegExpConstant, RegExpNormalChar] Z -# 37| [RegExpCharacterClass] []] +# 35| [RegExpCharacterClass] []] #-----| 0 -> [RegExpConstant, RegExpNormalChar] ] -# 37| [RegExpConstant, RegExpNormalChar] ] +# 35| [RegExpConstant, RegExpNormalChar] ] -# 38| [RegExpCharacterClass] [^]] +# 36| [RegExpCharacterClass] [^]] #-----| 0 -> [RegExpConstant, RegExpNormalChar] ] -# 38| [RegExpConstant, RegExpNormalChar] ] +# 36| [RegExpConstant, RegExpNormalChar] ] -# 39| [RegExpCharacterClass] [^-] +# 37| [RegExpCharacterClass] [^-] #-----| 0 -> [RegExpConstant, RegExpNormalChar] - -# 39| [RegExpConstant, RegExpNormalChar] - +# 37| [RegExpConstant, RegExpNormalChar] - -# 40| [RegExpCharacterClass] [|] +# 38| [RegExpCharacterClass] [|] #-----| 0 -> [RegExpConstant, RegExpNormalChar] | -# 40| [RegExpConstant, RegExpNormalChar] | +# 38| [RegExpConstant, RegExpNormalChar] | -# 43| [RegExpCharacterClass] [[a-f] +# 41| [RegExpCharacterClass] [[a-f] #-----| 0 -> [RegExpConstant, RegExpNormalChar] [ #-----| 1 -> [RegExpCharacterRange] a-f -# 43| [RegExpSequence] [[a-f]A-F] +# 41| [RegExpSequence] [[a-f]A-F] #-----| 0 -> [RegExpCharacterClass] [[a-f] #-----| 1 -> [RegExpConstant, RegExpNormalChar] A-F] -# 43| [RegExpConstant, RegExpNormalChar] [ +# 41| [RegExpConstant, RegExpNormalChar] [ -# 43| [RegExpConstant, RegExpNormalChar] a +# 41| [RegExpConstant, RegExpNormalChar] a -# 43| [RegExpCharacterRange] a-f +# 41| [RegExpCharacterRange] a-f #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] f -# 43| [RegExpConstant, RegExpNormalChar] f +# 41| [RegExpConstant, RegExpNormalChar] f -# 43| [RegExpConstant, RegExpNormalChar] A-F] +# 41| [RegExpConstant, RegExpNormalChar] A-F] -# 46| [RegExpDot] . +# 44| [RegExpDot] . -# 46| [RegExpStar] .* +# 44| [RegExpStar] .* #-----| 0 -> [RegExpDot] . -# 48| [RegExpCharacterClassEscape] \w +# 45| [RegExpCharacterClassEscape] \w -# 48| [RegExpPlus] \w+ +# 45| [RegExpPlus] \w+ #-----| 0 -> [RegExpCharacterClassEscape] \w -# 48| [RegExpSequence] \w+\W +# 45| [RegExpSequence] \w+\W #-----| 0 -> [RegExpPlus] \w+ #-----| 1 -> [RegExpCharacterClassEscape] \W -# 48| [RegExpCharacterClassEscape] \W +# 45| [RegExpCharacterClassEscape] \W -# 49| [RegExpCharacterClassEscape] \s +# 46| [RegExpCharacterClassEscape] \s -# 49| [RegExpSequence] \s\S +# 46| [RegExpSequence] \s\S #-----| 0 -> [RegExpCharacterClassEscape] \s #-----| 1 -> [RegExpCharacterClassEscape] \S -# 49| [RegExpCharacterClassEscape] \S +# 46| [RegExpCharacterClassEscape] \S -# 50| [RegExpCharacterClassEscape] \d +# 47| [RegExpCharacterClassEscape] \d -# 50| [RegExpSequence] \d\D +# 47| [RegExpSequence] \d\D #-----| 0 -> [RegExpCharacterClassEscape] \d #-----| 1 -> [RegExpCharacterClassEscape] \D -# 50| [RegExpCharacterClassEscape] \D +# 47| [RegExpCharacterClassEscape] \D -# 52| [RegExpConstant, RegExpEscape] \n +# 48| [RegExpConstant, RegExpEscape] \n -# 52| [RegExpSequence] \n\r\t +# 48| [RegExpSequence] \n\r\t #-----| 0 -> [RegExpConstant, RegExpEscape] \n #-----| 1 -> [RegExpConstant, RegExpEscape] \r #-----| 2 -> [RegExpConstant, RegExpEscape] \t -# 52| [RegExpConstant, RegExpEscape] \r +# 48| [RegExpConstant, RegExpEscape] \r -# 52| [RegExpConstant, RegExpEscape] \t +# 48| [RegExpConstant, RegExpEscape] \t -# 56| [RegExpSpecialChar] \b +# 51| [RegExpSpecialChar] \b -# 56| [RegExpSequence] \b!a\B +# 51| [RegExpSequence] \b!a\B #-----| 0 -> [RegExpSpecialChar] \b #-----| 1 -> [RegExpConstant, RegExpNormalChar] !a #-----| 2 -> [RegExpNonWordBoundary] \B -# 56| [RegExpConstant, RegExpNormalChar] !a +# 51| [RegExpConstant, RegExpNormalChar] !a -# 56| [RegExpNonWordBoundary] \B +# 51| [RegExpNonWordBoundary] \B -# 59| [RegExpGroup] (foo) +# 54| [RegExpGroup] (foo) #-----| 0 -> [RegExpConstant, RegExpNormalChar] foo -# 59| [RegExpStar] (foo)* +# 54| [RegExpStar] (foo)* #-----| 0 -> [RegExpGroup] (foo) -# 59| [RegExpSequence] (foo)*bar +# 54| [RegExpSequence] (foo)*bar #-----| 0 -> [RegExpStar] (foo)* #-----| 1 -> [RegExpConstant, RegExpNormalChar] bar -# 59| [RegExpConstant, RegExpNormalChar] foo +# 54| [RegExpConstant, RegExpNormalChar] foo -# 59| [RegExpConstant, RegExpNormalChar] bar +# 54| [RegExpConstant, RegExpNormalChar] bar -# 60| [RegExpConstant, RegExpNormalChar] fo +# 55| [RegExpConstant, RegExpNormalChar] fo -# 60| [RegExpSequence] fo(o|b)ar +# 55| [RegExpSequence] fo(o|b)ar #-----| 0 -> [RegExpConstant, RegExpNormalChar] fo #-----| 1 -> [RegExpGroup] (o|b) #-----| 2 -> [RegExpConstant, RegExpNormalChar] ar -# 60| [RegExpGroup] (o|b) +# 55| [RegExpGroup] (o|b) #-----| 0 -> [RegExpAlt] o|b -# 60| [RegExpConstant, RegExpNormalChar] o +# 55| [RegExpConstant, RegExpNormalChar] o -# 60| [RegExpAlt] o|b +# 55| [RegExpAlt] o|b #-----| 0 -> [RegExpConstant, RegExpNormalChar] o #-----| 1 -> [RegExpConstant, RegExpNormalChar] b -# 60| [RegExpConstant, RegExpNormalChar] b +# 55| [RegExpConstant, RegExpNormalChar] b -# 60| [RegExpConstant, RegExpNormalChar] ar +# 55| [RegExpConstant, RegExpNormalChar] ar -# 61| [RegExpGroup] (a|b|cd) +# 56| [RegExpGroup] (a|b|cd) #-----| 0 -> [RegExpAlt] a|b|cd -# 61| [RegExpSequence] (a|b|cd)e +# 56| [RegExpSequence] (a|b|cd)e #-----| 0 -> [RegExpGroup] (a|b|cd) #-----| 1 -> [RegExpConstant, RegExpNormalChar] e -# 61| [RegExpConstant, RegExpNormalChar] a +# 56| [RegExpConstant, RegExpNormalChar] a -# 61| [RegExpAlt] a|b|cd +# 56| [RegExpAlt] a|b|cd #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] b #-----| 2 -> [RegExpConstant, RegExpNormalChar] cd -# 61| [RegExpConstant, RegExpNormalChar] b +# 56| [RegExpConstant, RegExpNormalChar] b -# 61| [RegExpConstant, RegExpNormalChar] cd +# 56| [RegExpConstant, RegExpNormalChar] cd -# 61| [RegExpConstant, RegExpNormalChar] e +# 56| [RegExpConstant, RegExpNormalChar] e -# 62| [RegExpGroup] (?::+) +# 57| [RegExpGroup] (?::+) #-----| 0 -> [RegExpPlus] :+ -# 62| [RegExpSequence] (?::+)\w +# 57| [RegExpSequence] (?::+)\w #-----| 0 -> [RegExpGroup] (?::+) #-----| 1 -> [RegExpCharacterClassEscape] \w -# 62| [RegExpConstant, RegExpNormalChar] : +# 57| [RegExpConstant, RegExpNormalChar] : -# 62| [RegExpPlus] :+ +# 57| [RegExpPlus] :+ #-----| 0 -> [RegExpConstant, RegExpNormalChar] : -# 62| [RegExpCharacterClassEscape] \w +# 57| [RegExpCharacterClassEscape] \w -# 69| [RegExpGroup] (a+) +# 60| [RegExpGroup] (a+) #-----| 0 -> [RegExpPlus] a+ -# 69| [RegExpSequence] (a+)b+\1 +# 60| [RegExpSequence] (a+)b+\1 #-----| 0 -> [RegExpGroup] (a+) #-----| 1 -> [RegExpPlus] b+ #-----| 2 -> [RegExpBackRef] \1 -# 69| [RegExpConstant, RegExpNormalChar] a +# 60| [RegExpConstant, RegExpNormalChar] a -# 69| [RegExpPlus] a+ +# 60| [RegExpPlus] a+ #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 69| [RegExpConstant, RegExpNormalChar] b +# 60| [RegExpConstant, RegExpNormalChar] b -# 69| [RegExpPlus] b+ +# 60| [RegExpPlus] b+ #-----| 0 -> [RegExpConstant, RegExpNormalChar] b -# 69| [RegExpBackRef] \1 +# 60| [RegExpBackRef] \1 -# 73| [RegExpCharacterClass] [[:alnum:]] +# 63| [RegExpCharacterClass] [[:alnum:]] #-----| 0 -> [RegExpNamedCharacterProperty] [:alnum:] -# 73| [RegExpStar] [[:alnum:]]* +# 63| [RegExpStar] [[:alnum:]]* #-----| 0 -> [RegExpCharacterClass] [[:alnum:]] -# 73| [RegExpNamedCharacterProperty] [:alnum:] +# 63| [RegExpNamedCharacterProperty] [:alnum:] -# 74| [RegExpCharacterClass] [[:digit:]] +# 64| [RegExpCharacterClass] [[:digit:]] #-----| 0 -> [RegExpNamedCharacterProperty] [:digit:] -# 74| [RegExpPlus] [[:digit:]]+ +# 64| [RegExpPlus] [[:digit:]]+ #-----| 0 -> [RegExpCharacterClass] [[:digit:]] -# 74| [RegExpNamedCharacterProperty] [:digit:] +# 64| [RegExpNamedCharacterProperty] [:digit:] -# 75| [RegExpCharacterClass] [[:alnum:]] +# 65| [RegExpCharacterClass] [[:alnum:]] #-----| 0 -> [RegExpNamedCharacterProperty] [:alnum:] -# 75| [RegExpRange] [[:alnum:]]{2,3} +# 65| [RegExpRange] [[:alnum:]]{2,3} #-----| 0 -> [RegExpCharacterClass] [[:alnum:]] -# 75| [RegExpNamedCharacterProperty] [:alnum:] +# 65| [RegExpNamedCharacterProperty] [:alnum:] -# 76| [RegExpCharacterClass] [a-f[:digit:]] +# 66| [RegExpCharacterClass] [a-f[:digit:]] #-----| 0 -> [RegExpCharacterRange] a-f #-----| 1 -> [RegExpNamedCharacterProperty] [:digit:] -# 76| [RegExpPlus] [a-f[:digit:]]+ +# 66| [RegExpPlus] [a-f[:digit:]]+ #-----| 0 -> [RegExpCharacterClass] [a-f[:digit:]] -# 76| [RegExpConstant, RegExpNormalChar] a +# 66| [RegExpConstant, RegExpNormalChar] a -# 76| [RegExpCharacterRange] a-f +# 66| [RegExpCharacterRange] a-f #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] f -# 76| [RegExpConstant, RegExpNormalChar] f +# 66| [RegExpConstant, RegExpNormalChar] f -# 76| [RegExpNamedCharacterProperty] [:digit:] +# 66| [RegExpNamedCharacterProperty] [:digit:] -# 79| [RegExpCharacterClass] [[:alpha:]] +# 69| [RegExpCharacterClass] [[:alpha:]] #-----| 0 -> [RegExpNamedCharacterProperty] [:alpha:] -# 79| [RegExpSequence] [[:alpha:]][[:digit:]] +# 69| [RegExpSequence] [[:alpha:]][[:digit:]] #-----| 0 -> [RegExpCharacterClass] [[:alpha:]] #-----| 1 -> [RegExpCharacterClass] [[:digit:]] -# 79| [RegExpNamedCharacterProperty] [:alpha:] +# 69| [RegExpNamedCharacterProperty] [:alpha:] -# 79| [RegExpCharacterClass] [[:digit:]] +# 69| [RegExpCharacterClass] [[:digit:]] #-----| 0 -> [RegExpNamedCharacterProperty] [:digit:] -# 79| [RegExpNamedCharacterProperty] [:digit:] +# 69| [RegExpNamedCharacterProperty] [:digit:] -# 82| [RegExpCharacterClass] [[:alpha:][:digit:]] +# 72| [RegExpCharacterClass] [[:alpha:][:digit:]] #-----| 0 -> [RegExpNamedCharacterProperty] [:alpha:] #-----| 1 -> [RegExpNamedCharacterProperty] [:digit:] -# 82| [RegExpNamedCharacterProperty] [:alpha:] +# 72| [RegExpNamedCharacterProperty] [:alpha:] -# 82| [RegExpNamedCharacterProperty] [:digit:] +# 72| [RegExpNamedCharacterProperty] [:digit:] -# 85| [RegExpCharacterClass] [A-F[:digit:]a-f] +# 75| [RegExpCharacterClass] [A-F[:digit:]a-f] #-----| 0 -> [RegExpCharacterRange] A-F #-----| 1 -> [RegExpNamedCharacterProperty] [:digit:] #-----| 2 -> [RegExpCharacterRange] a-f -# 85| [RegExpConstant, RegExpNormalChar] A +# 75| [RegExpConstant, RegExpNormalChar] A -# 85| [RegExpCharacterRange] A-F +# 75| [RegExpCharacterRange] A-F #-----| 0 -> [RegExpConstant, RegExpNormalChar] A #-----| 1 -> [RegExpConstant, RegExpNormalChar] F -# 85| [RegExpConstant, RegExpNormalChar] F +# 75| [RegExpConstant, RegExpNormalChar] F -# 85| [RegExpNamedCharacterProperty] [:digit:] +# 75| [RegExpNamedCharacterProperty] [:digit:] -# 85| [RegExpConstant, RegExpNormalChar] a +# 75| [RegExpConstant, RegExpNormalChar] a -# 85| [RegExpCharacterRange] a-f +# 75| [RegExpCharacterRange] a-f #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] f -# 85| [RegExpConstant, RegExpNormalChar] f +# 75| [RegExpConstant, RegExpNormalChar] f -# 88| [RegExpNamedCharacterProperty] [:digit:] +# 78| [RegExpNamedCharacterProperty] [:digit:] -# 91| [RegExpConstant, RegExpEscape] \u{987 +# 81| [RegExpConstant, RegExpEscape] \u{987 -# 94| [RegExpConstant, RegExpNormalChar] a +# 84| [RegExpConstant, RegExpEscape] \c + +# 84| [RegExpSequence] \cA +#-----| 0 -> [RegExpConstant, RegExpEscape] \c +#-----| 1 -> [RegExpConstant, RegExpNormalChar] A -# 94| [RegExpSequence] a\nb +# 84| [RegExpConstant, RegExpNormalChar] A + +# 85| [RegExpCharacterClass] [\cZ] +#-----| 0 -> [RegExpConstant, RegExpEscape] \c +#-----| 1 -> [RegExpConstant, RegExpNormalChar] Z + +# 85| [RegExpConstant, RegExpEscape] \c + +# 85| [RegExpConstant, RegExpNormalChar] Z + +# 88| [RegExpConstant, RegExpNormalChar] a + +# 88| [RegExpSequence] a\nb #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n #-----| 2 -> [RegExpConstant, RegExpNormalChar] b -# 94| [RegExpConstant, RegExpEscape] \n +# 88| [RegExpConstant, RegExpEscape] \n -# 94| [RegExpConstant, RegExpNormalChar] b +# 88| [RegExpConstant, RegExpNormalChar] b -# 95| [RegExpConstant, RegExpNormalChar] a +# 89| [RegExpConstant, RegExpNormalChar] a -# 95| [RegExpSequence] a\nc +# 89| [RegExpSequence] a\nc #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n #-----| 2 -> [RegExpConstant, RegExpNormalChar] c -# 95| [RegExpConstant, RegExpEscape] \n +# 89| [RegExpConstant, RegExpEscape] \n -# 95| [RegExpConstant, RegExpNormalChar] c +# 89| [RegExpConstant, RegExpNormalChar] c -# 96| [RegExpConstant, RegExpNormalChar] a +# 90| [RegExpConstant, RegExpNormalChar] a -# 96| [RegExpSequence] a\nc +# 90| [RegExpSequence] a\nc #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n #-----| 2 -> [RegExpConstant, RegExpNormalChar] c -# 96| [RegExpConstant, RegExpEscape] \n +# 90| [RegExpConstant, RegExpEscape] \n -# 96| [RegExpConstant, RegExpNormalChar] c +# 90| [RegExpConstant, RegExpNormalChar] c -# 97| [RegExpConstant, RegExpNormalChar] a +# 91| [RegExpConstant, RegExpNormalChar] a -# 97| [RegExpSequence] a\nc +# 91| [RegExpSequence] a\nc #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n #-----| 2 -> [RegExpConstant, RegExpNormalChar] c -# 97| [RegExpConstant, RegExpEscape] \n +# 91| [RegExpConstant, RegExpEscape] \n -# 97| [RegExpConstant, RegExpNormalChar] c +# 91| [RegExpConstant, RegExpNormalChar] c -# 98| [RegExpConstant, RegExpNormalChar] a +# 92| [RegExpConstant, RegExpNormalChar] a -# 98| [RegExpSequence] a\nc +# 92| [RegExpSequence] a\nc #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n #-----| 2 -> [RegExpConstant, RegExpNormalChar] c -# 98| [RegExpConstant, RegExpEscape] \n +# 92| [RegExpConstant, RegExpEscape] \n -# 98| [RegExpConstant, RegExpNormalChar] c +# 92| [RegExpConstant, RegExpNormalChar] c -# 99| [RegExpConstant, RegExpNormalChar] a +# 93| [RegExpConstant, RegExpNormalChar] a -# 99| [RegExpSequence] a\nc +# 93| [RegExpSequence] a\nc #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n #-----| 2 -> [RegExpConstant, RegExpNormalChar] c -# 99| [RegExpConstant, RegExpEscape] \n +# 93| [RegExpConstant, RegExpEscape] \n -# 99| [RegExpConstant, RegExpNormalChar] c +# 93| [RegExpConstant, RegExpNormalChar] c -# 100| [RegExpConstant, RegExpNormalChar] a +# 94| [RegExpConstant, RegExpNormalChar] a -# 100| [RegExpSequence] a\nc +# 94| [RegExpSequence] a\nc #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n #-----| 2 -> [RegExpConstant, RegExpNormalChar] c -# 100| [RegExpConstant, RegExpEscape] \n +# 94| [RegExpConstant, RegExpEscape] \n -# 100| [RegExpConstant, RegExpNormalChar] c +# 94| [RegExpConstant, RegExpNormalChar] c -# 101| [RegExpConstant, RegExpNormalChar] a +# 95| [RegExpConstant, RegExpNormalChar] a -# 101| [RegExpSequence] a\nc +# 95| [RegExpSequence] a\nc #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n #-----| 2 -> [RegExpConstant, RegExpNormalChar] c -# 101| [RegExpConstant, RegExpEscape] \n +# 95| [RegExpConstant, RegExpEscape] \n -# 101| [RegExpConstant, RegExpNormalChar] c +# 95| [RegExpConstant, RegExpNormalChar] c -# 102| [RegExpConstant, RegExpNormalChar] a +# 96| [RegExpConstant, RegExpNormalChar] a -# 102| [RegExpSequence] a\nc +# 96| [RegExpSequence] a\nc #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n #-----| 2 -> [RegExpConstant, RegExpNormalChar] c -# 102| [RegExpConstant, RegExpEscape] \n +# 96| [RegExpConstant, RegExpEscape] \n -# 102| [RegExpConstant, RegExpNormalChar] c +# 96| [RegExpConstant, RegExpNormalChar] c -# 103| [RegExpConstant, RegExpNormalChar] a +# 97| [RegExpConstant, RegExpNormalChar] a -# 103| [RegExpSequence] a\nc +# 97| [RegExpSequence] a\nc #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n #-----| 2 -> [RegExpConstant, RegExpNormalChar] c -# 103| [RegExpConstant, RegExpEscape] \n +# 97| [RegExpConstant, RegExpEscape] \n -# 103| [RegExpConstant, RegExpNormalChar] c +# 97| [RegExpConstant, RegExpNormalChar] c -# 104| [RegExpConstant, RegExpNormalChar] a +# 98| [RegExpConstant, RegExpNormalChar] a -# 104| [RegExpSequence] a\nc +# 98| [RegExpSequence] a\nc #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n #-----| 2 -> [RegExpConstant, RegExpNormalChar] c -# 104| [RegExpConstant, RegExpEscape] \n +# 98| [RegExpConstant, RegExpEscape] \n -# 104| [RegExpConstant, RegExpNormalChar] c +# 98| [RegExpConstant, RegExpNormalChar] c -# 105| [RegExpConstant, RegExpNormalChar] a +# 99| [RegExpConstant, RegExpNormalChar] a -# 105| [RegExpSequence] a\nc +# 99| [RegExpSequence] a\nc #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n #-----| 2 -> [RegExpConstant, RegExpNormalChar] c -# 105| [RegExpConstant, RegExpEscape] \n +# 99| [RegExpConstant, RegExpEscape] \n -# 105| [RegExpConstant, RegExpNormalChar] c +# 99| [RegExpConstant, RegExpNormalChar] c diff --git a/cpp/ql/test/library-tests/regex/regexp.cpp b/cpp/ql/test/library-tests/regex/regexp.cpp index ede36252b6f6..462f5ecbc293 100644 --- a/cpp/ql/test/library-tests/regex/regexp.cpp +++ b/cpp/ql/test/library-tests/regex/regexp.cpp @@ -20,9 +20,8 @@ std::regex r_abc("abc"); // Repetition std::regex r_rep1("a*b+c?d"); std::regex r_rep2("a{4,8}"); - -std::regex r_rep4("a{3,}"); -std::regex r_rep5("a{7}"); +std::regex r_rep3("a{3,}"); +std::regex r_rep4("a{7}"); // Alternation std::regex r_alt("foo|bar"); @@ -30,30 +29,26 @@ std::regex r_alt("foo|bar"); // Character classes std::regex r_cc1("[abc]"); std::regex r_cc2("[a-fA-F0-9_]"); - -std::regex r_cc4("[\\w]+"); -std::regex r_cc5("\\[\\][123]"); -std::regex r_cc6("[^A-Z]"); -std::regex r_cc7("[]]"); // MRI gives a warning, but accepts this as matching ']' -std::regex r_cc8("[^]]"); // MRI gives a warning, but accepts this as matching anything except ']' -std::regex r_cc9("[^-]"); -std::regex r_cc10("[|]"); +std::regex r_cc3("[\\w]+"); +std::regex r_cc4("\\[\\][123]"); +std::regex r_cc5("[^A-Z]"); +std::regex r_cc6("[]]"); // MRI gives a warning, but accepts this as matching ']' +std::regex r_cc7("[^]]"); // MRI gives a warning, but accepts this as matching anything except ']' +std::regex r_cc8("[^-]"); +std::regex r_cc9("[|]"); // Nested character classes (BAD - not parsed correctly) std::regex r_nested("[[a-f]A-F]"); // Meta-character classes std::regex r_meta1(".*"); - std::regex r_meta2("\\w+\\W"); std::regex r_meta3("\\s\\S"); std::regex r_meta4("\\d\\D"); - -std::regex r_meta6("\\n\\r\\t"); +std::regex r_meta5("\\n\\r\\t"); // Anchors - -std::regex r_anc2("\\b!a\\B"); +std::regex r_anc1("\\b!a\\B"); // Groups std::regex r_grp1("(foo)*bar"); @@ -61,14 +56,9 @@ std::regex r_grp2("fo(o|b)ar"); std::regex r_grp3("(a|b|cd)e"); std::regex r_grp4("(?::+)\\w"); // Non-capturing group matching colons - - - - // Backreferences std::regex r_bref1("(a+)b+\\1"); - // Named character properties using a single POSIX bracket expression std::regex r_prop1("[[:alnum:]]*"); std::regex r_prop2("[[:digit:]]+"); @@ -90,6 +80,10 @@ std::regex r_posix4("[:digit:]"); // unicode std::regex r_uni("\\u{9879}"); +// control escapes +std::regex r_ctrl1("\\cA"); +std::regex r_ctrl2("[\\cZ]"); + // String literal spellings for location tests std::regex r_loc_plain("a\\nb"); std::basic_regex r_loc_L(L"a\\nc"); diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index 1eb1b1e5ff02..caede9ebdf9f 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -1,8 +1,8 @@ groupNumber -| regexp.cpp:59:20:59:24 | (foo) | 1 | -| regexp.cpp:60:22:60:26 | (o\|b) | 1 | -| regexp.cpp:61:20:61:27 | (a\|b\|cd) | 1 | -| regexp.cpp:69:21:69:24 | (a+) | 1 | +| regexp.cpp:54:20:54:24 | (foo) | 1 | +| regexp.cpp:55:22:55:26 | (o\|b) | 1 | +| regexp.cpp:56:20:56:27 | (a\|b\|cd) | 1 | +| regexp.cpp:60:21:60:24 | (a+) | 1 | term | regexp.cpp:18:19:18:21 | abc | RegExpConstant,RegExpNormalChar | | regexp.cpp:21:20:21:20 | a | RegExpConstant,RegExpNormalChar | @@ -15,189 +15,195 @@ term | regexp.cpp:21:26:21:26 | d | RegExpConstant,RegExpNormalChar | | regexp.cpp:22:20:22:20 | a | RegExpConstant,RegExpNormalChar | | regexp.cpp:22:20:22:25 | a{4,8} | RegExpRange | +| regexp.cpp:23:20:23:20 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:23:20:23:24 | a{3,} | InfiniteRepetitionQuantifier,RegExpRange | | regexp.cpp:24:20:24:20 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:24:20:24:24 | a{3,} | InfiniteRepetitionQuantifier,RegExpRange | -| regexp.cpp:25:20:25:20 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:25:20:25:23 | a{7} | RegExpRange | -| regexp.cpp:28:19:28:21 | foo | RegExpConstant,RegExpNormalChar | -| regexp.cpp:28:19:28:25 | foo\|bar | RegExpAlt | -| regexp.cpp:28:23:28:25 | bar | RegExpConstant,RegExpNormalChar | -| regexp.cpp:31:19:31:23 | [abc] | RegExpCharacterClass | +| regexp.cpp:24:20:24:23 | a{7} | RegExpRange | +| regexp.cpp:27:19:27:21 | foo | RegExpConstant,RegExpNormalChar | +| regexp.cpp:27:19:27:25 | foo\|bar | RegExpAlt | +| regexp.cpp:27:23:27:25 | bar | RegExpConstant,RegExpNormalChar | +| regexp.cpp:30:19:30:23 | [abc] | RegExpCharacterClass | +| regexp.cpp:30:20:30:20 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:30:21:30:21 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:30:22:30:22 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:31:19:31:30 | [a-fA-F0-9_] | RegExpCharacterClass | | regexp.cpp:31:20:31:20 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:31:21:31:21 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:31:22:31:22 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:32:19:32:30 | [a-fA-F0-9_] | RegExpCharacterClass | -| regexp.cpp:32:20:32:20 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:32:20:32:22 | a-f | RegExpCharacterRange | -| regexp.cpp:32:22:32:22 | f | RegExpConstant,RegExpNormalChar | -| regexp.cpp:32:23:32:23 | A | RegExpConstant,RegExpNormalChar | -| regexp.cpp:32:23:32:25 | A-F | RegExpCharacterRange | -| regexp.cpp:32:25:32:25 | F | RegExpConstant,RegExpNormalChar | -| regexp.cpp:32:26:32:26 | 0 | RegExpConstant,RegExpNormalChar | -| regexp.cpp:32:26:32:28 | 0-9 | RegExpCharacterRange | -| regexp.cpp:32:28:32:28 | 9 | RegExpConstant,RegExpNormalChar | -| regexp.cpp:32:29:32:29 | _ | RegExpConstant,RegExpNormalChar | -| regexp.cpp:34:19:34:22 | [\\w] | RegExpCharacterClass | -| regexp.cpp:34:19:34:23 | [\\w]+ | RegExpPlus | -| regexp.cpp:34:20:34:21 | \\w | RegExpCharacterClassEscape | -| regexp.cpp:35:19:35:20 | \\[ | RegExpConstant,RegExpEscape | -| regexp.cpp:35:19:35:27 | \\[\\][123] | RegExpSequence | -| regexp.cpp:35:21:35:22 | \\] | RegExpConstant,RegExpEscape | -| regexp.cpp:35:23:35:27 | [123] | RegExpCharacterClass | -| regexp.cpp:35:24:35:24 | 1 | RegExpConstant,RegExpNormalChar | -| regexp.cpp:35:25:35:25 | 2 | RegExpConstant,RegExpNormalChar | -| regexp.cpp:35:26:35:26 | 3 | RegExpConstant,RegExpNormalChar | -| regexp.cpp:36:19:36:24 | [^A-Z] | RegExpCharacterClass | -| regexp.cpp:36:21:36:21 | A | RegExpConstant,RegExpNormalChar | -| regexp.cpp:36:21:36:23 | A-Z | RegExpCharacterRange | -| regexp.cpp:36:23:36:23 | Z | RegExpConstant,RegExpNormalChar | -| regexp.cpp:37:19:37:21 | []] | RegExpCharacterClass | -| regexp.cpp:37:20:37:20 | ] | RegExpConstant,RegExpNormalChar | -| regexp.cpp:38:19:38:22 | [^]] | RegExpCharacterClass | -| regexp.cpp:38:21:38:21 | ] | RegExpConstant,RegExpNormalChar | -| regexp.cpp:39:19:39:22 | [^-] | RegExpCharacterClass | -| regexp.cpp:39:21:39:21 | - | RegExpConstant,RegExpNormalChar | -| regexp.cpp:40:20:40:22 | [\|] | RegExpCharacterClass | -| regexp.cpp:40:21:40:21 | \| | RegExpConstant,RegExpNormalChar | -| regexp.cpp:43:22:43:27 | [[a-f] | RegExpCharacterClass | -| regexp.cpp:43:22:43:31 | [[a-f]A-F] | RegExpSequence | -| regexp.cpp:43:23:43:23 | [ | RegExpConstant,RegExpNormalChar | -| regexp.cpp:43:24:43:24 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:43:24:43:26 | a-f | RegExpCharacterRange | -| regexp.cpp:43:26:43:26 | f | RegExpConstant,RegExpNormalChar | -| regexp.cpp:43:28:43:31 | A-F] | RegExpConstant,RegExpNormalChar | -| regexp.cpp:46:21:46:21 | . | RegExpDot | -| regexp.cpp:46:21:46:22 | .* | RegExpStar | -| regexp.cpp:48:21:48:22 | \\w | RegExpCharacterClassEscape | -| regexp.cpp:48:21:48:23 | \\w+ | RegExpPlus | -| regexp.cpp:48:21:48:25 | \\w+\\W | RegExpSequence | -| regexp.cpp:48:24:48:25 | \\W | RegExpCharacterClassEscape | -| regexp.cpp:49:21:49:22 | \\s | RegExpCharacterClassEscape | -| regexp.cpp:49:21:49:24 | \\s\\S | RegExpSequence | -| regexp.cpp:49:23:49:24 | \\S | RegExpCharacterClassEscape | -| regexp.cpp:50:21:50:22 | \\d | RegExpCharacterClassEscape | -| regexp.cpp:50:21:50:24 | \\d\\D | RegExpSequence | -| regexp.cpp:50:23:50:24 | \\D | RegExpCharacterClassEscape | -| regexp.cpp:52:21:52:22 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:52:21:52:26 | \\n\\r\\t | RegExpSequence | -| regexp.cpp:52:23:52:24 | \\r | RegExpConstant,RegExpEscape | -| regexp.cpp:52:25:52:26 | \\t | RegExpConstant,RegExpEscape | -| regexp.cpp:56:20:56:21 | \\b | RegExpSpecialChar | -| regexp.cpp:56:20:56:25 | \\b!a\\B | RegExpSequence | -| regexp.cpp:56:22:56:23 | !a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:56:24:56:25 | \\B | RegExpNonWordBoundary | -| regexp.cpp:59:20:59:24 | (foo) | RegExpGroup | -| regexp.cpp:59:20:59:25 | (foo)* | RegExpStar | -| regexp.cpp:59:20:59:28 | (foo)*bar | RegExpSequence | -| regexp.cpp:59:21:59:23 | foo | RegExpConstant,RegExpNormalChar | -| regexp.cpp:59:26:59:28 | bar | RegExpConstant,RegExpNormalChar | -| regexp.cpp:60:20:60:21 | fo | RegExpConstant,RegExpNormalChar | -| regexp.cpp:60:20:60:28 | fo(o\|b)ar | RegExpSequence | -| regexp.cpp:60:22:60:26 | (o\|b) | RegExpGroup | -| regexp.cpp:60:23:60:23 | o | RegExpConstant,RegExpNormalChar | -| regexp.cpp:60:23:60:25 | o\|b | RegExpAlt | +| regexp.cpp:31:20:31:22 | a-f | RegExpCharacterRange | +| regexp.cpp:31:22:31:22 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:31:23:31:23 | A | RegExpConstant,RegExpNormalChar | +| regexp.cpp:31:23:31:25 | A-F | RegExpCharacterRange | +| regexp.cpp:31:25:31:25 | F | RegExpConstant,RegExpNormalChar | +| regexp.cpp:31:26:31:26 | 0 | RegExpConstant,RegExpNormalChar | +| regexp.cpp:31:26:31:28 | 0-9 | RegExpCharacterRange | +| regexp.cpp:31:28:31:28 | 9 | RegExpConstant,RegExpNormalChar | +| regexp.cpp:31:29:31:29 | _ | RegExpConstant,RegExpNormalChar | +| regexp.cpp:32:19:32:22 | [\\w] | RegExpCharacterClass | +| regexp.cpp:32:19:32:23 | [\\w]+ | RegExpPlus | +| regexp.cpp:32:20:32:21 | \\w | RegExpCharacterClassEscape | +| regexp.cpp:33:19:33:20 | \\[ | RegExpConstant,RegExpEscape | +| regexp.cpp:33:19:33:27 | \\[\\][123] | RegExpSequence | +| regexp.cpp:33:21:33:22 | \\] | RegExpConstant,RegExpEscape | +| regexp.cpp:33:23:33:27 | [123] | RegExpCharacterClass | +| regexp.cpp:33:24:33:24 | 1 | RegExpConstant,RegExpNormalChar | +| regexp.cpp:33:25:33:25 | 2 | RegExpConstant,RegExpNormalChar | +| regexp.cpp:33:26:33:26 | 3 | RegExpConstant,RegExpNormalChar | +| regexp.cpp:34:19:34:24 | [^A-Z] | RegExpCharacterClass | +| regexp.cpp:34:21:34:21 | A | RegExpConstant,RegExpNormalChar | +| regexp.cpp:34:21:34:23 | A-Z | RegExpCharacterRange | +| regexp.cpp:34:23:34:23 | Z | RegExpConstant,RegExpNormalChar | +| regexp.cpp:35:19:35:21 | []] | RegExpCharacterClass | +| regexp.cpp:35:20:35:20 | ] | RegExpConstant,RegExpNormalChar | +| regexp.cpp:36:19:36:22 | [^]] | RegExpCharacterClass | +| regexp.cpp:36:21:36:21 | ] | RegExpConstant,RegExpNormalChar | +| regexp.cpp:37:19:37:22 | [^-] | RegExpCharacterClass | +| regexp.cpp:37:21:37:21 | - | RegExpConstant,RegExpNormalChar | +| regexp.cpp:38:19:38:21 | [\|] | RegExpCharacterClass | +| regexp.cpp:38:20:38:20 | \| | RegExpConstant,RegExpNormalChar | +| regexp.cpp:41:22:41:27 | [[a-f] | RegExpCharacterClass | +| regexp.cpp:41:22:41:31 | [[a-f]A-F] | RegExpSequence | +| regexp.cpp:41:23:41:23 | [ | RegExpConstant,RegExpNormalChar | +| regexp.cpp:41:24:41:24 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:41:24:41:26 | a-f | RegExpCharacterRange | +| regexp.cpp:41:26:41:26 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:41:28:41:31 | A-F] | RegExpConstant,RegExpNormalChar | +| regexp.cpp:44:21:44:21 | . | RegExpDot | +| regexp.cpp:44:21:44:22 | .* | RegExpStar | +| regexp.cpp:45:21:45:22 | \\w | RegExpCharacterClassEscape | +| regexp.cpp:45:21:45:23 | \\w+ | RegExpPlus | +| regexp.cpp:45:21:45:25 | \\w+\\W | RegExpSequence | +| regexp.cpp:45:24:45:25 | \\W | RegExpCharacterClassEscape | +| regexp.cpp:46:21:46:22 | \\s | RegExpCharacterClassEscape | +| regexp.cpp:46:21:46:24 | \\s\\S | RegExpSequence | +| regexp.cpp:46:23:46:24 | \\S | RegExpCharacterClassEscape | +| regexp.cpp:47:21:47:22 | \\d | RegExpCharacterClassEscape | +| regexp.cpp:47:21:47:24 | \\d\\D | RegExpSequence | +| regexp.cpp:47:23:47:24 | \\D | RegExpCharacterClassEscape | +| regexp.cpp:48:21:48:22 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:48:21:48:26 | \\n\\r\\t | RegExpSequence | +| regexp.cpp:48:23:48:24 | \\r | RegExpConstant,RegExpEscape | +| regexp.cpp:48:25:48:26 | \\t | RegExpConstant,RegExpEscape | +| regexp.cpp:51:20:51:21 | \\b | RegExpSpecialChar | +| regexp.cpp:51:20:51:25 | \\b!a\\B | RegExpSequence | +| regexp.cpp:51:22:51:23 | !a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:51:24:51:25 | \\B | RegExpNonWordBoundary | +| regexp.cpp:54:20:54:24 | (foo) | RegExpGroup | +| regexp.cpp:54:20:54:25 | (foo)* | RegExpStar | +| regexp.cpp:54:20:54:28 | (foo)*bar | RegExpSequence | +| regexp.cpp:54:21:54:23 | foo | RegExpConstant,RegExpNormalChar | +| regexp.cpp:54:26:54:28 | bar | RegExpConstant,RegExpNormalChar | +| regexp.cpp:55:20:55:21 | fo | RegExpConstant,RegExpNormalChar | +| regexp.cpp:55:20:55:28 | fo(o\|b)ar | RegExpSequence | +| regexp.cpp:55:22:55:26 | (o\|b) | RegExpGroup | +| regexp.cpp:55:23:55:23 | o | RegExpConstant,RegExpNormalChar | +| regexp.cpp:55:23:55:25 | o\|b | RegExpAlt | +| regexp.cpp:55:25:55:25 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:55:27:55:28 | ar | RegExpConstant,RegExpNormalChar | +| regexp.cpp:56:20:56:27 | (a\|b\|cd) | RegExpGroup | +| regexp.cpp:56:20:56:28 | (a\|b\|cd)e | RegExpSequence | +| regexp.cpp:56:21:56:21 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:56:21:56:26 | a\|b\|cd | RegExpAlt | +| regexp.cpp:56:23:56:23 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:56:25:56:26 | cd | RegExpConstant,RegExpNormalChar | +| regexp.cpp:56:28:56:28 | e | RegExpConstant,RegExpNormalChar | +| regexp.cpp:57:20:57:25 | (?::+) | RegExpGroup | +| regexp.cpp:57:20:57:27 | (?::+)\\w | RegExpSequence | +| regexp.cpp:57:23:57:23 | : | RegExpConstant,RegExpNormalChar | +| regexp.cpp:57:23:57:24 | :+ | RegExpPlus | +| regexp.cpp:57:26:57:27 | \\w | RegExpCharacterClassEscape | +| regexp.cpp:60:21:60:24 | (a+) | RegExpGroup | +| regexp.cpp:60:21:60:28 | (a+)b+\\1 | RegExpSequence | +| regexp.cpp:60:22:60:22 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:60:22:60:23 | a+ | RegExpPlus | | regexp.cpp:60:25:60:25 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:60:27:60:28 | ar | RegExpConstant,RegExpNormalChar | -| regexp.cpp:61:20:61:27 | (a\|b\|cd) | RegExpGroup | -| regexp.cpp:61:20:61:28 | (a\|b\|cd)e | RegExpSequence | -| regexp.cpp:61:21:61:21 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:61:21:61:26 | a\|b\|cd | RegExpAlt | -| regexp.cpp:61:23:61:23 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:61:25:61:26 | cd | RegExpConstant,RegExpNormalChar | -| regexp.cpp:61:28:61:28 | e | RegExpConstant,RegExpNormalChar | -| regexp.cpp:62:20:62:25 | (?::+) | RegExpGroup | -| regexp.cpp:62:20:62:27 | (?::+)\\w | RegExpSequence | -| regexp.cpp:62:23:62:23 | : | RegExpConstant,RegExpNormalChar | -| regexp.cpp:62:23:62:24 | :+ | RegExpPlus | -| regexp.cpp:62:26:62:27 | \\w | RegExpCharacterClassEscape | -| regexp.cpp:69:21:69:24 | (a+) | RegExpGroup | -| regexp.cpp:69:21:69:28 | (a+)b+\\1 | RegExpSequence | -| regexp.cpp:69:22:69:22 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:69:22:69:23 | a+ | RegExpPlus | -| regexp.cpp:69:25:69:25 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:69:25:69:26 | b+ | RegExpPlus | -| regexp.cpp:69:27:69:28 | \\1 | RegExpBackRef | -| regexp.cpp:73:21:73:31 | [[:alnum:]] | RegExpCharacterClass | -| regexp.cpp:73:21:73:32 | [[:alnum:]]* | RegExpStar | -| regexp.cpp:73:22:73:30 | [:alnum:] | RegExpNamedCharacterProperty | -| regexp.cpp:74:21:74:31 | [[:digit:]] | RegExpCharacterClass | -| regexp.cpp:74:21:74:32 | [[:digit:]]+ | RegExpPlus | -| regexp.cpp:74:22:74:30 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.cpp:75:21:75:31 | [[:alnum:]] | RegExpCharacterClass | -| regexp.cpp:75:21:75:36 | [[:alnum:]]{2,3} | RegExpRange | -| regexp.cpp:75:22:75:30 | [:alnum:] | RegExpNamedCharacterProperty | -| regexp.cpp:76:21:76:34 | [a-f[:digit:]] | RegExpCharacterClass | -| regexp.cpp:76:21:76:35 | [a-f[:digit:]]+ | RegExpPlus | -| regexp.cpp:76:22:76:22 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:76:22:76:24 | a-f | RegExpCharacterRange | -| regexp.cpp:76:24:76:24 | f | RegExpConstant,RegExpNormalChar | -| regexp.cpp:76:25:76:33 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.cpp:79:22:79:32 | [[:alpha:]] | RegExpCharacterClass | -| regexp.cpp:79:22:79:43 | [[:alpha:]][[:digit:]] | RegExpSequence | -| regexp.cpp:79:23:79:31 | [:alpha:] | RegExpNamedCharacterProperty | -| regexp.cpp:79:33:79:43 | [[:digit:]] | RegExpCharacterClass | -| regexp.cpp:79:34:79:42 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.cpp:82:22:82:41 | [[:alpha:][:digit:]] | RegExpCharacterClass | -| regexp.cpp:82:23:82:31 | [:alpha:] | RegExpNamedCharacterProperty | -| regexp.cpp:82:32:82:40 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.cpp:85:22:85:38 | [A-F[:digit:]a-f] | RegExpCharacterClass | -| regexp.cpp:85:23:85:23 | A | RegExpConstant,RegExpNormalChar | -| regexp.cpp:85:23:85:25 | A-F | RegExpCharacterRange | -| regexp.cpp:85:25:85:25 | F | RegExpConstant,RegExpNormalChar | -| regexp.cpp:85:26:85:34 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.cpp:85:35:85:35 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:85:35:85:37 | a-f | RegExpCharacterRange | -| regexp.cpp:85:37:85:37 | f | RegExpConstant,RegExpNormalChar | -| regexp.cpp:88:22:88:30 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.cpp:91:19:91:24 | \\u{987 | RegExpConstant,RegExpEscape | -| regexp.cpp:94:25:94:25 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:94:25:94:28 | a\\nb | RegExpSequence | -| regexp.cpp:94:26:94:27 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:94:28:94:28 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:95:37:95:37 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:95:37:95:40 | a\\nc | RegExpSequence | -| regexp.cpp:95:38:95:39 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:95:40:95:40 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:96:39:96:39 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:96:39:96:42 | a\\nc | RegExpSequence | -| regexp.cpp:96:40:96:41 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:96:42:96:42 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:97:38:97:38 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:97:38:97:41 | a\\nc | RegExpSequence | -| regexp.cpp:97:39:97:40 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:97:41:97:41 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:98:38:98:38 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:98:38:98:41 | a\\nc | RegExpSequence | -| regexp.cpp:98:39:98:40 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:98:41:98:41 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:99:23:99:23 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:99:23:99:26 | a\\nc | RegExpSequence | -| regexp.cpp:99:24:99:25 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:99:26:99:26 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:100:40:100:40 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:100:40:100:43 | a\\nc | RegExpSequence | -| regexp.cpp:100:41:100:42 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:100:43:100:43 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:101:42:101:42 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:101:42:101:45 | a\\nc | RegExpSequence | -| regexp.cpp:101:43:101:44 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:101:45:101:45 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:102:41:102:41 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:102:41:102:44 | a\\nc | RegExpSequence | -| regexp.cpp:102:42:102:43 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:102:44:102:44 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:103:41:103:41 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:103:41:103:44 | a\\nc | RegExpSequence | -| regexp.cpp:103:42:103:43 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:103:44:103:44 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:104:25:104:25 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:104:25:104:28 | a\\nc | RegExpSequence | -| regexp.cpp:104:26:104:27 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:104:28:104:28 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:105:29:105:29 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:105:29:105:32 | a\\nc | RegExpSequence | -| regexp.cpp:105:30:105:31 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:105:32:105:32 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:60:25:60:26 | b+ | RegExpPlus | +| regexp.cpp:60:27:60:28 | \\1 | RegExpBackRef | +| regexp.cpp:63:21:63:31 | [[:alnum:]] | RegExpCharacterClass | +| regexp.cpp:63:21:63:32 | [[:alnum:]]* | RegExpStar | +| regexp.cpp:63:22:63:30 | [:alnum:] | RegExpNamedCharacterProperty | +| regexp.cpp:64:21:64:31 | [[:digit:]] | RegExpCharacterClass | +| regexp.cpp:64:21:64:32 | [[:digit:]]+ | RegExpPlus | +| regexp.cpp:64:22:64:30 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:65:21:65:31 | [[:alnum:]] | RegExpCharacterClass | +| regexp.cpp:65:21:65:36 | [[:alnum:]]{2,3} | RegExpRange | +| regexp.cpp:65:22:65:30 | [:alnum:] | RegExpNamedCharacterProperty | +| regexp.cpp:66:21:66:34 | [a-f[:digit:]] | RegExpCharacterClass | +| regexp.cpp:66:21:66:35 | [a-f[:digit:]]+ | RegExpPlus | +| regexp.cpp:66:22:66:22 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:66:22:66:24 | a-f | RegExpCharacterRange | +| regexp.cpp:66:24:66:24 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:66:25:66:33 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:69:22:69:32 | [[:alpha:]] | RegExpCharacterClass | +| regexp.cpp:69:22:69:43 | [[:alpha:]][[:digit:]] | RegExpSequence | +| regexp.cpp:69:23:69:31 | [:alpha:] | RegExpNamedCharacterProperty | +| regexp.cpp:69:33:69:43 | [[:digit:]] | RegExpCharacterClass | +| regexp.cpp:69:34:69:42 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:72:22:72:41 | [[:alpha:][:digit:]] | RegExpCharacterClass | +| regexp.cpp:72:23:72:31 | [:alpha:] | RegExpNamedCharacterProperty | +| regexp.cpp:72:32:72:40 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:75:22:75:38 | [A-F[:digit:]a-f] | RegExpCharacterClass | +| regexp.cpp:75:23:75:23 | A | RegExpConstant,RegExpNormalChar | +| regexp.cpp:75:23:75:25 | A-F | RegExpCharacterRange | +| regexp.cpp:75:25:75:25 | F | RegExpConstant,RegExpNormalChar | +| regexp.cpp:75:26:75:34 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:75:35:75:35 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:75:35:75:37 | a-f | RegExpCharacterRange | +| regexp.cpp:75:37:75:37 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:78:22:78:30 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:81:19:81:24 | \\u{987 | RegExpConstant,RegExpEscape | +| regexp.cpp:84:21:84:22 | \\c | RegExpConstant,RegExpEscape | +| regexp.cpp:84:21:84:23 | \\cA | RegExpSequence | +| regexp.cpp:84:23:84:23 | A | RegExpConstant,RegExpNormalChar | +| regexp.cpp:85:21:85:25 | [\\cZ] | RegExpCharacterClass | +| regexp.cpp:85:22:85:23 | \\c | RegExpConstant,RegExpEscape | +| regexp.cpp:85:24:85:24 | Z | RegExpConstant,RegExpNormalChar | +| regexp.cpp:88:25:88:25 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:88:25:88:28 | a\\nb | RegExpSequence | +| regexp.cpp:88:26:88:27 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:88:28:88:28 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:89:37:89:37 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:89:37:89:40 | a\\nc | RegExpSequence | +| regexp.cpp:89:38:89:39 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:89:40:89:40 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:90:39:90:39 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:90:39:90:42 | a\\nc | RegExpSequence | +| regexp.cpp:90:40:90:41 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:90:42:90:42 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:91:38:91:38 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:91:38:91:41 | a\\nc | RegExpSequence | +| regexp.cpp:91:39:91:40 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:91:41:91:41 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:92:38:92:38 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:92:38:92:41 | a\\nc | RegExpSequence | +| regexp.cpp:92:39:92:40 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:92:41:92:41 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:93:23:93:23 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:93:23:93:26 | a\\nc | RegExpSequence | +| regexp.cpp:93:24:93:25 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:93:26:93:26 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:94:40:94:40 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:94:40:94:43 | a\\nc | RegExpSequence | +| regexp.cpp:94:41:94:42 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:94:43:94:43 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:95:42:95:42 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:95:42:95:45 | a\\nc | RegExpSequence | +| regexp.cpp:95:43:95:44 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:95:45:95:45 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:96:41:96:41 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:96:41:96:44 | a\\nc | RegExpSequence | +| regexp.cpp:96:42:96:43 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:96:44:96:44 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:97:41:97:41 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:97:41:97:44 | a\\nc | RegExpSequence | +| regexp.cpp:97:42:97:43 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:97:44:97:44 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:98:25:98:25 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:98:25:98:28 | a\\nc | RegExpSequence | +| regexp.cpp:98:26:98:27 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:98:28:98:28 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:99:29:99:29 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:99:29:99:32 | a\\nc | RegExpSequence | +| regexp.cpp:99:30:99:31 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:99:32:99:32 | c | RegExpConstant,RegExpNormalChar | regExpNormalCharValue | regexp.cpp:18:19:18:21 | abc | abc | | regexp.cpp:21:20:21:20 | a | a | @@ -205,100 +211,104 @@ regExpNormalCharValue | regexp.cpp:21:24:21:24 | c | c | | regexp.cpp:21:26:21:26 | d | d | | regexp.cpp:22:20:22:20 | a | a | +| regexp.cpp:23:20:23:20 | a | a | | regexp.cpp:24:20:24:20 | a | a | -| regexp.cpp:25:20:25:20 | a | a | -| regexp.cpp:28:19:28:21 | foo | foo | -| regexp.cpp:28:23:28:25 | bar | bar | +| regexp.cpp:27:19:27:21 | foo | foo | +| regexp.cpp:27:23:27:25 | bar | bar | +| regexp.cpp:30:20:30:20 | a | a | +| regexp.cpp:30:21:30:21 | b | b | +| regexp.cpp:30:22:30:22 | c | c | | regexp.cpp:31:20:31:20 | a | a | -| regexp.cpp:31:21:31:21 | b | b | -| regexp.cpp:31:22:31:22 | c | c | -| regexp.cpp:32:20:32:20 | a | a | -| regexp.cpp:32:22:32:22 | f | f | -| regexp.cpp:32:23:32:23 | A | A | -| regexp.cpp:32:25:32:25 | F | F | -| regexp.cpp:32:26:32:26 | 0 | 0 | -| regexp.cpp:32:28:32:28 | 9 | 9 | -| regexp.cpp:32:29:32:29 | _ | _ | -| regexp.cpp:34:20:34:21 | \\w | w | -| regexp.cpp:35:19:35:20 | \\[ | [ | -| regexp.cpp:35:21:35:22 | \\] | ] | -| regexp.cpp:35:24:35:24 | 1 | 1 | -| regexp.cpp:35:25:35:25 | 2 | 2 | -| regexp.cpp:35:26:35:26 | 3 | 3 | -| regexp.cpp:36:21:36:21 | A | A | -| regexp.cpp:36:23:36:23 | Z | Z | -| regexp.cpp:37:20:37:20 | ] | ] | -| regexp.cpp:38:21:38:21 | ] | ] | -| regexp.cpp:39:21:39:21 | - | - | -| regexp.cpp:40:21:40:21 | \| | \| | -| regexp.cpp:43:23:43:23 | [ | [ | -| regexp.cpp:43:24:43:24 | a | a | -| regexp.cpp:43:26:43:26 | f | f | -| regexp.cpp:43:28:43:31 | A-F] | A-F] | -| regexp.cpp:48:21:48:22 | \\w | w | -| regexp.cpp:48:24:48:25 | \\W | W | -| regexp.cpp:49:21:49:22 | \\s | s | -| regexp.cpp:49:23:49:24 | \\S | S | -| regexp.cpp:50:21:50:22 | \\d | d | -| regexp.cpp:50:23:50:24 | \\D | D | -| regexp.cpp:52:21:52:22 | \\n | \n | -| regexp.cpp:52:23:52:24 | \\r | \r | -| regexp.cpp:52:25:52:26 | \\t | \t | -| regexp.cpp:56:22:56:23 | !a | !a | -| regexp.cpp:59:21:59:23 | foo | foo | -| regexp.cpp:59:26:59:28 | bar | bar | -| regexp.cpp:60:20:60:21 | fo | fo | -| regexp.cpp:60:23:60:23 | o | o | +| regexp.cpp:31:22:31:22 | f | f | +| regexp.cpp:31:23:31:23 | A | A | +| regexp.cpp:31:25:31:25 | F | F | +| regexp.cpp:31:26:31:26 | 0 | 0 | +| regexp.cpp:31:28:31:28 | 9 | 9 | +| regexp.cpp:31:29:31:29 | _ | _ | +| regexp.cpp:32:20:32:21 | \\w | w | +| regexp.cpp:33:19:33:20 | \\[ | [ | +| regexp.cpp:33:21:33:22 | \\] | ] | +| regexp.cpp:33:24:33:24 | 1 | 1 | +| regexp.cpp:33:25:33:25 | 2 | 2 | +| regexp.cpp:33:26:33:26 | 3 | 3 | +| regexp.cpp:34:21:34:21 | A | A | +| regexp.cpp:34:23:34:23 | Z | Z | +| regexp.cpp:35:20:35:20 | ] | ] | +| regexp.cpp:36:21:36:21 | ] | ] | +| regexp.cpp:37:21:37:21 | - | - | +| regexp.cpp:38:20:38:20 | \| | \| | +| regexp.cpp:41:23:41:23 | [ | [ | +| regexp.cpp:41:24:41:24 | a | a | +| regexp.cpp:41:26:41:26 | f | f | +| regexp.cpp:41:28:41:31 | A-F] | A-F] | +| regexp.cpp:45:21:45:22 | \\w | w | +| regexp.cpp:45:24:45:25 | \\W | W | +| regexp.cpp:46:21:46:22 | \\s | s | +| regexp.cpp:46:23:46:24 | \\S | S | +| regexp.cpp:47:21:47:22 | \\d | d | +| regexp.cpp:47:23:47:24 | \\D | D | +| regexp.cpp:48:21:48:22 | \\n | \n | +| regexp.cpp:48:23:48:24 | \\r | \r | +| regexp.cpp:48:25:48:26 | \\t | \t | +| regexp.cpp:51:22:51:23 | !a | !a | +| regexp.cpp:54:21:54:23 | foo | foo | +| regexp.cpp:54:26:54:28 | bar | bar | +| regexp.cpp:55:20:55:21 | fo | fo | +| regexp.cpp:55:23:55:23 | o | o | +| regexp.cpp:55:25:55:25 | b | b | +| regexp.cpp:55:27:55:28 | ar | ar | +| regexp.cpp:56:21:56:21 | a | a | +| regexp.cpp:56:23:56:23 | b | b | +| regexp.cpp:56:25:56:26 | cd | cd | +| regexp.cpp:56:28:56:28 | e | e | +| regexp.cpp:57:23:57:23 | : | : | +| regexp.cpp:57:26:57:27 | \\w | w | +| regexp.cpp:60:22:60:22 | a | a | | regexp.cpp:60:25:60:25 | b | b | -| regexp.cpp:60:27:60:28 | ar | ar | -| regexp.cpp:61:21:61:21 | a | a | -| regexp.cpp:61:23:61:23 | b | b | -| regexp.cpp:61:25:61:26 | cd | cd | -| regexp.cpp:61:28:61:28 | e | e | -| regexp.cpp:62:23:62:23 | : | : | -| regexp.cpp:62:26:62:27 | \\w | w | -| regexp.cpp:69:22:69:22 | a | a | -| regexp.cpp:69:25:69:25 | b | b | -| regexp.cpp:76:22:76:22 | a | a | -| regexp.cpp:76:24:76:24 | f | f | -| regexp.cpp:85:23:85:23 | A | A | -| regexp.cpp:85:25:85:25 | F | F | -| regexp.cpp:85:35:85:35 | a | a | -| regexp.cpp:85:37:85:37 | f | f | -| regexp.cpp:91:19:91:24 | \\u{987 | \u0987 | -| regexp.cpp:94:25:94:25 | a | a | -| regexp.cpp:94:26:94:27 | \\n | \n | -| regexp.cpp:94:28:94:28 | b | b | -| regexp.cpp:95:37:95:37 | a | a | -| regexp.cpp:95:38:95:39 | \\n | \n | -| regexp.cpp:95:40:95:40 | c | c | -| regexp.cpp:96:39:96:39 | a | a | -| regexp.cpp:96:40:96:41 | \\n | \n | -| regexp.cpp:96:42:96:42 | c | c | -| regexp.cpp:97:38:97:38 | a | a | -| regexp.cpp:97:39:97:40 | \\n | \n | -| regexp.cpp:97:41:97:41 | c | c | -| regexp.cpp:98:38:98:38 | a | a | -| regexp.cpp:98:39:98:40 | \\n | \n | -| regexp.cpp:98:41:98:41 | c | c | -| regexp.cpp:99:23:99:23 | a | a | -| regexp.cpp:99:24:99:25 | \\n | \n | -| regexp.cpp:99:26:99:26 | c | c | -| regexp.cpp:100:40:100:40 | a | a | -| regexp.cpp:100:41:100:42 | \\n | \n | -| regexp.cpp:100:43:100:43 | c | c | -| regexp.cpp:101:42:101:42 | a | a | -| regexp.cpp:101:43:101:44 | \\n | \n | -| regexp.cpp:101:45:101:45 | c | c | -| regexp.cpp:102:41:102:41 | a | a | -| regexp.cpp:102:42:102:43 | \\n | \n | -| regexp.cpp:102:44:102:44 | c | c | -| regexp.cpp:103:41:103:41 | a | a | -| regexp.cpp:103:42:103:43 | \\n | \n | -| regexp.cpp:103:44:103:44 | c | c | -| regexp.cpp:104:25:104:25 | a | a | -| regexp.cpp:104:26:104:27 | \\n | \n | -| regexp.cpp:104:28:104:28 | c | c | -| regexp.cpp:105:29:105:29 | a | a | -| regexp.cpp:105:30:105:31 | \\n | \n | -| regexp.cpp:105:32:105:32 | c | c | +| regexp.cpp:66:22:66:22 | a | a | +| regexp.cpp:66:24:66:24 | f | f | +| regexp.cpp:75:23:75:23 | A | A | +| regexp.cpp:75:25:75:25 | F | F | +| regexp.cpp:75:35:75:35 | a | a | +| regexp.cpp:75:37:75:37 | f | f | +| regexp.cpp:81:19:81:24 | \\u{987 | \u0987 | +| regexp.cpp:84:21:84:22 | \\c | c | +| regexp.cpp:84:23:84:23 | A | A | +| regexp.cpp:85:22:85:23 | \\c | c | +| regexp.cpp:85:24:85:24 | Z | Z | +| regexp.cpp:88:25:88:25 | a | a | +| regexp.cpp:88:26:88:27 | \\n | \n | +| regexp.cpp:88:28:88:28 | b | b | +| regexp.cpp:89:37:89:37 | a | a | +| regexp.cpp:89:38:89:39 | \\n | \n | +| regexp.cpp:89:40:89:40 | c | c | +| regexp.cpp:90:39:90:39 | a | a | +| regexp.cpp:90:40:90:41 | \\n | \n | +| regexp.cpp:90:42:90:42 | c | c | +| regexp.cpp:91:38:91:38 | a | a | +| regexp.cpp:91:39:91:40 | \\n | \n | +| regexp.cpp:91:41:91:41 | c | c | +| regexp.cpp:92:38:92:38 | a | a | +| regexp.cpp:92:39:92:40 | \\n | \n | +| regexp.cpp:92:41:92:41 | c | c | +| regexp.cpp:93:23:93:23 | a | a | +| regexp.cpp:93:24:93:25 | \\n | \n | +| regexp.cpp:93:26:93:26 | c | c | +| regexp.cpp:94:40:94:40 | a | a | +| regexp.cpp:94:41:94:42 | \\n | \n | +| regexp.cpp:94:43:94:43 | c | c | +| regexp.cpp:95:42:95:42 | a | a | +| regexp.cpp:95:43:95:44 | \\n | \n | +| regexp.cpp:95:45:95:45 | c | c | +| regexp.cpp:96:41:96:41 | a | a | +| regexp.cpp:96:42:96:43 | \\n | \n | +| regexp.cpp:96:44:96:44 | c | c | +| regexp.cpp:97:41:97:41 | a | a | +| regexp.cpp:97:42:97:43 | \\n | \n | +| regexp.cpp:97:44:97:44 | c | c | +| regexp.cpp:98:25:98:25 | a | a | +| regexp.cpp:98:26:98:27 | \\n | \n | +| regexp.cpp:98:28:98:28 | c | c | +| regexp.cpp:99:29:99:29 | a | a | +| regexp.cpp:99:30:99:31 | \\n | \n | +| regexp.cpp:99:32:99:32 | c | c | From 8d451996a5026de74bc99ea1780ce39bdff11c5f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 23 Jul 2026 10:17:31 +0000 Subject: [PATCH 0173/2098] C++: Implement \cX control escapes --- .../code/cpp/regex/internal/ParseRegExp.qll | 5 ++++- cpp/ql/test/library-tests/regex/parse.expected | 15 +++------------ cpp/ql/test/library-tests/regex/regexp.expected | 13 ++++--------- 3 files changed, 11 insertions(+), 22 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll index b6029c187a7a..8e9e4992d595 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll @@ -322,8 +322,11 @@ abstract class RegExp extends StringLiteral { // wide hex char \uhhhh this.getChar(start + 1) = "u" and end = start + 6 or + // control char \cX + this.getChar(start + 1) = "c" and end = start + 3 + or // escape not handled above; update when adding a new case - not this.getChar(start + 1) in ["x", "u"] and + not this.getChar(start + 1) in ["x", "u", "c"] and not exists(this.getChar(start + 1).toInt()) and end = start + 2 ) diff --git a/cpp/ql/test/library-tests/regex/parse.expected b/cpp/ql/test/library-tests/regex/parse.expected index 49498ec0d230..44c664fa165d 100644 --- a/cpp/ql/test/library-tests/regex/parse.expected +++ b/cpp/ql/test/library-tests/regex/parse.expected @@ -401,21 +401,12 @@ regexp.cpp: # 81| [RegExpConstant, RegExpEscape] \u{987 -# 84| [RegExpConstant, RegExpEscape] \c - -# 84| [RegExpSequence] \cA -#-----| 0 -> [RegExpConstant, RegExpEscape] \c -#-----| 1 -> [RegExpConstant, RegExpNormalChar] A - -# 84| [RegExpConstant, RegExpNormalChar] A +# 84| [RegExpConstant, RegExpEscape] \cA # 85| [RegExpCharacterClass] [\cZ] -#-----| 0 -> [RegExpConstant, RegExpEscape] \c -#-----| 1 -> [RegExpConstant, RegExpNormalChar] Z - -# 85| [RegExpConstant, RegExpEscape] \c +#-----| 0 -> [RegExpConstant, RegExpEscape] \cZ -# 85| [RegExpConstant, RegExpNormalChar] Z +# 85| [RegExpConstant, RegExpEscape] \cZ # 88| [RegExpConstant, RegExpNormalChar] a diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index caede9ebdf9f..fad6510a3ad8 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -150,12 +150,9 @@ term | regexp.cpp:75:37:75:37 | f | RegExpConstant,RegExpNormalChar | | regexp.cpp:78:22:78:30 | [:digit:] | RegExpNamedCharacterProperty | | regexp.cpp:81:19:81:24 | \\u{987 | RegExpConstant,RegExpEscape | -| regexp.cpp:84:21:84:22 | \\c | RegExpConstant,RegExpEscape | -| regexp.cpp:84:21:84:23 | \\cA | RegExpSequence | -| regexp.cpp:84:23:84:23 | A | RegExpConstant,RegExpNormalChar | +| regexp.cpp:84:21:84:23 | \\cA | RegExpConstant,RegExpEscape | | regexp.cpp:85:21:85:25 | [\\cZ] | RegExpCharacterClass | -| regexp.cpp:85:22:85:23 | \\c | RegExpConstant,RegExpEscape | -| regexp.cpp:85:24:85:24 | Z | RegExpConstant,RegExpNormalChar | +| regexp.cpp:85:22:85:24 | \\cZ | RegExpConstant,RegExpEscape | | regexp.cpp:88:25:88:25 | a | RegExpConstant,RegExpNormalChar | | regexp.cpp:88:25:88:28 | a\\nb | RegExpSequence | | regexp.cpp:88:26:88:27 | \\n | RegExpConstant,RegExpEscape | @@ -272,10 +269,8 @@ regExpNormalCharValue | regexp.cpp:75:35:75:35 | a | a | | regexp.cpp:75:37:75:37 | f | f | | regexp.cpp:81:19:81:24 | \\u{987 | \u0987 | -| regexp.cpp:84:21:84:22 | \\c | c | -| regexp.cpp:84:23:84:23 | A | A | -| regexp.cpp:85:22:85:23 | \\c | c | -| regexp.cpp:85:24:85:24 | Z | Z | +| regexp.cpp:84:21:84:23 | \\cA | cA | +| regexp.cpp:85:22:85:24 | \\cZ | cZ | | regexp.cpp:88:25:88:25 | a | a | | regexp.cpp:88:26:88:27 | \\n | \n | | regexp.cpp:88:28:88:28 | b | b | From 87cdedd57d0d09d348b77f7e64549675bbb565a1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 23 Jul 2026 10:18:01 +0000 Subject: [PATCH 0174/2098] C++: Add NUL-escape tests (pre-fix) --- .../library-tests/regex/locations.expected | 26 +-- .../test/library-tests/regex/parse.expected | 96 +++++----- cpp/ql/test/library-tests/regex/regexp.cpp | 4 + .../test/library-tests/regex/regexp.expected | 175 +++++++++--------- 4 files changed, 162 insertions(+), 139 deletions(-) diff --git a/cpp/ql/test/library-tests/regex/locations.expected b/cpp/ql/test/library-tests/regex/locations.expected index 8bcd383853d0..40cd68cf9eb0 100644 --- a/cpp/ql/test/library-tests/regex/locations.expected +++ b/cpp/ql/test/library-tests/regex/locations.expected @@ -35,15 +35,17 @@ | regexp.cpp:78:22:78:30 | [:digit:] | regexp.cpp | 78 | 22 | 78 | 30 | | regexp.cpp:84:21:84:23 | \\cA | regexp.cpp | 84 | 21 | 84 | 23 | | regexp.cpp:85:21:85:25 | [\\cZ] | regexp.cpp | 85 | 21 | 85 | 25 | -| regexp.cpp:88:25:88:28 | a\\nb | regexp.cpp | 88 | 25 | 88 | 28 | -| regexp.cpp:89:37:89:40 | a\\nc | regexp.cpp | 89 | 37 | 89 | 40 | -| regexp.cpp:90:39:90:42 | a\\nc | regexp.cpp | 90 | 39 | 90 | 42 | -| regexp.cpp:91:38:91:41 | a\\nc | regexp.cpp | 91 | 38 | 91 | 41 | -| regexp.cpp:92:38:92:41 | a\\nc | regexp.cpp | 92 | 38 | 92 | 41 | -| regexp.cpp:93:23:93:26 | a\\nc | regexp.cpp | 93 | 23 | 93 | 26 | -| regexp.cpp:94:40:94:43 | a\\nc | regexp.cpp | 94 | 40 | 94 | 43 | -| regexp.cpp:95:42:95:45 | a\\nc | regexp.cpp | 95 | 42 | 95 | 45 | -| regexp.cpp:96:41:96:44 | a\\nc | regexp.cpp | 96 | 41 | 96 | 44 | -| regexp.cpp:97:41:97:44 | a\\nc | regexp.cpp | 97 | 41 | 97 | 44 | -| regexp.cpp:98:25:98:28 | a\\nc | regexp.cpp | 98 | 25 | 98 | 28 | -| regexp.cpp:99:29:99:32 | a\\nc | regexp.cpp | 99 | 29 | 99 | 32 | +| regexp.cpp:88:20:88:21 | \\0 | regexp.cpp | 88 | 20 | 88 | 21 | +| regexp.cpp:89:20:89:23 | [\\0] | regexp.cpp | 89 | 20 | 89 | 23 | +| regexp.cpp:92:25:92:28 | a\\nb | regexp.cpp | 92 | 25 | 92 | 28 | +| regexp.cpp:93:37:93:40 | a\\nc | regexp.cpp | 93 | 37 | 93 | 40 | +| regexp.cpp:94:39:94:42 | a\\nc | regexp.cpp | 94 | 39 | 94 | 42 | +| regexp.cpp:95:38:95:41 | a\\nc | regexp.cpp | 95 | 38 | 95 | 41 | +| regexp.cpp:96:38:96:41 | a\\nc | regexp.cpp | 96 | 38 | 96 | 41 | +| regexp.cpp:97:23:97:26 | a\\nc | regexp.cpp | 97 | 23 | 97 | 26 | +| regexp.cpp:98:40:98:43 | a\\nc | regexp.cpp | 98 | 40 | 98 | 43 | +| regexp.cpp:99:42:99:45 | a\\nc | regexp.cpp | 99 | 42 | 99 | 45 | +| regexp.cpp:100:41:100:44 | a\\nc | regexp.cpp | 100 | 41 | 100 | 44 | +| regexp.cpp:101:41:101:44 | a\\nc | regexp.cpp | 101 | 41 | 101 | 44 | +| regexp.cpp:102:25:102:28 | a\\nc | regexp.cpp | 102 | 25 | 102 | 28 | +| regexp.cpp:103:29:103:32 | a\\nc | regexp.cpp | 103 | 29 | 103 | 32 | diff --git a/cpp/ql/test/library-tests/regex/parse.expected b/cpp/ql/test/library-tests/regex/parse.expected index 44c664fa165d..418b245c5140 100644 --- a/cpp/ql/test/library-tests/regex/parse.expected +++ b/cpp/ql/test/library-tests/regex/parse.expected @@ -408,60 +408,26 @@ regexp.cpp: # 85| [RegExpConstant, RegExpEscape] \cZ -# 88| [RegExpConstant, RegExpNormalChar] a +# 88| [RegExpConstant, RegExpNormalChar] \0 -# 88| [RegExpSequence] a\nb -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] b - -# 88| [RegExpConstant, RegExpEscape] \n - -# 88| [RegExpConstant, RegExpNormalChar] b - -# 89| [RegExpConstant, RegExpNormalChar] a - -# 89| [RegExpSequence] a\nc -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c - -# 89| [RegExpConstant, RegExpEscape] \n +# 89| [RegExpCharacterClass] [\0] +#-----| 0 -> [RegExpConstant, RegExpNormalChar] \ +#-----| 1 -> [RegExpConstant, RegExpNormalChar] 0 -# 89| [RegExpConstant, RegExpNormalChar] c +# 89| [RegExpConstant, RegExpNormalChar] \ -# 90| [RegExpConstant, RegExpNormalChar] a - -# 90| [RegExpSequence] a\nc -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c - -# 90| [RegExpConstant, RegExpEscape] \n - -# 90| [RegExpConstant, RegExpNormalChar] c - -# 91| [RegExpConstant, RegExpNormalChar] a - -# 91| [RegExpSequence] a\nc -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c - -# 91| [RegExpConstant, RegExpEscape] \n - -# 91| [RegExpConstant, RegExpNormalChar] c +# 89| [RegExpConstant, RegExpNormalChar] 0 # 92| [RegExpConstant, RegExpNormalChar] a -# 92| [RegExpSequence] a\nc +# 92| [RegExpSequence] a\nb #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c +#-----| 2 -> [RegExpConstant, RegExpNormalChar] b # 92| [RegExpConstant, RegExpEscape] \n -# 92| [RegExpConstant, RegExpNormalChar] c +# 92| [RegExpConstant, RegExpNormalChar] b # 93| [RegExpConstant, RegExpNormalChar] a @@ -539,3 +505,47 @@ regexp.cpp: # 99| [RegExpConstant, RegExpEscape] \n # 99| [RegExpConstant, RegExpNormalChar] c + +# 100| [RegExpConstant, RegExpNormalChar] a + +# 100| [RegExpSequence] a\nc +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpEscape] \n +#-----| 2 -> [RegExpConstant, RegExpNormalChar] c + +# 100| [RegExpConstant, RegExpEscape] \n + +# 100| [RegExpConstant, RegExpNormalChar] c + +# 101| [RegExpConstant, RegExpNormalChar] a + +# 101| [RegExpSequence] a\nc +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpEscape] \n +#-----| 2 -> [RegExpConstant, RegExpNormalChar] c + +# 101| [RegExpConstant, RegExpEscape] \n + +# 101| [RegExpConstant, RegExpNormalChar] c + +# 102| [RegExpConstant, RegExpNormalChar] a + +# 102| [RegExpSequence] a\nc +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpEscape] \n +#-----| 2 -> [RegExpConstant, RegExpNormalChar] c + +# 102| [RegExpConstant, RegExpEscape] \n + +# 102| [RegExpConstant, RegExpNormalChar] c + +# 103| [RegExpConstant, RegExpNormalChar] a + +# 103| [RegExpSequence] a\nc +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpEscape] \n +#-----| 2 -> [RegExpConstant, RegExpNormalChar] c + +# 103| [RegExpConstant, RegExpEscape] \n + +# 103| [RegExpConstant, RegExpNormalChar] c diff --git a/cpp/ql/test/library-tests/regex/regexp.cpp b/cpp/ql/test/library-tests/regex/regexp.cpp index 462f5ecbc293..57dc43bd4714 100644 --- a/cpp/ql/test/library-tests/regex/regexp.cpp +++ b/cpp/ql/test/library-tests/regex/regexp.cpp @@ -84,6 +84,10 @@ std::regex r_uni("\\u{9879}"); std::regex r_ctrl1("\\cA"); std::regex r_ctrl2("[\\cZ]"); +// NUL escape +std::regex r_nul1("\\0"); +std::regex r_nul2("[\\0]"); + // String literal spellings for location tests std::regex r_loc_plain("a\\nb"); std::basic_regex r_loc_L(L"a\\nc"); diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index fad6510a3ad8..e2d6abe48a39 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -153,54 +153,58 @@ term | regexp.cpp:84:21:84:23 | \\cA | RegExpConstant,RegExpEscape | | regexp.cpp:85:21:85:25 | [\\cZ] | RegExpCharacterClass | | regexp.cpp:85:22:85:24 | \\cZ | RegExpConstant,RegExpEscape | -| regexp.cpp:88:25:88:25 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:88:25:88:28 | a\\nb | RegExpSequence | -| regexp.cpp:88:26:88:27 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:88:28:88:28 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:89:37:89:37 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:89:37:89:40 | a\\nc | RegExpSequence | -| regexp.cpp:89:38:89:39 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:89:40:89:40 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:90:39:90:39 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:90:39:90:42 | a\\nc | RegExpSequence | -| regexp.cpp:90:40:90:41 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:90:42:90:42 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:91:38:91:38 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:91:38:91:41 | a\\nc | RegExpSequence | -| regexp.cpp:91:39:91:40 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:91:41:91:41 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:92:38:92:38 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:92:38:92:41 | a\\nc | RegExpSequence | -| regexp.cpp:92:39:92:40 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:92:41:92:41 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:93:23:93:23 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:93:23:93:26 | a\\nc | RegExpSequence | -| regexp.cpp:93:24:93:25 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:93:26:93:26 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:94:40:94:40 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:94:40:94:43 | a\\nc | RegExpSequence | -| regexp.cpp:94:41:94:42 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:94:43:94:43 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:95:42:95:42 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:95:42:95:45 | a\\nc | RegExpSequence | -| regexp.cpp:95:43:95:44 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:95:45:95:45 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:96:41:96:41 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:96:41:96:44 | a\\nc | RegExpSequence | -| regexp.cpp:96:42:96:43 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:96:44:96:44 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:97:41:97:41 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:97:41:97:44 | a\\nc | RegExpSequence | -| regexp.cpp:97:42:97:43 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:97:44:97:44 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:98:25:98:25 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:98:25:98:28 | a\\nc | RegExpSequence | -| regexp.cpp:98:26:98:27 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:98:28:98:28 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:99:29:99:29 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:99:29:99:32 | a\\nc | RegExpSequence | -| regexp.cpp:99:30:99:31 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:99:32:99:32 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:88:20:88:21 | \\0 | RegExpConstant,RegExpNormalChar | +| regexp.cpp:89:20:89:23 | [\\0] | RegExpCharacterClass | +| regexp.cpp:89:21:89:21 | \\ | RegExpConstant,RegExpNormalChar | +| regexp.cpp:89:22:89:22 | 0 | RegExpConstant,RegExpNormalChar | +| regexp.cpp:92:25:92:25 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:92:25:92:28 | a\\nb | RegExpSequence | +| regexp.cpp:92:26:92:27 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:92:28:92:28 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:93:37:93:37 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:93:37:93:40 | a\\nc | RegExpSequence | +| regexp.cpp:93:38:93:39 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:93:40:93:40 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:94:39:94:39 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:94:39:94:42 | a\\nc | RegExpSequence | +| regexp.cpp:94:40:94:41 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:94:42:94:42 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:95:38:95:38 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:95:38:95:41 | a\\nc | RegExpSequence | +| regexp.cpp:95:39:95:40 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:95:41:95:41 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:96:38:96:38 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:96:38:96:41 | a\\nc | RegExpSequence | +| regexp.cpp:96:39:96:40 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:96:41:96:41 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:97:23:97:23 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:97:23:97:26 | a\\nc | RegExpSequence | +| regexp.cpp:97:24:97:25 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:97:26:97:26 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:98:40:98:40 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:98:40:98:43 | a\\nc | RegExpSequence | +| regexp.cpp:98:41:98:42 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:98:43:98:43 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:99:42:99:42 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:99:42:99:45 | a\\nc | RegExpSequence | +| regexp.cpp:99:43:99:44 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:99:45:99:45 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:100:41:100:41 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:100:41:100:44 | a\\nc | RegExpSequence | +| regexp.cpp:100:42:100:43 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:100:44:100:44 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:101:41:101:41 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:101:41:101:44 | a\\nc | RegExpSequence | +| regexp.cpp:101:42:101:43 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:101:44:101:44 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:102:25:102:25 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:102:25:102:28 | a\\nc | RegExpSequence | +| regexp.cpp:102:26:102:27 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:102:28:102:28 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:103:29:103:29 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:103:29:103:32 | a\\nc | RegExpSequence | +| regexp.cpp:103:30:103:31 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:103:32:103:32 | c | RegExpConstant,RegExpNormalChar | regExpNormalCharValue | regexp.cpp:18:19:18:21 | abc | abc | | regexp.cpp:21:20:21:20 | a | a | @@ -271,39 +275,42 @@ regExpNormalCharValue | regexp.cpp:81:19:81:24 | \\u{987 | \u0987 | | regexp.cpp:84:21:84:23 | \\cA | cA | | regexp.cpp:85:22:85:24 | \\cZ | cZ | -| regexp.cpp:88:25:88:25 | a | a | -| regexp.cpp:88:26:88:27 | \\n | \n | -| regexp.cpp:88:28:88:28 | b | b | -| regexp.cpp:89:37:89:37 | a | a | -| regexp.cpp:89:38:89:39 | \\n | \n | -| regexp.cpp:89:40:89:40 | c | c | -| regexp.cpp:90:39:90:39 | a | a | -| regexp.cpp:90:40:90:41 | \\n | \n | -| regexp.cpp:90:42:90:42 | c | c | -| regexp.cpp:91:38:91:38 | a | a | -| regexp.cpp:91:39:91:40 | \\n | \n | -| regexp.cpp:91:41:91:41 | c | c | -| regexp.cpp:92:38:92:38 | a | a | -| regexp.cpp:92:39:92:40 | \\n | \n | -| regexp.cpp:92:41:92:41 | c | c | -| regexp.cpp:93:23:93:23 | a | a | -| regexp.cpp:93:24:93:25 | \\n | \n | -| regexp.cpp:93:26:93:26 | c | c | -| regexp.cpp:94:40:94:40 | a | a | -| regexp.cpp:94:41:94:42 | \\n | \n | -| regexp.cpp:94:43:94:43 | c | c | -| regexp.cpp:95:42:95:42 | a | a | -| regexp.cpp:95:43:95:44 | \\n | \n | -| regexp.cpp:95:45:95:45 | c | c | -| regexp.cpp:96:41:96:41 | a | a | -| regexp.cpp:96:42:96:43 | \\n | \n | -| regexp.cpp:96:44:96:44 | c | c | -| regexp.cpp:97:41:97:41 | a | a | -| regexp.cpp:97:42:97:43 | \\n | \n | -| regexp.cpp:97:44:97:44 | c | c | -| regexp.cpp:98:25:98:25 | a | a | -| regexp.cpp:98:26:98:27 | \\n | \n | -| regexp.cpp:98:28:98:28 | c | c | -| regexp.cpp:99:29:99:29 | a | a | -| regexp.cpp:99:30:99:31 | \\n | \n | -| regexp.cpp:99:32:99:32 | c | c | +| regexp.cpp:88:20:88:21 | \\0 | \\0 | +| regexp.cpp:89:21:89:21 | \\ | \\ | +| regexp.cpp:89:22:89:22 | 0 | 0 | +| regexp.cpp:92:25:92:25 | a | a | +| regexp.cpp:92:26:92:27 | \\n | \n | +| regexp.cpp:92:28:92:28 | b | b | +| regexp.cpp:93:37:93:37 | a | a | +| regexp.cpp:93:38:93:39 | \\n | \n | +| regexp.cpp:93:40:93:40 | c | c | +| regexp.cpp:94:39:94:39 | a | a | +| regexp.cpp:94:40:94:41 | \\n | \n | +| regexp.cpp:94:42:94:42 | c | c | +| regexp.cpp:95:38:95:38 | a | a | +| regexp.cpp:95:39:95:40 | \\n | \n | +| regexp.cpp:95:41:95:41 | c | c | +| regexp.cpp:96:38:96:38 | a | a | +| regexp.cpp:96:39:96:40 | \\n | \n | +| regexp.cpp:96:41:96:41 | c | c | +| regexp.cpp:97:23:97:23 | a | a | +| regexp.cpp:97:24:97:25 | \\n | \n | +| regexp.cpp:97:26:97:26 | c | c | +| regexp.cpp:98:40:98:40 | a | a | +| regexp.cpp:98:41:98:42 | \\n | \n | +| regexp.cpp:98:43:98:43 | c | c | +| regexp.cpp:99:42:99:42 | a | a | +| regexp.cpp:99:43:99:44 | \\n | \n | +| regexp.cpp:99:45:99:45 | c | c | +| regexp.cpp:100:41:100:41 | a | a | +| regexp.cpp:100:42:100:43 | \\n | \n | +| regexp.cpp:100:44:100:44 | c | c | +| regexp.cpp:101:41:101:41 | a | a | +| regexp.cpp:101:42:101:43 | \\n | \n | +| regexp.cpp:101:44:101:44 | c | c | +| regexp.cpp:102:25:102:25 | a | a | +| regexp.cpp:102:26:102:27 | \\n | \n | +| regexp.cpp:102:28:102:28 | c | c | +| regexp.cpp:103:29:103:29 | a | a | +| regexp.cpp:103:30:103:31 | \\n | \n | +| regexp.cpp:103:32:103:32 | c | c | From 81783e64f816bdefbf4e0de76a4456d2557c85af Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 23 Jul 2026 10:19:10 +0000 Subject: [PATCH 0175/2098] C++: Implement \0 NUL escape --- .../lib/semmle/code/cpp/regex/internal/ParseRegExp.qll | 9 ++++++--- cpp/ql/test/library-tests/regex/parse.expected | 9 +++------ cpp/ql/test/library-tests/regex/regexp.expected | 10 ++++------ 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll index 8e9e4992d595..af76baaa0f68 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll @@ -325,6 +325,11 @@ abstract class RegExp extends StringLiteral { // control char \cX this.getChar(start + 1) = "c" and end = start + 3 or + // nul escape \0 (when not followed by a digit) + this.getChar(start + 1) = "0" and + end = start + 2 and + not exists(this.getChar(start + 2).toInt()) + or // escape not handled above; update when adding a new case not this.getChar(start + 1) in ["x", "u", "c"] and not exists(this.getChar(start + 1).toInt()) and @@ -598,9 +603,7 @@ abstract class RegExp extends StringLiteral { } /** Whether the text in the range `start,end` is a back reference */ - predicate backreference(int start, int end) { - this.numberedBackreference(start, end, _) - } + predicate backreference(int start, int end) { this.numberedBackreference(start, end, _) } /** Gets the number of the back reference in start,end */ int getBackRefNumber(int start, int end) { this.numberedBackreference(start, end, result) } diff --git a/cpp/ql/test/library-tests/regex/parse.expected b/cpp/ql/test/library-tests/regex/parse.expected index 418b245c5140..b81d05e1984f 100644 --- a/cpp/ql/test/library-tests/regex/parse.expected +++ b/cpp/ql/test/library-tests/regex/parse.expected @@ -408,15 +408,12 @@ regexp.cpp: # 85| [RegExpConstant, RegExpEscape] \cZ -# 88| [RegExpConstant, RegExpNormalChar] \0 +# 88| [RegExpConstant, RegExpEscape] \0 # 89| [RegExpCharacterClass] [\0] -#-----| 0 -> [RegExpConstant, RegExpNormalChar] \ -#-----| 1 -> [RegExpConstant, RegExpNormalChar] 0 +#-----| 0 -> [RegExpConstant, RegExpEscape] \0 -# 89| [RegExpConstant, RegExpNormalChar] \ - -# 89| [RegExpConstant, RegExpNormalChar] 0 +# 89| [RegExpConstant, RegExpEscape] \0 # 92| [RegExpConstant, RegExpNormalChar] a diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index e2d6abe48a39..3dc7b20753af 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -153,10 +153,9 @@ term | regexp.cpp:84:21:84:23 | \\cA | RegExpConstant,RegExpEscape | | regexp.cpp:85:21:85:25 | [\\cZ] | RegExpCharacterClass | | regexp.cpp:85:22:85:24 | \\cZ | RegExpConstant,RegExpEscape | -| regexp.cpp:88:20:88:21 | \\0 | RegExpConstant,RegExpNormalChar | +| regexp.cpp:88:20:88:21 | \\0 | RegExpConstant,RegExpEscape | | regexp.cpp:89:20:89:23 | [\\0] | RegExpCharacterClass | -| regexp.cpp:89:21:89:21 | \\ | RegExpConstant,RegExpNormalChar | -| regexp.cpp:89:22:89:22 | 0 | RegExpConstant,RegExpNormalChar | +| regexp.cpp:89:21:89:22 | \\0 | RegExpConstant,RegExpEscape | | regexp.cpp:92:25:92:25 | a | RegExpConstant,RegExpNormalChar | | regexp.cpp:92:25:92:28 | a\\nb | RegExpSequence | | regexp.cpp:92:26:92:27 | \\n | RegExpConstant,RegExpEscape | @@ -275,9 +274,8 @@ regExpNormalCharValue | regexp.cpp:81:19:81:24 | \\u{987 | \u0987 | | regexp.cpp:84:21:84:23 | \\cA | cA | | regexp.cpp:85:22:85:24 | \\cZ | cZ | -| regexp.cpp:88:20:88:21 | \\0 | \\0 | -| regexp.cpp:89:21:89:21 | \\ | \\ | -| regexp.cpp:89:22:89:22 | 0 | 0 | +| regexp.cpp:88:20:88:21 | \\0 | 0 | +| regexp.cpp:89:21:89:22 | \\0 | 0 | | regexp.cpp:92:25:92:25 | a | a | | regexp.cpp:92:26:92:27 | \\n | \n | | regexp.cpp:92:28:92:28 | b | b | From 03625be23222d3374563763e9e80a2199928433f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 23 Jul 2026 10:19:40 +0000 Subject: [PATCH 0176/2098] C++: Add POSIX collating-symbol tests (pre-fix) --- .../library-tests/regex/locations.expected | 36 +-- .../test/library-tests/regex/parse.expected | 131 ++++++---- cpp/ql/test/library-tests/regex/regexp.cpp | 4 + .../test/library-tests/regex/regexp.expected | 223 ++++++++++-------- 4 files changed, 239 insertions(+), 155 deletions(-) diff --git a/cpp/ql/test/library-tests/regex/locations.expected b/cpp/ql/test/library-tests/regex/locations.expected index 40cd68cf9eb0..d19f83db4503 100644 --- a/cpp/ql/test/library-tests/regex/locations.expected +++ b/cpp/ql/test/library-tests/regex/locations.expected @@ -32,20 +32,22 @@ | regexp.cpp:69:22:69:43 | [[:alpha:]][[:digit:]] | regexp.cpp | 69 | 22 | 69 | 43 | | regexp.cpp:72:22:72:41 | [[:alpha:][:digit:]] | regexp.cpp | 72 | 22 | 72 | 41 | | regexp.cpp:75:22:75:38 | [A-F[:digit:]a-f] | regexp.cpp | 75 | 22 | 75 | 38 | -| regexp.cpp:78:22:78:30 | [:digit:] | regexp.cpp | 78 | 22 | 78 | 30 | -| regexp.cpp:84:21:84:23 | \\cA | regexp.cpp | 84 | 21 | 84 | 23 | -| regexp.cpp:85:21:85:25 | [\\cZ] | regexp.cpp | 85 | 21 | 85 | 25 | -| regexp.cpp:88:20:88:21 | \\0 | regexp.cpp | 88 | 20 | 88 | 21 | -| regexp.cpp:89:20:89:23 | [\\0] | regexp.cpp | 89 | 20 | 89 | 23 | -| regexp.cpp:92:25:92:28 | a\\nb | regexp.cpp | 92 | 25 | 92 | 28 | -| regexp.cpp:93:37:93:40 | a\\nc | regexp.cpp | 93 | 37 | 93 | 40 | -| regexp.cpp:94:39:94:42 | a\\nc | regexp.cpp | 94 | 39 | 94 | 42 | -| regexp.cpp:95:38:95:41 | a\\nc | regexp.cpp | 95 | 38 | 95 | 41 | -| regexp.cpp:96:38:96:41 | a\\nc | regexp.cpp | 96 | 38 | 96 | 41 | -| regexp.cpp:97:23:97:26 | a\\nc | regexp.cpp | 97 | 23 | 97 | 26 | -| regexp.cpp:98:40:98:43 | a\\nc | regexp.cpp | 98 | 40 | 98 | 43 | -| regexp.cpp:99:42:99:45 | a\\nc | regexp.cpp | 99 | 42 | 99 | 45 | -| regexp.cpp:100:41:100:44 | a\\nc | regexp.cpp | 100 | 41 | 100 | 44 | -| regexp.cpp:101:41:101:44 | a\\nc | regexp.cpp | 101 | 41 | 101 | 44 | -| regexp.cpp:102:25:102:28 | a\\nc | regexp.cpp | 102 | 25 | 102 | 28 | -| regexp.cpp:103:29:103:32 | a\\nc | regexp.cpp | 103 | 29 | 103 | 32 | +| regexp.cpp:78:27:78:33 | [[.a.]] | regexp.cpp | 78 | 27 | 78 | 33 | +| regexp.cpp:79:27:79:39 | [A-F[.b.]a-f] | regexp.cpp | 79 | 27 | 79 | 39 | +| regexp.cpp:82:22:82:30 | [:digit:] | regexp.cpp | 82 | 22 | 82 | 30 | +| regexp.cpp:88:21:88:23 | \\cA | regexp.cpp | 88 | 21 | 88 | 23 | +| regexp.cpp:89:21:89:25 | [\\cZ] | regexp.cpp | 89 | 21 | 89 | 25 | +| regexp.cpp:92:20:92:21 | \\0 | regexp.cpp | 92 | 20 | 92 | 21 | +| regexp.cpp:93:20:93:23 | [\\0] | regexp.cpp | 93 | 20 | 93 | 23 | +| regexp.cpp:96:25:96:28 | a\\nb | regexp.cpp | 96 | 25 | 96 | 28 | +| regexp.cpp:97:37:97:40 | a\\nc | regexp.cpp | 97 | 37 | 97 | 40 | +| regexp.cpp:98:39:98:42 | a\\nc | regexp.cpp | 98 | 39 | 98 | 42 | +| regexp.cpp:99:38:99:41 | a\\nc | regexp.cpp | 99 | 38 | 99 | 41 | +| regexp.cpp:100:38:100:41 | a\\nc | regexp.cpp | 100 | 38 | 100 | 41 | +| regexp.cpp:101:23:101:26 | a\\nc | regexp.cpp | 101 | 23 | 101 | 26 | +| regexp.cpp:102:40:102:43 | a\\nc | regexp.cpp | 102 | 40 | 102 | 43 | +| regexp.cpp:103:42:103:45 | a\\nc | regexp.cpp | 103 | 42 | 103 | 45 | +| regexp.cpp:104:41:104:44 | a\\nc | regexp.cpp | 104 | 41 | 104 | 44 | +| regexp.cpp:105:41:105:44 | a\\nc | regexp.cpp | 105 | 41 | 105 | 44 | +| regexp.cpp:106:25:106:28 | a\\nc | regexp.cpp | 106 | 25 | 106 | 28 | +| regexp.cpp:107:29:107:32 | a\\nc | regexp.cpp | 107 | 29 | 107 | 32 | diff --git a/cpp/ql/test/library-tests/regex/parse.expected b/cpp/ql/test/library-tests/regex/parse.expected index b81d05e1984f..ac066391db12 100644 --- a/cpp/ql/test/library-tests/regex/parse.expected +++ b/cpp/ql/test/library-tests/regex/parse.expected @@ -397,78 +397,83 @@ regexp.cpp: # 75| [RegExpConstant, RegExpNormalChar] f -# 78| [RegExpNamedCharacterProperty] [:digit:] +# 78| [RegExpCharacterClass] [[.a.] +#-----| 0 -> [RegExpConstant, RegExpNormalChar] [ +#-----| 1 -> [RegExpConstant, RegExpNormalChar] . +#-----| 2 -> [RegExpConstant, RegExpNormalChar] a +#-----| 3 -> [RegExpConstant, RegExpNormalChar] . -# 81| [RegExpConstant, RegExpEscape] \u{987 +# 78| [RegExpSequence] [[.a.]] +#-----| 0 -> [RegExpCharacterClass] [[.a.] +#-----| 1 -> [RegExpConstant, RegExpNormalChar] ] -# 84| [RegExpConstant, RegExpEscape] \cA +# 78| [RegExpConstant, RegExpNormalChar] [ -# 85| [RegExpCharacterClass] [\cZ] -#-----| 0 -> [RegExpConstant, RegExpEscape] \cZ +# 78| [RegExpConstant, RegExpNormalChar] . -# 85| [RegExpConstant, RegExpEscape] \cZ +# 78| [RegExpConstant, RegExpNormalChar] a -# 88| [RegExpConstant, RegExpEscape] \0 +# 78| [RegExpConstant, RegExpNormalChar] . -# 89| [RegExpCharacterClass] [\0] -#-----| 0 -> [RegExpConstant, RegExpEscape] \0 +# 78| [RegExpConstant, RegExpNormalChar] ] -# 89| [RegExpConstant, RegExpEscape] \0 +# 79| [RegExpCharacterClass] [A-F[.b.] +#-----| 0 -> [RegExpCharacterRange] A-F +#-----| 1 -> [RegExpConstant, RegExpNormalChar] [ +#-----| 2 -> [RegExpConstant, RegExpNormalChar] . +#-----| 3 -> [RegExpConstant, RegExpNormalChar] b +#-----| 4 -> [RegExpConstant, RegExpNormalChar] . -# 92| [RegExpConstant, RegExpNormalChar] a +# 79| [RegExpSequence] [A-F[.b.]a-f] +#-----| 0 -> [RegExpCharacterClass] [A-F[.b.] +#-----| 1 -> [RegExpConstant, RegExpNormalChar] a-f] -# 92| [RegExpSequence] a\nb -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] b +# 79| [RegExpConstant, RegExpNormalChar] A -# 92| [RegExpConstant, RegExpEscape] \n +# 79| [RegExpCharacterRange] A-F +#-----| 0 -> [RegExpConstant, RegExpNormalChar] A +#-----| 1 -> [RegExpConstant, RegExpNormalChar] F -# 92| [RegExpConstant, RegExpNormalChar] b +# 79| [RegExpConstant, RegExpNormalChar] F -# 93| [RegExpConstant, RegExpNormalChar] a +# 79| [RegExpConstant, RegExpNormalChar] [ -# 93| [RegExpSequence] a\nc -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c +# 79| [RegExpConstant, RegExpNormalChar] . -# 93| [RegExpConstant, RegExpEscape] \n +# 79| [RegExpConstant, RegExpNormalChar] b -# 93| [RegExpConstant, RegExpNormalChar] c +# 79| [RegExpConstant, RegExpNormalChar] . -# 94| [RegExpConstant, RegExpNormalChar] a +# 79| [RegExpConstant, RegExpNormalChar] a-f] -# 94| [RegExpSequence] a\nc -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c +# 82| [RegExpNamedCharacterProperty] [:digit:] -# 94| [RegExpConstant, RegExpEscape] \n +# 85| [RegExpConstant, RegExpEscape] \u{987 -# 94| [RegExpConstant, RegExpNormalChar] c +# 88| [RegExpConstant, RegExpEscape] \cA -# 95| [RegExpConstant, RegExpNormalChar] a +# 89| [RegExpCharacterClass] [\cZ] +#-----| 0 -> [RegExpConstant, RegExpEscape] \cZ -# 95| [RegExpSequence] a\nc -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c +# 89| [RegExpConstant, RegExpEscape] \cZ -# 95| [RegExpConstant, RegExpEscape] \n +# 92| [RegExpConstant, RegExpEscape] \0 -# 95| [RegExpConstant, RegExpNormalChar] c +# 93| [RegExpCharacterClass] [\0] +#-----| 0 -> [RegExpConstant, RegExpEscape] \0 + +# 93| [RegExpConstant, RegExpEscape] \0 # 96| [RegExpConstant, RegExpNormalChar] a -# 96| [RegExpSequence] a\nc +# 96| [RegExpSequence] a\nb #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c +#-----| 2 -> [RegExpConstant, RegExpNormalChar] b # 96| [RegExpConstant, RegExpEscape] \n -# 96| [RegExpConstant, RegExpNormalChar] c +# 96| [RegExpConstant, RegExpNormalChar] b # 97| [RegExpConstant, RegExpNormalChar] a @@ -546,3 +551,47 @@ regexp.cpp: # 103| [RegExpConstant, RegExpEscape] \n # 103| [RegExpConstant, RegExpNormalChar] c + +# 104| [RegExpConstant, RegExpNormalChar] a + +# 104| [RegExpSequence] a\nc +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpEscape] \n +#-----| 2 -> [RegExpConstant, RegExpNormalChar] c + +# 104| [RegExpConstant, RegExpEscape] \n + +# 104| [RegExpConstant, RegExpNormalChar] c + +# 105| [RegExpConstant, RegExpNormalChar] a + +# 105| [RegExpSequence] a\nc +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpEscape] \n +#-----| 2 -> [RegExpConstant, RegExpNormalChar] c + +# 105| [RegExpConstant, RegExpEscape] \n + +# 105| [RegExpConstant, RegExpNormalChar] c + +# 106| [RegExpConstant, RegExpNormalChar] a + +# 106| [RegExpSequence] a\nc +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpEscape] \n +#-----| 2 -> [RegExpConstant, RegExpNormalChar] c + +# 106| [RegExpConstant, RegExpEscape] \n + +# 106| [RegExpConstant, RegExpNormalChar] c + +# 107| [RegExpConstant, RegExpNormalChar] a + +# 107| [RegExpSequence] a\nc +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpEscape] \n +#-----| 2 -> [RegExpConstant, RegExpNormalChar] c + +# 107| [RegExpConstant, RegExpEscape] \n + +# 107| [RegExpConstant, RegExpNormalChar] c diff --git a/cpp/ql/test/library-tests/regex/regexp.cpp b/cpp/ql/test/library-tests/regex/regexp.cpp index 57dc43bd4714..496cf60e4e0d 100644 --- a/cpp/ql/test/library-tests/regex/regexp.cpp +++ b/cpp/ql/test/library-tests/regex/regexp.cpp @@ -74,6 +74,10 @@ std::regex r_posix2("[[:alpha:][:digit:]]"); // A single character class containing two ranges and one POSIX bracket expression std::regex r_posix3("[A-F[:digit:]a-f]"); +// POSIX collating symbols +std::regex r_posix_coll1("[[.a.]]"); +std::regex r_posix_coll2("[A-F[.b.]a-f]"); + // *Not* a POSIX bracket expression; just a regular character class. std::regex r_posix4("[:digit:]"); diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index 3dc7b20753af..325ff3cebaaa 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -148,62 +148,79 @@ term | regexp.cpp:75:35:75:35 | a | RegExpConstant,RegExpNormalChar | | regexp.cpp:75:35:75:37 | a-f | RegExpCharacterRange | | regexp.cpp:75:37:75:37 | f | RegExpConstant,RegExpNormalChar | -| regexp.cpp:78:22:78:30 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.cpp:81:19:81:24 | \\u{987 | RegExpConstant,RegExpEscape | -| regexp.cpp:84:21:84:23 | \\cA | RegExpConstant,RegExpEscape | -| regexp.cpp:85:21:85:25 | [\\cZ] | RegExpCharacterClass | -| regexp.cpp:85:22:85:24 | \\cZ | RegExpConstant,RegExpEscape | -| regexp.cpp:88:20:88:21 | \\0 | RegExpConstant,RegExpEscape | -| regexp.cpp:89:20:89:23 | [\\0] | RegExpCharacterClass | -| regexp.cpp:89:21:89:22 | \\0 | RegExpConstant,RegExpEscape | -| regexp.cpp:92:25:92:25 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:92:25:92:28 | a\\nb | RegExpSequence | -| regexp.cpp:92:26:92:27 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:92:28:92:28 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:93:37:93:37 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:93:37:93:40 | a\\nc | RegExpSequence | -| regexp.cpp:93:38:93:39 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:93:40:93:40 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:94:39:94:39 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:94:39:94:42 | a\\nc | RegExpSequence | -| regexp.cpp:94:40:94:41 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:94:42:94:42 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:95:38:95:38 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:95:38:95:41 | a\\nc | RegExpSequence | -| regexp.cpp:95:39:95:40 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:95:41:95:41 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:96:38:96:38 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:96:38:96:41 | a\\nc | RegExpSequence | -| regexp.cpp:96:39:96:40 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:96:41:96:41 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:97:23:97:23 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:97:23:97:26 | a\\nc | RegExpSequence | -| regexp.cpp:97:24:97:25 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:97:26:97:26 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:98:40:98:40 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:98:40:98:43 | a\\nc | RegExpSequence | -| regexp.cpp:98:41:98:42 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:98:43:98:43 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:99:42:99:42 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:99:42:99:45 | a\\nc | RegExpSequence | -| regexp.cpp:99:43:99:44 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:99:45:99:45 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:100:41:100:41 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:100:41:100:44 | a\\nc | RegExpSequence | -| regexp.cpp:100:42:100:43 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:100:44:100:44 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:101:41:101:41 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:101:41:101:44 | a\\nc | RegExpSequence | -| regexp.cpp:101:42:101:43 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:101:44:101:44 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:102:25:102:25 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:102:25:102:28 | a\\nc | RegExpSequence | -| regexp.cpp:102:26:102:27 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:102:28:102:28 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:103:29:103:29 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:103:29:103:32 | a\\nc | RegExpSequence | -| regexp.cpp:103:30:103:31 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:103:32:103:32 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:78:27:78:32 | [[.a.] | RegExpCharacterClass | +| regexp.cpp:78:27:78:33 | [[.a.]] | RegExpSequence | +| regexp.cpp:78:28:78:28 | [ | RegExpConstant,RegExpNormalChar | +| regexp.cpp:78:29:78:29 | . | RegExpConstant,RegExpNormalChar | +| regexp.cpp:78:30:78:30 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:78:31:78:31 | . | RegExpConstant,RegExpNormalChar | +| regexp.cpp:78:33:78:33 | ] | RegExpConstant,RegExpNormalChar | +| regexp.cpp:79:27:79:35 | [A-F[.b.] | RegExpCharacterClass | +| regexp.cpp:79:27:79:39 | [A-F[.b.]a-f] | RegExpSequence | +| regexp.cpp:79:28:79:28 | A | RegExpConstant,RegExpNormalChar | +| regexp.cpp:79:28:79:30 | A-F | RegExpCharacterRange | +| regexp.cpp:79:30:79:30 | F | RegExpConstant,RegExpNormalChar | +| regexp.cpp:79:31:79:31 | [ | RegExpConstant,RegExpNormalChar | +| regexp.cpp:79:32:79:32 | . | RegExpConstant,RegExpNormalChar | +| regexp.cpp:79:33:79:33 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:79:34:79:34 | . | RegExpConstant,RegExpNormalChar | +| regexp.cpp:79:36:79:39 | a-f] | RegExpConstant,RegExpNormalChar | +| regexp.cpp:82:22:82:30 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:85:19:85:24 | \\u{987 | RegExpConstant,RegExpEscape | +| regexp.cpp:88:21:88:23 | \\cA | RegExpConstant,RegExpEscape | +| regexp.cpp:89:21:89:25 | [\\cZ] | RegExpCharacterClass | +| regexp.cpp:89:22:89:24 | \\cZ | RegExpConstant,RegExpEscape | +| regexp.cpp:92:20:92:21 | \\0 | RegExpConstant,RegExpEscape | +| regexp.cpp:93:20:93:23 | [\\0] | RegExpCharacterClass | +| regexp.cpp:93:21:93:22 | \\0 | RegExpConstant,RegExpEscape | +| regexp.cpp:96:25:96:25 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:96:25:96:28 | a\\nb | RegExpSequence | +| regexp.cpp:96:26:96:27 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:96:28:96:28 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:97:37:97:37 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:97:37:97:40 | a\\nc | RegExpSequence | +| regexp.cpp:97:38:97:39 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:97:40:97:40 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:98:39:98:39 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:98:39:98:42 | a\\nc | RegExpSequence | +| regexp.cpp:98:40:98:41 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:98:42:98:42 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:99:38:99:38 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:99:38:99:41 | a\\nc | RegExpSequence | +| regexp.cpp:99:39:99:40 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:99:41:99:41 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:100:38:100:38 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:100:38:100:41 | a\\nc | RegExpSequence | +| regexp.cpp:100:39:100:40 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:100:41:100:41 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:101:23:101:23 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:101:23:101:26 | a\\nc | RegExpSequence | +| regexp.cpp:101:24:101:25 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:101:26:101:26 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:102:40:102:40 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:102:40:102:43 | a\\nc | RegExpSequence | +| regexp.cpp:102:41:102:42 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:102:43:102:43 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:103:42:103:42 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:103:42:103:45 | a\\nc | RegExpSequence | +| regexp.cpp:103:43:103:44 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:103:45:103:45 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:104:41:104:41 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:104:41:104:44 | a\\nc | RegExpSequence | +| regexp.cpp:104:42:104:43 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:104:44:104:44 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:105:41:105:41 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:105:41:105:44 | a\\nc | RegExpSequence | +| regexp.cpp:105:42:105:43 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:105:44:105:44 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:106:25:106:25 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:106:25:106:28 | a\\nc | RegExpSequence | +| regexp.cpp:106:26:106:27 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:106:28:106:28 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:107:29:107:29 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:107:29:107:32 | a\\nc | RegExpSequence | +| regexp.cpp:107:30:107:31 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:107:32:107:32 | c | RegExpConstant,RegExpNormalChar | regExpNormalCharValue | regexp.cpp:18:19:18:21 | abc | abc | | regexp.cpp:21:20:21:20 | a | a | @@ -271,44 +288,56 @@ regExpNormalCharValue | regexp.cpp:75:25:75:25 | F | F | | regexp.cpp:75:35:75:35 | a | a | | regexp.cpp:75:37:75:37 | f | f | -| regexp.cpp:81:19:81:24 | \\u{987 | \u0987 | -| regexp.cpp:84:21:84:23 | \\cA | cA | -| regexp.cpp:85:22:85:24 | \\cZ | cZ | -| regexp.cpp:88:20:88:21 | \\0 | 0 | -| regexp.cpp:89:21:89:22 | \\0 | 0 | -| regexp.cpp:92:25:92:25 | a | a | -| regexp.cpp:92:26:92:27 | \\n | \n | -| regexp.cpp:92:28:92:28 | b | b | -| regexp.cpp:93:37:93:37 | a | a | -| regexp.cpp:93:38:93:39 | \\n | \n | -| regexp.cpp:93:40:93:40 | c | c | -| regexp.cpp:94:39:94:39 | a | a | -| regexp.cpp:94:40:94:41 | \\n | \n | -| regexp.cpp:94:42:94:42 | c | c | -| regexp.cpp:95:38:95:38 | a | a | -| regexp.cpp:95:39:95:40 | \\n | \n | -| regexp.cpp:95:41:95:41 | c | c | -| regexp.cpp:96:38:96:38 | a | a | -| regexp.cpp:96:39:96:40 | \\n | \n | -| regexp.cpp:96:41:96:41 | c | c | -| regexp.cpp:97:23:97:23 | a | a | -| regexp.cpp:97:24:97:25 | \\n | \n | -| regexp.cpp:97:26:97:26 | c | c | -| regexp.cpp:98:40:98:40 | a | a | -| regexp.cpp:98:41:98:42 | \\n | \n | -| regexp.cpp:98:43:98:43 | c | c | -| regexp.cpp:99:42:99:42 | a | a | -| regexp.cpp:99:43:99:44 | \\n | \n | -| regexp.cpp:99:45:99:45 | c | c | -| regexp.cpp:100:41:100:41 | a | a | -| regexp.cpp:100:42:100:43 | \\n | \n | -| regexp.cpp:100:44:100:44 | c | c | -| regexp.cpp:101:41:101:41 | a | a | -| regexp.cpp:101:42:101:43 | \\n | \n | -| regexp.cpp:101:44:101:44 | c | c | -| regexp.cpp:102:25:102:25 | a | a | -| regexp.cpp:102:26:102:27 | \\n | \n | -| regexp.cpp:102:28:102:28 | c | c | -| regexp.cpp:103:29:103:29 | a | a | -| regexp.cpp:103:30:103:31 | \\n | \n | -| regexp.cpp:103:32:103:32 | c | c | +| regexp.cpp:78:28:78:28 | [ | [ | +| regexp.cpp:78:29:78:29 | . | . | +| regexp.cpp:78:30:78:30 | a | a | +| regexp.cpp:78:31:78:31 | . | . | +| regexp.cpp:78:33:78:33 | ] | ] | +| regexp.cpp:79:28:79:28 | A | A | +| regexp.cpp:79:30:79:30 | F | F | +| regexp.cpp:79:31:79:31 | [ | [ | +| regexp.cpp:79:32:79:32 | . | . | +| regexp.cpp:79:33:79:33 | b | b | +| regexp.cpp:79:34:79:34 | . | . | +| regexp.cpp:79:36:79:39 | a-f] | a-f] | +| regexp.cpp:85:19:85:24 | \\u{987 | \u0987 | +| regexp.cpp:88:21:88:23 | \\cA | cA | +| regexp.cpp:89:22:89:24 | \\cZ | cZ | +| regexp.cpp:92:20:92:21 | \\0 | 0 | +| regexp.cpp:93:21:93:22 | \\0 | 0 | +| regexp.cpp:96:25:96:25 | a | a | +| regexp.cpp:96:26:96:27 | \\n | \n | +| regexp.cpp:96:28:96:28 | b | b | +| regexp.cpp:97:37:97:37 | a | a | +| regexp.cpp:97:38:97:39 | \\n | \n | +| regexp.cpp:97:40:97:40 | c | c | +| regexp.cpp:98:39:98:39 | a | a | +| regexp.cpp:98:40:98:41 | \\n | \n | +| regexp.cpp:98:42:98:42 | c | c | +| regexp.cpp:99:38:99:38 | a | a | +| regexp.cpp:99:39:99:40 | \\n | \n | +| regexp.cpp:99:41:99:41 | c | c | +| regexp.cpp:100:38:100:38 | a | a | +| regexp.cpp:100:39:100:40 | \\n | \n | +| regexp.cpp:100:41:100:41 | c | c | +| regexp.cpp:101:23:101:23 | a | a | +| regexp.cpp:101:24:101:25 | \\n | \n | +| regexp.cpp:101:26:101:26 | c | c | +| regexp.cpp:102:40:102:40 | a | a | +| regexp.cpp:102:41:102:42 | \\n | \n | +| regexp.cpp:102:43:102:43 | c | c | +| regexp.cpp:103:42:103:42 | a | a | +| regexp.cpp:103:43:103:44 | \\n | \n | +| regexp.cpp:103:45:103:45 | c | c | +| regexp.cpp:104:41:104:41 | a | a | +| regexp.cpp:104:42:104:43 | \\n | \n | +| regexp.cpp:104:44:104:44 | c | c | +| regexp.cpp:105:41:105:41 | a | a | +| regexp.cpp:105:42:105:43 | \\n | \n | +| regexp.cpp:105:44:105:44 | c | c | +| regexp.cpp:106:25:106:25 | a | a | +| regexp.cpp:106:26:106:27 | \\n | \n | +| regexp.cpp:106:28:106:28 | c | c | +| regexp.cpp:107:29:107:29 | a | a | +| regexp.cpp:107:30:107:31 | \\n | \n | +| regexp.cpp:107:32:107:32 | c | c | From 32e3a11d23a243f6a7fd9fc242955f2be79678c4 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 7 Aug 2026 16:28:51 +0200 Subject: [PATCH 0177/2098] C++: Fix typo --- cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll index af76baaa0f68..cfcb9f0085e6 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll @@ -98,7 +98,7 @@ abstract class RegExp extends StringLiteral { pos = rank[index](int p | (this.nonEscapedCharAt(p) = "[" or this.nonEscapedCharAt(p) = "]") and - // Brackets that art part of POSIX expressions should not count as + // Brackets that are part of POSIX expressions should not count as // char-set delimiters. not exists(int x, int y | this.posixStyleNamedCharacterProperty(x, y, _) and pos >= x and pos < y From 57f5d03347a588a5f65aa8a37a0697d36ee9708b Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 7 Aug 2026 17:09:43 +0200 Subject: [PATCH 0178/2098] C++: Implement POSIX collating symbols --- .../semmle/code/cpp/regex/RegexTreeView.qll | 12 +++-- .../code/cpp/regex/internal/ParseRegExp.qll | 40 ++++++++--------- .../test/library-tests/regex/parse.expected | 45 +++++-------------- .../test/library-tests/regex/regexp.expected | 33 ++++---------- 4 files changed, 50 insertions(+), 80 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll index e9b27d27a79d..0e062f358af5 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll @@ -50,7 +50,7 @@ private newtype TRegExpParent = TRegExpBackRef(RegExp re, int start, int end) { re.backreference(start, end) } or /** A named character property */ TRegExpNamedCharacterProperty(RegExp re, int start, int end) { - re.namedCharacterProperty(start, end, _) + re.namedCharacterProperty(start, end, [":", "."], _) } /** An implementation that satisfies the RegexTreeView signature. */ @@ -1098,7 +1098,7 @@ private module Impl implements RegexTreeViewSig { /** * A named character property. For example, the POSIX bracket expression - * `[[:digit:]]`. + * `[:digit:]`. */ additional class RegExpNamedCharacterProperty extends RegExpTerm, TRegExpNamedCharacterProperty { RegExpNamedCharacterProperty() { this = TRegExpNamedCharacterProperty(re, start, end) } @@ -1108,10 +1108,16 @@ private module Impl implements RegexTreeViewSig { override string getAPrimaryQlClass() { result = "RegExpNamedCharacterProperty" } /** - * Gets the property name. For example, in `[[:digit:]]`, the result is + * Gets the property name. For example, in `[:digit:]`, the result is * `"digit"`. */ string getName() { result = re.getCharacterPropertyName(start, end) } + + /** + * Gets the property symbol. For example, in `[:digit:]`, the result is + * `":"`. + */ + string getSymbol() { result = re.getCharacterPropertySymbol(start, end) } } class Top = RegExpParent; diff --git a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll index cfcb9f0085e6..2184c5f1b45a 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll @@ -100,9 +100,7 @@ abstract class RegExp extends StringLiteral { (this.nonEscapedCharAt(p) = "[" or this.nonEscapedCharAt(p) = "]") and // Brackets that are part of POSIX expressions should not count as // char-set delimiters. - not exists(int x, int y | - this.posixStyleNamedCharacterProperty(x, y, _) and pos >= x and pos < y - ) + not exists(int x, int y | this.posixStyleProperty(x, y, _, _) and pos >= x and pos < y) ) and ( this.nonEscapedCharAt(pos) = "[" and result = true @@ -132,9 +130,7 @@ abstract class RegExp extends StringLiteral { min(int e | e > innerStart and this.nonEscapedCharAt(e) = "]" and - not exists(int x, int y | - this.posixStyleNamedCharacterProperty(x, y, _) and e >= x and e < y - ) + not exists(int x, int y | this.posixStyleProperty(x, y, _, _) and e >= x and e < y) | e ) @@ -160,7 +156,7 @@ abstract class RegExp extends StringLiteral { ( this.escapedCharacter(start, end) or - this.namedCharacterProperty(start, end, _) + this.namedCharacterProperty(start, end, _, _) or exists(this.nonEscapedCharAt(start)) and end = start + 1 ) @@ -169,7 +165,7 @@ abstract class RegExp extends StringLiteral { ( this.escapedCharacter(start, end) or - this.namedCharacterProperty(start, end, _) + this.namedCharacterProperty(start, end, _, _) or exists(this.nonEscapedCharAt(start)) and end = start + 1 and @@ -282,28 +278,34 @@ abstract class RegExp extends StringLiteral { ) } - /** Matches named character properties such as `[[:digit:]]`. */ - predicate namedCharacterProperty(int start, int end, string name) { - this.posixStyleNamedCharacterProperty(start, end, name) + /** Matches named character properties such as `[:digit:]`. */ + predicate namedCharacterProperty(int start, int end, string symbol, string name) { + this.posixStyleProperty(start, end, symbol, name) } /** Gets the name of the character property in start,end */ string getCharacterPropertyName(int start, int end) { - this.namedCharacterProperty(start, end, result) + this.namedCharacterProperty(start, end, _, result) + } + + /** Gets the symbol of the character property in start,end */ + string getCharacterPropertySymbol(int start, int end) { + this.namedCharacterProperty(start, end, result, _) } /** Matches a POSIX bracket expression such as `[:alnum:]` within a character class. */ - private predicate posixStyleNamedCharacterProperty(int start, int end, string name) { + private predicate posixStyleProperty(int start, int end, string symbol, string name) { this.getChar(start) = "[" and - this.getChar(start + 1) = ":" and + this.getChar(start + 1) = symbol and end = min(int e | e > start and - this.getChar(e - 2) = ":" and + this.getChar(e - 2) = symbol and this.getChar(e - 1) = "]" | e ) and + symbol in [":", ".", "="] and name = this.getText().substring(start + 2, end - 2) } @@ -348,9 +350,7 @@ abstract class RegExp extends StringLiteral { * Holds if the character at `index` is inside a posix bracket. */ predicate inPosixBracket(int index) { - exists(int x, int y | - this.posixStyleNamedCharacterProperty(x, y, _) and index in [x + 1 .. y - 2] - ) + exists(int x, int y | this.posixStyleProperty(x, y, _, _) and index in [x + 1 .. y - 2]) } /** @@ -361,7 +361,7 @@ abstract class RegExp extends StringLiteral { not this.charSet(start, _) and not this.charSet(_, start + 1) and not exists(int x, int y | - this.posixStyleNamedCharacterProperty(x, y, _) and + this.posixStyleProperty(x, y, _, _) and start >= x and end <= y ) and @@ -731,7 +731,7 @@ abstract class RegExp extends StringLiteral { this.isGroupStart(start) or this.charSet(start, _) or this.backreference(start, _) or - this.namedCharacterProperty(start, _, _) + this.namedCharacterProperty(start, _, _, _) } private predicate itemEnd(int end) { diff --git a/cpp/ql/test/library-tests/regex/parse.expected b/cpp/ql/test/library-tests/regex/parse.expected index ac066391db12..059d2c0b53c7 100644 --- a/cpp/ql/test/library-tests/regex/parse.expected +++ b/cpp/ql/test/library-tests/regex/parse.expected @@ -397,36 +397,15 @@ regexp.cpp: # 75| [RegExpConstant, RegExpNormalChar] f -# 78| [RegExpCharacterClass] [[.a.] -#-----| 0 -> [RegExpConstant, RegExpNormalChar] [ -#-----| 1 -> [RegExpConstant, RegExpNormalChar] . -#-----| 2 -> [RegExpConstant, RegExpNormalChar] a -#-----| 3 -> [RegExpConstant, RegExpNormalChar] . - -# 78| [RegExpSequence] [[.a.]] -#-----| 0 -> [RegExpCharacterClass] [[.a.] -#-----| 1 -> [RegExpConstant, RegExpNormalChar] ] - -# 78| [RegExpConstant, RegExpNormalChar] [ - -# 78| [RegExpConstant, RegExpNormalChar] . - -# 78| [RegExpConstant, RegExpNormalChar] a - -# 78| [RegExpConstant, RegExpNormalChar] . +# 78| [RegExpCharacterClass] [[.a.]] +#-----| 0 -> [RegExpNamedCharacterProperty] [.a.] -# 78| [RegExpConstant, RegExpNormalChar] ] +# 78| [RegExpNamedCharacterProperty] [.a.] -# 79| [RegExpCharacterClass] [A-F[.b.] +# 79| [RegExpCharacterClass] [A-F[.b.]a-f] #-----| 0 -> [RegExpCharacterRange] A-F -#-----| 1 -> [RegExpConstant, RegExpNormalChar] [ -#-----| 2 -> [RegExpConstant, RegExpNormalChar] . -#-----| 3 -> [RegExpConstant, RegExpNormalChar] b -#-----| 4 -> [RegExpConstant, RegExpNormalChar] . - -# 79| [RegExpSequence] [A-F[.b.]a-f] -#-----| 0 -> [RegExpCharacterClass] [A-F[.b.] -#-----| 1 -> [RegExpConstant, RegExpNormalChar] a-f] +#-----| 1 -> [RegExpNamedCharacterProperty] [.b.] +#-----| 2 -> [RegExpCharacterRange] a-f # 79| [RegExpConstant, RegExpNormalChar] A @@ -436,15 +415,15 @@ regexp.cpp: # 79| [RegExpConstant, RegExpNormalChar] F -# 79| [RegExpConstant, RegExpNormalChar] [ - -# 79| [RegExpConstant, RegExpNormalChar] . +# 79| [RegExpNamedCharacterProperty] [.b.] -# 79| [RegExpConstant, RegExpNormalChar] b +# 79| [RegExpConstant, RegExpNormalChar] a -# 79| [RegExpConstant, RegExpNormalChar] . +# 79| [RegExpCharacterRange] a-f +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpNormalChar] f -# 79| [RegExpConstant, RegExpNormalChar] a-f] +# 79| [RegExpConstant, RegExpNormalChar] f # 82| [RegExpNamedCharacterProperty] [:digit:] diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index 325ff3cebaaa..e6fb53d9d0ee 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -148,23 +148,16 @@ term | regexp.cpp:75:35:75:35 | a | RegExpConstant,RegExpNormalChar | | regexp.cpp:75:35:75:37 | a-f | RegExpCharacterRange | | regexp.cpp:75:37:75:37 | f | RegExpConstant,RegExpNormalChar | -| regexp.cpp:78:27:78:32 | [[.a.] | RegExpCharacterClass | -| regexp.cpp:78:27:78:33 | [[.a.]] | RegExpSequence | -| regexp.cpp:78:28:78:28 | [ | RegExpConstant,RegExpNormalChar | -| regexp.cpp:78:29:78:29 | . | RegExpConstant,RegExpNormalChar | -| regexp.cpp:78:30:78:30 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:78:31:78:31 | . | RegExpConstant,RegExpNormalChar | -| regexp.cpp:78:33:78:33 | ] | RegExpConstant,RegExpNormalChar | -| regexp.cpp:79:27:79:35 | [A-F[.b.] | RegExpCharacterClass | -| regexp.cpp:79:27:79:39 | [A-F[.b.]a-f] | RegExpSequence | +| regexp.cpp:78:27:78:33 | [[.a.]] | RegExpCharacterClass | +| regexp.cpp:78:28:78:32 | [.a.] | RegExpNamedCharacterProperty | +| regexp.cpp:79:27:79:39 | [A-F[.b.]a-f] | RegExpCharacterClass | | regexp.cpp:79:28:79:28 | A | RegExpConstant,RegExpNormalChar | | regexp.cpp:79:28:79:30 | A-F | RegExpCharacterRange | | regexp.cpp:79:30:79:30 | F | RegExpConstant,RegExpNormalChar | -| regexp.cpp:79:31:79:31 | [ | RegExpConstant,RegExpNormalChar | -| regexp.cpp:79:32:79:32 | . | RegExpConstant,RegExpNormalChar | -| regexp.cpp:79:33:79:33 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:79:34:79:34 | . | RegExpConstant,RegExpNormalChar | -| regexp.cpp:79:36:79:39 | a-f] | RegExpConstant,RegExpNormalChar | +| regexp.cpp:79:31:79:35 | [.b.] | RegExpNamedCharacterProperty | +| regexp.cpp:79:36:79:36 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:79:36:79:38 | a-f | RegExpCharacterRange | +| regexp.cpp:79:38:79:38 | f | RegExpConstant,RegExpNormalChar | | regexp.cpp:82:22:82:30 | [:digit:] | RegExpNamedCharacterProperty | | regexp.cpp:85:19:85:24 | \\u{987 | RegExpConstant,RegExpEscape | | regexp.cpp:88:21:88:23 | \\cA | RegExpConstant,RegExpEscape | @@ -288,18 +281,10 @@ regExpNormalCharValue | regexp.cpp:75:25:75:25 | F | F | | regexp.cpp:75:35:75:35 | a | a | | regexp.cpp:75:37:75:37 | f | f | -| regexp.cpp:78:28:78:28 | [ | [ | -| regexp.cpp:78:29:78:29 | . | . | -| regexp.cpp:78:30:78:30 | a | a | -| regexp.cpp:78:31:78:31 | . | . | -| regexp.cpp:78:33:78:33 | ] | ] | | regexp.cpp:79:28:79:28 | A | A | | regexp.cpp:79:30:79:30 | F | F | -| regexp.cpp:79:31:79:31 | [ | [ | -| regexp.cpp:79:32:79:32 | . | . | -| regexp.cpp:79:33:79:33 | b | b | -| regexp.cpp:79:34:79:34 | . | . | -| regexp.cpp:79:36:79:39 | a-f] | a-f] | +| regexp.cpp:79:36:79:36 | a | a | +| regexp.cpp:79:38:79:38 | f | f | | regexp.cpp:85:19:85:24 | \\u{987 | \u0987 | | regexp.cpp:88:21:88:23 | \\cA | cA | | regexp.cpp:89:22:89:24 | \\cZ | cZ | From 96c9214dbbe8558ff082426f5a1fe705ff633422 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 23 Jul 2026 10:22:51 +0000 Subject: [PATCH 0179/2098] C++: Add POSIX equivalence-class tests (pre-fix) --- .../library-tests/regex/locations.expected | 36 +-- .../test/library-tests/regex/parse.expected | 117 ++++++---- cpp/ql/test/library-tests/regex/regexp.cpp | 4 + .../test/library-tests/regex/regexp.expected | 206 +++++++++--------- 4 files changed, 201 insertions(+), 162 deletions(-) diff --git a/cpp/ql/test/library-tests/regex/locations.expected b/cpp/ql/test/library-tests/regex/locations.expected index d19f83db4503..cc8164c700c7 100644 --- a/cpp/ql/test/library-tests/regex/locations.expected +++ b/cpp/ql/test/library-tests/regex/locations.expected @@ -34,20 +34,22 @@ | regexp.cpp:75:22:75:38 | [A-F[:digit:]a-f] | regexp.cpp | 75 | 22 | 75 | 38 | | regexp.cpp:78:27:78:33 | [[.a.]] | regexp.cpp | 78 | 27 | 78 | 33 | | regexp.cpp:79:27:79:39 | [A-F[.b.]a-f] | regexp.cpp | 79 | 27 | 79 | 39 | -| regexp.cpp:82:22:82:30 | [:digit:] | regexp.cpp | 82 | 22 | 82 | 30 | -| regexp.cpp:88:21:88:23 | \\cA | regexp.cpp | 88 | 21 | 88 | 23 | -| regexp.cpp:89:21:89:25 | [\\cZ] | regexp.cpp | 89 | 21 | 89 | 25 | -| regexp.cpp:92:20:92:21 | \\0 | regexp.cpp | 92 | 20 | 92 | 21 | -| regexp.cpp:93:20:93:23 | [\\0] | regexp.cpp | 93 | 20 | 93 | 23 | -| regexp.cpp:96:25:96:28 | a\\nb | regexp.cpp | 96 | 25 | 96 | 28 | -| regexp.cpp:97:37:97:40 | a\\nc | regexp.cpp | 97 | 37 | 97 | 40 | -| regexp.cpp:98:39:98:42 | a\\nc | regexp.cpp | 98 | 39 | 98 | 42 | -| regexp.cpp:99:38:99:41 | a\\nc | regexp.cpp | 99 | 38 | 99 | 41 | -| regexp.cpp:100:38:100:41 | a\\nc | regexp.cpp | 100 | 38 | 100 | 41 | -| regexp.cpp:101:23:101:26 | a\\nc | regexp.cpp | 101 | 23 | 101 | 26 | -| regexp.cpp:102:40:102:43 | a\\nc | regexp.cpp | 102 | 40 | 102 | 43 | -| regexp.cpp:103:42:103:45 | a\\nc | regexp.cpp | 103 | 42 | 103 | 45 | -| regexp.cpp:104:41:104:44 | a\\nc | regexp.cpp | 104 | 41 | 104 | 44 | -| regexp.cpp:105:41:105:44 | a\\nc | regexp.cpp | 105 | 41 | 105 | 44 | -| regexp.cpp:106:25:106:28 | a\\nc | regexp.cpp | 106 | 25 | 106 | 28 | -| regexp.cpp:107:29:107:32 | a\\nc | regexp.cpp | 107 | 29 | 107 | 32 | +| regexp.cpp:82:28:82:34 | [[=a=]] | regexp.cpp | 82 | 28 | 82 | 34 | +| regexp.cpp:83:28:83:40 | [A-F[=b=]a-f] | regexp.cpp | 83 | 28 | 83 | 40 | +| regexp.cpp:86:22:86:30 | [:digit:] | regexp.cpp | 86 | 22 | 86 | 30 | +| regexp.cpp:92:21:92:23 | \\cA | regexp.cpp | 92 | 21 | 92 | 23 | +| regexp.cpp:93:21:93:25 | [\\cZ] | regexp.cpp | 93 | 21 | 93 | 25 | +| regexp.cpp:96:20:96:21 | \\0 | regexp.cpp | 96 | 20 | 96 | 21 | +| regexp.cpp:97:20:97:23 | [\\0] | regexp.cpp | 97 | 20 | 97 | 23 | +| regexp.cpp:100:25:100:28 | a\\nb | regexp.cpp | 100 | 25 | 100 | 28 | +| regexp.cpp:101:37:101:40 | a\\nc | regexp.cpp | 101 | 37 | 101 | 40 | +| regexp.cpp:102:39:102:42 | a\\nc | regexp.cpp | 102 | 39 | 102 | 42 | +| regexp.cpp:103:38:103:41 | a\\nc | regexp.cpp | 103 | 38 | 103 | 41 | +| regexp.cpp:104:38:104:41 | a\\nc | regexp.cpp | 104 | 38 | 104 | 41 | +| regexp.cpp:105:23:105:26 | a\\nc | regexp.cpp | 105 | 23 | 105 | 26 | +| regexp.cpp:106:40:106:43 | a\\nc | regexp.cpp | 106 | 40 | 106 | 43 | +| regexp.cpp:107:42:107:45 | a\\nc | regexp.cpp | 107 | 42 | 107 | 45 | +| regexp.cpp:108:41:108:44 | a\\nc | regexp.cpp | 108 | 41 | 108 | 44 | +| regexp.cpp:109:41:109:44 | a\\nc | regexp.cpp | 109 | 41 | 109 | 44 | +| regexp.cpp:110:25:110:28 | a\\nc | regexp.cpp | 110 | 25 | 110 | 28 | +| regexp.cpp:111:29:111:32 | a\\nc | regexp.cpp | 111 | 29 | 111 | 32 | diff --git a/cpp/ql/test/library-tests/regex/parse.expected b/cpp/ql/test/library-tests/regex/parse.expected index 059d2c0b53c7..f34b91fd15f2 100644 --- a/cpp/ql/test/library-tests/regex/parse.expected +++ b/cpp/ql/test/library-tests/regex/parse.expected @@ -425,78 +425,55 @@ regexp.cpp: # 79| [RegExpConstant, RegExpNormalChar] f -# 82| [RegExpNamedCharacterProperty] [:digit:] +# 82| [RegExpCharacterClass] [[=a=]] -# 85| [RegExpConstant, RegExpEscape] \u{987 - -# 88| [RegExpConstant, RegExpEscape] \cA - -# 89| [RegExpCharacterClass] [\cZ] -#-----| 0 -> [RegExpConstant, RegExpEscape] \cZ - -# 89| [RegExpConstant, RegExpEscape] \cZ - -# 92| [RegExpConstant, RegExpEscape] \0 - -# 93| [RegExpCharacterClass] [\0] -#-----| 0 -> [RegExpConstant, RegExpEscape] \0 - -# 93| [RegExpConstant, RegExpEscape] \0 +# 83| [RegExpCharacterClass] [A-F[=b=]a-f] +#-----| 0 -> [RegExpCharacterRange] A-F -# 96| [RegExpConstant, RegExpNormalChar] a +# 83| [RegExpConstant, RegExpNormalChar] A -# 96| [RegExpSequence] a\nb -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] b - -# 96| [RegExpConstant, RegExpEscape] \n +# 83| [RegExpCharacterRange] A-F +#-----| 0 -> [RegExpConstant, RegExpNormalChar] A +#-----| 1 -> [RegExpConstant, RegExpNormalChar] F -# 96| [RegExpConstant, RegExpNormalChar] b +# 83| [RegExpConstant, RegExpNormalChar] F -# 97| [RegExpConstant, RegExpNormalChar] a +# 83| [RegExpConstant, RegExpNormalChar] a -# 97| [RegExpSequence] a\nc +# 83| [RegExpCharacterRange] a-f #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c - -# 97| [RegExpConstant, RegExpEscape] \n +#-----| 1 -> [RegExpConstant, RegExpNormalChar] f -# 97| [RegExpConstant, RegExpNormalChar] c +# 83| [RegExpConstant, RegExpNormalChar] f -# 98| [RegExpConstant, RegExpNormalChar] a +# 86| [RegExpNamedCharacterProperty] [:digit:] -# 98| [RegExpSequence] a\nc -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c +# 89| [RegExpConstant, RegExpEscape] \u{987 -# 98| [RegExpConstant, RegExpEscape] \n +# 92| [RegExpConstant, RegExpEscape] \cA -# 98| [RegExpConstant, RegExpNormalChar] c +# 93| [RegExpCharacterClass] [\cZ] +#-----| 0 -> [RegExpConstant, RegExpEscape] \cZ -# 99| [RegExpConstant, RegExpNormalChar] a +# 93| [RegExpConstant, RegExpEscape] \cZ -# 99| [RegExpSequence] a\nc -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c +# 96| [RegExpConstant, RegExpEscape] \0 -# 99| [RegExpConstant, RegExpEscape] \n +# 97| [RegExpCharacterClass] [\0] +#-----| 0 -> [RegExpConstant, RegExpEscape] \0 -# 99| [RegExpConstant, RegExpNormalChar] c +# 97| [RegExpConstant, RegExpEscape] \0 # 100| [RegExpConstant, RegExpNormalChar] a -# 100| [RegExpSequence] a\nc +# 100| [RegExpSequence] a\nb #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c +#-----| 2 -> [RegExpConstant, RegExpNormalChar] b # 100| [RegExpConstant, RegExpEscape] \n -# 100| [RegExpConstant, RegExpNormalChar] c +# 100| [RegExpConstant, RegExpNormalChar] b # 101| [RegExpConstant, RegExpNormalChar] a @@ -574,3 +551,47 @@ regexp.cpp: # 107| [RegExpConstant, RegExpEscape] \n # 107| [RegExpConstant, RegExpNormalChar] c + +# 108| [RegExpConstant, RegExpNormalChar] a + +# 108| [RegExpSequence] a\nc +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpEscape] \n +#-----| 2 -> [RegExpConstant, RegExpNormalChar] c + +# 108| [RegExpConstant, RegExpEscape] \n + +# 108| [RegExpConstant, RegExpNormalChar] c + +# 109| [RegExpConstant, RegExpNormalChar] a + +# 109| [RegExpSequence] a\nc +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpEscape] \n +#-----| 2 -> [RegExpConstant, RegExpNormalChar] c + +# 109| [RegExpConstant, RegExpEscape] \n + +# 109| [RegExpConstant, RegExpNormalChar] c + +# 110| [RegExpConstant, RegExpNormalChar] a + +# 110| [RegExpSequence] a\nc +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpEscape] \n +#-----| 2 -> [RegExpConstant, RegExpNormalChar] c + +# 110| [RegExpConstant, RegExpEscape] \n + +# 110| [RegExpConstant, RegExpNormalChar] c + +# 111| [RegExpConstant, RegExpNormalChar] a + +# 111| [RegExpSequence] a\nc +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpEscape] \n +#-----| 2 -> [RegExpConstant, RegExpNormalChar] c + +# 111| [RegExpConstant, RegExpEscape] \n + +# 111| [RegExpConstant, RegExpNormalChar] c diff --git a/cpp/ql/test/library-tests/regex/regexp.cpp b/cpp/ql/test/library-tests/regex/regexp.cpp index 496cf60e4e0d..43115442c1d4 100644 --- a/cpp/ql/test/library-tests/regex/regexp.cpp +++ b/cpp/ql/test/library-tests/regex/regexp.cpp @@ -78,6 +78,10 @@ std::regex r_posix3("[A-F[:digit:]a-f]"); std::regex r_posix_coll1("[[.a.]]"); std::regex r_posix_coll2("[A-F[.b.]a-f]"); +// POSIX equivalence classes +std::regex r_posix_equiv1("[[=a=]]"); +std::regex r_posix_equiv2("[A-F[=b=]a-f]"); + // *Not* a POSIX bracket expression; just a regular character class. std::regex r_posix4("[:digit:]"); diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index e6fb53d9d0ee..bec5af96a6cd 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -158,62 +158,70 @@ term | regexp.cpp:79:36:79:36 | a | RegExpConstant,RegExpNormalChar | | regexp.cpp:79:36:79:38 | a-f | RegExpCharacterRange | | regexp.cpp:79:38:79:38 | f | RegExpConstant,RegExpNormalChar | -| regexp.cpp:82:22:82:30 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.cpp:85:19:85:24 | \\u{987 | RegExpConstant,RegExpEscape | -| regexp.cpp:88:21:88:23 | \\cA | RegExpConstant,RegExpEscape | -| regexp.cpp:89:21:89:25 | [\\cZ] | RegExpCharacterClass | -| regexp.cpp:89:22:89:24 | \\cZ | RegExpConstant,RegExpEscape | -| regexp.cpp:92:20:92:21 | \\0 | RegExpConstant,RegExpEscape | -| regexp.cpp:93:20:93:23 | [\\0] | RegExpCharacterClass | -| regexp.cpp:93:21:93:22 | \\0 | RegExpConstant,RegExpEscape | -| regexp.cpp:96:25:96:25 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:96:25:96:28 | a\\nb | RegExpSequence | -| regexp.cpp:96:26:96:27 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:96:28:96:28 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:97:37:97:37 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:97:37:97:40 | a\\nc | RegExpSequence | -| regexp.cpp:97:38:97:39 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:97:40:97:40 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:98:39:98:39 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:98:39:98:42 | a\\nc | RegExpSequence | -| regexp.cpp:98:40:98:41 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:98:42:98:42 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:99:38:99:38 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:99:38:99:41 | a\\nc | RegExpSequence | -| regexp.cpp:99:39:99:40 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:99:41:99:41 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:100:38:100:38 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:100:38:100:41 | a\\nc | RegExpSequence | -| regexp.cpp:100:39:100:40 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:100:41:100:41 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:101:23:101:23 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:101:23:101:26 | a\\nc | RegExpSequence | -| regexp.cpp:101:24:101:25 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:101:26:101:26 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:102:40:102:40 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:102:40:102:43 | a\\nc | RegExpSequence | -| regexp.cpp:102:41:102:42 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:102:43:102:43 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:103:42:103:42 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:103:42:103:45 | a\\nc | RegExpSequence | -| regexp.cpp:103:43:103:44 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:103:45:103:45 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:104:41:104:41 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:104:41:104:44 | a\\nc | RegExpSequence | -| regexp.cpp:104:42:104:43 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:104:44:104:44 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:105:41:105:41 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:105:41:105:44 | a\\nc | RegExpSequence | -| regexp.cpp:105:42:105:43 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:105:44:105:44 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:106:25:106:25 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:106:25:106:28 | a\\nc | RegExpSequence | -| regexp.cpp:106:26:106:27 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:106:28:106:28 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:107:29:107:29 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:107:29:107:32 | a\\nc | RegExpSequence | -| regexp.cpp:107:30:107:31 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:107:32:107:32 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:82:28:82:34 | [[=a=]] | RegExpCharacterClass | +| regexp.cpp:83:28:83:40 | [A-F[=b=]a-f] | RegExpCharacterClass | +| regexp.cpp:83:29:83:29 | A | RegExpConstant,RegExpNormalChar | +| regexp.cpp:83:29:83:31 | A-F | RegExpCharacterRange | +| regexp.cpp:83:31:83:31 | F | RegExpConstant,RegExpNormalChar | +| regexp.cpp:83:37:83:37 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:83:37:83:39 | a-f | RegExpCharacterRange | +| regexp.cpp:83:39:83:39 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:86:22:86:30 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:89:19:89:24 | \\u{987 | RegExpConstant,RegExpEscape | +| regexp.cpp:92:21:92:23 | \\cA | RegExpConstant,RegExpEscape | +| regexp.cpp:93:21:93:25 | [\\cZ] | RegExpCharacterClass | +| regexp.cpp:93:22:93:24 | \\cZ | RegExpConstant,RegExpEscape | +| regexp.cpp:96:20:96:21 | \\0 | RegExpConstant,RegExpEscape | +| regexp.cpp:97:20:97:23 | [\\0] | RegExpCharacterClass | +| regexp.cpp:97:21:97:22 | \\0 | RegExpConstant,RegExpEscape | +| regexp.cpp:100:25:100:25 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:100:25:100:28 | a\\nb | RegExpSequence | +| regexp.cpp:100:26:100:27 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:100:28:100:28 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:101:37:101:37 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:101:37:101:40 | a\\nc | RegExpSequence | +| regexp.cpp:101:38:101:39 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:101:40:101:40 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:102:39:102:39 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:102:39:102:42 | a\\nc | RegExpSequence | +| regexp.cpp:102:40:102:41 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:102:42:102:42 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:103:38:103:38 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:103:38:103:41 | a\\nc | RegExpSequence | +| regexp.cpp:103:39:103:40 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:103:41:103:41 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:104:38:104:38 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:104:38:104:41 | a\\nc | RegExpSequence | +| regexp.cpp:104:39:104:40 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:104:41:104:41 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:105:23:105:23 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:105:23:105:26 | a\\nc | RegExpSequence | +| regexp.cpp:105:24:105:25 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:105:26:105:26 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:106:40:106:40 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:106:40:106:43 | a\\nc | RegExpSequence | +| regexp.cpp:106:41:106:42 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:106:43:106:43 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:107:42:107:42 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:107:42:107:45 | a\\nc | RegExpSequence | +| regexp.cpp:107:43:107:44 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:107:45:107:45 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:108:41:108:41 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:108:41:108:44 | a\\nc | RegExpSequence | +| regexp.cpp:108:42:108:43 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:108:44:108:44 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:109:41:109:41 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:109:41:109:44 | a\\nc | RegExpSequence | +| regexp.cpp:109:42:109:43 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:109:44:109:44 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:110:25:110:25 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:110:25:110:28 | a\\nc | RegExpSequence | +| regexp.cpp:110:26:110:27 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:110:28:110:28 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:111:29:111:29 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:111:29:111:32 | a\\nc | RegExpSequence | +| regexp.cpp:111:30:111:31 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:111:32:111:32 | c | RegExpConstant,RegExpNormalChar | regExpNormalCharValue | regexp.cpp:18:19:18:21 | abc | abc | | regexp.cpp:21:20:21:20 | a | a | @@ -285,44 +293,48 @@ regExpNormalCharValue | regexp.cpp:79:30:79:30 | F | F | | regexp.cpp:79:36:79:36 | a | a | | regexp.cpp:79:38:79:38 | f | f | -| regexp.cpp:85:19:85:24 | \\u{987 | \u0987 | -| regexp.cpp:88:21:88:23 | \\cA | cA | -| regexp.cpp:89:22:89:24 | \\cZ | cZ | -| regexp.cpp:92:20:92:21 | \\0 | 0 | -| regexp.cpp:93:21:93:22 | \\0 | 0 | -| regexp.cpp:96:25:96:25 | a | a | -| regexp.cpp:96:26:96:27 | \\n | \n | -| regexp.cpp:96:28:96:28 | b | b | -| regexp.cpp:97:37:97:37 | a | a | -| regexp.cpp:97:38:97:39 | \\n | \n | -| regexp.cpp:97:40:97:40 | c | c | -| regexp.cpp:98:39:98:39 | a | a | -| regexp.cpp:98:40:98:41 | \\n | \n | -| regexp.cpp:98:42:98:42 | c | c | -| regexp.cpp:99:38:99:38 | a | a | -| regexp.cpp:99:39:99:40 | \\n | \n | -| regexp.cpp:99:41:99:41 | c | c | -| regexp.cpp:100:38:100:38 | a | a | -| regexp.cpp:100:39:100:40 | \\n | \n | -| regexp.cpp:100:41:100:41 | c | c | -| regexp.cpp:101:23:101:23 | a | a | -| regexp.cpp:101:24:101:25 | \\n | \n | -| regexp.cpp:101:26:101:26 | c | c | -| regexp.cpp:102:40:102:40 | a | a | -| regexp.cpp:102:41:102:42 | \\n | \n | -| regexp.cpp:102:43:102:43 | c | c | -| regexp.cpp:103:42:103:42 | a | a | -| regexp.cpp:103:43:103:44 | \\n | \n | -| regexp.cpp:103:45:103:45 | c | c | -| regexp.cpp:104:41:104:41 | a | a | -| regexp.cpp:104:42:104:43 | \\n | \n | -| regexp.cpp:104:44:104:44 | c | c | -| regexp.cpp:105:41:105:41 | a | a | -| regexp.cpp:105:42:105:43 | \\n | \n | -| regexp.cpp:105:44:105:44 | c | c | -| regexp.cpp:106:25:106:25 | a | a | -| regexp.cpp:106:26:106:27 | \\n | \n | -| regexp.cpp:106:28:106:28 | c | c | -| regexp.cpp:107:29:107:29 | a | a | -| regexp.cpp:107:30:107:31 | \\n | \n | -| regexp.cpp:107:32:107:32 | c | c | +| regexp.cpp:83:29:83:29 | A | A | +| regexp.cpp:83:31:83:31 | F | F | +| regexp.cpp:83:37:83:37 | a | a | +| regexp.cpp:83:39:83:39 | f | f | +| regexp.cpp:89:19:89:24 | \\u{987 | \u0987 | +| regexp.cpp:92:21:92:23 | \\cA | cA | +| regexp.cpp:93:22:93:24 | \\cZ | cZ | +| regexp.cpp:96:20:96:21 | \\0 | 0 | +| regexp.cpp:97:21:97:22 | \\0 | 0 | +| regexp.cpp:100:25:100:25 | a | a | +| regexp.cpp:100:26:100:27 | \\n | \n | +| regexp.cpp:100:28:100:28 | b | b | +| regexp.cpp:101:37:101:37 | a | a | +| regexp.cpp:101:38:101:39 | \\n | \n | +| regexp.cpp:101:40:101:40 | c | c | +| regexp.cpp:102:39:102:39 | a | a | +| regexp.cpp:102:40:102:41 | \\n | \n | +| regexp.cpp:102:42:102:42 | c | c | +| regexp.cpp:103:38:103:38 | a | a | +| regexp.cpp:103:39:103:40 | \\n | \n | +| regexp.cpp:103:41:103:41 | c | c | +| regexp.cpp:104:38:104:38 | a | a | +| regexp.cpp:104:39:104:40 | \\n | \n | +| regexp.cpp:104:41:104:41 | c | c | +| regexp.cpp:105:23:105:23 | a | a | +| regexp.cpp:105:24:105:25 | \\n | \n | +| regexp.cpp:105:26:105:26 | c | c | +| regexp.cpp:106:40:106:40 | a | a | +| regexp.cpp:106:41:106:42 | \\n | \n | +| regexp.cpp:106:43:106:43 | c | c | +| regexp.cpp:107:42:107:42 | a | a | +| regexp.cpp:107:43:107:44 | \\n | \n | +| regexp.cpp:107:45:107:45 | c | c | +| regexp.cpp:108:41:108:41 | a | a | +| regexp.cpp:108:42:108:43 | \\n | \n | +| regexp.cpp:108:44:108:44 | c | c | +| regexp.cpp:109:41:109:41 | a | a | +| regexp.cpp:109:42:109:43 | \\n | \n | +| regexp.cpp:109:44:109:44 | c | c | +| regexp.cpp:110:25:110:25 | a | a | +| regexp.cpp:110:26:110:27 | \\n | \n | +| regexp.cpp:110:28:110:28 | c | c | +| regexp.cpp:111:29:111:29 | a | a | +| regexp.cpp:111:30:111:31 | \\n | \n | +| regexp.cpp:111:32:111:32 | c | c | From 5cce52ec8d9cd9bc6a004e947684e4ec9ebabbce Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 7 Aug 2026 17:12:41 +0200 Subject: [PATCH 0180/2098] C++: Implement POSIX equivalence classes --- cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll | 2 +- cpp/ql/test/library-tests/regex/parse.expected | 7 +++++++ cpp/ql/test/library-tests/regex/regexp.expected | 2 ++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll index 0e062f358af5..013348c55363 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll @@ -50,7 +50,7 @@ private newtype TRegExpParent = TRegExpBackRef(RegExp re, int start, int end) { re.backreference(start, end) } or /** A named character property */ TRegExpNamedCharacterProperty(RegExp re, int start, int end) { - re.namedCharacterProperty(start, end, [":", "."], _) + re.namedCharacterProperty(start, end, _, _) } /** An implementation that satisfies the RegexTreeView signature. */ diff --git a/cpp/ql/test/library-tests/regex/parse.expected b/cpp/ql/test/library-tests/regex/parse.expected index f34b91fd15f2..aa2d64c38c89 100644 --- a/cpp/ql/test/library-tests/regex/parse.expected +++ b/cpp/ql/test/library-tests/regex/parse.expected @@ -426,9 +426,14 @@ regexp.cpp: # 79| [RegExpConstant, RegExpNormalChar] f # 82| [RegExpCharacterClass] [[=a=]] +#-----| 0 -> [RegExpNamedCharacterProperty] [=a=] + +# 82| [RegExpNamedCharacterProperty] [=a=] # 83| [RegExpCharacterClass] [A-F[=b=]a-f] #-----| 0 -> [RegExpCharacterRange] A-F +#-----| 1 -> [RegExpNamedCharacterProperty] [=b=] +#-----| 2 -> [RegExpCharacterRange] a-f # 83| [RegExpConstant, RegExpNormalChar] A @@ -438,6 +443,8 @@ regexp.cpp: # 83| [RegExpConstant, RegExpNormalChar] F +# 83| [RegExpNamedCharacterProperty] [=b=] + # 83| [RegExpConstant, RegExpNormalChar] a # 83| [RegExpCharacterRange] a-f diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index bec5af96a6cd..44bfb4d6fefa 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -159,10 +159,12 @@ term | regexp.cpp:79:36:79:38 | a-f | RegExpCharacterRange | | regexp.cpp:79:38:79:38 | f | RegExpConstant,RegExpNormalChar | | regexp.cpp:82:28:82:34 | [[=a=]] | RegExpCharacterClass | +| regexp.cpp:82:29:82:33 | [=a=] | RegExpNamedCharacterProperty | | regexp.cpp:83:28:83:40 | [A-F[=b=]a-f] | RegExpCharacterClass | | regexp.cpp:83:29:83:29 | A | RegExpConstant,RegExpNormalChar | | regexp.cpp:83:29:83:31 | A-F | RegExpCharacterRange | | regexp.cpp:83:31:83:31 | F | RegExpConstant,RegExpNormalChar | +| regexp.cpp:83:32:83:36 | [=b=] | RegExpNamedCharacterProperty | | regexp.cpp:83:37:83:37 | a | RegExpConstant,RegExpNormalChar | | regexp.cpp:83:37:83:39 | a-f | RegExpCharacterRange | | regexp.cpp:83:39:83:39 | f | RegExpConstant,RegExpNormalChar | From b1e7fb78b40425d72a382b409b9e036556e676d8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 23 Jul 2026 10:24:37 +0000 Subject: [PATCH 0181/2098] C++: Replace non-standard \u{...} test with \uhhhh --- cpp/ql/test/library-tests/regex/locations.expected | 1 + cpp/ql/test/library-tests/regex/parse.expected | 2 +- cpp/ql/test/library-tests/regex/regexp.cpp | 2 +- cpp/ql/test/library-tests/regex/regexp.expected | 4 ++-- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/cpp/ql/test/library-tests/regex/locations.expected b/cpp/ql/test/library-tests/regex/locations.expected index cc8164c700c7..43da53ad3763 100644 --- a/cpp/ql/test/library-tests/regex/locations.expected +++ b/cpp/ql/test/library-tests/regex/locations.expected @@ -37,6 +37,7 @@ | regexp.cpp:82:28:82:34 | [[=a=]] | regexp.cpp | 82 | 28 | 82 | 34 | | regexp.cpp:83:28:83:40 | [A-F[=b=]a-f] | regexp.cpp | 83 | 28 | 83 | 40 | | regexp.cpp:86:22:86:30 | [:digit:] | regexp.cpp | 86 | 22 | 86 | 30 | +| regexp.cpp:89:19:89:24 | \\u0061 | regexp.cpp | 89 | 19 | 89 | 24 | | regexp.cpp:92:21:92:23 | \\cA | regexp.cpp | 92 | 21 | 92 | 23 | | regexp.cpp:93:21:93:25 | [\\cZ] | regexp.cpp | 93 | 21 | 93 | 25 | | regexp.cpp:96:20:96:21 | \\0 | regexp.cpp | 96 | 20 | 96 | 21 | diff --git a/cpp/ql/test/library-tests/regex/parse.expected b/cpp/ql/test/library-tests/regex/parse.expected index aa2d64c38c89..83eadac1b6d9 100644 --- a/cpp/ql/test/library-tests/regex/parse.expected +++ b/cpp/ql/test/library-tests/regex/parse.expected @@ -455,7 +455,7 @@ regexp.cpp: # 86| [RegExpNamedCharacterProperty] [:digit:] -# 89| [RegExpConstant, RegExpEscape] \u{987 +# 89| [RegExpConstant, RegExpEscape] \u0061 # 92| [RegExpConstant, RegExpEscape] \cA diff --git a/cpp/ql/test/library-tests/regex/regexp.cpp b/cpp/ql/test/library-tests/regex/regexp.cpp index 43115442c1d4..ea56d12bed35 100644 --- a/cpp/ql/test/library-tests/regex/regexp.cpp +++ b/cpp/ql/test/library-tests/regex/regexp.cpp @@ -86,7 +86,7 @@ std::regex r_posix_equiv2("[A-F[=b=]a-f]"); std::regex r_posix4("[:digit:]"); // unicode -std::regex r_uni("\\u{9879}"); +std::regex r_uni("\\u0061"); // control escapes std::regex r_ctrl1("\\cA"); diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index 44bfb4d6fefa..5f70909c5f34 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -169,7 +169,7 @@ term | regexp.cpp:83:37:83:39 | a-f | RegExpCharacterRange | | regexp.cpp:83:39:83:39 | f | RegExpConstant,RegExpNormalChar | | regexp.cpp:86:22:86:30 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.cpp:89:19:89:24 | \\u{987 | RegExpConstant,RegExpEscape | +| regexp.cpp:89:19:89:24 | \\u0061 | RegExpConstant,RegExpEscape | | regexp.cpp:92:21:92:23 | \\cA | RegExpConstant,RegExpEscape | | regexp.cpp:93:21:93:25 | [\\cZ] | RegExpCharacterClass | | regexp.cpp:93:22:93:24 | \\cZ | RegExpConstant,RegExpEscape | @@ -299,7 +299,7 @@ regExpNormalCharValue | regexp.cpp:83:31:83:31 | F | F | | regexp.cpp:83:37:83:37 | a | a | | regexp.cpp:83:39:83:39 | f | f | -| regexp.cpp:89:19:89:24 | \\u{987 | \u0987 | +| regexp.cpp:89:19:89:24 | \\u0061 | a | | regexp.cpp:92:21:92:23 | \\cA | cA | | regexp.cpp:93:22:93:24 | \\cZ | cZ | | regexp.cpp:96:20:96:21 | \\0 | 0 | From f7797ed89322db654889fbdd5e3997254e41e8bf Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 23 Jul 2026 10:25:11 +0000 Subject: [PATCH 0182/2098] C++: Add coverage for lazy quantifiers and \f/\v escapes --- .../library-tests/regex/locations.expected | 29 +-- .../test/library-tests/regex/parse.expected | 122 +++++++----- cpp/ql/test/library-tests/regex/regexp.cpp | 7 + .../test/library-tests/regex/regexp.expected | 185 ++++++++++-------- 4 files changed, 200 insertions(+), 143 deletions(-) diff --git a/cpp/ql/test/library-tests/regex/locations.expected b/cpp/ql/test/library-tests/regex/locations.expected index 43da53ad3763..2c85989fc5e9 100644 --- a/cpp/ql/test/library-tests/regex/locations.expected +++ b/cpp/ql/test/library-tests/regex/locations.expected @@ -42,15 +42,20 @@ | regexp.cpp:93:21:93:25 | [\\cZ] | regexp.cpp | 93 | 21 | 93 | 25 | | regexp.cpp:96:20:96:21 | \\0 | regexp.cpp | 96 | 20 | 96 | 21 | | regexp.cpp:97:20:97:23 | [\\0] | regexp.cpp | 97 | 20 | 97 | 23 | -| regexp.cpp:100:25:100:28 | a\\nb | regexp.cpp | 100 | 25 | 100 | 28 | -| regexp.cpp:101:37:101:40 | a\\nc | regexp.cpp | 101 | 37 | 101 | 40 | -| regexp.cpp:102:39:102:42 | a\\nc | regexp.cpp | 102 | 39 | 102 | 42 | -| regexp.cpp:103:38:103:41 | a\\nc | regexp.cpp | 103 | 38 | 103 | 41 | -| regexp.cpp:104:38:104:41 | a\\nc | regexp.cpp | 104 | 38 | 104 | 41 | -| regexp.cpp:105:23:105:26 | a\\nc | regexp.cpp | 105 | 23 | 105 | 26 | -| regexp.cpp:106:40:106:43 | a\\nc | regexp.cpp | 106 | 40 | 106 | 43 | -| regexp.cpp:107:42:107:45 | a\\nc | regexp.cpp | 107 | 42 | 107 | 45 | -| regexp.cpp:108:41:108:44 | a\\nc | regexp.cpp | 108 | 41 | 108 | 44 | -| regexp.cpp:109:41:109:44 | a\\nc | regexp.cpp | 109 | 41 | 109 | 44 | -| regexp.cpp:110:25:110:28 | a\\nc | regexp.cpp | 110 | 25 | 110 | 28 | -| regexp.cpp:111:29:111:32 | a\\nc | regexp.cpp | 111 | 29 | 111 | 32 | +| regexp.cpp:100:21:100:23 | a*? | regexp.cpp | 100 | 21 | 100 | 23 | +| regexp.cpp:101:21:101:23 | b+? | regexp.cpp | 101 | 21 | 101 | 23 | +| regexp.cpp:102:21:102:23 | c?? | regexp.cpp | 102 | 21 | 102 | 23 | +| regexp.cpp:103:21:103:27 | d{2,3}? | regexp.cpp | 103 | 21 | 103 | 27 | +| regexp.cpp:104:18:104:21 | \\f\\v | regexp.cpp | 104 | 18 | 104 | 21 | +| regexp.cpp:107:25:107:28 | a\\nb | regexp.cpp | 107 | 25 | 107 | 28 | +| regexp.cpp:108:37:108:40 | a\\nc | regexp.cpp | 108 | 37 | 108 | 40 | +| regexp.cpp:109:39:109:42 | a\\nc | regexp.cpp | 109 | 39 | 109 | 42 | +| regexp.cpp:110:38:110:41 | a\\nc | regexp.cpp | 110 | 38 | 110 | 41 | +| regexp.cpp:111:38:111:41 | a\\nc | regexp.cpp | 111 | 38 | 111 | 41 | +| regexp.cpp:112:23:112:26 | a\\nc | regexp.cpp | 112 | 23 | 112 | 26 | +| regexp.cpp:113:40:113:43 | a\\nc | regexp.cpp | 113 | 40 | 113 | 43 | +| regexp.cpp:114:42:114:45 | a\\nc | regexp.cpp | 114 | 42 | 114 | 45 | +| regexp.cpp:115:41:115:44 | a\\nc | regexp.cpp | 115 | 41 | 115 | 44 | +| regexp.cpp:116:41:116:44 | a\\nc | regexp.cpp | 116 | 41 | 116 | 44 | +| regexp.cpp:117:25:117:28 | a\\nc | regexp.cpp | 117 | 25 | 117 | 28 | +| regexp.cpp:118:29:118:32 | a\\nc | regexp.cpp | 118 | 29 | 118 | 32 | diff --git a/cpp/ql/test/library-tests/regex/parse.expected b/cpp/ql/test/library-tests/regex/parse.expected index 83eadac1b6d9..e4bd6e08b2d9 100644 --- a/cpp/ql/test/library-tests/regex/parse.expected +++ b/cpp/ql/test/library-tests/regex/parse.expected @@ -473,132 +473,160 @@ regexp.cpp: # 100| [RegExpConstant, RegExpNormalChar] a -# 100| [RegExpSequence] a\nb +# 100| [RegExpStar] a*? +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a + +# 101| [RegExpConstant, RegExpNormalChar] b + +# 101| [RegExpPlus] b+? +#-----| 0 -> [RegExpConstant, RegExpNormalChar] b + +# 102| [RegExpConstant, RegExpNormalChar] c + +# 102| [RegExpOpt] c?? +#-----| 0 -> [RegExpConstant, RegExpNormalChar] c + +# 103| [RegExpConstant, RegExpNormalChar] d + +# 103| [RegExpQuantifier] d{2,3}? +#-----| 0 -> [RegExpConstant, RegExpNormalChar] d + +# 104| [RegExpConstant, RegExpEscape] \f + +# 104| [RegExpSequence] \f\v +#-----| 0 -> [RegExpConstant, RegExpEscape] \f +#-----| 1 -> [RegExpConstant, RegExpEscape] \v + +# 104| [RegExpConstant, RegExpEscape] \v + +# 107| [RegExpConstant, RegExpNormalChar] a + +# 107| [RegExpSequence] a\nb #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n #-----| 2 -> [RegExpConstant, RegExpNormalChar] b -# 100| [RegExpConstant, RegExpEscape] \n +# 107| [RegExpConstant, RegExpEscape] \n -# 100| [RegExpConstant, RegExpNormalChar] b +# 107| [RegExpConstant, RegExpNormalChar] b -# 101| [RegExpConstant, RegExpNormalChar] a +# 108| [RegExpConstant, RegExpNormalChar] a -# 101| [RegExpSequence] a\nc +# 108| [RegExpSequence] a\nc #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n #-----| 2 -> [RegExpConstant, RegExpNormalChar] c -# 101| [RegExpConstant, RegExpEscape] \n +# 108| [RegExpConstant, RegExpEscape] \n -# 101| [RegExpConstant, RegExpNormalChar] c +# 108| [RegExpConstant, RegExpNormalChar] c -# 102| [RegExpConstant, RegExpNormalChar] a +# 109| [RegExpConstant, RegExpNormalChar] a -# 102| [RegExpSequence] a\nc +# 109| [RegExpSequence] a\nc #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n #-----| 2 -> [RegExpConstant, RegExpNormalChar] c -# 102| [RegExpConstant, RegExpEscape] \n +# 109| [RegExpConstant, RegExpEscape] \n -# 102| [RegExpConstant, RegExpNormalChar] c +# 109| [RegExpConstant, RegExpNormalChar] c -# 103| [RegExpConstant, RegExpNormalChar] a +# 110| [RegExpConstant, RegExpNormalChar] a -# 103| [RegExpSequence] a\nc +# 110| [RegExpSequence] a\nc #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n #-----| 2 -> [RegExpConstant, RegExpNormalChar] c -# 103| [RegExpConstant, RegExpEscape] \n +# 110| [RegExpConstant, RegExpEscape] \n -# 103| [RegExpConstant, RegExpNormalChar] c +# 110| [RegExpConstant, RegExpNormalChar] c -# 104| [RegExpConstant, RegExpNormalChar] a +# 111| [RegExpConstant, RegExpNormalChar] a -# 104| [RegExpSequence] a\nc +# 111| [RegExpSequence] a\nc #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n #-----| 2 -> [RegExpConstant, RegExpNormalChar] c -# 104| [RegExpConstant, RegExpEscape] \n +# 111| [RegExpConstant, RegExpEscape] \n -# 104| [RegExpConstant, RegExpNormalChar] c +# 111| [RegExpConstant, RegExpNormalChar] c -# 105| [RegExpConstant, RegExpNormalChar] a +# 112| [RegExpConstant, RegExpNormalChar] a -# 105| [RegExpSequence] a\nc +# 112| [RegExpSequence] a\nc #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n #-----| 2 -> [RegExpConstant, RegExpNormalChar] c -# 105| [RegExpConstant, RegExpEscape] \n +# 112| [RegExpConstant, RegExpEscape] \n -# 105| [RegExpConstant, RegExpNormalChar] c +# 112| [RegExpConstant, RegExpNormalChar] c -# 106| [RegExpConstant, RegExpNormalChar] a +# 113| [RegExpConstant, RegExpNormalChar] a -# 106| [RegExpSequence] a\nc +# 113| [RegExpSequence] a\nc #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n #-----| 2 -> [RegExpConstant, RegExpNormalChar] c -# 106| [RegExpConstant, RegExpEscape] \n +# 113| [RegExpConstant, RegExpEscape] \n -# 106| [RegExpConstant, RegExpNormalChar] c +# 113| [RegExpConstant, RegExpNormalChar] c -# 107| [RegExpConstant, RegExpNormalChar] a +# 114| [RegExpConstant, RegExpNormalChar] a -# 107| [RegExpSequence] a\nc +# 114| [RegExpSequence] a\nc #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n #-----| 2 -> [RegExpConstant, RegExpNormalChar] c -# 107| [RegExpConstant, RegExpEscape] \n +# 114| [RegExpConstant, RegExpEscape] \n -# 107| [RegExpConstant, RegExpNormalChar] c +# 114| [RegExpConstant, RegExpNormalChar] c -# 108| [RegExpConstant, RegExpNormalChar] a +# 115| [RegExpConstant, RegExpNormalChar] a -# 108| [RegExpSequence] a\nc +# 115| [RegExpSequence] a\nc #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n #-----| 2 -> [RegExpConstant, RegExpNormalChar] c -# 108| [RegExpConstant, RegExpEscape] \n +# 115| [RegExpConstant, RegExpEscape] \n -# 108| [RegExpConstant, RegExpNormalChar] c +# 115| [RegExpConstant, RegExpNormalChar] c -# 109| [RegExpConstant, RegExpNormalChar] a +# 116| [RegExpConstant, RegExpNormalChar] a -# 109| [RegExpSequence] a\nc +# 116| [RegExpSequence] a\nc #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n #-----| 2 -> [RegExpConstant, RegExpNormalChar] c -# 109| [RegExpConstant, RegExpEscape] \n +# 116| [RegExpConstant, RegExpEscape] \n -# 109| [RegExpConstant, RegExpNormalChar] c +# 116| [RegExpConstant, RegExpNormalChar] c -# 110| [RegExpConstant, RegExpNormalChar] a +# 117| [RegExpConstant, RegExpNormalChar] a -# 110| [RegExpSequence] a\nc +# 117| [RegExpSequence] a\nc #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n #-----| 2 -> [RegExpConstant, RegExpNormalChar] c -# 110| [RegExpConstant, RegExpEscape] \n +# 117| [RegExpConstant, RegExpEscape] \n -# 110| [RegExpConstant, RegExpNormalChar] c +# 117| [RegExpConstant, RegExpNormalChar] c -# 111| [RegExpConstant, RegExpNormalChar] a +# 118| [RegExpConstant, RegExpNormalChar] a -# 111| [RegExpSequence] a\nc +# 118| [RegExpSequence] a\nc #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n #-----| 2 -> [RegExpConstant, RegExpNormalChar] c -# 111| [RegExpConstant, RegExpEscape] \n +# 118| [RegExpConstant, RegExpEscape] \n -# 111| [RegExpConstant, RegExpNormalChar] c +# 118| [RegExpConstant, RegExpNormalChar] c diff --git a/cpp/ql/test/library-tests/regex/regexp.cpp b/cpp/ql/test/library-tests/regex/regexp.cpp index ea56d12bed35..a5e65c66f888 100644 --- a/cpp/ql/test/library-tests/regex/regexp.cpp +++ b/cpp/ql/test/library-tests/regex/regexp.cpp @@ -96,6 +96,13 @@ std::regex r_ctrl2("[\\cZ]"); std::regex r_nul1("\\0"); std::regex r_nul2("[\\0]"); +// Lazy quantifiers and additional supported escapes +std::regex r_lazy1("a*?"); +std::regex r_lazy2("b+?"); +std::regex r_lazy3("c??"); +std::regex r_lazy4("d{2,3}?"); +std::regex r_fv("\\f\\v"); + // String literal spellings for location tests std::regex r_loc_plain("a\\nb"); std::basic_regex r_loc_L(L"a\\nc"); diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index 5f70909c5f34..9ab709db8920 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -176,54 +176,65 @@ term | regexp.cpp:96:20:96:21 | \\0 | RegExpConstant,RegExpEscape | | regexp.cpp:97:20:97:23 | [\\0] | RegExpCharacterClass | | regexp.cpp:97:21:97:22 | \\0 | RegExpConstant,RegExpEscape | -| regexp.cpp:100:25:100:25 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:100:25:100:28 | a\\nb | RegExpSequence | -| regexp.cpp:100:26:100:27 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:100:28:100:28 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:101:37:101:37 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:101:37:101:40 | a\\nc | RegExpSequence | -| regexp.cpp:101:38:101:39 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:101:40:101:40 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:102:39:102:39 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:102:39:102:42 | a\\nc | RegExpSequence | -| regexp.cpp:102:40:102:41 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:102:42:102:42 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:103:38:103:38 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:103:38:103:41 | a\\nc | RegExpSequence | -| regexp.cpp:103:39:103:40 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:103:41:103:41 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:104:38:104:38 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:104:38:104:41 | a\\nc | RegExpSequence | -| regexp.cpp:104:39:104:40 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:104:41:104:41 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:105:23:105:23 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:105:23:105:26 | a\\nc | RegExpSequence | -| regexp.cpp:105:24:105:25 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:105:26:105:26 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:106:40:106:40 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:106:40:106:43 | a\\nc | RegExpSequence | -| regexp.cpp:106:41:106:42 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:106:43:106:43 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:107:42:107:42 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:107:42:107:45 | a\\nc | RegExpSequence | -| regexp.cpp:107:43:107:44 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:107:45:107:45 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:108:41:108:41 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:108:41:108:44 | a\\nc | RegExpSequence | -| regexp.cpp:108:42:108:43 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:108:44:108:44 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:109:41:109:41 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:109:41:109:44 | a\\nc | RegExpSequence | -| regexp.cpp:109:42:109:43 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:109:44:109:44 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:110:25:110:25 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:110:25:110:28 | a\\nc | RegExpSequence | -| regexp.cpp:110:26:110:27 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:110:28:110:28 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:111:29:111:29 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:111:29:111:32 | a\\nc | RegExpSequence | -| regexp.cpp:111:30:111:31 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:111:32:111:32 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:100:21:100:21 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:100:21:100:23 | a*? | RegExpStar | +| regexp.cpp:101:21:101:21 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:101:21:101:23 | b+? | RegExpPlus | +| regexp.cpp:102:21:102:21 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:102:21:102:23 | c?? | RegExpOpt | +| regexp.cpp:103:21:103:21 | d | RegExpConstant,RegExpNormalChar | +| regexp.cpp:103:21:103:27 | d{2,3}? | RegExpQuantifier | +| regexp.cpp:104:18:104:19 | \\f | RegExpConstant,RegExpEscape | +| regexp.cpp:104:18:104:21 | \\f\\v | RegExpSequence | +| regexp.cpp:104:20:104:21 | \\v | RegExpConstant,RegExpEscape | +| regexp.cpp:107:25:107:25 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:107:25:107:28 | a\\nb | RegExpSequence | +| regexp.cpp:107:26:107:27 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:107:28:107:28 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:108:37:108:37 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:108:37:108:40 | a\\nc | RegExpSequence | +| regexp.cpp:108:38:108:39 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:108:40:108:40 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:109:39:109:39 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:109:39:109:42 | a\\nc | RegExpSequence | +| regexp.cpp:109:40:109:41 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:109:42:109:42 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:110:38:110:38 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:110:38:110:41 | a\\nc | RegExpSequence | +| regexp.cpp:110:39:110:40 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:110:41:110:41 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:111:38:111:38 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:111:38:111:41 | a\\nc | RegExpSequence | +| regexp.cpp:111:39:111:40 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:111:41:111:41 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:112:23:112:23 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:112:23:112:26 | a\\nc | RegExpSequence | +| regexp.cpp:112:24:112:25 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:112:26:112:26 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:113:40:113:40 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:113:40:113:43 | a\\nc | RegExpSequence | +| regexp.cpp:113:41:113:42 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:113:43:113:43 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:114:42:114:42 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:114:42:114:45 | a\\nc | RegExpSequence | +| regexp.cpp:114:43:114:44 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:114:45:114:45 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:115:41:115:41 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:115:41:115:44 | a\\nc | RegExpSequence | +| regexp.cpp:115:42:115:43 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:115:44:115:44 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:116:41:116:41 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:116:41:116:44 | a\\nc | RegExpSequence | +| regexp.cpp:116:42:116:43 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:116:44:116:44 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:117:25:117:25 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:117:25:117:28 | a\\nc | RegExpSequence | +| regexp.cpp:117:26:117:27 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:117:28:117:28 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:118:29:118:29 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:118:29:118:32 | a\\nc | RegExpSequence | +| regexp.cpp:118:30:118:31 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:118:32:118:32 | c | RegExpConstant,RegExpNormalChar | regExpNormalCharValue | regexp.cpp:18:19:18:21 | abc | abc | | regexp.cpp:21:20:21:20 | a | a | @@ -304,39 +315,45 @@ regExpNormalCharValue | regexp.cpp:93:22:93:24 | \\cZ | cZ | | regexp.cpp:96:20:96:21 | \\0 | 0 | | regexp.cpp:97:21:97:22 | \\0 | 0 | -| regexp.cpp:100:25:100:25 | a | a | -| regexp.cpp:100:26:100:27 | \\n | \n | -| regexp.cpp:100:28:100:28 | b | b | -| regexp.cpp:101:37:101:37 | a | a | -| regexp.cpp:101:38:101:39 | \\n | \n | -| regexp.cpp:101:40:101:40 | c | c | -| regexp.cpp:102:39:102:39 | a | a | -| regexp.cpp:102:40:102:41 | \\n | \n | -| regexp.cpp:102:42:102:42 | c | c | -| regexp.cpp:103:38:103:38 | a | a | -| regexp.cpp:103:39:103:40 | \\n | \n | -| regexp.cpp:103:41:103:41 | c | c | -| regexp.cpp:104:38:104:38 | a | a | -| regexp.cpp:104:39:104:40 | \\n | \n | -| regexp.cpp:104:41:104:41 | c | c | -| regexp.cpp:105:23:105:23 | a | a | -| regexp.cpp:105:24:105:25 | \\n | \n | -| regexp.cpp:105:26:105:26 | c | c | -| regexp.cpp:106:40:106:40 | a | a | -| regexp.cpp:106:41:106:42 | \\n | \n | -| regexp.cpp:106:43:106:43 | c | c | -| regexp.cpp:107:42:107:42 | a | a | -| regexp.cpp:107:43:107:44 | \\n | \n | -| regexp.cpp:107:45:107:45 | c | c | -| regexp.cpp:108:41:108:41 | a | a | -| regexp.cpp:108:42:108:43 | \\n | \n | -| regexp.cpp:108:44:108:44 | c | c | -| regexp.cpp:109:41:109:41 | a | a | -| regexp.cpp:109:42:109:43 | \\n | \n | -| regexp.cpp:109:44:109:44 | c | c | -| regexp.cpp:110:25:110:25 | a | a | -| regexp.cpp:110:26:110:27 | \\n | \n | -| regexp.cpp:110:28:110:28 | c | c | -| regexp.cpp:111:29:111:29 | a | a | -| regexp.cpp:111:30:111:31 | \\n | \n | -| regexp.cpp:111:32:111:32 | c | c | +| regexp.cpp:100:21:100:21 | a | a | +| regexp.cpp:101:21:101:21 | b | b | +| regexp.cpp:102:21:102:21 | c | c | +| regexp.cpp:103:21:103:21 | d | d | +| regexp.cpp:104:18:104:19 | \\f | \u000c | +| regexp.cpp:104:20:104:21 | \\v | \u000b | +| regexp.cpp:107:25:107:25 | a | a | +| regexp.cpp:107:26:107:27 | \\n | \n | +| regexp.cpp:107:28:107:28 | b | b | +| regexp.cpp:108:37:108:37 | a | a | +| regexp.cpp:108:38:108:39 | \\n | \n | +| regexp.cpp:108:40:108:40 | c | c | +| regexp.cpp:109:39:109:39 | a | a | +| regexp.cpp:109:40:109:41 | \\n | \n | +| regexp.cpp:109:42:109:42 | c | c | +| regexp.cpp:110:38:110:38 | a | a | +| regexp.cpp:110:39:110:40 | \\n | \n | +| regexp.cpp:110:41:110:41 | c | c | +| regexp.cpp:111:38:111:38 | a | a | +| regexp.cpp:111:39:111:40 | \\n | \n | +| regexp.cpp:111:41:111:41 | c | c | +| regexp.cpp:112:23:112:23 | a | a | +| regexp.cpp:112:24:112:25 | \\n | \n | +| regexp.cpp:112:26:112:26 | c | c | +| regexp.cpp:113:40:113:40 | a | a | +| regexp.cpp:113:41:113:42 | \\n | \n | +| regexp.cpp:113:43:113:43 | c | c | +| regexp.cpp:114:42:114:42 | a | a | +| regexp.cpp:114:43:114:44 | \\n | \n | +| regexp.cpp:114:45:114:45 | c | c | +| regexp.cpp:115:41:115:41 | a | a | +| regexp.cpp:115:42:115:43 | \\n | \n | +| regexp.cpp:115:44:115:44 | c | c | +| regexp.cpp:116:41:116:41 | a | a | +| regexp.cpp:116:42:116:43 | \\n | \n | +| regexp.cpp:116:44:116:44 | c | c | +| regexp.cpp:117:25:117:25 | a | a | +| regexp.cpp:117:26:117:27 | \\n | \n | +| regexp.cpp:117:28:117:28 | c | c | +| regexp.cpp:118:29:118:29 | a | a | +| regexp.cpp:118:30:118:31 | \\n | \n | +| regexp.cpp:118:32:118:32 | c | c | From 009ae4332fe2b2e1d949361dbb82a2f3d1ca5cfb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 23 Jul 2026 10:25:48 +0000 Subject: [PATCH 0183/2098] C++: Verify [\b] is backspace inside character classes --- .../library-tests/regex/locations.expected | 89 +-- .../test/library-tests/regex/parse.expected | 289 +++++----- cpp/ql/test/library-tests/regex/regexp.cpp | 1 + .../test/library-tests/regex/regexp.expected | 513 +++++++++--------- 4 files changed, 451 insertions(+), 441 deletions(-) diff --git a/cpp/ql/test/library-tests/regex/locations.expected b/cpp/ql/test/library-tests/regex/locations.expected index 2c85989fc5e9..5d57a25de42d 100644 --- a/cpp/ql/test/library-tests/regex/locations.expected +++ b/cpp/ql/test/library-tests/regex/locations.expected @@ -13,49 +13,50 @@ | regexp.cpp:36:19:36:22 | [^]] | regexp.cpp | 36 | 19 | 36 | 22 | | regexp.cpp:37:19:37:22 | [^-] | regexp.cpp | 37 | 19 | 37 | 22 | | regexp.cpp:38:19:38:21 | [\|] | regexp.cpp | 38 | 19 | 38 | 21 | -| regexp.cpp:41:22:41:31 | [[a-f]A-F] | regexp.cpp | 41 | 22 | 41 | 31 | -| regexp.cpp:44:21:44:22 | .* | regexp.cpp | 44 | 21 | 44 | 22 | -| regexp.cpp:45:21:45:25 | \\w+\\W | regexp.cpp | 45 | 21 | 45 | 25 | -| regexp.cpp:46:21:46:24 | \\s\\S | regexp.cpp | 46 | 21 | 46 | 24 | -| regexp.cpp:47:21:47:24 | \\d\\D | regexp.cpp | 47 | 21 | 47 | 24 | -| regexp.cpp:48:21:48:26 | \\n\\r\\t | regexp.cpp | 48 | 21 | 48 | 26 | -| regexp.cpp:51:20:51:25 | \\b!a\\B | regexp.cpp | 51 | 20 | 51 | 25 | -| regexp.cpp:54:20:54:28 | (foo)*bar | regexp.cpp | 54 | 20 | 54 | 28 | -| regexp.cpp:55:20:55:28 | fo(o\|b)ar | regexp.cpp | 55 | 20 | 55 | 28 | -| regexp.cpp:56:20:56:28 | (a\|b\|cd)e | regexp.cpp | 56 | 20 | 56 | 28 | -| regexp.cpp:57:20:57:27 | (?::+)\\w | regexp.cpp | 57 | 20 | 57 | 27 | -| regexp.cpp:60:21:60:28 | (a+)b+\\1 | regexp.cpp | 60 | 21 | 60 | 28 | -| regexp.cpp:63:21:63:32 | [[:alnum:]]* | regexp.cpp | 63 | 21 | 63 | 32 | -| regexp.cpp:64:21:64:32 | [[:digit:]]+ | regexp.cpp | 64 | 21 | 64 | 32 | -| regexp.cpp:65:21:65:36 | [[:alnum:]]{2,3} | regexp.cpp | 65 | 21 | 65 | 36 | -| regexp.cpp:66:21:66:35 | [a-f[:digit:]]+ | regexp.cpp | 66 | 21 | 66 | 35 | -| regexp.cpp:69:22:69:43 | [[:alpha:]][[:digit:]] | regexp.cpp | 69 | 22 | 69 | 43 | -| regexp.cpp:72:22:72:41 | [[:alpha:][:digit:]] | regexp.cpp | 72 | 22 | 72 | 41 | -| regexp.cpp:75:22:75:38 | [A-F[:digit:]a-f] | regexp.cpp | 75 | 22 | 75 | 38 | -| regexp.cpp:78:27:78:33 | [[.a.]] | regexp.cpp | 78 | 27 | 78 | 33 | -| regexp.cpp:79:27:79:39 | [A-F[.b.]a-f] | regexp.cpp | 79 | 27 | 79 | 39 | -| regexp.cpp:82:28:82:34 | [[=a=]] | regexp.cpp | 82 | 28 | 82 | 34 | -| regexp.cpp:83:28:83:40 | [A-F[=b=]a-f] | regexp.cpp | 83 | 28 | 83 | 40 | -| regexp.cpp:86:22:86:30 | [:digit:] | regexp.cpp | 86 | 22 | 86 | 30 | -| regexp.cpp:89:19:89:24 | \\u0061 | regexp.cpp | 89 | 19 | 89 | 24 | -| regexp.cpp:92:21:92:23 | \\cA | regexp.cpp | 92 | 21 | 92 | 23 | -| regexp.cpp:93:21:93:25 | [\\cZ] | regexp.cpp | 93 | 21 | 93 | 25 | -| regexp.cpp:96:20:96:21 | \\0 | regexp.cpp | 96 | 20 | 96 | 21 | -| regexp.cpp:97:20:97:23 | [\\0] | regexp.cpp | 97 | 20 | 97 | 23 | -| regexp.cpp:100:21:100:23 | a*? | regexp.cpp | 100 | 21 | 100 | 23 | -| regexp.cpp:101:21:101:23 | b+? | regexp.cpp | 101 | 21 | 101 | 23 | -| regexp.cpp:102:21:102:23 | c?? | regexp.cpp | 102 | 21 | 102 | 23 | -| regexp.cpp:103:21:103:27 | d{2,3}? | regexp.cpp | 103 | 21 | 103 | 27 | -| regexp.cpp:104:18:104:21 | \\f\\v | regexp.cpp | 104 | 18 | 104 | 21 | -| regexp.cpp:107:25:107:28 | a\\nb | regexp.cpp | 107 | 25 | 107 | 28 | -| regexp.cpp:108:37:108:40 | a\\nc | regexp.cpp | 108 | 37 | 108 | 40 | -| regexp.cpp:109:39:109:42 | a\\nc | regexp.cpp | 109 | 39 | 109 | 42 | -| regexp.cpp:110:38:110:41 | a\\nc | regexp.cpp | 110 | 38 | 110 | 41 | +| regexp.cpp:39:20:39:23 | [\\b] | regexp.cpp | 39 | 20 | 39 | 23 | +| regexp.cpp:42:22:42:31 | [[a-f]A-F] | regexp.cpp | 42 | 22 | 42 | 31 | +| regexp.cpp:45:21:45:22 | .* | regexp.cpp | 45 | 21 | 45 | 22 | +| regexp.cpp:46:21:46:25 | \\w+\\W | regexp.cpp | 46 | 21 | 46 | 25 | +| regexp.cpp:47:21:47:24 | \\s\\S | regexp.cpp | 47 | 21 | 47 | 24 | +| regexp.cpp:48:21:48:24 | \\d\\D | regexp.cpp | 48 | 21 | 48 | 24 | +| regexp.cpp:49:21:49:26 | \\n\\r\\t | regexp.cpp | 49 | 21 | 49 | 26 | +| regexp.cpp:52:20:52:25 | \\b!a\\B | regexp.cpp | 52 | 20 | 52 | 25 | +| regexp.cpp:55:20:55:28 | (foo)*bar | regexp.cpp | 55 | 20 | 55 | 28 | +| regexp.cpp:56:20:56:28 | fo(o\|b)ar | regexp.cpp | 56 | 20 | 56 | 28 | +| regexp.cpp:57:20:57:28 | (a\|b\|cd)e | regexp.cpp | 57 | 20 | 57 | 28 | +| regexp.cpp:58:20:58:27 | (?::+)\\w | regexp.cpp | 58 | 20 | 58 | 27 | +| regexp.cpp:61:21:61:28 | (a+)b+\\1 | regexp.cpp | 61 | 21 | 61 | 28 | +| regexp.cpp:64:21:64:32 | [[:alnum:]]* | regexp.cpp | 64 | 21 | 64 | 32 | +| regexp.cpp:65:21:65:32 | [[:digit:]]+ | regexp.cpp | 65 | 21 | 65 | 32 | +| regexp.cpp:66:21:66:36 | [[:alnum:]]{2,3} | regexp.cpp | 66 | 21 | 66 | 36 | +| regexp.cpp:67:21:67:35 | [a-f[:digit:]]+ | regexp.cpp | 67 | 21 | 67 | 35 | +| regexp.cpp:70:22:70:43 | [[:alpha:]][[:digit:]] | regexp.cpp | 70 | 22 | 70 | 43 | +| regexp.cpp:73:22:73:41 | [[:alpha:][:digit:]] | regexp.cpp | 73 | 22 | 73 | 41 | +| regexp.cpp:76:22:76:38 | [A-F[:digit:]a-f] | regexp.cpp | 76 | 22 | 76 | 38 | +| regexp.cpp:79:27:79:33 | [[.a.]] | regexp.cpp | 79 | 27 | 79 | 33 | +| regexp.cpp:80:27:80:39 | [A-F[.b.]a-f] | regexp.cpp | 80 | 27 | 80 | 39 | +| regexp.cpp:83:28:83:34 | [[=a=]] | regexp.cpp | 83 | 28 | 83 | 34 | +| regexp.cpp:84:28:84:40 | [A-F[=b=]a-f] | regexp.cpp | 84 | 28 | 84 | 40 | +| regexp.cpp:87:22:87:30 | [:digit:] | regexp.cpp | 87 | 22 | 87 | 30 | +| regexp.cpp:90:19:90:24 | \\u0061 | regexp.cpp | 90 | 19 | 90 | 24 | +| regexp.cpp:93:21:93:23 | \\cA | regexp.cpp | 93 | 21 | 93 | 23 | +| regexp.cpp:94:21:94:25 | [\\cZ] | regexp.cpp | 94 | 21 | 94 | 25 | +| regexp.cpp:97:20:97:21 | \\0 | regexp.cpp | 97 | 20 | 97 | 21 | +| regexp.cpp:98:20:98:23 | [\\0] | regexp.cpp | 98 | 20 | 98 | 23 | +| regexp.cpp:101:21:101:23 | a*? | regexp.cpp | 101 | 21 | 101 | 23 | +| regexp.cpp:102:21:102:23 | b+? | regexp.cpp | 102 | 21 | 102 | 23 | +| regexp.cpp:103:21:103:23 | c?? | regexp.cpp | 103 | 21 | 103 | 23 | +| regexp.cpp:104:21:104:27 | d{2,3}? | regexp.cpp | 104 | 21 | 104 | 27 | +| regexp.cpp:105:18:105:21 | \\f\\v | regexp.cpp | 105 | 18 | 105 | 21 | +| regexp.cpp:108:25:108:28 | a\\nb | regexp.cpp | 108 | 25 | 108 | 28 | +| regexp.cpp:109:37:109:40 | a\\nc | regexp.cpp | 109 | 37 | 109 | 40 | +| regexp.cpp:110:39:110:42 | a\\nc | regexp.cpp | 110 | 39 | 110 | 42 | | regexp.cpp:111:38:111:41 | a\\nc | regexp.cpp | 111 | 38 | 111 | 41 | -| regexp.cpp:112:23:112:26 | a\\nc | regexp.cpp | 112 | 23 | 112 | 26 | -| regexp.cpp:113:40:113:43 | a\\nc | regexp.cpp | 113 | 40 | 113 | 43 | -| regexp.cpp:114:42:114:45 | a\\nc | regexp.cpp | 114 | 42 | 114 | 45 | -| regexp.cpp:115:41:115:44 | a\\nc | regexp.cpp | 115 | 41 | 115 | 44 | +| regexp.cpp:112:38:112:41 | a\\nc | regexp.cpp | 112 | 38 | 112 | 41 | +| regexp.cpp:113:23:113:26 | a\\nc | regexp.cpp | 113 | 23 | 113 | 26 | +| regexp.cpp:114:40:114:43 | a\\nc | regexp.cpp | 114 | 40 | 114 | 43 | +| regexp.cpp:115:42:115:45 | a\\nc | regexp.cpp | 115 | 42 | 115 | 45 | | regexp.cpp:116:41:116:44 | a\\nc | regexp.cpp | 116 | 41 | 116 | 44 | -| regexp.cpp:117:25:117:28 | a\\nc | regexp.cpp | 117 | 25 | 117 | 28 | -| regexp.cpp:118:29:118:32 | a\\nc | regexp.cpp | 118 | 29 | 118 | 32 | +| regexp.cpp:117:41:117:44 | a\\nc | regexp.cpp | 117 | 41 | 117 | 44 | +| regexp.cpp:118:25:118:28 | a\\nc | regexp.cpp | 118 | 25 | 118 | 28 | +| regexp.cpp:119:29:119:32 | a\\nc | regexp.cpp | 119 | 29 | 119 | 32 | diff --git a/cpp/ql/test/library-tests/regex/parse.expected b/cpp/ql/test/library-tests/regex/parse.expected index e4bd6e08b2d9..8993b650e1ea 100644 --- a/cpp/ql/test/library-tests/regex/parse.expected +++ b/cpp/ql/test/library-tests/regex/parse.expected @@ -149,377 +149,371 @@ regexp.cpp: # 38| [RegExpConstant, RegExpNormalChar] | -# 41| [RegExpCharacterClass] [[a-f] +# 39| [RegExpCharacterClass] [\b] +#-----| 0 -> [RegExpConstant, RegExpEscape] \b + +# 39| [RegExpConstant, RegExpEscape] \b + +# 42| [RegExpCharacterClass] [[a-f] #-----| 0 -> [RegExpConstant, RegExpNormalChar] [ #-----| 1 -> [RegExpCharacterRange] a-f -# 41| [RegExpSequence] [[a-f]A-F] +# 42| [RegExpSequence] [[a-f]A-F] #-----| 0 -> [RegExpCharacterClass] [[a-f] #-----| 1 -> [RegExpConstant, RegExpNormalChar] A-F] -# 41| [RegExpConstant, RegExpNormalChar] [ +# 42| [RegExpConstant, RegExpNormalChar] [ -# 41| [RegExpConstant, RegExpNormalChar] a +# 42| [RegExpConstant, RegExpNormalChar] a -# 41| [RegExpCharacterRange] a-f +# 42| [RegExpCharacterRange] a-f #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] f -# 41| [RegExpConstant, RegExpNormalChar] f +# 42| [RegExpConstant, RegExpNormalChar] f -# 41| [RegExpConstant, RegExpNormalChar] A-F] +# 42| [RegExpConstant, RegExpNormalChar] A-F] -# 44| [RegExpDot] . +# 45| [RegExpDot] . -# 44| [RegExpStar] .* +# 45| [RegExpStar] .* #-----| 0 -> [RegExpDot] . -# 45| [RegExpCharacterClassEscape] \w +# 46| [RegExpCharacterClassEscape] \w -# 45| [RegExpPlus] \w+ +# 46| [RegExpPlus] \w+ #-----| 0 -> [RegExpCharacterClassEscape] \w -# 45| [RegExpSequence] \w+\W +# 46| [RegExpSequence] \w+\W #-----| 0 -> [RegExpPlus] \w+ #-----| 1 -> [RegExpCharacterClassEscape] \W -# 45| [RegExpCharacterClassEscape] \W +# 46| [RegExpCharacterClassEscape] \W -# 46| [RegExpCharacterClassEscape] \s +# 47| [RegExpCharacterClassEscape] \s -# 46| [RegExpSequence] \s\S +# 47| [RegExpSequence] \s\S #-----| 0 -> [RegExpCharacterClassEscape] \s #-----| 1 -> [RegExpCharacterClassEscape] \S -# 46| [RegExpCharacterClassEscape] \S +# 47| [RegExpCharacterClassEscape] \S -# 47| [RegExpCharacterClassEscape] \d +# 48| [RegExpCharacterClassEscape] \d -# 47| [RegExpSequence] \d\D +# 48| [RegExpSequence] \d\D #-----| 0 -> [RegExpCharacterClassEscape] \d #-----| 1 -> [RegExpCharacterClassEscape] \D -# 47| [RegExpCharacterClassEscape] \D +# 48| [RegExpCharacterClassEscape] \D -# 48| [RegExpConstant, RegExpEscape] \n +# 49| [RegExpConstant, RegExpEscape] \n -# 48| [RegExpSequence] \n\r\t +# 49| [RegExpSequence] \n\r\t #-----| 0 -> [RegExpConstant, RegExpEscape] \n #-----| 1 -> [RegExpConstant, RegExpEscape] \r #-----| 2 -> [RegExpConstant, RegExpEscape] \t -# 48| [RegExpConstant, RegExpEscape] \r +# 49| [RegExpConstant, RegExpEscape] \r -# 48| [RegExpConstant, RegExpEscape] \t +# 49| [RegExpConstant, RegExpEscape] \t -# 51| [RegExpSpecialChar] \b +# 52| [RegExpSpecialChar] \b -# 51| [RegExpSequence] \b!a\B +# 52| [RegExpSequence] \b!a\B #-----| 0 -> [RegExpSpecialChar] \b #-----| 1 -> [RegExpConstant, RegExpNormalChar] !a #-----| 2 -> [RegExpNonWordBoundary] \B -# 51| [RegExpConstant, RegExpNormalChar] !a +# 52| [RegExpConstant, RegExpNormalChar] !a -# 51| [RegExpNonWordBoundary] \B +# 52| [RegExpNonWordBoundary] \B -# 54| [RegExpGroup] (foo) +# 55| [RegExpGroup] (foo) #-----| 0 -> [RegExpConstant, RegExpNormalChar] foo -# 54| [RegExpStar] (foo)* +# 55| [RegExpStar] (foo)* #-----| 0 -> [RegExpGroup] (foo) -# 54| [RegExpSequence] (foo)*bar +# 55| [RegExpSequence] (foo)*bar #-----| 0 -> [RegExpStar] (foo)* #-----| 1 -> [RegExpConstant, RegExpNormalChar] bar -# 54| [RegExpConstant, RegExpNormalChar] foo +# 55| [RegExpConstant, RegExpNormalChar] foo -# 54| [RegExpConstant, RegExpNormalChar] bar +# 55| [RegExpConstant, RegExpNormalChar] bar -# 55| [RegExpConstant, RegExpNormalChar] fo +# 56| [RegExpConstant, RegExpNormalChar] fo -# 55| [RegExpSequence] fo(o|b)ar +# 56| [RegExpSequence] fo(o|b)ar #-----| 0 -> [RegExpConstant, RegExpNormalChar] fo #-----| 1 -> [RegExpGroup] (o|b) #-----| 2 -> [RegExpConstant, RegExpNormalChar] ar -# 55| [RegExpGroup] (o|b) +# 56| [RegExpGroup] (o|b) #-----| 0 -> [RegExpAlt] o|b -# 55| [RegExpConstant, RegExpNormalChar] o +# 56| [RegExpConstant, RegExpNormalChar] o -# 55| [RegExpAlt] o|b +# 56| [RegExpAlt] o|b #-----| 0 -> [RegExpConstant, RegExpNormalChar] o #-----| 1 -> [RegExpConstant, RegExpNormalChar] b -# 55| [RegExpConstant, RegExpNormalChar] b +# 56| [RegExpConstant, RegExpNormalChar] b -# 55| [RegExpConstant, RegExpNormalChar] ar +# 56| [RegExpConstant, RegExpNormalChar] ar -# 56| [RegExpGroup] (a|b|cd) +# 57| [RegExpGroup] (a|b|cd) #-----| 0 -> [RegExpAlt] a|b|cd -# 56| [RegExpSequence] (a|b|cd)e +# 57| [RegExpSequence] (a|b|cd)e #-----| 0 -> [RegExpGroup] (a|b|cd) #-----| 1 -> [RegExpConstant, RegExpNormalChar] e -# 56| [RegExpConstant, RegExpNormalChar] a +# 57| [RegExpConstant, RegExpNormalChar] a -# 56| [RegExpAlt] a|b|cd +# 57| [RegExpAlt] a|b|cd #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] b #-----| 2 -> [RegExpConstant, RegExpNormalChar] cd -# 56| [RegExpConstant, RegExpNormalChar] b +# 57| [RegExpConstant, RegExpNormalChar] b -# 56| [RegExpConstant, RegExpNormalChar] cd +# 57| [RegExpConstant, RegExpNormalChar] cd -# 56| [RegExpConstant, RegExpNormalChar] e +# 57| [RegExpConstant, RegExpNormalChar] e -# 57| [RegExpGroup] (?::+) +# 58| [RegExpGroup] (?::+) #-----| 0 -> [RegExpPlus] :+ -# 57| [RegExpSequence] (?::+)\w +# 58| [RegExpSequence] (?::+)\w #-----| 0 -> [RegExpGroup] (?::+) #-----| 1 -> [RegExpCharacterClassEscape] \w -# 57| [RegExpConstant, RegExpNormalChar] : +# 58| [RegExpConstant, RegExpNormalChar] : -# 57| [RegExpPlus] :+ +# 58| [RegExpPlus] :+ #-----| 0 -> [RegExpConstant, RegExpNormalChar] : -# 57| [RegExpCharacterClassEscape] \w +# 58| [RegExpCharacterClassEscape] \w -# 60| [RegExpGroup] (a+) +# 61| [RegExpGroup] (a+) #-----| 0 -> [RegExpPlus] a+ -# 60| [RegExpSequence] (a+)b+\1 +# 61| [RegExpSequence] (a+)b+\1 #-----| 0 -> [RegExpGroup] (a+) #-----| 1 -> [RegExpPlus] b+ #-----| 2 -> [RegExpBackRef] \1 -# 60| [RegExpConstant, RegExpNormalChar] a +# 61| [RegExpConstant, RegExpNormalChar] a -# 60| [RegExpPlus] a+ +# 61| [RegExpPlus] a+ #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 60| [RegExpConstant, RegExpNormalChar] b +# 61| [RegExpConstant, RegExpNormalChar] b -# 60| [RegExpPlus] b+ +# 61| [RegExpPlus] b+ #-----| 0 -> [RegExpConstant, RegExpNormalChar] b -# 60| [RegExpBackRef] \1 +# 61| [RegExpBackRef] \1 -# 63| [RegExpCharacterClass] [[:alnum:]] +# 64| [RegExpCharacterClass] [[:alnum:]] #-----| 0 -> [RegExpNamedCharacterProperty] [:alnum:] -# 63| [RegExpStar] [[:alnum:]]* +# 64| [RegExpStar] [[:alnum:]]* #-----| 0 -> [RegExpCharacterClass] [[:alnum:]] -# 63| [RegExpNamedCharacterProperty] [:alnum:] +# 64| [RegExpNamedCharacterProperty] [:alnum:] -# 64| [RegExpCharacterClass] [[:digit:]] +# 65| [RegExpCharacterClass] [[:digit:]] #-----| 0 -> [RegExpNamedCharacterProperty] [:digit:] -# 64| [RegExpPlus] [[:digit:]]+ +# 65| [RegExpPlus] [[:digit:]]+ #-----| 0 -> [RegExpCharacterClass] [[:digit:]] -# 64| [RegExpNamedCharacterProperty] [:digit:] +# 65| [RegExpNamedCharacterProperty] [:digit:] -# 65| [RegExpCharacterClass] [[:alnum:]] +# 66| [RegExpCharacterClass] [[:alnum:]] #-----| 0 -> [RegExpNamedCharacterProperty] [:alnum:] -# 65| [RegExpRange] [[:alnum:]]{2,3} +# 66| [RegExpRange] [[:alnum:]]{2,3} #-----| 0 -> [RegExpCharacterClass] [[:alnum:]] -# 65| [RegExpNamedCharacterProperty] [:alnum:] +# 66| [RegExpNamedCharacterProperty] [:alnum:] -# 66| [RegExpCharacterClass] [a-f[:digit:]] +# 67| [RegExpCharacterClass] [a-f[:digit:]] #-----| 0 -> [RegExpCharacterRange] a-f #-----| 1 -> [RegExpNamedCharacterProperty] [:digit:] -# 66| [RegExpPlus] [a-f[:digit:]]+ +# 67| [RegExpPlus] [a-f[:digit:]]+ #-----| 0 -> [RegExpCharacterClass] [a-f[:digit:]] -# 66| [RegExpConstant, RegExpNormalChar] a +# 67| [RegExpConstant, RegExpNormalChar] a -# 66| [RegExpCharacterRange] a-f +# 67| [RegExpCharacterRange] a-f #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] f -# 66| [RegExpConstant, RegExpNormalChar] f +# 67| [RegExpConstant, RegExpNormalChar] f -# 66| [RegExpNamedCharacterProperty] [:digit:] +# 67| [RegExpNamedCharacterProperty] [:digit:] -# 69| [RegExpCharacterClass] [[:alpha:]] +# 70| [RegExpCharacterClass] [[:alpha:]] #-----| 0 -> [RegExpNamedCharacterProperty] [:alpha:] -# 69| [RegExpSequence] [[:alpha:]][[:digit:]] +# 70| [RegExpSequence] [[:alpha:]][[:digit:]] #-----| 0 -> [RegExpCharacterClass] [[:alpha:]] #-----| 1 -> [RegExpCharacterClass] [[:digit:]] -# 69| [RegExpNamedCharacterProperty] [:alpha:] +# 70| [RegExpNamedCharacterProperty] [:alpha:] -# 69| [RegExpCharacterClass] [[:digit:]] +# 70| [RegExpCharacterClass] [[:digit:]] #-----| 0 -> [RegExpNamedCharacterProperty] [:digit:] -# 69| [RegExpNamedCharacterProperty] [:digit:] +# 70| [RegExpNamedCharacterProperty] [:digit:] -# 72| [RegExpCharacterClass] [[:alpha:][:digit:]] +# 73| [RegExpCharacterClass] [[:alpha:][:digit:]] #-----| 0 -> [RegExpNamedCharacterProperty] [:alpha:] #-----| 1 -> [RegExpNamedCharacterProperty] [:digit:] -# 72| [RegExpNamedCharacterProperty] [:alpha:] +# 73| [RegExpNamedCharacterProperty] [:alpha:] -# 72| [RegExpNamedCharacterProperty] [:digit:] +# 73| [RegExpNamedCharacterProperty] [:digit:] -# 75| [RegExpCharacterClass] [A-F[:digit:]a-f] +# 76| [RegExpCharacterClass] [A-F[:digit:]a-f] #-----| 0 -> [RegExpCharacterRange] A-F #-----| 1 -> [RegExpNamedCharacterProperty] [:digit:] #-----| 2 -> [RegExpCharacterRange] a-f -# 75| [RegExpConstant, RegExpNormalChar] A +# 76| [RegExpConstant, RegExpNormalChar] A -# 75| [RegExpCharacterRange] A-F +# 76| [RegExpCharacterRange] A-F #-----| 0 -> [RegExpConstant, RegExpNormalChar] A #-----| 1 -> [RegExpConstant, RegExpNormalChar] F -# 75| [RegExpConstant, RegExpNormalChar] F +# 76| [RegExpConstant, RegExpNormalChar] F -# 75| [RegExpNamedCharacterProperty] [:digit:] +# 76| [RegExpNamedCharacterProperty] [:digit:] -# 75| [RegExpConstant, RegExpNormalChar] a +# 76| [RegExpConstant, RegExpNormalChar] a -# 75| [RegExpCharacterRange] a-f +# 76| [RegExpCharacterRange] a-f #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] f -# 75| [RegExpConstant, RegExpNormalChar] f +# 76| [RegExpConstant, RegExpNormalChar] f -# 78| [RegExpCharacterClass] [[.a.]] +# 79| [RegExpCharacterClass] [[.a.]] #-----| 0 -> [RegExpNamedCharacterProperty] [.a.] -# 78| [RegExpNamedCharacterProperty] [.a.] +# 79| [RegExpNamedCharacterProperty] [.a.] -# 79| [RegExpCharacterClass] [A-F[.b.]a-f] +# 80| [RegExpCharacterClass] [A-F[.b.]a-f] #-----| 0 -> [RegExpCharacterRange] A-F #-----| 1 -> [RegExpNamedCharacterProperty] [.b.] #-----| 2 -> [RegExpCharacterRange] a-f -# 79| [RegExpConstant, RegExpNormalChar] A +# 80| [RegExpConstant, RegExpNormalChar] A -# 79| [RegExpCharacterRange] A-F +# 80| [RegExpCharacterRange] A-F #-----| 0 -> [RegExpConstant, RegExpNormalChar] A #-----| 1 -> [RegExpConstant, RegExpNormalChar] F -# 79| [RegExpConstant, RegExpNormalChar] F +# 80| [RegExpConstant, RegExpNormalChar] F -# 79| [RegExpNamedCharacterProperty] [.b.] +# 80| [RegExpNamedCharacterProperty] [.b.] -# 79| [RegExpConstant, RegExpNormalChar] a +# 80| [RegExpConstant, RegExpNormalChar] a -# 79| [RegExpCharacterRange] a-f +# 80| [RegExpCharacterRange] a-f #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] f -# 79| [RegExpConstant, RegExpNormalChar] f +# 80| [RegExpConstant, RegExpNormalChar] f -# 82| [RegExpCharacterClass] [[=a=]] +# 83| [RegExpCharacterClass] [[=a=]] #-----| 0 -> [RegExpNamedCharacterProperty] [=a=] -# 82| [RegExpNamedCharacterProperty] [=a=] +# 83| [RegExpNamedCharacterProperty] [=a=] -# 83| [RegExpCharacterClass] [A-F[=b=]a-f] +# 84| [RegExpCharacterClass] [A-F[=b=]a-f] #-----| 0 -> [RegExpCharacterRange] A-F #-----| 1 -> [RegExpNamedCharacterProperty] [=b=] #-----| 2 -> [RegExpCharacterRange] a-f -# 83| [RegExpConstant, RegExpNormalChar] A +# 84| [RegExpConstant, RegExpNormalChar] A -# 83| [RegExpCharacterRange] A-F +# 84| [RegExpCharacterRange] A-F #-----| 0 -> [RegExpConstant, RegExpNormalChar] A #-----| 1 -> [RegExpConstant, RegExpNormalChar] F -# 83| [RegExpConstant, RegExpNormalChar] F +# 84| [RegExpConstant, RegExpNormalChar] F -# 83| [RegExpNamedCharacterProperty] [=b=] +# 84| [RegExpNamedCharacterProperty] [=b=] -# 83| [RegExpConstant, RegExpNormalChar] a +# 84| [RegExpConstant, RegExpNormalChar] a -# 83| [RegExpCharacterRange] a-f +# 84| [RegExpCharacterRange] a-f #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] f -# 83| [RegExpConstant, RegExpNormalChar] f +# 84| [RegExpConstant, RegExpNormalChar] f -# 86| [RegExpNamedCharacterProperty] [:digit:] +# 87| [RegExpNamedCharacterProperty] [:digit:] -# 89| [RegExpConstant, RegExpEscape] \u0061 +# 90| [RegExpConstant, RegExpEscape] \u0061 -# 92| [RegExpConstant, RegExpEscape] \cA +# 93| [RegExpConstant, RegExpEscape] \cA -# 93| [RegExpCharacterClass] [\cZ] +# 94| [RegExpCharacterClass] [\cZ] #-----| 0 -> [RegExpConstant, RegExpEscape] \cZ -# 93| [RegExpConstant, RegExpEscape] \cZ +# 94| [RegExpConstant, RegExpEscape] \cZ -# 96| [RegExpConstant, RegExpEscape] \0 +# 97| [RegExpConstant, RegExpEscape] \0 -# 97| [RegExpCharacterClass] [\0] +# 98| [RegExpCharacterClass] [\0] #-----| 0 -> [RegExpConstant, RegExpEscape] \0 -# 97| [RegExpConstant, RegExpEscape] \0 +# 98| [RegExpConstant, RegExpEscape] \0 -# 100| [RegExpConstant, RegExpNormalChar] a +# 101| [RegExpConstant, RegExpNormalChar] a -# 100| [RegExpStar] a*? +# 101| [RegExpStar] a*? #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 101| [RegExpConstant, RegExpNormalChar] b +# 102| [RegExpConstant, RegExpNormalChar] b -# 101| [RegExpPlus] b+? +# 102| [RegExpPlus] b+? #-----| 0 -> [RegExpConstant, RegExpNormalChar] b -# 102| [RegExpConstant, RegExpNormalChar] c +# 103| [RegExpConstant, RegExpNormalChar] c -# 102| [RegExpOpt] c?? +# 103| [RegExpOpt] c?? #-----| 0 -> [RegExpConstant, RegExpNormalChar] c -# 103| [RegExpConstant, RegExpNormalChar] d +# 104| [RegExpConstant, RegExpNormalChar] d -# 103| [RegExpQuantifier] d{2,3}? +# 104| [RegExpQuantifier] d{2,3}? #-----| 0 -> [RegExpConstant, RegExpNormalChar] d -# 104| [RegExpConstant, RegExpEscape] \f +# 105| [RegExpConstant, RegExpEscape] \f -# 104| [RegExpSequence] \f\v +# 105| [RegExpSequence] \f\v #-----| 0 -> [RegExpConstant, RegExpEscape] \f #-----| 1 -> [RegExpConstant, RegExpEscape] \v -# 104| [RegExpConstant, RegExpEscape] \v - -# 107| [RegExpConstant, RegExpNormalChar] a - -# 107| [RegExpSequence] a\nb -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] b - -# 107| [RegExpConstant, RegExpEscape] \n - -# 107| [RegExpConstant, RegExpNormalChar] b +# 105| [RegExpConstant, RegExpEscape] \v # 108| [RegExpConstant, RegExpNormalChar] a -# 108| [RegExpSequence] a\nc +# 108| [RegExpSequence] a\nb #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c +#-----| 2 -> [RegExpConstant, RegExpNormalChar] b # 108| [RegExpConstant, RegExpEscape] \n -# 108| [RegExpConstant, RegExpNormalChar] c +# 108| [RegExpConstant, RegExpNormalChar] b # 109| [RegExpConstant, RegExpNormalChar] a @@ -630,3 +624,14 @@ regexp.cpp: # 118| [RegExpConstant, RegExpEscape] \n # 118| [RegExpConstant, RegExpNormalChar] c + +# 119| [RegExpConstant, RegExpNormalChar] a + +# 119| [RegExpSequence] a\nc +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpEscape] \n +#-----| 2 -> [RegExpConstant, RegExpNormalChar] c + +# 119| [RegExpConstant, RegExpEscape] \n + +# 119| [RegExpConstant, RegExpNormalChar] c diff --git a/cpp/ql/test/library-tests/regex/regexp.cpp b/cpp/ql/test/library-tests/regex/regexp.cpp index a5e65c66f888..b1cfd64aa5c5 100644 --- a/cpp/ql/test/library-tests/regex/regexp.cpp +++ b/cpp/ql/test/library-tests/regex/regexp.cpp @@ -36,6 +36,7 @@ std::regex r_cc6("[]]"); // MRI gives a warning, but accepts this as matching std::regex r_cc7("[^]]"); // MRI gives a warning, but accepts this as matching anything except ']' std::regex r_cc8("[^-]"); std::regex r_cc9("[|]"); +std::regex r_cc10("[\\b]"); // Nested character classes (BAD - not parsed correctly) std::regex r_nested("[[a-f]A-F]"); diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index 9ab709db8920..d82f3aa23547 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -1,8 +1,8 @@ groupNumber -| regexp.cpp:54:20:54:24 | (foo) | 1 | -| regexp.cpp:55:22:55:26 | (o\|b) | 1 | -| regexp.cpp:56:20:56:27 | (a\|b\|cd) | 1 | -| regexp.cpp:60:21:60:24 | (a+) | 1 | +| regexp.cpp:55:20:55:24 | (foo) | 1 | +| regexp.cpp:56:22:56:26 | (o\|b) | 1 | +| regexp.cpp:57:20:57:27 | (a\|b\|cd) | 1 | +| regexp.cpp:61:21:61:24 | (a+) | 1 | term | regexp.cpp:18:19:18:21 | abc | RegExpConstant,RegExpNormalChar | | regexp.cpp:21:20:21:20 | a | RegExpConstant,RegExpNormalChar | @@ -59,182 +59,184 @@ term | regexp.cpp:37:21:37:21 | - | RegExpConstant,RegExpNormalChar | | regexp.cpp:38:19:38:21 | [\|] | RegExpCharacterClass | | regexp.cpp:38:20:38:20 | \| | RegExpConstant,RegExpNormalChar | -| regexp.cpp:41:22:41:27 | [[a-f] | RegExpCharacterClass | -| regexp.cpp:41:22:41:31 | [[a-f]A-F] | RegExpSequence | -| regexp.cpp:41:23:41:23 | [ | RegExpConstant,RegExpNormalChar | -| regexp.cpp:41:24:41:24 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:41:24:41:26 | a-f | RegExpCharacterRange | -| regexp.cpp:41:26:41:26 | f | RegExpConstant,RegExpNormalChar | -| regexp.cpp:41:28:41:31 | A-F] | RegExpConstant,RegExpNormalChar | -| regexp.cpp:44:21:44:21 | . | RegExpDot | -| regexp.cpp:44:21:44:22 | .* | RegExpStar | -| regexp.cpp:45:21:45:22 | \\w | RegExpCharacterClassEscape | -| regexp.cpp:45:21:45:23 | \\w+ | RegExpPlus | -| regexp.cpp:45:21:45:25 | \\w+\\W | RegExpSequence | -| regexp.cpp:45:24:45:25 | \\W | RegExpCharacterClassEscape | -| regexp.cpp:46:21:46:22 | \\s | RegExpCharacterClassEscape | -| regexp.cpp:46:21:46:24 | \\s\\S | RegExpSequence | -| regexp.cpp:46:23:46:24 | \\S | RegExpCharacterClassEscape | -| regexp.cpp:47:21:47:22 | \\d | RegExpCharacterClassEscape | -| regexp.cpp:47:21:47:24 | \\d\\D | RegExpSequence | -| regexp.cpp:47:23:47:24 | \\D | RegExpCharacterClassEscape | -| regexp.cpp:48:21:48:22 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:48:21:48:26 | \\n\\r\\t | RegExpSequence | -| regexp.cpp:48:23:48:24 | \\r | RegExpConstant,RegExpEscape | -| regexp.cpp:48:25:48:26 | \\t | RegExpConstant,RegExpEscape | -| regexp.cpp:51:20:51:21 | \\b | RegExpSpecialChar | -| regexp.cpp:51:20:51:25 | \\b!a\\B | RegExpSequence | -| regexp.cpp:51:22:51:23 | !a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:51:24:51:25 | \\B | RegExpNonWordBoundary | -| regexp.cpp:54:20:54:24 | (foo) | RegExpGroup | -| regexp.cpp:54:20:54:25 | (foo)* | RegExpStar | -| regexp.cpp:54:20:54:28 | (foo)*bar | RegExpSequence | -| regexp.cpp:54:21:54:23 | foo | RegExpConstant,RegExpNormalChar | -| regexp.cpp:54:26:54:28 | bar | RegExpConstant,RegExpNormalChar | -| regexp.cpp:55:20:55:21 | fo | RegExpConstant,RegExpNormalChar | -| regexp.cpp:55:20:55:28 | fo(o\|b)ar | RegExpSequence | -| regexp.cpp:55:22:55:26 | (o\|b) | RegExpGroup | -| regexp.cpp:55:23:55:23 | o | RegExpConstant,RegExpNormalChar | -| regexp.cpp:55:23:55:25 | o\|b | RegExpAlt | -| regexp.cpp:55:25:55:25 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:55:27:55:28 | ar | RegExpConstant,RegExpNormalChar | -| regexp.cpp:56:20:56:27 | (a\|b\|cd) | RegExpGroup | -| regexp.cpp:56:20:56:28 | (a\|b\|cd)e | RegExpSequence | -| regexp.cpp:56:21:56:21 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:56:21:56:26 | a\|b\|cd | RegExpAlt | -| regexp.cpp:56:23:56:23 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:56:25:56:26 | cd | RegExpConstant,RegExpNormalChar | -| regexp.cpp:56:28:56:28 | e | RegExpConstant,RegExpNormalChar | -| regexp.cpp:57:20:57:25 | (?::+) | RegExpGroup | -| regexp.cpp:57:20:57:27 | (?::+)\\w | RegExpSequence | -| regexp.cpp:57:23:57:23 | : | RegExpConstant,RegExpNormalChar | -| regexp.cpp:57:23:57:24 | :+ | RegExpPlus | -| regexp.cpp:57:26:57:27 | \\w | RegExpCharacterClassEscape | -| regexp.cpp:60:21:60:24 | (a+) | RegExpGroup | -| regexp.cpp:60:21:60:28 | (a+)b+\\1 | RegExpSequence | -| regexp.cpp:60:22:60:22 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:60:22:60:23 | a+ | RegExpPlus | -| regexp.cpp:60:25:60:25 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:60:25:60:26 | b+ | RegExpPlus | -| regexp.cpp:60:27:60:28 | \\1 | RegExpBackRef | -| regexp.cpp:63:21:63:31 | [[:alnum:]] | RegExpCharacterClass | -| regexp.cpp:63:21:63:32 | [[:alnum:]]* | RegExpStar | -| regexp.cpp:63:22:63:30 | [:alnum:] | RegExpNamedCharacterProperty | -| regexp.cpp:64:21:64:31 | [[:digit:]] | RegExpCharacterClass | -| regexp.cpp:64:21:64:32 | [[:digit:]]+ | RegExpPlus | -| regexp.cpp:64:22:64:30 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.cpp:65:21:65:31 | [[:alnum:]] | RegExpCharacterClass | -| regexp.cpp:65:21:65:36 | [[:alnum:]]{2,3} | RegExpRange | -| regexp.cpp:65:22:65:30 | [:alnum:] | RegExpNamedCharacterProperty | -| regexp.cpp:66:21:66:34 | [a-f[:digit:]] | RegExpCharacterClass | -| regexp.cpp:66:21:66:35 | [a-f[:digit:]]+ | RegExpPlus | -| regexp.cpp:66:22:66:22 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:66:22:66:24 | a-f | RegExpCharacterRange | -| regexp.cpp:66:24:66:24 | f | RegExpConstant,RegExpNormalChar | -| regexp.cpp:66:25:66:33 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.cpp:69:22:69:32 | [[:alpha:]] | RegExpCharacterClass | -| regexp.cpp:69:22:69:43 | [[:alpha:]][[:digit:]] | RegExpSequence | -| regexp.cpp:69:23:69:31 | [:alpha:] | RegExpNamedCharacterProperty | -| regexp.cpp:69:33:69:43 | [[:digit:]] | RegExpCharacterClass | -| regexp.cpp:69:34:69:42 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.cpp:72:22:72:41 | [[:alpha:][:digit:]] | RegExpCharacterClass | -| regexp.cpp:72:23:72:31 | [:alpha:] | RegExpNamedCharacterProperty | -| regexp.cpp:72:32:72:40 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.cpp:75:22:75:38 | [A-F[:digit:]a-f] | RegExpCharacterClass | -| regexp.cpp:75:23:75:23 | A | RegExpConstant,RegExpNormalChar | -| regexp.cpp:75:23:75:25 | A-F | RegExpCharacterRange | -| regexp.cpp:75:25:75:25 | F | RegExpConstant,RegExpNormalChar | -| regexp.cpp:75:26:75:34 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.cpp:75:35:75:35 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:75:35:75:37 | a-f | RegExpCharacterRange | -| regexp.cpp:75:37:75:37 | f | RegExpConstant,RegExpNormalChar | -| regexp.cpp:78:27:78:33 | [[.a.]] | RegExpCharacterClass | -| regexp.cpp:78:28:78:32 | [.a.] | RegExpNamedCharacterProperty | -| regexp.cpp:79:27:79:39 | [A-F[.b.]a-f] | RegExpCharacterClass | -| regexp.cpp:79:28:79:28 | A | RegExpConstant,RegExpNormalChar | -| regexp.cpp:79:28:79:30 | A-F | RegExpCharacterRange | -| regexp.cpp:79:30:79:30 | F | RegExpConstant,RegExpNormalChar | -| regexp.cpp:79:31:79:35 | [.b.] | RegExpNamedCharacterProperty | -| regexp.cpp:79:36:79:36 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:79:36:79:38 | a-f | RegExpCharacterRange | -| regexp.cpp:79:38:79:38 | f | RegExpConstant,RegExpNormalChar | -| regexp.cpp:82:28:82:34 | [[=a=]] | RegExpCharacterClass | -| regexp.cpp:82:29:82:33 | [=a=] | RegExpNamedCharacterProperty | -| regexp.cpp:83:28:83:40 | [A-F[=b=]a-f] | RegExpCharacterClass | -| regexp.cpp:83:29:83:29 | A | RegExpConstant,RegExpNormalChar | -| regexp.cpp:83:29:83:31 | A-F | RegExpCharacterRange | -| regexp.cpp:83:31:83:31 | F | RegExpConstant,RegExpNormalChar | -| regexp.cpp:83:32:83:36 | [=b=] | RegExpNamedCharacterProperty | -| regexp.cpp:83:37:83:37 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:83:37:83:39 | a-f | RegExpCharacterRange | -| regexp.cpp:83:39:83:39 | f | RegExpConstant,RegExpNormalChar | -| regexp.cpp:86:22:86:30 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.cpp:89:19:89:24 | \\u0061 | RegExpConstant,RegExpEscape | -| regexp.cpp:92:21:92:23 | \\cA | RegExpConstant,RegExpEscape | -| regexp.cpp:93:21:93:25 | [\\cZ] | RegExpCharacterClass | -| regexp.cpp:93:22:93:24 | \\cZ | RegExpConstant,RegExpEscape | -| regexp.cpp:96:20:96:21 | \\0 | RegExpConstant,RegExpEscape | -| regexp.cpp:97:20:97:23 | [\\0] | RegExpCharacterClass | -| regexp.cpp:97:21:97:22 | \\0 | RegExpConstant,RegExpEscape | -| regexp.cpp:100:21:100:21 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:100:21:100:23 | a*? | RegExpStar | -| regexp.cpp:101:21:101:21 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:101:21:101:23 | b+? | RegExpPlus | -| regexp.cpp:102:21:102:21 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:102:21:102:23 | c?? | RegExpOpt | -| regexp.cpp:103:21:103:21 | d | RegExpConstant,RegExpNormalChar | -| regexp.cpp:103:21:103:27 | d{2,3}? | RegExpQuantifier | -| regexp.cpp:104:18:104:19 | \\f | RegExpConstant,RegExpEscape | -| regexp.cpp:104:18:104:21 | \\f\\v | RegExpSequence | -| regexp.cpp:104:20:104:21 | \\v | RegExpConstant,RegExpEscape | -| regexp.cpp:107:25:107:25 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:107:25:107:28 | a\\nb | RegExpSequence | -| regexp.cpp:107:26:107:27 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:107:28:107:28 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:108:37:108:37 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:108:37:108:40 | a\\nc | RegExpSequence | -| regexp.cpp:108:38:108:39 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:108:40:108:40 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:109:39:109:39 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:109:39:109:42 | a\\nc | RegExpSequence | -| regexp.cpp:109:40:109:41 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:109:42:109:42 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:110:38:110:38 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:110:38:110:41 | a\\nc | RegExpSequence | -| regexp.cpp:110:39:110:40 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:110:41:110:41 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:39:20:39:23 | [\\b] | RegExpCharacterClass | +| regexp.cpp:39:21:39:22 | \\b | RegExpConstant,RegExpEscape | +| regexp.cpp:42:22:42:27 | [[a-f] | RegExpCharacterClass | +| regexp.cpp:42:22:42:31 | [[a-f]A-F] | RegExpSequence | +| regexp.cpp:42:23:42:23 | [ | RegExpConstant,RegExpNormalChar | +| regexp.cpp:42:24:42:24 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:42:24:42:26 | a-f | RegExpCharacterRange | +| regexp.cpp:42:26:42:26 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:42:28:42:31 | A-F] | RegExpConstant,RegExpNormalChar | +| regexp.cpp:45:21:45:21 | . | RegExpDot | +| regexp.cpp:45:21:45:22 | .* | RegExpStar | +| regexp.cpp:46:21:46:22 | \\w | RegExpCharacterClassEscape | +| regexp.cpp:46:21:46:23 | \\w+ | RegExpPlus | +| regexp.cpp:46:21:46:25 | \\w+\\W | RegExpSequence | +| regexp.cpp:46:24:46:25 | \\W | RegExpCharacterClassEscape | +| regexp.cpp:47:21:47:22 | \\s | RegExpCharacterClassEscape | +| regexp.cpp:47:21:47:24 | \\s\\S | RegExpSequence | +| regexp.cpp:47:23:47:24 | \\S | RegExpCharacterClassEscape | +| regexp.cpp:48:21:48:22 | \\d | RegExpCharacterClassEscape | +| regexp.cpp:48:21:48:24 | \\d\\D | RegExpSequence | +| regexp.cpp:48:23:48:24 | \\D | RegExpCharacterClassEscape | +| regexp.cpp:49:21:49:22 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:49:21:49:26 | \\n\\r\\t | RegExpSequence | +| regexp.cpp:49:23:49:24 | \\r | RegExpConstant,RegExpEscape | +| regexp.cpp:49:25:49:26 | \\t | RegExpConstant,RegExpEscape | +| regexp.cpp:52:20:52:21 | \\b | RegExpSpecialChar | +| regexp.cpp:52:20:52:25 | \\b!a\\B | RegExpSequence | +| regexp.cpp:52:22:52:23 | !a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:52:24:52:25 | \\B | RegExpNonWordBoundary | +| regexp.cpp:55:20:55:24 | (foo) | RegExpGroup | +| regexp.cpp:55:20:55:25 | (foo)* | RegExpStar | +| regexp.cpp:55:20:55:28 | (foo)*bar | RegExpSequence | +| regexp.cpp:55:21:55:23 | foo | RegExpConstant,RegExpNormalChar | +| regexp.cpp:55:26:55:28 | bar | RegExpConstant,RegExpNormalChar | +| regexp.cpp:56:20:56:21 | fo | RegExpConstant,RegExpNormalChar | +| regexp.cpp:56:20:56:28 | fo(o\|b)ar | RegExpSequence | +| regexp.cpp:56:22:56:26 | (o\|b) | RegExpGroup | +| regexp.cpp:56:23:56:23 | o | RegExpConstant,RegExpNormalChar | +| regexp.cpp:56:23:56:25 | o\|b | RegExpAlt | +| regexp.cpp:56:25:56:25 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:56:27:56:28 | ar | RegExpConstant,RegExpNormalChar | +| regexp.cpp:57:20:57:27 | (a\|b\|cd) | RegExpGroup | +| regexp.cpp:57:20:57:28 | (a\|b\|cd)e | RegExpSequence | +| regexp.cpp:57:21:57:21 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:57:21:57:26 | a\|b\|cd | RegExpAlt | +| regexp.cpp:57:23:57:23 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:57:25:57:26 | cd | RegExpConstant,RegExpNormalChar | +| regexp.cpp:57:28:57:28 | e | RegExpConstant,RegExpNormalChar | +| regexp.cpp:58:20:58:25 | (?::+) | RegExpGroup | +| regexp.cpp:58:20:58:27 | (?::+)\\w | RegExpSequence | +| regexp.cpp:58:23:58:23 | : | RegExpConstant,RegExpNormalChar | +| regexp.cpp:58:23:58:24 | :+ | RegExpPlus | +| regexp.cpp:58:26:58:27 | \\w | RegExpCharacterClassEscape | +| regexp.cpp:61:21:61:24 | (a+) | RegExpGroup | +| regexp.cpp:61:21:61:28 | (a+)b+\\1 | RegExpSequence | +| regexp.cpp:61:22:61:22 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:61:22:61:23 | a+ | RegExpPlus | +| regexp.cpp:61:25:61:25 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:61:25:61:26 | b+ | RegExpPlus | +| regexp.cpp:61:27:61:28 | \\1 | RegExpBackRef | +| regexp.cpp:64:21:64:31 | [[:alnum:]] | RegExpCharacterClass | +| regexp.cpp:64:21:64:32 | [[:alnum:]]* | RegExpStar | +| regexp.cpp:64:22:64:30 | [:alnum:] | RegExpNamedCharacterProperty | +| regexp.cpp:65:21:65:31 | [[:digit:]] | RegExpCharacterClass | +| regexp.cpp:65:21:65:32 | [[:digit:]]+ | RegExpPlus | +| regexp.cpp:65:22:65:30 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:66:21:66:31 | [[:alnum:]] | RegExpCharacterClass | +| regexp.cpp:66:21:66:36 | [[:alnum:]]{2,3} | RegExpRange | +| regexp.cpp:66:22:66:30 | [:alnum:] | RegExpNamedCharacterProperty | +| regexp.cpp:67:21:67:34 | [a-f[:digit:]] | RegExpCharacterClass | +| regexp.cpp:67:21:67:35 | [a-f[:digit:]]+ | RegExpPlus | +| regexp.cpp:67:22:67:22 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:67:22:67:24 | a-f | RegExpCharacterRange | +| regexp.cpp:67:24:67:24 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:67:25:67:33 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:70:22:70:32 | [[:alpha:]] | RegExpCharacterClass | +| regexp.cpp:70:22:70:43 | [[:alpha:]][[:digit:]] | RegExpSequence | +| regexp.cpp:70:23:70:31 | [:alpha:] | RegExpNamedCharacterProperty | +| regexp.cpp:70:33:70:43 | [[:digit:]] | RegExpCharacterClass | +| regexp.cpp:70:34:70:42 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:73:22:73:41 | [[:alpha:][:digit:]] | RegExpCharacterClass | +| regexp.cpp:73:23:73:31 | [:alpha:] | RegExpNamedCharacterProperty | +| regexp.cpp:73:32:73:40 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:76:22:76:38 | [A-F[:digit:]a-f] | RegExpCharacterClass | +| regexp.cpp:76:23:76:23 | A | RegExpConstant,RegExpNormalChar | +| regexp.cpp:76:23:76:25 | A-F | RegExpCharacterRange | +| regexp.cpp:76:25:76:25 | F | RegExpConstant,RegExpNormalChar | +| regexp.cpp:76:26:76:34 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:76:35:76:35 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:76:35:76:37 | a-f | RegExpCharacterRange | +| regexp.cpp:76:37:76:37 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:79:27:79:33 | [[.a.]] | RegExpCharacterClass | +| regexp.cpp:79:28:79:32 | [.a.] | RegExpNamedCharacterProperty | +| regexp.cpp:80:27:80:39 | [A-F[.b.]a-f] | RegExpCharacterClass | +| regexp.cpp:80:28:80:28 | A | RegExpConstant,RegExpNormalChar | +| regexp.cpp:80:28:80:30 | A-F | RegExpCharacterRange | +| regexp.cpp:80:30:80:30 | F | RegExpConstant,RegExpNormalChar | +| regexp.cpp:80:31:80:35 | [.b.] | RegExpNamedCharacterProperty | +| regexp.cpp:80:36:80:36 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:80:36:80:38 | a-f | RegExpCharacterRange | +| regexp.cpp:80:38:80:38 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:83:28:83:34 | [[=a=]] | RegExpCharacterClass | +| regexp.cpp:83:29:83:33 | [=a=] | RegExpNamedCharacterProperty | +| regexp.cpp:84:28:84:40 | [A-F[=b=]a-f] | RegExpCharacterClass | +| regexp.cpp:84:29:84:29 | A | RegExpConstant,RegExpNormalChar | +| regexp.cpp:84:29:84:31 | A-F | RegExpCharacterRange | +| regexp.cpp:84:31:84:31 | F | RegExpConstant,RegExpNormalChar | +| regexp.cpp:84:32:84:36 | [=b=] | RegExpNamedCharacterProperty | +| regexp.cpp:84:37:84:37 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:84:37:84:39 | a-f | RegExpCharacterRange | +| regexp.cpp:84:39:84:39 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:87:22:87:30 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:90:19:90:24 | \\u0061 | RegExpConstant,RegExpEscape | +| regexp.cpp:93:21:93:23 | \\cA | RegExpConstant,RegExpEscape | +| regexp.cpp:94:21:94:25 | [\\cZ] | RegExpCharacterClass | +| regexp.cpp:94:22:94:24 | \\cZ | RegExpConstant,RegExpEscape | +| regexp.cpp:97:20:97:21 | \\0 | RegExpConstant,RegExpEscape | +| regexp.cpp:98:20:98:23 | [\\0] | RegExpCharacterClass | +| regexp.cpp:98:21:98:22 | \\0 | RegExpConstant,RegExpEscape | +| regexp.cpp:101:21:101:21 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:101:21:101:23 | a*? | RegExpStar | +| regexp.cpp:102:21:102:21 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:102:21:102:23 | b+? | RegExpPlus | +| regexp.cpp:103:21:103:21 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:103:21:103:23 | c?? | RegExpOpt | +| regexp.cpp:104:21:104:21 | d | RegExpConstant,RegExpNormalChar | +| regexp.cpp:104:21:104:27 | d{2,3}? | RegExpQuantifier | +| regexp.cpp:105:18:105:19 | \\f | RegExpConstant,RegExpEscape | +| regexp.cpp:105:18:105:21 | \\f\\v | RegExpSequence | +| regexp.cpp:105:20:105:21 | \\v | RegExpConstant,RegExpEscape | +| regexp.cpp:108:25:108:25 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:108:25:108:28 | a\\nb | RegExpSequence | +| regexp.cpp:108:26:108:27 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:108:28:108:28 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:109:37:109:37 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:109:37:109:40 | a\\nc | RegExpSequence | +| regexp.cpp:109:38:109:39 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:109:40:109:40 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:110:39:110:39 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:110:39:110:42 | a\\nc | RegExpSequence | +| regexp.cpp:110:40:110:41 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:110:42:110:42 | c | RegExpConstant,RegExpNormalChar | | regexp.cpp:111:38:111:38 | a | RegExpConstant,RegExpNormalChar | | regexp.cpp:111:38:111:41 | a\\nc | RegExpSequence | | regexp.cpp:111:39:111:40 | \\n | RegExpConstant,RegExpEscape | | regexp.cpp:111:41:111:41 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:112:23:112:23 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:112:23:112:26 | a\\nc | RegExpSequence | -| regexp.cpp:112:24:112:25 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:112:26:112:26 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:113:40:113:40 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:113:40:113:43 | a\\nc | RegExpSequence | -| regexp.cpp:113:41:113:42 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:113:43:113:43 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:114:42:114:42 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:114:42:114:45 | a\\nc | RegExpSequence | -| regexp.cpp:114:43:114:44 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:114:45:114:45 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:115:41:115:41 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:115:41:115:44 | a\\nc | RegExpSequence | -| regexp.cpp:115:42:115:43 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:115:44:115:44 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:112:38:112:38 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:112:38:112:41 | a\\nc | RegExpSequence | +| regexp.cpp:112:39:112:40 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:112:41:112:41 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:113:23:113:23 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:113:23:113:26 | a\\nc | RegExpSequence | +| regexp.cpp:113:24:113:25 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:113:26:113:26 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:114:40:114:40 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:114:40:114:43 | a\\nc | RegExpSequence | +| regexp.cpp:114:41:114:42 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:114:43:114:43 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:115:42:115:42 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:115:42:115:45 | a\\nc | RegExpSequence | +| regexp.cpp:115:43:115:44 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:115:45:115:45 | c | RegExpConstant,RegExpNormalChar | | regexp.cpp:116:41:116:41 | a | RegExpConstant,RegExpNormalChar | | regexp.cpp:116:41:116:44 | a\\nc | RegExpSequence | | regexp.cpp:116:42:116:43 | \\n | RegExpConstant,RegExpEscape | | regexp.cpp:116:44:116:44 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:117:25:117:25 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:117:25:117:28 | a\\nc | RegExpSequence | -| regexp.cpp:117:26:117:27 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:117:28:117:28 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:118:29:118:29 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:118:29:118:32 | a\\nc | RegExpSequence | -| regexp.cpp:118:30:118:31 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:118:32:118:32 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:117:41:117:41 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:117:41:117:44 | a\\nc | RegExpSequence | +| regexp.cpp:117:42:117:43 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:117:44:117:44 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:118:25:118:25 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:118:25:118:28 | a\\nc | RegExpSequence | +| regexp.cpp:118:26:118:27 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:118:28:118:28 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:119:29:119:29 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:119:29:119:32 | a\\nc | RegExpSequence | +| regexp.cpp:119:30:119:31 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:119:32:119:32 | c | RegExpConstant,RegExpNormalChar | regExpNormalCharValue | regexp.cpp:18:19:18:21 | abc | abc | | regexp.cpp:21:20:21:20 | a | a | @@ -268,92 +270,93 @@ regExpNormalCharValue | regexp.cpp:36:21:36:21 | ] | ] | | regexp.cpp:37:21:37:21 | - | - | | regexp.cpp:38:20:38:20 | \| | \| | -| regexp.cpp:41:23:41:23 | [ | [ | -| regexp.cpp:41:24:41:24 | a | a | -| regexp.cpp:41:26:41:26 | f | f | -| regexp.cpp:41:28:41:31 | A-F] | A-F] | -| regexp.cpp:45:21:45:22 | \\w | w | -| regexp.cpp:45:24:45:25 | \\W | W | -| regexp.cpp:46:21:46:22 | \\s | s | -| regexp.cpp:46:23:46:24 | \\S | S | -| regexp.cpp:47:21:47:22 | \\d | d | -| regexp.cpp:47:23:47:24 | \\D | D | -| regexp.cpp:48:21:48:22 | \\n | \n | -| regexp.cpp:48:23:48:24 | \\r | \r | -| regexp.cpp:48:25:48:26 | \\t | \t | -| regexp.cpp:51:22:51:23 | !a | !a | -| regexp.cpp:54:21:54:23 | foo | foo | -| regexp.cpp:54:26:54:28 | bar | bar | -| regexp.cpp:55:20:55:21 | fo | fo | -| regexp.cpp:55:23:55:23 | o | o | -| regexp.cpp:55:25:55:25 | b | b | -| regexp.cpp:55:27:55:28 | ar | ar | -| regexp.cpp:56:21:56:21 | a | a | -| regexp.cpp:56:23:56:23 | b | b | -| regexp.cpp:56:25:56:26 | cd | cd | -| regexp.cpp:56:28:56:28 | e | e | -| regexp.cpp:57:23:57:23 | : | : | -| regexp.cpp:57:26:57:27 | \\w | w | -| regexp.cpp:60:22:60:22 | a | a | -| regexp.cpp:60:25:60:25 | b | b | -| regexp.cpp:66:22:66:22 | a | a | -| regexp.cpp:66:24:66:24 | f | f | -| regexp.cpp:75:23:75:23 | A | A | -| regexp.cpp:75:25:75:25 | F | F | -| regexp.cpp:75:35:75:35 | a | a | -| regexp.cpp:75:37:75:37 | f | f | -| regexp.cpp:79:28:79:28 | A | A | -| regexp.cpp:79:30:79:30 | F | F | -| regexp.cpp:79:36:79:36 | a | a | -| regexp.cpp:79:38:79:38 | f | f | -| regexp.cpp:83:29:83:29 | A | A | -| regexp.cpp:83:31:83:31 | F | F | -| regexp.cpp:83:37:83:37 | a | a | -| regexp.cpp:83:39:83:39 | f | f | -| regexp.cpp:89:19:89:24 | \\u0061 | a | -| regexp.cpp:92:21:92:23 | \\cA | cA | -| regexp.cpp:93:22:93:24 | \\cZ | cZ | -| regexp.cpp:96:20:96:21 | \\0 | 0 | -| regexp.cpp:97:21:97:22 | \\0 | 0 | -| regexp.cpp:100:21:100:21 | a | a | -| regexp.cpp:101:21:101:21 | b | b | -| regexp.cpp:102:21:102:21 | c | c | -| regexp.cpp:103:21:103:21 | d | d | -| regexp.cpp:104:18:104:19 | \\f | \u000c | -| regexp.cpp:104:20:104:21 | \\v | \u000b | -| regexp.cpp:107:25:107:25 | a | a | -| regexp.cpp:107:26:107:27 | \\n | \n | -| regexp.cpp:107:28:107:28 | b | b | -| regexp.cpp:108:37:108:37 | a | a | -| regexp.cpp:108:38:108:39 | \\n | \n | -| regexp.cpp:108:40:108:40 | c | c | -| regexp.cpp:109:39:109:39 | a | a | -| regexp.cpp:109:40:109:41 | \\n | \n | -| regexp.cpp:109:42:109:42 | c | c | -| regexp.cpp:110:38:110:38 | a | a | -| regexp.cpp:110:39:110:40 | \\n | \n | -| regexp.cpp:110:41:110:41 | c | c | +| regexp.cpp:39:21:39:22 | \\b | b | +| regexp.cpp:42:23:42:23 | [ | [ | +| regexp.cpp:42:24:42:24 | a | a | +| regexp.cpp:42:26:42:26 | f | f | +| regexp.cpp:42:28:42:31 | A-F] | A-F] | +| regexp.cpp:46:21:46:22 | \\w | w | +| regexp.cpp:46:24:46:25 | \\W | W | +| regexp.cpp:47:21:47:22 | \\s | s | +| regexp.cpp:47:23:47:24 | \\S | S | +| regexp.cpp:48:21:48:22 | \\d | d | +| regexp.cpp:48:23:48:24 | \\D | D | +| regexp.cpp:49:21:49:22 | \\n | \n | +| regexp.cpp:49:23:49:24 | \\r | \r | +| regexp.cpp:49:25:49:26 | \\t | \t | +| regexp.cpp:52:22:52:23 | !a | !a | +| regexp.cpp:55:21:55:23 | foo | foo | +| regexp.cpp:55:26:55:28 | bar | bar | +| regexp.cpp:56:20:56:21 | fo | fo | +| regexp.cpp:56:23:56:23 | o | o | +| regexp.cpp:56:25:56:25 | b | b | +| regexp.cpp:56:27:56:28 | ar | ar | +| regexp.cpp:57:21:57:21 | a | a | +| regexp.cpp:57:23:57:23 | b | b | +| regexp.cpp:57:25:57:26 | cd | cd | +| regexp.cpp:57:28:57:28 | e | e | +| regexp.cpp:58:23:58:23 | : | : | +| regexp.cpp:58:26:58:27 | \\w | w | +| regexp.cpp:61:22:61:22 | a | a | +| regexp.cpp:61:25:61:25 | b | b | +| regexp.cpp:67:22:67:22 | a | a | +| regexp.cpp:67:24:67:24 | f | f | +| regexp.cpp:76:23:76:23 | A | A | +| regexp.cpp:76:25:76:25 | F | F | +| regexp.cpp:76:35:76:35 | a | a | +| regexp.cpp:76:37:76:37 | f | f | +| regexp.cpp:80:28:80:28 | A | A | +| regexp.cpp:80:30:80:30 | F | F | +| regexp.cpp:80:36:80:36 | a | a | +| regexp.cpp:80:38:80:38 | f | f | +| regexp.cpp:84:29:84:29 | A | A | +| regexp.cpp:84:31:84:31 | F | F | +| regexp.cpp:84:37:84:37 | a | a | +| regexp.cpp:84:39:84:39 | f | f | +| regexp.cpp:90:19:90:24 | \\u0061 | a | +| regexp.cpp:93:21:93:23 | \\cA | cA | +| regexp.cpp:94:22:94:24 | \\cZ | cZ | +| regexp.cpp:97:20:97:21 | \\0 | 0 | +| regexp.cpp:98:21:98:22 | \\0 | 0 | +| regexp.cpp:101:21:101:21 | a | a | +| regexp.cpp:102:21:102:21 | b | b | +| regexp.cpp:103:21:103:21 | c | c | +| regexp.cpp:104:21:104:21 | d | d | +| regexp.cpp:105:18:105:19 | \\f | \u000c | +| regexp.cpp:105:20:105:21 | \\v | \u000b | +| regexp.cpp:108:25:108:25 | a | a | +| regexp.cpp:108:26:108:27 | \\n | \n | +| regexp.cpp:108:28:108:28 | b | b | +| regexp.cpp:109:37:109:37 | a | a | +| regexp.cpp:109:38:109:39 | \\n | \n | +| regexp.cpp:109:40:109:40 | c | c | +| regexp.cpp:110:39:110:39 | a | a | +| regexp.cpp:110:40:110:41 | \\n | \n | +| regexp.cpp:110:42:110:42 | c | c | | regexp.cpp:111:38:111:38 | a | a | | regexp.cpp:111:39:111:40 | \\n | \n | | regexp.cpp:111:41:111:41 | c | c | -| regexp.cpp:112:23:112:23 | a | a | -| regexp.cpp:112:24:112:25 | \\n | \n | -| regexp.cpp:112:26:112:26 | c | c | -| regexp.cpp:113:40:113:40 | a | a | -| regexp.cpp:113:41:113:42 | \\n | \n | -| regexp.cpp:113:43:113:43 | c | c | -| regexp.cpp:114:42:114:42 | a | a | -| regexp.cpp:114:43:114:44 | \\n | \n | -| regexp.cpp:114:45:114:45 | c | c | -| regexp.cpp:115:41:115:41 | a | a | -| regexp.cpp:115:42:115:43 | \\n | \n | -| regexp.cpp:115:44:115:44 | c | c | +| regexp.cpp:112:38:112:38 | a | a | +| regexp.cpp:112:39:112:40 | \\n | \n | +| regexp.cpp:112:41:112:41 | c | c | +| regexp.cpp:113:23:113:23 | a | a | +| regexp.cpp:113:24:113:25 | \\n | \n | +| regexp.cpp:113:26:113:26 | c | c | +| regexp.cpp:114:40:114:40 | a | a | +| regexp.cpp:114:41:114:42 | \\n | \n | +| regexp.cpp:114:43:114:43 | c | c | +| regexp.cpp:115:42:115:42 | a | a | +| regexp.cpp:115:43:115:44 | \\n | \n | +| regexp.cpp:115:45:115:45 | c | c | | regexp.cpp:116:41:116:41 | a | a | | regexp.cpp:116:42:116:43 | \\n | \n | | regexp.cpp:116:44:116:44 | c | c | -| regexp.cpp:117:25:117:25 | a | a | -| regexp.cpp:117:26:117:27 | \\n | \n | -| regexp.cpp:117:28:117:28 | c | c | -| regexp.cpp:118:29:118:29 | a | a | -| regexp.cpp:118:30:118:31 | \\n | \n | -| regexp.cpp:118:32:118:32 | c | c | +| regexp.cpp:117:41:117:41 | a | a | +| regexp.cpp:117:42:117:43 | \\n | \n | +| regexp.cpp:117:44:117:44 | c | c | +| regexp.cpp:118:25:118:25 | a | a | +| regexp.cpp:118:26:118:27 | \\n | \n | +| regexp.cpp:118:28:118:28 | c | c | +| regexp.cpp:119:29:119:29 | a | a | +| regexp.cpp:119:30:119:31 | \\n | \n | +| regexp.cpp:119:32:119:32 | c | c | From 66c191a1c50df78983c46a0117c60a8dba851fb9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 23 Jul 2026 10:27:00 +0000 Subject: [PATCH 0184/2098] C++: Add change note for std::regex ECMAScript parser alignment --- .../change-notes/2026-07-23-std-regex-ecmascript-parser.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 cpp/ql/lib/change-notes/2026-07-23-std-regex-ecmascript-parser.md diff --git a/cpp/ql/lib/change-notes/2026-07-23-std-regex-ecmascript-parser.md b/cpp/ql/lib/change-notes/2026-07-23-std-regex-ecmascript-parser.md new file mode 100644 index 000000000000..f12261d73365 --- /dev/null +++ b/cpp/ql/lib/change-notes/2026-07-23-std-regex-ecmascript-parser.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added a C++ regular-expression parser for the ECMAScript grammar used by `std::regex`. From b2fc6a10d60a93d7a0d516b2003aa5866e3b8de6 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 7 Aug 2026 17:39:27 +0200 Subject: [PATCH 0185/2098] C++: Drop unneeded `\U` from `isUnicode` --- cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll index 013348c55363..a4ca0ada6633 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll @@ -609,7 +609,7 @@ private module Impl implements RegexTreeViewSig { /** * Holds if this is a unicode escape. */ - private predicate isUnicode() { this.getText().prefix(2) = ["\\u", "\\U"] } + private predicate isUnicode() { this.getText().prefix(2) = "\\u" } /** * Gets the unicode char for this escape. From aa141626ece673a4a9741c6205a888b8f98888e9 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 7 Aug 2026 17:45:36 +0200 Subject: [PATCH 0186/2098] C++: add hex escape test --- .../library-tests/regex/locations.expected | 43 ++-- .../test/library-tests/regex/parse.expected | 108 ++++----- cpp/ql/test/library-tests/regex/regexp.cpp | 3 + .../test/library-tests/regex/regexp.expected | 224 +++++++++--------- 4 files changed, 193 insertions(+), 185 deletions(-) diff --git a/cpp/ql/test/library-tests/regex/locations.expected b/cpp/ql/test/library-tests/regex/locations.expected index 5d57a25de42d..1e13b83cd2e7 100644 --- a/cpp/ql/test/library-tests/regex/locations.expected +++ b/cpp/ql/test/library-tests/regex/locations.expected @@ -39,24 +39,25 @@ | regexp.cpp:84:28:84:40 | [A-F[=b=]a-f] | regexp.cpp | 84 | 28 | 84 | 40 | | regexp.cpp:87:22:87:30 | [:digit:] | regexp.cpp | 87 | 22 | 87 | 30 | | regexp.cpp:90:19:90:24 | \\u0061 | regexp.cpp | 90 | 19 | 90 | 24 | -| regexp.cpp:93:21:93:23 | \\cA | regexp.cpp | 93 | 21 | 93 | 23 | -| regexp.cpp:94:21:94:25 | [\\cZ] | regexp.cpp | 94 | 21 | 94 | 25 | -| regexp.cpp:97:20:97:21 | \\0 | regexp.cpp | 97 | 20 | 97 | 21 | -| regexp.cpp:98:20:98:23 | [\\0] | regexp.cpp | 98 | 20 | 98 | 23 | -| regexp.cpp:101:21:101:23 | a*? | regexp.cpp | 101 | 21 | 101 | 23 | -| regexp.cpp:102:21:102:23 | b+? | regexp.cpp | 102 | 21 | 102 | 23 | -| regexp.cpp:103:21:103:23 | c?? | regexp.cpp | 103 | 21 | 103 | 23 | -| regexp.cpp:104:21:104:27 | d{2,3}? | regexp.cpp | 104 | 21 | 104 | 27 | -| regexp.cpp:105:18:105:21 | \\f\\v | regexp.cpp | 105 | 18 | 105 | 21 | -| regexp.cpp:108:25:108:28 | a\\nb | regexp.cpp | 108 | 25 | 108 | 28 | -| regexp.cpp:109:37:109:40 | a\\nc | regexp.cpp | 109 | 37 | 109 | 40 | -| regexp.cpp:110:39:110:42 | a\\nc | regexp.cpp | 110 | 39 | 110 | 42 | -| regexp.cpp:111:38:111:41 | a\\nc | regexp.cpp | 111 | 38 | 111 | 41 | -| regexp.cpp:112:38:112:41 | a\\nc | regexp.cpp | 112 | 38 | 112 | 41 | -| regexp.cpp:113:23:113:26 | a\\nc | regexp.cpp | 113 | 23 | 113 | 26 | -| regexp.cpp:114:40:114:43 | a\\nc | regexp.cpp | 114 | 40 | 114 | 43 | -| regexp.cpp:115:42:115:45 | a\\nc | regexp.cpp | 115 | 42 | 115 | 45 | -| regexp.cpp:116:41:116:44 | a\\nc | regexp.cpp | 116 | 41 | 116 | 44 | -| regexp.cpp:117:41:117:44 | a\\nc | regexp.cpp | 117 | 41 | 117 | 44 | -| regexp.cpp:118:25:118:28 | a\\nc | regexp.cpp | 118 | 25 | 118 | 28 | -| regexp.cpp:119:29:119:32 | a\\nc | regexp.cpp | 119 | 29 | 119 | 32 | +| regexp.cpp:93:19:93:22 | \\x61 | regexp.cpp | 93 | 19 | 93 | 22 | +| regexp.cpp:96:21:96:23 | \\cA | regexp.cpp | 96 | 21 | 96 | 23 | +| regexp.cpp:97:21:97:25 | [\\cZ] | regexp.cpp | 97 | 21 | 97 | 25 | +| regexp.cpp:100:20:100:21 | \\0 | regexp.cpp | 100 | 20 | 100 | 21 | +| regexp.cpp:101:20:101:23 | [\\0] | regexp.cpp | 101 | 20 | 101 | 23 | +| regexp.cpp:104:21:104:23 | a*? | regexp.cpp | 104 | 21 | 104 | 23 | +| regexp.cpp:105:21:105:23 | b+? | regexp.cpp | 105 | 21 | 105 | 23 | +| regexp.cpp:106:21:106:23 | c?? | regexp.cpp | 106 | 21 | 106 | 23 | +| regexp.cpp:107:21:107:27 | d{2,3}? | regexp.cpp | 107 | 21 | 107 | 27 | +| regexp.cpp:108:18:108:21 | \\f\\v | regexp.cpp | 108 | 18 | 108 | 21 | +| regexp.cpp:111:25:111:28 | a\\nb | regexp.cpp | 111 | 25 | 111 | 28 | +| regexp.cpp:112:37:112:40 | a\\nc | regexp.cpp | 112 | 37 | 112 | 40 | +| regexp.cpp:113:39:113:42 | a\\nc | regexp.cpp | 113 | 39 | 113 | 42 | +| regexp.cpp:114:38:114:41 | a\\nc | regexp.cpp | 114 | 38 | 114 | 41 | +| regexp.cpp:115:38:115:41 | a\\nc | regexp.cpp | 115 | 38 | 115 | 41 | +| regexp.cpp:116:23:116:26 | a\\nc | regexp.cpp | 116 | 23 | 116 | 26 | +| regexp.cpp:117:40:117:43 | a\\nc | regexp.cpp | 117 | 40 | 117 | 43 | +| regexp.cpp:118:42:118:45 | a\\nc | regexp.cpp | 118 | 42 | 118 | 45 | +| regexp.cpp:119:41:119:44 | a\\nc | regexp.cpp | 119 | 41 | 119 | 44 | +| regexp.cpp:120:41:120:44 | a\\nc | regexp.cpp | 120 | 41 | 120 | 44 | +| regexp.cpp:121:25:121:28 | a\\nc | regexp.cpp | 121 | 25 | 121 | 28 | +| regexp.cpp:122:29:122:32 | a\\nc | regexp.cpp | 122 | 29 | 122 | 32 | diff --git a/cpp/ql/test/library-tests/regex/parse.expected b/cpp/ql/test/library-tests/regex/parse.expected index 8993b650e1ea..b6c809ad91de 100644 --- a/cpp/ql/test/library-tests/regex/parse.expected +++ b/cpp/ql/test/library-tests/regex/parse.expected @@ -462,91 +462,60 @@ regexp.cpp: # 90| [RegExpConstant, RegExpEscape] \u0061 -# 93| [RegExpConstant, RegExpEscape] \cA +# 93| [RegExpConstant, RegExpEscape] \x61 -# 94| [RegExpCharacterClass] [\cZ] +# 96| [RegExpConstant, RegExpEscape] \cA + +# 97| [RegExpCharacterClass] [\cZ] #-----| 0 -> [RegExpConstant, RegExpEscape] \cZ -# 94| [RegExpConstant, RegExpEscape] \cZ +# 97| [RegExpConstant, RegExpEscape] \cZ -# 97| [RegExpConstant, RegExpEscape] \0 +# 100| [RegExpConstant, RegExpEscape] \0 -# 98| [RegExpCharacterClass] [\0] +# 101| [RegExpCharacterClass] [\0] #-----| 0 -> [RegExpConstant, RegExpEscape] \0 -# 98| [RegExpConstant, RegExpEscape] \0 +# 101| [RegExpConstant, RegExpEscape] \0 -# 101| [RegExpConstant, RegExpNormalChar] a +# 104| [RegExpConstant, RegExpNormalChar] a -# 101| [RegExpStar] a*? +# 104| [RegExpStar] a*? #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 102| [RegExpConstant, RegExpNormalChar] b +# 105| [RegExpConstant, RegExpNormalChar] b -# 102| [RegExpPlus] b+? +# 105| [RegExpPlus] b+? #-----| 0 -> [RegExpConstant, RegExpNormalChar] b -# 103| [RegExpConstant, RegExpNormalChar] c +# 106| [RegExpConstant, RegExpNormalChar] c -# 103| [RegExpOpt] c?? +# 106| [RegExpOpt] c?? #-----| 0 -> [RegExpConstant, RegExpNormalChar] c -# 104| [RegExpConstant, RegExpNormalChar] d +# 107| [RegExpConstant, RegExpNormalChar] d -# 104| [RegExpQuantifier] d{2,3}? +# 107| [RegExpQuantifier] d{2,3}? #-----| 0 -> [RegExpConstant, RegExpNormalChar] d -# 105| [RegExpConstant, RegExpEscape] \f +# 108| [RegExpConstant, RegExpEscape] \f -# 105| [RegExpSequence] \f\v +# 108| [RegExpSequence] \f\v #-----| 0 -> [RegExpConstant, RegExpEscape] \f #-----| 1 -> [RegExpConstant, RegExpEscape] \v -# 105| [RegExpConstant, RegExpEscape] \v - -# 108| [RegExpConstant, RegExpNormalChar] a - -# 108| [RegExpSequence] a\nb -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] b - -# 108| [RegExpConstant, RegExpEscape] \n - -# 108| [RegExpConstant, RegExpNormalChar] b - -# 109| [RegExpConstant, RegExpNormalChar] a - -# 109| [RegExpSequence] a\nc -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c - -# 109| [RegExpConstant, RegExpEscape] \n - -# 109| [RegExpConstant, RegExpNormalChar] c - -# 110| [RegExpConstant, RegExpNormalChar] a - -# 110| [RegExpSequence] a\nc -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c - -# 110| [RegExpConstant, RegExpEscape] \n - -# 110| [RegExpConstant, RegExpNormalChar] c +# 108| [RegExpConstant, RegExpEscape] \v # 111| [RegExpConstant, RegExpNormalChar] a -# 111| [RegExpSequence] a\nc +# 111| [RegExpSequence] a\nb #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c +#-----| 2 -> [RegExpConstant, RegExpNormalChar] b # 111| [RegExpConstant, RegExpEscape] \n -# 111| [RegExpConstant, RegExpNormalChar] c +# 111| [RegExpConstant, RegExpNormalChar] b # 112| [RegExpConstant, RegExpNormalChar] a @@ -635,3 +604,36 @@ regexp.cpp: # 119| [RegExpConstant, RegExpEscape] \n # 119| [RegExpConstant, RegExpNormalChar] c + +# 120| [RegExpConstant, RegExpNormalChar] a + +# 120| [RegExpSequence] a\nc +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpEscape] \n +#-----| 2 -> [RegExpConstant, RegExpNormalChar] c + +# 120| [RegExpConstant, RegExpEscape] \n + +# 120| [RegExpConstant, RegExpNormalChar] c + +# 121| [RegExpConstant, RegExpNormalChar] a + +# 121| [RegExpSequence] a\nc +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpEscape] \n +#-----| 2 -> [RegExpConstant, RegExpNormalChar] c + +# 121| [RegExpConstant, RegExpEscape] \n + +# 121| [RegExpConstant, RegExpNormalChar] c + +# 122| [RegExpConstant, RegExpNormalChar] a + +# 122| [RegExpSequence] a\nc +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpEscape] \n +#-----| 2 -> [RegExpConstant, RegExpNormalChar] c + +# 122| [RegExpConstant, RegExpEscape] \n + +# 122| [RegExpConstant, RegExpNormalChar] c diff --git a/cpp/ql/test/library-tests/regex/regexp.cpp b/cpp/ql/test/library-tests/regex/regexp.cpp index b1cfd64aa5c5..c26794296179 100644 --- a/cpp/ql/test/library-tests/regex/regexp.cpp +++ b/cpp/ql/test/library-tests/regex/regexp.cpp @@ -89,6 +89,9 @@ std::regex r_posix4("[:digit:]"); // unicode std::regex r_uni("\\u0061"); +// hex +std::regex r_hex("\\x61"); + // control escapes std::regex r_ctrl1("\\cA"); std::regex r_ctrl2("[\\cZ]"); diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index d82f3aa23547..95159d356332 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -172,71 +172,72 @@ term | regexp.cpp:84:39:84:39 | f | RegExpConstant,RegExpNormalChar | | regexp.cpp:87:22:87:30 | [:digit:] | RegExpNamedCharacterProperty | | regexp.cpp:90:19:90:24 | \\u0061 | RegExpConstant,RegExpEscape | -| regexp.cpp:93:21:93:23 | \\cA | RegExpConstant,RegExpEscape | -| regexp.cpp:94:21:94:25 | [\\cZ] | RegExpCharacterClass | -| regexp.cpp:94:22:94:24 | \\cZ | RegExpConstant,RegExpEscape | -| regexp.cpp:97:20:97:21 | \\0 | RegExpConstant,RegExpEscape | -| regexp.cpp:98:20:98:23 | [\\0] | RegExpCharacterClass | -| regexp.cpp:98:21:98:22 | \\0 | RegExpConstant,RegExpEscape | -| regexp.cpp:101:21:101:21 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:101:21:101:23 | a*? | RegExpStar | -| regexp.cpp:102:21:102:21 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:102:21:102:23 | b+? | RegExpPlus | -| regexp.cpp:103:21:103:21 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:103:21:103:23 | c?? | RegExpOpt | -| regexp.cpp:104:21:104:21 | d | RegExpConstant,RegExpNormalChar | -| regexp.cpp:104:21:104:27 | d{2,3}? | RegExpQuantifier | -| regexp.cpp:105:18:105:19 | \\f | RegExpConstant,RegExpEscape | -| regexp.cpp:105:18:105:21 | \\f\\v | RegExpSequence | -| regexp.cpp:105:20:105:21 | \\v | RegExpConstant,RegExpEscape | -| regexp.cpp:108:25:108:25 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:108:25:108:28 | a\\nb | RegExpSequence | -| regexp.cpp:108:26:108:27 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:108:28:108:28 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:109:37:109:37 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:109:37:109:40 | a\\nc | RegExpSequence | -| regexp.cpp:109:38:109:39 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:109:40:109:40 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:110:39:110:39 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:110:39:110:42 | a\\nc | RegExpSequence | -| regexp.cpp:110:40:110:41 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:110:42:110:42 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:111:38:111:38 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:111:38:111:41 | a\\nc | RegExpSequence | -| regexp.cpp:111:39:111:40 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:111:41:111:41 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:112:38:112:38 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:112:38:112:41 | a\\nc | RegExpSequence | -| regexp.cpp:112:39:112:40 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:112:41:112:41 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:113:23:113:23 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:113:23:113:26 | a\\nc | RegExpSequence | -| regexp.cpp:113:24:113:25 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:113:26:113:26 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:114:40:114:40 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:114:40:114:43 | a\\nc | RegExpSequence | -| regexp.cpp:114:41:114:42 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:114:43:114:43 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:115:42:115:42 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:115:42:115:45 | a\\nc | RegExpSequence | -| regexp.cpp:115:43:115:44 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:115:45:115:45 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:116:41:116:41 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:116:41:116:44 | a\\nc | RegExpSequence | -| regexp.cpp:116:42:116:43 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:116:44:116:44 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:117:41:117:41 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:117:41:117:44 | a\\nc | RegExpSequence | -| regexp.cpp:117:42:117:43 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:117:44:117:44 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:118:25:118:25 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:118:25:118:28 | a\\nc | RegExpSequence | -| regexp.cpp:118:26:118:27 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:118:28:118:28 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:119:29:119:29 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:119:29:119:32 | a\\nc | RegExpSequence | -| regexp.cpp:119:30:119:31 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:119:32:119:32 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:93:19:93:22 | \\x61 | RegExpConstant,RegExpEscape | +| regexp.cpp:96:21:96:23 | \\cA | RegExpConstant,RegExpEscape | +| regexp.cpp:97:21:97:25 | [\\cZ] | RegExpCharacterClass | +| regexp.cpp:97:22:97:24 | \\cZ | RegExpConstant,RegExpEscape | +| regexp.cpp:100:20:100:21 | \\0 | RegExpConstant,RegExpEscape | +| regexp.cpp:101:20:101:23 | [\\0] | RegExpCharacterClass | +| regexp.cpp:101:21:101:22 | \\0 | RegExpConstant,RegExpEscape | +| regexp.cpp:104:21:104:21 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:104:21:104:23 | a*? | RegExpStar | +| regexp.cpp:105:21:105:21 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:105:21:105:23 | b+? | RegExpPlus | +| regexp.cpp:106:21:106:21 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:106:21:106:23 | c?? | RegExpOpt | +| regexp.cpp:107:21:107:21 | d | RegExpConstant,RegExpNormalChar | +| regexp.cpp:107:21:107:27 | d{2,3}? | RegExpQuantifier | +| regexp.cpp:108:18:108:19 | \\f | RegExpConstant,RegExpEscape | +| regexp.cpp:108:18:108:21 | \\f\\v | RegExpSequence | +| regexp.cpp:108:20:108:21 | \\v | RegExpConstant,RegExpEscape | +| regexp.cpp:111:25:111:25 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:111:25:111:28 | a\\nb | RegExpSequence | +| regexp.cpp:111:26:111:27 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:111:28:111:28 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:112:37:112:37 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:112:37:112:40 | a\\nc | RegExpSequence | +| regexp.cpp:112:38:112:39 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:112:40:112:40 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:113:39:113:39 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:113:39:113:42 | a\\nc | RegExpSequence | +| regexp.cpp:113:40:113:41 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:113:42:113:42 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:114:38:114:38 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:114:38:114:41 | a\\nc | RegExpSequence | +| regexp.cpp:114:39:114:40 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:114:41:114:41 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:115:38:115:38 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:115:38:115:41 | a\\nc | RegExpSequence | +| regexp.cpp:115:39:115:40 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:115:41:115:41 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:116:23:116:23 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:116:23:116:26 | a\\nc | RegExpSequence | +| regexp.cpp:116:24:116:25 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:116:26:116:26 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:117:40:117:40 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:117:40:117:43 | a\\nc | RegExpSequence | +| regexp.cpp:117:41:117:42 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:117:43:117:43 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:118:42:118:42 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:118:42:118:45 | a\\nc | RegExpSequence | +| regexp.cpp:118:43:118:44 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:118:45:118:45 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:119:41:119:41 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:119:41:119:44 | a\\nc | RegExpSequence | +| regexp.cpp:119:42:119:43 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:119:44:119:44 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:120:41:120:41 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:120:41:120:44 | a\\nc | RegExpSequence | +| regexp.cpp:120:42:120:43 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:120:44:120:44 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:121:25:121:25 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:121:25:121:28 | a\\nc | RegExpSequence | +| regexp.cpp:121:26:121:27 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:121:28:121:28 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:122:29:122:29 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:122:29:122:32 | a\\nc | RegExpSequence | +| regexp.cpp:122:30:122:31 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:122:32:122:32 | c | RegExpConstant,RegExpNormalChar | regExpNormalCharValue | regexp.cpp:18:19:18:21 | abc | abc | | regexp.cpp:21:20:21:20 | a | a | @@ -314,49 +315,50 @@ regExpNormalCharValue | regexp.cpp:84:37:84:37 | a | a | | regexp.cpp:84:39:84:39 | f | f | | regexp.cpp:90:19:90:24 | \\u0061 | a | -| regexp.cpp:93:21:93:23 | \\cA | cA | -| regexp.cpp:94:22:94:24 | \\cZ | cZ | -| regexp.cpp:97:20:97:21 | \\0 | 0 | -| regexp.cpp:98:21:98:22 | \\0 | 0 | -| regexp.cpp:101:21:101:21 | a | a | -| regexp.cpp:102:21:102:21 | b | b | -| regexp.cpp:103:21:103:21 | c | c | -| regexp.cpp:104:21:104:21 | d | d | -| regexp.cpp:105:18:105:19 | \\f | \u000c | -| regexp.cpp:105:20:105:21 | \\v | \u000b | -| regexp.cpp:108:25:108:25 | a | a | -| regexp.cpp:108:26:108:27 | \\n | \n | -| regexp.cpp:108:28:108:28 | b | b | -| regexp.cpp:109:37:109:37 | a | a | -| regexp.cpp:109:38:109:39 | \\n | \n | -| regexp.cpp:109:40:109:40 | c | c | -| regexp.cpp:110:39:110:39 | a | a | -| regexp.cpp:110:40:110:41 | \\n | \n | -| regexp.cpp:110:42:110:42 | c | c | -| regexp.cpp:111:38:111:38 | a | a | -| regexp.cpp:111:39:111:40 | \\n | \n | -| regexp.cpp:111:41:111:41 | c | c | -| regexp.cpp:112:38:112:38 | a | a | -| regexp.cpp:112:39:112:40 | \\n | \n | -| regexp.cpp:112:41:112:41 | c | c | -| regexp.cpp:113:23:113:23 | a | a | -| regexp.cpp:113:24:113:25 | \\n | \n | -| regexp.cpp:113:26:113:26 | c | c | -| regexp.cpp:114:40:114:40 | a | a | -| regexp.cpp:114:41:114:42 | \\n | \n | -| regexp.cpp:114:43:114:43 | c | c | -| regexp.cpp:115:42:115:42 | a | a | -| regexp.cpp:115:43:115:44 | \\n | \n | -| regexp.cpp:115:45:115:45 | c | c | -| regexp.cpp:116:41:116:41 | a | a | -| regexp.cpp:116:42:116:43 | \\n | \n | -| regexp.cpp:116:44:116:44 | c | c | -| regexp.cpp:117:41:117:41 | a | a | -| regexp.cpp:117:42:117:43 | \\n | \n | -| regexp.cpp:117:44:117:44 | c | c | -| regexp.cpp:118:25:118:25 | a | a | -| regexp.cpp:118:26:118:27 | \\n | \n | -| regexp.cpp:118:28:118:28 | c | c | -| regexp.cpp:119:29:119:29 | a | a | -| regexp.cpp:119:30:119:31 | \\n | \n | -| regexp.cpp:119:32:119:32 | c | c | +| regexp.cpp:93:19:93:22 | \\x61 | x61 | +| regexp.cpp:96:21:96:23 | \\cA | cA | +| regexp.cpp:97:22:97:24 | \\cZ | cZ | +| regexp.cpp:100:20:100:21 | \\0 | 0 | +| regexp.cpp:101:21:101:22 | \\0 | 0 | +| regexp.cpp:104:21:104:21 | a | a | +| regexp.cpp:105:21:105:21 | b | b | +| regexp.cpp:106:21:106:21 | c | c | +| regexp.cpp:107:21:107:21 | d | d | +| regexp.cpp:108:18:108:19 | \\f | \u000c | +| regexp.cpp:108:20:108:21 | \\v | \u000b | +| regexp.cpp:111:25:111:25 | a | a | +| regexp.cpp:111:26:111:27 | \\n | \n | +| regexp.cpp:111:28:111:28 | b | b | +| regexp.cpp:112:37:112:37 | a | a | +| regexp.cpp:112:38:112:39 | \\n | \n | +| regexp.cpp:112:40:112:40 | c | c | +| regexp.cpp:113:39:113:39 | a | a | +| regexp.cpp:113:40:113:41 | \\n | \n | +| regexp.cpp:113:42:113:42 | c | c | +| regexp.cpp:114:38:114:38 | a | a | +| regexp.cpp:114:39:114:40 | \\n | \n | +| regexp.cpp:114:41:114:41 | c | c | +| regexp.cpp:115:38:115:38 | a | a | +| regexp.cpp:115:39:115:40 | \\n | \n | +| regexp.cpp:115:41:115:41 | c | c | +| regexp.cpp:116:23:116:23 | a | a | +| regexp.cpp:116:24:116:25 | \\n | \n | +| regexp.cpp:116:26:116:26 | c | c | +| regexp.cpp:117:40:117:40 | a | a | +| regexp.cpp:117:41:117:42 | \\n | \n | +| regexp.cpp:117:43:117:43 | c | c | +| regexp.cpp:118:42:118:42 | a | a | +| regexp.cpp:118:43:118:44 | \\n | \n | +| regexp.cpp:118:45:118:45 | c | c | +| regexp.cpp:119:41:119:41 | a | a | +| regexp.cpp:119:42:119:43 | \\n | \n | +| regexp.cpp:119:44:119:44 | c | c | +| regexp.cpp:120:41:120:41 | a | a | +| regexp.cpp:120:42:120:43 | \\n | \n | +| regexp.cpp:120:44:120:44 | c | c | +| regexp.cpp:121:25:121:25 | a | a | +| regexp.cpp:121:26:121:27 | \\n | \n | +| regexp.cpp:121:28:121:28 | c | c | +| regexp.cpp:122:29:122:29 | a | a | +| regexp.cpp:122:30:122:31 | \\n | \n | +| regexp.cpp:122:32:122:32 | c | c | From ff038a2cb8b8763ec68cb65656edd42957fd012f Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 7 Aug 2026 17:49:05 +0200 Subject: [PATCH 0187/2098] C++: Handle `\0` in `RegExpEscape` --- cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll | 4 +++- cpp/ql/test/library-tests/regex/regexp.expected | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll index a4ca0ada6633..0e9086577c19 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll @@ -587,13 +587,15 @@ private module Impl implements RegexTreeViewSig { or this.getUnescaped() = "v" and result = 11.toUnicode() or + this.getUnescaped() = "0" and result = 0.toUnicode() + or this.isUnicode() and result = this.getUnicode() } /** Holds if this terms name is given by the part following the escape character. */ predicate isIdentityEscape() { - not this.getUnescaped() in ["n", "r", "t", "f", "v"] and not this.isUnicode() + not this.getUnescaped() in ["n", "r", "t", "f", "v", "0"] and not this.isUnicode() } override string getAPrimaryQlClass() { result = "RegExpEscape" } diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index 95159d356332..b11fb53dda17 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -318,8 +318,8 @@ regExpNormalCharValue | regexp.cpp:93:19:93:22 | \\x61 | x61 | | regexp.cpp:96:21:96:23 | \\cA | cA | | regexp.cpp:97:22:97:24 | \\cZ | cZ | -| regexp.cpp:100:20:100:21 | \\0 | 0 | -| regexp.cpp:101:21:101:22 | \\0 | 0 | +| regexp.cpp:100:20:100:21 | \\0 | \u0000 | +| regexp.cpp:101:21:101:22 | \\0 | \u0000 | | regexp.cpp:104:21:104:21 | a | a | | regexp.cpp:105:21:105:21 | b | b | | regexp.cpp:106:21:106:21 | c | c | From 40feb22f4ec052698488928b6c0d95cc1e22ffe9 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 7 Aug 2026 18:04:41 +0200 Subject: [PATCH 0188/2098] C++: Handle `\cX` in `RegExpEscape` and slightly tweak test --- .../semmle/code/cpp/regex/RegexTreeView.qll | 24 ++++++++++++++++++- .../library-tests/regex/locations.expected | 2 +- .../test/library-tests/regex/parse.expected | 6 ++--- cpp/ql/test/library-tests/regex/regexp.cpp | 2 +- .../test/library-tests/regex/regexp.expected | 8 +++---- 5 files changed, 32 insertions(+), 10 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll index 0e9086577c19..1c38a6d63084 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll @@ -574,6 +574,7 @@ private module Impl implements RegexTreeViewSig { */ override string getValue() { not this.isUnicode() and + not this.isControl() and this.isIdentityEscape() and result = this.getUnescaped() or @@ -591,11 +592,16 @@ private module Impl implements RegexTreeViewSig { or this.isUnicode() and result = this.getUnicode() + or + this.isControl() and + result = this.getControl() } /** Holds if this terms name is given by the part following the escape character. */ predicate isIdentityEscape() { - not this.getUnescaped() in ["n", "r", "t", "f", "v", "0"] and not this.isUnicode() + not this.getUnescaped() in ["n", "r", "t", "f", "v", "0"] and + not this.isUnicode() and + not this.isControl() } override string getAPrimaryQlClass() { result = "RegExpEscape" } @@ -621,6 +627,22 @@ private module Impl implements RegexTreeViewSig { this.isUnicode() and result = parseHexInt(this.getText().suffix(2)).toUnicode() } + + /** + * Holds if this is a `\cX` escape. + */ + private predicate isControl() { this.getText().prefix(2) = "\\c" } + + /** + * Gets the unicode char for this escape. + * E.g. for `\cA` this returns "a". + */ + private string getControl() { + this.isControl() and + exists(string letter | letter = this.getText().suffix(2).toUpperCase() | + result = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf(letter).toUnicode() + ) + } } /** diff --git a/cpp/ql/test/library-tests/regex/locations.expected b/cpp/ql/test/library-tests/regex/locations.expected index 1e13b83cd2e7..a9f12c020d79 100644 --- a/cpp/ql/test/library-tests/regex/locations.expected +++ b/cpp/ql/test/library-tests/regex/locations.expected @@ -41,7 +41,7 @@ | regexp.cpp:90:19:90:24 | \\u0061 | regexp.cpp | 90 | 19 | 90 | 24 | | regexp.cpp:93:19:93:22 | \\x61 | regexp.cpp | 93 | 19 | 93 | 22 | | regexp.cpp:96:21:96:23 | \\cA | regexp.cpp | 96 | 21 | 96 | 23 | -| regexp.cpp:97:21:97:25 | [\\cZ] | regexp.cpp | 97 | 21 | 97 | 25 | +| regexp.cpp:97:21:97:25 | [\\cz] | regexp.cpp | 97 | 21 | 97 | 25 | | regexp.cpp:100:20:100:21 | \\0 | regexp.cpp | 100 | 20 | 100 | 21 | | regexp.cpp:101:20:101:23 | [\\0] | regexp.cpp | 101 | 20 | 101 | 23 | | regexp.cpp:104:21:104:23 | a*? | regexp.cpp | 104 | 21 | 104 | 23 | diff --git a/cpp/ql/test/library-tests/regex/parse.expected b/cpp/ql/test/library-tests/regex/parse.expected index b6c809ad91de..e8d84b277514 100644 --- a/cpp/ql/test/library-tests/regex/parse.expected +++ b/cpp/ql/test/library-tests/regex/parse.expected @@ -466,10 +466,10 @@ regexp.cpp: # 96| [RegExpConstant, RegExpEscape] \cA -# 97| [RegExpCharacterClass] [\cZ] -#-----| 0 -> [RegExpConstant, RegExpEscape] \cZ +# 97| [RegExpCharacterClass] [\cz] +#-----| 0 -> [RegExpConstant, RegExpEscape] \cz -# 97| [RegExpConstant, RegExpEscape] \cZ +# 97| [RegExpConstant, RegExpEscape] \cz # 100| [RegExpConstant, RegExpEscape] \0 diff --git a/cpp/ql/test/library-tests/regex/regexp.cpp b/cpp/ql/test/library-tests/regex/regexp.cpp index c26794296179..51986dd59adf 100644 --- a/cpp/ql/test/library-tests/regex/regexp.cpp +++ b/cpp/ql/test/library-tests/regex/regexp.cpp @@ -94,7 +94,7 @@ std::regex r_hex("\\x61"); // control escapes std::regex r_ctrl1("\\cA"); -std::regex r_ctrl2("[\\cZ]"); +std::regex r_ctrl2("[\\cz]"); // NUL escape std::regex r_nul1("\\0"); diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index b11fb53dda17..83631c8a3ab8 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -174,8 +174,8 @@ term | regexp.cpp:90:19:90:24 | \\u0061 | RegExpConstant,RegExpEscape | | regexp.cpp:93:19:93:22 | \\x61 | RegExpConstant,RegExpEscape | | regexp.cpp:96:21:96:23 | \\cA | RegExpConstant,RegExpEscape | -| regexp.cpp:97:21:97:25 | [\\cZ] | RegExpCharacterClass | -| regexp.cpp:97:22:97:24 | \\cZ | RegExpConstant,RegExpEscape | +| regexp.cpp:97:21:97:25 | [\\cz] | RegExpCharacterClass | +| regexp.cpp:97:22:97:24 | \\cz | RegExpConstant,RegExpEscape | | regexp.cpp:100:20:100:21 | \\0 | RegExpConstant,RegExpEscape | | regexp.cpp:101:20:101:23 | [\\0] | RegExpCharacterClass | | regexp.cpp:101:21:101:22 | \\0 | RegExpConstant,RegExpEscape | @@ -316,8 +316,8 @@ regExpNormalCharValue | regexp.cpp:84:39:84:39 | f | f | | regexp.cpp:90:19:90:24 | \\u0061 | a | | regexp.cpp:93:19:93:22 | \\x61 | x61 | -| regexp.cpp:96:21:96:23 | \\cA | cA | -| regexp.cpp:97:22:97:24 | \\cZ | cZ | +| regexp.cpp:96:21:96:23 | \\cA | \u0000 | +| regexp.cpp:97:22:97:24 | \\cz | \u0019 | | regexp.cpp:100:20:100:21 | \\0 | \u0000 | | regexp.cpp:101:21:101:22 | \\0 | \u0000 | | regexp.cpp:104:21:104:21 | a | a | From e6cfe170f87a5c604af729eeaa4330351dc83c3d Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 7 Aug 2026 18:08:08 +0200 Subject: [PATCH 0189/2098] C++: Handle `\xhh` in `RegExpEscape` --- .../semmle/code/cpp/regex/RegexTreeView.qll | 19 +++++++++++++++++++ .../test/library-tests/regex/regexp.expected | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll index 1c38a6d63084..6059368e3a0e 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll @@ -574,6 +574,7 @@ private module Impl implements RegexTreeViewSig { */ override string getValue() { not this.isUnicode() and + not this.isHex() and not this.isControl() and this.isIdentityEscape() and result = this.getUnescaped() @@ -593,6 +594,9 @@ private module Impl implements RegexTreeViewSig { this.isUnicode() and result = this.getUnicode() or + this.isHex() and + result = this.getHex() + or this.isControl() and result = this.getControl() } @@ -601,6 +605,7 @@ private module Impl implements RegexTreeViewSig { predicate isIdentityEscape() { not this.getUnescaped() in ["n", "r", "t", "f", "v", "0"] and not this.isUnicode() and + not this.isHex() and not this.isControl() } @@ -628,6 +633,20 @@ private module Impl implements RegexTreeViewSig { result = parseHexInt(this.getText().suffix(2)).toUnicode() } + /** + * Holds if this is a hex escape. + */ + private predicate isHex() { this.getText().prefix(2) = "\\x" } + + /** + * Gets the unicode char for this escape. + * E.g. for `\x61` this returns "a". + */ + private string getHex() { + this.isHex() and + result = parseHexInt(this.getText().suffix(2)).toUnicode() + } + /** * Holds if this is a `\cX` escape. */ diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index 83631c8a3ab8..65e28914a5c1 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -315,7 +315,7 @@ regExpNormalCharValue | regexp.cpp:84:37:84:37 | a | a | | regexp.cpp:84:39:84:39 | f | f | | regexp.cpp:90:19:90:24 | \\u0061 | a | -| regexp.cpp:93:19:93:22 | \\x61 | x61 | +| regexp.cpp:93:19:93:22 | \\x61 | a | | regexp.cpp:96:21:96:23 | \\cA | \u0000 | | regexp.cpp:97:22:97:24 | \\cz | \u0019 | | regexp.cpp:100:20:100:21 | \\0 | \u0000 | From b30d9d6c84b6f3780c70e046d97223a0a97f5cbd Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 7 Aug 2026 18:10:55 +0200 Subject: [PATCH 0190/2098] C++: Fix change note category --- .../lib/change-notes/2026-07-23-std-regex-ecmascript-parser.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/ql/lib/change-notes/2026-07-23-std-regex-ecmascript-parser.md b/cpp/ql/lib/change-notes/2026-07-23-std-regex-ecmascript-parser.md index f12261d73365..8c1a4f8339a2 100644 --- a/cpp/ql/lib/change-notes/2026-07-23-std-regex-ecmascript-parser.md +++ b/cpp/ql/lib/change-notes/2026-07-23-std-regex-ecmascript-parser.md @@ -1,4 +1,4 @@ --- -category: minorAnalysis +category: feature --- * Added a C++ regular-expression parser for the ECMAScript grammar used by `std::regex`. From aca8aa9288e4fa69b0958ee9e3f5408f15ea5b37 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 7 Aug 2026 18:22:03 +0200 Subject: [PATCH 0191/2098] C++: Fix off-by-one in `\cX` handling --- cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll | 4 ++-- cpp/ql/test/library-tests/regex/regexp.expected | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll index 6059368e3a0e..9afc27356a2d 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll @@ -654,12 +654,12 @@ private module Impl implements RegexTreeViewSig { /** * Gets the unicode char for this escape. - * E.g. for `\cA` this returns "a". + * E.g. for `\cA` this returns `0x01`. */ private string getControl() { this.isControl() and exists(string letter | letter = this.getText().suffix(2).toUpperCase() | - result = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf(letter).toUnicode() + result = ("ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf(letter) + 1).toUnicode() ) } } diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index 65e28914a5c1..6e7a4cfc7204 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -316,8 +316,8 @@ regExpNormalCharValue | regexp.cpp:84:39:84:39 | f | f | | regexp.cpp:90:19:90:24 | \\u0061 | a | | regexp.cpp:93:19:93:22 | \\x61 | a | -| regexp.cpp:96:21:96:23 | \\cA | \u0000 | -| regexp.cpp:97:22:97:24 | \\cz | \u0019 | +| regexp.cpp:96:21:96:23 | \\cA | \u0001 | +| regexp.cpp:97:22:97:24 | \\cz | \u001a | | regexp.cpp:100:20:100:21 | \\0 | \u0000 | | regexp.cpp:101:21:101:22 | \\0 | \u0000 | | regexp.cpp:104:21:104:21 | a | a | From e95ae406f41c55af4e5ae3cf447256fd4783a442 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 7 Aug 2026 18:32:43 +0200 Subject: [PATCH 0192/2098] C++: Fix QL-for-QL errors --- cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll index 9afc27356a2d..cadb1e5d12c3 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll @@ -622,7 +622,7 @@ private module Impl implements RegexTreeViewSig { /** * Holds if this is a unicode escape. */ - private predicate isUnicode() { this.getText().prefix(2) = "\\u" } + private predicate isUnicode() { this.getText().matches("\\u%") } /** * Gets the unicode char for this escape. @@ -636,7 +636,7 @@ private module Impl implements RegexTreeViewSig { /** * Holds if this is a hex escape. */ - private predicate isHex() { this.getText().prefix(2) = "\\x" } + private predicate isHex() { this.getText().matches("\\x%") } /** * Gets the unicode char for this escape. @@ -650,7 +650,7 @@ private module Impl implements RegexTreeViewSig { /** * Holds if this is a `\cX` escape. */ - private predicate isControl() { this.getText().prefix(2) = "\\c" } + private predicate isControl() { this.getText().matches("\\c%") } /** * Gets the unicode char for this escape. From 52cbb679dd79fd14d8126576ff5706c5398e3679 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 10 Aug 2026 10:25:44 +0200 Subject: [PATCH 0193/2098] Rust: Evaluate `mayInvokeCallback` in type inference stage --- rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll | 5 ++++- rust/ql/lib/codeql/rust/internal/CachedStages.qll | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll b/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll index e49d5cc21d29..8b63d818af1b 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll @@ -58,6 +58,7 @@ private import codeql.rust.dataflow.FlowBarrier private import codeql.rust.dataflow.FlowSummary private import codeql.rust.dataflow.FlowSource private import codeql.rust.dataflow.FlowSink +private import codeql.rust.internal.CachedStages private import codeql.rust.internal.typeinference.FunctionType private import codeql.rust.internal.typeinference.TypeMention private import codeql.rust.frameworks.stdlib.Stdlib @@ -215,7 +216,9 @@ private class SummarizedCallableFromModel extends SummarizedCallable::Range { * add a flow model that achieves the effect of simulating that the callback is * invoked, which is needed for flow through captured variables to work. */ -private predicate mayInvokeCallback(Function f, int n) { +cached +predicate mayInvokeCallback(Function f, int n) { + Stages::TypeInferenceStage::ref() and exists(TypeMention tm, Trait trait | tm = f.getParam(n).getTypeRepr() and trait = getALookupTrait(f, tm.getType()) and diff --git a/rust/ql/lib/codeql/rust/internal/CachedStages.qll b/rust/ql/lib/codeql/rust/internal/CachedStages.qll index a92770ed2384..4e3874a9282a 100644 --- a/rust/ql/lib/codeql/rust/internal/CachedStages.qll +++ b/rust/ql/lib/codeql/rust/internal/CachedStages.qll @@ -130,6 +130,7 @@ module Stages { module TypeInferenceStage { private import codeql.rust.internal.typeinference.Type private import codeql.rust.internal.typeinference.TypeInference + private import codeql.rust.dataflow.internal.ModelsAsData /** * Always holds. @@ -150,6 +151,8 @@ module Stages { exists(Type t) or exists(inferType(_)) + or + mayInvokeCallback(_, _) } } From 970e4c637361e486ca7ce907891c03c92bd0ffcd Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 7 Aug 2026 14:30:31 +0200 Subject: [PATCH 0194/2098] unified: Fix handling of unscoped imports An `import X` declaration now does two things: - X becomes a local name binding - X is bulk-imported into the local scope The AST mapping now maps it to X with a bulk-importing pattern as a sub-pattern. Module names can no longer be referenced anywhere except as the leading qualifier of an import statement. --- unified/extractor/ast_types.yml | 1 + .../extractor/src/languages/swift/swift.rs | 11 ++++---- ...with-deeply-nested-path-three-parts.output | 5 +++- .../import-with-dotted-path-two-parts.output | 5 +++- .../simple-import-with-single-name.output | 5 +++- .../ql/lib/codeql/unified/internal/Ast.qll | 9 ++++++- .../unified/internal/LocalNameBinding.qll | 2 -- .../unified/internal/NameBindingPlugin.qll | 3 ++- .../unified/internal/StaticNameBinding.qll | 27 +++++++++++++++---- unified/ql/lib/unified.dbscheme | 5 ++++ .../package1/Sources/Target1/File1.swift | 2 +- 11 files changed, 56 insertions(+), 19 deletions(-) diff --git a/unified/extractor/ast_types.yml b/unified/extractor/ast_types.yml index ca5f6d45edc6..854829a17cb4 100644 --- a/unified/extractor/ast_types.yml +++ b/unified/extractor/ast_types.yml @@ -413,6 +413,7 @@ named: name_pattern: modifier*: modifier identifier: identifier + sub_pattern?: pattern # A pattern matching anything, binding no variables, usually using the syntax "_" ignore_pattern: diff --git a/unified/extractor/src/languages/swift/swift.rs b/unified/extractor/src/languages/swift/swift.rs index 556345c18d21..0762cc66b291 100644 --- a/unified/extractor/src/languages/swift/swift.rs +++ b/unified/extractor/src/languages/swift/swift.rs @@ -1023,13 +1023,12 @@ fn translation_rules() -> Vec> { path: (importPathComponent name: @@parts)*) => import_declaration { - let pattern = match kind { - Some(_) => { - let last = *parts.last().ok_or("import has no path")?; - tree!((name_pattern identifier: (identifier #{last}))) - } - None => tree!((bulk_importing_pattern)), + let bulk_import = match kind { + None => Some(tree!((bulk_importing_pattern))), + Some(_) => None, // scoped import, no bulk import }; + let last = *parts.last().ok_or("import has no path")?; + let pattern = tree!((name_pattern identifier: (identifier #{last}) sub_pattern: {bulk_import})); tree!((import_declaration modifier: (modifier #{kind})? modifier: {attrs} diff --git a/unified/extractor/tests/corpus/swift/desugar/import-with-deeply-nested-path-three-parts.output b/unified/extractor/tests/corpus/swift/desugar/import-with-deeply-nested-path-three-parts.output index cacdc64a46de..ed16e68e219d 100644 --- a/unified/extractor/tests/corpus/swift/desugar/import-with-deeply-nested-path-three-parts.output +++ b/unified/extractor/tests/corpus/swift/desugar/import-with-deeply-nested-path-three-parts.output @@ -37,4 +37,7 @@ top_level identifier: identifier "Foundation" member: identifier "Networking" member: identifier "URLSession" - pattern: bulk_importing_pattern "import Foundation.Networking.URLSession" + pattern: + name_pattern + identifier: identifier "URLSession" + sub_pattern: bulk_importing_pattern "import Foundation.Networking.URLSession" diff --git a/unified/extractor/tests/corpus/swift/desugar/import-with-dotted-path-two-parts.output b/unified/extractor/tests/corpus/swift/desugar/import-with-dotted-path-two-parts.output index 4fc053a7bc53..88f08baa19ce 100644 --- a/unified/extractor/tests/corpus/swift/desugar/import-with-dotted-path-two-parts.output +++ b/unified/extractor/tests/corpus/swift/desugar/import-with-dotted-path-two-parts.output @@ -31,4 +31,7 @@ top_level name_expr identifier: identifier "Foundation" member: identifier "Networking" - pattern: bulk_importing_pattern "import Foundation.Networking" + pattern: + name_pattern + identifier: identifier "Networking" + sub_pattern: bulk_importing_pattern "import Foundation.Networking" diff --git a/unified/extractor/tests/corpus/swift/desugar/simple-import-with-single-name.output b/unified/extractor/tests/corpus/swift/desugar/simple-import-with-single-name.output index 583f33563d13..31261cd952c3 100644 --- a/unified/extractor/tests/corpus/swift/desugar/simple-import-with-single-name.output +++ b/unified/extractor/tests/corpus/swift/desugar/simple-import-with-single-name.output @@ -25,4 +25,7 @@ top_level imported_expr: name_expr identifier: identifier "Foundation" - pattern: bulk_importing_pattern "import Foundation" + pattern: + name_pattern + identifier: identifier "Foundation" + sub_pattern: bulk_importing_pattern "import Foundation" diff --git a/unified/ql/lib/codeql/unified/internal/Ast.qll b/unified/ql/lib/codeql/unified/internal/Ast.qll index 20ff74e6eaf7..d5ffa0218523 100644 --- a/unified/ql/lib/codeql/unified/internal/Ast.qll +++ b/unified/ql/lib/codeql/unified/internal/Ast.qll @@ -1078,9 +1078,14 @@ module Unified { /** Gets the node corresponding to the field `modifier`. */ final F::Modifier getAModifier() { result = this.getModifier(_) } + /** Gets the node corresponding to the field `sub_pattern`. */ + final F::Pattern getSubPattern() { unified_name_pattern_sub_pattern(this, result) } + /** Gets a field or child node of this node. */ final override F::AstNode getAFieldOrChild() { - unified_name_pattern_def(this, result) or unified_name_pattern_modifier(this, _, result) + unified_name_pattern_def(this, result) or + unified_name_pattern_modifier(this, _, result) or + unified_name_pattern_sub_pattern(this, result) } } @@ -1895,6 +1900,8 @@ module Unified { or result = node.(NamePattern).getModifier(i) and name = "getModifier" or + result = node.(NamePattern).getSubPattern() and i = -1 and name = "getSubPattern" + or result = node.(NamedTypeExpr).getName() and i = -1 and name = "getName" or result = node.(NamedTypeExpr).getQualifier() and i = -1 and name = "getQualifier" diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index a7ab44dbbb8e..d7020c153465 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -323,8 +323,6 @@ private module LocalNameBindingInput implements LocalNameBindingInputSig Date: Mon, 10 Aug 2026 11:02:59 +0200 Subject: [PATCH 0195/2098] Ruby: Approximate FieldContent in data flow. --- .../dataflow/internal/DataFlowPrivate.qll | 50 ++++++++++++------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll index 9f3042ebb5b7..b1efcd23aa4f 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll @@ -676,26 +676,28 @@ private module Cached { ) } + private predicate fieldName(string name) { + name = any(InstanceVariable v).getName() + or + name = "@" + any(SetterMethodCall c).getTargetName() + or + // The following equation unfortunately leads to a non-monotonic recursion error: + // name = any(AccessPathToken a).getAnArgument("Field") + // Therefore, we use the following instead to extract the field names from the + // external model data. This, unfortunately, does not included any field names used + // in models defined in QL code. + exists(string input, string output | + ModelOutput::relevantSummaryModel(_, _, input, output, _, _) + | + name = [input, output].regexpFind("(?<=(^|\\.)Field\\[)[^\\]]+(?=\\])", _, _).trim() + ) + } + cached newtype TContent = TKnownElementContent(ConstantValue cv) { trackKnownValue(cv) } or TUnknownElementContent() or - TFieldContent(string name) { - name = any(InstanceVariable v).getName() - or - name = "@" + any(SetterMethodCall c).getTargetName() - or - // The following equation unfortunately leads to a non-monotonic recursion error: - // name = any(AccessPathToken a).getAnArgument("Field") - // Therefore, we use the following instead to extract the field names from the - // external model data. This, unfortunately, does not included any field names used - // in models defined in QL code. - exists(string input, string output | - ModelOutput::relevantSummaryModel(_, _, input, output, _, _) - | - name = [input, output].regexpFind("(?<=(^|\\.)Field\\[)[^\\]]+(?=\\])", _, _).trim() - ) - } or + TFieldContent(string name) { fieldName(name) } or deprecated TSplatContent(int i, Boolean shifted) { i in [0 .. 10] } or deprecated THashSplatContent(ConstantValue::ConstantSymbolValue cv) or TCapturedVariableContent(VariableCapture::CapturedVariable v) or @@ -716,12 +718,20 @@ private module Cached { ) } + cached + int fieldNameBucket(string name) { + exists(int r | name = rank[r](string n | fieldName(n)) and result = r % 30) + } + cached newtype TContentApprox = TUnknownElementContentApprox() or TKnownIntegerElementContentApprox() or TKnownElementContentApprox(string approx) { approx = approxKnownElementIndex(_) } or - TNonElementContentApprox(Content c) { not c instanceof Content::ElementContent } or + TFieldContentApprox(int bucket) { bucket = fieldNameBucket(_) } or + TNonElementContentApprox(Content c) { + not c instanceof Content::ElementContent and not c instanceof Content::FieldContent + } or TCapturedVariableContentApprox(VariableCapture::CapturedVariable v) cached @@ -2268,6 +2278,10 @@ class ContentApprox extends TContentApprox { result = "approximated element " + approx ) or + exists(int bucket | + this = TFieldContentApprox(bucket) and result = "field bucket " + bucket.toString() + ) + or exists(Content c | this = TNonElementContentApprox(c) and result = c.toString() @@ -2307,6 +2321,8 @@ ContentApprox getContentApprox(Content c) { result = TKnownElementContentApprox(approxKnownElementIndex(c.(Content::KnownElementContent).getIndex())) or + result = TFieldContentApprox(fieldNameBucket(c.(Content::FieldContent).getName())) + or result = TNonElementContentApprox(c) } From 8a41ec0ab434235588fb536ef06f5802aa04e1a2 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Mon, 10 Aug 2026 11:20:45 +0200 Subject: [PATCH 0196/2098] C++: Add `RegExpNamedCharacterProperty` subclasses --- .../semmle/code/cpp/regex/RegexTreeView.qll | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll index cadb1e5d12c3..4b828bee0a95 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll @@ -1163,6 +1163,27 @@ private module Impl implements RegexTreeViewSig { string getSymbol() { result = re.getCharacterPropertySymbol(start, end) } } + /** + * A named POSIX character class. For example, `[:digit:]`. + */ + additional class RegExpNamedCharacterClass extends RegExpNamedCharacterProperty { + RegExpNamedCharacterClass() { ":" = re.getCharacterPropertySymbol(start, end) } + } + + /** + * A named POSIX collating element. For example, `[.tilde.]`. + */ + additional class RegExpNamedCollatingElement extends RegExpNamedCharacterProperty { + RegExpNamedCollatingElement() { "." = re.getCharacterPropertySymbol(start, end) } + } + + /** + * A POSIX character equivalence class. For example, `[=a=]`. + */ + additional class RegExpCharacterEquivalenceClass extends RegExpNamedCharacterProperty { + RegExpCharacterEquivalenceClass() { "=" = re.getCharacterPropertySymbol(start, end) } + } + class Top = RegExpParent; /** @@ -1173,7 +1194,7 @@ private module Impl implements RegexTreeViewSig { exists(RegExpCharacterClassEscape escape | term = escape | escape.getValue() = clazz) or // TODO: expand to cover more properties - exists(RegExpNamedCharacterProperty escape | term = escape | + exists(RegExpNamedCharacterClass escape | term = escape | escape.getName().toLowerCase() = "digit" and clazz = "d" or From fbd8737fd0f01cb36b3d4ec6b545f796e2d853f1 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema <93738568+jketema@users.noreply.github.com> Date: Mon, 10 Aug 2026 11:30:21 +0200 Subject: [PATCH 0197/2098] Fix typo Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll index 2184c5f1b45a..999536664469 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll @@ -1,5 +1,5 @@ /** - * Library for parsing for C++ regular expressions. + * Library for parsing C++ regular expressions. * * N.B. does not yet handle stripping whitespace and comments in regexes with * the `x` (free-spacing) flag. From f596a67c26af407ff434c3f30705b38ba05e3fc6 Mon Sep 17 00:00:00 2001 From: Asger F Date: Mon, 10 Aug 2026 11:42:33 +0200 Subject: [PATCH 0198/2098] unified: Fix Swift source folder documentation --- .../ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll b/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll index fb47c577b79e..6fd2187f47a1 100644 --- a/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll +++ b/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll @@ -73,7 +73,7 @@ class SwiftPackageTarget extends ModuleScopeRepr, CallExpr { ) } - /** Gets the source folder to use if no explicit `path:` if given, typically `Sources/` */ + /** Gets the source folder to use if no explicit `path:` is given, typically `Sources/`. */ Folder getDefaultSourceFolder() { exists(Folder subfolder | subfolder = this.getSourceMidFolder() | result = subfolder.getFolder(this.getName()) From d6164c3231b53ee95e6015e25e7e0de249699248 Mon Sep 17 00:00:00 2001 From: Asger F Date: Mon, 10 Aug 2026 11:43:16 +0200 Subject: [PATCH 0199/2098] unified: Preserve array constructor trailing closures --- .../extractor/src/languages/swift/swift.rs | 13 ++ .../expressions/array-type-constructor.output | 120 ++++++++++++++++++ .../expressions/array-type-constructor.swift | 3 + 3 files changed, 136 insertions(+) diff --git a/unified/extractor/src/languages/swift/swift.rs b/unified/extractor/src/languages/swift/swift.rs index 0762cc66b291..e615f07388a9 100644 --- a/unified/extractor/src/languages/swift/swift.rs +++ b/unified/extractor/src/languages/swift/swift.rs @@ -621,6 +621,19 @@ fn translation_rules() -> Vec> { // translating that callee as an array literal would place a type // expression in an expression-only element field. Normalize it to an // `Array` generic type constructor instead. + rule!( + (functionCallExpr + calledExpression: (arrayExpr elements: (arrayElement expression: (genericSpecializationExpr) @element)) + arguments: _* @args + trailingClosure: @tc) + => + (call_expr + callee: (generic_type_expr + base: (named_type_expr name: (identifier "Array")) + type_argument: {element}) + argument: {args} + argument: (argument value: {tc})) + ), rule!( (functionCallExpr calledExpression: (arrayExpr elements: (arrayElement expression: (genericSpecializationExpr) @element)) diff --git a/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.output b/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.output index e721ba9cfde2..43f1c8a553da 100644 --- a/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.output +++ b/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.output @@ -1,4 +1,7 @@ let values = [Result]() +let initialized = [Result](unsafeUninitializedCapacity: 1) { _, count in + count = 0 +} --- @@ -45,6 +48,79 @@ sourceFile pattern: identifierPattern identifier: identifier "values" + codeBlockItem + item: + variableDecl + attributes: + modifiers: + bindingSpecifier: let + bindings: + patternBinding + initializer: + initializerClause + equal: = + value: + functionCallExpr + leftParen: ( + rightParen: ) + arguments: + labeledExpr + colon: : + label: identifier "unsafeUninitializedCapacity" + expression: + integerLiteralExpr + literal: integerLiteral "1" + additionalTrailingClosures: + calledExpression: + arrayExpr + elements: + arrayElement + expression: + genericSpecializationExpr + expression: + declReferenceExpr + baseName: identifier "Result" + genericArgumentClause: + genericArgumentClause + arguments: + genericArgument + argument: + identifierType + name: identifier "Void" + leftAngle: < + rightAngle: > + leftSquare: [ + rightSquare: ] + trailingClosure: + closureExpr + leftBrace: { + rightBrace: } + signature: + closureSignature + attributes: + inKeyword: in + parameterClause: + closureShorthandParameter + name: _ + trailingComma: , + closureShorthandParameter + name: identifier "count" + statements: + codeBlockItem + item: + infixOperatorExpr + operator: + assignmentExpr + equal: = + leftOperand: + declReferenceExpr + baseName: identifier "count" + rightOperand: + integerLiteralExpr + literal: integerLiteral "0" + pattern: + identifierPattern + identifier: identifier "initialized" --- @@ -72,3 +148,47 @@ top_level type_argument: named_type_expr name: identifier "Void" + variable_declaration + modifier: modifier "let" + pattern: + name_pattern + identifier: identifier "initialized" + value: + call_expr + callee: + generic_type_expr + base: + named_type_expr + name: identifier "Array" + type_argument: + generic_type_expr + base: + named_type_expr + name: identifier "Result" + type_argument: + named_type_expr + name: identifier "Void" + argument: + argument + name: identifier "unsafeUninitializedCapacity" + value: int_literal "1" + argument + value: + function_expr + parameter: + parameter + pattern: + name_pattern + identifier: identifier "_" + parameter + pattern: + name_pattern + identifier: identifier "count" + body: + block + stmt: + assign_expr + target: + name_expr + identifier: identifier "count" + value: int_literal "0" diff --git a/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.swift b/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.swift index 49191aee851d..bd25a9cbb4ce 100644 --- a/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.swift +++ b/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.swift @@ -1 +1,4 @@ let values = [Result]() +let initialized = [Result](unsafeUninitializedCapacity: 1) { _, count in + count = 0 +} From b15082f9e27f51087c3431191e86ab5dcc51e49c Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Mon, 10 Aug 2026 11:43:28 +0200 Subject: [PATCH 0200/2098] Fix typo --- cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll index 4b828bee0a95..9e659f8168a6 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll @@ -317,7 +317,7 @@ private module Impl implements RegexTreeViewSig { result.getEnd() = part_end } - /** Hodls if this term may match an unlimited number of times. */ + /** Holds if this term may match an unlimited number of times. */ predicate mayRepeatForever() { may_repeat_forever = true } /** Gets the qualifier for this term. That is e.g "?" for "a?". */ From 08bc837b96a531228e0acd8f5ef982aa1581fc1a Mon Sep 17 00:00:00 2001 From: Mads Navntoft Date: Mon, 10 Aug 2026 13:35:46 +0200 Subject: [PATCH 0201/2098] Java: Redact java_version in gradle-buildless integration test --- .../diagnostics.expected | 2 +- .../gradle-sample-without-wrapper-or-gradle-buildless/test.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/java/ql/integration-tests/java/gradle-sample-without-wrapper-or-gradle-buildless/diagnostics.expected b/java/ql/integration-tests/java/gradle-sample-without-wrapper-or-gradle-buildless/diagnostics.expected index b23aa85f2548..568c2312e97c 100644 --- a/java/ql/integration-tests/java/gradle-sample-without-wrapper-or-gradle-buildless/diagnostics.expected +++ b/java/ql/integration-tests/java/gradle-sample-without-wrapper-or-gradle-buildless/diagnostics.expected @@ -1,7 +1,7 @@ { "attributes": { "java_vendor": "__REDACTED__", - "java_version": "11.0.31" + "java_version": "__REDACTED__" }, "markdownMessage": "Internal telemetry for the Java extractor.\n\nNo action needed.", "severity": "note", diff --git a/java/ql/integration-tests/java/gradle-sample-without-wrapper-or-gradle-buildless/test.py b/java/ql/integration-tests/java/gradle-sample-without-wrapper-or-gradle-buildless/test.py index 92aedd825efa..495d4c40a0a8 100644 --- a/java/ql/integration-tests/java/gradle-sample-without-wrapper-or-gradle-buildless/test.py +++ b/java/ql/integration-tests/java/gradle-sample-without-wrapper-or-gradle-buildless/test.py @@ -5,7 +5,7 @@ # The version of gradle used doesn't work on java 17 def test(codeql, use_java_11, java, environment, check_diagnostics): - check_diagnostics.redact += ["attributes.java_vendor"] + check_diagnostics.redact += ["attributes.java_vendor", "attributes.java_version"] gradle_override_dir = pathlib.Path(tempfile.mkdtemp()) if runs_on.windows: (gradle_override_dir / "gradle.bat").write_text("@echo off\nexit /b 2\n") From b053b7d069e2da5108756c297badf21d70739ab1 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Mon, 10 Aug 2026 12:35:44 +0100 Subject: [PATCH 0202/2098] JavaScript: Add tests for \d flag from ES2022. --- .../extractor/tests/es2022/input/d-flag.js | 5 ++ .../extractor/tests/es2022/options.json | 3 ++ .../tests/es2022/output/trap/d-flag.js.trap | 54 +++++++++++++++++++ 3 files changed, 62 insertions(+) create mode 100644 javascript/extractor/tests/es2022/input/d-flag.js create mode 100644 javascript/extractor/tests/es2022/options.json create mode 100644 javascript/extractor/tests/es2022/output/trap/d-flag.js.trap diff --git a/javascript/extractor/tests/es2022/input/d-flag.js b/javascript/extractor/tests/es2022/input/d-flag.js new file mode 100644 index 000000000000..be7fb5d6841f --- /dev/null +++ b/javascript/extractor/tests/es2022/input/d-flag.js @@ -0,0 +1,5 @@ +const pattern = /import/dg; + +function target() { + return pattern; +} \ No newline at end of file diff --git a/javascript/extractor/tests/es2022/options.json b/javascript/extractor/tests/es2022/options.json new file mode 100644 index 000000000000..075583ca1f63 --- /dev/null +++ b/javascript/extractor/tests/es2022/options.json @@ -0,0 +1,3 @@ +{ + "experimental": true +} diff --git a/javascript/extractor/tests/es2022/output/trap/d-flag.js.trap b/javascript/extractor/tests/es2022/output/trap/d-flag.js.trap new file mode 100644 index 000000000000..57093a9adaf5 --- /dev/null +++ b/javascript/extractor/tests/es2022/output/trap/d-flag.js.trap @@ -0,0 +1,54 @@ +#10000=@"/d-flag.js;sourcefile" +files(#10000,"/d-flag.js") +#10001=@"/;folder" +folders(#10001,"/") +containerparent(#10001,#10000) +#10002=@"loc,{#10000},0,0,0,0" +locations_default(#10002,#10000,0,0,0,0) +hasLocation(#10000,#10002) +#20000=@"global_scope" +scopes(#20000,0) +#20001=@"script;{#10000},1,1" +toplevels(#20001,0) +#20002=@"loc,{#10000},1,1,1,1" +locations_default(#20002,#10000,1,1,1,1) +hasLocation(#20001,#20002) +#20003=* +js_parse_errors(#20003,#20001,"Error: Invalid regular expression flag","const pattern = /import/dg; +") +#20004=@"loc,{#10000},1,18,1,18" +locations_default(#20004,#10000,1,18,1,18) +hasLocation(#20003,#20004) +#20005=* +lines(#20005,#20001,"const pattern = /import/dg;"," +") +#20006=@"loc,{#10000},1,1,1,27" +locations_default(#20006,#10000,1,1,1,27) +hasLocation(#20005,#20006) +#20007=* +lines(#20007,#20001,""," +") +#20008=@"loc,{#10000},2,1,2,0" +locations_default(#20008,#10000,2,1,2,0) +hasLocation(#20007,#20008) +#20009=* +lines(#20009,#20001,"function target() {"," +") +#20010=@"loc,{#10000},3,1,3,19" +locations_default(#20010,#10000,3,1,3,19) +hasLocation(#20009,#20010) +#20011=* +lines(#20011,#20001," return pattern;"," +") +#20012=@"loc,{#10000},4,1,4,17" +locations_default(#20012,#10000,4,1,4,17) +hasLocation(#20011,#20012) +indentation(#10000,4," ",2) +#20013=* +lines(#20013,#20001,"}","") +#20014=@"loc,{#10000},5,1,5,1" +locations_default(#20014,#10000,5,1,5,1) +hasLocation(#20013,#20014) +numlines(#20001,5,0,0) +numlines(#10000,5,0,0) +filetype(#10000,"javascript") From 773ca4362f1a99271b3d05674d5cbf19df9dfe12 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Mon, 10 Aug 2026 12:36:02 +0100 Subject: [PATCH 0203/2098] JavaScript: Add support for \d flag from ES2022. --- javascript/extractor/src/com/semmle/jcorn/Parser.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/javascript/extractor/src/com/semmle/jcorn/Parser.java b/javascript/extractor/src/com/semmle/jcorn/Parser.java index b0bc89645597..3ae1491af10e 100644 --- a/javascript/extractor/src/com/semmle/jcorn/Parser.java +++ b/javascript/extractor/src/com/semmle/jcorn/Parser.java @@ -790,7 +790,8 @@ private Token readRegexp() { String validFlags = "gim"; if (this.options.ecmaVersion() >= 6) validFlags = "gimuy"; if (this.options.ecmaVersion() >= 9) validFlags = "gimsuy"; - if (this.options.ecmaVersion() >= 15) validFlags = "gimsuyv"; + if (this.options.ecmaVersion() >= 13) validFlags = "dgimsuy"; + if (this.options.ecmaVersion() >= 15) validFlags = "dgimsuyv"; if (!mods.matches("^[" + validFlags + "]*$")) this.raise(start, "Invalid regular expression flag"); if (mods.indexOf('u') >= 0) { From 663c5a02ccd98c1bbb4d78cbff68a630158baf95 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Mon, 10 Aug 2026 12:36:14 +0100 Subject: [PATCH 0204/2098] JavaScript: Accept test changes. --- .../tests/es2022/output/trap/d-flag.js.trap | 244 +++++++++++++++--- 1 file changed, 207 insertions(+), 37 deletions(-) diff --git a/javascript/extractor/tests/es2022/output/trap/d-flag.js.trap b/javascript/extractor/tests/es2022/output/trap/d-flag.js.trap index 57093a9adaf5..c8a92cf06a3e 100644 --- a/javascript/extractor/tests/es2022/output/trap/d-flag.js.trap +++ b/javascript/extractor/tests/es2022/output/trap/d-flag.js.trap @@ -9,46 +9,216 @@ hasLocation(#10000,#10002) #20000=@"global_scope" scopes(#20000,0) #20001=@"script;{#10000},1,1" -toplevels(#20001,0) -#20002=@"loc,{#10000},1,1,1,1" -locations_default(#20002,#10000,1,1,1,1) -hasLocation(#20001,#20002) -#20003=* -js_parse_errors(#20003,#20001,"Error: Invalid regular expression flag","const pattern = /import/dg; -") -#20004=@"loc,{#10000},1,18,1,18" -locations_default(#20004,#10000,1,18,1,18) -hasLocation(#20003,#20004) -#20005=* -lines(#20005,#20001,"const pattern = /import/dg;"," +#20002=* +lines(#20002,#20001,"const pattern = /import/dg;"," ") -#20006=@"loc,{#10000},1,1,1,27" -locations_default(#20006,#10000,1,1,1,27) -hasLocation(#20005,#20006) -#20007=* -lines(#20007,#20001,""," +#20003=@"loc,{#10000},1,1,1,27" +locations_default(#20003,#10000,1,1,1,27) +hasLocation(#20002,#20003) +#20004=* +lines(#20004,#20001,""," ") -#20008=@"loc,{#10000},2,1,2,0" -locations_default(#20008,#10000,2,1,2,0) -hasLocation(#20007,#20008) -#20009=* -lines(#20009,#20001,"function target() {"," +#20005=@"loc,{#10000},2,1,2,0" +locations_default(#20005,#10000,2,1,2,0) +hasLocation(#20004,#20005) +#20006=* +lines(#20006,#20001,"function target() {"," ") -#20010=@"loc,{#10000},3,1,3,19" -locations_default(#20010,#10000,3,1,3,19) -hasLocation(#20009,#20010) -#20011=* -lines(#20011,#20001," return pattern;"," +#20007=@"loc,{#10000},3,1,3,19" +locations_default(#20007,#10000,3,1,3,19) +hasLocation(#20006,#20007) +#20008=* +lines(#20008,#20001," return pattern;"," ") -#20012=@"loc,{#10000},4,1,4,17" -locations_default(#20012,#10000,4,1,4,17) -hasLocation(#20011,#20012) +#20009=@"loc,{#10000},4,1,4,17" +locations_default(#20009,#10000,4,1,4,17) +hasLocation(#20008,#20009) indentation(#10000,4," ",2) -#20013=* -lines(#20013,#20001,"}","") -#20014=@"loc,{#10000},5,1,5,1" -locations_default(#20014,#10000,5,1,5,1) -hasLocation(#20013,#20014) -numlines(#20001,5,0,0) -numlines(#10000,5,0,0) +#20010=* +lines(#20010,#20001,"}","") +#20011=@"loc,{#10000},5,1,5,1" +locations_default(#20011,#10000,5,1,5,1) +hasLocation(#20010,#20011) +numlines(#20001,5,4,0) +#20012=* +tokeninfo(#20012,7,#20001,0,"const") +#20013=@"loc,{#10000},1,1,1,5" +locations_default(#20013,#10000,1,1,1,5) +hasLocation(#20012,#20013) +#20014=* +tokeninfo(#20014,6,#20001,1,"pattern") +#20015=@"loc,{#10000},1,7,1,13" +locations_default(#20015,#10000,1,7,1,13) +hasLocation(#20014,#20015) +#20016=* +tokeninfo(#20016,8,#20001,2,"=") +#20017=@"loc,{#10000},1,15,1,15" +locations_default(#20017,#10000,1,15,1,15) +hasLocation(#20016,#20017) +#20018=* +tokeninfo(#20018,5,#20001,3,"/import/dg") +#20019=@"loc,{#10000},1,17,1,26" +locations_default(#20019,#10000,1,17,1,26) +hasLocation(#20018,#20019) +#20020=* +tokeninfo(#20020,8,#20001,4,";") +#20021=@"loc,{#10000},1,27,1,27" +locations_default(#20021,#10000,1,27,1,27) +hasLocation(#20020,#20021) +#20022=* +tokeninfo(#20022,7,#20001,5,"function") +#20023=@"loc,{#10000},3,1,3,8" +locations_default(#20023,#10000,3,1,3,8) +hasLocation(#20022,#20023) +#20024=* +tokeninfo(#20024,6,#20001,6,"target") +#20025=@"loc,{#10000},3,10,3,15" +locations_default(#20025,#10000,3,10,3,15) +hasLocation(#20024,#20025) +#20026=* +tokeninfo(#20026,8,#20001,7,"(") +#20027=@"loc,{#10000},3,16,3,16" +locations_default(#20027,#10000,3,16,3,16) +hasLocation(#20026,#20027) +#20028=* +tokeninfo(#20028,8,#20001,8,")") +#20029=@"loc,{#10000},3,17,3,17" +locations_default(#20029,#10000,3,17,3,17) +hasLocation(#20028,#20029) +#20030=* +tokeninfo(#20030,8,#20001,9,"{") +#20031=@"loc,{#10000},3,19,3,19" +locations_default(#20031,#10000,3,19,3,19) +hasLocation(#20030,#20031) +#20032=* +tokeninfo(#20032,7,#20001,10,"return") +#20033=@"loc,{#10000},4,3,4,8" +locations_default(#20033,#10000,4,3,4,8) +hasLocation(#20032,#20033) +#20034=* +tokeninfo(#20034,6,#20001,11,"pattern") +#20035=@"loc,{#10000},4,10,4,16" +locations_default(#20035,#10000,4,10,4,16) +hasLocation(#20034,#20035) +#20036=* +tokeninfo(#20036,8,#20001,12,";") +#20037=@"loc,{#10000},4,17,4,17" +locations_default(#20037,#10000,4,17,4,17) +hasLocation(#20036,#20037) +#20038=* +tokeninfo(#20038,8,#20001,13,"}") +hasLocation(#20038,#20011) +#20039=* +tokeninfo(#20039,0,#20001,14,"") +#20040=@"loc,{#10000},5,2,5,1" +locations_default(#20040,#10000,5,2,5,1) +hasLocation(#20039,#20040) +toplevels(#20001,0) +#20041=@"loc,{#10000},1,1,5,1" +locations_default(#20041,#10000,1,1,5,1) +hasLocation(#20001,#20041) +#20042=@"var;{target};{#20000}" +variables(#20042,"target",#20000) +#20043=@"var;{pattern};{#20000}" +variables(#20043,"pattern",#20000) +#20044=@"var;{this};{#20000}" +variables(#20044,"this",#20000) +#20045=* +stmts(#20045,22,#20001,0,"const p ... ort/dg;") +hasLocation(#20045,#20003) +stmt_containers(#20045,#20001) +#20046=* +exprs(#20046,64,#20045,0,"pattern = /import/dg") +#20047=@"loc,{#10000},1,7,1,26" +locations_default(#20047,#10000,1,7,1,26) +hasLocation(#20046,#20047) +enclosing_stmt(#20046,#20045) +expr_containers(#20046,#20001) +#20048=* +exprs(#20048,78,#20046,0,"pattern") +hasLocation(#20048,#20015) +enclosing_stmt(#20048,#20045) +expr_containers(#20048,#20001) +literals("pattern","pattern",#20048) +decl(#20048,#20043) +#20049=* +exprs(#20049,5,#20046,1,"/import/dg") +hasLocation(#20049,#20019) +enclosing_stmt(#20049,#20045) +expr_containers(#20049,#20001) +literals("/import/dg","/import/dg",#20049) +#20050=* +regexpterm(#20050,14,#20049,0,"import") +#20051=@"loc,{#10000},1,18,1,23" +locations_default(#20051,#10000,1,18,1,23) +hasLocation(#20050,#20051) +regexp_const_value(#20050,"import") +#20052=* +stmts(#20052,17,#20001,1,"functio ... tern;\n}") +#20053=@"loc,{#10000},3,1,5,1" +locations_default(#20053,#10000,3,1,5,1) +hasLocation(#20052,#20053) +stmt_containers(#20052,#20001) +#20054=* +exprs(#20054,78,#20052,-1,"target") +hasLocation(#20054,#20025) +expr_containers(#20054,#20052) +literals("target","target",#20054) +decl(#20054,#20042) +#20055=* +scopes(#20055,1) +scopenodes(#20052,#20055) +scopenesting(#20055,#20000) +#20056=@"var;{this};{#20055}" +variables(#20056,"this",#20055) +#20057=@"var;{arguments};{#20055}" +variables(#20057,"arguments",#20055) +is_arguments_object(#20057) +#20058=* +stmts(#20058,1,#20052,-2,"{\n ret ... tern;\n}") +#20059=@"loc,{#10000},3,19,5,1" +locations_default(#20059,#10000,3,19,5,1) +hasLocation(#20058,#20059) +stmt_containers(#20058,#20052) +#20060=* +stmts(#20060,9,#20058,0,"return pattern;") +#20061=@"loc,{#10000},4,3,4,17" +locations_default(#20061,#10000,4,3,4,17) +hasLocation(#20060,#20061) +stmt_containers(#20060,#20052) +#20062=* +exprs(#20062,79,#20060,0,"pattern") +hasLocation(#20062,#20035) +enclosing_stmt(#20062,#20060) +expr_containers(#20062,#20052) +literals("pattern","pattern",#20062) +bind(#20062,#20043) +#20063=* +entry_cfg_node(#20063,#20001) +#20064=@"loc,{#10000},1,1,1,0" +locations_default(#20064,#10000,1,1,1,0) +hasLocation(#20063,#20064) +#20065=* +exit_cfg_node(#20065,#20001) +hasLocation(#20065,#20040) +successor(#20052,#20065) +#20066=* +entry_cfg_node(#20066,#20052) +#20067=@"loc,{#10000},3,1,3,0" +locations_default(#20067,#10000,3,1,3,0) +hasLocation(#20066,#20067) +#20068=* +exit_cfg_node(#20068,#20052) +hasLocation(#20068,#20040) +successor(#20062,#20060) +successor(#20060,#20068) +successor(#20058,#20062) +successor(#20066,#20058) +successor(#20045,#20048) +successor(#20049,#20046) +successor(#20048,#20049) +successor(#20046,#20052) +successor(#20054,#20045) +successor(#20063,#20054) +numlines(#10000,5,4,0) filetype(#10000,"javascript") From 6a6931cfe8581f04a31dc01f923de020d72d812f Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 10 Aug 2026 14:14:56 +0200 Subject: [PATCH 0205/2098] Rust: Accept more inconsistencies --- .../models/CONSISTENCY/PathResolutionConsistency.expected | 3 +++ .../database/CONSISTENCY/PathResolutionConsistency.expected | 2 ++ .../file/CONSISTENCY/PathResolutionConsistency.expected | 3 +++ .../stdin/CONSISTENCY/PathResolutionConsistency.expected | 3 +++ .../CONSISTENCY/PathResolutionConsistency.expected | 5 +++++ .../axum/CONSISTENCY/PathResolutionConsistency.expected | 5 +++++ .../warp/CONSISTENCY/PathResolutionConsistency.expected | 3 +++ .../CWE-696/CONSISTENCY/PathResolutionConsistency.expected | 4 ++++ 8 files changed, 28 insertions(+) create mode 100644 rust/ql/test/library-tests/dataflow/models/CONSISTENCY/PathResolutionConsistency.expected create mode 100644 rust/ql/test/library-tests/dataflow/sources/file/CONSISTENCY/PathResolutionConsistency.expected create mode 100644 rust/ql/test/library-tests/dataflow/sources/stdin/CONSISTENCY/PathResolutionConsistency.expected create mode 100644 rust/ql/test/library-tests/dataflow/sources/web_frameworks/CONSISTENCY/PathResolutionConsistency.expected create mode 100644 rust/ql/test/query-tests/security/CWE-079/axum/CONSISTENCY/PathResolutionConsistency.expected create mode 100644 rust/ql/test/query-tests/security/CWE-079/warp/CONSISTENCY/PathResolutionConsistency.expected create mode 100644 rust/ql/test/query-tests/security/CWE-696/CONSISTENCY/PathResolutionConsistency.expected diff --git a/rust/ql/test/library-tests/dataflow/models/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/models/CONSISTENCY/PathResolutionConsistency.expected new file mode 100644 index 000000000000..e30b94a59e93 --- /dev/null +++ b/rust/ql/test/library-tests/dataflow/models/CONSISTENCY/PathResolutionConsistency.expected @@ -0,0 +1,3 @@ +multiplePathResolutions +| main.rs:433:3:433:13 | ...::main | +| main.rs:455:5:455:7 | ...::runtime | diff --git a/rust/ql/test/library-tests/dataflow/sources/database/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/database/CONSISTENCY/PathResolutionConsistency.expected index b6a4a56f9f77..a43ac755ca4f 100644 --- a/rust/ql/test/library-tests/dataflow/sources/database/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/dataflow/sources/database/CONSISTENCY/PathResolutionConsistency.expected @@ -1,3 +1,5 @@ multiplePathResolutions | test.rs:10:28:10:65 | Result::<...> | | test.rs:97:40:97:49 | Result::<...> | +| test.rs:207:3:207:13 | ...::main | +| test.rs:221:5:221:6 | ...::runtime | diff --git a/rust/ql/test/library-tests/dataflow/sources/file/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/file/CONSISTENCY/PathResolutionConsistency.expected new file mode 100644 index 000000000000..83f2dd8d73c3 --- /dev/null +++ b/rust/ql/test/library-tests/dataflow/sources/file/CONSISTENCY/PathResolutionConsistency.expected @@ -0,0 +1,3 @@ +multiplePathResolutions +| test.rs:294:3:294:13 | ...::main | +| test.rs:326:5:326:6 | ...::runtime | diff --git a/rust/ql/test/library-tests/dataflow/sources/stdin/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/stdin/CONSISTENCY/PathResolutionConsistency.expected new file mode 100644 index 000000000000..a74204eaf517 --- /dev/null +++ b/rust/ql/test/library-tests/dataflow/sources/stdin/CONSISTENCY/PathResolutionConsistency.expected @@ -0,0 +1,3 @@ +multiplePathResolutions +| test.rs:204:3:204:13 | ...::main | +| test.rs:218:5:218:6 | ...::runtime | diff --git a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/CONSISTENCY/PathResolutionConsistency.expected new file mode 100644 index 000000000000..a57d64282229 --- /dev/null +++ b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/CONSISTENCY/PathResolutionConsistency.expected @@ -0,0 +1,5 @@ +multiplePathResolutions +| test.rs:40:7:40:25 | ...::fmt | +| test.rs:40:7:40:25 | ...::fmt | +| test.rs:217:7:217:17 | ...::main | +| test.rs:267:9:267:12 | ...::runtime | diff --git a/rust/ql/test/query-tests/security/CWE-079/axum/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-079/axum/CONSISTENCY/PathResolutionConsistency.expected new file mode 100644 index 000000000000..5b4fc1e3902c --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-079/axum/CONSISTENCY/PathResolutionConsistency.expected @@ -0,0 +1,5 @@ +multiplePathResolutions +| main.rs:3:3:3:28 | ...::fmt | +| main.rs:3:3:3:28 | ...::fmt | +| main.rs:13:3:13:13 | ...::main | +| main.rs:19:5:19:8 | ...::runtime | diff --git a/rust/ql/test/query-tests/security/CWE-079/warp/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-079/warp/CONSISTENCY/PathResolutionConsistency.expected new file mode 100644 index 000000000000..63b00cc6d41b --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-079/warp/CONSISTENCY/PathResolutionConsistency.expected @@ -0,0 +1,3 @@ +multiplePathResolutions +| main.rs:3:3:3:13 | ...::main | +| main.rs:14:5:14:8 | ...::runtime | diff --git a/rust/ql/test/query-tests/security/CWE-696/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-696/CONSISTENCY/PathResolutionConsistency.expected new file mode 100644 index 000000000000..632d59f91e9e --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-696/CONSISTENCY/PathResolutionConsistency.expected @@ -0,0 +1,4 @@ +multiplePathResolutions +| test.rs:14:3:14:12 | harmless1_3___rust_dtor___dtor | +| test.rs:33:3:33:12 | bad1_2___rust_dtor___dtor | +| test.rs:39:3:39:12 | bad1_3___rust_dtor___dtor | From 224ab741d8fd3379ce7b52077218ab4b0d8ff255 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Mon, 10 Aug 2026 13:21:53 +0100 Subject: [PATCH 0206/2098] JavaScript: Add change note. --- javascript/ql/lib/change-notes/2026-08-10-d-regex-flag.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 javascript/ql/lib/change-notes/2026-08-10-d-regex-flag.md diff --git a/javascript/ql/lib/change-notes/2026-08-10-d-regex-flag.md b/javascript/ql/lib/change-notes/2026-08-10-d-regex-flag.md new file mode 100644 index 000000000000..8552c7bf7925 --- /dev/null +++ b/javascript/ql/lib/change-notes/2026-08-10-d-regex-flag.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added support for regular expressions using the `d` flag. From dc90b3af41c8236786dc8ed603f85ba4e5140e48 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Mon, 10 Aug 2026 15:04:07 +0200 Subject: [PATCH 0207/2098] Rust: fix cfg exclusion for items from macro expansions `should_be_excluded` only resolved a crate for items in real files. Items coming from a macro expansion live in a `MacroFile`, for which `HirFileId::file_id()` returns `None`, so the cfg was never checked and both branches of e.g. `#[cfg(feature = "rt")]` / `#[cfg(not(feature = "rt"))]` were extracted. Recover the crate from the macro call in that case, mirroring the crate resolution the old upstream `Semantics::check_cfg_attr` performed. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 4ee033fb-30ad-4617-9922-bc0f1088ba81 --- rust/extractor/src/translate/base.rs | 29 +++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/rust/extractor/src/translate/base.rs b/rust/extractor/src/translate/base.rs index cb498e40bfe9..68c3691fd24c 100644 --- a/rust/extractor/src/translate/base.rs +++ b/rust/extractor/src/translate/base.rs @@ -8,7 +8,7 @@ use ra_ap_hir::Semantics; use ra_ap_hir::db::ExpandDatabase; use ra_ap_hir_expand::builtin::{BuiltinDeriveExpander, find_builtin_derive}; use ra_ap_hir_expand::span_map::ExpansionSpanMap; -use ra_ap_hir_expand::{ExpandResult, ExpandTo, InFile, map_node_range_up_rooted}; +use ra_ap_hir_expand::{ExpandResult, ExpandTo, HirFileId, InFile, map_node_range_up_rooted}; use ra_ap_ide_db::RootDatabase; use ra_ap_ide_db::line_index::{LineCol, LineIndex}; use ra_ap_parser::{SyntaxKind, TopEntryPoint}; @@ -502,15 +502,26 @@ impl<'a> Translator<'a> { None => return false, }; let cfg_expr = ra_ap_cfg::CfgExpr::parse_from_ast(cfg_predicate); - let file_id = sema.hir_file_for(item.syntax()); - let krate = match file_id - .file_id() - .and_then(|fid| sema.file_to_module_defs(fid.file_id(sema.db)).next()) - { - Some(module) => module.krate(sema.db), - None => return false, + // Resolve the crate the item belongs to so its `cfg` options can be checked. + // Items originating from a macro expansion live in a `MacroFile` rather than a + // real file, so we recover their crate from the macro call; otherwise cfg'd-out + // items from expansions (e.g. tokio's `cfg(feature = "rt")` / + // `cfg(not(feature = "rt"))` cousins) would all be extracted, bloating the DB with + // contradictory entries. + let cfg_options = match sema.hir_file_for(item.syntax()) { + HirFileId::FileId(fid) => { + match sema.file_to_module_defs(fid.file_id(sema.db)).next() { + Some(module) => module.krate(sema.db).cfg(sema.db), + None => return false, + } + } + HirFileId::MacroFile(macro_call) => sema + .db + .lookup_intern_macro_call(macro_call) + .krate + .cfg_options(sema.db), }; - krate.cfg(sema.db).check(&cfg_expr) == Some(false) + cfg_options.check(&cfg_expr) == Some(false) }) }) } From ebf09cb304970ac20ae9000d31b913d2b17ad305 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 10 Aug 2026 13:04:11 +0000 Subject: [PATCH 0208/2098] Initial plan From 70598e915fdfa0a3c546aa0e3efa497fe0280c7b Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Mon, 10 Aug 2026 15:18:27 +0200 Subject: [PATCH 0209/2098] Rust: Add extractor test for cfg exclusion in macro expansions Regression test for `should_be_excluded`: items produced by a macro expansion carrying a disabled `#[cfg(...)]` must be excluded from extraction, just like disabled items written directly in a source file. Uses `cfg(any())`/`cfg(all())` so the test does not depend on crate features. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 4ee033fb-30ad-4617-9922-bc0f1088ba81 --- .../macro-expansion-cfg/Cargo.lock | 7 ++++++ .../macro-expansion-cfg/cfg_macro.expected | 2 ++ .../macro-expansion-cfg/cfg_macro.ql | 6 +++++ .../macro-expansion-cfg/cfg_macro.rs | 22 +++++++++++++++++++ 4 files changed, 37 insertions(+) create mode 100644 rust/ql/test/extractor-tests/macro-expansion-cfg/Cargo.lock create mode 100644 rust/ql/test/extractor-tests/macro-expansion-cfg/cfg_macro.expected create mode 100644 rust/ql/test/extractor-tests/macro-expansion-cfg/cfg_macro.ql create mode 100644 rust/ql/test/extractor-tests/macro-expansion-cfg/cfg_macro.rs diff --git a/rust/ql/test/extractor-tests/macro-expansion-cfg/Cargo.lock b/rust/ql/test/extractor-tests/macro-expansion-cfg/Cargo.lock new file mode 100644 index 000000000000..b9856cfaf77d --- /dev/null +++ b/rust/ql/test/extractor-tests/macro-expansion-cfg/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "test" +version = "0.0.1" diff --git a/rust/ql/test/extractor-tests/macro-expansion-cfg/cfg_macro.expected b/rust/ql/test/extractor-tests/macro-expansion-cfg/cfg_macro.expected new file mode 100644 index 000000000000..51ce8be37062 --- /dev/null +++ b/rust/ql/test/extractor-tests/macro-expansion-cfg/cfg_macro.expected @@ -0,0 +1,2 @@ +| cfg_macro.rs:15:1:15:15 | fn from_macro_enabled | from_macro_enabled | +| cfg_macro.rs:21:1:22:26 | fn direct_enabled | direct_enabled | diff --git a/rust/ql/test/extractor-tests/macro-expansion-cfg/cfg_macro.ql b/rust/ql/test/extractor-tests/macro-expansion-cfg/cfg_macro.ql new file mode 100644 index 000000000000..93c4b4d80edf --- /dev/null +++ b/rust/ql/test/extractor-tests/macro-expansion-cfg/cfg_macro.ql @@ -0,0 +1,6 @@ +import rust +import TestUtils + +query predicate functions(Function f, string name) { + toBeTested(f) and name = f.getName().getText() +} diff --git a/rust/ql/test/extractor-tests/macro-expansion-cfg/cfg_macro.rs b/rust/ql/test/extractor-tests/macro-expansion-cfg/cfg_macro.rs new file mode 100644 index 000000000000..ea4799b49b5e --- /dev/null +++ b/rust/ql/test/extractor-tests/macro-expansion-cfg/cfg_macro.rs @@ -0,0 +1,22 @@ +// Regression test: `#[cfg(...)]`-disabled items produced by a macro expansion must be +// excluded from extraction, just like disabled items written directly in a source file. +// `any()` is always false and `all()` is always true, so this does not depend on crate features. + +macro_rules! make_cfg_items { + () => { + #[cfg(any())] // always false: must be excluded + pub fn from_macro_disabled() {} + + #[cfg(all())] // always true: must be kept + pub fn from_macro_enabled() {} + }; +} + +make_cfg_items!(); + +// Baseline: the same predicates on items written directly in the file (not via a macro). +#[cfg(any())] // always false: must be excluded +pub fn direct_disabled() {} + +#[cfg(all())] // always true: must be kept +pub fn direct_enabled() {} From 1d1594e20c7ebaac30130e73f37b96e30967d938 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 10 Aug 2026 13:33:44 +0000 Subject: [PATCH 0210/2098] Add taint flow summaries for list.extend and list.insert Co-authored-by: hvitved <3667920+hvitved@users.noreply.github.com> --- .../2026-08-10-list-extend-insert-taint.md | 4 ++ .../lib/semmle/python/frameworks/Stdlib.qll | 64 +++++++++++++++++++ .../dataflow/coverage/test_builtins.py | 10 +++ .../test_collections.py | 34 ++++++++++ 4 files changed, 112 insertions(+) create mode 100644 python/ql/lib/change-notes/2026-08-10-list-extend-insert-taint.md diff --git a/python/ql/lib/change-notes/2026-08-10-list-extend-insert-taint.md b/python/ql/lib/change-notes/2026-08-10-list-extend-insert-taint.md new file mode 100644 index 000000000000..db362bde20f6 --- /dev/null +++ b/python/ql/lib/change-notes/2026-08-10-list-extend-insert-taint.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added taint flow through `list.extend` and `list.insert`, matching the existing taint flow through `list.append`. diff --git a/python/ql/lib/semmle/python/frameworks/Stdlib.qll b/python/ql/lib/semmle/python/frameworks/Stdlib.qll index df69a010fd8b..327b4a2629e5 100644 --- a/python/ql/lib/semmle/python/frameworks/Stdlib.qll +++ b/python/ql/lib/semmle/python/frameworks/Stdlib.qll @@ -4879,6 +4879,70 @@ module StdlibPrivate { } } + /** + * A flow summary for `list.extend`. + * + * See https://docs.python.org/3.10/library/stdtypes.html#typesseq-mutable + */ + class ListExtend extends SummarizedCallable::Range { + ListExtend() { this = "list.extend" } + + override DataFlow::CallCfgNode getACall() { + result.(DataFlow::MethodCallNode).calls(_, "extend") + } + + override DataFlow::ArgumentNode getACallback() { + result.(DataFlow::AttrRead).getAttributeName() = "extend" + } + + override predicate propagatesFlow(string input, string output, boolean preservesValue) { + // elements of the newly added iterable are added to this + ( + input = "Argument[0].ListElement" + or + input = "Argument[0].SetElement" + or + input = "Argument[0].AnyTupleElement" + ) and + output = "Argument[self].ListElement" and + preservesValue = true + or + // transfer taint from new iterable to this (TODO: remove in future when taint-handling is more in line with other languages) + input = "Argument[0]" and + output = "Argument[self]" and + preservesValue = false + } + } + + /** + * A flow summary for `list.insert`. + * + * See https://docs.python.org/3.10/library/stdtypes.html#typesseq-mutable + */ + class ListInsert extends SummarizedCallable::Range { + ListInsert() { this = "list.insert" } + + override DataFlow::CallCfgNode getACall() { + result.(DataFlow::MethodCallNode).calls(_, "insert") + } + + override DataFlow::ArgumentNode getACallback() { + result.(DataFlow::AttrRead).getAttributeName() = "insert" + } + + override predicate propagatesFlow(string input, string output, boolean preservesValue) { + // newly added element added to this + input = "Argument[1]" and + output = "Argument[self].ListElement" and + preservesValue = true + or + // transfer taint from new element to this (TODO: remove in future when taint-handling is more in line with other languages) + input = "Argument[1]" and + output = "Argument[self]" and + preservesValue = false + } + } + /** * A flow summary for `set.add`. * diff --git a/python/ql/test/library-tests/dataflow/coverage/test_builtins.py b/python/ql/test/library-tests/dataflow/coverage/test_builtins.py index 7ef7866ec175..bff447335449 100644 --- a/python/ql/test/library-tests/dataflow/coverage/test_builtins.py +++ b/python/ql/test/library-tests/dataflow/coverage/test_builtins.py @@ -181,6 +181,16 @@ def test_list_append(): l.append(SOURCE) SINK(l[1]) # $ flow="SOURCE, l:-1 -> l[1]" +def test_list_extend(): + l = [NONSOURCE] + l.extend([SOURCE]) + SINK(l[1]) # $ flow="SOURCE, l:-1 -> l[1]" + +def test_list_insert(): + l = [NONSOURCE] + l.insert(0, SOURCE) + SINK(l[0]) # $ flow="SOURCE, l:-1 -> l[0]" + ### Set def test_set_pop(): diff --git a/python/ql/test/library-tests/dataflow/tainttracking/defaultAdditionalTaintStep/test_collections.py b/python/ql/test/library-tests/dataflow/tainttracking/defaultAdditionalTaintStep/test_collections.py index fa6087f3ebcd..f738e14af8d4 100644 --- a/python/ql/test/library-tests/dataflow/tainttracking/defaultAdditionalTaintStep/test_collections.py +++ b/python/ql/test/library-tests/dataflow/tainttracking/defaultAdditionalTaintStep/test_collections.py @@ -232,6 +232,37 @@ def list_extend(): ensure_not_tainted(my_list) my_list.extend(tainted_list) + ensure_tainted(my_list) # $ tainted + + +def list_extend_iteration(): + my_list = ["safe"] + tainted_list = [TAINTED_STRING] + + ensure_not_tainted(my_list) + + my_list.extend(tainted_list) + for x in my_list: + ensure_tainted(x) # $ tainted + + +def list_insert(): + tainted_string = TAINTED_STRING + my_list = ["safe"] + + ensure_not_tainted(my_list) + + my_list.insert(0, tainted_string) + ensure_tainted(my_list) # $ tainted + + +def list_iadd(): + my_list = ["safe"] + tainted_list = [TAINTED_STRING] + + ensure_not_tainted(my_list) + + my_list += tainted_list ensure_tainted(my_list) # $ MISSING: tainted @@ -308,6 +339,9 @@ def set_add(): list_index_aug_assign() list_append() list_extend() +list_extend_iteration() +list_insert() +list_iadd() dict_update_dict() dict_update_kv_list() From c567c679a41ae6a5d8542ea8bce3e43740a0dde5 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Mon, 10 Aug 2026 15:57:05 +0200 Subject: [PATCH 0211/2098] Rust: Accept expected-file changes from CI Apply .expected diffs from the Rust Language Tests CI runs following the cfg-exclusion fix: duplicate flow rows from macro/cfg double-extraction are removed and platform-gated models no longer double-load, which clears the associated consistency violations. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 4ee033fb-30ad-4617-9922-bc0f1088ba81 --- .../PathResolutionConsistency.expected | 3 - .../ExtractionConsistency.expected | 2 - .../PathResolutionConsistency.expected | 2 - .../ExtractionConsistency.expected | 2 - .../PathResolutionConsistency.expected | 3 - .../ExtractionConsistency.expected | 2 - .../PathResolutionConsistency.expected | 6 - .../TypeInferenceConsistency.expected | 4 - .../ExtractionConsistency.expected | 2 - .../PathResolutionConsistency.expected | 3 - .../ExtractionConsistency.expected | 2 - .../PathResolutionConsistency.expected | 5 - .../ExtractionConsistency.expected | 2 - .../PathResolutionConsistency.expected | 5 - .../ExtractionConsistency.expected | 2 - .../PathResolutionConsistency.expected | 3 - .../PathResolutionConsistency.expected | 6 - .../PathResolutionConsistency.expected | 12 -- .../ExtractionConsistency.expected | 22 -- .../PathResolutionConsistency.expected | 4 - .../PathResolutionConsistency.expected | 9 - .../UncontrolledAllocationSize.expected | 196 ++++++++---------- .../CWE-825/AccessInvalidPointer.expected | 4 - .../PathResolutionConsistency.expected | 3 - .../PathResolutionConsistency.expected | 4 - .../TypeInferenceConsistency.expected | 8 - 26 files changed, 89 insertions(+), 227 deletions(-) delete mode 100644 rust/ql/test/library-tests/dataflow/models/CONSISTENCY/PathResolutionConsistency.expected delete mode 100644 rust/ql/test/library-tests/dataflow/sources/database/CONSISTENCY/ExtractionConsistency.expected delete mode 100644 rust/ql/test/library-tests/dataflow/sources/file/CONSISTENCY/ExtractionConsistency.expected delete mode 100644 rust/ql/test/library-tests/dataflow/sources/file/CONSISTENCY/PathResolutionConsistency.expected delete mode 100644 rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/ExtractionConsistency.expected delete mode 100644 rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/PathResolutionConsistency.expected delete mode 100644 rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/TypeInferenceConsistency.expected delete mode 100644 rust/ql/test/library-tests/dataflow/sources/stdin/CONSISTENCY/ExtractionConsistency.expected delete mode 100644 rust/ql/test/library-tests/dataflow/sources/stdin/CONSISTENCY/PathResolutionConsistency.expected delete mode 100644 rust/ql/test/library-tests/dataflow/sources/web_frameworks/CONSISTENCY/ExtractionConsistency.expected delete mode 100644 rust/ql/test/library-tests/dataflow/sources/web_frameworks/CONSISTENCY/PathResolutionConsistency.expected delete mode 100644 rust/ql/test/query-tests/security/CWE-079/axum/CONSISTENCY/ExtractionConsistency.expected delete mode 100644 rust/ql/test/query-tests/security/CWE-079/axum/CONSISTENCY/PathResolutionConsistency.expected delete mode 100644 rust/ql/test/query-tests/security/CWE-079/warp/CONSISTENCY/ExtractionConsistency.expected delete mode 100644 rust/ql/test/query-tests/security/CWE-079/warp/CONSISTENCY/PathResolutionConsistency.expected delete mode 100644 rust/ql/test/query-tests/security/CWE-295/CONSISTENCY/PathResolutionConsistency.expected delete mode 100644 rust/ql/test/query-tests/security/CWE-311/CONSISTENCY/PathResolutionConsistency.expected delete mode 100644 rust/ql/test/query-tests/security/CWE-696/CONSISTENCY/ExtractionConsistency.expected delete mode 100644 rust/ql/test/query-tests/security/CWE-696/CONSISTENCY/PathResolutionConsistency.expected delete mode 100644 rust/ql/test/query-tests/security/CWE-770/CONSISTENCY/PathResolutionConsistency.expected delete mode 100644 rust/ql/test/query-tests/security/CWE-825/CONSISTENCY/PathResolutionConsistency.expected delete mode 100644 rust/ql/test/query-tests/security/CWE-918/CONSISTENCY/PathResolutionConsistency.expected delete mode 100644 rust/ql/test/query-tests/security/CWE-918/CONSISTENCY/TypeInferenceConsistency.expected diff --git a/rust/ql/test/library-tests/dataflow/models/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/models/CONSISTENCY/PathResolutionConsistency.expected deleted file mode 100644 index e30b94a59e93..000000000000 --- a/rust/ql/test/library-tests/dataflow/models/CONSISTENCY/PathResolutionConsistency.expected +++ /dev/null @@ -1,3 +0,0 @@ -multiplePathResolutions -| main.rs:433:3:433:13 | ...::main | -| main.rs:455:5:455:7 | ...::runtime | diff --git a/rust/ql/test/library-tests/dataflow/sources/database/CONSISTENCY/ExtractionConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/database/CONSISTENCY/ExtractionConsistency.expected deleted file mode 100644 index 61ef42d077a4..000000000000 --- a/rust/ql/test/library-tests/dataflow/sources/database/CONSISTENCY/ExtractionConsistency.expected +++ /dev/null @@ -1,2 +0,0 @@ -extractionWarning -| test.rs:221:7:221:10 | macro expansion failed for 'panic' | diff --git a/rust/ql/test/library-tests/dataflow/sources/database/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/database/CONSISTENCY/PathResolutionConsistency.expected index a43ac755ca4f..b6a4a56f9f77 100644 --- a/rust/ql/test/library-tests/dataflow/sources/database/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/dataflow/sources/database/CONSISTENCY/PathResolutionConsistency.expected @@ -1,5 +1,3 @@ multiplePathResolutions | test.rs:10:28:10:65 | Result::<...> | | test.rs:97:40:97:49 | Result::<...> | -| test.rs:207:3:207:13 | ...::main | -| test.rs:221:5:221:6 | ...::runtime | diff --git a/rust/ql/test/library-tests/dataflow/sources/file/CONSISTENCY/ExtractionConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/file/CONSISTENCY/ExtractionConsistency.expected deleted file mode 100644 index 9f7a9af6e891..000000000000 --- a/rust/ql/test/library-tests/dataflow/sources/file/CONSISTENCY/ExtractionConsistency.expected +++ /dev/null @@ -1,2 +0,0 @@ -extractionWarning -| test.rs:326:7:326:10 | macro expansion failed for 'panic' | diff --git a/rust/ql/test/library-tests/dataflow/sources/file/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/file/CONSISTENCY/PathResolutionConsistency.expected deleted file mode 100644 index 83f2dd8d73c3..000000000000 --- a/rust/ql/test/library-tests/dataflow/sources/file/CONSISTENCY/PathResolutionConsistency.expected +++ /dev/null @@ -1,3 +0,0 @@ -multiplePathResolutions -| test.rs:294:3:294:13 | ...::main | -| test.rs:326:5:326:6 | ...::runtime | diff --git a/rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/ExtractionConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/ExtractionConsistency.expected deleted file mode 100644 index bc5b5c896a5a..000000000000 --- a/rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/ExtractionConsistency.expected +++ /dev/null @@ -1,2 +0,0 @@ -extractionWarning -| test.rs:563:7:563:10 | macro expansion failed for 'panic' | diff --git a/rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/PathResolutionConsistency.expected deleted file mode 100644 index 5be3b1490017..000000000000 --- a/rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/PathResolutionConsistency.expected +++ /dev/null @@ -1,6 +0,0 @@ -multipleResolvedTargets -| test.rs:23:26:23:66 | ... .text() | -| test.rs:26:26:26:67 | ... .bytes() | -multiplePathResolutions -| test.rs:517:3:517:13 | ...::main | -| test.rs:563:5:563:6 | ...::runtime | diff --git a/rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/TypeInferenceConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/TypeInferenceConsistency.expected deleted file mode 100644 index 2242144075b9..000000000000 --- a/rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/TypeInferenceConsistency.expected +++ /dev/null @@ -1,4 +0,0 @@ -nonUniqueCertainType -| test.rs:23:26:23:52 | ...::get(...) | dyn(Output).T | -| test.rs:26:26:26:52 | ...::get(...) | dyn(Output).T | -| test.rs:29:24:29:50 | ...::get(...) | dyn(Output).T | diff --git a/rust/ql/test/library-tests/dataflow/sources/stdin/CONSISTENCY/ExtractionConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/stdin/CONSISTENCY/ExtractionConsistency.expected deleted file mode 100644 index 1669b7895193..000000000000 --- a/rust/ql/test/library-tests/dataflow/sources/stdin/CONSISTENCY/ExtractionConsistency.expected +++ /dev/null @@ -1,2 +0,0 @@ -extractionWarning -| test.rs:218:7:218:10 | macro expansion failed for 'panic' | diff --git a/rust/ql/test/library-tests/dataflow/sources/stdin/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/stdin/CONSISTENCY/PathResolutionConsistency.expected deleted file mode 100644 index a74204eaf517..000000000000 --- a/rust/ql/test/library-tests/dataflow/sources/stdin/CONSISTENCY/PathResolutionConsistency.expected +++ /dev/null @@ -1,3 +0,0 @@ -multiplePathResolutions -| test.rs:204:3:204:13 | ...::main | -| test.rs:218:5:218:6 | ...::runtime | diff --git a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/CONSISTENCY/ExtractionConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/CONSISTENCY/ExtractionConsistency.expected deleted file mode 100644 index eb9d8e47d74c..000000000000 --- a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/CONSISTENCY/ExtractionConsistency.expected +++ /dev/null @@ -1,2 +0,0 @@ -extractionWarning -| test.rs:267:62:267:62 | macro expansion failed for 'panic' | diff --git a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/CONSISTENCY/PathResolutionConsistency.expected deleted file mode 100644 index a57d64282229..000000000000 --- a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/CONSISTENCY/PathResolutionConsistency.expected +++ /dev/null @@ -1,5 +0,0 @@ -multiplePathResolutions -| test.rs:40:7:40:25 | ...::fmt | -| test.rs:40:7:40:25 | ...::fmt | -| test.rs:217:7:217:17 | ...::main | -| test.rs:267:9:267:12 | ...::runtime | diff --git a/rust/ql/test/query-tests/security/CWE-079/axum/CONSISTENCY/ExtractionConsistency.expected b/rust/ql/test/query-tests/security/CWE-079/axum/CONSISTENCY/ExtractionConsistency.expected deleted file mode 100644 index 39c3a932a0ba..000000000000 --- a/rust/ql/test/query-tests/security/CWE-079/axum/CONSISTENCY/ExtractionConsistency.expected +++ /dev/null @@ -1,2 +0,0 @@ -extractionWarning -| main.rs:19:46:19:46 | macro expansion failed for 'panic' | diff --git a/rust/ql/test/query-tests/security/CWE-079/axum/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-079/axum/CONSISTENCY/PathResolutionConsistency.expected deleted file mode 100644 index 5b4fc1e3902c..000000000000 --- a/rust/ql/test/query-tests/security/CWE-079/axum/CONSISTENCY/PathResolutionConsistency.expected +++ /dev/null @@ -1,5 +0,0 @@ -multiplePathResolutions -| main.rs:3:3:3:28 | ...::fmt | -| main.rs:3:3:3:28 | ...::fmt | -| main.rs:13:3:13:13 | ...::main | -| main.rs:19:5:19:8 | ...::runtime | diff --git a/rust/ql/test/query-tests/security/CWE-079/warp/CONSISTENCY/ExtractionConsistency.expected b/rust/ql/test/query-tests/security/CWE-079/warp/CONSISTENCY/ExtractionConsistency.expected deleted file mode 100644 index 133438cef21c..000000000000 --- a/rust/ql/test/query-tests/security/CWE-079/warp/CONSISTENCY/ExtractionConsistency.expected +++ /dev/null @@ -1,2 +0,0 @@ -extractionWarning -| main.rs:1:1:1:1 | macro expansion failed for 'panic' | diff --git a/rust/ql/test/query-tests/security/CWE-079/warp/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-079/warp/CONSISTENCY/PathResolutionConsistency.expected deleted file mode 100644 index 63b00cc6d41b..000000000000 --- a/rust/ql/test/query-tests/security/CWE-079/warp/CONSISTENCY/PathResolutionConsistency.expected +++ /dev/null @@ -1,3 +0,0 @@ -multiplePathResolutions -| main.rs:3:3:3:13 | ...::main | -| main.rs:14:5:14:8 | ...::runtime | diff --git a/rust/ql/test/query-tests/security/CWE-295/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-295/CONSISTENCY/PathResolutionConsistency.expected deleted file mode 100644 index e4c71e75287c..000000000000 --- a/rust/ql/test/query-tests/security/CWE-295/CONSISTENCY/PathResolutionConsistency.expected +++ /dev/null @@ -1,6 +0,0 @@ -multipleResolvedTargets -| main.rs:36:16:36:41 | ...::builder(...) | -| main.rs:46:16:46:44 | ...::new(...) | -multiplePathResolutions -| main.rs:36:16:36:30 | ...::Client | -| main.rs:46:16:46:37 | ...::ClientBuilder | diff --git a/rust/ql/test/query-tests/security/CWE-311/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-311/CONSISTENCY/PathResolutionConsistency.expected deleted file mode 100644 index e0fbd93fd64a..000000000000 --- a/rust/ql/test/query-tests/security/CWE-311/CONSISTENCY/PathResolutionConsistency.expected +++ /dev/null @@ -1,12 +0,0 @@ -multipleResolvedTargets -| main.rs:20:18:20:39 | ...::new(...) | -| main.rs:21:5:21:20 | client.post(...) | -| main.rs:21:5:21:33 | ... .body(...) | -| main.rs:21:5:21:40 | ... .send() | -| main.rs:34:18:34:39 | ...::new(...) | -| main.rs:35:5:35:36 | client.request(...) | -| main.rs:35:5:35:49 | ... .body(...) | -| main.rs:35:5:35:56 | ... .send() | -multiplePathResolutions -| main.rs:20:18:20:32 | ...::Client | -| main.rs:34:18:34:32 | ...::Client | diff --git a/rust/ql/test/query-tests/security/CWE-696/CONSISTENCY/ExtractionConsistency.expected b/rust/ql/test/query-tests/security/CWE-696/CONSISTENCY/ExtractionConsistency.expected deleted file mode 100644 index e63e6374ba5b..000000000000 --- a/rust/ql/test/query-tests/security/CWE-696/CONSISTENCY/ExtractionConsistency.expected +++ /dev/null @@ -1,22 +0,0 @@ -extractionWarning -| test.rs:16:10:19:5 | macro expansion failed for 'compile_error' | -| test.rs:23:17:24:9 | macro expansion failed for 'compile_error' | -| test.rs:28:3:28:12 | macro expansion failed for 'compile_error' | -| test.rs:33:3:33:12 | macro expansion failed for 'compile_error' | -| test.rs:39:3:39:12 | macro expansion failed for 'compile_error' | -| test.rs:50:3:50:6 | macro expansion failed for 'compile_error' | -| test.rs:55:3:55:6 | macro expansion failed for 'compile_error' | -| test.rs:60:3:60:6 | macro expansion failed for 'compile_error' | -| test.rs:65:3:65:6 | macro expansion failed for 'compile_error' | -| test.rs:73:3:73:6 | macro expansion failed for 'compile_error' | -| test.rs:78:3:78:6 | macro expansion failed for 'compile_error' | -| test.rs:87:3:87:6 | macro expansion failed for 'compile_error' | -| test.rs:94:3:94:6 | macro expansion failed for 'compile_error' | -| test.rs:99:3:99:12 | macro expansion failed for 'compile_error' | -| test.rs:104:3:104:12 | macro expansion failed for 'compile_error' | -| test.rs:112:3:112:12 | macro expansion failed for 'compile_error' | -| test.rs:128:3:128:6 | macro expansion failed for 'compile_error' | -| test.rs:139:3:139:6 | macro expansion failed for 'compile_error' | -| test.rs:144:3:144:6 | macro expansion failed for 'compile_error' | -| test.rs:150:3:150:6 | macro expansion failed for 'compile_error' | -| test.rs:168:3:168:6 | macro expansion failed for 'compile_error' | diff --git a/rust/ql/test/query-tests/security/CWE-696/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-696/CONSISTENCY/PathResolutionConsistency.expected deleted file mode 100644 index 632d59f91e9e..000000000000 --- a/rust/ql/test/query-tests/security/CWE-696/CONSISTENCY/PathResolutionConsistency.expected +++ /dev/null @@ -1,4 +0,0 @@ -multiplePathResolutions -| test.rs:14:3:14:12 | harmless1_3___rust_dtor___dtor | -| test.rs:33:3:33:12 | bad1_2___rust_dtor___dtor | -| test.rs:39:3:39:12 | bad1_3___rust_dtor___dtor | diff --git a/rust/ql/test/query-tests/security/CWE-770/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-770/CONSISTENCY/PathResolutionConsistency.expected deleted file mode 100644 index 8fdcfa97d675..000000000000 --- a/rust/ql/test/query-tests/security/CWE-770/CONSISTENCY/PathResolutionConsistency.expected +++ /dev/null @@ -1,9 +0,0 @@ -multipleResolvedTargets -| main.rs:218:14:218:30 | ...::malloc(...) | -| main.rs:219:13:219:27 | ...::malloc(...) | -| main.rs:220:13:220:37 | ...::aligned_alloc(...) | -| main.rs:221:13:221:37 | ...::aligned_alloc(...) | -| main.rs:222:13:222:31 | ...::calloc(...) | -| main.rs:223:13:223:55 | ...::calloc(...) | -| main.rs:224:13:224:32 | ...::realloc(...) | -| main.rs:331:13:331:27 | ...::malloc(...) | diff --git a/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected b/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected index dca47ef0cdc2..477dbee0e0f4 100644 --- a/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected +++ b/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected @@ -42,21 +42,16 @@ | main.rs:210:40:210:50 | grow_zeroed | main.rs:339:13:339:26 | ...::args | main.rs:210:40:210:50 | grow_zeroed | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | | main.rs:213:36:213:41 | shrink | main.rs:339:13:339:26 | ...::args | main.rs:213:36:213:41 | shrink | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | | main.rs:219:13:219:24 | ...::malloc | main.rs:339:13:339:26 | ...::args | main.rs:219:13:219:24 | ...::malloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:219:13:219:24 | ...::malloc | main.rs:339:13:339:26 | ...::args | main.rs:219:13:219:24 | ...::malloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | | main.rs:220:13:220:31 | ...::aligned_alloc | main.rs:339:13:339:26 | ...::args | main.rs:220:13:220:31 | ...::aligned_alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | | main.rs:222:13:222:24 | ...::calloc | main.rs:339:13:339:26 | ...::args | main.rs:222:13:222:24 | ...::calloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:222:13:222:24 | ...::calloc | main.rs:339:13:339:26 | ...::args | main.rs:222:13:222:24 | ...::calloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:223:13:223:24 | ...::calloc | main.rs:339:13:339:26 | ...::args | main.rs:223:13:223:24 | ...::calloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | | main.rs:223:13:223:24 | ...::calloc | main.rs:339:13:339:26 | ...::args | main.rs:223:13:223:24 | ...::calloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | | main.rs:224:13:224:25 | ...::realloc | main.rs:339:13:339:26 | ...::args | main.rs:224:13:224:25 | ...::realloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:224:13:224:25 | ...::realloc | main.rs:339:13:339:26 | ...::args | main.rs:224:13:224:25 | ...::realloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | | main.rs:228:13:228:41 | ...::try_with_capacity | main.rs:339:13:339:26 | ...::args | main.rs:228:13:228:41 | ...::try_with_capacity | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | | main.rs:229:13:229:37 | ...::with_capacity | main.rs:339:13:339:26 | ...::args | main.rs:229:13:229:37 | ...::with_capacity | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | | main.rs:230:13:230:44 | ...::try_with_capacity_in | main.rs:339:13:339:26 | ...::args | main.rs:230:13:230:44 | ...::try_with_capacity_in | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | | main.rs:231:13:231:40 | ...::with_capacity_in | main.rs:339:13:339:26 | ...::args | main.rs:231:13:231:40 | ...::with_capacity_in | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | | main.rs:287:22:287:38 | ...::alloc | main.rs:311:25:311:38 | ...::args | main.rs:287:22:287:38 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:311:25:311:38 | ...::args | user-provided value | | main.rs:331:13:331:24 | ...::malloc | main.rs:339:13:339:26 | ...::args | main.rs:331:13:331:24 | ...::malloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:331:13:331:24 | ...::malloc | main.rs:339:13:339:26 | ...::args | main.rs:331:13:331:24 | ...::malloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | edges | main.rs:12:36:12:43 | ...: usize | main.rs:18:41:18:41 | v | provenance | | | main.rs:18:41:18:41 | v | main.rs:18:13:18:31 | ...::realloc | provenance | MaD:17 Sink:MaD:17 | @@ -65,43 +60,43 @@ edges | main.rs:18:41:18:41 | v | main.rs:32:60:32:60 | v | provenance | | | main.rs:18:41:18:41 | v | main.rs:35:49:35:49 | v | provenance | | | main.rs:20:9:20:10 | l2 | main.rs:21:31:21:32 | l2 | provenance | | -| main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | main.rs:20:14:20:63 | ... .unwrap() | provenance | MaD:44 | +| main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | main.rs:20:14:20:63 | ... .unwrap() | provenance | MaD:41 | | main.rs:20:14:20:63 | ... .unwrap() | main.rs:20:9:20:10 | l2 | provenance | | -| main.rs:20:50:20:50 | v | main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | provenance | MaD:36 | +| main.rs:20:50:20:50 | v | main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | provenance | MaD:33 | | main.rs:21:31:21:32 | l2 | main.rs:21:13:21:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:21:31:21:32 | l2 | main.rs:22:31:22:32 | l2 | provenance | | | main.rs:21:31:21:32 | l2 | main.rs:23:31:23:32 | l2 | provenance | | | main.rs:21:31:21:32 | l2 | main.rs:24:38:24:39 | l2 | provenance | | -| main.rs:22:31:22:32 | l2 | main.rs:22:31:22:44 | l2.align_to(...) [Ok] | provenance | MaD:30 | -| main.rs:22:31:22:44 | l2.align_to(...) [Ok] | main.rs:22:31:22:53 | ... .unwrap() | provenance | MaD:44 | +| main.rs:22:31:22:32 | l2 | main.rs:22:31:22:44 | l2.align_to(...) [Ok] | provenance | MaD:27 | +| main.rs:22:31:22:44 | l2.align_to(...) [Ok] | main.rs:22:31:22:53 | ... .unwrap() | provenance | MaD:41 | | main.rs:22:31:22:53 | ... .unwrap() | main.rs:22:13:22:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:23:31:23:32 | l2 | main.rs:23:31:23:44 | l2.align_to(...) [Ok] | provenance | MaD:30 | -| main.rs:23:31:23:44 | l2.align_to(...) [Ok] | main.rs:23:31:23:53 | ... .unwrap() | provenance | MaD:44 | -| main.rs:23:31:23:53 | ... .unwrap() | main.rs:23:31:23:68 | ... .pad_to_align() | provenance | MaD:38 | +| main.rs:23:31:23:32 | l2 | main.rs:23:31:23:44 | l2.align_to(...) [Ok] | provenance | MaD:27 | +| main.rs:23:31:23:44 | l2.align_to(...) [Ok] | main.rs:23:31:23:53 | ... .unwrap() | provenance | MaD:41 | +| main.rs:23:31:23:53 | ... .unwrap() | main.rs:23:31:23:68 | ... .pad_to_align() | provenance | MaD:35 | | main.rs:23:31:23:68 | ... .pad_to_align() | main.rs:23:13:23:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:24:38:24:39 | l2 | main.rs:24:13:24:36 | ...::alloc_zeroed | provenance | MaD:16 Sink:MaD:16 | | main.rs:29:9:29:10 | l4 | main.rs:30:31:30:32 | l4 | provenance | | | main.rs:29:14:29:64 | ...::from_size_align_unchecked(...) | main.rs:29:9:29:10 | l4 | provenance | | -| main.rs:29:60:29:60 | v | main.rs:29:14:29:64 | ...::from_size_align_unchecked(...) | provenance | MaD:37 | +| main.rs:29:60:29:60 | v | main.rs:29:14:29:64 | ...::from_size_align_unchecked(...) | provenance | MaD:34 | | main.rs:30:31:30:32 | l4 | main.rs:30:13:30:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:32:9:32:10 | l5 | main.rs:33:31:33:32 | l5 | provenance | | | main.rs:32:14:32:118 | ...::from_size_align_unchecked(...) | main.rs:32:9:32:10 | l5 | provenance | | -| main.rs:32:60:32:60 | v | main.rs:32:60:32:89 | ... * ... | provenance | MaD:28 | -| main.rs:32:60:32:89 | ... * ... | main.rs:32:14:32:118 | ...::from_size_align_unchecked(...) | provenance | MaD:37 | +| main.rs:32:60:32:60 | v | main.rs:32:60:32:89 | ... * ... | provenance | MaD:25 | +| main.rs:32:60:32:89 | ... * ... | main.rs:32:14:32:118 | ...::from_size_align_unchecked(...) | provenance | MaD:34 | | main.rs:33:31:33:32 | l5 | main.rs:33:13:33:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:35:9:35:10 | s6 | main.rs:36:60:36:61 | s6 | provenance | | | main.rs:35:14:35:54 | ... + ... | main.rs:35:9:35:10 | s6 | provenance | | -| main.rs:35:15:35:49 | ... * ... | main.rs:35:14:35:54 | ... + ... | provenance | MaD:27 | -| main.rs:35:49:35:49 | v | main.rs:35:15:35:49 | ... * ... | provenance | MaD:28 | +| main.rs:35:15:35:49 | ... * ... | main.rs:35:14:35:54 | ... + ... | provenance | MaD:24 | +| main.rs:35:49:35:49 | v | main.rs:35:15:35:49 | ... * ... | provenance | MaD:25 | | main.rs:36:9:36:10 | l6 | main.rs:37:31:37:32 | l6 | provenance | | | main.rs:36:14:36:65 | ...::from_size_align_unchecked(...) | main.rs:36:9:36:10 | l6 | provenance | | -| main.rs:36:60:36:61 | s6 | main.rs:36:14:36:65 | ...::from_size_align_unchecked(...) | provenance | MaD:37 | +| main.rs:36:60:36:61 | s6 | main.rs:36:14:36:65 | ...::from_size_align_unchecked(...) | provenance | MaD:34 | | main.rs:37:31:37:32 | l6 | main.rs:37:13:37:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:37:31:37:32 | l6 | main.rs:39:60:39:61 | l6 | provenance | | | main.rs:39:9:39:10 | l7 | main.rs:40:31:40:32 | l7 | provenance | | | main.rs:39:14:39:72 | ...::from_size_align_unchecked(...) | main.rs:39:9:39:10 | l7 | provenance | | -| main.rs:39:60:39:61 | l6 | main.rs:39:60:39:68 | l6.size() | provenance | MaD:41 | -| main.rs:39:60:39:68 | l6.size() | main.rs:39:14:39:72 | ...::from_size_align_unchecked(...) | provenance | MaD:37 | +| main.rs:39:60:39:61 | l6 | main.rs:39:60:39:68 | l6.size() | provenance | MaD:38 | +| main.rs:39:60:39:68 | l6.size() | main.rs:39:14:39:72 | ...::from_size_align_unchecked(...) | provenance | MaD:34 | | main.rs:40:31:40:32 | l7 | main.rs:40:13:40:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:43:44:43:51 | ...: usize | main.rs:50:41:50:41 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:51:41:51:41 | v | provenance | | @@ -109,27 +104,27 @@ edges | main.rs:43:44:43:51 | ...: usize | main.rs:54:48:54:48 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:58:34:58:34 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:67:46:67:46 | v | provenance | | -| main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | main.rs:50:31:50:51 | ... .unwrap() [tuple.0] | provenance | MaD:44 | +| main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | main.rs:50:31:50:51 | ... .unwrap() [tuple.0] | provenance | MaD:41 | | main.rs:50:31:50:51 | ... .unwrap() [tuple.0] | main.rs:50:31:50:53 | ... .0 | provenance | | | main.rs:50:31:50:53 | ... .0 | main.rs:50:13:50:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:50:41:50:41 | v | main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:39 | -| main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | main.rs:51:31:51:55 | ... .unwrap() [tuple.0] | provenance | MaD:44 | +| main.rs:50:41:50:41 | v | main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:36 | +| main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | main.rs:51:31:51:55 | ... .unwrap() [tuple.0] | provenance | MaD:41 | | main.rs:51:31:51:55 | ... .unwrap() [tuple.0] | main.rs:51:31:51:57 | ... .0 | provenance | | | main.rs:51:31:51:57 | ... .0 | main.rs:51:13:51:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:51:41:51:41 | v | main.rs:51:41:51:45 | ... + ... | provenance | MaD:27 | -| main.rs:51:41:51:45 | ... + ... | main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:39 | -| main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | main.rs:53:31:53:58 | ... .unwrap() | provenance | MaD:44 | +| main.rs:51:41:51:41 | v | main.rs:51:41:51:45 | ... + ... | provenance | MaD:24 | +| main.rs:51:41:51:45 | ... + ... | main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:36 | +| main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | main.rs:53:31:53:58 | ... .unwrap() | provenance | MaD:41 | | main.rs:53:31:53:58 | ... .unwrap() | main.rs:53:13:53:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:53:48:53:48 | v | main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | provenance | MaD:40 | -| main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | main.rs:54:31:54:63 | ... .unwrap() | provenance | MaD:44 | +| main.rs:53:48:53:48 | v | main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | provenance | MaD:37 | +| main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | main.rs:54:31:54:63 | ... .unwrap() | provenance | MaD:41 | | main.rs:54:31:54:63 | ... .unwrap() | main.rs:54:13:54:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:54:48:54:48 | v | main.rs:54:48:54:53 | ... * ... | provenance | MaD:28 | -| main.rs:54:48:54:53 | ... * ... | main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | provenance | MaD:40 | +| main.rs:54:48:54:48 | v | main.rs:54:48:54:53 | ... * ... | provenance | MaD:25 | +| main.rs:54:48:54:53 | ... * ... | main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | provenance | MaD:37 | | main.rs:58:9:58:20 | TuplePat [tuple.0] | main.rs:58:10:58:11 | k1 | provenance | | | main.rs:58:10:58:11 | k1 | main.rs:59:31:59:32 | k1 | provenance | | -| main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | main.rs:58:24:58:66 | ... .expect(...) [tuple.0] | provenance | MaD:43 | +| main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | main.rs:58:24:58:66 | ... .expect(...) [tuple.0] | provenance | MaD:40 | | main.rs:58:24:58:66 | ... .expect(...) [tuple.0] | main.rs:58:9:58:20 | TuplePat [tuple.0] | provenance | | -| main.rs:58:34:58:34 | v | main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | provenance | MaD:39 | +| main.rs:58:34:58:34 | v | main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | provenance | MaD:36 | | main.rs:59:31:59:32 | k1 | main.rs:59:13:59:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:59:31:59:32 | k1 | main.rs:60:34:60:35 | k1 | provenance | | | main.rs:59:31:59:32 | k1 | main.rs:62:24:62:25 | k1 | provenance | | @@ -137,32 +132,32 @@ edges | main.rs:59:31:59:32 | k1 | main.rs:65:31:65:32 | k1 | provenance | | | main.rs:60:9:60:20 | TuplePat [tuple.0] | main.rs:60:10:60:11 | k2 | provenance | | | main.rs:60:10:60:11 | k2 | main.rs:61:31:61:32 | k2 | provenance | | -| main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | main.rs:60:24:60:45 | ... .unwrap() [tuple.0] | provenance | MaD:44 | +| main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | main.rs:60:24:60:45 | ... .unwrap() [tuple.0] | provenance | MaD:41 | | main.rs:60:24:60:45 | ... .unwrap() [tuple.0] | main.rs:60:9:60:20 | TuplePat [tuple.0] | provenance | | -| main.rs:60:34:60:35 | k1 | main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | provenance | MaD:32 | +| main.rs:60:34:60:35 | k1 | main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | provenance | MaD:29 | | main.rs:61:31:61:32 | k2 | main.rs:61:13:61:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:62:9:62:20 | TuplePat [tuple.0] | main.rs:62:10:62:11 | k3 | provenance | | | main.rs:62:10:62:11 | k3 | main.rs:63:31:63:32 | k3 | provenance | | -| main.rs:62:24:62:25 | k1 | main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | provenance | MaD:33 | -| main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | main.rs:62:24:62:45 | ... .unwrap() [tuple.0] | provenance | MaD:44 | +| main.rs:62:24:62:25 | k1 | main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | provenance | MaD:30 | +| main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | main.rs:62:24:62:45 | ... .unwrap() [tuple.0] | provenance | MaD:41 | | main.rs:62:24:62:45 | ... .unwrap() [tuple.0] | main.rs:62:9:62:20 | TuplePat [tuple.0] | provenance | | | main.rs:63:31:63:32 | k3 | main.rs:63:13:63:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | main.rs:64:31:64:59 | ... .unwrap() | provenance | MaD:44 | +| main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | main.rs:64:31:64:59 | ... .unwrap() | provenance | MaD:41 | | main.rs:64:31:64:59 | ... .unwrap() | main.rs:64:13:64:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:64:48:64:49 | k1 | main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | provenance | MaD:34 | -| main.rs:65:31:65:32 | k1 | main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | provenance | MaD:35 | -| main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | main.rs:65:31:65:59 | ... .unwrap() | provenance | MaD:44 | +| main.rs:64:48:64:49 | k1 | main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | provenance | MaD:31 | +| main.rs:65:31:65:32 | k1 | main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | provenance | MaD:32 | +| main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | main.rs:65:31:65:59 | ... .unwrap() | provenance | MaD:41 | | main.rs:65:31:65:59 | ... .unwrap() | main.rs:65:13:65:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:67:9:67:10 | l4 | main.rs:68:31:68:32 | l4 | provenance | | -| main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | main.rs:67:14:67:56 | ... .unwrap() | provenance | MaD:44 | +| main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | main.rs:67:14:67:56 | ... .unwrap() | provenance | MaD:41 | | main.rs:67:14:67:56 | ... .unwrap() | main.rs:67:9:67:10 | l4 | provenance | | -| main.rs:67:46:67:46 | v | main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | provenance | MaD:31 | +| main.rs:67:46:67:46 | v | main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | | main.rs:68:31:68:32 | l4 | main.rs:68:13:68:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:86:35:86:42 | ...: usize | main.rs:87:54:87:54 | v | provenance | | | main.rs:87:9:87:14 | layout | main.rs:88:31:88:36 | layout | provenance | | -| main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | main.rs:87:18:87:67 | ... .unwrap() | provenance | MaD:44 | +| main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | main.rs:87:18:87:67 | ... .unwrap() | provenance | MaD:41 | | main.rs:87:18:87:67 | ... .unwrap() | main.rs:87:9:87:14 | layout | provenance | | -| main.rs:87:54:87:54 | v | main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | provenance | MaD:36 | +| main.rs:87:54:87:54 | v | main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | provenance | MaD:33 | | main.rs:88:31:88:36 | layout | main.rs:88:13:88:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:91:38:91:45 | ...: usize | main.rs:92:47:92:47 | v | provenance | | | main.rs:91:38:91:45 | ...: usize | main.rs:101:51:101:51 | v | provenance | | @@ -173,16 +168,16 @@ edges | main.rs:91:38:91:45 | ...: usize | main.rs:161:55:161:55 | v | provenance | | | main.rs:92:9:92:10 | l1 | main.rs:96:35:96:36 | l1 | provenance | | | main.rs:92:9:92:10 | l1 | main.rs:102:35:102:36 | l1 | provenance | | -| main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | main.rs:92:14:92:57 | ... .unwrap() | provenance | MaD:44 | +| main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | main.rs:92:14:92:57 | ... .unwrap() | provenance | MaD:41 | | main.rs:92:14:92:57 | ... .unwrap() | main.rs:92:9:92:10 | l1 | provenance | | -| main.rs:92:47:92:47 | v | main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | provenance | MaD:31 | +| main.rs:92:47:92:47 | v | main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | | main.rs:96:35:96:36 | l1 | main.rs:96:17:96:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:96:35:96:36 | l1 | main.rs:109:35:109:36 | l1 | provenance | | | main.rs:96:35:96:36 | l1 | main.rs:111:35:111:36 | l1 | provenance | | | main.rs:101:13:101:14 | l3 | main.rs:103:35:103:36 | l3 | provenance | | -| main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | main.rs:101:18:101:61 | ... .unwrap() | provenance | MaD:44 | +| main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | main.rs:101:18:101:61 | ... .unwrap() | provenance | MaD:41 | | main.rs:101:18:101:61 | ... .unwrap() | main.rs:101:13:101:14 | l3 | provenance | | -| main.rs:101:51:101:51 | v | main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | provenance | MaD:31 | +| main.rs:101:51:101:51 | v | main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | | main.rs:102:35:102:36 | l1 | main.rs:102:17:102:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:102:35:102:36 | l1 | main.rs:109:35:109:36 | l1 | provenance | | | main.rs:102:35:102:36 | l1 | main.rs:111:35:111:36 | l1 | provenance | | @@ -193,28 +188,28 @@ edges | main.rs:111:35:111:36 | l1 | main.rs:111:17:111:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:111:35:111:36 | l1 | main.rs:146:35:146:36 | l1 | provenance | | | main.rs:145:13:145:14 | l9 | main.rs:148:35:148:36 | l9 | provenance | | -| main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | main.rs:145:18:145:61 | ... .unwrap() | provenance | MaD:44 | +| main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | main.rs:145:18:145:61 | ... .unwrap() | provenance | MaD:41 | | main.rs:145:18:145:61 | ... .unwrap() | main.rs:145:13:145:14 | l9 | provenance | | -| main.rs:145:51:145:51 | v | main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | provenance | MaD:31 | +| main.rs:145:51:145:51 | v | main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | | main.rs:146:35:146:36 | l1 | main.rs:146:17:146:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:146:35:146:36 | l1 | main.rs:177:31:177:32 | l1 | provenance | | | main.rs:148:35:148:36 | l9 | main.rs:148:17:148:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:151:9:151:11 | l10 | main.rs:152:31:152:33 | l10 | provenance | | -| main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | main.rs:151:15:151:78 | ... .unwrap() | provenance | MaD:44 | +| main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | main.rs:151:15:151:78 | ... .unwrap() | provenance | MaD:41 | | main.rs:151:15:151:78 | ... .unwrap() | main.rs:151:9:151:11 | l10 | provenance | | -| main.rs:151:48:151:68 | ...::min(...) | main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | provenance | MaD:31 | -| main.rs:151:62:151:62 | v | main.rs:151:48:151:68 | ...::min(...) | provenance | MaD:46 | +| main.rs:151:48:151:68 | ...::min(...) | main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | +| main.rs:151:62:151:62 | v | main.rs:151:48:151:68 | ...::min(...) | provenance | MaD:43 | | main.rs:152:31:152:33 | l10 | main.rs:152:13:152:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:154:9:154:11 | l11 | main.rs:155:31:155:33 | l11 | provenance | | -| main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | main.rs:154:15:154:78 | ... .unwrap() | provenance | MaD:44 | +| main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | main.rs:154:15:154:78 | ... .unwrap() | provenance | MaD:41 | | main.rs:154:15:154:78 | ... .unwrap() | main.rs:154:9:154:11 | l11 | provenance | | -| main.rs:154:48:154:68 | ...::max(...) | main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | provenance | MaD:31 | -| main.rs:154:62:154:62 | v | main.rs:154:48:154:68 | ...::max(...) | provenance | MaD:45 | +| main.rs:154:48:154:68 | ...::max(...) | main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | +| main.rs:154:62:154:62 | v | main.rs:154:48:154:68 | ...::max(...) | provenance | MaD:42 | | main.rs:155:31:155:33 | l11 | main.rs:155:13:155:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:161:13:161:15 | l13 | main.rs:162:35:162:37 | l13 | provenance | | -| main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | main.rs:161:19:161:68 | ... .unwrap() | provenance | MaD:44 | +| main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | main.rs:161:19:161:68 | ... .unwrap() | provenance | MaD:41 | | main.rs:161:19:161:68 | ... .unwrap() | main.rs:161:13:161:15 | l13 | provenance | | -| main.rs:161:55:161:55 | v | main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | provenance | MaD:36 | +| main.rs:161:55:161:55 | v | main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | provenance | MaD:33 | | main.rs:162:35:162:37 | l13 | main.rs:162:17:162:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:162:35:162:37 | l13 | main.rs:169:35:169:37 | l13 | provenance | | | main.rs:169:35:169:37 | l13 | main.rs:169:17:169:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | @@ -222,9 +217,9 @@ edges | main.rs:183:29:183:36 | ...: usize | main.rs:192:46:192:46 | v | provenance | | | main.rs:183:29:183:36 | ...: usize | main.rs:202:48:202:48 | v | provenance | | | main.rs:192:9:192:10 | l2 | main.rs:193:38:193:39 | l2 | provenance | | -| main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | main.rs:192:14:192:56 | ... .unwrap() | provenance | MaD:44 | +| main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | main.rs:192:14:192:56 | ... .unwrap() | provenance | MaD:41 | | main.rs:192:14:192:56 | ... .unwrap() | main.rs:192:9:192:10 | l2 | provenance | | -| main.rs:192:46:192:46 | v | main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | provenance | MaD:31 | +| main.rs:192:46:192:46 | v | main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | | main.rs:193:38:193:39 | l2 | main.rs:193:32:193:36 | alloc | provenance | MaD:12 Sink:MaD:12 | | main.rs:193:38:193:39 | l2 | main.rs:194:45:194:46 | l2 | provenance | | | main.rs:194:45:194:46 | l2 | main.rs:194:32:194:43 | alloc_zeroed | provenance | MaD:13 Sink:MaD:13 | @@ -245,18 +240,14 @@ edges | main.rs:213:51:213:52 | l2 | main.rs:213:36:213:41 | shrink | provenance | MaD:11 Sink:MaD:11 | | main.rs:217:27:217:34 | ...: usize | main.rs:219:26:219:26 | v | provenance | | | main.rs:219:26:219:26 | v | main.rs:219:13:219:24 | ...::malloc | provenance | MaD:20 Sink:MaD:20 | -| main.rs:219:26:219:26 | v | main.rs:219:13:219:24 | ...::malloc | provenance | MaD:23 Sink:MaD:23 | | main.rs:219:26:219:26 | v | main.rs:220:36:220:36 | v | provenance | | | main.rs:220:36:220:36 | v | main.rs:220:13:220:31 | ...::aligned_alloc | provenance | MaD:18 Sink:MaD:18 | | main.rs:220:36:220:36 | v | main.rs:222:30:222:30 | v | provenance | | | main.rs:222:30:222:30 | v | main.rs:222:13:222:24 | ...::calloc | provenance | MaD:19 Sink:MaD:19 | -| main.rs:222:30:222:30 | v | main.rs:222:13:222:24 | ...::calloc | provenance | MaD:22 Sink:MaD:22 | | main.rs:222:30:222:30 | v | main.rs:223:26:223:26 | v | provenance | | | main.rs:223:26:223:26 | v | main.rs:223:13:223:24 | ...::calloc | provenance | MaD:19 Sink:MaD:19 | -| main.rs:223:26:223:26 | v | main.rs:223:13:223:24 | ...::calloc | provenance | MaD:22 Sink:MaD:22 | | main.rs:223:26:223:26 | v | main.rs:224:31:224:31 | v | provenance | | | main.rs:224:31:224:31 | v | main.rs:224:13:224:25 | ...::realloc | provenance | MaD:21 Sink:MaD:21 | -| main.rs:224:31:224:31 | v | main.rs:224:13:224:25 | ...::realloc | provenance | MaD:24 Sink:MaD:24 | | main.rs:227:24:227:31 | ...: usize | main.rs:228:43:228:43 | v | provenance | | | main.rs:228:43:228:43 | v | main.rs:228:13:228:41 | ...::try_with_capacity | provenance | MaD:3 Sink:MaD:3 | | main.rs:228:43:228:43 | v | main.rs:229:39:229:39 | v | provenance | | @@ -267,22 +258,21 @@ edges | main.rs:231:42:231:42 | v | main.rs:231:13:231:40 | ...::with_capacity_in | provenance | MaD:6 Sink:MaD:6 | | main.rs:282:24:282:41 | ...: String | main.rs:283:21:283:30 | user_input | provenance | | | main.rs:283:9:283:17 | num_bytes | main.rs:285:54:285:62 | num_bytes | provenance | | -| main.rs:283:21:283:30 | user_input | main.rs:283:21:283:47 | user_input.parse() [Ok] | provenance | MaD:29 | +| main.rs:283:21:283:30 | user_input | main.rs:283:21:283:47 | user_input.parse() [Ok] | provenance | MaD:26 | | main.rs:283:21:283:47 | user_input.parse() [Ok] | main.rs:283:21:283:48 | TryExpr | provenance | | -| main.rs:283:21:283:48 | TryExpr | main.rs:283:21:283:77 | ... * ... | provenance | MaD:28 | +| main.rs:283:21:283:48 | TryExpr | main.rs:283:21:283:77 | ... * ... | provenance | MaD:25 | | main.rs:283:21:283:77 | ... * ... | main.rs:283:9:283:17 | num_bytes | provenance | | | main.rs:285:9:285:14 | layout | main.rs:287:40:287:45 | layout | provenance | | -| main.rs:285:18:285:66 | ...::from_size_align(...) [Ok] | main.rs:285:18:285:75 | ... .unwrap() | provenance | MaD:44 | +| main.rs:285:18:285:66 | ...::from_size_align(...) [Ok] | main.rs:285:18:285:75 | ... .unwrap() | provenance | MaD:41 | | main.rs:285:18:285:75 | ... .unwrap() | main.rs:285:9:285:14 | layout | provenance | | -| main.rs:285:54:285:62 | num_bytes | main.rs:285:18:285:66 | ...::from_size_align(...) [Ok] | provenance | MaD:36 | +| main.rs:285:54:285:62 | num_bytes | main.rs:285:18:285:66 | ...::from_size_align(...) [Ok] | provenance | MaD:33 | | main.rs:287:40:287:45 | layout | main.rs:287:22:287:38 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:311:25:311:38 | ...::args | main.rs:311:25:311:40 | ...::args(...) [element] | provenance | Src:MaD:25 | -| main.rs:311:25:311:40 | ...::args(...) [element] | main.rs:311:25:311:47 | ... .nth(...) [Some] | provenance | MaD:26 | -| main.rs:311:25:311:47 | ... .nth(...) [Some] | main.rs:311:25:311:74 | ... .unwrap_or(...) | provenance | MaD:42 | +| main.rs:311:25:311:38 | ...::args | main.rs:311:25:311:40 | ...::args(...) [element] | provenance | Src:MaD:22 | +| main.rs:311:25:311:40 | ...::args(...) [element] | main.rs:311:25:311:47 | ... .nth(...) [Some] | provenance | MaD:23 | +| main.rs:311:25:311:47 | ... .nth(...) [Some] | main.rs:311:25:311:74 | ... .unwrap_or(...) | provenance | MaD:39 | | main.rs:311:25:311:74 | ... .unwrap_or(...) | main.rs:282:24:282:41 | ...: String | provenance | | | main.rs:317:26:317:33 | ...: usize | main.rs:331:26:331:26 | a | provenance | | | main.rs:331:26:331:26 | a | main.rs:331:13:331:24 | ...::malloc | provenance | MaD:20 Sink:MaD:20 | -| main.rs:331:26:331:26 | a | main.rs:331:13:331:24 | ...::malloc | provenance | MaD:23 Sink:MaD:23 | | main.rs:339:9:339:9 | v | main.rs:342:34:342:34 | v | provenance | | | main.rs:339:9:339:9 | v | main.rs:343:42:343:42 | v | provenance | | | main.rs:339:9:339:9 | v | main.rs:344:36:344:36 | v | provenance | | @@ -290,11 +280,11 @@ edges | main.rs:339:9:339:9 | v | main.rs:346:25:346:25 | v | provenance | | | main.rs:339:9:339:9 | v | main.rs:347:22:347:22 | v | provenance | | | main.rs:339:9:339:9 | v | main.rs:349:24:349:24 | v | provenance | | -| main.rs:339:13:339:26 | ...::args | main.rs:339:13:339:28 | ...::args(...) [element] | provenance | Src:MaD:25 | -| main.rs:339:13:339:28 | ...::args(...) [element] | main.rs:339:13:339:35 | ... .nth(...) [Some] | provenance | MaD:26 | -| main.rs:339:13:339:35 | ... .nth(...) [Some] | main.rs:339:13:339:65 | ... .unwrap_or(...) | provenance | MaD:42 | -| main.rs:339:13:339:65 | ... .unwrap_or(...) | main.rs:339:13:339:82 | ... .parse() [Ok] | provenance | MaD:29 | -| main.rs:339:13:339:82 | ... .parse() [Ok] | main.rs:339:13:339:91 | ... .unwrap() | provenance | MaD:44 | +| main.rs:339:13:339:26 | ...::args | main.rs:339:13:339:28 | ...::args(...) [element] | provenance | Src:MaD:22 | +| main.rs:339:13:339:28 | ...::args(...) [element] | main.rs:339:13:339:35 | ... .nth(...) [Some] | provenance | MaD:23 | +| main.rs:339:13:339:35 | ... .nth(...) [Some] | main.rs:339:13:339:65 | ... .unwrap_or(...) | provenance | MaD:39 | +| main.rs:339:13:339:65 | ... .unwrap_or(...) | main.rs:339:13:339:82 | ... .parse() [Ok] | provenance | MaD:26 | +| main.rs:339:13:339:82 | ... .parse() [Ok] | main.rs:339:13:339:91 | ... .unwrap() | provenance | MaD:41 | | main.rs:339:13:339:91 | ... .unwrap() | main.rs:339:9:339:9 | v | provenance | | | main.rs:342:34:342:34 | v | main.rs:12:36:12:43 | ...: usize | provenance | | | main.rs:343:42:343:42 | v | main.rs:43:44:43:51 | ...: usize | provenance | | @@ -325,31 +315,28 @@ models | 19 | Sink: libc::unix::calloc; Argument[0,1]; alloc-size | | 20 | Sink: libc::unix::malloc; Argument[0]; alloc-size | | 21 | Sink: libc::unix::realloc; Argument[1]; alloc-size | -| 22 | Sink: libc::windows::calloc; Argument[0,1]; alloc-size | -| 23 | Sink: libc::windows::malloc; Argument[0]; alloc-size | -| 24 | Sink: libc::windows::realloc; Argument[1]; alloc-size | -| 25 | Source: std::env::args; ReturnValue.Element; commandargs | -| 26 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 27 | Summary: <_ as core::ops::arith::Add>::add; Argument[self,0]; ReturnValue; taint | -| 28 | Summary: <_ as core::ops::arith::Mul>::mul; Argument[self,0]; ReturnValue; taint | -| 29 | Summary: ::deref; Argument[self]; ReturnValue; value | -| 30 | Summary: ::align_to; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 31 | Summary: ::array; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 32 | Summary: ::extend; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | -| 33 | Summary: ::extend; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | -| 34 | Summary: ::extend_packed; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 35 | Summary: ::extend_packed; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 36 | Summary: ::from_size_align; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 37 | Summary: ::from_size_align_unchecked; Argument[0]; ReturnValue; taint | -| 38 | Summary: ::pad_to_align; Argument[self].Reference; ReturnValue; taint | -| 39 | Summary: ::repeat; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | -| 40 | Summary: ::repeat_packed; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 41 | Summary: ::size; Argument[self].Reference; ReturnValue; taint | -| 42 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 43 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 44 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 45 | Summary: core::cmp::max; Argument[0]; ReturnValue; value | -| 46 | Summary: core::cmp::min; Argument[0]; ReturnValue; value | +| 22 | Source: std::env::args; ReturnValue.Element; commandargs | +| 23 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 24 | Summary: <_ as core::ops::arith::Add>::add; Argument[self,0]; ReturnValue; taint | +| 25 | Summary: <_ as core::ops::arith::Mul>::mul; Argument[self,0]; ReturnValue; taint | +| 26 | Summary: ::deref; Argument[self]; ReturnValue; value | +| 27 | Summary: ::align_to; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 28 | Summary: ::array; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 29 | Summary: ::extend; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | +| 30 | Summary: ::extend; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | +| 31 | Summary: ::extend_packed; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 32 | Summary: ::extend_packed; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 33 | Summary: ::from_size_align; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 34 | Summary: ::from_size_align_unchecked; Argument[0]; ReturnValue; taint | +| 35 | Summary: ::pad_to_align; Argument[self].Reference; ReturnValue; taint | +| 36 | Summary: ::repeat; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | +| 37 | Summary: ::repeat_packed; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 38 | Summary: ::size; Argument[self].Reference; ReturnValue; taint | +| 39 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 40 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 41 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 42 | Summary: core::cmp::max; Argument[0]; ReturnValue; value | +| 43 | Summary: core::cmp::min; Argument[0]; ReturnValue; value | nodes | main.rs:12:36:12:43 | ...: usize | semmle.label | ...: usize | | main.rs:18:13:18:31 | ...::realloc | semmle.label | ...::realloc | @@ -539,18 +526,14 @@ nodes | main.rs:213:51:213:52 | l2 | semmle.label | l2 | | main.rs:217:27:217:34 | ...: usize | semmle.label | ...: usize | | main.rs:219:13:219:24 | ...::malloc | semmle.label | ...::malloc | -| main.rs:219:13:219:24 | ...::malloc | semmle.label | ...::malloc | | main.rs:219:26:219:26 | v | semmle.label | v | | main.rs:220:13:220:31 | ...::aligned_alloc | semmle.label | ...::aligned_alloc | | main.rs:220:36:220:36 | v | semmle.label | v | | main.rs:222:13:222:24 | ...::calloc | semmle.label | ...::calloc | -| main.rs:222:13:222:24 | ...::calloc | semmle.label | ...::calloc | | main.rs:222:30:222:30 | v | semmle.label | v | | main.rs:223:13:223:24 | ...::calloc | semmle.label | ...::calloc | -| main.rs:223:13:223:24 | ...::calloc | semmle.label | ...::calloc | | main.rs:223:26:223:26 | v | semmle.label | v | | main.rs:224:13:224:25 | ...::realloc | semmle.label | ...::realloc | -| main.rs:224:13:224:25 | ...::realloc | semmle.label | ...::realloc | | main.rs:224:31:224:31 | v | semmle.label | v | | main.rs:227:24:227:31 | ...: usize | semmle.label | ...: usize | | main.rs:228:13:228:41 | ...::try_with_capacity | semmle.label | ...::try_with_capacity | @@ -579,7 +562,6 @@ nodes | main.rs:311:25:311:74 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | | main.rs:317:26:317:33 | ...: usize | semmle.label | ...: usize | | main.rs:331:13:331:24 | ...::malloc | semmle.label | ...::malloc | -| main.rs:331:13:331:24 | ...::malloc | semmle.label | ...::malloc | | main.rs:331:26:331:26 | a | semmle.label | a | | main.rs:339:9:339:9 | v | semmle.label | v | | main.rs:339:13:339:26 | ...::args | semmle.label | ...::args | diff --git a/rust/ql/test/query-tests/security/CWE-825/AccessInvalidPointer.expected b/rust/ql/test/query-tests/security/CWE-825/AccessInvalidPointer.expected index 0993171ab96a..d3b5456063ff 100644 --- a/rust/ql/test/query-tests/security/CWE-825/AccessInvalidPointer.expected +++ b/rust/ql/test/query-tests/security/CWE-825/AccessInvalidPointer.expected @@ -9,7 +9,6 @@ | deallocation.rs:90:7:90:8 | m2 | deallocation.rs:70:3:70:21 | ...::dealloc | deallocation.rs:90:7:90:8 | m2 | This operation dereferences a pointer that may be $@. | deallocation.rs:70:3:70:21 | ...::dealloc | invalid | | deallocation.rs:95:5:95:31 | ...::write::<...> | deallocation.rs:70:3:70:21 | ...::dealloc | deallocation.rs:95:5:95:31 | ...::write::<...> | This operation dereferences a pointer that may be $@. | deallocation.rs:70:3:70:21 | ...::dealloc | invalid | | deallocation.rs:115:13:115:18 | my_ptr | deallocation.rs:112:3:112:12 | ...::free | deallocation.rs:115:13:115:18 | my_ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:112:3:112:12 | ...::free | invalid | -| deallocation.rs:115:13:115:18 | my_ptr | deallocation.rs:112:3:112:12 | ...::free | deallocation.rs:115:13:115:18 | my_ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:112:3:112:12 | ...::free | invalid | | deallocation.rs:130:14:130:15 | p1 | deallocation.rs:123:23:123:40 | ...::dangling | deallocation.rs:130:14:130:15 | p1 | This operation dereferences a pointer that may be $@. | deallocation.rs:123:23:123:40 | ...::dangling | invalid | | deallocation.rs:131:14:131:15 | p2 | deallocation.rs:124:21:124:42 | ...::dangling_mut | deallocation.rs:131:14:131:15 | p2 | This operation dereferences a pointer that may be $@. | deallocation.rs:124:21:124:42 | ...::dangling_mut | invalid | | deallocation.rs:132:14:132:15 | p3 | deallocation.rs:125:23:125:36 | ...::null | deallocation.rs:132:14:132:15 | p3 | This operation dereferences a pointer that may be $@. | deallocation.rs:125:23:125:36 | ...::null | invalid | @@ -44,7 +43,6 @@ edges | deallocation.rs:70:23:70:35 | [post] m2 as ... | deallocation.rs:95:33:95:34 | m2 | provenance | | | deallocation.rs:95:33:95:34 | m2 | deallocation.rs:95:5:95:31 | ...::write::<...> | provenance | MaD:2 Sink:MaD:2 | | deallocation.rs:112:3:112:12 | ...::free | deallocation.rs:112:14:112:40 | [post] my_ptr as ... | provenance | Src:MaD:9 MaD:9 | -| deallocation.rs:112:3:112:12 | ...::free | deallocation.rs:112:14:112:40 | [post] my_ptr as ... | provenance | Src:MaD:10 MaD:10 | | deallocation.rs:112:14:112:40 | [post] my_ptr as ... | deallocation.rs:115:13:115:18 | my_ptr | provenance | | | deallocation.rs:123:6:123:7 | p1 | deallocation.rs:130:14:130:15 | p1 | provenance | | | deallocation.rs:123:23:123:40 | ...::dangling | deallocation.rs:123:23:123:42 | ...::dangling(...) | provenance | Src:MaD:4 MaD:4 | @@ -94,7 +92,6 @@ models | 7 | Source: core::ptr::null; ReturnValue; pointer-invalidate | | 8 | Source: core::ptr::null_mut; ReturnValue; pointer-invalidate | | 9 | Source: libc::unix::free; Argument[0]; pointer-invalidate | -| 10 | Source: libc::windows::free; Argument[0]; pointer-invalidate | nodes | deallocation.rs:20:3:20:21 | ...::dealloc | semmle.label | ...::dealloc | | deallocation.rs:20:23:20:24 | [post] m1 | semmle.label | [post] m1 | @@ -113,7 +110,6 @@ nodes | deallocation.rs:95:5:95:31 | ...::write::<...> | semmle.label | ...::write::<...> | | deallocation.rs:95:33:95:34 | m2 | semmle.label | m2 | | deallocation.rs:112:3:112:12 | ...::free | semmle.label | ...::free | -| deallocation.rs:112:3:112:12 | ...::free | semmle.label | ...::free | | deallocation.rs:112:14:112:40 | [post] my_ptr as ... | semmle.label | [post] my_ptr as ... | | deallocation.rs:115:13:115:18 | my_ptr | semmle.label | my_ptr | | deallocation.rs:123:6:123:7 | p1 | semmle.label | p1 | diff --git a/rust/ql/test/query-tests/security/CWE-825/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-825/CONSISTENCY/PathResolutionConsistency.expected deleted file mode 100644 index 850ba012c153..000000000000 --- a/rust/ql/test/query-tests/security/CWE-825/CONSISTENCY/PathResolutionConsistency.expected +++ /dev/null @@ -1,3 +0,0 @@ -multipleResolvedTargets -| deallocation.rs:106:16:106:32 | ...::malloc(...) | -| deallocation.rs:112:3:112:41 | ...::free(...) | diff --git a/rust/ql/test/query-tests/security/CWE-918/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-918/CONSISTENCY/PathResolutionConsistency.expected deleted file mode 100644 index eb6f8590fbdd..000000000000 --- a/rust/ql/test/query-tests/security/CWE-918/CONSISTENCY/PathResolutionConsistency.expected +++ /dev/null @@ -1,4 +0,0 @@ -multiplePathResolutions -| request_forgery_tests.rs:60:7:60:17 | ...::main | -| request_forgery_tests.rs:64:9:64:11 | ...::runtime | -| request_forgery_tests.rs:79:5:79:18 | ...::runtime | diff --git a/rust/ql/test/query-tests/security/CWE-918/CONSISTENCY/TypeInferenceConsistency.expected b/rust/ql/test/query-tests/security/CWE-918/CONSISTENCY/TypeInferenceConsistency.expected deleted file mode 100644 index b70ece5bb153..000000000000 --- a/rust/ql/test/query-tests/security/CWE-918/CONSISTENCY/TypeInferenceConsistency.expected +++ /dev/null @@ -1,8 +0,0 @@ -nonUniqueCertainType -| request_forgery_tests.rs:8:24:8:46 | ...::get(...) | dyn(Output).T | -| request_forgery_tests.rs:17:25:17:42 | ...::get(...) | dyn(Output).T | -| request_forgery_tests.rs:21:25:21:42 | ...::get(...) | dyn(Output).T | -| request_forgery_tests.rs:25:25:25:42 | ...::get(...) | dyn(Output).T | -| request_forgery_tests.rs:31:29:31:51 | ...::get(...) | dyn(Output).T | -| request_forgery_tests.rs:37:37:37:59 | ...::get(...) | dyn(Output).T | -| request_forgery_tests.rs:68:28:68:43 | ...::get(...) | dyn(Output).T | From c972bb8632974fc9c928750ee33f2c86abcd2f1c Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 10 Aug 2026 16:15:36 +0200 Subject: [PATCH 0212/2098] Rust: Revert change in `multipleResolvedTargets` --- rust/ql/lib/codeql/rust/internal/PathResolutionConsistency.qll | 1 - 1 file changed, 1 deletion(-) diff --git a/rust/ql/lib/codeql/rust/internal/PathResolutionConsistency.qll b/rust/ql/lib/codeql/rust/internal/PathResolutionConsistency.qll index e3416b1480b0..807225d1615a 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolutionConsistency.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolutionConsistency.qll @@ -26,7 +26,6 @@ query predicate multiplePathResolutions(Path p, ItemNode i) { /** Holds if `ie` has multiple resolved targets including `target`. */ query predicate multipleResolvedTargets(InvocationExpr ie, Addressable target) { - not ie.(AstNode).isInMacroExpansion() and target = ie.getResolvedTarget() and strictcount(ie.getResolvedTarget()) > 1 } From 3fd19093876335ad3273ae42422f75967b3b4ddf Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 10 Aug 2026 16:24:37 +0200 Subject: [PATCH 0213/2098] Rust: Minor cleanup --- .../rust/elements/internal/MetaImpl.qll | 14 +++++++++- .../codeql/rust/internal/PathResolution.qll | 26 +++++-------------- .../security/CWE-696/BadCtorInitialization.ql | 13 +--------- 3 files changed, 20 insertions(+), 33 deletions(-) diff --git a/rust/ql/lib/codeql/rust/elements/internal/MetaImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/MetaImpl.qll index 295decd667a9..693724e96ae6 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/MetaImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/MetaImpl.qll @@ -11,6 +11,8 @@ private import codeql.rust.elements.internal.generated.Meta * be referenced directly. */ module Impl { + private import rust + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A meta item in an attribute. @@ -26,5 +28,15 @@ module Impl { * } * ``` */ - class Meta extends Generated::Meta { } + class Meta extends Generated::Meta { + /** Gets the path, if it exists. */ + pragma[nomagic] + Path getMetaPath() { + result = this.(PathMeta).getPath() + or + result = this.(KeyValueMeta).getPath() + or + result = this.(TokenTreeMeta).getPath() + } + } } diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index a3627dad33c6..15a67ff62679 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -49,20 +49,6 @@ private import codeql.rust.internal.CachedStages private import codeql.rust.frameworks.stdlib.Builtins as Builtins private import codeql.util.Option -/** Gets the path of a `Meta` node, regardless of its concrete subtype. */ -pragma[nomagic] -private Path getMetaPath(Meta m) { - result = m.(PathMeta).getPath() - or - result = m.(KeyValueMeta).getPath() - or - result = m.(TokenTreeMeta).getPath() -} - -/** Gets the expression of a `Meta` node, regardless of its concrete subtype. */ -pragma[nomagic] -private Expr getMetaExpr(Meta m) { result = m.(KeyValueMeta).getExpr() } - private newtype TNamespace = TTypeNamespace() or TValueNamespace() or @@ -277,7 +263,7 @@ abstract class ItemNode extends Locatable { pragma[nomagic] final Attr getAttr(string name) { result = this.getAnAttr() and - getMetaPath(result.getMeta()).(PathExt).isUnqualified(name) + result.getMeta().getMetaPath().(PathExt).isUnqualified(name) } final predicate hasAttr(string name) { exists(this.getAttr(name)) } @@ -1394,7 +1380,7 @@ private predicate fileModuleInlineLate(SourceFile f, string name, Folder folder) */ private Meta getPathAttrMeta(Module m) { result = m.getAnAttr().getMeta() and - getMetaPath(result).getText() = "path" + result.getMetaPath().getText() = "path" } /** @@ -1455,10 +1441,10 @@ private predicate modImportNestedLookup(Module m, ModuleItemNode ancestor, Folde } private predicate pathAttrImport(Folder f, Module m, string relativePath) { - exists(Meta meta | + exists(KeyValueMeta meta | f = m.getFile().getParentContainer() and meta = getPathAttrMeta(m) and - relativePath = getMetaExpr(meta).(LiteralExpr).getTextValue().regexpCapture("\"(.+)\"", 1) + relativePath = meta.getExpr().(LiteralExpr).getTextValue().regexpCapture("\"(.+)\"", 1) ) } @@ -1839,7 +1825,7 @@ private module DollarCrateResolution { or exists(ItemNode type | expansion = type.(TypeItem).getDeriveMacroExpansion(_) and - macroDefPath = getMetaPath(type.getAttr("derive").getMeta()) + macroDefPath = type.getAttr("derive").getMeta().getMetaPath() ) } @@ -1998,7 +1984,7 @@ private predicate pathUsesNamespace(PathExt p, Namespace n) { ( p = any(MacroCall mc).getPath() or - p = getMetaPath(any(Meta m)) + p = any(Meta m).getMetaPath() ) } diff --git a/rust/ql/src/queries/security/CWE-696/BadCtorInitialization.ql b/rust/ql/src/queries/security/CWE-696/BadCtorInitialization.ql index 04a991b9a004..a45f4fb0209d 100644 --- a/rust/ql/src/queries/security/CWE-696/BadCtorInitialization.ql +++ b/rust/ql/src/queries/security/CWE-696/BadCtorInitialization.ql @@ -12,17 +12,6 @@ */ import rust -private import codeql.rust.elements.PathMeta -private import codeql.rust.elements.KeyValueMeta -private import codeql.rust.elements.TokenTreeMeta - -private Path getMetaPath(Meta m) { - result = m.(PathMeta).getPath() - or - result = m.(KeyValueMeta).getPath() - or - result = m.(TokenTreeMeta).getPath() -} /** * A `#[ctor]` or `#[dtor]` attribute, that is, a source for this query. @@ -31,7 +20,7 @@ class CtorAttr extends Attr { string whichAttr; CtorAttr() { - whichAttr = getMetaPath(this.getMeta()).getText() and + whichAttr = this.getMeta().getMetaPath().getText() and whichAttr = ["ctor", "dtor"] } From 82dfa2de876e59caf5c64db0c5eb0a63e0494069 Mon Sep 17 00:00:00 2001 From: Mads Navntoft Date: Mon, 10 Aug 2026 16:49:13 +0200 Subject: [PATCH 0214/2098] Java: Replace instead of redact to preserve major version --- .../diagnostics.expected | 2 +- .../gradle-sample-without-wrapper-or-gradle-buildless/test.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/java/ql/integration-tests/java/gradle-sample-without-wrapper-or-gradle-buildless/diagnostics.expected b/java/ql/integration-tests/java/gradle-sample-without-wrapper-or-gradle-buildless/diagnostics.expected index 568c2312e97c..f479e56b2e68 100644 --- a/java/ql/integration-tests/java/gradle-sample-without-wrapper-or-gradle-buildless/diagnostics.expected +++ b/java/ql/integration-tests/java/gradle-sample-without-wrapper-or-gradle-buildless/diagnostics.expected @@ -1,7 +1,7 @@ { "attributes": { "java_vendor": "__REDACTED__", - "java_version": "__REDACTED__" + "java_version": "11" }, "markdownMessage": "Internal telemetry for the Java extractor.\n\nNo action needed.", "severity": "note", diff --git a/java/ql/integration-tests/java/gradle-sample-without-wrapper-or-gradle-buildless/test.py b/java/ql/integration-tests/java/gradle-sample-without-wrapper-or-gradle-buildless/test.py index 495d4c40a0a8..3aaee01f4055 100644 --- a/java/ql/integration-tests/java/gradle-sample-without-wrapper-or-gradle-buildless/test.py +++ b/java/ql/integration-tests/java/gradle-sample-without-wrapper-or-gradle-buildless/test.py @@ -5,7 +5,8 @@ # The version of gradle used doesn't work on java 17 def test(codeql, use_java_11, java, environment, check_diagnostics): - check_diagnostics.redact += ["attributes.java_vendor", "attributes.java_version"] + check_diagnostics.redact += ["attributes.java_vendor"] + check_diagnostics.replacements = [("11\\.[0-9]+\\.[0-9]+", "11")] gradle_override_dir = pathlib.Path(tempfile.mkdtemp()) if runs_on.windows: (gradle_override_dir / "gradle.bat").write_text("@echo off\nexit /b 2\n") From 2214e4057ecf2e238cbd49b91bb822ec68d8826f Mon Sep 17 00:00:00 2001 From: Chad Bentz <1760475+felickz@users.noreply.github.com> Date: Mon, 10 Aug 2026 13:13:59 -0400 Subject: [PATCH 0215/2098] Update java/ql/lib/ext/io.r2dbc.spi.model.yml Co-authored-by: Owen Mansel-Chan <62447351+owen-mc@users.noreply.github.com> --- java/ql/lib/ext/io.r2dbc.spi.model.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/ql/lib/ext/io.r2dbc.spi.model.yml b/java/ql/lib/ext/io.r2dbc.spi.model.yml index 7edfcdc36643..4643a3e874fe 100644 --- a/java/ql/lib/ext/io.r2dbc.spi.model.yml +++ b/java/ql/lib/ext/io.r2dbc.spi.model.yml @@ -3,9 +3,9 @@ extensions: pack: codeql/java-all extensible: sinkModel data: - - ["io.r2dbc.spi", "Connection", True, "createStatement", "(String)", "", "Argument[0]", "sql-injection", "manual"] - ["io.r2dbc.spi", "Batch", True, "add", "(String)", "", "Argument[0]", "sql-injection", "manual"] - ["io.r2dbc.spi", "Connection", True, "createSavepoint", "(String)", "", "Argument[0]", "sql-injection", "manual"] + - ["io.r2dbc.spi", "Connection", True, "createStatement", "(String)", "", "Argument[0]", "sql-injection", "manual"] - ["io.r2dbc.spi", "Connection", True, "releaseSavepoint", "(String)", "", "Argument[0]", "sql-injection", "manual"] - - ["io.r2dbc.spi", "Connection", True, "rollbackTransactionToSavepoint", "(String)", "", "Argument[0]", "sql-injection", "manual"] - ["io.r2dbc.spi", "Statement", True, "returnGeneratedValues", "(String[])", "", "Argument[0]", "sql-injection", "manual"] + - ["io.r2dbc.spi", "Connection", True, "rollbackTransactionToSavepoint", "(String)", "", "Argument[0]", "sql-injection", "manual"] From 6919c3deb74c073a53b763a993196e369123a44e Mon Sep 17 00:00:00 2001 From: Chad Bentz <1760475+felickz@users.noreply.github.com> Date: Mon, 10 Aug 2026 13:16:07 -0400 Subject: [PATCH 0216/2098] Java: test safe R2DBC parameter binding Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: fb2a5047-e061-44ba-b6df-198390190733 --- .../ext/org.springframework.r2dbc.core.model.yml | 14 +++++++------- .../CWE-089/semmle/examples/SpringJdbc.java | 10 ++++++++++ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/java/ql/lib/ext/org.springframework.r2dbc.core.model.yml b/java/ql/lib/ext/org.springframework.r2dbc.core.model.yml index d388e72fdcc9..7246dd68f8d4 100644 --- a/java/ql/lib/ext/org.springframework.r2dbc.core.model.yml +++ b/java/ql/lib/ext/org.springframework.r2dbc.core.model.yml @@ -4,24 +4,24 @@ extensions: extensible: sinkModel data: - ["org.springframework.r2dbc.core", "DatabaseClient", True, "sql", "(String)", "", "Argument[0]", "sql-injection", "manual"] + - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "flatMap", "(java.util.function.Function)", "", "Argument[this]", "sql-injection", "manual"] - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "fetch", "", "", "Argument[this]", "sql-injection", "manual"] - - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "then", "", "", "Argument[this]", "sql-injection", "manual"] - - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "map", "(java.util.function.Function)", "", "Argument[this]", "sql-injection", "manual"] - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "map", "(java.util.function.BiFunction)", "", "Argument[this]", "sql-injection", "manual"] - - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "mapValue", "(Class)", "", "Argument[this]", "sql-injection", "manual"] + - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "map", "(java.util.function.Function)", "", "Argument[this]", "sql-injection", "manual"] - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "mapProperties", "(Class)", "", "Argument[this]", "sql-injection", "manual"] - - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "flatMap", "(java.util.function.Function)", "", "Argument[this]", "sql-injection", "manual"] + - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "mapValue", "(Class)", "", "Argument[this]", "sql-injection", "manual"] + - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "then", "", "", "Argument[this]", "sql-injection", "manual"] - addsTo: pack: codeql/java-all extensible: summaryModel data: - ["org.springframework.r2dbc.core", "DatabaseClient", True, "sql", "(java.util.function.Supplier)", "", "Argument[0].ReturnValue", "ReturnValue", "taint", "manual"] - - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "bind", "(int,Object)", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "bind", "(String,Object)", "", "Argument[this]", "ReturnValue", "taint", "manual"] - - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "bindNull", "(int,Class)", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "bind", "(int,Object)", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "bindNull", "(String,Class)", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "bindNull", "(int,Class)", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "bindProperties", "(Object)", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "bindValues", "(List)", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "bindValues", "(Map)", "", "Argument[this]", "ReturnValue", "taint", "manual"] - - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "bindProperties", "(Object)", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "filter", "(java.util.function.Function)", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "filter", "(org.springframework.r2dbc.core.StatementFilterFunction)", "", "Argument[this]", "ReturnValue", "taint", "manual"] diff --git a/java/ql/test/query-tests/security/CWE-089/semmle/examples/SpringJdbc.java b/java/ql/test/query-tests/security/CWE-089/semmle/examples/SpringJdbc.java index 656e9c69abf4..398a7784ed03 100644 --- a/java/ql/test/query-tests/security/CWE-089/semmle/examples/SpringJdbc.java +++ b/java/ql/test/query-tests/security/CWE-089/semmle/examples/SpringJdbc.java @@ -111,6 +111,16 @@ public static void testR2dbc(DatabaseClient client, Connection connection, Batch connection.rollbackTransactionToSavepoint(source()); // $ sqlInjection connection.createStatement("INSERT INTO test VALUES (1)") .returnGeneratedValues(source()); // $ sqlInjection + + client.sql(() -> "SELECT * FROM test WHERE value = :value").bind("value", source()).fetch(); + client.sql(() -> "SELECT * FROM test").filter(statement -> source()).fetch(); + client.sql(() -> "SELECT * FROM test").map(row -> source()); + connection.createStatement("SELECT * FROM test"); + batch.add("SELECT * FROM test"); + connection.createSavepoint("savepoint"); + connection.releaseSavepoint("savepoint"); + connection.rollbackTransactionToSavepoint("savepoint"); + connection.createStatement("INSERT INTO test VALUES (1)").returnGeneratedValues("id"); } } \ No newline at end of file From 29335fd8153c47a6984084429cc8e18d9ed4d0ea Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 10 Aug 2026 19:31:47 +0200 Subject: [PATCH 0217/2098] Rust: Add flow models for `ToOwned` trait --- rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml index 78d1cbdec29e..427f0e6aed0b 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml @@ -56,6 +56,9 @@ extensions: # Vec - ["alloc::vec::from_elem", "Argument[0]", "ReturnValue.Element", "value", "manual"] - ["::deref", "Argument[self].Reference.Element", "ReturnValue.Reference.Element", "value", "manual"] + # ToOwned + - ["<_ as alloc::borrow::ToOwned>::to_owned", "Argument[self].Reference", "ReturnValue", "taint", "manual"] + - ["<_ as alloc::borrow::ToOwned>::clone_into", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - addsTo: pack: codeql/rust-all extensible: neutralModel From 5dffc22dbba5d226282d88608cb5f7972b76fe47 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 11 Aug 2026 00:22:23 +0000 Subject: [PATCH 0218/2098] Add changed framework coverage reports --- java/documentation/library-coverage/coverage.csv | 2 ++ java/documentation/library-coverage/coverage.rst | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/java/documentation/library-coverage/coverage.csv b/java/documentation/library-coverage/coverage.csv index 39bb4b37e593..e3893d193663 100644 --- a/java/documentation/library-coverage/coverage.csv +++ b/java/documentation/library-coverage/coverage.csv @@ -73,6 +73,7 @@ io.netty.handler.ssl,4,,,,,,,,,,,,,,,,,,,,,,,,,,2,2,,,,,,,,,,,,,,,,,,,,,,,,,,,, io.netty.handler.stream,1,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,, io.netty.resolver,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, io.netty.util,2,,23,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,1,,,,,,,,,,,,,,,,,,21,2 +io.r2dbc.spi,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,, io.undertow.server.handlers.resource,1,,3,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,3, jakarta.activation,2,,2,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,1,,,,,,,,,,,,,,,,,,2, jakarta.faces.context,4,7,,,,,,,,,,,,,,2,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,7,, @@ -254,6 +255,7 @@ org.springframework.jdbc.datasource,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,,,,,, org.springframework.jdbc.object,9,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,,,,,,,,,,,,,,,,, org.springframework.jndi,1,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, org.springframework.ldap,47,,,,,,,,,,,,,,,,,,,33,,14,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +org.springframework.r2dbc.core,8,,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8,,,,,,,,,,,,,,,,10, org.springframework.security.core.userdetails,2,,,,,,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, org.springframework.security.web.savedrequest,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,, org.springframework.ui,,,32,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,32 diff --git a/java/documentation/library-coverage/coverage.rst b/java/documentation/library-coverage/coverage.rst index cc3da4594a66..70d02b68751e 100644 --- a/java/documentation/library-coverage/coverage.rst +++ b/java/documentation/library-coverage/coverage.rst @@ -37,9 +37,9 @@ Java framework & library support `Retrofit `_,``retrofit2``,,1,1,,,,,,1 `SLF4J `_,``org.slf4j``,,6,55,,,,,, `SnakeYAML `_,``org.yaml.snakeyaml``,,1,,,,,,, - `Spring `_,``org.springframework.*``,46,494,144,26,,28,14,,36 + `Spring `_,``org.springframework.*``,46,504,152,26,,36,14,,36 `Thymeleaf `_,``org.thymeleaf``,,2,2,,,,,, `jOOQ `_,``org.jooq``,,,1,,,1,,, - Others,"``actions.osgi``, ``antlr``, ``ch.ethz.ssh2``, ``cn.hutool.core.codec``, ``com.alibaba.com.caucho.hessian.io``, ``com.alibaba.druid.sql``, ``com.alibaba.fastjson2``, ``com.amazonaws.auth``, ``com.auth0.jwt.algorithms``, ``com.azure.identity``, ``com.caucho.burlap.io``, ``com.caucho.hessian.io``, ``com.cedarsoftware.util.io``, ``com.esotericsoftware.kryo.io``, ``com.esotericsoftware.kryo5.io``, ``com.esotericsoftware.yamlbeans``, ``com.hubspot.jinjava``, ``com.jcraft.jsch``, ``com.microsoft.sqlserver.jdbc``, ``com.mitchellbosecke.pebble``, ``com.opensymphony.xwork2``, ``com.sshtools.j2ssh.authentication``, ``com.sun.crypto.provider``, ``com.sun.jndi.ldap``, ``com.sun.net.httpserver``, ``com.sun.net.ssl``, ``com.sun.rowset``, ``com.sun.security.auth.module``, ``com.sun.security.ntlm``, ``com.sun.security.sasl.digest``, ``com.thoughtworks.xstream``, ``com.trilead.ssh2``, ``com.unboundid.ldap.sdk``, ``com.zaxxer.hikari``, ``flexjson``, ``hudson``, ``io.jsonwebtoken``, ``io.undertow.server.handlers.resource``, ``javafx.scene.web``, ``jenkins``, ``jodd.json``, ``liquibase.database.jvm``, ``liquibase.statement.core``, ``net.lingala.zip4j``, ``net.schmizz.sshj``, ``net.sf.json``, ``net.sf.saxon.s9api``, ``ognl``, ``org.acegisecurity``, ``org.antlr.runtime``, ``org.apache.avro``, ``org.apache.commons.codec``, ``org.apache.commons.compress.archivers.tar``, ``org.apache.commons.exec``, ``org.apache.commons.fileupload``, ``org.apache.commons.httpclient.util``, ``org.apache.commons.jelly``, ``org.apache.commons.jexl2``, ``org.apache.commons.jexl3``, ``org.apache.commons.lang``, ``org.apache.commons.logging``, ``org.apache.commons.net``, ``org.apache.commons.ognl``, ``org.apache.cxf.catalog``, ``org.apache.cxf.common.classloader``, ``org.apache.cxf.common.jaxb``, ``org.apache.cxf.common.logging``, ``org.apache.cxf.configuration.jsse``, ``org.apache.cxf.helpers``, ``org.apache.cxf.resource``, ``org.apache.cxf.staxutils``, ``org.apache.cxf.tools.corba.utils``, ``org.apache.cxf.tools.util``, ``org.apache.cxf.transform``, ``org.apache.directory.ldap.client.api``, ``org.apache.hadoop.fs``, ``org.apache.hadoop.hive.metastore``, ``org.apache.hadoop.hive.ql.exec``, ``org.apache.hadoop.hive.ql.metadata``, ``org.apache.hc.client5.http.async.methods``, ``org.apache.hc.client5.http.classic.methods``, ``org.apache.hc.client5.http.fluent``, ``org.apache.hc.client5.http.protocol``, ``org.apache.hc.client5.http.utils``, ``org.apache.hive.hcatalog.templeton``, ``org.apache.ibatis.jdbc``, ``org.apache.ibatis.mapping``, ``org.apache.log4j``, ``org.apache.poi``, ``org.apache.shiro.authc``, ``org.apache.shiro.codec``, ``org.apache.shiro.jndi``, ``org.apache.shiro.mgt``, ``org.apache.sshd.client.session``, ``org.apache.tools.ant``, ``org.apache.tools.zip``, ``org.codehaus.cargo.container.installer``, ``org.dom4j``, ``org.exolab.castor.xml``, ``org.fusesource.leveldbjni``, ``org.geogebra.web.full.main``, ``org.gradle.api.file``, ``org.ho.yaml``, ``org.influxdb``, ``org.jabsorb``, ``org.jboss.vfs``, ``org.jdbi.v3.core``, ``org.jenkins.ui.icon``, ``org.jenkins.ui.symbol``, ``org.keycloak.models.map.storage``, ``org.kohsuke.stapler``, ``org.lastaflute.web``, ``org.mvel2``, ``org.openjdk.jmh.runner.options``, ``org.owasp.esapi``, ``org.pac4j.jwt.config.encryption``, ``org.pac4j.jwt.config.signature``, ``org.scijava.log``, ``org.xml.sax``, ``org.xmlpull.v1``, ``play.libs.ws``, ``play.mvc``, ``ratpack.core.form``, ``ratpack.core.handling``, ``ratpack.core.http``, ``ratpack.exec``, ``ratpack.form``, ``ratpack.func``, ``ratpack.handling``, ``ratpack.http``, ``ratpack.util``, ``software.amazon.awssdk.transfer.s3.model``, ``sun.jvmstat.perfdata.monitor.protocol.local``, ``sun.jvmstat.perfdata.monitor.protocol.rmi``, ``sun.misc``, ``sun.net.ftp``, ``sun.net.www.protocol.http``, ``sun.security.acl``, ``sun.security.jgss.krb5``, ``sun.security.krb5``, ``sun.security.pkcs``, ``sun.security.pkcs11``, ``sun.security.provider``, ``sun.security.ssl``, ``sun.security.x509``, ``sun.tools.jconsole``",151,8258,818,188,6,14,18,,186 - Totals,,406,28627,2751,461,16,137,33,1,416 + Others,"``actions.osgi``, ``antlr``, ``ch.ethz.ssh2``, ``cn.hutool.core.codec``, ``com.alibaba.com.caucho.hessian.io``, ``com.alibaba.druid.sql``, ``com.alibaba.fastjson2``, ``com.amazonaws.auth``, ``com.auth0.jwt.algorithms``, ``com.azure.identity``, ``com.caucho.burlap.io``, ``com.caucho.hessian.io``, ``com.cedarsoftware.util.io``, ``com.esotericsoftware.kryo.io``, ``com.esotericsoftware.kryo5.io``, ``com.esotericsoftware.yamlbeans``, ``com.hubspot.jinjava``, ``com.jcraft.jsch``, ``com.microsoft.sqlserver.jdbc``, ``com.mitchellbosecke.pebble``, ``com.opensymphony.xwork2``, ``com.sshtools.j2ssh.authentication``, ``com.sun.crypto.provider``, ``com.sun.jndi.ldap``, ``com.sun.net.httpserver``, ``com.sun.net.ssl``, ``com.sun.rowset``, ``com.sun.security.auth.module``, ``com.sun.security.ntlm``, ``com.sun.security.sasl.digest``, ``com.thoughtworks.xstream``, ``com.trilead.ssh2``, ``com.unboundid.ldap.sdk``, ``com.zaxxer.hikari``, ``flexjson``, ``hudson``, ``io.jsonwebtoken``, ``io.r2dbc.spi``, ``io.undertow.server.handlers.resource``, ``javafx.scene.web``, ``jenkins``, ``jodd.json``, ``liquibase.database.jvm``, ``liquibase.statement.core``, ``net.lingala.zip4j``, ``net.schmizz.sshj``, ``net.sf.json``, ``net.sf.saxon.s9api``, ``ognl``, ``org.acegisecurity``, ``org.antlr.runtime``, ``org.apache.avro``, ``org.apache.commons.codec``, ``org.apache.commons.compress.archivers.tar``, ``org.apache.commons.exec``, ``org.apache.commons.fileupload``, ``org.apache.commons.httpclient.util``, ``org.apache.commons.jelly``, ``org.apache.commons.jexl2``, ``org.apache.commons.jexl3``, ``org.apache.commons.lang``, ``org.apache.commons.logging``, ``org.apache.commons.net``, ``org.apache.commons.ognl``, ``org.apache.cxf.catalog``, ``org.apache.cxf.common.classloader``, ``org.apache.cxf.common.jaxb``, ``org.apache.cxf.common.logging``, ``org.apache.cxf.configuration.jsse``, ``org.apache.cxf.helpers``, ``org.apache.cxf.resource``, ``org.apache.cxf.staxutils``, ``org.apache.cxf.tools.corba.utils``, ``org.apache.cxf.tools.util``, ``org.apache.cxf.transform``, ``org.apache.directory.ldap.client.api``, ``org.apache.hadoop.fs``, ``org.apache.hadoop.hive.metastore``, ``org.apache.hadoop.hive.ql.exec``, ``org.apache.hadoop.hive.ql.metadata``, ``org.apache.hc.client5.http.async.methods``, ``org.apache.hc.client5.http.classic.methods``, ``org.apache.hc.client5.http.fluent``, ``org.apache.hc.client5.http.protocol``, ``org.apache.hc.client5.http.utils``, ``org.apache.hive.hcatalog.templeton``, ``org.apache.ibatis.jdbc``, ``org.apache.ibatis.mapping``, ``org.apache.log4j``, ``org.apache.poi``, ``org.apache.shiro.authc``, ``org.apache.shiro.codec``, ``org.apache.shiro.jndi``, ``org.apache.shiro.mgt``, ``org.apache.sshd.client.session``, ``org.apache.tools.ant``, ``org.apache.tools.zip``, ``org.codehaus.cargo.container.installer``, ``org.dom4j``, ``org.exolab.castor.xml``, ``org.fusesource.leveldbjni``, ``org.geogebra.web.full.main``, ``org.gradle.api.file``, ``org.ho.yaml``, ``org.influxdb``, ``org.jabsorb``, ``org.jboss.vfs``, ``org.jdbi.v3.core``, ``org.jenkins.ui.icon``, ``org.jenkins.ui.symbol``, ``org.keycloak.models.map.storage``, ``org.kohsuke.stapler``, ``org.lastaflute.web``, ``org.mvel2``, ``org.openjdk.jmh.runner.options``, ``org.owasp.esapi``, ``org.pac4j.jwt.config.encryption``, ``org.pac4j.jwt.config.signature``, ``org.scijava.log``, ``org.xml.sax``, ``org.xmlpull.v1``, ``play.libs.ws``, ``play.mvc``, ``ratpack.core.form``, ``ratpack.core.handling``, ``ratpack.core.http``, ``ratpack.exec``, ``ratpack.form``, ``ratpack.func``, ``ratpack.handling``, ``ratpack.http``, ``ratpack.util``, ``software.amazon.awssdk.transfer.s3.model``, ``sun.jvmstat.perfdata.monitor.protocol.local``, ``sun.jvmstat.perfdata.monitor.protocol.rmi``, ``sun.misc``, ``sun.net.ftp``, ``sun.net.www.protocol.http``, ``sun.security.acl``, ``sun.security.jgss.krb5``, ``sun.security.krb5``, ``sun.security.pkcs``, ``sun.security.pkcs11``, ``sun.security.provider``, ``sun.security.ssl``, ``sun.security.x509``, ``sun.tools.jconsole``",151,8258,824,188,6,20,18,,186 + Totals,,406,28637,2765,461,16,151,33,1,416 From 62fdb69be19675b89cd61af39c46cbf9565231ee Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 11 Aug 2026 07:26:27 +0000 Subject: [PATCH 0219/2098] Remove redundant blunt taint fallback steps from ListExtend and ListInsert Co-authored-by: hvitved <3667920+hvitved@users.noreply.github.com> --- python/ql/lib/semmle/python/frameworks/Stdlib.qll | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/python/ql/lib/semmle/python/frameworks/Stdlib.qll b/python/ql/lib/semmle/python/frameworks/Stdlib.qll index 327b4a2629e5..b9ad7bf63702 100644 --- a/python/ql/lib/semmle/python/frameworks/Stdlib.qll +++ b/python/ql/lib/semmle/python/frameworks/Stdlib.qll @@ -4906,11 +4906,6 @@ module StdlibPrivate { ) and output = "Argument[self].ListElement" and preservesValue = true - or - // transfer taint from new iterable to this (TODO: remove in future when taint-handling is more in line with other languages) - input = "Argument[0]" and - output = "Argument[self]" and - preservesValue = false } } @@ -4935,11 +4930,6 @@ module StdlibPrivate { input = "Argument[1]" and output = "Argument[self].ListElement" and preservesValue = true - or - // transfer taint from new element to this (TODO: remove in future when taint-handling is more in line with other languages) - input = "Argument[1]" and - output = "Argument[self]" and - preservesValue = false } } From 7f9cb76cfc2a872c1ab8e416b84c02116e2a4199 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Tue, 11 Aug 2026 09:36:07 +0200 Subject: [PATCH 0220/2098] Python: Remove redundant collection taint summaries Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- python/ql/lib/semmle/python/frameworks/Stdlib.qll | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/python/ql/lib/semmle/python/frameworks/Stdlib.qll b/python/ql/lib/semmle/python/frameworks/Stdlib.qll index df69a010fd8b..c70fe1f5dcd0 100644 --- a/python/ql/lib/semmle/python/frameworks/Stdlib.qll +++ b/python/ql/lib/semmle/python/frameworks/Stdlib.qll @@ -4871,11 +4871,6 @@ module StdlibPrivate { input = "Argument[0]" and output = "Argument[self].ListElement" and preservesValue = true - or - // transfer taint from new element to this (TODO: remove in future when taint-handling is more in line with other languages) - input = "Argument[0]" and - output = "Argument[self]" and - preservesValue = false } } @@ -4898,11 +4893,6 @@ module StdlibPrivate { input = "Argument[0]" and output = "Argument[self].SetElement" and preservesValue = true - or - // transfer taint from new element to this (TODO: remove in future when taint-handling is more in line with other languages) - input = "Argument[0]" and - output = "Argument[self]" and - preservesValue = false } } From d3775a2c6683f39f9c9cd147b87258523f06713d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 11 Aug 2026 08:11:11 +0000 Subject: [PATCH 0221/2098] Initial plan From a658c7742bec431d0ed102893e8e1668583b5066 Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 11 Aug 2026 10:16:46 +0200 Subject: [PATCH 0222/2098] unified: Add test showing AST mapping error Notice the type error in the output --- .../nested-enum-case-pattern.output | 78 +++++++++++++++++++ .../nested-enum-case-pattern.swift | 2 + 2 files changed, 80 insertions(+) diff --git a/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output b/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output index 22d9b86bf996..a85ba8a8cca8 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output +++ b/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output @@ -1,6 +1,8 @@ switch event { case let .received(.some(value), timestamp): print(value, timestamp) +case Type.some(let value): + print(value) default: break } @@ -88,6 +90,54 @@ sourceFile calledExpression: declReferenceExpr baseName: identifier "print" + switchCase + label: + switchCaseLabel + colon: : + caseKeyword: case + caseItems: + switchCaseItem + pattern: + expressionPattern + expression: + functionCallExpr + leftParen: ( + rightParen: ) + arguments: + labeledExpr + expression: + patternExpr + pattern: + valueBindingPattern + pattern: + identifierPattern + identifier: identifier "value" + bindingSpecifier: let + additionalTrailingClosures: + calledExpression: + memberAccessExpr + period: . + declName: + declReferenceExpr + baseName: identifier "some" + base: + declReferenceExpr + baseName: identifier "Type" + statements: + codeBlockItem + item: + functionCallExpr + leftParen: ( + rightParen: ) + arguments: + labeledExpr + expression: + declReferenceExpr + baseName: identifier "value" + additionalTrailingClosures: + calledExpression: + declReferenceExpr + baseName: identifier "print" switchCase label: switchDefaultLabel @@ -154,6 +204,34 @@ top_level value: name_expr identifier: identifier "timestamp" + switch_case + pattern: + constructor_pattern + constructor: + member_access_expr + base: + expr_equality_pattern <-- ERROR: The field member_access_expr.base should contain expr_or_type, but got expr_equality_pattern + expr: + name_expr + identifier: identifier "Type" + member: identifier "some" + element: + pattern_element + pattern: + name_pattern + identifier: identifier "value" + body: + block + stmt: + call_expr + callee: + name_expr + identifier: identifier "print" + argument: + argument + value: + name_expr + identifier: identifier "value" switch_case body: block diff --git a/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.swift b/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.swift index 876d9995aee6..ed1a6b738a4b 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.swift +++ b/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.swift @@ -1,6 +1,8 @@ switch event { case let .received(.some(value), timestamp): print(value, timestamp) +case Type.some(let value): + print(value) default: break } From c58a096608d9bc9578c1ae4596650ff0d366ea78 Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 11 Aug 2026 10:19:21 +0200 Subject: [PATCH 0223/2098] unified: Fix translation of callee in constructor pattern --- unified/extractor/src/languages/swift/swift.rs | 7 ++++++- .../swift/control-flow/nested-enum-case-pattern.output | 6 ++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/unified/extractor/src/languages/swift/swift.rs b/unified/extractor/src/languages/swift/swift.rs index e615f07388a9..6396d4addd75 100644 --- a/unified/extractor/src/languages/swift/swift.rs +++ b/unified/extractor/src/languages/swift/swift.rs @@ -655,9 +655,14 @@ fn translation_rules() -> Vec> { (call_expr callee: {callee} argument: {args} argument: (argument value: {tc})) ), rule!( - (functionCallExpr calledExpression: @callee arguments: _* @args) + (functionCallExpr calledExpression: @@rawCallee arguments: _* @args) => expr { + // Always translate the callee in non-pattern context. + let callee = ctx.scoped(|ctx| { + ctx.in_pattern = false; + ctx.translate(rawCallee) + })?; if ctx.in_pattern { tree!((constructor_pattern constructor: {callee} element: {args})) } else { diff --git a/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output b/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output index a85ba8a8cca8..66a6f32dab4d 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output +++ b/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output @@ -210,10 +210,8 @@ top_level constructor: member_access_expr base: - expr_equality_pattern <-- ERROR: The field member_access_expr.base should contain expr_or_type, but got expr_equality_pattern - expr: - name_expr - identifier: identifier "Type" + name_expr + identifier: identifier "Type" member: identifier "some" element: pattern_element From 925d3e2c219ccd601c727c54822a2d6852fbad7a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 11 Aug 2026 08:24:07 +0000 Subject: [PATCH 0224/2098] Java: replace non-existent String.valueOf(CharSequence) summary with a synthetic callable for valueOf(Object) on CharSequence arguments Co-authored-by: hvitved <3667920+hvitved@users.noreply.github.com> --- .../2026-08-11-string-valueof-charsequence.md | 4 ++ java/ql/lib/ext/java.lang.model.yml | 1 - .../semmle/code/java/dataflow/FlowSummary.qll | 1 + .../semmle/code/java/frameworks/Strings.qll | 40 +++++++++++++++++++ .../dataflow/string-valueof/A.java | 26 ++++++++++++ .../dataflow/string-valueof/test.expected | 39 ++++++++++++++++++ .../dataflow/string-valueof/test.ql | 3 ++ 7 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 java/ql/lib/change-notes/2026-08-11-string-valueof-charsequence.md create mode 100644 java/ql/lib/semmle/code/java/frameworks/Strings.qll create mode 100644 java/ql/test/library-tests/dataflow/string-valueof/A.java create mode 100644 java/ql/test/library-tests/dataflow/string-valueof/test.expected create mode 100644 java/ql/test/library-tests/dataflow/string-valueof/test.ql diff --git a/java/ql/lib/change-notes/2026-08-11-string-valueof-charsequence.md b/java/ql/lib/change-notes/2026-08-11-string-valueof-charsequence.md new file mode 100644 index 000000000000..51331eb08372 --- /dev/null +++ b/java/ql/lib/change-notes/2026-08-11-string-valueof-charsequence.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Removed the summary model for `String.valueOf(CharSequence)`, which does not exist. Instead, taint is now propagated through calls to `String.valueOf(Object)` when the argument is a `CharSequence`, for example a `String` or a `StringBuilder`. diff --git a/java/ql/lib/ext/java.lang.model.yml b/java/ql/lib/ext/java.lang.model.yml index 9e3d9e8cee54..d613c6fe8f5b 100644 --- a/java/ql/lib/ext/java.lang.model.yml +++ b/java/ql/lib/ext/java.lang.model.yml @@ -134,7 +134,6 @@ extensions: - ["java.lang", "String", False, "valueOf", "(char)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["java.lang", "String", False, "valueOf", "(char[])", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["java.lang", "String", False, "valueOf", "(char[],int,int)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["java.lang", "String", False, "valueOf", "(CharSequence)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["java.lang", "StringBuffer", True, "StringBuffer", "(CharSequence)", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.lang", "StringBuffer", True, "StringBuffer", "(String)", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.lang", "StringBuilder", True, "StringBuilder", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] diff --git a/java/ql/lib/semmle/code/java/dataflow/FlowSummary.qll b/java/ql/lib/semmle/code/java/dataflow/FlowSummary.qll index b88db0272cea..ff281b61511c 100644 --- a/java/ql/lib/semmle/code/java/dataflow/FlowSummary.qll +++ b/java/ql/lib/semmle/code/java/dataflow/FlowSummary.qll @@ -44,6 +44,7 @@ private module SyntheticCallables { private import semmle.code.java.dispatch.WrappedInvocation private import semmle.code.java.frameworks.android.Intent private import semmle.code.java.frameworks.Stream + private import semmle.code.java.frameworks.Strings } private newtype TSummarizedCallableBase = diff --git a/java/ql/lib/semmle/code/java/frameworks/Strings.qll b/java/ql/lib/semmle/code/java/frameworks/Strings.qll new file mode 100644 index 000000000000..4b8600ab3ac3 --- /dev/null +++ b/java/ql/lib/semmle/code/java/frameworks/Strings.qll @@ -0,0 +1,40 @@ +/** Definitions related to `java.lang.String`. */ +overlay[local?] +module; + +private import java +private import semmle.code.java.dataflow.FlowSummary + +/** + * A call to `String.valueOf(Object)` where the argument is a `CharSequence`, + * for example a `String` or a `StringBuilder`. + * + * Such a call is equivalent to calling `toString()` on the argument, which for + * a `CharSequence` is guaranteed to yield a string containing the characters of + * the argument, so taint is propagated. This is in contrast to `valueOf(Object)` + * calls in general, where `toString()` may not expose the state of the argument. + */ +private class StringValueOfCharSequence extends SyntheticCallable { + StringValueOfCharSequence() { this = "java.lang.String.valueOf(Object)+CharSequence" } + + override MethodCall getACall() { + exists(Method m | m = result.getMethod().getSourceDeclaration() | + m.hasQualifiedName("java.lang", "String", "valueOf") and + m.getParameterType(0) instanceof TypeObject + ) and + result + .getArgument(0) + .getType() + .(RefType) + .getAnAncestor() + .hasQualifiedName("java.lang", "CharSequence") + } + + override predicate propagatesFlow(string input, string output, boolean preservesValue) { + input = "Argument[0]" and + output = "ReturnValue" and + preservesValue = false + } + + override Type getReturnType() { result instanceof TypeString } +} diff --git a/java/ql/test/library-tests/dataflow/string-valueof/A.java b/java/ql/test/library-tests/dataflow/string-valueof/A.java new file mode 100644 index 000000000000..037372002912 --- /dev/null +++ b/java/ql/test/library-tests/dataflow/string-valueof/A.java @@ -0,0 +1,26 @@ +public class A { + String source() { return "source"; } + + void sink(Object o) {} + + void m(char[] cs, char c, Object obj) { + String s = source(); + + sink(String.valueOf(s)); // $ hasTaintFlow + + CharSequence seq = s; + sink(String.valueOf(seq)); // $ hasTaintFlow + + StringBuilder sb = new StringBuilder(s); + sink(String.valueOf(sb)); // $ hasTaintFlow + + sink(String.valueOf(s.toCharArray())); // $ hasTaintFlow + + sink(String.valueOf(s.charAt(0))); // $ hasTaintFlow + + // `toString` on an arbitrary object is not assumed to expose the state of + // the object, so no flow is expected here. + Object o = s; + sink(String.valueOf(o)); + } +} diff --git a/java/ql/test/library-tests/dataflow/string-valueof/test.expected b/java/ql/test/library-tests/dataflow/string-valueof/test.expected new file mode 100644 index 000000000000..851523f93087 --- /dev/null +++ b/java/ql/test/library-tests/dataflow/string-valueof/test.expected @@ -0,0 +1,39 @@ +models +| 1 | Summary: java.lang; CharSequence; true; charAt; ; ; Argument[this]; ReturnValue; taint; manual | +| 2 | Summary: java.lang; String; false; toCharArray; ; ; Argument[this]; ReturnValue; taint; manual | +| 3 | Summary: java.lang; String; false; valueOf; (char); ; Argument[0]; ReturnValue; taint; manual | +| 4 | Summary: java.lang; String; false; valueOf; (char[]); ; Argument[0]; ReturnValue; taint; manual | +| 5 | Summary: java.lang; StringBuilder; true; StringBuilder; ; ; Argument[0]; Argument[this]; taint; manual | +edges +| A.java:7:16:7:23 | source(...) : String | A.java:9:25:9:25 | s : String | provenance | | +| A.java:7:16:7:23 | source(...) : String | A.java:12:25:12:27 | seq : String | provenance | | +| A.java:7:16:7:23 | source(...) : String | A.java:14:42:14:42 | s : String | provenance | | +| A.java:7:16:7:23 | source(...) : String | A.java:17:25:17:25 | s : String | provenance | | +| A.java:7:16:7:23 | source(...) : String | A.java:19:25:19:25 | s : String | provenance | | +| A.java:9:25:9:25 | s : String | A.java:9:10:9:26 | valueOf(...) | provenance | java.lang.String.valueOf(Object)+CharSequence | +| A.java:12:25:12:27 | seq : String | A.java:12:10:12:28 | valueOf(...) | provenance | java.lang.String.valueOf(Object)+CharSequence | +| A.java:14:24:14:43 | new StringBuilder(...) : StringBuilder | A.java:15:25:15:26 | sb : StringBuilder | provenance | | +| A.java:14:42:14:42 | s : String | A.java:14:24:14:43 | new StringBuilder(...) : StringBuilder | provenance | MaD:5 | +| A.java:15:25:15:26 | sb : StringBuilder | A.java:15:10:15:27 | valueOf(...) | provenance | java.lang.String.valueOf(Object)+CharSequence | +| A.java:17:25:17:25 | s : String | A.java:17:25:17:39 | toCharArray(...) : char[] | provenance | MaD:2 | +| A.java:17:25:17:39 | toCharArray(...) : char[] | A.java:17:10:17:40 | valueOf(...) | provenance | MaD:4 | +| A.java:19:25:19:25 | s : String | A.java:19:25:19:35 | charAt(...) : Number | provenance | MaD:1 | +| A.java:19:25:19:35 | charAt(...) : Number | A.java:19:10:19:36 | valueOf(...) | provenance | MaD:3 | +nodes +| A.java:7:16:7:23 | source(...) : String | semmle.label | source(...) : String | +| A.java:9:10:9:26 | valueOf(...) | semmle.label | valueOf(...) | +| A.java:9:25:9:25 | s : String | semmle.label | s : String | +| A.java:12:10:12:28 | valueOf(...) | semmle.label | valueOf(...) | +| A.java:12:25:12:27 | seq : String | semmle.label | seq : String | +| A.java:14:24:14:43 | new StringBuilder(...) : StringBuilder | semmle.label | new StringBuilder(...) : StringBuilder | +| A.java:14:42:14:42 | s : String | semmle.label | s : String | +| A.java:15:10:15:27 | valueOf(...) | semmle.label | valueOf(...) | +| A.java:15:25:15:26 | sb : StringBuilder | semmle.label | sb : StringBuilder | +| A.java:17:10:17:40 | valueOf(...) | semmle.label | valueOf(...) | +| A.java:17:25:17:25 | s : String | semmle.label | s : String | +| A.java:17:25:17:39 | toCharArray(...) : char[] | semmle.label | toCharArray(...) : char[] | +| A.java:19:10:19:36 | valueOf(...) | semmle.label | valueOf(...) | +| A.java:19:25:19:25 | s : String | semmle.label | s : String | +| A.java:19:25:19:35 | charAt(...) : Number | semmle.label | charAt(...) : Number | +subpaths +testFailures diff --git a/java/ql/test/library-tests/dataflow/string-valueof/test.ql b/java/ql/test/library-tests/dataflow/string-valueof/test.ql new file mode 100644 index 000000000000..e64b8bfececb --- /dev/null +++ b/java/ql/test/library-tests/dataflow/string-valueof/test.ql @@ -0,0 +1,3 @@ +import utils.test.InlineFlowTest +import DefaultFlowTest +import TaintFlow::PathGraph From c601c6c3a28b0f6d775829e3b104db47df726d81 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 11 Aug 2026 08:25:13 +0000 Subject: [PATCH 0225/2098] Simplify test method signature Co-authored-by: hvitved <3667920+hvitved@users.noreply.github.com> --- java/ql/test/library-tests/dataflow/string-valueof/A.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/ql/test/library-tests/dataflow/string-valueof/A.java b/java/ql/test/library-tests/dataflow/string-valueof/A.java index 037372002912..cf9d6ea8c1d7 100644 --- a/java/ql/test/library-tests/dataflow/string-valueof/A.java +++ b/java/ql/test/library-tests/dataflow/string-valueof/A.java @@ -3,7 +3,7 @@ public class A { void sink(Object o) {} - void m(char[] cs, char c, Object obj) { + void m() { String s = source(); sink(String.valueOf(s)); // $ hasTaintFlow From 4ce19bbcda5b2d9d9e464c2679f45d893511b489 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Tue, 11 Aug 2026 10:25:58 +0200 Subject: [PATCH 0226/2098] Ruby: Restrict ap len to 1 for regex tracking. --- ruby/ql/lib/codeql/ruby/regexp/internal/RegExpTracking.qll | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ruby/ql/lib/codeql/ruby/regexp/internal/RegExpTracking.qll b/ruby/ql/lib/codeql/ruby/regexp/internal/RegExpTracking.qll index 7229ccfd9125..3e4ca47ba300 100644 --- a/ruby/ql/lib/codeql/ruby/regexp/internal/RegExpTracking.qll +++ b/ruby/ql/lib/codeql/ruby/regexp/internal/RegExpTracking.qll @@ -97,6 +97,8 @@ private module RegexConfig implements DataFlow::StateConfigSig { node2.asExpr().(CfgNodes::ExprNodes::StringlikeLiteralCfgNode).getAComponent() ) } + + int accessPathLimit() { result = 1 } } private module RegexTracking = DataFlow::GlobalWithState; From 26a1597862e6455c12e0b033a23c7ad4fb616650 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Tue, 11 Aug 2026 10:27:09 +0200 Subject: [PATCH 0227/2098] Python: Manually reorder relations in `.expected` file --- .../Security/CWE-022-TarSlip/TarSlip.expected | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/python/ql/test/experimental/query-tests/Security/CWE-022-TarSlip/TarSlip.expected b/python/ql/test/experimental/query-tests/Security/CWE-022-TarSlip/TarSlip.expected index 6de2b27bfa76..6cceacd031f6 100644 --- a/python/ql/test/experimental/query-tests/Security/CWE-022-TarSlip/TarSlip.expected +++ b/python/ql/test/experimental/query-tests/Security/CWE-022-TarSlip/TarSlip.expected @@ -1,3 +1,33 @@ +#select +| TarSlipImprov.py:22:35:22:40 | ControlFlowNode for result | TarSlipImprov.py:15:7:15:39 | ControlFlowNode for Attribute() | TarSlipImprov.py:22:35:22:40 | ControlFlowNode for result | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:15:7:15:39 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:22:35:22:40 | ControlFlowNode for result | ControlFlowNode for result | +| TarSlipImprov.py:39:49:39:68 | ControlFlowNode for members_filter1() | TarSlipImprov.py:38:7:38:39 | ControlFlowNode for Attribute() | TarSlipImprov.py:39:49:39:68 | ControlFlowNode for members_filter1() | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:38:7:38:39 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:39:49:39:68 | ControlFlowNode for members_filter1() | ControlFlowNode for members_filter1() | +| TarSlipImprov.py:47:21:47:25 | ControlFlowNode for entry | TarSlipImprov.py:43:6:43:38 | ControlFlowNode for Attribute() | TarSlipImprov.py:47:21:47:25 | ControlFlowNode for entry | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:43:6:43:38 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:47:21:47:25 | ControlFlowNode for entry | ControlFlowNode for entry | +| TarSlipImprov.py:58:21:58:25 | ControlFlowNode for entry | TarSlipImprov.py:54:6:54:38 | ControlFlowNode for Attribute() | TarSlipImprov.py:58:21:58:25 | ControlFlowNode for entry | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:54:6:54:38 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:58:21:58:25 | ControlFlowNode for entry | ControlFlowNode for entry | +| TarSlipImprov.py:91:5:91:7 | ControlFlowNode for tar | TarSlipImprov.py:88:6:88:43 | ControlFlowNode for Attribute() | TarSlipImprov.py:91:5:91:7 | ControlFlowNode for tar | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:88:6:88:43 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:91:5:91:7 | ControlFlowNode for tar | ControlFlowNode for tar | +| TarSlipImprov.py:115:9:115:11 | ControlFlowNode for tar | TarSlipImprov.py:111:7:111:39 | ControlFlowNode for Attribute() | TarSlipImprov.py:115:9:115:11 | ControlFlowNode for tar | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:111:7:111:39 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:115:9:115:11 | ControlFlowNode for tar | ControlFlowNode for tar | +| TarSlipImprov.py:125:36:125:40 | ControlFlowNode for entry | TarSlipImprov.py:123:6:123:29 | ControlFlowNode for Attribute() | TarSlipImprov.py:125:36:125:40 | ControlFlowNode for entry | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:123:6:123:29 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:125:36:125:40 | ControlFlowNode for entry | ControlFlowNode for entry | +| TarSlipImprov.py:130:5:130:7 | ControlFlowNode for tar | TarSlipImprov.py:129:6:129:26 | ControlFlowNode for Attribute() | TarSlipImprov.py:130:5:130:7 | ControlFlowNode for tar | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:129:6:129:26 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:130:5:130:7 | ControlFlowNode for tar | ControlFlowNode for tar | +| TarSlipImprov.py:134:1:134:3 | ControlFlowNode for tar | TarSlipImprov.py:133:7:133:39 | ControlFlowNode for Attribute() | TarSlipImprov.py:134:1:134:3 | ControlFlowNode for tar | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:133:7:133:39 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:134:1:134:3 | ControlFlowNode for tar | ControlFlowNode for tar | +| TarSlipImprov.py:143:36:143:40 | ControlFlowNode for entry | TarSlipImprov.py:141:6:141:29 | ControlFlowNode for Attribute() | TarSlipImprov.py:143:36:143:40 | ControlFlowNode for entry | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:141:6:141:29 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:143:36:143:40 | ControlFlowNode for entry | ControlFlowNode for entry | +| TarSlipImprov.py:169:9:169:12 | ControlFlowNode for tarc | TarSlipImprov.py:151:22:151:49 | ControlFlowNode for Attribute() | TarSlipImprov.py:169:9:169:12 | ControlFlowNode for tarc | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:151:22:151:49 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:169:9:169:12 | ControlFlowNode for tarc | ControlFlowNode for tarc | +| TarSlipImprov.py:169:9:169:12 | ControlFlowNode for tarc | TarSlipImprov.py:159:26:159:51 | ControlFlowNode for Attribute() | TarSlipImprov.py:169:9:169:12 | ControlFlowNode for tarc | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:159:26:159:51 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:169:9:169:12 | ControlFlowNode for tarc | ControlFlowNode for tarc | +| TarSlipImprov.py:178:36:178:40 | ControlFlowNode for entry | TarSlipImprov.py:176:6:176:31 | ControlFlowNode for Attribute() | TarSlipImprov.py:178:36:178:40 | ControlFlowNode for entry | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:176:6:176:31 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:178:36:178:40 | ControlFlowNode for entry | ControlFlowNode for entry | +| TarSlipImprov.py:184:21:184:25 | ControlFlowNode for entry | TarSlipImprov.py:182:6:182:31 | ControlFlowNode for Attribute() | TarSlipImprov.py:184:21:184:25 | ControlFlowNode for entry | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:182:6:182:31 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:184:21:184:25 | ControlFlowNode for entry | ControlFlowNode for entry | +| TarSlipImprov.py:189:1:189:3 | ControlFlowNode for tar | TarSlipImprov.py:188:7:188:27 | ControlFlowNode for Attribute() | TarSlipImprov.py:189:1:189:3 | ControlFlowNode for tar | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:188:7:188:27 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:189:1:189:3 | ControlFlowNode for tar | ControlFlowNode for tar | +| TarSlipImprov.py:194:49:194:51 | ControlFlowNode for tar | TarSlipImprov.py:193:6:193:31 | ControlFlowNode for Attribute() | TarSlipImprov.py:194:49:194:51 | ControlFlowNode for tar | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:193:6:193:31 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:194:49:194:51 | ControlFlowNode for tar | ControlFlowNode for tar | +| TarSlipImprov.py:211:5:211:7 | ControlFlowNode for tar | TarSlipImprov.py:210:6:210:43 | ControlFlowNode for Attribute() | TarSlipImprov.py:211:5:211:7 | ControlFlowNode for tar | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:210:6:210:43 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:211:5:211:7 | ControlFlowNode for tar | ControlFlowNode for tar | +| TarSlipImprov.py:236:44:236:50 | ControlFlowNode for members | TarSlipImprov.py:231:6:231:38 | ControlFlowNode for Attribute() | TarSlipImprov.py:236:44:236:50 | ControlFlowNode for members | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:231:6:231:38 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:236:44:236:50 | ControlFlowNode for members | ControlFlowNode for members | +| TarSlipImprov.py:254:1:254:31 | ControlFlowNode for Attribute() | TarSlipImprov.py:254:1:254:31 | ControlFlowNode for Attribute() | TarSlipImprov.py:254:1:254:31 | ControlFlowNode for Attribute() | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:254:1:254:31 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:254:1:254:31 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | +| TarSlipImprov.py:261:25:261:29 | ControlFlowNode for entry | TarSlipImprov.py:258:6:258:26 | ControlFlowNode for Attribute() | TarSlipImprov.py:261:25:261:29 | ControlFlowNode for entry | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:258:6:258:26 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:261:25:261:29 | ControlFlowNode for entry | ControlFlowNode for entry | +| TarSlipImprov.py:268:21:268:25 | ControlFlowNode for entry | TarSlipImprov.py:264:6:264:38 | ControlFlowNode for Attribute() | TarSlipImprov.py:268:21:268:25 | ControlFlowNode for entry | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:264:6:264:38 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:268:21:268:25 | ControlFlowNode for entry | ControlFlowNode for entry | +| TarSlipImprov.py:274:25:274:29 | ControlFlowNode for entry | TarSlipImprov.py:271:6:271:39 | ControlFlowNode for Attribute() | TarSlipImprov.py:274:25:274:29 | ControlFlowNode for entry | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:271:6:271:39 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:274:25:274:29 | ControlFlowNode for entry | ControlFlowNode for entry | +| TarSlipImprov.py:280:21:280:25 | ControlFlowNode for entry | TarSlipImprov.py:276:6:276:38 | ControlFlowNode for Attribute() | TarSlipImprov.py:280:21:280:25 | ControlFlowNode for entry | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:276:6:276:38 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:280:21:280:25 | ControlFlowNode for entry | ControlFlowNode for entry | +| TarSlipImprov.py:284:5:284:7 | ControlFlowNode for tar | TarSlipImprov.py:283:6:283:51 | ControlFlowNode for Attribute() | TarSlipImprov.py:284:5:284:7 | ControlFlowNode for tar | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:283:6:283:51 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:284:5:284:7 | ControlFlowNode for tar | ControlFlowNode for tar | +| TarSlipImprov.py:288:49:288:51 | ControlFlowNode for tar | TarSlipImprov.py:287:7:287:28 | ControlFlowNode for Attribute() | TarSlipImprov.py:288:49:288:51 | ControlFlowNode for tar | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:287:7:287:28 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:288:49:288:51 | ControlFlowNode for tar | ControlFlowNode for tar | +| TarSlipImprov.py:293:1:293:3 | ControlFlowNode for tar | TarSlipImprov.py:292:7:292:39 | ControlFlowNode for Attribute() | TarSlipImprov.py:293:1:293:3 | ControlFlowNode for tar | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:292:7:292:39 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:293:1:293:3 | ControlFlowNode for tar | ControlFlowNode for tar | +| TarSlipImprov.py:301:49:301:51 | ControlFlowNode for tar | TarSlipImprov.py:300:6:300:51 | ControlFlowNode for Attribute() | TarSlipImprov.py:301:49:301:51 | ControlFlowNode for tar | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:300:6:300:51 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:301:49:301:51 | ControlFlowNode for tar | ControlFlowNode for tar | +| TarSlipImprov.py:310:49:310:54 | ControlFlowNode for result | TarSlipImprov.py:304:7:304:39 | ControlFlowNode for Attribute() | TarSlipImprov.py:310:49:310:54 | ControlFlowNode for result | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:304:7:304:39 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:310:49:310:54 | ControlFlowNode for result | ControlFlowNode for result | +| TarSlipImprov.py:316:1:316:46 | ControlFlowNode for Attribute() | TarSlipImprov.py:316:1:316:46 | ControlFlowNode for Attribute() | TarSlipImprov.py:316:1:316:46 | ControlFlowNode for Attribute() | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:316:1:316:46 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:316:1:316:46 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | edges | TarSlipImprov.py:15:1:15:3 | ControlFlowNode for tar | TarSlipImprov.py:17:5:17:10 | ControlFlowNode for member | provenance | | | TarSlipImprov.py:15:7:15:39 | ControlFlowNode for Attribute() | TarSlipImprov.py:15:1:15:3 | ControlFlowNode for tar | provenance | | @@ -223,33 +253,3 @@ nodes subpaths | TarSlipImprov.py:39:65:39:67 | ControlFlowNode for tar | TarSlipImprov.py:26:21:26:27 | ControlFlowNode for tarfile | TarSlipImprov.py:36:12:36:17 | ControlFlowNode for result | TarSlipImprov.py:39:49:39:68 | ControlFlowNode for members_filter1() | | TarSlipImprov.py:39:65:39:67 | ControlFlowNode for tar | TarSlipImprov.py:26:21:26:27 | ControlFlowNode for tarfile | TarSlipImprov.py:36:12:36:17 | ControlFlowNode for result [List element] | TarSlipImprov.py:39:49:39:68 | ControlFlowNode for members_filter1() | -#select -| TarSlipImprov.py:22:35:22:40 | ControlFlowNode for result | TarSlipImprov.py:15:7:15:39 | ControlFlowNode for Attribute() | TarSlipImprov.py:22:35:22:40 | ControlFlowNode for result | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:15:7:15:39 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:22:35:22:40 | ControlFlowNode for result | ControlFlowNode for result | -| TarSlipImprov.py:39:49:39:68 | ControlFlowNode for members_filter1() | TarSlipImprov.py:38:7:38:39 | ControlFlowNode for Attribute() | TarSlipImprov.py:39:49:39:68 | ControlFlowNode for members_filter1() | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:38:7:38:39 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:39:49:39:68 | ControlFlowNode for members_filter1() | ControlFlowNode for members_filter1() | -| TarSlipImprov.py:47:21:47:25 | ControlFlowNode for entry | TarSlipImprov.py:43:6:43:38 | ControlFlowNode for Attribute() | TarSlipImprov.py:47:21:47:25 | ControlFlowNode for entry | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:43:6:43:38 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:47:21:47:25 | ControlFlowNode for entry | ControlFlowNode for entry | -| TarSlipImprov.py:58:21:58:25 | ControlFlowNode for entry | TarSlipImprov.py:54:6:54:38 | ControlFlowNode for Attribute() | TarSlipImprov.py:58:21:58:25 | ControlFlowNode for entry | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:54:6:54:38 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:58:21:58:25 | ControlFlowNode for entry | ControlFlowNode for entry | -| TarSlipImprov.py:91:5:91:7 | ControlFlowNode for tar | TarSlipImprov.py:88:6:88:43 | ControlFlowNode for Attribute() | TarSlipImprov.py:91:5:91:7 | ControlFlowNode for tar | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:88:6:88:43 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:91:5:91:7 | ControlFlowNode for tar | ControlFlowNode for tar | -| TarSlipImprov.py:115:9:115:11 | ControlFlowNode for tar | TarSlipImprov.py:111:7:111:39 | ControlFlowNode for Attribute() | TarSlipImprov.py:115:9:115:11 | ControlFlowNode for tar | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:111:7:111:39 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:115:9:115:11 | ControlFlowNode for tar | ControlFlowNode for tar | -| TarSlipImprov.py:125:36:125:40 | ControlFlowNode for entry | TarSlipImprov.py:123:6:123:29 | ControlFlowNode for Attribute() | TarSlipImprov.py:125:36:125:40 | ControlFlowNode for entry | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:123:6:123:29 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:125:36:125:40 | ControlFlowNode for entry | ControlFlowNode for entry | -| TarSlipImprov.py:130:5:130:7 | ControlFlowNode for tar | TarSlipImprov.py:129:6:129:26 | ControlFlowNode for Attribute() | TarSlipImprov.py:130:5:130:7 | ControlFlowNode for tar | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:129:6:129:26 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:130:5:130:7 | ControlFlowNode for tar | ControlFlowNode for tar | -| TarSlipImprov.py:134:1:134:3 | ControlFlowNode for tar | TarSlipImprov.py:133:7:133:39 | ControlFlowNode for Attribute() | TarSlipImprov.py:134:1:134:3 | ControlFlowNode for tar | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:133:7:133:39 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:134:1:134:3 | ControlFlowNode for tar | ControlFlowNode for tar | -| TarSlipImprov.py:143:36:143:40 | ControlFlowNode for entry | TarSlipImprov.py:141:6:141:29 | ControlFlowNode for Attribute() | TarSlipImprov.py:143:36:143:40 | ControlFlowNode for entry | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:141:6:141:29 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:143:36:143:40 | ControlFlowNode for entry | ControlFlowNode for entry | -| TarSlipImprov.py:169:9:169:12 | ControlFlowNode for tarc | TarSlipImprov.py:151:22:151:49 | ControlFlowNode for Attribute() | TarSlipImprov.py:169:9:169:12 | ControlFlowNode for tarc | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:151:22:151:49 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:169:9:169:12 | ControlFlowNode for tarc | ControlFlowNode for tarc | -| TarSlipImprov.py:169:9:169:12 | ControlFlowNode for tarc | TarSlipImprov.py:159:26:159:51 | ControlFlowNode for Attribute() | TarSlipImprov.py:169:9:169:12 | ControlFlowNode for tarc | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:159:26:159:51 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:169:9:169:12 | ControlFlowNode for tarc | ControlFlowNode for tarc | -| TarSlipImprov.py:178:36:178:40 | ControlFlowNode for entry | TarSlipImprov.py:176:6:176:31 | ControlFlowNode for Attribute() | TarSlipImprov.py:178:36:178:40 | ControlFlowNode for entry | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:176:6:176:31 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:178:36:178:40 | ControlFlowNode for entry | ControlFlowNode for entry | -| TarSlipImprov.py:184:21:184:25 | ControlFlowNode for entry | TarSlipImprov.py:182:6:182:31 | ControlFlowNode for Attribute() | TarSlipImprov.py:184:21:184:25 | ControlFlowNode for entry | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:182:6:182:31 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:184:21:184:25 | ControlFlowNode for entry | ControlFlowNode for entry | -| TarSlipImprov.py:189:1:189:3 | ControlFlowNode for tar | TarSlipImprov.py:188:7:188:27 | ControlFlowNode for Attribute() | TarSlipImprov.py:189:1:189:3 | ControlFlowNode for tar | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:188:7:188:27 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:189:1:189:3 | ControlFlowNode for tar | ControlFlowNode for tar | -| TarSlipImprov.py:194:49:194:51 | ControlFlowNode for tar | TarSlipImprov.py:193:6:193:31 | ControlFlowNode for Attribute() | TarSlipImprov.py:194:49:194:51 | ControlFlowNode for tar | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:193:6:193:31 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:194:49:194:51 | ControlFlowNode for tar | ControlFlowNode for tar | -| TarSlipImprov.py:211:5:211:7 | ControlFlowNode for tar | TarSlipImprov.py:210:6:210:43 | ControlFlowNode for Attribute() | TarSlipImprov.py:211:5:211:7 | ControlFlowNode for tar | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:210:6:210:43 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:211:5:211:7 | ControlFlowNode for tar | ControlFlowNode for tar | -| TarSlipImprov.py:236:44:236:50 | ControlFlowNode for members | TarSlipImprov.py:231:6:231:38 | ControlFlowNode for Attribute() | TarSlipImprov.py:236:44:236:50 | ControlFlowNode for members | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:231:6:231:38 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:236:44:236:50 | ControlFlowNode for members | ControlFlowNode for members | -| TarSlipImprov.py:254:1:254:31 | ControlFlowNode for Attribute() | TarSlipImprov.py:254:1:254:31 | ControlFlowNode for Attribute() | TarSlipImprov.py:254:1:254:31 | ControlFlowNode for Attribute() | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:254:1:254:31 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:254:1:254:31 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | -| TarSlipImprov.py:261:25:261:29 | ControlFlowNode for entry | TarSlipImprov.py:258:6:258:26 | ControlFlowNode for Attribute() | TarSlipImprov.py:261:25:261:29 | ControlFlowNode for entry | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:258:6:258:26 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:261:25:261:29 | ControlFlowNode for entry | ControlFlowNode for entry | -| TarSlipImprov.py:268:21:268:25 | ControlFlowNode for entry | TarSlipImprov.py:264:6:264:38 | ControlFlowNode for Attribute() | TarSlipImprov.py:268:21:268:25 | ControlFlowNode for entry | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:264:6:264:38 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:268:21:268:25 | ControlFlowNode for entry | ControlFlowNode for entry | -| TarSlipImprov.py:274:25:274:29 | ControlFlowNode for entry | TarSlipImprov.py:271:6:271:39 | ControlFlowNode for Attribute() | TarSlipImprov.py:274:25:274:29 | ControlFlowNode for entry | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:271:6:271:39 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:274:25:274:29 | ControlFlowNode for entry | ControlFlowNode for entry | -| TarSlipImprov.py:280:21:280:25 | ControlFlowNode for entry | TarSlipImprov.py:276:6:276:38 | ControlFlowNode for Attribute() | TarSlipImprov.py:280:21:280:25 | ControlFlowNode for entry | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:276:6:276:38 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:280:21:280:25 | ControlFlowNode for entry | ControlFlowNode for entry | -| TarSlipImprov.py:284:5:284:7 | ControlFlowNode for tar | TarSlipImprov.py:283:6:283:51 | ControlFlowNode for Attribute() | TarSlipImprov.py:284:5:284:7 | ControlFlowNode for tar | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:283:6:283:51 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:284:5:284:7 | ControlFlowNode for tar | ControlFlowNode for tar | -| TarSlipImprov.py:288:49:288:51 | ControlFlowNode for tar | TarSlipImprov.py:287:7:287:28 | ControlFlowNode for Attribute() | TarSlipImprov.py:288:49:288:51 | ControlFlowNode for tar | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:287:7:287:28 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:288:49:288:51 | ControlFlowNode for tar | ControlFlowNode for tar | -| TarSlipImprov.py:293:1:293:3 | ControlFlowNode for tar | TarSlipImprov.py:292:7:292:39 | ControlFlowNode for Attribute() | TarSlipImprov.py:293:1:293:3 | ControlFlowNode for tar | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:292:7:292:39 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:293:1:293:3 | ControlFlowNode for tar | ControlFlowNode for tar | -| TarSlipImprov.py:301:49:301:51 | ControlFlowNode for tar | TarSlipImprov.py:300:6:300:51 | ControlFlowNode for Attribute() | TarSlipImprov.py:301:49:301:51 | ControlFlowNode for tar | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:300:6:300:51 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:301:49:301:51 | ControlFlowNode for tar | ControlFlowNode for tar | -| TarSlipImprov.py:310:49:310:54 | ControlFlowNode for result | TarSlipImprov.py:304:7:304:39 | ControlFlowNode for Attribute() | TarSlipImprov.py:310:49:310:54 | ControlFlowNode for result | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:304:7:304:39 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:310:49:310:54 | ControlFlowNode for result | ControlFlowNode for result | -| TarSlipImprov.py:316:1:316:46 | ControlFlowNode for Attribute() | TarSlipImprov.py:316:1:316:46 | ControlFlowNode for Attribute() | TarSlipImprov.py:316:1:316:46 | ControlFlowNode for Attribute() | Extraction of tarfile from $@ to a potentially untrusted source $@. | TarSlipImprov.py:316:1:316:46 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | TarSlipImprov.py:316:1:316:46 | ControlFlowNode for Attribute() | ControlFlowNode for Attribute() | From 8859c131f24851227106f3d801f676ffc8243d6c Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Tue, 11 Aug 2026 10:28:13 +0200 Subject: [PATCH 0228/2098] Python: Update expected test output --- .../Security/CWE-022-TarSlip/TarSlip.expected | 14 -------------- .../CWE-022-UnsafeUnpacking/UnsafeUnpack.expected | 3 --- 2 files changed, 17 deletions(-) diff --git a/python/ql/test/experimental/query-tests/Security/CWE-022-TarSlip/TarSlip.expected b/python/ql/test/experimental/query-tests/Security/CWE-022-TarSlip/TarSlip.expected index 6cceacd031f6..646416650866 100644 --- a/python/ql/test/experimental/query-tests/Security/CWE-022-TarSlip/TarSlip.expected +++ b/python/ql/test/experimental/query-tests/Security/CWE-022-TarSlip/TarSlip.expected @@ -32,15 +32,11 @@ edges | TarSlipImprov.py:15:1:15:3 | ControlFlowNode for tar | TarSlipImprov.py:17:5:17:10 | ControlFlowNode for member | provenance | | | TarSlipImprov.py:15:7:15:39 | ControlFlowNode for Attribute() | TarSlipImprov.py:15:1:15:3 | ControlFlowNode for tar | provenance | | | TarSlipImprov.py:17:5:17:10 | ControlFlowNode for member | TarSlipImprov.py:20:19:20:24 | ControlFlowNode for member | provenance | | -| TarSlipImprov.py:20:5:20:10 | [post] ControlFlowNode for result | TarSlipImprov.py:22:35:22:40 | ControlFlowNode for result | provenance | | | TarSlipImprov.py:20:5:20:10 | [post] ControlFlowNode for result [List element] | TarSlipImprov.py:22:35:22:40 | ControlFlowNode for result | provenance | | -| TarSlipImprov.py:20:19:20:24 | ControlFlowNode for member | TarSlipImprov.py:20:5:20:10 | [post] ControlFlowNode for result | provenance | list.append | | TarSlipImprov.py:20:19:20:24 | ControlFlowNode for member | TarSlipImprov.py:20:5:20:10 | [post] ControlFlowNode for result [List element] | provenance | list.append | | TarSlipImprov.py:26:21:26:27 | ControlFlowNode for tarfile | TarSlipImprov.py:28:9:28:14 | ControlFlowNode for member | provenance | | | TarSlipImprov.py:28:9:28:14 | ControlFlowNode for member | TarSlipImprov.py:35:23:35:28 | ControlFlowNode for member | provenance | | -| TarSlipImprov.py:35:9:35:14 | [post] ControlFlowNode for result | TarSlipImprov.py:36:12:36:17 | ControlFlowNode for result | provenance | | | TarSlipImprov.py:35:9:35:14 | [post] ControlFlowNode for result [List element] | TarSlipImprov.py:36:12:36:17 | ControlFlowNode for result [List element] | provenance | | -| TarSlipImprov.py:35:23:35:28 | ControlFlowNode for member | TarSlipImprov.py:35:9:35:14 | [post] ControlFlowNode for result | provenance | list.append | | TarSlipImprov.py:35:23:35:28 | ControlFlowNode for member | TarSlipImprov.py:35:9:35:14 | [post] ControlFlowNode for result [List element] | provenance | list.append | | TarSlipImprov.py:38:1:38:3 | ControlFlowNode for tar | TarSlipImprov.py:39:65:39:67 | ControlFlowNode for tar | provenance | | | TarSlipImprov.py:38:7:38:39 | ControlFlowNode for Attribute() | TarSlipImprov.py:38:1:38:3 | ControlFlowNode for tar | provenance | | @@ -96,9 +92,7 @@ edges | TarSlipImprov.py:231:6:231:38 | ControlFlowNode for Attribute() | TarSlipImprov.py:231:43:231:52 | ControlFlowNode for corpus_tar | provenance | | | TarSlipImprov.py:231:43:231:52 | ControlFlowNode for corpus_tar | TarSlipImprov.py:233:9:233:9 | ControlFlowNode for f | provenance | | | TarSlipImprov.py:233:9:233:9 | ControlFlowNode for f | TarSlipImprov.py:235:28:235:28 | ControlFlowNode for f | provenance | | -| TarSlipImprov.py:235:13:235:19 | [post] ControlFlowNode for members | TarSlipImprov.py:236:44:236:50 | ControlFlowNode for members | provenance | | | TarSlipImprov.py:235:13:235:19 | [post] ControlFlowNode for members [List element] | TarSlipImprov.py:236:44:236:50 | ControlFlowNode for members | provenance | | -| TarSlipImprov.py:235:28:235:28 | ControlFlowNode for f | TarSlipImprov.py:235:13:235:19 | [post] ControlFlowNode for members | provenance | list.append | | TarSlipImprov.py:235:28:235:28 | ControlFlowNode for f | TarSlipImprov.py:235:13:235:19 | [post] ControlFlowNode for members [List element] | provenance | list.append | | TarSlipImprov.py:258:6:258:26 | ControlFlowNode for Attribute() | TarSlipImprov.py:258:31:258:33 | ControlFlowNode for tar | provenance | | | TarSlipImprov.py:258:31:258:33 | ControlFlowNode for tar | TarSlipImprov.py:259:9:259:13 | ControlFlowNode for entry | provenance | | @@ -123,24 +117,19 @@ edges | TarSlipImprov.py:304:1:304:3 | ControlFlowNode for tar | TarSlipImprov.py:306:5:306:10 | ControlFlowNode for member | provenance | | | TarSlipImprov.py:304:7:304:39 | ControlFlowNode for Attribute() | TarSlipImprov.py:304:1:304:3 | ControlFlowNode for tar | provenance | | | TarSlipImprov.py:306:5:306:10 | ControlFlowNode for member | TarSlipImprov.py:309:19:309:24 | ControlFlowNode for member | provenance | | -| TarSlipImprov.py:309:5:309:10 | [post] ControlFlowNode for result | TarSlipImprov.py:310:49:310:54 | ControlFlowNode for result | provenance | | | TarSlipImprov.py:309:5:309:10 | [post] ControlFlowNode for result [List element] | TarSlipImprov.py:310:49:310:54 | ControlFlowNode for result | provenance | | -| TarSlipImprov.py:309:19:309:24 | ControlFlowNode for member | TarSlipImprov.py:309:5:309:10 | [post] ControlFlowNode for result | provenance | list.append | | TarSlipImprov.py:309:19:309:24 | ControlFlowNode for member | TarSlipImprov.py:309:5:309:10 | [post] ControlFlowNode for result [List element] | provenance | list.append | nodes | TarSlipImprov.py:15:1:15:3 | ControlFlowNode for tar | semmle.label | ControlFlowNode for tar | | TarSlipImprov.py:15:7:15:39 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | TarSlipImprov.py:17:5:17:10 | ControlFlowNode for member | semmle.label | ControlFlowNode for member | -| TarSlipImprov.py:20:5:20:10 | [post] ControlFlowNode for result | semmle.label | [post] ControlFlowNode for result | | TarSlipImprov.py:20:5:20:10 | [post] ControlFlowNode for result [List element] | semmle.label | [post] ControlFlowNode for result [List element] | | TarSlipImprov.py:20:19:20:24 | ControlFlowNode for member | semmle.label | ControlFlowNode for member | | TarSlipImprov.py:22:35:22:40 | ControlFlowNode for result | semmle.label | ControlFlowNode for result | | TarSlipImprov.py:26:21:26:27 | ControlFlowNode for tarfile | semmle.label | ControlFlowNode for tarfile | | TarSlipImprov.py:28:9:28:14 | ControlFlowNode for member | semmle.label | ControlFlowNode for member | -| TarSlipImprov.py:35:9:35:14 | [post] ControlFlowNode for result | semmle.label | [post] ControlFlowNode for result | | TarSlipImprov.py:35:9:35:14 | [post] ControlFlowNode for result [List element] | semmle.label | [post] ControlFlowNode for result [List element] | | TarSlipImprov.py:35:23:35:28 | ControlFlowNode for member | semmle.label | ControlFlowNode for member | -| TarSlipImprov.py:36:12:36:17 | ControlFlowNode for result | semmle.label | ControlFlowNode for result | | TarSlipImprov.py:36:12:36:17 | ControlFlowNode for result [List element] | semmle.label | ControlFlowNode for result [List element] | | TarSlipImprov.py:38:1:38:3 | ControlFlowNode for tar | semmle.label | ControlFlowNode for tar | | TarSlipImprov.py:38:7:38:39 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | @@ -209,7 +198,6 @@ nodes | TarSlipImprov.py:231:6:231:38 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | TarSlipImprov.py:231:43:231:52 | ControlFlowNode for corpus_tar | semmle.label | ControlFlowNode for corpus_tar | | TarSlipImprov.py:233:9:233:9 | ControlFlowNode for f | semmle.label | ControlFlowNode for f | -| TarSlipImprov.py:235:13:235:19 | [post] ControlFlowNode for members | semmle.label | [post] ControlFlowNode for members | | TarSlipImprov.py:235:13:235:19 | [post] ControlFlowNode for members [List element] | semmle.label | [post] ControlFlowNode for members [List element] | | TarSlipImprov.py:235:28:235:28 | ControlFlowNode for f | semmle.label | ControlFlowNode for f | | TarSlipImprov.py:236:44:236:50 | ControlFlowNode for members | semmle.label | ControlFlowNode for members | @@ -245,11 +233,9 @@ nodes | TarSlipImprov.py:304:1:304:3 | ControlFlowNode for tar | semmle.label | ControlFlowNode for tar | | TarSlipImprov.py:304:7:304:39 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | TarSlipImprov.py:306:5:306:10 | ControlFlowNode for member | semmle.label | ControlFlowNode for member | -| TarSlipImprov.py:309:5:309:10 | [post] ControlFlowNode for result | semmle.label | [post] ControlFlowNode for result | | TarSlipImprov.py:309:5:309:10 | [post] ControlFlowNode for result [List element] | semmle.label | [post] ControlFlowNode for result [List element] | | TarSlipImprov.py:309:19:309:24 | ControlFlowNode for member | semmle.label | ControlFlowNode for member | | TarSlipImprov.py:310:49:310:54 | ControlFlowNode for result | semmle.label | ControlFlowNode for result | | TarSlipImprov.py:316:1:316:46 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | subpaths -| TarSlipImprov.py:39:65:39:67 | ControlFlowNode for tar | TarSlipImprov.py:26:21:26:27 | ControlFlowNode for tarfile | TarSlipImprov.py:36:12:36:17 | ControlFlowNode for result | TarSlipImprov.py:39:49:39:68 | ControlFlowNode for members_filter1() | | TarSlipImprov.py:39:65:39:67 | ControlFlowNode for tar | TarSlipImprov.py:26:21:26:27 | ControlFlowNode for tarfile | TarSlipImprov.py:36:12:36:17 | ControlFlowNode for result [List element] | TarSlipImprov.py:39:49:39:68 | ControlFlowNode for members_filter1() | diff --git a/python/ql/test/experimental/query-tests/Security/CWE-022-UnsafeUnpacking/UnsafeUnpack.expected b/python/ql/test/experimental/query-tests/Security/CWE-022-UnsafeUnpacking/UnsafeUnpack.expected index ccc2daba50bf..17cc83ec5329 100644 --- a/python/ql/test/experimental/query-tests/Security/CWE-022-UnsafeUnpacking/UnsafeUnpack.expected +++ b/python/ql/test/experimental/query-tests/Security/CWE-022-UnsafeUnpacking/UnsafeUnpack.expected @@ -92,9 +92,7 @@ edges | UnsafeUnpack.py:161:38:161:45 | ControlFlowNode for savepath | UnsafeUnpack.py:161:25:161:46 | ControlFlowNode for Attribute() | provenance | MaD:1 | | UnsafeUnpack.py:163:23:163:28 | ControlFlowNode for member | UnsafeUnpack.py:166:37:166:42 | ControlFlowNode for member | provenance | | | UnsafeUnpack.py:163:33:163:35 | ControlFlowNode for tar | UnsafeUnpack.py:163:23:163:28 | ControlFlowNode for member | provenance | | -| UnsafeUnpack.py:166:23:166:28 | [post] ControlFlowNode for result | UnsafeUnpack.py:167:67:167:72 | ControlFlowNode for result | provenance | | | UnsafeUnpack.py:166:23:166:28 | [post] ControlFlowNode for result [List element] | UnsafeUnpack.py:167:67:167:72 | ControlFlowNode for result | provenance | | -| UnsafeUnpack.py:166:37:166:42 | ControlFlowNode for member | UnsafeUnpack.py:166:23:166:28 | [post] ControlFlowNode for result | provenance | list.append | | UnsafeUnpack.py:166:37:166:42 | ControlFlowNode for member | UnsafeUnpack.py:166:23:166:28 | [post] ControlFlowNode for result [List element] | provenance | list.append | | UnsafeUnpack.py:171:1:171:8 | ControlFlowNode for response | UnsafeUnpack.py:174:15:174:22 | ControlFlowNode for response | provenance | | | UnsafeUnpack.py:171:12:171:50 | ControlFlowNode for Attribute() | UnsafeUnpack.py:171:1:171:8 | ControlFlowNode for response | provenance | | @@ -190,7 +188,6 @@ nodes | UnsafeUnpack.py:161:38:161:45 | ControlFlowNode for savepath | semmle.label | ControlFlowNode for savepath | | UnsafeUnpack.py:163:23:163:28 | ControlFlowNode for member | semmle.label | ControlFlowNode for member | | UnsafeUnpack.py:163:33:163:35 | ControlFlowNode for tar | semmle.label | ControlFlowNode for tar | -| UnsafeUnpack.py:166:23:166:28 | [post] ControlFlowNode for result | semmle.label | [post] ControlFlowNode for result | | UnsafeUnpack.py:166:23:166:28 | [post] ControlFlowNode for result [List element] | semmle.label | [post] ControlFlowNode for result [List element] | | UnsafeUnpack.py:166:37:166:42 | ControlFlowNode for member | semmle.label | ControlFlowNode for member | | UnsafeUnpack.py:167:67:167:72 | ControlFlowNode for result | semmle.label | ControlFlowNode for result | From a4515561a7ff6e781ab3e74158d1561cd2afb757 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Tue, 11 Aug 2026 10:28:34 +0200 Subject: [PATCH 0229/2098] Revert "Ruby: Accept test improvement." This reverts commit a2b6c1f76ab2f1f0432b767a6dee3f39d8bc8eaf. --- .../IncompleteHostnameRegExp/IncompleteHostnameRegExp.expected | 1 - .../IncompleteHostnameRegExp/tst-IncompleteHostnameRegExp.rb | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/ruby/ql/test/query-tests/security/cwe-020/IncompleteHostnameRegExp/IncompleteHostnameRegExp.expected b/ruby/ql/test/query-tests/security/cwe-020/IncompleteHostnameRegExp/IncompleteHostnameRegExp.expected index 00f8d91f99d3..097f43c33e70 100644 --- a/ruby/ql/test/query-tests/security/cwe-020/IncompleteHostnameRegExp/IncompleteHostnameRegExp.expected +++ b/ruby/ql/test/query-tests/security/cwe-020/IncompleteHostnameRegExp/IncompleteHostnameRegExp.expected @@ -16,7 +16,6 @@ | tst-IncompleteHostnameRegExp.rb:20:14:20:31 | ^test.example.com$ | This regular expression has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.rb:20:13:20:26 | "#{...}$" | here | | tst-IncompleteHostnameRegExp.rb:22:24:22:40 | test.example.com$ | This string, which is used as a regular expression $@, has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.rb:23:13:23:29 | ...[...] | here | | tst-IncompleteHostnameRegExp.rb:28:24:28:40 | test.example.com$ | This string, which is used as a regular expression $@, has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.rb:63:20:63:36 | ...[...] | here | -| tst-IncompleteHostnameRegExp.rb:30:27:30:43 | test.example.com$ | This string, which is used as a regular expression $@, has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.rb:66:20:66:36 | ...[...] | here | | tst-IncompleteHostnameRegExp.rb:37:3:37:53 | ^(https?:)?\\/\\/((service\|www).)?example.com(?=$\|\\/) | This regular expression has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.rb:37:2:37:54 | /^(https?:)?\\/\\/((service\|www).../ | here | | tst-IncompleteHostnameRegExp.rb:38:3:38:43 | ^(http\|https):\\/\\/www.example.com\\/p\\/f\\/ | This regular expression has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.rb:38:2:38:44 | /^(http\|https):\\/\\/www.example.../ | here | | tst-IncompleteHostnameRegExp.rb:39:5:39:30 | http:\\/\\/sub.example.com\\/ | This regular expression has an unescaped '.' before 'example.com', so it might match more hosts than expected. | tst-IncompleteHostnameRegExp.rb:39:2:39:33 | /^(http:\\/\\/sub.example.com\\/)/ | here | diff --git a/ruby/ql/test/query-tests/security/cwe-020/IncompleteHostnameRegExp/tst-IncompleteHostnameRegExp.rb b/ruby/ql/test/query-tests/security/cwe-020/IncompleteHostnameRegExp/tst-IncompleteHostnameRegExp.rb index 20c7522ba1cf..50e2e257dcec 100644 --- a/ruby/ql/test/query-tests/security/cwe-020/IncompleteHostnameRegExp/tst-IncompleteHostnameRegExp.rb +++ b/ruby/ql/test/query-tests/security/cwe-020/IncompleteHostnameRegExp/tst-IncompleteHostnameRegExp.rb @@ -27,7 +27,7 @@ def foo convert1({ hostname: 'test.example.com$' }); # $ Alert // NOT OK - domains = [ { hostname: 'test.example.com$' } ]; # $ Alert // NOT OK + domains = [ { hostname: 'test.example.com$' } ]; # $ MISSING: Alert # NOT OK - but not flagged due to limitations of TypeTracking. From 122101c9b29d6c8b524228100c316039331774e1 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Mon, 10 Aug 2026 10:21:48 +0200 Subject: [PATCH 0230/2098] Shared: Support empty try-body in CFG. --- shared/controlflow/codeql/controlflow/ControlFlowGraph.qll | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll index 920da5dd04ef..d41ad05daa34 100644 --- a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll +++ b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll @@ -1737,6 +1737,10 @@ module Make0 Ast> { not exists(trystmt.getFinally()) and beforeFinally.isAfter(trystmt) ) | + not exists(trystmt.getBody(_)) and + n1.isBefore(trystmt) and + n2 = beforeElse + or exists(int i | n1.isAfter(trystmt.getBody(i)) and not exists(trystmt.getBody(i + 1)) and From 5ffb8ec85818c819645e398ba02136e632185789 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Mon, 10 Aug 2026 12:43:08 +0200 Subject: [PATCH 0231/2098] Shared: Support exceptions in parameter defaults. --- .../controlflow/codeql/controlflow/ControlFlowGraph.qll | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll index d41ad05daa34..042aa29fc421 100644 --- a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll +++ b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll @@ -1269,6 +1269,10 @@ module Make0 Ast> { result = block.(Switch).getStmt(_) } + private predicate callableHasParamDefault(Callable c, Expr defaultValue) { + exists(Parameter p | p.getDefaultValue() = defaultValue and c = getEnclosingCallable(p)) + } + /** * Holds if an abrupt completion `c` from within `ast` is caught with * flow continuing at `n`. @@ -1276,7 +1280,9 @@ module Make0 Ast> { private predicate endAbruptCompletion(AstNode ast, PreControlFlowNode n, AbruptCompletion c) { Input2::endAbruptCompletion(ast, n, c) or - exists(Callable callable | callableHasBodyPart(callable, ast) | + exists(Callable callable | + callableHasBodyPart(callable, ast) or callableHasParamDefault(callable, ast) + | c.getSuccessorType() instanceof ReturnSuccessor and n.(NormalExitNodeImpl).getEnclosingCallable() = callable or From 6846a3721721553fab00a520d3deca3e77dfeeea Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Tue, 11 Aug 2026 11:17:55 +0200 Subject: [PATCH 0232/2098] Python: Update expected test output --- .../ql/test/library-tests/dataflow/regression/dataflow.expected | 1 + python/ql/test/library-tests/dataflow/regression/test.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/python/ql/test/library-tests/dataflow/regression/dataflow.expected b/python/ql/test/library-tests/dataflow/regression/dataflow.expected index c8ffed514463..ea2d5a93bdfe 100644 --- a/python/ql/test/library-tests/dataflow/regression/dataflow.expected +++ b/python/ql/test/library-tests/dataflow/regression/dataflow.expected @@ -15,6 +15,7 @@ | test.py:128:13:128:18 | ControlFlowNode for SOURCE | test.py:132:14:132:14 | ControlFlowNode for t | | test.py:159:10:159:15 | ControlFlowNode for SOURCE | test.py:160:14:160:14 | ControlFlowNode for t | | test.py:163:9:163:14 | ControlFlowNode for SOURCE | test.py:165:12:165:12 | ControlFlowNode for s | +| test.py:168:10:168:15 | ControlFlowNode for SOURCE | test.py:172:10:172:13 | ControlFlowNode for Subscript | | test.py:178:9:178:14 | ControlFlowNode for SOURCE | test.py:180:14:180:14 | ControlFlowNode for t | | test.py:178:9:178:14 | ControlFlowNode for SOURCE | test.py:182:16:182:16 | ControlFlowNode for t | | test.py:178:9:178:14 | ControlFlowNode for SOURCE | test.py:184:16:184:16 | ControlFlowNode for t | diff --git a/python/ql/test/library-tests/dataflow/regression/test.py b/python/ql/test/library-tests/dataflow/regression/test.py index 869993a5b643..de08437c3f2f 100644 --- a/python/ql/test/library-tests/dataflow/regression/test.py +++ b/python/ql/test/library-tests/dataflow/regression/test.py @@ -169,7 +169,7 @@ def test_update_extend(x, y): d = {"key" : SOURCE} x.extend(l) y.update(d) - SINK(x[0]) # Flow not found + SINK(x[0]) SINK(y["key"]) # Flow not found l2 = list(l) d2 = dict(d) From 9d02ff7ed952ce3621ac7c26abfcf5ce98431e91 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Tue, 11 Aug 2026 13:05:02 +0200 Subject: [PATCH 0233/2098] C#: Update extractor package dependencies. --- csharp/paket.lock | 105 +++++++++++++++++++++--------------------- csharp/paket.main.bzl | 60 ++++++++++++------------ 2 files changed, 82 insertions(+), 83 deletions(-) diff --git a/csharp/paket.lock b/csharp/paket.lock index f76a8afa7eb4..332e75f89a6e 100644 --- a/csharp/paket.lock +++ b/csharp/paket.lock @@ -12,27 +12,27 @@ NUGET Microsoft.Extensions.ObjectPool (>= 10.0.7) MSBuild.StructuredLogger (>= 2.3.178) Humanizer.Core (3.0.10) - MessagePack (3.1.6) - MessagePack.Annotations (>= 3.1.6) - MessagePackAnalyzer (>= 3.1.6) + MessagePack (3.1.8) + MessagePack.Annotations (>= 3.1.8) + MessagePackAnalyzer (>= 3.1.8) Microsoft.NET.StringTools (>= 17.11.4) - MessagePack.Annotations (3.1.6) - MessagePackAnalyzer (3.1.6) - Microsoft.Bcl.AsyncInterfaces (10.0.8) - Microsoft.Bcl.Memory (10.0.8) + MessagePack.Annotations (3.1.8) + MessagePackAnalyzer (3.1.8) + Microsoft.Bcl.AsyncInterfaces (10.0.10) + Microsoft.Bcl.Memory (10.0.10) Microsoft.Build (18.6.3) Microsoft.Build.Framework (>= 18.6.3) System.Configuration.ConfigurationManager (>= 10.0.3) System.Diagnostics.EventLog (>= 10.0.3) System.Reflection.MetadataLoadContext (>= 10.0.3) System.Security.Cryptography.ProtectedData (>= 10.0.3) - Microsoft.Build.Framework (18.6.3) - Microsoft.NET.StringTools (>= 18.6.3) - Microsoft.Build.Utilities.Core (18.6.3) - Microsoft.Build.Framework (>= 18.6.3) - System.Configuration.ConfigurationManager (>= 10.0.3) - System.Diagnostics.EventLog (>= 10.0.3) - System.Security.Cryptography.ProtectedData (>= 10.0.3) + Microsoft.Build.Framework (18.8.2) + Microsoft.NET.StringTools (>= 18.8.2) + Microsoft.Build.Utilities.Core (18.8.2) + Microsoft.Build.Framework (>= 18.8.2) + System.Configuration.ConfigurationManager (>= 10.0.4) + System.Diagnostics.EventLog (>= 10.0.4) + System.Security.Cryptography.ProtectedData (>= 10.0.4) Microsoft.CodeAnalysis (5.3) Humanizer.Core (>= 2.14.1) Microsoft.Bcl.AsyncInterfaces (>= 9.0) @@ -50,7 +50,7 @@ NUGET System.Text.Encoding.CodePages (>= 8.0) System.Threading.Channels (>= 8.0) System.Threading.Tasks.Extensions (>= 4.6) - Microsoft.CodeAnalysis.Analyzers (5.3) + Microsoft.CodeAnalysis.Analyzers (5.6) Microsoft.CodeAnalysis.Common (5.3) Microsoft.CodeAnalysis.Analyzers (>= 5.3.0-2.25625.1) Microsoft.CodeAnalysis.CSharp (5.3) @@ -78,55 +78,54 @@ NUGET Microsoft.CodeAnalysis.Analyzers (>= 5.3.0-2.25625.1) Microsoft.CodeAnalysis.Common (5.3) System.Composition (>= 9.0) - Microsoft.CodeCoverage (18.5.1) - Microsoft.Extensions.ObjectPool (10.0.8) - Microsoft.NET.StringTools (18.6.3) - Microsoft.NET.Test.Sdk (18.5.1) - Microsoft.CodeCoverage (>= 18.5.1) - Microsoft.TestPlatform.TestHost (>= 18.5.1) - Microsoft.TestPlatform.ObjectModel (18.5.1) + Microsoft.CodeCoverage (18.8.1) + Microsoft.Extensions.ObjectPool (10.0.10) + Microsoft.NET.StringTools (18.8.2) + Microsoft.NET.Test.Sdk (18.8.1) + Microsoft.CodeCoverage (>= 18.8.1) + Microsoft.TestPlatform.TestHost (>= 18.8.1) + Microsoft.TestPlatform.ObjectModel (18.8.1) System.Reflection.Metadata (>= 8.0) - Microsoft.TestPlatform.TestHost (18.5.1) - Microsoft.TestPlatform.ObjectModel (>= 18.5.1) - Newtonsoft.Json (>= 13.0.3) + Microsoft.TestPlatform.TestHost (18.8.1) + Microsoft.TestPlatform.ObjectModel (>= 18.8.1) Microsoft.VisualStudio.SolutionPersistence (1.0.52) Mono.Posix.NETStandard (1.0) - MSBuild.StructuredLogger (2.3.204) + MSBuild.StructuredLogger (2.3.213) Microsoft.Build.Framework (>= 17.5) Microsoft.Build.Utilities.Core (>= 17.5) Newtonsoft.Json (13.0.4) NuGet.Versioning (7.6) System.Buffers (4.6.1) - System.Collections.Immutable (10.0.8) - System.Composition (10.0.8) - System.Composition.AttributedModel (>= 10.0.8) - System.Composition.Convention (>= 10.0.8) - System.Composition.Hosting (>= 10.0.8) - System.Composition.Runtime (>= 10.0.8) - System.Composition.TypedParts (>= 10.0.8) - System.Composition.AttributedModel (10.0.8) - System.Composition.Convention (10.0.8) - System.Composition.AttributedModel (>= 10.0.8) - System.Composition.Hosting (10.0.8) - System.Composition.Runtime (>= 10.0.8) - System.Composition.Runtime (10.0.8) - System.Composition.TypedParts (10.0.8) - System.Composition.AttributedModel (>= 10.0.8) - System.Composition.Hosting (>= 10.0.8) - System.Composition.Runtime (>= 10.0.8) - System.Configuration.ConfigurationManager (10.0.8) - System.Diagnostics.EventLog (>= 10.0.8) - System.Security.Cryptography.ProtectedData (>= 10.0.8) - System.Diagnostics.EventLog (10.0.8) - System.IO.Pipelines (10.0.8) + System.Collections.Immutable (10.0.10) + System.Composition (10.0.10) + System.Composition.AttributedModel (>= 10.0.10) + System.Composition.Convention (>= 10.0.10) + System.Composition.Hosting (>= 10.0.10) + System.Composition.Runtime (>= 10.0.10) + System.Composition.TypedParts (>= 10.0.10) + System.Composition.AttributedModel (10.0.10) + System.Composition.Convention (10.0.10) + System.Composition.AttributedModel (>= 10.0.10) + System.Composition.Hosting (10.0.10) + System.Composition.Runtime (>= 10.0.10) + System.Composition.Runtime (10.0.10) + System.Composition.TypedParts (10.0.10) + System.Composition.AttributedModel (>= 10.0.10) + System.Composition.Hosting (>= 10.0.10) + System.Composition.Runtime (>= 10.0.10) + System.Configuration.ConfigurationManager (10.0.10) + System.Diagnostics.EventLog (>= 10.0.10) + System.Security.Cryptography.ProtectedData (>= 10.0.10) + System.Diagnostics.EventLog (10.0.10) + System.IO.Pipelines (10.0.10) System.Memory (4.6.3) System.Numerics.Vectors (4.6.1) - System.Reflection.Metadata (10.0.8) - System.Reflection.MetadataLoadContext (10.0.8) + System.Reflection.Metadata (10.0.10) + System.Reflection.MetadataLoadContext (10.0.10) System.Runtime.CompilerServices.Unsafe (6.1.2) - System.Security.Cryptography.ProtectedData (10.0.8) - System.Text.Encoding.CodePages (10.0.8) - System.Threading.Channels (10.0.8) + System.Security.Cryptography.ProtectedData (10.0.10) + System.Text.Encoding.CodePages (10.0.10) + System.Threading.Channels (10.0.10) System.Threading.Tasks.Extensions (4.6.3) xunit (2.9.3) xunit.analyzers (>= 1.18) diff --git a/csharp/paket.main.bzl b/csharp/paket.main.bzl index 0c1b13334243..d153b5f69d36 100644 --- a/csharp/paket.main.bzl +++ b/csharp/paket.main.bzl @@ -9,52 +9,52 @@ def main(): packages = [ {"name": "Basic.CompilerLog.Util", "id": "Basic.CompilerLog.Util", "version": "0.9.39", "sha512": "sha512-/Kqh12aedOvhOPuFDk/yE8HauuxXFuzB8Qt+NxEUopKnxyXtV0uPIVgBU3mLNC1Dj2E5Yhcz1rtECwnu4Tv1eg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "net462": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "net47": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "net471": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "net472": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "net48": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "net5.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "net6.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "net7.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "net8.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "net9.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "netcoreapp2.1": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "netcoreapp2.2": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "netcoreapp3.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "netcoreapp3.1": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"], "netstandard2.1": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.Bcl.Memory", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool", "System.Buffers"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "Humanizer.Core", "id": "Humanizer.Core", "version": "3.0.10", "sha512": "sha512-86jRQVvMLU7xxsdHrK87TSqu5kL0lg4EiRjvTBglkrtLw242dMON4vTrFbGKr2CRjqbThBuIpodF2MWbCFKZYA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Collections.Immutable", "System.Memory"], "net462": ["System.Collections.Immutable", "System.Memory"], "net47": ["System.Collections.Immutable", "System.Memory"], "net471": ["System.Collections.Immutable", "System.Memory"], "net472": ["System.Collections.Immutable", "System.Memory"], "net48": ["System.Collections.Immutable", "System.Memory"], "net5.0": ["System.Collections.Immutable", "System.Memory"], "net6.0": ["System.Collections.Immutable", "System.Memory"], "net7.0": ["System.Collections.Immutable", "System.Memory"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Collections.Immutable", "System.Memory"], "netcoreapp2.1": ["System.Collections.Immutable", "System.Memory"], "netcoreapp2.2": ["System.Collections.Immutable", "System.Memory"], "netcoreapp3.0": ["System.Collections.Immutable", "System.Memory"], "netcoreapp3.1": ["System.Collections.Immutable", "System.Memory"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Collections.Immutable", "System.Memory"], "netstandard2.1": ["System.Collections.Immutable", "System.Memory"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "MessagePack", "id": "MessagePack", "version": "3.1.6", "sha512": "sha512-vkEho7kN4kxlkd238214A0/FGz6DB1Dalexql8CtUpsbtr0DhKmhBLsmZlqc9H6rRiRvG2VJyt+UqUmQxZoqyw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net48": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net5.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"], "net6.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"], "net7.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"], "net8.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools"], "net9.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"], "netcoreapp3.1": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "MessagePack.Annotations", "id": "MessagePack.Annotations", "version": "3.1.6", "sha512": "sha512-7uF/iFA6NSB5Eo0HijkyEAHPURQC2ESmzoqNFd2bVqu2opQnuvutGYvcZKV91FXQ6YMDhzYvYbIlSTJ/Jru5+Q==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "MessagePackAnalyzer", "id": "MessagePackAnalyzer", "version": "3.1.6", "sha512": "sha512-eLmNdEFDwLjBiv3/rv/mBtIu18pu9eujlZ8pb0EsbnMzuNyNUp3GJ0WLL0h4qYRW5N41f8zN1N627h/kChe3oA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "Microsoft.Bcl.AsyncInterfaces", "id": "Microsoft.Bcl.AsyncInterfaces", "version": "10.0.8", "sha512": "sha512-FzE/KnOmwCmg2KMPjuyevkS5fAzNt2DBLSJs3HsJ+I/CoBSW6i0mighH6ryZ8JHQhNLxMK04X7J8BTt0kEG5/g==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Threading.Tasks.Extensions"], "net462": ["System.Threading.Tasks.Extensions"], "net47": ["System.Threading.Tasks.Extensions"], "net471": ["System.Threading.Tasks.Extensions"], "net472": ["System.Threading.Tasks.Extensions"], "net48": ["System.Threading.Tasks.Extensions"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["System.Threading.Tasks.Extensions"], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Threading.Tasks.Extensions"], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "Microsoft.Bcl.Memory", "id": "Microsoft.Bcl.Memory", "version": "10.0.8", "sha512": "sha512-Gd9LaF0vnR5noQP7/LPjSKvXw22b51ejGGs/HJHbzNbMOzT1KqGzW2329gP8DKKMj5iYACBKISwl6nDr32WFWA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["System.Runtime.CompilerServices.Unsafe"], "net6.0": ["System.Runtime.CompilerServices.Unsafe"], "net7.0": ["System.Runtime.CompilerServices.Unsafe"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "MessagePack", "id": "MessagePack", "version": "3.1.8", "sha512": "sha512-9s6k8RHuot/t6hcvQqYpLCpFY4NY52MApniE+eZsydkhoyvJQL/X1SxUR8Wrurms6xDtj+ZRHGlyfLfBZ9ni7Q==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net48": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net5.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"], "net6.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"], "net7.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"], "net8.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools"], "net9.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"], "netcoreapp3.1": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Threading.Tasks.Extensions", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["MessagePackAnalyzer", "MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "MessagePack.Annotations", "id": "MessagePack.Annotations", "version": "3.1.8", "sha512": "sha512-ONyOl+mddCHFvZwsicJ2ubaK7a1O/wBo4KX178TsbLSW57m+P7WNPf8ZhXyCVCJuc/nqGBvuigeb0SP8Hzqssg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "MessagePackAnalyzer", "id": "MessagePackAnalyzer", "version": "3.1.8", "sha512": "sha512-K//7kxEU35BqDkb6obsEKJreQyaN+56tnjddUHvMz9X+nNuurULHihWRjnCt8DsXEgRfFPwn7WYjtOOXSyYxzQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.Bcl.AsyncInterfaces", "id": "Microsoft.Bcl.AsyncInterfaces", "version": "10.0.10", "sha512": "sha512-8Mx8TUFWoK2gH35Cyr0ndO2l9j4XJzo1wsC6ufVD2nlFsVe5NXmbM+vEOILLhdANZKEgN+U8hkPrT1YQsSSBSA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Threading.Tasks.Extensions"], "net462": ["System.Threading.Tasks.Extensions"], "net47": ["System.Threading.Tasks.Extensions"], "net471": ["System.Threading.Tasks.Extensions"], "net472": ["System.Threading.Tasks.Extensions"], "net48": ["System.Threading.Tasks.Extensions"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["System.Threading.Tasks.Extensions"], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Threading.Tasks.Extensions"], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.Bcl.Memory", "id": "Microsoft.Bcl.Memory", "version": "10.0.10", "sha512": "sha512-dY04r7+oqm5RWWQ5Ncw2BZfz5lWuEmamdZX+sh7ujYPeu6MTTNElaDtW/5JAUF70TMVCZd6tELRFbx10BVvmXw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["System.Runtime.CompilerServices.Unsafe"], "net6.0": ["System.Runtime.CompilerServices.Unsafe"], "net7.0": ["System.Runtime.CompilerServices.Unsafe"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "Microsoft.Build", "id": "Microsoft.Build", "version": "18.6.3", "sha512": "sha512-KC9xCNrucJlKrA0KFXiYUHZI74kNBOaZ/BLHSCm06fS7aoHnlAlRZizti+i4V0AsaJlaIBjtN/Cf6LkcmENi4w==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.Build.Framework", "System.Configuration.ConfigurationManager", "System.Reflection.MetadataLoadContext", "System.Diagnostics.EventLog", "System.Security.Cryptography.ProtectedData"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": ["Microsoft.Build.Framework", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Memory", "System.Reflection.MetadataLoadContext", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.Build.Framework", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Memory", "System.Reflection.MetadataLoadContext", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "Microsoft.Build.Framework", "id": "Microsoft.Build.Framework", "version": "18.6.3", "sha512": "sha512-p11xRx05A+bU2oUIsKKuAEOEPyroo2ygUwQVDLAGV3ZkNtHBsQs9RojvRqr+wiql7KPUXv0qbwKcACUpsbbmcA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.NET.StringTools"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe", "System.Memory", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe", "System.Memory", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net8.0": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net9.0": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "Microsoft.Build.Utilities.Core", "id": "Microsoft.Build.Utilities.Core", "version": "18.6.3", "sha512": "sha512-uB3c5znytjARTsycmhOfnTavdGTYalYWcCtb6RAFqHcXv2y8JxGsdgQQ39n9IqXpt9JyxPSWz2uVuztuG/Oplw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.Build.Framework", "System.Configuration.ConfigurationManager", "System.Diagnostics.EventLog", "System.Security.Cryptography.ProtectedData"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["Microsoft.Build.Framework", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.Build.Framework", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net8.0": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net9.0": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.Build.Framework", "id": "Microsoft.Build.Framework", "version": "18.8.2", "sha512": "sha512-a7GqCWuBTxqVme+L8u5QXSrifzmWEGQuih3E3tOYB/TH+CLKg6iZhOx0jBz8Wc1f2qMnPr3jzJcan0vPI0zBcQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.NET.StringTools"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe", "System.Memory", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe", "System.Memory", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net8.0": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net9.0": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["Microsoft.NET.StringTools", "System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.Build.Utilities.Core", "id": "Microsoft.Build.Utilities.Core", "version": "18.8.2", "sha512": "sha512-o6aoVgjtD37nmsQ1B3IhB9yjBOhFur7EH+CNsIUnBwQUBBLM4qN4Xv11nA5X84GLoxw8SGW0MY6+r04Mhqvfxg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.Build.Framework", "System.Configuration.ConfigurationManager", "System.Diagnostics.EventLog", "System.Security.Cryptography.ProtectedData"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["Microsoft.Build.Framework", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.Build.Framework", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Memory", "System.Runtime.CompilerServices.Unsafe", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net8.0": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net9.0": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["Microsoft.Build.Framework", "System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "Microsoft.CodeAnalysis", "id": "Microsoft.CodeAnalysis", "version": "5.3.0", "sha512": "sha512-gCuN2a/33HYRrRg4P2LvbgSsUaGP/FSHTaz6FapSaEATYnbXBoiR9Nk/ItHAknc6IQPtodkUYKvX78MkBdoOSg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net6.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net7.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net8.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net9.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.CodeAnalysis.CSharp.Workspaces", "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "Microsoft.CodeAnalysis.Analyzers", "id": "Microsoft.CodeAnalysis.Analyzers", "version": "5.3.0", "sha512": "sha512-v9jPlSs/fE7AU2/eZOw5EUzq0JOaWgP+2gghwIP2XbbTv56PZZZsy1QgEiMa3jjO8hR8SN1+NJvG1xxHL2FDgw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.CodeAnalysis.Analyzers", "id": "Microsoft.CodeAnalysis.Analyzers", "version": "5.6.0", "sha512": "sha512-in3YRkkpGhfekPD9j9G04qzdOoWBjaiGYrl6xy0+8Xp0N3Q1+Du5wkx/THhOTIvqk6Oy1d8RTIQnA8/qFapDNQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "Microsoft.CodeAnalysis.Common", "id": "Microsoft.CodeAnalysis.Common", "version": "5.3.0", "sha512": "sha512-lt42ETYkJrzJrf99jQ9n7xnanR/ETh92o6LX03kTjQKfKFrJGm5/+4OQJyIz8Kj4/ClbeZ3kvxytsyds4jQ5Tg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.CodeAnalysis.Analyzers"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net462": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net47": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net471": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net472": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net48": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net5.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net6.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net7.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "net8.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Reflection.Metadata"], "net9.0": ["Microsoft.CodeAnalysis.Analyzers"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"], "netstandard2.1": ["Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Memory", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions", "System.Buffers", "System.Numerics.Vectors"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "Microsoft.CodeAnalysis.CSharp", "id": "Microsoft.CodeAnalysis.CSharp", "version": "5.3.0", "sha512": "sha512-TD8ulDx0+qjf3oi5gcToiNaxVGzn0rsPN0hCQOq+skYGgugKGLVl8obs0KxrxAOx2xkjySbOcEBumgJ0uhzzgA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net6.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net7.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net8.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Reflection.Metadata"], "net9.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "Microsoft.CodeAnalysis.CSharp.Workspaces", "id": "Microsoft.CodeAnalysis.CSharp.Workspaces", "version": "5.3.0", "sha512": "sha512-XwemsUpvFZ8zLvu9QxRdgh4rgoI1WypKHn9D4zrvN5V3p+CSJKmFBS1w09DuBSLe+DIITIu7JQmzmDsHXZow1g==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.CodeAnalysis.Analyzers", "System.Composition"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net6.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net7.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net8.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Reflection.Metadata"], "net9.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.CodeAnalysis.Analyzers", "System.Composition"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "Microsoft.CodeAnalysis.VisualBasic", "id": "Microsoft.CodeAnalysis.VisualBasic", "version": "5.3.0", "sha512": "sha512-0zqIJspSNg8iBDho82FwYt4ajoBRzMEtzdIPs5KBeisxNIBMpZh8CXJED8RY32HCsIOA5tx870xpgPsXOysMqA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net6.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net7.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net8.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Reflection.Metadata"], "net9.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "id": "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "version": "5.3.0", "sha512": "sha512-FhpamkHtKiOd/2wlQ4l9K+NQLfAtBniWj2TWjgHp5rY+PNDRsOZpiTVBdrlwRTIR2oe6lz6cKYTxwBKVrPjOzQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.CodeAnalysis.Analyzers", "System.Composition"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net6.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net7.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "net8.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Reflection.Metadata"], "net9.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.CodeAnalysis.Analyzers", "System.Composition"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Composition", "System.IO.Pipelines", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Channels", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "Microsoft.CodeAnalysis.Workspaces.Common", "id": "Microsoft.CodeAnalysis.Workspaces.Common", "version": "5.3.0", "sha512": "sha512-pPJy45QDPFZNUpmgJz7fKL6Tte+CZ7NRw8GyluMBGLRAcwrZNMpWOKkV81MGnkCYOs8UA1b510MrQpevf0iQWw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "Microsoft.CodeAnalysis.Analyzers"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net5.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net6.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net7.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "net8.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "System.IO.Pipelines", "Microsoft.CodeAnalysis.Analyzers", "System.Collections.Immutable", "System.Reflection.Metadata"], "net9.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "Microsoft.CodeAnalysis.Analyzers"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "Microsoft.Bcl.AsyncInterfaces", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels", "Microsoft.CodeAnalysis.Analyzers", "System.Buffers", "System.Collections.Immutable", "System.Memory", "System.Numerics.Vectors", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe", "System.Text.Encoding.CodePages", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "Microsoft.CodeCoverage", "id": "Microsoft.CodeCoverage", "version": "18.5.1", "sha512": "sha512-BjoX00WuEWNnHFo591eXZIcl3IYm1iln65ub545zWF1o6pHicSHcX2eUBWEJW9W6GA/9cf/ZgJ2XuGOyDdep2A==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "Microsoft.Extensions.ObjectPool", "id": "Microsoft.Extensions.ObjectPool", "version": "10.0.8", "sha512": "sha512-XOzhf+i3nZIyqy5sFaEdnNsPOPEYcEz9tL3YIU8RjK3aKIMLPLMaXDCGoOxKeOTN+03Faaz5le8X1RlKsW9rPQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "Microsoft.NET.StringTools", "id": "Microsoft.NET.StringTools", "version": "18.6.3", "sha512": "sha512-8RtWydTzV9i25v80XBoNxZDxmxuClq0PVejE2dHfpLhD8jFoEEPP2S+q5oS9HdSKOVDurUDTdjMCEWUB+DiGZg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net8.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net9.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "Microsoft.NET.Test.Sdk", "id": "Microsoft.NET.Test.Sdk", "version": "18.5.1", "sha512": "sha512-5/ucicw/H9/VNCmMTCjCQhNHEJc08ZeSLSrjvdZR/rtVUY8Enw+bi9LQTP1K97aRCqw/BG7cIV+VVFvgj3fKiw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.TestPlatform.TestHost", "Microsoft.CodeCoverage"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": ["Microsoft.CodeCoverage"], "net47": ["Microsoft.CodeCoverage"], "net471": ["Microsoft.CodeCoverage"], "net472": ["Microsoft.CodeCoverage"], "net48": ["Microsoft.CodeCoverage"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": ["Microsoft.TestPlatform.TestHost", "Microsoft.CodeCoverage"], "net9.0": ["Microsoft.TestPlatform.TestHost", "Microsoft.CodeCoverage"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "Microsoft.TestPlatform.ObjectModel", "id": "Microsoft.TestPlatform.ObjectModel", "version": "18.5.1", "sha512": "sha512-SJHvdEawgdOUuyN2/eVWZCwe14DKPgQPDsQGiwfeKFgjzYDUvhESRpohG9IvQQuYiCvAv7Tn+ozZ2fDPfpwdzg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["System.Reflection.Metadata"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Reflection.Metadata"], "net462": ["System.Reflection.Metadata"], "net47": ["System.Reflection.Metadata"], "net471": ["System.Reflection.Metadata"], "net472": ["System.Reflection.Metadata"], "net48": ["System.Reflection.Metadata"], "net5.0": ["System.Reflection.Metadata"], "net6.0": ["System.Reflection.Metadata"], "net7.0": ["System.Reflection.Metadata"], "net8.0": ["System.Reflection.Metadata"], "net9.0": ["System.Reflection.Metadata"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Reflection.Metadata"], "netcoreapp2.1": ["System.Reflection.Metadata"], "netcoreapp2.2": ["System.Reflection.Metadata"], "netcoreapp3.0": ["System.Reflection.Metadata"], "netcoreapp3.1": ["System.Reflection.Metadata"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Reflection.Metadata"], "netstandard2.1": ["System.Reflection.Metadata"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "Microsoft.TestPlatform.TestHost", "id": "Microsoft.TestPlatform.TestHost", "version": "18.5.1", "sha512": "sha512-CbWth1jMU2wVyAy1SVMexSyD3JXG8FYYyyrcY+B1aWhzFzRLh8JdThoibXTqXxZ2NRC9me+N4XIQC75dfLcgiA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.TestPlatform.ObjectModel", "Newtonsoft.Json"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": ["Microsoft.TestPlatform.ObjectModel", "Newtonsoft.Json"], "net9.0": ["Microsoft.TestPlatform.ObjectModel", "Newtonsoft.Json"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.CodeCoverage", "id": "Microsoft.CodeCoverage", "version": "18.8.1", "sha512": "sha512-8h9rObu86JMC0ouOd7meNjPhjrTYQPEyOT42hshBxdxknvpfYLRzTY13ZBhRAf7tohl7wApqq/aaN6WRxhdwjw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.Extensions.ObjectPool", "id": "Microsoft.Extensions.ObjectPool", "version": "10.0.10", "sha512": "sha512-4Ysvqe0dDLdaPyhHNtTJ1Rk6RpzIv4ysxDT12ujfGCiKJEpXKvumpGvO5fwfQzvNsuGuvVznsmaquCSOf/oePQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.NET.StringTools", "id": "Microsoft.NET.StringTools", "version": "18.8.2", "sha512": "sha512-qJv3HjkTja31DcQpKPyzFJy2cYhzWrFskxtk8sCYptzjp/ZeW0Sr59fEeQbZzz3WpjYPh0DfhmgPcUx3XPPLVA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net8.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net9.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.NET.Test.Sdk", "id": "Microsoft.NET.Test.Sdk", "version": "18.8.1", "sha512": "sha512-7ZJBYyRfeaV4hDllSLVb7dtLXQb4SpbAhy+s9Sc+dUV2zwDUTTJtPLYTjanS5kqqm+283NNxIY4271uUY0Pvjw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.TestPlatform.TestHost", "Microsoft.CodeCoverage"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": ["Microsoft.CodeCoverage"], "net47": ["Microsoft.CodeCoverage"], "net471": ["Microsoft.CodeCoverage"], "net472": ["Microsoft.CodeCoverage"], "net48": ["Microsoft.CodeCoverage"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": ["Microsoft.TestPlatform.TestHost", "Microsoft.CodeCoverage"], "net9.0": ["Microsoft.TestPlatform.TestHost", "Microsoft.CodeCoverage"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.TestPlatform.ObjectModel", "id": "Microsoft.TestPlatform.ObjectModel", "version": "18.8.1", "sha512": "sha512-+ng/tKQNSOlrGQHUc72D3cg62HPViwXXBC0FoeEO6m1u4H4TCjITJy6Ym1bC8Folj0MAT0Y3236hMtY67zGphQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["System.Reflection.Metadata"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Reflection.Metadata"], "net462": ["System.Reflection.Metadata"], "net47": ["System.Reflection.Metadata"], "net471": ["System.Reflection.Metadata"], "net472": ["System.Reflection.Metadata"], "net48": ["System.Reflection.Metadata"], "net5.0": ["System.Reflection.Metadata"], "net6.0": ["System.Reflection.Metadata"], "net7.0": ["System.Reflection.Metadata"], "net8.0": ["System.Reflection.Metadata"], "net9.0": ["System.Reflection.Metadata"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Reflection.Metadata"], "netcoreapp2.1": ["System.Reflection.Metadata"], "netcoreapp2.2": ["System.Reflection.Metadata"], "netcoreapp3.0": ["System.Reflection.Metadata"], "netcoreapp3.1": ["System.Reflection.Metadata"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Reflection.Metadata"], "netstandard2.1": ["System.Reflection.Metadata"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "Microsoft.TestPlatform.TestHost", "id": "Microsoft.TestPlatform.TestHost", "version": "18.8.1", "sha512": "sha512-RterAFeFkQwnHzCmWBUctxEH/Yenj39954gR5J7IZXQk5okBv6lD3XOv0uGGRe02EpRjhDawHaGUXHpFBKfI3g==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.TestPlatform.ObjectModel"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": ["Microsoft.TestPlatform.ObjectModel"], "net9.0": ["Microsoft.TestPlatform.ObjectModel"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "Microsoft.VisualStudio.SolutionPersistence", "id": "Microsoft.VisualStudio.SolutionPersistence", "version": "1.0.52", "sha512": "sha512-lHyMm5j5wRwVaC3vlCWrFH2FGy2SpFUZqLvYhzwf1cEUIQCUChU960h8kteFSf01ZkLSgJwrznmspwjW8kPtrA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": ["System.Memory", "System.Threading.Tasks.Extensions"], "net48": ["System.Memory", "System.Threading.Tasks.Extensions"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "Mono.Posix.NETStandard", "id": "Mono.Posix.NETStandard", "version": "1.0.0", "sha512": "sha512-RtGiutQZJAmajvQ0QvBvh73VJye85iW9f9tjZlzF88idLxNMo4lAktP/4Y9ilCpais0LDO0tpoICt9Hdv6wooA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "MSBuild.StructuredLogger", "id": "MSBuild.StructuredLogger", "version": "2.3.204", "sha512": "sha512-MnrlWYtNUl0db/2lePRJhtOCzbQkJ1L9tyrA4xlKTFqjvpw8wnnX6AQ+PXYhjlMJ8ET9aoXGJOn/3e9j07NSwg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net48": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net8.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net9.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "MSBuild.StructuredLogger", "id": "MSBuild.StructuredLogger", "version": "2.3.213", "sha512": "sha512-C63vcnENTazm2XrczuEkSQRTeX53nYH1bza3k1XQdp6S3FtYTjGTUFP4nqqkNDjwVtBLNioNXRSUkFTvf2Qdtw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net48": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net8.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net9.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["Microsoft.Build.Framework", "Microsoft.Build.Utilities.Core", "System.Collections.Immutable", "System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "Newtonsoft.Json", "id": "Newtonsoft.Json", "version": "13.0.4", "sha512": "sha512-bR+v+E/yJ6g7GV2uXw2OrUSjYYfjLkOLC8JD4kCS23msLapnKtdJPBJA75fwHH++ErIffeIqzYITLxAur4KAXA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "NuGet.Versioning", "id": "NuGet.Versioning", "version": "7.6.0", "sha512": "sha512-JwbvmbG+1EOilFOAtjT2A7p05UgeOqzTZluUJ4mFgPZUSpYcHPPaK15x+RiqpKsVmKy741MaLN0fjOYxhGXr3g==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "System.Buffers", "id": "System.Buffers", "version": "4.6.1", "sha512": "sha512-qve/dFwECwehSWlZmpkrrlIeATCvo/Hw2koyMrUVcDBy5gXAQrnwX8pHEoqgj8DgkrWuWW1DrQbFqoMbo+Fvrg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "System.Collections.Immutable", "id": "System.Collections.Immutable", "version": "10.0.8", "sha512": "sha512-C6PSp5YO9fvxcDoBwqDE/2iMPNgzOcrdjQsnpJxWBMDZRMxdpjDe9tzJb14zZwY0dqbVSsoik5un31ZXJ7Fu8Q==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "System.Composition", "id": "System.Composition", "version": "10.0.8", "sha512": "sha512-h1qUp18nhfGfw3mz8ZxNTUZXm2rVvk7HiPKj0IYdRJIdOAcIBmI/MT4U8Etdi6y0tPb2dNQvfTnj35PgDCpDwg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net462": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net47": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net471": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net472": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net48": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net5.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net6.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net7.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net8.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net9.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netcoreapp2.1": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netcoreapp2.2": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netcoreapp3.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netcoreapp3.1": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netstandard2.1": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "System.Composition.AttributedModel", "id": "System.Composition.AttributedModel", "version": "10.0.8", "sha512": "sha512-Qy0Ag0tpyGeh7BFgN7Mj2rumQHWoZYuTRE5fo5ice3j97JIMoAKt6uvj3sQqukhNLLPUDY0vz3WA36Fl/AbPRw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "System.Composition.Convention", "id": "System.Composition.Convention", "version": "10.0.8", "sha512": "sha512-TKc99rqqwWNajwl3o40keYyQtYVD+NnWWX1EId4whrwo7wT9KiTS8Q6CJVR7GLxA+9lbGMJyQh6IgwZk3T7YJg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["System.Composition.AttributedModel"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Composition.AttributedModel"], "net462": ["System.Composition.AttributedModel"], "net47": ["System.Composition.AttributedModel"], "net471": ["System.Composition.AttributedModel"], "net472": ["System.Composition.AttributedModel"], "net48": ["System.Composition.AttributedModel"], "net5.0": ["System.Composition.AttributedModel"], "net6.0": ["System.Composition.AttributedModel"], "net7.0": ["System.Composition.AttributedModel"], "net8.0": ["System.Composition.AttributedModel"], "net9.0": ["System.Composition.AttributedModel"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Composition.AttributedModel"], "netcoreapp2.1": ["System.Composition.AttributedModel"], "netcoreapp2.2": ["System.Composition.AttributedModel"], "netcoreapp3.0": ["System.Composition.AttributedModel"], "netcoreapp3.1": ["System.Composition.AttributedModel"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Composition.AttributedModel"], "netstandard2.1": ["System.Composition.AttributedModel"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "System.Composition.Hosting", "id": "System.Composition.Hosting", "version": "10.0.8", "sha512": "sha512-Xx+8iGL7kYmfDwxPZqbFGuVO+JKLqfwBPJpqquFDE1IUsZs7yKFmmP1zg+xVwcEq/wJdYVqs9MTsCU/1AaBW/A==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["System.Composition.Runtime"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Composition.Runtime"], "net462": ["System.Composition.Runtime"], "net47": ["System.Composition.Runtime"], "net471": ["System.Composition.Runtime"], "net472": ["System.Composition.Runtime"], "net48": ["System.Composition.Runtime"], "net5.0": ["System.Composition.Runtime"], "net6.0": ["System.Composition.Runtime"], "net7.0": ["System.Composition.Runtime"], "net8.0": ["System.Composition.Runtime"], "net9.0": ["System.Composition.Runtime"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Composition.Runtime"], "netcoreapp2.1": ["System.Composition.Runtime"], "netcoreapp2.2": ["System.Composition.Runtime"], "netcoreapp3.0": ["System.Composition.Runtime"], "netcoreapp3.1": ["System.Composition.Runtime"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Composition.Runtime"], "netstandard2.1": ["System.Composition.Runtime"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "System.Composition.Runtime", "id": "System.Composition.Runtime", "version": "10.0.8", "sha512": "sha512-yyACoUVUtVhIcZzApq+ARHwVOkA9PRSQ/gI2y5xXwa6nwqA8doKySyqH1bfpaacHJ3j4zhrRe1lpjffTEhh0+Q==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "System.Composition.TypedParts", "id": "System.Composition.TypedParts", "version": "10.0.8", "sha512": "sha512-kPWxTNdqjdnYmvDMnEFbjmKsbECPKXCHiusp53sor6xgDcUQNkzNqEKTMVEFbvjIH0DBLXIP9fudSrK886dqeg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net462": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net47": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net471": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net472": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net48": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net5.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net6.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net7.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net8.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net9.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netcoreapp2.1": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netcoreapp2.2": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netcoreapp3.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netcoreapp3.1": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netstandard2.1": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "System.Configuration.ConfigurationManager", "id": "System.Configuration.ConfigurationManager", "version": "10.0.8", "sha512": "sha512-1Z/h32w5oEjve1mUU5w1aYY9p+wcuNtTxo0RG+cQl+I34XRkjx4iYK9kuz+WYzud9QpPePk6iyjvnay1mWj6/Q==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["System.Diagnostics.EventLog", "System.Security.Cryptography.ProtectedData"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Security.Cryptography.ProtectedData"], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": ["System.Security.Cryptography.ProtectedData"], "net6.0": ["System.Security.Cryptography.ProtectedData"], "net7.0": ["System.Security.Cryptography.ProtectedData"], "net8.0": ["System.Diagnostics.EventLog", "System.Security.Cryptography.ProtectedData"], "net9.0": ["System.Diagnostics.EventLog", "System.Security.Cryptography.ProtectedData"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Security.Cryptography.ProtectedData"], "netcoreapp2.1": ["System.Security.Cryptography.ProtectedData"], "netcoreapp2.2": ["System.Security.Cryptography.ProtectedData"], "netcoreapp3.0": ["System.Security.Cryptography.ProtectedData"], "netcoreapp3.1": ["System.Security.Cryptography.ProtectedData"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Security.Cryptography.ProtectedData"], "netstandard2.1": ["System.Security.Cryptography.ProtectedData"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "System.Diagnostics.EventLog", "id": "System.Diagnostics.EventLog", "version": "10.0.8", "sha512": "sha512-ik2gdaGlYD5S+5wk4WLP43va4G9IW7g5QxW/C1/+DSEH2KNEGWuskgaVhURZxCkstF20I1iwgfMCB9k/5uUBFw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "System.IO.Pipelines", "id": "System.IO.Pipelines", "version": "10.0.8", "sha512": "sha512-jrBzkIgn/+Ul7ODVXy5uBYhlXpEVHx57VUtLigfw0pq2r+xu3dv/F0aWi7y3C/w3GSk6mhvoX3RfKcWJT372UA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net462": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net47": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net471": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net472": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net48": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net5.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net6.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net7.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Collections.Immutable", "id": "System.Collections.Immutable", "version": "10.0.10", "sha512": "sha512-JH2NYVL3GXOOYI8qrLQO2EvmatmLdtXtMxc9AFv+/XJ76dgTtSeP3VHuobj+xD1FWPhhxMZ0VhyFJoB1s6AHTw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Composition", "id": "System.Composition", "version": "10.0.10", "sha512": "sha512-9YEpcfz4xCbj/b+97hecZ6bzun83fOGbCz3AiSbaVAgkYVt00q1CVNPtwUL4eIQmd60OoTeRd8fhDVs1Vu41AA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net462": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net47": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net471": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net472": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net48": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net5.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net6.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net7.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net8.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "net9.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netcoreapp2.1": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netcoreapp2.2": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netcoreapp3.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netcoreapp3.1": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"], "netstandard2.1": ["System.Composition.AttributedModel", "System.Composition.Convention", "System.Composition.Hosting", "System.Composition.Runtime", "System.Composition.TypedParts"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Composition.AttributedModel", "id": "System.Composition.AttributedModel", "version": "10.0.10", "sha512": "sha512-qpvi6DGQYbcoNiBs0si0uWfZsFNCe7G38rE95/QyuUW1QF9zt9blOqygIhqz7SbAuAYxA/GrFJqdQ2ZLRKYtTA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Composition.Convention", "id": "System.Composition.Convention", "version": "10.0.10", "sha512": "sha512-I89jhR8qtl6yBXa9JPJcdela65JI4WPA4xfL3qauBlOZpSZUPAB5GCryyTKUh6yWzco+fSWO7QXfXUFyG+fAOQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["System.Composition.AttributedModel"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Composition.AttributedModel"], "net462": ["System.Composition.AttributedModel"], "net47": ["System.Composition.AttributedModel"], "net471": ["System.Composition.AttributedModel"], "net472": ["System.Composition.AttributedModel"], "net48": ["System.Composition.AttributedModel"], "net5.0": ["System.Composition.AttributedModel"], "net6.0": ["System.Composition.AttributedModel"], "net7.0": ["System.Composition.AttributedModel"], "net8.0": ["System.Composition.AttributedModel"], "net9.0": ["System.Composition.AttributedModel"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Composition.AttributedModel"], "netcoreapp2.1": ["System.Composition.AttributedModel"], "netcoreapp2.2": ["System.Composition.AttributedModel"], "netcoreapp3.0": ["System.Composition.AttributedModel"], "netcoreapp3.1": ["System.Composition.AttributedModel"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Composition.AttributedModel"], "netstandard2.1": ["System.Composition.AttributedModel"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Composition.Hosting", "id": "System.Composition.Hosting", "version": "10.0.10", "sha512": "sha512-8rY5Z+Owu9AGZ2XnCqRTydhX1xoHz9qiisgpydo3PTETGcbPbGjIYu+Imzr3pHPWYPwtWIWr+5WT4b+abC+qVQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["System.Composition.Runtime"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Composition.Runtime"], "net462": ["System.Composition.Runtime"], "net47": ["System.Composition.Runtime"], "net471": ["System.Composition.Runtime"], "net472": ["System.Composition.Runtime"], "net48": ["System.Composition.Runtime"], "net5.0": ["System.Composition.Runtime"], "net6.0": ["System.Composition.Runtime"], "net7.0": ["System.Composition.Runtime"], "net8.0": ["System.Composition.Runtime"], "net9.0": ["System.Composition.Runtime"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Composition.Runtime"], "netcoreapp2.1": ["System.Composition.Runtime"], "netcoreapp2.2": ["System.Composition.Runtime"], "netcoreapp3.0": ["System.Composition.Runtime"], "netcoreapp3.1": ["System.Composition.Runtime"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Composition.Runtime"], "netstandard2.1": ["System.Composition.Runtime"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Composition.Runtime", "id": "System.Composition.Runtime", "version": "10.0.10", "sha512": "sha512-OU44yuMrt7hdqV61A3vh/nY52m1bWR9fUWKI0p8npg3oDggYdicD6RlfxwxOaWR4ZCLIhzuofgKpZdEKTPZFKw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Composition.TypedParts", "id": "System.Composition.TypedParts", "version": "10.0.10", "sha512": "sha512-iSJMibDOvZGigerJF4saJaLQK7piGopzifejMCne4/BmKgmRuMyQ6H/oN9/EGhbMlkr97c1apv62zSCxQke6/w==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net462": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net47": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net471": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net472": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net48": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net5.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net6.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net7.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net8.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "net9.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netcoreapp2.1": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netcoreapp2.2": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netcoreapp3.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netcoreapp3.1": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"], "netstandard2.1": ["System.Composition.AttributedModel", "System.Composition.Hosting", "System.Composition.Runtime"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Configuration.ConfigurationManager", "id": "System.Configuration.ConfigurationManager", "version": "10.0.10", "sha512": "sha512-MBt+gvvOcB6YDkikO5AB0KzOkxfhVZ9XSR0NU97DaM98b5E/IFTbRdvflYMKZt7x4qIVlsH/x6WMcTRAw4ZyZg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["System.Diagnostics.EventLog", "System.Security.Cryptography.ProtectedData"], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Security.Cryptography.ProtectedData"], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": ["System.Security.Cryptography.ProtectedData"], "net6.0": ["System.Security.Cryptography.ProtectedData"], "net7.0": ["System.Security.Cryptography.ProtectedData"], "net8.0": ["System.Diagnostics.EventLog", "System.Security.Cryptography.ProtectedData"], "net9.0": ["System.Diagnostics.EventLog", "System.Security.Cryptography.ProtectedData"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Security.Cryptography.ProtectedData"], "netcoreapp2.1": ["System.Security.Cryptography.ProtectedData"], "netcoreapp2.2": ["System.Security.Cryptography.ProtectedData"], "netcoreapp3.0": ["System.Security.Cryptography.ProtectedData"], "netcoreapp3.1": ["System.Security.Cryptography.ProtectedData"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Security.Cryptography.ProtectedData"], "netstandard2.1": ["System.Security.Cryptography.ProtectedData"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Diagnostics.EventLog", "id": "System.Diagnostics.EventLog", "version": "10.0.10", "sha512": "sha512-+YqSLCCMkPCaJHzywlEEiz663YYzeH+WflcBQndlx3wpj0DlSo0r9ev+9ynv0+jPxcF+/dXyzYAYRTLCS1pIGg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.IO.Pipelines", "id": "System.IO.Pipelines", "version": "10.0.10", "sha512": "sha512-uJchtc574qQrjiemB8P1ChopZAmgr5FOysWQUue0O3OO5KPkTlozvw9Stq/Dvh6cm77FGcmtlLA4VFGZyVC24Q==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net462": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net47": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net471": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net472": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net48": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net5.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net6.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net7.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netcoreapp3.1": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"], "netstandard2.1": ["System.Buffers", "System.Memory", "System.Threading.Tasks.Extensions"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "System.Memory", "id": "System.Memory", "version": "4.6.3", "sha512": "sha512-NXcNYlWoXe5cz9sb8Huo6x2dCZVYkhwKtgE00n/MoI8V4ZI/7/t+EI5bOhQFlZfFjjqM8+U6prjU/aARt7H/tA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "net462": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "net47": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "net471": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "net472": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Buffers", "System.Numerics.Vectors", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "System.Numerics.Vectors", "id": "System.Numerics.Vectors", "version": "4.6.1", "sha512": "sha512-/rkvpUeUPlCY/2qYVQKiUsj5IKaXZcy2+SQAGAfemAdyEF5AgIgYOFNSTMWDXo09JWFX9HB+wV1yCyi2Mwi3TA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "System.Reflection.Metadata", "id": "System.Reflection.Metadata", "version": "10.0.8", "sha512": "sha512-wWf/RiVz/UVoMqYGr2X5z1wz1uktkIU0E+aGcFbffDNMU0kN3t5j3Yc+/8xC6GvT4+KjXDXumO/3ddS/cln5Pw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Collections.Immutable"], "net462": ["System.Collections.Immutable"], "net47": ["System.Collections.Immutable"], "net471": ["System.Collections.Immutable"], "net472": ["System.Collections.Immutable"], "net48": ["System.Collections.Immutable"], "net5.0": ["System.Collections.Immutable"], "net6.0": ["System.Collections.Immutable"], "net7.0": ["System.Collections.Immutable"], "net8.0": ["System.Collections.Immutable"], "net9.0": ["System.Collections.Immutable"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Collections.Immutable"], "netcoreapp2.1": ["System.Collections.Immutable"], "netcoreapp2.2": ["System.Collections.Immutable"], "netcoreapp3.0": ["System.Collections.Immutable"], "netcoreapp3.1": ["System.Collections.Immutable"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Collections.Immutable"], "netstandard2.1": ["System.Collections.Immutable"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "System.Reflection.MetadataLoadContext", "id": "System.Reflection.MetadataLoadContext", "version": "10.0.8", "sha512": "sha512-YcFpYWsCdnD5vjpskco7E87TD9g6v6nxow1Qu3/XrBlUEulEZOUfTSV5EP7mSSKMYgT3+fJK7zrijCeg+z3w9g==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net462": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net47": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net471": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net472": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net48": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net5.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net6.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net7.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net8.0": ["System.Collections.Immutable", "System.Reflection.Metadata"], "net9.0": ["System.Collections.Immutable", "System.Reflection.Metadata"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netcoreapp2.1": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netcoreapp2.2": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netcoreapp3.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netcoreapp3.1": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netstandard2.1": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Reflection.Metadata", "id": "System.Reflection.Metadata", "version": "10.0.10", "sha512": "sha512-YLol8JpRVrJJ+Me1RQlmXztNO7+O+wMp//h/I3hMQO17VtfEroEsHxkgcAkdBBLxes70sW/j31TrwN5eLbkJ7w==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Collections.Immutable"], "net462": ["System.Collections.Immutable"], "net47": ["System.Collections.Immutable"], "net471": ["System.Collections.Immutable"], "net472": ["System.Collections.Immutable"], "net48": ["System.Collections.Immutable"], "net5.0": ["System.Collections.Immutable"], "net6.0": ["System.Collections.Immutable"], "net7.0": ["System.Collections.Immutable"], "net8.0": ["System.Collections.Immutable"], "net9.0": ["System.Collections.Immutable"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Collections.Immutable"], "netcoreapp2.1": ["System.Collections.Immutable"], "netcoreapp2.2": ["System.Collections.Immutable"], "netcoreapp3.0": ["System.Collections.Immutable"], "netcoreapp3.1": ["System.Collections.Immutable"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Collections.Immutable"], "netstandard2.1": ["System.Collections.Immutable"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Reflection.MetadataLoadContext", "id": "System.Reflection.MetadataLoadContext", "version": "10.0.10", "sha512": "sha512-u41t/p9hzAhEDJHN0Uhk++V4lxX6nP4EoF85rdd2GQ8PsW7kinHLYH1/Ent6MHDhsAtfOI1atpCuPiPDh4DAgg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net462": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net47": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net471": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net472": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net48": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net5.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net6.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net7.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "net8.0": ["System.Collections.Immutable", "System.Reflection.Metadata"], "net9.0": ["System.Collections.Immutable", "System.Reflection.Metadata"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netcoreapp2.1": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netcoreapp2.2": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netcoreapp3.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netcoreapp3.1": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"], "netstandard2.1": ["System.Collections.Immutable", "System.Reflection.Metadata", "System.Memory"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "System.Runtime.CompilerServices.Unsafe", "id": "System.Runtime.CompilerServices.Unsafe", "version": "6.1.2", "sha512": "sha512-t2aXWJZBkAkRrTOnw31OBELKEVSDD5YvC3O5dXaHFsR66/nRTKm1y3Iq6NwFI5u5IlKrWYfdan66V+GKKkY8hQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "System.Security.Cryptography.ProtectedData", "id": "System.Security.Cryptography.ProtectedData", "version": "10.0.8", "sha512": "sha512-LOVSTFOou3ekg+ou98m8tAC591BuTlTqEbSQv34UIjxcU0HvbZ7qLqCXSp/60Cx40Zd0YmeyXTGeARMgSXlWyg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Memory"], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": ["System.Memory"], "net6.0": ["System.Memory"], "net7.0": ["System.Memory"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Memory"], "netcoreapp2.1": ["System.Memory"], "netcoreapp2.2": ["System.Memory"], "netcoreapp3.0": ["System.Memory"], "netcoreapp3.1": ["System.Memory"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Memory"], "netstandard2.1": ["System.Memory"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "System.Text.Encoding.CodePages", "id": "System.Text.Encoding.CodePages", "version": "10.0.8", "sha512": "sha512-xr2qHdT5yx3IOZ4bMkPY+1CGCIqzBC41kk9AHFvl/R3oNrEns5y4OUz4KRXk0UqY4FjiOXW6PtqdvDbSC2iYsQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, - {"name": "System.Threading.Channels", "id": "System.Threading.Channels", "version": "10.0.8", "sha512": "sha512-DLFQGFJl9TNsW2KansRP+AvSO+HUoV6s8g/d93zw7IbGWm48uC6P0TIdzuJTtwHVwN+oQsQ0ReBdLVr+gL1Eqg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Security.Cryptography.ProtectedData", "id": "System.Security.Cryptography.ProtectedData", "version": "10.0.10", "sha512": "sha512-K2gtxewwwrGeWxClblSZneULZJ7P4Ln7Icrv5NKsn3ymrqbZTaWESJdNLPIWlUEiMrKoTPAcRlpiPUsFdeiv2w==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Memory"], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": ["System.Memory"], "net6.0": ["System.Memory"], "net7.0": ["System.Memory"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Memory"], "netcoreapp2.1": ["System.Memory"], "netcoreapp2.2": ["System.Memory"], "netcoreapp3.0": ["System.Memory"], "netcoreapp3.1": ["System.Memory"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Memory"], "netstandard2.1": ["System.Memory"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Text.Encoding.CodePages", "id": "System.Text.Encoding.CodePages", "version": "10.0.10", "sha512": "sha512-bFLoXr02I+nK9gfMVVFnbtjAfQ9UlGF271ZyBn89G4XuaphkzIzM+LtEXTAaV1c1/odcTMI3/760LLBXae4AaQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net462": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net47": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net471": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net472": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["System.Memory", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, + {"name": "System.Threading.Channels", "id": "System.Threading.Channels", "version": "10.0.10", "sha512": "sha512-JJc9VdKP1htQGfLIRyVkrm09SJmmcVHJKEIeMyOxV2jjXEiPZpKQIcu4VZe3FLY86mSayIvlFSiPbhmCUOKGSg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net462": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net47": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net471": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net472": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net48": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "netcoreapp2.1": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "netcoreapp2.2": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.Bcl.AsyncInterfaces", "System.Threading.Tasks.Extensions"], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "System.Threading.Tasks.Extensions", "id": "System.Threading.Tasks.Extensions", "version": "4.6.3", "sha512": "sha512-zWRHXIBnbfzQE1SamNoW9X5NjEcW/JNAtvVxGKd3bcg71wQVmoI3pDq+WUa2A+temXSNCm7707hmAFwwcYlK0A==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Runtime.CompilerServices.Unsafe"], "net462": ["System.Runtime.CompilerServices.Unsafe"], "net47": ["System.Runtime.CompilerServices.Unsafe"], "net471": ["System.Runtime.CompilerServices.Unsafe"], "net472": ["System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Runtime.CompilerServices.Unsafe"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "xunit", "id": "xunit", "version": "2.9.3", "sha512": "sha512-3/ayVPC7NQWQENR5REbOgXYsbhoJsmpnxQa5pO4lxbjGbckOs62nsm4kLErzc8ng7V5Xz08uwVjMqaZGJiXCrg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net11": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net20": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net30": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net35": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net40": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net403": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net45": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net451": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net452": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net46": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net461": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net462": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net47": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net471": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net472": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net48": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net5.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net6.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net7.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net8.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "net9.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netcoreapp1.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netcoreapp1.1": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netcoreapp2.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netcoreapp2.1": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netcoreapp2.2": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netcoreapp3.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netcoreapp3.1": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard1.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard1.1": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard1.2": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard1.3": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard1.4": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard1.5": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard1.6": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard2.0": ["xunit.core", "xunit.assert", "xunit.analyzers"], "netstandard2.1": ["xunit.core", "xunit.assert", "xunit.analyzers"]}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, {"name": "xunit.abstractions", "id": "xunit.abstractions", "version": "2.0.3", "sha512": "sha512-PKJri5f0qEQPFvgY6CZR9XG8JROlWSdC/ZYLkkDQuID++Egn+yWjB+Yf57AZ8U6GRlP7z33uDQ4/r5BZPer2JA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net10.0": [], "net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": [], "tools": {}}, From 7e3c1443a92539f5c1ec3000dac2de3f7adbd44d Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Tue, 11 Aug 2026 13:05:46 +0200 Subject: [PATCH 0234/2098] Java: Update test expectations --- java/ql/test/utils/modelgenerator/dataflow/p/Joiner.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/java/ql/test/utils/modelgenerator/dataflow/p/Joiner.java b/java/ql/test/utils/modelgenerator/dataflow/p/Joiner.java index ffe68e6722db..6412d1293b9d 100644 --- a/java/ql/test/utils/modelgenerator/dataflow/p/Joiner.java +++ b/java/ql/test/utils/modelgenerator/dataflow/p/Joiner.java @@ -82,6 +82,7 @@ public String toString() { } // heuristic-summary=p;Joiner;false;add;(CharSequence);;Argument[this];ReturnValue;value;df-generated + // heuristic-summary=p;Joiner;false;add;(CharSequence);;Argument[0];Argument[this];taint;df-generated // contentbased-summary=p;Joiner;false;add;(CharSequence);;Argument[this];ReturnValue;value;dfc-generated // MISSING content based summaries for "elts". This could be a synthetic field. public Joiner add(CharSequence newElement) { @@ -107,6 +108,7 @@ private int checkAddLength(int oldLen, int inc) { } // heuristic-summary=p;Joiner;false;merge;(Joiner);;Argument[this];ReturnValue;value;df-generated + // heuristic-summary=p;Joiner;false;merge;(Joiner);;Argument[0];Argument[this];taint;df-generated // contentbased-summary=p;Joiner;false;merge;(Joiner);;Argument[this];ReturnValue;value;dfc-generated // MISSING content based summaries for "elts". This could be a synthetic field. public Joiner merge(Joiner other) { From f4b041e8e374960edf284a75557c9e3f97a4710b Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Tue, 11 Aug 2026 13:12:09 +0200 Subject: [PATCH 0235/2098] Ruby: Add change note. --- ruby/ql/lib/change-notes/2026-08-11-regex-tracking.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 ruby/ql/lib/change-notes/2026-08-11-regex-tracking.md diff --git a/ruby/ql/lib/change-notes/2026-08-11-regex-tracking.md b/ruby/ql/lib/change-notes/2026-08-11-regex-tracking.md new file mode 100644 index 000000000000..f0310bdf3775 --- /dev/null +++ b/ruby/ql/lib/change-notes/2026-08-11-regex-tracking.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The algorithm for tracking regexes has been replaced. This can cause result changes in related queries, for example, `rb/polynomial-redos`. From 9db7db17ef72a803043f1e2916ce01c1b2ffcb27 Mon Sep 17 00:00:00 2001 From: Matin Zadeh Dolatabad <24797481+matinzd@users.noreply.github.com> Date: Mon, 10 Aug 2026 13:02:36 +0200 Subject: [PATCH 0236/2098] Add React Native Reanimated worklet directive as KnownDirective --- javascript/ql/lib/semmle/javascript/Stmt.qll | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/javascript/ql/lib/semmle/javascript/Stmt.qll b/javascript/ql/lib/semmle/javascript/Stmt.qll index 6a757cc1d6ca..94aac3ade6b1 100644 --- a/javascript/ql/lib/semmle/javascript/Stmt.qll +++ b/javascript/ql/lib/semmle/javascript/Stmt.qll @@ -475,6 +475,21 @@ module Directive { class UseCacheDirective extends KnownDirective { UseCacheDirective() { this.getDirectiveText().regexpMatch("use cache(:.*)?") } } + + /** + * A React Native Reanimated worklet directive. + * + * Example: + * + * ``` + * function myWorklet() { + * "worklet"; + * } + * ``` + */ + class WorkletDirective extends KnownDirective { + WorkletDirective() { this.getDirectiveText() = "worklet" } + } } /** From b71f9e84fe0c3e71d7c7eff15476f56a542e06c7 Mon Sep 17 00:00:00 2001 From: Matin Zadeh Dolatabad <24797481+matinzd@users.noreply.github.com> Date: Mon, 10 Aug 2026 13:04:09 +0200 Subject: [PATCH 0237/2098] test: update --- javascript/ql/test/library-tests/Directives/tst.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/javascript/ql/test/library-tests/Directives/tst.js b/javascript/ql/test/library-tests/Directives/tst.js index 7c7676322a4a..30a0772a610e 100644 --- a/javascript/ql/test/library-tests/Directives/tst.js +++ b/javascript/ql/test/library-tests/Directives/tst.js @@ -1,6 +1,7 @@ 'use strict'; // this is a directive 'use asm'; // and so is this 'bundle';// and this +'worklet'; 'use server'; 'use client'; 'use memo'; @@ -18,6 +19,7 @@ function f() { 'use\x20strict'; // this is a directive, though not a strict mode directive 'use asm'; // and so is this 'bundle'; + 'worklet'; 'use server'; 'use client'; 'use memo'; From 0611639a63eb687f95a9cd57368da841684d6afd Mon Sep 17 00:00:00 2001 From: matinzd <24797481+matinzd@users.noreply.github.com> Date: Mon, 10 Aug 2026 13:19:17 +0200 Subject: [PATCH 0238/2098] chore: update test snapshot --- .../2026-08-10-worklet-directive.md | 5 +++ javascript/ql/lib/semmle/javascript/Stmt.qll | 2 +- .../Directives/KnownDirective.expected | 36 ++++++++++--------- 3 files changed, 25 insertions(+), 18 deletions(-) create mode 100644 javascript/ql/lib/change-notes/2026-08-10-worklet-directive.md diff --git a/javascript/ql/lib/change-notes/2026-08-10-worklet-directive.md b/javascript/ql/lib/change-notes/2026-08-10-worklet-directive.md new file mode 100644 index 000000000000..c596f14e9abe --- /dev/null +++ b/javascript/ql/lib/change-notes/2026-08-10-worklet-directive.md @@ -0,0 +1,5 @@ +--- +category: feature +--- + +- Added support for recognizing the React Native Worklets `"worklet"` directive as a known directive. diff --git a/javascript/ql/lib/semmle/javascript/Stmt.qll b/javascript/ql/lib/semmle/javascript/Stmt.qll index 94aac3ade6b1..cedc3da2e8cb 100644 --- a/javascript/ql/lib/semmle/javascript/Stmt.qll +++ b/javascript/ql/lib/semmle/javascript/Stmt.qll @@ -477,7 +477,7 @@ module Directive { } /** - * A React Native Reanimated worklet directive. + * A React Native Worklets worklet directive. * * Example: * diff --git a/javascript/ql/test/library-tests/Directives/KnownDirective.expected b/javascript/ql/test/library-tests/Directives/KnownDirective.expected index 065c0954f747..89efb1e24dcd 100644 --- a/javascript/ql/test/library-tests/Directives/KnownDirective.expected +++ b/javascript/ql/test/library-tests/Directives/KnownDirective.expected @@ -1,20 +1,22 @@ | tst.js:1:1:1:13 | 'use strict'; | use strict | | tst.js:2:1:2:10 | 'use asm'; | use asm | | tst.js:3:1:3:9 | 'bundle'; | bundle | -| tst.js:4:1:4:13 | 'use server'; | use server | -| tst.js:5:1:5:13 | 'use client'; | use client | -| tst.js:6:1:6:11 | 'use memo'; | use memo | -| tst.js:7:1:7:14 | 'use no memo'; | use no memo | -| tst.js:8:1:8:12 | 'use cache'; | use cache | -| tst.js:9:1:9:20 | 'use cache: remote'; | use cache: remote | -| tst.js:10:1:10:21 | 'use ca ... ivate'; | use cache: private | -| tst.js:19:3:19:12 | 'use asm'; | use asm | -| tst.js:20:3:20:11 | 'bundle'; | bundle | -| tst.js:21:3:21:15 | 'use server'; | use server | -| tst.js:22:3:22:15 | 'use client'; | use client | -| tst.js:23:3:23:13 | 'use memo'; | use memo | -| tst.js:24:3:24:16 | 'use no memo'; | use no memo | -| tst.js:25:3:25:14 | 'use cache'; | use cache | -| tst.js:26:3:26:22 | 'use cache: remote'; | use cache: remote | -| tst.js:27:3:27:23 | 'use ca ... ivate'; | use cache: private | -| tst.js:34:5:34:17 | 'use strict'; | use strict | +| tst.js:4:1:4:10 | 'worklet'; | worklet | +| tst.js:5:1:5:13 | 'use server'; | use server | +| tst.js:6:1:6:13 | 'use client'; | use client | +| tst.js:7:1:7:11 | 'use memo'; | use memo | +| tst.js:8:1:8:14 | 'use no memo'; | use no memo | +| tst.js:9:1:9:12 | 'use cache'; | use cache | +| tst.js:10:1:10:20 | 'use cache: remote'; | use cache: remote | +| tst.js:11:1:11:21 | 'use ca ... ivate'; | use cache: private | +| tst.js:20:3:20:12 | 'use asm'; | use asm | +| tst.js:21:3:21:11 | 'bundle'; | bundle | +| tst.js:22:3:22:12 | 'worklet'; | worklet | +| tst.js:23:3:23:15 | 'use server'; | use server | +| tst.js:24:3:24:15 | 'use client'; | use client | +| tst.js:25:3:25:13 | 'use memo'; | use memo | +| tst.js:26:3:26:16 | 'use no memo'; | use no memo | +| tst.js:27:3:27:14 | 'use cache'; | use cache | +| tst.js:28:3:28:22 | 'use cache: remote'; | use cache: remote | +| tst.js:29:3:29:23 | 'use ca ... ivate'; | use cache: private | +| tst.js:36:5:36:17 | 'use strict'; | use strict | From 95962c98646f39a236739d35c64e73c39fa24ae6 Mon Sep 17 00:00:00 2001 From: Michael Recachinas Date: Tue, 11 Aug 2026 10:57:00 -0400 Subject: [PATCH 0239/2098] Migrate pull_request_target workflows --- .github/workflows/check-change-note.yml | 5 +- .github/workflows/labeler-apply.yml | 88 +++++++++++++++++++++++++ .github/workflows/labeler.yml | 13 ++-- 3 files changed, 98 insertions(+), 8 deletions(-) create mode 100644 .github/workflows/labeler-apply.yml diff --git a/.github/workflows/check-change-note.yml b/.github/workflows/check-change-note.yml index 70b78ce72944..d29bd00486be 100644 --- a/.github/workflows/check-change-note.yml +++ b/.github/workflows/check-change-note.yml @@ -1,10 +1,11 @@ name: Check change note permissions: + contents: read pull-requests: read on: - pull_request_target: + pull_request: types: [labeled, unlabeled, opened, synchronize, reopened, ready_for_review] paths: - "*/ql/src/**/*.ql" @@ -23,7 +24,7 @@ jobs: env: REPO: ${{ github.repository }} PULL_REQUEST_NUMBER: ${{ github.event.number }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_TOKEN: ${{ github.token }} runs-on: ubuntu-latest steps: diff --git a/.github/workflows/labeler-apply.yml b/.github/workflows/labeler-apply.yml new file mode 100644 index 000000000000..bd8c15a081aa --- /dev/null +++ b/.github/workflows/labeler-apply.yml @@ -0,0 +1,88 @@ +name: "Pull Request Labeler Apply" + +on: + workflow_run: + workflows: ["Pull Request Labeler"] + types: [completed] + +permissions: {} + +jobs: + triage: + if: > + github.event.workflow_run.event == 'pull_request' && + github.event.workflow_run.conclusion == 'success' + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + pull-requests: write + steps: + - name: Validate pull request from workflow_run + id: validate + env: + GH_TOKEN: ${{ github.token }} + REPO: ${{ github.repository }} + RUN_ID: ${{ github.event.workflow_run.id }} + run: | + set -euo pipefail + + run_json=$(gh api "repos/$REPO/actions/runs/$RUN_ID") + event=$(jq -r '.event' <<<"$run_json") + conclusion=$(jq -r '.conclusion' <<<"$run_json") + head_sha=$(jq -r '.head_sha' <<<"$run_json") + head_repo=$(jq -r '.head_repository.full_name // empty' <<<"$run_json") + + if [ "$event" != "pull_request" ] || [ "$conclusion" != "success" ]; then + echo "apply=false" >> "$GITHUB_OUTPUT" + exit 0 + fi + + pr_number=$(jq -r 'if (.pull_requests | length) == 1 then .pull_requests[0].number else empty end' <<<"$run_json") + + if [ -z "$pr_number" ]; then + prs_json=$(gh api -H 'Accept: application/vnd.github+json' "repos/$REPO/commits/$head_sha/pulls") + pr_number=$(jq -r 'map(select(.state == "open")) | if length == 1 then .[0].number else empty end' <<<"$prs_json") + fi + + if [ -z "$pr_number" ]; then + head_owner=$(jq -r '.head_repository.owner.login // empty' <<<"$run_json") + head_branch=$(jq -r '.head_branch // empty' <<<"$run_json") + if [ -n "$head_owner" ] && [ -n "$head_branch" ]; then + prs_json=$(gh api --method GET "repos/$REPO/pulls" -f state=open -f head="$head_owner:$head_branch") + pr_number=$(jq -r 'if length == 1 then .[0].number else empty end' <<<"$prs_json") + fi + fi + + if [ -z "$pr_number" ]; then + echo "Could not identify a unique open pull request for workflow run $RUN_ID; skipping." + echo "apply=false" >> "$GITHUB_OUTPUT" + exit 0 + fi + + pr_json=$(gh api "repos/$REPO/pulls/$pr_number") + state=$(jq -r '.state' <<<"$pr_json") + base_repo=$(jq -r '.base.repo.full_name' <<<"$pr_json") + pr_head_sha=$(jq -r '.head.sha' <<<"$pr_json") + pr_head_repo=$(jq -r '.head.repo.full_name // empty' <<<"$pr_json") + + if [ "$state" != "open" ] || [ "$base_repo" != "$REPO" ]; then + echo "Pull request #$pr_number is no longer an open pull request against $REPO; skipping." + echo "apply=false" >> "$GITHUB_OUTPUT" + exit 0 + fi + + if [ "$pr_head_sha" != "$head_sha" ] || [ "$pr_head_repo" != "$head_repo" ]; then + echo "Pull request #$pr_number changed since workflow run $RUN_ID; skipping stale labeling." + echo "apply=false" >> "$GITHUB_OUTPUT" + exit 0 + fi + + echo "number=$pr_number" >> "$GITHUB_OUTPUT" + echo "apply=true" >> "$GITHUB_OUTPUT" + + - uses: actions/labeler@v4 + if: steps.validate.outputs.apply == 'true' + with: + repo-token: "${{ github.token }}" + pr-number: ${{ steps.validate.outputs.number }} diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 512fa40d2e3a..f6f54382f9b8 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -1,15 +1,16 @@ name: "Pull Request Labeler" + on: -- pull_request_target + pull_request: + types: [opened, synchronize, reopened] permissions: contents: read - pull-requests: write + pull-requests: read jobs: - triage: + request-labels: runs-on: ubuntu-latest steps: - - uses: actions/labeler@v4 - with: - repo-token: "${{ secrets.GITHUB_TOKEN }}" + - name: Request privileged labeling + run: echo "Labels are applied by the workflow_run writer after re-validating the pull request." From 862b71a42e095146294c8fceebb2a8875e223fd0 Mon Sep 17 00:00:00 2001 From: Michael Recachinas Date: Tue, 11 Aug 2026 11:08:29 -0400 Subject: [PATCH 0240/2098] Make labeler workflow_run PR lookup robust Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/labeler-apply.yml | 30 ++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/.github/workflows/labeler-apply.yml b/.github/workflows/labeler-apply.yml index bd8c15a081aa..8f75b00c7244 100644 --- a/.github/workflows/labeler-apply.yml +++ b/.github/workflows/labeler-apply.yml @@ -41,16 +41,16 @@ jobs: pr_number=$(jq -r 'if (.pull_requests | length) == 1 then .pull_requests[0].number else empty end' <<<"$run_json") if [ -z "$pr_number" ]; then - prs_json=$(gh api -H 'Accept: application/vnd.github+json' "repos/$REPO/commits/$head_sha/pulls") - pr_number=$(jq -r 'map(select(.state == "open")) | if length == 1 then .[0].number else empty end' <<<"$prs_json") + prs_json=$(gh api -H 'Accept: application/vnd.github+json' "repos/$REPO/commits/$head_sha/pulls" || echo '[]') + pr_number=$(jq -r 'map(select(.state == "open")) | if length == 1 then .[0].number else empty end' <<<"$prs_json" 2>/dev/null || true) fi if [ -z "$pr_number" ]; then head_owner=$(jq -r '.head_repository.owner.login // empty' <<<"$run_json") head_branch=$(jq -r '.head_branch // empty' <<<"$run_json") if [ -n "$head_owner" ] && [ -n "$head_branch" ]; then - prs_json=$(gh api --method GET "repos/$REPO/pulls" -f state=open -f head="$head_owner:$head_branch") - pr_number=$(jq -r 'if length == 1 then .[0].number else empty end' <<<"$prs_json") + prs_json=$(gh api --method GET "repos/$REPO/pulls" -f state=open -f head="$head_owner:$head_branch" || echo '[]') + pr_number=$(jq -r 'if length == 1 then .[0].number else empty end' <<<"$prs_json" 2>/dev/null || true) fi fi @@ -60,11 +60,23 @@ jobs: exit 0 fi - pr_json=$(gh api "repos/$REPO/pulls/$pr_number") - state=$(jq -r '.state' <<<"$pr_json") - base_repo=$(jq -r '.base.repo.full_name' <<<"$pr_json") - pr_head_sha=$(jq -r '.head.sha' <<<"$pr_json") - pr_head_repo=$(jq -r '.head.repo.full_name // empty' <<<"$pr_json") + pr_json=$(gh api "repos/$REPO/pulls/$pr_number" || true) + if [ -z "$pr_json" ]; then + echo "Pull request #$pr_number could not be fetched; skipping." + echo "apply=false" >> "$GITHUB_OUTPUT" + exit 0 + fi + + state=$(jq -r '.state // empty' <<<"$pr_json" 2>/dev/null || true) + base_repo=$(jq -r '.base.repo.full_name // empty' <<<"$pr_json" 2>/dev/null || true) + pr_head_sha=$(jq -r '.head.sha // empty' <<<"$pr_json" 2>/dev/null || true) + pr_head_repo=$(jq -r '.head.repo.full_name // empty' <<<"$pr_json" 2>/dev/null || true) + + if [ -z "$state" ]; then + echo "Pull request #$pr_number could not be parsed; skipping." + echo "apply=false" >> "$GITHUB_OUTPUT" + exit 0 + fi if [ "$state" != "open" ] || [ "$base_repo" != "$REPO" ]; then echo "Pull request #$pr_number is no longer an open pull request against $REPO; skipping." From db708d4a804086f8ef4b17ea112431b839391f12 Mon Sep 17 00:00:00 2001 From: Keshav Malik Date: Wed, 12 Aug 2026 00:33:09 +0530 Subject: [PATCH 0241/2098] Recognize RequireAntiforgeryToken attributes --- .../MissingAntiForgeryTokenValidation.ql | 80 +++++++- .../2026-08-09-require-antiforgery-token.md | 4 + .../MissingAntiForgeryTokenValidation.cs | 27 +++ ...MissingAntiForgeryTokenValidation.expected | 0 .../MissingAntiForgeryTokenValidation.qlref | 1 + .../disabled-require-antiforgery/options | 2 + .../MissingAntiForgeryTokenValidation.cs | 175 ++++++++++++++++++ ...MissingAntiForgeryTokenValidation.expected | 10 +- .../MissingAntiForgeryTokenValidation.cs | 19 ++ ...MissingAntiForgeryTokenValidation.expected | 1 + .../MissingAntiForgeryTokenValidation.qlref | 1 + .../options | 2 + 12 files changed, 318 insertions(+), 4 deletions(-) create mode 100644 csharp/ql/src/change-notes/2026-08-09-require-antiforgery-token.md create mode 100644 csharp/ql/test/query-tests/Security Features/CWE-352/disabled-require-antiforgery/MissingAntiForgeryTokenValidation.cs create mode 100644 csharp/ql/test/query-tests/Security Features/CWE-352/disabled-require-antiforgery/MissingAntiForgeryTokenValidation.expected create mode 100644 csharp/ql/test/query-tests/Security Features/CWE-352/disabled-require-antiforgery/MissingAntiForgeryTokenValidation.qlref create mode 100644 csharp/ql/test/query-tests/Security Features/CWE-352/disabled-require-antiforgery/options create mode 100644 csharp/ql/test/query-tests/Security Features/CWE-352/require-antiforgery-without-middleware/MissingAntiForgeryTokenValidation.cs create mode 100644 csharp/ql/test/query-tests/Security Features/CWE-352/require-antiforgery-without-middleware/MissingAntiForgeryTokenValidation.expected create mode 100644 csharp/ql/test/query-tests/Security Features/CWE-352/require-antiforgery-without-middleware/MissingAntiForgeryTokenValidation.qlref create mode 100644 csharp/ql/test/query-tests/Security Features/CWE-352/require-antiforgery-without-middleware/options diff --git a/csharp/ql/src/Security Features/CWE-352/MissingAntiForgeryTokenValidation.ql b/csharp/ql/src/Security Features/CWE-352/MissingAntiForgeryTokenValidation.ql index 60a022d43d0f..a1cb7f9f506a 100644 --- a/csharp/ql/src/Security Features/CWE-352/MissingAntiForgeryTokenValidation.ql +++ b/csharp/ql/src/Security Features/CWE-352/MissingAntiForgeryTokenValidation.ql @@ -51,6 +51,80 @@ predicate hasGlobalAntiForgeryFilter() { ) } +private class RequireAntiforgeryTokenAttribute extends Attribute { + RequireAntiforgeryTokenAttribute() { + this.getType() + .hasFullyQualifiedName("Microsoft.AspNetCore.Antiforgery", + "RequireAntiforgeryTokenAttribute") + } + + predicate requiresValidation() { + not exists(this.getArgument(0)) + or + this.getArgument(0).isImplicit() + or + this.getArgument(0).getValue() = "true" + } +} + +private predicate hasAspNetCoreAntiForgeryMiddleware() { + exists(MethodCall call | + call.getTarget() + .hasFullyQualifiedName("Microsoft.AspNetCore.Builder", + "AntiforgeryApplicationBuilderExtensions", "UseAntiforgery") + ) +} + +bindingset[method] +private RequireAntiforgeryTokenAttribute getEffectiveRequireAntiforgeryTokenAttributeOnMethod( + Method method +) { + exists(Method attributedMethod | + attributedMethod = method.getOverridee*() and + result = attributedMethod.getAnAttribute() and + not exists(Method closerMethod | + closerMethod = method.getOverridee*() and + closerMethod.getOverridee+() = attributedMethod and + closerMethod.getAnAttribute() instanceof RequireAntiforgeryTokenAttribute + ) + ) +} + +bindingset[controller] +private RequireAntiforgeryTokenAttribute getEffectiveRequireAntiforgeryTokenAttributeOnClass( + Class controller +) { + exists(Class attributedClass | + attributedClass = controller.getBaseClass*() and + result = attributedClass.getAnAttribute() and + not exists(Class closerClass | + closerClass = controller.getBaseClass*() and + closerClass.getBaseClass+() = attributedClass and + closerClass.getAnAttribute() instanceof RequireAntiforgeryTokenAttribute + ) + ) +} + +bindingset[controller, method] +private RequireAntiforgeryTokenAttribute getEffectiveRequireAntiforgeryTokenAttribute( + Class controller, Method method +) { + result = getEffectiveRequireAntiforgeryTokenAttributeOnMethod(method) + or + not exists(getEffectiveRequireAntiforgeryTokenAttributeOnMethod(method)) and + result = getEffectiveRequireAntiforgeryTokenAttributeOnClass(controller) +} + +bindingset[controller, method] +private predicate hasAspNetCoreAntiForgeryValidation(Class controller, Method method) { + method.getAnAttribute() instanceof AspNetCore::ValidateAntiForgeryAttribute + or + controller.getABaseType*().getAnAttribute() instanceof AspNetCore::ValidateAntiForgeryAttribute + or + hasAspNetCoreAntiForgeryMiddleware() and + getEffectiveRequireAntiforgeryTokenAttribute(controller, method).requiresValidation() +} + predicate isUnvalidatedPostMethod(Class c, Method m) { c.(Controller).getAPostActionMethod() = m and not m.getAnAttribute() instanceof ValidateAntiForgeryTokenAttribute and @@ -58,14 +132,16 @@ predicate isUnvalidatedPostMethod(Class c, Method m) { or c.(AspNetCore::MicrosoftAspNetCoreMvcController).getAnActionMethod() = m and m.getAnAttribute() instanceof AspNetCore::MicrosoftAspNetCoreMvcHttpPostAttribute and - not m.getAnAttribute() instanceof AspNetCore::ValidateAntiForgeryAttribute and - not c.getABaseType*().getAnAttribute() instanceof AspNetCore::ValidateAntiForgeryAttribute + not hasAspNetCoreAntiForgeryValidation(c, m) } Element getAValidatedElement() { any(ValidateAntiForgeryTokenAttribute a).getTarget() = result or any(AspNetCore::ValidateAntiForgeryAttribute a).getTarget() = result + or + hasAspNetCoreAntiForgeryMiddleware() and + any(RequireAntiforgeryTokenAttribute a | a.requiresValidation()).getTarget() = result } from Class c, Method postMethod diff --git a/csharp/ql/src/change-notes/2026-08-09-require-antiforgery-token.md b/csharp/ql/src/change-notes/2026-08-09-require-antiforgery-token.md new file mode 100644 index 000000000000..ce1b6e9418fe --- /dev/null +++ b/csharp/ql/src/change-notes/2026-08-09-require-antiforgery-token.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `cs/web/missing-token-validation` query now recognizes enabled ASP.NET Core `RequireAntiforgeryToken` attributes when antiforgery middleware is used. diff --git a/csharp/ql/test/query-tests/Security Features/CWE-352/disabled-require-antiforgery/MissingAntiForgeryTokenValidation.cs b/csharp/ql/test/query-tests/Security Features/CWE-352/disabled-require-antiforgery/MissingAntiForgeryTokenValidation.cs new file mode 100644 index 000000000000..32a6e8326555 --- /dev/null +++ b/csharp/ql/test/query-tests/Security Features/CWE-352/disabled-require-antiforgery/MissingAntiForgeryTokenValidation.cs @@ -0,0 +1,27 @@ +using Microsoft.AspNetCore.Antiforgery; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Mvc; + +public class HomeController : Controller +{ + [HttpPost] + [RequireAntiforgeryToken(false)] + public ActionResult DisabledValidation() + { + return View(); + } + + [HttpPost] + public ActionResult MissingValidation() + { + return View(); + } +} + +public class Startup +{ + public void Configure(IApplicationBuilder app) + { + app.UseAntiforgery(); + } +} diff --git a/csharp/ql/test/query-tests/Security Features/CWE-352/disabled-require-antiforgery/MissingAntiForgeryTokenValidation.expected b/csharp/ql/test/query-tests/Security Features/CWE-352/disabled-require-antiforgery/MissingAntiForgeryTokenValidation.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/csharp/ql/test/query-tests/Security Features/CWE-352/disabled-require-antiforgery/MissingAntiForgeryTokenValidation.qlref b/csharp/ql/test/query-tests/Security Features/CWE-352/disabled-require-antiforgery/MissingAntiForgeryTokenValidation.qlref new file mode 100644 index 000000000000..5e1ab2426c65 --- /dev/null +++ b/csharp/ql/test/query-tests/Security Features/CWE-352/disabled-require-antiforgery/MissingAntiForgeryTokenValidation.qlref @@ -0,0 +1 @@ +query: Security Features/CWE-352/MissingAntiForgeryTokenValidation.ql diff --git a/csharp/ql/test/query-tests/Security Features/CWE-352/disabled-require-antiforgery/options b/csharp/ql/test/query-tests/Security Features/CWE-352/disabled-require-antiforgery/options new file mode 100644 index 000000000000..698ad488b6d4 --- /dev/null +++ b/csharp/ql/test/query-tests/Security Features/CWE-352/disabled-require-antiforgery/options @@ -0,0 +1,2 @@ +semmle-extractor-options: /nostdlib /noconfig +semmle-extractor-options: --load-sources-from-project:${testdir}/../../../../resources/stubs/_frameworks/Microsoft.AspNetCore.App/Microsoft.AspNetCore.App.csproj diff --git a/csharp/ql/test/query-tests/Security Features/CWE-352/missing-aspnetcore/MissingAntiForgeryTokenValidation.cs b/csharp/ql/test/query-tests/Security Features/CWE-352/missing-aspnetcore/MissingAntiForgeryTokenValidation.cs index febc12a61255..123ac0f7ec26 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-352/missing-aspnetcore/MissingAntiForgeryTokenValidation.cs +++ b/csharp/ql/test/query-tests/Security Features/CWE-352/missing-aspnetcore/MissingAntiForgeryTokenValidation.cs @@ -1,7 +1,12 @@ using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Antiforgery; +using Microsoft.AspNetCore.Builder; public class HomeController : Controller { + private const bool ValidationEnabled = true; + private const bool ValidationDisabled = false; + // BAD: Anti forgery token has been forgotten [HttpPost] public ActionResult Login() // $ Alert @@ -17,6 +22,46 @@ public ActionResult UpdateDetails() return View(); } + // GOOD: Anti forgery token is required by ASP.NET Core middleware + [HttpPost] + [RequireAntiforgeryToken] + public ActionResult UpdateProfile() + { + return View(); + } + + // GOOD: Explicitly requires anti forgery validation + [HttpPost] + [RequireAntiforgeryToken(true)] + public ActionResult UpdatePreferences() + { + return View(); + } + + // GOOD: Named and constant arguments are supported + [HttpPost] + [RequireAntiforgeryToken(required: ValidationEnabled)] + public ActionResult UpdateSettings() + { + return View(); + } + + // BAD: Explicitly disables anti forgery validation + [HttpPost] + [RequireAntiforgeryToken(false)] + public ActionResult DisabledValidation() // $ Alert + { + return View(); + } + + // BAD: A false constant also disables anti forgery validation + [HttpPost] + [RequireAntiforgeryToken(ValidationDisabled)] + public ActionResult ConstantDisabledValidation() // $ Alert + { + return View(); + } + // No validation required, as this is a GET method. public ActionResult ShowHelp() { @@ -46,6 +91,110 @@ public ActionResult InheritedValidation() } } +// GOOD: Base class requires anti forgery validation +[RequireAntiforgeryToken] +public abstract class AntiforgeryBaseController : Controller +{ +} + +public abstract class IntermediateAntiforgeryController : AntiforgeryBaseController +{ +} + +public class DerivedAntiforgeryController : IntermediateAntiforgeryController +{ + [HttpPost] + public ActionResult InheritedRequiredValidation() + { + return View(); + } +} + +[RequireAntiforgeryToken] +public class ProtectedController : Controller +{ + // GOOD: Controller requires anti forgery validation + [HttpPost] + public ActionResult ProtectedAction() + { + return View(); + } + + // BAD: Action-level metadata overrides the controller metadata + [HttpPost] + [RequireAntiforgeryToken(false)] + public ActionResult DisabledAction() // $ Alert + { + return View(); + } +} + +[RequireAntiforgeryToken(false)] +public class DisabledController : Controller +{ + // BAD: Controller explicitly disables anti forgery validation + [HttpPost] + public ActionResult DisabledControllerAction() // $ Alert + { + return View(); + } + + // GOOD: Action-level metadata overrides the controller metadata + [HttpPost] + [RequireAntiforgeryToken(true)] + public ActionResult EnabledAction() + { + return View(); + } +} + +[RequireAntiforgeryToken] +public abstract class ProtectedBaseController : Controller +{ +} + +[RequireAntiforgeryToken(false)] +public class DisabledDerivedController : ProtectedBaseController +{ + // BAD: Derived controller metadata overrides base controller metadata + [HttpPost] + public ActionResult DisabledInheritedAction() // $ Alert + { + return View(); + } +} + +[AutoValidateAntiforgeryToken] +public class FilterProtectedController : Controller +{ + // GOOD: Disabled middleware metadata does not disable the MVC filter + [HttpPost] + [RequireAntiforgeryToken(false)] + public ActionResult FilterProtectedAction() + { + return View(); + } +} + +public abstract class MethodMetadataBaseController : Controller +{ + [RequireAntiforgeryToken] + public virtual ActionResult InheritedMethodValidation() + { + return View(); + } +} + +public class MethodMetadataController : MethodMetadataBaseController +{ + // GOOD: Method metadata is inherited by the override + [HttpPost] + public override ActionResult InheritedMethodValidation() + { + return View(); + } +} + // BAD: Base class without antiforgery attribute public abstract class UnprotectedBaseController : Controller { @@ -60,3 +209,29 @@ public ActionResult NoInheritedValidation() // $ Alert return View(); } } + +namespace Custom +{ + public class RequireAntiforgeryTokenAttribute : System.Attribute + { + } + + public class CustomAttributeController : Controller + { + // BAD: An unrelated attribute with the same name does not provide validation + [HttpPost] + [RequireAntiforgeryToken] + public ActionResult LookalikeAttribute() // $ Alert + { + return View(); + } + } +} + +public class Startup +{ + public void Configure(IApplicationBuilder app) + { + app.UseAntiforgery(); + } +} diff --git a/csharp/ql/test/query-tests/Security Features/CWE-352/missing-aspnetcore/MissingAntiForgeryTokenValidation.expected b/csharp/ql/test/query-tests/Security Features/CWE-352/missing-aspnetcore/MissingAntiForgeryTokenValidation.expected index 360b909cd0fa..ceb32e94c984 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-352/missing-aspnetcore/MissingAntiForgeryTokenValidation.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-352/missing-aspnetcore/MissingAntiForgeryTokenValidation.expected @@ -1,2 +1,8 @@ -| MissingAntiForgeryTokenValidation.cs:7:25:7:29 | Login | Method 'Login' handles a POST request without performing CSRF token validation. | -| MissingAntiForgeryTokenValidation.cs:58:25:58:45 | NoInheritedValidation | Method 'NoInheritedValidation' handles a POST request without performing CSRF token validation. | +| MissingAntiForgeryTokenValidation.cs:12:25:12:29 | Login | Method 'Login' handles a POST request without performing CSRF token validation. | +| MissingAntiForgeryTokenValidation.cs:52:25:52:42 | DisabledValidation | Method 'DisabledValidation' handles a POST request without performing CSRF token validation. | +| MissingAntiForgeryTokenValidation.cs:60:25:60:50 | ConstantDisabledValidation | Method 'ConstantDisabledValidation' handles a POST request without performing CSRF token validation. | +| MissingAntiForgeryTokenValidation.cs:126:25:126:38 | DisabledAction | Method 'DisabledAction' handles a POST request without performing CSRF token validation. | +| MissingAntiForgeryTokenValidation.cs:137:25:137:48 | DisabledControllerAction | Method 'DisabledControllerAction' handles a POST request without performing CSRF token validation. | +| MissingAntiForgeryTokenValidation.cs:161:25:161:47 | DisabledInheritedAction | Method 'DisabledInheritedAction' handles a POST request without performing CSRF token validation. | +| MissingAntiForgeryTokenValidation.cs:207:25:207:45 | NoInheritedValidation | Method 'NoInheritedValidation' handles a POST request without performing CSRF token validation. | +| MissingAntiForgeryTokenValidation.cs:224:29:224:46 | LookalikeAttribute | Method 'LookalikeAttribute' handles a POST request without performing CSRF token validation. | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-352/require-antiforgery-without-middleware/MissingAntiForgeryTokenValidation.cs b/csharp/ql/test/query-tests/Security Features/CWE-352/require-antiforgery-without-middleware/MissingAntiForgeryTokenValidation.cs new file mode 100644 index 000000000000..9943c21aff3f --- /dev/null +++ b/csharp/ql/test/query-tests/Security Features/CWE-352/require-antiforgery-without-middleware/MissingAntiForgeryTokenValidation.cs @@ -0,0 +1,19 @@ +using Microsoft.AspNetCore.Antiforgery; +using Microsoft.AspNetCore.Mvc; + +public class HomeController : Controller +{ + [HttpPost] + [ValidateAntiForgeryToken] + public ActionResult FilterValidated() + { + return View(); + } + + [HttpPost] + [RequireAntiforgeryToken] + public ActionResult MetadataWithoutMiddleware() // $ Alert + { + return View(); + } +} diff --git a/csharp/ql/test/query-tests/Security Features/CWE-352/require-antiforgery-without-middleware/MissingAntiForgeryTokenValidation.expected b/csharp/ql/test/query-tests/Security Features/CWE-352/require-antiforgery-without-middleware/MissingAntiForgeryTokenValidation.expected new file mode 100644 index 000000000000..2b5360166026 --- /dev/null +++ b/csharp/ql/test/query-tests/Security Features/CWE-352/require-antiforgery-without-middleware/MissingAntiForgeryTokenValidation.expected @@ -0,0 +1 @@ +| MissingAntiForgeryTokenValidation.cs:15:25:15:49 | MetadataWithoutMiddleware | Method 'MetadataWithoutMiddleware' handles a POST request without performing CSRF token validation. | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-352/require-antiforgery-without-middleware/MissingAntiForgeryTokenValidation.qlref b/csharp/ql/test/query-tests/Security Features/CWE-352/require-antiforgery-without-middleware/MissingAntiForgeryTokenValidation.qlref new file mode 100644 index 000000000000..5e1ab2426c65 --- /dev/null +++ b/csharp/ql/test/query-tests/Security Features/CWE-352/require-antiforgery-without-middleware/MissingAntiForgeryTokenValidation.qlref @@ -0,0 +1 @@ +query: Security Features/CWE-352/MissingAntiForgeryTokenValidation.ql diff --git a/csharp/ql/test/query-tests/Security Features/CWE-352/require-antiforgery-without-middleware/options b/csharp/ql/test/query-tests/Security Features/CWE-352/require-antiforgery-without-middleware/options new file mode 100644 index 000000000000..698ad488b6d4 --- /dev/null +++ b/csharp/ql/test/query-tests/Security Features/CWE-352/require-antiforgery-without-middleware/options @@ -0,0 +1,2 @@ +semmle-extractor-options: /nostdlib /noconfig +semmle-extractor-options: --load-sources-from-project:${testdir}/../../../../resources/stubs/_frameworks/Microsoft.AspNetCore.App/Microsoft.AspNetCore.App.csproj From 399582580fb26d42844a90ce96ecc3ffeae306d1 Mon Sep 17 00:00:00 2001 From: Lalith Chaitanya Mangalagiri Date: Tue, 11 Aug 2026 21:32:11 -0700 Subject: [PATCH 0242/2098] Rust: Add command injection query (CWE-078) Detects user-controlled data flowing into std::process::Command and tokio::process::Command (both command name and arguments). - Extension library with sources, sinks, and barriers - Models-as-data sinks for Command::new, .arg(), .args() (std + tokio) - Query help (.qhelp) with examples - Test cases with inline expectations Query ID: rust/command-line-injection --- .../rust/frameworks/stdlib/process.model.yml | 15 ++++ .../security/CommandInjectionExtensions.qll | 64 ++++++++++++++++ .../security/CWE-078/CommandInjection.qhelp | 40 ++++++++++ .../security/CWE-078/CommandInjection.ql | 42 +++++++++++ .../security/CWE-078/CommandInjectionBad.rs | 10 +++ .../security/CWE-078/CommandInjectionGood.rs | 13 ++++ .../security/CWE-078/CommandInjection.qlref | 4 + .../test/query-tests/security/CWE-078/main.rs | 75 +++++++++++++++++++ .../query-tests/security/CWE-078/options.yml | 4 + 9 files changed, 267 insertions(+) create mode 100644 rust/ql/lib/codeql/rust/frameworks/stdlib/process.model.yml create mode 100644 rust/ql/lib/codeql/rust/security/CommandInjectionExtensions.qll create mode 100644 rust/ql/src/queries/security/CWE-078/CommandInjection.qhelp create mode 100644 rust/ql/src/queries/security/CWE-078/CommandInjection.ql create mode 100644 rust/ql/src/queries/security/CWE-078/CommandInjectionBad.rs create mode 100644 rust/ql/src/queries/security/CWE-078/CommandInjectionGood.rs create mode 100644 rust/ql/test/query-tests/security/CWE-078/CommandInjection.qlref create mode 100644 rust/ql/test/query-tests/security/CWE-078/main.rs create mode 100644 rust/ql/test/query-tests/security/CWE-078/options.yml diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/process.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/process.model.yml new file mode 100644 index 000000000000..0187f073d679 --- /dev/null +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/process.model.yml @@ -0,0 +1,15 @@ +extensions: + - addsTo: + pack: codeql/rust-all + extensible: sinkModel + data: + # std::process::Command - the command name itself + - ["::new", "Argument[0]", "command-injection", "manual"] + # std::process::Command - arguments passed to the command + - ["::arg", "Argument[0]", "command-injection", "manual"] + - ["::args", "Argument[0]", "command-injection", "manual"] + # tokio::process::Command - the command name itself + - ["::new", "Argument[0]", "command-injection", "manual"] + # tokio::process::Command - arguments passed to the command + - ["::arg", "Argument[0]", "command-injection", "manual"] + - ["::args", "Argument[0]", "command-injection", "manual"] diff --git a/rust/ql/lib/codeql/rust/security/CommandInjectionExtensions.qll b/rust/ql/lib/codeql/rust/security/CommandInjectionExtensions.qll new file mode 100644 index 000000000000..7e0150d53f66 --- /dev/null +++ b/rust/ql/lib/codeql/rust/security/CommandInjectionExtensions.qll @@ -0,0 +1,64 @@ +/** + * Provides classes and predicates for reasoning about command injection + * vulnerabilities (CWE-078). + */ + +import rust +private import codeql.rust.dataflow.DataFlow +private import codeql.rust.dataflow.FlowSink +private import codeql.rust.dataflow.FlowBarrier +private import codeql.rust.Concepts +private import codeql.rust.security.Barriers as Barriers + +/** + * Provides default sources, sinks and barriers for detecting command injection + * vulnerabilities, as well as extension points for adding your own. + */ +module CommandInjection { + /** + * A data flow source for command injection vulnerabilities. + */ + abstract class Source extends DataFlow::Node { } + + /** + * A data flow sink for command injection vulnerabilities. + */ + abstract class Sink extends QuerySink::Range { + override string getSinkType() { result = "CommandInjection" } + } + + /** + * A barrier for command injection vulnerabilities. + */ + abstract class Barrier extends DataFlow::Node { } + + /** + * An active threat-model source, considered as a flow source. + */ + private class ActiveThreatModelSourceAsSource extends Source, ActiveThreatModelSource { } + + /** + * A sink for command injection from model data. + */ + private class ModelsAsDataSink extends Sink { + ModelsAsDataSink() { sinkNode(this, "command-injection") } + } + + /** + * A barrier for command injection from model data. + */ + private class ModelsAsDataBarrier extends Barrier { + ModelsAsDataBarrier() { barrierNode(this, "command-injection") } + } + + /** + * A barrier for command injection vulnerabilities for nodes whose type is a + * numeric type, which is unlikely to expose any vulnerability. + */ + private class NumericTypeBarrier extends Barrier instanceof Barriers::NumericTypeBarrier { } + + private class BooleanTypeBarrier extends Barrier instanceof Barriers::BooleanTypeBarrier { } + + private class FieldlessEnumTypeBarrier extends Barrier instanceof Barriers::FieldlessEnumTypeBarrier + { } +} diff --git a/rust/ql/src/queries/security/CWE-078/CommandInjection.qhelp b/rust/ql/src/queries/security/CWE-078/CommandInjection.qhelp new file mode 100644 index 000000000000..3e7b336090b4 --- /dev/null +++ b/rust/ql/src/queries/security/CWE-078/CommandInjection.qhelp @@ -0,0 +1,40 @@ + + + + +

+If a system command is built from user-provided data without sufficient sanitization, a user may be able to run malicious commands. An attacker can craft input to change the meaning of the command, potentially gaining control of the system. +

+ +
+ + +

+If possible, use hard-coded string literals for commands. If the command must be built from user-provided data, do not pass user input directly to shell commands. Instead, use APIs that accept command arguments as separate parameters (such as std::process::Command with individual .arg() calls for each argument), which avoids shell interpretation of special characters. If shell execution is necessary, validate and sanitize user input against an allowlist of permitted values. +

+ +
+ + +

+In the following example, a command is constructed directly from user-controlled input obtained via an HTTP request. An attacker could supply a malicious value to execute arbitrary commands. +

+ + + +

+A safer approach uses a fixed command with validated arguments, or avoids shell interpretation entirely: +

+ + + +
+ + +
  • OWASP: Command Injection.
  • +
  • Wikipedia: Shell injection.
  • + +
    +
    diff --git a/rust/ql/src/queries/security/CWE-078/CommandInjection.ql b/rust/ql/src/queries/security/CWE-078/CommandInjection.ql new file mode 100644 index 000000000000..b6e93a8d88a1 --- /dev/null +++ b/rust/ql/src/queries/security/CWE-078/CommandInjection.ql @@ -0,0 +1,42 @@ +/** + * @name Uncontrolled command line + * @description Using externally controlled strings in a command line may allow a malicious + * user to change the meaning of the command. + * @kind path-problem + * @problem.severity error + * @security-severity 9.8 + * @precision high + * @id rust/command-line-injection + * @tags security + * external/cwe/cwe-078 + * external/cwe/cwe-088 + */ + +import rust +import codeql.rust.dataflow.DataFlow +import codeql.rust.dataflow.TaintTracking +import codeql.rust.security.CommandInjectionExtensions + +/** + * A taint configuration for detecting command injection vulnerabilities. + */ +module CommandInjectionConfig implements DataFlow::ConfigSig { + import CommandInjection + + predicate isSource(DataFlow::Node node) { node instanceof Source } + + predicate isSink(DataFlow::Node node) { node instanceof Sink } + + predicate isBarrier(DataFlow::Node barrier) { barrier instanceof Barrier } + + predicate observeDiffInformedIncrementalMode() { any() } +} + +module CommandInjectionFlow = TaintTracking::Global; + +import CommandInjectionFlow::PathGraph + +from CommandInjectionFlow::PathNode sourceNode, CommandInjectionFlow::PathNode sinkNode +where CommandInjectionFlow::flowPath(sourceNode, sinkNode) +select sinkNode.getNode(), sourceNode, sinkNode, "This command line depends on a $@.", + sourceNode.getNode(), "user-provided value" diff --git a/rust/ql/src/queries/security/CWE-078/CommandInjectionBad.rs b/rust/ql/src/queries/security/CWE-078/CommandInjectionBad.rs new file mode 100644 index 000000000000..fa81cef9fe15 --- /dev/null +++ b/rust/ql/src/queries/security/CWE-078/CommandInjectionBad.rs @@ -0,0 +1,10 @@ +use std::process::Command; + +fn handle_request(user_input: &str) { + // BAD: user input is passed directly to a shell command + Command::new("sh") + .arg("-c") + .arg(user_input) + .output() + .expect("failed to execute"); +} diff --git a/rust/ql/src/queries/security/CWE-078/CommandInjectionGood.rs b/rust/ql/src/queries/security/CWE-078/CommandInjectionGood.rs new file mode 100644 index 000000000000..bb720d39d03e --- /dev/null +++ b/rust/ql/src/queries/security/CWE-078/CommandInjectionGood.rs @@ -0,0 +1,13 @@ +use std::process::Command; + +fn handle_request(filename: &str) { + // GOOD: use a fixed command with the user input as a separate argument, + // avoiding shell interpretation + let allowed_names = ["report.pdf", "summary.txt", "data.csv"]; + if allowed_names.contains(&filename) { + Command::new("cat") + .arg(filename) + .output() + .expect("failed to execute"); + } +} diff --git a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.qlref b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.qlref new file mode 100644 index 000000000000..3b14f15fafe6 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.qlref @@ -0,0 +1,4 @@ +query: queries/security/CWE-078/CommandInjection.ql +postprocess: + - utils/test/PrettyPrintModels.ql + - utils/test/InlineExpectationsTestQuery.ql diff --git a/rust/ql/test/query-tests/security/CWE-078/main.rs b/rust/ql/test/query-tests/security/CWE-078/main.rs new file mode 100644 index 000000000000..eecf95cec33d --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-078/main.rs @@ -0,0 +1,75 @@ +use std::process::Command; + +fn test_std_command_injection() { + let arg_string = std::env::args().nth(1).unwrap_or(String::from("ls")); // $ Source=args1 + let remote_string = reqwest::blocking::get("http://example.com/") // $ Source=remote1 + .unwrap() + .text() + .unwrap_or(String::from("ls")); + let const_string = String::from("echo hello"); + + // --- safe cases --- + + // Constant command and argument + Command::new("ls") + .arg("-la") + .output() + .expect("failed"); // safe + + // Constant constructed command + Command::new(const_string.as_str()) + .output() + .expect("failed"); // safe + + // --- unsafe cases --- + + // User input as the command itself + Command::new(arg_string.as_str()) // $ Alert[rust/command-line-injection]=args1 + .output() + .expect("failed"); + + // User input as an argument to sh -c + Command::new("sh") + .arg("-c") + .arg(remote_string.as_str()) // $ Alert[rust/command-line-injection]=remote1 + .output() + .expect("failed"); + + // User input as an argument + Command::new("grep") + .arg(arg_string.as_str()) // $ Alert[rust/command-line-injection]=args1 + .arg("file.txt") + .output() + .expect("failed"); + + // Remote input via args() + Command::new("bash") + .args(&["-c", remote_string.as_str()]) // $ Alert[rust/command-line-injection]=remote1 + .output() + .expect("failed"); +} + +async fn test_tokio_command_injection() { + let remote_string = reqwest::blocking::get("http://example.com/") // $ Source=remote2 + .unwrap() + .text() + .unwrap_or(String::from("ls")); + + // Unsafe: remote input as tokio command + let _output = tokio::process::Command::new(remote_string.as_str()) // $ Alert[rust/command-line-injection]=remote2 + .output() + .await + .expect("failed"); + + // Unsafe: remote input as tokio command argument + tokio::process::Command::new("sh") + .arg("-c") + .arg(remote_string.as_str()) // $ Alert[rust/command-line-injection]=remote2 + .output() + .await + .expect("failed"); +} + +fn main() { + test_std_command_injection(); +} diff --git a/rust/ql/test/query-tests/security/CWE-078/options.yml b/rust/ql/test/query-tests/security/CWE-078/options.yml new file mode 100644 index 000000000000..78cb2f883af1 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-078/options.yml @@ -0,0 +1,4 @@ +qltest_cargo_check: true +qltest_dependencies: + - reqwest = { version = "0.12.9", features = ["blocking"] } + - tokio = { version = "1", features = ["full"] } From 3a3bea52802e1280d237848743fba5702fc9b458 Mon Sep 17 00:00:00 2001 From: Lalith Chaitanya Mangalagiri Date: Tue, 11 Aug 2026 21:33:14 -0700 Subject: [PATCH 0243/2098] Rust: Add unsafe deserialization query (CWE-502) Detects user-controlled data flowing into deserialization functions (serde_json, bincode, rmp_serde, ciborium, serde_yaml, toml). - Extension library with sources, sinks, and barriers - Models-as-data sink definitions - Query help (.qhelp) with examples - Test cases with inline expectations Query ID: rust/unsafe-deserialization --- .../codeql/rust/frameworks/serde.model.yml | 24 +++++++ .../UnsafeDeserializationExtensions.qll | 64 ++++++++++++++++++ .../CWE-502/UnsafeDeserialization.qhelp | 46 +++++++++++++ .../security/CWE-502/UnsafeDeserialization.ql | 42 ++++++++++++ .../CWE-502/UnsafeDeserializationBad.rs | 12 ++++ .../CWE-502/UnsafeDeserializationGood.rs | 30 +++++++++ .../CWE-502/UnsafeDeserialization.qlref | 4 ++ .../test/query-tests/security/CWE-502/main.rs | 66 +++++++++++++++++++ .../query-tests/security/CWE-502/options.yml | 6 ++ 9 files changed, 294 insertions(+) create mode 100644 rust/ql/lib/codeql/rust/frameworks/serde.model.yml create mode 100644 rust/ql/lib/codeql/rust/security/UnsafeDeserializationExtensions.qll create mode 100644 rust/ql/src/queries/security/CWE-502/UnsafeDeserialization.qhelp create mode 100644 rust/ql/src/queries/security/CWE-502/UnsafeDeserialization.ql create mode 100644 rust/ql/src/queries/security/CWE-502/UnsafeDeserializationBad.rs create mode 100644 rust/ql/src/queries/security/CWE-502/UnsafeDeserializationGood.rs create mode 100644 rust/ql/test/query-tests/security/CWE-502/UnsafeDeserialization.qlref create mode 100644 rust/ql/test/query-tests/security/CWE-502/main.rs create mode 100644 rust/ql/test/query-tests/security/CWE-502/options.yml diff --git a/rust/ql/lib/codeql/rust/frameworks/serde.model.yml b/rust/ql/lib/codeql/rust/frameworks/serde.model.yml new file mode 100644 index 000000000000..3d3c8d63ef85 --- /dev/null +++ b/rust/ql/lib/codeql/rust/frameworks/serde.model.yml @@ -0,0 +1,24 @@ +extensions: + - addsTo: + pack: codeql/rust-all + extensible: sinkModel + data: + # serde_json deserialization functions + - ["crate::serde_json::from_str", "Argument[0]", "unsafe-deserialization", "manual"] + - ["crate::serde_json::from_slice", "Argument[0]", "unsafe-deserialization", "manual"] + - ["crate::serde_json::from_reader", "Argument[0]", "unsafe-deserialization", "manual"] + - ["crate::serde_json::from_value", "Argument[0]", "unsafe-deserialization", "manual"] + # bincode deserialization functions + - ["crate::bincode::deserialize", "Argument[0]", "unsafe-deserialization", "manual"] + - ["crate::bincode::deserialize_from", "Argument[0]", "unsafe-deserialization", "manual"] + # rmp_serde (MessagePack) deserialization functions + - ["crate::rmp_serde::from_slice", "Argument[0]", "unsafe-deserialization", "manual"] + - ["crate::rmp_serde::from_read", "Argument[0]", "unsafe-deserialization", "manual"] + # ciborium (CBOR) deserialization functions + - ["crate::ciborium::from_reader", "Argument[0]", "unsafe-deserialization", "manual"] + # serde_yaml deserialization functions + - ["crate::serde_yaml::from_str", "Argument[0]", "unsafe-deserialization", "manual"] + - ["crate::serde_yaml::from_slice", "Argument[0]", "unsafe-deserialization", "manual"] + - ["crate::serde_yaml::from_reader", "Argument[0]", "unsafe-deserialization", "manual"] + # toml deserialization + - ["crate::toml::from_str", "Argument[0]", "unsafe-deserialization", "manual"] diff --git a/rust/ql/lib/codeql/rust/security/UnsafeDeserializationExtensions.qll b/rust/ql/lib/codeql/rust/security/UnsafeDeserializationExtensions.qll new file mode 100644 index 000000000000..70b0c55184c0 --- /dev/null +++ b/rust/ql/lib/codeql/rust/security/UnsafeDeserializationExtensions.qll @@ -0,0 +1,64 @@ +/** + * Provides classes and predicates for reasoning about unsafe deserialization + * vulnerabilities (CWE-502). + */ + +import rust +private import codeql.rust.dataflow.DataFlow +private import codeql.rust.dataflow.FlowSink +private import codeql.rust.dataflow.FlowBarrier +private import codeql.rust.Concepts +private import codeql.rust.security.Barriers as Barriers + +/** + * Provides default sources, sinks and barriers for detecting unsafe deserialization + * vulnerabilities, as well as extension points for adding your own. + */ +module UnsafeDeserialization { + /** + * A data flow source for unsafe deserialization vulnerabilities. + */ + abstract class Source extends DataFlow::Node { } + + /** + * A data flow sink for unsafe deserialization vulnerabilities. + */ + abstract class Sink extends QuerySink::Range { + override string getSinkType() { result = "UnsafeDeserialization" } + } + + /** + * A barrier for unsafe deserialization vulnerabilities. + */ + abstract class Barrier extends DataFlow::Node { } + + /** + * An active threat-model source, considered as a flow source. + */ + private class ActiveThreatModelSourceAsSource extends Source, ActiveThreatModelSource { } + + /** + * A sink for unsafe deserialization from model data. + */ + private class ModelsAsDataSink extends Sink { + ModelsAsDataSink() { sinkNode(this, "unsafe-deserialization") } + } + + /** + * A barrier for unsafe deserialization from model data. + */ + private class ModelsAsDataBarrier extends Barrier { + ModelsAsDataBarrier() { barrierNode(this, "unsafe-deserialization") } + } + + /** + * A barrier for unsafe deserialization for nodes whose type is a numeric + * type, which is unlikely to expose any vulnerability. + */ + private class NumericTypeBarrier extends Barrier instanceof Barriers::NumericTypeBarrier { } + + private class BooleanTypeBarrier extends Barrier instanceof Barriers::BooleanTypeBarrier { } + + private class FieldlessEnumTypeBarrier extends Barrier instanceof Barriers::FieldlessEnumTypeBarrier + { } +} diff --git a/rust/ql/src/queries/security/CWE-502/UnsafeDeserialization.qhelp b/rust/ql/src/queries/security/CWE-502/UnsafeDeserialization.qhelp new file mode 100644 index 000000000000..daa155b51fa9 --- /dev/null +++ b/rust/ql/src/queries/security/CWE-502/UnsafeDeserialization.qhelp @@ -0,0 +1,46 @@ + + + + +

    +Deserializing untrusted data without validation can allow an attacker to cause denial of service, consume excessive resources, or in some cases execute arbitrary code. In Rust, while memory safety mitigates some risks, deserializing untrusted data with libraries like serde, bincode, or rmp-serde can still lead to panics, excessive memory allocation, or logic bugs when trait objects or polymorphic types are involved. +

    + +
    + + +

    +Avoid deserializing untrusted data with formats that allow unbounded allocation or polymorphic dispatch. Prefer formats with schema validation (like Protocol Buffers) when processing untrusted input. If using serde, consider: +

    +
      +
    • Validating input size before deserialization.
    • +
    • Using #[serde(deny_unknown_fields)] to reject unexpected data.
    • +
    • Avoiding #[typetag] or trait object deserialization with untrusted input.
    • +
    • Using bounded containers (e.g., limiting Vec length via custom deserializers).
    • +
    + +
    + + +

    +In the following example, data from an HTTP request is directly deserialized without any validation. An attacker could send a crafted payload that causes excessive memory allocation or other unintended behavior. +

    + + + +

    +A safer approach validates the input size and uses strict deserialization settings: +

    + + + +
    + + +
  • OWASP: Deserialization of untrusted data.
  • +
  • CWE-502: Deserialization of Untrusted Data.
  • + +
    +
    diff --git a/rust/ql/src/queries/security/CWE-502/UnsafeDeserialization.ql b/rust/ql/src/queries/security/CWE-502/UnsafeDeserialization.ql new file mode 100644 index 000000000000..ec6490fabee4 --- /dev/null +++ b/rust/ql/src/queries/security/CWE-502/UnsafeDeserialization.ql @@ -0,0 +1,42 @@ +/** + * @name Deserialization of user-controlled data + * @description Deserializing user-controlled data may allow an attacker to trigger unexpected + * code execution, denial of service, or other harmful effects. + * @kind path-problem + * @problem.severity error + * @security-severity 9.8 + * @precision high + * @id rust/unsafe-deserialization + * @tags security + * external/cwe/cwe-502 + */ + +import rust +import codeql.rust.dataflow.DataFlow +import codeql.rust.dataflow.TaintTracking +import codeql.rust.security.UnsafeDeserializationExtensions + +/** + * A taint configuration for detecting unsafe deserialization vulnerabilities. + */ +module UnsafeDeserializationConfig implements DataFlow::ConfigSig { + import UnsafeDeserialization + + predicate isSource(DataFlow::Node node) { node instanceof Source } + + predicate isSink(DataFlow::Node node) { node instanceof Sink } + + predicate isBarrier(DataFlow::Node barrier) { barrier instanceof Barrier } + + predicate observeDiffInformedIncrementalMode() { any() } +} + +module UnsafeDeserializationFlow = TaintTracking::Global; + +import UnsafeDeserializationFlow::PathGraph + +from UnsafeDeserializationFlow::PathNode sourceNode, UnsafeDeserializationFlow::PathNode sinkNode +where UnsafeDeserializationFlow::flowPath(sourceNode, sinkNode) +select sinkNode.getNode(), sourceNode, sinkNode, + "This deserialization operation processes $@ without validation.", sourceNode.getNode(), + "user-provided data" diff --git a/rust/ql/src/queries/security/CWE-502/UnsafeDeserializationBad.rs b/rust/ql/src/queries/security/CWE-502/UnsafeDeserializationBad.rs new file mode 100644 index 000000000000..8e4f2c6b2c0a --- /dev/null +++ b/rust/ql/src/queries/security/CWE-502/UnsafeDeserializationBad.rs @@ -0,0 +1,12 @@ +use serde::Deserialize; + +#[derive(Deserialize)] +struct UserData { + name: String, + items: Vec, +} + +fn handle_request(body: &[u8]) -> UserData { + // BAD: deserializing user-controlled data without size validation + serde_json::from_slice(body).unwrap() +} diff --git a/rust/ql/src/queries/security/CWE-502/UnsafeDeserializationGood.rs b/rust/ql/src/queries/security/CWE-502/UnsafeDeserializationGood.rs new file mode 100644 index 000000000000..a7d69fb48a56 --- /dev/null +++ b/rust/ql/src/queries/security/CWE-502/UnsafeDeserializationGood.rs @@ -0,0 +1,30 @@ +use serde::Deserialize; + +const MAX_BODY_SIZE: usize = 1024 * 1024; // 1 MB limit + +#[derive(Deserialize)] +#[serde(deny_unknown_fields)] +struct UserData { + name: String, + #[serde(deserialize_with = "bounded_vec")] + items: Vec, +} + +fn bounded_vec<'de, D>(deserializer: D) -> Result, D::Error> +where + D: serde::Deserializer<'de>, +{ + let v = Vec::::deserialize(deserializer)?; + if v.len() > 100 { + return Err(serde::de::Error::custom("too many items")); + } + Ok(v) +} + +fn handle_request(body: &[u8]) -> Result { + // GOOD: validate input size before deserialization, use bounded containers + if body.len() > MAX_BODY_SIZE { + return Err("payload too large".to_string()); + } + serde_json::from_slice(body).map_err(|e| e.to_string()) +} diff --git a/rust/ql/test/query-tests/security/CWE-502/UnsafeDeserialization.qlref b/rust/ql/test/query-tests/security/CWE-502/UnsafeDeserialization.qlref new file mode 100644 index 000000000000..26ecd83ac0b3 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-502/UnsafeDeserialization.qlref @@ -0,0 +1,4 @@ +query: queries/security/CWE-502/UnsafeDeserialization.ql +postprocess: + - utils/test/PrettyPrintModels.ql + - utils/test/InlineExpectationsTestQuery.ql diff --git a/rust/ql/test/query-tests/security/CWE-502/main.rs b/rust/ql/test/query-tests/security/CWE-502/main.rs new file mode 100644 index 000000000000..5c607982c36b --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-502/main.rs @@ -0,0 +1,66 @@ +use serde::Deserialize; + +#[derive(Deserialize)] +struct UserData { + name: String, + items: Vec, +} + +#[derive(Deserialize)] +struct Config { + setting: String, +} + +fn test_serde_json_deserialization() { + let remote_bytes = reqwest::blocking::get("http://example.com/") // $ Source=remote1 + .unwrap() + .bytes() + .unwrap(); + let remote_string = reqwest::blocking::get("http://example.com/") // $ Source=remote2 + .unwrap() + .text() + .unwrap_or(String::from("{}")); + let const_string = String::from(r#"{"name": "test", "items": []}"#); + + // --- safe cases --- + + // Constant data deserialization + let _safe: UserData = serde_json::from_str(&const_string).unwrap(); // safe + + // --- unsafe cases --- + + // Remote bytes directly deserialized + let _unsafe1: UserData = serde_json::from_slice(&remote_bytes).unwrap(); // $ Alert[rust/unsafe-deserialization]=remote1 + + // Remote string directly deserialized + let _unsafe2: UserData = serde_json::from_str(&remote_string).unwrap(); // $ Alert[rust/unsafe-deserialization]=remote2 +} + +fn test_bincode_deserialization() { + let remote_bytes = reqwest::blocking::get("http://example.com/data") // $ Source=remote3 + .unwrap() + .bytes() + .unwrap(); + + // Unsafe: remote data deserialized with bincode + let _unsafe: Config = bincode::deserialize(&remote_bytes).unwrap(); // $ Alert[rust/unsafe-deserialization]=remote3 +} + +fn test_safe_with_validation() { + let remote_string = reqwest::blocking::get("http://example.com/") // $ Source=remote4 + .unwrap() + .text() + .unwrap_or(String::from("{}")); + + // Safe: size check before deserialization (still flagged as the barrier + // is not modeled as a data flow barrier, but demonstrates the pattern) + if remote_string.len() < 1024 { + let _data: UserData = serde_json::from_str(&remote_string).unwrap(); // $ Alert[rust/unsafe-deserialization]=remote4 + } +} + +fn main() { + test_serde_json_deserialization(); + test_bincode_deserialization(); + test_safe_with_validation(); +} diff --git a/rust/ql/test/query-tests/security/CWE-502/options.yml b/rust/ql/test/query-tests/security/CWE-502/options.yml new file mode 100644 index 000000000000..f3664c3c1ba7 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-502/options.yml @@ -0,0 +1,6 @@ +qltest_cargo_check: true +qltest_dependencies: + - reqwest = { version = "0.12.9", features = ["blocking"] } + - serde = { version = "1", features = ["derive"] } + - serde_json = { version = "1" } + - bincode = { version = "1" } From 1c65c98ec354f009ea14aeb6d04cff219c9acc0c Mon Sep 17 00:00:00 2001 From: Lalith Chaitanya Mangalagiri Date: Tue, 11 Aug 2026 21:48:38 -0700 Subject: [PATCH 0244/2098] Add change note for rust/unsafe-deserialization query --- rust/ql/src/change-notes/2026-08-11-unsafe-deserialization.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 rust/ql/src/change-notes/2026-08-11-unsafe-deserialization.md diff --git a/rust/ql/src/change-notes/2026-08-11-unsafe-deserialization.md b/rust/ql/src/change-notes/2026-08-11-unsafe-deserialization.md new file mode 100644 index 000000000000..6e78b9a8606a --- /dev/null +++ b/rust/ql/src/change-notes/2026-08-11-unsafe-deserialization.md @@ -0,0 +1,4 @@ +--- +category: newQuery +--- +* Added a new query, `rust/unsafe-deserialization`, to detect deserialization of user-controlled data. From 22ab3706421e309879fcf84143b1f4e5ecfb4de0 Mon Sep 17 00:00:00 2001 From: Lalith Chaitanya Mangalagiri Date: Tue, 11 Aug 2026 21:49:23 -0700 Subject: [PATCH 0245/2098] Add change note for rust/command-line-injection query --- rust/ql/src/change-notes/2026-08-11-command-injection.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 rust/ql/src/change-notes/2026-08-11-command-injection.md diff --git a/rust/ql/src/change-notes/2026-08-11-command-injection.md b/rust/ql/src/change-notes/2026-08-11-command-injection.md new file mode 100644 index 000000000000..2175cc9cdf18 --- /dev/null +++ b/rust/ql/src/change-notes/2026-08-11-command-injection.md @@ -0,0 +1,4 @@ +--- +category: newQuery +--- +* Added a new query, `rust/command-line-injection`, to detect uncontrolled command lines. From 6b3afee892607c029b494e12cd7207d87019bca7 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Tue, 11 Aug 2026 13:57:33 +0200 Subject: [PATCH 0246/2098] Data flow: Earlier pruning based on `accessPathLimit` --- .../codeql/dataflow/internal/DataFlowImpl.qll | 39 ++++++++++++++++++- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll b/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll index 3af6b9eab99a..806b4d5a2413 100644 --- a/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll +++ b/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll @@ -561,6 +561,21 @@ module MakeImpl Lang> { ) } + pragma[nomagic] + private int getAnApLengthLowerBound(Ap ap) { + accessPathLimit() > 1 and // `accessPathLimit() <= 1` is already checked in stages 1 and 2 + ap instanceof ApNil and + result = 0 + or + exists(Content c, Ap tail | + ap = apCons(c, tail) and + fwdFlowConsCand(_, ap, c, _, tail) and + ap != tail and // no need to report a longer length + result = 1 + getAnApLengthLowerBound(tail) and + result <= accessPathLimit() + ) + } + pragma[nomagic] private predicate fwdFlow0( Nd node, Cc cc, SummaryCtx summaryCtx, Typ t, Ap ap, ApApprox apa, TypOption stored @@ -594,7 +609,10 @@ module MakeImpl Lang> { exists(Content c, Ap ap0 | fwdFlowStore(_, _, ap0, _, c, t, stored, node, cc, summaryCtx) and ap = apCons(c, ap0) and - apa = getApprox(ap) + apa = getApprox(ap) and + if accessPathLimit() > 1 + then getAnApLengthLowerBound(ap0) < accessPathLimit() + else any() ) or // read @@ -1320,6 +1338,20 @@ module MakeImpl Lang> { fwdFlow(node, _, _, _, ap, _) } + pragma[nomagic] + private int getAnApLengthLowerBoundRev(Ap ap) { + accessPathLimit() > 1 and // `accessPathLimit() <= 1` is already checked in stages 1 and 2 + ap instanceof ApNil and + result = 0 + or + exists(Ap tail | + revFlowConsCand(ap, _, tail) and + ap != tail and // no need to report a longer length + result = 1 + getAnApLengthLowerBoundRev(tail) and + result <= accessPathLimit() + ) + } + pragma[nomagic] private predicate revFlow0(Nd node, ReturnCtx returnCtx, ApOption returnAp, Ap ap) { fwdFlow(node, _, any(SummaryCtx sinkCtx | sinkCtx.isASinkCtx()), _, ap, _) and @@ -1356,7 +1388,10 @@ module MakeImpl Lang> { // read exists(Nd mid, Ap ap0 | revFlow(mid, returnCtx, returnAp, ap0) and - readStepFwd(node, ap, _, mid, ap0) + readStepFwd(node, ap, _, mid, ap0) and + if accessPathLimit() > 1 + then getAnApLengthLowerBoundRev(ap0) < accessPathLimit() + else any() ) or // flow into a callable From 2129dc8b615cfef2787aceae2a65886d95799f74 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Wed, 24 Jun 2026 10:56:07 +0200 Subject: [PATCH 0247/2098] C#: Re-factor GetAllFeeds into properties in the Feed Manager and encapsulate as immutable hash sets. --- .../FeedManager.cs | 26 +++++++++++++++---- .../NugetPackageRestorer.cs | 7 ++--- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs index 744b60f3d3f5..1dc4c2ac1666 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs @@ -29,6 +29,12 @@ internal sealed partial class FeedManager : IDisposable public bool HasPrivateRegistryFeeds { get; } public bool CheckNugetFeedResponsiveness { get; } = EnvironmentVariables.GetBooleanOptOut(EnvironmentVariableNames.CheckNugetFeedResponsiveness); + private readonly Lazy> lazyExplicitFeeds; + public ImmutableHashSet ExplicitFeeds => lazyExplicitFeeds.Value; + + private readonly Lazy> lazyAllFeeds; + public ImmutableHashSet AllFeeds => lazyAllFeeds.Value; + public FeedManager(ILogger logger, IDotNet dotnet, DependabotProxy? dependabotProxy, FileProvider fileProvider) { this.logger = logger; @@ -38,6 +44,9 @@ public FeedManager(ILogger logger, IDotNet dotnet, DependabotProxy? dependabotPr PrivateRegistryFeeds = dependabotProxy?.RegistryURLs.ToImmutableHashSet() ?? []; HasPrivateRegistryFeeds = PrivateRegistryFeeds.Count > 0; emptyPackageDirectory = new DependencyDirectory("empty", "empty package", logger); + + lazyExplicitFeeds = new Lazy>(GetExplicitFeeds); + lazyAllFeeds = new Lazy>(GetAllFeeds); } private string? GetDirectoryName(string path) @@ -271,7 +280,7 @@ private HashSet GetExcludedFeeds() /// True if there is a timeout when trying to reach the feeds (excluding any feeds that are configured /// to be excluded from the check) or false otherwise. /// - public bool CheckSpecifiedFeeds(HashSet feeds, out HashSet reachableFeeds) + public bool CheckSpecifiedFeeds(ImmutableHashSet feeds, out HashSet reachableFeeds) { // Exclude any feeds from the feed check that are configured by the corresponding environment variable. // These feeds are always assumed to be reachable. @@ -342,7 +351,7 @@ private List GetReachableNuGetFeeds(HashSet feedsToCheck, bool i return reachableFeeds; } - public List GetReachableFallbackNugetFeeds(HashSet? feedsFromNugetConfigs) + public List GetReachableFallbackNugetFeeds(ImmutableHashSet? feedsFromNugetConfigs) { var fallbackFeeds = EnvironmentVariables.GetURLs(EnvironmentVariableNames.FallbackNugetFeeds).ToHashSet(); if (fallbackFeeds.Count == 0) @@ -365,7 +374,7 @@ public List GetReachableFallbackNugetFeeds(HashSet? feedsFromNug return GetReachableNuGetFeeds(fallbackFeeds, isFallback: true, out var _); } - public (HashSet explicitFeeds, HashSet allFeeds) GetAllFeeds() + private ImmutableHashSet GetExplicitFeeds() { var nugetConfigs = fileProvider.NugetConfigs; @@ -391,10 +400,17 @@ public List GetReachableFallbackNugetFeeds(HashSet? feedsFromNug explicitFeeds.UnionWith(PrivateRegistryFeeds); } + return explicitFeeds.ToImmutableHashSet(); + } + + private ImmutableHashSet GetAllFeeds() + { + var nugetConfigs = fileProvider.NugetConfigs; + HashSet allFeeds = []; // Add all explicitFeeds to the set of all feeds. - allFeeds.UnionWith(explicitFeeds); + allFeeds.UnionWith(ExplicitFeeds); // Obtain the list of feeds from the root source directory. // If a NuGet file is present it will be respected, otherwise we will just get the machine/environment specific feeds. @@ -414,7 +430,7 @@ public List GetReachableFallbackNugetFeeds(HashSet? feedsFromNug logger.LogInfo($"Found {allFeeds.Count} NuGet feeds (with inherited ones) in nuget.config files: {string.Join(", ", allFeeds.OrderBy(f => f))}"); - return (explicitFeeds, allFeeds); + return allFeeds.ToImmutableHashSet(); } [GeneratedRegex(@"^E\s(.*)$", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline)] diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs index 9da2018dffbc..2b55923e46b3 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs @@ -117,11 +117,12 @@ public HashSet Restore() // Find feeds that are configured in NuGet.config files and divide them into ones that // are explicitly configured for the project or by a private registry, and "all feeds" // (including inherited ones) from other locations on the host outside of the working directory. - (var explicitFeeds, var allFeeds) = feedManager.GetAllFeeds(); + var explicitFeeds = feedManager.ExplicitFeeds; + var allFeeds = feedManager.AllFeeds; if (feedManager.CheckNugetFeedResponsiveness) { - var inheritedFeeds = allFeeds.Except(explicitFeeds).ToHashSet(); + var inheritedFeeds = allFeeds.Except(explicitFeeds).ToImmutableHashSet(); if (inheritedFeeds.Count > 0) { @@ -312,7 +313,7 @@ private void RestoreProjects(IEnumerable projects, HashSet reach compilationInfoContainer.CompilationInfos.Add(("Failed project restore with missing package error", nugetMissingPackageFailures.ToString())); } - private AssemblyLookupLocation? DownloadMissingPackagesFromSpecificFeeds(IEnumerable usedPackageNames, HashSet? feedsFromNugetConfigs) + private AssemblyLookupLocation? DownloadMissingPackagesFromSpecificFeeds(IEnumerable usedPackageNames, ImmutableHashSet? feedsFromNugetConfigs) { var reachableFallbackFeeds = feedManager.GetReachableFallbackNugetFeeds(feedsFromNugetConfigs); compilationInfoContainer.CompilationInfos.Add(("Reachable fallback NuGet feed count", reachableFallbackFeeds.Count.ToString())); From 23fa7516912d65f6d72bd052f21236de4a191c88 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Wed, 24 Jun 2026 12:56:36 +0200 Subject: [PATCH 0248/2098] C#: Re-factor more feed sets into the feed manager (and further use immutable hash sets). --- .../FeedManager.cs | 70 ++++++++++++++++--- .../NugetPackageRestorer.cs | 20 ++---- .../PackagesConfigRestorer.cs | 7 +- 3 files changed, 70 insertions(+), 27 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs index 1dc4c2ac1666..b0a402148220 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs @@ -24,31 +24,79 @@ internal sealed partial class FeedManager : IDisposable private readonly FileProvider fileProvider; private readonly DependabotProxy? dependabotProxy; private readonly DependencyDirectory emptyPackageDirectory; + private readonly ImmutableHashSet privateRegistryFeeds; - public ImmutableHashSet PrivateRegistryFeeds { get; } public bool HasPrivateRegistryFeeds { get; } public bool CheckNugetFeedResponsiveness { get; } = EnvironmentVariables.GetBooleanOptOut(EnvironmentVariableNames.CheckNugetFeedResponsiveness); private readonly Lazy> lazyExplicitFeeds; + + /// + /// Gets the list of NuGet feeds that are explicitly configured + /// - NuGet configuration files. + /// - Private package registries that are configured for C#. + /// public ImmutableHashSet ExplicitFeeds => lazyExplicitFeeds.Value; private readonly Lazy> lazyAllFeeds; + + /// + /// Gets the list of all NuGet feeds that are configured in the environment. That is + /// - Explicit feeds + /// - Inherited feeds from the machine and environment (if not explicitly disabled by a + /// root directory NuGet configuration). + /// public ImmutableHashSet AllFeeds => lazyAllFeeds.Value; + /// + /// Gets the list of inherited NuGet feeds that are configured in the environment. + /// + public ImmutableHashSet InheritedFeeds => AllFeeds.Except(ExplicitFeeds).ToImmutableHashSet(); + + private readonly Lazy<(bool, ImmutableHashSet)> lazyReachableExplicitFeeds; + + /// + /// Gets whether there was a timeout when checking the reachability of the explicitly configured NuGet feeds. + /// + public bool ExplicitFeedTimeout => lazyReachableExplicitFeeds.Value.Item1; + + /// + /// Gets the list of reachable NuGet feeds that are explicitly configured. + /// + public ImmutableHashSet ReachableExplicitFeeds => lazyReachableExplicitFeeds.Value.Item2; + + private readonly Lazy> lazyReachableFeeds; + /// + /// Gets the list of reachable NuGet feeds that are configured in the environment. + /// + public ImmutableHashSet ReachableFeeds => lazyReachableFeeds.Value; + public FeedManager(ILogger logger, IDotNet dotnet, DependabotProxy? dependabotProxy, FileProvider fileProvider) { this.logger = logger; this.dotnet = dotnet; this.dependabotProxy = dependabotProxy; this.fileProvider = fileProvider; - PrivateRegistryFeeds = dependabotProxy?.RegistryURLs.ToImmutableHashSet() ?? []; - HasPrivateRegistryFeeds = PrivateRegistryFeeds.Count > 0; + privateRegistryFeeds = dependabotProxy?.RegistryURLs.ToImmutableHashSet() ?? []; + HasPrivateRegistryFeeds = privateRegistryFeeds.Count > 0; emptyPackageDirectory = new DependencyDirectory("empty", "empty package", logger); lazyExplicitFeeds = new Lazy>(GetExplicitFeeds); lazyAllFeeds = new Lazy>(GetAllFeeds); + lazyReachableExplicitFeeds = new Lazy<(bool, ImmutableHashSet)>(() => + { + var timeout = CheckSpecifiedFeeds(ExplicitFeeds, out var reachableFeeds); + return (timeout, reachableFeeds); + }); + lazyReachableFeeds = new Lazy>(() => + { + // Inherited feeds should only be used, if they are indeed reachable (as they may be environment specific). + CheckSpecifiedFeeds(InheritedFeeds, out var reachableInheritedFeeds); + return ReachableExplicitFeeds.Union(reachableInheritedFeeds).ToImmutableHashSet(); + }); } + private string? GetDirectoryName(string path) { try @@ -124,7 +172,7 @@ public string FeedsToRestoreArgument(IEnumerable feeds, string sourceArg /// Path to project/solution/packages.config /// The set of reachable NuGet feeds. /// The list of NuGet feeds to use for this restore. - public IEnumerable FeedsToUse(string path, HashSet reachableFeeds) + public IEnumerable FeedsToUse(string path, ImmutableHashSet reachableFeeds) { // Find the path specific feeds. var folder = GetDirectoryName(path); @@ -132,7 +180,7 @@ public IEnumerable FeedsToUse(string path, HashSet reachableFeed if (HasPrivateRegistryFeeds) { - feedsToConsider.UnionWith(PrivateRegistryFeeds); + feedsToConsider.UnionWith(privateRegistryFeeds); } var feedsToUse = CheckNugetFeedResponsiveness @@ -150,7 +198,7 @@ public IEnumerable FeedsToUse(string path, HashSet reachableFeed /// Path to project/solution /// The set of reachable NuGet feeds. /// A string representing the NuGet sources argument for the restore command. - public string? MakeDotnetRestoreSourcesArgument(string path, HashSet reachableFeeds) + public string? MakeDotnetRestoreSourcesArgument(string path, ImmutableHashSet reachableFeeds) { // Do not construct a set of explicit NuGet sources to use for restore. if (!CheckNugetFeedResponsiveness && !HasPrivateRegistryFeeds) @@ -280,7 +328,7 @@ private HashSet GetExcludedFeeds() /// True if there is a timeout when trying to reach the feeds (excluding any feeds that are configured /// to be excluded from the check) or false otherwise. /// - public bool CheckSpecifiedFeeds(ImmutableHashSet feeds, out HashSet reachableFeeds) + private bool CheckSpecifiedFeeds(ImmutableHashSet feeds, out ImmutableHashSet reachableFeeds) { // Exclude any feeds from the feed check that are configured by the corresponding environment variable. // These feeds are always assumed to be reachable. @@ -296,10 +344,10 @@ public bool CheckSpecifiedFeeds(ImmutableHashSet feeds, out HashSet excludedFeeds.Contains(feed))); + reachableFeeds = reachable.Union(feeds.Where(feed => excludedFeeds.Contains(feed))).ToImmutableHashSet(); return isTimeout; } @@ -396,8 +444,8 @@ private ImmutableHashSet GetExplicitFeeds() // in addition to the ones that are configured in `nuget.config` files. if (HasPrivateRegistryFeeds) { - logger.LogInfo($"Found {PrivateRegistryFeeds.Count} private registry feeds configured for C#: {string.Join(", ", PrivateRegistryFeeds.OrderBy(f => f))}"); - explicitFeeds.UnionWith(PrivateRegistryFeeds); + logger.LogInfo($"Found {privateRegistryFeeds.Count} private registry feeds configured for C#: {string.Join(", ", privateRegistryFeeds.OrderBy(f => f))}"); + explicitFeeds.UnionWith(privateRegistryFeeds); } return explicitFeeds.ToImmutableHashSet(); diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs index 2b55923e46b3..98d5394b9235 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs @@ -110,7 +110,7 @@ public HashSet Restore() logger.LogInfo($"Checking NuGet feed responsiveness: {feedManager.CheckNugetFeedResponsiveness}"); compilationInfoContainer.CompilationInfos.Add(("NuGet feed responsiveness checked", feedManager.CheckNugetFeedResponsiveness ? "1" : "0")); - HashSet reachableFeeds = []; + ImmutableHashSet reachableFeeds = []; EmitNugetConfigDiagnostics(); @@ -118,24 +118,20 @@ public HashSet Restore() // are explicitly configured for the project or by a private registry, and "all feeds" // (including inherited ones) from other locations on the host outside of the working directory. var explicitFeeds = feedManager.ExplicitFeeds; - var allFeeds = feedManager.AllFeeds; if (feedManager.CheckNugetFeedResponsiveness) { - var inheritedFeeds = allFeeds.Except(explicitFeeds).ToImmutableHashSet(); + var inheritedFeeds = feedManager.InheritedFeeds; if (inheritedFeeds.Count > 0) { compilationInfoContainer.CompilationInfos.Add(("Inherited NuGet feed count", inheritedFeeds.Count.ToString())); } - var timeout = feedManager.CheckSpecifiedFeeds(explicitFeeds, out var reachableExplicitFeeds); - reachableFeeds.UnionWith(reachableExplicitFeeds); - - var allExplicitReachable = explicitFeeds.Count == reachableExplicitFeeds.Count; + var allExplicitReachable = explicitFeeds.Count == feedManager.ReachableExplicitFeeds.Count; EmitUnreachableFeedsDiagnostics(allExplicitReachable); - if (timeout) + if (feedManager.ExplicitFeedTimeout) { // If we experience a timeout, we use this fallback. // todo: we could also check the reachability of the inherited nuget feeds, but to use those in the fallback we would need to handle authentication too. @@ -145,9 +141,7 @@ public HashSet Restore() : [unresponsiveMissingPackageLocation]; } - // Inherited feeds should only be used, if they are indeed reachable (as they may be environment specific). - feedManager.CheckSpecifiedFeeds(inheritedFeeds, out var reachableInheritedFeeds); - reachableFeeds.UnionWith(reachableInheritedFeeds); + reachableFeeds = feedManager.ReachableFeeds; } try @@ -224,7 +218,7 @@ public HashSet Restore() /// Populates dependencies with the relevant dependencies from the assets files generated by the restore. /// Returns a list of projects that are up to date with respect to restore. /// - private IEnumerable RestoreSolutions(HashSet reachableFeeds, out DependencyContainer dependencies) + private IEnumerable RestoreSolutions(ImmutableHashSet reachableFeeds, out DependencyContainer dependencies) { var successCount = 0; var nugetSourceFailures = 0; @@ -269,7 +263,7 @@ private IEnumerable RestoreSolutions(HashSet reachableFeeds, out /// /// A list of paths to project files. /// The set of reachable NuGet feeds. - private void RestoreProjects(IEnumerable projects, HashSet reachableFeeds, out ConcurrentBag dependencies) + private void RestoreProjects(IEnumerable projects, ImmutableHashSet reachableFeeds, out ConcurrentBag dependencies) { var successCount = 0; var nugetSourceFailures = 0; diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/PackagesConfigRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/PackagesConfigRestorer.cs index af484ba406e4..26f9e42d435d 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/PackagesConfigRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/PackagesConfigRestorer.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics; using System.IO; using System.Linq; @@ -33,7 +34,7 @@ internal interface IPackagesConfigRestore /// internal class PackagesConfigRestoreFactory { - public static IPackagesConfigRestore Create(FileProvider fileProvider, DependencyDirectory packageDirectory, Semmle.Util.Logging.ILogger logger, FeedManager feedManager, HashSet reachableFeeds) + public static IPackagesConfigRestore Create(FileProvider fileProvider, DependencyDirectory packageDirectory, Semmle.Util.Logging.ILogger logger, FeedManager feedManager, ImmutableHashSet reachableFeeds) { if (SystemBuildActions.Instance.IsWindows() || SystemBuildActions.Instance.IsMonoInstalled()) { @@ -64,7 +65,7 @@ private class NugetExeWrapper : IPackagesConfigRestore /// private readonly DependencyDirectory packageDirectory; private readonly FeedManager feedManager; - private readonly HashSet reachableFeeds; + private readonly ImmutableHashSet reachableFeeds; private bool IsWindows => SystemBuildActions.Instance.IsWindows(); @@ -75,7 +76,7 @@ private class NugetExeWrapper : IPackagesConfigRestore /// /// Create the package manager for a specified source tree. /// - public NugetExeWrapper(FileProvider fileProvider, DependencyDirectory packageDirectory, Semmle.Util.Logging.ILogger logger, FeedManager feedManager, HashSet reachableFeeds) + public NugetExeWrapper(FileProvider fileProvider, DependencyDirectory packageDirectory, Semmle.Util.Logging.ILogger logger, FeedManager feedManager, ImmutableHashSet reachableFeeds) { this.fileProvider = fileProvider; this.packageDirectory = packageDirectory; From 13c2c8d34df40efb814997314750b03db2acc2a0 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 25 Jun 2026 14:16:50 +0200 Subject: [PATCH 0249/2098] C#: Do not pass around the set of reachable feeds. This implicitly delays the calculation of the reachable feeds until it is needed/used. --- .../FeedManager.cs | 10 ++++------ .../NugetPackageRestorer.cs | 18 +++++++----------- .../PackagesConfigRestorer.cs | 10 ++++------ 3 files changed, 15 insertions(+), 23 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs index b0a402148220..ec5b781eaacf 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs @@ -170,9 +170,8 @@ public string FeedsToRestoreArgument(IEnumerable feeds, string sourceArg /// (2) Use private registries, if they are configured /// /// Path to project/solution/packages.config - /// The set of reachable NuGet feeds. /// The list of NuGet feeds to use for this restore. - public IEnumerable FeedsToUse(string path, ImmutableHashSet reachableFeeds) + public IEnumerable FeedsToUse(string path) { // Find the path specific feeds. var folder = GetDirectoryName(path); @@ -184,7 +183,7 @@ public IEnumerable FeedsToUse(string path, ImmutableHashSet reac } var feedsToUse = CheckNugetFeedResponsiveness - ? feedsToConsider.Where(reachableFeeds.Contains) + ? feedsToConsider.Where(ReachableFeeds.Contains) : feedsToConsider; return feedsToUse; @@ -196,9 +195,8 @@ public IEnumerable FeedsToUse(string path, ImmutableHashSet reac /// (2) Use private registries, if they are configured /// /// Path to project/solution - /// The set of reachable NuGet feeds. /// A string representing the NuGet sources argument for the restore command. - public string? MakeDotnetRestoreSourcesArgument(string path, ImmutableHashSet reachableFeeds) + public string? MakeDotnetRestoreSourcesArgument(string path) { // Do not construct a set of explicit NuGet sources to use for restore. if (!CheckNugetFeedResponsiveness && !HasPrivateRegistryFeeds) @@ -206,7 +204,7 @@ public IEnumerable FeedsToUse(string path, ImmutableHashSet reac return null; } - var feedsToUse = FeedsToUse(path, reachableFeeds); + var feedsToUse = FeedsToUse(path); return FeedsToRestoreArgument(feedsToUse, "-s"); } diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs index 98d5394b9235..bcccfda829a8 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs @@ -110,8 +110,6 @@ public HashSet Restore() logger.LogInfo($"Checking NuGet feed responsiveness: {feedManager.CheckNugetFeedResponsiveness}"); compilationInfoContainer.CompilationInfos.Add(("NuGet feed responsiveness checked", feedManager.CheckNugetFeedResponsiveness ? "1" : "0")); - ImmutableHashSet reachableFeeds = []; - EmitNugetConfigDiagnostics(); // Find feeds that are configured in NuGet.config files and divide them into ones that @@ -141,12 +139,11 @@ public HashSet Restore() : [unresponsiveMissingPackageLocation]; } - reachableFeeds = feedManager.ReachableFeeds; } try { - var packagesConfigRestore = PackagesConfigRestoreFactory.Create(fileProvider, legacyPackageDirectory, logger, feedManager, reachableFeeds); + var packagesConfigRestore = PackagesConfigRestoreFactory.Create(fileProvider, legacyPackageDirectory, logger, feedManager); var count = packagesConfigRestore.InstallPackages(); if (packagesConfigRestore.PackageCount > 0) { @@ -184,9 +181,9 @@ public HashSet Restore() } // Restore project dependencies with `dotnet restore`. - var restoredProjects = RestoreSolutions(reachableFeeds, out var container); + var restoredProjects = RestoreSolutions(out var container); var projects = fileProvider.Projects.Except(restoredProjects); - RestoreProjects(projects, reachableFeeds, out var containers); + RestoreProjects(projects, out var containers); var dependencies = containers.Flatten(container); @@ -218,7 +215,7 @@ public HashSet Restore() /// Populates dependencies with the relevant dependencies from the assets files generated by the restore. /// Returns a list of projects that are up to date with respect to restore. /// - private IEnumerable RestoreSolutions(ImmutableHashSet reachableFeeds, out DependencyContainer dependencies) + private IEnumerable RestoreSolutions(out DependencyContainer dependencies) { var successCount = 0; var nugetSourceFailures = 0; @@ -231,7 +228,7 @@ private IEnumerable RestoreSolutions(ImmutableHashSet reachableF var projects = fileProvider.Solutions.SelectMany(solution => { logger.LogInfo($"Restoring solution {solution}..."); - var nugetSources = feedManager.MakeDotnetRestoreSourcesArgument(solution, reachableFeeds); + var nugetSources = feedManager.MakeDotnetRestoreSourcesArgument(solution); var res = dotnet.Restore(new(solution, PackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: true, NugetSources: nugetSources, TargetWindows: isWindows)); if (res.Success) { @@ -262,8 +259,7 @@ private IEnumerable RestoreSolutions(ImmutableHashSet reachableF /// Populates dependencies with the relative paths to the assets files generated by the restore. /// /// A list of paths to project files. - /// The set of reachable NuGet feeds. - private void RestoreProjects(IEnumerable projects, ImmutableHashSet reachableFeeds, out ConcurrentBag dependencies) + private void RestoreProjects(IEnumerable projects, out ConcurrentBag dependencies) { var successCount = 0; var nugetSourceFailures = 0; @@ -280,7 +276,7 @@ private void RestoreProjects(IEnumerable projects, ImmutableHashSet internal class PackagesConfigRestoreFactory { - public static IPackagesConfigRestore Create(FileProvider fileProvider, DependencyDirectory packageDirectory, Semmle.Util.Logging.ILogger logger, FeedManager feedManager, ImmutableHashSet reachableFeeds) + public static IPackagesConfigRestore Create(FileProvider fileProvider, DependencyDirectory packageDirectory, Semmle.Util.Logging.ILogger logger, FeedManager feedManager) { if (SystemBuildActions.Instance.IsWindows() || SystemBuildActions.Instance.IsMonoInstalled()) { - return new NugetExeWrapper(fileProvider, packageDirectory, logger, feedManager, reachableFeeds); + return new NugetExeWrapper(fileProvider, packageDirectory, logger, feedManager); } return new NoOpPackagesConfig(fileProvider.PackagesConfigs, logger); @@ -65,7 +65,6 @@ private class NugetExeWrapper : IPackagesConfigRestore /// private readonly DependencyDirectory packageDirectory; private readonly FeedManager feedManager; - private readonly ImmutableHashSet reachableFeeds; private bool IsWindows => SystemBuildActions.Instance.IsWindows(); @@ -76,13 +75,12 @@ private class NugetExeWrapper : IPackagesConfigRestore /// /// Create the package manager for a specified source tree. /// - public NugetExeWrapper(FileProvider fileProvider, DependencyDirectory packageDirectory, Semmle.Util.Logging.ILogger logger, FeedManager feedManager, ImmutableHashSet reachableFeeds) + public NugetExeWrapper(FileProvider fileProvider, DependencyDirectory packageDirectory, Semmle.Util.Logging.ILogger logger, FeedManager feedManager) { this.fileProvider = fileProvider; this.packageDirectory = packageDirectory; this.logger = logger; this.feedManager = feedManager; - this.reachableFeeds = reachableFeeds; if (fileProvider.PackagesConfigs.Count > 0) { @@ -171,7 +169,7 @@ private bool TryRestoreNugetPackage(string packagesConfig) logger.LogInfo($"Restoring file \"{packagesConfig}\"..."); var sourcesArgument = ""; - var feedsToUse = feedManager.FeedsToUse(packagesConfig, reachableFeeds).ToList(); + var feedsToUse = feedManager.FeedsToUse(packagesConfig).ToList(); var useDefaultFeed = feedsToUse.Count == 0 && IsDefaultFeedReachable; // Explicitly construct the sources to be used for the restore command when checking feed From 179f29b8d5899b28ace26a9585213e3359552103 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 25 Jun 2026 15:21:47 +0200 Subject: [PATCH 0250/2098] C#: Use feed management for more package download flows. --- .../FeedManager.cs | 35 ++++++++---- .../NugetPackageRestorer.cs | 53 +++++++------------ 2 files changed, 46 insertions(+), 42 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs index ec5b781eaacf..99568fa9ce19 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs @@ -164,6 +164,20 @@ public string FeedsToRestoreArgument(IEnumerable feeds, string sourceArg return feedArgs.ToString(); } + private IEnumerable FeedsToUseAux(HashSet feedsToConsider) + { + if (HasPrivateRegistryFeeds) + { + feedsToConsider.UnionWith(privateRegistryFeeds); + } + + var feedsToUse = CheckNugetFeedResponsiveness + ? feedsToConsider.Where(ReachableFeeds.Contains) + : feedsToConsider; + + return feedsToUse; + } + /// /// Constructs the list of NuGet sources to use for this restore. /// (1) Use the feeds we get from `dotnet nuget list source` @@ -177,16 +191,19 @@ public IEnumerable FeedsToUse(string path) var folder = GetDirectoryName(path); var feedsToConsider = folder is not null ? GetFeedsFromFolder(folder).ToHashSet() : new HashSet(); - if (HasPrivateRegistryFeeds) - { - feedsToConsider.UnionWith(privateRegistryFeeds); - } + return FeedsToUseAux(feedsToConsider); + } - var feedsToUse = CheckNugetFeedResponsiveness - ? feedsToConsider.Where(ReachableFeeds.Contains) - : feedsToConsider; + public IEnumerable FeedsToUseFromConfig(string config) + { + var feedsToConsider = GetFeedsFromNugetConfig(config).ToHashSet(); - return feedsToUse; + return FeedsToUseAux(feedsToConsider); + } + + public string FeedsToDotnetRestoreArgument(IEnumerable feeds) + { + return FeedsToRestoreArgument(feeds, "-s"); } /// @@ -206,7 +223,7 @@ public IEnumerable FeedsToUse(string path) var feedsToUse = FeedsToUse(path); - return FeedsToRestoreArgument(feedsToUse, "-s"); + return FeedsToDotnetRestoreArgument(feedsToUse); } private (int initialTimeout, int tryCount) GetFeedRequestSettings(bool isFallback) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs index bcccfda829a8..8dd04e989edd 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs @@ -350,10 +350,18 @@ private void RestoreProjects(IEnumerable projects, out ConcurrentBag feeds = []; + if (fallbackNugetFeeds is not null) + { + feeds = fallbackNugetFeeds; + } + else if (GetNugetConfig() is string config) + { + feeds = feedManager.FeedsToUseFromConfig(config); + } + + var nugetSources = feedManager.FeedsToDotnetRestoreArgument(feeds); compilationInfoContainer.CompilationInfos.Add(("Fallback nuget restore", notYetDownloadedPackages.Count.ToString())); @@ -362,7 +370,7 @@ private void RestoreProjects(IEnumerable projects, out ConcurrentBag { - var success = TryRestorePackageManually(package.Name, nugetConfig, package.PackageReferenceSource, tryWithoutNugetConfig: fallbackNugetFeeds is null); + var success = TryRestorePackageManually(package.Name, nugetSources, package.PackageReferenceSource, tryWithoutNugetConfig: fallbackNugetFeeds is null); if (!success) { return; @@ -379,27 +387,6 @@ private void RestoreProjects(IEnumerable projects, out ConcurrentBag fallbackNugetFeeds, string folderPath) - { - var sb = new StringBuilder(); - fallbackNugetFeeds.ForEach((feed, index) => sb.AppendLine($"")); - - var nugetConfigPath = Path.Join(folderPath, "nuget.config"); - logger.LogInfo($"Creating fallback nuget.config file {nugetConfigPath}."); - File.WriteAllText(nugetConfigPath, - $""" - - - - - {sb} - - - """); - - return nugetConfigPath; - } - private string? GetNugetConfig() { var nugetConfigs = fileProvider.NugetConfigs; @@ -489,7 +476,7 @@ private static IEnumerable GetRestoredPackageDirectoryNames(DirectoryInf .Select(d => Path.GetFileName(d).ToLowerInvariant()); } - private bool TryRestorePackageManually(string package, string? nugetConfig = null, PackageReferenceSource packageReferenceSource = PackageReferenceSource.SdkCsProj, + private bool TryRestorePackageManually(string package, string? nugetSources = null, PackageReferenceSource packageReferenceSource = PackageReferenceSource.SdkCsProj, bool tryWithoutNugetConfig = true, bool tryPrereleaseVersion = true) { logger.LogInfo($"Restoring package {package}..."); @@ -512,17 +499,17 @@ private bool TryRestorePackageManually(string package, string? nugetConfig = nul return false; } - var res = TryRestorePackageManually(package, nugetConfig, tempDir, tryPrereleaseVersion); + var res = TryRestorePackageManually(package, nugetSources, tempDir, tryPrereleaseVersion); if (res.Success) { return true; } - if (tryWithoutNugetConfig && res.HasNugetPackageSourceError && nugetConfig is not null) + if (tryWithoutNugetConfig && res.HasNugetPackageSourceError && nugetSources is not null && !feedManager.CheckNugetFeedResponsiveness) { logger.LogDebug($"Trying to restore '{package}' without nuget.config."); // Restore could not be completed because the listed source is unavailable. Try without the nuget.config: - res = TryRestorePackageManually(package, nugetConfig: null, tempDir, tryPrereleaseVersion); + res = TryRestorePackageManually(package, nugetSources: null, tempDir, tryPrereleaseVersion); if (res.Success) { return true; @@ -533,16 +520,16 @@ private bool TryRestorePackageManually(string package, string? nugetConfig = nul return false; } - private RestoreResult TryRestorePackageManually(string package, string? nugetConfig, TemporaryDirectory tempDir, bool tryPrereleaseVersion) + private RestoreResult TryRestorePackageManually(string package, string? nugetSources, TemporaryDirectory tempDir, bool tryPrereleaseVersion) { - var res = dotnet.Restore(new(tempDir.DirInfo.FullName, missingPackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: false, PathToNugetConfig: nugetConfig, ForceReevaluation: true)); + var res = dotnet.Restore(new(tempDir.DirInfo.FullName, missingPackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: false, NugetSources: nugetSources, ForceReevaluation: true)); if (!res.Success && tryPrereleaseVersion && res.HasNugetNoStablePackageVersionError) { logger.LogDebug($"Failed to restore nuget package {package} because no stable version was found."); TryChangePackageVersion(tempDir.DirInfo, "*-*"); - res = dotnet.Restore(new(tempDir.DirInfo.FullName, missingPackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: false, PathToNugetConfig: nugetConfig, ForceReevaluation: true)); + res = dotnet.Restore(new(tempDir.DirInfo.FullName, missingPackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: false, NugetSources: nugetSources, ForceReevaluation: true)); if (!res.Success) { TryChangePackageVersion(tempDir.DirInfo, "*"); From 0874377bf359c757b6be4ece67796ad8469ff4d9 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 25 Jun 2026 15:31:17 +0200 Subject: [PATCH 0251/2098] C#: Remove the dotnet restore config file option. --- .../Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs | 5 ----- .../IDotNet.cs | 2 +- csharp/extractor/Semmle.Extraction.Tests/DotNet.cs | 8 ++++---- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs index e93a29336126..e02d157dc620 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs @@ -80,11 +80,6 @@ private string GetRestoreArgs(RestoreSettings restoreSettings) args += $" /p:TargetFrameworkRootPath=\"{path}\" /p:NetCoreTargetingPackRoot=\"{path}\" /p:AllowMissingPrunePackageData=true"; } - if (restoreSettings.PathToNugetConfig != null) - { - args += $" --configfile \"{restoreSettings.PathToNugetConfig}\""; - } - if (restoreSettings.ForceReevaluation) { args += " --force"; diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNet.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNet.cs index d14dee506524..394a05e9e596 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNet.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNet.cs @@ -17,7 +17,7 @@ public interface IDotNet IList GetNugetFeedsFromFolder(string folderPath); } - public record class RestoreSettings(string File, string PackageDirectory, bool ForceDotnetRefAssemblyFetching, string? NugetSources = null, string? PathToNugetConfig = null, bool ForceReevaluation = false, bool TargetWindows = false); + public record class RestoreSettings(string File, string PackageDirectory, bool ForceDotnetRefAssemblyFetching, string? NugetSources = null, bool ForceReevaluation = false, bool TargetWindows = false); public partial record class RestoreResult(bool Success, IList Output) { diff --git a/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs b/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs index a2996497e005..74939b61af5e 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs @@ -130,11 +130,11 @@ public void TestDotnetRestoreProjectToDirectory2() var dotnet = MakeDotnet(dotnetCliInvoker); // Execute - var res = dotnet.Restore(new("myproject.csproj", "mypackages", false, null, "myconfig.config")); + var res = dotnet.Restore(new("myproject.csproj", "mypackages", false, null)); // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); - Assert.Equal("restore --no-dependencies \"myproject.csproj\" --packages \"mypackages\" /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile \"myconfig.config\"", lastArgs); + Assert.Equal("restore --no-dependencies \"myproject.csproj\" --packages \"mypackages\" /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal", lastArgs); Assert.Equal(2, res.AssetsFilePaths.Count()); Assert.Contains("/path/to/project.assets.json", res.AssetsFilePaths); Assert.Contains("/path/to/project2.assets.json", res.AssetsFilePaths); @@ -148,11 +148,11 @@ public void TestDotnetRestoreProjectToDirectory3() var dotnet = MakeDotnet(dotnetCliInvoker); // Execute - var res = dotnet.Restore(new("myproject.csproj", "mypackages", false, null, "myconfig.config", true)); + var res = dotnet.Restore(new("myproject.csproj", "mypackages", false, null, true)); // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); - Assert.Equal("restore --no-dependencies \"myproject.csproj\" --packages \"mypackages\" /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile \"myconfig.config\" --force", lastArgs); + Assert.Equal("restore --no-dependencies \"myproject.csproj\" --packages \"mypackages\" /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --force", lastArgs); Assert.Equal(2, res.AssetsFilePaths.Count()); Assert.Contains("/path/to/project.assets.json", res.AssetsFilePaths); Assert.Contains("/path/to/project2.assets.json", res.AssetsFilePaths); From 2d1edd4b3f3537282e16ec2d7ba73e843cf243c5 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 29 Jun 2026 15:42:33 +0200 Subject: [PATCH 0252/2098] C#: Add some more documentation in the FeedManager. --- .../FeedManager.cs | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs index 99568fa9ce19..9694a60d3127 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs @@ -26,7 +26,14 @@ internal sealed partial class FeedManager : IDisposable private readonly DependencyDirectory emptyPackageDirectory; private readonly ImmutableHashSet privateRegistryFeeds; + /// + /// Gets whether there are private package registries configured for C#. + /// public bool HasPrivateRegistryFeeds { get; } + + /// + /// Gets whether the reachability of the NuGet feeds should be checked before using them for restore. + /// public bool CheckNugetFeedResponsiveness { get; } = EnvironmentVariables.GetBooleanOptOut(EnvironmentVariableNames.CheckNugetFeedResponsiveness); private readonly Lazy> lazyExplicitFeeds; @@ -145,6 +152,13 @@ private IEnumerable GetFeedsFromFolder(string folderPath) => private IEnumerable GetFeedsFromNugetConfig(string nugetConfigPath) => GetFeeds(() => dotnet.GetNugetFeeds(nugetConfigPath)); + /// + /// Constructs the NuGet sources argument for the restore command based on the given feeds. + /// If there are no feeds, a dummy source argument is added to override any default feeds that `restore` would use. + /// + /// The list of feeds to use for the restore command. + /// The prefix to use for each source argument (e.g., "-s"). + /// The constructed NuGet sources argument for the restore command. public string FeedsToRestoreArgument(IEnumerable feeds, string sourceArgumentPrefix) { // If there are no feeds, we want to override any default feeds that `restore` would use by passing a dummy source argument. @@ -194,6 +208,13 @@ public IEnumerable FeedsToUse(string path) return FeedsToUseAux(feedsToConsider); } + /// + /// Constructs the list of NuGet sources to use for this restore. + /// (1) Use the feeds we get from `dotnet nuget list source --configfile` + /// (2) Use private registries, if they are configured + /// + /// Path to the NuGet configuration file. + /// The list of NuGet feeds to use for this restore. public IEnumerable FeedsToUseFromConfig(string config) { var feedsToConsider = GetFeedsFromNugetConfig(config).ToHashSet(); @@ -201,6 +222,11 @@ public IEnumerable FeedsToUseFromConfig(string config) return FeedsToUseAux(feedsToConsider); } + /// + /// Constructs the NuGet sources argument for the `dotnet restore` command based on the given feeds. + /// + /// The list of NuGet feeds to use for the restore command. + /// A string representing the NuGet sources argument for the `dotnet restore` command. public string FeedsToDotnetRestoreArgument(IEnumerable feeds) { return FeedsToRestoreArgument(feeds, "-s"); @@ -212,7 +238,7 @@ public string FeedsToDotnetRestoreArgument(IEnumerable feeds) /// (2) Use private registries, if they are configured /// /// Path to project/solution - /// A string representing the NuGet sources argument for the restore command. + /// A string representing the NuGet sources argument for the `dotnet restore` command. public string? MakeDotnetRestoreSourcesArgument(string path) { // Do not construct a set of explicit NuGet sources to use for restore. @@ -367,6 +393,11 @@ private bool CheckSpecifiedFeeds(ImmutableHashSet feeds, out ImmutableHa return isTimeout; } + /// + /// Return true if the default NuGet feed is reachable, false otherwise. + /// If the reachability check is disabled, this method will always return true. + /// + /// True if the default NuGet feed is reachable, false otherwise. public bool IsDefaultFeedReachable() { if (CheckNugetFeedResponsiveness) From 3411459fb6eb863d1b77556e989ae15b6716ebae Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 29 Jun 2026 16:21:58 +0200 Subject: [PATCH 0253/2098] C#: Remove the explicitfeeds argument from DownloadMissingPackagesFromSpecificFeeds as it is always called with this argument. --- .../FeedManager.cs | 12 ++++++------ .../NugetPackageRestorer.cs | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs index 9694a60d3127..e7ff1514d507 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs @@ -445,7 +445,7 @@ private List GetReachableNuGetFeeds(HashSet feedsToCheck, bool i return reachableFeeds; } - public List GetReachableFallbackNugetFeeds(ImmutableHashSet? feedsFromNugetConfigs) + private List GetReachableFallbackNugetFeeds() { var fallbackFeeds = EnvironmentVariables.GetURLs(EnvironmentVariableNames.FallbackNugetFeeds).ToHashSet(); if (fallbackFeeds.Count == 0) @@ -456,12 +456,12 @@ public List GetReachableFallbackNugetFeeds(ImmutableHashSet? fee var shouldAddNugetConfigFeeds = EnvironmentVariables.GetBooleanOptOut(EnvironmentVariableNames.AddNugetConfigFeedsToFallback); logger.LogInfo($"Adding feeds from nuget.config to fallback restore: {shouldAddNugetConfigFeeds}"); - if (shouldAddNugetConfigFeeds && feedsFromNugetConfigs?.Count > 0) + if (shouldAddNugetConfigFeeds && ExplicitFeeds.Count > 0) { - // There are some feeds in `feedsFromNugetConfigs` that have already been checked for reachability, we could skip those. - // But we might use different responsiveness testing settings when we try them in the fallback logic, so checking them again is safer. - fallbackFeeds.UnionWith(feedsFromNugetConfigs); - logger.LogInfo($"Using NuGet feeds from nuget.config files as fallback feeds: {string.Join(", ", feedsFromNugetConfigs.OrderBy(f => f))}"); + // Feeds in `ExplicitFeeds` may already been checked for reachability. + // But we might use different responsiveness testing settings when we try them in the fallback logic, so checking them again. + fallbackFeeds.UnionWith(ExplicitFeeds); + logger.LogInfo($"Using NuGet feeds from nuget.config files as fallback feeds: {string.Join(", ", ExplicitFeeds.OrderBy(f => f))}"); } } diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs index 8dd04e989edd..c65c2153beaf 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs @@ -133,7 +133,7 @@ public HashSet Restore() { // If we experience a timeout, we use this fallback. // todo: we could also check the reachability of the inherited nuget feeds, but to use those in the fallback we would need to handle authentication too. - var unresponsiveMissingPackageLocation = DownloadMissingPackagesFromSpecificFeeds([], explicitFeeds); + var unresponsiveMissingPackageLocation = DownloadMissingPackagesAndUseFallback([]); return unresponsiveMissingPackageLocation is null ? [] : [unresponsiveMissingPackageLocation]; @@ -196,7 +196,7 @@ public HashSet Restore() var usedPackageNames = GetAllUsedPackageDirNames(dependencies); var missingPackageLocation = feedManager.CheckNugetFeedResponsiveness - ? DownloadMissingPackagesFromSpecificFeeds(usedPackageNames, explicitFeeds) + ? DownloadMissingPackagesAndUseFallback(usedPackageNames) : DownloadMissingPackages(usedPackageNames); if (missingPackageLocation is not null) @@ -303,9 +303,9 @@ private void RestoreProjects(IEnumerable projects, out ConcurrentBag usedPackageNames, ImmutableHashSet? feedsFromNugetConfigs) + private AssemblyLookupLocation? DownloadMissingPackagesAndUseFallback(IEnumerable usedPackageNames) { - var reachableFallbackFeeds = feedManager.GetReachableFallbackNugetFeeds(feedsFromNugetConfigs); + var reachableFallbackFeeds = feedManager.GetReachableFallbackNugetFeeds(); compilationInfoContainer.CompilationInfos.Add(("Reachable fallback NuGet feed count", reachableFallbackFeeds.Count.ToString())); if (reachableFallbackFeeds.Count > 0) From 25b640bd680f2240c900dcdd4992c3f583592a3b Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Tue, 30 Jun 2026 15:09:52 +0200 Subject: [PATCH 0254/2098] C#: Push the feed fetching logic into DownloadPackages, use allfeeds instead of a specific nuget.config file, and supply a list of nuget sources when using the TryRestore. --- .../FeedManager.cs | 27 +++--- .../NugetPackageRestorer.cs | 84 ++++++------------- 2 files changed, 36 insertions(+), 75 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs index e7ff1514d507..87aa3c575790 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs @@ -78,6 +78,12 @@ internal sealed partial class FeedManager : IDisposable /// public ImmutableHashSet ReachableFeeds => lazyReachableFeeds.Value; + private readonly Lazy> lazyReachableFallbackFeeds; + /// + /// Gets the list of reachable NuGet feeds that are configured as fallback feeds. + /// + public ImmutableHashSet ReachableFallbackFeeds => lazyReachableFallbackFeeds.Value; + public FeedManager(ILogger logger, IDotNet dotnet, DependabotProxy? dependabotProxy, FileProvider fileProvider) { this.logger = logger; @@ -101,9 +107,13 @@ public FeedManager(ILogger logger, IDotNet dotnet, DependabotProxy? dependabotPr CheckSpecifiedFeeds(InheritedFeeds, out var reachableInheritedFeeds); return ReachableExplicitFeeds.Union(reachableInheritedFeeds).ToImmutableHashSet(); }); + lazyReachableFallbackFeeds = new Lazy>(() => + { + var reachableFallbackFeeds = GetReachableFallbackNugetFeeds(); + return reachableFallbackFeeds.ToImmutableHashSet(); + }); } - private string? GetDirectoryName(string path) { try @@ -148,7 +158,6 @@ private IEnumerable GetFeeds(Func> getNugetFeeds) private IEnumerable GetFeedsFromFolder(string folderPath) => GetFeeds(() => dotnet.GetNugetFeedsFromFolder(folderPath)); - private IEnumerable GetFeedsFromNugetConfig(string nugetConfigPath) => GetFeeds(() => dotnet.GetNugetFeeds(nugetConfigPath)); @@ -208,20 +217,6 @@ public IEnumerable FeedsToUse(string path) return FeedsToUseAux(feedsToConsider); } - /// - /// Constructs the list of NuGet sources to use for this restore. - /// (1) Use the feeds we get from `dotnet nuget list source --configfile` - /// (2) Use private registries, if they are configured - /// - /// Path to the NuGet configuration file. - /// The list of NuGet feeds to use for this restore. - public IEnumerable FeedsToUseFromConfig(string config) - { - var feedsToConsider = GetFeedsFromNugetConfig(config).ToHashSet(); - - return FeedsToUseAux(feedsToConsider); - } - /// /// Constructs the NuGet sources argument for the `dotnet restore` command based on the given feeds. /// diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs index c65c2153beaf..f9ffd1cec272 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs @@ -4,7 +4,6 @@ using System.Collections.Immutable; using System.IO; using System.Linq; -using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; @@ -53,7 +52,9 @@ public NugetPackageRestorer( public string? TryRestore(string package) { - if (TryRestorePackageManually(package)) + var feeds = feedManager.CheckNugetFeedResponsiveness ? feedManager.ReachableFeeds : feedManager.AllFeeds; + var nugetSources = feedManager.FeedsToDotnetRestoreArgument(feeds); + if (TryRestorePackageManually(package, nugetSources)) { var packageDir = DependencyManager.GetPackageDirectory(package, missingPackageDirectory.DirInfo); if (packageDir is not null) @@ -133,7 +134,7 @@ public HashSet Restore() { // If we experience a timeout, we use this fallback. // todo: we could also check the reachability of the inherited nuget feeds, but to use those in the fallback we would need to handle authentication too. - var unresponsiveMissingPackageLocation = DownloadMissingPackagesAndUseFallback([]); + var unresponsiveMissingPackageLocation = DownloadMissingPackages([]); return unresponsiveMissingPackageLocation is null ? [] : [unresponsiveMissingPackageLocation]; @@ -195,9 +196,7 @@ public HashSet Restore() var usedPackageNames = GetAllUsedPackageDirNames(dependencies); - var missingPackageLocation = feedManager.CheckNugetFeedResponsiveness - ? DownloadMissingPackagesAndUseFallback(usedPackageNames) - : DownloadMissingPackages(usedPackageNames); + var missingPackageLocation = DownloadMissingPackages(usedPackageNames); if (missingPackageLocation is not null) { @@ -303,22 +302,28 @@ private void RestoreProjects(IEnumerable projects, out ConcurrentBag usedPackageNames) + private AssemblyLookupLocation? DownloadMissingPackages(IEnumerable usedPackageNames) { - var reachableFallbackFeeds = feedManager.GetReachableFallbackNugetFeeds(); - compilationInfoContainer.CompilationInfos.Add(("Reachable fallback NuGet feed count", reachableFallbackFeeds.Count.ToString())); + ImmutableHashSet feeds; + if (feedManager.CheckNugetFeedResponsiveness) + { + // Attempt to get the fallback configuration. + var reachableFallbackFeeds = feedManager.ReachableFallbackFeeds; + compilationInfoContainer.CompilationInfos.Add(("Reachable fallback NuGet feed count", reachableFallbackFeeds.Count.ToString())); - if (reachableFallbackFeeds.Count > 0) + if (reachableFallbackFeeds.Count == 0) + { + logger.LogWarning("Skipping download of missing packages from specific feeds as no fallback NuGet feeds are reachable."); + return null; + } + feeds = reachableFallbackFeeds; + } + else { - return DownloadMissingPackages(usedPackageNames, fallbackNugetFeeds: reachableFallbackFeeds); + feeds = feedManager.AllFeeds; } - logger.LogWarning("Skipping download of missing packages from specific feeds as no fallback NuGet feeds are reachable."); - return null; - } - - private AssemblyLookupLocation? DownloadMissingPackages(IEnumerable usedPackageNames, IEnumerable? fallbackNugetFeeds = null) - { + var nugetSources = feedManager.FeedsToDotnetRestoreArgument(feeds); var alreadyDownloadedPackages = usedPackageNames.Select(p => p.ToLowerInvariant()); var alreadyDownloadedLegacyPackages = GetRestoredLegacyPackageNames(); @@ -351,18 +356,6 @@ private void RestoreProjects(IEnumerable projects, out ConcurrentBag feeds = []; - if (fallbackNugetFeeds is not null) - { - feeds = fallbackNugetFeeds; - } - else if (GetNugetConfig() is string config) - { - feeds = feedManager.FeedsToUseFromConfig(config); - } - - var nugetSources = feedManager.FeedsToDotnetRestoreArgument(feeds); - compilationInfoContainer.CompilationInfos.Add(("Fallback nuget restore", notYetDownloadedPackages.Count.ToString())); var successCount = 0; @@ -370,7 +363,7 @@ private void RestoreProjects(IEnumerable projects, out ConcurrentBag { - var success = TryRestorePackageManually(package.Name, nugetSources, package.PackageReferenceSource, tryWithoutNugetConfig: fallbackNugetFeeds is null); + var success = TryRestorePackageManually(package.Name, nugetSources, package.PackageReferenceSource); if (!success) { return; @@ -387,32 +380,6 @@ private void RestoreProjects(IEnumerable projects, out ConcurrentBag 1) - { - logger.LogInfo($"Found multiple nuget.config files: {string.Join(", ", nugetConfigs)}."); - nugetConfig = fileProvider.RootNugetConfig; - if (nugetConfig == null) - { - logger.LogInfo("Could not find a top-level nuget.config file."); - } - } - else - { - nugetConfig = nugetConfigs.FirstOrDefault(); - } - - if (nugetConfig != null) - { - logger.LogInfo($"Using nuget.config file {nugetConfig}."); - } - - return nugetConfig; - } - private IEnumerable GetAllUsedPackageDirNames(DependencyContainer dependencies) { var allPackageDirectories = GetAllPackageDirectories(); @@ -476,8 +443,7 @@ private static IEnumerable GetRestoredPackageDirectoryNames(DirectoryInf .Select(d => Path.GetFileName(d).ToLowerInvariant()); } - private bool TryRestorePackageManually(string package, string? nugetSources = null, PackageReferenceSource packageReferenceSource = PackageReferenceSource.SdkCsProj, - bool tryWithoutNugetConfig = true, bool tryPrereleaseVersion = true) + private bool TryRestorePackageManually(string package, string? nugetSources, PackageReferenceSource packageReferenceSource = PackageReferenceSource.SdkCsProj, bool tryPrereleaseVersion = true) { logger.LogInfo($"Restoring package {package}..."); using var tempDir = new TemporaryDirectory( @@ -505,7 +471,7 @@ private bool TryRestorePackageManually(string package, string? nugetSources = nu return true; } - if (tryWithoutNugetConfig && res.HasNugetPackageSourceError && nugetSources is not null && !feedManager.CheckNugetFeedResponsiveness) + if (!feedManager.CheckNugetFeedResponsiveness && res.HasNugetPackageSourceError && nugetSources is not null) { logger.LogDebug($"Trying to restore '{package}' without nuget.config."); // Restore could not be completed because the listed source is unavailable. Try without the nuget.config: From b34fe443c3496883df772fac2ae0b300e676cd2c Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Fri, 17 Jul 2026 15:19:09 +0200 Subject: [PATCH 0255/2098] C#: Add change note. --- .../ql/lib/change-notes/2026-07-17-nuget-package-restore.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 csharp/ql/lib/change-notes/2026-07-17-nuget-package-restore.md diff --git a/csharp/ql/lib/change-notes/2026-07-17-nuget-package-restore.md b/csharp/ql/lib/change-notes/2026-07-17-nuget-package-restore.md new file mode 100644 index 000000000000..0673bffa3049 --- /dev/null +++ b/csharp/ql/lib/change-notes/2026-07-17-nuget-package-restore.md @@ -0,0 +1,4 @@ +--- +category: majorAnalysis +--- +* Simplified and streamlined the use of NuGet sources when downloading dependencies. In fallback scenarios and specialized package downloads, NuGet sources are now passed directly to `dotnet restore` via `-s`. Furthermore, no `nuget.config` files are created for fallback scenarios, and private registries are used when attempting to download missing packages that were not restored as part of the normal `dotnet restore` process. From 41b257d004807d4bd2a32a0b8c9108deb3f76384 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Wed, 12 Aug 2026 15:06:26 +0200 Subject: [PATCH 0256/2098] C#: Address review comments. --- .../FeedManager.cs | 4 ++-- .../NugetPackageRestorer.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs index 87aa3c575790..1d5523a983cb 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs @@ -453,8 +453,8 @@ private List GetReachableFallbackNugetFeeds() if (shouldAddNugetConfigFeeds && ExplicitFeeds.Count > 0) { - // Feeds in `ExplicitFeeds` may already been checked for reachability. - // But we might use different responsiveness testing settings when we try them in the fallback logic, so checking them again. + // Feeds in `ExplicitFeeds` may already have been checked for reachability. + // However, the fallback logic may use different responsiveness settings, so check them again. fallbackFeeds.UnionWith(ExplicitFeeds); logger.LogInfo($"Using NuGet feeds from nuget.config files as fallback feeds: {string.Join(", ", ExplicitFeeds.OrderBy(f => f))}"); } diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs index f9ffd1cec272..aeedbc176867 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs @@ -473,8 +473,8 @@ private bool TryRestorePackageManually(string package, string? nugetSources, Pac if (!feedManager.CheckNugetFeedResponsiveness && res.HasNugetPackageSourceError && nugetSources is not null) { - logger.LogDebug($"Trying to restore '{package}' without nuget.config."); - // Restore could not be completed because the listed source is unavailable. Try without the nuget.config: + logger.LogDebug($"Trying to restore '{package}' without explicitly providing NuGet sources."); + // Restore could not be completed because the listed source is unavailable. Try without an explicit restore source argument. res = TryRestorePackageManually(package, nugetSources: null, tempDir, tryPrereleaseVersion); if (res.Success) { From d3062fd35b24078e55a7ed4683d44a4aa19c7326 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 12 Aug 2026 14:09:50 +0100 Subject: [PATCH 0257/2098] Remove agent instructions to not edit QL --- .github/instructions/ql-files.instructions.md | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 .github/instructions/ql-files.instructions.md diff --git a/.github/instructions/ql-files.instructions.md b/.github/instructions/ql-files.instructions.md deleted file mode 100644 index 4d331807e06e..000000000000 --- a/.github/instructions/ql-files.instructions.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -applyTo: "**/*.ql,**/*.qll" ---- -When reviewing these QL files, do not make any comment on the code itself. You don't understand the QL programming language well enough yet. You can only make comments about the following aspects: -* comments (lines starting with `//` or block comments enclosed in `/* ... */`): you can suggest improvements to the clarity of comments, or point out spelling mistakes -* typos in identifiers From a014cd540873e2eff4fdf992ceaba755e0bdc1da Mon Sep 17 00:00:00 2001 From: Michael Recachinas Date: Wed, 12 Aug 2026 09:54:38 -0400 Subject: [PATCH 0258/2098] Reconcile pull request labels from the default branch Replace the fork-approval-gated dispatcher with frequent trusted scheduled reconciliation and stable hourly recovery shards. Revalidate each open pull request and head SHA immediately before applying labels without checking out pull request code. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 512eb347-ec89-4250-8bf1-87048974b01d --- .github/workflows/labeler-apply.yml | 100 ------------------- .github/workflows/labeler.yml | 144 ++++++++++++++++++++++++++-- 2 files changed, 136 insertions(+), 108 deletions(-) delete mode 100644 .github/workflows/labeler-apply.yml diff --git a/.github/workflows/labeler-apply.yml b/.github/workflows/labeler-apply.yml deleted file mode 100644 index 8f75b00c7244..000000000000 --- a/.github/workflows/labeler-apply.yml +++ /dev/null @@ -1,100 +0,0 @@ -name: "Pull Request Labeler Apply" - -on: - workflow_run: - workflows: ["Pull Request Labeler"] - types: [completed] - -permissions: {} - -jobs: - triage: - if: > - github.event.workflow_run.event == 'pull_request' && - github.event.workflow_run.conclusion == 'success' - runs-on: ubuntu-latest - permissions: - actions: read - contents: read - pull-requests: write - steps: - - name: Validate pull request from workflow_run - id: validate - env: - GH_TOKEN: ${{ github.token }} - REPO: ${{ github.repository }} - RUN_ID: ${{ github.event.workflow_run.id }} - run: | - set -euo pipefail - - run_json=$(gh api "repos/$REPO/actions/runs/$RUN_ID") - event=$(jq -r '.event' <<<"$run_json") - conclusion=$(jq -r '.conclusion' <<<"$run_json") - head_sha=$(jq -r '.head_sha' <<<"$run_json") - head_repo=$(jq -r '.head_repository.full_name // empty' <<<"$run_json") - - if [ "$event" != "pull_request" ] || [ "$conclusion" != "success" ]; then - echo "apply=false" >> "$GITHUB_OUTPUT" - exit 0 - fi - - pr_number=$(jq -r 'if (.pull_requests | length) == 1 then .pull_requests[0].number else empty end' <<<"$run_json") - - if [ -z "$pr_number" ]; then - prs_json=$(gh api -H 'Accept: application/vnd.github+json' "repos/$REPO/commits/$head_sha/pulls" || echo '[]') - pr_number=$(jq -r 'map(select(.state == "open")) | if length == 1 then .[0].number else empty end' <<<"$prs_json" 2>/dev/null || true) - fi - - if [ -z "$pr_number" ]; then - head_owner=$(jq -r '.head_repository.owner.login // empty' <<<"$run_json") - head_branch=$(jq -r '.head_branch // empty' <<<"$run_json") - if [ -n "$head_owner" ] && [ -n "$head_branch" ]; then - prs_json=$(gh api --method GET "repos/$REPO/pulls" -f state=open -f head="$head_owner:$head_branch" || echo '[]') - pr_number=$(jq -r 'if length == 1 then .[0].number else empty end' <<<"$prs_json" 2>/dev/null || true) - fi - fi - - if [ -z "$pr_number" ]; then - echo "Could not identify a unique open pull request for workflow run $RUN_ID; skipping." - echo "apply=false" >> "$GITHUB_OUTPUT" - exit 0 - fi - - pr_json=$(gh api "repos/$REPO/pulls/$pr_number" || true) - if [ -z "$pr_json" ]; then - echo "Pull request #$pr_number could not be fetched; skipping." - echo "apply=false" >> "$GITHUB_OUTPUT" - exit 0 - fi - - state=$(jq -r '.state // empty' <<<"$pr_json" 2>/dev/null || true) - base_repo=$(jq -r '.base.repo.full_name // empty' <<<"$pr_json" 2>/dev/null || true) - pr_head_sha=$(jq -r '.head.sha // empty' <<<"$pr_json" 2>/dev/null || true) - pr_head_repo=$(jq -r '.head.repo.full_name // empty' <<<"$pr_json" 2>/dev/null || true) - - if [ -z "$state" ]; then - echo "Pull request #$pr_number could not be parsed; skipping." - echo "apply=false" >> "$GITHUB_OUTPUT" - exit 0 - fi - - if [ "$state" != "open" ] || [ "$base_repo" != "$REPO" ]; then - echo "Pull request #$pr_number is no longer an open pull request against $REPO; skipping." - echo "apply=false" >> "$GITHUB_OUTPUT" - exit 0 - fi - - if [ "$pr_head_sha" != "$head_sha" ] || [ "$pr_head_repo" != "$head_repo" ]; then - echo "Pull request #$pr_number changed since workflow run $RUN_ID; skipping stale labeling." - echo "apply=false" >> "$GITHUB_OUTPUT" - exit 0 - fi - - echo "number=$pr_number" >> "$GITHUB_OUTPUT" - echo "apply=true" >> "$GITHUB_OUTPUT" - - - uses: actions/labeler@v4 - if: steps.validate.outputs.apply == 'true' - with: - repo-token: "${{ github.token }}" - pr-number: ${{ steps.validate.outputs.number }} diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index f6f54382f9b8..e3f464331790 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -1,16 +1,144 @@ name: "Pull Request Labeler" on: - pull_request: - types: [opened, synchronize, reopened] + schedule: + # Reconcile recently updated PRs promptly, including unapproved forks and + # conflicted PRs for which pull_request workflows do not run. + - cron: "7,22,37,52 * * * *" + # Reconcile one stable shard of all open PRs each hour to recover from + # delayed or missed scheduled runs. + - cron: "12 * * * *" + workflow_dispatch: + inputs: + pr_number: + description: "Open pull request number to reconcile" + required: true + type: string -permissions: - contents: read - pull-requests: read +permissions: {} + +concurrency: + group: pull-request-labeler + cancel-in-progress: false jobs: - request-labels: + triage: + if: github.ref_name == github.event.repository.default_branch runs-on: ubuntu-latest + timeout-minutes: 30 + permissions: + contents: read + pull-requests: write steps: - - name: Request privileged labeling - run: echo "Labels are applied by the workflow_run writer after re-validating the pull request." + - uses: actions/checkout@v5 + with: + persist-credentials: false + sparse-checkout: .github/labeler.yml + sparse-checkout-cone-mode: false + + - name: Collect pull requests to reconcile + id: collect + env: + GH_TOKEN: ${{ github.token }} + REPO: ${{ github.repository }} + EVENT_NAME: ${{ github.event_name }} + SCHEDULE: ${{ github.event.schedule }} + REQUESTED_PR: ${{ inputs.pr_number }} + run: | + set -euo pipefail + + if [ "$EVENT_NAME" = "workflow_dispatch" ]; then + if [[ ! "$REQUESTED_PR" =~ ^[1-9][0-9]*$ ]]; then + echo "Invalid pull request number: $REQUESTED_PR" + exit 1 + fi + + pr_json=$(gh api "repos/$REPO/pulls/$REQUESTED_PR") + candidates=$(jq -c '[{ + number: .number, + head_sha: .head.sha + }]' <<<"$pr_json") + else + pulls_json=$(gh api --paginate \ + "repos/$REPO/pulls?state=open&sort=updated&direction=desc&per_page=100" | + jq -cs 'add') + + if [ "$SCHEDULE" = "12 * * * *" ]; then + shard=$(( ($(date -u +%s) / 3600) % 6 )) + candidates=$(jq -c --argjson shard "$shard" \ + '[.[] | select((.number % 6) == $shard) | { + number: .number, + head_sha: .head.sha + }]' <<<"$pulls_json") + else + cutoff=$(date -u -d "1 hour ago" "+%Y-%m-%dT%H:%M:%SZ") + # Hourly shards reconcile any candidates beyond this API budget. + candidates=$(jq -c --arg cutoff "$cutoff" \ + '[.[] | select(.updated_at >= $cutoff) | { + number: .number, + head_sha: .head.sha + }][0:100]' <<<"$pulls_json") + fi + fi + + echo "Collected $(jq 'length' <<<"$candidates") pull request(s)." + { + echo "candidates<> "$GITHUB_OUTPUT" + + - name: Validate pull request state + id: validate + env: + GH_TOKEN: ${{ github.token }} + REPO: ${{ github.repository }} + CANDIDATES: ${{ steps.collect.outputs.candidates }} + run: | + set -euo pipefail + + valid_numbers=() + while IFS=$'\t' read -r pr_number expected_sha; do + if [[ ! "$pr_number" =~ ^[1-9][0-9]*$ ]] || + [[ ! "$expected_sha" =~ ^[0-9a-f]{40}$ ]]; then + echo "Skipping malformed pull request candidate." + continue + fi + + if ! pr_json=$(gh api "repos/$REPO/pulls/$pr_number"); then + echo "Pull request #$pr_number could not be fetched; skipping." + continue + fi + + if ! jq -e \ + --arg repo "$REPO" \ + --arg sha "$expected_sha" \ + '.state == "open" and + .base.repo.full_name == $repo and + .head.sha == $sha and + (.head.repo.full_name | type == "string")' \ + >/dev/null <<<"$pr_json"; then + echo "Pull request #$pr_number changed or is no longer open; skipping." + continue + fi + + valid_numbers+=("$pr_number") + done < <(jq -r '.[] | [.number, .head_sha] | @tsv' <<<"$CANDIDATES") + + if [ "${#valid_numbers[@]}" -eq 0 ]; then + echo "has_prs=false" >> "$GITHUB_OUTPUT" + exit 0 + fi + + { + echo "has_prs=true" + echo "pr_numbers<> "$GITHUB_OUTPUT" + + - uses: actions/labeler@v4 + if: steps.validate.outputs.has_prs == 'true' + with: + repo-token: "${{ github.token }}" + pr-number: ${{ steps.validate.outputs.pr_numbers }} From d12e9dc2aad6c19c767cb723c24c132a715e8e5e Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Wed, 12 Aug 2026 15:40:11 +0200 Subject: [PATCH 0259/2098] Java: gate AGP-7.x Android integration tests off linux-arm64 These integration tests build an Android app via the Android Gradle Plugin (AGP), which downloads Google's prebuilt `aapt2` from Maven. The pinned AGP `7.0.0` and `7.3.1` ship no linux-aarch64 `aapt2`, so on linux-arm64 the build fails at AAPT2 daemon startup and database creation aborts. macOS arm64 is unaffected, as it uses its own `aapt2`. This is a third-party tool gap rather than anything specific to the extractor, and bumping AGP is out of scope since each test's expected output is coupled to the exact AGP and Gradle versions. Following the `java-version-too-old` precedent, gate these tests with `@(runs_on.x86_64 or runs_on.macos)` so they deselect on linux-arm64 while continuing to run on x86_64 and macOS arm64. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../android-sample-kotlin-build-script-no-wrapper/test.py | 5 +++++ .../java/android-sample-kotlin-build-script/test.py | 5 +++++ .../integration-tests/java/android-sample-no-wrapper/test.py | 5 +++++ .../test.py | 5 +++++ .../android-sample-old-style-kotlin-build-script/test.py | 5 +++++ .../java/android-sample-old-style-no-wrapper/test.py | 5 +++++ .../integration-tests/java/android-sample-old-style/test.py | 5 +++++ java/ql/integration-tests/java/android-sample/test.py | 5 +++++ 8 files changed, 40 insertions(+) diff --git a/java/ql/integration-tests/java/android-sample-kotlin-build-script-no-wrapper/test.py b/java/ql/integration-tests/java/android-sample-kotlin-build-script-no-wrapper/test.py index 67b5dde772eb..7eaea2c2d368 100644 --- a/java/ql/integration-tests/java/android-sample-kotlin-build-script-no-wrapper/test.py +++ b/java/ql/integration-tests/java/android-sample-kotlin-build-script-no-wrapper/test.py @@ -1,2 +1,7 @@ +import runs_on + + +# This Android Gradle Plugin version ships no linux-aarch64 aapt2, so the build fails on linux-arm64 (macOS arm64 works). +@(runs_on.x86_64 or runs_on.macos) def test(codeql, use_java_17, java, android_sdk): codeql.database.create() diff --git a/java/ql/integration-tests/java/android-sample-kotlin-build-script/test.py b/java/ql/integration-tests/java/android-sample-kotlin-build-script/test.py index d3399e414e61..cefeb2c86df4 100644 --- a/java/ql/integration-tests/java/android-sample-kotlin-build-script/test.py +++ b/java/ql/integration-tests/java/android-sample-kotlin-build-script/test.py @@ -1,2 +1,7 @@ +import runs_on + + +# This Android Gradle Plugin version ships no linux-aarch64 aapt2, so the build fails on linux-arm64 (macOS arm64 works). +@(runs_on.x86_64 or runs_on.macos) def test(codeql, use_java_11, java, gradle_7_4, android_sdk): codeql.database.create() diff --git a/java/ql/integration-tests/java/android-sample-no-wrapper/test.py b/java/ql/integration-tests/java/android-sample-no-wrapper/test.py index 67b5dde772eb..7eaea2c2d368 100644 --- a/java/ql/integration-tests/java/android-sample-no-wrapper/test.py +++ b/java/ql/integration-tests/java/android-sample-no-wrapper/test.py @@ -1,2 +1,7 @@ +import runs_on + + +# This Android Gradle Plugin version ships no linux-aarch64 aapt2, so the build fails on linux-arm64 (macOS arm64 works). +@(runs_on.x86_64 or runs_on.macos) def test(codeql, use_java_17, java, android_sdk): codeql.database.create() diff --git a/java/ql/integration-tests/java/android-sample-old-style-kotlin-build-script-no-wrapper/test.py b/java/ql/integration-tests/java/android-sample-old-style-kotlin-build-script-no-wrapper/test.py index 5730f55d9819..4544feb39fcb 100644 --- a/java/ql/integration-tests/java/android-sample-old-style-kotlin-build-script-no-wrapper/test.py +++ b/java/ql/integration-tests/java/android-sample-old-style-kotlin-build-script-no-wrapper/test.py @@ -1,2 +1,7 @@ +import runs_on + + +# This Android Gradle Plugin version ships no linux-aarch64 aapt2, so the build fails on linux-arm64 (macOS arm64 works). +@(runs_on.x86_64 or runs_on.macos) def test(codeql, use_java_17, java, android_sdk, actions_toolchains_file): codeql.database.create(_env={"LGTM_INDEX_MAVEN_TOOLCHAINS_FILE": str(actions_toolchains_file)}) diff --git a/java/ql/integration-tests/java/android-sample-old-style-kotlin-build-script/test.py b/java/ql/integration-tests/java/android-sample-old-style-kotlin-build-script/test.py index d3399e414e61..cefeb2c86df4 100644 --- a/java/ql/integration-tests/java/android-sample-old-style-kotlin-build-script/test.py +++ b/java/ql/integration-tests/java/android-sample-old-style-kotlin-build-script/test.py @@ -1,2 +1,7 @@ +import runs_on + + +# This Android Gradle Plugin version ships no linux-aarch64 aapt2, so the build fails on linux-arm64 (macOS arm64 works). +@(runs_on.x86_64 or runs_on.macos) def test(codeql, use_java_11, java, gradle_7_4, android_sdk): codeql.database.create() diff --git a/java/ql/integration-tests/java/android-sample-old-style-no-wrapper/test.py b/java/ql/integration-tests/java/android-sample-old-style-no-wrapper/test.py index 5730f55d9819..4544feb39fcb 100644 --- a/java/ql/integration-tests/java/android-sample-old-style-no-wrapper/test.py +++ b/java/ql/integration-tests/java/android-sample-old-style-no-wrapper/test.py @@ -1,2 +1,7 @@ +import runs_on + + +# This Android Gradle Plugin version ships no linux-aarch64 aapt2, so the build fails on linux-arm64 (macOS arm64 works). +@(runs_on.x86_64 or runs_on.macos) def test(codeql, use_java_17, java, android_sdk, actions_toolchains_file): codeql.database.create(_env={"LGTM_INDEX_MAVEN_TOOLCHAINS_FILE": str(actions_toolchains_file)}) diff --git a/java/ql/integration-tests/java/android-sample-old-style/test.py b/java/ql/integration-tests/java/android-sample-old-style/test.py index d3399e414e61..cefeb2c86df4 100644 --- a/java/ql/integration-tests/java/android-sample-old-style/test.py +++ b/java/ql/integration-tests/java/android-sample-old-style/test.py @@ -1,2 +1,7 @@ +import runs_on + + +# This Android Gradle Plugin version ships no linux-aarch64 aapt2, so the build fails on linux-arm64 (macOS arm64 works). +@(runs_on.x86_64 or runs_on.macos) def test(codeql, use_java_11, java, gradle_7_4, android_sdk): codeql.database.create() diff --git a/java/ql/integration-tests/java/android-sample/test.py b/java/ql/integration-tests/java/android-sample/test.py index d3399e414e61..cefeb2c86df4 100644 --- a/java/ql/integration-tests/java/android-sample/test.py +++ b/java/ql/integration-tests/java/android-sample/test.py @@ -1,2 +1,7 @@ +import runs_on + + +# This Android Gradle Plugin version ships no linux-aarch64 aapt2, so the build fails on linux-arm64 (macOS arm64 works). +@(runs_on.x86_64 or runs_on.macos) def test(codeql, use_java_11, java, gradle_7_4, android_sdk): codeql.database.create() From ed380dc9bf97e6ce7e5a15844ad58931425edadf Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 12 Aug 2026 12:03:13 +0100 Subject: [PATCH 0260/2098] Rust: Add some new taint metrics to rust/summary/summary-statistics. --- rust/ql/src/queries/summary/Stats.qll | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/rust/ql/src/queries/summary/Stats.qll b/rust/ql/src/queries/summary/Stats.qll index 36eeb0df4ef4..1fedec62f934 100644 --- a/rust/ql/src/queries/summary/Stats.qll +++ b/rust/ql/src/queries/summary/Stats.qll @@ -104,6 +104,17 @@ int getTaintEdgesCount() { */ int getQuerySinksCount() { result = count(QuerySink s) } +/** + * Holds if there are at least 10 data flow nodes in the same location + * as `n`. + */ +private predicate isColocated10(DataFlow::Node n) { + exists(Location l | + l = n.getLocation() and + strictcount(DataFlow::Node other | other.getLocation() = l) >= 10 + ) +} + class CrateElement extends Element { CrateElement() { this instanceof Crate or @@ -131,7 +142,9 @@ predicate extractionStats(string key, int value) { key = "Extraction warnings" and value = count(ExtractionWarning w | not exists(w.getLocation()) or w.getLocation().fromSource()) or - key = "Files extracted - total" and value = count(ExtractedFile f | exists(f.getRelativePath())) + key = "Files extracted - total" and value = count(File f) + or + key = "Files extracted - total user" and value = count(ExtractedFile f | exists(f.getRelativePath())) or key = "Files extracted - with errors" and value = @@ -201,6 +214,8 @@ predicate taintStats(string key, int value) { or key = "Taint reach - per million nodes" and value = getTaintReach().floor() or + key = "Taint nodes - highly colocated nodes" and value = count(DataFlow::Node n | isColocated10(n)) + or key = "Taint sinks - query sinks" and value = getQuerySinksCount() or key = "Taint sinks - cryptographic operations" and From 74fa98011d346978c30ba38ca7e6b8bed817f64f Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 12 Aug 2026 16:43:50 +0100 Subject: [PATCH 0261/2098] Rust: Update the tests and exclude total files from rust/summary/reduced-summary-statistics. --- .../hello-workspace/summary.cargo.expected | 2 +- .../hello-workspace/summary.rust-project.expected | 2 +- rust/ql/src/queries/summary/Stats.qll | 9 +++++++-- rust/ql/src/queries/summary/SummaryStats.ql | 2 ++ .../query-tests/diagnostics/SummaryStatsReduced.expected | 2 +- 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/rust/ql/integration-tests/hello-workspace/summary.cargo.expected b/rust/ql/integration-tests/hello-workspace/summary.cargo.expected index 11fba34f9019..85d2b9971712 100644 --- a/rust/ql/integration-tests/hello-workspace/summary.cargo.expected +++ b/rust/ql/integration-tests/hello-workspace/summary.cargo.expected @@ -1,6 +1,6 @@ | Extraction errors | 0 | | Extraction warnings | 0 | -| Files extracted - total | 4 | +| Files extracted - total user | 4 | | Files extracted - with errors | 0 | | Files extracted - without errors | 4 | | Files extracted - without errors % | 100 | diff --git a/rust/ql/integration-tests/hello-workspace/summary.rust-project.expected b/rust/ql/integration-tests/hello-workspace/summary.rust-project.expected index 11fba34f9019..85d2b9971712 100644 --- a/rust/ql/integration-tests/hello-workspace/summary.rust-project.expected +++ b/rust/ql/integration-tests/hello-workspace/summary.rust-project.expected @@ -1,6 +1,6 @@ | Extraction errors | 0 | | Extraction warnings | 0 | -| Files extracted - total | 4 | +| Files extracted - total user | 4 | | Files extracted - with errors | 0 | | Files extracted - without errors | 4 | | Files extracted - without errors % | 100 | diff --git a/rust/ql/src/queries/summary/Stats.qll b/rust/ql/src/queries/summary/Stats.qll index 1fedec62f934..0251efcb6bf6 100644 --- a/rust/ql/src/queries/summary/Stats.qll +++ b/rust/ql/src/queries/summary/Stats.qll @@ -142,8 +142,6 @@ predicate extractionStats(string key, int value) { key = "Extraction warnings" and value = count(ExtractionWarning w | not exists(w.getLocation()) or w.getLocation().fromSource()) or - key = "Files extracted - total" and value = count(File f) - or key = "Files extracted - total user" and value = count(ExtractedFile f | exists(f.getRelativePath())) or key = "Files extracted - with errors" and @@ -173,6 +171,13 @@ predicate extractionStats(string key, int value) { value = count(MacroCall mc | mc.fromSource() and not mc.hasMacroCallExpansion()) } +/** + * Gets further summary statistics about extraction. + */ +predicate extractionStatsExtra(string key, int value) { + key = "Files extracted - total" and value = count(File f) +} + /** * Gets summary statistics about inconsistencies. */ diff --git a/rust/ql/src/queries/summary/SummaryStats.ql b/rust/ql/src/queries/summary/SummaryStats.ql index 47a2c91a9eda..adfd302d0f8b 100644 --- a/rust/ql/src/queries/summary/SummaryStats.ql +++ b/rust/ql/src/queries/summary/SummaryStats.ql @@ -15,6 +15,8 @@ where or extractionStats(key, value) or + extractionStatsExtra(key, value) + or inconsistencyStats(key, value) or typeInferenceInconsistencyStats(key, value) diff --git a/rust/ql/test/query-tests/diagnostics/SummaryStatsReduced.expected b/rust/ql/test/query-tests/diagnostics/SummaryStatsReduced.expected index ed21d9772fce..7756215d1023 100644 --- a/rust/ql/test/query-tests/diagnostics/SummaryStatsReduced.expected +++ b/rust/ql/test/query-tests/diagnostics/SummaryStatsReduced.expected @@ -1,6 +1,6 @@ | Extraction errors | 0 | | Extraction warnings | 7 | -| Files extracted - total | 7 | +| Files extracted - total user | 7 | | Files extracted - with errors | 3 | | Files extracted - without errors | 4 | | Files extracted - without errors % | 57 | From df01db8ea01331a3cff151bbb6fa10e04f203382 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 12 Aug 2026 17:09:43 +0100 Subject: [PATCH 0262/2098] Rust: Autoformat. --- rust/ql/src/queries/summary/Stats.qll | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/rust/ql/src/queries/summary/Stats.qll b/rust/ql/src/queries/summary/Stats.qll index 0251efcb6bf6..5e0169254486 100644 --- a/rust/ql/src/queries/summary/Stats.qll +++ b/rust/ql/src/queries/summary/Stats.qll @@ -142,7 +142,8 @@ predicate extractionStats(string key, int value) { key = "Extraction warnings" and value = count(ExtractionWarning w | not exists(w.getLocation()) or w.getLocation().fromSource()) or - key = "Files extracted - total user" and value = count(ExtractedFile f | exists(f.getRelativePath())) + key = "Files extracted - total user" and + value = count(ExtractedFile f | exists(f.getRelativePath())) or key = "Files extracted - with errors" and value = @@ -219,7 +220,8 @@ predicate taintStats(string key, int value) { or key = "Taint reach - per million nodes" and value = getTaintReach().floor() or - key = "Taint nodes - highly colocated nodes" and value = count(DataFlow::Node n | isColocated10(n)) + key = "Taint nodes - highly colocated nodes" and + value = count(DataFlow::Node n | isColocated10(n)) or key = "Taint sinks - query sinks" and value = getQuerySinksCount() or From 710a7539ca725ab12e09d1f88da8a1d12ef5f18e Mon Sep 17 00:00:00 2001 From: Keshav Malik Date: Wed, 12 Aug 2026 23:18:34 +0530 Subject: [PATCH 0263/2098] Simplify composite action lookup --- actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql b/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql index 9a4bc007bb51..f98439063712 100644 --- a/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql +++ b/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql @@ -43,9 +43,8 @@ private predicate hasUsesContainerName(Uses uses, string name) { ) ) or - exists(UsesStep step, CompositeAction action | - uses = step and - step.getEnclosingCompositeAction() = action and + exists(CompositeAction action | + uses.getEnclosingCompositeAction() = action and name = action.getLocation().getFile().getBaseName() ) } From 82543e7aecc4e08f8b855444bc5915b5134cc7bb Mon Sep 17 00:00:00 2001 From: Mads Navntoft Date: Thu, 13 Aug 2026 09:52:33 +0200 Subject: [PATCH 0264/2098] Swift: Fix expected_files self-compare in frontend-invocations test --- swift/ql/integration-tests/posix/frontend-invocations/test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swift/ql/integration-tests/posix/frontend-invocations/test.py b/swift/ql/integration-tests/posix/frontend-invocations/test.py index 8378fc8846a9..da5b231883e7 100644 --- a/swift/ql/integration-tests/posix/frontend-invocations/test.py +++ b/swift/ql/integration-tests/posix/frontend-invocations/test.py @@ -21,4 +21,4 @@ def test(codeql, swift, expected_files): hashes.sort() for module, hash in hashes: print(module, hash, file=actual) - expected_files.add("hashes.expected") + expected_files.add("hashes.actual") From 39998944caafaee40ed5adb1abc5018f8a456811 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 13 Aug 2026 11:04:33 +0200 Subject: [PATCH 0265/2098] unified: Clarify description of derivedStoreReadStep --- .../ql/lib/codeql/unified/internal/StaticNameBinding.qll | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 4a677769f5c0..c2734381845d 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -264,13 +264,14 @@ module Track { } /** - * Holds if `node1 -> node2` is derived by combining a store and a read step. + * Holds if `node1 -> node2` is derived by combining a store and a read step, with zero or more value steps and inheritance steps in-between. */ pragma[nomagic] private predicate derivedStoreReadStep(NameBindingNode node1, NameBindingNode node2) { exists(NamespaceNode namespace, string name | - node1 = namespace.getMember(name) and - readStep(namespace.ref(), name, node2) + node1 = namespace.getMember(name) and // getMember() combines a store step with subsequent inheritance steps + readStep(namespace.ref(), name, node2) and + node1 != node2 ) } From e88dde7791c0ac2cdd2166b1c6ab0d35069cbca0 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 13 Aug 2026 11:18:40 +0200 Subject: [PATCH 0266/2098] unified: Make debug graph subset more configurable --- .../unified/internal/StaticNameBinding.qll | 38 ++++++++++++++++--- .../dev/debugStaticNameBindingGraph.ql | 9 +++-- 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index c2734381845d..bf334a52f5e6 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -42,6 +42,23 @@ class NameBindingNode extends TNameBindingNode { /** Holds if this represents the root namespace in which all named modules are members. */ predicate isModuleRoot() { this = TModuleRoot() } + /** + * Gets an AST node wrapped by this name-binding node, if such a node exists. + * + * Mainly for debugging purposes. + */ + AstNode getWrappedAstNode() { + this.isIdentifier(result) + or + this.isBulkImport(result) + or + this.isExportedNamespace(result) + or + this.isLocalNamespace(result) + or + this.isModuleScopeNode(result) + } + string toString() { exists(Identifier n | this.isIdentifier(n) and result = "Identifier(" + n + ")") or @@ -351,21 +368,32 @@ NameBindingNode trackNameDeclaration(NameDeclaration decl) { } /** Holds if `node` should be included in the debug view. */ -private signature predicate relevantFileSig(File node); +private signature predicate relevantNodeSig(AstNode node); -module DebugGraph { - private predicate relevantNode(NameBindingNode node) { - relevantFile(node.getLocation().getFile()) +module DebugGraph { + private predicate relevantNameBindingNode(NameBindingNode node) { + relevantNode(node.getWrappedAstNode()) + or + // Also consider LocalName to be relevant if any of its accesses are relevant + exists(LocalName name | + node.isLocalName(name) and + relevantNode(any(PotentialLocalNameAccess ac | ac.getLocalName() = name)) + ) + or + // Always include module root + node.isModuleRoot() } query predicate nodes(NameBindingNode node, string key, string value) { - relevantNode(node) and + relevantNameBindingNode(node) and key = "semmle.label" and value = node.toString() } query predicate edges(NameBindingNode node1, NameBindingNode node2, string key, string value) { key = "semmle.label" and + relevantNameBindingNode(node1) and + relevantNameBindingNode(node2) and ( valueStep(node1, node2) and value = "" or diff --git a/unified/ql/lib/codeql/unified/internal/dev/debugStaticNameBindingGraph.ql b/unified/ql/lib/codeql/unified/internal/dev/debugStaticNameBindingGraph.ql index 740943fc66db..f365d3915f89 100644 --- a/unified/ql/lib/codeql/unified/internal/dev/debugStaticNameBindingGraph.ql +++ b/unified/ql/lib/codeql/unified/internal/dev/debugStaticNameBindingGraph.ql @@ -9,8 +9,11 @@ private import unified private import codeql.unified.internal.StaticNameBinding /** - * Holds if graphs related to `file` should be shown in the graph. + * Holds if `node` should be shown in the graph. */ -predicate relevantFile(File file) { file.getBaseName() = "test.swift" } +predicate relevantNode(AstNode node) { + // Match an ancestor node by location so its whole subtree is shown. + node.getParent*().getLocation().toString().matches("%test.swift@13:%") +} -import DebugGraph +import DebugGraph From d30b7a0d6bc300a9dde31aae5f5878569249e328 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 13 Aug 2026 11:37:39 +0200 Subject: [PATCH 0267/2098] unified: Simplify uncertain scopes Marking Members as uncertain scopes led to inaccurate resolution when a member referred to itself, because the uncertain scope (Member) appeared in the scope chain before the LocalName scope (ClassLikeDeclaration). Meanwhile, one of the arguments for doing it, avoiding base classes etc from hitting the uncertain scope, was already fixed by local scope tree-rewrites. It gets harder to detect if a given access appears in static or instance context, but perhaps we'll probably want to expose such information through a separate predicate anyway. --- .../ql/lib/codeql/unified/internal/LocalNameBinding.qll | 6 +----- .../ql/lib/codeql/unified/internal/StaticNameBinding.qll | 9 +-------- 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index d7020c153465..da0bd0540ea2 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -317,11 +317,7 @@ private module LocalNameBindingInput implements LocalNameBindingInputSig Date: Thu, 13 Aug 2026 11:43:02 +0200 Subject: [PATCH 0268/2098] unified: Don't step into declaration sites --- unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll | 2 ++ 1 file changed, 2 insertions(+) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 037d66b13bd9..b1242cfb8a27 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -134,6 +134,7 @@ predicate readStep(NameBindingNode node1, string name, NameBindingNode node2) { ) or exists(PotentialLocalNameAccess access | + not access.isDeclarationSite() and name = access.getName() and node1 = getNodeFromUncertainScope(LocalNameBindingOutput::getAnUncertainScope(access, name)) and node2.isIdentifier(access) @@ -182,6 +183,7 @@ predicate valueStep(NameBindingNode node1, NameBindingNode node2) { node1.isIdentifier(access) and node2.isLocalName(access.getLocalName()) or + not access.isDeclarationSite() and node1.isLocalName(access.getLocalName()) and node2.isIdentifier(access) ) From bec213b4c9c5ebfcc3239e421e277adf816ce344 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 13 Aug 2026 11:43:16 +0200 Subject: [PATCH 0269/2098] shared: Factor out declInScope(name, scope) --- .../codeql/namebinding/LocalNameBinding.qll | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/shared/namebinding/codeql/namebinding/LocalNameBinding.qll b/shared/namebinding/codeql/namebinding/LocalNameBinding.qll index c4d4abdead45..1aac957d7cea 100644 --- a/shared/namebinding/codeql/namebinding/LocalNameBinding.qll +++ b/shared/namebinding/codeql/namebinding/LocalNameBinding.qll @@ -354,13 +354,17 @@ module LocalNameBinding or exists(Scope mid | lookupInScope(name, lookup, mid) and - not declInScope(_, name, mid) and - not implicitDeclInScope(name, mid) and + not declInScope(name, mid) and not isTopScope(mid) and scope = getEnclosingScope(mid) ) } + private predicate declInScope(string name, AstNode scope) { + declInScope(_, name, scope) or + implicitDeclInScope(name, scope) + } + /** * Holds if `name`, when resolved from `lookup`, may resolve to one of the uncertain members of `scope`. */ @@ -368,8 +372,7 @@ module LocalNameBinding private predicate lookupInUncertainScope(string name, Scope lookup, Scope scope) { lookupInScope(name, lookup, scope) and uncertainScope(scope) and - not declInScope(_, name, scope) and - not implicitDeclInScope(name, scope) + not declInScope(name, scope) } /** From 4eade9eae1dd5ff7d3edc86f053fb9944b36255d Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 13 Aug 2026 11:44:11 +0200 Subject: [PATCH 0270/2098] shared: Rephrase a qldoc --- shared/namebinding/codeql/namebinding/LocalNameBinding.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/namebinding/codeql/namebinding/LocalNameBinding.qll b/shared/namebinding/codeql/namebinding/LocalNameBinding.qll index 1aac957d7cea..4a9c5b61db92 100644 --- a/shared/namebinding/codeql/namebinding/LocalNameBinding.qll +++ b/shared/namebinding/codeql/namebinding/LocalNameBinding.qll @@ -376,7 +376,7 @@ module LocalNameBinding } /** - * Gets an uncertain scope that the given `accessCand` pair may resolve to. + * Gets an uncertain scope in which the `accessCand` pair may resolve. */ AstNode getAnUncertainScope(AstNode access, string name) { exists(Scope lookup | From 828816c2734bf45293774d53da279b65f0dc0525 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 13 Aug 2026 11:45:12 +0200 Subject: [PATCH 0271/2098] unified: QLdoc fix --- unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll b/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll index de9c09f5bb70..352d39bd5f00 100644 --- a/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll +++ b/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll @@ -37,7 +37,7 @@ predicate isPrivateToLocalScope(Stmt member) { } /** - * Representative for a module scope. + * A representative for a module scope. * * Module scopes can encompass a set of files, and is the canonical representative * for the top-level members collectively exported from those files. From 78671cd4cc61e6b78b6fb11e5f2bff8208209acf Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 13 Aug 2026 11:46:04 +0200 Subject: [PATCH 0272/2098] unified: Prefer 'and' instead of '|' --- .../ql/lib/codeql/unified/internal/StaticNameBinding.qll | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index b1242cfb8a27..16ae5ad2602e 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -153,8 +153,7 @@ predicate storeStep(NameBindingNode node1, string name, NameBindingNode node2) { member = cls.getAMember() and not isInstanceMember(member) and not isPrivateToLocalScope(member) and - nameDecl.getDeclaration() = member - | + nameDecl.getDeclaration() = member and node1.isIdentifier(nameDecl) and name = nameDecl.getName() and node2.isExportedNamespace(cls) @@ -163,8 +162,7 @@ predicate storeStep(NameBindingNode node1, string name, NameBindingNode node2) { exists(TopLevel top, Stmt stmt, NameDeclaration nameDecl | stmt = top.getBody().getAStmt() and not isPrivateToLocalScope(stmt) and - nameDecl.getDeclaration() = stmt - | + nameDecl.getDeclaration() = stmt and node1.isIdentifier(nameDecl) and name = nameDecl.getName() and node2 = getModuleNodeFromFile(top.getFile()) From 94cb4033fb0e8fc7c0045311f91bee929e9f4dcc Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 13 Aug 2026 11:47:01 +0200 Subject: [PATCH 0273/2098] Rust: Always force high access path precision --- rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll index f466249ada99..8793bf7a6272 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll @@ -583,7 +583,7 @@ module RustDataFlowGen implements InputSig class LambdaCallKind = LambdaCallKindAlias; - predicate forceHighPrecision(Content c) { none() } + predicate forceHighPrecision(Content c) { any() } class ContentApprox = ContentApproxAlias; From 360f281a4ab6748a91df83a37691fb33f933d238 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 13 Aug 2026 10:44:00 +0000 Subject: [PATCH 0274/2098] update codeql documentation --- .../codeql-changelog/codeql-cli-2.26.3.rst | 119 ++++++++++++++++++ .../codeql-changelog/index.rst | 1 + 2 files changed, 120 insertions(+) create mode 100644 docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.26.3.rst diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.26.3.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.26.3.rst new file mode 100644 index 000000000000..57a19ae4633a --- /dev/null +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.26.3.rst @@ -0,0 +1,119 @@ +.. _codeql-cli-2.26.3: + +========================== +CodeQL 2.26.3 (2026-08-12) +========================== + +.. contents:: Contents + :depth: 2 + :local: + :backlinks: none + +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. + +Security Coverage +----------------- + +CodeQL 2.26.3 runs a total of 497 security queries when configured with the Default suite (covering 170 CWE). The Extended suite enables an additional 131 queries (covering 32 more CWE). + +CodeQL CLI +---------- + +Bug Fixes +~~~~~~~~~ + +* Fixed the pack upload format to comply with the OCI-image-manifest specification, by ensuring that all required fields are present/valid, and that no extraneous/non-compliant fields are included. +* Fixed path canonicalization on Windows so that paths located on :code:`subst`\ ed drives are always resolved to their underlying target paths. Previously, :code:`subst`\ ed drives were not handled consistently by the CodeQL CLI and the language-specific extractors. + +Improvements +~~~~~~~~~~~~ + +* Commands that accept a :code:`--ram` option now report a clear error when given a value that is far too large to be a sensible amount of memory in megabytes (for example, a number of bytes passed by mistake), instead of failing with a cryptic "is not an int" message. + +Miscellaneous +~~~~~~~~~~~~~ + +* Upgraded Jackson from 2.18.6 to 2.18.9. + +Query Packs +----------- + +Bug Fixes +~~~~~~~~~ + +GitHub Actions +"""""""""""""" + +* The :code:`actions/output-clobbering/high` query now provides messages tailored to the affected output channel and includes expanded documentation and recommendations. +* The :code:`actions/cache-poisoning/poisonable-step` and :code:`actions/untrusted-checkout/critical` queries now start paths at the expressions that control untrusted checkouts and link their alert messages to those expressions. +* Fixed a performance issue in the :code:`actions/output-clobbering/high` query caused by using unescaped source-code input in a regular expression. + +Minor Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +JavaScript/TypeScript +""""""""""""""""""""" + +* The :code:`js/missing-rate-limiting` query now recognizes the :code:`@fastify/rate-limit` package as a rate limiter. + +GitHub Actions +"""""""""""""" + +* The :code:`actions/output-clobbering/high` query no longer reports simple :code:`jq` path filters when their output remains JSON-encoded. Raw-output modes, complex filters, and unrecognized options remain reportable. +* GitHub Actions queries now correctly classify the :code:`schedule` event when determining whether a workflow is externally triggerable. +* The :code:`actions/envvar-injection/critical` query now requires the untrusted source and privileged context to originate from the same trigger event. The environment variable injection queries also no longer treat pull request head labels as injection-capable because they cannot contain newlines. +* The :code:`actions/cache-poisoning/code-injection`, :code:`actions/cache-poisoning/direct-cache`, and :code:`actions/cache-poisoning/poisonable-step` queries now account for read-only cache access on low-trust triggers that run in the default branch scope. Results are retained for triggers that GitHub allows to write to that cache scope. + +Query Metadata Changes +~~~~~~~~~~~~~~~~~~~~~~ + +GitHub Actions +"""""""""""""" + +* The name and alert message of the :code:`actions/cache-poisoning/code-injection` query have been reworded for clarity. + +Language Libraries +------------------ + +Breaking Changes +~~~~~~~~~~~~~~~~ + +GitHub Actions +"""""""""""""" + +* The :code:`codeql.actions.security.SelfHostedQuery` module has been removed because runner labels do not reliably distinguish self-hosted runners from managed runners. + +Major Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +JavaScript/TypeScript +""""""""""""""""""""" + +* It is now possible for custom models to refer to specific files in the codebase, using a package name of form :code:`file:`. The model should describe the public exports of that file. This can be used to derive sources and sinks in code that imports the file, but note that sources and sinks will not generally be placed within the file itself. + For example, a source model :code:`['file:lib/service.js', 'Member[getData].ReturnValue', 'remote']` could identify :code:`require('../lib/service').getData()` as a source. + +Minor Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +C/C++ +""""" + +* Added flow source models for :code:`RegQueryValue` and related functions from the :code:`winreg.h` Windows header. + +JavaScript/TypeScript +""""""""""""""""""""" + +* JavaScript security queries using the :code:`response` threat model now track promise-wrapped client response data into promise fulfillment values. This may improve results for queries such as :code:`js/xss` when response data is consumed through :code:`.then(...)` chains. +* The route object returned by Vue Router's :code:`useRoute()` Composition API is now recognized as a client-side remote flow source, covering its :code:`query`, :code:`params`, :code:`path`, :code:`fullPath`, and :code:`hash` members. These members are additionally reported under the corresponding :code:`browser-url-query`, :code:`browser-url-path`, and :code:`browser-url-fragment` threat models. +* Added flow models for Vue's :code:`ref`, :code:`shallowRef`, :code:`toRef`, :code:`reactive`, and :code:`computed` Composition API helpers. +* Added support for treating declared :code:`inputs` properties in Sails Action2 controller files as remote flow sources. This may improve results for security queries such as :code:`js/path-injection`. + +Ruby +"""" + +* Removed library input to vendored gems from the set of taint sources. This should reduce false positives for :code:`rb/polynomial-redos`, :code:`rb/regex/badly-anchored-regexp`, :code:`rb/unsafe-code-construction`, :code:`rb/html-constructed-from-input`, and :code:`rb/shell-command-constructed-from-input` whenever vendoring is used. + +GitHub Actions +"""""""""""""" + +* GitHub Actions analysis now recognizes untrusted data in :code:`github.event.merge_group` for workflows triggered by the :code:`merge_group` event. diff --git a/docs/codeql/codeql-overview/codeql-changelog/index.rst b/docs/codeql/codeql-overview/codeql-changelog/index.rst index a0a2e1832d83..6562d3482c54 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/index.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/index.rst @@ -11,6 +11,7 @@ A list of queries for each suite and language `is available here Date: Thu, 13 Aug 2026 12:46:11 +0200 Subject: [PATCH 0275/2098] unified: Add test with @_exported import --- .../lib/codeql/unified/internal/StaticNameBinding.qll | 1 + .../static-name-binding/package1/Package.swift | 2 ++ .../package1/Sources/Target3/ReExport.swift | 3 +++ .../package1/Sources/Target4/UseReExport.swift | 11 +++++++++++ 4 files changed, 17 insertions(+) create mode 100644 unified/ql/test/library-tests/static-name-binding/package1/Sources/Target3/ReExport.swift create mode 100644 unified/ql/test/library-tests/static-name-binding/package1/Sources/Target4/UseReExport.swift diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 16ae5ad2602e..780b1fbd850a 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -212,6 +212,7 @@ predicate valueStep(NameBindingNode node1, NameBindingNode node2) { | node2 = getNodeFromUncertainScope(scope) or + // TODO: Add support for '@_exported' with tests, so this gets exercised // Bulk re-exporting declarations exists(TopLevel top | declaration = top.getBody().getAStmt() and diff --git a/unified/ql/test/library-tests/static-name-binding/package1/Package.swift b/unified/ql/test/library-tests/static-name-binding/package1/Package.swift index 0789887c4b4c..0c046ec542c7 100644 --- a/unified/ql/test/library-tests/static-name-binding/package1/Package.swift +++ b/unified/ql/test/library-tests/static-name-binding/package1/Package.swift @@ -7,5 +7,7 @@ let package = Package( targets: [ .target(name: "Target1"), .target(name: "Target2"), + .target(name: "Target3"), + .target(name: "Target4"), ] ) diff --git a/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target3/ReExport.swift b/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target3/ReExport.swift new file mode 100644 index 000000000000..f802bbe9d308 --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target3/ReExport.swift @@ -0,0 +1,3 @@ +@_exported import Target2 + +public class C {} // name=Target3.C diff --git a/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target4/UseReExport.swift b/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target4/UseReExport.swift new file mode 100644 index 000000000000..d9ef7c904c18 --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target4/UseReExport.swift @@ -0,0 +1,11 @@ +import Target3 // re-exports Target2 + +private protocol P { + let x1: A; // $ MISSING: access=Target2.A + let x2: B.C; // $ MISSING: access=Target2.B access=Target2.B.C + let x3: C; // $ access=Target3.C + + let x4: Target3.A; // $ MISSING: access=Target2.A + let x5: Target3.B.C; // $ MISSING: access=Target2.B access=Target2.B.C + let x6: Target3.C; // $ access=Target3.C +} From ccbab33f2712f4103a9614a034fdb3e27ea0e526 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 13 Aug 2026 12:46:49 +0200 Subject: [PATCH 0276/2098] Update shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll Co-authored-by: Anders Schack-Mulligen --- shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll | 1 - 1 file changed, 1 deletion(-) diff --git a/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll b/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll index 806b4d5a2413..285451510375 100644 --- a/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll +++ b/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll @@ -568,7 +568,6 @@ module MakeImpl Lang> { result = 0 or exists(Content c, Ap tail | - ap = apCons(c, tail) and fwdFlowConsCand(_, ap, c, _, tail) and ap != tail and // no need to report a longer length result = 1 + getAnApLengthLowerBound(tail) and From 61b372029b13ffe3d34a76562a6ccca461b5b4a1 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 13 Aug 2026 12:49:22 +0200 Subject: [PATCH 0277/2098] unified: Support @_exported imports --- .../codeql/unified/internal/NameBindingPluginSwift.qll | 5 +++-- .../ql/lib/codeql/unified/internal/StaticNameBinding.qll | 1 - .../package1/Sources/Target4/UseReExport.swift | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll b/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll index 6fd2187f47a1..52c52833c279 100644 --- a/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll +++ b/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll @@ -18,8 +18,9 @@ class NameBindingPluginSwift extends NameBindingPlugin { member = any(TopLevel top).getBody().getAStmt() and member.hasModifier(["private", "fileprivate"]) or - // Imports are always file-local - member instanceof ImportDeclaration + // Imports are always file-local, except `@_exported` import which re-export everything + member instanceof ImportDeclaration and + not member.hasModifier("@_exported") // // Note: Private class members can be seen within type-extensions in the same file, // so we can't declare those private to their local scope. diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 780b1fbd850a..16ae5ad2602e 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -212,7 +212,6 @@ predicate valueStep(NameBindingNode node1, NameBindingNode node2) { | node2 = getNodeFromUncertainScope(scope) or - // TODO: Add support for '@_exported' with tests, so this gets exercised // Bulk re-exporting declarations exists(TopLevel top | declaration = top.getBody().getAStmt() and diff --git a/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target4/UseReExport.swift b/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target4/UseReExport.swift index d9ef7c904c18..ba30deeff57a 100644 --- a/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target4/UseReExport.swift +++ b/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target4/UseReExport.swift @@ -1,11 +1,11 @@ import Target3 // re-exports Target2 private protocol P { - let x1: A; // $ MISSING: access=Target2.A - let x2: B.C; // $ MISSING: access=Target2.B access=Target2.B.C + let x1: A; // $ access=Target2.A + let x2: B.C; // $ access=Target2.B access=Target2.B.C let x3: C; // $ access=Target3.C - let x4: Target3.A; // $ MISSING: access=Target2.A - let x5: Target3.B.C; // $ MISSING: access=Target2.B access=Target2.B.C + let x4: Target3.A; // $ access=Target2.A + let x5: Target3.B.C; // $ access=Target2.B access=Target2.B.C let x6: Target3.C; // $ access=Target3.C } From 811932fc23bd23fa581e9309519d08cfaf4a5f76 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 13 Aug 2026 12:52:09 +0200 Subject: [PATCH 0278/2098] unified: Add test for spurious re-export --- .../package1/Sources/Target4/UseReExport.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target4/UseReExport.swift b/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target4/UseReExport.swift index ba30deeff57a..e0c454454073 100644 --- a/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target4/UseReExport.swift +++ b/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target4/UseReExport.swift @@ -8,4 +8,7 @@ private protocol P { let x4: Target3.A; // $ access=Target2.A let x5: Target3.B.C; // $ access=Target2.B access=Target2.B.C let x6: Target3.C; // $ access=Target3.C + + // `@_exported import Target2` should not re-export the local 'Target2' name, only its contents + let x7: Target3.Target2.A; // $ SPURIOUS: access=Target2.A } From 1f380d260ec47d6cda5ead9a0184ce42455bb8b2 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 13 Aug 2026 13:07:24 +0200 Subject: [PATCH 0279/2098] unified: Fix spurious resolution by refining isPrivateToLocalScope --- .../unified/internal/NameBindingPlugin.qll | 23 +++++++++++++++---- .../internal/NameBindingPluginSwift.qll | 8 +++++-- .../unified/internal/StaticNameBinding.qll | 6 ++--- .../Sources/Target4/UseReExport.swift | 2 +- 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll b/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll index 352d39bd5f00..a0a7028dfe92 100644 --- a/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll +++ b/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll @@ -1,5 +1,6 @@ private import unified private import codeql.util.Unit +private import codeql.unified.internal.LocalNameBinding private import codeql.unified.internal.NameBindingPluginSwift // ensure overrides are seen /** Extension point for language-specific inputs to name binding. */ @@ -14,13 +15,16 @@ class NameBindingPlugin extends Unit { predicate isInstanceMember(ClassLikeDeclaration cls, Member member) { none() } /** - * Holds if `member` is only visible in its local scope, and can thus be entirely resolved + * Holds if `binding`, declared by `member` is only visible in its local scope, and can thus be entirely resolved * by local name-binding, suppressing any store-steps that would otherwise be induced from the member. * * Need only be implemented for members that occur in the context of class or top-level, as other * contexts are considered local already. + * + * `binding` refers to an `Identifier` or `BulkImportingPattern` bound by the member. */ - predicate isPrivateToLocalScope(Stmt member) { none() } + bindingset[member, binding] + predicate isPrivateToLocalScope(Stmt member, AstNode binding) { none() } } /** Holds if `member` is an instance member. */ @@ -31,9 +35,18 @@ predicate isInstanceMember(Member member) { ) } -/** Holds if `member` is only visible in its local scope. */ -predicate isPrivateToLocalScope(Stmt member) { - any(NameBindingPlugin p).isPrivateToLocalScope(member) +/** Holds if `binding` is only visible in its local scope. */ +pragma[nomagic] +predicate isPrivateToLocalScope(AstNode binding) { + exists(Stmt member | + bindingContext(binding, _, member) and + ( + member = any(ClassLikeDeclaration cls).getAMember() or + member = any(TopLevel t).getBody().getAStmt() + ) and + (binding instanceof NameDeclaration or binding instanceof BulkImportingPattern) and + any(NameBindingPlugin p).isPrivateToLocalScope(member, binding) + ) } /** diff --git a/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll b/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll index 52c52833c279..eaa8f46c65f4 100644 --- a/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll +++ b/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll @@ -13,14 +13,18 @@ class NameBindingPluginSwift extends NameBindingPlugin { not member.hasModifier(["static", "class", "enum_case"]) } - override predicate isPrivateToLocalScope(Stmt member) { + bindingset[member, binding] + override predicate isPrivateToLocalScope(Stmt member, AstNode binding) { // Private top-level members member = any(TopLevel top).getBody().getAStmt() and member.hasModifier(["private", "fileprivate"]) or // Imports are always file-local, except `@_exported` import which re-export everything member instanceof ImportDeclaration and - not member.hasModifier("@_exported") + not ( + member.hasModifier("@_exported") and + binding instanceof BulkImportingPattern + ) // // Note: Private class members can be seen within type-extensions in the same file, // so we can't declare those private to their local scope. diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 16ae5ad2602e..907cc9f14010 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -152,7 +152,7 @@ predicate storeStep(NameBindingNode node1, string name, NameBindingNode node2) { exists(ClassLikeDeclaration cls, Member member, NameDeclaration nameDecl | member = cls.getAMember() and not isInstanceMember(member) and - not isPrivateToLocalScope(member) and + not isPrivateToLocalScope(nameDecl) and nameDecl.getDeclaration() = member and node1.isIdentifier(nameDecl) and name = nameDecl.getName() and @@ -161,7 +161,7 @@ predicate storeStep(NameBindingNode node1, string name, NameBindingNode node2) { or exists(TopLevel top, Stmt stmt, NameDeclaration nameDecl | stmt = top.getBody().getAStmt() and - not isPrivateToLocalScope(stmt) and + not isPrivateToLocalScope(nameDecl) and nameDecl.getDeclaration() = stmt and node1.isIdentifier(nameDecl) and name = nameDecl.getName() and @@ -215,7 +215,7 @@ predicate valueStep(NameBindingNode node1, NameBindingNode node2) { // Bulk re-exporting declarations exists(TopLevel top | declaration = top.getBody().getAStmt() and - not isPrivateToLocalScope(declaration) and + not isPrivateToLocalScope(p) and node2 = getModuleNodeFromFile(top.getFile()) ) ) diff --git a/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target4/UseReExport.swift b/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target4/UseReExport.swift index e0c454454073..677cd6a67299 100644 --- a/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target4/UseReExport.swift +++ b/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target4/UseReExport.swift @@ -10,5 +10,5 @@ private protocol P { let x6: Target3.C; // $ access=Target3.C // `@_exported import Target2` should not re-export the local 'Target2' name, only its contents - let x7: Target3.Target2.A; // $ SPURIOUS: access=Target2.A + let x7: Target3.Target2.A; // should not resolve } From aa48658a760046b6c42ada55a63f46769bbd074f Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 13 Aug 2026 13:28:32 +0200 Subject: [PATCH 0280/2098] Data flow: Remove unused variable --- shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll b/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll index 285451510375..c6bdcc206b45 100644 --- a/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll +++ b/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll @@ -567,8 +567,8 @@ module MakeImpl Lang> { ap instanceof ApNil and result = 0 or - exists(Content c, Ap tail | - fwdFlowConsCand(_, ap, c, _, tail) and + exists(Ap tail | + fwdFlowConsCand(_, ap, _, _, tail) and ap != tail and // no need to report a longer length result = 1 + getAnApLengthLowerBound(tail) and result <= accessPathLimit() From 4321ba17379c0ba550d92ba29f982d34c03b44ae Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Thu, 13 Aug 2026 13:31:39 +0200 Subject: [PATCH 0281/2098] Gate remaining Android integration tests off linux-arm64 Completes the arm64 gating begun in #22327 for the last two Android-driving java integration tests, so all 10 (the 8 already merged + these) are deselected on linux-arm64 while mac-arm64 and x86_64 stay green. android-8-sample: AGP 8.0.0 ships no linux-aarch64 aapt2 (Google's Maven publishes only linux/osx/windows classifiers), so the build fails on linux-arm64 with an x86-64 aapt2 exec'd on aarch64. android-gradle-incompatibility: gated to avoid conflating that same x86_64-only aapt2 build failure on linux-arm64 with the AGP/Gradle-version incompatibility failure this test asserts (otherwise the test would pass for the wrong reason). Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- java/ql/integration-tests/java/android-8-sample/test.py | 5 +++++ .../java/diagnostics/android-gradle-incompatibility/test.py | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/java/ql/integration-tests/java/android-8-sample/test.py b/java/ql/integration-tests/java/android-8-sample/test.py index 72e3c5d3fc47..3b38eb208893 100644 --- a/java/ql/integration-tests/java/android-8-sample/test.py +++ b/java/ql/integration-tests/java/android-8-sample/test.py @@ -1,4 +1,9 @@ +import runs_on + + # Put Java 11 on the path so as to challenge our version selection logic: Java 11 is unsuitable for Android Gradle Plugin 8+, # so it will be necessary to notice Java 17 available in the environment and actively select it. +# This Android Gradle Plugin version ships no linux-aarch64 aapt2, so the build fails on linux-arm64 (macOS arm64 works). +@(runs_on.x86_64 or runs_on.macos) def test(codeql, use_java_11, java, gradle_8_0, android_sdk): codeql.database.create() diff --git a/java/ql/integration-tests/java/diagnostics/android-gradle-incompatibility/test.py b/java/ql/integration-tests/java/diagnostics/android-gradle-incompatibility/test.py index f58e84e77a2f..64112d0e5e62 100644 --- a/java/ql/integration-tests/java/diagnostics/android-gradle-incompatibility/test.py +++ b/java/ql/integration-tests/java/diagnostics/android-gradle-incompatibility/test.py @@ -1,2 +1,7 @@ +import runs_on + + +# Deselected on linux-arm64: the build also fails there due to the x86_64-only aapt2 gap, which would conflate with the AGP/Gradle-incompatibility failure this test asserts. +@(runs_on.x86_64 or runs_on.macos) def test(codeql, java, gradle_7_3, android_sdk): codeql.database.create(_assert_failure=True) From e4cf8d6ed8bd77c84a761440697a395b9439ba87 Mon Sep 17 00:00:00 2001 From: Keshav Malik Date: Thu, 13 Aug 2026 17:40:01 +0530 Subject: [PATCH 0282/2098] Refactor antiforgery validation query --- .../MissingAntiForgeryTokenValidation.ql | 73 ++++++++++++------- 1 file changed, 45 insertions(+), 28 deletions(-) diff --git a/csharp/ql/src/Security Features/CWE-352/MissingAntiForgeryTokenValidation.ql b/csharp/ql/src/Security Features/CWE-352/MissingAntiForgeryTokenValidation.ql index a1cb7f9f506a..77a3f2b59450 100644 --- a/csharp/ql/src/Security Features/CWE-352/MissingAntiForgeryTokenValidation.ql +++ b/csharp/ql/src/Security Features/CWE-352/MissingAntiForgeryTokenValidation.ql @@ -75,7 +75,6 @@ private predicate hasAspNetCoreAntiForgeryMiddleware() { ) } -bindingset[method] private RequireAntiforgeryTokenAttribute getEffectiveRequireAntiforgeryTokenAttributeOnMethod( Method method ) { @@ -90,7 +89,6 @@ private RequireAntiforgeryTokenAttribute getEffectiveRequireAntiforgeryTokenAttr ) } -bindingset[controller] private RequireAntiforgeryTokenAttribute getEffectiveRequireAntiforgeryTokenAttributeOnClass( Class controller ) { @@ -105,34 +103,53 @@ private RequireAntiforgeryTokenAttribute getEffectiveRequireAntiforgeryTokenAttr ) } -bindingset[controller, method] -private RequireAntiforgeryTokenAttribute getEffectiveRequireAntiforgeryTokenAttribute( - Class controller, Method method -) { - result = getEffectiveRequireAntiforgeryTokenAttributeOnMethod(method) - or - not exists(getEffectiveRequireAntiforgeryTokenAttributeOnMethod(method)) and - result = getEffectiveRequireAntiforgeryTokenAttributeOnClass(controller) +class MvcControllerPostMethod extends Method { + private Controller controller; + + MvcControllerPostMethod() { controller.getAPostActionMethod() = this } + + predicate hasValidateAntiForgeryAttribute() { + this.getAnAttribute() instanceof ValidateAntiForgeryTokenAttribute or + controller.getABaseType*().getAnAttribute() instanceof ValidateAntiForgeryTokenAttribute + } } -bindingset[controller, method] -private predicate hasAspNetCoreAntiForgeryValidation(Class controller, Method method) { - method.getAnAttribute() instanceof AspNetCore::ValidateAntiForgeryAttribute - or - controller.getABaseType*().getAnAttribute() instanceof AspNetCore::ValidateAntiForgeryAttribute - or - hasAspNetCoreAntiForgeryMiddleware() and - getEffectiveRequireAntiforgeryTokenAttribute(controller, method).requiresValidation() +class AspNetCoreControllerPostMethod extends Method { + private AspNetCore::MicrosoftAspNetCoreMvcController controller; + + AspNetCoreControllerPostMethod() { + controller.getAnActionMethod() = this and + this.getAnAttribute() instanceof AspNetCore::MicrosoftAspNetCoreMvcHttpPostAttribute + } + + predicate hasValidateAntiForgeryAttribute() { + this.getAnAttribute() instanceof AspNetCore::ValidateAntiForgeryAttribute or + controller.getABaseType*().getAnAttribute() instanceof AspNetCore::ValidateAntiForgeryAttribute + } + + predicate hasRequireAntiForgeryAttribute() { + hasAspNetCoreAntiForgeryMiddleware() and + ( + getEffectiveRequireAntiforgeryTokenAttributeOnMethod(this).requiresValidation() + or + not exists(getEffectiveRequireAntiforgeryTokenAttributeOnMethod(this)) and + getEffectiveRequireAntiforgeryTokenAttributeOnClass(controller).requiresValidation() + ) + } } -predicate isUnvalidatedPostMethod(Class c, Method m) { - c.(Controller).getAPostActionMethod() = m and - not m.getAnAttribute() instanceof ValidateAntiForgeryTokenAttribute and - not c.getABaseType*().getAnAttribute() instanceof ValidateAntiForgeryTokenAttribute - or - c.(AspNetCore::MicrosoftAspNetCoreMvcController).getAnActionMethod() = m and - m.getAnAttribute() instanceof AspNetCore::MicrosoftAspNetCoreMvcHttpPostAttribute and - not hasAspNetCoreAntiForgeryValidation(c, m) +predicate isUnvalidatedAspNetCorePostMethod(AspNetCoreControllerPostMethod m) { + not m.hasValidateAntiForgeryAttribute() and + not m.hasRequireAntiForgeryAttribute() +} + +predicate isUnvalidatedMvcPostMethod(MvcControllerPostMethod m) { + not m.hasValidateAntiForgeryAttribute() +} + +predicate isUnvalidatedPostMethod(Method m) { + isUnvalidatedMvcPostMethod(m) or + isUnvalidatedAspNetCorePostMethod(m) } Element getAValidatedElement() { @@ -144,9 +161,9 @@ Element getAValidatedElement() { any(RequireAntiforgeryTokenAttribute a | a.requiresValidation()).getTarget() = result } -from Class c, Method postMethod +from Method postMethod where - isUnvalidatedPostMethod(c, postMethod) and + isUnvalidatedPostMethod(postMethod) and // Verify that validate anti forgery token attributes are used somewhere within this project, to // avoid reporting false positives on projects that use an alternative approach to mitigate CSRF // issues. From 719e8b41963127137c261289fa6dde0867ceb11b Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 13 Aug 2026 14:21:38 +0200 Subject: [PATCH 0283/2098] unified: Prefer instanceof --- unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index da0bd0540ea2..e9ffcd8a29af 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -317,7 +317,7 @@ private module LocalNameBindingInput implements LocalNameBindingInputSig Date: Wed, 12 Aug 2026 11:39:50 +0000 Subject: [PATCH 0284/2098] Bazel: Update to latest `rules_cc`, `rules_swift`, and `apple_support` Note that `rules_swift` requires the versions of `apple_support` and `rules_cc` we're updating to. Also update the Swift version we use in the build to 6.3.3, which is supported out-of-the-box by the new `rules_swift` version. --- .bazelrc | 3 +++ MODULE.bazel | 8 ++++---- unified/swift-syntax-rs/.swift-version | 2 +- unified/swift-syntax-rs/BUILD.bazel | 17 +++++++++++++---- unified/swift-syntax-rs/README.md | 2 +- .../swift-syntax-rs/swift_runtime_linking.bzl | 11 +++++++++++ 6 files changed, 33 insertions(+), 10 deletions(-) create mode 100644 unified/swift-syntax-rs/swift_runtime_linking.bzl diff --git a/.bazelrc b/.bazelrc index 8687f4406cb9..e34a363a16fc 100644 --- a/.bazelrc +++ b/.bazelrc @@ -11,6 +11,9 @@ build --compilation_mode opt common --override_module=semmle_code=%workspace%/misc/bazel/semmle_code_stub build --repo_env=CC=clang --repo_env=CXX=clang++ +# The standalone Linux toolchain uses gold, which does not support the +# LLD-specific -z nostart-stop-gc workaround enabled by rules_swift. +build:linux --features=-swift.lld_gc_workaround # Disable Android SDK auto-detection (we don't use it, and rules_android has Bazel 9 compatibility issues) build --repo_env=ANDROID_HOME= diff --git a/MODULE.bazel b/MODULE.bazel index e8d49c11bcb4..0584af40dc69 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -15,7 +15,7 @@ local_path_override( # see https://registry.bazel.build/ for a list of available packages bazel_dep(name = "platforms", version = "1.0.0") -bazel_dep(name = "rules_cc", version = "0.2.17") +bazel_dep(name = "rules_cc", version = "0.2.20") bazel_dep(name = "rules_go", version = "0.60.0") bazel_dep(name = "rules_java", version = "9.6.1") bazel_dep(name = "rules_pkg", version = "1.2.0") @@ -31,13 +31,13 @@ bazel_dep(name = "gazelle", version = "0.50.0") bazel_dep(name = "rules_dotnet", version = "0.21.5-codeql.1") bazel_dep(name = "googletest", version = "1.17.0.bcr.2") bazel_dep(name = "rules_rust", version = "0.69.0") -bazel_dep(name = "rules_swift", version = "4.0.0-rc4") +bazel_dep(name = "rules_swift", version = "4.0.0-rc5") bazel_dep(name = "swift-syntax", version = "603.0.2") # Needed so we can `use_repo` `local_config_xcode` and # `local_config_apple_cc_toolchains` below (referenced by the per-target # Xcode-config transition in `unified/swift-syntax-rs/xcode_transition.bzl`). -bazel_dep(name = "apple_support", version = "2.6.1") +bazel_dep(name = "apple_support", version = "2.8.0") bazel_dep(name = "zstd", version = "1.5.7.bcr.1") bazel_dep(name = "buildifier_prebuilt", version = "6.4.0", dev_dependency = True) @@ -238,7 +238,7 @@ use_repo( swift = use_extension("@rules_swift//swift:extensions.bzl", "swift") swift.toolchain( name = "swift_toolchain", - swift_version = "6.3.2", + swift_version = "6.3.3", ) use_repo( swift, diff --git a/unified/swift-syntax-rs/.swift-version b/unified/swift-syntax-rs/.swift-version index 91e4a9f26224..7849b73dc743 100644 --- a/unified/swift-syntax-rs/.swift-version +++ b/unified/swift-syntax-rs/.swift-version @@ -1 +1 @@ -6.3.2 +6.3.3 diff --git a/unified/swift-syntax-rs/BUILD.bazel b/unified/swift-syntax-rs/BUILD.bazel index 0f04f3e9182c..b1d0d40207f7 100644 --- a/unified/swift-syntax-rs/BUILD.bazel +++ b/unified/swift-syntax-rs/BUILD.bazel @@ -2,6 +2,7 @@ load("@rules_cc//cc:defs.bzl", "cc_library") load("@rules_rust//rust:defs.bzl", "rust_binary", "rust_library", "rust_test") load("//unified:platforms.bzl", "UNIFIED_SUPPORTED_PLATFORMS") load(":swift_runtime.bzl", "swift_runtime_libs") +load(":swift_runtime_linking.bzl", "swift_runtime_linking") load(":xcode_transition.bzl", "xcode_transition_swift_library") package(default_visibility = ["//visibility:public"]) @@ -11,15 +12,23 @@ swift_runtime_libs( toolchain = "@swift_toolchain_ubuntu22.04//:files", ) -# The `$ORIGIN` runpath makes an executable look beside itself instead, so -# we find the Swift runtime libraries we bundle with the extractor. +swift_runtime_linking( + name = "_swift_runtime_cc_info", +) + +# On Linux, provide the downloaded Swift runtime at link time and look beside +# the executable for the copies bundled with the extractor at runtime. cc_library( - name = "swift_runtime_rpath", + name = "swift_runtime_linking", linkopts = select({ "@platforms//os:linux": ["-Wl,-rpath,$$ORIGIN"], "//conditions:default": [], }), target_compatible_with = UNIFIED_SUPPORTED_PLATFORMS, + deps = select({ + "@platforms//os:linux": [":_swift_runtime_cc_info"], + "//conditions:default": [], + }), ) # Swift FFI shim: wraps swift-syntax and exposes a small C ABI. @@ -46,7 +55,7 @@ rust_library( edition = "2024", target_compatible_with = UNIFIED_SUPPORTED_PLATFORMS, deps = [ - ":swift_runtime_rpath", + ":swift_runtime_linking", ":swift_syntax_ffi", ], ) diff --git a/unified/swift-syntax-rs/README.md b/unified/swift-syntax-rs/README.md index 8a93e4739d9d..f4e84e18f361 100644 --- a/unified/swift-syntax-rs/README.md +++ b/unified/swift-syntax-rs/README.md @@ -129,7 +129,7 @@ The build does not depend on any particular version manager. You need: - **Rust** — pinned to `1.88` by the repo-root [`rust-toolchain.toml`](../../rust-toolchain.toml), which `rustup` picks up automatically. - **Swift** — pinned to the version in [`.swift-version`](.swift-version) - (currently `6.3.2`), used to build `swift-syntax` `603.0.2`. Install it any way + (currently `6.3.3`), used to build `swift-syntax` `603.0.2`. Install it any way you like — [swift.org](https://www.swift.org/install/) or [swiftly](https://www.swift.org/swiftly/) (which reads `.swift-version`), or a system package. Just make sure `swift` (and `swiftc`) are on your `PATH` — diff --git a/unified/swift-syntax-rs/swift_runtime_linking.bzl b/unified/swift-syntax-rs/swift_runtime_linking.bzl new file mode 100644 index 000000000000..ec2577d2e3df --- /dev/null +++ b/unified/swift-syntax-rs/swift_runtime_linking.bzl @@ -0,0 +1,11 @@ +"""Expose the selected Swift toolchain's dynamic runtime to native dependents.""" + +load("@rules_swift//swift:swift.bzl", "swift_common") + +def _swift_runtime_linking_impl(ctx): + return [swift_common.get_toolchain(ctx).dynamic_runtime_cc_info] + +swift_runtime_linking = rule( + implementation = _swift_runtime_linking_impl, + toolchains = swift_common.use_toolchain(), +) From 8ebd3bc6cc4899c066fc992d9169fd8905dfbbf9 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema <93738568+jketema@users.noreply.github.com> Date: Wed, 12 Aug 2026 13:48:25 +0000 Subject: [PATCH 0285/2098] Bazel: Address Copilot review comment --- unified/swift-syntax-rs/BUILD.bazel | 2 ++ 1 file changed, 2 insertions(+) diff --git a/unified/swift-syntax-rs/BUILD.bazel b/unified/swift-syntax-rs/BUILD.bazel index b1d0d40207f7..95f644b200f4 100644 --- a/unified/swift-syntax-rs/BUILD.bazel +++ b/unified/swift-syntax-rs/BUILD.bazel @@ -14,6 +14,8 @@ swift_runtime_libs( swift_runtime_linking( name = "_swift_runtime_cc_info", + target_compatible_with = ["@platforms//os:linux"], + visibility = ["//visibility:private"], ) # On Linux, provide the downloaded Swift runtime at link time and look beside From d32650eaf99e69023953c1c8b0eae22deb92a559 Mon Sep 17 00:00:00 2001 From: Mads Navntoft Date: Thu, 13 Aug 2026 14:57:50 +0200 Subject: [PATCH 0286/2098] Use expected_files.add as context manager where applicable --- .../integration-tests/kotlin/all-platforms/logs/test.py | 3 +-- misc/pytest/lib/query_suites.py | 8 ++++---- .../integration-tests/posix/frontend-invocations/test.py | 3 +-- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/java/ql/integration-tests/kotlin/all-platforms/logs/test.py b/java/ql/integration-tests/kotlin/all-platforms/logs/test.py index 38a385f0e7d3..44965f0f2dcc 100644 --- a/java/ql/integration-tests/kotlin/all-platforms/logs/test.py +++ b/java/ql/integration-tests/kotlin/all-platforms/logs/test.py @@ -6,9 +6,8 @@ def test(codeql, java_full, cwd: pathlib.Path, expected_files): codeql.database.create(command=["kotlinc test.kt"]) - expected_files.add("logs.actual") - with open("logs.actual", "w") as f_out: + with expected_files.add("logs.actual") as f_out: log_dir = cwd / "test-db" / "log" for file_index, log_file in enumerate(log_dir.glob("kotlin-extractor*.log"), 1): f_out.write(f"Log file {file_index}\n") diff --git a/misc/pytest/lib/query_suites.py b/misc/pytest/lib/query_suites.py index fcbb1f16bde0..1e70008f65bc 100644 --- a/misc/pytest/lib/query_suites.py +++ b/misc/pytest/lib/query_suites.py @@ -9,8 +9,8 @@ def ret(query_suite): actual = sorted(actual.splitlines()) actual = [os.path.relpath(q, semmle_code_dir) for q in actual] actual_file_name = query_suite + '.actual' - expected_files.add(actual_file_name) - (cwd / actual_file_name).write_text('\n'.join(actual) + '\n') + with expected_files.add(actual_file_name) as f: + f.write('\n'.join(actual) + '\n') return ret @pytest.fixture @@ -25,6 +25,6 @@ def ret(lang_folder_name, query_suites): not_included = sorted(set(all_queries) - included_in_qls) not_included = [os.path.relpath(q, semmle_code_dir) for q in not_included] not_included_file_name = 'not_included_in_qls.actual' - expected_files.add(not_included_file_name) - (cwd / not_included_file_name).write_text('\n'.join(not_included) + '\n') + with expected_files.add(not_included_file_name) as f: + f.write('\n'.join(not_included) + '\n') return ret diff --git a/swift/ql/integration-tests/posix/frontend-invocations/test.py b/swift/ql/integration-tests/posix/frontend-invocations/test.py index da5b231883e7..1ec0ed83eb87 100644 --- a/swift/ql/integration-tests/posix/frontend-invocations/test.py +++ b/swift/ql/integration-tests/posix/frontend-invocations/test.py @@ -13,7 +13,7 @@ def test(codeql, swift, expected_files): with open(f, "rb") as module: print(f.name, sha256(module.read()).hexdigest(), file=expected) - with open("hashes.actual", "w") as actual: + with expected_files.add("hashes.actual") as actual: hashes = [ (s.name, s.resolve().name) for s in Path("test-db/working/swift-extraction-artifacts/store").iterdir() @@ -21,4 +21,3 @@ def test(codeql, swift, expected_files): hashes.sort() for module, hash in hashes: print(module, hash, file=actual) - expected_files.add("hashes.actual") From 2c67a0878b103d7aeae6e9b0272adaa0ba6013ec Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Thu, 13 Aug 2026 15:17:57 +0200 Subject: [PATCH 0287/2098] Make android-gradle-incompatibility gating comment self-contained It no longer reads as a cross-reference to the android-8-sample comment. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: f6519783-e7e9-4ddb-850f-e7b5b9f417f8 --- .../java/diagnostics/android-gradle-incompatibility/test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/ql/integration-tests/java/diagnostics/android-gradle-incompatibility/test.py b/java/ql/integration-tests/java/diagnostics/android-gradle-incompatibility/test.py index 64112d0e5e62..5131ab601762 100644 --- a/java/ql/integration-tests/java/diagnostics/android-gradle-incompatibility/test.py +++ b/java/ql/integration-tests/java/diagnostics/android-gradle-incompatibility/test.py @@ -1,7 +1,7 @@ import runs_on -# Deselected on linux-arm64: the build also fails there due to the x86_64-only aapt2 gap, which would conflate with the AGP/Gradle-incompatibility failure this test asserts. +# Deselected on linux-arm64: there the AGP build fails because no linux-aarch64 aapt2 exists, which is unrelated to the AGP/Gradle version incompatibility this test asserts and would otherwise let it pass for the wrong reason. @(runs_on.x86_64 or runs_on.macos) def test(codeql, java, gradle_7_3, android_sdk): codeql.database.create(_assert_failure=True) From 33c26b0a097d22cfc234cdc7cedb98ad03ac28b6 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Thu, 13 Aug 2026 16:38:12 +0200 Subject: [PATCH 0288/2098] Go: support linux-arm64 in autobuild scripts The go autobuilder, extractor and identify-environment tools are arch-native and their per-platform binaries are already built for linux-arm64, but the unix wrapper scripts hard-gated on linux64/osx64 and bailed with "Automatic build detection ... is not implemented" on arm64. Allow linux-arm64 so Go extraction works on native Linux Arm64. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- go/codeql-tools/autobuild.sh | 2 +- go/codeql-tools/identify-environment.sh | 2 +- go/codeql-tools/index.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go/codeql-tools/autobuild.sh b/go/codeql-tools/autobuild.sh index 585152e676e2..85060a3d9bde 100755 --- a/go/codeql-tools/autobuild.sh +++ b/go/codeql-tools/autobuild.sh @@ -2,7 +2,7 @@ set -eu -if [ "$CODEQL_PLATFORM" != "linux64" ] && [ "$CODEQL_PLATFORM" != "osx64" ] ; then +if [ "$CODEQL_PLATFORM" != "linux64" ] && [ "$CODEQL_PLATFORM" != "linux-arm64" ] && [ "$CODEQL_PLATFORM" != "osx64" ] ; then echo "Automatic build detection for $CODEQL_PLATFORM is not implemented." exit 1 fi diff --git a/go/codeql-tools/identify-environment.sh b/go/codeql-tools/identify-environment.sh index 27d483290656..917a59225744 100755 --- a/go/codeql-tools/identify-environment.sh +++ b/go/codeql-tools/identify-environment.sh @@ -2,7 +2,7 @@ set -eu -if [ "$CODEQL_PLATFORM" != "linux64" ] && [ "$CODEQL_PLATFORM" != "osx64" ] ; then +if [ "$CODEQL_PLATFORM" != "linux64" ] && [ "$CODEQL_PLATFORM" != "linux-arm64" ] && [ "$CODEQL_PLATFORM" != "osx64" ] ; then echo "Automatic build detection for $CODEQL_PLATFORM is not implemented." exit 1 fi diff --git a/go/codeql-tools/index.sh b/go/codeql-tools/index.sh index 877400d37f2a..de2790ceca70 100755 --- a/go/codeql-tools/index.sh +++ b/go/codeql-tools/index.sh @@ -2,7 +2,7 @@ set -eu -if [ "$CODEQL_PLATFORM" != "linux64" ] && [ "$CODEQL_PLATFORM" != "osx64" ] ; then +if [ "$CODEQL_PLATFORM" != "linux64" ] && [ "$CODEQL_PLATFORM" != "linux-arm64" ] && [ "$CODEQL_PLATFORM" != "osx64" ] ; then echo "Automatic build detection for $CODEQL_PLATFORM is not implemented." exit 1 fi From 8f5a8dbe2b5900f3f8bb8c40921748022d24c4a7 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Thu, 13 Aug 2026 17:30:19 +0200 Subject: [PATCH 0289/2098] Unified: Bazel downloaded toolchain on macOS --- MODULE.bazel | 22 +--- .../4.0.0-rc5-codeql.1/MODULE.bazel | 79 ++++++++++++++ .../register_downloaded_macos_toolchain.patch | 103 ++++++++++++++++++ .../4.0.0-rc5-codeql.1/source.json | 8 ++ .../modules/rules_swift/metadata.json | 11 ++ unified/swift-syntax-rs/BUILD.bazel | 4 +- unified/swift-syntax-rs/README.md | 24 ++-- unified/swift-syntax-rs/xcode_transition.bzl | 92 ---------------- 8 files changed, 216 insertions(+), 127 deletions(-) create mode 100644 misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/MODULE.bazel create mode 100644 misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/patches/register_downloaded_macos_toolchain.patch create mode 100644 misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/source.json create mode 100644 misc/bazel/registry/modules/rules_swift/metadata.json delete mode 100644 unified/swift-syntax-rs/xcode_transition.bzl diff --git a/MODULE.bazel b/MODULE.bazel index 0584af40dc69..be1ec97cfd99 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -31,13 +31,8 @@ bazel_dep(name = "gazelle", version = "0.50.0") bazel_dep(name = "rules_dotnet", version = "0.21.5-codeql.1") bazel_dep(name = "googletest", version = "1.17.0.bcr.2") bazel_dep(name = "rules_rust", version = "0.69.0") -bazel_dep(name = "rules_swift", version = "4.0.0-rc5") +bazel_dep(name = "rules_swift", version = "4.0.0-rc5-codeql.1") bazel_dep(name = "swift-syntax", version = "603.0.2") - -# Needed so we can `use_repo` `local_config_xcode` and -# `local_config_apple_cc_toolchains` below (referenced by the per-target -# Xcode-config transition in `unified/swift-syntax-rs/xcode_transition.bzl`). -bazel_dep(name = "apple_support", version = "2.8.0") bazel_dep(name = "zstd", version = "1.5.7.bcr.1") bazel_dep(name = "buildifier_prebuilt", version = "6.4.0", dev_dependency = True) @@ -223,10 +218,7 @@ use_repo( "swift-resource-dir-macos", ) -# Swift toolchain for building `unified/swift-syntax-rs`. On Linux we register -# a hermetic swift.org toolchain as the exec toolchain; on macOS `rules_swift` -# auto-registers `xcode_swift_toolchain` (host Xcode + OS-provided Swift -# runtime), which is not hermetic. +# Hermetic swift.org toolchain for building `unified/swift-syntax-rs`. # # The version is pinned as a literal rather than read from # `unified/swift-syntax-rs/.swift-version` via `swift_version_file`: the latter @@ -244,20 +236,14 @@ use_repo( swift, "swift_toolchain", "swift_toolchain_ubuntu22.04", + "swift_toolchain_xcode", ) register_toolchains( "@swift_toolchain//:swift_toolchain_exec_ubuntu22.04", + "@swift_toolchain//:swift_toolchain_exec_xcode", ) -# `apple_support`'s xcode_config and CC toolchains, needed by the Xcode -# transition in `unified/swift-syntax-rs/xcode_transition.bzl`. -xcode_configure = use_extension("@apple_support//xcode:xcode_configure.bzl", "xcode_configure_extension") -use_repo(xcode_configure, "local_config_xcode") - -apple_cc_configure = use_extension("@apple_support//crosstool:setup.bzl", "apple_cc_configure_extension") -use_repo(apple_cc_configure, "local_config_apple_cc_toolchains") - node = use_extension("@rules_nodejs//nodejs:extensions.bzl", "node") node.toolchain( name = "nodejs", diff --git a/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/MODULE.bazel b/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/MODULE.bazel new file mode 100644 index 000000000000..f83ac395da02 --- /dev/null +++ b/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/MODULE.bazel @@ -0,0 +1,79 @@ +"""rules_swift MODULE.bazel file""" + +module( + name = "rules_swift", + version = "4.0.0-rc5-codeql.1", + bazel_compatibility = [">=8.0.0"], + compatibility_level = 3, +) + +bazel_dep(name = "abseil-cpp", version = "20250814.1") +bazel_dep(name = "apple_support", version = "2.8.0") +bazel_dep(name = "bazel_linux_packages", version = "0.4.1") +bazel_dep(name = "bazel_features", version = "1.51.0") +bazel_dep(name = "bazel_skylib", version = "1.7.1") +bazel_dep(name = "nlohmann_json", version = "3.12.0.bcr.1") +bazel_dep(name = "platforms", version = "0.0.11") +bazel_dep(name = "protobuf", version = "34.0.bcr.1") +bazel_dep(name = "rules_cc", version = "0.2.14") +bazel_dep(name = "rules_shell", version = "0.3.0") +bazel_dep(name = "swift_argument_parser", version = "1.7.0") + +apt = use_extension("@bazel_linux_packages//apt:extensions.bzl", "apt") +apt.ubuntu( + name = "swift_ubuntu22.04_sysroot", + architectures = ["amd64"], + lockfile = "//swift/internal/extensions:ubuntu22.04_sysroot.lock.json", + packages = [ + "libc6-dev", + "libcurl4-openssl-dev", + "libstdc++-11-dev", + "libxml2-dev", + "linux-libc-dev", + "zlib1g-dev", + ], + suites = ["jammy"], +) +apt.ubuntu( + name = "swift_ubuntu22.04_aarch64_sysroot", + architectures = ["arm64"], + lockfile = "//swift/internal/extensions:ubuntu22.04_aarch64_sysroot.lock.json", + packages = [ + "libc6-dev", + "libcurl4-openssl-dev", + "libstdc++-11-dev", + "libxml2-dev", + "linux-libc-dev", + "zlib1g-dev", + ], + suites = ["jammy"], +) +use_repo( + apt, + "swift_ubuntu22.04_aarch64_sysroot", + "swift_ubuntu22.04_sysroot", +) + +swift_autoconfiguration = use_repo_rule("//swift/internal:swift_autoconfiguration.bzl", "swift_autoconfiguration") + +swift_autoconfiguration(name = "rules_swift_local_config") + +http_archive = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + +http_archive( + name = "rules_swift_index_import_5_8", + build_file = "//third_party:rules_swift_index_import/BUILD.overlay", + canonical_id = "index-import-5.8", + sha256 = "28c1ffa39d99e74ed70623899b207b41f79214c498c603915aef55972a851a15", + urls = ["https://github.com/MobileNativeFoundation/index-import/releases/download/5.8.0.1/index-import.tar.gz"], +) + +http_archive( + name = "rules_swift_index_import_6_1", + build_file = "//third_party:rules_swift_index_import/BUILD.overlay", + canonical_id = "index-import-6.1", + sha256 = "9a54fc1674af6031125a9884480a1e31e1bcf48b8f558b3e8bcc6b6fcd6e8b61", + urls = ["https://github.com/MobileNativeFoundation/index-import/releases/download/6.1.0.1/index-import.tar.gz"], +) + +register_toolchains("//swift/toolchains:all") diff --git a/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/patches/register_downloaded_macos_toolchain.patch b/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/patches/register_downloaded_macos_toolchain.patch new file mode 100644 index 000000000000..029f78c06f03 --- /dev/null +++ b/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/patches/register_downloaded_macos_toolchain.patch @@ -0,0 +1,103 @@ +diff --git a/swift/internal/extensions/toolchains.bzl b/swift/internal/extensions/toolchains.bzl +--- a/swift/internal/extensions/toolchains.bzl ++++ b/swift/internal/extensions/toolchains.bzl +@@ -132,12 +132,11 @@ def toolchains_for_platform(platform, toolchain_repository): + toolchain_repository = toolchain_repository, + ) + +- if platform != "xcode": +- content += _EXEC_TOOLCHAIN_PLATFORM.format( +- exec_compatible_with = _exec_compatible_with_for_platform(platform), +- platform = platform, +- toolchain_repository = toolchain_repository, +- ) ++ content += _EXEC_TOOLCHAIN_PLATFORM.format( ++ exec_compatible_with = _exec_compatible_with_for_platform(platform), ++ platform = platform, ++ toolchain_repository = toolchain_repository, ++ ) + + if platform in ( + "ubuntu22.04", +diff --git a/swift/toolchains/swift_toolchain.bzl b/swift/toolchains/swift_toolchain.bzl +--- a/swift/toolchains/swift_toolchain.bzl ++++ b/swift/toolchains/swift_toolchain.bzl +@@ -605,10 +605,14 @@ def _parse_target_system_name(*, arch, os, target_system_name): + """Returns the target system name set by the CC toolchain or attempts to create one based on the OS and arch.""" + + if target_system_name and target_system_name != "local": ++ if os == "macos" and target_system_name.endswith(("-macos", "-macosx")): ++ return target_system_name + "10.15" + return target_system_name + + if os == "linux": + return "%s-unknown-linux-gnu" % arch ++ elif os == "macos": ++ return "%s-apple-macos10.15" % arch + elif os == "windows": + # The MSVC cc toolchain reports a `target_gnu_system_name` of "local", + # so synthesize the triple. +@@ -706,5 +710,16 @@ def _swift_toolchain_impl(ctx): + elif ctx.attr.os == "none": + swift_linkopts_cc_info = CcInfo() ++ elif ctx.attr.os == "macos": ++ macos_linkopts = ["-L{}".format(paths.join(toolchain_root, "lib/swift/macosx"))] ++ if sdkroot: ++ macos_linkopts.append("-L{}".format(paths.join(sdkroot, "usr/lib/swift"))) ++ swift_linkopts_cc_info = _swift_sdk_linkopts_cc_info( ++ ctx.label, ++ macos_linkopts, ++ ctx.attr.swift_tools[SwiftToolsInfo].additional_inputs if ctx.attr.swift_tools else [], ++ ) ++ dynamic_runtime_cc_info = None ++ static_runtime_cc_info = None + elif ctx.attr.os == "android": + if not sdkroot: + fail("Android toolchain requires a sysroot to be set, either via the `sdkroot` attribute or by using a CC toolchain that provides one.") +diff --git a/swift/internal/extensions/toolchain.BUILD b/swift/internal/extensions/toolchain.BUILD +--- a/swift/internal/extensions/toolchain.BUILD ++++ b/swift/internal/extensions/toolchain.BUILD +@@ -333,17 +333,22 @@ swift_toolchain( + features = [ + "swift._supports_upcoming_features", + "swift.no_embed_debug_module", +- "swift.use_autolink_extract", +- "swift.lld_gc_workaround", +- "swift.use_module_wrap", + # TODO: This should be removed so that private headers can be used with + # explicit modules, but the build targets for CgRPC need to be cleaned up + # first because they contain C++ code. + "swift.module_map_no_private_headers", +- ], ++ ] + select({ ++ "@platforms//os:linux": [ ++ "swift.lld_gc_workaround", ++ "swift.use_autolink_extract", ++ "swift.use_module_wrap", ++ ], ++ "//conditions:default": [], ++ }), + os = select({ + "@platforms//os:linux": "linux", + "@platforms//os:macos": "macos", + }), + parsed_version = "{swift_version}", ++ sdkroot = "{macos_sdkroot}", + static_runtime = select({ +diff --git a/swift/internal/extensions/standalone_toolchain.bzl b/swift/internal/extensions/standalone_toolchain.bzl +--- a/swift/internal/extensions/standalone_toolchain.bzl ++++ b/swift/internal/extensions/standalone_toolchain.bzl +@@ -91,11 +91,13 @@ def _standalone_toolchain_impl(repository_ctx): + strip_prefix = filename.removesuffix(".tar.gz"), + ) + ++ macos_sdkroot = _run(repository_ctx, ["xcrun", "--sdk", "macosx", "--show-sdk-path"]) if repository_ctx.attr.platform == "xcode" else "" + repository_ctx.file(".swift-version", repository_ctx.attr.swift_version) + repository_ctx.template( + "BUILD.bazel", + repository_ctx.attr._build_template, + substitutions = { ++ "{macos_sdkroot}": macos_sdkroot, + "{swift_version}": repository_ctx.attr.swift_version, + }, + ) diff --git a/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/source.json b/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/source.json new file mode 100644 index 000000000000..fd5c4f2047e7 --- /dev/null +++ b/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/source.json @@ -0,0 +1,8 @@ +{ + "integrity": "sha256-Ly2lS4AlZJMiyqAxKHyCB+2pGeP5aYkQ6zv8QheeSTI=", + "url": "https://github.com/bazelbuild/rules_swift/releases/download/4.0.0-rc5/rules_swift.4.0.0-rc5.tar.gz", + "patches": { + "register_downloaded_macos_toolchain.patch": "sha256-kFzGyE1MhhiDxUfEzRPUTahvycyy+VNgPzQ5I44zRYc=" + }, + "patch_strip": 1 +} diff --git a/misc/bazel/registry/modules/rules_swift/metadata.json b/misc/bazel/registry/modules/rules_swift/metadata.json new file mode 100644 index 000000000000..188799c9dbf9 --- /dev/null +++ b/misc/bazel/registry/modules/rules_swift/metadata.json @@ -0,0 +1,11 @@ +{ + "homepage": "https://github.com/bazelbuild/rules_swift", + "maintainers": [], + "repository": [ + "github:bazelbuild/rules_swift" + ], + "versions": [ + "4.0.0-rc5-codeql.1" + ], + "yanked_versions": {} +} diff --git a/unified/swift-syntax-rs/BUILD.bazel b/unified/swift-syntax-rs/BUILD.bazel index 95f644b200f4..91a28dc40505 100644 --- a/unified/swift-syntax-rs/BUILD.bazel +++ b/unified/swift-syntax-rs/BUILD.bazel @@ -1,9 +1,9 @@ load("@rules_cc//cc:defs.bzl", "cc_library") load("@rules_rust//rust:defs.bzl", "rust_binary", "rust_library", "rust_test") +load("@rules_swift//swift:swift.bzl", "swift_library") load("//unified:platforms.bzl", "UNIFIED_SUPPORTED_PLATFORMS") load(":swift_runtime.bzl", "swift_runtime_libs") load(":swift_runtime_linking.bzl", "swift_runtime_linking") -load(":xcode_transition.bzl", "xcode_transition_swift_library") package(default_visibility = ["//visibility:public"]) @@ -34,7 +34,7 @@ cc_library( ) # Swift FFI shim: wraps swift-syntax and exposes a small C ABI. -xcode_transition_swift_library( +swift_library( name = "swift_syntax_ffi", srcs = ["swift/Sources/SwiftSyntaxFFI/SwiftSyntaxFFI.swift"], module_name = "SwiftSyntaxFFI", diff --git a/unified/swift-syntax-rs/README.md b/unified/swift-syntax-rs/README.md index f4e84e18f361..299fc40951a6 100644 --- a/unified/swift-syntax-rs/README.md +++ b/unified/swift-syntax-rs/README.md @@ -174,26 +174,20 @@ Requirements: - **`clang`** must be installed on the runner. `rules_swift` requires the Bazel CC toolchain to use clang; the repo's `.bazelrc` already sets `--repo_env=CC=clang`, so no extra flags are needed. -- The registered Swift toolchains cover **ubuntu24.04 / x86_64** and - **macOS / `xcode`** (Apple Silicon and Intel). Bazel selects the toolchain - matching the host. Targets are marked `target_compatible_with` these two - OSes, so on Windows Bazel skips them cleanly. -- **macOS only:** the Swift toolchain comes from the host Xcode installation - (`rules_swift` auto-registers `xcode_swift_toolchain`), which also needs - Xcode's CC toolchain and xcode_config; these are applied to the Swift - target via an incoming-edge Starlark transition (see - [`xcode_transition.bzl`](xcode_transition.bzl)), so other targets on macOS - keep using Bazel's default CC toolchain. +- The registered Swift toolchains cover **ubuntu22.04 / x86_64** and + **macOS** (Apple Silicon and Intel). Bazel selects the toolchain matching the + host. Targets are marked `target_compatible_with` these two OSes, so on + Windows Bazel skips them cleanly. +- **macOS only:** `rules_swift` downloads the pinned Swift toolchain from + swift.org. The Bazel C++ toolchain must still provide the macOS SDK, but a + full Xcode installation is not required. The Swift compiler version is kept in sync across three places: the [`.swift-version`](.swift-version) file (read by the local `cargo`/`swift build` and by [swiftly](https://www.swift.org/swiftly/)), the literal `swift_version` pinned on `swift.toolchain(...)` in the root `MODULE.bazel` (the hermetic -swift.org **Linux** Bazel toolchain), and the `swift-syntax` release in -`swift/Package.swift`. On **macOS** the version is *not* pinned by the Bazel -build: `rules_swift` auto-registers the host `xcode_swift_toolchain`, which uses -whichever Swift ships with the installed Xcode. So the pin governs Linux (and -local) builds, while the macOS compiler version depends on the host Xcode. +swift.org Bazel toolchain), and the `swift-syntax` release in +`swift/Package.swift`. (The Bazel toolchain pins a literal rather than reading `.swift-version` via `swift_version_file`, because the latter makes the module extension read a diff --git a/unified/swift-syntax-rs/xcode_transition.bzl b/unified/swift-syntax-rs/xcode_transition.bzl deleted file mode 100644 index 9783c0fc8719..000000000000 --- a/unified/swift-syntax-rs/xcode_transition.bzl +++ /dev/null @@ -1,92 +0,0 @@ -"""Per-target Xcode configuration for `//unified/swift-syntax-rs` on macOS. - -`rules_swift`'s auto-registered `xcode_swift_toolchain` reads -`cc_toolchain.target_gnu_system_name`, which is literally "local" on -Bazel's built-in `local_config_cc`. To make it usable we need: - -- `--xcode_version_config=@local_config_xcode//:host_xcodes` — selects - `apple_support`'s xcode_config (matches `rules_swift`'s `system_sdk` keys). -- `--extra_toolchains=@local_config_apple_cc_toolchains//:all` — forces - `apple_support`'s CC toolchain ahead of `local_config_cc`. - -Applied via an incoming-edge Starlark transition on the `swift_library` -target only (via the `xcode_transition_swift_library` macro), so downstream -Rust targets and the rest of the repo stay on the default CC toolchain and -the `@local_config_*` repos are not materialized otherwise. No-op off macOS. -""" - -load("@rules_cc//cc/common:cc_info.bzl", "CcInfo") -load("@rules_swift//swift:swift.bzl", "swift_library") -load("//misc/bazel:os.bzl", "os_select") - -_XCODE_VERSION_CONFIG = "//command_line_option:xcode_version_config" -_EXTRA_TOOLCHAINS = "//command_line_option:extra_toolchains" - -def _transition_impl(settings, attr): - if attr.os != "macos": - return {} - else: - return { - _XCODE_VERSION_CONFIG: "@local_config_xcode//:host_xcodes", - _EXTRA_TOOLCHAINS: ( - list(settings[_EXTRA_TOOLCHAINS]) + - ["@local_config_apple_cc_toolchains//:all"] - ), - } - -_xcode_transition = transition( - implementation = _transition_impl, - inputs = [_EXTRA_TOOLCHAINS], - outputs = [_XCODE_VERSION_CONFIG, _EXTRA_TOOLCHAINS], -) - -def _wrapper_impl(ctx): - src = ctx.attr.actual[0] - - # Forward the providers a downstream `rust_*` target reads from `deps`: - # `DefaultInfo`, `CcInfo` (linking info), and `OutputGroupInfo`. - providers = [src[DefaultInfo]] - for p in (CcInfo, OutputGroupInfo): - if p in src: - providers.append(src[p]) - return providers - -_xcode_transition_swift_library_rule = rule( - implementation = _wrapper_impl, - attrs = { - "actual": attr.label( - mandatory = True, - cfg = _xcode_transition, - providers = [CcInfo], - ), - "os": attr.string(mandatory = True), - "_allowlist_function_transition": attr.label( - default = "@bazel_tools//tools/allowlists/function_transition_allowlist", - ), - }, -) - -def xcode_transition_swift_library(name, visibility = None, tags = None, target_compatible_with = None, **kwargs): - """`swift_library` wrapped in the macOS Xcode-config transition. - - Emits a private inner `_impl_` `swift_library` (tagged `manual`) - and a public `name` that applies the transition on macOS and forwards - the inner target's providers. Downstream `rust_*` targets depend on - `name` as usual; only the `swift_library` sub-graph flips toolchain. - """ - inner_name = "_impl_%s" % name - swift_library( - name = inner_name, - visibility = ["//visibility:private"], - tags = (tags or []) + ["manual"], - target_compatible_with = target_compatible_with, - **kwargs - ) - _xcode_transition_swift_library_rule( - name = name, - visibility = visibility, - tags = tags, - target_compatible_with = target_compatible_with, - actual = ":" + inner_name, - os = os_select(linux = "linux", macos = "macos", default = "other"), - ) From cca2c0695394b65984b9c23a34831c40695a0ab7 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Thu, 13 Aug 2026 17:54:14 +0200 Subject: [PATCH 0290/2098] C#: support linux-arm64 in autobuild script Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- csharp/tools/autobuild.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csharp/tools/autobuild.sh b/csharp/tools/autobuild.sh index e8e007a10d74..39d10b38f3b5 100755 --- a/csharp/tools/autobuild.sh +++ b/csharp/tools/autobuild.sh @@ -2,7 +2,7 @@ set -eu -if [ "$CODEQL_PLATFORM" != "linux64" ] && [ "$CODEQL_PLATFORM" != "osx64" ] ; then +if [ "$CODEQL_PLATFORM" != "linux64" ] && [ "$CODEQL_PLATFORM" != "linux-arm64" ] && [ "$CODEQL_PLATFORM" != "osx64" ] ; then echo "Automatic build detection for $CODEQL_PLATFORM is not implemented." exit 1 fi From 5a8f9b8d75b8a369143757f652aa07c8ac38548a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 14 Aug 2026 00:28:36 +0000 Subject: [PATCH 0291/2098] Add changed framework coverage reports --- java/documentation/library-coverage/coverage.csv | 2 +- java/documentation/library-coverage/coverage.rst | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/java/documentation/library-coverage/coverage.csv b/java/documentation/library-coverage/coverage.csv index e3893d193663..ef3a711c8dcf 100644 --- a/java/documentation/library-coverage/coverage.csv +++ b/java/documentation/library-coverage/coverage.csv @@ -88,7 +88,7 @@ java.applet,,,11,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,11, java.awt,1,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,3 java.beans,1,,177,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,82,95 java.io,66,1,225,,,,,,,,,22,,,,,,,,,,,,,,,29,15,,,,,,,,,,,,,,,,,,,,,,,,,1,,202,23 -java.lang,38,3,790,,13,,,,,,1,,,,,,,,,,,,8,,,,2,9,,,4,,,1,,,,,,,,,,,,,,,,,,3,,,510,280 +java.lang,38,3,789,,13,,,,,,1,,,,,,,,,,,,8,,,,2,9,,,4,,,1,,,,,,,,,,,,,,,,,,3,,,509,280 java.math,,,9,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9 java.net,23,3,347,,,,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,21,,,,,,,,,,,,,,,,,3,248,99 java.nio,47,,499,,,,,,,,,5,,,,,,,,,,,,,,,25,16,,,,,,,,,1,,,,,,,,,,,,,,,,,,302,197 diff --git a/java/documentation/library-coverage/coverage.rst b/java/documentation/library-coverage/coverage.rst index 70d02b68751e..0b4387b476d7 100644 --- a/java/documentation/library-coverage/coverage.rst +++ b/java/documentation/library-coverage/coverage.rst @@ -26,7 +26,7 @@ Java framework & library support `JBoss Logging `_,``org.jboss.logging``,,,324,,,,,, `JSON-java `_,``org.json``,,236,,,,,,, `Jackson `_,``com.fasterxml.jackson.*``,,9,2,2,,,,, - Java Standard Library,``java.*``,10,4629,260,99,,9,,,26 + Java Standard Library,``java.*``,10,4628,260,99,,9,,,26 Java extensions,"``javax.*``, ``jakarta.*``",101,4185,90,10,4,2,1,1,4 `Jetty `_,``org.eclipse.jetty.client``,,,2,,,,,,2 Kotlin Standard Library,``kotlin*``,,1849,16,14,,,,,2 @@ -41,5 +41,5 @@ Java framework & library support `Thymeleaf `_,``org.thymeleaf``,,2,2,,,,,, `jOOQ `_,``org.jooq``,,,1,,,1,,, Others,"``actions.osgi``, ``antlr``, ``ch.ethz.ssh2``, ``cn.hutool.core.codec``, ``com.alibaba.com.caucho.hessian.io``, ``com.alibaba.druid.sql``, ``com.alibaba.fastjson2``, ``com.amazonaws.auth``, ``com.auth0.jwt.algorithms``, ``com.azure.identity``, ``com.caucho.burlap.io``, ``com.caucho.hessian.io``, ``com.cedarsoftware.util.io``, ``com.esotericsoftware.kryo.io``, ``com.esotericsoftware.kryo5.io``, ``com.esotericsoftware.yamlbeans``, ``com.hubspot.jinjava``, ``com.jcraft.jsch``, ``com.microsoft.sqlserver.jdbc``, ``com.mitchellbosecke.pebble``, ``com.opensymphony.xwork2``, ``com.sshtools.j2ssh.authentication``, ``com.sun.crypto.provider``, ``com.sun.jndi.ldap``, ``com.sun.net.httpserver``, ``com.sun.net.ssl``, ``com.sun.rowset``, ``com.sun.security.auth.module``, ``com.sun.security.ntlm``, ``com.sun.security.sasl.digest``, ``com.thoughtworks.xstream``, ``com.trilead.ssh2``, ``com.unboundid.ldap.sdk``, ``com.zaxxer.hikari``, ``flexjson``, ``hudson``, ``io.jsonwebtoken``, ``io.r2dbc.spi``, ``io.undertow.server.handlers.resource``, ``javafx.scene.web``, ``jenkins``, ``jodd.json``, ``liquibase.database.jvm``, ``liquibase.statement.core``, ``net.lingala.zip4j``, ``net.schmizz.sshj``, ``net.sf.json``, ``net.sf.saxon.s9api``, ``ognl``, ``org.acegisecurity``, ``org.antlr.runtime``, ``org.apache.avro``, ``org.apache.commons.codec``, ``org.apache.commons.compress.archivers.tar``, ``org.apache.commons.exec``, ``org.apache.commons.fileupload``, ``org.apache.commons.httpclient.util``, ``org.apache.commons.jelly``, ``org.apache.commons.jexl2``, ``org.apache.commons.jexl3``, ``org.apache.commons.lang``, ``org.apache.commons.logging``, ``org.apache.commons.net``, ``org.apache.commons.ognl``, ``org.apache.cxf.catalog``, ``org.apache.cxf.common.classloader``, ``org.apache.cxf.common.jaxb``, ``org.apache.cxf.common.logging``, ``org.apache.cxf.configuration.jsse``, ``org.apache.cxf.helpers``, ``org.apache.cxf.resource``, ``org.apache.cxf.staxutils``, ``org.apache.cxf.tools.corba.utils``, ``org.apache.cxf.tools.util``, ``org.apache.cxf.transform``, ``org.apache.directory.ldap.client.api``, ``org.apache.hadoop.fs``, ``org.apache.hadoop.hive.metastore``, ``org.apache.hadoop.hive.ql.exec``, ``org.apache.hadoop.hive.ql.metadata``, ``org.apache.hc.client5.http.async.methods``, ``org.apache.hc.client5.http.classic.methods``, ``org.apache.hc.client5.http.fluent``, ``org.apache.hc.client5.http.protocol``, ``org.apache.hc.client5.http.utils``, ``org.apache.hive.hcatalog.templeton``, ``org.apache.ibatis.jdbc``, ``org.apache.ibatis.mapping``, ``org.apache.log4j``, ``org.apache.poi``, ``org.apache.shiro.authc``, ``org.apache.shiro.codec``, ``org.apache.shiro.jndi``, ``org.apache.shiro.mgt``, ``org.apache.sshd.client.session``, ``org.apache.tools.ant``, ``org.apache.tools.zip``, ``org.codehaus.cargo.container.installer``, ``org.dom4j``, ``org.exolab.castor.xml``, ``org.fusesource.leveldbjni``, ``org.geogebra.web.full.main``, ``org.gradle.api.file``, ``org.ho.yaml``, ``org.influxdb``, ``org.jabsorb``, ``org.jboss.vfs``, ``org.jdbi.v3.core``, ``org.jenkins.ui.icon``, ``org.jenkins.ui.symbol``, ``org.keycloak.models.map.storage``, ``org.kohsuke.stapler``, ``org.lastaflute.web``, ``org.mvel2``, ``org.openjdk.jmh.runner.options``, ``org.owasp.esapi``, ``org.pac4j.jwt.config.encryption``, ``org.pac4j.jwt.config.signature``, ``org.scijava.log``, ``org.xml.sax``, ``org.xmlpull.v1``, ``play.libs.ws``, ``play.mvc``, ``ratpack.core.form``, ``ratpack.core.handling``, ``ratpack.core.http``, ``ratpack.exec``, ``ratpack.form``, ``ratpack.func``, ``ratpack.handling``, ``ratpack.http``, ``ratpack.util``, ``software.amazon.awssdk.transfer.s3.model``, ``sun.jvmstat.perfdata.monitor.protocol.local``, ``sun.jvmstat.perfdata.monitor.protocol.rmi``, ``sun.misc``, ``sun.net.ftp``, ``sun.net.www.protocol.http``, ``sun.security.acl``, ``sun.security.jgss.krb5``, ``sun.security.krb5``, ``sun.security.pkcs``, ``sun.security.pkcs11``, ``sun.security.provider``, ``sun.security.ssl``, ``sun.security.x509``, ``sun.tools.jconsole``",151,8258,824,188,6,20,18,,186 - Totals,,406,28637,2765,461,16,151,33,1,416 + Totals,,406,28636,2765,461,16,151,33,1,416 From bb4ad0905221fb5a73c0ee64c847a6ff33e13929 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Aug 2026 03:05:06 +0000 Subject: [PATCH 0292/2098] Bump golang.org/x/mod Bumps the extractor-dependencies group in /go/extractor with 1 update: [golang.org/x/mod](https://github.com/golang/mod). Updates `golang.org/x/mod` from 0.38.0 to 0.39.0 - [Commits](https://github.com/golang/mod/compare/v0.38.0...v0.39.0) --- updated-dependencies: - dependency-name: golang.org/x/mod dependency-version: 0.39.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: extractor-dependencies ... Signed-off-by: dependabot[bot] --- go/extractor/go.mod | 2 +- go/extractor/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go/extractor/go.mod b/go/extractor/go.mod index c92b654c8c6c..fc48b4cffeba 100644 --- a/go/extractor/go.mod +++ b/go/extractor/go.mod @@ -9,7 +9,7 @@ toolchain go1.26.5 // when adding or removing dependencies, run // bazel mod tidy require ( - golang.org/x/mod v0.38.0 + golang.org/x/mod v0.39.0 golang.org/x/tools v0.48.0 ) diff --git a/go/extractor/go.sum b/go/extractor/go.sum index b57649cbb351..889863082b11 100644 --- a/go/extractor/go.sum +++ b/go/extractor/go.sum @@ -6,8 +6,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -golang.org/x/mod v0.38.0 h1:MECBjubtXD7yj4HrhIUcywNaGeNVUdfVnxmPajOk4yk= -golang.org/x/mod v0.38.0/go.mod h1:V6Xz0pq8TQ3dGqVQ1FVHuelZpAL0uNhSkk9ogYP3c40= +golang.org/x/mod v0.39.0 h1:UF5zwQdCRRUpHfyPwr7d4UrGiVeldIsogtzWVnczL74= +golang.org/x/mod v0.39.0/go.mod h1:bvIbwjQ0HUFFf5AKukeeYQG4ZBUG9yxQbR9aEweIwYY= golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= From d09cd94b9291890d3d3151b04493425a1fff4513 Mon Sep 17 00:00:00 2001 From: Keshav Malik Date: Fri, 14 Aug 2026 09:51:48 +0530 Subject: [PATCH 0293/2098] C#: Avoid recursive operator simplification --- .../ql/src/Language Abuse/SimplifyBoolExpr.ql | 20 ++++++- ...6-08-13-simplifiable-operator-recursion.md | 4 ++ .../SimplifyBoolExpr/SimplifyBoolExpr.cs | 60 +++++++++++++++++++ .../SimplifyBoolExpr.expected | 3 + .../SimplifyBoolExpr/SimplifyBoolExpr.qlref | 2 + .../Language Abuse/SimplifyBoolExpr/options | 1 + 6 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 csharp/ql/src/change-notes/2026-08-13-simplifiable-operator-recursion.md create mode 100644 csharp/ql/test/query-tests/standalone/Language Abuse/SimplifyBoolExpr/SimplifyBoolExpr.cs create mode 100644 csharp/ql/test/query-tests/standalone/Language Abuse/SimplifyBoolExpr/SimplifyBoolExpr.expected create mode 100644 csharp/ql/test/query-tests/standalone/Language Abuse/SimplifyBoolExpr/SimplifyBoolExpr.qlref create mode 100644 csharp/ql/test/query-tests/standalone/Language Abuse/SimplifyBoolExpr/options diff --git a/csharp/ql/src/Language Abuse/SimplifyBoolExpr.ql b/csharp/ql/src/Language Abuse/SimplifyBoolExpr.ql index 8fea284ae317..100fa2338110 100644 --- a/csharp/ql/src/Language Abuse/SimplifyBoolExpr.ql +++ b/csharp/ql/src/Language Abuse/SimplifyBoolExpr.ql @@ -75,6 +75,23 @@ predicate negatedOperators(string op, string negated) { negatedOperators(negated, op) } +/** Holds if replacing `expr` with `operatorName` could call an enclosing operator. */ +private predicate couldCallEnclosingOperator(LogicalNotExpr expr, string operatorName) { + exists(BinaryOperation binary, Operator enclosingOperator | + binary = expr.getOperand() and + enclosingOperator = expr.getEnclosingCallable().getEnclosingCallable*() and + enclosingOperator.getName() = operatorName and + binary + .getLeftOperand() + .getType() + .isImplicitlyConvertibleTo(enclosingOperator.getParameter(0).getType()) and + binary + .getRightOperand() + .getType() + .isImplicitlyConvertibleTo(enclosingOperator.getParameter(1).getType()) + ) +} + predicate simplifyBinaryExpr(string op, string withFalseOperand, string withTrueOperand) { op = "==" and withTrueOperand = "A" and withFalseOperand = "!A" or @@ -90,7 +107,8 @@ predicate pushNegation(LogicalNotExpr expr, string oldPattern, string newPattern or exists(string oldOperator, string newOperator | oldOperator = expr.getOperand().(BinaryOperation).getOperator() and - negatedOperators(oldOperator, newOperator) + negatedOperators(oldOperator, newOperator) and + not couldCallEnclosingOperator(expr, newOperator) | oldPattern = "!(A " + oldOperator + " B)" and newPattern = "A " + newOperator + " B" diff --git a/csharp/ql/src/change-notes/2026-08-13-simplifiable-operator-recursion.md b/csharp/ql/src/change-notes/2026-08-13-simplifiable-operator-recursion.md new file mode 100644 index 000000000000..177df03a1b55 --- /dev/null +++ b/csharp/ql/src/change-notes/2026-08-13-simplifiable-operator-recursion.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `cs/simplifiable-boolean-expression` query no longer suggests replacing a negated comparison when the replacement could recursively call an enclosing user-defined operator in `build-mode: none` databases. diff --git a/csharp/ql/test/query-tests/standalone/Language Abuse/SimplifyBoolExpr/SimplifyBoolExpr.cs b/csharp/ql/test/query-tests/standalone/Language Abuse/SimplifyBoolExpr/SimplifyBoolExpr.cs new file mode 100644 index 000000000000..882ded10f873 --- /dev/null +++ b/csharp/ql/test/query-tests/standalone/Language Abuse/SimplifyBoolExpr/SimplifyBoolExpr.cs @@ -0,0 +1,60 @@ +using System; + +// The missing matching operators deliberately model an incompletely compiled database. +class IncompleteOperatorTest +{ + // GOOD: Rewriting this as `left != right` could recursively call this operator. + public static bool operator !=(IncompleteOperatorTest left, IncompleteOperatorTest right) + { + // BAD: Rewriting this built-in comparison cannot call the enclosing operator. + bool valuesDiffer = !(left.Value == right.Value); // $ Alert + + // BAD: Explicitly converting both operands prevents a call to the enclosing operator. + bool referencesDiffer = !((object)left == (object)right); // $ Alert + + return valuesDiffer && referencesDiffer && !(left == right); + } + + // GOOD: Rewriting this as `left >= right` could recursively call this operator. + public static bool operator >=(IncompleteOperatorTest left, IncompleteOperatorTest right) => !(left < right); + + int Value { get; } +} + +class IncompleteReverseOperatorTest +{ + // GOOD: Rewriting this as `left == right` could recursively call this operator. + public static bool operator ==(IncompleteReverseOperatorTest left, IncompleteReverseOperatorTest right) => !(left != right); + + // GOOD: Rewriting this as `left < right` could recursively call this operator. + public static bool operator <(IncompleteReverseOperatorTest left, IncompleteReverseOperatorTest right) => !(left >= right); +} + +class IncompleteGreaterOperatorTest +{ + // GOOD: Rewriting this as `left <= right` could recursively call this operator. + public static bool operator <=(IncompleteGreaterOperatorTest left, IncompleteGreaterOperatorTest right) => !(left > right); + + // GOOD: Rewriting this as `left > right` could recursively call this operator. + public static bool operator >(IncompleteGreaterOperatorTest left, IncompleteGreaterOperatorTest right) => !(left <= right); +} + +class IncompleteDifferentOperatorTest +{ + // BAD: The suggested operator differs from the enclosing operator. + public static bool operator >(IncompleteDifferentOperatorTest left, IncompleteDifferentOperatorTest right) => !(left == right); // $ Alert +} + +class IncompleteNestedOperatorTest +{ + public static bool operator !=(IncompleteNestedOperatorTest left, IncompleteNestedOperatorTest right) + { + // GOOD: The replacement could call the enclosing operator from this lambda. + Func lambda = () => !(left == right); + + // GOOD: The replacement could call the enclosing operator from this local function. + bool Local() => !(left == right); + + return lambda() || Local(); + } +} diff --git a/csharp/ql/test/query-tests/standalone/Language Abuse/SimplifyBoolExpr/SimplifyBoolExpr.expected b/csharp/ql/test/query-tests/standalone/Language Abuse/SimplifyBoolExpr/SimplifyBoolExpr.expected new file mode 100644 index 000000000000..a0b97ee97862 --- /dev/null +++ b/csharp/ql/test/query-tests/standalone/Language Abuse/SimplifyBoolExpr/SimplifyBoolExpr.expected @@ -0,0 +1,3 @@ +| SimplifyBoolExpr.cs:10:29:10:56 | !... | The expression '!(A == B)' can be simplified to 'A != B'. | +| SimplifyBoolExpr.cs:13:33:13:64 | !... | The expression '!(A == B)' can be simplified to 'A != B'. | +| SimplifyBoolExpr.cs:45:115:45:130 | !... | The expression '!(A == B)' can be simplified to 'A != B'. | diff --git a/csharp/ql/test/query-tests/standalone/Language Abuse/SimplifyBoolExpr/SimplifyBoolExpr.qlref b/csharp/ql/test/query-tests/standalone/Language Abuse/SimplifyBoolExpr/SimplifyBoolExpr.qlref new file mode 100644 index 000000000000..222fc236213b --- /dev/null +++ b/csharp/ql/test/query-tests/standalone/Language Abuse/SimplifyBoolExpr/SimplifyBoolExpr.qlref @@ -0,0 +1,2 @@ +query: Language Abuse/SimplifyBoolExpr.ql +postprocess: utils/test/InlineExpectationsTestQuery.ql diff --git a/csharp/ql/test/query-tests/standalone/Language Abuse/SimplifyBoolExpr/options b/csharp/ql/test/query-tests/standalone/Language Abuse/SimplifyBoolExpr/options new file mode 100644 index 000000000000..7ba3811b2afb --- /dev/null +++ b/csharp/ql/test/query-tests/standalone/Language Abuse/SimplifyBoolExpr/options @@ -0,0 +1 @@ +semmle-extractor-options: --standalone From dabb6781e453c08444ace002c40d25d31bd7c448 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 14 Aug 2026 09:21:52 +0200 Subject: [PATCH 0294/2098] Cargo: upgrade dependencies --- Cargo.lock | 1112 ++++++++++------------- ruby/extractor/Cargo.toml | 4 +- rust/ast-generator/Cargo.toml | 14 +- rust/extractor/Cargo.toml | 52 +- rust/extractor/macros/Cargo.toml | 4 +- shared/tree-sitter-extractor/Cargo.toml | 6 +- shared/yeast-macros/Cargo.toml | 2 +- shared/yeast/Cargo.toml | 8 +- unified/extractor/Cargo.toml | 10 +- 9 files changed, 511 insertions(+), 701 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5bf23147f292..c5def22829c8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,9 +10,9 @@ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aho-corasick" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" dependencies = [ "memchr", ] @@ -84,9 +84,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.102" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" [[package]] name = "argfile" @@ -100,9 +100,9 @@ dependencies = [ [[package]] name = "arrayvec" -version = "0.7.6" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" [[package]] name = "ast-generator" @@ -128,15 +128,6 @@ dependencies = [ "bytemuck", ] -[[package]] -name = "atomic-polyfill" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" -dependencies = [ - "critical-section", -] - [[package]] name = "autocfg" version = "1.5.1" @@ -151,15 +142,21 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bitflags" -version = "2.11.1" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" [[package]] name = "borsh" -version = "1.6.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfd1e3f8955a5d7de9fab72fc8373fade9fb8a703968cb200ae3dc6cf08e185a" +checksum = "a88b7ea17d208c4193f2c1e6de3c35fe71f98c96982d5ced308bdcc749ff6e1f" dependencies = [ "bytes", "cfg_aliases", @@ -192,9 +189,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.20.2" +version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] name = "bytemuck" @@ -202,23 +199,17 @@ version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - [[package]] name = "bytes" -version = "1.11.1" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] name = "camino" -version = "1.2.2" +version = "1.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +checksum = "bb1307f12aa967b5a58416e87b3653360e0fd614a016b6e970db08fecbb1b80d" dependencies = [ "serde_core", ] @@ -249,9 +240,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.62" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98" +checksum = "5d262e149917187838d5b42777c8253bcb64500067342904e7d429499a6f277e" dependencies = [ "find-msvc-tools", "jobserver", @@ -267,15 +258,15 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" [[package]] name = "chacha20" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" dependencies = [ "cfg-if", "cpufeatures", @@ -290,7 +281,7 @@ checksum = "9ea9b1e80910f66ae87c772247591432032ef3f6a67367ff17f8343db05beafa" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", "synstructure", ] @@ -300,15 +291,15 @@ version = "0.104.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7047a516de16226cd17344d41a319d0ea1064bf9e60bd612ab341ab4a34bbfa8" dependencies = [ - "bitflags", + "bitflags 2.13.1", "chalk-derive", ] [[package]] name = "chrono" -version = "0.4.44" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" dependencies = [ "iana-time-zone", "js-sys", @@ -320,9 +311,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.6.1" +version = "4.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" +checksum = "473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca" dependencies = [ "clap_builder", "clap_derive", @@ -330,9 +321,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.6.0" +version = "4.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" +checksum = "7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889" dependencies = [ "anstream", "anstyle", @@ -342,14 +333,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.6.1" +version = "4.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" +checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] @@ -469,7 +460,7 @@ dependencies = [ "serde", "serde_json", "serde_with", - "toml 1.1.2+spec-1.1.0", + "toml", "tracing", "tracing-flame", "tracing-subscriber", @@ -518,26 +509,20 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "critical-section" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" - [[package]] name = "crossbeam-channel" -version = "0.5.15" +version = "0.5.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +checksum = "d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -545,9 +530,9 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.18" +version = "0.9.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" dependencies = [ "crossbeam-utils", ] @@ -563,9 +548,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.21" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" [[package]] name = "darling" @@ -587,7 +572,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn", + "syn 2.0.119", ] [[package]] @@ -598,14 +583,14 @@ checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ "darling_core", "quote", - "syn", + "syn 2.0.119", ] [[package]] name = "dashmap" -version = "6.1.0" +version = "6.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +checksum = "e6361d5c062261c78a176addb82d4c821ae42bed6089de0e12603cd25de2059c" dependencies = [ "cfg-if", "crossbeam-utils", @@ -615,13 +600,43 @@ dependencies = [ "parking_lot_core", ] +[[package]] +name = "defmt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8" +dependencies = [ + "defmt-parser", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "defmt-parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror", +] + [[package]] name = "deranged" version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" dependencies = [ - "powerfmt", "serde_core", ] @@ -633,7 +648,7 @@ checksum = "d08b3a0bcc0d079199cd476b2cae8435016ec11d1c0986c6901c5ac223041534" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -662,9 +677,9 @@ checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "either" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" +checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d" [[package]] name = "embedded-io" @@ -684,7 +699,7 @@ version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eabffdaee24bd1bf95c5ef7cec31260444317e72ea56c4c91750e8b7ee58d5f1" dependencies = [ - "log 0.4.29", + "log 0.4.33", ] [[package]] @@ -773,9 +788,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +checksum = "26b73573e6edcd2af0cdf47bd6cb58f0b3839491263c314eaad1ccf24430e1de" [[package]] name = "fixedbitset" @@ -799,6 +814,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + [[package]] name = "fs-err" version = "3.3.0" @@ -825,21 +846,21 @@ checksum = "7ab85b9b05e3978cc9a9cf8fea7f01b494e1a09ed3037e16ba39edc7a29eb61a" [[package]] name = "futures-core" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" [[package]] name = "futures-task" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" [[package]] name = "futures-util" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" dependencies = [ "futures-core", "futures-task", @@ -849,35 +870,21 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" -dependencies = [ - "cfg-if", - "libc", - "r-efi 5.3.0", - "wasip2", -] - -[[package]] -name = "getrandom" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" dependencies = [ "cfg-if", "libc", - "r-efi 6.0.0", + "r-efi", "rand_core", - "wasip2", - "wasip3", ] [[package]] name = "glob" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" [[package]] name = "globset" @@ -887,20 +894,11 @@ checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3" dependencies = [ "aho-corasick", "bstr", - "log 0.4.29", + "log 0.4.33", "regex-automata", "regex-syntax", ] -[[package]] -name = "hash32" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" -dependencies = [ - "byteorder", -] - [[package]] name = "hashbrown" version = "0.12.3" @@ -919,9 +917,7 @@ version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", + "foldhash 0.1.5", ] [[package]] @@ -929,28 +925,19 @@ name = "hashbrown" version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" - -[[package]] -name = "hashlink" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" dependencies = [ - "hashbrown 0.15.5", + "allocator-api2", + "equivalent", + "foldhash 0.2.0", ] [[package]] -name = "heapless" -version = "0.7.17" +name = "hashlink" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" +checksum = "32069d97bb81e38fa67eab65e3393bf804bb85969f2bc06bf13f64aef5aba248" dependencies = [ - "atomic-polyfill", - "hash32", - "rustc_version", - "serde", - "spin", - "stable_deref_trait", + "hashbrown 0.17.1", ] [[package]] @@ -971,15 +958,6 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -[[package]] -name = "home" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" -dependencies = [ - "windows-sys 0.61.2", -] - [[package]] name = "iana-time-zone" version = "0.1.65" @@ -990,7 +968,7 @@ dependencies = [ "core-foundation-sys", "iana-time-zone-haiku", "js-sys", - "log 0.4.29", + "log 0.4.33", "wasm-bindgen", "windows-core", ] @@ -1004,12 +982,6 @@ dependencies = [ "cc", ] -[[package]] -name = "id-arena" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" - [[package]] name = "ident_case" version = "1.0.1" @@ -1051,28 +1023,25 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd5b3eaf1a28b758ac0faa5a4254e8ab2705605496f1b1f3fbbc3988ad73d199" dependencies = [ - "bitflags", + "bitflags 2.13.1", "inotify-sys", "libc", ] [[package]] name = "inotify-sys" -version = "0.1.5" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +checksum = "c033f80b2c113cdf91ab7a33faa9cbc014726dcad99880c8609af2a370edf37d" dependencies = [ "libc", ] [[package]] name = "intrusive-collections" -version = "0.9.7" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "189d0897e4cbe8c75efedf3502c18c887b05046e59d28404d4d8e46cbc4d1e86" -dependencies = [ - "memoffset", -] +checksum = "4275b20e6057cd7733fd8df8a5a31701e4fe44497dad0f3fa0e1c4fb971506be" [[package]] name = "inventory" @@ -1091,9 +1060,9 @@ checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itertools" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +checksum = "8b4baf93f58d4425749ca49a51c50ebab072c5df6994d08fed93541c331481dc" dependencies = [ "either", ] @@ -1104,13 +1073,66 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" +[[package]] +name = "jiff" +version = "0.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668b7183bd07af9a4885f5c35b0cc5c83c4607a913c16b7e17291832910d2dcc" +dependencies = [ + "defmt", + "jiff-core", + "jiff-static", + "jiff-tzdb-platform", + "log 0.4.33", + "portable-atomic", + "portable-atomic-util", + "serde_core", + "windows-link", +] + +[[package]] +name = "jiff-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7feca88439efe53da3754500c1851dedf3cb36c524dd5cf8225cc0794de95d09" +dependencies = [ + "defmt", +] + +[[package]] +name = "jiff-static" +version = "0.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a69dcb3a21cfb32ce1cd056169337ca284af0766dd766e7878819b251a49204" +dependencies = [ + "jiff-core", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "jiff-tzdb" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "142bd39932ad231f10513df9ab62661fead8719872150b7ad02a2df79f4e141e" + +[[package]] +name = "jiff-tzdb-platform" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8" +dependencies = [ + "jiff-tzdb", +] + [[package]] name = "jobserver" -version = "0.1.34" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" dependencies = [ - "getrandom 0.3.4", + "getrandom", "libc", ] @@ -1122,21 +1144,20 @@ checksum = "a037eddb7d28de1d0fc42411f501b53b75838d313908078d6698d064f3029b24" [[package]] name = "js-sys" -version = "0.3.98" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67df7112613f8bfd9150013a0314e196f4800d3201ae742489d999db2f979f08" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" dependencies = [ "cfg-if", "futures-util", - "once_cell", "wasm-bindgen", ] [[package]] name = "kqueue" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac30106d7dce88daf4a3fcb4879ea939476d5074a9b7ddd0fb97fa4bed5596a" +checksum = "273c0752728918e0ac4976f2b275b6fefb9ecd400585dec929419f3844cd87b5" dependencies = [ "kqueue-sys", "libc", @@ -1148,7 +1169,7 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07293a4e297ac234359b510362495713f75ea345d5307140414f20c69ffeb087" dependencies = [ - "bitflags", + "bitflags 2.13.1", "libc", ] @@ -1164,17 +1185,11 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -[[package]] -name = "leb128fmt" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" - [[package]] name = "libc" -version = "0.2.186" +version = "0.2.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] name = "line-index" @@ -1201,14 +1216,14 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" dependencies = [ - "log 0.4.29", + "log 0.4.33", ] [[package]] name = "log" -version = "0.4.29" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" [[package]] name = "matchers" @@ -1221,9 +1236,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.8.0" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "memoffset" @@ -1246,12 +1261,12 @@ dependencies = [ [[package]] name = "mio" -version = "1.2.0" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" dependencies = [ "libc", - "log 0.4.29", + "log 0.4.33", "wasi", "windows-sys 0.61.2", ] @@ -1287,12 +1302,12 @@ version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags", + "bitflags 2.13.1", "fsevent-sys", "inotify", "kqueue", "libc", - "log 0.4.29", + "log 0.4.33", "mio", "notify-types", "walkdir", @@ -1305,7 +1320,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a" dependencies = [ - "bitflags", + "bitflags 2.13.1", ] [[package]] @@ -1421,7 +1436,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -1468,9 +1483,18 @@ checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" [[package]] name = "portable-atomic" -version = "1.13.1" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3" + +[[package]] +name = "portable-atomic-util" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" +dependencies = [ + "portable-atomic", +] [[package]] name = "postcard" @@ -1481,7 +1505,6 @@ dependencies = [ "cobs", "embedded-io 0.4.0", "embedded-io 0.6.1", - "heapless", "serde", ] @@ -1491,21 +1514,11 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" -[[package]] -name = "prettyplease" -version = "0.2.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" -dependencies = [ - "proc-macro2", - "syn", -] - [[package]] name = "proc-macro2" -version = "1.0.106" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" dependencies = [ "unicode-ident", ] @@ -1518,26 +1531,20 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", "version_check", "yansi", ] [[package]] name = "quote" -version = "1.0.45" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" dependencies = [ "proc-macro2", ] -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - [[package]] name = "r-efi" version = "6.0.0" @@ -1546,11 +1553,11 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "ra-ap-rustc_abi" -version = "0.143.0" +version = "0.166.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d49dbe5d570793b3c3227972a6ac85fc3e830f09b32c3cb3b68cfceebad3b0a" +checksum = "e2cf1b1ffe31b6226c00b40cddfda65002b7729f9f4ed2d547b5856cdab0011c" dependencies = [ - "bitflags", + "bitflags 2.13.1", "ra-ap-rustc_hashes", "ra-ap-rustc_index", "tracing", @@ -1558,55 +1565,55 @@ dependencies = [ [[package]] name = "ra-ap-rustc_ast_ir" -version = "0.143.0" +version = "0.166.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0956db62c264a899d15667993cbbd2e8f0b02108712217e2579c61ac30b94b" +checksum = "2ef42605e36e1305e815ccfc8830eb870f74d78534bca19a61629149536d8e98" [[package]] name = "ra-ap-rustc_hashes" -version = "0.143.0" +version = "0.166.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7df512084c24f4c96c8cc9a59cbd264301efbc8913d3759b065398024af316c9" +checksum = "b9f5542968215c17275920791b2fa13a43014287506ed0450777c79845102e86" dependencies = [ "rustc-stable-hash", ] [[package]] name = "ra-ap-rustc_index" -version = "0.143.0" +version = "0.166.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bca3a49a928d38ba7927605e5909b6abe77d09ff359e4695c070c3f91d69cc8a" +checksum = "1d9e47b9ca7d92cfb0d6653503adbabd41938b84474317397a664326b208d6c6" dependencies = [ "ra-ap-rustc_index_macros", ] [[package]] name = "ra-ap-rustc_index_macros" -version = "0.143.0" +version = "0.166.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4463e908a62c64c2a65c1966c2f4995d0e1f8b7dfc85a8b8de2562edf3d89070" +checksum = "4d744a7a2852a22f06210bcff9e4667ed0cacbfbe94894cc294044d25e876341" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] name = "ra-ap-rustc_lexer" -version = "0.143.0" +version = "0.166.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "228e01e1b237adb4bd8793487e1c37019c1e526a8f93716d99602301be267056" +checksum = "527c12b3731b7d0692498012810b85b2b8dfdb8b514321ed6afc434bd1c70191" dependencies = [ "memchr", + "unicode-ident", "unicode-properties", - "unicode-xid", ] [[package]] name = "ra-ap-rustc_next_trait_solver" -version = "0.143.0" +version = "0.166.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10d6f91143011d474bb844d268b0784c6a4c6db57743558b83f5ad34511627f1" +checksum = "a7a9663a8d7c369e934aac2b74a638537ad7eb4be75b4530d765384dc071c936" dependencies = [ "derive-where", "ra-ap-rustc_index", @@ -1617,22 +1624,22 @@ dependencies = [ [[package]] name = "ra-ap-rustc_parse_format" -version = "0.143.0" +version = "0.166.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37fa8effbc436c0ddd9d7b1421aa3cccf8b94566c841c4e4aa3e09063b8f423f" +checksum = "2c038b7a8b0f784d4e441ad8ab991fbbdaa5e0be482e59c639a846a1c8126951" dependencies = [ "ra-ap-rustc_lexer", - "rustc-literal-escaper 0.0.5", + "rustc-literal-escaper", ] [[package]] name = "ra-ap-rustc_pattern_analysis" -version = "0.143.0" +version = "0.166.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "883c843fc27847ad03b8e772dd4a2d2728af4333a6d6821a22dfcfe7136dff3e" +checksum = "42ca286f90e99bb97cd9274c088f3c874a05d1ee90cabf40a3928afedabe99fd" dependencies = [ "ra-ap-rustc_index", - "rustc-hash 2.1.2", + "rustc-hash 2.1.3", "rustc_apfloat", "smallvec", "tracing", @@ -1640,19 +1647,20 @@ dependencies = [ [[package]] name = "ra-ap-rustc_type_ir" -version = "0.143.0" +version = "0.166.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a86e33c46b2b261a173b23f207461a514812a8b2d2d7935bbc685f733eacce10" +checksum = "26d6efb6008f665a9485e0afecf9f4950a6c4bedd8ddd330a9df8986a6c0160b" dependencies = [ "arrayvec", - "bitflags", + "bitflags 2.13.1", "derive-where", "ena", "indexmap 2.14.0", + "ra-ap-rustc_abi", "ra-ap-rustc_ast_ir", "ra-ap-rustc_index", "ra-ap-rustc_type_ir_macros", - "rustc-hash 2.1.2", + "rustc-hash 2.1.3", "smallvec", "thin-vec", "tracing", @@ -1660,32 +1668,31 @@ dependencies = [ [[package]] name = "ra-ap-rustc_type_ir_macros" -version = "0.143.0" +version = "0.166.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15034c2fcaa5cf302aea6db20eda0f71fffeb0b372d6073cc50f940e974a2a47" +checksum = "5f4fd2355e2bbf1f343c730f623596efc6e465b5e3685b606a437567ebb75bf8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", "synstructure", ] [[package]] name = "ra_ap_base_db" -version = "0.0.328" +version = "0.0.347" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1567168e7c7b50acf2ffb87bde8937986d4f41c777a2c308298ede9d555c96c" +checksum = "7ea804efdf7c1fdbdac7c1b08002700a6f2930590399abcf84d55b4d4a894116" dependencies = [ "dashmap", "indexmap 2.14.0", "la-arena", "ra_ap_cfg", "ra_ap_intern", - "ra_ap_query-group-macro", "ra_ap_span", "ra_ap_syntax", "ra_ap_vfs", - "rustc-hash 2.1.2", + "rustc-hash 2.1.3", "salsa", "salsa-macros", "semver", @@ -1695,32 +1702,33 @@ dependencies = [ [[package]] name = "ra_ap_cfg" -version = "0.0.328" +version = "0.0.347" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e1fc8d53014b0ec4c06c9dbf0a810ccd67b3a96de4ef06bd1a248c2295b6a37" +checksum = "c50ba7c60bc08ef48d2a930c5f897349fb0a72cf53e86c0374476f2583d1f098" dependencies = [ "ra_ap_intern", "ra_ap_syntax", "ra_ap_tt", - "rustc-hash 2.1.2", + "rustc-hash 2.1.3", "tracing", ] [[package]] name = "ra_ap_edition" -version = "0.0.328" +version = "0.0.347" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "627a8ce8e870632395b7bf053c93039a3d91dda744ccae166ac83650572cfaa2" +checksum = "238a2d0108f16fe859e369c5aba251abccd10fae513391ee4d119ac6a48ffec7" [[package]] name = "ra_ap_hir" -version = "0.0.328" +version = "0.0.347" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b77616ef81f690a3eba4befd32112780b99f052676b0e7686a22bf79f3fbe2a8" +checksum = "9b0ff8d334193f5535c13a6749d2ed8ee4c417f75a2a92ffff24eee475097fdd" dependencies = [ "arrayvec", "either", "itertools", + "la-arena", "ra-ap-rustc_type_ir", "ra_ap_base_db", "ra_ap_cfg", @@ -1732,7 +1740,8 @@ dependencies = [ "ra_ap_stdx", "ra_ap_syntax", "ra_ap_tt", - "rustc-hash 2.1.2", + "rustc-hash 2.1.3", + "salsa", "serde_json", "smallvec", "tracing", @@ -1741,12 +1750,12 @@ dependencies = [ [[package]] name = "ra_ap_hir_def" -version = "0.0.328" +version = "0.0.347" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81504dd727efbaf48704a9c0e18e6491cb9848428376ad37146f37f63571ab3c" +checksum = "41d0148d0b1f176f27d55df6ac6dc662ed65c55cae367aeb9f30472879626cd5" dependencies = [ "arrayvec", - "bitflags", + "bitflags 2.13.1", "cov-mark", "drop_bomb", "either", @@ -1760,16 +1769,14 @@ dependencies = [ "ra_ap_cfg", "ra_ap_hir_expand", "ra_ap_intern", - "ra_ap_query-group-macro", "ra_ap_span", "ra_ap_stdx", "ra_ap_syntax", "ra_ap_syntax-bridge", "ra_ap_tt", - "rustc-hash 2.1.2", + "rustc-hash 2.1.3", "rustc_apfloat", "salsa", - "salsa-macros", "smallvec", "thin-vec", "tracing", @@ -1778,9 +1785,9 @@ dependencies = [ [[package]] name = "ra_ap_hir_expand" -version = "0.0.328" +version = "0.0.347" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9980623345a88d4431ce80331e640c494e2e59303e82a2cb1290b4684efdc6e5" +checksum = "b494d16c4a066ffe135ef730b01806539e87d4e5bb26acbd7cf9ccd2ffb238df" dependencies = [ "cov-mark", "either", @@ -1790,15 +1797,13 @@ dependencies = [ "ra_ap_intern", "ra_ap_mbe", "ra_ap_parser", - "ra_ap_query-group-macro", "ra_ap_span", "ra_ap_stdx", "ra_ap_syntax", "ra_ap_syntax-bridge", "ra_ap_tt", - "rustc-hash 2.1.2", + "rustc-hash 2.1.3", "salsa", - "salsa-macros", "smallvec", "thin-vec", "tracing", @@ -1807,11 +1812,12 @@ dependencies = [ [[package]] name = "ra_ap_hir_ty" -version = "0.0.328" +version = "0.0.347" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b822d1b9f0168281bbba34e0c5abada891fa9fc5e0b54e86493e8b075a877973" +checksum = "106393ec163f4cb9537721a04cd5e4d5ec642602c46f524e65a31a431be10269" dependencies = [ "arrayvec", + "bitflags 2.13.1", "cov-mark", "either", "ena", @@ -1831,14 +1837,12 @@ dependencies = [ "ra_ap_hir_expand", "ra_ap_intern", "ra_ap_macros", - "ra_ap_query-group-macro", "ra_ap_span", "ra_ap_stdx", "ra_ap_syntax", - "rustc-hash 2.1.2", + "rustc-hash 2.1.3", "rustc_apfloat", "salsa", - "salsa-macros", "serde", "serde_derive", "smallvec", @@ -1852,12 +1856,12 @@ dependencies = [ [[package]] name = "ra_ap_ide_db" -version = "0.0.328" +version = "0.0.347" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e250964a32be6c74f1f72e0fd8aea08aaed0535d85a7fd315fe442942185da0" +checksum = "c3ea305ce763f44928d29766c165982dd0a1c9fdba429296889d9e8e64dd28a5" dependencies = [ "arrayvec", - "bitflags", + "bitflags 2.13.1", "cov-mark", "crossbeam-channel", "either", @@ -1871,7 +1875,6 @@ dependencies = [ "ra_ap_macros", "ra_ap_parser", "ra_ap_profile", - "ra_ap_query-group-macro", "ra_ap_span", "ra_ap_stdx", "ra_ap_syntax", @@ -1879,9 +1882,8 @@ dependencies = [ "ra_ap_test_utils", "ra_ap_vfs", "rayon", - "rustc-hash 2.1.2", + "rustc-hash 2.1.3", "salsa", - "salsa-macros", "smallvec", "tracing", "triomphe", @@ -1889,22 +1891,23 @@ dependencies = [ [[package]] name = "ra_ap_intern" -version = "0.0.328" +version = "0.0.347" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df7edf9d14d093b4314b43ed75eaf56d47d870a09b8d0e0e67d17919c30bfb0f" +checksum = "0a6be54b5f8a47e4aee183dd985440bb2e46d587270f63a6fcb03409a0de7054" dependencies = [ + "arrayvec", "dashmap", "hashbrown 0.14.5", "rayon", - "rustc-hash 2.1.2", + "rustc-hash 2.1.3", "triomphe", ] [[package]] name = "ra_ap_load-cargo" -version = "0.0.328" +version = "0.0.347" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "184cdaabfb66948938aa4b73ee24f7fa57c1292292c1d87bcad2c616cbd254ea" +checksum = "96a50dad86901f2f0dab1e54ccf2dd43ce3bcb934bcaae1c3fa4884a1c45f77a" dependencies = [ "anyhow", "crossbeam-channel", @@ -1923,24 +1926,24 @@ dependencies = [ [[package]] name = "ra_ap_macros" -version = "0.0.328" +version = "0.0.347" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd338f982b2f7438ee89ca2429ad7181f2f0751fa6b98d8275905c97e2fb8361" +checksum = "478606f8a75d1c4f8e6bfd4874ecf56303a690e270cffbd82e9fb700637500c5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", "synstructure", ] [[package]] name = "ra_ap_mbe" -version = "0.0.328" +version = "0.0.347" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81d4c7114f2363c05b6dc7f5f6cdd6c9d6a1ba63410b0cdc80c81d1414da7c72" +checksum = "c8d1b45159a9f2e6d61bec480d49a5d2c4a1c8215a75f01cf1d6ae7042cc0330" dependencies = [ "arrayvec", - "bitflags", + "bitflags 2.13.1", "cov-mark", "ra-ap-rustc_lexer", "ra_ap_intern", @@ -1949,39 +1952,39 @@ dependencies = [ "ra_ap_stdx", "ra_ap_syntax-bridge", "ra_ap_tt", - "rustc-hash 2.1.2", + "rustc-hash 2.1.3", "salsa", "smallvec", ] [[package]] name = "ra_ap_parser" -version = "0.0.328" +version = "0.0.347" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9851f3b6e93971e6c3957966a07154bc35e0f91c0a6980ad71965620df6f737" +checksum = "8bdb9f2e027f40bbaeff62c026e1affabe691467c0553857f6eb7e36093c5b6f" dependencies = [ "drop_bomb", "ra-ap-rustc_lexer", "ra_ap_edition", - "rustc-literal-escaper 0.0.4", + "rustc-literal-escaper", "tracing", "winnow 0.7.15", ] [[package]] name = "ra_ap_paths" -version = "0.0.328" +version = "0.0.347" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "506bbef9963ca9275dd50f5876d68e32a58d47a369ea10bce2be1c758b081c42" +checksum = "36bc14237aa65d051028cbb54b0a0e0a1d53487b3f647c2b11667870720af9db" dependencies = [ "camino", ] [[package]] name = "ra_ap_proc_macro_api" -version = "0.0.328" +version = "0.0.347" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18e0229d5c7daa016a8f4f735194e68baf34ca18b73982ae036a8217874f32e9" +checksum = "3c56d7dacb79f01f5d9ab0a25b232acf37d3104d176e67d2985e9e389834c553" dependencies = [ "indexmap 2.14.0", "postcard", @@ -1991,7 +1994,7 @@ dependencies = [ "ra_ap_stdx", "ra_ap_tt", "rayon", - "rustc-hash 2.1.2", + "rustc-hash 2.1.3", "semver", "serde", "serde_derive", @@ -2001,21 +2004,20 @@ dependencies = [ [[package]] name = "ra_ap_profile" -version = "0.0.328" +version = "0.0.347" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b251c30d8e4df3902a92d10c4899e43403921f72aef12afa2f027a77e4898950" +checksum = "6f6a81ebc5ef6f42d86ac8d20c82d4132010f28af93da37f08d127eeea24b852" dependencies = [ - "cfg-if", "libc", "perf-event", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "ra_ap_project_model" -version = "0.0.328" +version = "0.0.347" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b04624412e45c7b0f792859be553182ea2360d8a24bf7162ca212840e683a24" +checksum = "9cf562304b786b7fa9089d2e0ae489d73abbda1732b0a820977a6fa7f9f5db0c" dependencies = [ "anyhow", "cargo_metadata", @@ -2028,49 +2030,38 @@ dependencies = [ "ra_ap_span", "ra_ap_stdx", "ra_ap_toolchain", - "rustc-hash 2.1.2", + "rustc-hash 2.1.3", "semver", "serde", "serde_derive", "serde_json", "temp-dir", - "toml 0.9.12+spec-1.1.0", + "toml", "tracing", "triomphe", ] -[[package]] -name = "ra_ap_query-group-macro" -version = "0.0.328" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "770079ca5addde33d31b7f3fa8d399f0dc29c26f69642a9d5c2a5e623d8af64d" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "ra_ap_span" -version = "0.0.328" +version = "0.0.347" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80a523bc8c85155ccd1db35b6855d37729d339c572b7fc0801c459bb8218976b" +checksum = "6358a99deb3e9564a3702731031bd6a59ab6843258f56697971c2591d142aa8a" dependencies = [ - "hashbrown 0.14.5", + "hashbrown 0.17.1", "la-arena", "ra_ap_stdx", "ra_ap_syntax", "ra_ap_vfs", - "rustc-hash 2.1.2", + "rustc-hash 2.1.3", "salsa", "text-size", ] [[package]] name = "ra_ap_stdx" -version = "0.0.328" +version = "0.0.347" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb22b95e21d08060860056c86af1b47b2cecbac5422baa112d9d138e97c3671a" +checksum = "808a663a921ead35b75a74a2eebe7ab84e5ced29c594e9bf3c77914caf8b77c0" dependencies = [ "crossbeam-channel", "crossbeam-utils", @@ -2079,22 +2070,23 @@ dependencies = [ "libc", "miow", "tracing", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "ra_ap_syntax" -version = "0.0.328" +version = "0.0.347" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3d9c469b5635401647b69e01a9930746f08a3cac51d04ad5ae99e66bdd643f" +checksum = "733ea008d3847dac53a6463689fd595a1d9459db09b1dc2306f2293dc130f586" dependencies = [ "either", "itertools", + "ra-ap-rustc_lexer", "ra_ap_parser", "ra_ap_stdx", "rowan", - "rustc-hash 2.1.2", - "rustc-literal-escaper 0.0.4", + "rustc-hash 2.1.3", + "rustc-literal-escaper", "smallvec", "smol_str", "tracing", @@ -2103,9 +2095,9 @@ dependencies = [ [[package]] name = "ra_ap_syntax-bridge" -version = "0.0.328" +version = "0.0.347" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4d3f2e2a1836eeedc2ed2810ece4cdf7ea42284f71b7031eac8448c1cb95b09" +checksum = "f1ea2603396e114a6db5145508242ce9d238983533e3bdc4019cb473247c5e07" dependencies = [ "ra_ap_intern", "ra_ap_parser", @@ -2113,14 +2105,14 @@ dependencies = [ "ra_ap_stdx", "ra_ap_syntax", "ra_ap_tt", - "rustc-hash 2.1.2", + "rustc-hash 2.1.3", ] [[package]] name = "ra_ap_test_fixture" -version = "0.0.328" +version = "0.0.347" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21d6d353373b4f28f2236ed7843bcee0e4dd0e6a12b339da874460bbefd070ab" +checksum = "77da42ce97d6b9de208c9e9fba23244da564130ee0d892af03d0a6eb72ba8672" dependencies = [ "ra_ap_base_db", "ra_ap_cfg", @@ -2136,33 +2128,33 @@ dependencies = [ [[package]] name = "ra_ap_test_utils" -version = "0.0.328" +version = "0.0.347" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d10cbb0402abee7034de5d90ddf7e380d1e21ad0e1dcd2db92c3c87df78723" +checksum = "fdfcc378493db43a2b837d9cd62c4c91c5d33302ae639b3dbf6d56ed97df6e63" dependencies = [ "dissimilar", "ra_ap_paths", "ra_ap_profile", "ra_ap_stdx", - "rustc-hash 2.1.2", + "rustc-hash 2.1.3", "text-size", ] [[package]] name = "ra_ap_toolchain" -version = "0.0.328" +version = "0.0.347" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fed946c88a9dfa93de7a376a06493c5377a1052ac666ab9e1155f4ea57271c9" +checksum = "5f7748b05a913c21f6182b4c2d7c7009251938b8eb01a2b96e61d0c7ca4aacc2" dependencies = [ "camino", - "home", + "semver", ] [[package]] name = "ra_ap_tt" -version = "0.0.328" +version = "0.0.347" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96dfc20add2675d38240a7815755b54f514d91b9dc0336cb3d024901af4faeef" +checksum = "babe00307d454b585a66e51f1fe6ccdfd1f82a200ef75374c80e843520cb3f7f" dependencies = [ "arrayvec", "indexmap 2.14.0", @@ -2170,15 +2162,15 @@ dependencies = [ "ra_ap_intern", "ra_ap_span", "ra_ap_stdx", - "rustc-hash 2.1.2", + "rustc-hash 2.1.3", "text-size", ] [[package]] name = "ra_ap_vfs" -version = "0.0.328" +version = "0.0.347" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d69bc10b59435e4d989d10bc0b602a5bd70e1dcc2c5d8513b10585d9e778b440" +checksum = "a730486f6595655431750c15faf4332603ad30f0460e7c89bbee79880416794b" dependencies = [ "crossbeam-channel", "fst", @@ -2186,15 +2178,15 @@ dependencies = [ "nohash-hasher", "ra_ap_paths", "ra_ap_stdx", - "rustc-hash 2.1.2", + "rustc-hash 2.1.3", "tracing", ] [[package]] name = "ra_ap_vfs-notify" -version = "0.0.328" +version = "0.0.347" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07f7f31bb0c5744ba1fe1b1460eeb62274110dfb94e4b6719cf2e7df9410032d" +checksum = "ede5e2c51dd3a138039d2f1c4dc33709cebb1c4e00692f8026de833844ad375f" dependencies = [ "crossbeam-channel", "notify", @@ -2202,19 +2194,19 @@ dependencies = [ "ra_ap_stdx", "ra_ap_vfs", "rayon", - "rustc-hash 2.1.2", + "rustc-hash 2.1.3", "tracing", "walkdir", ] [[package]] name = "rand" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" dependencies = [ "chacha20", - "getrandom 0.4.2", + "getrandom", "rand_core", ] @@ -2250,34 +2242,34 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags", + "bitflags 2.13.1", ] [[package]] name = "ref-cast" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +checksum = "216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +checksum = "2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] name = "regex" -version = "1.12.3" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" dependencies = [ "aho-corasick", "memchr", @@ -2287,9 +2279,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.14" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" dependencies = [ "aho-corasick", "memchr", @@ -2298,15 +2290,15 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "rowan" -version = "0.15.18" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f509095fc8cc0c8c8564016771d458079c11a8d857e65861f045145c0d3208" +checksum = "14b574c58582fa59fa43a2feb6608b8744184659f08a2e0117e4b8224d95ed61" dependencies = [ "countme", "hashbrown 0.14.5", @@ -2320,7 +2312,7 @@ name = "rust-extractor-macros" version = "0.1.0" dependencies = [ "quote", - "syn", + "syn 3.0.3", ] [[package]] @@ -2331,21 +2323,15 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc-hash" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" - -[[package]] -name = "rustc-literal-escaper" -version = "0.0.4" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab03008eb631b703dd16978282ae36c73282e7922fe101a4bd072a40ecea7b8b" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" [[package]] name = "rustc-literal-escaper" -version = "0.0.5" +version = "0.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4ee29da77c5a54f42697493cd4c9b9f31b74df666a6c04dfc4fde77abe0438b" +checksum = "8be87abb9e40db7466e0681dc8ecd9dcfd40360cb10b4c8fe24a7c4c3669b198" [[package]] name = "rustc-stable-hash" @@ -2359,24 +2345,15 @@ version = "0.2.3+llvm-462a31f5a5ab" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "486c2179b4796f65bfe2ee33679acf0927ac83ecf583ad6c91c3b4570911b9ad" dependencies = [ - "bitflags", + "bitflags 2.13.1", "smallvec", ] -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - [[package]] name = "rustversion" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" [[package]] name = "ryu" @@ -2386,14 +2363,14 @@ checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "salsa" -version = "0.25.2" +version = "0.28.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e2aa2fca57727371eeafc975acc8e6f4c52f8166a78035543f6ee1c74c2dcc" +checksum = "cf0e374215cd2db2b5c75d7b3a99cb0cc052c0595335dfdefc03d4eb08f4aa81" dependencies = [ "boxcar", "crossbeam-queue", "crossbeam-utils", - "hashbrown 0.15.5", + "hashbrown 0.17.1", "hashlink", "indexmap 2.14.0", "intrusive-collections", @@ -2401,30 +2378,31 @@ dependencies = [ "parking_lot", "portable-atomic", "rayon", - "rustc-hash 2.1.2", + "rustc-hash 2.1.3", "salsa-macro-rules", "salsa-macros", "smallvec", "thin-vec", "tracing", + "triomphe", + "typeid", ] [[package]] name = "salsa-macro-rules" -version = "0.25.2" +version = "0.28.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfc2a1e7bf06964105515451d728f2422dedc3a112383324a00b191a5c397a3" +checksum = "85f4b7d4405540bbd6d4ffa52d4322d983f3781954d3073067ac1bdb028459b3" [[package]] name = "salsa-macros" -version = "0.25.2" +version = "0.28.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d844c1aa34946da46af683b5c27ec1088a3d9d84a2b837a108223fd830220e1" +checksum = "445be2bfbb2f67cb663225ecd7bc5a25370c0250fca30f9d8cbad9a913650370" dependencies = [ "proc-macro2", "quote", - "syn", - "synstructure", + "syn 3.0.3", ] [[package]] @@ -2450,9 +2428,9 @@ dependencies = [ [[package]] name = "schemars" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" +checksum = "687274d293b6cdc6e73e0fee520bf2049650090d7164f87672d212a3c530cf4a" dependencies = [ "dyn-clone", "ref-cast", @@ -2478,9 +2456,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" dependencies = [ "serde_core", "serde_derive", @@ -2488,29 +2466,29 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] name = "serde_json" -version = "1.0.150" +version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" dependencies = [ "indexmap 2.14.0", "itoa", @@ -2531,9 +2509,9 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.20.0" +version = "3.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e72c1c2cb7b223fafb600a619537a871c2818583d619401b785e7c0b746ccde2" +checksum = "ee78f1fbe43ac4a0e47aadb3dbd357b69eb0d3793e948624cd03dd2750ab1c0a" dependencies = [ "base64", "bs58", @@ -2541,8 +2519,9 @@ dependencies = [ "hex", "indexmap 1.9.3", "indexmap 2.14.0", + "jiff", "schemars 0.9.0", - "schemars 1.2.1", + "schemars 1.2.2", "serde_core", "serde_json", "serde_with_macros", @@ -2551,14 +2530,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.20.0" +version = "3.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b90c488738ecb4fb0262f41f43bc40efc5868d9fb744319ddf5f5317f417bfac" +checksum = "8705578779c2b6bd90d84d66eb2e206b708b1a4d7b9f17641b293545bf1c7e46" dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -2585,9 +2564,9 @@ dependencies = [ [[package]] name = "shlex" -version = "1.3.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" [[package]] name = "simd-adler32" @@ -2603,9 +2582,9 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.15.1" +version = "1.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" [[package]] name = "smol_str" @@ -2617,15 +2596,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - [[package]] name = "stable_deref_trait" version = "1.2.1" @@ -2650,9 +2620,20 @@ version = "0.1.0" [[package]] name = "syn" -version = "2.0.117" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" dependencies = [ "proc-macro2", "quote", @@ -2667,14 +2648,14 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] name = "temp-dir" -version = "0.1.16" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83176759e9416cf81ee66cb6508dbfe9c96f20b8b56265a39917551c23c70964" +checksum = "016ef9739649996fcc983b9c588fe3d557cf216d4d98503ce1b057ab5a66d689" [[package]] name = "text-size" @@ -2684,47 +2665,46 @@ checksum = "f18aa187839b2bdb1ad2fa35ead8c4c2976b64e4363c386d45ac0f7ee85c9233" [[package]] name = "thin-vec" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0f7e269b48f0a7dd0146680fa24b50cc67fc0373f086a5b2f99bd084639b482" +checksum = "79def32ffcd477db1ff26f76dab9e3a91f0bd42a85ca96577089b24623056f9d" [[package]] name = "thiserror" -version = "2.0.18" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "2.0.18" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] name = "thread_local" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" dependencies = [ "cfg-if", ] [[package]] name = "time" -version = "0.3.47" +version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" dependencies = [ "deranged", - "itoa", "libc", "num-conv", "num_threads", @@ -2736,15 +2716,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] name = "time-macros" -version = "0.2.27" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" dependencies = [ "num-conv", "time-core", @@ -2752,9 +2732,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" dependencies = [ "tinyvec_macros", ] @@ -2767,41 +2747,17 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "toml" -version = "0.9.12+spec-1.1.0" +version = "1.1.4+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +checksum = "3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5" dependencies = [ "indexmap 2.14.0", "serde_core", "serde_spanned", - "toml_datetime 0.7.5+spec-1.1.0", + "toml_datetime", "toml_parser", "toml_writer", - "winnow 0.7.15", -] - -[[package]] -name = "toml" -version = "1.1.2+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee" -dependencies = [ - "indexmap 2.14.0", - "serde_core", - "serde_spanned", - "toml_datetime 1.1.1+spec-1.1.0", - "toml_parser", - "toml_writer", - "winnow 1.0.3", -] - -[[package]] -name = "toml_datetime" -version = "0.7.5+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" -dependencies = [ - "serde_core", + "winnow 1.0.4", ] [[package]] @@ -2815,18 +2771,18 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.1.2+spec-1.1.0" +version = "1.1.3+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" dependencies = [ - "winnow 1.0.3", + "winnow 1.0.4", ] [[package]] name = "toml_writer" -version = "1.1.1+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" [[package]] name = "tracing" @@ -2847,7 +2803,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -2877,7 +2833,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" dependencies = [ - "log 0.4.29", + "log 0.4.33", "once_cell", "tracing-core", ] @@ -2955,9 +2911,9 @@ checksum = "009994f150cc0cd50ff54917d5bc8bffe8cad10ca10d81c34da2ec421ae61782" [[package]] name = "tree-sitter-python" -version = "0.23.6" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d065aaa27f3aaceaf60c1f0e0ac09e1cb9eb8ed28e7bcdaa52129cffc7f4b04" +checksum = "6bf85fd39652e740bf60f46f4cda9492c3a9ad75880575bf14960f775cb74a1c" dependencies = [ "cc", "tree-sitter-language", @@ -2985,9 +2941,9 @@ dependencies = [ [[package]] name = "triomphe" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd69c5aa8f924c7519d6372789a74eac5b94fb0f8fcf0d4a97eb0bfc3e785f39" +checksum = "b40688ea6389c8171614b25491f71d4a27946e0c7ce2da1c6de27e25abf1a0ae" dependencies = [ "serde", "stable_deref_trait", @@ -2999,6 +2955,12 @@ version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + [[package]] name = "uncased" version = "0.9.10" @@ -3026,12 +2988,6 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - [[package]] name = "unsafe-libyaml" version = "0.2.11" @@ -3072,29 +3028,11 @@ version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" -[[package]] -name = "wasip2" -version = "1.0.3+wasi-0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" -dependencies = [ - "wit-bindgen 0.57.1", -] - -[[package]] -name = "wasip3" -version = "0.4.0+wasi-0.3.0-rc-2026-01-06" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" -dependencies = [ - "wit-bindgen 0.51.0", -] - [[package]] name = "wasm-bindgen" -version = "0.2.121" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49ace1d07c165b0864824eee619580c4689389afa9dc9ed3a4c75040d82e6790" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" dependencies = [ "cfg-if", "once_cell", @@ -3105,9 +3043,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.121" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e68e6f4afd367a562002c05637acb8578ff2dea1943df76afb9e83d177c8578" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3115,60 +3053,26 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.121" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95a9ec35c64b2a7cb35d3fead40c4238d0940c86d107136999567a4703259f2" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn", + "syn 2.0.119", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.121" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4e0100b01e9f0d03189a92b96772a1fb998639d981193d7dbab487302513441" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" dependencies = [ "unicode-ident", ] -[[package]] -name = "wasm-encoder" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" -dependencies = [ - "leb128fmt", - "wasmparser", -] - -[[package]] -name = "wasm-metadata" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" -dependencies = [ - "anyhow", - "indexmap 2.14.0", - "wasm-encoder", - "wasmparser", -] - -[[package]] -name = "wasmparser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" -dependencies = [ - "bitflags", - "hashbrown 0.15.5", - "indexmap 2.14.0", - "semver", -] - [[package]] name = "winapi-util" version = "0.1.11" @@ -3199,7 +3103,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -3210,7 +3114,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -3328,103 +3232,9 @@ checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" [[package]] name = "winnow" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" - -[[package]] -name = "wit-bindgen" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" -dependencies = [ - "wit-bindgen-rust-macro", -] - -[[package]] -name = "wit-bindgen" -version = "0.57.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" - -[[package]] -name = "wit-bindgen-core" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" -dependencies = [ - "anyhow", - "heck", - "wit-parser", -] - -[[package]] -name = "wit-bindgen-rust" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" -dependencies = [ - "anyhow", - "heck", - "indexmap 2.14.0", - "prettyplease", - "syn", - "wasm-metadata", - "wit-bindgen-core", - "wit-component", -] - -[[package]] -name = "wit-bindgen-rust-macro" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" -dependencies = [ - "anyhow", - "prettyplease", - "proc-macro2", - "quote", - "syn", - "wit-bindgen-core", - "wit-bindgen-rust", -] - -[[package]] -name = "wit-component" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" -dependencies = [ - "anyhow", - "bitflags", - "indexmap 2.14.0", - "log 0.4.29", - "serde", - "serde_derive", - "serde_json", - "wasm-encoder", - "wasm-metadata", - "wasmparser", - "wit-parser", -] - -[[package]] -name = "wit-parser" -version = "0.244.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" -dependencies = [ - "anyhow", - "id-arena", - "indexmap 2.14.0", - "log 0.4.29", - "semver", - "serde", - "serde_derive", - "serde_json", - "unicode-xid", - "wasmparser", -] +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" [[package]] name = "yansi" @@ -3453,7 +3263,7 @@ version = "0.1.0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] @@ -3467,9 +3277,9 @@ dependencies = [ [[package]] name = "zmij" -version = "1.0.21" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" [[package]] name = "zstd" diff --git a/ruby/extractor/Cargo.toml b/ruby/extractor/Cargo.toml index 09c67fd42f8d..db5cd433fe9d 100644 --- a/ruby/extractor/Cargo.toml +++ b/ruby/extractor/Cargo.toml @@ -14,9 +14,9 @@ clap = { version = "4.6", features = ["derive"] } tracing = "0.1" tracing-subscriber = { version = "0.3.23", features = ["env-filter"] } rayon = "1.12.0" -regex = "1.12.3" +regex = "1.13.1" encoding = "0.2" lazy_static = "1.5.0" -serde_json = "1.0.149" +serde_json = "1.0.151" codeql-extractor = { path = "../../shared/tree-sitter-extractor" } diff --git a/rust/ast-generator/Cargo.toml b/rust/ast-generator/Cargo.toml index af12188d240a..257f6212dcf2 100644 --- a/rust/ast-generator/Cargo.toml +++ b/rust/ast-generator/Cargo.toml @@ -7,11 +7,11 @@ license = "MIT" # When updating these dependencies, run `rust/update_cargo_deps.sh` [dependencies] ungrammar = "1.16.1" -proc-macro2 = "1.0.106" -quote = "1.0.45" -either = "1.15.0" -stdx = {package = "ra_ap_stdx", version = "0.0.328"} -itertools = "0.14.0" +proc-macro2 = "1.0.107" +quote = "1.0.47" +either = "1.17.0" +stdx = {package = "ra_ap_stdx", version = "0.0.347"} +itertools = "0.15.0" mustache = "0.9.0" -serde = { version = "1.0.228", features = ["derive"] } -anyhow = "1.0.102" +serde = { version = "1.0.229", features = ["derive"] } +anyhow = "1.0.104" diff --git a/rust/extractor/Cargo.toml b/rust/extractor/Cargo.toml index 60376b5b67e8..45f18f2ca7f4 100644 --- a/rust/extractor/Cargo.toml +++ b/rust/extractor/Cargo.toml @@ -6,38 +6,38 @@ license = "MIT" # When updating these dependencies, run `rust/update_cargo_deps.sh` [dependencies] -anyhow = "1.0.102" -clap = { version = "4.6.0", features = ["derive"] } +anyhow = "1.0.104" +clap = { version = "4.6.6", features = ["derive"] } figment = { version = "0.10.19", features = ["env", "yaml"] } num-traits = "0.2.19" -ra_ap_base_db = "0.0.328" -ra_ap_hir = "0.0.328" -ra_ap_hir_def = "0.0.328" -ra_ap_ide_db = "0.0.328" -ra_ap_hir_ty = "0.0.328" -ra_ap_hir_expand = "0.0.328" -ra_ap_load-cargo = "0.0.328" -ra_ap_paths = "0.0.328" -ra_ap_project_model = "0.0.328" -ra_ap_syntax = "0.0.328" -ra_ap_syntax-bridge = "0.0.328" -ra_ap_vfs = "0.0.328" -ra_ap_parser = "0.0.328" -ra_ap_span = "0.0.328" -ra_ap_cfg = "0.0.328" -ra_ap_intern = "0.0.328" -serde = "1.0.228" -serde_with = "3.18.0" -triomphe = "0.1.15" +ra_ap_base_db = "0.0.347" +ra_ap_hir = "0.0.347" +ra_ap_hir_def = "0.0.347" +ra_ap_ide_db = "0.0.347" +ra_ap_hir_ty = "0.0.347" +ra_ap_hir_expand = "0.0.347" +ra_ap_load-cargo = "0.0.347" +ra_ap_paths = "0.0.347" +ra_ap_project_model = "0.0.347" +ra_ap_syntax = "0.0.347" +ra_ap_syntax-bridge = "0.0.347" +ra_ap_vfs = "0.0.347" +ra_ap_parser = "0.0.347" +ra_ap_span = "0.0.347" +ra_ap_cfg = "0.0.347" +ra_ap_intern = "0.0.347" +serde = "1.0.229" +serde_with = "3.22.0" +triomphe = "0.1.16" argfile = "1.0.0" codeql-extractor = { path = "../../shared/tree-sitter-extractor" } rust-extractor-macros = { path = "macros" } -itertools = "0.14.0" -glob = "0.3.3" -chrono = { version = "0.4.44", features = ["serde"] } -serde_json = "1.0.149" +itertools = "0.15.0" +glob = "0.3.4" +chrono = { version = "0.4.45", features = ["serde"] } +serde_json = "1.0.151" dunce = "1.0.5" -toml = "1.1.2" +toml = "1.1.4" tracing = "0.1.44" tracing-flame = "0.2.0" tracing-subscriber = "0.3.23" diff --git a/rust/extractor/macros/Cargo.toml b/rust/extractor/macros/Cargo.toml index 7d370713d5d6..fa0c441ed278 100644 --- a/rust/extractor/macros/Cargo.toml +++ b/rust/extractor/macros/Cargo.toml @@ -9,5 +9,5 @@ proc-macro = true # When updating these dependencies, run `rust/update_cargo_deps.sh` [dependencies] -quote = "1.0.45" -syn = { version = "2.0.117", features = ["full"] } +quote = "1.0.47" +syn = { version = "3.0.3", features = ["full"] } diff --git a/shared/tree-sitter-extractor/Cargo.toml b/shared/tree-sitter-extractor/Cargo.toml index 61a66ab980e4..8b541ff73b0b 100644 --- a/shared/tree-sitter-extractor/Cargo.toml +++ b/shared/tree-sitter-extractor/Cargo.toml @@ -12,12 +12,12 @@ tree-sitter = ">= 0.23.0" tracing = "0.1" tracing-subscriber = { version = "0.3.23", features = ["env-filter"] } rayon = "1.12.0" -regex = "1.12.3" +regex = "1.13.1" encoding = "0.2" lazy_static = "1.5.0" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" -chrono = { version = "0.4.44", features = ["serde"] } +chrono = { version = "0.4.45", features = ["serde"] } num_cpus = "1.17.0" zstd = "0.13.3" yeast = { path = "../yeast" } @@ -25,4 +25,4 @@ yeast = { path = "../yeast" } [dev-dependencies] tree-sitter-ql = "0.23.1" tree-sitter-json = "0.24.8" -rand = "0.10.1" +rand = "0.10.2" diff --git a/shared/yeast-macros/Cargo.toml b/shared/yeast-macros/Cargo.toml index 30c82d03b6eb..52eed1b17ed2 100644 --- a/shared/yeast-macros/Cargo.toml +++ b/shared/yeast-macros/Cargo.toml @@ -9,4 +9,4 @@ proc-macro = true [dependencies] proc-macro2 = "1.0" quote = "1.0" -syn = "2.0" +syn = "3.0" diff --git a/shared/yeast/Cargo.toml b/shared/yeast/Cargo.toml index 518a0d1cefc2..1c101efd816f 100644 --- a/shared/yeast/Cargo.toml +++ b/shared/yeast/Cargo.toml @@ -4,13 +4,13 @@ version = "0.1.0" edition = "2021" [dependencies] -clap = { version = "4.4.10", features = ["derive"] } -serde = { version = "1.0.193", features = ["derive"] } -serde_json = "1.0.108" +clap = { version = "4.6.6", features = ["derive"] } +serde = { version = "1.0.229", features = ["derive"] } +serde_json = "1.0.151" serde_yaml = "0.9" tree-sitter = ">= 0.23.0" yeast-macros = { path = "../yeast-macros" } yeast-schema = { path = "../yeast-schema" } tree-sitter-ruby = "0.23" -tree-sitter-python = "0.23" +tree-sitter-python = "0.25" diff --git a/unified/extractor/Cargo.toml b/unified/extractor/Cargo.toml index 607afc40458b..d4bce75cf7fa 100644 --- a/unified/extractor/Cargo.toml +++ b/unified/extractor/Cargo.toml @@ -7,14 +7,14 @@ edition = "2024" # When updating these dependencies, run `misc/bazel/3rdparty/update_cargo_deps.sh` [dependencies] -clap = { version = "4.5", features = ["derive"] } +clap = { version = "4.6", features = ["derive"] } tracing = "0.1" -tracing-subscriber = { version = "0.3.20", features = ["env-filter"] } -rayon = "1.11.0" -regex = "1.11.3" +tracing-subscriber = { version = "0.3.23", features = ["env-filter"] } +rayon = "1.12.0" +regex = "1.13.1" encoding = "0.2" lazy_static = "1.5.0" -serde_json = "1.0.145" +serde_json = "1.0.151" codeql-extractor = { path = "../../shared/tree-sitter-extractor" } yeast = { path = "../../shared/yeast" } From 93fd01d7a500964cc59635b1ece58422431d03c9 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 14 Aug 2026 09:24:58 +0200 Subject: [PATCH 0295/2098] Bazel: regenerate vendored cargo dependencies --- MODULE.bazel | 68 +- ...4.bazel => BUILD.aho-corasick-1.1.5.bazel} | 4 +- ...UILD.android_system_properties-0.1.5.bazel | 2 +- ...0.102.bazel => BUILD.anyhow-1.0.104.bazel} | 6 +- ...0.7.6.bazel => BUILD.arrayvec-0.7.8.bazel} | 2 +- .../tree_sitter_extractors_deps/BUILD.bazel | 208 +- ...5.3.0.bazel => BUILD.bitflags-1.3.2.bazel} | 6 +- ...11.1.bazel => BUILD.bitflags-2.13.1.bazel} | 2 +- ...sh-1.6.1.bazel => BUILD.borsh-1.8.0.bazel} | 8 +- .../BUILD.bstr-1.12.1.bazel | 2 +- ....20.2.bazel => BUILD.bumpalo-3.20.3.bazel} | 2 +- .../BUILD.byteorder-1.5.0.bazel | 97 - ...-1.11.1.bazel => BUILD.bytes-1.12.1.bazel} | 2 +- ...o-1.2.2.bazel => BUILD.camino-1.2.5.bazel} | 8 +- .../BUILD.cargo-platform-0.3.3.bazel | 2 +- .../BUILD.cargo_metadata-0.23.1.bazel | 8 +- ...D.cc-1.2.62.bazel => BUILD.cc-1.4.2.bazel} | 34 +- ....1.bazel => BUILD.cfg_aliases-0.2.2.bazel} | 2 +- ...10.0.bazel => BUILD.chacha20-0.10.1.bazel} | 2 +- .../BUILD.chalk-derive-0.104.0.bazel | 6 +- .../BUILD.chalk-ir-0.104.0.bazel | 2 +- ...0.4.44.bazel => BUILD.chrono-0.4.45.bazel} | 8 +- ...lap-4.6.1.bazel => BUILD.clap-4.6.6.bazel} | 6 +- ...0.bazel => BUILD.clap_builder-4.6.6.bazel} | 2 +- ....1.bazel => BUILD.clap_derive-4.6.4.bazel} | 8 +- .../BUILD.cobs-0.3.0.bazel | 2 +- .../BUILD.cpufeatures-0.3.0.bazel | 12 +- .../BUILD.critical-section-1.2.0.bazel | 97 - ...l => BUILD.crossbeam-channel-0.5.16.bazel} | 4 +- .../BUILD.crossbeam-deque-0.8.7.bazel | 172 ++ .../BUILD.crossbeam-epoch-0.9.18.bazel | 104 - .../BUILD.crossbeam-epoch-0.9.20.bazel | 171 ++ .../BUILD.crossbeam-queue-0.3.12.bazel | 2 +- ...zel => BUILD.crossbeam-utils-0.8.22.bazel} | 6 +- .../BUILD.darling_core-0.23.0.bazel | 6 +- .../BUILD.darling_macro-0.23.0.bazel | 4 +- ...-6.1.0.bazel => BUILD.dashmap-6.2.1.bazel} | 4 +- .../BUILD.defmt-1.1.1.bazel | 167 ++ .../BUILD.defmt-macros-1.1.1.bazel | 166 ++ ...9.bazel => BUILD.defmt-parser-1.0.0.bazel} | 8 +- .../BUILD.deranged-0.5.8.bazel | 4 - .../BUILD.derive-where-1.6.1.bazel | 6 +- ...1.16.0.bazel => BUILD.either-1.17.0.bazel} | 2 +- .../BUILD.ena-0.14.4.bazel | 2 +- .../BUILD.figment-0.10.19.bazel | 2 +- ...zel => BUILD.find-msvc-tools-0.1.10.bazel} | 4 +- .../BUILD.foldhash-0.2.0.bazel | 97 + .../BUILD.fsevent-sys-4.1.0.bazel | 2 +- ....bazel => BUILD.futures-core-0.3.34.bazel} | 2 +- ....bazel => BUILD.futures-task-0.3.34.bazel} | 2 +- ....bazel => BUILD.futures-util-0.3.34.bazel} | 6 +- .../BUILD.getrandom-0.3.4.bazel | 249 --- ....4.2.bazel => BUILD.getrandom-0.4.3.bazel} | 59 +- ...lob-0.3.3.bazel => BUILD.glob-0.3.4.bazel} | 4 +- .../BUILD.globset-0.4.18.bazel | 8 +- .../BUILD.hash32-0.2.1.bazel | 100 - .../BUILD.hashbrown-0.15.5.bazel | 6 - .../BUILD.hashbrown-0.17.1.bazel | 13 + ...10.0.bazel => BUILD.hashlink-0.12.1.bazel} | 6 +- .../BUILD.heapless-0.7.17.bazel | 213 -- .../BUILD.iana-time-zone-0.1.65.bazel | 6 +- .../BUILD.iana-time-zone-haiku-0.1.2.bazel | 2 +- .../BUILD.indexmap-2.14.0.bazel | 2 +- .../BUILD.inotify-0.11.1.bazel | 6 +- .../BUILD.inotify-sys-0.1.5.bazel | 100 - ....1.bazel => BUILD.inotify-sys-0.1.8.bazel} | 19 +- ... BUILD.intrusive-collections-0.10.3.bazel} | 5 +- .../BUILD.inventory-0.3.24.bazel | 10 +- ...4.0.bazel => BUILD.itertools-0.15.0.bazel} | 4 +- ...e-0.5.12.bazel => BUILD.jiff-0.2.35.bazel} | 26 +- ....3.0.bazel => BUILD.jiff-core-0.1.0.bazel} | 8 +- .../BUILD.jiff-static-0.2.35.bazel | 106 + .../BUILD.jiff-tzdb-0.1.8.bazel | 97 + ...l => BUILD.jiff-tzdb-platform-0.1.3.bazel} | 10 +- ....34.bazel => BUILD.jobserver-0.1.35.bazel} | 62 +- ....3.98.bazel => BUILD.js-sys-0.3.103.bazel} | 7 +- ...e-1.1.1.bazel => BUILD.kqueue-1.2.0.bazel} | 4 +- .../BUILD.kqueue-sys-1.1.2.bazel | 4 +- .../BUILD.leb128fmt-0.1.0.bazel | 97 - ...0.2.186.bazel => BUILD.libc-0.2.189.bazel} | 6 +- .../BUILD.log-0.3.9.bazel | 2 +- ...og-0.4.29.bazel => BUILD.log-0.4.33.bazel} | 2 +- .../BUILD.matchers-0.2.0.bazel | 2 +- ...r-2.8.0.bazel => BUILD.memchr-2.8.3.bazel} | 2 +- ....mio-1.2.0.bazel => BUILD.mio-1.2.2.bazel} | 64 +- .../BUILD.mustache-0.9.0.bazel | 2 +- .../BUILD.notify-8.2.0.bazel | 60 +- .../BUILD.notify-types-2.1.0.bazel | 2 +- .../BUILD.num_cpus-1.17.0.bazel | 76 +- .../BUILD.num_threads-0.1.7.bazel | 16 +- .../BUILD.os_str_bytes-7.2.0.bazel | 2 +- .../BUILD.parking_lot_core-0.9.12.bazel | 56 +- .../BUILD.pear_codegen-0.2.9.bazel | 6 +- .../BUILD.perf-event-0.4.8.bazel | 2 +- .../BUILD.perf-event-open-sys-4.0.0.bazel | 2 +- ...zel => BUILD.portable-atomic-1.14.0.bazel} | 6 +- ...=> BUILD.portable-atomic-util-0.2.7.bazel} | 20 +- .../BUILD.postcard-1.1.3.bazel | 6 +- .../BUILD.prettyplease-0.2.37.bazel | 165 -- ....bazel => BUILD.proc-macro2-1.0.107.bazel} | 6 +- ...BUILD.proc-macro2-diagnostics-0.10.1.bazel | 6 +- ...-1.0.45.bazel => BUILD.quote-1.0.47.bazel} | 8 +- ...el => BUILD.ra-ap-rustc_abi-0.166.0.bazel} | 12 +- ...=> BUILD.ra-ap-rustc_ast_ir-0.166.0.bazel} | 2 +- ...=> BUILD.ra-ap-rustc_hashes-0.166.0.bazel} | 2 +- ... => BUILD.ra-ap-rustc_index-0.166.0.bazel} | 6 +- ...LD.ra-ap-rustc_index_macros-0.166.0.bazel} | 8 +- ... => BUILD.ra-ap-rustc_lexer-0.166.0.bazel} | 6 +- ...-ap-rustc_next_trait_solver-0.166.0.bazel} | 14 +- ...LD.ra-ap-rustc_parse_format-0.166.0.bazel} | 8 +- ...a-ap-rustc_pattern_analysis-0.166.0.bazel} | 10 +- ...> BUILD.ra-ap-rustc_type_ir-0.166.0.bazel} | 26 +- ....ra-ap-rustc_type_ir_macros-0.166.0.bazel} | 8 +- ...azel => BUILD.ra_ap_base_db-0.0.347.bazel} | 34 +- ...28.bazel => BUILD.ra_ap_cfg-0.0.347.bazel} | 16 +- ...azel => BUILD.ra_ap_edition-0.0.347.bazel} | 2 +- ...28.bazel => BUILD.ra_ap_hir-0.0.347.bazel} | 60 +- ...azel => BUILD.ra_ap_hir_def-0.0.347.bazel} | 65 +- .../BUILD.ra_ap_hir_expand-0.0.328.bazel | 135 -- .../BUILD.ra_ap_hir_expand-0.0.347.bazel | 130 ++ ...bazel => BUILD.ra_ap_hir_ty-0.0.347.bazel} | 70 +- ...bazel => BUILD.ra_ap_ide_db-0.0.347.bazel} | 69 +- ...bazel => BUILD.ra_ap_intern-0.0.347.bazel} | 9 +- ...l => BUILD.ra_ap_load-cargo-0.0.347.bazel} | 44 +- ...bazel => BUILD.ra_ap_macros-0.0.347.bazel} | 8 +- ...28.bazel => BUILD.ra_ap_mbe-0.0.347.bazel} | 38 +- ...bazel => BUILD.ra_ap_parser-0.0.347.bazel} | 10 +- ....bazel => BUILD.ra_ap_paths-0.0.347.bazel} | 4 +- ... BUILD.ra_ap_proc_macro_api-0.0.347.bazel} | 30 +- ...azel => BUILD.ra_ap_profile-0.0.347.bazel} | 32 +- ...> BUILD.ra_ap_project_model-0.0.347.bazel} | 48 +- ...UILD.ra_ap_query-group-macro-0.0.328.bazel | 102 - ...8.bazel => BUILD.ra_ap_span-0.0.347.bazel} | 20 +- ...8.bazel => BUILD.ra_ap_stdx-0.0.347.bazel} | 68 +- ...bazel => BUILD.ra_ap_syntax-0.0.347.bazel} | 25 +- ...> BUILD.ra_ap_syntax-bridge-0.0.347.bazel} | 28 +- ...=> BUILD.ra_ap_test_fixture-0.0.347.bazel} | 40 +- ...l => BUILD.ra_ap_test_utils-0.0.347.bazel} | 16 +- ...el => BUILD.ra_ap_toolchain-0.0.347.bazel} | 6 +- ...328.bazel => BUILD.ra_ap_tt-0.0.347.bazel} | 23 +- ...28.bazel => BUILD.ra_ap_vfs-0.0.347.bazel} | 14 +- ...l => BUILD.ra_ap_vfs-notify-0.0.347.bazel} | 18 +- ...d-0.10.1.bazel => BUILD.rand-0.10.2.bazel} | 6 +- .../BUILD.rayon-1.12.0.bazel | 2 +- .../BUILD.rayon-core-1.13.0.bazel | 4 +- .../BUILD.redox_syscall-0.5.18.bazel | 2 +- ...0.25.bazel => BUILD.ref-cast-1.0.26.bazel} | 8 +- ...bazel => BUILD.ref-cast-impl-1.0.26.bazel} | 8 +- ...-1.12.3.bazel => BUILD.regex-1.13.1.bazel} | 10 +- ...azel => BUILD.regex-automata-0.4.18.bazel} | 8 +- ....bazel => BUILD.regex-syntax-0.8.11.bazel} | 2 +- ...0.15.18.bazel => BUILD.rowan-0.17.0.bazel} | 2 +- ...1.2.bazel => BUILD.rustc-hash-2.1.3.bazel} | 2 +- .../BUILD.rustc-literal-escaper-0.0.5.bazel | 97 - ...> BUILD.rustc-literal-escaper-0.0.7.bazel} | 2 +- ...ustc_apfloat-0.2.3+llvm-462a31f5a5ab.bazel | 4 +- .../BUILD.rustc_version-0.4.1.bazel | 100 - ...2.bazel => BUILD.rustversion-1.0.23.bazel} | 6 +- ...-0.25.2.bazel => BUILD.salsa-0.28.2.bazel} | 27 +- ...l => BUILD.salsa-macro-rules-0.28.2.bazel} | 4 +- ....bazel => BUILD.salsa-macros-0.28.2.bazel} | 11 +- .../BUILD.schemars-0.9.0.bazel | 6 +- ...1.2.1.bazel => BUILD.schemars-1.2.2.bazel} | 8 +- .../BUILD.semver-1.0.28.bazel | 4 +- ....0.228.bazel => BUILD.serde-1.0.229.bazel} | 10 +- ...8.bazel => BUILD.serde_core-1.0.229.bazel} | 6 +- ...bazel => BUILD.serde_derive-1.0.229.bazel} | 8 +- ...0.bazel => BUILD.serde_json-1.0.151.bazel} | 12 +- .../BUILD.serde_spanned-1.1.1.bazel | 2 +- ....0.bazel => BUILD.serde_with-3.22.0.bazel} | 6 +- ...l => BUILD.serde_with_macros-3.22.0.bazel} | 8 +- .../BUILD.serde_yaml-0.9.34+deprecated.bazel | 2 +- ...ex-1.3.0.bazel => BUILD.shlex-2.0.1.bazel} | 4 +- ...15.1.bazel => BUILD.smallvec-1.15.2.bazel} | 2 +- .../BUILD.spin-0.9.8.bazel | 114 - ...-2.0.117.bazel => BUILD.syn-2.0.119.bazel} | 6 +- ...eque-0.8.6.bazel => BUILD.syn-3.0.3.bazel} | 21 +- .../BUILD.synstructure-0.13.2.bazel | 6 +- ....1.16.bazel => BUILD.temp-dir-0.2.0.bazel} | 2 +- ...2.18.bazel => BUILD.thin-vec-0.2.19.bazel} | 2 +- ....18.bazel => BUILD.thiserror-2.0.20.bazel} | 8 +- ...azel => BUILD.thiserror-impl-2.0.20.bazel} | 8 +- ....bazel => BUILD.thread_local-1.1.10.bazel} | 2 +- ...e-0.3.47.bazel => BUILD.time-0.3.55.bazel} | 59 +- ....1.8.bazel => BUILD.time-core-0.1.9.bazel} | 2 +- ...7.bazel => BUILD.time-macros-0.2.32.bazel} | 4 +- ....11.0.bazel => BUILD.tinyvec-1.12.0.bazel} | 2 +- .../BUILD.toml-0.9.12+spec-1.1.0.bazel | 112 - ...azel => BUILD.toml-1.1.4+spec-1.1.0.bazel} | 10 +- ...BUILD.toml_datetime-0.7.5+spec-1.1.0.bazel | 105 - ...BUILD.toml_datetime-1.1.1+spec-1.1.0.bazel | 2 +- ... BUILD.toml_parser-1.1.3+spec-1.1.0.bazel} | 4 +- ... BUILD.toml_writer-1.1.2+spec-1.1.0.bazel} | 2 +- .../BUILD.tracing-attributes-0.1.31.bazel | 6 +- .../BUILD.tracing-log-0.2.0.bazel | 2 +- .../BUILD.tracing-subscriber-0.3.23.bazel | 8 +- .../BUILD.tree-sitter-0.26.9.bazel | 8 +- ...tree-sitter-embedded-template-0.25.0.bazel | 2 +- .../BUILD.tree-sitter-json-0.24.8.bazel | 2 +- ... => BUILD.tree-sitter-python-0.25.0.bazel} | 8 +- .../BUILD.tree-sitter-ql-0.23.1.bazel | 2 +- .../BUILD.tree-sitter-ruby-0.23.1.bazel | 2 +- ...1.15.bazel => BUILD.triomphe-0.1.16.bazel} | 4 +- ...-0.51.0.bazel => BUILD.typeid-1.0.3.bazel} | 18 +- .../BUILD.unicode-xid-0.2.6.bazel | 100 - ...bazel => BUILD.wasm-bindgen-0.2.126.bazel} | 16 +- ...=> BUILD.wasm-bindgen-macro-0.2.126.bazel} | 6 +- ....wasm-bindgen-macro-support-0.2.126.bazel} | 12 +- ...> BUILD.wasm-bindgen-shared-0.2.126.bazel} | 6 +- .../BUILD.wasm-encoder-0.244.0.bazel | 106 - .../BUILD.wasm-metadata-0.244.0.bazel | 103 - .../BUILD.wasmparser-0.244.0.bazel | 111 - .../BUILD.windows-implement-0.60.2.bazel | 6 +- .../BUILD.windows-interface-0.59.3.bazel | 6 +- .../BUILD.windows-sys-0.60.2.bazel | 1 - .../BUILD.windows-sys-0.61.2.bazel | 4 +- ...w-1.0.3.bazel => BUILD.winnow-1.0.4.bazel} | 2 +- .../BUILD.wit-bindgen-core-0.51.0.bazel | 102 - .../BUILD.wit-bindgen-rust-0.51.0.bazel | 173 -- .../BUILD.wit-bindgen-rust-macro-0.51.0.bazel | 172 -- .../BUILD.wit-component-0.244.0.bazel | 112 - .../BUILD.wit-parser-0.244.0.bazel | 117 -- ...j-1.0.21.bazel => BUILD.zmij-1.0.23.bazel} | 6 +- .../BUILD.zstd-sys-2.0.16+zstd.1.5.7.bazel | 2 +- .../tree_sitter_extractors_deps/defs.bzl | 1836 ++++++++--------- 225 files changed, 3162 insertions(+), 5322 deletions(-) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.aho-corasick-1.1.4.bazel => BUILD.aho-corasick-1.1.5.bazel} (98%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.anyhow-1.0.102.bazel => BUILD.anyhow-1.0.104.bazel} (98%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.arrayvec-0.7.6.bazel => BUILD.arrayvec-0.7.8.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.r-efi-5.3.0.bazel => BUILD.bitflags-1.3.2.bazel} (98%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.bitflags-2.11.1.bazel => BUILD.bitflags-2.13.1.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.borsh-1.6.1.bazel => BUILD.borsh-1.8.0.bazel} (97%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.bumpalo-3.20.2.bazel => BUILD.bumpalo-3.20.3.bazel} (99%) delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.byteorder-1.5.0.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.bytes-1.11.1.bazel => BUILD.bytes-1.12.1.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.camino-1.2.2.bazel => BUILD.camino-1.2.5.bazel} (97%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.cc-1.2.62.bazel => BUILD.cc-1.4.2.bazel} (84%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.cfg_aliases-0.2.1.bazel => BUILD.cfg_aliases-0.2.2.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.chacha20-0.10.0.bazel => BUILD.chacha20-0.10.1.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.chrono-0.4.44.bazel => BUILD.chrono-0.4.45.bazel} (97%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.clap-4.6.1.bazel => BUILD.clap-4.6.6.bazel} (96%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.clap_builder-4.6.0.bazel => BUILD.clap_builder-4.6.6.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.clap_derive-4.6.1.bazel => BUILD.clap_derive-4.6.4.bazel} (96%) delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.critical-section-1.2.0.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.crossbeam-channel-0.5.15.bazel => BUILD.crossbeam-channel-0.5.16.bazel} (97%) create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-deque-0.8.7.bazel delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-epoch-0.9.18.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-epoch-0.9.20.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.crossbeam-utils-0.8.21.bazel => BUILD.crossbeam-utils-0.8.22.bazel} (97%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.dashmap-6.1.0.bazel => BUILD.dashmap-6.2.1.bazel} (98%) create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.defmt-1.1.1.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.defmt-macros-1.1.1.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.wasip2-1.0.3+wasi-0.2.9.bazel => BUILD.defmt-parser-1.0.0.bazel} (96%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.either-1.16.0.bazel => BUILD.either-1.17.0.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.find-msvc-tools-0.1.9.bazel => BUILD.find-msvc-tools-0.1.10.bazel} (98%) create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.foldhash-0.2.0.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.futures-core-0.3.32.bazel => BUILD.futures-core-0.3.34.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.futures-task-0.3.32.bazel => BUILD.futures-task-0.3.34.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.futures-util-0.3.32.bazel => BUILD.futures-util-0.3.34.bazel} (96%) delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.getrandom-0.3.4.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.getrandom-0.4.2.bazel => BUILD.getrandom-0.4.3.bazel} (86%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.glob-0.3.3.bazel => BUILD.glob-0.3.4.bazel} (98%) delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hash32-0.2.1.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.hashlink-0.10.0.bazel => BUILD.hashlink-0.12.1.bazel} (97%) delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.heapless-0.7.17.bazel delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inotify-sys-0.1.5.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.wit-bindgen-0.57.1.bazel => BUILD.inotify-sys-0.1.8.bazel} (94%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.intrusive-collections-0.9.7.bazel => BUILD.intrusive-collections-0.10.3.bazel} (97%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.itertools-0.14.0.bazel => BUILD.itertools-0.15.0.bazel} (98%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.home-0.5.12.bazel => BUILD.jiff-0.2.35.bazel} (88%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.id-arena-2.3.0.bazel => BUILD.jiff-core-0.1.0.bazel} (97%) create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-static-0.2.35.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-tzdb-0.1.8.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.wasip3-0.4.0+wasi-0.3.0-rc-2026-01-06.bazel => BUILD.jiff-tzdb-platform-0.1.3.bazel} (95%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.jobserver-0.1.34.bazel => BUILD.jobserver-0.1.35.bazel} (77%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.js-sys-0.3.98.bazel => BUILD.js-sys-0.3.103.bazel} (95%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.kqueue-1.1.1.bazel => BUILD.kqueue-1.2.0.bazel} (98%) delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.leb128fmt-0.1.0.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.libc-0.2.186.bazel => BUILD.libc-0.2.189.bazel} (98%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.log-0.4.29.bazel => BUILD.log-0.4.33.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.memchr-2.8.0.bazel => BUILD.memchr-2.8.3.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.mio-1.2.0.bazel => BUILD.mio-1.2.2.bazel} (81%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.portable-atomic-1.13.1.bazel => BUILD.portable-atomic-1.14.0.bazel} (98%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.atomic-polyfill-1.0.3.bazel => BUILD.portable-atomic-util-0.2.7.bazel} (93%) delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.prettyplease-0.2.37.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.proc-macro2-1.0.106.bazel => BUILD.proc-macro2-1.0.107.bazel} (97%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.quote-1.0.45.bazel => BUILD.quote-1.0.47.bazel} (97%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra-ap-rustc_abi-0.143.0.bazel => BUILD.ra-ap-rustc_abi-0.166.0.bazel} (92%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra-ap-rustc_ast_ir-0.143.0.bazel => BUILD.ra-ap-rustc_ast_ir-0.166.0.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra-ap-rustc_hashes-0.143.0.bazel => BUILD.ra-ap-rustc_hashes-0.166.0.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra-ap-rustc_index-0.143.0.bazel => BUILD.ra-ap-rustc_index-0.166.0.bazel} (96%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra-ap-rustc_index_macros-0.143.0.bazel => BUILD.ra-ap-rustc_index_macros-0.166.0.bazel} (96%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra-ap-rustc_lexer-0.143.0.bazel => BUILD.ra-ap-rustc_lexer-0.166.0.bazel} (96%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra-ap-rustc_next_trait_solver-0.143.0.bazel => BUILD.ra-ap-rustc_next_trait_solver-0.166.0.bazel} (91%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra-ap-rustc_parse_format-0.143.0.bazel => BUILD.ra-ap-rustc_parse_format-0.166.0.bazel} (95%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra-ap-rustc_pattern_analysis-0.143.0.bazel => BUILD.ra-ap-rustc_pattern_analysis-0.166.0.bazel} (94%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra-ap-rustc_type_ir-0.143.0.bazel => BUILD.ra-ap-rustc_type_ir-0.166.0.bazel} (84%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra-ap-rustc_type_ir_macros-0.143.0.bazel => BUILD.ra-ap-rustc_type_ir_macros-0.166.0.bazel} (96%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_base_db-0.0.328.bazel => BUILD.ra_ap_base_db-0.0.347.bazel} (80%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_cfg-0.0.328.bazel => BUILD.ra_ap_cfg-0.0.347.bazel} (90%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_edition-0.0.328.bazel => BUILD.ra_ap_edition-0.0.347.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_hir-0.0.328.bazel => BUILD.ra_ap_hir-0.0.347.bazel} (70%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_hir_def-0.0.328.bazel => BUILD.ra_ap_hir_def-0.0.347.bazel} (70%) delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_expand-0.0.328.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_expand-0.0.347.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_hir_ty-0.0.328.bazel => BUILD.ra_ap_hir_ty-0.0.347.bazel} (69%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_ide_db-0.0.328.bazel => BUILD.ra_ap_ide_db-0.0.347.bazel} (68%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_intern-0.0.328.bazel => BUILD.ra_ap_intern-0.0.347.bazel} (94%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_load-cargo-0.0.328.bazel => BUILD.ra_ap_load-cargo-0.0.347.bazel} (77%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_macros-0.0.328.bazel => BUILD.ra_ap_macros-0.0.347.bazel} (96%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_mbe-0.0.328.bazel => BUILD.ra_ap_mbe-0.0.347.bazel} (80%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_parser-0.0.328.bazel => BUILD.ra_ap_parser-0.0.347.bazel} (93%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_paths-0.0.328.bazel => BUILD.ra_ap_paths-0.0.347.bazel} (98%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_proc_macro_api-0.0.328.bazel => BUILD.ra_ap_proc_macro_api-0.0.347.bazel} (84%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_profile-0.0.328.bazel => BUILD.ra_ap_profile-0.0.347.bazel} (87%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_project_model-0.0.328.bazel => BUILD.ra_ap_project_model-0.0.347.bazel} (76%) delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_query-group-macro-0.0.328.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_span-0.0.328.bazel => BUILD.ra_ap_span-0.0.347.bazel} (89%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_stdx-0.0.328.bazel => BUILD.ra_ap_stdx-0.0.347.bazel} (76%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_syntax-0.0.328.bazel => BUILD.ra_ap_syntax-0.0.347.bazel} (86%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_syntax-bridge-0.0.328.bazel => BUILD.ra_ap_syntax-bridge-0.0.347.bazel} (84%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_test_fixture-0.0.328.bazel => BUILD.ra_ap_test_fixture-0.0.347.bazel} (78%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_test_utils-0.0.328.bazel => BUILD.ra_ap_test_utils-0.0.347.bazel} (90%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_toolchain-0.0.328.bazel => BUILD.ra_ap_toolchain-0.0.347.bazel} (97%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_tt-0.0.328.bazel => BUILD.ra_ap_tt-0.0.347.bazel} (87%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_vfs-0.0.328.bazel => BUILD.ra_ap_vfs-0.0.347.bazel} (91%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ra_ap_vfs-notify-0.0.328.bazel => BUILD.ra_ap_vfs-notify-0.0.347.bazel} (89%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.rand-0.10.1.bazel => BUILD.rand-0.10.2.bazel} (97%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ref-cast-1.0.25.bazel => BUILD.ref-cast-1.0.26.bazel} (96%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.ref-cast-impl-1.0.25.bazel => BUILD.ref-cast-impl-1.0.26.bazel} (96%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.regex-1.12.3.bazel => BUILD.regex-1.13.1.bazel} (94%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.regex-automata-0.4.14.bazel => BUILD.regex-automata-0.4.18.bazel} (96%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.regex-syntax-0.8.10.bazel => BUILD.regex-syntax-0.8.11.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.rowan-0.15.18.bazel => BUILD.rowan-0.17.0.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.rustc-hash-2.1.2.bazel => BUILD.rustc-hash-2.1.3.bazel} (99%) delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-literal-escaper-0.0.5.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.rustc-literal-escaper-0.0.4.bazel => BUILD.rustc-literal-escaper-0.0.7.bazel} (99%) delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc_version-0.4.1.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.rustversion-1.0.22.bazel => BUILD.rustversion-1.0.23.bazel} (97%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.salsa-0.25.2.bazel => BUILD.salsa-0.28.2.bazel} (86%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.salsa-macro-rules-0.25.2.bazel => BUILD.salsa-macro-rules-0.28.2.bazel} (98%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.salsa-macros-0.25.2.bazel => BUILD.salsa-macros-0.28.2.bazel} (94%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.schemars-1.2.1.bazel => BUILD.schemars-1.2.2.bazel} (95%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.serde-1.0.228.bazel => BUILD.serde-1.0.229.bazel} (96%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.serde_core-1.0.228.bazel => BUILD.serde_core-1.0.229.bazel} (97%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.serde_derive-1.0.228.bazel => BUILD.serde_derive-1.0.229.bazel} (96%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.serde_json-1.0.150.bazel => BUILD.serde_json-1.0.151.bazel} (98%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.serde_with-3.20.0.bazel => BUILD.serde_with-3.22.0.bazel} (96%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.serde_with_macros-3.20.0.bazel => BUILD.serde_with_macros-3.22.0.bazel} (96%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.shlex-1.3.0.bazel => BUILD.shlex-2.0.1.bazel} (98%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.smallvec-1.15.1.bazel => BUILD.smallvec-1.15.2.bazel} (99%) delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.spin-0.9.8.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.syn-2.0.117.bazel => BUILD.syn-2.0.119.bazel} (97%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.crossbeam-deque-0.8.6.bazel => BUILD.syn-3.0.3.bazel} (90%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.temp-dir-0.1.16.bazel => BUILD.temp-dir-0.2.0.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.thin-vec-0.2.18.bazel => BUILD.thin-vec-0.2.19.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.thiserror-2.0.18.bazel => BUILD.thiserror-2.0.20.bazel} (96%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.thiserror-impl-2.0.18.bazel => BUILD.thiserror-impl-2.0.20.bazel} (96%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.thread_local-1.1.9.bazel => BUILD.thread_local-1.1.10.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.time-0.3.47.bazel => BUILD.time-0.3.55.bazel} (83%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.time-core-0.1.8.bazel => BUILD.time-core-0.1.9.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.time-macros-0.2.27.bazel => BUILD.time-macros-0.2.32.bazel} (98%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.tinyvec-1.11.0.bazel => BUILD.tinyvec-1.12.0.bazel} (99%) delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml-0.9.12+spec-1.1.0.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.toml-1.1.2+spec-1.1.0.bazel => BUILD.toml-1.1.4+spec-1.1.0.bazel} (94%) delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_datetime-0.7.5+spec-1.1.0.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.toml_parser-1.1.2+spec-1.1.0.bazel => BUILD.toml_parser-1.1.3+spec-1.1.0.bazel} (98%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.toml_writer-1.1.1+spec-1.1.0.bazel => BUILD.toml_writer-1.1.2+spec-1.1.0.bazel} (99%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.tree-sitter-python-0.23.6.bazel => BUILD.tree-sitter-python-0.25.0.bazel} (97%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.triomphe-0.1.15.bazel => BUILD.triomphe-0.1.16.bazel} (98%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.wit-bindgen-0.51.0.bazel => BUILD.typeid-1.0.3.bazel} (94%) delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.unicode-xid-0.2.6.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.wasm-bindgen-0.2.121.bazel => BUILD.wasm-bindgen-0.2.126.bazel} (93%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.wasm-bindgen-macro-0.2.121.bazel => BUILD.wasm-bindgen-macro-0.2.126.bazel} (96%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.wasm-bindgen-macro-support-0.2.121.bazel => BUILD.wasm-bindgen-macro-support-0.2.126.bazel} (93%) rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.wasm-bindgen-shared-0.2.121.bazel => BUILD.wasm-bindgen-shared-0.2.126.bazel} (97%) delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-encoder-0.244.0.bazel delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-metadata-0.244.0.bazel delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasmparser-0.244.0.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.winnow-1.0.3.bazel => BUILD.winnow-1.0.4.bazel} (99%) delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-core-0.51.0.bazel delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-rust-0.51.0.bazel delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-rust-macro-0.51.0.bazel delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-component-0.244.0.bazel delete mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-parser-0.244.0.bazel rename misc/bazel/3rdparty/tree_sitter_extractors_deps/{BUILD.zmij-1.0.21.bazel => BUILD.zmij-1.0.23.bazel} (98%) diff --git a/MODULE.bazel b/MODULE.bazel index dc528a3a1843..fa9f58ada170 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -107,61 +107,61 @@ use_repo( tree_sitter_extractors_deps = use_extension("//misc/bazel/3rdparty:tree_sitter_extractors_extension.bzl", "r") use_repo( tree_sitter_extractors_deps, - "vendor_ts__anyhow-1.0.102", + "vendor_ts__anyhow-1.0.104", "vendor_ts__argfile-1.0.0", "vendor_ts__chalk-ir-0.104.0", - "vendor_ts__chrono-0.4.44", - "vendor_ts__clap-4.6.1", + "vendor_ts__chrono-0.4.45", + "vendor_ts__clap-4.6.6", "vendor_ts__dunce-1.0.5", - "vendor_ts__either-1.16.0", + "vendor_ts__either-1.17.0", "vendor_ts__encoding-0.2.33", "vendor_ts__figment-0.10.19", "vendor_ts__flate2-1.1.9", - "vendor_ts__glob-0.3.3", + "vendor_ts__glob-0.3.4", "vendor_ts__globset-0.4.18", - "vendor_ts__itertools-0.14.0", + "vendor_ts__itertools-0.15.0", "vendor_ts__lazy_static-1.5.0", "vendor_ts__mustache-0.9.0", "vendor_ts__num-traits-0.2.19", "vendor_ts__num_cpus-1.17.0", - "vendor_ts__proc-macro2-1.0.106", - "vendor_ts__quote-1.0.45", - "vendor_ts__ra_ap_base_db-0.0.328", - "vendor_ts__ra_ap_cfg-0.0.328", - "vendor_ts__ra_ap_hir-0.0.328", - "vendor_ts__ra_ap_hir_def-0.0.328", - "vendor_ts__ra_ap_hir_expand-0.0.328", - "vendor_ts__ra_ap_hir_ty-0.0.328", - "vendor_ts__ra_ap_ide_db-0.0.328", - "vendor_ts__ra_ap_intern-0.0.328", - "vendor_ts__ra_ap_load-cargo-0.0.328", - "vendor_ts__ra_ap_parser-0.0.328", - "vendor_ts__ra_ap_paths-0.0.328", - "vendor_ts__ra_ap_project_model-0.0.328", - "vendor_ts__ra_ap_span-0.0.328", - "vendor_ts__ra_ap_stdx-0.0.328", - "vendor_ts__ra_ap_syntax-0.0.328", - "vendor_ts__ra_ap_syntax-bridge-0.0.328", - "vendor_ts__ra_ap_vfs-0.0.328", - "vendor_ts__rand-0.10.1", + "vendor_ts__proc-macro2-1.0.107", + "vendor_ts__quote-1.0.47", + "vendor_ts__ra_ap_base_db-0.0.347", + "vendor_ts__ra_ap_cfg-0.0.347", + "vendor_ts__ra_ap_hir-0.0.347", + "vendor_ts__ra_ap_hir_def-0.0.347", + "vendor_ts__ra_ap_hir_expand-0.0.347", + "vendor_ts__ra_ap_hir_ty-0.0.347", + "vendor_ts__ra_ap_ide_db-0.0.347", + "vendor_ts__ra_ap_intern-0.0.347", + "vendor_ts__ra_ap_load-cargo-0.0.347", + "vendor_ts__ra_ap_parser-0.0.347", + "vendor_ts__ra_ap_paths-0.0.347", + "vendor_ts__ra_ap_project_model-0.0.347", + "vendor_ts__ra_ap_span-0.0.347", + "vendor_ts__ra_ap_stdx-0.0.347", + "vendor_ts__ra_ap_syntax-0.0.347", + "vendor_ts__ra_ap_syntax-bridge-0.0.347", + "vendor_ts__ra_ap_vfs-0.0.347", + "vendor_ts__rand-0.10.2", "vendor_ts__rayon-1.12.0", - "vendor_ts__regex-1.12.3", - "vendor_ts__serde-1.0.228", - "vendor_ts__serde_json-1.0.150", - "vendor_ts__serde_with-3.20.0", + "vendor_ts__regex-1.13.1", + "vendor_ts__serde-1.0.229", + "vendor_ts__serde_json-1.0.151", + "vendor_ts__serde_with-3.22.0", "vendor_ts__serde_yaml-0.9.34-deprecated", - "vendor_ts__syn-2.0.117", - "vendor_ts__toml-1.1.2-spec-1.1.0", + "vendor_ts__syn-3.0.3", + "vendor_ts__toml-1.1.4-spec-1.1.0", "vendor_ts__tracing-0.1.44", "vendor_ts__tracing-flame-0.2.0", "vendor_ts__tracing-subscriber-0.3.23", "vendor_ts__tree-sitter-0.26.9", "vendor_ts__tree-sitter-embedded-template-0.25.0", "vendor_ts__tree-sitter-json-0.24.8", - "vendor_ts__tree-sitter-python-0.23.6", + "vendor_ts__tree-sitter-python-0.25.0", "vendor_ts__tree-sitter-ql-0.23.1", "vendor_ts__tree-sitter-ruby-0.23.1", - "vendor_ts__triomphe-0.1.15", + "vendor_ts__triomphe-0.1.16", "vendor_ts__ungrammar-1.16.1", "vendor_ts__zstd-0.13.3", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.aho-corasick-1.1.4.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.aho-corasick-1.1.5.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.aho-corasick-1.1.4.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.aho-corasick-1.1.5.bazel index 5f173cfeddb3..765dd6dabfda 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.aho-corasick-1.1.4.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.aho-corasick-1.1.5.bazel @@ -98,8 +98,8 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.1.4", + version = "1.1.5", deps = [ - "@vendor_ts__memchr-2.8.0//:memchr", + "@vendor_ts__memchr-2.8.3//:memchr", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.android_system_properties-0.1.5.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.android_system_properties-0.1.5.bazel index 356995f7f2a6..240b40a2663c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.android_system_properties-0.1.5.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.android_system_properties-0.1.5.bazel @@ -95,6 +95,6 @@ rust_library( }), version = "0.1.5", deps = [ - "@vendor_ts__libc-0.2.186//:libc", + "@vendor_ts__libc-0.2.189//:libc", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anyhow-1.0.102.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anyhow-1.0.104.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anyhow-1.0.102.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anyhow-1.0.104.bazel index 99de10c1ab76..e34f003bf23a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anyhow-1.0.102.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anyhow-1.0.104.bazel @@ -101,9 +101,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.102", + version = "1.0.104", deps = [ - "@vendor_ts__anyhow-1.0.102//:build_script_build", + "@vendor_ts__anyhow-1.0.104//:build_script_build", ], ) @@ -159,7 +159,7 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "1.0.102", + version = "1.0.104", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.arrayvec-0.7.6.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.arrayvec-0.7.8.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.arrayvec-0.7.6.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.arrayvec-0.7.8.bazel index 4f70598af859..29f2f212b964 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.arrayvec-0.7.6.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.arrayvec-0.7.8.bazel @@ -97,5 +97,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.7.6", + version = "0.7.8", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bazel index 7ea15cc09cd7..c644a785e7c3 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bazel @@ -32,14 +32,14 @@ filegroup( # Workspace Member Dependencies alias( - name = "anyhow-1.0.102", - actual = "@vendor_ts__anyhow-1.0.102//:anyhow", + name = "anyhow-1.0.104", + actual = "@vendor_ts__anyhow-1.0.104//:anyhow", tags = ["manual"], ) alias( name = "anyhow", - actual = "@vendor_ts__anyhow-1.0.102//:anyhow", + actual = "@vendor_ts__anyhow-1.0.104//:anyhow", tags = ["manual"], ) @@ -68,26 +68,26 @@ alias( ) alias( - name = "chrono-0.4.44", - actual = "@vendor_ts__chrono-0.4.44//:chrono", + name = "chrono-0.4.45", + actual = "@vendor_ts__chrono-0.4.45//:chrono", tags = ["manual"], ) alias( name = "chrono", - actual = "@vendor_ts__chrono-0.4.44//:chrono", + actual = "@vendor_ts__chrono-0.4.45//:chrono", tags = ["manual"], ) alias( - name = "clap-4.6.1", - actual = "@vendor_ts__clap-4.6.1//:clap", + name = "clap-4.6.6", + actual = "@vendor_ts__clap-4.6.6//:clap", tags = ["manual"], ) alias( name = "clap", - actual = "@vendor_ts__clap-4.6.1//:clap", + actual = "@vendor_ts__clap-4.6.6//:clap", tags = ["manual"], ) @@ -104,14 +104,14 @@ alias( ) alias( - name = "either-1.16.0", - actual = "@vendor_ts__either-1.16.0//:either", + name = "either-1.17.0", + actual = "@vendor_ts__either-1.17.0//:either", tags = ["manual"], ) alias( name = "either", - actual = "@vendor_ts__either-1.16.0//:either", + actual = "@vendor_ts__either-1.17.0//:either", tags = ["manual"], ) @@ -152,14 +152,14 @@ alias( ) alias( - name = "glob-0.3.3", - actual = "@vendor_ts__glob-0.3.3//:glob", + name = "glob-0.3.4", + actual = "@vendor_ts__glob-0.3.4//:glob", tags = ["manual"], ) alias( name = "glob", - actual = "@vendor_ts__glob-0.3.3//:glob", + actual = "@vendor_ts__glob-0.3.4//:glob", tags = ["manual"], ) @@ -176,14 +176,14 @@ alias( ) alias( - name = "itertools-0.14.0", - actual = "@vendor_ts__itertools-0.14.0//:itertools", + name = "itertools-0.15.0", + actual = "@vendor_ts__itertools-0.15.0//:itertools", tags = ["manual"], ) alias( name = "itertools", - actual = "@vendor_ts__itertools-0.14.0//:itertools", + actual = "@vendor_ts__itertools-0.15.0//:itertools", tags = ["manual"], ) @@ -236,248 +236,248 @@ alias( ) alias( - name = "proc-macro2-1.0.106", - actual = "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", + name = "proc-macro2-1.0.107", + actual = "@vendor_ts__proc-macro2-1.0.107//:proc_macro2", tags = ["manual"], ) alias( name = "proc-macro2", - actual = "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", + actual = "@vendor_ts__proc-macro2-1.0.107//:proc_macro2", tags = ["manual"], ) alias( - name = "quote-1.0.45", - actual = "@vendor_ts__quote-1.0.45//:quote", + name = "quote-1.0.47", + actual = "@vendor_ts__quote-1.0.47//:quote", tags = ["manual"], ) alias( name = "quote", - actual = "@vendor_ts__quote-1.0.45//:quote", + actual = "@vendor_ts__quote-1.0.47//:quote", tags = ["manual"], ) alias( - name = "ra_ap_base_db-0.0.328", - actual = "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db", + name = "ra_ap_base_db-0.0.347", + actual = "@vendor_ts__ra_ap_base_db-0.0.347//:ra_ap_base_db", tags = ["manual"], ) alias( name = "ra_ap_base_db", - actual = "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db", + actual = "@vendor_ts__ra_ap_base_db-0.0.347//:ra_ap_base_db", tags = ["manual"], ) alias( - name = "ra_ap_cfg-0.0.328", - actual = "@vendor_ts__ra_ap_cfg-0.0.328//:ra_ap_cfg", + name = "ra_ap_cfg-0.0.347", + actual = "@vendor_ts__ra_ap_cfg-0.0.347//:ra_ap_cfg", tags = ["manual"], ) alias( name = "ra_ap_cfg", - actual = "@vendor_ts__ra_ap_cfg-0.0.328//:ra_ap_cfg", + actual = "@vendor_ts__ra_ap_cfg-0.0.347//:ra_ap_cfg", tags = ["manual"], ) alias( - name = "ra_ap_hir-0.0.328", - actual = "@vendor_ts__ra_ap_hir-0.0.328//:ra_ap_hir", + name = "ra_ap_hir-0.0.347", + actual = "@vendor_ts__ra_ap_hir-0.0.347//:ra_ap_hir", tags = ["manual"], ) alias( name = "ra_ap_hir", - actual = "@vendor_ts__ra_ap_hir-0.0.328//:ra_ap_hir", + actual = "@vendor_ts__ra_ap_hir-0.0.347//:ra_ap_hir", tags = ["manual"], ) alias( - name = "ra_ap_hir_def-0.0.328", - actual = "@vendor_ts__ra_ap_hir_def-0.0.328//:ra_ap_hir_def", + name = "ra_ap_hir_def-0.0.347", + actual = "@vendor_ts__ra_ap_hir_def-0.0.347//:ra_ap_hir_def", tags = ["manual"], ) alias( name = "ra_ap_hir_def", - actual = "@vendor_ts__ra_ap_hir_def-0.0.328//:ra_ap_hir_def", + actual = "@vendor_ts__ra_ap_hir_def-0.0.347//:ra_ap_hir_def", tags = ["manual"], ) alias( - name = "ra_ap_hir_expand-0.0.328", - actual = "@vendor_ts__ra_ap_hir_expand-0.0.328//:ra_ap_hir_expand", + name = "ra_ap_hir_expand-0.0.347", + actual = "@vendor_ts__ra_ap_hir_expand-0.0.347//:ra_ap_hir_expand", tags = ["manual"], ) alias( name = "ra_ap_hir_expand", - actual = "@vendor_ts__ra_ap_hir_expand-0.0.328//:ra_ap_hir_expand", + actual = "@vendor_ts__ra_ap_hir_expand-0.0.347//:ra_ap_hir_expand", tags = ["manual"], ) alias( - name = "ra_ap_hir_ty-0.0.328", - actual = "@vendor_ts__ra_ap_hir_ty-0.0.328//:ra_ap_hir_ty", + name = "ra_ap_hir_ty-0.0.347", + actual = "@vendor_ts__ra_ap_hir_ty-0.0.347//:ra_ap_hir_ty", tags = ["manual"], ) alias( name = "ra_ap_hir_ty", - actual = "@vendor_ts__ra_ap_hir_ty-0.0.328//:ra_ap_hir_ty", + actual = "@vendor_ts__ra_ap_hir_ty-0.0.347//:ra_ap_hir_ty", tags = ["manual"], ) alias( - name = "ra_ap_ide_db-0.0.328", - actual = "@vendor_ts__ra_ap_ide_db-0.0.328//:ra_ap_ide_db", + name = "ra_ap_ide_db-0.0.347", + actual = "@vendor_ts__ra_ap_ide_db-0.0.347//:ra_ap_ide_db", tags = ["manual"], ) alias( name = "ra_ap_ide_db", - actual = "@vendor_ts__ra_ap_ide_db-0.0.328//:ra_ap_ide_db", + actual = "@vendor_ts__ra_ap_ide_db-0.0.347//:ra_ap_ide_db", tags = ["manual"], ) alias( - name = "ra_ap_intern-0.0.328", - actual = "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern", + name = "ra_ap_intern-0.0.347", + actual = "@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern", tags = ["manual"], ) alias( name = "ra_ap_intern", - actual = "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern", + actual = "@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern", tags = ["manual"], ) alias( - name = "ra_ap_load-cargo-0.0.328", - actual = "@vendor_ts__ra_ap_load-cargo-0.0.328//:ra_ap_load_cargo", + name = "ra_ap_load-cargo-0.0.347", + actual = "@vendor_ts__ra_ap_load-cargo-0.0.347//:ra_ap_load_cargo", tags = ["manual"], ) alias( name = "ra_ap_load-cargo", - actual = "@vendor_ts__ra_ap_load-cargo-0.0.328//:ra_ap_load_cargo", + actual = "@vendor_ts__ra_ap_load-cargo-0.0.347//:ra_ap_load_cargo", tags = ["manual"], ) alias( - name = "ra_ap_parser-0.0.328", - actual = "@vendor_ts__ra_ap_parser-0.0.328//:ra_ap_parser", + name = "ra_ap_parser-0.0.347", + actual = "@vendor_ts__ra_ap_parser-0.0.347//:ra_ap_parser", tags = ["manual"], ) alias( name = "ra_ap_parser", - actual = "@vendor_ts__ra_ap_parser-0.0.328//:ra_ap_parser", + actual = "@vendor_ts__ra_ap_parser-0.0.347//:ra_ap_parser", tags = ["manual"], ) alias( - name = "ra_ap_paths-0.0.328", - actual = "@vendor_ts__ra_ap_paths-0.0.328//:ra_ap_paths", + name = "ra_ap_paths-0.0.347", + actual = "@vendor_ts__ra_ap_paths-0.0.347//:ra_ap_paths", tags = ["manual"], ) alias( name = "ra_ap_paths", - actual = "@vendor_ts__ra_ap_paths-0.0.328//:ra_ap_paths", + actual = "@vendor_ts__ra_ap_paths-0.0.347//:ra_ap_paths", tags = ["manual"], ) alias( - name = "ra_ap_project_model-0.0.328", - actual = "@vendor_ts__ra_ap_project_model-0.0.328//:ra_ap_project_model", + name = "ra_ap_project_model-0.0.347", + actual = "@vendor_ts__ra_ap_project_model-0.0.347//:ra_ap_project_model", tags = ["manual"], ) alias( name = "ra_ap_project_model", - actual = "@vendor_ts__ra_ap_project_model-0.0.328//:ra_ap_project_model", + actual = "@vendor_ts__ra_ap_project_model-0.0.347//:ra_ap_project_model", tags = ["manual"], ) alias( - name = "ra_ap_span-0.0.328", - actual = "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span", + name = "ra_ap_span-0.0.347", + actual = "@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span", tags = ["manual"], ) alias( name = "ra_ap_span", - actual = "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span", + actual = "@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span", tags = ["manual"], ) alias( - name = "ra_ap_stdx-0.0.328", - actual = "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", + name = "ra_ap_stdx-0.0.347", + actual = "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx", tags = ["manual"], ) alias( - name = "stdx-0.0.328", - actual = "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", + name = "stdx-0.0.347", + actual = "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx", tags = ["manual"], ) alias( name = "stdx", - actual = "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", + actual = "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx", tags = ["manual"], ) alias( - name = "ra_ap_syntax-0.0.328", - actual = "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax", + name = "ra_ap_syntax-0.0.347", + actual = "@vendor_ts__ra_ap_syntax-0.0.347//:ra_ap_syntax", tags = ["manual"], ) alias( name = "ra_ap_syntax", - actual = "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax", + actual = "@vendor_ts__ra_ap_syntax-0.0.347//:ra_ap_syntax", tags = ["manual"], ) alias( - name = "ra_ap_syntax-bridge-0.0.328", - actual = "@vendor_ts__ra_ap_syntax-bridge-0.0.328//:ra_ap_syntax_bridge", + name = "ra_ap_syntax-bridge-0.0.347", + actual = "@vendor_ts__ra_ap_syntax-bridge-0.0.347//:ra_ap_syntax_bridge", tags = ["manual"], ) alias( name = "ra_ap_syntax-bridge", - actual = "@vendor_ts__ra_ap_syntax-bridge-0.0.328//:ra_ap_syntax_bridge", + actual = "@vendor_ts__ra_ap_syntax-bridge-0.0.347//:ra_ap_syntax_bridge", tags = ["manual"], ) alias( - name = "ra_ap_vfs-0.0.328", - actual = "@vendor_ts__ra_ap_vfs-0.0.328//:ra_ap_vfs", + name = "ra_ap_vfs-0.0.347", + actual = "@vendor_ts__ra_ap_vfs-0.0.347//:ra_ap_vfs", tags = ["manual"], ) alias( name = "ra_ap_vfs", - actual = "@vendor_ts__ra_ap_vfs-0.0.328//:ra_ap_vfs", + actual = "@vendor_ts__ra_ap_vfs-0.0.347//:ra_ap_vfs", tags = ["manual"], ) alias( - name = "rand-0.10.1", - actual = "@vendor_ts__rand-0.10.1//:rand", + name = "rand-0.10.2", + actual = "@vendor_ts__rand-0.10.2//:rand", tags = ["manual"], ) alias( name = "rand", - actual = "@vendor_ts__rand-0.10.1//:rand", + actual = "@vendor_ts__rand-0.10.2//:rand", tags = ["manual"], ) @@ -494,50 +494,50 @@ alias( ) alias( - name = "regex-1.12.3", - actual = "@vendor_ts__regex-1.12.3//:regex", + name = "regex-1.13.1", + actual = "@vendor_ts__regex-1.13.1//:regex", tags = ["manual"], ) alias( name = "regex", - actual = "@vendor_ts__regex-1.12.3//:regex", + actual = "@vendor_ts__regex-1.13.1//:regex", tags = ["manual"], ) alias( - name = "serde-1.0.228", - actual = "@vendor_ts__serde-1.0.228//:serde", + name = "serde-1.0.229", + actual = "@vendor_ts__serde-1.0.229//:serde", tags = ["manual"], ) alias( name = "serde", - actual = "@vendor_ts__serde-1.0.228//:serde", + actual = "@vendor_ts__serde-1.0.229//:serde", tags = ["manual"], ) alias( - name = "serde_json-1.0.150", - actual = "@vendor_ts__serde_json-1.0.150//:serde_json", + name = "serde_json-1.0.151", + actual = "@vendor_ts__serde_json-1.0.151//:serde_json", tags = ["manual"], ) alias( name = "serde_json", - actual = "@vendor_ts__serde_json-1.0.150//:serde_json", + actual = "@vendor_ts__serde_json-1.0.151//:serde_json", tags = ["manual"], ) alias( - name = "serde_with-3.20.0", - actual = "@vendor_ts__serde_with-3.20.0//:serde_with", + name = "serde_with-3.22.0", + actual = "@vendor_ts__serde_with-3.22.0//:serde_with", tags = ["manual"], ) alias( name = "serde_with", - actual = "@vendor_ts__serde_with-3.20.0//:serde_with", + actual = "@vendor_ts__serde_with-3.22.0//:serde_with", tags = ["manual"], ) @@ -566,26 +566,26 @@ alias( ) alias( - name = "syn-2.0.117", - actual = "@vendor_ts__syn-2.0.117//:syn", + name = "syn-3.0.3", + actual = "@vendor_ts__syn-3.0.3//:syn", tags = ["manual"], ) alias( name = "syn", - actual = "@vendor_ts__syn-2.0.117//:syn", + actual = "@vendor_ts__syn-3.0.3//:syn", tags = ["manual"], ) alias( - name = "toml-1.1.2+spec-1.1.0", - actual = "@vendor_ts__toml-1.1.2-spec-1.1.0//:toml", + name = "toml-1.1.4+spec-1.1.0", + actual = "@vendor_ts__toml-1.1.4-spec-1.1.0//:toml", tags = ["manual"], ) alias( name = "toml", - actual = "@vendor_ts__toml-1.1.2-spec-1.1.0//:toml", + actual = "@vendor_ts__toml-1.1.4-spec-1.1.0//:toml", tags = ["manual"], ) @@ -662,14 +662,14 @@ alias( ) alias( - name = "tree-sitter-python-0.23.6", - actual = "@vendor_ts__tree-sitter-python-0.23.6//:tree_sitter_python", + name = "tree-sitter-python-0.25.0", + actual = "@vendor_ts__tree-sitter-python-0.25.0//:tree_sitter_python", tags = ["manual"], ) alias( name = "tree-sitter-python", - actual = "@vendor_ts__tree-sitter-python-0.23.6//:tree_sitter_python", + actual = "@vendor_ts__tree-sitter-python-0.25.0//:tree_sitter_python", tags = ["manual"], ) @@ -698,14 +698,14 @@ alias( ) alias( - name = "triomphe-0.1.15", - actual = "@vendor_ts__triomphe-0.1.15//:triomphe", + name = "triomphe-0.1.16", + actual = "@vendor_ts__triomphe-0.1.16//:triomphe", tags = ["manual"], ) alias( name = "triomphe", - actual = "@vendor_ts__triomphe-0.1.15//:triomphe", + actual = "@vendor_ts__triomphe-0.1.16//:triomphe", tags = ["manual"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.r-efi-5.3.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bitflags-1.3.2.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.r-efi-5.3.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bitflags-1.3.2.bazel index d71877ee91cf..0d981e7ac580 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.r-efi-5.3.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bitflags-1.3.2.bazel @@ -17,7 +17,7 @@ cargo_toml_env_vars( ) rust_library( - name = "r_efi", + name = "bitflags", srcs = glob( include = ["**/*.rs"], allow_empty = True, @@ -44,7 +44,7 @@ rust_library( ], tags = [ "cargo-bazel", - "crate-name=r-efi", + "crate-name=bitflags", "manual", "noclippy", "norustfmt", @@ -93,5 +93,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "5.3.0", + version = "1.3.2", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bitflags-2.11.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bitflags-2.13.1.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bitflags-2.11.1.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bitflags-2.13.1.bazel index 02bd7814aa45..6bb0907106fd 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bitflags-2.11.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bitflags-2.13.1.bazel @@ -93,5 +93,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "2.11.1", + version = "2.13.1", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.borsh-1.6.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.borsh-1.8.0.bazel similarity index 97% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.borsh-1.6.1.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.borsh-1.8.0.bazel index 76af71ed47f7..4656f98793ad 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.borsh-1.6.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.borsh-1.8.0.bazel @@ -97,9 +97,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.6.1", + version = "1.8.0", deps = [ - "@vendor_ts__borsh-1.6.1//:build_script_build", + "@vendor_ts__borsh-1.8.0//:build_script_build", ], ) @@ -151,10 +151,10 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "1.6.1", + version = "1.8.0", visibility = ["//visibility:private"], deps = [ - "@vendor_ts__cfg_aliases-0.2.1//:cfg_aliases", + "@vendor_ts__cfg_aliases-0.2.2//:cfg_aliases", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bstr-1.12.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bstr-1.12.1.bazel index 1d1c95f8e747..022b9222e213 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bstr-1.12.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bstr-1.12.1.bazel @@ -99,6 +99,6 @@ rust_library( }), version = "1.12.1", deps = [ - "@vendor_ts__memchr-2.8.0//:memchr", + "@vendor_ts__memchr-2.8.3//:memchr", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bumpalo-3.20.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bumpalo-3.20.3.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bumpalo-3.20.2.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bumpalo-3.20.3.bazel index 53fc8c4cf8ea..d91c7ef09fb8 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bumpalo-3.20.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bumpalo-3.20.3.bazel @@ -96,5 +96,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "3.20.2", + version = "3.20.3", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.byteorder-1.5.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.byteorder-1.5.0.bazel deleted file mode 100644 index a4c26e134094..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.byteorder-1.5.0.bazel +++ /dev/null @@ -1,97 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "byteorder", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_root = "src/lib.rs", - edition = "2021", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=byteorder", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "1.5.0", -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bytes-1.11.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bytes-1.12.1.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bytes-1.11.1.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bytes-1.12.1.bazel index d16c296c5adc..2e756a5adcaf 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bytes-1.11.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bytes-1.12.1.bazel @@ -93,5 +93,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.11.1", + version = "1.12.1", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.camino-1.2.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.camino-1.2.5.bazel similarity index 97% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.camino-1.2.2.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.camino-1.2.5.bazel index 92a6e66df847..abe7c5a715f4 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.camino-1.2.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.camino-1.2.5.bazel @@ -100,10 +100,10 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.2.2", + version = "1.2.5", deps = [ - "@vendor_ts__camino-1.2.2//:build_script_build", - "@vendor_ts__serde_core-1.0.228//:serde_core", + "@vendor_ts__camino-1.2.5//:build_script_build", + "@vendor_ts__serde_core-1.0.229//:serde_core", ], ) @@ -158,7 +158,7 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "1.2.2", + version = "1.2.5", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo-platform-0.3.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo-platform-0.3.3.bazel index 163804fcc1a8..6af5bed934ff 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo-platform-0.3.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo-platform-0.3.3.bazel @@ -95,6 +95,6 @@ rust_library( }), version = "0.3.3", deps = [ - "@vendor_ts__serde_core-1.0.228//:serde_core", + "@vendor_ts__serde_core-1.0.229//:serde_core", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo_metadata-0.23.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo_metadata-0.23.1.bazel index b4a2d6f9aae2..a334db245fc3 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo_metadata-0.23.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo_metadata-0.23.1.bazel @@ -98,11 +98,11 @@ rust_library( }), version = "0.23.1", deps = [ - "@vendor_ts__camino-1.2.2//:camino", + "@vendor_ts__camino-1.2.5//:camino", "@vendor_ts__cargo-platform-0.3.3//:cargo_platform", "@vendor_ts__semver-1.0.28//:semver", - "@vendor_ts__serde-1.0.228//:serde", - "@vendor_ts__serde_json-1.0.150//:serde_json", - "@vendor_ts__thiserror-2.0.18//:thiserror", + "@vendor_ts__serde-1.0.229//:serde", + "@vendor_ts__serde_json-1.0.151//:serde_json", + "@vendor_ts__thiserror-2.0.20//:thiserror", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cc-1.2.62.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cc-1.4.2.bazel similarity index 84% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cc-1.2.62.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cc-1.4.2.bazel index 0f2c0be546ad..d5e676a61243 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cc-1.2.62.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cc-1.4.2.bazel @@ -38,7 +38,7 @@ rust_library( "parallel", ], crate_root = "src/lib.rs", - edition = "2018", + edition = "2021", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -96,47 +96,47 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.2.62", + version = "1.4.2", deps = [ - "@vendor_ts__find-msvc-tools-0.1.9//:find_msvc_tools", - "@vendor_ts__jobserver-0.1.34//:jobserver", - "@vendor_ts__shlex-1.3.0//:shlex", + "@vendor_ts__find-msvc-tools-0.1.10//:find_msvc_tools", + "@vendor_ts__jobserver-0.1.35//:jobserver", + "@vendor_ts__shlex-2.0.1//:shlex", ] + select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [ - "@vendor_ts__libc-0.2.186//:libc", # aarch64-apple-darwin + "@vendor_ts__libc-0.2.189//:libc", # aarch64-apple-darwin ], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # aarch64-unknown-linux-gnu + "@vendor_ts__libc-0.2.189//:libc", # aarch64-unknown-linux-gnu ], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # aarch64-unknown-linux-gnu, aarch64-unknown-nixos-gnu + "@vendor_ts__libc-0.2.189//:libc", # aarch64-unknown-linux-gnu, aarch64-unknown-nixos-gnu ], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.186//:libc", # arm-unknown-linux-gnueabi + "@vendor_ts__libc-0.2.189//:libc", # arm-unknown-linux-gnueabi ], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # i686-unknown-linux-gnu + "@vendor_ts__libc-0.2.189//:libc", # i686-unknown-linux-gnu ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # powerpc-unknown-linux-gnu + "@vendor_ts__libc-0.2.189//:libc", # powerpc-unknown-linux-gnu ], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # riscv64gc-unknown-linux-gnu + "@vendor_ts__libc-0.2.189//:libc", # riscv64gc-unknown-linux-gnu ], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # s390x-unknown-linux-gnu + "@vendor_ts__libc-0.2.189//:libc", # s390x-unknown-linux-gnu ], "@rules_rust//rust/platform:x86_64-apple-darwin": [ - "@vendor_ts__libc-0.2.186//:libc", # x86_64-apple-darwin + "@vendor_ts__libc-0.2.189//:libc", # x86_64-apple-darwin ], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [ - "@vendor_ts__libc-0.2.186//:libc", # x86_64-unknown-freebsd + "@vendor_ts__libc-0.2.189//:libc", # x86_64-unknown-freebsd ], "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # x86_64-unknown-linux-gnu + "@vendor_ts__libc-0.2.189//:libc", # x86_64-unknown-linux-gnu ], "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # x86_64-unknown-linux-gnu, x86_64-unknown-nixos-gnu + "@vendor_ts__libc-0.2.189//:libc", # x86_64-unknown-linux-gnu, x86_64-unknown-nixos-gnu ], "//conditions:default": [], }), diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cfg_aliases-0.2.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cfg_aliases-0.2.2.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cfg_aliases-0.2.1.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cfg_aliases-0.2.2.bazel index 3845773a67b4..411db63dd67c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cfg_aliases-0.2.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cfg_aliases-0.2.2.bazel @@ -93,5 +93,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.2.1", + version = "0.2.2", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chacha20-0.10.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chacha20-0.10.1.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chacha20-0.10.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chacha20-0.10.1.bazel index 7109de2bbe4a..d2cacdeed256 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chacha20-0.10.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chacha20-0.10.1.bazel @@ -96,7 +96,7 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.10.0", + version = "0.10.1", deps = [ "@vendor_ts__cfg-if-1.0.4//:cfg_if", "@vendor_ts__rand_core-0.10.1//:rand_core", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-derive-0.104.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-derive-0.104.0.bazel index b66be433fe88..97e744a18d44 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-derive-0.104.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-derive-0.104.0.bazel @@ -95,9 +95,9 @@ rust_proc_macro( }), version = "0.104.0", deps = [ - "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", - "@vendor_ts__quote-1.0.45//:quote", - "@vendor_ts__syn-2.0.117//:syn", + "@vendor_ts__proc-macro2-1.0.107//:proc_macro2", + "@vendor_ts__quote-1.0.47//:quote", + "@vendor_ts__syn-2.0.119//:syn", "@vendor_ts__synstructure-0.13.2//:synstructure", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-ir-0.104.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-ir-0.104.0.bazel index 66edc978c74f..5d534a7ce399 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-ir-0.104.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-ir-0.104.0.bazel @@ -98,6 +98,6 @@ rust_library( }), version = "0.104.0", deps = [ - "@vendor_ts__bitflags-2.11.1//:bitflags", + "@vendor_ts__bitflags-2.13.1//:bitflags", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chrono-0.4.44.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chrono-0.4.45.bazel similarity index 97% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chrono-0.4.44.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chrono-0.4.45.bazel index d4410c3639c8..20f608e8ffca 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chrono-0.4.44.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chrono-0.4.45.bazel @@ -108,10 +108,10 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.4.44", + version = "0.4.45", deps = [ "@vendor_ts__num-traits-0.2.19//:num_traits", - "@vendor_ts__serde-1.0.228//:serde", + "@vendor_ts__serde-1.0.229//:serde", ] + select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [ "@vendor_ts__iana-time-zone-0.1.65//:iana_time_zone", # aarch64-apple-darwin @@ -180,8 +180,8 @@ rust_library( "@vendor_ts__iana-time-zone-0.1.65//:iana_time_zone", # wasm32-unknown-emscripten ], "@rules_rust//rust/platform:wasm32-unknown-unknown": [ - "@vendor_ts__js-sys-0.3.98//:js_sys", # wasm32-unknown-unknown - "@vendor_ts__wasm-bindgen-0.2.121//:wasm_bindgen", # wasm32-unknown-unknown + "@vendor_ts__js-sys-0.3.103//:js_sys", # wasm32-unknown-unknown + "@vendor_ts__wasm-bindgen-0.2.126//:wasm_bindgen", # wasm32-unknown-unknown ], "@rules_rust//rust/platform:x86_64-apple-darwin": [ "@vendor_ts__iana-time-zone-0.1.65//:iana_time_zone", # x86_64-apple-darwin diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap-4.6.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap-4.6.6.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap-4.6.1.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap-4.6.6.bazel index c03e48a40d2e..d67d5c9cb3f5 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap-4.6.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap-4.6.6.bazel @@ -47,7 +47,7 @@ rust_library( crate_root = "src/lib.rs", edition = "2024", proc_macro_deps = [ - "@vendor_ts__clap_derive-4.6.1//:clap_derive", + "@vendor_ts__clap_derive-4.6.4//:clap_derive", ], rustc_env_files = [ ":cargo_toml_env_vars", @@ -106,8 +106,8 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "4.6.1", + version = "4.6.6", deps = [ - "@vendor_ts__clap_builder-4.6.0//:clap_builder", + "@vendor_ts__clap_builder-4.6.6//:clap_builder", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_builder-4.6.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_builder-4.6.6.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_builder-4.6.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_builder-4.6.6.bazel index e80eda78e4eb..a592f02d5b7b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_builder-4.6.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_builder-4.6.6.bazel @@ -101,7 +101,7 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "4.6.0", + version = "4.6.6", deps = [ "@vendor_ts__anstream-1.0.0//:anstream", "@vendor_ts__anstyle-1.0.14//:anstyle", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_derive-4.6.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_derive-4.6.4.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_derive-4.6.1.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_derive-4.6.4.bazel index dfbff2549f07..64f4bfc6e037 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_derive-4.6.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_derive-4.6.4.bazel @@ -96,11 +96,11 @@ rust_proc_macro( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "4.6.1", + version = "4.6.4", deps = [ "@vendor_ts__heck-0.5.0//:heck", - "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", - "@vendor_ts__quote-1.0.45//:quote", - "@vendor_ts__syn-2.0.117//:syn", + "@vendor_ts__proc-macro2-1.0.107//:proc_macro2", + "@vendor_ts__quote-1.0.47//:quote", + "@vendor_ts__syn-3.0.3//:syn", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cobs-0.3.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cobs-0.3.0.bazel index 658009e8af70..875a4219fae7 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cobs-0.3.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cobs-0.3.0.bazel @@ -95,6 +95,6 @@ rust_library( }), version = "0.3.0", deps = [ - "@vendor_ts__thiserror-2.0.18//:thiserror", + "@vendor_ts__thiserror-2.0.20//:thiserror", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cpufeatures-0.3.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cpufeatures-0.3.0.bazel index 0defc99a0ac1..fc1d247e88d5 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cpufeatures-0.3.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cpufeatures-0.3.0.bazel @@ -96,22 +96,22 @@ rust_library( version = "0.3.0", deps = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(target_arch = "aarch64", target_vendor = "apple")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(target_arch = "aarch64", target_vendor = "apple")) ], "@rules_rust//rust/platform:aarch64-apple-ios": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(target_arch = "aarch64", target_vendor = "apple")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(target_arch = "aarch64", target_vendor = "apple")) ], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(target_arch = "aarch64", target_vendor = "apple")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(target_arch = "aarch64", target_vendor = "apple")) ], "@rules_rust//rust/platform:aarch64-linux-android": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(target_arch = "aarch64", target_os = "android")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(target_arch = "aarch64", target_os = "android")) ], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(target_arch = "aarch64", target_os = "linux")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(target_arch = "aarch64", target_os = "linux")) ], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(target_arch = "aarch64", target_os = "linux")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(target_arch = "aarch64", target_os = "linux")) ], "//conditions:default": [], }), diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.critical-section-1.2.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.critical-section-1.2.0.bazel deleted file mode 100644 index 0e3cf2f62f41..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.critical-section-1.2.0.bazel +++ /dev/null @@ -1,97 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "critical_section", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_root = "src/lib.rs", - edition = "2018", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=critical-section", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "1.2.0", -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-channel-0.5.15.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-channel-0.5.16.bazel similarity index 97% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-channel-0.5.15.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-channel-0.5.16.bazel index 3a6999466ae1..4172ffc32e79 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-channel-0.5.15.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-channel-0.5.16.bazel @@ -97,8 +97,8 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.5.15", + version = "0.5.16", deps = [ - "@vendor_ts__crossbeam-utils-0.8.21//:crossbeam_utils", + "@vendor_ts__crossbeam-utils-0.8.22//:crossbeam_utils", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-deque-0.8.7.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-deque-0.8.7.bazel new file mode 100644 index 000000000000..b71afab9ca9d --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-deque-0.8.7.bazel @@ -0,0 +1,172 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load( + "@rules_rust//cargo:defs.bzl", + "cargo_build_script", + "cargo_toml_env_vars", +) +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "crossbeam_deque", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "default", + "std", + ], + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=crossbeam-deque", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.8.7", + deps = [ + "@vendor_ts__crossbeam-deque-0.8.7//:build_script_build", + "@vendor_ts__crossbeam-epoch-0.9.20//:crossbeam_epoch", + "@vendor_ts__crossbeam-utils-0.8.22//:crossbeam_utils", + ], +) + +cargo_build_script( + name = "_bs", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + "**/*.rs", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "default", + "std", + ], + crate_name = "build_script_build", + crate_root = "build.rs", + data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + edition = "2021", + pkg_name = "crossbeam-deque", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=crossbeam-deque", + "manual", + "noclippy", + "norustfmt", + ], + version = "0.8.7", + visibility = ["//visibility:private"], +) + +alias( + name = "build_script_build", + actual = ":_bs", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-epoch-0.9.18.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-epoch-0.9.18.bazel deleted file mode 100644 index bded5897eb8e..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-epoch-0.9.18.bazel +++ /dev/null @@ -1,104 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "crossbeam_epoch", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "alloc", - "std", - ], - crate_root = "src/lib.rs", - edition = "2021", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=crossbeam-epoch", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.9.18", - deps = [ - "@vendor_ts__crossbeam-utils-0.8.21//:crossbeam_utils", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-epoch-0.9.20.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-epoch-0.9.20.bazel new file mode 100644 index 000000000000..0e0e00444ab2 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-epoch-0.9.20.bazel @@ -0,0 +1,171 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load( + "@rules_rust//cargo:defs.bzl", + "cargo_build_script", + "cargo_toml_env_vars", +) +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "crossbeam_epoch", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "alloc", + "std", + ], + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=crossbeam-epoch", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.9.20", + deps = [ + "@vendor_ts__crossbeam-epoch-0.9.20//:build_script_build", + "@vendor_ts__crossbeam-utils-0.8.22//:crossbeam_utils", + ], +) + +cargo_build_script( + name = "_bs", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + "**/*.rs", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_features = [ + "alloc", + "std", + ], + crate_name = "build_script_build", + crate_root = "build.rs", + data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + edition = "2021", + pkg_name = "crossbeam-epoch", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=crossbeam-epoch", + "manual", + "noclippy", + "norustfmt", + ], + version = "0.9.20", + visibility = ["//visibility:private"], +) + +alias( + name = "build_script_build", + actual = ":_bs", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-queue-0.3.12.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-queue-0.3.12.bazel index 18797ac294ca..9343a0d0050b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-queue-0.3.12.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-queue-0.3.12.bazel @@ -100,6 +100,6 @@ rust_library( }), version = "0.3.12", deps = [ - "@vendor_ts__crossbeam-utils-0.8.21//:crossbeam_utils", + "@vendor_ts__crossbeam-utils-0.8.22//:crossbeam_utils", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-utils-0.8.21.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-utils-0.8.22.bazel similarity index 97% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-utils-0.8.21.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-utils-0.8.22.bazel index ba484864b400..0f8efc035997 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-utils-0.8.21.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-utils-0.8.22.bazel @@ -101,9 +101,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.8.21", + version = "0.8.22", deps = [ - "@vendor_ts__crossbeam-utils-0.8.21//:build_script_build", + "@vendor_ts__crossbeam-utils-0.8.22//:build_script_build", ], ) @@ -159,7 +159,7 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "0.8.21", + version = "0.8.22", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling_core-0.23.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling_core-0.23.0.bazel index a9da47fd6acd..c950eee8f5f0 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling_core-0.23.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling_core-0.23.0.bazel @@ -100,9 +100,9 @@ rust_library( version = "0.23.0", deps = [ "@vendor_ts__ident_case-1.0.1//:ident_case", - "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", - "@vendor_ts__quote-1.0.45//:quote", + "@vendor_ts__proc-macro2-1.0.107//:proc_macro2", + "@vendor_ts__quote-1.0.47//:quote", "@vendor_ts__strsim-0.11.1//:strsim", - "@vendor_ts__syn-2.0.117//:syn", + "@vendor_ts__syn-2.0.119//:syn", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling_macro-0.23.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling_macro-0.23.0.bazel index aa8c9c33128a..de5fb2667de2 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling_macro-0.23.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling_macro-0.23.0.bazel @@ -96,7 +96,7 @@ rust_proc_macro( version = "0.23.0", deps = [ "@vendor_ts__darling_core-0.23.0//:darling_core", - "@vendor_ts__quote-1.0.45//:quote", - "@vendor_ts__syn-2.0.117//:syn", + "@vendor_ts__quote-1.0.47//:quote", + "@vendor_ts__syn-2.0.119//:syn", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.dashmap-6.1.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.dashmap-6.2.1.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.dashmap-6.1.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.dashmap-6.2.1.bazel index bdfab824cf51..79dfc9f42794 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.dashmap-6.1.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.dashmap-6.2.1.bazel @@ -97,10 +97,10 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "6.1.0", + version = "6.2.1", deps = [ "@vendor_ts__cfg-if-1.0.4//:cfg_if", - "@vendor_ts__crossbeam-utils-0.8.21//:crossbeam_utils", + "@vendor_ts__crossbeam-utils-0.8.22//:crossbeam_utils", "@vendor_ts__hashbrown-0.14.5//:hashbrown", "@vendor_ts__lock_api-0.4.14//:lock_api", "@vendor_ts__once_cell-1.21.4//:once_cell", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.defmt-1.1.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.defmt-1.1.1.bazel new file mode 100644 index 000000000000..1b456bb736f0 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.defmt-1.1.1.bazel @@ -0,0 +1,167 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load( + "@rules_rust//cargo:defs.bzl", + "cargo_build_script", + "cargo_toml_env_vars", +) +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "defmt", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2021", + proc_macro_deps = [ + "@vendor_ts__defmt-macros-1.1.1//:defmt_macros", + ], + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=defmt", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "1.1.1", + deps = [ + "@vendor_ts__bitflags-1.3.2//:bitflags", + "@vendor_ts__defmt-1.1.1//:build_script_build", + ], +) + +cargo_build_script( + name = "_bs", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + "**/*.rs", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_name = "build_script_build", + crate_root = "build.rs", + data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + edition = "2021", + links = "defmt", + pkg_name = "defmt", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=defmt", + "manual", + "noclippy", + "norustfmt", + ], + version = "1.1.1", + visibility = ["//visibility:private"], +) + +alias( + name = "build_script_build", + actual = ":_bs", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.defmt-macros-1.1.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.defmt-macros-1.1.1.bazel new file mode 100644 index 000000000000..39b1acc1da0f --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.defmt-macros-1.1.1.bazel @@ -0,0 +1,166 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load( + "@rules_rust//cargo:defs.bzl", + "cargo_build_script", + "cargo_toml_env_vars", +) +load("@rules_rust//rust:defs.bzl", "rust_proc_macro") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_proc_macro( + name = "defmt_macros", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=defmt-macros", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "1.1.1", + deps = [ + "@vendor_ts__defmt-macros-1.1.1//:build_script_build", + "@vendor_ts__defmt-parser-1.0.0//:defmt_parser", + "@vendor_ts__proc-macro2-1.0.107//:proc_macro2", + "@vendor_ts__quote-1.0.47//:quote", + "@vendor_ts__syn-2.0.119//:syn", + ], +) + +cargo_build_script( + name = "_bs", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + "**/*.rs", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_name = "build_script_build", + crate_root = "build.rs", + data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + edition = "2021", + pkg_name = "defmt-macros", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=defmt-macros", + "manual", + "noclippy", + "norustfmt", + ], + version = "1.1.1", + visibility = ["//visibility:private"], +) + +alias( + name = "build_script_build", + actual = ":_bs", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasip2-1.0.3+wasi-0.2.9.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.defmt-parser-1.0.0.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasip2-1.0.3+wasi-0.2.9.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.defmt-parser-1.0.0.bazel index f1eb022310b7..b9302e3870bd 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasip2-1.0.3+wasi-0.2.9.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.defmt-parser-1.0.0.bazel @@ -17,7 +17,7 @@ cargo_toml_env_vars( ) rust_library( - name = "wasip2", + name = "defmt_parser", srcs = glob( include = ["**/*.rs"], allow_empty = True, @@ -44,7 +44,7 @@ rust_library( ], tags = [ "cargo-bazel", - "crate-name=wasip2", + "crate-name=defmt-parser", "manual", "noclippy", "norustfmt", @@ -93,8 +93,8 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.3+wasi-0.2.9", + version = "1.0.0", deps = [ - "@vendor_ts__wit-bindgen-0.57.1//:wit_bindgen", + "@vendor_ts__thiserror-2.0.20//:thiserror", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.deranged-0.5.8.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.deranged-0.5.8.bazel index a2e622da9c32..ec21bfae7bba 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.deranged-0.5.8.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.deranged-0.5.8.bazel @@ -36,7 +36,6 @@ rust_library( ), crate_features = [ "default", - "powerfmt", ], crate_root = "src/lib.rs", edition = "2021", @@ -98,7 +97,4 @@ rust_library( "//conditions:default": ["@platforms//:incompatible"], }), version = "0.5.8", - deps = [ - "@vendor_ts__powerfmt-0.2.0//:powerfmt", - ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.derive-where-1.6.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.derive-where-1.6.1.bazel index 16396514eeb5..b58ff3e4868c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.derive-where-1.6.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.derive-where-1.6.1.bazel @@ -95,8 +95,8 @@ rust_proc_macro( }), version = "1.6.1", deps = [ - "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", - "@vendor_ts__quote-1.0.45//:quote", - "@vendor_ts__syn-2.0.117//:syn", + "@vendor_ts__proc-macro2-1.0.107//:proc_macro2", + "@vendor_ts__quote-1.0.47//:quote", + "@vendor_ts__syn-2.0.119//:syn", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.either-1.16.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.either-1.17.0.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.either-1.16.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.either-1.17.0.bazel index 70e20043d922..afa7b0288e85 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.either-1.16.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.either-1.17.0.bazel @@ -98,5 +98,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.16.0", + version = "1.17.0", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ena-0.14.4.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ena-0.14.4.bazel index 09e5e93a3375..a910b648ab36 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ena-0.14.4.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ena-0.14.4.bazel @@ -95,6 +95,6 @@ rust_library( }), version = "0.14.4", deps = [ - "@vendor_ts__log-0.4.29//:log", + "@vendor_ts__log-0.4.33//:log", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.figment-0.10.19.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.figment-0.10.19.bazel index 4bb767ff10e1..29b234484a34 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.figment-0.10.19.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.figment-0.10.19.bazel @@ -108,7 +108,7 @@ rust_library( deps = [ "@vendor_ts__figment-0.10.19//:build_script_build", "@vendor_ts__pear-0.2.9//:pear", - "@vendor_ts__serde-1.0.228//:serde", + "@vendor_ts__serde-1.0.229//:serde", "@vendor_ts__serde_yaml-0.9.34-deprecated//:serde_yaml", "@vendor_ts__uncased-0.9.10//:uncased", ] + select({ diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.find-msvc-tools-0.1.9.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.find-msvc-tools-0.1.10.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.find-msvc-tools-0.1.9.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.find-msvc-tools-0.1.10.bazel index 12cd2ecbe0cc..6585ebabd169 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.find-msvc-tools-0.1.9.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.find-msvc-tools-0.1.10.bazel @@ -35,7 +35,7 @@ rust_library( ], ), crate_root = "src/lib.rs", - edition = "2018", + edition = "2021", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -93,5 +93,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.1.9", + version = "0.1.10", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.foldhash-0.2.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.foldhash-0.2.0.bazel new file mode 100644 index 000000000000..03940fb08ac2 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.foldhash-0.2.0.bazel @@ -0,0 +1,97 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "foldhash", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=foldhash", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.2.0", +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fsevent-sys-4.1.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fsevent-sys-4.1.0.bazel index cdf129ebf21c..1f0b89a5307d 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fsevent-sys-4.1.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fsevent-sys-4.1.0.bazel @@ -95,6 +95,6 @@ rust_library( }), version = "4.1.0", deps = [ - "@vendor_ts__libc-0.2.186//:libc", + "@vendor_ts__libc-0.2.189//:libc", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.futures-core-0.3.32.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.futures-core-0.3.34.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.futures-core-0.3.32.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.futures-core-0.3.34.bazel index 0540232caa8d..aa25f01dc27d 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.futures-core-0.3.32.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.futures-core-0.3.34.bazel @@ -97,5 +97,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.3.32", + version = "0.3.34", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.futures-task-0.3.32.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.futures-task-0.3.34.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.futures-task-0.3.32.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.futures-task-0.3.34.bazel index 35f5694bc98b..e84d9139b2a5 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.futures-task-0.3.32.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.futures-task-0.3.34.bazel @@ -97,5 +97,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.3.32", + version = "0.3.34", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.futures-util-0.3.32.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.futures-util-0.3.34.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.futures-util-0.3.32.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.futures-util-0.3.34.bazel index e545f6db19f8..0d564e722dad 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.futures-util-0.3.32.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.futures-util-0.3.34.bazel @@ -98,10 +98,10 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.3.32", + version = "0.3.34", deps = [ - "@vendor_ts__futures-core-0.3.32//:futures_core", - "@vendor_ts__futures-task-0.3.32//:futures_task", + "@vendor_ts__futures-core-0.3.34//:futures_core", + "@vendor_ts__futures-task-0.3.34//:futures_task", "@vendor_ts__pin-project-lite-0.2.17//:pin_project_lite", "@vendor_ts__slab-0.4.12//:slab", ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.getrandom-0.3.4.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.getrandom-0.3.4.bazel deleted file mode 100644 index 226c87db023e..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.getrandom-0.3.4.bazel +++ /dev/null @@ -1,249 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load( - "@rules_rust//cargo:defs.bzl", - "cargo_build_script", - "cargo_toml_env_vars", -) -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "getrandom", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "std", - ], - crate_root = "src/lib.rs", - edition = "2021", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=getrandom", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.3.4", - deps = [ - "@vendor_ts__cfg-if-1.0.4//:cfg_if", - "@vendor_ts__getrandom-0.3.4//:build_script_build", - ] + select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(target_os = "macos", target_os = "openbsd", target_os = "vita", target_os = "emscripten")) - ], - "@rules_rust//rust/platform:aarch64-apple-ios": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(target_os = "ios", target_os = "visionos", target_os = "watchos", target_os = "tvos")) - ], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(target_os = "ios", target_os = "visionos", target_os = "watchos", target_os = "tvos")) - ], - "@rules_rust//rust/platform:aarch64-linux-android": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) - ], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) - ], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) - ], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(target_os = "haiku", target_os = "redox", target_os = "nto", target_os = "aix")) - ], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) - ], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) - ], - "@rules_rust//rust/platform:armv7-linux-androideabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) - ], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) - ], - "@rules_rust//rust/platform:i686-apple-darwin": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(target_os = "macos", target_os = "openbsd", target_os = "vita", target_os = "emscripten")) - ], - "@rules_rust//rust/platform:i686-linux-android": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) - ], - "@rules_rust//rust/platform:i686-unknown-freebsd": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(target_os = "dragonfly", target_os = "freebsd", target_os = "hurd", target_os = "illumos", target_os = "cygwin", all(target_os = "horizon", target_arch = "arm"))) - ], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) - ], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) - ], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) - ], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) - ], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(target_os = "macos", target_os = "openbsd", target_os = "vita", target_os = "emscripten")) - ], - "@rules_rust//rust/platform:wasm32-wasip2": [ - "@vendor_ts__wasip2-1.0.3-wasi-0.2.9//:wasip2", # cfg(all(target_arch = "wasm32", target_os = "wasi", target_env = "p2")) - ], - "@rules_rust//rust/platform:x86_64-apple-darwin": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(target_os = "macos", target_os = "openbsd", target_os = "vita", target_os = "emscripten")) - ], - "@rules_rust//rust/platform:x86_64-apple-ios": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(target_os = "ios", target_os = "visionos", target_os = "watchos", target_os = "tvos")) - ], - "@rules_rust//rust/platform:x86_64-linux-android": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) - ], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(target_os = "dragonfly", target_os = "freebsd", target_os = "hurd", target_os = "illumos", target_os = "cygwin", all(target_os = "horizon", target_arch = "arm"))) - ], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) - ], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) - ], - "//conditions:default": [], - }), -) - -cargo_build_script( - name = "_bs", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - "**/*.rs", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "std", - ], - crate_name = "build_script_build", - crate_root = "build.rs", - data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - edition = "2021", - pkg_name = "getrandom", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=getrandom", - "manual", - "noclippy", - "norustfmt", - ], - version = "0.3.4", - visibility = ["//visibility:private"], -) - -alias( - name = "build_script_build", - actual = ":_bs", - tags = ["manual"], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.getrandom-0.4.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.getrandom-0.4.3.bazel similarity index 86% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.getrandom-0.4.2.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.getrandom-0.4.3.bazel index c9cdb9f51292..48f64d5c587e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.getrandom-0.4.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.getrandom-0.4.3.bazel @@ -101,89 +101,86 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.4.2", + version = "0.4.3", deps = [ "@vendor_ts__cfg-if-1.0.4//:cfg_if", - "@vendor_ts__getrandom-0.4.2//:build_script_build", + "@vendor_ts__getrandom-0.4.3//:build_script_build", "@vendor_ts__rand_core-0.10.1//:rand_core", ] + select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(target_os = "macos", target_os = "openbsd", target_os = "vita", target_os = "emscripten")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(target_os = "macos", target_os = "openbsd", target_os = "vita", target_os = "emscripten")) ], "@rules_rust//rust/platform:aarch64-apple-ios": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(target_os = "ios", target_os = "visionos", target_os = "watchos", target_os = "tvos")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(target_os = "ios", target_os = "visionos", target_os = "watchos", target_os = "tvos")) ], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(target_os = "ios", target_os = "visionos", target_os = "watchos", target_os = "tvos")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(target_os = "ios", target_os = "visionos", target_os = "watchos", target_os = "tvos")) ], "@rules_rust//rust/platform:aarch64-linux-android": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(target_os = "haiku", target_os = "redox", target_os = "nto", target_os = "aix")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(target_os = "haiku", target_os = "redox", target_os = "nto", target_os = "aix")) ], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], "@rules_rust//rust/platform:armv7-linux-androideabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], "@rules_rust//rust/platform:i686-apple-darwin": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(target_os = "macos", target_os = "openbsd", target_os = "vita", target_os = "emscripten")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(target_os = "macos", target_os = "openbsd", target_os = "vita", target_os = "emscripten")) ], "@rules_rust//rust/platform:i686-linux-android": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], "@rules_rust//rust/platform:i686-unknown-freebsd": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(target_os = "dragonfly", target_os = "freebsd", target_os = "hurd", target_os = "illumos", target_os = "cygwin", all(target_os = "horizon", target_arch = "arm"))) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(target_os = "dragonfly", target_os = "freebsd", target_os = "hurd", target_os = "illumos", target_os = "cygwin", all(target_os = "horizon", target_arch = "arm"))) ], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(target_os = "macos", target_os = "openbsd", target_os = "vita", target_os = "emscripten")) - ], - "@rules_rust//rust/platform:wasm32-wasip2": [ - "@vendor_ts__wasip2-1.0.3-wasi-0.2.9//:wasip2", # cfg(all(target_arch = "wasm32", target_os = "wasi", target_env = "p2")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(target_os = "macos", target_os = "openbsd", target_os = "vita", target_os = "emscripten")) ], "@rules_rust//rust/platform:x86_64-apple-darwin": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(target_os = "macos", target_os = "openbsd", target_os = "vita", target_os = "emscripten")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(target_os = "macos", target_os = "openbsd", target_os = "vita", target_os = "emscripten")) ], "@rules_rust//rust/platform:x86_64-apple-ios": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(target_os = "ios", target_os = "visionos", target_os = "watchos", target_os = "tvos")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(target_os = "ios", target_os = "visionos", target_os = "watchos", target_os = "tvos")) ], "@rules_rust//rust/platform:x86_64-linux-android": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(target_os = "dragonfly", target_os = "freebsd", target_os = "hurd", target_os = "illumos", target_os = "cygwin", all(target_os = "horizon", target_arch = "arm"))) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(target_os = "dragonfly", target_os = "freebsd", target_os = "hurd", target_os = "illumos", target_os = "cygwin", all(target_os = "horizon", target_arch = "arm"))) ], "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], "//conditions:default": [], }), @@ -241,7 +238,7 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "0.4.2", + version = "0.4.3", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.glob-0.3.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.glob-0.3.4.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.glob-0.3.3.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.glob-0.3.4.bazel index d26541b4fca7..8b00531d59b3 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.glob-0.3.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.glob-0.3.4.bazel @@ -35,7 +35,7 @@ rust_library( ], ), crate_root = "src/lib.rs", - edition = "2015", + edition = "2021", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -93,5 +93,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.3.3", + version = "0.3.4", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.globset-0.4.18.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.globset-0.4.18.bazel index a372bc5cbecf..4b8338d1418e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.globset-0.4.18.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.globset-0.4.18.bazel @@ -99,10 +99,10 @@ rust_library( }), version = "0.4.18", deps = [ - "@vendor_ts__aho-corasick-1.1.4//:aho_corasick", + "@vendor_ts__aho-corasick-1.1.5//:aho_corasick", "@vendor_ts__bstr-1.12.1//:bstr", - "@vendor_ts__log-0.4.29//:log", - "@vendor_ts__regex-automata-0.4.14//:regex_automata", - "@vendor_ts__regex-syntax-0.8.10//:regex_syntax", + "@vendor_ts__log-0.4.33//:log", + "@vendor_ts__regex-automata-0.4.18//:regex_automata", + "@vendor_ts__regex-syntax-0.8.11//:regex_syntax", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hash32-0.2.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hash32-0.2.1.bazel deleted file mode 100644 index 182c9c89fd4e..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hash32-0.2.1.bazel +++ /dev/null @@ -1,100 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "hash32", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_root = "src/lib.rs", - edition = "2015", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=hash32", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.2.1", - deps = [ - "@vendor_ts__byteorder-1.5.0//:byteorder", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.15.5.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.15.5.bazel index a51bce9391ac..e7f59867ea65 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.15.5.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.15.5.bazel @@ -35,12 +35,8 @@ rust_library( ], ), crate_features = [ - "allocator-api2", - "default", "default-hasher", - "equivalent", "inline-more", - "raw-entry", ], crate_root = "src/lib.rs", edition = "2021", @@ -103,8 +99,6 @@ rust_library( }), version = "0.15.5", deps = [ - "@vendor_ts__allocator-api2-0.2.21//:allocator_api2", - "@vendor_ts__equivalent-1.0.2//:equivalent", "@vendor_ts__foldhash-0.1.5//:foldhash", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.17.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.17.1.bazel index eba4862da685..dc437ef82fbe 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.17.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.17.1.bazel @@ -34,6 +34,14 @@ rust_library( "WORKSPACE.bazel", ], ), + crate_features = [ + "allocator-api2", + "default", + "default-hasher", + "equivalent", + "inline-more", + "raw-entry", + ], crate_root = "src/lib.rs", edition = "2024", rustc_env_files = [ @@ -94,4 +102,9 @@ rust_library( "//conditions:default": ["@platforms//:incompatible"], }), version = "0.17.1", + deps = [ + "@vendor_ts__allocator-api2-0.2.21//:allocator_api2", + "@vendor_ts__equivalent-1.0.2//:equivalent", + "@vendor_ts__foldhash-0.2.0//:foldhash", + ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashlink-0.10.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashlink-0.12.1.bazel similarity index 97% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashlink-0.10.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashlink-0.12.1.bazel index badd7cb27219..35ab1761f795 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashlink-0.10.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashlink-0.12.1.bazel @@ -35,7 +35,7 @@ rust_library( ], ), crate_root = "src/lib.rs", - edition = "2018", + edition = "2024", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -93,8 +93,8 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.10.0", + version = "0.12.1", deps = [ - "@vendor_ts__hashbrown-0.15.5//:hashbrown", + "@vendor_ts__hashbrown-0.17.1//:hashbrown", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.heapless-0.7.17.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.heapless-0.7.17.bazel deleted file mode 100644 index 75b7d25c4df4..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.heapless-0.7.17.bazel +++ /dev/null @@ -1,213 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load( - "@rules_rust//cargo:defs.bzl", - "cargo_build_script", - "cargo_toml_env_vars", -) -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "heapless", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "atomic-polyfill", - "cas", - "serde", - ], - crate_root = "src/lib.rs", - edition = "2018", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=heapless", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.7.17", - deps = [ - "@vendor_ts__hash32-0.2.1//:hash32", - "@vendor_ts__heapless-0.7.17//:build_script_build", - "@vendor_ts__serde-1.0.228//:serde", - "@vendor_ts__stable_deref_trait-1.2.1//:stable_deref_trait", - ] + select({ - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [ - "@vendor_ts__atomic-polyfill-1.0.3//:atomic_polyfill", # riscv32imc-unknown-none-elf - ], - "@rules_rust//rust/platform:x86_64-apple-darwin": [ - "@vendor_ts__spin-0.9.8//:spin", # cfg(target_arch = "x86_64") - ], - "@rules_rust//rust/platform:x86_64-apple-ios": [ - "@vendor_ts__spin-0.9.8//:spin", # cfg(target_arch = "x86_64") - ], - "@rules_rust//rust/platform:x86_64-linux-android": [ - "@vendor_ts__spin-0.9.8//:spin", # cfg(target_arch = "x86_64") - ], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [ - "@vendor_ts__spin-0.9.8//:spin", # cfg(target_arch = "x86_64") - ], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [ - "@vendor_ts__spin-0.9.8//:spin", # cfg(target_arch = "x86_64") - ], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [ - "@vendor_ts__spin-0.9.8//:spin", # cfg(target_arch = "x86_64") - ], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [ - "@vendor_ts__spin-0.9.8//:spin", # cfg(target_arch = "x86_64") - ], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [ - "@vendor_ts__spin-0.9.8//:spin", # cfg(target_arch = "x86_64") - ], - "@rules_rust//rust/platform:x86_64-unknown-none": [ - "@vendor_ts__spin-0.9.8//:spin", # cfg(target_arch = "x86_64") - ], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [ - "@vendor_ts__spin-0.9.8//:spin", # cfg(target_arch = "x86_64") - ], - "//conditions:default": [], - }), -) - -cargo_build_script( - name = "_bs", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - "**/*.rs", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "atomic-polyfill", - "cas", - "serde", - ], - crate_name = "build_script_build", - crate_root = "build.rs", - data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - edition = "2018", - pkg_name = "heapless", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=heapless", - "manual", - "noclippy", - "norustfmt", - ], - version = "0.7.17", - visibility = ["//visibility:private"], - deps = [ - "@vendor_ts__rustc_version-0.4.1//:rustc_version", - ], -) - -alias( - name = "build_script_build", - actual = ":_bs", - tags = ["manual"], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.iana-time-zone-0.1.65.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.iana-time-zone-0.1.65.bazel index 3d43db490e7d..9660eac29e3c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.iana-time-zone-0.1.65.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.iana-time-zone-0.1.65.bazel @@ -126,9 +126,9 @@ rust_library( "@vendor_ts__windows-core-0.62.2//:windows_core", # cfg(target_os = "windows") ], "@rules_rust//rust/platform:wasm32-unknown-unknown": [ - "@vendor_ts__js-sys-0.3.98//:js_sys", # cfg(all(target_arch = "wasm32", target_os = "unknown")) - "@vendor_ts__log-0.4.29//:log", # cfg(all(target_arch = "wasm32", target_os = "unknown")) - "@vendor_ts__wasm-bindgen-0.2.121//:wasm_bindgen", # cfg(all(target_arch = "wasm32", target_os = "unknown")) + "@vendor_ts__js-sys-0.3.103//:js_sys", # cfg(all(target_arch = "wasm32", target_os = "unknown")) + "@vendor_ts__log-0.4.33//:log", # cfg(all(target_arch = "wasm32", target_os = "unknown")) + "@vendor_ts__wasm-bindgen-0.2.126//:wasm_bindgen", # cfg(all(target_arch = "wasm32", target_os = "unknown")) ], "@rules_rust//rust/platform:x86_64-apple-darwin": [ "@vendor_ts__core-foundation-sys-0.8.7//:core_foundation_sys", # cfg(target_vendor = "apple") diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.iana-time-zone-haiku-0.1.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.iana-time-zone-haiku-0.1.2.bazel index 626fa294ba23..cdfc181b9c17 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.iana-time-zone-haiku-0.1.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.iana-time-zone-haiku-0.1.2.bazel @@ -154,7 +154,7 @@ cargo_build_script( version = "0.1.2", visibility = ["//visibility:private"], deps = [ - "@vendor_ts__cc-1.2.62//:cc", + "@vendor_ts__cc-1.4.2//:cc", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.indexmap-2.14.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.indexmap-2.14.0.bazel index 5a727af4c881..66634436101b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.indexmap-2.14.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.indexmap-2.14.0.bazel @@ -102,6 +102,6 @@ rust_library( deps = [ "@vendor_ts__equivalent-1.0.2//:equivalent", "@vendor_ts__hashbrown-0.17.1//:hashbrown", - "@vendor_ts__serde_core-1.0.228//:serde_core", + "@vendor_ts__serde_core-1.0.229//:serde_core", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inotify-0.11.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inotify-0.11.1.bazel index 7e7ec089ec53..26cafee66759 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inotify-0.11.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inotify-0.11.1.bazel @@ -95,8 +95,8 @@ rust_library( }), version = "0.11.1", deps = [ - "@vendor_ts__bitflags-2.11.1//:bitflags", - "@vendor_ts__inotify-sys-0.1.5//:inotify_sys", - "@vendor_ts__libc-0.2.186//:libc", + "@vendor_ts__bitflags-2.13.1//:bitflags", + "@vendor_ts__inotify-sys-0.1.8//:inotify_sys", + "@vendor_ts__libc-0.2.189//:libc", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inotify-sys-0.1.5.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inotify-sys-0.1.5.bazel deleted file mode 100644 index 18a221db2a12..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inotify-sys-0.1.5.bazel +++ /dev/null @@ -1,100 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "inotify_sys", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_root = "src/lib.rs", - edition = "2015", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=inotify-sys", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.1.5", - deps = [ - "@vendor_ts__libc-0.2.186//:libc", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-0.57.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inotify-sys-0.1.8.bazel similarity index 94% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-0.57.1.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inotify-sys-0.1.8.bazel index 00d1f9181d93..8c601ff610b7 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-0.57.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inotify-sys-0.1.8.bazel @@ -21,7 +21,7 @@ cargo_toml_env_vars( ) rust_library( - name = "wit_bindgen", + name = "inotify_sys", srcs = glob( include = ["**/*.rs"], allow_empty = True, @@ -39,7 +39,7 @@ rust_library( ], ), crate_root = "src/lib.rs", - edition = "2024", + edition = "2015", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -48,7 +48,7 @@ rust_library( ], tags = [ "cargo-bazel", - "crate-name=wit-bindgen", + "crate-name=inotify-sys", "manual", "noclippy", "norustfmt", @@ -97,9 +97,10 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.57.1", + version = "0.1.8", deps = [ - "@vendor_ts__wit-bindgen-0.57.1//:build_script_build", + "@vendor_ts__inotify-sys-0.1.8//:build_script_build", + "@vendor_ts__libc-0.2.189//:libc", ], ) @@ -136,8 +137,8 @@ cargo_build_script( "WORKSPACE.bazel", ], ), - edition = "2024", - pkg_name = "wit-bindgen", + edition = "2015", + pkg_name = "inotify-sys", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -146,12 +147,12 @@ cargo_build_script( ], tags = [ "cargo-bazel", - "crate-name=wit-bindgen", + "crate-name=inotify-sys", "manual", "noclippy", "norustfmt", ], - version = "0.57.1", + version = "0.1.8", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.intrusive-collections-0.9.7.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.intrusive-collections-0.10.3.bazel similarity index 97% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.intrusive-collections-0.9.7.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.intrusive-collections-0.10.3.bazel index ee299069b1e2..76d7c45b2b6d 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.intrusive-collections-0.9.7.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.intrusive-collections-0.10.3.bazel @@ -97,8 +97,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.9.7", - deps = [ - "@vendor_ts__memoffset-0.9.1//:memoffset", - ], + version = "0.10.3", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inventory-0.3.24.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inventory-0.3.24.bazel index f80d0c4f3e86..b2cc79659161 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inventory-0.3.24.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inventory-0.3.24.bazel @@ -38,19 +38,19 @@ rust_library( edition = "2021", proc_macro_deps = select({ "@rules_rust//rust/platform:wasm32-unknown-emscripten": [ - "@vendor_ts__rustversion-1.0.22//:rustversion", # cfg(target_family = "wasm") + "@vendor_ts__rustversion-1.0.23//:rustversion", # cfg(target_family = "wasm") ], "@rules_rust//rust/platform:wasm32-unknown-unknown": [ - "@vendor_ts__rustversion-1.0.22//:rustversion", # cfg(target_family = "wasm") + "@vendor_ts__rustversion-1.0.23//:rustversion", # cfg(target_family = "wasm") ], "@rules_rust//rust/platform:wasm32-wasip1": [ - "@vendor_ts__rustversion-1.0.22//:rustversion", # cfg(target_family = "wasm") + "@vendor_ts__rustversion-1.0.23//:rustversion", # cfg(target_family = "wasm") ], "@rules_rust//rust/platform:wasm32-wasip1-threads": [ - "@vendor_ts__rustversion-1.0.22//:rustversion", # cfg(target_family = "wasm") + "@vendor_ts__rustversion-1.0.23//:rustversion", # cfg(target_family = "wasm") ], "@rules_rust//rust/platform:wasm32-wasip2": [ - "@vendor_ts__rustversion-1.0.22//:rustversion", # cfg(target_family = "wasm") + "@vendor_ts__rustversion-1.0.23//:rustversion", # cfg(target_family = "wasm") ], "//conditions:default": [], }), diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.itertools-0.14.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.itertools-0.15.0.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.itertools-0.14.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.itertools-0.15.0.bazel index 359e0123e5f6..78187961b494 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.itertools-0.14.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.itertools-0.15.0.bazel @@ -98,8 +98,8 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.14.0", + version = "0.15.0", deps = [ - "@vendor_ts__either-1.16.0//:either", + "@vendor_ts__either-1.17.0//:either", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.home-0.5.12.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-0.2.35.bazel similarity index 88% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.home-0.5.12.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-0.2.35.bazel index e1135d6cac8c..ef1c11a64aa2 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.home-0.5.12.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-0.2.35.bazel @@ -17,11 +17,14 @@ cargo_toml_env_vars( ) rust_library( - name = "home", + name = "jiff", srcs = glob( include = ["**/*.rs"], allow_empty = True, ), + aliases = { + "@vendor_ts__jiff-core-0.1.0//:jiff_core": "jcore", + }, compile_data = glob( include = ["**"], allow_empty = True, @@ -35,7 +38,7 @@ rust_library( ], ), crate_root = "src/lib.rs", - edition = "2024", + edition = "2021", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -44,7 +47,7 @@ rust_library( ], tags = [ "cargo-bazel", - "crate-name=home", + "crate-name=jiff", "manual", "noclippy", "norustfmt", @@ -93,16 +96,13 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.5.12", - deps = select({ - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [ - "@vendor_ts__windows-sys-0.61.2//:windows_sys", # cfg(windows) - ], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [ - "@vendor_ts__windows-sys-0.61.2//:windows_sys", # cfg(windows) - ], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [ - "@vendor_ts__windows-sys-0.61.2//:windows_sys", # cfg(windows) + version = "0.2.35", + deps = [ + "@vendor_ts__jiff-core-0.1.0//:jiff_core", + ] + select({ + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [ + "@vendor_ts__portable-atomic-1.14.0//:portable_atomic", # cfg(not(target_has_atomic = "ptr")) + "@vendor_ts__portable-atomic-util-0.2.7//:portable_atomic_util", # cfg(not(target_has_atomic = "ptr")) ], "//conditions:default": [], }), diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.id-arena-2.3.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-core-0.1.0.bazel similarity index 97% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.id-arena-2.3.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-core-0.1.0.bazel index 7561bcf77875..aebc263a798d 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.id-arena-2.3.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-core-0.1.0.bazel @@ -17,7 +17,7 @@ cargo_toml_env_vars( ) rust_library( - name = "id_arena", + name = "jiff_core", srcs = glob( include = ["**/*.rs"], allow_empty = True, @@ -35,8 +35,10 @@ rust_library( ], ), crate_features = [ + "alloc", "default", "std", + "tz-fat", ], crate_root = "src/lib.rs", edition = "2021", @@ -48,7 +50,7 @@ rust_library( ], tags = [ "cargo-bazel", - "crate-name=id-arena", + "crate-name=jiff-core", "manual", "noclippy", "norustfmt", @@ -97,5 +99,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "2.3.0", + version = "0.1.0", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-static-0.2.35.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-static-0.2.35.bazel new file mode 100644 index 000000000000..4a928c5d748e --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-static-0.2.35.bazel @@ -0,0 +1,106 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_proc_macro") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_proc_macro( + name = "jiff_static", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + aliases = { + "@vendor_ts__jiff-core-0.1.0//:jiff_core": "jcore", + }, + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=jiff-static", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.2.35", + deps = [ + "@vendor_ts__jiff-core-0.1.0//:jiff_core", + "@vendor_ts__proc-macro2-1.0.107//:proc_macro2", + "@vendor_ts__quote-1.0.47//:quote", + "@vendor_ts__syn-2.0.119//:syn", + ], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-tzdb-0.1.8.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-tzdb-0.1.8.bazel new file mode 100644 index 000000000000..3da05899b7fa --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-tzdb-0.1.8.bazel @@ -0,0 +1,97 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "jiff_tzdb", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=jiff-tzdb", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.1.8", +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasip3-0.4.0+wasi-0.3.0-rc-2026-01-06.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-tzdb-platform-0.1.3.bazel similarity index 95% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasip3-0.4.0+wasi-0.3.0-rc-2026-01-06.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-tzdb-platform-0.1.3.bazel index 580c2cef0aab..01c4b9cb161e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasip3-0.4.0+wasi-0.3.0-rc-2026-01-06.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-tzdb-platform-0.1.3.bazel @@ -17,7 +17,7 @@ cargo_toml_env_vars( ) rust_library( - name = "wasip3", + name = "jiff_tzdb_platform", srcs = glob( include = ["**/*.rs"], allow_empty = True, @@ -34,7 +34,7 @@ rust_library( "WORKSPACE.bazel", ], ), - crate_root = "src/lib.rs", + crate_root = "lib.rs", edition = "2021", rustc_env_files = [ ":cargo_toml_env_vars", @@ -44,7 +44,7 @@ rust_library( ], tags = [ "cargo-bazel", - "crate-name=wasip3", + "crate-name=jiff-tzdb-platform", "manual", "noclippy", "norustfmt", @@ -93,8 +93,8 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.4.0+wasi-0.3.0-rc-2026-01-06", + version = "0.1.3", deps = [ - "@vendor_ts__wit-bindgen-0.51.0//:wit_bindgen", + "@vendor_ts__jiff-tzdb-0.1.8//:jiff_tzdb", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jobserver-0.1.34.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jobserver-0.1.35.bazel similarity index 77% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jobserver-0.1.34.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jobserver-0.1.35.bazel index 0df7e753130c..cd468ac4579f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jobserver-0.1.34.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jobserver-0.1.35.bazel @@ -93,97 +93,97 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.1.34", + version = "0.1.35", deps = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-apple-ios": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-linux-android": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [ - "@vendor_ts__getrandom-0.3.4//:getrandom", # cfg(windows) + "@vendor_ts__getrandom-0.4.3//:getrandom", # cfg(windows) ], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:armv7-linux-androideabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:i686-apple-darwin": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:i686-linux-android": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:i686-pc-windows-msvc": [ - "@vendor_ts__getrandom-0.3.4//:getrandom", # cfg(windows) + "@vendor_ts__getrandom-0.4.3//:getrandom", # cfg(windows) ], "@rules_rust//rust/platform:i686-unknown-freebsd": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-apple-darwin": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-apple-ios": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-linux-android": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [ - "@vendor_ts__getrandom-0.3.4//:getrandom", # cfg(windows) + "@vendor_ts__getrandom-0.4.3//:getrandom", # cfg(windows) ], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "//conditions:default": [], }), diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.js-sys-0.3.98.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.js-sys-0.3.103.bazel similarity index 95% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.js-sys-0.3.98.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.js-sys-0.3.103.bazel index 0739ea021bba..9c8b4290ab9e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.js-sys-0.3.98.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.js-sys-0.3.103.bazel @@ -98,11 +98,10 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.3.98", + version = "0.3.103", deps = [ "@vendor_ts__cfg-if-1.0.4//:cfg_if", - "@vendor_ts__futures-util-0.3.32//:futures_util", - "@vendor_ts__once_cell-1.21.4//:once_cell", - "@vendor_ts__wasm-bindgen-0.2.121//:wasm_bindgen", + "@vendor_ts__futures-util-0.3.34//:futures_util", + "@vendor_ts__wasm-bindgen-0.2.126//:wasm_bindgen", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.kqueue-1.1.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.kqueue-1.2.0.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.kqueue-1.1.1.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.kqueue-1.2.0.bazel index a663b6594fbb..cb91b015011b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.kqueue-1.1.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.kqueue-1.2.0.bazel @@ -93,9 +93,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.1.1", + version = "1.2.0", deps = [ "@vendor_ts__kqueue-sys-1.1.2//:kqueue_sys", - "@vendor_ts__libc-0.2.186//:libc", + "@vendor_ts__libc-0.2.189//:libc", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.kqueue-sys-1.1.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.kqueue-sys-1.1.2.bazel index 6ff785ad9d4b..2f74bc2a7512 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.kqueue-sys-1.1.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.kqueue-sys-1.1.2.bazel @@ -95,7 +95,7 @@ rust_library( }), version = "1.1.2", deps = [ - "@vendor_ts__bitflags-2.11.1//:bitflags", - "@vendor_ts__libc-0.2.186//:libc", + "@vendor_ts__bitflags-2.13.1//:bitflags", + "@vendor_ts__libc-0.2.189//:libc", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.leb128fmt-0.1.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.leb128fmt-0.1.0.bazel deleted file mode 100644 index a047cb9ea54a..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.leb128fmt-0.1.0.bazel +++ /dev/null @@ -1,97 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "leb128fmt", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_root = "src/lib.rs", - edition = "2021", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=leb128fmt", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.1.0", -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.libc-0.2.186.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.libc-0.2.189.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.libc-0.2.186.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.libc-0.2.189.bazel index 5d03831cec69..3818a870bb1f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.libc-0.2.186.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.libc-0.2.189.bazel @@ -101,9 +101,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.2.186", + version = "0.2.189", deps = [ - "@vendor_ts__libc-0.2.186//:build_script_build", + "@vendor_ts__libc-0.2.189//:build_script_build", ], ) @@ -159,7 +159,7 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "0.2.186", + version = "0.2.189", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.3.9.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.3.9.bazel index 42e47567b286..6d70599c6b25 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.3.9.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.3.9.bazel @@ -99,6 +99,6 @@ rust_library( }), version = "0.3.9", deps = [ - "@vendor_ts__log-0.4.29//:log", + "@vendor_ts__log-0.4.33//:log", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.4.29.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.4.33.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.4.29.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.4.33.bazel index ddb30f59c320..e820c1c7b598 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.4.29.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.4.33.bazel @@ -96,5 +96,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.4.29", + version = "0.4.33", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.matchers-0.2.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.matchers-0.2.0.bazel index 33d700108c78..3bf28570b95f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.matchers-0.2.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.matchers-0.2.0.bazel @@ -95,6 +95,6 @@ rust_library( }), version = "0.2.0", deps = [ - "@vendor_ts__regex-automata-0.4.14//:regex_automata", + "@vendor_ts__regex-automata-0.4.18//:regex_automata", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.memchr-2.8.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.memchr-2.8.3.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.memchr-2.8.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.memchr-2.8.3.bazel index 98e6008f7669..0c58362bdf48 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.memchr-2.8.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.memchr-2.8.3.bazel @@ -98,5 +98,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "2.8.0", + version = "2.8.3", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.mio-1.2.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.mio-1.2.2.bazel similarity index 81% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.mio-1.2.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.mio-1.2.2.bazel index ebf8f0ce0c9c..1ad9b5c83658 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.mio-1.2.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.mio-1.2.2.bazel @@ -99,111 +99,111 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.2.0", + version = "1.2.2", deps = [ - "@vendor_ts__log-0.4.29//:log", + "@vendor_ts__log-0.4.33//:log", ] + select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:aarch64-apple-ios": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:aarch64-linux-android": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [ "@vendor_ts__windows-sys-0.61.2//:windows_sys", # cfg(windows) ], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:armv7-linux-androideabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:i686-apple-darwin": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:i686-linux-android": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:i686-pc-windows-msvc": [ "@vendor_ts__windows-sys-0.61.2//:windows_sys", # cfg(windows) ], "@rules_rust//rust/platform:i686-unknown-freebsd": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:wasm32-wasip1": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) "@vendor_ts__wasi-0.11.1-wasi-snapshot-preview1//:wasi", # cfg(target_os = "wasi") ], "@rules_rust//rust/platform:wasm32-wasip1-threads": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) "@vendor_ts__wasi-0.11.1-wasi-snapshot-preview1//:wasi", # cfg(target_os = "wasi") ], "@rules_rust//rust/platform:wasm32-wasip2": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) "@vendor_ts__wasi-0.11.1-wasi-snapshot-preview1//:wasi", # cfg(target_os = "wasi") ], "@rules_rust//rust/platform:x86_64-apple-darwin": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:x86_64-apple-ios": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:x86_64-linux-android": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [ "@vendor_ts__windows-sys-0.61.2//:windows_sys", # cfg(windows) ], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], "//conditions:default": [], }), diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.mustache-0.9.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.mustache-0.9.0.bazel index 51e1d88fe23f..a68439e787f9 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.mustache-0.9.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.mustache-0.9.0.bazel @@ -96,6 +96,6 @@ rust_library( version = "0.9.0", deps = [ "@vendor_ts__log-0.3.9//:log", - "@vendor_ts__serde-1.0.228//:serde", + "@vendor_ts__serde-1.0.229//:serde", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.notify-8.2.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.notify-8.2.0.bazel index 41a689289f08..1482ebc65f17 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.notify-8.2.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.notify-8.2.0.bazel @@ -100,111 +100,111 @@ rust_library( }), version = "8.2.0", deps = [ - "@vendor_ts__libc-0.2.186//:libc", - "@vendor_ts__log-0.4.29//:log", + "@vendor_ts__libc-0.2.189//:libc", + "@vendor_ts__log-0.4.33//:log", "@vendor_ts__notify-types-2.1.0//:notify_types", "@vendor_ts__walkdir-2.5.0//:walkdir", ] + select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [ - "@vendor_ts__bitflags-2.11.1//:bitflags", # cfg(target_os = "macos") + "@vendor_ts__bitflags-2.13.1//:bitflags", # cfg(target_os = "macos") "@vendor_ts__fsevent-sys-4.1.0//:fsevent_sys", # aarch64-apple-darwin ], "@rules_rust//rust/platform:aarch64-apple-ios": [ - "@vendor_ts__kqueue-1.1.1//:kqueue", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) - "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) + "@vendor_ts__kqueue-1.2.0//:kqueue", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) + "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) ], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ - "@vendor_ts__kqueue-1.1.1//:kqueue", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) - "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) + "@vendor_ts__kqueue-1.2.0//:kqueue", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) + "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) ], "@rules_rust//rust/platform:aarch64-linux-android": [ "@vendor_ts__inotify-0.11.1//:inotify", # cfg(any(target_os = "linux", target_os = "android")) - "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [ "@vendor_ts__windows-sys-0.60.2//:windows_sys", # cfg(windows) ], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [ "@vendor_ts__inotify-0.11.1//:inotify", # cfg(any(target_os = "linux", target_os = "android")) - "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [ "@vendor_ts__inotify-0.11.1//:inotify", # cfg(any(target_os = "linux", target_os = "android")) - "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [ "@vendor_ts__inotify-0.11.1//:inotify", # cfg(any(target_os = "linux", target_os = "android")) - "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [ "@vendor_ts__inotify-0.11.1//:inotify", # cfg(any(target_os = "linux", target_os = "android")) - "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], "@rules_rust//rust/platform:armv7-linux-androideabi": [ "@vendor_ts__inotify-0.11.1//:inotify", # cfg(any(target_os = "linux", target_os = "android")) - "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [ "@vendor_ts__inotify-0.11.1//:inotify", # cfg(any(target_os = "linux", target_os = "android")) - "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], "@rules_rust//rust/platform:i686-apple-darwin": [ - "@vendor_ts__bitflags-2.11.1//:bitflags", # cfg(target_os = "macos") + "@vendor_ts__bitflags-2.13.1//:bitflags", # cfg(target_os = "macos") "@vendor_ts__fsevent-sys-4.1.0//:fsevent_sys", # i686-apple-darwin ], "@rules_rust//rust/platform:i686-linux-android": [ "@vendor_ts__inotify-0.11.1//:inotify", # cfg(any(target_os = "linux", target_os = "android")) - "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], "@rules_rust//rust/platform:i686-pc-windows-msvc": [ "@vendor_ts__windows-sys-0.60.2//:windows_sys", # cfg(windows) ], "@rules_rust//rust/platform:i686-unknown-freebsd": [ - "@vendor_ts__kqueue-1.1.1//:kqueue", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) - "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) + "@vendor_ts__kqueue-1.2.0//:kqueue", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) + "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) ], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ "@vendor_ts__inotify-0.11.1//:inotify", # cfg(any(target_os = "linux", target_os = "android")) - "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ "@vendor_ts__inotify-0.11.1//:inotify", # cfg(any(target_os = "linux", target_os = "android")) - "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [ "@vendor_ts__inotify-0.11.1//:inotify", # cfg(any(target_os = "linux", target_os = "android")) - "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ "@vendor_ts__inotify-0.11.1//:inotify", # cfg(any(target_os = "linux", target_os = "android")) - "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], "@rules_rust//rust/platform:x86_64-apple-darwin": [ - "@vendor_ts__bitflags-2.11.1//:bitflags", # cfg(target_os = "macos") + "@vendor_ts__bitflags-2.13.1//:bitflags", # cfg(target_os = "macos") "@vendor_ts__fsevent-sys-4.1.0//:fsevent_sys", # x86_64-apple-darwin ], "@rules_rust//rust/platform:x86_64-apple-ios": [ - "@vendor_ts__kqueue-1.1.1//:kqueue", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) - "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) + "@vendor_ts__kqueue-1.2.0//:kqueue", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) + "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) ], "@rules_rust//rust/platform:x86_64-linux-android": [ "@vendor_ts__inotify-0.11.1//:inotify", # cfg(any(target_os = "linux", target_os = "android")) - "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [ "@vendor_ts__windows-sys-0.60.2//:windows_sys", # cfg(windows) ], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [ - "@vendor_ts__kqueue-1.1.1//:kqueue", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) - "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) + "@vendor_ts__kqueue-1.2.0//:kqueue", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) + "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) ], "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [ "@vendor_ts__inotify-0.11.1//:inotify", # cfg(any(target_os = "linux", target_os = "android")) - "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [ "@vendor_ts__inotify-0.11.1//:inotify", # cfg(any(target_os = "linux", target_os = "android")) - "@vendor_ts__mio-1.2.0//:mio", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], "//conditions:default": [], }), diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.notify-types-2.1.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.notify-types-2.1.0.bazel index d10108728e0d..1a477ca099d2 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.notify-types-2.1.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.notify-types-2.1.0.bazel @@ -95,6 +95,6 @@ rust_library( }), version = "2.1.0", deps = [ - "@vendor_ts__bitflags-2.11.1//:bitflags", + "@vendor_ts__bitflags-2.13.1//:bitflags", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num_cpus-1.17.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num_cpus-1.17.0.bazel index 86f976884b33..6fd8a4443f36 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num_cpus-1.17.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num_cpus-1.17.0.bazel @@ -96,118 +96,118 @@ rust_library( version = "1.17.0", deps = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:aarch64-apple-ios": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:aarch64-linux-android": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:aarch64-unknown-uefi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:armv7-linux-androideabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:i686-apple-darwin": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:i686-linux-android": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:i686-unknown-freebsd": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:thumbv7em-none-eabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:wasm32-unknown-unknown": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:wasm32-wasip1": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:wasm32-wasip1-threads": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:wasm32-wasip2": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:x86_64-apple-darwin": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:x86_64-apple-ios": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:x86_64-linux-android": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:x86_64-unknown-none": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "@rules_rust//rust/platform:x86_64-unknown-uefi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(not(windows)) + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], "//conditions:default": [], }), diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num_threads-0.1.7.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num_threads-0.1.7.bazel index 2ea3545ef12e..d87021f58723 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num_threads-0.1.7.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num_threads-0.1.7.bazel @@ -96,28 +96,28 @@ rust_library( version = "0.1.7", deps = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd")) ], "@rules_rust//rust/platform:aarch64-apple-ios": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd")) ], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd")) ], "@rules_rust//rust/platform:i686-apple-darwin": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd")) ], "@rules_rust//rust/platform:i686-unknown-freebsd": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd")) ], "@rules_rust//rust/platform:x86_64-apple-darwin": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd")) ], "@rules_rust//rust/platform:x86_64-apple-ios": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd")) ], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd")) ], "//conditions:default": [], }), diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.os_str_bytes-7.2.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.os_str_bytes-7.2.0.bazel index 7d8571887f0a..206786264927 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.os_str_bytes-7.2.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.os_str_bytes-7.2.0.bazel @@ -100,6 +100,6 @@ rust_library( }), version = "7.2.0", deps = [ - "@vendor_ts__memchr-2.8.0//:memchr", + "@vendor_ts__memchr-2.8.3//:memchr", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.parking_lot_core-0.9.12.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.parking_lot_core-0.9.12.bazel index 9b68b08ea4d9..fbfb4387a523 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.parking_lot_core-0.9.12.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.parking_lot_core-0.9.12.bazel @@ -101,97 +101,97 @@ rust_library( deps = [ "@vendor_ts__cfg-if-1.0.4//:cfg_if", "@vendor_ts__parking_lot_core-0.9.12//:build_script_build", - "@vendor_ts__smallvec-1.15.1//:smallvec", + "@vendor_ts__smallvec-1.15.2//:smallvec", ] + select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-apple-ios": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-linux-android": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [ "@vendor_ts__windows-link-0.2.1//:windows_link", # cfg(windows) ], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:armv7-linux-androideabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:i686-apple-darwin": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:i686-linux-android": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:i686-pc-windows-msvc": [ "@vendor_ts__windows-link-0.2.1//:windows_link", # cfg(windows) ], "@rules_rust//rust/platform:i686-unknown-freebsd": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-apple-darwin": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-apple-ios": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-linux-android": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [ "@vendor_ts__windows-link-0.2.1//:windows_link", # cfg(windows) ], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "//conditions:default": [], }), diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pear_codegen-0.2.9.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pear_codegen-0.2.9.bazel index 6badf66e2aef..75840ed1ca3a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pear_codegen-0.2.9.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pear_codegen-0.2.9.bazel @@ -95,9 +95,9 @@ rust_proc_macro( }), version = "0.2.9", deps = [ - "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", + "@vendor_ts__proc-macro2-1.0.107//:proc_macro2", "@vendor_ts__proc-macro2-diagnostics-0.10.1//:proc_macro2_diagnostics", - "@vendor_ts__quote-1.0.45//:quote", - "@vendor_ts__syn-2.0.117//:syn", + "@vendor_ts__quote-1.0.47//:quote", + "@vendor_ts__syn-2.0.119//:syn", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.perf-event-0.4.8.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.perf-event-0.4.8.bazel index b053be48bb28..42e572ce51f4 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.perf-event-0.4.8.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.perf-event-0.4.8.bazel @@ -99,7 +99,7 @@ rust_library( }), version = "0.4.8", deps = [ - "@vendor_ts__libc-0.2.186//:libc", + "@vendor_ts__libc-0.2.189//:libc", "@vendor_ts__perf-event-open-sys-4.0.0//:perf_event_open_sys", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.perf-event-open-sys-4.0.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.perf-event-open-sys-4.0.0.bazel index 61d131547c16..edcf803614c3 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.perf-event-open-sys-4.0.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.perf-event-open-sys-4.0.0.bazel @@ -95,6 +95,6 @@ rust_library( }), version = "4.0.0", deps = [ - "@vendor_ts__libc-0.2.186//:libc", + "@vendor_ts__libc-0.2.189//:libc", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.portable-atomic-1.13.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.portable-atomic-1.14.0.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.portable-atomic-1.13.1.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.portable-atomic-1.14.0.bazel index 1018f79e9d4b..5b2d4519e51d 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.portable-atomic-1.13.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.portable-atomic-1.14.0.bazel @@ -101,9 +101,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.13.1", + version = "1.14.0", deps = [ - "@vendor_ts__portable-atomic-1.13.1//:build_script_build", + "@vendor_ts__portable-atomic-1.14.0//:build_script_build", ], ) @@ -159,7 +159,7 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "1.13.1", + version = "1.14.0", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.atomic-polyfill-1.0.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.portable-atomic-util-0.2.7.bazel similarity index 93% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.atomic-polyfill-1.0.3.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.portable-atomic-util-0.2.7.bazel index f20f39c53dca..6cededf7ee44 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.atomic-polyfill-1.0.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.portable-atomic-util-0.2.7.bazel @@ -21,7 +21,7 @@ cargo_toml_env_vars( ) rust_library( - name = "atomic_polyfill", + name = "portable_atomic_util", srcs = glob( include = ["**/*.rs"], allow_empty = True, @@ -39,7 +39,7 @@ rust_library( ], ), crate_root = "src/lib.rs", - edition = "2021", + edition = "2018", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -48,7 +48,7 @@ rust_library( ], tags = [ "cargo-bazel", - "crate-name=atomic-polyfill", + "crate-name=portable-atomic-util", "manual", "noclippy", "norustfmt", @@ -97,10 +97,10 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.3", + version = "0.2.7", deps = [ - "@vendor_ts__atomic-polyfill-1.0.3//:build_script_build", - "@vendor_ts__critical-section-1.2.0//:critical_section", + "@vendor_ts__portable-atomic-1.14.0//:portable_atomic", + "@vendor_ts__portable-atomic-util-0.2.7//:build_script_build", ], ) @@ -137,8 +137,8 @@ cargo_build_script( "WORKSPACE.bazel", ], ), - edition = "2021", - pkg_name = "atomic-polyfill", + edition = "2018", + pkg_name = "portable-atomic-util", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -147,12 +147,12 @@ cargo_build_script( ], tags = [ "cargo-bazel", - "crate-name=atomic-polyfill", + "crate-name=portable-atomic-util", "manual", "noclippy", "norustfmt", ], - version = "1.0.3", + version = "0.2.7", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.postcard-1.1.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.postcard-1.1.3.bazel index 8a9c9489923b..9f0c0ad00902 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.postcard-1.1.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.postcard-1.1.3.bazel @@ -36,9 +36,6 @@ rust_library( ), crate_features = [ "alloc", - "default", - "heapless", - "heapless-cas", ], crate_root = "src/lib.rs", edition = "2021", @@ -102,7 +99,6 @@ rust_library( version = "1.1.3", deps = [ "@vendor_ts__cobs-0.3.0//:cobs", - "@vendor_ts__heapless-0.7.17//:heapless", - "@vendor_ts__serde-1.0.228//:serde", + "@vendor_ts__serde-1.0.229//:serde", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.prettyplease-0.2.37.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.prettyplease-0.2.37.bazel deleted file mode 100644 index ed6e293e5d6b..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.prettyplease-0.2.37.bazel +++ /dev/null @@ -1,165 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load( - "@rules_rust//cargo:defs.bzl", - "cargo_build_script", - "cargo_toml_env_vars", -) -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "prettyplease", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_root = "src/lib.rs", - edition = "2021", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=prettyplease", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.2.37", - deps = [ - "@vendor_ts__prettyplease-0.2.37//:build_script_build", - "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", - "@vendor_ts__syn-2.0.117//:syn", - ], -) - -cargo_build_script( - name = "_bs", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - "**/*.rs", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_name = "build_script_build", - crate_root = "build.rs", - data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - edition = "2021", - links = "prettyplease02", - pkg_name = "prettyplease", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=prettyplease", - "manual", - "noclippy", - "norustfmt", - ], - version = "0.2.37", - visibility = ["//visibility:private"], -) - -alias( - name = "build_script_build", - actual = ":_bs", - tags = ["manual"], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.proc-macro2-1.0.106.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.proc-macro2-1.0.107.bazel similarity index 97% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.proc-macro2-1.0.106.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.proc-macro2-1.0.107.bazel index dec96ff20b92..a376ba7ae931 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.proc-macro2-1.0.106.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.proc-macro2-1.0.107.bazel @@ -101,9 +101,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.106", + version = "1.0.107", deps = [ - "@vendor_ts__proc-macro2-1.0.106//:build_script_build", + "@vendor_ts__proc-macro2-1.0.107//:build_script_build", "@vendor_ts__unicode-ident-1.0.24//:unicode_ident", ], ) @@ -160,7 +160,7 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "1.0.106", + version = "1.0.107", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.proc-macro2-diagnostics-0.10.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.proc-macro2-diagnostics-0.10.1.bazel index 334933c92a6a..cd504d1c1e83 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.proc-macro2-diagnostics-0.10.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.proc-macro2-diagnostics-0.10.1.bazel @@ -104,10 +104,10 @@ rust_library( }), version = "0.10.1", deps = [ - "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", + "@vendor_ts__proc-macro2-1.0.107//:proc_macro2", "@vendor_ts__proc-macro2-diagnostics-0.10.1//:build_script_build", - "@vendor_ts__quote-1.0.45//:quote", - "@vendor_ts__syn-2.0.117//:syn", + "@vendor_ts__quote-1.0.47//:quote", + "@vendor_ts__syn-2.0.119//:syn", "@vendor_ts__yansi-1.0.1//:yansi", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.quote-1.0.45.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.quote-1.0.47.bazel similarity index 97% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.quote-1.0.45.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.quote-1.0.47.bazel index 8ffcb2477317..2223ac8ce1a7 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.quote-1.0.45.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.quote-1.0.47.bazel @@ -101,10 +101,10 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.45", + version = "1.0.47", deps = [ - "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", - "@vendor_ts__quote-1.0.45//:build_script_build", + "@vendor_ts__proc-macro2-1.0.107//:proc_macro2", + "@vendor_ts__quote-1.0.47//:build_script_build", ], ) @@ -160,7 +160,7 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "1.0.45", + version = "1.0.47", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_abi-0.143.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_abi-0.166.0.bazel similarity index 92% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_abi-0.143.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_abi-0.166.0.bazel index c26dd82ee19d..2e7aaf27a252 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_abi-0.143.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_abi-0.166.0.bazel @@ -23,8 +23,8 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra-ap-rustc_hashes-0.143.0//:ra_ap_rustc_hashes": "rustc_hashes", - "@vendor_ts__ra-ap-rustc_index-0.143.0//:ra_ap_rustc_index": "rustc_index", + "@vendor_ts__ra-ap-rustc_hashes-0.166.0//:ra_ap_rustc_hashes": "rustc_hashes", + "@vendor_ts__ra-ap-rustc_index-0.166.0//:ra_ap_rustc_index": "rustc_index", }, compile_data = glob( include = ["**"], @@ -97,11 +97,11 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.143.0", + version = "0.166.0", deps = [ - "@vendor_ts__bitflags-2.11.1//:bitflags", - "@vendor_ts__ra-ap-rustc_hashes-0.143.0//:ra_ap_rustc_hashes", - "@vendor_ts__ra-ap-rustc_index-0.143.0//:ra_ap_rustc_index", + "@vendor_ts__bitflags-2.13.1//:bitflags", + "@vendor_ts__ra-ap-rustc_hashes-0.166.0//:ra_ap_rustc_hashes", + "@vendor_ts__ra-ap-rustc_index-0.166.0//:ra_ap_rustc_index", "@vendor_ts__tracing-0.1.44//:tracing", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_ast_ir-0.143.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_ast_ir-0.166.0.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_ast_ir-0.143.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_ast_ir-0.166.0.bazel index 3dfb4af1d544..0bfaff92b318 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_ast_ir-0.143.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_ast_ir-0.166.0.bazel @@ -93,5 +93,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.143.0", + version = "0.166.0", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_hashes-0.143.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_hashes-0.166.0.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_hashes-0.143.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_hashes-0.166.0.bazel index 6b0e793e07f6..432d995d819f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_hashes-0.143.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_hashes-0.166.0.bazel @@ -93,7 +93,7 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.143.0", + version = "0.166.0", deps = [ "@vendor_ts__rustc-stable-hash-0.1.2//:rustc_stable_hash", ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index-0.143.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index-0.166.0.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index-0.143.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index-0.166.0.bazel index db5b0ccbd889..dc39203f8f53 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index-0.143.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index-0.166.0.bazel @@ -23,7 +23,7 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra-ap-rustc_index_macros-0.143.0//:ra_ap_rustc_index_macros": "rustc_index_macros", + "@vendor_ts__ra-ap-rustc_index_macros-0.166.0//:ra_ap_rustc_index_macros": "rustc_index_macros", }, compile_data = glob( include = ["**"], @@ -40,7 +40,7 @@ rust_library( crate_root = "src/lib.rs", edition = "2024", proc_macro_deps = [ - "@vendor_ts__ra-ap-rustc_index_macros-0.143.0//:ra_ap_rustc_index_macros", + "@vendor_ts__ra-ap-rustc_index_macros-0.166.0//:ra_ap_rustc_index_macros", ], rustc_env_files = [ ":cargo_toml_env_vars", @@ -99,5 +99,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.143.0", + version = "0.166.0", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index_macros-0.143.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index_macros-0.166.0.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index_macros-0.143.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index_macros-0.166.0.bazel index 13c12f07ce27..b36ae77212bf 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index_macros-0.143.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index_macros-0.166.0.bazel @@ -93,10 +93,10 @@ rust_proc_macro( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.143.0", + version = "0.166.0", deps = [ - "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", - "@vendor_ts__quote-1.0.45//:quote", - "@vendor_ts__syn-2.0.117//:syn", + "@vendor_ts__proc-macro2-1.0.107//:proc_macro2", + "@vendor_ts__quote-1.0.47//:quote", + "@vendor_ts__syn-2.0.119//:syn", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_lexer-0.143.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_lexer-0.166.0.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_lexer-0.143.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_lexer-0.166.0.bazel index 383c1dcd3595..52ecd0d88a1c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_lexer-0.143.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_lexer-0.166.0.bazel @@ -93,10 +93,10 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.143.0", + version = "0.166.0", deps = [ - "@vendor_ts__memchr-2.8.0//:memchr", + "@vendor_ts__memchr-2.8.3//:memchr", + "@vendor_ts__unicode-ident-1.0.24//:unicode_ident", "@vendor_ts__unicode-properties-0.1.4//:unicode_properties", - "@vendor_ts__unicode-xid-0.2.6//:unicode_xid", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_next_trait_solver-0.143.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_next_trait_solver-0.166.0.bazel similarity index 91% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_next_trait_solver-0.143.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_next_trait_solver-0.166.0.bazel index 8d9cd2fa75a1..da427cb9749a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_next_trait_solver-0.143.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_next_trait_solver-0.166.0.bazel @@ -23,9 +23,9 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra-ap-rustc_index-0.143.0//:ra_ap_rustc_index": "rustc_index", - "@vendor_ts__ra-ap-rustc_type_ir-0.143.0//:ra_ap_rustc_type_ir": "rustc_type_ir", - "@vendor_ts__ra-ap-rustc_type_ir_macros-0.143.0//:ra_ap_rustc_type_ir_macros": "rustc_type_ir_macros", + "@vendor_ts__ra-ap-rustc_index-0.166.0//:ra_ap_rustc_index": "rustc_index", + "@vendor_ts__ra-ap-rustc_type_ir-0.166.0//:ra_ap_rustc_type_ir": "rustc_type_ir", + "@vendor_ts__ra-ap-rustc_type_ir_macros-0.166.0//:ra_ap_rustc_type_ir_macros": "rustc_type_ir_macros", }, compile_data = glob( include = ["**"], @@ -43,7 +43,7 @@ rust_library( edition = "2024", proc_macro_deps = [ "@vendor_ts__derive-where-1.6.1//:derive_where", - "@vendor_ts__ra-ap-rustc_type_ir_macros-0.143.0//:ra_ap_rustc_type_ir_macros", + "@vendor_ts__ra-ap-rustc_type_ir_macros-0.166.0//:ra_ap_rustc_type_ir_macros", ], rustc_env_files = [ ":cargo_toml_env_vars", @@ -102,10 +102,10 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.143.0", + version = "0.166.0", deps = [ - "@vendor_ts__ra-ap-rustc_index-0.143.0//:ra_ap_rustc_index", - "@vendor_ts__ra-ap-rustc_type_ir-0.143.0//:ra_ap_rustc_type_ir", + "@vendor_ts__ra-ap-rustc_index-0.166.0//:ra_ap_rustc_index", + "@vendor_ts__ra-ap-rustc_type_ir-0.166.0//:ra_ap_rustc_type_ir", "@vendor_ts__tracing-0.1.44//:tracing", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_parse_format-0.143.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_parse_format-0.166.0.bazel similarity index 95% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_parse_format-0.143.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_parse_format-0.166.0.bazel index 9b4e436a3cad..da20d1478623 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_parse_format-0.143.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_parse_format-0.166.0.bazel @@ -23,7 +23,7 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra-ap-rustc_lexer-0.143.0//:ra_ap_rustc_lexer": "rustc_lexer", + "@vendor_ts__ra-ap-rustc_lexer-0.166.0//:ra_ap_rustc_lexer": "rustc_lexer", }, compile_data = glob( include = ["**"], @@ -96,9 +96,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.143.0", + version = "0.166.0", deps = [ - "@vendor_ts__ra-ap-rustc_lexer-0.143.0//:ra_ap_rustc_lexer", - "@vendor_ts__rustc-literal-escaper-0.0.5//:rustc_literal_escaper", + "@vendor_ts__ra-ap-rustc_lexer-0.166.0//:ra_ap_rustc_lexer", + "@vendor_ts__rustc-literal-escaper-0.0.7//:rustc_literal_escaper", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_pattern_analysis-0.143.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_pattern_analysis-0.166.0.bazel similarity index 94% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_pattern_analysis-0.143.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_pattern_analysis-0.166.0.bazel index 2f8087c18312..64959c0b3d4c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_pattern_analysis-0.143.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_pattern_analysis-0.166.0.bazel @@ -23,7 +23,7 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra-ap-rustc_index-0.143.0//:ra_ap_rustc_index": "rustc_index", + "@vendor_ts__ra-ap-rustc_index-0.166.0//:ra_ap_rustc_index": "rustc_index", }, compile_data = glob( include = ["**"], @@ -96,12 +96,12 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.143.0", + version = "0.166.0", deps = [ - "@vendor_ts__ra-ap-rustc_index-0.143.0//:ra_ap_rustc_index", - "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", + "@vendor_ts__ra-ap-rustc_index-0.166.0//:ra_ap_rustc_index", + "@vendor_ts__rustc-hash-2.1.3//:rustc_hash", "@vendor_ts__rustc_apfloat-0.2.3-llvm-462a31f5a5ab//:rustc_apfloat", - "@vendor_ts__smallvec-1.15.1//:smallvec", + "@vendor_ts__smallvec-1.15.2//:smallvec", "@vendor_ts__tracing-0.1.44//:tracing", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_type_ir-0.143.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_type_ir-0.166.0.bazel similarity index 84% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_type_ir-0.143.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_type_ir-0.166.0.bazel index 665970571fdc..9e98e67c3514 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_type_ir-0.143.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_type_ir-0.166.0.bazel @@ -23,9 +23,10 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra-ap-rustc_ast_ir-0.143.0//:ra_ap_rustc_ast_ir": "rustc_ast_ir", - "@vendor_ts__ra-ap-rustc_index-0.143.0//:ra_ap_rustc_index": "rustc_index", - "@vendor_ts__ra-ap-rustc_type_ir_macros-0.143.0//:ra_ap_rustc_type_ir_macros": "rustc_type_ir_macros", + "@vendor_ts__ra-ap-rustc_abi-0.166.0//:ra_ap_rustc_abi": "rustc_abi", + "@vendor_ts__ra-ap-rustc_ast_ir-0.166.0//:ra_ap_rustc_ast_ir": "rustc_ast_ir", + "@vendor_ts__ra-ap-rustc_index-0.166.0//:ra_ap_rustc_index": "rustc_index", + "@vendor_ts__ra-ap-rustc_type_ir_macros-0.166.0//:ra_ap_rustc_type_ir_macros": "rustc_type_ir_macros", }, compile_data = glob( include = ["**"], @@ -43,7 +44,7 @@ rust_library( edition = "2024", proc_macro_deps = [ "@vendor_ts__derive-where-1.6.1//:derive_where", - "@vendor_ts__ra-ap-rustc_type_ir_macros-0.143.0//:ra_ap_rustc_type_ir_macros", + "@vendor_ts__ra-ap-rustc_type_ir_macros-0.166.0//:ra_ap_rustc_type_ir_macros", ], rustc_env_files = [ ":cargo_toml_env_vars", @@ -102,17 +103,18 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.143.0", + version = "0.166.0", deps = [ - "@vendor_ts__arrayvec-0.7.6//:arrayvec", - "@vendor_ts__bitflags-2.11.1//:bitflags", + "@vendor_ts__arrayvec-0.7.8//:arrayvec", + "@vendor_ts__bitflags-2.13.1//:bitflags", "@vendor_ts__ena-0.14.4//:ena", "@vendor_ts__indexmap-2.14.0//:indexmap", - "@vendor_ts__ra-ap-rustc_ast_ir-0.143.0//:ra_ap_rustc_ast_ir", - "@vendor_ts__ra-ap-rustc_index-0.143.0//:ra_ap_rustc_index", - "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", - "@vendor_ts__smallvec-1.15.1//:smallvec", - "@vendor_ts__thin-vec-0.2.18//:thin_vec", + "@vendor_ts__ra-ap-rustc_abi-0.166.0//:ra_ap_rustc_abi", + "@vendor_ts__ra-ap-rustc_ast_ir-0.166.0//:ra_ap_rustc_ast_ir", + "@vendor_ts__ra-ap-rustc_index-0.166.0//:ra_ap_rustc_index", + "@vendor_ts__rustc-hash-2.1.3//:rustc_hash", + "@vendor_ts__smallvec-1.15.2//:smallvec", + "@vendor_ts__thin-vec-0.2.19//:thin_vec", "@vendor_ts__tracing-0.1.44//:tracing", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_type_ir_macros-0.143.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_type_ir_macros-0.166.0.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_type_ir_macros-0.143.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_type_ir_macros-0.166.0.bazel index 899303af5f3f..b0979e32e942 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_type_ir_macros-0.143.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_type_ir_macros-0.166.0.bazel @@ -93,11 +93,11 @@ rust_proc_macro( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.143.0", + version = "0.166.0", deps = [ - "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", - "@vendor_ts__quote-1.0.45//:quote", - "@vendor_ts__syn-2.0.117//:syn", + "@vendor_ts__proc-macro2-1.0.107//:proc_macro2", + "@vendor_ts__quote-1.0.47//:quote", + "@vendor_ts__syn-2.0.119//:syn", "@vendor_ts__synstructure-0.13.2//:synstructure", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_base_db-0.0.328.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_base_db-0.0.347.bazel similarity index 80% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_base_db-0.0.328.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_base_db-0.0.347.bazel index 42da0d0298c4..54abbfc5e2f5 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_base_db-0.0.328.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_base_db-0.0.347.bazel @@ -23,12 +23,11 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_cfg-0.0.328//:ra_ap_cfg": "cfg", - "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern": "intern", - "@vendor_ts__ra_ap_query-group-macro-0.0.328//:ra_ap_query_group_macro": "query_group", - "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span": "span", - "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax": "syntax", - "@vendor_ts__ra_ap_vfs-0.0.328//:ra_ap_vfs": "vfs", + "@vendor_ts__ra_ap_cfg-0.0.347//:ra_ap_cfg": "cfg", + "@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern": "intern", + "@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span": "span", + "@vendor_ts__ra_ap_syntax-0.0.347//:ra_ap_syntax": "syntax", + "@vendor_ts__ra_ap_vfs-0.0.347//:ra_ap_vfs": "vfs", }, compile_data = glob( include = ["**"], @@ -48,8 +47,7 @@ rust_library( crate_root = "src/lib.rs", edition = "2024", proc_macro_deps = [ - "@vendor_ts__ra_ap_query-group-macro-0.0.328//:ra_ap_query_group_macro", - "@vendor_ts__salsa-macros-0.25.2//:salsa_macros", + "@vendor_ts__salsa-macros-0.28.2//:salsa_macros", ], rustc_env_files = [ ":cargo_toml_env_vars", @@ -108,20 +106,20 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.328", + version = "0.0.347", deps = [ - "@vendor_ts__dashmap-6.1.0//:dashmap", + "@vendor_ts__dashmap-6.2.1//:dashmap", "@vendor_ts__indexmap-2.14.0//:indexmap", "@vendor_ts__la-arena-0.3.1//:la_arena", - "@vendor_ts__ra_ap_cfg-0.0.328//:ra_ap_cfg", - "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern", - "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span", - "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax", - "@vendor_ts__ra_ap_vfs-0.0.328//:ra_ap_vfs", - "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", - "@vendor_ts__salsa-0.25.2//:salsa", + "@vendor_ts__ra_ap_cfg-0.0.347//:ra_ap_cfg", + "@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern", + "@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span", + "@vendor_ts__ra_ap_syntax-0.0.347//:ra_ap_syntax", + "@vendor_ts__ra_ap_vfs-0.0.347//:ra_ap_vfs", + "@vendor_ts__rustc-hash-2.1.3//:rustc_hash", + "@vendor_ts__salsa-0.28.2//:salsa", "@vendor_ts__semver-1.0.28//:semver", "@vendor_ts__tracing-0.1.44//:tracing", - "@vendor_ts__triomphe-0.1.15//:triomphe", + "@vendor_ts__triomphe-0.1.16//:triomphe", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_cfg-0.0.328.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_cfg-0.0.347.bazel similarity index 90% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_cfg-0.0.328.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_cfg-0.0.347.bazel index e02c90697076..fd4c15f1c6ea 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_cfg-0.0.328.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_cfg-0.0.347.bazel @@ -23,9 +23,9 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern": "intern", - "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax": "syntax", - "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt": "tt", + "@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern": "intern", + "@vendor_ts__ra_ap_syntax-0.0.347//:ra_ap_syntax": "syntax", + "@vendor_ts__ra_ap_tt-0.0.347//:ra_ap_tt": "tt", }, compile_data = glob( include = ["**"], @@ -103,12 +103,12 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.328", + version = "0.0.347", deps = [ - "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern", - "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax", - "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt", - "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", + "@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern", + "@vendor_ts__ra_ap_syntax-0.0.347//:ra_ap_syntax", + "@vendor_ts__ra_ap_tt-0.0.347//:ra_ap_tt", + "@vendor_ts__rustc-hash-2.1.3//:rustc_hash", "@vendor_ts__tracing-0.1.44//:tracing", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_edition-0.0.328.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_edition-0.0.347.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_edition-0.0.328.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_edition-0.0.347.bazel index 1fa96a118d49..397dcf35e5c5 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_edition-0.0.328.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_edition-0.0.347.bazel @@ -93,5 +93,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.328", + version = "0.0.347", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir-0.0.328.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir-0.0.347.bazel similarity index 70% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir-0.0.328.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir-0.0.347.bazel index d8c848c0555c..e1a101de8255 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir-0.0.328.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir-0.0.347.bazel @@ -23,16 +23,16 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db": "base_db", - "@vendor_ts__ra_ap_cfg-0.0.328//:ra_ap_cfg": "cfg", - "@vendor_ts__ra_ap_hir_def-0.0.328//:ra_ap_hir_def": "hir_def", - "@vendor_ts__ra_ap_hir_expand-0.0.328//:ra_ap_hir_expand": "hir_expand", - "@vendor_ts__ra_ap_hir_ty-0.0.328//:ra_ap_hir_ty": "hir_ty", - "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern": "intern", - "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span": "span", - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", - "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax": "syntax", - "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt": "tt", + "@vendor_ts__ra_ap_base_db-0.0.347//:ra_ap_base_db": "base_db", + "@vendor_ts__ra_ap_cfg-0.0.347//:ra_ap_cfg": "cfg", + "@vendor_ts__ra_ap_hir_def-0.0.347//:ra_ap_hir_def": "hir_def", + "@vendor_ts__ra_ap_hir_expand-0.0.347//:ra_ap_hir_expand": "hir_expand", + "@vendor_ts__ra_ap_hir_ty-0.0.347//:ra_ap_hir_ty": "hir_ty", + "@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern": "intern", + "@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span": "span", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx": "stdx", + "@vendor_ts__ra_ap_syntax-0.0.347//:ra_ap_syntax": "syntax", + "@vendor_ts__ra_ap_tt-0.0.347//:ra_ap_tt": "tt", }, compile_data = glob( include = ["**"], @@ -105,26 +105,28 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.328", + version = "0.0.347", deps = [ - "@vendor_ts__arrayvec-0.7.6//:arrayvec", - "@vendor_ts__either-1.16.0//:either", - "@vendor_ts__itertools-0.14.0//:itertools", - "@vendor_ts__ra-ap-rustc_type_ir-0.143.0//:ra_ap_rustc_type_ir", - "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db", - "@vendor_ts__ra_ap_cfg-0.0.328//:ra_ap_cfg", - "@vendor_ts__ra_ap_hir_def-0.0.328//:ra_ap_hir_def", - "@vendor_ts__ra_ap_hir_expand-0.0.328//:ra_ap_hir_expand", - "@vendor_ts__ra_ap_hir_ty-0.0.328//:ra_ap_hir_ty", - "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern", - "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span", - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", - "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax", - "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt", - "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", - "@vendor_ts__serde_json-1.0.150//:serde_json", - "@vendor_ts__smallvec-1.15.1//:smallvec", + "@vendor_ts__arrayvec-0.7.8//:arrayvec", + "@vendor_ts__either-1.17.0//:either", + "@vendor_ts__itertools-0.15.0//:itertools", + "@vendor_ts__la-arena-0.3.1//:la_arena", + "@vendor_ts__ra-ap-rustc_type_ir-0.166.0//:ra_ap_rustc_type_ir", + "@vendor_ts__ra_ap_base_db-0.0.347//:ra_ap_base_db", + "@vendor_ts__ra_ap_cfg-0.0.347//:ra_ap_cfg", + "@vendor_ts__ra_ap_hir_def-0.0.347//:ra_ap_hir_def", + "@vendor_ts__ra_ap_hir_expand-0.0.347//:ra_ap_hir_expand", + "@vendor_ts__ra_ap_hir_ty-0.0.347//:ra_ap_hir_ty", + "@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern", + "@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx", + "@vendor_ts__ra_ap_syntax-0.0.347//:ra_ap_syntax", + "@vendor_ts__ra_ap_tt-0.0.347//:ra_ap_tt", + "@vendor_ts__rustc-hash-2.1.3//:rustc_hash", + "@vendor_ts__salsa-0.28.2//:salsa", + "@vendor_ts__serde_json-1.0.151//:serde_json", + "@vendor_ts__smallvec-1.15.2//:smallvec", "@vendor_ts__tracing-0.1.44//:tracing", - "@vendor_ts__triomphe-0.1.15//:triomphe", + "@vendor_ts__triomphe-0.1.16//:triomphe", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_def-0.0.328.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_def-0.0.347.bazel similarity index 70% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_def-0.0.328.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_def-0.0.347.bazel index 04e4a11e373b..3c601559cd65 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_def-0.0.328.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_def-0.0.347.bazel @@ -23,16 +23,15 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db": "base_db", - "@vendor_ts__ra_ap_cfg-0.0.328//:ra_ap_cfg": "cfg", - "@vendor_ts__ra_ap_hir_expand-0.0.328//:ra_ap_hir_expand": "hir_expand", - "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern": "intern", - "@vendor_ts__ra_ap_query-group-macro-0.0.328//:ra_ap_query_group_macro": "query_group", - "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span": "span", - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", - "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax": "syntax", - "@vendor_ts__ra_ap_syntax-bridge-0.0.328//:ra_ap_syntax_bridge": "syntax_bridge", - "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt": "tt", + "@vendor_ts__ra_ap_base_db-0.0.347//:ra_ap_base_db": "base_db", + "@vendor_ts__ra_ap_cfg-0.0.347//:ra_ap_cfg": "cfg", + "@vendor_ts__ra_ap_hir_expand-0.0.347//:ra_ap_hir_expand": "hir_expand", + "@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern": "intern", + "@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span": "span", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx": "stdx", + "@vendor_ts__ra_ap_syntax-0.0.347//:ra_ap_syntax": "syntax", + "@vendor_ts__ra_ap_syntax-bridge-0.0.347//:ra_ap_syntax_bridge": "syntax_bridge", + "@vendor_ts__ra_ap_tt-0.0.347//:ra_ap_tt": "tt", }, compile_data = glob( include = ["**"], @@ -48,10 +47,6 @@ rust_library( ), crate_root = "src/lib.rs", edition = "2024", - proc_macro_deps = [ - "@vendor_ts__ra_ap_query-group-macro-0.0.328//:ra_ap_query_group_macro", - "@vendor_ts__salsa-macros-0.25.2//:salsa_macros", - ], rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -109,34 +104,34 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.328", + version = "0.0.347", deps = [ - "@vendor_ts__arrayvec-0.7.6//:arrayvec", - "@vendor_ts__bitflags-2.11.1//:bitflags", + "@vendor_ts__arrayvec-0.7.8//:arrayvec", + "@vendor_ts__bitflags-2.13.1//:bitflags", "@vendor_ts__cov-mark-2.2.0//:cov_mark", "@vendor_ts__drop_bomb-0.1.5//:drop_bomb", - "@vendor_ts__either-1.16.0//:either", + "@vendor_ts__either-1.17.0//:either", "@vendor_ts__fst-0.4.7//:fst", "@vendor_ts__indexmap-2.14.0//:indexmap", - "@vendor_ts__itertools-0.14.0//:itertools", + "@vendor_ts__itertools-0.15.0//:itertools", "@vendor_ts__la-arena-0.3.1//:la_arena", - "@vendor_ts__ra-ap-rustc_abi-0.143.0//:ra_ap_rustc_abi", - "@vendor_ts__ra-ap-rustc_parse_format-0.143.0//:ra_ap_rustc_parse_format", - "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db", - "@vendor_ts__ra_ap_cfg-0.0.328//:ra_ap_cfg", - "@vendor_ts__ra_ap_hir_expand-0.0.328//:ra_ap_hir_expand", - "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern", - "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span", - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", - "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax", - "@vendor_ts__ra_ap_syntax-bridge-0.0.328//:ra_ap_syntax_bridge", - "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt", - "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", + "@vendor_ts__ra-ap-rustc_abi-0.166.0//:ra_ap_rustc_abi", + "@vendor_ts__ra-ap-rustc_parse_format-0.166.0//:ra_ap_rustc_parse_format", + "@vendor_ts__ra_ap_base_db-0.0.347//:ra_ap_base_db", + "@vendor_ts__ra_ap_cfg-0.0.347//:ra_ap_cfg", + "@vendor_ts__ra_ap_hir_expand-0.0.347//:ra_ap_hir_expand", + "@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern", + "@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx", + "@vendor_ts__ra_ap_syntax-0.0.347//:ra_ap_syntax", + "@vendor_ts__ra_ap_syntax-bridge-0.0.347//:ra_ap_syntax_bridge", + "@vendor_ts__ra_ap_tt-0.0.347//:ra_ap_tt", + "@vendor_ts__rustc-hash-2.1.3//:rustc_hash", "@vendor_ts__rustc_apfloat-0.2.3-llvm-462a31f5a5ab//:rustc_apfloat", - "@vendor_ts__salsa-0.25.2//:salsa", - "@vendor_ts__smallvec-1.15.1//:smallvec", - "@vendor_ts__thin-vec-0.2.18//:thin_vec", + "@vendor_ts__salsa-0.28.2//:salsa", + "@vendor_ts__smallvec-1.15.2//:smallvec", + "@vendor_ts__thin-vec-0.2.19//:thin_vec", "@vendor_ts__tracing-0.1.44//:tracing", - "@vendor_ts__triomphe-0.1.15//:triomphe", + "@vendor_ts__triomphe-0.1.16//:triomphe", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_expand-0.0.328.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_expand-0.0.328.bazel deleted file mode 100644 index eb7d3976beef..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_expand-0.0.328.bazel +++ /dev/null @@ -1,135 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "ra_ap_hir_expand", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - aliases = { - "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db": "base_db", - "@vendor_ts__ra_ap_cfg-0.0.328//:ra_ap_cfg": "cfg", - "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern": "intern", - "@vendor_ts__ra_ap_mbe-0.0.328//:ra_ap_mbe": "mbe", - "@vendor_ts__ra_ap_parser-0.0.328//:ra_ap_parser": "parser", - "@vendor_ts__ra_ap_query-group-macro-0.0.328//:ra_ap_query_group_macro": "query_group", - "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span": "span", - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", - "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax": "syntax", - "@vendor_ts__ra_ap_syntax-bridge-0.0.328//:ra_ap_syntax_bridge": "syntax_bridge", - "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt": "tt", - }, - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_root = "src/lib.rs", - edition = "2024", - proc_macro_deps = [ - "@vendor_ts__ra_ap_query-group-macro-0.0.328//:ra_ap_query_group_macro", - "@vendor_ts__salsa-macros-0.25.2//:salsa_macros", - ], - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=ra_ap_hir_expand", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.0.328", - deps = [ - "@vendor_ts__cov-mark-2.2.0//:cov_mark", - "@vendor_ts__either-1.16.0//:either", - "@vendor_ts__itertools-0.14.0//:itertools", - "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db", - "@vendor_ts__ra_ap_cfg-0.0.328//:ra_ap_cfg", - "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern", - "@vendor_ts__ra_ap_mbe-0.0.328//:ra_ap_mbe", - "@vendor_ts__ra_ap_parser-0.0.328//:ra_ap_parser", - "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span", - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", - "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax", - "@vendor_ts__ra_ap_syntax-bridge-0.0.328//:ra_ap_syntax_bridge", - "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt", - "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", - "@vendor_ts__salsa-0.25.2//:salsa", - "@vendor_ts__smallvec-1.15.1//:smallvec", - "@vendor_ts__thin-vec-0.2.18//:thin_vec", - "@vendor_ts__tracing-0.1.44//:tracing", - "@vendor_ts__triomphe-0.1.15//:triomphe", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_expand-0.0.347.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_expand-0.0.347.bazel new file mode 100644 index 000000000000..05e4559b7447 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_expand-0.0.347.bazel @@ -0,0 +1,130 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "ra_ap_hir_expand", + srcs = glob( + include = ["**/*.rs"], + allow_empty = True, + ), + aliases = { + "@vendor_ts__ra_ap_base_db-0.0.347//:ra_ap_base_db": "base_db", + "@vendor_ts__ra_ap_cfg-0.0.347//:ra_ap_cfg": "cfg", + "@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern": "intern", + "@vendor_ts__ra_ap_mbe-0.0.347//:ra_ap_mbe": "mbe", + "@vendor_ts__ra_ap_parser-0.0.347//:ra_ap_parser": "parser", + "@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span": "span", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx": "stdx", + "@vendor_ts__ra_ap_syntax-0.0.347//:ra_ap_syntax": "syntax", + "@vendor_ts__ra_ap_syntax-bridge-0.0.347//:ra_ap_syntax_bridge": "syntax_bridge", + "@vendor_ts__ra_ap_tt-0.0.347//:ra_ap_tt": "tt", + }, + compile_data = glob( + include = ["**"], + allow_empty = True, + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2024", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + tags = [ + "cargo-bazel", + "crate-name=ra_ap_hir_expand", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], + "@rules_rust//rust/platform:aarch64-linux-android": [], + "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], + "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], + "@rules_rust//rust/platform:aarch64-unknown-uefi": [], + "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], + "@rules_rust//rust/platform:armv7-linux-androideabi": [], + "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], + "@rules_rust//rust/platform:i686-apple-darwin": [], + "@rules_rust//rust/platform:i686-linux-android": [], + "@rules_rust//rust/platform:i686-pc-windows-msvc": [], + "@rules_rust//rust/platform:i686-unknown-freebsd": [], + "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], + "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], + "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:wasm32-wasip1-threads": [], + "@rules_rust//rust/platform:wasm32-wasip2": [], + "@rules_rust//rust/platform:x86_64-apple-darwin": [], + "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-linux-android": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], + "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-none": [], + "@rules_rust//rust/platform:x86_64-unknown-uefi": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.0.347", + deps = [ + "@vendor_ts__cov-mark-2.2.0//:cov_mark", + "@vendor_ts__either-1.17.0//:either", + "@vendor_ts__itertools-0.15.0//:itertools", + "@vendor_ts__ra_ap_base_db-0.0.347//:ra_ap_base_db", + "@vendor_ts__ra_ap_cfg-0.0.347//:ra_ap_cfg", + "@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern", + "@vendor_ts__ra_ap_mbe-0.0.347//:ra_ap_mbe", + "@vendor_ts__ra_ap_parser-0.0.347//:ra_ap_parser", + "@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx", + "@vendor_ts__ra_ap_syntax-0.0.347//:ra_ap_syntax", + "@vendor_ts__ra_ap_syntax-bridge-0.0.347//:ra_ap_syntax_bridge", + "@vendor_ts__ra_ap_tt-0.0.347//:ra_ap_tt", + "@vendor_ts__rustc-hash-2.1.3//:rustc_hash", + "@vendor_ts__salsa-0.28.2//:salsa", + "@vendor_ts__smallvec-1.15.2//:smallvec", + "@vendor_ts__thin-vec-0.2.19//:thin_vec", + "@vendor_ts__tracing-0.1.44//:tracing", + "@vendor_ts__triomphe-0.1.16//:triomphe", + ], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_ty-0.0.328.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_ty-0.0.347.bazel similarity index 69% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_ty-0.0.328.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_ty-0.0.347.bazel index 4a52cf56457d..efe158fd7e5f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_ty-0.0.328.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_ty-0.0.347.bazel @@ -23,15 +23,14 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db": "base_db", - "@vendor_ts__ra_ap_hir_def-0.0.328//:ra_ap_hir_def": "hir_def", - "@vendor_ts__ra_ap_hir_expand-0.0.328//:ra_ap_hir_expand": "hir_expand", - "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern": "intern", - "@vendor_ts__ra_ap_macros-0.0.328//:ra_ap_macros": "macros", - "@vendor_ts__ra_ap_query-group-macro-0.0.328//:ra_ap_query_group_macro": "query_group", - "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span": "span", - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", - "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax": "syntax", + "@vendor_ts__ra_ap_base_db-0.0.347//:ra_ap_base_db": "base_db", + "@vendor_ts__ra_ap_hir_def-0.0.347//:ra_ap_hir_def": "hir_def", + "@vendor_ts__ra_ap_hir_expand-0.0.347//:ra_ap_hir_expand": "hir_expand", + "@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern": "intern", + "@vendor_ts__ra_ap_macros-0.0.347//:ra_ap_macros": "macros", + "@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span": "span", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx": "stdx", + "@vendor_ts__ra_ap_syntax-0.0.347//:ra_ap_syntax": "syntax", }, compile_data = glob( include = ["**"], @@ -48,10 +47,8 @@ rust_library( crate_root = "src/lib.rs", edition = "2024", proc_macro_deps = [ - "@vendor_ts__ra_ap_macros-0.0.328//:ra_ap_macros", - "@vendor_ts__ra_ap_query-group-macro-0.0.328//:ra_ap_query_group_macro", - "@vendor_ts__salsa-macros-0.25.2//:salsa_macros", - "@vendor_ts__serde_derive-1.0.228//:serde_derive", + "@vendor_ts__ra_ap_macros-0.0.347//:ra_ap_macros", + "@vendor_ts__serde_derive-1.0.229//:serde_derive", ], rustc_env_files = [ ":cargo_toml_env_vars", @@ -110,40 +107,41 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.328", + version = "0.0.347", deps = [ - "@vendor_ts__arrayvec-0.7.6//:arrayvec", + "@vendor_ts__arrayvec-0.7.8//:arrayvec", + "@vendor_ts__bitflags-2.13.1//:bitflags", "@vendor_ts__cov-mark-2.2.0//:cov_mark", - "@vendor_ts__either-1.16.0//:either", + "@vendor_ts__either-1.17.0//:either", "@vendor_ts__ena-0.14.4//:ena", "@vendor_ts__indexmap-2.14.0//:indexmap", - "@vendor_ts__itertools-0.14.0//:itertools", + "@vendor_ts__itertools-0.15.0//:itertools", "@vendor_ts__la-arena-0.3.1//:la_arena", "@vendor_ts__oorandom-11.1.5//:oorandom", "@vendor_ts__petgraph-0.8.3//:petgraph", - "@vendor_ts__ra-ap-rustc_abi-0.143.0//:ra_ap_rustc_abi", - "@vendor_ts__ra-ap-rustc_ast_ir-0.143.0//:ra_ap_rustc_ast_ir", - "@vendor_ts__ra-ap-rustc_index-0.143.0//:ra_ap_rustc_index", - "@vendor_ts__ra-ap-rustc_next_trait_solver-0.143.0//:ra_ap_rustc_next_trait_solver", - "@vendor_ts__ra-ap-rustc_pattern_analysis-0.143.0//:ra_ap_rustc_pattern_analysis", - "@vendor_ts__ra-ap-rustc_type_ir-0.143.0//:ra_ap_rustc_type_ir", - "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db", - "@vendor_ts__ra_ap_hir_def-0.0.328//:ra_ap_hir_def", - "@vendor_ts__ra_ap_hir_expand-0.0.328//:ra_ap_hir_expand", - "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern", - "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span", - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", - "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax", - "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", + "@vendor_ts__ra-ap-rustc_abi-0.166.0//:ra_ap_rustc_abi", + "@vendor_ts__ra-ap-rustc_ast_ir-0.166.0//:ra_ap_rustc_ast_ir", + "@vendor_ts__ra-ap-rustc_index-0.166.0//:ra_ap_rustc_index", + "@vendor_ts__ra-ap-rustc_next_trait_solver-0.166.0//:ra_ap_rustc_next_trait_solver", + "@vendor_ts__ra-ap-rustc_pattern_analysis-0.166.0//:ra_ap_rustc_pattern_analysis", + "@vendor_ts__ra-ap-rustc_type_ir-0.166.0//:ra_ap_rustc_type_ir", + "@vendor_ts__ra_ap_base_db-0.0.347//:ra_ap_base_db", + "@vendor_ts__ra_ap_hir_def-0.0.347//:ra_ap_hir_def", + "@vendor_ts__ra_ap_hir_expand-0.0.347//:ra_ap_hir_expand", + "@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern", + "@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx", + "@vendor_ts__ra_ap_syntax-0.0.347//:ra_ap_syntax", + "@vendor_ts__rustc-hash-2.1.3//:rustc_hash", "@vendor_ts__rustc_apfloat-0.2.3-llvm-462a31f5a5ab//:rustc_apfloat", - "@vendor_ts__salsa-0.25.2//:salsa", - "@vendor_ts__serde-1.0.228//:serde", - "@vendor_ts__smallvec-1.15.1//:smallvec", - "@vendor_ts__thin-vec-0.2.18//:thin_vec", + "@vendor_ts__salsa-0.28.2//:salsa", + "@vendor_ts__serde-1.0.229//:serde", + "@vendor_ts__smallvec-1.15.2//:smallvec", + "@vendor_ts__thin-vec-0.2.19//:thin_vec", "@vendor_ts__tracing-0.1.44//:tracing", "@vendor_ts__tracing-subscriber-0.3.23//:tracing_subscriber", "@vendor_ts__tracing-tree-0.4.1//:tracing_tree", - "@vendor_ts__triomphe-0.1.15//:triomphe", + "@vendor_ts__triomphe-0.1.16//:triomphe", "@vendor_ts__typed-arena-2.0.2//:typed_arena", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_ide_db-0.0.328.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_ide_db-0.0.347.bazel similarity index 68% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_ide_db-0.0.328.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_ide_db-0.0.347.bazel index 91ada35649e1..7519b15be5d9 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_ide_db-0.0.328.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_ide_db-0.0.347.bazel @@ -23,18 +23,17 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db": "base_db", - "@vendor_ts__ra_ap_hir-0.0.328//:ra_ap_hir": "hir", - "@vendor_ts__ra_ap_macros-0.0.328//:ra_ap_macros": "macros", - "@vendor_ts__ra_ap_parser-0.0.328//:ra_ap_parser": "parser", - "@vendor_ts__ra_ap_profile-0.0.328//:ra_ap_profile": "profile", - "@vendor_ts__ra_ap_query-group-macro-0.0.328//:ra_ap_query_group_macro": "query_group", - "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span": "span", - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", - "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax": "syntax", - "@vendor_ts__ra_ap_test_fixture-0.0.328//:ra_ap_test_fixture": "test_fixture", - "@vendor_ts__ra_ap_test_utils-0.0.328//:ra_ap_test_utils": "test_utils", - "@vendor_ts__ra_ap_vfs-0.0.328//:ra_ap_vfs": "vfs", + "@vendor_ts__ra_ap_base_db-0.0.347//:ra_ap_base_db": "base_db", + "@vendor_ts__ra_ap_hir-0.0.347//:ra_ap_hir": "hir", + "@vendor_ts__ra_ap_macros-0.0.347//:ra_ap_macros": "macros", + "@vendor_ts__ra_ap_parser-0.0.347//:ra_ap_parser": "parser", + "@vendor_ts__ra_ap_profile-0.0.347//:ra_ap_profile": "profile", + "@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span": "span", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx": "stdx", + "@vendor_ts__ra_ap_syntax-0.0.347//:ra_ap_syntax": "syntax", + "@vendor_ts__ra_ap_test_fixture-0.0.347//:ra_ap_test_fixture": "test_fixture", + "@vendor_ts__ra_ap_test_utils-0.0.347//:ra_ap_test_utils": "test_utils", + "@vendor_ts__ra_ap_vfs-0.0.347//:ra_ap_vfs": "vfs", }, compile_data = glob( include = ["**"], @@ -54,9 +53,7 @@ rust_library( crate_root = "src/lib.rs", edition = "2024", proc_macro_deps = [ - "@vendor_ts__ra_ap_macros-0.0.328//:ra_ap_macros", - "@vendor_ts__ra_ap_query-group-macro-0.0.328//:ra_ap_query_group_macro", - "@vendor_ts__salsa-macros-0.25.2//:salsa_macros", + "@vendor_ts__ra_ap_macros-0.0.347//:ra_ap_macros", ], rustc_env_files = [ ":cargo_toml_env_vars", @@ -115,33 +112,33 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.328", + version = "0.0.347", deps = [ - "@vendor_ts__arrayvec-0.7.6//:arrayvec", - "@vendor_ts__bitflags-2.11.1//:bitflags", + "@vendor_ts__arrayvec-0.7.8//:arrayvec", + "@vendor_ts__bitflags-2.13.1//:bitflags", "@vendor_ts__cov-mark-2.2.0//:cov_mark", - "@vendor_ts__crossbeam-channel-0.5.15//:crossbeam_channel", - "@vendor_ts__either-1.16.0//:either", + "@vendor_ts__crossbeam-channel-0.5.16//:crossbeam_channel", + "@vendor_ts__either-1.17.0//:either", "@vendor_ts__fst-0.4.7//:fst", - "@vendor_ts__itertools-0.14.0//:itertools", + "@vendor_ts__itertools-0.15.0//:itertools", "@vendor_ts__line-index-0.1.2//:line_index", - "@vendor_ts__memchr-2.8.0//:memchr", + "@vendor_ts__memchr-2.8.3//:memchr", "@vendor_ts__nohash-hasher-0.2.0//:nohash_hasher", - "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db", - "@vendor_ts__ra_ap_hir-0.0.328//:ra_ap_hir", - "@vendor_ts__ra_ap_parser-0.0.328//:ra_ap_parser", - "@vendor_ts__ra_ap_profile-0.0.328//:ra_ap_profile", - "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span", - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", - "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax", - "@vendor_ts__ra_ap_test_fixture-0.0.328//:ra_ap_test_fixture", - "@vendor_ts__ra_ap_test_utils-0.0.328//:ra_ap_test_utils", - "@vendor_ts__ra_ap_vfs-0.0.328//:ra_ap_vfs", + "@vendor_ts__ra_ap_base_db-0.0.347//:ra_ap_base_db", + "@vendor_ts__ra_ap_hir-0.0.347//:ra_ap_hir", + "@vendor_ts__ra_ap_parser-0.0.347//:ra_ap_parser", + "@vendor_ts__ra_ap_profile-0.0.347//:ra_ap_profile", + "@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx", + "@vendor_ts__ra_ap_syntax-0.0.347//:ra_ap_syntax", + "@vendor_ts__ra_ap_test_fixture-0.0.347//:ra_ap_test_fixture", + "@vendor_ts__ra_ap_test_utils-0.0.347//:ra_ap_test_utils", + "@vendor_ts__ra_ap_vfs-0.0.347//:ra_ap_vfs", "@vendor_ts__rayon-1.12.0//:rayon", - "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", - "@vendor_ts__salsa-0.25.2//:salsa", - "@vendor_ts__smallvec-1.15.1//:smallvec", + "@vendor_ts__rustc-hash-2.1.3//:rustc_hash", + "@vendor_ts__salsa-0.28.2//:salsa", + "@vendor_ts__smallvec-1.15.2//:smallvec", "@vendor_ts__tracing-0.1.44//:tracing", - "@vendor_ts__triomphe-0.1.15//:triomphe", + "@vendor_ts__triomphe-0.1.16//:triomphe", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_intern-0.0.328.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_intern-0.0.347.bazel similarity index 94% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_intern-0.0.328.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_intern-0.0.347.bazel index e2b1c874bcbc..0af139a44473 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_intern-0.0.328.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_intern-0.0.347.bazel @@ -93,12 +93,13 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.328", + version = "0.0.347", deps = [ - "@vendor_ts__dashmap-6.1.0//:dashmap", + "@vendor_ts__arrayvec-0.7.8//:arrayvec", + "@vendor_ts__dashmap-6.2.1//:dashmap", "@vendor_ts__hashbrown-0.14.5//:hashbrown", "@vendor_ts__rayon-1.12.0//:rayon", - "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", - "@vendor_ts__triomphe-0.1.15//:triomphe", + "@vendor_ts__rustc-hash-2.1.3//:rustc_hash", + "@vendor_ts__triomphe-0.1.16//:triomphe", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_load-cargo-0.0.328.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_load-cargo-0.0.347.bazel similarity index 77% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_load-cargo-0.0.328.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_load-cargo-0.0.347.bazel index 28c08916e4ef..8c92afc8a32c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_load-cargo-0.0.328.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_load-cargo-0.0.347.bazel @@ -23,15 +23,15 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_hir_expand-0.0.328//:ra_ap_hir_expand": "hir_expand", - "@vendor_ts__ra_ap_ide_db-0.0.328//:ra_ap_ide_db": "ide_db", - "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern": "intern", - "@vendor_ts__ra_ap_proc_macro_api-0.0.328//:ra_ap_proc_macro_api": "proc_macro_api", - "@vendor_ts__ra_ap_project_model-0.0.328//:ra_ap_project_model": "project_model", - "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span": "span", - "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt": "tt", - "@vendor_ts__ra_ap_vfs-0.0.328//:ra_ap_vfs": "vfs", - "@vendor_ts__ra_ap_vfs-notify-0.0.328//:ra_ap_vfs_notify": "vfs_notify", + "@vendor_ts__ra_ap_hir_expand-0.0.347//:ra_ap_hir_expand": "hir_expand", + "@vendor_ts__ra_ap_ide_db-0.0.347//:ra_ap_ide_db": "ide_db", + "@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern": "intern", + "@vendor_ts__ra_ap_proc_macro_api-0.0.347//:ra_ap_proc_macro_api": "proc_macro_api", + "@vendor_ts__ra_ap_project_model-0.0.347//:ra_ap_project_model": "project_model", + "@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span": "span", + "@vendor_ts__ra_ap_tt-0.0.347//:ra_ap_tt": "tt", + "@vendor_ts__ra_ap_vfs-0.0.347//:ra_ap_vfs": "vfs", + "@vendor_ts__ra_ap_vfs-notify-0.0.347//:ra_ap_vfs_notify": "vfs_notify", }, compile_data = glob( include = ["**"], @@ -104,20 +104,20 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.328", + version = "0.0.347", deps = [ - "@vendor_ts__anyhow-1.0.102//:anyhow", - "@vendor_ts__crossbeam-channel-0.5.15//:crossbeam_channel", - "@vendor_ts__itertools-0.14.0//:itertools", - "@vendor_ts__ra_ap_hir_expand-0.0.328//:ra_ap_hir_expand", - "@vendor_ts__ra_ap_ide_db-0.0.328//:ra_ap_ide_db", - "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern", - "@vendor_ts__ra_ap_proc_macro_api-0.0.328//:ra_ap_proc_macro_api", - "@vendor_ts__ra_ap_project_model-0.0.328//:ra_ap_project_model", - "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span", - "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt", - "@vendor_ts__ra_ap_vfs-0.0.328//:ra_ap_vfs", - "@vendor_ts__ra_ap_vfs-notify-0.0.328//:ra_ap_vfs_notify", + "@vendor_ts__anyhow-1.0.104//:anyhow", + "@vendor_ts__crossbeam-channel-0.5.16//:crossbeam_channel", + "@vendor_ts__itertools-0.15.0//:itertools", + "@vendor_ts__ra_ap_hir_expand-0.0.347//:ra_ap_hir_expand", + "@vendor_ts__ra_ap_ide_db-0.0.347//:ra_ap_ide_db", + "@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern", + "@vendor_ts__ra_ap_proc_macro_api-0.0.347//:ra_ap_proc_macro_api", + "@vendor_ts__ra_ap_project_model-0.0.347//:ra_ap_project_model", + "@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span", + "@vendor_ts__ra_ap_tt-0.0.347//:ra_ap_tt", + "@vendor_ts__ra_ap_vfs-0.0.347//:ra_ap_vfs", + "@vendor_ts__ra_ap_vfs-notify-0.0.347//:ra_ap_vfs_notify", "@vendor_ts__tracing-0.1.44//:tracing", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_macros-0.0.328.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_macros-0.0.347.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_macros-0.0.328.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_macros-0.0.347.bazel index 6411cde26a3b..fcc4c85b290d 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_macros-0.0.328.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_macros-0.0.347.bazel @@ -93,11 +93,11 @@ rust_proc_macro( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.328", + version = "0.0.347", deps = [ - "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", - "@vendor_ts__quote-1.0.45//:quote", - "@vendor_ts__syn-2.0.117//:syn", + "@vendor_ts__proc-macro2-1.0.107//:proc_macro2", + "@vendor_ts__quote-1.0.47//:quote", + "@vendor_ts__syn-2.0.119//:syn", "@vendor_ts__synstructure-0.13.2//:synstructure", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_mbe-0.0.328.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_mbe-0.0.347.bazel similarity index 80% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_mbe-0.0.328.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_mbe-0.0.347.bazel index 8ba9ea8d50c4..ce656ab43730 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_mbe-0.0.328.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_mbe-0.0.347.bazel @@ -23,12 +23,12 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern": "intern", - "@vendor_ts__ra_ap_parser-0.0.328//:ra_ap_parser": "parser", - "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span": "span", - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", - "@vendor_ts__ra_ap_syntax-bridge-0.0.328//:ra_ap_syntax_bridge": "syntax_bridge", - "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt": "tt", + "@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern": "intern", + "@vendor_ts__ra_ap_parser-0.0.347//:ra_ap_parser": "parser", + "@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span": "span", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx": "stdx", + "@vendor_ts__ra_ap_syntax-bridge-0.0.347//:ra_ap_syntax_bridge": "syntax_bridge", + "@vendor_ts__ra_ap_tt-0.0.347//:ra_ap_tt": "tt", }, compile_data = glob( include = ["**"], @@ -101,20 +101,20 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.328", + version = "0.0.347", deps = [ - "@vendor_ts__arrayvec-0.7.6//:arrayvec", - "@vendor_ts__bitflags-2.11.1//:bitflags", + "@vendor_ts__arrayvec-0.7.8//:arrayvec", + "@vendor_ts__bitflags-2.13.1//:bitflags", "@vendor_ts__cov-mark-2.2.0//:cov_mark", - "@vendor_ts__ra-ap-rustc_lexer-0.143.0//:ra_ap_rustc_lexer", - "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern", - "@vendor_ts__ra_ap_parser-0.0.328//:ra_ap_parser", - "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span", - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", - "@vendor_ts__ra_ap_syntax-bridge-0.0.328//:ra_ap_syntax_bridge", - "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt", - "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", - "@vendor_ts__salsa-0.25.2//:salsa", - "@vendor_ts__smallvec-1.15.1//:smallvec", + "@vendor_ts__ra-ap-rustc_lexer-0.166.0//:ra_ap_rustc_lexer", + "@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern", + "@vendor_ts__ra_ap_parser-0.0.347//:ra_ap_parser", + "@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx", + "@vendor_ts__ra_ap_syntax-bridge-0.0.347//:ra_ap_syntax_bridge", + "@vendor_ts__ra_ap_tt-0.0.347//:ra_ap_tt", + "@vendor_ts__rustc-hash-2.1.3//:rustc_hash", + "@vendor_ts__salsa-0.28.2//:salsa", + "@vendor_ts__smallvec-1.15.2//:smallvec", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_parser-0.0.328.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_parser-0.0.347.bazel similarity index 93% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_parser-0.0.328.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_parser-0.0.347.bazel index 5e1577c1785a..4e0477619723 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_parser-0.0.328.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_parser-0.0.347.bazel @@ -23,7 +23,7 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_edition-0.0.328//:ra_ap_edition": "edition", + "@vendor_ts__ra_ap_edition-0.0.347//:ra_ap_edition": "edition", }, compile_data = glob( include = ["**"], @@ -99,12 +99,12 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.328", + version = "0.0.347", deps = [ "@vendor_ts__drop_bomb-0.1.5//:drop_bomb", - "@vendor_ts__ra-ap-rustc_lexer-0.143.0//:ra_ap_rustc_lexer", - "@vendor_ts__ra_ap_edition-0.0.328//:ra_ap_edition", - "@vendor_ts__rustc-literal-escaper-0.0.4//:rustc_literal_escaper", + "@vendor_ts__ra-ap-rustc_lexer-0.166.0//:ra_ap_rustc_lexer", + "@vendor_ts__ra_ap_edition-0.0.347//:ra_ap_edition", + "@vendor_ts__rustc-literal-escaper-0.0.7//:rustc_literal_escaper", "@vendor_ts__tracing-0.1.44//:tracing", "@vendor_ts__winnow-0.7.15//:winnow", ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_paths-0.0.328.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_paths-0.0.347.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_paths-0.0.328.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_paths-0.0.347.bazel index 6d809a8ca8ab..15817dd51767 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_paths-0.0.328.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_paths-0.0.347.bazel @@ -96,8 +96,8 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.328", + version = "0.0.347", deps = [ - "@vendor_ts__camino-1.2.2//:camino", + "@vendor_ts__camino-1.2.5//:camino", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_proc_macro_api-0.0.328.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_proc_macro_api-0.0.347.bazel similarity index 84% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_proc_macro_api-0.0.328.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_proc_macro_api-0.0.347.bazel index 6a874669b427..4a6b60368af4 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_proc_macro_api-0.0.328.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_proc_macro_api-0.0.347.bazel @@ -23,11 +23,11 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern": "intern", - "@vendor_ts__ra_ap_paths-0.0.328//:ra_ap_paths": "paths", - "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span": "span", - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", - "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt": "tt", + "@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern": "intern", + "@vendor_ts__ra_ap_paths-0.0.347//:ra_ap_paths": "paths", + "@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span": "span", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx": "stdx", + "@vendor_ts__ra_ap_tt-0.0.347//:ra_ap_tt": "tt", }, compile_data = glob( include = ["**"], @@ -47,7 +47,7 @@ rust_library( crate_root = "src/lib.rs", edition = "2024", proc_macro_deps = [ - "@vendor_ts__serde_derive-1.0.228//:serde_derive", + "@vendor_ts__serde_derive-1.0.229//:serde_derive", ], rustc_env_files = [ ":cargo_toml_env_vars", @@ -106,20 +106,20 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.328", + version = "0.0.347", deps = [ "@vendor_ts__indexmap-2.14.0//:indexmap", "@vendor_ts__postcard-1.1.3//:postcard", - "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern", - "@vendor_ts__ra_ap_paths-0.0.328//:ra_ap_paths", - "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span", - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", - "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt", + "@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern", + "@vendor_ts__ra_ap_paths-0.0.347//:ra_ap_paths", + "@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx", + "@vendor_ts__ra_ap_tt-0.0.347//:ra_ap_tt", "@vendor_ts__rayon-1.12.0//:rayon", - "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", + "@vendor_ts__rustc-hash-2.1.3//:rustc_hash", "@vendor_ts__semver-1.0.28//:semver", - "@vendor_ts__serde-1.0.228//:serde", - "@vendor_ts__serde_json-1.0.150//:serde_json", + "@vendor_ts__serde-1.0.229//:serde", + "@vendor_ts__serde_json-1.0.151//:serde_json", "@vendor_ts__tracing-0.1.44//:tracing", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_profile-0.0.328.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_profile-0.0.347.bazel similarity index 87% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_profile-0.0.328.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_profile-0.0.347.bazel index 327e50c225ba..76f46867256e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_profile-0.0.328.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_profile-0.0.347.bazel @@ -93,52 +93,50 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.328", - deps = [ - "@vendor_ts__cfg-if-1.0.4//:cfg_if", - ] + select({ + version = "0.0.347", + deps = select({ "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [ - "@vendor_ts__windows-sys-0.60.2//:windows_sys", # cfg(windows) + "@vendor_ts__windows-sys-0.61.2//:windows_sys", # cfg(windows) ], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) "@vendor_ts__perf-event-0.4.8//:perf_event", # cfg(all(target_os = "linux", not(target_env = "ohos"), any(target_arch = "x86", target_arch = "x86_64", target_arch = "aarch64"))) ], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) "@vendor_ts__perf-event-0.4.8//:perf_event", # cfg(all(target_os = "linux", not(target_env = "ohos"), any(target_arch = "x86", target_arch = "x86_64", target_arch = "aarch64"))) ], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) ], "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) ], "@rules_rust//rust/platform:i686-pc-windows-msvc": [ - "@vendor_ts__windows-sys-0.60.2//:windows_sys", # cfg(windows) + "@vendor_ts__windows-sys-0.61.2//:windows_sys", # cfg(windows) ], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) "@vendor_ts__perf-event-0.4.8//:perf_event", # cfg(all(target_os = "linux", not(target_env = "ohos"), any(target_arch = "x86", target_arch = "x86_64", target_arch = "aarch64"))) ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) ], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) ], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) ], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [ - "@vendor_ts__windows-sys-0.60.2//:windows_sys", # cfg(windows) + "@vendor_ts__windows-sys-0.61.2//:windows_sys", # cfg(windows) ], "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) "@vendor_ts__perf-event-0.4.8//:perf_event", # cfg(all(target_os = "linux", not(target_env = "ohos"), any(target_arch = "x86", target_arch = "x86_64", target_arch = "aarch64"))) ], "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) "@vendor_ts__perf-event-0.4.8//:perf_event", # cfg(all(target_os = "linux", not(target_env = "ohos"), any(target_arch = "x86", target_arch = "x86_64", target_arch = "aarch64"))) ], "//conditions:default": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_project_model-0.0.328.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_project_model-0.0.347.bazel similarity index 76% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_project_model-0.0.328.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_project_model-0.0.347.bazel index d47c852ddab2..0f2860baf657 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_project_model-0.0.328.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_project_model-0.0.347.bazel @@ -23,13 +23,13 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db": "base_db", - "@vendor_ts__ra_ap_cfg-0.0.328//:ra_ap_cfg": "cfg", - "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern": "intern", - "@vendor_ts__ra_ap_paths-0.0.328//:ra_ap_paths": "paths", - "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span": "span", - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", - "@vendor_ts__ra_ap_toolchain-0.0.328//:ra_ap_toolchain": "toolchain", + "@vendor_ts__ra_ap_base_db-0.0.347//:ra_ap_base_db": "base_db", + "@vendor_ts__ra_ap_cfg-0.0.347//:ra_ap_cfg": "cfg", + "@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern": "intern", + "@vendor_ts__ra_ap_paths-0.0.347//:ra_ap_paths": "paths", + "@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span": "span", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx": "stdx", + "@vendor_ts__ra_ap_toolchain-0.0.347//:ra_ap_toolchain": "toolchain", }, compile_data = glob( include = ["**"], @@ -49,7 +49,7 @@ rust_library( crate_root = "src/lib.rs", edition = "2024", proc_macro_deps = [ - "@vendor_ts__serde_derive-1.0.228//:serde_derive", + "@vendor_ts__serde_derive-1.0.229//:serde_derive", ], rustc_env_files = [ ":cargo_toml_env_vars", @@ -108,26 +108,26 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.328", + version = "0.0.347", deps = [ - "@vendor_ts__anyhow-1.0.102//:anyhow", + "@vendor_ts__anyhow-1.0.104//:anyhow", "@vendor_ts__cargo_metadata-0.23.1//:cargo_metadata", - "@vendor_ts__itertools-0.14.0//:itertools", + "@vendor_ts__itertools-0.15.0//:itertools", "@vendor_ts__la-arena-0.3.1//:la_arena", - "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db", - "@vendor_ts__ra_ap_cfg-0.0.328//:ra_ap_cfg", - "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern", - "@vendor_ts__ra_ap_paths-0.0.328//:ra_ap_paths", - "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span", - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", - "@vendor_ts__ra_ap_toolchain-0.0.328//:ra_ap_toolchain", - "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", + "@vendor_ts__ra_ap_base_db-0.0.347//:ra_ap_base_db", + "@vendor_ts__ra_ap_cfg-0.0.347//:ra_ap_cfg", + "@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern", + "@vendor_ts__ra_ap_paths-0.0.347//:ra_ap_paths", + "@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx", + "@vendor_ts__ra_ap_toolchain-0.0.347//:ra_ap_toolchain", + "@vendor_ts__rustc-hash-2.1.3//:rustc_hash", "@vendor_ts__semver-1.0.28//:semver", - "@vendor_ts__serde-1.0.228//:serde", - "@vendor_ts__serde_json-1.0.150//:serde_json", - "@vendor_ts__temp-dir-0.1.16//:temp_dir", - "@vendor_ts__toml-0.9.12-spec-1.1.0//:toml", + "@vendor_ts__serde-1.0.229//:serde", + "@vendor_ts__serde_json-1.0.151//:serde_json", + "@vendor_ts__temp-dir-0.2.0//:temp_dir", + "@vendor_ts__toml-1.1.4-spec-1.1.0//:toml", "@vendor_ts__tracing-0.1.44//:tracing", - "@vendor_ts__triomphe-0.1.15//:triomphe", + "@vendor_ts__triomphe-0.1.16//:triomphe", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_query-group-macro-0.0.328.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_query-group-macro-0.0.328.bazel deleted file mode 100644 index 0934ecd44f2e..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_query-group-macro-0.0.328.bazel +++ /dev/null @@ -1,102 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_proc_macro") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_proc_macro( - name = "ra_ap_query_group_macro", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_root = "src/lib.rs", - edition = "2024", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=ra_ap_query-group-macro", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.0.328", - deps = [ - "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", - "@vendor_ts__quote-1.0.45//:quote", - "@vendor_ts__syn-2.0.117//:syn", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_span-0.0.328.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_span-0.0.347.bazel similarity index 89% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_span-0.0.328.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_span-0.0.347.bazel index 6c6249a49ab9..bd2da917593e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_span-0.0.328.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_span-0.0.347.bazel @@ -23,9 +23,9 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", - "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax": "syntax", - "@vendor_ts__ra_ap_vfs-0.0.328//:ra_ap_vfs": "vfs", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx": "stdx", + "@vendor_ts__ra_ap_syntax-0.0.347//:ra_ap_syntax": "syntax", + "@vendor_ts__ra_ap_vfs-0.0.347//:ra_ap_vfs": "vfs", }, compile_data = glob( include = ["**"], @@ -102,15 +102,15 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.328", + version = "0.0.347", deps = [ - "@vendor_ts__hashbrown-0.14.5//:hashbrown", + "@vendor_ts__hashbrown-0.17.1//:hashbrown", "@vendor_ts__la-arena-0.3.1//:la_arena", - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", - "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax", - "@vendor_ts__ra_ap_vfs-0.0.328//:ra_ap_vfs", - "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", - "@vendor_ts__salsa-0.25.2//:salsa", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx", + "@vendor_ts__ra_ap_syntax-0.0.347//:ra_ap_syntax", + "@vendor_ts__ra_ap_vfs-0.0.347//:ra_ap_vfs", + "@vendor_ts__rustc-hash-2.1.3//:rustc_hash", + "@vendor_ts__salsa-0.28.2//:salsa", "@vendor_ts__text-size-1.1.1//:text_size", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_stdx-0.0.328.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_stdx-0.0.347.bazel similarity index 76% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_stdx-0.0.328.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_stdx-0.0.347.bazel index 632b844d54ad..473416e0716e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_stdx-0.0.328.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_stdx-0.0.347.bazel @@ -93,106 +93,106 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.328", + version = "0.0.347", deps = [ - "@vendor_ts__crossbeam-channel-0.5.15//:crossbeam_channel", - "@vendor_ts__crossbeam-utils-0.8.21//:crossbeam_utils", - "@vendor_ts__itertools-0.14.0//:itertools", + "@vendor_ts__crossbeam-channel-0.5.16//:crossbeam_channel", + "@vendor_ts__crossbeam-utils-0.8.22//:crossbeam_utils", + "@vendor_ts__itertools-0.15.0//:itertools", "@vendor_ts__jod-thread-1.0.0//:jod_thread", "@vendor_ts__tracing-0.1.44//:tracing", ] + select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-apple-ios": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-linux-android": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [ "@vendor_ts__miow-0.6.1//:miow", # cfg(windows) - "@vendor_ts__windows-sys-0.60.2//:windows_sys", # cfg(windows) + "@vendor_ts__windows-sys-0.61.2//:windows_sys", # cfg(windows) ], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:armv7-linux-androideabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:i686-apple-darwin": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:i686-linux-android": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:i686-pc-windows-msvc": [ "@vendor_ts__miow-0.6.1//:miow", # cfg(windows) - "@vendor_ts__windows-sys-0.60.2//:windows_sys", # cfg(windows) + "@vendor_ts__windows-sys-0.61.2//:windows_sys", # cfg(windows) ], "@rules_rust//rust/platform:i686-unknown-freebsd": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-apple-darwin": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-apple-ios": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-linux-android": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [ "@vendor_ts__miow-0.6.1//:miow", # cfg(windows) - "@vendor_ts__windows-sys-0.60.2//:windows_sys", # cfg(windows) + "@vendor_ts__windows-sys-0.61.2//:windows_sys", # cfg(windows) ], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # cfg(unix) + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], "//conditions:default": [], }), diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-0.0.328.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-0.0.347.bazel similarity index 86% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-0.0.328.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-0.0.347.bazel index e2cfe3404bfb..74dad3828ac6 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-0.0.328.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-0.0.347.bazel @@ -23,8 +23,8 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_parser-0.0.328//:ra_ap_parser": "parser", - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", + "@vendor_ts__ra_ap_parser-0.0.347//:ra_ap_parser": "parser", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx": "stdx", }, compile_data = glob( include = ["**"], @@ -100,19 +100,20 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.328", + version = "0.0.347", deps = [ - "@vendor_ts__either-1.16.0//:either", - "@vendor_ts__itertools-0.14.0//:itertools", - "@vendor_ts__ra_ap_parser-0.0.328//:ra_ap_parser", - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", - "@vendor_ts__rowan-0.15.18//:rowan", - "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", - "@vendor_ts__rustc-literal-escaper-0.0.4//:rustc_literal_escaper", - "@vendor_ts__smallvec-1.15.1//:smallvec", + "@vendor_ts__either-1.17.0//:either", + "@vendor_ts__itertools-0.15.0//:itertools", + "@vendor_ts__ra-ap-rustc_lexer-0.166.0//:ra_ap_rustc_lexer", + "@vendor_ts__ra_ap_parser-0.0.347//:ra_ap_parser", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx", + "@vendor_ts__rowan-0.17.0//:rowan", + "@vendor_ts__rustc-hash-2.1.3//:rustc_hash", + "@vendor_ts__rustc-literal-escaper-0.0.7//:rustc_literal_escaper", + "@vendor_ts__smallvec-1.15.2//:smallvec", "@vendor_ts__smol_str-0.3.6//:smol_str", "@vendor_ts__tracing-0.1.44//:tracing", - "@vendor_ts__triomphe-0.1.15//:triomphe", + "@vendor_ts__triomphe-0.1.16//:triomphe", ], ) exports_files(["rust.ungram"]) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-bridge-0.0.328.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-bridge-0.0.347.bazel similarity index 84% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-bridge-0.0.328.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-bridge-0.0.347.bazel index 4ce70110ed1a..cc1c149596b4 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-bridge-0.0.328.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-bridge-0.0.347.bazel @@ -23,12 +23,12 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern": "intern", - "@vendor_ts__ra_ap_parser-0.0.328//:ra_ap_parser": "parser", - "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span": "span", - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", - "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax": "syntax", - "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt": "tt", + "@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern": "intern", + "@vendor_ts__ra_ap_parser-0.0.347//:ra_ap_parser": "parser", + "@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span": "span", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx": "stdx", + "@vendor_ts__ra_ap_syntax-0.0.347//:ra_ap_syntax": "syntax", + "@vendor_ts__ra_ap_tt-0.0.347//:ra_ap_tt": "tt", }, compile_data = glob( include = ["**"], @@ -101,14 +101,14 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.328", + version = "0.0.347", deps = [ - "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern", - "@vendor_ts__ra_ap_parser-0.0.328//:ra_ap_parser", - "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span", - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", - "@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax", - "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt", - "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", + "@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern", + "@vendor_ts__ra_ap_parser-0.0.347//:ra_ap_parser", + "@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx", + "@vendor_ts__ra_ap_syntax-0.0.347//:ra_ap_syntax", + "@vendor_ts__ra_ap_tt-0.0.347//:ra_ap_tt", + "@vendor_ts__rustc-hash-2.1.3//:rustc_hash", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_test_fixture-0.0.328.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_test_fixture-0.0.347.bazel similarity index 78% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_test_fixture-0.0.328.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_test_fixture-0.0.347.bazel index 40941eb64afe..aca13c7af16a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_test_fixture-0.0.328.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_test_fixture-0.0.347.bazel @@ -23,15 +23,15 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db": "base_db", - "@vendor_ts__ra_ap_cfg-0.0.328//:ra_ap_cfg": "cfg", - "@vendor_ts__ra_ap_hir_expand-0.0.328//:ra_ap_hir_expand": "hir_expand", - "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern": "intern", - "@vendor_ts__ra_ap_paths-0.0.328//:ra_ap_paths": "paths", - "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span": "span", - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", - "@vendor_ts__ra_ap_test_utils-0.0.328//:ra_ap_test_utils": "test_utils", - "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt": "tt", + "@vendor_ts__ra_ap_base_db-0.0.347//:ra_ap_base_db": "base_db", + "@vendor_ts__ra_ap_cfg-0.0.347//:ra_ap_cfg": "cfg", + "@vendor_ts__ra_ap_hir_expand-0.0.347//:ra_ap_hir_expand": "hir_expand", + "@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern": "intern", + "@vendor_ts__ra_ap_paths-0.0.347//:ra_ap_paths": "paths", + "@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span": "span", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx": "stdx", + "@vendor_ts__ra_ap_test_utils-0.0.347//:ra_ap_test_utils": "test_utils", + "@vendor_ts__ra_ap_tt-0.0.347//:ra_ap_tt": "tt", }, compile_data = glob( include = ["**"], @@ -107,17 +107,17 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.328", + version = "0.0.347", deps = [ - "@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db", - "@vendor_ts__ra_ap_cfg-0.0.328//:ra_ap_cfg", - "@vendor_ts__ra_ap_hir_expand-0.0.328//:ra_ap_hir_expand", - "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern", - "@vendor_ts__ra_ap_paths-0.0.328//:ra_ap_paths", - "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span", - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", - "@vendor_ts__ra_ap_test_utils-0.0.328//:ra_ap_test_utils", - "@vendor_ts__ra_ap_tt-0.0.328//:ra_ap_tt", - "@vendor_ts__triomphe-0.1.15//:triomphe", + "@vendor_ts__ra_ap_base_db-0.0.347//:ra_ap_base_db", + "@vendor_ts__ra_ap_cfg-0.0.347//:ra_ap_cfg", + "@vendor_ts__ra_ap_hir_expand-0.0.347//:ra_ap_hir_expand", + "@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern", + "@vendor_ts__ra_ap_paths-0.0.347//:ra_ap_paths", + "@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx", + "@vendor_ts__ra_ap_test_utils-0.0.347//:ra_ap_test_utils", + "@vendor_ts__ra_ap_tt-0.0.347//:ra_ap_tt", + "@vendor_ts__triomphe-0.1.16//:triomphe", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_test_utils-0.0.328.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_test_utils-0.0.347.bazel similarity index 90% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_test_utils-0.0.328.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_test_utils-0.0.347.bazel index 276ab3e576d8..3150acf59195 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_test_utils-0.0.328.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_test_utils-0.0.347.bazel @@ -23,9 +23,9 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_paths-0.0.328//:ra_ap_paths": "paths", - "@vendor_ts__ra_ap_profile-0.0.328//:ra_ap_profile": "profile", - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", + "@vendor_ts__ra_ap_paths-0.0.347//:ra_ap_paths": "paths", + "@vendor_ts__ra_ap_profile-0.0.347//:ra_ap_profile": "profile", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx": "stdx", }, compile_data = glob( include = ["**"], @@ -98,13 +98,13 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.328", + version = "0.0.347", deps = [ "@vendor_ts__dissimilar-1.0.11//:dissimilar", - "@vendor_ts__ra_ap_paths-0.0.328//:ra_ap_paths", - "@vendor_ts__ra_ap_profile-0.0.328//:ra_ap_profile", - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", - "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", + "@vendor_ts__ra_ap_paths-0.0.347//:ra_ap_paths", + "@vendor_ts__ra_ap_profile-0.0.347//:ra_ap_profile", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx", + "@vendor_ts__rustc-hash-2.1.3//:rustc_hash", "@vendor_ts__text-size-1.1.1//:text_size", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_toolchain-0.0.328.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_toolchain-0.0.347.bazel similarity index 97% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_toolchain-0.0.328.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_toolchain-0.0.347.bazel index 9d73283c8059..e88d70d2607a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_toolchain-0.0.328.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_toolchain-0.0.347.bazel @@ -93,9 +93,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.328", + version = "0.0.347", deps = [ - "@vendor_ts__camino-1.2.2//:camino", - "@vendor_ts__home-0.5.12//:home", + "@vendor_ts__camino-1.2.5//:camino", + "@vendor_ts__semver-1.0.28//:semver", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_tt-0.0.328.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_tt-0.0.347.bazel similarity index 87% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_tt-0.0.328.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_tt-0.0.347.bazel index b40b0afeeff4..45ffe7a4b07b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_tt-0.0.328.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_tt-0.0.347.bazel @@ -23,9 +23,9 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern": "intern", - "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span": "span", - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", + "@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern": "intern", + "@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span": "span", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx": "stdx", }, compile_data = glob( include = ["**"], @@ -39,9 +39,6 @@ rust_library( "WORKSPACE.bazel", ], ), - crate_features = [ - "default", - ], crate_root = "src/lib.rs", edition = "2024", rustc_env_files = [ @@ -101,15 +98,15 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.328", + version = "0.0.347", deps = [ - "@vendor_ts__arrayvec-0.7.6//:arrayvec", + "@vendor_ts__arrayvec-0.7.8//:arrayvec", "@vendor_ts__indexmap-2.14.0//:indexmap", - "@vendor_ts__ra-ap-rustc_lexer-0.143.0//:ra_ap_rustc_lexer", - "@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern", - "@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span", - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", - "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", + "@vendor_ts__ra-ap-rustc_lexer-0.166.0//:ra_ap_rustc_lexer", + "@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern", + "@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx", + "@vendor_ts__rustc-hash-2.1.3//:rustc_hash", "@vendor_ts__text-size-1.1.1//:text_size", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-0.0.328.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-0.0.347.bazel similarity index 91% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-0.0.328.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-0.0.347.bazel index 77cf3adfd1c5..8e719c95dcb3 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-0.0.328.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-0.0.347.bazel @@ -23,8 +23,8 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_paths-0.0.328//:ra_ap_paths": "paths", - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", + "@vendor_ts__ra_ap_paths-0.0.347//:ra_ap_paths": "paths", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx": "stdx", }, compile_data = glob( include = ["**"], @@ -97,15 +97,15 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.328", + version = "0.0.347", deps = [ - "@vendor_ts__crossbeam-channel-0.5.15//:crossbeam_channel", + "@vendor_ts__crossbeam-channel-0.5.16//:crossbeam_channel", "@vendor_ts__fst-0.4.7//:fst", "@vendor_ts__indexmap-2.14.0//:indexmap", "@vendor_ts__nohash-hasher-0.2.0//:nohash_hasher", - "@vendor_ts__ra_ap_paths-0.0.328//:ra_ap_paths", - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", - "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", + "@vendor_ts__ra_ap_paths-0.0.347//:ra_ap_paths", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx", + "@vendor_ts__rustc-hash-2.1.3//:rustc_hash", "@vendor_ts__tracing-0.1.44//:tracing", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-notify-0.0.328.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-notify-0.0.347.bazel similarity index 89% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-notify-0.0.328.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-notify-0.0.347.bazel index 5ad594ec7e7e..930f6383490e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-notify-0.0.328.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-notify-0.0.347.bazel @@ -23,9 +23,9 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__ra_ap_paths-0.0.328//:ra_ap_paths": "paths", - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx": "stdx", - "@vendor_ts__ra_ap_vfs-0.0.328//:ra_ap_vfs": "vfs", + "@vendor_ts__ra_ap_paths-0.0.347//:ra_ap_paths": "paths", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx": "stdx", + "@vendor_ts__ra_ap_vfs-0.0.347//:ra_ap_vfs": "vfs", }, compile_data = glob( include = ["**"], @@ -98,15 +98,15 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.328", + version = "0.0.347", deps = [ - "@vendor_ts__crossbeam-channel-0.5.15//:crossbeam_channel", + "@vendor_ts__crossbeam-channel-0.5.16//:crossbeam_channel", "@vendor_ts__notify-8.2.0//:notify", - "@vendor_ts__ra_ap_paths-0.0.328//:ra_ap_paths", - "@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx", - "@vendor_ts__ra_ap_vfs-0.0.328//:ra_ap_vfs", + "@vendor_ts__ra_ap_paths-0.0.347//:ra_ap_paths", + "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx", + "@vendor_ts__ra_ap_vfs-0.0.347//:ra_ap_vfs", "@vendor_ts__rayon-1.12.0//:rayon", - "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", + "@vendor_ts__rustc-hash-2.1.3//:rustc_hash", "@vendor_ts__tracing-0.1.44//:tracing", "@vendor_ts__walkdir-2.5.0//:walkdir", ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand-0.10.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand-0.10.2.bazel similarity index 97% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand-0.10.1.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand-0.10.2.bazel index 58e4ecd87bd3..488cc14ec5e8 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand-0.10.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand-0.10.2.bazel @@ -101,10 +101,10 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.10.1", + version = "0.10.2", deps = [ - "@vendor_ts__chacha20-0.10.0//:chacha20", - "@vendor_ts__getrandom-0.4.2//:getrandom", + "@vendor_ts__chacha20-0.10.1//:chacha20", + "@vendor_ts__getrandom-0.4.3//:getrandom", "@vendor_ts__rand_core-0.10.1//:rand_core", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rayon-1.12.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rayon-1.12.0.bazel index 80dc45dab0ab..41de1d0c87f0 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rayon-1.12.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rayon-1.12.0.bazel @@ -95,7 +95,7 @@ rust_library( }), version = "1.12.0", deps = [ - "@vendor_ts__either-1.16.0//:either", + "@vendor_ts__either-1.17.0//:either", "@vendor_ts__rayon-core-1.13.0//:rayon_core", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rayon-core-1.13.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rayon-core-1.13.0.bazel index 29542077f377..fd0e04b7066b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rayon-core-1.13.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rayon-core-1.13.0.bazel @@ -99,8 +99,8 @@ rust_library( }), version = "1.13.0", deps = [ - "@vendor_ts__crossbeam-deque-0.8.6//:crossbeam_deque", - "@vendor_ts__crossbeam-utils-0.8.21//:crossbeam_utils", + "@vendor_ts__crossbeam-deque-0.8.7//:crossbeam_deque", + "@vendor_ts__crossbeam-utils-0.8.22//:crossbeam_utils", "@vendor_ts__rayon-core-1.13.0//:build_script_build", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.redox_syscall-0.5.18.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.redox_syscall-0.5.18.bazel index a8d39672af9b..a6cfadf976c8 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.redox_syscall-0.5.18.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.redox_syscall-0.5.18.bazel @@ -95,6 +95,6 @@ rust_library( }), version = "0.5.18", deps = [ - "@vendor_ts__bitflags-2.11.1//:bitflags", + "@vendor_ts__bitflags-2.13.1//:bitflags", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ref-cast-1.0.25.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ref-cast-1.0.26.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ref-cast-1.0.25.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ref-cast-1.0.26.bazel index 78dd3d732f31..dfbb9934bedf 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ref-cast-1.0.25.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ref-cast-1.0.26.bazel @@ -41,7 +41,7 @@ rust_library( crate_root = "src/lib.rs", edition = "2021", proc_macro_deps = [ - "@vendor_ts__ref-cast-impl-1.0.25//:ref_cast_impl", + "@vendor_ts__ref-cast-impl-1.0.26//:ref_cast_impl", ], rustc_env_files = [ ":cargo_toml_env_vars", @@ -100,9 +100,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.25", + version = "1.0.26", deps = [ - "@vendor_ts__ref-cast-1.0.25//:build_script_build", + "@vendor_ts__ref-cast-1.0.26//:build_script_build", ], ) @@ -154,7 +154,7 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "1.0.25", + version = "1.0.26", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ref-cast-impl-1.0.25.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ref-cast-impl-1.0.26.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ref-cast-impl-1.0.25.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ref-cast-impl-1.0.26.bazel index 9f428e7b97f1..0850074deeb3 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ref-cast-impl-1.0.25.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ref-cast-impl-1.0.26.bazel @@ -93,10 +93,10 @@ rust_proc_macro( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.25", + version = "1.0.26", deps = [ - "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", - "@vendor_ts__quote-1.0.45//:quote", - "@vendor_ts__syn-2.0.117//:syn", + "@vendor_ts__proc-macro2-1.0.107//:proc_macro2", + "@vendor_ts__quote-1.0.47//:quote", + "@vendor_ts__syn-3.0.3//:syn", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-1.12.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-1.13.1.bazel similarity index 94% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-1.12.3.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-1.13.1.bazel index 825fabb29b18..c872bd0a1ca6 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-1.12.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-1.13.1.bazel @@ -112,11 +112,11 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.12.3", + version = "1.13.1", deps = [ - "@vendor_ts__aho-corasick-1.1.4//:aho_corasick", - "@vendor_ts__memchr-2.8.0//:memchr", - "@vendor_ts__regex-automata-0.4.14//:regex_automata", - "@vendor_ts__regex-syntax-0.8.10//:regex_syntax", + "@vendor_ts__aho-corasick-1.1.5//:aho_corasick", + "@vendor_ts__memchr-2.8.3//:memchr", + "@vendor_ts__regex-automata-0.4.18//:regex_automata", + "@vendor_ts__regex-syntax-0.8.11//:regex_syntax", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-automata-0.4.14.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-automata-0.4.18.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-automata-0.4.14.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-automata-0.4.18.bazel index 7d8af771594a..34f327149122 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-automata-0.4.14.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-automata-0.4.18.bazel @@ -121,10 +121,10 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.4.14", + version = "0.4.18", deps = [ - "@vendor_ts__aho-corasick-1.1.4//:aho_corasick", - "@vendor_ts__memchr-2.8.0//:memchr", - "@vendor_ts__regex-syntax-0.8.10//:regex_syntax", + "@vendor_ts__aho-corasick-1.1.5//:aho_corasick", + "@vendor_ts__memchr-2.8.3//:memchr", + "@vendor_ts__regex-syntax-0.8.11//:regex_syntax", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-syntax-0.8.10.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-syntax-0.8.11.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-syntax-0.8.10.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-syntax-0.8.11.bazel index 5f3ae8f1cce0..10ff0557d977 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-syntax-0.8.10.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-syntax-0.8.11.bazel @@ -105,5 +105,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.8.10", + version = "0.8.11", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rowan-0.15.18.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rowan-0.17.0.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rowan-0.15.18.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rowan-0.17.0.bazel index e9841cd61c3a..d90798984a8e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rowan-0.15.18.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rowan-0.17.0.bazel @@ -93,7 +93,7 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.15.18", + version = "0.17.0", deps = [ "@vendor_ts__countme-3.0.1//:countme", "@vendor_ts__hashbrown-0.14.5//:hashbrown", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-hash-2.1.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-hash-2.1.3.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-hash-2.1.2.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-hash-2.1.3.bazel index a18bdfd0e16b..ee370f4135b4 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-hash-2.1.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-hash-2.1.3.bazel @@ -97,5 +97,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "2.1.2", + version = "2.1.3", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-literal-escaper-0.0.5.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-literal-escaper-0.0.5.bazel deleted file mode 100644 index 883772a6b126..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-literal-escaper-0.0.5.bazel +++ /dev/null @@ -1,97 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "rustc_literal_escaper", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_root = "src/lib.rs", - edition = "2021", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=rustc-literal-escaper", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.0.5", -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-literal-escaper-0.0.4.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-literal-escaper-0.0.7.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-literal-escaper-0.0.4.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-literal-escaper-0.0.7.bazel index 8a273994a826..0c11ff6194ba 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-literal-escaper-0.0.4.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-literal-escaper-0.0.7.bazel @@ -93,5 +93,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.0.4", + version = "0.0.7", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc_apfloat-0.2.3+llvm-462a31f5a5ab.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc_apfloat-0.2.3+llvm-462a31f5a5ab.bazel index 2e81799fba5e..46418e58e28c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc_apfloat-0.2.3+llvm-462a31f5a5ab.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc_apfloat-0.2.3+llvm-462a31f5a5ab.bazel @@ -99,9 +99,9 @@ rust_library( }), version = "0.2.3+llvm-462a31f5a5ab", deps = [ - "@vendor_ts__bitflags-2.11.1//:bitflags", + "@vendor_ts__bitflags-2.13.1//:bitflags", "@vendor_ts__rustc_apfloat-0.2.3-llvm-462a31f5a5ab//:build_script_build", - "@vendor_ts__smallvec-1.15.1//:smallvec", + "@vendor_ts__smallvec-1.15.2//:smallvec", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc_version-0.4.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc_version-0.4.1.bazel deleted file mode 100644 index c93a62d6c6a7..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc_version-0.4.1.bazel +++ /dev/null @@ -1,100 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "rustc_version", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_root = "src/lib.rs", - edition = "2018", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=rustc_version", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.4.1", - deps = [ - "@vendor_ts__semver-1.0.28//:semver", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustversion-1.0.22.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustversion-1.0.23.bazel similarity index 97% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustversion-1.0.22.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustversion-1.0.23.bazel index 442f3ba05905..64a6dea60ee4 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustversion-1.0.22.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustversion-1.0.23.bazel @@ -97,9 +97,9 @@ rust_proc_macro( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.22", + version = "1.0.23", deps = [ - "@vendor_ts__rustversion-1.0.22//:build_script_build", + "@vendor_ts__rustversion-1.0.23//:build_script_build", ], ) @@ -151,7 +151,7 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "1.0.22", + version = "1.0.23", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-0.25.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-0.28.2.bazel similarity index 86% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-0.25.2.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-0.28.2.bazel index 66b48573c99c..463decb2f848 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-0.25.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-0.28.2.bazel @@ -39,11 +39,12 @@ rust_library( "macros", "rayon", "salsa_unstable", + "triomphe", ], crate_root = "src/lib.rs", - edition = "2021", + edition = "2024", proc_macro_deps = [ - "@vendor_ts__salsa-macros-0.25.2//:salsa_macros", + "@vendor_ts__salsa-macros-0.28.2//:salsa_macros", ], rustc_env_files = [ ":cargo_toml_env_vars", @@ -102,23 +103,25 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.25.2", + version = "0.28.2", deps = [ "@vendor_ts__boxcar-0.2.14//:boxcar", "@vendor_ts__crossbeam-queue-0.3.12//:crossbeam_queue", - "@vendor_ts__crossbeam-utils-0.8.21//:crossbeam_utils", - "@vendor_ts__hashbrown-0.15.5//:hashbrown", - "@vendor_ts__hashlink-0.10.0//:hashlink", + "@vendor_ts__crossbeam-utils-0.8.22//:crossbeam_utils", + "@vendor_ts__hashbrown-0.17.1//:hashbrown", + "@vendor_ts__hashlink-0.12.1//:hashlink", "@vendor_ts__indexmap-2.14.0//:indexmap", - "@vendor_ts__intrusive-collections-0.9.7//:intrusive_collections", + "@vendor_ts__intrusive-collections-0.10.3//:intrusive_collections", "@vendor_ts__inventory-0.3.24//:inventory", "@vendor_ts__parking_lot-0.12.5//:parking_lot", - "@vendor_ts__portable-atomic-1.13.1//:portable_atomic", + "@vendor_ts__portable-atomic-1.14.0//:portable_atomic", "@vendor_ts__rayon-1.12.0//:rayon", - "@vendor_ts__rustc-hash-2.1.2//:rustc_hash", - "@vendor_ts__salsa-macro-rules-0.25.2//:salsa_macro_rules", - "@vendor_ts__smallvec-1.15.1//:smallvec", - "@vendor_ts__thin-vec-0.2.18//:thin_vec", + "@vendor_ts__rustc-hash-2.1.3//:rustc_hash", + "@vendor_ts__salsa-macro-rules-0.28.2//:salsa_macro_rules", + "@vendor_ts__smallvec-1.15.2//:smallvec", + "@vendor_ts__thin-vec-0.2.19//:thin_vec", "@vendor_ts__tracing-0.1.44//:tracing", + "@vendor_ts__triomphe-0.1.16//:triomphe", + "@vendor_ts__typeid-1.0.3//:typeid", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macro-rules-0.25.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macro-rules-0.28.2.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macro-rules-0.25.2.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macro-rules-0.28.2.bazel index 01b605f0ed6d..ff2e6321e14d 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macro-rules-0.25.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macro-rules-0.28.2.bazel @@ -35,7 +35,7 @@ rust_library( ], ), crate_root = "src/lib.rs", - edition = "2021", + edition = "2024", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -93,5 +93,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.25.2", + version = "0.28.2", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macros-0.25.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macros-0.28.2.bazel similarity index 94% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macros-0.25.2.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macros-0.28.2.bazel index 8905ee5100ba..1ba51a2e28e4 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macros-0.25.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macros-0.28.2.bazel @@ -38,7 +38,7 @@ rust_proc_macro( "default", ], crate_root = "src/lib.rs", - edition = "2021", + edition = "2024", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -96,11 +96,10 @@ rust_proc_macro( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.25.2", + version = "0.28.2", deps = [ - "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", - "@vendor_ts__quote-1.0.45//:quote", - "@vendor_ts__syn-2.0.117//:syn", - "@vendor_ts__synstructure-0.13.2//:synstructure", + "@vendor_ts__proc-macro2-1.0.107//:proc_macro2", + "@vendor_ts__quote-1.0.47//:quote", + "@vendor_ts__syn-3.0.3//:syn", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.schemars-0.9.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.schemars-0.9.0.bazel index a96ff5d6ee32..b01e5802bfe1 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.schemars-0.9.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.schemars-0.9.0.bazel @@ -96,8 +96,8 @@ rust_library( version = "0.9.0", deps = [ "@vendor_ts__dyn-clone-1.0.20//:dyn_clone", - "@vendor_ts__ref-cast-1.0.25//:ref_cast", - "@vendor_ts__serde-1.0.228//:serde", - "@vendor_ts__serde_json-1.0.150//:serde_json", + "@vendor_ts__ref-cast-1.0.26//:ref_cast", + "@vendor_ts__serde-1.0.229//:serde", + "@vendor_ts__serde_json-1.0.151//:serde_json", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.schemars-1.2.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.schemars-1.2.2.bazel similarity index 95% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.schemars-1.2.1.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.schemars-1.2.2.bazel index 62eeb7975d6f..7a54f43eb556 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.schemars-1.2.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.schemars-1.2.2.bazel @@ -93,11 +93,11 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.2.1", + version = "1.2.2", deps = [ "@vendor_ts__dyn-clone-1.0.20//:dyn_clone", - "@vendor_ts__ref-cast-1.0.25//:ref_cast", - "@vendor_ts__serde-1.0.228//:serde", - "@vendor_ts__serde_json-1.0.150//:serde_json", + "@vendor_ts__ref-cast-1.0.26//:ref_cast", + "@vendor_ts__serde-1.0.229//:serde", + "@vendor_ts__serde_json-1.0.151//:serde_json", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.semver-1.0.28.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.semver-1.0.28.bazel index 5c659d959e2c..68b5a9986041 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.semver-1.0.28.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.semver-1.0.28.bazel @@ -23,7 +23,7 @@ rust_library( allow_empty = True, ), aliases = { - "@vendor_ts__serde_core-1.0.228//:serde_core": "serde", + "@vendor_ts__serde_core-1.0.229//:serde_core": "serde", }, compile_data = glob( include = ["**"], @@ -103,6 +103,6 @@ rust_library( }), version = "1.0.28", deps = [ - "@vendor_ts__serde_core-1.0.228//:serde_core", + "@vendor_ts__serde_core-1.0.229//:serde_core", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde-1.0.228.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde-1.0.229.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde-1.0.228.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde-1.0.229.bazel index f21954648d62..7c7199e5b91f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde-1.0.228.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde-1.0.229.bazel @@ -48,7 +48,7 @@ rust_library( crate_root = "src/lib.rs", edition = "2021", proc_macro_deps = [ - "@vendor_ts__serde_derive-1.0.228//:serde_derive", + "@vendor_ts__serde_derive-1.0.229//:serde_derive", ], rustc_env_files = [ ":cargo_toml_env_vars", @@ -107,10 +107,10 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.228", + version = "1.0.229", deps = [ - "@vendor_ts__serde-1.0.228//:build_script_build", - "@vendor_ts__serde_core-1.0.228//:serde_core", + "@vendor_ts__serde-1.0.229//:build_script_build", + "@vendor_ts__serde_core-1.0.229//:serde_core", ], ) @@ -169,7 +169,7 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "1.0.228", + version = "1.0.229", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_core-1.0.228.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_core-1.0.229.bazel similarity index 97% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_core-1.0.228.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_core-1.0.229.bazel index c2eff6baca9e..717fab7a6747 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_core-1.0.228.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_core-1.0.229.bazel @@ -103,9 +103,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.228", + version = "1.0.229", deps = [ - "@vendor_ts__serde_core-1.0.228//:build_script_build", + "@vendor_ts__serde_core-1.0.229//:build_script_build", ], ) @@ -163,7 +163,7 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "1.0.228", + version = "1.0.229", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_derive-1.0.228.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_derive-1.0.229.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_derive-1.0.228.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_derive-1.0.229.bazel index 1d49666df317..c591f264c8c2 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_derive-1.0.228.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_derive-1.0.229.bazel @@ -96,10 +96,10 @@ rust_proc_macro( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.228", + version = "1.0.229", deps = [ - "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", - "@vendor_ts__quote-1.0.45//:quote", - "@vendor_ts__syn-2.0.117//:syn", + "@vendor_ts__proc-macro2-1.0.107//:proc_macro2", + "@vendor_ts__quote-1.0.47//:quote", + "@vendor_ts__syn-3.0.3//:syn", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_json-1.0.150.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_json-1.0.151.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_json-1.0.150.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_json-1.0.151.bazel index 9ebc6e12937d..0ec0ddcef863 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_json-1.0.150.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_json-1.0.151.bazel @@ -164,13 +164,13 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.150", + version = "1.0.151", deps = [ "@vendor_ts__itoa-1.0.18//:itoa", - "@vendor_ts__memchr-2.8.0//:memchr", - "@vendor_ts__serde_core-1.0.228//:serde_core", - "@vendor_ts__serde_json-1.0.150//:build_script_build", - "@vendor_ts__zmij-1.0.21//:zmij", + "@vendor_ts__memchr-2.8.3//:memchr", + "@vendor_ts__serde_core-1.0.229//:serde_core", + "@vendor_ts__serde_json-1.0.151//:build_script_build", + "@vendor_ts__zmij-1.0.23//:zmij", ] + select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [ "@vendor_ts__indexmap-2.14.0//:indexmap", # aarch64-apple-darwin @@ -336,7 +336,7 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "1.0.150", + version = "1.0.151", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_spanned-1.1.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_spanned-1.1.1.bazel index 67558f9a3a19..2666d81ab42d 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_spanned-1.1.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_spanned-1.1.1.bazel @@ -100,6 +100,6 @@ rust_library( }), version = "1.1.1", deps = [ - "@vendor_ts__serde_core-1.0.228//:serde_core", + "@vendor_ts__serde_core-1.0.229//:serde_core", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with-3.20.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with-3.22.0.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with-3.20.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with-3.22.0.bazel index ce7c7138c975..c0ced4475fbf 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with-3.20.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with-3.22.0.bazel @@ -43,7 +43,7 @@ rust_library( crate_root = "src/lib.rs", edition = "2021", proc_macro_deps = [ - "@vendor_ts__serde_with_macros-3.20.0//:serde_with_macros", + "@vendor_ts__serde_with_macros-3.22.0//:serde_with_macros", ], rustc_env_files = [ ":cargo_toml_env_vars", @@ -102,8 +102,8 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "3.20.0", + version = "3.22.0", deps = [ - "@vendor_ts__serde_core-1.0.228//:serde_core", + "@vendor_ts__serde_core-1.0.229//:serde_core", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with_macros-3.20.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with_macros-3.22.0.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with_macros-3.20.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with_macros-3.22.0.bazel index 043187a396ff..31e5bad3c947 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with_macros-3.20.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with_macros-3.22.0.bazel @@ -93,11 +93,11 @@ rust_proc_macro( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "3.20.0", + version = "3.22.0", deps = [ "@vendor_ts__darling-0.23.0//:darling", - "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", - "@vendor_ts__quote-1.0.45//:quote", - "@vendor_ts__syn-2.0.117//:syn", + "@vendor_ts__proc-macro2-1.0.107//:proc_macro2", + "@vendor_ts__quote-1.0.47//:quote", + "@vendor_ts__syn-2.0.119//:syn", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_yaml-0.9.34+deprecated.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_yaml-0.9.34+deprecated.bazel index 9c4de3d6020c..c21a84236718 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_yaml-0.9.34+deprecated.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_yaml-0.9.34+deprecated.bazel @@ -98,7 +98,7 @@ rust_library( "@vendor_ts__indexmap-2.14.0//:indexmap", "@vendor_ts__itoa-1.0.18//:itoa", "@vendor_ts__ryu-1.0.23//:ryu", - "@vendor_ts__serde-1.0.228//:serde", + "@vendor_ts__serde-1.0.229//:serde", "@vendor_ts__unsafe-libyaml-0.2.11//:unsafe_libyaml", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.shlex-1.3.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.shlex-2.0.1.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.shlex-1.3.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.shlex-2.0.1.bazel index 1b3b26b2284d..9b0bbfb57394 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.shlex-1.3.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.shlex-2.0.1.bazel @@ -39,7 +39,7 @@ rust_library( "std", ], crate_root = "src/lib.rs", - edition = "2015", + edition = "2018", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -97,5 +97,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.3.0", + version = "2.0.1", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.smallvec-1.15.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.smallvec-1.15.2.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.smallvec-1.15.1.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.smallvec-1.15.2.bazel index 9ffaf6afce71..eb3c38e0ba4b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.smallvec-1.15.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.smallvec-1.15.2.bazel @@ -98,5 +98,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.15.1", + version = "1.15.2", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.spin-0.9.8.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.spin-0.9.8.bazel deleted file mode 100644 index 1df9f216dc13..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.spin-0.9.8.bazel +++ /dev/null @@ -1,114 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "spin", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - aliases = { - "@vendor_ts__lock_api-0.4.14//:lock_api": "lock_api_crate", - }, - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "barrier", - "default", - "lazy", - "lock_api", - "lock_api_crate", - "mutex", - "once", - "rwlock", - "spin_mutex", - ], - crate_root = "src/lib.rs", - edition = "2015", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=spin", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.9.8", - deps = [ - "@vendor_ts__lock_api-0.4.14//:lock_api", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.syn-2.0.117.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.syn-2.0.119.bazel similarity index 97% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.syn-2.0.117.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.syn-2.0.119.bazel index b9ef3361a973..0da1c9bd565e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.syn-2.0.117.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.syn-2.0.119.bazel @@ -105,10 +105,10 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "2.0.117", + version = "2.0.119", deps = [ - "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", - "@vendor_ts__quote-1.0.45//:quote", + "@vendor_ts__proc-macro2-1.0.107//:proc_macro2", + "@vendor_ts__quote-1.0.47//:quote", "@vendor_ts__unicode-ident-1.0.24//:unicode_ident", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-deque-0.8.6.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.syn-3.0.3.bazel similarity index 90% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-deque-0.8.6.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.syn-3.0.3.bazel index 5d08b0a7259b..1797b9eff901 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-deque-0.8.6.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.syn-3.0.3.bazel @@ -17,7 +17,7 @@ cargo_toml_env_vars( ) rust_library( - name = "crossbeam_deque", + name = "syn", srcs = glob( include = ["**/*.rs"], allow_empty = True, @@ -35,8 +35,16 @@ rust_library( ], ), crate_features = [ + "clone-impls", "default", - "std", + "derive", + "extra-traits", + "full", + "parsing", + "printing", + "proc-macro", + "visit", + "visit-mut", ], crate_root = "src/lib.rs", edition = "2021", @@ -48,7 +56,7 @@ rust_library( ], tags = [ "cargo-bazel", - "crate-name=crossbeam-deque", + "crate-name=syn", "manual", "noclippy", "norustfmt", @@ -97,9 +105,10 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.8.6", + version = "3.0.3", deps = [ - "@vendor_ts__crossbeam-epoch-0.9.18//:crossbeam_epoch", - "@vendor_ts__crossbeam-utils-0.8.21//:crossbeam_utils", + "@vendor_ts__proc-macro2-1.0.107//:proc_macro2", + "@vendor_ts__quote-1.0.47//:quote", + "@vendor_ts__unicode-ident-1.0.24//:unicode_ident", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.synstructure-0.13.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.synstructure-0.13.2.bazel index 7283c85254ce..0ef07c83494a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.synstructure-0.13.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.synstructure-0.13.2.bazel @@ -99,8 +99,8 @@ rust_library( }), version = "0.13.2", deps = [ - "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", - "@vendor_ts__quote-1.0.45//:quote", - "@vendor_ts__syn-2.0.117//:syn", + "@vendor_ts__proc-macro2-1.0.107//:proc_macro2", + "@vendor_ts__quote-1.0.47//:quote", + "@vendor_ts__syn-2.0.119//:syn", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.temp-dir-0.1.16.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.temp-dir-0.2.0.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.temp-dir-0.1.16.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.temp-dir-0.2.0.bazel index 37f2db5c2100..dd861211e95f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.temp-dir-0.1.16.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.temp-dir-0.2.0.bazel @@ -93,5 +93,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.1.16", + version = "0.2.0", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thin-vec-0.2.18.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thin-vec-0.2.19.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thin-vec-0.2.18.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thin-vec-0.2.19.bazel index c8be97281992..e40003e38423 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thin-vec-0.2.18.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thin-vec-0.2.19.bazel @@ -97,5 +97,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.2.18", + version = "0.2.19", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-2.0.18.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-2.0.20.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-2.0.18.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-2.0.20.bazel index 7ba5989625a1..4daf950ac496 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-2.0.18.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-2.0.20.bazel @@ -45,7 +45,7 @@ rust_library( crate_root = "src/lib.rs", edition = "2021", proc_macro_deps = [ - "@vendor_ts__thiserror-impl-2.0.18//:thiserror_impl", + "@vendor_ts__thiserror-impl-2.0.20//:thiserror_impl", ], rustc_env_files = [ ":cargo_toml_env_vars", @@ -104,9 +104,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "2.0.18", + version = "2.0.20", deps = [ - "@vendor_ts__thiserror-2.0.18//:build_script_build", + "@vendor_ts__thiserror-2.0.20//:build_script_build", ], ) @@ -162,7 +162,7 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "2.0.18", + version = "2.0.20", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-impl-2.0.18.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-impl-2.0.20.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-impl-2.0.18.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-impl-2.0.20.bazel index ef46b223dbb3..91a25ccbdd4d 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-impl-2.0.18.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-impl-2.0.20.bazel @@ -93,10 +93,10 @@ rust_proc_macro( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "2.0.18", + version = "2.0.20", deps = [ - "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", - "@vendor_ts__quote-1.0.45//:quote", - "@vendor_ts__syn-2.0.117//:syn", + "@vendor_ts__proc-macro2-1.0.107//:proc_macro2", + "@vendor_ts__quote-1.0.47//:quote", + "@vendor_ts__syn-3.0.3//:syn", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thread_local-1.1.9.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thread_local-1.1.10.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thread_local-1.1.9.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thread_local-1.1.10.bazel index e38f9011ecd3..58695d057c1a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thread_local-1.1.9.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thread_local-1.1.10.bazel @@ -93,7 +93,7 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.1.9", + version = "1.1.10", deps = [ "@vendor_ts__cfg-if-1.0.4//:cfg_if", ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-0.3.47.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-0.3.55.bazel similarity index 83% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-0.3.47.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-0.3.55.bazel index cdbbb0f4fce5..6a3bba7896a9 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-0.3.47.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-0.3.55.bazel @@ -100,120 +100,119 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.3.47", + version = "0.3.55", deps = [ "@vendor_ts__deranged-0.5.8//:deranged", - "@vendor_ts__itoa-1.0.18//:itoa", "@vendor_ts__num-conv-0.2.2//:num_conv", "@vendor_ts__powerfmt-0.2.0//:powerfmt", - "@vendor_ts__time-core-0.1.8//:time_core", + "@vendor_ts__time-core-0.1.9//:time_core", ] + select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [ - "@vendor_ts__libc-0.2.186//:libc", # aarch64-apple-darwin + "@vendor_ts__libc-0.2.189//:libc", # aarch64-apple-darwin "@vendor_ts__num_threads-0.1.7//:num_threads", # aarch64-apple-darwin ], "@rules_rust//rust/platform:aarch64-apple-ios": [ - "@vendor_ts__libc-0.2.186//:libc", # aarch64-apple-ios + "@vendor_ts__libc-0.2.189//:libc", # aarch64-apple-ios "@vendor_ts__num_threads-0.1.7//:num_threads", # aarch64-apple-ios ], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ - "@vendor_ts__libc-0.2.186//:libc", # aarch64-apple-ios-sim + "@vendor_ts__libc-0.2.189//:libc", # aarch64-apple-ios-sim "@vendor_ts__num_threads-0.1.7//:num_threads", # aarch64-apple-ios-sim ], "@rules_rust//rust/platform:aarch64-linux-android": [ - "@vendor_ts__libc-0.2.186//:libc", # aarch64-linux-android + "@vendor_ts__libc-0.2.189//:libc", # aarch64-linux-android "@vendor_ts__num_threads-0.1.7//:num_threads", # aarch64-linux-android ], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [ - "@vendor_ts__libc-0.2.186//:libc", # aarch64-unknown-fuchsia + "@vendor_ts__libc-0.2.189//:libc", # aarch64-unknown-fuchsia "@vendor_ts__num_threads-0.1.7//:num_threads", # aarch64-unknown-fuchsia ], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # aarch64-unknown-linux-gnu + "@vendor_ts__libc-0.2.189//:libc", # aarch64-unknown-linux-gnu "@vendor_ts__num_threads-0.1.7//:num_threads", # aarch64-unknown-linux-gnu ], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # aarch64-unknown-linux-gnu, aarch64-unknown-nixos-gnu + "@vendor_ts__libc-0.2.189//:libc", # aarch64-unknown-linux-gnu, aarch64-unknown-nixos-gnu "@vendor_ts__num_threads-0.1.7//:num_threads", # aarch64-unknown-linux-gnu, aarch64-unknown-nixos-gnu ], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [ - "@vendor_ts__libc-0.2.186//:libc", # aarch64-unknown-nto-qnx710 + "@vendor_ts__libc-0.2.189//:libc", # aarch64-unknown-nto-qnx710 "@vendor_ts__num_threads-0.1.7//:num_threads", # aarch64-unknown-nto-qnx710 ], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.186//:libc", # arm-unknown-linux-gnueabi + "@vendor_ts__libc-0.2.189//:libc", # arm-unknown-linux-gnueabi "@vendor_ts__num_threads-0.1.7//:num_threads", # arm-unknown-linux-gnueabi ], "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [ - "@vendor_ts__libc-0.2.186//:libc", # arm-unknown-linux-musleabi + "@vendor_ts__libc-0.2.189//:libc", # arm-unknown-linux-musleabi "@vendor_ts__num_threads-0.1.7//:num_threads", # arm-unknown-linux-musleabi ], "@rules_rust//rust/platform:armv7-linux-androideabi": [ - "@vendor_ts__libc-0.2.186//:libc", # armv7-linux-androideabi + "@vendor_ts__libc-0.2.189//:libc", # armv7-linux-androideabi "@vendor_ts__num_threads-0.1.7//:num_threads", # armv7-linux-androideabi ], "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [ - "@vendor_ts__libc-0.2.186//:libc", # armv7-unknown-linux-gnueabi + "@vendor_ts__libc-0.2.189//:libc", # armv7-unknown-linux-gnueabi "@vendor_ts__num_threads-0.1.7//:num_threads", # armv7-unknown-linux-gnueabi ], "@rules_rust//rust/platform:i686-apple-darwin": [ - "@vendor_ts__libc-0.2.186//:libc", # i686-apple-darwin + "@vendor_ts__libc-0.2.189//:libc", # i686-apple-darwin "@vendor_ts__num_threads-0.1.7//:num_threads", # i686-apple-darwin ], "@rules_rust//rust/platform:i686-linux-android": [ - "@vendor_ts__libc-0.2.186//:libc", # i686-linux-android + "@vendor_ts__libc-0.2.189//:libc", # i686-linux-android "@vendor_ts__num_threads-0.1.7//:num_threads", # i686-linux-android ], "@rules_rust//rust/platform:i686-unknown-freebsd": [ - "@vendor_ts__libc-0.2.186//:libc", # i686-unknown-freebsd + "@vendor_ts__libc-0.2.189//:libc", # i686-unknown-freebsd "@vendor_ts__num_threads-0.1.7//:num_threads", # i686-unknown-freebsd ], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # i686-unknown-linux-gnu + "@vendor_ts__libc-0.2.189//:libc", # i686-unknown-linux-gnu "@vendor_ts__num_threads-0.1.7//:num_threads", # i686-unknown-linux-gnu ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # powerpc-unknown-linux-gnu + "@vendor_ts__libc-0.2.189//:libc", # powerpc-unknown-linux-gnu "@vendor_ts__num_threads-0.1.7//:num_threads", # powerpc-unknown-linux-gnu ], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # riscv64gc-unknown-linux-gnu + "@vendor_ts__libc-0.2.189//:libc", # riscv64gc-unknown-linux-gnu "@vendor_ts__num_threads-0.1.7//:num_threads", # riscv64gc-unknown-linux-gnu ], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # s390x-unknown-linux-gnu + "@vendor_ts__libc-0.2.189//:libc", # s390x-unknown-linux-gnu "@vendor_ts__num_threads-0.1.7//:num_threads", # s390x-unknown-linux-gnu ], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [ - "@vendor_ts__libc-0.2.186//:libc", # wasm32-unknown-emscripten + "@vendor_ts__libc-0.2.189//:libc", # wasm32-unknown-emscripten "@vendor_ts__num_threads-0.1.7//:num_threads", # wasm32-unknown-emscripten ], "@rules_rust//rust/platform:x86_64-apple-darwin": [ - "@vendor_ts__libc-0.2.186//:libc", # x86_64-apple-darwin + "@vendor_ts__libc-0.2.189//:libc", # x86_64-apple-darwin "@vendor_ts__num_threads-0.1.7//:num_threads", # x86_64-apple-darwin ], "@rules_rust//rust/platform:x86_64-apple-ios": [ - "@vendor_ts__libc-0.2.186//:libc", # x86_64-apple-ios + "@vendor_ts__libc-0.2.189//:libc", # x86_64-apple-ios "@vendor_ts__num_threads-0.1.7//:num_threads", # x86_64-apple-ios ], "@rules_rust//rust/platform:x86_64-linux-android": [ - "@vendor_ts__libc-0.2.186//:libc", # x86_64-linux-android + "@vendor_ts__libc-0.2.189//:libc", # x86_64-linux-android "@vendor_ts__num_threads-0.1.7//:num_threads", # x86_64-linux-android ], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [ - "@vendor_ts__libc-0.2.186//:libc", # x86_64-unknown-freebsd + "@vendor_ts__libc-0.2.189//:libc", # x86_64-unknown-freebsd "@vendor_ts__num_threads-0.1.7//:num_threads", # x86_64-unknown-freebsd ], "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [ - "@vendor_ts__libc-0.2.186//:libc", # x86_64-unknown-fuchsia + "@vendor_ts__libc-0.2.189//:libc", # x86_64-unknown-fuchsia "@vendor_ts__num_threads-0.1.7//:num_threads", # x86_64-unknown-fuchsia ], "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # x86_64-unknown-linux-gnu + "@vendor_ts__libc-0.2.189//:libc", # x86_64-unknown-linux-gnu "@vendor_ts__num_threads-0.1.7//:num_threads", # x86_64-unknown-linux-gnu ], "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [ - "@vendor_ts__libc-0.2.186//:libc", # x86_64-unknown-linux-gnu, x86_64-unknown-nixos-gnu + "@vendor_ts__libc-0.2.189//:libc", # x86_64-unknown-linux-gnu, x86_64-unknown-nixos-gnu "@vendor_ts__num_threads-0.1.7//:num_threads", # x86_64-unknown-linux-gnu, x86_64-unknown-nixos-gnu ], "//conditions:default": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-core-0.1.8.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-core-0.1.9.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-core-0.1.8.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-core-0.1.9.bazel index 226d665682fa..62de530f7fa8 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-core-0.1.8.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-core-0.1.9.bazel @@ -93,5 +93,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.1.8", + version = "0.1.9", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-macros-0.2.27.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-macros-0.2.32.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-macros-0.2.27.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-macros-0.2.32.bazel index 25f46454c286..9f36f241557b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-macros-0.2.27.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-macros-0.2.32.bazel @@ -93,9 +93,9 @@ rust_proc_macro( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.2.27", + version = "0.2.32", deps = [ "@vendor_ts__num-conv-0.2.2//:num_conv", - "@vendor_ts__time-core-0.1.8//:time_core", + "@vendor_ts__time-core-0.1.9//:time_core", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tinyvec-1.11.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tinyvec-1.12.0.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tinyvec-1.11.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tinyvec-1.12.0.bazel index e8962f83b88c..1ea1107778e8 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tinyvec-1.11.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tinyvec-1.12.0.bazel @@ -93,5 +93,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.11.0", + version = "1.12.0", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml-0.9.12+spec-1.1.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml-0.9.12+spec-1.1.0.bazel deleted file mode 100644 index 00dda2eead4c..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml-0.9.12+spec-1.1.0.bazel +++ /dev/null @@ -1,112 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "toml", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "default", - "display", - "parse", - "serde", - "std", - ], - crate_root = "src/lib.rs", - edition = "2021", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=toml", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.9.12+spec-1.1.0", - deps = [ - "@vendor_ts__serde_core-1.0.228//:serde_core", - "@vendor_ts__serde_spanned-1.1.1//:serde_spanned", - "@vendor_ts__toml_datetime-0.7.5-spec-1.1.0//:toml_datetime", - "@vendor_ts__toml_parser-1.1.2-spec-1.1.0//:toml_parser", - "@vendor_ts__toml_writer-1.1.1-spec-1.1.0//:toml_writer", - "@vendor_ts__winnow-0.7.15//:winnow", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml-1.1.2+spec-1.1.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml-1.1.4+spec-1.1.0.bazel similarity index 94% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml-1.1.2+spec-1.1.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml-1.1.4+spec-1.1.0.bazel index fe92f9515829..95eeb2116843 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml-1.1.2+spec-1.1.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml-1.1.4+spec-1.1.0.bazel @@ -100,13 +100,13 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.1.2+spec-1.1.0", + version = "1.1.4+spec-1.1.0", deps = [ - "@vendor_ts__serde_core-1.0.228//:serde_core", + "@vendor_ts__serde_core-1.0.229//:serde_core", "@vendor_ts__serde_spanned-1.1.1//:serde_spanned", "@vendor_ts__toml_datetime-1.1.1-spec-1.1.0//:toml_datetime", - "@vendor_ts__toml_parser-1.1.2-spec-1.1.0//:toml_parser", - "@vendor_ts__toml_writer-1.1.1-spec-1.1.0//:toml_writer", - "@vendor_ts__winnow-1.0.3//:winnow", + "@vendor_ts__toml_parser-1.1.3-spec-1.1.0//:toml_parser", + "@vendor_ts__toml_writer-1.1.2-spec-1.1.0//:toml_writer", + "@vendor_ts__winnow-1.0.4//:winnow", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_datetime-0.7.5+spec-1.1.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_datetime-0.7.5+spec-1.1.0.bazel deleted file mode 100644 index fc176f8a9b8b..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_datetime-0.7.5+spec-1.1.0.bazel +++ /dev/null @@ -1,105 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "toml_datetime", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "alloc", - "serde", - "std", - ], - crate_root = "src/lib.rs", - edition = "2021", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=toml_datetime", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.7.5+spec-1.1.0", - deps = [ - "@vendor_ts__serde_core-1.0.228//:serde_core", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_datetime-1.1.1+spec-1.1.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_datetime-1.1.1+spec-1.1.0.bazel index f92fd3be64c6..e372df866e73 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_datetime-1.1.1+spec-1.1.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_datetime-1.1.1+spec-1.1.0.bazel @@ -100,6 +100,6 @@ rust_library( }), version = "1.1.1+spec-1.1.0", deps = [ - "@vendor_ts__serde_core-1.0.228//:serde_core", + "@vendor_ts__serde_core-1.0.229//:serde_core", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_parser-1.1.2+spec-1.1.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_parser-1.1.3+spec-1.1.0.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_parser-1.1.2+spec-1.1.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_parser-1.1.3+spec-1.1.0.bazel index 8f32166ede44..a88bebe6fd58 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_parser-1.1.2+spec-1.1.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_parser-1.1.3+spec-1.1.0.bazel @@ -97,8 +97,8 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.1.2+spec-1.1.0", + version = "1.1.3+spec-1.1.0", deps = [ - "@vendor_ts__winnow-1.0.3//:winnow", + "@vendor_ts__winnow-1.0.4//:winnow", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_writer-1.1.1+spec-1.1.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_writer-1.1.2+spec-1.1.0.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_writer-1.1.1+spec-1.1.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_writer-1.1.2+spec-1.1.0.bazel index c3005bdd0207..c03a1711a2cd 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_writer-1.1.1+spec-1.1.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_writer-1.1.2+spec-1.1.0.bazel @@ -97,5 +97,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.1.1+spec-1.1.0", + version = "1.1.2+spec-1.1.0", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-attributes-0.1.31.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-attributes-0.1.31.bazel index 6a87d07d6245..b4aeaf6865ec 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-attributes-0.1.31.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-attributes-0.1.31.bazel @@ -95,8 +95,8 @@ rust_proc_macro( }), version = "0.1.31", deps = [ - "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", - "@vendor_ts__quote-1.0.45//:quote", - "@vendor_ts__syn-2.0.117//:syn", + "@vendor_ts__proc-macro2-1.0.107//:proc_macro2", + "@vendor_ts__quote-1.0.47//:quote", + "@vendor_ts__syn-2.0.119//:syn", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-log-0.2.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-log-0.2.0.bazel index e5c9180aca2f..a8e3cb2ee362 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-log-0.2.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-log-0.2.0.bazel @@ -99,7 +99,7 @@ rust_library( }), version = "0.2.0", deps = [ - "@vendor_ts__log-0.4.29//:log", + "@vendor_ts__log-0.4.33//:log", "@vendor_ts__once_cell-1.21.4//:once_cell", "@vendor_ts__tracing-core-0.1.36//:tracing_core", ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-subscriber-0.3.23.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-subscriber-0.3.23.bazel index c5d7e4c94300..b3627be63a55 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-subscriber-0.3.23.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-subscriber-0.3.23.bazel @@ -117,11 +117,11 @@ rust_library( "@vendor_ts__matchers-0.2.0//:matchers", "@vendor_ts__nu-ansi-term-0.50.3//:nu_ansi_term", "@vendor_ts__once_cell-1.21.4//:once_cell", - "@vendor_ts__regex-automata-0.4.14//:regex_automata", + "@vendor_ts__regex-automata-0.4.18//:regex_automata", "@vendor_ts__sharded-slab-0.1.7//:sharded_slab", - "@vendor_ts__smallvec-1.15.1//:smallvec", - "@vendor_ts__thread_local-1.1.9//:thread_local", - "@vendor_ts__time-0.3.47//:time", + "@vendor_ts__smallvec-1.15.2//:smallvec", + "@vendor_ts__thread_local-1.1.10//:thread_local", + "@vendor_ts__time-0.3.55//:time", "@vendor_ts__tracing-0.1.44//:tracing", "@vendor_ts__tracing-core-0.1.36//:tracing_core", "@vendor_ts__tracing-log-0.2.0//:tracing_log", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-0.26.9.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-0.26.9.bazel index 6b1d1d7fe93d..fec7d148577e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-0.26.9.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-0.26.9.bazel @@ -103,8 +103,8 @@ rust_library( }), version = "0.26.9", deps = [ - "@vendor_ts__regex-1.12.3//:regex", - "@vendor_ts__regex-syntax-0.8.10//:regex_syntax", + "@vendor_ts__regex-1.13.1//:regex", + "@vendor_ts__regex-syntax-0.8.11//:regex_syntax", "@vendor_ts__streaming-iterator-0.1.9//:streaming_iterator", "@vendor_ts__tree-sitter-0.26.9//:build_script_build", "@vendor_ts__tree-sitter-language-0.1.7//:tree_sitter_language", @@ -170,8 +170,8 @@ cargo_build_script( version = "0.26.9", visibility = ["//visibility:private"], deps = [ - "@vendor_ts__cc-1.2.62//:cc", - "@vendor_ts__serde_json-1.0.150//:serde_json", + "@vendor_ts__cc-1.4.2//:cc", + "@vendor_ts__serde_json-1.0.151//:serde_json", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-embedded-template-0.25.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-embedded-template-0.25.0.bazel index d027024bc845..fa790e394a08 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-embedded-template-0.25.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-embedded-template-0.25.0.bazel @@ -158,7 +158,7 @@ cargo_build_script( version = "0.25.0", visibility = ["//visibility:private"], deps = [ - "@vendor_ts__cc-1.2.62//:cc", + "@vendor_ts__cc-1.4.2//:cc", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-json-0.24.8.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-json-0.24.8.bazel index f80596c45905..b03acc29b8e5 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-json-0.24.8.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-json-0.24.8.bazel @@ -158,7 +158,7 @@ cargo_build_script( version = "0.24.8", visibility = ["//visibility:private"], deps = [ - "@vendor_ts__cc-1.2.62//:cc", + "@vendor_ts__cc-1.4.2//:cc", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-python-0.23.6.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-python-0.25.0.bazel similarity index 97% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-python-0.23.6.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-python-0.25.0.bazel index 4568e1556b2e..b97fd9414ee8 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-python-0.23.6.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-python-0.25.0.bazel @@ -97,10 +97,10 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.23.6", + version = "0.25.0", deps = [ "@vendor_ts__tree-sitter-language-0.1.7//:tree_sitter_language", - "@vendor_ts__tree-sitter-python-0.23.6//:build_script_build", + "@vendor_ts__tree-sitter-python-0.25.0//:build_script_build", ], ) @@ -155,10 +155,10 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "0.23.6", + version = "0.25.0", visibility = ["//visibility:private"], deps = [ - "@vendor_ts__cc-1.2.62//:cc", + "@vendor_ts__cc-1.4.2//:cc", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ql-0.23.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ql-0.23.1.bazel index 0735acce2afe..faed88150b66 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ql-0.23.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ql-0.23.1.bazel @@ -158,7 +158,7 @@ cargo_build_script( version = "0.23.1", visibility = ["//visibility:private"], deps = [ - "@vendor_ts__cc-1.2.62//:cc", + "@vendor_ts__cc-1.4.2//:cc", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ruby-0.23.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ruby-0.23.1.bazel index 94e8965196e9..97ebe452de41 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ruby-0.23.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ruby-0.23.1.bazel @@ -158,7 +158,7 @@ cargo_build_script( version = "0.23.1", visibility = ["//visibility:private"], deps = [ - "@vendor_ts__cc-1.2.62//:cc", + "@vendor_ts__cc-1.4.2//:cc", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.triomphe-0.1.15.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.triomphe-0.1.16.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.triomphe-0.1.15.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.triomphe-0.1.16.bazel index 74d278eb3bcd..eda956aeab6e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.triomphe-0.1.15.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.triomphe-0.1.16.bazel @@ -99,9 +99,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.1.15", + version = "0.1.16", deps = [ - "@vendor_ts__serde-1.0.228//:serde", + "@vendor_ts__serde-1.0.229//:serde", "@vendor_ts__stable_deref_trait-1.2.1//:stable_deref_trait", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-0.51.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.typeid-1.0.3.bazel similarity index 94% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-0.51.0.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.typeid-1.0.3.bazel index 17e24365c6b1..0e5737ac61b9 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-0.51.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.typeid-1.0.3.bazel @@ -21,7 +21,7 @@ cargo_toml_env_vars( ) rust_library( - name = "wit_bindgen", + name = "typeid", srcs = glob( include = ["**/*.rs"], allow_empty = True, @@ -39,7 +39,7 @@ rust_library( ], ), crate_root = "src/lib.rs", - edition = "2024", + edition = "2018", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -48,7 +48,7 @@ rust_library( ], tags = [ "cargo-bazel", - "crate-name=wit-bindgen", + "crate-name=typeid", "manual", "noclippy", "norustfmt", @@ -97,9 +97,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.51.0", + version = "1.0.3", deps = [ - "@vendor_ts__wit-bindgen-0.51.0//:build_script_build", + "@vendor_ts__typeid-1.0.3//:build_script_build", ], ) @@ -136,8 +136,8 @@ cargo_build_script( "WORKSPACE.bazel", ], ), - edition = "2024", - pkg_name = "wit-bindgen", + edition = "2018", + pkg_name = "typeid", rustc_env_files = [ ":cargo_toml_env_vars", ], @@ -146,12 +146,12 @@ cargo_build_script( ], tags = [ "cargo-bazel", - "crate-name=wit-bindgen", + "crate-name=typeid", "manual", "noclippy", "norustfmt", ], - version = "0.51.0", + version = "1.0.3", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.unicode-xid-0.2.6.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.unicode-xid-0.2.6.bazel deleted file mode 100644 index c5725abf313e..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.unicode-xid-0.2.6.bazel +++ /dev/null @@ -1,100 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "unicode_xid", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "default", - ], - crate_root = "src/lib.rs", - edition = "2015", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=unicode-xid", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.2.6", -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-0.2.121.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-0.2.126.bazel similarity index 93% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-0.2.121.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-0.2.126.bazel index e0f42d6a3b32..1aa50ddc0697 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-0.2.121.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-0.2.126.bazel @@ -45,7 +45,7 @@ rust_library( crate_root = "src/lib.rs", edition = "2021", proc_macro_deps = [ - "@vendor_ts__wasm-bindgen-macro-0.2.121//:wasm_bindgen_macro", + "@vendor_ts__wasm-bindgen-macro-0.2.126//:wasm_bindgen_macro", ], rustc_env_files = [ ":cargo_toml_env_vars", @@ -104,12 +104,12 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.2.121", + version = "0.2.126", deps = [ "@vendor_ts__cfg-if-1.0.4//:cfg_if", "@vendor_ts__once_cell-1.21.4//:once_cell", - "@vendor_ts__wasm-bindgen-0.2.121//:build_script_build", - "@vendor_ts__wasm-bindgen-shared-0.2.121//:wasm_bindgen_shared", + "@vendor_ts__wasm-bindgen-0.2.126//:build_script_build", + "@vendor_ts__wasm-bindgen-shared-0.2.126//:wasm_bindgen_shared", ], ) @@ -120,7 +120,7 @@ cargo_build_script( allow_empty = True, ), aliases = { - "@vendor_ts__rustversion-1.0.22//:rustversion": "rustversion_compat", + "@vendor_ts__rustversion-1.0.23//:rustversion": "rustversion_compat", }, compile_data = glob( include = ["**"], @@ -155,11 +155,11 @@ cargo_build_script( ), edition = "2021", link_deps = [ - "@vendor_ts__wasm-bindgen-shared-0.2.121//:wasm_bindgen_shared", + "@vendor_ts__wasm-bindgen-shared-0.2.126//:wasm_bindgen_shared", ], pkg_name = "wasm-bindgen", proc_macro_deps = [ - "@vendor_ts__rustversion-1.0.22//:rustversion", + "@vendor_ts__rustversion-1.0.23//:rustversion", ], rustc_env_files = [ ":cargo_toml_env_vars", @@ -174,7 +174,7 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "0.2.121", + version = "0.2.126", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-macro-0.2.121.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-macro-0.2.126.bazel similarity index 96% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-macro-0.2.121.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-macro-0.2.126.bazel index 350d8d20fe08..204b00c88685 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-macro-0.2.121.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-macro-0.2.126.bazel @@ -93,9 +93,9 @@ rust_proc_macro( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.2.121", + version = "0.2.126", deps = [ - "@vendor_ts__quote-1.0.45//:quote", - "@vendor_ts__wasm-bindgen-macro-support-0.2.121//:wasm_bindgen_macro_support", + "@vendor_ts__quote-1.0.47//:quote", + "@vendor_ts__wasm-bindgen-macro-support-0.2.126//:wasm_bindgen_macro_support", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-macro-support-0.2.121.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-macro-support-0.2.126.bazel similarity index 93% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-macro-support-0.2.121.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-macro-support-0.2.126.bazel index 368ec173ac73..eb26a9922b45 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-macro-support-0.2.121.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-macro-support-0.2.126.bazel @@ -93,12 +93,12 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.2.121", + version = "0.2.126", deps = [ - "@vendor_ts__bumpalo-3.20.2//:bumpalo", - "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", - "@vendor_ts__quote-1.0.45//:quote", - "@vendor_ts__syn-2.0.117//:syn", - "@vendor_ts__wasm-bindgen-shared-0.2.121//:wasm_bindgen_shared", + "@vendor_ts__bumpalo-3.20.3//:bumpalo", + "@vendor_ts__proc-macro2-1.0.107//:proc_macro2", + "@vendor_ts__quote-1.0.47//:quote", + "@vendor_ts__syn-2.0.119//:syn", + "@vendor_ts__wasm-bindgen-shared-0.2.126//:wasm_bindgen_shared", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-shared-0.2.121.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-shared-0.2.126.bazel similarity index 97% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-shared-0.2.121.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-shared-0.2.126.bazel index a3e7da764a17..626e950d0c82 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-shared-0.2.121.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-shared-0.2.126.bazel @@ -97,10 +97,10 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "0.2.121", + version = "0.2.126", deps = [ "@vendor_ts__unicode-ident-1.0.24//:unicode_ident", - "@vendor_ts__wasm-bindgen-shared-0.2.121//:build_script_build", + "@vendor_ts__wasm-bindgen-shared-0.2.126//:build_script_build", ], ) @@ -153,7 +153,7 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "0.2.121", + version = "0.2.126", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-encoder-0.244.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-encoder-0.244.0.bazel deleted file mode 100644 index ac2651bb736a..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-encoder-0.244.0.bazel +++ /dev/null @@ -1,106 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "wasm_encoder", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "component-model", - "std", - "wasmparser", - ], - crate_root = "src/lib.rs", - edition = "2021", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=wasm-encoder", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.244.0", - deps = [ - "@vendor_ts__leb128fmt-0.1.0//:leb128fmt", - "@vendor_ts__wasmparser-0.244.0//:wasmparser", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-metadata-0.244.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-metadata-0.244.0.bazel deleted file mode 100644 index 5a91b52eac5c..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-metadata-0.244.0.bazel +++ /dev/null @@ -1,103 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "wasm_metadata", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_root = "src/lib.rs", - edition = "2021", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=wasm-metadata", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.244.0", - deps = [ - "@vendor_ts__anyhow-1.0.102//:anyhow", - "@vendor_ts__indexmap-2.14.0//:indexmap", - "@vendor_ts__wasm-encoder-0.244.0//:wasm_encoder", - "@vendor_ts__wasmparser-0.244.0//:wasmparser", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasmparser-0.244.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasmparser-0.244.0.bazel deleted file mode 100644 index 8b1c810b8090..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasmparser-0.244.0.bazel +++ /dev/null @@ -1,111 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "wasmparser", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "component-model", - "features", - "hash-collections", - "simd", - "std", - "validate", - ], - crate_root = "src/lib.rs", - edition = "2021", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=wasmparser", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.244.0", - deps = [ - "@vendor_ts__bitflags-2.11.1//:bitflags", - "@vendor_ts__hashbrown-0.15.5//:hashbrown", - "@vendor_ts__indexmap-2.14.0//:indexmap", - "@vendor_ts__semver-1.0.28//:semver", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-implement-0.60.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-implement-0.60.2.bazel index 64083d827e6a..88d5472ca932 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-implement-0.60.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-implement-0.60.2.bazel @@ -95,8 +95,8 @@ rust_proc_macro( }), version = "0.60.2", deps = [ - "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", - "@vendor_ts__quote-1.0.45//:quote", - "@vendor_ts__syn-2.0.117//:syn", + "@vendor_ts__proc-macro2-1.0.107//:proc_macro2", + "@vendor_ts__quote-1.0.47//:quote", + "@vendor_ts__syn-2.0.119//:syn", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-interface-0.59.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-interface-0.59.3.bazel index 3ed1833deca0..1955746a848c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-interface-0.59.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-interface-0.59.3.bazel @@ -95,8 +95,8 @@ rust_proc_macro( }), version = "0.59.3", deps = [ - "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", - "@vendor_ts__quote-1.0.45//:quote", - "@vendor_ts__syn-2.0.117//:syn", + "@vendor_ts__proc-macro2-1.0.107//:proc_macro2", + "@vendor_ts__quote-1.0.47//:quote", + "@vendor_ts__syn-2.0.119//:syn", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-sys-0.60.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-sys-0.60.2.bazel index 4caccdd6d022..888c4387ba39 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-sys-0.60.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-sys-0.60.2.bazel @@ -42,7 +42,6 @@ rust_library( "Win32_Storage_FileSystem", "Win32_System", "Win32_System_IO", - "Win32_System_ProcessStatus", "Win32_System_Threading", "Win32_System_WindowsProgramming", "default", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-sys-0.61.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-sys-0.61.2.bazel index 604ec7833e58..8610f9f7d0d3 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-sys-0.61.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-sys-0.61.2.bazel @@ -43,14 +43,12 @@ rust_library( "Win32_Storage", "Win32_Storage_FileSystem", "Win32_System", - "Win32_System_Com", "Win32_System_Console", "Win32_System_IO", "Win32_System_Pipes", + "Win32_System_ProcessStatus", "Win32_System_SystemInformation", "Win32_System_Threading", - "Win32_UI", - "Win32_UI_Shell", "default", ], crate_root = "src/lib.rs", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winnow-1.0.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winnow-1.0.4.bazel similarity index 99% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winnow-1.0.3.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winnow-1.0.4.bazel index 178d093d62b5..4eb20bbbcb79 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winnow-1.0.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winnow-1.0.4.bazel @@ -93,5 +93,5 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.3", + version = "1.0.4", ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-core-0.51.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-core-0.51.0.bazel deleted file mode 100644 index 5d5f5e2dfd8e..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-core-0.51.0.bazel +++ /dev/null @@ -1,102 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "wit_bindgen_core", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_root = "src/lib.rs", - edition = "2024", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=wit-bindgen-core", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.51.0", - deps = [ - "@vendor_ts__anyhow-1.0.102//:anyhow", - "@vendor_ts__heck-0.5.0//:heck", - "@vendor_ts__wit-parser-0.244.0//:wit_parser", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-rust-0.51.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-rust-0.51.0.bazel deleted file mode 100644 index b2266ab0a05d..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-rust-0.51.0.bazel +++ /dev/null @@ -1,173 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load( - "@rules_rust//cargo:defs.bzl", - "cargo_build_script", - "cargo_toml_env_vars", -) -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "wit_bindgen_rust", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_root = "src/lib.rs", - edition = "2024", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=wit-bindgen-rust", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.51.0", - deps = [ - "@vendor_ts__anyhow-1.0.102//:anyhow", - "@vendor_ts__heck-0.5.0//:heck", - "@vendor_ts__indexmap-2.14.0//:indexmap", - "@vendor_ts__prettyplease-0.2.37//:prettyplease", - "@vendor_ts__syn-2.0.117//:syn", - "@vendor_ts__wasm-metadata-0.244.0//:wasm_metadata", - "@vendor_ts__wit-bindgen-core-0.51.0//:wit_bindgen_core", - "@vendor_ts__wit-bindgen-rust-0.51.0//:build_script_build", - "@vendor_ts__wit-component-0.244.0//:wit_component", - ], -) - -cargo_build_script( - name = "_bs", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - "**/*.rs", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_name = "build_script_build", - crate_root = "build.rs", - data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - edition = "2024", - link_deps = [ - "@vendor_ts__prettyplease-0.2.37//:prettyplease", - ], - pkg_name = "wit-bindgen-rust", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=wit-bindgen-rust", - "manual", - "noclippy", - "norustfmt", - ], - version = "0.51.0", - visibility = ["//visibility:private"], -) - -alias( - name = "build_script_build", - actual = ":_bs", - tags = ["manual"], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-rust-macro-0.51.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-rust-macro-0.51.0.bazel deleted file mode 100644 index 8372f1162962..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-bindgen-rust-macro-0.51.0.bazel +++ /dev/null @@ -1,172 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load( - "@rules_rust//cargo:defs.bzl", - "cargo_build_script", - "cargo_toml_env_vars", -) -load("@rules_rust//rust:defs.bzl", "rust_proc_macro") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_proc_macro( - name = "wit_bindgen_rust_macro", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_root = "src/lib.rs", - edition = "2024", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=wit-bindgen-rust-macro", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.51.0", - deps = [ - "@vendor_ts__anyhow-1.0.102//:anyhow", - "@vendor_ts__prettyplease-0.2.37//:prettyplease", - "@vendor_ts__proc-macro2-1.0.106//:proc_macro2", - "@vendor_ts__quote-1.0.45//:quote", - "@vendor_ts__syn-2.0.117//:syn", - "@vendor_ts__wit-bindgen-core-0.51.0//:wit_bindgen_core", - "@vendor_ts__wit-bindgen-rust-0.51.0//:wit_bindgen_rust", - "@vendor_ts__wit-bindgen-rust-macro-0.51.0//:build_script_build", - ], -) - -cargo_build_script( - name = "_bs", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - "**/*.rs", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_name = "build_script_build", - crate_root = "build.rs", - data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - edition = "2024", - link_deps = [ - "@vendor_ts__prettyplease-0.2.37//:prettyplease", - ], - pkg_name = "wit-bindgen-rust-macro", - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=wit-bindgen-rust-macro", - "manual", - "noclippy", - "norustfmt", - ], - version = "0.51.0", - visibility = ["//visibility:private"], -) - -alias( - name = "build_script_build", - actual = ":_bs", - tags = ["manual"], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-component-0.244.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-component-0.244.0.bazel deleted file mode 100644 index a37b395cfdfb..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-component-0.244.0.bazel +++ /dev/null @@ -1,112 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "wit_component", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_root = "src/lib.rs", - edition = "2021", - proc_macro_deps = [ - "@vendor_ts__serde_derive-1.0.228//:serde_derive", - ], - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=wit-component", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.244.0", - deps = [ - "@vendor_ts__anyhow-1.0.102//:anyhow", - "@vendor_ts__bitflags-2.11.1//:bitflags", - "@vendor_ts__indexmap-2.14.0//:indexmap", - "@vendor_ts__log-0.4.29//:log", - "@vendor_ts__serde-1.0.228//:serde", - "@vendor_ts__serde_json-1.0.150//:serde_json", - "@vendor_ts__wasm-encoder-0.244.0//:wasm_encoder", - "@vendor_ts__wasm-metadata-0.244.0//:wasm_metadata", - "@vendor_ts__wasmparser-0.244.0//:wasmparser", - "@vendor_ts__wit-parser-0.244.0//:wit_parser", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-parser-0.244.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-parser-0.244.0.bazel deleted file mode 100644 index 4efcd20bc3e7..000000000000 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wit-parser-0.244.0.bazel +++ /dev/null @@ -1,117 +0,0 @@ -############################################################################### -# @generated -# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To -# regenerate this file, run the following: -# -# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors -############################################################################### - -load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") -load("@rules_rust//rust:defs.bzl", "rust_library") - -package(default_visibility = ["//visibility:public"]) - -cargo_toml_env_vars( - name = "cargo_toml_env_vars", - src = "Cargo.toml", -) - -rust_library( - name = "wit_parser", - srcs = glob( - include = ["**/*.rs"], - allow_empty = True, - ), - compile_data = glob( - include = ["**"], - allow_empty = True, - exclude = [ - "**/* *", - ".tmp_git_root/**/*", - "BUILD", - "BUILD.bazel", - "WORKSPACE", - "WORKSPACE.bazel", - ], - ), - crate_features = [ - "decoding", - "default", - "serde", - "serde_json", - ], - crate_root = "src/lib.rs", - edition = "2021", - proc_macro_deps = [ - "@vendor_ts__serde_derive-1.0.228//:serde_derive", - ], - rustc_env_files = [ - ":cargo_toml_env_vars", - ], - rustc_flags = [ - "--cap-lints=allow", - ], - tags = [ - "cargo-bazel", - "crate-name=wit-parser", - "manual", - "noclippy", - "norustfmt", - ], - target_compatible_with = select({ - "@rules_rust//rust/platform:aarch64-apple-darwin": [], - "@rules_rust//rust/platform:aarch64-apple-ios": [], - "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], - "@rules_rust//rust/platform:aarch64-linux-android": [], - "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], - "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], - "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], - "@rules_rust//rust/platform:aarch64-unknown-uefi": [], - "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:arm-unknown-linux-musleabi": [], - "@rules_rust//rust/platform:armv7-linux-androideabi": [], - "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi": [], - "@rules_rust//rust/platform:i686-apple-darwin": [], - "@rules_rust//rust/platform:i686-linux-android": [], - "@rules_rust//rust/platform:i686-pc-windows-msvc": [], - "@rules_rust//rust/platform:i686-unknown-freebsd": [], - "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], - "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], - "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], - "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], - "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], - "@rules_rust//rust/platform:thumbv7em-none-eabi": [], - "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], - "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], - "@rules_rust//rust/platform:wasm32-unknown-unknown": [], - "@rules_rust//rust/platform:wasm32-wasip1": [], - "@rules_rust//rust/platform:wasm32-wasip1-threads": [], - "@rules_rust//rust/platform:wasm32-wasip2": [], - "@rules_rust//rust/platform:x86_64-apple-darwin": [], - "@rules_rust//rust/platform:x86_64-apple-ios": [], - "@rules_rust//rust/platform:x86_64-linux-android": [], - "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], - "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], - "@rules_rust//rust/platform:x86_64-unknown-fuchsia": [], - "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], - "@rules_rust//rust/platform:x86_64-unknown-none": [], - "@rules_rust//rust/platform:x86_64-unknown-uefi": [], - "//conditions:default": ["@platforms//:incompatible"], - }), - version = "0.244.0", - deps = [ - "@vendor_ts__anyhow-1.0.102//:anyhow", - "@vendor_ts__id-arena-2.3.0//:id_arena", - "@vendor_ts__indexmap-2.14.0//:indexmap", - "@vendor_ts__log-0.4.29//:log", - "@vendor_ts__semver-1.0.28//:semver", - "@vendor_ts__serde-1.0.228//:serde", - "@vendor_ts__serde_json-1.0.150//:serde_json", - "@vendor_ts__unicode-xid-0.2.6//:unicode_xid", - "@vendor_ts__wasmparser-0.244.0//:wasmparser", - ], -) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zmij-1.0.21.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zmij-1.0.23.bazel similarity index 98% rename from misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zmij-1.0.21.bazel rename to misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zmij-1.0.23.bazel index be61c1bfb32c..156e79e10996 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zmij-1.0.21.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zmij-1.0.23.bazel @@ -97,9 +97,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-unknown-uefi": [], "//conditions:default": ["@platforms//:incompatible"], }), - version = "1.0.21", + version = "1.0.23", deps = [ - "@vendor_ts__zmij-1.0.21//:build_script_build", + "@vendor_ts__zmij-1.0.23//:build_script_build", ], ) @@ -151,7 +151,7 @@ cargo_build_script( "noclippy", "norustfmt", ], - version = "1.0.21", + version = "1.0.23", visibility = ["//visibility:private"], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zstd-sys-2.0.16+zstd.1.5.7.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zstd-sys-2.0.16+zstd.1.5.7.bazel index 6c42d38361a7..a4ed5a0b745f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zstd-sys-2.0.16+zstd.1.5.7.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zstd-sys-2.0.16+zstd.1.5.7.bazel @@ -165,7 +165,7 @@ cargo_build_script( version = "2.0.16+zstd.1.5.7", visibility = ["//visibility:private"], deps = [ - "@vendor_ts__cc-1.2.62//:cc", + "@vendor_ts__cc-1.4.2//:cc", "@vendor_ts__pkg-config-0.3.33//:pkg_config", ], ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/defs.bzl b/misc/bazel/3rdparty/tree_sitter_extractors_deps/defs.bzl index 9ba4c05d3ebe..b3b69f861e30 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/defs.bzl +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/defs.bzl @@ -295,12 +295,12 @@ def aliases( _NORMAL_DEPENDENCIES = { "ruby/extractor": { _COMMON_CONDITION: { - "clap": Label("@vendor_ts__clap-4.6.1//:clap"), + "clap": Label("@vendor_ts__clap-4.6.6//:clap"), "encoding": Label("@vendor_ts__encoding-0.2.33//:encoding"), "lazy_static": Label("@vendor_ts__lazy_static-1.5.0//:lazy_static"), "rayon": Label("@vendor_ts__rayon-1.12.0//:rayon"), - "regex": Label("@vendor_ts__regex-1.12.3//:regex"), - "serde_json": Label("@vendor_ts__serde_json-1.0.150//:serde_json"), + "regex": Label("@vendor_ts__regex-1.13.1//:regex"), + "serde_json": Label("@vendor_ts__serde_json-1.0.151//:serde_json"), "tracing": Label("@vendor_ts__tracing-0.1.44//:tracing"), "tracing-subscriber": Label("@vendor_ts__tracing-subscriber-0.3.23//:tracing_subscriber"), "tree-sitter": Label("@vendor_ts__tree-sitter-0.26.9//:tree_sitter"), @@ -310,14 +310,14 @@ _NORMAL_DEPENDENCIES = { }, "rust/ast-generator": { _COMMON_CONDITION: { - "anyhow": Label("@vendor_ts__anyhow-1.0.102//:anyhow"), - "either": Label("@vendor_ts__either-1.16.0//:either"), - "itertools": Label("@vendor_ts__itertools-0.14.0//:itertools"), + "anyhow": Label("@vendor_ts__anyhow-1.0.104//:anyhow"), + "either": Label("@vendor_ts__either-1.17.0//:either"), + "itertools": Label("@vendor_ts__itertools-0.15.0//:itertools"), "mustache": Label("@vendor_ts__mustache-0.9.0//:mustache"), - "proc-macro2": Label("@vendor_ts__proc-macro2-1.0.106//:proc_macro2"), - "quote": Label("@vendor_ts__quote-1.0.45//:quote"), - "serde": Label("@vendor_ts__serde-1.0.228//:serde"), - "stdx": Label("@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx"), + "proc-macro2": Label("@vendor_ts__proc-macro2-1.0.107//:proc_macro2"), + "quote": Label("@vendor_ts__quote-1.0.47//:quote"), + "serde": Label("@vendor_ts__serde-1.0.229//:serde"), + "stdx": Label("@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx"), "ungrammar": Label("@vendor_ts__ungrammar-1.16.1//:ungrammar"), }, }, @@ -325,61 +325,61 @@ _NORMAL_DEPENDENCIES = { }, "rust/extractor": { _COMMON_CONDITION: { - "anyhow": Label("@vendor_ts__anyhow-1.0.102//:anyhow"), + "anyhow": Label("@vendor_ts__anyhow-1.0.104//:anyhow"), "argfile": Label("@vendor_ts__argfile-1.0.0//:argfile"), "chalk-ir": Label("@vendor_ts__chalk-ir-0.104.0//:chalk_ir"), - "chrono": Label("@vendor_ts__chrono-0.4.44//:chrono"), - "clap": Label("@vendor_ts__clap-4.6.1//:clap"), + "chrono": Label("@vendor_ts__chrono-0.4.45//:chrono"), + "clap": Label("@vendor_ts__clap-4.6.6//:clap"), "dunce": Label("@vendor_ts__dunce-1.0.5//:dunce"), "figment": Label("@vendor_ts__figment-0.10.19//:figment"), - "glob": Label("@vendor_ts__glob-0.3.3//:glob"), - "itertools": Label("@vendor_ts__itertools-0.14.0//:itertools"), + "glob": Label("@vendor_ts__glob-0.3.4//:glob"), + "itertools": Label("@vendor_ts__itertools-0.15.0//:itertools"), "mustache": Label("@vendor_ts__mustache-0.9.0//:mustache"), "num-traits": Label("@vendor_ts__num-traits-0.2.19//:num_traits"), - "ra_ap_base_db": Label("@vendor_ts__ra_ap_base_db-0.0.328//:ra_ap_base_db"), - "ra_ap_cfg": Label("@vendor_ts__ra_ap_cfg-0.0.328//:ra_ap_cfg"), - "ra_ap_hir": Label("@vendor_ts__ra_ap_hir-0.0.328//:ra_ap_hir"), - "ra_ap_hir_def": Label("@vendor_ts__ra_ap_hir_def-0.0.328//:ra_ap_hir_def"), - "ra_ap_hir_expand": Label("@vendor_ts__ra_ap_hir_expand-0.0.328//:ra_ap_hir_expand"), - "ra_ap_hir_ty": Label("@vendor_ts__ra_ap_hir_ty-0.0.328//:ra_ap_hir_ty"), - "ra_ap_ide_db": Label("@vendor_ts__ra_ap_ide_db-0.0.328//:ra_ap_ide_db"), - "ra_ap_intern": Label("@vendor_ts__ra_ap_intern-0.0.328//:ra_ap_intern"), - "ra_ap_load-cargo": Label("@vendor_ts__ra_ap_load-cargo-0.0.328//:ra_ap_load_cargo"), - "ra_ap_parser": Label("@vendor_ts__ra_ap_parser-0.0.328//:ra_ap_parser"), - "ra_ap_paths": Label("@vendor_ts__ra_ap_paths-0.0.328//:ra_ap_paths"), - "ra_ap_project_model": Label("@vendor_ts__ra_ap_project_model-0.0.328//:ra_ap_project_model"), - "ra_ap_span": Label("@vendor_ts__ra_ap_span-0.0.328//:ra_ap_span"), - "ra_ap_syntax": Label("@vendor_ts__ra_ap_syntax-0.0.328//:ra_ap_syntax"), - "ra_ap_syntax-bridge": Label("@vendor_ts__ra_ap_syntax-bridge-0.0.328//:ra_ap_syntax_bridge"), - "ra_ap_vfs": Label("@vendor_ts__ra_ap_vfs-0.0.328//:ra_ap_vfs"), - "serde": Label("@vendor_ts__serde-1.0.228//:serde"), - "serde_json": Label("@vendor_ts__serde_json-1.0.150//:serde_json"), - "serde_with": Label("@vendor_ts__serde_with-3.20.0//:serde_with"), - "toml": Label("@vendor_ts__toml-1.1.2-spec-1.1.0//:toml"), + "ra_ap_base_db": Label("@vendor_ts__ra_ap_base_db-0.0.347//:ra_ap_base_db"), + "ra_ap_cfg": Label("@vendor_ts__ra_ap_cfg-0.0.347//:ra_ap_cfg"), + "ra_ap_hir": Label("@vendor_ts__ra_ap_hir-0.0.347//:ra_ap_hir"), + "ra_ap_hir_def": Label("@vendor_ts__ra_ap_hir_def-0.0.347//:ra_ap_hir_def"), + "ra_ap_hir_expand": Label("@vendor_ts__ra_ap_hir_expand-0.0.347//:ra_ap_hir_expand"), + "ra_ap_hir_ty": Label("@vendor_ts__ra_ap_hir_ty-0.0.347//:ra_ap_hir_ty"), + "ra_ap_ide_db": Label("@vendor_ts__ra_ap_ide_db-0.0.347//:ra_ap_ide_db"), + "ra_ap_intern": Label("@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern"), + "ra_ap_load-cargo": Label("@vendor_ts__ra_ap_load-cargo-0.0.347//:ra_ap_load_cargo"), + "ra_ap_parser": Label("@vendor_ts__ra_ap_parser-0.0.347//:ra_ap_parser"), + "ra_ap_paths": Label("@vendor_ts__ra_ap_paths-0.0.347//:ra_ap_paths"), + "ra_ap_project_model": Label("@vendor_ts__ra_ap_project_model-0.0.347//:ra_ap_project_model"), + "ra_ap_span": Label("@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span"), + "ra_ap_syntax": Label("@vendor_ts__ra_ap_syntax-0.0.347//:ra_ap_syntax"), + "ra_ap_syntax-bridge": Label("@vendor_ts__ra_ap_syntax-bridge-0.0.347//:ra_ap_syntax_bridge"), + "ra_ap_vfs": Label("@vendor_ts__ra_ap_vfs-0.0.347//:ra_ap_vfs"), + "serde": Label("@vendor_ts__serde-1.0.229//:serde"), + "serde_json": Label("@vendor_ts__serde_json-1.0.151//:serde_json"), + "serde_with": Label("@vendor_ts__serde_with-3.22.0//:serde_with"), + "toml": Label("@vendor_ts__toml-1.1.4-spec-1.1.0//:toml"), "tracing": Label("@vendor_ts__tracing-0.1.44//:tracing"), "tracing-flame": Label("@vendor_ts__tracing-flame-0.2.0//:tracing_flame"), "tracing-subscriber": Label("@vendor_ts__tracing-subscriber-0.3.23//:tracing_subscriber"), - "triomphe": Label("@vendor_ts__triomphe-0.1.15//:triomphe"), + "triomphe": Label("@vendor_ts__triomphe-0.1.16//:triomphe"), }, }, "rust/extractor/macros": { _COMMON_CONDITION: { - "quote": Label("@vendor_ts__quote-1.0.45//:quote"), - "syn": Label("@vendor_ts__syn-2.0.117//:syn"), + "quote": Label("@vendor_ts__quote-1.0.47//:quote"), + "syn": Label("@vendor_ts__syn-3.0.3//:syn"), }, }, "shared/tree-sitter-extractor": { _COMMON_CONDITION: { - "chrono": Label("@vendor_ts__chrono-0.4.44//:chrono"), + "chrono": Label("@vendor_ts__chrono-0.4.45//:chrono"), "encoding": Label("@vendor_ts__encoding-0.2.33//:encoding"), "flate2": Label("@vendor_ts__flate2-1.1.9//:flate2"), "globset": Label("@vendor_ts__globset-0.4.18//:globset"), "lazy_static": Label("@vendor_ts__lazy_static-1.5.0//:lazy_static"), "num_cpus": Label("@vendor_ts__num_cpus-1.17.0//:num_cpus"), "rayon": Label("@vendor_ts__rayon-1.12.0//:rayon"), - "regex": Label("@vendor_ts__regex-1.12.3//:regex"), - "serde": Label("@vendor_ts__serde-1.0.228//:serde"), - "serde_json": Label("@vendor_ts__serde_json-1.0.150//:serde_json"), + "regex": Label("@vendor_ts__regex-1.13.1//:regex"), + "serde": Label("@vendor_ts__serde-1.0.229//:serde"), + "serde_json": Label("@vendor_ts__serde_json-1.0.151//:serde_json"), "tracing": Label("@vendor_ts__tracing-0.1.44//:tracing"), "tracing-subscriber": Label("@vendor_ts__tracing-subscriber-0.3.23//:tracing_subscriber"), "tree-sitter": Label("@vendor_ts__tree-sitter-0.26.9//:tree_sitter"), @@ -388,37 +388,37 @@ _NORMAL_DEPENDENCIES = { }, "shared/yeast": { _COMMON_CONDITION: { - "clap": Label("@vendor_ts__clap-4.6.1//:clap"), - "serde": Label("@vendor_ts__serde-1.0.228//:serde"), - "serde_json": Label("@vendor_ts__serde_json-1.0.150//:serde_json"), + "clap": Label("@vendor_ts__clap-4.6.6//:clap"), + "serde": Label("@vendor_ts__serde-1.0.229//:serde"), + "serde_json": Label("@vendor_ts__serde_json-1.0.151//:serde_json"), "serde_yaml": Label("@vendor_ts__serde_yaml-0.9.34-deprecated//:serde_yaml"), "tree-sitter": Label("@vendor_ts__tree-sitter-0.26.9//:tree_sitter"), - "tree-sitter-python": Label("@vendor_ts__tree-sitter-python-0.23.6//:tree_sitter_python"), + "tree-sitter-python": Label("@vendor_ts__tree-sitter-python-0.25.0//:tree_sitter_python"), "tree-sitter-ruby": Label("@vendor_ts__tree-sitter-ruby-0.23.1//:tree_sitter_ruby"), }, }, "shared/yeast-macros": { _COMMON_CONDITION: { - "proc-macro2": Label("@vendor_ts__proc-macro2-1.0.106//:proc_macro2"), - "quote": Label("@vendor_ts__quote-1.0.45//:quote"), - "syn": Label("@vendor_ts__syn-2.0.117//:syn"), + "proc-macro2": Label("@vendor_ts__proc-macro2-1.0.107//:proc_macro2"), + "quote": Label("@vendor_ts__quote-1.0.47//:quote"), + "syn": Label("@vendor_ts__syn-3.0.3//:syn"), }, }, "shared/yeast-schema": { _COMMON_CONDITION: { - "serde": Label("@vendor_ts__serde-1.0.228//:serde"), - "serde_json": Label("@vendor_ts__serde_json-1.0.150//:serde_json"), + "serde": Label("@vendor_ts__serde-1.0.229//:serde"), + "serde_json": Label("@vendor_ts__serde_json-1.0.151//:serde_json"), "serde_yaml": Label("@vendor_ts__serde_yaml-0.9.34-deprecated//:serde_yaml"), }, }, "unified/extractor": { _COMMON_CONDITION: { - "clap": Label("@vendor_ts__clap-4.6.1//:clap"), + "clap": Label("@vendor_ts__clap-4.6.6//:clap"), "encoding": Label("@vendor_ts__encoding-0.2.33//:encoding"), "lazy_static": Label("@vendor_ts__lazy_static-1.5.0//:lazy_static"), "rayon": Label("@vendor_ts__rayon-1.12.0//:rayon"), - "regex": Label("@vendor_ts__regex-1.12.3//:regex"), - "serde_json": Label("@vendor_ts__serde_json-1.0.150//:serde_json"), + "regex": Label("@vendor_ts__regex-1.13.1//:regex"), + "serde_json": Label("@vendor_ts__serde_json-1.0.151//:serde_json"), "tracing": Label("@vendor_ts__tracing-0.1.44//:tracing"), "tracing-subscriber": Label("@vendor_ts__tracing-subscriber-0.3.23//:tracing_subscriber"), }, @@ -436,7 +436,7 @@ _NORMAL_ALIASES = { }, "rust/ast-generator": { _COMMON_CONDITION: { - Label("@vendor_ts__ra_ap_stdx-0.0.328//:ra_ap_stdx"): "stdx", + Label("@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx"): "stdx", }, }, "rust/autobuild": { @@ -488,7 +488,7 @@ _NORMAL_DEV_DEPENDENCIES = { }, "shared/tree-sitter-extractor": { _COMMON_CONDITION: { - "rand": Label("@vendor_ts__rand-0.10.1//:rand"), + "rand": Label("@vendor_ts__rand-0.10.2//:rand"), "tree-sitter-json": Label("@vendor_ts__tree-sitter-json-0.24.8//:tree_sitter_json"), "tree-sitter-ql": Label("@vendor_ts__tree-sitter-ql-0.23.1//:tree_sitter_ql"), }, @@ -758,8 +758,6 @@ _CONDITIONS = { "cfg(all(target_arch = \"aarch64\", target_vendor = \"apple\"))": ["@rules_rust//rust/platform:aarch64-apple-darwin", "@rules_rust//rust/platform:aarch64-apple-ios", "@rules_rust//rust/platform:aarch64-apple-ios-sim"], "cfg(all(target_arch = \"loongarch64\", target_os = \"linux\"))": [], "cfg(all(target_arch = \"wasm32\", target_os = \"unknown\"))": ["@rules_rust//rust/platform:wasm32-unknown-unknown"], - "cfg(all(target_arch = \"wasm32\", target_os = \"wasi\", target_env = \"p2\"))": ["@rules_rust//rust/platform:wasm32-wasip2"], - "cfg(all(target_arch = \"wasm32\", target_os = \"wasi\", target_env = \"p3\"))": [], "cfg(all(target_arch = \"x86\", target_env = \"gnu\", not(target_abi = \"llvm\"), not(windows_raw_dylib)))": ["@rules_rust//rust/platform:i686-unknown-linux-gnu"], "cfg(all(target_arch = \"x86\", target_env = \"msvc\", not(windows_raw_dylib)))": ["@rules_rust//rust/platform:i686-pc-windows-msvc"], "cfg(all(target_arch = \"x86_64\", target_env = \"gnu\", not(target_abi = \"llvm\"), not(windows_raw_dylib)))": ["@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], @@ -777,8 +775,8 @@ _CONDITIONS = { "cfg(any(target_os = \"macos\", target_os = \"openbsd\", target_os = \"vita\", target_os = \"emscripten\"))": ["@rules_rust//rust/platform:aarch64-apple-darwin", "@rules_rust//rust/platform:i686-apple-darwin", "@rules_rust//rust/platform:wasm32-unknown-emscripten", "@rules_rust//rust/platform:x86_64-apple-darwin"], "cfg(any(target_pointer_width = \"8\", target_pointer_width = \"16\", target_pointer_width = \"32\"))": ["@rules_rust//rust/platform:arm-unknown-linux-gnueabi", "@rules_rust//rust/platform:arm-unknown-linux-musleabi", "@rules_rust//rust/platform:armv7-linux-androideabi", "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi", "@rules_rust//rust/platform:i686-apple-darwin", "@rules_rust//rust/platform:i686-linux-android", "@rules_rust//rust/platform:i686-pc-windows-msvc", "@rules_rust//rust/platform:i686-unknown-freebsd", "@rules_rust//rust/platform:i686-unknown-linux-gnu", "@rules_rust//rust/platform:powerpc-unknown-linux-gnu", "@rules_rust//rust/platform:riscv32imc-unknown-none-elf", "@rules_rust//rust/platform:thumbv7em-none-eabi", "@rules_rust//rust/platform:thumbv8m.main-none-eabi", "@rules_rust//rust/platform:wasm32-unknown-emscripten", "@rules_rust//rust/platform:wasm32-unknown-unknown", "@rules_rust//rust/platform:wasm32-wasip1", "@rules_rust//rust/platform:wasm32-wasip1-threads", "@rules_rust//rust/platform:wasm32-wasip2"], "cfg(any(unix, target_os = \"hermit\", target_os = \"wasi\"))": ["@rules_rust//rust/platform:aarch64-apple-darwin", "@rules_rust//rust/platform:aarch64-apple-ios", "@rules_rust//rust/platform:aarch64-apple-ios-sim", "@rules_rust//rust/platform:aarch64-linux-android", "@rules_rust//rust/platform:aarch64-unknown-fuchsia", "@rules_rust//rust/platform:aarch64-unknown-linux-gnu", "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu", "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710", "@rules_rust//rust/platform:arm-unknown-linux-gnueabi", "@rules_rust//rust/platform:arm-unknown-linux-musleabi", "@rules_rust//rust/platform:armv7-linux-androideabi", "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi", "@rules_rust//rust/platform:i686-apple-darwin", "@rules_rust//rust/platform:i686-linux-android", "@rules_rust//rust/platform:i686-unknown-freebsd", "@rules_rust//rust/platform:i686-unknown-linux-gnu", "@rules_rust//rust/platform:powerpc-unknown-linux-gnu", "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu", "@rules_rust//rust/platform:s390x-unknown-linux-gnu", "@rules_rust//rust/platform:wasm32-unknown-emscripten", "@rules_rust//rust/platform:wasm32-wasip1", "@rules_rust//rust/platform:wasm32-wasip1-threads", "@rules_rust//rust/platform:wasm32-wasip2", "@rules_rust//rust/platform:x86_64-apple-darwin", "@rules_rust//rust/platform:x86_64-apple-ios", "@rules_rust//rust/platform:x86_64-linux-android", "@rules_rust//rust/platform:x86_64-unknown-freebsd", "@rules_rust//rust/platform:x86_64-unknown-fuchsia", "@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], + "cfg(not(target_has_atomic = \"ptr\"))": ["@rules_rust//rust/platform:riscv32imc-unknown-none-elf"], "cfg(not(windows))": ["@rules_rust//rust/platform:aarch64-apple-darwin", "@rules_rust//rust/platform:aarch64-apple-ios", "@rules_rust//rust/platform:aarch64-apple-ios-sim", "@rules_rust//rust/platform:aarch64-linux-android", "@rules_rust//rust/platform:aarch64-unknown-fuchsia", "@rules_rust//rust/platform:aarch64-unknown-linux-gnu", "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu", "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710", "@rules_rust//rust/platform:aarch64-unknown-uefi", "@rules_rust//rust/platform:arm-unknown-linux-gnueabi", "@rules_rust//rust/platform:arm-unknown-linux-musleabi", "@rules_rust//rust/platform:armv7-linux-androideabi", "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi", "@rules_rust//rust/platform:i686-apple-darwin", "@rules_rust//rust/platform:i686-linux-android", "@rules_rust//rust/platform:i686-unknown-freebsd", "@rules_rust//rust/platform:i686-unknown-linux-gnu", "@rules_rust//rust/platform:powerpc-unknown-linux-gnu", "@rules_rust//rust/platform:riscv32imc-unknown-none-elf", "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu", "@rules_rust//rust/platform:riscv64gc-unknown-none-elf", "@rules_rust//rust/platform:s390x-unknown-linux-gnu", "@rules_rust//rust/platform:thumbv7em-none-eabi", "@rules_rust//rust/platform:thumbv8m.main-none-eabi", "@rules_rust//rust/platform:wasm32-unknown-emscripten", "@rules_rust//rust/platform:wasm32-unknown-unknown", "@rules_rust//rust/platform:wasm32-wasip1", "@rules_rust//rust/platform:wasm32-wasip1-threads", "@rules_rust//rust/platform:wasm32-wasip2", "@rules_rust//rust/platform:x86_64-apple-darwin", "@rules_rust//rust/platform:x86_64-apple-ios", "@rules_rust//rust/platform:x86_64-linux-android", "@rules_rust//rust/platform:x86_64-unknown-freebsd", "@rules_rust//rust/platform:x86_64-unknown-fuchsia", "@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu", "@rules_rust//rust/platform:x86_64-unknown-none", "@rules_rust//rust/platform:x86_64-unknown-uefi"], - "cfg(target_arch = \"x86_64\")": ["@rules_rust//rust/platform:x86_64-apple-darwin", "@rules_rust//rust/platform:x86_64-apple-ios", "@rules_rust//rust/platform:x86_64-linux-android", "@rules_rust//rust/platform:x86_64-pc-windows-msvc", "@rules_rust//rust/platform:x86_64-unknown-freebsd", "@rules_rust//rust/platform:x86_64-unknown-fuchsia", "@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu", "@rules_rust//rust/platform:x86_64-unknown-none", "@rules_rust//rust/platform:x86_64-unknown-uefi"], "cfg(target_family = \"wasm\")": ["@rules_rust//rust/platform:wasm32-unknown-emscripten", "@rules_rust//rust/platform:wasm32-unknown-unknown", "@rules_rust//rust/platform:wasm32-wasip1", "@rules_rust//rust/platform:wasm32-wasip1-threads", "@rules_rust//rust/platform:wasm32-wasip2"], "cfg(target_os = \"android\")": ["@rules_rust//rust/platform:aarch64-linux-android", "@rules_rust//rust/platform:armv7-linux-androideabi", "@rules_rust//rust/platform:i686-linux-android", "@rules_rust//rust/platform:x86_64-linux-android"], "cfg(target_os = \"haiku\")": [], @@ -801,7 +799,6 @@ _CONDITIONS = { "i686-unknown-freebsd": ["@rules_rust//rust/platform:i686-unknown-freebsd"], "i686-unknown-linux-gnu": ["@rules_rust//rust/platform:i686-unknown-linux-gnu"], "powerpc-unknown-linux-gnu": ["@rules_rust//rust/platform:powerpc-unknown-linux-gnu"], - "riscv32i-unknown-none-elf": [], "riscv32imc-unknown-none-elf": ["@rules_rust//rust/platform:riscv32imc-unknown-none-elf"], "riscv64gc-unknown-linux-gnu": ["@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu"], "riscv64gc-unknown-none-elf": ["@rules_rust//rust/platform:riscv64gc-unknown-none-elf"], @@ -824,7 +821,6 @@ _CONDITIONS = { "x86_64-unknown-nixos-gnu": ["@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], "x86_64-unknown-none": ["@rules_rust//rust/platform:x86_64-unknown-none"], "x86_64-unknown-uefi": ["@rules_rust//rust/platform:x86_64-unknown-uefi"], - "xtensa-esp32s2-none-elf": [], } ############################################################################### @@ -847,12 +843,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__aho-corasick-1.1.4", - sha256 = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301", + name = "vendor_ts__aho-corasick-1.1.5", + sha256 = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba", type = "tar.gz", - urls = ["https://static.crates.io/crates/aho-corasick/1.1.4/download"], - strip_prefix = "aho-corasick-1.1.4", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.aho-corasick-1.1.4.bazel"), + urls = ["https://static.crates.io/crates/aho-corasick/1.1.5/download"], + strip_prefix = "aho-corasick-1.1.5", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.aho-corasick-1.1.5.bazel"), ) maybe( @@ -927,12 +923,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__anyhow-1.0.102", - sha256 = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c", + name = "vendor_ts__anyhow-1.0.104", + sha256 = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470", type = "tar.gz", - urls = ["https://static.crates.io/crates/anyhow/1.0.102/download"], - strip_prefix = "anyhow-1.0.102", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.anyhow-1.0.102.bazel"), + urls = ["https://static.crates.io/crates/anyhow/1.0.104/download"], + strip_prefix = "anyhow-1.0.104", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.anyhow-1.0.104.bazel"), ) maybe( @@ -947,12 +943,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__arrayvec-0.7.6", - sha256 = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50", + name = "vendor_ts__arrayvec-0.7.8", + sha256 = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56", type = "tar.gz", - urls = ["https://static.crates.io/crates/arrayvec/0.7.6/download"], - strip_prefix = "arrayvec-0.7.6", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.arrayvec-0.7.6.bazel"), + urls = ["https://static.crates.io/crates/arrayvec/0.7.8/download"], + strip_prefix = "arrayvec-0.7.8", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.arrayvec-0.7.8.bazel"), ) maybe( @@ -965,16 +961,6 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.atomic-0.6.1.bazel"), ) - maybe( - http_archive, - name = "vendor_ts__atomic-polyfill-1.0.3", - sha256 = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4", - type = "tar.gz", - urls = ["https://static.crates.io/crates/atomic-polyfill/1.0.3/download"], - strip_prefix = "atomic-polyfill-1.0.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.atomic-polyfill-1.0.3.bazel"), - ) - maybe( http_archive, name = "vendor_ts__autocfg-1.5.1", @@ -997,22 +983,32 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__bitflags-2.11.1", - sha256 = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3", + name = "vendor_ts__bitflags-1.3.2", + sha256 = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a", + type = "tar.gz", + urls = ["https://static.crates.io/crates/bitflags/1.3.2/download"], + strip_prefix = "bitflags-1.3.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.bitflags-1.3.2.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__bitflags-2.13.1", + sha256 = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da", type = "tar.gz", - urls = ["https://static.crates.io/crates/bitflags/2.11.1/download"], - strip_prefix = "bitflags-2.11.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.bitflags-2.11.1.bazel"), + urls = ["https://static.crates.io/crates/bitflags/2.13.1/download"], + strip_prefix = "bitflags-2.13.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.bitflags-2.13.1.bazel"), ) maybe( http_archive, - name = "vendor_ts__borsh-1.6.1", - sha256 = "cfd1e3f8955a5d7de9fab72fc8373fade9fb8a703968cb200ae3dc6cf08e185a", + name = "vendor_ts__borsh-1.8.0", + sha256 = "a88b7ea17d208c4193f2c1e6de3c35fe71f98c96982d5ced308bdcc749ff6e1f", type = "tar.gz", - urls = ["https://static.crates.io/crates/borsh/1.6.1/download"], - strip_prefix = "borsh-1.6.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.borsh-1.6.1.bazel"), + urls = ["https://static.crates.io/crates/borsh/1.8.0/download"], + strip_prefix = "borsh-1.8.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.borsh-1.8.0.bazel"), ) maybe( @@ -1047,12 +1043,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__bumpalo-3.20.2", - sha256 = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb", + name = "vendor_ts__bumpalo-3.20.3", + sha256 = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649", type = "tar.gz", - urls = ["https://static.crates.io/crates/bumpalo/3.20.2/download"], - strip_prefix = "bumpalo-3.20.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.bumpalo-3.20.2.bazel"), + urls = ["https://static.crates.io/crates/bumpalo/3.20.3/download"], + strip_prefix = "bumpalo-3.20.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.bumpalo-3.20.3.bazel"), ) maybe( @@ -1067,32 +1063,22 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__byteorder-1.5.0", - sha256 = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b", + name = "vendor_ts__bytes-1.12.1", + sha256 = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04", type = "tar.gz", - urls = ["https://static.crates.io/crates/byteorder/1.5.0/download"], - strip_prefix = "byteorder-1.5.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.byteorder-1.5.0.bazel"), + urls = ["https://static.crates.io/crates/bytes/1.12.1/download"], + strip_prefix = "bytes-1.12.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.bytes-1.12.1.bazel"), ) maybe( http_archive, - name = "vendor_ts__bytes-1.11.1", - sha256 = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33", + name = "vendor_ts__camino-1.2.5", + sha256 = "bb1307f12aa967b5a58416e87b3653360e0fd614a016b6e970db08fecbb1b80d", type = "tar.gz", - urls = ["https://static.crates.io/crates/bytes/1.11.1/download"], - strip_prefix = "bytes-1.11.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.bytes-1.11.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__camino-1.2.2", - sha256 = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48", - type = "tar.gz", - urls = ["https://static.crates.io/crates/camino/1.2.2/download"], - strip_prefix = "camino-1.2.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.camino-1.2.2.bazel"), + urls = ["https://static.crates.io/crates/camino/1.2.5/download"], + strip_prefix = "camino-1.2.5", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.camino-1.2.5.bazel"), ) maybe( @@ -1117,12 +1103,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__cc-1.2.62", - sha256 = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98", + name = "vendor_ts__cc-1.4.2", + sha256 = "5d262e149917187838d5b42777c8253bcb64500067342904e7d429499a6f277e", type = "tar.gz", - urls = ["https://static.crates.io/crates/cc/1.2.62/download"], - strip_prefix = "cc-1.2.62", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cc-1.2.62.bazel"), + urls = ["https://static.crates.io/crates/cc/1.4.2/download"], + strip_prefix = "cc-1.4.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cc-1.4.2.bazel"), ) maybe( @@ -1137,22 +1123,22 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__cfg_aliases-0.2.1", - sha256 = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724", + name = "vendor_ts__cfg_aliases-0.2.2", + sha256 = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527", type = "tar.gz", - urls = ["https://static.crates.io/crates/cfg_aliases/0.2.1/download"], - strip_prefix = "cfg_aliases-0.2.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cfg_aliases-0.2.1.bazel"), + urls = ["https://static.crates.io/crates/cfg_aliases/0.2.2/download"], + strip_prefix = "cfg_aliases-0.2.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cfg_aliases-0.2.2.bazel"), ) maybe( http_archive, - name = "vendor_ts__chacha20-0.10.0", - sha256 = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601", + name = "vendor_ts__chacha20-0.10.1", + sha256 = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81", type = "tar.gz", - urls = ["https://static.crates.io/crates/chacha20/0.10.0/download"], - strip_prefix = "chacha20-0.10.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.chacha20-0.10.0.bazel"), + urls = ["https://static.crates.io/crates/chacha20/0.10.1/download"], + strip_prefix = "chacha20-0.10.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.chacha20-0.10.1.bazel"), ) maybe( @@ -1177,42 +1163,42 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__chrono-0.4.44", - sha256 = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0", + name = "vendor_ts__chrono-0.4.45", + sha256 = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327", type = "tar.gz", - urls = ["https://static.crates.io/crates/chrono/0.4.44/download"], - strip_prefix = "chrono-0.4.44", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.chrono-0.4.44.bazel"), + urls = ["https://static.crates.io/crates/chrono/0.4.45/download"], + strip_prefix = "chrono-0.4.45", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.chrono-0.4.45.bazel"), ) maybe( http_archive, - name = "vendor_ts__clap-4.6.1", - sha256 = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51", + name = "vendor_ts__clap-4.6.6", + sha256 = "473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca", type = "tar.gz", - urls = ["https://static.crates.io/crates/clap/4.6.1/download"], - strip_prefix = "clap-4.6.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.clap-4.6.1.bazel"), + urls = ["https://static.crates.io/crates/clap/4.6.6/download"], + strip_prefix = "clap-4.6.6", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.clap-4.6.6.bazel"), ) maybe( http_archive, - name = "vendor_ts__clap_builder-4.6.0", - sha256 = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f", + name = "vendor_ts__clap_builder-4.6.6", + sha256 = "7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889", type = "tar.gz", - urls = ["https://static.crates.io/crates/clap_builder/4.6.0/download"], - strip_prefix = "clap_builder-4.6.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.clap_builder-4.6.0.bazel"), + urls = ["https://static.crates.io/crates/clap_builder/4.6.6/download"], + strip_prefix = "clap_builder-4.6.6", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.clap_builder-4.6.6.bazel"), ) maybe( http_archive, - name = "vendor_ts__clap_derive-4.6.1", - sha256 = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9", + name = "vendor_ts__clap_derive-4.6.4", + sha256 = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061", type = "tar.gz", - urls = ["https://static.crates.io/crates/clap_derive/4.6.1/download"], - strip_prefix = "clap_derive-4.6.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.clap_derive-4.6.1.bazel"), + urls = ["https://static.crates.io/crates/clap_derive/4.6.4/download"], + strip_prefix = "clap_derive-4.6.4", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.clap_derive-4.6.4.bazel"), ) maybe( @@ -1297,42 +1283,32 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__critical-section-1.2.0", - sha256 = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b", + name = "vendor_ts__crossbeam-channel-0.5.16", + sha256 = "d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e", type = "tar.gz", - urls = ["https://static.crates.io/crates/critical-section/1.2.0/download"], - strip_prefix = "critical-section-1.2.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.critical-section-1.2.0.bazel"), + urls = ["https://static.crates.io/crates/crossbeam-channel/0.5.16/download"], + strip_prefix = "crossbeam-channel-0.5.16", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.crossbeam-channel-0.5.16.bazel"), ) maybe( http_archive, - name = "vendor_ts__crossbeam-channel-0.5.15", - sha256 = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2", + name = "vendor_ts__crossbeam-deque-0.8.7", + sha256 = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb", type = "tar.gz", - urls = ["https://static.crates.io/crates/crossbeam-channel/0.5.15/download"], - strip_prefix = "crossbeam-channel-0.5.15", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.crossbeam-channel-0.5.15.bazel"), + urls = ["https://static.crates.io/crates/crossbeam-deque/0.8.7/download"], + strip_prefix = "crossbeam-deque-0.8.7", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.crossbeam-deque-0.8.7.bazel"), ) maybe( http_archive, - name = "vendor_ts__crossbeam-deque-0.8.6", - sha256 = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51", + name = "vendor_ts__crossbeam-epoch-0.9.20", + sha256 = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f", type = "tar.gz", - urls = ["https://static.crates.io/crates/crossbeam-deque/0.8.6/download"], - strip_prefix = "crossbeam-deque-0.8.6", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.crossbeam-deque-0.8.6.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__crossbeam-epoch-0.9.18", - sha256 = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e", - type = "tar.gz", - urls = ["https://static.crates.io/crates/crossbeam-epoch/0.9.18/download"], - strip_prefix = "crossbeam-epoch-0.9.18", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.crossbeam-epoch-0.9.18.bazel"), + urls = ["https://static.crates.io/crates/crossbeam-epoch/0.9.20/download"], + strip_prefix = "crossbeam-epoch-0.9.20", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.crossbeam-epoch-0.9.20.bazel"), ) maybe( @@ -1347,12 +1323,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__crossbeam-utils-0.8.21", - sha256 = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28", + name = "vendor_ts__crossbeam-utils-0.8.22", + sha256 = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17", type = "tar.gz", - urls = ["https://static.crates.io/crates/crossbeam-utils/0.8.21/download"], - strip_prefix = "crossbeam-utils-0.8.21", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.crossbeam-utils-0.8.21.bazel"), + urls = ["https://static.crates.io/crates/crossbeam-utils/0.8.22/download"], + strip_prefix = "crossbeam-utils-0.8.22", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.crossbeam-utils-0.8.22.bazel"), ) maybe( @@ -1387,12 +1363,42 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__dashmap-6.1.0", - sha256 = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf", + name = "vendor_ts__dashmap-6.2.1", + sha256 = "e6361d5c062261c78a176addb82d4c821ae42bed6089de0e12603cd25de2059c", + type = "tar.gz", + urls = ["https://static.crates.io/crates/dashmap/6.2.1/download"], + strip_prefix = "dashmap-6.2.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.dashmap-6.2.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__defmt-1.1.1", + sha256 = "e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1", + type = "tar.gz", + urls = ["https://static.crates.io/crates/defmt/1.1.1/download"], + strip_prefix = "defmt-1.1.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.defmt-1.1.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__defmt-macros-1.1.1", + sha256 = "bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8", + type = "tar.gz", + urls = ["https://static.crates.io/crates/defmt-macros/1.1.1/download"], + strip_prefix = "defmt-macros-1.1.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.defmt-macros-1.1.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__defmt-parser-1.0.0", + sha256 = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e", type = "tar.gz", - urls = ["https://static.crates.io/crates/dashmap/6.1.0/download"], - strip_prefix = "dashmap-6.1.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.dashmap-6.1.0.bazel"), + urls = ["https://static.crates.io/crates/defmt-parser/1.0.0/download"], + strip_prefix = "defmt-parser-1.0.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.defmt-parser-1.0.0.bazel"), ) maybe( @@ -1457,12 +1463,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__either-1.16.0", - sha256 = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e", + name = "vendor_ts__either-1.17.0", + sha256 = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d", type = "tar.gz", - urls = ["https://static.crates.io/crates/either/1.16.0/download"], - strip_prefix = "either-1.16.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.either-1.16.0.bazel"), + urls = ["https://static.crates.io/crates/either/1.17.0/download"], + strip_prefix = "either-1.17.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.either-1.17.0.bazel"), ) maybe( @@ -1587,12 +1593,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__find-msvc-tools-0.1.9", - sha256 = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582", + name = "vendor_ts__find-msvc-tools-0.1.10", + sha256 = "26b73573e6edcd2af0cdf47bd6cb58f0b3839491263c314eaad1ccf24430e1de", type = "tar.gz", - urls = ["https://static.crates.io/crates/find-msvc-tools/0.1.9/download"], - strip_prefix = "find-msvc-tools-0.1.9", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.find-msvc-tools-0.1.9.bazel"), + urls = ["https://static.crates.io/crates/find-msvc-tools/0.1.10/download"], + strip_prefix = "find-msvc-tools-0.1.10", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.find-msvc-tools-0.1.10.bazel"), ) maybe( @@ -1625,6 +1631,16 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.foldhash-0.1.5.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__foldhash-0.2.0", + sha256 = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb", + type = "tar.gz", + urls = ["https://static.crates.io/crates/foldhash/0.2.0/download"], + strip_prefix = "foldhash-0.2.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.foldhash-0.2.0.bazel"), + ) + maybe( http_archive, name = "vendor_ts__fs-err-3.3.0", @@ -1657,62 +1673,52 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__futures-core-0.3.32", - sha256 = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d", + name = "vendor_ts__futures-core-0.3.34", + sha256 = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e", type = "tar.gz", - urls = ["https://static.crates.io/crates/futures-core/0.3.32/download"], - strip_prefix = "futures-core-0.3.32", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.futures-core-0.3.32.bazel"), + urls = ["https://static.crates.io/crates/futures-core/0.3.34/download"], + strip_prefix = "futures-core-0.3.34", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.futures-core-0.3.34.bazel"), ) maybe( http_archive, - name = "vendor_ts__futures-task-0.3.32", - sha256 = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393", + name = "vendor_ts__futures-task-0.3.34", + sha256 = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd", type = "tar.gz", - urls = ["https://static.crates.io/crates/futures-task/0.3.32/download"], - strip_prefix = "futures-task-0.3.32", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.futures-task-0.3.32.bazel"), + urls = ["https://static.crates.io/crates/futures-task/0.3.34/download"], + strip_prefix = "futures-task-0.3.34", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.futures-task-0.3.34.bazel"), ) maybe( http_archive, - name = "vendor_ts__futures-util-0.3.32", - sha256 = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6", + name = "vendor_ts__futures-util-0.3.34", + sha256 = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc", type = "tar.gz", - urls = ["https://static.crates.io/crates/futures-util/0.3.32/download"], - strip_prefix = "futures-util-0.3.32", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.futures-util-0.3.32.bazel"), + urls = ["https://static.crates.io/crates/futures-util/0.3.34/download"], + strip_prefix = "futures-util-0.3.34", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.futures-util-0.3.34.bazel"), ) maybe( http_archive, - name = "vendor_ts__getrandom-0.3.4", - sha256 = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd", + name = "vendor_ts__getrandom-0.4.3", + sha256 = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099", type = "tar.gz", - urls = ["https://static.crates.io/crates/getrandom/0.3.4/download"], - strip_prefix = "getrandom-0.3.4", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.getrandom-0.3.4.bazel"), + urls = ["https://static.crates.io/crates/getrandom/0.4.3/download"], + strip_prefix = "getrandom-0.4.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.getrandom-0.4.3.bazel"), ) maybe( http_archive, - name = "vendor_ts__getrandom-0.4.2", - sha256 = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555", + name = "vendor_ts__glob-0.3.4", + sha256 = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b", type = "tar.gz", - urls = ["https://static.crates.io/crates/getrandom/0.4.2/download"], - strip_prefix = "getrandom-0.4.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.getrandom-0.4.2.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__glob-0.3.3", - sha256 = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280", - type = "tar.gz", - urls = ["https://static.crates.io/crates/glob/0.3.3/download"], - strip_prefix = "glob-0.3.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.glob-0.3.3.bazel"), + urls = ["https://static.crates.io/crates/glob/0.3.4/download"], + strip_prefix = "glob-0.3.4", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.glob-0.3.4.bazel"), ) maybe( @@ -1725,16 +1731,6 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.globset-0.4.18.bazel"), ) - maybe( - http_archive, - name = "vendor_ts__hash32-0.2.1", - sha256 = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67", - type = "tar.gz", - urls = ["https://static.crates.io/crates/hash32/0.2.1/download"], - strip_prefix = "hash32-0.2.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.hash32-0.2.1.bazel"), - ) - maybe( http_archive, name = "vendor_ts__hashbrown-0.12.3", @@ -1777,22 +1773,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__hashlink-0.10.0", - sha256 = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1", - type = "tar.gz", - urls = ["https://static.crates.io/crates/hashlink/0.10.0/download"], - strip_prefix = "hashlink-0.10.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.hashlink-0.10.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__heapless-0.7.17", - sha256 = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f", + name = "vendor_ts__hashlink-0.12.1", + sha256 = "32069d97bb81e38fa67eab65e3393bf804bb85969f2bc06bf13f64aef5aba248", type = "tar.gz", - urls = ["https://static.crates.io/crates/heapless/0.7.17/download"], - strip_prefix = "heapless-0.7.17", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.heapless-0.7.17.bazel"), + urls = ["https://static.crates.io/crates/hashlink/0.12.1/download"], + strip_prefix = "hashlink-0.12.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.hashlink-0.12.1.bazel"), ) maybe( @@ -1825,16 +1811,6 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.hex-0.4.3.bazel"), ) - maybe( - http_archive, - name = "vendor_ts__home-0.5.12", - sha256 = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d", - type = "tar.gz", - urls = ["https://static.crates.io/crates/home/0.5.12/download"], - strip_prefix = "home-0.5.12", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.home-0.5.12.bazel"), - ) - maybe( http_archive, name = "vendor_ts__iana-time-zone-0.1.65", @@ -1855,16 +1831,6 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.iana-time-zone-haiku-0.1.2.bazel"), ) - maybe( - http_archive, - name = "vendor_ts__id-arena-2.3.0", - sha256 = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954", - type = "tar.gz", - urls = ["https://static.crates.io/crates/id-arena/2.3.0/download"], - strip_prefix = "id-arena-2.3.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.id-arena-2.3.0.bazel"), - ) - maybe( http_archive, name = "vendor_ts__ident_case-1.0.1", @@ -1917,22 +1883,22 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__inotify-sys-0.1.5", - sha256 = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb", + name = "vendor_ts__inotify-sys-0.1.8", + sha256 = "c033f80b2c113cdf91ab7a33faa9cbc014726dcad99880c8609af2a370edf37d", type = "tar.gz", - urls = ["https://static.crates.io/crates/inotify-sys/0.1.5/download"], - strip_prefix = "inotify-sys-0.1.5", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.inotify-sys-0.1.5.bazel"), + urls = ["https://static.crates.io/crates/inotify-sys/0.1.8/download"], + strip_prefix = "inotify-sys-0.1.8", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.inotify-sys-0.1.8.bazel"), ) maybe( http_archive, - name = "vendor_ts__intrusive-collections-0.9.7", - sha256 = "189d0897e4cbe8c75efedf3502c18c887b05046e59d28404d4d8e46cbc4d1e86", + name = "vendor_ts__intrusive-collections-0.10.3", + sha256 = "4275b20e6057cd7733fd8df8a5a31701e4fe44497dad0f3fa0e1c4fb971506be", type = "tar.gz", - urls = ["https://static.crates.io/crates/intrusive-collections/0.9.7/download"], - strip_prefix = "intrusive-collections-0.9.7", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.intrusive-collections-0.9.7.bazel"), + urls = ["https://static.crates.io/crates/intrusive-collections/0.10.3/download"], + strip_prefix = "intrusive-collections-0.10.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.intrusive-collections-0.10.3.bazel"), ) maybe( @@ -1957,12 +1923,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__itertools-0.14.0", - sha256 = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285", + name = "vendor_ts__itertools-0.15.0", + sha256 = "8b4baf93f58d4425749ca49a51c50ebab072c5df6994d08fed93541c331481dc", type = "tar.gz", - urls = ["https://static.crates.io/crates/itertools/0.14.0/download"], - strip_prefix = "itertools-0.14.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.itertools-0.14.0.bazel"), + urls = ["https://static.crates.io/crates/itertools/0.15.0/download"], + strip_prefix = "itertools-0.15.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.itertools-0.15.0.bazel"), ) maybe( @@ -1977,12 +1943,62 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__jobserver-0.1.34", - sha256 = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33", + name = "vendor_ts__jiff-0.2.35", + sha256 = "668b7183bd07af9a4885f5c35b0cc5c83c4607a913c16b7e17291832910d2dcc", + type = "tar.gz", + urls = ["https://static.crates.io/crates/jiff/0.2.35/download"], + strip_prefix = "jiff-0.2.35", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.jiff-0.2.35.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__jiff-core-0.1.0", + sha256 = "7feca88439efe53da3754500c1851dedf3cb36c524dd5cf8225cc0794de95d09", + type = "tar.gz", + urls = ["https://static.crates.io/crates/jiff-core/0.1.0/download"], + strip_prefix = "jiff-core-0.1.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.jiff-core-0.1.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__jiff-static-0.2.35", + sha256 = "3a69dcb3a21cfb32ce1cd056169337ca284af0766dd766e7878819b251a49204", + type = "tar.gz", + urls = ["https://static.crates.io/crates/jiff-static/0.2.35/download"], + strip_prefix = "jiff-static-0.2.35", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.jiff-static-0.2.35.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__jiff-tzdb-0.1.8", + sha256 = "142bd39932ad231f10513df9ab62661fead8719872150b7ad02a2df79f4e141e", + type = "tar.gz", + urls = ["https://static.crates.io/crates/jiff-tzdb/0.1.8/download"], + strip_prefix = "jiff-tzdb-0.1.8", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.jiff-tzdb-0.1.8.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__jiff-tzdb-platform-0.1.3", + sha256 = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8", + type = "tar.gz", + urls = ["https://static.crates.io/crates/jiff-tzdb-platform/0.1.3/download"], + strip_prefix = "jiff-tzdb-platform-0.1.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.jiff-tzdb-platform-0.1.3.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__jobserver-0.1.35", + sha256 = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3", type = "tar.gz", - urls = ["https://static.crates.io/crates/jobserver/0.1.34/download"], - strip_prefix = "jobserver-0.1.34", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.jobserver-0.1.34.bazel"), + urls = ["https://static.crates.io/crates/jobserver/0.1.35/download"], + strip_prefix = "jobserver-0.1.35", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.jobserver-0.1.35.bazel"), ) maybe( @@ -1997,22 +2013,22 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__js-sys-0.3.98", - sha256 = "67df7112613f8bfd9150013a0314e196f4800d3201ae742489d999db2f979f08", + name = "vendor_ts__js-sys-0.3.103", + sha256 = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102", type = "tar.gz", - urls = ["https://static.crates.io/crates/js-sys/0.3.98/download"], - strip_prefix = "js-sys-0.3.98", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.js-sys-0.3.98.bazel"), + urls = ["https://static.crates.io/crates/js-sys/0.3.103/download"], + strip_prefix = "js-sys-0.3.103", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.js-sys-0.3.103.bazel"), ) maybe( http_archive, - name = "vendor_ts__kqueue-1.1.1", - sha256 = "eac30106d7dce88daf4a3fcb4879ea939476d5074a9b7ddd0fb97fa4bed5596a", + name = "vendor_ts__kqueue-1.2.0", + sha256 = "273c0752728918e0ac4976f2b275b6fefb9ecd400585dec929419f3844cd87b5", type = "tar.gz", - urls = ["https://static.crates.io/crates/kqueue/1.1.1/download"], - strip_prefix = "kqueue-1.1.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.kqueue-1.1.1.bazel"), + urls = ["https://static.crates.io/crates/kqueue/1.2.0/download"], + strip_prefix = "kqueue-1.2.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.kqueue-1.2.0.bazel"), ) maybe( @@ -2047,22 +2063,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__leb128fmt-0.1.0", - sha256 = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2", - type = "tar.gz", - urls = ["https://static.crates.io/crates/leb128fmt/0.1.0/download"], - strip_prefix = "leb128fmt-0.1.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.leb128fmt-0.1.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__libc-0.2.186", - sha256 = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66", + name = "vendor_ts__libc-0.2.189", + sha256 = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2", type = "tar.gz", - urls = ["https://static.crates.io/crates/libc/0.2.186/download"], - strip_prefix = "libc-0.2.186", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.libc-0.2.186.bazel"), + urls = ["https://static.crates.io/crates/libc/0.2.189/download"], + strip_prefix = "libc-0.2.189", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.libc-0.2.189.bazel"), ) maybe( @@ -2097,12 +2103,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__log-0.4.29", - sha256 = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897", + name = "vendor_ts__log-0.4.33", + sha256 = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad", type = "tar.gz", - urls = ["https://static.crates.io/crates/log/0.4.29/download"], - strip_prefix = "log-0.4.29", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.log-0.4.29.bazel"), + urls = ["https://static.crates.io/crates/log/0.4.33/download"], + strip_prefix = "log-0.4.33", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.log-0.4.33.bazel"), ) maybe( @@ -2117,12 +2123,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__memchr-2.8.0", - sha256 = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79", + name = "vendor_ts__memchr-2.8.3", + sha256 = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98", type = "tar.gz", - urls = ["https://static.crates.io/crates/memchr/2.8.0/download"], - strip_prefix = "memchr-2.8.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.memchr-2.8.0.bazel"), + urls = ["https://static.crates.io/crates/memchr/2.8.3/download"], + strip_prefix = "memchr-2.8.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.memchr-2.8.3.bazel"), ) maybe( @@ -2147,12 +2153,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__mio-1.2.0", - sha256 = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1", + name = "vendor_ts__mio-1.2.2", + sha256 = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427", type = "tar.gz", - urls = ["https://static.crates.io/crates/mio/1.2.0/download"], - strip_prefix = "mio-1.2.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.mio-1.2.0.bazel"), + urls = ["https://static.crates.io/crates/mio/1.2.2/download"], + strip_prefix = "mio-1.2.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.mio-1.2.2.bazel"), ) maybe( @@ -2387,12 +2393,22 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__portable-atomic-1.13.1", - sha256 = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49", + name = "vendor_ts__portable-atomic-1.14.0", + sha256 = "3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3", type = "tar.gz", - urls = ["https://static.crates.io/crates/portable-atomic/1.13.1/download"], - strip_prefix = "portable-atomic-1.13.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.portable-atomic-1.13.1.bazel"), + urls = ["https://static.crates.io/crates/portable-atomic/1.14.0/download"], + strip_prefix = "portable-atomic-1.14.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.portable-atomic-1.14.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__portable-atomic-util-0.2.7", + sha256 = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618", + type = "tar.gz", + urls = ["https://static.crates.io/crates/portable-atomic-util/0.2.7/download"], + strip_prefix = "portable-atomic-util-0.2.7", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.portable-atomic-util-0.2.7.bazel"), ) maybe( @@ -2417,22 +2433,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__prettyplease-0.2.37", - sha256 = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b", + name = "vendor_ts__proc-macro2-1.0.107", + sha256 = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9", type = "tar.gz", - urls = ["https://static.crates.io/crates/prettyplease/0.2.37/download"], - strip_prefix = "prettyplease-0.2.37", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.prettyplease-0.2.37.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__proc-macro2-1.0.106", - sha256 = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934", - type = "tar.gz", - urls = ["https://static.crates.io/crates/proc-macro2/1.0.106/download"], - strip_prefix = "proc-macro2-1.0.106", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.proc-macro2-1.0.106.bazel"), + urls = ["https://static.crates.io/crates/proc-macro2/1.0.107/download"], + strip_prefix = "proc-macro2-1.0.107", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.proc-macro2-1.0.107.bazel"), ) maybe( @@ -2447,22 +2453,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__quote-1.0.45", - sha256 = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924", + name = "vendor_ts__quote-1.0.47", + sha256 = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001", type = "tar.gz", - urls = ["https://static.crates.io/crates/quote/1.0.45/download"], - strip_prefix = "quote-1.0.45", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.quote-1.0.45.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__r-efi-5.3.0", - sha256 = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f", - type = "tar.gz", - urls = ["https://static.crates.io/crates/r-efi/5.3.0/download"], - strip_prefix = "r-efi-5.3.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.r-efi-5.3.0.bazel"), + urls = ["https://static.crates.io/crates/quote/1.0.47/download"], + strip_prefix = "quote-1.0.47", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.quote-1.0.47.bazel"), ) maybe( @@ -2477,402 +2473,392 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__ra-ap-rustc_abi-0.143.0", - sha256 = "1d49dbe5d570793b3c3227972a6ac85fc3e830f09b32c3cb3b68cfceebad3b0a", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra-ap-rustc_abi/0.143.0/download"], - strip_prefix = "ra-ap-rustc_abi-0.143.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_abi-0.143.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra-ap-rustc_ast_ir-0.143.0", - sha256 = "cd0956db62c264a899d15667993cbbd2e8f0b02108712217e2579c61ac30b94b", + name = "vendor_ts__ra-ap-rustc_abi-0.166.0", + sha256 = "e2cf1b1ffe31b6226c00b40cddfda65002b7729f9f4ed2d547b5856cdab0011c", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra-ap-rustc_ast_ir/0.143.0/download"], - strip_prefix = "ra-ap-rustc_ast_ir-0.143.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_ast_ir-0.143.0.bazel"), + urls = ["https://static.crates.io/crates/ra-ap-rustc_abi/0.166.0/download"], + strip_prefix = "ra-ap-rustc_abi-0.166.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_abi-0.166.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra-ap-rustc_hashes-0.143.0", - sha256 = "7df512084c24f4c96c8cc9a59cbd264301efbc8913d3759b065398024af316c9", + name = "vendor_ts__ra-ap-rustc_ast_ir-0.166.0", + sha256 = "2ef42605e36e1305e815ccfc8830eb870f74d78534bca19a61629149536d8e98", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra-ap-rustc_hashes/0.143.0/download"], - strip_prefix = "ra-ap-rustc_hashes-0.143.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_hashes-0.143.0.bazel"), + urls = ["https://static.crates.io/crates/ra-ap-rustc_ast_ir/0.166.0/download"], + strip_prefix = "ra-ap-rustc_ast_ir-0.166.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_ast_ir-0.166.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra-ap-rustc_index-0.143.0", - sha256 = "bca3a49a928d38ba7927605e5909b6abe77d09ff359e4695c070c3f91d69cc8a", + name = "vendor_ts__ra-ap-rustc_hashes-0.166.0", + sha256 = "b9f5542968215c17275920791b2fa13a43014287506ed0450777c79845102e86", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra-ap-rustc_index/0.143.0/download"], - strip_prefix = "ra-ap-rustc_index-0.143.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_index-0.143.0.bazel"), + urls = ["https://static.crates.io/crates/ra-ap-rustc_hashes/0.166.0/download"], + strip_prefix = "ra-ap-rustc_hashes-0.166.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_hashes-0.166.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra-ap-rustc_index_macros-0.143.0", - sha256 = "4463e908a62c64c2a65c1966c2f4995d0e1f8b7dfc85a8b8de2562edf3d89070", + name = "vendor_ts__ra-ap-rustc_index-0.166.0", + sha256 = "1d9e47b9ca7d92cfb0d6653503adbabd41938b84474317397a664326b208d6c6", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra-ap-rustc_index_macros/0.143.0/download"], - strip_prefix = "ra-ap-rustc_index_macros-0.143.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_index_macros-0.143.0.bazel"), + urls = ["https://static.crates.io/crates/ra-ap-rustc_index/0.166.0/download"], + strip_prefix = "ra-ap-rustc_index-0.166.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_index-0.166.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra-ap-rustc_lexer-0.143.0", - sha256 = "228e01e1b237adb4bd8793487e1c37019c1e526a8f93716d99602301be267056", + name = "vendor_ts__ra-ap-rustc_index_macros-0.166.0", + sha256 = "4d744a7a2852a22f06210bcff9e4667ed0cacbfbe94894cc294044d25e876341", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra-ap-rustc_lexer/0.143.0/download"], - strip_prefix = "ra-ap-rustc_lexer-0.143.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_lexer-0.143.0.bazel"), + urls = ["https://static.crates.io/crates/ra-ap-rustc_index_macros/0.166.0/download"], + strip_prefix = "ra-ap-rustc_index_macros-0.166.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_index_macros-0.166.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra-ap-rustc_next_trait_solver-0.143.0", - sha256 = "10d6f91143011d474bb844d268b0784c6a4c6db57743558b83f5ad34511627f1", + name = "vendor_ts__ra-ap-rustc_lexer-0.166.0", + sha256 = "527c12b3731b7d0692498012810b85b2b8dfdb8b514321ed6afc434bd1c70191", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra-ap-rustc_next_trait_solver/0.143.0/download"], - strip_prefix = "ra-ap-rustc_next_trait_solver-0.143.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_next_trait_solver-0.143.0.bazel"), + urls = ["https://static.crates.io/crates/ra-ap-rustc_lexer/0.166.0/download"], + strip_prefix = "ra-ap-rustc_lexer-0.166.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_lexer-0.166.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra-ap-rustc_parse_format-0.143.0", - sha256 = "37fa8effbc436c0ddd9d7b1421aa3cccf8b94566c841c4e4aa3e09063b8f423f", + name = "vendor_ts__ra-ap-rustc_next_trait_solver-0.166.0", + sha256 = "a7a9663a8d7c369e934aac2b74a638537ad7eb4be75b4530d765384dc071c936", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra-ap-rustc_parse_format/0.143.0/download"], - strip_prefix = "ra-ap-rustc_parse_format-0.143.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_parse_format-0.143.0.bazel"), + urls = ["https://static.crates.io/crates/ra-ap-rustc_next_trait_solver/0.166.0/download"], + strip_prefix = "ra-ap-rustc_next_trait_solver-0.166.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_next_trait_solver-0.166.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra-ap-rustc_pattern_analysis-0.143.0", - sha256 = "883c843fc27847ad03b8e772dd4a2d2728af4333a6d6821a22dfcfe7136dff3e", + name = "vendor_ts__ra-ap-rustc_parse_format-0.166.0", + sha256 = "2c038b7a8b0f784d4e441ad8ab991fbbdaa5e0be482e59c639a846a1c8126951", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra-ap-rustc_pattern_analysis/0.143.0/download"], - strip_prefix = "ra-ap-rustc_pattern_analysis-0.143.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_pattern_analysis-0.143.0.bazel"), + urls = ["https://static.crates.io/crates/ra-ap-rustc_parse_format/0.166.0/download"], + strip_prefix = "ra-ap-rustc_parse_format-0.166.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_parse_format-0.166.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra-ap-rustc_type_ir-0.143.0", - sha256 = "a86e33c46b2b261a173b23f207461a514812a8b2d2d7935bbc685f733eacce10", + name = "vendor_ts__ra-ap-rustc_pattern_analysis-0.166.0", + sha256 = "42ca286f90e99bb97cd9274c088f3c874a05d1ee90cabf40a3928afedabe99fd", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra-ap-rustc_type_ir/0.143.0/download"], - strip_prefix = "ra-ap-rustc_type_ir-0.143.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_type_ir-0.143.0.bazel"), + urls = ["https://static.crates.io/crates/ra-ap-rustc_pattern_analysis/0.166.0/download"], + strip_prefix = "ra-ap-rustc_pattern_analysis-0.166.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_pattern_analysis-0.166.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra-ap-rustc_type_ir_macros-0.143.0", - sha256 = "15034c2fcaa5cf302aea6db20eda0f71fffeb0b372d6073cc50f940e974a2a47", + name = "vendor_ts__ra-ap-rustc_type_ir-0.166.0", + sha256 = "26d6efb6008f665a9485e0afecf9f4950a6c4bedd8ddd330a9df8986a6c0160b", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra-ap-rustc_type_ir_macros/0.143.0/download"], - strip_prefix = "ra-ap-rustc_type_ir_macros-0.143.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_type_ir_macros-0.143.0.bazel"), + urls = ["https://static.crates.io/crates/ra-ap-rustc_type_ir/0.166.0/download"], + strip_prefix = "ra-ap-rustc_type_ir-0.166.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_type_ir-0.166.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_base_db-0.0.328", - sha256 = "b1567168e7c7b50acf2ffb87bde8937986d4f41c777a2c308298ede9d555c96c", + name = "vendor_ts__ra-ap-rustc_type_ir_macros-0.166.0", + sha256 = "5f4fd2355e2bbf1f343c730f623596efc6e465b5e3685b606a437567ebb75bf8", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_base_db/0.0.328/download"], - strip_prefix = "ra_ap_base_db-0.0.328", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_base_db-0.0.328.bazel"), + urls = ["https://static.crates.io/crates/ra-ap-rustc_type_ir_macros/0.166.0/download"], + strip_prefix = "ra-ap-rustc_type_ir_macros-0.166.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_type_ir_macros-0.166.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_cfg-0.0.328", - sha256 = "1e1fc8d53014b0ec4c06c9dbf0a810ccd67b3a96de4ef06bd1a248c2295b6a37", + name = "vendor_ts__ra_ap_base_db-0.0.347", + sha256 = "7ea804efdf7c1fdbdac7c1b08002700a6f2930590399abcf84d55b4d4a894116", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_cfg/0.0.328/download"], - strip_prefix = "ra_ap_cfg-0.0.328", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_cfg-0.0.328.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_base_db/0.0.347/download"], + strip_prefix = "ra_ap_base_db-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_base_db-0.0.347.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_edition-0.0.328", - sha256 = "627a8ce8e870632395b7bf053c93039a3d91dda744ccae166ac83650572cfaa2", + name = "vendor_ts__ra_ap_cfg-0.0.347", + sha256 = "c50ba7c60bc08ef48d2a930c5f897349fb0a72cf53e86c0374476f2583d1f098", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_edition/0.0.328/download"], - strip_prefix = "ra_ap_edition-0.0.328", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_edition-0.0.328.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_cfg/0.0.347/download"], + strip_prefix = "ra_ap_cfg-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_cfg-0.0.347.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_hir-0.0.328", - sha256 = "b77616ef81f690a3eba4befd32112780b99f052676b0e7686a22bf79f3fbe2a8", + name = "vendor_ts__ra_ap_edition-0.0.347", + sha256 = "238a2d0108f16fe859e369c5aba251abccd10fae513391ee4d119ac6a48ffec7", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_hir/0.0.328/download"], - strip_prefix = "ra_ap_hir-0.0.328", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_hir-0.0.328.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_edition/0.0.347/download"], + strip_prefix = "ra_ap_edition-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_edition-0.0.347.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_hir_def-0.0.328", - sha256 = "81504dd727efbaf48704a9c0e18e6491cb9848428376ad37146f37f63571ab3c", + name = "vendor_ts__ra_ap_hir-0.0.347", + sha256 = "9b0ff8d334193f5535c13a6749d2ed8ee4c417f75a2a92ffff24eee475097fdd", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_hir_def/0.0.328/download"], - strip_prefix = "ra_ap_hir_def-0.0.328", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_hir_def-0.0.328.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_hir/0.0.347/download"], + strip_prefix = "ra_ap_hir-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_hir-0.0.347.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_hir_expand-0.0.328", - sha256 = "9980623345a88d4431ce80331e640c494e2e59303e82a2cb1290b4684efdc6e5", + name = "vendor_ts__ra_ap_hir_def-0.0.347", + sha256 = "41d0148d0b1f176f27d55df6ac6dc662ed65c55cae367aeb9f30472879626cd5", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_hir_expand/0.0.328/download"], - strip_prefix = "ra_ap_hir_expand-0.0.328", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_hir_expand-0.0.328.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_hir_def/0.0.347/download"], + strip_prefix = "ra_ap_hir_def-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_hir_def-0.0.347.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_hir_ty-0.0.328", - sha256 = "b822d1b9f0168281bbba34e0c5abada891fa9fc5e0b54e86493e8b075a877973", + name = "vendor_ts__ra_ap_hir_expand-0.0.347", + sha256 = "b494d16c4a066ffe135ef730b01806539e87d4e5bb26acbd7cf9ccd2ffb238df", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_hir_ty/0.0.328/download"], - strip_prefix = "ra_ap_hir_ty-0.0.328", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_hir_ty-0.0.328.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_hir_expand/0.0.347/download"], + strip_prefix = "ra_ap_hir_expand-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_hir_expand-0.0.347.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_ide_db-0.0.328", - sha256 = "0e250964a32be6c74f1f72e0fd8aea08aaed0535d85a7fd315fe442942185da0", + name = "vendor_ts__ra_ap_hir_ty-0.0.347", + sha256 = "106393ec163f4cb9537721a04cd5e4d5ec642602c46f524e65a31a431be10269", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_ide_db/0.0.328/download"], - strip_prefix = "ra_ap_ide_db-0.0.328", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_ide_db-0.0.328.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_hir_ty/0.0.347/download"], + strip_prefix = "ra_ap_hir_ty-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_hir_ty-0.0.347.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_intern-0.0.328", - sha256 = "df7edf9d14d093b4314b43ed75eaf56d47d870a09b8d0e0e67d17919c30bfb0f", + name = "vendor_ts__ra_ap_ide_db-0.0.347", + sha256 = "c3ea305ce763f44928d29766c165982dd0a1c9fdba429296889d9e8e64dd28a5", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_intern/0.0.328/download"], - strip_prefix = "ra_ap_intern-0.0.328", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_intern-0.0.328.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_ide_db/0.0.347/download"], + strip_prefix = "ra_ap_ide_db-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_ide_db-0.0.347.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_load-cargo-0.0.328", - sha256 = "184cdaabfb66948938aa4b73ee24f7fa57c1292292c1d87bcad2c616cbd254ea", + name = "vendor_ts__ra_ap_intern-0.0.347", + sha256 = "0a6be54b5f8a47e4aee183dd985440bb2e46d587270f63a6fcb03409a0de7054", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_load-cargo/0.0.328/download"], - strip_prefix = "ra_ap_load-cargo-0.0.328", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_load-cargo-0.0.328.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_intern/0.0.347/download"], + strip_prefix = "ra_ap_intern-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_intern-0.0.347.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_macros-0.0.328", - sha256 = "fd338f982b2f7438ee89ca2429ad7181f2f0751fa6b98d8275905c97e2fb8361", + name = "vendor_ts__ra_ap_load-cargo-0.0.347", + sha256 = "96a50dad86901f2f0dab1e54ccf2dd43ce3bcb934bcaae1c3fa4884a1c45f77a", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_macros/0.0.328/download"], - strip_prefix = "ra_ap_macros-0.0.328", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_macros-0.0.328.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_load-cargo/0.0.347/download"], + strip_prefix = "ra_ap_load-cargo-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_load-cargo-0.0.347.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_mbe-0.0.328", - sha256 = "81d4c7114f2363c05b6dc7f5f6cdd6c9d6a1ba63410b0cdc80c81d1414da7c72", + name = "vendor_ts__ra_ap_macros-0.0.347", + sha256 = "478606f8a75d1c4f8e6bfd4874ecf56303a690e270cffbd82e9fb700637500c5", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_mbe/0.0.328/download"], - strip_prefix = "ra_ap_mbe-0.0.328", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_mbe-0.0.328.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_macros/0.0.347/download"], + strip_prefix = "ra_ap_macros-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_macros-0.0.347.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_parser-0.0.328", - sha256 = "c9851f3b6e93971e6c3957966a07154bc35e0f91c0a6980ad71965620df6f737", + name = "vendor_ts__ra_ap_mbe-0.0.347", + sha256 = "c8d1b45159a9f2e6d61bec480d49a5d2c4a1c8215a75f01cf1d6ae7042cc0330", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_parser/0.0.328/download"], - strip_prefix = "ra_ap_parser-0.0.328", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_parser-0.0.328.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_mbe/0.0.347/download"], + strip_prefix = "ra_ap_mbe-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_mbe-0.0.347.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_paths-0.0.328", - sha256 = "506bbef9963ca9275dd50f5876d68e32a58d47a369ea10bce2be1c758b081c42", + name = "vendor_ts__ra_ap_parser-0.0.347", + sha256 = "8bdb9f2e027f40bbaeff62c026e1affabe691467c0553857f6eb7e36093c5b6f", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_paths/0.0.328/download"], - strip_prefix = "ra_ap_paths-0.0.328", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_paths-0.0.328.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_parser/0.0.347/download"], + strip_prefix = "ra_ap_parser-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_parser-0.0.347.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_proc_macro_api-0.0.328", - sha256 = "18e0229d5c7daa016a8f4f735194e68baf34ca18b73982ae036a8217874f32e9", + name = "vendor_ts__ra_ap_paths-0.0.347", + sha256 = "36bc14237aa65d051028cbb54b0a0e0a1d53487b3f647c2b11667870720af9db", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_proc_macro_api/0.0.328/download"], - strip_prefix = "ra_ap_proc_macro_api-0.0.328", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_proc_macro_api-0.0.328.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_paths/0.0.347/download"], + strip_prefix = "ra_ap_paths-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_paths-0.0.347.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_profile-0.0.328", - sha256 = "b251c30d8e4df3902a92d10c4899e43403921f72aef12afa2f027a77e4898950", + name = "vendor_ts__ra_ap_proc_macro_api-0.0.347", + sha256 = "3c56d7dacb79f01f5d9ab0a25b232acf37d3104d176e67d2985e9e389834c553", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_profile/0.0.328/download"], - strip_prefix = "ra_ap_profile-0.0.328", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_profile-0.0.328.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_proc_macro_api/0.0.347/download"], + strip_prefix = "ra_ap_proc_macro_api-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_proc_macro_api-0.0.347.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_project_model-0.0.328", - sha256 = "2b04624412e45c7b0f792859be553182ea2360d8a24bf7162ca212840e683a24", + name = "vendor_ts__ra_ap_profile-0.0.347", + sha256 = "6f6a81ebc5ef6f42d86ac8d20c82d4132010f28af93da37f08d127eeea24b852", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_project_model/0.0.328/download"], - strip_prefix = "ra_ap_project_model-0.0.328", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_project_model-0.0.328.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_profile/0.0.347/download"], + strip_prefix = "ra_ap_profile-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_profile-0.0.347.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_query-group-macro-0.0.328", - sha256 = "770079ca5addde33d31b7f3fa8d399f0dc29c26f69642a9d5c2a5e623d8af64d", + name = "vendor_ts__ra_ap_project_model-0.0.347", + sha256 = "9cf562304b786b7fa9089d2e0ae489d73abbda1732b0a820977a6fa7f9f5db0c", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_query-group-macro/0.0.328/download"], - strip_prefix = "ra_ap_query-group-macro-0.0.328", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_query-group-macro-0.0.328.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_project_model/0.0.347/download"], + strip_prefix = "ra_ap_project_model-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_project_model-0.0.347.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_span-0.0.328", - sha256 = "80a523bc8c85155ccd1db35b6855d37729d339c572b7fc0801c459bb8218976b", + name = "vendor_ts__ra_ap_span-0.0.347", + sha256 = "6358a99deb3e9564a3702731031bd6a59ab6843258f56697971c2591d142aa8a", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_span/0.0.328/download"], - strip_prefix = "ra_ap_span-0.0.328", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_span-0.0.328.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_span/0.0.347/download"], + strip_prefix = "ra_ap_span-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_span-0.0.347.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_stdx-0.0.328", - sha256 = "eb22b95e21d08060860056c86af1b47b2cecbac5422baa112d9d138e97c3671a", + name = "vendor_ts__ra_ap_stdx-0.0.347", + sha256 = "808a663a921ead35b75a74a2eebe7ab84e5ced29c594e9bf3c77914caf8b77c0", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_stdx/0.0.328/download"], - strip_prefix = "ra_ap_stdx-0.0.328", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_stdx-0.0.328.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_stdx/0.0.347/download"], + strip_prefix = "ra_ap_stdx-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_stdx-0.0.347.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_syntax-0.0.328", - sha256 = "ba3d9c469b5635401647b69e01a9930746f08a3cac51d04ad5ae99e66bdd643f", + name = "vendor_ts__ra_ap_syntax-0.0.347", + sha256 = "733ea008d3847dac53a6463689fd595a1d9459db09b1dc2306f2293dc130f586", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_syntax/0.0.328/download"], - strip_prefix = "ra_ap_syntax-0.0.328", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_syntax-0.0.328.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_syntax/0.0.347/download"], + strip_prefix = "ra_ap_syntax-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_syntax-0.0.347.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_syntax-bridge-0.0.328", - sha256 = "b4d3f2e2a1836eeedc2ed2810ece4cdf7ea42284f71b7031eac8448c1cb95b09", + name = "vendor_ts__ra_ap_syntax-bridge-0.0.347", + sha256 = "f1ea2603396e114a6db5145508242ce9d238983533e3bdc4019cb473247c5e07", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_syntax-bridge/0.0.328/download"], - strip_prefix = "ra_ap_syntax-bridge-0.0.328", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_syntax-bridge-0.0.328.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_syntax-bridge/0.0.347/download"], + strip_prefix = "ra_ap_syntax-bridge-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_syntax-bridge-0.0.347.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_test_fixture-0.0.328", - sha256 = "21d6d353373b4f28f2236ed7843bcee0e4dd0e6a12b339da874460bbefd070ab", + name = "vendor_ts__ra_ap_test_fixture-0.0.347", + sha256 = "77da42ce97d6b9de208c9e9fba23244da564130ee0d892af03d0a6eb72ba8672", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_test_fixture/0.0.328/download"], - strip_prefix = "ra_ap_test_fixture-0.0.328", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_test_fixture-0.0.328.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_test_fixture/0.0.347/download"], + strip_prefix = "ra_ap_test_fixture-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_test_fixture-0.0.347.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_test_utils-0.0.328", - sha256 = "57d10cbb0402abee7034de5d90ddf7e380d1e21ad0e1dcd2db92c3c87df78723", + name = "vendor_ts__ra_ap_test_utils-0.0.347", + sha256 = "fdfcc378493db43a2b837d9cd62c4c91c5d33302ae639b3dbf6d56ed97df6e63", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_test_utils/0.0.328/download"], - strip_prefix = "ra_ap_test_utils-0.0.328", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_test_utils-0.0.328.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_test_utils/0.0.347/download"], + strip_prefix = "ra_ap_test_utils-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_test_utils-0.0.347.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_toolchain-0.0.328", - sha256 = "2fed946c88a9dfa93de7a376a06493c5377a1052ac666ab9e1155f4ea57271c9", + name = "vendor_ts__ra_ap_toolchain-0.0.347", + sha256 = "5f7748b05a913c21f6182b4c2d7c7009251938b8eb01a2b96e61d0c7ca4aacc2", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_toolchain/0.0.328/download"], - strip_prefix = "ra_ap_toolchain-0.0.328", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_toolchain-0.0.328.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_toolchain/0.0.347/download"], + strip_prefix = "ra_ap_toolchain-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_toolchain-0.0.347.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_tt-0.0.328", - sha256 = "96dfc20add2675d38240a7815755b54f514d91b9dc0336cb3d024901af4faeef", + name = "vendor_ts__ra_ap_tt-0.0.347", + sha256 = "babe00307d454b585a66e51f1fe6ccdfd1f82a200ef75374c80e843520cb3f7f", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_tt/0.0.328/download"], - strip_prefix = "ra_ap_tt-0.0.328", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_tt-0.0.328.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_tt/0.0.347/download"], + strip_prefix = "ra_ap_tt-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_tt-0.0.347.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_vfs-0.0.328", - sha256 = "d69bc10b59435e4d989d10bc0b602a5bd70e1dcc2c5d8513b10585d9e778b440", + name = "vendor_ts__ra_ap_vfs-0.0.347", + sha256 = "a730486f6595655431750c15faf4332603ad30f0460e7c89bbee79880416794b", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_vfs/0.0.328/download"], - strip_prefix = "ra_ap_vfs-0.0.328", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_vfs-0.0.328.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_vfs/0.0.347/download"], + strip_prefix = "ra_ap_vfs-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_vfs-0.0.347.bazel"), ) maybe( http_archive, - name = "vendor_ts__ra_ap_vfs-notify-0.0.328", - sha256 = "07f7f31bb0c5744ba1fe1b1460eeb62274110dfb94e4b6719cf2e7df9410032d", + name = "vendor_ts__ra_ap_vfs-notify-0.0.347", + sha256 = "ede5e2c51dd3a138039d2f1c4dc33709cebb1c4e00692f8026de833844ad375f", type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_vfs-notify/0.0.328/download"], - strip_prefix = "ra_ap_vfs-notify-0.0.328", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_vfs-notify-0.0.328.bazel"), + urls = ["https://static.crates.io/crates/ra_ap_vfs-notify/0.0.347/download"], + strip_prefix = "ra_ap_vfs-notify-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_vfs-notify-0.0.347.bazel"), ) maybe( http_archive, - name = "vendor_ts__rand-0.10.1", - sha256 = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207", + name = "vendor_ts__rand-0.10.2", + sha256 = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80", type = "tar.gz", - urls = ["https://static.crates.io/crates/rand/0.10.1/download"], - strip_prefix = "rand-0.10.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rand-0.10.1.bazel"), + urls = ["https://static.crates.io/crates/rand/0.10.2/download"], + strip_prefix = "rand-0.10.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rand-0.10.2.bazel"), ) maybe( @@ -2917,62 +2903,62 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__ref-cast-1.0.25", - sha256 = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d", + name = "vendor_ts__ref-cast-1.0.26", + sha256 = "216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d", type = "tar.gz", - urls = ["https://static.crates.io/crates/ref-cast/1.0.25/download"], - strip_prefix = "ref-cast-1.0.25", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ref-cast-1.0.25.bazel"), + urls = ["https://static.crates.io/crates/ref-cast/1.0.26/download"], + strip_prefix = "ref-cast-1.0.26", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ref-cast-1.0.26.bazel"), ) maybe( http_archive, - name = "vendor_ts__ref-cast-impl-1.0.25", - sha256 = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da", + name = "vendor_ts__ref-cast-impl-1.0.26", + sha256 = "2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c", type = "tar.gz", - urls = ["https://static.crates.io/crates/ref-cast-impl/1.0.25/download"], - strip_prefix = "ref-cast-impl-1.0.25", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ref-cast-impl-1.0.25.bazel"), + urls = ["https://static.crates.io/crates/ref-cast-impl/1.0.26/download"], + strip_prefix = "ref-cast-impl-1.0.26", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ref-cast-impl-1.0.26.bazel"), ) maybe( http_archive, - name = "vendor_ts__regex-1.12.3", - sha256 = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276", + name = "vendor_ts__regex-1.13.1", + sha256 = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d", type = "tar.gz", - urls = ["https://static.crates.io/crates/regex/1.12.3/download"], - strip_prefix = "regex-1.12.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.regex-1.12.3.bazel"), + urls = ["https://static.crates.io/crates/regex/1.13.1/download"], + strip_prefix = "regex-1.13.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.regex-1.13.1.bazel"), ) maybe( http_archive, - name = "vendor_ts__regex-automata-0.4.14", - sha256 = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f", + name = "vendor_ts__regex-automata-0.4.18", + sha256 = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2", type = "tar.gz", - urls = ["https://static.crates.io/crates/regex-automata/0.4.14/download"], - strip_prefix = "regex-automata-0.4.14", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.regex-automata-0.4.14.bazel"), + urls = ["https://static.crates.io/crates/regex-automata/0.4.18/download"], + strip_prefix = "regex-automata-0.4.18", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.regex-automata-0.4.18.bazel"), ) maybe( http_archive, - name = "vendor_ts__regex-syntax-0.8.10", - sha256 = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a", + name = "vendor_ts__regex-syntax-0.8.11", + sha256 = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4", type = "tar.gz", - urls = ["https://static.crates.io/crates/regex-syntax/0.8.10/download"], - strip_prefix = "regex-syntax-0.8.10", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.regex-syntax-0.8.10.bazel"), + urls = ["https://static.crates.io/crates/regex-syntax/0.8.11/download"], + strip_prefix = "regex-syntax-0.8.11", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.regex-syntax-0.8.11.bazel"), ) maybe( http_archive, - name = "vendor_ts__rowan-0.15.18", - sha256 = "62f509095fc8cc0c8c8564016771d458079c11a8d857e65861f045145c0d3208", + name = "vendor_ts__rowan-0.17.0", + sha256 = "14b574c58582fa59fa43a2feb6608b8744184659f08a2e0117e4b8224d95ed61", type = "tar.gz", - urls = ["https://static.crates.io/crates/rowan/0.15.18/download"], - strip_prefix = "rowan-0.15.18", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rowan-0.15.18.bazel"), + urls = ["https://static.crates.io/crates/rowan/0.17.0/download"], + strip_prefix = "rowan-0.17.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rowan-0.17.0.bazel"), ) maybe( @@ -2987,32 +2973,22 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__rustc-hash-2.1.2", - sha256 = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe", + name = "vendor_ts__rustc-hash-2.1.3", + sha256 = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d", type = "tar.gz", - urls = ["https://static.crates.io/crates/rustc-hash/2.1.2/download"], - strip_prefix = "rustc-hash-2.1.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rustc-hash-2.1.2.bazel"), + urls = ["https://static.crates.io/crates/rustc-hash/2.1.3/download"], + strip_prefix = "rustc-hash-2.1.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rustc-hash-2.1.3.bazel"), ) maybe( http_archive, - name = "vendor_ts__rustc-literal-escaper-0.0.4", - sha256 = "ab03008eb631b703dd16978282ae36c73282e7922fe101a4bd072a40ecea7b8b", + name = "vendor_ts__rustc-literal-escaper-0.0.7", + sha256 = "8be87abb9e40db7466e0681dc8ecd9dcfd40360cb10b4c8fe24a7c4c3669b198", type = "tar.gz", - urls = ["https://static.crates.io/crates/rustc-literal-escaper/0.0.4/download"], - strip_prefix = "rustc-literal-escaper-0.0.4", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rustc-literal-escaper-0.0.4.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__rustc-literal-escaper-0.0.5", - sha256 = "e4ee29da77c5a54f42697493cd4c9b9f31b74df666a6c04dfc4fde77abe0438b", - type = "tar.gz", - urls = ["https://static.crates.io/crates/rustc-literal-escaper/0.0.5/download"], - strip_prefix = "rustc-literal-escaper-0.0.5", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rustc-literal-escaper-0.0.5.bazel"), + urls = ["https://static.crates.io/crates/rustc-literal-escaper/0.0.7/download"], + strip_prefix = "rustc-literal-escaper-0.0.7", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rustc-literal-escaper-0.0.7.bazel"), ) maybe( @@ -3037,22 +3013,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__rustc_version-0.4.1", - sha256 = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92", + name = "vendor_ts__rustversion-1.0.23", + sha256 = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f", type = "tar.gz", - urls = ["https://static.crates.io/crates/rustc_version/0.4.1/download"], - strip_prefix = "rustc_version-0.4.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rustc_version-0.4.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__rustversion-1.0.22", - sha256 = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d", - type = "tar.gz", - urls = ["https://static.crates.io/crates/rustversion/1.0.22/download"], - strip_prefix = "rustversion-1.0.22", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rustversion-1.0.22.bazel"), + urls = ["https://static.crates.io/crates/rustversion/1.0.23/download"], + strip_prefix = "rustversion-1.0.23", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rustversion-1.0.23.bazel"), ) maybe( @@ -3067,32 +3033,32 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__salsa-0.25.2", - sha256 = "e2e2aa2fca57727371eeafc975acc8e6f4c52f8166a78035543f6ee1c74c2dcc", + name = "vendor_ts__salsa-0.28.2", + sha256 = "cf0e374215cd2db2b5c75d7b3a99cb0cc052c0595335dfdefc03d4eb08f4aa81", type = "tar.gz", - urls = ["https://static.crates.io/crates/salsa/0.25.2/download"], - strip_prefix = "salsa-0.25.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.salsa-0.25.2.bazel"), + urls = ["https://static.crates.io/crates/salsa/0.28.2/download"], + strip_prefix = "salsa-0.28.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.salsa-0.28.2.bazel"), ) maybe( http_archive, - name = "vendor_ts__salsa-macro-rules-0.25.2", - sha256 = "1bfc2a1e7bf06964105515451d728f2422dedc3a112383324a00b191a5c397a3", + name = "vendor_ts__salsa-macro-rules-0.28.2", + sha256 = "85f4b7d4405540bbd6d4ffa52d4322d983f3781954d3073067ac1bdb028459b3", type = "tar.gz", - urls = ["https://static.crates.io/crates/salsa-macro-rules/0.25.2/download"], - strip_prefix = "salsa-macro-rules-0.25.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.salsa-macro-rules-0.25.2.bazel"), + urls = ["https://static.crates.io/crates/salsa-macro-rules/0.28.2/download"], + strip_prefix = "salsa-macro-rules-0.28.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.salsa-macro-rules-0.28.2.bazel"), ) maybe( http_archive, - name = "vendor_ts__salsa-macros-0.25.2", - sha256 = "3d844c1aa34946da46af683b5c27ec1088a3d9d84a2b837a108223fd830220e1", + name = "vendor_ts__salsa-macros-0.28.2", + sha256 = "445be2bfbb2f67cb663225ecd7bc5a25370c0250fca30f9d8cbad9a913650370", type = "tar.gz", - urls = ["https://static.crates.io/crates/salsa-macros/0.25.2/download"], - strip_prefix = "salsa-macros-0.25.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.salsa-macros-0.25.2.bazel"), + urls = ["https://static.crates.io/crates/salsa-macros/0.28.2/download"], + strip_prefix = "salsa-macros-0.28.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.salsa-macros-0.28.2.bazel"), ) maybe( @@ -3117,12 +3083,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__schemars-1.2.1", - sha256 = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc", + name = "vendor_ts__schemars-1.2.2", + sha256 = "687274d293b6cdc6e73e0fee520bf2049650090d7164f87672d212a3c530cf4a", type = "tar.gz", - urls = ["https://static.crates.io/crates/schemars/1.2.1/download"], - strip_prefix = "schemars-1.2.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.schemars-1.2.1.bazel"), + urls = ["https://static.crates.io/crates/schemars/1.2.2/download"], + strip_prefix = "schemars-1.2.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.schemars-1.2.2.bazel"), ) maybe( @@ -3147,42 +3113,42 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__serde-1.0.228", - sha256 = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e", + name = "vendor_ts__serde-1.0.229", + sha256 = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba", type = "tar.gz", - urls = ["https://static.crates.io/crates/serde/1.0.228/download"], - strip_prefix = "serde-1.0.228", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde-1.0.228.bazel"), + urls = ["https://static.crates.io/crates/serde/1.0.229/download"], + strip_prefix = "serde-1.0.229", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde-1.0.229.bazel"), ) maybe( http_archive, - name = "vendor_ts__serde_core-1.0.228", - sha256 = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad", + name = "vendor_ts__serde_core-1.0.229", + sha256 = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48", type = "tar.gz", - urls = ["https://static.crates.io/crates/serde_core/1.0.228/download"], - strip_prefix = "serde_core-1.0.228", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_core-1.0.228.bazel"), + urls = ["https://static.crates.io/crates/serde_core/1.0.229/download"], + strip_prefix = "serde_core-1.0.229", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_core-1.0.229.bazel"), ) maybe( http_archive, - name = "vendor_ts__serde_derive-1.0.228", - sha256 = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79", + name = "vendor_ts__serde_derive-1.0.229", + sha256 = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348", type = "tar.gz", - urls = ["https://static.crates.io/crates/serde_derive/1.0.228/download"], - strip_prefix = "serde_derive-1.0.228", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_derive-1.0.228.bazel"), + urls = ["https://static.crates.io/crates/serde_derive/1.0.229/download"], + strip_prefix = "serde_derive-1.0.229", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_derive-1.0.229.bazel"), ) maybe( http_archive, - name = "vendor_ts__serde_json-1.0.150", - sha256 = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9", + name = "vendor_ts__serde_json-1.0.151", + sha256 = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14", type = "tar.gz", - urls = ["https://static.crates.io/crates/serde_json/1.0.150/download"], - strip_prefix = "serde_json-1.0.150", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_json-1.0.150.bazel"), + urls = ["https://static.crates.io/crates/serde_json/1.0.151/download"], + strip_prefix = "serde_json-1.0.151", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_json-1.0.151.bazel"), ) maybe( @@ -3197,22 +3163,22 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__serde_with-3.20.0", - sha256 = "e72c1c2cb7b223fafb600a619537a871c2818583d619401b785e7c0b746ccde2", + name = "vendor_ts__serde_with-3.22.0", + sha256 = "ee78f1fbe43ac4a0e47aadb3dbd357b69eb0d3793e948624cd03dd2750ab1c0a", type = "tar.gz", - urls = ["https://static.crates.io/crates/serde_with/3.20.0/download"], - strip_prefix = "serde_with-3.20.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_with-3.20.0.bazel"), + urls = ["https://static.crates.io/crates/serde_with/3.22.0/download"], + strip_prefix = "serde_with-3.22.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_with-3.22.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__serde_with_macros-3.20.0", - sha256 = "b90c488738ecb4fb0262f41f43bc40efc5868d9fb744319ddf5f5317f417bfac", + name = "vendor_ts__serde_with_macros-3.22.0", + sha256 = "8705578779c2b6bd90d84d66eb2e206b708b1a4d7b9f17641b293545bf1c7e46", type = "tar.gz", - urls = ["https://static.crates.io/crates/serde_with_macros/3.20.0/download"], - strip_prefix = "serde_with_macros-3.20.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_with_macros-3.20.0.bazel"), + urls = ["https://static.crates.io/crates/serde_with_macros/3.22.0/download"], + strip_prefix = "serde_with_macros-3.22.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_with_macros-3.22.0.bazel"), ) maybe( @@ -3237,12 +3203,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__shlex-1.3.0", - sha256 = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64", + name = "vendor_ts__shlex-2.0.1", + sha256 = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba", type = "tar.gz", - urls = ["https://static.crates.io/crates/shlex/1.3.0/download"], - strip_prefix = "shlex-1.3.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.shlex-1.3.0.bazel"), + urls = ["https://static.crates.io/crates/shlex/2.0.1/download"], + strip_prefix = "shlex-2.0.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.shlex-2.0.1.bazel"), ) maybe( @@ -3267,12 +3233,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__smallvec-1.15.1", - sha256 = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03", + name = "vendor_ts__smallvec-1.15.2", + sha256 = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90", type = "tar.gz", - urls = ["https://static.crates.io/crates/smallvec/1.15.1/download"], - strip_prefix = "smallvec-1.15.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.smallvec-1.15.1.bazel"), + urls = ["https://static.crates.io/crates/smallvec/1.15.2/download"], + strip_prefix = "smallvec-1.15.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.smallvec-1.15.2.bazel"), ) maybe( @@ -3285,16 +3251,6 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.smol_str-0.3.6.bazel"), ) - maybe( - http_archive, - name = "vendor_ts__spin-0.9.8", - sha256 = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67", - type = "tar.gz", - urls = ["https://static.crates.io/crates/spin/0.9.8/download"], - strip_prefix = "spin-0.9.8", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.spin-0.9.8.bazel"), - ) - maybe( http_archive, name = "vendor_ts__stable_deref_trait-1.2.1", @@ -3327,12 +3283,22 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__syn-2.0.117", - sha256 = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99", + name = "vendor_ts__syn-2.0.119", + sha256 = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297", + type = "tar.gz", + urls = ["https://static.crates.io/crates/syn/2.0.119/download"], + strip_prefix = "syn-2.0.119", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.syn-2.0.119.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__syn-3.0.3", + sha256 = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3", type = "tar.gz", - urls = ["https://static.crates.io/crates/syn/2.0.117/download"], - strip_prefix = "syn-2.0.117", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.syn-2.0.117.bazel"), + urls = ["https://static.crates.io/crates/syn/3.0.3/download"], + strip_prefix = "syn-3.0.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.syn-3.0.3.bazel"), ) maybe( @@ -3347,12 +3313,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__temp-dir-0.1.16", - sha256 = "83176759e9416cf81ee66cb6508dbfe9c96f20b8b56265a39917551c23c70964", + name = "vendor_ts__temp-dir-0.2.0", + sha256 = "016ef9739649996fcc983b9c588fe3d557cf216d4d98503ce1b057ab5a66d689", type = "tar.gz", - urls = ["https://static.crates.io/crates/temp-dir/0.1.16/download"], - strip_prefix = "temp-dir-0.1.16", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.temp-dir-0.1.16.bazel"), + urls = ["https://static.crates.io/crates/temp-dir/0.2.0/download"], + strip_prefix = "temp-dir-0.2.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.temp-dir-0.2.0.bazel"), ) maybe( @@ -3367,82 +3333,82 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__thin-vec-0.2.18", - sha256 = "b0f7e269b48f0a7dd0146680fa24b50cc67fc0373f086a5b2f99bd084639b482", + name = "vendor_ts__thin-vec-0.2.19", + sha256 = "79def32ffcd477db1ff26f76dab9e3a91f0bd42a85ca96577089b24623056f9d", type = "tar.gz", - urls = ["https://static.crates.io/crates/thin-vec/0.2.18/download"], - strip_prefix = "thin-vec-0.2.18", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.thin-vec-0.2.18.bazel"), + urls = ["https://static.crates.io/crates/thin-vec/0.2.19/download"], + strip_prefix = "thin-vec-0.2.19", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.thin-vec-0.2.19.bazel"), ) maybe( http_archive, - name = "vendor_ts__thiserror-2.0.18", - sha256 = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4", + name = "vendor_ts__thiserror-2.0.20", + sha256 = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f", type = "tar.gz", - urls = ["https://static.crates.io/crates/thiserror/2.0.18/download"], - strip_prefix = "thiserror-2.0.18", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.thiserror-2.0.18.bazel"), + urls = ["https://static.crates.io/crates/thiserror/2.0.20/download"], + strip_prefix = "thiserror-2.0.20", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.thiserror-2.0.20.bazel"), ) maybe( http_archive, - name = "vendor_ts__thiserror-impl-2.0.18", - sha256 = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5", + name = "vendor_ts__thiserror-impl-2.0.20", + sha256 = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af", type = "tar.gz", - urls = ["https://static.crates.io/crates/thiserror-impl/2.0.18/download"], - strip_prefix = "thiserror-impl-2.0.18", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.thiserror-impl-2.0.18.bazel"), + urls = ["https://static.crates.io/crates/thiserror-impl/2.0.20/download"], + strip_prefix = "thiserror-impl-2.0.20", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.thiserror-impl-2.0.20.bazel"), ) maybe( http_archive, - name = "vendor_ts__thread_local-1.1.9", - sha256 = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185", + name = "vendor_ts__thread_local-1.1.10", + sha256 = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070", type = "tar.gz", - urls = ["https://static.crates.io/crates/thread_local/1.1.9/download"], - strip_prefix = "thread_local-1.1.9", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.thread_local-1.1.9.bazel"), + urls = ["https://static.crates.io/crates/thread_local/1.1.10/download"], + strip_prefix = "thread_local-1.1.10", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.thread_local-1.1.10.bazel"), ) maybe( http_archive, - name = "vendor_ts__time-0.3.47", - sha256 = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c", + name = "vendor_ts__time-0.3.55", + sha256 = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134", type = "tar.gz", - urls = ["https://static.crates.io/crates/time/0.3.47/download"], - strip_prefix = "time-0.3.47", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.time-0.3.47.bazel"), + urls = ["https://static.crates.io/crates/time/0.3.55/download"], + strip_prefix = "time-0.3.55", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.time-0.3.55.bazel"), ) maybe( http_archive, - name = "vendor_ts__time-core-0.1.8", - sha256 = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca", + name = "vendor_ts__time-core-0.1.9", + sha256 = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109", type = "tar.gz", - urls = ["https://static.crates.io/crates/time-core/0.1.8/download"], - strip_prefix = "time-core-0.1.8", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.time-core-0.1.8.bazel"), + urls = ["https://static.crates.io/crates/time-core/0.1.9/download"], + strip_prefix = "time-core-0.1.9", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.time-core-0.1.9.bazel"), ) maybe( http_archive, - name = "vendor_ts__time-macros-0.2.27", - sha256 = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215", + name = "vendor_ts__time-macros-0.2.32", + sha256 = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85", type = "tar.gz", - urls = ["https://static.crates.io/crates/time-macros/0.2.27/download"], - strip_prefix = "time-macros-0.2.27", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.time-macros-0.2.27.bazel"), + urls = ["https://static.crates.io/crates/time-macros/0.2.32/download"], + strip_prefix = "time-macros-0.2.32", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.time-macros-0.2.32.bazel"), ) maybe( http_archive, - name = "vendor_ts__tinyvec-1.11.0", - sha256 = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3", + name = "vendor_ts__tinyvec-1.12.0", + sha256 = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f", type = "tar.gz", - urls = ["https://static.crates.io/crates/tinyvec/1.11.0/download"], - strip_prefix = "tinyvec-1.11.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tinyvec-1.11.0.bazel"), + urls = ["https://static.crates.io/crates/tinyvec/1.12.0/download"], + strip_prefix = "tinyvec-1.12.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tinyvec-1.12.0.bazel"), ) maybe( @@ -3457,32 +3423,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__toml-0.9.12-spec-1.1.0", - sha256 = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863", + name = "vendor_ts__toml-1.1.4-spec-1.1.0", + sha256 = "3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5", type = "tar.gz", - urls = ["https://static.crates.io/crates/toml/0.9.12+spec-1.1.0/download"], - strip_prefix = "toml-0.9.12+spec-1.1.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml-0.9.12+spec-1.1.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__toml-1.1.2-spec-1.1.0", - sha256 = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee", - type = "tar.gz", - urls = ["https://static.crates.io/crates/toml/1.1.2+spec-1.1.0/download"], - strip_prefix = "toml-1.1.2+spec-1.1.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml-1.1.2+spec-1.1.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__toml_datetime-0.7.5-spec-1.1.0", - sha256 = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347", - type = "tar.gz", - urls = ["https://static.crates.io/crates/toml_datetime/0.7.5+spec-1.1.0/download"], - strip_prefix = "toml_datetime-0.7.5+spec-1.1.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml_datetime-0.7.5+spec-1.1.0.bazel"), + urls = ["https://static.crates.io/crates/toml/1.1.4+spec-1.1.0/download"], + strip_prefix = "toml-1.1.4+spec-1.1.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml-1.1.4+spec-1.1.0.bazel"), ) maybe( @@ -3497,22 +3443,22 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__toml_parser-1.1.2-spec-1.1.0", - sha256 = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526", + name = "vendor_ts__toml_parser-1.1.3-spec-1.1.0", + sha256 = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56", type = "tar.gz", - urls = ["https://static.crates.io/crates/toml_parser/1.1.2+spec-1.1.0/download"], - strip_prefix = "toml_parser-1.1.2+spec-1.1.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml_parser-1.1.2+spec-1.1.0.bazel"), + urls = ["https://static.crates.io/crates/toml_parser/1.1.3+spec-1.1.0/download"], + strip_prefix = "toml_parser-1.1.3+spec-1.1.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml_parser-1.1.3+spec-1.1.0.bazel"), ) maybe( http_archive, - name = "vendor_ts__toml_writer-1.1.1-spec-1.1.0", - sha256 = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db", + name = "vendor_ts__toml_writer-1.1.2-spec-1.1.0", + sha256 = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2", type = "tar.gz", - urls = ["https://static.crates.io/crates/toml_writer/1.1.1+spec-1.1.0/download"], - strip_prefix = "toml_writer-1.1.1+spec-1.1.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml_writer-1.1.1+spec-1.1.0.bazel"), + urls = ["https://static.crates.io/crates/toml_writer/1.1.2+spec-1.1.0/download"], + strip_prefix = "toml_writer-1.1.2+spec-1.1.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml_writer-1.1.2+spec-1.1.0.bazel"), ) maybe( @@ -3627,12 +3573,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__tree-sitter-python-0.23.6", - sha256 = "3d065aaa27f3aaceaf60c1f0e0ac09e1cb9eb8ed28e7bcdaa52129cffc7f4b04", + name = "vendor_ts__tree-sitter-python-0.25.0", + sha256 = "6bf85fd39652e740bf60f46f4cda9492c3a9ad75880575bf14960f775cb74a1c", type = "tar.gz", - urls = ["https://static.crates.io/crates/tree-sitter-python/0.23.6/download"], - strip_prefix = "tree-sitter-python-0.23.6", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tree-sitter-python-0.23.6.bazel"), + urls = ["https://static.crates.io/crates/tree-sitter-python/0.25.0/download"], + strip_prefix = "tree-sitter-python-0.25.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tree-sitter-python-0.25.0.bazel"), ) maybe( @@ -3657,12 +3603,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__triomphe-0.1.15", - sha256 = "dd69c5aa8f924c7519d6372789a74eac5b94fb0f8fcf0d4a97eb0bfc3e785f39", + name = "vendor_ts__triomphe-0.1.16", + sha256 = "b40688ea6389c8171614b25491f71d4a27946e0c7ce2da1c6de27e25abf1a0ae", type = "tar.gz", - urls = ["https://static.crates.io/crates/triomphe/0.1.15/download"], - strip_prefix = "triomphe-0.1.15", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.triomphe-0.1.15.bazel"), + urls = ["https://static.crates.io/crates/triomphe/0.1.16/download"], + strip_prefix = "triomphe-0.1.16", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.triomphe-0.1.16.bazel"), ) maybe( @@ -3675,6 +3621,16 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.typed-arena-2.0.2.bazel"), ) + maybe( + http_archive, + name = "vendor_ts__typeid-1.0.3", + sha256 = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c", + type = "tar.gz", + urls = ["https://static.crates.io/crates/typeid/1.0.3/download"], + strip_prefix = "typeid-1.0.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.typeid-1.0.3.bazel"), + ) + maybe( http_archive, name = "vendor_ts__uncased-0.9.10", @@ -3715,16 +3671,6 @@ def crate_repositories(): build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.unicode-properties-0.1.4.bazel"), ) - maybe( - http_archive, - name = "vendor_ts__unicode-xid-0.2.6", - sha256 = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853", - type = "tar.gz", - urls = ["https://static.crates.io/crates/unicode-xid/0.2.6/download"], - strip_prefix = "unicode-xid-0.2.6", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.unicode-xid-0.2.6.bazel"), - ) - maybe( http_archive, name = "vendor_ts__unsafe-libyaml-0.2.11", @@ -3787,92 +3733,42 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__wasip2-1.0.3-wasi-0.2.9", - sha256 = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6", + name = "vendor_ts__wasm-bindgen-0.2.126", + sha256 = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4", type = "tar.gz", - urls = ["https://static.crates.io/crates/wasip2/1.0.3+wasi-0.2.9/download"], - strip_prefix = "wasip2-1.0.3+wasi-0.2.9", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wasip2-1.0.3+wasi-0.2.9.bazel"), + urls = ["https://static.crates.io/crates/wasm-bindgen/0.2.126/download"], + strip_prefix = "wasm-bindgen-0.2.126", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wasm-bindgen-0.2.126.bazel"), ) maybe( http_archive, - name = "vendor_ts__wasip3-0.4.0-wasi-0.3.0-rc-2026-01-06", - sha256 = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5", + name = "vendor_ts__wasm-bindgen-macro-0.2.126", + sha256 = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1", type = "tar.gz", - urls = ["https://static.crates.io/crates/wasip3/0.4.0+wasi-0.3.0-rc-2026-01-06/download"], - strip_prefix = "wasip3-0.4.0+wasi-0.3.0-rc-2026-01-06", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wasip3-0.4.0+wasi-0.3.0-rc-2026-01-06.bazel"), + urls = ["https://static.crates.io/crates/wasm-bindgen-macro/0.2.126/download"], + strip_prefix = "wasm-bindgen-macro-0.2.126", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wasm-bindgen-macro-0.2.126.bazel"), ) maybe( http_archive, - name = "vendor_ts__wasm-bindgen-0.2.121", - sha256 = "49ace1d07c165b0864824eee619580c4689389afa9dc9ed3a4c75040d82e6790", + name = "vendor_ts__wasm-bindgen-macro-support-0.2.126", + sha256 = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e", type = "tar.gz", - urls = ["https://static.crates.io/crates/wasm-bindgen/0.2.121/download"], - strip_prefix = "wasm-bindgen-0.2.121", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wasm-bindgen-0.2.121.bazel"), + urls = ["https://static.crates.io/crates/wasm-bindgen-macro-support/0.2.126/download"], + strip_prefix = "wasm-bindgen-macro-support-0.2.126", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wasm-bindgen-macro-support-0.2.126.bazel"), ) maybe( http_archive, - name = "vendor_ts__wasm-bindgen-macro-0.2.121", - sha256 = "8e68e6f4afd367a562002c05637acb8578ff2dea1943df76afb9e83d177c8578", + name = "vendor_ts__wasm-bindgen-shared-0.2.126", + sha256 = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24", type = "tar.gz", - urls = ["https://static.crates.io/crates/wasm-bindgen-macro/0.2.121/download"], - strip_prefix = "wasm-bindgen-macro-0.2.121", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wasm-bindgen-macro-0.2.121.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__wasm-bindgen-macro-support-0.2.121", - sha256 = "d95a9ec35c64b2a7cb35d3fead40c4238d0940c86d107136999567a4703259f2", - type = "tar.gz", - urls = ["https://static.crates.io/crates/wasm-bindgen-macro-support/0.2.121/download"], - strip_prefix = "wasm-bindgen-macro-support-0.2.121", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wasm-bindgen-macro-support-0.2.121.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__wasm-bindgen-shared-0.2.121", - sha256 = "c4e0100b01e9f0d03189a92b96772a1fb998639d981193d7dbab487302513441", - type = "tar.gz", - urls = ["https://static.crates.io/crates/wasm-bindgen-shared/0.2.121/download"], - strip_prefix = "wasm-bindgen-shared-0.2.121", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wasm-bindgen-shared-0.2.121.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__wasm-encoder-0.244.0", - sha256 = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319", - type = "tar.gz", - urls = ["https://static.crates.io/crates/wasm-encoder/0.244.0/download"], - strip_prefix = "wasm-encoder-0.244.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wasm-encoder-0.244.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__wasm-metadata-0.244.0", - sha256 = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909", - type = "tar.gz", - urls = ["https://static.crates.io/crates/wasm-metadata/0.244.0/download"], - strip_prefix = "wasm-metadata-0.244.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wasm-metadata-0.244.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__wasmparser-0.244.0", - sha256 = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe", - type = "tar.gz", - urls = ["https://static.crates.io/crates/wasmparser/0.244.0/download"], - strip_prefix = "wasmparser-0.244.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wasmparser-0.244.0.bazel"), + urls = ["https://static.crates.io/crates/wasm-bindgen-shared/0.2.126/download"], + strip_prefix = "wasm-bindgen-shared-0.2.126", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wasm-bindgen-shared-0.2.126.bazel"), ) maybe( @@ -4067,82 +3963,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__winnow-1.0.3", - sha256 = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1", - type = "tar.gz", - urls = ["https://static.crates.io/crates/winnow/1.0.3/download"], - strip_prefix = "winnow-1.0.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.winnow-1.0.3.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__wit-bindgen-0.51.0", - sha256 = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5", - type = "tar.gz", - urls = ["https://static.crates.io/crates/wit-bindgen/0.51.0/download"], - strip_prefix = "wit-bindgen-0.51.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wit-bindgen-0.51.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__wit-bindgen-0.57.1", - sha256 = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e", - type = "tar.gz", - urls = ["https://static.crates.io/crates/wit-bindgen/0.57.1/download"], - strip_prefix = "wit-bindgen-0.57.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wit-bindgen-0.57.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__wit-bindgen-core-0.51.0", - sha256 = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc", - type = "tar.gz", - urls = ["https://static.crates.io/crates/wit-bindgen-core/0.51.0/download"], - strip_prefix = "wit-bindgen-core-0.51.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wit-bindgen-core-0.51.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__wit-bindgen-rust-0.51.0", - sha256 = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21", - type = "tar.gz", - urls = ["https://static.crates.io/crates/wit-bindgen-rust/0.51.0/download"], - strip_prefix = "wit-bindgen-rust-0.51.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wit-bindgen-rust-0.51.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__wit-bindgen-rust-macro-0.51.0", - sha256 = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a", - type = "tar.gz", - urls = ["https://static.crates.io/crates/wit-bindgen-rust-macro/0.51.0/download"], - strip_prefix = "wit-bindgen-rust-macro-0.51.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wit-bindgen-rust-macro-0.51.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__wit-component-0.244.0", - sha256 = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2", - type = "tar.gz", - urls = ["https://static.crates.io/crates/wit-component/0.244.0/download"], - strip_prefix = "wit-component-0.244.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wit-component-0.244.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__wit-parser-0.244.0", - sha256 = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736", + name = "vendor_ts__winnow-1.0.4", + sha256 = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81", type = "tar.gz", - urls = ["https://static.crates.io/crates/wit-parser/0.244.0/download"], - strip_prefix = "wit-parser-0.244.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wit-parser-0.244.0.bazel"), + urls = ["https://static.crates.io/crates/winnow/1.0.4/download"], + strip_prefix = "winnow-1.0.4", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.winnow-1.0.4.bazel"), ) maybe( @@ -4157,12 +3983,12 @@ def crate_repositories(): maybe( http_archive, - name = "vendor_ts__zmij-1.0.21", - sha256 = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa", + name = "vendor_ts__zmij-1.0.23", + sha256 = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b", type = "tar.gz", - urls = ["https://static.crates.io/crates/zmij/1.0.21/download"], - strip_prefix = "zmij-1.0.21", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.zmij-1.0.21.bazel"), + urls = ["https://static.crates.io/crates/zmij/1.0.23/download"], + strip_prefix = "zmij-1.0.23", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.zmij-1.0.23.bazel"), ) maybe( @@ -4196,61 +4022,61 @@ def crate_repositories(): ) return [ - struct(repo = "vendor_ts__anyhow-1.0.102", is_dev_dep = False), + struct(repo = "vendor_ts__anyhow-1.0.104", is_dev_dep = False), struct(repo = "vendor_ts__argfile-1.0.0", is_dev_dep = False), struct(repo = "vendor_ts__chalk-ir-0.104.0", is_dev_dep = False), - struct(repo = "vendor_ts__chrono-0.4.44", is_dev_dep = False), - struct(repo = "vendor_ts__clap-4.6.1", is_dev_dep = False), + struct(repo = "vendor_ts__chrono-0.4.45", is_dev_dep = False), + struct(repo = "vendor_ts__clap-4.6.6", is_dev_dep = False), struct(repo = "vendor_ts__dunce-1.0.5", is_dev_dep = False), - struct(repo = "vendor_ts__either-1.16.0", is_dev_dep = False), + struct(repo = "vendor_ts__either-1.17.0", is_dev_dep = False), struct(repo = "vendor_ts__encoding-0.2.33", is_dev_dep = False), struct(repo = "vendor_ts__figment-0.10.19", is_dev_dep = False), struct(repo = "vendor_ts__flate2-1.1.9", is_dev_dep = False), - struct(repo = "vendor_ts__glob-0.3.3", is_dev_dep = False), + struct(repo = "vendor_ts__glob-0.3.4", is_dev_dep = False), struct(repo = "vendor_ts__globset-0.4.18", is_dev_dep = False), - struct(repo = "vendor_ts__itertools-0.14.0", is_dev_dep = False), + struct(repo = "vendor_ts__itertools-0.15.0", is_dev_dep = False), struct(repo = "vendor_ts__lazy_static-1.5.0", is_dev_dep = False), struct(repo = "vendor_ts__mustache-0.9.0", is_dev_dep = False), struct(repo = "vendor_ts__num-traits-0.2.19", is_dev_dep = False), struct(repo = "vendor_ts__num_cpus-1.17.0", is_dev_dep = False), - struct(repo = "vendor_ts__proc-macro2-1.0.106", is_dev_dep = False), - struct(repo = "vendor_ts__quote-1.0.45", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_base_db-0.0.328", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_cfg-0.0.328", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_hir-0.0.328", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_hir_def-0.0.328", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_hir_expand-0.0.328", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_hir_ty-0.0.328", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_ide_db-0.0.328", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_intern-0.0.328", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_load-cargo-0.0.328", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_parser-0.0.328", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_paths-0.0.328", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_project_model-0.0.328", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_span-0.0.328", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_stdx-0.0.328", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_syntax-0.0.328", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_syntax-bridge-0.0.328", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_vfs-0.0.328", is_dev_dep = False), + struct(repo = "vendor_ts__proc-macro2-1.0.107", is_dev_dep = False), + struct(repo = "vendor_ts__quote-1.0.47", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_base_db-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_cfg-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_hir-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_hir_def-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_hir_expand-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_hir_ty-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_ide_db-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_intern-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_load-cargo-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_parser-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_paths-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_project_model-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_span-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_stdx-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_syntax-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_syntax-bridge-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_vfs-0.0.347", is_dev_dep = False), struct(repo = "vendor_ts__rayon-1.12.0", is_dev_dep = False), - struct(repo = "vendor_ts__regex-1.12.3", is_dev_dep = False), - struct(repo = "vendor_ts__serde-1.0.228", is_dev_dep = False), - struct(repo = "vendor_ts__serde_json-1.0.150", is_dev_dep = False), - struct(repo = "vendor_ts__serde_with-3.20.0", is_dev_dep = False), + struct(repo = "vendor_ts__regex-1.13.1", is_dev_dep = False), + struct(repo = "vendor_ts__serde-1.0.229", is_dev_dep = False), + struct(repo = "vendor_ts__serde_json-1.0.151", is_dev_dep = False), + struct(repo = "vendor_ts__serde_with-3.22.0", is_dev_dep = False), struct(repo = "vendor_ts__serde_yaml-0.9.34-deprecated", is_dev_dep = False), - struct(repo = "vendor_ts__syn-2.0.117", is_dev_dep = False), - struct(repo = "vendor_ts__toml-1.1.2-spec-1.1.0", is_dev_dep = False), + struct(repo = "vendor_ts__syn-3.0.3", is_dev_dep = False), + struct(repo = "vendor_ts__toml-1.1.4-spec-1.1.0", is_dev_dep = False), struct(repo = "vendor_ts__tracing-0.1.44", is_dev_dep = False), struct(repo = "vendor_ts__tracing-flame-0.2.0", is_dev_dep = False), struct(repo = "vendor_ts__tracing-subscriber-0.3.23", is_dev_dep = False), struct(repo = "vendor_ts__tree-sitter-0.26.9", is_dev_dep = False), struct(repo = "vendor_ts__tree-sitter-embedded-template-0.25.0", is_dev_dep = False), - struct(repo = "vendor_ts__tree-sitter-python-0.23.6", is_dev_dep = False), + struct(repo = "vendor_ts__tree-sitter-python-0.25.0", is_dev_dep = False), struct(repo = "vendor_ts__tree-sitter-ruby-0.23.1", is_dev_dep = False), - struct(repo = "vendor_ts__triomphe-0.1.15", is_dev_dep = False), + struct(repo = "vendor_ts__triomphe-0.1.16", is_dev_dep = False), struct(repo = "vendor_ts__ungrammar-1.16.1", is_dev_dep = False), struct(repo = "vendor_ts__zstd-0.13.3", is_dev_dep = False), - struct(repo = "vendor_ts__rand-0.10.1", is_dev_dep = True), + struct(repo = "vendor_ts__rand-0.10.2", is_dev_dep = True), struct(repo = "vendor_ts__tree-sitter-json-0.24.8", is_dev_dep = True), struct(repo = "vendor_ts__tree-sitter-ql-0.23.1", is_dev_dep = True), ] From 1ffe300a4ac5aadc5d24801fc5af542d916feced Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 14 Aug 2026 09:26:10 +0200 Subject: [PATCH 0296/2098] Rust: run codegen --- rust/extractor/src/generated/.generated.list | 2 +- rust/extractor/src/generated/top.rs | 470 ++++++++++++++++-- rust/extractor/src/translate/generated.rs | 153 +++++- rust/ql/.generated.list | 100 ++-- rust/ql/.gitattributes | 40 +- .../internal/generated/CfgNodes.qll | 107 +++- rust/ql/lib/codeql/rust/elements.qll | 8 +- .../codeql/rust/elements/AsmClobberAbi.qll | 1 + .../codeql/rust/elements/AsmOperandNamed.qll | 1 + .../codeql/rust/elements/AsmOptionsList.qll | 1 + rust/ql/lib/codeql/rust/elements/DerefPat.qll | 9 + .../codeql/rust/elements/FormatArgsArg.qll | 2 +- .../rust/elements/FormatArgsArgName.qll | 9 - .../codeql/rust/elements/ImplRestriction.qll | 10 + .../codeql/rust/elements/IncludeBytesExpr.qll | 9 + .../codeql/rust/elements/MutRestriction.qll | 10 + rust/ql/lib/codeql/rust/elements/NotNull.qll | 9 + .../codeql/rust/elements/PatternTypeRepr.qll | 10 + .../lib/codeql/rust/elements/StructField.qll | 1 + rust/ql/lib/codeql/rust/elements/Trait.qll | 1 + .../lib/codeql/rust/elements/TupleField.qll | 1 + .../lib/codeql/rust/elements/Visibility.qll | 2 +- .../codeql/rust/elements/VisibilityInner.qll | 10 + ...onstructor.qll => DerefPatConstructor.qll} | 6 +- ...atArgsArgNameImpl.qll => DerefPatImpl.qll} | 8 +- .../internal/ImplRestrictionConstructor.qll | 14 + .../elements/internal/ImplRestrictionImpl.qll | 16 + .../internal/IncludeBytesExprConstructor.qll | 14 + .../internal/IncludeBytesExprImpl.qll | 16 + .../internal/MutRestrictionConstructor.qll | 14 + .../elements/internal/MutRestrictionImpl.qll | 16 + .../elements/internal/NotNullConstructor.qll | 14 + .../rust/elements/internal/NotNullImpl.qll | 16 + .../internal/PatternTypeReprConstructor.qll | 14 + .../elements/internal/PatternTypeReprImpl.qll | 16 + .../internal/VisibilityInnerConstructor.qll | 14 + .../elements/internal/VisibilityInnerImpl.qll | 16 + .../internal/generated/AsmClobberAbi.qll | 21 + .../internal/generated/AsmOperandNamed.qll | 21 + .../internal/generated/AsmOptionsList.qll | 21 + .../elements/internal/generated/DerefPat.qll | 36 ++ .../internal/generated/FormatArgsArg.qll | 26 +- .../internal/generated/FormatArgsArgName.qll | 23 - .../internal/generated/ImplRestriction.qll | 39 ++ .../internal/generated/IncludeBytesExpr.qll | 23 + .../internal/generated/MutRestriction.qll | 44 ++ .../elements/internal/generated/NotNull.qll | 23 + .../internal/generated/ParentChild.qll | 176 ++++++- .../internal/generated/PatternTypeRepr.qll | 55 ++ .../rust/elements/internal/generated/Raw.qll | 299 +++++++++-- .../internal/generated/StructField.qll | 16 + .../elements/internal/generated/Synth.qll | 197 ++++++-- .../internal/generated/SynthConstructors.qll | 8 +- .../elements/internal/generated/Trait.qll | 16 + .../internal/generated/TupleField.qll | 16 + .../internal/generated/Visibility.qll | 14 +- .../internal/generated/VisibilityInner.qll | 39 ++ rust/ql/lib/rust.dbscheme | 128 ++++- .../generated/AsmClobberAbi/AsmClobberAbi.ql | 4 + .../AsmOperandNamed/AsmOperandNamed.ql | 4 + .../AsmOptionsList/AsmOptionsList.ql | 4 + .../MISSING_SOURCE.txt | 0 .../generated/FormatArgsExpr/FormatArgsArg.ql | 8 +- .../ImplRestriction/MISSING_SOURCE.txt | 4 + .../IncludeBytesExpr/MISSING_SOURCE.txt | 4 + .../MutRestriction/MISSING_SOURCE.txt | 4 + .../generated/NotNull/MISSING_SOURCE.txt | 4 + .../PatternTypeRepr/MISSING_SOURCE.txt | 4 + .../generated/StructField/StructField.ql | 4 + .../extractor-tests/generated/Trait/Trait.ql | 4 + .../generated/TupleField/TupleField.ql | 4 + .../generated/Visibility/Visibility.ql | 4 +- .../VisibilityInner/MISSING_SOURCE.txt | 4 + rust/schema/ast.py | 35 +- 74 files changed, 2192 insertions(+), 304 deletions(-) create mode 100644 rust/ql/lib/codeql/rust/elements/DerefPat.qll delete mode 100644 rust/ql/lib/codeql/rust/elements/FormatArgsArgName.qll create mode 100644 rust/ql/lib/codeql/rust/elements/ImplRestriction.qll create mode 100644 rust/ql/lib/codeql/rust/elements/IncludeBytesExpr.qll create mode 100644 rust/ql/lib/codeql/rust/elements/MutRestriction.qll create mode 100644 rust/ql/lib/codeql/rust/elements/NotNull.qll create mode 100644 rust/ql/lib/codeql/rust/elements/PatternTypeRepr.qll create mode 100644 rust/ql/lib/codeql/rust/elements/VisibilityInner.qll rename rust/ql/lib/codeql/rust/elements/internal/{FormatArgsArgNameConstructor.qll => DerefPatConstructor.qll} (59%) rename rust/ql/lib/codeql/rust/elements/internal/{FormatArgsArgNameImpl.qll => DerefPatImpl.qll} (58%) create mode 100644 rust/ql/lib/codeql/rust/elements/internal/ImplRestrictionConstructor.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/ImplRestrictionImpl.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/IncludeBytesExprConstructor.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/IncludeBytesExprImpl.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/MutRestrictionConstructor.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/MutRestrictionImpl.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/NotNullConstructor.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/NotNullImpl.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/PatternTypeReprConstructor.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/PatternTypeReprImpl.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/VisibilityInnerConstructor.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/VisibilityInnerImpl.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/generated/DerefPat.qll delete mode 100644 rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsArgName.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/generated/ImplRestriction.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/generated/IncludeBytesExpr.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/generated/MutRestriction.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/generated/NotNull.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/generated/PatternTypeRepr.qll create mode 100644 rust/ql/lib/codeql/rust/elements/internal/generated/VisibilityInner.qll rename rust/ql/test/extractor-tests/generated/{FormatArgsArgName => DerefPat}/MISSING_SOURCE.txt (100%) create mode 100644 rust/ql/test/extractor-tests/generated/ImplRestriction/MISSING_SOURCE.txt create mode 100644 rust/ql/test/extractor-tests/generated/IncludeBytesExpr/MISSING_SOURCE.txt create mode 100644 rust/ql/test/extractor-tests/generated/MutRestriction/MISSING_SOURCE.txt create mode 100644 rust/ql/test/extractor-tests/generated/NotNull/MISSING_SOURCE.txt create mode 100644 rust/ql/test/extractor-tests/generated/PatternTypeRepr/MISSING_SOURCE.txt create mode 100644 rust/ql/test/extractor-tests/generated/VisibilityInner/MISSING_SOURCE.txt diff --git a/rust/extractor/src/generated/.generated.list b/rust/extractor/src/generated/.generated.list index a8177c3a85c3..35085d026e7b 100644 --- a/rust/extractor/src/generated/.generated.list +++ b/rust/extractor/src/generated/.generated.list @@ -1,2 +1,2 @@ mod.rs 4bcb9def847469aae9d8649461546b7c21ec97cf6e63d3cf394e339915ce65d7 4bcb9def847469aae9d8649461546b7c21ec97cf6e63d3cf394e339915ce65d7 -top.rs 3206fd6f08478e550a1ede00bca59a3ed5e93353a8d5f13c56de4ef4e4103876 3206fd6f08478e550a1ede00bca59a3ed5e93353a8d5f13c56de4ef4e4103876 +top.rs 161209a7b5416721864ad12d8e7f3230b8f458aedd18ae8a8bf4cef901c064fd 161209a7b5416721864ad12d8e7f3230b8f458aedd18ae8a8bf4cef901c064fd diff --git a/rust/extractor/src/generated/top.rs b/rust/extractor/src/generated/top.rs index d639d751f166..f7917661050f 100644 --- a/rust/extractor/src/generated/top.rs +++ b/rust/extractor/src/generated/top.rs @@ -1039,8 +1039,8 @@ impl From> for trap::Label { #[derive(Debug)] pub struct FormatArgsArg { pub id: trap::TrapId, - pub arg_name: Option>, pub expr: Option>, + pub name: Option>, } impl trap::TrapEntry for FormatArgsArg { @@ -1050,12 +1050,12 @@ impl trap::TrapEntry for FormatArgsArg { fn emit(self, id: trap::Label, out: &mut trap::Writer) { out.add_tuple("format_args_args", vec![id.into()]); - if let Some(v) = self.arg_name { - out.add_tuple("format_args_arg_arg_names", vec![id.into(), v.into()]); - } if let Some(v) = self.expr { out.add_tuple("format_args_arg_exprs", vec![id.into(), v.into()]); } + if let Some(v) = self.name { + out.add_tuple("format_args_arg_names", vec![id.into(), v.into()]); + } } } @@ -1090,52 +1090,6 @@ impl From> for trap::Label { } } -#[derive(Debug)] -pub struct FormatArgsArgName { - pub id: trap::TrapId, -} - -impl trap::TrapEntry for FormatArgsArgName { - fn extract_id(&mut self) -> trap::TrapId { - std::mem::replace(&mut self.id, trap::TrapId::Star) - } - - fn emit(self, id: trap::Label, out: &mut trap::Writer) { - out.add_tuple("format_args_arg_names", vec![id.into()]); - } -} - -impl trap::TrapClass for FormatArgsArgName { - fn class_name() -> &'static str { "FormatArgsArgName" } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme FormatArgsArgName is a subclass of AstNode - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme FormatArgsArgName is a subclass of Locatable - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme FormatArgsArgName is a subclass of Element - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - #[derive(Debug)] pub struct GenericArg { _unused: () @@ -1308,6 +1262,56 @@ impl From> for trap::Label { } } +#[derive(Debug)] +pub struct ImplRestriction { + pub id: trap::TrapId, + pub visibility_inner: Option>, +} + +impl trap::TrapEntry for ImplRestriction { + fn extract_id(&mut self) -> trap::TrapId { + std::mem::replace(&mut self.id, trap::TrapId::Star) + } + + fn emit(self, id: trap::Label, out: &mut trap::Writer) { + out.add_tuple("impl_restrictions", vec![id.into()]); + if let Some(v) = self.visibility_inner { + out.add_tuple("impl_restriction_visibility_inners", vec![id.into(), v.into()]); + } + } +} + +impl trap::TrapClass for ImplRestriction { + fn class_name() -> &'static str { "ImplRestriction" } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme ImplRestriction is a subclass of AstNode + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme ImplRestriction is a subclass of Locatable + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme ImplRestriction is a subclass of Element + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + #[derive(Debug)] pub struct ItemList { pub id: trap::TrapId, @@ -1714,6 +1718,60 @@ impl From> for trap::Label { } } +#[derive(Debug)] +pub struct MutRestriction { + pub id: trap::TrapId, + pub is_mut: bool, + pub visibility_inner: Option>, +} + +impl trap::TrapEntry for MutRestriction { + fn extract_id(&mut self) -> trap::TrapId { + std::mem::replace(&mut self.id, trap::TrapId::Star) + } + + fn emit(self, id: trap::Label, out: &mut trap::Writer) { + out.add_tuple("mut_restrictions", vec![id.into()]); + if self.is_mut { + out.add_tuple("mut_restriction_is_mut", vec![id.into()]); + } + if let Some(v) = self.visibility_inner { + out.add_tuple("mut_restriction_visibility_inners", vec![id.into(), v.into()]); + } + } +} + +impl trap::TrapClass for MutRestriction { + fn class_name() -> &'static str { "MutRestriction" } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme MutRestriction is a subclass of AstNode + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme MutRestriction is a subclass of Locatable + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme MutRestriction is a subclass of Element + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + #[derive(Debug)] pub struct Name { pub id: trap::TrapId, @@ -2523,6 +2581,7 @@ pub struct StructField { pub attrs: Vec>, pub default_val: Option>, pub is_unsafe: bool, + pub mut_restriction: Option>, pub name: Option>, pub type_repr: Option>, pub visibility: Option>, @@ -2544,6 +2603,9 @@ impl trap::TrapEntry for StructField { if self.is_unsafe { out.add_tuple("struct_field_is_unsafe", vec![id.into()]); } + if let Some(v) = self.mut_restriction { + out.add_tuple("struct_field_mut_restrictions", vec![id.into(), v.into()]); + } if let Some(v) = self.name { out.add_tuple("struct_field_names", vec![id.into(), v.into()]); } @@ -2839,6 +2901,7 @@ impl From> for trap::Label { pub struct TupleField { pub id: trap::TrapId, pub attrs: Vec>, + pub mut_restriction: Option>, pub type_repr: Option>, pub visibility: Option>, } @@ -2853,6 +2916,9 @@ impl trap::TrapEntry for TupleField { for (i, v) in self.attrs.into_iter().enumerate() { out.add_tuple("tuple_field_attrs", vec![id.into(), i.into(), v.into()]); } + if let Some(v) = self.mut_restriction { + out.add_tuple("tuple_field_mut_restrictions", vec![id.into(), v.into()]); + } if let Some(v) = self.type_repr { out.add_tuple("tuple_field_type_reprs", vec![id.into(), v.into()]); } @@ -3300,7 +3366,7 @@ impl From> for trap::Label { #[derive(Debug)] pub struct Visibility { pub id: trap::TrapId, - pub path: Option>, + pub visibility_inner: Option>, } impl trap::TrapEntry for Visibility { @@ -3310,8 +3376,8 @@ impl trap::TrapEntry for Visibility { fn emit(self, id: trap::Label, out: &mut trap::Writer) { out.add_tuple("visibilities", vec![id.into()]); - if let Some(v) = self.path { - out.add_tuple("visibility_paths", vec![id.into(), v.into()]); + if let Some(v) = self.visibility_inner { + out.add_tuple("visibility_visibility_inners", vec![id.into(), v.into()]); } } } @@ -3347,6 +3413,56 @@ impl From> for trap::Label { } } +#[derive(Debug)] +pub struct VisibilityInner { + pub id: trap::TrapId, + pub path: Option>, +} + +impl trap::TrapEntry for VisibilityInner { + fn extract_id(&mut self) -> trap::TrapId { + std::mem::replace(&mut self.id, trap::TrapId::Star) + } + + fn emit(self, id: trap::Label, out: &mut trap::Writer) { + out.add_tuple("visibility_inners", vec![id.into()]); + if let Some(v) = self.path { + out.add_tuple("visibility_inner_paths", vec![id.into(), v.into()]); + } + } +} + +impl trap::TrapClass for VisibilityInner { + fn class_name() -> &'static str { "VisibilityInner" } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme VisibilityInner is a subclass of AstNode + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme VisibilityInner is a subclass of Locatable + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme VisibilityInner is a subclass of Element + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + #[derive(Debug)] pub struct WhereClause { pub id: trap::TrapId, @@ -3592,6 +3708,7 @@ impl From> for trap::Label { #[derive(Debug)] pub struct AsmClobberAbi { pub id: trap::TrapId, + pub attrs: Vec>, } impl trap::TrapEntry for AsmClobberAbi { @@ -3601,6 +3718,9 @@ impl trap::TrapEntry for AsmClobberAbi { fn emit(self, id: trap::Label, out: &mut trap::Writer) { out.add_tuple("asm_clobber_abis", vec![id.into()]); + for (i, v) in self.attrs.into_iter().enumerate() { + out.add_tuple("asm_clobber_abi_attrs", vec![id.into(), i.into(), v.into()]); + } } } @@ -3770,6 +3890,7 @@ impl From> for trap::Label { pub struct AsmOperandNamed { pub id: trap::TrapId, pub asm_operand: Option>, + pub attrs: Vec>, pub name: Option>, } @@ -3783,6 +3904,9 @@ impl trap::TrapEntry for AsmOperandNamed { if let Some(v) = self.asm_operand { out.add_tuple("asm_operand_named_asm_operands", vec![id.into(), v.into()]); } + for (i, v) in self.attrs.into_iter().enumerate() { + out.add_tuple("asm_operand_named_attrs", vec![id.into(), i.into(), v.into()]); + } if let Some(v) = self.name { out.add_tuple("asm_operand_named_names", vec![id.into(), v.into()]); } @@ -3833,6 +3957,7 @@ impl From> for trap::Label { pub struct AsmOptionsList { pub id: trap::TrapId, pub asm_options: Vec>, + pub attrs: Vec>, } impl trap::TrapEntry for AsmOptionsList { @@ -3845,6 +3970,9 @@ impl trap::TrapEntry for AsmOptionsList { for (i, v) in self.asm_options.into_iter().enumerate() { out.add_tuple("asm_options_list_asm_options", vec![id.into(), i.into(), v.into()]); } + for (i, v) in self.attrs.into_iter().enumerate() { + out.add_tuple("asm_options_list_attrs", vec![id.into(), i.into(), v.into()]); + } } } @@ -5215,6 +5343,65 @@ impl From> for trap::Label { } } +#[derive(Debug)] +pub struct DerefPat { + pub id: trap::TrapId, + pub pat: Option>, +} + +impl trap::TrapEntry for DerefPat { + fn extract_id(&mut self) -> trap::TrapId { + std::mem::replace(&mut self.id, trap::TrapId::Star) + } + + fn emit(self, id: trap::Label, out: &mut trap::Writer) { + out.add_tuple("deref_pats", vec![id.into()]); + if let Some(v) = self.pat { + out.add_tuple("deref_pat_pats", vec![id.into(), v.into()]); + } + } +} + +impl trap::TrapClass for DerefPat { + fn class_name() -> &'static str { "DerefPat" } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme DerefPat is a subclass of Pat + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme DerefPat is a subclass of AstNode + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme DerefPat is a subclass of Locatable + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme DerefPat is a subclass of Element + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + #[derive(Debug)] pub struct DynTraitTypeRepr { pub id: trap::TrapId, @@ -5814,6 +6001,61 @@ impl From> for trap::Label { } } +#[derive(Debug)] +pub struct IncludeBytesExpr { + pub id: trap::TrapId, +} + +impl trap::TrapEntry for IncludeBytesExpr { + fn extract_id(&mut self) -> trap::TrapId { + std::mem::replace(&mut self.id, trap::TrapId::Star) + } + + fn emit(self, id: trap::Label, out: &mut trap::Writer) { + out.add_tuple("include_bytes_exprs", vec![id.into()]); + } +} + +impl trap::TrapClass for IncludeBytesExpr { + fn class_name() -> &'static str { "IncludeBytesExpr" } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme IncludeBytesExpr is a subclass of Expr + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme IncludeBytesExpr is a subclass of AstNode + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme IncludeBytesExpr is a subclass of Locatable + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme IncludeBytesExpr is a subclass of Element + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + #[derive(Debug)] pub struct IndexExpr { pub id: trap::TrapId, @@ -6987,6 +7229,61 @@ impl From> for trap::Label { } } +#[derive(Debug)] +pub struct NotNull { + pub id: trap::TrapId, +} + +impl trap::TrapEntry for NotNull { + fn extract_id(&mut self) -> trap::TrapId { + std::mem::replace(&mut self.id, trap::TrapId::Star) + } + + fn emit(self, id: trap::Label, out: &mut trap::Writer) { + out.add_tuple("not_nulls", vec![id.into()]); + } +} + +impl trap::TrapClass for NotNull { + fn class_name() -> &'static str { "NotNull" } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme NotNull is a subclass of Pat + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme NotNull is a subclass of AstNode + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme NotNull is a subclass of Locatable + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme NotNull is a subclass of Element + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + #[derive(Debug)] pub struct OffsetOfExpr { pub id: trap::TrapId, @@ -7592,6 +7889,69 @@ impl From> for trap::Label { } } +#[derive(Debug)] +pub struct PatternTypeRepr { + pub id: trap::TrapId, + pub pat: Option>, + pub type_repr: Option>, +} + +impl trap::TrapEntry for PatternTypeRepr { + fn extract_id(&mut self) -> trap::TrapId { + std::mem::replace(&mut self.id, trap::TrapId::Star) + } + + fn emit(self, id: trap::Label, out: &mut trap::Writer) { + out.add_tuple("pattern_type_reprs", vec![id.into()]); + if let Some(v) = self.pat { + out.add_tuple("pattern_type_repr_pats", vec![id.into(), v.into()]); + } + if let Some(v) = self.type_repr { + out.add_tuple("pattern_type_repr_type_reprs", vec![id.into(), v.into()]); + } + } +} + +impl trap::TrapClass for PatternTypeRepr { + fn class_name() -> &'static str { "PatternTypeRepr" } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme PatternTypeRepr is a subclass of TypeRepr + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme PatternTypeRepr is a subclass of AstNode + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme PatternTypeRepr is a subclass of Locatable + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme PatternTypeRepr is a subclass of Element + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + #[derive(Debug)] pub struct PrefixExpr { pub id: trap::TrapId, @@ -10560,6 +10920,7 @@ pub struct Trait { pub assoc_item_list: Option>, pub attrs: Vec>, pub generic_param_list: Option>, + pub impl_restriction: Option>, pub is_auto: bool, pub is_unsafe: bool, pub name: Option>, @@ -10584,6 +10945,9 @@ impl trap::TrapEntry for Trait { if let Some(v) = self.generic_param_list { out.add_tuple("trait_generic_param_lists", vec![id.into(), v.into()]); } + if let Some(v) = self.impl_restriction { + out.add_tuple("trait_impl_restrictions", vec![id.into(), v.into()]); + } if self.is_auto { out.add_tuple("trait_is_auto", vec![id.into()]); } diff --git a/rust/extractor/src/translate/generated.rs b/rust/extractor/src/translate/generated.rs index fe524b75e9d1..f620af0e7cde 100644 --- a/rust/extractor/src/translate/generated.rs +++ b/rust/extractor/src/translate/generated.rs @@ -82,6 +82,9 @@ impl Translator<'_> { ast::Expr::ForExpr(inner) => self.emit_for_expr(inner).map(Into::into), ast::Expr::FormatArgsExpr(inner) => self.emit_format_args_expr(inner).map(Into::into), ast::Expr::IfExpr(inner) => self.emit_if_expr(inner).map(Into::into), + ast::Expr::IncludeBytesExpr(inner) => { + self.emit_include_bytes_expr(inner).map(Into::into) + } ast::Expr::IndexExpr(inner) => self.emit_index_expr(inner).map(Into::into), ast::Expr::LetExpr(inner) => self.emit_let_expr(inner).map(Into::into), ast::Expr::Literal(inner) => self.emit_literal(inner).map(Into::into), @@ -180,9 +183,11 @@ impl Translator<'_> { let label = match node { ast::Pat::BoxPat(inner) => self.emit_box_pat(inner).map(Into::into), ast::Pat::ConstBlockPat(inner) => self.emit_const_block_pat(inner).map(Into::into), + ast::Pat::DerefPat(inner) => self.emit_deref_pat(inner).map(Into::into), ast::Pat::IdentPat(inner) => self.emit_ident_pat(inner).map(Into::into), ast::Pat::LiteralPat(inner) => self.emit_literal_pat(inner).map(Into::into), ast::Pat::MacroPat(inner) => self.emit_macro_pat(inner).map(Into::into), + ast::Pat::NotNull(inner) => self.emit_not_null(inner).map(Into::into), ast::Pat::OrPat(inner) => self.emit_or_pat(inner).map(Into::into), ast::Pat::ParenPat(inner) => self.emit_paren_pat(inner).map(Into::into), ast::Pat::PathPat(inner) => self.emit_path_pat(inner).map(Into::into), @@ -217,6 +222,7 @@ impl Translator<'_> { ast::Type::NeverType(inner) => self.emit_never_type(inner).map(Into::into), ast::Type::ParenType(inner) => self.emit_paren_type(inner).map(Into::into), ast::Type::PathType(inner) => self.emit_path_type(inner).map(Into::into), + ast::Type::PatternType(inner) => self.emit_pattern_type(inner).map(Into::into), ast::Type::PtrType(inner) => self.emit_ptr_type(inner).map(Into::into), ast::Type::RefType(inner) => self.emit_ref_type(inner).map(Into::into), ast::Type::SliceType(inner) => self.emit_slice_type(inner).map(Into::into), @@ -322,9 +328,14 @@ impl Translator<'_> { &mut self, node: &ast::AsmClobberAbi, ) -> Option> { - let label = self - .trap - .emit(generated::AsmClobberAbi { id: TrapId::Star }); + if self.should_be_excluded(node) { + return None; + } + let attrs = node.attrs().filter_map(|x| self.emit_attr(&x)).collect(); + let label = self.trap.emit(generated::AsmClobberAbi { + id: TrapId::Star, + attrs, + }); self.emit_location(label, node); self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); Some(label) @@ -408,11 +419,16 @@ impl Translator<'_> { &mut self, node: &ast::AsmOperandNamed, ) -> Option> { + if self.should_be_excluded(node) { + return None; + } let asm_operand = node.asm_operand().and_then(|x| self.emit_asm_operand(&x)); + let attrs = node.attrs().filter_map(|x| self.emit_attr(&x)).collect(); let name = node.name().and_then(|x| self.emit_name(&x)); let label = self.trap.emit(generated::AsmOperandNamed { id: TrapId::Star, asm_operand, + attrs, name, }); self.emit_location(label, node); @@ -436,13 +452,18 @@ impl Translator<'_> { &mut self, node: &ast::AsmOptions, ) -> Option> { + if self.should_be_excluded(node) { + return None; + } let asm_options = node .asm_options() .filter_map(|x| self.emit_asm_option(&x)) .collect(); + let attrs = node.attrs().filter_map(|x| self.emit_attr(&x)).collect(); let label = self.trap.emit(generated::AsmOptionsList { id: TrapId::Star, asm_options, + attrs, }); self.emit_location(label, node); self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); @@ -916,6 +937,19 @@ impl Translator<'_> { self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); Some(label) } + pub(crate) fn emit_deref_pat( + &mut self, + node: &ast::DerefPat, + ) -> Option> { + let pat = node.pat().and_then(|x| self.emit_pat(&x)); + let label = self.trap.emit(generated::DerefPat { + id: TrapId::Star, + pat, + }); + self.emit_location(label, node); + self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); + Some(label) + } pub(crate) fn emit_dyn_trait_type( &mut self, node: &ast::DynTraitType, @@ -1190,30 +1224,17 @@ impl Translator<'_> { &mut self, node: &ast::FormatArgsArg, ) -> Option> { - let arg_name = node - .arg_name() - .and_then(|x| self.emit_format_args_arg_name(&x)); let expr = node.expr().and_then(|x| self.emit_expr(&x)); + let name = node.name().and_then(|x| self.emit_name(&x)); let label = self.trap.emit(generated::FormatArgsArg { id: TrapId::Star, - arg_name, expr, + name, }); self.emit_location(label, node); self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); Some(label) } - pub(crate) fn emit_format_args_arg_name( - &mut self, - node: &ast::FormatArgsArgName, - ) -> Option> { - let label = self - .trap - .emit(generated::FormatArgsArgName { id: TrapId::Star }); - self.emit_location(label, node); - self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); - Some(label) - } pub(crate) fn emit_format_args_expr( &mut self, node: &ast::FormatArgsExpr, @@ -1347,6 +1368,21 @@ impl Translator<'_> { self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); Some(label) } + pub(crate) fn emit_impl_restriction( + &mut self, + node: &ast::ImplRestriction, + ) -> Option> { + let visibility_inner = node + .visibility_inner() + .and_then(|x| self.emit_visibility_inner(&x)); + let label = self.trap.emit(generated::ImplRestriction { + id: TrapId::Star, + visibility_inner, + }); + self.emit_location(label, node); + self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); + Some(label) + } pub(crate) fn emit_impl_trait_type( &mut self, node: &ast::ImplTraitType, @@ -1362,6 +1398,17 @@ impl Translator<'_> { self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); Some(label) } + pub(crate) fn emit_include_bytes_expr( + &mut self, + node: &ast::IncludeBytesExpr, + ) -> Option> { + let label = self + .trap + .emit(generated::IncludeBytesExpr { id: TrapId::Star }); + self.emit_location(label, node); + self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); + Some(label) + } pub(crate) fn emit_index_expr( &mut self, node: &ast::IndexExpr, @@ -1849,6 +1896,23 @@ impl Translator<'_> { self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); Some(label) } + pub(crate) fn emit_mut_restriction( + &mut self, + node: &ast::MutRestriction, + ) -> Option> { + let is_mut = node.mut_token().is_some(); + let visibility_inner = node + .visibility_inner() + .and_then(|x| self.emit_visibility_inner(&x)); + let label = self.trap.emit(generated::MutRestriction { + id: TrapId::Star, + is_mut, + visibility_inner, + }); + self.emit_location(label, node); + self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); + Some(label) + } pub(crate) fn emit_name(&mut self, node: &ast::Name) -> Option> { let text = node.try_get_text(); let label = self.trap.emit(generated::Name { @@ -1883,6 +1947,15 @@ impl Translator<'_> { self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); Some(label) } + pub(crate) fn emit_not_null( + &mut self, + node: &ast::NotNull, + ) -> Option> { + let label = self.trap.emit(generated::NotNull { id: TrapId::Star }); + self.emit_location(label, node); + self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); + Some(label) + } pub(crate) fn emit_offset_of_expr( &mut self, node: &ast::OffsetOfExpr, @@ -2112,6 +2185,21 @@ impl Translator<'_> { self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); Some(label) } + pub(crate) fn emit_pattern_type( + &mut self, + node: &ast::PatternType, + ) -> Option> { + let pat = node.pat().and_then(|x| self.emit_pat(&x)); + let type_repr = node.ty().and_then(|x| self.emit_type(&x)); + let label = self.trap.emit(generated::PatternTypeRepr { + id: TrapId::Star, + pat, + type_repr, + }); + self.emit_location(label, node); + self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); + Some(label) + } pub(crate) fn emit_prefix_expr( &mut self, node: &ast::PrefixExpr, @@ -2258,6 +2346,9 @@ impl Translator<'_> { let attrs = node.attrs().filter_map(|x| self.emit_attr(&x)).collect(); let default_val = node.default_val().and_then(|x| self.emit_const_arg(&x)); let is_unsafe = node.unsafe_token().is_some(); + let mut_restriction = node + .mut_restriction() + .and_then(|x| self.emit_mut_restriction(&x)); let name = node.name().and_then(|x| self.emit_name(&x)); let type_repr = node.ty().and_then(|x| self.emit_type(&x)); let visibility = node.visibility().and_then(|x| self.emit_visibility(&x)); @@ -2266,6 +2357,7 @@ impl Translator<'_> { attrs, default_val, is_unsafe, + mut_restriction, name, type_repr, visibility, @@ -2654,6 +2746,9 @@ impl Translator<'_> { let generic_param_list = node .generic_param_list() .and_then(|x| self.emit_generic_param_list(&x)); + let impl_restriction = node + .impl_restriction() + .and_then(|x| self.emit_impl_restriction(&x)); let is_auto = node.auto_token().is_some(); let is_unsafe = node.unsafe_token().is_some(); let name = node.name().and_then(|x| self.emit_name(&x)); @@ -2667,6 +2762,7 @@ impl Translator<'_> { assoc_item_list, attrs, generic_param_list, + impl_restriction, is_auto, is_unsafe, name, @@ -2737,11 +2833,15 @@ impl Translator<'_> { return None; } let attrs = node.attrs().filter_map(|x| self.emit_attr(&x)).collect(); + let mut_restriction = node + .mut_restriction() + .and_then(|x| self.emit_mut_restriction(&x)); let type_repr = node.ty().and_then(|x| self.emit_type(&x)); let visibility = node.visibility().and_then(|x| self.emit_visibility(&x)); let label = self.trap.emit(generated::TupleField { id: TrapId::Star, attrs, + mut_restriction, type_repr, visibility, }); @@ -3094,8 +3194,23 @@ impl Translator<'_> { &mut self, node: &ast::Visibility, ) -> Option> { - let path = node.path().and_then(|x| self.emit_path(&x)); + let visibility_inner = node + .visibility_inner() + .and_then(|x| self.emit_visibility_inner(&x)); let label = self.trap.emit(generated::Visibility { + id: TrapId::Star, + visibility_inner, + }); + self.emit_location(label, node); + self.emit_tokens(node, label.into(), node.syntax().children_with_tokens()); + Some(label) + } + pub(crate) fn emit_visibility_inner( + &mut self, + node: &ast::VisibilityInner, + ) -> Option> { + let path = node.path().and_then(|x| self.emit_path(&x)); + let label = self.trap.emit(generated::VisibilityInner { id: TrapId::Star, path, }); diff --git a/rust/ql/.generated.list b/rust/ql/.generated.list index 4e2371c73bed..607a31d0e1f1 100644 --- a/rust/ql/.generated.list +++ b/rust/ql/.generated.list @@ -1,4 +1,4 @@ -lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll 6856901e16b8e54da81700c78abf93268801e77dbca5d3f2d3c63f7e1eeef088 8e4cbe943860b173a519a7b797d9a6af0d3cdcc0514d9e003720a71b51d8cb8c +lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll 042777a6b8f8ad63371d724d7f58dde13b5e020e74e6b0b4eadfe58845d66e5a 816b0ec2578eba21435a380b31e56311d68c14e921c201b6b350b7db913e4d22 lib/codeql/rust/elements/Abi.qll 485a2e79f6f7bfd1c02a6e795a71e62dede3c3e150149d5f8f18b761253b7208 6159ba175e7ead0dd2e3f2788f49516c306ee11b1a443bd4bdc00b7017d559bd lib/codeql/rust/elements/Addressable.qll 13011bfd2e1556694c3d440cc34af8527da4df49ad92b62f2939d3699ff2cea5 ddb25935f7553a1a384b1abe2e4b4fa90ab50b952dadec32fd867afcb054f4be lib/codeql/rust/elements/ArgList.qll 3d2f6f5542340b80a4c6e944ac17aba0d00727588bb66e501453ac0f80c82f83 afd52700bf5a337f19827846667cd0fb1fea5abbbcbc353828e292a727ea58c9 @@ -6,16 +6,16 @@ lib/codeql/rust/elements/ArrayExpr.qll e4e7cff3518c50ec908271906dd46c1fbe9098faa lib/codeql/rust/elements/ArrayListExpr.qll 451aedcecb479c385ff497588c7a07fda304fd5b873270223a4f2c804e96b245 a8cb008f6f732215623b5626c84b37b651ca01ccafb2cf4c835df35d5140c6ad lib/codeql/rust/elements/ArrayRepeatExpr.qll 4b7ed5be7d2caaf69f6fc0cd05b0e2416c52d547b1a73fb23d5a13007f75f4dd f6366f21cc48376b5fdf37e8c5c2b19415d4cbdeef09f33bb99cde5cb0f5b0e7 lib/codeql/rust/elements/ArrayTypeRepr.qll a3e61c99567893aa26c610165696e54d11c16053b6b7122275eff2c778f0a52d 36a487dcb083816b85f3eec181a1f9b47bba012765486e54db61c7ffe9a0fcbf -lib/codeql/rust/elements/AsmClobberAbi.qll eb5628916f41ab47e333b4528fba3fb80caecd2805fb20ba4f5c8d59c9677f14 636fce6b3a7f04141d0d3a53734d08a188a45bcc04f755bb66746d4f0a13fa72 +lib/codeql/rust/elements/AsmClobberAbi.qll 771637b0b61df0d55c3746b74c8c4f36a02f505d6765246c3bbfebffacdbfa2e ab7d8b0bcf95a40bbe6b7f5fef08b37ba773d3f5aa4b07390a2918d9d37dfa57 lib/codeql/rust/elements/AsmConst.qll f408468624dd0c80c6dcf62d17e65a94cd477a5a760be1b5fdd07c8189a3b4ea e4159073b3ee6d247e8962ce925da55ea39ee2cd1649f8b785a92aea17dbf144 lib/codeql/rust/elements/AsmDirSpec.qll 0c439c031c9f60596373aee8ae2ee70068582548ae365a3c7c19c8b5e2b030d2 0127b08b99bd8725cb6273c1a930aef4434897f23611cfc4ec2dd1b7c9d7e3d0 lib/codeql/rust/elements/AsmExpr.qll 0a477c401583a778ea6736070eaf8959f9312135e863e45fafb6c160da2e8f1b 0447b2438c694f9e9bd2629abb66281724d27b17e534fa8e9a19b2ea30af18d2 lib/codeql/rust/elements/AsmLabel.qll 5fa3401c49329ddc845bd95d5f498a455202f685e962dfec9bc91550577da800 f54fe1dcd3c76f36e6abc7b56dc5d6f5b1c30d0fb434db21dd8a1ce731fc6abf lib/codeql/rust/elements/AsmOperand.qll 3987a289233fe09f41f20b27939655cc72fa46847969a55cca6d6393f906969a 8810ff2a64f29d1441a449f5fd74bdc1107782172c7a21baaeb48a40930b7d5a lib/codeql/rust/elements/AsmOperandExpr.qll 72d4455cf742dc977b0a33ea21539422aaf2263f36c6f4420ddcb360ac606a0a 03bd01e81b291c915deb20ce33d5bdf73a709fbc007ab7570490e9a8e7c8604c -lib/codeql/rust/elements/AsmOperandNamed.qll c65bcf6f4ad5ebb447873ac170bd5d29dc5fe557f7aaccbdb46a09b2583df673 d7e277e43414ca2c529c5a4e967f4c6cca34ee7239ab1a993558b0731ce9722b +lib/codeql/rust/elements/AsmOperandNamed.qll eba3d7b64b9f66075cd0b80bafd57308d3c3b2279883df8caf629eeb05733e3b c69c877e1be60a483ef7c8fe427e19b6320512737ba2a54073b0dc9ef7c578cd lib/codeql/rust/elements/AsmOption.qll 7ad333a4bb152dbf7c1df0d90424ff20031841822e49b26cc615230b1c186581 9c2a087ea7f7c386eff170337f0c29568dea3d49a570b35207652b08e24a9355 -lib/codeql/rust/elements/AsmOptionsList.qll 3dd55a8b15ada811c9225b0fe9b733eabf22313e7bd1ae6a99fdcb9a6facea07 32d996dde8802e4a2afd8c3624f055cb4e4c18591dc236f3b5bf0c0d4e57f822 +lib/codeql/rust/elements/AsmOptionsList.qll a57cd6061019ff7e5380d0aea1806f74b78dadf02f650560ad4abbfcb5a6d0b1 aef54eb8846b78a448858a92bef70e04626d587737e096772362a4b5fcdc6711 lib/codeql/rust/elements/AsmPiece.qll 8650bf07246fac95533876db66178e4b30ed3210de9487b25acd2da2d145416a 42155a47d5d5e6ea2833127e78059fa81126a602e178084957c7d9ff88c1a9a3 lib/codeql/rust/elements/AsmRegOperand.qll 27abfffe1fc99e243d9b915f9a9694510133e5f72100ec0df53796d27a45de0c 8919ab83081dae2970adb6033340c6a18751ffd6a8157cf8c55916ac4253c791 lib/codeql/rust/elements/AsmRegSpec.qll 77483fc3d1de8761564e2f7b57ecf1300d67de50b66c11144bb4e3e0059ebfd6 521f8dd0af859b7eef6ab2edab2f422c9ff65aa11bad065cfba2ec082e0c786b @@ -47,6 +47,7 @@ lib/codeql/rust/elements/ConstBlockPat.qll a25f42b84dbeb33e10955735ef53b8bb7e325 lib/codeql/rust/elements/ConstParam.qll 87776586f7ff562ff3c71373f45cf70486f9a832613a0aaac943311c451cc057 67a31616688106d5130951f2162e5229bff0fde08ff647943663cac427d7048b lib/codeql/rust/elements/ContinueExpr.qll 9f27c5d5c819ad0ebc5bd10967ba8d33a9dc95b9aae278fcfb1fcf9216bda79c 0dc061445a6b89854fdce92aaf022fdc76b724511a50bb777496ce75c9ecb262 lib/codeql/rust/elements/Crate.qll 1426960e6f36195e42ea5ea321405c1a72fccd40cd6c0a33673c321c20302d8d 1571a89f89dab43c5291b71386de7aadf52730755ba10f9d696db9ad2f760aff +lib/codeql/rust/elements/DerefPat.qll 919e409e3b1130a4f55ec1e3854917e4868bea7b5eab4ab8625248317342fa83 0d065ea4a84c3c8575b5b4aade25b170fe30154c4ca819c3e2ee78bb85deaa5a lib/codeql/rust/elements/DynTraitTypeRepr.qll e4d27112d27ae93c621defd2c976fd4e90663ab7f6115e83ae4fe8106cb5e015 eb9fde89698588f3b7116f62388c54e937f99559b22c93d11a5596e754560072 lib/codeql/rust/elements/Element.qll 0b62d139fef54ed2cf2e2334806aa9bfbc036c9c2085d558f15a42cc3fa84c48 24b999b93df79383ef27ede46e38da752868c88a07fe35fcff5d526684ba7294 lib/codeql/rust/elements/Enum.qll 13c1a3bddfff6c9cc644902652883aefc7721bc94bd8084a1a49acc156996d12 17a898434329437479de4fef27ce11f5996b1953168066bd6d51f93594cc79d1 @@ -63,8 +64,7 @@ lib/codeql/rust/elements/ForBinder.qll ee29b55cb4c1fa5180cc4ee1236ac089fe9f67ffa lib/codeql/rust/elements/ForExpr.qll a050f60cf6fcc3ce66f5042be1b8096e5207fe2674d7477f9e299091ca99a4bd d7198495139649778894e930163add2d16b5588dd12bd6e094a9aec6863cb16f lib/codeql/rust/elements/ForTypeRepr.qll c85c5e368b9db4a308b55259b3e6b1f4d37050984de43b24971243d6ca6dcec5 51b1c3ddac2fb9616ec44816bcbb549df2c15bbbe674d045a7b1c352c1e335e3 lib/codeql/rust/elements/Format.qll 1b186730710e7e29ea47594998f0b359ad308927f84841adae0c0cb35fc8aeda d6f7bfdda60a529fb9e9a1975628d5bd11aa28a45e295c7526692ac662fd19f8 -lib/codeql/rust/elements/FormatArgsArg.qll 822287617367bca322a0157a1671a884b8035821c565c9ec8a29d1d4d154deaf 7a8dc3b18c12f0560574500523001e9babeee28a4b3fe3968ac3f30d89f44b3b -lib/codeql/rust/elements/FormatArgsArgName.qll 1e50d3007b517179bffb257b9a0b65b2651a07d1d3380b165995b8eb3eaff63d 6a1932ea108adaf951013f35ac5fe9cdcc409055c2249240a2eb47c73c503750 +lib/codeql/rust/elements/FormatArgsArg.qll a2c23cd512d44dd60b7d65eba52cc3adf6e2fbbcd0588be375daa16002cd7741 d9c5fe183fb228375223d83f857b7a9ee686f1d3e341bcf323d7c6f39652f88b lib/codeql/rust/elements/FormatArgsExpr.qll 8127cbe4082f7acc3d8a05298c2c9bea302519b8a6cd2d158a83c516d18fc487 88cf9b3bedd69a1150968f9a465c904bbb6805da0e0b90cfd1fc0dab1f6d9319 lib/codeql/rust/elements/FormatArgument.qll f6fe17ee1481c353dd42edae8b5fa79aeb99dff25b4842ec9a6f267b1837d1e3 5aed19c2daf2383b89ad7fd527375641cff26ddee7afddb89bc0d18d520f4034 lib/codeql/rust/elements/FormatTemplateVariableAccess.qll ff3218a1dda30c232d0ecd9d1c60bbb9f3973456ef0bee1d1a12ad14b1e082b5 e4316291c939800d8b34d477d92be9404a30d52b7eee37302aef3d3205cf4ae0 @@ -76,7 +76,9 @@ lib/codeql/rust/elements/GenericParamList.qll 25fcaa68bc7798d75974d12607fae0afc7 lib/codeql/rust/elements/IdentPat.qll ad5f202316d4eeee3ca81ea445728f4ad7eb6bb7d81232bc958c22a93d064bf2 7ce2772e391e593d8fd23b2b44e26d0d7e780327ec973fcc9dce52a75fda0e36 lib/codeql/rust/elements/IfExpr.qll f62153e8098b3eb08b569d4e25c750bc686665651579db4bc9e11dcef8e75d63 55006a55d612f189e73caa02f7b4deda388c692f0a801cdda9f833f2afdca778 lib/codeql/rust/elements/Impl.qll 0d69c9ace5dac87ed095cfd5d4a8baf7e17ebce1132f3a7d6fa2bf4325deff8d d908fc5da7d3a59fb0a286a6ce581bdabdb48c4ac6ecd070455c271c2352208c +lib/codeql/rust/elements/ImplRestriction.qll ac65497ed1cfb043933811537cf4ee4586efcaf04127d84a59bee7186b1e547c dd9e62f03e6b76e040c8a1add724804157c9ded3fe3bdcb866fab11118da5646 lib/codeql/rust/elements/ImplTraitTypeRepr.qll 1d559b16c659f447a1bde94cc656718f20f133f767060437b755ac81eea9f852 de69c596701f0af4db28c5802d092a39c88a90bf42ea85aea25eecb79417e454 +lib/codeql/rust/elements/IncludeBytesExpr.qll e5ae75699b7f29512bca874d6626376827f4dd30a9075d4ad2afc9446f180a1c d48578bb52636dcab6d6519e8d0449efa2b5a583db9a5a13d408b30595f650e1 lib/codeql/rust/elements/IndexExpr.qll 0e2e9f018d06ae72be0fc4ddbc019a9aacd8a06f42b4c4431760bd149e7f2290 2bcfd557abd53a48e48de7915c4f2089107c62dfb3e732a904848248dfd3727b lib/codeql/rust/elements/InferTypeRepr.qll 1b8bdcb574a7b6e7dd49f4cfb96655a6ccc355744b424b8c2593fe8218090d53 c20a2a5b0346dc277721deb450e732a47812c8e872ffb60aaba351b1708e9477 lib/codeql/rust/elements/Item.qll 59d2ac7b5b111579951bf42f68834ecf6dab47a5fb342ed0841c905b977923ab 0d220ec12a373098b26e6cb3a7b327b2d0c1882c3d9b6de00f4df1e8d00bae68 @@ -110,9 +112,11 @@ lib/codeql/rust/elements/Meta.qll e54802dadd2f1b914a821f9e9335f6088d4782751e36c0 lib/codeql/rust/elements/MethodCallExpr.qll 914633f304c587addced988a7f161a1a4b3297ce370f6a959b7a042b1c04dace 289a0854d6323df915ee5f268523ee597ba20a37c646bbb2a79c9ed1f7aa2260 lib/codeql/rust/elements/Missing.qll 70e6ac9790314752849c9888443c98223ccfc93a193998b7ce350b2c6ebe8ea4 e2f0623511acaa76b091f748d417714137a8b94f1f2bdbbd177f1c682c786dad lib/codeql/rust/elements/Module.qll 0bc85019177709256f8078d9de2a36f62f848d476225bff7bba1e35f249875c7 3fbb70e0c417a644dd0cada2c364c6e6876cfa16f37960e219c87e49c966c94e +lib/codeql/rust/elements/MutRestriction.qll fcffcf98570c972621e53e5f3ef5e9daf8b48699721fd2e3f7c13e11c5577033 98b064a3353a5ef70a218c01911c1c7c359ead97a3063e69d169069d5f1a8868 lib/codeql/rust/elements/Name.qll af41479d4260fe931d46154dda15484e4733c952b98f0e370106e6e9e8ce398b e188a0d0309dd1b684c0cb88df435b38e306eb94d6b66a2b748e75252f15e095 lib/codeql/rust/elements/NameRef.qll 587308f2276853303fd5e8804fad255e200fdbb115c4abf7635435856884e254 6cb64e921d2dde8fc87cb26b6539254b883a7313689798180791a2905eb3f418 lib/codeql/rust/elements/NeverTypeRepr.qll e523e284b9becb3d55e2f322f4497428bfa307c904745878545695a73d7e3a52 4af09ebae3348ba581b59f1b5fa4c45defc8fa785622719fa98ebefee2396367 +lib/codeql/rust/elements/NotNull.qll 7b4f7b10b9b686688479636c75ca52704b8ab63a8986a9d5488b00f22b30b490 d1da0b813309983ac4354e77abc7cb4ca61e609c3642c191a7b89bafc222294c lib/codeql/rust/elements/OffsetOfExpr.qll 370734a01c72364c9d6a904597190dac99dc1262631229732c8687fd1b3e2aa0 e222d2688aa18ed6eec04f2f6ac1537f5c7467d2cef878122e8fc158d4f6f99e lib/codeql/rust/elements/OrPat.qll 408b71f51edbfc79bf93b86fb058d01fa79caf2ebfeef37b50ae1da886c71b68 4a3f2b00db33fe26ee0859e35261016312cb491e23c46746cdd6d8bb1f6c88ef lib/codeql/rust/elements/Param.qll d0c0a427c003bbbacaeb0c2f4566f35b997ad0bca4d49f97b50c3a4bd1ddbd71 e654a17dfcb7aaeb589e7944c38f591c4cf922ebceb834071bcb9f9165ee48be @@ -131,6 +135,7 @@ lib/codeql/rust/elements/PathMeta.qll 56021df592b69c9c735db2ebe2b14ee5b5e0a76546 lib/codeql/rust/elements/PathPat.qll a7069d1dd77ba66814d6c84e135ed2975d7fcf379624079e6a76dc44b5de832e 2294d524b65ab0d038094b2a00f73feb8ab70c8f49fb4d91e9d390073205631d lib/codeql/rust/elements/PathSegment.qll c54e9d03fc76f3b21c0cfe719617d03d2a172a47c8f884a259566dd6c63d23f2 4995473961f723239b8ac52804aeb373ef2ac26df0f3719c4ca67858039f2132 lib/codeql/rust/elements/PathTypeRepr.qll 1b68e119ac82fdf5f421ded88a1739bfb8009c61e2745be11b34c3a025de18aa 48d9b49ee871f3932a0806709b4a21dadfdbe5cef8bab8d71aab69b6e4e7b432 +lib/codeql/rust/elements/PatternTypeRepr.qll 5d2e164e732fdfa574227cbd3c1d462d8393ccb84603bb3de82f8a5919cd039c 927ac473920d4ee5dcf2373fa0a342431d13060c1e53a28596b8da7f33254ed0 lib/codeql/rust/elements/PrefixExpr.qll 107e7bd111b637fd6d76026062d54c2780760b965f172ef119c50dd0714a377d 46954a9404e561c51682395729daac3bda5442113f29839d043e9605d63f7f6d lib/codeql/rust/elements/PtrTypeRepr.qll 91a3816030ee8e8aae19759589b1b212a09e931b2858a0fef5a3a23f1fb5e342 db7371e63d9cb8b394c5438f4e8c80c1149ca45335ce3a46e6d564ed0cf3938a lib/codeql/rust/elements/RangeExpr.qll 43785bea08a6a537010db1138e68ae92eed7e481744188dfb3bad119425ff740 5e81cfbdf4617372a73d662a248a0b380c1f40988a5daefb7f00057cae10d3d4 @@ -154,7 +159,7 @@ lib/codeql/rust/elements/Struct.qll e60a859c0112b7a7ce4a4752e936e0d58f413ceb895d lib/codeql/rust/elements/StructExpr.qll 84f384ef74c723796e514186037a91dd9666556f62c717f133ce22e9dda4425f 176497835252cfdfe110e58ebde9fbde553d03e44e07d3e4d8041e835dbf31b9 lib/codeql/rust/elements/StructExprField.qll 3eb9f17ecd1ad38679689eb4ecc169d3a0b5b7a3fc597ae5a957a7aea2f74e4f 8fcd26f266f203004899a60447ba16e7eae4e3a654fbec7f54e26857730ede93 lib/codeql/rust/elements/StructExprFieldList.qll 6efb2ec4889b38556dc679bb89bbd4bd76ed6a60014c41f8e232288fc23b2d52 dc867a0a4710621e04b36bbec7d317d6f360e0d6ac68b79168c8b714babde31d -lib/codeql/rust/elements/StructField.qll 76e41d8a14d30a3f5a89d1cf28e77265f747824a356711e466fcde3b70e11d39 0fef2c368f53c12db96dcad2eab1bd0ae9cb619711451750bc94b6e31af329dc +lib/codeql/rust/elements/StructField.qll 4cd16bbba2310fa2c4c489550fa3e876d87585be3aeba9ed2fe8f4a4d6402b8f ec76956b63b4d49bbde04327c53650efa99c7286427bf8e092df7cc99fdfea60 lib/codeql/rust/elements/StructFieldList.qll ee3cf510d35fad0edfeec68315fbe986a6d5323fbaddcfb688682be9a6508352 8cafe522251f98eb10eb45073e434a814165c25e436850f81b1d73ef88d6ae83 lib/codeql/rust/elements/StructPat.qll cdd1e8417d1c8cb3d14356390d71eb2916a295d95f240f48d4c2fb21bf4398cb 69c3456a13ef3e978a9a145b9e232198a30360f771feb41a917e507410611f6c lib/codeql/rust/elements/StructPatField.qll 856aa7d7c6d9b3c17514cbd12a36164e6e9d5923245770d0af3afb759a15204a 1bd1a294d84ad5e4da24e03b4882b215c50473875014859dbf26555d1f4ec2d5 @@ -162,11 +167,11 @@ lib/codeql/rust/elements/StructPatFieldList.qll 44619afedcda047e51ee3e319f738d5c lib/codeql/rust/elements/Token.qll e2de97c32e12c7ac9369f8dccabc22d89bfcbf7f6acd99f1aa7faa38eb4ac2b2 888d7e1743e802790e78bae694fedb4aba361b600fb9d9ecf022436f2138e13c lib/codeql/rust/elements/TokenTree.qll 23e57fd945ce509df5122aa46f7971360788945cb7a67ddc229de5f44b80e6e9 18a7834edf5d6808e9126c0ce2e9554211faaf21bf7e9e2fa09aa167654e43a9 lib/codeql/rust/elements/TokenTreeMeta.qll f784784313490314520f6aa9f4dac0f4fbf990427ed39c36185a9526e8d1726d 9c8a74c34ba908d3e886f3e7b041dbaf46a981e26ecc1b66a22d11c1b5155e3f -lib/codeql/rust/elements/Trait.qll f78a917c2f2e5a0dfcd7c36e95ad67b1fa218484ee509610db8ca38453bebd4c 2a12f03870ebf86e104bdc3b61aae8512bfafbbf79a0cff5c3c27a04635926af +lib/codeql/rust/elements/Trait.qll 967281589090f414aafb9087a0a00e0906a9b42b9861044dcd5107e22f3b8e7d 1f892d3974b8fd7715efb1d565a6bff2a36c8f72e765609361fc6bfcd1437ad1 lib/codeql/rust/elements/TryBlockModifier.qll 1567952cea9392e7af28cbe6b7c4aaf00f231e5caeb1292a6fc515918b2891bf 622cbadf10f955f5558475d8015f16667773dabf7db7bdabcc9dbff5425a9fb8 lib/codeql/rust/elements/TryExpr.qll cb452f53292a1396139f64a35f05bb11501f6b363f8affc9f2d5f1945ad4a647 d60ad731bfe256d0f0b688bdc31708759a3d990c11dee4f1d85ccc0d9e07bec9 lib/codeql/rust/elements/TupleExpr.qll 1b1be270198f9d3db1c28c4caaa4a7fe9b5ae14651f1a10e2891a7d78d6ad18b 4f585aa684dfbff753e342903ddd60ee4d7c374b8bddeb645784d10903c90ae0 -lib/codeql/rust/elements/TupleField.qll 8d6288fd79959d5ef3732397c0a05a47fcb09091383058d1dba7268a950f8c32 1518cdd0fd9746d09fcdbecabc2a3ce6b36b6d983883850beed3f55c2bdf2c16 +lib/codeql/rust/elements/TupleField.qll 649e7025e4ba15e0189e764ae5253e68083432adf8e1b763e0739d3b4f79ae71 7522cd5a4efe5526d2be6cfeb99461fbce88c64041c6000e00a239797778f7d4 lib/codeql/rust/elements/TupleFieldList.qll 2fa47599f78aa4639a40239cf49bc2f97d84118125b949c71fec4390589caaf0 3f71a86e38bdc6fe9f0c082a43d763c4f34b4bdab99c383cdc5d8b59e887cee0 lib/codeql/rust/elements/TuplePat.qll 028cdea43868b0fdd2fc4c31ff25b6bbb40813e8aaccf72186051a280db7632e 38c56187971671e6a9dd0c6ccccb2ee4470aa82852110c6b89884496eb4abc64 lib/codeql/rust/elements/TupleStructPat.qll da398a23eb616bf7dd586b2a87f4ab00f28623418f081cd7b1cc3de497ef1819 6573bf3f8501c30af3aeb23d96db9f5bea7ab73e2b7ef3473095c03e96c20a5c @@ -190,7 +195,8 @@ lib/codeql/rust/elements/UseTree.qll e67c148f63668319c37914a46ff600692de477242a0 lib/codeql/rust/elements/UseTreeList.qll 92ebfee4392a485b38fb3265fdede7c8f2ed1dbe2ab860aa61b1497c33874d25 a4e677455d20838e422e430eebd73d0a488e34e8c960f375fef7b99e79d4c911 lib/codeql/rust/elements/Variant.qll affe9c58021358fd93d9c867277b4853c8303caa75521c657c8ba2e0cd45f0d6 44894859e3dde36b727abe8a28198f1ba7c487af839e6d9a2fe2d1bacb59f477 lib/codeql/rust/elements/VariantList.qll 39803fbb873d48202c2a511c00c8eafede06e519894e0fd050c2a85bf5f4aa73 1735f89b2b8f6d5960a276b87ea10e4bb8c848c24a5d5fad7f3add7a4d94b7da -lib/codeql/rust/elements/Visibility.qll aa69e8a3fd3b01f6fea0ae2d841a2adc51f4e46dcfc9f8f03c34fbe96f7e24e7 0d475e97e07b73c8da2b53555085b8309d8dc69c113bcb396fc901361dbfe6b8 +lib/codeql/rust/elements/Visibility.qll af9f001cd30e92bd004480fe348adf7ce745ac3de381b1f4723b46ad63be7622 07cb39b9b8c3866bfa1b46eac45e3a5ba1a5877cf51424891b72bc7d3f54dca4 +lib/codeql/rust/elements/VisibilityInner.qll 0ea5872f3d0551bdab996b3eedd8cac95865cb7afba951fda8db8b0f83c49e01 e5148575e5c40f634e5d1e2c0eab8ce51fa2a3fe7b4bfd6657e0033ef643662a lib/codeql/rust/elements/WhereClause.qll 4e28e11ceec835a093e469854a4b615e698309cdcbc39ed83810e2e4e7c5953f 4736baf689b87dd6669cb0ef9e27eb2c0f2776ce7f29d7693670bbcea06eb4e4 lib/codeql/rust/elements/WherePred.qll 589027c2fddb07620f74b8ed5e471fab49bef389749e498069d7c1fe50912cc7 dd7c90ff9c5bd563f0b8a088e0890ee11c6d5b2269223f22be01f0e1dbe0f5e2 lib/codeql/rust/elements/WhileExpr.qll 4a37e3ecd37c306a9b93b610a0e45e18adc22fcd4ce955a519b679e9f89b97e8 82026faa73b94390544e61ed2f3aaeaabd3e457439bb76d2fb06b0d1edd63f49 @@ -266,6 +272,8 @@ lib/codeql/rust/elements/internal/ConstParamConstructor.qll f6645f952aac87c7e00e lib/codeql/rust/elements/internal/ConstParamImpl.qll c6995be58f84d1df65897c80f7ee3dd8eb410bb3e634ff1bfe1be94dfb3fdf32 bcfb5547b40f24bcec20056fe1d36724b734c920b0bc7538fe2974b03f4478fe lib/codeql/rust/elements/internal/ContinueExprConstructor.qll cd93f1b35ccdb031d7e8deba92f6a76187f6009c454f3ea07e89ba459de57ca6 6f658e7d580c4c9068b01d6dd6f72888b8800860668a6653f8c3b27dc9996935 lib/codeql/rust/elements/internal/CrateConstructor.qll 2a3710ed6ff4ffdbc773ac16e2cf176415be8908e1d59fd0702bdeddbae096f4 f75a069b0ef71e54089001eb3a34b8a9e4ce8e4f65ffa71b669b38cf86e0af40 +lib/codeql/rust/elements/internal/DerefPatConstructor.qll a92a1e9b310a7dc92f31952b08c264cbd57265a5c619ff1abecf739ed4f6525f f86e26668b88baa571ca7521782141ce92f816ec366024c21c953bc335482c10 +lib/codeql/rust/elements/internal/DerefPatImpl.qll 5787acbf70fdf17902a62a2876ca02465d8b85ea481a143ae7461bfd5c208f08 487805a8b79949d87235a352ca3a427edaa0247cf01268f952767a17e1290c79 lib/codeql/rust/elements/internal/DynTraitTypeReprConstructor.qll 6964e6c80fb7f5e283c1d15562cef18ed097452b7fcbc04eff780c7646675c7a f03c4830bf1b958fdfb6563136fa21c911b2e41ce1d1caee14ec572c7232866d lib/codeql/rust/elements/internal/EnumConstructor.qll eca1a13937faacb1db50e4cf69d175f992f2204a5aaed9144bb6f3cb63814ac5 1bafba78b2729fdb052a25a1ba3f4f70871564aa4df632b4a1d467858a437924 lib/codeql/rust/elements/internal/ExprImpl.qll ab20ee174e2e786f34af6e5dedf3ec071bb89fc266b3e91df6377f72aa38d3f2 f68192700f449bf1c229cfbaabd5353c7c559941c915d5a0c88752cf9844194b @@ -290,8 +298,6 @@ lib/codeql/rust/elements/internal/ForTypeReprConstructor.qll eae141dbe9256ab0eb8 lib/codeql/rust/elements/internal/ForTypeReprImpl.qll dbbcb86626dcba3d5534d461d7306c354a15f800ff37c1d039801b868179b387 f942eebb20fb2603b7bab0e90f3e3f7a3f87dd6229090fc011c692a52164ac90 lib/codeql/rust/elements/internal/FormatArgsArgConstructor.qll 8bd9b4e035ef8adeb3ac510dd68043934c0140facb933be1f240096d01cdfa11 74e9d3bbd8882ae59a7e88935d468e0a90a6529a4e2af6a3d83e93944470f0ee lib/codeql/rust/elements/internal/FormatArgsArgImpl.qll 6a8f55e51e141e4875ed03a7cc65eea49daa349de370b957e1e8c6bc4478425c 7efab8981ccbe75a4843315404674793dda66dde02ba432edbca25c7d355778a -lib/codeql/rust/elements/internal/FormatArgsArgNameConstructor.qll 1d5221a97f0edee8c07fd1140a9409cf7c3e6e90fc226278bbe64cf55d72b5c5 a77954bd52b2aa7b2e6891482001a2600c9365778630baf318ffd05cf1630568 -lib/codeql/rust/elements/internal/FormatArgsArgNameImpl.qll 58576638f78150e84c11ae9c702c1f4ea286460f6476a89f0259c9f7cf34dd36 3befb988d6e8ece20b718cd59bac4a68c458814c3157e4d1d7a513a03fd4bd1e lib/codeql/rust/elements/internal/FormatArgsExprConstructor.qll ce29ff5a839b885b1ab7a02d6a381ae474ab1be3e6ee7dcfd7595bdf28e4b558 63bf957426871905a51ea319662a59e38104c197a1024360aca364dc145b11e8 lib/codeql/rust/elements/internal/FunctionConstructor.qll b50aea579938d03745dfbd8b5fa8498f7f83b967369f63d6875510e09ab7f5d2 19cca32aeaecaf9debc27329e8c39ecec69464bb1d89d7b09908a1d73a8d92a2 lib/codeql/rust/elements/internal/GenericArgImpl.qll fde43bb0e3cb2d8eb9feb02012b0a4f934015f8175ec112dea1077d131f55acb 44842e8075f750ba2876cff28d07284f99188982aa6d674ec863ad90305bf6ae @@ -301,7 +307,11 @@ lib/codeql/rust/elements/internal/GenericParamListConstructor.qll 7221146d1724e0 lib/codeql/rust/elements/internal/IdentPatConstructor.qll 09792f5a070996b65f095dc6b1b9e0fb096a56648eed26c0643c59f82377cab0 0bb1a9fcdc62b5197aef3dd6e0ea4d679dde10d5be54b57b5209727ba66e078b lib/codeql/rust/elements/internal/IfExprConstructor.qll 03088b54c8fa623f93a5b5a7eb896f680e8b0e9025488157a02c48aaebc6ad56 906f916c3690d0721a31dd31b302dcdcec4233bb507683007d82cf10793a648f lib/codeql/rust/elements/internal/ImplConstructor.qll 24edccca59f70d812d1458b412a45310ddc096d095332f6e3258903c54c1bb44 7eb673b3ab33a0873ee5ce189105425066b376821cce0fc9eb8ace22995f0bc7 +lib/codeql/rust/elements/internal/ImplRestrictionConstructor.qll 7d58e3efd82a6869fec0c95733d710223563ba063a11096bc78bdaa2b52228ee 83c219aabb5d037dcece2e723b8424f0a853d5a7c15562c1b5b964e8ea43fd2d +lib/codeql/rust/elements/internal/ImplRestrictionImpl.qll cce75057493e37bb70ccbafef2af199893cc017553561f02842c4d0d4ff8eba3 984055016d15f25371261120d1d4b4db38d93f491f61fa25becf8099ce6bbaf9 lib/codeql/rust/elements/internal/ImplTraitTypeReprConstructor.qll 1ed355e5e56f432b24b6f4778e4dc45c6e65095190cacb7a5015529e0c9d01f8 c8505185a042da4eb20a0cc32323194a0290c4bf821c7e0fce7351b194b10f31 +lib/codeql/rust/elements/internal/IncludeBytesExprConstructor.qll 62d20cf32e8c0fa62ef5b472e3b5538b95cc6bf275955f195a4924c2f38c9ba8 5fd4b50e9760af5a5c76d616658adde406470c4c9eac9b846dc0b7583e6460c1 +lib/codeql/rust/elements/internal/IncludeBytesExprImpl.qll 7961e1468673e4ca70463723625e1ff3c881dcfeb7fb9a184cdbc4bb49eea00d 9825ebf1fb02f2449359d4bb540672c124ea997263bee06a55cb66fc80ca2010 lib/codeql/rust/elements/internal/IndexExprConstructor.qll 99bdc3d793c4dbd993860da60abe2b7c604345d645e86916462bc55a6939a5d1 3fe9d7da725956903707806aadbecac8d5b3874e8bed63c9bab54fff630e75dd lib/codeql/rust/elements/internal/InferTypeReprConstructor.qll bc5f16853401617fc9c5af8a1287a23c5921df1b615cfbe2d7c7a70145ecfcbd da93bd28ea2daade2cbb0a729be3fbf05f72bc02009565c7bb062e4f68fdb9e7 lib/codeql/rust/elements/internal/ItemListConstructor.qll 08af3bd12536941c3dd4a43c81cc861be24325e242e2593c087a3ce632674291 2fa166159c409d2aaffa73a30babb40829a6de580bd40894d909ee6152801082 @@ -344,12 +354,16 @@ lib/codeql/rust/elements/internal/MethodCallExprConstructor.qll a1b3c4587f0ae60d lib/codeql/rust/elements/internal/MissingConstructor.qll aab0b7f2846f14a5914661a18c7c9eae71b9bde2162a3c5e5e8a8ecafa20e854 8f30b00b5b7918a7500786cc749b61695158b5b3cc8e9f2277b6b6bf0f7850a0 lib/codeql/rust/elements/internal/MissingImpl.qll e81caa383797dfe837cf101fb78d23ab150b32fef7b47ffcc5489bfcd942ac3e 9f3212d45d77e5888e435e7babd55c1e6b42c3c16f5b1f71170ac41f93ee8d0b lib/codeql/rust/elements/internal/ModuleConstructor.qll 31cc83c9d8f25ac07375d19e568f05c068e1f5aa205ff3d9ac31c2510e6f8468 8a70f3f1c18ff87f17e6baf2f05ccaed55c70469288192fc39ef0bb5531b8c0e +lib/codeql/rust/elements/internal/MutRestrictionConstructor.qll 002e0b35790932db84a5643d9ffc531b10dc327b1b44b966e773bf9b4e46a325 5d81599d543825b8ace752dc03bafc9bae7f13bc8bcbb3db5e2e0243fc9c6772 +lib/codeql/rust/elements/internal/MutRestrictionImpl.qll 5ce47f31fc2aa782b1d7faf560e9c4510f3f4f968d51f7166cab28b42774ca66 49d7d1bb05d982d28e391f52af3f7d503bf4f9612dbe180002297cac3ae38fe3 lib/codeql/rust/elements/internal/NameConstructor.qll a760134c6d4fc785746e1a5dc042a6bf25b8adaa3947a6897c31e50fd91dd5fd 1359f903d57112bcc1f62a609febb288301bfa810e569aa12e1045fd48b5b5c9 lib/codeql/rust/elements/internal/NameRefConstructor.qll 5ff6eacc614fd41f98b54cbb4960a07a1471cf4ea291758d33e54a48fd5d1bc4 c538d65414a24dfdbeb49cfd997588227559ba038f0b55d14bb5d89ed1a016f2 lib/codeql/rust/elements/internal/NamedCrate.qll 6c697076387b5af00422e227540d100ff7c03d3001f6a4c5b61433191d022490 2276f85411db199598fc6a5d8d6ec5762e42b1b45c98e398eeb75e69c697b57f lib/codeql/rust/elements/internal/NamedCrateConstructor.qll 72e07ece16f787dfd993982848689dc2e11845aa5634e9ee5ad8865b95cb59dc ea6555ae33cabe408935649b5e8c6218158036a3b7c4e1abc8bd7cd51c05a912 lib/codeql/rust/elements/internal/NamedCrateImpl.qll ba1f775ca6177a5bdb2ef1891a3fd505642e2fec63910f958f380039499f45bf f66b503b3574d3be75b79870b754015740f58195c4924b71c21ba4e673efd8c4 lib/codeql/rust/elements/internal/NeverTypeReprConstructor.qll 2e0a9c75e389e9ef41a18dd9b5d6c29ffe1d1d633e51ef1de90ec553236d201a 61ea87802fd1c3a68e864ccd76657253a228b06471e4c55bcf94ca2be554f866 +lib/codeql/rust/elements/internal/NotNullConstructor.qll 40e9254021ce7f09861c8d4ac70c3595953e8ade756a3da039d99a638fe8f0f3 3264d3ba76e04cdee673ae38dd3fcd7660978dc17d86c9b8f062bd0fbf3e5d3e +lib/codeql/rust/elements/internal/NotNullImpl.qll 1a7a66a54a0dd23960fbfc8f464cfa62b0b22dea839ad2d8a7cb20a0969e4684 3edce65d0e844d3bebc8e415865e128aac20f0b5fdf039c4eccd643fcabb9ea0 lib/codeql/rust/elements/internal/OffsetOfExprConstructor.qll 616e146562adb3ac0fba4d6f55dd6ce60518ed377c0856f1f09ba49593e7bfab 80518ce90fc6d08011d6f5fc2a543958067739e1b0a6a5f2ed90fc9b1db078f0 lib/codeql/rust/elements/internal/OffsetOfExprImpl.qll e52d4596068cc54719438121f7d5afcaab04e0c70168ac5e4df1a3a0969817a6 6ab37e659d79e02fb2685d6802ae124157bf14b6f790b31688f437c87f40f52c lib/codeql/rust/elements/internal/OrPatConstructor.qll 4ef583e07298487c0c4c6d7c76ffcc04b1e5fe58aba0c1da3e2c8446a9e0c92b 980a6bd176ae5e5b11c134569910c5468ba91f480982d846e222d031a6a05f1a @@ -369,6 +383,8 @@ lib/codeql/rust/elements/internal/PathMetaImpl.qll 052152ec17c827054b1e9fccfc7cd lib/codeql/rust/elements/internal/PathPatConstructor.qll 966c4ea22218ef71e000d7ce8dd5b570c39ad96b9239a3aa8a38292e2a9f36d2 8a1f348e9257ffc6e6bedcd70389b8e7ec2a3ed6e7b3733744ddfab284826e57 lib/codeql/rust/elements/internal/PathSegmentConstructor.qll 2d9639e42035dc7e73b7d6ddb8a977beadc6b4492dee4292b2f85b4409344441 c337fc3b9ef56366428772563e3f25f711474d16e860d3e89c1395a95d9e83e7 lib/codeql/rust/elements/internal/PathTypeReprConstructor.qll e05e7be13d48e7f832e735254777692d4be827a745b1fd94b9649d46fe574393 4aa1e6935a4479b61f205265cbbba01ce96d09a680c20d5decf30d1374d484d4 +lib/codeql/rust/elements/internal/PatternTypeReprConstructor.qll cf17aaca86534afe86518f1dc2fdbf548fc0e9bf241d1e698a94940ce875d1f2 5799da5538796765846bcf09391ec2388cc96fdc6fea60819301ab6387d5d146 +lib/codeql/rust/elements/internal/PatternTypeReprImpl.qll b8a9814bddff9d960cbcd12af518f493246c8df33ad084e94c2d348a9f711521 6f425f32e0bc69a84f97ea55ed4c68170c01c96cabe0d5a9da1434c2418a8927 lib/codeql/rust/elements/internal/PrefixExprConstructor.qll 90c50b0df2d4b4cbf5e2b7d67a9d243a1af9bfff660b7a70d8b9c7859c28bca7 1a1b5ea1f06ed8d41a658c872e8e1915c241a7c799c691df81b9a7b55d8f2f1e lib/codeql/rust/elements/internal/PtrTypeReprConstructor.qll c8bd3502dc23429577fbff0fe3e3c78b812b2237b2bb65862c137083fdaa7a4a 4d5c135be30f71a3712acbc22bdb6c425fa6463043a9ee64543da31151d68366 lib/codeql/rust/elements/internal/PtrTypeReprImpl.qll cb3cf7960a05f2c1930067fc62c5a207fc5faac143758b9b9e5f117fbd073f2f 40545d4768380f0dde9b708932f92f57566ac49f3f9b4147a8ff2ea90a0947c7 @@ -455,6 +471,8 @@ lib/codeql/rust/elements/internal/VariantConstructor.qll 0297d4a9a9b32448d6d6063 lib/codeql/rust/elements/internal/VariantListConstructor.qll c841fb345eb46ea3978a0ed7a689f8955efc9178044b140b74d98a6bcd0c926a c9e52d112abdba2b60013fa01a944c8770766bf7368f9878e6b13daaa4eed446 lib/codeql/rust/elements/internal/VariantListImpl.qll 4ceeda617696eb547c707589ba26103cf4c5c3d889955531be24cbf224e79dff 4258196c126fd2fad0e18068cb3d570a67034a8b26e2f13f8223d7f1a246d1a4 lib/codeql/rust/elements/internal/VisibilityConstructor.qll 1fd30663d87945f08d15cfaca54f586a658f26b7a98ea45ac73a35d36d4f65d0 6ddaf11742cc8fbbe03af2aa578394041ae077911e62d2fa6c885ae0543ba53a +lib/codeql/rust/elements/internal/VisibilityInnerConstructor.qll 6d845ba35a3bc8521fb49d1691d6aa10f1f7f4b7f27f12f4d3e316d8d3d6050c eecc48b25464df7e723ce1e9706b2b9ffbb8ccac26edb78b0901ce9912675edc +lib/codeql/rust/elements/internal/VisibilityInnerImpl.qll 07cb2b0601f495d0daff02e30796fb2076e1a2659d434115bc47c9d916f6953e ab7a9fca5788ec83c5bd5cc3873688a9fab2da3114e0c72e8f3f53bb2a51f83a lib/codeql/rust/elements/internal/WhereClauseConstructor.qll 6d6f0f0376cf45fac37ea0c7c4345d08718d2a3d6d913e591de1de9e640317c9 ff690f3d4391e5f1fae6e9014365810105e8befe9d6b52a82625994319af9ffd lib/codeql/rust/elements/internal/WhereClauseImpl.qll 006e330df395183d15896e5f81128e24b8274d849fe45afb5040444e4b764226 ed5e8317b5f33104e5c322588dc400755c8852bbb77ef835177b13af7480fd43 lib/codeql/rust/elements/internal/WherePredConstructor.qll f331c37085792a01159e8c218e9ef827e80e99b7c3d5978b6489808f05bd11f8 179cad3e4c5aaaf27755891694ef3569322fcf34c5290e6af49e5b5e3f8aa732 @@ -473,16 +491,16 @@ lib/codeql/rust/elements/internal/generated/ArrayExprInternal.qll 67a7b0fae04b11 lib/codeql/rust/elements/internal/generated/ArrayListExpr.qll f325163c2bd401286305330482bee20d060cecd24afa9e49deab7ba7e72ca056 ae3f5b303e31fc6c48b38172304ee8dcf3af2b2ba693767824ea8a944b6be0eb lib/codeql/rust/elements/internal/generated/ArrayRepeatExpr.qll ac2035488d5b9328f01ce2dd5bd7598e3af1cbb383ddb48b648e1e8908ea82fc 3ec910b184115fb3750692287e8039560e20bd6a5fb26ac1f9c346424d8eaa48 lib/codeql/rust/elements/internal/generated/ArrayTypeRepr.qll d1db33bc2c13e5bc6faa9c7009c50b336296b10ed69723499db2680ff105604d e581ca7f2e5089e272c4ef99630daac2511440314a71267ff3e66f857f13ee69 -lib/codeql/rust/elements/internal/generated/AsmClobberAbi.qll 579cabafcf0387a9270112ffa53c0b542c1bfbbebfe5c916ac2e6a9b2453539a 8048f5d8759425c55dc46d8fe502687edc29209e290094e9bcd24ff943c8d801 +lib/codeql/rust/elements/internal/generated/AsmClobberAbi.qll cd5b177210a072df598f83b49b891800f6ea4bdc4064b45e4a0853d7076d4d9a 03bd9e78da06333038a5219c00c5b16d2c7396434e85f2fe76179181adf107dc lib/codeql/rust/elements/internal/generated/AsmConst.qll 26c96fc41f2b517b7756fd602c8b0cd4849c7090013fb3f8a5e290e5eabe80cc f0f1bf3e8ae7e20e1c2ab638428190c58ee242a7d15c480ed9c5f789ce42c9cb lib/codeql/rust/elements/internal/generated/AsmDirSpec.qll 4064e9c98aeebfebf29d013f6280f44548996d6f185b19bf96b1b23384c976b9 2bb0b99d20c0fdd6d54d4a1947a02372b6e4b197fb887ad058290ae97f015953 lib/codeql/rust/elements/internal/generated/AsmExpr.qll afabf734bf93040451cb22d22f71ab9b2abb176bd6e0d862f5cc67d687f84e4c 7e35b3bc93b5e6f6b7259f3261234421eb5778a47192bc0f5e54d062d3bc8dde lib/codeql/rust/elements/internal/generated/AsmLabel.qll 3e97e64f0682709f05464218e0182f64537e08079b0f276738c83eae92c22d25 3ce70364762bc8c0eeb13940406a0613a815a0ae68b24f7e3a1a649a6fe05c89 lib/codeql/rust/elements/internal/generated/AsmOperand.qll a18ddb65ba0de6b61fb73e6a39398a127ccd4180b12fea43398e1e8f3e829ecd 22d2162566bcf18e8bb39eac9c1de0ae563013767ef5efebff6d844cb4038cae lib/codeql/rust/elements/internal/generated/AsmOperandExpr.qll 6ec1db45e8523331d516263476bbda1006251ce137c2cd324d9b6c6fabf358df b6278d4e605fb5422ab1e563649da793bacf28cd587328f9cc36ca57799510d0 -lib/codeql/rust/elements/internal/generated/AsmOperandNamed.qll 61c48af0a277b011cb46ad9e9f3255ae22c943a11aafc8c591cac6444ed3e6d1 448afb29e6582339229f092ff2de6b953c09c10f2353a1f8eb54e5dfa639881f +lib/codeql/rust/elements/internal/generated/AsmOperandNamed.qll d6bfe8314d1e1694c4bb197fbee745a52a5c721997f2b7e72667230b449661c5 9864bfd98d7c52f543af4a36aa7c7530760c67c061fa52be20aa3e5f768cd777 lib/codeql/rust/elements/internal/generated/AsmOption.qll 9aa5df0f677363111b395b3fb09a0882d61c38f97ba811713490f52c851fa8db d863469f626c6e9a6a69faee4216226dd13c62fbf76ba93717d7d12fd95e0c9f -lib/codeql/rust/elements/internal/generated/AsmOptionsList.qll 998234952d4052b1864014456e6db7e775b8016b44d67608b2cbba9a730453de 8fb7cf5343fb317d8cbe6f3ebb22d80749a1131b28a89d189ecb8f99321ed5f0 +lib/codeql/rust/elements/internal/generated/AsmOptionsList.qll 98403f62e88f3c01b466e25e836c5eb90c414d21b22cc3ff50c0aba46d440092 4b60c9d657230a9d7275b4fe8c46a5cf9986036cf7aedf9ee2c3d90051ea6054 lib/codeql/rust/elements/internal/generated/AsmPiece.qll 17f425727781cdda3a2ec59e20a70e7eb14c75298298e7a014316593fb18f1f9 67656da151f466288d5e7f6cd7723ccb4660df81a9414398c00f7a7c97a19163 lib/codeql/rust/elements/internal/generated/AsmRegOperand.qll e1412c7a9135669cb3e07f82dcf2bebc2ea28958d9ffb9520ae48d299344997c d81f18570703c9eb300241bd1900b7969d12d71cec0a3ce55c33f7d586600c24 lib/codeql/rust/elements/internal/generated/AsmRegSpec.qll 73a24744f62dd6dfa28a0978087828f009fb0619762798f5e0965003fff1e8ec fdb8fd2f89b64086a2ca873c683c02a68d088bb01007d534617d0b7f67fde2cb @@ -514,6 +532,7 @@ lib/codeql/rust/elements/internal/generated/ConstBlockPat.qll 7526d83ee9565d7477 lib/codeql/rust/elements/internal/generated/ConstParam.qll 2e24198f636e4932c79f28c324f395ae5f61f713795ed4543e920913898e2815 5abe6d3df395c679c28a7720479bad455c53bc5ade9133f1ff113ea54dc66c11 lib/codeql/rust/elements/internal/generated/ContinueExpr.qll e2010feb14fb6edeb83a991d9357e50edb770172ddfde2e8670b0d3e68169f28 48d09d661e1443002f6d22b8710e22c9c36d9daa9cde09c6366a61e960d717cb lib/codeql/rust/elements/internal/generated/Crate.qll 37f3760d7c0c1c3ca809d07daf7215a8eae6053eda05e88ed7db6e07f4db0781 649a3d7cd7ee99f95f8a4d3d3c41ea2fa848ce7d8415ccbac62977dfc9a49d35 +lib/codeql/rust/elements/internal/generated/DerefPat.qll b89471bfecec9c34f3a54f8f46ffec185481101d20d9f9eae96470537be40014 3a32b1d25d9715ba4fc22215552975176541cc7c10a23ec023491cec0053f7d6 lib/codeql/rust/elements/internal/generated/DynTraitTypeRepr.qll b2e0e728b6708923b862d9d8d6104d13f572da17e393ec1485b8465e4bfdc206 4a87ea9669c55c4905ce4e781b680f674989591b0cb56af1e9fa1058c13300b3 lib/codeql/rust/elements/internal/generated/Element.qll d56d22c060fa929464f837b1e16475a4a2a2e42d68235a014f7369bcb48431db 0e48426ca72179f675ac29aa49bbaadb8b1d27b08ad5cbc72ec5a005c291848e lib/codeql/rust/elements/internal/generated/Enum.qll 3ed69005ab7cf68745a67cc9891bd68a83f6ab927febf077de9e4092cb373b0b 604fd03d1c46884b3c93e5bff3951ec41593320e1f7382c1a7143a64063827bc @@ -531,8 +550,7 @@ lib/codeql/rust/elements/internal/generated/ForBinder.qll 7be6b8e3934db8cd4ac326 lib/codeql/rust/elements/internal/generated/ForExpr.qll 7c497d2c612fd175069037d6d7ff9339e8aec63259757bb56269e9ca8b0114ea dc48c0ad3945868d6bd5e41ca34a41f8ee74d8ba0adc62b440256f59c7f21096 lib/codeql/rust/elements/internal/generated/ForTypeRepr.qll 7daa3b938592b590d604203e7d0fc5c34c2bffe6adcceee5a5e0c681ed16214c f1380179cbdc188ad133c946d9e17e85aed0d77771b319f663d8eada0f7cf17d lib/codeql/rust/elements/internal/generated/Format.qll 934351f8a8ffd914cc3fd88aca8e81bf646236fe34d15e0df7aeeb0b942b203f da9f146e6f52bafd67dcfd3b916692cf8f66031e0b1d5d17fc8dda5eefb99ca0 -lib/codeql/rust/elements/internal/generated/FormatArgsArg.qll e12e470cfe23da78cb82258f7e1e9e263fd11a8ff6b9a31facf130264e1d2f86 31e8419530cff1811937ad24558aa2feaa5198df5eeb9e16b4197e8ce4efdce2 -lib/codeql/rust/elements/internal/generated/FormatArgsArgName.qll 7720d5a024c6487604952bb6a1925fd473d35d959079791acbdd98e5cd1de11e b7b4fa8121aa1f75f9467fb91e87b2a5ced1b1ce65ebe07249b78945433ea3a3 +lib/codeql/rust/elements/internal/generated/FormatArgsArg.qll c762a4af8609472e285dd1b1aec8251421aec49f8d0e5ce9df2cc5e2722326f8 c8c226b94b32447634b445c62bd9af7e11b93a706f8fa35d2de4fda3ce951926 lib/codeql/rust/elements/internal/generated/FormatArgsExpr.qll 8aed8715a27d3af3de56ded4610c6792a25216b1544eb7e57c8b0b37c14bd9c1 590a2b0063d2ecd00bbbd1ce29603c8fd69972e34e6daddf309c915ce4ec1375 lib/codeql/rust/elements/internal/generated/FormatArgument.qll cd05153276e63e689c95d5537fbc7d892615f62e110323759ef02e23a7587407 be2a4531b498f01625effa4c631d51ee8857698b00cfb829074120a0f2696d57 lib/codeql/rust/elements/internal/generated/FormatTemplateVariableAccess.qll a6175214fad445df9234b3ee9bf5147da75baf82473fb8d384b455e3add0dac1 a928db0ff126b2e54a18f5c488232abd1bd6c5eda24591d3c3bb80c6ee71c770 @@ -544,7 +562,9 @@ lib/codeql/rust/elements/internal/generated/GenericParamList.qll b18fa5fd435d948 lib/codeql/rust/elements/internal/generated/IdentPat.qll 1fe5061759848fdc9588b27606efb1187ce9c13d12ad0a2a19666d250dd62db3 87dbc8b88c31079076a896b48e0c483a600d7d11c1c4bf266581bdfc9c93ae98 lib/codeql/rust/elements/internal/generated/IfExpr.qll 413dd7a20c6b98c0d2ad2e5b50981c14bf96c1a719ace3e341d78926219a5af7 c9a2d44e3baa6a265a29a683ca3c1683352457987c92f599c5771b4f3b4bafff lib/codeql/rust/elements/internal/generated/Impl.qll bdc3da08b23ab098e92927a57c2e99eeb78ea8561cf11accc51db3033492b500 4b45be6b0c51f03999619705104574d78c262ed2497921f2ca8696844b17addc +lib/codeql/rust/elements/internal/generated/ImplRestriction.qll 3d0e014870ba95901bcfe5f0c2c8924b3cd10d14d5d779e98979a701ea6b9f75 bf627444b90d26b5e08c7414e87971dee38cbef1c4058101972e9eb24d4a742f lib/codeql/rust/elements/internal/generated/ImplTraitTypeRepr.qll e376a2e34ba51df403d42b02afe25140543e3e53aaf04b9ea118eb575acb4644 dc3a7e3eac758423c90a9803cc40dfdf53818bd62ee894982cd636f6b1596dfc +lib/codeql/rust/elements/internal/generated/IncludeBytesExpr.qll 7665795afaa2511874927a1a5a64a78f1d25f05e2948e61b518af52becebc479 3b419e4042d2c9110a51c2559186401d6b661d009a35323499b4ae1a50e60b77 lib/codeql/rust/elements/internal/generated/IndexExpr.qll cf951fc40f6690e966b4dc78fa9a6221aa5c6cade44759dcb52254f799292d11 1572e71918cc4e0b7e028331b6d98c9db23100a3646cd3874d1915e06ab6211d lib/codeql/rust/elements/internal/generated/InferTypeRepr.qll 4f101c1cb1278e919f9195cac4aa0c768e304c1881394b500874e7627e62d6c4 dca3f85d0a78ecc8bf030b4324f0d219ffff60784a2ecf565a4257e888dea0ff lib/codeql/rust/elements/internal/generated/Item.qll 03077c9d2f3200ebbc5df5d31f7d9b78a3ae25957ac46899a19a93684b2d7306 6492e341b9d9270c0181da0a5330f588238ced81657041ad1ad343db2bdf210b @@ -578,10 +598,12 @@ lib/codeql/rust/elements/internal/generated/Meta.qll 5c3358c737d504dacfa3227b80c lib/codeql/rust/elements/internal/generated/MethodCallExpr.qll ffce98a6a1921822b12ead721cff0878553eb3e049c5d2184a7abce32b6615b4 d1408a0f47ee5764fe7b484494daf6e1f99b1c6a505274c48545b3e650ef8baf lib/codeql/rust/elements/internal/generated/Missing.qll 16735d91df04a4e1ae52fae25db5f59a044e540755734bbab46b5fbb0fe6b0bd 28ca4e49fb7e6b4734be2f2f69e7c224c570344cc160ef80c5a5cd413e750dad lib/codeql/rust/elements/internal/generated/Module.qll ebae5d8963c9fd569c0fbad1d7770abd3fd2479437f236cbce0505ba9f9af52c fa3c382115fed18a26f1a755d8749a201b9489f82c09448a88fb8e9e1435fe5f +lib/codeql/rust/elements/internal/generated/MutRestriction.qll 986cd8e933d5423b05ad7c2d5bd60363d57acc1fb7620444d5af102557bdea68 06423e70c0aaa492f1503a4a455bec60ec52a8e76c08b799ce2caa2737a68d1b lib/codeql/rust/elements/internal/generated/Name.qll e6bd6240a051383a52b21ab539bc204ce7bcd51a1a4379e497dff008d4eef5b4 578a3b45e70f519d57b3e3a3450f6272716c849940daee49889717c7aaa85fc9 lib/codeql/rust/elements/internal/generated/NameRef.qll 090c15ed6c44fc4f1a7236215f42e16921912d3030119ac22bc7ffe2dcdb4ba8 b61cc486e6764272c4e8377523bf043d0beae4926606dbcb48f8205c6a0b9a90 lib/codeql/rust/elements/internal/generated/NamedCrate.qll e190dd742751ea2de914d0750c93fcad3100d3ebb4e3f47f6adc0a7fa3e7932c 755ead62328df8a4496dc4ad6fea7243ab6144138ed62d7368fa53737eef5819 lib/codeql/rust/elements/internal/generated/NeverTypeRepr.qll 4f13c6e850814a4759fdb5fca83a50e4094c27edee4d2e74fe209b10d8fb01c3 231f39610e56f68f48c70ca8a17a6f447458e83218e529fff147ed039516a2f7 +lib/codeql/rust/elements/internal/generated/NotNull.qll a06054ff046c8d43a5e84fe5db8679ccf0c478971c484ea3fc554465e35474f8 a0aaf8817217fbdb0c748fcacb0bdd40b78822b522570d61c52ed296d61b6610 lib/codeql/rust/elements/internal/generated/OffsetOfExpr.qll c86eecd11345a807571542e220ced8ccc8bb78f81de61fff6fc6b23ff379cd12 76a692d3ad5e26751e574c7d9b13cf698d471e1783f53a312e808c0b21a110ab lib/codeql/rust/elements/internal/generated/OrPat.qll 0dc6bd6ada8d11b7f708f71c8208fc2c28629e9c265c3df3c2dc9bea30de5afa 892119fc1de2e3315489203c56ee3ed3df8b9806e927ee58aa6083e5b2156dab lib/codeql/rust/elements/internal/generated/Param.qll 19f03396897c1b7b494df2d0e9677c1a2fc6d4ae190e64e5be51145aba9de2e2 3d63116e70457226ea7488a9f6ed9c7cea3233b0e5cab443db9566c17b125e80 @@ -590,7 +612,7 @@ lib/codeql/rust/elements/internal/generated/ParamList.qll eaa0cd4402d3665013d47e lib/codeql/rust/elements/internal/generated/ParenExpr.qll 812d2ff65079277f39f15c084657a955a960a7c1c0e96dd60472a58d56b945eb eb8c607f43e1fcbb41f37a10de203a1db806690e10ff4f04d48ed874189cb0eb lib/codeql/rust/elements/internal/generated/ParenPat.qll 24f9dc7fce75827d6fddb856cd48f80168143151b27295c0bab6db5a06567a09 ebadbc6f5498e9ed754b39893ce0763840409a0721036a25b56e1ead7dcc09aa lib/codeql/rust/elements/internal/generated/ParenTypeRepr.qll 03f5c5b96a37adeb845352d7fcea3e098da9050e534972d14ac0f70d60a2d776 ed3d6e5d02086523087adebce4e89e35461eb95f2a66d1d4100fe23fc691b126 -lib/codeql/rust/elements/internal/generated/ParentChild.qll 824b272f2fa77353b0d67ea66b13292dd14091f1a68411bb4be506dcbad0226a b9d7fac552163dd522b5a0ff19a11b035134a58f236415db6e3d599c6dbe187e +lib/codeql/rust/elements/internal/generated/ParentChild.qll 491b2adad685733cae41b4e918e850718074a14e0f179b3debbe9424c927a5aa 4e851e1d327156fcad247dae87adc091fd0e2f7ff19c6559612165c16d961beb lib/codeql/rust/elements/internal/generated/ParenthesizedArgList.qll d901fdc8142a5b8847cc98fc2afcfd16428b8ace4fbffb457e761b5fd3901a77 5dbb0aea5a13f937da666ccb042494af8f11e776ade1459d16b70a4dd193f9fb lib/codeql/rust/elements/internal/generated/Pat.qll 3605ac062be2f294ee73336e9669027b8b655f4ad55660e1eab35266275154ee 7f9400db2884d336dd1d21df2a8093759c2a110be9bf6482ce8e80ae0fd74ed4 lib/codeql/rust/elements/internal/generated/Path.qll 9b12afb46fc5a9ad3a811b05472621bbecccb900c47504feb7f29d96b28421ca bcacbffc36fb3e0c9b26523b5963af0ffa9fd6b19f00a2a31bdb2316071546bd @@ -601,12 +623,13 @@ lib/codeql/rust/elements/internal/generated/PathMeta.qll 42cf084a78acb656a86a6a9 lib/codeql/rust/elements/internal/generated/PathPat.qll 003d10a4d18681da67c7b20fcb16b15047cf9cc4b1723e7674ef74e40589cc5a 955e66f6d317ca5562ad1b5b13e1cd230c29e2538b8e86f072795b0fdd8a1c66 lib/codeql/rust/elements/internal/generated/PathSegment.qll 48b452229b644ea323460cd44e258d3ea8482b3e8b4cb14c3b1df581da004fa8 2025badcfab385756009a499e08eecc8ffd7fa590cd2b777adb283eebcc432c6 lib/codeql/rust/elements/internal/generated/PathTypeRepr.qll f12fe234d7fb1a12678b524434fcdd801453d90eb778b9173f7197ff3d957557 a1be605f8937c5bd3a3a9cb277782c24446c9f5ef8363e6f5ee8f6229886b6f6 +lib/codeql/rust/elements/internal/generated/PatternTypeRepr.qll c824c634d3f4ee45a810724c727b96e98568079a3e0287ec14d8eebbcecd94ae 4908f373db12ee49ccb604dbc3ad485b6028174010b3e090ba86dd144d09a0b2 lib/codeql/rust/elements/internal/generated/PrefixExpr.qll c9ede5f2deb7b41bc8240969e8554f645057018fe96e7e9ad9c2924c8b14722b 5ae2e3c3dc8fa73e7026ef6534185afa6b0b5051804435d8b741dd3640c864e1 lib/codeql/rust/elements/internal/generated/PtrTypeRepr.qll 8d0ea4f6c7f8203340bf4b91ecedad3ed217a65d8be48d498f2e12da7687a6d0 6f74182fd3fe8099af31b55edeaacc0c54637d0a29736f15d2cd58d11d3de260 lib/codeql/rust/elements/internal/generated/PureSynthConstructors.qll e5b8e69519012bbaae29dcb82d53f7f7ecce368c0358ec27ef6180b228a0057f e5b8e69519012bbaae29dcb82d53f7f7ecce368c0358ec27ef6180b228a0057f lib/codeql/rust/elements/internal/generated/RangeExpr.qll 23cca03bf43535f33b22a38894f70d669787be4e4f5b8fe5c8f7b964d30e9027 18624cef6c6b679eeace2a98737e472432e0ead354cca02192b4d45330f047c9 lib/codeql/rust/elements/internal/generated/RangePat.qll 80826a6a6868a803aa2372e31c52a03e1811a3f1f2abdb469f91ca0bfdd9ecb6 34ee1e208c1690cba505dff2c588837c0cd91e185e2a87d1fe673191962276a9 -lib/codeql/rust/elements/internal/generated/Raw.qll 7efb0d7eed991188cb4cc4e22f87cf00df623ffb44dd161c6bfbd79ae3af8bc6 8c010280303cc356f3cc66789796a693e0a1ea8401cbbcc4f0c676b825b21060 +lib/codeql/rust/elements/internal/generated/Raw.qll 4eec730c527a0217ccaae7b909c29dea87621e6c2d84455c906160be4567b00b a61aa6ffcdc8cfa01391c132e9d06e646b384137cdca40da06e22af24b4422ab lib/codeql/rust/elements/internal/generated/RefExpr.qll 7d995884e3dc1c25fc719f5d7253179344d63650e217e9ff6530285fe7a57f64 f2c3c12551deea4964b66553fb9b6423ee16fec53bd63db4796191aa60dc6c66 lib/codeql/rust/elements/internal/generated/RefPat.qll 456ede39837463ee22a630ec7ab6c8630d3664a8ea206fcc6e4f199e92fa564c 5622062765f32930465ba6b170e986706f159f6070f48adee3c20e24e8df4e05 lib/codeql/rust/elements/internal/generated/RefTypeRepr.qll 5b0663a6d234572fb3e467e276d019415caa95ef006438cc59b7af4e1783161e 0e27c8a8f0e323c0e4d6db01fca821bf07c0864d293cdf96fa891b10820c1e4b @@ -626,21 +649,21 @@ lib/codeql/rust/elements/internal/generated/Struct.qll 56775b98f793c108bd0eb8f35 lib/codeql/rust/elements/internal/generated/StructExpr.qll e77702890561102af38f52d836729e82569c964f8d4c7e680b27992c1ff0f141 23dc51f68107ab0e5c9dd88a6bcc85bb66e8e0f4064cb4d416f50f2ba5db698c lib/codeql/rust/elements/internal/generated/StructExprField.qll 6bdc52ed325fd014495410c619536079b8c404e2247bd2435aa7685dd56c3833 501a30650cf813176ff325a1553da6030f78d14be3f84fea6d38032f4262c6b0 lib/codeql/rust/elements/internal/generated/StructExprFieldList.qll 298d33442d1054922d2f97133a436ee559f1f35b7708523284d1f7eee7ebf443 7febe38a79fadf3dcb53fb8f8caf4c2780f5df55a1f8336269c7b674d53c6272 -lib/codeql/rust/elements/internal/generated/StructField.qll 23c5a0b26936582f43b8bb567825257aab29ee8a3d4ff646ca1dff2e3063bf41 163c446ae52519fd77c1108719e014c41caad205b303848782c45fa50b37b254 +lib/codeql/rust/elements/internal/generated/StructField.qll cdb78ca654a459204a8f471f8e1a79a08186db93177289ab6dd4a8864fb88cf3 d0ddbe4e9e570721796379b7e090bec6301f50b0ed26de06ff1f7a4e1a9eb70f lib/codeql/rust/elements/internal/generated/StructFieldList.qll 5da528a51a6a5db9d245772aec462d1767bcc7341e5bedd1dc1bbedd3e4ab920 dac4cee3280eef1136ffc7fbc11b84b754eb6290fc159c6397a39ae91ceeaa13 lib/codeql/rust/elements/internal/generated/StructPat.qll c76fa005c2fd0448a8803233e1e8818c4123301eb66ac5cf69d0b9eaafc61e98 6e0dffccdce24bca20e87d5ba0f0995c9a1ae8983283e71e7dbfcf6fffc67a58 lib/codeql/rust/elements/internal/generated/StructPatField.qll 5b5c7302dbc4a902ca8e69ff31875c867e295a16a626ba3cef29cd0aa248f179 4e192a0df79947f5cb0d47fdbbba7986137a6a40a1be92ae119873e2fad67edf lib/codeql/rust/elements/internal/generated/StructPatFieldList.qll 1a95a1bd9f64fb18e9571657cf2d02a8b13c747048a1f0f74baf31b91f0392ad fc274e414ff4ed54386046505920de92755ad0b4d39a7523cdffa4830bd53b37 -lib/codeql/rust/elements/internal/generated/Synth.qll f3914d3d346fe9dad959b7c7fa88a791860284c848aaa339b800e521195dde08 87a338c138bc8322ddc34b7a265232be294cf7b0a07944b478b8ee9531841e6a -lib/codeql/rust/elements/internal/generated/SynthConstructors.qll aea619227c640e27d715bf57c00bfde840a31d28addc8baee3b38aeb16bdf721 aea619227c640e27d715bf57c00bfde840a31d28addc8baee3b38aeb16bdf721 +lib/codeql/rust/elements/internal/generated/Synth.qll c753ec12f68833536dfcc467357f6bb6e0b039d2ab50683a4669432cbe20cbb2 e83329642325e05574ce4e82e3fc68e1a39b23f02f19a4cd972ca195f861f7eb +lib/codeql/rust/elements/internal/generated/SynthConstructors.qll d8c1962dcb7c6ecfdb15671c34bbb30a139bae017fd3b3186b7df41d02060f7e d8c1962dcb7c6ecfdb15671c34bbb30a139bae017fd3b3186b7df41d02060f7e lib/codeql/rust/elements/internal/generated/Token.qll 77a91a25ca5669703cf3a4353b591cef4d72caa6b0b9db07bb9e005d69c848d1 2fdffc4882ed3a6ca9ac6d1fb5f1ac5a471ca703e2ffdc642885fa558d6e373b lib/codeql/rust/elements/internal/generated/TokenTree.qll 1a3c4f5f30659738641abdd28cb793dab3cfde484196b59656fc0a2767e53511 de2ebb210c7759ef7a6f7ee9f805e1cac879221287281775fc80ba34a5492edf lib/codeql/rust/elements/internal/generated/TokenTreeMeta.qll 6952cd186e38c4a41131f93754010c8af3c210324d5a8ce3831694aa6be9f2aa 7a23c380fc8aa02c53370e0c68536a7e9fed8aad58185cb0f6110093c3067543 -lib/codeql/rust/elements/internal/generated/Trait.qll 8fa41b50fa0f68333534f2b66bb4ec8e103ff09ac8fa5c2cc64bc04beafec205 ce1c9aa6d0e2f05d28aab8e1165c3b9fb8e24681ade0cf6a9df2e8617abeae7e +lib/codeql/rust/elements/internal/generated/Trait.qll 762d4a2aa0ca2b1384b598201e2964287fce1c0de5475cf493e52de3267a6c55 affd77f6a84c9589c18ae3e3a0e51778e4e9d247f2b9b34761ba7e12502a14b1 lib/codeql/rust/elements/internal/generated/TryBlockModifier.qll 812cc73a945abaa51054e7261daf4dc10912f1e331f202186001ed087a962696 a76457699f3f6bc1373276a0de2f14365e573d34e82fd292c6c9261612c0f17e lib/codeql/rust/elements/internal/generated/TryExpr.qll 73052d7d309427a30019ad962ee332d22e7e48b9cc98ee60261ca2df2f433f93 d9dd70bf69eaa22475acd78bea504341e3574742a51ad9118566f39038a02d85 lib/codeql/rust/elements/internal/generated/TupleExpr.qll 98f10bc72d09f98e3be87f41b1a3cbf037f4a7e3d3560dfa6d5759905a8177a5 6a9eb5568c518876b2912371e2b7b774cf5245097c5a0206eda35b749995f00b -lib/codeql/rust/elements/internal/generated/TupleField.qll 121f7b35e28b86592f83e00993f9041acbe7ab636db894d03055149c7f15fd32 b1ba9e1182307a44bb5afc11e92d62e7eb2c819ccdfb28ef54943b6fec676827 +lib/codeql/rust/elements/internal/generated/TupleField.qll b23d90aa02d687d8a2f498fc30d6156f277a08261ae7f790c5ceda059604140c f1f5c7f28334dbd718ae6de27414e01b501dbba0d87c99041cf092a44da243dd lib/codeql/rust/elements/internal/generated/TupleFieldList.qll e7874518ce353f58312b02fb646f19eb109b3d868f8b550c84b7d6fc3a85fd5a f4bff793bbdbc252688296953116146f5c9a0894e14a7d3e4883a5ac211c122f lib/codeql/rust/elements/internal/generated/TuplePat.qll 4e13b509e1c9dd1581a9dc50d38e0a6e36abc1254ea9c732b5b3e6503335afeb 298028df9eb84e106e625ed09d6b20038ad47bfc2faf634a0ffea50b17b5805d lib/codeql/rust/elements/internal/generated/TupleStructPat.qll 6539d0edbdc16e7df849514d51980d4cd1a2c9cbb58ca9e5273851f96df4eb36 45a13bae5220d5737cbd04713a17af5b33d8bb4cfdf17ddd64b298ab0c1eea24 @@ -664,28 +687,29 @@ lib/codeql/rust/elements/internal/generated/UseTree.qll 3d7cbcc8ae76068b8f660c7d lib/codeql/rust/elements/internal/generated/UseTreeList.qll 38efaa569b76ca79be047703279388e8f64583a126b98078fbbb6586e0c6eb56 1623a50fd2d3b1e4b85323ad73dd655172f7cbc658d3506aaa6b409e9ebe576e lib/codeql/rust/elements/internal/generated/Variant.qll 7a1aedf6518780d1534147d5a52d14542698befe1d8eb8b78eb10d2664c3a69b 180d6de0826b1a75bf8b1853d539f605bff2eb3794ccb57ff23e5b3ee3171956 lib/codeql/rust/elements/internal/generated/VariantList.qll 3f70bfde982e5c5e8ee45da6ebe149286214f8d40377d5bc5e25df6ae8f3e2d1 22e5f428bf64fd3fd21c537bfa69a46089aad7c363d72c6566474fbe1d75859e -lib/codeql/rust/elements/internal/generated/Visibility.qll af1069733c0120fae8610b3ebbcdcebe4b4c9ce4c3e3d9be3f82a93541873625 266106bdff4d7041d017871d755c011e7dd396c5999803d9e46725b6a03a2458 +lib/codeql/rust/elements/internal/generated/Visibility.qll c6c3099cb563c010e18012772c57bea636967e30f0f90b026f744441fb4c9263 f0db2927498fd5900eedacaaec5f3f538829c1f46306b593ff95699fa6535f68 +lib/codeql/rust/elements/internal/generated/VisibilityInner.qll 1328f5cf2c07798f645b2aa74c3348de321ae9a9c7062f03314e5192e307d8e2 e4132b9ca116513b7f6491c6d8fce516651fc3e268d49efb1d8ce3f0a8a770d9 lib/codeql/rust/elements/internal/generated/WhereClause.qll aec72d358689d99741c769b6e8e72b92c1458138c097ec2380e917aa68119ff0 81bb9d303bc0c8d2513dc7a2b8802ec15345b364e6c1e8b300f7860aac219c36 lib/codeql/rust/elements/internal/generated/WherePred.qll 73b28efc1682bf527bdc97a07568d08666d61686940400c99095cb9593bc8df3 2ec1fb5577d033c120d31f1620753b3618fcb7f384a35a6d3e6b5e0bb375a8a5 lib/codeql/rust/elements/internal/generated/WhileExpr.qll 0353aab87c49569e1fbf5828b8f44457230edfa6b408fb5ec70e3d9b70f2e277 e1ba7c9c41ff150b9aaa43642c0714def4407850f2149232260c1a2672dd574a lib/codeql/rust/elements/internal/generated/WildcardPat.qll d74b70b57a0a66bfae017a329352a5b27a6b9e73dd5521d627f680e810c6c59e 4b913b548ba27ff3c82fcd32cf996ff329cb57d176d3bebd0fcef394486ea499 lib/codeql/rust/elements/internal/generated/YeetExpr.qll cac328200872a35337b4bcb15c851afb4743f82c080f9738d295571eb01d7392 94af734eea08129b587fed849b643e7572800e8330c0b57d727d41abda47930b lib/codeql/rust/elements/internal/generated/YieldExpr.qll 37e5f0c1e373a22bbc53d8b7f2c0e1f476e5be5080b8437c5e964f4e83fad79a 4a9a68643401637bf48e5c2b2f74a6bf0ddcb4ff76f6bffb61d436b685621e85 -lib/codeql/rust/elements.qll 55ccf59deeb718517703e2aa9e90452736de118032d3bdad4b4ab7295cbb795a 55ccf59deeb718517703e2aa9e90452736de118032d3bdad4b4ab7295cbb795a +lib/codeql/rust/elements.qll e5ae502dca38c314eb5681d8b80b837cb1b09e59f1ffcccbe1b377658418e496 e5ae502dca38c314eb5681d8b80b837cb1b09e59f1ffcccbe1b377658418e496 test/extractor-tests/generated/Abi/Abi.ql 086ed104ab1a7e7fe5c1ed29e03f1719a797c7096c738868bf6ebe872ab8fdaa fe23fe67ab0d9201e1177ea3f844b18ed428e13e3ce77381bf2b6910adfa3a0e test/extractor-tests/generated/ArgList/ArgList.ql da97b5b25418b2aa8cb8df793f48870c89fa00759cdade8ddba60d7f1f4bbc01 acfd5d2caf67282ad2d57b961068472100482d0f770a52a3c00214c647d18c75 test/extractor-tests/generated/ArrayListExpr/ArrayListExpr.ql 42b365276aa43e2cad588338463542d3ce1dd0db3a428621554584b07a1431d5 08a66a8b69af35ee3bc64c35c453a19a6c9881cc6cc7e65275d1fff056121270 test/extractor-tests/generated/ArrayRepeatExpr/ArrayRepeatExpr.ql 339629d69e2d7db153e2c738d70d2df33f395ae2377f07eb247132ede87b9899 07e0611667c09456241aabf80dc420fe1f5c13b1bce324da92e6b18d250c3896 test/extractor-tests/generated/ArrayTypeRepr/ArrayTypeRepr.ql b262300235ab5bf4fe7712c0208390c7e876413a37a433340fbc078318233e83 68cfb18e8fb73b53cf8a8e73e8bf5e7ba11f32ca6b4695a64ebab51ac7d58d1b -test/extractor-tests/generated/AsmClobberAbi/AsmClobberAbi.ql adfcfcdc6ac2a9a4849ea592e37da4221b6279cf2ea1112d32b6c89fda33e85e 7438490536e27b7173dec731f6925531a0e3fa839639c97a53905ba72d7efbe5 +test/extractor-tests/generated/AsmClobberAbi/AsmClobberAbi.ql 11cfb43272f04e757366f6095713857db802d8bba66a81186de9885dfbfc21e9 28fc0627dcb66ac621b78532b8f092e5be7c9f7cea7b26aea25f0360e0dfc1e3 test/extractor-tests/generated/AsmConst/AsmConst.ql 82f322fc8a01f4ccc86b3ecca86a9515313120764c6a3ac00b968e4441625422 62831f204c5c2d0f155152c661f9b5d4a4b685df6e40693106fbef0379378981 test/extractor-tests/generated/AsmDirSpec/AsmDirSpec.ql 518a739c91481f67b27bfd1989d9dcbada12de54901eb6d598c896cd72f1f5fe 4567661eecf475fb05e13749b9250bcec51056b6db5a6ae7df24b7ba5cfb88c2 test/extractor-tests/generated/AsmExpr/AsmExpr.ql 817faad3ea0b9da9a12026a8cfd91a0363595ce594fc5bc6ac43b112f911b2cd f0d5866dec3474f13fc85686aeb63e2fa8079b8f2774f0185959be00314eff87 test/extractor-tests/generated/AsmLabel/AsmLabel.ql 130bf49dc1f5ae79e3588415b9a4c25dfdcbcac1884db9b2fb802a68e33180e5 c087e47d8953d312488fcc0b1bcbfca02521e3683e2063eaf380d76399bca037 test/extractor-tests/generated/AsmOperandExpr/AsmOperandExpr.ql e866fd4715e78511352bb286c1120cbd52c4d960664d57dd99f0380eb1db7109 081d6a6267a3e251a123099b4c1e7d3c5a3b56e0efe9db7c7db24db1c08b7e0d -test/extractor-tests/generated/AsmOperandNamed/AsmOperandNamed.ql fb1eb1f275ad251ba2e0876cf1d097bb33f20d06b0e50f8c01f7c11c71057688 e308567ffd18671cf172853a5c594f0f211d492c7e2fb58be412703d1b342b41 +test/extractor-tests/generated/AsmOperandNamed/AsmOperandNamed.ql b93707b7993b75fd0305fb7e09d6c49ebdd088675a85db8697f0a2248e996194 1da85511e7325cabc66aee7a3de5eab9f1d7a146023de6efa77855356e700ff1 test/extractor-tests/generated/AsmOption/AsmOption.ql d613c40391f4985414cc3541f900b6e3f5f9ef157d2bfb96a773710af4b059ed 8450ef57a5a891db514e8340151d161e515b59ae7b963fd5eebf3bf862eaff08 -test/extractor-tests/generated/AsmOptionsList/AsmOptionsList.ql e0e76f1d6e454c60db632baabd29642f315c4bf9284bab9ff8368604df15e77a 8450851f062232e7ea92845f406287f945c16e1e1a69a3189773e6e86df8a64f +test/extractor-tests/generated/AsmOptionsList/AsmOptionsList.ql 43561fdd414a84b419f86d919db557952b4155e943f6fdf8f99e63ccad2a4dcf 67a6ca4403c970a134aabe6ed12d27d4766670d55d7c59dbde38c513f559ecd4 test/extractor-tests/generated/AsmRegOperand/AsmRegOperand.ql 4ad6aa224e980602aaa77a601bda1065b1814249d889b54eda4da99dfcb53a8c b2503095957c7e3cdd345e8ccc594aa0f7590954e64a831660aed9a515f74d80 test/extractor-tests/generated/AsmRegSpec/AsmRegSpec.ql 3ae5068254b83bc4663230d2d21f16e189d213acbb4f25924819288b433d4a7c eea94d02b9bccb20d9ac9627667b84eeb486b5976b1b37fa0b94767c83c44a3e test/extractor-tests/generated/AsmSym/AsmSym.ql b3dadbd288d92dad7517f7997aa3e5974f807a30793486d174bfa9cc67128fc3 4f82ca31ef7e5a7d9a86567516a257a212ecca911c02d9a67de792ae66960def @@ -711,6 +735,7 @@ test/extractor-tests/generated/ConstBlockPat/ConstBlockPat.ql e2198f9ef913f7ecb9 test/extractor-tests/generated/ConstParam/ConstParam.ql 6facb2402e1cbf23d836f619ef68e2d8496b3c0c438e71266de24d8690852468 211ed6f7384f86d849f559410b2ac09da3df278bdeea9e77c4d9c26a727a6990 test/extractor-tests/generated/ContinueExpr/ContinueExpr.ql 58b5046a4da06a4cd2d942720603313126888b2249b218bef6f7c44ca469ccfa eeb84a04deb4c4496b7f9b38798cc7fdc179a486c8beaa0b33bf87e7f9482b1a test/extractor-tests/generated/Crate/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 +test/extractor-tests/generated/DerefPat/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 test/extractor-tests/generated/DynTraitTypeRepr/DynTraitTypeRepr.ql ff54195d2e09424faaac4e145a40208bf0e57acc57dfa8247b3751862a317c4b 583d5b98aa31a9af6ad73df000ca529f57f67aa6daaa50ca5673a56eb57bf507 test/extractor-tests/generated/Enum/Enum.ql 9a612c818952e867e2665d8c919905d563bb76191f3f522370c7344863589205 c32cf1973082f5d519e3eb04fca0309b3dd9637cf34e58c10a8e34cd9fe36d2d test/extractor-tests/generated/ExprStmt/ExprStmt.ql 7c62a97f7f910ae6e0e9aff7fdd78b369d21257ccab52afe6307ddea2e15dad1 2d32a366c4acbea3136ff1f9f9dadf76b148f82ad1d7170f02efd977d8a07ae9 @@ -722,9 +747,8 @@ test/extractor-tests/generated/FnPtrTypeRepr/FnPtrTypeRepr.ql 1501730f1e02e9d22b test/extractor-tests/generated/ForBinder/ForBinder.ql c95fd006eaddb9535eda0d527d71cdd5d3745fe464fd809a8d58b8c4dfc8790e 1d8b38059b8a25965eab9a8a1286384aa994d7cac7414b70b63c6a3d6bcf3c39 test/extractor-tests/generated/ForExpr/ForExpr.ql 3bac38bf33e140ae9f88371ec90409f7de867e39cdea46f02b15519b236b57cb aade1baf6e6081b3b9bce5b7e95fe4b7ffe00ea9450fd6e1d6692ad97cf93fe9 test/extractor-tests/generated/ForTypeRepr/ForTypeRepr.ql 5961055988b3a7749fb80e24d924bf1b67b0c52a6c895379beedd66a34bad04f d8ab72fac742314ead1aa0e1fed2535cc6597d278f3eef017bc9f8fd8cde83e7 -test/extractor-tests/generated/FormatArgsArgName/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 test/extractor-tests/generated/FormatArgsExpr/Format.ql 237ed2e01d9a75ee8521d6578333a7b1d566f09ef2102c4efcbb34ea58f2f9e8 09007ce4de701c0d1c0967f4f728ea9e627d9db19431bd9caebbf28ee51a1f36 -test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg.ql 30e57945c51bfde4c0cf69e404741548c899450e5dd6622b8caabd1394b10eaf d6d38db1e2ea20ce5f0cd858817fe306397a9ba50eb9be08e132eaf897cb5592 +test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg.ql 5abcb565dcd2822e2ea142d19b8c92194ee17c71c3db7595248690034559d174 1ffa743fc678701ffeefff6c14c1414bb9158e6756f32380dd590ff44b19ca5a test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr.ql 243c2f9d830f1eae915749e81ac78d3c140280385b0002d10fcc4d2feaf14711 72b90a99a8b1c16baf1e254e1e3463c3ce5409624a2a90829122717d4e5a2b74 test/extractor-tests/generated/FormatArgsExpr/FormatArgument.ql 0a345eb48dba8e535d12a00e88008e71b3ce692fbf8f9686c8885e158635dffe eab1f230fd572474a3f304f97d05bbf4a004c52773aaf2d34f999192244c0b80 test/extractor-tests/generated/FormatArgsExpr/FormatTemplateVariableAccess.ql 24108cdc54feb77c24bb7894744e36e374f0c03d46d6e6c3fcb2012b1ad117f6 05a6b6f51029ee1a15039aa9d738bb1fd7145148f1aad790198fba832572c719 @@ -734,7 +758,9 @@ test/extractor-tests/generated/GenericParamList/GenericParamList.ql 206f270690f5 test/extractor-tests/generated/IdentPat/IdentPat.ql 23006eddf0ca1188e11ba5ee25ad62a83157b83e0b99119bf924c7f74fd8e70d 6e572f48f607f0ced309113304019ccc0a828f6ddd71e818369504dcf832a0b5 test/extractor-tests/generated/IfExpr/IfExpr.ql 540b21838ad3e1ed879b66c1903eb8517d280f99babcbf3c5307c278db42f003 a6f84a7588ce7587936f24375518a365c571210844b99cb614596e14dd5e4dfd test/extractor-tests/generated/Impl/Impl.ql c96ec30d703aa607b7aad9f6eaca1b0069799cdefcc1481f4aa4f7378f477f7f 3528e1502b6f7b323d964630ecfb8255f683486b75300457e2a2d95aa36771f3 +test/extractor-tests/generated/ImplRestriction/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 test/extractor-tests/generated/ImplTraitTypeRepr/ImplTraitTypeRepr.ql 311c6c1e18bd74fbcd367f940d2cf91777eaba6b3d6307149beb529216d086fb 16c7c81618d7f49da30b4f026dcacfb23ed130dbfcfa19b5cb44dc6e15101401 +test/extractor-tests/generated/IncludeBytesExpr/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 test/extractor-tests/generated/IndexExpr/IndexExpr.ql ecfca80175a78b633bf41684a0f8f5eebe0b8a23f8de9ff27142936687711263 27d4832911f7272376a199550d57d8488e75e0eeeeb7abbfb3b135350a30d277 test/extractor-tests/generated/InferTypeRepr/InferTypeRepr.ql 6ba01a9e229e7dfdb2878a0bdbeb6c0888c4a068984b820e7a48d4b84995daa2 7120cafd267e956dbb4af5e19d57237275d334ffe5ff0fb635d65d309381aa46 test/extractor-tests/generated/ItemList/ItemList.ql e29302a9212b07fdaf93618852be30adfac64b292e9a0ddbf63addb803daaa98 7e69a78b0f58ef9344892113799092149024c1352b0965a6326d8a45cd44771a @@ -762,9 +788,11 @@ test/extractor-tests/generated/MatchExpr/MatchExpr.ql b75a5936401bb5ca38686f1413 test/extractor-tests/generated/MatchGuard/MatchGuard.ql 91de18a0a18d120db568b2c329e5cb26f83e327cf22c5825c555ea17249d7d23 0bcdb25895362128517227c860b9dad76851215c2cdf9b2d0e5cc3534278f4ec test/extractor-tests/generated/MethodCallExpr/MethodCallExpr.ql 9d5af6b4771a8725fa5b56ccb3e2a33158b18c876546b88e6dc63da1f887910a 494c8c2fe5584aac45c828b38d8bb20c113927a1e909773d4a2dbd3965d26170 test/extractor-tests/generated/Module/Module.ql d7c442fd1b1f4f00da87e2228fc1aeeab0bb86648b2aa06a9dd6f40dbae1ee28 3229388727d14048e87238bcda5fde1bed503e5cac088922381e5833cfc32fa9 +test/extractor-tests/generated/MutRestriction/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 test/extractor-tests/generated/Name/Name.ql b2fe417f7c816f71d12622b4f84ece74eba3c128c806266a55b53f8120fa4fb3 8bc65bbf3f2909637485f5db7830d6fc110a94c9b12eefe12d7627f41eae2256 test/extractor-tests/generated/NameRef/NameRef.ql 210a70e0957f3444195eed3a3dfbb5806e349238c0b390dc00597e6b8b05fcec d74fbce3c71aa7b08ae4cb646ccb114335767cb4fe000322f9dd371c1bb3784f test/extractor-tests/generated/NeverTypeRepr/NeverTypeRepr.ql 4e73ec96fccb00fe241546ff12c47329a9c67b7ae40a58a5afa39ecb611b84d4 bb716f72db039e0a82de959e390259a82cf99ba4482070602b7b6b42511976e5 +test/extractor-tests/generated/NotNull/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 test/extractor-tests/generated/OffsetOfExpr/OffsetOfExpr.ql 851d84073f4a14cef24ce945a099bc43b22381fc21672ba9ba424623d66d9e0e b3ca3309da0054501dc49f83b9e1b51c155966a14504521565ea980cf1600f55 test/extractor-tests/generated/OrPat/OrPat.ql 8742e1708da0bcc172c8cc637082672c92a136aa50bb2f0ef928387337aefa3e 1901c223502e8cc046c233a10d923226373bad0837264e2b837fd549929020e3 test/extractor-tests/generated/Param/Param.ql de90709cbd61e1852c857ffb6cedd17818464c93bb7bdc92c900ee04f4d2a27c a105ee30716345987989d48c4fa6194c34741fc48528515aeca673662b5259cb @@ -779,6 +807,7 @@ test/extractor-tests/generated/Path/PathPat.ql 8a6a759f4bbf4fa9c23fd235ce4d63f04 test/extractor-tests/generated/Path/PathSegment.ql 87774cc2e9d1be7aaf8748d418b151d7ec03fb20fda9430ebabd86ddaebf5538 699545d8eb2d6325bcd2c253d56339bd71170b34e80efe5155189fbbdde9fbbc test/extractor-tests/generated/Path/PathTypeRepr.ql 32023340cb9aa1fbf52a1a3e330c6f3206e1c64c9dce2f795d9e434aa5a1533b f451de0d4941ab79014d2883b46291f9f05f79d479fcdcab387020ab3ed68703 test/extractor-tests/generated/PathMeta/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 +test/extractor-tests/generated/PatternTypeRepr/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 test/extractor-tests/generated/PrefixExpr/PrefixExpr.ql 63e9dbae0d0b46d5e9d60c313e408c4c7ee1a93c5a26fe4c01a632911de961d0 09fcc28bb22553356aebf9ea93811703e5404b88022be8dab61ac81d3b187b75 test/extractor-tests/generated/PtrTypeRepr/PtrTypeRepr.ql d9289bfe1e72d9560b3878e4557f8cfda578ef7bce67eb29d7320921c0ba46a5 f3ea108aa25635bffa7673bb66b2581ce246d3aae86edf878c6f1abca2493c16 test/extractor-tests/generated/RangeExpr/RangeExpr.ql c9776706d933606d1463bb08ed76457ac03a9558f6dac0218ef2012bc5e8e48f 77cafee86abc2680e1f9c925fbe664c05ba1b9a2533b1873242ef01dde1ce308 @@ -801,7 +830,7 @@ test/extractor-tests/generated/Struct/Struct.ql 57e837e3c665d24870d99492c8874441 test/extractor-tests/generated/StructExpr/StructExpr.ql 3b98205260e750cc7adc42b318deef2854cc3b4f921cbcfffc6d701553af3903 368bccf01db2fa069dca30d9fb0878f8e6a88d4ce58b333b24a18620933e4c91 test/extractor-tests/generated/StructExprField/StructExprField.ql b65375963aa24f0d1dd4c10784e32ab8c337ad431462ea1d081a0e456fbb1362 7f5a49e8df03ed0890b51c2e941d636fbbf70445a53d3af2c0f34a04f26bc6ef test/extractor-tests/generated/StructExprFieldList/StructExprFieldList.ql 01dc3ef66d79836a3d372464f05454015648ab093f9547c5d9c5d55271acb718 83625301c097fa38d4e6021ea28b8adc6338076c8c2aa88a86a22aac412839f6 -test/extractor-tests/generated/StructField/StructField.ql 322229f824f2e2e2c4fb76ff35e343559bbe986982d40ca8739a071ee9778de4 535c3958f316c7106de50aa507f159b99b58cef4707e1f6b0a5ea48913d9c49c +test/extractor-tests/generated/StructField/StructField.ql 2698b1066822b706ccd46a9d560f6219c5c71d1ff27023a2e54bce3ac4371b5a f7374cf59e6d369ab27b106d3e1263de60ee540138b172e96d9fc4a9420a04b5 test/extractor-tests/generated/StructFieldList/StructFieldList.ql 292170b20f3a55c0cd6a8d78ce99474ca68daf6fb380cffe00b2bd7074e1b73a 404bab780f290ae04d1d71d3c6d4e0092bb3d8c55e956168d2a445cbd6d1f06d test/extractor-tests/generated/StructPat/StructPat.ql 894babd64d3def35717cbeed6eb4799cf9f52e73992822b72fc521c93efb4935 5bd1502b69014d70464b4b76795e1732ac2a6db5d028bea52929cf1998af5f07 test/extractor-tests/generated/StructPatField/StructPatField.ql 92cb6a4b5234359c02d66085b10d41f37b77370491ed478ad6d4d9b12b943ecf 14bc2079763b53bc6ab11356f3bb21820ae9e4dd1b2a42a78665c32181c4ef92 @@ -809,11 +838,11 @@ test/extractor-tests/generated/StructPatFieldList/StructPatFieldList.ql a3ba3e99 test/extractor-tests/generated/TokenTree/TokenTree.ql 55592f43a6fe99045d0b0b1e2323211d3a3fd64a8c7d2b083f2518d4c3e2e4b0 8eeef2060c80b0918857ba9b3a8543a4b866ca04be3d5ca18aae8a26cbdb836e test/extractor-tests/generated/TokenTreeMeta/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 test/extractor-tests/generated/Trait/AssocItemList.ql 065c4903992500423d796800e7dc9a5835a07cbada595108f3af6efa72517782 aa797bf5ddefb800d5ca7f49c19c5124b1007e1658129b27c8c3de34427c7f08 -test/extractor-tests/generated/Trait/Trait.ql e59d9d97baedc5691f9fb837e3600b1b33808c598971d8abe28121a9c70292b4 0da2808421a1e1acbc61076d4b50c559f2abf02cbd5f69ba15a65457887ff435 +test/extractor-tests/generated/Trait/Trait.ql b0da6d9a49de4a2a08140a8bbf0f66bb44631dc3c64e3c16482e44d5b0485c08 ed9c175f2751d3cc602d7cf6b781ea301a0817ab381d7f43b03f3398416caa44 test/extractor-tests/generated/TryBlockModifier/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 test/extractor-tests/generated/TryExpr/TryExpr.ql 4e3c224a7d5fb8f01654c7d3c79414daa575897cfa6f351fcd5b5832f53a151f d961a497c304c1c5aa1d94e04aed2bf17a2c422e315f05986e1a9027e69dbd2a test/extractor-tests/generated/TupleExpr/TupleExpr.ql 4011d94438903e96fa321285558f5791bee7e1d1fb26be0381586511cf439d1b c6bc8d08a8d5d98d7a52b72d5c597b63754fe12cec653c520833e4b71a9dcea4 -test/extractor-tests/generated/TupleField/TupleField.ql ed681b7fee5e68d24db4999389727b2589e5af793d3c2ddc8b1e245713c0e1f8 4f867b29adf91b4bfa5052e16d392c16bf260e858aad11b60c42f1eddb476e61 +test/extractor-tests/generated/TupleField/TupleField.ql 8fed1744aaa3b63bc9800ac2b1e3d6f118569a27b447520b0af6c698580bced5 f633952b1e3eaf982443af94b41d2f8d39d40c4ceacd7d3828dbc89559537262 test/extractor-tests/generated/TupleFieldList/TupleFieldList.ql 3c3fcef21231550bbbf6804314b94d44cc18d445987c23cb6f2c88015570cc4a 8958e6748296bc6d0ad469e52852c38445fe462a8599a2e71867aa5d7066595e test/extractor-tests/generated/TuplePat/TuplePat.ql 80609f1c525e90e13f34d55a81d47a83a03e064241f8d33232e2a79eaeea5159 d289b19dae4cbae0180cc58bb946f41646bb9dc008f5ce8a0e12eaddbc7e63e9 test/extractor-tests/generated/TupleStructPat/TupleStructPat.ql ea588383e16328486156e872f4d6f999a35534cde49d69b66a6186f01b1c2581 2a2e179b4241a4ff7d486e987cb667ba62025bc8dd48a507142cfec882bd35cc @@ -832,7 +861,8 @@ test/extractor-tests/generated/UseTree/UseTree.ql 3c2bc924b54b9af5c95784023d4098 test/extractor-tests/generated/UseTreeList/UseTreeList.ql faff7bfc060d5b0a922f38b37bf586596566186f704c9921651785580e86d684 81e5b90edeef0d3883547844a030e72b555d714de1ed8dded1c22a3772b4449a test/extractor-tests/generated/Variant/Variant.ql 0de458e2d04e40e9a0c036e423d05af3617f4423b967e287f0800ccffd345633 921a8ca71390812f174c5220d54dfcfc7105e57ba3c301f5c86301a19d089bda test/extractor-tests/generated/VariantList/VariantList.ql 1c1d82ce3ecfa7daaae1920662510e81892ed899a3c2f785e2ff3670245a03cd 29d4c5ab2b737a92c7525789e10a4aa9848f1a327e34f4e9543018021106b303 -test/extractor-tests/generated/Visibility/Visibility.ql 725d47d7444332133df603f9b06592dc40b0f83bf5e21ad4781c5658e001a3aa 2d65a30702a8bb5bc91caf6ae2d0e4c769b3eeb0d72ffbd9cdb81048be4061ad +test/extractor-tests/generated/Visibility/Visibility.ql 3bdf8f1ff70f62eabda19086d2c6b2c7e9cf4f7bb327b053a0115089d4aa9f56 7f89b2519ac4ef8e3afdfce58aa66edc921d36ecf28550f5cc3bce190db752e8 +test/extractor-tests/generated/VisibilityInner/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 test/extractor-tests/generated/WhereClause/WhereClause.ql a6f0e69ffa6b997cac04d4da442eb8bde517a576840c953abcc40863b9099ba1 7ce888fffc3038d5b18f8c94d3b045815cd45500e1bb3849c05fc874edbeb695 test/extractor-tests/generated/WherePred/WherePred.ql 8f73500a04f8748221b181bb9a51bef6c09d5ddf046488303594821e3191b370 8fb51d095a3c39b51ec8b4515fc02474ba36067ca4dfd48dff7e14d1c3881ea3 test/extractor-tests/generated/WhileExpr/WhileExpr.ql dcfe1ed375514a7b7513272767ed195cdbf339b56e00e62d207ca1eee080f164 f067283510655f0cf810cae834ac29ad2c6007ba312d027ebcdf695a23ec33e4 diff --git a/rust/ql/.gitattributes b/rust/ql/.gitattributes index 2ae7fd51d450..2d5c14bff270 100644 --- a/rust/ql/.gitattributes +++ b/rust/ql/.gitattributes @@ -49,6 +49,7 @@ /lib/codeql/rust/elements/ConstParam.qll linguist-generated /lib/codeql/rust/elements/ContinueExpr.qll linguist-generated /lib/codeql/rust/elements/Crate.qll linguist-generated +/lib/codeql/rust/elements/DerefPat.qll linguist-generated /lib/codeql/rust/elements/DynTraitTypeRepr.qll linguist-generated /lib/codeql/rust/elements/Element.qll linguist-generated /lib/codeql/rust/elements/Enum.qll linguist-generated @@ -66,7 +67,6 @@ /lib/codeql/rust/elements/ForTypeRepr.qll linguist-generated /lib/codeql/rust/elements/Format.qll linguist-generated /lib/codeql/rust/elements/FormatArgsArg.qll linguist-generated -/lib/codeql/rust/elements/FormatArgsArgName.qll linguist-generated /lib/codeql/rust/elements/FormatArgsExpr.qll linguist-generated /lib/codeql/rust/elements/FormatArgument.qll linguist-generated /lib/codeql/rust/elements/FormatTemplateVariableAccess.qll linguist-generated @@ -78,7 +78,9 @@ /lib/codeql/rust/elements/IdentPat.qll linguist-generated /lib/codeql/rust/elements/IfExpr.qll linguist-generated /lib/codeql/rust/elements/Impl.qll linguist-generated +/lib/codeql/rust/elements/ImplRestriction.qll linguist-generated /lib/codeql/rust/elements/ImplTraitTypeRepr.qll linguist-generated +/lib/codeql/rust/elements/IncludeBytesExpr.qll linguist-generated /lib/codeql/rust/elements/IndexExpr.qll linguist-generated /lib/codeql/rust/elements/InferTypeRepr.qll linguist-generated /lib/codeql/rust/elements/Item.qll linguist-generated @@ -112,9 +114,11 @@ /lib/codeql/rust/elements/MethodCallExpr.qll linguist-generated /lib/codeql/rust/elements/Missing.qll linguist-generated /lib/codeql/rust/elements/Module.qll linguist-generated +/lib/codeql/rust/elements/MutRestriction.qll linguist-generated /lib/codeql/rust/elements/Name.qll linguist-generated /lib/codeql/rust/elements/NameRef.qll linguist-generated /lib/codeql/rust/elements/NeverTypeRepr.qll linguist-generated +/lib/codeql/rust/elements/NotNull.qll linguist-generated /lib/codeql/rust/elements/OffsetOfExpr.qll linguist-generated /lib/codeql/rust/elements/OrPat.qll linguist-generated /lib/codeql/rust/elements/Param.qll linguist-generated @@ -133,6 +137,7 @@ /lib/codeql/rust/elements/PathPat.qll linguist-generated /lib/codeql/rust/elements/PathSegment.qll linguist-generated /lib/codeql/rust/elements/PathTypeRepr.qll linguist-generated +/lib/codeql/rust/elements/PatternTypeRepr.qll linguist-generated /lib/codeql/rust/elements/PrefixExpr.qll linguist-generated /lib/codeql/rust/elements/PtrTypeRepr.qll linguist-generated /lib/codeql/rust/elements/RangeExpr.qll linguist-generated @@ -193,6 +198,7 @@ /lib/codeql/rust/elements/Variant.qll linguist-generated /lib/codeql/rust/elements/VariantList.qll linguist-generated /lib/codeql/rust/elements/Visibility.qll linguist-generated +/lib/codeql/rust/elements/VisibilityInner.qll linguist-generated /lib/codeql/rust/elements/WhereClause.qll linguist-generated /lib/codeql/rust/elements/WherePred.qll linguist-generated /lib/codeql/rust/elements/WhileExpr.qll linguist-generated @@ -268,6 +274,8 @@ /lib/codeql/rust/elements/internal/ConstParamImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ContinueExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/CrateConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/DerefPatConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/DerefPatImpl.qll linguist-generated /lib/codeql/rust/elements/internal/DynTraitTypeReprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/EnumConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ExprImpl.qll linguist-generated @@ -292,8 +300,6 @@ /lib/codeql/rust/elements/internal/ForTypeReprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/FormatArgsArgConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/FormatArgsArgImpl.qll linguist-generated -/lib/codeql/rust/elements/internal/FormatArgsArgNameConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/FormatArgsArgNameImpl.qll linguist-generated /lib/codeql/rust/elements/internal/FormatArgsExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/FunctionConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/GenericArgImpl.qll linguist-generated @@ -303,7 +309,11 @@ /lib/codeql/rust/elements/internal/IdentPatConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/IfExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ImplConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/ImplRestrictionConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/ImplRestrictionImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ImplTraitTypeReprConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/IncludeBytesExprConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/IncludeBytesExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/IndexExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/InferTypeReprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ItemListConstructor.qll linguist-generated @@ -346,12 +356,16 @@ /lib/codeql/rust/elements/internal/MissingConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/MissingImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ModuleConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/MutRestrictionConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/MutRestrictionImpl.qll linguist-generated /lib/codeql/rust/elements/internal/NameConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/NameRefConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/NamedCrate.qll linguist-generated /lib/codeql/rust/elements/internal/NamedCrateConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/NamedCrateImpl.qll linguist-generated /lib/codeql/rust/elements/internal/NeverTypeReprConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/NotNullConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/NotNullImpl.qll linguist-generated /lib/codeql/rust/elements/internal/OffsetOfExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/OffsetOfExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/OrPatConstructor.qll linguist-generated @@ -371,6 +385,8 @@ /lib/codeql/rust/elements/internal/PathPatConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/PathSegmentConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/PathTypeReprConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/PatternTypeReprConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/PatternTypeReprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/PrefixExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/PtrTypeReprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/PtrTypeReprImpl.qll linguist-generated @@ -457,6 +473,8 @@ /lib/codeql/rust/elements/internal/VariantListConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/VariantListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/VisibilityConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/VisibilityInnerConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/VisibilityInnerImpl.qll linguist-generated /lib/codeql/rust/elements/internal/WhereClauseConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/WhereClauseImpl.qll linguist-generated /lib/codeql/rust/elements/internal/WherePredConstructor.qll linguist-generated @@ -516,6 +534,7 @@ /lib/codeql/rust/elements/internal/generated/ConstParam.qll linguist-generated /lib/codeql/rust/elements/internal/generated/ContinueExpr.qll linguist-generated /lib/codeql/rust/elements/internal/generated/Crate.qll linguist-generated +/lib/codeql/rust/elements/internal/generated/DerefPat.qll linguist-generated /lib/codeql/rust/elements/internal/generated/DynTraitTypeRepr.qll linguist-generated /lib/codeql/rust/elements/internal/generated/Element.qll linguist-generated /lib/codeql/rust/elements/internal/generated/Enum.qll linguist-generated @@ -534,7 +553,6 @@ /lib/codeql/rust/elements/internal/generated/ForTypeRepr.qll linguist-generated /lib/codeql/rust/elements/internal/generated/Format.qll linguist-generated /lib/codeql/rust/elements/internal/generated/FormatArgsArg.qll linguist-generated -/lib/codeql/rust/elements/internal/generated/FormatArgsArgName.qll linguist-generated /lib/codeql/rust/elements/internal/generated/FormatArgsExpr.qll linguist-generated /lib/codeql/rust/elements/internal/generated/FormatArgument.qll linguist-generated /lib/codeql/rust/elements/internal/generated/FormatTemplateVariableAccess.qll linguist-generated @@ -546,7 +564,9 @@ /lib/codeql/rust/elements/internal/generated/IdentPat.qll linguist-generated /lib/codeql/rust/elements/internal/generated/IfExpr.qll linguist-generated /lib/codeql/rust/elements/internal/generated/Impl.qll linguist-generated +/lib/codeql/rust/elements/internal/generated/ImplRestriction.qll linguist-generated /lib/codeql/rust/elements/internal/generated/ImplTraitTypeRepr.qll linguist-generated +/lib/codeql/rust/elements/internal/generated/IncludeBytesExpr.qll linguist-generated /lib/codeql/rust/elements/internal/generated/IndexExpr.qll linguist-generated /lib/codeql/rust/elements/internal/generated/InferTypeRepr.qll linguist-generated /lib/codeql/rust/elements/internal/generated/Item.qll linguist-generated @@ -580,10 +600,12 @@ /lib/codeql/rust/elements/internal/generated/MethodCallExpr.qll linguist-generated /lib/codeql/rust/elements/internal/generated/Missing.qll linguist-generated /lib/codeql/rust/elements/internal/generated/Module.qll linguist-generated +/lib/codeql/rust/elements/internal/generated/MutRestriction.qll linguist-generated /lib/codeql/rust/elements/internal/generated/Name.qll linguist-generated /lib/codeql/rust/elements/internal/generated/NameRef.qll linguist-generated /lib/codeql/rust/elements/internal/generated/NamedCrate.qll linguist-generated /lib/codeql/rust/elements/internal/generated/NeverTypeRepr.qll linguist-generated +/lib/codeql/rust/elements/internal/generated/NotNull.qll linguist-generated /lib/codeql/rust/elements/internal/generated/OffsetOfExpr.qll linguist-generated /lib/codeql/rust/elements/internal/generated/OrPat.qll linguist-generated /lib/codeql/rust/elements/internal/generated/Param.qll linguist-generated @@ -603,6 +625,7 @@ /lib/codeql/rust/elements/internal/generated/PathPat.qll linguist-generated /lib/codeql/rust/elements/internal/generated/PathSegment.qll linguist-generated /lib/codeql/rust/elements/internal/generated/PathTypeRepr.qll linguist-generated +/lib/codeql/rust/elements/internal/generated/PatternTypeRepr.qll linguist-generated /lib/codeql/rust/elements/internal/generated/PrefixExpr.qll linguist-generated /lib/codeql/rust/elements/internal/generated/PtrTypeRepr.qll linguist-generated /lib/codeql/rust/elements/internal/generated/PureSynthConstructors.qll linguist-generated @@ -667,6 +690,7 @@ /lib/codeql/rust/elements/internal/generated/Variant.qll linguist-generated /lib/codeql/rust/elements/internal/generated/VariantList.qll linguist-generated /lib/codeql/rust/elements/internal/generated/Visibility.qll linguist-generated +/lib/codeql/rust/elements/internal/generated/VisibilityInner.qll linguist-generated /lib/codeql/rust/elements/internal/generated/WhereClause.qll linguist-generated /lib/codeql/rust/elements/internal/generated/WherePred.qll linguist-generated /lib/codeql/rust/elements/internal/generated/WhileExpr.qll linguist-generated @@ -713,6 +737,7 @@ /test/extractor-tests/generated/ConstParam/ConstParam.ql linguist-generated /test/extractor-tests/generated/ContinueExpr/ContinueExpr.ql linguist-generated /test/extractor-tests/generated/Crate/MISSING_SOURCE.txt linguist-generated +/test/extractor-tests/generated/DerefPat/MISSING_SOURCE.txt linguist-generated /test/extractor-tests/generated/DynTraitTypeRepr/DynTraitTypeRepr.ql linguist-generated /test/extractor-tests/generated/Enum/Enum.ql linguist-generated /test/extractor-tests/generated/ExprStmt/ExprStmt.ql linguist-generated @@ -724,7 +749,6 @@ /test/extractor-tests/generated/ForBinder/ForBinder.ql linguist-generated /test/extractor-tests/generated/ForExpr/ForExpr.ql linguist-generated /test/extractor-tests/generated/ForTypeRepr/ForTypeRepr.ql linguist-generated -/test/extractor-tests/generated/FormatArgsArgName/MISSING_SOURCE.txt linguist-generated /test/extractor-tests/generated/FormatArgsExpr/Format.ql linguist-generated /test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg.ql linguist-generated /test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr.ql linguist-generated @@ -736,7 +760,9 @@ /test/extractor-tests/generated/IdentPat/IdentPat.ql linguist-generated /test/extractor-tests/generated/IfExpr/IfExpr.ql linguist-generated /test/extractor-tests/generated/Impl/Impl.ql linguist-generated +/test/extractor-tests/generated/ImplRestriction/MISSING_SOURCE.txt linguist-generated /test/extractor-tests/generated/ImplTraitTypeRepr/ImplTraitTypeRepr.ql linguist-generated +/test/extractor-tests/generated/IncludeBytesExpr/MISSING_SOURCE.txt linguist-generated /test/extractor-tests/generated/IndexExpr/IndexExpr.ql linguist-generated /test/extractor-tests/generated/InferTypeRepr/InferTypeRepr.ql linguist-generated /test/extractor-tests/generated/ItemList/ItemList.ql linguist-generated @@ -764,9 +790,11 @@ /test/extractor-tests/generated/MatchGuard/MatchGuard.ql linguist-generated /test/extractor-tests/generated/MethodCallExpr/MethodCallExpr.ql linguist-generated /test/extractor-tests/generated/Module/Module.ql linguist-generated +/test/extractor-tests/generated/MutRestriction/MISSING_SOURCE.txt linguist-generated /test/extractor-tests/generated/Name/Name.ql linguist-generated /test/extractor-tests/generated/NameRef/NameRef.ql linguist-generated /test/extractor-tests/generated/NeverTypeRepr/NeverTypeRepr.ql linguist-generated +/test/extractor-tests/generated/NotNull/MISSING_SOURCE.txt linguist-generated /test/extractor-tests/generated/OffsetOfExpr/OffsetOfExpr.ql linguist-generated /test/extractor-tests/generated/OrPat/OrPat.ql linguist-generated /test/extractor-tests/generated/Param/Param.ql linguist-generated @@ -781,6 +809,7 @@ /test/extractor-tests/generated/Path/PathSegment.ql linguist-generated /test/extractor-tests/generated/Path/PathTypeRepr.ql linguist-generated /test/extractor-tests/generated/PathMeta/MISSING_SOURCE.txt linguist-generated +/test/extractor-tests/generated/PatternTypeRepr/MISSING_SOURCE.txt linguist-generated /test/extractor-tests/generated/PrefixExpr/PrefixExpr.ql linguist-generated /test/extractor-tests/generated/PtrTypeRepr/PtrTypeRepr.ql linguist-generated /test/extractor-tests/generated/RangeExpr/RangeExpr.ql linguist-generated @@ -835,6 +864,7 @@ /test/extractor-tests/generated/Variant/Variant.ql linguist-generated /test/extractor-tests/generated/VariantList/VariantList.ql linguist-generated /test/extractor-tests/generated/Visibility/Visibility.ql linguist-generated +/test/extractor-tests/generated/VisibilityInner/MISSING_SOURCE.txt linguist-generated /test/extractor-tests/generated/WhereClause/WhereClause.ql linguist-generated /test/extractor-tests/generated/WherePred/WherePred.ql linguist-generated /test/extractor-tests/generated/WhileExpr/WhileExpr.ql linguist-generated diff --git a/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll b/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll index c8b4117a9abb..8081aea83646 100644 --- a/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll +++ b/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll @@ -874,6 +874,37 @@ module MakeCfgNodes Input> { predicate hasLifetime() { exists(this.getLifetime()) } } + final private class ParentDerefPat extends ParentAstNode, DerefPat { + override predicate relevantChild(AstNode child) { + none() + or + child = this.getPat() + } + } + + /** + */ + final class DerefPatCfgNode extends CfgNodeFinal, PatCfgNode { + private DerefPat node; + + DerefPatCfgNode() { node = this.getAstNode() } + + /** Gets the underlying `DerefPat`. */ + DerefPat getDerefPat() { result = node } + + /** + * Gets the pattern of this deref pattern, if it exists. + */ + PatCfgNode getPat() { + any(ChildMapping mapping).hasCfgChild(node, node.getPat(), this, result) + } + + /** + * Holds if `getPat()` exists. + */ + predicate hasPat() { exists(this.getPat()) } + } + final private class ParentExpr extends ParentAstNode, Expr { override predicate relevantChild(AstNode child) { none() } } @@ -1023,6 +1054,8 @@ module MakeCfgNodes Input> { none() or child = this.getExpr() + or + child = this.getName() } } @@ -1041,26 +1074,28 @@ module MakeCfgNodes Input> { FormatArgsArg getFormatArgsArg() { result = node } /** - * Gets the argument name of this format arguments argument, if it exists. + * Gets the expression of this format arguments argument, if it exists. */ - FormatArgsArgName getArgName() { result = node.getArgName() } + ExprCfgNode getExpr() { + any(ChildMapping mapping).hasCfgChild(node, node.getExpr(), this, result) + } /** - * Holds if `getArgName()` exists. + * Holds if `getExpr()` exists. */ - predicate hasArgName() { exists(this.getArgName()) } + predicate hasExpr() { exists(this.getExpr()) } /** - * Gets the expression of this format arguments argument, if it exists. + * Gets the name of this format arguments argument, if it exists. */ - ExprCfgNode getExpr() { - any(ChildMapping mapping).hasCfgChild(node, node.getExpr(), this, result) + NameCfgNode getName() { + any(ChildMapping mapping).hasCfgChild(node, node.getName(), this, result) } /** - * Holds if `getExpr()` exists. + * Holds if `getName()` exists. */ - predicate hasExpr() { exists(this.getExpr()) } + predicate hasName() { exists(this.getName()) } } final private class ParentFormatArgsExpr extends ParentAstNode, FormatArgsExpr { @@ -1338,6 +1373,21 @@ module MakeCfgNodes Input> { predicate hasThen() { exists(this.getThen()) } } + final private class ParentIncludeBytesExpr extends ParentAstNode, IncludeBytesExpr { + override predicate relevantChild(AstNode child) { none() } + } + + /** + */ + final class IncludeBytesExprCfgNode extends CfgNodeFinal, ExprCfgNode { + private IncludeBytesExpr node; + + IncludeBytesExprCfgNode() { node = this.getAstNode() } + + /** Gets the underlying `IncludeBytesExpr`. */ + IncludeBytesExpr getIncludeBytesExpr() { result = node } + } + final private class ParentIndexExpr extends ParentAstNode, IndexExpr { override predicate relevantChild(AstNode child) { none() @@ -2094,6 +2144,21 @@ module MakeCfgNodes Input> { predicate hasText() { exists(this.getText()) } } + final private class ParentNotNull extends ParentAstNode, NotNull { + override predicate relevantChild(AstNode child) { none() } + } + + /** + */ + final class NotNullCfgNode extends CfgNodeFinal, PatCfgNode { + private NotNull node; + + NotNullCfgNode() { node = this.getAstNode() } + + /** Gets the underlying `NotNull`. */ + NotNull getNotNull() { result = node } + } + final private class ParentOffsetOfExpr extends ParentAstNode, OffsetOfExpr { override predicate relevantChild(AstNode child) { none() } } @@ -3511,6 +3576,18 @@ module MakeCfgNodes Input> { cfgNode ) or + pred = "getPat" and + parent = + any(Nodes::DerefPatCfgNode cfgNode, DerefPat astNode | + astNode = cfgNode.getDerefPat() and + child = getDesugared(astNode.getPat()) and + i = -1 and + hasCfgNode(child) and + not child = cfgNode.getPat().getAstNode() + | + cfgNode + ) + or pred = "getContainer" and parent = any(Nodes::FieldExprCfgNode cfgNode, FieldExpr astNode | @@ -3559,6 +3636,18 @@ module MakeCfgNodes Input> { cfgNode ) or + pred = "getName" and + parent = + any(Nodes::FormatArgsArgCfgNode cfgNode, FormatArgsArg astNode | + astNode = cfgNode.getFormatArgsArg() and + child = getDesugared(astNode.getName()) and + i = -1 and + hasCfgNode(child) and + not child = cfgNode.getName().getAstNode() + | + cfgNode + ) + or pred = "getArg" and parent = any(Nodes::FormatArgsExprCfgNode cfgNode, FormatArgsExpr astNode | diff --git a/rust/ql/lib/codeql/rust/elements.qll b/rust/ql/lib/codeql/rust/elements.qll index fdfe2c0cacf0..004acff69158 100644 --- a/rust/ql/lib/codeql/rust/elements.qll +++ b/rust/ql/lib/codeql/rust/elements.qll @@ -52,6 +52,7 @@ import codeql.rust.elements.ConstBlockPat import codeql.rust.elements.ConstParam import codeql.rust.elements.ContinueExpr import codeql.rust.elements.Crate +import codeql.rust.elements.DerefPat import codeql.rust.elements.DynTraitTypeRepr import codeql.rust.elements.Element import codeql.rust.elements.Enum @@ -69,7 +70,6 @@ import codeql.rust.elements.ForExpr import codeql.rust.elements.ForTypeRepr import codeql.rust.elements.Format import codeql.rust.elements.FormatArgsArg -import codeql.rust.elements.FormatArgsArgName import codeql.rust.elements.FormatArgsExpr import codeql.rust.elements.FormatArgument import codeql.rust.elements.FormatTemplateVariableAccess @@ -81,7 +81,9 @@ import codeql.rust.elements.GenericParamList import codeql.rust.elements.IdentPat import codeql.rust.elements.IfExpr import codeql.rust.elements.Impl +import codeql.rust.elements.ImplRestriction import codeql.rust.elements.ImplTraitTypeRepr +import codeql.rust.elements.IncludeBytesExpr import codeql.rust.elements.IndexExpr import codeql.rust.elements.InferTypeRepr import codeql.rust.elements.Item @@ -115,9 +117,11 @@ import codeql.rust.elements.Meta import codeql.rust.elements.MethodCallExpr import codeql.rust.elements.Missing import codeql.rust.elements.Module +import codeql.rust.elements.MutRestriction import codeql.rust.elements.Name import codeql.rust.elements.NameRef import codeql.rust.elements.NeverTypeRepr +import codeql.rust.elements.NotNull import codeql.rust.elements.OffsetOfExpr import codeql.rust.elements.OrPat import codeql.rust.elements.Param @@ -136,6 +140,7 @@ import codeql.rust.elements.PathMeta import codeql.rust.elements.PathPat import codeql.rust.elements.PathSegment import codeql.rust.elements.PathTypeRepr +import codeql.rust.elements.PatternTypeRepr import codeql.rust.elements.PrefixExpr import codeql.rust.elements.PtrTypeRepr import codeql.rust.elements.RangeExpr @@ -196,6 +201,7 @@ import codeql.rust.elements.UseTreeList import codeql.rust.elements.Variant import codeql.rust.elements.VariantList import codeql.rust.elements.Visibility +import codeql.rust.elements.VisibilityInner import codeql.rust.elements.WhereClause import codeql.rust.elements.WherePred import codeql.rust.elements.WhileExpr diff --git a/rust/ql/lib/codeql/rust/elements/AsmClobberAbi.qll b/rust/ql/lib/codeql/rust/elements/AsmClobberAbi.qll index 253dcdfc9fa4..ac1227f3058a 100644 --- a/rust/ql/lib/codeql/rust/elements/AsmClobberAbi.qll +++ b/rust/ql/lib/codeql/rust/elements/AsmClobberAbi.qll @@ -5,6 +5,7 @@ private import internal.AsmClobberAbiImpl import codeql.rust.elements.AsmPiece +import codeql.rust.elements.Attr /** * A clobbered ABI in an inline assembly block. diff --git a/rust/ql/lib/codeql/rust/elements/AsmOperandNamed.qll b/rust/ql/lib/codeql/rust/elements/AsmOperandNamed.qll index cb54a585539a..fdcf91eb1253 100644 --- a/rust/ql/lib/codeql/rust/elements/AsmOperandNamed.qll +++ b/rust/ql/lib/codeql/rust/elements/AsmOperandNamed.qll @@ -6,6 +6,7 @@ private import internal.AsmOperandNamedImpl import codeql.rust.elements.AsmOperand import codeql.rust.elements.AsmPiece +import codeql.rust.elements.Attr import codeql.rust.elements.Name /** diff --git a/rust/ql/lib/codeql/rust/elements/AsmOptionsList.qll b/rust/ql/lib/codeql/rust/elements/AsmOptionsList.qll index dc82f9cb4afd..56ce0383ef91 100644 --- a/rust/ql/lib/codeql/rust/elements/AsmOptionsList.qll +++ b/rust/ql/lib/codeql/rust/elements/AsmOptionsList.qll @@ -6,6 +6,7 @@ private import internal.AsmOptionsListImpl import codeql.rust.elements.AsmOption import codeql.rust.elements.AsmPiece +import codeql.rust.elements.Attr /** * A list of options in an inline assembly block. diff --git a/rust/ql/lib/codeql/rust/elements/DerefPat.qll b/rust/ql/lib/codeql/rust/elements/DerefPat.qll new file mode 100644 index 000000000000..30c7ce48cf4e --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/DerefPat.qll @@ -0,0 +1,9 @@ +// generated by codegen, do not edit +/** + * This module provides the public class `DerefPat`. + */ + +private import internal.DerefPatImpl +import codeql.rust.elements.Pat + +final class DerefPat = Impl::DerefPat; diff --git a/rust/ql/lib/codeql/rust/elements/FormatArgsArg.qll b/rust/ql/lib/codeql/rust/elements/FormatArgsArg.qll index 2cb12d291fb1..4946f9789304 100644 --- a/rust/ql/lib/codeql/rust/elements/FormatArgsArg.qll +++ b/rust/ql/lib/codeql/rust/elements/FormatArgsArg.qll @@ -6,7 +6,7 @@ private import internal.FormatArgsArgImpl import codeql.rust.elements.AstNode import codeql.rust.elements.Expr -import codeql.rust.elements.FormatArgsArgName +import codeql.rust.elements.Name /** * A FormatArgsArg. For example the `"world"` in: diff --git a/rust/ql/lib/codeql/rust/elements/FormatArgsArgName.qll b/rust/ql/lib/codeql/rust/elements/FormatArgsArgName.qll deleted file mode 100644 index 93c5b2185701..000000000000 --- a/rust/ql/lib/codeql/rust/elements/FormatArgsArgName.qll +++ /dev/null @@ -1,9 +0,0 @@ -// generated by codegen, do not edit -/** - * This module provides the public class `FormatArgsArgName`. - */ - -private import internal.FormatArgsArgNameImpl -import codeql.rust.elements.AstNode - -final class FormatArgsArgName = Impl::FormatArgsArgName; diff --git a/rust/ql/lib/codeql/rust/elements/ImplRestriction.qll b/rust/ql/lib/codeql/rust/elements/ImplRestriction.qll new file mode 100644 index 000000000000..4b6ee748a456 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/ImplRestriction.qll @@ -0,0 +1,10 @@ +// generated by codegen, do not edit +/** + * This module provides the public class `ImplRestriction`. + */ + +private import internal.ImplRestrictionImpl +import codeql.rust.elements.AstNode +import codeql.rust.elements.VisibilityInner + +final class ImplRestriction = Impl::ImplRestriction; diff --git a/rust/ql/lib/codeql/rust/elements/IncludeBytesExpr.qll b/rust/ql/lib/codeql/rust/elements/IncludeBytesExpr.qll new file mode 100644 index 000000000000..242e0a087620 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/IncludeBytesExpr.qll @@ -0,0 +1,9 @@ +// generated by codegen, do not edit +/** + * This module provides the public class `IncludeBytesExpr`. + */ + +private import internal.IncludeBytesExprImpl +import codeql.rust.elements.Expr + +final class IncludeBytesExpr = Impl::IncludeBytesExpr; diff --git a/rust/ql/lib/codeql/rust/elements/MutRestriction.qll b/rust/ql/lib/codeql/rust/elements/MutRestriction.qll new file mode 100644 index 000000000000..dfef343cf7c5 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/MutRestriction.qll @@ -0,0 +1,10 @@ +// generated by codegen, do not edit +/** + * This module provides the public class `MutRestriction`. + */ + +private import internal.MutRestrictionImpl +import codeql.rust.elements.AstNode +import codeql.rust.elements.VisibilityInner + +final class MutRestriction = Impl::MutRestriction; diff --git a/rust/ql/lib/codeql/rust/elements/NotNull.qll b/rust/ql/lib/codeql/rust/elements/NotNull.qll new file mode 100644 index 000000000000..6c27c1866613 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/NotNull.qll @@ -0,0 +1,9 @@ +// generated by codegen, do not edit +/** + * This module provides the public class `NotNull`. + */ + +private import internal.NotNullImpl +import codeql.rust.elements.Pat + +final class NotNull = Impl::NotNull; diff --git a/rust/ql/lib/codeql/rust/elements/PatternTypeRepr.qll b/rust/ql/lib/codeql/rust/elements/PatternTypeRepr.qll new file mode 100644 index 000000000000..c6d6c0b71e84 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/PatternTypeRepr.qll @@ -0,0 +1,10 @@ +// generated by codegen, do not edit +/** + * This module provides the public class `PatternTypeRepr`. + */ + +private import internal.PatternTypeReprImpl +import codeql.rust.elements.Pat +import codeql.rust.elements.TypeRepr + +final class PatternTypeRepr = Impl::PatternTypeRepr; diff --git a/rust/ql/lib/codeql/rust/elements/StructField.qll b/rust/ql/lib/codeql/rust/elements/StructField.qll index d02d9418049c..ce9add1c1f10 100644 --- a/rust/ql/lib/codeql/rust/elements/StructField.qll +++ b/rust/ql/lib/codeql/rust/elements/StructField.qll @@ -7,6 +7,7 @@ private import internal.StructFieldImpl import codeql.rust.elements.AstNode import codeql.rust.elements.Attr import codeql.rust.elements.ConstArg +import codeql.rust.elements.MutRestriction import codeql.rust.elements.Name import codeql.rust.elements.TypeRepr import codeql.rust.elements.Visibility diff --git a/rust/ql/lib/codeql/rust/elements/Trait.qll b/rust/ql/lib/codeql/rust/elements/Trait.qll index ee1166922ccd..f4d5c3ebeb5e 100644 --- a/rust/ql/lib/codeql/rust/elements/Trait.qll +++ b/rust/ql/lib/codeql/rust/elements/Trait.qll @@ -7,6 +7,7 @@ private import internal.TraitImpl import codeql.rust.elements.AssocItemList import codeql.rust.elements.Attr import codeql.rust.elements.GenericParamList +import codeql.rust.elements.ImplRestriction import codeql.rust.elements.Item import codeql.rust.elements.Name import codeql.rust.elements.TypeBoundList diff --git a/rust/ql/lib/codeql/rust/elements/TupleField.qll b/rust/ql/lib/codeql/rust/elements/TupleField.qll index 3e63f377aeb6..333dc1f44a4c 100644 --- a/rust/ql/lib/codeql/rust/elements/TupleField.qll +++ b/rust/ql/lib/codeql/rust/elements/TupleField.qll @@ -6,6 +6,7 @@ private import internal.TupleFieldImpl import codeql.rust.elements.AstNode import codeql.rust.elements.Attr +import codeql.rust.elements.MutRestriction import codeql.rust.elements.TypeRepr import codeql.rust.elements.Visibility diff --git a/rust/ql/lib/codeql/rust/elements/Visibility.qll b/rust/ql/lib/codeql/rust/elements/Visibility.qll index 9fd60b6ba27c..fe62d91fb18d 100644 --- a/rust/ql/lib/codeql/rust/elements/Visibility.qll +++ b/rust/ql/lib/codeql/rust/elements/Visibility.qll @@ -5,7 +5,7 @@ private import internal.VisibilityImpl import codeql.rust.elements.AstNode -import codeql.rust.elements.Path +import codeql.rust.elements.VisibilityInner /** * A visibility modifier. diff --git a/rust/ql/lib/codeql/rust/elements/VisibilityInner.qll b/rust/ql/lib/codeql/rust/elements/VisibilityInner.qll new file mode 100644 index 000000000000..2439313fa6aa --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/VisibilityInner.qll @@ -0,0 +1,10 @@ +// generated by codegen, do not edit +/** + * This module provides the public class `VisibilityInner`. + */ + +private import internal.VisibilityInnerImpl +import codeql.rust.elements.AstNode +import codeql.rust.elements.Path + +final class VisibilityInner = Impl::VisibilityInner; diff --git a/rust/ql/lib/codeql/rust/elements/internal/FormatArgsArgNameConstructor.qll b/rust/ql/lib/codeql/rust/elements/internal/DerefPatConstructor.qll similarity index 59% rename from rust/ql/lib/codeql/rust/elements/internal/FormatArgsArgNameConstructor.qll rename to rust/ql/lib/codeql/rust/elements/internal/DerefPatConstructor.qll index fbed7006a8aa..8c195ffea0c5 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/FormatArgsArgNameConstructor.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/DerefPatConstructor.qll @@ -1,14 +1,14 @@ // generated by codegen, remove this comment if you wish to edit this file /** * This module defines the hook used internally to tweak the characteristic predicate of - * `FormatArgsArgName` synthesized instances. + * `DerefPat` synthesized instances. * INTERNAL: Do not use. */ private import codeql.rust.elements.internal.generated.Raw /** - * The characteristic predicate of `FormatArgsArgName` synthesized instances. + * The characteristic predicate of `DerefPat` synthesized instances. * INTERNAL: Do not use. */ -predicate constructFormatArgsArgName(Raw::FormatArgsArgName id) { any() } +predicate constructDerefPat(Raw::DerefPat id) { any() } diff --git a/rust/ql/lib/codeql/rust/elements/internal/FormatArgsArgNameImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/DerefPatImpl.qll similarity index 58% rename from rust/ql/lib/codeql/rust/elements/internal/FormatArgsArgNameImpl.qll rename to rust/ql/lib/codeql/rust/elements/internal/DerefPatImpl.qll index 31ead66d0ac2..494072057a9c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/FormatArgsArgNameImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/DerefPatImpl.qll @@ -1,16 +1,16 @@ // generated by codegen, remove this comment if you wish to edit this file /** - * This module provides a hand-modifiable wrapper around the generated class `FormatArgsArgName`. + * This module provides a hand-modifiable wrapper around the generated class `DerefPat`. * * INTERNAL: Do not use. */ -private import codeql.rust.elements.internal.generated.FormatArgsArgName +private import codeql.rust.elements.internal.generated.DerefPat /** - * INTERNAL: This module contains the customizable definition of `FormatArgsArgName` and should not + * INTERNAL: This module contains the customizable definition of `DerefPat` and should not * be referenced directly. */ module Impl { - class FormatArgsArgName extends Generated::FormatArgsArgName { } + class DerefPat extends Generated::DerefPat { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ImplRestrictionConstructor.qll b/rust/ql/lib/codeql/rust/elements/internal/ImplRestrictionConstructor.qll new file mode 100644 index 000000000000..0e0a7a420efc --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/ImplRestrictionConstructor.qll @@ -0,0 +1,14 @@ +// generated by codegen, remove this comment if you wish to edit this file +/** + * This module defines the hook used internally to tweak the characteristic predicate of + * `ImplRestriction` synthesized instances. + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.Raw + +/** + * The characteristic predicate of `ImplRestriction` synthesized instances. + * INTERNAL: Do not use. + */ +predicate constructImplRestriction(Raw::ImplRestriction id) { any() } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ImplRestrictionImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ImplRestrictionImpl.qll new file mode 100644 index 000000000000..33cacad6f47a --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/ImplRestrictionImpl.qll @@ -0,0 +1,16 @@ +// generated by codegen, remove this comment if you wish to edit this file +/** + * This module provides a hand-modifiable wrapper around the generated class `ImplRestriction`. + * + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.ImplRestriction + +/** + * INTERNAL: This module contains the customizable definition of `ImplRestriction` and should not + * be referenced directly. + */ +module Impl { + class ImplRestriction extends Generated::ImplRestriction { } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/IncludeBytesExprConstructor.qll b/rust/ql/lib/codeql/rust/elements/internal/IncludeBytesExprConstructor.qll new file mode 100644 index 000000000000..52ba275a28f4 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/IncludeBytesExprConstructor.qll @@ -0,0 +1,14 @@ +// generated by codegen, remove this comment if you wish to edit this file +/** + * This module defines the hook used internally to tweak the characteristic predicate of + * `IncludeBytesExpr` synthesized instances. + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.Raw + +/** + * The characteristic predicate of `IncludeBytesExpr` synthesized instances. + * INTERNAL: Do not use. + */ +predicate constructIncludeBytesExpr(Raw::IncludeBytesExpr id) { any() } diff --git a/rust/ql/lib/codeql/rust/elements/internal/IncludeBytesExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/IncludeBytesExprImpl.qll new file mode 100644 index 000000000000..691f736f11c1 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/IncludeBytesExprImpl.qll @@ -0,0 +1,16 @@ +// generated by codegen, remove this comment if you wish to edit this file +/** + * This module provides a hand-modifiable wrapper around the generated class `IncludeBytesExpr`. + * + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.IncludeBytesExpr + +/** + * INTERNAL: This module contains the customizable definition of `IncludeBytesExpr` and should not + * be referenced directly. + */ +module Impl { + class IncludeBytesExpr extends Generated::IncludeBytesExpr { } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/MutRestrictionConstructor.qll b/rust/ql/lib/codeql/rust/elements/internal/MutRestrictionConstructor.qll new file mode 100644 index 000000000000..57f71b2319a5 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/MutRestrictionConstructor.qll @@ -0,0 +1,14 @@ +// generated by codegen, remove this comment if you wish to edit this file +/** + * This module defines the hook used internally to tweak the characteristic predicate of + * `MutRestriction` synthesized instances. + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.Raw + +/** + * The characteristic predicate of `MutRestriction` synthesized instances. + * INTERNAL: Do not use. + */ +predicate constructMutRestriction(Raw::MutRestriction id) { any() } diff --git a/rust/ql/lib/codeql/rust/elements/internal/MutRestrictionImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/MutRestrictionImpl.qll new file mode 100644 index 000000000000..caaaa8c2a4d1 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/MutRestrictionImpl.qll @@ -0,0 +1,16 @@ +// generated by codegen, remove this comment if you wish to edit this file +/** + * This module provides a hand-modifiable wrapper around the generated class `MutRestriction`. + * + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.MutRestriction + +/** + * INTERNAL: This module contains the customizable definition of `MutRestriction` and should not + * be referenced directly. + */ +module Impl { + class MutRestriction extends Generated::MutRestriction { } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/NotNullConstructor.qll b/rust/ql/lib/codeql/rust/elements/internal/NotNullConstructor.qll new file mode 100644 index 000000000000..6c7de057d9af --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/NotNullConstructor.qll @@ -0,0 +1,14 @@ +// generated by codegen, remove this comment if you wish to edit this file +/** + * This module defines the hook used internally to tweak the characteristic predicate of + * `NotNull` synthesized instances. + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.Raw + +/** + * The characteristic predicate of `NotNull` synthesized instances. + * INTERNAL: Do not use. + */ +predicate constructNotNull(Raw::NotNull id) { any() } diff --git a/rust/ql/lib/codeql/rust/elements/internal/NotNullImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/NotNullImpl.qll new file mode 100644 index 000000000000..44d4bfb635dc --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/NotNullImpl.qll @@ -0,0 +1,16 @@ +// generated by codegen, remove this comment if you wish to edit this file +/** + * This module provides a hand-modifiable wrapper around the generated class `NotNull`. + * + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.NotNull + +/** + * INTERNAL: This module contains the customizable definition of `NotNull` and should not + * be referenced directly. + */ +module Impl { + class NotNull extends Generated::NotNull { } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/PatternTypeReprConstructor.qll b/rust/ql/lib/codeql/rust/elements/internal/PatternTypeReprConstructor.qll new file mode 100644 index 000000000000..00878cb3430d --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/PatternTypeReprConstructor.qll @@ -0,0 +1,14 @@ +// generated by codegen, remove this comment if you wish to edit this file +/** + * This module defines the hook used internally to tweak the characteristic predicate of + * `PatternTypeRepr` synthesized instances. + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.Raw + +/** + * The characteristic predicate of `PatternTypeRepr` synthesized instances. + * INTERNAL: Do not use. + */ +predicate constructPatternTypeRepr(Raw::PatternTypeRepr id) { any() } diff --git a/rust/ql/lib/codeql/rust/elements/internal/PatternTypeReprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/PatternTypeReprImpl.qll new file mode 100644 index 000000000000..986a3980b79c --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/PatternTypeReprImpl.qll @@ -0,0 +1,16 @@ +// generated by codegen, remove this comment if you wish to edit this file +/** + * This module provides a hand-modifiable wrapper around the generated class `PatternTypeRepr`. + * + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.PatternTypeRepr + +/** + * INTERNAL: This module contains the customizable definition of `PatternTypeRepr` and should not + * be referenced directly. + */ +module Impl { + class PatternTypeRepr extends Generated::PatternTypeRepr { } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/VisibilityInnerConstructor.qll b/rust/ql/lib/codeql/rust/elements/internal/VisibilityInnerConstructor.qll new file mode 100644 index 000000000000..c6eca06336a8 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/VisibilityInnerConstructor.qll @@ -0,0 +1,14 @@ +// generated by codegen, remove this comment if you wish to edit this file +/** + * This module defines the hook used internally to tweak the characteristic predicate of + * `VisibilityInner` synthesized instances. + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.Raw + +/** + * The characteristic predicate of `VisibilityInner` synthesized instances. + * INTERNAL: Do not use. + */ +predicate constructVisibilityInner(Raw::VisibilityInner id) { any() } diff --git a/rust/ql/lib/codeql/rust/elements/internal/VisibilityInnerImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/VisibilityInnerImpl.qll new file mode 100644 index 000000000000..73595278072f --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/VisibilityInnerImpl.qll @@ -0,0 +1,16 @@ +// generated by codegen, remove this comment if you wish to edit this file +/** + * This module provides a hand-modifiable wrapper around the generated class `VisibilityInner`. + * + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.VisibilityInner + +/** + * INTERNAL: This module contains the customizable definition of `VisibilityInner` and should not + * be referenced directly. + */ +module Impl { + class VisibilityInner extends Generated::VisibilityInner { } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmClobberAbi.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmClobberAbi.qll index 9a47d6081123..37299a945e45 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmClobberAbi.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmClobberAbi.qll @@ -7,6 +7,7 @@ private import codeql.rust.elements.internal.generated.Synth private import codeql.rust.elements.internal.generated.Raw import codeql.rust.elements.internal.AsmPieceImpl::Impl as AsmPieceImpl +import codeql.rust.elements.Attr /** * INTERNAL: This module contains the fully generated definition of `AsmClobberAbi` and should not @@ -27,5 +28,25 @@ module Generated { */ class AsmClobberAbi extends Synth::TAsmClobberAbi, AsmPieceImpl::AsmPiece { override string getAPrimaryQlClass() { result = "AsmClobberAbi" } + + /** + * Gets the `index`th attr of this asm clobber abi (0-based). + */ + Attr getAttr(int index) { + result = + Synth::convertAttrFromRaw(Synth::convertAsmClobberAbiToRaw(this) + .(Raw::AsmClobberAbi) + .getAttr(index)) + } + + /** + * Gets any of the attrs of this asm clobber abi. + */ + final Attr getAnAttr() { result = this.getAttr(_) } + + /** + * Gets the number of attrs of this asm clobber abi. + */ + final int getNumberOfAttrs() { result = count(int i | exists(this.getAttr(i))) } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmOperandNamed.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmOperandNamed.qll index 158acb3aa48d..917866383a61 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmOperandNamed.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmOperandNamed.qll @@ -8,6 +8,7 @@ private import codeql.rust.elements.internal.generated.Synth private import codeql.rust.elements.internal.generated.Raw import codeql.rust.elements.AsmOperand import codeql.rust.elements.internal.AsmPieceImpl::Impl as AsmPieceImpl +import codeql.rust.elements.Attr import codeql.rust.elements.Name /** @@ -45,6 +46,26 @@ module Generated { */ final predicate hasAsmOperand() { exists(this.getAsmOperand()) } + /** + * Gets the `index`th attr of this asm operand named (0-based). + */ + Attr getAttr(int index) { + result = + Synth::convertAttrFromRaw(Synth::convertAsmOperandNamedToRaw(this) + .(Raw::AsmOperandNamed) + .getAttr(index)) + } + + /** + * Gets any of the attrs of this asm operand named. + */ + final Attr getAnAttr() { result = this.getAttr(_) } + + /** + * Gets the number of attrs of this asm operand named. + */ + final int getNumberOfAttrs() { result = count(int i | exists(this.getAttr(i))) } + /** * Gets the name of this asm operand named, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmOptionsList.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmOptionsList.qll index de8f7bccb0f8..e0c53f19f587 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmOptionsList.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmOptionsList.qll @@ -8,6 +8,7 @@ private import codeql.rust.elements.internal.generated.Synth private import codeql.rust.elements.internal.generated.Raw import codeql.rust.elements.AsmOption import codeql.rust.elements.internal.AsmPieceImpl::Impl as AsmPieceImpl +import codeql.rust.elements.Attr /** * INTERNAL: This module contains the fully generated definition of `AsmOptionsList` and should not @@ -48,5 +49,25 @@ module Generated { * Gets the number of asm options of this asm options list. */ final int getNumberOfAsmOptions() { result = count(int i | exists(this.getAsmOption(i))) } + + /** + * Gets the `index`th attr of this asm options list (0-based). + */ + Attr getAttr(int index) { + result = + Synth::convertAttrFromRaw(Synth::convertAsmOptionsListToRaw(this) + .(Raw::AsmOptionsList) + .getAttr(index)) + } + + /** + * Gets any of the attrs of this asm options list. + */ + final Attr getAnAttr() { result = this.getAttr(_) } + + /** + * Gets the number of attrs of this asm options list. + */ + final int getNumberOfAttrs() { result = count(int i | exists(this.getAttr(i))) } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/DerefPat.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/DerefPat.qll new file mode 100644 index 000000000000..713f42f81ce9 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/DerefPat.qll @@ -0,0 +1,36 @@ +// generated by codegen, do not edit +/** + * This module provides the generated definition of `DerefPat`. + * INTERNAL: Do not import directly. + */ + +private import codeql.rust.elements.internal.generated.Synth +private import codeql.rust.elements.internal.generated.Raw +import codeql.rust.elements.Pat +import codeql.rust.elements.internal.PatImpl::Impl as PatImpl + +/** + * INTERNAL: This module contains the fully generated definition of `DerefPat` and should not + * be referenced directly. + */ +module Generated { + /** + * INTERNAL: Do not reference the `Generated::DerefPat` class directly. + * Use the subclass `DerefPat`, where the following predicates are available. + */ + class DerefPat extends Synth::TDerefPat, PatImpl::Pat { + override string getAPrimaryQlClass() { result = "DerefPat" } + + /** + * Gets the pattern of this deref pattern, if it exists. + */ + Pat getPat() { + result = Synth::convertPatFromRaw(Synth::convertDerefPatToRaw(this).(Raw::DerefPat).getPat()) + } + + /** + * Holds if `getPat()` exists. + */ + final predicate hasPat() { exists(this.getPat()) } + } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsArg.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsArg.qll index 2c5ab6fe693c..80ca340284fa 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsArg.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsArg.qll @@ -8,7 +8,7 @@ private import codeql.rust.elements.internal.generated.Synth private import codeql.rust.elements.internal.generated.Raw import codeql.rust.elements.internal.AstNodeImpl::Impl as AstNodeImpl import codeql.rust.elements.Expr -import codeql.rust.elements.FormatArgsArgName +import codeql.rust.elements.Name /** * INTERNAL: This module contains the fully generated definition of `FormatArgsArg` and should not @@ -27,33 +27,33 @@ module Generated { override string getAPrimaryQlClass() { result = "FormatArgsArg" } /** - * Gets the argument name of this format arguments argument, if it exists. + * Gets the expression of this format arguments argument, if it exists. */ - FormatArgsArgName getArgName() { + Expr getExpr() { result = - Synth::convertFormatArgsArgNameFromRaw(Synth::convertFormatArgsArgToRaw(this) + Synth::convertExprFromRaw(Synth::convertFormatArgsArgToRaw(this) .(Raw::FormatArgsArg) - .getArgName()) + .getExpr()) } /** - * Holds if `getArgName()` exists. + * Holds if `getExpr()` exists. */ - final predicate hasArgName() { exists(this.getArgName()) } + final predicate hasExpr() { exists(this.getExpr()) } /** - * Gets the expression of this format arguments argument, if it exists. + * Gets the name of this format arguments argument, if it exists. */ - Expr getExpr() { + Name getName() { result = - Synth::convertExprFromRaw(Synth::convertFormatArgsArgToRaw(this) + Synth::convertNameFromRaw(Synth::convertFormatArgsArgToRaw(this) .(Raw::FormatArgsArg) - .getExpr()) + .getName()) } /** - * Holds if `getExpr()` exists. + * Holds if `getName()` exists. */ - final predicate hasExpr() { exists(this.getExpr()) } + final predicate hasName() { exists(this.getName()) } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsArgName.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsArgName.qll deleted file mode 100644 index ce83c40e161a..000000000000 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsArgName.qll +++ /dev/null @@ -1,23 +0,0 @@ -// generated by codegen, do not edit -/** - * This module provides the generated definition of `FormatArgsArgName`. - * INTERNAL: Do not import directly. - */ - -private import codeql.rust.elements.internal.generated.Synth -private import codeql.rust.elements.internal.generated.Raw -import codeql.rust.elements.internal.AstNodeImpl::Impl as AstNodeImpl - -/** - * INTERNAL: This module contains the fully generated definition of `FormatArgsArgName` and should not - * be referenced directly. - */ -module Generated { - /** - * INTERNAL: Do not reference the `Generated::FormatArgsArgName` class directly. - * Use the subclass `FormatArgsArgName`, where the following predicates are available. - */ - class FormatArgsArgName extends Synth::TFormatArgsArgName, AstNodeImpl::AstNode { - override string getAPrimaryQlClass() { result = "FormatArgsArgName" } - } -} diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ImplRestriction.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ImplRestriction.qll new file mode 100644 index 000000000000..d1b1badd535d --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ImplRestriction.qll @@ -0,0 +1,39 @@ +// generated by codegen, do not edit +/** + * This module provides the generated definition of `ImplRestriction`. + * INTERNAL: Do not import directly. + */ + +private import codeql.rust.elements.internal.generated.Synth +private import codeql.rust.elements.internal.generated.Raw +import codeql.rust.elements.internal.AstNodeImpl::Impl as AstNodeImpl +import codeql.rust.elements.VisibilityInner + +/** + * INTERNAL: This module contains the fully generated definition of `ImplRestriction` and should not + * be referenced directly. + */ +module Generated { + /** + * INTERNAL: Do not reference the `Generated::ImplRestriction` class directly. + * Use the subclass `ImplRestriction`, where the following predicates are available. + */ + class ImplRestriction extends Synth::TImplRestriction, AstNodeImpl::AstNode { + override string getAPrimaryQlClass() { result = "ImplRestriction" } + + /** + * Gets the visibility inner of this impl restriction, if it exists. + */ + VisibilityInner getVisibilityInner() { + result = + Synth::convertVisibilityInnerFromRaw(Synth::convertImplRestrictionToRaw(this) + .(Raw::ImplRestriction) + .getVisibilityInner()) + } + + /** + * Holds if `getVisibilityInner()` exists. + */ + final predicate hasVisibilityInner() { exists(this.getVisibilityInner()) } + } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/IncludeBytesExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/IncludeBytesExpr.qll new file mode 100644 index 000000000000..5b420b077a14 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/IncludeBytesExpr.qll @@ -0,0 +1,23 @@ +// generated by codegen, do not edit +/** + * This module provides the generated definition of `IncludeBytesExpr`. + * INTERNAL: Do not import directly. + */ + +private import codeql.rust.elements.internal.generated.Synth +private import codeql.rust.elements.internal.generated.Raw +import codeql.rust.elements.internal.ExprImpl::Impl as ExprImpl + +/** + * INTERNAL: This module contains the fully generated definition of `IncludeBytesExpr` and should not + * be referenced directly. + */ +module Generated { + /** + * INTERNAL: Do not reference the `Generated::IncludeBytesExpr` class directly. + * Use the subclass `IncludeBytesExpr`, where the following predicates are available. + */ + class IncludeBytesExpr extends Synth::TIncludeBytesExpr, ExprImpl::Expr { + override string getAPrimaryQlClass() { result = "IncludeBytesExpr" } + } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/MutRestriction.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/MutRestriction.qll new file mode 100644 index 000000000000..8210b63f876d --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/MutRestriction.qll @@ -0,0 +1,44 @@ +// generated by codegen, do not edit +/** + * This module provides the generated definition of `MutRestriction`. + * INTERNAL: Do not import directly. + */ + +private import codeql.rust.elements.internal.generated.Synth +private import codeql.rust.elements.internal.generated.Raw +import codeql.rust.elements.internal.AstNodeImpl::Impl as AstNodeImpl +import codeql.rust.elements.VisibilityInner + +/** + * INTERNAL: This module contains the fully generated definition of `MutRestriction` and should not + * be referenced directly. + */ +module Generated { + /** + * INTERNAL: Do not reference the `Generated::MutRestriction` class directly. + * Use the subclass `MutRestriction`, where the following predicates are available. + */ + class MutRestriction extends Synth::TMutRestriction, AstNodeImpl::AstNode { + override string getAPrimaryQlClass() { result = "MutRestriction" } + + /** + * Holds if this mut restriction is mut. + */ + predicate isMut() { Synth::convertMutRestrictionToRaw(this).(Raw::MutRestriction).isMut() } + + /** + * Gets the visibility inner of this mut restriction, if it exists. + */ + VisibilityInner getVisibilityInner() { + result = + Synth::convertVisibilityInnerFromRaw(Synth::convertMutRestrictionToRaw(this) + .(Raw::MutRestriction) + .getVisibilityInner()) + } + + /** + * Holds if `getVisibilityInner()` exists. + */ + final predicate hasVisibilityInner() { exists(this.getVisibilityInner()) } + } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/NotNull.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/NotNull.qll new file mode 100644 index 000000000000..65256d21d0ec --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/NotNull.qll @@ -0,0 +1,23 @@ +// generated by codegen, do not edit +/** + * This module provides the generated definition of `NotNull`. + * INTERNAL: Do not import directly. + */ + +private import codeql.rust.elements.internal.generated.Synth +private import codeql.rust.elements.internal.generated.Raw +import codeql.rust.elements.internal.PatImpl::Impl as PatImpl + +/** + * INTERNAL: This module contains the fully generated definition of `NotNull` and should not + * be referenced directly. + */ +module Generated { + /** + * INTERNAL: Do not reference the `Generated::NotNull` class directly. + * Use the subclass `NotNull`, where the following predicates are available. + */ + class NotNull extends Synth::TNotNull, PatImpl::Pat { + override string getAPrimaryQlClass() { result = "NotNull" } + } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll index c76fc01aecef..98f08ef82da7 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll @@ -188,26 +188,20 @@ private module Impl { private Element getImmediateChildOfFormatArgsArg( FormatArgsArg e, int index, string partialPredicateCall ) { - exists(int n, int nArgName, int nExpr | + exists(int n, int nExpr, int nName | n = 0 and - nArgName = n + 1 and - nExpr = nArgName + 1 and + nExpr = n + 1 and + nName = nExpr + 1 and ( none() or - index = n and result = e.getArgName() and partialPredicateCall = "ArgName()" + index = n and result = e.getExpr() and partialPredicateCall = "Expr()" or - index = nArgName and result = e.getExpr() and partialPredicateCall = "Expr()" + index = nExpr and result = e.getName() and partialPredicateCall = "Name()" ) ) } - private Element getImmediateChildOfFormatArgsArgName( - FormatArgsArgName e, int index, string partialPredicateCall - ) { - none() - } - private Element getImmediateChildOfGenericArgList( GenericArgList e, int index, string partialPredicateCall ) { @@ -238,6 +232,20 @@ private module Impl { ) } + private Element getImmediateChildOfImplRestriction( + ImplRestriction e, int index, string partialPredicateCall + ) { + exists(int n, int nVisibilityInner | + n = 0 and + nVisibilityInner = n + 1 and + ( + none() + or + index = n and result = e.getVisibilityInner() and partialPredicateCall = "VisibilityInner()" + ) + ) + } + private Element getImmediateChildOfItemList(ItemList e, int index, string partialPredicateCall) { exists(int n, int nAttr, int nItem | n = 0 and @@ -345,6 +353,20 @@ private module Impl { ) } + private Element getImmediateChildOfMutRestriction( + MutRestriction e, int index, string partialPredicateCall + ) { + exists(int n, int nVisibilityInner | + n = 0 and + nVisibilityInner = n + 1 and + ( + none() + or + index = n and result = e.getVisibilityInner() and partialPredicateCall = "VisibilityInner()" + ) + ) + } + private Element getImmediateChildOfName(Name e, int index, string partialPredicateCall) { none() } private Element getImmediateChildOfParamList(ParamList e, int index, string partialPredicateCall) { @@ -555,11 +577,15 @@ private module Impl { private Element getImmediateChildOfStructField( StructField e, int index, string partialPredicateCall ) { - exists(int n, int nAttr, int nDefaultVal, int nName, int nTypeRepr, int nVisibility | + exists( + int n, int nAttr, int nDefaultVal, int nMutRestriction, int nName, int nTypeRepr, + int nVisibility + | n = 0 and nAttr = n + e.getNumberOfAttrs() and nDefaultVal = nAttr + 1 and - nName = nDefaultVal + 1 and + nMutRestriction = nDefaultVal + 1 and + nName = nMutRestriction + 1 and nTypeRepr = nName + 1 and nVisibility = nTypeRepr + 1 and ( @@ -570,7 +596,11 @@ private module Impl { or index = nAttr and result = e.getDefaultVal() and partialPredicateCall = "DefaultVal()" or - index = nDefaultVal and result = e.getName() and partialPredicateCall = "Name()" + index = nDefaultVal and + result = e.getMutRestriction() and + partialPredicateCall = "MutRestriction()" + or + index = nMutRestriction and result = e.getName() and partialPredicateCall = "Name()" or index = nName and result = e.getTypeRepr() and partialPredicateCall = "TypeRepr()" or @@ -637,10 +667,11 @@ private module Impl { } private Element getImmediateChildOfTupleField(TupleField e, int index, string partialPredicateCall) { - exists(int n, int nAttr, int nTypeRepr, int nVisibility | + exists(int n, int nAttr, int nMutRestriction, int nTypeRepr, int nVisibility | n = 0 and nAttr = n + e.getNumberOfAttrs() and - nTypeRepr = nAttr + 1 and + nMutRestriction = nAttr + 1 and + nTypeRepr = nMutRestriction + 1 and nVisibility = nTypeRepr + 1 and ( none() @@ -648,7 +679,11 @@ private module Impl { result = e.getAttr(index - n) and partialPredicateCall = "Attr(" + (index - n).toString() + ")" or - index = nAttr and result = e.getTypeRepr() and partialPredicateCall = "TypeRepr()" + index = nAttr and + result = e.getMutRestriction() and + partialPredicateCall = "MutRestriction()" + or + index = nMutRestriction and result = e.getTypeRepr() and partialPredicateCall = "TypeRepr()" or index = nTypeRepr and result = e.getVisibility() and partialPredicateCall = "Visibility()" ) @@ -757,6 +792,20 @@ private module Impl { } private Element getImmediateChildOfVisibility(Visibility e, int index, string partialPredicateCall) { + exists(int n, int nVisibilityInner | + n = 0 and + nVisibilityInner = n + 1 and + ( + none() + or + index = n and result = e.getVisibilityInner() and partialPredicateCall = "VisibilityInner()" + ) + ) + } + + private Element getImmediateChildOfVisibilityInner( + VisibilityInner e, int index, string partialPredicateCall + ) { exists(int n, int nPath | n = 0 and nPath = n + 1 and @@ -847,7 +896,16 @@ private module Impl { private Element getImmediateChildOfAsmClobberAbi( AsmClobberAbi e, int index, string partialPredicateCall ) { - none() + exists(int n, int nAttr | + n = 0 and + nAttr = n + e.getNumberOfAttrs() and + ( + none() + or + result = e.getAttr(index - n) and + partialPredicateCall = "Attr(" + (index - n).toString() + ")" + ) + ) } private Element getImmediateChildOfAsmConst(AsmConst e, int index, string partialPredicateCall) { @@ -877,16 +935,20 @@ private module Impl { private Element getImmediateChildOfAsmOperandNamed( AsmOperandNamed e, int index, string partialPredicateCall ) { - exists(int n, int nAsmOperand, int nName | + exists(int n, int nAsmOperand, int nAttr, int nName | n = 0 and nAsmOperand = n + 1 and - nName = nAsmOperand + 1 and + nAttr = nAsmOperand + e.getNumberOfAttrs() and + nName = nAttr + 1 and ( none() or index = n and result = e.getAsmOperand() and partialPredicateCall = "AsmOperand()" or - index = nAsmOperand and result = e.getName() and partialPredicateCall = "Name()" + result = e.getAttr(index - nAsmOperand) and + partialPredicateCall = "Attr(" + (index - nAsmOperand).toString() + ")" + or + index = nAttr and result = e.getName() and partialPredicateCall = "Name()" ) ) } @@ -894,14 +956,18 @@ private module Impl { private Element getImmediateChildOfAsmOptionsList( AsmOptionsList e, int index, string partialPredicateCall ) { - exists(int n, int nAsmOption | + exists(int n, int nAsmOption, int nAttr | n = 0 and nAsmOption = n + e.getNumberOfAsmOptions() and + nAttr = nAsmOption + e.getNumberOfAttrs() and ( none() or result = e.getAsmOption(index - n) and partialPredicateCall = "AsmOption(" + (index - n).toString() + ")" + or + result = e.getAttr(index - nAsmOption) and + partialPredicateCall = "Attr(" + (index - nAsmOption).toString() + ")" ) ) } @@ -1256,6 +1322,18 @@ private module Impl { ) } + private Element getImmediateChildOfDerefPat(DerefPat e, int index, string partialPredicateCall) { + exists(int n, int nPat | + n = 0 and + nPat = n + 1 and + ( + none() + or + index = n and result = e.getPat() and partialPredicateCall = "Pat()" + ) + ) + } + private Element getImmediateChildOfDynTraitTypeRepr( DynTraitTypeRepr e, int index, string partialPredicateCall ) { @@ -1419,6 +1497,12 @@ private module Impl { ) } + private Element getImmediateChildOfIncludeBytesExpr( + IncludeBytesExpr e, int index, string partialPredicateCall + ) { + none() + } + private Element getImmediateChildOfIndexExpr(IndexExpr e, int index, string partialPredicateCall) { exists(int n, int nAttr, int nBase, int nIndex | n = 0 and @@ -1673,6 +1757,10 @@ private module Impl { none() } + private Element getImmediateChildOfNotNull(NotNull e, int index, string partialPredicateCall) { + none() + } + private Element getImmediateChildOfOffsetOfExpr( OffsetOfExpr e, int index, string partialPredicateCall ) { @@ -1807,6 +1895,23 @@ private module Impl { ) } + private Element getImmediateChildOfPatternTypeRepr( + PatternTypeRepr e, int index, string partialPredicateCall + ) { + exists(int n, int nPat, int nTypeRepr | + n = 0 and + nPat = n + 1 and + nTypeRepr = nPat + 1 and + ( + none() + or + index = n and result = e.getPat() and partialPredicateCall = "Pat()" + or + index = nPat and result = e.getTypeRepr() and partialPredicateCall = "TypeRepr()" + ) + ) + } + private Element getImmediateChildOfPrefixExpr(PrefixExpr e, int index, string partialPredicateCall) { exists(int n, int nAttr, int nExpr | n = 0 and @@ -2596,14 +2701,15 @@ private module Impl { private Element getImmediateChildOfTrait(Trait e, int index, string partialPredicateCall) { exists( int n, int nAttributeMacroExpansion, int nAssocItemList, int nAttr, int nGenericParamList, - int nName, int nTypeBoundList, int nVisibility, int nWhereClause + int nImplRestriction, int nName, int nTypeBoundList, int nVisibility, int nWhereClause | n = 0 and nAttributeMacroExpansion = n + 1 and nAssocItemList = nAttributeMacroExpansion + 1 and nAttr = nAssocItemList + e.getNumberOfAttrs() and nGenericParamList = nAttr + 1 and - nName = nGenericParamList + 1 and + nImplRestriction = nGenericParamList + 1 and + nName = nImplRestriction + 1 and nTypeBoundList = nName + 1 and nVisibility = nTypeBoundList + 1 and nWhereClause = nVisibility + 1 and @@ -2625,7 +2731,11 @@ private module Impl { result = e.getGenericParamList() and partialPredicateCall = "GenericParamList()" or - index = nGenericParamList and result = e.getName() and partialPredicateCall = "Name()" + index = nGenericParamList and + result = e.getImplRestriction() and + partialPredicateCall = "ImplRestriction()" + or + index = nImplRestriction and result = e.getName() and partialPredicateCall = "Name()" or index = nName and result = e.getTypeBoundList() and partialPredicateCall = "TypeBoundList()" or @@ -3117,12 +3227,12 @@ private module Impl { or result = getImmediateChildOfFormatArgsArg(e, index, partialAccessor) or - result = getImmediateChildOfFormatArgsArgName(e, index, partialAccessor) - or result = getImmediateChildOfGenericArgList(e, index, partialAccessor) or result = getImmediateChildOfGenericParamList(e, index, partialAccessor) or + result = getImmediateChildOfImplRestriction(e, index, partialAccessor) + or result = getImmediateChildOfItemList(e, index, partialAccessor) or result = getImmediateChildOfLabel(e, index, partialAccessor) @@ -3137,6 +3247,8 @@ private module Impl { or result = getImmediateChildOfMatchGuard(e, index, partialAccessor) or + result = getImmediateChildOfMutRestriction(e, index, partialAccessor) + or result = getImmediateChildOfName(e, index, partialAccessor) or result = getImmediateChildOfParamList(e, index, partialAccessor) @@ -3187,6 +3299,8 @@ private module Impl { or result = getImmediateChildOfVisibility(e, index, partialAccessor) or + result = getImmediateChildOfVisibilityInner(e, index, partialAccessor) + or result = getImmediateChildOfWhereClause(e, index, partialAccessor) or result = getImmediateChildOfWherePred(e, index, partialAccessor) @@ -3245,6 +3359,8 @@ private module Impl { or result = getImmediateChildOfContinueExpr(e, index, partialAccessor) or + result = getImmediateChildOfDerefPat(e, index, partialAccessor) + or result = getImmediateChildOfDynTraitTypeRepr(e, index, partialAccessor) or result = getImmediateChildOfExprStmt(e, index, partialAccessor) @@ -3263,6 +3379,8 @@ private module Impl { or result = getImmediateChildOfImplTraitTypeRepr(e, index, partialAccessor) or + result = getImmediateChildOfIncludeBytesExpr(e, index, partialAccessor) + or result = getImmediateChildOfIndexExpr(e, index, partialAccessor) or result = getImmediateChildOfInferTypeRepr(e, index, partialAccessor) @@ -3297,6 +3415,8 @@ private module Impl { or result = getImmediateChildOfNeverTypeRepr(e, index, partialAccessor) or + result = getImmediateChildOfNotNull(e, index, partialAccessor) + or result = getImmediateChildOfOffsetOfExpr(e, index, partialAccessor) or result = getImmediateChildOfOrPat(e, index, partialAccessor) @@ -3315,6 +3435,8 @@ private module Impl { or result = getImmediateChildOfPathTypeRepr(e, index, partialAccessor) or + result = getImmediateChildOfPatternTypeRepr(e, index, partialAccessor) + or result = getImmediateChildOfPrefixExpr(e, index, partialAccessor) or result = getImmediateChildOfPtrTypeRepr(e, index, partialAccessor) diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/PatternTypeRepr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/PatternTypeRepr.qll new file mode 100644 index 000000000000..bb009f83b4e4 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/PatternTypeRepr.qll @@ -0,0 +1,55 @@ +// generated by codegen, do not edit +/** + * This module provides the generated definition of `PatternTypeRepr`. + * INTERNAL: Do not import directly. + */ + +private import codeql.rust.elements.internal.generated.Synth +private import codeql.rust.elements.internal.generated.Raw +import codeql.rust.elements.Pat +import codeql.rust.elements.TypeRepr +import codeql.rust.elements.internal.TypeReprImpl::Impl as TypeReprImpl + +/** + * INTERNAL: This module contains the fully generated definition of `PatternTypeRepr` and should not + * be referenced directly. + */ +module Generated { + /** + * INTERNAL: Do not reference the `Generated::PatternTypeRepr` class directly. + * Use the subclass `PatternTypeRepr`, where the following predicates are available. + */ + class PatternTypeRepr extends Synth::TPatternTypeRepr, TypeReprImpl::TypeRepr { + override string getAPrimaryQlClass() { result = "PatternTypeRepr" } + + /** + * Gets the pattern of this pattern type representation, if it exists. + */ + Pat getPat() { + result = + Synth::convertPatFromRaw(Synth::convertPatternTypeReprToRaw(this) + .(Raw::PatternTypeRepr) + .getPat()) + } + + /** + * Holds if `getPat()` exists. + */ + final predicate hasPat() { exists(this.getPat()) } + + /** + * Gets the type representation of this pattern type representation, if it exists. + */ + TypeRepr getTypeRepr() { + result = + Synth::convertTypeReprFromRaw(Synth::convertPatternTypeReprToRaw(this) + .(Raw::PatternTypeRepr) + .getTypeRepr()) + } + + /** + * Holds if `getTypeRepr()` exists. + */ + final predicate hasTypeRepr() { exists(this.getTypeRepr()) } + } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll index 3caf2b58e28e..8df01e4566b6 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll @@ -543,40 +543,31 @@ module Raw { override string toString() { result = "FormatArgsArg" } /** - * Gets the argument name of this format arguments argument, if it exists. + * Gets the expression of this format arguments argument, if it exists. */ - FormatArgsArgName getArgName() { format_args_arg_arg_names(this, result) } + Expr getExpr() { format_args_arg_exprs(this, result) } /** - * Gets the expression of this format arguments argument, if it exists. + * Gets the name of this format arguments argument, if it exists. */ - Expr getExpr() { format_args_arg_exprs(this, result) } + Name getName() { format_args_arg_names(this, result) } } private Element getImmediateChildOfFormatArgsArg(FormatArgsArg e, int index) { - exists(int n, int nArgName, int nExpr | + exists(int n, int nExpr, int nName | n = 0 and - nArgName = n + 1 and - nExpr = nArgName + 1 and + nExpr = n + 1 and + nName = nExpr + 1 and ( none() or - index = n and result = e.getArgName() + index = n and result = e.getExpr() or - index = nArgName and result = e.getExpr() + index = nExpr and result = e.getName() ) ) } - /** - * INTERNAL: Do not use. - */ - class FormatArgsArgName extends @format_args_arg_name, AstNode { - override string toString() { result = "FormatArgsArgName" } - } - - private Element getImmediateChildOfFormatArgsArgName(FormatArgsArgName e, int index) { none() } - /** * INTERNAL: Do not use. * A generic argument in a generic argument list. @@ -676,6 +667,30 @@ module Raw { ) } + /** + * INTERNAL: Do not use. + */ + class ImplRestriction extends @impl_restriction, AstNode { + override string toString() { result = "ImplRestriction" } + + /** + * Gets the visibility inner of this impl restriction, if it exists. + */ + VisibilityInner getVisibilityInner() { impl_restriction_visibility_inners(this, result) } + } + + private Element getImmediateChildOfImplRestriction(ImplRestriction e, int index) { + exists(int n, int nVisibilityInner | + n = 0 and + nVisibilityInner = n + 1 and + ( + none() + or + index = n and result = e.getVisibilityInner() + ) + ) + } + /** * INTERNAL: Do not use. * A list of items in a module or block. @@ -1004,6 +1019,35 @@ module Raw { */ class Meta extends @meta, AstNode { } + /** + * INTERNAL: Do not use. + */ + class MutRestriction extends @mut_restriction, AstNode { + override string toString() { result = "MutRestriction" } + + /** + * Holds if this mut restriction is mut. + */ + predicate isMut() { mut_restriction_is_mut(this) } + + /** + * Gets the visibility inner of this mut restriction, if it exists. + */ + VisibilityInner getVisibilityInner() { mut_restriction_visibility_inners(this, result) } + } + + private Element getImmediateChildOfMutRestriction(MutRestriction e, int index) { + exists(int n, int nVisibilityInner | + n = 0 and + nVisibilityInner = n + 1 and + ( + none() + or + index = n and result = e.getVisibilityInner() + ) + ) + } + /** * INTERNAL: Do not use. * An identifier name. @@ -1621,6 +1665,11 @@ module Raw { */ predicate isUnsafe() { struct_field_is_unsafe(this) } + /** + * Gets the mut restriction of this struct field, if it exists. + */ + MutRestriction getMutRestriction() { struct_field_mut_restrictions(this, result) } + /** * Gets the name of this struct field, if it exists. */ @@ -1638,11 +1687,15 @@ module Raw { } private Element getImmediateChildOfStructField(StructField e, int index) { - exists(int n, int nAttr, int nDefaultVal, int nName, int nTypeRepr, int nVisibility | + exists( + int n, int nAttr, int nDefaultVal, int nMutRestriction, int nName, int nTypeRepr, + int nVisibility + | n = 0 and nAttr = n + e.getNumberOfAttrs() and nDefaultVal = nAttr + 1 and - nName = nDefaultVal + 1 and + nMutRestriction = nDefaultVal + 1 and + nName = nMutRestriction + 1 and nTypeRepr = nName + 1 and nVisibility = nTypeRepr + 1 and ( @@ -1652,7 +1705,9 @@ module Raw { or index = nAttr and result = e.getDefaultVal() or - index = nDefaultVal and result = e.getName() + index = nDefaultVal and result = e.getMutRestriction() + or + index = nMutRestriction and result = e.getName() or index = nName and result = e.getTypeRepr() or @@ -1832,6 +1887,11 @@ module Raw { */ int getNumberOfAttrs() { result = count(int i | tuple_field_attrs(this, i, _)) } + /** + * Gets the mut restriction of this tuple field, if it exists. + */ + MutRestriction getMutRestriction() { tuple_field_mut_restrictions(this, result) } + /** * Gets the type representation of this tuple field, if it exists. */ @@ -1844,17 +1904,20 @@ module Raw { } private Element getImmediateChildOfTupleField(TupleField e, int index) { - exists(int n, int nAttr, int nTypeRepr, int nVisibility | + exists(int n, int nAttr, int nMutRestriction, int nTypeRepr, int nVisibility | n = 0 and nAttr = n + e.getNumberOfAttrs() and - nTypeRepr = nAttr + 1 and + nMutRestriction = nAttr + 1 and + nTypeRepr = nMutRestriction + 1 and nVisibility = nTypeRepr + 1 and ( none() or result = e.getAttr(index - n) or - index = nAttr and result = e.getTypeRepr() + index = nAttr and result = e.getMutRestriction() + or + index = nMutRestriction and result = e.getTypeRepr() or index = nTypeRepr and result = e.getVisibility() ) @@ -2158,12 +2221,36 @@ module Raw { override string toString() { result = "Visibility" } /** - * Gets the path of this visibility, if it exists. + * Gets the visibility inner of this visibility, if it exists. */ - Path getPath() { visibility_paths(this, result) } + VisibilityInner getVisibilityInner() { visibility_visibility_inners(this, result) } } private Element getImmediateChildOfVisibility(Visibility e, int index) { + exists(int n, int nVisibilityInner | + n = 0 and + nVisibilityInner = n + 1 and + ( + none() + or + index = n and result = e.getVisibilityInner() + ) + ) + } + + /** + * INTERNAL: Do not use. + */ + class VisibilityInner extends @visibility_inner, AstNode { + override string toString() { result = "VisibilityInner" } + + /** + * Gets the path of this visibility inner, if it exists. + */ + Path getPath() { visibility_inner_paths(this, result) } + } + + private Element getImmediateChildOfVisibilityInner(VisibilityInner e, int index) { exists(int n, int nPath | n = 0 and nPath = n + 1 and @@ -2367,9 +2454,29 @@ module Raw { */ class AsmClobberAbi extends @asm_clobber_abi, AsmPiece { override string toString() { result = "AsmClobberAbi" } + + /** + * Gets the `index`th attr of this asm clobber abi (0-based). + */ + Attr getAttr(int index) { asm_clobber_abi_attrs(this, index, result) } + + /** + * Gets the number of attrs of this asm clobber abi. + */ + int getNumberOfAttrs() { result = count(int i | asm_clobber_abi_attrs(this, i, _)) } } - private Element getImmediateChildOfAsmClobberAbi(AsmClobberAbi e, int index) { none() } + private Element getImmediateChildOfAsmClobberAbi(AsmClobberAbi e, int index) { + exists(int n, int nAttr | + n = 0 and + nAttr = n + e.getNumberOfAttrs() and + ( + none() + or + result = e.getAttr(index - n) + ) + ) + } /** * INTERNAL: Do not use. @@ -2462,6 +2569,16 @@ module Raw { */ AsmOperand getAsmOperand() { asm_operand_named_asm_operands(this, result) } + /** + * Gets the `index`th attr of this asm operand named (0-based). + */ + Attr getAttr(int index) { asm_operand_named_attrs(this, index, result) } + + /** + * Gets the number of attrs of this asm operand named. + */ + int getNumberOfAttrs() { result = count(int i | asm_operand_named_attrs(this, i, _)) } + /** * Gets the name of this asm operand named, if it exists. */ @@ -2469,16 +2586,19 @@ module Raw { } private Element getImmediateChildOfAsmOperandNamed(AsmOperandNamed e, int index) { - exists(int n, int nAsmOperand, int nName | + exists(int n, int nAsmOperand, int nAttr, int nName | n = 0 and nAsmOperand = n + 1 and - nName = nAsmOperand + 1 and + nAttr = nAsmOperand + e.getNumberOfAttrs() and + nName = nAttr + 1 and ( none() or index = n and result = e.getAsmOperand() or - index = nAsmOperand and result = e.getName() + result = e.getAttr(index - nAsmOperand) + or + index = nAttr and result = e.getName() ) ) } @@ -2506,16 +2626,29 @@ module Raw { * Gets the number of asm options of this asm options list. */ int getNumberOfAsmOptions() { result = count(int i | asm_options_list_asm_options(this, i, _)) } + + /** + * Gets the `index`th attr of this asm options list (0-based). + */ + Attr getAttr(int index) { asm_options_list_attrs(this, index, result) } + + /** + * Gets the number of attrs of this asm options list. + */ + int getNumberOfAttrs() { result = count(int i | asm_options_list_attrs(this, i, _)) } } private Element getImmediateChildOfAsmOptionsList(AsmOptionsList e, int index) { - exists(int n, int nAsmOption | + exists(int n, int nAsmOption, int nAttr | n = 0 and nAsmOption = n + e.getNumberOfAsmOptions() and + nAttr = nAsmOption + e.getNumberOfAttrs() and ( none() or result = e.getAsmOption(index - n) + or + result = e.getAttr(index - nAsmOption) ) ) } @@ -3440,6 +3573,30 @@ module Raw { ) } + /** + * INTERNAL: Do not use. + */ + class DerefPat extends @deref_pat, Pat { + override string toString() { result = "DerefPat" } + + /** + * Gets the pattern of this deref pattern, if it exists. + */ + Pat getPat() { deref_pat_pats(this, result) } + } + + private Element getImmediateChildOfDerefPat(DerefPat e, int index) { + exists(int n, int nPat | + n = 0 and + nPat = n + 1 and + ( + none() + or + index = n and result = e.getPat() + ) + ) + } + /** * INTERNAL: Do not use. * A dynamic trait object type. @@ -3875,6 +4032,15 @@ module Raw { ) } + /** + * INTERNAL: Do not use. + */ + class IncludeBytesExpr extends @include_bytes_expr, Expr { + override string toString() { result = "IncludeBytesExpr" } + } + + private Element getImmediateChildOfIncludeBytesExpr(IncludeBytesExpr e, int index) { none() } + /** * INTERNAL: Do not use. * An index expression. For example: @@ -4573,6 +4739,15 @@ module Raw { private Element getImmediateChildOfNeverTypeRepr(NeverTypeRepr e, int index) { none() } + /** + * INTERNAL: Do not use. + */ + class NotNull extends @not_null, Pat { + override string toString() { result = "NotNull" } + } + + private Element getImmediateChildOfNotNull(NotNull e, int index) { none() } + /** * INTERNAL: Do not use. * An `offset_of` expression. For example: @@ -4888,6 +5063,38 @@ module Raw { ) } + /** + * INTERNAL: Do not use. + */ + class PatternTypeRepr extends @pattern_type_repr, TypeRepr { + override string toString() { result = "PatternTypeRepr" } + + /** + * Gets the pattern of this pattern type representation, if it exists. + */ + Pat getPat() { pattern_type_repr_pats(this, result) } + + /** + * Gets the type representation of this pattern type representation, if it exists. + */ + TypeRepr getTypeRepr() { pattern_type_repr_type_reprs(this, result) } + } + + private Element getImmediateChildOfPatternTypeRepr(PatternTypeRepr e, int index) { + exists(int n, int nPat, int nTypeRepr | + n = 0 and + nPat = n + 1 and + nTypeRepr = nPat + 1 and + ( + none() + or + index = n and result = e.getPat() + or + index = nPat and result = e.getTypeRepr() + ) + ) + } + /** * INTERNAL: Do not use. * A unary operation expression. For example: @@ -6831,6 +7038,11 @@ module Raw { */ GenericParamList getGenericParamList() { trait_generic_param_lists(this, result) } + /** + * Gets the impl restriction of this trait, if it exists. + */ + ImplRestriction getImplRestriction() { trait_impl_restrictions(this, result) } + /** * Holds if this trait is auto. */ @@ -6865,14 +7077,15 @@ module Raw { private Element getImmediateChildOfTrait(Trait e, int index) { exists( int n, int nAttributeMacroExpansion, int nAssocItemList, int nAttr, int nGenericParamList, - int nName, int nTypeBoundList, int nVisibility, int nWhereClause + int nImplRestriction, int nName, int nTypeBoundList, int nVisibility, int nWhereClause | n = 0 and nAttributeMacroExpansion = n + 1 and nAssocItemList = nAttributeMacroExpansion + 1 and nAttr = nAssocItemList + e.getNumberOfAttrs() and nGenericParamList = nAttr + 1 and - nName = nGenericParamList + 1 and + nImplRestriction = nGenericParamList + 1 and + nName = nImplRestriction + 1 and nTypeBoundList = nName + 1 and nVisibility = nTypeBoundList + 1 and nWhereClause = nVisibility + 1 and @@ -6887,7 +7100,9 @@ module Raw { or index = nAttr and result = e.getGenericParamList() or - index = nGenericParamList and result = e.getName() + index = nGenericParamList and result = e.getImplRestriction() + or + index = nImplRestriction and result = e.getName() or index = nName and result = e.getTypeBoundList() or @@ -7855,12 +8070,12 @@ module Raw { or result = getImmediateChildOfFormatArgsArg(e, index) or - result = getImmediateChildOfFormatArgsArgName(e, index) - or result = getImmediateChildOfGenericArgList(e, index) or result = getImmediateChildOfGenericParamList(e, index) or + result = getImmediateChildOfImplRestriction(e, index) + or result = getImmediateChildOfItemList(e, index) or result = getImmediateChildOfLabel(e, index) @@ -7875,6 +8090,8 @@ module Raw { or result = getImmediateChildOfMatchGuard(e, index) or + result = getImmediateChildOfMutRestriction(e, index) + or result = getImmediateChildOfName(e, index) or result = getImmediateChildOfParamList(e, index) @@ -7925,6 +8142,8 @@ module Raw { or result = getImmediateChildOfVisibility(e, index) or + result = getImmediateChildOfVisibilityInner(e, index) + or result = getImmediateChildOfWhereClause(e, index) or result = getImmediateChildOfWherePred(e, index) @@ -7983,6 +8202,8 @@ module Raw { or result = getImmediateChildOfContinueExpr(e, index) or + result = getImmediateChildOfDerefPat(e, index) + or result = getImmediateChildOfDynTraitTypeRepr(e, index) or result = getImmediateChildOfExprStmt(e, index) @@ -8001,6 +8222,8 @@ module Raw { or result = getImmediateChildOfImplTraitTypeRepr(e, index) or + result = getImmediateChildOfIncludeBytesExpr(e, index) + or result = getImmediateChildOfIndexExpr(e, index) or result = getImmediateChildOfInferTypeRepr(e, index) @@ -8035,6 +8258,8 @@ module Raw { or result = getImmediateChildOfNeverTypeRepr(e, index) or + result = getImmediateChildOfNotNull(e, index) + or result = getImmediateChildOfOffsetOfExpr(e, index) or result = getImmediateChildOfOrPat(e, index) @@ -8053,6 +8278,8 @@ module Raw { or result = getImmediateChildOfPathTypeRepr(e, index) or + result = getImmediateChildOfPatternTypeRepr(e, index) + or result = getImmediateChildOfPrefixExpr(e, index) or result = getImmediateChildOfPtrTypeRepr(e, index) diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/StructField.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/StructField.qll index bbad0ec97fc7..2e540f11314f 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/StructField.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/StructField.qll @@ -9,6 +9,7 @@ private import codeql.rust.elements.internal.generated.Raw import codeql.rust.elements.internal.AstNodeImpl::Impl as AstNodeImpl import codeql.rust.elements.Attr import codeql.rust.elements.ConstArg +import codeql.rust.elements.MutRestriction import codeql.rust.elements.Name import codeql.rust.elements.TypeRepr import codeql.rust.elements.Visibility @@ -72,6 +73,21 @@ module Generated { */ predicate isUnsafe() { Synth::convertStructFieldToRaw(this).(Raw::StructField).isUnsafe() } + /** + * Gets the mut restriction of this struct field, if it exists. + */ + MutRestriction getMutRestriction() { + result = + Synth::convertMutRestrictionFromRaw(Synth::convertStructFieldToRaw(this) + .(Raw::StructField) + .getMutRestriction()) + } + + /** + * Holds if `getMutRestriction()` exists. + */ + final predicate hasMutRestriction() { exists(this.getMutRestriction()) } + /** * Gets the name of this struct field, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Synth.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Synth.qll index bff6809686f8..add9d9a14dcd 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Synth.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Synth.qll @@ -178,6 +178,10 @@ module Synth { * INTERNAL: Do not use. */ TCrate(Raw::Crate id) { constructCrate(id) } or + /** + * INTERNAL: Do not use. + */ + TDerefPat(Raw::DerefPat id) { constructDerefPat(id) } or /** * INTERNAL: Do not use. */ @@ -236,10 +240,6 @@ module Synth { * INTERNAL: Do not use. */ TFormatArgsArg(Raw::FormatArgsArg id) { constructFormatArgsArg(id) } or - /** - * INTERNAL: Do not use. - */ - TFormatArgsArgName(Raw::FormatArgsArgName id) { constructFormatArgsArgName(id) } or /** * INTERNAL: Do not use. */ @@ -282,10 +282,18 @@ module Synth { * INTERNAL: Do not use. */ TImpl(Raw::Impl id) { constructImpl(id) } or + /** + * INTERNAL: Do not use. + */ + TImplRestriction(Raw::ImplRestriction id) { constructImplRestriction(id) } or /** * INTERNAL: Do not use. */ TImplTraitTypeRepr(Raw::ImplTraitTypeRepr id) { constructImplTraitTypeRepr(id) } or + /** + * INTERNAL: Do not use. + */ + TIncludeBytesExpr(Raw::IncludeBytesExpr id) { constructIncludeBytesExpr(id) } or /** * INTERNAL: Do not use. */ @@ -398,6 +406,10 @@ module Synth { * INTERNAL: Do not use. */ TModule(Raw::Module id) { constructModule(id) } or + /** + * INTERNAL: Do not use. + */ + TMutRestriction(Raw::MutRestriction id) { constructMutRestriction(id) } or /** * INTERNAL: Do not use. */ @@ -414,6 +426,10 @@ module Synth { * INTERNAL: Do not use. */ TNeverTypeRepr(Raw::NeverTypeRepr id) { constructNeverTypeRepr(id) } or + /** + * INTERNAL: Do not use. + */ + TNotNull(Raw::NotNull id) { constructNotNull(id) } or /** * INTERNAL: Do not use. */ @@ -470,6 +486,10 @@ module Synth { * INTERNAL: Do not use. */ TPathTypeRepr(Raw::PathTypeRepr id) { constructPathTypeRepr(id) } or + /** + * INTERNAL: Do not use. + */ + TPatternTypeRepr(Raw::PatternTypeRepr id) { constructPatternTypeRepr(id) } or /** * INTERNAL: Do not use. */ @@ -686,6 +706,10 @@ module Synth { * INTERNAL: Do not use. */ TVisibility(Raw::Visibility id) { constructVisibility(id) } or + /** + * INTERNAL: Do not use. + */ + TVisibilityInner(Raw::VisibilityInner id) { constructVisibilityInner(id) } or /** * INTERNAL: Do not use. */ @@ -743,15 +767,16 @@ module Synth { TAbi or TAddressable or TArgList or TAsmDirSpec or TAsmOperand or TAsmOperandExpr or TAsmOption or TAsmPiece or TAsmRegSpec or TAssocItemList or TAttr or TCallable or TCfgPredicate or TExpr or TExternItemList or TFieldList or TForBinder or TFormatArgsArg or - TFormatArgsArgName or TGenericArg or TGenericArgList or TGenericParam or - TGenericParamList or TItemList or TLabel or TLetElse or TMacroItems or TMatchArm or - TMatchArmList or TMatchGuard or TMeta or TName or TParamBase or TParamList or + TGenericArg or TGenericArgList or TGenericParam or TGenericParamList or TImplRestriction or + TItemList or TLabel or TLetElse or TMacroItems or TMatchArm or TMatchArmList or + TMatchGuard or TMeta or TMutRestriction or TName or TParamBase or TParamList or TParenthesizedArgList or TPat or TPath or TPathAstNode or TPathSegment or TRename or TRetTypeRepr or TReturnTypeSyntax or TSourceFile or TStmt or TStmtList or TStructExprField or TStructExprFieldList or TStructField or TStructPatField or TStructPatFieldList or TToken or TTokenTree or TTryBlockModifier or TTupleField or TTypeBound or TTypeBoundList or TTypeRepr or TUseBoundGenericArg or TUseBoundGenericArgs or - TUseTree or TUseTreeList or TVariantList or TVisibility or TWhereClause or TWherePred; + TUseTree or TUseTreeList or TVariantList or TVisibility or TVisibilityInner or + TWhereClause or TWherePred; /** * INTERNAL: Do not use. @@ -769,10 +794,10 @@ module Synth { class TExpr = TArrayExpr or TArrayExprInternal or TAsmExpr or TAwaitExpr or TBecomeExpr or TBinaryExpr or TBreakExpr or TCallExpr or TCastExpr or TClosureExpr or TContinueExpr or TFieldExpr or - TFormatArgsExpr or TIfExpr or TIndexExpr or TLabelableExpr or TLetExpr or TLiteralExpr or - TMacroExpr or TMatchExpr or TMethodCallExpr or TOffsetOfExpr or TParenExpr or - TPathExprBase or TPrefixExpr or TRangeExpr or TRefExpr or TReturnExpr or TStructExpr or - TTryExpr or TTupleExpr or TUnderscoreExpr or TYeetExpr or TYieldExpr; + TFormatArgsExpr or TIfExpr or TIncludeBytesExpr or TIndexExpr or TLabelableExpr or + TLetExpr or TLiteralExpr or TMacroExpr or TMatchExpr or TMethodCallExpr or TOffsetOfExpr or + TParenExpr or TPathExprBase or TPrefixExpr or TRangeExpr or TRefExpr or TReturnExpr or + TStructExpr or TTryExpr or TTupleExpr or TUnderscoreExpr or TYeetExpr or TYieldExpr; /** * INTERNAL: Do not use. @@ -831,9 +856,9 @@ module Synth { * INTERNAL: Do not use. */ class TPat = - TBoxPat or TConstBlockPat or TIdentPat or TLiteralPat or TMacroPat or TOrPat or TParenPat or - TPathPat or TRangePat or TRefPat or TRestPat or TSlicePat or TStructPat or TTuplePat or - TTupleStructPat or TWildcardPat; + TBoxPat or TConstBlockPat or TDerefPat or TIdentPat or TLiteralPat or TMacroPat or TNotNull or + TOrPat or TParenPat or TPathPat or TRangePat or TRefPat or TRestPat or TSlicePat or + TStructPat or TTuplePat or TTupleStructPat or TWildcardPat; /** * INTERNAL: Do not use. @@ -866,7 +891,7 @@ module Synth { class TTypeRepr = TArrayTypeRepr or TDynTraitTypeRepr or TFnPtrTypeRepr or TForTypeRepr or TImplTraitTypeRepr or TInferTypeRepr or TMacroTypeRepr or TNeverTypeRepr or TParenTypeRepr or TPathTypeRepr or - TPtrTypeRepr or TRefTypeRepr or TSliceTypeRepr or TTupleTypeRepr; + TPatternTypeRepr or TPtrTypeRepr or TRefTypeRepr or TSliceTypeRepr or TTupleTypeRepr; /** * INTERNAL: Do not use. @@ -1182,6 +1207,13 @@ module Synth { */ TCrate convertCrateFromRaw(Raw::Element e) { result = TCrate(e) } + /** + * INTERNAL: Do not use. + * + * Converts a raw element to a synthesized `TDerefPat`, if possible. + */ + TDerefPat convertDerefPatFromRaw(Raw::Element e) { result = TDerefPat(e) } + /** * INTERNAL: Do not use. * @@ -1280,15 +1312,6 @@ module Synth { */ TFormatArgsArg convertFormatArgsArgFromRaw(Raw::Element e) { result = TFormatArgsArg(e) } - /** - * INTERNAL: Do not use. - * - * Converts a raw element to a synthesized `TFormatArgsArgName`, if possible. - */ - TFormatArgsArgName convertFormatArgsArgNameFromRaw(Raw::Element e) { - result = TFormatArgsArgName(e) - } - /** * INTERNAL: Do not use. * @@ -1354,6 +1377,13 @@ module Synth { */ TImpl convertImplFromRaw(Raw::Element e) { result = TImpl(e) } + /** + * INTERNAL: Do not use. + * + * Converts a raw element to a synthesized `TImplRestriction`, if possible. + */ + TImplRestriction convertImplRestrictionFromRaw(Raw::Element e) { result = TImplRestriction(e) } + /** * INTERNAL: Do not use. * @@ -1363,6 +1393,13 @@ module Synth { result = TImplTraitTypeRepr(e) } + /** + * INTERNAL: Do not use. + * + * Converts a raw element to a synthesized `TIncludeBytesExpr`, if possible. + */ + TIncludeBytesExpr convertIncludeBytesExprFromRaw(Raw::Element e) { result = TIncludeBytesExpr(e) } + /** * INTERNAL: Do not use. * @@ -1559,6 +1596,13 @@ module Synth { */ TModule convertModuleFromRaw(Raw::Element e) { result = TModule(e) } + /** + * INTERNAL: Do not use. + * + * Converts a raw element to a synthesized `TMutRestriction`, if possible. + */ + TMutRestriction convertMutRestrictionFromRaw(Raw::Element e) { result = TMutRestriction(e) } + /** * INTERNAL: Do not use. * @@ -1587,6 +1631,13 @@ module Synth { */ TNeverTypeRepr convertNeverTypeReprFromRaw(Raw::Element e) { result = TNeverTypeRepr(e) } + /** + * INTERNAL: Do not use. + * + * Converts a raw element to a synthesized `TNotNull`, if possible. + */ + TNotNull convertNotNullFromRaw(Raw::Element e) { result = TNotNull(e) } + /** * INTERNAL: Do not use. * @@ -1687,6 +1738,13 @@ module Synth { */ TPathTypeRepr convertPathTypeReprFromRaw(Raw::Element e) { result = TPathTypeRepr(e) } + /** + * INTERNAL: Do not use. + * + * Converts a raw element to a synthesized `TPatternTypeRepr`, if possible. + */ + TPatternTypeRepr convertPatternTypeReprFromRaw(Raw::Element e) { result = TPatternTypeRepr(e) } + /** * INTERNAL: Do not use. * @@ -2071,6 +2129,13 @@ module Synth { */ TVisibility convertVisibilityFromRaw(Raw::Element e) { result = TVisibility(e) } + /** + * INTERNAL: Do not use. + * + * Converts a raw element to a synthesized `TVisibilityInner`, if possible. + */ + TVisibilityInner convertVisibilityInnerFromRaw(Raw::Element e) { result = TVisibilityInner(e) } + /** * INTERNAL: Do not use. * @@ -2214,8 +2279,6 @@ module Synth { or result = convertFormatArgsArgFromRaw(e) or - result = convertFormatArgsArgNameFromRaw(e) - or result = convertGenericArgFromRaw(e) or result = convertGenericArgListFromRaw(e) @@ -2224,6 +2287,8 @@ module Synth { or result = convertGenericParamListFromRaw(e) or + result = convertImplRestrictionFromRaw(e) + or result = convertItemListFromRaw(e) or result = convertLabelFromRaw(e) @@ -2240,6 +2305,8 @@ module Synth { or result = convertMetaFromRaw(e) or + result = convertMutRestrictionFromRaw(e) + or result = convertNameFromRaw(e) or result = convertParamBaseFromRaw(e) @@ -2304,6 +2371,8 @@ module Synth { or result = convertVisibilityFromRaw(e) or + result = convertVisibilityInnerFromRaw(e) + or result = convertWhereClauseFromRaw(e) or result = convertWherePredFromRaw(e) @@ -2376,6 +2445,8 @@ module Synth { or result = convertIfExprFromRaw(e) or + result = convertIncludeBytesExprFromRaw(e) + or result = convertIndexExprFromRaw(e) or result = convertLabelableExprFromRaw(e) @@ -2570,12 +2641,16 @@ module Synth { or result = convertConstBlockPatFromRaw(e) or + result = convertDerefPatFromRaw(e) + or result = convertIdentPatFromRaw(e) or result = convertLiteralPatFromRaw(e) or result = convertMacroPatFromRaw(e) or + result = convertNotNullFromRaw(e) + or result = convertOrPatFromRaw(e) or result = convertParenPatFromRaw(e) @@ -2680,6 +2755,8 @@ module Synth { or result = convertPathTypeReprFromRaw(e) or + result = convertPatternTypeReprFromRaw(e) + or result = convertPtrTypeReprFromRaw(e) or result = convertRefTypeReprFromRaw(e) @@ -2957,6 +3034,12 @@ module Synth { */ Raw::Element convertCrateToRaw(TCrate e) { e = TCrate(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TDerefPat` to a raw DB element, if possible. + */ + Raw::Element convertDerefPatToRaw(TDerefPat e) { e = TDerefPat(result) } + /** * INTERNAL: Do not use. * Converts a synthesized `TDynTraitTypeRepr` to a raw DB element, if possible. @@ -3041,14 +3124,6 @@ module Synth { */ Raw::Element convertFormatArgsArgToRaw(TFormatArgsArg e) { e = TFormatArgsArg(result) } - /** - * INTERNAL: Do not use. - * Converts a synthesized `TFormatArgsArgName` to a raw DB element, if possible. - */ - Raw::Element convertFormatArgsArgNameToRaw(TFormatArgsArgName e) { - e = TFormatArgsArgName(result) - } - /** * INTERNAL: Do not use. * Converts a synthesized `TFormatArgsExpr` to a raw DB element, if possible. @@ -3103,6 +3178,12 @@ module Synth { */ Raw::Element convertImplToRaw(TImpl e) { e = TImpl(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TImplRestriction` to a raw DB element, if possible. + */ + Raw::Element convertImplRestrictionToRaw(TImplRestriction e) { e = TImplRestriction(result) } + /** * INTERNAL: Do not use. * Converts a synthesized `TImplTraitTypeRepr` to a raw DB element, if possible. @@ -3111,6 +3192,12 @@ module Synth { e = TImplTraitTypeRepr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TIncludeBytesExpr` to a raw DB element, if possible. + */ + Raw::Element convertIncludeBytesExprToRaw(TIncludeBytesExpr e) { e = TIncludeBytesExpr(result) } + /** * INTERNAL: Do not use. * Converts a synthesized `TIndexExpr` to a raw DB element, if possible. @@ -3279,6 +3366,12 @@ module Synth { */ Raw::Element convertModuleToRaw(TModule e) { e = TModule(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TMutRestriction` to a raw DB element, if possible. + */ + Raw::Element convertMutRestrictionToRaw(TMutRestriction e) { e = TMutRestriction(result) } + /** * INTERNAL: Do not use. * Converts a synthesized `TName` to a raw DB element, if possible. @@ -3303,6 +3396,12 @@ module Synth { */ Raw::Element convertNeverTypeReprToRaw(TNeverTypeRepr e) { e = TNeverTypeRepr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TNotNull` to a raw DB element, if possible. + */ + Raw::Element convertNotNullToRaw(TNotNull e) { e = TNotNull(result) } + /** * INTERNAL: Do not use. * Converts a synthesized `TOffsetOfExpr` to a raw DB element, if possible. @@ -3389,6 +3488,12 @@ module Synth { */ Raw::Element convertPathTypeReprToRaw(TPathTypeRepr e) { e = TPathTypeRepr(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TPatternTypeRepr` to a raw DB element, if possible. + */ + Raw::Element convertPatternTypeReprToRaw(TPatternTypeRepr e) { e = TPatternTypeRepr(result) } + /** * INTERNAL: Do not use. * Converts a synthesized `TPrefixExpr` to a raw DB element, if possible. @@ -3719,6 +3824,12 @@ module Synth { */ Raw::Element convertVisibilityToRaw(TVisibility e) { e = TVisibility(result) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TVisibilityInner` to a raw DB element, if possible. + */ + Raw::Element convertVisibilityInnerToRaw(TVisibilityInner e) { e = TVisibilityInner(result) } + /** * INTERNAL: Do not use. * Converts a synthesized `TWhereClause` to a raw DB element, if possible. @@ -3856,8 +3967,6 @@ module Synth { or result = convertFormatArgsArgToRaw(e) or - result = convertFormatArgsArgNameToRaw(e) - or result = convertGenericArgToRaw(e) or result = convertGenericArgListToRaw(e) @@ -3866,6 +3975,8 @@ module Synth { or result = convertGenericParamListToRaw(e) or + result = convertImplRestrictionToRaw(e) + or result = convertItemListToRaw(e) or result = convertLabelToRaw(e) @@ -3882,6 +3993,8 @@ module Synth { or result = convertMetaToRaw(e) or + result = convertMutRestrictionToRaw(e) + or result = convertNameToRaw(e) or result = convertParamBaseToRaw(e) @@ -3946,6 +4059,8 @@ module Synth { or result = convertVisibilityToRaw(e) or + result = convertVisibilityInnerToRaw(e) + or result = convertWhereClauseToRaw(e) or result = convertWherePredToRaw(e) @@ -4018,6 +4133,8 @@ module Synth { or result = convertIfExprToRaw(e) or + result = convertIncludeBytesExprToRaw(e) + or result = convertIndexExprToRaw(e) or result = convertLabelableExprToRaw(e) @@ -4212,12 +4329,16 @@ module Synth { or result = convertConstBlockPatToRaw(e) or + result = convertDerefPatToRaw(e) + or result = convertIdentPatToRaw(e) or result = convertLiteralPatToRaw(e) or result = convertMacroPatToRaw(e) or + result = convertNotNullToRaw(e) + or result = convertOrPatToRaw(e) or result = convertParenPatToRaw(e) @@ -4322,6 +4443,8 @@ module Synth { or result = convertPathTypeReprToRaw(e) or + result = convertPatternTypeReprToRaw(e) + or result = convertPtrTypeReprToRaw(e) or result = convertRefTypeReprToRaw(e) diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/SynthConstructors.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/SynthConstructors.qll index 40d7f1c5acd7..58f7e37f2b1e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/SynthConstructors.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/SynthConstructors.qll @@ -44,6 +44,7 @@ import codeql.rust.elements.internal.ConstBlockPatConstructor import codeql.rust.elements.internal.ConstParamConstructor import codeql.rust.elements.internal.ContinueExprConstructor import codeql.rust.elements.internal.CrateConstructor +import codeql.rust.elements.internal.DerefPatConstructor import codeql.rust.elements.internal.DynTraitTypeReprConstructor import codeql.rust.elements.internal.EnumConstructor import codeql.rust.elements.internal.ExprStmtConstructor @@ -58,7 +59,6 @@ import codeql.rust.elements.internal.ForExprConstructor import codeql.rust.elements.internal.ForTypeReprConstructor import codeql.rust.elements.internal.FormatConstructor import codeql.rust.elements.internal.FormatArgsArgConstructor -import codeql.rust.elements.internal.FormatArgsArgNameConstructor import codeql.rust.elements.internal.FormatArgsExprConstructor import codeql.rust.elements.internal.FormatArgumentConstructor import codeql.rust.elements.internal.FormatTemplateVariableAccessConstructor @@ -68,7 +68,9 @@ import codeql.rust.elements.internal.GenericParamListConstructor import codeql.rust.elements.internal.IdentPatConstructor import codeql.rust.elements.internal.IfExprConstructor import codeql.rust.elements.internal.ImplConstructor +import codeql.rust.elements.internal.ImplRestrictionConstructor import codeql.rust.elements.internal.ImplTraitTypeReprConstructor +import codeql.rust.elements.internal.IncludeBytesExprConstructor import codeql.rust.elements.internal.IndexExprConstructor import codeql.rust.elements.internal.InferTypeReprConstructor import codeql.rust.elements.internal.ItemListConstructor @@ -97,10 +99,12 @@ import codeql.rust.elements.internal.MatchGuardConstructor import codeql.rust.elements.internal.MethodCallExprConstructor import codeql.rust.elements.internal.MissingConstructor import codeql.rust.elements.internal.ModuleConstructor +import codeql.rust.elements.internal.MutRestrictionConstructor import codeql.rust.elements.internal.NameConstructor import codeql.rust.elements.internal.NameRefConstructor import codeql.rust.elements.internal.NamedCrateConstructor import codeql.rust.elements.internal.NeverTypeReprConstructor +import codeql.rust.elements.internal.NotNullConstructor import codeql.rust.elements.internal.OffsetOfExprConstructor import codeql.rust.elements.internal.OrPatConstructor import codeql.rust.elements.internal.ParamConstructor @@ -115,6 +119,7 @@ import codeql.rust.elements.internal.PathMetaConstructor import codeql.rust.elements.internal.PathPatConstructor import codeql.rust.elements.internal.PathSegmentConstructor import codeql.rust.elements.internal.PathTypeReprConstructor +import codeql.rust.elements.internal.PatternTypeReprConstructor import codeql.rust.elements.internal.PrefixExprConstructor import codeql.rust.elements.internal.PtrTypeReprConstructor import codeql.rust.elements.internal.RangeExprConstructor @@ -169,6 +174,7 @@ import codeql.rust.elements.internal.UseTreeListConstructor import codeql.rust.elements.internal.VariantConstructor import codeql.rust.elements.internal.VariantListConstructor import codeql.rust.elements.internal.VisibilityConstructor +import codeql.rust.elements.internal.VisibilityInnerConstructor import codeql.rust.elements.internal.WhereClauseConstructor import codeql.rust.elements.internal.WherePredConstructor import codeql.rust.elements.internal.WhileExprConstructor diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Trait.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Trait.qll index fff0363a3c75..878c3ae4b015 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Trait.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Trait.qll @@ -9,6 +9,7 @@ private import codeql.rust.elements.internal.generated.Raw import codeql.rust.elements.AssocItemList import codeql.rust.elements.Attr import codeql.rust.elements.GenericParamList +import codeql.rust.elements.ImplRestriction import codeql.rust.elements.internal.ItemImpl::Impl as ItemImpl import codeql.rust.elements.Name import codeql.rust.elements.TypeBoundList @@ -84,6 +85,21 @@ module Generated { */ final predicate hasGenericParamList() { exists(this.getGenericParamList()) } + /** + * Gets the impl restriction of this trait, if it exists. + */ + ImplRestriction getImplRestriction() { + result = + Synth::convertImplRestrictionFromRaw(Synth::convertTraitToRaw(this) + .(Raw::Trait) + .getImplRestriction()) + } + + /** + * Holds if `getImplRestriction()` exists. + */ + final predicate hasImplRestriction() { exists(this.getImplRestriction()) } + /** * Holds if this trait is auto. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/TupleField.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/TupleField.qll index 8d39a116f5c0..7ed0d4788d82 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/TupleField.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/TupleField.qll @@ -8,6 +8,7 @@ private import codeql.rust.elements.internal.generated.Synth private import codeql.rust.elements.internal.generated.Raw import codeql.rust.elements.internal.AstNodeImpl::Impl as AstNodeImpl import codeql.rust.elements.Attr +import codeql.rust.elements.MutRestriction import codeql.rust.elements.TypeRepr import codeql.rust.elements.Visibility @@ -50,6 +51,21 @@ module Generated { */ final int getNumberOfAttrs() { result = count(int i | exists(this.getAttr(i))) } + /** + * Gets the mut restriction of this tuple field, if it exists. + */ + MutRestriction getMutRestriction() { + result = + Synth::convertMutRestrictionFromRaw(Synth::convertTupleFieldToRaw(this) + .(Raw::TupleField) + .getMutRestriction()) + } + + /** + * Holds if `getMutRestriction()` exists. + */ + final predicate hasMutRestriction() { exists(this.getMutRestriction()) } + /** * Gets the type representation of this tuple field, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Visibility.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Visibility.qll index 340f53af63c9..e37eff57a895 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Visibility.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Visibility.qll @@ -7,7 +7,7 @@ private import codeql.rust.elements.internal.generated.Synth private import codeql.rust.elements.internal.generated.Raw import codeql.rust.elements.internal.AstNodeImpl::Impl as AstNodeImpl -import codeql.rust.elements.Path +import codeql.rust.elements.VisibilityInner /** * INTERNAL: This module contains the fully generated definition of `Visibility` and should not @@ -29,16 +29,18 @@ module Generated { override string getAPrimaryQlClass() { result = "Visibility" } /** - * Gets the path of this visibility, if it exists. + * Gets the visibility inner of this visibility, if it exists. */ - Path getPath() { + VisibilityInner getVisibilityInner() { result = - Synth::convertPathFromRaw(Synth::convertVisibilityToRaw(this).(Raw::Visibility).getPath()) + Synth::convertVisibilityInnerFromRaw(Synth::convertVisibilityToRaw(this) + .(Raw::Visibility) + .getVisibilityInner()) } /** - * Holds if `getPath()` exists. + * Holds if `getVisibilityInner()` exists. */ - final predicate hasPath() { exists(this.getPath()) } + final predicate hasVisibilityInner() { exists(this.getVisibilityInner()) } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/VisibilityInner.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/VisibilityInner.qll new file mode 100644 index 000000000000..92d5d0eed758 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/VisibilityInner.qll @@ -0,0 +1,39 @@ +// generated by codegen, do not edit +/** + * This module provides the generated definition of `VisibilityInner`. + * INTERNAL: Do not import directly. + */ + +private import codeql.rust.elements.internal.generated.Synth +private import codeql.rust.elements.internal.generated.Raw +import codeql.rust.elements.internal.AstNodeImpl::Impl as AstNodeImpl +import codeql.rust.elements.Path + +/** + * INTERNAL: This module contains the fully generated definition of `VisibilityInner` and should not + * be referenced directly. + */ +module Generated { + /** + * INTERNAL: Do not reference the `Generated::VisibilityInner` class directly. + * Use the subclass `VisibilityInner`, where the following predicates are available. + */ + class VisibilityInner extends Synth::TVisibilityInner, AstNodeImpl::AstNode { + override string getAPrimaryQlClass() { result = "VisibilityInner" } + + /** + * Gets the path of this visibility inner, if it exists. + */ + Path getPath() { + result = + Synth::convertPathFromRaw(Synth::convertVisibilityInnerToRaw(this) + .(Raw::VisibilityInner) + .getPath()) + } + + /** + * Holds if `getPath()` exists. + */ + final predicate hasPath() { exists(this.getPath()) } + } +} diff --git a/rust/ql/lib/rust.dbscheme b/rust/ql/lib/rust.dbscheme index ed6b1d3d5140..852696f20117 100644 --- a/rust/ql/lib/rust.dbscheme +++ b/rust/ql/lib/rust.dbscheme @@ -199,11 +199,11 @@ named_crates( | @field_list | @for_binder | @format_args_arg -| @format_args_arg_name | @generic_arg | @generic_arg_list | @generic_param | @generic_param_list +| @impl_restriction | @item_list | @label | @let_else @@ -212,6 +212,7 @@ named_crates( | @match_arm_list | @match_guard | @meta +| @mut_restriction | @name | @param_base | @param_list @@ -244,6 +245,7 @@ named_crates( | @use_tree_list | @variant_list | @visibility +| @visibility_inner | @where_clause | @where_pred ; @@ -429,6 +431,7 @@ callable_attrs( | @field_expr | @format_args_expr | @if_expr +| @include_bytes_expr | @index_expr | @labelable_expr | @let_expr @@ -488,20 +491,16 @@ format_args_args( unique int id: @format_args_arg ); -#keyset[id] -format_args_arg_arg_names( - int id: @format_args_arg ref, - int arg_name: @format_args_arg_name ref -); - #keyset[id] format_args_arg_exprs( int id: @format_args_arg ref, int expr: @expr ref ); +#keyset[id] format_args_arg_names( - unique int id: @format_args_arg_name + int id: @format_args_arg ref, + int name: @name ref ); @generic_arg = @@ -539,6 +538,16 @@ generic_param_list_generic_params( int generic_param: @generic_param ref ); +impl_restrictions( + unique int id: @impl_restriction +); + +#keyset[id] +impl_restriction_visibility_inners( + int id: @impl_restriction ref, + int visibility_inner: @visibility_inner ref +); + item_lists( unique int id: @item_list ); @@ -654,6 +663,21 @@ match_guard_conditions( | @unsafe_meta ; +mut_restrictions( + unique int id: @mut_restriction +); + +#keyset[id] +mut_restriction_is_mut( + int id: @mut_restriction ref +); + +#keyset[id] +mut_restriction_visibility_inners( + int id: @mut_restriction ref, + int visibility_inner: @visibility_inner ref +); + names( unique int id: @name ); @@ -713,9 +737,11 @@ parenthesized_arg_list_type_args( @pat = @box_pat | @const_block_pat +| @deref_pat | @ident_pat | @literal_pat | @macro_pat +| @not_null | @or_pat | @paren_pat | @path_pat @@ -946,6 +972,12 @@ struct_field_is_unsafe( int id: @struct_field ref ); +#keyset[id] +struct_field_mut_restrictions( + int id: @struct_field ref, + int mut_restriction: @mut_restriction ref +); + #keyset[id] struct_field_names( int id: @struct_field ref, @@ -1038,6 +1070,12 @@ tuple_field_attrs( int attr: @attr ref ); +#keyset[id] +tuple_field_mut_restrictions( + int id: @tuple_field ref, + int mut_restriction: @mut_restriction ref +); + #keyset[id] tuple_field_type_reprs( int id: @tuple_field ref, @@ -1110,6 +1148,7 @@ type_bound_list_bounds( | @never_type_repr | @paren_type_repr | @path_type_repr +| @pattern_type_repr | @ptr_type_repr | @ref_type_repr | @slice_type_repr @@ -1186,8 +1225,18 @@ visibilities( ); #keyset[id] -visibility_paths( +visibility_visibility_inners( int id: @visibility ref, + int visibility_inner: @visibility_inner ref +); + +visibility_inners( + unique int id: @visibility_inner +); + +#keyset[id] +visibility_inner_paths( + int id: @visibility_inner ref, int path: @path ref ); @@ -1273,6 +1322,13 @@ asm_clobber_abis( unique int id: @asm_clobber_abi ); +#keyset[id, index] +asm_clobber_abi_attrs( + int id: @asm_clobber_abi ref, + int index: int ref, + int attr: @attr ref +); + asm_consts( unique int id: @asm_const ); @@ -1308,6 +1364,13 @@ asm_operand_named_asm_operands( int asm_operand: @asm_operand ref ); +#keyset[id, index] +asm_operand_named_attrs( + int id: @asm_operand_named ref, + int index: int ref, + int attr: @attr ref +); + #keyset[id] asm_operand_named_names( int id: @asm_operand_named ref, @@ -1325,6 +1388,13 @@ asm_options_list_asm_options( int asm_option: @asm_option ref ); +#keyset[id, index] +asm_options_list_attrs( + int id: @asm_options_list ref, + int index: int ref, + int attr: @attr ref +); + asm_reg_operands( unique int id: @asm_reg_operand ); @@ -1722,6 +1792,16 @@ continue_expr_lifetimes( int lifetime: @lifetime ref ); +deref_pats( + unique int id: @deref_pat +); + +#keyset[id] +deref_pat_pats( + int id: @deref_pat ref, + int pat: @pat ref +); + dyn_trait_type_reprs( unique int id: @dyn_trait_type_repr ); @@ -1914,6 +1994,10 @@ impl_trait_type_repr_type_bound_lists( int type_bound_list: @type_bound_list ref ); +include_bytes_exprs( + unique int id: @include_bytes_expr +); + index_exprs( unique int id: @index_expr ); @@ -2219,6 +2303,10 @@ never_type_reprs( unique int id: @never_type_repr ); +not_nulls( + unique int id: @not_null +); + offset_of_exprs( unique int id: @offset_of_expr ); @@ -2329,6 +2417,22 @@ path_type_repr_paths( int path: @path ref ); +pattern_type_reprs( + unique int id: @pattern_type_repr +); + +#keyset[id] +pattern_type_repr_pats( + int id: @pattern_type_repr ref, + int pat: @pat ref +); + +#keyset[id] +pattern_type_repr_type_reprs( + int id: @pattern_type_repr ref, + int type_repr: @type_repr ref +); + prefix_exprs( unique int id: @prefix_expr ); @@ -3175,6 +3279,12 @@ trait_generic_param_lists( int generic_param_list: @generic_param_list ref ); +#keyset[id] +trait_impl_restrictions( + int id: @trait ref, + int impl_restriction: @impl_restriction ref +); + #keyset[id] trait_is_auto( int id: @trait ref diff --git a/rust/ql/test/extractor-tests/generated/AsmClobberAbi/AsmClobberAbi.ql b/rust/ql/test/extractor-tests/generated/AsmClobberAbi/AsmClobberAbi.ql index 65680442dfb8..9b434d33a7e5 100644 --- a/rust/ql/test/extractor-tests/generated/AsmClobberAbi/AsmClobberAbi.ql +++ b/rust/ql/test/extractor-tests/generated/AsmClobberAbi/AsmClobberAbi.ql @@ -3,3 +3,7 @@ import codeql.rust.elements import TestUtils query predicate instances(AsmClobberAbi x) { toBeTested(x) and not x.isUnknown() } + +query predicate getAttr(AsmClobberAbi x, int index, Attr getAttr) { + toBeTested(x) and not x.isUnknown() and getAttr = x.getAttr(index) +} diff --git a/rust/ql/test/extractor-tests/generated/AsmOperandNamed/AsmOperandNamed.ql b/rust/ql/test/extractor-tests/generated/AsmOperandNamed/AsmOperandNamed.ql index 9c900afe42e1..c3f7718bc1ef 100644 --- a/rust/ql/test/extractor-tests/generated/AsmOperandNamed/AsmOperandNamed.ql +++ b/rust/ql/test/extractor-tests/generated/AsmOperandNamed/AsmOperandNamed.ql @@ -8,6 +8,10 @@ query predicate getAsmOperand(AsmOperandNamed x, AsmOperand getAsmOperand) { toBeTested(x) and not x.isUnknown() and getAsmOperand = x.getAsmOperand() } +query predicate getAttr(AsmOperandNamed x, int index, Attr getAttr) { + toBeTested(x) and not x.isUnknown() and getAttr = x.getAttr(index) +} + query predicate getName(AsmOperandNamed x, Name getName) { toBeTested(x) and not x.isUnknown() and getName = x.getName() } diff --git a/rust/ql/test/extractor-tests/generated/AsmOptionsList/AsmOptionsList.ql b/rust/ql/test/extractor-tests/generated/AsmOptionsList/AsmOptionsList.ql index a4806cce3535..bb4a00fa29d5 100644 --- a/rust/ql/test/extractor-tests/generated/AsmOptionsList/AsmOptionsList.ql +++ b/rust/ql/test/extractor-tests/generated/AsmOptionsList/AsmOptionsList.ql @@ -7,3 +7,7 @@ query predicate instances(AsmOptionsList x) { toBeTested(x) and not x.isUnknown( query predicate getAsmOption(AsmOptionsList x, int index, AsmOption getAsmOption) { toBeTested(x) and not x.isUnknown() and getAsmOption = x.getAsmOption(index) } + +query predicate getAttr(AsmOptionsList x, int index, Attr getAttr) { + toBeTested(x) and not x.isUnknown() and getAttr = x.getAttr(index) +} diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsArgName/MISSING_SOURCE.txt b/rust/ql/test/extractor-tests/generated/DerefPat/MISSING_SOURCE.txt similarity index 100% rename from rust/ql/test/extractor-tests/generated/FormatArgsArgName/MISSING_SOURCE.txt rename to rust/ql/test/extractor-tests/generated/DerefPat/MISSING_SOURCE.txt diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg.ql b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg.ql index d445d40234d6..d3931f985113 100644 --- a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg.ql +++ b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg.ql @@ -4,10 +4,10 @@ import TestUtils query predicate instances(FormatArgsArg x) { toBeTested(x) and not x.isUnknown() } -query predicate getArgName(FormatArgsArg x, FormatArgsArgName getArgName) { - toBeTested(x) and not x.isUnknown() and getArgName = x.getArgName() -} - query predicate getExpr(FormatArgsArg x, Expr getExpr) { toBeTested(x) and not x.isUnknown() and getExpr = x.getExpr() } + +query predicate getName(FormatArgsArg x, Name getName) { + toBeTested(x) and not x.isUnknown() and getName = x.getName() +} diff --git a/rust/ql/test/extractor-tests/generated/ImplRestriction/MISSING_SOURCE.txt b/rust/ql/test/extractor-tests/generated/ImplRestriction/MISSING_SOURCE.txt new file mode 100644 index 000000000000..7f96b17b1f3c --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/ImplRestriction/MISSING_SOURCE.txt @@ -0,0 +1,4 @@ +// generated by codegen, do not edit + +After a source file is added in this directory and codegen is run again, test queries +will appear and this file will be deleted diff --git a/rust/ql/test/extractor-tests/generated/IncludeBytesExpr/MISSING_SOURCE.txt b/rust/ql/test/extractor-tests/generated/IncludeBytesExpr/MISSING_SOURCE.txt new file mode 100644 index 000000000000..7f96b17b1f3c --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/IncludeBytesExpr/MISSING_SOURCE.txt @@ -0,0 +1,4 @@ +// generated by codegen, do not edit + +After a source file is added in this directory and codegen is run again, test queries +will appear and this file will be deleted diff --git a/rust/ql/test/extractor-tests/generated/MutRestriction/MISSING_SOURCE.txt b/rust/ql/test/extractor-tests/generated/MutRestriction/MISSING_SOURCE.txt new file mode 100644 index 000000000000..7f96b17b1f3c --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/MutRestriction/MISSING_SOURCE.txt @@ -0,0 +1,4 @@ +// generated by codegen, do not edit + +After a source file is added in this directory and codegen is run again, test queries +will appear and this file will be deleted diff --git a/rust/ql/test/extractor-tests/generated/NotNull/MISSING_SOURCE.txt b/rust/ql/test/extractor-tests/generated/NotNull/MISSING_SOURCE.txt new file mode 100644 index 000000000000..7f96b17b1f3c --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/NotNull/MISSING_SOURCE.txt @@ -0,0 +1,4 @@ +// generated by codegen, do not edit + +After a source file is added in this directory and codegen is run again, test queries +will appear and this file will be deleted diff --git a/rust/ql/test/extractor-tests/generated/PatternTypeRepr/MISSING_SOURCE.txt b/rust/ql/test/extractor-tests/generated/PatternTypeRepr/MISSING_SOURCE.txt new file mode 100644 index 000000000000..7f96b17b1f3c --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/PatternTypeRepr/MISSING_SOURCE.txt @@ -0,0 +1,4 @@ +// generated by codegen, do not edit + +After a source file is added in this directory and codegen is run again, test queries +will appear and this file will be deleted diff --git a/rust/ql/test/extractor-tests/generated/StructField/StructField.ql b/rust/ql/test/extractor-tests/generated/StructField/StructField.ql index 6db753a5808b..ad76a38ee123 100644 --- a/rust/ql/test/extractor-tests/generated/StructField/StructField.ql +++ b/rust/ql/test/extractor-tests/generated/StructField/StructField.ql @@ -17,6 +17,10 @@ query predicate getDefaultVal(StructField x, ConstArg getDefaultVal) { toBeTested(x) and not x.isUnknown() and getDefaultVal = x.getDefaultVal() } +query predicate getMutRestriction(StructField x, MutRestriction getMutRestriction) { + toBeTested(x) and not x.isUnknown() and getMutRestriction = x.getMutRestriction() +} + query predicate getName(StructField x, Name getName) { toBeTested(x) and not x.isUnknown() and getName = x.getName() } diff --git a/rust/ql/test/extractor-tests/generated/Trait/Trait.ql b/rust/ql/test/extractor-tests/generated/Trait/Trait.ql index 20e9b7f1e240..dc424929baba 100644 --- a/rust/ql/test/extractor-tests/generated/Trait/Trait.ql +++ b/rust/ql/test/extractor-tests/generated/Trait/Trait.ql @@ -31,6 +31,10 @@ query predicate getGenericParamList(Trait x, GenericParamList getGenericParamLis toBeTested(x) and not x.isUnknown() and getGenericParamList = x.getGenericParamList() } +query predicate getImplRestriction(Trait x, ImplRestriction getImplRestriction) { + toBeTested(x) and not x.isUnknown() and getImplRestriction = x.getImplRestriction() +} + query predicate getName(Trait x, Name getName) { toBeTested(x) and not x.isUnknown() and getName = x.getName() } diff --git a/rust/ql/test/extractor-tests/generated/TupleField/TupleField.ql b/rust/ql/test/extractor-tests/generated/TupleField/TupleField.ql index 01c15ace3ddf..4ae68d26fa4e 100644 --- a/rust/ql/test/extractor-tests/generated/TupleField/TupleField.ql +++ b/rust/ql/test/extractor-tests/generated/TupleField/TupleField.ql @@ -8,6 +8,10 @@ query predicate getAttr(TupleField x, int index, Attr getAttr) { toBeTested(x) and not x.isUnknown() and getAttr = x.getAttr(index) } +query predicate getMutRestriction(TupleField x, MutRestriction getMutRestriction) { + toBeTested(x) and not x.isUnknown() and getMutRestriction = x.getMutRestriction() +} + query predicate getTypeRepr(TupleField x, TypeRepr getTypeRepr) { toBeTested(x) and not x.isUnknown() and getTypeRepr = x.getTypeRepr() } diff --git a/rust/ql/test/extractor-tests/generated/Visibility/Visibility.ql b/rust/ql/test/extractor-tests/generated/Visibility/Visibility.ql index 651d0aecb2f3..c3093262904b 100644 --- a/rust/ql/test/extractor-tests/generated/Visibility/Visibility.ql +++ b/rust/ql/test/extractor-tests/generated/Visibility/Visibility.ql @@ -4,6 +4,6 @@ import TestUtils query predicate instances(Visibility x) { toBeTested(x) and not x.isUnknown() } -query predicate getPath(Visibility x, Path getPath) { - toBeTested(x) and not x.isUnknown() and getPath = x.getPath() +query predicate getVisibilityInner(Visibility x, VisibilityInner getVisibilityInner) { + toBeTested(x) and not x.isUnknown() and getVisibilityInner = x.getVisibilityInner() } diff --git a/rust/ql/test/extractor-tests/generated/VisibilityInner/MISSING_SOURCE.txt b/rust/ql/test/extractor-tests/generated/VisibilityInner/MISSING_SOURCE.txt new file mode 100644 index 000000000000..7f96b17b1f3c --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/VisibilityInner/MISSING_SOURCE.txt @@ -0,0 +1,4 @@ +// generated by codegen, do not edit + +After a source file is added in this directory and codegen is run again, test queries +will appear and this file will be deleted diff --git a/rust/schema/ast.py b/rust/schema/ast.py index 624fc97b02bb..611e70896d4f 100644 --- a/rust/schema/ast.py +++ b/rust/schema/ast.py @@ -66,7 +66,7 @@ class ArrayTypeRepr(TypeRepr, ): element_type_repr: optional["TypeRepr"] | child class AsmClobberAbi(AsmPiece, ): - pass + attrs: list["Attr"] | child class AsmConst(AsmOperand, ): expr: optional["Expr"] | child @@ -89,6 +89,7 @@ class AsmOperandExpr(AstNode, ): class AsmOperandNamed(AsmPiece, ): asm_operand: optional["AsmOperand"] | child + attrs: list["Attr"] | child name: optional["Name"] | child class AsmOption(AstNode, ): @@ -96,6 +97,7 @@ class AsmOption(AstNode, ): class AsmOptionsList(AsmPiece, ): asm_options: list["AsmOption"] | child + attrs: list["Attr"] | child class AsmRegOperand(AsmOperand, ): asm_dir_spec: optional["AsmDirSpec"] | child @@ -222,6 +224,9 @@ class ContinueExpr(Expr, ): attrs: list["Attr"] | child lifetime: optional["Lifetime"] | child +class DerefPat(Pat, ): + pat: optional["Pat"] | child + class DynTraitTypeRepr(TypeRepr, ): type_bound_list: optional["TypeBoundList"] | child @@ -296,11 +301,8 @@ class ForTypeRepr(TypeRepr, ): type_repr: optional["TypeRepr"] | child class FormatArgsArg(AstNode, ): - arg_name: optional["FormatArgsArgName"] | child expr: optional["Expr"] | child - -class FormatArgsArgName(AstNode, ): - pass + name: optional["Name"] | child class FormatArgsExpr(Expr, ): args: list["FormatArgsArg"] | child @@ -338,9 +340,15 @@ class Impl(Item, ): visibility: optional["Visibility"] | child where_clause: optional["WhereClause"] | child +class ImplRestriction(AstNode, ): + visibility_inner: optional["VisibilityInner"] | child + class ImplTraitTypeRepr(TypeRepr, ): type_bound_list: optional["TypeBoundList"] | child +class IncludeBytesExpr(Expr, ): + pass + class IndexExpr(Expr, ): attrs: list["Attr"] | child base: optional["Expr"] | child @@ -459,6 +467,10 @@ class Module(Item, ): name: optional["Name"] | child visibility: optional["Visibility"] | child +class MutRestriction(AstNode, ): + is_mut: predicate + visibility_inner: optional["VisibilityInner"] | child + class Name(AstNode, ): text: optional[string] @@ -468,6 +480,9 @@ class NameRef(UseBoundGenericArg, ): class NeverTypeRepr(TypeRepr, ): pass +class NotNull(Pat, ): + pass + class OffsetOfExpr(Expr, ): attrs: list["Attr"] | child fields: list["NameRef"] | child @@ -522,6 +537,10 @@ class PathSegment(AstNode, ): class PathTypeRepr(TypeRepr, ): path: optional["Path"] | child +class PatternTypeRepr(TypeRepr, ): + pat: optional["Pat"] | child + type_repr: optional["TypeRepr"] | child + class PrefixExpr(Expr, ): attrs: list["Attr"] | child expr: optional["Expr"] | child @@ -561,6 +580,7 @@ class StructField(AstNode, ): attrs: list["Attr"] | child default_val: optional["ConstArg"] | child is_unsafe: predicate + mut_restriction: optional["MutRestriction"] | child name: optional["Name"] | child type_repr: optional["TypeRepr"] | child visibility: optional["Visibility"] | child @@ -665,6 +685,7 @@ class Trait(Item, ): assoc_item_list: optional["AssocItemList"] | child attrs: list["Attr"] | child generic_param_list: optional["GenericParamList"] | child + impl_restriction: optional["ImplRestriction"] | child is_auto: predicate is_unsafe: predicate name: optional["Name"] | child @@ -686,6 +707,7 @@ class TupleExpr(Expr, ): class TupleField(AstNode, ): attrs: list["Attr"] | child + mut_restriction: optional["MutRestriction"] | child type_repr: optional["TypeRepr"] | child visibility: optional["Visibility"] | child @@ -775,6 +797,9 @@ class VariantList(AstNode, ): variants: list["Variant"] | child class Visibility(AstNode, ): + visibility_inner: optional["VisibilityInner"] | child + +class VisibilityInner(AstNode, ): path: optional["Path"] | child class WhereClause(AstNode, ): From bd980d26d97380cad1f80f5c6738d7125aecc1d3 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 14 Aug 2026 09:50:01 +0200 Subject: [PATCH 0297/2098] Rust: update toolchain to nightly/2026-07-15 and rules_rust 0.73.0 --- MODULE.bazel | 44 +++++++++---------- rust-toolchain.toml | 2 +- .../src/nightly-toolchain/rust-toolchain.toml | 2 +- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index fa9f58ada170..b3091c3f5f18 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -30,7 +30,7 @@ bazel_dep(name = "rules_kotlin", version = "2.2.2-codeql.1") bazel_dep(name = "gazelle", version = "0.50.0") bazel_dep(name = "rules_dotnet", version = "0.21.5-codeql.1") bazel_dep(name = "googletest", version = "1.17.0.bcr.2") -bazel_dep(name = "rules_rust", version = "0.69.0") +bazel_dep(name = "rules_rust", version = "0.73.0") bazel_dep(name = "rules_swift", version = "4.0.0-rc5") bazel_dep(name = "swift-syntax", version = "603.0.2") @@ -50,7 +50,7 @@ RUST_EDITION = "2024" # a nightly toolchain is required to enable experimental_use_cc_common_link, which we require internally # we prefer to run the same version as internally, even if experimental_use_cc_common_link is not really # required in this repo -RUST_VERSION = "nightly/2026-01-22" +RUST_VERSION = "nightly/2026-07-15" rust = use_extension("@rules_rust//rust:extensions.bzl", "rust") rust.toolchain( @@ -62,26 +62,26 @@ rust.toolchain( ], # generated by buildutils-internal/scripts/fill-rust-sha256s.py (internal repo) sha256s = { - "2026-01-22/rustc-nightly-x86_64-unknown-linux-gnu.tar.xz": "88db619323cc1321630d124efa51ed02fabc5e020f08cfa0eda2c0ac1afbe69a", - "2026-01-22/rustc-nightly-x86_64-apple-darwin.tar.xz": "08484da3fa38db56f93629aeabdc0ae9ff8ed9704c0792d35259cbc849b3f54c", - "2026-01-22/rustc-nightly-aarch64-apple-darwin.tar.xz": "a39c0b21b7058e364ea1bd43144e42e4bf1efade036b2e82455f2afce194ee81", - "2026-01-22/rustc-nightly-x86_64-pc-windows-msvc.tar.xz": "d00248ee9850dbb6932b2578e32ff74fc7c429854c1aa071066ca31b65385a3b", - "2026-01-22/clippy-nightly-x86_64-unknown-linux-gnu.tar.xz": "70656a0ce994ffff16d5a35a7b170a0acd41e9bb54a589c96ed45bf97b094a4d", - "2026-01-22/clippy-nightly-x86_64-apple-darwin.tar.xz": "fe242519fa961522734733009705aec3c2d9a20cc57291f2aa614e5e6262c88f", - "2026-01-22/clippy-nightly-aarch64-apple-darwin.tar.xz": "38bb226363ec97c9722edf966cd58774a683e19fd2ff2a6030094445d51e06f9", - "2026-01-22/clippy-nightly-x86_64-pc-windows-msvc.tar.xz": "6da9b4470beea67abfebf046f141eee0d2a8db7c7a9e4e2294478734fd477228", - "2026-01-22/cargo-nightly-x86_64-unknown-linux-gnu.tar.xz": "99004e9d10c43a01499642f53bb3184d41137a95d65bfb217098840a9e79e892", - "2026-01-22/cargo-nightly-x86_64-apple-darwin.tar.xz": "6e021394cf8d8400ac6cfdfcef24e4d74f988e91eb8028b36de3a64ce3502990", - "2026-01-22/cargo-nightly-aarch64-apple-darwin.tar.xz": "4b2494cb69ab64132cddbc411a38ea9f1105e54d6f986e43168d54f79510c673", - "2026-01-22/cargo-nightly-x86_64-pc-windows-msvc.tar.xz": "c36613cf57407212d10d37b76e49a60ff42336e953cdff9e177283f530a83fc1", - "2026-01-22/llvm-tools-nightly-x86_64-unknown-linux-gnu.tar.xz": "0b123c5027dbd833aae6845ffe9bd07d309bf798746a7176aadaea68fbcbd05d", - "2026-01-22/llvm-tools-nightly-x86_64-apple-darwin.tar.xz": "a47864491ad5619158c950ab7570fb6e487d5117338585c27334d45824b406d8", - "2026-01-22/llvm-tools-nightly-aarch64-apple-darwin.tar.xz": "db9bc826d6e2e7e914505d50157682e516ceb90357e83d77abddc32c2d962f41", - "2026-01-22/llvm-tools-nightly-x86_64-pc-windows-msvc.tar.xz": "ffaa406932b2fe62e01dad61cf4ed34860a5d2a6f9306ca340d79e630d930039", - "2026-01-22/rust-std-nightly-x86_64-unknown-linux-gnu.tar.xz": "e9c0d5e06e18a4b509391b3088f29293e310cdc8ccc865be8fa3f09733326925", - "2026-01-22/rust-std-nightly-x86_64-apple-darwin.tar.xz": "25d75995cee679a4828ca9fe48c5a31a67c3b0846018440ef912e5a6208f53f6", - "2026-01-22/rust-std-nightly-aarch64-apple-darwin.tar.xz": "e4132bf3f2eed4684c86756a02315bcf481c23e675e3e25630fc604c9cb4594c", - "2026-01-22/rust-std-nightly-x86_64-pc-windows-msvc.tar.xz": "961bb535ef95ae8a5fa4e224cb94aff190f155c45a9bcf7a53e184b024aa41b1", + "2026-07-15/rustc-nightly-x86_64-unknown-linux-gnu.tar.xz": "dad49ece98c6d0e5f3bfd7c532b5111f55319a0e2a880ef1a87379643348cf8e", + "2026-07-15/rustc-nightly-x86_64-apple-darwin.tar.xz": "54fe056dd41fd0ae2e74e8a941ee207af21e9b86700636fa254f11f0f1fa0783", + "2026-07-15/rustc-nightly-aarch64-apple-darwin.tar.xz": "0e8c44436fefd06850a343e244236bf8e2b7eadaee447c53a91bc4e17e6710d1", + "2026-07-15/rustc-nightly-x86_64-pc-windows-msvc.tar.xz": "a55c3933faf617a47a10545a072bae1de03aa3fe7363d0779baad35bed2cf259", + "2026-07-15/clippy-nightly-x86_64-unknown-linux-gnu.tar.xz": "49425e37f45e428b569098174a28985aae3102965dfa7434ca8472d1b3e58b5e", + "2026-07-15/clippy-nightly-x86_64-apple-darwin.tar.xz": "2b1ca2938c8d3d35f9c26badd696d575db876260569900684c766cf8319960a7", + "2026-07-15/clippy-nightly-aarch64-apple-darwin.tar.xz": "7c95556525376e0250dcdfb9c36725e8c0c131c1c6ac3b7e5872279e040852fb", + "2026-07-15/clippy-nightly-x86_64-pc-windows-msvc.tar.xz": "e737590737fdf81e08af55c7cbc3e7f4883d5f68cbec4bd572ccb7af44fc15d8", + "2026-07-15/cargo-nightly-x86_64-unknown-linux-gnu.tar.xz": "4df5b9f2ad9b597d272fa9500d650561f22c8543233485078a13a64693e567c3", + "2026-07-15/cargo-nightly-x86_64-apple-darwin.tar.xz": "e45a0ab75df0e61a3429ab450e35551ca920b138be39dc5cf8af824dd36fcb15", + "2026-07-15/cargo-nightly-aarch64-apple-darwin.tar.xz": "81e1469252cd4630fdf221f9390cdb4604472c0ef6774e6162370864e5adc3e0", + "2026-07-15/cargo-nightly-x86_64-pc-windows-msvc.tar.xz": "077cf2ad9811cba2596faab7b5763f8430791263ab7f3961fa31f23aaa3d741d", + "2026-07-15/llvm-tools-nightly-x86_64-unknown-linux-gnu.tar.xz": "25823477ba51d4aba12beb19cb7d2c46d453357a4b6d1c301102fc06d0c5db28", + "2026-07-15/llvm-tools-nightly-x86_64-apple-darwin.tar.xz": "168f79a128b34c88a8cef03af0ced8986a99c52df4016e5d111cba3c4638e4e3", + "2026-07-15/llvm-tools-nightly-aarch64-apple-darwin.tar.xz": "f95a27de3a30e6ba3d36548663b434e625cd1bbbfb015eadd90f67d80f657c5a", + "2026-07-15/llvm-tools-nightly-x86_64-pc-windows-msvc.tar.xz": "1d48b7b8f511a23f270e9380f729ee414db918abbc88535fe419dd53aa0d5429", + "2026-07-15/rust-std-nightly-x86_64-unknown-linux-gnu.tar.xz": "4c1a2f508b6791a1059924e6369d813b46888215add0a5906af95266b33219b2", + "2026-07-15/rust-std-nightly-x86_64-apple-darwin.tar.xz": "a2438da77f7eb292f80a5cab3de1aa2e8deb718b89c0ba6e26ef5c76299cc048", + "2026-07-15/rust-std-nightly-aarch64-apple-darwin.tar.xz": "02c36fc7728dc17376062e7a0f3bf26439e1317317971ba9339b3a3a34dee2fa", + "2026-07-15/rust-std-nightly-x86_64-pc-windows-msvc.tar.xz": "5e724d34d34ec4ed34161bb890452640ddda11fd9ef64f6a74e47541d5b02583", }, versions = [RUST_VERSION], ) diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 60d093c30021..121cacb2a5b2 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -5,6 +5,6 @@ # reflected by `MODULE.bazel` in this repository). [toolchain] -channel = "1.91" +channel = "1.97" profile = "minimal" components = [ "clippy", "rustfmt" ] diff --git a/rust/extractor/src/nightly-toolchain/rust-toolchain.toml b/rust/extractor/src/nightly-toolchain/rust-toolchain.toml index 7ed21df91218..5d108159caf0 100644 --- a/rust/extractor/src/nightly-toolchain/rust-toolchain.toml +++ b/rust/extractor/src/nightly-toolchain/rust-toolchain.toml @@ -1,3 +1,3 @@ [toolchain] -channel = "nightly-2025-06-01" +channel = "nightly-2026-07-15" components = [ "rust-src" ] From bb64af0b892031d0c2d6a02bb704fa29b6d13a98 Mon Sep 17 00:00:00 2001 From: Anders Fugmann Date: Wed, 12 Aug 2026 14:03:29 +0200 Subject: [PATCH 0298/2098] Java: add regression test for Maven version property Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 77fc65d2-e1bb-46b1-a73d-aed6101a7596 --- .../maven-enforcer-property-version/pom.xml | 134 ++++++++++++++++++ .../settings.xml | 10 ++ .../source_archive.expected | 11 ++ .../src/main/java/com/example/App.java | 30 ++++ .../src/main/resources/my-app.properties | 1 + .../src/main/resources/page.xml | 8 ++ .../src/main/resources/struts.xml | 4 + .../src/test/java/com/example/AppTest.java | 20 +++ .../maven-enforcer-property-version/test.py | 9 ++ .../maven-enforcer-single-version/test.py | 1 + 10 files changed, 228 insertions(+) create mode 100644 java/ql/integration-tests/java/maven-enforcer-property-version/pom.xml create mode 100644 java/ql/integration-tests/java/maven-enforcer-property-version/settings.xml create mode 100644 java/ql/integration-tests/java/maven-enforcer-property-version/source_archive.expected create mode 100644 java/ql/integration-tests/java/maven-enforcer-property-version/src/main/java/com/example/App.java create mode 100644 java/ql/integration-tests/java/maven-enforcer-property-version/src/main/resources/my-app.properties create mode 100644 java/ql/integration-tests/java/maven-enforcer-property-version/src/main/resources/page.xml create mode 100644 java/ql/integration-tests/java/maven-enforcer-property-version/src/main/resources/struts.xml create mode 100644 java/ql/integration-tests/java/maven-enforcer-property-version/src/test/java/com/example/AppTest.java create mode 100644 java/ql/integration-tests/java/maven-enforcer-property-version/test.py diff --git a/java/ql/integration-tests/java/maven-enforcer-property-version/pom.xml b/java/ql/integration-tests/java/maven-enforcer-property-version/pom.xml new file mode 100644 index 000000000000..1fde7386b72b --- /dev/null +++ b/java/ql/integration-tests/java/maven-enforcer-property-version/pom.xml @@ -0,0 +1,134 @@ + + + + 4.0.0 + + com.example + maven-sample + 1.0-SNAPSHOT + + maven-sample + + http://www.example.com + + + UTF-8 + 1.7 + 1.7 + 3.9.1 + + + + + junit + junit + 4.11 + test + + + + + + + exec-maven-plugin + org.codehaus.mojo + 1.1.1 + + + check-maven-version + package + + java + + + + + com.example.App + + + + com.diffplug.spotless + spotless-maven-plugin + 2.19.1 + + + + check + + compile + + + + + + /* FAIL ME */ + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + + + enforce-maven + + enforce + + + + + ${maven.version} + + + + + + + + + + + + + maven-clean-plugin + 3.1.0 + + + + maven-resources-plugin + 3.0.2 + + + maven-compiler-plugin + 3.8.0 + + + maven-surefire-plugin + 2.22.1 + + + maven-jar-plugin + 3.0.2 + + + maven-install-plugin + 2.5.2 + + + maven-deploy-plugin + 2.8.2 + + + + maven-site-plugin + 3.7.1 + + + maven-project-info-reports-plugin + 3.0.0 + + + + + diff --git a/java/ql/integration-tests/java/maven-enforcer-property-version/settings.xml b/java/ql/integration-tests/java/maven-enforcer-property-version/settings.xml new file mode 100644 index 000000000000..a40670670a62 --- /dev/null +++ b/java/ql/integration-tests/java/maven-enforcer-property-version/settings.xml @@ -0,0 +1,10 @@ + + + + google-maven-central + GCS Maven Central mirror + https://maven-central.storage-download.googleapis.com/maven2/ + central + + + diff --git a/java/ql/integration-tests/java/maven-enforcer-property-version/source_archive.expected b/java/ql/integration-tests/java/maven-enforcer-property-version/source_archive.expected new file mode 100644 index 000000000000..d86dae4531fd --- /dev/null +++ b/java/ql/integration-tests/java/maven-enforcer-property-version/source_archive.expected @@ -0,0 +1,11 @@ +pom.xml +settings.xml +src/main/java/com/example/App.java +src/main/resources/my-app.properties +src/main/resources/page.xml +src/main/resources/struts.xml +src/test/java/com/example/AppTest.java +target/classes/my-app.properties +target/classes/page.xml +target/classes/struts.xml +target/maven-archiver/pom.properties diff --git a/java/ql/integration-tests/java/maven-enforcer-property-version/src/main/java/com/example/App.java b/java/ql/integration-tests/java/maven-enforcer-property-version/src/main/java/com/example/App.java new file mode 100644 index 000000000000..3229e21835cd --- /dev/null +++ b/java/ql/integration-tests/java/maven-enforcer-property-version/src/main/java/com/example/App.java @@ -0,0 +1,30 @@ +package com.example; + +import java.util.regex.Pattern; +import java.nio.file.Path; +import java.nio.file.Paths; + +/** + * Hello world! + * + */ +public class App +{ + public static void main( String[] args ) + { + System.out.println( "Hello World!" ); + String expectedVersion = System.getenv("EXPECT_MAVEN"); + Path mavenHome = Paths.get(System.getProperty("maven.home")).normalize(); + String observedVersion = mavenHome.getFileName().toString(); + if (expectedVersion != null && !expectedVersion.equals(observedVersion)) { + System.err.println("Wrong maven version, expected '" + expectedVersion + "' but got '" + observedVersion + "'" + mavenHome); + System.exit(1); + } + String commandMatcher = System.getenv("EXPECT_COMMAND_REGEX"); + String command = System.getProperty("sun.java.command"); + if (commandMatcher != null && !Pattern.matches(commandMatcher, command)) { + System.err.println("Wrong command line, '" + command + "' does not match '" + commandMatcher + "'"); + System.exit(1); + } + } +} diff --git a/java/ql/integration-tests/java/maven-enforcer-property-version/src/main/resources/my-app.properties b/java/ql/integration-tests/java/maven-enforcer-property-version/src/main/resources/my-app.properties new file mode 100644 index 000000000000..e566b49a29a8 --- /dev/null +++ b/java/ql/integration-tests/java/maven-enforcer-property-version/src/main/resources/my-app.properties @@ -0,0 +1 @@ +version=1.0 diff --git a/java/ql/integration-tests/java/maven-enforcer-property-version/src/main/resources/page.xml b/java/ql/integration-tests/java/maven-enforcer-property-version/src/main/resources/page.xml new file mode 100644 index 000000000000..2bab459cb031 --- /dev/null +++ b/java/ql/integration-tests/java/maven-enforcer-property-version/src/main/resources/page.xml @@ -0,0 +1,8 @@ + + +A sample + + +

    Hello world!

    + + diff --git a/java/ql/integration-tests/java/maven-enforcer-property-version/src/main/resources/struts.xml b/java/ql/integration-tests/java/maven-enforcer-property-version/src/main/resources/struts.xml new file mode 100644 index 000000000000..73fc0c6b9cb6 --- /dev/null +++ b/java/ql/integration-tests/java/maven-enforcer-property-version/src/main/resources/struts.xml @@ -0,0 +1,4 @@ + + +This is a sample file + diff --git a/java/ql/integration-tests/java/maven-enforcer-property-version/src/test/java/com/example/AppTest.java b/java/ql/integration-tests/java/maven-enforcer-property-version/src/test/java/com/example/AppTest.java new file mode 100644 index 000000000000..328b4d97ce59 --- /dev/null +++ b/java/ql/integration-tests/java/maven-enforcer-property-version/src/test/java/com/example/AppTest.java @@ -0,0 +1,20 @@ +package com.example; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** + * Unit test for simple App. + */ +public class AppTest +{ + /** + * Rigorous Test :-) + */ + @Test + public void shouldAnswerWithTrue() + { + assertTrue( true ); + } +} diff --git a/java/ql/integration-tests/java/maven-enforcer-property-version/test.py b/java/ql/integration-tests/java/maven-enforcer-property-version/test.py new file mode 100644 index 000000000000..ac4bff0d9e26 --- /dev/null +++ b/java/ql/integration-tests/java/maven-enforcer-property-version/test.py @@ -0,0 +1,9 @@ +import os + +def test(codeql, java): + codeql.database.create( + _env={ + "EXPECT_MAVEN": "apache-maven-3.9.9", + "LGTM_INDEX_MAVEN_SETTINGS_FILE": os.path.join(os.path.dirname(os.path.realpath(__file__)), "settings.xml"), + }, + ) diff --git a/java/ql/integration-tests/java/maven-enforcer-single-version/test.py b/java/ql/integration-tests/java/maven-enforcer-single-version/test.py index a71c8821d5e6..ac4bff0d9e26 100644 --- a/java/ql/integration-tests/java/maven-enforcer-single-version/test.py +++ b/java/ql/integration-tests/java/maven-enforcer-single-version/test.py @@ -3,6 +3,7 @@ def test(codeql, java): codeql.database.create( _env={ + "EXPECT_MAVEN": "apache-maven-3.9.9", "LGTM_INDEX_MAVEN_SETTINGS_FILE": os.path.join(os.path.dirname(os.path.realpath(__file__)), "settings.xml"), }, ) From 668f4e836ef70bacad089fa13c05f97cb0cc5cba Mon Sep 17 00:00:00 2001 From: Anders Fugmann Date: Wed, 12 Aug 2026 14:49:51 +0200 Subject: [PATCH 0299/2098] Java: test Maven 3.9.16 selection Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: e435859b-f4ed-442f-b649-5e1002031780 --- .../java/maven-enforcer-property-version/test.py | 2 +- .../java/maven-enforcer-single-version/test.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/java/ql/integration-tests/java/maven-enforcer-property-version/test.py b/java/ql/integration-tests/java/maven-enforcer-property-version/test.py index ac4bff0d9e26..295db6762b6f 100644 --- a/java/ql/integration-tests/java/maven-enforcer-property-version/test.py +++ b/java/ql/integration-tests/java/maven-enforcer-property-version/test.py @@ -3,7 +3,7 @@ def test(codeql, java): codeql.database.create( _env={ - "EXPECT_MAVEN": "apache-maven-3.9.9", + "EXPECT_MAVEN": "apache-maven-3.9.16", "LGTM_INDEX_MAVEN_SETTINGS_FILE": os.path.join(os.path.dirname(os.path.realpath(__file__)), "settings.xml"), }, ) diff --git a/java/ql/integration-tests/java/maven-enforcer-single-version/test.py b/java/ql/integration-tests/java/maven-enforcer-single-version/test.py index ac4bff0d9e26..295db6762b6f 100644 --- a/java/ql/integration-tests/java/maven-enforcer-single-version/test.py +++ b/java/ql/integration-tests/java/maven-enforcer-single-version/test.py @@ -3,7 +3,7 @@ def test(codeql, java): codeql.database.create( _env={ - "EXPECT_MAVEN": "apache-maven-3.9.9", + "EXPECT_MAVEN": "apache-maven-3.9.16", "LGTM_INDEX_MAVEN_SETTINGS_FILE": os.path.join(os.path.dirname(os.path.realpath(__file__)), "settings.xml"), }, ) From 48718e539e8afd0175b19ada3fef855e4a340a53 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 14 Aug 2026 10:05:02 +0200 Subject: [PATCH 0300/2098] Rust: adapt extractor to ra_ap 0.0.347 API --- rust/extractor/src/main.rs | 6 +-- rust/extractor/src/rust_analyzer.rs | 6 +-- rust/extractor/src/translate/base.rs | 55 +++++++++++------------ rust/extractor/src/translate/generated.rs | 2 +- 4 files changed, 34 insertions(+), 35 deletions(-) diff --git a/rust/extractor/src/main.rs b/rust/extractor/src/main.rs index d4c6e5352f7d..145abee4505d 100644 --- a/rust/extractor/src/main.rs +++ b/rust/extractor/src/main.rs @@ -106,11 +106,11 @@ impl<'a> Extractor<'a> { .push(ExtractionStep::extract(before_extract, source_kind, file)); } - pub fn extract_with_semantics( + pub fn extract_with_semantics<'db>( &mut self, file: &Path, - semantics: &Semantics<'_, RootDatabase>, - vfs: &Vfs, + semantics: &'db Semantics<'db, RootDatabase>, + vfs: &'db Vfs, source_kind: SourceKind, ) { self.extract(&RustAnalyzer::new(vfs, semantics), file, source_kind); diff --git a/rust/extractor/src/rust_analyzer.rs b/rust/extractor/src/rust_analyzer.rs index 9811bd39ce5b..25d88ec5ce6b 100644 --- a/rust/extractor/src/rust_analyzer.rs +++ b/rust/extractor/src/rust_analyzer.rs @@ -99,7 +99,7 @@ impl<'a> RustAnalyzer<'a> { fn get_file_data( &self, path: &Path, - ) -> Result<(&Semantics<'_, RootDatabase>, EditionedFileId, FileText), RustAnalyzerNoSemantics> + ) -> Result<(&'a Semantics<'a, RootDatabase>, EditionedFileId, FileText), RustAnalyzerNoSemantics> { match self { RustAnalyzer::WithoutSemantics { severity, reason } => Err(RustAnalyzerNoSemantics { @@ -118,12 +118,12 @@ impl<'a> RustAnalyzer<'a> { let editioned_file_id = semantics.attach_first_edition_opt(file_id).ok_or( RustAnalyzerNoSemantics::warning("failed to determine rust edition"), )?; - Ok((semantics, editioned_file_id, input)) + Ok((*semantics, editioned_file_id, input)) } } } - pub fn parse(&self, path: &Path) -> ParseResult<'_> { + pub fn parse(&self, path: &Path) -> ParseResult<'a> { match self.get_file_data(path) { Ok((semantics, file_id, input)) => { let source_file = semantics.parse(file_id); diff --git a/rust/extractor/src/translate/base.rs b/rust/extractor/src/translate/base.rs index 68c3691fd24c..29fc664c9805 100644 --- a/rust/extractor/src/translate/base.rs +++ b/rust/extractor/src/translate/base.rs @@ -5,7 +5,6 @@ use crate::trap::{DiagnosticSeverity, TrapFile, TrapId}; use crate::trap::{Label, TrapClass}; use ra_ap_base_db::EditionedFileId; use ra_ap_hir::Semantics; -use ra_ap_hir::db::ExpandDatabase; use ra_ap_hir_expand::builtin::{BuiltinDeriveExpander, find_builtin_derive}; use ra_ap_hir_expand::span_map::ExpansionSpanMap; use ra_ap_hir_expand::{ExpandResult, ExpandTo, HirFileId, InFile, map_node_range_up_rooted}; @@ -22,7 +21,7 @@ use ra_ap_syntax_bridge::{ DocCommentDesugarMode, syntax_node_to_token_tree, token_tree_to_syntax_node, }; -impl Emission for Translator<'_> { +impl Emission for Translator<'_, '_> { fn pre_emit(&mut self, node: &ast::Item) -> Option> { self.item_pre_emit(node).map(Into::into) } @@ -32,7 +31,7 @@ impl Emission for Translator<'_> { } } -impl Emission for Translator<'_> { +impl Emission for Translator<'_, '_> { fn pre_emit(&mut self, node: &ast::AssocItem) -> Option> { self.item_pre_emit(&node.clone().into()).map(Into::into) } @@ -42,7 +41,7 @@ impl Emission for Translator<'_> { } } -impl Emission for Translator<'_> { +impl Emission for Translator<'_, '_> { fn pre_emit(&mut self, node: &ast::ExternItem) -> Option> { self.item_pre_emit(&node.clone().into()).map(Into::into) } @@ -52,7 +51,7 @@ impl Emission for Translator<'_> { } } -impl Emission for Translator<'_> { +impl Emission for Translator<'_, '_> { fn pre_emit(&mut self, _node: &ast::Meta) -> Option> { self.macro_context_depth += 1; None @@ -63,43 +62,43 @@ impl Emission for Translator<'_> { } } -impl Emission for Translator<'_> { +impl Emission for Translator<'_, '_> { fn post_emit(&mut self, node: &ast::Fn, label: Label) { self.emit_function_has_implementation(node, label); } } -impl Emission for Translator<'_> { +impl Emission for Translator<'_, '_> { fn post_emit(&mut self, node: &ast::Struct, label: Label) { self.emit_derive_expansion(node, label); } } -impl Emission for Translator<'_> { +impl Emission for Translator<'_, '_> { fn post_emit(&mut self, node: &ast::Enum, label: Label) { self.emit_derive_expansion(node, label); } } -impl Emission for Translator<'_> { +impl Emission for Translator<'_, '_> { fn post_emit(&mut self, node: &ast::Union, label: Label) { self.emit_derive_expansion(node, label); } } -impl Emission for Translator<'_> { +impl Emission for Translator<'_, '_> { fn post_emit(&mut self, node: &ast::PathSegment, label: Label) { self.extract_types_from_path_segment(node, label); } } -impl Emission for Translator<'_> { +impl Emission for Translator<'_, '_> { fn post_emit(&mut self, node: &ast::Const, label: Label) { self.emit_const_has_implementation(node, label); } } -impl Emission for Translator<'_> { +impl Emission for Translator<'_, '_> { fn post_emit(&mut self, node: &ast::MacroCall, label: Label) { self.extract_macro_call_expanded(node, label); } @@ -123,13 +122,16 @@ pub enum SourceKind { Library, } -pub struct Translator<'a> { +// `'a` is the (short) lifetime of the borrowed `path`, `'db` the lifetime of the borrowed +// `Semantics`/database. They must stay separate: `Semantics<'db>` is invariant over `'db`, so +// coupling it to the shorter `'a` fails to type-check. +pub struct Translator<'a, 'db> { pub trap: TrapFile, path: &'a str, label: Label, line_index: LineIndex, file_id: Option, - pub semantics: Option<&'a Semantics<'a, RootDatabase>>, + pub semantics: Option<&'db Semantics<'db, RootDatabase>>, source_kind: SourceKind, pub(crate) macro_context_depth: usize, diagnostic_count: usize, @@ -144,15 +146,15 @@ const UNKNOWN_LOCATION: (LineCol, LineCol) = const DIAGNOSTIC_LIMIT_PER_FILE: usize = 100; -impl<'a> Translator<'a> { +impl<'a, 'db> Translator<'a, 'db> { pub fn new( trap: TrapFile, path: &'a str, label: Label, line_index: LineIndex, - semantic_info: Option<&FileSemanticInformation<'a>>, + semantic_info: Option<&FileSemanticInformation<'db>>, source_kind: SourceKind, - ) -> Translator<'a> { + ) -> Translator<'a, 'db> { Translator { trap, path, @@ -372,7 +374,7 @@ impl<'a> Translator<'a> { if let Some(value) = semantics .hir_file_for(expanded) .macro_file() - .and_then(|macro_call_id| semantics.db.parse_macro_expansion_error(macro_call_id)) + .and_then(|macro_call_id| macro_call_id.parse_macro_expansion_error(semantics.db)) { if let Some(err) = &value.err { let error = err.render_to_string(semantics.db); @@ -381,9 +383,8 @@ impl<'a> Translator<'a> { == hir_file_id.file_id().map(|f| f.file_id(semantics.db)) { let location = err.span().range - + semantics - .db - .ast_id_map(hir_file_id) + + hir_file_id + .ast_id_map(semantics.db) .get_erased(err.span().anchor.ast_id) .text_range() .start(); @@ -515,11 +516,9 @@ impl<'a> Translator<'a> { None => return false, } } - HirFileId::MacroFile(macro_call) => sema - .db - .lookup_intern_macro_call(macro_call) - .krate - .cfg_options(sema.db), + HirFileId::MacroFile(macro_call) => { + macro_call.loc(sema.db).krate.cfg_options(sema.db) + } }; cfg_options.check(&cfg_expr) == Some(false) }) @@ -755,11 +754,11 @@ impl<'a> Translator<'a> { let semantics = self.semantics?; let db = semantics.db; let file_id = semantics.hir_file_for(adt.syntax()); - let span_map = db.span_map(file_id); + let span_map = file_id.span_map(db); let call_site = span_map.span_for_range(adt.syntax().text_range()); let input = syntax_node_to_token_tree( adt.syntax(), - span_map.as_ref(), + span_map, call_site, DocCommentDesugarMode::ProcMacro, ); diff --git a/rust/extractor/src/translate/generated.rs b/rust/extractor/src/translate/generated.rs index f620af0e7cde..b84cb0cfc8d9 100644 --- a/rust/extractor/src/translate/generated.rs +++ b/rust/extractor/src/translate/generated.rs @@ -9,7 +9,7 @@ use ra_ap_syntax::ast::{ }; #[rustfmt::skip] use ra_ap_syntax::{AstNode, ast}; -impl Translator<'_> { +impl Translator<'_, '_> { pub(crate) fn emit_asm_operand( &mut self, node: &ast::AsmOperand, From dcc91291b7a2fc71212b9109b79ace51c3ec6498 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 14 Aug 2026 10:52:42 +0200 Subject: [PATCH 0301/2098] Rust: adapt QL library to ra_ap 0.0.347 schema Update hand-written library predicates for the 0.0.347 AST changes: - FormatArgsArg.getArgName() -> getName() (the arg name is now a Name, carrying text, instead of the text-less FormatArgsArgName placeholder). - Visibility.getPath()/hasPath() -> getVisibilityInner().getPath(); the path now hangs off an intermediate VisibilityInner node. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 890cb55d-0437-4bd7-9268-87b8897ada01 --- .../FormatTemplateVariableAccessConstructor.qll | 2 +- .../codeql/rust/elements/internal/VisibilityImpl.qll | 4 ++-- rust/ql/lib/codeql/rust/internal/Definitions.qll | 10 +++++----- rust/ql/lib/codeql/rust/internal/PathResolution.qll | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/rust/ql/lib/codeql/rust/elements/internal/FormatTemplateVariableAccessConstructor.qll b/rust/ql/lib/codeql/rust/elements/internal/FormatTemplateVariableAccessConstructor.qll index 95f01f85c953..b7a4e9ae0be1 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/FormatTemplateVariableAccessConstructor.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/FormatTemplateVariableAccessConstructor.qll @@ -36,7 +36,7 @@ private predicate formatArgsHasArg( pragma[nomagic] private predicate formatArgsHasArgName(Raw::FormatArgsExpr parent) { - exists(parent.getArg(_).getArgName()) + exists(parent.getArg(_).getName()) } /** diff --git a/rust/ql/lib/codeql/rust/elements/internal/VisibilityImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/VisibilityImpl.qll index e2bc7140b59e..7fb16d018736 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/VisibilityImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/VisibilityImpl.qll @@ -25,9 +25,9 @@ module Impl { override string toStringImpl() { result = this.toAbbreviatedString() } override string toAbbreviatedString() { - result = "pub(" + this.getPath().toAbbreviatedString() + ")" + result = "pub(" + this.getVisibilityInner().getPath().toAbbreviatedString() + ")" or - not this.hasPath() and result = "pub" + not exists(this.getVisibilityInner().getPath()) and result = "pub" } } } diff --git a/rust/ql/lib/codeql/rust/internal/Definitions.qll b/rust/ql/lib/codeql/rust/internal/Definitions.qll index aa0c5146b41f..6055e1a9965b 100644 --- a/rust/ql/lib/codeql/rust/internal/Definitions.qll +++ b/rust/ql/lib/codeql/rust/internal/Definitions.qll @@ -8,7 +8,7 @@ private import codeql.rust.elements.Variable private import codeql.rust.elements.Locatable private import codeql.rust.elements.FormatArgsExpr private import codeql.rust.elements.FormatArgsArg -private import codeql.rust.elements.FormatArgsArgName +private import codeql.rust.elements.Name private import codeql.rust.elements.Format private import codeql.rust.elements.MacroCall private import codeql.rust.elements.NamedFormatArgument @@ -34,7 +34,7 @@ private module Cached { cached newtype TDef = TVariable(Variable v) or - TFormatArgsArgDef(FormatArgsArgName name) { name = any(FormatArgsArg a).getArgName() } or + TFormatArgsArgDef(Name name) { name = any(FormatArgsArg a).getName() } or TFormatArgsArgIndex(Expr e) { e = any(FormatArgsArg a).getExpr() } or TItemNode(ItemNode i) @@ -68,7 +68,7 @@ class Definition extends Cached::TDef { Variable asVariable() { this = Cached::TVariable(result) } /** Gets this definition as a format argument name */ - FormatArgsArgName asFormatArgsArgName() { this = Cached::TFormatArgsArgDef(result) } + Name asFormatArgsArgName() { this = Cached::TFormatArgsArgDef(result) } /** Gets this definition as an `Expr` */ Expr asExpr() { this = Cached::TFormatArgsArgIndex(result) } @@ -96,12 +96,12 @@ private class LocalVariableUse extends Use instanceof VariableAccess { } private class NamedFormatArgumentUse extends Use instanceof NamedFormatArgument { - private FormatArgsArgName def; + private Name def; NamedFormatArgumentUse() { exists(FormatArgsExpr parent | parent = this.getParent().getParent() and - parent.getAnArg().getArgName() = def + parent.getAnArg().getName() = def ) } diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index 15a67ff62679..439c01a9dca1 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -1962,7 +1962,7 @@ private predicate pathUsesNamespace(PathExt p, Namespace n) { or n.isType() and ( - p = any(Visibility v).getPath() + p = any(Visibility v).getVisibilityInner().getPath() or p = any(StructExpr re).getPath() or From fe0e62206d55ed767d5b67c2d92515d5e7e99415 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 14 Aug 2026 11:22:46 +0200 Subject: [PATCH 0302/2098] Unified: Address Copilot code review --- .../register_downloaded_macos_toolchain.patch | 76 ++++++++++++++++++- .../4.0.0-rc5-codeql.1/source.json | 2 +- 2 files changed, 75 insertions(+), 3 deletions(-) diff --git a/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/patches/register_downloaded_macos_toolchain.patch b/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/patches/register_downloaded_macos_toolchain.patch index 029f78c06f03..6d94822e0247 100644 --- a/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/patches/register_downloaded_macos_toolchain.patch +++ b/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/patches/register_downloaded_macos_toolchain.patch @@ -87,11 +87,15 @@ diff --git a/swift/internal/extensions/toolchain.BUILD b/swift/internal/extensio diff --git a/swift/internal/extensions/standalone_toolchain.bzl b/swift/internal/extensions/standalone_toolchain.bzl --- a/swift/internal/extensions/standalone_toolchain.bzl +++ b/swift/internal/extensions/standalone_toolchain.bzl -@@ -91,11 +91,13 @@ def _standalone_toolchain_impl(repository_ctx): +@@ -91,11 +91,17 @@ def _standalone_toolchain_impl(repository_ctx): strip_prefix = filename.removesuffix(".tar.gz"), ) -+ macos_sdkroot = _run(repository_ctx, ["xcrun", "--sdk", "macosx", "--show-sdk-path"]) if repository_ctx.attr.platform == "xcode" else "" ++ macos_sdkroot = "" ++ if repository_ctx.attr.platform == "xcode": ++ macos_sdkroot = _run(repository_ctx, ["xcrun", "--sdk", "macosx", "--show-sdk-path"]) ++ repository_ctx.watch(macos_sdkroot) ++ repository_ctx.file(".swift-version", repository_ctx.attr.swift_version) repository_ctx.template( "BUILD.bazel", @@ -101,3 +105,71 @@ diff --git a/swift/internal/extensions/standalone_toolchain.bzl b/swift/internal "{swift_version}": repository_ctx.attr.swift_version, }, ) +@@ -107,19 +109,29 @@ def _standalone_toolchain_impl(repository_ctx): +-standalone_toolchain = repository_rule( +- implementation = _standalone_toolchain_impl, +- attrs = { +- "_build_template": attr.label( +- default = "//swift/internal/extensions:toolchain.BUILD", +- ), +- "platform": attr.string( +- doc = "The host platform name in the swift package download URL", +- mandatory = True, +- ), +- "sha256": attr.string( +- doc = "The expected SHA-256 of the file downloaded. This must match the SHA-256 of the file downloaded.", +- ), +- "swift_version": attr.string( +- doc = "Version of the swift toolchain to be installed.", +- mandatory = True, +- ), +- }, ++_STANDALONE_TOOLCHAIN_ATTRS = { ++ "_build_template": attr.label( ++ default = "//swift/internal/extensions:toolchain.BUILD", ++ ), ++ "platform": attr.string( ++ doc = "The host platform name in the swift package download URL", ++ mandatory = True, ++ ), ++ "sha256": attr.string( ++ doc = "The expected SHA-256 of the file downloaded. This must match the SHA-256 of the file downloaded.", ++ ), ++ "swift_version": attr.string( ++ doc = "Version of the swift toolchain to be installed.", ++ mandatory = True, ++ ), ++} ++ ++standalone_toolchain = repository_rule( ++ implementation = _standalone_toolchain_impl, ++ attrs = _STANDALONE_TOOLCHAIN_ATTRS, ++) ++ ++standalone_macos_toolchain = repository_rule( ++ implementation = _standalone_toolchain_impl, ++ attrs = _STANDALONE_TOOLCHAIN_ATTRS, ++ configure = True, ++ environ = ["DEVELOPER_DIR"], ++ local = True, + ) +diff --git a/swift/extensions.bzl b/swift/extensions.bzl +--- a/swift/extensions.bzl ++++ b/swift/extensions.bzl +@@ -17 +17,5 @@ +-load("//swift/internal/extensions:standalone_toolchain.bzl", "standalone_toolchain") ++load( ++ "//swift/internal/extensions:standalone_toolchain.bzl", ++ "standalone_macos_toolchain", ++ "standalone_toolchain", ++) +@@ -182,7 +186,8 @@ def _standalone_toolchain_impl(module_ctx): + toolchain_releases = toolchain.platform_sha256.items() or swift_releases[swift_version].items() + for platform, sha256 in toolchain_releases: + repository_name = toolchain.name + "_{}".format(platform) +- standalone_toolchain( ++ toolchain_repository = standalone_macos_toolchain if platform == "xcode" else standalone_toolchain ++ toolchain_repository( + name = repository_name, + sha256 = sha256, + platform = platform, diff --git a/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/source.json b/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/source.json index fd5c4f2047e7..4f98e32f3d62 100644 --- a/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/source.json +++ b/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/source.json @@ -2,7 +2,7 @@ "integrity": "sha256-Ly2lS4AlZJMiyqAxKHyCB+2pGeP5aYkQ6zv8QheeSTI=", "url": "https://github.com/bazelbuild/rules_swift/releases/download/4.0.0-rc5/rules_swift.4.0.0-rc5.tar.gz", "patches": { - "register_downloaded_macos_toolchain.patch": "sha256-kFzGyE1MhhiDxUfEzRPUTahvycyy+VNgPzQ5I44zRYc=" + "register_downloaded_macos_toolchain.patch": "sha256-249WJ4YEH2HmxlvGftl4eD53792joKJx9Dh0j5eHAgo=" }, "patch_strip": 1 } From f33422128615026a40bef5f47d3908ba2f1994f7 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 14 Aug 2026 12:11:35 +0200 Subject: [PATCH 0303/2098] Rust: bump test toolchain to 1.97 and update generated test expectations The ra_ap 0.0.347 builtin format_args! expander needs a newer std than 0.0.328, so the QL test toolchain is bumped to 1.97 (matching the root dev toolchain). Generated extractor-test expectations are regenerated for the new schema fields (asm attrs, Trait impl_restriction, Struct/TupleField mut_restriction, Visibility visibility_inner, FormatArgsArg name) and for the std sysroot dependency churn that comes with the newer toolchain. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 890cb55d-0437-4bd7-9268-87b8897ada01 --- .../crate_graph/crates.expected | 48 ++++++++----------- .../AsmClobberAbi/AsmClobberAbi.expected | 2 + .../AsmOperandNamed/AsmOperandNamed.expected | 1 + .../AsmOptionsList/AsmOptionsList.expected | 1 + .../FormatArgsExpr/FormatArgsArg.expected | 6 +-- .../NeverTypeRepr/NeverTypeRepr.expected | 1 - .../StructField/StructField.expected | 1 + .../generated/Trait/Trait.expected | 1 + .../generated/TupleField/TupleField.expected | 1 + .../generated/Visibility/Visibility.expected | 2 +- rust/ql/test/rust-toolchain.toml | 2 +- 11 files changed, 33 insertions(+), 33 deletions(-) diff --git a/rust/ql/test/extractor-tests/crate_graph/crates.expected b/rust/ql/test/extractor-tests/crate_graph/crates.expected index f4bd0ae031ba..8f1bb1590f44 100644 --- a/rust/ql/test/extractor-tests/crate_graph/crates.expected +++ b/rust/ql/test/extractor-tests/crate_graph/crates.expected @@ -17,7 +17,7 @@ #-----| std -> Crate(std@0.0.0) #-----| test -> Crate(test@0.0.0) -#-----| Crate(cfg_if@1.0.1) +#-----| Crate(cfg_if@1.0.4) #-----| core -> Crate(core@0.0.0) #-----| Crate(compiler_builtins@0.1.160) @@ -43,6 +43,8 @@ #-----| block_buffer -> Crate(block_buffer@0.10.4) #-----| crypto_common -> Crate(crypto_common@0.1.6) +#-----| Crate(foldhash@0.2.0) + #-----| Crate(generic_array@0.14.7) #-----| proc_macro -> Crate(proc_macro@0.0.0) #-----| alloc -> Crate(alloc@0.0.0) @@ -51,16 +53,16 @@ #-----| test -> Crate(test@0.0.0) #-----| typenum -> Crate(typenum@1.18.0) -#-----| Crate(getopts@0.2.23) +#-----| Crate(getopts@0.2.24) #-----| core -> Crate(core@0.0.0) #-----| std -> Crate(std@0.0.0) -#-----| unicode_width -> Crate(unicode_width@0.2.1) -#-----| Crate(hashbrown@0.15.4) +#-----| Crate(hashbrown@0.17.1) #-----| alloc -> Crate(alloc@0.0.0) #-----| core -> Crate(core@0.0.0) +#-----| foldhash -> Crate(foldhash@0.2.0) -#-----| Crate(libc@0.2.174) +#-----| Crate(libc@0.2.185) #-----| rustc_std_workspace_core -> Crate(core@0.0.0) main.rs: @@ -96,14 +98,13 @@ main.rs: #-----| Crate(panic_unwind@0.0.0) #-----| alloc -> Crate(alloc@0.0.0) #-----| core -> Crate(core@0.0.0) -#-----| cfg_if -> Crate(cfg_if@1.0.1) -#-----| libc -> Crate(libc@0.2.174) +#-----| libc -> Crate(libc@0.2.185) #-----| unwind -> Crate(unwind@0.0.0) #-----| Crate(proc_macro@0.0.0) #-----| core -> Crate(core@0.0.0) #-----| std -> Crate(std@0.0.0) -#-----| rustc_literal_escaper -> Crate(rustc_literal_escaper@0.0.5) +#-----| rustc_literal_escaper -> Crate(rustc_literal_escaper@0.0.7) #-----| Crate(rand@0.9.2) #-----| rand_core -> Crate(rand_core@0.9.3) @@ -113,38 +114,36 @@ main.rs: #-----| Crate(rand_xorshift@0.4.0) #-----| rand_core -> Crate(rand_core@0.9.3) -#-----| Crate(rustc_demangle@0.1.25) +#-----| Crate(rustc_demangle@0.1.27) #-----| core -> Crate(core@0.0.0) -#-----| Crate(rustc_literal_escaper@0.0.5) +#-----| Crate(rustc_literal_escaper@0.0.7) #-----| core -> Crate(core@0.0.0) -#-----| std -> Crate(std@0.0.0) #-----| Crate(std@0.0.0) #-----| alloc -> Crate(alloc@0.0.0) #-----| core -> Crate(core@0.0.0) -#-----| cfg_if -> Crate(cfg_if@1.0.1) -#-----| hashbrown -> Crate(hashbrown@0.15.4) -#-----| libc -> Crate(libc@0.2.174) -#-----| rand -> Crate(rand@0.9.2) -#-----| rand_xorshift -> Crate(rand_xorshift@0.4.0) -#-----| rustc_demangle -> Crate(rustc_demangle@0.1.25) #-----| panic_abort -> Crate(panic_abort@0.0.0) +#-----| libc -> Crate(libc@0.2.185) #-----| unwind -> Crate(unwind@0.0.0) #-----| panic_unwind -> Crate(panic_unwind@0.0.0) #-----| std_detect -> Crate(std_detect@0.1.5) +#-----| cfg_if -> Crate(cfg_if@1.0.4) +#-----| hashbrown -> Crate(hashbrown@0.17.1) +#-----| rand -> Crate(rand@0.9.2) +#-----| rand_xorshift -> Crate(rand_xorshift@0.4.0) +#-----| rustc_demangle -> Crate(rustc_demangle@0.1.27) #-----| Crate(std_detect@0.1.5) #-----| alloc -> Crate(alloc@0.0.0) #-----| core -> Crate(core@0.0.0) -#-----| cfg_if -> Crate(cfg_if@1.0.1) -#-----| libc -> Crate(libc@0.2.174) +#-----| libc -> Crate(libc@0.2.185) #-----| Crate(test@0.0.0) #-----| core -> Crate(core@0.0.0) #-----| std -> Crate(std@0.0.0) -#-----| getopts -> Crate(getopts@0.2.23) -#-----| libc -> Crate(libc@0.2.174) +#-----| libc -> Crate(libc@0.2.185) +#-----| getopts -> Crate(getopts@0.2.24) lib.rs: # 0| Crate(test@0.0.1) @@ -163,14 +162,9 @@ lib.rs: #-----| std -> Crate(std@0.0.0) #-----| test -> Crate(test@0.0.0) -#-----| Crate(unicode_width@0.2.1) -#-----| core -> Crate(core@0.0.0) -#-----| std -> Crate(std@0.0.0) - #-----| Crate(unwind@0.0.0) #-----| core -> Crate(core@0.0.0) -#-----| cfg_if -> Crate(cfg_if@1.0.1) -#-----| libc -> Crate(libc@0.2.174) +#-----| libc -> Crate(libc@0.2.185) #-----| Crate(version_check@0.9.5) #-----| proc_macro -> Crate(proc_macro@0.0.0) diff --git a/rust/ql/test/extractor-tests/generated/AsmClobberAbi/AsmClobberAbi.expected b/rust/ql/test/extractor-tests/generated/AsmClobberAbi/AsmClobberAbi.expected index 10f3409cc794..bc4d5d6e3f8f 100644 --- a/rust/ql/test/extractor-tests/generated/AsmClobberAbi/AsmClobberAbi.expected +++ b/rust/ql/test/extractor-tests/generated/AsmClobberAbi/AsmClobberAbi.expected @@ -1 +1,3 @@ +instances | gen_asm_clobber_abi.rs:8:14:8:29 | AsmClobberAbi | +getAttr diff --git a/rust/ql/test/extractor-tests/generated/AsmOperandNamed/AsmOperandNamed.expected b/rust/ql/test/extractor-tests/generated/AsmOperandNamed/AsmOperandNamed.expected index c8aec731ff8c..36351bbf80ae 100644 --- a/rust/ql/test/extractor-tests/generated/AsmOperandNamed/AsmOperandNamed.expected +++ b/rust/ql/test/extractor-tests/generated/AsmOperandNamed/AsmOperandNamed.expected @@ -4,5 +4,6 @@ instances getAsmOperand | gen_asm_operand_named.rs:8:34:8:43 | AsmOperandNamed | gen_asm_operand_named.rs:8:34:8:43 | AsmRegOperand | | gen_asm_operand_named.rs:8:46:8:62 | AsmOperandNamed | gen_asm_operand_named.rs:8:54:8:62 | AsmRegOperand | +getAttr getName | gen_asm_operand_named.rs:8:46:8:62 | AsmOperandNamed | gen_asm_operand_named.rs:8:46:8:50 | input | diff --git a/rust/ql/test/extractor-tests/generated/AsmOptionsList/AsmOptionsList.expected b/rust/ql/test/extractor-tests/generated/AsmOptionsList/AsmOptionsList.expected index cf9ec35d070e..c0634930367a 100644 --- a/rust/ql/test/extractor-tests/generated/AsmOptionsList/AsmOptionsList.expected +++ b/rust/ql/test/extractor-tests/generated/AsmOptionsList/AsmOptionsList.expected @@ -3,3 +3,4 @@ instances getAsmOption | gen_asm_options_list.rs:8:14:8:36 | AsmOptionsList | 0 | gen_asm_options_list.rs:8:22:8:28 | AsmOption | | gen_asm_options_list.rs:8:14:8:36 | AsmOptionsList | 1 | gen_asm_options_list.rs:8:31:8:35 | AsmOption | +getAttr diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg.expected b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg.expected index 01c549f29a1a..32a73ae1c7c4 100644 --- a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg.expected +++ b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg.expected @@ -15,9 +15,6 @@ instances | gen_format_argument.rs:7:34:7:38 | FormatArgsArg | | gen_format_argument.rs:7:41:7:45 | FormatArgsArg | | gen_format_argument.rs:7:48:7:56 | FormatArgsArg | -getArgName -| gen_format_args_expr.rs:7:35:7:37 | FormatArgsArg | gen_format_args_expr.rs:7:35:7:36 | FormatArgsArgName | -| gen_format_args_expr.rs:7:40:7:42 | FormatArgsArg | gen_format_args_expr.rs:7:40:7:41 | FormatArgsArgName | getExpr | gen_format.rs:5:26:5:32 | FormatArgsArg | gen_format.rs:5:26:5:32 | "world" | | gen_format.rs:12:35:12:38 | FormatArgsArg | gen_format.rs:12:35:12:38 | name | @@ -35,3 +32,6 @@ getExpr | gen_format_argument.rs:7:34:7:38 | FormatArgsArg | gen_format_argument.rs:7:34:7:38 | value | | gen_format_argument.rs:7:41:7:45 | FormatArgsArg | gen_format_argument.rs:7:41:7:45 | width | | gen_format_argument.rs:7:48:7:56 | FormatArgsArg | gen_format_argument.rs:7:48:7:56 | precision | +getName +| gen_format_args_expr.rs:7:35:7:37 | FormatArgsArg | gen_format_args_expr.rs:7:35:7:35 | a | +| gen_format_args_expr.rs:7:40:7:42 | FormatArgsArg | gen_format_args_expr.rs:7:40:7:40 | b | diff --git a/rust/ql/test/extractor-tests/generated/NeverTypeRepr/NeverTypeRepr.expected b/rust/ql/test/extractor-tests/generated/NeverTypeRepr/NeverTypeRepr.expected index 7e8d7f8718b1..c02b6c823544 100644 --- a/rust/ql/test/extractor-tests/generated/NeverTypeRepr/NeverTypeRepr.expected +++ b/rust/ql/test/extractor-tests/generated/NeverTypeRepr/NeverTypeRepr.expected @@ -1,2 +1 @@ | gen_never_type_repr.rs:7:17:7:17 | ! | -| gen_never_type_repr.rs:7:21:7:26 | ! | diff --git a/rust/ql/test/extractor-tests/generated/StructField/StructField.expected b/rust/ql/test/extractor-tests/generated/StructField/StructField.expected index 981fafb354ca..e9bd7c377576 100644 --- a/rust/ql/test/extractor-tests/generated/StructField/StructField.expected +++ b/rust/ql/test/extractor-tests/generated/StructField/StructField.expected @@ -2,6 +2,7 @@ instances | gen_struct_field.rs:7:16:7:21 | x: i32 | isUnsafe: | no | getAttr getDefaultVal +getMutRestriction getName | gen_struct_field.rs:7:16:7:21 | x: i32 | gen_struct_field.rs:7:16:7:16 | x | getTypeRepr diff --git a/rust/ql/test/extractor-tests/generated/Trait/Trait.expected b/rust/ql/test/extractor-tests/generated/Trait/Trait.expected index 9e8d41cb5ff5..c93a13757517 100644 --- a/rust/ql/test/extractor-tests/generated/Trait/Trait.expected +++ b/rust/ql/test/extractor-tests/generated/Trait/Trait.expected @@ -8,6 +8,7 @@ getAssocItemList getAttr getGenericParamList | gen_trait.rs:10:1:10:57 | trait Foo | gen_trait.rs:10:14:10:30 | <...> | +getImplRestriction getName | gen_trait.rs:3:1:8:1 | trait Frobinizable | gen_trait.rs:4:7:4:18 | Frobinizable | | gen_trait.rs:10:1:10:57 | trait Foo | gen_trait.rs:10:11:10:13 | Foo | diff --git a/rust/ql/test/extractor-tests/generated/TupleField/TupleField.expected b/rust/ql/test/extractor-tests/generated/TupleField/TupleField.expected index 6c653a9c37f4..56f7369b8ec5 100644 --- a/rust/ql/test/extractor-tests/generated/TupleField/TupleField.expected +++ b/rust/ql/test/extractor-tests/generated/TupleField/TupleField.expected @@ -2,6 +2,7 @@ instances | gen_tuple_field.rs:7:14:7:16 | TupleField | | gen_tuple_field.rs:7:19:7:24 | TupleField | getAttr +getMutRestriction getTypeRepr | gen_tuple_field.rs:7:14:7:16 | TupleField | gen_tuple_field.rs:7:14:7:16 | i32 | | gen_tuple_field.rs:7:19:7:24 | TupleField | gen_tuple_field.rs:7:19:7:24 | String | diff --git a/rust/ql/test/extractor-tests/generated/Visibility/Visibility.expected b/rust/ql/test/extractor-tests/generated/Visibility/Visibility.expected index 2d032d6eee46..b843c1448381 100644 --- a/rust/ql/test/extractor-tests/generated/Visibility/Visibility.expected +++ b/rust/ql/test/extractor-tests/generated/Visibility/Visibility.expected @@ -1,4 +1,4 @@ instances | gen_visibility.rs:7:7:7:9 | pub | | lib.rs:1:1:1:3 | pub | -getPath +getVisibilityInner diff --git a/rust/ql/test/rust-toolchain.toml b/rust/ql/test/rust-toolchain.toml index 9343bef27c61..dac74a8c0d54 100644 --- a/rust/ql/test/rust-toolchain.toml +++ b/rust/ql/test/rust-toolchain.toml @@ -2,6 +2,6 @@ # IMPORTANT: this can also have an impact on QL test results [toolchain] -channel = "1.90" +channel = "1.97" profile = "minimal" components = [ "rust-src" ] From 85886eefbbbbe7fbfb91d8bbdb9e31a123e090fc Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 14 Aug 2026 12:12:32 +0200 Subject: [PATCH 0304/2098] Rust: add DB upgrade/downgrade scripts and change note for ra_ap 0.0.347 The schema delta for ra_ap 0.0.347 adds the new node kinds DerefPat, ImplRestriction, IncludeBytesExpr, MutRestriction, NotNull, PatternTypeRepr and VisibilityInner, moves a Visibility path onto the new VisibilityInner, replaces the text-less FormatArgsArgName placeholder with a Name, and adds attrs to the inline assembly nodes, mut_restriction to Struct/TupleField and impl_restriction to Trait. The upgrade repurposes the old format-arg placeholder ids as Name ids (avoiding dangling refs) and synthesises a VisibilityInner per visibility with a path. The downgrade rejoins the visibility path, repurposes ids back to the placeholder, and scrubs the locations of the deleted node kinds. compatibility is partial: the new node kinds are empty on old DBs, so a rebuild yields strictly-better results while existing queries keep working. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 890cb55d-0437-4bd7-9268-87b8897ada01 --- .../downgrade.ql | 50 + .../old.dbscheme | 3737 +++++++++++++++++ .../rust.dbscheme | 3627 ++++++++++++++++ .../upgrade.properties | 33 + .../2026-08-14-rust-analyzer-0.0.347.md | 4 + .../old.dbscheme | 3627 ++++++++++++++++ .../rust.dbscheme | 3737 +++++++++++++++++ .../upgrade.properties | 13 + .../upgrade.ql | 53 + 9 files changed, 14881 insertions(+) create mode 100644 rust/downgrades/852696f20117c338fbb4e6a4f5ed69df79682c37/downgrade.ql create mode 100644 rust/downgrades/852696f20117c338fbb4e6a4f5ed69df79682c37/old.dbscheme create mode 100644 rust/downgrades/852696f20117c338fbb4e6a4f5ed69df79682c37/rust.dbscheme create mode 100644 rust/downgrades/852696f20117c338fbb4e6a4f5ed69df79682c37/upgrade.properties create mode 100644 rust/ql/lib/change-notes/2026-08-14-rust-analyzer-0.0.347.md create mode 100644 rust/ql/lib/upgrades/ed6b1d3d51401eafee5e4b24e1093d731309ac94/old.dbscheme create mode 100644 rust/ql/lib/upgrades/ed6b1d3d51401eafee5e4b24e1093d731309ac94/rust.dbscheme create mode 100644 rust/ql/lib/upgrades/ed6b1d3d51401eafee5e4b24e1093d731309ac94/upgrade.properties create mode 100644 rust/ql/lib/upgrades/ed6b1d3d51401eafee5e4b24e1093d731309ac94/upgrade.ql diff --git a/rust/downgrades/852696f20117c338fbb4e6a4f5ed69df79682c37/downgrade.ql b/rust/downgrades/852696f20117c338fbb4e6a4f5ed69df79682c37/downgrade.ql new file mode 100644 index 000000000000..c0dc901f2f4d --- /dev/null +++ b/rust/downgrades/852696f20117c338fbb4e6a4f5ed69df79682c37/downgrade.ql @@ -0,0 +1,50 @@ +class Element extends @element { + string toString() { none() } +} + +class Location extends @location_default { + string toString() { none() } +} + +// Genuinely-new node kinds with no representation in the old schema. Their own child relations are +// dropped via `delete` in upgrade.properties; here we additionally drop their locations so no +// dangling `locatable_locations` rows remain. +private predicate deletedElement(Element id) { + deref_pats(id) or + not_nulls(id) or + include_bytes_exprs(id) or + pattern_type_reprs(id) or + impl_restrictions(id) or + mut_restrictions(id) or + visibility_inners(id) +} + +// A `@name` used as a format argument's name. The old schema represents these as dedicated text-less +// `@format_args_arg_name` placeholders, so we repurpose these ids into that entity table and drop +// them (and their text) from `names`/`name_texts`. +private predicate formatArgName(Element name) { format_args_arg_names(_, name) } + +// The new schema inserts a `VisibilityInner` node between `Visibility` and its path; the old schema +// stores the path directly on the `Visibility`, so we rejoin the two hops. +query predicate new_visibility_paths(Element visibility, Element path) { + exists(Element inner | + visibility_visibility_inners(visibility, inner) and + visibility_inner_paths(inner, path) + ) +} + +query predicate new_format_args_arg_names(Element id) { formatArgName(id) } + +query predicate new_format_args_arg_arg_names(Element arg, Element name) { + format_args_arg_names(arg, name) +} + +query predicate new_names(Element id) { names(id) and not formatArgName(id) } + +query predicate new_name_texts(Element id, string text) { + name_texts(id, text) and not formatArgName(id) +} + +query predicate new_locatable_locations(Element id, Location location) { + locatable_locations(id, location) and not deletedElement(id) +} diff --git a/rust/downgrades/852696f20117c338fbb4e6a4f5ed69df79682c37/old.dbscheme b/rust/downgrades/852696f20117c338fbb4e6a4f5ed69df79682c37/old.dbscheme new file mode 100644 index 000000000000..852696f20117 --- /dev/null +++ b/rust/downgrades/852696f20117c338fbb4e6a4f5ed69df79682c37/old.dbscheme @@ -0,0 +1,3737 @@ +// generated by codegen, do not edit + +// from ../shared/tree-sitter-extractor/src/generator/prefix.dbscheme +/*- Files and folders -*/ + +/** + * The location of an element. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @file | @folder + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +/*- Empty location -*/ + +empty_location( + int location: @location_default ref +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/*- Diagnostic messages -*/ + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/*- Diagnostic messages: severity -*/ + +case @diagnostic.severity of + 10 = @diagnostic_debug +| 20 = @diagnostic_info +| 30 = @diagnostic_warning +| 40 = @diagnostic_error +; + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_comments (unique int id: @yaml_comment, + string text: string ref, + string tostring: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error | @yaml_comment; + +/*- Database metadata -*/ + +/** + * The CLI will automatically emit applicable tuples for this table, + * such as `databaseMetadata("isOverlay", "true")` when building an + * overlay database. + */ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +/*- Overlay support -*/ + +/** + * The CLI will automatically emit tuples for each new/modified/deleted file + * when building an overlay database. + */ +overlayChangedFiles( + string path: string ref +); + + +// from prefix.dbscheme +#keyset[id] +locatable_locations( + int id: @locatable ref, + int location: @location_default ref +); + + +// from schema + +@element = + @extractor_step +| @locatable +| @named_crate +| @unextracted +; + +extractor_steps( + unique int id: @extractor_step, + string action: string ref, + int duration_ms: int ref +); + +#keyset[id] +extractor_step_files( + int id: @extractor_step ref, + int file: @file ref +); + +@locatable = + @ast_node +| @crate +; + +named_crates( + unique int id: @named_crate, + string name: string ref, + int crate: @crate ref +); + +@unextracted = + @missing +| @unimplemented +; + +@ast_node = + @abi +| @addressable +| @arg_list +| @asm_dir_spec +| @asm_operand +| @asm_operand_expr +| @asm_option +| @asm_piece +| @asm_reg_spec +| @assoc_item_list +| @attr +| @callable +| @cfg_predicate +| @expr +| @extern_item_list +| @field_list +| @for_binder +| @format_args_arg +| @generic_arg +| @generic_arg_list +| @generic_param +| @generic_param_list +| @impl_restriction +| @item_list +| @label +| @let_else +| @macro_items +| @match_arm +| @match_arm_list +| @match_guard +| @meta +| @mut_restriction +| @name +| @param_base +| @param_list +| @parenthesized_arg_list +| @pat +| @path +| @path_ast_node +| @path_segment +| @rename +| @ret_type_repr +| @return_type_syntax +| @source_file +| @stmt +| @stmt_list +| @struct_expr_field +| @struct_expr_field_list +| @struct_field +| @struct_pat_field +| @struct_pat_field_list +| @token +| @token_tree +| @try_block_modifier +| @tuple_field +| @type_bound +| @type_bound_list +| @type_repr +| @use_bound_generic_arg +| @use_bound_generic_args +| @use_tree +| @use_tree_list +| @variant_list +| @visibility +| @visibility_inner +| @where_clause +| @where_pred +; + +crates( + unique int id: @crate +); + +#keyset[id] +crate_names( + int id: @crate ref, + string name: string ref +); + +#keyset[id] +crate_versions( + int id: @crate ref, + string version: string ref +); + +#keyset[id, index] +crate_cfg_options( + int id: @crate ref, + int index: int ref, + string cfg_option: string ref +); + +#keyset[id, index] +crate_named_dependencies( + int id: @crate ref, + int index: int ref, + int named_dependency: @named_crate ref +); + +missings( + unique int id: @missing +); + +unimplementeds( + unique int id: @unimplemented +); + +abis( + unique int id: @abi +); + +#keyset[id] +abi_abi_strings( + int id: @abi ref, + string abi_string: string ref +); + +@addressable = + @item +| @variant +; + +arg_lists( + unique int id: @arg_list +); + +#keyset[id, index] +arg_list_args( + int id: @arg_list ref, + int index: int ref, + int arg: @expr ref +); + +asm_dir_specs( + unique int id: @asm_dir_spec +); + +@asm_operand = + @asm_const +| @asm_label +| @asm_reg_operand +| @asm_sym +; + +asm_operand_exprs( + unique int id: @asm_operand_expr +); + +#keyset[id] +asm_operand_expr_in_exprs( + int id: @asm_operand_expr ref, + int in_expr: @expr ref +); + +#keyset[id] +asm_operand_expr_out_exprs( + int id: @asm_operand_expr ref, + int out_expr: @expr ref +); + +asm_options( + unique int id: @asm_option +); + +#keyset[id] +asm_option_is_raw( + int id: @asm_option ref +); + +@asm_piece = + @asm_clobber_abi +| @asm_operand_named +| @asm_options_list +; + +asm_reg_specs( + unique int id: @asm_reg_spec +); + +#keyset[id] +asm_reg_spec_identifiers( + int id: @asm_reg_spec ref, + int identifier: @name_ref ref +); + +assoc_item_lists( + unique int id: @assoc_item_list +); + +#keyset[id, index] +assoc_item_list_assoc_items( + int id: @assoc_item_list ref, + int index: int ref, + int assoc_item: @assoc_item ref +); + +#keyset[id, index] +assoc_item_list_attrs( + int id: @assoc_item_list ref, + int index: int ref, + int attr: @attr ref +); + +attrs( + unique int id: @attr +); + +#keyset[id] +attr_meta( + int id: @attr ref, + int meta: @meta ref +); + +@callable = + @closure_expr +| @function +; + +#keyset[id] +callable_param_lists( + int id: @callable ref, + int param_list: @param_list ref +); + +#keyset[id, index] +callable_attrs( + int id: @callable ref, + int index: int ref, + int attr: @attr ref +); + +@cfg_predicate = + @cfg_atom +| @cfg_composite +; + +@expr = + @array_expr_internal +| @asm_expr +| @await_expr +| @become_expr +| @binary_expr +| @break_expr +| @call_expr +| @cast_expr +| @closure_expr +| @continue_expr +| @field_expr +| @format_args_expr +| @if_expr +| @include_bytes_expr +| @index_expr +| @labelable_expr +| @let_expr +| @literal_expr +| @macro_expr +| @match_expr +| @method_call_expr +| @offset_of_expr +| @paren_expr +| @path_expr_base +| @prefix_expr +| @range_expr +| @ref_expr +| @return_expr +| @struct_expr +| @try_expr +| @tuple_expr +| @underscore_expr +| @yeet_expr +| @yield_expr +; + +extern_item_lists( + unique int id: @extern_item_list +); + +#keyset[id, index] +extern_item_list_attrs( + int id: @extern_item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +extern_item_list_extern_items( + int id: @extern_item_list ref, + int index: int ref, + int extern_item: @extern_item ref +); + +@field_list = + @struct_field_list +| @tuple_field_list +; + +for_binders( + unique int id: @for_binder +); + +#keyset[id] +for_binder_generic_param_lists( + int id: @for_binder ref, + int generic_param_list: @generic_param_list ref +); + +format_args_args( + unique int id: @format_args_arg +); + +#keyset[id] +format_args_arg_exprs( + int id: @format_args_arg ref, + int expr: @expr ref +); + +#keyset[id] +format_args_arg_names( + int id: @format_args_arg ref, + int name: @name ref +); + +@generic_arg = + @assoc_type_arg +| @const_arg +| @lifetime_arg +| @type_arg +; + +generic_arg_lists( + unique int id: @generic_arg_list +); + +#keyset[id, index] +generic_arg_list_generic_args( + int id: @generic_arg_list ref, + int index: int ref, + int generic_arg: @generic_arg ref +); + +@generic_param = + @const_param +| @lifetime_param +| @type_param +; + +generic_param_lists( + unique int id: @generic_param_list +); + +#keyset[id, index] +generic_param_list_generic_params( + int id: @generic_param_list ref, + int index: int ref, + int generic_param: @generic_param ref +); + +impl_restrictions( + unique int id: @impl_restriction +); + +#keyset[id] +impl_restriction_visibility_inners( + int id: @impl_restriction ref, + int visibility_inner: @visibility_inner ref +); + +item_lists( + unique int id: @item_list +); + +#keyset[id, index] +item_list_attrs( + int id: @item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +item_list_items( + int id: @item_list ref, + int index: int ref, + int item: @item ref +); + +labels( + unique int id: @label +); + +#keyset[id] +label_lifetimes( + int id: @label ref, + int lifetime: @lifetime ref +); + +let_elses( + unique int id: @let_else +); + +#keyset[id] +let_else_block_exprs( + int id: @let_else ref, + int block_expr: @block_expr ref +); + +macro_items( + unique int id: @macro_items +); + +#keyset[id, index] +macro_items_items( + int id: @macro_items ref, + int index: int ref, + int item: @item ref +); + +match_arms( + unique int id: @match_arm +); + +#keyset[id, index] +match_arm_attrs( + int id: @match_arm ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_arm_exprs( + int id: @match_arm ref, + int expr: @expr ref +); + +#keyset[id] +match_arm_guards( + int id: @match_arm ref, + int guard: @match_guard ref +); + +#keyset[id] +match_arm_pats( + int id: @match_arm ref, + int pat: @pat ref +); + +match_arm_lists( + unique int id: @match_arm_list +); + +#keyset[id, index] +match_arm_list_arms( + int id: @match_arm_list ref, + int index: int ref, + int arm: @match_arm ref +); + +#keyset[id, index] +match_arm_list_attrs( + int id: @match_arm_list ref, + int index: int ref, + int attr: @attr ref +); + +match_guards( + unique int id: @match_guard +); + +#keyset[id] +match_guard_conditions( + int id: @match_guard ref, + int condition: @expr ref +); + +@meta = + @cfg_attr_meta +| @cfg_meta +| @key_value_meta +| @path_meta +| @token_tree_meta +| @unsafe_meta +; + +mut_restrictions( + unique int id: @mut_restriction +); + +#keyset[id] +mut_restriction_is_mut( + int id: @mut_restriction ref +); + +#keyset[id] +mut_restriction_visibility_inners( + int id: @mut_restriction ref, + int visibility_inner: @visibility_inner ref +); + +names( + unique int id: @name +); + +#keyset[id] +name_texts( + int id: @name ref, + string text: string ref +); + +@param_base = + @param +| @self_param +; + +#keyset[id, index] +param_base_attrs( + int id: @param_base ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +param_base_type_reprs( + int id: @param_base ref, + int type_repr: @type_repr ref +); + +param_lists( + unique int id: @param_list +); + +#keyset[id, index] +param_list_params( + int id: @param_list ref, + int index: int ref, + int param: @param ref +); + +#keyset[id] +param_list_self_params( + int id: @param_list ref, + int self_param: @self_param ref +); + +parenthesized_arg_lists( + unique int id: @parenthesized_arg_list +); + +#keyset[id, index] +parenthesized_arg_list_type_args( + int id: @parenthesized_arg_list ref, + int index: int ref, + int type_arg: @type_arg ref +); + +@pat = + @box_pat +| @const_block_pat +| @deref_pat +| @ident_pat +| @literal_pat +| @macro_pat +| @not_null +| @or_pat +| @paren_pat +| @path_pat +| @range_pat +| @ref_pat +| @rest_pat +| @slice_pat +| @struct_pat +| @tuple_pat +| @tuple_struct_pat +| @wildcard_pat +; + +paths( + unique int id: @path +); + +#keyset[id] +path_qualifiers( + int id: @path ref, + int qualifier: @path ref +); + +#keyset[id] +path_segments_( + int id: @path ref, + int segment: @path_segment ref +); + +@path_ast_node = + @path_expr +| @path_pat +| @struct_expr +| @struct_pat +| @tuple_struct_pat +; + +#keyset[id] +path_ast_node_paths( + int id: @path_ast_node ref, + int path: @path ref +); + +path_segments( + unique int id: @path_segment +); + +#keyset[id] +path_segment_generic_arg_lists( + int id: @path_segment ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +path_segment_identifiers( + int id: @path_segment ref, + int identifier: @name_ref ref +); + +#keyset[id] +path_segment_parenthesized_arg_lists( + int id: @path_segment ref, + int parenthesized_arg_list: @parenthesized_arg_list ref +); + +#keyset[id] +path_segment_ret_types( + int id: @path_segment ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +path_segment_return_type_syntaxes( + int id: @path_segment ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +path_segment_type_reprs( + int id: @path_segment ref, + int type_repr: @type_repr ref +); + +#keyset[id] +path_segment_trait_type_reprs( + int id: @path_segment ref, + int trait_type_repr: @path_type_repr ref +); + +renames( + unique int id: @rename +); + +#keyset[id] +rename_names( + int id: @rename ref, + int name: @name ref +); + +ret_type_reprs( + unique int id: @ret_type_repr +); + +#keyset[id] +ret_type_repr_type_reprs( + int id: @ret_type_repr ref, + int type_repr: @type_repr ref +); + +return_type_syntaxes( + unique int id: @return_type_syntax +); + +source_files( + unique int id: @source_file +); + +#keyset[id, index] +source_file_attrs( + int id: @source_file ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +source_file_items( + int id: @source_file ref, + int index: int ref, + int item: @item ref +); + +@stmt = + @expr_stmt +| @item +| @let_stmt +; + +stmt_lists( + unique int id: @stmt_list +); + +#keyset[id, index] +stmt_list_attrs( + int id: @stmt_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +stmt_list_statements( + int id: @stmt_list ref, + int index: int ref, + int statement: @stmt ref +); + +#keyset[id] +stmt_list_tail_exprs( + int id: @stmt_list ref, + int tail_expr: @expr ref +); + +struct_expr_fields( + unique int id: @struct_expr_field +); + +#keyset[id, index] +struct_expr_field_attrs( + int id: @struct_expr_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_expr_field_exprs( + int id: @struct_expr_field ref, + int expr: @expr ref +); + +#keyset[id] +struct_expr_field_identifiers( + int id: @struct_expr_field ref, + int identifier: @name_ref ref +); + +struct_expr_field_lists( + unique int id: @struct_expr_field_list +); + +#keyset[id, index] +struct_expr_field_list_attrs( + int id: @struct_expr_field_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +struct_expr_field_list_fields( + int id: @struct_expr_field_list ref, + int index: int ref, + int field: @struct_expr_field ref +); + +#keyset[id] +struct_expr_field_list_spreads( + int id: @struct_expr_field_list ref, + int spread: @expr ref +); + +struct_fields( + unique int id: @struct_field +); + +#keyset[id, index] +struct_field_attrs( + int id: @struct_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_field_default_vals( + int id: @struct_field ref, + int default_val: @const_arg ref +); + +#keyset[id] +struct_field_is_unsafe( + int id: @struct_field ref +); + +#keyset[id] +struct_field_mut_restrictions( + int id: @struct_field ref, + int mut_restriction: @mut_restriction ref +); + +#keyset[id] +struct_field_names( + int id: @struct_field ref, + int name: @name ref +); + +#keyset[id] +struct_field_type_reprs( + int id: @struct_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +struct_field_visibilities( + int id: @struct_field ref, + int visibility: @visibility ref +); + +struct_pat_fields( + unique int id: @struct_pat_field +); + +#keyset[id, index] +struct_pat_field_attrs( + int id: @struct_pat_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_pat_field_identifiers( + int id: @struct_pat_field ref, + int identifier: @name_ref ref +); + +#keyset[id] +struct_pat_field_pats( + int id: @struct_pat_field ref, + int pat: @pat ref +); + +struct_pat_field_lists( + unique int id: @struct_pat_field_list +); + +#keyset[id, index] +struct_pat_field_list_fields( + int id: @struct_pat_field_list ref, + int index: int ref, + int field: @struct_pat_field ref +); + +#keyset[id] +struct_pat_field_list_rest_pats( + int id: @struct_pat_field_list ref, + int rest_pat: @rest_pat ref +); + +@token = + @comment +; + +token_trees( + unique int id: @token_tree +); + +try_block_modifiers( + unique int id: @try_block_modifier +); + +#keyset[id] +try_block_modifier_is_try( + int id: @try_block_modifier ref +); + +#keyset[id] +try_block_modifier_type_reprs( + int id: @try_block_modifier ref, + int type_repr: @type_repr ref +); + +tuple_fields( + unique int id: @tuple_field +); + +#keyset[id, index] +tuple_field_attrs( + int id: @tuple_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +tuple_field_mut_restrictions( + int id: @tuple_field ref, + int mut_restriction: @mut_restriction ref +); + +#keyset[id] +tuple_field_type_reprs( + int id: @tuple_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +tuple_field_visibilities( + int id: @tuple_field ref, + int visibility: @visibility ref +); + +type_bounds( + unique int id: @type_bound +); + +#keyset[id] +type_bound_for_binders( + int id: @type_bound ref, + int for_binder: @for_binder ref +); + +#keyset[id] +type_bound_is_async( + int id: @type_bound ref +); + +#keyset[id] +type_bound_is_const( + int id: @type_bound ref +); + +#keyset[id] +type_bound_lifetimes( + int id: @type_bound ref, + int lifetime: @lifetime ref +); + +#keyset[id] +type_bound_type_reprs( + int id: @type_bound ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_bound_use_bound_generic_args( + int id: @type_bound ref, + int use_bound_generic_args: @use_bound_generic_args ref +); + +type_bound_lists( + unique int id: @type_bound_list +); + +#keyset[id, index] +type_bound_list_bounds( + int id: @type_bound_list ref, + int index: int ref, + int bound: @type_bound ref +); + +@type_repr = + @array_type_repr +| @dyn_trait_type_repr +| @fn_ptr_type_repr +| @for_type_repr +| @impl_trait_type_repr +| @infer_type_repr +| @macro_type_repr +| @never_type_repr +| @paren_type_repr +| @path_type_repr +| @pattern_type_repr +| @ptr_type_repr +| @ref_type_repr +| @slice_type_repr +| @tuple_type_repr +; + +@use_bound_generic_arg = + @lifetime +| @name_ref +; + +use_bound_generic_args( + unique int id: @use_bound_generic_args +); + +#keyset[id, index] +use_bound_generic_args_use_bound_generic_args( + int id: @use_bound_generic_args ref, + int index: int ref, + int use_bound_generic_arg: @use_bound_generic_arg ref +); + +use_trees( + unique int id: @use_tree +); + +#keyset[id] +use_tree_is_glob( + int id: @use_tree ref +); + +#keyset[id] +use_tree_paths( + int id: @use_tree ref, + int path: @path ref +); + +#keyset[id] +use_tree_renames( + int id: @use_tree ref, + int rename: @rename ref +); + +#keyset[id] +use_tree_use_tree_lists( + int id: @use_tree ref, + int use_tree_list: @use_tree_list ref +); + +use_tree_lists( + unique int id: @use_tree_list +); + +#keyset[id, index] +use_tree_list_use_trees( + int id: @use_tree_list ref, + int index: int ref, + int use_tree: @use_tree ref +); + +variant_lists( + unique int id: @variant_list +); + +#keyset[id, index] +variant_list_variants( + int id: @variant_list ref, + int index: int ref, + int variant: @variant ref +); + +visibilities( + unique int id: @visibility +); + +#keyset[id] +visibility_visibility_inners( + int id: @visibility ref, + int visibility_inner: @visibility_inner ref +); + +visibility_inners( + unique int id: @visibility_inner +); + +#keyset[id] +visibility_inner_paths( + int id: @visibility_inner ref, + int path: @path ref +); + +where_clauses( + unique int id: @where_clause +); + +#keyset[id, index] +where_clause_predicates( + int id: @where_clause ref, + int index: int ref, + int predicate: @where_pred ref +); + +where_preds( + unique int id: @where_pred +); + +#keyset[id] +where_pred_for_binders( + int id: @where_pred ref, + int for_binder: @for_binder ref +); + +#keyset[id] +where_pred_lifetimes( + int id: @where_pred ref, + int lifetime: @lifetime ref +); + +#keyset[id] +where_pred_type_reprs( + int id: @where_pred ref, + int type_repr: @type_repr ref +); + +#keyset[id] +where_pred_type_bound_lists( + int id: @where_pred ref, + int type_bound_list: @type_bound_list ref +); + +array_expr_internals( + unique int id: @array_expr_internal +); + +#keyset[id, index] +array_expr_internal_attrs( + int id: @array_expr_internal ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +array_expr_internal_exprs( + int id: @array_expr_internal ref, + int index: int ref, + int expr: @expr ref +); + +#keyset[id] +array_expr_internal_is_semicolon( + int id: @array_expr_internal ref +); + +array_type_reprs( + unique int id: @array_type_repr +); + +#keyset[id] +array_type_repr_const_args( + int id: @array_type_repr ref, + int const_arg: @const_arg ref +); + +#keyset[id] +array_type_repr_element_type_reprs( + int id: @array_type_repr ref, + int element_type_repr: @type_repr ref +); + +asm_clobber_abis( + unique int id: @asm_clobber_abi +); + +#keyset[id, index] +asm_clobber_abi_attrs( + int id: @asm_clobber_abi ref, + int index: int ref, + int attr: @attr ref +); + +asm_consts( + unique int id: @asm_const +); + +#keyset[id] +asm_const_exprs( + int id: @asm_const ref, + int expr: @expr ref +); + +#keyset[id] +asm_const_is_const( + int id: @asm_const ref +); + +asm_labels( + unique int id: @asm_label +); + +#keyset[id] +asm_label_block_exprs( + int id: @asm_label ref, + int block_expr: @block_expr ref +); + +asm_operand_nameds( + unique int id: @asm_operand_named +); + +#keyset[id] +asm_operand_named_asm_operands( + int id: @asm_operand_named ref, + int asm_operand: @asm_operand ref +); + +#keyset[id, index] +asm_operand_named_attrs( + int id: @asm_operand_named ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +asm_operand_named_names( + int id: @asm_operand_named ref, + int name: @name ref +); + +asm_options_lists( + unique int id: @asm_options_list +); + +#keyset[id, index] +asm_options_list_asm_options( + int id: @asm_options_list ref, + int index: int ref, + int asm_option: @asm_option ref +); + +#keyset[id, index] +asm_options_list_attrs( + int id: @asm_options_list ref, + int index: int ref, + int attr: @attr ref +); + +asm_reg_operands( + unique int id: @asm_reg_operand +); + +#keyset[id] +asm_reg_operand_asm_dir_specs( + int id: @asm_reg_operand ref, + int asm_dir_spec: @asm_dir_spec ref +); + +#keyset[id] +asm_reg_operand_asm_operand_exprs( + int id: @asm_reg_operand ref, + int asm_operand_expr: @asm_operand_expr ref +); + +#keyset[id] +asm_reg_operand_asm_reg_specs( + int id: @asm_reg_operand ref, + int asm_reg_spec: @asm_reg_spec ref +); + +asm_syms( + unique int id: @asm_sym +); + +#keyset[id] +asm_sym_paths( + int id: @asm_sym ref, + int path: @path ref +); + +assoc_type_args( + unique int id: @assoc_type_arg +); + +#keyset[id] +assoc_type_arg_const_args( + int id: @assoc_type_arg ref, + int const_arg: @const_arg ref +); + +#keyset[id] +assoc_type_arg_generic_arg_lists( + int id: @assoc_type_arg ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +assoc_type_arg_identifiers( + int id: @assoc_type_arg ref, + int identifier: @name_ref ref +); + +#keyset[id] +assoc_type_arg_param_lists( + int id: @assoc_type_arg ref, + int param_list: @param_list ref +); + +#keyset[id] +assoc_type_arg_ret_types( + int id: @assoc_type_arg ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +assoc_type_arg_return_type_syntaxes( + int id: @assoc_type_arg ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +assoc_type_arg_type_reprs( + int id: @assoc_type_arg ref, + int type_repr: @type_repr ref +); + +#keyset[id] +assoc_type_arg_type_bound_lists( + int id: @assoc_type_arg ref, + int type_bound_list: @type_bound_list ref +); + +await_exprs( + unique int id: @await_expr +); + +#keyset[id, index] +await_expr_attrs( + int id: @await_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +await_expr_exprs( + int id: @await_expr ref, + int expr: @expr ref +); + +become_exprs( + unique int id: @become_expr +); + +#keyset[id, index] +become_expr_attrs( + int id: @become_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +become_expr_exprs( + int id: @become_expr ref, + int expr: @expr ref +); + +binary_exprs( + unique int id: @binary_expr +); + +#keyset[id, index] +binary_expr_attrs( + int id: @binary_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +binary_expr_lhs( + int id: @binary_expr ref, + int lhs: @expr ref +); + +#keyset[id] +binary_expr_operator_names( + int id: @binary_expr ref, + string operator_name: string ref +); + +#keyset[id] +binary_expr_rhs( + int id: @binary_expr ref, + int rhs: @expr ref +); + +box_pats( + unique int id: @box_pat +); + +#keyset[id] +box_pat_pats( + int id: @box_pat ref, + int pat: @pat ref +); + +break_exprs( + unique int id: @break_expr +); + +#keyset[id, index] +break_expr_attrs( + int id: @break_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +break_expr_exprs( + int id: @break_expr ref, + int expr: @expr ref +); + +#keyset[id] +break_expr_lifetimes( + int id: @break_expr ref, + int lifetime: @lifetime ref +); + +call_exprs( + unique int id: @call_expr +); + +#keyset[id] +call_expr_arg_lists( + int id: @call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +call_expr_attrs( + int id: @call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +call_expr_functions( + int id: @call_expr ref, + int function: @expr ref +); + +cast_exprs( + unique int id: @cast_expr +); + +#keyset[id, index] +cast_expr_attrs( + int id: @cast_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +cast_expr_exprs( + int id: @cast_expr ref, + int expr: @expr ref +); + +#keyset[id] +cast_expr_type_reprs( + int id: @cast_expr ref, + int type_repr: @type_repr ref +); + +cfg_atoms( + unique int id: @cfg_atom +); + +cfg_attr_meta( + unique int id: @cfg_attr_meta +); + +#keyset[id] +cfg_attr_meta_cfg_predicates( + int id: @cfg_attr_meta ref, + int cfg_predicate: @cfg_predicate ref +); + +#keyset[id, index] +cfg_attr_meta_metas( + int id: @cfg_attr_meta ref, + int index: int ref, + int meta: @meta ref +); + +cfg_composites( + unique int id: @cfg_composite +); + +#keyset[id, index] +cfg_composite_cfg_predicates( + int id: @cfg_composite ref, + int index: int ref, + int cfg_predicate: @cfg_predicate ref +); + +cfg_meta( + unique int id: @cfg_meta +); + +#keyset[id] +cfg_meta_cfg_predicates( + int id: @cfg_meta ref, + int cfg_predicate: @cfg_predicate ref +); + +closure_exprs( + unique int id: @closure_expr +); + +#keyset[id] +closure_expr_closure_bodies( + int id: @closure_expr ref, + int closure_body: @expr ref +); + +#keyset[id] +closure_expr_for_binders( + int id: @closure_expr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +closure_expr_is_async( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_const( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_gen( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_move( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_static( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_ret_types( + int id: @closure_expr ref, + int ret_type: @ret_type_repr ref +); + +comments( + unique int id: @comment, + int parent: @ast_node ref, + string text: string ref +); + +const_args( + unique int id: @const_arg +); + +#keyset[id] +const_arg_exprs( + int id: @const_arg ref, + int expr: @expr ref +); + +const_block_pats( + unique int id: @const_block_pat +); + +#keyset[id] +const_block_pat_block_exprs( + int id: @const_block_pat ref, + int block_expr: @block_expr ref +); + +#keyset[id] +const_block_pat_is_const( + int id: @const_block_pat ref +); + +const_params( + unique int id: @const_param +); + +#keyset[id, index] +const_param_attrs( + int id: @const_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_param_default_vals( + int id: @const_param ref, + int default_val: @const_arg ref +); + +#keyset[id] +const_param_is_const( + int id: @const_param ref +); + +#keyset[id] +const_param_names( + int id: @const_param ref, + int name: @name ref +); + +#keyset[id] +const_param_type_reprs( + int id: @const_param ref, + int type_repr: @type_repr ref +); + +continue_exprs( + unique int id: @continue_expr +); + +#keyset[id, index] +continue_expr_attrs( + int id: @continue_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +continue_expr_lifetimes( + int id: @continue_expr ref, + int lifetime: @lifetime ref +); + +deref_pats( + unique int id: @deref_pat +); + +#keyset[id] +deref_pat_pats( + int id: @deref_pat ref, + int pat: @pat ref +); + +dyn_trait_type_reprs( + unique int id: @dyn_trait_type_repr +); + +#keyset[id] +dyn_trait_type_repr_type_bound_lists( + int id: @dyn_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +expr_stmts( + unique int id: @expr_stmt +); + +#keyset[id] +expr_stmt_exprs( + int id: @expr_stmt ref, + int expr: @expr ref +); + +field_exprs( + unique int id: @field_expr +); + +#keyset[id, index] +field_expr_attrs( + int id: @field_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +field_expr_containers( + int id: @field_expr ref, + int container: @expr ref +); + +#keyset[id] +field_expr_identifiers( + int id: @field_expr ref, + int identifier: @name_ref ref +); + +fn_ptr_type_reprs( + unique int id: @fn_ptr_type_repr +); + +#keyset[id] +fn_ptr_type_repr_abis( + int id: @fn_ptr_type_repr ref, + int abi: @abi ref +); + +#keyset[id] +fn_ptr_type_repr_is_async( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_const( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_unsafe( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_param_lists( + int id: @fn_ptr_type_repr ref, + int param_list: @param_list ref +); + +#keyset[id] +fn_ptr_type_repr_ret_types( + int id: @fn_ptr_type_repr ref, + int ret_type: @ret_type_repr ref +); + +for_type_reprs( + unique int id: @for_type_repr +); + +#keyset[id] +for_type_repr_for_binders( + int id: @for_type_repr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +for_type_repr_type_reprs( + int id: @for_type_repr ref, + int type_repr: @type_repr ref +); + +format_args_exprs( + unique int id: @format_args_expr +); + +#keyset[id, index] +format_args_expr_args( + int id: @format_args_expr ref, + int index: int ref, + int arg: @format_args_arg ref +); + +#keyset[id, index] +format_args_expr_attrs( + int id: @format_args_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +format_args_expr_templates( + int id: @format_args_expr ref, + int template: @expr ref +); + +ident_pats( + unique int id: @ident_pat +); + +#keyset[id, index] +ident_pat_attrs( + int id: @ident_pat ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ident_pat_is_mut( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_is_ref( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_names( + int id: @ident_pat ref, + int name: @name ref +); + +#keyset[id] +ident_pat_pats( + int id: @ident_pat ref, + int pat: @pat ref +); + +if_exprs( + unique int id: @if_expr +); + +#keyset[id, index] +if_expr_attrs( + int id: @if_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +if_expr_conditions( + int id: @if_expr ref, + int condition: @expr ref +); + +#keyset[id] +if_expr_elses( + int id: @if_expr ref, + int else: @expr ref +); + +#keyset[id] +if_expr_thens( + int id: @if_expr ref, + int then: @block_expr ref +); + +impl_trait_type_reprs( + unique int id: @impl_trait_type_repr +); + +#keyset[id] +impl_trait_type_repr_type_bound_lists( + int id: @impl_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +include_bytes_exprs( + unique int id: @include_bytes_expr +); + +index_exprs( + unique int id: @index_expr +); + +#keyset[id, index] +index_expr_attrs( + int id: @index_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +index_expr_bases( + int id: @index_expr ref, + int base: @expr ref +); + +#keyset[id] +index_expr_indices( + int id: @index_expr ref, + int index: @expr ref +); + +infer_type_reprs( + unique int id: @infer_type_repr +); + +@item = + @asm_expr +| @assoc_item +| @extern_block +| @extern_crate +| @extern_item +| @impl +| @macro_def +| @macro_rules +| @module +| @trait +| @type_item +| @use +; + +#keyset[id] +item_attribute_macro_expansions( + int id: @item ref, + int attribute_macro_expansion: @macro_items ref +); + +key_value_meta( + unique int id: @key_value_meta +); + +#keyset[id] +key_value_meta_exprs( + int id: @key_value_meta ref, + int expr: @expr ref +); + +#keyset[id] +key_value_meta_paths( + int id: @key_value_meta ref, + int path: @path ref +); + +@labelable_expr = + @block_expr +| @looping_expr +; + +#keyset[id] +labelable_expr_labels( + int id: @labelable_expr ref, + int label: @label ref +); + +let_exprs( + unique int id: @let_expr +); + +#keyset[id, index] +let_expr_attrs( + int id: @let_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_expr_scrutinees( + int id: @let_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +let_expr_pats( + int id: @let_expr ref, + int pat: @pat ref +); + +let_stmts( + unique int id: @let_stmt +); + +#keyset[id, index] +let_stmt_attrs( + int id: @let_stmt ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_stmt_initializers( + int id: @let_stmt ref, + int initializer: @expr ref +); + +#keyset[id] +let_stmt_let_elses( + int id: @let_stmt ref, + int let_else: @let_else ref +); + +#keyset[id] +let_stmt_pats( + int id: @let_stmt ref, + int pat: @pat ref +); + +#keyset[id] +let_stmt_type_reprs( + int id: @let_stmt ref, + int type_repr: @type_repr ref +); + +lifetimes( + unique int id: @lifetime +); + +#keyset[id] +lifetime_texts( + int id: @lifetime ref, + string text: string ref +); + +lifetime_args( + unique int id: @lifetime_arg +); + +#keyset[id] +lifetime_arg_lifetimes( + int id: @lifetime_arg ref, + int lifetime: @lifetime ref +); + +lifetime_params( + unique int id: @lifetime_param +); + +#keyset[id, index] +lifetime_param_attrs( + int id: @lifetime_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +lifetime_param_lifetimes( + int id: @lifetime_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +lifetime_param_type_bound_lists( + int id: @lifetime_param ref, + int type_bound_list: @type_bound_list ref +); + +literal_exprs( + unique int id: @literal_expr +); + +#keyset[id, index] +literal_expr_attrs( + int id: @literal_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +literal_expr_text_values( + int id: @literal_expr ref, + string text_value: string ref +); + +literal_pats( + unique int id: @literal_pat +); + +#keyset[id] +literal_pat_literals( + int id: @literal_pat ref, + int literal: @literal_expr ref +); + +macro_exprs( + unique int id: @macro_expr +); + +#keyset[id] +macro_expr_macro_calls( + int id: @macro_expr ref, + int macro_call: @macro_call ref +); + +macro_pats( + unique int id: @macro_pat +); + +#keyset[id] +macro_pat_macro_calls( + int id: @macro_pat ref, + int macro_call: @macro_call ref +); + +macro_type_reprs( + unique int id: @macro_type_repr +); + +#keyset[id] +macro_type_repr_macro_calls( + int id: @macro_type_repr ref, + int macro_call: @macro_call ref +); + +match_exprs( + unique int id: @match_expr +); + +#keyset[id, index] +match_expr_attrs( + int id: @match_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_expr_scrutinees( + int id: @match_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +match_expr_match_arm_lists( + int id: @match_expr ref, + int match_arm_list: @match_arm_list ref +); + +method_call_exprs( + unique int id: @method_call_expr +); + +#keyset[id] +method_call_expr_arg_lists( + int id: @method_call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +method_call_expr_attrs( + int id: @method_call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +method_call_expr_generic_arg_lists( + int id: @method_call_expr ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +method_call_expr_identifiers( + int id: @method_call_expr ref, + int identifier: @name_ref ref +); + +#keyset[id] +method_call_expr_receivers( + int id: @method_call_expr ref, + int receiver: @expr ref +); + +name_refs( + unique int id: @name_ref +); + +#keyset[id] +name_ref_texts( + int id: @name_ref ref, + string text: string ref +); + +never_type_reprs( + unique int id: @never_type_repr +); + +not_nulls( + unique int id: @not_null +); + +offset_of_exprs( + unique int id: @offset_of_expr +); + +#keyset[id, index] +offset_of_expr_attrs( + int id: @offset_of_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +offset_of_expr_fields( + int id: @offset_of_expr ref, + int index: int ref, + int field: @name_ref ref +); + +#keyset[id] +offset_of_expr_type_reprs( + int id: @offset_of_expr ref, + int type_repr: @type_repr ref +); + +or_pats( + unique int id: @or_pat +); + +#keyset[id, index] +or_pat_pats( + int id: @or_pat ref, + int index: int ref, + int pat: @pat ref +); + +params( + unique int id: @param +); + +#keyset[id] +param_pats( + int id: @param ref, + int pat: @pat ref +); + +paren_exprs( + unique int id: @paren_expr +); + +#keyset[id, index] +paren_expr_attrs( + int id: @paren_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +paren_expr_exprs( + int id: @paren_expr ref, + int expr: @expr ref +); + +paren_pats( + unique int id: @paren_pat +); + +#keyset[id] +paren_pat_pats( + int id: @paren_pat ref, + int pat: @pat ref +); + +paren_type_reprs( + unique int id: @paren_type_repr +); + +#keyset[id] +paren_type_repr_type_reprs( + int id: @paren_type_repr ref, + int type_repr: @type_repr ref +); + +@path_expr_base = + @path_expr +; + +path_meta( + unique int id: @path_meta +); + +#keyset[id] +path_meta_paths( + int id: @path_meta ref, + int path: @path ref +); + +path_pats( + unique int id: @path_pat +); + +path_type_reprs( + unique int id: @path_type_repr +); + +#keyset[id] +path_type_repr_paths( + int id: @path_type_repr ref, + int path: @path ref +); + +pattern_type_reprs( + unique int id: @pattern_type_repr +); + +#keyset[id] +pattern_type_repr_pats( + int id: @pattern_type_repr ref, + int pat: @pat ref +); + +#keyset[id] +pattern_type_repr_type_reprs( + int id: @pattern_type_repr ref, + int type_repr: @type_repr ref +); + +prefix_exprs( + unique int id: @prefix_expr +); + +#keyset[id, index] +prefix_expr_attrs( + int id: @prefix_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +prefix_expr_exprs( + int id: @prefix_expr ref, + int expr: @expr ref +); + +#keyset[id] +prefix_expr_operator_names( + int id: @prefix_expr ref, + string operator_name: string ref +); + +ptr_type_reprs( + unique int id: @ptr_type_repr +); + +#keyset[id] +ptr_type_repr_is_const( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_is_mut( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_type_reprs( + int id: @ptr_type_repr ref, + int type_repr: @type_repr ref +); + +range_exprs( + unique int id: @range_expr +); + +#keyset[id, index] +range_expr_attrs( + int id: @range_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +range_expr_ends( + int id: @range_expr ref, + int end: @expr ref +); + +#keyset[id] +range_expr_operator_names( + int id: @range_expr ref, + string operator_name: string ref +); + +#keyset[id] +range_expr_starts( + int id: @range_expr ref, + int start: @expr ref +); + +range_pats( + unique int id: @range_pat +); + +#keyset[id] +range_pat_ends( + int id: @range_pat ref, + int end: @pat ref +); + +#keyset[id] +range_pat_operator_names( + int id: @range_pat ref, + string operator_name: string ref +); + +#keyset[id] +range_pat_starts( + int id: @range_pat ref, + int start: @pat ref +); + +ref_exprs( + unique int id: @ref_expr +); + +#keyset[id, index] +ref_expr_attrs( + int id: @ref_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ref_expr_exprs( + int id: @ref_expr ref, + int expr: @expr ref +); + +#keyset[id] +ref_expr_is_const( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_mut( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_raw( + int id: @ref_expr ref +); + +ref_pats( + unique int id: @ref_pat +); + +#keyset[id] +ref_pat_is_mut( + int id: @ref_pat ref +); + +#keyset[id] +ref_pat_pats( + int id: @ref_pat ref, + int pat: @pat ref +); + +ref_type_reprs( + unique int id: @ref_type_repr +); + +#keyset[id] +ref_type_repr_is_mut( + int id: @ref_type_repr ref +); + +#keyset[id] +ref_type_repr_lifetimes( + int id: @ref_type_repr ref, + int lifetime: @lifetime ref +); + +#keyset[id] +ref_type_repr_type_reprs( + int id: @ref_type_repr ref, + int type_repr: @type_repr ref +); + +rest_pats( + unique int id: @rest_pat +); + +#keyset[id, index] +rest_pat_attrs( + int id: @rest_pat ref, + int index: int ref, + int attr: @attr ref +); + +return_exprs( + unique int id: @return_expr +); + +#keyset[id, index] +return_expr_attrs( + int id: @return_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +return_expr_exprs( + int id: @return_expr ref, + int expr: @expr ref +); + +self_params( + unique int id: @self_param +); + +#keyset[id] +self_param_is_ref( + int id: @self_param ref +); + +#keyset[id] +self_param_is_mut( + int id: @self_param ref +); + +#keyset[id] +self_param_lifetimes( + int id: @self_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +self_param_names( + int id: @self_param ref, + int name: @name ref +); + +slice_pats( + unique int id: @slice_pat +); + +#keyset[id, index] +slice_pat_pats( + int id: @slice_pat ref, + int index: int ref, + int pat: @pat ref +); + +slice_type_reprs( + unique int id: @slice_type_repr +); + +#keyset[id] +slice_type_repr_type_reprs( + int id: @slice_type_repr ref, + int type_repr: @type_repr ref +); + +struct_exprs( + unique int id: @struct_expr +); + +#keyset[id] +struct_expr_struct_expr_field_lists( + int id: @struct_expr ref, + int struct_expr_field_list: @struct_expr_field_list ref +); + +struct_field_lists( + unique int id: @struct_field_list +); + +#keyset[id, index] +struct_field_list_fields( + int id: @struct_field_list ref, + int index: int ref, + int field: @struct_field ref +); + +struct_pats( + unique int id: @struct_pat +); + +#keyset[id] +struct_pat_struct_pat_field_lists( + int id: @struct_pat ref, + int struct_pat_field_list: @struct_pat_field_list ref +); + +token_tree_meta( + unique int id: @token_tree_meta +); + +#keyset[id] +token_tree_meta_paths( + int id: @token_tree_meta ref, + int path: @path ref +); + +#keyset[id] +token_tree_meta_token_trees( + int id: @token_tree_meta ref, + int token_tree: @token_tree ref +); + +try_exprs( + unique int id: @try_expr +); + +#keyset[id, index] +try_expr_attrs( + int id: @try_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +try_expr_exprs( + int id: @try_expr ref, + int expr: @expr ref +); + +tuple_exprs( + unique int id: @tuple_expr +); + +#keyset[id, index] +tuple_expr_attrs( + int id: @tuple_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +tuple_expr_fields( + int id: @tuple_expr ref, + int index: int ref, + int field: @expr ref +); + +tuple_field_lists( + unique int id: @tuple_field_list +); + +#keyset[id, index] +tuple_field_list_fields( + int id: @tuple_field_list ref, + int index: int ref, + int field: @tuple_field ref +); + +tuple_pats( + unique int id: @tuple_pat +); + +#keyset[id, index] +tuple_pat_fields( + int id: @tuple_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_struct_pats( + unique int id: @tuple_struct_pat +); + +#keyset[id, index] +tuple_struct_pat_fields( + int id: @tuple_struct_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_type_reprs( + unique int id: @tuple_type_repr +); + +#keyset[id, index] +tuple_type_repr_fields( + int id: @tuple_type_repr ref, + int index: int ref, + int field: @type_repr ref +); + +type_args( + unique int id: @type_arg +); + +#keyset[id] +type_arg_type_reprs( + int id: @type_arg ref, + int type_repr: @type_repr ref +); + +type_params( + unique int id: @type_param +); + +#keyset[id, index] +type_param_attrs( + int id: @type_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_param_default_types( + int id: @type_param ref, + int default_type: @type_repr ref +); + +#keyset[id] +type_param_names( + int id: @type_param ref, + int name: @name ref +); + +#keyset[id] +type_param_type_bound_lists( + int id: @type_param ref, + int type_bound_list: @type_bound_list ref +); + +underscore_exprs( + unique int id: @underscore_expr +); + +#keyset[id, index] +underscore_expr_attrs( + int id: @underscore_expr ref, + int index: int ref, + int attr: @attr ref +); + +unsafe_meta( + unique int id: @unsafe_meta +); + +#keyset[id] +unsafe_meta_is_unsafe( + int id: @unsafe_meta ref +); + +#keyset[id] +unsafe_meta_meta( + int id: @unsafe_meta ref, + int meta: @meta ref +); + +variants( + unique int id: @variant +); + +#keyset[id, index] +variant_attrs( + int id: @variant ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +variant_const_args( + int id: @variant ref, + int const_arg: @const_arg ref +); + +#keyset[id] +variant_field_lists( + int id: @variant ref, + int field_list: @field_list ref +); + +#keyset[id] +variant_names( + int id: @variant ref, + int name: @name ref +); + +#keyset[id] +variant_visibilities( + int id: @variant ref, + int visibility: @visibility ref +); + +wildcard_pats( + unique int id: @wildcard_pat +); + +yeet_exprs( + unique int id: @yeet_expr +); + +#keyset[id, index] +yeet_expr_attrs( + int id: @yeet_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yeet_expr_exprs( + int id: @yeet_expr ref, + int expr: @expr ref +); + +yield_exprs( + unique int id: @yield_expr +); + +#keyset[id, index] +yield_expr_attrs( + int id: @yield_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yield_expr_exprs( + int id: @yield_expr ref, + int expr: @expr ref +); + +asm_exprs( + unique int id: @asm_expr +); + +#keyset[id, index] +asm_expr_asm_pieces( + int id: @asm_expr ref, + int index: int ref, + int asm_piece: @asm_piece ref +); + +#keyset[id, index] +asm_expr_attrs( + int id: @asm_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +asm_expr_templates( + int id: @asm_expr ref, + int index: int ref, + int template: @expr ref +); + +@assoc_item = + @const +| @function +| @macro_call +| @type_alias +; + +block_exprs( + unique int id: @block_expr +); + +#keyset[id, index] +block_expr_attrs( + int id: @block_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +block_expr_is_async( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_const( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_gen( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_move( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_unsafe( + int id: @block_expr ref +); + +#keyset[id] +block_expr_stmt_lists( + int id: @block_expr ref, + int stmt_list: @stmt_list ref +); + +#keyset[id] +block_expr_try_block_modifiers( + int id: @block_expr ref, + int try_block_modifier: @try_block_modifier ref +); + +extern_blocks( + unique int id: @extern_block +); + +#keyset[id] +extern_block_abis( + int id: @extern_block ref, + int abi: @abi ref +); + +#keyset[id, index] +extern_block_attrs( + int id: @extern_block ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_block_extern_item_lists( + int id: @extern_block ref, + int extern_item_list: @extern_item_list ref +); + +#keyset[id] +extern_block_is_unsafe( + int id: @extern_block ref +); + +extern_crates( + unique int id: @extern_crate +); + +#keyset[id, index] +extern_crate_attrs( + int id: @extern_crate ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_crate_identifiers( + int id: @extern_crate ref, + int identifier: @name_ref ref +); + +#keyset[id] +extern_crate_renames( + int id: @extern_crate ref, + int rename: @rename ref +); + +#keyset[id] +extern_crate_visibilities( + int id: @extern_crate ref, + int visibility: @visibility ref +); + +@extern_item = + @function +| @macro_call +| @static +| @type_alias +; + +impls( + unique int id: @impl +); + +#keyset[id] +impl_assoc_item_lists( + int id: @impl ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +impl_attrs( + int id: @impl ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +impl_generic_param_lists( + int id: @impl ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +impl_is_const( + int id: @impl ref +); + +#keyset[id] +impl_is_default( + int id: @impl ref +); + +#keyset[id] +impl_is_unsafe( + int id: @impl ref +); + +#keyset[id] +impl_self_ties( + int id: @impl ref, + int self_ty: @type_repr ref +); + +#keyset[id] +impl_trait_ties( + int id: @impl ref, + int trait_ty: @type_repr ref +); + +#keyset[id] +impl_visibilities( + int id: @impl ref, + int visibility: @visibility ref +); + +#keyset[id] +impl_where_clauses( + int id: @impl ref, + int where_clause: @where_clause ref +); + +@looping_expr = + @for_expr +| @loop_expr +| @while_expr +; + +#keyset[id] +looping_expr_loop_bodies( + int id: @looping_expr ref, + int loop_body: @block_expr ref +); + +macro_defs( + unique int id: @macro_def +); + +#keyset[id] +macro_def_args( + int id: @macro_def ref, + int args: @token_tree ref +); + +#keyset[id, index] +macro_def_attrs( + int id: @macro_def ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_def_bodies( + int id: @macro_def ref, + int body: @token_tree ref +); + +#keyset[id] +macro_def_names( + int id: @macro_def ref, + int name: @name ref +); + +#keyset[id] +macro_def_visibilities( + int id: @macro_def ref, + int visibility: @visibility ref +); + +macro_rules( + unique int id: @macro_rules +); + +#keyset[id, index] +macro_rules_attrs( + int id: @macro_rules ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_rules_names( + int id: @macro_rules ref, + int name: @name ref +); + +#keyset[id] +macro_rules_token_trees( + int id: @macro_rules ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_rules_visibilities( + int id: @macro_rules ref, + int visibility: @visibility ref +); + +modules( + unique int id: @module +); + +#keyset[id, index] +module_attrs( + int id: @module ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +module_item_lists( + int id: @module ref, + int item_list: @item_list ref +); + +#keyset[id] +module_names( + int id: @module ref, + int name: @name ref +); + +#keyset[id] +module_visibilities( + int id: @module ref, + int visibility: @visibility ref +); + +path_exprs( + unique int id: @path_expr +); + +#keyset[id, index] +path_expr_attrs( + int id: @path_expr ref, + int index: int ref, + int attr: @attr ref +); + +traits( + unique int id: @trait +); + +#keyset[id] +trait_assoc_item_lists( + int id: @trait ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +trait_attrs( + int id: @trait ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_generic_param_lists( + int id: @trait ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_impl_restrictions( + int id: @trait ref, + int impl_restriction: @impl_restriction ref +); + +#keyset[id] +trait_is_auto( + int id: @trait ref +); + +#keyset[id] +trait_is_unsafe( + int id: @trait ref +); + +#keyset[id] +trait_names( + int id: @trait ref, + int name: @name ref +); + +#keyset[id] +trait_type_bound_lists( + int id: @trait ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_visibilities( + int id: @trait ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_where_clauses( + int id: @trait ref, + int where_clause: @where_clause ref +); + +@type_item = + @enum +| @struct +| @union +; + +#keyset[id, index] +type_item_derive_macro_expansions( + int id: @type_item ref, + int index: int ref, + int derive_macro_expansion: @macro_items ref +); + +#keyset[id, index] +type_item_attrs( + int id: @type_item ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_item_generic_param_lists( + int id: @type_item ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_item_names( + int id: @type_item ref, + int name: @name ref +); + +#keyset[id] +type_item_visibilities( + int id: @type_item ref, + int visibility: @visibility ref +); + +#keyset[id] +type_item_where_clauses( + int id: @type_item ref, + int where_clause: @where_clause ref +); + +uses( + unique int id: @use +); + +#keyset[id, index] +use_attrs( + int id: @use ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +use_use_trees( + int id: @use ref, + int use_tree: @use_tree ref +); + +#keyset[id] +use_visibilities( + int id: @use ref, + int visibility: @visibility ref +); + +consts( + unique int id: @const +); + +#keyset[id, index] +const_attrs( + int id: @const ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_bodies( + int id: @const ref, + int body: @expr ref +); + +#keyset[id] +const_generic_param_lists( + int id: @const ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +const_is_const( + int id: @const ref +); + +#keyset[id] +const_is_default( + int id: @const ref +); + +#keyset[id] +const_names( + int id: @const ref, + int name: @name ref +); + +#keyset[id] +const_type_reprs( + int id: @const ref, + int type_repr: @type_repr ref +); + +#keyset[id] +const_visibilities( + int id: @const ref, + int visibility: @visibility ref +); + +#keyset[id] +const_where_clauses( + int id: @const ref, + int where_clause: @where_clause ref +); + +#keyset[id] +const_has_implementation( + int id: @const ref +); + +enums( + unique int id: @enum +); + +#keyset[id] +enum_variant_lists( + int id: @enum ref, + int variant_list: @variant_list ref +); + +for_exprs( + unique int id: @for_expr +); + +#keyset[id, index] +for_expr_attrs( + int id: @for_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +for_expr_iterables( + int id: @for_expr ref, + int iterable: @expr ref +); + +#keyset[id] +for_expr_pats( + int id: @for_expr ref, + int pat: @pat ref +); + +functions( + unique int id: @function +); + +#keyset[id] +function_abis( + int id: @function ref, + int abi: @abi ref +); + +#keyset[id] +function_function_bodies( + int id: @function ref, + int function_body: @block_expr ref +); + +#keyset[id] +function_generic_param_lists( + int id: @function ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +function_is_async( + int id: @function ref +); + +#keyset[id] +function_is_const( + int id: @function ref +); + +#keyset[id] +function_is_default( + int id: @function ref +); + +#keyset[id] +function_is_gen( + int id: @function ref +); + +#keyset[id] +function_is_unsafe( + int id: @function ref +); + +#keyset[id] +function_names( + int id: @function ref, + int name: @name ref +); + +#keyset[id] +function_ret_types( + int id: @function ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +function_visibilities( + int id: @function ref, + int visibility: @visibility ref +); + +#keyset[id] +function_where_clauses( + int id: @function ref, + int where_clause: @where_clause ref +); + +#keyset[id] +function_has_implementation( + int id: @function ref +); + +loop_exprs( + unique int id: @loop_expr +); + +#keyset[id, index] +loop_expr_attrs( + int id: @loop_expr ref, + int index: int ref, + int attr: @attr ref +); + +macro_calls( + unique int id: @macro_call +); + +#keyset[id, index] +macro_call_attrs( + int id: @macro_call ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_call_paths( + int id: @macro_call ref, + int path: @path ref +); + +#keyset[id] +macro_call_token_trees( + int id: @macro_call ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_call_macro_call_expansions( + int id: @macro_call ref, + int macro_call_expansion: @ast_node ref +); + +statics( + unique int id: @static +); + +#keyset[id, index] +static_attrs( + int id: @static ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +static_bodies( + int id: @static ref, + int body: @expr ref +); + +#keyset[id] +static_is_mut( + int id: @static ref +); + +#keyset[id] +static_is_static( + int id: @static ref +); + +#keyset[id] +static_is_unsafe( + int id: @static ref +); + +#keyset[id] +static_names( + int id: @static ref, + int name: @name ref +); + +#keyset[id] +static_type_reprs( + int id: @static ref, + int type_repr: @type_repr ref +); + +#keyset[id] +static_visibilities( + int id: @static ref, + int visibility: @visibility ref +); + +structs( + unique int id: @struct +); + +#keyset[id] +struct_field_lists_( + int id: @struct ref, + int field_list: @field_list ref +); + +type_aliases( + unique int id: @type_alias +); + +#keyset[id, index] +type_alias_attrs( + int id: @type_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_alias_generic_param_lists( + int id: @type_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_alias_is_default( + int id: @type_alias ref +); + +#keyset[id] +type_alias_names( + int id: @type_alias ref, + int name: @name ref +); + +#keyset[id] +type_alias_type_reprs( + int id: @type_alias ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_alias_type_bound_lists( + int id: @type_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +type_alias_visibilities( + int id: @type_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +type_alias_where_clauses( + int id: @type_alias ref, + int where_clause: @where_clause ref +); + +unions( + unique int id: @union +); + +#keyset[id] +union_struct_field_lists( + int id: @union ref, + int struct_field_list: @struct_field_list ref +); + +while_exprs( + unique int id: @while_expr +); + +#keyset[id, index] +while_expr_attrs( + int id: @while_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +while_expr_conditions( + int id: @while_expr ref, + int condition: @expr ref +); diff --git a/rust/downgrades/852696f20117c338fbb4e6a4f5ed69df79682c37/rust.dbscheme b/rust/downgrades/852696f20117c338fbb4e6a4f5ed69df79682c37/rust.dbscheme new file mode 100644 index 000000000000..ed6b1d3d5140 --- /dev/null +++ b/rust/downgrades/852696f20117c338fbb4e6a4f5ed69df79682c37/rust.dbscheme @@ -0,0 +1,3627 @@ +// generated by codegen, do not edit + +// from ../shared/tree-sitter-extractor/src/generator/prefix.dbscheme +/*- Files and folders -*/ + +/** + * The location of an element. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @file | @folder + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +/*- Empty location -*/ + +empty_location( + int location: @location_default ref +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/*- Diagnostic messages -*/ + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/*- Diagnostic messages: severity -*/ + +case @diagnostic.severity of + 10 = @diagnostic_debug +| 20 = @diagnostic_info +| 30 = @diagnostic_warning +| 40 = @diagnostic_error +; + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_comments (unique int id: @yaml_comment, + string text: string ref, + string tostring: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error | @yaml_comment; + +/*- Database metadata -*/ + +/** + * The CLI will automatically emit applicable tuples for this table, + * such as `databaseMetadata("isOverlay", "true")` when building an + * overlay database. + */ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +/*- Overlay support -*/ + +/** + * The CLI will automatically emit tuples for each new/modified/deleted file + * when building an overlay database. + */ +overlayChangedFiles( + string path: string ref +); + + +// from prefix.dbscheme +#keyset[id] +locatable_locations( + int id: @locatable ref, + int location: @location_default ref +); + + +// from schema + +@element = + @extractor_step +| @locatable +| @named_crate +| @unextracted +; + +extractor_steps( + unique int id: @extractor_step, + string action: string ref, + int duration_ms: int ref +); + +#keyset[id] +extractor_step_files( + int id: @extractor_step ref, + int file: @file ref +); + +@locatable = + @ast_node +| @crate +; + +named_crates( + unique int id: @named_crate, + string name: string ref, + int crate: @crate ref +); + +@unextracted = + @missing +| @unimplemented +; + +@ast_node = + @abi +| @addressable +| @arg_list +| @asm_dir_spec +| @asm_operand +| @asm_operand_expr +| @asm_option +| @asm_piece +| @asm_reg_spec +| @assoc_item_list +| @attr +| @callable +| @cfg_predicate +| @expr +| @extern_item_list +| @field_list +| @for_binder +| @format_args_arg +| @format_args_arg_name +| @generic_arg +| @generic_arg_list +| @generic_param +| @generic_param_list +| @item_list +| @label +| @let_else +| @macro_items +| @match_arm +| @match_arm_list +| @match_guard +| @meta +| @name +| @param_base +| @param_list +| @parenthesized_arg_list +| @pat +| @path +| @path_ast_node +| @path_segment +| @rename +| @ret_type_repr +| @return_type_syntax +| @source_file +| @stmt +| @stmt_list +| @struct_expr_field +| @struct_expr_field_list +| @struct_field +| @struct_pat_field +| @struct_pat_field_list +| @token +| @token_tree +| @try_block_modifier +| @tuple_field +| @type_bound +| @type_bound_list +| @type_repr +| @use_bound_generic_arg +| @use_bound_generic_args +| @use_tree +| @use_tree_list +| @variant_list +| @visibility +| @where_clause +| @where_pred +; + +crates( + unique int id: @crate +); + +#keyset[id] +crate_names( + int id: @crate ref, + string name: string ref +); + +#keyset[id] +crate_versions( + int id: @crate ref, + string version: string ref +); + +#keyset[id, index] +crate_cfg_options( + int id: @crate ref, + int index: int ref, + string cfg_option: string ref +); + +#keyset[id, index] +crate_named_dependencies( + int id: @crate ref, + int index: int ref, + int named_dependency: @named_crate ref +); + +missings( + unique int id: @missing +); + +unimplementeds( + unique int id: @unimplemented +); + +abis( + unique int id: @abi +); + +#keyset[id] +abi_abi_strings( + int id: @abi ref, + string abi_string: string ref +); + +@addressable = + @item +| @variant +; + +arg_lists( + unique int id: @arg_list +); + +#keyset[id, index] +arg_list_args( + int id: @arg_list ref, + int index: int ref, + int arg: @expr ref +); + +asm_dir_specs( + unique int id: @asm_dir_spec +); + +@asm_operand = + @asm_const +| @asm_label +| @asm_reg_operand +| @asm_sym +; + +asm_operand_exprs( + unique int id: @asm_operand_expr +); + +#keyset[id] +asm_operand_expr_in_exprs( + int id: @asm_operand_expr ref, + int in_expr: @expr ref +); + +#keyset[id] +asm_operand_expr_out_exprs( + int id: @asm_operand_expr ref, + int out_expr: @expr ref +); + +asm_options( + unique int id: @asm_option +); + +#keyset[id] +asm_option_is_raw( + int id: @asm_option ref +); + +@asm_piece = + @asm_clobber_abi +| @asm_operand_named +| @asm_options_list +; + +asm_reg_specs( + unique int id: @asm_reg_spec +); + +#keyset[id] +asm_reg_spec_identifiers( + int id: @asm_reg_spec ref, + int identifier: @name_ref ref +); + +assoc_item_lists( + unique int id: @assoc_item_list +); + +#keyset[id, index] +assoc_item_list_assoc_items( + int id: @assoc_item_list ref, + int index: int ref, + int assoc_item: @assoc_item ref +); + +#keyset[id, index] +assoc_item_list_attrs( + int id: @assoc_item_list ref, + int index: int ref, + int attr: @attr ref +); + +attrs( + unique int id: @attr +); + +#keyset[id] +attr_meta( + int id: @attr ref, + int meta: @meta ref +); + +@callable = + @closure_expr +| @function +; + +#keyset[id] +callable_param_lists( + int id: @callable ref, + int param_list: @param_list ref +); + +#keyset[id, index] +callable_attrs( + int id: @callable ref, + int index: int ref, + int attr: @attr ref +); + +@cfg_predicate = + @cfg_atom +| @cfg_composite +; + +@expr = + @array_expr_internal +| @asm_expr +| @await_expr +| @become_expr +| @binary_expr +| @break_expr +| @call_expr +| @cast_expr +| @closure_expr +| @continue_expr +| @field_expr +| @format_args_expr +| @if_expr +| @index_expr +| @labelable_expr +| @let_expr +| @literal_expr +| @macro_expr +| @match_expr +| @method_call_expr +| @offset_of_expr +| @paren_expr +| @path_expr_base +| @prefix_expr +| @range_expr +| @ref_expr +| @return_expr +| @struct_expr +| @try_expr +| @tuple_expr +| @underscore_expr +| @yeet_expr +| @yield_expr +; + +extern_item_lists( + unique int id: @extern_item_list +); + +#keyset[id, index] +extern_item_list_attrs( + int id: @extern_item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +extern_item_list_extern_items( + int id: @extern_item_list ref, + int index: int ref, + int extern_item: @extern_item ref +); + +@field_list = + @struct_field_list +| @tuple_field_list +; + +for_binders( + unique int id: @for_binder +); + +#keyset[id] +for_binder_generic_param_lists( + int id: @for_binder ref, + int generic_param_list: @generic_param_list ref +); + +format_args_args( + unique int id: @format_args_arg +); + +#keyset[id] +format_args_arg_arg_names( + int id: @format_args_arg ref, + int arg_name: @format_args_arg_name ref +); + +#keyset[id] +format_args_arg_exprs( + int id: @format_args_arg ref, + int expr: @expr ref +); + +format_args_arg_names( + unique int id: @format_args_arg_name +); + +@generic_arg = + @assoc_type_arg +| @const_arg +| @lifetime_arg +| @type_arg +; + +generic_arg_lists( + unique int id: @generic_arg_list +); + +#keyset[id, index] +generic_arg_list_generic_args( + int id: @generic_arg_list ref, + int index: int ref, + int generic_arg: @generic_arg ref +); + +@generic_param = + @const_param +| @lifetime_param +| @type_param +; + +generic_param_lists( + unique int id: @generic_param_list +); + +#keyset[id, index] +generic_param_list_generic_params( + int id: @generic_param_list ref, + int index: int ref, + int generic_param: @generic_param ref +); + +item_lists( + unique int id: @item_list +); + +#keyset[id, index] +item_list_attrs( + int id: @item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +item_list_items( + int id: @item_list ref, + int index: int ref, + int item: @item ref +); + +labels( + unique int id: @label +); + +#keyset[id] +label_lifetimes( + int id: @label ref, + int lifetime: @lifetime ref +); + +let_elses( + unique int id: @let_else +); + +#keyset[id] +let_else_block_exprs( + int id: @let_else ref, + int block_expr: @block_expr ref +); + +macro_items( + unique int id: @macro_items +); + +#keyset[id, index] +macro_items_items( + int id: @macro_items ref, + int index: int ref, + int item: @item ref +); + +match_arms( + unique int id: @match_arm +); + +#keyset[id, index] +match_arm_attrs( + int id: @match_arm ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_arm_exprs( + int id: @match_arm ref, + int expr: @expr ref +); + +#keyset[id] +match_arm_guards( + int id: @match_arm ref, + int guard: @match_guard ref +); + +#keyset[id] +match_arm_pats( + int id: @match_arm ref, + int pat: @pat ref +); + +match_arm_lists( + unique int id: @match_arm_list +); + +#keyset[id, index] +match_arm_list_arms( + int id: @match_arm_list ref, + int index: int ref, + int arm: @match_arm ref +); + +#keyset[id, index] +match_arm_list_attrs( + int id: @match_arm_list ref, + int index: int ref, + int attr: @attr ref +); + +match_guards( + unique int id: @match_guard +); + +#keyset[id] +match_guard_conditions( + int id: @match_guard ref, + int condition: @expr ref +); + +@meta = + @cfg_attr_meta +| @cfg_meta +| @key_value_meta +| @path_meta +| @token_tree_meta +| @unsafe_meta +; + +names( + unique int id: @name +); + +#keyset[id] +name_texts( + int id: @name ref, + string text: string ref +); + +@param_base = + @param +| @self_param +; + +#keyset[id, index] +param_base_attrs( + int id: @param_base ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +param_base_type_reprs( + int id: @param_base ref, + int type_repr: @type_repr ref +); + +param_lists( + unique int id: @param_list +); + +#keyset[id, index] +param_list_params( + int id: @param_list ref, + int index: int ref, + int param: @param ref +); + +#keyset[id] +param_list_self_params( + int id: @param_list ref, + int self_param: @self_param ref +); + +parenthesized_arg_lists( + unique int id: @parenthesized_arg_list +); + +#keyset[id, index] +parenthesized_arg_list_type_args( + int id: @parenthesized_arg_list ref, + int index: int ref, + int type_arg: @type_arg ref +); + +@pat = + @box_pat +| @const_block_pat +| @ident_pat +| @literal_pat +| @macro_pat +| @or_pat +| @paren_pat +| @path_pat +| @range_pat +| @ref_pat +| @rest_pat +| @slice_pat +| @struct_pat +| @tuple_pat +| @tuple_struct_pat +| @wildcard_pat +; + +paths( + unique int id: @path +); + +#keyset[id] +path_qualifiers( + int id: @path ref, + int qualifier: @path ref +); + +#keyset[id] +path_segments_( + int id: @path ref, + int segment: @path_segment ref +); + +@path_ast_node = + @path_expr +| @path_pat +| @struct_expr +| @struct_pat +| @tuple_struct_pat +; + +#keyset[id] +path_ast_node_paths( + int id: @path_ast_node ref, + int path: @path ref +); + +path_segments( + unique int id: @path_segment +); + +#keyset[id] +path_segment_generic_arg_lists( + int id: @path_segment ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +path_segment_identifiers( + int id: @path_segment ref, + int identifier: @name_ref ref +); + +#keyset[id] +path_segment_parenthesized_arg_lists( + int id: @path_segment ref, + int parenthesized_arg_list: @parenthesized_arg_list ref +); + +#keyset[id] +path_segment_ret_types( + int id: @path_segment ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +path_segment_return_type_syntaxes( + int id: @path_segment ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +path_segment_type_reprs( + int id: @path_segment ref, + int type_repr: @type_repr ref +); + +#keyset[id] +path_segment_trait_type_reprs( + int id: @path_segment ref, + int trait_type_repr: @path_type_repr ref +); + +renames( + unique int id: @rename +); + +#keyset[id] +rename_names( + int id: @rename ref, + int name: @name ref +); + +ret_type_reprs( + unique int id: @ret_type_repr +); + +#keyset[id] +ret_type_repr_type_reprs( + int id: @ret_type_repr ref, + int type_repr: @type_repr ref +); + +return_type_syntaxes( + unique int id: @return_type_syntax +); + +source_files( + unique int id: @source_file +); + +#keyset[id, index] +source_file_attrs( + int id: @source_file ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +source_file_items( + int id: @source_file ref, + int index: int ref, + int item: @item ref +); + +@stmt = + @expr_stmt +| @item +| @let_stmt +; + +stmt_lists( + unique int id: @stmt_list +); + +#keyset[id, index] +stmt_list_attrs( + int id: @stmt_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +stmt_list_statements( + int id: @stmt_list ref, + int index: int ref, + int statement: @stmt ref +); + +#keyset[id] +stmt_list_tail_exprs( + int id: @stmt_list ref, + int tail_expr: @expr ref +); + +struct_expr_fields( + unique int id: @struct_expr_field +); + +#keyset[id, index] +struct_expr_field_attrs( + int id: @struct_expr_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_expr_field_exprs( + int id: @struct_expr_field ref, + int expr: @expr ref +); + +#keyset[id] +struct_expr_field_identifiers( + int id: @struct_expr_field ref, + int identifier: @name_ref ref +); + +struct_expr_field_lists( + unique int id: @struct_expr_field_list +); + +#keyset[id, index] +struct_expr_field_list_attrs( + int id: @struct_expr_field_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +struct_expr_field_list_fields( + int id: @struct_expr_field_list ref, + int index: int ref, + int field: @struct_expr_field ref +); + +#keyset[id] +struct_expr_field_list_spreads( + int id: @struct_expr_field_list ref, + int spread: @expr ref +); + +struct_fields( + unique int id: @struct_field +); + +#keyset[id, index] +struct_field_attrs( + int id: @struct_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_field_default_vals( + int id: @struct_field ref, + int default_val: @const_arg ref +); + +#keyset[id] +struct_field_is_unsafe( + int id: @struct_field ref +); + +#keyset[id] +struct_field_names( + int id: @struct_field ref, + int name: @name ref +); + +#keyset[id] +struct_field_type_reprs( + int id: @struct_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +struct_field_visibilities( + int id: @struct_field ref, + int visibility: @visibility ref +); + +struct_pat_fields( + unique int id: @struct_pat_field +); + +#keyset[id, index] +struct_pat_field_attrs( + int id: @struct_pat_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_pat_field_identifiers( + int id: @struct_pat_field ref, + int identifier: @name_ref ref +); + +#keyset[id] +struct_pat_field_pats( + int id: @struct_pat_field ref, + int pat: @pat ref +); + +struct_pat_field_lists( + unique int id: @struct_pat_field_list +); + +#keyset[id, index] +struct_pat_field_list_fields( + int id: @struct_pat_field_list ref, + int index: int ref, + int field: @struct_pat_field ref +); + +#keyset[id] +struct_pat_field_list_rest_pats( + int id: @struct_pat_field_list ref, + int rest_pat: @rest_pat ref +); + +@token = + @comment +; + +token_trees( + unique int id: @token_tree +); + +try_block_modifiers( + unique int id: @try_block_modifier +); + +#keyset[id] +try_block_modifier_is_try( + int id: @try_block_modifier ref +); + +#keyset[id] +try_block_modifier_type_reprs( + int id: @try_block_modifier ref, + int type_repr: @type_repr ref +); + +tuple_fields( + unique int id: @tuple_field +); + +#keyset[id, index] +tuple_field_attrs( + int id: @tuple_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +tuple_field_type_reprs( + int id: @tuple_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +tuple_field_visibilities( + int id: @tuple_field ref, + int visibility: @visibility ref +); + +type_bounds( + unique int id: @type_bound +); + +#keyset[id] +type_bound_for_binders( + int id: @type_bound ref, + int for_binder: @for_binder ref +); + +#keyset[id] +type_bound_is_async( + int id: @type_bound ref +); + +#keyset[id] +type_bound_is_const( + int id: @type_bound ref +); + +#keyset[id] +type_bound_lifetimes( + int id: @type_bound ref, + int lifetime: @lifetime ref +); + +#keyset[id] +type_bound_type_reprs( + int id: @type_bound ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_bound_use_bound_generic_args( + int id: @type_bound ref, + int use_bound_generic_args: @use_bound_generic_args ref +); + +type_bound_lists( + unique int id: @type_bound_list +); + +#keyset[id, index] +type_bound_list_bounds( + int id: @type_bound_list ref, + int index: int ref, + int bound: @type_bound ref +); + +@type_repr = + @array_type_repr +| @dyn_trait_type_repr +| @fn_ptr_type_repr +| @for_type_repr +| @impl_trait_type_repr +| @infer_type_repr +| @macro_type_repr +| @never_type_repr +| @paren_type_repr +| @path_type_repr +| @ptr_type_repr +| @ref_type_repr +| @slice_type_repr +| @tuple_type_repr +; + +@use_bound_generic_arg = + @lifetime +| @name_ref +; + +use_bound_generic_args( + unique int id: @use_bound_generic_args +); + +#keyset[id, index] +use_bound_generic_args_use_bound_generic_args( + int id: @use_bound_generic_args ref, + int index: int ref, + int use_bound_generic_arg: @use_bound_generic_arg ref +); + +use_trees( + unique int id: @use_tree +); + +#keyset[id] +use_tree_is_glob( + int id: @use_tree ref +); + +#keyset[id] +use_tree_paths( + int id: @use_tree ref, + int path: @path ref +); + +#keyset[id] +use_tree_renames( + int id: @use_tree ref, + int rename: @rename ref +); + +#keyset[id] +use_tree_use_tree_lists( + int id: @use_tree ref, + int use_tree_list: @use_tree_list ref +); + +use_tree_lists( + unique int id: @use_tree_list +); + +#keyset[id, index] +use_tree_list_use_trees( + int id: @use_tree_list ref, + int index: int ref, + int use_tree: @use_tree ref +); + +variant_lists( + unique int id: @variant_list +); + +#keyset[id, index] +variant_list_variants( + int id: @variant_list ref, + int index: int ref, + int variant: @variant ref +); + +visibilities( + unique int id: @visibility +); + +#keyset[id] +visibility_paths( + int id: @visibility ref, + int path: @path ref +); + +where_clauses( + unique int id: @where_clause +); + +#keyset[id, index] +where_clause_predicates( + int id: @where_clause ref, + int index: int ref, + int predicate: @where_pred ref +); + +where_preds( + unique int id: @where_pred +); + +#keyset[id] +where_pred_for_binders( + int id: @where_pred ref, + int for_binder: @for_binder ref +); + +#keyset[id] +where_pred_lifetimes( + int id: @where_pred ref, + int lifetime: @lifetime ref +); + +#keyset[id] +where_pred_type_reprs( + int id: @where_pred ref, + int type_repr: @type_repr ref +); + +#keyset[id] +where_pred_type_bound_lists( + int id: @where_pred ref, + int type_bound_list: @type_bound_list ref +); + +array_expr_internals( + unique int id: @array_expr_internal +); + +#keyset[id, index] +array_expr_internal_attrs( + int id: @array_expr_internal ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +array_expr_internal_exprs( + int id: @array_expr_internal ref, + int index: int ref, + int expr: @expr ref +); + +#keyset[id] +array_expr_internal_is_semicolon( + int id: @array_expr_internal ref +); + +array_type_reprs( + unique int id: @array_type_repr +); + +#keyset[id] +array_type_repr_const_args( + int id: @array_type_repr ref, + int const_arg: @const_arg ref +); + +#keyset[id] +array_type_repr_element_type_reprs( + int id: @array_type_repr ref, + int element_type_repr: @type_repr ref +); + +asm_clobber_abis( + unique int id: @asm_clobber_abi +); + +asm_consts( + unique int id: @asm_const +); + +#keyset[id] +asm_const_exprs( + int id: @asm_const ref, + int expr: @expr ref +); + +#keyset[id] +asm_const_is_const( + int id: @asm_const ref +); + +asm_labels( + unique int id: @asm_label +); + +#keyset[id] +asm_label_block_exprs( + int id: @asm_label ref, + int block_expr: @block_expr ref +); + +asm_operand_nameds( + unique int id: @asm_operand_named +); + +#keyset[id] +asm_operand_named_asm_operands( + int id: @asm_operand_named ref, + int asm_operand: @asm_operand ref +); + +#keyset[id] +asm_operand_named_names( + int id: @asm_operand_named ref, + int name: @name ref +); + +asm_options_lists( + unique int id: @asm_options_list +); + +#keyset[id, index] +asm_options_list_asm_options( + int id: @asm_options_list ref, + int index: int ref, + int asm_option: @asm_option ref +); + +asm_reg_operands( + unique int id: @asm_reg_operand +); + +#keyset[id] +asm_reg_operand_asm_dir_specs( + int id: @asm_reg_operand ref, + int asm_dir_spec: @asm_dir_spec ref +); + +#keyset[id] +asm_reg_operand_asm_operand_exprs( + int id: @asm_reg_operand ref, + int asm_operand_expr: @asm_operand_expr ref +); + +#keyset[id] +asm_reg_operand_asm_reg_specs( + int id: @asm_reg_operand ref, + int asm_reg_spec: @asm_reg_spec ref +); + +asm_syms( + unique int id: @asm_sym +); + +#keyset[id] +asm_sym_paths( + int id: @asm_sym ref, + int path: @path ref +); + +assoc_type_args( + unique int id: @assoc_type_arg +); + +#keyset[id] +assoc_type_arg_const_args( + int id: @assoc_type_arg ref, + int const_arg: @const_arg ref +); + +#keyset[id] +assoc_type_arg_generic_arg_lists( + int id: @assoc_type_arg ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +assoc_type_arg_identifiers( + int id: @assoc_type_arg ref, + int identifier: @name_ref ref +); + +#keyset[id] +assoc_type_arg_param_lists( + int id: @assoc_type_arg ref, + int param_list: @param_list ref +); + +#keyset[id] +assoc_type_arg_ret_types( + int id: @assoc_type_arg ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +assoc_type_arg_return_type_syntaxes( + int id: @assoc_type_arg ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +assoc_type_arg_type_reprs( + int id: @assoc_type_arg ref, + int type_repr: @type_repr ref +); + +#keyset[id] +assoc_type_arg_type_bound_lists( + int id: @assoc_type_arg ref, + int type_bound_list: @type_bound_list ref +); + +await_exprs( + unique int id: @await_expr +); + +#keyset[id, index] +await_expr_attrs( + int id: @await_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +await_expr_exprs( + int id: @await_expr ref, + int expr: @expr ref +); + +become_exprs( + unique int id: @become_expr +); + +#keyset[id, index] +become_expr_attrs( + int id: @become_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +become_expr_exprs( + int id: @become_expr ref, + int expr: @expr ref +); + +binary_exprs( + unique int id: @binary_expr +); + +#keyset[id, index] +binary_expr_attrs( + int id: @binary_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +binary_expr_lhs( + int id: @binary_expr ref, + int lhs: @expr ref +); + +#keyset[id] +binary_expr_operator_names( + int id: @binary_expr ref, + string operator_name: string ref +); + +#keyset[id] +binary_expr_rhs( + int id: @binary_expr ref, + int rhs: @expr ref +); + +box_pats( + unique int id: @box_pat +); + +#keyset[id] +box_pat_pats( + int id: @box_pat ref, + int pat: @pat ref +); + +break_exprs( + unique int id: @break_expr +); + +#keyset[id, index] +break_expr_attrs( + int id: @break_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +break_expr_exprs( + int id: @break_expr ref, + int expr: @expr ref +); + +#keyset[id] +break_expr_lifetimes( + int id: @break_expr ref, + int lifetime: @lifetime ref +); + +call_exprs( + unique int id: @call_expr +); + +#keyset[id] +call_expr_arg_lists( + int id: @call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +call_expr_attrs( + int id: @call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +call_expr_functions( + int id: @call_expr ref, + int function: @expr ref +); + +cast_exprs( + unique int id: @cast_expr +); + +#keyset[id, index] +cast_expr_attrs( + int id: @cast_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +cast_expr_exprs( + int id: @cast_expr ref, + int expr: @expr ref +); + +#keyset[id] +cast_expr_type_reprs( + int id: @cast_expr ref, + int type_repr: @type_repr ref +); + +cfg_atoms( + unique int id: @cfg_atom +); + +cfg_attr_meta( + unique int id: @cfg_attr_meta +); + +#keyset[id] +cfg_attr_meta_cfg_predicates( + int id: @cfg_attr_meta ref, + int cfg_predicate: @cfg_predicate ref +); + +#keyset[id, index] +cfg_attr_meta_metas( + int id: @cfg_attr_meta ref, + int index: int ref, + int meta: @meta ref +); + +cfg_composites( + unique int id: @cfg_composite +); + +#keyset[id, index] +cfg_composite_cfg_predicates( + int id: @cfg_composite ref, + int index: int ref, + int cfg_predicate: @cfg_predicate ref +); + +cfg_meta( + unique int id: @cfg_meta +); + +#keyset[id] +cfg_meta_cfg_predicates( + int id: @cfg_meta ref, + int cfg_predicate: @cfg_predicate ref +); + +closure_exprs( + unique int id: @closure_expr +); + +#keyset[id] +closure_expr_closure_bodies( + int id: @closure_expr ref, + int closure_body: @expr ref +); + +#keyset[id] +closure_expr_for_binders( + int id: @closure_expr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +closure_expr_is_async( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_const( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_gen( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_move( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_static( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_ret_types( + int id: @closure_expr ref, + int ret_type: @ret_type_repr ref +); + +comments( + unique int id: @comment, + int parent: @ast_node ref, + string text: string ref +); + +const_args( + unique int id: @const_arg +); + +#keyset[id] +const_arg_exprs( + int id: @const_arg ref, + int expr: @expr ref +); + +const_block_pats( + unique int id: @const_block_pat +); + +#keyset[id] +const_block_pat_block_exprs( + int id: @const_block_pat ref, + int block_expr: @block_expr ref +); + +#keyset[id] +const_block_pat_is_const( + int id: @const_block_pat ref +); + +const_params( + unique int id: @const_param +); + +#keyset[id, index] +const_param_attrs( + int id: @const_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_param_default_vals( + int id: @const_param ref, + int default_val: @const_arg ref +); + +#keyset[id] +const_param_is_const( + int id: @const_param ref +); + +#keyset[id] +const_param_names( + int id: @const_param ref, + int name: @name ref +); + +#keyset[id] +const_param_type_reprs( + int id: @const_param ref, + int type_repr: @type_repr ref +); + +continue_exprs( + unique int id: @continue_expr +); + +#keyset[id, index] +continue_expr_attrs( + int id: @continue_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +continue_expr_lifetimes( + int id: @continue_expr ref, + int lifetime: @lifetime ref +); + +dyn_trait_type_reprs( + unique int id: @dyn_trait_type_repr +); + +#keyset[id] +dyn_trait_type_repr_type_bound_lists( + int id: @dyn_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +expr_stmts( + unique int id: @expr_stmt +); + +#keyset[id] +expr_stmt_exprs( + int id: @expr_stmt ref, + int expr: @expr ref +); + +field_exprs( + unique int id: @field_expr +); + +#keyset[id, index] +field_expr_attrs( + int id: @field_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +field_expr_containers( + int id: @field_expr ref, + int container: @expr ref +); + +#keyset[id] +field_expr_identifiers( + int id: @field_expr ref, + int identifier: @name_ref ref +); + +fn_ptr_type_reprs( + unique int id: @fn_ptr_type_repr +); + +#keyset[id] +fn_ptr_type_repr_abis( + int id: @fn_ptr_type_repr ref, + int abi: @abi ref +); + +#keyset[id] +fn_ptr_type_repr_is_async( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_const( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_unsafe( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_param_lists( + int id: @fn_ptr_type_repr ref, + int param_list: @param_list ref +); + +#keyset[id] +fn_ptr_type_repr_ret_types( + int id: @fn_ptr_type_repr ref, + int ret_type: @ret_type_repr ref +); + +for_type_reprs( + unique int id: @for_type_repr +); + +#keyset[id] +for_type_repr_for_binders( + int id: @for_type_repr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +for_type_repr_type_reprs( + int id: @for_type_repr ref, + int type_repr: @type_repr ref +); + +format_args_exprs( + unique int id: @format_args_expr +); + +#keyset[id, index] +format_args_expr_args( + int id: @format_args_expr ref, + int index: int ref, + int arg: @format_args_arg ref +); + +#keyset[id, index] +format_args_expr_attrs( + int id: @format_args_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +format_args_expr_templates( + int id: @format_args_expr ref, + int template: @expr ref +); + +ident_pats( + unique int id: @ident_pat +); + +#keyset[id, index] +ident_pat_attrs( + int id: @ident_pat ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ident_pat_is_mut( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_is_ref( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_names( + int id: @ident_pat ref, + int name: @name ref +); + +#keyset[id] +ident_pat_pats( + int id: @ident_pat ref, + int pat: @pat ref +); + +if_exprs( + unique int id: @if_expr +); + +#keyset[id, index] +if_expr_attrs( + int id: @if_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +if_expr_conditions( + int id: @if_expr ref, + int condition: @expr ref +); + +#keyset[id] +if_expr_elses( + int id: @if_expr ref, + int else: @expr ref +); + +#keyset[id] +if_expr_thens( + int id: @if_expr ref, + int then: @block_expr ref +); + +impl_trait_type_reprs( + unique int id: @impl_trait_type_repr +); + +#keyset[id] +impl_trait_type_repr_type_bound_lists( + int id: @impl_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +index_exprs( + unique int id: @index_expr +); + +#keyset[id, index] +index_expr_attrs( + int id: @index_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +index_expr_bases( + int id: @index_expr ref, + int base: @expr ref +); + +#keyset[id] +index_expr_indices( + int id: @index_expr ref, + int index: @expr ref +); + +infer_type_reprs( + unique int id: @infer_type_repr +); + +@item = + @asm_expr +| @assoc_item +| @extern_block +| @extern_crate +| @extern_item +| @impl +| @macro_def +| @macro_rules +| @module +| @trait +| @type_item +| @use +; + +#keyset[id] +item_attribute_macro_expansions( + int id: @item ref, + int attribute_macro_expansion: @macro_items ref +); + +key_value_meta( + unique int id: @key_value_meta +); + +#keyset[id] +key_value_meta_exprs( + int id: @key_value_meta ref, + int expr: @expr ref +); + +#keyset[id] +key_value_meta_paths( + int id: @key_value_meta ref, + int path: @path ref +); + +@labelable_expr = + @block_expr +| @looping_expr +; + +#keyset[id] +labelable_expr_labels( + int id: @labelable_expr ref, + int label: @label ref +); + +let_exprs( + unique int id: @let_expr +); + +#keyset[id, index] +let_expr_attrs( + int id: @let_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_expr_scrutinees( + int id: @let_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +let_expr_pats( + int id: @let_expr ref, + int pat: @pat ref +); + +let_stmts( + unique int id: @let_stmt +); + +#keyset[id, index] +let_stmt_attrs( + int id: @let_stmt ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_stmt_initializers( + int id: @let_stmt ref, + int initializer: @expr ref +); + +#keyset[id] +let_stmt_let_elses( + int id: @let_stmt ref, + int let_else: @let_else ref +); + +#keyset[id] +let_stmt_pats( + int id: @let_stmt ref, + int pat: @pat ref +); + +#keyset[id] +let_stmt_type_reprs( + int id: @let_stmt ref, + int type_repr: @type_repr ref +); + +lifetimes( + unique int id: @lifetime +); + +#keyset[id] +lifetime_texts( + int id: @lifetime ref, + string text: string ref +); + +lifetime_args( + unique int id: @lifetime_arg +); + +#keyset[id] +lifetime_arg_lifetimes( + int id: @lifetime_arg ref, + int lifetime: @lifetime ref +); + +lifetime_params( + unique int id: @lifetime_param +); + +#keyset[id, index] +lifetime_param_attrs( + int id: @lifetime_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +lifetime_param_lifetimes( + int id: @lifetime_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +lifetime_param_type_bound_lists( + int id: @lifetime_param ref, + int type_bound_list: @type_bound_list ref +); + +literal_exprs( + unique int id: @literal_expr +); + +#keyset[id, index] +literal_expr_attrs( + int id: @literal_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +literal_expr_text_values( + int id: @literal_expr ref, + string text_value: string ref +); + +literal_pats( + unique int id: @literal_pat +); + +#keyset[id] +literal_pat_literals( + int id: @literal_pat ref, + int literal: @literal_expr ref +); + +macro_exprs( + unique int id: @macro_expr +); + +#keyset[id] +macro_expr_macro_calls( + int id: @macro_expr ref, + int macro_call: @macro_call ref +); + +macro_pats( + unique int id: @macro_pat +); + +#keyset[id] +macro_pat_macro_calls( + int id: @macro_pat ref, + int macro_call: @macro_call ref +); + +macro_type_reprs( + unique int id: @macro_type_repr +); + +#keyset[id] +macro_type_repr_macro_calls( + int id: @macro_type_repr ref, + int macro_call: @macro_call ref +); + +match_exprs( + unique int id: @match_expr +); + +#keyset[id, index] +match_expr_attrs( + int id: @match_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_expr_scrutinees( + int id: @match_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +match_expr_match_arm_lists( + int id: @match_expr ref, + int match_arm_list: @match_arm_list ref +); + +method_call_exprs( + unique int id: @method_call_expr +); + +#keyset[id] +method_call_expr_arg_lists( + int id: @method_call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +method_call_expr_attrs( + int id: @method_call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +method_call_expr_generic_arg_lists( + int id: @method_call_expr ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +method_call_expr_identifiers( + int id: @method_call_expr ref, + int identifier: @name_ref ref +); + +#keyset[id] +method_call_expr_receivers( + int id: @method_call_expr ref, + int receiver: @expr ref +); + +name_refs( + unique int id: @name_ref +); + +#keyset[id] +name_ref_texts( + int id: @name_ref ref, + string text: string ref +); + +never_type_reprs( + unique int id: @never_type_repr +); + +offset_of_exprs( + unique int id: @offset_of_expr +); + +#keyset[id, index] +offset_of_expr_attrs( + int id: @offset_of_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +offset_of_expr_fields( + int id: @offset_of_expr ref, + int index: int ref, + int field: @name_ref ref +); + +#keyset[id] +offset_of_expr_type_reprs( + int id: @offset_of_expr ref, + int type_repr: @type_repr ref +); + +or_pats( + unique int id: @or_pat +); + +#keyset[id, index] +or_pat_pats( + int id: @or_pat ref, + int index: int ref, + int pat: @pat ref +); + +params( + unique int id: @param +); + +#keyset[id] +param_pats( + int id: @param ref, + int pat: @pat ref +); + +paren_exprs( + unique int id: @paren_expr +); + +#keyset[id, index] +paren_expr_attrs( + int id: @paren_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +paren_expr_exprs( + int id: @paren_expr ref, + int expr: @expr ref +); + +paren_pats( + unique int id: @paren_pat +); + +#keyset[id] +paren_pat_pats( + int id: @paren_pat ref, + int pat: @pat ref +); + +paren_type_reprs( + unique int id: @paren_type_repr +); + +#keyset[id] +paren_type_repr_type_reprs( + int id: @paren_type_repr ref, + int type_repr: @type_repr ref +); + +@path_expr_base = + @path_expr +; + +path_meta( + unique int id: @path_meta +); + +#keyset[id] +path_meta_paths( + int id: @path_meta ref, + int path: @path ref +); + +path_pats( + unique int id: @path_pat +); + +path_type_reprs( + unique int id: @path_type_repr +); + +#keyset[id] +path_type_repr_paths( + int id: @path_type_repr ref, + int path: @path ref +); + +prefix_exprs( + unique int id: @prefix_expr +); + +#keyset[id, index] +prefix_expr_attrs( + int id: @prefix_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +prefix_expr_exprs( + int id: @prefix_expr ref, + int expr: @expr ref +); + +#keyset[id] +prefix_expr_operator_names( + int id: @prefix_expr ref, + string operator_name: string ref +); + +ptr_type_reprs( + unique int id: @ptr_type_repr +); + +#keyset[id] +ptr_type_repr_is_const( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_is_mut( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_type_reprs( + int id: @ptr_type_repr ref, + int type_repr: @type_repr ref +); + +range_exprs( + unique int id: @range_expr +); + +#keyset[id, index] +range_expr_attrs( + int id: @range_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +range_expr_ends( + int id: @range_expr ref, + int end: @expr ref +); + +#keyset[id] +range_expr_operator_names( + int id: @range_expr ref, + string operator_name: string ref +); + +#keyset[id] +range_expr_starts( + int id: @range_expr ref, + int start: @expr ref +); + +range_pats( + unique int id: @range_pat +); + +#keyset[id] +range_pat_ends( + int id: @range_pat ref, + int end: @pat ref +); + +#keyset[id] +range_pat_operator_names( + int id: @range_pat ref, + string operator_name: string ref +); + +#keyset[id] +range_pat_starts( + int id: @range_pat ref, + int start: @pat ref +); + +ref_exprs( + unique int id: @ref_expr +); + +#keyset[id, index] +ref_expr_attrs( + int id: @ref_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ref_expr_exprs( + int id: @ref_expr ref, + int expr: @expr ref +); + +#keyset[id] +ref_expr_is_const( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_mut( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_raw( + int id: @ref_expr ref +); + +ref_pats( + unique int id: @ref_pat +); + +#keyset[id] +ref_pat_is_mut( + int id: @ref_pat ref +); + +#keyset[id] +ref_pat_pats( + int id: @ref_pat ref, + int pat: @pat ref +); + +ref_type_reprs( + unique int id: @ref_type_repr +); + +#keyset[id] +ref_type_repr_is_mut( + int id: @ref_type_repr ref +); + +#keyset[id] +ref_type_repr_lifetimes( + int id: @ref_type_repr ref, + int lifetime: @lifetime ref +); + +#keyset[id] +ref_type_repr_type_reprs( + int id: @ref_type_repr ref, + int type_repr: @type_repr ref +); + +rest_pats( + unique int id: @rest_pat +); + +#keyset[id, index] +rest_pat_attrs( + int id: @rest_pat ref, + int index: int ref, + int attr: @attr ref +); + +return_exprs( + unique int id: @return_expr +); + +#keyset[id, index] +return_expr_attrs( + int id: @return_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +return_expr_exprs( + int id: @return_expr ref, + int expr: @expr ref +); + +self_params( + unique int id: @self_param +); + +#keyset[id] +self_param_is_ref( + int id: @self_param ref +); + +#keyset[id] +self_param_is_mut( + int id: @self_param ref +); + +#keyset[id] +self_param_lifetimes( + int id: @self_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +self_param_names( + int id: @self_param ref, + int name: @name ref +); + +slice_pats( + unique int id: @slice_pat +); + +#keyset[id, index] +slice_pat_pats( + int id: @slice_pat ref, + int index: int ref, + int pat: @pat ref +); + +slice_type_reprs( + unique int id: @slice_type_repr +); + +#keyset[id] +slice_type_repr_type_reprs( + int id: @slice_type_repr ref, + int type_repr: @type_repr ref +); + +struct_exprs( + unique int id: @struct_expr +); + +#keyset[id] +struct_expr_struct_expr_field_lists( + int id: @struct_expr ref, + int struct_expr_field_list: @struct_expr_field_list ref +); + +struct_field_lists( + unique int id: @struct_field_list +); + +#keyset[id, index] +struct_field_list_fields( + int id: @struct_field_list ref, + int index: int ref, + int field: @struct_field ref +); + +struct_pats( + unique int id: @struct_pat +); + +#keyset[id] +struct_pat_struct_pat_field_lists( + int id: @struct_pat ref, + int struct_pat_field_list: @struct_pat_field_list ref +); + +token_tree_meta( + unique int id: @token_tree_meta +); + +#keyset[id] +token_tree_meta_paths( + int id: @token_tree_meta ref, + int path: @path ref +); + +#keyset[id] +token_tree_meta_token_trees( + int id: @token_tree_meta ref, + int token_tree: @token_tree ref +); + +try_exprs( + unique int id: @try_expr +); + +#keyset[id, index] +try_expr_attrs( + int id: @try_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +try_expr_exprs( + int id: @try_expr ref, + int expr: @expr ref +); + +tuple_exprs( + unique int id: @tuple_expr +); + +#keyset[id, index] +tuple_expr_attrs( + int id: @tuple_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +tuple_expr_fields( + int id: @tuple_expr ref, + int index: int ref, + int field: @expr ref +); + +tuple_field_lists( + unique int id: @tuple_field_list +); + +#keyset[id, index] +tuple_field_list_fields( + int id: @tuple_field_list ref, + int index: int ref, + int field: @tuple_field ref +); + +tuple_pats( + unique int id: @tuple_pat +); + +#keyset[id, index] +tuple_pat_fields( + int id: @tuple_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_struct_pats( + unique int id: @tuple_struct_pat +); + +#keyset[id, index] +tuple_struct_pat_fields( + int id: @tuple_struct_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_type_reprs( + unique int id: @tuple_type_repr +); + +#keyset[id, index] +tuple_type_repr_fields( + int id: @tuple_type_repr ref, + int index: int ref, + int field: @type_repr ref +); + +type_args( + unique int id: @type_arg +); + +#keyset[id] +type_arg_type_reprs( + int id: @type_arg ref, + int type_repr: @type_repr ref +); + +type_params( + unique int id: @type_param +); + +#keyset[id, index] +type_param_attrs( + int id: @type_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_param_default_types( + int id: @type_param ref, + int default_type: @type_repr ref +); + +#keyset[id] +type_param_names( + int id: @type_param ref, + int name: @name ref +); + +#keyset[id] +type_param_type_bound_lists( + int id: @type_param ref, + int type_bound_list: @type_bound_list ref +); + +underscore_exprs( + unique int id: @underscore_expr +); + +#keyset[id, index] +underscore_expr_attrs( + int id: @underscore_expr ref, + int index: int ref, + int attr: @attr ref +); + +unsafe_meta( + unique int id: @unsafe_meta +); + +#keyset[id] +unsafe_meta_is_unsafe( + int id: @unsafe_meta ref +); + +#keyset[id] +unsafe_meta_meta( + int id: @unsafe_meta ref, + int meta: @meta ref +); + +variants( + unique int id: @variant +); + +#keyset[id, index] +variant_attrs( + int id: @variant ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +variant_const_args( + int id: @variant ref, + int const_arg: @const_arg ref +); + +#keyset[id] +variant_field_lists( + int id: @variant ref, + int field_list: @field_list ref +); + +#keyset[id] +variant_names( + int id: @variant ref, + int name: @name ref +); + +#keyset[id] +variant_visibilities( + int id: @variant ref, + int visibility: @visibility ref +); + +wildcard_pats( + unique int id: @wildcard_pat +); + +yeet_exprs( + unique int id: @yeet_expr +); + +#keyset[id, index] +yeet_expr_attrs( + int id: @yeet_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yeet_expr_exprs( + int id: @yeet_expr ref, + int expr: @expr ref +); + +yield_exprs( + unique int id: @yield_expr +); + +#keyset[id, index] +yield_expr_attrs( + int id: @yield_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yield_expr_exprs( + int id: @yield_expr ref, + int expr: @expr ref +); + +asm_exprs( + unique int id: @asm_expr +); + +#keyset[id, index] +asm_expr_asm_pieces( + int id: @asm_expr ref, + int index: int ref, + int asm_piece: @asm_piece ref +); + +#keyset[id, index] +asm_expr_attrs( + int id: @asm_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +asm_expr_templates( + int id: @asm_expr ref, + int index: int ref, + int template: @expr ref +); + +@assoc_item = + @const +| @function +| @macro_call +| @type_alias +; + +block_exprs( + unique int id: @block_expr +); + +#keyset[id, index] +block_expr_attrs( + int id: @block_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +block_expr_is_async( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_const( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_gen( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_move( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_unsafe( + int id: @block_expr ref +); + +#keyset[id] +block_expr_stmt_lists( + int id: @block_expr ref, + int stmt_list: @stmt_list ref +); + +#keyset[id] +block_expr_try_block_modifiers( + int id: @block_expr ref, + int try_block_modifier: @try_block_modifier ref +); + +extern_blocks( + unique int id: @extern_block +); + +#keyset[id] +extern_block_abis( + int id: @extern_block ref, + int abi: @abi ref +); + +#keyset[id, index] +extern_block_attrs( + int id: @extern_block ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_block_extern_item_lists( + int id: @extern_block ref, + int extern_item_list: @extern_item_list ref +); + +#keyset[id] +extern_block_is_unsafe( + int id: @extern_block ref +); + +extern_crates( + unique int id: @extern_crate +); + +#keyset[id, index] +extern_crate_attrs( + int id: @extern_crate ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_crate_identifiers( + int id: @extern_crate ref, + int identifier: @name_ref ref +); + +#keyset[id] +extern_crate_renames( + int id: @extern_crate ref, + int rename: @rename ref +); + +#keyset[id] +extern_crate_visibilities( + int id: @extern_crate ref, + int visibility: @visibility ref +); + +@extern_item = + @function +| @macro_call +| @static +| @type_alias +; + +impls( + unique int id: @impl +); + +#keyset[id] +impl_assoc_item_lists( + int id: @impl ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +impl_attrs( + int id: @impl ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +impl_generic_param_lists( + int id: @impl ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +impl_is_const( + int id: @impl ref +); + +#keyset[id] +impl_is_default( + int id: @impl ref +); + +#keyset[id] +impl_is_unsafe( + int id: @impl ref +); + +#keyset[id] +impl_self_ties( + int id: @impl ref, + int self_ty: @type_repr ref +); + +#keyset[id] +impl_trait_ties( + int id: @impl ref, + int trait_ty: @type_repr ref +); + +#keyset[id] +impl_visibilities( + int id: @impl ref, + int visibility: @visibility ref +); + +#keyset[id] +impl_where_clauses( + int id: @impl ref, + int where_clause: @where_clause ref +); + +@looping_expr = + @for_expr +| @loop_expr +| @while_expr +; + +#keyset[id] +looping_expr_loop_bodies( + int id: @looping_expr ref, + int loop_body: @block_expr ref +); + +macro_defs( + unique int id: @macro_def +); + +#keyset[id] +macro_def_args( + int id: @macro_def ref, + int args: @token_tree ref +); + +#keyset[id, index] +macro_def_attrs( + int id: @macro_def ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_def_bodies( + int id: @macro_def ref, + int body: @token_tree ref +); + +#keyset[id] +macro_def_names( + int id: @macro_def ref, + int name: @name ref +); + +#keyset[id] +macro_def_visibilities( + int id: @macro_def ref, + int visibility: @visibility ref +); + +macro_rules( + unique int id: @macro_rules +); + +#keyset[id, index] +macro_rules_attrs( + int id: @macro_rules ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_rules_names( + int id: @macro_rules ref, + int name: @name ref +); + +#keyset[id] +macro_rules_token_trees( + int id: @macro_rules ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_rules_visibilities( + int id: @macro_rules ref, + int visibility: @visibility ref +); + +modules( + unique int id: @module +); + +#keyset[id, index] +module_attrs( + int id: @module ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +module_item_lists( + int id: @module ref, + int item_list: @item_list ref +); + +#keyset[id] +module_names( + int id: @module ref, + int name: @name ref +); + +#keyset[id] +module_visibilities( + int id: @module ref, + int visibility: @visibility ref +); + +path_exprs( + unique int id: @path_expr +); + +#keyset[id, index] +path_expr_attrs( + int id: @path_expr ref, + int index: int ref, + int attr: @attr ref +); + +traits( + unique int id: @trait +); + +#keyset[id] +trait_assoc_item_lists( + int id: @trait ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +trait_attrs( + int id: @trait ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_generic_param_lists( + int id: @trait ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_is_auto( + int id: @trait ref +); + +#keyset[id] +trait_is_unsafe( + int id: @trait ref +); + +#keyset[id] +trait_names( + int id: @trait ref, + int name: @name ref +); + +#keyset[id] +trait_type_bound_lists( + int id: @trait ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_visibilities( + int id: @trait ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_where_clauses( + int id: @trait ref, + int where_clause: @where_clause ref +); + +@type_item = + @enum +| @struct +| @union +; + +#keyset[id, index] +type_item_derive_macro_expansions( + int id: @type_item ref, + int index: int ref, + int derive_macro_expansion: @macro_items ref +); + +#keyset[id, index] +type_item_attrs( + int id: @type_item ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_item_generic_param_lists( + int id: @type_item ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_item_names( + int id: @type_item ref, + int name: @name ref +); + +#keyset[id] +type_item_visibilities( + int id: @type_item ref, + int visibility: @visibility ref +); + +#keyset[id] +type_item_where_clauses( + int id: @type_item ref, + int where_clause: @where_clause ref +); + +uses( + unique int id: @use +); + +#keyset[id, index] +use_attrs( + int id: @use ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +use_use_trees( + int id: @use ref, + int use_tree: @use_tree ref +); + +#keyset[id] +use_visibilities( + int id: @use ref, + int visibility: @visibility ref +); + +consts( + unique int id: @const +); + +#keyset[id, index] +const_attrs( + int id: @const ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_bodies( + int id: @const ref, + int body: @expr ref +); + +#keyset[id] +const_generic_param_lists( + int id: @const ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +const_is_const( + int id: @const ref +); + +#keyset[id] +const_is_default( + int id: @const ref +); + +#keyset[id] +const_names( + int id: @const ref, + int name: @name ref +); + +#keyset[id] +const_type_reprs( + int id: @const ref, + int type_repr: @type_repr ref +); + +#keyset[id] +const_visibilities( + int id: @const ref, + int visibility: @visibility ref +); + +#keyset[id] +const_where_clauses( + int id: @const ref, + int where_clause: @where_clause ref +); + +#keyset[id] +const_has_implementation( + int id: @const ref +); + +enums( + unique int id: @enum +); + +#keyset[id] +enum_variant_lists( + int id: @enum ref, + int variant_list: @variant_list ref +); + +for_exprs( + unique int id: @for_expr +); + +#keyset[id, index] +for_expr_attrs( + int id: @for_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +for_expr_iterables( + int id: @for_expr ref, + int iterable: @expr ref +); + +#keyset[id] +for_expr_pats( + int id: @for_expr ref, + int pat: @pat ref +); + +functions( + unique int id: @function +); + +#keyset[id] +function_abis( + int id: @function ref, + int abi: @abi ref +); + +#keyset[id] +function_function_bodies( + int id: @function ref, + int function_body: @block_expr ref +); + +#keyset[id] +function_generic_param_lists( + int id: @function ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +function_is_async( + int id: @function ref +); + +#keyset[id] +function_is_const( + int id: @function ref +); + +#keyset[id] +function_is_default( + int id: @function ref +); + +#keyset[id] +function_is_gen( + int id: @function ref +); + +#keyset[id] +function_is_unsafe( + int id: @function ref +); + +#keyset[id] +function_names( + int id: @function ref, + int name: @name ref +); + +#keyset[id] +function_ret_types( + int id: @function ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +function_visibilities( + int id: @function ref, + int visibility: @visibility ref +); + +#keyset[id] +function_where_clauses( + int id: @function ref, + int where_clause: @where_clause ref +); + +#keyset[id] +function_has_implementation( + int id: @function ref +); + +loop_exprs( + unique int id: @loop_expr +); + +#keyset[id, index] +loop_expr_attrs( + int id: @loop_expr ref, + int index: int ref, + int attr: @attr ref +); + +macro_calls( + unique int id: @macro_call +); + +#keyset[id, index] +macro_call_attrs( + int id: @macro_call ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_call_paths( + int id: @macro_call ref, + int path: @path ref +); + +#keyset[id] +macro_call_token_trees( + int id: @macro_call ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_call_macro_call_expansions( + int id: @macro_call ref, + int macro_call_expansion: @ast_node ref +); + +statics( + unique int id: @static +); + +#keyset[id, index] +static_attrs( + int id: @static ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +static_bodies( + int id: @static ref, + int body: @expr ref +); + +#keyset[id] +static_is_mut( + int id: @static ref +); + +#keyset[id] +static_is_static( + int id: @static ref +); + +#keyset[id] +static_is_unsafe( + int id: @static ref +); + +#keyset[id] +static_names( + int id: @static ref, + int name: @name ref +); + +#keyset[id] +static_type_reprs( + int id: @static ref, + int type_repr: @type_repr ref +); + +#keyset[id] +static_visibilities( + int id: @static ref, + int visibility: @visibility ref +); + +structs( + unique int id: @struct +); + +#keyset[id] +struct_field_lists_( + int id: @struct ref, + int field_list: @field_list ref +); + +type_aliases( + unique int id: @type_alias +); + +#keyset[id, index] +type_alias_attrs( + int id: @type_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_alias_generic_param_lists( + int id: @type_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_alias_is_default( + int id: @type_alias ref +); + +#keyset[id] +type_alias_names( + int id: @type_alias ref, + int name: @name ref +); + +#keyset[id] +type_alias_type_reprs( + int id: @type_alias ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_alias_type_bound_lists( + int id: @type_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +type_alias_visibilities( + int id: @type_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +type_alias_where_clauses( + int id: @type_alias ref, + int where_clause: @where_clause ref +); + +unions( + unique int id: @union +); + +#keyset[id] +union_struct_field_lists( + int id: @union ref, + int struct_field_list: @struct_field_list ref +); + +while_exprs( + unique int id: @while_expr +); + +#keyset[id, index] +while_expr_attrs( + int id: @while_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +while_expr_conditions( + int id: @while_expr ref, + int condition: @expr ref +); diff --git a/rust/downgrades/852696f20117c338fbb4e6a4f5ed69df79682c37/upgrade.properties b/rust/downgrades/852696f20117c338fbb4e6a4f5ed69df79682c37/upgrade.properties new file mode 100644 index 000000000000..b3c357f44dc0 --- /dev/null +++ b/rust/downgrades/852696f20117c338fbb4e6a4f5ed69df79682c37/upgrade.properties @@ -0,0 +1,33 @@ +description: Downgrade rust-analyzer to 0.0.328 +compatibility: partial + +visibility_paths.rel: run downgrade.ql new_visibility_paths +visibility_visibility_inners.rel: delete +visibility_inners.rel: delete +visibility_inner_paths.rel: delete + +format_args_arg_names.rel: run downgrade.ql new_format_args_arg_names +format_args_arg_arg_names.rel: run downgrade.ql new_format_args_arg_arg_names +names.rel: run downgrade.ql new_names +name_texts.rel: run downgrade.ql new_name_texts + +locatable_locations.rel: run downgrade.ql new_locatable_locations + +deref_pats.rel: delete +deref_pat_pats.rel: delete +not_nulls.rel: delete +include_bytes_exprs.rel: delete +pattern_type_reprs.rel: delete +pattern_type_repr_pats.rel: delete +pattern_type_repr_type_reprs.rel: delete +impl_restrictions.rel: delete +impl_restriction_visibility_inners.rel: delete +mut_restrictions.rel: delete +mut_restriction_is_mut.rel: delete +mut_restriction_visibility_inners.rel: delete +asm_clobber_abi_attrs.rel: delete +asm_operand_named_attrs.rel: delete +asm_options_list_attrs.rel: delete +struct_field_mut_restrictions.rel: delete +tuple_field_mut_restrictions.rel: delete +trait_impl_restrictions.rel: delete diff --git a/rust/ql/lib/change-notes/2026-08-14-rust-analyzer-0.0.347.md b/rust/ql/lib/change-notes/2026-08-14-rust-analyzer-0.0.347.md new file mode 100644 index 000000000000..9e03da0fa39c --- /dev/null +++ b/rust/ql/lib/change-notes/2026-08-14-rust-analyzer-0.0.347.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The Rust extractor has been upgraded to use `rust-analyzer` version 0.0.347. As a result, the AST exposed by the Rust libraries has changed: new `DerefPat`, `ImplRestriction`, `IncludeBytesExpr`, `MutRestriction`, `NotNull`, `PatternTypeRepr`, and `VisibilityInner` classes have been added; the `FormatArgsArgName` class has been removed in favour of `FormatArgsArg.getName()`, which now returns a `Name`; `Visibility.getPath()` has been moved onto the new `VisibilityInner` class, reachable via `Visibility.getVisibilityInner()`; and `attrs` have been added to the inline assembly nodes, `getMutRestriction()` to `StructField` and `TupleField`, and `getImplRestriction()` to `Trait`. diff --git a/rust/ql/lib/upgrades/ed6b1d3d51401eafee5e4b24e1093d731309ac94/old.dbscheme b/rust/ql/lib/upgrades/ed6b1d3d51401eafee5e4b24e1093d731309ac94/old.dbscheme new file mode 100644 index 000000000000..ed6b1d3d5140 --- /dev/null +++ b/rust/ql/lib/upgrades/ed6b1d3d51401eafee5e4b24e1093d731309ac94/old.dbscheme @@ -0,0 +1,3627 @@ +// generated by codegen, do not edit + +// from ../shared/tree-sitter-extractor/src/generator/prefix.dbscheme +/*- Files and folders -*/ + +/** + * The location of an element. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @file | @folder + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +/*- Empty location -*/ + +empty_location( + int location: @location_default ref +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/*- Diagnostic messages -*/ + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/*- Diagnostic messages: severity -*/ + +case @diagnostic.severity of + 10 = @diagnostic_debug +| 20 = @diagnostic_info +| 30 = @diagnostic_warning +| 40 = @diagnostic_error +; + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_comments (unique int id: @yaml_comment, + string text: string ref, + string tostring: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error | @yaml_comment; + +/*- Database metadata -*/ + +/** + * The CLI will automatically emit applicable tuples for this table, + * such as `databaseMetadata("isOverlay", "true")` when building an + * overlay database. + */ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +/*- Overlay support -*/ + +/** + * The CLI will automatically emit tuples for each new/modified/deleted file + * when building an overlay database. + */ +overlayChangedFiles( + string path: string ref +); + + +// from prefix.dbscheme +#keyset[id] +locatable_locations( + int id: @locatable ref, + int location: @location_default ref +); + + +// from schema + +@element = + @extractor_step +| @locatable +| @named_crate +| @unextracted +; + +extractor_steps( + unique int id: @extractor_step, + string action: string ref, + int duration_ms: int ref +); + +#keyset[id] +extractor_step_files( + int id: @extractor_step ref, + int file: @file ref +); + +@locatable = + @ast_node +| @crate +; + +named_crates( + unique int id: @named_crate, + string name: string ref, + int crate: @crate ref +); + +@unextracted = + @missing +| @unimplemented +; + +@ast_node = + @abi +| @addressable +| @arg_list +| @asm_dir_spec +| @asm_operand +| @asm_operand_expr +| @asm_option +| @asm_piece +| @asm_reg_spec +| @assoc_item_list +| @attr +| @callable +| @cfg_predicate +| @expr +| @extern_item_list +| @field_list +| @for_binder +| @format_args_arg +| @format_args_arg_name +| @generic_arg +| @generic_arg_list +| @generic_param +| @generic_param_list +| @item_list +| @label +| @let_else +| @macro_items +| @match_arm +| @match_arm_list +| @match_guard +| @meta +| @name +| @param_base +| @param_list +| @parenthesized_arg_list +| @pat +| @path +| @path_ast_node +| @path_segment +| @rename +| @ret_type_repr +| @return_type_syntax +| @source_file +| @stmt +| @stmt_list +| @struct_expr_field +| @struct_expr_field_list +| @struct_field +| @struct_pat_field +| @struct_pat_field_list +| @token +| @token_tree +| @try_block_modifier +| @tuple_field +| @type_bound +| @type_bound_list +| @type_repr +| @use_bound_generic_arg +| @use_bound_generic_args +| @use_tree +| @use_tree_list +| @variant_list +| @visibility +| @where_clause +| @where_pred +; + +crates( + unique int id: @crate +); + +#keyset[id] +crate_names( + int id: @crate ref, + string name: string ref +); + +#keyset[id] +crate_versions( + int id: @crate ref, + string version: string ref +); + +#keyset[id, index] +crate_cfg_options( + int id: @crate ref, + int index: int ref, + string cfg_option: string ref +); + +#keyset[id, index] +crate_named_dependencies( + int id: @crate ref, + int index: int ref, + int named_dependency: @named_crate ref +); + +missings( + unique int id: @missing +); + +unimplementeds( + unique int id: @unimplemented +); + +abis( + unique int id: @abi +); + +#keyset[id] +abi_abi_strings( + int id: @abi ref, + string abi_string: string ref +); + +@addressable = + @item +| @variant +; + +arg_lists( + unique int id: @arg_list +); + +#keyset[id, index] +arg_list_args( + int id: @arg_list ref, + int index: int ref, + int arg: @expr ref +); + +asm_dir_specs( + unique int id: @asm_dir_spec +); + +@asm_operand = + @asm_const +| @asm_label +| @asm_reg_operand +| @asm_sym +; + +asm_operand_exprs( + unique int id: @asm_operand_expr +); + +#keyset[id] +asm_operand_expr_in_exprs( + int id: @asm_operand_expr ref, + int in_expr: @expr ref +); + +#keyset[id] +asm_operand_expr_out_exprs( + int id: @asm_operand_expr ref, + int out_expr: @expr ref +); + +asm_options( + unique int id: @asm_option +); + +#keyset[id] +asm_option_is_raw( + int id: @asm_option ref +); + +@asm_piece = + @asm_clobber_abi +| @asm_operand_named +| @asm_options_list +; + +asm_reg_specs( + unique int id: @asm_reg_spec +); + +#keyset[id] +asm_reg_spec_identifiers( + int id: @asm_reg_spec ref, + int identifier: @name_ref ref +); + +assoc_item_lists( + unique int id: @assoc_item_list +); + +#keyset[id, index] +assoc_item_list_assoc_items( + int id: @assoc_item_list ref, + int index: int ref, + int assoc_item: @assoc_item ref +); + +#keyset[id, index] +assoc_item_list_attrs( + int id: @assoc_item_list ref, + int index: int ref, + int attr: @attr ref +); + +attrs( + unique int id: @attr +); + +#keyset[id] +attr_meta( + int id: @attr ref, + int meta: @meta ref +); + +@callable = + @closure_expr +| @function +; + +#keyset[id] +callable_param_lists( + int id: @callable ref, + int param_list: @param_list ref +); + +#keyset[id, index] +callable_attrs( + int id: @callable ref, + int index: int ref, + int attr: @attr ref +); + +@cfg_predicate = + @cfg_atom +| @cfg_composite +; + +@expr = + @array_expr_internal +| @asm_expr +| @await_expr +| @become_expr +| @binary_expr +| @break_expr +| @call_expr +| @cast_expr +| @closure_expr +| @continue_expr +| @field_expr +| @format_args_expr +| @if_expr +| @index_expr +| @labelable_expr +| @let_expr +| @literal_expr +| @macro_expr +| @match_expr +| @method_call_expr +| @offset_of_expr +| @paren_expr +| @path_expr_base +| @prefix_expr +| @range_expr +| @ref_expr +| @return_expr +| @struct_expr +| @try_expr +| @tuple_expr +| @underscore_expr +| @yeet_expr +| @yield_expr +; + +extern_item_lists( + unique int id: @extern_item_list +); + +#keyset[id, index] +extern_item_list_attrs( + int id: @extern_item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +extern_item_list_extern_items( + int id: @extern_item_list ref, + int index: int ref, + int extern_item: @extern_item ref +); + +@field_list = + @struct_field_list +| @tuple_field_list +; + +for_binders( + unique int id: @for_binder +); + +#keyset[id] +for_binder_generic_param_lists( + int id: @for_binder ref, + int generic_param_list: @generic_param_list ref +); + +format_args_args( + unique int id: @format_args_arg +); + +#keyset[id] +format_args_arg_arg_names( + int id: @format_args_arg ref, + int arg_name: @format_args_arg_name ref +); + +#keyset[id] +format_args_arg_exprs( + int id: @format_args_arg ref, + int expr: @expr ref +); + +format_args_arg_names( + unique int id: @format_args_arg_name +); + +@generic_arg = + @assoc_type_arg +| @const_arg +| @lifetime_arg +| @type_arg +; + +generic_arg_lists( + unique int id: @generic_arg_list +); + +#keyset[id, index] +generic_arg_list_generic_args( + int id: @generic_arg_list ref, + int index: int ref, + int generic_arg: @generic_arg ref +); + +@generic_param = + @const_param +| @lifetime_param +| @type_param +; + +generic_param_lists( + unique int id: @generic_param_list +); + +#keyset[id, index] +generic_param_list_generic_params( + int id: @generic_param_list ref, + int index: int ref, + int generic_param: @generic_param ref +); + +item_lists( + unique int id: @item_list +); + +#keyset[id, index] +item_list_attrs( + int id: @item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +item_list_items( + int id: @item_list ref, + int index: int ref, + int item: @item ref +); + +labels( + unique int id: @label +); + +#keyset[id] +label_lifetimes( + int id: @label ref, + int lifetime: @lifetime ref +); + +let_elses( + unique int id: @let_else +); + +#keyset[id] +let_else_block_exprs( + int id: @let_else ref, + int block_expr: @block_expr ref +); + +macro_items( + unique int id: @macro_items +); + +#keyset[id, index] +macro_items_items( + int id: @macro_items ref, + int index: int ref, + int item: @item ref +); + +match_arms( + unique int id: @match_arm +); + +#keyset[id, index] +match_arm_attrs( + int id: @match_arm ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_arm_exprs( + int id: @match_arm ref, + int expr: @expr ref +); + +#keyset[id] +match_arm_guards( + int id: @match_arm ref, + int guard: @match_guard ref +); + +#keyset[id] +match_arm_pats( + int id: @match_arm ref, + int pat: @pat ref +); + +match_arm_lists( + unique int id: @match_arm_list +); + +#keyset[id, index] +match_arm_list_arms( + int id: @match_arm_list ref, + int index: int ref, + int arm: @match_arm ref +); + +#keyset[id, index] +match_arm_list_attrs( + int id: @match_arm_list ref, + int index: int ref, + int attr: @attr ref +); + +match_guards( + unique int id: @match_guard +); + +#keyset[id] +match_guard_conditions( + int id: @match_guard ref, + int condition: @expr ref +); + +@meta = + @cfg_attr_meta +| @cfg_meta +| @key_value_meta +| @path_meta +| @token_tree_meta +| @unsafe_meta +; + +names( + unique int id: @name +); + +#keyset[id] +name_texts( + int id: @name ref, + string text: string ref +); + +@param_base = + @param +| @self_param +; + +#keyset[id, index] +param_base_attrs( + int id: @param_base ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +param_base_type_reprs( + int id: @param_base ref, + int type_repr: @type_repr ref +); + +param_lists( + unique int id: @param_list +); + +#keyset[id, index] +param_list_params( + int id: @param_list ref, + int index: int ref, + int param: @param ref +); + +#keyset[id] +param_list_self_params( + int id: @param_list ref, + int self_param: @self_param ref +); + +parenthesized_arg_lists( + unique int id: @parenthesized_arg_list +); + +#keyset[id, index] +parenthesized_arg_list_type_args( + int id: @parenthesized_arg_list ref, + int index: int ref, + int type_arg: @type_arg ref +); + +@pat = + @box_pat +| @const_block_pat +| @ident_pat +| @literal_pat +| @macro_pat +| @or_pat +| @paren_pat +| @path_pat +| @range_pat +| @ref_pat +| @rest_pat +| @slice_pat +| @struct_pat +| @tuple_pat +| @tuple_struct_pat +| @wildcard_pat +; + +paths( + unique int id: @path +); + +#keyset[id] +path_qualifiers( + int id: @path ref, + int qualifier: @path ref +); + +#keyset[id] +path_segments_( + int id: @path ref, + int segment: @path_segment ref +); + +@path_ast_node = + @path_expr +| @path_pat +| @struct_expr +| @struct_pat +| @tuple_struct_pat +; + +#keyset[id] +path_ast_node_paths( + int id: @path_ast_node ref, + int path: @path ref +); + +path_segments( + unique int id: @path_segment +); + +#keyset[id] +path_segment_generic_arg_lists( + int id: @path_segment ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +path_segment_identifiers( + int id: @path_segment ref, + int identifier: @name_ref ref +); + +#keyset[id] +path_segment_parenthesized_arg_lists( + int id: @path_segment ref, + int parenthesized_arg_list: @parenthesized_arg_list ref +); + +#keyset[id] +path_segment_ret_types( + int id: @path_segment ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +path_segment_return_type_syntaxes( + int id: @path_segment ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +path_segment_type_reprs( + int id: @path_segment ref, + int type_repr: @type_repr ref +); + +#keyset[id] +path_segment_trait_type_reprs( + int id: @path_segment ref, + int trait_type_repr: @path_type_repr ref +); + +renames( + unique int id: @rename +); + +#keyset[id] +rename_names( + int id: @rename ref, + int name: @name ref +); + +ret_type_reprs( + unique int id: @ret_type_repr +); + +#keyset[id] +ret_type_repr_type_reprs( + int id: @ret_type_repr ref, + int type_repr: @type_repr ref +); + +return_type_syntaxes( + unique int id: @return_type_syntax +); + +source_files( + unique int id: @source_file +); + +#keyset[id, index] +source_file_attrs( + int id: @source_file ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +source_file_items( + int id: @source_file ref, + int index: int ref, + int item: @item ref +); + +@stmt = + @expr_stmt +| @item +| @let_stmt +; + +stmt_lists( + unique int id: @stmt_list +); + +#keyset[id, index] +stmt_list_attrs( + int id: @stmt_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +stmt_list_statements( + int id: @stmt_list ref, + int index: int ref, + int statement: @stmt ref +); + +#keyset[id] +stmt_list_tail_exprs( + int id: @stmt_list ref, + int tail_expr: @expr ref +); + +struct_expr_fields( + unique int id: @struct_expr_field +); + +#keyset[id, index] +struct_expr_field_attrs( + int id: @struct_expr_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_expr_field_exprs( + int id: @struct_expr_field ref, + int expr: @expr ref +); + +#keyset[id] +struct_expr_field_identifiers( + int id: @struct_expr_field ref, + int identifier: @name_ref ref +); + +struct_expr_field_lists( + unique int id: @struct_expr_field_list +); + +#keyset[id, index] +struct_expr_field_list_attrs( + int id: @struct_expr_field_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +struct_expr_field_list_fields( + int id: @struct_expr_field_list ref, + int index: int ref, + int field: @struct_expr_field ref +); + +#keyset[id] +struct_expr_field_list_spreads( + int id: @struct_expr_field_list ref, + int spread: @expr ref +); + +struct_fields( + unique int id: @struct_field +); + +#keyset[id, index] +struct_field_attrs( + int id: @struct_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_field_default_vals( + int id: @struct_field ref, + int default_val: @const_arg ref +); + +#keyset[id] +struct_field_is_unsafe( + int id: @struct_field ref +); + +#keyset[id] +struct_field_names( + int id: @struct_field ref, + int name: @name ref +); + +#keyset[id] +struct_field_type_reprs( + int id: @struct_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +struct_field_visibilities( + int id: @struct_field ref, + int visibility: @visibility ref +); + +struct_pat_fields( + unique int id: @struct_pat_field +); + +#keyset[id, index] +struct_pat_field_attrs( + int id: @struct_pat_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_pat_field_identifiers( + int id: @struct_pat_field ref, + int identifier: @name_ref ref +); + +#keyset[id] +struct_pat_field_pats( + int id: @struct_pat_field ref, + int pat: @pat ref +); + +struct_pat_field_lists( + unique int id: @struct_pat_field_list +); + +#keyset[id, index] +struct_pat_field_list_fields( + int id: @struct_pat_field_list ref, + int index: int ref, + int field: @struct_pat_field ref +); + +#keyset[id] +struct_pat_field_list_rest_pats( + int id: @struct_pat_field_list ref, + int rest_pat: @rest_pat ref +); + +@token = + @comment +; + +token_trees( + unique int id: @token_tree +); + +try_block_modifiers( + unique int id: @try_block_modifier +); + +#keyset[id] +try_block_modifier_is_try( + int id: @try_block_modifier ref +); + +#keyset[id] +try_block_modifier_type_reprs( + int id: @try_block_modifier ref, + int type_repr: @type_repr ref +); + +tuple_fields( + unique int id: @tuple_field +); + +#keyset[id, index] +tuple_field_attrs( + int id: @tuple_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +tuple_field_type_reprs( + int id: @tuple_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +tuple_field_visibilities( + int id: @tuple_field ref, + int visibility: @visibility ref +); + +type_bounds( + unique int id: @type_bound +); + +#keyset[id] +type_bound_for_binders( + int id: @type_bound ref, + int for_binder: @for_binder ref +); + +#keyset[id] +type_bound_is_async( + int id: @type_bound ref +); + +#keyset[id] +type_bound_is_const( + int id: @type_bound ref +); + +#keyset[id] +type_bound_lifetimes( + int id: @type_bound ref, + int lifetime: @lifetime ref +); + +#keyset[id] +type_bound_type_reprs( + int id: @type_bound ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_bound_use_bound_generic_args( + int id: @type_bound ref, + int use_bound_generic_args: @use_bound_generic_args ref +); + +type_bound_lists( + unique int id: @type_bound_list +); + +#keyset[id, index] +type_bound_list_bounds( + int id: @type_bound_list ref, + int index: int ref, + int bound: @type_bound ref +); + +@type_repr = + @array_type_repr +| @dyn_trait_type_repr +| @fn_ptr_type_repr +| @for_type_repr +| @impl_trait_type_repr +| @infer_type_repr +| @macro_type_repr +| @never_type_repr +| @paren_type_repr +| @path_type_repr +| @ptr_type_repr +| @ref_type_repr +| @slice_type_repr +| @tuple_type_repr +; + +@use_bound_generic_arg = + @lifetime +| @name_ref +; + +use_bound_generic_args( + unique int id: @use_bound_generic_args +); + +#keyset[id, index] +use_bound_generic_args_use_bound_generic_args( + int id: @use_bound_generic_args ref, + int index: int ref, + int use_bound_generic_arg: @use_bound_generic_arg ref +); + +use_trees( + unique int id: @use_tree +); + +#keyset[id] +use_tree_is_glob( + int id: @use_tree ref +); + +#keyset[id] +use_tree_paths( + int id: @use_tree ref, + int path: @path ref +); + +#keyset[id] +use_tree_renames( + int id: @use_tree ref, + int rename: @rename ref +); + +#keyset[id] +use_tree_use_tree_lists( + int id: @use_tree ref, + int use_tree_list: @use_tree_list ref +); + +use_tree_lists( + unique int id: @use_tree_list +); + +#keyset[id, index] +use_tree_list_use_trees( + int id: @use_tree_list ref, + int index: int ref, + int use_tree: @use_tree ref +); + +variant_lists( + unique int id: @variant_list +); + +#keyset[id, index] +variant_list_variants( + int id: @variant_list ref, + int index: int ref, + int variant: @variant ref +); + +visibilities( + unique int id: @visibility +); + +#keyset[id] +visibility_paths( + int id: @visibility ref, + int path: @path ref +); + +where_clauses( + unique int id: @where_clause +); + +#keyset[id, index] +where_clause_predicates( + int id: @where_clause ref, + int index: int ref, + int predicate: @where_pred ref +); + +where_preds( + unique int id: @where_pred +); + +#keyset[id] +where_pred_for_binders( + int id: @where_pred ref, + int for_binder: @for_binder ref +); + +#keyset[id] +where_pred_lifetimes( + int id: @where_pred ref, + int lifetime: @lifetime ref +); + +#keyset[id] +where_pred_type_reprs( + int id: @where_pred ref, + int type_repr: @type_repr ref +); + +#keyset[id] +where_pred_type_bound_lists( + int id: @where_pred ref, + int type_bound_list: @type_bound_list ref +); + +array_expr_internals( + unique int id: @array_expr_internal +); + +#keyset[id, index] +array_expr_internal_attrs( + int id: @array_expr_internal ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +array_expr_internal_exprs( + int id: @array_expr_internal ref, + int index: int ref, + int expr: @expr ref +); + +#keyset[id] +array_expr_internal_is_semicolon( + int id: @array_expr_internal ref +); + +array_type_reprs( + unique int id: @array_type_repr +); + +#keyset[id] +array_type_repr_const_args( + int id: @array_type_repr ref, + int const_arg: @const_arg ref +); + +#keyset[id] +array_type_repr_element_type_reprs( + int id: @array_type_repr ref, + int element_type_repr: @type_repr ref +); + +asm_clobber_abis( + unique int id: @asm_clobber_abi +); + +asm_consts( + unique int id: @asm_const +); + +#keyset[id] +asm_const_exprs( + int id: @asm_const ref, + int expr: @expr ref +); + +#keyset[id] +asm_const_is_const( + int id: @asm_const ref +); + +asm_labels( + unique int id: @asm_label +); + +#keyset[id] +asm_label_block_exprs( + int id: @asm_label ref, + int block_expr: @block_expr ref +); + +asm_operand_nameds( + unique int id: @asm_operand_named +); + +#keyset[id] +asm_operand_named_asm_operands( + int id: @asm_operand_named ref, + int asm_operand: @asm_operand ref +); + +#keyset[id] +asm_operand_named_names( + int id: @asm_operand_named ref, + int name: @name ref +); + +asm_options_lists( + unique int id: @asm_options_list +); + +#keyset[id, index] +asm_options_list_asm_options( + int id: @asm_options_list ref, + int index: int ref, + int asm_option: @asm_option ref +); + +asm_reg_operands( + unique int id: @asm_reg_operand +); + +#keyset[id] +asm_reg_operand_asm_dir_specs( + int id: @asm_reg_operand ref, + int asm_dir_spec: @asm_dir_spec ref +); + +#keyset[id] +asm_reg_operand_asm_operand_exprs( + int id: @asm_reg_operand ref, + int asm_operand_expr: @asm_operand_expr ref +); + +#keyset[id] +asm_reg_operand_asm_reg_specs( + int id: @asm_reg_operand ref, + int asm_reg_spec: @asm_reg_spec ref +); + +asm_syms( + unique int id: @asm_sym +); + +#keyset[id] +asm_sym_paths( + int id: @asm_sym ref, + int path: @path ref +); + +assoc_type_args( + unique int id: @assoc_type_arg +); + +#keyset[id] +assoc_type_arg_const_args( + int id: @assoc_type_arg ref, + int const_arg: @const_arg ref +); + +#keyset[id] +assoc_type_arg_generic_arg_lists( + int id: @assoc_type_arg ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +assoc_type_arg_identifiers( + int id: @assoc_type_arg ref, + int identifier: @name_ref ref +); + +#keyset[id] +assoc_type_arg_param_lists( + int id: @assoc_type_arg ref, + int param_list: @param_list ref +); + +#keyset[id] +assoc_type_arg_ret_types( + int id: @assoc_type_arg ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +assoc_type_arg_return_type_syntaxes( + int id: @assoc_type_arg ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +assoc_type_arg_type_reprs( + int id: @assoc_type_arg ref, + int type_repr: @type_repr ref +); + +#keyset[id] +assoc_type_arg_type_bound_lists( + int id: @assoc_type_arg ref, + int type_bound_list: @type_bound_list ref +); + +await_exprs( + unique int id: @await_expr +); + +#keyset[id, index] +await_expr_attrs( + int id: @await_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +await_expr_exprs( + int id: @await_expr ref, + int expr: @expr ref +); + +become_exprs( + unique int id: @become_expr +); + +#keyset[id, index] +become_expr_attrs( + int id: @become_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +become_expr_exprs( + int id: @become_expr ref, + int expr: @expr ref +); + +binary_exprs( + unique int id: @binary_expr +); + +#keyset[id, index] +binary_expr_attrs( + int id: @binary_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +binary_expr_lhs( + int id: @binary_expr ref, + int lhs: @expr ref +); + +#keyset[id] +binary_expr_operator_names( + int id: @binary_expr ref, + string operator_name: string ref +); + +#keyset[id] +binary_expr_rhs( + int id: @binary_expr ref, + int rhs: @expr ref +); + +box_pats( + unique int id: @box_pat +); + +#keyset[id] +box_pat_pats( + int id: @box_pat ref, + int pat: @pat ref +); + +break_exprs( + unique int id: @break_expr +); + +#keyset[id, index] +break_expr_attrs( + int id: @break_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +break_expr_exprs( + int id: @break_expr ref, + int expr: @expr ref +); + +#keyset[id] +break_expr_lifetimes( + int id: @break_expr ref, + int lifetime: @lifetime ref +); + +call_exprs( + unique int id: @call_expr +); + +#keyset[id] +call_expr_arg_lists( + int id: @call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +call_expr_attrs( + int id: @call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +call_expr_functions( + int id: @call_expr ref, + int function: @expr ref +); + +cast_exprs( + unique int id: @cast_expr +); + +#keyset[id, index] +cast_expr_attrs( + int id: @cast_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +cast_expr_exprs( + int id: @cast_expr ref, + int expr: @expr ref +); + +#keyset[id] +cast_expr_type_reprs( + int id: @cast_expr ref, + int type_repr: @type_repr ref +); + +cfg_atoms( + unique int id: @cfg_atom +); + +cfg_attr_meta( + unique int id: @cfg_attr_meta +); + +#keyset[id] +cfg_attr_meta_cfg_predicates( + int id: @cfg_attr_meta ref, + int cfg_predicate: @cfg_predicate ref +); + +#keyset[id, index] +cfg_attr_meta_metas( + int id: @cfg_attr_meta ref, + int index: int ref, + int meta: @meta ref +); + +cfg_composites( + unique int id: @cfg_composite +); + +#keyset[id, index] +cfg_composite_cfg_predicates( + int id: @cfg_composite ref, + int index: int ref, + int cfg_predicate: @cfg_predicate ref +); + +cfg_meta( + unique int id: @cfg_meta +); + +#keyset[id] +cfg_meta_cfg_predicates( + int id: @cfg_meta ref, + int cfg_predicate: @cfg_predicate ref +); + +closure_exprs( + unique int id: @closure_expr +); + +#keyset[id] +closure_expr_closure_bodies( + int id: @closure_expr ref, + int closure_body: @expr ref +); + +#keyset[id] +closure_expr_for_binders( + int id: @closure_expr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +closure_expr_is_async( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_const( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_gen( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_move( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_static( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_ret_types( + int id: @closure_expr ref, + int ret_type: @ret_type_repr ref +); + +comments( + unique int id: @comment, + int parent: @ast_node ref, + string text: string ref +); + +const_args( + unique int id: @const_arg +); + +#keyset[id] +const_arg_exprs( + int id: @const_arg ref, + int expr: @expr ref +); + +const_block_pats( + unique int id: @const_block_pat +); + +#keyset[id] +const_block_pat_block_exprs( + int id: @const_block_pat ref, + int block_expr: @block_expr ref +); + +#keyset[id] +const_block_pat_is_const( + int id: @const_block_pat ref +); + +const_params( + unique int id: @const_param +); + +#keyset[id, index] +const_param_attrs( + int id: @const_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_param_default_vals( + int id: @const_param ref, + int default_val: @const_arg ref +); + +#keyset[id] +const_param_is_const( + int id: @const_param ref +); + +#keyset[id] +const_param_names( + int id: @const_param ref, + int name: @name ref +); + +#keyset[id] +const_param_type_reprs( + int id: @const_param ref, + int type_repr: @type_repr ref +); + +continue_exprs( + unique int id: @continue_expr +); + +#keyset[id, index] +continue_expr_attrs( + int id: @continue_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +continue_expr_lifetimes( + int id: @continue_expr ref, + int lifetime: @lifetime ref +); + +dyn_trait_type_reprs( + unique int id: @dyn_trait_type_repr +); + +#keyset[id] +dyn_trait_type_repr_type_bound_lists( + int id: @dyn_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +expr_stmts( + unique int id: @expr_stmt +); + +#keyset[id] +expr_stmt_exprs( + int id: @expr_stmt ref, + int expr: @expr ref +); + +field_exprs( + unique int id: @field_expr +); + +#keyset[id, index] +field_expr_attrs( + int id: @field_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +field_expr_containers( + int id: @field_expr ref, + int container: @expr ref +); + +#keyset[id] +field_expr_identifiers( + int id: @field_expr ref, + int identifier: @name_ref ref +); + +fn_ptr_type_reprs( + unique int id: @fn_ptr_type_repr +); + +#keyset[id] +fn_ptr_type_repr_abis( + int id: @fn_ptr_type_repr ref, + int abi: @abi ref +); + +#keyset[id] +fn_ptr_type_repr_is_async( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_const( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_unsafe( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_param_lists( + int id: @fn_ptr_type_repr ref, + int param_list: @param_list ref +); + +#keyset[id] +fn_ptr_type_repr_ret_types( + int id: @fn_ptr_type_repr ref, + int ret_type: @ret_type_repr ref +); + +for_type_reprs( + unique int id: @for_type_repr +); + +#keyset[id] +for_type_repr_for_binders( + int id: @for_type_repr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +for_type_repr_type_reprs( + int id: @for_type_repr ref, + int type_repr: @type_repr ref +); + +format_args_exprs( + unique int id: @format_args_expr +); + +#keyset[id, index] +format_args_expr_args( + int id: @format_args_expr ref, + int index: int ref, + int arg: @format_args_arg ref +); + +#keyset[id, index] +format_args_expr_attrs( + int id: @format_args_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +format_args_expr_templates( + int id: @format_args_expr ref, + int template: @expr ref +); + +ident_pats( + unique int id: @ident_pat +); + +#keyset[id, index] +ident_pat_attrs( + int id: @ident_pat ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ident_pat_is_mut( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_is_ref( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_names( + int id: @ident_pat ref, + int name: @name ref +); + +#keyset[id] +ident_pat_pats( + int id: @ident_pat ref, + int pat: @pat ref +); + +if_exprs( + unique int id: @if_expr +); + +#keyset[id, index] +if_expr_attrs( + int id: @if_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +if_expr_conditions( + int id: @if_expr ref, + int condition: @expr ref +); + +#keyset[id] +if_expr_elses( + int id: @if_expr ref, + int else: @expr ref +); + +#keyset[id] +if_expr_thens( + int id: @if_expr ref, + int then: @block_expr ref +); + +impl_trait_type_reprs( + unique int id: @impl_trait_type_repr +); + +#keyset[id] +impl_trait_type_repr_type_bound_lists( + int id: @impl_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +index_exprs( + unique int id: @index_expr +); + +#keyset[id, index] +index_expr_attrs( + int id: @index_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +index_expr_bases( + int id: @index_expr ref, + int base: @expr ref +); + +#keyset[id] +index_expr_indices( + int id: @index_expr ref, + int index: @expr ref +); + +infer_type_reprs( + unique int id: @infer_type_repr +); + +@item = + @asm_expr +| @assoc_item +| @extern_block +| @extern_crate +| @extern_item +| @impl +| @macro_def +| @macro_rules +| @module +| @trait +| @type_item +| @use +; + +#keyset[id] +item_attribute_macro_expansions( + int id: @item ref, + int attribute_macro_expansion: @macro_items ref +); + +key_value_meta( + unique int id: @key_value_meta +); + +#keyset[id] +key_value_meta_exprs( + int id: @key_value_meta ref, + int expr: @expr ref +); + +#keyset[id] +key_value_meta_paths( + int id: @key_value_meta ref, + int path: @path ref +); + +@labelable_expr = + @block_expr +| @looping_expr +; + +#keyset[id] +labelable_expr_labels( + int id: @labelable_expr ref, + int label: @label ref +); + +let_exprs( + unique int id: @let_expr +); + +#keyset[id, index] +let_expr_attrs( + int id: @let_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_expr_scrutinees( + int id: @let_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +let_expr_pats( + int id: @let_expr ref, + int pat: @pat ref +); + +let_stmts( + unique int id: @let_stmt +); + +#keyset[id, index] +let_stmt_attrs( + int id: @let_stmt ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_stmt_initializers( + int id: @let_stmt ref, + int initializer: @expr ref +); + +#keyset[id] +let_stmt_let_elses( + int id: @let_stmt ref, + int let_else: @let_else ref +); + +#keyset[id] +let_stmt_pats( + int id: @let_stmt ref, + int pat: @pat ref +); + +#keyset[id] +let_stmt_type_reprs( + int id: @let_stmt ref, + int type_repr: @type_repr ref +); + +lifetimes( + unique int id: @lifetime +); + +#keyset[id] +lifetime_texts( + int id: @lifetime ref, + string text: string ref +); + +lifetime_args( + unique int id: @lifetime_arg +); + +#keyset[id] +lifetime_arg_lifetimes( + int id: @lifetime_arg ref, + int lifetime: @lifetime ref +); + +lifetime_params( + unique int id: @lifetime_param +); + +#keyset[id, index] +lifetime_param_attrs( + int id: @lifetime_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +lifetime_param_lifetimes( + int id: @lifetime_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +lifetime_param_type_bound_lists( + int id: @lifetime_param ref, + int type_bound_list: @type_bound_list ref +); + +literal_exprs( + unique int id: @literal_expr +); + +#keyset[id, index] +literal_expr_attrs( + int id: @literal_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +literal_expr_text_values( + int id: @literal_expr ref, + string text_value: string ref +); + +literal_pats( + unique int id: @literal_pat +); + +#keyset[id] +literal_pat_literals( + int id: @literal_pat ref, + int literal: @literal_expr ref +); + +macro_exprs( + unique int id: @macro_expr +); + +#keyset[id] +macro_expr_macro_calls( + int id: @macro_expr ref, + int macro_call: @macro_call ref +); + +macro_pats( + unique int id: @macro_pat +); + +#keyset[id] +macro_pat_macro_calls( + int id: @macro_pat ref, + int macro_call: @macro_call ref +); + +macro_type_reprs( + unique int id: @macro_type_repr +); + +#keyset[id] +macro_type_repr_macro_calls( + int id: @macro_type_repr ref, + int macro_call: @macro_call ref +); + +match_exprs( + unique int id: @match_expr +); + +#keyset[id, index] +match_expr_attrs( + int id: @match_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_expr_scrutinees( + int id: @match_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +match_expr_match_arm_lists( + int id: @match_expr ref, + int match_arm_list: @match_arm_list ref +); + +method_call_exprs( + unique int id: @method_call_expr +); + +#keyset[id] +method_call_expr_arg_lists( + int id: @method_call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +method_call_expr_attrs( + int id: @method_call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +method_call_expr_generic_arg_lists( + int id: @method_call_expr ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +method_call_expr_identifiers( + int id: @method_call_expr ref, + int identifier: @name_ref ref +); + +#keyset[id] +method_call_expr_receivers( + int id: @method_call_expr ref, + int receiver: @expr ref +); + +name_refs( + unique int id: @name_ref +); + +#keyset[id] +name_ref_texts( + int id: @name_ref ref, + string text: string ref +); + +never_type_reprs( + unique int id: @never_type_repr +); + +offset_of_exprs( + unique int id: @offset_of_expr +); + +#keyset[id, index] +offset_of_expr_attrs( + int id: @offset_of_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +offset_of_expr_fields( + int id: @offset_of_expr ref, + int index: int ref, + int field: @name_ref ref +); + +#keyset[id] +offset_of_expr_type_reprs( + int id: @offset_of_expr ref, + int type_repr: @type_repr ref +); + +or_pats( + unique int id: @or_pat +); + +#keyset[id, index] +or_pat_pats( + int id: @or_pat ref, + int index: int ref, + int pat: @pat ref +); + +params( + unique int id: @param +); + +#keyset[id] +param_pats( + int id: @param ref, + int pat: @pat ref +); + +paren_exprs( + unique int id: @paren_expr +); + +#keyset[id, index] +paren_expr_attrs( + int id: @paren_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +paren_expr_exprs( + int id: @paren_expr ref, + int expr: @expr ref +); + +paren_pats( + unique int id: @paren_pat +); + +#keyset[id] +paren_pat_pats( + int id: @paren_pat ref, + int pat: @pat ref +); + +paren_type_reprs( + unique int id: @paren_type_repr +); + +#keyset[id] +paren_type_repr_type_reprs( + int id: @paren_type_repr ref, + int type_repr: @type_repr ref +); + +@path_expr_base = + @path_expr +; + +path_meta( + unique int id: @path_meta +); + +#keyset[id] +path_meta_paths( + int id: @path_meta ref, + int path: @path ref +); + +path_pats( + unique int id: @path_pat +); + +path_type_reprs( + unique int id: @path_type_repr +); + +#keyset[id] +path_type_repr_paths( + int id: @path_type_repr ref, + int path: @path ref +); + +prefix_exprs( + unique int id: @prefix_expr +); + +#keyset[id, index] +prefix_expr_attrs( + int id: @prefix_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +prefix_expr_exprs( + int id: @prefix_expr ref, + int expr: @expr ref +); + +#keyset[id] +prefix_expr_operator_names( + int id: @prefix_expr ref, + string operator_name: string ref +); + +ptr_type_reprs( + unique int id: @ptr_type_repr +); + +#keyset[id] +ptr_type_repr_is_const( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_is_mut( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_type_reprs( + int id: @ptr_type_repr ref, + int type_repr: @type_repr ref +); + +range_exprs( + unique int id: @range_expr +); + +#keyset[id, index] +range_expr_attrs( + int id: @range_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +range_expr_ends( + int id: @range_expr ref, + int end: @expr ref +); + +#keyset[id] +range_expr_operator_names( + int id: @range_expr ref, + string operator_name: string ref +); + +#keyset[id] +range_expr_starts( + int id: @range_expr ref, + int start: @expr ref +); + +range_pats( + unique int id: @range_pat +); + +#keyset[id] +range_pat_ends( + int id: @range_pat ref, + int end: @pat ref +); + +#keyset[id] +range_pat_operator_names( + int id: @range_pat ref, + string operator_name: string ref +); + +#keyset[id] +range_pat_starts( + int id: @range_pat ref, + int start: @pat ref +); + +ref_exprs( + unique int id: @ref_expr +); + +#keyset[id, index] +ref_expr_attrs( + int id: @ref_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ref_expr_exprs( + int id: @ref_expr ref, + int expr: @expr ref +); + +#keyset[id] +ref_expr_is_const( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_mut( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_raw( + int id: @ref_expr ref +); + +ref_pats( + unique int id: @ref_pat +); + +#keyset[id] +ref_pat_is_mut( + int id: @ref_pat ref +); + +#keyset[id] +ref_pat_pats( + int id: @ref_pat ref, + int pat: @pat ref +); + +ref_type_reprs( + unique int id: @ref_type_repr +); + +#keyset[id] +ref_type_repr_is_mut( + int id: @ref_type_repr ref +); + +#keyset[id] +ref_type_repr_lifetimes( + int id: @ref_type_repr ref, + int lifetime: @lifetime ref +); + +#keyset[id] +ref_type_repr_type_reprs( + int id: @ref_type_repr ref, + int type_repr: @type_repr ref +); + +rest_pats( + unique int id: @rest_pat +); + +#keyset[id, index] +rest_pat_attrs( + int id: @rest_pat ref, + int index: int ref, + int attr: @attr ref +); + +return_exprs( + unique int id: @return_expr +); + +#keyset[id, index] +return_expr_attrs( + int id: @return_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +return_expr_exprs( + int id: @return_expr ref, + int expr: @expr ref +); + +self_params( + unique int id: @self_param +); + +#keyset[id] +self_param_is_ref( + int id: @self_param ref +); + +#keyset[id] +self_param_is_mut( + int id: @self_param ref +); + +#keyset[id] +self_param_lifetimes( + int id: @self_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +self_param_names( + int id: @self_param ref, + int name: @name ref +); + +slice_pats( + unique int id: @slice_pat +); + +#keyset[id, index] +slice_pat_pats( + int id: @slice_pat ref, + int index: int ref, + int pat: @pat ref +); + +slice_type_reprs( + unique int id: @slice_type_repr +); + +#keyset[id] +slice_type_repr_type_reprs( + int id: @slice_type_repr ref, + int type_repr: @type_repr ref +); + +struct_exprs( + unique int id: @struct_expr +); + +#keyset[id] +struct_expr_struct_expr_field_lists( + int id: @struct_expr ref, + int struct_expr_field_list: @struct_expr_field_list ref +); + +struct_field_lists( + unique int id: @struct_field_list +); + +#keyset[id, index] +struct_field_list_fields( + int id: @struct_field_list ref, + int index: int ref, + int field: @struct_field ref +); + +struct_pats( + unique int id: @struct_pat +); + +#keyset[id] +struct_pat_struct_pat_field_lists( + int id: @struct_pat ref, + int struct_pat_field_list: @struct_pat_field_list ref +); + +token_tree_meta( + unique int id: @token_tree_meta +); + +#keyset[id] +token_tree_meta_paths( + int id: @token_tree_meta ref, + int path: @path ref +); + +#keyset[id] +token_tree_meta_token_trees( + int id: @token_tree_meta ref, + int token_tree: @token_tree ref +); + +try_exprs( + unique int id: @try_expr +); + +#keyset[id, index] +try_expr_attrs( + int id: @try_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +try_expr_exprs( + int id: @try_expr ref, + int expr: @expr ref +); + +tuple_exprs( + unique int id: @tuple_expr +); + +#keyset[id, index] +tuple_expr_attrs( + int id: @tuple_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +tuple_expr_fields( + int id: @tuple_expr ref, + int index: int ref, + int field: @expr ref +); + +tuple_field_lists( + unique int id: @tuple_field_list +); + +#keyset[id, index] +tuple_field_list_fields( + int id: @tuple_field_list ref, + int index: int ref, + int field: @tuple_field ref +); + +tuple_pats( + unique int id: @tuple_pat +); + +#keyset[id, index] +tuple_pat_fields( + int id: @tuple_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_struct_pats( + unique int id: @tuple_struct_pat +); + +#keyset[id, index] +tuple_struct_pat_fields( + int id: @tuple_struct_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_type_reprs( + unique int id: @tuple_type_repr +); + +#keyset[id, index] +tuple_type_repr_fields( + int id: @tuple_type_repr ref, + int index: int ref, + int field: @type_repr ref +); + +type_args( + unique int id: @type_arg +); + +#keyset[id] +type_arg_type_reprs( + int id: @type_arg ref, + int type_repr: @type_repr ref +); + +type_params( + unique int id: @type_param +); + +#keyset[id, index] +type_param_attrs( + int id: @type_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_param_default_types( + int id: @type_param ref, + int default_type: @type_repr ref +); + +#keyset[id] +type_param_names( + int id: @type_param ref, + int name: @name ref +); + +#keyset[id] +type_param_type_bound_lists( + int id: @type_param ref, + int type_bound_list: @type_bound_list ref +); + +underscore_exprs( + unique int id: @underscore_expr +); + +#keyset[id, index] +underscore_expr_attrs( + int id: @underscore_expr ref, + int index: int ref, + int attr: @attr ref +); + +unsafe_meta( + unique int id: @unsafe_meta +); + +#keyset[id] +unsafe_meta_is_unsafe( + int id: @unsafe_meta ref +); + +#keyset[id] +unsafe_meta_meta( + int id: @unsafe_meta ref, + int meta: @meta ref +); + +variants( + unique int id: @variant +); + +#keyset[id, index] +variant_attrs( + int id: @variant ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +variant_const_args( + int id: @variant ref, + int const_arg: @const_arg ref +); + +#keyset[id] +variant_field_lists( + int id: @variant ref, + int field_list: @field_list ref +); + +#keyset[id] +variant_names( + int id: @variant ref, + int name: @name ref +); + +#keyset[id] +variant_visibilities( + int id: @variant ref, + int visibility: @visibility ref +); + +wildcard_pats( + unique int id: @wildcard_pat +); + +yeet_exprs( + unique int id: @yeet_expr +); + +#keyset[id, index] +yeet_expr_attrs( + int id: @yeet_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yeet_expr_exprs( + int id: @yeet_expr ref, + int expr: @expr ref +); + +yield_exprs( + unique int id: @yield_expr +); + +#keyset[id, index] +yield_expr_attrs( + int id: @yield_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yield_expr_exprs( + int id: @yield_expr ref, + int expr: @expr ref +); + +asm_exprs( + unique int id: @asm_expr +); + +#keyset[id, index] +asm_expr_asm_pieces( + int id: @asm_expr ref, + int index: int ref, + int asm_piece: @asm_piece ref +); + +#keyset[id, index] +asm_expr_attrs( + int id: @asm_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +asm_expr_templates( + int id: @asm_expr ref, + int index: int ref, + int template: @expr ref +); + +@assoc_item = + @const +| @function +| @macro_call +| @type_alias +; + +block_exprs( + unique int id: @block_expr +); + +#keyset[id, index] +block_expr_attrs( + int id: @block_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +block_expr_is_async( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_const( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_gen( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_move( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_unsafe( + int id: @block_expr ref +); + +#keyset[id] +block_expr_stmt_lists( + int id: @block_expr ref, + int stmt_list: @stmt_list ref +); + +#keyset[id] +block_expr_try_block_modifiers( + int id: @block_expr ref, + int try_block_modifier: @try_block_modifier ref +); + +extern_blocks( + unique int id: @extern_block +); + +#keyset[id] +extern_block_abis( + int id: @extern_block ref, + int abi: @abi ref +); + +#keyset[id, index] +extern_block_attrs( + int id: @extern_block ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_block_extern_item_lists( + int id: @extern_block ref, + int extern_item_list: @extern_item_list ref +); + +#keyset[id] +extern_block_is_unsafe( + int id: @extern_block ref +); + +extern_crates( + unique int id: @extern_crate +); + +#keyset[id, index] +extern_crate_attrs( + int id: @extern_crate ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_crate_identifiers( + int id: @extern_crate ref, + int identifier: @name_ref ref +); + +#keyset[id] +extern_crate_renames( + int id: @extern_crate ref, + int rename: @rename ref +); + +#keyset[id] +extern_crate_visibilities( + int id: @extern_crate ref, + int visibility: @visibility ref +); + +@extern_item = + @function +| @macro_call +| @static +| @type_alias +; + +impls( + unique int id: @impl +); + +#keyset[id] +impl_assoc_item_lists( + int id: @impl ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +impl_attrs( + int id: @impl ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +impl_generic_param_lists( + int id: @impl ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +impl_is_const( + int id: @impl ref +); + +#keyset[id] +impl_is_default( + int id: @impl ref +); + +#keyset[id] +impl_is_unsafe( + int id: @impl ref +); + +#keyset[id] +impl_self_ties( + int id: @impl ref, + int self_ty: @type_repr ref +); + +#keyset[id] +impl_trait_ties( + int id: @impl ref, + int trait_ty: @type_repr ref +); + +#keyset[id] +impl_visibilities( + int id: @impl ref, + int visibility: @visibility ref +); + +#keyset[id] +impl_where_clauses( + int id: @impl ref, + int where_clause: @where_clause ref +); + +@looping_expr = + @for_expr +| @loop_expr +| @while_expr +; + +#keyset[id] +looping_expr_loop_bodies( + int id: @looping_expr ref, + int loop_body: @block_expr ref +); + +macro_defs( + unique int id: @macro_def +); + +#keyset[id] +macro_def_args( + int id: @macro_def ref, + int args: @token_tree ref +); + +#keyset[id, index] +macro_def_attrs( + int id: @macro_def ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_def_bodies( + int id: @macro_def ref, + int body: @token_tree ref +); + +#keyset[id] +macro_def_names( + int id: @macro_def ref, + int name: @name ref +); + +#keyset[id] +macro_def_visibilities( + int id: @macro_def ref, + int visibility: @visibility ref +); + +macro_rules( + unique int id: @macro_rules +); + +#keyset[id, index] +macro_rules_attrs( + int id: @macro_rules ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_rules_names( + int id: @macro_rules ref, + int name: @name ref +); + +#keyset[id] +macro_rules_token_trees( + int id: @macro_rules ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_rules_visibilities( + int id: @macro_rules ref, + int visibility: @visibility ref +); + +modules( + unique int id: @module +); + +#keyset[id, index] +module_attrs( + int id: @module ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +module_item_lists( + int id: @module ref, + int item_list: @item_list ref +); + +#keyset[id] +module_names( + int id: @module ref, + int name: @name ref +); + +#keyset[id] +module_visibilities( + int id: @module ref, + int visibility: @visibility ref +); + +path_exprs( + unique int id: @path_expr +); + +#keyset[id, index] +path_expr_attrs( + int id: @path_expr ref, + int index: int ref, + int attr: @attr ref +); + +traits( + unique int id: @trait +); + +#keyset[id] +trait_assoc_item_lists( + int id: @trait ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +trait_attrs( + int id: @trait ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_generic_param_lists( + int id: @trait ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_is_auto( + int id: @trait ref +); + +#keyset[id] +trait_is_unsafe( + int id: @trait ref +); + +#keyset[id] +trait_names( + int id: @trait ref, + int name: @name ref +); + +#keyset[id] +trait_type_bound_lists( + int id: @trait ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_visibilities( + int id: @trait ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_where_clauses( + int id: @trait ref, + int where_clause: @where_clause ref +); + +@type_item = + @enum +| @struct +| @union +; + +#keyset[id, index] +type_item_derive_macro_expansions( + int id: @type_item ref, + int index: int ref, + int derive_macro_expansion: @macro_items ref +); + +#keyset[id, index] +type_item_attrs( + int id: @type_item ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_item_generic_param_lists( + int id: @type_item ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_item_names( + int id: @type_item ref, + int name: @name ref +); + +#keyset[id] +type_item_visibilities( + int id: @type_item ref, + int visibility: @visibility ref +); + +#keyset[id] +type_item_where_clauses( + int id: @type_item ref, + int where_clause: @where_clause ref +); + +uses( + unique int id: @use +); + +#keyset[id, index] +use_attrs( + int id: @use ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +use_use_trees( + int id: @use ref, + int use_tree: @use_tree ref +); + +#keyset[id] +use_visibilities( + int id: @use ref, + int visibility: @visibility ref +); + +consts( + unique int id: @const +); + +#keyset[id, index] +const_attrs( + int id: @const ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_bodies( + int id: @const ref, + int body: @expr ref +); + +#keyset[id] +const_generic_param_lists( + int id: @const ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +const_is_const( + int id: @const ref +); + +#keyset[id] +const_is_default( + int id: @const ref +); + +#keyset[id] +const_names( + int id: @const ref, + int name: @name ref +); + +#keyset[id] +const_type_reprs( + int id: @const ref, + int type_repr: @type_repr ref +); + +#keyset[id] +const_visibilities( + int id: @const ref, + int visibility: @visibility ref +); + +#keyset[id] +const_where_clauses( + int id: @const ref, + int where_clause: @where_clause ref +); + +#keyset[id] +const_has_implementation( + int id: @const ref +); + +enums( + unique int id: @enum +); + +#keyset[id] +enum_variant_lists( + int id: @enum ref, + int variant_list: @variant_list ref +); + +for_exprs( + unique int id: @for_expr +); + +#keyset[id, index] +for_expr_attrs( + int id: @for_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +for_expr_iterables( + int id: @for_expr ref, + int iterable: @expr ref +); + +#keyset[id] +for_expr_pats( + int id: @for_expr ref, + int pat: @pat ref +); + +functions( + unique int id: @function +); + +#keyset[id] +function_abis( + int id: @function ref, + int abi: @abi ref +); + +#keyset[id] +function_function_bodies( + int id: @function ref, + int function_body: @block_expr ref +); + +#keyset[id] +function_generic_param_lists( + int id: @function ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +function_is_async( + int id: @function ref +); + +#keyset[id] +function_is_const( + int id: @function ref +); + +#keyset[id] +function_is_default( + int id: @function ref +); + +#keyset[id] +function_is_gen( + int id: @function ref +); + +#keyset[id] +function_is_unsafe( + int id: @function ref +); + +#keyset[id] +function_names( + int id: @function ref, + int name: @name ref +); + +#keyset[id] +function_ret_types( + int id: @function ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +function_visibilities( + int id: @function ref, + int visibility: @visibility ref +); + +#keyset[id] +function_where_clauses( + int id: @function ref, + int where_clause: @where_clause ref +); + +#keyset[id] +function_has_implementation( + int id: @function ref +); + +loop_exprs( + unique int id: @loop_expr +); + +#keyset[id, index] +loop_expr_attrs( + int id: @loop_expr ref, + int index: int ref, + int attr: @attr ref +); + +macro_calls( + unique int id: @macro_call +); + +#keyset[id, index] +macro_call_attrs( + int id: @macro_call ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_call_paths( + int id: @macro_call ref, + int path: @path ref +); + +#keyset[id] +macro_call_token_trees( + int id: @macro_call ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_call_macro_call_expansions( + int id: @macro_call ref, + int macro_call_expansion: @ast_node ref +); + +statics( + unique int id: @static +); + +#keyset[id, index] +static_attrs( + int id: @static ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +static_bodies( + int id: @static ref, + int body: @expr ref +); + +#keyset[id] +static_is_mut( + int id: @static ref +); + +#keyset[id] +static_is_static( + int id: @static ref +); + +#keyset[id] +static_is_unsafe( + int id: @static ref +); + +#keyset[id] +static_names( + int id: @static ref, + int name: @name ref +); + +#keyset[id] +static_type_reprs( + int id: @static ref, + int type_repr: @type_repr ref +); + +#keyset[id] +static_visibilities( + int id: @static ref, + int visibility: @visibility ref +); + +structs( + unique int id: @struct +); + +#keyset[id] +struct_field_lists_( + int id: @struct ref, + int field_list: @field_list ref +); + +type_aliases( + unique int id: @type_alias +); + +#keyset[id, index] +type_alias_attrs( + int id: @type_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_alias_generic_param_lists( + int id: @type_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_alias_is_default( + int id: @type_alias ref +); + +#keyset[id] +type_alias_names( + int id: @type_alias ref, + int name: @name ref +); + +#keyset[id] +type_alias_type_reprs( + int id: @type_alias ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_alias_type_bound_lists( + int id: @type_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +type_alias_visibilities( + int id: @type_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +type_alias_where_clauses( + int id: @type_alias ref, + int where_clause: @where_clause ref +); + +unions( + unique int id: @union +); + +#keyset[id] +union_struct_field_lists( + int id: @union ref, + int struct_field_list: @struct_field_list ref +); + +while_exprs( + unique int id: @while_expr +); + +#keyset[id, index] +while_expr_attrs( + int id: @while_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +while_expr_conditions( + int id: @while_expr ref, + int condition: @expr ref +); diff --git a/rust/ql/lib/upgrades/ed6b1d3d51401eafee5e4b24e1093d731309ac94/rust.dbscheme b/rust/ql/lib/upgrades/ed6b1d3d51401eafee5e4b24e1093d731309ac94/rust.dbscheme new file mode 100644 index 000000000000..852696f20117 --- /dev/null +++ b/rust/ql/lib/upgrades/ed6b1d3d51401eafee5e4b24e1093d731309ac94/rust.dbscheme @@ -0,0 +1,3737 @@ +// generated by codegen, do not edit + +// from ../shared/tree-sitter-extractor/src/generator/prefix.dbscheme +/*- Files and folders -*/ + +/** + * The location of an element. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @file | @folder + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +/*- Empty location -*/ + +empty_location( + int location: @location_default ref +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/*- Diagnostic messages -*/ + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/*- Diagnostic messages: severity -*/ + +case @diagnostic.severity of + 10 = @diagnostic_debug +| 20 = @diagnostic_info +| 30 = @diagnostic_warning +| 40 = @diagnostic_error +; + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_comments (unique int id: @yaml_comment, + string text: string ref, + string tostring: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error | @yaml_comment; + +/*- Database metadata -*/ + +/** + * The CLI will automatically emit applicable tuples for this table, + * such as `databaseMetadata("isOverlay", "true")` when building an + * overlay database. + */ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +/*- Overlay support -*/ + +/** + * The CLI will automatically emit tuples for each new/modified/deleted file + * when building an overlay database. + */ +overlayChangedFiles( + string path: string ref +); + + +// from prefix.dbscheme +#keyset[id] +locatable_locations( + int id: @locatable ref, + int location: @location_default ref +); + + +// from schema + +@element = + @extractor_step +| @locatable +| @named_crate +| @unextracted +; + +extractor_steps( + unique int id: @extractor_step, + string action: string ref, + int duration_ms: int ref +); + +#keyset[id] +extractor_step_files( + int id: @extractor_step ref, + int file: @file ref +); + +@locatable = + @ast_node +| @crate +; + +named_crates( + unique int id: @named_crate, + string name: string ref, + int crate: @crate ref +); + +@unextracted = + @missing +| @unimplemented +; + +@ast_node = + @abi +| @addressable +| @arg_list +| @asm_dir_spec +| @asm_operand +| @asm_operand_expr +| @asm_option +| @asm_piece +| @asm_reg_spec +| @assoc_item_list +| @attr +| @callable +| @cfg_predicate +| @expr +| @extern_item_list +| @field_list +| @for_binder +| @format_args_arg +| @generic_arg +| @generic_arg_list +| @generic_param +| @generic_param_list +| @impl_restriction +| @item_list +| @label +| @let_else +| @macro_items +| @match_arm +| @match_arm_list +| @match_guard +| @meta +| @mut_restriction +| @name +| @param_base +| @param_list +| @parenthesized_arg_list +| @pat +| @path +| @path_ast_node +| @path_segment +| @rename +| @ret_type_repr +| @return_type_syntax +| @source_file +| @stmt +| @stmt_list +| @struct_expr_field +| @struct_expr_field_list +| @struct_field +| @struct_pat_field +| @struct_pat_field_list +| @token +| @token_tree +| @try_block_modifier +| @tuple_field +| @type_bound +| @type_bound_list +| @type_repr +| @use_bound_generic_arg +| @use_bound_generic_args +| @use_tree +| @use_tree_list +| @variant_list +| @visibility +| @visibility_inner +| @where_clause +| @where_pred +; + +crates( + unique int id: @crate +); + +#keyset[id] +crate_names( + int id: @crate ref, + string name: string ref +); + +#keyset[id] +crate_versions( + int id: @crate ref, + string version: string ref +); + +#keyset[id, index] +crate_cfg_options( + int id: @crate ref, + int index: int ref, + string cfg_option: string ref +); + +#keyset[id, index] +crate_named_dependencies( + int id: @crate ref, + int index: int ref, + int named_dependency: @named_crate ref +); + +missings( + unique int id: @missing +); + +unimplementeds( + unique int id: @unimplemented +); + +abis( + unique int id: @abi +); + +#keyset[id] +abi_abi_strings( + int id: @abi ref, + string abi_string: string ref +); + +@addressable = + @item +| @variant +; + +arg_lists( + unique int id: @arg_list +); + +#keyset[id, index] +arg_list_args( + int id: @arg_list ref, + int index: int ref, + int arg: @expr ref +); + +asm_dir_specs( + unique int id: @asm_dir_spec +); + +@asm_operand = + @asm_const +| @asm_label +| @asm_reg_operand +| @asm_sym +; + +asm_operand_exprs( + unique int id: @asm_operand_expr +); + +#keyset[id] +asm_operand_expr_in_exprs( + int id: @asm_operand_expr ref, + int in_expr: @expr ref +); + +#keyset[id] +asm_operand_expr_out_exprs( + int id: @asm_operand_expr ref, + int out_expr: @expr ref +); + +asm_options( + unique int id: @asm_option +); + +#keyset[id] +asm_option_is_raw( + int id: @asm_option ref +); + +@asm_piece = + @asm_clobber_abi +| @asm_operand_named +| @asm_options_list +; + +asm_reg_specs( + unique int id: @asm_reg_spec +); + +#keyset[id] +asm_reg_spec_identifiers( + int id: @asm_reg_spec ref, + int identifier: @name_ref ref +); + +assoc_item_lists( + unique int id: @assoc_item_list +); + +#keyset[id, index] +assoc_item_list_assoc_items( + int id: @assoc_item_list ref, + int index: int ref, + int assoc_item: @assoc_item ref +); + +#keyset[id, index] +assoc_item_list_attrs( + int id: @assoc_item_list ref, + int index: int ref, + int attr: @attr ref +); + +attrs( + unique int id: @attr +); + +#keyset[id] +attr_meta( + int id: @attr ref, + int meta: @meta ref +); + +@callable = + @closure_expr +| @function +; + +#keyset[id] +callable_param_lists( + int id: @callable ref, + int param_list: @param_list ref +); + +#keyset[id, index] +callable_attrs( + int id: @callable ref, + int index: int ref, + int attr: @attr ref +); + +@cfg_predicate = + @cfg_atom +| @cfg_composite +; + +@expr = + @array_expr_internal +| @asm_expr +| @await_expr +| @become_expr +| @binary_expr +| @break_expr +| @call_expr +| @cast_expr +| @closure_expr +| @continue_expr +| @field_expr +| @format_args_expr +| @if_expr +| @include_bytes_expr +| @index_expr +| @labelable_expr +| @let_expr +| @literal_expr +| @macro_expr +| @match_expr +| @method_call_expr +| @offset_of_expr +| @paren_expr +| @path_expr_base +| @prefix_expr +| @range_expr +| @ref_expr +| @return_expr +| @struct_expr +| @try_expr +| @tuple_expr +| @underscore_expr +| @yeet_expr +| @yield_expr +; + +extern_item_lists( + unique int id: @extern_item_list +); + +#keyset[id, index] +extern_item_list_attrs( + int id: @extern_item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +extern_item_list_extern_items( + int id: @extern_item_list ref, + int index: int ref, + int extern_item: @extern_item ref +); + +@field_list = + @struct_field_list +| @tuple_field_list +; + +for_binders( + unique int id: @for_binder +); + +#keyset[id] +for_binder_generic_param_lists( + int id: @for_binder ref, + int generic_param_list: @generic_param_list ref +); + +format_args_args( + unique int id: @format_args_arg +); + +#keyset[id] +format_args_arg_exprs( + int id: @format_args_arg ref, + int expr: @expr ref +); + +#keyset[id] +format_args_arg_names( + int id: @format_args_arg ref, + int name: @name ref +); + +@generic_arg = + @assoc_type_arg +| @const_arg +| @lifetime_arg +| @type_arg +; + +generic_arg_lists( + unique int id: @generic_arg_list +); + +#keyset[id, index] +generic_arg_list_generic_args( + int id: @generic_arg_list ref, + int index: int ref, + int generic_arg: @generic_arg ref +); + +@generic_param = + @const_param +| @lifetime_param +| @type_param +; + +generic_param_lists( + unique int id: @generic_param_list +); + +#keyset[id, index] +generic_param_list_generic_params( + int id: @generic_param_list ref, + int index: int ref, + int generic_param: @generic_param ref +); + +impl_restrictions( + unique int id: @impl_restriction +); + +#keyset[id] +impl_restriction_visibility_inners( + int id: @impl_restriction ref, + int visibility_inner: @visibility_inner ref +); + +item_lists( + unique int id: @item_list +); + +#keyset[id, index] +item_list_attrs( + int id: @item_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +item_list_items( + int id: @item_list ref, + int index: int ref, + int item: @item ref +); + +labels( + unique int id: @label +); + +#keyset[id] +label_lifetimes( + int id: @label ref, + int lifetime: @lifetime ref +); + +let_elses( + unique int id: @let_else +); + +#keyset[id] +let_else_block_exprs( + int id: @let_else ref, + int block_expr: @block_expr ref +); + +macro_items( + unique int id: @macro_items +); + +#keyset[id, index] +macro_items_items( + int id: @macro_items ref, + int index: int ref, + int item: @item ref +); + +match_arms( + unique int id: @match_arm +); + +#keyset[id, index] +match_arm_attrs( + int id: @match_arm ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_arm_exprs( + int id: @match_arm ref, + int expr: @expr ref +); + +#keyset[id] +match_arm_guards( + int id: @match_arm ref, + int guard: @match_guard ref +); + +#keyset[id] +match_arm_pats( + int id: @match_arm ref, + int pat: @pat ref +); + +match_arm_lists( + unique int id: @match_arm_list +); + +#keyset[id, index] +match_arm_list_arms( + int id: @match_arm_list ref, + int index: int ref, + int arm: @match_arm ref +); + +#keyset[id, index] +match_arm_list_attrs( + int id: @match_arm_list ref, + int index: int ref, + int attr: @attr ref +); + +match_guards( + unique int id: @match_guard +); + +#keyset[id] +match_guard_conditions( + int id: @match_guard ref, + int condition: @expr ref +); + +@meta = + @cfg_attr_meta +| @cfg_meta +| @key_value_meta +| @path_meta +| @token_tree_meta +| @unsafe_meta +; + +mut_restrictions( + unique int id: @mut_restriction +); + +#keyset[id] +mut_restriction_is_mut( + int id: @mut_restriction ref +); + +#keyset[id] +mut_restriction_visibility_inners( + int id: @mut_restriction ref, + int visibility_inner: @visibility_inner ref +); + +names( + unique int id: @name +); + +#keyset[id] +name_texts( + int id: @name ref, + string text: string ref +); + +@param_base = + @param +| @self_param +; + +#keyset[id, index] +param_base_attrs( + int id: @param_base ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +param_base_type_reprs( + int id: @param_base ref, + int type_repr: @type_repr ref +); + +param_lists( + unique int id: @param_list +); + +#keyset[id, index] +param_list_params( + int id: @param_list ref, + int index: int ref, + int param: @param ref +); + +#keyset[id] +param_list_self_params( + int id: @param_list ref, + int self_param: @self_param ref +); + +parenthesized_arg_lists( + unique int id: @parenthesized_arg_list +); + +#keyset[id, index] +parenthesized_arg_list_type_args( + int id: @parenthesized_arg_list ref, + int index: int ref, + int type_arg: @type_arg ref +); + +@pat = + @box_pat +| @const_block_pat +| @deref_pat +| @ident_pat +| @literal_pat +| @macro_pat +| @not_null +| @or_pat +| @paren_pat +| @path_pat +| @range_pat +| @ref_pat +| @rest_pat +| @slice_pat +| @struct_pat +| @tuple_pat +| @tuple_struct_pat +| @wildcard_pat +; + +paths( + unique int id: @path +); + +#keyset[id] +path_qualifiers( + int id: @path ref, + int qualifier: @path ref +); + +#keyset[id] +path_segments_( + int id: @path ref, + int segment: @path_segment ref +); + +@path_ast_node = + @path_expr +| @path_pat +| @struct_expr +| @struct_pat +| @tuple_struct_pat +; + +#keyset[id] +path_ast_node_paths( + int id: @path_ast_node ref, + int path: @path ref +); + +path_segments( + unique int id: @path_segment +); + +#keyset[id] +path_segment_generic_arg_lists( + int id: @path_segment ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +path_segment_identifiers( + int id: @path_segment ref, + int identifier: @name_ref ref +); + +#keyset[id] +path_segment_parenthesized_arg_lists( + int id: @path_segment ref, + int parenthesized_arg_list: @parenthesized_arg_list ref +); + +#keyset[id] +path_segment_ret_types( + int id: @path_segment ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +path_segment_return_type_syntaxes( + int id: @path_segment ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +path_segment_type_reprs( + int id: @path_segment ref, + int type_repr: @type_repr ref +); + +#keyset[id] +path_segment_trait_type_reprs( + int id: @path_segment ref, + int trait_type_repr: @path_type_repr ref +); + +renames( + unique int id: @rename +); + +#keyset[id] +rename_names( + int id: @rename ref, + int name: @name ref +); + +ret_type_reprs( + unique int id: @ret_type_repr +); + +#keyset[id] +ret_type_repr_type_reprs( + int id: @ret_type_repr ref, + int type_repr: @type_repr ref +); + +return_type_syntaxes( + unique int id: @return_type_syntax +); + +source_files( + unique int id: @source_file +); + +#keyset[id, index] +source_file_attrs( + int id: @source_file ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +source_file_items( + int id: @source_file ref, + int index: int ref, + int item: @item ref +); + +@stmt = + @expr_stmt +| @item +| @let_stmt +; + +stmt_lists( + unique int id: @stmt_list +); + +#keyset[id, index] +stmt_list_attrs( + int id: @stmt_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +stmt_list_statements( + int id: @stmt_list ref, + int index: int ref, + int statement: @stmt ref +); + +#keyset[id] +stmt_list_tail_exprs( + int id: @stmt_list ref, + int tail_expr: @expr ref +); + +struct_expr_fields( + unique int id: @struct_expr_field +); + +#keyset[id, index] +struct_expr_field_attrs( + int id: @struct_expr_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_expr_field_exprs( + int id: @struct_expr_field ref, + int expr: @expr ref +); + +#keyset[id] +struct_expr_field_identifiers( + int id: @struct_expr_field ref, + int identifier: @name_ref ref +); + +struct_expr_field_lists( + unique int id: @struct_expr_field_list +); + +#keyset[id, index] +struct_expr_field_list_attrs( + int id: @struct_expr_field_list ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +struct_expr_field_list_fields( + int id: @struct_expr_field_list ref, + int index: int ref, + int field: @struct_expr_field ref +); + +#keyset[id] +struct_expr_field_list_spreads( + int id: @struct_expr_field_list ref, + int spread: @expr ref +); + +struct_fields( + unique int id: @struct_field +); + +#keyset[id, index] +struct_field_attrs( + int id: @struct_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_field_default_vals( + int id: @struct_field ref, + int default_val: @const_arg ref +); + +#keyset[id] +struct_field_is_unsafe( + int id: @struct_field ref +); + +#keyset[id] +struct_field_mut_restrictions( + int id: @struct_field ref, + int mut_restriction: @mut_restriction ref +); + +#keyset[id] +struct_field_names( + int id: @struct_field ref, + int name: @name ref +); + +#keyset[id] +struct_field_type_reprs( + int id: @struct_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +struct_field_visibilities( + int id: @struct_field ref, + int visibility: @visibility ref +); + +struct_pat_fields( + unique int id: @struct_pat_field +); + +#keyset[id, index] +struct_pat_field_attrs( + int id: @struct_pat_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +struct_pat_field_identifiers( + int id: @struct_pat_field ref, + int identifier: @name_ref ref +); + +#keyset[id] +struct_pat_field_pats( + int id: @struct_pat_field ref, + int pat: @pat ref +); + +struct_pat_field_lists( + unique int id: @struct_pat_field_list +); + +#keyset[id, index] +struct_pat_field_list_fields( + int id: @struct_pat_field_list ref, + int index: int ref, + int field: @struct_pat_field ref +); + +#keyset[id] +struct_pat_field_list_rest_pats( + int id: @struct_pat_field_list ref, + int rest_pat: @rest_pat ref +); + +@token = + @comment +; + +token_trees( + unique int id: @token_tree +); + +try_block_modifiers( + unique int id: @try_block_modifier +); + +#keyset[id] +try_block_modifier_is_try( + int id: @try_block_modifier ref +); + +#keyset[id] +try_block_modifier_type_reprs( + int id: @try_block_modifier ref, + int type_repr: @type_repr ref +); + +tuple_fields( + unique int id: @tuple_field +); + +#keyset[id, index] +tuple_field_attrs( + int id: @tuple_field ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +tuple_field_mut_restrictions( + int id: @tuple_field ref, + int mut_restriction: @mut_restriction ref +); + +#keyset[id] +tuple_field_type_reprs( + int id: @tuple_field ref, + int type_repr: @type_repr ref +); + +#keyset[id] +tuple_field_visibilities( + int id: @tuple_field ref, + int visibility: @visibility ref +); + +type_bounds( + unique int id: @type_bound +); + +#keyset[id] +type_bound_for_binders( + int id: @type_bound ref, + int for_binder: @for_binder ref +); + +#keyset[id] +type_bound_is_async( + int id: @type_bound ref +); + +#keyset[id] +type_bound_is_const( + int id: @type_bound ref +); + +#keyset[id] +type_bound_lifetimes( + int id: @type_bound ref, + int lifetime: @lifetime ref +); + +#keyset[id] +type_bound_type_reprs( + int id: @type_bound ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_bound_use_bound_generic_args( + int id: @type_bound ref, + int use_bound_generic_args: @use_bound_generic_args ref +); + +type_bound_lists( + unique int id: @type_bound_list +); + +#keyset[id, index] +type_bound_list_bounds( + int id: @type_bound_list ref, + int index: int ref, + int bound: @type_bound ref +); + +@type_repr = + @array_type_repr +| @dyn_trait_type_repr +| @fn_ptr_type_repr +| @for_type_repr +| @impl_trait_type_repr +| @infer_type_repr +| @macro_type_repr +| @never_type_repr +| @paren_type_repr +| @path_type_repr +| @pattern_type_repr +| @ptr_type_repr +| @ref_type_repr +| @slice_type_repr +| @tuple_type_repr +; + +@use_bound_generic_arg = + @lifetime +| @name_ref +; + +use_bound_generic_args( + unique int id: @use_bound_generic_args +); + +#keyset[id, index] +use_bound_generic_args_use_bound_generic_args( + int id: @use_bound_generic_args ref, + int index: int ref, + int use_bound_generic_arg: @use_bound_generic_arg ref +); + +use_trees( + unique int id: @use_tree +); + +#keyset[id] +use_tree_is_glob( + int id: @use_tree ref +); + +#keyset[id] +use_tree_paths( + int id: @use_tree ref, + int path: @path ref +); + +#keyset[id] +use_tree_renames( + int id: @use_tree ref, + int rename: @rename ref +); + +#keyset[id] +use_tree_use_tree_lists( + int id: @use_tree ref, + int use_tree_list: @use_tree_list ref +); + +use_tree_lists( + unique int id: @use_tree_list +); + +#keyset[id, index] +use_tree_list_use_trees( + int id: @use_tree_list ref, + int index: int ref, + int use_tree: @use_tree ref +); + +variant_lists( + unique int id: @variant_list +); + +#keyset[id, index] +variant_list_variants( + int id: @variant_list ref, + int index: int ref, + int variant: @variant ref +); + +visibilities( + unique int id: @visibility +); + +#keyset[id] +visibility_visibility_inners( + int id: @visibility ref, + int visibility_inner: @visibility_inner ref +); + +visibility_inners( + unique int id: @visibility_inner +); + +#keyset[id] +visibility_inner_paths( + int id: @visibility_inner ref, + int path: @path ref +); + +where_clauses( + unique int id: @where_clause +); + +#keyset[id, index] +where_clause_predicates( + int id: @where_clause ref, + int index: int ref, + int predicate: @where_pred ref +); + +where_preds( + unique int id: @where_pred +); + +#keyset[id] +where_pred_for_binders( + int id: @where_pred ref, + int for_binder: @for_binder ref +); + +#keyset[id] +where_pred_lifetimes( + int id: @where_pred ref, + int lifetime: @lifetime ref +); + +#keyset[id] +where_pred_type_reprs( + int id: @where_pred ref, + int type_repr: @type_repr ref +); + +#keyset[id] +where_pred_type_bound_lists( + int id: @where_pred ref, + int type_bound_list: @type_bound_list ref +); + +array_expr_internals( + unique int id: @array_expr_internal +); + +#keyset[id, index] +array_expr_internal_attrs( + int id: @array_expr_internal ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +array_expr_internal_exprs( + int id: @array_expr_internal ref, + int index: int ref, + int expr: @expr ref +); + +#keyset[id] +array_expr_internal_is_semicolon( + int id: @array_expr_internal ref +); + +array_type_reprs( + unique int id: @array_type_repr +); + +#keyset[id] +array_type_repr_const_args( + int id: @array_type_repr ref, + int const_arg: @const_arg ref +); + +#keyset[id] +array_type_repr_element_type_reprs( + int id: @array_type_repr ref, + int element_type_repr: @type_repr ref +); + +asm_clobber_abis( + unique int id: @asm_clobber_abi +); + +#keyset[id, index] +asm_clobber_abi_attrs( + int id: @asm_clobber_abi ref, + int index: int ref, + int attr: @attr ref +); + +asm_consts( + unique int id: @asm_const +); + +#keyset[id] +asm_const_exprs( + int id: @asm_const ref, + int expr: @expr ref +); + +#keyset[id] +asm_const_is_const( + int id: @asm_const ref +); + +asm_labels( + unique int id: @asm_label +); + +#keyset[id] +asm_label_block_exprs( + int id: @asm_label ref, + int block_expr: @block_expr ref +); + +asm_operand_nameds( + unique int id: @asm_operand_named +); + +#keyset[id] +asm_operand_named_asm_operands( + int id: @asm_operand_named ref, + int asm_operand: @asm_operand ref +); + +#keyset[id, index] +asm_operand_named_attrs( + int id: @asm_operand_named ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +asm_operand_named_names( + int id: @asm_operand_named ref, + int name: @name ref +); + +asm_options_lists( + unique int id: @asm_options_list +); + +#keyset[id, index] +asm_options_list_asm_options( + int id: @asm_options_list ref, + int index: int ref, + int asm_option: @asm_option ref +); + +#keyset[id, index] +asm_options_list_attrs( + int id: @asm_options_list ref, + int index: int ref, + int attr: @attr ref +); + +asm_reg_operands( + unique int id: @asm_reg_operand +); + +#keyset[id] +asm_reg_operand_asm_dir_specs( + int id: @asm_reg_operand ref, + int asm_dir_spec: @asm_dir_spec ref +); + +#keyset[id] +asm_reg_operand_asm_operand_exprs( + int id: @asm_reg_operand ref, + int asm_operand_expr: @asm_operand_expr ref +); + +#keyset[id] +asm_reg_operand_asm_reg_specs( + int id: @asm_reg_operand ref, + int asm_reg_spec: @asm_reg_spec ref +); + +asm_syms( + unique int id: @asm_sym +); + +#keyset[id] +asm_sym_paths( + int id: @asm_sym ref, + int path: @path ref +); + +assoc_type_args( + unique int id: @assoc_type_arg +); + +#keyset[id] +assoc_type_arg_const_args( + int id: @assoc_type_arg ref, + int const_arg: @const_arg ref +); + +#keyset[id] +assoc_type_arg_generic_arg_lists( + int id: @assoc_type_arg ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +assoc_type_arg_identifiers( + int id: @assoc_type_arg ref, + int identifier: @name_ref ref +); + +#keyset[id] +assoc_type_arg_param_lists( + int id: @assoc_type_arg ref, + int param_list: @param_list ref +); + +#keyset[id] +assoc_type_arg_ret_types( + int id: @assoc_type_arg ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +assoc_type_arg_return_type_syntaxes( + int id: @assoc_type_arg ref, + int return_type_syntax: @return_type_syntax ref +); + +#keyset[id] +assoc_type_arg_type_reprs( + int id: @assoc_type_arg ref, + int type_repr: @type_repr ref +); + +#keyset[id] +assoc_type_arg_type_bound_lists( + int id: @assoc_type_arg ref, + int type_bound_list: @type_bound_list ref +); + +await_exprs( + unique int id: @await_expr +); + +#keyset[id, index] +await_expr_attrs( + int id: @await_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +await_expr_exprs( + int id: @await_expr ref, + int expr: @expr ref +); + +become_exprs( + unique int id: @become_expr +); + +#keyset[id, index] +become_expr_attrs( + int id: @become_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +become_expr_exprs( + int id: @become_expr ref, + int expr: @expr ref +); + +binary_exprs( + unique int id: @binary_expr +); + +#keyset[id, index] +binary_expr_attrs( + int id: @binary_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +binary_expr_lhs( + int id: @binary_expr ref, + int lhs: @expr ref +); + +#keyset[id] +binary_expr_operator_names( + int id: @binary_expr ref, + string operator_name: string ref +); + +#keyset[id] +binary_expr_rhs( + int id: @binary_expr ref, + int rhs: @expr ref +); + +box_pats( + unique int id: @box_pat +); + +#keyset[id] +box_pat_pats( + int id: @box_pat ref, + int pat: @pat ref +); + +break_exprs( + unique int id: @break_expr +); + +#keyset[id, index] +break_expr_attrs( + int id: @break_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +break_expr_exprs( + int id: @break_expr ref, + int expr: @expr ref +); + +#keyset[id] +break_expr_lifetimes( + int id: @break_expr ref, + int lifetime: @lifetime ref +); + +call_exprs( + unique int id: @call_expr +); + +#keyset[id] +call_expr_arg_lists( + int id: @call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +call_expr_attrs( + int id: @call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +call_expr_functions( + int id: @call_expr ref, + int function: @expr ref +); + +cast_exprs( + unique int id: @cast_expr +); + +#keyset[id, index] +cast_expr_attrs( + int id: @cast_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +cast_expr_exprs( + int id: @cast_expr ref, + int expr: @expr ref +); + +#keyset[id] +cast_expr_type_reprs( + int id: @cast_expr ref, + int type_repr: @type_repr ref +); + +cfg_atoms( + unique int id: @cfg_atom +); + +cfg_attr_meta( + unique int id: @cfg_attr_meta +); + +#keyset[id] +cfg_attr_meta_cfg_predicates( + int id: @cfg_attr_meta ref, + int cfg_predicate: @cfg_predicate ref +); + +#keyset[id, index] +cfg_attr_meta_metas( + int id: @cfg_attr_meta ref, + int index: int ref, + int meta: @meta ref +); + +cfg_composites( + unique int id: @cfg_composite +); + +#keyset[id, index] +cfg_composite_cfg_predicates( + int id: @cfg_composite ref, + int index: int ref, + int cfg_predicate: @cfg_predicate ref +); + +cfg_meta( + unique int id: @cfg_meta +); + +#keyset[id] +cfg_meta_cfg_predicates( + int id: @cfg_meta ref, + int cfg_predicate: @cfg_predicate ref +); + +closure_exprs( + unique int id: @closure_expr +); + +#keyset[id] +closure_expr_closure_bodies( + int id: @closure_expr ref, + int closure_body: @expr ref +); + +#keyset[id] +closure_expr_for_binders( + int id: @closure_expr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +closure_expr_is_async( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_const( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_gen( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_move( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_is_static( + int id: @closure_expr ref +); + +#keyset[id] +closure_expr_ret_types( + int id: @closure_expr ref, + int ret_type: @ret_type_repr ref +); + +comments( + unique int id: @comment, + int parent: @ast_node ref, + string text: string ref +); + +const_args( + unique int id: @const_arg +); + +#keyset[id] +const_arg_exprs( + int id: @const_arg ref, + int expr: @expr ref +); + +const_block_pats( + unique int id: @const_block_pat +); + +#keyset[id] +const_block_pat_block_exprs( + int id: @const_block_pat ref, + int block_expr: @block_expr ref +); + +#keyset[id] +const_block_pat_is_const( + int id: @const_block_pat ref +); + +const_params( + unique int id: @const_param +); + +#keyset[id, index] +const_param_attrs( + int id: @const_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_param_default_vals( + int id: @const_param ref, + int default_val: @const_arg ref +); + +#keyset[id] +const_param_is_const( + int id: @const_param ref +); + +#keyset[id] +const_param_names( + int id: @const_param ref, + int name: @name ref +); + +#keyset[id] +const_param_type_reprs( + int id: @const_param ref, + int type_repr: @type_repr ref +); + +continue_exprs( + unique int id: @continue_expr +); + +#keyset[id, index] +continue_expr_attrs( + int id: @continue_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +continue_expr_lifetimes( + int id: @continue_expr ref, + int lifetime: @lifetime ref +); + +deref_pats( + unique int id: @deref_pat +); + +#keyset[id] +deref_pat_pats( + int id: @deref_pat ref, + int pat: @pat ref +); + +dyn_trait_type_reprs( + unique int id: @dyn_trait_type_repr +); + +#keyset[id] +dyn_trait_type_repr_type_bound_lists( + int id: @dyn_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +expr_stmts( + unique int id: @expr_stmt +); + +#keyset[id] +expr_stmt_exprs( + int id: @expr_stmt ref, + int expr: @expr ref +); + +field_exprs( + unique int id: @field_expr +); + +#keyset[id, index] +field_expr_attrs( + int id: @field_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +field_expr_containers( + int id: @field_expr ref, + int container: @expr ref +); + +#keyset[id] +field_expr_identifiers( + int id: @field_expr ref, + int identifier: @name_ref ref +); + +fn_ptr_type_reprs( + unique int id: @fn_ptr_type_repr +); + +#keyset[id] +fn_ptr_type_repr_abis( + int id: @fn_ptr_type_repr ref, + int abi: @abi ref +); + +#keyset[id] +fn_ptr_type_repr_is_async( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_const( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_is_unsafe( + int id: @fn_ptr_type_repr ref +); + +#keyset[id] +fn_ptr_type_repr_param_lists( + int id: @fn_ptr_type_repr ref, + int param_list: @param_list ref +); + +#keyset[id] +fn_ptr_type_repr_ret_types( + int id: @fn_ptr_type_repr ref, + int ret_type: @ret_type_repr ref +); + +for_type_reprs( + unique int id: @for_type_repr +); + +#keyset[id] +for_type_repr_for_binders( + int id: @for_type_repr ref, + int for_binder: @for_binder ref +); + +#keyset[id] +for_type_repr_type_reprs( + int id: @for_type_repr ref, + int type_repr: @type_repr ref +); + +format_args_exprs( + unique int id: @format_args_expr +); + +#keyset[id, index] +format_args_expr_args( + int id: @format_args_expr ref, + int index: int ref, + int arg: @format_args_arg ref +); + +#keyset[id, index] +format_args_expr_attrs( + int id: @format_args_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +format_args_expr_templates( + int id: @format_args_expr ref, + int template: @expr ref +); + +ident_pats( + unique int id: @ident_pat +); + +#keyset[id, index] +ident_pat_attrs( + int id: @ident_pat ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ident_pat_is_mut( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_is_ref( + int id: @ident_pat ref +); + +#keyset[id] +ident_pat_names( + int id: @ident_pat ref, + int name: @name ref +); + +#keyset[id] +ident_pat_pats( + int id: @ident_pat ref, + int pat: @pat ref +); + +if_exprs( + unique int id: @if_expr +); + +#keyset[id, index] +if_expr_attrs( + int id: @if_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +if_expr_conditions( + int id: @if_expr ref, + int condition: @expr ref +); + +#keyset[id] +if_expr_elses( + int id: @if_expr ref, + int else: @expr ref +); + +#keyset[id] +if_expr_thens( + int id: @if_expr ref, + int then: @block_expr ref +); + +impl_trait_type_reprs( + unique int id: @impl_trait_type_repr +); + +#keyset[id] +impl_trait_type_repr_type_bound_lists( + int id: @impl_trait_type_repr ref, + int type_bound_list: @type_bound_list ref +); + +include_bytes_exprs( + unique int id: @include_bytes_expr +); + +index_exprs( + unique int id: @index_expr +); + +#keyset[id, index] +index_expr_attrs( + int id: @index_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +index_expr_bases( + int id: @index_expr ref, + int base: @expr ref +); + +#keyset[id] +index_expr_indices( + int id: @index_expr ref, + int index: @expr ref +); + +infer_type_reprs( + unique int id: @infer_type_repr +); + +@item = + @asm_expr +| @assoc_item +| @extern_block +| @extern_crate +| @extern_item +| @impl +| @macro_def +| @macro_rules +| @module +| @trait +| @type_item +| @use +; + +#keyset[id] +item_attribute_macro_expansions( + int id: @item ref, + int attribute_macro_expansion: @macro_items ref +); + +key_value_meta( + unique int id: @key_value_meta +); + +#keyset[id] +key_value_meta_exprs( + int id: @key_value_meta ref, + int expr: @expr ref +); + +#keyset[id] +key_value_meta_paths( + int id: @key_value_meta ref, + int path: @path ref +); + +@labelable_expr = + @block_expr +| @looping_expr +; + +#keyset[id] +labelable_expr_labels( + int id: @labelable_expr ref, + int label: @label ref +); + +let_exprs( + unique int id: @let_expr +); + +#keyset[id, index] +let_expr_attrs( + int id: @let_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_expr_scrutinees( + int id: @let_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +let_expr_pats( + int id: @let_expr ref, + int pat: @pat ref +); + +let_stmts( + unique int id: @let_stmt +); + +#keyset[id, index] +let_stmt_attrs( + int id: @let_stmt ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +let_stmt_initializers( + int id: @let_stmt ref, + int initializer: @expr ref +); + +#keyset[id] +let_stmt_let_elses( + int id: @let_stmt ref, + int let_else: @let_else ref +); + +#keyset[id] +let_stmt_pats( + int id: @let_stmt ref, + int pat: @pat ref +); + +#keyset[id] +let_stmt_type_reprs( + int id: @let_stmt ref, + int type_repr: @type_repr ref +); + +lifetimes( + unique int id: @lifetime +); + +#keyset[id] +lifetime_texts( + int id: @lifetime ref, + string text: string ref +); + +lifetime_args( + unique int id: @lifetime_arg +); + +#keyset[id] +lifetime_arg_lifetimes( + int id: @lifetime_arg ref, + int lifetime: @lifetime ref +); + +lifetime_params( + unique int id: @lifetime_param +); + +#keyset[id, index] +lifetime_param_attrs( + int id: @lifetime_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +lifetime_param_lifetimes( + int id: @lifetime_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +lifetime_param_type_bound_lists( + int id: @lifetime_param ref, + int type_bound_list: @type_bound_list ref +); + +literal_exprs( + unique int id: @literal_expr +); + +#keyset[id, index] +literal_expr_attrs( + int id: @literal_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +literal_expr_text_values( + int id: @literal_expr ref, + string text_value: string ref +); + +literal_pats( + unique int id: @literal_pat +); + +#keyset[id] +literal_pat_literals( + int id: @literal_pat ref, + int literal: @literal_expr ref +); + +macro_exprs( + unique int id: @macro_expr +); + +#keyset[id] +macro_expr_macro_calls( + int id: @macro_expr ref, + int macro_call: @macro_call ref +); + +macro_pats( + unique int id: @macro_pat +); + +#keyset[id] +macro_pat_macro_calls( + int id: @macro_pat ref, + int macro_call: @macro_call ref +); + +macro_type_reprs( + unique int id: @macro_type_repr +); + +#keyset[id] +macro_type_repr_macro_calls( + int id: @macro_type_repr ref, + int macro_call: @macro_call ref +); + +match_exprs( + unique int id: @match_expr +); + +#keyset[id, index] +match_expr_attrs( + int id: @match_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +match_expr_scrutinees( + int id: @match_expr ref, + int scrutinee: @expr ref +); + +#keyset[id] +match_expr_match_arm_lists( + int id: @match_expr ref, + int match_arm_list: @match_arm_list ref +); + +method_call_exprs( + unique int id: @method_call_expr +); + +#keyset[id] +method_call_expr_arg_lists( + int id: @method_call_expr ref, + int arg_list: @arg_list ref +); + +#keyset[id, index] +method_call_expr_attrs( + int id: @method_call_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +method_call_expr_generic_arg_lists( + int id: @method_call_expr ref, + int generic_arg_list: @generic_arg_list ref +); + +#keyset[id] +method_call_expr_identifiers( + int id: @method_call_expr ref, + int identifier: @name_ref ref +); + +#keyset[id] +method_call_expr_receivers( + int id: @method_call_expr ref, + int receiver: @expr ref +); + +name_refs( + unique int id: @name_ref +); + +#keyset[id] +name_ref_texts( + int id: @name_ref ref, + string text: string ref +); + +never_type_reprs( + unique int id: @never_type_repr +); + +not_nulls( + unique int id: @not_null +); + +offset_of_exprs( + unique int id: @offset_of_expr +); + +#keyset[id, index] +offset_of_expr_attrs( + int id: @offset_of_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +offset_of_expr_fields( + int id: @offset_of_expr ref, + int index: int ref, + int field: @name_ref ref +); + +#keyset[id] +offset_of_expr_type_reprs( + int id: @offset_of_expr ref, + int type_repr: @type_repr ref +); + +or_pats( + unique int id: @or_pat +); + +#keyset[id, index] +or_pat_pats( + int id: @or_pat ref, + int index: int ref, + int pat: @pat ref +); + +params( + unique int id: @param +); + +#keyset[id] +param_pats( + int id: @param ref, + int pat: @pat ref +); + +paren_exprs( + unique int id: @paren_expr +); + +#keyset[id, index] +paren_expr_attrs( + int id: @paren_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +paren_expr_exprs( + int id: @paren_expr ref, + int expr: @expr ref +); + +paren_pats( + unique int id: @paren_pat +); + +#keyset[id] +paren_pat_pats( + int id: @paren_pat ref, + int pat: @pat ref +); + +paren_type_reprs( + unique int id: @paren_type_repr +); + +#keyset[id] +paren_type_repr_type_reprs( + int id: @paren_type_repr ref, + int type_repr: @type_repr ref +); + +@path_expr_base = + @path_expr +; + +path_meta( + unique int id: @path_meta +); + +#keyset[id] +path_meta_paths( + int id: @path_meta ref, + int path: @path ref +); + +path_pats( + unique int id: @path_pat +); + +path_type_reprs( + unique int id: @path_type_repr +); + +#keyset[id] +path_type_repr_paths( + int id: @path_type_repr ref, + int path: @path ref +); + +pattern_type_reprs( + unique int id: @pattern_type_repr +); + +#keyset[id] +pattern_type_repr_pats( + int id: @pattern_type_repr ref, + int pat: @pat ref +); + +#keyset[id] +pattern_type_repr_type_reprs( + int id: @pattern_type_repr ref, + int type_repr: @type_repr ref +); + +prefix_exprs( + unique int id: @prefix_expr +); + +#keyset[id, index] +prefix_expr_attrs( + int id: @prefix_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +prefix_expr_exprs( + int id: @prefix_expr ref, + int expr: @expr ref +); + +#keyset[id] +prefix_expr_operator_names( + int id: @prefix_expr ref, + string operator_name: string ref +); + +ptr_type_reprs( + unique int id: @ptr_type_repr +); + +#keyset[id] +ptr_type_repr_is_const( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_is_mut( + int id: @ptr_type_repr ref +); + +#keyset[id] +ptr_type_repr_type_reprs( + int id: @ptr_type_repr ref, + int type_repr: @type_repr ref +); + +range_exprs( + unique int id: @range_expr +); + +#keyset[id, index] +range_expr_attrs( + int id: @range_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +range_expr_ends( + int id: @range_expr ref, + int end: @expr ref +); + +#keyset[id] +range_expr_operator_names( + int id: @range_expr ref, + string operator_name: string ref +); + +#keyset[id] +range_expr_starts( + int id: @range_expr ref, + int start: @expr ref +); + +range_pats( + unique int id: @range_pat +); + +#keyset[id] +range_pat_ends( + int id: @range_pat ref, + int end: @pat ref +); + +#keyset[id] +range_pat_operator_names( + int id: @range_pat ref, + string operator_name: string ref +); + +#keyset[id] +range_pat_starts( + int id: @range_pat ref, + int start: @pat ref +); + +ref_exprs( + unique int id: @ref_expr +); + +#keyset[id, index] +ref_expr_attrs( + int id: @ref_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +ref_expr_exprs( + int id: @ref_expr ref, + int expr: @expr ref +); + +#keyset[id] +ref_expr_is_const( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_mut( + int id: @ref_expr ref +); + +#keyset[id] +ref_expr_is_raw( + int id: @ref_expr ref +); + +ref_pats( + unique int id: @ref_pat +); + +#keyset[id] +ref_pat_is_mut( + int id: @ref_pat ref +); + +#keyset[id] +ref_pat_pats( + int id: @ref_pat ref, + int pat: @pat ref +); + +ref_type_reprs( + unique int id: @ref_type_repr +); + +#keyset[id] +ref_type_repr_is_mut( + int id: @ref_type_repr ref +); + +#keyset[id] +ref_type_repr_lifetimes( + int id: @ref_type_repr ref, + int lifetime: @lifetime ref +); + +#keyset[id] +ref_type_repr_type_reprs( + int id: @ref_type_repr ref, + int type_repr: @type_repr ref +); + +rest_pats( + unique int id: @rest_pat +); + +#keyset[id, index] +rest_pat_attrs( + int id: @rest_pat ref, + int index: int ref, + int attr: @attr ref +); + +return_exprs( + unique int id: @return_expr +); + +#keyset[id, index] +return_expr_attrs( + int id: @return_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +return_expr_exprs( + int id: @return_expr ref, + int expr: @expr ref +); + +self_params( + unique int id: @self_param +); + +#keyset[id] +self_param_is_ref( + int id: @self_param ref +); + +#keyset[id] +self_param_is_mut( + int id: @self_param ref +); + +#keyset[id] +self_param_lifetimes( + int id: @self_param ref, + int lifetime: @lifetime ref +); + +#keyset[id] +self_param_names( + int id: @self_param ref, + int name: @name ref +); + +slice_pats( + unique int id: @slice_pat +); + +#keyset[id, index] +slice_pat_pats( + int id: @slice_pat ref, + int index: int ref, + int pat: @pat ref +); + +slice_type_reprs( + unique int id: @slice_type_repr +); + +#keyset[id] +slice_type_repr_type_reprs( + int id: @slice_type_repr ref, + int type_repr: @type_repr ref +); + +struct_exprs( + unique int id: @struct_expr +); + +#keyset[id] +struct_expr_struct_expr_field_lists( + int id: @struct_expr ref, + int struct_expr_field_list: @struct_expr_field_list ref +); + +struct_field_lists( + unique int id: @struct_field_list +); + +#keyset[id, index] +struct_field_list_fields( + int id: @struct_field_list ref, + int index: int ref, + int field: @struct_field ref +); + +struct_pats( + unique int id: @struct_pat +); + +#keyset[id] +struct_pat_struct_pat_field_lists( + int id: @struct_pat ref, + int struct_pat_field_list: @struct_pat_field_list ref +); + +token_tree_meta( + unique int id: @token_tree_meta +); + +#keyset[id] +token_tree_meta_paths( + int id: @token_tree_meta ref, + int path: @path ref +); + +#keyset[id] +token_tree_meta_token_trees( + int id: @token_tree_meta ref, + int token_tree: @token_tree ref +); + +try_exprs( + unique int id: @try_expr +); + +#keyset[id, index] +try_expr_attrs( + int id: @try_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +try_expr_exprs( + int id: @try_expr ref, + int expr: @expr ref +); + +tuple_exprs( + unique int id: @tuple_expr +); + +#keyset[id, index] +tuple_expr_attrs( + int id: @tuple_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +tuple_expr_fields( + int id: @tuple_expr ref, + int index: int ref, + int field: @expr ref +); + +tuple_field_lists( + unique int id: @tuple_field_list +); + +#keyset[id, index] +tuple_field_list_fields( + int id: @tuple_field_list ref, + int index: int ref, + int field: @tuple_field ref +); + +tuple_pats( + unique int id: @tuple_pat +); + +#keyset[id, index] +tuple_pat_fields( + int id: @tuple_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_struct_pats( + unique int id: @tuple_struct_pat +); + +#keyset[id, index] +tuple_struct_pat_fields( + int id: @tuple_struct_pat ref, + int index: int ref, + int field: @pat ref +); + +tuple_type_reprs( + unique int id: @tuple_type_repr +); + +#keyset[id, index] +tuple_type_repr_fields( + int id: @tuple_type_repr ref, + int index: int ref, + int field: @type_repr ref +); + +type_args( + unique int id: @type_arg +); + +#keyset[id] +type_arg_type_reprs( + int id: @type_arg ref, + int type_repr: @type_repr ref +); + +type_params( + unique int id: @type_param +); + +#keyset[id, index] +type_param_attrs( + int id: @type_param ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_param_default_types( + int id: @type_param ref, + int default_type: @type_repr ref +); + +#keyset[id] +type_param_names( + int id: @type_param ref, + int name: @name ref +); + +#keyset[id] +type_param_type_bound_lists( + int id: @type_param ref, + int type_bound_list: @type_bound_list ref +); + +underscore_exprs( + unique int id: @underscore_expr +); + +#keyset[id, index] +underscore_expr_attrs( + int id: @underscore_expr ref, + int index: int ref, + int attr: @attr ref +); + +unsafe_meta( + unique int id: @unsafe_meta +); + +#keyset[id] +unsafe_meta_is_unsafe( + int id: @unsafe_meta ref +); + +#keyset[id] +unsafe_meta_meta( + int id: @unsafe_meta ref, + int meta: @meta ref +); + +variants( + unique int id: @variant +); + +#keyset[id, index] +variant_attrs( + int id: @variant ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +variant_const_args( + int id: @variant ref, + int const_arg: @const_arg ref +); + +#keyset[id] +variant_field_lists( + int id: @variant ref, + int field_list: @field_list ref +); + +#keyset[id] +variant_names( + int id: @variant ref, + int name: @name ref +); + +#keyset[id] +variant_visibilities( + int id: @variant ref, + int visibility: @visibility ref +); + +wildcard_pats( + unique int id: @wildcard_pat +); + +yeet_exprs( + unique int id: @yeet_expr +); + +#keyset[id, index] +yeet_expr_attrs( + int id: @yeet_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yeet_expr_exprs( + int id: @yeet_expr ref, + int expr: @expr ref +); + +yield_exprs( + unique int id: @yield_expr +); + +#keyset[id, index] +yield_expr_attrs( + int id: @yield_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +yield_expr_exprs( + int id: @yield_expr ref, + int expr: @expr ref +); + +asm_exprs( + unique int id: @asm_expr +); + +#keyset[id, index] +asm_expr_asm_pieces( + int id: @asm_expr ref, + int index: int ref, + int asm_piece: @asm_piece ref +); + +#keyset[id, index] +asm_expr_attrs( + int id: @asm_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id, index] +asm_expr_templates( + int id: @asm_expr ref, + int index: int ref, + int template: @expr ref +); + +@assoc_item = + @const +| @function +| @macro_call +| @type_alias +; + +block_exprs( + unique int id: @block_expr +); + +#keyset[id, index] +block_expr_attrs( + int id: @block_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +block_expr_is_async( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_const( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_gen( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_move( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_unsafe( + int id: @block_expr ref +); + +#keyset[id] +block_expr_stmt_lists( + int id: @block_expr ref, + int stmt_list: @stmt_list ref +); + +#keyset[id] +block_expr_try_block_modifiers( + int id: @block_expr ref, + int try_block_modifier: @try_block_modifier ref +); + +extern_blocks( + unique int id: @extern_block +); + +#keyset[id] +extern_block_abis( + int id: @extern_block ref, + int abi: @abi ref +); + +#keyset[id, index] +extern_block_attrs( + int id: @extern_block ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_block_extern_item_lists( + int id: @extern_block ref, + int extern_item_list: @extern_item_list ref +); + +#keyset[id] +extern_block_is_unsafe( + int id: @extern_block ref +); + +extern_crates( + unique int id: @extern_crate +); + +#keyset[id, index] +extern_crate_attrs( + int id: @extern_crate ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +extern_crate_identifiers( + int id: @extern_crate ref, + int identifier: @name_ref ref +); + +#keyset[id] +extern_crate_renames( + int id: @extern_crate ref, + int rename: @rename ref +); + +#keyset[id] +extern_crate_visibilities( + int id: @extern_crate ref, + int visibility: @visibility ref +); + +@extern_item = + @function +| @macro_call +| @static +| @type_alias +; + +impls( + unique int id: @impl +); + +#keyset[id] +impl_assoc_item_lists( + int id: @impl ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +impl_attrs( + int id: @impl ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +impl_generic_param_lists( + int id: @impl ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +impl_is_const( + int id: @impl ref +); + +#keyset[id] +impl_is_default( + int id: @impl ref +); + +#keyset[id] +impl_is_unsafe( + int id: @impl ref +); + +#keyset[id] +impl_self_ties( + int id: @impl ref, + int self_ty: @type_repr ref +); + +#keyset[id] +impl_trait_ties( + int id: @impl ref, + int trait_ty: @type_repr ref +); + +#keyset[id] +impl_visibilities( + int id: @impl ref, + int visibility: @visibility ref +); + +#keyset[id] +impl_where_clauses( + int id: @impl ref, + int where_clause: @where_clause ref +); + +@looping_expr = + @for_expr +| @loop_expr +| @while_expr +; + +#keyset[id] +looping_expr_loop_bodies( + int id: @looping_expr ref, + int loop_body: @block_expr ref +); + +macro_defs( + unique int id: @macro_def +); + +#keyset[id] +macro_def_args( + int id: @macro_def ref, + int args: @token_tree ref +); + +#keyset[id, index] +macro_def_attrs( + int id: @macro_def ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_def_bodies( + int id: @macro_def ref, + int body: @token_tree ref +); + +#keyset[id] +macro_def_names( + int id: @macro_def ref, + int name: @name ref +); + +#keyset[id] +macro_def_visibilities( + int id: @macro_def ref, + int visibility: @visibility ref +); + +macro_rules( + unique int id: @macro_rules +); + +#keyset[id, index] +macro_rules_attrs( + int id: @macro_rules ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_rules_names( + int id: @macro_rules ref, + int name: @name ref +); + +#keyset[id] +macro_rules_token_trees( + int id: @macro_rules ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_rules_visibilities( + int id: @macro_rules ref, + int visibility: @visibility ref +); + +modules( + unique int id: @module +); + +#keyset[id, index] +module_attrs( + int id: @module ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +module_item_lists( + int id: @module ref, + int item_list: @item_list ref +); + +#keyset[id] +module_names( + int id: @module ref, + int name: @name ref +); + +#keyset[id] +module_visibilities( + int id: @module ref, + int visibility: @visibility ref +); + +path_exprs( + unique int id: @path_expr +); + +#keyset[id, index] +path_expr_attrs( + int id: @path_expr ref, + int index: int ref, + int attr: @attr ref +); + +traits( + unique int id: @trait +); + +#keyset[id] +trait_assoc_item_lists( + int id: @trait ref, + int assoc_item_list: @assoc_item_list ref +); + +#keyset[id, index] +trait_attrs( + int id: @trait ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +trait_generic_param_lists( + int id: @trait ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +trait_impl_restrictions( + int id: @trait ref, + int impl_restriction: @impl_restriction ref +); + +#keyset[id] +trait_is_auto( + int id: @trait ref +); + +#keyset[id] +trait_is_unsafe( + int id: @trait ref +); + +#keyset[id] +trait_names( + int id: @trait ref, + int name: @name ref +); + +#keyset[id] +trait_type_bound_lists( + int id: @trait ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +trait_visibilities( + int id: @trait ref, + int visibility: @visibility ref +); + +#keyset[id] +trait_where_clauses( + int id: @trait ref, + int where_clause: @where_clause ref +); + +@type_item = + @enum +| @struct +| @union +; + +#keyset[id, index] +type_item_derive_macro_expansions( + int id: @type_item ref, + int index: int ref, + int derive_macro_expansion: @macro_items ref +); + +#keyset[id, index] +type_item_attrs( + int id: @type_item ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_item_generic_param_lists( + int id: @type_item ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_item_names( + int id: @type_item ref, + int name: @name ref +); + +#keyset[id] +type_item_visibilities( + int id: @type_item ref, + int visibility: @visibility ref +); + +#keyset[id] +type_item_where_clauses( + int id: @type_item ref, + int where_clause: @where_clause ref +); + +uses( + unique int id: @use +); + +#keyset[id, index] +use_attrs( + int id: @use ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +use_use_trees( + int id: @use ref, + int use_tree: @use_tree ref +); + +#keyset[id] +use_visibilities( + int id: @use ref, + int visibility: @visibility ref +); + +consts( + unique int id: @const +); + +#keyset[id, index] +const_attrs( + int id: @const ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +const_bodies( + int id: @const ref, + int body: @expr ref +); + +#keyset[id] +const_generic_param_lists( + int id: @const ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +const_is_const( + int id: @const ref +); + +#keyset[id] +const_is_default( + int id: @const ref +); + +#keyset[id] +const_names( + int id: @const ref, + int name: @name ref +); + +#keyset[id] +const_type_reprs( + int id: @const ref, + int type_repr: @type_repr ref +); + +#keyset[id] +const_visibilities( + int id: @const ref, + int visibility: @visibility ref +); + +#keyset[id] +const_where_clauses( + int id: @const ref, + int where_clause: @where_clause ref +); + +#keyset[id] +const_has_implementation( + int id: @const ref +); + +enums( + unique int id: @enum +); + +#keyset[id] +enum_variant_lists( + int id: @enum ref, + int variant_list: @variant_list ref +); + +for_exprs( + unique int id: @for_expr +); + +#keyset[id, index] +for_expr_attrs( + int id: @for_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +for_expr_iterables( + int id: @for_expr ref, + int iterable: @expr ref +); + +#keyset[id] +for_expr_pats( + int id: @for_expr ref, + int pat: @pat ref +); + +functions( + unique int id: @function +); + +#keyset[id] +function_abis( + int id: @function ref, + int abi: @abi ref +); + +#keyset[id] +function_function_bodies( + int id: @function ref, + int function_body: @block_expr ref +); + +#keyset[id] +function_generic_param_lists( + int id: @function ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +function_is_async( + int id: @function ref +); + +#keyset[id] +function_is_const( + int id: @function ref +); + +#keyset[id] +function_is_default( + int id: @function ref +); + +#keyset[id] +function_is_gen( + int id: @function ref +); + +#keyset[id] +function_is_unsafe( + int id: @function ref +); + +#keyset[id] +function_names( + int id: @function ref, + int name: @name ref +); + +#keyset[id] +function_ret_types( + int id: @function ref, + int ret_type: @ret_type_repr ref +); + +#keyset[id] +function_visibilities( + int id: @function ref, + int visibility: @visibility ref +); + +#keyset[id] +function_where_clauses( + int id: @function ref, + int where_clause: @where_clause ref +); + +#keyset[id] +function_has_implementation( + int id: @function ref +); + +loop_exprs( + unique int id: @loop_expr +); + +#keyset[id, index] +loop_expr_attrs( + int id: @loop_expr ref, + int index: int ref, + int attr: @attr ref +); + +macro_calls( + unique int id: @macro_call +); + +#keyset[id, index] +macro_call_attrs( + int id: @macro_call ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +macro_call_paths( + int id: @macro_call ref, + int path: @path ref +); + +#keyset[id] +macro_call_token_trees( + int id: @macro_call ref, + int token_tree: @token_tree ref +); + +#keyset[id] +macro_call_macro_call_expansions( + int id: @macro_call ref, + int macro_call_expansion: @ast_node ref +); + +statics( + unique int id: @static +); + +#keyset[id, index] +static_attrs( + int id: @static ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +static_bodies( + int id: @static ref, + int body: @expr ref +); + +#keyset[id] +static_is_mut( + int id: @static ref +); + +#keyset[id] +static_is_static( + int id: @static ref +); + +#keyset[id] +static_is_unsafe( + int id: @static ref +); + +#keyset[id] +static_names( + int id: @static ref, + int name: @name ref +); + +#keyset[id] +static_type_reprs( + int id: @static ref, + int type_repr: @type_repr ref +); + +#keyset[id] +static_visibilities( + int id: @static ref, + int visibility: @visibility ref +); + +structs( + unique int id: @struct +); + +#keyset[id] +struct_field_lists_( + int id: @struct ref, + int field_list: @field_list ref +); + +type_aliases( + unique int id: @type_alias +); + +#keyset[id, index] +type_alias_attrs( + int id: @type_alias ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +type_alias_generic_param_lists( + int id: @type_alias ref, + int generic_param_list: @generic_param_list ref +); + +#keyset[id] +type_alias_is_default( + int id: @type_alias ref +); + +#keyset[id] +type_alias_names( + int id: @type_alias ref, + int name: @name ref +); + +#keyset[id] +type_alias_type_reprs( + int id: @type_alias ref, + int type_repr: @type_repr ref +); + +#keyset[id] +type_alias_type_bound_lists( + int id: @type_alias ref, + int type_bound_list: @type_bound_list ref +); + +#keyset[id] +type_alias_visibilities( + int id: @type_alias ref, + int visibility: @visibility ref +); + +#keyset[id] +type_alias_where_clauses( + int id: @type_alias ref, + int where_clause: @where_clause ref +); + +unions( + unique int id: @union +); + +#keyset[id] +union_struct_field_lists( + int id: @union ref, + int struct_field_list: @struct_field_list ref +); + +while_exprs( + unique int id: @while_expr +); + +#keyset[id, index] +while_expr_attrs( + int id: @while_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +while_expr_conditions( + int id: @while_expr ref, + int condition: @expr ref +); diff --git a/rust/ql/lib/upgrades/ed6b1d3d51401eafee5e4b24e1093d731309ac94/upgrade.properties b/rust/ql/lib/upgrades/ed6b1d3d51401eafee5e4b24e1093d731309ac94/upgrade.properties new file mode 100644 index 000000000000..2cd62911a238 --- /dev/null +++ b/rust/ql/lib/upgrades/ed6b1d3d51401eafee5e4b24e1093d731309ac94/upgrade.properties @@ -0,0 +1,13 @@ +description: Update rust-analyzer to 0.0.347 +compatibility: partial + +visibility_inners.rel: run upgrade.ql new_visibility_inners +visibility_visibility_inners.rel: run upgrade.ql new_visibility_visibility_inners +visibility_inner_paths.rel: run upgrade.ql new_visibility_inner_paths +visibility_paths.rel: delete + +names.rel: run upgrade.ql new_names +format_args_arg_names.rel: run upgrade.ql new_format_args_arg_names +format_args_arg_arg_names.rel: delete + +locatable_locations.rel: run upgrade.ql new_locatable_locations diff --git a/rust/ql/lib/upgrades/ed6b1d3d51401eafee5e4b24e1093d731309ac94/upgrade.ql b/rust/ql/lib/upgrades/ed6b1d3d51401eafee5e4b24e1093d731309ac94/upgrade.ql new file mode 100644 index 000000000000..b96a8fd33b88 --- /dev/null +++ b/rust/ql/lib/upgrades/ed6b1d3d51401eafee5e4b24e1093d731309ac94/upgrade.ql @@ -0,0 +1,53 @@ +class Element extends @element { + string toString() { none() } +} + +class Location extends @location_default { + string toString() { none() } +} + +// The old schema stored a visibility's path directly on the `Visibility`. The new schema inserts a +// genuinely-new `VisibilityInner` node between `Visibility` and its path, so we synthesise one per +// visibility that has a path, reusing the visibility's location. +newtype TSynth = TVisibilityInner(Element visibility) { visibility_paths(visibility, _) } + +module Fresh = QlBuiltins::NewEntity; + +class TNewElement = @element or Fresh::EntityId; + +class NewElement extends TNewElement { + string toString() { none() } +} + +query predicate new_visibility_inners(Fresh::EntityId id) { id = Fresh::map(TVisibilityInner(_)) } + +query predicate new_visibility_visibility_inners(Element visibility, Fresh::EntityId inner) { + inner = Fresh::map(TVisibilityInner(visibility)) +} + +query predicate new_visibility_inner_paths(Fresh::EntityId inner, Element path) { + exists(Element visibility | + inner = Fresh::map(TVisibilityInner(visibility)) and + visibility_paths(visibility, path) + ) +} + +// The old schema represented a format argument's name as a dedicated text-less +// `@format_args_arg_name` placeholder (entity table `format_args_arg_names`, linked to the arg via +// `format_args_arg_arg_names`). The new schema uses a regular `@name` node instead, so we repurpose +// the placeholder ids as `@name`s by adding them to `names`. They carry no text; re-extraction +// recovers it. +query predicate new_names(Element id) { names(id) or format_args_arg_names(id) } + +query predicate new_format_args_arg_names(Element arg, Element name) { + format_args_arg_arg_names(arg, name) +} + +query predicate new_locatable_locations(NewElement id, Location location) { + locatable_locations(id, location) + or + exists(Element visibility | + id = Fresh::map(TVisibilityInner(visibility)) and + locatable_locations(visibility, location) + ) +} From 9a40ad1e0efa11eed7116734a8426c735b338df9 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 14 Aug 2026 12:22:48 +0200 Subject: [PATCH 0305/2098] Update Rust generated translator signature Regenerate the Rust translator so codegen emits the current Translator<'_> impl signature. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 890cb55d-0437-4bd7-9268-87b8897ada01 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- rust/extractor/src/translate/generated.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust/extractor/src/translate/generated.rs b/rust/extractor/src/translate/generated.rs index b84cb0cfc8d9..f620af0e7cde 100644 --- a/rust/extractor/src/translate/generated.rs +++ b/rust/extractor/src/translate/generated.rs @@ -9,7 +9,7 @@ use ra_ap_syntax::ast::{ }; #[rustfmt::skip] use ra_ap_syntax::{AstNode, ast}; -impl Translator<'_, '_> { +impl Translator<'_> { pub(crate) fn emit_asm_operand( &mut self, node: &ast::AsmOperand, From fb474972aff6ad1b9b10cb2535cc82a7967bb91b Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 14 Aug 2026 12:22:48 +0200 Subject: [PATCH 0306/2098] Fix tree-sitter clippy warnings Rust 1.97 reports redundant formatting borrows and map iteration warnings under -D warnings. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 890cb55d-0437-4bd7-9268-87b8897ada01 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../tree-sitter-extractor/src/autobuilder.rs | 2 +- .../src/generator/dbscheme.rs | 2 +- .../src/generator/mod.rs | 22 +++++++++---------- .../tree-sitter-extractor/src/generator/ql.rs | 8 +++---- .../tree-sitter-extractor/src/node_types.rs | 22 +++++++++---------- shared/tree-sitter-extractor/src/options.rs | 2 +- shared/tree-sitter-extractor/src/trap.rs | 2 +- 7 files changed, 30 insertions(+), 30 deletions(-) diff --git a/shared/tree-sitter-extractor/src/autobuilder.rs b/shared/tree-sitter-extractor/src/autobuilder.rs index f43ead71a761..950a3b5a151a 100644 --- a/shared/tree-sitter-extractor/src/autobuilder.rs +++ b/shared/tree-sitter-extractor/src/autobuilder.rs @@ -76,7 +76,7 @@ impl Autobuilder { cmd.arg(format!("--size-limit={limit}")); } - cmd.arg(format!("--language={}", &self.language)); + cmd.arg(format!("--language={}", self.language)); cmd.arg("--working-dir=."); cmd.arg(&self.database); diff --git a/shared/tree-sitter-extractor/src/generator/dbscheme.rs b/shared/tree-sitter-extractor/src/generator/dbscheme.rs index 87a15cfbeb2a..434d28735b7f 100644 --- a/shared/tree-sitter-extractor/src/generator/dbscheme.rs +++ b/shared/tree-sitter-extractor/src/generator/dbscheme.rs @@ -50,7 +50,7 @@ pub enum DbColumnType { impl fmt::Display for Case<'_> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - writeln!(f, "case @{}.{} of", &self.name, &self.column)?; + writeln!(f, "case @{}.{} of", self.name, self.column)?; let mut sep = " "; for (c, tp) in &self.branches { writeln!(f, "{sep} {c} = @{tp}")?; diff --git a/shared/tree-sitter-extractor/src/generator/mod.rs b/shared/tree-sitter-extractor/src/generator/mod.rs index cf445aaaac7f..ea90a8482894 100644 --- a/shared/tree-sitter-extractor/src/generator/mod.rs +++ b/shared/tree-sitter-extractor/src/generator/mod.rs @@ -65,14 +65,14 @@ pub fn generate( for language in languages { let prefix = node_types::to_snake_case(&language.name); - let ast_node_name = format!("{}_ast_node", &prefix); - let node_location_table_name = format!("{}_ast_node_location", &prefix); - let node_parent_table_name = format!("{}_ast_node_parent", &prefix); - let token_name = format!("{}_token", &prefix); - let tokeninfo_name = format!("{}_tokeninfo", &prefix); - let trivia_token_name = format!("{}_trivia_token", &prefix); - let trivia_tokeninfo_name = format!("{}_trivia_tokeninfo", &prefix); - let reserved_word_name = format!("{}_reserved_word", &prefix); + let ast_node_name = format!("{}_ast_node", prefix); + let node_location_table_name = format!("{}_ast_node_location", prefix); + let node_parent_table_name = format!("{}_ast_node_parent", prefix); + let token_name = format!("{}_token", prefix); + let tokeninfo_name = format!("{}_tokeninfo", prefix); + let trivia_token_name = format!("{}_trivia_token", prefix); + let trivia_tokeninfo_name = format!("{}_trivia_tokeninfo", prefix); + let reserved_word_name = format!("{}_reserved_word", prefix); // When a desugaring is configured, comments and other `extra` nodes are // preserved from the original parse tree as `TriviaToken`s. let has_trivia_tokens = language.desugar.is_some(); @@ -125,7 +125,7 @@ pub fn generate( let mut body = vec![]; let facade_import_name = if use_facade_ast { - format!("FacadeAst::{}", &language.name) + format!("FacadeAst::{}", language.name) } else { language.name.clone() // If not using a facade AST, treat the module itself as the facade module. }; @@ -389,8 +389,8 @@ fn convert_nodes( let mut entries = Vec::new(); let mut ast_node_members: Set<&str> = Set::new(); let token_kinds: Map<&str, usize> = nodes - .iter() - .filter_map(|(_, node)| match &node.kind { + .values() + .filter_map(|node| match &node.kind { node_types::EntryKind::Token { kind_id } => { Some((node.dbscheme_name.as_str(), *kind_id)) } diff --git a/shared/tree-sitter-extractor/src/generator/ql.rs b/shared/tree-sitter-extractor/src/generator/ql.rs index f114e251af21..c780aec681cd 100644 --- a/shared/tree-sitter-extractor/src/generator/ql.rs +++ b/shared/tree-sitter-extractor/src/generator/ql.rs @@ -50,7 +50,7 @@ impl fmt::Display for Import<'_> { if self.is_private { write!(f, "private ")?; } - write!(f, "import {}", &self.module)?; + write!(f, "import {}", self.module)?; if let Some(name) = &self.alias { write!(f, " as {name}")?; } @@ -82,13 +82,13 @@ impl fmt::Display for Class<'_> { write!(f, "private ")?; } if let Some(alias) = &self.alias { - write!(f, "class {} = {alias};", &self.name)?; + write!(f, "class {} = {alias};", self.name)?; return Ok(()); } if self.is_abstract { write!(f, "abstract ")?; } - write!(f, "class {} extends ", &self.name)?; + write!(f, "class {} extends ", self.name)?; for (index, supertype) in self.supertypes.iter().enumerate() { if index > 0 { write!(f, ", ")?; @@ -365,7 +365,7 @@ impl fmt::Display for FormalParameter<'_> { /// Generates a QL library by writing the given `elements` to the `file`. pub fn write(file: &mut dyn std::io::Write, elements: &[TopLevel]) -> std::io::Result<()> { for element in elements { - write!(file, "{}\n\n", &element)?; + write!(file, "{}\n\n", element)?; } Ok(()) } diff --git a/shared/tree-sitter-extractor/src/node_types.rs b/shared/tree-sitter-extractor/src/node_types.rs index 65217c8a28b6..2967bc845802 100644 --- a/shared/tree-sitter-extractor/src/node_types.rs +++ b/shared/tree-sitter-extractor/src/node_types.rs @@ -130,7 +130,7 @@ pub fn convert_nodes(prefix: &str, nodes: &[NodeInfo]) -> NodeTypeMap { let flattened_name = &node_type_name(&node.kind, node.named); let dbscheme_name = escape_name(flattened_name); let ql_class_name = dbscheme_name_to_class_name(&dbscheme_name); - let dbscheme_name = format!("{}_{}", prefix, &dbscheme_name); + let dbscheme_name = format!("{}_{}", prefix, dbscheme_name); let subtypes = &node.subtypes; if !subtypes.is_empty() { // It's a tree-sitter supertype node, for which we create a union @@ -156,8 +156,8 @@ pub fn convert_nodes(prefix: &str, nodes: &[NodeInfo]) -> NodeTypeMap { kind: node.kind.clone(), named: node.named, }; - let table_name = escape_name(&(format!("{}_def", &flattened_name))); - let table_name = format!("{}_{}", prefix, &table_name); + let table_name = escape_name(&(format!("{}_def", flattened_name))); + let table_name = format!("{}_{}", prefix, table_name); let mut fields = Vec::new(); @@ -203,13 +203,13 @@ pub fn convert_nodes(prefix: &str, nodes: &[NodeInfo]) -> NodeTypeMap { counter += 1; let unprefixed_name = node_type_name(&type_name.kind, true); Entry { - dbscheme_name: escape_name(&format!("{}_token_{}", &prefix, &unprefixed_name)), + dbscheme_name: escape_name(&format!("{}_token_{}", prefix, unprefixed_name)), ql_class_name: dbscheme_name_to_class_name(&escape_name(&unprefixed_name)), kind: EntryKind::Token { kind_id: counter }, } } else { Entry { - dbscheme_name: format!("{}_reserved_word", &prefix), + dbscheme_name: format!("{}_reserved_word", prefix), ql_class_name: "ReservedWord".to_owned(), kind: EntryKind::Token { kind_id: 0 }, } @@ -238,9 +238,9 @@ fn add_field( let has_index = field_info.multiple; let field_table_name = escape_name(&format!( "{}_{}_{}", - &prefix, + prefix, parent_flattened_name, - &name_for_field_or_child(&field_name) + name_for_field_or_child(&field_name) )); Storage::Table { has_index, @@ -261,7 +261,7 @@ fn add_field( let mut field_token_ints: BTreeMap = BTreeMap::new(); for (counter, t) in converted_types.into_iter().enumerate() { let dbscheme_variant_name = - escape_name(&format!("{}_{}_{}", &prefix, parent_flattened_name, t.kind)); + escape_name(&format!("{}_{}_{}", prefix, parent_flattened_name, t.kind)); field_token_ints.insert(t.kind.to_owned(), (counter, dbscheme_variant_name)); } FieldTypeInfo::ReservedWordInt(field_token_ints) @@ -273,9 +273,9 @@ fn add_field( types: converted_types, dbscheme_union: format!( "{}_{}_{}_type", - &prefix, - &parent_flattened_name, - &name_for_field_or_child(&field_name) + prefix, + parent_flattened_name, + name_for_field_or_child(&field_name) ), ql_class: "AstNode".to_owned(), } diff --git a/shared/tree-sitter-extractor/src/options.rs b/shared/tree-sitter-extractor/src/options.rs index 1b43a2159943..4be253104f19 100644 --- a/shared/tree-sitter-extractor/src/options.rs +++ b/shared/tree-sitter-extractor/src/options.rs @@ -6,7 +6,7 @@ pub fn num_threads() -> Result { let threads_str = std::env::var("CODEQL_THREADS").unwrap_or_else(|_| "-1".into()); let num_cpus = num_cpus::get(); parse_codeql_threads(&threads_str, num_cpus) - .ok_or_else(|| format!("Unable to parse CODEQL_THREADS value '{}'", &threads_str)) + .ok_or_else(|| format!("Unable to parse CODEQL_THREADS value '{}'", threads_str)) } /// Parses the given string to determine the number of threads the extractor diff --git a/shared/tree-sitter-extractor/src/trap.rs b/shared/tree-sitter-extractor/src/trap.rs index 85b2cc9adda7..492349c6d4ab 100644 --- a/shared/tree-sitter-extractor/src/trap.rs +++ b/shared/tree-sitter-extractor/src/trap.rs @@ -298,7 +298,7 @@ impl Compression { match std::env::var(var_name) { Ok(method) => match Compression::from_string(&method) { Some(c) => Ok(c), - None => Err(format!("Unknown compression method '{}'", &method)), + None => Err(format!("Unknown compression method '{}'", method)), }, // Default compression method if the env var isn't set: Err(_) => Ok(Compression::Gzip), From ee020e59a36e4e6a5223dfbb6add4ea3a27871e3 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 14 Aug 2026 12:28:18 +0200 Subject: [PATCH 0307/2098] Rust: scrub deleted-node references in downgrade script A full new->old->new dataset upgrade/downgrade round-trip surfaced dangling references: deleting the new node kinds left `macro_call_macro_call_expansions` rows (and potentially `comments` rows) pointing at now-undefined `@ast_node`s. These are the only two relations with a generic `@ast_node`-typed value column, so the downgrade now drops rows in both that reference a deleted node, alongside the existing `locatable_locations` scrub. `codeql dataset check` is now clean at every stage of the round-trip. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 890cb55d-0437-4bd7-9268-87b8897ada01 --- .../downgrade.ql | 26 ++++++++++++++++--- .../upgrade.properties | 2 ++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/rust/downgrades/852696f20117c338fbb4e6a4f5ed69df79682c37/downgrade.ql b/rust/downgrades/852696f20117c338fbb4e6a4f5ed69df79682c37/downgrade.ql index c0dc901f2f4d..1bf22d853583 100644 --- a/rust/downgrades/852696f20117c338fbb4e6a4f5ed69df79682c37/downgrade.ql +++ b/rust/downgrades/852696f20117c338fbb4e6a4f5ed69df79682c37/downgrade.ql @@ -7,9 +7,10 @@ class Location extends @location_default { } // Genuinely-new node kinds with no representation in the old schema. Their own child relations are -// dropped via `delete` in upgrade.properties; here we additionally drop their locations so no -// dangling `locatable_locations` rows remain. -private predicate deletedElement(Element id) { +// dropped via `delete` in upgrade.properties; the references to them from `@ast_node`-typed columns +// (`macro_call_macro_call_expansions`, `comments`) and their `locatable_locations` are scrubbed +// below. +private predicate deletedNode(Element id) { deref_pats(id) or not_nulls(id) or include_bytes_exprs(id) or @@ -19,6 +20,14 @@ private predicate deletedElement(Element id) { visibility_inners(id) } +// A deleted node, plus any comment attached to one: dropping the comment's `comments` row would +// otherwise leave its `locatable_locations` row dangling. +private predicate deletedElement(Element id) { + deletedNode(id) + or + exists(Element parent | comments(id, parent, _) and deletedNode(parent)) +} + // A `@name` used as a format argument's name. The old schema represents these as dedicated text-less // `@format_args_arg_name` placeholders, so we repurpose these ids into that entity table and drop // them (and their text) from `names`/`name_texts`. @@ -48,3 +57,14 @@ query predicate new_name_texts(Element id, string text) { query predicate new_locatable_locations(Element id, Location location) { locatable_locations(id, location) and not deletedElement(id) } + +// `macro_call_macro_call_expansions` and `comments` are the only two relations with a generic +// `@ast_node`-typed value column, so a deleted node reachable through a macro expansion or as a +// comment's parent would otherwise dangle here. +query predicate new_macro_call_macro_call_expansions(Element macroCall, Element expansion) { + macro_call_macro_call_expansions(macroCall, expansion) and not deletedNode(expansion) +} + +query predicate new_comments(Element id, Element parent, string text) { + comments(id, parent, text) and not deletedNode(parent) +} diff --git a/rust/downgrades/852696f20117c338fbb4e6a4f5ed69df79682c37/upgrade.properties b/rust/downgrades/852696f20117c338fbb4e6a4f5ed69df79682c37/upgrade.properties index b3c357f44dc0..7221c00218a1 100644 --- a/rust/downgrades/852696f20117c338fbb4e6a4f5ed69df79682c37/upgrade.properties +++ b/rust/downgrades/852696f20117c338fbb4e6a4f5ed69df79682c37/upgrade.properties @@ -12,6 +12,8 @@ names.rel: run downgrade.ql new_names name_texts.rel: run downgrade.ql new_name_texts locatable_locations.rel: run downgrade.ql new_locatable_locations +macro_call_macro_call_expansions.rel: run downgrade.ql new_macro_call_macro_call_expansions +comments.rel: run downgrade.ql new_comments deref_pats.rel: delete deref_pat_pats.rel: delete From d799a3c32ea18c27d4ffb59c3bb98d0d9eb247b7 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 14 Aug 2026 12:35:17 +0200 Subject: [PATCH 0308/2098] Rust: fix Translator lifetime in codegen template The template emitted `impl Translator<'_>` (one lifetime) while `base.rs` declares `Translator<'a, 'db>`, so regenerating produced a `generated.rs` that did not compile. Update the template to two lifetimes and regenerate. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 890cb55d-0437-4bd7-9268-87b8897ada01 --- rust/ast-generator/templates/extractor.mustache | 2 +- rust/extractor/src/translate/generated.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rust/ast-generator/templates/extractor.mustache b/rust/ast-generator/templates/extractor.mustache index 03269c26ae3f..2f3f5f2015c7 100644 --- a/rust/ast-generator/templates/extractor.mustache +++ b/rust/ast-generator/templates/extractor.mustache @@ -11,7 +11,7 @@ use ra_ap_syntax::ast::{ #[rustfmt::skip] use ra_ap_syntax::{AstNode, ast}; -impl Translator<'_> { +impl Translator<'_, '_> { {{#enums}} pub(crate) fn emit_{{snake_case_name}}(&mut self, node: &ast::{{ast_name}}) -> Option> { diff --git a/rust/extractor/src/translate/generated.rs b/rust/extractor/src/translate/generated.rs index f620af0e7cde..b84cb0cfc8d9 100644 --- a/rust/extractor/src/translate/generated.rs +++ b/rust/extractor/src/translate/generated.rs @@ -9,7 +9,7 @@ use ra_ap_syntax::ast::{ }; #[rustfmt::skip] use ra_ap_syntax::{AstNode, ast}; -impl Translator<'_> { +impl Translator<'_, '_> { pub(crate) fn emit_asm_operand( &mut self, node: &ast::AsmOperand, From 9fddc4487f1dabbaa4aa9f947fa9f7d849d6863a Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 14 Aug 2026 13:10:16 +0200 Subject: [PATCH 0309/2098] Bazel: re-vendor cargo dependencies for rules_rust 0.73 The `rules_rust` 0.69 -> 0.73 bump changes the vendored file format and repo layout, invalidating the previously vendored files. Regenerate them all via the umbrella `update_cargo_deps.sh` (py_deps + tree_sitter_extractors_deps). Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 890cb55d-0437-4bd7-9268-87b8897ada01 --- MODULE.bazel | 2 + .../py_deps/BUILD.aho-corasick-1.1.3.bazel | 13 + .../py_deps/BUILD.anstream-0.6.18.bazel | 13 + .../py_deps/BUILD.anstyle-1.0.10.bazel | 13 + .../py_deps/BUILD.anstyle-parse-0.2.6.bazel | 13 + .../py_deps/BUILD.anstyle-query-1.1.2.bazel | 13 + .../py_deps/BUILD.anstyle-wincon-3.0.7.bazel | 13 + .../py_deps/BUILD.anyhow-1.0.95.bazel | 19 +- misc/bazel/3rdparty/py_deps/BUILD.bazel | 12 - .../3rdparty/py_deps/BUILD.cc-1.2.14.bazel | 13 + .../3rdparty/py_deps/BUILD.clap-4.5.30.bazel | 13 + .../py_deps/BUILD.clap_builder-4.5.30.bazel | 13 + .../py_deps/BUILD.clap_lex-0.7.4.bazel | 13 + .../py_deps/BUILD.colorchoice-1.0.3.bazel | 13 + .../BUILD.is_terminal_polyfill-1.70.1.bazel | 13 + .../3rdparty/py_deps/BUILD.itoa-1.0.14.bazel | 13 + .../3rdparty/py_deps/BUILD.log-0.4.25.bazel | 13 + .../3rdparty/py_deps/BUILD.memchr-2.7.4.bazel | 13 + .../py_deps/BUILD.once_cell-1.20.3.bazel | 13 + .../py_deps/BUILD.proc-macro2-1.0.93.bazel | 19 +- .../3rdparty/py_deps/BUILD.quote-1.0.38.bazel | 13 + .../3rdparty/py_deps/BUILD.regex-1.11.1.bazel | 13 + .../py_deps/BUILD.regex-automata-0.4.9.bazel | 13 + .../py_deps/BUILD.regex-syntax-0.8.5.bazel | 13 + .../3rdparty/py_deps/BUILD.ryu-1.0.19.bazel | 13 + .../py_deps/BUILD.serde-1.0.217.bazel | 19 +- .../py_deps/BUILD.serde_derive-1.0.217.bazel | 13 + .../py_deps/BUILD.serde_json-1.0.138.bazel | 19 +- .../3rdparty/py_deps/BUILD.shlex-1.3.0.bazel | 13 + .../py_deps/BUILD.smallvec-1.14.0.bazel | 13 + .../BUILD.streaming-iterator-0.1.9.bazel | 13 + .../py_deps/BUILD.strsim-0.11.1.bazel | 13 + .../3rdparty/py_deps/BUILD.syn-2.0.98.bazel | 13 + .../py_deps/BUILD.thiserror-1.0.69.bazel | 19 +- .../py_deps/BUILD.thiserror-impl-1.0.69.bazel | 13 + .../py_deps/BUILD.tree-sitter-0.24.7.bazel | 19 +- .../BUILD.tree-sitter-graph-0.12.0.bazel | 13 + .../BUILD.tree-sitter-language-0.1.5.bazel | 13 + .../py_deps/BUILD.unicode-ident-1.0.16.bazel | 13 + .../py_deps/BUILD.utf8parse-0.2.2.bazel | 13 + .../py_deps/BUILD.windows-sys-0.59.0.bazel | 13 + .../BUILD.windows-targets-0.52.6.bazel | 13 + ...BUILD.windows_aarch64_gnullvm-0.52.6.bazel | 19 +- .../BUILD.windows_aarch64_msvc-0.52.6.bazel | 19 +- .../BUILD.windows_i686_gnu-0.52.6.bazel | 19 +- .../BUILD.windows_i686_gnullvm-0.52.6.bazel | 19 +- .../BUILD.windows_i686_msvc-0.52.6.bazel | 19 +- .../BUILD.windows_x86_64_gnu-0.52.6.bazel | 19 +- .../BUILD.windows_x86_64_gnullvm-0.52.6.bazel | 19 +- .../BUILD.windows_x86_64_msvc-0.52.6.bazel | 19 +- .../py_deps/anyhow-1.0.95/BUILD.bazel | 15 + .../bazel/3rdparty/py_deps/anyhow/BUILD.bazel | 15 + .../3rdparty/py_deps/cc-1.2.14/BUILD.bazel | 15 + misc/bazel/3rdparty/py_deps/cc/BUILD.bazel | 15 + .../3rdparty/py_deps/clap-4.5.30/BUILD.bazel | 15 + misc/bazel/3rdparty/py_deps/clap/BUILD.bazel | 15 + misc/bazel/3rdparty/py_deps/crates.bzl | 987 +++- misc/bazel/3rdparty/py_deps/defs.bzl | 956 +--- .../3rdparty/py_deps/regex-1.11.1/BUILD.bazel | 15 + misc/bazel/3rdparty/py_deps/regex/BUILD.bazel | 15 + .../py_deps/tree-sitter-0.24.7/BUILD.bazel | 15 + .../tree-sitter-graph-0.12.0/BUILD.bazel | 15 + .../py_deps/tree-sitter-graph/BUILD.bazel | 15 + .../3rdparty/py_deps/tree-sitter/BUILD.bazel | 15 + .../BUILD.adler2-2.0.1.bazel | 13 + .../BUILD.aho-corasick-1.1.5.bazel | 13 + .../BUILD.allocator-api2-0.2.21.bazel | 13 + ...UILD.android_system_properties-0.1.5.bazel | 13 + .../BUILD.anstream-1.0.0.bazel | 13 + .../BUILD.anstyle-1.0.14.bazel | 13 + .../BUILD.anstyle-parse-1.0.0.bazel | 13 + .../BUILD.anstyle-query-1.1.5.bazel | 13 + .../BUILD.anstyle-wincon-3.0.11.bazel | 13 + .../BUILD.anyhow-1.0.104.bazel | 19 +- .../BUILD.argfile-1.0.0.bazel | 13 + .../BUILD.arrayvec-0.7.8.bazel | 13 + .../BUILD.atomic-0.6.1.bazel | 13 + .../BUILD.autocfg-1.5.1.bazel | 13 + .../BUILD.base64-0.22.1.bazel | 13 + .../tree_sitter_extractors_deps/BUILD.bazel | 12 - .../BUILD.bitflags-1.3.2.bazel | 13 + .../BUILD.bitflags-2.13.1.bazel | 13 + .../BUILD.borsh-1.8.0.bazel | 19 +- .../BUILD.boxcar-0.2.14.bazel | 13 + .../BUILD.bs58-0.5.1.bazel | 13 + .../BUILD.bstr-1.12.1.bazel | 13 + .../BUILD.bumpalo-3.20.3.bazel | 13 + .../BUILD.bytemuck-1.25.0.bazel | 13 + .../BUILD.bytes-1.12.1.bazel | 13 + .../BUILD.camino-1.2.5.bazel | 19 +- .../BUILD.cargo-platform-0.3.3.bazel | 13 + .../BUILD.cargo_metadata-0.23.1.bazel | 13 + .../BUILD.cc-1.4.2.bazel | 16 + .../BUILD.cfg-if-1.0.4.bazel | 13 + .../BUILD.cfg_aliases-0.2.2.bazel | 13 + .../BUILD.chacha20-0.10.1.bazel | 16 + .../BUILD.chalk-derive-0.104.0.bazel | 13 + .../BUILD.chalk-ir-0.104.0.bazel | 13 + .../BUILD.chrono-0.4.45.bazel | 34 + .../BUILD.clap-4.6.6.bazel | 13 + .../BUILD.clap_builder-4.6.6.bazel | 13 + .../BUILD.clap_derive-4.6.4.bazel | 13 + .../BUILD.clap_lex-1.1.0.bazel | 13 + .../BUILD.cobs-0.3.0.bazel | 13 + .../BUILD.colorchoice-1.0.5.bazel | 13 + .../BUILD.core-foundation-sys-0.8.7.bazel | 13 + .../BUILD.countme-3.0.1.bazel | 13 + .../BUILD.cov-mark-2.2.0.bazel | 13 + .../BUILD.cpufeatures-0.3.0.bazel | 19 + .../BUILD.crc32fast-1.5.0.bazel | 19 +- .../BUILD.crossbeam-channel-0.5.16.bazel | 13 + .../BUILD.crossbeam-deque-0.8.7.bazel | 19 +- .../BUILD.crossbeam-epoch-0.9.20.bazel | 19 +- .../BUILD.crossbeam-queue-0.3.12.bazel | 13 + .../BUILD.crossbeam-utils-0.8.22.bazel | 19 +- .../BUILD.darling-0.23.0.bazel | 13 + .../BUILD.darling_core-0.23.0.bazel | 13 + .../BUILD.darling_macro-0.23.0.bazel | 13 + .../BUILD.dashmap-6.2.1.bazel | 13 + .../BUILD.defmt-1.1.1.bazel | 19 +- .../BUILD.defmt-macros-1.1.1.bazel | 19 +- .../BUILD.defmt-parser-1.0.0.bazel | 13 + .../BUILD.deranged-0.5.8.bazel | 13 + .../BUILD.derive-where-1.6.1.bazel | 13 + .../BUILD.dissimilar-1.0.11.bazel | 13 + .../BUILD.drop_bomb-0.1.5.bazel | 13 + .../BUILD.dunce-1.0.5.bazel | 13 + .../BUILD.dyn-clone-1.0.20.bazel | 13 + .../BUILD.either-1.17.0.bazel | 13 + .../BUILD.embedded-io-0.4.0.bazel | 13 + .../BUILD.embedded-io-0.6.1.bazel | 13 + .../BUILD.ena-0.14.4.bazel | 13 + .../BUILD.encoding-0.2.33.bazel | 13 + ...encoding-index-japanese-1.20141219.5.bazel | 13 + ...D.encoding-index-korean-1.20141219.5.bazel | 13 + ...oding-index-simpchinese-1.20141219.5.bazel | 13 + ...coding-index-singlebyte-1.20141219.5.bazel | 13 + ...oding-index-tradchinese-1.20141219.5.bazel | 13 + .../BUILD.encoding_index_tests-0.1.4.bazel | 13 + .../BUILD.equivalent-1.0.2.bazel | 13 + .../BUILD.figment-0.10.19.bazel | 37 +- .../BUILD.find-msvc-tools-0.1.10.bazel | 13 + .../BUILD.fixedbitset-0.5.7.bazel | 13 + .../BUILD.flate2-1.1.9.bazel | 13 + .../BUILD.foldhash-0.1.5.bazel | 13 + .../BUILD.foldhash-0.2.0.bazel | 13 + .../BUILD.fs-err-3.3.0.bazel | 19 +- .../BUILD.fsevent-sys-4.1.0.bazel | 13 + .../BUILD.fst-0.4.7.bazel | 19 +- .../BUILD.futures-core-0.3.34.bazel | 13 + .../BUILD.futures-task-0.3.34.bazel | 13 + .../BUILD.futures-util-0.3.34.bazel | 13 + .../BUILD.getrandom-0.4.3.bazel | 40 +- .../BUILD.glob-0.3.4.bazel | 13 + .../BUILD.globset-0.4.18.bazel | 13 + .../BUILD.hashbrown-0.12.3.bazel | 13 + .../BUILD.hashbrown-0.14.5.bazel | 13 + .../BUILD.hashbrown-0.15.5.bazel | 13 + .../BUILD.hashbrown-0.17.1.bazel | 13 + .../BUILD.hashlink-0.12.1.bazel | 13 + .../BUILD.heck-0.5.0.bazel | 13 + .../BUILD.hermit-abi-0.5.2.bazel | 13 + .../BUILD.hex-0.4.3.bazel | 13 + .../BUILD.iana-time-zone-0.1.65.bazel | 19 + .../BUILD.iana-time-zone-haiku-0.1.2.bazel | 19 +- .../BUILD.ident_case-1.0.1.bazel | 13 + .../BUILD.indexmap-1.9.3.bazel | 19 +- .../BUILD.indexmap-2.14.0.bazel | 13 + .../BUILD.inlinable_string-0.1.15.bazel | 13 + .../BUILD.inotify-0.11.1.bazel | 13 + .../BUILD.inotify-sys-0.1.8.bazel | 19 +- .../BUILD.intrusive-collections-0.10.3.bazel | 13 + .../BUILD.inventory-0.3.24.bazel | 13 + .../BUILD.is_terminal_polyfill-1.70.2.bazel | 13 + .../BUILD.itertools-0.15.0.bazel | 13 + .../BUILD.itoa-1.0.18.bazel | 13 + .../BUILD.jiff-0.2.35.bazel | 17 + .../BUILD.jiff-core-0.1.0.bazel | 13 + .../BUILD.jiff-static-0.2.35.bazel | 13 + .../BUILD.jiff-tzdb-0.1.8.bazel | 13 + .../BUILD.jiff-tzdb-platform-0.1.3.bazel | 13 + .../BUILD.jobserver-0.1.35.bazel | 34 + .../BUILD.jod-thread-1.0.0.bazel | 13 + .../BUILD.js-sys-0.3.103.bazel | 13 + .../BUILD.kqueue-1.2.0.bazel | 13 + .../BUILD.kqueue-sys-1.1.2.bazel | 13 + .../BUILD.la-arena-0.3.1.bazel | 13 + .../BUILD.lazy_static-1.5.0.bazel | 13 + .../BUILD.libc-0.2.189.bazel | 19 +- .../BUILD.line-index-0.1.2.bazel | 13 + .../BUILD.lock_api-0.4.14.bazel | 13 + .../BUILD.log-0.3.9.bazel | 13 + .../BUILD.log-0.4.33.bazel | 13 + .../BUILD.matchers-0.2.0.bazel | 13 + .../BUILD.memchr-2.8.3.bazel | 13 + .../BUILD.memoffset-0.9.1.bazel | 19 +- .../BUILD.miniz_oxide-0.8.9.bazel | 13 + .../BUILD.mio-1.2.2.bazel | 34 + .../BUILD.miow-0.6.1.bazel | 13 + .../BUILD.mustache-0.9.0.bazel | 13 + .../BUILD.nohash-hasher-0.2.0.bazel | 13 + .../BUILD.notify-8.2.0.bazel | 41 + .../BUILD.notify-types-2.1.0.bazel | 13 + .../BUILD.nu-ansi-term-0.50.3.bazel | 13 + .../BUILD.num-conv-0.2.2.bazel | 13 + .../BUILD.num-traits-0.2.19.bazel | 19 +- .../BUILD.num_cpus-1.17.0.bazel | 52 + .../BUILD.num_threads-0.1.7.bazel | 19 + .../BUILD.once_cell-1.21.4.bazel | 13 + .../BUILD.once_cell_polyfill-1.70.2.bazel | 13 + .../BUILD.oorandom-11.1.5.bazel | 13 + .../BUILD.os_str_bytes-7.2.0.bazel | 13 + .../BUILD.parking_lot-0.12.5.bazel | 13 + .../BUILD.parking_lot_core-0.9.12.bazel | 40 +- .../BUILD.pear-0.2.9.bazel | 13 + .../BUILD.pear_codegen-0.2.9.bazel | 13 + .../BUILD.perf-event-0.4.8.bazel | 13 + .../BUILD.perf-event-open-sys-4.0.0.bazel | 13 + .../BUILD.petgraph-0.8.3.bazel | 13 + .../BUILD.pin-project-lite-0.2.17.bazel | 13 + .../BUILD.pkg-config-0.3.33.bazel | 13 + .../BUILD.portable-atomic-1.14.0.bazel | 19 +- .../BUILD.portable-atomic-util-0.2.7.bazel | 19 +- .../BUILD.postcard-1.1.3.bazel | 13 + .../BUILD.powerfmt-0.2.0.bazel | 13 + .../BUILD.proc-macro2-1.0.107.bazel | 19 +- ...BUILD.proc-macro2-diagnostics-0.10.1.bazel | 19 +- .../BUILD.quote-1.0.47.bazel | 19 +- .../BUILD.r-efi-6.0.0.bazel | 13 + .../BUILD.ra-ap-rustc_abi-0.166.0.bazel | 13 + .../BUILD.ra-ap-rustc_ast_ir-0.166.0.bazel | 13 + .../BUILD.ra-ap-rustc_hashes-0.166.0.bazel | 13 + .../BUILD.ra-ap-rustc_index-0.166.0.bazel | 13 + ...ILD.ra-ap-rustc_index_macros-0.166.0.bazel | 13 + .../BUILD.ra-ap-rustc_lexer-0.166.0.bazel | 13 + ...a-ap-rustc_next_trait_solver-0.166.0.bazel | 13 + ...ILD.ra-ap-rustc_parse_format-0.166.0.bazel | 13 + ...ra-ap-rustc_pattern_analysis-0.166.0.bazel | 13 + .../BUILD.ra-ap-rustc_type_ir-0.166.0.bazel | 13 + ...D.ra-ap-rustc_type_ir_macros-0.166.0.bazel | 13 + .../BUILD.ra_ap_base_db-0.0.347.bazel | 13 + .../BUILD.ra_ap_cfg-0.0.347.bazel | 13 + .../BUILD.ra_ap_edition-0.0.347.bazel | 13 + .../BUILD.ra_ap_hir-0.0.347.bazel | 13 + .../BUILD.ra_ap_hir_def-0.0.347.bazel | 13 + .../BUILD.ra_ap_hir_expand-0.0.347.bazel | 13 + .../BUILD.ra_ap_hir_ty-0.0.347.bazel | 13 + .../BUILD.ra_ap_ide_db-0.0.347.bazel | 13 + .../BUILD.ra_ap_intern-0.0.347.bazel | 13 + .../BUILD.ra_ap_load-cargo-0.0.347.bazel | 13 + .../BUILD.ra_ap_macros-0.0.347.bazel | 13 + .../BUILD.ra_ap_mbe-0.0.347.bazel | 13 + .../BUILD.ra_ap_parser-0.0.347.bazel | 13 + .../BUILD.ra_ap_paths-0.0.347.bazel | 13 + .../BUILD.ra_ap_proc_macro_api-0.0.347.bazel | 13 + .../BUILD.ra_ap_profile-0.0.347.bazel | 22 + .../BUILD.ra_ap_project_model-0.0.347.bazel | 13 + .../BUILD.ra_ap_span-0.0.347.bazel | 13 + .../BUILD.ra_ap_stdx-0.0.347.bazel | 34 + .../BUILD.ra_ap_syntax-0.0.347.bazel | 13 + .../BUILD.ra_ap_syntax-bridge-0.0.347.bazel | 13 + .../BUILD.ra_ap_test_fixture-0.0.347.bazel | 13 + .../BUILD.ra_ap_test_utils-0.0.347.bazel | 13 + .../BUILD.ra_ap_toolchain-0.0.347.bazel | 13 + .../BUILD.ra_ap_tt-0.0.347.bazel | 13 + .../BUILD.ra_ap_vfs-0.0.347.bazel | 13 + .../BUILD.ra_ap_vfs-notify-0.0.347.bazel | 13 + .../BUILD.rand-0.10.2.bazel | 13 + .../BUILD.rand_core-0.10.1.bazel | 13 + .../BUILD.rayon-1.12.0.bazel | 13 + .../BUILD.rayon-core-1.13.0.bazel | 19 +- .../BUILD.redox_syscall-0.5.18.bazel | 13 + .../BUILD.ref-cast-1.0.26.bazel | 19 +- .../BUILD.ref-cast-impl-1.0.26.bazel | 13 + .../BUILD.regex-1.13.1.bazel | 13 + .../BUILD.regex-automata-0.4.18.bazel | 13 + .../BUILD.regex-syntax-0.8.11.bazel | 13 + .../BUILD.rowan-0.17.0.bazel | 13 + .../BUILD.rustc-hash-1.1.0.bazel | 13 + .../BUILD.rustc-hash-2.1.3.bazel | 13 + .../BUILD.rustc-literal-escaper-0.0.7.bazel | 13 + .../BUILD.rustc-stable-hash-0.1.2.bazel | 13 + ...ustc_apfloat-0.2.3+llvm-462a31f5a5ab.bazel | 19 +- .../BUILD.rustversion-1.0.23.bazel | 19 +- .../BUILD.ryu-1.0.23.bazel | 13 + .../BUILD.salsa-0.28.2.bazel | 13 + .../BUILD.salsa-macro-rules-0.28.2.bazel | 13 + .../BUILD.salsa-macros-0.28.2.bazel | 13 + .../BUILD.same-file-1.0.6.bazel | 13 + .../BUILD.schemars-0.9.0.bazel | 13 + .../BUILD.schemars-1.2.2.bazel | 13 + .../BUILD.scopeguard-1.2.0.bazel | 13 + .../BUILD.semver-1.0.28.bazel | 13 + .../BUILD.serde-1.0.229.bazel | 19 +- .../BUILD.serde_core-1.0.229.bazel | 19 +- .../BUILD.serde_derive-1.0.229.bazel | 13 + .../BUILD.serde_json-1.0.151.bazel | 30 +- .../BUILD.serde_spanned-1.1.1.bazel | 13 + .../BUILD.serde_with-3.22.0.bazel | 13 + .../BUILD.serde_with_macros-3.22.0.bazel | 13 + .../BUILD.serde_yaml-0.9.34+deprecated.bazel | 13 + .../BUILD.sharded-slab-0.1.7.bazel | 13 + .../BUILD.shlex-2.0.1.bazel | 13 + .../BUILD.simd-adler32-0.3.9.bazel | 13 + .../BUILD.slab-0.4.12.bazel | 13 + .../BUILD.smallvec-1.15.2.bazel | 13 + .../BUILD.smol_str-0.3.6.bazel | 13 + .../BUILD.stable_deref_trait-1.2.1.bazel | 13 + .../BUILD.streaming-iterator-0.1.9.bazel | 13 + .../BUILD.strsim-0.11.1.bazel | 13 + .../BUILD.syn-2.0.119.bazel | 13 + .../BUILD.syn-3.0.3.bazel | 13 + .../BUILD.synstructure-0.13.2.bazel | 13 + .../BUILD.temp-dir-0.2.0.bazel | 13 + .../BUILD.text-size-1.1.1.bazel | 13 + .../BUILD.thin-vec-0.2.19.bazel | 13 + .../BUILD.thiserror-2.0.20.bazel | 19 +- .../BUILD.thiserror-impl-2.0.20.bazel | 13 + .../BUILD.thread_local-1.1.10.bazel | 13 + .../BUILD.time-0.3.55.bazel | 41 + .../BUILD.time-core-0.1.9.bazel | 13 + .../BUILD.time-macros-0.2.32.bazel | 13 + .../BUILD.tinyvec-1.12.0.bazel | 13 + .../BUILD.tinyvec_macros-0.1.1.bazel | 13 + .../BUILD.toml-1.1.4+spec-1.1.0.bazel | 13 + ...BUILD.toml_datetime-1.1.1+spec-1.1.0.bazel | 13 + .../BUILD.toml_parser-1.1.3+spec-1.1.0.bazel | 13 + .../BUILD.toml_writer-1.1.2+spec-1.1.0.bazel | 13 + .../BUILD.tracing-0.1.44.bazel | 13 + .../BUILD.tracing-attributes-0.1.31.bazel | 13 + .../BUILD.tracing-core-0.1.36.bazel | 13 + .../BUILD.tracing-flame-0.2.0.bazel | 13 + .../BUILD.tracing-log-0.2.0.bazel | 13 + .../BUILD.tracing-subscriber-0.3.23.bazel | 13 + .../BUILD.tracing-tree-0.4.1.bazel | 13 + .../BUILD.tree-sitter-0.26.9.bazel | 19 +- ...tree-sitter-embedded-template-0.25.0.bazel | 19 +- .../BUILD.tree-sitter-json-0.24.8.bazel | 19 +- .../BUILD.tree-sitter-language-0.1.7.bazel | 19 +- .../BUILD.tree-sitter-python-0.25.0.bazel | 19 +- .../BUILD.tree-sitter-ql-0.23.1.bazel | 19 +- .../BUILD.tree-sitter-ruby-0.23.1.bazel | 19 +- .../BUILD.triomphe-0.1.16.bazel | 13 + .../BUILD.typed-arena-2.0.2.bazel | 13 + .../BUILD.typeid-1.0.3.bazel | 19 +- .../BUILD.uncased-0.9.10.bazel | 19 +- .../BUILD.ungrammar-1.16.1.bazel | 13 + .../BUILD.unicode-ident-1.0.24.bazel | 13 + .../BUILD.unicode-properties-0.1.4.bazel | 13 + .../BUILD.unsafe-libyaml-0.2.11.bazel | 13 + .../BUILD.utf8parse-0.2.2.bazel | 13 + .../BUILD.valuable-0.1.1.bazel | 19 +- .../BUILD.version_check-0.9.5.bazel | 13 + .../BUILD.walkdir-2.5.0.bazel | 13 + ...D.wasi-0.11.1+wasi-snapshot-preview1.bazel | 13 + .../BUILD.wasm-bindgen-0.2.126.bazel | 19 +- .../BUILD.wasm-bindgen-macro-0.2.126.bazel | 13 + ...D.wasm-bindgen-macro-support-0.2.126.bazel | 13 + .../BUILD.wasm-bindgen-shared-0.2.126.bazel | 19 +- .../BUILD.winapi-util-0.1.11.bazel | 13 + .../BUILD.windows-core-0.62.2.bazel | 13 + .../BUILD.windows-implement-0.60.2.bazel | 13 + .../BUILD.windows-interface-0.59.3.bazel | 13 + .../BUILD.windows-link-0.2.1.bazel | 13 + .../BUILD.windows-result-0.4.1.bazel | 13 + .../BUILD.windows-strings-0.5.1.bazel | 13 + .../BUILD.windows-sys-0.60.2.bazel | 13 + .../BUILD.windows-sys-0.61.2.bazel | 13 + .../BUILD.windows-targets-0.53.5.bazel | 13 + ...BUILD.windows_aarch64_gnullvm-0.53.1.bazel | 19 +- .../BUILD.windows_aarch64_msvc-0.53.1.bazel | 19 +- .../BUILD.windows_i686_gnu-0.53.1.bazel | 19 +- .../BUILD.windows_i686_gnullvm-0.53.1.bazel | 19 +- .../BUILD.windows_i686_msvc-0.53.1.bazel | 19 +- .../BUILD.windows_x86_64_gnu-0.53.1.bazel | 19 +- .../BUILD.windows_x86_64_gnullvm-0.53.1.bazel | 19 +- .../BUILD.windows_x86_64_msvc-0.53.1.bazel | 19 +- .../BUILD.winnow-0.7.15.bazel | 13 + .../BUILD.winnow-1.0.4.bazel | 13 + .../BUILD.yansi-1.0.1.bazel | 13 + .../BUILD.zmij-1.0.23.bazel | 19 +- .../BUILD.zstd-0.13.3.bazel | 13 + .../BUILD.zstd-safe-7.2.4.bazel | 19 +- .../BUILD.zstd-sys-2.0.16+zstd.1.5.7.bazel | 19 +- .../anyhow-1.0.104/BUILD.bazel | 15 + .../anyhow/BUILD.bazel | 15 + .../argfile-1.0.0/BUILD.bazel | 15 + .../argfile/BUILD.bazel | 15 + .../chalk-ir-0.104.0/BUILD.bazel | 15 + .../chalk-ir/BUILD.bazel | 15 + .../chrono-0.4.45/BUILD.bazel | 15 + .../chrono/BUILD.bazel | 15 + .../clap-4.6.6/BUILD.bazel | 15 + .../clap/BUILD.bazel | 15 + .../tree_sitter_extractors_deps/crates.bzl | 4127 ++++++++++++++++- .../tree_sitter_extractors_deps/defs.bzl | 4091 +--------------- .../dunce-1.0.5/BUILD.bazel | 15 + .../dunce/BUILD.bazel | 15 + .../either-1.17.0/BUILD.bazel | 15 + .../either/BUILD.bazel | 15 + .../encoding-0.2.33/BUILD.bazel | 15 + .../encoding/BUILD.bazel | 15 + .../figment-0.10.19/BUILD.bazel | 15 + .../figment/BUILD.bazel | 15 + .../flate2-1.1.9/BUILD.bazel | 15 + .../flate2/BUILD.bazel | 15 + .../glob-0.3.4/BUILD.bazel | 15 + .../glob/BUILD.bazel | 15 + .../globset-0.4.18/BUILD.bazel | 15 + .../globset/BUILD.bazel | 15 + .../itertools-0.15.0/BUILD.bazel | 15 + .../itertools/BUILD.bazel | 15 + .../lazy_static-1.5.0/BUILD.bazel | 15 + .../lazy_static/BUILD.bazel | 15 + .../mustache-0.9.0/BUILD.bazel | 15 + .../mustache/BUILD.bazel | 15 + .../num-traits-0.2.19/BUILD.bazel | 15 + .../num-traits/BUILD.bazel | 15 + .../num_cpus-1.17.0/BUILD.bazel | 15 + .../num_cpus/BUILD.bazel | 15 + .../proc-macro2-1.0.107/BUILD.bazel | 15 + .../proc-macro2/BUILD.bazel | 15 + .../quote-1.0.47/BUILD.bazel | 15 + .../quote/BUILD.bazel | 15 + .../ra_ap_base_db-0.0.347/BUILD.bazel | 15 + .../ra_ap_base_db/BUILD.bazel | 15 + .../ra_ap_cfg-0.0.347/BUILD.bazel | 15 + .../ra_ap_cfg/BUILD.bazel | 15 + .../ra_ap_hir-0.0.347/BUILD.bazel | 15 + .../ra_ap_hir/BUILD.bazel | 15 + .../ra_ap_hir_def-0.0.347/BUILD.bazel | 15 + .../ra_ap_hir_def/BUILD.bazel | 15 + .../ra_ap_hir_expand-0.0.347/BUILD.bazel | 15 + .../ra_ap_hir_expand/BUILD.bazel | 15 + .../ra_ap_hir_ty-0.0.347/BUILD.bazel | 15 + .../ra_ap_hir_ty/BUILD.bazel | 15 + .../ra_ap_ide_db-0.0.347/BUILD.bazel | 15 + .../ra_ap_ide_db/BUILD.bazel | 15 + .../ra_ap_intern-0.0.347/BUILD.bazel | 15 + .../ra_ap_intern/BUILD.bazel | 15 + .../ra_ap_load-cargo-0.0.347/BUILD.bazel | 15 + .../ra_ap_load-cargo/BUILD.bazel | 15 + .../ra_ap_parser-0.0.347/BUILD.bazel | 15 + .../ra_ap_parser/BUILD.bazel | 15 + .../ra_ap_paths-0.0.347/BUILD.bazel | 15 + .../ra_ap_paths/BUILD.bazel | 15 + .../ra_ap_project_model-0.0.347/BUILD.bazel | 15 + .../ra_ap_project_model/BUILD.bazel | 15 + .../ra_ap_span-0.0.347/BUILD.bazel | 15 + .../ra_ap_span/BUILD.bazel | 15 + .../ra_ap_stdx-0.0.347/BUILD.bazel | 15 + .../ra_ap_syntax-0.0.347/BUILD.bazel | 15 + .../ra_ap_syntax-bridge-0.0.347/BUILD.bazel | 15 + .../ra_ap_syntax-bridge/BUILD.bazel | 15 + .../ra_ap_syntax/BUILD.bazel | 15 + .../ra_ap_vfs-0.0.347/BUILD.bazel | 15 + .../ra_ap_vfs/BUILD.bazel | 15 + .../rand-0.10.2/BUILD.bazel | 15 + .../rand/BUILD.bazel | 15 + .../rayon-1.12.0/BUILD.bazel | 15 + .../rayon/BUILD.bazel | 15 + .../regex-1.13.1/BUILD.bazel | 15 + .../regex/BUILD.bazel | 15 + .../serde-1.0.229/BUILD.bazel | 15 + .../serde/BUILD.bazel | 15 + .../serde_json-1.0.151/BUILD.bazel | 15 + .../serde_json/BUILD.bazel | 15 + .../serde_with-3.22.0/BUILD.bazel | 15 + .../serde_with/BUILD.bazel | 15 + .../serde_yaml-0.9.34+deprecated/BUILD.bazel | 15 + .../serde_yaml/BUILD.bazel | 15 + .../stdx-0.0.347/BUILD.bazel | 15 + .../stdx/BUILD.bazel | 15 + .../syn-3.0.3/BUILD.bazel | 15 + .../syn/BUILD.bazel | 15 + .../toml-1.1.4+spec-1.1.0/BUILD.bazel | 15 + .../toml/BUILD.bazel | 15 + .../tracing-0.1.44/BUILD.bazel | 15 + .../tracing-flame-0.2.0/BUILD.bazel | 15 + .../tracing-flame/BUILD.bazel | 15 + .../tracing-subscriber-0.3.23/BUILD.bazel | 15 + .../tracing-subscriber/BUILD.bazel | 15 + .../tracing/BUILD.bazel | 15 + .../tree-sitter-0.26.9/BUILD.bazel | 15 + .../BUILD.bazel | 15 + .../tree-sitter-embedded-template/BUILD.bazel | 15 + .../tree-sitter-json-0.24.8/BUILD.bazel | 15 + .../tree-sitter-json/BUILD.bazel | 15 + .../tree-sitter-python-0.25.0/BUILD.bazel | 15 + .../tree-sitter-python/BUILD.bazel | 15 + .../tree-sitter-ql-0.23.1/BUILD.bazel | 15 + .../tree-sitter-ql/BUILD.bazel | 15 + .../tree-sitter-ruby-0.23.1/BUILD.bazel | 15 + .../tree-sitter-ruby/BUILD.bazel | 15 + .../tree-sitter/BUILD.bazel | 15 + .../triomphe-0.1.16/BUILD.bazel | 15 + .../triomphe/BUILD.bazel | 15 + .../ungrammar-1.16.1/BUILD.bazel | 15 + .../ungrammar/BUILD.bazel | 15 + .../zstd-0.13.3/BUILD.bazel | 15 + .../zstd/BUILD.bazel | 15 + 501 files changed, 12435 insertions(+), 5135 deletions(-) create mode 100644 misc/bazel/3rdparty/py_deps/anyhow-1.0.95/BUILD.bazel create mode 100644 misc/bazel/3rdparty/py_deps/anyhow/BUILD.bazel create mode 100644 misc/bazel/3rdparty/py_deps/cc-1.2.14/BUILD.bazel create mode 100644 misc/bazel/3rdparty/py_deps/cc/BUILD.bazel create mode 100644 misc/bazel/3rdparty/py_deps/clap-4.5.30/BUILD.bazel create mode 100644 misc/bazel/3rdparty/py_deps/clap/BUILD.bazel create mode 100644 misc/bazel/3rdparty/py_deps/regex-1.11.1/BUILD.bazel create mode 100644 misc/bazel/3rdparty/py_deps/regex/BUILD.bazel create mode 100644 misc/bazel/3rdparty/py_deps/tree-sitter-0.24.7/BUILD.bazel create mode 100644 misc/bazel/3rdparty/py_deps/tree-sitter-graph-0.12.0/BUILD.bazel create mode 100644 misc/bazel/3rdparty/py_deps/tree-sitter-graph/BUILD.bazel create mode 100644 misc/bazel/3rdparty/py_deps/tree-sitter/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/anyhow-1.0.104/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/anyhow/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/argfile-1.0.0/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/argfile/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/chalk-ir-0.104.0/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/chalk-ir/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/chrono-0.4.45/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/chrono/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/clap-4.6.6/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/clap/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/dunce-1.0.5/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/dunce/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/either-1.17.0/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/either/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/encoding-0.2.33/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/encoding/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/figment-0.10.19/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/figment/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/flate2-1.1.9/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/flate2/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/glob-0.3.4/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/glob/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/globset-0.4.18/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/globset/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/itertools-0.15.0/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/itertools/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/lazy_static-1.5.0/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/lazy_static/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/mustache-0.9.0/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/mustache/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/num-traits-0.2.19/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/num-traits/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/num_cpus-1.17.0/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/num_cpus/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/proc-macro2-1.0.107/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/proc-macro2/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/quote-1.0.47/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/quote/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_base_db-0.0.347/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_base_db/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_cfg-0.0.347/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_cfg/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir-0.0.347/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir_def-0.0.347/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir_def/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir_expand-0.0.347/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir_expand/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir_ty-0.0.347/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir_ty/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_ide_db-0.0.347/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_ide_db/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_intern-0.0.347/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_intern/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_load-cargo-0.0.347/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_load-cargo/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_parser-0.0.347/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_parser/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_paths-0.0.347/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_paths/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_project_model-0.0.347/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_project_model/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_span-0.0.347/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_span/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_stdx-0.0.347/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_syntax-0.0.347/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_syntax-bridge-0.0.347/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_syntax-bridge/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_syntax/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_vfs-0.0.347/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_vfs/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/rand-0.10.2/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/rand/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/rayon-1.12.0/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/rayon/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/regex-1.13.1/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/regex/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/serde-1.0.229/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/serde/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/serde_json-1.0.151/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/serde_json/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/serde_with-3.22.0/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/serde_with/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/serde_yaml-0.9.34+deprecated/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/serde_yaml/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/stdx-0.0.347/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/stdx/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/syn-3.0.3/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/syn/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/toml-1.1.4+spec-1.1.0/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/toml/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/tracing-0.1.44/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/tracing-flame-0.2.0/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/tracing-flame/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/tracing-subscriber-0.3.23/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/tracing-subscriber/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/tracing/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-0.26.9/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-embedded-template-0.25.0/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-embedded-template/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-json-0.24.8/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-json/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-python-0.25.0/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-python/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-ql-0.23.1/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-ql/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-ruby-0.23.1/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-ruby/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/triomphe-0.1.16/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/triomphe/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ungrammar-1.16.1/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ungrammar/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/zstd-0.13.3/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/zstd/BUILD.bazel diff --git a/MODULE.bazel b/MODULE.bazel index b3091c3f5f18..0144414b6fc9 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -94,6 +94,7 @@ register_toolchains("@rust_toolchains//:all") py_deps = use_extension("//misc/bazel/3rdparty:py_deps_extension.bzl", "p") use_repo( py_deps, + "vendor_py", "vendor_py__anyhow-1.0.95", "vendor_py__cc-1.2.14", "vendor_py__clap-4.5.30", @@ -107,6 +108,7 @@ use_repo( tree_sitter_extractors_deps = use_extension("//misc/bazel/3rdparty:tree_sitter_extractors_extension.bzl", "r") use_repo( tree_sitter_extractors_deps, + "vendor_ts", "vendor_ts__anyhow-1.0.104", "vendor_ts__argfile-1.0.0", "vendor_ts__chalk-ir-0.104.0", diff --git a/misc/bazel/3rdparty/py_deps/BUILD.aho-corasick-1.1.3.bazel b/misc/bazel/3rdparty/py_deps/BUILD.aho-corasick-1.1.3.bazel index 19fb311dc775..67430ddf867d 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.aho-corasick-1.1.3.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.aho-corasick-1.1.3.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.anstream-0.6.18.bazel b/misc/bazel/3rdparty/py_deps/BUILD.anstream-0.6.18.bazel index c447208da1e7..3f1fe4694c67 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.anstream-0.6.18.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.anstream-0.6.18.bazel @@ -57,12 +57,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -74,13 +76,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -88,6 +100,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.anstyle-1.0.10.bazel b/misc/bazel/3rdparty/py_deps/BUILD.anstyle-1.0.10.bazel index 5646802d7c87..374fbe3ce6d5 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.anstyle-1.0.10.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.anstyle-1.0.10.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.anstyle-parse-0.2.6.bazel b/misc/bazel/3rdparty/py_deps/BUILD.anstyle-parse-0.2.6.bazel index a3db2f4cf0e2..a70f05b61fbd 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.anstyle-parse-0.2.6.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.anstyle-parse-0.2.6.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.anstyle-query-1.1.2.bazel b/misc/bazel/3rdparty/py_deps/BUILD.anstyle-query-1.1.2.bazel index 974053fa2105..358cbf6c5230 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.anstyle-query-1.1.2.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.anstyle-query-1.1.2.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.anstyle-wincon-3.0.7.bazel b/misc/bazel/3rdparty/py_deps/BUILD.anstyle-wincon-3.0.7.bazel index 4e55fe14335f..40668f3a5498 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.anstyle-wincon-3.0.7.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.anstyle-wincon-3.0.7.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.anyhow-1.0.95.bazel b/misc/bazel/3rdparty/py_deps/BUILD.anyhow-1.0.95.bazel index c2bbc00cde76..cb9802c5fbe7 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.anyhow-1.0.95.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.anyhow-1.0.95.bazel @@ -60,12 +60,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -77,13 +79,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -91,6 +103,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -103,7 +116,7 @@ rust_library( }), version = "1.0.95", deps = [ - "@vendor_py__anyhow-1.0.95//:build_script_build", + ":build_script_build", ], ) @@ -113,6 +126,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -145,6 +161,7 @@ cargo_build_script( ], ), edition = "2018", + emit_warnings = False, pkg_name = "anyhow", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/py_deps/BUILD.bazel b/misc/bazel/3rdparty/py_deps/BUILD.bazel index 86bfde266419..a4059e6a3db9 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.bazel @@ -102,15 +102,3 @@ alias( actual = "@vendor_py__tree-sitter-graph-0.12.0//:tree_sitter_graph", tags = ["manual"], ) - -alias( - name = "tsp-0.19.0", - actual = "@vendor_py__tsp-0.19.0//:tsp", - tags = ["manual"], -) - -alias( - name = "tsp", - actual = "@vendor_py__tsp-0.19.0//:tsp", - tags = ["manual"], -) diff --git a/misc/bazel/3rdparty/py_deps/BUILD.cc-1.2.14.bazel b/misc/bazel/3rdparty/py_deps/BUILD.cc-1.2.14.bazel index eb579ddb2fe5..9303689d18e8 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.cc-1.2.14.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.cc-1.2.14.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.clap-4.5.30.bazel b/misc/bazel/3rdparty/py_deps/BUILD.clap-4.5.30.bazel index 7846c81d4b7f..95778c79e333 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.clap-4.5.30.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.clap-4.5.30.bazel @@ -61,12 +61,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -78,13 +80,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -92,6 +104,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.clap_builder-4.5.30.bazel b/misc/bazel/3rdparty/py_deps/BUILD.clap_builder-4.5.30.bazel index 9e32f334ec28..7032210081db 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.clap_builder-4.5.30.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.clap_builder-4.5.30.bazel @@ -60,12 +60,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -77,13 +79,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -91,6 +103,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.clap_lex-0.7.4.bazel b/misc/bazel/3rdparty/py_deps/BUILD.clap_lex-0.7.4.bazel index 7e672468ebb7..2e744e19f1ae 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.clap_lex-0.7.4.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.clap_lex-0.7.4.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.colorchoice-1.0.3.bazel b/misc/bazel/3rdparty/py_deps/BUILD.colorchoice-1.0.3.bazel index f9a26a33bf39..6da8a1f3df80 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.colorchoice-1.0.3.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.colorchoice-1.0.3.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.is_terminal_polyfill-1.70.1.bazel b/misc/bazel/3rdparty/py_deps/BUILD.is_terminal_polyfill-1.70.1.bazel index acd21224d113..05926bb971c5 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.is_terminal_polyfill-1.70.1.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.is_terminal_polyfill-1.70.1.bazel @@ -55,12 +55,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -72,13 +74,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -86,6 +98,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.itoa-1.0.14.bazel b/misc/bazel/3rdparty/py_deps/BUILD.itoa-1.0.14.bazel index 1121f1c6fa81..0dffc34791c8 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.itoa-1.0.14.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.itoa-1.0.14.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.log-0.4.25.bazel b/misc/bazel/3rdparty/py_deps/BUILD.log-0.4.25.bazel index a6e892fc3e2d..7f8cd3b094d6 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.log-0.4.25.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.log-0.4.25.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.memchr-2.7.4.bazel b/misc/bazel/3rdparty/py_deps/BUILD.memchr-2.7.4.bazel index 92c05c115761..54e543b134e6 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.memchr-2.7.4.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.memchr-2.7.4.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.once_cell-1.20.3.bazel b/misc/bazel/3rdparty/py_deps/BUILD.once_cell-1.20.3.bazel index d9b023658c41..e119c92111cc 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.once_cell-1.20.3.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.once_cell-1.20.3.bazel @@ -58,12 +58,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -75,13 +77,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -89,6 +101,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.proc-macro2-1.0.93.bazel b/misc/bazel/3rdparty/py_deps/BUILD.proc-macro2-1.0.93.bazel index de386a5fb136..73045c65b539 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.proc-macro2-1.0.93.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.proc-macro2-1.0.93.bazel @@ -60,12 +60,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -77,13 +79,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -91,6 +103,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -103,7 +116,7 @@ rust_library( }), version = "1.0.93", deps = [ - "@vendor_py__proc-macro2-1.0.93//:build_script_build", + ":build_script_build", "@vendor_py__unicode-ident-1.0.16//:unicode_ident", ], ) @@ -114,6 +127,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -146,6 +162,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "proc-macro2", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/py_deps/BUILD.quote-1.0.38.bazel b/misc/bazel/3rdparty/py_deps/BUILD.quote-1.0.38.bazel index fd1be0541615..a62648df9576 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.quote-1.0.38.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.quote-1.0.38.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.regex-1.11.1.bazel b/misc/bazel/3rdparty/py_deps/BUILD.regex-1.11.1.bazel index 4363055577d1..c8549ff105ca 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.regex-1.11.1.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.regex-1.11.1.bazel @@ -71,12 +71,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -88,13 +90,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -102,6 +114,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.regex-automata-0.4.9.bazel b/misc/bazel/3rdparty/py_deps/BUILD.regex-automata-0.4.9.bazel index ed2546bbd8af..5c61023243fd 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.regex-automata-0.4.9.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.regex-automata-0.4.9.bazel @@ -76,12 +76,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -93,13 +95,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -107,6 +119,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.regex-syntax-0.8.5.bazel b/misc/bazel/3rdparty/py_deps/BUILD.regex-syntax-0.8.5.bazel index 59c590873031..6b1480dce01a 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.regex-syntax-0.8.5.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.regex-syntax-0.8.5.bazel @@ -64,12 +64,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -81,13 +83,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -95,6 +107,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.ryu-1.0.19.bazel b/misc/bazel/3rdparty/py_deps/BUILD.ryu-1.0.19.bazel index 275c416bec69..d598e526522a 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.ryu-1.0.19.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.ryu-1.0.19.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.serde-1.0.217.bazel b/misc/bazel/3rdparty/py_deps/BUILD.serde-1.0.217.bazel index 04b9339ef8e8..a3b116bd4118 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.serde-1.0.217.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.serde-1.0.217.bazel @@ -60,12 +60,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -77,13 +79,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -91,6 +103,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -103,7 +116,7 @@ rust_library( }), version = "1.0.217", deps = [ - "@vendor_py__serde-1.0.217//:build_script_build", + ":build_script_build", ], ) @@ -113,6 +126,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -145,6 +161,7 @@ cargo_build_script( ], ), edition = "2018", + emit_warnings = False, pkg_name = "serde", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/py_deps/BUILD.serde_derive-1.0.217.bazel b/misc/bazel/3rdparty/py_deps/BUILD.serde_derive-1.0.217.bazel index 3836976f89e6..ad6bea845a88 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.serde_derive-1.0.217.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.serde_derive-1.0.217.bazel @@ -52,12 +52,14 @@ rust_proc_macro( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_proc_macro( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_proc_macro( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.serde_json-1.0.138.bazel b/misc/bazel/3rdparty/py_deps/BUILD.serde_json-1.0.138.bazel index c36081cf1331..50ea1828c00e 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.serde_json-1.0.138.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.serde_json-1.0.138.bazel @@ -60,12 +60,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -77,13 +79,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -91,6 +103,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -103,11 +116,11 @@ rust_library( }), version = "1.0.138", deps = [ + ":build_script_build", "@vendor_py__itoa-1.0.14//:itoa", "@vendor_py__memchr-2.7.4//:memchr", "@vendor_py__ryu-1.0.19//:ryu", "@vendor_py__serde-1.0.217//:serde", - "@vendor_py__serde_json-1.0.138//:build_script_build", ], ) @@ -117,6 +130,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -149,6 +165,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "serde_json", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/py_deps/BUILD.shlex-1.3.0.bazel b/misc/bazel/3rdparty/py_deps/BUILD.shlex-1.3.0.bazel index 8de318e16ce3..7ad7a1fa71bd 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.shlex-1.3.0.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.shlex-1.3.0.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.smallvec-1.14.0.bazel b/misc/bazel/3rdparty/py_deps/BUILD.smallvec-1.14.0.bazel index afc560f32d27..6f3e09e2f8b2 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.smallvec-1.14.0.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.smallvec-1.14.0.bazel @@ -55,12 +55,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -72,13 +74,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -86,6 +98,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.streaming-iterator-0.1.9.bazel b/misc/bazel/3rdparty/py_deps/BUILD.streaming-iterator-0.1.9.bazel index 1fb4f82d40ba..6e1f7d009ec4 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.streaming-iterator-0.1.9.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.streaming-iterator-0.1.9.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.strsim-0.11.1.bazel b/misc/bazel/3rdparty/py_deps/BUILD.strsim-0.11.1.bazel index a350fe401c64..502076f07593 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.strsim-0.11.1.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.strsim-0.11.1.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.syn-2.0.98.bazel b/misc/bazel/3rdparty/py_deps/BUILD.syn-2.0.98.bazel index 756de2c409a7..53a38fda064f 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.syn-2.0.98.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.syn-2.0.98.bazel @@ -60,12 +60,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -77,13 +79,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -91,6 +103,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.thiserror-1.0.69.bazel b/misc/bazel/3rdparty/py_deps/BUILD.thiserror-1.0.69.bazel index 4c5de7875052..ae33aae79229 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.thiserror-1.0.69.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.thiserror-1.0.69.bazel @@ -59,12 +59,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -76,13 +78,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -90,6 +102,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -102,7 +115,7 @@ rust_library( }), version = "1.0.69", deps = [ - "@vendor_py__thiserror-1.0.69//:build_script_build", + ":build_script_build", ], ) @@ -112,6 +125,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -140,6 +156,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "thiserror", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/py_deps/BUILD.thiserror-impl-1.0.69.bazel b/misc/bazel/3rdparty/py_deps/BUILD.thiserror-impl-1.0.69.bazel index f2b15bc166fd..7beef57d9608 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.thiserror-impl-1.0.69.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.thiserror-impl-1.0.69.bazel @@ -52,12 +52,14 @@ rust_proc_macro( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_proc_macro( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_proc_macro( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.tree-sitter-0.24.7.bazel b/misc/bazel/3rdparty/py_deps/BUILD.tree-sitter-0.24.7.bazel index 475770bc9575..2858d4c5136b 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.tree-sitter-0.24.7.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.tree-sitter-0.24.7.bazel @@ -60,12 +60,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -77,13 +79,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -91,6 +103,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -103,10 +116,10 @@ rust_library( }), version = "0.24.7", deps = [ + ":build_script_build", "@vendor_py__regex-1.11.1//:regex", "@vendor_py__regex-syntax-0.8.5//:regex_syntax", "@vendor_py__streaming-iterator-0.1.9//:streaming_iterator", - "@vendor_py__tree-sitter-0.24.7//:build_script_build", "@vendor_py__tree-sitter-language-0.1.5//:tree_sitter_language", ], ) @@ -117,6 +130,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -149,6 +165,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, links = "tree-sitter", pkg_name = "tree-sitter", rustc_env_files = [ diff --git a/misc/bazel/3rdparty/py_deps/BUILD.tree-sitter-graph-0.12.0.bazel b/misc/bazel/3rdparty/py_deps/BUILD.tree-sitter-graph-0.12.0.bazel index 3a5a51895a64..91b0d1eadf65 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.tree-sitter-graph-0.12.0.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.tree-sitter-graph-0.12.0.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.tree-sitter-language-0.1.5.bazel b/misc/bazel/3rdparty/py_deps/BUILD.tree-sitter-language-0.1.5.bazel index e35100f228a8..14ccbfade289 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.tree-sitter-language-0.1.5.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.tree-sitter-language-0.1.5.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.unicode-ident-1.0.16.bazel b/misc/bazel/3rdparty/py_deps/BUILD.unicode-ident-1.0.16.bazel index 9754167cc21f..63420f8a0fc0 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.unicode-ident-1.0.16.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.unicode-ident-1.0.16.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.utf8parse-0.2.2.bazel b/misc/bazel/3rdparty/py_deps/BUILD.utf8parse-0.2.2.bazel index 813c2349a879..e53fb8eb55c1 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.utf8parse-0.2.2.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.utf8parse-0.2.2.bazel @@ -55,12 +55,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -72,13 +74,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -86,6 +98,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.windows-sys-0.59.0.bazel b/misc/bazel/3rdparty/py_deps/BUILD.windows-sys-0.59.0.bazel index 1c3cf791f0f4..f2d6e69bfdb0 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.windows-sys-0.59.0.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.windows-sys-0.59.0.bazel @@ -59,12 +59,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -76,13 +78,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -90,6 +102,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.windows-targets-0.52.6.bazel b/misc/bazel/3rdparty/py_deps/BUILD.windows-targets-0.52.6.bazel index eab2d9200442..caef5d4be7ab 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.windows-targets-0.52.6.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.windows-targets-0.52.6.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/py_deps/BUILD.windows_aarch64_gnullvm-0.52.6.bazel b/misc/bazel/3rdparty/py_deps/BUILD.windows_aarch64_gnullvm-0.52.6.bazel index 413560f9a9a4..201dc214ec5e 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.windows_aarch64_gnullvm-0.52.6.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.windows_aarch64_gnullvm-0.52.6.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,7 +112,7 @@ rust_library( }), version = "0.52.6", deps = [ - "@vendor_py__windows_aarch64_gnullvm-0.52.6//:build_script_build", + ":build_script_build", ], ) @@ -109,6 +122,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -137,6 +153,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "windows_aarch64_gnullvm", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/py_deps/BUILD.windows_aarch64_msvc-0.52.6.bazel b/misc/bazel/3rdparty/py_deps/BUILD.windows_aarch64_msvc-0.52.6.bazel index 41270f37827d..eaa95b7effe5 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.windows_aarch64_msvc-0.52.6.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.windows_aarch64_msvc-0.52.6.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,7 +112,7 @@ rust_library( }), version = "0.52.6", deps = [ - "@vendor_py__windows_aarch64_msvc-0.52.6//:build_script_build", + ":build_script_build", ], ) @@ -109,6 +122,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -137,6 +153,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "windows_aarch64_msvc", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/py_deps/BUILD.windows_i686_gnu-0.52.6.bazel b/misc/bazel/3rdparty/py_deps/BUILD.windows_i686_gnu-0.52.6.bazel index 635e04fb829f..4417810cacae 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.windows_i686_gnu-0.52.6.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.windows_i686_gnu-0.52.6.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,7 +112,7 @@ rust_library( }), version = "0.52.6", deps = [ - "@vendor_py__windows_i686_gnu-0.52.6//:build_script_build", + ":build_script_build", ], ) @@ -109,6 +122,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -137,6 +153,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "windows_i686_gnu", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/py_deps/BUILD.windows_i686_gnullvm-0.52.6.bazel b/misc/bazel/3rdparty/py_deps/BUILD.windows_i686_gnullvm-0.52.6.bazel index aa701fa5f9e1..e027b79a0dfe 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.windows_i686_gnullvm-0.52.6.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.windows_i686_gnullvm-0.52.6.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,7 +112,7 @@ rust_library( }), version = "0.52.6", deps = [ - "@vendor_py__windows_i686_gnullvm-0.52.6//:build_script_build", + ":build_script_build", ], ) @@ -109,6 +122,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -137,6 +153,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "windows_i686_gnullvm", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/py_deps/BUILD.windows_i686_msvc-0.52.6.bazel b/misc/bazel/3rdparty/py_deps/BUILD.windows_i686_msvc-0.52.6.bazel index 51a7afa148f3..b658f58affd4 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.windows_i686_msvc-0.52.6.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.windows_i686_msvc-0.52.6.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,7 +112,7 @@ rust_library( }), version = "0.52.6", deps = [ - "@vendor_py__windows_i686_msvc-0.52.6//:build_script_build", + ":build_script_build", ], ) @@ -109,6 +122,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -137,6 +153,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "windows_i686_msvc", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/py_deps/BUILD.windows_x86_64_gnu-0.52.6.bazel b/misc/bazel/3rdparty/py_deps/BUILD.windows_x86_64_gnu-0.52.6.bazel index 95bb840fe66c..56e8b8bced09 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.windows_x86_64_gnu-0.52.6.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.windows_x86_64_gnu-0.52.6.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,7 +112,7 @@ rust_library( }), version = "0.52.6", deps = [ - "@vendor_py__windows_x86_64_gnu-0.52.6//:build_script_build", + ":build_script_build", ], ) @@ -109,6 +122,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -137,6 +153,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "windows_x86_64_gnu", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/py_deps/BUILD.windows_x86_64_gnullvm-0.52.6.bazel b/misc/bazel/3rdparty/py_deps/BUILD.windows_x86_64_gnullvm-0.52.6.bazel index e7cc05336f3f..c4a7d1a89087 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.windows_x86_64_gnullvm-0.52.6.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.windows_x86_64_gnullvm-0.52.6.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,7 +112,7 @@ rust_library( }), version = "0.52.6", deps = [ - "@vendor_py__windows_x86_64_gnullvm-0.52.6//:build_script_build", + ":build_script_build", ], ) @@ -109,6 +122,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -137,6 +153,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "windows_x86_64_gnullvm", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/py_deps/BUILD.windows_x86_64_msvc-0.52.6.bazel b/misc/bazel/3rdparty/py_deps/BUILD.windows_x86_64_msvc-0.52.6.bazel index dd7abf4671c5..6df588218373 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.windows_x86_64_msvc-0.52.6.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.windows_x86_64_msvc-0.52.6.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,7 +112,7 @@ rust_library( }), version = "0.52.6", deps = [ - "@vendor_py__windows_x86_64_msvc-0.52.6//:build_script_build", + ":build_script_build", ], ) @@ -109,6 +122,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -137,6 +153,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "windows_x86_64_msvc", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/py_deps/anyhow-1.0.95/BUILD.bazel b/misc/bazel/3rdparty/py_deps/anyhow-1.0.95/BUILD.bazel new file mode 100644 index 000000000000..37bc215de0df --- /dev/null +++ b/misc/bazel/3rdparty/py_deps/anyhow-1.0.95/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_py_deps +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "anyhow-1.0.95", + actual = "@vendor_py__anyhow-1.0.95//:anyhow", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/py_deps/anyhow/BUILD.bazel b/misc/bazel/3rdparty/py_deps/anyhow/BUILD.bazel new file mode 100644 index 000000000000..d9ce76974ca2 --- /dev/null +++ b/misc/bazel/3rdparty/py_deps/anyhow/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_py_deps +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "anyhow", + actual = "@vendor_py__anyhow-1.0.95//:anyhow", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/py_deps/cc-1.2.14/BUILD.bazel b/misc/bazel/3rdparty/py_deps/cc-1.2.14/BUILD.bazel new file mode 100644 index 000000000000..a16530a5d741 --- /dev/null +++ b/misc/bazel/3rdparty/py_deps/cc-1.2.14/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_py_deps +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "cc-1.2.14", + actual = "@vendor_py__cc-1.2.14//:cc", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/py_deps/cc/BUILD.bazel b/misc/bazel/3rdparty/py_deps/cc/BUILD.bazel new file mode 100644 index 000000000000..d8c3fb6ea8d0 --- /dev/null +++ b/misc/bazel/3rdparty/py_deps/cc/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_py_deps +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "cc", + actual = "@vendor_py__cc-1.2.14//:cc", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/py_deps/clap-4.5.30/BUILD.bazel b/misc/bazel/3rdparty/py_deps/clap-4.5.30/BUILD.bazel new file mode 100644 index 000000000000..8ebf45139946 --- /dev/null +++ b/misc/bazel/3rdparty/py_deps/clap-4.5.30/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_py_deps +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "clap-4.5.30", + actual = "@vendor_py__clap-4.5.30//:clap", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/py_deps/clap/BUILD.bazel b/misc/bazel/3rdparty/py_deps/clap/BUILD.bazel new file mode 100644 index 000000000000..ee7c930d1645 --- /dev/null +++ b/misc/bazel/3rdparty/py_deps/clap/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_py_deps +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "clap", + actual = "@vendor_py__clap-4.5.30//:clap", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/py_deps/crates.bzl b/misc/bazel/3rdparty/py_deps/crates.bzl index 3979d0073368..bca10349236c 100644 --- a/misc/bazel/3rdparty/py_deps/crates.bzl +++ b/misc/bazel/3rdparty/py_deps/crates.bzl @@ -1,21 +1,496 @@ ############################################################################### # @generated -# This file is auto-generated by the cargo-bazel tool. +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: # -# DO NOT MODIFY: Local changes may be replaced in future executions. +# bazel run @@//misc/bazel/3rdparty:vendor_py_deps ############################################################################### -"""Rules for defining repositories for remote `crates_vendor` repositories""" +""" +# `crates_repository` API +- [aliases](#aliases) +- [crate_edition](#crate_edition) +- [crate_deps](#crate_deps) +- [all_crate_deps](#all_crate_deps) +- [crate_repositories](#crate_repositories) + +""" + +load("@bazel_skylib//lib:selects.bzl", "selects") +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") +load("@rules_rust//crate_universe:defs.bzl", "crates_vendor_remote_repository") + +############################################################################### +# MACROS API +############################################################################### + +# An identifier that represent common dependencies (unconditional). +_COMMON_CONDITION = "" + +def _flatten_dependency_maps(all_dependency_maps): + """Flatten a list of dependency maps into one dictionary. + + Dependency maps have the following structure: + + ```python + DEPENDENCIES_MAP = { + # The first key in the map is a Bazel package + # name of the workspace this file is defined in. + "workspace_member_package": { + + # Not all dependencies are supported for all platforms. + # the condition key is the condition required to be true + # on the host platform. + "condition": { + + # An alias to a crate target. # The label of the crate target the + # Aliases are only crate names. # package name refers to. + "package_name": "@full//:label", + } + } + } + ``` + + Args: + all_dependency_maps (list): A list of dicts as described above + + Returns: + dict: A dictionary as described above + """ + dependencies = {} + + for workspace_deps_map in all_dependency_maps: + for pkg_name, conditional_deps_map in workspace_deps_map.items(): + if pkg_name not in dependencies: + non_frozen_map = dict() + for key, values in conditional_deps_map.items(): + non_frozen_map.update({key: dict(values.items())}) + dependencies.setdefault(pkg_name, non_frozen_map) + continue + + for condition, deps_map in conditional_deps_map.items(): + # If the condition has not been recorded, do so and continue + if condition not in dependencies[pkg_name]: + dependencies[pkg_name].setdefault(condition, dict(deps_map.items())) + continue + + # Alert on any miss-matched dependencies + inconsistent_entries = [] + for crate_name, crate_label in deps_map.items(): + existing = dependencies[pkg_name][condition].get(crate_name) + if existing and existing != crate_label: + inconsistent_entries.append((crate_name, existing, crate_label)) + dependencies[pkg_name][condition].update({crate_name: crate_label}) + + return dependencies + +def crate_deps(deps, package_name = None): + """Finds the fully qualified label of the requested crates for the package where this macro is called. + + Args: + deps (list): The desired list of crate targets. + package_name (str, optional): The package name of the set of dependencies to look up. + Defaults to `native.package_name()`. + + Returns: + list: A list of labels to generated rust targets (str) + """ + + if not deps: + return [] + + if package_name == None: + package_name = native.package_name() + + # Join both sets of dependencies + dependencies = _flatten_dependency_maps([ + _NORMAL_DEPENDENCIES, + _NORMAL_DEV_DEPENDENCIES, + _PROC_MACRO_DEPENDENCIES, + _PROC_MACRO_DEV_DEPENDENCIES, + _BUILD_DEPENDENCIES, + _BUILD_PROC_MACRO_DEPENDENCIES, + ]).pop(package_name, {}) + + # Combine all conditional packages so we can easily index over a flat list + # TODO: Perhaps this should actually return select statements and maintain + # the conditionals of the dependencies + flat_deps = {} + for deps_set in dependencies.values(): + for crate_name, crate_label in deps_set.items(): + flat_deps.update({crate_name: crate_label}) + + missing_crates = [] + crate_targets = [] + for crate_target in deps: + if crate_target not in flat_deps: + missing_crates.append(crate_target) + else: + crate_targets.append(flat_deps[crate_target]) + + if missing_crates: + fail("Could not find crates `{}` among dependencies of `{}`. Available dependencies were `{}`".format( + missing_crates, + package_name, + dependencies, + )) + + return crate_targets + +def crate_edition(package_name = None): + """Finds the Rust edition for the package where this macro is called. + + Args: + package_name (str, optional): The package name whose edition should be + looked up. Defaults to `native.package_name()` when unset. + + Returns: + str: The Rust edition declared by the package's Cargo.toml file. + """ + if package_name == None: + package_name = native.package_name() + + if package_name not in _CRATE_EDITIONS: + fail("Tried to get crate_edition for package " + package_name + " but that package had no Cargo.toml file") + + return _CRATE_EDITIONS[package_name] + +def all_crate_deps( + normal = False, + normal_dev = False, + proc_macro = False, + proc_macro_dev = False, + build = False, + build_proc_macro = False, + package_name = None): + """Finds the fully qualified label of all requested direct crate dependencies \ + for the package where this macro is called. + + If no parameters are set, all normal dependencies are returned. Setting any one flag will + otherwise impact the contents of the returned list. + + Args: + normal (bool, optional): If True, normal dependencies are included in the + output list. + normal_dev (bool, optional): If True, normal dev dependencies will be + included in the output list. + proc_macro (bool, optional): If True, proc_macro dependencies are included + in the output list. + proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are + included in the output list. + build (bool, optional): If True, build dependencies are included + in the output list. + build_proc_macro (bool, optional): If True, build proc_macro dependencies are + included in the output list. + package_name (str, optional): The package name of the set of dependencies to look up. + Defaults to `native.package_name()` when unset. + + Returns: + list: A list of labels to generated rust targets (str) + """ + + if package_name == None: + package_name = native.package_name() + + # Determine the relevant maps to use + all_dependency_maps = [] + if normal: + all_dependency_maps.append(_NORMAL_DEPENDENCIES) + if normal_dev: + all_dependency_maps.append(_NORMAL_DEV_DEPENDENCIES) + if proc_macro: + all_dependency_maps.append(_PROC_MACRO_DEPENDENCIES) + if proc_macro_dev: + all_dependency_maps.append(_PROC_MACRO_DEV_DEPENDENCIES) + if build: + all_dependency_maps.append(_BUILD_DEPENDENCIES) + if build_proc_macro: + all_dependency_maps.append(_BUILD_PROC_MACRO_DEPENDENCIES) + + # Default to always using normal dependencies + if not all_dependency_maps: + all_dependency_maps.append(_NORMAL_DEPENDENCIES) + + dependencies = _flatten_dependency_maps(all_dependency_maps).pop(package_name, None) + + if not dependencies: + if dependencies == None: + fail("Tried to get all_crate_deps for package " + package_name + " but that package had no Cargo.toml file") + else: + return [] + + crate_deps = list(dependencies.pop(_COMMON_CONDITION, {}).values()) + for condition, deps in dependencies.items(): + crate_deps += selects.with_or({ + tuple(_CONDITIONS[condition]): deps.values(), + "//conditions:default": [], + }) + + return crate_deps + +def aliases( + normal = False, + normal_dev = False, + proc_macro = False, + proc_macro_dev = False, + build = False, + build_proc_macro = False, + package_name = None): + """Produces a map of Crate alias names to their original label + + If no dependency kinds are specified, `normal` and `proc_macro` are used by default. + Setting any one flag will otherwise determine the contents of the returned dict. + + Args: + normal (bool, optional): If True, normal dependencies are included in the + output list. + normal_dev (bool, optional): If True, normal dev dependencies will be + included in the output list.. + proc_macro (bool, optional): If True, proc_macro dependencies are included + in the output list. + proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are + included in the output list. + build (bool, optional): If True, build dependencies are included + in the output list. + build_proc_macro (bool, optional): If True, build proc_macro dependencies are + included in the output list. + package_name (str, optional): The package name of the set of dependencies to look up. + Defaults to `native.package_name()` when unset. + + Returns: + dict: The aliases of all associated packages + """ + if package_name == None: + package_name = native.package_name() -# buildifier: disable=bzl-visibility -load("@rules_rust//crate_universe/private:crates_vendor.bzl", "crates_vendor_remote_repository") + # Determine the relevant maps to use + all_aliases_maps = [] + if normal: + all_aliases_maps.append(_NORMAL_ALIASES) + if normal_dev: + all_aliases_maps.append(_NORMAL_DEV_ALIASES) + if proc_macro: + all_aliases_maps.append(_PROC_MACRO_ALIASES) + if proc_macro_dev: + all_aliases_maps.append(_PROC_MACRO_DEV_ALIASES) + if build: + all_aliases_maps.append(_BUILD_ALIASES) + if build_proc_macro: + all_aliases_maps.append(_BUILD_PROC_MACRO_ALIASES) -# buildifier: disable=bzl-visibility -load("//misc/bazel/3rdparty/py_deps:defs.bzl", _crate_repositories = "crate_repositories") + # Default to always using normal aliases + if not all_aliases_maps: + all_aliases_maps.append(_NORMAL_ALIASES) + all_aliases_maps.append(_PROC_MACRO_ALIASES) + + aliases = _flatten_dependency_maps(all_aliases_maps).pop(package_name, None) + + if not aliases: + return dict() + + common_items = aliases.pop(_COMMON_CONDITION, {}).items() + + # If there are only common items in the dictionary, immediately return them + if not len(aliases.keys()) == 1: + return dict(common_items) + + # Build a single select statement where each conditional has accounted for the + # common set of aliases. + crate_aliases = {"//conditions:default": dict(common_items)} + for condition, deps in aliases.items(): + condition_triples = _CONDITIONS[condition] + for triple in condition_triples: + if triple in crate_aliases: + crate_aliases[triple].update(deps) + else: + crate_aliases.update({triple: dict(deps.items() + common_items)}) + + return select(crate_aliases) + +############################################################################### +# WORKSPACE MEMBER DEPS, ALIASES, AND EDITIONS +############################################################################### + +_CRATE_EDITIONS = { + "python/extractor/tsg-python": "2024", + "python/extractor/tsg-python/tsp": "2024", +} + +_NORMAL_DEPENDENCIES = { + "python/extractor/tsg-python": { + _COMMON_CONDITION: { + "anyhow": Label("@vendor_py//anyhow-1.0.95"), + "clap": Label("@vendor_py//clap-4.5.30"), + "regex": Label("@vendor_py//regex-1.11.1"), + "tree-sitter": Label("@vendor_py//tree-sitter-0.24.7"), + "tree-sitter-graph": Label("@vendor_py//tree-sitter-graph-0.12.0"), + }, + }, + "python/extractor/tsg-python/tsp": { + _COMMON_CONDITION: { + "tree-sitter": Label("@vendor_py//tree-sitter-0.24.7"), + }, + }, +} + +_NORMAL_ALIASES = { + "python/extractor/tsg-python": { + _COMMON_CONDITION: { + }, + }, + "python/extractor/tsg-python/tsp": { + _COMMON_CONDITION: { + }, + }, +} + +_NORMAL_DEV_DEPENDENCIES = { + "python/extractor/tsg-python": { + }, + "python/extractor/tsg-python/tsp": { + }, +} + +_NORMAL_DEV_ALIASES = { + "python/extractor/tsg-python": { + }, + "python/extractor/tsg-python/tsp": { + }, +} + +_PROC_MACRO_DEPENDENCIES = { + "python/extractor/tsg-python": { + }, + "python/extractor/tsg-python/tsp": { + }, +} + +_PROC_MACRO_ALIASES = { + "python/extractor/tsg-python": { + }, + "python/extractor/tsg-python/tsp": { + }, +} + +_PROC_MACRO_DEV_DEPENDENCIES = { + "python/extractor/tsg-python": { + }, + "python/extractor/tsg-python/tsp": { + }, +} + +_PROC_MACRO_DEV_ALIASES = { + "python/extractor/tsg-python": { + }, + "python/extractor/tsg-python/tsp": { + }, +} + +_BUILD_DEPENDENCIES = { + "python/extractor/tsg-python": { + }, + "python/extractor/tsg-python/tsp": { + _COMMON_CONDITION: { + "cc": Label("@vendor_py//cc-1.2.14"), + }, + }, +} + +_BUILD_ALIASES = { + "python/extractor/tsg-python": { + }, + "python/extractor/tsg-python/tsp": { + _COMMON_CONDITION: { + }, + }, +} + +_BUILD_PROC_MACRO_DEPENDENCIES = { + "python/extractor/tsg-python": { + }, + "python/extractor/tsg-python/tsp": { + }, +} + +_BUILD_PROC_MACRO_ALIASES = { + "python/extractor/tsg-python": { + }, + "python/extractor/tsg-python/tsp": { + }, +} + +_CONDITIONS = { + "aarch64-apple-darwin": ["@rules_rust//rust/platform:aarch64-apple-darwin"], + "aarch64-apple-ios": ["@rules_rust//rust/platform:aarch64-apple-ios"], + "aarch64-apple-ios-macabi": ["@rules_rust//rust/platform:aarch64-apple-ios-macabi"], + "aarch64-apple-ios-sim": ["@rules_rust//rust/platform:aarch64-apple-ios-sim"], + "aarch64-linux-android": ["@rules_rust//rust/platform:aarch64-linux-android"], + "aarch64-pc-windows-gnullvm": [], + "aarch64-pc-windows-msvc": ["@rules_rust//rust/platform:aarch64-pc-windows-msvc"], + "aarch64-unknown-fuchsia": ["@rules_rust//rust/platform:aarch64-unknown-fuchsia"], + "aarch64-unknown-linux-gnu": ["@rules_rust//rust/platform:aarch64-unknown-linux-gnu"], + "aarch64-unknown-nixos-gnu": ["@rules_rust//rust/platform:aarch64-unknown-nixos-gnu"], + "aarch64-unknown-none": ["@rules_rust//rust/platform:aarch64-unknown-none"], + "aarch64-unknown-nto-qnx710": ["@rules_rust//rust/platform:aarch64-unknown-nto-qnx710"], + "aarch64-unknown-uefi": ["@rules_rust//rust/platform:aarch64-unknown-uefi"], + "arm-unknown-linux-gnueabi": ["@rules_rust//rust/platform:arm-unknown-linux-gnueabi"], + "arm-unknown-linux-musleabi": ["@rules_rust//rust/platform:arm-unknown-linux-musleabi"], + "armv7-linux-androideabi": ["@rules_rust//rust/platform:armv7-linux-androideabi"], + "armv7-unknown-linux-gnueabi": ["@rules_rust//rust/platform:armv7-unknown-linux-gnueabi"], + "cfg(all(any(target_arch = \"x86_64\", target_arch = \"arm64ec\"), target_env = \"msvc\", not(windows_raw_dylib)))": ["@rules_rust//rust/platform:x86_64-pc-windows-msvc"], + "cfg(all(target_arch = \"aarch64\", target_env = \"msvc\", not(windows_raw_dylib)))": ["@rules_rust//rust/platform:aarch64-pc-windows-msvc"], + "cfg(all(target_arch = \"x86\", target_env = \"gnu\", not(target_abi = \"llvm\"), not(windows_raw_dylib)))": ["@rules_rust//rust/platform:i686-unknown-linux-gnu"], + "cfg(all(target_arch = \"x86\", target_env = \"msvc\", not(windows_raw_dylib)))": ["@rules_rust//rust/platform:i686-pc-windows-msvc"], + "cfg(all(target_arch = \"x86_64\", target_env = \"gnu\", not(target_abi = \"llvm\"), not(windows_raw_dylib)))": ["@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], + "cfg(any())": [], + "cfg(windows)": ["@rules_rust//rust/platform:aarch64-pc-windows-msvc", "@rules_rust//rust/platform:i686-pc-windows-msvc", "@rules_rust//rust/platform:x86_64-pc-windows-msvc"], + "i686-apple-darwin": ["@rules_rust//rust/platform:i686-apple-darwin"], + "i686-linux-android": ["@rules_rust//rust/platform:i686-linux-android"], + "i686-pc-windows-gnullvm": [], + "i686-pc-windows-msvc": ["@rules_rust//rust/platform:i686-pc-windows-msvc"], + "i686-unknown-freebsd": ["@rules_rust//rust/platform:i686-unknown-freebsd"], + "i686-unknown-linux-gnu": ["@rules_rust//rust/platform:i686-unknown-linux-gnu"], + "loongarch64-unknown-linux-gnu": ["@rules_rust//rust/platform:loongarch64-unknown-linux-gnu"], + "mips-unknown-linux-gnu": ["@rules_rust//rust/platform:mips-unknown-linux-gnu"], + "powerpc-unknown-linux-gnu": ["@rules_rust//rust/platform:powerpc-unknown-linux-gnu"], + "riscv32imac-unknown-none-elf": ["@rules_rust//rust/platform:riscv32imac-unknown-none-elf"], + "riscv32imc-unknown-none-elf": ["@rules_rust//rust/platform:riscv32imc-unknown-none-elf"], + "riscv64gc-unknown-linux-gnu": ["@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu"], + "riscv64gc-unknown-none-elf": ["@rules_rust//rust/platform:riscv64gc-unknown-none-elf"], + "s390x-unknown-linux-gnu": ["@rules_rust//rust/platform:s390x-unknown-linux-gnu"], + "sparc64-unknown-linux-gnu": ["@rules_rust//rust/platform:sparc64-unknown-linux-gnu"], + "sparc64-unknown-netbsd": ["@rules_rust//rust/platform:sparc64-unknown-netbsd"], + "sparc64-unknown-openbsd": ["@rules_rust//rust/platform:sparc64-unknown-openbsd"], + "thumbv6m-none-eabi": ["@rules_rust//rust/platform:thumbv6m-none-eabi"], + "thumbv7em-none-eabi": ["@rules_rust//rust/platform:thumbv7em-none-eabi"], + "thumbv7em-none-eabihf": ["@rules_rust//rust/platform:thumbv7em-none-eabihf"], + "thumbv7m-none-eabi": ["@rules_rust//rust/platform:thumbv7m-none-eabi"], + "thumbv8m.main-none-eabi": ["@rules_rust//rust/platform:thumbv8m.main-none-eabi"], + "thumbv8m.main-none-eabihf": ["@rules_rust//rust/platform:thumbv8m.main-none-eabihf"], + "wasm32-unknown-emscripten": ["@rules_rust//rust/platform:wasm32-unknown-emscripten"], + "wasm32-unknown-unknown": ["@rules_rust//rust/platform:wasm32-unknown-unknown"], + "wasm32-wasip1": ["@rules_rust//rust/platform:wasm32-wasip1"], + "wasm32-wasip1-threads": ["@rules_rust//rust/platform:wasm32-wasip1-threads"], + "wasm32-wasip2": ["@rules_rust//rust/platform:wasm32-wasip2"], + "x86_64-apple-darwin": ["@rules_rust//rust/platform:x86_64-apple-darwin"], + "x86_64-apple-ios": ["@rules_rust//rust/platform:x86_64-apple-ios"], + "x86_64-apple-ios-macabi": ["@rules_rust//rust/platform:x86_64-apple-ios-macabi"], + "x86_64-linux-android": ["@rules_rust//rust/platform:x86_64-linux-android"], + "x86_64-pc-windows-gnullvm": [], + "x86_64-pc-windows-msvc": ["@rules_rust//rust/platform:x86_64-pc-windows-msvc"], + "x86_64-unknown-freebsd": ["@rules_rust//rust/platform:x86_64-unknown-freebsd"], + "x86_64-unknown-fuchsia": ["@rules_rust//rust/platform:x86_64-unknown-fuchsia"], + "x86_64-unknown-linux-gnu": ["@rules_rust//rust/platform:x86_64-unknown-linux-gnu"], + "x86_64-unknown-nixos-gnu": ["@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], + "x86_64-unknown-none": ["@rules_rust//rust/platform:x86_64-unknown-none"], + "x86_64-unknown-uefi": ["@rules_rust//rust/platform:x86_64-unknown-uefi"], +} + +############################################################################### def crate_repositories(): - """Generates repositories for vendored crates. + """A macro for defining repositories for all generated crates. Returns: A list of repos visible to the module through the module extension. @@ -23,10 +498,496 @@ def crate_repositories(): maybe( crates_vendor_remote_repository, name = "vendor_py", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.bazel"), - defs_module = Label("//misc/bazel/3rdparty/py_deps:defs.bzl"), + # Lean interface: just point at `crates.bzl`; the repo rule + # derives the sibling `BUILD.bazel` and `defs.bzl`. + crates_module = Label("//misc/bazel/3rdparty/py_deps:crates.bzl"), + ) + maybe( + http_archive, + name = "vendor_py__aho-corasick-1.1.3", + sha256 = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916", + type = "tar.gz", + urls = ["https://static.crates.io/crates/aho-corasick/1.1.3/download"], + strip_prefix = "aho-corasick-1.1.3", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.aho-corasick-1.1.3.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__anstream-0.6.18", + sha256 = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b", + type = "tar.gz", + urls = ["https://static.crates.io/crates/anstream/0.6.18/download"], + strip_prefix = "anstream-0.6.18", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.anstream-0.6.18.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__anstyle-1.0.10", + sha256 = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9", + type = "tar.gz", + urls = ["https://static.crates.io/crates/anstyle/1.0.10/download"], + strip_prefix = "anstyle-1.0.10", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.anstyle-1.0.10.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__anstyle-parse-0.2.6", + sha256 = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9", + type = "tar.gz", + urls = ["https://static.crates.io/crates/anstyle-parse/0.2.6/download"], + strip_prefix = "anstyle-parse-0.2.6", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.anstyle-parse-0.2.6.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__anstyle-query-1.1.2", + sha256 = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c", + type = "tar.gz", + urls = ["https://static.crates.io/crates/anstyle-query/1.1.2/download"], + strip_prefix = "anstyle-query-1.1.2", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.anstyle-query-1.1.2.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__anstyle-wincon-3.0.7", + sha256 = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e", + type = "tar.gz", + urls = ["https://static.crates.io/crates/anstyle-wincon/3.0.7/download"], + strip_prefix = "anstyle-wincon-3.0.7", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.anstyle-wincon-3.0.7.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__anyhow-1.0.95", + sha256 = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04", + type = "tar.gz", + urls = ["https://static.crates.io/crates/anyhow/1.0.95/download"], + strip_prefix = "anyhow-1.0.95", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.anyhow-1.0.95.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__cc-1.2.14", + sha256 = "0c3d1b2e905a3a7b00a6141adb0e4c0bb941d11caf55349d863942a1cc44e3c9", + type = "tar.gz", + urls = ["https://static.crates.io/crates/cc/1.2.14/download"], + strip_prefix = "cc-1.2.14", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.cc-1.2.14.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__clap-4.5.30", + sha256 = "92b7b18d71fad5313a1e320fa9897994228ce274b60faa4d694fe0ea89cd9e6d", + type = "tar.gz", + urls = ["https://static.crates.io/crates/clap/4.5.30/download"], + strip_prefix = "clap-4.5.30", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.clap-4.5.30.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__clap_builder-4.5.30", + sha256 = "a35db2071778a7344791a4fb4f95308b5673d219dee3ae348b86642574ecc90c", + type = "tar.gz", + urls = ["https://static.crates.io/crates/clap_builder/4.5.30/download"], + strip_prefix = "clap_builder-4.5.30", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.clap_builder-4.5.30.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__clap_lex-0.7.4", + sha256 = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6", + type = "tar.gz", + urls = ["https://static.crates.io/crates/clap_lex/0.7.4/download"], + strip_prefix = "clap_lex-0.7.4", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.clap_lex-0.7.4.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__colorchoice-1.0.3", + sha256 = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990", + type = "tar.gz", + urls = ["https://static.crates.io/crates/colorchoice/1.0.3/download"], + strip_prefix = "colorchoice-1.0.3", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.colorchoice-1.0.3.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__is_terminal_polyfill-1.70.1", + sha256 = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf", + type = "tar.gz", + urls = ["https://static.crates.io/crates/is_terminal_polyfill/1.70.1/download"], + strip_prefix = "is_terminal_polyfill-1.70.1", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.is_terminal_polyfill-1.70.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__itoa-1.0.14", + sha256 = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674", + type = "tar.gz", + urls = ["https://static.crates.io/crates/itoa/1.0.14/download"], + strip_prefix = "itoa-1.0.14", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.itoa-1.0.14.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__log-0.4.25", + sha256 = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f", + type = "tar.gz", + urls = ["https://static.crates.io/crates/log/0.4.25/download"], + strip_prefix = "log-0.4.25", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.log-0.4.25.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__memchr-2.7.4", + sha256 = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3", + type = "tar.gz", + urls = ["https://static.crates.io/crates/memchr/2.7.4/download"], + strip_prefix = "memchr-2.7.4", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.memchr-2.7.4.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__once_cell-1.20.3", + sha256 = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e", + type = "tar.gz", + urls = ["https://static.crates.io/crates/once_cell/1.20.3/download"], + strip_prefix = "once_cell-1.20.3", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.once_cell-1.20.3.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__proc-macro2-1.0.93", + sha256 = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99", + type = "tar.gz", + urls = ["https://static.crates.io/crates/proc-macro2/1.0.93/download"], + strip_prefix = "proc-macro2-1.0.93", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.proc-macro2-1.0.93.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__quote-1.0.38", + sha256 = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc", + type = "tar.gz", + urls = ["https://static.crates.io/crates/quote/1.0.38/download"], + strip_prefix = "quote-1.0.38", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.quote-1.0.38.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__regex-1.11.1", + sha256 = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191", + type = "tar.gz", + urls = ["https://static.crates.io/crates/regex/1.11.1/download"], + strip_prefix = "regex-1.11.1", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.regex-1.11.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__regex-automata-0.4.9", + sha256 = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908", + type = "tar.gz", + urls = ["https://static.crates.io/crates/regex-automata/0.4.9/download"], + strip_prefix = "regex-automata-0.4.9", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.regex-automata-0.4.9.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__regex-syntax-0.8.5", + sha256 = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c", + type = "tar.gz", + urls = ["https://static.crates.io/crates/regex-syntax/0.8.5/download"], + strip_prefix = "regex-syntax-0.8.5", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.regex-syntax-0.8.5.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__ryu-1.0.19", + sha256 = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ryu/1.0.19/download"], + strip_prefix = "ryu-1.0.19", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.ryu-1.0.19.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__serde-1.0.217", + sha256 = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70", + type = "tar.gz", + urls = ["https://static.crates.io/crates/serde/1.0.217/download"], + strip_prefix = "serde-1.0.217", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.serde-1.0.217.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__serde_derive-1.0.217", + sha256 = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0", + type = "tar.gz", + urls = ["https://static.crates.io/crates/serde_derive/1.0.217/download"], + strip_prefix = "serde_derive-1.0.217", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.serde_derive-1.0.217.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__serde_json-1.0.138", + sha256 = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949", + type = "tar.gz", + urls = ["https://static.crates.io/crates/serde_json/1.0.138/download"], + strip_prefix = "serde_json-1.0.138", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.serde_json-1.0.138.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__shlex-1.3.0", + sha256 = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64", + type = "tar.gz", + urls = ["https://static.crates.io/crates/shlex/1.3.0/download"], + strip_prefix = "shlex-1.3.0", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.shlex-1.3.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__smallvec-1.14.0", + sha256 = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd", + type = "tar.gz", + urls = ["https://static.crates.io/crates/smallvec/1.14.0/download"], + strip_prefix = "smallvec-1.14.0", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.smallvec-1.14.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__streaming-iterator-0.1.9", + sha256 = "2b2231b7c3057d5e4ad0156fb3dc807d900806020c5ffa3ee6ff2c8c76fb8520", + type = "tar.gz", + urls = ["https://static.crates.io/crates/streaming-iterator/0.1.9/download"], + strip_prefix = "streaming-iterator-0.1.9", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.streaming-iterator-0.1.9.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__strsim-0.11.1", + sha256 = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f", + type = "tar.gz", + urls = ["https://static.crates.io/crates/strsim/0.11.1/download"], + strip_prefix = "strsim-0.11.1", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.strsim-0.11.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__syn-2.0.98", + sha256 = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1", + type = "tar.gz", + urls = ["https://static.crates.io/crates/syn/2.0.98/download"], + strip_prefix = "syn-2.0.98", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.syn-2.0.98.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__thiserror-1.0.69", + sha256 = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52", + type = "tar.gz", + urls = ["https://static.crates.io/crates/thiserror/1.0.69/download"], + strip_prefix = "thiserror-1.0.69", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.thiserror-1.0.69.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__thiserror-impl-1.0.69", + sha256 = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1", + type = "tar.gz", + urls = ["https://static.crates.io/crates/thiserror-impl/1.0.69/download"], + strip_prefix = "thiserror-impl-1.0.69", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.thiserror-impl-1.0.69.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__tree-sitter-0.24.7", + sha256 = "a5387dffa7ffc7d2dae12b50c6f7aab8ff79d6210147c6613561fc3d474c6f75", + type = "tar.gz", + urls = ["https://static.crates.io/crates/tree-sitter/0.24.7/download"], + strip_prefix = "tree-sitter-0.24.7", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.tree-sitter-0.24.7.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__tree-sitter-graph-0.12.0", + sha256 = "63f86eb73c7d891c4b9b6fe4d4e63dd94c506e4788af7c2296afdcfbeea626cc", + type = "tar.gz", + urls = ["https://static.crates.io/crates/tree-sitter-graph/0.12.0/download"], + strip_prefix = "tree-sitter-graph-0.12.0", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.tree-sitter-graph-0.12.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__tree-sitter-language-0.1.5", + sha256 = "c4013970217383f67b18aef68f6fb2e8d409bc5755227092d32efb0422ba24b8", + type = "tar.gz", + urls = ["https://static.crates.io/crates/tree-sitter-language/0.1.5/download"], + strip_prefix = "tree-sitter-language-0.1.5", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.tree-sitter-language-0.1.5.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__unicode-ident-1.0.16", + sha256 = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034", + type = "tar.gz", + urls = ["https://static.crates.io/crates/unicode-ident/1.0.16/download"], + strip_prefix = "unicode-ident-1.0.16", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.unicode-ident-1.0.16.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__utf8parse-0.2.2", + sha256 = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821", + type = "tar.gz", + urls = ["https://static.crates.io/crates/utf8parse/0.2.2/download"], + strip_prefix = "utf8parse-0.2.2", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.utf8parse-0.2.2.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__windows-sys-0.59.0", + sha256 = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b", + type = "tar.gz", + urls = ["https://static.crates.io/crates/windows-sys/0.59.0/download"], + strip_prefix = "windows-sys-0.59.0", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.windows-sys-0.59.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__windows-targets-0.52.6", + sha256 = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973", + type = "tar.gz", + urls = ["https://static.crates.io/crates/windows-targets/0.52.6/download"], + strip_prefix = "windows-targets-0.52.6", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.windows-targets-0.52.6.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__windows_aarch64_gnullvm-0.52.6", + sha256 = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3", + type = "tar.gz", + urls = ["https://static.crates.io/crates/windows_aarch64_gnullvm/0.52.6/download"], + strip_prefix = "windows_aarch64_gnullvm-0.52.6", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.windows_aarch64_gnullvm-0.52.6.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__windows_aarch64_msvc-0.52.6", + sha256 = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469", + type = "tar.gz", + urls = ["https://static.crates.io/crates/windows_aarch64_msvc/0.52.6/download"], + strip_prefix = "windows_aarch64_msvc-0.52.6", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.windows_aarch64_msvc-0.52.6.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__windows_i686_gnu-0.52.6", + sha256 = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b", + type = "tar.gz", + urls = ["https://static.crates.io/crates/windows_i686_gnu/0.52.6/download"], + strip_prefix = "windows_i686_gnu-0.52.6", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.windows_i686_gnu-0.52.6.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__windows_i686_gnullvm-0.52.6", + sha256 = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66", + type = "tar.gz", + urls = ["https://static.crates.io/crates/windows_i686_gnullvm/0.52.6/download"], + strip_prefix = "windows_i686_gnullvm-0.52.6", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.windows_i686_gnullvm-0.52.6.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__windows_i686_msvc-0.52.6", + sha256 = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66", + type = "tar.gz", + urls = ["https://static.crates.io/crates/windows_i686_msvc/0.52.6/download"], + strip_prefix = "windows_i686_msvc-0.52.6", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.windows_i686_msvc-0.52.6.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__windows_x86_64_gnu-0.52.6", + sha256 = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78", + type = "tar.gz", + urls = ["https://static.crates.io/crates/windows_x86_64_gnu/0.52.6/download"], + strip_prefix = "windows_x86_64_gnu-0.52.6", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.windows_x86_64_gnu-0.52.6.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__windows_x86_64_gnullvm-0.52.6", + sha256 = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d", + type = "tar.gz", + urls = ["https://static.crates.io/crates/windows_x86_64_gnullvm/0.52.6/download"], + strip_prefix = "windows_x86_64_gnullvm-0.52.6", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.windows_x86_64_gnullvm-0.52.6.bazel"), + ) + + maybe( + http_archive, + name = "vendor_py__windows_x86_64_msvc-0.52.6", + sha256 = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec", + type = "tar.gz", + urls = ["https://static.crates.io/crates/windows_x86_64_msvc/0.52.6/download"], + strip_prefix = "windows_x86_64_msvc-0.52.6", + build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.windows_x86_64_msvc-0.52.6.bazel"), ) - direct_deps = [struct(repo = "vendor_py", is_dev_dep = False)] - direct_deps.extend(_crate_repositories()) - return direct_deps + return [ + struct(repo = "vendor_py", is_dev_dep = False), + struct(repo = "vendor_py__anyhow-1.0.95", is_dev_dep = False), + struct(repo = "vendor_py__cc-1.2.14", is_dev_dep = False), + struct(repo = "vendor_py__clap-4.5.30", is_dev_dep = False), + struct(repo = "vendor_py__regex-1.11.1", is_dev_dep = False), + struct(repo = "vendor_py__tree-sitter-0.24.7", is_dev_dep = False), + struct(repo = "vendor_py__tree-sitter-graph-0.12.0", is_dev_dep = False), + ] diff --git a/misc/bazel/3rdparty/py_deps/defs.bzl b/misc/bazel/3rdparty/py_deps/defs.bzl index 70e6051ac930..0aa81f443fb2 100644 --- a/misc/bazel/3rdparty/py_deps/defs.bzl +++ b/misc/bazel/3rdparty/py_deps/defs.bzl @@ -5,943 +5,19 @@ # # bazel run @@//misc/bazel/3rdparty:vendor_py_deps ############################################################################### -""" -# `crates_repository` API - -- [aliases](#aliases) -- [crate_deps](#crate_deps) -- [all_crate_deps](#all_crate_deps) -- [crate_repositories](#crate_repositories) - -""" - -load("@bazel_skylib//lib:selects.bzl", "selects") -load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") -load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") - -############################################################################### -# MACROS API -############################################################################### - -# An identifier that represent common dependencies (unconditional). -_COMMON_CONDITION = "" - -def _flatten_dependency_maps(all_dependency_maps): - """Flatten a list of dependency maps into one dictionary. - - Dependency maps have the following structure: - - ```python - DEPENDENCIES_MAP = { - # The first key in the map is a Bazel package - # name of the workspace this file is defined in. - "workspace_member_package": { - - # Not all dependencies are supported for all platforms. - # the condition key is the condition required to be true - # on the host platform. - "condition": { - - # An alias to a crate target. # The label of the crate target the - # Aliases are only crate names. # package name refers to. - "package_name": "@full//:label", - } - } - } - ``` - - Args: - all_dependency_maps (list): A list of dicts as described above - - Returns: - dict: A dictionary as described above - """ - dependencies = {} - - for workspace_deps_map in all_dependency_maps: - for pkg_name, conditional_deps_map in workspace_deps_map.items(): - if pkg_name not in dependencies: - non_frozen_map = dict() - for key, values in conditional_deps_map.items(): - non_frozen_map.update({key: dict(values.items())}) - dependencies.setdefault(pkg_name, non_frozen_map) - continue - - for condition, deps_map in conditional_deps_map.items(): - # If the condition has not been recorded, do so and continue - if condition not in dependencies[pkg_name]: - dependencies[pkg_name].setdefault(condition, dict(deps_map.items())) - continue - - # Alert on any miss-matched dependencies - inconsistent_entries = [] - for crate_name, crate_label in deps_map.items(): - existing = dependencies[pkg_name][condition].get(crate_name) - if existing and existing != crate_label: - inconsistent_entries.append((crate_name, existing, crate_label)) - dependencies[pkg_name][condition].update({crate_name: crate_label}) - - return dependencies - -def crate_deps(deps, package_name = None): - """Finds the fully qualified label of the requested crates for the package where this macro is called. - - Args: - deps (list): The desired list of crate targets. - package_name (str, optional): The package name of the set of dependencies to look up. - Defaults to `native.package_name()`. - - Returns: - list: A list of labels to generated rust targets (str) - """ - - if not deps: - return [] - - if package_name == None: - package_name = native.package_name() - - # Join both sets of dependencies - dependencies = _flatten_dependency_maps([ - _NORMAL_DEPENDENCIES, - _NORMAL_DEV_DEPENDENCIES, - _PROC_MACRO_DEPENDENCIES, - _PROC_MACRO_DEV_DEPENDENCIES, - _BUILD_DEPENDENCIES, - _BUILD_PROC_MACRO_DEPENDENCIES, - ]).pop(package_name, {}) - - # Combine all conditional packages so we can easily index over a flat list - # TODO: Perhaps this should actually return select statements and maintain - # the conditionals of the dependencies - flat_deps = {} - for deps_set in dependencies.values(): - for crate_name, crate_label in deps_set.items(): - flat_deps.update({crate_name: crate_label}) - - missing_crates = [] - crate_targets = [] - for crate_target in deps: - if crate_target not in flat_deps: - missing_crates.append(crate_target) - else: - crate_targets.append(flat_deps[crate_target]) - - if missing_crates: - fail("Could not find crates `{}` among dependencies of `{}`. Available dependencies were `{}`".format( - missing_crates, - package_name, - dependencies, - )) - - return crate_targets - -def all_crate_deps( - normal = False, - normal_dev = False, - proc_macro = False, - proc_macro_dev = False, - build = False, - build_proc_macro = False, - package_name = None): - """Finds the fully qualified label of all requested direct crate dependencies \ - for the package where this macro is called. - - If no parameters are set, all normal dependencies are returned. Setting any one flag will - otherwise impact the contents of the returned list. - - Args: - normal (bool, optional): If True, normal dependencies are included in the - output list. - normal_dev (bool, optional): If True, normal dev dependencies will be - included in the output list. - proc_macro (bool, optional): If True, proc_macro dependencies are included - in the output list. - proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are - included in the output list. - build (bool, optional): If True, build dependencies are included - in the output list. - build_proc_macro (bool, optional): If True, build proc_macro dependencies are - included in the output list. - package_name (str, optional): The package name of the set of dependencies to look up. - Defaults to `native.package_name()` when unset. - - Returns: - list: A list of labels to generated rust targets (str) - """ - - if package_name == None: - package_name = native.package_name() - - # Determine the relevant maps to use - all_dependency_maps = [] - if normal: - all_dependency_maps.append(_NORMAL_DEPENDENCIES) - if normal_dev: - all_dependency_maps.append(_NORMAL_DEV_DEPENDENCIES) - if proc_macro: - all_dependency_maps.append(_PROC_MACRO_DEPENDENCIES) - if proc_macro_dev: - all_dependency_maps.append(_PROC_MACRO_DEV_DEPENDENCIES) - if build: - all_dependency_maps.append(_BUILD_DEPENDENCIES) - if build_proc_macro: - all_dependency_maps.append(_BUILD_PROC_MACRO_DEPENDENCIES) - - # Default to always using normal dependencies - if not all_dependency_maps: - all_dependency_maps.append(_NORMAL_DEPENDENCIES) - - dependencies = _flatten_dependency_maps(all_dependency_maps).pop(package_name, None) - - if not dependencies: - if dependencies == None: - fail("Tried to get all_crate_deps for package " + package_name + " but that package had no Cargo.toml file") - else: - return [] - - crate_deps = list(dependencies.pop(_COMMON_CONDITION, {}).values()) - for condition, deps in dependencies.items(): - crate_deps += selects.with_or({ - tuple(_CONDITIONS[condition]): deps.values(), - "//conditions:default": [], - }) - - return crate_deps - -def aliases( - normal = False, - normal_dev = False, - proc_macro = False, - proc_macro_dev = False, - build = False, - build_proc_macro = False, - package_name = None): - """Produces a map of Crate alias names to their original label - - If no dependency kinds are specified, `normal` and `proc_macro` are used by default. - Setting any one flag will otherwise determine the contents of the returned dict. - - Args: - normal (bool, optional): If True, normal dependencies are included in the - output list. - normal_dev (bool, optional): If True, normal dev dependencies will be - included in the output list.. - proc_macro (bool, optional): If True, proc_macro dependencies are included - in the output list. - proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are - included in the output list. - build (bool, optional): If True, build dependencies are included - in the output list. - build_proc_macro (bool, optional): If True, build proc_macro dependencies are - included in the output list. - package_name (str, optional): The package name of the set of dependencies to look up. - Defaults to `native.package_name()` when unset. - - Returns: - dict: The aliases of all associated packages - """ - if package_name == None: - package_name = native.package_name() - - # Determine the relevant maps to use - all_aliases_maps = [] - if normal: - all_aliases_maps.append(_NORMAL_ALIASES) - if normal_dev: - all_aliases_maps.append(_NORMAL_DEV_ALIASES) - if proc_macro: - all_aliases_maps.append(_PROC_MACRO_ALIASES) - if proc_macro_dev: - all_aliases_maps.append(_PROC_MACRO_DEV_ALIASES) - if build: - all_aliases_maps.append(_BUILD_ALIASES) - if build_proc_macro: - all_aliases_maps.append(_BUILD_PROC_MACRO_ALIASES) - - # Default to always using normal aliases - if not all_aliases_maps: - all_aliases_maps.append(_NORMAL_ALIASES) - all_aliases_maps.append(_PROC_MACRO_ALIASES) - - aliases = _flatten_dependency_maps(all_aliases_maps).pop(package_name, None) - - if not aliases: - return dict() - - common_items = aliases.pop(_COMMON_CONDITION, {}).items() - - # If there are only common items in the dictionary, immediately return them - if not len(aliases.keys()) == 1: - return dict(common_items) - - # Build a single select statement where each conditional has accounted for the - # common set of aliases. - crate_aliases = {"//conditions:default": dict(common_items)} - for condition, deps in aliases.items(): - condition_triples = _CONDITIONS[condition] - for triple in condition_triples: - if triple in crate_aliases: - crate_aliases[triple].update(deps) - else: - crate_aliases.update({triple: dict(deps.items() + common_items)}) - - return select(crate_aliases) - -############################################################################### -# WORKSPACE MEMBER DEPS AND ALIASES -############################################################################### - -_NORMAL_DEPENDENCIES = { - "python/extractor/tsg-python": { - _COMMON_CONDITION: { - "anyhow": Label("@vendor_py__anyhow-1.0.95//:anyhow"), - "clap": Label("@vendor_py__clap-4.5.30//:clap"), - "regex": Label("@vendor_py__regex-1.11.1//:regex"), - "tree-sitter": Label("@vendor_py__tree-sitter-0.24.7//:tree_sitter"), - "tree-sitter-graph": Label("@vendor_py__tree-sitter-graph-0.12.0//:tree_sitter_graph"), - }, - }, - "python/extractor/tsg-python/tsp": { - _COMMON_CONDITION: { - "tree-sitter": Label("@vendor_py__tree-sitter-0.24.7//:tree_sitter"), - }, - }, -} - -_NORMAL_ALIASES = { - "python/extractor/tsg-python": { - _COMMON_CONDITION: { - }, - }, - "python/extractor/tsg-python/tsp": { - _COMMON_CONDITION: { - }, - }, -} - -_NORMAL_DEV_DEPENDENCIES = { - "python/extractor/tsg-python": { - }, - "python/extractor/tsg-python/tsp": { - }, -} - -_NORMAL_DEV_ALIASES = { - "python/extractor/tsg-python": { - }, - "python/extractor/tsg-python/tsp": { - }, -} - -_PROC_MACRO_DEPENDENCIES = { - "python/extractor/tsg-python": { - }, - "python/extractor/tsg-python/tsp": { - }, -} - -_PROC_MACRO_ALIASES = { - "python/extractor/tsg-python": { - }, - "python/extractor/tsg-python/tsp": { - }, -} - -_PROC_MACRO_DEV_DEPENDENCIES = { - "python/extractor/tsg-python": { - }, - "python/extractor/tsg-python/tsp": { - }, -} - -_PROC_MACRO_DEV_ALIASES = { - "python/extractor/tsg-python": { - }, - "python/extractor/tsg-python/tsp": { - }, -} - -_BUILD_DEPENDENCIES = { - "python/extractor/tsg-python": { - }, - "python/extractor/tsg-python/tsp": { - _COMMON_CONDITION: { - "cc": Label("@vendor_py__cc-1.2.14//:cc"), - }, - }, -} - -_BUILD_ALIASES = { - "python/extractor/tsg-python": { - }, - "python/extractor/tsg-python/tsp": { - _COMMON_CONDITION: { - }, - }, -} - -_BUILD_PROC_MACRO_DEPENDENCIES = { - "python/extractor/tsg-python": { - }, - "python/extractor/tsg-python/tsp": { - }, -} - -_BUILD_PROC_MACRO_ALIASES = { - "python/extractor/tsg-python": { - }, - "python/extractor/tsg-python/tsp": { - }, -} - -_CONDITIONS = { - "aarch64-apple-darwin": ["@rules_rust//rust/platform:aarch64-apple-darwin"], - "aarch64-apple-ios": ["@rules_rust//rust/platform:aarch64-apple-ios"], - "aarch64-apple-ios-sim": ["@rules_rust//rust/platform:aarch64-apple-ios-sim"], - "aarch64-linux-android": ["@rules_rust//rust/platform:aarch64-linux-android"], - "aarch64-pc-windows-gnullvm": [], - "aarch64-pc-windows-msvc": ["@rules_rust//rust/platform:aarch64-pc-windows-msvc"], - "aarch64-unknown-fuchsia": ["@rules_rust//rust/platform:aarch64-unknown-fuchsia"], - "aarch64-unknown-linux-gnu": ["@rules_rust//rust/platform:aarch64-unknown-linux-gnu"], - "aarch64-unknown-nixos-gnu": ["@rules_rust//rust/platform:aarch64-unknown-nixos-gnu"], - "aarch64-unknown-nto-qnx710": ["@rules_rust//rust/platform:aarch64-unknown-nto-qnx710"], - "aarch64-unknown-uefi": ["@rules_rust//rust/platform:aarch64-unknown-uefi"], - "arm-unknown-linux-gnueabi": ["@rules_rust//rust/platform:arm-unknown-linux-gnueabi"], - "arm-unknown-linux-musleabi": ["@rules_rust//rust/platform:arm-unknown-linux-musleabi"], - "armv7-linux-androideabi": ["@rules_rust//rust/platform:armv7-linux-androideabi"], - "armv7-unknown-linux-gnueabi": ["@rules_rust//rust/platform:armv7-unknown-linux-gnueabi"], - "cfg(all(any(target_arch = \"x86_64\", target_arch = \"arm64ec\"), target_env = \"msvc\", not(windows_raw_dylib)))": ["@rules_rust//rust/platform:x86_64-pc-windows-msvc"], - "cfg(all(target_arch = \"aarch64\", target_env = \"msvc\", not(windows_raw_dylib)))": ["@rules_rust//rust/platform:aarch64-pc-windows-msvc"], - "cfg(all(target_arch = \"x86\", target_env = \"gnu\", not(target_abi = \"llvm\"), not(windows_raw_dylib)))": ["@rules_rust//rust/platform:i686-unknown-linux-gnu"], - "cfg(all(target_arch = \"x86\", target_env = \"msvc\", not(windows_raw_dylib)))": ["@rules_rust//rust/platform:i686-pc-windows-msvc"], - "cfg(all(target_arch = \"x86_64\", target_env = \"gnu\", not(target_abi = \"llvm\"), not(windows_raw_dylib)))": ["@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], - "cfg(any())": [], - "cfg(windows)": ["@rules_rust//rust/platform:aarch64-pc-windows-msvc", "@rules_rust//rust/platform:i686-pc-windows-msvc", "@rules_rust//rust/platform:x86_64-pc-windows-msvc"], - "i686-apple-darwin": ["@rules_rust//rust/platform:i686-apple-darwin"], - "i686-linux-android": ["@rules_rust//rust/platform:i686-linux-android"], - "i686-pc-windows-gnullvm": [], - "i686-pc-windows-msvc": ["@rules_rust//rust/platform:i686-pc-windows-msvc"], - "i686-unknown-freebsd": ["@rules_rust//rust/platform:i686-unknown-freebsd"], - "i686-unknown-linux-gnu": ["@rules_rust//rust/platform:i686-unknown-linux-gnu"], - "powerpc-unknown-linux-gnu": ["@rules_rust//rust/platform:powerpc-unknown-linux-gnu"], - "riscv32imc-unknown-none-elf": ["@rules_rust//rust/platform:riscv32imc-unknown-none-elf"], - "riscv64gc-unknown-linux-gnu": ["@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu"], - "riscv64gc-unknown-none-elf": ["@rules_rust//rust/platform:riscv64gc-unknown-none-elf"], - "s390x-unknown-linux-gnu": ["@rules_rust//rust/platform:s390x-unknown-linux-gnu"], - "thumbv7em-none-eabi": ["@rules_rust//rust/platform:thumbv7em-none-eabi"], - "thumbv8m.main-none-eabi": ["@rules_rust//rust/platform:thumbv8m.main-none-eabi"], - "wasm32-unknown-emscripten": ["@rules_rust//rust/platform:wasm32-unknown-emscripten"], - "wasm32-unknown-unknown": ["@rules_rust//rust/platform:wasm32-unknown-unknown"], - "wasm32-wasip1": ["@rules_rust//rust/platform:wasm32-wasip1"], - "wasm32-wasip1-threads": ["@rules_rust//rust/platform:wasm32-wasip1-threads"], - "wasm32-wasip2": ["@rules_rust//rust/platform:wasm32-wasip2"], - "x86_64-apple-darwin": ["@rules_rust//rust/platform:x86_64-apple-darwin"], - "x86_64-apple-ios": ["@rules_rust//rust/platform:x86_64-apple-ios"], - "x86_64-linux-android": ["@rules_rust//rust/platform:x86_64-linux-android"], - "x86_64-pc-windows-gnullvm": [], - "x86_64-pc-windows-msvc": ["@rules_rust//rust/platform:x86_64-pc-windows-msvc"], - "x86_64-unknown-freebsd": ["@rules_rust//rust/platform:x86_64-unknown-freebsd"], - "x86_64-unknown-fuchsia": ["@rules_rust//rust/platform:x86_64-unknown-fuchsia"], - "x86_64-unknown-linux-gnu": ["@rules_rust//rust/platform:x86_64-unknown-linux-gnu"], - "x86_64-unknown-nixos-gnu": ["@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], - "x86_64-unknown-none": ["@rules_rust//rust/platform:x86_64-unknown-none"], - "x86_64-unknown-uefi": ["@rules_rust//rust/platform:x86_64-unknown-uefi"], -} - -############################################################################### - -def crate_repositories(): - """A macro for defining repositories for all generated crates. - - Returns: - A list of repos visible to the module through the module extension. - """ - maybe( - http_archive, - name = "vendor_py__aho-corasick-1.1.3", - sha256 = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916", - type = "tar.gz", - urls = ["https://static.crates.io/crates/aho-corasick/1.1.3/download"], - strip_prefix = "aho-corasick-1.1.3", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.aho-corasick-1.1.3.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__anstream-0.6.18", - sha256 = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b", - type = "tar.gz", - urls = ["https://static.crates.io/crates/anstream/0.6.18/download"], - strip_prefix = "anstream-0.6.18", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.anstream-0.6.18.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__anstyle-1.0.10", - sha256 = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9", - type = "tar.gz", - urls = ["https://static.crates.io/crates/anstyle/1.0.10/download"], - strip_prefix = "anstyle-1.0.10", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.anstyle-1.0.10.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__anstyle-parse-0.2.6", - sha256 = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9", - type = "tar.gz", - urls = ["https://static.crates.io/crates/anstyle-parse/0.2.6/download"], - strip_prefix = "anstyle-parse-0.2.6", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.anstyle-parse-0.2.6.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__anstyle-query-1.1.2", - sha256 = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c", - type = "tar.gz", - urls = ["https://static.crates.io/crates/anstyle-query/1.1.2/download"], - strip_prefix = "anstyle-query-1.1.2", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.anstyle-query-1.1.2.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__anstyle-wincon-3.0.7", - sha256 = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e", - type = "tar.gz", - urls = ["https://static.crates.io/crates/anstyle-wincon/3.0.7/download"], - strip_prefix = "anstyle-wincon-3.0.7", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.anstyle-wincon-3.0.7.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__anyhow-1.0.95", - sha256 = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04", - type = "tar.gz", - urls = ["https://static.crates.io/crates/anyhow/1.0.95/download"], - strip_prefix = "anyhow-1.0.95", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.anyhow-1.0.95.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__cc-1.2.14", - sha256 = "0c3d1b2e905a3a7b00a6141adb0e4c0bb941d11caf55349d863942a1cc44e3c9", - type = "tar.gz", - urls = ["https://static.crates.io/crates/cc/1.2.14/download"], - strip_prefix = "cc-1.2.14", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.cc-1.2.14.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__clap-4.5.30", - sha256 = "92b7b18d71fad5313a1e320fa9897994228ce274b60faa4d694fe0ea89cd9e6d", - type = "tar.gz", - urls = ["https://static.crates.io/crates/clap/4.5.30/download"], - strip_prefix = "clap-4.5.30", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.clap-4.5.30.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__clap_builder-4.5.30", - sha256 = "a35db2071778a7344791a4fb4f95308b5673d219dee3ae348b86642574ecc90c", - type = "tar.gz", - urls = ["https://static.crates.io/crates/clap_builder/4.5.30/download"], - strip_prefix = "clap_builder-4.5.30", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.clap_builder-4.5.30.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__clap_lex-0.7.4", - sha256 = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6", - type = "tar.gz", - urls = ["https://static.crates.io/crates/clap_lex/0.7.4/download"], - strip_prefix = "clap_lex-0.7.4", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.clap_lex-0.7.4.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__colorchoice-1.0.3", - sha256 = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990", - type = "tar.gz", - urls = ["https://static.crates.io/crates/colorchoice/1.0.3/download"], - strip_prefix = "colorchoice-1.0.3", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.colorchoice-1.0.3.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__is_terminal_polyfill-1.70.1", - sha256 = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf", - type = "tar.gz", - urls = ["https://static.crates.io/crates/is_terminal_polyfill/1.70.1/download"], - strip_prefix = "is_terminal_polyfill-1.70.1", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.is_terminal_polyfill-1.70.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__itoa-1.0.14", - sha256 = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674", - type = "tar.gz", - urls = ["https://static.crates.io/crates/itoa/1.0.14/download"], - strip_prefix = "itoa-1.0.14", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.itoa-1.0.14.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__log-0.4.25", - sha256 = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f", - type = "tar.gz", - urls = ["https://static.crates.io/crates/log/0.4.25/download"], - strip_prefix = "log-0.4.25", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.log-0.4.25.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__memchr-2.7.4", - sha256 = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3", - type = "tar.gz", - urls = ["https://static.crates.io/crates/memchr/2.7.4/download"], - strip_prefix = "memchr-2.7.4", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.memchr-2.7.4.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__once_cell-1.20.3", - sha256 = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e", - type = "tar.gz", - urls = ["https://static.crates.io/crates/once_cell/1.20.3/download"], - strip_prefix = "once_cell-1.20.3", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.once_cell-1.20.3.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__proc-macro2-1.0.93", - sha256 = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99", - type = "tar.gz", - urls = ["https://static.crates.io/crates/proc-macro2/1.0.93/download"], - strip_prefix = "proc-macro2-1.0.93", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.proc-macro2-1.0.93.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__quote-1.0.38", - sha256 = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc", - type = "tar.gz", - urls = ["https://static.crates.io/crates/quote/1.0.38/download"], - strip_prefix = "quote-1.0.38", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.quote-1.0.38.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__regex-1.11.1", - sha256 = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191", - type = "tar.gz", - urls = ["https://static.crates.io/crates/regex/1.11.1/download"], - strip_prefix = "regex-1.11.1", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.regex-1.11.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__regex-automata-0.4.9", - sha256 = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908", - type = "tar.gz", - urls = ["https://static.crates.io/crates/regex-automata/0.4.9/download"], - strip_prefix = "regex-automata-0.4.9", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.regex-automata-0.4.9.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__regex-syntax-0.8.5", - sha256 = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c", - type = "tar.gz", - urls = ["https://static.crates.io/crates/regex-syntax/0.8.5/download"], - strip_prefix = "regex-syntax-0.8.5", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.regex-syntax-0.8.5.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__ryu-1.0.19", - sha256 = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ryu/1.0.19/download"], - strip_prefix = "ryu-1.0.19", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.ryu-1.0.19.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__serde-1.0.217", - sha256 = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70", - type = "tar.gz", - urls = ["https://static.crates.io/crates/serde/1.0.217/download"], - strip_prefix = "serde-1.0.217", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.serde-1.0.217.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__serde_derive-1.0.217", - sha256 = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0", - type = "tar.gz", - urls = ["https://static.crates.io/crates/serde_derive/1.0.217/download"], - strip_prefix = "serde_derive-1.0.217", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.serde_derive-1.0.217.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__serde_json-1.0.138", - sha256 = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949", - type = "tar.gz", - urls = ["https://static.crates.io/crates/serde_json/1.0.138/download"], - strip_prefix = "serde_json-1.0.138", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.serde_json-1.0.138.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__shlex-1.3.0", - sha256 = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64", - type = "tar.gz", - urls = ["https://static.crates.io/crates/shlex/1.3.0/download"], - strip_prefix = "shlex-1.3.0", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.shlex-1.3.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__smallvec-1.14.0", - sha256 = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd", - type = "tar.gz", - urls = ["https://static.crates.io/crates/smallvec/1.14.0/download"], - strip_prefix = "smallvec-1.14.0", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.smallvec-1.14.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__streaming-iterator-0.1.9", - sha256 = "2b2231b7c3057d5e4ad0156fb3dc807d900806020c5ffa3ee6ff2c8c76fb8520", - type = "tar.gz", - urls = ["https://static.crates.io/crates/streaming-iterator/0.1.9/download"], - strip_prefix = "streaming-iterator-0.1.9", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.streaming-iterator-0.1.9.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__strsim-0.11.1", - sha256 = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f", - type = "tar.gz", - urls = ["https://static.crates.io/crates/strsim/0.11.1/download"], - strip_prefix = "strsim-0.11.1", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.strsim-0.11.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__syn-2.0.98", - sha256 = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1", - type = "tar.gz", - urls = ["https://static.crates.io/crates/syn/2.0.98/download"], - strip_prefix = "syn-2.0.98", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.syn-2.0.98.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__thiserror-1.0.69", - sha256 = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52", - type = "tar.gz", - urls = ["https://static.crates.io/crates/thiserror/1.0.69/download"], - strip_prefix = "thiserror-1.0.69", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.thiserror-1.0.69.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__thiserror-impl-1.0.69", - sha256 = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1", - type = "tar.gz", - urls = ["https://static.crates.io/crates/thiserror-impl/1.0.69/download"], - strip_prefix = "thiserror-impl-1.0.69", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.thiserror-impl-1.0.69.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__tree-sitter-0.24.7", - sha256 = "a5387dffa7ffc7d2dae12b50c6f7aab8ff79d6210147c6613561fc3d474c6f75", - type = "tar.gz", - urls = ["https://static.crates.io/crates/tree-sitter/0.24.7/download"], - strip_prefix = "tree-sitter-0.24.7", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.tree-sitter-0.24.7.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__tree-sitter-graph-0.12.0", - sha256 = "63f86eb73c7d891c4b9b6fe4d4e63dd94c506e4788af7c2296afdcfbeea626cc", - type = "tar.gz", - urls = ["https://static.crates.io/crates/tree-sitter-graph/0.12.0/download"], - strip_prefix = "tree-sitter-graph-0.12.0", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.tree-sitter-graph-0.12.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__tree-sitter-language-0.1.5", - sha256 = "c4013970217383f67b18aef68f6fb2e8d409bc5755227092d32efb0422ba24b8", - type = "tar.gz", - urls = ["https://static.crates.io/crates/tree-sitter-language/0.1.5/download"], - strip_prefix = "tree-sitter-language-0.1.5", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.tree-sitter-language-0.1.5.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__unicode-ident-1.0.16", - sha256 = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034", - type = "tar.gz", - urls = ["https://static.crates.io/crates/unicode-ident/1.0.16/download"], - strip_prefix = "unicode-ident-1.0.16", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.unicode-ident-1.0.16.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__utf8parse-0.2.2", - sha256 = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821", - type = "tar.gz", - urls = ["https://static.crates.io/crates/utf8parse/0.2.2/download"], - strip_prefix = "utf8parse-0.2.2", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.utf8parse-0.2.2.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__windows-sys-0.59.0", - sha256 = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b", - type = "tar.gz", - urls = ["https://static.crates.io/crates/windows-sys/0.59.0/download"], - strip_prefix = "windows-sys-0.59.0", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.windows-sys-0.59.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__windows-targets-0.52.6", - sha256 = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973", - type = "tar.gz", - urls = ["https://static.crates.io/crates/windows-targets/0.52.6/download"], - strip_prefix = "windows-targets-0.52.6", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.windows-targets-0.52.6.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__windows_aarch64_gnullvm-0.52.6", - sha256 = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3", - type = "tar.gz", - urls = ["https://static.crates.io/crates/windows_aarch64_gnullvm/0.52.6/download"], - strip_prefix = "windows_aarch64_gnullvm-0.52.6", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.windows_aarch64_gnullvm-0.52.6.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__windows_aarch64_msvc-0.52.6", - sha256 = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469", - type = "tar.gz", - urls = ["https://static.crates.io/crates/windows_aarch64_msvc/0.52.6/download"], - strip_prefix = "windows_aarch64_msvc-0.52.6", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.windows_aarch64_msvc-0.52.6.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__windows_i686_gnu-0.52.6", - sha256 = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b", - type = "tar.gz", - urls = ["https://static.crates.io/crates/windows_i686_gnu/0.52.6/download"], - strip_prefix = "windows_i686_gnu-0.52.6", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.windows_i686_gnu-0.52.6.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__windows_i686_gnullvm-0.52.6", - sha256 = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66", - type = "tar.gz", - urls = ["https://static.crates.io/crates/windows_i686_gnullvm/0.52.6/download"], - strip_prefix = "windows_i686_gnullvm-0.52.6", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.windows_i686_gnullvm-0.52.6.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__windows_i686_msvc-0.52.6", - sha256 = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66", - type = "tar.gz", - urls = ["https://static.crates.io/crates/windows_i686_msvc/0.52.6/download"], - strip_prefix = "windows_i686_msvc-0.52.6", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.windows_i686_msvc-0.52.6.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__windows_x86_64_gnu-0.52.6", - sha256 = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78", - type = "tar.gz", - urls = ["https://static.crates.io/crates/windows_x86_64_gnu/0.52.6/download"], - strip_prefix = "windows_x86_64_gnu-0.52.6", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.windows_x86_64_gnu-0.52.6.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__windows_x86_64_gnullvm-0.52.6", - sha256 = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d", - type = "tar.gz", - urls = ["https://static.crates.io/crates/windows_x86_64_gnullvm/0.52.6/download"], - strip_prefix = "windows_x86_64_gnullvm-0.52.6", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.windows_x86_64_gnullvm-0.52.6.bazel"), - ) - - maybe( - http_archive, - name = "vendor_py__windows_x86_64_msvc-0.52.6", - sha256 = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec", - type = "tar.gz", - urls = ["https://static.crates.io/crates/windows_x86_64_msvc/0.52.6/download"], - strip_prefix = "windows_x86_64_msvc-0.52.6", - build_file = Label("//misc/bazel/3rdparty/py_deps:BUILD.windows_x86_64_msvc-0.52.6.bazel"), - ) - - return [ - struct(repo = "vendor_py__anyhow-1.0.95", is_dev_dep = False), - struct(repo = "vendor_py__cc-1.2.14", is_dev_dep = False), - struct(repo = "vendor_py__clap-4.5.30", is_dev_dep = False), - struct(repo = "vendor_py__regex-1.11.1", is_dev_dep = False), - struct(repo = "vendor_py__tree-sitter-0.24.7", is_dev_dep = False), - struct(repo = "vendor_py__tree-sitter-graph-0.12.0", is_dev_dep = False), - ] +"""Deprecated: re-exports the crate_universe macros from `:crates.bzl`.""" + +load( + ":crates.bzl", + _aliases = "aliases", + _all_crate_deps = "all_crate_deps", + _crate_deps = "crate_deps", + _crate_edition = "crate_edition", + _crate_repositories = "crate_repositories", +) + +aliases = _aliases +all_crate_deps = _all_crate_deps +crate_deps = _crate_deps +crate_edition = _crate_edition +crate_repositories = _crate_repositories diff --git a/misc/bazel/3rdparty/py_deps/regex-1.11.1/BUILD.bazel b/misc/bazel/3rdparty/py_deps/regex-1.11.1/BUILD.bazel new file mode 100644 index 000000000000..325b1acac5e6 --- /dev/null +++ b/misc/bazel/3rdparty/py_deps/regex-1.11.1/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_py_deps +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "regex-1.11.1", + actual = "@vendor_py__regex-1.11.1//:regex", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/py_deps/regex/BUILD.bazel b/misc/bazel/3rdparty/py_deps/regex/BUILD.bazel new file mode 100644 index 000000000000..9968c5afe14a --- /dev/null +++ b/misc/bazel/3rdparty/py_deps/regex/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_py_deps +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "regex", + actual = "@vendor_py__regex-1.11.1//:regex", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/py_deps/tree-sitter-0.24.7/BUILD.bazel b/misc/bazel/3rdparty/py_deps/tree-sitter-0.24.7/BUILD.bazel new file mode 100644 index 000000000000..8d7ea5705f95 --- /dev/null +++ b/misc/bazel/3rdparty/py_deps/tree-sitter-0.24.7/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_py_deps +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "tree-sitter-0.24.7", + actual = "@vendor_py__tree-sitter-0.24.7//:tree_sitter", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/py_deps/tree-sitter-graph-0.12.0/BUILD.bazel b/misc/bazel/3rdparty/py_deps/tree-sitter-graph-0.12.0/BUILD.bazel new file mode 100644 index 000000000000..f460a84e4181 --- /dev/null +++ b/misc/bazel/3rdparty/py_deps/tree-sitter-graph-0.12.0/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_py_deps +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "tree-sitter-graph-0.12.0", + actual = "@vendor_py__tree-sitter-graph-0.12.0//:tree_sitter_graph", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/py_deps/tree-sitter-graph/BUILD.bazel b/misc/bazel/3rdparty/py_deps/tree-sitter-graph/BUILD.bazel new file mode 100644 index 000000000000..3ed15473bc90 --- /dev/null +++ b/misc/bazel/3rdparty/py_deps/tree-sitter-graph/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_py_deps +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "tree-sitter-graph", + actual = "@vendor_py__tree-sitter-graph-0.12.0//:tree_sitter_graph", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/py_deps/tree-sitter/BUILD.bazel b/misc/bazel/3rdparty/py_deps/tree-sitter/BUILD.bazel new file mode 100644 index 000000000000..9bd226f8164d --- /dev/null +++ b/misc/bazel/3rdparty/py_deps/tree-sitter/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_py_deps +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "tree-sitter", + actual = "@vendor_py__tree-sitter-0.24.7//:tree_sitter", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.adler2-2.0.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.adler2-2.0.1.bazel index 2a2e575fd128..dbd1849d4a9c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.adler2-2.0.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.adler2-2.0.1.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.aho-corasick-1.1.5.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.aho-corasick-1.1.5.bazel index 765dd6dabfda..ffdb58ca333d 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.aho-corasick-1.1.5.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.aho-corasick-1.1.5.bazel @@ -57,12 +57,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -74,13 +76,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -88,6 +100,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.allocator-api2-0.2.21.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.allocator-api2-0.2.21.bazel index 4fe1a5ae3dba..99c359be3dc7 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.allocator-api2-0.2.21.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.allocator-api2-0.2.21.bazel @@ -55,12 +55,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -72,13 +74,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -86,6 +98,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.android_system_properties-0.1.5.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.android_system_properties-0.1.5.bazel index 240b40a2663c..4802a82d4912 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.android_system_properties-0.1.5.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.android_system_properties-0.1.5.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstream-1.0.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstream-1.0.0.bazel index dbd980940c0b..c58f7a2cd263 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstream-1.0.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstream-1.0.0.bazel @@ -57,12 +57,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -74,13 +76,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -88,6 +100,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-1.0.14.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-1.0.14.bazel index 31423b2f54ce..0fc9c7ed0d47 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-1.0.14.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-1.0.14.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-parse-1.0.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-parse-1.0.0.bazel index e953847f8c00..c962383c601a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-parse-1.0.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-parse-1.0.0.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-query-1.1.5.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-query-1.1.5.bazel index f7aa26babb74..be44598b9c65 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-query-1.1.5.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-query-1.1.5.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-wincon-3.0.11.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-wincon-3.0.11.bazel index 5fc09341b964..d60d14088302 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-wincon-3.0.11.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anstyle-wincon-3.0.11.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anyhow-1.0.104.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anyhow-1.0.104.bazel index e34f003bf23a..17bcad0deff0 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anyhow-1.0.104.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.anyhow-1.0.104.bazel @@ -60,12 +60,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -77,13 +79,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -91,6 +103,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -103,7 +116,7 @@ rust_library( }), version = "1.0.104", deps = [ - "@vendor_ts__anyhow-1.0.104//:build_script_build", + ":build_script_build", ], ) @@ -113,6 +126,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -145,6 +161,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "anyhow", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.argfile-1.0.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.argfile-1.0.0.bazel index 4a9f462734e5..baae4d331abe 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.argfile-1.0.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.argfile-1.0.0.bazel @@ -55,12 +55,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -72,13 +74,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -86,6 +98,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.arrayvec-0.7.8.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.arrayvec-0.7.8.bazel index 29f2f212b964..c16e02e7515e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.arrayvec-0.7.8.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.arrayvec-0.7.8.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.atomic-0.6.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.atomic-0.6.1.bazel index 85ab8b6872dd..744c4b168ed0 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.atomic-0.6.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.atomic-0.6.1.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.autocfg-1.5.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.autocfg-1.5.1.bazel index a7076288c6f5..c37ceeee8be7 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.autocfg-1.5.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.autocfg-1.5.1.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.base64-0.22.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.base64-0.22.1.bazel index 089c4eb1ba86..e3694fae4c0c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.base64-0.22.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.base64-0.22.1.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bazel index c644a785e7c3..20da09029c6e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bazel @@ -553,18 +553,6 @@ alias( tags = ["manual"], ) -alias( - name = "swift-syntax-rs-0.1.0", - actual = "@vendor_ts__swift-syntax-rs-0.1.0//:swift_syntax_rs", - tags = ["manual"], -) - -alias( - name = "swift-syntax-rs", - actual = "@vendor_ts__swift-syntax-rs-0.1.0//:swift_syntax_rs", - tags = ["manual"], -) - alias( name = "syn-3.0.3", actual = "@vendor_ts__syn-3.0.3//:syn", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bitflags-1.3.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bitflags-1.3.2.bazel index 0d981e7ac580..20bbe9c068a9 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bitflags-1.3.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bitflags-1.3.2.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bitflags-2.13.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bitflags-2.13.1.bazel index 6bb0907106fd..b8f3e99f2c2f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bitflags-2.13.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bitflags-2.13.1.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.borsh-1.8.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.borsh-1.8.0.bazel index 4656f98793ad..0d55909c3f1c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.borsh-1.8.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.borsh-1.8.0.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,7 +112,7 @@ rust_library( }), version = "1.8.0", deps = [ - "@vendor_ts__borsh-1.8.0//:build_script_build", + ":build_script_build", ], ) @@ -109,6 +122,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -137,6 +153,7 @@ cargo_build_script( ], ), edition = "2018", + emit_warnings = False, pkg_name = "borsh", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.boxcar-0.2.14.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.boxcar-0.2.14.bazel index 1238ed9a02bf..eca4e832c4b8 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.boxcar-0.2.14.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.boxcar-0.2.14.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bs58-0.5.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bs58-0.5.1.bazel index 9501e5277cc7..88a0e7c23613 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bs58-0.5.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bs58-0.5.1.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bstr-1.12.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bstr-1.12.1.bazel index 022b9222e213..da7e97714681 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bstr-1.12.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bstr-1.12.1.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bumpalo-3.20.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bumpalo-3.20.3.bazel index d91c7ef09fb8..af7caf142940 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bumpalo-3.20.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bumpalo-3.20.3.bazel @@ -55,12 +55,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -72,13 +74,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -86,6 +98,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bytemuck-1.25.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bytemuck-1.25.0.bazel index b39efaf84360..f4608f644ff0 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bytemuck-1.25.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bytemuck-1.25.0.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bytes-1.12.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bytes-1.12.1.bazel index 2e756a5adcaf..a9491426dcdd 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bytes-1.12.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bytes-1.12.1.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.camino-1.2.5.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.camino-1.2.5.bazel index abe7c5a715f4..cf347ec4a10a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.camino-1.2.5.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.camino-1.2.5.bazel @@ -59,12 +59,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -76,13 +78,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -90,6 +102,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -102,7 +115,7 @@ rust_library( }), version = "1.2.5", deps = [ - "@vendor_ts__camino-1.2.5//:build_script_build", + ":build_script_build", "@vendor_ts__serde_core-1.0.229//:serde_core", ], ) @@ -113,6 +126,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -144,6 +160,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "camino", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo-platform-0.3.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo-platform-0.3.3.bazel index 6af5bed934ff..84441a27aeff 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo-platform-0.3.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo-platform-0.3.3.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo_metadata-0.23.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo_metadata-0.23.1.bazel index a334db245fc3..1eff47aadbbc 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo_metadata-0.23.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cargo_metadata-0.23.1.bazel @@ -55,12 +55,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -72,13 +74,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -86,6 +98,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cc-1.4.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cc-1.4.2.bazel index d5e676a61243..dda8e612c875 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cc-1.4.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cc-1.4.2.bazel @@ -55,12 +55,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -72,13 +74,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -86,6 +98,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -117,6 +130,9 @@ rust_library( "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ "@vendor_ts__libc-0.2.189//:libc", # i686-unknown-linux-gnu ], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.189//:libc", # loongarch64-unknown-linux-gnu + ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ "@vendor_ts__libc-0.2.189//:libc", # powerpc-unknown-linux-gnu ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cfg-if-1.0.4.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cfg-if-1.0.4.bazel index 415a85fe18cc..9d987cefc005 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cfg-if-1.0.4.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cfg-if-1.0.4.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cfg_aliases-0.2.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cfg_aliases-0.2.2.bazel index 411db63dd67c..b31b373c6558 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cfg_aliases-0.2.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cfg_aliases-0.2.2.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chacha20-0.10.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chacha20-0.10.1.bazel index d2cacdeed256..ed67f9beea4f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chacha20-0.10.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chacha20-0.10.1.bazel @@ -55,12 +55,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -72,13 +74,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -86,6 +98,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -122,6 +135,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-apple-ios": [ "@vendor_ts__cpufeatures-0.3.0//:cpufeatures", # cfg(any(target_arch = "x86_64", target_arch = "x86")) ], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [ + "@vendor_ts__cpufeatures-0.3.0//:cpufeatures", # cfg(any(target_arch = "x86_64", target_arch = "x86")) + ], "@rules_rust//rust/platform:x86_64-linux-android": [ "@vendor_ts__cpufeatures-0.3.0//:cpufeatures", # cfg(any(target_arch = "x86_64", target_arch = "x86")) ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-derive-0.104.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-derive-0.104.0.bazel index 97e744a18d44..572862345f27 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-derive-0.104.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-derive-0.104.0.bazel @@ -52,12 +52,14 @@ rust_proc_macro( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_proc_macro( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_proc_macro( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-ir-0.104.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-ir-0.104.0.bazel index 5d534a7ce399..852edb6b7a1f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-ir-0.104.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chalk-ir-0.104.0.bazel @@ -55,12 +55,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -72,13 +74,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -86,6 +98,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chrono-0.4.45.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chrono-0.4.45.bazel index 20f608e8ffca..d8d948f5fc55 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chrono-0.4.45.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.chrono-0.4.45.bazel @@ -67,12 +67,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -84,13 +86,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -98,6 +110,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -119,6 +132,9 @@ rust_library( "@rules_rust//rust/platform:aarch64-apple-ios": [ "@vendor_ts__iana-time-zone-0.1.65//:iana_time_zone", # aarch64-apple-ios ], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [ + "@vendor_ts__iana-time-zone-0.1.65//:iana_time_zone", # aarch64-apple-ios-macabi + ], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ "@vendor_ts__iana-time-zone-0.1.65//:iana_time_zone", # aarch64-apple-ios-sim ], @@ -167,6 +183,12 @@ rust_library( "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ "@vendor_ts__iana-time-zone-0.1.65//:iana_time_zone", # i686-unknown-linux-gnu ], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [ + "@vendor_ts__iana-time-zone-0.1.65//:iana_time_zone", # loongarch64-unknown-linux-gnu + ], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [ + "@vendor_ts__iana-time-zone-0.1.65//:iana_time_zone", # mips-unknown-linux-gnu + ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ "@vendor_ts__iana-time-zone-0.1.65//:iana_time_zone", # powerpc-unknown-linux-gnu ], @@ -176,6 +198,15 @@ rust_library( "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ "@vendor_ts__iana-time-zone-0.1.65//:iana_time_zone", # s390x-unknown-linux-gnu ], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [ + "@vendor_ts__iana-time-zone-0.1.65//:iana_time_zone", # sparc64-unknown-linux-gnu + ], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [ + "@vendor_ts__iana-time-zone-0.1.65//:iana_time_zone", # sparc64-unknown-netbsd + ], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [ + "@vendor_ts__iana-time-zone-0.1.65//:iana_time_zone", # sparc64-unknown-openbsd + ], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [ "@vendor_ts__iana-time-zone-0.1.65//:iana_time_zone", # wasm32-unknown-emscripten ], @@ -189,6 +220,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-apple-ios": [ "@vendor_ts__iana-time-zone-0.1.65//:iana_time_zone", # x86_64-apple-ios ], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [ + "@vendor_ts__iana-time-zone-0.1.65//:iana_time_zone", # x86_64-apple-ios-macabi + ], "@rules_rust//rust/platform:x86_64-linux-android": [ "@vendor_ts__iana-time-zone-0.1.65//:iana_time_zone", # x86_64-linux-android ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap-4.6.6.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap-4.6.6.bazel index d67d5c9cb3f5..e23f372b0bee 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap-4.6.6.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap-4.6.6.bazel @@ -65,12 +65,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -82,13 +84,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -96,6 +108,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_builder-4.6.6.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_builder-4.6.6.bazel index a592f02d5b7b..8a02211e7f1c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_builder-4.6.6.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_builder-4.6.6.bazel @@ -60,12 +60,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -77,13 +79,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -91,6 +103,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_derive-4.6.4.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_derive-4.6.4.bazel index 64f4bfc6e037..10a3b1ca209b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_derive-4.6.4.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_derive-4.6.4.bazel @@ -55,12 +55,14 @@ rust_proc_macro( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -72,13 +74,23 @@ rust_proc_macro( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -86,6 +98,7 @@ rust_proc_macro( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_lex-1.1.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_lex-1.1.0.bazel index 701c96d00d9e..ba5946832aca 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_lex-1.1.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.clap_lex-1.1.0.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cobs-0.3.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cobs-0.3.0.bazel index 875a4219fae7..22ed036b1abf 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cobs-0.3.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cobs-0.3.0.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.colorchoice-1.0.5.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.colorchoice-1.0.5.bazel index 59b50356c647..e0c30d441ded 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.colorchoice-1.0.5.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.colorchoice-1.0.5.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.core-foundation-sys-0.8.7.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.core-foundation-sys-0.8.7.bazel index fdbed4c6dc75..c3f9a4384887 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.core-foundation-sys-0.8.7.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.core-foundation-sys-0.8.7.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.countme-3.0.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.countme-3.0.1.bazel index 24e1b277c8e6..31c0932048a5 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.countme-3.0.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.countme-3.0.1.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cov-mark-2.2.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cov-mark-2.2.0.bazel index 0548d73ed680..083abb9e6774 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cov-mark-2.2.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cov-mark-2.2.0.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cpufeatures-0.3.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cpufeatures-0.3.0.bazel index fc1d247e88d5..7093806abab5 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cpufeatures-0.3.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.cpufeatures-0.3.0.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -101,6 +114,9 @@ rust_library( "@rules_rust//rust/platform:aarch64-apple-ios": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(all(target_arch = "aarch64", target_vendor = "apple")) ], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(target_arch = "aarch64", target_vendor = "apple")) + ], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(all(target_arch = "aarch64", target_vendor = "apple")) ], @@ -113,6 +129,9 @@ rust_library( "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(all(target_arch = "aarch64", target_os = "linux")) ], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(target_arch = "loongarch64", target_os = "linux")) + ], "//conditions:default": [], }), ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crc32fast-1.5.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crc32fast-1.5.0.bazel index ee8ffed758d6..ad0b2007fd41 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crc32fast-1.5.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crc32fast-1.5.0.bazel @@ -60,12 +60,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -77,13 +79,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -91,6 +103,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -103,8 +116,8 @@ rust_library( }), version = "1.5.0", deps = [ + ":build_script_build", "@vendor_ts__cfg-if-1.0.4//:cfg_if", - "@vendor_ts__crc32fast-1.5.0//:build_script_build", ], ) @@ -114,6 +127,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -146,6 +162,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "crc32fast", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-channel-0.5.16.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-channel-0.5.16.bazel index 4172ffc32e79..e7a06ce4a92e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-channel-0.5.16.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-channel-0.5.16.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-deque-0.8.7.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-deque-0.8.7.bazel index b71afab9ca9d..8161357085a6 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-deque-0.8.7.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-deque-0.8.7.bazel @@ -60,12 +60,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -77,13 +79,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -91,6 +103,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -103,7 +116,7 @@ rust_library( }), version = "0.8.7", deps = [ - "@vendor_ts__crossbeam-deque-0.8.7//:build_script_build", + ":build_script_build", "@vendor_ts__crossbeam-epoch-0.9.20//:crossbeam_epoch", "@vendor_ts__crossbeam-utils-0.8.22//:crossbeam_utils", ], @@ -115,6 +128,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -147,6 +163,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "crossbeam-deque", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-epoch-0.9.20.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-epoch-0.9.20.bazel index 0e0e00444ab2..dd85387d6a66 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-epoch-0.9.20.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-epoch-0.9.20.bazel @@ -60,12 +60,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -77,13 +79,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -91,6 +103,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -103,7 +116,7 @@ rust_library( }), version = "0.9.20", deps = [ - "@vendor_ts__crossbeam-epoch-0.9.20//:build_script_build", + ":build_script_build", "@vendor_ts__crossbeam-utils-0.8.22//:crossbeam_utils", ], ) @@ -114,6 +127,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -146,6 +162,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "crossbeam-epoch", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-queue-0.3.12.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-queue-0.3.12.bazel index 9343a0d0050b..d5e02cf707e0 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-queue-0.3.12.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-queue-0.3.12.bazel @@ -57,12 +57,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -74,13 +76,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -88,6 +100,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-utils-0.8.22.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-utils-0.8.22.bazel index 0f8efc035997..0678c856ecf4 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-utils-0.8.22.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.crossbeam-utils-0.8.22.bazel @@ -60,12 +60,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -77,13 +79,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -91,6 +103,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -103,7 +116,7 @@ rust_library( }), version = "0.8.22", deps = [ - "@vendor_ts__crossbeam-utils-0.8.22//:build_script_build", + ":build_script_build", ], ) @@ -113,6 +126,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -145,6 +161,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "crossbeam-utils", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling-0.23.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling-0.23.0.bazel index 84da5eac9d94..7b56ff466da5 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling-0.23.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling-0.23.0.bazel @@ -59,12 +59,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -76,13 +78,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -90,6 +102,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling_core-0.23.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling_core-0.23.0.bazel index c950eee8f5f0..0a3fe631c7cd 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling_core-0.23.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling_core-0.23.0.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling_macro-0.23.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling_macro-0.23.0.bazel index de5fb2667de2..8f77c9a5718d 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling_macro-0.23.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.darling_macro-0.23.0.bazel @@ -52,12 +52,14 @@ rust_proc_macro( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_proc_macro( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_proc_macro( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.dashmap-6.2.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.dashmap-6.2.1.bazel index 79dfc9f42794..764d17ef9257 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.dashmap-6.2.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.dashmap-6.2.1.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.defmt-1.1.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.defmt-1.1.1.bazel index 1b456bb736f0..0dbaddc782d8 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.defmt-1.1.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.defmt-1.1.1.bazel @@ -59,12 +59,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -76,13 +78,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -90,6 +102,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -102,8 +115,8 @@ rust_library( }), version = "1.1.1", deps = [ + ":build_script_build", "@vendor_ts__bitflags-1.3.2//:bitflags", - "@vendor_ts__defmt-1.1.1//:build_script_build", ], ) @@ -113,6 +126,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -141,6 +157,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, links = "defmt", pkg_name = "defmt", rustc_env_files = [ diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.defmt-macros-1.1.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.defmt-macros-1.1.1.bazel index 39b1acc1da0f..71c8b152e00e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.defmt-macros-1.1.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.defmt-macros-1.1.1.bazel @@ -56,12 +56,14 @@ rust_proc_macro( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_proc_macro( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_proc_macro( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,7 +112,7 @@ rust_proc_macro( }), version = "1.1.1", deps = [ - "@vendor_ts__defmt-macros-1.1.1//:build_script_build", + ":build_script_build", "@vendor_ts__defmt-parser-1.0.0//:defmt_parser", "@vendor_ts__proc-macro2-1.0.107//:proc_macro2", "@vendor_ts__quote-1.0.47//:quote", @@ -113,6 +126,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -141,6 +157,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "defmt-macros", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.defmt-parser-1.0.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.defmt-parser-1.0.0.bazel index b9302e3870bd..852811357a37 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.defmt-parser-1.0.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.defmt-parser-1.0.0.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.deranged-0.5.8.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.deranged-0.5.8.bazel index ec21bfae7bba..c0c0362f112f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.deranged-0.5.8.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.deranged-0.5.8.bazel @@ -55,12 +55,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -72,13 +74,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -86,6 +98,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.derive-where-1.6.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.derive-where-1.6.1.bazel index b58ff3e4868c..bf458f19425f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.derive-where-1.6.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.derive-where-1.6.1.bazel @@ -52,12 +52,14 @@ rust_proc_macro( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_proc_macro( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_proc_macro( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.dissimilar-1.0.11.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.dissimilar-1.0.11.bazel index 79ee7c7ee72a..beb02d9fa4e2 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.dissimilar-1.0.11.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.dissimilar-1.0.11.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.drop_bomb-0.1.5.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.drop_bomb-0.1.5.bazel index d63db7ce6aa5..c79036f96af7 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.drop_bomb-0.1.5.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.drop_bomb-0.1.5.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.dunce-1.0.5.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.dunce-1.0.5.bazel index c47d2917bf68..f739664bb789 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.dunce-1.0.5.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.dunce-1.0.5.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.dyn-clone-1.0.20.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.dyn-clone-1.0.20.bazel index 40f78950a02f..3594f9820aaf 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.dyn-clone-1.0.20.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.dyn-clone-1.0.20.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.either-1.17.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.either-1.17.0.bazel index afa7b0288e85..df2158fdd46b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.either-1.17.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.either-1.17.0.bazel @@ -57,12 +57,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -74,13 +76,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -88,6 +100,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.embedded-io-0.4.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.embedded-io-0.4.0.bazel index 1aedeaf25f78..efeec21491db 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.embedded-io-0.4.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.embedded-io-0.4.0.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.embedded-io-0.6.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.embedded-io-0.6.1.bazel index cf929d38e539..6c43e92a25cc 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.embedded-io-0.6.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.embedded-io-0.6.1.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ena-0.14.4.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ena-0.14.4.bazel index a910b648ab36..23169f7be3f7 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ena-0.14.4.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ena-0.14.4.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.encoding-0.2.33.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.encoding-0.2.33.bazel index c88ddeb86a83..4a65fece6e8f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.encoding-0.2.33.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.encoding-0.2.33.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.encoding-index-japanese-1.20141219.5.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.encoding-index-japanese-1.20141219.5.bazel index fc81caebaa98..5896a9ecc42d 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.encoding-index-japanese-1.20141219.5.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.encoding-index-japanese-1.20141219.5.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.encoding-index-korean-1.20141219.5.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.encoding-index-korean-1.20141219.5.bazel index 6776c8f8f2fb..078ff6accb97 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.encoding-index-korean-1.20141219.5.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.encoding-index-korean-1.20141219.5.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.encoding-index-simpchinese-1.20141219.5.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.encoding-index-simpchinese-1.20141219.5.bazel index cd8250d7be68..52bcf54429ab 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.encoding-index-simpchinese-1.20141219.5.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.encoding-index-simpchinese-1.20141219.5.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.encoding-index-singlebyte-1.20141219.5.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.encoding-index-singlebyte-1.20141219.5.bazel index 3466817c9f05..8f904e6a7aca 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.encoding-index-singlebyte-1.20141219.5.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.encoding-index-singlebyte-1.20141219.5.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.encoding-index-tradchinese-1.20141219.5.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.encoding-index-tradchinese-1.20141219.5.bazel index e98585004e60..4ec1935d1a7f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.encoding-index-tradchinese-1.20141219.5.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.encoding-index-tradchinese-1.20141219.5.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.encoding_index_tests-0.1.4.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.encoding_index_tests-0.1.4.bazel index 987bc9667d30..db14708f8670 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.encoding_index_tests-0.1.4.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.encoding_index_tests-0.1.4.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.equivalent-1.0.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.equivalent-1.0.2.bazel index 251b726dcc9d..f9bc520f0fee 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.equivalent-1.0.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.equivalent-1.0.2.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.figment-0.10.19.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.figment-0.10.19.bazel index 29b234484a34..d20df7a4ce67 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.figment-0.10.19.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.figment-0.10.19.bazel @@ -63,12 +63,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -80,13 +82,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -94,6 +106,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -106,7 +119,7 @@ rust_library( }), version = "0.10.19", deps = [ - "@vendor_ts__figment-0.10.19//:build_script_build", + ":build_script_build", "@vendor_ts__pear-0.2.9//:pear", "@vendor_ts__serde-1.0.229//:serde", "@vendor_ts__serde_yaml-0.9.34-deprecated//:serde_yaml", @@ -139,18 +152,36 @@ rust_library( "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ "@vendor_ts__atomic-0.6.1//:atomic", # cfg(any(target_pointer_width = "8", target_pointer_width = "16", target_pointer_width = "32")) ], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [ + "@vendor_ts__atomic-0.6.1//:atomic", # cfg(any(target_pointer_width = "8", target_pointer_width = "16", target_pointer_width = "32")) + ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ "@vendor_ts__atomic-0.6.1//:atomic", # cfg(any(target_pointer_width = "8", target_pointer_width = "16", target_pointer_width = "32")) ], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [ + "@vendor_ts__atomic-0.6.1//:atomic", # cfg(any(target_pointer_width = "8", target_pointer_width = "16", target_pointer_width = "32")) + ], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [ "@vendor_ts__atomic-0.6.1//:atomic", # cfg(any(target_pointer_width = "8", target_pointer_width = "16", target_pointer_width = "32")) ], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [ + "@vendor_ts__atomic-0.6.1//:atomic", # cfg(any(target_pointer_width = "8", target_pointer_width = "16", target_pointer_width = "32")) + ], "@rules_rust//rust/platform:thumbv7em-none-eabi": [ "@vendor_ts__atomic-0.6.1//:atomic", # cfg(any(target_pointer_width = "8", target_pointer_width = "16", target_pointer_width = "32")) ], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [ + "@vendor_ts__atomic-0.6.1//:atomic", # cfg(any(target_pointer_width = "8", target_pointer_width = "16", target_pointer_width = "32")) + ], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [ + "@vendor_ts__atomic-0.6.1//:atomic", # cfg(any(target_pointer_width = "8", target_pointer_width = "16", target_pointer_width = "32")) + ], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [ "@vendor_ts__atomic-0.6.1//:atomic", # cfg(any(target_pointer_width = "8", target_pointer_width = "16", target_pointer_width = "32")) ], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [ + "@vendor_ts__atomic-0.6.1//:atomic", # cfg(any(target_pointer_width = "8", target_pointer_width = "16", target_pointer_width = "32")) + ], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [ "@vendor_ts__atomic-0.6.1//:atomic", # cfg(any(target_pointer_width = "8", target_pointer_width = "16", target_pointer_width = "32")) ], @@ -176,6 +207,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -211,6 +245,7 @@ cargo_build_script( ], ), edition = "2018", + emit_warnings = False, pkg_name = "figment", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.find-msvc-tools-0.1.10.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.find-msvc-tools-0.1.10.bazel index 6585ebabd169..71ae64b18ae2 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.find-msvc-tools-0.1.10.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.find-msvc-tools-0.1.10.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fixedbitset-0.5.7.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fixedbitset-0.5.7.bazel index 01336178f130..938bb88d1db2 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fixedbitset-0.5.7.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fixedbitset-0.5.7.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.flate2-1.1.9.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.flate2-1.1.9.bazel index 9c55039b43f1..dce37d0793cc 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.flate2-1.1.9.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.flate2-1.1.9.bazel @@ -58,12 +58,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -75,13 +77,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -89,6 +101,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.foldhash-0.1.5.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.foldhash-0.1.5.bazel index 8fc2c7d51b89..b0e7bfca0090 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.foldhash-0.1.5.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.foldhash-0.1.5.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.foldhash-0.2.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.foldhash-0.2.0.bazel index 03940fb08ac2..9f93a855be15 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.foldhash-0.2.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.foldhash-0.2.0.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fs-err-3.3.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fs-err-3.3.0.bazel index a8823433285d..4e54c0df3877 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fs-err-3.3.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fs-err-3.3.0.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,7 +112,7 @@ rust_library( }), version = "3.3.0", deps = [ - "@vendor_ts__fs-err-3.3.0//:build_script_build", + ":build_script_build", ], ) @@ -109,6 +122,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -137,6 +153,7 @@ cargo_build_script( ], ), edition = "2018", + emit_warnings = False, pkg_name = "fs-err", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fsevent-sys-4.1.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fsevent-sys-4.1.0.bazel index 1f0b89a5307d..87794962f650 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fsevent-sys-4.1.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fsevent-sys-4.1.0.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fst-0.4.7.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fst-0.4.7.bazel index 484accede2c0..2db05e8d8961 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fst-0.4.7.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.fst-0.4.7.bazel @@ -59,12 +59,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -76,13 +78,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -90,6 +102,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -102,7 +115,7 @@ rust_library( }), version = "0.4.7", deps = [ - "@vendor_ts__fst-0.4.7//:build_script_build", + ":build_script_build", ], ) @@ -112,6 +125,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -143,6 +159,7 @@ cargo_build_script( ], ), edition = "2018", + emit_warnings = False, pkg_name = "fst", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.futures-core-0.3.34.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.futures-core-0.3.34.bazel index aa25f01dc27d..85a921ef7ff8 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.futures-core-0.3.34.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.futures-core-0.3.34.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.futures-task-0.3.34.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.futures-task-0.3.34.bazel index e84d9139b2a5..f960f96829fa 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.futures-task-0.3.34.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.futures-task-0.3.34.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.futures-util-0.3.34.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.futures-util-0.3.34.bazel index 0d564e722dad..83b6c5da7672 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.futures-util-0.3.34.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.futures-util-0.3.34.bazel @@ -57,12 +57,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -74,13 +76,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -88,6 +100,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.getrandom-0.4.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.getrandom-0.4.3.bazel index 48f64d5c587e..58c7d8f79752 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.getrandom-0.4.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.getrandom-0.4.3.bazel @@ -60,12 +60,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -77,13 +79,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -91,6 +103,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -103,8 +116,8 @@ rust_library( }), version = "0.4.3", deps = [ + ":build_script_build", "@vendor_ts__cfg-if-1.0.4//:cfg_if", - "@vendor_ts__getrandom-0.4.3//:build_script_build", "@vendor_ts__rand_core-0.10.1//:rand_core", ] + select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [ @@ -113,6 +126,9 @@ rust_library( "@rules_rust//rust/platform:aarch64-apple-ios": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(any(target_os = "ios", target_os = "visionos", target_os = "watchos", target_os = "tvos")) ], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(target_os = "ios", target_os = "visionos", target_os = "watchos", target_os = "tvos")) + ], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(any(target_os = "ios", target_os = "visionos", target_os = "watchos", target_os = "tvos")) ], @@ -152,6 +168,12 @@ rust_library( "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + ], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], @@ -161,6 +183,15 @@ rust_library( "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) + ], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(target_os = "netbsd") + ], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(target_os = "macos", target_os = "openbsd", target_os = "vita", target_os = "emscripten")) + ], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(any(target_os = "macos", target_os = "openbsd", target_os = "vita", target_os = "emscripten")) ], @@ -170,6 +201,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-apple-ios": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(any(target_os = "ios", target_os = "visionos", target_os = "watchos", target_os = "tvos")) ], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(target_os = "ios", target_os = "visionos", target_os = "watchos", target_os = "tvos")) + ], "@rules_rust//rust/platform:x86_64-linux-android": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(all(any(target_os = "linux", target_os = "android"), not(any(all(target_os = "linux", target_env = ""), getrandom_backend = "custom", getrandom_backend = "linux_raw", getrandom_backend = "rdrand", getrandom_backend = "rndr")))) ], @@ -192,6 +226,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -224,6 +261,7 @@ cargo_build_script( ], ), edition = "2024", + emit_warnings = False, pkg_name = "getrandom", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.glob-0.3.4.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.glob-0.3.4.bazel index 8b00531d59b3..3cfca3bda5b2 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.glob-0.3.4.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.glob-0.3.4.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.globset-0.4.18.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.globset-0.4.18.bazel index 4b8338d1418e..d070d3ff859d 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.globset-0.4.18.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.globset-0.4.18.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.12.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.12.3.bazel index 83f146a6367b..411bf205e59f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.12.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.12.3.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.14.5.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.14.5.bazel index a485aa4c1e62..7460d9c11147 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.14.5.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.14.5.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.15.5.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.15.5.bazel index e7f59867ea65..0764b2faae8d 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.15.5.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.15.5.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.17.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.17.1.bazel index dc437ef82fbe..37b8ba4dfe41 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.17.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashbrown-0.17.1.bazel @@ -60,12 +60,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -77,13 +79,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -91,6 +103,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashlink-0.12.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashlink-0.12.1.bazel index 35ab1761f795..a77ecd159951 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashlink-0.12.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hashlink-0.12.1.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.heck-0.5.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.heck-0.5.0.bazel index a8e52fe9b29f..a6e9298f1629 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.heck-0.5.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.heck-0.5.0.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hermit-abi-0.5.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hermit-abi-0.5.2.bazel index 0db33a0a48a1..5172dd0a1148 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hermit-abi-0.5.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hermit-abi-0.5.2.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hex-0.4.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hex-0.4.3.bazel index 702f649e1109..9351aa85fcaa 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hex-0.4.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.hex-0.4.3.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.iana-time-zone-0.1.65.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.iana-time-zone-0.1.65.bazel index 9660eac29e3c..50c7c2a1c633 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.iana-time-zone-0.1.65.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.iana-time-zone-0.1.65.bazel @@ -55,12 +55,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -72,13 +74,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -86,6 +98,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -104,6 +117,9 @@ rust_library( "@rules_rust//rust/platform:aarch64-apple-ios": [ "@vendor_ts__core-foundation-sys-0.8.7//:core_foundation_sys", # cfg(target_vendor = "apple") ], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [ + "@vendor_ts__core-foundation-sys-0.8.7//:core_foundation_sys", # cfg(target_vendor = "apple") + ], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ "@vendor_ts__core-foundation-sys-0.8.7//:core_foundation_sys", # cfg(target_vendor = "apple") ], @@ -136,6 +152,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-apple-ios": [ "@vendor_ts__core-foundation-sys-0.8.7//:core_foundation_sys", # cfg(target_vendor = "apple") ], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [ + "@vendor_ts__core-foundation-sys-0.8.7//:core_foundation_sys", # cfg(target_vendor = "apple") + ], "@rules_rust//rust/platform:x86_64-linux-android": [ "@vendor_ts__android_system_properties-0.1.5//:android_system_properties", # cfg(target_os = "android") ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.iana-time-zone-haiku-0.1.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.iana-time-zone-haiku-0.1.2.bazel index cdfc181b9c17..28ebc572a4a9 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.iana-time-zone-haiku-0.1.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.iana-time-zone-haiku-0.1.2.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,7 +112,7 @@ rust_library( }), version = "0.1.2", deps = [ - "@vendor_ts__iana-time-zone-haiku-0.1.2//:build_script_build", + ":build_script_build", ], ) @@ -109,6 +122,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -137,6 +153,7 @@ cargo_build_script( ], ), edition = "2018", + emit_warnings = False, pkg_name = "iana-time-zone-haiku", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ident_case-1.0.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ident_case-1.0.1.bazel index 44123d039086..dafffb18f245 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ident_case-1.0.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ident_case-1.0.1.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.indexmap-1.9.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.indexmap-1.9.3.bazel index b80e746408fe..23dadea921df 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.indexmap-1.9.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.indexmap-1.9.3.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,8 +112,8 @@ rust_library( }), version = "1.9.3", deps = [ + ":build_script_build", "@vendor_ts__hashbrown-0.12.3//:hashbrown", - "@vendor_ts__indexmap-1.9.3//:build_script_build", ], ) @@ -110,6 +123,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -138,6 +154,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "indexmap", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.indexmap-2.14.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.indexmap-2.14.0.bazel index 66634436101b..3029bf27404b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.indexmap-2.14.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.indexmap-2.14.0.bazel @@ -57,12 +57,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -74,13 +76,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -88,6 +100,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inlinable_string-0.1.15.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inlinable_string-0.1.15.bazel index 662494b3e799..a8b83e8f251c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inlinable_string-0.1.15.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inlinable_string-0.1.15.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inotify-0.11.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inotify-0.11.1.bazel index 26cafee66759..96628c5e3400 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inotify-0.11.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inotify-0.11.1.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inotify-sys-0.1.8.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inotify-sys-0.1.8.bazel index 8c601ff610b7..e17e1cf2c57c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inotify-sys-0.1.8.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inotify-sys-0.1.8.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,7 +112,7 @@ rust_library( }), version = "0.1.8", deps = [ - "@vendor_ts__inotify-sys-0.1.8//:build_script_build", + ":build_script_build", "@vendor_ts__libc-0.2.189//:libc", ], ) @@ -110,6 +123,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -138,6 +154,7 @@ cargo_build_script( ], ), edition = "2015", + emit_warnings = False, pkg_name = "inotify-sys", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.intrusive-collections-0.10.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.intrusive-collections-0.10.3.bazel index 76d7c45b2b6d..3f7651684c43 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.intrusive-collections-0.10.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.intrusive-collections-0.10.3.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inventory-0.3.24.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inventory-0.3.24.bazel index b2cc79659161..5c50f47a734a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inventory-0.3.24.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.inventory-0.3.24.bazel @@ -70,12 +70,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -87,13 +89,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -101,6 +113,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.is_terminal_polyfill-1.70.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.is_terminal_polyfill-1.70.2.bazel index d42782128b45..169e5417e57c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.is_terminal_polyfill-1.70.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.is_terminal_polyfill-1.70.2.bazel @@ -55,12 +55,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -72,13 +74,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -86,6 +98,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.itertools-0.15.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.itertools-0.15.0.bazel index 78187961b494..8719ca1daef2 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.itertools-0.15.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.itertools-0.15.0.bazel @@ -57,12 +57,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -74,13 +76,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -88,6 +100,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.itoa-1.0.18.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.itoa-1.0.18.bazel index 034a159fcebd..62aa98ad9474 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.itoa-1.0.18.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.itoa-1.0.18.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-0.2.35.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-0.2.35.bazel index ef1c11a64aa2..49d7dcd541e7 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-0.2.35.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-0.2.35.bazel @@ -55,12 +55,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -72,13 +74,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -86,6 +98,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -104,6 +117,10 @@ rust_library( "@vendor_ts__portable-atomic-1.14.0//:portable_atomic", # cfg(not(target_has_atomic = "ptr")) "@vendor_ts__portable-atomic-util-0.2.7//:portable_atomic_util", # cfg(not(target_has_atomic = "ptr")) ], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [ + "@vendor_ts__portable-atomic-1.14.0//:portable_atomic", # cfg(not(target_has_atomic = "ptr")) + "@vendor_ts__portable-atomic-util-0.2.7//:portable_atomic_util", # cfg(not(target_has_atomic = "ptr")) + ], "//conditions:default": [], }), ) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-core-0.1.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-core-0.1.0.bazel index aebc263a798d..27913118c97a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-core-0.1.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-core-0.1.0.bazel @@ -58,12 +58,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -75,13 +77,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -89,6 +101,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-static-0.2.35.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-static-0.2.35.bazel index 4a928c5d748e..627b3855fe40 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-static-0.2.35.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-static-0.2.35.bazel @@ -55,12 +55,14 @@ rust_proc_macro( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -72,13 +74,23 @@ rust_proc_macro( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -86,6 +98,7 @@ rust_proc_macro( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-tzdb-0.1.8.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-tzdb-0.1.8.bazel index 3da05899b7fa..62168da113c5 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-tzdb-0.1.8.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-tzdb-0.1.8.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-tzdb-platform-0.1.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-tzdb-platform-0.1.3.bazel index 01c4b9cb161e..7d1292b9132a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-tzdb-platform-0.1.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jiff-tzdb-platform-0.1.3.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jobserver-0.1.35.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jobserver-0.1.35.bazel index cd468ac4579f..53ac9fcecba3 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jobserver-0.1.35.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jobserver-0.1.35.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -101,6 +114,9 @@ rust_library( "@rules_rust//rust/platform:aarch64-apple-ios": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) + ], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], @@ -149,6 +165,12 @@ rust_library( "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) + ], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) + ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], @@ -158,6 +180,15 @@ rust_library( "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) + ], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) + ], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) + ], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], @@ -167,6 +198,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-apple-ios": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) + ], "@rules_rust//rust/platform:x86_64-linux-android": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jod-thread-1.0.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jod-thread-1.0.0.bazel index 91f0e1ff55dc..d4e59686d3f0 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jod-thread-1.0.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.jod-thread-1.0.0.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.js-sys-0.3.103.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.js-sys-0.3.103.bazel index 9c8b4290ab9e..22ce61014253 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.js-sys-0.3.103.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.js-sys-0.3.103.bazel @@ -57,12 +57,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -74,13 +76,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -88,6 +100,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.kqueue-1.2.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.kqueue-1.2.0.bazel index cb91b015011b..86b101a51ca9 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.kqueue-1.2.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.kqueue-1.2.0.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.kqueue-sys-1.1.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.kqueue-sys-1.1.2.bazel index 2f74bc2a7512..27f1bb2787ef 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.kqueue-sys-1.1.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.kqueue-sys-1.1.2.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.la-arena-0.3.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.la-arena-0.3.1.bazel index ab216fe6e836..155d0074a629 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.la-arena-0.3.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.la-arena-0.3.1.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.lazy_static-1.5.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.lazy_static-1.5.0.bazel index c81cfa64f50f..e95f849bdc8d 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.lazy_static-1.5.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.lazy_static-1.5.0.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.libc-0.2.189.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.libc-0.2.189.bazel index 3818a870bb1f..0d57aff487fb 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.libc-0.2.189.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.libc-0.2.189.bazel @@ -60,12 +60,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -77,13 +79,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -91,6 +103,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -103,7 +116,7 @@ rust_library( }), version = "0.2.189", deps = [ - "@vendor_ts__libc-0.2.189//:build_script_build", + ":build_script_build", ], ) @@ -113,6 +126,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -145,6 +161,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "libc", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.line-index-0.1.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.line-index-0.1.2.bazel index 423b236b28f8..de5a49f68d8d 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.line-index-0.1.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.line-index-0.1.2.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.lock_api-0.4.14.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.lock_api-0.4.14.bazel index 6ceaac5802d0..789424bd7555 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.lock_api-0.4.14.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.lock_api-0.4.14.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.3.9.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.3.9.bazel index 6d70599c6b25..0d06a0596f3b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.3.9.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.3.9.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.4.33.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.4.33.bazel index e820c1c7b598..d1ecaae3eb6a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.4.33.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.log-0.4.33.bazel @@ -55,12 +55,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -72,13 +74,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -86,6 +98,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.matchers-0.2.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.matchers-0.2.0.bazel index 3bf28570b95f..2b2e8af7b7da 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.matchers-0.2.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.matchers-0.2.0.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.memchr-2.8.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.memchr-2.8.3.bazel index 0c58362bdf48..e529b86c79df 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.memchr-2.8.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.memchr-2.8.3.bazel @@ -57,12 +57,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -74,13 +76,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -88,6 +100,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.memoffset-0.9.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.memoffset-0.9.1.bazel index 867f1108683c..3efe2fe7b160 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.memoffset-0.9.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.memoffset-0.9.1.bazel @@ -59,12 +59,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -76,13 +78,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -90,6 +102,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -102,7 +115,7 @@ rust_library( }), version = "0.9.1", deps = [ - "@vendor_ts__memoffset-0.9.1//:build_script_build", + ":build_script_build", ], ) @@ -112,6 +125,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -143,6 +159,7 @@ cargo_build_script( ], ), edition = "2015", + emit_warnings = False, pkg_name = "memoffset", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.miniz_oxide-0.8.9.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.miniz_oxide-0.8.9.bazel index 854567e46fc9..e30643b033ef 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.miniz_oxide-0.8.9.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.miniz_oxide-0.8.9.bazel @@ -57,12 +57,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -74,13 +76,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -88,6 +100,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.mio-1.2.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.mio-1.2.2.bazel index 1ad9b5c83658..0671b12bed92 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.mio-1.2.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.mio-1.2.2.bazel @@ -58,12 +58,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -75,13 +77,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -89,6 +101,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -109,6 +122,9 @@ rust_library( "@rules_rust//rust/platform:aarch64-apple-ios": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + ], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], @@ -157,6 +173,12 @@ rust_library( "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + ], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], @@ -166,6 +188,15 @@ rust_library( "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + ], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + ], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + ], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], @@ -187,6 +218,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-apple-ios": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) + ], "@rules_rust//rust/platform:x86_64-linux-android": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(any(unix, target_os = "hermit", target_os = "wasi")) ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.miow-0.6.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.miow-0.6.1.bazel index 8ffd321c1fe0..8a20f0eed2ed 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.miow-0.6.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.miow-0.6.1.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.mustache-0.9.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.mustache-0.9.0.bazel index a68439e787f9..e69c92e66a2a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.mustache-0.9.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.mustache-0.9.0.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.nohash-hasher-0.2.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.nohash-hasher-0.2.0.bazel index ea49f4108a10..7eb78d9b39ee 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.nohash-hasher-0.2.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.nohash-hasher-0.2.0.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.notify-8.2.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.notify-8.2.0.bazel index 1482ebc65f17..203d03e71ed9 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.notify-8.2.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.notify-8.2.0.bazel @@ -57,12 +57,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -74,13 +76,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -88,6 +100,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -113,6 +126,10 @@ rust_library( "@vendor_ts__kqueue-1.2.0//:kqueue", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) ], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [ + "@vendor_ts__kqueue-1.2.0//:kqueue", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) + "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) + ], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ "@vendor_ts__kqueue-1.2.0//:kqueue", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) @@ -167,6 +184,14 @@ rust_library( "@vendor_ts__inotify-0.11.1//:inotify", # cfg(any(target_os = "linux", target_os = "android")) "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [ + "@vendor_ts__inotify-0.11.1//:inotify", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "linux", target_os = "android")) + ], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [ + "@vendor_ts__inotify-0.11.1//:inotify", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "linux", target_os = "android")) + ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ "@vendor_ts__inotify-0.11.1//:inotify", # cfg(any(target_os = "linux", target_os = "android")) "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "linux", target_os = "android")) @@ -179,6 +204,18 @@ rust_library( "@vendor_ts__inotify-0.11.1//:inotify", # cfg(any(target_os = "linux", target_os = "android")) "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "linux", target_os = "android")) ], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [ + "@vendor_ts__inotify-0.11.1//:inotify", # cfg(any(target_os = "linux", target_os = "android")) + "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "linux", target_os = "android")) + ], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [ + "@vendor_ts__kqueue-1.2.0//:kqueue", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) + "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) + ], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [ + "@vendor_ts__kqueue-1.2.0//:kqueue", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) + "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) + ], "@rules_rust//rust/platform:x86_64-apple-darwin": [ "@vendor_ts__bitflags-2.13.1//:bitflags", # cfg(target_os = "macos") "@vendor_ts__fsevent-sys-4.1.0//:fsevent_sys", # x86_64-apple-darwin @@ -187,6 +224,10 @@ rust_library( "@vendor_ts__kqueue-1.2.0//:kqueue", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) ], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [ + "@vendor_ts__kqueue-1.2.0//:kqueue", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) + "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd", target_os = "dragonflybsd", target_os = "ios")) + ], "@rules_rust//rust/platform:x86_64-linux-android": [ "@vendor_ts__inotify-0.11.1//:inotify", # cfg(any(target_os = "linux", target_os = "android")) "@vendor_ts__mio-1.2.2//:mio", # cfg(any(target_os = "linux", target_os = "android")) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.notify-types-2.1.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.notify-types-2.1.0.bazel index 1a477ca099d2..2c1bf20ea4f4 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.notify-types-2.1.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.notify-types-2.1.0.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.nu-ansi-term-0.50.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.nu-ansi-term-0.50.3.bazel index ad2e5b6694fa..e2c4edbd915b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.nu-ansi-term-0.50.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.nu-ansi-term-0.50.3.bazel @@ -68,12 +68,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -85,13 +87,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -99,6 +111,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num-conv-0.2.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num-conv-0.2.2.bazel index c1e07eb50b35..b19b527ba6cf 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num-conv-0.2.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num-conv-0.2.2.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num-traits-0.2.19.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num-traits-0.2.19.bazel index 2724cafe2c42..e27be7a1d7f8 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num-traits-0.2.19.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num-traits-0.2.19.bazel @@ -60,12 +60,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -77,13 +79,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -91,6 +103,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -103,7 +116,7 @@ rust_library( }), version = "0.2.19", deps = [ - "@vendor_ts__num-traits-0.2.19//:build_script_build", + ":build_script_build", ], ) @@ -113,6 +126,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -145,6 +161,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "num-traits", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num_cpus-1.17.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num_cpus-1.17.0.bazel index 6fd8a4443f36..fd004595ba14 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num_cpus-1.17.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num_cpus-1.17.0.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -101,6 +114,9 @@ rust_library( "@rules_rust//rust/platform:aarch64-apple-ios": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) + ], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], @@ -116,6 +132,9 @@ rust_library( "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], + "@rules_rust//rust/platform:aarch64-unknown-none": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) + ], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], @@ -146,9 +165,18 @@ rust_library( "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) + ], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) + ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) + ], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], @@ -161,12 +189,33 @@ rust_library( "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) + ], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) + ], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) + ], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) + ], "@rules_rust//rust/platform:thumbv7em-none-eabi": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) + ], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) + ], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) + ], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], @@ -188,6 +237,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-apple-ios": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) + ], "@rules_rust//rust/platform:x86_64-linux-android": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(not(windows)) ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num_threads-0.1.7.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num_threads-0.1.7.bazel index d87021f58723..04548b48fd50 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num_threads-0.1.7.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.num_threads-0.1.7.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -101,6 +114,9 @@ rust_library( "@rules_rust//rust/platform:aarch64-apple-ios": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd")) ], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd")) + ], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd")) ], @@ -116,6 +132,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-apple-ios": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd")) ], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd")) + ], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(any(target_os = "macos", target_os = "ios", target_os = "freebsd")) ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.once_cell-1.21.4.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.once_cell-1.21.4.bazel index e556134028f4..3e369cc74815 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.once_cell-1.21.4.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.once_cell-1.21.4.bazel @@ -58,12 +58,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -75,13 +77,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -89,6 +101,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.once_cell_polyfill-1.70.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.once_cell_polyfill-1.70.2.bazel index 95c79f066379..49ca9aa2e4c2 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.once_cell_polyfill-1.70.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.once_cell_polyfill-1.70.2.bazel @@ -55,12 +55,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -72,13 +74,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -86,6 +98,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.oorandom-11.1.5.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.oorandom-11.1.5.bazel index 72de567588ff..15f5f42e4634 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.oorandom-11.1.5.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.oorandom-11.1.5.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.os_str_bytes-7.2.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.os_str_bytes-7.2.0.bazel index 206786264927..c2a1a09be7ac 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.os_str_bytes-7.2.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.os_str_bytes-7.2.0.bazel @@ -57,12 +57,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -74,13 +76,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -88,6 +100,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.parking_lot-0.12.5.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.parking_lot-0.12.5.bazel index 0735630ce836..888609b9c78f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.parking_lot-0.12.5.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.parking_lot-0.12.5.bazel @@ -55,12 +55,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -72,13 +74,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -86,6 +98,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.parking_lot_core-0.9.12.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.parking_lot_core-0.9.12.bazel index fbfb4387a523..8e3d507c0369 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.parking_lot_core-0.9.12.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.parking_lot_core-0.9.12.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,8 +112,8 @@ rust_library( }), version = "0.9.12", deps = [ + ":build_script_build", "@vendor_ts__cfg-if-1.0.4//:cfg_if", - "@vendor_ts__parking_lot_core-0.9.12//:build_script_build", "@vendor_ts__smallvec-1.15.2//:smallvec", ] + select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [ @@ -109,6 +122,9 @@ rust_library( "@rules_rust//rust/platform:aarch64-apple-ios": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) + ], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], @@ -157,6 +173,12 @@ rust_library( "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) + ], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) + ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], @@ -166,6 +188,15 @@ rust_library( "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) + ], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) + ], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) + ], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], @@ -175,6 +206,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-apple-ios": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) + ], "@rules_rust//rust/platform:x86_64-linux-android": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], @@ -203,6 +237,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -231,6 +268,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "parking_lot_core", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pear-0.2.9.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pear-0.2.9.bazel index ccc776593759..00e55aa2c328 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pear-0.2.9.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pear-0.2.9.bazel @@ -60,12 +60,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -77,13 +79,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -91,6 +103,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pear_codegen-0.2.9.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pear_codegen-0.2.9.bazel index 75840ed1ca3a..dd097afb8bab 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pear_codegen-0.2.9.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pear_codegen-0.2.9.bazel @@ -52,12 +52,14 @@ rust_proc_macro( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_proc_macro( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_proc_macro( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.perf-event-0.4.8.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.perf-event-0.4.8.bazel index 42e572ce51f4..366e209d47cb 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.perf-event-0.4.8.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.perf-event-0.4.8.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.perf-event-open-sys-4.0.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.perf-event-open-sys-4.0.0.bazel index edcf803614c3..0ff8a5b6a0af 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.perf-event-open-sys-4.0.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.perf-event-open-sys-4.0.0.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.petgraph-0.8.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.petgraph-0.8.3.bazel index 054c06f6350a..eade6c0096a3 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.petgraph-0.8.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.petgraph-0.8.3.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pin-project-lite-0.2.17.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pin-project-lite-0.2.17.bazel index c0fad00dd23e..9042ddad2f0f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pin-project-lite-0.2.17.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pin-project-lite-0.2.17.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pkg-config-0.3.33.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pkg-config-0.3.33.bazel index 6d2c2e9933d6..8e4875e85850 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pkg-config-0.3.33.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.pkg-config-0.3.33.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.portable-atomic-1.14.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.portable-atomic-1.14.0.bazel index 5b2d4519e51d..6fc025b81775 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.portable-atomic-1.14.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.portable-atomic-1.14.0.bazel @@ -60,12 +60,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -77,13 +79,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -91,6 +103,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -103,7 +116,7 @@ rust_library( }), version = "1.14.0", deps = [ - "@vendor_ts__portable-atomic-1.14.0//:build_script_build", + ":build_script_build", ], ) @@ -113,6 +126,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -145,6 +161,7 @@ cargo_build_script( ], ), edition = "2018", + emit_warnings = False, pkg_name = "portable-atomic", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.portable-atomic-util-0.2.7.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.portable-atomic-util-0.2.7.bazel index 6cededf7ee44..7f3f2eee0661 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.portable-atomic-util-0.2.7.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.portable-atomic-util-0.2.7.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,8 +112,8 @@ rust_library( }), version = "0.2.7", deps = [ + ":build_script_build", "@vendor_ts__portable-atomic-1.14.0//:portable_atomic", - "@vendor_ts__portable-atomic-util-0.2.7//:build_script_build", ], ) @@ -110,6 +123,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -138,6 +154,7 @@ cargo_build_script( ], ), edition = "2018", + emit_warnings = False, pkg_name = "portable-atomic-util", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.postcard-1.1.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.postcard-1.1.3.bazel index 9f0c0ad00902..ed698b8d764f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.postcard-1.1.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.postcard-1.1.3.bazel @@ -55,12 +55,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -72,13 +74,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -86,6 +98,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.powerfmt-0.2.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.powerfmt-0.2.0.bazel index 4f67e7c1603c..2ad27d505a89 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.powerfmt-0.2.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.powerfmt-0.2.0.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.proc-macro2-1.0.107.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.proc-macro2-1.0.107.bazel index a376ba7ae931..23a5bc388ef4 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.proc-macro2-1.0.107.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.proc-macro2-1.0.107.bazel @@ -60,12 +60,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -77,13 +79,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -91,6 +103,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -103,7 +116,7 @@ rust_library( }), version = "1.0.107", deps = [ - "@vendor_ts__proc-macro2-1.0.107//:build_script_build", + ":build_script_build", "@vendor_ts__unicode-ident-1.0.24//:unicode_ident", ], ) @@ -114,6 +127,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -146,6 +162,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "proc-macro2", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.proc-macro2-diagnostics-0.10.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.proc-macro2-diagnostics-0.10.1.bazel index cd504d1c1e83..c5bce52442a3 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.proc-macro2-diagnostics-0.10.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.proc-macro2-diagnostics-0.10.1.bazel @@ -61,12 +61,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -78,13 +80,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -92,6 +104,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -104,8 +117,8 @@ rust_library( }), version = "0.10.1", deps = [ + ":build_script_build", "@vendor_ts__proc-macro2-1.0.107//:proc_macro2", - "@vendor_ts__proc-macro2-diagnostics-0.10.1//:build_script_build", "@vendor_ts__quote-1.0.47//:quote", "@vendor_ts__syn-2.0.119//:syn", "@vendor_ts__yansi-1.0.1//:yansi", @@ -118,6 +131,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -151,6 +167,7 @@ cargo_build_script( ], ), edition = "2018", + emit_warnings = False, pkg_name = "proc-macro2-diagnostics", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.quote-1.0.47.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.quote-1.0.47.bazel index 2223ac8ce1a7..b590a4e2a41c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.quote-1.0.47.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.quote-1.0.47.bazel @@ -60,12 +60,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -77,13 +79,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -91,6 +103,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -103,8 +116,8 @@ rust_library( }), version = "1.0.47", deps = [ + ":build_script_build", "@vendor_ts__proc-macro2-1.0.107//:proc_macro2", - "@vendor_ts__quote-1.0.47//:build_script_build", ], ) @@ -114,6 +127,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -146,6 +162,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "quote", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.r-efi-6.0.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.r-efi-6.0.0.bazel index 5ee0d985fe56..aa2827ae07d7 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.r-efi-6.0.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.r-efi-6.0.0.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_abi-0.166.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_abi-0.166.0.bazel index 2e7aaf27a252..217e23c05e3d 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_abi-0.166.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_abi-0.166.0.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_ast_ir-0.166.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_ast_ir-0.166.0.bazel index 0bfaff92b318..fde84c2464d0 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_ast_ir-0.166.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_ast_ir-0.166.0.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_hashes-0.166.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_hashes-0.166.0.bazel index 432d995d819f..9ad0414dcc7e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_hashes-0.166.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_hashes-0.166.0.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index-0.166.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index-0.166.0.bazel index dc39203f8f53..37e1346cecbc 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index-0.166.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index-0.166.0.bazel @@ -58,12 +58,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -75,13 +77,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -89,6 +101,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index_macros-0.166.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index_macros-0.166.0.bazel index b36ae77212bf..fcf203517134 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index_macros-0.166.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_index_macros-0.166.0.bazel @@ -52,12 +52,14 @@ rust_proc_macro( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_proc_macro( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_proc_macro( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_lexer-0.166.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_lexer-0.166.0.bazel index 52ecd0d88a1c..ac52299aef40 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_lexer-0.166.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_lexer-0.166.0.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_next_trait_solver-0.166.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_next_trait_solver-0.166.0.bazel index da427cb9749a..a96b09799a04 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_next_trait_solver-0.166.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_next_trait_solver-0.166.0.bazel @@ -61,12 +61,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -78,13 +80,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -92,6 +104,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_parse_format-0.166.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_parse_format-0.166.0.bazel index da20d1478623..3a70744bbf1b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_parse_format-0.166.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_parse_format-0.166.0.bazel @@ -55,12 +55,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -72,13 +74,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -86,6 +98,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_pattern_analysis-0.166.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_pattern_analysis-0.166.0.bazel index 64959c0b3d4c..4a6b70560c69 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_pattern_analysis-0.166.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_pattern_analysis-0.166.0.bazel @@ -55,12 +55,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -72,13 +74,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -86,6 +98,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_type_ir-0.166.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_type_ir-0.166.0.bazel index 9e98e67c3514..e1fc8a0307f0 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_type_ir-0.166.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_type_ir-0.166.0.bazel @@ -62,12 +62,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -79,13 +81,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -93,6 +105,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_type_ir_macros-0.166.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_type_ir_macros-0.166.0.bazel index b0979e32e942..d613a9685a4c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_type_ir_macros-0.166.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra-ap-rustc_type_ir_macros-0.166.0.bazel @@ -52,12 +52,14 @@ rust_proc_macro( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_proc_macro( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_proc_macro( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_base_db-0.0.347.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_base_db-0.0.347.bazel index 54abbfc5e2f5..e8f452d5908f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_base_db-0.0.347.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_base_db-0.0.347.bazel @@ -65,12 +65,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -82,13 +84,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -96,6 +108,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_cfg-0.0.347.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_cfg-0.0.347.bazel index fd4c15f1c6ea..6fc62fcd242b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_cfg-0.0.347.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_cfg-0.0.347.bazel @@ -62,12 +62,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -79,13 +81,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -93,6 +105,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_edition-0.0.347.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_edition-0.0.347.bazel index 397dcf35e5c5..1dbbd1ffb197 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_edition-0.0.347.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_edition-0.0.347.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir-0.0.347.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir-0.0.347.bazel index e1a101de8255..1cd67187644c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir-0.0.347.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir-0.0.347.bazel @@ -64,12 +64,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -81,13 +83,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -95,6 +107,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_def-0.0.347.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_def-0.0.347.bazel index 3c601559cd65..0d7e43de017c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_def-0.0.347.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_def-0.0.347.bazel @@ -63,12 +63,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -80,13 +82,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -94,6 +106,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_expand-0.0.347.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_expand-0.0.347.bazel index 05e4559b7447..14986eaed90f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_expand-0.0.347.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_expand-0.0.347.bazel @@ -64,12 +64,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -81,13 +83,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -95,6 +107,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_ty-0.0.347.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_ty-0.0.347.bazel index efe158fd7e5f..16baef7ffcb4 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_ty-0.0.347.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_hir_ty-0.0.347.bazel @@ -66,12 +66,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -83,13 +85,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -97,6 +109,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_ide_db-0.0.347.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_ide_db-0.0.347.bazel index 7519b15be5d9..052b3752e4ce 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_ide_db-0.0.347.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_ide_db-0.0.347.bazel @@ -71,12 +71,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -88,13 +90,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -102,6 +114,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_intern-0.0.347.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_intern-0.0.347.bazel index 0af139a44473..1f291e59dc89 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_intern-0.0.347.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_intern-0.0.347.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_load-cargo-0.0.347.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_load-cargo-0.0.347.bazel index 8c92afc8a32c..bf86fb6709f6 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_load-cargo-0.0.347.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_load-cargo-0.0.347.bazel @@ -63,12 +63,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -80,13 +82,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -94,6 +106,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_macros-0.0.347.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_macros-0.0.347.bazel index fcc4c85b290d..df0cf72a853f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_macros-0.0.347.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_macros-0.0.347.bazel @@ -52,12 +52,14 @@ rust_proc_macro( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_proc_macro( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_proc_macro( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_mbe-0.0.347.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_mbe-0.0.347.bazel index ce656ab43730..72e8ac22a21b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_mbe-0.0.347.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_mbe-0.0.347.bazel @@ -60,12 +60,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -77,13 +79,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -91,6 +103,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_parser-0.0.347.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_parser-0.0.347.bazel index 4e0477619723..0d1ea893a000 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_parser-0.0.347.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_parser-0.0.347.bazel @@ -58,12 +58,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -75,13 +77,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -89,6 +101,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_paths-0.0.347.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_paths-0.0.347.bazel index 15817dd51767..1fda9530d421 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_paths-0.0.347.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_paths-0.0.347.bazel @@ -55,12 +55,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -72,13 +74,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -86,6 +98,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_proc_macro_api-0.0.347.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_proc_macro_api-0.0.347.bazel index 4a6b60368af4..1ef46fa05cde 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_proc_macro_api-0.0.347.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_proc_macro_api-0.0.347.bazel @@ -65,12 +65,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -82,13 +84,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -96,6 +108,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_profile-0.0.347.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_profile-0.0.347.bazel index 76f46867256e..d153d4dbdb0d 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_profile-0.0.347.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_profile-0.0.347.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -119,6 +132,12 @@ rust_library( "@vendor_ts__libc-0.2.189//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) "@vendor_ts__perf-event-0.4.8//:perf_event", # cfg(all(target_os = "linux", not(target_env = "ohos"), any(target_arch = "x86", target_arch = "x86_64", target_arch = "aarch64"))) ], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) + ], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) + ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) ], @@ -128,6 +147,9 @@ rust_library( "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) ], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(all(target_os = "linux", target_env = "gnu")) + ], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [ "@vendor_ts__windows-sys-0.61.2//:windows_sys", # cfg(windows) ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_project_model-0.0.347.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_project_model-0.0.347.bazel index 0f2860baf657..d5ee73c5b70a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_project_model-0.0.347.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_project_model-0.0.347.bazel @@ -67,12 +67,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -84,13 +86,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -98,6 +110,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_span-0.0.347.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_span-0.0.347.bazel index bd2da917593e..c5a59b4aa618 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_span-0.0.347.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_span-0.0.347.bazel @@ -61,12 +61,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -78,13 +80,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -92,6 +104,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_stdx-0.0.347.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_stdx-0.0.347.bazel index 473416e0716e..eae24833ba54 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_stdx-0.0.347.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_stdx-0.0.347.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -107,6 +120,9 @@ rust_library( "@rules_rust//rust/platform:aarch64-apple-ios": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) + ], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], @@ -157,6 +173,12 @@ rust_library( "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) + ], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) + ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], @@ -166,6 +188,15 @@ rust_library( "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) + ], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) + ], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) + ], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], @@ -175,6 +206,9 @@ rust_library( "@rules_rust//rust/platform:x86_64-apple-ios": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [ + "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) + ], "@rules_rust//rust/platform:x86_64-linux-android": [ "@vendor_ts__libc-0.2.189//:libc", # cfg(unix) ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-0.0.347.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-0.0.347.bazel index 74dad3828ac6..329e479a8c6b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-0.0.347.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-0.0.347.bazel @@ -59,12 +59,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -76,13 +78,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -90,6 +102,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-bridge-0.0.347.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-bridge-0.0.347.bazel index cc1c149596b4..2ff7d92f6fbf 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-bridge-0.0.347.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_syntax-bridge-0.0.347.bazel @@ -60,12 +60,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -77,13 +79,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -91,6 +103,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_test_fixture-0.0.347.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_test_fixture-0.0.347.bazel index aca13c7af16a..54aaae05bc57 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_test_fixture-0.0.347.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_test_fixture-0.0.347.bazel @@ -66,12 +66,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -83,13 +85,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -97,6 +109,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_test_utils-0.0.347.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_test_utils-0.0.347.bazel index 3150acf59195..3d8da77924bc 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_test_utils-0.0.347.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_test_utils-0.0.347.bazel @@ -57,12 +57,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -74,13 +76,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -88,6 +100,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_toolchain-0.0.347.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_toolchain-0.0.347.bazel index e88d70d2607a..c5c83dbb61b7 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_toolchain-0.0.347.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_toolchain-0.0.347.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_tt-0.0.347.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_tt-0.0.347.bazel index 45ffe7a4b07b..dd899be231d5 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_tt-0.0.347.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_tt-0.0.347.bazel @@ -57,12 +57,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -74,13 +76,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -88,6 +100,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-0.0.347.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-0.0.347.bazel index 8e719c95dcb3..64cceaec8029 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-0.0.347.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-0.0.347.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-notify-0.0.347.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-notify-0.0.347.bazel index 930f6383490e..f90dbad559e8 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-notify-0.0.347.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ra_ap_vfs-notify-0.0.347.bazel @@ -57,12 +57,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -74,13 +76,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -88,6 +100,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand-0.10.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand-0.10.2.bazel index 488cc14ec5e8..1a9a557e0979 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand-0.10.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand-0.10.2.bazel @@ -60,12 +60,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -77,13 +79,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -91,6 +103,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand_core-0.10.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand_core-0.10.1.bazel index 9522ee36ed3e..0673f7a86741 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand_core-0.10.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rand_core-0.10.1.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rayon-1.12.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rayon-1.12.0.bazel index 41de1d0c87f0..fa4334a01aa6 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rayon-1.12.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rayon-1.12.0.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rayon-core-1.13.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rayon-core-1.13.0.bazel index fd0e04b7066b..17c347381467 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rayon-core-1.13.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rayon-core-1.13.0.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,9 +112,9 @@ rust_library( }), version = "1.13.0", deps = [ + ":build_script_build", "@vendor_ts__crossbeam-deque-0.8.7//:crossbeam_deque", "@vendor_ts__crossbeam-utils-0.8.22//:crossbeam_utils", - "@vendor_ts__rayon-core-1.13.0//:build_script_build", ], ) @@ -111,6 +124,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -139,6 +155,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, links = "rayon-core", pkg_name = "rayon-core", rustc_env_files = [ diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.redox_syscall-0.5.18.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.redox_syscall-0.5.18.bazel index a6cfadf976c8..aead8bda30de 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.redox_syscall-0.5.18.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.redox_syscall-0.5.18.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ref-cast-1.0.26.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ref-cast-1.0.26.bazel index dfbb9934bedf..47ee7710c1ad 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ref-cast-1.0.26.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ref-cast-1.0.26.bazel @@ -59,12 +59,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -76,13 +78,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -90,6 +102,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -102,7 +115,7 @@ rust_library( }), version = "1.0.26", deps = [ - "@vendor_ts__ref-cast-1.0.26//:build_script_build", + ":build_script_build", ], ) @@ -112,6 +125,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -140,6 +156,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "ref-cast", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ref-cast-impl-1.0.26.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ref-cast-impl-1.0.26.bazel index 0850074deeb3..c87aa9d4b7cf 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ref-cast-impl-1.0.26.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ref-cast-impl-1.0.26.bazel @@ -52,12 +52,14 @@ rust_proc_macro( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_proc_macro( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_proc_macro( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-1.13.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-1.13.1.bazel index c872bd0a1ca6..cd6a68b1a521 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-1.13.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-1.13.1.bazel @@ -71,12 +71,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -88,13 +90,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -102,6 +114,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-automata-0.4.18.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-automata-0.4.18.bazel index 34f327149122..be8cac10495b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-automata-0.4.18.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-automata-0.4.18.bazel @@ -80,12 +80,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -97,13 +99,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -111,6 +123,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-syntax-0.8.11.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-syntax-0.8.11.bazel index 10ff0557d977..807d55bc267b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-syntax-0.8.11.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.regex-syntax-0.8.11.bazel @@ -64,12 +64,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -81,13 +83,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -95,6 +107,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rowan-0.17.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rowan-0.17.0.bazel index d90798984a8e..42faf7d0eb79 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rowan-0.17.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rowan-0.17.0.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-hash-1.1.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-hash-1.1.0.bazel index c2d2a8ecadbd..a4da983b87eb 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-hash-1.1.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-hash-1.1.0.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-hash-2.1.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-hash-2.1.3.bazel index ee370f4135b4..92003c5bf12b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-hash-2.1.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-hash-2.1.3.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-literal-escaper-0.0.7.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-literal-escaper-0.0.7.bazel index 0c11ff6194ba..b62771f52d73 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-literal-escaper-0.0.7.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-literal-escaper-0.0.7.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-stable-hash-0.1.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-stable-hash-0.1.2.bazel index 0803a2e277ee..4566de291a11 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-stable-hash-0.1.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc-stable-hash-0.1.2.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc_apfloat-0.2.3+llvm-462a31f5a5ab.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc_apfloat-0.2.3+llvm-462a31f5a5ab.bazel index 46418e58e28c..a1becec81528 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc_apfloat-0.2.3+llvm-462a31f5a5ab.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustc_apfloat-0.2.3+llvm-462a31f5a5ab.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,8 +112,8 @@ rust_library( }), version = "0.2.3+llvm-462a31f5a5ab", deps = [ + ":build_script_build", "@vendor_ts__bitflags-2.13.1//:bitflags", - "@vendor_ts__rustc_apfloat-0.2.3-llvm-462a31f5a5ab//:build_script_build", "@vendor_ts__smallvec-1.15.2//:smallvec", ], ) @@ -111,6 +124,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -139,6 +155,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "rustc_apfloat", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustversion-1.0.23.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustversion-1.0.23.bazel index 64a6dea60ee4..11fd98830b5f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustversion-1.0.23.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.rustversion-1.0.23.bazel @@ -56,12 +56,14 @@ rust_proc_macro( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_proc_macro( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_proc_macro( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,7 +112,7 @@ rust_proc_macro( }), version = "1.0.23", deps = [ - "@vendor_ts__rustversion-1.0.23//:build_script_build", + ":build_script_build", ], ) @@ -109,6 +122,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -137,6 +153,7 @@ cargo_build_script( ], ), edition = "2018", + emit_warnings = False, pkg_name = "rustversion", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ryu-1.0.23.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ryu-1.0.23.bazel index 85b3b4797822..ac0396f8d06c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ryu-1.0.23.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ryu-1.0.23.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-0.28.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-0.28.2.bazel index 463decb2f848..2f98a655a97e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-0.28.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-0.28.2.bazel @@ -62,12 +62,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -79,13 +81,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -93,6 +105,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macro-rules-0.28.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macro-rules-0.28.2.bazel index ff2e6321e14d..f39d94e97364 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macro-rules-0.28.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macro-rules-0.28.2.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macros-0.28.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macros-0.28.2.bazel index 1ba51a2e28e4..285cd6eb9ce4 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macros-0.28.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.salsa-macros-0.28.2.bazel @@ -55,12 +55,14 @@ rust_proc_macro( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -72,13 +74,23 @@ rust_proc_macro( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -86,6 +98,7 @@ rust_proc_macro( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.same-file-1.0.6.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.same-file-1.0.6.bazel index 1ae75e4d777f..d791c3bf735d 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.same-file-1.0.6.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.same-file-1.0.6.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.schemars-0.9.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.schemars-0.9.0.bazel index b01e5802bfe1..0ad92da5d891 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.schemars-0.9.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.schemars-0.9.0.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.schemars-1.2.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.schemars-1.2.2.bazel index 7a54f43eb556..c5b85dc72667 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.schemars-1.2.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.schemars-1.2.2.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.scopeguard-1.2.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.scopeguard-1.2.0.bazel index fd65460b9772..314323540722 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.scopeguard-1.2.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.scopeguard-1.2.0.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.semver-1.0.28.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.semver-1.0.28.bazel index 68b5a9986041..d12baecdfea7 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.semver-1.0.28.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.semver-1.0.28.bazel @@ -60,12 +60,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -77,13 +79,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -91,6 +103,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde-1.0.229.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde-1.0.229.bazel index 7c7199e5b91f..4c9dcee67365 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde-1.0.229.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde-1.0.229.bazel @@ -66,12 +66,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -83,13 +85,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -97,6 +109,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -109,7 +122,7 @@ rust_library( }), version = "1.0.229", deps = [ - "@vendor_ts__serde-1.0.229//:build_script_build", + ":build_script_build", "@vendor_ts__serde_core-1.0.229//:serde_core", ], ) @@ -120,6 +133,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -155,6 +171,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "serde", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_core-1.0.229.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_core-1.0.229.bazel index 717fab7a6747..b81bf62830ed 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_core-1.0.229.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_core-1.0.229.bazel @@ -62,12 +62,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -79,13 +81,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -93,6 +105,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -105,7 +118,7 @@ rust_library( }), version = "1.0.229", deps = [ - "@vendor_ts__serde_core-1.0.229//:build_script_build", + ":build_script_build", ], ) @@ -115,6 +128,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -149,6 +165,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "serde_core", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_derive-1.0.229.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_derive-1.0.229.bazel index c591f264c8c2..50f204fa5810 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_derive-1.0.229.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_derive-1.0.229.bazel @@ -55,12 +55,14 @@ rust_proc_macro( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -72,13 +74,23 @@ rust_proc_macro( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -86,6 +98,7 @@ rust_proc_macro( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_json-1.0.151.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_json-1.0.151.bazel index 0ec0ddcef863..e732ba6880b8 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_json-1.0.151.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_json-1.0.151.bazel @@ -71,6 +71,10 @@ rust_library( "indexmap", # i686-unknown-linux-gnu "preserve_order", # i686-unknown-linux-gnu ], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [ + "indexmap", # loongarch64-unknown-linux-gnu + "preserve_order", # loongarch64-unknown-linux-gnu + ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ "indexmap", # powerpc-unknown-linux-gnu "preserve_order", # powerpc-unknown-linux-gnu @@ -123,12 +127,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -140,13 +146,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -154,6 +170,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -166,10 +183,10 @@ rust_library( }), version = "1.0.151", deps = [ + ":build_script_build", "@vendor_ts__itoa-1.0.18//:itoa", "@vendor_ts__memchr-2.8.3//:memchr", "@vendor_ts__serde_core-1.0.229//:serde_core", - "@vendor_ts__serde_json-1.0.151//:build_script_build", "@vendor_ts__zmij-1.0.23//:zmij", ] + select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [ @@ -193,6 +210,9 @@ rust_library( "@rules_rust//rust/platform:i686-unknown-linux-gnu": [ "@vendor_ts__indexmap-2.14.0//:indexmap", # i686-unknown-linux-gnu ], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [ + "@vendor_ts__indexmap-2.14.0//:indexmap", # loongarch64-unknown-linux-gnu + ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ "@vendor_ts__indexmap-2.14.0//:indexmap", # powerpc-unknown-linux-gnu ], @@ -227,6 +247,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -273,6 +296,10 @@ cargo_build_script( "indexmap", # i686-unknown-linux-gnu "preserve_order", # i686-unknown-linux-gnu ], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [ + "indexmap", # loongarch64-unknown-linux-gnu + "preserve_order", # loongarch64-unknown-linux-gnu + ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ "indexmap", # powerpc-unknown-linux-gnu "preserve_order", # powerpc-unknown-linux-gnu @@ -322,6 +349,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "serde_json", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_spanned-1.1.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_spanned-1.1.1.bazel index 2666d81ab42d..aff56411acaf 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_spanned-1.1.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_spanned-1.1.1.bazel @@ -57,12 +57,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -74,13 +76,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -88,6 +100,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with-3.22.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with-3.22.0.bazel index c0ced4475fbf..809eccc1644d 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with-3.22.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with-3.22.0.bazel @@ -61,12 +61,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -78,13 +80,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -92,6 +104,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with_macros-3.22.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with_macros-3.22.0.bazel index 31e5bad3c947..c90719f26579 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with_macros-3.22.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_with_macros-3.22.0.bazel @@ -52,12 +52,14 @@ rust_proc_macro( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_proc_macro( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_proc_macro( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_yaml-0.9.34+deprecated.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_yaml-0.9.34+deprecated.bazel index c21a84236718..328cfd4c282d 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_yaml-0.9.34+deprecated.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.serde_yaml-0.9.34+deprecated.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.sharded-slab-0.1.7.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.sharded-slab-0.1.7.bazel index 504c16d3ed6b..ff8fc1fbef23 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.sharded-slab-0.1.7.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.sharded-slab-0.1.7.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.shlex-2.0.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.shlex-2.0.1.bazel index 9b0bbfb57394..ac9f97395ab6 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.shlex-2.0.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.shlex-2.0.1.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.simd-adler32-0.3.9.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.simd-adler32-0.3.9.bazel index 5e16d2d97a90..8e12154dc9f9 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.simd-adler32-0.3.9.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.simd-adler32-0.3.9.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.slab-0.4.12.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.slab-0.4.12.bazel index 494843749ba2..af5ae4a3fe8e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.slab-0.4.12.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.slab-0.4.12.bazel @@ -55,12 +55,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -72,13 +74,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -86,6 +98,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.smallvec-1.15.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.smallvec-1.15.2.bazel index eb3c38e0ba4b..70c58cf60d8a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.smallvec-1.15.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.smallvec-1.15.2.bazel @@ -57,12 +57,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -74,13 +76,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -88,6 +100,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.smol_str-0.3.6.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.smol_str-0.3.6.bazel index 020a7b78d55b..c9fcf5e5ff53 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.smol_str-0.3.6.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.smol_str-0.3.6.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.stable_deref_trait-1.2.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.stable_deref_trait-1.2.1.bazel index 376f789df83a..2fa4b496c3ca 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.stable_deref_trait-1.2.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.stable_deref_trait-1.2.1.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.streaming-iterator-0.1.9.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.streaming-iterator-0.1.9.bazel index 7f8b002061e4..ee1a1fcd2660 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.streaming-iterator-0.1.9.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.streaming-iterator-0.1.9.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.strsim-0.11.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.strsim-0.11.1.bazel index 2d86e10662ea..1718b3d371e4 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.strsim-0.11.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.strsim-0.11.1.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.syn-2.0.119.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.syn-2.0.119.bazel index 0da1c9bd565e..4ca3954e7290 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.syn-2.0.119.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.syn-2.0.119.bazel @@ -64,12 +64,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -81,13 +83,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -95,6 +107,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.syn-3.0.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.syn-3.0.3.bazel index 1797b9eff901..e0b53880465a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.syn-3.0.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.syn-3.0.3.bazel @@ -64,12 +64,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -81,13 +83,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -95,6 +107,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.synstructure-0.13.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.synstructure-0.13.2.bazel index 0ef07c83494a..bfc20a0fe8ce 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.synstructure-0.13.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.synstructure-0.13.2.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.temp-dir-0.2.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.temp-dir-0.2.0.bazel index dd861211e95f..3e36d90998e5 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.temp-dir-0.2.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.temp-dir-0.2.0.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.text-size-1.1.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.text-size-1.1.1.bazel index 7dadc9eea336..6f49c67c7850 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.text-size-1.1.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.text-size-1.1.1.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thin-vec-0.2.19.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thin-vec-0.2.19.bazel index e40003e38423..fb194d026295 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thin-vec-0.2.19.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thin-vec-0.2.19.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-2.0.20.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-2.0.20.bazel index 4daf950ac496..8394fdcae309 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-2.0.20.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-2.0.20.bazel @@ -63,12 +63,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -80,13 +82,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -94,6 +106,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -106,7 +119,7 @@ rust_library( }), version = "2.0.20", deps = [ - "@vendor_ts__thiserror-2.0.20//:build_script_build", + ":build_script_build", ], ) @@ -116,6 +129,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -148,6 +164,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "thiserror", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-impl-2.0.20.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-impl-2.0.20.bazel index 91a25ccbdd4d..736a71a8c44e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-impl-2.0.20.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thiserror-impl-2.0.20.bazel @@ -52,12 +52,14 @@ rust_proc_macro( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_proc_macro( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_proc_macro( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thread_local-1.1.10.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thread_local-1.1.10.bazel index 58695d057c1a..c1c1ef3d1a33 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thread_local-1.1.10.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.thread_local-1.1.10.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-0.3.55.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-0.3.55.bazel index 6a3bba7896a9..faf29bcb510b 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-0.3.55.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-0.3.55.bazel @@ -59,12 +59,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -76,13 +78,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -90,6 +102,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -115,6 +128,10 @@ rust_library( "@vendor_ts__libc-0.2.189//:libc", # aarch64-apple-ios "@vendor_ts__num_threads-0.1.7//:num_threads", # aarch64-apple-ios ], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [ + "@vendor_ts__libc-0.2.189//:libc", # aarch64-apple-ios-macabi + "@vendor_ts__num_threads-0.1.7//:num_threads", # aarch64-apple-ios-macabi + ], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [ "@vendor_ts__libc-0.2.189//:libc", # aarch64-apple-ios-sim "@vendor_ts__num_threads-0.1.7//:num_threads", # aarch64-apple-ios-sim @@ -171,6 +188,14 @@ rust_library( "@vendor_ts__libc-0.2.189//:libc", # i686-unknown-linux-gnu "@vendor_ts__num_threads-0.1.7//:num_threads", # i686-unknown-linux-gnu ], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.189//:libc", # loongarch64-unknown-linux-gnu + "@vendor_ts__num_threads-0.1.7//:num_threads", # loongarch64-unknown-linux-gnu + ], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.189//:libc", # mips-unknown-linux-gnu + "@vendor_ts__num_threads-0.1.7//:num_threads", # mips-unknown-linux-gnu + ], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [ "@vendor_ts__libc-0.2.189//:libc", # powerpc-unknown-linux-gnu "@vendor_ts__num_threads-0.1.7//:num_threads", # powerpc-unknown-linux-gnu @@ -183,6 +208,18 @@ rust_library( "@vendor_ts__libc-0.2.189//:libc", # s390x-unknown-linux-gnu "@vendor_ts__num_threads-0.1.7//:num_threads", # s390x-unknown-linux-gnu ], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [ + "@vendor_ts__libc-0.2.189//:libc", # sparc64-unknown-linux-gnu + "@vendor_ts__num_threads-0.1.7//:num_threads", # sparc64-unknown-linux-gnu + ], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [ + "@vendor_ts__libc-0.2.189//:libc", # sparc64-unknown-netbsd + "@vendor_ts__num_threads-0.1.7//:num_threads", # sparc64-unknown-netbsd + ], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [ + "@vendor_ts__libc-0.2.189//:libc", # sparc64-unknown-openbsd + "@vendor_ts__num_threads-0.1.7//:num_threads", # sparc64-unknown-openbsd + ], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [ "@vendor_ts__libc-0.2.189//:libc", # wasm32-unknown-emscripten "@vendor_ts__num_threads-0.1.7//:num_threads", # wasm32-unknown-emscripten @@ -195,6 +232,10 @@ rust_library( "@vendor_ts__libc-0.2.189//:libc", # x86_64-apple-ios "@vendor_ts__num_threads-0.1.7//:num_threads", # x86_64-apple-ios ], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [ + "@vendor_ts__libc-0.2.189//:libc", # x86_64-apple-ios-macabi + "@vendor_ts__num_threads-0.1.7//:num_threads", # x86_64-apple-ios-macabi + ], "@rules_rust//rust/platform:x86_64-linux-android": [ "@vendor_ts__libc-0.2.189//:libc", # x86_64-linux-android "@vendor_ts__num_threads-0.1.7//:num_threads", # x86_64-linux-android diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-core-0.1.9.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-core-0.1.9.bazel index 62de530f7fa8..45f2b038de8f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-core-0.1.9.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-core-0.1.9.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-macros-0.2.32.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-macros-0.2.32.bazel index 9f36f241557b..c4ec5a92c262 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-macros-0.2.32.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.time-macros-0.2.32.bazel @@ -52,12 +52,14 @@ rust_proc_macro( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_proc_macro( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_proc_macro( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tinyvec-1.12.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tinyvec-1.12.0.bazel index 1ea1107778e8..3883c7e6d450 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tinyvec-1.12.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tinyvec-1.12.0.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tinyvec_macros-0.1.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tinyvec_macros-0.1.1.bazel index 4d480406c600..cdf427ca37cf 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tinyvec_macros-0.1.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tinyvec_macros-0.1.1.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml-1.1.4+spec-1.1.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml-1.1.4+spec-1.1.0.bazel index 95eeb2116843..b1c6aaeda2a3 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml-1.1.4+spec-1.1.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml-1.1.4+spec-1.1.0.bazel @@ -59,12 +59,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -76,13 +78,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -90,6 +102,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_datetime-1.1.1+spec-1.1.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_datetime-1.1.1+spec-1.1.0.bazel index e372df866e73..cc7bc3605af7 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_datetime-1.1.1+spec-1.1.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_datetime-1.1.1+spec-1.1.0.bazel @@ -57,12 +57,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -74,13 +76,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -88,6 +100,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_parser-1.1.3+spec-1.1.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_parser-1.1.3+spec-1.1.0.bazel index a88bebe6fd58..a9a24773ba4c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_parser-1.1.3+spec-1.1.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_parser-1.1.3+spec-1.1.0.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_writer-1.1.2+spec-1.1.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_writer-1.1.2+spec-1.1.0.bazel index c03a1711a2cd..dd54460a4090 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_writer-1.1.2+spec-1.1.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.toml_writer-1.1.2+spec-1.1.0.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-0.1.44.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-0.1.44.bazel index e38c76a9b2b5..c095e8935653 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-0.1.44.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-0.1.44.bazel @@ -61,12 +61,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -78,13 +80,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -92,6 +104,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-attributes-0.1.31.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-attributes-0.1.31.bazel index b4aeaf6865ec..2748c0113aa1 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-attributes-0.1.31.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-attributes-0.1.31.bazel @@ -52,12 +52,14 @@ rust_proc_macro( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_proc_macro( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_proc_macro( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-core-0.1.36.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-core-0.1.36.bazel index aacfb5924369..923dbf8d5da2 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-core-0.1.36.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-core-0.1.36.bazel @@ -57,12 +57,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -74,13 +76,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -88,6 +100,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-flame-0.2.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-flame-0.2.0.bazel index dde38953aa25..0402a58f0438 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-flame-0.2.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-flame-0.2.0.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-log-0.2.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-log-0.2.0.bazel index a8e3cb2ee362..86562fce4f7a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-log-0.2.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-log-0.2.0.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-subscriber-0.3.23.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-subscriber-0.3.23.bazel index b3627be63a55..256bc632ba60 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-subscriber-0.3.23.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-subscriber-0.3.23.bazel @@ -71,12 +71,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -88,13 +90,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -102,6 +114,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-tree-0.4.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-tree-0.4.1.bazel index ba6b4a2716fb..ba9dcc5d3c8f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-tree-0.4.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tracing-tree-0.4.1.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-0.26.9.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-0.26.9.bazel index fec7d148577e..ed5b99c982ae 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-0.26.9.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-0.26.9.bazel @@ -60,12 +60,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -77,13 +79,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -91,6 +103,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -103,10 +116,10 @@ rust_library( }), version = "0.26.9", deps = [ + ":build_script_build", "@vendor_ts__regex-1.13.1//:regex", "@vendor_ts__regex-syntax-0.8.11//:regex_syntax", "@vendor_ts__streaming-iterator-0.1.9//:streaming_iterator", - "@vendor_ts__tree-sitter-0.26.9//:build_script_build", "@vendor_ts__tree-sitter-language-0.1.7//:tree_sitter_language", ], ) @@ -117,6 +130,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -149,6 +165,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, link_deps = [ "@vendor_ts__tree-sitter-language-0.1.7//:tree_sitter_language", ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-embedded-template-0.25.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-embedded-template-0.25.0.bazel index fa790e394a08..e0a6f80bba02 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-embedded-template-0.25.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-embedded-template-0.25.0.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,7 +112,7 @@ rust_library( }), version = "0.25.0", deps = [ - "@vendor_ts__tree-sitter-embedded-template-0.25.0//:build_script_build", + ":build_script_build", "@vendor_ts__tree-sitter-language-0.1.7//:tree_sitter_language", ], ) @@ -110,6 +123,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -138,6 +154,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, link_deps = [ "@vendor_ts__tree-sitter-language-0.1.7//:tree_sitter_language", ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-json-0.24.8.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-json-0.24.8.bazel index b03acc29b8e5..495cf44d121f 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-json-0.24.8.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-json-0.24.8.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,7 +112,7 @@ rust_library( }), version = "0.24.8", deps = [ - "@vendor_ts__tree-sitter-json-0.24.8//:build_script_build", + ":build_script_build", "@vendor_ts__tree-sitter-language-0.1.7//:tree_sitter_language", ], ) @@ -110,6 +123,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -138,6 +154,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, link_deps = [ "@vendor_ts__tree-sitter-language-0.1.7//:tree_sitter_language", ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-language-0.1.7.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-language-0.1.7.bazel index d1d5d48e3f01..c17572232ce5 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-language-0.1.7.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-language-0.1.7.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,7 +112,7 @@ rust_library( }), version = "0.1.7", deps = [ - "@vendor_ts__tree-sitter-language-0.1.7//:build_script_build", + ":build_script_build", ], ) @@ -109,6 +122,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -137,6 +153,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, links = "tree-sitter-language", pkg_name = "tree-sitter-language", rustc_env_files = [ diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-python-0.25.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-python-0.25.0.bazel index b97fd9414ee8..b9ebf31e11a6 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-python-0.25.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-python-0.25.0.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,8 +112,8 @@ rust_library( }), version = "0.25.0", deps = [ + ":build_script_build", "@vendor_ts__tree-sitter-language-0.1.7//:tree_sitter_language", - "@vendor_ts__tree-sitter-python-0.25.0//:build_script_build", ], ) @@ -110,6 +123,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -138,6 +154,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, link_deps = [ "@vendor_ts__tree-sitter-language-0.1.7//:tree_sitter_language", ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ql-0.23.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ql-0.23.1.bazel index faed88150b66..4850c8596e19 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ql-0.23.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ql-0.23.1.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,8 +112,8 @@ rust_library( }), version = "0.23.1", deps = [ + ":build_script_build", "@vendor_ts__tree-sitter-language-0.1.7//:tree_sitter_language", - "@vendor_ts__tree-sitter-ql-0.23.1//:build_script_build", ], ) @@ -110,6 +123,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -138,6 +154,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, link_deps = [ "@vendor_ts__tree-sitter-language-0.1.7//:tree_sitter_language", ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ruby-0.23.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ruby-0.23.1.bazel index 97ebe452de41..c5c24a658117 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ruby-0.23.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.tree-sitter-ruby-0.23.1.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,8 +112,8 @@ rust_library( }), version = "0.23.1", deps = [ + ":build_script_build", "@vendor_ts__tree-sitter-language-0.1.7//:tree_sitter_language", - "@vendor_ts__tree-sitter-ruby-0.23.1//:build_script_build", ], ) @@ -110,6 +123,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -138,6 +154,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, link_deps = [ "@vendor_ts__tree-sitter-language-0.1.7//:tree_sitter_language", ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.triomphe-0.1.16.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.triomphe-0.1.16.bazel index eda956aeab6e..034e1081e2d7 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.triomphe-0.1.16.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.triomphe-0.1.16.bazel @@ -58,12 +58,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -75,13 +77,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -89,6 +101,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.typed-arena-2.0.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.typed-arena-2.0.2.bazel index 1cf6200569b7..a84180a35e64 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.typed-arena-2.0.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.typed-arena-2.0.2.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.typeid-1.0.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.typeid-1.0.3.bazel index 0e5737ac61b9..24674e33d16e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.typeid-1.0.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.typeid-1.0.3.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,7 +112,7 @@ rust_library( }), version = "1.0.3", deps = [ - "@vendor_ts__typeid-1.0.3//:build_script_build", + ":build_script_build", ], ) @@ -109,6 +122,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -137,6 +153,7 @@ cargo_build_script( ], ), edition = "2018", + emit_warnings = False, pkg_name = "typeid", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.uncased-0.9.10.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.uncased-0.9.10.bazel index f677429c07b0..dc1c2ecb2dbf 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.uncased-0.9.10.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.uncased-0.9.10.bazel @@ -60,12 +60,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -77,13 +79,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -91,6 +103,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -103,7 +116,7 @@ rust_library( }), version = "0.9.10", deps = [ - "@vendor_ts__uncased-0.9.10//:build_script_build", + ":build_script_build", ], ) @@ -113,6 +126,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -145,6 +161,7 @@ cargo_build_script( ], ), edition = "2018", + emit_warnings = False, pkg_name = "uncased", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ungrammar-1.16.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ungrammar-1.16.1.bazel index 680143ae6066..a43ecf56481d 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ungrammar-1.16.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.ungrammar-1.16.1.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.unicode-ident-1.0.24.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.unicode-ident-1.0.24.bazel index 27918c9b2b4a..156ea023f2bb 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.unicode-ident-1.0.24.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.unicode-ident-1.0.24.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.unicode-properties-0.1.4.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.unicode-properties-0.1.4.bazel index 03a7d85d1f2d..ff90d09a87ad 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.unicode-properties-0.1.4.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.unicode-properties-0.1.4.bazel @@ -55,12 +55,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -72,13 +74,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -86,6 +98,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.unsafe-libyaml-0.2.11.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.unsafe-libyaml-0.2.11.bazel index c5a1e9accf98..8a9e69f08ffe 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.unsafe-libyaml-0.2.11.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.unsafe-libyaml-0.2.11.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.utf8parse-0.2.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.utf8parse-0.2.2.bazel index 186b6221a216..e4bea8821f83 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.utf8parse-0.2.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.utf8parse-0.2.2.bazel @@ -55,12 +55,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -72,13 +74,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -86,6 +98,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.valuable-0.1.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.valuable-0.1.1.bazel index 73f685b51f74..c8269757c43a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.valuable-0.1.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.valuable-0.1.1.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,7 +112,7 @@ rust_library( }), version = "0.1.1", deps = [ - "@vendor_ts__valuable-0.1.1//:build_script_build", + ":build_script_build", ], ) @@ -109,6 +122,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -137,6 +153,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "valuable", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.version_check-0.9.5.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.version_check-0.9.5.bazel index e742e2f5c3cf..b0e1a04c6011 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.version_check-0.9.5.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.version_check-0.9.5.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.walkdir-2.5.0.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.walkdir-2.5.0.bazel index eaa6ea808b41..dd9c7fd01f3c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.walkdir-2.5.0.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.walkdir-2.5.0.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasi-0.11.1+wasi-snapshot-preview1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasi-0.11.1+wasi-snapshot-preview1.bazel index 1544ed0659e1..8aa6a072254c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasi-0.11.1+wasi-snapshot-preview1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasi-0.11.1+wasi-snapshot-preview1.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-0.2.126.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-0.2.126.bazel index 1aa50ddc0697..0c120808f80c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-0.2.126.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-0.2.126.bazel @@ -63,12 +63,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -80,13 +82,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -94,6 +106,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -106,9 +119,9 @@ rust_library( }), version = "0.2.126", deps = [ + ":build_script_build", "@vendor_ts__cfg-if-1.0.4//:cfg_if", "@vendor_ts__once_cell-1.21.4//:once_cell", - "@vendor_ts__wasm-bindgen-0.2.126//:build_script_build", "@vendor_ts__wasm-bindgen-shared-0.2.126//:wasm_bindgen_shared", ], ) @@ -122,6 +135,9 @@ cargo_build_script( aliases = { "@vendor_ts__rustversion-1.0.23//:rustversion": "rustversion_compat", }, + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -154,6 +170,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, link_deps = [ "@vendor_ts__wasm-bindgen-shared-0.2.126//:wasm_bindgen_shared", ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-macro-0.2.126.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-macro-0.2.126.bazel index 204b00c88685..2b6101c82ca1 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-macro-0.2.126.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-macro-0.2.126.bazel @@ -52,12 +52,14 @@ rust_proc_macro( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_proc_macro( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_proc_macro( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-macro-support-0.2.126.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-macro-support-0.2.126.bazel index eb26a9922b45..b51cf891efa6 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-macro-support-0.2.126.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-macro-support-0.2.126.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-shared-0.2.126.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-shared-0.2.126.bazel index 626e950d0c82..a633f2d5e6c9 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-shared-0.2.126.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.wasm-bindgen-shared-0.2.126.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,8 +112,8 @@ rust_library( }), version = "0.2.126", deps = [ + ":build_script_build", "@vendor_ts__unicode-ident-1.0.24//:unicode_ident", - "@vendor_ts__wasm-bindgen-shared-0.2.126//:build_script_build", ], ) @@ -110,6 +123,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -138,6 +154,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, links = "wasm_bindgen", pkg_name = "wasm-bindgen-shared", rustc_env_files = [ diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winapi-util-0.1.11.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winapi-util-0.1.11.bazel index b9f910dc53e7..298ea60ff1e7 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winapi-util-0.1.11.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winapi-util-0.1.11.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-core-0.62.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-core-0.62.2.bazel index 8944afcd7012..17e2d838c615 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-core-0.62.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-core-0.62.2.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-implement-0.60.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-implement-0.60.2.bazel index 88d5472ca932..2ed36393d79e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-implement-0.60.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-implement-0.60.2.bazel @@ -52,12 +52,14 @@ rust_proc_macro( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_proc_macro( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_proc_macro( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-interface-0.59.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-interface-0.59.3.bazel index 1955746a848c..d44b24b062f4 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-interface-0.59.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-interface-0.59.3.bazel @@ -52,12 +52,14 @@ rust_proc_macro( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_proc_macro( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_proc_macro( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-link-0.2.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-link-0.2.1.bazel index ad77c468d30a..d9820e054ca8 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-link-0.2.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-link-0.2.1.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-result-0.4.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-result-0.4.1.bazel index f3469f679b93..78cc7bef0082 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-result-0.4.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-result-0.4.1.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-strings-0.5.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-strings-0.5.1.bazel index 078c8f3c1e39..d2f956cd3e2d 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-strings-0.5.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-strings-0.5.1.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-sys-0.60.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-sys-0.60.2.bazel index 888c4387ba39..ff04d942acdd 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-sys-0.60.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-sys-0.60.2.bazel @@ -64,12 +64,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -81,13 +83,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -95,6 +107,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-sys-0.61.2.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-sys-0.61.2.bazel index 8610f9f7d0d3..6a445c10167c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-sys-0.61.2.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-sys-0.61.2.bazel @@ -69,12 +69,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -86,13 +88,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -100,6 +112,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-targets-0.53.5.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-targets-0.53.5.bazel index 7b8cfe447f9d..d7b4970cffab 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-targets-0.53.5.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows-targets-0.53.5.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_aarch64_gnullvm-0.53.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_aarch64_gnullvm-0.53.1.bazel index cebafebb9908..94b7355bbf5a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_aarch64_gnullvm-0.53.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_aarch64_gnullvm-0.53.1.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,7 +112,7 @@ rust_library( }), version = "0.53.1", deps = [ - "@vendor_ts__windows_aarch64_gnullvm-0.53.1//:build_script_build", + ":build_script_build", ], ) @@ -109,6 +122,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -137,6 +153,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "windows_aarch64_gnullvm", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_aarch64_msvc-0.53.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_aarch64_msvc-0.53.1.bazel index b7b20bbac41f..8d415c67fdc7 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_aarch64_msvc-0.53.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_aarch64_msvc-0.53.1.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,7 +112,7 @@ rust_library( }), version = "0.53.1", deps = [ - "@vendor_ts__windows_aarch64_msvc-0.53.1//:build_script_build", + ":build_script_build", ], ) @@ -109,6 +122,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -137,6 +153,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "windows_aarch64_msvc", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_i686_gnu-0.53.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_i686_gnu-0.53.1.bazel index 2e0b0f11a235..334c94008465 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_i686_gnu-0.53.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_i686_gnu-0.53.1.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,7 +112,7 @@ rust_library( }), version = "0.53.1", deps = [ - "@vendor_ts__windows_i686_gnu-0.53.1//:build_script_build", + ":build_script_build", ], ) @@ -109,6 +122,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -137,6 +153,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "windows_i686_gnu", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_i686_gnullvm-0.53.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_i686_gnullvm-0.53.1.bazel index 8da9d294891f..3e293a270a44 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_i686_gnullvm-0.53.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_i686_gnullvm-0.53.1.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,7 +112,7 @@ rust_library( }), version = "0.53.1", deps = [ - "@vendor_ts__windows_i686_gnullvm-0.53.1//:build_script_build", + ":build_script_build", ], ) @@ -109,6 +122,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -137,6 +153,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "windows_i686_gnullvm", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_i686_msvc-0.53.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_i686_msvc-0.53.1.bazel index 561379881b7f..fbc31563fded 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_i686_msvc-0.53.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_i686_msvc-0.53.1.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,7 +112,7 @@ rust_library( }), version = "0.53.1", deps = [ - "@vendor_ts__windows_i686_msvc-0.53.1//:build_script_build", + ":build_script_build", ], ) @@ -109,6 +122,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -137,6 +153,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "windows_i686_msvc", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_x86_64_gnu-0.53.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_x86_64_gnu-0.53.1.bazel index 7d5396412f85..2e913006d6f3 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_x86_64_gnu-0.53.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_x86_64_gnu-0.53.1.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,7 +112,7 @@ rust_library( }), version = "0.53.1", deps = [ - "@vendor_ts__windows_x86_64_gnu-0.53.1//:build_script_build", + ":build_script_build", ], ) @@ -109,6 +122,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -137,6 +153,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "windows_x86_64_gnu", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_x86_64_gnullvm-0.53.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_x86_64_gnullvm-0.53.1.bazel index 8b43186489e8..522c970e1720 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_x86_64_gnullvm-0.53.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_x86_64_gnullvm-0.53.1.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,7 +112,7 @@ rust_library( }), version = "0.53.1", deps = [ - "@vendor_ts__windows_x86_64_gnullvm-0.53.1//:build_script_build", + ":build_script_build", ], ) @@ -109,6 +122,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -137,6 +153,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "windows_x86_64_gnullvm", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_x86_64_msvc-0.53.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_x86_64_msvc-0.53.1.bazel index 1e08192e82f3..b042b97d0deb 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_x86_64_msvc-0.53.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.windows_x86_64_msvc-0.53.1.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,7 +112,7 @@ rust_library( }), version = "0.53.1", deps = [ - "@vendor_ts__windows_x86_64_msvc-0.53.1//:build_script_build", + ":build_script_build", ], ) @@ -109,6 +122,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -137,6 +153,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "windows_x86_64_msvc", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winnow-0.7.15.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winnow-0.7.15.bazel index 156ad002d937..36f239035864 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winnow-0.7.15.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winnow-0.7.15.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winnow-1.0.4.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winnow-1.0.4.bazel index 4eb20bbbcb79..fd703b0f1925 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winnow-1.0.4.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.winnow-1.0.4.bazel @@ -52,12 +52,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -69,13 +71,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -83,6 +95,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.yansi-1.0.1.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.yansi-1.0.1.bazel index 8770902865a6..0e2ac09574d9 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.yansi-1.0.1.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.yansi-1.0.1.bazel @@ -57,12 +57,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -74,13 +76,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -88,6 +100,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zmij-1.0.23.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zmij-1.0.23.bazel index 156e79e10996..6120db5840f5 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zmij-1.0.23.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zmij-1.0.23.bazel @@ -56,12 +56,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -73,13 +75,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -87,6 +99,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -99,7 +112,7 @@ rust_library( }), version = "1.0.23", deps = [ - "@vendor_ts__zmij-1.0.23//:build_script_build", + ":build_script_build", ], ) @@ -109,6 +122,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -137,6 +153,7 @@ cargo_build_script( ], ), edition = "2021", + emit_warnings = False, pkg_name = "zmij", rustc_env_files = [ ":cargo_toml_env_vars", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zstd-0.13.3.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zstd-0.13.3.bazel index ff3e776a7f8a..102ad485518e 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zstd-0.13.3.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zstd-0.13.3.bazel @@ -58,12 +58,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -75,13 +77,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -89,6 +101,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zstd-safe-7.2.4.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zstd-safe-7.2.4.bazel index eed1e00af815..160c8412f27c 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zstd-safe-7.2.4.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zstd-safe-7.2.4.bazel @@ -62,12 +62,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -79,13 +81,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -93,6 +105,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -105,7 +118,7 @@ rust_library( }), version = "7.2.4", deps = [ - "@vendor_ts__zstd-safe-7.2.4//:build_script_build", + ":build_script_build", "@vendor_ts__zstd-sys-2.0.16-zstd.1.5.7//:zstd_sys", ], ) @@ -116,6 +129,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -150,6 +166,7 @@ cargo_build_script( ], ), edition = "2018", + emit_warnings = False, link_deps = [ "@vendor_ts__zstd-sys-2.0.16-zstd.1.5.7//:zstd_sys", ], diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zstd-sys-2.0.16+zstd.1.5.7.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zstd-sys-2.0.16+zstd.1.5.7.bazel index a4ed5a0b745f..5c4a4055d94a 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zstd-sys-2.0.16+zstd.1.5.7.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.zstd-sys-2.0.16+zstd.1.5.7.bazel @@ -61,12 +61,14 @@ rust_library( target_compatible_with = select({ "@rules_rust//rust/platform:aarch64-apple-darwin": [], "@rules_rust//rust/platform:aarch64-apple-ios": [], + "@rules_rust//rust/platform:aarch64-apple-ios-macabi": [], "@rules_rust//rust/platform:aarch64-apple-ios-sim": [], "@rules_rust//rust/platform:aarch64-linux-android": [], "@rules_rust//rust/platform:aarch64-pc-windows-msvc": [], "@rules_rust//rust/platform:aarch64-unknown-fuchsia": [], "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu": [], + "@rules_rust//rust/platform:aarch64-unknown-none": [], "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710": [], "@rules_rust//rust/platform:aarch64-unknown-uefi": [], "@rules_rust//rust/platform:arm-unknown-linux-gnueabi": [], @@ -78,13 +80,23 @@ rust_library( "@rules_rust//rust/platform:i686-pc-windows-msvc": [], "@rules_rust//rust/platform:i686-unknown-freebsd": [], "@rules_rust//rust/platform:i686-unknown-linux-gnu": [], + "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:mips-unknown-linux-gnu": [], "@rules_rust//rust/platform:powerpc-unknown-linux-gnu": [], + "@rules_rust//rust/platform:riscv32imac-unknown-none-elf": [], "@rules_rust//rust/platform:riscv32imc-unknown-none-elf": [], "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu": [], "@rules_rust//rust/platform:riscv64gc-unknown-none-elf": [], "@rules_rust//rust/platform:s390x-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:sparc64-unknown-netbsd": [], + "@rules_rust//rust/platform:sparc64-unknown-openbsd": [], + "@rules_rust//rust/platform:thumbv6m-none-eabi": [], "@rules_rust//rust/platform:thumbv7em-none-eabi": [], + "@rules_rust//rust/platform:thumbv7em-none-eabihf": [], + "@rules_rust//rust/platform:thumbv7m-none-eabi": [], "@rules_rust//rust/platform:thumbv8m.main-none-eabi": [], + "@rules_rust//rust/platform:thumbv8m.main-none-eabihf": [], "@rules_rust//rust/platform:wasm32-unknown-emscripten": [], "@rules_rust//rust/platform:wasm32-unknown-unknown": [], "@rules_rust//rust/platform:wasm32-wasip1": [], @@ -92,6 +104,7 @@ rust_library( "@rules_rust//rust/platform:wasm32-wasip2": [], "@rules_rust//rust/platform:x86_64-apple-darwin": [], "@rules_rust//rust/platform:x86_64-apple-ios": [], + "@rules_rust//rust/platform:x86_64-apple-ios-macabi": [], "@rules_rust//rust/platform:x86_64-linux-android": [], "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], "@rules_rust//rust/platform:x86_64-unknown-freebsd": [], @@ -104,7 +117,7 @@ rust_library( }), version = "2.0.16+zstd.1.5.7", deps = [ - "@vendor_ts__zstd-sys-2.0.16-zstd.1.5.7//:build_script_build", + ":build_script_build", ], ) @@ -114,6 +127,9 @@ cargo_build_script( include = ["**/*.rs"], allow_empty = True, ), + build_script_env_files = [ + ":cargo_toml_env_vars", + ], compile_data = glob( include = ["**"], allow_empty = True, @@ -147,6 +163,7 @@ cargo_build_script( ], ), edition = "2018", + emit_warnings = False, links = "zstd", pkg_name = "zstd-sys", rustc_env_files = [ diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/anyhow-1.0.104/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/anyhow-1.0.104/BUILD.bazel new file mode 100644 index 000000000000..2e3ccd2c4a3d --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/anyhow-1.0.104/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "anyhow-1.0.104", + actual = "@vendor_ts__anyhow-1.0.104//:anyhow", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/anyhow/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/anyhow/BUILD.bazel new file mode 100644 index 000000000000..6e60cef6e1ce --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/anyhow/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "anyhow", + actual = "@vendor_ts__anyhow-1.0.104//:anyhow", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/argfile-1.0.0/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/argfile-1.0.0/BUILD.bazel new file mode 100644 index 000000000000..d9f4480097d6 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/argfile-1.0.0/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "argfile-1.0.0", + actual = "@vendor_ts__argfile-1.0.0//:argfile", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/argfile/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/argfile/BUILD.bazel new file mode 100644 index 000000000000..308c6689fa8e --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/argfile/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "argfile", + actual = "@vendor_ts__argfile-1.0.0//:argfile", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/chalk-ir-0.104.0/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/chalk-ir-0.104.0/BUILD.bazel new file mode 100644 index 000000000000..565b781b3307 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/chalk-ir-0.104.0/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "chalk-ir-0.104.0", + actual = "@vendor_ts__chalk-ir-0.104.0//:chalk_ir", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/chalk-ir/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/chalk-ir/BUILD.bazel new file mode 100644 index 000000000000..4595c6513ded --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/chalk-ir/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "chalk-ir", + actual = "@vendor_ts__chalk-ir-0.104.0//:chalk_ir", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/chrono-0.4.45/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/chrono-0.4.45/BUILD.bazel new file mode 100644 index 000000000000..205761e16dc2 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/chrono-0.4.45/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "chrono-0.4.45", + actual = "@vendor_ts__chrono-0.4.45//:chrono", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/chrono/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/chrono/BUILD.bazel new file mode 100644 index 000000000000..a750c43750ab --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/chrono/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "chrono", + actual = "@vendor_ts__chrono-0.4.45//:chrono", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/clap-4.6.6/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/clap-4.6.6/BUILD.bazel new file mode 100644 index 000000000000..4ec40d0e4236 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/clap-4.6.6/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "clap-4.6.6", + actual = "@vendor_ts__clap-4.6.6//:clap", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/clap/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/clap/BUILD.bazel new file mode 100644 index 000000000000..ee6ba1869700 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/clap/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "clap", + actual = "@vendor_ts__clap-4.6.6//:clap", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/crates.bzl b/misc/bazel/3rdparty/tree_sitter_extractors_deps/crates.bzl index 6d6d80ef58ce..db2d5ff2deae 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/crates.bzl +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/crates.bzl @@ -1,21 +1,875 @@ ############################################################################### # @generated -# This file is auto-generated by the cargo-bazel tool. +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: # -# DO NOT MODIFY: Local changes may be replaced in future executions. +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors ############################################################################### -"""Rules for defining repositories for remote `crates_vendor` repositories""" +""" +# `crates_repository` API +- [aliases](#aliases) +- [crate_edition](#crate_edition) +- [crate_deps](#crate_deps) +- [all_crate_deps](#all_crate_deps) +- [crate_repositories](#crate_repositories) + +""" + +load("@bazel_skylib//lib:selects.bzl", "selects") +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") +load("@rules_rust//crate_universe:defs.bzl", "crates_vendor_remote_repository") + +############################################################################### +# MACROS API +############################################################################### + +# An identifier that represent common dependencies (unconditional). +_COMMON_CONDITION = "" + +def _flatten_dependency_maps(all_dependency_maps): + """Flatten a list of dependency maps into one dictionary. + + Dependency maps have the following structure: + + ```python + DEPENDENCIES_MAP = { + # The first key in the map is a Bazel package + # name of the workspace this file is defined in. + "workspace_member_package": { + + # Not all dependencies are supported for all platforms. + # the condition key is the condition required to be true + # on the host platform. + "condition": { + + # An alias to a crate target. # The label of the crate target the + # Aliases are only crate names. # package name refers to. + "package_name": "@full//:label", + } + } + } + ``` + + Args: + all_dependency_maps (list): A list of dicts as described above + + Returns: + dict: A dictionary as described above + """ + dependencies = {} + + for workspace_deps_map in all_dependency_maps: + for pkg_name, conditional_deps_map in workspace_deps_map.items(): + if pkg_name not in dependencies: + non_frozen_map = dict() + for key, values in conditional_deps_map.items(): + non_frozen_map.update({key: dict(values.items())}) + dependencies.setdefault(pkg_name, non_frozen_map) + continue + + for condition, deps_map in conditional_deps_map.items(): + # If the condition has not been recorded, do so and continue + if condition not in dependencies[pkg_name]: + dependencies[pkg_name].setdefault(condition, dict(deps_map.items())) + continue + + # Alert on any miss-matched dependencies + inconsistent_entries = [] + for crate_name, crate_label in deps_map.items(): + existing = dependencies[pkg_name][condition].get(crate_name) + if existing and existing != crate_label: + inconsistent_entries.append((crate_name, existing, crate_label)) + dependencies[pkg_name][condition].update({crate_name: crate_label}) + + return dependencies + +def crate_deps(deps, package_name = None): + """Finds the fully qualified label of the requested crates for the package where this macro is called. + + Args: + deps (list): The desired list of crate targets. + package_name (str, optional): The package name of the set of dependencies to look up. + Defaults to `native.package_name()`. + + Returns: + list: A list of labels to generated rust targets (str) + """ + + if not deps: + return [] + + if package_name == None: + package_name = native.package_name() + + # Join both sets of dependencies + dependencies = _flatten_dependency_maps([ + _NORMAL_DEPENDENCIES, + _NORMAL_DEV_DEPENDENCIES, + _PROC_MACRO_DEPENDENCIES, + _PROC_MACRO_DEV_DEPENDENCIES, + _BUILD_DEPENDENCIES, + _BUILD_PROC_MACRO_DEPENDENCIES, + ]).pop(package_name, {}) + + # Combine all conditional packages so we can easily index over a flat list + # TODO: Perhaps this should actually return select statements and maintain + # the conditionals of the dependencies + flat_deps = {} + for deps_set in dependencies.values(): + for crate_name, crate_label in deps_set.items(): + flat_deps.update({crate_name: crate_label}) + + missing_crates = [] + crate_targets = [] + for crate_target in deps: + if crate_target not in flat_deps: + missing_crates.append(crate_target) + else: + crate_targets.append(flat_deps[crate_target]) + + if missing_crates: + fail("Could not find crates `{}` among dependencies of `{}`. Available dependencies were `{}`".format( + missing_crates, + package_name, + dependencies, + )) + + return crate_targets + +def crate_edition(package_name = None): + """Finds the Rust edition for the package where this macro is called. + + Args: + package_name (str, optional): The package name whose edition should be + looked up. Defaults to `native.package_name()` when unset. + + Returns: + str: The Rust edition declared by the package's Cargo.toml file. + """ + if package_name == None: + package_name = native.package_name() + + if package_name not in _CRATE_EDITIONS: + fail("Tried to get crate_edition for package " + package_name + " but that package had no Cargo.toml file") + + return _CRATE_EDITIONS[package_name] + +def all_crate_deps( + normal = False, + normal_dev = False, + proc_macro = False, + proc_macro_dev = False, + build = False, + build_proc_macro = False, + package_name = None): + """Finds the fully qualified label of all requested direct crate dependencies \ + for the package where this macro is called. + + If no parameters are set, all normal dependencies are returned. Setting any one flag will + otherwise impact the contents of the returned list. + + Args: + normal (bool, optional): If True, normal dependencies are included in the + output list. + normal_dev (bool, optional): If True, normal dev dependencies will be + included in the output list. + proc_macro (bool, optional): If True, proc_macro dependencies are included + in the output list. + proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are + included in the output list. + build (bool, optional): If True, build dependencies are included + in the output list. + build_proc_macro (bool, optional): If True, build proc_macro dependencies are + included in the output list. + package_name (str, optional): The package name of the set of dependencies to look up. + Defaults to `native.package_name()` when unset. + + Returns: + list: A list of labels to generated rust targets (str) + """ + + if package_name == None: + package_name = native.package_name() + + # Determine the relevant maps to use + all_dependency_maps = [] + if normal: + all_dependency_maps.append(_NORMAL_DEPENDENCIES) + if normal_dev: + all_dependency_maps.append(_NORMAL_DEV_DEPENDENCIES) + if proc_macro: + all_dependency_maps.append(_PROC_MACRO_DEPENDENCIES) + if proc_macro_dev: + all_dependency_maps.append(_PROC_MACRO_DEV_DEPENDENCIES) + if build: + all_dependency_maps.append(_BUILD_DEPENDENCIES) + if build_proc_macro: + all_dependency_maps.append(_BUILD_PROC_MACRO_DEPENDENCIES) + + # Default to always using normal dependencies + if not all_dependency_maps: + all_dependency_maps.append(_NORMAL_DEPENDENCIES) + + dependencies = _flatten_dependency_maps(all_dependency_maps).pop(package_name, None) + + if not dependencies: + if dependencies == None: + fail("Tried to get all_crate_deps for package " + package_name + " but that package had no Cargo.toml file") + else: + return [] + + crate_deps = list(dependencies.pop(_COMMON_CONDITION, {}).values()) + for condition, deps in dependencies.items(): + crate_deps += selects.with_or({ + tuple(_CONDITIONS[condition]): deps.values(), + "//conditions:default": [], + }) + + return crate_deps + +def aliases( + normal = False, + normal_dev = False, + proc_macro = False, + proc_macro_dev = False, + build = False, + build_proc_macro = False, + package_name = None): + """Produces a map of Crate alias names to their original label + + If no dependency kinds are specified, `normal` and `proc_macro` are used by default. + Setting any one flag will otherwise determine the contents of the returned dict. + + Args: + normal (bool, optional): If True, normal dependencies are included in the + output list. + normal_dev (bool, optional): If True, normal dev dependencies will be + included in the output list.. + proc_macro (bool, optional): If True, proc_macro dependencies are included + in the output list. + proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are + included in the output list. + build (bool, optional): If True, build dependencies are included + in the output list. + build_proc_macro (bool, optional): If True, build proc_macro dependencies are + included in the output list. + package_name (str, optional): The package name of the set of dependencies to look up. + Defaults to `native.package_name()` when unset. + + Returns: + dict: The aliases of all associated packages + """ + if package_name == None: + package_name = native.package_name() + + # Determine the relevant maps to use + all_aliases_maps = [] + if normal: + all_aliases_maps.append(_NORMAL_ALIASES) + if normal_dev: + all_aliases_maps.append(_NORMAL_DEV_ALIASES) + if proc_macro: + all_aliases_maps.append(_PROC_MACRO_ALIASES) + if proc_macro_dev: + all_aliases_maps.append(_PROC_MACRO_DEV_ALIASES) + if build: + all_aliases_maps.append(_BUILD_ALIASES) + if build_proc_macro: + all_aliases_maps.append(_BUILD_PROC_MACRO_ALIASES) + + # Default to always using normal aliases + if not all_aliases_maps: + all_aliases_maps.append(_NORMAL_ALIASES) + all_aliases_maps.append(_PROC_MACRO_ALIASES) + + aliases = _flatten_dependency_maps(all_aliases_maps).pop(package_name, None) + + if not aliases: + return dict() + + common_items = aliases.pop(_COMMON_CONDITION, {}).items() + + # If there are only common items in the dictionary, immediately return them + if not len(aliases.keys()) == 1: + return dict(common_items) + + # Build a single select statement where each conditional has accounted for the + # common set of aliases. + crate_aliases = {"//conditions:default": dict(common_items)} + for condition, deps in aliases.items(): + condition_triples = _CONDITIONS[condition] + for triple in condition_triples: + if triple in crate_aliases: + crate_aliases[triple].update(deps) + else: + crate_aliases.update({triple: dict(deps.items() + common_items)}) -# buildifier: disable=bzl-visibility -load("@rules_rust//crate_universe/private:crates_vendor.bzl", "crates_vendor_remote_repository") + return select(crate_aliases) -# buildifier: disable=bzl-visibility -load("//misc/bazel/3rdparty/tree_sitter_extractors_deps:defs.bzl", _crate_repositories = "crate_repositories") +############################################################################### +# WORKSPACE MEMBER DEPS, ALIASES, AND EDITIONS +############################################################################### + +_CRATE_EDITIONS = { + "ruby/extractor": "2024", + "rust/ast-generator": "2024", + "rust/autobuild": "2024", + "rust/extractor": "2024", + "rust/extractor/macros": "2024", + "shared/tree-sitter-extractor": "2024", + "shared/yeast": "2021", + "shared/yeast-macros": "2021", + "shared/yeast-schema": "2021", + "unified/extractor": "2024", + "unified/swift-syntax-rs": "2024", +} + +_NORMAL_DEPENDENCIES = { + "ruby/extractor": { + _COMMON_CONDITION: { + "clap": Label("@vendor_ts//clap-4.6.6"), + "encoding": Label("@vendor_ts//encoding-0.2.33"), + "lazy_static": Label("@vendor_ts//lazy_static-1.5.0"), + "rayon": Label("@vendor_ts//rayon-1.12.0"), + "regex": Label("@vendor_ts//regex-1.13.1"), + "serde_json": Label("@vendor_ts//serde_json-1.0.151"), + "tracing": Label("@vendor_ts//tracing-0.1.44"), + "tracing-subscriber": Label("@vendor_ts//tracing-subscriber-0.3.23"), + "tree-sitter": Label("@vendor_ts//tree-sitter-0.26.9"), + "tree-sitter-embedded-template": Label("@vendor_ts//tree-sitter-embedded-template-0.25.0"), + "tree-sitter-ruby": Label("@vendor_ts//tree-sitter-ruby-0.23.1"), + }, + }, + "rust/ast-generator": { + _COMMON_CONDITION: { + "anyhow": Label("@vendor_ts//anyhow-1.0.104"), + "either": Label("@vendor_ts//either-1.17.0"), + "itertools": Label("@vendor_ts//itertools-0.15.0"), + "mustache": Label("@vendor_ts//mustache-0.9.0"), + "proc-macro2": Label("@vendor_ts//proc-macro2-1.0.107"), + "quote": Label("@vendor_ts//quote-1.0.47"), + "serde": Label("@vendor_ts//serde-1.0.229"), + "stdx": Label("@vendor_ts//ra_ap_stdx-0.0.347"), + "ungrammar": Label("@vendor_ts//ungrammar-1.16.1"), + }, + }, + "rust/autobuild": { + }, + "rust/extractor": { + _COMMON_CONDITION: { + "anyhow": Label("@vendor_ts//anyhow-1.0.104"), + "argfile": Label("@vendor_ts//argfile-1.0.0"), + "chalk-ir": Label("@vendor_ts//chalk-ir-0.104.0"), + "chrono": Label("@vendor_ts//chrono-0.4.45"), + "clap": Label("@vendor_ts//clap-4.6.6"), + "dunce": Label("@vendor_ts//dunce-1.0.5"), + "figment": Label("@vendor_ts//figment-0.10.19"), + "glob": Label("@vendor_ts//glob-0.3.4"), + "itertools": Label("@vendor_ts//itertools-0.15.0"), + "mustache": Label("@vendor_ts//mustache-0.9.0"), + "num-traits": Label("@vendor_ts//num-traits-0.2.19"), + "ra_ap_base_db": Label("@vendor_ts//ra_ap_base_db-0.0.347"), + "ra_ap_cfg": Label("@vendor_ts//ra_ap_cfg-0.0.347"), + "ra_ap_hir": Label("@vendor_ts//ra_ap_hir-0.0.347"), + "ra_ap_hir_def": Label("@vendor_ts//ra_ap_hir_def-0.0.347"), + "ra_ap_hir_expand": Label("@vendor_ts//ra_ap_hir_expand-0.0.347"), + "ra_ap_hir_ty": Label("@vendor_ts//ra_ap_hir_ty-0.0.347"), + "ra_ap_ide_db": Label("@vendor_ts//ra_ap_ide_db-0.0.347"), + "ra_ap_intern": Label("@vendor_ts//ra_ap_intern-0.0.347"), + "ra_ap_load-cargo": Label("@vendor_ts//ra_ap_load-cargo-0.0.347"), + "ra_ap_parser": Label("@vendor_ts//ra_ap_parser-0.0.347"), + "ra_ap_paths": Label("@vendor_ts//ra_ap_paths-0.0.347"), + "ra_ap_project_model": Label("@vendor_ts//ra_ap_project_model-0.0.347"), + "ra_ap_span": Label("@vendor_ts//ra_ap_span-0.0.347"), + "ra_ap_syntax": Label("@vendor_ts//ra_ap_syntax-0.0.347"), + "ra_ap_syntax-bridge": Label("@vendor_ts//ra_ap_syntax-bridge-0.0.347"), + "ra_ap_vfs": Label("@vendor_ts//ra_ap_vfs-0.0.347"), + "serde": Label("@vendor_ts//serde-1.0.229"), + "serde_json": Label("@vendor_ts//serde_json-1.0.151"), + "serde_with": Label("@vendor_ts//serde_with-3.22.0"), + "toml": Label("@vendor_ts//toml-1.1.4+spec-1.1.0"), + "tracing": Label("@vendor_ts//tracing-0.1.44"), + "tracing-flame": Label("@vendor_ts//tracing-flame-0.2.0"), + "tracing-subscriber": Label("@vendor_ts//tracing-subscriber-0.3.23"), + "triomphe": Label("@vendor_ts//triomphe-0.1.16"), + }, + }, + "rust/extractor/macros": { + _COMMON_CONDITION: { + "quote": Label("@vendor_ts//quote-1.0.47"), + "syn": Label("@vendor_ts//syn-3.0.3"), + }, + }, + "shared/tree-sitter-extractor": { + _COMMON_CONDITION: { + "chrono": Label("@vendor_ts//chrono-0.4.45"), + "encoding": Label("@vendor_ts//encoding-0.2.33"), + "flate2": Label("@vendor_ts//flate2-1.1.9"), + "globset": Label("@vendor_ts//globset-0.4.18"), + "lazy_static": Label("@vendor_ts//lazy_static-1.5.0"), + "num_cpus": Label("@vendor_ts//num_cpus-1.17.0"), + "rayon": Label("@vendor_ts//rayon-1.12.0"), + "regex": Label("@vendor_ts//regex-1.13.1"), + "serde": Label("@vendor_ts//serde-1.0.229"), + "serde_json": Label("@vendor_ts//serde_json-1.0.151"), + "tracing": Label("@vendor_ts//tracing-0.1.44"), + "tracing-subscriber": Label("@vendor_ts//tracing-subscriber-0.3.23"), + "tree-sitter": Label("@vendor_ts//tree-sitter-0.26.9"), + "zstd": Label("@vendor_ts//zstd-0.13.3"), + }, + }, + "shared/yeast": { + _COMMON_CONDITION: { + "clap": Label("@vendor_ts//clap-4.6.6"), + "serde": Label("@vendor_ts//serde-1.0.229"), + "serde_json": Label("@vendor_ts//serde_json-1.0.151"), + "serde_yaml": Label("@vendor_ts//serde_yaml-0.9.34+deprecated"), + "tree-sitter": Label("@vendor_ts//tree-sitter-0.26.9"), + "tree-sitter-python": Label("@vendor_ts//tree-sitter-python-0.25.0"), + "tree-sitter-ruby": Label("@vendor_ts//tree-sitter-ruby-0.23.1"), + }, + }, + "shared/yeast-macros": { + _COMMON_CONDITION: { + "proc-macro2": Label("@vendor_ts//proc-macro2-1.0.107"), + "quote": Label("@vendor_ts//quote-1.0.47"), + "syn": Label("@vendor_ts//syn-3.0.3"), + }, + }, + "shared/yeast-schema": { + _COMMON_CONDITION: { + "serde": Label("@vendor_ts//serde-1.0.229"), + "serde_json": Label("@vendor_ts//serde_json-1.0.151"), + "serde_yaml": Label("@vendor_ts//serde_yaml-0.9.34+deprecated"), + }, + }, + "unified/extractor": { + _COMMON_CONDITION: { + "clap": Label("@vendor_ts//clap-4.6.6"), + "encoding": Label("@vendor_ts//encoding-0.2.33"), + "lazy_static": Label("@vendor_ts//lazy_static-1.5.0"), + "rayon": Label("@vendor_ts//rayon-1.12.0"), + "regex": Label("@vendor_ts//regex-1.13.1"), + "serde_json": Label("@vendor_ts//serde_json-1.0.151"), + "tracing": Label("@vendor_ts//tracing-0.1.44"), + "tracing-subscriber": Label("@vendor_ts//tracing-subscriber-0.3.23"), + }, + }, + "unified/swift-syntax-rs": { + }, +} + +_NORMAL_ALIASES = { + "ruby/extractor": { + _COMMON_CONDITION: { + }, + }, + "rust/ast-generator": { + _COMMON_CONDITION: { + Label("@vendor_ts//ra_ap_stdx-0.0.347"): "stdx", + }, + }, + "rust/autobuild": { + }, + "rust/extractor": { + _COMMON_CONDITION: { + }, + }, + "rust/extractor/macros": { + _COMMON_CONDITION: { + }, + }, + "shared/tree-sitter-extractor": { + _COMMON_CONDITION: { + }, + }, + "shared/yeast": { + _COMMON_CONDITION: { + }, + }, + "shared/yeast-macros": { + _COMMON_CONDITION: { + }, + }, + "shared/yeast-schema": { + _COMMON_CONDITION: { + }, + }, + "unified/extractor": { + _COMMON_CONDITION: { + }, + }, + "unified/swift-syntax-rs": { + }, +} + +_NORMAL_DEV_DEPENDENCIES = { + "ruby/extractor": { + }, + "rust/ast-generator": { + }, + "rust/autobuild": { + }, + "rust/extractor": { + }, + "rust/extractor/macros": { + }, + "shared/tree-sitter-extractor": { + _COMMON_CONDITION: { + "rand": Label("@vendor_ts//rand-0.10.2"), + "tree-sitter-json": Label("@vendor_ts//tree-sitter-json-0.24.8"), + "tree-sitter-ql": Label("@vendor_ts//tree-sitter-ql-0.23.1"), + }, + }, + "shared/yeast": { + }, + "shared/yeast-macros": { + }, + "shared/yeast-schema": { + }, + "unified/extractor": { + }, + "unified/swift-syntax-rs": { + }, +} + +_NORMAL_DEV_ALIASES = { + "ruby/extractor": { + }, + "rust/ast-generator": { + }, + "rust/autobuild": { + }, + "rust/extractor": { + }, + "rust/extractor/macros": { + }, + "shared/tree-sitter-extractor": { + _COMMON_CONDITION: { + }, + }, + "shared/yeast": { + }, + "shared/yeast-macros": { + }, + "shared/yeast-schema": { + }, + "unified/extractor": { + }, + "unified/swift-syntax-rs": { + }, +} + +_PROC_MACRO_DEPENDENCIES = { + "ruby/extractor": { + }, + "rust/ast-generator": { + }, + "rust/autobuild": { + }, + "rust/extractor": { + }, + "rust/extractor/macros": { + }, + "shared/tree-sitter-extractor": { + }, + "shared/yeast": { + }, + "shared/yeast-macros": { + }, + "shared/yeast-schema": { + }, + "unified/extractor": { + }, + "unified/swift-syntax-rs": { + }, +} + +_PROC_MACRO_ALIASES = { + "ruby/extractor": { + }, + "rust/ast-generator": { + }, + "rust/autobuild": { + }, + "rust/extractor": { + }, + "rust/extractor/macros": { + }, + "shared/tree-sitter-extractor": { + }, + "shared/yeast": { + }, + "shared/yeast-macros": { + }, + "shared/yeast-schema": { + }, + "unified/extractor": { + }, + "unified/swift-syntax-rs": { + }, +} + +_PROC_MACRO_DEV_DEPENDENCIES = { + "ruby/extractor": { + }, + "rust/ast-generator": { + }, + "rust/autobuild": { + }, + "rust/extractor": { + }, + "rust/extractor/macros": { + }, + "shared/tree-sitter-extractor": { + }, + "shared/yeast": { + }, + "shared/yeast-macros": { + }, + "shared/yeast-schema": { + }, + "unified/extractor": { + }, + "unified/swift-syntax-rs": { + }, +} + +_PROC_MACRO_DEV_ALIASES = { + "ruby/extractor": { + }, + "rust/ast-generator": { + }, + "rust/autobuild": { + }, + "rust/extractor": { + }, + "rust/extractor/macros": { + }, + "shared/tree-sitter-extractor": { + _COMMON_CONDITION: { + }, + }, + "shared/yeast": { + }, + "shared/yeast-macros": { + }, + "shared/yeast-schema": { + }, + "unified/extractor": { + }, + "unified/swift-syntax-rs": { + }, +} + +_BUILD_DEPENDENCIES = { + "ruby/extractor": { + }, + "rust/ast-generator": { + }, + "rust/autobuild": { + }, + "rust/extractor": { + }, + "rust/extractor/macros": { + }, + "shared/tree-sitter-extractor": { + }, + "shared/yeast": { + }, + "shared/yeast-macros": { + }, + "shared/yeast-schema": { + }, + "unified/extractor": { + }, + "unified/swift-syntax-rs": { + }, +} + +_BUILD_ALIASES = { + "ruby/extractor": { + }, + "rust/ast-generator": { + }, + "rust/autobuild": { + }, + "rust/extractor": { + }, + "rust/extractor/macros": { + }, + "shared/tree-sitter-extractor": { + }, + "shared/yeast": { + }, + "shared/yeast-macros": { + }, + "shared/yeast-schema": { + }, + "unified/extractor": { + }, + "unified/swift-syntax-rs": { + }, +} + +_BUILD_PROC_MACRO_DEPENDENCIES = { + "ruby/extractor": { + }, + "rust/ast-generator": { + }, + "rust/autobuild": { + }, + "rust/extractor": { + }, + "rust/extractor/macros": { + }, + "shared/tree-sitter-extractor": { + }, + "shared/yeast": { + }, + "shared/yeast-macros": { + }, + "shared/yeast-schema": { + }, + "unified/extractor": { + }, + "unified/swift-syntax-rs": { + }, +} + +_BUILD_PROC_MACRO_ALIASES = { + "ruby/extractor": { + }, + "rust/ast-generator": { + }, + "rust/autobuild": { + }, + "rust/extractor": { + }, + "rust/extractor/macros": { + }, + "shared/tree-sitter-extractor": { + }, + "shared/yeast": { + }, + "shared/yeast-macros": { + }, + "shared/yeast-schema": { + }, + "unified/extractor": { + }, + "unified/swift-syntax-rs": { + }, +} + +_CONDITIONS = { + "aarch64-apple-darwin": ["@rules_rust//rust/platform:aarch64-apple-darwin"], + "aarch64-apple-ios": ["@rules_rust//rust/platform:aarch64-apple-ios"], + "aarch64-apple-ios-macabi": ["@rules_rust//rust/platform:aarch64-apple-ios-macabi"], + "aarch64-apple-ios-sim": ["@rules_rust//rust/platform:aarch64-apple-ios-sim"], + "aarch64-linux-android": ["@rules_rust//rust/platform:aarch64-linux-android"], + "aarch64-pc-windows-gnullvm": [], + "aarch64-pc-windows-msvc": ["@rules_rust//rust/platform:aarch64-pc-windows-msvc"], + "aarch64-unknown-fuchsia": ["@rules_rust//rust/platform:aarch64-unknown-fuchsia"], + "aarch64-unknown-linux-gnu": ["@rules_rust//rust/platform:aarch64-unknown-linux-gnu", "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu"], + "aarch64-unknown-nixos-gnu": ["@rules_rust//rust/platform:aarch64-unknown-nixos-gnu"], + "aarch64-unknown-none": ["@rules_rust//rust/platform:aarch64-unknown-none"], + "aarch64-unknown-nto-qnx710": ["@rules_rust//rust/platform:aarch64-unknown-nto-qnx710"], + "aarch64-unknown-uefi": ["@rules_rust//rust/platform:aarch64-unknown-uefi"], + "arm-unknown-linux-gnueabi": ["@rules_rust//rust/platform:arm-unknown-linux-gnueabi"], + "arm-unknown-linux-musleabi": ["@rules_rust//rust/platform:arm-unknown-linux-musleabi"], + "armv7-linux-androideabi": ["@rules_rust//rust/platform:armv7-linux-androideabi"], + "armv7-unknown-linux-gnueabi": ["@rules_rust//rust/platform:armv7-unknown-linux-gnueabi"], + "cfg(all(any(target_arch = \"x86_64\", target_arch = \"arm64ec\"), target_env = \"msvc\", not(windows_raw_dylib)))": ["@rules_rust//rust/platform:x86_64-pc-windows-msvc"], + "cfg(all(any(target_os = \"linux\", target_os = \"android\"), not(any(all(target_os = \"linux\", target_env = \"\"), getrandom_backend = \"custom\", getrandom_backend = \"linux_raw\", getrandom_backend = \"rdrand\", getrandom_backend = \"rndr\"))))": ["@rules_rust//rust/platform:aarch64-linux-android", "@rules_rust//rust/platform:aarch64-unknown-linux-gnu", "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu", "@rules_rust//rust/platform:arm-unknown-linux-gnueabi", "@rules_rust//rust/platform:arm-unknown-linux-musleabi", "@rules_rust//rust/platform:armv7-linux-androideabi", "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi", "@rules_rust//rust/platform:i686-linux-android", "@rules_rust//rust/platform:i686-unknown-linux-gnu", "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu", "@rules_rust//rust/platform:mips-unknown-linux-gnu", "@rules_rust//rust/platform:powerpc-unknown-linux-gnu", "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu", "@rules_rust//rust/platform:s390x-unknown-linux-gnu", "@rules_rust//rust/platform:sparc64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-linux-android", "@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], + "cfg(all(target_arch = \"aarch64\", target_env = \"msvc\", not(windows_raw_dylib)))": ["@rules_rust//rust/platform:aarch64-pc-windows-msvc"], + "cfg(all(target_arch = \"aarch64\", target_os = \"android\"))": ["@rules_rust//rust/platform:aarch64-linux-android"], + "cfg(all(target_arch = \"aarch64\", target_os = \"linux\"))": ["@rules_rust//rust/platform:aarch64-unknown-linux-gnu", "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu"], + "cfg(all(target_arch = \"aarch64\", target_vendor = \"apple\"))": ["@rules_rust//rust/platform:aarch64-apple-darwin", "@rules_rust//rust/platform:aarch64-apple-ios", "@rules_rust//rust/platform:aarch64-apple-ios-macabi", "@rules_rust//rust/platform:aarch64-apple-ios-sim"], + "cfg(all(target_arch = \"loongarch64\", target_os = \"linux\"))": ["@rules_rust//rust/platform:loongarch64-unknown-linux-gnu"], + "cfg(all(target_arch = \"wasm32\", target_os = \"unknown\"))": ["@rules_rust//rust/platform:wasm32-unknown-unknown"], + "cfg(all(target_arch = \"x86\", target_env = \"gnu\", not(target_abi = \"llvm\"), not(windows_raw_dylib)))": ["@rules_rust//rust/platform:i686-unknown-linux-gnu"], + "cfg(all(target_arch = \"x86\", target_env = \"msvc\", not(windows_raw_dylib)))": ["@rules_rust//rust/platform:i686-pc-windows-msvc"], + "cfg(all(target_arch = \"x86_64\", target_env = \"gnu\", not(target_abi = \"llvm\"), not(windows_raw_dylib)))": ["@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], + "cfg(all(target_os = \"linux\", not(target_env = \"ohos\"), any(target_arch = \"x86\", target_arch = \"x86_64\", target_arch = \"aarch64\")))": ["@rules_rust//rust/platform:aarch64-unknown-linux-gnu", "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu", "@rules_rust//rust/platform:i686-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], + "cfg(all(target_os = \"linux\", target_env = \"gnu\"))": ["@rules_rust//rust/platform:aarch64-unknown-linux-gnu", "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu", "@rules_rust//rust/platform:arm-unknown-linux-gnueabi", "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi", "@rules_rust//rust/platform:i686-unknown-linux-gnu", "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu", "@rules_rust//rust/platform:mips-unknown-linux-gnu", "@rules_rust//rust/platform:powerpc-unknown-linux-gnu", "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu", "@rules_rust//rust/platform:s390x-unknown-linux-gnu", "@rules_rust//rust/platform:sparc64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], + "cfg(all(target_os = \"uefi\", getrandom_backend = \"efi_rng\"))": [], + "cfg(any())": [], + "cfg(any(target_arch = \"x86_64\", target_arch = \"x86\"))": ["@rules_rust//rust/platform:i686-apple-darwin", "@rules_rust//rust/platform:i686-linux-android", "@rules_rust//rust/platform:i686-pc-windows-msvc", "@rules_rust//rust/platform:i686-unknown-freebsd", "@rules_rust//rust/platform:i686-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-apple-darwin", "@rules_rust//rust/platform:x86_64-apple-ios", "@rules_rust//rust/platform:x86_64-apple-ios-macabi", "@rules_rust//rust/platform:x86_64-linux-android", "@rules_rust//rust/platform:x86_64-pc-windows-msvc", "@rules_rust//rust/platform:x86_64-unknown-freebsd", "@rules_rust//rust/platform:x86_64-unknown-fuchsia", "@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu", "@rules_rust//rust/platform:x86_64-unknown-none", "@rules_rust//rust/platform:x86_64-unknown-uefi"], + "cfg(any(target_os = \"dragonfly\", target_os = \"freebsd\", target_os = \"hurd\", target_os = \"illumos\", target_os = \"cygwin\", all(target_os = \"horizon\", target_arch = \"arm\")))": ["@rules_rust//rust/platform:i686-unknown-freebsd", "@rules_rust//rust/platform:x86_64-unknown-freebsd"], + "cfg(any(target_os = \"freebsd\", target_os = \"openbsd\", target_os = \"netbsd\", target_os = \"dragonflybsd\", target_os = \"ios\"))": ["@rules_rust//rust/platform:aarch64-apple-ios", "@rules_rust//rust/platform:aarch64-apple-ios-macabi", "@rules_rust//rust/platform:aarch64-apple-ios-sim", "@rules_rust//rust/platform:i686-unknown-freebsd", "@rules_rust//rust/platform:sparc64-unknown-netbsd", "@rules_rust//rust/platform:sparc64-unknown-openbsd", "@rules_rust//rust/platform:x86_64-apple-ios", "@rules_rust//rust/platform:x86_64-apple-ios-macabi", "@rules_rust//rust/platform:x86_64-unknown-freebsd"], + "cfg(any(target_os = \"haiku\", target_os = \"redox\", target_os = \"nto\", target_os = \"aix\"))": ["@rules_rust//rust/platform:aarch64-unknown-nto-qnx710"], + "cfg(any(target_os = \"ios\", target_os = \"visionos\", target_os = \"watchos\", target_os = \"tvos\"))": ["@rules_rust//rust/platform:aarch64-apple-ios", "@rules_rust//rust/platform:aarch64-apple-ios-macabi", "@rules_rust//rust/platform:aarch64-apple-ios-sim", "@rules_rust//rust/platform:x86_64-apple-ios", "@rules_rust//rust/platform:x86_64-apple-ios-macabi"], + "cfg(any(target_os = \"linux\", target_os = \"android\"))": ["@rules_rust//rust/platform:aarch64-linux-android", "@rules_rust//rust/platform:aarch64-unknown-linux-gnu", "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu", "@rules_rust//rust/platform:arm-unknown-linux-gnueabi", "@rules_rust//rust/platform:arm-unknown-linux-musleabi", "@rules_rust//rust/platform:armv7-linux-androideabi", "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi", "@rules_rust//rust/platform:i686-linux-android", "@rules_rust//rust/platform:i686-unknown-linux-gnu", "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu", "@rules_rust//rust/platform:mips-unknown-linux-gnu", "@rules_rust//rust/platform:powerpc-unknown-linux-gnu", "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu", "@rules_rust//rust/platform:s390x-unknown-linux-gnu", "@rules_rust//rust/platform:sparc64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-linux-android", "@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], + "cfg(any(target_os = \"macos\", target_os = \"ios\", target_os = \"freebsd\"))": ["@rules_rust//rust/platform:aarch64-apple-darwin", "@rules_rust//rust/platform:aarch64-apple-ios", "@rules_rust//rust/platform:aarch64-apple-ios-macabi", "@rules_rust//rust/platform:aarch64-apple-ios-sim", "@rules_rust//rust/platform:i686-apple-darwin", "@rules_rust//rust/platform:i686-unknown-freebsd", "@rules_rust//rust/platform:x86_64-apple-darwin", "@rules_rust//rust/platform:x86_64-apple-ios", "@rules_rust//rust/platform:x86_64-apple-ios-macabi", "@rules_rust//rust/platform:x86_64-unknown-freebsd"], + "cfg(any(target_os = \"macos\", target_os = \"openbsd\", target_os = \"vita\", target_os = \"emscripten\"))": ["@rules_rust//rust/platform:aarch64-apple-darwin", "@rules_rust//rust/platform:i686-apple-darwin", "@rules_rust//rust/platform:sparc64-unknown-openbsd", "@rules_rust//rust/platform:wasm32-unknown-emscripten", "@rules_rust//rust/platform:x86_64-apple-darwin"], + "cfg(any(target_pointer_width = \"8\", target_pointer_width = \"16\", target_pointer_width = \"32\"))": ["@rules_rust//rust/platform:arm-unknown-linux-gnueabi", "@rules_rust//rust/platform:arm-unknown-linux-musleabi", "@rules_rust//rust/platform:armv7-linux-androideabi", "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi", "@rules_rust//rust/platform:i686-apple-darwin", "@rules_rust//rust/platform:i686-linux-android", "@rules_rust//rust/platform:i686-pc-windows-msvc", "@rules_rust//rust/platform:i686-unknown-freebsd", "@rules_rust//rust/platform:i686-unknown-linux-gnu", "@rules_rust//rust/platform:mips-unknown-linux-gnu", "@rules_rust//rust/platform:powerpc-unknown-linux-gnu", "@rules_rust//rust/platform:riscv32imac-unknown-none-elf", "@rules_rust//rust/platform:riscv32imc-unknown-none-elf", "@rules_rust//rust/platform:thumbv6m-none-eabi", "@rules_rust//rust/platform:thumbv7em-none-eabi", "@rules_rust//rust/platform:thumbv7em-none-eabihf", "@rules_rust//rust/platform:thumbv7m-none-eabi", "@rules_rust//rust/platform:thumbv8m.main-none-eabi", "@rules_rust//rust/platform:thumbv8m.main-none-eabihf", "@rules_rust//rust/platform:wasm32-unknown-emscripten", "@rules_rust//rust/platform:wasm32-unknown-unknown", "@rules_rust//rust/platform:wasm32-wasip1", "@rules_rust//rust/platform:wasm32-wasip1-threads", "@rules_rust//rust/platform:wasm32-wasip2"], + "cfg(any(unix, target_os = \"hermit\", target_os = \"wasi\"))": ["@rules_rust//rust/platform:aarch64-apple-darwin", "@rules_rust//rust/platform:aarch64-apple-ios", "@rules_rust//rust/platform:aarch64-apple-ios-macabi", "@rules_rust//rust/platform:aarch64-apple-ios-sim", "@rules_rust//rust/platform:aarch64-linux-android", "@rules_rust//rust/platform:aarch64-unknown-fuchsia", "@rules_rust//rust/platform:aarch64-unknown-linux-gnu", "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu", "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710", "@rules_rust//rust/platform:arm-unknown-linux-gnueabi", "@rules_rust//rust/platform:arm-unknown-linux-musleabi", "@rules_rust//rust/platform:armv7-linux-androideabi", "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi", "@rules_rust//rust/platform:i686-apple-darwin", "@rules_rust//rust/platform:i686-linux-android", "@rules_rust//rust/platform:i686-unknown-freebsd", "@rules_rust//rust/platform:i686-unknown-linux-gnu", "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu", "@rules_rust//rust/platform:mips-unknown-linux-gnu", "@rules_rust//rust/platform:powerpc-unknown-linux-gnu", "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu", "@rules_rust//rust/platform:s390x-unknown-linux-gnu", "@rules_rust//rust/platform:sparc64-unknown-linux-gnu", "@rules_rust//rust/platform:sparc64-unknown-netbsd", "@rules_rust//rust/platform:sparc64-unknown-openbsd", "@rules_rust//rust/platform:wasm32-unknown-emscripten", "@rules_rust//rust/platform:wasm32-wasip1", "@rules_rust//rust/platform:wasm32-wasip1-threads", "@rules_rust//rust/platform:wasm32-wasip2", "@rules_rust//rust/platform:x86_64-apple-darwin", "@rules_rust//rust/platform:x86_64-apple-ios", "@rules_rust//rust/platform:x86_64-apple-ios-macabi", "@rules_rust//rust/platform:x86_64-linux-android", "@rules_rust//rust/platform:x86_64-unknown-freebsd", "@rules_rust//rust/platform:x86_64-unknown-fuchsia", "@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], + "cfg(not(target_has_atomic = \"ptr\"))": ["@rules_rust//rust/platform:riscv32imc-unknown-none-elf", "@rules_rust//rust/platform:thumbv6m-none-eabi"], + "cfg(not(windows))": ["@rules_rust//rust/platform:aarch64-apple-darwin", "@rules_rust//rust/platform:aarch64-apple-ios", "@rules_rust//rust/platform:aarch64-apple-ios-macabi", "@rules_rust//rust/platform:aarch64-apple-ios-sim", "@rules_rust//rust/platform:aarch64-linux-android", "@rules_rust//rust/platform:aarch64-unknown-fuchsia", "@rules_rust//rust/platform:aarch64-unknown-linux-gnu", "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu", "@rules_rust//rust/platform:aarch64-unknown-none", "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710", "@rules_rust//rust/platform:aarch64-unknown-uefi", "@rules_rust//rust/platform:arm-unknown-linux-gnueabi", "@rules_rust//rust/platform:arm-unknown-linux-musleabi", "@rules_rust//rust/platform:armv7-linux-androideabi", "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi", "@rules_rust//rust/platform:i686-apple-darwin", "@rules_rust//rust/platform:i686-linux-android", "@rules_rust//rust/platform:i686-unknown-freebsd", "@rules_rust//rust/platform:i686-unknown-linux-gnu", "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu", "@rules_rust//rust/platform:mips-unknown-linux-gnu", "@rules_rust//rust/platform:powerpc-unknown-linux-gnu", "@rules_rust//rust/platform:riscv32imac-unknown-none-elf", "@rules_rust//rust/platform:riscv32imc-unknown-none-elf", "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu", "@rules_rust//rust/platform:riscv64gc-unknown-none-elf", "@rules_rust//rust/platform:s390x-unknown-linux-gnu", "@rules_rust//rust/platform:sparc64-unknown-linux-gnu", "@rules_rust//rust/platform:sparc64-unknown-netbsd", "@rules_rust//rust/platform:sparc64-unknown-openbsd", "@rules_rust//rust/platform:thumbv6m-none-eabi", "@rules_rust//rust/platform:thumbv7em-none-eabi", "@rules_rust//rust/platform:thumbv7em-none-eabihf", "@rules_rust//rust/platform:thumbv7m-none-eabi", "@rules_rust//rust/platform:thumbv8m.main-none-eabi", "@rules_rust//rust/platform:thumbv8m.main-none-eabihf", "@rules_rust//rust/platform:wasm32-unknown-emscripten", "@rules_rust//rust/platform:wasm32-unknown-unknown", "@rules_rust//rust/platform:wasm32-wasip1", "@rules_rust//rust/platform:wasm32-wasip1-threads", "@rules_rust//rust/platform:wasm32-wasip2", "@rules_rust//rust/platform:x86_64-apple-darwin", "@rules_rust//rust/platform:x86_64-apple-ios", "@rules_rust//rust/platform:x86_64-apple-ios-macabi", "@rules_rust//rust/platform:x86_64-linux-android", "@rules_rust//rust/platform:x86_64-unknown-freebsd", "@rules_rust//rust/platform:x86_64-unknown-fuchsia", "@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu", "@rules_rust//rust/platform:x86_64-unknown-none", "@rules_rust//rust/platform:x86_64-unknown-uefi"], + "cfg(target_family = \"wasm\")": ["@rules_rust//rust/platform:wasm32-unknown-emscripten", "@rules_rust//rust/platform:wasm32-unknown-unknown", "@rules_rust//rust/platform:wasm32-wasip1", "@rules_rust//rust/platform:wasm32-wasip1-threads", "@rules_rust//rust/platform:wasm32-wasip2"], + "cfg(target_os = \"android\")": ["@rules_rust//rust/platform:aarch64-linux-android", "@rules_rust//rust/platform:armv7-linux-androideabi", "@rules_rust//rust/platform:i686-linux-android", "@rules_rust//rust/platform:x86_64-linux-android"], + "cfg(target_os = \"haiku\")": [], + "cfg(target_os = \"hermit\")": [], + "cfg(target_os = \"macos\")": ["@rules_rust//rust/platform:aarch64-apple-darwin", "@rules_rust//rust/platform:i686-apple-darwin", "@rules_rust//rust/platform:x86_64-apple-darwin"], + "cfg(target_os = \"netbsd\")": ["@rules_rust//rust/platform:sparc64-unknown-netbsd"], + "cfg(target_os = \"redox\")": [], + "cfg(target_os = \"solaris\")": [], + "cfg(target_os = \"vxworks\")": [], + "cfg(target_os = \"wasi\")": ["@rules_rust//rust/platform:wasm32-wasip1", "@rules_rust//rust/platform:wasm32-wasip1-threads", "@rules_rust//rust/platform:wasm32-wasip2"], + "cfg(target_os = \"windows\")": ["@rules_rust//rust/platform:aarch64-pc-windows-msvc", "@rules_rust//rust/platform:i686-pc-windows-msvc", "@rules_rust//rust/platform:x86_64-pc-windows-msvc"], + "cfg(target_vendor = \"apple\")": ["@rules_rust//rust/platform:aarch64-apple-darwin", "@rules_rust//rust/platform:aarch64-apple-ios", "@rules_rust//rust/platform:aarch64-apple-ios-macabi", "@rules_rust//rust/platform:aarch64-apple-ios-sim", "@rules_rust//rust/platform:i686-apple-darwin", "@rules_rust//rust/platform:x86_64-apple-darwin", "@rules_rust//rust/platform:x86_64-apple-ios", "@rules_rust//rust/platform:x86_64-apple-ios-macabi"], + "cfg(unix)": ["@rules_rust//rust/platform:aarch64-apple-darwin", "@rules_rust//rust/platform:aarch64-apple-ios", "@rules_rust//rust/platform:aarch64-apple-ios-macabi", "@rules_rust//rust/platform:aarch64-apple-ios-sim", "@rules_rust//rust/platform:aarch64-linux-android", "@rules_rust//rust/platform:aarch64-unknown-fuchsia", "@rules_rust//rust/platform:aarch64-unknown-linux-gnu", "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu", "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710", "@rules_rust//rust/platform:arm-unknown-linux-gnueabi", "@rules_rust//rust/platform:arm-unknown-linux-musleabi", "@rules_rust//rust/platform:armv7-linux-androideabi", "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi", "@rules_rust//rust/platform:i686-apple-darwin", "@rules_rust//rust/platform:i686-linux-android", "@rules_rust//rust/platform:i686-unknown-freebsd", "@rules_rust//rust/platform:i686-unknown-linux-gnu", "@rules_rust//rust/platform:loongarch64-unknown-linux-gnu", "@rules_rust//rust/platform:mips-unknown-linux-gnu", "@rules_rust//rust/platform:powerpc-unknown-linux-gnu", "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu", "@rules_rust//rust/platform:s390x-unknown-linux-gnu", "@rules_rust//rust/platform:sparc64-unknown-linux-gnu", "@rules_rust//rust/platform:sparc64-unknown-netbsd", "@rules_rust//rust/platform:sparc64-unknown-openbsd", "@rules_rust//rust/platform:wasm32-unknown-emscripten", "@rules_rust//rust/platform:x86_64-apple-darwin", "@rules_rust//rust/platform:x86_64-apple-ios", "@rules_rust//rust/platform:x86_64-apple-ios-macabi", "@rules_rust//rust/platform:x86_64-linux-android", "@rules_rust//rust/platform:x86_64-unknown-freebsd", "@rules_rust//rust/platform:x86_64-unknown-fuchsia", "@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], + "cfg(windows)": ["@rules_rust//rust/platform:aarch64-pc-windows-msvc", "@rules_rust//rust/platform:i686-pc-windows-msvc", "@rules_rust//rust/platform:x86_64-pc-windows-msvc"], + "cfg(windows_raw_dylib)": [], + "i686-apple-darwin": ["@rules_rust//rust/platform:i686-apple-darwin"], + "i686-linux-android": ["@rules_rust//rust/platform:i686-linux-android"], + "i686-pc-windows-gnullvm": [], + "i686-pc-windows-msvc": ["@rules_rust//rust/platform:i686-pc-windows-msvc"], + "i686-unknown-freebsd": ["@rules_rust//rust/platform:i686-unknown-freebsd"], + "i686-unknown-linux-gnu": ["@rules_rust//rust/platform:i686-unknown-linux-gnu"], + "loongarch64-unknown-linux-gnu": ["@rules_rust//rust/platform:loongarch64-unknown-linux-gnu"], + "mips-unknown-linux-gnu": ["@rules_rust//rust/platform:mips-unknown-linux-gnu"], + "powerpc-unknown-linux-gnu": ["@rules_rust//rust/platform:powerpc-unknown-linux-gnu"], + "riscv32imac-unknown-none-elf": ["@rules_rust//rust/platform:riscv32imac-unknown-none-elf"], + "riscv32imc-unknown-none-elf": ["@rules_rust//rust/platform:riscv32imc-unknown-none-elf"], + "riscv64gc-unknown-linux-gnu": ["@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu"], + "riscv64gc-unknown-none-elf": ["@rules_rust//rust/platform:riscv64gc-unknown-none-elf"], + "s390x-unknown-linux-gnu": ["@rules_rust//rust/platform:s390x-unknown-linux-gnu"], + "sparc64-unknown-linux-gnu": ["@rules_rust//rust/platform:sparc64-unknown-linux-gnu"], + "sparc64-unknown-netbsd": ["@rules_rust//rust/platform:sparc64-unknown-netbsd"], + "sparc64-unknown-openbsd": ["@rules_rust//rust/platform:sparc64-unknown-openbsd"], + "thumbv6m-none-eabi": ["@rules_rust//rust/platform:thumbv6m-none-eabi"], + "thumbv7em-none-eabi": ["@rules_rust//rust/platform:thumbv7em-none-eabi"], + "thumbv7em-none-eabihf": ["@rules_rust//rust/platform:thumbv7em-none-eabihf"], + "thumbv7m-none-eabi": ["@rules_rust//rust/platform:thumbv7m-none-eabi"], + "thumbv8m.main-none-eabi": ["@rules_rust//rust/platform:thumbv8m.main-none-eabi"], + "thumbv8m.main-none-eabihf": ["@rules_rust//rust/platform:thumbv8m.main-none-eabihf"], + "wasm32-unknown-emscripten": ["@rules_rust//rust/platform:wasm32-unknown-emscripten"], + "wasm32-unknown-unknown": ["@rules_rust//rust/platform:wasm32-unknown-unknown"], + "wasm32-wasip1": ["@rules_rust//rust/platform:wasm32-wasip1"], + "wasm32-wasip1-threads": ["@rules_rust//rust/platform:wasm32-wasip1-threads"], + "wasm32-wasip2": ["@rules_rust//rust/platform:wasm32-wasip2"], + "x86_64-apple-darwin": ["@rules_rust//rust/platform:x86_64-apple-darwin"], + "x86_64-apple-ios": ["@rules_rust//rust/platform:x86_64-apple-ios"], + "x86_64-apple-ios-macabi": ["@rules_rust//rust/platform:x86_64-apple-ios-macabi"], + "x86_64-linux-android": ["@rules_rust//rust/platform:x86_64-linux-android"], + "x86_64-pc-windows-gnullvm": [], + "x86_64-pc-windows-msvc": ["@rules_rust//rust/platform:x86_64-pc-windows-msvc"], + "x86_64-unknown-freebsd": ["@rules_rust//rust/platform:x86_64-unknown-freebsd"], + "x86_64-unknown-fuchsia": ["@rules_rust//rust/platform:x86_64-unknown-fuchsia"], + "x86_64-unknown-linux-gnu": ["@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], + "x86_64-unknown-nixos-gnu": ["@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], + "x86_64-unknown-none": ["@rules_rust//rust/platform:x86_64-unknown-none"], + "x86_64-unknown-uefi": ["@rules_rust//rust/platform:x86_64-unknown-uefi"], +} + +############################################################################### def crate_repositories(): - """Generates repositories for vendored crates. + """A macro for defining repositories for all generated crates. Returns: A list of repos visible to the module through the module extension. @@ -23,10 +877,3257 @@ def crate_repositories(): maybe( crates_vendor_remote_repository, name = "vendor_ts", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.bazel"), - defs_module = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:defs.bzl"), + # Lean interface: just point at `crates.bzl`; the repo rule + # derives the sibling `BUILD.bazel` and `defs.bzl`. + crates_module = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:crates.bzl"), + ) + maybe( + http_archive, + name = "vendor_ts__adler2-2.0.1", + sha256 = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa", + type = "tar.gz", + urls = ["https://static.crates.io/crates/adler2/2.0.1/download"], + strip_prefix = "adler2-2.0.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.adler2-2.0.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__aho-corasick-1.1.5", + sha256 = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba", + type = "tar.gz", + urls = ["https://static.crates.io/crates/aho-corasick/1.1.5/download"], + strip_prefix = "aho-corasick-1.1.5", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.aho-corasick-1.1.5.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__allocator-api2-0.2.21", + sha256 = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923", + type = "tar.gz", + urls = ["https://static.crates.io/crates/allocator-api2/0.2.21/download"], + strip_prefix = "allocator-api2-0.2.21", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.allocator-api2-0.2.21.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__android_system_properties-0.1.5", + sha256 = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311", + type = "tar.gz", + urls = ["https://static.crates.io/crates/android_system_properties/0.1.5/download"], + strip_prefix = "android_system_properties-0.1.5", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.android_system_properties-0.1.5.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__anstream-1.0.0", + sha256 = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d", + type = "tar.gz", + urls = ["https://static.crates.io/crates/anstream/1.0.0/download"], + strip_prefix = "anstream-1.0.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.anstream-1.0.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__anstyle-1.0.14", + sha256 = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000", + type = "tar.gz", + urls = ["https://static.crates.io/crates/anstyle/1.0.14/download"], + strip_prefix = "anstyle-1.0.14", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.anstyle-1.0.14.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__anstyle-parse-1.0.0", + sha256 = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e", + type = "tar.gz", + urls = ["https://static.crates.io/crates/anstyle-parse/1.0.0/download"], + strip_prefix = "anstyle-parse-1.0.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.anstyle-parse-1.0.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__anstyle-query-1.1.5", + sha256 = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc", + type = "tar.gz", + urls = ["https://static.crates.io/crates/anstyle-query/1.1.5/download"], + strip_prefix = "anstyle-query-1.1.5", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.anstyle-query-1.1.5.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__anstyle-wincon-3.0.11", + sha256 = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d", + type = "tar.gz", + urls = ["https://static.crates.io/crates/anstyle-wincon/3.0.11/download"], + strip_prefix = "anstyle-wincon-3.0.11", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.anstyle-wincon-3.0.11.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__anyhow-1.0.104", + sha256 = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470", + type = "tar.gz", + urls = ["https://static.crates.io/crates/anyhow/1.0.104/download"], + strip_prefix = "anyhow-1.0.104", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.anyhow-1.0.104.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__argfile-1.0.0", + sha256 = "99489a733dea0d2930bfa59c243146a8513ce7b0991b9d006647687cc61f53e7", + type = "tar.gz", + urls = ["https://static.crates.io/crates/argfile/1.0.0/download"], + strip_prefix = "argfile-1.0.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.argfile-1.0.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__arrayvec-0.7.8", + sha256 = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56", + type = "tar.gz", + urls = ["https://static.crates.io/crates/arrayvec/0.7.8/download"], + strip_prefix = "arrayvec-0.7.8", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.arrayvec-0.7.8.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__atomic-0.6.1", + sha256 = "a89cbf775b137e9b968e67227ef7f775587cde3fd31b0d8599dbd0f598a48340", + type = "tar.gz", + urls = ["https://static.crates.io/crates/atomic/0.6.1/download"], + strip_prefix = "atomic-0.6.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.atomic-0.6.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__autocfg-1.5.1", + sha256 = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53", + type = "tar.gz", + urls = ["https://static.crates.io/crates/autocfg/1.5.1/download"], + strip_prefix = "autocfg-1.5.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.autocfg-1.5.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__base64-0.22.1", + sha256 = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6", + type = "tar.gz", + urls = ["https://static.crates.io/crates/base64/0.22.1/download"], + strip_prefix = "base64-0.22.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.base64-0.22.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__bitflags-1.3.2", + sha256 = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a", + type = "tar.gz", + urls = ["https://static.crates.io/crates/bitflags/1.3.2/download"], + strip_prefix = "bitflags-1.3.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.bitflags-1.3.2.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__bitflags-2.13.1", + sha256 = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da", + type = "tar.gz", + urls = ["https://static.crates.io/crates/bitflags/2.13.1/download"], + strip_prefix = "bitflags-2.13.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.bitflags-2.13.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__borsh-1.8.0", + sha256 = "a88b7ea17d208c4193f2c1e6de3c35fe71f98c96982d5ced308bdcc749ff6e1f", + type = "tar.gz", + urls = ["https://static.crates.io/crates/borsh/1.8.0/download"], + strip_prefix = "borsh-1.8.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.borsh-1.8.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__boxcar-0.2.14", + sha256 = "36f64beae40a84da1b4b26ff2761a5b895c12adc41dc25aaee1c4f2bbfe97a6e", + type = "tar.gz", + urls = ["https://static.crates.io/crates/boxcar/0.2.14/download"], + strip_prefix = "boxcar-0.2.14", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.boxcar-0.2.14.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__bs58-0.5.1", + sha256 = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4", + type = "tar.gz", + urls = ["https://static.crates.io/crates/bs58/0.5.1/download"], + strip_prefix = "bs58-0.5.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.bs58-0.5.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__bstr-1.12.1", + sha256 = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab", + type = "tar.gz", + urls = ["https://static.crates.io/crates/bstr/1.12.1/download"], + strip_prefix = "bstr-1.12.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.bstr-1.12.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__bumpalo-3.20.3", + sha256 = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649", + type = "tar.gz", + urls = ["https://static.crates.io/crates/bumpalo/3.20.3/download"], + strip_prefix = "bumpalo-3.20.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.bumpalo-3.20.3.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__bytemuck-1.25.0", + sha256 = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec", + type = "tar.gz", + urls = ["https://static.crates.io/crates/bytemuck/1.25.0/download"], + strip_prefix = "bytemuck-1.25.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.bytemuck-1.25.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__bytes-1.12.1", + sha256 = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04", + type = "tar.gz", + urls = ["https://static.crates.io/crates/bytes/1.12.1/download"], + strip_prefix = "bytes-1.12.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.bytes-1.12.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__camino-1.2.5", + sha256 = "bb1307f12aa967b5a58416e87b3653360e0fd614a016b6e970db08fecbb1b80d", + type = "tar.gz", + urls = ["https://static.crates.io/crates/camino/1.2.5/download"], + strip_prefix = "camino-1.2.5", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.camino-1.2.5.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__cargo-platform-0.3.3", + sha256 = "dd0061da739915fae12ea00e16397555ed4371a6bb285431aab930f61b0aa4ba", + type = "tar.gz", + urls = ["https://static.crates.io/crates/cargo-platform/0.3.3/download"], + strip_prefix = "cargo-platform-0.3.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cargo-platform-0.3.3.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__cargo_metadata-0.23.1", + sha256 = "ef987d17b0a113becdd19d3d0022d04d7ef41f9efe4f3fb63ac44ba61df3ade9", + type = "tar.gz", + urls = ["https://static.crates.io/crates/cargo_metadata/0.23.1/download"], + strip_prefix = "cargo_metadata-0.23.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cargo_metadata-0.23.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__cc-1.4.2", + sha256 = "5d262e149917187838d5b42777c8253bcb64500067342904e7d429499a6f277e", + type = "tar.gz", + urls = ["https://static.crates.io/crates/cc/1.4.2/download"], + strip_prefix = "cc-1.4.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cc-1.4.2.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__cfg-if-1.0.4", + sha256 = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801", + type = "tar.gz", + urls = ["https://static.crates.io/crates/cfg-if/1.0.4/download"], + strip_prefix = "cfg-if-1.0.4", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cfg-if-1.0.4.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__cfg_aliases-0.2.2", + sha256 = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527", + type = "tar.gz", + urls = ["https://static.crates.io/crates/cfg_aliases/0.2.2/download"], + strip_prefix = "cfg_aliases-0.2.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cfg_aliases-0.2.2.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__chacha20-0.10.1", + sha256 = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81", + type = "tar.gz", + urls = ["https://static.crates.io/crates/chacha20/0.10.1/download"], + strip_prefix = "chacha20-0.10.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.chacha20-0.10.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__chalk-derive-0.104.0", + sha256 = "9ea9b1e80910f66ae87c772247591432032ef3f6a67367ff17f8343db05beafa", + type = "tar.gz", + urls = ["https://static.crates.io/crates/chalk-derive/0.104.0/download"], + strip_prefix = "chalk-derive-0.104.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.chalk-derive-0.104.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__chalk-ir-0.104.0", + sha256 = "7047a516de16226cd17344d41a319d0ea1064bf9e60bd612ab341ab4a34bbfa8", + type = "tar.gz", + urls = ["https://static.crates.io/crates/chalk-ir/0.104.0/download"], + strip_prefix = "chalk-ir-0.104.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.chalk-ir-0.104.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__chrono-0.4.45", + sha256 = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327", + type = "tar.gz", + urls = ["https://static.crates.io/crates/chrono/0.4.45/download"], + strip_prefix = "chrono-0.4.45", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.chrono-0.4.45.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__clap-4.6.6", + sha256 = "473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca", + type = "tar.gz", + urls = ["https://static.crates.io/crates/clap/4.6.6/download"], + strip_prefix = "clap-4.6.6", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.clap-4.6.6.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__clap_builder-4.6.6", + sha256 = "7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889", + type = "tar.gz", + urls = ["https://static.crates.io/crates/clap_builder/4.6.6/download"], + strip_prefix = "clap_builder-4.6.6", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.clap_builder-4.6.6.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__clap_derive-4.6.4", + sha256 = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061", + type = "tar.gz", + urls = ["https://static.crates.io/crates/clap_derive/4.6.4/download"], + strip_prefix = "clap_derive-4.6.4", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.clap_derive-4.6.4.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__clap_lex-1.1.0", + sha256 = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9", + type = "tar.gz", + urls = ["https://static.crates.io/crates/clap_lex/1.1.0/download"], + strip_prefix = "clap_lex-1.1.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.clap_lex-1.1.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__cobs-0.3.0", + sha256 = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1", + type = "tar.gz", + urls = ["https://static.crates.io/crates/cobs/0.3.0/download"], + strip_prefix = "cobs-0.3.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cobs-0.3.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__colorchoice-1.0.5", + sha256 = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570", + type = "tar.gz", + urls = ["https://static.crates.io/crates/colorchoice/1.0.5/download"], + strip_prefix = "colorchoice-1.0.5", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.colorchoice-1.0.5.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__core-foundation-sys-0.8.7", + sha256 = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b", + type = "tar.gz", + urls = ["https://static.crates.io/crates/core-foundation-sys/0.8.7/download"], + strip_prefix = "core-foundation-sys-0.8.7", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.core-foundation-sys-0.8.7.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__countme-3.0.1", + sha256 = "7704b5fdd17b18ae31c4c1da5a2e0305a2bf17b5249300a9ee9ed7b72114c636", + type = "tar.gz", + urls = ["https://static.crates.io/crates/countme/3.0.1/download"], + strip_prefix = "countme-3.0.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.countme-3.0.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__cov-mark-2.2.0", + sha256 = "90863d8442510cddf7f46618c4f92413774635771a3e80830c8b30d183420b14", + type = "tar.gz", + urls = ["https://static.crates.io/crates/cov-mark/2.2.0/download"], + strip_prefix = "cov-mark-2.2.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cov-mark-2.2.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__cpufeatures-0.3.0", + sha256 = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201", + type = "tar.gz", + urls = ["https://static.crates.io/crates/cpufeatures/0.3.0/download"], + strip_prefix = "cpufeatures-0.3.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cpufeatures-0.3.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__crc32fast-1.5.0", + sha256 = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511", + type = "tar.gz", + urls = ["https://static.crates.io/crates/crc32fast/1.5.0/download"], + strip_prefix = "crc32fast-1.5.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.crc32fast-1.5.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__crossbeam-channel-0.5.16", + sha256 = "d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e", + type = "tar.gz", + urls = ["https://static.crates.io/crates/crossbeam-channel/0.5.16/download"], + strip_prefix = "crossbeam-channel-0.5.16", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.crossbeam-channel-0.5.16.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__crossbeam-deque-0.8.7", + sha256 = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb", + type = "tar.gz", + urls = ["https://static.crates.io/crates/crossbeam-deque/0.8.7/download"], + strip_prefix = "crossbeam-deque-0.8.7", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.crossbeam-deque-0.8.7.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__crossbeam-epoch-0.9.20", + sha256 = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f", + type = "tar.gz", + urls = ["https://static.crates.io/crates/crossbeam-epoch/0.9.20/download"], + strip_prefix = "crossbeam-epoch-0.9.20", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.crossbeam-epoch-0.9.20.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__crossbeam-queue-0.3.12", + sha256 = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115", + type = "tar.gz", + urls = ["https://static.crates.io/crates/crossbeam-queue/0.3.12/download"], + strip_prefix = "crossbeam-queue-0.3.12", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.crossbeam-queue-0.3.12.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__crossbeam-utils-0.8.22", + sha256 = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17", + type = "tar.gz", + urls = ["https://static.crates.io/crates/crossbeam-utils/0.8.22/download"], + strip_prefix = "crossbeam-utils-0.8.22", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.crossbeam-utils-0.8.22.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__darling-0.23.0", + sha256 = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d", + type = "tar.gz", + urls = ["https://static.crates.io/crates/darling/0.23.0/download"], + strip_prefix = "darling-0.23.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.darling-0.23.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__darling_core-0.23.0", + sha256 = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0", + type = "tar.gz", + urls = ["https://static.crates.io/crates/darling_core/0.23.0/download"], + strip_prefix = "darling_core-0.23.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.darling_core-0.23.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__darling_macro-0.23.0", + sha256 = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d", + type = "tar.gz", + urls = ["https://static.crates.io/crates/darling_macro/0.23.0/download"], + strip_prefix = "darling_macro-0.23.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.darling_macro-0.23.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__dashmap-6.2.1", + sha256 = "e6361d5c062261c78a176addb82d4c821ae42bed6089de0e12603cd25de2059c", + type = "tar.gz", + urls = ["https://static.crates.io/crates/dashmap/6.2.1/download"], + strip_prefix = "dashmap-6.2.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.dashmap-6.2.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__defmt-1.1.1", + sha256 = "e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1", + type = "tar.gz", + urls = ["https://static.crates.io/crates/defmt/1.1.1/download"], + strip_prefix = "defmt-1.1.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.defmt-1.1.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__defmt-macros-1.1.1", + sha256 = "bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8", + type = "tar.gz", + urls = ["https://static.crates.io/crates/defmt-macros/1.1.1/download"], + strip_prefix = "defmt-macros-1.1.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.defmt-macros-1.1.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__defmt-parser-1.0.0", + sha256 = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e", + type = "tar.gz", + urls = ["https://static.crates.io/crates/defmt-parser/1.0.0/download"], + strip_prefix = "defmt-parser-1.0.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.defmt-parser-1.0.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__deranged-0.5.8", + sha256 = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c", + type = "tar.gz", + urls = ["https://static.crates.io/crates/deranged/0.5.8/download"], + strip_prefix = "deranged-0.5.8", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.deranged-0.5.8.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__derive-where-1.6.1", + sha256 = "d08b3a0bcc0d079199cd476b2cae8435016ec11d1c0986c6901c5ac223041534", + type = "tar.gz", + urls = ["https://static.crates.io/crates/derive-where/1.6.1/download"], + strip_prefix = "derive-where-1.6.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.derive-where-1.6.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__dissimilar-1.0.11", + sha256 = "aeda16ab4059c5fd2a83f2b9c9e9c981327b18aa8e3b313f7e6563799d4f093e", + type = "tar.gz", + urls = ["https://static.crates.io/crates/dissimilar/1.0.11/download"], + strip_prefix = "dissimilar-1.0.11", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.dissimilar-1.0.11.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__drop_bomb-0.1.5", + sha256 = "9bda8e21c04aca2ae33ffc2fd8c23134f3cac46db123ba97bd9d3f3b8a4a85e1", + type = "tar.gz", + urls = ["https://static.crates.io/crates/drop_bomb/0.1.5/download"], + strip_prefix = "drop_bomb-0.1.5", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.drop_bomb-0.1.5.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__dunce-1.0.5", + sha256 = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813", + type = "tar.gz", + urls = ["https://static.crates.io/crates/dunce/1.0.5/download"], + strip_prefix = "dunce-1.0.5", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.dunce-1.0.5.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__dyn-clone-1.0.20", + sha256 = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555", + type = "tar.gz", + urls = ["https://static.crates.io/crates/dyn-clone/1.0.20/download"], + strip_prefix = "dyn-clone-1.0.20", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.dyn-clone-1.0.20.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__either-1.17.0", + sha256 = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d", + type = "tar.gz", + urls = ["https://static.crates.io/crates/either/1.17.0/download"], + strip_prefix = "either-1.17.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.either-1.17.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__embedded-io-0.4.0", + sha256 = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced", + type = "tar.gz", + urls = ["https://static.crates.io/crates/embedded-io/0.4.0/download"], + strip_prefix = "embedded-io-0.4.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.embedded-io-0.4.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__embedded-io-0.6.1", + sha256 = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d", + type = "tar.gz", + urls = ["https://static.crates.io/crates/embedded-io/0.6.1/download"], + strip_prefix = "embedded-io-0.6.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.embedded-io-0.6.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ena-0.14.4", + sha256 = "eabffdaee24bd1bf95c5ef7cec31260444317e72ea56c4c91750e8b7ee58d5f1", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ena/0.14.4/download"], + strip_prefix = "ena-0.14.4", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ena-0.14.4.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__encoding-0.2.33", + sha256 = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec", + type = "tar.gz", + urls = ["https://static.crates.io/crates/encoding/0.2.33/download"], + strip_prefix = "encoding-0.2.33", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.encoding-0.2.33.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__encoding-index-japanese-1.20141219.5", + sha256 = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91", + type = "tar.gz", + urls = ["https://static.crates.io/crates/encoding-index-japanese/1.20141219.5/download"], + strip_prefix = "encoding-index-japanese-1.20141219.5", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.encoding-index-japanese-1.20141219.5.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__encoding-index-korean-1.20141219.5", + sha256 = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81", + type = "tar.gz", + urls = ["https://static.crates.io/crates/encoding-index-korean/1.20141219.5/download"], + strip_prefix = "encoding-index-korean-1.20141219.5", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.encoding-index-korean-1.20141219.5.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__encoding-index-simpchinese-1.20141219.5", + sha256 = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7", + type = "tar.gz", + urls = ["https://static.crates.io/crates/encoding-index-simpchinese/1.20141219.5/download"], + strip_prefix = "encoding-index-simpchinese-1.20141219.5", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.encoding-index-simpchinese-1.20141219.5.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__encoding-index-singlebyte-1.20141219.5", + sha256 = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a", + type = "tar.gz", + urls = ["https://static.crates.io/crates/encoding-index-singlebyte/1.20141219.5/download"], + strip_prefix = "encoding-index-singlebyte-1.20141219.5", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.encoding-index-singlebyte-1.20141219.5.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__encoding-index-tradchinese-1.20141219.5", + sha256 = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18", + type = "tar.gz", + urls = ["https://static.crates.io/crates/encoding-index-tradchinese/1.20141219.5/download"], + strip_prefix = "encoding-index-tradchinese-1.20141219.5", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.encoding-index-tradchinese-1.20141219.5.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__encoding_index_tests-0.1.4", + sha256 = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569", + type = "tar.gz", + urls = ["https://static.crates.io/crates/encoding_index_tests/0.1.4/download"], + strip_prefix = "encoding_index_tests-0.1.4", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.encoding_index_tests-0.1.4.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__equivalent-1.0.2", + sha256 = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f", + type = "tar.gz", + urls = ["https://static.crates.io/crates/equivalent/1.0.2/download"], + strip_prefix = "equivalent-1.0.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.equivalent-1.0.2.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__figment-0.10.19", + sha256 = "8cb01cd46b0cf372153850f4c6c272d9cbea2da513e07538405148f95bd789f3", + type = "tar.gz", + urls = ["https://static.crates.io/crates/figment/0.10.19/download"], + strip_prefix = "figment-0.10.19", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.figment-0.10.19.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__find-msvc-tools-0.1.10", + sha256 = "26b73573e6edcd2af0cdf47bd6cb58f0b3839491263c314eaad1ccf24430e1de", + type = "tar.gz", + urls = ["https://static.crates.io/crates/find-msvc-tools/0.1.10/download"], + strip_prefix = "find-msvc-tools-0.1.10", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.find-msvc-tools-0.1.10.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__fixedbitset-0.5.7", + sha256 = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99", + type = "tar.gz", + urls = ["https://static.crates.io/crates/fixedbitset/0.5.7/download"], + strip_prefix = "fixedbitset-0.5.7", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.fixedbitset-0.5.7.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__flate2-1.1.9", + sha256 = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c", + type = "tar.gz", + urls = ["https://static.crates.io/crates/flate2/1.1.9/download"], + strip_prefix = "flate2-1.1.9", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.flate2-1.1.9.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__foldhash-0.1.5", + sha256 = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2", + type = "tar.gz", + urls = ["https://static.crates.io/crates/foldhash/0.1.5/download"], + strip_prefix = "foldhash-0.1.5", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.foldhash-0.1.5.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__foldhash-0.2.0", + sha256 = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb", + type = "tar.gz", + urls = ["https://static.crates.io/crates/foldhash/0.2.0/download"], + strip_prefix = "foldhash-0.2.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.foldhash-0.2.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__fs-err-3.3.0", + sha256 = "73fde052dbfc920003cfd2c8e2c6e6d4cc7c1091538c3a24226cec0665ab08c0", + type = "tar.gz", + urls = ["https://static.crates.io/crates/fs-err/3.3.0/download"], + strip_prefix = "fs-err-3.3.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.fs-err-3.3.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__fsevent-sys-4.1.0", + sha256 = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2", + type = "tar.gz", + urls = ["https://static.crates.io/crates/fsevent-sys/4.1.0/download"], + strip_prefix = "fsevent-sys-4.1.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.fsevent-sys-4.1.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__fst-0.4.7", + sha256 = "7ab85b9b05e3978cc9a9cf8fea7f01b494e1a09ed3037e16ba39edc7a29eb61a", + type = "tar.gz", + urls = ["https://static.crates.io/crates/fst/0.4.7/download"], + strip_prefix = "fst-0.4.7", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.fst-0.4.7.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__futures-core-0.3.34", + sha256 = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e", + type = "tar.gz", + urls = ["https://static.crates.io/crates/futures-core/0.3.34/download"], + strip_prefix = "futures-core-0.3.34", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.futures-core-0.3.34.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__futures-task-0.3.34", + sha256 = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd", + type = "tar.gz", + urls = ["https://static.crates.io/crates/futures-task/0.3.34/download"], + strip_prefix = "futures-task-0.3.34", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.futures-task-0.3.34.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__futures-util-0.3.34", + sha256 = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc", + type = "tar.gz", + urls = ["https://static.crates.io/crates/futures-util/0.3.34/download"], + strip_prefix = "futures-util-0.3.34", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.futures-util-0.3.34.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__getrandom-0.4.3", + sha256 = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099", + type = "tar.gz", + urls = ["https://static.crates.io/crates/getrandom/0.4.3/download"], + strip_prefix = "getrandom-0.4.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.getrandom-0.4.3.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__glob-0.3.4", + sha256 = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b", + type = "tar.gz", + urls = ["https://static.crates.io/crates/glob/0.3.4/download"], + strip_prefix = "glob-0.3.4", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.glob-0.3.4.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__globset-0.4.18", + sha256 = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3", + type = "tar.gz", + urls = ["https://static.crates.io/crates/globset/0.4.18/download"], + strip_prefix = "globset-0.4.18", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.globset-0.4.18.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__hashbrown-0.12.3", + sha256 = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888", + type = "tar.gz", + urls = ["https://static.crates.io/crates/hashbrown/0.12.3/download"], + strip_prefix = "hashbrown-0.12.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.hashbrown-0.12.3.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__hashbrown-0.14.5", + sha256 = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1", + type = "tar.gz", + urls = ["https://static.crates.io/crates/hashbrown/0.14.5/download"], + strip_prefix = "hashbrown-0.14.5", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.hashbrown-0.14.5.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__hashbrown-0.15.5", + sha256 = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1", + type = "tar.gz", + urls = ["https://static.crates.io/crates/hashbrown/0.15.5/download"], + strip_prefix = "hashbrown-0.15.5", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.hashbrown-0.15.5.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__hashbrown-0.17.1", + sha256 = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a", + type = "tar.gz", + urls = ["https://static.crates.io/crates/hashbrown/0.17.1/download"], + strip_prefix = "hashbrown-0.17.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.hashbrown-0.17.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__hashlink-0.12.1", + sha256 = "32069d97bb81e38fa67eab65e3393bf804bb85969f2bc06bf13f64aef5aba248", + type = "tar.gz", + urls = ["https://static.crates.io/crates/hashlink/0.12.1/download"], + strip_prefix = "hashlink-0.12.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.hashlink-0.12.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__heck-0.5.0", + sha256 = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea", + type = "tar.gz", + urls = ["https://static.crates.io/crates/heck/0.5.0/download"], + strip_prefix = "heck-0.5.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.heck-0.5.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__hermit-abi-0.5.2", + sha256 = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c", + type = "tar.gz", + urls = ["https://static.crates.io/crates/hermit-abi/0.5.2/download"], + strip_prefix = "hermit-abi-0.5.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.hermit-abi-0.5.2.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__hex-0.4.3", + sha256 = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70", + type = "tar.gz", + urls = ["https://static.crates.io/crates/hex/0.4.3/download"], + strip_prefix = "hex-0.4.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.hex-0.4.3.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__iana-time-zone-0.1.65", + sha256 = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470", + type = "tar.gz", + urls = ["https://static.crates.io/crates/iana-time-zone/0.1.65/download"], + strip_prefix = "iana-time-zone-0.1.65", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.iana-time-zone-0.1.65.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__iana-time-zone-haiku-0.1.2", + sha256 = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f", + type = "tar.gz", + urls = ["https://static.crates.io/crates/iana-time-zone-haiku/0.1.2/download"], + strip_prefix = "iana-time-zone-haiku-0.1.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.iana-time-zone-haiku-0.1.2.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ident_case-1.0.1", + sha256 = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ident_case/1.0.1/download"], + strip_prefix = "ident_case-1.0.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ident_case-1.0.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__indexmap-1.9.3", + sha256 = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99", + type = "tar.gz", + urls = ["https://static.crates.io/crates/indexmap/1.9.3/download"], + strip_prefix = "indexmap-1.9.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.indexmap-1.9.3.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__indexmap-2.14.0", + sha256 = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9", + type = "tar.gz", + urls = ["https://static.crates.io/crates/indexmap/2.14.0/download"], + strip_prefix = "indexmap-2.14.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.indexmap-2.14.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__inlinable_string-0.1.15", + sha256 = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb", + type = "tar.gz", + urls = ["https://static.crates.io/crates/inlinable_string/0.1.15/download"], + strip_prefix = "inlinable_string-0.1.15", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.inlinable_string-0.1.15.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__inotify-0.11.1", + sha256 = "bd5b3eaf1a28b758ac0faa5a4254e8ab2705605496f1b1f3fbbc3988ad73d199", + type = "tar.gz", + urls = ["https://static.crates.io/crates/inotify/0.11.1/download"], + strip_prefix = "inotify-0.11.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.inotify-0.11.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__inotify-sys-0.1.8", + sha256 = "c033f80b2c113cdf91ab7a33faa9cbc014726dcad99880c8609af2a370edf37d", + type = "tar.gz", + urls = ["https://static.crates.io/crates/inotify-sys/0.1.8/download"], + strip_prefix = "inotify-sys-0.1.8", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.inotify-sys-0.1.8.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__intrusive-collections-0.10.3", + sha256 = "4275b20e6057cd7733fd8df8a5a31701e4fe44497dad0f3fa0e1c4fb971506be", + type = "tar.gz", + urls = ["https://static.crates.io/crates/intrusive-collections/0.10.3/download"], + strip_prefix = "intrusive-collections-0.10.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.intrusive-collections-0.10.3.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__inventory-0.3.24", + sha256 = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b", + type = "tar.gz", + urls = ["https://static.crates.io/crates/inventory/0.3.24/download"], + strip_prefix = "inventory-0.3.24", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.inventory-0.3.24.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__is_terminal_polyfill-1.70.2", + sha256 = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695", + type = "tar.gz", + urls = ["https://static.crates.io/crates/is_terminal_polyfill/1.70.2/download"], + strip_prefix = "is_terminal_polyfill-1.70.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.is_terminal_polyfill-1.70.2.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__itertools-0.15.0", + sha256 = "8b4baf93f58d4425749ca49a51c50ebab072c5df6994d08fed93541c331481dc", + type = "tar.gz", + urls = ["https://static.crates.io/crates/itertools/0.15.0/download"], + strip_prefix = "itertools-0.15.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.itertools-0.15.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__itoa-1.0.18", + sha256 = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682", + type = "tar.gz", + urls = ["https://static.crates.io/crates/itoa/1.0.18/download"], + strip_prefix = "itoa-1.0.18", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.itoa-1.0.18.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__jiff-0.2.35", + sha256 = "668b7183bd07af9a4885f5c35b0cc5c83c4607a913c16b7e17291832910d2dcc", + type = "tar.gz", + urls = ["https://static.crates.io/crates/jiff/0.2.35/download"], + strip_prefix = "jiff-0.2.35", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.jiff-0.2.35.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__jiff-core-0.1.0", + sha256 = "7feca88439efe53da3754500c1851dedf3cb36c524dd5cf8225cc0794de95d09", + type = "tar.gz", + urls = ["https://static.crates.io/crates/jiff-core/0.1.0/download"], + strip_prefix = "jiff-core-0.1.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.jiff-core-0.1.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__jiff-static-0.2.35", + sha256 = "3a69dcb3a21cfb32ce1cd056169337ca284af0766dd766e7878819b251a49204", + type = "tar.gz", + urls = ["https://static.crates.io/crates/jiff-static/0.2.35/download"], + strip_prefix = "jiff-static-0.2.35", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.jiff-static-0.2.35.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__jiff-tzdb-0.1.8", + sha256 = "142bd39932ad231f10513df9ab62661fead8719872150b7ad02a2df79f4e141e", + type = "tar.gz", + urls = ["https://static.crates.io/crates/jiff-tzdb/0.1.8/download"], + strip_prefix = "jiff-tzdb-0.1.8", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.jiff-tzdb-0.1.8.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__jiff-tzdb-platform-0.1.3", + sha256 = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8", + type = "tar.gz", + urls = ["https://static.crates.io/crates/jiff-tzdb-platform/0.1.3/download"], + strip_prefix = "jiff-tzdb-platform-0.1.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.jiff-tzdb-platform-0.1.3.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__jobserver-0.1.35", + sha256 = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3", + type = "tar.gz", + urls = ["https://static.crates.io/crates/jobserver/0.1.35/download"], + strip_prefix = "jobserver-0.1.35", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.jobserver-0.1.35.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__jod-thread-1.0.0", + sha256 = "a037eddb7d28de1d0fc42411f501b53b75838d313908078d6698d064f3029b24", + type = "tar.gz", + urls = ["https://static.crates.io/crates/jod-thread/1.0.0/download"], + strip_prefix = "jod-thread-1.0.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.jod-thread-1.0.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__js-sys-0.3.103", + sha256 = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102", + type = "tar.gz", + urls = ["https://static.crates.io/crates/js-sys/0.3.103/download"], + strip_prefix = "js-sys-0.3.103", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.js-sys-0.3.103.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__kqueue-1.2.0", + sha256 = "273c0752728918e0ac4976f2b275b6fefb9ecd400585dec929419f3844cd87b5", + type = "tar.gz", + urls = ["https://static.crates.io/crates/kqueue/1.2.0/download"], + strip_prefix = "kqueue-1.2.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.kqueue-1.2.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__kqueue-sys-1.1.2", + sha256 = "07293a4e297ac234359b510362495713f75ea345d5307140414f20c69ffeb087", + type = "tar.gz", + urls = ["https://static.crates.io/crates/kqueue-sys/1.1.2/download"], + strip_prefix = "kqueue-sys-1.1.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.kqueue-sys-1.1.2.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__la-arena-0.3.1", + sha256 = "3752f229dcc5a481d60f385fa479ff46818033d881d2d801aa27dffcfb5e8306", + type = "tar.gz", + urls = ["https://static.crates.io/crates/la-arena/0.3.1/download"], + strip_prefix = "la-arena-0.3.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.la-arena-0.3.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__lazy_static-1.5.0", + sha256 = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe", + type = "tar.gz", + urls = ["https://static.crates.io/crates/lazy_static/1.5.0/download"], + strip_prefix = "lazy_static-1.5.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.lazy_static-1.5.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__libc-0.2.189", + sha256 = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2", + type = "tar.gz", + urls = ["https://static.crates.io/crates/libc/0.2.189/download"], + strip_prefix = "libc-0.2.189", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.libc-0.2.189.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__line-index-0.1.2", + sha256 = "3e27e0ed5a392a7f5ba0b3808a2afccff16c64933312c84b57618b49d1209bd2", + type = "tar.gz", + urls = ["https://static.crates.io/crates/line-index/0.1.2/download"], + strip_prefix = "line-index-0.1.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.line-index-0.1.2.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__lock_api-0.4.14", + sha256 = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965", + type = "tar.gz", + urls = ["https://static.crates.io/crates/lock_api/0.4.14/download"], + strip_prefix = "lock_api-0.4.14", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.lock_api-0.4.14.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__log-0.3.9", + sha256 = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b", + type = "tar.gz", + urls = ["https://static.crates.io/crates/log/0.3.9/download"], + strip_prefix = "log-0.3.9", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.log-0.3.9.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__log-0.4.33", + sha256 = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad", + type = "tar.gz", + urls = ["https://static.crates.io/crates/log/0.4.33/download"], + strip_prefix = "log-0.4.33", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.log-0.4.33.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__matchers-0.2.0", + sha256 = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9", + type = "tar.gz", + urls = ["https://static.crates.io/crates/matchers/0.2.0/download"], + strip_prefix = "matchers-0.2.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.matchers-0.2.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__memchr-2.8.3", + sha256 = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98", + type = "tar.gz", + urls = ["https://static.crates.io/crates/memchr/2.8.3/download"], + strip_prefix = "memchr-2.8.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.memchr-2.8.3.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__memoffset-0.9.1", + sha256 = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a", + type = "tar.gz", + urls = ["https://static.crates.io/crates/memoffset/0.9.1/download"], + strip_prefix = "memoffset-0.9.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.memoffset-0.9.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__miniz_oxide-0.8.9", + sha256 = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316", + type = "tar.gz", + urls = ["https://static.crates.io/crates/miniz_oxide/0.8.9/download"], + strip_prefix = "miniz_oxide-0.8.9", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.miniz_oxide-0.8.9.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__mio-1.2.2", + sha256 = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427", + type = "tar.gz", + urls = ["https://static.crates.io/crates/mio/1.2.2/download"], + strip_prefix = "mio-1.2.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.mio-1.2.2.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__miow-0.6.1", + sha256 = "536bfad37a309d62069485248eeaba1e8d9853aaf951caaeaed0585a95346f08", + type = "tar.gz", + urls = ["https://static.crates.io/crates/miow/0.6.1/download"], + strip_prefix = "miow-0.6.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.miow-0.6.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__mustache-0.9.0", + sha256 = "51956ef1c5d20a1384524d91e616fb44dfc7d8f249bf696d49c97dd3289ecab5", + type = "tar.gz", + urls = ["https://static.crates.io/crates/mustache/0.9.0/download"], + strip_prefix = "mustache-0.9.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.mustache-0.9.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__nohash-hasher-0.2.0", + sha256 = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451", + type = "tar.gz", + urls = ["https://static.crates.io/crates/nohash-hasher/0.2.0/download"], + strip_prefix = "nohash-hasher-0.2.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.nohash-hasher-0.2.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__notify-8.2.0", + sha256 = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3", + type = "tar.gz", + urls = ["https://static.crates.io/crates/notify/8.2.0/download"], + strip_prefix = "notify-8.2.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.notify-8.2.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__notify-types-2.1.0", + sha256 = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a", + type = "tar.gz", + urls = ["https://static.crates.io/crates/notify-types/2.1.0/download"], + strip_prefix = "notify-types-2.1.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.notify-types-2.1.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__nu-ansi-term-0.50.3", + sha256 = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5", + type = "tar.gz", + urls = ["https://static.crates.io/crates/nu-ansi-term/0.50.3/download"], + strip_prefix = "nu-ansi-term-0.50.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.nu-ansi-term-0.50.3.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__num-conv-0.2.2", + sha256 = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441", + type = "tar.gz", + urls = ["https://static.crates.io/crates/num-conv/0.2.2/download"], + strip_prefix = "num-conv-0.2.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.num-conv-0.2.2.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__num-traits-0.2.19", + sha256 = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841", + type = "tar.gz", + urls = ["https://static.crates.io/crates/num-traits/0.2.19/download"], + strip_prefix = "num-traits-0.2.19", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.num-traits-0.2.19.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__num_cpus-1.17.0", + sha256 = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b", + type = "tar.gz", + urls = ["https://static.crates.io/crates/num_cpus/1.17.0/download"], + strip_prefix = "num_cpus-1.17.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.num_cpus-1.17.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__num_threads-0.1.7", + sha256 = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9", + type = "tar.gz", + urls = ["https://static.crates.io/crates/num_threads/0.1.7/download"], + strip_prefix = "num_threads-0.1.7", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.num_threads-0.1.7.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__once_cell-1.21.4", + sha256 = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50", + type = "tar.gz", + urls = ["https://static.crates.io/crates/once_cell/1.21.4/download"], + strip_prefix = "once_cell-1.21.4", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.once_cell-1.21.4.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__once_cell_polyfill-1.70.2", + sha256 = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe", + type = "tar.gz", + urls = ["https://static.crates.io/crates/once_cell_polyfill/1.70.2/download"], + strip_prefix = "once_cell_polyfill-1.70.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.once_cell_polyfill-1.70.2.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__oorandom-11.1.5", + sha256 = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e", + type = "tar.gz", + urls = ["https://static.crates.io/crates/oorandom/11.1.5/download"], + strip_prefix = "oorandom-11.1.5", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.oorandom-11.1.5.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__os_str_bytes-7.2.0", + sha256 = "89284d0c2af7b0eb5e814798aa07265413c8fd72009f7fc82ea25a81fb287ce9", + type = "tar.gz", + urls = ["https://static.crates.io/crates/os_str_bytes/7.2.0/download"], + strip_prefix = "os_str_bytes-7.2.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.os_str_bytes-7.2.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__parking_lot-0.12.5", + sha256 = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a", + type = "tar.gz", + urls = ["https://static.crates.io/crates/parking_lot/0.12.5/download"], + strip_prefix = "parking_lot-0.12.5", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.parking_lot-0.12.5.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__parking_lot_core-0.9.12", + sha256 = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1", + type = "tar.gz", + urls = ["https://static.crates.io/crates/parking_lot_core/0.9.12/download"], + strip_prefix = "parking_lot_core-0.9.12", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.parking_lot_core-0.9.12.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__pear-0.2.9", + sha256 = "bdeeaa00ce488657faba8ebf44ab9361f9365a97bd39ffb8a60663f57ff4b467", + type = "tar.gz", + urls = ["https://static.crates.io/crates/pear/0.2.9/download"], + strip_prefix = "pear-0.2.9", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.pear-0.2.9.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__pear_codegen-0.2.9", + sha256 = "4bab5b985dc082b345f812b7df84e1bef27e7207b39e448439ba8bd69c93f147", + type = "tar.gz", + urls = ["https://static.crates.io/crates/pear_codegen/0.2.9/download"], + strip_prefix = "pear_codegen-0.2.9", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.pear_codegen-0.2.9.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__perf-event-0.4.8", + sha256 = "b4d6393d9238342159080d79b78cb59c67399a8e7ecfa5d410bd614169e4e823", + type = "tar.gz", + urls = ["https://static.crates.io/crates/perf-event/0.4.8/download"], + strip_prefix = "perf-event-0.4.8", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.perf-event-0.4.8.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__perf-event-open-sys-4.0.0", + sha256 = "7c44fb1c7651a45a3652c4afc6e754e40b3d6e6556f1487e2b230bfc4f33c2a8", + type = "tar.gz", + urls = ["https://static.crates.io/crates/perf-event-open-sys/4.0.0/download"], + strip_prefix = "perf-event-open-sys-4.0.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.perf-event-open-sys-4.0.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__petgraph-0.8.3", + sha256 = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455", + type = "tar.gz", + urls = ["https://static.crates.io/crates/petgraph/0.8.3/download"], + strip_prefix = "petgraph-0.8.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.petgraph-0.8.3.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__pin-project-lite-0.2.17", + sha256 = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd", + type = "tar.gz", + urls = ["https://static.crates.io/crates/pin-project-lite/0.2.17/download"], + strip_prefix = "pin-project-lite-0.2.17", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.pin-project-lite-0.2.17.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__pkg-config-0.3.33", + sha256 = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e", + type = "tar.gz", + urls = ["https://static.crates.io/crates/pkg-config/0.3.33/download"], + strip_prefix = "pkg-config-0.3.33", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.pkg-config-0.3.33.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__portable-atomic-1.14.0", + sha256 = "3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3", + type = "tar.gz", + urls = ["https://static.crates.io/crates/portable-atomic/1.14.0/download"], + strip_prefix = "portable-atomic-1.14.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.portable-atomic-1.14.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__portable-atomic-util-0.2.7", + sha256 = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618", + type = "tar.gz", + urls = ["https://static.crates.io/crates/portable-atomic-util/0.2.7/download"], + strip_prefix = "portable-atomic-util-0.2.7", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.portable-atomic-util-0.2.7.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__postcard-1.1.3", + sha256 = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24", + type = "tar.gz", + urls = ["https://static.crates.io/crates/postcard/1.1.3/download"], + strip_prefix = "postcard-1.1.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.postcard-1.1.3.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__powerfmt-0.2.0", + sha256 = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391", + type = "tar.gz", + urls = ["https://static.crates.io/crates/powerfmt/0.2.0/download"], + strip_prefix = "powerfmt-0.2.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.powerfmt-0.2.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__proc-macro2-1.0.107", + sha256 = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9", + type = "tar.gz", + urls = ["https://static.crates.io/crates/proc-macro2/1.0.107/download"], + strip_prefix = "proc-macro2-1.0.107", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.proc-macro2-1.0.107.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__proc-macro2-diagnostics-0.10.1", + sha256 = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8", + type = "tar.gz", + urls = ["https://static.crates.io/crates/proc-macro2-diagnostics/0.10.1/download"], + strip_prefix = "proc-macro2-diagnostics-0.10.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.proc-macro2-diagnostics-0.10.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__quote-1.0.47", + sha256 = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001", + type = "tar.gz", + urls = ["https://static.crates.io/crates/quote/1.0.47/download"], + strip_prefix = "quote-1.0.47", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.quote-1.0.47.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__r-efi-6.0.0", + sha256 = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf", + type = "tar.gz", + urls = ["https://static.crates.io/crates/r-efi/6.0.0/download"], + strip_prefix = "r-efi-6.0.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.r-efi-6.0.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra-ap-rustc_abi-0.166.0", + sha256 = "e2cf1b1ffe31b6226c00b40cddfda65002b7729f9f4ed2d547b5856cdab0011c", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra-ap-rustc_abi/0.166.0/download"], + strip_prefix = "ra-ap-rustc_abi-0.166.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_abi-0.166.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra-ap-rustc_ast_ir-0.166.0", + sha256 = "2ef42605e36e1305e815ccfc8830eb870f74d78534bca19a61629149536d8e98", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra-ap-rustc_ast_ir/0.166.0/download"], + strip_prefix = "ra-ap-rustc_ast_ir-0.166.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_ast_ir-0.166.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra-ap-rustc_hashes-0.166.0", + sha256 = "b9f5542968215c17275920791b2fa13a43014287506ed0450777c79845102e86", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra-ap-rustc_hashes/0.166.0/download"], + strip_prefix = "ra-ap-rustc_hashes-0.166.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_hashes-0.166.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra-ap-rustc_index-0.166.0", + sha256 = "1d9e47b9ca7d92cfb0d6653503adbabd41938b84474317397a664326b208d6c6", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra-ap-rustc_index/0.166.0/download"], + strip_prefix = "ra-ap-rustc_index-0.166.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_index-0.166.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra-ap-rustc_index_macros-0.166.0", + sha256 = "4d744a7a2852a22f06210bcff9e4667ed0cacbfbe94894cc294044d25e876341", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra-ap-rustc_index_macros/0.166.0/download"], + strip_prefix = "ra-ap-rustc_index_macros-0.166.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_index_macros-0.166.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra-ap-rustc_lexer-0.166.0", + sha256 = "527c12b3731b7d0692498012810b85b2b8dfdb8b514321ed6afc434bd1c70191", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra-ap-rustc_lexer/0.166.0/download"], + strip_prefix = "ra-ap-rustc_lexer-0.166.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_lexer-0.166.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra-ap-rustc_next_trait_solver-0.166.0", + sha256 = "a7a9663a8d7c369e934aac2b74a638537ad7eb4be75b4530d765384dc071c936", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra-ap-rustc_next_trait_solver/0.166.0/download"], + strip_prefix = "ra-ap-rustc_next_trait_solver-0.166.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_next_trait_solver-0.166.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra-ap-rustc_parse_format-0.166.0", + sha256 = "2c038b7a8b0f784d4e441ad8ab991fbbdaa5e0be482e59c639a846a1c8126951", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra-ap-rustc_parse_format/0.166.0/download"], + strip_prefix = "ra-ap-rustc_parse_format-0.166.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_parse_format-0.166.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra-ap-rustc_pattern_analysis-0.166.0", + sha256 = "42ca286f90e99bb97cd9274c088f3c874a05d1ee90cabf40a3928afedabe99fd", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra-ap-rustc_pattern_analysis/0.166.0/download"], + strip_prefix = "ra-ap-rustc_pattern_analysis-0.166.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_pattern_analysis-0.166.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra-ap-rustc_type_ir-0.166.0", + sha256 = "26d6efb6008f665a9485e0afecf9f4950a6c4bedd8ddd330a9df8986a6c0160b", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra-ap-rustc_type_ir/0.166.0/download"], + strip_prefix = "ra-ap-rustc_type_ir-0.166.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_type_ir-0.166.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra-ap-rustc_type_ir_macros-0.166.0", + sha256 = "5f4fd2355e2bbf1f343c730f623596efc6e465b5e3685b606a437567ebb75bf8", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra-ap-rustc_type_ir_macros/0.166.0/download"], + strip_prefix = "ra-ap-rustc_type_ir_macros-0.166.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_type_ir_macros-0.166.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra_ap_base_db-0.0.347", + sha256 = "7ea804efdf7c1fdbdac7c1b08002700a6f2930590399abcf84d55b4d4a894116", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra_ap_base_db/0.0.347/download"], + strip_prefix = "ra_ap_base_db-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_base_db-0.0.347.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra_ap_cfg-0.0.347", + sha256 = "c50ba7c60bc08ef48d2a930c5f897349fb0a72cf53e86c0374476f2583d1f098", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra_ap_cfg/0.0.347/download"], + strip_prefix = "ra_ap_cfg-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_cfg-0.0.347.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra_ap_edition-0.0.347", + sha256 = "238a2d0108f16fe859e369c5aba251abccd10fae513391ee4d119ac6a48ffec7", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra_ap_edition/0.0.347/download"], + strip_prefix = "ra_ap_edition-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_edition-0.0.347.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra_ap_hir-0.0.347", + sha256 = "9b0ff8d334193f5535c13a6749d2ed8ee4c417f75a2a92ffff24eee475097fdd", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra_ap_hir/0.0.347/download"], + strip_prefix = "ra_ap_hir-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_hir-0.0.347.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra_ap_hir_def-0.0.347", + sha256 = "41d0148d0b1f176f27d55df6ac6dc662ed65c55cae367aeb9f30472879626cd5", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra_ap_hir_def/0.0.347/download"], + strip_prefix = "ra_ap_hir_def-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_hir_def-0.0.347.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra_ap_hir_expand-0.0.347", + sha256 = "b494d16c4a066ffe135ef730b01806539e87d4e5bb26acbd7cf9ccd2ffb238df", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra_ap_hir_expand/0.0.347/download"], + strip_prefix = "ra_ap_hir_expand-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_hir_expand-0.0.347.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra_ap_hir_ty-0.0.347", + sha256 = "106393ec163f4cb9537721a04cd5e4d5ec642602c46f524e65a31a431be10269", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra_ap_hir_ty/0.0.347/download"], + strip_prefix = "ra_ap_hir_ty-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_hir_ty-0.0.347.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra_ap_ide_db-0.0.347", + sha256 = "c3ea305ce763f44928d29766c165982dd0a1c9fdba429296889d9e8e64dd28a5", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra_ap_ide_db/0.0.347/download"], + strip_prefix = "ra_ap_ide_db-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_ide_db-0.0.347.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra_ap_intern-0.0.347", + sha256 = "0a6be54b5f8a47e4aee183dd985440bb2e46d587270f63a6fcb03409a0de7054", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra_ap_intern/0.0.347/download"], + strip_prefix = "ra_ap_intern-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_intern-0.0.347.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra_ap_load-cargo-0.0.347", + sha256 = "96a50dad86901f2f0dab1e54ccf2dd43ce3bcb934bcaae1c3fa4884a1c45f77a", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra_ap_load-cargo/0.0.347/download"], + strip_prefix = "ra_ap_load-cargo-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_load-cargo-0.0.347.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra_ap_macros-0.0.347", + sha256 = "478606f8a75d1c4f8e6bfd4874ecf56303a690e270cffbd82e9fb700637500c5", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra_ap_macros/0.0.347/download"], + strip_prefix = "ra_ap_macros-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_macros-0.0.347.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra_ap_mbe-0.0.347", + sha256 = "c8d1b45159a9f2e6d61bec480d49a5d2c4a1c8215a75f01cf1d6ae7042cc0330", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra_ap_mbe/0.0.347/download"], + strip_prefix = "ra_ap_mbe-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_mbe-0.0.347.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra_ap_parser-0.0.347", + sha256 = "8bdb9f2e027f40bbaeff62c026e1affabe691467c0553857f6eb7e36093c5b6f", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra_ap_parser/0.0.347/download"], + strip_prefix = "ra_ap_parser-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_parser-0.0.347.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra_ap_paths-0.0.347", + sha256 = "36bc14237aa65d051028cbb54b0a0e0a1d53487b3f647c2b11667870720af9db", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra_ap_paths/0.0.347/download"], + strip_prefix = "ra_ap_paths-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_paths-0.0.347.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra_ap_proc_macro_api-0.0.347", + sha256 = "3c56d7dacb79f01f5d9ab0a25b232acf37d3104d176e67d2985e9e389834c553", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra_ap_proc_macro_api/0.0.347/download"], + strip_prefix = "ra_ap_proc_macro_api-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_proc_macro_api-0.0.347.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra_ap_profile-0.0.347", + sha256 = "6f6a81ebc5ef6f42d86ac8d20c82d4132010f28af93da37f08d127eeea24b852", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra_ap_profile/0.0.347/download"], + strip_prefix = "ra_ap_profile-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_profile-0.0.347.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra_ap_project_model-0.0.347", + sha256 = "9cf562304b786b7fa9089d2e0ae489d73abbda1732b0a820977a6fa7f9f5db0c", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra_ap_project_model/0.0.347/download"], + strip_prefix = "ra_ap_project_model-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_project_model-0.0.347.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra_ap_span-0.0.347", + sha256 = "6358a99deb3e9564a3702731031bd6a59ab6843258f56697971c2591d142aa8a", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra_ap_span/0.0.347/download"], + strip_prefix = "ra_ap_span-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_span-0.0.347.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra_ap_stdx-0.0.347", + sha256 = "808a663a921ead35b75a74a2eebe7ab84e5ced29c594e9bf3c77914caf8b77c0", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra_ap_stdx/0.0.347/download"], + strip_prefix = "ra_ap_stdx-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_stdx-0.0.347.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra_ap_syntax-0.0.347", + sha256 = "733ea008d3847dac53a6463689fd595a1d9459db09b1dc2306f2293dc130f586", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra_ap_syntax/0.0.347/download"], + strip_prefix = "ra_ap_syntax-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_syntax-0.0.347.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra_ap_syntax-bridge-0.0.347", + sha256 = "f1ea2603396e114a6db5145508242ce9d238983533e3bdc4019cb473247c5e07", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra_ap_syntax-bridge/0.0.347/download"], + strip_prefix = "ra_ap_syntax-bridge-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_syntax-bridge-0.0.347.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra_ap_test_fixture-0.0.347", + sha256 = "77da42ce97d6b9de208c9e9fba23244da564130ee0d892af03d0a6eb72ba8672", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra_ap_test_fixture/0.0.347/download"], + strip_prefix = "ra_ap_test_fixture-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_test_fixture-0.0.347.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra_ap_test_utils-0.0.347", + sha256 = "fdfcc378493db43a2b837d9cd62c4c91c5d33302ae639b3dbf6d56ed97df6e63", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra_ap_test_utils/0.0.347/download"], + strip_prefix = "ra_ap_test_utils-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_test_utils-0.0.347.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra_ap_toolchain-0.0.347", + sha256 = "5f7748b05a913c21f6182b4c2d7c7009251938b8eb01a2b96e61d0c7ca4aacc2", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra_ap_toolchain/0.0.347/download"], + strip_prefix = "ra_ap_toolchain-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_toolchain-0.0.347.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra_ap_tt-0.0.347", + sha256 = "babe00307d454b585a66e51f1fe6ccdfd1f82a200ef75374c80e843520cb3f7f", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra_ap_tt/0.0.347/download"], + strip_prefix = "ra_ap_tt-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_tt-0.0.347.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra_ap_vfs-0.0.347", + sha256 = "a730486f6595655431750c15faf4332603ad30f0460e7c89bbee79880416794b", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra_ap_vfs/0.0.347/download"], + strip_prefix = "ra_ap_vfs-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_vfs-0.0.347.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ra_ap_vfs-notify-0.0.347", + sha256 = "ede5e2c51dd3a138039d2f1c4dc33709cebb1c4e00692f8026de833844ad375f", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ra_ap_vfs-notify/0.0.347/download"], + strip_prefix = "ra_ap_vfs-notify-0.0.347", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_vfs-notify-0.0.347.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__rand-0.10.2", + sha256 = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80", + type = "tar.gz", + urls = ["https://static.crates.io/crates/rand/0.10.2/download"], + strip_prefix = "rand-0.10.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rand-0.10.2.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__rand_core-0.10.1", + sha256 = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69", + type = "tar.gz", + urls = ["https://static.crates.io/crates/rand_core/0.10.1/download"], + strip_prefix = "rand_core-0.10.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rand_core-0.10.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__rayon-1.12.0", + sha256 = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d", + type = "tar.gz", + urls = ["https://static.crates.io/crates/rayon/1.12.0/download"], + strip_prefix = "rayon-1.12.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rayon-1.12.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__rayon-core-1.13.0", + sha256 = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91", + type = "tar.gz", + urls = ["https://static.crates.io/crates/rayon-core/1.13.0/download"], + strip_prefix = "rayon-core-1.13.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rayon-core-1.13.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__redox_syscall-0.5.18", + sha256 = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d", + type = "tar.gz", + urls = ["https://static.crates.io/crates/redox_syscall/0.5.18/download"], + strip_prefix = "redox_syscall-0.5.18", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.redox_syscall-0.5.18.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ref-cast-1.0.26", + sha256 = "216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ref-cast/1.0.26/download"], + strip_prefix = "ref-cast-1.0.26", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ref-cast-1.0.26.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ref-cast-impl-1.0.26", + sha256 = "2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ref-cast-impl/1.0.26/download"], + strip_prefix = "ref-cast-impl-1.0.26", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ref-cast-impl-1.0.26.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__regex-1.13.1", + sha256 = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d", + type = "tar.gz", + urls = ["https://static.crates.io/crates/regex/1.13.1/download"], + strip_prefix = "regex-1.13.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.regex-1.13.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__regex-automata-0.4.18", + sha256 = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2", + type = "tar.gz", + urls = ["https://static.crates.io/crates/regex-automata/0.4.18/download"], + strip_prefix = "regex-automata-0.4.18", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.regex-automata-0.4.18.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__regex-syntax-0.8.11", + sha256 = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4", + type = "tar.gz", + urls = ["https://static.crates.io/crates/regex-syntax/0.8.11/download"], + strip_prefix = "regex-syntax-0.8.11", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.regex-syntax-0.8.11.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__rowan-0.17.0", + sha256 = "14b574c58582fa59fa43a2feb6608b8744184659f08a2e0117e4b8224d95ed61", + type = "tar.gz", + urls = ["https://static.crates.io/crates/rowan/0.17.0/download"], + strip_prefix = "rowan-0.17.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rowan-0.17.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__rustc-hash-1.1.0", + sha256 = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2", + type = "tar.gz", + urls = ["https://static.crates.io/crates/rustc-hash/1.1.0/download"], + strip_prefix = "rustc-hash-1.1.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rustc-hash-1.1.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__rustc-hash-2.1.3", + sha256 = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d", + type = "tar.gz", + urls = ["https://static.crates.io/crates/rustc-hash/2.1.3/download"], + strip_prefix = "rustc-hash-2.1.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rustc-hash-2.1.3.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__rustc-literal-escaper-0.0.7", + sha256 = "8be87abb9e40db7466e0681dc8ecd9dcfd40360cb10b4c8fe24a7c4c3669b198", + type = "tar.gz", + urls = ["https://static.crates.io/crates/rustc-literal-escaper/0.0.7/download"], + strip_prefix = "rustc-literal-escaper-0.0.7", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rustc-literal-escaper-0.0.7.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__rustc-stable-hash-0.1.2", + sha256 = "781442f29170c5c93b7185ad559492601acdc71d5bb0706f5868094f45cfcd08", + type = "tar.gz", + urls = ["https://static.crates.io/crates/rustc-stable-hash/0.1.2/download"], + strip_prefix = "rustc-stable-hash-0.1.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rustc-stable-hash-0.1.2.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__rustc_apfloat-0.2.3-llvm-462a31f5a5ab", + sha256 = "486c2179b4796f65bfe2ee33679acf0927ac83ecf583ad6c91c3b4570911b9ad", + type = "tar.gz", + urls = ["https://static.crates.io/crates/rustc_apfloat/0.2.3+llvm-462a31f5a5ab/download"], + strip_prefix = "rustc_apfloat-0.2.3+llvm-462a31f5a5ab", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rustc_apfloat-0.2.3+llvm-462a31f5a5ab.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__rustversion-1.0.23", + sha256 = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f", + type = "tar.gz", + urls = ["https://static.crates.io/crates/rustversion/1.0.23/download"], + strip_prefix = "rustversion-1.0.23", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rustversion-1.0.23.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ryu-1.0.23", + sha256 = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ryu/1.0.23/download"], + strip_prefix = "ryu-1.0.23", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ryu-1.0.23.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__salsa-0.28.2", + sha256 = "cf0e374215cd2db2b5c75d7b3a99cb0cc052c0595335dfdefc03d4eb08f4aa81", + type = "tar.gz", + urls = ["https://static.crates.io/crates/salsa/0.28.2/download"], + strip_prefix = "salsa-0.28.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.salsa-0.28.2.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__salsa-macro-rules-0.28.2", + sha256 = "85f4b7d4405540bbd6d4ffa52d4322d983f3781954d3073067ac1bdb028459b3", + type = "tar.gz", + urls = ["https://static.crates.io/crates/salsa-macro-rules/0.28.2/download"], + strip_prefix = "salsa-macro-rules-0.28.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.salsa-macro-rules-0.28.2.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__salsa-macros-0.28.2", + sha256 = "445be2bfbb2f67cb663225ecd7bc5a25370c0250fca30f9d8cbad9a913650370", + type = "tar.gz", + urls = ["https://static.crates.io/crates/salsa-macros/0.28.2/download"], + strip_prefix = "salsa-macros-0.28.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.salsa-macros-0.28.2.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__same-file-1.0.6", + sha256 = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502", + type = "tar.gz", + urls = ["https://static.crates.io/crates/same-file/1.0.6/download"], + strip_prefix = "same-file-1.0.6", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.same-file-1.0.6.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__schemars-0.9.0", + sha256 = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f", + type = "tar.gz", + urls = ["https://static.crates.io/crates/schemars/0.9.0/download"], + strip_prefix = "schemars-0.9.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.schemars-0.9.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__schemars-1.2.2", + sha256 = "687274d293b6cdc6e73e0fee520bf2049650090d7164f87672d212a3c530cf4a", + type = "tar.gz", + urls = ["https://static.crates.io/crates/schemars/1.2.2/download"], + strip_prefix = "schemars-1.2.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.schemars-1.2.2.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__scopeguard-1.2.0", + sha256 = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49", + type = "tar.gz", + urls = ["https://static.crates.io/crates/scopeguard/1.2.0/download"], + strip_prefix = "scopeguard-1.2.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.scopeguard-1.2.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__semver-1.0.28", + sha256 = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd", + type = "tar.gz", + urls = ["https://static.crates.io/crates/semver/1.0.28/download"], + strip_prefix = "semver-1.0.28", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.semver-1.0.28.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__serde-1.0.229", + sha256 = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba", + type = "tar.gz", + urls = ["https://static.crates.io/crates/serde/1.0.229/download"], + strip_prefix = "serde-1.0.229", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde-1.0.229.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__serde_core-1.0.229", + sha256 = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48", + type = "tar.gz", + urls = ["https://static.crates.io/crates/serde_core/1.0.229/download"], + strip_prefix = "serde_core-1.0.229", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_core-1.0.229.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__serde_derive-1.0.229", + sha256 = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348", + type = "tar.gz", + urls = ["https://static.crates.io/crates/serde_derive/1.0.229/download"], + strip_prefix = "serde_derive-1.0.229", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_derive-1.0.229.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__serde_json-1.0.151", + sha256 = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14", + type = "tar.gz", + urls = ["https://static.crates.io/crates/serde_json/1.0.151/download"], + strip_prefix = "serde_json-1.0.151", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_json-1.0.151.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__serde_spanned-1.1.1", + sha256 = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26", + type = "tar.gz", + urls = ["https://static.crates.io/crates/serde_spanned/1.1.1/download"], + strip_prefix = "serde_spanned-1.1.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_spanned-1.1.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__serde_with-3.22.0", + sha256 = "ee78f1fbe43ac4a0e47aadb3dbd357b69eb0d3793e948624cd03dd2750ab1c0a", + type = "tar.gz", + urls = ["https://static.crates.io/crates/serde_with/3.22.0/download"], + strip_prefix = "serde_with-3.22.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_with-3.22.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__serde_with_macros-3.22.0", + sha256 = "8705578779c2b6bd90d84d66eb2e206b708b1a4d7b9f17641b293545bf1c7e46", + type = "tar.gz", + urls = ["https://static.crates.io/crates/serde_with_macros/3.22.0/download"], + strip_prefix = "serde_with_macros-3.22.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_with_macros-3.22.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__serde_yaml-0.9.34-deprecated", + sha256 = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47", + type = "tar.gz", + urls = ["https://static.crates.io/crates/serde_yaml/0.9.34+deprecated/download"], + strip_prefix = "serde_yaml-0.9.34+deprecated", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_yaml-0.9.34+deprecated.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__sharded-slab-0.1.7", + sha256 = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6", + type = "tar.gz", + urls = ["https://static.crates.io/crates/sharded-slab/0.1.7/download"], + strip_prefix = "sharded-slab-0.1.7", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.sharded-slab-0.1.7.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__shlex-2.0.1", + sha256 = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba", + type = "tar.gz", + urls = ["https://static.crates.io/crates/shlex/2.0.1/download"], + strip_prefix = "shlex-2.0.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.shlex-2.0.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__simd-adler32-0.3.9", + sha256 = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214", + type = "tar.gz", + urls = ["https://static.crates.io/crates/simd-adler32/0.3.9/download"], + strip_prefix = "simd-adler32-0.3.9", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.simd-adler32-0.3.9.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__slab-0.4.12", + sha256 = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5", + type = "tar.gz", + urls = ["https://static.crates.io/crates/slab/0.4.12/download"], + strip_prefix = "slab-0.4.12", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.slab-0.4.12.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__smallvec-1.15.2", + sha256 = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90", + type = "tar.gz", + urls = ["https://static.crates.io/crates/smallvec/1.15.2/download"], + strip_prefix = "smallvec-1.15.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.smallvec-1.15.2.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__smol_str-0.3.6", + sha256 = "4aaa7368fcf4852a4c2dd92df0cace6a71f2091ca0a23391ce7f3a31833f1523", + type = "tar.gz", + urls = ["https://static.crates.io/crates/smol_str/0.3.6/download"], + strip_prefix = "smol_str-0.3.6", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.smol_str-0.3.6.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__stable_deref_trait-1.2.1", + sha256 = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596", + type = "tar.gz", + urls = ["https://static.crates.io/crates/stable_deref_trait/1.2.1/download"], + strip_prefix = "stable_deref_trait-1.2.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.stable_deref_trait-1.2.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__streaming-iterator-0.1.9", + sha256 = "2b2231b7c3057d5e4ad0156fb3dc807d900806020c5ffa3ee6ff2c8c76fb8520", + type = "tar.gz", + urls = ["https://static.crates.io/crates/streaming-iterator/0.1.9/download"], + strip_prefix = "streaming-iterator-0.1.9", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.streaming-iterator-0.1.9.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__strsim-0.11.1", + sha256 = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f", + type = "tar.gz", + urls = ["https://static.crates.io/crates/strsim/0.11.1/download"], + strip_prefix = "strsim-0.11.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.strsim-0.11.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__syn-2.0.119", + sha256 = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297", + type = "tar.gz", + urls = ["https://static.crates.io/crates/syn/2.0.119/download"], + strip_prefix = "syn-2.0.119", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.syn-2.0.119.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__syn-3.0.3", + sha256 = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3", + type = "tar.gz", + urls = ["https://static.crates.io/crates/syn/3.0.3/download"], + strip_prefix = "syn-3.0.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.syn-3.0.3.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__synstructure-0.13.2", + sha256 = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2", + type = "tar.gz", + urls = ["https://static.crates.io/crates/synstructure/0.13.2/download"], + strip_prefix = "synstructure-0.13.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.synstructure-0.13.2.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__temp-dir-0.2.0", + sha256 = "016ef9739649996fcc983b9c588fe3d557cf216d4d98503ce1b057ab5a66d689", + type = "tar.gz", + urls = ["https://static.crates.io/crates/temp-dir/0.2.0/download"], + strip_prefix = "temp-dir-0.2.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.temp-dir-0.2.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__text-size-1.1.1", + sha256 = "f18aa187839b2bdb1ad2fa35ead8c4c2976b64e4363c386d45ac0f7ee85c9233", + type = "tar.gz", + urls = ["https://static.crates.io/crates/text-size/1.1.1/download"], + strip_prefix = "text-size-1.1.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.text-size-1.1.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__thin-vec-0.2.19", + sha256 = "79def32ffcd477db1ff26f76dab9e3a91f0bd42a85ca96577089b24623056f9d", + type = "tar.gz", + urls = ["https://static.crates.io/crates/thin-vec/0.2.19/download"], + strip_prefix = "thin-vec-0.2.19", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.thin-vec-0.2.19.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__thiserror-2.0.20", + sha256 = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f", + type = "tar.gz", + urls = ["https://static.crates.io/crates/thiserror/2.0.20/download"], + strip_prefix = "thiserror-2.0.20", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.thiserror-2.0.20.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__thiserror-impl-2.0.20", + sha256 = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af", + type = "tar.gz", + urls = ["https://static.crates.io/crates/thiserror-impl/2.0.20/download"], + strip_prefix = "thiserror-impl-2.0.20", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.thiserror-impl-2.0.20.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__thread_local-1.1.10", + sha256 = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070", + type = "tar.gz", + urls = ["https://static.crates.io/crates/thread_local/1.1.10/download"], + strip_prefix = "thread_local-1.1.10", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.thread_local-1.1.10.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__time-0.3.55", + sha256 = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134", + type = "tar.gz", + urls = ["https://static.crates.io/crates/time/0.3.55/download"], + strip_prefix = "time-0.3.55", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.time-0.3.55.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__time-core-0.1.9", + sha256 = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109", + type = "tar.gz", + urls = ["https://static.crates.io/crates/time-core/0.1.9/download"], + strip_prefix = "time-core-0.1.9", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.time-core-0.1.9.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__time-macros-0.2.32", + sha256 = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85", + type = "tar.gz", + urls = ["https://static.crates.io/crates/time-macros/0.2.32/download"], + strip_prefix = "time-macros-0.2.32", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.time-macros-0.2.32.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__tinyvec-1.12.0", + sha256 = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f", + type = "tar.gz", + urls = ["https://static.crates.io/crates/tinyvec/1.12.0/download"], + strip_prefix = "tinyvec-1.12.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tinyvec-1.12.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__tinyvec_macros-0.1.1", + sha256 = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20", + type = "tar.gz", + urls = ["https://static.crates.io/crates/tinyvec_macros/0.1.1/download"], + strip_prefix = "tinyvec_macros-0.1.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tinyvec_macros-0.1.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__toml-1.1.4-spec-1.1.0", + sha256 = "3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5", + type = "tar.gz", + urls = ["https://static.crates.io/crates/toml/1.1.4+spec-1.1.0/download"], + strip_prefix = "toml-1.1.4+spec-1.1.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml-1.1.4+spec-1.1.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__toml_datetime-1.1.1-spec-1.1.0", + sha256 = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7", + type = "tar.gz", + urls = ["https://static.crates.io/crates/toml_datetime/1.1.1+spec-1.1.0/download"], + strip_prefix = "toml_datetime-1.1.1+spec-1.1.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml_datetime-1.1.1+spec-1.1.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__toml_parser-1.1.3-spec-1.1.0", + sha256 = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56", + type = "tar.gz", + urls = ["https://static.crates.io/crates/toml_parser/1.1.3+spec-1.1.0/download"], + strip_prefix = "toml_parser-1.1.3+spec-1.1.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml_parser-1.1.3+spec-1.1.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__toml_writer-1.1.2-spec-1.1.0", + sha256 = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2", + type = "tar.gz", + urls = ["https://static.crates.io/crates/toml_writer/1.1.2+spec-1.1.0/download"], + strip_prefix = "toml_writer-1.1.2+spec-1.1.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml_writer-1.1.2+spec-1.1.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__tracing-0.1.44", + sha256 = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100", + type = "tar.gz", + urls = ["https://static.crates.io/crates/tracing/0.1.44/download"], + strip_prefix = "tracing-0.1.44", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tracing-0.1.44.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__tracing-attributes-0.1.31", + sha256 = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da", + type = "tar.gz", + urls = ["https://static.crates.io/crates/tracing-attributes/0.1.31/download"], + strip_prefix = "tracing-attributes-0.1.31", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tracing-attributes-0.1.31.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__tracing-core-0.1.36", + sha256 = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a", + type = "tar.gz", + urls = ["https://static.crates.io/crates/tracing-core/0.1.36/download"], + strip_prefix = "tracing-core-0.1.36", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tracing-core-0.1.36.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__tracing-flame-0.2.0", + sha256 = "0bae117ee14789185e129aaee5d93750abe67fdc5a9a62650452bfe4e122a3a9", + type = "tar.gz", + urls = ["https://static.crates.io/crates/tracing-flame/0.2.0/download"], + strip_prefix = "tracing-flame-0.2.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tracing-flame-0.2.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__tracing-log-0.2.0", + sha256 = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3", + type = "tar.gz", + urls = ["https://static.crates.io/crates/tracing-log/0.2.0/download"], + strip_prefix = "tracing-log-0.2.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tracing-log-0.2.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__tracing-subscriber-0.3.23", + sha256 = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319", + type = "tar.gz", + urls = ["https://static.crates.io/crates/tracing-subscriber/0.3.23/download"], + strip_prefix = "tracing-subscriber-0.3.23", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tracing-subscriber-0.3.23.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__tracing-tree-0.4.1", + sha256 = "ac87aa03b6a4d5a7e4810d1a80c19601dbe0f8a837e9177f23af721c7ba7beec", + type = "tar.gz", + urls = ["https://static.crates.io/crates/tracing-tree/0.4.1/download"], + strip_prefix = "tracing-tree-0.4.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tracing-tree-0.4.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__tree-sitter-0.26.9", + sha256 = "4dab76d0b724ba557954125188cf0633a1ca43199ced82d95c7b9c32cc3de1f3", + type = "tar.gz", + urls = ["https://static.crates.io/crates/tree-sitter/0.26.9/download"], + strip_prefix = "tree-sitter-0.26.9", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tree-sitter-0.26.9.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__tree-sitter-embedded-template-0.25.0", + sha256 = "833d528e8fcb4e49ddb04d4d6450ddb8ac08f282a58fec94ce981c9c5dbf7e3a", + type = "tar.gz", + urls = ["https://static.crates.io/crates/tree-sitter-embedded-template/0.25.0/download"], + strip_prefix = "tree-sitter-embedded-template-0.25.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tree-sitter-embedded-template-0.25.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__tree-sitter-json-0.24.8", + sha256 = "4d727acca406c0020cffc6cf35516764f36c8e3dc4408e5ebe2cb35a947ec471", + type = "tar.gz", + urls = ["https://static.crates.io/crates/tree-sitter-json/0.24.8/download"], + strip_prefix = "tree-sitter-json-0.24.8", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tree-sitter-json-0.24.8.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__tree-sitter-language-0.1.7", + sha256 = "009994f150cc0cd50ff54917d5bc8bffe8cad10ca10d81c34da2ec421ae61782", + type = "tar.gz", + urls = ["https://static.crates.io/crates/tree-sitter-language/0.1.7/download"], + strip_prefix = "tree-sitter-language-0.1.7", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tree-sitter-language-0.1.7.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__tree-sitter-python-0.25.0", + sha256 = "6bf85fd39652e740bf60f46f4cda9492c3a9ad75880575bf14960f775cb74a1c", + type = "tar.gz", + urls = ["https://static.crates.io/crates/tree-sitter-python/0.25.0/download"], + strip_prefix = "tree-sitter-python-0.25.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tree-sitter-python-0.25.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__tree-sitter-ql-0.23.1", + sha256 = "80b7bcaf39acefbb199417a6ec2fd0c038083ba115da3e4f4426c820dc76d386", + type = "tar.gz", + urls = ["https://static.crates.io/crates/tree-sitter-ql/0.23.1/download"], + strip_prefix = "tree-sitter-ql-0.23.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tree-sitter-ql-0.23.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__tree-sitter-ruby-0.23.1", + sha256 = "be0484ea4ef6bb9c575b4fdabde7e31340a8d2dbc7d52b321ac83da703249f95", + type = "tar.gz", + urls = ["https://static.crates.io/crates/tree-sitter-ruby/0.23.1/download"], + strip_prefix = "tree-sitter-ruby-0.23.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tree-sitter-ruby-0.23.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__triomphe-0.1.16", + sha256 = "b40688ea6389c8171614b25491f71d4a27946e0c7ce2da1c6de27e25abf1a0ae", + type = "tar.gz", + urls = ["https://static.crates.io/crates/triomphe/0.1.16/download"], + strip_prefix = "triomphe-0.1.16", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.triomphe-0.1.16.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__typed-arena-2.0.2", + sha256 = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a", + type = "tar.gz", + urls = ["https://static.crates.io/crates/typed-arena/2.0.2/download"], + strip_prefix = "typed-arena-2.0.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.typed-arena-2.0.2.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__typeid-1.0.3", + sha256 = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c", + type = "tar.gz", + urls = ["https://static.crates.io/crates/typeid/1.0.3/download"], + strip_prefix = "typeid-1.0.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.typeid-1.0.3.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__uncased-0.9.10", + sha256 = "e1b88fcfe09e89d3866a5c11019378088af2d24c3fbd4f0543f96b479ec90697", + type = "tar.gz", + urls = ["https://static.crates.io/crates/uncased/0.9.10/download"], + strip_prefix = "uncased-0.9.10", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.uncased-0.9.10.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__ungrammar-1.16.1", + sha256 = "a3e5df347f0bf3ec1d670aad6ca5c6a1859cd9ea61d2113125794654ccced68f", + type = "tar.gz", + urls = ["https://static.crates.io/crates/ungrammar/1.16.1/download"], + strip_prefix = "ungrammar-1.16.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ungrammar-1.16.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__unicode-ident-1.0.24", + sha256 = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75", + type = "tar.gz", + urls = ["https://static.crates.io/crates/unicode-ident/1.0.24/download"], + strip_prefix = "unicode-ident-1.0.24", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.unicode-ident-1.0.24.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__unicode-properties-0.1.4", + sha256 = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d", + type = "tar.gz", + urls = ["https://static.crates.io/crates/unicode-properties/0.1.4/download"], + strip_prefix = "unicode-properties-0.1.4", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.unicode-properties-0.1.4.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__unsafe-libyaml-0.2.11", + sha256 = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861", + type = "tar.gz", + urls = ["https://static.crates.io/crates/unsafe-libyaml/0.2.11/download"], + strip_prefix = "unsafe-libyaml-0.2.11", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.unsafe-libyaml-0.2.11.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__utf8parse-0.2.2", + sha256 = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821", + type = "tar.gz", + urls = ["https://static.crates.io/crates/utf8parse/0.2.2/download"], + strip_prefix = "utf8parse-0.2.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.utf8parse-0.2.2.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__valuable-0.1.1", + sha256 = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65", + type = "tar.gz", + urls = ["https://static.crates.io/crates/valuable/0.1.1/download"], + strip_prefix = "valuable-0.1.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.valuable-0.1.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__version_check-0.9.5", + sha256 = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a", + type = "tar.gz", + urls = ["https://static.crates.io/crates/version_check/0.9.5/download"], + strip_prefix = "version_check-0.9.5", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.version_check-0.9.5.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__walkdir-2.5.0", + sha256 = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b", + type = "tar.gz", + urls = ["https://static.crates.io/crates/walkdir/2.5.0/download"], + strip_prefix = "walkdir-2.5.0", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.walkdir-2.5.0.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__wasi-0.11.1-wasi-snapshot-preview1", + sha256 = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b", + type = "tar.gz", + urls = ["https://static.crates.io/crates/wasi/0.11.1+wasi-snapshot-preview1/download"], + strip_prefix = "wasi-0.11.1+wasi-snapshot-preview1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wasi-0.11.1+wasi-snapshot-preview1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__wasm-bindgen-0.2.126", + sha256 = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4", + type = "tar.gz", + urls = ["https://static.crates.io/crates/wasm-bindgen/0.2.126/download"], + strip_prefix = "wasm-bindgen-0.2.126", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wasm-bindgen-0.2.126.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__wasm-bindgen-macro-0.2.126", + sha256 = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1", + type = "tar.gz", + urls = ["https://static.crates.io/crates/wasm-bindgen-macro/0.2.126/download"], + strip_prefix = "wasm-bindgen-macro-0.2.126", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wasm-bindgen-macro-0.2.126.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__wasm-bindgen-macro-support-0.2.126", + sha256 = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e", + type = "tar.gz", + urls = ["https://static.crates.io/crates/wasm-bindgen-macro-support/0.2.126/download"], + strip_prefix = "wasm-bindgen-macro-support-0.2.126", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wasm-bindgen-macro-support-0.2.126.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__wasm-bindgen-shared-0.2.126", + sha256 = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24", + type = "tar.gz", + urls = ["https://static.crates.io/crates/wasm-bindgen-shared/0.2.126/download"], + strip_prefix = "wasm-bindgen-shared-0.2.126", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wasm-bindgen-shared-0.2.126.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__winapi-util-0.1.11", + sha256 = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22", + type = "tar.gz", + urls = ["https://static.crates.io/crates/winapi-util/0.1.11/download"], + strip_prefix = "winapi-util-0.1.11", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.winapi-util-0.1.11.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__windows-core-0.62.2", + sha256 = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb", + type = "tar.gz", + urls = ["https://static.crates.io/crates/windows-core/0.62.2/download"], + strip_prefix = "windows-core-0.62.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows-core-0.62.2.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__windows-implement-0.60.2", + sha256 = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf", + type = "tar.gz", + urls = ["https://static.crates.io/crates/windows-implement/0.60.2/download"], + strip_prefix = "windows-implement-0.60.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows-implement-0.60.2.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__windows-interface-0.59.3", + sha256 = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358", + type = "tar.gz", + urls = ["https://static.crates.io/crates/windows-interface/0.59.3/download"], + strip_prefix = "windows-interface-0.59.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows-interface-0.59.3.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__windows-link-0.2.1", + sha256 = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5", + type = "tar.gz", + urls = ["https://static.crates.io/crates/windows-link/0.2.1/download"], + strip_prefix = "windows-link-0.2.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows-link-0.2.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__windows-result-0.4.1", + sha256 = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5", + type = "tar.gz", + urls = ["https://static.crates.io/crates/windows-result/0.4.1/download"], + strip_prefix = "windows-result-0.4.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows-result-0.4.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__windows-strings-0.5.1", + sha256 = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091", + type = "tar.gz", + urls = ["https://static.crates.io/crates/windows-strings/0.5.1/download"], + strip_prefix = "windows-strings-0.5.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows-strings-0.5.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__windows-sys-0.60.2", + sha256 = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb", + type = "tar.gz", + urls = ["https://static.crates.io/crates/windows-sys/0.60.2/download"], + strip_prefix = "windows-sys-0.60.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows-sys-0.60.2.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__windows-sys-0.61.2", + sha256 = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc", + type = "tar.gz", + urls = ["https://static.crates.io/crates/windows-sys/0.61.2/download"], + strip_prefix = "windows-sys-0.61.2", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows-sys-0.61.2.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__windows-targets-0.53.5", + sha256 = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3", + type = "tar.gz", + urls = ["https://static.crates.io/crates/windows-targets/0.53.5/download"], + strip_prefix = "windows-targets-0.53.5", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows-targets-0.53.5.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__windows_aarch64_gnullvm-0.53.1", + sha256 = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53", + type = "tar.gz", + urls = ["https://static.crates.io/crates/windows_aarch64_gnullvm/0.53.1/download"], + strip_prefix = "windows_aarch64_gnullvm-0.53.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows_aarch64_gnullvm-0.53.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__windows_aarch64_msvc-0.53.1", + sha256 = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006", + type = "tar.gz", + urls = ["https://static.crates.io/crates/windows_aarch64_msvc/0.53.1/download"], + strip_prefix = "windows_aarch64_msvc-0.53.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows_aarch64_msvc-0.53.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__windows_i686_gnu-0.53.1", + sha256 = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3", + type = "tar.gz", + urls = ["https://static.crates.io/crates/windows_i686_gnu/0.53.1/download"], + strip_prefix = "windows_i686_gnu-0.53.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows_i686_gnu-0.53.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__windows_i686_gnullvm-0.53.1", + sha256 = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c", + type = "tar.gz", + urls = ["https://static.crates.io/crates/windows_i686_gnullvm/0.53.1/download"], + strip_prefix = "windows_i686_gnullvm-0.53.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows_i686_gnullvm-0.53.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__windows_i686_msvc-0.53.1", + sha256 = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2", + type = "tar.gz", + urls = ["https://static.crates.io/crates/windows_i686_msvc/0.53.1/download"], + strip_prefix = "windows_i686_msvc-0.53.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows_i686_msvc-0.53.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__windows_x86_64_gnu-0.53.1", + sha256 = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499", + type = "tar.gz", + urls = ["https://static.crates.io/crates/windows_x86_64_gnu/0.53.1/download"], + strip_prefix = "windows_x86_64_gnu-0.53.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows_x86_64_gnu-0.53.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__windows_x86_64_gnullvm-0.53.1", + sha256 = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1", + type = "tar.gz", + urls = ["https://static.crates.io/crates/windows_x86_64_gnullvm/0.53.1/download"], + strip_prefix = "windows_x86_64_gnullvm-0.53.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows_x86_64_gnullvm-0.53.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__windows_x86_64_msvc-0.53.1", + sha256 = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650", + type = "tar.gz", + urls = ["https://static.crates.io/crates/windows_x86_64_msvc/0.53.1/download"], + strip_prefix = "windows_x86_64_msvc-0.53.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows_x86_64_msvc-0.53.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__winnow-0.7.15", + sha256 = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945", + type = "tar.gz", + urls = ["https://static.crates.io/crates/winnow/0.7.15/download"], + strip_prefix = "winnow-0.7.15", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.winnow-0.7.15.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__winnow-1.0.4", + sha256 = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81", + type = "tar.gz", + urls = ["https://static.crates.io/crates/winnow/1.0.4/download"], + strip_prefix = "winnow-1.0.4", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.winnow-1.0.4.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__yansi-1.0.1", + sha256 = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049", + type = "tar.gz", + urls = ["https://static.crates.io/crates/yansi/1.0.1/download"], + strip_prefix = "yansi-1.0.1", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.yansi-1.0.1.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__zmij-1.0.23", + sha256 = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b", + type = "tar.gz", + urls = ["https://static.crates.io/crates/zmij/1.0.23/download"], + strip_prefix = "zmij-1.0.23", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.zmij-1.0.23.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__zstd-0.13.3", + sha256 = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a", + type = "tar.gz", + urls = ["https://static.crates.io/crates/zstd/0.13.3/download"], + strip_prefix = "zstd-0.13.3", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.zstd-0.13.3.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__zstd-safe-7.2.4", + sha256 = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d", + type = "tar.gz", + urls = ["https://static.crates.io/crates/zstd-safe/7.2.4/download"], + strip_prefix = "zstd-safe-7.2.4", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.zstd-safe-7.2.4.bazel"), + ) + + maybe( + http_archive, + name = "vendor_ts__zstd-sys-2.0.16-zstd.1.5.7", + sha256 = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748", + type = "tar.gz", + urls = ["https://static.crates.io/crates/zstd-sys/2.0.16+zstd.1.5.7/download"], + strip_prefix = "zstd-sys-2.0.16+zstd.1.5.7", + build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.zstd-sys-2.0.16+zstd.1.5.7.bazel"), ) - direct_deps = [struct(repo = "vendor_ts", is_dev_dep = False)] - direct_deps.extend(_crate_repositories()) - return direct_deps + return [ + struct(repo = "vendor_ts", is_dev_dep = False), + struct(repo = "vendor_ts__anyhow-1.0.104", is_dev_dep = False), + struct(repo = "vendor_ts__argfile-1.0.0", is_dev_dep = False), + struct(repo = "vendor_ts__chalk-ir-0.104.0", is_dev_dep = False), + struct(repo = "vendor_ts__chrono-0.4.45", is_dev_dep = False), + struct(repo = "vendor_ts__clap-4.6.6", is_dev_dep = False), + struct(repo = "vendor_ts__dunce-1.0.5", is_dev_dep = False), + struct(repo = "vendor_ts__either-1.17.0", is_dev_dep = False), + struct(repo = "vendor_ts__encoding-0.2.33", is_dev_dep = False), + struct(repo = "vendor_ts__figment-0.10.19", is_dev_dep = False), + struct(repo = "vendor_ts__flate2-1.1.9", is_dev_dep = False), + struct(repo = "vendor_ts__glob-0.3.4", is_dev_dep = False), + struct(repo = "vendor_ts__globset-0.4.18", is_dev_dep = False), + struct(repo = "vendor_ts__itertools-0.15.0", is_dev_dep = False), + struct(repo = "vendor_ts__lazy_static-1.5.0", is_dev_dep = False), + struct(repo = "vendor_ts__mustache-0.9.0", is_dev_dep = False), + struct(repo = "vendor_ts__num-traits-0.2.19", is_dev_dep = False), + struct(repo = "vendor_ts__num_cpus-1.17.0", is_dev_dep = False), + struct(repo = "vendor_ts__proc-macro2-1.0.107", is_dev_dep = False), + struct(repo = "vendor_ts__quote-1.0.47", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_base_db-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_cfg-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_hir-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_hir_def-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_hir_expand-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_hir_ty-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_ide_db-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_intern-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_load-cargo-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_parser-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_paths-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_project_model-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_span-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_stdx-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_syntax-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_syntax-bridge-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_vfs-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__rayon-1.12.0", is_dev_dep = False), + struct(repo = "vendor_ts__regex-1.13.1", is_dev_dep = False), + struct(repo = "vendor_ts__serde-1.0.229", is_dev_dep = False), + struct(repo = "vendor_ts__serde_json-1.0.151", is_dev_dep = False), + struct(repo = "vendor_ts__serde_with-3.22.0", is_dev_dep = False), + struct(repo = "vendor_ts__serde_yaml-0.9.34-deprecated", is_dev_dep = False), + struct(repo = "vendor_ts__syn-3.0.3", is_dev_dep = False), + struct(repo = "vendor_ts__toml-1.1.4-spec-1.1.0", is_dev_dep = False), + struct(repo = "vendor_ts__tracing-0.1.44", is_dev_dep = False), + struct(repo = "vendor_ts__tracing-flame-0.2.0", is_dev_dep = False), + struct(repo = "vendor_ts__tracing-subscriber-0.3.23", is_dev_dep = False), + struct(repo = "vendor_ts__tree-sitter-0.26.9", is_dev_dep = False), + struct(repo = "vendor_ts__tree-sitter-embedded-template-0.25.0", is_dev_dep = False), + struct(repo = "vendor_ts__tree-sitter-python-0.25.0", is_dev_dep = False), + struct(repo = "vendor_ts__tree-sitter-ruby-0.23.1", is_dev_dep = False), + struct(repo = "vendor_ts__triomphe-0.1.16", is_dev_dep = False), + struct(repo = "vendor_ts__ungrammar-1.16.1", is_dev_dep = False), + struct(repo = "vendor_ts__zstd-0.13.3", is_dev_dep = False), + struct(repo = "vendor_ts__rand-0.10.2", is_dev_dep = True), + struct(repo = "vendor_ts__tree-sitter-json-0.24.8", is_dev_dep = True), + struct(repo = "vendor_ts__tree-sitter-ql-0.23.1", is_dev_dep = True), + ] diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/defs.bzl b/misc/bazel/3rdparty/tree_sitter_extractors_deps/defs.bzl index b3b69f861e30..6e5c75f885e5 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/defs.bzl +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/defs.bzl @@ -5,4078 +5,19 @@ # # bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors ############################################################################### -""" -# `crates_repository` API - -- [aliases](#aliases) -- [crate_deps](#crate_deps) -- [all_crate_deps](#all_crate_deps) -- [crate_repositories](#crate_repositories) - -""" - -load("@bazel_skylib//lib:selects.bzl", "selects") -load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") -load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") - -############################################################################### -# MACROS API -############################################################################### - -# An identifier that represent common dependencies (unconditional). -_COMMON_CONDITION = "" - -def _flatten_dependency_maps(all_dependency_maps): - """Flatten a list of dependency maps into one dictionary. - - Dependency maps have the following structure: - - ```python - DEPENDENCIES_MAP = { - # The first key in the map is a Bazel package - # name of the workspace this file is defined in. - "workspace_member_package": { - - # Not all dependencies are supported for all platforms. - # the condition key is the condition required to be true - # on the host platform. - "condition": { - - # An alias to a crate target. # The label of the crate target the - # Aliases are only crate names. # package name refers to. - "package_name": "@full//:label", - } - } - } - ``` - - Args: - all_dependency_maps (list): A list of dicts as described above - - Returns: - dict: A dictionary as described above - """ - dependencies = {} - - for workspace_deps_map in all_dependency_maps: - for pkg_name, conditional_deps_map in workspace_deps_map.items(): - if pkg_name not in dependencies: - non_frozen_map = dict() - for key, values in conditional_deps_map.items(): - non_frozen_map.update({key: dict(values.items())}) - dependencies.setdefault(pkg_name, non_frozen_map) - continue - - for condition, deps_map in conditional_deps_map.items(): - # If the condition has not been recorded, do so and continue - if condition not in dependencies[pkg_name]: - dependencies[pkg_name].setdefault(condition, dict(deps_map.items())) - continue - - # Alert on any miss-matched dependencies - inconsistent_entries = [] - for crate_name, crate_label in deps_map.items(): - existing = dependencies[pkg_name][condition].get(crate_name) - if existing and existing != crate_label: - inconsistent_entries.append((crate_name, existing, crate_label)) - dependencies[pkg_name][condition].update({crate_name: crate_label}) - - return dependencies - -def crate_deps(deps, package_name = None): - """Finds the fully qualified label of the requested crates for the package where this macro is called. - - Args: - deps (list): The desired list of crate targets. - package_name (str, optional): The package name of the set of dependencies to look up. - Defaults to `native.package_name()`. - - Returns: - list: A list of labels to generated rust targets (str) - """ - - if not deps: - return [] - - if package_name == None: - package_name = native.package_name() - - # Join both sets of dependencies - dependencies = _flatten_dependency_maps([ - _NORMAL_DEPENDENCIES, - _NORMAL_DEV_DEPENDENCIES, - _PROC_MACRO_DEPENDENCIES, - _PROC_MACRO_DEV_DEPENDENCIES, - _BUILD_DEPENDENCIES, - _BUILD_PROC_MACRO_DEPENDENCIES, - ]).pop(package_name, {}) - - # Combine all conditional packages so we can easily index over a flat list - # TODO: Perhaps this should actually return select statements and maintain - # the conditionals of the dependencies - flat_deps = {} - for deps_set in dependencies.values(): - for crate_name, crate_label in deps_set.items(): - flat_deps.update({crate_name: crate_label}) - - missing_crates = [] - crate_targets = [] - for crate_target in deps: - if crate_target not in flat_deps: - missing_crates.append(crate_target) - else: - crate_targets.append(flat_deps[crate_target]) - - if missing_crates: - fail("Could not find crates `{}` among dependencies of `{}`. Available dependencies were `{}`".format( - missing_crates, - package_name, - dependencies, - )) - - return crate_targets - -def all_crate_deps( - normal = False, - normal_dev = False, - proc_macro = False, - proc_macro_dev = False, - build = False, - build_proc_macro = False, - package_name = None): - """Finds the fully qualified label of all requested direct crate dependencies \ - for the package where this macro is called. - - If no parameters are set, all normal dependencies are returned. Setting any one flag will - otherwise impact the contents of the returned list. - - Args: - normal (bool, optional): If True, normal dependencies are included in the - output list. - normal_dev (bool, optional): If True, normal dev dependencies will be - included in the output list. - proc_macro (bool, optional): If True, proc_macro dependencies are included - in the output list. - proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are - included in the output list. - build (bool, optional): If True, build dependencies are included - in the output list. - build_proc_macro (bool, optional): If True, build proc_macro dependencies are - included in the output list. - package_name (str, optional): The package name of the set of dependencies to look up. - Defaults to `native.package_name()` when unset. - - Returns: - list: A list of labels to generated rust targets (str) - """ - - if package_name == None: - package_name = native.package_name() - - # Determine the relevant maps to use - all_dependency_maps = [] - if normal: - all_dependency_maps.append(_NORMAL_DEPENDENCIES) - if normal_dev: - all_dependency_maps.append(_NORMAL_DEV_DEPENDENCIES) - if proc_macro: - all_dependency_maps.append(_PROC_MACRO_DEPENDENCIES) - if proc_macro_dev: - all_dependency_maps.append(_PROC_MACRO_DEV_DEPENDENCIES) - if build: - all_dependency_maps.append(_BUILD_DEPENDENCIES) - if build_proc_macro: - all_dependency_maps.append(_BUILD_PROC_MACRO_DEPENDENCIES) - - # Default to always using normal dependencies - if not all_dependency_maps: - all_dependency_maps.append(_NORMAL_DEPENDENCIES) - - dependencies = _flatten_dependency_maps(all_dependency_maps).pop(package_name, None) - - if not dependencies: - if dependencies == None: - fail("Tried to get all_crate_deps for package " + package_name + " but that package had no Cargo.toml file") - else: - return [] - - crate_deps = list(dependencies.pop(_COMMON_CONDITION, {}).values()) - for condition, deps in dependencies.items(): - crate_deps += selects.with_or({ - tuple(_CONDITIONS[condition]): deps.values(), - "//conditions:default": [], - }) - - return crate_deps - -def aliases( - normal = False, - normal_dev = False, - proc_macro = False, - proc_macro_dev = False, - build = False, - build_proc_macro = False, - package_name = None): - """Produces a map of Crate alias names to their original label - - If no dependency kinds are specified, `normal` and `proc_macro` are used by default. - Setting any one flag will otherwise determine the contents of the returned dict. - - Args: - normal (bool, optional): If True, normal dependencies are included in the - output list. - normal_dev (bool, optional): If True, normal dev dependencies will be - included in the output list.. - proc_macro (bool, optional): If True, proc_macro dependencies are included - in the output list. - proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are - included in the output list. - build (bool, optional): If True, build dependencies are included - in the output list. - build_proc_macro (bool, optional): If True, build proc_macro dependencies are - included in the output list. - package_name (str, optional): The package name of the set of dependencies to look up. - Defaults to `native.package_name()` when unset. - - Returns: - dict: The aliases of all associated packages - """ - if package_name == None: - package_name = native.package_name() - - # Determine the relevant maps to use - all_aliases_maps = [] - if normal: - all_aliases_maps.append(_NORMAL_ALIASES) - if normal_dev: - all_aliases_maps.append(_NORMAL_DEV_ALIASES) - if proc_macro: - all_aliases_maps.append(_PROC_MACRO_ALIASES) - if proc_macro_dev: - all_aliases_maps.append(_PROC_MACRO_DEV_ALIASES) - if build: - all_aliases_maps.append(_BUILD_ALIASES) - if build_proc_macro: - all_aliases_maps.append(_BUILD_PROC_MACRO_ALIASES) - - # Default to always using normal aliases - if not all_aliases_maps: - all_aliases_maps.append(_NORMAL_ALIASES) - all_aliases_maps.append(_PROC_MACRO_ALIASES) - - aliases = _flatten_dependency_maps(all_aliases_maps).pop(package_name, None) - - if not aliases: - return dict() - - common_items = aliases.pop(_COMMON_CONDITION, {}).items() - - # If there are only common items in the dictionary, immediately return them - if not len(aliases.keys()) == 1: - return dict(common_items) - - # Build a single select statement where each conditional has accounted for the - # common set of aliases. - crate_aliases = {"//conditions:default": dict(common_items)} - for condition, deps in aliases.items(): - condition_triples = _CONDITIONS[condition] - for triple in condition_triples: - if triple in crate_aliases: - crate_aliases[triple].update(deps) - else: - crate_aliases.update({triple: dict(deps.items() + common_items)}) - - return select(crate_aliases) - -############################################################################### -# WORKSPACE MEMBER DEPS AND ALIASES -############################################################################### - -_NORMAL_DEPENDENCIES = { - "ruby/extractor": { - _COMMON_CONDITION: { - "clap": Label("@vendor_ts__clap-4.6.6//:clap"), - "encoding": Label("@vendor_ts__encoding-0.2.33//:encoding"), - "lazy_static": Label("@vendor_ts__lazy_static-1.5.0//:lazy_static"), - "rayon": Label("@vendor_ts__rayon-1.12.0//:rayon"), - "regex": Label("@vendor_ts__regex-1.13.1//:regex"), - "serde_json": Label("@vendor_ts__serde_json-1.0.151//:serde_json"), - "tracing": Label("@vendor_ts__tracing-0.1.44//:tracing"), - "tracing-subscriber": Label("@vendor_ts__tracing-subscriber-0.3.23//:tracing_subscriber"), - "tree-sitter": Label("@vendor_ts__tree-sitter-0.26.9//:tree_sitter"), - "tree-sitter-embedded-template": Label("@vendor_ts__tree-sitter-embedded-template-0.25.0//:tree_sitter_embedded_template"), - "tree-sitter-ruby": Label("@vendor_ts__tree-sitter-ruby-0.23.1//:tree_sitter_ruby"), - }, - }, - "rust/ast-generator": { - _COMMON_CONDITION: { - "anyhow": Label("@vendor_ts__anyhow-1.0.104//:anyhow"), - "either": Label("@vendor_ts__either-1.17.0//:either"), - "itertools": Label("@vendor_ts__itertools-0.15.0//:itertools"), - "mustache": Label("@vendor_ts__mustache-0.9.0//:mustache"), - "proc-macro2": Label("@vendor_ts__proc-macro2-1.0.107//:proc_macro2"), - "quote": Label("@vendor_ts__quote-1.0.47//:quote"), - "serde": Label("@vendor_ts__serde-1.0.229//:serde"), - "stdx": Label("@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx"), - "ungrammar": Label("@vendor_ts__ungrammar-1.16.1//:ungrammar"), - }, - }, - "rust/autobuild": { - }, - "rust/extractor": { - _COMMON_CONDITION: { - "anyhow": Label("@vendor_ts__anyhow-1.0.104//:anyhow"), - "argfile": Label("@vendor_ts__argfile-1.0.0//:argfile"), - "chalk-ir": Label("@vendor_ts__chalk-ir-0.104.0//:chalk_ir"), - "chrono": Label("@vendor_ts__chrono-0.4.45//:chrono"), - "clap": Label("@vendor_ts__clap-4.6.6//:clap"), - "dunce": Label("@vendor_ts__dunce-1.0.5//:dunce"), - "figment": Label("@vendor_ts__figment-0.10.19//:figment"), - "glob": Label("@vendor_ts__glob-0.3.4//:glob"), - "itertools": Label("@vendor_ts__itertools-0.15.0//:itertools"), - "mustache": Label("@vendor_ts__mustache-0.9.0//:mustache"), - "num-traits": Label("@vendor_ts__num-traits-0.2.19//:num_traits"), - "ra_ap_base_db": Label("@vendor_ts__ra_ap_base_db-0.0.347//:ra_ap_base_db"), - "ra_ap_cfg": Label("@vendor_ts__ra_ap_cfg-0.0.347//:ra_ap_cfg"), - "ra_ap_hir": Label("@vendor_ts__ra_ap_hir-0.0.347//:ra_ap_hir"), - "ra_ap_hir_def": Label("@vendor_ts__ra_ap_hir_def-0.0.347//:ra_ap_hir_def"), - "ra_ap_hir_expand": Label("@vendor_ts__ra_ap_hir_expand-0.0.347//:ra_ap_hir_expand"), - "ra_ap_hir_ty": Label("@vendor_ts__ra_ap_hir_ty-0.0.347//:ra_ap_hir_ty"), - "ra_ap_ide_db": Label("@vendor_ts__ra_ap_ide_db-0.0.347//:ra_ap_ide_db"), - "ra_ap_intern": Label("@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern"), - "ra_ap_load-cargo": Label("@vendor_ts__ra_ap_load-cargo-0.0.347//:ra_ap_load_cargo"), - "ra_ap_parser": Label("@vendor_ts__ra_ap_parser-0.0.347//:ra_ap_parser"), - "ra_ap_paths": Label("@vendor_ts__ra_ap_paths-0.0.347//:ra_ap_paths"), - "ra_ap_project_model": Label("@vendor_ts__ra_ap_project_model-0.0.347//:ra_ap_project_model"), - "ra_ap_span": Label("@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span"), - "ra_ap_syntax": Label("@vendor_ts__ra_ap_syntax-0.0.347//:ra_ap_syntax"), - "ra_ap_syntax-bridge": Label("@vendor_ts__ra_ap_syntax-bridge-0.0.347//:ra_ap_syntax_bridge"), - "ra_ap_vfs": Label("@vendor_ts__ra_ap_vfs-0.0.347//:ra_ap_vfs"), - "serde": Label("@vendor_ts__serde-1.0.229//:serde"), - "serde_json": Label("@vendor_ts__serde_json-1.0.151//:serde_json"), - "serde_with": Label("@vendor_ts__serde_with-3.22.0//:serde_with"), - "toml": Label("@vendor_ts__toml-1.1.4-spec-1.1.0//:toml"), - "tracing": Label("@vendor_ts__tracing-0.1.44//:tracing"), - "tracing-flame": Label("@vendor_ts__tracing-flame-0.2.0//:tracing_flame"), - "tracing-subscriber": Label("@vendor_ts__tracing-subscriber-0.3.23//:tracing_subscriber"), - "triomphe": Label("@vendor_ts__triomphe-0.1.16//:triomphe"), - }, - }, - "rust/extractor/macros": { - _COMMON_CONDITION: { - "quote": Label("@vendor_ts__quote-1.0.47//:quote"), - "syn": Label("@vendor_ts__syn-3.0.3//:syn"), - }, - }, - "shared/tree-sitter-extractor": { - _COMMON_CONDITION: { - "chrono": Label("@vendor_ts__chrono-0.4.45//:chrono"), - "encoding": Label("@vendor_ts__encoding-0.2.33//:encoding"), - "flate2": Label("@vendor_ts__flate2-1.1.9//:flate2"), - "globset": Label("@vendor_ts__globset-0.4.18//:globset"), - "lazy_static": Label("@vendor_ts__lazy_static-1.5.0//:lazy_static"), - "num_cpus": Label("@vendor_ts__num_cpus-1.17.0//:num_cpus"), - "rayon": Label("@vendor_ts__rayon-1.12.0//:rayon"), - "regex": Label("@vendor_ts__regex-1.13.1//:regex"), - "serde": Label("@vendor_ts__serde-1.0.229//:serde"), - "serde_json": Label("@vendor_ts__serde_json-1.0.151//:serde_json"), - "tracing": Label("@vendor_ts__tracing-0.1.44//:tracing"), - "tracing-subscriber": Label("@vendor_ts__tracing-subscriber-0.3.23//:tracing_subscriber"), - "tree-sitter": Label("@vendor_ts__tree-sitter-0.26.9//:tree_sitter"), - "zstd": Label("@vendor_ts__zstd-0.13.3//:zstd"), - }, - }, - "shared/yeast": { - _COMMON_CONDITION: { - "clap": Label("@vendor_ts__clap-4.6.6//:clap"), - "serde": Label("@vendor_ts__serde-1.0.229//:serde"), - "serde_json": Label("@vendor_ts__serde_json-1.0.151//:serde_json"), - "serde_yaml": Label("@vendor_ts__serde_yaml-0.9.34-deprecated//:serde_yaml"), - "tree-sitter": Label("@vendor_ts__tree-sitter-0.26.9//:tree_sitter"), - "tree-sitter-python": Label("@vendor_ts__tree-sitter-python-0.25.0//:tree_sitter_python"), - "tree-sitter-ruby": Label("@vendor_ts__tree-sitter-ruby-0.23.1//:tree_sitter_ruby"), - }, - }, - "shared/yeast-macros": { - _COMMON_CONDITION: { - "proc-macro2": Label("@vendor_ts__proc-macro2-1.0.107//:proc_macro2"), - "quote": Label("@vendor_ts__quote-1.0.47//:quote"), - "syn": Label("@vendor_ts__syn-3.0.3//:syn"), - }, - }, - "shared/yeast-schema": { - _COMMON_CONDITION: { - "serde": Label("@vendor_ts__serde-1.0.229//:serde"), - "serde_json": Label("@vendor_ts__serde_json-1.0.151//:serde_json"), - "serde_yaml": Label("@vendor_ts__serde_yaml-0.9.34-deprecated//:serde_yaml"), - }, - }, - "unified/extractor": { - _COMMON_CONDITION: { - "clap": Label("@vendor_ts__clap-4.6.6//:clap"), - "encoding": Label("@vendor_ts__encoding-0.2.33//:encoding"), - "lazy_static": Label("@vendor_ts__lazy_static-1.5.0//:lazy_static"), - "rayon": Label("@vendor_ts__rayon-1.12.0//:rayon"), - "regex": Label("@vendor_ts__regex-1.13.1//:regex"), - "serde_json": Label("@vendor_ts__serde_json-1.0.151//:serde_json"), - "tracing": Label("@vendor_ts__tracing-0.1.44//:tracing"), - "tracing-subscriber": Label("@vendor_ts__tracing-subscriber-0.3.23//:tracing_subscriber"), - }, - }, - "unified/swift-syntax-rs": { - _COMMON_CONDITION: { - }, - }, -} - -_NORMAL_ALIASES = { - "ruby/extractor": { - _COMMON_CONDITION: { - }, - }, - "rust/ast-generator": { - _COMMON_CONDITION: { - Label("@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx"): "stdx", - }, - }, - "rust/autobuild": { - }, - "rust/extractor": { - _COMMON_CONDITION: { - }, - }, - "rust/extractor/macros": { - _COMMON_CONDITION: { - }, - }, - "shared/tree-sitter-extractor": { - _COMMON_CONDITION: { - }, - }, - "shared/yeast": { - _COMMON_CONDITION: { - }, - }, - "shared/yeast-macros": { - _COMMON_CONDITION: { - }, - }, - "shared/yeast-schema": { - _COMMON_CONDITION: { - }, - }, - "unified/extractor": { - _COMMON_CONDITION: { - }, - }, - "unified/swift-syntax-rs": { - _COMMON_CONDITION: { - }, - }, -} - -_NORMAL_DEV_DEPENDENCIES = { - "ruby/extractor": { - }, - "rust/ast-generator": { - }, - "rust/autobuild": { - }, - "rust/extractor": { - }, - "rust/extractor/macros": { - }, - "shared/tree-sitter-extractor": { - _COMMON_CONDITION: { - "rand": Label("@vendor_ts__rand-0.10.2//:rand"), - "tree-sitter-json": Label("@vendor_ts__tree-sitter-json-0.24.8//:tree_sitter_json"), - "tree-sitter-ql": Label("@vendor_ts__tree-sitter-ql-0.23.1//:tree_sitter_ql"), - }, - }, - "shared/yeast": { - }, - "shared/yeast-macros": { - }, - "shared/yeast-schema": { - }, - "unified/extractor": { - }, - "unified/swift-syntax-rs": { - }, -} - -_NORMAL_DEV_ALIASES = { - "ruby/extractor": { - }, - "rust/ast-generator": { - }, - "rust/autobuild": { - }, - "rust/extractor": { - }, - "rust/extractor/macros": { - }, - "shared/tree-sitter-extractor": { - _COMMON_CONDITION: { - }, - }, - "shared/yeast": { - }, - "shared/yeast-macros": { - }, - "shared/yeast-schema": { - }, - "unified/extractor": { - }, - "unified/swift-syntax-rs": { - }, -} - -_PROC_MACRO_DEPENDENCIES = { - "ruby/extractor": { - }, - "rust/ast-generator": { - }, - "rust/autobuild": { - }, - "rust/extractor": { - }, - "rust/extractor/macros": { - }, - "shared/tree-sitter-extractor": { - }, - "shared/yeast": { - }, - "shared/yeast-macros": { - }, - "shared/yeast-schema": { - }, - "unified/extractor": { - }, - "unified/swift-syntax-rs": { - }, -} - -_PROC_MACRO_ALIASES = { - "ruby/extractor": { - }, - "rust/ast-generator": { - }, - "rust/autobuild": { - }, - "rust/extractor": { - }, - "rust/extractor/macros": { - }, - "shared/tree-sitter-extractor": { - }, - "shared/yeast": { - }, - "shared/yeast-macros": { - }, - "shared/yeast-schema": { - }, - "unified/extractor": { - }, - "unified/swift-syntax-rs": { - }, -} - -_PROC_MACRO_DEV_DEPENDENCIES = { - "ruby/extractor": { - }, - "rust/ast-generator": { - }, - "rust/autobuild": { - }, - "rust/extractor": { - }, - "rust/extractor/macros": { - }, - "shared/tree-sitter-extractor": { - }, - "shared/yeast": { - }, - "shared/yeast-macros": { - }, - "shared/yeast-schema": { - }, - "unified/extractor": { - }, - "unified/swift-syntax-rs": { - }, -} - -_PROC_MACRO_DEV_ALIASES = { - "ruby/extractor": { - }, - "rust/ast-generator": { - }, - "rust/autobuild": { - }, - "rust/extractor": { - }, - "rust/extractor/macros": { - }, - "shared/tree-sitter-extractor": { - _COMMON_CONDITION: { - }, - }, - "shared/yeast": { - }, - "shared/yeast-macros": { - }, - "shared/yeast-schema": { - }, - "unified/extractor": { - }, - "unified/swift-syntax-rs": { - }, -} - -_BUILD_DEPENDENCIES = { - "ruby/extractor": { - }, - "rust/ast-generator": { - }, - "rust/autobuild": { - }, - "rust/extractor": { - }, - "rust/extractor/macros": { - }, - "shared/tree-sitter-extractor": { - }, - "shared/yeast": { - }, - "shared/yeast-macros": { - }, - "shared/yeast-schema": { - }, - "unified/extractor": { - }, - "unified/swift-syntax-rs": { - }, -} - -_BUILD_ALIASES = { - "ruby/extractor": { - }, - "rust/ast-generator": { - }, - "rust/autobuild": { - }, - "rust/extractor": { - }, - "rust/extractor/macros": { - }, - "shared/tree-sitter-extractor": { - }, - "shared/yeast": { - }, - "shared/yeast-macros": { - }, - "shared/yeast-schema": { - }, - "unified/extractor": { - }, - "unified/swift-syntax-rs": { - }, -} - -_BUILD_PROC_MACRO_DEPENDENCIES = { - "ruby/extractor": { - }, - "rust/ast-generator": { - }, - "rust/autobuild": { - }, - "rust/extractor": { - }, - "rust/extractor/macros": { - }, - "shared/tree-sitter-extractor": { - }, - "shared/yeast": { - }, - "shared/yeast-macros": { - }, - "shared/yeast-schema": { - }, - "unified/extractor": { - }, - "unified/swift-syntax-rs": { - }, -} - -_BUILD_PROC_MACRO_ALIASES = { - "ruby/extractor": { - }, - "rust/ast-generator": { - }, - "rust/autobuild": { - }, - "rust/extractor": { - }, - "rust/extractor/macros": { - }, - "shared/tree-sitter-extractor": { - }, - "shared/yeast": { - }, - "shared/yeast-macros": { - }, - "shared/yeast-schema": { - }, - "unified/extractor": { - }, - "unified/swift-syntax-rs": { - }, -} - -_CONDITIONS = { - "aarch64-apple-darwin": ["@rules_rust//rust/platform:aarch64-apple-darwin"], - "aarch64-apple-ios": ["@rules_rust//rust/platform:aarch64-apple-ios"], - "aarch64-apple-ios-sim": ["@rules_rust//rust/platform:aarch64-apple-ios-sim"], - "aarch64-linux-android": ["@rules_rust//rust/platform:aarch64-linux-android"], - "aarch64-pc-windows-gnullvm": [], - "aarch64-pc-windows-msvc": ["@rules_rust//rust/platform:aarch64-pc-windows-msvc"], - "aarch64-unknown-fuchsia": ["@rules_rust//rust/platform:aarch64-unknown-fuchsia"], - "aarch64-unknown-linux-gnu": ["@rules_rust//rust/platform:aarch64-unknown-linux-gnu", "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu"], - "aarch64-unknown-nixos-gnu": ["@rules_rust//rust/platform:aarch64-unknown-nixos-gnu"], - "aarch64-unknown-nto-qnx710": ["@rules_rust//rust/platform:aarch64-unknown-nto-qnx710"], - "aarch64-unknown-uefi": ["@rules_rust//rust/platform:aarch64-unknown-uefi"], - "arm-unknown-linux-gnueabi": ["@rules_rust//rust/platform:arm-unknown-linux-gnueabi"], - "arm-unknown-linux-musleabi": ["@rules_rust//rust/platform:arm-unknown-linux-musleabi"], - "armv7-linux-androideabi": ["@rules_rust//rust/platform:armv7-linux-androideabi"], - "armv7-unknown-linux-gnueabi": ["@rules_rust//rust/platform:armv7-unknown-linux-gnueabi"], - "cfg(all(any(target_arch = \"x86_64\", target_arch = \"arm64ec\"), target_env = \"msvc\", not(windows_raw_dylib)))": ["@rules_rust//rust/platform:x86_64-pc-windows-msvc"], - "cfg(all(any(target_os = \"linux\", target_os = \"android\"), not(any(all(target_os = \"linux\", target_env = \"\"), getrandom_backend = \"custom\", getrandom_backend = \"linux_raw\", getrandom_backend = \"rdrand\", getrandom_backend = \"rndr\"))))": ["@rules_rust//rust/platform:aarch64-linux-android", "@rules_rust//rust/platform:aarch64-unknown-linux-gnu", "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu", "@rules_rust//rust/platform:arm-unknown-linux-gnueabi", "@rules_rust//rust/platform:arm-unknown-linux-musleabi", "@rules_rust//rust/platform:armv7-linux-androideabi", "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi", "@rules_rust//rust/platform:i686-linux-android", "@rules_rust//rust/platform:i686-unknown-linux-gnu", "@rules_rust//rust/platform:powerpc-unknown-linux-gnu", "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu", "@rules_rust//rust/platform:s390x-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-linux-android", "@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], - "cfg(all(target_arch = \"aarch64\", target_env = \"msvc\", not(windows_raw_dylib)))": ["@rules_rust//rust/platform:aarch64-pc-windows-msvc"], - "cfg(all(target_arch = \"aarch64\", target_os = \"android\"))": ["@rules_rust//rust/platform:aarch64-linux-android"], - "cfg(all(target_arch = \"aarch64\", target_os = \"linux\"))": ["@rules_rust//rust/platform:aarch64-unknown-linux-gnu", "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu"], - "cfg(all(target_arch = \"aarch64\", target_vendor = \"apple\"))": ["@rules_rust//rust/platform:aarch64-apple-darwin", "@rules_rust//rust/platform:aarch64-apple-ios", "@rules_rust//rust/platform:aarch64-apple-ios-sim"], - "cfg(all(target_arch = \"loongarch64\", target_os = \"linux\"))": [], - "cfg(all(target_arch = \"wasm32\", target_os = \"unknown\"))": ["@rules_rust//rust/platform:wasm32-unknown-unknown"], - "cfg(all(target_arch = \"x86\", target_env = \"gnu\", not(target_abi = \"llvm\"), not(windows_raw_dylib)))": ["@rules_rust//rust/platform:i686-unknown-linux-gnu"], - "cfg(all(target_arch = \"x86\", target_env = \"msvc\", not(windows_raw_dylib)))": ["@rules_rust//rust/platform:i686-pc-windows-msvc"], - "cfg(all(target_arch = \"x86_64\", target_env = \"gnu\", not(target_abi = \"llvm\"), not(windows_raw_dylib)))": ["@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], - "cfg(all(target_os = \"linux\", not(target_env = \"ohos\"), any(target_arch = \"x86\", target_arch = \"x86_64\", target_arch = \"aarch64\")))": ["@rules_rust//rust/platform:aarch64-unknown-linux-gnu", "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu", "@rules_rust//rust/platform:i686-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], - "cfg(all(target_os = \"linux\", target_env = \"gnu\"))": ["@rules_rust//rust/platform:aarch64-unknown-linux-gnu", "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu", "@rules_rust//rust/platform:arm-unknown-linux-gnueabi", "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi", "@rules_rust//rust/platform:i686-unknown-linux-gnu", "@rules_rust//rust/platform:powerpc-unknown-linux-gnu", "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu", "@rules_rust//rust/platform:s390x-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], - "cfg(all(target_os = \"uefi\", getrandom_backend = \"efi_rng\"))": [], - "cfg(any())": [], - "cfg(any(target_arch = \"x86_64\", target_arch = \"x86\"))": ["@rules_rust//rust/platform:i686-apple-darwin", "@rules_rust//rust/platform:i686-linux-android", "@rules_rust//rust/platform:i686-pc-windows-msvc", "@rules_rust//rust/platform:i686-unknown-freebsd", "@rules_rust//rust/platform:i686-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-apple-darwin", "@rules_rust//rust/platform:x86_64-apple-ios", "@rules_rust//rust/platform:x86_64-linux-android", "@rules_rust//rust/platform:x86_64-pc-windows-msvc", "@rules_rust//rust/platform:x86_64-unknown-freebsd", "@rules_rust//rust/platform:x86_64-unknown-fuchsia", "@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu", "@rules_rust//rust/platform:x86_64-unknown-none", "@rules_rust//rust/platform:x86_64-unknown-uefi"], - "cfg(any(target_os = \"dragonfly\", target_os = \"freebsd\", target_os = \"hurd\", target_os = \"illumos\", target_os = \"cygwin\", all(target_os = \"horizon\", target_arch = \"arm\")))": ["@rules_rust//rust/platform:i686-unknown-freebsd", "@rules_rust//rust/platform:x86_64-unknown-freebsd"], - "cfg(any(target_os = \"freebsd\", target_os = \"openbsd\", target_os = \"netbsd\", target_os = \"dragonflybsd\", target_os = \"ios\"))": ["@rules_rust//rust/platform:aarch64-apple-ios", "@rules_rust//rust/platform:aarch64-apple-ios-sim", "@rules_rust//rust/platform:i686-unknown-freebsd", "@rules_rust//rust/platform:x86_64-apple-ios", "@rules_rust//rust/platform:x86_64-unknown-freebsd"], - "cfg(any(target_os = \"haiku\", target_os = \"redox\", target_os = \"nto\", target_os = \"aix\"))": ["@rules_rust//rust/platform:aarch64-unknown-nto-qnx710"], - "cfg(any(target_os = \"ios\", target_os = \"visionos\", target_os = \"watchos\", target_os = \"tvos\"))": ["@rules_rust//rust/platform:aarch64-apple-ios", "@rules_rust//rust/platform:aarch64-apple-ios-sim", "@rules_rust//rust/platform:x86_64-apple-ios"], - "cfg(any(target_os = \"linux\", target_os = \"android\"))": ["@rules_rust//rust/platform:aarch64-linux-android", "@rules_rust//rust/platform:aarch64-unknown-linux-gnu", "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu", "@rules_rust//rust/platform:arm-unknown-linux-gnueabi", "@rules_rust//rust/platform:arm-unknown-linux-musleabi", "@rules_rust//rust/platform:armv7-linux-androideabi", "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi", "@rules_rust//rust/platform:i686-linux-android", "@rules_rust//rust/platform:i686-unknown-linux-gnu", "@rules_rust//rust/platform:powerpc-unknown-linux-gnu", "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu", "@rules_rust//rust/platform:s390x-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-linux-android", "@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], - "cfg(any(target_os = \"macos\", target_os = \"ios\", target_os = \"freebsd\"))": ["@rules_rust//rust/platform:aarch64-apple-darwin", "@rules_rust//rust/platform:aarch64-apple-ios", "@rules_rust//rust/platform:aarch64-apple-ios-sim", "@rules_rust//rust/platform:i686-apple-darwin", "@rules_rust//rust/platform:i686-unknown-freebsd", "@rules_rust//rust/platform:x86_64-apple-darwin", "@rules_rust//rust/platform:x86_64-apple-ios", "@rules_rust//rust/platform:x86_64-unknown-freebsd"], - "cfg(any(target_os = \"macos\", target_os = \"openbsd\", target_os = \"vita\", target_os = \"emscripten\"))": ["@rules_rust//rust/platform:aarch64-apple-darwin", "@rules_rust//rust/platform:i686-apple-darwin", "@rules_rust//rust/platform:wasm32-unknown-emscripten", "@rules_rust//rust/platform:x86_64-apple-darwin"], - "cfg(any(target_pointer_width = \"8\", target_pointer_width = \"16\", target_pointer_width = \"32\"))": ["@rules_rust//rust/platform:arm-unknown-linux-gnueabi", "@rules_rust//rust/platform:arm-unknown-linux-musleabi", "@rules_rust//rust/platform:armv7-linux-androideabi", "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi", "@rules_rust//rust/platform:i686-apple-darwin", "@rules_rust//rust/platform:i686-linux-android", "@rules_rust//rust/platform:i686-pc-windows-msvc", "@rules_rust//rust/platform:i686-unknown-freebsd", "@rules_rust//rust/platform:i686-unknown-linux-gnu", "@rules_rust//rust/platform:powerpc-unknown-linux-gnu", "@rules_rust//rust/platform:riscv32imc-unknown-none-elf", "@rules_rust//rust/platform:thumbv7em-none-eabi", "@rules_rust//rust/platform:thumbv8m.main-none-eabi", "@rules_rust//rust/platform:wasm32-unknown-emscripten", "@rules_rust//rust/platform:wasm32-unknown-unknown", "@rules_rust//rust/platform:wasm32-wasip1", "@rules_rust//rust/platform:wasm32-wasip1-threads", "@rules_rust//rust/platform:wasm32-wasip2"], - "cfg(any(unix, target_os = \"hermit\", target_os = \"wasi\"))": ["@rules_rust//rust/platform:aarch64-apple-darwin", "@rules_rust//rust/platform:aarch64-apple-ios", "@rules_rust//rust/platform:aarch64-apple-ios-sim", "@rules_rust//rust/platform:aarch64-linux-android", "@rules_rust//rust/platform:aarch64-unknown-fuchsia", "@rules_rust//rust/platform:aarch64-unknown-linux-gnu", "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu", "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710", "@rules_rust//rust/platform:arm-unknown-linux-gnueabi", "@rules_rust//rust/platform:arm-unknown-linux-musleabi", "@rules_rust//rust/platform:armv7-linux-androideabi", "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi", "@rules_rust//rust/platform:i686-apple-darwin", "@rules_rust//rust/platform:i686-linux-android", "@rules_rust//rust/platform:i686-unknown-freebsd", "@rules_rust//rust/platform:i686-unknown-linux-gnu", "@rules_rust//rust/platform:powerpc-unknown-linux-gnu", "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu", "@rules_rust//rust/platform:s390x-unknown-linux-gnu", "@rules_rust//rust/platform:wasm32-unknown-emscripten", "@rules_rust//rust/platform:wasm32-wasip1", "@rules_rust//rust/platform:wasm32-wasip1-threads", "@rules_rust//rust/platform:wasm32-wasip2", "@rules_rust//rust/platform:x86_64-apple-darwin", "@rules_rust//rust/platform:x86_64-apple-ios", "@rules_rust//rust/platform:x86_64-linux-android", "@rules_rust//rust/platform:x86_64-unknown-freebsd", "@rules_rust//rust/platform:x86_64-unknown-fuchsia", "@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], - "cfg(not(target_has_atomic = \"ptr\"))": ["@rules_rust//rust/platform:riscv32imc-unknown-none-elf"], - "cfg(not(windows))": ["@rules_rust//rust/platform:aarch64-apple-darwin", "@rules_rust//rust/platform:aarch64-apple-ios", "@rules_rust//rust/platform:aarch64-apple-ios-sim", "@rules_rust//rust/platform:aarch64-linux-android", "@rules_rust//rust/platform:aarch64-unknown-fuchsia", "@rules_rust//rust/platform:aarch64-unknown-linux-gnu", "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu", "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710", "@rules_rust//rust/platform:aarch64-unknown-uefi", "@rules_rust//rust/platform:arm-unknown-linux-gnueabi", "@rules_rust//rust/platform:arm-unknown-linux-musleabi", "@rules_rust//rust/platform:armv7-linux-androideabi", "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi", "@rules_rust//rust/platform:i686-apple-darwin", "@rules_rust//rust/platform:i686-linux-android", "@rules_rust//rust/platform:i686-unknown-freebsd", "@rules_rust//rust/platform:i686-unknown-linux-gnu", "@rules_rust//rust/platform:powerpc-unknown-linux-gnu", "@rules_rust//rust/platform:riscv32imc-unknown-none-elf", "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu", "@rules_rust//rust/platform:riscv64gc-unknown-none-elf", "@rules_rust//rust/platform:s390x-unknown-linux-gnu", "@rules_rust//rust/platform:thumbv7em-none-eabi", "@rules_rust//rust/platform:thumbv8m.main-none-eabi", "@rules_rust//rust/platform:wasm32-unknown-emscripten", "@rules_rust//rust/platform:wasm32-unknown-unknown", "@rules_rust//rust/platform:wasm32-wasip1", "@rules_rust//rust/platform:wasm32-wasip1-threads", "@rules_rust//rust/platform:wasm32-wasip2", "@rules_rust//rust/platform:x86_64-apple-darwin", "@rules_rust//rust/platform:x86_64-apple-ios", "@rules_rust//rust/platform:x86_64-linux-android", "@rules_rust//rust/platform:x86_64-unknown-freebsd", "@rules_rust//rust/platform:x86_64-unknown-fuchsia", "@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu", "@rules_rust//rust/platform:x86_64-unknown-none", "@rules_rust//rust/platform:x86_64-unknown-uefi"], - "cfg(target_family = \"wasm\")": ["@rules_rust//rust/platform:wasm32-unknown-emscripten", "@rules_rust//rust/platform:wasm32-unknown-unknown", "@rules_rust//rust/platform:wasm32-wasip1", "@rules_rust//rust/platform:wasm32-wasip1-threads", "@rules_rust//rust/platform:wasm32-wasip2"], - "cfg(target_os = \"android\")": ["@rules_rust//rust/platform:aarch64-linux-android", "@rules_rust//rust/platform:armv7-linux-androideabi", "@rules_rust//rust/platform:i686-linux-android", "@rules_rust//rust/platform:x86_64-linux-android"], - "cfg(target_os = \"haiku\")": [], - "cfg(target_os = \"hermit\")": [], - "cfg(target_os = \"macos\")": ["@rules_rust//rust/platform:aarch64-apple-darwin", "@rules_rust//rust/platform:i686-apple-darwin", "@rules_rust//rust/platform:x86_64-apple-darwin"], - "cfg(target_os = \"netbsd\")": [], - "cfg(target_os = \"redox\")": [], - "cfg(target_os = \"solaris\")": [], - "cfg(target_os = \"vxworks\")": [], - "cfg(target_os = \"wasi\")": ["@rules_rust//rust/platform:wasm32-wasip1", "@rules_rust//rust/platform:wasm32-wasip1-threads", "@rules_rust//rust/platform:wasm32-wasip2"], - "cfg(target_os = \"windows\")": ["@rules_rust//rust/platform:aarch64-pc-windows-msvc", "@rules_rust//rust/platform:i686-pc-windows-msvc", "@rules_rust//rust/platform:x86_64-pc-windows-msvc"], - "cfg(target_vendor = \"apple\")": ["@rules_rust//rust/platform:aarch64-apple-darwin", "@rules_rust//rust/platform:aarch64-apple-ios", "@rules_rust//rust/platform:aarch64-apple-ios-sim", "@rules_rust//rust/platform:i686-apple-darwin", "@rules_rust//rust/platform:x86_64-apple-darwin", "@rules_rust//rust/platform:x86_64-apple-ios"], - "cfg(unix)": ["@rules_rust//rust/platform:aarch64-apple-darwin", "@rules_rust//rust/platform:aarch64-apple-ios", "@rules_rust//rust/platform:aarch64-apple-ios-sim", "@rules_rust//rust/platform:aarch64-linux-android", "@rules_rust//rust/platform:aarch64-unknown-fuchsia", "@rules_rust//rust/platform:aarch64-unknown-linux-gnu", "@rules_rust//rust/platform:aarch64-unknown-nixos-gnu", "@rules_rust//rust/platform:aarch64-unknown-nto-qnx710", "@rules_rust//rust/platform:arm-unknown-linux-gnueabi", "@rules_rust//rust/platform:arm-unknown-linux-musleabi", "@rules_rust//rust/platform:armv7-linux-androideabi", "@rules_rust//rust/platform:armv7-unknown-linux-gnueabi", "@rules_rust//rust/platform:i686-apple-darwin", "@rules_rust//rust/platform:i686-linux-android", "@rules_rust//rust/platform:i686-unknown-freebsd", "@rules_rust//rust/platform:i686-unknown-linux-gnu", "@rules_rust//rust/platform:powerpc-unknown-linux-gnu", "@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu", "@rules_rust//rust/platform:s390x-unknown-linux-gnu", "@rules_rust//rust/platform:wasm32-unknown-emscripten", "@rules_rust//rust/platform:x86_64-apple-darwin", "@rules_rust//rust/platform:x86_64-apple-ios", "@rules_rust//rust/platform:x86_64-linux-android", "@rules_rust//rust/platform:x86_64-unknown-freebsd", "@rules_rust//rust/platform:x86_64-unknown-fuchsia", "@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], - "cfg(windows)": ["@rules_rust//rust/platform:aarch64-pc-windows-msvc", "@rules_rust//rust/platform:i686-pc-windows-msvc", "@rules_rust//rust/platform:x86_64-pc-windows-msvc"], - "cfg(windows_raw_dylib)": [], - "i686-apple-darwin": ["@rules_rust//rust/platform:i686-apple-darwin"], - "i686-linux-android": ["@rules_rust//rust/platform:i686-linux-android"], - "i686-pc-windows-gnullvm": [], - "i686-pc-windows-msvc": ["@rules_rust//rust/platform:i686-pc-windows-msvc"], - "i686-unknown-freebsd": ["@rules_rust//rust/platform:i686-unknown-freebsd"], - "i686-unknown-linux-gnu": ["@rules_rust//rust/platform:i686-unknown-linux-gnu"], - "powerpc-unknown-linux-gnu": ["@rules_rust//rust/platform:powerpc-unknown-linux-gnu"], - "riscv32imc-unknown-none-elf": ["@rules_rust//rust/platform:riscv32imc-unknown-none-elf"], - "riscv64gc-unknown-linux-gnu": ["@rules_rust//rust/platform:riscv64gc-unknown-linux-gnu"], - "riscv64gc-unknown-none-elf": ["@rules_rust//rust/platform:riscv64gc-unknown-none-elf"], - "s390x-unknown-linux-gnu": ["@rules_rust//rust/platform:s390x-unknown-linux-gnu"], - "thumbv7em-none-eabi": ["@rules_rust//rust/platform:thumbv7em-none-eabi"], - "thumbv8m.main-none-eabi": ["@rules_rust//rust/platform:thumbv8m.main-none-eabi"], - "wasm32-unknown-emscripten": ["@rules_rust//rust/platform:wasm32-unknown-emscripten"], - "wasm32-unknown-unknown": ["@rules_rust//rust/platform:wasm32-unknown-unknown"], - "wasm32-wasip1": ["@rules_rust//rust/platform:wasm32-wasip1"], - "wasm32-wasip1-threads": ["@rules_rust//rust/platform:wasm32-wasip1-threads"], - "wasm32-wasip2": ["@rules_rust//rust/platform:wasm32-wasip2"], - "x86_64-apple-darwin": ["@rules_rust//rust/platform:x86_64-apple-darwin"], - "x86_64-apple-ios": ["@rules_rust//rust/platform:x86_64-apple-ios"], - "x86_64-linux-android": ["@rules_rust//rust/platform:x86_64-linux-android"], - "x86_64-pc-windows-gnullvm": [], - "x86_64-pc-windows-msvc": ["@rules_rust//rust/platform:x86_64-pc-windows-msvc"], - "x86_64-unknown-freebsd": ["@rules_rust//rust/platform:x86_64-unknown-freebsd"], - "x86_64-unknown-fuchsia": ["@rules_rust//rust/platform:x86_64-unknown-fuchsia"], - "x86_64-unknown-linux-gnu": ["@rules_rust//rust/platform:x86_64-unknown-linux-gnu", "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], - "x86_64-unknown-nixos-gnu": ["@rules_rust//rust/platform:x86_64-unknown-nixos-gnu"], - "x86_64-unknown-none": ["@rules_rust//rust/platform:x86_64-unknown-none"], - "x86_64-unknown-uefi": ["@rules_rust//rust/platform:x86_64-unknown-uefi"], -} - -############################################################################### - -def crate_repositories(): - """A macro for defining repositories for all generated crates. - - Returns: - A list of repos visible to the module through the module extension. - """ - maybe( - http_archive, - name = "vendor_ts__adler2-2.0.1", - sha256 = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa", - type = "tar.gz", - urls = ["https://static.crates.io/crates/adler2/2.0.1/download"], - strip_prefix = "adler2-2.0.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.adler2-2.0.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__aho-corasick-1.1.5", - sha256 = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba", - type = "tar.gz", - urls = ["https://static.crates.io/crates/aho-corasick/1.1.5/download"], - strip_prefix = "aho-corasick-1.1.5", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.aho-corasick-1.1.5.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__allocator-api2-0.2.21", - sha256 = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923", - type = "tar.gz", - urls = ["https://static.crates.io/crates/allocator-api2/0.2.21/download"], - strip_prefix = "allocator-api2-0.2.21", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.allocator-api2-0.2.21.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__android_system_properties-0.1.5", - sha256 = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311", - type = "tar.gz", - urls = ["https://static.crates.io/crates/android_system_properties/0.1.5/download"], - strip_prefix = "android_system_properties-0.1.5", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.android_system_properties-0.1.5.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__anstream-1.0.0", - sha256 = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d", - type = "tar.gz", - urls = ["https://static.crates.io/crates/anstream/1.0.0/download"], - strip_prefix = "anstream-1.0.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.anstream-1.0.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__anstyle-1.0.14", - sha256 = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000", - type = "tar.gz", - urls = ["https://static.crates.io/crates/anstyle/1.0.14/download"], - strip_prefix = "anstyle-1.0.14", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.anstyle-1.0.14.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__anstyle-parse-1.0.0", - sha256 = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e", - type = "tar.gz", - urls = ["https://static.crates.io/crates/anstyle-parse/1.0.0/download"], - strip_prefix = "anstyle-parse-1.0.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.anstyle-parse-1.0.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__anstyle-query-1.1.5", - sha256 = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc", - type = "tar.gz", - urls = ["https://static.crates.io/crates/anstyle-query/1.1.5/download"], - strip_prefix = "anstyle-query-1.1.5", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.anstyle-query-1.1.5.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__anstyle-wincon-3.0.11", - sha256 = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d", - type = "tar.gz", - urls = ["https://static.crates.io/crates/anstyle-wincon/3.0.11/download"], - strip_prefix = "anstyle-wincon-3.0.11", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.anstyle-wincon-3.0.11.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__anyhow-1.0.104", - sha256 = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470", - type = "tar.gz", - urls = ["https://static.crates.io/crates/anyhow/1.0.104/download"], - strip_prefix = "anyhow-1.0.104", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.anyhow-1.0.104.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__argfile-1.0.0", - sha256 = "99489a733dea0d2930bfa59c243146a8513ce7b0991b9d006647687cc61f53e7", - type = "tar.gz", - urls = ["https://static.crates.io/crates/argfile/1.0.0/download"], - strip_prefix = "argfile-1.0.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.argfile-1.0.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__arrayvec-0.7.8", - sha256 = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56", - type = "tar.gz", - urls = ["https://static.crates.io/crates/arrayvec/0.7.8/download"], - strip_prefix = "arrayvec-0.7.8", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.arrayvec-0.7.8.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__atomic-0.6.1", - sha256 = "a89cbf775b137e9b968e67227ef7f775587cde3fd31b0d8599dbd0f598a48340", - type = "tar.gz", - urls = ["https://static.crates.io/crates/atomic/0.6.1/download"], - strip_prefix = "atomic-0.6.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.atomic-0.6.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__autocfg-1.5.1", - sha256 = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53", - type = "tar.gz", - urls = ["https://static.crates.io/crates/autocfg/1.5.1/download"], - strip_prefix = "autocfg-1.5.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.autocfg-1.5.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__base64-0.22.1", - sha256 = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6", - type = "tar.gz", - urls = ["https://static.crates.io/crates/base64/0.22.1/download"], - strip_prefix = "base64-0.22.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.base64-0.22.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__bitflags-1.3.2", - sha256 = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a", - type = "tar.gz", - urls = ["https://static.crates.io/crates/bitflags/1.3.2/download"], - strip_prefix = "bitflags-1.3.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.bitflags-1.3.2.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__bitflags-2.13.1", - sha256 = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da", - type = "tar.gz", - urls = ["https://static.crates.io/crates/bitflags/2.13.1/download"], - strip_prefix = "bitflags-2.13.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.bitflags-2.13.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__borsh-1.8.0", - sha256 = "a88b7ea17d208c4193f2c1e6de3c35fe71f98c96982d5ced308bdcc749ff6e1f", - type = "tar.gz", - urls = ["https://static.crates.io/crates/borsh/1.8.0/download"], - strip_prefix = "borsh-1.8.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.borsh-1.8.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__boxcar-0.2.14", - sha256 = "36f64beae40a84da1b4b26ff2761a5b895c12adc41dc25aaee1c4f2bbfe97a6e", - type = "tar.gz", - urls = ["https://static.crates.io/crates/boxcar/0.2.14/download"], - strip_prefix = "boxcar-0.2.14", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.boxcar-0.2.14.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__bs58-0.5.1", - sha256 = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4", - type = "tar.gz", - urls = ["https://static.crates.io/crates/bs58/0.5.1/download"], - strip_prefix = "bs58-0.5.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.bs58-0.5.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__bstr-1.12.1", - sha256 = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab", - type = "tar.gz", - urls = ["https://static.crates.io/crates/bstr/1.12.1/download"], - strip_prefix = "bstr-1.12.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.bstr-1.12.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__bumpalo-3.20.3", - sha256 = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649", - type = "tar.gz", - urls = ["https://static.crates.io/crates/bumpalo/3.20.3/download"], - strip_prefix = "bumpalo-3.20.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.bumpalo-3.20.3.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__bytemuck-1.25.0", - sha256 = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec", - type = "tar.gz", - urls = ["https://static.crates.io/crates/bytemuck/1.25.0/download"], - strip_prefix = "bytemuck-1.25.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.bytemuck-1.25.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__bytes-1.12.1", - sha256 = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04", - type = "tar.gz", - urls = ["https://static.crates.io/crates/bytes/1.12.1/download"], - strip_prefix = "bytes-1.12.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.bytes-1.12.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__camino-1.2.5", - sha256 = "bb1307f12aa967b5a58416e87b3653360e0fd614a016b6e970db08fecbb1b80d", - type = "tar.gz", - urls = ["https://static.crates.io/crates/camino/1.2.5/download"], - strip_prefix = "camino-1.2.5", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.camino-1.2.5.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__cargo-platform-0.3.3", - sha256 = "dd0061da739915fae12ea00e16397555ed4371a6bb285431aab930f61b0aa4ba", - type = "tar.gz", - urls = ["https://static.crates.io/crates/cargo-platform/0.3.3/download"], - strip_prefix = "cargo-platform-0.3.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cargo-platform-0.3.3.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__cargo_metadata-0.23.1", - sha256 = "ef987d17b0a113becdd19d3d0022d04d7ef41f9efe4f3fb63ac44ba61df3ade9", - type = "tar.gz", - urls = ["https://static.crates.io/crates/cargo_metadata/0.23.1/download"], - strip_prefix = "cargo_metadata-0.23.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cargo_metadata-0.23.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__cc-1.4.2", - sha256 = "5d262e149917187838d5b42777c8253bcb64500067342904e7d429499a6f277e", - type = "tar.gz", - urls = ["https://static.crates.io/crates/cc/1.4.2/download"], - strip_prefix = "cc-1.4.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cc-1.4.2.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__cfg-if-1.0.4", - sha256 = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801", - type = "tar.gz", - urls = ["https://static.crates.io/crates/cfg-if/1.0.4/download"], - strip_prefix = "cfg-if-1.0.4", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cfg-if-1.0.4.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__cfg_aliases-0.2.2", - sha256 = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527", - type = "tar.gz", - urls = ["https://static.crates.io/crates/cfg_aliases/0.2.2/download"], - strip_prefix = "cfg_aliases-0.2.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cfg_aliases-0.2.2.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__chacha20-0.10.1", - sha256 = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81", - type = "tar.gz", - urls = ["https://static.crates.io/crates/chacha20/0.10.1/download"], - strip_prefix = "chacha20-0.10.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.chacha20-0.10.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__chalk-derive-0.104.0", - sha256 = "9ea9b1e80910f66ae87c772247591432032ef3f6a67367ff17f8343db05beafa", - type = "tar.gz", - urls = ["https://static.crates.io/crates/chalk-derive/0.104.0/download"], - strip_prefix = "chalk-derive-0.104.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.chalk-derive-0.104.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__chalk-ir-0.104.0", - sha256 = "7047a516de16226cd17344d41a319d0ea1064bf9e60bd612ab341ab4a34bbfa8", - type = "tar.gz", - urls = ["https://static.crates.io/crates/chalk-ir/0.104.0/download"], - strip_prefix = "chalk-ir-0.104.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.chalk-ir-0.104.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__chrono-0.4.45", - sha256 = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327", - type = "tar.gz", - urls = ["https://static.crates.io/crates/chrono/0.4.45/download"], - strip_prefix = "chrono-0.4.45", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.chrono-0.4.45.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__clap-4.6.6", - sha256 = "473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca", - type = "tar.gz", - urls = ["https://static.crates.io/crates/clap/4.6.6/download"], - strip_prefix = "clap-4.6.6", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.clap-4.6.6.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__clap_builder-4.6.6", - sha256 = "7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889", - type = "tar.gz", - urls = ["https://static.crates.io/crates/clap_builder/4.6.6/download"], - strip_prefix = "clap_builder-4.6.6", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.clap_builder-4.6.6.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__clap_derive-4.6.4", - sha256 = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061", - type = "tar.gz", - urls = ["https://static.crates.io/crates/clap_derive/4.6.4/download"], - strip_prefix = "clap_derive-4.6.4", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.clap_derive-4.6.4.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__clap_lex-1.1.0", - sha256 = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9", - type = "tar.gz", - urls = ["https://static.crates.io/crates/clap_lex/1.1.0/download"], - strip_prefix = "clap_lex-1.1.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.clap_lex-1.1.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__cobs-0.3.0", - sha256 = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1", - type = "tar.gz", - urls = ["https://static.crates.io/crates/cobs/0.3.0/download"], - strip_prefix = "cobs-0.3.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cobs-0.3.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__colorchoice-1.0.5", - sha256 = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570", - type = "tar.gz", - urls = ["https://static.crates.io/crates/colorchoice/1.0.5/download"], - strip_prefix = "colorchoice-1.0.5", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.colorchoice-1.0.5.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__core-foundation-sys-0.8.7", - sha256 = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b", - type = "tar.gz", - urls = ["https://static.crates.io/crates/core-foundation-sys/0.8.7/download"], - strip_prefix = "core-foundation-sys-0.8.7", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.core-foundation-sys-0.8.7.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__countme-3.0.1", - sha256 = "7704b5fdd17b18ae31c4c1da5a2e0305a2bf17b5249300a9ee9ed7b72114c636", - type = "tar.gz", - urls = ["https://static.crates.io/crates/countme/3.0.1/download"], - strip_prefix = "countme-3.0.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.countme-3.0.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__cov-mark-2.2.0", - sha256 = "90863d8442510cddf7f46618c4f92413774635771a3e80830c8b30d183420b14", - type = "tar.gz", - urls = ["https://static.crates.io/crates/cov-mark/2.2.0/download"], - strip_prefix = "cov-mark-2.2.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cov-mark-2.2.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__cpufeatures-0.3.0", - sha256 = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201", - type = "tar.gz", - urls = ["https://static.crates.io/crates/cpufeatures/0.3.0/download"], - strip_prefix = "cpufeatures-0.3.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.cpufeatures-0.3.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__crc32fast-1.5.0", - sha256 = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511", - type = "tar.gz", - urls = ["https://static.crates.io/crates/crc32fast/1.5.0/download"], - strip_prefix = "crc32fast-1.5.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.crc32fast-1.5.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__crossbeam-channel-0.5.16", - sha256 = "d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e", - type = "tar.gz", - urls = ["https://static.crates.io/crates/crossbeam-channel/0.5.16/download"], - strip_prefix = "crossbeam-channel-0.5.16", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.crossbeam-channel-0.5.16.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__crossbeam-deque-0.8.7", - sha256 = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb", - type = "tar.gz", - urls = ["https://static.crates.io/crates/crossbeam-deque/0.8.7/download"], - strip_prefix = "crossbeam-deque-0.8.7", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.crossbeam-deque-0.8.7.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__crossbeam-epoch-0.9.20", - sha256 = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f", - type = "tar.gz", - urls = ["https://static.crates.io/crates/crossbeam-epoch/0.9.20/download"], - strip_prefix = "crossbeam-epoch-0.9.20", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.crossbeam-epoch-0.9.20.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__crossbeam-queue-0.3.12", - sha256 = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115", - type = "tar.gz", - urls = ["https://static.crates.io/crates/crossbeam-queue/0.3.12/download"], - strip_prefix = "crossbeam-queue-0.3.12", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.crossbeam-queue-0.3.12.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__crossbeam-utils-0.8.22", - sha256 = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17", - type = "tar.gz", - urls = ["https://static.crates.io/crates/crossbeam-utils/0.8.22/download"], - strip_prefix = "crossbeam-utils-0.8.22", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.crossbeam-utils-0.8.22.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__darling-0.23.0", - sha256 = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d", - type = "tar.gz", - urls = ["https://static.crates.io/crates/darling/0.23.0/download"], - strip_prefix = "darling-0.23.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.darling-0.23.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__darling_core-0.23.0", - sha256 = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0", - type = "tar.gz", - urls = ["https://static.crates.io/crates/darling_core/0.23.0/download"], - strip_prefix = "darling_core-0.23.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.darling_core-0.23.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__darling_macro-0.23.0", - sha256 = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d", - type = "tar.gz", - urls = ["https://static.crates.io/crates/darling_macro/0.23.0/download"], - strip_prefix = "darling_macro-0.23.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.darling_macro-0.23.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__dashmap-6.2.1", - sha256 = "e6361d5c062261c78a176addb82d4c821ae42bed6089de0e12603cd25de2059c", - type = "tar.gz", - urls = ["https://static.crates.io/crates/dashmap/6.2.1/download"], - strip_prefix = "dashmap-6.2.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.dashmap-6.2.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__defmt-1.1.1", - sha256 = "e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1", - type = "tar.gz", - urls = ["https://static.crates.io/crates/defmt/1.1.1/download"], - strip_prefix = "defmt-1.1.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.defmt-1.1.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__defmt-macros-1.1.1", - sha256 = "bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8", - type = "tar.gz", - urls = ["https://static.crates.io/crates/defmt-macros/1.1.1/download"], - strip_prefix = "defmt-macros-1.1.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.defmt-macros-1.1.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__defmt-parser-1.0.0", - sha256 = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e", - type = "tar.gz", - urls = ["https://static.crates.io/crates/defmt-parser/1.0.0/download"], - strip_prefix = "defmt-parser-1.0.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.defmt-parser-1.0.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__deranged-0.5.8", - sha256 = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c", - type = "tar.gz", - urls = ["https://static.crates.io/crates/deranged/0.5.8/download"], - strip_prefix = "deranged-0.5.8", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.deranged-0.5.8.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__derive-where-1.6.1", - sha256 = "d08b3a0bcc0d079199cd476b2cae8435016ec11d1c0986c6901c5ac223041534", - type = "tar.gz", - urls = ["https://static.crates.io/crates/derive-where/1.6.1/download"], - strip_prefix = "derive-where-1.6.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.derive-where-1.6.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__dissimilar-1.0.11", - sha256 = "aeda16ab4059c5fd2a83f2b9c9e9c981327b18aa8e3b313f7e6563799d4f093e", - type = "tar.gz", - urls = ["https://static.crates.io/crates/dissimilar/1.0.11/download"], - strip_prefix = "dissimilar-1.0.11", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.dissimilar-1.0.11.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__drop_bomb-0.1.5", - sha256 = "9bda8e21c04aca2ae33ffc2fd8c23134f3cac46db123ba97bd9d3f3b8a4a85e1", - type = "tar.gz", - urls = ["https://static.crates.io/crates/drop_bomb/0.1.5/download"], - strip_prefix = "drop_bomb-0.1.5", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.drop_bomb-0.1.5.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__dunce-1.0.5", - sha256 = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813", - type = "tar.gz", - urls = ["https://static.crates.io/crates/dunce/1.0.5/download"], - strip_prefix = "dunce-1.0.5", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.dunce-1.0.5.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__dyn-clone-1.0.20", - sha256 = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555", - type = "tar.gz", - urls = ["https://static.crates.io/crates/dyn-clone/1.0.20/download"], - strip_prefix = "dyn-clone-1.0.20", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.dyn-clone-1.0.20.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__either-1.17.0", - sha256 = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d", - type = "tar.gz", - urls = ["https://static.crates.io/crates/either/1.17.0/download"], - strip_prefix = "either-1.17.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.either-1.17.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__embedded-io-0.4.0", - sha256 = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced", - type = "tar.gz", - urls = ["https://static.crates.io/crates/embedded-io/0.4.0/download"], - strip_prefix = "embedded-io-0.4.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.embedded-io-0.4.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__embedded-io-0.6.1", - sha256 = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d", - type = "tar.gz", - urls = ["https://static.crates.io/crates/embedded-io/0.6.1/download"], - strip_prefix = "embedded-io-0.6.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.embedded-io-0.6.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ena-0.14.4", - sha256 = "eabffdaee24bd1bf95c5ef7cec31260444317e72ea56c4c91750e8b7ee58d5f1", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ena/0.14.4/download"], - strip_prefix = "ena-0.14.4", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ena-0.14.4.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__encoding-0.2.33", - sha256 = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec", - type = "tar.gz", - urls = ["https://static.crates.io/crates/encoding/0.2.33/download"], - strip_prefix = "encoding-0.2.33", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.encoding-0.2.33.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__encoding-index-japanese-1.20141219.5", - sha256 = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91", - type = "tar.gz", - urls = ["https://static.crates.io/crates/encoding-index-japanese/1.20141219.5/download"], - strip_prefix = "encoding-index-japanese-1.20141219.5", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.encoding-index-japanese-1.20141219.5.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__encoding-index-korean-1.20141219.5", - sha256 = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81", - type = "tar.gz", - urls = ["https://static.crates.io/crates/encoding-index-korean/1.20141219.5/download"], - strip_prefix = "encoding-index-korean-1.20141219.5", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.encoding-index-korean-1.20141219.5.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__encoding-index-simpchinese-1.20141219.5", - sha256 = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7", - type = "tar.gz", - urls = ["https://static.crates.io/crates/encoding-index-simpchinese/1.20141219.5/download"], - strip_prefix = "encoding-index-simpchinese-1.20141219.5", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.encoding-index-simpchinese-1.20141219.5.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__encoding-index-singlebyte-1.20141219.5", - sha256 = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a", - type = "tar.gz", - urls = ["https://static.crates.io/crates/encoding-index-singlebyte/1.20141219.5/download"], - strip_prefix = "encoding-index-singlebyte-1.20141219.5", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.encoding-index-singlebyte-1.20141219.5.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__encoding-index-tradchinese-1.20141219.5", - sha256 = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18", - type = "tar.gz", - urls = ["https://static.crates.io/crates/encoding-index-tradchinese/1.20141219.5/download"], - strip_prefix = "encoding-index-tradchinese-1.20141219.5", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.encoding-index-tradchinese-1.20141219.5.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__encoding_index_tests-0.1.4", - sha256 = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569", - type = "tar.gz", - urls = ["https://static.crates.io/crates/encoding_index_tests/0.1.4/download"], - strip_prefix = "encoding_index_tests-0.1.4", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.encoding_index_tests-0.1.4.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__equivalent-1.0.2", - sha256 = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f", - type = "tar.gz", - urls = ["https://static.crates.io/crates/equivalent/1.0.2/download"], - strip_prefix = "equivalent-1.0.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.equivalent-1.0.2.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__figment-0.10.19", - sha256 = "8cb01cd46b0cf372153850f4c6c272d9cbea2da513e07538405148f95bd789f3", - type = "tar.gz", - urls = ["https://static.crates.io/crates/figment/0.10.19/download"], - strip_prefix = "figment-0.10.19", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.figment-0.10.19.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__find-msvc-tools-0.1.10", - sha256 = "26b73573e6edcd2af0cdf47bd6cb58f0b3839491263c314eaad1ccf24430e1de", - type = "tar.gz", - urls = ["https://static.crates.io/crates/find-msvc-tools/0.1.10/download"], - strip_prefix = "find-msvc-tools-0.1.10", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.find-msvc-tools-0.1.10.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__fixedbitset-0.5.7", - sha256 = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99", - type = "tar.gz", - urls = ["https://static.crates.io/crates/fixedbitset/0.5.7/download"], - strip_prefix = "fixedbitset-0.5.7", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.fixedbitset-0.5.7.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__flate2-1.1.9", - sha256 = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c", - type = "tar.gz", - urls = ["https://static.crates.io/crates/flate2/1.1.9/download"], - strip_prefix = "flate2-1.1.9", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.flate2-1.1.9.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__foldhash-0.1.5", - sha256 = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2", - type = "tar.gz", - urls = ["https://static.crates.io/crates/foldhash/0.1.5/download"], - strip_prefix = "foldhash-0.1.5", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.foldhash-0.1.5.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__foldhash-0.2.0", - sha256 = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb", - type = "tar.gz", - urls = ["https://static.crates.io/crates/foldhash/0.2.0/download"], - strip_prefix = "foldhash-0.2.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.foldhash-0.2.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__fs-err-3.3.0", - sha256 = "73fde052dbfc920003cfd2c8e2c6e6d4cc7c1091538c3a24226cec0665ab08c0", - type = "tar.gz", - urls = ["https://static.crates.io/crates/fs-err/3.3.0/download"], - strip_prefix = "fs-err-3.3.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.fs-err-3.3.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__fsevent-sys-4.1.0", - sha256 = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2", - type = "tar.gz", - urls = ["https://static.crates.io/crates/fsevent-sys/4.1.0/download"], - strip_prefix = "fsevent-sys-4.1.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.fsevent-sys-4.1.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__fst-0.4.7", - sha256 = "7ab85b9b05e3978cc9a9cf8fea7f01b494e1a09ed3037e16ba39edc7a29eb61a", - type = "tar.gz", - urls = ["https://static.crates.io/crates/fst/0.4.7/download"], - strip_prefix = "fst-0.4.7", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.fst-0.4.7.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__futures-core-0.3.34", - sha256 = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e", - type = "tar.gz", - urls = ["https://static.crates.io/crates/futures-core/0.3.34/download"], - strip_prefix = "futures-core-0.3.34", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.futures-core-0.3.34.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__futures-task-0.3.34", - sha256 = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd", - type = "tar.gz", - urls = ["https://static.crates.io/crates/futures-task/0.3.34/download"], - strip_prefix = "futures-task-0.3.34", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.futures-task-0.3.34.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__futures-util-0.3.34", - sha256 = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc", - type = "tar.gz", - urls = ["https://static.crates.io/crates/futures-util/0.3.34/download"], - strip_prefix = "futures-util-0.3.34", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.futures-util-0.3.34.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__getrandom-0.4.3", - sha256 = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099", - type = "tar.gz", - urls = ["https://static.crates.io/crates/getrandom/0.4.3/download"], - strip_prefix = "getrandom-0.4.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.getrandom-0.4.3.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__glob-0.3.4", - sha256 = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b", - type = "tar.gz", - urls = ["https://static.crates.io/crates/glob/0.3.4/download"], - strip_prefix = "glob-0.3.4", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.glob-0.3.4.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__globset-0.4.18", - sha256 = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3", - type = "tar.gz", - urls = ["https://static.crates.io/crates/globset/0.4.18/download"], - strip_prefix = "globset-0.4.18", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.globset-0.4.18.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__hashbrown-0.12.3", - sha256 = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888", - type = "tar.gz", - urls = ["https://static.crates.io/crates/hashbrown/0.12.3/download"], - strip_prefix = "hashbrown-0.12.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.hashbrown-0.12.3.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__hashbrown-0.14.5", - sha256 = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1", - type = "tar.gz", - urls = ["https://static.crates.io/crates/hashbrown/0.14.5/download"], - strip_prefix = "hashbrown-0.14.5", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.hashbrown-0.14.5.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__hashbrown-0.15.5", - sha256 = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1", - type = "tar.gz", - urls = ["https://static.crates.io/crates/hashbrown/0.15.5/download"], - strip_prefix = "hashbrown-0.15.5", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.hashbrown-0.15.5.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__hashbrown-0.17.1", - sha256 = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a", - type = "tar.gz", - urls = ["https://static.crates.io/crates/hashbrown/0.17.1/download"], - strip_prefix = "hashbrown-0.17.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.hashbrown-0.17.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__hashlink-0.12.1", - sha256 = "32069d97bb81e38fa67eab65e3393bf804bb85969f2bc06bf13f64aef5aba248", - type = "tar.gz", - urls = ["https://static.crates.io/crates/hashlink/0.12.1/download"], - strip_prefix = "hashlink-0.12.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.hashlink-0.12.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__heck-0.5.0", - sha256 = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea", - type = "tar.gz", - urls = ["https://static.crates.io/crates/heck/0.5.0/download"], - strip_prefix = "heck-0.5.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.heck-0.5.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__hermit-abi-0.5.2", - sha256 = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c", - type = "tar.gz", - urls = ["https://static.crates.io/crates/hermit-abi/0.5.2/download"], - strip_prefix = "hermit-abi-0.5.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.hermit-abi-0.5.2.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__hex-0.4.3", - sha256 = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70", - type = "tar.gz", - urls = ["https://static.crates.io/crates/hex/0.4.3/download"], - strip_prefix = "hex-0.4.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.hex-0.4.3.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__iana-time-zone-0.1.65", - sha256 = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470", - type = "tar.gz", - urls = ["https://static.crates.io/crates/iana-time-zone/0.1.65/download"], - strip_prefix = "iana-time-zone-0.1.65", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.iana-time-zone-0.1.65.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__iana-time-zone-haiku-0.1.2", - sha256 = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f", - type = "tar.gz", - urls = ["https://static.crates.io/crates/iana-time-zone-haiku/0.1.2/download"], - strip_prefix = "iana-time-zone-haiku-0.1.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.iana-time-zone-haiku-0.1.2.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ident_case-1.0.1", - sha256 = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ident_case/1.0.1/download"], - strip_prefix = "ident_case-1.0.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ident_case-1.0.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__indexmap-1.9.3", - sha256 = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99", - type = "tar.gz", - urls = ["https://static.crates.io/crates/indexmap/1.9.3/download"], - strip_prefix = "indexmap-1.9.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.indexmap-1.9.3.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__indexmap-2.14.0", - sha256 = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9", - type = "tar.gz", - urls = ["https://static.crates.io/crates/indexmap/2.14.0/download"], - strip_prefix = "indexmap-2.14.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.indexmap-2.14.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__inlinable_string-0.1.15", - sha256 = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb", - type = "tar.gz", - urls = ["https://static.crates.io/crates/inlinable_string/0.1.15/download"], - strip_prefix = "inlinable_string-0.1.15", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.inlinable_string-0.1.15.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__inotify-0.11.1", - sha256 = "bd5b3eaf1a28b758ac0faa5a4254e8ab2705605496f1b1f3fbbc3988ad73d199", - type = "tar.gz", - urls = ["https://static.crates.io/crates/inotify/0.11.1/download"], - strip_prefix = "inotify-0.11.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.inotify-0.11.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__inotify-sys-0.1.8", - sha256 = "c033f80b2c113cdf91ab7a33faa9cbc014726dcad99880c8609af2a370edf37d", - type = "tar.gz", - urls = ["https://static.crates.io/crates/inotify-sys/0.1.8/download"], - strip_prefix = "inotify-sys-0.1.8", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.inotify-sys-0.1.8.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__intrusive-collections-0.10.3", - sha256 = "4275b20e6057cd7733fd8df8a5a31701e4fe44497dad0f3fa0e1c4fb971506be", - type = "tar.gz", - urls = ["https://static.crates.io/crates/intrusive-collections/0.10.3/download"], - strip_prefix = "intrusive-collections-0.10.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.intrusive-collections-0.10.3.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__inventory-0.3.24", - sha256 = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b", - type = "tar.gz", - urls = ["https://static.crates.io/crates/inventory/0.3.24/download"], - strip_prefix = "inventory-0.3.24", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.inventory-0.3.24.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__is_terminal_polyfill-1.70.2", - sha256 = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695", - type = "tar.gz", - urls = ["https://static.crates.io/crates/is_terminal_polyfill/1.70.2/download"], - strip_prefix = "is_terminal_polyfill-1.70.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.is_terminal_polyfill-1.70.2.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__itertools-0.15.0", - sha256 = "8b4baf93f58d4425749ca49a51c50ebab072c5df6994d08fed93541c331481dc", - type = "tar.gz", - urls = ["https://static.crates.io/crates/itertools/0.15.0/download"], - strip_prefix = "itertools-0.15.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.itertools-0.15.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__itoa-1.0.18", - sha256 = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682", - type = "tar.gz", - urls = ["https://static.crates.io/crates/itoa/1.0.18/download"], - strip_prefix = "itoa-1.0.18", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.itoa-1.0.18.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__jiff-0.2.35", - sha256 = "668b7183bd07af9a4885f5c35b0cc5c83c4607a913c16b7e17291832910d2dcc", - type = "tar.gz", - urls = ["https://static.crates.io/crates/jiff/0.2.35/download"], - strip_prefix = "jiff-0.2.35", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.jiff-0.2.35.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__jiff-core-0.1.0", - sha256 = "7feca88439efe53da3754500c1851dedf3cb36c524dd5cf8225cc0794de95d09", - type = "tar.gz", - urls = ["https://static.crates.io/crates/jiff-core/0.1.0/download"], - strip_prefix = "jiff-core-0.1.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.jiff-core-0.1.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__jiff-static-0.2.35", - sha256 = "3a69dcb3a21cfb32ce1cd056169337ca284af0766dd766e7878819b251a49204", - type = "tar.gz", - urls = ["https://static.crates.io/crates/jiff-static/0.2.35/download"], - strip_prefix = "jiff-static-0.2.35", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.jiff-static-0.2.35.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__jiff-tzdb-0.1.8", - sha256 = "142bd39932ad231f10513df9ab62661fead8719872150b7ad02a2df79f4e141e", - type = "tar.gz", - urls = ["https://static.crates.io/crates/jiff-tzdb/0.1.8/download"], - strip_prefix = "jiff-tzdb-0.1.8", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.jiff-tzdb-0.1.8.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__jiff-tzdb-platform-0.1.3", - sha256 = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8", - type = "tar.gz", - urls = ["https://static.crates.io/crates/jiff-tzdb-platform/0.1.3/download"], - strip_prefix = "jiff-tzdb-platform-0.1.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.jiff-tzdb-platform-0.1.3.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__jobserver-0.1.35", - sha256 = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3", - type = "tar.gz", - urls = ["https://static.crates.io/crates/jobserver/0.1.35/download"], - strip_prefix = "jobserver-0.1.35", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.jobserver-0.1.35.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__jod-thread-1.0.0", - sha256 = "a037eddb7d28de1d0fc42411f501b53b75838d313908078d6698d064f3029b24", - type = "tar.gz", - urls = ["https://static.crates.io/crates/jod-thread/1.0.0/download"], - strip_prefix = "jod-thread-1.0.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.jod-thread-1.0.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__js-sys-0.3.103", - sha256 = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102", - type = "tar.gz", - urls = ["https://static.crates.io/crates/js-sys/0.3.103/download"], - strip_prefix = "js-sys-0.3.103", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.js-sys-0.3.103.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__kqueue-1.2.0", - sha256 = "273c0752728918e0ac4976f2b275b6fefb9ecd400585dec929419f3844cd87b5", - type = "tar.gz", - urls = ["https://static.crates.io/crates/kqueue/1.2.0/download"], - strip_prefix = "kqueue-1.2.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.kqueue-1.2.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__kqueue-sys-1.1.2", - sha256 = "07293a4e297ac234359b510362495713f75ea345d5307140414f20c69ffeb087", - type = "tar.gz", - urls = ["https://static.crates.io/crates/kqueue-sys/1.1.2/download"], - strip_prefix = "kqueue-sys-1.1.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.kqueue-sys-1.1.2.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__la-arena-0.3.1", - sha256 = "3752f229dcc5a481d60f385fa479ff46818033d881d2d801aa27dffcfb5e8306", - type = "tar.gz", - urls = ["https://static.crates.io/crates/la-arena/0.3.1/download"], - strip_prefix = "la-arena-0.3.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.la-arena-0.3.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__lazy_static-1.5.0", - sha256 = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe", - type = "tar.gz", - urls = ["https://static.crates.io/crates/lazy_static/1.5.0/download"], - strip_prefix = "lazy_static-1.5.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.lazy_static-1.5.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__libc-0.2.189", - sha256 = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2", - type = "tar.gz", - urls = ["https://static.crates.io/crates/libc/0.2.189/download"], - strip_prefix = "libc-0.2.189", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.libc-0.2.189.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__line-index-0.1.2", - sha256 = "3e27e0ed5a392a7f5ba0b3808a2afccff16c64933312c84b57618b49d1209bd2", - type = "tar.gz", - urls = ["https://static.crates.io/crates/line-index/0.1.2/download"], - strip_prefix = "line-index-0.1.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.line-index-0.1.2.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__lock_api-0.4.14", - sha256 = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965", - type = "tar.gz", - urls = ["https://static.crates.io/crates/lock_api/0.4.14/download"], - strip_prefix = "lock_api-0.4.14", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.lock_api-0.4.14.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__log-0.3.9", - sha256 = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b", - type = "tar.gz", - urls = ["https://static.crates.io/crates/log/0.3.9/download"], - strip_prefix = "log-0.3.9", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.log-0.3.9.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__log-0.4.33", - sha256 = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad", - type = "tar.gz", - urls = ["https://static.crates.io/crates/log/0.4.33/download"], - strip_prefix = "log-0.4.33", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.log-0.4.33.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__matchers-0.2.0", - sha256 = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9", - type = "tar.gz", - urls = ["https://static.crates.io/crates/matchers/0.2.0/download"], - strip_prefix = "matchers-0.2.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.matchers-0.2.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__memchr-2.8.3", - sha256 = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98", - type = "tar.gz", - urls = ["https://static.crates.io/crates/memchr/2.8.3/download"], - strip_prefix = "memchr-2.8.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.memchr-2.8.3.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__memoffset-0.9.1", - sha256 = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a", - type = "tar.gz", - urls = ["https://static.crates.io/crates/memoffset/0.9.1/download"], - strip_prefix = "memoffset-0.9.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.memoffset-0.9.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__miniz_oxide-0.8.9", - sha256 = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316", - type = "tar.gz", - urls = ["https://static.crates.io/crates/miniz_oxide/0.8.9/download"], - strip_prefix = "miniz_oxide-0.8.9", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.miniz_oxide-0.8.9.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__mio-1.2.2", - sha256 = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427", - type = "tar.gz", - urls = ["https://static.crates.io/crates/mio/1.2.2/download"], - strip_prefix = "mio-1.2.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.mio-1.2.2.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__miow-0.6.1", - sha256 = "536bfad37a309d62069485248eeaba1e8d9853aaf951caaeaed0585a95346f08", - type = "tar.gz", - urls = ["https://static.crates.io/crates/miow/0.6.1/download"], - strip_prefix = "miow-0.6.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.miow-0.6.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__mustache-0.9.0", - sha256 = "51956ef1c5d20a1384524d91e616fb44dfc7d8f249bf696d49c97dd3289ecab5", - type = "tar.gz", - urls = ["https://static.crates.io/crates/mustache/0.9.0/download"], - strip_prefix = "mustache-0.9.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.mustache-0.9.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__nohash-hasher-0.2.0", - sha256 = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451", - type = "tar.gz", - urls = ["https://static.crates.io/crates/nohash-hasher/0.2.0/download"], - strip_prefix = "nohash-hasher-0.2.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.nohash-hasher-0.2.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__notify-8.2.0", - sha256 = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3", - type = "tar.gz", - urls = ["https://static.crates.io/crates/notify/8.2.0/download"], - strip_prefix = "notify-8.2.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.notify-8.2.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__notify-types-2.1.0", - sha256 = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a", - type = "tar.gz", - urls = ["https://static.crates.io/crates/notify-types/2.1.0/download"], - strip_prefix = "notify-types-2.1.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.notify-types-2.1.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__nu-ansi-term-0.50.3", - sha256 = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5", - type = "tar.gz", - urls = ["https://static.crates.io/crates/nu-ansi-term/0.50.3/download"], - strip_prefix = "nu-ansi-term-0.50.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.nu-ansi-term-0.50.3.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__num-conv-0.2.2", - sha256 = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441", - type = "tar.gz", - urls = ["https://static.crates.io/crates/num-conv/0.2.2/download"], - strip_prefix = "num-conv-0.2.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.num-conv-0.2.2.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__num-traits-0.2.19", - sha256 = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841", - type = "tar.gz", - urls = ["https://static.crates.io/crates/num-traits/0.2.19/download"], - strip_prefix = "num-traits-0.2.19", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.num-traits-0.2.19.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__num_cpus-1.17.0", - sha256 = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b", - type = "tar.gz", - urls = ["https://static.crates.io/crates/num_cpus/1.17.0/download"], - strip_prefix = "num_cpus-1.17.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.num_cpus-1.17.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__num_threads-0.1.7", - sha256 = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9", - type = "tar.gz", - urls = ["https://static.crates.io/crates/num_threads/0.1.7/download"], - strip_prefix = "num_threads-0.1.7", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.num_threads-0.1.7.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__once_cell-1.21.4", - sha256 = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50", - type = "tar.gz", - urls = ["https://static.crates.io/crates/once_cell/1.21.4/download"], - strip_prefix = "once_cell-1.21.4", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.once_cell-1.21.4.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__once_cell_polyfill-1.70.2", - sha256 = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe", - type = "tar.gz", - urls = ["https://static.crates.io/crates/once_cell_polyfill/1.70.2/download"], - strip_prefix = "once_cell_polyfill-1.70.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.once_cell_polyfill-1.70.2.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__oorandom-11.1.5", - sha256 = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e", - type = "tar.gz", - urls = ["https://static.crates.io/crates/oorandom/11.1.5/download"], - strip_prefix = "oorandom-11.1.5", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.oorandom-11.1.5.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__os_str_bytes-7.2.0", - sha256 = "89284d0c2af7b0eb5e814798aa07265413c8fd72009f7fc82ea25a81fb287ce9", - type = "tar.gz", - urls = ["https://static.crates.io/crates/os_str_bytes/7.2.0/download"], - strip_prefix = "os_str_bytes-7.2.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.os_str_bytes-7.2.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__parking_lot-0.12.5", - sha256 = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a", - type = "tar.gz", - urls = ["https://static.crates.io/crates/parking_lot/0.12.5/download"], - strip_prefix = "parking_lot-0.12.5", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.parking_lot-0.12.5.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__parking_lot_core-0.9.12", - sha256 = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1", - type = "tar.gz", - urls = ["https://static.crates.io/crates/parking_lot_core/0.9.12/download"], - strip_prefix = "parking_lot_core-0.9.12", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.parking_lot_core-0.9.12.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__pear-0.2.9", - sha256 = "bdeeaa00ce488657faba8ebf44ab9361f9365a97bd39ffb8a60663f57ff4b467", - type = "tar.gz", - urls = ["https://static.crates.io/crates/pear/0.2.9/download"], - strip_prefix = "pear-0.2.9", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.pear-0.2.9.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__pear_codegen-0.2.9", - sha256 = "4bab5b985dc082b345f812b7df84e1bef27e7207b39e448439ba8bd69c93f147", - type = "tar.gz", - urls = ["https://static.crates.io/crates/pear_codegen/0.2.9/download"], - strip_prefix = "pear_codegen-0.2.9", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.pear_codegen-0.2.9.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__perf-event-0.4.8", - sha256 = "b4d6393d9238342159080d79b78cb59c67399a8e7ecfa5d410bd614169e4e823", - type = "tar.gz", - urls = ["https://static.crates.io/crates/perf-event/0.4.8/download"], - strip_prefix = "perf-event-0.4.8", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.perf-event-0.4.8.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__perf-event-open-sys-4.0.0", - sha256 = "7c44fb1c7651a45a3652c4afc6e754e40b3d6e6556f1487e2b230bfc4f33c2a8", - type = "tar.gz", - urls = ["https://static.crates.io/crates/perf-event-open-sys/4.0.0/download"], - strip_prefix = "perf-event-open-sys-4.0.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.perf-event-open-sys-4.0.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__petgraph-0.8.3", - sha256 = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455", - type = "tar.gz", - urls = ["https://static.crates.io/crates/petgraph/0.8.3/download"], - strip_prefix = "petgraph-0.8.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.petgraph-0.8.3.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__pin-project-lite-0.2.17", - sha256 = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd", - type = "tar.gz", - urls = ["https://static.crates.io/crates/pin-project-lite/0.2.17/download"], - strip_prefix = "pin-project-lite-0.2.17", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.pin-project-lite-0.2.17.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__pkg-config-0.3.33", - sha256 = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e", - type = "tar.gz", - urls = ["https://static.crates.io/crates/pkg-config/0.3.33/download"], - strip_prefix = "pkg-config-0.3.33", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.pkg-config-0.3.33.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__portable-atomic-1.14.0", - sha256 = "3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3", - type = "tar.gz", - urls = ["https://static.crates.io/crates/portable-atomic/1.14.0/download"], - strip_prefix = "portable-atomic-1.14.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.portable-atomic-1.14.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__portable-atomic-util-0.2.7", - sha256 = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618", - type = "tar.gz", - urls = ["https://static.crates.io/crates/portable-atomic-util/0.2.7/download"], - strip_prefix = "portable-atomic-util-0.2.7", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.portable-atomic-util-0.2.7.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__postcard-1.1.3", - sha256 = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24", - type = "tar.gz", - urls = ["https://static.crates.io/crates/postcard/1.1.3/download"], - strip_prefix = "postcard-1.1.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.postcard-1.1.3.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__powerfmt-0.2.0", - sha256 = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391", - type = "tar.gz", - urls = ["https://static.crates.io/crates/powerfmt/0.2.0/download"], - strip_prefix = "powerfmt-0.2.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.powerfmt-0.2.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__proc-macro2-1.0.107", - sha256 = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9", - type = "tar.gz", - urls = ["https://static.crates.io/crates/proc-macro2/1.0.107/download"], - strip_prefix = "proc-macro2-1.0.107", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.proc-macro2-1.0.107.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__proc-macro2-diagnostics-0.10.1", - sha256 = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8", - type = "tar.gz", - urls = ["https://static.crates.io/crates/proc-macro2-diagnostics/0.10.1/download"], - strip_prefix = "proc-macro2-diagnostics-0.10.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.proc-macro2-diagnostics-0.10.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__quote-1.0.47", - sha256 = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001", - type = "tar.gz", - urls = ["https://static.crates.io/crates/quote/1.0.47/download"], - strip_prefix = "quote-1.0.47", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.quote-1.0.47.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__r-efi-6.0.0", - sha256 = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf", - type = "tar.gz", - urls = ["https://static.crates.io/crates/r-efi/6.0.0/download"], - strip_prefix = "r-efi-6.0.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.r-efi-6.0.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra-ap-rustc_abi-0.166.0", - sha256 = "e2cf1b1ffe31b6226c00b40cddfda65002b7729f9f4ed2d547b5856cdab0011c", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra-ap-rustc_abi/0.166.0/download"], - strip_prefix = "ra-ap-rustc_abi-0.166.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_abi-0.166.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra-ap-rustc_ast_ir-0.166.0", - sha256 = "2ef42605e36e1305e815ccfc8830eb870f74d78534bca19a61629149536d8e98", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra-ap-rustc_ast_ir/0.166.0/download"], - strip_prefix = "ra-ap-rustc_ast_ir-0.166.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_ast_ir-0.166.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra-ap-rustc_hashes-0.166.0", - sha256 = "b9f5542968215c17275920791b2fa13a43014287506ed0450777c79845102e86", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra-ap-rustc_hashes/0.166.0/download"], - strip_prefix = "ra-ap-rustc_hashes-0.166.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_hashes-0.166.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra-ap-rustc_index-0.166.0", - sha256 = "1d9e47b9ca7d92cfb0d6653503adbabd41938b84474317397a664326b208d6c6", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra-ap-rustc_index/0.166.0/download"], - strip_prefix = "ra-ap-rustc_index-0.166.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_index-0.166.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra-ap-rustc_index_macros-0.166.0", - sha256 = "4d744a7a2852a22f06210bcff9e4667ed0cacbfbe94894cc294044d25e876341", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra-ap-rustc_index_macros/0.166.0/download"], - strip_prefix = "ra-ap-rustc_index_macros-0.166.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_index_macros-0.166.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra-ap-rustc_lexer-0.166.0", - sha256 = "527c12b3731b7d0692498012810b85b2b8dfdb8b514321ed6afc434bd1c70191", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra-ap-rustc_lexer/0.166.0/download"], - strip_prefix = "ra-ap-rustc_lexer-0.166.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_lexer-0.166.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra-ap-rustc_next_trait_solver-0.166.0", - sha256 = "a7a9663a8d7c369e934aac2b74a638537ad7eb4be75b4530d765384dc071c936", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra-ap-rustc_next_trait_solver/0.166.0/download"], - strip_prefix = "ra-ap-rustc_next_trait_solver-0.166.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_next_trait_solver-0.166.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra-ap-rustc_parse_format-0.166.0", - sha256 = "2c038b7a8b0f784d4e441ad8ab991fbbdaa5e0be482e59c639a846a1c8126951", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra-ap-rustc_parse_format/0.166.0/download"], - strip_prefix = "ra-ap-rustc_parse_format-0.166.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_parse_format-0.166.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra-ap-rustc_pattern_analysis-0.166.0", - sha256 = "42ca286f90e99bb97cd9274c088f3c874a05d1ee90cabf40a3928afedabe99fd", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra-ap-rustc_pattern_analysis/0.166.0/download"], - strip_prefix = "ra-ap-rustc_pattern_analysis-0.166.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_pattern_analysis-0.166.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra-ap-rustc_type_ir-0.166.0", - sha256 = "26d6efb6008f665a9485e0afecf9f4950a6c4bedd8ddd330a9df8986a6c0160b", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra-ap-rustc_type_ir/0.166.0/download"], - strip_prefix = "ra-ap-rustc_type_ir-0.166.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_type_ir-0.166.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra-ap-rustc_type_ir_macros-0.166.0", - sha256 = "5f4fd2355e2bbf1f343c730f623596efc6e465b5e3685b606a437567ebb75bf8", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra-ap-rustc_type_ir_macros/0.166.0/download"], - strip_prefix = "ra-ap-rustc_type_ir_macros-0.166.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra-ap-rustc_type_ir_macros-0.166.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra_ap_base_db-0.0.347", - sha256 = "7ea804efdf7c1fdbdac7c1b08002700a6f2930590399abcf84d55b4d4a894116", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_base_db/0.0.347/download"], - strip_prefix = "ra_ap_base_db-0.0.347", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_base_db-0.0.347.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra_ap_cfg-0.0.347", - sha256 = "c50ba7c60bc08ef48d2a930c5f897349fb0a72cf53e86c0374476f2583d1f098", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_cfg/0.0.347/download"], - strip_prefix = "ra_ap_cfg-0.0.347", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_cfg-0.0.347.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra_ap_edition-0.0.347", - sha256 = "238a2d0108f16fe859e369c5aba251abccd10fae513391ee4d119ac6a48ffec7", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_edition/0.0.347/download"], - strip_prefix = "ra_ap_edition-0.0.347", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_edition-0.0.347.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra_ap_hir-0.0.347", - sha256 = "9b0ff8d334193f5535c13a6749d2ed8ee4c417f75a2a92ffff24eee475097fdd", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_hir/0.0.347/download"], - strip_prefix = "ra_ap_hir-0.0.347", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_hir-0.0.347.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra_ap_hir_def-0.0.347", - sha256 = "41d0148d0b1f176f27d55df6ac6dc662ed65c55cae367aeb9f30472879626cd5", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_hir_def/0.0.347/download"], - strip_prefix = "ra_ap_hir_def-0.0.347", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_hir_def-0.0.347.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra_ap_hir_expand-0.0.347", - sha256 = "b494d16c4a066ffe135ef730b01806539e87d4e5bb26acbd7cf9ccd2ffb238df", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_hir_expand/0.0.347/download"], - strip_prefix = "ra_ap_hir_expand-0.0.347", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_hir_expand-0.0.347.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra_ap_hir_ty-0.0.347", - sha256 = "106393ec163f4cb9537721a04cd5e4d5ec642602c46f524e65a31a431be10269", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_hir_ty/0.0.347/download"], - strip_prefix = "ra_ap_hir_ty-0.0.347", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_hir_ty-0.0.347.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra_ap_ide_db-0.0.347", - sha256 = "c3ea305ce763f44928d29766c165982dd0a1c9fdba429296889d9e8e64dd28a5", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_ide_db/0.0.347/download"], - strip_prefix = "ra_ap_ide_db-0.0.347", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_ide_db-0.0.347.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra_ap_intern-0.0.347", - sha256 = "0a6be54b5f8a47e4aee183dd985440bb2e46d587270f63a6fcb03409a0de7054", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_intern/0.0.347/download"], - strip_prefix = "ra_ap_intern-0.0.347", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_intern-0.0.347.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra_ap_load-cargo-0.0.347", - sha256 = "96a50dad86901f2f0dab1e54ccf2dd43ce3bcb934bcaae1c3fa4884a1c45f77a", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_load-cargo/0.0.347/download"], - strip_prefix = "ra_ap_load-cargo-0.0.347", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_load-cargo-0.0.347.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra_ap_macros-0.0.347", - sha256 = "478606f8a75d1c4f8e6bfd4874ecf56303a690e270cffbd82e9fb700637500c5", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_macros/0.0.347/download"], - strip_prefix = "ra_ap_macros-0.0.347", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_macros-0.0.347.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra_ap_mbe-0.0.347", - sha256 = "c8d1b45159a9f2e6d61bec480d49a5d2c4a1c8215a75f01cf1d6ae7042cc0330", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_mbe/0.0.347/download"], - strip_prefix = "ra_ap_mbe-0.0.347", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_mbe-0.0.347.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra_ap_parser-0.0.347", - sha256 = "8bdb9f2e027f40bbaeff62c026e1affabe691467c0553857f6eb7e36093c5b6f", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_parser/0.0.347/download"], - strip_prefix = "ra_ap_parser-0.0.347", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_parser-0.0.347.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra_ap_paths-0.0.347", - sha256 = "36bc14237aa65d051028cbb54b0a0e0a1d53487b3f647c2b11667870720af9db", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_paths/0.0.347/download"], - strip_prefix = "ra_ap_paths-0.0.347", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_paths-0.0.347.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra_ap_proc_macro_api-0.0.347", - sha256 = "3c56d7dacb79f01f5d9ab0a25b232acf37d3104d176e67d2985e9e389834c553", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_proc_macro_api/0.0.347/download"], - strip_prefix = "ra_ap_proc_macro_api-0.0.347", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_proc_macro_api-0.0.347.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra_ap_profile-0.0.347", - sha256 = "6f6a81ebc5ef6f42d86ac8d20c82d4132010f28af93da37f08d127eeea24b852", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_profile/0.0.347/download"], - strip_prefix = "ra_ap_profile-0.0.347", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_profile-0.0.347.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra_ap_project_model-0.0.347", - sha256 = "9cf562304b786b7fa9089d2e0ae489d73abbda1732b0a820977a6fa7f9f5db0c", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_project_model/0.0.347/download"], - strip_prefix = "ra_ap_project_model-0.0.347", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_project_model-0.0.347.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra_ap_span-0.0.347", - sha256 = "6358a99deb3e9564a3702731031bd6a59ab6843258f56697971c2591d142aa8a", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_span/0.0.347/download"], - strip_prefix = "ra_ap_span-0.0.347", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_span-0.0.347.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra_ap_stdx-0.0.347", - sha256 = "808a663a921ead35b75a74a2eebe7ab84e5ced29c594e9bf3c77914caf8b77c0", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_stdx/0.0.347/download"], - strip_prefix = "ra_ap_stdx-0.0.347", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_stdx-0.0.347.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra_ap_syntax-0.0.347", - sha256 = "733ea008d3847dac53a6463689fd595a1d9459db09b1dc2306f2293dc130f586", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_syntax/0.0.347/download"], - strip_prefix = "ra_ap_syntax-0.0.347", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_syntax-0.0.347.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra_ap_syntax-bridge-0.0.347", - sha256 = "f1ea2603396e114a6db5145508242ce9d238983533e3bdc4019cb473247c5e07", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_syntax-bridge/0.0.347/download"], - strip_prefix = "ra_ap_syntax-bridge-0.0.347", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_syntax-bridge-0.0.347.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra_ap_test_fixture-0.0.347", - sha256 = "77da42ce97d6b9de208c9e9fba23244da564130ee0d892af03d0a6eb72ba8672", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_test_fixture/0.0.347/download"], - strip_prefix = "ra_ap_test_fixture-0.0.347", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_test_fixture-0.0.347.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra_ap_test_utils-0.0.347", - sha256 = "fdfcc378493db43a2b837d9cd62c4c91c5d33302ae639b3dbf6d56ed97df6e63", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_test_utils/0.0.347/download"], - strip_prefix = "ra_ap_test_utils-0.0.347", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_test_utils-0.0.347.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra_ap_toolchain-0.0.347", - sha256 = "5f7748b05a913c21f6182b4c2d7c7009251938b8eb01a2b96e61d0c7ca4aacc2", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_toolchain/0.0.347/download"], - strip_prefix = "ra_ap_toolchain-0.0.347", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_toolchain-0.0.347.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra_ap_tt-0.0.347", - sha256 = "babe00307d454b585a66e51f1fe6ccdfd1f82a200ef75374c80e843520cb3f7f", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_tt/0.0.347/download"], - strip_prefix = "ra_ap_tt-0.0.347", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_tt-0.0.347.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra_ap_vfs-0.0.347", - sha256 = "a730486f6595655431750c15faf4332603ad30f0460e7c89bbee79880416794b", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_vfs/0.0.347/download"], - strip_prefix = "ra_ap_vfs-0.0.347", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_vfs-0.0.347.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ra_ap_vfs-notify-0.0.347", - sha256 = "ede5e2c51dd3a138039d2f1c4dc33709cebb1c4e00692f8026de833844ad375f", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ra_ap_vfs-notify/0.0.347/download"], - strip_prefix = "ra_ap_vfs-notify-0.0.347", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ra_ap_vfs-notify-0.0.347.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__rand-0.10.2", - sha256 = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80", - type = "tar.gz", - urls = ["https://static.crates.io/crates/rand/0.10.2/download"], - strip_prefix = "rand-0.10.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rand-0.10.2.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__rand_core-0.10.1", - sha256 = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69", - type = "tar.gz", - urls = ["https://static.crates.io/crates/rand_core/0.10.1/download"], - strip_prefix = "rand_core-0.10.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rand_core-0.10.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__rayon-1.12.0", - sha256 = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d", - type = "tar.gz", - urls = ["https://static.crates.io/crates/rayon/1.12.0/download"], - strip_prefix = "rayon-1.12.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rayon-1.12.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__rayon-core-1.13.0", - sha256 = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91", - type = "tar.gz", - urls = ["https://static.crates.io/crates/rayon-core/1.13.0/download"], - strip_prefix = "rayon-core-1.13.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rayon-core-1.13.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__redox_syscall-0.5.18", - sha256 = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d", - type = "tar.gz", - urls = ["https://static.crates.io/crates/redox_syscall/0.5.18/download"], - strip_prefix = "redox_syscall-0.5.18", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.redox_syscall-0.5.18.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ref-cast-1.0.26", - sha256 = "216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ref-cast/1.0.26/download"], - strip_prefix = "ref-cast-1.0.26", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ref-cast-1.0.26.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ref-cast-impl-1.0.26", - sha256 = "2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ref-cast-impl/1.0.26/download"], - strip_prefix = "ref-cast-impl-1.0.26", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ref-cast-impl-1.0.26.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__regex-1.13.1", - sha256 = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d", - type = "tar.gz", - urls = ["https://static.crates.io/crates/regex/1.13.1/download"], - strip_prefix = "regex-1.13.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.regex-1.13.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__regex-automata-0.4.18", - sha256 = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2", - type = "tar.gz", - urls = ["https://static.crates.io/crates/regex-automata/0.4.18/download"], - strip_prefix = "regex-automata-0.4.18", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.regex-automata-0.4.18.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__regex-syntax-0.8.11", - sha256 = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4", - type = "tar.gz", - urls = ["https://static.crates.io/crates/regex-syntax/0.8.11/download"], - strip_prefix = "regex-syntax-0.8.11", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.regex-syntax-0.8.11.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__rowan-0.17.0", - sha256 = "14b574c58582fa59fa43a2feb6608b8744184659f08a2e0117e4b8224d95ed61", - type = "tar.gz", - urls = ["https://static.crates.io/crates/rowan/0.17.0/download"], - strip_prefix = "rowan-0.17.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rowan-0.17.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__rustc-hash-1.1.0", - sha256 = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2", - type = "tar.gz", - urls = ["https://static.crates.io/crates/rustc-hash/1.1.0/download"], - strip_prefix = "rustc-hash-1.1.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rustc-hash-1.1.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__rustc-hash-2.1.3", - sha256 = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d", - type = "tar.gz", - urls = ["https://static.crates.io/crates/rustc-hash/2.1.3/download"], - strip_prefix = "rustc-hash-2.1.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rustc-hash-2.1.3.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__rustc-literal-escaper-0.0.7", - sha256 = "8be87abb9e40db7466e0681dc8ecd9dcfd40360cb10b4c8fe24a7c4c3669b198", - type = "tar.gz", - urls = ["https://static.crates.io/crates/rustc-literal-escaper/0.0.7/download"], - strip_prefix = "rustc-literal-escaper-0.0.7", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rustc-literal-escaper-0.0.7.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__rustc-stable-hash-0.1.2", - sha256 = "781442f29170c5c93b7185ad559492601acdc71d5bb0706f5868094f45cfcd08", - type = "tar.gz", - urls = ["https://static.crates.io/crates/rustc-stable-hash/0.1.2/download"], - strip_prefix = "rustc-stable-hash-0.1.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rustc-stable-hash-0.1.2.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__rustc_apfloat-0.2.3-llvm-462a31f5a5ab", - sha256 = "486c2179b4796f65bfe2ee33679acf0927ac83ecf583ad6c91c3b4570911b9ad", - type = "tar.gz", - urls = ["https://static.crates.io/crates/rustc_apfloat/0.2.3+llvm-462a31f5a5ab/download"], - strip_prefix = "rustc_apfloat-0.2.3+llvm-462a31f5a5ab", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rustc_apfloat-0.2.3+llvm-462a31f5a5ab.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__rustversion-1.0.23", - sha256 = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f", - type = "tar.gz", - urls = ["https://static.crates.io/crates/rustversion/1.0.23/download"], - strip_prefix = "rustversion-1.0.23", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.rustversion-1.0.23.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ryu-1.0.23", - sha256 = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ryu/1.0.23/download"], - strip_prefix = "ryu-1.0.23", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ryu-1.0.23.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__salsa-0.28.2", - sha256 = "cf0e374215cd2db2b5c75d7b3a99cb0cc052c0595335dfdefc03d4eb08f4aa81", - type = "tar.gz", - urls = ["https://static.crates.io/crates/salsa/0.28.2/download"], - strip_prefix = "salsa-0.28.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.salsa-0.28.2.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__salsa-macro-rules-0.28.2", - sha256 = "85f4b7d4405540bbd6d4ffa52d4322d983f3781954d3073067ac1bdb028459b3", - type = "tar.gz", - urls = ["https://static.crates.io/crates/salsa-macro-rules/0.28.2/download"], - strip_prefix = "salsa-macro-rules-0.28.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.salsa-macro-rules-0.28.2.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__salsa-macros-0.28.2", - sha256 = "445be2bfbb2f67cb663225ecd7bc5a25370c0250fca30f9d8cbad9a913650370", - type = "tar.gz", - urls = ["https://static.crates.io/crates/salsa-macros/0.28.2/download"], - strip_prefix = "salsa-macros-0.28.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.salsa-macros-0.28.2.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__same-file-1.0.6", - sha256 = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502", - type = "tar.gz", - urls = ["https://static.crates.io/crates/same-file/1.0.6/download"], - strip_prefix = "same-file-1.0.6", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.same-file-1.0.6.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__schemars-0.9.0", - sha256 = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f", - type = "tar.gz", - urls = ["https://static.crates.io/crates/schemars/0.9.0/download"], - strip_prefix = "schemars-0.9.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.schemars-0.9.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__schemars-1.2.2", - sha256 = "687274d293b6cdc6e73e0fee520bf2049650090d7164f87672d212a3c530cf4a", - type = "tar.gz", - urls = ["https://static.crates.io/crates/schemars/1.2.2/download"], - strip_prefix = "schemars-1.2.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.schemars-1.2.2.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__scopeguard-1.2.0", - sha256 = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49", - type = "tar.gz", - urls = ["https://static.crates.io/crates/scopeguard/1.2.0/download"], - strip_prefix = "scopeguard-1.2.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.scopeguard-1.2.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__semver-1.0.28", - sha256 = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd", - type = "tar.gz", - urls = ["https://static.crates.io/crates/semver/1.0.28/download"], - strip_prefix = "semver-1.0.28", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.semver-1.0.28.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__serde-1.0.229", - sha256 = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba", - type = "tar.gz", - urls = ["https://static.crates.io/crates/serde/1.0.229/download"], - strip_prefix = "serde-1.0.229", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde-1.0.229.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__serde_core-1.0.229", - sha256 = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48", - type = "tar.gz", - urls = ["https://static.crates.io/crates/serde_core/1.0.229/download"], - strip_prefix = "serde_core-1.0.229", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_core-1.0.229.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__serde_derive-1.0.229", - sha256 = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348", - type = "tar.gz", - urls = ["https://static.crates.io/crates/serde_derive/1.0.229/download"], - strip_prefix = "serde_derive-1.0.229", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_derive-1.0.229.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__serde_json-1.0.151", - sha256 = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14", - type = "tar.gz", - urls = ["https://static.crates.io/crates/serde_json/1.0.151/download"], - strip_prefix = "serde_json-1.0.151", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_json-1.0.151.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__serde_spanned-1.1.1", - sha256 = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26", - type = "tar.gz", - urls = ["https://static.crates.io/crates/serde_spanned/1.1.1/download"], - strip_prefix = "serde_spanned-1.1.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_spanned-1.1.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__serde_with-3.22.0", - sha256 = "ee78f1fbe43ac4a0e47aadb3dbd357b69eb0d3793e948624cd03dd2750ab1c0a", - type = "tar.gz", - urls = ["https://static.crates.io/crates/serde_with/3.22.0/download"], - strip_prefix = "serde_with-3.22.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_with-3.22.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__serde_with_macros-3.22.0", - sha256 = "8705578779c2b6bd90d84d66eb2e206b708b1a4d7b9f17641b293545bf1c7e46", - type = "tar.gz", - urls = ["https://static.crates.io/crates/serde_with_macros/3.22.0/download"], - strip_prefix = "serde_with_macros-3.22.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_with_macros-3.22.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__serde_yaml-0.9.34-deprecated", - sha256 = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47", - type = "tar.gz", - urls = ["https://static.crates.io/crates/serde_yaml/0.9.34+deprecated/download"], - strip_prefix = "serde_yaml-0.9.34+deprecated", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.serde_yaml-0.9.34+deprecated.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__sharded-slab-0.1.7", - sha256 = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6", - type = "tar.gz", - urls = ["https://static.crates.io/crates/sharded-slab/0.1.7/download"], - strip_prefix = "sharded-slab-0.1.7", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.sharded-slab-0.1.7.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__shlex-2.0.1", - sha256 = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba", - type = "tar.gz", - urls = ["https://static.crates.io/crates/shlex/2.0.1/download"], - strip_prefix = "shlex-2.0.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.shlex-2.0.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__simd-adler32-0.3.9", - sha256 = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214", - type = "tar.gz", - urls = ["https://static.crates.io/crates/simd-adler32/0.3.9/download"], - strip_prefix = "simd-adler32-0.3.9", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.simd-adler32-0.3.9.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__slab-0.4.12", - sha256 = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5", - type = "tar.gz", - urls = ["https://static.crates.io/crates/slab/0.4.12/download"], - strip_prefix = "slab-0.4.12", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.slab-0.4.12.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__smallvec-1.15.2", - sha256 = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90", - type = "tar.gz", - urls = ["https://static.crates.io/crates/smallvec/1.15.2/download"], - strip_prefix = "smallvec-1.15.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.smallvec-1.15.2.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__smol_str-0.3.6", - sha256 = "4aaa7368fcf4852a4c2dd92df0cace6a71f2091ca0a23391ce7f3a31833f1523", - type = "tar.gz", - urls = ["https://static.crates.io/crates/smol_str/0.3.6/download"], - strip_prefix = "smol_str-0.3.6", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.smol_str-0.3.6.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__stable_deref_trait-1.2.1", - sha256 = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596", - type = "tar.gz", - urls = ["https://static.crates.io/crates/stable_deref_trait/1.2.1/download"], - strip_prefix = "stable_deref_trait-1.2.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.stable_deref_trait-1.2.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__streaming-iterator-0.1.9", - sha256 = "2b2231b7c3057d5e4ad0156fb3dc807d900806020c5ffa3ee6ff2c8c76fb8520", - type = "tar.gz", - urls = ["https://static.crates.io/crates/streaming-iterator/0.1.9/download"], - strip_prefix = "streaming-iterator-0.1.9", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.streaming-iterator-0.1.9.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__strsim-0.11.1", - sha256 = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f", - type = "tar.gz", - urls = ["https://static.crates.io/crates/strsim/0.11.1/download"], - strip_prefix = "strsim-0.11.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.strsim-0.11.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__syn-2.0.119", - sha256 = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297", - type = "tar.gz", - urls = ["https://static.crates.io/crates/syn/2.0.119/download"], - strip_prefix = "syn-2.0.119", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.syn-2.0.119.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__syn-3.0.3", - sha256 = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3", - type = "tar.gz", - urls = ["https://static.crates.io/crates/syn/3.0.3/download"], - strip_prefix = "syn-3.0.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.syn-3.0.3.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__synstructure-0.13.2", - sha256 = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2", - type = "tar.gz", - urls = ["https://static.crates.io/crates/synstructure/0.13.2/download"], - strip_prefix = "synstructure-0.13.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.synstructure-0.13.2.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__temp-dir-0.2.0", - sha256 = "016ef9739649996fcc983b9c588fe3d557cf216d4d98503ce1b057ab5a66d689", - type = "tar.gz", - urls = ["https://static.crates.io/crates/temp-dir/0.2.0/download"], - strip_prefix = "temp-dir-0.2.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.temp-dir-0.2.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__text-size-1.1.1", - sha256 = "f18aa187839b2bdb1ad2fa35ead8c4c2976b64e4363c386d45ac0f7ee85c9233", - type = "tar.gz", - urls = ["https://static.crates.io/crates/text-size/1.1.1/download"], - strip_prefix = "text-size-1.1.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.text-size-1.1.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__thin-vec-0.2.19", - sha256 = "79def32ffcd477db1ff26f76dab9e3a91f0bd42a85ca96577089b24623056f9d", - type = "tar.gz", - urls = ["https://static.crates.io/crates/thin-vec/0.2.19/download"], - strip_prefix = "thin-vec-0.2.19", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.thin-vec-0.2.19.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__thiserror-2.0.20", - sha256 = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f", - type = "tar.gz", - urls = ["https://static.crates.io/crates/thiserror/2.0.20/download"], - strip_prefix = "thiserror-2.0.20", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.thiserror-2.0.20.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__thiserror-impl-2.0.20", - sha256 = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af", - type = "tar.gz", - urls = ["https://static.crates.io/crates/thiserror-impl/2.0.20/download"], - strip_prefix = "thiserror-impl-2.0.20", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.thiserror-impl-2.0.20.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__thread_local-1.1.10", - sha256 = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070", - type = "tar.gz", - urls = ["https://static.crates.io/crates/thread_local/1.1.10/download"], - strip_prefix = "thread_local-1.1.10", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.thread_local-1.1.10.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__time-0.3.55", - sha256 = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134", - type = "tar.gz", - urls = ["https://static.crates.io/crates/time/0.3.55/download"], - strip_prefix = "time-0.3.55", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.time-0.3.55.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__time-core-0.1.9", - sha256 = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109", - type = "tar.gz", - urls = ["https://static.crates.io/crates/time-core/0.1.9/download"], - strip_prefix = "time-core-0.1.9", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.time-core-0.1.9.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__time-macros-0.2.32", - sha256 = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85", - type = "tar.gz", - urls = ["https://static.crates.io/crates/time-macros/0.2.32/download"], - strip_prefix = "time-macros-0.2.32", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.time-macros-0.2.32.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__tinyvec-1.12.0", - sha256 = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f", - type = "tar.gz", - urls = ["https://static.crates.io/crates/tinyvec/1.12.0/download"], - strip_prefix = "tinyvec-1.12.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tinyvec-1.12.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__tinyvec_macros-0.1.1", - sha256 = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20", - type = "tar.gz", - urls = ["https://static.crates.io/crates/tinyvec_macros/0.1.1/download"], - strip_prefix = "tinyvec_macros-0.1.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tinyvec_macros-0.1.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__toml-1.1.4-spec-1.1.0", - sha256 = "3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5", - type = "tar.gz", - urls = ["https://static.crates.io/crates/toml/1.1.4+spec-1.1.0/download"], - strip_prefix = "toml-1.1.4+spec-1.1.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml-1.1.4+spec-1.1.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__toml_datetime-1.1.1-spec-1.1.0", - sha256 = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7", - type = "tar.gz", - urls = ["https://static.crates.io/crates/toml_datetime/1.1.1+spec-1.1.0/download"], - strip_prefix = "toml_datetime-1.1.1+spec-1.1.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml_datetime-1.1.1+spec-1.1.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__toml_parser-1.1.3-spec-1.1.0", - sha256 = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56", - type = "tar.gz", - urls = ["https://static.crates.io/crates/toml_parser/1.1.3+spec-1.1.0/download"], - strip_prefix = "toml_parser-1.1.3+spec-1.1.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml_parser-1.1.3+spec-1.1.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__toml_writer-1.1.2-spec-1.1.0", - sha256 = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2", - type = "tar.gz", - urls = ["https://static.crates.io/crates/toml_writer/1.1.2+spec-1.1.0/download"], - strip_prefix = "toml_writer-1.1.2+spec-1.1.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.toml_writer-1.1.2+spec-1.1.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__tracing-0.1.44", - sha256 = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100", - type = "tar.gz", - urls = ["https://static.crates.io/crates/tracing/0.1.44/download"], - strip_prefix = "tracing-0.1.44", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tracing-0.1.44.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__tracing-attributes-0.1.31", - sha256 = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da", - type = "tar.gz", - urls = ["https://static.crates.io/crates/tracing-attributes/0.1.31/download"], - strip_prefix = "tracing-attributes-0.1.31", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tracing-attributes-0.1.31.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__tracing-core-0.1.36", - sha256 = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a", - type = "tar.gz", - urls = ["https://static.crates.io/crates/tracing-core/0.1.36/download"], - strip_prefix = "tracing-core-0.1.36", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tracing-core-0.1.36.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__tracing-flame-0.2.0", - sha256 = "0bae117ee14789185e129aaee5d93750abe67fdc5a9a62650452bfe4e122a3a9", - type = "tar.gz", - urls = ["https://static.crates.io/crates/tracing-flame/0.2.0/download"], - strip_prefix = "tracing-flame-0.2.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tracing-flame-0.2.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__tracing-log-0.2.0", - sha256 = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3", - type = "tar.gz", - urls = ["https://static.crates.io/crates/tracing-log/0.2.0/download"], - strip_prefix = "tracing-log-0.2.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tracing-log-0.2.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__tracing-subscriber-0.3.23", - sha256 = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319", - type = "tar.gz", - urls = ["https://static.crates.io/crates/tracing-subscriber/0.3.23/download"], - strip_prefix = "tracing-subscriber-0.3.23", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tracing-subscriber-0.3.23.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__tracing-tree-0.4.1", - sha256 = "ac87aa03b6a4d5a7e4810d1a80c19601dbe0f8a837e9177f23af721c7ba7beec", - type = "tar.gz", - urls = ["https://static.crates.io/crates/tracing-tree/0.4.1/download"], - strip_prefix = "tracing-tree-0.4.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tracing-tree-0.4.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__tree-sitter-0.26.9", - sha256 = "4dab76d0b724ba557954125188cf0633a1ca43199ced82d95c7b9c32cc3de1f3", - type = "tar.gz", - urls = ["https://static.crates.io/crates/tree-sitter/0.26.9/download"], - strip_prefix = "tree-sitter-0.26.9", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tree-sitter-0.26.9.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__tree-sitter-embedded-template-0.25.0", - sha256 = "833d528e8fcb4e49ddb04d4d6450ddb8ac08f282a58fec94ce981c9c5dbf7e3a", - type = "tar.gz", - urls = ["https://static.crates.io/crates/tree-sitter-embedded-template/0.25.0/download"], - strip_prefix = "tree-sitter-embedded-template-0.25.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tree-sitter-embedded-template-0.25.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__tree-sitter-json-0.24.8", - sha256 = "4d727acca406c0020cffc6cf35516764f36c8e3dc4408e5ebe2cb35a947ec471", - type = "tar.gz", - urls = ["https://static.crates.io/crates/tree-sitter-json/0.24.8/download"], - strip_prefix = "tree-sitter-json-0.24.8", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tree-sitter-json-0.24.8.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__tree-sitter-language-0.1.7", - sha256 = "009994f150cc0cd50ff54917d5bc8bffe8cad10ca10d81c34da2ec421ae61782", - type = "tar.gz", - urls = ["https://static.crates.io/crates/tree-sitter-language/0.1.7/download"], - strip_prefix = "tree-sitter-language-0.1.7", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tree-sitter-language-0.1.7.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__tree-sitter-python-0.25.0", - sha256 = "6bf85fd39652e740bf60f46f4cda9492c3a9ad75880575bf14960f775cb74a1c", - type = "tar.gz", - urls = ["https://static.crates.io/crates/tree-sitter-python/0.25.0/download"], - strip_prefix = "tree-sitter-python-0.25.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tree-sitter-python-0.25.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__tree-sitter-ql-0.23.1", - sha256 = "80b7bcaf39acefbb199417a6ec2fd0c038083ba115da3e4f4426c820dc76d386", - type = "tar.gz", - urls = ["https://static.crates.io/crates/tree-sitter-ql/0.23.1/download"], - strip_prefix = "tree-sitter-ql-0.23.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tree-sitter-ql-0.23.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__tree-sitter-ruby-0.23.1", - sha256 = "be0484ea4ef6bb9c575b4fdabde7e31340a8d2dbc7d52b321ac83da703249f95", - type = "tar.gz", - urls = ["https://static.crates.io/crates/tree-sitter-ruby/0.23.1/download"], - strip_prefix = "tree-sitter-ruby-0.23.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.tree-sitter-ruby-0.23.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__triomphe-0.1.16", - sha256 = "b40688ea6389c8171614b25491f71d4a27946e0c7ce2da1c6de27e25abf1a0ae", - type = "tar.gz", - urls = ["https://static.crates.io/crates/triomphe/0.1.16/download"], - strip_prefix = "triomphe-0.1.16", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.triomphe-0.1.16.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__typed-arena-2.0.2", - sha256 = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a", - type = "tar.gz", - urls = ["https://static.crates.io/crates/typed-arena/2.0.2/download"], - strip_prefix = "typed-arena-2.0.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.typed-arena-2.0.2.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__typeid-1.0.3", - sha256 = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c", - type = "tar.gz", - urls = ["https://static.crates.io/crates/typeid/1.0.3/download"], - strip_prefix = "typeid-1.0.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.typeid-1.0.3.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__uncased-0.9.10", - sha256 = "e1b88fcfe09e89d3866a5c11019378088af2d24c3fbd4f0543f96b479ec90697", - type = "tar.gz", - urls = ["https://static.crates.io/crates/uncased/0.9.10/download"], - strip_prefix = "uncased-0.9.10", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.uncased-0.9.10.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__ungrammar-1.16.1", - sha256 = "a3e5df347f0bf3ec1d670aad6ca5c6a1859cd9ea61d2113125794654ccced68f", - type = "tar.gz", - urls = ["https://static.crates.io/crates/ungrammar/1.16.1/download"], - strip_prefix = "ungrammar-1.16.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.ungrammar-1.16.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__unicode-ident-1.0.24", - sha256 = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75", - type = "tar.gz", - urls = ["https://static.crates.io/crates/unicode-ident/1.0.24/download"], - strip_prefix = "unicode-ident-1.0.24", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.unicode-ident-1.0.24.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__unicode-properties-0.1.4", - sha256 = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d", - type = "tar.gz", - urls = ["https://static.crates.io/crates/unicode-properties/0.1.4/download"], - strip_prefix = "unicode-properties-0.1.4", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.unicode-properties-0.1.4.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__unsafe-libyaml-0.2.11", - sha256 = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861", - type = "tar.gz", - urls = ["https://static.crates.io/crates/unsafe-libyaml/0.2.11/download"], - strip_prefix = "unsafe-libyaml-0.2.11", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.unsafe-libyaml-0.2.11.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__utf8parse-0.2.2", - sha256 = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821", - type = "tar.gz", - urls = ["https://static.crates.io/crates/utf8parse/0.2.2/download"], - strip_prefix = "utf8parse-0.2.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.utf8parse-0.2.2.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__valuable-0.1.1", - sha256 = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65", - type = "tar.gz", - urls = ["https://static.crates.io/crates/valuable/0.1.1/download"], - strip_prefix = "valuable-0.1.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.valuable-0.1.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__version_check-0.9.5", - sha256 = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a", - type = "tar.gz", - urls = ["https://static.crates.io/crates/version_check/0.9.5/download"], - strip_prefix = "version_check-0.9.5", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.version_check-0.9.5.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__walkdir-2.5.0", - sha256 = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b", - type = "tar.gz", - urls = ["https://static.crates.io/crates/walkdir/2.5.0/download"], - strip_prefix = "walkdir-2.5.0", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.walkdir-2.5.0.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__wasi-0.11.1-wasi-snapshot-preview1", - sha256 = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b", - type = "tar.gz", - urls = ["https://static.crates.io/crates/wasi/0.11.1+wasi-snapshot-preview1/download"], - strip_prefix = "wasi-0.11.1+wasi-snapshot-preview1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wasi-0.11.1+wasi-snapshot-preview1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__wasm-bindgen-0.2.126", - sha256 = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4", - type = "tar.gz", - urls = ["https://static.crates.io/crates/wasm-bindgen/0.2.126/download"], - strip_prefix = "wasm-bindgen-0.2.126", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wasm-bindgen-0.2.126.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__wasm-bindgen-macro-0.2.126", - sha256 = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1", - type = "tar.gz", - urls = ["https://static.crates.io/crates/wasm-bindgen-macro/0.2.126/download"], - strip_prefix = "wasm-bindgen-macro-0.2.126", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wasm-bindgen-macro-0.2.126.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__wasm-bindgen-macro-support-0.2.126", - sha256 = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e", - type = "tar.gz", - urls = ["https://static.crates.io/crates/wasm-bindgen-macro-support/0.2.126/download"], - strip_prefix = "wasm-bindgen-macro-support-0.2.126", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wasm-bindgen-macro-support-0.2.126.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__wasm-bindgen-shared-0.2.126", - sha256 = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24", - type = "tar.gz", - urls = ["https://static.crates.io/crates/wasm-bindgen-shared/0.2.126/download"], - strip_prefix = "wasm-bindgen-shared-0.2.126", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.wasm-bindgen-shared-0.2.126.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__winapi-util-0.1.11", - sha256 = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22", - type = "tar.gz", - urls = ["https://static.crates.io/crates/winapi-util/0.1.11/download"], - strip_prefix = "winapi-util-0.1.11", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.winapi-util-0.1.11.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__windows-core-0.62.2", - sha256 = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb", - type = "tar.gz", - urls = ["https://static.crates.io/crates/windows-core/0.62.2/download"], - strip_prefix = "windows-core-0.62.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows-core-0.62.2.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__windows-implement-0.60.2", - sha256 = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf", - type = "tar.gz", - urls = ["https://static.crates.io/crates/windows-implement/0.60.2/download"], - strip_prefix = "windows-implement-0.60.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows-implement-0.60.2.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__windows-interface-0.59.3", - sha256 = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358", - type = "tar.gz", - urls = ["https://static.crates.io/crates/windows-interface/0.59.3/download"], - strip_prefix = "windows-interface-0.59.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows-interface-0.59.3.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__windows-link-0.2.1", - sha256 = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5", - type = "tar.gz", - urls = ["https://static.crates.io/crates/windows-link/0.2.1/download"], - strip_prefix = "windows-link-0.2.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows-link-0.2.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__windows-result-0.4.1", - sha256 = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5", - type = "tar.gz", - urls = ["https://static.crates.io/crates/windows-result/0.4.1/download"], - strip_prefix = "windows-result-0.4.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows-result-0.4.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__windows-strings-0.5.1", - sha256 = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091", - type = "tar.gz", - urls = ["https://static.crates.io/crates/windows-strings/0.5.1/download"], - strip_prefix = "windows-strings-0.5.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows-strings-0.5.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__windows-sys-0.60.2", - sha256 = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb", - type = "tar.gz", - urls = ["https://static.crates.io/crates/windows-sys/0.60.2/download"], - strip_prefix = "windows-sys-0.60.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows-sys-0.60.2.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__windows-sys-0.61.2", - sha256 = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc", - type = "tar.gz", - urls = ["https://static.crates.io/crates/windows-sys/0.61.2/download"], - strip_prefix = "windows-sys-0.61.2", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows-sys-0.61.2.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__windows-targets-0.53.5", - sha256 = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3", - type = "tar.gz", - urls = ["https://static.crates.io/crates/windows-targets/0.53.5/download"], - strip_prefix = "windows-targets-0.53.5", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows-targets-0.53.5.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__windows_aarch64_gnullvm-0.53.1", - sha256 = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53", - type = "tar.gz", - urls = ["https://static.crates.io/crates/windows_aarch64_gnullvm/0.53.1/download"], - strip_prefix = "windows_aarch64_gnullvm-0.53.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows_aarch64_gnullvm-0.53.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__windows_aarch64_msvc-0.53.1", - sha256 = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006", - type = "tar.gz", - urls = ["https://static.crates.io/crates/windows_aarch64_msvc/0.53.1/download"], - strip_prefix = "windows_aarch64_msvc-0.53.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows_aarch64_msvc-0.53.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__windows_i686_gnu-0.53.1", - sha256 = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3", - type = "tar.gz", - urls = ["https://static.crates.io/crates/windows_i686_gnu/0.53.1/download"], - strip_prefix = "windows_i686_gnu-0.53.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows_i686_gnu-0.53.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__windows_i686_gnullvm-0.53.1", - sha256 = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c", - type = "tar.gz", - urls = ["https://static.crates.io/crates/windows_i686_gnullvm/0.53.1/download"], - strip_prefix = "windows_i686_gnullvm-0.53.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows_i686_gnullvm-0.53.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__windows_i686_msvc-0.53.1", - sha256 = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2", - type = "tar.gz", - urls = ["https://static.crates.io/crates/windows_i686_msvc/0.53.1/download"], - strip_prefix = "windows_i686_msvc-0.53.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows_i686_msvc-0.53.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__windows_x86_64_gnu-0.53.1", - sha256 = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499", - type = "tar.gz", - urls = ["https://static.crates.io/crates/windows_x86_64_gnu/0.53.1/download"], - strip_prefix = "windows_x86_64_gnu-0.53.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows_x86_64_gnu-0.53.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__windows_x86_64_gnullvm-0.53.1", - sha256 = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1", - type = "tar.gz", - urls = ["https://static.crates.io/crates/windows_x86_64_gnullvm/0.53.1/download"], - strip_prefix = "windows_x86_64_gnullvm-0.53.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows_x86_64_gnullvm-0.53.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__windows_x86_64_msvc-0.53.1", - sha256 = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650", - type = "tar.gz", - urls = ["https://static.crates.io/crates/windows_x86_64_msvc/0.53.1/download"], - strip_prefix = "windows_x86_64_msvc-0.53.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.windows_x86_64_msvc-0.53.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__winnow-0.7.15", - sha256 = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945", - type = "tar.gz", - urls = ["https://static.crates.io/crates/winnow/0.7.15/download"], - strip_prefix = "winnow-0.7.15", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.winnow-0.7.15.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__winnow-1.0.4", - sha256 = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81", - type = "tar.gz", - urls = ["https://static.crates.io/crates/winnow/1.0.4/download"], - strip_prefix = "winnow-1.0.4", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.winnow-1.0.4.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__yansi-1.0.1", - sha256 = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049", - type = "tar.gz", - urls = ["https://static.crates.io/crates/yansi/1.0.1/download"], - strip_prefix = "yansi-1.0.1", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.yansi-1.0.1.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__zmij-1.0.23", - sha256 = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b", - type = "tar.gz", - urls = ["https://static.crates.io/crates/zmij/1.0.23/download"], - strip_prefix = "zmij-1.0.23", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.zmij-1.0.23.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__zstd-0.13.3", - sha256 = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a", - type = "tar.gz", - urls = ["https://static.crates.io/crates/zstd/0.13.3/download"], - strip_prefix = "zstd-0.13.3", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.zstd-0.13.3.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__zstd-safe-7.2.4", - sha256 = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d", - type = "tar.gz", - urls = ["https://static.crates.io/crates/zstd-safe/7.2.4/download"], - strip_prefix = "zstd-safe-7.2.4", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.zstd-safe-7.2.4.bazel"), - ) - - maybe( - http_archive, - name = "vendor_ts__zstd-sys-2.0.16-zstd.1.5.7", - sha256 = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748", - type = "tar.gz", - urls = ["https://static.crates.io/crates/zstd-sys/2.0.16+zstd.1.5.7/download"], - strip_prefix = "zstd-sys-2.0.16+zstd.1.5.7", - build_file = Label("//misc/bazel/3rdparty/tree_sitter_extractors_deps:BUILD.zstd-sys-2.0.16+zstd.1.5.7.bazel"), - ) - - return [ - struct(repo = "vendor_ts__anyhow-1.0.104", is_dev_dep = False), - struct(repo = "vendor_ts__argfile-1.0.0", is_dev_dep = False), - struct(repo = "vendor_ts__chalk-ir-0.104.0", is_dev_dep = False), - struct(repo = "vendor_ts__chrono-0.4.45", is_dev_dep = False), - struct(repo = "vendor_ts__clap-4.6.6", is_dev_dep = False), - struct(repo = "vendor_ts__dunce-1.0.5", is_dev_dep = False), - struct(repo = "vendor_ts__either-1.17.0", is_dev_dep = False), - struct(repo = "vendor_ts__encoding-0.2.33", is_dev_dep = False), - struct(repo = "vendor_ts__figment-0.10.19", is_dev_dep = False), - struct(repo = "vendor_ts__flate2-1.1.9", is_dev_dep = False), - struct(repo = "vendor_ts__glob-0.3.4", is_dev_dep = False), - struct(repo = "vendor_ts__globset-0.4.18", is_dev_dep = False), - struct(repo = "vendor_ts__itertools-0.15.0", is_dev_dep = False), - struct(repo = "vendor_ts__lazy_static-1.5.0", is_dev_dep = False), - struct(repo = "vendor_ts__mustache-0.9.0", is_dev_dep = False), - struct(repo = "vendor_ts__num-traits-0.2.19", is_dev_dep = False), - struct(repo = "vendor_ts__num_cpus-1.17.0", is_dev_dep = False), - struct(repo = "vendor_ts__proc-macro2-1.0.107", is_dev_dep = False), - struct(repo = "vendor_ts__quote-1.0.47", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_base_db-0.0.347", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_cfg-0.0.347", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_hir-0.0.347", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_hir_def-0.0.347", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_hir_expand-0.0.347", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_hir_ty-0.0.347", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_ide_db-0.0.347", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_intern-0.0.347", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_load-cargo-0.0.347", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_parser-0.0.347", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_paths-0.0.347", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_project_model-0.0.347", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_span-0.0.347", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_stdx-0.0.347", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_syntax-0.0.347", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_syntax-bridge-0.0.347", is_dev_dep = False), - struct(repo = "vendor_ts__ra_ap_vfs-0.0.347", is_dev_dep = False), - struct(repo = "vendor_ts__rayon-1.12.0", is_dev_dep = False), - struct(repo = "vendor_ts__regex-1.13.1", is_dev_dep = False), - struct(repo = "vendor_ts__serde-1.0.229", is_dev_dep = False), - struct(repo = "vendor_ts__serde_json-1.0.151", is_dev_dep = False), - struct(repo = "vendor_ts__serde_with-3.22.0", is_dev_dep = False), - struct(repo = "vendor_ts__serde_yaml-0.9.34-deprecated", is_dev_dep = False), - struct(repo = "vendor_ts__syn-3.0.3", is_dev_dep = False), - struct(repo = "vendor_ts__toml-1.1.4-spec-1.1.0", is_dev_dep = False), - struct(repo = "vendor_ts__tracing-0.1.44", is_dev_dep = False), - struct(repo = "vendor_ts__tracing-flame-0.2.0", is_dev_dep = False), - struct(repo = "vendor_ts__tracing-subscriber-0.3.23", is_dev_dep = False), - struct(repo = "vendor_ts__tree-sitter-0.26.9", is_dev_dep = False), - struct(repo = "vendor_ts__tree-sitter-embedded-template-0.25.0", is_dev_dep = False), - struct(repo = "vendor_ts__tree-sitter-python-0.25.0", is_dev_dep = False), - struct(repo = "vendor_ts__tree-sitter-ruby-0.23.1", is_dev_dep = False), - struct(repo = "vendor_ts__triomphe-0.1.16", is_dev_dep = False), - struct(repo = "vendor_ts__ungrammar-1.16.1", is_dev_dep = False), - struct(repo = "vendor_ts__zstd-0.13.3", is_dev_dep = False), - struct(repo = "vendor_ts__rand-0.10.2", is_dev_dep = True), - struct(repo = "vendor_ts__tree-sitter-json-0.24.8", is_dev_dep = True), - struct(repo = "vendor_ts__tree-sitter-ql-0.23.1", is_dev_dep = True), - ] +"""Deprecated: re-exports the crate_universe macros from `:crates.bzl`.""" + +load( + ":crates.bzl", + _aliases = "aliases", + _all_crate_deps = "all_crate_deps", + _crate_deps = "crate_deps", + _crate_edition = "crate_edition", + _crate_repositories = "crate_repositories", +) + +aliases = _aliases +all_crate_deps = _all_crate_deps +crate_deps = _crate_deps +crate_edition = _crate_edition +crate_repositories = _crate_repositories diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/dunce-1.0.5/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/dunce-1.0.5/BUILD.bazel new file mode 100644 index 000000000000..51a71fbd99cc --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/dunce-1.0.5/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "dunce-1.0.5", + actual = "@vendor_ts__dunce-1.0.5//:dunce", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/dunce/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/dunce/BUILD.bazel new file mode 100644 index 000000000000..20a395e2a06b --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/dunce/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "dunce", + actual = "@vendor_ts__dunce-1.0.5//:dunce", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/either-1.17.0/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/either-1.17.0/BUILD.bazel new file mode 100644 index 000000000000..174861068ce7 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/either-1.17.0/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "either-1.17.0", + actual = "@vendor_ts__either-1.17.0//:either", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/either/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/either/BUILD.bazel new file mode 100644 index 000000000000..89cb4c273dd3 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/either/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "either", + actual = "@vendor_ts__either-1.17.0//:either", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/encoding-0.2.33/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/encoding-0.2.33/BUILD.bazel new file mode 100644 index 000000000000..afa34162b826 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/encoding-0.2.33/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "encoding-0.2.33", + actual = "@vendor_ts__encoding-0.2.33//:encoding", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/encoding/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/encoding/BUILD.bazel new file mode 100644 index 000000000000..3cdf487b2c0e --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/encoding/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "encoding", + actual = "@vendor_ts__encoding-0.2.33//:encoding", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/figment-0.10.19/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/figment-0.10.19/BUILD.bazel new file mode 100644 index 000000000000..5440d01deff9 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/figment-0.10.19/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "figment-0.10.19", + actual = "@vendor_ts__figment-0.10.19//:figment", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/figment/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/figment/BUILD.bazel new file mode 100644 index 000000000000..0ed2dd8af57c --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/figment/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "figment", + actual = "@vendor_ts__figment-0.10.19//:figment", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/flate2-1.1.9/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/flate2-1.1.9/BUILD.bazel new file mode 100644 index 000000000000..01b260daea49 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/flate2-1.1.9/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "flate2-1.1.9", + actual = "@vendor_ts__flate2-1.1.9//:flate2", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/flate2/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/flate2/BUILD.bazel new file mode 100644 index 000000000000..75cab3adff50 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/flate2/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "flate2", + actual = "@vendor_ts__flate2-1.1.9//:flate2", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/glob-0.3.4/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/glob-0.3.4/BUILD.bazel new file mode 100644 index 000000000000..af2be4898b7b --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/glob-0.3.4/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "glob-0.3.4", + actual = "@vendor_ts__glob-0.3.4//:glob", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/glob/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/glob/BUILD.bazel new file mode 100644 index 000000000000..7d7180483c6b --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/glob/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "glob", + actual = "@vendor_ts__glob-0.3.4//:glob", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/globset-0.4.18/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/globset-0.4.18/BUILD.bazel new file mode 100644 index 000000000000..c55adf24540c --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/globset-0.4.18/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "globset-0.4.18", + actual = "@vendor_ts__globset-0.4.18//:globset", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/globset/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/globset/BUILD.bazel new file mode 100644 index 000000000000..227ab092ee04 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/globset/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "globset", + actual = "@vendor_ts__globset-0.4.18//:globset", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/itertools-0.15.0/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/itertools-0.15.0/BUILD.bazel new file mode 100644 index 000000000000..e1a51d621c4d --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/itertools-0.15.0/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "itertools-0.15.0", + actual = "@vendor_ts__itertools-0.15.0//:itertools", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/itertools/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/itertools/BUILD.bazel new file mode 100644 index 000000000000..ede210e8f3fb --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/itertools/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "itertools", + actual = "@vendor_ts__itertools-0.15.0//:itertools", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/lazy_static-1.5.0/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/lazy_static-1.5.0/BUILD.bazel new file mode 100644 index 000000000000..90bcdad60bd0 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/lazy_static-1.5.0/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "lazy_static-1.5.0", + actual = "@vendor_ts__lazy_static-1.5.0//:lazy_static", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/lazy_static/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/lazy_static/BUILD.bazel new file mode 100644 index 000000000000..aa48e3ca0d71 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/lazy_static/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "lazy_static", + actual = "@vendor_ts__lazy_static-1.5.0//:lazy_static", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/mustache-0.9.0/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/mustache-0.9.0/BUILD.bazel new file mode 100644 index 000000000000..efad57611492 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/mustache-0.9.0/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "mustache-0.9.0", + actual = "@vendor_ts__mustache-0.9.0//:mustache", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/mustache/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/mustache/BUILD.bazel new file mode 100644 index 000000000000..23dee02bded5 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/mustache/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "mustache", + actual = "@vendor_ts__mustache-0.9.0//:mustache", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/num-traits-0.2.19/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/num-traits-0.2.19/BUILD.bazel new file mode 100644 index 000000000000..2a511d29c9d8 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/num-traits-0.2.19/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "num-traits-0.2.19", + actual = "@vendor_ts__num-traits-0.2.19//:num_traits", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/num-traits/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/num-traits/BUILD.bazel new file mode 100644 index 000000000000..62ca3f42144e --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/num-traits/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "num-traits", + actual = "@vendor_ts__num-traits-0.2.19//:num_traits", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/num_cpus-1.17.0/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/num_cpus-1.17.0/BUILD.bazel new file mode 100644 index 000000000000..3faa31f5f803 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/num_cpus-1.17.0/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "num_cpus-1.17.0", + actual = "@vendor_ts__num_cpus-1.17.0//:num_cpus", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/num_cpus/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/num_cpus/BUILD.bazel new file mode 100644 index 000000000000..ee8b9b8c23cc --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/num_cpus/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "num_cpus", + actual = "@vendor_ts__num_cpus-1.17.0//:num_cpus", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/proc-macro2-1.0.107/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/proc-macro2-1.0.107/BUILD.bazel new file mode 100644 index 000000000000..f18b6a1a57a3 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/proc-macro2-1.0.107/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "proc-macro2-1.0.107", + actual = "@vendor_ts__proc-macro2-1.0.107//:proc_macro2", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/proc-macro2/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/proc-macro2/BUILD.bazel new file mode 100644 index 000000000000..cda647ad06ec --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/proc-macro2/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "proc-macro2", + actual = "@vendor_ts__proc-macro2-1.0.107//:proc_macro2", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/quote-1.0.47/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/quote-1.0.47/BUILD.bazel new file mode 100644 index 000000000000..fad5a98cf61a --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/quote-1.0.47/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "quote-1.0.47", + actual = "@vendor_ts__quote-1.0.47//:quote", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/quote/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/quote/BUILD.bazel new file mode 100644 index 000000000000..30a4bb96671a --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/quote/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "quote", + actual = "@vendor_ts__quote-1.0.47//:quote", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_base_db-0.0.347/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_base_db-0.0.347/BUILD.bazel new file mode 100644 index 000000000000..6d34352f7624 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_base_db-0.0.347/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_base_db-0.0.347", + actual = "@vendor_ts__ra_ap_base_db-0.0.347//:ra_ap_base_db", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_base_db/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_base_db/BUILD.bazel new file mode 100644 index 000000000000..e4143c5deb6a --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_base_db/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_base_db", + actual = "@vendor_ts__ra_ap_base_db-0.0.347//:ra_ap_base_db", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_cfg-0.0.347/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_cfg-0.0.347/BUILD.bazel new file mode 100644 index 000000000000..174228dffde3 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_cfg-0.0.347/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_cfg-0.0.347", + actual = "@vendor_ts__ra_ap_cfg-0.0.347//:ra_ap_cfg", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_cfg/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_cfg/BUILD.bazel new file mode 100644 index 000000000000..d4b66cf510a1 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_cfg/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_cfg", + actual = "@vendor_ts__ra_ap_cfg-0.0.347//:ra_ap_cfg", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir-0.0.347/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir-0.0.347/BUILD.bazel new file mode 100644 index 000000000000..557cfeb56135 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir-0.0.347/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_hir-0.0.347", + actual = "@vendor_ts__ra_ap_hir-0.0.347//:ra_ap_hir", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir/BUILD.bazel new file mode 100644 index 000000000000..31daac1890cc --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_hir", + actual = "@vendor_ts__ra_ap_hir-0.0.347//:ra_ap_hir", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir_def-0.0.347/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir_def-0.0.347/BUILD.bazel new file mode 100644 index 000000000000..1e06257bf196 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir_def-0.0.347/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_hir_def-0.0.347", + actual = "@vendor_ts__ra_ap_hir_def-0.0.347//:ra_ap_hir_def", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir_def/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir_def/BUILD.bazel new file mode 100644 index 000000000000..724e057553f1 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir_def/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_hir_def", + actual = "@vendor_ts__ra_ap_hir_def-0.0.347//:ra_ap_hir_def", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir_expand-0.0.347/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir_expand-0.0.347/BUILD.bazel new file mode 100644 index 000000000000..4de2d355ce21 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir_expand-0.0.347/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_hir_expand-0.0.347", + actual = "@vendor_ts__ra_ap_hir_expand-0.0.347//:ra_ap_hir_expand", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir_expand/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir_expand/BUILD.bazel new file mode 100644 index 000000000000..821261303300 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir_expand/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_hir_expand", + actual = "@vendor_ts__ra_ap_hir_expand-0.0.347//:ra_ap_hir_expand", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir_ty-0.0.347/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir_ty-0.0.347/BUILD.bazel new file mode 100644 index 000000000000..78cb7773e47a --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir_ty-0.0.347/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_hir_ty-0.0.347", + actual = "@vendor_ts__ra_ap_hir_ty-0.0.347//:ra_ap_hir_ty", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir_ty/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir_ty/BUILD.bazel new file mode 100644 index 000000000000..5b228755d2b5 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_hir_ty/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_hir_ty", + actual = "@vendor_ts__ra_ap_hir_ty-0.0.347//:ra_ap_hir_ty", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_ide_db-0.0.347/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_ide_db-0.0.347/BUILD.bazel new file mode 100644 index 000000000000..f760fab13751 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_ide_db-0.0.347/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_ide_db-0.0.347", + actual = "@vendor_ts__ra_ap_ide_db-0.0.347//:ra_ap_ide_db", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_ide_db/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_ide_db/BUILD.bazel new file mode 100644 index 000000000000..b558c2a8098d --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_ide_db/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_ide_db", + actual = "@vendor_ts__ra_ap_ide_db-0.0.347//:ra_ap_ide_db", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_intern-0.0.347/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_intern-0.0.347/BUILD.bazel new file mode 100644 index 000000000000..ea853396104a --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_intern-0.0.347/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_intern-0.0.347", + actual = "@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_intern/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_intern/BUILD.bazel new file mode 100644 index 000000000000..8635a9422268 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_intern/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_intern", + actual = "@vendor_ts__ra_ap_intern-0.0.347//:ra_ap_intern", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_load-cargo-0.0.347/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_load-cargo-0.0.347/BUILD.bazel new file mode 100644 index 000000000000..00db68260ecc --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_load-cargo-0.0.347/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_load-cargo-0.0.347", + actual = "@vendor_ts__ra_ap_load-cargo-0.0.347//:ra_ap_load_cargo", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_load-cargo/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_load-cargo/BUILD.bazel new file mode 100644 index 000000000000..1b89aab84736 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_load-cargo/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_load-cargo", + actual = "@vendor_ts__ra_ap_load-cargo-0.0.347//:ra_ap_load_cargo", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_parser-0.0.347/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_parser-0.0.347/BUILD.bazel new file mode 100644 index 000000000000..ca368cb518f0 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_parser-0.0.347/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_parser-0.0.347", + actual = "@vendor_ts__ra_ap_parser-0.0.347//:ra_ap_parser", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_parser/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_parser/BUILD.bazel new file mode 100644 index 000000000000..4d00f8000d5b --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_parser/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_parser", + actual = "@vendor_ts__ra_ap_parser-0.0.347//:ra_ap_parser", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_paths-0.0.347/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_paths-0.0.347/BUILD.bazel new file mode 100644 index 000000000000..92a64bf9c3ec --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_paths-0.0.347/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_paths-0.0.347", + actual = "@vendor_ts__ra_ap_paths-0.0.347//:ra_ap_paths", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_paths/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_paths/BUILD.bazel new file mode 100644 index 000000000000..8e89532640e3 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_paths/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_paths", + actual = "@vendor_ts__ra_ap_paths-0.0.347//:ra_ap_paths", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_project_model-0.0.347/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_project_model-0.0.347/BUILD.bazel new file mode 100644 index 000000000000..015ee1054ec9 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_project_model-0.0.347/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_project_model-0.0.347", + actual = "@vendor_ts__ra_ap_project_model-0.0.347//:ra_ap_project_model", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_project_model/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_project_model/BUILD.bazel new file mode 100644 index 000000000000..a7c77d60c859 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_project_model/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_project_model", + actual = "@vendor_ts__ra_ap_project_model-0.0.347//:ra_ap_project_model", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_span-0.0.347/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_span-0.0.347/BUILD.bazel new file mode 100644 index 000000000000..386951ce749a --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_span-0.0.347/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_span-0.0.347", + actual = "@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_span/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_span/BUILD.bazel new file mode 100644 index 000000000000..8c65ab706007 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_span/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_span", + actual = "@vendor_ts__ra_ap_span-0.0.347//:ra_ap_span", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_stdx-0.0.347/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_stdx-0.0.347/BUILD.bazel new file mode 100644 index 000000000000..e3d1d6180e28 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_stdx-0.0.347/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_stdx-0.0.347", + actual = "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_syntax-0.0.347/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_syntax-0.0.347/BUILD.bazel new file mode 100644 index 000000000000..f4560fbb8129 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_syntax-0.0.347/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_syntax-0.0.347", + actual = "@vendor_ts__ra_ap_syntax-0.0.347//:ra_ap_syntax", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_syntax-bridge-0.0.347/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_syntax-bridge-0.0.347/BUILD.bazel new file mode 100644 index 000000000000..40c10216994f --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_syntax-bridge-0.0.347/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_syntax-bridge-0.0.347", + actual = "@vendor_ts__ra_ap_syntax-bridge-0.0.347//:ra_ap_syntax_bridge", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_syntax-bridge/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_syntax-bridge/BUILD.bazel new file mode 100644 index 000000000000..087d7f5674b5 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_syntax-bridge/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_syntax-bridge", + actual = "@vendor_ts__ra_ap_syntax-bridge-0.0.347//:ra_ap_syntax_bridge", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_syntax/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_syntax/BUILD.bazel new file mode 100644 index 000000000000..d50befd12920 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_syntax/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_syntax", + actual = "@vendor_ts__ra_ap_syntax-0.0.347//:ra_ap_syntax", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_vfs-0.0.347/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_vfs-0.0.347/BUILD.bazel new file mode 100644 index 000000000000..06f96600de4c --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_vfs-0.0.347/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_vfs-0.0.347", + actual = "@vendor_ts__ra_ap_vfs-0.0.347//:ra_ap_vfs", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_vfs/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_vfs/BUILD.bazel new file mode 100644 index 000000000000..2c22c96ee4ff --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_vfs/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_vfs", + actual = "@vendor_ts__ra_ap_vfs-0.0.347//:ra_ap_vfs", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/rand-0.10.2/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/rand-0.10.2/BUILD.bazel new file mode 100644 index 000000000000..60178e6c9a2a --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/rand-0.10.2/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "rand-0.10.2", + actual = "@vendor_ts__rand-0.10.2//:rand", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/rand/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/rand/BUILD.bazel new file mode 100644 index 000000000000..5a83136d9d6e --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/rand/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "rand", + actual = "@vendor_ts__rand-0.10.2//:rand", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/rayon-1.12.0/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/rayon-1.12.0/BUILD.bazel new file mode 100644 index 000000000000..375eae0288e9 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/rayon-1.12.0/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "rayon-1.12.0", + actual = "@vendor_ts__rayon-1.12.0//:rayon", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/rayon/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/rayon/BUILD.bazel new file mode 100644 index 000000000000..456a6693f51a --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/rayon/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "rayon", + actual = "@vendor_ts__rayon-1.12.0//:rayon", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/regex-1.13.1/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/regex-1.13.1/BUILD.bazel new file mode 100644 index 000000000000..392a18a9b79b --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/regex-1.13.1/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "regex-1.13.1", + actual = "@vendor_ts__regex-1.13.1//:regex", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/regex/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/regex/BUILD.bazel new file mode 100644 index 000000000000..36658463cff8 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/regex/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "regex", + actual = "@vendor_ts__regex-1.13.1//:regex", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/serde-1.0.229/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/serde-1.0.229/BUILD.bazel new file mode 100644 index 000000000000..da47d9e809ca --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/serde-1.0.229/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "serde-1.0.229", + actual = "@vendor_ts__serde-1.0.229//:serde", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/serde/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/serde/BUILD.bazel new file mode 100644 index 000000000000..667e68cba9c5 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/serde/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "serde", + actual = "@vendor_ts__serde-1.0.229//:serde", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/serde_json-1.0.151/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/serde_json-1.0.151/BUILD.bazel new file mode 100644 index 000000000000..c6e3be6630ab --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/serde_json-1.0.151/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "serde_json-1.0.151", + actual = "@vendor_ts__serde_json-1.0.151//:serde_json", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/serde_json/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/serde_json/BUILD.bazel new file mode 100644 index 000000000000..a235a8747882 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/serde_json/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "serde_json", + actual = "@vendor_ts__serde_json-1.0.151//:serde_json", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/serde_with-3.22.0/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/serde_with-3.22.0/BUILD.bazel new file mode 100644 index 000000000000..d72d8ca8d74d --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/serde_with-3.22.0/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "serde_with-3.22.0", + actual = "@vendor_ts__serde_with-3.22.0//:serde_with", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/serde_with/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/serde_with/BUILD.bazel new file mode 100644 index 000000000000..d135dc30d9ea --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/serde_with/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "serde_with", + actual = "@vendor_ts__serde_with-3.22.0//:serde_with", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/serde_yaml-0.9.34+deprecated/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/serde_yaml-0.9.34+deprecated/BUILD.bazel new file mode 100644 index 000000000000..b4d5322e507f --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/serde_yaml-0.9.34+deprecated/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "serde_yaml-0.9.34+deprecated", + actual = "@vendor_ts__serde_yaml-0.9.34-deprecated//:serde_yaml", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/serde_yaml/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/serde_yaml/BUILD.bazel new file mode 100644 index 000000000000..a6bbe7aa33ff --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/serde_yaml/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "serde_yaml", + actual = "@vendor_ts__serde_yaml-0.9.34-deprecated//:serde_yaml", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/stdx-0.0.347/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/stdx-0.0.347/BUILD.bazel new file mode 100644 index 000000000000..9e425e140f0d --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/stdx-0.0.347/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "stdx-0.0.347", + actual = "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/stdx/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/stdx/BUILD.bazel new file mode 100644 index 000000000000..d1c0b6a8d09b --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/stdx/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "stdx", + actual = "@vendor_ts__ra_ap_stdx-0.0.347//:ra_ap_stdx", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/syn-3.0.3/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/syn-3.0.3/BUILD.bazel new file mode 100644 index 000000000000..59343842e751 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/syn-3.0.3/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "syn-3.0.3", + actual = "@vendor_ts__syn-3.0.3//:syn", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/syn/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/syn/BUILD.bazel new file mode 100644 index 000000000000..f468de53f06b --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/syn/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "syn", + actual = "@vendor_ts__syn-3.0.3//:syn", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/toml-1.1.4+spec-1.1.0/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/toml-1.1.4+spec-1.1.0/BUILD.bazel new file mode 100644 index 000000000000..73860e361843 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/toml-1.1.4+spec-1.1.0/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "toml-1.1.4+spec-1.1.0", + actual = "@vendor_ts__toml-1.1.4-spec-1.1.0//:toml", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/toml/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/toml/BUILD.bazel new file mode 100644 index 000000000000..d5f896d5eadd --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/toml/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "toml", + actual = "@vendor_ts__toml-1.1.4-spec-1.1.0//:toml", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/tracing-0.1.44/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tracing-0.1.44/BUILD.bazel new file mode 100644 index 000000000000..35e591002a36 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tracing-0.1.44/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "tracing-0.1.44", + actual = "@vendor_ts__tracing-0.1.44//:tracing", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/tracing-flame-0.2.0/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tracing-flame-0.2.0/BUILD.bazel new file mode 100644 index 000000000000..2c641a961ed2 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tracing-flame-0.2.0/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "tracing-flame-0.2.0", + actual = "@vendor_ts__tracing-flame-0.2.0//:tracing_flame", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/tracing-flame/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tracing-flame/BUILD.bazel new file mode 100644 index 000000000000..b2746239b9b2 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tracing-flame/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "tracing-flame", + actual = "@vendor_ts__tracing-flame-0.2.0//:tracing_flame", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/tracing-subscriber-0.3.23/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tracing-subscriber-0.3.23/BUILD.bazel new file mode 100644 index 000000000000..8d69c6f00c98 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tracing-subscriber-0.3.23/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "tracing-subscriber-0.3.23", + actual = "@vendor_ts__tracing-subscriber-0.3.23//:tracing_subscriber", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/tracing-subscriber/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tracing-subscriber/BUILD.bazel new file mode 100644 index 000000000000..bd028fa3c4cd --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tracing-subscriber/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "tracing-subscriber", + actual = "@vendor_ts__tracing-subscriber-0.3.23//:tracing_subscriber", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/tracing/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tracing/BUILD.bazel new file mode 100644 index 000000000000..7c70f0946694 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tracing/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "tracing", + actual = "@vendor_ts__tracing-0.1.44//:tracing", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-0.26.9/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-0.26.9/BUILD.bazel new file mode 100644 index 000000000000..bb089d3bae5b --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-0.26.9/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "tree-sitter-0.26.9", + actual = "@vendor_ts__tree-sitter-0.26.9//:tree_sitter", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-embedded-template-0.25.0/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-embedded-template-0.25.0/BUILD.bazel new file mode 100644 index 000000000000..8cdd2b80ef48 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-embedded-template-0.25.0/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "tree-sitter-embedded-template-0.25.0", + actual = "@vendor_ts__tree-sitter-embedded-template-0.25.0//:tree_sitter_embedded_template", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-embedded-template/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-embedded-template/BUILD.bazel new file mode 100644 index 000000000000..44c55f4f1356 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-embedded-template/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "tree-sitter-embedded-template", + actual = "@vendor_ts__tree-sitter-embedded-template-0.25.0//:tree_sitter_embedded_template", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-json-0.24.8/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-json-0.24.8/BUILD.bazel new file mode 100644 index 000000000000..ac225cb7190f --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-json-0.24.8/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "tree-sitter-json-0.24.8", + actual = "@vendor_ts__tree-sitter-json-0.24.8//:tree_sitter_json", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-json/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-json/BUILD.bazel new file mode 100644 index 000000000000..984766ca7f00 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-json/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "tree-sitter-json", + actual = "@vendor_ts__tree-sitter-json-0.24.8//:tree_sitter_json", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-python-0.25.0/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-python-0.25.0/BUILD.bazel new file mode 100644 index 000000000000..e457a6d859bc --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-python-0.25.0/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "tree-sitter-python-0.25.0", + actual = "@vendor_ts__tree-sitter-python-0.25.0//:tree_sitter_python", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-python/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-python/BUILD.bazel new file mode 100644 index 000000000000..83d48c1d99af --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-python/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "tree-sitter-python", + actual = "@vendor_ts__tree-sitter-python-0.25.0//:tree_sitter_python", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-ql-0.23.1/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-ql-0.23.1/BUILD.bazel new file mode 100644 index 000000000000..e825552920d1 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-ql-0.23.1/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "tree-sitter-ql-0.23.1", + actual = "@vendor_ts__tree-sitter-ql-0.23.1//:tree_sitter_ql", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-ql/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-ql/BUILD.bazel new file mode 100644 index 000000000000..acf0db48ed55 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-ql/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "tree-sitter-ql", + actual = "@vendor_ts__tree-sitter-ql-0.23.1//:tree_sitter_ql", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-ruby-0.23.1/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-ruby-0.23.1/BUILD.bazel new file mode 100644 index 000000000000..1848cc88cefe --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-ruby-0.23.1/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "tree-sitter-ruby-0.23.1", + actual = "@vendor_ts__tree-sitter-ruby-0.23.1//:tree_sitter_ruby", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-ruby/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-ruby/BUILD.bazel new file mode 100644 index 000000000000..ec85d9a20497 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter-ruby/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "tree-sitter-ruby", + actual = "@vendor_ts__tree-sitter-ruby-0.23.1//:tree_sitter_ruby", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter/BUILD.bazel new file mode 100644 index 000000000000..8ecd89c77e5b --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/tree-sitter/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "tree-sitter", + actual = "@vendor_ts__tree-sitter-0.26.9//:tree_sitter", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/triomphe-0.1.16/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/triomphe-0.1.16/BUILD.bazel new file mode 100644 index 000000000000..20d507a4952e --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/triomphe-0.1.16/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "triomphe-0.1.16", + actual = "@vendor_ts__triomphe-0.1.16//:triomphe", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/triomphe/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/triomphe/BUILD.bazel new file mode 100644 index 000000000000..d3048533792a --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/triomphe/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "triomphe", + actual = "@vendor_ts__triomphe-0.1.16//:triomphe", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ungrammar-1.16.1/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ungrammar-1.16.1/BUILD.bazel new file mode 100644 index 000000000000..3c2dbccf074d --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ungrammar-1.16.1/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ungrammar-1.16.1", + actual = "@vendor_ts__ungrammar-1.16.1//:ungrammar", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ungrammar/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ungrammar/BUILD.bazel new file mode 100644 index 000000000000..ed687cea91b3 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ungrammar/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ungrammar", + actual = "@vendor_ts__ungrammar-1.16.1//:ungrammar", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/zstd-0.13.3/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/zstd-0.13.3/BUILD.bazel new file mode 100644 index 000000000000..1aa948ae3df7 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/zstd-0.13.3/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "zstd-0.13.3", + actual = "@vendor_ts__zstd-0.13.3//:zstd", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/zstd/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/zstd/BUILD.bazel new file mode 100644 index 000000000000..112a16efc53a --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/zstd/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "zstd", + actual = "@vendor_ts__zstd-0.13.3//:zstd", + tags = ["manual"], +) From 5db5bd78d451d62da3ca4c62d861191d673de882 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 14 Aug 2026 13:10:22 +0200 Subject: [PATCH 0310/2098] Rust: resolve `rust.ungram` under aggregated vendor repo layout `rules_rust` 0.73 vendors crates as subpackages of a single `@vendor_ts` repo (a per-crate alias) rather than one repo per crate. `rust.ungram` is only exported from the crate's own vendored repo, so derive that repo from the crate label instead of assuming the crate sits at a repo root. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 890cb55d-0437-4bd7-9268-87b8897ada01 --- rust/ast-generator/BUILD.bazel | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/rust/ast-generator/BUILD.bazel b/rust/ast-generator/BUILD.bazel index 24d429cbede9..8c43aa7483c0 100644 --- a/rust/ast-generator/BUILD.bazel +++ b/rust/ast-generator/BUILD.bazel @@ -8,11 +8,15 @@ load("//misc/bazel/3rdparty/tree_sitter_extractors_deps:defs.bzl", "aliases", "a "rust/extractor", ) -ra_ap_syntax_workspace, _, _ = str(ra_ap_syntax_label).partition("//") +# `rust.ungram` is exported by the `ra_ap_syntax` crate, but only its default target is reachable +# through the aggregated `@vendor_ts` repo (the per-crate package there is just an alias). The file +# itself lives in the crate's own vendored repo, named `__`. Derive that +# repo from the crate label so this stays version-independent. +_vendor_repo, _, _crate_package = str(ra_ap_syntax_label).partition(":")[0].partition("//") alias( name = "rust.ungram", - actual = "%s//:rust.ungram" % ra_ap_syntax_workspace, + actual = "%s__%s//:rust.ungram" % (_vendor_repo, _crate_package), visibility = ["//rust/codegen:__pkg__"], ) From 7f665fc981878579379eeaf97939c10c898f6d34 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 14 Aug 2026 13:10:29 +0200 Subject: [PATCH 0311/2098] Rust: document new AST nodes and regenerate Add QLDoc annotations for the AST nodes introduced by ra_ap 0.0.347 (`DerefPat`, `ImplRestriction`, `IncludeBytesExpr`, `MutRestriction`, `NotNull`, `PatternTypeRepr`, `VisibilityInner`). `DerefPat`, `IncludeBytesExpr` and `NotNull` keep `cfg=True` so annotating them does not drop their CFG nodes. The example snippets double as generated extractor tests. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 890cb55d-0437-4bd7-9268-87b8897ada01 --- rust/ql/.generated.list | 56 +++++++-------- rust/ql/.gitattributes | 10 +-- .../internal/generated/CfgNodes.qll | 15 ++++ rust/ql/lib/codeql/rust/elements/DerefPat.qll | 9 +++ .../codeql/rust/elements/ImplRestriction.qll | 3 + .../codeql/rust/elements/IncludeBytesExpr.qll | 6 ++ .../codeql/rust/elements/MutRestriction.qll | 3 + rust/ql/lib/codeql/rust/elements/NotNull.qll | 6 ++ .../codeql/rust/elements/PatternTypeRepr.qll | 6 ++ .../codeql/rust/elements/VisibilityInner.qll | 7 ++ .../rust/elements/internal/DerefPatImpl.qll | 9 +++ .../elements/internal/ImplRestrictionImpl.qll | 3 + .../internal/IncludeBytesExprImpl.qll | 6 ++ .../elements/internal/MutRestrictionImpl.qll | 3 + .../rust/elements/internal/NotNullImpl.qll | 6 ++ .../elements/internal/PatternTypeReprImpl.qll | 6 ++ .../elements/internal/VisibilityInnerImpl.qll | 7 ++ .../elements/internal/generated/DerefPat.qll | 7 ++ .../internal/generated/ImplRestriction.qll | 1 + .../internal/generated/IncludeBytesExpr.qll | 4 ++ .../internal/generated/MutRestriction.qll | 1 + .../elements/internal/generated/NotNull.qll | 4 ++ .../internal/generated/PatternTypeRepr.qll | 4 ++ .../rust/elements/internal/generated/Raw.qll | 26 +++++++ .../internal/generated/VisibilityInner.qll | 5 ++ .../generated/.generated_tests.list | 5 ++ .../extractor-tests/generated/.gitattributes | 5 ++ .../generated/DerefPat/DerefPat.expected | 4 ++ .../generated/DerefPat/DerefPat.ql | 9 +++ .../generated/DerefPat/MISSING_SOURCE.txt | 4 -- .../generated/DerefPat/gen_deref_pat.rs | 9 +++ .../IncludeBytesExpr.expected | 1 + .../IncludeBytesExpr/IncludeBytesExpr.ql | 5 ++ .../IncludeBytesExpr/MISSING_SOURCE.txt | 4 -- .../gen_include_bytes_expr.rs | 6 ++ .../generated/NotNull/MISSING_SOURCE.txt | 4 -- .../generated/NotNull/NotNull.expected | 1 + .../generated/NotNull/NotNull.ql | 5 ++ .../generated/NotNull/gen_not_null.rs | 6 ++ .../PatternTypeRepr/MISSING_SOURCE.txt | 4 -- .../PatternTypeRepr/PatternTypeRepr.expected | 6 ++ .../PatternTypeRepr/PatternTypeRepr.ql | 13 ++++ .../PatternTypeRepr/gen_pattern_type_repr.rs | 6 ++ .../VisibilityInner/MISSING_SOURCE.txt | 4 -- .../VisibilityInner/VisibilityInner.expected | 4 ++ .../VisibilityInner/VisibilityInner.ql | 9 +++ .../VisibilityInner/gen_visibility_inner.rs | 7 ++ rust/schema/annotations.py | 68 +++++++++++++++++++ 48 files changed, 349 insertions(+), 53 deletions(-) create mode 100644 rust/ql/test/extractor-tests/generated/DerefPat/DerefPat.expected create mode 100644 rust/ql/test/extractor-tests/generated/DerefPat/DerefPat.ql delete mode 100644 rust/ql/test/extractor-tests/generated/DerefPat/MISSING_SOURCE.txt create mode 100644 rust/ql/test/extractor-tests/generated/DerefPat/gen_deref_pat.rs create mode 100644 rust/ql/test/extractor-tests/generated/IncludeBytesExpr/IncludeBytesExpr.expected create mode 100644 rust/ql/test/extractor-tests/generated/IncludeBytesExpr/IncludeBytesExpr.ql delete mode 100644 rust/ql/test/extractor-tests/generated/IncludeBytesExpr/MISSING_SOURCE.txt create mode 100644 rust/ql/test/extractor-tests/generated/IncludeBytesExpr/gen_include_bytes_expr.rs delete mode 100644 rust/ql/test/extractor-tests/generated/NotNull/MISSING_SOURCE.txt create mode 100644 rust/ql/test/extractor-tests/generated/NotNull/NotNull.expected create mode 100644 rust/ql/test/extractor-tests/generated/NotNull/NotNull.ql create mode 100644 rust/ql/test/extractor-tests/generated/NotNull/gen_not_null.rs delete mode 100644 rust/ql/test/extractor-tests/generated/PatternTypeRepr/MISSING_SOURCE.txt create mode 100644 rust/ql/test/extractor-tests/generated/PatternTypeRepr/PatternTypeRepr.expected create mode 100644 rust/ql/test/extractor-tests/generated/PatternTypeRepr/PatternTypeRepr.ql create mode 100644 rust/ql/test/extractor-tests/generated/PatternTypeRepr/gen_pattern_type_repr.rs delete mode 100644 rust/ql/test/extractor-tests/generated/VisibilityInner/MISSING_SOURCE.txt create mode 100644 rust/ql/test/extractor-tests/generated/VisibilityInner/VisibilityInner.expected create mode 100644 rust/ql/test/extractor-tests/generated/VisibilityInner/VisibilityInner.ql create mode 100644 rust/ql/test/extractor-tests/generated/VisibilityInner/gen_visibility_inner.rs diff --git a/rust/ql/.generated.list b/rust/ql/.generated.list index 607a31d0e1f1..6f00390186b9 100644 --- a/rust/ql/.generated.list +++ b/rust/ql/.generated.list @@ -1,4 +1,4 @@ -lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll 042777a6b8f8ad63371d724d7f58dde13b5e020e74e6b0b4eadfe58845d66e5a 816b0ec2578eba21435a380b31e56311d68c14e921c201b6b350b7db913e4d22 +lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll 1eaae0657801b46ecca66527d95959891b3dea5b7487dc98844e03043adf6e7f 56d999c0ab5d99ef8a41c022ec59c98f670b42b9d90c73e830f1fb32a9a50acf lib/codeql/rust/elements/Abi.qll 485a2e79f6f7bfd1c02a6e795a71e62dede3c3e150149d5f8f18b761253b7208 6159ba175e7ead0dd2e3f2788f49516c306ee11b1a443bd4bdc00b7017d559bd lib/codeql/rust/elements/Addressable.qll 13011bfd2e1556694c3d440cc34af8527da4df49ad92b62f2939d3699ff2cea5 ddb25935f7553a1a384b1abe2e4b4fa90ab50b952dadec32fd867afcb054f4be lib/codeql/rust/elements/ArgList.qll 3d2f6f5542340b80a4c6e944ac17aba0d00727588bb66e501453ac0f80c82f83 afd52700bf5a337f19827846667cd0fb1fea5abbbcbc353828e292a727ea58c9 @@ -47,7 +47,7 @@ lib/codeql/rust/elements/ConstBlockPat.qll a25f42b84dbeb33e10955735ef53b8bb7e325 lib/codeql/rust/elements/ConstParam.qll 87776586f7ff562ff3c71373f45cf70486f9a832613a0aaac943311c451cc057 67a31616688106d5130951f2162e5229bff0fde08ff647943663cac427d7048b lib/codeql/rust/elements/ContinueExpr.qll 9f27c5d5c819ad0ebc5bd10967ba8d33a9dc95b9aae278fcfb1fcf9216bda79c 0dc061445a6b89854fdce92aaf022fdc76b724511a50bb777496ce75c9ecb262 lib/codeql/rust/elements/Crate.qll 1426960e6f36195e42ea5ea321405c1a72fccd40cd6c0a33673c321c20302d8d 1571a89f89dab43c5291b71386de7aadf52730755ba10f9d696db9ad2f760aff -lib/codeql/rust/elements/DerefPat.qll 919e409e3b1130a4f55ec1e3854917e4868bea7b5eab4ab8625248317342fa83 0d065ea4a84c3c8575b5b4aade25b170fe30154c4ca819c3e2ee78bb85deaa5a +lib/codeql/rust/elements/DerefPat.qll 47bcf75cba839dbd7d1e28da9394bd656c0cf488c0ee8a6cd86c361d0e3d838f 6cab387609121532647b4862653237d08309fbc0ded330933316024ecec0c872 lib/codeql/rust/elements/DynTraitTypeRepr.qll e4d27112d27ae93c621defd2c976fd4e90663ab7f6115e83ae4fe8106cb5e015 eb9fde89698588f3b7116f62388c54e937f99559b22c93d11a5596e754560072 lib/codeql/rust/elements/Element.qll 0b62d139fef54ed2cf2e2334806aa9bfbc036c9c2085d558f15a42cc3fa84c48 24b999b93df79383ef27ede46e38da752868c88a07fe35fcff5d526684ba7294 lib/codeql/rust/elements/Enum.qll 13c1a3bddfff6c9cc644902652883aefc7721bc94bd8084a1a49acc156996d12 17a898434329437479de4fef27ce11f5996b1953168066bd6d51f93594cc79d1 @@ -76,9 +76,9 @@ lib/codeql/rust/elements/GenericParamList.qll 25fcaa68bc7798d75974d12607fae0afc7 lib/codeql/rust/elements/IdentPat.qll ad5f202316d4eeee3ca81ea445728f4ad7eb6bb7d81232bc958c22a93d064bf2 7ce2772e391e593d8fd23b2b44e26d0d7e780327ec973fcc9dce52a75fda0e36 lib/codeql/rust/elements/IfExpr.qll f62153e8098b3eb08b569d4e25c750bc686665651579db4bc9e11dcef8e75d63 55006a55d612f189e73caa02f7b4deda388c692f0a801cdda9f833f2afdca778 lib/codeql/rust/elements/Impl.qll 0d69c9ace5dac87ed095cfd5d4a8baf7e17ebce1132f3a7d6fa2bf4325deff8d d908fc5da7d3a59fb0a286a6ce581bdabdb48c4ac6ecd070455c271c2352208c -lib/codeql/rust/elements/ImplRestriction.qll ac65497ed1cfb043933811537cf4ee4586efcaf04127d84a59bee7186b1e547c dd9e62f03e6b76e040c8a1add724804157c9ded3fe3bdcb866fab11118da5646 +lib/codeql/rust/elements/ImplRestriction.qll 2282977f216bf14779fc160c3faa6d261aa2892450701c7b4312e5085240eaeb f242f91243475380de834d8780355ab0bf582a9aa1e9f882ddbedb87559345cf lib/codeql/rust/elements/ImplTraitTypeRepr.qll 1d559b16c659f447a1bde94cc656718f20f133f767060437b755ac81eea9f852 de69c596701f0af4db28c5802d092a39c88a90bf42ea85aea25eecb79417e454 -lib/codeql/rust/elements/IncludeBytesExpr.qll e5ae75699b7f29512bca874d6626376827f4dd30a9075d4ad2afc9446f180a1c d48578bb52636dcab6d6519e8d0449efa2b5a583db9a5a13d408b30595f650e1 +lib/codeql/rust/elements/IncludeBytesExpr.qll c2bf15235d5a380a0e5dce98cc81b3189f093a5a8f9a218751a475e8275ad4cb acc4ccfb8afc033f0bf48914f5f9066f74400d6b3545575f6a7c73d7f74feeaf lib/codeql/rust/elements/IndexExpr.qll 0e2e9f018d06ae72be0fc4ddbc019a9aacd8a06f42b4c4431760bd149e7f2290 2bcfd557abd53a48e48de7915c4f2089107c62dfb3e732a904848248dfd3727b lib/codeql/rust/elements/InferTypeRepr.qll 1b8bdcb574a7b6e7dd49f4cfb96655a6ccc355744b424b8c2593fe8218090d53 c20a2a5b0346dc277721deb450e732a47812c8e872ffb60aaba351b1708e9477 lib/codeql/rust/elements/Item.qll 59d2ac7b5b111579951bf42f68834ecf6dab47a5fb342ed0841c905b977923ab 0d220ec12a373098b26e6cb3a7b327b2d0c1882c3d9b6de00f4df1e8d00bae68 @@ -112,11 +112,11 @@ lib/codeql/rust/elements/Meta.qll e54802dadd2f1b914a821f9e9335f6088d4782751e36c0 lib/codeql/rust/elements/MethodCallExpr.qll 914633f304c587addced988a7f161a1a4b3297ce370f6a959b7a042b1c04dace 289a0854d6323df915ee5f268523ee597ba20a37c646bbb2a79c9ed1f7aa2260 lib/codeql/rust/elements/Missing.qll 70e6ac9790314752849c9888443c98223ccfc93a193998b7ce350b2c6ebe8ea4 e2f0623511acaa76b091f748d417714137a8b94f1f2bdbbd177f1c682c786dad lib/codeql/rust/elements/Module.qll 0bc85019177709256f8078d9de2a36f62f848d476225bff7bba1e35f249875c7 3fbb70e0c417a644dd0cada2c364c6e6876cfa16f37960e219c87e49c966c94e -lib/codeql/rust/elements/MutRestriction.qll fcffcf98570c972621e53e5f3ef5e9daf8b48699721fd2e3f7c13e11c5577033 98b064a3353a5ef70a218c01911c1c7c359ead97a3063e69d169069d5f1a8868 +lib/codeql/rust/elements/MutRestriction.qll b018f04a3960b91bbc8fcc2fbb7a25c359eba05504175ca0c61775f23d001751 85c9d2f6d4fd205861aea9de3fcd6c7e710b514d57873156cde347e41fdb6afb lib/codeql/rust/elements/Name.qll af41479d4260fe931d46154dda15484e4733c952b98f0e370106e6e9e8ce398b e188a0d0309dd1b684c0cb88df435b38e306eb94d6b66a2b748e75252f15e095 lib/codeql/rust/elements/NameRef.qll 587308f2276853303fd5e8804fad255e200fdbb115c4abf7635435856884e254 6cb64e921d2dde8fc87cb26b6539254b883a7313689798180791a2905eb3f418 lib/codeql/rust/elements/NeverTypeRepr.qll e523e284b9becb3d55e2f322f4497428bfa307c904745878545695a73d7e3a52 4af09ebae3348ba581b59f1b5fa4c45defc8fa785622719fa98ebefee2396367 -lib/codeql/rust/elements/NotNull.qll 7b4f7b10b9b686688479636c75ca52704b8ab63a8986a9d5488b00f22b30b490 d1da0b813309983ac4354e77abc7cb4ca61e609c3642c191a7b89bafc222294c +lib/codeql/rust/elements/NotNull.qll ea17a443fca46533be304d5e45e24c157314f0a512ffd2f25dfff8d024d33755 1e7707622d02b0ff4c023e8e942880041fe495b3f7de766858173e97034f1d33 lib/codeql/rust/elements/OffsetOfExpr.qll 370734a01c72364c9d6a904597190dac99dc1262631229732c8687fd1b3e2aa0 e222d2688aa18ed6eec04f2f6ac1537f5c7467d2cef878122e8fc158d4f6f99e lib/codeql/rust/elements/OrPat.qll 408b71f51edbfc79bf93b86fb058d01fa79caf2ebfeef37b50ae1da886c71b68 4a3f2b00db33fe26ee0859e35261016312cb491e23c46746cdd6d8bb1f6c88ef lib/codeql/rust/elements/Param.qll d0c0a427c003bbbacaeb0c2f4566f35b997ad0bca4d49f97b50c3a4bd1ddbd71 e654a17dfcb7aaeb589e7944c38f591c4cf922ebceb834071bcb9f9165ee48be @@ -135,7 +135,7 @@ lib/codeql/rust/elements/PathMeta.qll 56021df592b69c9c735db2ebe2b14ee5b5e0a76546 lib/codeql/rust/elements/PathPat.qll a7069d1dd77ba66814d6c84e135ed2975d7fcf379624079e6a76dc44b5de832e 2294d524b65ab0d038094b2a00f73feb8ab70c8f49fb4d91e9d390073205631d lib/codeql/rust/elements/PathSegment.qll c54e9d03fc76f3b21c0cfe719617d03d2a172a47c8f884a259566dd6c63d23f2 4995473961f723239b8ac52804aeb373ef2ac26df0f3719c4ca67858039f2132 lib/codeql/rust/elements/PathTypeRepr.qll 1b68e119ac82fdf5f421ded88a1739bfb8009c61e2745be11b34c3a025de18aa 48d9b49ee871f3932a0806709b4a21dadfdbe5cef8bab8d71aab69b6e4e7b432 -lib/codeql/rust/elements/PatternTypeRepr.qll 5d2e164e732fdfa574227cbd3c1d462d8393ccb84603bb3de82f8a5919cd039c 927ac473920d4ee5dcf2373fa0a342431d13060c1e53a28596b8da7f33254ed0 +lib/codeql/rust/elements/PatternTypeRepr.qll c97e739ceb7256d1477deb660f6d18a3f5602583911c94311eeee48efe58db2a bfcaca8cbd256ee7b3d715302a291e2c64ae7b260801042f9e7351d9acd497fb lib/codeql/rust/elements/PrefixExpr.qll 107e7bd111b637fd6d76026062d54c2780760b965f172ef119c50dd0714a377d 46954a9404e561c51682395729daac3bda5442113f29839d043e9605d63f7f6d lib/codeql/rust/elements/PtrTypeRepr.qll 91a3816030ee8e8aae19759589b1b212a09e931b2858a0fef5a3a23f1fb5e342 db7371e63d9cb8b394c5438f4e8c80c1149ca45335ce3a46e6d564ed0cf3938a lib/codeql/rust/elements/RangeExpr.qll 43785bea08a6a537010db1138e68ae92eed7e481744188dfb3bad119425ff740 5e81cfbdf4617372a73d662a248a0b380c1f40988a5daefb7f00057cae10d3d4 @@ -196,7 +196,7 @@ lib/codeql/rust/elements/UseTreeList.qll 92ebfee4392a485b38fb3265fdede7c8f2ed1db lib/codeql/rust/elements/Variant.qll affe9c58021358fd93d9c867277b4853c8303caa75521c657c8ba2e0cd45f0d6 44894859e3dde36b727abe8a28198f1ba7c487af839e6d9a2fe2d1bacb59f477 lib/codeql/rust/elements/VariantList.qll 39803fbb873d48202c2a511c00c8eafede06e519894e0fd050c2a85bf5f4aa73 1735f89b2b8f6d5960a276b87ea10e4bb8c848c24a5d5fad7f3add7a4d94b7da lib/codeql/rust/elements/Visibility.qll af9f001cd30e92bd004480fe348adf7ce745ac3de381b1f4723b46ad63be7622 07cb39b9b8c3866bfa1b46eac45e3a5ba1a5877cf51424891b72bc7d3f54dca4 -lib/codeql/rust/elements/VisibilityInner.qll 0ea5872f3d0551bdab996b3eedd8cac95865cb7afba951fda8db8b0f83c49e01 e5148575e5c40f634e5d1e2c0eab8ce51fa2a3fe7b4bfd6657e0033ef643662a +lib/codeql/rust/elements/VisibilityInner.qll 623e85ffe63d033c4465e2fdeacba2ae51ae7b9d2e9cb15cd4edfb878f8af415 d6ef0775ffd62e51c2739a3a20f3aed1001d8b66f6410625b1f44cdf4ef1f8c0 lib/codeql/rust/elements/WhereClause.qll 4e28e11ceec835a093e469854a4b615e698309cdcbc39ed83810e2e4e7c5953f 4736baf689b87dd6669cb0ef9e27eb2c0f2776ce7f29d7693670bbcea06eb4e4 lib/codeql/rust/elements/WherePred.qll 589027c2fddb07620f74b8ed5e471fab49bef389749e498069d7c1fe50912cc7 dd7c90ff9c5bd563f0b8a088e0890ee11c6d5b2269223f22be01f0e1dbe0f5e2 lib/codeql/rust/elements/WhileExpr.qll 4a37e3ecd37c306a9b93b610a0e45e18adc22fcd4ce955a519b679e9f89b97e8 82026faa73b94390544e61ed2f3aaeaabd3e457439bb76d2fb06b0d1edd63f49 @@ -273,7 +273,7 @@ lib/codeql/rust/elements/internal/ConstParamImpl.qll c6995be58f84d1df65897c80f7e lib/codeql/rust/elements/internal/ContinueExprConstructor.qll cd93f1b35ccdb031d7e8deba92f6a76187f6009c454f3ea07e89ba459de57ca6 6f658e7d580c4c9068b01d6dd6f72888b8800860668a6653f8c3b27dc9996935 lib/codeql/rust/elements/internal/CrateConstructor.qll 2a3710ed6ff4ffdbc773ac16e2cf176415be8908e1d59fd0702bdeddbae096f4 f75a069b0ef71e54089001eb3a34b8a9e4ce8e4f65ffa71b669b38cf86e0af40 lib/codeql/rust/elements/internal/DerefPatConstructor.qll a92a1e9b310a7dc92f31952b08c264cbd57265a5c619ff1abecf739ed4f6525f f86e26668b88baa571ca7521782141ce92f816ec366024c21c953bc335482c10 -lib/codeql/rust/elements/internal/DerefPatImpl.qll 5787acbf70fdf17902a62a2876ca02465d8b85ea481a143ae7461bfd5c208f08 487805a8b79949d87235a352ca3a427edaa0247cf01268f952767a17e1290c79 +lib/codeql/rust/elements/internal/DerefPatImpl.qll 625e36abce14f22d860538478db629bdcc3f0fb04984d37ea9a2e40b39725451 f505327aa67eb4cacf0bde672b37a42f3ddcc51510613a8c3a44fd55151d7570 lib/codeql/rust/elements/internal/DynTraitTypeReprConstructor.qll 6964e6c80fb7f5e283c1d15562cef18ed097452b7fcbc04eff780c7646675c7a f03c4830bf1b958fdfb6563136fa21c911b2e41ce1d1caee14ec572c7232866d lib/codeql/rust/elements/internal/EnumConstructor.qll eca1a13937faacb1db50e4cf69d175f992f2204a5aaed9144bb6f3cb63814ac5 1bafba78b2729fdb052a25a1ba3f4f70871564aa4df632b4a1d467858a437924 lib/codeql/rust/elements/internal/ExprImpl.qll ab20ee174e2e786f34af6e5dedf3ec071bb89fc266b3e91df6377f72aa38d3f2 f68192700f449bf1c229cfbaabd5353c7c559941c915d5a0c88752cf9844194b @@ -308,10 +308,10 @@ lib/codeql/rust/elements/internal/IdentPatConstructor.qll 09792f5a070996b65f095d lib/codeql/rust/elements/internal/IfExprConstructor.qll 03088b54c8fa623f93a5b5a7eb896f680e8b0e9025488157a02c48aaebc6ad56 906f916c3690d0721a31dd31b302dcdcec4233bb507683007d82cf10793a648f lib/codeql/rust/elements/internal/ImplConstructor.qll 24edccca59f70d812d1458b412a45310ddc096d095332f6e3258903c54c1bb44 7eb673b3ab33a0873ee5ce189105425066b376821cce0fc9eb8ace22995f0bc7 lib/codeql/rust/elements/internal/ImplRestrictionConstructor.qll 7d58e3efd82a6869fec0c95733d710223563ba063a11096bc78bdaa2b52228ee 83c219aabb5d037dcece2e723b8424f0a853d5a7c15562c1b5b964e8ea43fd2d -lib/codeql/rust/elements/internal/ImplRestrictionImpl.qll cce75057493e37bb70ccbafef2af199893cc017553561f02842c4d0d4ff8eba3 984055016d15f25371261120d1d4b4db38d93f491f61fa25becf8099ce6bbaf9 +lib/codeql/rust/elements/internal/ImplRestrictionImpl.qll 5023ad9d8103df7c23b3d301ab6a957b2ed17a7b6f78b724e1cfb913423439dc 35ccaf051a5cbc3bf76578a6a30ff11b6f2520bb55232751ec951d9d65119aa5 lib/codeql/rust/elements/internal/ImplTraitTypeReprConstructor.qll 1ed355e5e56f432b24b6f4778e4dc45c6e65095190cacb7a5015529e0c9d01f8 c8505185a042da4eb20a0cc32323194a0290c4bf821c7e0fce7351b194b10f31 lib/codeql/rust/elements/internal/IncludeBytesExprConstructor.qll 62d20cf32e8c0fa62ef5b472e3b5538b95cc6bf275955f195a4924c2f38c9ba8 5fd4b50e9760af5a5c76d616658adde406470c4c9eac9b846dc0b7583e6460c1 -lib/codeql/rust/elements/internal/IncludeBytesExprImpl.qll 7961e1468673e4ca70463723625e1ff3c881dcfeb7fb9a184cdbc4bb49eea00d 9825ebf1fb02f2449359d4bb540672c124ea997263bee06a55cb66fc80ca2010 +lib/codeql/rust/elements/internal/IncludeBytesExprImpl.qll cf1da0abb200dceedf5000fe6565456fd1526310565df1f210ec12c37b3b1f4f 82195e928034735f3e41b4d4cf48d411cf6719089f0529a843e79a1dabb94b21 lib/codeql/rust/elements/internal/IndexExprConstructor.qll 99bdc3d793c4dbd993860da60abe2b7c604345d645e86916462bc55a6939a5d1 3fe9d7da725956903707806aadbecac8d5b3874e8bed63c9bab54fff630e75dd lib/codeql/rust/elements/internal/InferTypeReprConstructor.qll bc5f16853401617fc9c5af8a1287a23c5921df1b615cfbe2d7c7a70145ecfcbd da93bd28ea2daade2cbb0a729be3fbf05f72bc02009565c7bb062e4f68fdb9e7 lib/codeql/rust/elements/internal/ItemListConstructor.qll 08af3bd12536941c3dd4a43c81cc861be24325e242e2593c087a3ce632674291 2fa166159c409d2aaffa73a30babb40829a6de580bd40894d909ee6152801082 @@ -355,7 +355,7 @@ lib/codeql/rust/elements/internal/MissingConstructor.qll aab0b7f2846f14a5914661a lib/codeql/rust/elements/internal/MissingImpl.qll e81caa383797dfe837cf101fb78d23ab150b32fef7b47ffcc5489bfcd942ac3e 9f3212d45d77e5888e435e7babd55c1e6b42c3c16f5b1f71170ac41f93ee8d0b lib/codeql/rust/elements/internal/ModuleConstructor.qll 31cc83c9d8f25ac07375d19e568f05c068e1f5aa205ff3d9ac31c2510e6f8468 8a70f3f1c18ff87f17e6baf2f05ccaed55c70469288192fc39ef0bb5531b8c0e lib/codeql/rust/elements/internal/MutRestrictionConstructor.qll 002e0b35790932db84a5643d9ffc531b10dc327b1b44b966e773bf9b4e46a325 5d81599d543825b8ace752dc03bafc9bae7f13bc8bcbb3db5e2e0243fc9c6772 -lib/codeql/rust/elements/internal/MutRestrictionImpl.qll 5ce47f31fc2aa782b1d7faf560e9c4510f3f4f968d51f7166cab28b42774ca66 49d7d1bb05d982d28e391f52af3f7d503bf4f9612dbe180002297cac3ae38fe3 +lib/codeql/rust/elements/internal/MutRestrictionImpl.qll 80e2f1b224a71df6a8c6544c1feb19a92b300cf3447c9905814a6539f89f1dde 16099f2adf7b4b9401f3320fc16d27c170b0d00221d9a062d373216150a2559b lib/codeql/rust/elements/internal/NameConstructor.qll a760134c6d4fc785746e1a5dc042a6bf25b8adaa3947a6897c31e50fd91dd5fd 1359f903d57112bcc1f62a609febb288301bfa810e569aa12e1045fd48b5b5c9 lib/codeql/rust/elements/internal/NameRefConstructor.qll 5ff6eacc614fd41f98b54cbb4960a07a1471cf4ea291758d33e54a48fd5d1bc4 c538d65414a24dfdbeb49cfd997588227559ba038f0b55d14bb5d89ed1a016f2 lib/codeql/rust/elements/internal/NamedCrate.qll 6c697076387b5af00422e227540d100ff7c03d3001f6a4c5b61433191d022490 2276f85411db199598fc6a5d8d6ec5762e42b1b45c98e398eeb75e69c697b57f @@ -363,7 +363,7 @@ lib/codeql/rust/elements/internal/NamedCrateConstructor.qll 72e07ece16f787dfd993 lib/codeql/rust/elements/internal/NamedCrateImpl.qll ba1f775ca6177a5bdb2ef1891a3fd505642e2fec63910f958f380039499f45bf f66b503b3574d3be75b79870b754015740f58195c4924b71c21ba4e673efd8c4 lib/codeql/rust/elements/internal/NeverTypeReprConstructor.qll 2e0a9c75e389e9ef41a18dd9b5d6c29ffe1d1d633e51ef1de90ec553236d201a 61ea87802fd1c3a68e864ccd76657253a228b06471e4c55bcf94ca2be554f866 lib/codeql/rust/elements/internal/NotNullConstructor.qll 40e9254021ce7f09861c8d4ac70c3595953e8ade756a3da039d99a638fe8f0f3 3264d3ba76e04cdee673ae38dd3fcd7660978dc17d86c9b8f062bd0fbf3e5d3e -lib/codeql/rust/elements/internal/NotNullImpl.qll 1a7a66a54a0dd23960fbfc8f464cfa62b0b22dea839ad2d8a7cb20a0969e4684 3edce65d0e844d3bebc8e415865e128aac20f0b5fdf039c4eccd643fcabb9ea0 +lib/codeql/rust/elements/internal/NotNullImpl.qll c60f45e552e4bbe5f51f138f7e008b7a50b7a85b92e6562eb0a68a6fb1f82f04 907e3ef130c032ba4cc39efbd49a9ea92a5b1c5c15c55db229b8b9583bdd4a28 lib/codeql/rust/elements/internal/OffsetOfExprConstructor.qll 616e146562adb3ac0fba4d6f55dd6ce60518ed377c0856f1f09ba49593e7bfab 80518ce90fc6d08011d6f5fc2a543958067739e1b0a6a5f2ed90fc9b1db078f0 lib/codeql/rust/elements/internal/OffsetOfExprImpl.qll e52d4596068cc54719438121f7d5afcaab04e0c70168ac5e4df1a3a0969817a6 6ab37e659d79e02fb2685d6802ae124157bf14b6f790b31688f437c87f40f52c lib/codeql/rust/elements/internal/OrPatConstructor.qll 4ef583e07298487c0c4c6d7c76ffcc04b1e5fe58aba0c1da3e2c8446a9e0c92b 980a6bd176ae5e5b11c134569910c5468ba91f480982d846e222d031a6a05f1a @@ -384,7 +384,7 @@ lib/codeql/rust/elements/internal/PathPatConstructor.qll 966c4ea22218ef71e000d7c lib/codeql/rust/elements/internal/PathSegmentConstructor.qll 2d9639e42035dc7e73b7d6ddb8a977beadc6b4492dee4292b2f85b4409344441 c337fc3b9ef56366428772563e3f25f711474d16e860d3e89c1395a95d9e83e7 lib/codeql/rust/elements/internal/PathTypeReprConstructor.qll e05e7be13d48e7f832e735254777692d4be827a745b1fd94b9649d46fe574393 4aa1e6935a4479b61f205265cbbba01ce96d09a680c20d5decf30d1374d484d4 lib/codeql/rust/elements/internal/PatternTypeReprConstructor.qll cf17aaca86534afe86518f1dc2fdbf548fc0e9bf241d1e698a94940ce875d1f2 5799da5538796765846bcf09391ec2388cc96fdc6fea60819301ab6387d5d146 -lib/codeql/rust/elements/internal/PatternTypeReprImpl.qll b8a9814bddff9d960cbcd12af518f493246c8df33ad084e94c2d348a9f711521 6f425f32e0bc69a84f97ea55ed4c68170c01c96cabe0d5a9da1434c2418a8927 +lib/codeql/rust/elements/internal/PatternTypeReprImpl.qll f42a964f149dfd5ebea31f310e220ed89635efe4c0940e0a17f23aa893c84167 c6ce7a83418360cd98f410e6406d26b65721dad0ea0c9fd33307439cf392af1a lib/codeql/rust/elements/internal/PrefixExprConstructor.qll 90c50b0df2d4b4cbf5e2b7d67a9d243a1af9bfff660b7a70d8b9c7859c28bca7 1a1b5ea1f06ed8d41a658c872e8e1915c241a7c799c691df81b9a7b55d8f2f1e lib/codeql/rust/elements/internal/PtrTypeReprConstructor.qll c8bd3502dc23429577fbff0fe3e3c78b812b2237b2bb65862c137083fdaa7a4a 4d5c135be30f71a3712acbc22bdb6c425fa6463043a9ee64543da31151d68366 lib/codeql/rust/elements/internal/PtrTypeReprImpl.qll cb3cf7960a05f2c1930067fc62c5a207fc5faac143758b9b9e5f117fbd073f2f 40545d4768380f0dde9b708932f92f57566ac49f3f9b4147a8ff2ea90a0947c7 @@ -472,7 +472,7 @@ lib/codeql/rust/elements/internal/VariantListConstructor.qll c841fb345eb46ea3978 lib/codeql/rust/elements/internal/VariantListImpl.qll 4ceeda617696eb547c707589ba26103cf4c5c3d889955531be24cbf224e79dff 4258196c126fd2fad0e18068cb3d570a67034a8b26e2f13f8223d7f1a246d1a4 lib/codeql/rust/elements/internal/VisibilityConstructor.qll 1fd30663d87945f08d15cfaca54f586a658f26b7a98ea45ac73a35d36d4f65d0 6ddaf11742cc8fbbe03af2aa578394041ae077911e62d2fa6c885ae0543ba53a lib/codeql/rust/elements/internal/VisibilityInnerConstructor.qll 6d845ba35a3bc8521fb49d1691d6aa10f1f7f4b7f27f12f4d3e316d8d3d6050c eecc48b25464df7e723ce1e9706b2b9ffbb8ccac26edb78b0901ce9912675edc -lib/codeql/rust/elements/internal/VisibilityInnerImpl.qll 07cb2b0601f495d0daff02e30796fb2076e1a2659d434115bc47c9d916f6953e ab7a9fca5788ec83c5bd5cc3873688a9fab2da3114e0c72e8f3f53bb2a51f83a +lib/codeql/rust/elements/internal/VisibilityInnerImpl.qll 9a536441b258a5dae6518b7efa36a881244194f7e0f842a1c730dfeaa979d462 de14821d1d9ffeac766b01ee3ec248c73a531b4d3a7357e5b609e4de40ffea93 lib/codeql/rust/elements/internal/WhereClauseConstructor.qll 6d6f0f0376cf45fac37ea0c7c4345d08718d2a3d6d913e591de1de9e640317c9 ff690f3d4391e5f1fae6e9014365810105e8befe9d6b52a82625994319af9ffd lib/codeql/rust/elements/internal/WhereClauseImpl.qll 006e330df395183d15896e5f81128e24b8274d849fe45afb5040444e4b764226 ed5e8317b5f33104e5c322588dc400755c8852bbb77ef835177b13af7480fd43 lib/codeql/rust/elements/internal/WherePredConstructor.qll f331c37085792a01159e8c218e9ef827e80e99b7c3d5978b6489808f05bd11f8 179cad3e4c5aaaf27755891694ef3569322fcf34c5290e6af49e5b5e3f8aa732 @@ -532,7 +532,7 @@ lib/codeql/rust/elements/internal/generated/ConstBlockPat.qll 7526d83ee9565d7477 lib/codeql/rust/elements/internal/generated/ConstParam.qll 2e24198f636e4932c79f28c324f395ae5f61f713795ed4543e920913898e2815 5abe6d3df395c679c28a7720479bad455c53bc5ade9133f1ff113ea54dc66c11 lib/codeql/rust/elements/internal/generated/ContinueExpr.qll e2010feb14fb6edeb83a991d9357e50edb770172ddfde2e8670b0d3e68169f28 48d09d661e1443002f6d22b8710e22c9c36d9daa9cde09c6366a61e960d717cb lib/codeql/rust/elements/internal/generated/Crate.qll 37f3760d7c0c1c3ca809d07daf7215a8eae6053eda05e88ed7db6e07f4db0781 649a3d7cd7ee99f95f8a4d3d3c41ea2fa848ce7d8415ccbac62977dfc9a49d35 -lib/codeql/rust/elements/internal/generated/DerefPat.qll b89471bfecec9c34f3a54f8f46ffec185481101d20d9f9eae96470537be40014 3a32b1d25d9715ba4fc22215552975176541cc7c10a23ec023491cec0053f7d6 +lib/codeql/rust/elements/internal/generated/DerefPat.qll ede71df1a31b5705fa7acccee0a744d9755a15e31f5362a43de4116e74fa271a 59f67b5d51b1401d34020a3d97f4fd4e1f9d996aa8f862c01e519fe84df86c0d lib/codeql/rust/elements/internal/generated/DynTraitTypeRepr.qll b2e0e728b6708923b862d9d8d6104d13f572da17e393ec1485b8465e4bfdc206 4a87ea9669c55c4905ce4e781b680f674989591b0cb56af1e9fa1058c13300b3 lib/codeql/rust/elements/internal/generated/Element.qll d56d22c060fa929464f837b1e16475a4a2a2e42d68235a014f7369bcb48431db 0e48426ca72179f675ac29aa49bbaadb8b1d27b08ad5cbc72ec5a005c291848e lib/codeql/rust/elements/internal/generated/Enum.qll 3ed69005ab7cf68745a67cc9891bd68a83f6ab927febf077de9e4092cb373b0b 604fd03d1c46884b3c93e5bff3951ec41593320e1f7382c1a7143a64063827bc @@ -562,9 +562,9 @@ lib/codeql/rust/elements/internal/generated/GenericParamList.qll b18fa5fd435d948 lib/codeql/rust/elements/internal/generated/IdentPat.qll 1fe5061759848fdc9588b27606efb1187ce9c13d12ad0a2a19666d250dd62db3 87dbc8b88c31079076a896b48e0c483a600d7d11c1c4bf266581bdfc9c93ae98 lib/codeql/rust/elements/internal/generated/IfExpr.qll 413dd7a20c6b98c0d2ad2e5b50981c14bf96c1a719ace3e341d78926219a5af7 c9a2d44e3baa6a265a29a683ca3c1683352457987c92f599c5771b4f3b4bafff lib/codeql/rust/elements/internal/generated/Impl.qll bdc3da08b23ab098e92927a57c2e99eeb78ea8561cf11accc51db3033492b500 4b45be6b0c51f03999619705104574d78c262ed2497921f2ca8696844b17addc -lib/codeql/rust/elements/internal/generated/ImplRestriction.qll 3d0e014870ba95901bcfe5f0c2c8924b3cd10d14d5d779e98979a701ea6b9f75 bf627444b90d26b5e08c7414e87971dee38cbef1c4058101972e9eb24d4a742f +lib/codeql/rust/elements/internal/generated/ImplRestriction.qll 934b9c66f3fb3bbebc5b0a5f748fd33d46b08dc2ff77411ca46c2b5a6183db2d ec2c695d23cfe4ac78d372996b7269b152bd72a7747a723c203dad8304d583ba lib/codeql/rust/elements/internal/generated/ImplTraitTypeRepr.qll e376a2e34ba51df403d42b02afe25140543e3e53aaf04b9ea118eb575acb4644 dc3a7e3eac758423c90a9803cc40dfdf53818bd62ee894982cd636f6b1596dfc -lib/codeql/rust/elements/internal/generated/IncludeBytesExpr.qll 7665795afaa2511874927a1a5a64a78f1d25f05e2948e61b518af52becebc479 3b419e4042d2c9110a51c2559186401d6b661d009a35323499b4ae1a50e60b77 +lib/codeql/rust/elements/internal/generated/IncludeBytesExpr.qll 39383a3b29f01c5e721f8db75fa78842c32ed823a3523709d8facaaaf6f490ee 2ccb4c8d1f00b0bdb881e18d4712effc34ac806d7eb6432fcf86191e19a294e3 lib/codeql/rust/elements/internal/generated/IndexExpr.qll cf951fc40f6690e966b4dc78fa9a6221aa5c6cade44759dcb52254f799292d11 1572e71918cc4e0b7e028331b6d98c9db23100a3646cd3874d1915e06ab6211d lib/codeql/rust/elements/internal/generated/InferTypeRepr.qll 4f101c1cb1278e919f9195cac4aa0c768e304c1881394b500874e7627e62d6c4 dca3f85d0a78ecc8bf030b4324f0d219ffff60784a2ecf565a4257e888dea0ff lib/codeql/rust/elements/internal/generated/Item.qll 03077c9d2f3200ebbc5df5d31f7d9b78a3ae25957ac46899a19a93684b2d7306 6492e341b9d9270c0181da0a5330f588238ced81657041ad1ad343db2bdf210b @@ -598,12 +598,12 @@ lib/codeql/rust/elements/internal/generated/Meta.qll 5c3358c737d504dacfa3227b80c lib/codeql/rust/elements/internal/generated/MethodCallExpr.qll ffce98a6a1921822b12ead721cff0878553eb3e049c5d2184a7abce32b6615b4 d1408a0f47ee5764fe7b484494daf6e1f99b1c6a505274c48545b3e650ef8baf lib/codeql/rust/elements/internal/generated/Missing.qll 16735d91df04a4e1ae52fae25db5f59a044e540755734bbab46b5fbb0fe6b0bd 28ca4e49fb7e6b4734be2f2f69e7c224c570344cc160ef80c5a5cd413e750dad lib/codeql/rust/elements/internal/generated/Module.qll ebae5d8963c9fd569c0fbad1d7770abd3fd2479437f236cbce0505ba9f9af52c fa3c382115fed18a26f1a755d8749a201b9489f82c09448a88fb8e9e1435fe5f -lib/codeql/rust/elements/internal/generated/MutRestriction.qll 986cd8e933d5423b05ad7c2d5bd60363d57acc1fb7620444d5af102557bdea68 06423e70c0aaa492f1503a4a455bec60ec52a8e76c08b799ce2caa2737a68d1b +lib/codeql/rust/elements/internal/generated/MutRestriction.qll ab507ff1a1cdd04f3b5deab8b52b41aa520d7a20bf94ec3fe53644eb8524e7d4 0396ab58b867a53c1870fb12d1c203a741927defc0d08ae10ef7a93f48e8cedf lib/codeql/rust/elements/internal/generated/Name.qll e6bd6240a051383a52b21ab539bc204ce7bcd51a1a4379e497dff008d4eef5b4 578a3b45e70f519d57b3e3a3450f6272716c849940daee49889717c7aaa85fc9 lib/codeql/rust/elements/internal/generated/NameRef.qll 090c15ed6c44fc4f1a7236215f42e16921912d3030119ac22bc7ffe2dcdb4ba8 b61cc486e6764272c4e8377523bf043d0beae4926606dbcb48f8205c6a0b9a90 lib/codeql/rust/elements/internal/generated/NamedCrate.qll e190dd742751ea2de914d0750c93fcad3100d3ebb4e3f47f6adc0a7fa3e7932c 755ead62328df8a4496dc4ad6fea7243ab6144138ed62d7368fa53737eef5819 lib/codeql/rust/elements/internal/generated/NeverTypeRepr.qll 4f13c6e850814a4759fdb5fca83a50e4094c27edee4d2e74fe209b10d8fb01c3 231f39610e56f68f48c70ca8a17a6f447458e83218e529fff147ed039516a2f7 -lib/codeql/rust/elements/internal/generated/NotNull.qll a06054ff046c8d43a5e84fe5db8679ccf0c478971c484ea3fc554465e35474f8 a0aaf8817217fbdb0c748fcacb0bdd40b78822b522570d61c52ed296d61b6610 +lib/codeql/rust/elements/internal/generated/NotNull.qll b9361e42f9fe5893111cf9963fcd9428de27a94f261bdd2722fdd81b0d1118ea 4281887babd70011584c761eeb38d325813b01d766d96e7965861e9a0df18ba6 lib/codeql/rust/elements/internal/generated/OffsetOfExpr.qll c86eecd11345a807571542e220ced8ccc8bb78f81de61fff6fc6b23ff379cd12 76a692d3ad5e26751e574c7d9b13cf698d471e1783f53a312e808c0b21a110ab lib/codeql/rust/elements/internal/generated/OrPat.qll 0dc6bd6ada8d11b7f708f71c8208fc2c28629e9c265c3df3c2dc9bea30de5afa 892119fc1de2e3315489203c56ee3ed3df8b9806e927ee58aa6083e5b2156dab lib/codeql/rust/elements/internal/generated/Param.qll 19f03396897c1b7b494df2d0e9677c1a2fc6d4ae190e64e5be51145aba9de2e2 3d63116e70457226ea7488a9f6ed9c7cea3233b0e5cab443db9566c17b125e80 @@ -623,13 +623,13 @@ lib/codeql/rust/elements/internal/generated/PathMeta.qll 42cf084a78acb656a86a6a9 lib/codeql/rust/elements/internal/generated/PathPat.qll 003d10a4d18681da67c7b20fcb16b15047cf9cc4b1723e7674ef74e40589cc5a 955e66f6d317ca5562ad1b5b13e1cd230c29e2538b8e86f072795b0fdd8a1c66 lib/codeql/rust/elements/internal/generated/PathSegment.qll 48b452229b644ea323460cd44e258d3ea8482b3e8b4cb14c3b1df581da004fa8 2025badcfab385756009a499e08eecc8ffd7fa590cd2b777adb283eebcc432c6 lib/codeql/rust/elements/internal/generated/PathTypeRepr.qll f12fe234d7fb1a12678b524434fcdd801453d90eb778b9173f7197ff3d957557 a1be605f8937c5bd3a3a9cb277782c24446c9f5ef8363e6f5ee8f6229886b6f6 -lib/codeql/rust/elements/internal/generated/PatternTypeRepr.qll c824c634d3f4ee45a810724c727b96e98568079a3e0287ec14d8eebbcecd94ae 4908f373db12ee49ccb604dbc3ad485b6028174010b3e090ba86dd144d09a0b2 +lib/codeql/rust/elements/internal/generated/PatternTypeRepr.qll 82c272b58b4ce09827fcca35dd62d520b724d95b458c7aef139b0535c90a25b2 2b3636e0683236c8ba112e58d04e87095c693c277125ac747fb7a8b6b53c5435 lib/codeql/rust/elements/internal/generated/PrefixExpr.qll c9ede5f2deb7b41bc8240969e8554f645057018fe96e7e9ad9c2924c8b14722b 5ae2e3c3dc8fa73e7026ef6534185afa6b0b5051804435d8b741dd3640c864e1 lib/codeql/rust/elements/internal/generated/PtrTypeRepr.qll 8d0ea4f6c7f8203340bf4b91ecedad3ed217a65d8be48d498f2e12da7687a6d0 6f74182fd3fe8099af31b55edeaacc0c54637d0a29736f15d2cd58d11d3de260 lib/codeql/rust/elements/internal/generated/PureSynthConstructors.qll e5b8e69519012bbaae29dcb82d53f7f7ecce368c0358ec27ef6180b228a0057f e5b8e69519012bbaae29dcb82d53f7f7ecce368c0358ec27ef6180b228a0057f lib/codeql/rust/elements/internal/generated/RangeExpr.qll 23cca03bf43535f33b22a38894f70d669787be4e4f5b8fe5c8f7b964d30e9027 18624cef6c6b679eeace2a98737e472432e0ead354cca02192b4d45330f047c9 lib/codeql/rust/elements/internal/generated/RangePat.qll 80826a6a6868a803aa2372e31c52a03e1811a3f1f2abdb469f91ca0bfdd9ecb6 34ee1e208c1690cba505dff2c588837c0cd91e185e2a87d1fe673191962276a9 -lib/codeql/rust/elements/internal/generated/Raw.qll 4eec730c527a0217ccaae7b909c29dea87621e6c2d84455c906160be4567b00b a61aa6ffcdc8cfa01391c132e9d06e646b384137cdca40da06e22af24b4422ab +lib/codeql/rust/elements/internal/generated/Raw.qll 51e33791c782b2356edc70f29d0f8255f8472790b0b7a98aefcba14d65e7abe3 dfa4ac50c11c936f2abcdad8d753c926414ae8aeec78cfbba6a2c7f99c2397eb lib/codeql/rust/elements/internal/generated/RefExpr.qll 7d995884e3dc1c25fc719f5d7253179344d63650e217e9ff6530285fe7a57f64 f2c3c12551deea4964b66553fb9b6423ee16fec53bd63db4796191aa60dc6c66 lib/codeql/rust/elements/internal/generated/RefPat.qll 456ede39837463ee22a630ec7ab6c8630d3664a8ea206fcc6e4f199e92fa564c 5622062765f32930465ba6b170e986706f159f6070f48adee3c20e24e8df4e05 lib/codeql/rust/elements/internal/generated/RefTypeRepr.qll 5b0663a6d234572fb3e467e276d019415caa95ef006438cc59b7af4e1783161e 0e27c8a8f0e323c0e4d6db01fca821bf07c0864d293cdf96fa891b10820c1e4b @@ -688,7 +688,7 @@ lib/codeql/rust/elements/internal/generated/UseTreeList.qll 38efaa569b76ca79be04 lib/codeql/rust/elements/internal/generated/Variant.qll 7a1aedf6518780d1534147d5a52d14542698befe1d8eb8b78eb10d2664c3a69b 180d6de0826b1a75bf8b1853d539f605bff2eb3794ccb57ff23e5b3ee3171956 lib/codeql/rust/elements/internal/generated/VariantList.qll 3f70bfde982e5c5e8ee45da6ebe149286214f8d40377d5bc5e25df6ae8f3e2d1 22e5f428bf64fd3fd21c537bfa69a46089aad7c363d72c6566474fbe1d75859e lib/codeql/rust/elements/internal/generated/Visibility.qll c6c3099cb563c010e18012772c57bea636967e30f0f90b026f744441fb4c9263 f0db2927498fd5900eedacaaec5f3f538829c1f46306b593ff95699fa6535f68 -lib/codeql/rust/elements/internal/generated/VisibilityInner.qll 1328f5cf2c07798f645b2aa74c3348de321ae9a9c7062f03314e5192e307d8e2 e4132b9ca116513b7f6491c6d8fce516651fc3e268d49efb1d8ce3f0a8a770d9 +lib/codeql/rust/elements/internal/generated/VisibilityInner.qll 3e853aed43f32e216c67716da5ff4d910e4e48e4f017067a61041ce91a7eee9d 6a3b669762e091c7e12c19a081847475814ce4e7c52fb41ed1786cec36344356 lib/codeql/rust/elements/internal/generated/WhereClause.qll aec72d358689d99741c769b6e8e72b92c1458138c097ec2380e917aa68119ff0 81bb9d303bc0c8d2513dc7a2b8802ec15345b364e6c1e8b300f7860aac219c36 lib/codeql/rust/elements/internal/generated/WherePred.qll 73b28efc1682bf527bdc97a07568d08666d61686940400c99095cb9593bc8df3 2ec1fb5577d033c120d31f1620753b3618fcb7f384a35a6d3e6b5e0bb375a8a5 lib/codeql/rust/elements/internal/generated/WhileExpr.qll 0353aab87c49569e1fbf5828b8f44457230edfa6b408fb5ec70e3d9b70f2e277 e1ba7c9c41ff150b9aaa43642c0714def4407850f2149232260c1a2672dd574a @@ -735,7 +735,7 @@ test/extractor-tests/generated/ConstBlockPat/ConstBlockPat.ql e2198f9ef913f7ecb9 test/extractor-tests/generated/ConstParam/ConstParam.ql 6facb2402e1cbf23d836f619ef68e2d8496b3c0c438e71266de24d8690852468 211ed6f7384f86d849f559410b2ac09da3df278bdeea9e77c4d9c26a727a6990 test/extractor-tests/generated/ContinueExpr/ContinueExpr.ql 58b5046a4da06a4cd2d942720603313126888b2249b218bef6f7c44ca469ccfa eeb84a04deb4c4496b7f9b38798cc7fdc179a486c8beaa0b33bf87e7f9482b1a test/extractor-tests/generated/Crate/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 -test/extractor-tests/generated/DerefPat/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 +test/extractor-tests/generated/DerefPat/DerefPat.ql 6e2d15d74675242430b923155a79162d97b526c2642dc81485d1c34d883881a9 c102390dc801bda5816506e00a295ec10a5866233c4a980735e42cc3cefd6d07 test/extractor-tests/generated/DynTraitTypeRepr/DynTraitTypeRepr.ql ff54195d2e09424faaac4e145a40208bf0e57acc57dfa8247b3751862a317c4b 583d5b98aa31a9af6ad73df000ca529f57f67aa6daaa50ca5673a56eb57bf507 test/extractor-tests/generated/Enum/Enum.ql 9a612c818952e867e2665d8c919905d563bb76191f3f522370c7344863589205 c32cf1973082f5d519e3eb04fca0309b3dd9637cf34e58c10a8e34cd9fe36d2d test/extractor-tests/generated/ExprStmt/ExprStmt.ql 7c62a97f7f910ae6e0e9aff7fdd78b369d21257ccab52afe6307ddea2e15dad1 2d32a366c4acbea3136ff1f9f9dadf76b148f82ad1d7170f02efd977d8a07ae9 @@ -760,7 +760,7 @@ test/extractor-tests/generated/IfExpr/IfExpr.ql 540b21838ad3e1ed879b66c1903eb851 test/extractor-tests/generated/Impl/Impl.ql c96ec30d703aa607b7aad9f6eaca1b0069799cdefcc1481f4aa4f7378f477f7f 3528e1502b6f7b323d964630ecfb8255f683486b75300457e2a2d95aa36771f3 test/extractor-tests/generated/ImplRestriction/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 test/extractor-tests/generated/ImplTraitTypeRepr/ImplTraitTypeRepr.ql 311c6c1e18bd74fbcd367f940d2cf91777eaba6b3d6307149beb529216d086fb 16c7c81618d7f49da30b4f026dcacfb23ed130dbfcfa19b5cb44dc6e15101401 -test/extractor-tests/generated/IncludeBytesExpr/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 +test/extractor-tests/generated/IncludeBytesExpr/IncludeBytesExpr.ql 88ce15de29b08d5a09791b7bace113d0a742a9dc80f8e677289fa93f68f90ab5 e2315f877371632c7c606ffec092dbb4dba2a5c8ed5b898ba049d1d5d34e3665 test/extractor-tests/generated/IndexExpr/IndexExpr.ql ecfca80175a78b633bf41684a0f8f5eebe0b8a23f8de9ff27142936687711263 27d4832911f7272376a199550d57d8488e75e0eeeeb7abbfb3b135350a30d277 test/extractor-tests/generated/InferTypeRepr/InferTypeRepr.ql 6ba01a9e229e7dfdb2878a0bdbeb6c0888c4a068984b820e7a48d4b84995daa2 7120cafd267e956dbb4af5e19d57237275d334ffe5ff0fb635d65d309381aa46 test/extractor-tests/generated/ItemList/ItemList.ql e29302a9212b07fdaf93618852be30adfac64b292e9a0ddbf63addb803daaa98 7e69a78b0f58ef9344892113799092149024c1352b0965a6326d8a45cd44771a @@ -792,7 +792,7 @@ test/extractor-tests/generated/MutRestriction/MISSING_SOURCE.txt b6cf5771fdbbe98 test/extractor-tests/generated/Name/Name.ql b2fe417f7c816f71d12622b4f84ece74eba3c128c806266a55b53f8120fa4fb3 8bc65bbf3f2909637485f5db7830d6fc110a94c9b12eefe12d7627f41eae2256 test/extractor-tests/generated/NameRef/NameRef.ql 210a70e0957f3444195eed3a3dfbb5806e349238c0b390dc00597e6b8b05fcec d74fbce3c71aa7b08ae4cb646ccb114335767cb4fe000322f9dd371c1bb3784f test/extractor-tests/generated/NeverTypeRepr/NeverTypeRepr.ql 4e73ec96fccb00fe241546ff12c47329a9c67b7ae40a58a5afa39ecb611b84d4 bb716f72db039e0a82de959e390259a82cf99ba4482070602b7b6b42511976e5 -test/extractor-tests/generated/NotNull/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 +test/extractor-tests/generated/NotNull/NotNull.ql d79c3007161f3296a4e0516e3edf8e33152a6e359bc241b0f532b0058442e59b 3c991600d3fe64df36e0c00d38e4e31a1d796eec6ad47e2d34a8619b7e9c7afc test/extractor-tests/generated/OffsetOfExpr/OffsetOfExpr.ql 851d84073f4a14cef24ce945a099bc43b22381fc21672ba9ba424623d66d9e0e b3ca3309da0054501dc49f83b9e1b51c155966a14504521565ea980cf1600f55 test/extractor-tests/generated/OrPat/OrPat.ql 8742e1708da0bcc172c8cc637082672c92a136aa50bb2f0ef928387337aefa3e 1901c223502e8cc046c233a10d923226373bad0837264e2b837fd549929020e3 test/extractor-tests/generated/Param/Param.ql de90709cbd61e1852c857ffb6cedd17818464c93bb7bdc92c900ee04f4d2a27c a105ee30716345987989d48c4fa6194c34741fc48528515aeca673662b5259cb @@ -807,7 +807,7 @@ test/extractor-tests/generated/Path/PathPat.ql 8a6a759f4bbf4fa9c23fd235ce4d63f04 test/extractor-tests/generated/Path/PathSegment.ql 87774cc2e9d1be7aaf8748d418b151d7ec03fb20fda9430ebabd86ddaebf5538 699545d8eb2d6325bcd2c253d56339bd71170b34e80efe5155189fbbdde9fbbc test/extractor-tests/generated/Path/PathTypeRepr.ql 32023340cb9aa1fbf52a1a3e330c6f3206e1c64c9dce2f795d9e434aa5a1533b f451de0d4941ab79014d2883b46291f9f05f79d479fcdcab387020ab3ed68703 test/extractor-tests/generated/PathMeta/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 -test/extractor-tests/generated/PatternTypeRepr/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 +test/extractor-tests/generated/PatternTypeRepr/PatternTypeRepr.ql ada52e0ac5a61244cec32e185a968eaf2aa7c3237126d9cd57646cab0d63d950 c8169395b50236ba21fb7703206a57a98c3919a68f75c792cf387b14351c2018 test/extractor-tests/generated/PrefixExpr/PrefixExpr.ql 63e9dbae0d0b46d5e9d60c313e408c4c7ee1a93c5a26fe4c01a632911de961d0 09fcc28bb22553356aebf9ea93811703e5404b88022be8dab61ac81d3b187b75 test/extractor-tests/generated/PtrTypeRepr/PtrTypeRepr.ql d9289bfe1e72d9560b3878e4557f8cfda578ef7bce67eb29d7320921c0ba46a5 f3ea108aa25635bffa7673bb66b2581ce246d3aae86edf878c6f1abca2493c16 test/extractor-tests/generated/RangeExpr/RangeExpr.ql c9776706d933606d1463bb08ed76457ac03a9558f6dac0218ef2012bc5e8e48f 77cafee86abc2680e1f9c925fbe664c05ba1b9a2533b1873242ef01dde1ce308 @@ -862,7 +862,7 @@ test/extractor-tests/generated/UseTreeList/UseTreeList.ql faff7bfc060d5b0a922f38 test/extractor-tests/generated/Variant/Variant.ql 0de458e2d04e40e9a0c036e423d05af3617f4423b967e287f0800ccffd345633 921a8ca71390812f174c5220d54dfcfc7105e57ba3c301f5c86301a19d089bda test/extractor-tests/generated/VariantList/VariantList.ql 1c1d82ce3ecfa7daaae1920662510e81892ed899a3c2f785e2ff3670245a03cd 29d4c5ab2b737a92c7525789e10a4aa9848f1a327e34f4e9543018021106b303 test/extractor-tests/generated/Visibility/Visibility.ql 3bdf8f1ff70f62eabda19086d2c6b2c7e9cf4f7bb327b053a0115089d4aa9f56 7f89b2519ac4ef8e3afdfce58aa66edc921d36ecf28550f5cc3bce190db752e8 -test/extractor-tests/generated/VisibilityInner/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 +test/extractor-tests/generated/VisibilityInner/VisibilityInner.ql c71530193ac5395f4b6b0b57efaf0c0076a9e4c115bfbd38a41546045dfa0d75 059ad90ec71d5339928f79338bd7d459d24881762f65d1534b5ded860b533ced test/extractor-tests/generated/WhereClause/WhereClause.ql a6f0e69ffa6b997cac04d4da442eb8bde517a576840c953abcc40863b9099ba1 7ce888fffc3038d5b18f8c94d3b045815cd45500e1bb3849c05fc874edbeb695 test/extractor-tests/generated/WherePred/WherePred.ql 8f73500a04f8748221b181bb9a51bef6c09d5ddf046488303594821e3191b370 8fb51d095a3c39b51ec8b4515fc02474ba36067ca4dfd48dff7e14d1c3881ea3 test/extractor-tests/generated/WhileExpr/WhileExpr.ql dcfe1ed375514a7b7513272767ed195cdbf339b56e00e62d207ca1eee080f164 f067283510655f0cf810cae834ac29ad2c6007ba312d027ebcdf695a23ec33e4 diff --git a/rust/ql/.gitattributes b/rust/ql/.gitattributes index 2d5c14bff270..a37af330c5d6 100644 --- a/rust/ql/.gitattributes +++ b/rust/ql/.gitattributes @@ -737,7 +737,7 @@ /test/extractor-tests/generated/ConstParam/ConstParam.ql linguist-generated /test/extractor-tests/generated/ContinueExpr/ContinueExpr.ql linguist-generated /test/extractor-tests/generated/Crate/MISSING_SOURCE.txt linguist-generated -/test/extractor-tests/generated/DerefPat/MISSING_SOURCE.txt linguist-generated +/test/extractor-tests/generated/DerefPat/DerefPat.ql linguist-generated /test/extractor-tests/generated/DynTraitTypeRepr/DynTraitTypeRepr.ql linguist-generated /test/extractor-tests/generated/Enum/Enum.ql linguist-generated /test/extractor-tests/generated/ExprStmt/ExprStmt.ql linguist-generated @@ -762,7 +762,7 @@ /test/extractor-tests/generated/Impl/Impl.ql linguist-generated /test/extractor-tests/generated/ImplRestriction/MISSING_SOURCE.txt linguist-generated /test/extractor-tests/generated/ImplTraitTypeRepr/ImplTraitTypeRepr.ql linguist-generated -/test/extractor-tests/generated/IncludeBytesExpr/MISSING_SOURCE.txt linguist-generated +/test/extractor-tests/generated/IncludeBytesExpr/IncludeBytesExpr.ql linguist-generated /test/extractor-tests/generated/IndexExpr/IndexExpr.ql linguist-generated /test/extractor-tests/generated/InferTypeRepr/InferTypeRepr.ql linguist-generated /test/extractor-tests/generated/ItemList/ItemList.ql linguist-generated @@ -794,7 +794,7 @@ /test/extractor-tests/generated/Name/Name.ql linguist-generated /test/extractor-tests/generated/NameRef/NameRef.ql linguist-generated /test/extractor-tests/generated/NeverTypeRepr/NeverTypeRepr.ql linguist-generated -/test/extractor-tests/generated/NotNull/MISSING_SOURCE.txt linguist-generated +/test/extractor-tests/generated/NotNull/NotNull.ql linguist-generated /test/extractor-tests/generated/OffsetOfExpr/OffsetOfExpr.ql linguist-generated /test/extractor-tests/generated/OrPat/OrPat.ql linguist-generated /test/extractor-tests/generated/Param/Param.ql linguist-generated @@ -809,7 +809,7 @@ /test/extractor-tests/generated/Path/PathSegment.ql linguist-generated /test/extractor-tests/generated/Path/PathTypeRepr.ql linguist-generated /test/extractor-tests/generated/PathMeta/MISSING_SOURCE.txt linguist-generated -/test/extractor-tests/generated/PatternTypeRepr/MISSING_SOURCE.txt linguist-generated +/test/extractor-tests/generated/PatternTypeRepr/PatternTypeRepr.ql linguist-generated /test/extractor-tests/generated/PrefixExpr/PrefixExpr.ql linguist-generated /test/extractor-tests/generated/PtrTypeRepr/PtrTypeRepr.ql linguist-generated /test/extractor-tests/generated/RangeExpr/RangeExpr.ql linguist-generated @@ -864,7 +864,7 @@ /test/extractor-tests/generated/Variant/Variant.ql linguist-generated /test/extractor-tests/generated/VariantList/VariantList.ql linguist-generated /test/extractor-tests/generated/Visibility/Visibility.ql linguist-generated -/test/extractor-tests/generated/VisibilityInner/MISSING_SOURCE.txt linguist-generated +/test/extractor-tests/generated/VisibilityInner/VisibilityInner.ql linguist-generated /test/extractor-tests/generated/WhereClause/WhereClause.ql linguist-generated /test/extractor-tests/generated/WherePred/WherePred.ql linguist-generated /test/extractor-tests/generated/WhileExpr/WhileExpr.ql linguist-generated diff --git a/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll b/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll index 8081aea83646..b5ddb6dc1776 100644 --- a/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll +++ b/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll @@ -883,6 +883,13 @@ module MakeCfgNodes Input> { } /** + * A deref pattern, matching the value behind a smart pointer. For example: + * ```rust + * match x { + * builtin#deref(y) => y, + * _ => 0, + * }; + * ``` */ final class DerefPatCfgNode extends CfgNodeFinal, PatCfgNode { private DerefPat node; @@ -1378,6 +1385,10 @@ module MakeCfgNodes Input> { } /** + * An expression produced by the built-in `include_bytes!` macro, embedding the contents of a file as a byte array. For example: + * ```rust + * let data = include_bytes!("data.bin"); + * ``` */ final class IncludeBytesExprCfgNode extends CfgNodeFinal, ExprCfgNode { private IncludeBytesExpr node; @@ -2149,6 +2160,10 @@ module MakeCfgNodes Input> { } /** + * The `!null` pattern used in a pattern type to denote a non-null value. For example: + * ```rust + * type NonNull = builtin#pattern_type(*const () is !null); + * ``` */ final class NotNullCfgNode extends CfgNodeFinal, PatCfgNode { private NotNull node; diff --git a/rust/ql/lib/codeql/rust/elements/DerefPat.qll b/rust/ql/lib/codeql/rust/elements/DerefPat.qll index 30c7ce48cf4e..63b822cb5ef2 100644 --- a/rust/ql/lib/codeql/rust/elements/DerefPat.qll +++ b/rust/ql/lib/codeql/rust/elements/DerefPat.qll @@ -6,4 +6,13 @@ private import internal.DerefPatImpl import codeql.rust.elements.Pat +/** + * A deref pattern, matching the value behind a smart pointer. For example: + * ```rust + * match x { + * builtin#deref(y) => y, + * _ => 0, + * }; + * ``` + */ final class DerefPat = Impl::DerefPat; diff --git a/rust/ql/lib/codeql/rust/elements/ImplRestriction.qll b/rust/ql/lib/codeql/rust/elements/ImplRestriction.qll index 4b6ee748a456..23bd1c0ace6e 100644 --- a/rust/ql/lib/codeql/rust/elements/ImplRestriction.qll +++ b/rust/ql/lib/codeql/rust/elements/ImplRestriction.qll @@ -7,4 +7,7 @@ private import internal.ImplRestrictionImpl import codeql.rust.elements.AstNode import codeql.rust.elements.VisibilityInner +/** + * An implementation restriction, limiting where a trait can be implemented. For example the `impl(crate)` restriction (an unstable feature). + */ final class ImplRestriction = Impl::ImplRestriction; diff --git a/rust/ql/lib/codeql/rust/elements/IncludeBytesExpr.qll b/rust/ql/lib/codeql/rust/elements/IncludeBytesExpr.qll index 242e0a087620..f6aff4cf27f0 100644 --- a/rust/ql/lib/codeql/rust/elements/IncludeBytesExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/IncludeBytesExpr.qll @@ -6,4 +6,10 @@ private import internal.IncludeBytesExprImpl import codeql.rust.elements.Expr +/** + * An expression produced by the built-in `include_bytes!` macro, embedding the contents of a file as a byte array. For example: + * ```rust + * let data = include_bytes!("data.bin"); + * ``` + */ final class IncludeBytesExpr = Impl::IncludeBytesExpr; diff --git a/rust/ql/lib/codeql/rust/elements/MutRestriction.qll b/rust/ql/lib/codeql/rust/elements/MutRestriction.qll index dfef343cf7c5..57a938005b1d 100644 --- a/rust/ql/lib/codeql/rust/elements/MutRestriction.qll +++ b/rust/ql/lib/codeql/rust/elements/MutRestriction.qll @@ -7,4 +7,7 @@ private import internal.MutRestrictionImpl import codeql.rust.elements.AstNode import codeql.rust.elements.VisibilityInner +/** + * A mutability restriction, limiting where a field can be mutated. For example the `mut(crate)` restriction (an unstable feature). + */ final class MutRestriction = Impl::MutRestriction; diff --git a/rust/ql/lib/codeql/rust/elements/NotNull.qll b/rust/ql/lib/codeql/rust/elements/NotNull.qll index 6c27c1866613..3966fb24dfa7 100644 --- a/rust/ql/lib/codeql/rust/elements/NotNull.qll +++ b/rust/ql/lib/codeql/rust/elements/NotNull.qll @@ -6,4 +6,10 @@ private import internal.NotNullImpl import codeql.rust.elements.Pat +/** + * The `!null` pattern used in a pattern type to denote a non-null value. For example: + * ```rust + * type NonNull = builtin#pattern_type(*const () is !null); + * ``` + */ final class NotNull = Impl::NotNull; diff --git a/rust/ql/lib/codeql/rust/elements/PatternTypeRepr.qll b/rust/ql/lib/codeql/rust/elements/PatternTypeRepr.qll index c6d6c0b71e84..9155fdb97c66 100644 --- a/rust/ql/lib/codeql/rust/elements/PatternTypeRepr.qll +++ b/rust/ql/lib/codeql/rust/elements/PatternTypeRepr.qll @@ -7,4 +7,10 @@ private import internal.PatternTypeReprImpl import codeql.rust.elements.Pat import codeql.rust.elements.TypeRepr +/** + * A pattern type, constraining a type to values matching a pattern. For example: + * ```rust + * type NonZero = builtin#pattern_type(u32 is 1..); + * ``` + */ final class PatternTypeRepr = Impl::PatternTypeRepr; diff --git a/rust/ql/lib/codeql/rust/elements/VisibilityInner.qll b/rust/ql/lib/codeql/rust/elements/VisibilityInner.qll index 2439313fa6aa..f17c65ff6dec 100644 --- a/rust/ql/lib/codeql/rust/elements/VisibilityInner.qll +++ b/rust/ql/lib/codeql/rust/elements/VisibilityInner.qll @@ -7,4 +7,11 @@ private import internal.VisibilityInnerImpl import codeql.rust.elements.AstNode import codeql.rust.elements.Path +/** + * The parenthesized inner part of a visibility modifier or restriction, such as the `(in path)` in `pub(in path)`, or the `(crate)` in `pub(crate)`. For example the `(in foo::bar)` in: + * ```rust + * pub(in foo::bar) struct S; + * // ^^^^^^^^^^^^ + * ``` + */ final class VisibilityInner = Impl::VisibilityInner; diff --git a/rust/ql/lib/codeql/rust/elements/internal/DerefPatImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/DerefPatImpl.qll index 494072057a9c..b7c627c881a4 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/DerefPatImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/DerefPatImpl.qll @@ -12,5 +12,14 @@ private import codeql.rust.elements.internal.generated.DerefPat * be referenced directly. */ module Impl { + /** + * A deref pattern, matching the value behind a smart pointer. For example: + * ```rust + * match x { + * builtin#deref(y) => y, + * _ => 0, + * }; + * ``` + */ class DerefPat extends Generated::DerefPat { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ImplRestrictionImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ImplRestrictionImpl.qll index 33cacad6f47a..7240c6a6bcea 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ImplRestrictionImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ImplRestrictionImpl.qll @@ -12,5 +12,8 @@ private import codeql.rust.elements.internal.generated.ImplRestriction * be referenced directly. */ module Impl { + /** + * An implementation restriction, limiting where a trait can be implemented. For example the `impl(crate)` restriction (an unstable feature). + */ class ImplRestriction extends Generated::ImplRestriction { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/IncludeBytesExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/IncludeBytesExprImpl.qll index 691f736f11c1..750abcb2f098 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/IncludeBytesExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/IncludeBytesExprImpl.qll @@ -12,5 +12,11 @@ private import codeql.rust.elements.internal.generated.IncludeBytesExpr * be referenced directly. */ module Impl { + /** + * An expression produced by the built-in `include_bytes!` macro, embedding the contents of a file as a byte array. For example: + * ```rust + * let data = include_bytes!("data.bin"); + * ``` + */ class IncludeBytesExpr extends Generated::IncludeBytesExpr { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/MutRestrictionImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/MutRestrictionImpl.qll index caaaa8c2a4d1..6d8722a09e6c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/MutRestrictionImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/MutRestrictionImpl.qll @@ -12,5 +12,8 @@ private import codeql.rust.elements.internal.generated.MutRestriction * be referenced directly. */ module Impl { + /** + * A mutability restriction, limiting where a field can be mutated. For example the `mut(crate)` restriction (an unstable feature). + */ class MutRestriction extends Generated::MutRestriction { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/NotNullImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/NotNullImpl.qll index 44d4bfb635dc..268e2239a221 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/NotNullImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/NotNullImpl.qll @@ -12,5 +12,11 @@ private import codeql.rust.elements.internal.generated.NotNull * be referenced directly. */ module Impl { + /** + * The `!null` pattern used in a pattern type to denote a non-null value. For example: + * ```rust + * type NonNull = builtin#pattern_type(*const () is !null); + * ``` + */ class NotNull extends Generated::NotNull { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/PatternTypeReprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/PatternTypeReprImpl.qll index 986a3980b79c..7e9d6b7f38ea 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/PatternTypeReprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/PatternTypeReprImpl.qll @@ -12,5 +12,11 @@ private import codeql.rust.elements.internal.generated.PatternTypeRepr * be referenced directly. */ module Impl { + /** + * A pattern type, constraining a type to values matching a pattern. For example: + * ```rust + * type NonZero = builtin#pattern_type(u32 is 1..); + * ``` + */ class PatternTypeRepr extends Generated::PatternTypeRepr { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/VisibilityInnerImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/VisibilityInnerImpl.qll index 73595278072f..ad896e5dcd25 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/VisibilityInnerImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/VisibilityInnerImpl.qll @@ -12,5 +12,12 @@ private import codeql.rust.elements.internal.generated.VisibilityInner * be referenced directly. */ module Impl { + /** + * The parenthesized inner part of a visibility modifier or restriction, such as the `(in path)` in `pub(in path)`, or the `(crate)` in `pub(crate)`. For example the `(in foo::bar)` in: + * ```rust + * pub(in foo::bar) struct S; + * // ^^^^^^^^^^^^ + * ``` + */ class VisibilityInner extends Generated::VisibilityInner { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/DerefPat.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/DerefPat.qll index 713f42f81ce9..afeb873e50cd 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/DerefPat.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/DerefPat.qll @@ -15,6 +15,13 @@ import codeql.rust.elements.internal.PatImpl::Impl as PatImpl */ module Generated { /** + * A deref pattern, matching the value behind a smart pointer. For example: + * ```rust + * match x { + * builtin#deref(y) => y, + * _ => 0, + * }; + * ``` * INTERNAL: Do not reference the `Generated::DerefPat` class directly. * Use the subclass `DerefPat`, where the following predicates are available. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ImplRestriction.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ImplRestriction.qll index d1b1badd535d..22210ede91a9 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ImplRestriction.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ImplRestriction.qll @@ -15,6 +15,7 @@ import codeql.rust.elements.VisibilityInner */ module Generated { /** + * An implementation restriction, limiting where a trait can be implemented. For example the `impl(crate)` restriction (an unstable feature). * INTERNAL: Do not reference the `Generated::ImplRestriction` class directly. * Use the subclass `ImplRestriction`, where the following predicates are available. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/IncludeBytesExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/IncludeBytesExpr.qll index 5b420b077a14..712f9c6b37dc 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/IncludeBytesExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/IncludeBytesExpr.qll @@ -14,6 +14,10 @@ import codeql.rust.elements.internal.ExprImpl::Impl as ExprImpl */ module Generated { /** + * An expression produced by the built-in `include_bytes!` macro, embedding the contents of a file as a byte array. For example: + * ```rust + * let data = include_bytes!("data.bin"); + * ``` * INTERNAL: Do not reference the `Generated::IncludeBytesExpr` class directly. * Use the subclass `IncludeBytesExpr`, where the following predicates are available. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/MutRestriction.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/MutRestriction.qll index 8210b63f876d..8d387ff8ccf7 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/MutRestriction.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/MutRestriction.qll @@ -15,6 +15,7 @@ import codeql.rust.elements.VisibilityInner */ module Generated { /** + * A mutability restriction, limiting where a field can be mutated. For example the `mut(crate)` restriction (an unstable feature). * INTERNAL: Do not reference the `Generated::MutRestriction` class directly. * Use the subclass `MutRestriction`, where the following predicates are available. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/NotNull.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/NotNull.qll index 65256d21d0ec..25922bf9284f 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/NotNull.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/NotNull.qll @@ -14,6 +14,10 @@ import codeql.rust.elements.internal.PatImpl::Impl as PatImpl */ module Generated { /** + * The `!null` pattern used in a pattern type to denote a non-null value. For example: + * ```rust + * type NonNull = builtin#pattern_type(*const () is !null); + * ``` * INTERNAL: Do not reference the `Generated::NotNull` class directly. * Use the subclass `NotNull`, where the following predicates are available. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/PatternTypeRepr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/PatternTypeRepr.qll index bb009f83b4e4..4a02180ede73 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/PatternTypeRepr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/PatternTypeRepr.qll @@ -16,6 +16,10 @@ import codeql.rust.elements.internal.TypeReprImpl::Impl as TypeReprImpl */ module Generated { /** + * A pattern type, constraining a type to values matching a pattern. For example: + * ```rust + * type NonZero = builtin#pattern_type(u32 is 1..); + * ``` * INTERNAL: Do not reference the `Generated::PatternTypeRepr` class directly. * Use the subclass `PatternTypeRepr`, where the following predicates are available. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll index 8df01e4566b6..a851aad952be 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll @@ -669,6 +669,7 @@ module Raw { /** * INTERNAL: Do not use. + * An implementation restriction, limiting where a trait can be implemented. For example the `impl(crate)` restriction (an unstable feature). */ class ImplRestriction extends @impl_restriction, AstNode { override string toString() { result = "ImplRestriction" } @@ -1021,6 +1022,7 @@ module Raw { /** * INTERNAL: Do not use. + * A mutability restriction, limiting where a field can be mutated. For example the `mut(crate)` restriction (an unstable feature). */ class MutRestriction extends @mut_restriction, AstNode { override string toString() { result = "MutRestriction" } @@ -2240,6 +2242,11 @@ module Raw { /** * INTERNAL: Do not use. + * The parenthesized inner part of a visibility modifier or restriction, such as the `(in path)` in `pub(in path)`, or the `(crate)` in `pub(crate)`. For example the `(in foo::bar)` in: + * ```rust + * pub(in foo::bar) struct S; + * // ^^^^^^^^^^^^ + * ``` */ class VisibilityInner extends @visibility_inner, AstNode { override string toString() { result = "VisibilityInner" } @@ -3575,6 +3582,13 @@ module Raw { /** * INTERNAL: Do not use. + * A deref pattern, matching the value behind a smart pointer. For example: + * ```rust + * match x { + * builtin#deref(y) => y, + * _ => 0, + * }; + * ``` */ class DerefPat extends @deref_pat, Pat { override string toString() { result = "DerefPat" } @@ -4034,6 +4048,10 @@ module Raw { /** * INTERNAL: Do not use. + * An expression produced by the built-in `include_bytes!` macro, embedding the contents of a file as a byte array. For example: + * ```rust + * let data = include_bytes!("data.bin"); + * ``` */ class IncludeBytesExpr extends @include_bytes_expr, Expr { override string toString() { result = "IncludeBytesExpr" } @@ -4741,6 +4759,10 @@ module Raw { /** * INTERNAL: Do not use. + * The `!null` pattern used in a pattern type to denote a non-null value. For example: + * ```rust + * type NonNull = builtin#pattern_type(*const () is !null); + * ``` */ class NotNull extends @not_null, Pat { override string toString() { result = "NotNull" } @@ -5065,6 +5087,10 @@ module Raw { /** * INTERNAL: Do not use. + * A pattern type, constraining a type to values matching a pattern. For example: + * ```rust + * type NonZero = builtin#pattern_type(u32 is 1..); + * ``` */ class PatternTypeRepr extends @pattern_type_repr, TypeRepr { override string toString() { result = "PatternTypeRepr" } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/VisibilityInner.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/VisibilityInner.qll index 92d5d0eed758..4283b56cd9dd 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/VisibilityInner.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/VisibilityInner.qll @@ -15,6 +15,11 @@ import codeql.rust.elements.Path */ module Generated { /** + * The parenthesized inner part of a visibility modifier or restriction, such as the `(in path)` in `pub(in path)`, or the `(crate)` in `pub(crate)`. For example the `(in foo::bar)` in: + * ```rust + * pub(in foo::bar) struct S; + * // ^^^^^^^^^^^^ + * ``` * INTERNAL: Do not reference the `Generated::VisibilityInner` class directly. * Use the subclass `VisibilityInner`, where the following predicates are available. */ diff --git a/rust/ql/test/extractor-tests/generated/.generated_tests.list b/rust/ql/test/extractor-tests/generated/.generated_tests.list index 42c79ede411d..7bb5c7f961d1 100644 --- a/rust/ql/test/extractor-tests/generated/.generated_tests.list +++ b/rust/ql/test/extractor-tests/generated/.generated_tests.list @@ -32,6 +32,7 @@ ConstArg/gen_const_arg.rs 6a15d099c61ffa814e8e0e0fca2d8ff481d73ad81959064e0a214d ConstBlockPat/gen_const_block_pat.rs 7e3057cd24d22e752354369cf7e08e9536642812c0947b36aa5d8290a45476fd 7e3057cd24d22e752354369cf7e08e9536642812c0947b36aa5d8290a45476fd ConstParam/gen_const_param.rs 71f22d907b0011dafc333f37635f0ee5b1eef2313b5a26cd2a21508a8e96c19a 71f22d907b0011dafc333f37635f0ee5b1eef2313b5a26cd2a21508a8e96c19a ContinueExpr/gen_continue_expr.rs 63840dcd8440aaf1b96b713b80eb2b56acb1639d3200b3c732b45291a071b5ff 63840dcd8440aaf1b96b713b80eb2b56acb1639d3200b3c732b45291a071b5ff +DerefPat/gen_deref_pat.rs ad842fb169f7e8774ab0adc67d5d8a29f181ea8992874d5715f53080c5c039e8 ad842fb169f7e8774ab0adc67d5d8a29f181ea8992874d5715f53080c5c039e8 DynTraitTypeRepr/gen_dyn_trait_type_repr.rs 1864f3900bdae6f4a0a428e0b2a1266b758dfa8f27059353a639612d8829f4dd 1864f3900bdae6f4a0a428e0b2a1266b758dfa8f27059353a639612d8829f4dd Enum/gen_enum.rs 59c6dc0185c6b0dd877ce1b2291d3b8ab05041194b7bfc948e97baa4908605fa 59c6dc0185c6b0dd877ce1b2291d3b8ab05041194b7bfc948e97baa4908605fa ExprStmt/gen_expr_stmt.rs 6ce47428a8d33b902c1f14b06cc375d08eff95251e4a81dac2fa51872b7649b1 6ce47428a8d33b902c1f14b06cc375d08eff95251e4a81dac2fa51872b7649b1 @@ -54,6 +55,7 @@ IdentPat/gen_ident_pat.rs 87f9201ca47683ff6f12a0c844c062fdedb6d86546794522d358b1 IfExpr/gen_if_expr.rs 2df66735394ebb20db29d3fbf2721ad4812afbe8d4614d03f26265c1f481f1e8 2df66735394ebb20db29d3fbf2721ad4812afbe8d4614d03f26265c1f481f1e8 Impl/gen_impl.rs a3f91dbcbb89f660e1c67eb6211def495cced5ab069515c6151e442365f64899 a3f91dbcbb89f660e1c67eb6211def495cced5ab069515c6151e442365f64899 ImplTraitTypeRepr/gen_impl_trait_type_repr.rs ebfa4d350ae5759bf7df6adf790d2d892c7a0d708f3340ccf3e12a681cb78f00 ebfa4d350ae5759bf7df6adf790d2d892c7a0d708f3340ccf3e12a681cb78f00 +IncludeBytesExpr/gen_include_bytes_expr.rs d993b5155810929c79b485f270707540cee3cbd24f667962d7279da4a2497548 d993b5155810929c79b485f270707540cee3cbd24f667962d7279da4a2497548 IndexExpr/gen_index_expr.rs 22d7f81ba43dc63f1f49e21a2c25ce25a1b8f6e8e95e1a66f518f010a4d73c61 22d7f81ba43dc63f1f49e21a2c25ce25a1b8f6e8e95e1a66f518f010a4d73c61 InferTypeRepr/gen_infer_type_repr.rs cd50eaeffdf16e0e896b14b665590251a4d383c123502ed667d8b1f75000f559 cd50eaeffdf16e0e896b14b665590251a4d383c123502ed667d8b1f75000f559 ItemList/gen_item_list.rs 5da9f631030568c80aa0b126369990070cebcd1805827a8077320d4bec789a4e 5da9f631030568c80aa0b126369990070cebcd1805827a8077320d4bec789a4e @@ -83,6 +85,7 @@ Module/gen_module.rs 815605a604fea1d9276684f8d6738a4e833eacad57ceeb27e2095fc4502 Name/gen_name.rs 8a7fe65ee632a47d12eaa313e7248ac9210e5a381e9522499ca68f94c39e72c0 8a7fe65ee632a47d12eaa313e7248ac9210e5a381e9522499ca68f94c39e72c0 NameRef/gen_name_ref.rs c8c922e77a7d62b8272359ccdabbf7e15411f31ca85f15a3afdd94bec7ec64e7 c8c922e77a7d62b8272359ccdabbf7e15411f31ca85f15a3afdd94bec7ec64e7 NeverTypeRepr/gen_never_type_repr.rs cc7d1c861eaf89772109f142815839976f25f89956ed1b11822df5e7e333d6d4 cc7d1c861eaf89772109f142815839976f25f89956ed1b11822df5e7e333d6d4 +NotNull/gen_not_null.rs e812da59590473bff72438b8e8f66b4f371c7ec90852b2e13505f3697ff15cdc e812da59590473bff72438b8e8f66b4f371c7ec90852b2e13505f3697ff15cdc OffsetOfExpr/gen_offset_of_expr.rs 8e2077b4d7b85c91c17c3630511bc4f929950e9007261cbf0471c4a064c4b934 8e2077b4d7b85c91c17c3630511bc4f929950e9007261cbf0471c4a064c4b934 OrPat/gen_or_pat.rs 71feef6e056bfe4cc8c22c9eb54fa3fecef613606769061d0efd059adbbd6f56 71feef6e056bfe4cc8c22c9eb54fa3fecef613606769061d0efd059adbbd6f56 Param/gen_param.rs 39f3979d6cb10e4c43e0b5601af2a92b7520a75a104211955bbbb5e6f13e9db9 39f3979d6cb10e4c43e0b5601af2a92b7520a75a104211955bbbb5e6f13e9db9 @@ -95,6 +98,7 @@ Path/gen_path.rs 490268d6bfb1635883b8bdefc683d59c4dd0e9c7f86c2e55954661efb3ab025 Path/gen_path_expr.rs dcc9cc16cafff0e2225c1853a91612d3f666016c53fcb4ab5716ed31a33a41cd dcc9cc16cafff0e2225c1853a91612d3f666016c53fcb4ab5716ed31a33a41cd Path/gen_path_pat.rs fd7f941f8b33f19d3693be1fdb595c2fb2e85e8296702b82bf12bcd44632f371 fd7f941f8b33f19d3693be1fdb595c2fb2e85e8296702b82bf12bcd44632f371 Path/gen_path_type_repr.rs 2a59f36d62a8a6e0e2caacd2b7a78943ddb48af2bb2d82b0e63b387ec24e052d 2a59f36d62a8a6e0e2caacd2b7a78943ddb48af2bb2d82b0e63b387ec24e052d +PatternTypeRepr/gen_pattern_type_repr.rs 646af3e3af75d1b8c897d832ea11f0c48d7c0c9f1e379939424939d342bbbca4 646af3e3af75d1b8c897d832ea11f0c48d7c0c9f1e379939424939d342bbbca4 PrefixExpr/gen_prefix_expr.rs c4b53e87f370713b9a9e257be26d082b0761497bac19b1d7401a31b22b30d1ab c4b53e87f370713b9a9e257be26d082b0761497bac19b1d7401a31b22b30d1ab PtrTypeRepr/gen_ptr_type_repr.rs b833d2a02add897c53ad5f0d436e1f5fa8919809592e1ded56b0c1c99b8344bd b833d2a02add897c53ad5f0d436e1f5fa8919809592e1ded56b0c1c99b8344bd RangeExpr/gen_range_expr.rs 3f27cff9cc76b2703beff622d1453b84121e1970a869e45f9428deac92c4ecb0 3f27cff9cc76b2703beff622d1453b84121e1970a869e45f9428deac92c4ecb0 @@ -145,6 +149,7 @@ UseTreeList/gen_use_tree_list.rs 2494aadcec03a3f7a6e2ae448ee70ec6774f840e9519c66 Variant/gen_variant.rs fa3d3a9e3e0c3aa565b965fad9c3dc2ffd5a8d82963e3a55a9acbb0f14b603d6 fa3d3a9e3e0c3aa565b965fad9c3dc2ffd5a8d82963e3a55a9acbb0f14b603d6 VariantList/gen_variant_list.rs a1faa4d59b072f139d14cb8a6d63a0ce8c473170d6320a07ce6bb9d517f8486d a1faa4d59b072f139d14cb8a6d63a0ce8c473170d6320a07ce6bb9d517f8486d Visibility/gen_visibility.rs cfa4b05fa7ba7c4ffa8f9c880b13792735e4f7e92a648f43110e914075e97a52 cfa4b05fa7ba7c4ffa8f9c880b13792735e4f7e92a648f43110e914075e97a52 +VisibilityInner/gen_visibility_inner.rs d392d92d56b4da0bb7ba1d4fc6aecf0932e4174e7ccd2fc64ea68d659aca1ee7 d392d92d56b4da0bb7ba1d4fc6aecf0932e4174e7ccd2fc64ea68d659aca1ee7 WhereClause/gen_where_clause.rs 22522c933be47f8f7f9d0caddfa41925c08df343c564baad2fe2daa14f1bfb1a 22522c933be47f8f7f9d0caddfa41925c08df343c564baad2fe2daa14f1bfb1a WherePred/gen_where_pred.rs 7036e34f1a1f77c5cf031f385be4583472ea4f99e8b4b4ec3c72a65c23e418bb 7036e34f1a1f77c5cf031f385be4583472ea4f99e8b4b4ec3c72a65c23e418bb WhileExpr/gen_while_expr.rs 97276c5946a36001638491c99a36170d22bc6011c5e59f621b37c7a2d7737879 97276c5946a36001638491c99a36170d22bc6011c5e59f621b37c7a2d7737879 diff --git a/rust/ql/test/extractor-tests/generated/.gitattributes b/rust/ql/test/extractor-tests/generated/.gitattributes index 7ac64a528a53..6070e3e0ccc2 100644 --- a/rust/ql/test/extractor-tests/generated/.gitattributes +++ b/rust/ql/test/extractor-tests/generated/.gitattributes @@ -34,6 +34,7 @@ /ConstBlockPat/gen_const_block_pat.rs linguist-generated /ConstParam/gen_const_param.rs linguist-generated /ContinueExpr/gen_continue_expr.rs linguist-generated +/DerefPat/gen_deref_pat.rs linguist-generated /DynTraitTypeRepr/gen_dyn_trait_type_repr.rs linguist-generated /Enum/gen_enum.rs linguist-generated /ExprStmt/gen_expr_stmt.rs linguist-generated @@ -56,6 +57,7 @@ /IfExpr/gen_if_expr.rs linguist-generated /Impl/gen_impl.rs linguist-generated /ImplTraitTypeRepr/gen_impl_trait_type_repr.rs linguist-generated +/IncludeBytesExpr/gen_include_bytes_expr.rs linguist-generated /IndexExpr/gen_index_expr.rs linguist-generated /InferTypeRepr/gen_infer_type_repr.rs linguist-generated /ItemList/gen_item_list.rs linguist-generated @@ -85,6 +87,7 @@ /Name/gen_name.rs linguist-generated /NameRef/gen_name_ref.rs linguist-generated /NeverTypeRepr/gen_never_type_repr.rs linguist-generated +/NotNull/gen_not_null.rs linguist-generated /OffsetOfExpr/gen_offset_of_expr.rs linguist-generated /OrPat/gen_or_pat.rs linguist-generated /Param/gen_param.rs linguist-generated @@ -97,6 +100,7 @@ /Path/gen_path_expr.rs linguist-generated /Path/gen_path_pat.rs linguist-generated /Path/gen_path_type_repr.rs linguist-generated +/PatternTypeRepr/gen_pattern_type_repr.rs linguist-generated /PrefixExpr/gen_prefix_expr.rs linguist-generated /PtrTypeRepr/gen_ptr_type_repr.rs linguist-generated /RangeExpr/gen_range_expr.rs linguist-generated @@ -147,6 +151,7 @@ /Variant/gen_variant.rs linguist-generated /VariantList/gen_variant_list.rs linguist-generated /Visibility/gen_visibility.rs linguist-generated +/VisibilityInner/gen_visibility_inner.rs linguist-generated /WhereClause/gen_where_clause.rs linguist-generated /WherePred/gen_where_pred.rs linguist-generated /WhileExpr/gen_while_expr.rs linguist-generated diff --git a/rust/ql/test/extractor-tests/generated/DerefPat/DerefPat.expected b/rust/ql/test/extractor-tests/generated/DerefPat/DerefPat.expected new file mode 100644 index 000000000000..f3a958c6308e --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/DerefPat/DerefPat.expected @@ -0,0 +1,4 @@ +instances +| gen_deref_pat.rs:6:9:6:24 | DerefPat | +getPat +| gen_deref_pat.rs:6:9:6:24 | DerefPat | gen_deref_pat.rs:6:23:6:23 | y | diff --git a/rust/ql/test/extractor-tests/generated/DerefPat/DerefPat.ql b/rust/ql/test/extractor-tests/generated/DerefPat/DerefPat.ql new file mode 100644 index 000000000000..f17a3c41f132 --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/DerefPat/DerefPat.ql @@ -0,0 +1,9 @@ +// generated by codegen, do not edit +import codeql.rust.elements +import TestUtils + +query predicate instances(DerefPat x) { toBeTested(x) and not x.isUnknown() } + +query predicate getPat(DerefPat x, Pat getPat) { + toBeTested(x) and not x.isUnknown() and getPat = x.getPat() +} diff --git a/rust/ql/test/extractor-tests/generated/DerefPat/MISSING_SOURCE.txt b/rust/ql/test/extractor-tests/generated/DerefPat/MISSING_SOURCE.txt deleted file mode 100644 index 7f96b17b1f3c..000000000000 --- a/rust/ql/test/extractor-tests/generated/DerefPat/MISSING_SOURCE.txt +++ /dev/null @@ -1,4 +0,0 @@ -// generated by codegen, do not edit - -After a source file is added in this directory and codegen is run again, test queries -will appear and this file will be deleted diff --git a/rust/ql/test/extractor-tests/generated/DerefPat/gen_deref_pat.rs b/rust/ql/test/extractor-tests/generated/DerefPat/gen_deref_pat.rs new file mode 100644 index 000000000000..387287ef9af7 --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/DerefPat/gen_deref_pat.rs @@ -0,0 +1,9 @@ +// generated by codegen, do not edit + +fn test_deref_pat() -> () { + // A deref pattern, matching the value behind a smart pointer. For example: + match x { + builtin#deref(y) => y, + _ => 0, + }; +} diff --git a/rust/ql/test/extractor-tests/generated/IncludeBytesExpr/IncludeBytesExpr.expected b/rust/ql/test/extractor-tests/generated/IncludeBytesExpr/IncludeBytesExpr.expected new file mode 100644 index 000000000000..bb50091ec579 --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/IncludeBytesExpr/IncludeBytesExpr.expected @@ -0,0 +1 @@ +| gen_include_bytes_expr.rs:5:16:5:29 | IncludeBytesExpr | diff --git a/rust/ql/test/extractor-tests/generated/IncludeBytesExpr/IncludeBytesExpr.ql b/rust/ql/test/extractor-tests/generated/IncludeBytesExpr/IncludeBytesExpr.ql new file mode 100644 index 000000000000..389544ae9961 --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/IncludeBytesExpr/IncludeBytesExpr.ql @@ -0,0 +1,5 @@ +// generated by codegen, do not edit +import codeql.rust.elements +import TestUtils + +query predicate instances(IncludeBytesExpr x) { toBeTested(x) and not x.isUnknown() } diff --git a/rust/ql/test/extractor-tests/generated/IncludeBytesExpr/MISSING_SOURCE.txt b/rust/ql/test/extractor-tests/generated/IncludeBytesExpr/MISSING_SOURCE.txt deleted file mode 100644 index 7f96b17b1f3c..000000000000 --- a/rust/ql/test/extractor-tests/generated/IncludeBytesExpr/MISSING_SOURCE.txt +++ /dev/null @@ -1,4 +0,0 @@ -// generated by codegen, do not edit - -After a source file is added in this directory and codegen is run again, test queries -will appear and this file will be deleted diff --git a/rust/ql/test/extractor-tests/generated/IncludeBytesExpr/gen_include_bytes_expr.rs b/rust/ql/test/extractor-tests/generated/IncludeBytesExpr/gen_include_bytes_expr.rs new file mode 100644 index 000000000000..620437fe24db --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/IncludeBytesExpr/gen_include_bytes_expr.rs @@ -0,0 +1,6 @@ +// generated by codegen, do not edit + +fn test_include_bytes_expr() -> () { + // An expression produced by the built-in `include_bytes!` macro, embedding the contents of a file as a byte array. For example: + let data = include_bytes!("data.bin"); +} diff --git a/rust/ql/test/extractor-tests/generated/NotNull/MISSING_SOURCE.txt b/rust/ql/test/extractor-tests/generated/NotNull/MISSING_SOURCE.txt deleted file mode 100644 index 7f96b17b1f3c..000000000000 --- a/rust/ql/test/extractor-tests/generated/NotNull/MISSING_SOURCE.txt +++ /dev/null @@ -1,4 +0,0 @@ -// generated by codegen, do not edit - -After a source file is added in this directory and codegen is run again, test queries -will appear and this file will be deleted diff --git a/rust/ql/test/extractor-tests/generated/NotNull/NotNull.expected b/rust/ql/test/extractor-tests/generated/NotNull/NotNull.expected new file mode 100644 index 000000000000..4a34a62422e5 --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/NotNull/NotNull.expected @@ -0,0 +1 @@ +| gen_not_null.rs:5:54:5:58 | NotNull | diff --git a/rust/ql/test/extractor-tests/generated/NotNull/NotNull.ql b/rust/ql/test/extractor-tests/generated/NotNull/NotNull.ql new file mode 100644 index 000000000000..2c8a984917cd --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/NotNull/NotNull.ql @@ -0,0 +1,5 @@ +// generated by codegen, do not edit +import codeql.rust.elements +import TestUtils + +query predicate instances(NotNull x) { toBeTested(x) and not x.isUnknown() } diff --git a/rust/ql/test/extractor-tests/generated/NotNull/gen_not_null.rs b/rust/ql/test/extractor-tests/generated/NotNull/gen_not_null.rs new file mode 100644 index 000000000000..53ded4082f0a --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/NotNull/gen_not_null.rs @@ -0,0 +1,6 @@ +// generated by codegen, do not edit + +fn test_not_null() -> () { + // The `!null` pattern used in a pattern type to denote a non-null value. For example: + type NonNull = builtin#pattern_type(*const () is !null); +} diff --git a/rust/ql/test/extractor-tests/generated/PatternTypeRepr/MISSING_SOURCE.txt b/rust/ql/test/extractor-tests/generated/PatternTypeRepr/MISSING_SOURCE.txt deleted file mode 100644 index 7f96b17b1f3c..000000000000 --- a/rust/ql/test/extractor-tests/generated/PatternTypeRepr/MISSING_SOURCE.txt +++ /dev/null @@ -1,4 +0,0 @@ -// generated by codegen, do not edit - -After a source file is added in this directory and codegen is run again, test queries -will appear and this file will be deleted diff --git a/rust/ql/test/extractor-tests/generated/PatternTypeRepr/PatternTypeRepr.expected b/rust/ql/test/extractor-tests/generated/PatternTypeRepr/PatternTypeRepr.expected new file mode 100644 index 000000000000..02af4041097a --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/PatternTypeRepr/PatternTypeRepr.expected @@ -0,0 +1,6 @@ +instances +| gen_pattern_type_repr.rs:5:20:5:51 | PatternTypeRepr | +getPat +| gen_pattern_type_repr.rs:5:20:5:51 | PatternTypeRepr | gen_pattern_type_repr.rs:5:48:5:50 | RangePat | +getTypeRepr +| gen_pattern_type_repr.rs:5:20:5:51 | PatternTypeRepr | gen_pattern_type_repr.rs:5:41:5:43 | u32 | diff --git a/rust/ql/test/extractor-tests/generated/PatternTypeRepr/PatternTypeRepr.ql b/rust/ql/test/extractor-tests/generated/PatternTypeRepr/PatternTypeRepr.ql new file mode 100644 index 000000000000..eb0f19358068 --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/PatternTypeRepr/PatternTypeRepr.ql @@ -0,0 +1,13 @@ +// generated by codegen, do not edit +import codeql.rust.elements +import TestUtils + +query predicate instances(PatternTypeRepr x) { toBeTested(x) and not x.isUnknown() } + +query predicate getPat(PatternTypeRepr x, Pat getPat) { + toBeTested(x) and not x.isUnknown() and getPat = x.getPat() +} + +query predicate getTypeRepr(PatternTypeRepr x, TypeRepr getTypeRepr) { + toBeTested(x) and not x.isUnknown() and getTypeRepr = x.getTypeRepr() +} diff --git a/rust/ql/test/extractor-tests/generated/PatternTypeRepr/gen_pattern_type_repr.rs b/rust/ql/test/extractor-tests/generated/PatternTypeRepr/gen_pattern_type_repr.rs new file mode 100644 index 000000000000..c9d4704ce813 --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/PatternTypeRepr/gen_pattern_type_repr.rs @@ -0,0 +1,6 @@ +// generated by codegen, do not edit + +fn test_pattern_type_repr() -> () { + // A pattern type, constraining a type to values matching a pattern. For example: + type NonZero = builtin#pattern_type(u32 is 1..); +} diff --git a/rust/ql/test/extractor-tests/generated/VisibilityInner/MISSING_SOURCE.txt b/rust/ql/test/extractor-tests/generated/VisibilityInner/MISSING_SOURCE.txt deleted file mode 100644 index 7f96b17b1f3c..000000000000 --- a/rust/ql/test/extractor-tests/generated/VisibilityInner/MISSING_SOURCE.txt +++ /dev/null @@ -1,4 +0,0 @@ -// generated by codegen, do not edit - -After a source file is added in this directory and codegen is run again, test queries -will appear and this file will be deleted diff --git a/rust/ql/test/extractor-tests/generated/VisibilityInner/VisibilityInner.expected b/rust/ql/test/extractor-tests/generated/VisibilityInner/VisibilityInner.expected new file mode 100644 index 000000000000..c2de2f439823 --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/VisibilityInner/VisibilityInner.expected @@ -0,0 +1,4 @@ +instances +| gen_visibility_inner.rs:5:8:5:20 | VisibilityInner | +getPath +| gen_visibility_inner.rs:5:8:5:20 | VisibilityInner | gen_visibility_inner.rs:5:12:5:19 | ...::bar | diff --git a/rust/ql/test/extractor-tests/generated/VisibilityInner/VisibilityInner.ql b/rust/ql/test/extractor-tests/generated/VisibilityInner/VisibilityInner.ql new file mode 100644 index 000000000000..9bc1434fce57 --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/VisibilityInner/VisibilityInner.ql @@ -0,0 +1,9 @@ +// generated by codegen, do not edit +import codeql.rust.elements +import TestUtils + +query predicate instances(VisibilityInner x) { toBeTested(x) and not x.isUnknown() } + +query predicate getPath(VisibilityInner x, Path getPath) { + toBeTested(x) and not x.isUnknown() and getPath = x.getPath() +} diff --git a/rust/ql/test/extractor-tests/generated/VisibilityInner/gen_visibility_inner.rs b/rust/ql/test/extractor-tests/generated/VisibilityInner/gen_visibility_inner.rs new file mode 100644 index 000000000000..70dd4bad6820 --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/VisibilityInner/gen_visibility_inner.rs @@ -0,0 +1,7 @@ +// generated by codegen, do not edit + +fn test_visibility_inner() -> () { + // The parenthesized inner part of a visibility modifier or restriction, such as the `(in path)` in `pub(in path)`, or the `(crate)` in `pub(crate)`. For example the `(in foo::bar)` in: + pub(in foo::bar) struct S; + // ^^^^^^^^^^^^ +} diff --git a/rust/schema/annotations.py b/rust/schema/annotations.py index 10d7ec82a6cd..3a5627353505 100644 --- a/rust/schema/annotations.py +++ b/rust/schema/annotations.py @@ -1055,6 +1055,19 @@ class _: """ +@annotate(DerefPat, cfg=True) +class _: + """ + A deref pattern, matching the value behind a smart pointer. For example: + ```rust + match x { + builtin#deref(y) => y, + _ => 0, + }; + ``` + """ + + @annotate(DynTraitTypeRepr) class _: """ @@ -1280,6 +1293,13 @@ class _: """ +@annotate(ImplRestriction) +class _: + """ + An implementation restriction, limiting where a trait can be implemented. For example the `impl(crate)` restriction (an unstable feature). + """ + + @annotate(ImplTraitTypeRepr) class _: """ @@ -1293,6 +1313,16 @@ class _: """ +@annotate(IncludeBytesExpr, cfg=True) +class _: + """ + An expression produced by the built-in `include_bytes!` macro, embedding the contents of a file as a byte array. For example: + ```rust + let data = include_bytes!("data.bin"); + ``` + """ + + @annotate(InferTypeRepr) class _: """ @@ -1507,6 +1537,13 @@ class _: """ +@annotate(MutRestriction) +class _: + """ + A mutability restriction, limiting where a field can be mutated. For example the `mut(crate)` restriction (an unstable feature). + """ + + @annotate(Name, cfg=True) class _: """ @@ -1555,6 +1592,16 @@ class ParamBase(AstNode): type_repr: optional["TypeRepr"] | child +@annotate(NotNull, cfg=True) +class _: + """ + The `!null` pattern used in a pattern type to denote a non-null value. For example: + ```rust + type NonNull = builtin#pattern_type(*const () is !null); + ``` + """ + + @annotate(ParamBase, cfg=True) class _: pass @@ -1642,6 +1689,16 @@ class _: """ +@annotate(PatternTypeRepr) +class _: + """ + A pattern type, constraining a type to values matching a pattern. For example: + ```rust + type NonZero = builtin#pattern_type(u32 is 1..); + ``` + """ + + @annotate(PtrTypeRepr) class _: """ @@ -2150,6 +2207,17 @@ class _: """ +@annotate(VisibilityInner) +class _: + """ + The parenthesized inner part of a visibility modifier or restriction, such as the `(in path)` in `pub(in path)`, or the `(crate)` in `pub(crate)`. For example the `(in foo::bar)` in: + ```rust + pub(in foo::bar) struct S; + // ^^^^^^^^^^^^ + ``` + """ + + @annotate(WhereClause) class _: """ From 4f6ea2aafff8346dc8afe34f831a5aeaf96182a5 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 14 Aug 2026 13:10:35 +0200 Subject: [PATCH 0312/2098] Rust: document full re-vendoring after toolchain or rules_rust bump Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 890cb55d-0437-4bd7-9268-87b8897ada01 --- rust/README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/rust/README.md b/rust/README.md index 4fdbb0aedbdd..b17c9ff12eee 100644 --- a/rust/README.md +++ b/rust/README.md @@ -84,6 +84,11 @@ installing [`cargo-edit`](https://crates.io/crates/cargo-edit) with `cargo insta git add . git commit -am 'Bazel: regenerate vendored cargo dependencies' --no-verify ``` + > [!NOTE] + > If in step 6 you also bump `rules_rust` or the rust toolchain, those changes invalidate _all_ vendored files (including the + > Python ones under `misc/bazel/3rdparty/py_deps`), not just the tree-sitter ones. In that case run the umbrella script + > `misc/bazel/3rdparty/update_cargo_deps.sh` instead (it regenerates both `py_deps` and `tree_sitter_extractors_deps`, and runs + > `bazel mod tidy`), then commit all the regenerated files. 5. Run codegen ``` bazel run //rust/codegen @@ -100,6 +105,8 @@ installing [`cargo-edit`](https://crates.io/crates/cargo-edit) with `cargo insta independently of the changes in `codeql`. * in `codeql`, update both `RUST_VERSION` in `MODULE.bazel` _and_ `rust-toolchain.toml` files. You may want to also update the nightly toolchain in `rust/extractor/src/nightly-toolchain/rust-toolchain.toml` to a more recent date while you're at it. + * a toolchain and/or `rules_rust` bump invalidates the vendored files, so re-run `misc/bazel/3rdparty/update_cargo_deps.sh` + (see the note in step 4) and commit the regenerated files. * if it fails while compiling rust extractor code, you will need to adapt it to the new library version. * for example updating annotations in `annotations.py`, adding / removing generated tests. From 81f626a894c51ea5ff90225e5b73dfd699559dc8 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 14 Aug 2026 09:37:07 +0200 Subject: [PATCH 0313/2098] unified: Build a placeholder executable on windows This mirrors the approach taken by the original Swift extractor --- unified/BUILD.bazel | 7 ++++--- unified/extractor-unsupported-os/BUILD.bazel | 8 ++++++++ unified/extractor-unsupported-os/Cargo.toml | 6 ++++++ unified/extractor-unsupported-os/src/main.rs | 4 ++++ 4 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 unified/extractor-unsupported-os/BUILD.bazel create mode 100644 unified/extractor-unsupported-os/Cargo.toml create mode 100644 unified/extractor-unsupported-os/src/main.rs diff --git a/unified/BUILD.bazel b/unified/BUILD.bazel index 1539c7fd2f9d..c30dbbdeee58 100644 --- a/unified/BUILD.bazel +++ b/unified/BUILD.bazel @@ -41,9 +41,10 @@ codeql_pkg_files( codeql_pkg_files( name = "extractor-arch", - exes = [ - "//unified/extractor", - ] + select_os( + exes = select_os( + posix = ["//unified/extractor"], + windows = ["//unified/extractor-unsupported-os:extractor"], + ) + select_os( linux = ["//unified/swift-syntax-rs:swift_runtime_libs"], otherwise = [], ), diff --git a/unified/extractor-unsupported-os/BUILD.bazel b/unified/extractor-unsupported-os/BUILD.bazel new file mode 100644 index 000000000000..63ccae37bf45 --- /dev/null +++ b/unified/extractor-unsupported-os/BUILD.bazel @@ -0,0 +1,8 @@ +load("//misc/bazel:rust.bzl", "codeql_rust_binary") + +codeql_rust_binary( + name = "extractor", + srcs = ["src/main.rs"], + crate_root = "src/main.rs", + visibility = ["//visibility:public"], +) diff --git a/unified/extractor-unsupported-os/Cargo.toml b/unified/extractor-unsupported-os/Cargo.toml new file mode 100644 index 000000000000..da374ad31c6f --- /dev/null +++ b/unified/extractor-unsupported-os/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "codeql-extractor-unified-unsupported-os" +description = "Fallback executable for unsupported CodeQL Unified extractor platforms" +version = "0.1.0" +authors = ["GitHub"] +edition = "2024" diff --git a/unified/extractor-unsupported-os/src/main.rs b/unified/extractor-unsupported-os/src/main.rs new file mode 100644 index 000000000000..fa3705a9a68e --- /dev/null +++ b/unified/extractor-unsupported-os/src/main.rs @@ -0,0 +1,4 @@ +fn main() { + println!("Unsupported OS. Extraction is not currently supported on Windows."); + std::process::exit(1); +} From 508df7e7c6dca481de57146012ef4686b0246475 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 14 Aug 2026 13:38:14 +0200 Subject: [PATCH 0314/2098] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- unified/extractor-unsupported-os/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/extractor-unsupported-os/src/main.rs b/unified/extractor-unsupported-os/src/main.rs index fa3705a9a68e..a59217a2c09d 100644 --- a/unified/extractor-unsupported-os/src/main.rs +++ b/unified/extractor-unsupported-os/src/main.rs @@ -1,4 +1,4 @@ fn main() { - println!("Unsupported OS. Extraction is not currently supported on Windows."); + eprintln!("Unsupported OS. Extraction is not currently supported on Windows."); std::process::exit(1); } From ae78defe8f0159469f98059717efa0c7a08f0de4 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 14 Aug 2026 14:26:34 +0200 Subject: [PATCH 0315/2098] Rust: clarify QLDoc for experimental `DerefPat`, `NotNull`, and `PatternTypeRepr` These nodes represent experimental, mostly compiler-internal Rust features that cannot be written directly in stable Rust. The docs now say so and note that the examples use rust-analyzer's canonical `builtin#` syntax. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 890cb55d-0437-4bd7-9268-87b8897ada01 --- rust/ql/.generated.list | 22 +++++++++---------- .../internal/generated/CfgNodes.qll | 9 ++++++-- rust/ql/lib/codeql/rust/elements/DerefPat.qll | 4 +++- rust/ql/lib/codeql/rust/elements/NotNull.qll | 5 ++++- .../codeql/rust/elements/PatternTypeRepr.qll | 4 +++- .../rust/elements/internal/DerefPatImpl.qll | 4 +++- .../rust/elements/internal/NotNullImpl.qll | 5 ++++- .../elements/internal/PatternTypeReprImpl.qll | 4 +++- .../elements/internal/generated/DerefPat.qll | 4 +++- .../elements/internal/generated/NotNull.qll | 5 ++++- .../internal/generated/PatternTypeRepr.qll | 4 +++- .../rust/elements/internal/generated/Raw.qll | 13 ++++++++--- .../generated/.generated_tests.list | 6 ++--- .../generated/DerefPat/DerefPat.expected | 4 ++-- .../generated/DerefPat/gen_deref_pat.rs | 4 +++- .../generated/NotNull/NotNull.expected | 2 +- .../generated/NotNull/gen_not_null.rs | 5 ++++- .../PatternTypeRepr/PatternTypeRepr.expected | 6 ++--- .../PatternTypeRepr/gen_pattern_type_repr.rs | 4 +++- rust/schema/annotations.py | 13 ++++++++--- 20 files changed, 87 insertions(+), 40 deletions(-) diff --git a/rust/ql/.generated.list b/rust/ql/.generated.list index 6f00390186b9..f20ab6f03369 100644 --- a/rust/ql/.generated.list +++ b/rust/ql/.generated.list @@ -1,4 +1,4 @@ -lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll 1eaae0657801b46ecca66527d95959891b3dea5b7487dc98844e03043adf6e7f 56d999c0ab5d99ef8a41c022ec59c98f670b42b9d90c73e830f1fb32a9a50acf +lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll 857dacbebd4fdb6415a9a246bdde13cba90b17e9c157c5c9a2a88b71d4739fa9 31f81e4432c9a494d44e93694da81305e05c9b9d7a7284b7c9b159d32debf47a lib/codeql/rust/elements/Abi.qll 485a2e79f6f7bfd1c02a6e795a71e62dede3c3e150149d5f8f18b761253b7208 6159ba175e7ead0dd2e3f2788f49516c306ee11b1a443bd4bdc00b7017d559bd lib/codeql/rust/elements/Addressable.qll 13011bfd2e1556694c3d440cc34af8527da4df49ad92b62f2939d3699ff2cea5 ddb25935f7553a1a384b1abe2e4b4fa90ab50b952dadec32fd867afcb054f4be lib/codeql/rust/elements/ArgList.qll 3d2f6f5542340b80a4c6e944ac17aba0d00727588bb66e501453ac0f80c82f83 afd52700bf5a337f19827846667cd0fb1fea5abbbcbc353828e292a727ea58c9 @@ -47,7 +47,7 @@ lib/codeql/rust/elements/ConstBlockPat.qll a25f42b84dbeb33e10955735ef53b8bb7e325 lib/codeql/rust/elements/ConstParam.qll 87776586f7ff562ff3c71373f45cf70486f9a832613a0aaac943311c451cc057 67a31616688106d5130951f2162e5229bff0fde08ff647943663cac427d7048b lib/codeql/rust/elements/ContinueExpr.qll 9f27c5d5c819ad0ebc5bd10967ba8d33a9dc95b9aae278fcfb1fcf9216bda79c 0dc061445a6b89854fdce92aaf022fdc76b724511a50bb777496ce75c9ecb262 lib/codeql/rust/elements/Crate.qll 1426960e6f36195e42ea5ea321405c1a72fccd40cd6c0a33673c321c20302d8d 1571a89f89dab43c5291b71386de7aadf52730755ba10f9d696db9ad2f760aff -lib/codeql/rust/elements/DerefPat.qll 47bcf75cba839dbd7d1e28da9394bd656c0cf488c0ee8a6cd86c361d0e3d838f 6cab387609121532647b4862653237d08309fbc0ded330933316024ecec0c872 +lib/codeql/rust/elements/DerefPat.qll 0ec42df5cf3b08931a0fab900e9a2196fa3a1a742c15b9af743fd952cdca2fe9 3022254ed99abde37ecf0a1678b12534740b58f1bb1b68c6e823fcaa57fde579 lib/codeql/rust/elements/DynTraitTypeRepr.qll e4d27112d27ae93c621defd2c976fd4e90663ab7f6115e83ae4fe8106cb5e015 eb9fde89698588f3b7116f62388c54e937f99559b22c93d11a5596e754560072 lib/codeql/rust/elements/Element.qll 0b62d139fef54ed2cf2e2334806aa9bfbc036c9c2085d558f15a42cc3fa84c48 24b999b93df79383ef27ede46e38da752868c88a07fe35fcff5d526684ba7294 lib/codeql/rust/elements/Enum.qll 13c1a3bddfff6c9cc644902652883aefc7721bc94bd8084a1a49acc156996d12 17a898434329437479de4fef27ce11f5996b1953168066bd6d51f93594cc79d1 @@ -116,7 +116,7 @@ lib/codeql/rust/elements/MutRestriction.qll b018f04a3960b91bbc8fcc2fbb7a25c359eb lib/codeql/rust/elements/Name.qll af41479d4260fe931d46154dda15484e4733c952b98f0e370106e6e9e8ce398b e188a0d0309dd1b684c0cb88df435b38e306eb94d6b66a2b748e75252f15e095 lib/codeql/rust/elements/NameRef.qll 587308f2276853303fd5e8804fad255e200fdbb115c4abf7635435856884e254 6cb64e921d2dde8fc87cb26b6539254b883a7313689798180791a2905eb3f418 lib/codeql/rust/elements/NeverTypeRepr.qll e523e284b9becb3d55e2f322f4497428bfa307c904745878545695a73d7e3a52 4af09ebae3348ba581b59f1b5fa4c45defc8fa785622719fa98ebefee2396367 -lib/codeql/rust/elements/NotNull.qll ea17a443fca46533be304d5e45e24c157314f0a512ffd2f25dfff8d024d33755 1e7707622d02b0ff4c023e8e942880041fe495b3f7de766858173e97034f1d33 +lib/codeql/rust/elements/NotNull.qll f1aaa23ac86ff3418b61ebf2c69ee30c0351c725be241f38de8b9e0a42b2c1dc 40f29691234c3722183744c5336e0645b9005388284a605458e19aeeed99877b lib/codeql/rust/elements/OffsetOfExpr.qll 370734a01c72364c9d6a904597190dac99dc1262631229732c8687fd1b3e2aa0 e222d2688aa18ed6eec04f2f6ac1537f5c7467d2cef878122e8fc158d4f6f99e lib/codeql/rust/elements/OrPat.qll 408b71f51edbfc79bf93b86fb058d01fa79caf2ebfeef37b50ae1da886c71b68 4a3f2b00db33fe26ee0859e35261016312cb491e23c46746cdd6d8bb1f6c88ef lib/codeql/rust/elements/Param.qll d0c0a427c003bbbacaeb0c2f4566f35b997ad0bca4d49f97b50c3a4bd1ddbd71 e654a17dfcb7aaeb589e7944c38f591c4cf922ebceb834071bcb9f9165ee48be @@ -135,7 +135,7 @@ lib/codeql/rust/elements/PathMeta.qll 56021df592b69c9c735db2ebe2b14ee5b5e0a76546 lib/codeql/rust/elements/PathPat.qll a7069d1dd77ba66814d6c84e135ed2975d7fcf379624079e6a76dc44b5de832e 2294d524b65ab0d038094b2a00f73feb8ab70c8f49fb4d91e9d390073205631d lib/codeql/rust/elements/PathSegment.qll c54e9d03fc76f3b21c0cfe719617d03d2a172a47c8f884a259566dd6c63d23f2 4995473961f723239b8ac52804aeb373ef2ac26df0f3719c4ca67858039f2132 lib/codeql/rust/elements/PathTypeRepr.qll 1b68e119ac82fdf5f421ded88a1739bfb8009c61e2745be11b34c3a025de18aa 48d9b49ee871f3932a0806709b4a21dadfdbe5cef8bab8d71aab69b6e4e7b432 -lib/codeql/rust/elements/PatternTypeRepr.qll c97e739ceb7256d1477deb660f6d18a3f5602583911c94311eeee48efe58db2a bfcaca8cbd256ee7b3d715302a291e2c64ae7b260801042f9e7351d9acd497fb +lib/codeql/rust/elements/PatternTypeRepr.qll 719a26a7b7e40bf6d336a68e93a5a84efb9a87341d96472ba9599555aa7a92a0 3f1d6f860466463dcfe09fb233c9ba4319b3ccb0d45097bd0280c9ceb4f2dbfe lib/codeql/rust/elements/PrefixExpr.qll 107e7bd111b637fd6d76026062d54c2780760b965f172ef119c50dd0714a377d 46954a9404e561c51682395729daac3bda5442113f29839d043e9605d63f7f6d lib/codeql/rust/elements/PtrTypeRepr.qll 91a3816030ee8e8aae19759589b1b212a09e931b2858a0fef5a3a23f1fb5e342 db7371e63d9cb8b394c5438f4e8c80c1149ca45335ce3a46e6d564ed0cf3938a lib/codeql/rust/elements/RangeExpr.qll 43785bea08a6a537010db1138e68ae92eed7e481744188dfb3bad119425ff740 5e81cfbdf4617372a73d662a248a0b380c1f40988a5daefb7f00057cae10d3d4 @@ -273,7 +273,7 @@ lib/codeql/rust/elements/internal/ConstParamImpl.qll c6995be58f84d1df65897c80f7e lib/codeql/rust/elements/internal/ContinueExprConstructor.qll cd93f1b35ccdb031d7e8deba92f6a76187f6009c454f3ea07e89ba459de57ca6 6f658e7d580c4c9068b01d6dd6f72888b8800860668a6653f8c3b27dc9996935 lib/codeql/rust/elements/internal/CrateConstructor.qll 2a3710ed6ff4ffdbc773ac16e2cf176415be8908e1d59fd0702bdeddbae096f4 f75a069b0ef71e54089001eb3a34b8a9e4ce8e4f65ffa71b669b38cf86e0af40 lib/codeql/rust/elements/internal/DerefPatConstructor.qll a92a1e9b310a7dc92f31952b08c264cbd57265a5c619ff1abecf739ed4f6525f f86e26668b88baa571ca7521782141ce92f816ec366024c21c953bc335482c10 -lib/codeql/rust/elements/internal/DerefPatImpl.qll 625e36abce14f22d860538478db629bdcc3f0fb04984d37ea9a2e40b39725451 f505327aa67eb4cacf0bde672b37a42f3ddcc51510613a8c3a44fd55151d7570 +lib/codeql/rust/elements/internal/DerefPatImpl.qll b43a939e3d373b411fe7b8b2b8192f6cb58860fd806aaa83f20b7e2be06c7e63 21b433843baa1aef9d5a67bd4cfcfbbb08a64a1e8d31ab254ecdc2ef1f1854c0 lib/codeql/rust/elements/internal/DynTraitTypeReprConstructor.qll 6964e6c80fb7f5e283c1d15562cef18ed097452b7fcbc04eff780c7646675c7a f03c4830bf1b958fdfb6563136fa21c911b2e41ce1d1caee14ec572c7232866d lib/codeql/rust/elements/internal/EnumConstructor.qll eca1a13937faacb1db50e4cf69d175f992f2204a5aaed9144bb6f3cb63814ac5 1bafba78b2729fdb052a25a1ba3f4f70871564aa4df632b4a1d467858a437924 lib/codeql/rust/elements/internal/ExprImpl.qll ab20ee174e2e786f34af6e5dedf3ec071bb89fc266b3e91df6377f72aa38d3f2 f68192700f449bf1c229cfbaabd5353c7c559941c915d5a0c88752cf9844194b @@ -363,7 +363,7 @@ lib/codeql/rust/elements/internal/NamedCrateConstructor.qll 72e07ece16f787dfd993 lib/codeql/rust/elements/internal/NamedCrateImpl.qll ba1f775ca6177a5bdb2ef1891a3fd505642e2fec63910f958f380039499f45bf f66b503b3574d3be75b79870b754015740f58195c4924b71c21ba4e673efd8c4 lib/codeql/rust/elements/internal/NeverTypeReprConstructor.qll 2e0a9c75e389e9ef41a18dd9b5d6c29ffe1d1d633e51ef1de90ec553236d201a 61ea87802fd1c3a68e864ccd76657253a228b06471e4c55bcf94ca2be554f866 lib/codeql/rust/elements/internal/NotNullConstructor.qll 40e9254021ce7f09861c8d4ac70c3595953e8ade756a3da039d99a638fe8f0f3 3264d3ba76e04cdee673ae38dd3fcd7660978dc17d86c9b8f062bd0fbf3e5d3e -lib/codeql/rust/elements/internal/NotNullImpl.qll c60f45e552e4bbe5f51f138f7e008b7a50b7a85b92e6562eb0a68a6fb1f82f04 907e3ef130c032ba4cc39efbd49a9ea92a5b1c5c15c55db229b8b9583bdd4a28 +lib/codeql/rust/elements/internal/NotNullImpl.qll d76de5a4967440f52b2b968bae371d7e3aa11b98a38e7de0591720346e70224c 667b432d8500db42c56653b329ef80c7d3079f24efa360528d438c9dff5c9507 lib/codeql/rust/elements/internal/OffsetOfExprConstructor.qll 616e146562adb3ac0fba4d6f55dd6ce60518ed377c0856f1f09ba49593e7bfab 80518ce90fc6d08011d6f5fc2a543958067739e1b0a6a5f2ed90fc9b1db078f0 lib/codeql/rust/elements/internal/OffsetOfExprImpl.qll e52d4596068cc54719438121f7d5afcaab04e0c70168ac5e4df1a3a0969817a6 6ab37e659d79e02fb2685d6802ae124157bf14b6f790b31688f437c87f40f52c lib/codeql/rust/elements/internal/OrPatConstructor.qll 4ef583e07298487c0c4c6d7c76ffcc04b1e5fe58aba0c1da3e2c8446a9e0c92b 980a6bd176ae5e5b11c134569910c5468ba91f480982d846e222d031a6a05f1a @@ -384,7 +384,7 @@ lib/codeql/rust/elements/internal/PathPatConstructor.qll 966c4ea22218ef71e000d7c lib/codeql/rust/elements/internal/PathSegmentConstructor.qll 2d9639e42035dc7e73b7d6ddb8a977beadc6b4492dee4292b2f85b4409344441 c337fc3b9ef56366428772563e3f25f711474d16e860d3e89c1395a95d9e83e7 lib/codeql/rust/elements/internal/PathTypeReprConstructor.qll e05e7be13d48e7f832e735254777692d4be827a745b1fd94b9649d46fe574393 4aa1e6935a4479b61f205265cbbba01ce96d09a680c20d5decf30d1374d484d4 lib/codeql/rust/elements/internal/PatternTypeReprConstructor.qll cf17aaca86534afe86518f1dc2fdbf548fc0e9bf241d1e698a94940ce875d1f2 5799da5538796765846bcf09391ec2388cc96fdc6fea60819301ab6387d5d146 -lib/codeql/rust/elements/internal/PatternTypeReprImpl.qll f42a964f149dfd5ebea31f310e220ed89635efe4c0940e0a17f23aa893c84167 c6ce7a83418360cd98f410e6406d26b65721dad0ea0c9fd33307439cf392af1a +lib/codeql/rust/elements/internal/PatternTypeReprImpl.qll 38052ab7f6f18d73556644291546d1f58709c2e44c7fdbcb259a4e5102bc1a08 f63d6fb495a1cad07ae55de210e766fdf15f011de4d8b7b2e8124d556287db26 lib/codeql/rust/elements/internal/PrefixExprConstructor.qll 90c50b0df2d4b4cbf5e2b7d67a9d243a1af9bfff660b7a70d8b9c7859c28bca7 1a1b5ea1f06ed8d41a658c872e8e1915c241a7c799c691df81b9a7b55d8f2f1e lib/codeql/rust/elements/internal/PtrTypeReprConstructor.qll c8bd3502dc23429577fbff0fe3e3c78b812b2237b2bb65862c137083fdaa7a4a 4d5c135be30f71a3712acbc22bdb6c425fa6463043a9ee64543da31151d68366 lib/codeql/rust/elements/internal/PtrTypeReprImpl.qll cb3cf7960a05f2c1930067fc62c5a207fc5faac143758b9b9e5f117fbd073f2f 40545d4768380f0dde9b708932f92f57566ac49f3f9b4147a8ff2ea90a0947c7 @@ -532,7 +532,7 @@ lib/codeql/rust/elements/internal/generated/ConstBlockPat.qll 7526d83ee9565d7477 lib/codeql/rust/elements/internal/generated/ConstParam.qll 2e24198f636e4932c79f28c324f395ae5f61f713795ed4543e920913898e2815 5abe6d3df395c679c28a7720479bad455c53bc5ade9133f1ff113ea54dc66c11 lib/codeql/rust/elements/internal/generated/ContinueExpr.qll e2010feb14fb6edeb83a991d9357e50edb770172ddfde2e8670b0d3e68169f28 48d09d661e1443002f6d22b8710e22c9c36d9daa9cde09c6366a61e960d717cb lib/codeql/rust/elements/internal/generated/Crate.qll 37f3760d7c0c1c3ca809d07daf7215a8eae6053eda05e88ed7db6e07f4db0781 649a3d7cd7ee99f95f8a4d3d3c41ea2fa848ce7d8415ccbac62977dfc9a49d35 -lib/codeql/rust/elements/internal/generated/DerefPat.qll ede71df1a31b5705fa7acccee0a744d9755a15e31f5362a43de4116e74fa271a 59f67b5d51b1401d34020a3d97f4fd4e1f9d996aa8f862c01e519fe84df86c0d +lib/codeql/rust/elements/internal/generated/DerefPat.qll fba6bfa4be64247c5d2786d9a65e660498c81a08f1e14cac7347f87fa9d0dfe9 e4cc0922c30a498e6cd4e0eee7a76be4d5a2abaa5a6676cf942823ec7be1d2b8 lib/codeql/rust/elements/internal/generated/DynTraitTypeRepr.qll b2e0e728b6708923b862d9d8d6104d13f572da17e393ec1485b8465e4bfdc206 4a87ea9669c55c4905ce4e781b680f674989591b0cb56af1e9fa1058c13300b3 lib/codeql/rust/elements/internal/generated/Element.qll d56d22c060fa929464f837b1e16475a4a2a2e42d68235a014f7369bcb48431db 0e48426ca72179f675ac29aa49bbaadb8b1d27b08ad5cbc72ec5a005c291848e lib/codeql/rust/elements/internal/generated/Enum.qll 3ed69005ab7cf68745a67cc9891bd68a83f6ab927febf077de9e4092cb373b0b 604fd03d1c46884b3c93e5bff3951ec41593320e1f7382c1a7143a64063827bc @@ -603,7 +603,7 @@ lib/codeql/rust/elements/internal/generated/Name.qll e6bd6240a051383a52b21ab539b lib/codeql/rust/elements/internal/generated/NameRef.qll 090c15ed6c44fc4f1a7236215f42e16921912d3030119ac22bc7ffe2dcdb4ba8 b61cc486e6764272c4e8377523bf043d0beae4926606dbcb48f8205c6a0b9a90 lib/codeql/rust/elements/internal/generated/NamedCrate.qll e190dd742751ea2de914d0750c93fcad3100d3ebb4e3f47f6adc0a7fa3e7932c 755ead62328df8a4496dc4ad6fea7243ab6144138ed62d7368fa53737eef5819 lib/codeql/rust/elements/internal/generated/NeverTypeRepr.qll 4f13c6e850814a4759fdb5fca83a50e4094c27edee4d2e74fe209b10d8fb01c3 231f39610e56f68f48c70ca8a17a6f447458e83218e529fff147ed039516a2f7 -lib/codeql/rust/elements/internal/generated/NotNull.qll b9361e42f9fe5893111cf9963fcd9428de27a94f261bdd2722fdd81b0d1118ea 4281887babd70011584c761eeb38d325813b01d766d96e7965861e9a0df18ba6 +lib/codeql/rust/elements/internal/generated/NotNull.qll 437dd90a15cc2518f26489d4251fc0de31646e7735a3463ec51983f39a33c3b6 78b1051f7ec1d82c36b5c825c4b9c3c2b8ad9563542e5e4b7d2f0292455fb74a lib/codeql/rust/elements/internal/generated/OffsetOfExpr.qll c86eecd11345a807571542e220ced8ccc8bb78f81de61fff6fc6b23ff379cd12 76a692d3ad5e26751e574c7d9b13cf698d471e1783f53a312e808c0b21a110ab lib/codeql/rust/elements/internal/generated/OrPat.qll 0dc6bd6ada8d11b7f708f71c8208fc2c28629e9c265c3df3c2dc9bea30de5afa 892119fc1de2e3315489203c56ee3ed3df8b9806e927ee58aa6083e5b2156dab lib/codeql/rust/elements/internal/generated/Param.qll 19f03396897c1b7b494df2d0e9677c1a2fc6d4ae190e64e5be51145aba9de2e2 3d63116e70457226ea7488a9f6ed9c7cea3233b0e5cab443db9566c17b125e80 @@ -623,13 +623,13 @@ lib/codeql/rust/elements/internal/generated/PathMeta.qll 42cf084a78acb656a86a6a9 lib/codeql/rust/elements/internal/generated/PathPat.qll 003d10a4d18681da67c7b20fcb16b15047cf9cc4b1723e7674ef74e40589cc5a 955e66f6d317ca5562ad1b5b13e1cd230c29e2538b8e86f072795b0fdd8a1c66 lib/codeql/rust/elements/internal/generated/PathSegment.qll 48b452229b644ea323460cd44e258d3ea8482b3e8b4cb14c3b1df581da004fa8 2025badcfab385756009a499e08eecc8ffd7fa590cd2b777adb283eebcc432c6 lib/codeql/rust/elements/internal/generated/PathTypeRepr.qll f12fe234d7fb1a12678b524434fcdd801453d90eb778b9173f7197ff3d957557 a1be605f8937c5bd3a3a9cb277782c24446c9f5ef8363e6f5ee8f6229886b6f6 -lib/codeql/rust/elements/internal/generated/PatternTypeRepr.qll 82c272b58b4ce09827fcca35dd62d520b724d95b458c7aef139b0535c90a25b2 2b3636e0683236c8ba112e58d04e87095c693c277125ac747fb7a8b6b53c5435 +lib/codeql/rust/elements/internal/generated/PatternTypeRepr.qll 081f81ecb630be1a437711c028887f8e2aee017a8dd76c5ae4dac4e04b319b0b 5a4125625847271a7cbc5af4a0cb85040af768600ff762fa53c56d3fdbb99730 lib/codeql/rust/elements/internal/generated/PrefixExpr.qll c9ede5f2deb7b41bc8240969e8554f645057018fe96e7e9ad9c2924c8b14722b 5ae2e3c3dc8fa73e7026ef6534185afa6b0b5051804435d8b741dd3640c864e1 lib/codeql/rust/elements/internal/generated/PtrTypeRepr.qll 8d0ea4f6c7f8203340bf4b91ecedad3ed217a65d8be48d498f2e12da7687a6d0 6f74182fd3fe8099af31b55edeaacc0c54637d0a29736f15d2cd58d11d3de260 lib/codeql/rust/elements/internal/generated/PureSynthConstructors.qll e5b8e69519012bbaae29dcb82d53f7f7ecce368c0358ec27ef6180b228a0057f e5b8e69519012bbaae29dcb82d53f7f7ecce368c0358ec27ef6180b228a0057f lib/codeql/rust/elements/internal/generated/RangeExpr.qll 23cca03bf43535f33b22a38894f70d669787be4e4f5b8fe5c8f7b964d30e9027 18624cef6c6b679eeace2a98737e472432e0ead354cca02192b4d45330f047c9 lib/codeql/rust/elements/internal/generated/RangePat.qll 80826a6a6868a803aa2372e31c52a03e1811a3f1f2abdb469f91ca0bfdd9ecb6 34ee1e208c1690cba505dff2c588837c0cd91e185e2a87d1fe673191962276a9 -lib/codeql/rust/elements/internal/generated/Raw.qll 51e33791c782b2356edc70f29d0f8255f8472790b0b7a98aefcba14d65e7abe3 dfa4ac50c11c936f2abcdad8d753c926414ae8aeec78cfbba6a2c7f99c2397eb +lib/codeql/rust/elements/internal/generated/Raw.qll b797442c8c4ef094437c7e20c2d580a96b272ea6752a496213c8caaf72cabe6a 433002df28dc5ffae8485ddd0bac85e47587e088e730f5ccf34152eceb4d325c lib/codeql/rust/elements/internal/generated/RefExpr.qll 7d995884e3dc1c25fc719f5d7253179344d63650e217e9ff6530285fe7a57f64 f2c3c12551deea4964b66553fb9b6423ee16fec53bd63db4796191aa60dc6c66 lib/codeql/rust/elements/internal/generated/RefPat.qll 456ede39837463ee22a630ec7ab6c8630d3664a8ea206fcc6e4f199e92fa564c 5622062765f32930465ba6b170e986706f159f6070f48adee3c20e24e8df4e05 lib/codeql/rust/elements/internal/generated/RefTypeRepr.qll 5b0663a6d234572fb3e467e276d019415caa95ef006438cc59b7af4e1783161e 0e27c8a8f0e323c0e4d6db01fca821bf07c0864d293cdf96fa891b10820c1e4b diff --git a/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll b/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll index b5ddb6dc1776..3f09a822a44c 100644 --- a/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll +++ b/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll @@ -883,7 +883,9 @@ module MakeCfgNodes Input> { } /** - * A deref pattern, matching the value behind a smart pointer. For example: + * A deref pattern, matching the value behind a smart pointer. This is an experimental + * Rust feature that cannot be written directly in stable Rust; the example below uses + * rust-analyzer's canonical `builtin#deref` syntax for such patterns: * ```rust * match x { * builtin#deref(y) => y, @@ -2160,7 +2162,10 @@ module MakeCfgNodes Input> { } /** - * The `!null` pattern used in a pattern type to denote a non-null value. For example: + * The `!null` pattern used in a pattern type to denote a non-null value. Pattern types + * are an experimental, mostly compiler-internal feature (used in the standard library for + * types such as `NonZero` and `NonNull`) and cannot be written directly in stable Rust; + * the example below uses rust-analyzer's canonical `builtin#pattern_type` syntax: * ```rust * type NonNull = builtin#pattern_type(*const () is !null); * ``` diff --git a/rust/ql/lib/codeql/rust/elements/DerefPat.qll b/rust/ql/lib/codeql/rust/elements/DerefPat.qll index 63b822cb5ef2..ba4364e92962 100644 --- a/rust/ql/lib/codeql/rust/elements/DerefPat.qll +++ b/rust/ql/lib/codeql/rust/elements/DerefPat.qll @@ -7,7 +7,9 @@ private import internal.DerefPatImpl import codeql.rust.elements.Pat /** - * A deref pattern, matching the value behind a smart pointer. For example: + * A deref pattern, matching the value behind a smart pointer. This is an experimental + * Rust feature that cannot be written directly in stable Rust; the example below uses + * rust-analyzer's canonical `builtin#deref` syntax for such patterns: * ```rust * match x { * builtin#deref(y) => y, diff --git a/rust/ql/lib/codeql/rust/elements/NotNull.qll b/rust/ql/lib/codeql/rust/elements/NotNull.qll index 3966fb24dfa7..62489c2da7b3 100644 --- a/rust/ql/lib/codeql/rust/elements/NotNull.qll +++ b/rust/ql/lib/codeql/rust/elements/NotNull.qll @@ -7,7 +7,10 @@ private import internal.NotNullImpl import codeql.rust.elements.Pat /** - * The `!null` pattern used in a pattern type to denote a non-null value. For example: + * The `!null` pattern used in a pattern type to denote a non-null value. Pattern types + * are an experimental, mostly compiler-internal feature (used in the standard library for + * types such as `NonZero` and `NonNull`) and cannot be written directly in stable Rust; + * the example below uses rust-analyzer's canonical `builtin#pattern_type` syntax: * ```rust * type NonNull = builtin#pattern_type(*const () is !null); * ``` diff --git a/rust/ql/lib/codeql/rust/elements/PatternTypeRepr.qll b/rust/ql/lib/codeql/rust/elements/PatternTypeRepr.qll index 9155fdb97c66..c54b6b806af8 100644 --- a/rust/ql/lib/codeql/rust/elements/PatternTypeRepr.qll +++ b/rust/ql/lib/codeql/rust/elements/PatternTypeRepr.qll @@ -8,7 +8,9 @@ import codeql.rust.elements.Pat import codeql.rust.elements.TypeRepr /** - * A pattern type, constraining a type to values matching a pattern. For example: + * A pattern type, constraining a type to values matching a pattern. Pattern types are an + * experimental, mostly compiler-internal feature and cannot be written directly in stable + * Rust; the example below uses rust-analyzer's canonical `builtin#pattern_type` syntax: * ```rust * type NonZero = builtin#pattern_type(u32 is 1..); * ``` diff --git a/rust/ql/lib/codeql/rust/elements/internal/DerefPatImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/DerefPatImpl.qll index b7c627c881a4..ec44a20c2b5e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/DerefPatImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/DerefPatImpl.qll @@ -13,7 +13,9 @@ private import codeql.rust.elements.internal.generated.DerefPat */ module Impl { /** - * A deref pattern, matching the value behind a smart pointer. For example: + * A deref pattern, matching the value behind a smart pointer. This is an experimental + * Rust feature that cannot be written directly in stable Rust; the example below uses + * rust-analyzer's canonical `builtin#deref` syntax for such patterns: * ```rust * match x { * builtin#deref(y) => y, diff --git a/rust/ql/lib/codeql/rust/elements/internal/NotNullImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/NotNullImpl.qll index 268e2239a221..19365f23a2d5 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/NotNullImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/NotNullImpl.qll @@ -13,7 +13,10 @@ private import codeql.rust.elements.internal.generated.NotNull */ module Impl { /** - * The `!null` pattern used in a pattern type to denote a non-null value. For example: + * The `!null` pattern used in a pattern type to denote a non-null value. Pattern types + * are an experimental, mostly compiler-internal feature (used in the standard library for + * types such as `NonZero` and `NonNull`) and cannot be written directly in stable Rust; + * the example below uses rust-analyzer's canonical `builtin#pattern_type` syntax: * ```rust * type NonNull = builtin#pattern_type(*const () is !null); * ``` diff --git a/rust/ql/lib/codeql/rust/elements/internal/PatternTypeReprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/PatternTypeReprImpl.qll index 7e9d6b7f38ea..16cb9358ebae 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/PatternTypeReprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/PatternTypeReprImpl.qll @@ -13,7 +13,9 @@ private import codeql.rust.elements.internal.generated.PatternTypeRepr */ module Impl { /** - * A pattern type, constraining a type to values matching a pattern. For example: + * A pattern type, constraining a type to values matching a pattern. Pattern types are an + * experimental, mostly compiler-internal feature and cannot be written directly in stable + * Rust; the example below uses rust-analyzer's canonical `builtin#pattern_type` syntax: * ```rust * type NonZero = builtin#pattern_type(u32 is 1..); * ``` diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/DerefPat.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/DerefPat.qll index afeb873e50cd..abf59274933b 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/DerefPat.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/DerefPat.qll @@ -15,7 +15,9 @@ import codeql.rust.elements.internal.PatImpl::Impl as PatImpl */ module Generated { /** - * A deref pattern, matching the value behind a smart pointer. For example: + * A deref pattern, matching the value behind a smart pointer. This is an experimental + * Rust feature that cannot be written directly in stable Rust; the example below uses + * rust-analyzer's canonical `builtin#deref` syntax for such patterns: * ```rust * match x { * builtin#deref(y) => y, diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/NotNull.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/NotNull.qll index 25922bf9284f..0748f287a6eb 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/NotNull.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/NotNull.qll @@ -14,7 +14,10 @@ import codeql.rust.elements.internal.PatImpl::Impl as PatImpl */ module Generated { /** - * The `!null` pattern used in a pattern type to denote a non-null value. For example: + * The `!null` pattern used in a pattern type to denote a non-null value. Pattern types + * are an experimental, mostly compiler-internal feature (used in the standard library for + * types such as `NonZero` and `NonNull`) and cannot be written directly in stable Rust; + * the example below uses rust-analyzer's canonical `builtin#pattern_type` syntax: * ```rust * type NonNull = builtin#pattern_type(*const () is !null); * ``` diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/PatternTypeRepr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/PatternTypeRepr.qll index 4a02180ede73..9081b0642797 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/PatternTypeRepr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/PatternTypeRepr.qll @@ -16,7 +16,9 @@ import codeql.rust.elements.internal.TypeReprImpl::Impl as TypeReprImpl */ module Generated { /** - * A pattern type, constraining a type to values matching a pattern. For example: + * A pattern type, constraining a type to values matching a pattern. Pattern types are an + * experimental, mostly compiler-internal feature and cannot be written directly in stable + * Rust; the example below uses rust-analyzer's canonical `builtin#pattern_type` syntax: * ```rust * type NonZero = builtin#pattern_type(u32 is 1..); * ``` diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll index a851aad952be..d1b744dde198 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll @@ -3582,7 +3582,9 @@ module Raw { /** * INTERNAL: Do not use. - * A deref pattern, matching the value behind a smart pointer. For example: + * A deref pattern, matching the value behind a smart pointer. This is an experimental + * Rust feature that cannot be written directly in stable Rust; the example below uses + * rust-analyzer's canonical `builtin#deref` syntax for such patterns: * ```rust * match x { * builtin#deref(y) => y, @@ -4759,7 +4761,10 @@ module Raw { /** * INTERNAL: Do not use. - * The `!null` pattern used in a pattern type to denote a non-null value. For example: + * The `!null` pattern used in a pattern type to denote a non-null value. Pattern types + * are an experimental, mostly compiler-internal feature (used in the standard library for + * types such as `NonZero` and `NonNull`) and cannot be written directly in stable Rust; + * the example below uses rust-analyzer's canonical `builtin#pattern_type` syntax: * ```rust * type NonNull = builtin#pattern_type(*const () is !null); * ``` @@ -5087,7 +5092,9 @@ module Raw { /** * INTERNAL: Do not use. - * A pattern type, constraining a type to values matching a pattern. For example: + * A pattern type, constraining a type to values matching a pattern. Pattern types are an + * experimental, mostly compiler-internal feature and cannot be written directly in stable + * Rust; the example below uses rust-analyzer's canonical `builtin#pattern_type` syntax: * ```rust * type NonZero = builtin#pattern_type(u32 is 1..); * ``` diff --git a/rust/ql/test/extractor-tests/generated/.generated_tests.list b/rust/ql/test/extractor-tests/generated/.generated_tests.list index 7bb5c7f961d1..5461e89bf465 100644 --- a/rust/ql/test/extractor-tests/generated/.generated_tests.list +++ b/rust/ql/test/extractor-tests/generated/.generated_tests.list @@ -32,7 +32,7 @@ ConstArg/gen_const_arg.rs 6a15d099c61ffa814e8e0e0fca2d8ff481d73ad81959064e0a214d ConstBlockPat/gen_const_block_pat.rs 7e3057cd24d22e752354369cf7e08e9536642812c0947b36aa5d8290a45476fd 7e3057cd24d22e752354369cf7e08e9536642812c0947b36aa5d8290a45476fd ConstParam/gen_const_param.rs 71f22d907b0011dafc333f37635f0ee5b1eef2313b5a26cd2a21508a8e96c19a 71f22d907b0011dafc333f37635f0ee5b1eef2313b5a26cd2a21508a8e96c19a ContinueExpr/gen_continue_expr.rs 63840dcd8440aaf1b96b713b80eb2b56acb1639d3200b3c732b45291a071b5ff 63840dcd8440aaf1b96b713b80eb2b56acb1639d3200b3c732b45291a071b5ff -DerefPat/gen_deref_pat.rs ad842fb169f7e8774ab0adc67d5d8a29f181ea8992874d5715f53080c5c039e8 ad842fb169f7e8774ab0adc67d5d8a29f181ea8992874d5715f53080c5c039e8 +DerefPat/gen_deref_pat.rs a9452902f0913a52d4d19abe37d510086897032d5da2517a4e3f75a478f5f77a a9452902f0913a52d4d19abe37d510086897032d5da2517a4e3f75a478f5f77a DynTraitTypeRepr/gen_dyn_trait_type_repr.rs 1864f3900bdae6f4a0a428e0b2a1266b758dfa8f27059353a639612d8829f4dd 1864f3900bdae6f4a0a428e0b2a1266b758dfa8f27059353a639612d8829f4dd Enum/gen_enum.rs 59c6dc0185c6b0dd877ce1b2291d3b8ab05041194b7bfc948e97baa4908605fa 59c6dc0185c6b0dd877ce1b2291d3b8ab05041194b7bfc948e97baa4908605fa ExprStmt/gen_expr_stmt.rs 6ce47428a8d33b902c1f14b06cc375d08eff95251e4a81dac2fa51872b7649b1 6ce47428a8d33b902c1f14b06cc375d08eff95251e4a81dac2fa51872b7649b1 @@ -85,7 +85,7 @@ Module/gen_module.rs 815605a604fea1d9276684f8d6738a4e833eacad57ceeb27e2095fc4502 Name/gen_name.rs 8a7fe65ee632a47d12eaa313e7248ac9210e5a381e9522499ca68f94c39e72c0 8a7fe65ee632a47d12eaa313e7248ac9210e5a381e9522499ca68f94c39e72c0 NameRef/gen_name_ref.rs c8c922e77a7d62b8272359ccdabbf7e15411f31ca85f15a3afdd94bec7ec64e7 c8c922e77a7d62b8272359ccdabbf7e15411f31ca85f15a3afdd94bec7ec64e7 NeverTypeRepr/gen_never_type_repr.rs cc7d1c861eaf89772109f142815839976f25f89956ed1b11822df5e7e333d6d4 cc7d1c861eaf89772109f142815839976f25f89956ed1b11822df5e7e333d6d4 -NotNull/gen_not_null.rs e812da59590473bff72438b8e8f66b4f371c7ec90852b2e13505f3697ff15cdc e812da59590473bff72438b8e8f66b4f371c7ec90852b2e13505f3697ff15cdc +NotNull/gen_not_null.rs 3cc516b4fcf50ef6c45452158820e5386883cafa759480d41c896c21f559a979 3cc516b4fcf50ef6c45452158820e5386883cafa759480d41c896c21f559a979 OffsetOfExpr/gen_offset_of_expr.rs 8e2077b4d7b85c91c17c3630511bc4f929950e9007261cbf0471c4a064c4b934 8e2077b4d7b85c91c17c3630511bc4f929950e9007261cbf0471c4a064c4b934 OrPat/gen_or_pat.rs 71feef6e056bfe4cc8c22c9eb54fa3fecef613606769061d0efd059adbbd6f56 71feef6e056bfe4cc8c22c9eb54fa3fecef613606769061d0efd059adbbd6f56 Param/gen_param.rs 39f3979d6cb10e4c43e0b5601af2a92b7520a75a104211955bbbb5e6f13e9db9 39f3979d6cb10e4c43e0b5601af2a92b7520a75a104211955bbbb5e6f13e9db9 @@ -98,7 +98,7 @@ Path/gen_path.rs 490268d6bfb1635883b8bdefc683d59c4dd0e9c7f86c2e55954661efb3ab025 Path/gen_path_expr.rs dcc9cc16cafff0e2225c1853a91612d3f666016c53fcb4ab5716ed31a33a41cd dcc9cc16cafff0e2225c1853a91612d3f666016c53fcb4ab5716ed31a33a41cd Path/gen_path_pat.rs fd7f941f8b33f19d3693be1fdb595c2fb2e85e8296702b82bf12bcd44632f371 fd7f941f8b33f19d3693be1fdb595c2fb2e85e8296702b82bf12bcd44632f371 Path/gen_path_type_repr.rs 2a59f36d62a8a6e0e2caacd2b7a78943ddb48af2bb2d82b0e63b387ec24e052d 2a59f36d62a8a6e0e2caacd2b7a78943ddb48af2bb2d82b0e63b387ec24e052d -PatternTypeRepr/gen_pattern_type_repr.rs 646af3e3af75d1b8c897d832ea11f0c48d7c0c9f1e379939424939d342bbbca4 646af3e3af75d1b8c897d832ea11f0c48d7c0c9f1e379939424939d342bbbca4 +PatternTypeRepr/gen_pattern_type_repr.rs 7e98df3851d63ed6509b7e634e8854dbf3294ed5cfc275b50bbbff55bf431f5e 7e98df3851d63ed6509b7e634e8854dbf3294ed5cfc275b50bbbff55bf431f5e PrefixExpr/gen_prefix_expr.rs c4b53e87f370713b9a9e257be26d082b0761497bac19b1d7401a31b22b30d1ab c4b53e87f370713b9a9e257be26d082b0761497bac19b1d7401a31b22b30d1ab PtrTypeRepr/gen_ptr_type_repr.rs b833d2a02add897c53ad5f0d436e1f5fa8919809592e1ded56b0c1c99b8344bd b833d2a02add897c53ad5f0d436e1f5fa8919809592e1ded56b0c1c99b8344bd RangeExpr/gen_range_expr.rs 3f27cff9cc76b2703beff622d1453b84121e1970a869e45f9428deac92c4ecb0 3f27cff9cc76b2703beff622d1453b84121e1970a869e45f9428deac92c4ecb0 diff --git a/rust/ql/test/extractor-tests/generated/DerefPat/DerefPat.expected b/rust/ql/test/extractor-tests/generated/DerefPat/DerefPat.expected index f3a958c6308e..30bba2359390 100644 --- a/rust/ql/test/extractor-tests/generated/DerefPat/DerefPat.expected +++ b/rust/ql/test/extractor-tests/generated/DerefPat/DerefPat.expected @@ -1,4 +1,4 @@ instances -| gen_deref_pat.rs:6:9:6:24 | DerefPat | +| gen_deref_pat.rs:8:9:8:24 | DerefPat | getPat -| gen_deref_pat.rs:6:9:6:24 | DerefPat | gen_deref_pat.rs:6:23:6:23 | y | +| gen_deref_pat.rs:8:9:8:24 | DerefPat | gen_deref_pat.rs:8:23:8:23 | y | diff --git a/rust/ql/test/extractor-tests/generated/DerefPat/gen_deref_pat.rs b/rust/ql/test/extractor-tests/generated/DerefPat/gen_deref_pat.rs index 387287ef9af7..b8c06cc3cc15 100644 --- a/rust/ql/test/extractor-tests/generated/DerefPat/gen_deref_pat.rs +++ b/rust/ql/test/extractor-tests/generated/DerefPat/gen_deref_pat.rs @@ -1,7 +1,9 @@ // generated by codegen, do not edit fn test_deref_pat() -> () { - // A deref pattern, matching the value behind a smart pointer. For example: + // A deref pattern, matching the value behind a smart pointer. This is an experimental + // Rust feature that cannot be written directly in stable Rust; the example below uses + // rust-analyzer's canonical `builtin#deref` syntax for such patterns: match x { builtin#deref(y) => y, _ => 0, diff --git a/rust/ql/test/extractor-tests/generated/NotNull/NotNull.expected b/rust/ql/test/extractor-tests/generated/NotNull/NotNull.expected index 4a34a62422e5..cde11bfed217 100644 --- a/rust/ql/test/extractor-tests/generated/NotNull/NotNull.expected +++ b/rust/ql/test/extractor-tests/generated/NotNull/NotNull.expected @@ -1 +1 @@ -| gen_not_null.rs:5:54:5:58 | NotNull | +| gen_not_null.rs:8:54:8:58 | NotNull | diff --git a/rust/ql/test/extractor-tests/generated/NotNull/gen_not_null.rs b/rust/ql/test/extractor-tests/generated/NotNull/gen_not_null.rs index 53ded4082f0a..f7bdf40318d2 100644 --- a/rust/ql/test/extractor-tests/generated/NotNull/gen_not_null.rs +++ b/rust/ql/test/extractor-tests/generated/NotNull/gen_not_null.rs @@ -1,6 +1,9 @@ // generated by codegen, do not edit fn test_not_null() -> () { - // The `!null` pattern used in a pattern type to denote a non-null value. For example: + // The `!null` pattern used in a pattern type to denote a non-null value. Pattern types + // are an experimental, mostly compiler-internal feature (used in the standard library for + // types such as `NonZero` and `NonNull`) and cannot be written directly in stable Rust; + // the example below uses rust-analyzer's canonical `builtin#pattern_type` syntax: type NonNull = builtin#pattern_type(*const () is !null); } diff --git a/rust/ql/test/extractor-tests/generated/PatternTypeRepr/PatternTypeRepr.expected b/rust/ql/test/extractor-tests/generated/PatternTypeRepr/PatternTypeRepr.expected index 02af4041097a..9e50c1315f74 100644 --- a/rust/ql/test/extractor-tests/generated/PatternTypeRepr/PatternTypeRepr.expected +++ b/rust/ql/test/extractor-tests/generated/PatternTypeRepr/PatternTypeRepr.expected @@ -1,6 +1,6 @@ instances -| gen_pattern_type_repr.rs:5:20:5:51 | PatternTypeRepr | +| gen_pattern_type_repr.rs:7:20:7:51 | PatternTypeRepr | getPat -| gen_pattern_type_repr.rs:5:20:5:51 | PatternTypeRepr | gen_pattern_type_repr.rs:5:48:5:50 | RangePat | +| gen_pattern_type_repr.rs:7:20:7:51 | PatternTypeRepr | gen_pattern_type_repr.rs:7:48:7:50 | RangePat | getTypeRepr -| gen_pattern_type_repr.rs:5:20:5:51 | PatternTypeRepr | gen_pattern_type_repr.rs:5:41:5:43 | u32 | +| gen_pattern_type_repr.rs:7:20:7:51 | PatternTypeRepr | gen_pattern_type_repr.rs:7:41:7:43 | u32 | diff --git a/rust/ql/test/extractor-tests/generated/PatternTypeRepr/gen_pattern_type_repr.rs b/rust/ql/test/extractor-tests/generated/PatternTypeRepr/gen_pattern_type_repr.rs index c9d4704ce813..ac721868a8e1 100644 --- a/rust/ql/test/extractor-tests/generated/PatternTypeRepr/gen_pattern_type_repr.rs +++ b/rust/ql/test/extractor-tests/generated/PatternTypeRepr/gen_pattern_type_repr.rs @@ -1,6 +1,8 @@ // generated by codegen, do not edit fn test_pattern_type_repr() -> () { - // A pattern type, constraining a type to values matching a pattern. For example: + // A pattern type, constraining a type to values matching a pattern. Pattern types are an + // experimental, mostly compiler-internal feature and cannot be written directly in stable + // Rust; the example below uses rust-analyzer's canonical `builtin#pattern_type` syntax: type NonZero = builtin#pattern_type(u32 is 1..); } diff --git a/rust/schema/annotations.py b/rust/schema/annotations.py index 3a5627353505..3c1ab3e4d43c 100644 --- a/rust/schema/annotations.py +++ b/rust/schema/annotations.py @@ -1058,7 +1058,9 @@ class _: @annotate(DerefPat, cfg=True) class _: """ - A deref pattern, matching the value behind a smart pointer. For example: + A deref pattern, matching the value behind a smart pointer. This is an experimental + Rust feature that cannot be written directly in stable Rust; the example below uses + rust-analyzer's canonical `builtin#deref` syntax for such patterns: ```rust match x { builtin#deref(y) => y, @@ -1595,7 +1597,10 @@ class ParamBase(AstNode): @annotate(NotNull, cfg=True) class _: """ - The `!null` pattern used in a pattern type to denote a non-null value. For example: + The `!null` pattern used in a pattern type to denote a non-null value. Pattern types + are an experimental, mostly compiler-internal feature (used in the standard library for + types such as `NonZero` and `NonNull`) and cannot be written directly in stable Rust; + the example below uses rust-analyzer's canonical `builtin#pattern_type` syntax: ```rust type NonNull = builtin#pattern_type(*const () is !null); ``` @@ -1692,7 +1697,9 @@ class _: @annotate(PatternTypeRepr) class _: """ - A pattern type, constraining a type to values matching a pattern. For example: + A pattern type, constraining a type to values matching a pattern. Pattern types are an + experimental, mostly compiler-internal feature and cannot be written directly in stable + Rust; the example below uses rust-analyzer's canonical `builtin#pattern_type` syntax: ```rust type NonZero = builtin#pattern_type(u32 is 1..); ``` From 8c8d0b66ed4c2f4bcd0981682574a840bc14b200 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 14 Aug 2026 14:51:30 +0200 Subject: [PATCH 0316/2098] Rust: add `qltest_edition` option and cap lints in qltest check The new nightly toolchain rejects let-chains in edition 2021 and enables deny-by-default lints (e.g. `dangerous_implicit_autorefs`) that fail extraction of valid test sources. Add a `qltest_edition` option so individual tests can opt into a newer edition, and pass `--cap-lints=allow` to the qltest cargo check. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 890cb55d-0437-4bd7-9268-87b8897ada01 --- rust/extractor/src/config.rs | 1 + rust/extractor/src/qltest.rs | 15 +++++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/rust/extractor/src/config.rs b/rust/extractor/src/config.rs index 7677025a66f2..992075b41a54 100644 --- a/rust/extractor/src/config.rs +++ b/rust/extractor/src/config.rs @@ -65,6 +65,7 @@ pub struct Config { pub qltest_cargo_check: bool, pub qltest_dependencies: Vec, pub qltest_use_nightly: bool, + pub qltest_edition: Option, pub sysroot: Option, pub sysroot_src: Option, pub rustc_src: Option, diff --git a/rust/extractor/src/qltest.rs b/rust/extractor/src/qltest.rs index bd9849cbb09f..8a19031d766b 100644 --- a/rust/extractor/src/qltest.rs +++ b/rust/extractor/src/qltest.rs @@ -8,7 +8,7 @@ use std::path::Path; use std::process::Command; use tracing::info; -const EDITION: &str = "2021"; +const DEFAULT_EDITION: &str = "2021"; fn dump_lib() -> anyhow::Result<()> { let path_iterator = glob("*.rs").context("globbing test sources")?; @@ -54,19 +54,19 @@ impl TestCargoManifest<'_> { fs::write(&path, rendered).with_context(|| format!("writing {}", path.display())) } } -fn dump_cargo_manifest(dependencies: &[String]) -> anyhow::Result<()> { +fn dump_cargo_manifest(dependencies: &[String], edition: &str) -> anyhow::Result<()> { let uses_proc_macro = fs::exists("proc_macro.rs").context("checking existence of proc_macro.rs")?; let lib_manifest = TestCargoManifest::Lib { uses_proc_macro, uses_main: fs::exists("main.rs").context("checking existence of main.rs")?, dependencies, - edition: EDITION, + edition, }; if uses_proc_macro { TestCargoManifest::Workspace {}.dump("")?; lib_manifest.dump(".lib")?; - TestCargoManifest::Macro { edition: EDITION }.dump(".proc_macro") + TestCargoManifest::Macro { edition }.dump(".proc_macro") } else { lib_manifest.dump("") } @@ -93,13 +93,16 @@ fn set_sources(config: &mut Config) -> anyhow::Result<()> { pub(crate) fn prepare(config: &mut Config) -> anyhow::Result<()> { dump_lib()?; set_sources(config)?; - dump_cargo_manifest(&config.qltest_dependencies)?; + let edition = config.qltest_edition.as_deref().unwrap_or(DEFAULT_EDITION); + dump_cargo_manifest(&config.qltest_dependencies, edition)?; if config.qltest_use_nightly { dump_nightly_toolchain()?; } if config.qltest_cargo_check { + // `--cap-lints=allow` keeps deny-by-default lints (e.g. `dangerous_implicit_autorefs` + // on recent toolchains) from failing extraction of otherwise valid test sources. let status = Command::new("cargo") - .env("RUSTFLAGS", "-Awarnings") + .env("RUSTFLAGS", "-Awarnings --cap-lints=allow") .arg("check") .arg("-q") .status() From e798e218b8a19396b6554c5d137775b68398af97 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 14 Aug 2026 14:51:39 +0200 Subject: [PATCH 0317/2098] Rust: accept qltest changes for rust-analyzer 0.0.347 Use edition 2024 for the let-chain fixtures (`dataflow/local`, `variables`, `unusedentities`). Drop stale `MISSING` markers in `type-inference` where the new inference now resolves the types, and mark the `System` `alloc`/`alloc_zeroed`/`realloc` alerts in CWE-770 as `MISSING` since rust-analyzer 0.0.347 no longer resolves those `GlobalAlloc` sinks. The regression is called out with inline comments in the fixture. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 890cb55d-0437-4bd7-9268-87b8897ada01 --- .../library-tests/dataflow/local/options.yml | 1 + .../test/library-tests/type-inference/main.rs | 10 +- .../type-inference/type-inference.expected | 52 ++ .../test/library-tests/variables/options.yml | 1 + .../UncontrolledAllocationSize.expected | 612 +++++++++--------- .../test/query-tests/security/CWE-770/main.rs | 9 +- .../query-tests/unusedentities/options.yml | 1 + 7 files changed, 363 insertions(+), 323 deletions(-) diff --git a/rust/ql/test/library-tests/dataflow/local/options.yml b/rust/ql/test/library-tests/dataflow/local/options.yml index a394083e5212..c2541fc242c2 100644 --- a/rust/ql/test/library-tests/dataflow/local/options.yml +++ b/rust/ql/test/library-tests/dataflow/local/options.yml @@ -1 +1,2 @@ qltest_use_nightly: true +qltest_edition: "2024" diff --git a/rust/ql/test/library-tests/type-inference/main.rs b/rust/ql/test/library-tests/type-inference/main.rs index 392380df0f77..eef59dab6749 100644 --- a/rust/ql/test/library-tests/type-inference/main.rs +++ b/rust/ql/test/library-tests/type-inference/main.rs @@ -2337,8 +2337,8 @@ mod loops { // for loops with containers - let vals3 = vec![1, 2, 3]; // $ type=vals3:Vec $ MISSING: type=vals3@Vec:i32 - for i in vals3 {} // $ MISSING: type=i:i32 + let vals3 = vec![1, 2, 3]; // $ type=vals3:Vec type=vals3@Vec:i32 + for i in vals3 {} // $ type=i:i32 let vals4a: Vec = [1u16, 2, 3].to_vec(); // $ certainType=vals4a@Vec:u16 for u in vals4a {} // $ type=u:u16 @@ -2356,10 +2356,10 @@ mod loops { vals7.push(1u8); // $ target=push for u in vals7 {} // $ type=u:u8 - let matrix1 = vec![vec![1, 2], vec![3, 4]]; // $ type=matrix1:Vec $ MISSING: type=matrix1@Vec:Vec type=matrix1@Vec.Vec:i32 + let matrix1 = vec![vec![1, 2], vec![3, 4]]; // $ type=matrix1:Vec type=matrix1@Vec:Vec type=matrix1@Vec.Vec:i32 #[rustfmt::skip] - let _ = for row in matrix1 { // $ MISSING: type=row:Vec type=row@Vec:i32 - for cell in row { // $ MISSING: type=cell:i32 + let _ = for row in matrix1 { // $ type=row:Vec type=row@Vec:i32 + for cell in row { // $ type=cell:i32 } }; diff --git a/rust/ql/test/library-tests/type-inference/type-inference.expected b/rust/ql/test/library-tests/type-inference/type-inference.expected index 20f20e21861c..e4f540ed9f45 100644 --- a/rust/ql/test/library-tests/type-inference/type-inference.expected +++ b/rust/ql/test/library-tests/type-inference/type-inference.expected @@ -1023,12 +1023,14 @@ inferCertainType | dereference.rs:116:5:116:5 | x | | dereference.rs:18:1:20:1 | MySmartPointer | | dereference.rs:143:19:151:5 | { ... } | | {EXTERNAL LOCATION} | () | | dereference.rs:144:17:144:26 | key_to_key | | {EXTERNAL LOCATION} | HashMap | +| dereference.rs:144:17:144:26 | key_to_key | A | {EXTERNAL LOCATION} | Global | | dereference.rs:144:17:144:26 | key_to_key | K | {EXTERNAL LOCATION} | & | | dereference.rs:144:17:144:26 | key_to_key | K.TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:144:17:144:26 | key_to_key | S | {EXTERNAL LOCATION} | RandomState | | dereference.rs:144:17:144:26 | key_to_key | V | {EXTERNAL LOCATION} | & | | dereference.rs:144:17:144:26 | key_to_key | V.TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:144:30:144:57 | ...::new(...) | | {EXTERNAL LOCATION} | HashMap | +| dereference.rs:144:30:144:57 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | | dereference.rs:144:30:144:57 | ...::new(...) | K | {EXTERNAL LOCATION} | & | | dereference.rs:144:30:144:57 | ...::new(...) | K.TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:144:30:144:57 | ...::new(...) | S | {EXTERNAL LOCATION} | RandomState | @@ -1039,6 +1041,7 @@ inferCertainType | dereference.rs:145:24:145:29 | Key {...} | | dereference.rs:122:5:123:21 | Key | | dereference.rs:146:9:149:9 | if ... {...} | | {EXTERNAL LOCATION} | () | | dereference.rs:146:32:146:41 | key_to_key | | {EXTERNAL LOCATION} | HashMap | +| dereference.rs:146:32:146:41 | key_to_key | A | {EXTERNAL LOCATION} | Global | | dereference.rs:146:32:146:41 | key_to_key | K | {EXTERNAL LOCATION} | & | | dereference.rs:146:32:146:41 | key_to_key | K.TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:146:32:146:41 | key_to_key | S | {EXTERNAL LOCATION} | RandomState | @@ -1048,6 +1051,7 @@ inferCertainType | dereference.rs:146:52:149:9 | { ... } | | {EXTERNAL LOCATION} | () | | dereference.rs:148:13:148:15 | key | | {EXTERNAL LOCATION} | & | | dereference.rs:150:9:150:18 | key_to_key | | {EXTERNAL LOCATION} | HashMap | +| dereference.rs:150:9:150:18 | key_to_key | A | {EXTERNAL LOCATION} | Global | | dereference.rs:150:9:150:18 | key_to_key | K | {EXTERNAL LOCATION} | & | | dereference.rs:150:9:150:18 | key_to_key | K.TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:150:9:150:18 | key_to_key | S | {EXTERNAL LOCATION} | RandomState | @@ -3598,16 +3602,20 @@ inferCertainType | main.rs:2362:13:2363:13 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2362:29:2363:13 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2366:17:2366:20 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2366:17:2366:20 | map1 | A | {EXTERNAL LOCATION} | Global | | main.rs:2366:17:2366:20 | map1 | S | {EXTERNAL LOCATION} | RandomState | | main.rs:2366:24:2366:55 | ...::new(...) | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2366:24:2366:55 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | | main.rs:2366:24:2366:55 | ...::new(...) | S | {EXTERNAL LOCATION} | RandomState | | main.rs:2367:9:2367:12 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2367:9:2367:12 | map1 | A | {EXTERNAL LOCATION} | Global | | main.rs:2367:9:2367:12 | map1 | S | {EXTERNAL LOCATION} | RandomState | | main.rs:2367:24:2367:38 | ...::new(...) | | {EXTERNAL LOCATION} | Box | | main.rs:2367:24:2367:38 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | | main.rs:2367:33:2367:37 | "one" | | {EXTERNAL LOCATION} | & | | main.rs:2367:33:2367:37 | "one" | TRef | {EXTERNAL LOCATION} | str | | main.rs:2368:9:2368:12 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2368:9:2368:12 | map1 | A | {EXTERNAL LOCATION} | Global | | main.rs:2368:9:2368:12 | map1 | S | {EXTERNAL LOCATION} | RandomState | | main.rs:2368:24:2368:38 | ...::new(...) | | {EXTERNAL LOCATION} | Box | | main.rs:2368:24:2368:38 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | @@ -3615,21 +3623,25 @@ inferCertainType | main.rs:2368:33:2368:37 | "two" | TRef | {EXTERNAL LOCATION} | str | | main.rs:2369:9:2369:33 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2369:20:2369:23 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2369:20:2369:23 | map1 | A | {EXTERNAL LOCATION} | Global | | main.rs:2369:20:2369:23 | map1 | S | {EXTERNAL LOCATION} | RandomState | | main.rs:2369:32:2369:33 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2370:9:2370:37 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2370:22:2370:25 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2370:22:2370:25 | map1 | A | {EXTERNAL LOCATION} | Global | | main.rs:2370:22:2370:25 | map1 | S | {EXTERNAL LOCATION} | RandomState | | main.rs:2370:36:2370:37 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2371:9:2371:42 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2371:13:2371:24 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | | main.rs:2371:29:2371:32 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2371:29:2371:32 | map1 | A | {EXTERNAL LOCATION} | Global | | main.rs:2371:29:2371:32 | map1 | S | {EXTERNAL LOCATION} | RandomState | | main.rs:2371:41:2371:42 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2372:9:2372:36 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2372:13:2372:24 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | | main.rs:2372:29:2372:33 | &map1 | | {EXTERNAL LOCATION} | & | | main.rs:2372:30:2372:33 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2372:30:2372:33 | map1 | A | {EXTERNAL LOCATION} | Global | | main.rs:2372:30:2372:33 | map1 | S | {EXTERNAL LOCATION} | RandomState | | main.rs:2372:35:2372:36 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2376:17:2376:17 | a | | {EXTERNAL LOCATION} | i64 | @@ -7209,12 +7221,14 @@ inferType | dereference.rs:116:12:116:12 | 0 | | {EXTERNAL LOCATION} | i32 | | dereference.rs:143:19:151:5 | { ... } | | {EXTERNAL LOCATION} | () | | dereference.rs:144:17:144:26 | key_to_key | | {EXTERNAL LOCATION} | HashMap | +| dereference.rs:144:17:144:26 | key_to_key | A | {EXTERNAL LOCATION} | Global | | dereference.rs:144:17:144:26 | key_to_key | K | {EXTERNAL LOCATION} | & | | dereference.rs:144:17:144:26 | key_to_key | K.TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:144:17:144:26 | key_to_key | S | {EXTERNAL LOCATION} | RandomState | | dereference.rs:144:17:144:26 | key_to_key | V | {EXTERNAL LOCATION} | & | | dereference.rs:144:17:144:26 | key_to_key | V.TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:144:30:144:57 | ...::new(...) | | {EXTERNAL LOCATION} | HashMap | +| dereference.rs:144:30:144:57 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | | dereference.rs:144:30:144:57 | ...::new(...) | K | {EXTERNAL LOCATION} | & | | dereference.rs:144:30:144:57 | ...::new(...) | K.TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:144:30:144:57 | ...::new(...) | S | {EXTERNAL LOCATION} | RandomState | @@ -7240,6 +7254,7 @@ inferType | dereference.rs:146:21:146:27 | ref_key | TRef | {EXTERNAL LOCATION} | & | | dereference.rs:146:21:146:27 | ref_key | TRef.TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:146:32:146:41 | key_to_key | | {EXTERNAL LOCATION} | HashMap | +| dereference.rs:146:32:146:41 | key_to_key | A | {EXTERNAL LOCATION} | Global | | dereference.rs:146:32:146:41 | key_to_key | K | {EXTERNAL LOCATION} | & | | dereference.rs:146:32:146:41 | key_to_key | K.TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:146:32:146:41 | key_to_key | S | {EXTERNAL LOCATION} | RandomState | @@ -7265,6 +7280,7 @@ inferType | dereference.rs:148:19:148:25 | ref_key | TRef | {EXTERNAL LOCATION} | & | | dereference.rs:148:19:148:25 | ref_key | TRef.TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:150:9:150:18 | key_to_key | | {EXTERNAL LOCATION} | HashMap | +| dereference.rs:150:9:150:18 | key_to_key | A | {EXTERNAL LOCATION} | Global | | dereference.rs:150:9:150:18 | key_to_key | K | {EXTERNAL LOCATION} | & | | dereference.rs:150:9:150:18 | key_to_key | K.TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:150:9:150:18 | key_to_key | S | {EXTERNAL LOCATION} | RandomState | @@ -11948,14 +11964,18 @@ inferType | main.rs:2336:25:2336:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2340:13:2340:17 | vals3 | | {EXTERNAL LOCATION} | Vec | | main.rs:2340:13:2340:17 | vals3 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2340:13:2340:17 | vals3 | T | {EXTERNAL LOCATION} | i32 | | main.rs:2340:21:2340:33 | MacroExpr | | {EXTERNAL LOCATION} | Vec | | main.rs:2340:21:2340:33 | MacroExpr | A | {EXTERNAL LOCATION} | Global | +| main.rs:2340:21:2340:33 | MacroExpr | T | {EXTERNAL LOCATION} | i32 | | main.rs:2340:26:2340:26 | 1 | | {EXTERNAL LOCATION} | i32 | | main.rs:2340:29:2340:29 | 2 | | {EXTERNAL LOCATION} | i32 | | main.rs:2340:32:2340:32 | 3 | | {EXTERNAL LOCATION} | i32 | | main.rs:2341:9:2341:25 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2341:13:2341:13 | i | | {EXTERNAL LOCATION} | i32 | | main.rs:2341:18:2341:22 | vals3 | | {EXTERNAL LOCATION} | Vec | | main.rs:2341:18:2341:22 | vals3 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2341:18:2341:22 | vals3 | T | {EXTERNAL LOCATION} | i32 | | main.rs:2341:24:2341:25 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2343:13:2343:18 | vals4a | | {EXTERNAL LOCATION} | Vec | | main.rs:2343:13:2343:18 | vals4a | A | {EXTERNAL LOCATION} | Global | @@ -12046,28 +12066,49 @@ inferType | main.rs:2357:24:2357:25 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2359:13:2359:19 | matrix1 | | {EXTERNAL LOCATION} | Vec | | main.rs:2359:13:2359:19 | matrix1 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2359:13:2359:19 | matrix1 | T | {EXTERNAL LOCATION} | Vec | +| main.rs:2359:13:2359:19 | matrix1 | T.A | {EXTERNAL LOCATION} | Global | +| main.rs:2359:13:2359:19 | matrix1 | T.T | {EXTERNAL LOCATION} | i32 | | main.rs:2359:23:2359:50 | MacroExpr | | {EXTERNAL LOCATION} | Vec | | main.rs:2359:23:2359:50 | MacroExpr | A | {EXTERNAL LOCATION} | Global | +| main.rs:2359:23:2359:50 | MacroExpr | T | {EXTERNAL LOCATION} | Vec | +| main.rs:2359:23:2359:50 | MacroExpr | T.A | {EXTERNAL LOCATION} | Global | +| main.rs:2359:23:2359:50 | MacroExpr | T.T | {EXTERNAL LOCATION} | i32 | | main.rs:2359:28:2359:37 | (...) | | {EXTERNAL LOCATION} | Vec | | main.rs:2359:28:2359:37 | (...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2359:28:2359:37 | (...) | T | {EXTERNAL LOCATION} | i32 | | main.rs:2359:28:2359:37 | MacroExpr | | {EXTERNAL LOCATION} | Vec | | main.rs:2359:28:2359:37 | MacroExpr | A | {EXTERNAL LOCATION} | Global | +| main.rs:2359:28:2359:37 | MacroExpr | T | {EXTERNAL LOCATION} | i32 | | main.rs:2359:33:2359:33 | 1 | | {EXTERNAL LOCATION} | i32 | | main.rs:2359:36:2359:36 | 2 | | {EXTERNAL LOCATION} | i32 | | main.rs:2359:40:2359:49 | (...) | | {EXTERNAL LOCATION} | Vec | | main.rs:2359:40:2359:49 | (...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2359:40:2359:49 | (...) | T | {EXTERNAL LOCATION} | i32 | | main.rs:2359:40:2359:49 | MacroExpr | | {EXTERNAL LOCATION} | Vec | | main.rs:2359:40:2359:49 | MacroExpr | A | {EXTERNAL LOCATION} | Global | +| main.rs:2359:40:2359:49 | MacroExpr | T | {EXTERNAL LOCATION} | i32 | | main.rs:2359:45:2359:45 | 3 | | {EXTERNAL LOCATION} | i32 | | main.rs:2359:48:2359:48 | 4 | | {EXTERNAL LOCATION} | i32 | | main.rs:2361:13:2361:13 | _ | | {EXTERNAL LOCATION} | () | | main.rs:2361:17:2364:9 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2361:21:2361:23 | row | | {EXTERNAL LOCATION} | Vec | +| main.rs:2361:21:2361:23 | row | A | {EXTERNAL LOCATION} | Global | +| main.rs:2361:21:2361:23 | row | T | {EXTERNAL LOCATION} | i32 | | main.rs:2361:28:2361:34 | matrix1 | | {EXTERNAL LOCATION} | Vec | | main.rs:2361:28:2361:34 | matrix1 | A | {EXTERNAL LOCATION} | Global | +| main.rs:2361:28:2361:34 | matrix1 | T | {EXTERNAL LOCATION} | Vec | +| main.rs:2361:28:2361:34 | matrix1 | T.A | {EXTERNAL LOCATION} | Global | +| main.rs:2361:28:2361:34 | matrix1 | T.T | {EXTERNAL LOCATION} | i32 | | main.rs:2361:36:2364:9 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2362:13:2363:13 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2362:17:2362:20 | cell | | {EXTERNAL LOCATION} | i32 | +| main.rs:2362:25:2362:27 | row | | {EXTERNAL LOCATION} | Vec | +| main.rs:2362:25:2362:27 | row | A | {EXTERNAL LOCATION} | Global | +| main.rs:2362:25:2362:27 | row | T | {EXTERNAL LOCATION} | i32 | | main.rs:2362:29:2363:13 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2366:17:2366:20 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2366:17:2366:20 | map1 | A | {EXTERNAL LOCATION} | Global | | main.rs:2366:17:2366:20 | map1 | K | {EXTERNAL LOCATION} | i32 | | main.rs:2366:17:2366:20 | map1 | S | {EXTERNAL LOCATION} | RandomState | | main.rs:2366:17:2366:20 | map1 | V | {EXTERNAL LOCATION} | Box | @@ -12075,6 +12116,7 @@ inferType | main.rs:2366:17:2366:20 | map1 | V.T | {EXTERNAL LOCATION} | & | | main.rs:2366:17:2366:20 | map1 | V.T.TRef | {EXTERNAL LOCATION} | str | | main.rs:2366:24:2366:55 | ...::new(...) | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2366:24:2366:55 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | | main.rs:2366:24:2366:55 | ...::new(...) | K | {EXTERNAL LOCATION} | i32 | | main.rs:2366:24:2366:55 | ...::new(...) | S | {EXTERNAL LOCATION} | RandomState | | main.rs:2366:24:2366:55 | ...::new(...) | V | {EXTERNAL LOCATION} | Box | @@ -12082,6 +12124,7 @@ inferType | main.rs:2366:24:2366:55 | ...::new(...) | V.T | {EXTERNAL LOCATION} | & | | main.rs:2366:24:2366:55 | ...::new(...) | V.T.TRef | {EXTERNAL LOCATION} | str | | main.rs:2367:9:2367:12 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2367:9:2367:12 | map1 | A | {EXTERNAL LOCATION} | Global | | main.rs:2367:9:2367:12 | map1 | K | {EXTERNAL LOCATION} | i32 | | main.rs:2367:9:2367:12 | map1 | S | {EXTERNAL LOCATION} | RandomState | | main.rs:2367:9:2367:12 | map1 | V | {EXTERNAL LOCATION} | Box | @@ -12101,6 +12144,7 @@ inferType | main.rs:2367:33:2367:37 | "one" | | {EXTERNAL LOCATION} | & | | main.rs:2367:33:2367:37 | "one" | TRef | {EXTERNAL LOCATION} | str | | main.rs:2368:9:2368:12 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2368:9:2368:12 | map1 | A | {EXTERNAL LOCATION} | Global | | main.rs:2368:9:2368:12 | map1 | K | {EXTERNAL LOCATION} | i32 | | main.rs:2368:9:2368:12 | map1 | S | {EXTERNAL LOCATION} | RandomState | | main.rs:2368:9:2368:12 | map1 | V | {EXTERNAL LOCATION} | Box | @@ -12123,6 +12167,7 @@ inferType | main.rs:2369:13:2369:15 | key | | {EXTERNAL LOCATION} | & | | main.rs:2369:13:2369:15 | key | TRef | {EXTERNAL LOCATION} | i32 | | main.rs:2369:20:2369:23 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2369:20:2369:23 | map1 | A | {EXTERNAL LOCATION} | Global | | main.rs:2369:20:2369:23 | map1 | K | {EXTERNAL LOCATION} | i32 | | main.rs:2369:20:2369:23 | map1 | S | {EXTERNAL LOCATION} | RandomState | | main.rs:2369:20:2369:23 | map1 | V | {EXTERNAL LOCATION} | Box | @@ -12143,6 +12188,7 @@ inferType | main.rs:2370:13:2370:17 | value | TRef.T | {EXTERNAL LOCATION} | & | | main.rs:2370:13:2370:17 | value | TRef.T.TRef | {EXTERNAL LOCATION} | str | | main.rs:2370:22:2370:25 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2370:22:2370:25 | map1 | A | {EXTERNAL LOCATION} | Global | | main.rs:2370:22:2370:25 | map1 | K | {EXTERNAL LOCATION} | i32 | | main.rs:2370:22:2370:25 | map1 | S | {EXTERNAL LOCATION} | RandomState | | main.rs:2370:22:2370:25 | map1 | V | {EXTERNAL LOCATION} | Box | @@ -12173,6 +12219,7 @@ inferType | main.rs:2371:19:2371:23 | value | TRef.T | {EXTERNAL LOCATION} | & | | main.rs:2371:19:2371:23 | value | TRef.T.TRef | {EXTERNAL LOCATION} | str | | main.rs:2371:29:2371:32 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2371:29:2371:32 | map1 | A | {EXTERNAL LOCATION} | Global | | main.rs:2371:29:2371:32 | map1 | K | {EXTERNAL LOCATION} | i32 | | main.rs:2371:29:2371:32 | map1 | S | {EXTERNAL LOCATION} | RandomState | | main.rs:2371:29:2371:32 | map1 | V | {EXTERNAL LOCATION} | Box | @@ -12204,6 +12251,7 @@ inferType | main.rs:2372:19:2372:23 | value | TRef.T.TRef | {EXTERNAL LOCATION} | str | | main.rs:2372:29:2372:33 | &map1 | | {EXTERNAL LOCATION} | & | | main.rs:2372:29:2372:33 | &map1 | TRef | {EXTERNAL LOCATION} | HashMap | +| main.rs:2372:29:2372:33 | &map1 | TRef.A | {EXTERNAL LOCATION} | Global | | main.rs:2372:29:2372:33 | &map1 | TRef.K | {EXTERNAL LOCATION} | i32 | | main.rs:2372:29:2372:33 | &map1 | TRef.S | {EXTERNAL LOCATION} | RandomState | | main.rs:2372:29:2372:33 | &map1 | TRef.V | {EXTERNAL LOCATION} | Box | @@ -12211,6 +12259,7 @@ inferType | main.rs:2372:29:2372:33 | &map1 | TRef.V.T | {EXTERNAL LOCATION} | & | | main.rs:2372:29:2372:33 | &map1 | TRef.V.T.TRef | {EXTERNAL LOCATION} | str | | main.rs:2372:30:2372:33 | map1 | | {EXTERNAL LOCATION} | HashMap | +| main.rs:2372:30:2372:33 | map1 | A | {EXTERNAL LOCATION} | Global | | main.rs:2372:30:2372:33 | map1 | K | {EXTERNAL LOCATION} | i32 | | main.rs:2372:30:2372:33 | map1 | S | {EXTERNAL LOCATION} | RandomState | | main.rs:2372:30:2372:33 | map1 | V | {EXTERNAL LOCATION} | Box | @@ -15485,8 +15534,10 @@ inferType | pattern_matching.rs:792:35:824:1 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:794:9:794:14 | points | | {EXTERNAL LOCATION} | Vec | | pattern_matching.rs:794:9:794:14 | points | A | {EXTERNAL LOCATION} | Global | +| pattern_matching.rs:794:9:794:14 | points | T | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:794:18:794:65 | MacroExpr | | {EXTERNAL LOCATION} | Vec | | pattern_matching.rs:794:18:794:65 | MacroExpr | A | {EXTERNAL LOCATION} | Global | +| pattern_matching.rs:794:18:794:65 | MacroExpr | T | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:794:23:794:42 | (...) | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:794:23:794:42 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:794:34:794:34 | 1 | | {EXTERNAL LOCATION} | i32 | @@ -15501,6 +15552,7 @@ inferType | pattern_matching.rs:795:20:795:20 | y | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:795:27:795:32 | points | | {EXTERNAL LOCATION} | Vec | | pattern_matching.rs:795:27:795:32 | points | A | {EXTERNAL LOCATION} | Global | +| pattern_matching.rs:795:27:795:32 | points | T | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:795:34:799:5 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:796:13:796:18 | loop_x | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:796:22:796:22 | x | | {EXTERNAL LOCATION} | i32 | diff --git a/rust/ql/test/library-tests/variables/options.yml b/rust/ql/test/library-tests/variables/options.yml index a394083e5212..c2541fc242c2 100644 --- a/rust/ql/test/library-tests/variables/options.yml +++ b/rust/ql/test/library-tests/variables/options.yml @@ -1 +1,2 @@ qltest_use_nightly: true +qltest_edition: "2024" diff --git a/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected b/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected index 477dbee0e0f4..2fa5c6c0663a 100644 --- a/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected +++ b/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected @@ -1,164 +1,161 @@ #select -| main.rs:18:13:18:31 | ...::realloc | main.rs:339:13:339:26 | ...::args | main.rs:18:13:18:31 | ...::realloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:21:13:21:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:21:13:21:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:22:13:22:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:22:13:22:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:23:13:23:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:23:13:23:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:24:13:24:36 | ...::alloc_zeroed | main.rs:339:13:339:26 | ...::args | main.rs:24:13:24:36 | ...::alloc_zeroed | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:30:13:30:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:30:13:30:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:33:13:33:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:33:13:33:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:37:13:37:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:37:13:37:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:40:13:40:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:40:13:40:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:50:13:50:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:50:13:50:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:51:13:51:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:51:13:51:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:53:13:53:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:53:13:53:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:54:13:54:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:54:13:54:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:59:13:59:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:59:13:59:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:61:13:61:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:61:13:61:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:63:13:63:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:63:13:63:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:64:13:64:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:64:13:64:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:65:13:65:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:65:13:65:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:68:13:68:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:68:13:68:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:88:13:88:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:88:13:88:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:96:17:96:33 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:96:17:96:33 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:102:17:102:33 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:102:17:102:33 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:103:17:103:33 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:103:17:103:33 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:109:17:109:33 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:109:17:109:33 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:111:17:111:33 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:111:17:111:33 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:146:17:146:33 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:146:17:146:33 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:148:17:148:33 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:148:17:148:33 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:152:13:152:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:152:13:152:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:155:13:155:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:155:13:155:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:162:17:162:33 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:162:17:162:33 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:169:17:169:33 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:169:17:169:33 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:177:13:177:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:177:13:177:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:193:32:193:36 | alloc | main.rs:339:13:339:26 | ...::args | main.rs:193:32:193:36 | alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:194:32:194:43 | alloc_zeroed | main.rs:339:13:339:26 | ...::args | main.rs:194:32:194:43 | alloc_zeroed | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:195:32:195:39 | allocate | main.rs:339:13:339:26 | ...::args | main.rs:195:32:195:39 | allocate | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:196:32:196:46 | allocate_zeroed | main.rs:339:13:339:26 | ...::args | main.rs:196:32:196:46 | allocate_zeroed | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:197:32:197:39 | allocate | main.rs:339:13:339:26 | ...::args | main.rs:197:32:197:39 | allocate | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:198:32:198:46 | allocate_zeroed | main.rs:339:13:339:26 | ...::args | main.rs:198:32:198:46 | allocate_zeroed | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:202:32:202:38 | realloc | main.rs:339:13:339:26 | ...::args | main.rs:202:32:202:38 | realloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:208:40:208:43 | grow | main.rs:339:13:339:26 | ...::args | main.rs:208:40:208:43 | grow | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:210:40:210:50 | grow_zeroed | main.rs:339:13:339:26 | ...::args | main.rs:210:40:210:50 | grow_zeroed | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:213:36:213:41 | shrink | main.rs:339:13:339:26 | ...::args | main.rs:213:36:213:41 | shrink | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:219:13:219:24 | ...::malloc | main.rs:339:13:339:26 | ...::args | main.rs:219:13:219:24 | ...::malloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:220:13:220:31 | ...::aligned_alloc | main.rs:339:13:339:26 | ...::args | main.rs:220:13:220:31 | ...::aligned_alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:222:13:222:24 | ...::calloc | main.rs:339:13:339:26 | ...::args | main.rs:222:13:222:24 | ...::calloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:223:13:223:24 | ...::calloc | main.rs:339:13:339:26 | ...::args | main.rs:223:13:223:24 | ...::calloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:224:13:224:25 | ...::realloc | main.rs:339:13:339:26 | ...::args | main.rs:224:13:224:25 | ...::realloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:228:13:228:41 | ...::try_with_capacity | main.rs:339:13:339:26 | ...::args | main.rs:228:13:228:41 | ...::try_with_capacity | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:229:13:229:37 | ...::with_capacity | main.rs:339:13:339:26 | ...::args | main.rs:229:13:229:37 | ...::with_capacity | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:230:13:230:44 | ...::try_with_capacity_in | main.rs:339:13:339:26 | ...::args | main.rs:230:13:230:44 | ...::try_with_capacity_in | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:231:13:231:40 | ...::with_capacity_in | main.rs:339:13:339:26 | ...::args | main.rs:231:13:231:40 | ...::with_capacity_in | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:287:22:287:38 | ...::alloc | main.rs:311:25:311:38 | ...::args | main.rs:287:22:287:38 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:311:25:311:38 | ...::args | user-provided value | -| main.rs:331:13:331:24 | ...::malloc | main.rs:339:13:339:26 | ...::args | main.rs:331:13:331:24 | ...::malloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | +| main.rs:18:13:18:31 | ...::realloc | main.rs:342:13:342:26 | ...::args | main.rs:18:13:18:31 | ...::realloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:21:13:21:29 | ...::alloc | main.rs:342:13:342:26 | ...::args | main.rs:21:13:21:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:22:13:22:29 | ...::alloc | main.rs:342:13:342:26 | ...::args | main.rs:22:13:22:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:23:13:23:29 | ...::alloc | main.rs:342:13:342:26 | ...::args | main.rs:23:13:23:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:24:13:24:36 | ...::alloc_zeroed | main.rs:342:13:342:26 | ...::args | main.rs:24:13:24:36 | ...::alloc_zeroed | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:30:13:30:29 | ...::alloc | main.rs:342:13:342:26 | ...::args | main.rs:30:13:30:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:33:13:33:29 | ...::alloc | main.rs:342:13:342:26 | ...::args | main.rs:33:13:33:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:37:13:37:29 | ...::alloc | main.rs:342:13:342:26 | ...::args | main.rs:37:13:37:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:40:13:40:29 | ...::alloc | main.rs:342:13:342:26 | ...::args | main.rs:40:13:40:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:50:13:50:29 | ...::alloc | main.rs:342:13:342:26 | ...::args | main.rs:50:13:50:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:51:13:51:29 | ...::alloc | main.rs:342:13:342:26 | ...::args | main.rs:51:13:51:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:53:13:53:29 | ...::alloc | main.rs:342:13:342:26 | ...::args | main.rs:53:13:53:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:54:13:54:29 | ...::alloc | main.rs:342:13:342:26 | ...::args | main.rs:54:13:54:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:59:13:59:29 | ...::alloc | main.rs:342:13:342:26 | ...::args | main.rs:59:13:59:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:61:13:61:29 | ...::alloc | main.rs:342:13:342:26 | ...::args | main.rs:61:13:61:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:63:13:63:29 | ...::alloc | main.rs:342:13:342:26 | ...::args | main.rs:63:13:63:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:64:13:64:29 | ...::alloc | main.rs:342:13:342:26 | ...::args | main.rs:64:13:64:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:65:13:65:29 | ...::alloc | main.rs:342:13:342:26 | ...::args | main.rs:65:13:65:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:68:13:68:29 | ...::alloc | main.rs:342:13:342:26 | ...::args | main.rs:68:13:68:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:88:13:88:29 | ...::alloc | main.rs:342:13:342:26 | ...::args | main.rs:88:13:88:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:96:17:96:33 | ...::alloc | main.rs:342:13:342:26 | ...::args | main.rs:96:17:96:33 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:102:17:102:33 | ...::alloc | main.rs:342:13:342:26 | ...::args | main.rs:102:17:102:33 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:103:17:103:33 | ...::alloc | main.rs:342:13:342:26 | ...::args | main.rs:103:17:103:33 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:109:17:109:33 | ...::alloc | main.rs:342:13:342:26 | ...::args | main.rs:109:17:109:33 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:111:17:111:33 | ...::alloc | main.rs:342:13:342:26 | ...::args | main.rs:111:17:111:33 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:146:17:146:33 | ...::alloc | main.rs:342:13:342:26 | ...::args | main.rs:146:17:146:33 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:148:17:148:33 | ...::alloc | main.rs:342:13:342:26 | ...::args | main.rs:148:17:148:33 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:152:13:152:29 | ...::alloc | main.rs:342:13:342:26 | ...::args | main.rs:152:13:152:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:155:13:155:29 | ...::alloc | main.rs:342:13:342:26 | ...::args | main.rs:155:13:155:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:162:17:162:33 | ...::alloc | main.rs:342:13:342:26 | ...::args | main.rs:162:17:162:33 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:169:17:169:33 | ...::alloc | main.rs:342:13:342:26 | ...::args | main.rs:169:17:169:33 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:177:13:177:29 | ...::alloc | main.rs:342:13:342:26 | ...::args | main.rs:177:13:177:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:197:32:197:39 | allocate | main.rs:342:13:342:26 | ...::args | main.rs:197:32:197:39 | allocate | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:198:32:198:46 | allocate_zeroed | main.rs:342:13:342:26 | ...::args | main.rs:198:32:198:46 | allocate_zeroed | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:199:32:199:39 | allocate | main.rs:342:13:342:26 | ...::args | main.rs:199:32:199:39 | allocate | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:200:32:200:46 | allocate_zeroed | main.rs:342:13:342:26 | ...::args | main.rs:200:32:200:46 | allocate_zeroed | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:211:40:211:43 | grow | main.rs:342:13:342:26 | ...::args | main.rs:211:40:211:43 | grow | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:213:40:213:50 | grow_zeroed | main.rs:342:13:342:26 | ...::args | main.rs:213:40:213:50 | grow_zeroed | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:216:36:216:41 | shrink | main.rs:342:13:342:26 | ...::args | main.rs:216:36:216:41 | shrink | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:222:13:222:24 | ...::malloc | main.rs:342:13:342:26 | ...::args | main.rs:222:13:222:24 | ...::malloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:223:13:223:31 | ...::aligned_alloc | main.rs:342:13:342:26 | ...::args | main.rs:223:13:223:31 | ...::aligned_alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:225:13:225:24 | ...::calloc | main.rs:342:13:342:26 | ...::args | main.rs:225:13:225:24 | ...::calloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:226:13:226:24 | ...::calloc | main.rs:342:13:342:26 | ...::args | main.rs:226:13:226:24 | ...::calloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:227:13:227:25 | ...::realloc | main.rs:342:13:342:26 | ...::args | main.rs:227:13:227:25 | ...::realloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:231:13:231:41 | ...::try_with_capacity | main.rs:342:13:342:26 | ...::args | main.rs:231:13:231:41 | ...::try_with_capacity | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:232:13:232:37 | ...::with_capacity | main.rs:342:13:342:26 | ...::args | main.rs:232:13:232:37 | ...::with_capacity | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:233:13:233:44 | ...::try_with_capacity_in | main.rs:342:13:342:26 | ...::args | main.rs:233:13:233:44 | ...::try_with_capacity_in | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:234:13:234:40 | ...::with_capacity_in | main.rs:342:13:342:26 | ...::args | main.rs:234:13:234:40 | ...::with_capacity_in | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | +| main.rs:290:22:290:38 | ...::alloc | main.rs:314:25:314:38 | ...::args | main.rs:290:22:290:38 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:314:25:314:38 | ...::args | user-provided value | +| main.rs:334:13:334:24 | ...::malloc | main.rs:342:13:342:26 | ...::args | main.rs:334:13:334:24 | ...::malloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:26 | ...::args | user-provided value | edges | main.rs:12:36:12:43 | ...: usize | main.rs:18:41:18:41 | v | provenance | | -| main.rs:18:41:18:41 | v | main.rs:18:13:18:31 | ...::realloc | provenance | MaD:17 Sink:MaD:17 | +| main.rs:18:41:18:41 | v | main.rs:18:13:18:31 | ...::realloc | provenance | MaD:14 Sink:MaD:14 | | main.rs:18:41:18:41 | v | main.rs:20:50:20:50 | v | provenance | | | main.rs:18:41:18:41 | v | main.rs:29:60:29:60 | v | provenance | | | main.rs:18:41:18:41 | v | main.rs:32:60:32:60 | v | provenance | | | main.rs:18:41:18:41 | v | main.rs:35:49:35:49 | v | provenance | | | main.rs:20:9:20:10 | l2 | main.rs:21:31:21:32 | l2 | provenance | | -| main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | main.rs:20:14:20:63 | ... .unwrap() | provenance | MaD:41 | +| main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | main.rs:20:14:20:63 | ... .unwrap() | provenance | MaD:38 | | main.rs:20:14:20:63 | ... .unwrap() | main.rs:20:9:20:10 | l2 | provenance | | -| main.rs:20:50:20:50 | v | main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | provenance | MaD:33 | -| main.rs:21:31:21:32 | l2 | main.rs:21:13:21:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | +| main.rs:20:50:20:50 | v | main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | provenance | MaD:30 | +| main.rs:21:31:21:32 | l2 | main.rs:21:13:21:29 | ...::alloc | provenance | MaD:12 Sink:MaD:12 | | main.rs:21:31:21:32 | l2 | main.rs:22:31:22:32 | l2 | provenance | | | main.rs:21:31:21:32 | l2 | main.rs:23:31:23:32 | l2 | provenance | | | main.rs:21:31:21:32 | l2 | main.rs:24:38:24:39 | l2 | provenance | | -| main.rs:22:31:22:32 | l2 | main.rs:22:31:22:44 | l2.align_to(...) [Ok] | provenance | MaD:27 | -| main.rs:22:31:22:44 | l2.align_to(...) [Ok] | main.rs:22:31:22:53 | ... .unwrap() | provenance | MaD:41 | -| main.rs:22:31:22:53 | ... .unwrap() | main.rs:22:13:22:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:23:31:23:32 | l2 | main.rs:23:31:23:44 | l2.align_to(...) [Ok] | provenance | MaD:27 | -| main.rs:23:31:23:44 | l2.align_to(...) [Ok] | main.rs:23:31:23:53 | ... .unwrap() | provenance | MaD:41 | -| main.rs:23:31:23:53 | ... .unwrap() | main.rs:23:31:23:68 | ... .pad_to_align() | provenance | MaD:35 | -| main.rs:23:31:23:68 | ... .pad_to_align() | main.rs:23:13:23:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:24:38:24:39 | l2 | main.rs:24:13:24:36 | ...::alloc_zeroed | provenance | MaD:16 Sink:MaD:16 | +| main.rs:22:31:22:32 | l2 | main.rs:22:31:22:44 | l2.align_to(...) [Ok] | provenance | MaD:24 | +| main.rs:22:31:22:44 | l2.align_to(...) [Ok] | main.rs:22:31:22:53 | ... .unwrap() | provenance | MaD:38 | +| main.rs:22:31:22:53 | ... .unwrap() | main.rs:22:13:22:29 | ...::alloc | provenance | MaD:12 Sink:MaD:12 | +| main.rs:23:31:23:32 | l2 | main.rs:23:31:23:44 | l2.align_to(...) [Ok] | provenance | MaD:24 | +| main.rs:23:31:23:44 | l2.align_to(...) [Ok] | main.rs:23:31:23:53 | ... .unwrap() | provenance | MaD:38 | +| main.rs:23:31:23:53 | ... .unwrap() | main.rs:23:31:23:68 | ... .pad_to_align() | provenance | MaD:32 | +| main.rs:23:31:23:68 | ... .pad_to_align() | main.rs:23:13:23:29 | ...::alloc | provenance | MaD:12 Sink:MaD:12 | +| main.rs:24:38:24:39 | l2 | main.rs:24:13:24:36 | ...::alloc_zeroed | provenance | MaD:13 Sink:MaD:13 | | main.rs:29:9:29:10 | l4 | main.rs:30:31:30:32 | l4 | provenance | | | main.rs:29:14:29:64 | ...::from_size_align_unchecked(...) | main.rs:29:9:29:10 | l4 | provenance | | -| main.rs:29:60:29:60 | v | main.rs:29:14:29:64 | ...::from_size_align_unchecked(...) | provenance | MaD:34 | -| main.rs:30:31:30:32 | l4 | main.rs:30:13:30:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | +| main.rs:29:60:29:60 | v | main.rs:29:14:29:64 | ...::from_size_align_unchecked(...) | provenance | MaD:31 | +| main.rs:30:31:30:32 | l4 | main.rs:30:13:30:29 | ...::alloc | provenance | MaD:12 Sink:MaD:12 | | main.rs:32:9:32:10 | l5 | main.rs:33:31:33:32 | l5 | provenance | | | main.rs:32:14:32:118 | ...::from_size_align_unchecked(...) | main.rs:32:9:32:10 | l5 | provenance | | -| main.rs:32:60:32:60 | v | main.rs:32:60:32:89 | ... * ... | provenance | MaD:25 | -| main.rs:32:60:32:89 | ... * ... | main.rs:32:14:32:118 | ...::from_size_align_unchecked(...) | provenance | MaD:34 | -| main.rs:33:31:33:32 | l5 | main.rs:33:13:33:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | +| main.rs:32:60:32:60 | v | main.rs:32:60:32:89 | ... * ... | provenance | MaD:22 | +| main.rs:32:60:32:89 | ... * ... | main.rs:32:14:32:118 | ...::from_size_align_unchecked(...) | provenance | MaD:31 | +| main.rs:33:31:33:32 | l5 | main.rs:33:13:33:29 | ...::alloc | provenance | MaD:12 Sink:MaD:12 | | main.rs:35:9:35:10 | s6 | main.rs:36:60:36:61 | s6 | provenance | | | main.rs:35:14:35:54 | ... + ... | main.rs:35:9:35:10 | s6 | provenance | | -| main.rs:35:15:35:49 | ... * ... | main.rs:35:14:35:54 | ... + ... | provenance | MaD:24 | -| main.rs:35:49:35:49 | v | main.rs:35:15:35:49 | ... * ... | provenance | MaD:25 | +| main.rs:35:15:35:49 | ... * ... | main.rs:35:14:35:54 | ... + ... | provenance | MaD:21 | +| main.rs:35:49:35:49 | v | main.rs:35:15:35:49 | ... * ... | provenance | MaD:22 | | main.rs:36:9:36:10 | l6 | main.rs:37:31:37:32 | l6 | provenance | | | main.rs:36:14:36:65 | ...::from_size_align_unchecked(...) | main.rs:36:9:36:10 | l6 | provenance | | -| main.rs:36:60:36:61 | s6 | main.rs:36:14:36:65 | ...::from_size_align_unchecked(...) | provenance | MaD:34 | -| main.rs:37:31:37:32 | l6 | main.rs:37:13:37:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | +| main.rs:36:60:36:61 | s6 | main.rs:36:14:36:65 | ...::from_size_align_unchecked(...) | provenance | MaD:31 | +| main.rs:37:31:37:32 | l6 | main.rs:37:13:37:29 | ...::alloc | provenance | MaD:12 Sink:MaD:12 | | main.rs:37:31:37:32 | l6 | main.rs:39:60:39:61 | l6 | provenance | | | main.rs:39:9:39:10 | l7 | main.rs:40:31:40:32 | l7 | provenance | | | main.rs:39:14:39:72 | ...::from_size_align_unchecked(...) | main.rs:39:9:39:10 | l7 | provenance | | -| main.rs:39:60:39:61 | l6 | main.rs:39:60:39:68 | l6.size() | provenance | MaD:38 | -| main.rs:39:60:39:68 | l6.size() | main.rs:39:14:39:72 | ...::from_size_align_unchecked(...) | provenance | MaD:34 | -| main.rs:40:31:40:32 | l7 | main.rs:40:13:40:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | +| main.rs:39:60:39:61 | l6 | main.rs:39:60:39:68 | l6.size() | provenance | MaD:35 | +| main.rs:39:60:39:68 | l6.size() | main.rs:39:14:39:72 | ...::from_size_align_unchecked(...) | provenance | MaD:31 | +| main.rs:40:31:40:32 | l7 | main.rs:40:13:40:29 | ...::alloc | provenance | MaD:12 Sink:MaD:12 | | main.rs:43:44:43:51 | ...: usize | main.rs:50:41:50:41 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:51:41:51:41 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:53:48:53:48 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:54:48:54:48 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:58:34:58:34 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:67:46:67:46 | v | provenance | | -| main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | main.rs:50:31:50:51 | ... .unwrap() [tuple.0] | provenance | MaD:41 | +| main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | main.rs:50:31:50:51 | ... .unwrap() [tuple.0] | provenance | MaD:38 | | main.rs:50:31:50:51 | ... .unwrap() [tuple.0] | main.rs:50:31:50:53 | ... .0 | provenance | | -| main.rs:50:31:50:53 | ... .0 | main.rs:50:13:50:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:50:41:50:41 | v | main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:36 | -| main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | main.rs:51:31:51:55 | ... .unwrap() [tuple.0] | provenance | MaD:41 | +| main.rs:50:31:50:53 | ... .0 | main.rs:50:13:50:29 | ...::alloc | provenance | MaD:12 Sink:MaD:12 | +| main.rs:50:41:50:41 | v | main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:33 | +| main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | main.rs:51:31:51:55 | ... .unwrap() [tuple.0] | provenance | MaD:38 | | main.rs:51:31:51:55 | ... .unwrap() [tuple.0] | main.rs:51:31:51:57 | ... .0 | provenance | | -| main.rs:51:31:51:57 | ... .0 | main.rs:51:13:51:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:51:41:51:41 | v | main.rs:51:41:51:45 | ... + ... | provenance | MaD:24 | -| main.rs:51:41:51:45 | ... + ... | main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:36 | -| main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | main.rs:53:31:53:58 | ... .unwrap() | provenance | MaD:41 | -| main.rs:53:31:53:58 | ... .unwrap() | main.rs:53:13:53:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:53:48:53:48 | v | main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | provenance | MaD:37 | -| main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | main.rs:54:31:54:63 | ... .unwrap() | provenance | MaD:41 | -| main.rs:54:31:54:63 | ... .unwrap() | main.rs:54:13:54:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:54:48:54:48 | v | main.rs:54:48:54:53 | ... * ... | provenance | MaD:25 | -| main.rs:54:48:54:53 | ... * ... | main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | provenance | MaD:37 | +| main.rs:51:31:51:57 | ... .0 | main.rs:51:13:51:29 | ...::alloc | provenance | MaD:12 Sink:MaD:12 | +| main.rs:51:41:51:41 | v | main.rs:51:41:51:45 | ... + ... | provenance | MaD:21 | +| main.rs:51:41:51:45 | ... + ... | main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:33 | +| main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | main.rs:53:31:53:58 | ... .unwrap() | provenance | MaD:38 | +| main.rs:53:31:53:58 | ... .unwrap() | main.rs:53:13:53:29 | ...::alloc | provenance | MaD:12 Sink:MaD:12 | +| main.rs:53:48:53:48 | v | main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | provenance | MaD:34 | +| main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | main.rs:54:31:54:63 | ... .unwrap() | provenance | MaD:38 | +| main.rs:54:31:54:63 | ... .unwrap() | main.rs:54:13:54:29 | ...::alloc | provenance | MaD:12 Sink:MaD:12 | +| main.rs:54:48:54:48 | v | main.rs:54:48:54:53 | ... * ... | provenance | MaD:22 | +| main.rs:54:48:54:53 | ... * ... | main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | provenance | MaD:34 | | main.rs:58:9:58:20 | TuplePat [tuple.0] | main.rs:58:10:58:11 | k1 | provenance | | | main.rs:58:10:58:11 | k1 | main.rs:59:31:59:32 | k1 | provenance | | -| main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | main.rs:58:24:58:66 | ... .expect(...) [tuple.0] | provenance | MaD:40 | +| main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | main.rs:58:24:58:66 | ... .expect(...) [tuple.0] | provenance | MaD:37 | | main.rs:58:24:58:66 | ... .expect(...) [tuple.0] | main.rs:58:9:58:20 | TuplePat [tuple.0] | provenance | | -| main.rs:58:34:58:34 | v | main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | provenance | MaD:36 | -| main.rs:59:31:59:32 | k1 | main.rs:59:13:59:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | +| main.rs:58:34:58:34 | v | main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | provenance | MaD:33 | +| main.rs:59:31:59:32 | k1 | main.rs:59:13:59:29 | ...::alloc | provenance | MaD:12 Sink:MaD:12 | | main.rs:59:31:59:32 | k1 | main.rs:60:34:60:35 | k1 | provenance | | | main.rs:59:31:59:32 | k1 | main.rs:62:24:62:25 | k1 | provenance | | | main.rs:59:31:59:32 | k1 | main.rs:64:48:64:49 | k1 | provenance | | | main.rs:59:31:59:32 | k1 | main.rs:65:31:65:32 | k1 | provenance | | | main.rs:60:9:60:20 | TuplePat [tuple.0] | main.rs:60:10:60:11 | k2 | provenance | | | main.rs:60:10:60:11 | k2 | main.rs:61:31:61:32 | k2 | provenance | | -| main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | main.rs:60:24:60:45 | ... .unwrap() [tuple.0] | provenance | MaD:41 | +| main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | main.rs:60:24:60:45 | ... .unwrap() [tuple.0] | provenance | MaD:38 | | main.rs:60:24:60:45 | ... .unwrap() [tuple.0] | main.rs:60:9:60:20 | TuplePat [tuple.0] | provenance | | -| main.rs:60:34:60:35 | k1 | main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | provenance | MaD:29 | -| main.rs:61:31:61:32 | k2 | main.rs:61:13:61:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | +| main.rs:60:34:60:35 | k1 | main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | provenance | MaD:26 | +| main.rs:61:31:61:32 | k2 | main.rs:61:13:61:29 | ...::alloc | provenance | MaD:12 Sink:MaD:12 | | main.rs:62:9:62:20 | TuplePat [tuple.0] | main.rs:62:10:62:11 | k3 | provenance | | | main.rs:62:10:62:11 | k3 | main.rs:63:31:63:32 | k3 | provenance | | -| main.rs:62:24:62:25 | k1 | main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | provenance | MaD:30 | -| main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | main.rs:62:24:62:45 | ... .unwrap() [tuple.0] | provenance | MaD:41 | +| main.rs:62:24:62:25 | k1 | main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | provenance | MaD:27 | +| main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | main.rs:62:24:62:45 | ... .unwrap() [tuple.0] | provenance | MaD:38 | | main.rs:62:24:62:45 | ... .unwrap() [tuple.0] | main.rs:62:9:62:20 | TuplePat [tuple.0] | provenance | | -| main.rs:63:31:63:32 | k3 | main.rs:63:13:63:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | main.rs:64:31:64:59 | ... .unwrap() | provenance | MaD:41 | -| main.rs:64:31:64:59 | ... .unwrap() | main.rs:64:13:64:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:64:48:64:49 | k1 | main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | provenance | MaD:31 | -| main.rs:65:31:65:32 | k1 | main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | provenance | MaD:32 | -| main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | main.rs:65:31:65:59 | ... .unwrap() | provenance | MaD:41 | -| main.rs:65:31:65:59 | ... .unwrap() | main.rs:65:13:65:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | +| main.rs:63:31:63:32 | k3 | main.rs:63:13:63:29 | ...::alloc | provenance | MaD:12 Sink:MaD:12 | +| main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | main.rs:64:31:64:59 | ... .unwrap() | provenance | MaD:38 | +| main.rs:64:31:64:59 | ... .unwrap() | main.rs:64:13:64:29 | ...::alloc | provenance | MaD:12 Sink:MaD:12 | +| main.rs:64:48:64:49 | k1 | main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | provenance | MaD:28 | +| main.rs:65:31:65:32 | k1 | main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | provenance | MaD:29 | +| main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | main.rs:65:31:65:59 | ... .unwrap() | provenance | MaD:38 | +| main.rs:65:31:65:59 | ... .unwrap() | main.rs:65:13:65:29 | ...::alloc | provenance | MaD:12 Sink:MaD:12 | | main.rs:67:9:67:10 | l4 | main.rs:68:31:68:32 | l4 | provenance | | -| main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | main.rs:67:14:67:56 | ... .unwrap() | provenance | MaD:41 | +| main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | main.rs:67:14:67:56 | ... .unwrap() | provenance | MaD:38 | | main.rs:67:14:67:56 | ... .unwrap() | main.rs:67:9:67:10 | l4 | provenance | | -| main.rs:67:46:67:46 | v | main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | -| main.rs:68:31:68:32 | l4 | main.rs:68:13:68:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | +| main.rs:67:46:67:46 | v | main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | +| main.rs:68:31:68:32 | l4 | main.rs:68:13:68:29 | ...::alloc | provenance | MaD:12 Sink:MaD:12 | | main.rs:86:35:86:42 | ...: usize | main.rs:87:54:87:54 | v | provenance | | | main.rs:87:9:87:14 | layout | main.rs:88:31:88:36 | layout | provenance | | -| main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | main.rs:87:18:87:67 | ... .unwrap() | provenance | MaD:41 | +| main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | main.rs:87:18:87:67 | ... .unwrap() | provenance | MaD:38 | | main.rs:87:18:87:67 | ... .unwrap() | main.rs:87:9:87:14 | layout | provenance | | -| main.rs:87:54:87:54 | v | main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | provenance | MaD:33 | -| main.rs:88:31:88:36 | layout | main.rs:88:13:88:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | +| main.rs:87:54:87:54 | v | main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | provenance | MaD:30 | +| main.rs:88:31:88:36 | layout | main.rs:88:13:88:29 | ...::alloc | provenance | MaD:12 Sink:MaD:12 | | main.rs:91:38:91:45 | ...: usize | main.rs:92:47:92:47 | v | provenance | | | main.rs:91:38:91:45 | ...: usize | main.rs:101:51:101:51 | v | provenance | | | main.rs:91:38:91:45 | ...: usize | main.rs:105:33:105:33 | v | provenance | | @@ -168,131 +165,125 @@ edges | main.rs:91:38:91:45 | ...: usize | main.rs:161:55:161:55 | v | provenance | | | main.rs:92:9:92:10 | l1 | main.rs:96:35:96:36 | l1 | provenance | | | main.rs:92:9:92:10 | l1 | main.rs:102:35:102:36 | l1 | provenance | | -| main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | main.rs:92:14:92:57 | ... .unwrap() | provenance | MaD:41 | +| main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | main.rs:92:14:92:57 | ... .unwrap() | provenance | MaD:38 | | main.rs:92:14:92:57 | ... .unwrap() | main.rs:92:9:92:10 | l1 | provenance | | -| main.rs:92:47:92:47 | v | main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | -| main.rs:96:35:96:36 | l1 | main.rs:96:17:96:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | +| main.rs:92:47:92:47 | v | main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | +| main.rs:96:35:96:36 | l1 | main.rs:96:17:96:33 | ...::alloc | provenance | MaD:12 Sink:MaD:12 | | main.rs:96:35:96:36 | l1 | main.rs:109:35:109:36 | l1 | provenance | | | main.rs:96:35:96:36 | l1 | main.rs:111:35:111:36 | l1 | provenance | | | main.rs:101:13:101:14 | l3 | main.rs:103:35:103:36 | l3 | provenance | | -| main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | main.rs:101:18:101:61 | ... .unwrap() | provenance | MaD:41 | +| main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | main.rs:101:18:101:61 | ... .unwrap() | provenance | MaD:38 | | main.rs:101:18:101:61 | ... .unwrap() | main.rs:101:13:101:14 | l3 | provenance | | -| main.rs:101:51:101:51 | v | main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | -| main.rs:102:35:102:36 | l1 | main.rs:102:17:102:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | +| main.rs:101:51:101:51 | v | main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | +| main.rs:102:35:102:36 | l1 | main.rs:102:17:102:33 | ...::alloc | provenance | MaD:12 Sink:MaD:12 | | main.rs:102:35:102:36 | l1 | main.rs:109:35:109:36 | l1 | provenance | | | main.rs:102:35:102:36 | l1 | main.rs:111:35:111:36 | l1 | provenance | | -| main.rs:103:35:103:36 | l3 | main.rs:103:17:103:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | +| main.rs:103:35:103:36 | l3 | main.rs:103:17:103:33 | ...::alloc | provenance | MaD:12 Sink:MaD:12 | | main.rs:105:33:105:33 | v | main.rs:86:35:86:42 | ...: usize | provenance | | -| main.rs:109:35:109:36 | l1 | main.rs:109:17:109:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | +| main.rs:109:35:109:36 | l1 | main.rs:109:17:109:33 | ...::alloc | provenance | MaD:12 Sink:MaD:12 | | main.rs:109:35:109:36 | l1 | main.rs:146:35:146:36 | l1 | provenance | | -| main.rs:111:35:111:36 | l1 | main.rs:111:17:111:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | +| main.rs:111:35:111:36 | l1 | main.rs:111:17:111:33 | ...::alloc | provenance | MaD:12 Sink:MaD:12 | | main.rs:111:35:111:36 | l1 | main.rs:146:35:146:36 | l1 | provenance | | | main.rs:145:13:145:14 | l9 | main.rs:148:35:148:36 | l9 | provenance | | -| main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | main.rs:145:18:145:61 | ... .unwrap() | provenance | MaD:41 | +| main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | main.rs:145:18:145:61 | ... .unwrap() | provenance | MaD:38 | | main.rs:145:18:145:61 | ... .unwrap() | main.rs:145:13:145:14 | l9 | provenance | | -| main.rs:145:51:145:51 | v | main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | -| main.rs:146:35:146:36 | l1 | main.rs:146:17:146:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | +| main.rs:145:51:145:51 | v | main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | +| main.rs:146:35:146:36 | l1 | main.rs:146:17:146:33 | ...::alloc | provenance | MaD:12 Sink:MaD:12 | | main.rs:146:35:146:36 | l1 | main.rs:177:31:177:32 | l1 | provenance | | -| main.rs:148:35:148:36 | l9 | main.rs:148:17:148:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | +| main.rs:148:35:148:36 | l9 | main.rs:148:17:148:33 | ...::alloc | provenance | MaD:12 Sink:MaD:12 | | main.rs:151:9:151:11 | l10 | main.rs:152:31:152:33 | l10 | provenance | | -| main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | main.rs:151:15:151:78 | ... .unwrap() | provenance | MaD:41 | +| main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | main.rs:151:15:151:78 | ... .unwrap() | provenance | MaD:38 | | main.rs:151:15:151:78 | ... .unwrap() | main.rs:151:9:151:11 | l10 | provenance | | -| main.rs:151:48:151:68 | ...::min(...) | main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | -| main.rs:151:62:151:62 | v | main.rs:151:48:151:68 | ...::min(...) | provenance | MaD:43 | -| main.rs:152:31:152:33 | l10 | main.rs:152:13:152:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | +| main.rs:151:48:151:68 | ...::min(...) | main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | +| main.rs:151:62:151:62 | v | main.rs:151:48:151:68 | ...::min(...) | provenance | MaD:40 | +| main.rs:152:31:152:33 | l10 | main.rs:152:13:152:29 | ...::alloc | provenance | MaD:12 Sink:MaD:12 | | main.rs:154:9:154:11 | l11 | main.rs:155:31:155:33 | l11 | provenance | | -| main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | main.rs:154:15:154:78 | ... .unwrap() | provenance | MaD:41 | +| main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | main.rs:154:15:154:78 | ... .unwrap() | provenance | MaD:38 | | main.rs:154:15:154:78 | ... .unwrap() | main.rs:154:9:154:11 | l11 | provenance | | -| main.rs:154:48:154:68 | ...::max(...) | main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | -| main.rs:154:62:154:62 | v | main.rs:154:48:154:68 | ...::max(...) | provenance | MaD:42 | -| main.rs:155:31:155:33 | l11 | main.rs:155:13:155:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | +| main.rs:154:48:154:68 | ...::max(...) | main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | +| main.rs:154:62:154:62 | v | main.rs:154:48:154:68 | ...::max(...) | provenance | MaD:39 | +| main.rs:155:31:155:33 | l11 | main.rs:155:13:155:29 | ...::alloc | provenance | MaD:12 Sink:MaD:12 | | main.rs:161:13:161:15 | l13 | main.rs:162:35:162:37 | l13 | provenance | | -| main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | main.rs:161:19:161:68 | ... .unwrap() | provenance | MaD:41 | +| main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | main.rs:161:19:161:68 | ... .unwrap() | provenance | MaD:38 | | main.rs:161:19:161:68 | ... .unwrap() | main.rs:161:13:161:15 | l13 | provenance | | -| main.rs:161:55:161:55 | v | main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | provenance | MaD:33 | -| main.rs:162:35:162:37 | l13 | main.rs:162:17:162:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | +| main.rs:161:55:161:55 | v | main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | provenance | MaD:30 | +| main.rs:162:35:162:37 | l13 | main.rs:162:17:162:33 | ...::alloc | provenance | MaD:12 Sink:MaD:12 | | main.rs:162:35:162:37 | l13 | main.rs:169:35:169:37 | l13 | provenance | | -| main.rs:169:35:169:37 | l13 | main.rs:169:17:169:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:177:31:177:32 | l1 | main.rs:177:13:177:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | +| main.rs:169:35:169:37 | l13 | main.rs:169:17:169:33 | ...::alloc | provenance | MaD:12 Sink:MaD:12 | +| main.rs:177:31:177:32 | l1 | main.rs:177:13:177:29 | ...::alloc | provenance | MaD:12 Sink:MaD:12 | | main.rs:183:29:183:36 | ...: usize | main.rs:192:46:192:46 | v | provenance | | -| main.rs:183:29:183:36 | ...: usize | main.rs:202:48:202:48 | v | provenance | | -| main.rs:192:9:192:10 | l2 | main.rs:193:38:193:39 | l2 | provenance | | -| main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | main.rs:192:14:192:56 | ... .unwrap() | provenance | MaD:41 | +| main.rs:192:9:192:10 | l2 | main.rs:197:41:197:42 | l2 | provenance | | +| main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | main.rs:192:14:192:56 | ... .unwrap() | provenance | MaD:38 | | main.rs:192:14:192:56 | ... .unwrap() | main.rs:192:9:192:10 | l2 | provenance | | -| main.rs:192:46:192:46 | v | main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | -| main.rs:193:38:193:39 | l2 | main.rs:193:32:193:36 | alloc | provenance | MaD:12 Sink:MaD:12 | -| main.rs:193:38:193:39 | l2 | main.rs:194:45:194:46 | l2 | provenance | | -| main.rs:194:45:194:46 | l2 | main.rs:194:32:194:43 | alloc_zeroed | provenance | MaD:13 Sink:MaD:13 | -| main.rs:194:45:194:46 | l2 | main.rs:195:41:195:42 | l2 | provenance | | -| main.rs:195:41:195:42 | l2 | main.rs:195:32:195:39 | allocate | provenance | MaD:7 Sink:MaD:7 | -| main.rs:195:41:195:42 | l2 | main.rs:196:48:196:49 | l2 | provenance | | -| main.rs:196:48:196:49 | l2 | main.rs:196:32:196:46 | allocate_zeroed | provenance | MaD:8 Sink:MaD:8 | -| main.rs:196:48:196:49 | l2 | main.rs:197:41:197:42 | l2 | provenance | | -| main.rs:197:41:197:42 | l2 | main.rs:197:32:197:39 | allocate | provenance | MaD:1 Sink:MaD:1 | +| main.rs:192:46:192:46 | v | main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | +| main.rs:197:41:197:42 | l2 | main.rs:197:32:197:39 | allocate | provenance | MaD:7 Sink:MaD:7 | | main.rs:197:41:197:42 | l2 | main.rs:198:48:198:49 | l2 | provenance | | -| main.rs:198:48:198:49 | l2 | main.rs:198:32:198:46 | allocate_zeroed | provenance | MaD:2 Sink:MaD:2 | -| main.rs:198:48:198:49 | l2 | main.rs:208:53:208:54 | l2 | provenance | | -| main.rs:198:48:198:49 | l2 | main.rs:210:60:210:61 | l2 | provenance | | -| main.rs:198:48:198:49 | l2 | main.rs:213:51:213:52 | l2 | provenance | | -| main.rs:202:48:202:48 | v | main.rs:202:32:202:38 | realloc | provenance | MaD:14 Sink:MaD:14 | -| main.rs:208:53:208:54 | l2 | main.rs:208:40:208:43 | grow | provenance | MaD:9 Sink:MaD:9 | -| main.rs:210:60:210:61 | l2 | main.rs:210:40:210:50 | grow_zeroed | provenance | MaD:10 Sink:MaD:10 | -| main.rs:213:51:213:52 | l2 | main.rs:213:36:213:41 | shrink | provenance | MaD:11 Sink:MaD:11 | -| main.rs:217:27:217:34 | ...: usize | main.rs:219:26:219:26 | v | provenance | | -| main.rs:219:26:219:26 | v | main.rs:219:13:219:24 | ...::malloc | provenance | MaD:20 Sink:MaD:20 | -| main.rs:219:26:219:26 | v | main.rs:220:36:220:36 | v | provenance | | -| main.rs:220:36:220:36 | v | main.rs:220:13:220:31 | ...::aligned_alloc | provenance | MaD:18 Sink:MaD:18 | -| main.rs:220:36:220:36 | v | main.rs:222:30:222:30 | v | provenance | | -| main.rs:222:30:222:30 | v | main.rs:222:13:222:24 | ...::calloc | provenance | MaD:19 Sink:MaD:19 | -| main.rs:222:30:222:30 | v | main.rs:223:26:223:26 | v | provenance | | -| main.rs:223:26:223:26 | v | main.rs:223:13:223:24 | ...::calloc | provenance | MaD:19 Sink:MaD:19 | -| main.rs:223:26:223:26 | v | main.rs:224:31:224:31 | v | provenance | | -| main.rs:224:31:224:31 | v | main.rs:224:13:224:25 | ...::realloc | provenance | MaD:21 Sink:MaD:21 | -| main.rs:227:24:227:31 | ...: usize | main.rs:228:43:228:43 | v | provenance | | -| main.rs:228:43:228:43 | v | main.rs:228:13:228:41 | ...::try_with_capacity | provenance | MaD:3 Sink:MaD:3 | -| main.rs:228:43:228:43 | v | main.rs:229:39:229:39 | v | provenance | | -| main.rs:229:39:229:39 | v | main.rs:229:13:229:37 | ...::with_capacity | provenance | MaD:5 Sink:MaD:5 | -| main.rs:229:39:229:39 | v | main.rs:230:46:230:46 | v | provenance | | -| main.rs:230:46:230:46 | v | main.rs:230:13:230:44 | ...::try_with_capacity_in | provenance | MaD:4 Sink:MaD:4 | -| main.rs:230:46:230:46 | v | main.rs:231:42:231:42 | v | provenance | | -| main.rs:231:42:231:42 | v | main.rs:231:13:231:40 | ...::with_capacity_in | provenance | MaD:6 Sink:MaD:6 | -| main.rs:282:24:282:41 | ...: String | main.rs:283:21:283:30 | user_input | provenance | | -| main.rs:283:9:283:17 | num_bytes | main.rs:285:54:285:62 | num_bytes | provenance | | -| main.rs:283:21:283:30 | user_input | main.rs:283:21:283:47 | user_input.parse() [Ok] | provenance | MaD:26 | -| main.rs:283:21:283:47 | user_input.parse() [Ok] | main.rs:283:21:283:48 | TryExpr | provenance | | -| main.rs:283:21:283:48 | TryExpr | main.rs:283:21:283:77 | ... * ... | provenance | MaD:25 | -| main.rs:283:21:283:77 | ... * ... | main.rs:283:9:283:17 | num_bytes | provenance | | -| main.rs:285:9:285:14 | layout | main.rs:287:40:287:45 | layout | provenance | | -| main.rs:285:18:285:66 | ...::from_size_align(...) [Ok] | main.rs:285:18:285:75 | ... .unwrap() | provenance | MaD:41 | -| main.rs:285:18:285:75 | ... .unwrap() | main.rs:285:9:285:14 | layout | provenance | | -| main.rs:285:54:285:62 | num_bytes | main.rs:285:18:285:66 | ...::from_size_align(...) [Ok] | provenance | MaD:33 | -| main.rs:287:40:287:45 | layout | main.rs:287:22:287:38 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:311:25:311:38 | ...::args | main.rs:311:25:311:40 | ...::args(...) [element] | provenance | Src:MaD:22 | -| main.rs:311:25:311:40 | ...::args(...) [element] | main.rs:311:25:311:47 | ... .nth(...) [Some] | provenance | MaD:23 | -| main.rs:311:25:311:47 | ... .nth(...) [Some] | main.rs:311:25:311:74 | ... .unwrap_or(...) | provenance | MaD:39 | -| main.rs:311:25:311:74 | ... .unwrap_or(...) | main.rs:282:24:282:41 | ...: String | provenance | | -| main.rs:317:26:317:33 | ...: usize | main.rs:331:26:331:26 | a | provenance | | -| main.rs:331:26:331:26 | a | main.rs:331:13:331:24 | ...::malloc | provenance | MaD:20 Sink:MaD:20 | -| main.rs:339:9:339:9 | v | main.rs:342:34:342:34 | v | provenance | | -| main.rs:339:9:339:9 | v | main.rs:343:42:343:42 | v | provenance | | -| main.rs:339:9:339:9 | v | main.rs:344:36:344:36 | v | provenance | | -| main.rs:339:9:339:9 | v | main.rs:345:27:345:27 | v | provenance | | -| main.rs:339:9:339:9 | v | main.rs:346:25:346:25 | v | provenance | | -| main.rs:339:9:339:9 | v | main.rs:347:22:347:22 | v | provenance | | -| main.rs:339:9:339:9 | v | main.rs:349:24:349:24 | v | provenance | | -| main.rs:339:13:339:26 | ...::args | main.rs:339:13:339:28 | ...::args(...) [element] | provenance | Src:MaD:22 | -| main.rs:339:13:339:28 | ...::args(...) [element] | main.rs:339:13:339:35 | ... .nth(...) [Some] | provenance | MaD:23 | -| main.rs:339:13:339:35 | ... .nth(...) [Some] | main.rs:339:13:339:65 | ... .unwrap_or(...) | provenance | MaD:39 | -| main.rs:339:13:339:65 | ... .unwrap_or(...) | main.rs:339:13:339:82 | ... .parse() [Ok] | provenance | MaD:26 | -| main.rs:339:13:339:82 | ... .parse() [Ok] | main.rs:339:13:339:91 | ... .unwrap() | provenance | MaD:41 | -| main.rs:339:13:339:91 | ... .unwrap() | main.rs:339:9:339:9 | v | provenance | | -| main.rs:342:34:342:34 | v | main.rs:12:36:12:43 | ...: usize | provenance | | -| main.rs:343:42:343:42 | v | main.rs:43:44:43:51 | ...: usize | provenance | | -| main.rs:344:36:344:36 | v | main.rs:91:38:91:45 | ...: usize | provenance | | -| main.rs:345:27:345:27 | v | main.rs:183:29:183:36 | ...: usize | provenance | | -| main.rs:346:25:346:25 | v | main.rs:217:27:217:34 | ...: usize | provenance | | -| main.rs:347:22:347:22 | v | main.rs:227:24:227:31 | ...: usize | provenance | | -| main.rs:349:24:349:24 | v | main.rs:317:26:317:33 | ...: usize | provenance | | +| main.rs:198:48:198:49 | l2 | main.rs:198:32:198:46 | allocate_zeroed | provenance | MaD:8 Sink:MaD:8 | +| main.rs:198:48:198:49 | l2 | main.rs:199:41:199:42 | l2 | provenance | | +| main.rs:199:41:199:42 | l2 | main.rs:199:32:199:39 | allocate | provenance | MaD:1 Sink:MaD:1 | +| main.rs:199:41:199:42 | l2 | main.rs:200:48:200:49 | l2 | provenance | | +| main.rs:200:48:200:49 | l2 | main.rs:200:32:200:46 | allocate_zeroed | provenance | MaD:2 Sink:MaD:2 | +| main.rs:200:48:200:49 | l2 | main.rs:211:53:211:54 | l2 | provenance | | +| main.rs:200:48:200:49 | l2 | main.rs:213:60:213:61 | l2 | provenance | | +| main.rs:200:48:200:49 | l2 | main.rs:216:51:216:52 | l2 | provenance | | +| main.rs:211:53:211:54 | l2 | main.rs:211:40:211:43 | grow | provenance | MaD:9 Sink:MaD:9 | +| main.rs:213:60:213:61 | l2 | main.rs:213:40:213:50 | grow_zeroed | provenance | MaD:10 Sink:MaD:10 | +| main.rs:216:51:216:52 | l2 | main.rs:216:36:216:41 | shrink | provenance | MaD:11 Sink:MaD:11 | +| main.rs:220:27:220:34 | ...: usize | main.rs:222:26:222:26 | v | provenance | | +| main.rs:222:26:222:26 | v | main.rs:222:13:222:24 | ...::malloc | provenance | MaD:17 Sink:MaD:17 | +| main.rs:222:26:222:26 | v | main.rs:223:36:223:36 | v | provenance | | +| main.rs:223:36:223:36 | v | main.rs:223:13:223:31 | ...::aligned_alloc | provenance | MaD:15 Sink:MaD:15 | +| main.rs:223:36:223:36 | v | main.rs:225:30:225:30 | v | provenance | | +| main.rs:225:30:225:30 | v | main.rs:225:13:225:24 | ...::calloc | provenance | MaD:16 Sink:MaD:16 | +| main.rs:225:30:225:30 | v | main.rs:226:26:226:26 | v | provenance | | +| main.rs:226:26:226:26 | v | main.rs:226:13:226:24 | ...::calloc | provenance | MaD:16 Sink:MaD:16 | +| main.rs:226:26:226:26 | v | main.rs:227:31:227:31 | v | provenance | | +| main.rs:227:31:227:31 | v | main.rs:227:13:227:25 | ...::realloc | provenance | MaD:18 Sink:MaD:18 | +| main.rs:230:24:230:31 | ...: usize | main.rs:231:43:231:43 | v | provenance | | +| main.rs:231:43:231:43 | v | main.rs:231:13:231:41 | ...::try_with_capacity | provenance | MaD:3 Sink:MaD:3 | +| main.rs:231:43:231:43 | v | main.rs:232:39:232:39 | v | provenance | | +| main.rs:232:39:232:39 | v | main.rs:232:13:232:37 | ...::with_capacity | provenance | MaD:5 Sink:MaD:5 | +| main.rs:232:39:232:39 | v | main.rs:233:46:233:46 | v | provenance | | +| main.rs:233:46:233:46 | v | main.rs:233:13:233:44 | ...::try_with_capacity_in | provenance | MaD:4 Sink:MaD:4 | +| main.rs:233:46:233:46 | v | main.rs:234:42:234:42 | v | provenance | | +| main.rs:234:42:234:42 | v | main.rs:234:13:234:40 | ...::with_capacity_in | provenance | MaD:6 Sink:MaD:6 | +| main.rs:285:24:285:41 | ...: String | main.rs:286:21:286:30 | user_input | provenance | | +| main.rs:286:9:286:17 | num_bytes | main.rs:288:54:288:62 | num_bytes | provenance | | +| main.rs:286:21:286:30 | user_input | main.rs:286:21:286:47 | user_input.parse() [Ok] | provenance | MaD:23 | +| main.rs:286:21:286:47 | user_input.parse() [Ok] | main.rs:286:21:286:48 | TryExpr | provenance | | +| main.rs:286:21:286:48 | TryExpr | main.rs:286:21:286:77 | ... * ... | provenance | MaD:22 | +| main.rs:286:21:286:77 | ... * ... | main.rs:286:9:286:17 | num_bytes | provenance | | +| main.rs:288:9:288:14 | layout | main.rs:290:40:290:45 | layout | provenance | | +| main.rs:288:18:288:66 | ...::from_size_align(...) [Ok] | main.rs:288:18:288:75 | ... .unwrap() | provenance | MaD:38 | +| main.rs:288:18:288:75 | ... .unwrap() | main.rs:288:9:288:14 | layout | provenance | | +| main.rs:288:54:288:62 | num_bytes | main.rs:288:18:288:66 | ...::from_size_align(...) [Ok] | provenance | MaD:30 | +| main.rs:290:40:290:45 | layout | main.rs:290:22:290:38 | ...::alloc | provenance | MaD:12 Sink:MaD:12 | +| main.rs:314:25:314:38 | ...::args | main.rs:314:25:314:40 | ...::args(...) [element] | provenance | Src:MaD:19 | +| main.rs:314:25:314:40 | ...::args(...) [element] | main.rs:314:25:314:47 | ... .nth(...) [Some] | provenance | MaD:20 | +| main.rs:314:25:314:47 | ... .nth(...) [Some] | main.rs:314:25:314:74 | ... .unwrap_or(...) | provenance | MaD:36 | +| main.rs:314:25:314:74 | ... .unwrap_or(...) | main.rs:285:24:285:41 | ...: String | provenance | | +| main.rs:320:26:320:33 | ...: usize | main.rs:334:26:334:26 | a | provenance | | +| main.rs:334:26:334:26 | a | main.rs:334:13:334:24 | ...::malloc | provenance | MaD:17 Sink:MaD:17 | +| main.rs:342:9:342:9 | v | main.rs:345:34:345:34 | v | provenance | | +| main.rs:342:9:342:9 | v | main.rs:346:42:346:42 | v | provenance | | +| main.rs:342:9:342:9 | v | main.rs:347:36:347:36 | v | provenance | | +| main.rs:342:9:342:9 | v | main.rs:348:27:348:27 | v | provenance | | +| main.rs:342:9:342:9 | v | main.rs:349:25:349:25 | v | provenance | | +| main.rs:342:9:342:9 | v | main.rs:350:22:350:22 | v | provenance | | +| main.rs:342:9:342:9 | v | main.rs:352:24:352:24 | v | provenance | | +| main.rs:342:13:342:26 | ...::args | main.rs:342:13:342:28 | ...::args(...) [element] | provenance | Src:MaD:19 | +| main.rs:342:13:342:28 | ...::args(...) [element] | main.rs:342:13:342:35 | ... .nth(...) [Some] | provenance | MaD:20 | +| main.rs:342:13:342:35 | ... .nth(...) [Some] | main.rs:342:13:342:65 | ... .unwrap_or(...) | provenance | MaD:36 | +| main.rs:342:13:342:65 | ... .unwrap_or(...) | main.rs:342:13:342:82 | ... .parse() [Ok] | provenance | MaD:23 | +| main.rs:342:13:342:82 | ... .parse() [Ok] | main.rs:342:13:342:91 | ... .unwrap() | provenance | MaD:38 | +| main.rs:342:13:342:91 | ... .unwrap() | main.rs:342:9:342:9 | v | provenance | | +| main.rs:345:34:345:34 | v | main.rs:12:36:12:43 | ...: usize | provenance | | +| main.rs:346:42:346:42 | v | main.rs:43:44:43:51 | ...: usize | provenance | | +| main.rs:347:36:347:36 | v | main.rs:91:38:91:45 | ...: usize | provenance | | +| main.rs:348:27:348:27 | v | main.rs:183:29:183:36 | ...: usize | provenance | | +| main.rs:349:25:349:25 | v | main.rs:220:27:220:34 | ...: usize | provenance | | +| main.rs:350:22:350:22 | v | main.rs:230:24:230:31 | ...: usize | provenance | | +| main.rs:352:24:352:24 | v | main.rs:320:26:320:33 | ...: usize | provenance | | models | 1 | Sink: ::allocate; Argument[0]; alloc-layout | | 2 | Sink: ::allocate_zeroed; Argument[0]; alloc-layout | @@ -305,38 +296,35 @@ models | 9 | Sink: ::grow; Argument[2]; alloc-size | | 10 | Sink: ::grow_zeroed; Argument[2]; alloc-size | | 11 | Sink: ::shrink; Argument[2]; alloc-size | -| 12 | Sink: ::alloc; Argument[0]; alloc-size | -| 13 | Sink: ::alloc_zeroed; Argument[0]; alloc-size | -| 14 | Sink: ::realloc; Argument[2]; alloc-size | -| 15 | Sink: alloc::alloc::alloc; Argument[0]; alloc-layout | -| 16 | Sink: alloc::alloc::alloc_zeroed; Argument[0]; alloc-layout | -| 17 | Sink: alloc::alloc::realloc; Argument[2]; alloc-size | -| 18 | Sink: libc::unix::aligned_alloc; Argument[1]; alloc-size | -| 19 | Sink: libc::unix::calloc; Argument[0,1]; alloc-size | -| 20 | Sink: libc::unix::malloc; Argument[0]; alloc-size | -| 21 | Sink: libc::unix::realloc; Argument[1]; alloc-size | -| 22 | Source: std::env::args; ReturnValue.Element; commandargs | -| 23 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 24 | Summary: <_ as core::ops::arith::Add>::add; Argument[self,0]; ReturnValue; taint | -| 25 | Summary: <_ as core::ops::arith::Mul>::mul; Argument[self,0]; ReturnValue; taint | -| 26 | Summary: ::deref; Argument[self]; ReturnValue; value | -| 27 | Summary: ::align_to; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 28 | Summary: ::array; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 29 | Summary: ::extend; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | -| 30 | Summary: ::extend; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | -| 31 | Summary: ::extend_packed; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 32 | Summary: ::extend_packed; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 33 | Summary: ::from_size_align; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 34 | Summary: ::from_size_align_unchecked; Argument[0]; ReturnValue; taint | -| 35 | Summary: ::pad_to_align; Argument[self].Reference; ReturnValue; taint | -| 36 | Summary: ::repeat; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | -| 37 | Summary: ::repeat_packed; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 38 | Summary: ::size; Argument[self].Reference; ReturnValue; taint | -| 39 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 40 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 41 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 42 | Summary: core::cmp::max; Argument[0]; ReturnValue; value | -| 43 | Summary: core::cmp::min; Argument[0]; ReturnValue; value | +| 12 | Sink: alloc::alloc::alloc; Argument[0]; alloc-layout | +| 13 | Sink: alloc::alloc::alloc_zeroed; Argument[0]; alloc-layout | +| 14 | Sink: alloc::alloc::realloc; Argument[2]; alloc-size | +| 15 | Sink: libc::unix::aligned_alloc; Argument[1]; alloc-size | +| 16 | Sink: libc::unix::calloc; Argument[0,1]; alloc-size | +| 17 | Sink: libc::unix::malloc; Argument[0]; alloc-size | +| 18 | Sink: libc::unix::realloc; Argument[1]; alloc-size | +| 19 | Source: std::env::args; ReturnValue.Element; commandargs | +| 20 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 21 | Summary: <_ as core::ops::arith::Add>::add; Argument[self,0]; ReturnValue; taint | +| 22 | Summary: <_ as core::ops::arith::Mul>::mul; Argument[self,0]; ReturnValue; taint | +| 23 | Summary: ::deref; Argument[self]; ReturnValue; value | +| 24 | Summary: ::align_to; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 25 | Summary: ::array; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 26 | Summary: ::extend; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | +| 27 | Summary: ::extend; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | +| 28 | Summary: ::extend_packed; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 29 | Summary: ::extend_packed; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 30 | Summary: ::from_size_align; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 31 | Summary: ::from_size_align_unchecked; Argument[0]; ReturnValue; taint | +| 32 | Summary: ::pad_to_align; Argument[self].Reference; ReturnValue; taint | +| 33 | Summary: ::repeat; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | +| 34 | Summary: ::repeat_packed; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 35 | Summary: ::size; Argument[self].Reference; ReturnValue; taint | +| 36 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 37 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 38 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 39 | Summary: core::cmp::max; Argument[0]; ReturnValue; value | +| 40 | Summary: core::cmp::min; Argument[0]; ReturnValue; value | nodes | main.rs:12:36:12:43 | ...: usize | semmle.label | ...: usize | | main.rs:18:13:18:31 | ...::realloc | semmle.label | ...::realloc | @@ -504,77 +492,71 @@ nodes | main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | semmle.label | ...::array::<...>(...) [Ok] | | main.rs:192:14:192:56 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:192:46:192:46 | v | semmle.label | v | -| main.rs:193:32:193:36 | alloc | semmle.label | alloc | -| main.rs:193:38:193:39 | l2 | semmle.label | l2 | -| main.rs:194:32:194:43 | alloc_zeroed | semmle.label | alloc_zeroed | -| main.rs:194:45:194:46 | l2 | semmle.label | l2 | -| main.rs:195:32:195:39 | allocate | semmle.label | allocate | -| main.rs:195:41:195:42 | l2 | semmle.label | l2 | -| main.rs:196:32:196:46 | allocate_zeroed | semmle.label | allocate_zeroed | -| main.rs:196:48:196:49 | l2 | semmle.label | l2 | | main.rs:197:32:197:39 | allocate | semmle.label | allocate | | main.rs:197:41:197:42 | l2 | semmle.label | l2 | | main.rs:198:32:198:46 | allocate_zeroed | semmle.label | allocate_zeroed | | main.rs:198:48:198:49 | l2 | semmle.label | l2 | -| main.rs:202:32:202:38 | realloc | semmle.label | realloc | -| main.rs:202:48:202:48 | v | semmle.label | v | -| main.rs:208:40:208:43 | grow | semmle.label | grow | -| main.rs:208:53:208:54 | l2 | semmle.label | l2 | -| main.rs:210:40:210:50 | grow_zeroed | semmle.label | grow_zeroed | -| main.rs:210:60:210:61 | l2 | semmle.label | l2 | -| main.rs:213:36:213:41 | shrink | semmle.label | shrink | -| main.rs:213:51:213:52 | l2 | semmle.label | l2 | -| main.rs:217:27:217:34 | ...: usize | semmle.label | ...: usize | -| main.rs:219:13:219:24 | ...::malloc | semmle.label | ...::malloc | -| main.rs:219:26:219:26 | v | semmle.label | v | -| main.rs:220:13:220:31 | ...::aligned_alloc | semmle.label | ...::aligned_alloc | -| main.rs:220:36:220:36 | v | semmle.label | v | -| main.rs:222:13:222:24 | ...::calloc | semmle.label | ...::calloc | -| main.rs:222:30:222:30 | v | semmle.label | v | -| main.rs:223:13:223:24 | ...::calloc | semmle.label | ...::calloc | -| main.rs:223:26:223:26 | v | semmle.label | v | -| main.rs:224:13:224:25 | ...::realloc | semmle.label | ...::realloc | -| main.rs:224:31:224:31 | v | semmle.label | v | -| main.rs:227:24:227:31 | ...: usize | semmle.label | ...: usize | -| main.rs:228:13:228:41 | ...::try_with_capacity | semmle.label | ...::try_with_capacity | -| main.rs:228:43:228:43 | v | semmle.label | v | -| main.rs:229:13:229:37 | ...::with_capacity | semmle.label | ...::with_capacity | -| main.rs:229:39:229:39 | v | semmle.label | v | -| main.rs:230:13:230:44 | ...::try_with_capacity_in | semmle.label | ...::try_with_capacity_in | -| main.rs:230:46:230:46 | v | semmle.label | v | -| main.rs:231:13:231:40 | ...::with_capacity_in | semmle.label | ...::with_capacity_in | -| main.rs:231:42:231:42 | v | semmle.label | v | -| main.rs:282:24:282:41 | ...: String | semmle.label | ...: String | -| main.rs:283:9:283:17 | num_bytes | semmle.label | num_bytes | -| main.rs:283:21:283:30 | user_input | semmle.label | user_input | -| main.rs:283:21:283:47 | user_input.parse() [Ok] | semmle.label | user_input.parse() [Ok] | -| main.rs:283:21:283:48 | TryExpr | semmle.label | TryExpr | -| main.rs:283:21:283:77 | ... * ... | semmle.label | ... * ... | -| main.rs:285:9:285:14 | layout | semmle.label | layout | -| main.rs:285:18:285:66 | ...::from_size_align(...) [Ok] | semmle.label | ...::from_size_align(...) [Ok] | -| main.rs:285:18:285:75 | ... .unwrap() | semmle.label | ... .unwrap() | -| main.rs:285:54:285:62 | num_bytes | semmle.label | num_bytes | -| main.rs:287:22:287:38 | ...::alloc | semmle.label | ...::alloc | -| main.rs:287:40:287:45 | layout | semmle.label | layout | -| main.rs:311:25:311:38 | ...::args | semmle.label | ...::args | -| main.rs:311:25:311:40 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | -| main.rs:311:25:311:47 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | -| main.rs:311:25:311:74 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | -| main.rs:317:26:317:33 | ...: usize | semmle.label | ...: usize | -| main.rs:331:13:331:24 | ...::malloc | semmle.label | ...::malloc | -| main.rs:331:26:331:26 | a | semmle.label | a | -| main.rs:339:9:339:9 | v | semmle.label | v | -| main.rs:339:13:339:26 | ...::args | semmle.label | ...::args | -| main.rs:339:13:339:28 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | -| main.rs:339:13:339:35 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | -| main.rs:339:13:339:65 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | -| main.rs:339:13:339:82 | ... .parse() [Ok] | semmle.label | ... .parse() [Ok] | -| main.rs:339:13:339:91 | ... .unwrap() | semmle.label | ... .unwrap() | -| main.rs:342:34:342:34 | v | semmle.label | v | -| main.rs:343:42:343:42 | v | semmle.label | v | -| main.rs:344:36:344:36 | v | semmle.label | v | -| main.rs:345:27:345:27 | v | semmle.label | v | -| main.rs:346:25:346:25 | v | semmle.label | v | -| main.rs:347:22:347:22 | v | semmle.label | v | -| main.rs:349:24:349:24 | v | semmle.label | v | +| main.rs:199:32:199:39 | allocate | semmle.label | allocate | +| main.rs:199:41:199:42 | l2 | semmle.label | l2 | +| main.rs:200:32:200:46 | allocate_zeroed | semmle.label | allocate_zeroed | +| main.rs:200:48:200:49 | l2 | semmle.label | l2 | +| main.rs:211:40:211:43 | grow | semmle.label | grow | +| main.rs:211:53:211:54 | l2 | semmle.label | l2 | +| main.rs:213:40:213:50 | grow_zeroed | semmle.label | grow_zeroed | +| main.rs:213:60:213:61 | l2 | semmle.label | l2 | +| main.rs:216:36:216:41 | shrink | semmle.label | shrink | +| main.rs:216:51:216:52 | l2 | semmle.label | l2 | +| main.rs:220:27:220:34 | ...: usize | semmle.label | ...: usize | +| main.rs:222:13:222:24 | ...::malloc | semmle.label | ...::malloc | +| main.rs:222:26:222:26 | v | semmle.label | v | +| main.rs:223:13:223:31 | ...::aligned_alloc | semmle.label | ...::aligned_alloc | +| main.rs:223:36:223:36 | v | semmle.label | v | +| main.rs:225:13:225:24 | ...::calloc | semmle.label | ...::calloc | +| main.rs:225:30:225:30 | v | semmle.label | v | +| main.rs:226:13:226:24 | ...::calloc | semmle.label | ...::calloc | +| main.rs:226:26:226:26 | v | semmle.label | v | +| main.rs:227:13:227:25 | ...::realloc | semmle.label | ...::realloc | +| main.rs:227:31:227:31 | v | semmle.label | v | +| main.rs:230:24:230:31 | ...: usize | semmle.label | ...: usize | +| main.rs:231:13:231:41 | ...::try_with_capacity | semmle.label | ...::try_with_capacity | +| main.rs:231:43:231:43 | v | semmle.label | v | +| main.rs:232:13:232:37 | ...::with_capacity | semmle.label | ...::with_capacity | +| main.rs:232:39:232:39 | v | semmle.label | v | +| main.rs:233:13:233:44 | ...::try_with_capacity_in | semmle.label | ...::try_with_capacity_in | +| main.rs:233:46:233:46 | v | semmle.label | v | +| main.rs:234:13:234:40 | ...::with_capacity_in | semmle.label | ...::with_capacity_in | +| main.rs:234:42:234:42 | v | semmle.label | v | +| main.rs:285:24:285:41 | ...: String | semmle.label | ...: String | +| main.rs:286:9:286:17 | num_bytes | semmle.label | num_bytes | +| main.rs:286:21:286:30 | user_input | semmle.label | user_input | +| main.rs:286:21:286:47 | user_input.parse() [Ok] | semmle.label | user_input.parse() [Ok] | +| main.rs:286:21:286:48 | TryExpr | semmle.label | TryExpr | +| main.rs:286:21:286:77 | ... * ... | semmle.label | ... * ... | +| main.rs:288:9:288:14 | layout | semmle.label | layout | +| main.rs:288:18:288:66 | ...::from_size_align(...) [Ok] | semmle.label | ...::from_size_align(...) [Ok] | +| main.rs:288:18:288:75 | ... .unwrap() | semmle.label | ... .unwrap() | +| main.rs:288:54:288:62 | num_bytes | semmle.label | num_bytes | +| main.rs:290:22:290:38 | ...::alloc | semmle.label | ...::alloc | +| main.rs:290:40:290:45 | layout | semmle.label | layout | +| main.rs:314:25:314:38 | ...::args | semmle.label | ...::args | +| main.rs:314:25:314:40 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | +| main.rs:314:25:314:47 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | +| main.rs:314:25:314:74 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | +| main.rs:320:26:320:33 | ...: usize | semmle.label | ...: usize | +| main.rs:334:13:334:24 | ...::malloc | semmle.label | ...::malloc | +| main.rs:334:26:334:26 | a | semmle.label | a | +| main.rs:342:9:342:9 | v | semmle.label | v | +| main.rs:342:13:342:26 | ...::args | semmle.label | ...::args | +| main.rs:342:13:342:28 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | +| main.rs:342:13:342:35 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | +| main.rs:342:13:342:65 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | +| main.rs:342:13:342:82 | ... .parse() [Ok] | semmle.label | ... .parse() [Ok] | +| main.rs:342:13:342:91 | ... .unwrap() | semmle.label | ... .unwrap() | +| main.rs:345:34:345:34 | v | semmle.label | v | +| main.rs:346:42:346:42 | v | semmle.label | v | +| main.rs:347:36:347:36 | v | semmle.label | v | +| main.rs:348:27:348:27 | v | semmle.label | v | +| main.rs:349:25:349:25 | v | semmle.label | v | +| main.rs:350:22:350:22 | v | semmle.label | v | +| main.rs:352:24:352:24 | v | semmle.label | v | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-770/main.rs b/rust/ql/test/query-tests/security/CWE-770/main.rs index 7ab9f9445fba..33f8ed6e8412 100644 --- a/rust/ql/test/query-tests/security/CWE-770/main.rs +++ b/rust/ql/test/query-tests/security/CWE-770/main.rs @@ -190,8 +190,10 @@ unsafe fn test_system_alloc(v: usize) { let _ = std::alloc::Global.allocate_zeroed(l1).unwrap(); let l2 = std::alloc::Layout::array::(v).unwrap(); - let _ = std::alloc::System.alloc(l2); // $ Alert[rust/uncontrolled-allocation-size]=arg1 - let _ = std::alloc::System.alloc_zeroed(l2); // $ Alert[rust/uncontrolled-allocation-size]=arg1 + // RA 0.0.347 no longer resolves the `GlobalAlloc` methods `System.alloc`/`alloc_zeroed`/`realloc`, + // so these sinks are no longer detected; tracked as MISSING pending a fix. + let _ = std::alloc::System.alloc(l2); // $ MISSING: Alert[rust/uncontrolled-allocation-size]=arg1 + let _ = std::alloc::System.alloc_zeroed(l2); // $ MISSING: Alert[rust/uncontrolled-allocation-size]=arg1 let _ = std::alloc::System.allocate(l2).unwrap(); // $ Alert[rust/uncontrolled-allocation-size]=arg1 let _ = std::alloc::System.allocate_zeroed(l2).unwrap(); // $ Alert[rust/uncontrolled-allocation-size]=arg1 let _ = std::alloc::Global.allocate(l2).unwrap(); // $ Alert[rust/uncontrolled-allocation-size]=arg1 @@ -199,7 +201,8 @@ unsafe fn test_system_alloc(v: usize) { let l3 = std::alloc::Layout::array::(10).unwrap(); let m3 = std::alloc::System.alloc(l3); - let _ = std::alloc::System.realloc(m3, l3, v); // $ Alert[rust/uncontrolled-allocation-size]=arg1 + // `System.realloc` unresolved by RA 0.0.347 (see note above); tracked as MISSING. + let _ = std::alloc::System.realloc(m3, l3, v); // $ MISSING: Alert[rust/uncontrolled-allocation-size]=arg1 let l4 = std::alloc::Layout::array::(10).unwrap(); let m4 = std::ptr::NonNull::::new(std::alloc::alloc(l4)).unwrap(); diff --git a/rust/ql/test/query-tests/unusedentities/options.yml b/rust/ql/test/query-tests/unusedentities/options.yml index a394083e5212..c2541fc242c2 100644 --- a/rust/ql/test/query-tests/unusedentities/options.yml +++ b/rust/ql/test/query-tests/unusedentities/options.yml @@ -1 +1,2 @@ qltest_use_nightly: true +qltest_edition: "2024" From 69660446fc530057f8365d36e2309a4d5986150f Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 14 Aug 2026 15:04:40 +0200 Subject: [PATCH 0318/2098] C#: add linux-arm64 to standalone_dependencies assembly path normalization Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../standalone_dependencies_executing_runtime/Assemblies.ql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_executing_runtime/Assemblies.ql b/csharp/ql/integration-tests/posix/standalone_dependencies_executing_runtime/Assemblies.ql index b5634fb7b96a..ec5297f39aa4 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_executing_runtime/Assemblies.ql +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_executing_runtime/Assemblies.ql @@ -3,7 +3,7 @@ import csharp private string getPath(Assembly a) { not a.getCompilation().getOutputAssembly() = a and exists(string s | s = a.getFile().getAbsolutePath() | - exists(string sub | sub = "csharp/tools/" + ["osx64", "linux64"] | + exists(string sub | sub = "csharp/tools/" + ["osx64", "linux64", "linux-arm64"] | result = "[...]/csharp/tools/[...]" + s.substring(s.indexOf(sub) + sub.length(), s.length()) ) or From e1b27ae7231e0fa8c19e30a884d617b3d6f9960c Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 14 Aug 2026 15:59:39 +0200 Subject: [PATCH 0319/2098] Rust: pin test toolchain to 1.95 for `use Struct::{self}` 1.96 turned `use SomeStruct::{self};` into a hard error (E0432), which broke the path-resolution test. 1.95 is the newest stable that still accepts it while also expanding the builtin `format_args!` macro against std. Re-accept the std-snapshot and format-arg/panic expansion changes that follow from the ra_ap 0.0.347 upgrade at this toolchain. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 890cb55d-0437-4bd7-9268-87b8897ada01 --- .../crate_graph/crates.expected | 24 +++++++++---------- .../controlflow/BasicBlocks.expected | 4 ---- .../library-tests/controlflow/Cfg.expected | 20 ++++------------ .../definitions/Definitions.expected | 6 ++--- rust/ql/test/rust-toolchain.toml | 9 +++++-- 5 files changed, 26 insertions(+), 37 deletions(-) diff --git a/rust/ql/test/extractor-tests/crate_graph/crates.expected b/rust/ql/test/extractor-tests/crate_graph/crates.expected index 8f1bb1590f44..4ed32f7692a9 100644 --- a/rust/ql/test/extractor-tests/crate_graph/crates.expected +++ b/rust/ql/test/extractor-tests/crate_graph/crates.expected @@ -57,12 +57,12 @@ #-----| core -> Crate(core@0.0.0) #-----| std -> Crate(std@0.0.0) -#-----| Crate(hashbrown@0.17.1) +#-----| Crate(hashbrown@0.16.1) #-----| alloc -> Crate(alloc@0.0.0) #-----| core -> Crate(core@0.0.0) #-----| foldhash -> Crate(foldhash@0.2.0) -#-----| Crate(libc@0.2.185) +#-----| Crate(libc@0.2.178) #-----| rustc_std_workspace_core -> Crate(core@0.0.0) main.rs: @@ -98,7 +98,7 @@ main.rs: #-----| Crate(panic_unwind@0.0.0) #-----| alloc -> Crate(alloc@0.0.0) #-----| core -> Crate(core@0.0.0) -#-----| libc -> Crate(libc@0.2.185) +#-----| libc -> Crate(libc@0.2.178) #-----| unwind -> Crate(unwind@0.0.0) #-----| Crate(proc_macro@0.0.0) @@ -123,27 +123,27 @@ main.rs: #-----| Crate(std@0.0.0) #-----| alloc -> Crate(alloc@0.0.0) #-----| core -> Crate(core@0.0.0) -#-----| panic_abort -> Crate(panic_abort@0.0.0) -#-----| libc -> Crate(libc@0.2.185) -#-----| unwind -> Crate(unwind@0.0.0) -#-----| panic_unwind -> Crate(panic_unwind@0.0.0) -#-----| std_detect -> Crate(std_detect@0.1.5) #-----| cfg_if -> Crate(cfg_if@1.0.4) -#-----| hashbrown -> Crate(hashbrown@0.17.1) +#-----| hashbrown -> Crate(hashbrown@0.16.1) +#-----| libc -> Crate(libc@0.2.178) #-----| rand -> Crate(rand@0.9.2) #-----| rand_xorshift -> Crate(rand_xorshift@0.4.0) #-----| rustc_demangle -> Crate(rustc_demangle@0.1.27) +#-----| panic_abort -> Crate(panic_abort@0.0.0) +#-----| unwind -> Crate(unwind@0.0.0) +#-----| panic_unwind -> Crate(panic_unwind@0.0.0) +#-----| std_detect -> Crate(std_detect@0.1.5) #-----| Crate(std_detect@0.1.5) #-----| alloc -> Crate(alloc@0.0.0) #-----| core -> Crate(core@0.0.0) -#-----| libc -> Crate(libc@0.2.185) +#-----| libc -> Crate(libc@0.2.178) #-----| Crate(test@0.0.0) #-----| core -> Crate(core@0.0.0) #-----| std -> Crate(std@0.0.0) -#-----| libc -> Crate(libc@0.2.185) #-----| getopts -> Crate(getopts@0.2.24) +#-----| libc -> Crate(libc@0.2.178) lib.rs: # 0| Crate(test@0.0.1) @@ -164,7 +164,7 @@ lib.rs: #-----| Crate(unwind@0.0.0) #-----| core -> Crate(core@0.0.0) -#-----| libc -> Crate(libc@0.2.185) +#-----| libc -> Crate(libc@0.2.178) #-----| Crate(version_check@0.9.5) #-----| proc_macro -> Crate(proc_macro@0.0.0) diff --git a/rust/ql/test/library-tests/controlflow/BasicBlocks.expected b/rust/ql/test/library-tests/controlflow/BasicBlocks.expected index 80357ae29f86..94760d6875e1 100644 --- a/rust/ql/test/library-tests/controlflow/BasicBlocks.expected +++ b/rust/ql/test/library-tests/controlflow/BasicBlocks.expected @@ -743,7 +743,6 @@ dominates | test.rs:529:5:537:5 | enter fn const_block_assert | test.rs:533:21:533:48 | [boolean(true)] ! ... | | test.rs:529:5:537:5 | enter fn const_block_assert | test.rs:533:21:533:48 | if ... {...} | | test.rs:533:13:533:19 | ExprStmt | test.rs:533:13:533:19 | ExprStmt | -| test.rs:533:13:533:19 | enter fn panic_cold_explicit | test.rs:533:13:533:19 | enter fn panic_cold_explicit | | test.rs:533:21:533:48 | [boolean(false)] ! ... | test.rs:533:21:533:48 | [boolean(false)] ! ... | | test.rs:533:21:533:48 | [boolean(true)] ! ... | test.rs:533:13:533:19 | ExprStmt | | test.rs:533:21:533:48 | [boolean(true)] ! ... | test.rs:533:21:533:48 | [boolean(true)] ! ... | @@ -751,7 +750,6 @@ dominates | test.rs:539:5:548:5 | enter fn const_block_panic | test.rs:539:5:548:5 | enter fn const_block_panic | | test.rs:539:5:548:5 | enter fn const_block_panic | test.rs:541:9:546:9 | if false {...} | | test.rs:541:9:546:9 | if false {...} | test.rs:541:9:546:9 | if false {...} | -| test.rs:544:17:544:22 | enter fn panic_cold_explicit | test.rs:544:17:544:22 | enter fn panic_cold_explicit | | test.rs:551:1:556:1 | enter fn dead_code | test.rs:551:1:556:1 | enter fn dead_code | | test.rs:551:1:556:1 | enter fn dead_code | test.rs:553:9:553:17 | ExprStmt | | test.rs:553:9:553:17 | ExprStmt | test.rs:553:9:553:17 | ExprStmt | @@ -1424,7 +1422,6 @@ postDominance | test.rs:529:5:537:5 | enter fn const_block_assert | test.rs:529:5:537:5 | enter fn const_block_assert | | test.rs:533:13:533:19 | ExprStmt | test.rs:533:13:533:19 | ExprStmt | | test.rs:533:13:533:19 | ExprStmt | test.rs:533:21:533:48 | [boolean(true)] ! ... | -| test.rs:533:13:533:19 | enter fn panic_cold_explicit | test.rs:533:13:533:19 | enter fn panic_cold_explicit | | test.rs:533:21:533:48 | [boolean(false)] ! ... | test.rs:533:21:533:48 | [boolean(false)] ! ... | | test.rs:533:21:533:48 | [boolean(true)] ! ... | test.rs:533:21:533:48 | [boolean(true)] ! ... | | test.rs:533:21:533:48 | if ... {...} | test.rs:529:5:537:5 | enter fn const_block_assert | @@ -1435,7 +1432,6 @@ postDominance | test.rs:539:5:548:5 | enter fn const_block_panic | test.rs:539:5:548:5 | enter fn const_block_panic | | test.rs:541:9:546:9 | if false {...} | test.rs:539:5:548:5 | enter fn const_block_panic | | test.rs:541:9:546:9 | if false {...} | test.rs:541:9:546:9 | if false {...} | -| test.rs:544:17:544:22 | enter fn panic_cold_explicit | test.rs:544:17:544:22 | enter fn panic_cold_explicit | | test.rs:551:1:556:1 | enter fn dead_code | test.rs:551:1:556:1 | enter fn dead_code | | test.rs:553:9:553:17 | ExprStmt | test.rs:551:1:556:1 | enter fn dead_code | | test.rs:553:9:553:17 | ExprStmt | test.rs:553:9:553:17 | ExprStmt | diff --git a/rust/ql/test/library-tests/controlflow/Cfg.expected b/rust/ql/test/library-tests/controlflow/Cfg.expected index 2d1036c93c93..7517c8be81f5 100644 --- a/rust/ql/test/library-tests/controlflow/Cfg.expected +++ b/rust/ql/test/library-tests/controlflow/Cfg.expected @@ -1288,20 +1288,13 @@ edges | test.rs:529:41:537:5 | { ... } | test.rs:529:5:537:5 | exit fn const_block_assert (normal) | | | test.rs:532:9:534:9 | ExprStmt | test.rs:533:13:533:50 | ExprStmt | | | test.rs:532:9:534:9 | { ... } | test.rs:536:9:536:10 | 42 | | +| test.rs:533:13:533:19 | "explicit panic" | test.rs:533:13:533:19 | ...::panic(...) | | +| test.rs:533:13:533:19 | ...::panic | test.rs:533:13:533:19 | "explicit panic" | | +| test.rs:533:13:533:19 | ...::panic(...) | test.rs:533:13:533:19 | { ... } | | | test.rs:533:13:533:19 | ...::panic_2021!... | test.rs:533:13:533:19 | MacroExpr | | -| test.rs:533:13:533:19 | ...::panic_explicit | test.rs:533:13:533:19 | ...::panic_explicit(...) | | -| test.rs:533:13:533:19 | ...::panic_explicit(...) | test.rs:533:13:533:19 | { ... } | | -| test.rs:533:13:533:19 | ExprStmt | test.rs:533:13:533:19 | fn panic_cold_explicit | | -| test.rs:533:13:533:19 | ExprStmt | test.rs:533:13:533:19 | panic_cold_explicit | | +| test.rs:533:13:533:19 | ExprStmt | test.rs:533:13:533:19 | ...::panic | | | test.rs:533:13:533:19 | MacroExpr | test.rs:533:13:533:19 | { ... } | | -| test.rs:533:13:533:19 | enter fn panic_cold_explicit | test.rs:533:13:533:19 | ...::panic_explicit | | -| test.rs:533:13:533:19 | exit fn panic_cold_explicit (normal) | test.rs:533:13:533:19 | exit fn panic_cold_explicit | | -| test.rs:533:13:533:19 | fn panic_cold_explicit | test.rs:533:13:533:19 | ExprStmt | | -| test.rs:533:13:533:19 | panic_cold_explicit | test.rs:533:13:533:19 | panic_cold_explicit(...) | | -| test.rs:533:13:533:19 | panic_cold_explicit(...) | test.rs:533:13:533:19 | { ... } | | | test.rs:533:13:533:19 | { ... } | test.rs:533:13:533:19 | ...::panic_2021!... | | -| test.rs:533:13:533:19 | { ... } | test.rs:533:13:533:19 | exit fn panic_cold_explicit (normal) | | -| test.rs:533:13:533:19 | { ... } | test.rs:533:13:533:19 | { ... } | | | test.rs:533:13:533:19 | { ... } | test.rs:533:21:533:48 | if ... {...} | | | test.rs:533:13:533:49 | MacroExpr | test.rs:532:9:534:9 | { ... } | | | test.rs:533:13:533:49 | assert!... | test.rs:533:13:533:49 | MacroExpr | | @@ -1323,11 +1316,6 @@ edges | test.rs:541:9:546:9 | ExprStmt | test.rs:541:12:541:16 | false | | | test.rs:541:9:546:9 | if false {...} | test.rs:547:9:547:9 | N | | | test.rs:541:12:541:16 | false | test.rs:541:9:546:9 | if false {...} | false | -| test.rs:544:17:544:22 | ...::panic_explicit | test.rs:544:17:544:22 | ...::panic_explicit(...) | | -| test.rs:544:17:544:22 | ...::panic_explicit(...) | test.rs:544:17:544:22 | { ... } | | -| test.rs:544:17:544:22 | enter fn panic_cold_explicit | test.rs:544:17:544:22 | ...::panic_explicit | | -| test.rs:544:17:544:22 | exit fn panic_cold_explicit (normal) | test.rs:544:17:544:22 | exit fn panic_cold_explicit | | -| test.rs:544:17:544:22 | { ... } | test.rs:544:17:544:22 | exit fn panic_cold_explicit (normal) | | | test.rs:547:9:547:9 | N | test.rs:539:35:548:5 | { ... } | | | test.rs:551:1:556:1 | enter fn dead_code | test.rs:552:5:554:5 | ExprStmt | | | test.rs:551:1:556:1 | exit fn dead_code (normal) | test.rs:551:1:556:1 | exit fn dead_code | | diff --git a/rust/ql/test/library-tests/definitions/Definitions.expected b/rust/ql/test/library-tests/definitions/Definitions.expected index 2ab25620188e..3a3b079f4583 100644 --- a/rust/ql/test/library-tests/definitions/Definitions.expected +++ b/rust/ql/test/library-tests/definitions/Definitions.expected @@ -10,9 +10,9 @@ | main.rs:20:13:20:14 | S2 | main.rs:16:5:16:24 | struct S2 | path | | main.rs:20:16:20:16 | x | main.rs:19:20:19:20 | x | local variable | | main.rs:29:5:29:11 | println | {EXTERNAL LOCATION} | MacroRules | path | -| main.rs:29:22:29:26 | value | main.rs:29:50:29:56 | FormatArgsArgName | format argument | -| main.rs:29:29:29:33 | width | main.rs:29:50:29:56 | FormatArgsArgName | format argument | -| main.rs:29:36:29:44 | precision | main.rs:29:50:29:56 | FormatArgsArgName | format argument | +| main.rs:29:22:29:26 | value | main.rs:29:50:29:54 | value | format argument | +| main.rs:29:29:29:33 | width | main.rs:29:50:29:54 | value | format argument | +| main.rs:29:36:29:44 | precision | main.rs:29:50:29:54 | value | format argument | | main.rs:30:5:30:11 | println | {EXTERNAL LOCATION} | MacroRules | path | | main.rs:30:22:30:22 | 0 | main.rs:30:34:30:38 | value | format argument | | main.rs:30:25:30:25 | 1 | main.rs:30:41:30:45 | width | format argument | diff --git a/rust/ql/test/rust-toolchain.toml b/rust/ql/test/rust-toolchain.toml index dac74a8c0d54..a2094a1d6e14 100644 --- a/rust/ql/test/rust-toolchain.toml +++ b/rust/ql/test/rust-toolchain.toml @@ -1,7 +1,12 @@ # This file specifies the Rust version used to test the rust extractor. # IMPORTANT: this can also have an impact on QL test results - +# +# Pinned to 1.95: this is the newest stable that both expands the builtin +# `format_args!` macro against std (needs >= ~1.94) and still accepts +# `use SomeStruct::{self};`, which became a hard error (E0432) in 1.96 and is +# exercised by the path-resolution test. Do not bump past 1.95 without +# adapting that test. [toolchain] -channel = "1.97" +channel = "1.95.0" profile = "minimal" components = [ "rust-src" ] From f6e32a31157729b9f82d721ee5bb2650f225c1fe Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 14 Aug 2026 16:37:24 +0200 Subject: [PATCH 0320/2098] Rust: add CFG support for `DerefPat` pattern The new `DerefPat` node from ra_ap 0.0.347 had no case in the pattern CFG builder, leaving the enclosing function's CFG disconnected and tripping `CfgConsistency` (a `deadEnd`). Wire it like `BoxPat`, since it wraps a single inner pattern via `getPat()`. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 890cb55d-0437-4bd7-9268-87b8897ada01 --- .../codeql/rust/controlflow/internal/ControlFlowGraphImpl.qll | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rust/ql/lib/codeql/rust/controlflow/internal/ControlFlowGraphImpl.qll b/rust/ql/lib/codeql/rust/controlflow/internal/ControlFlowGraphImpl.qll index f8a182685b64..e7f3c2a4b084 100644 --- a/rust/ql/lib/codeql/rust/controlflow/internal/ControlFlowGraphImpl.qll +++ b/rust/ql/lib/codeql/rust/controlflow/internal/ControlFlowGraphImpl.qll @@ -624,6 +624,10 @@ module PatternTrees { override Pat getPat(int i) { i = 0 and result = this.getPat() } } + class DerefPatTree extends PreOrderPatTree, DerefPat { + override Pat getPat(int i) { i = 0 and result = this.getPat() } + } + class RestPatTree extends LeafTree, RestPat { } class LiteralPatTree extends StandardPostOrderTree, LiteralPat { From 1c6b4b8c854426aa5a62eeceb3448be116afdb0d Mon Sep 17 00:00:00 2001 From: Keshav Malik Date: Fri, 14 Aug 2026 21:04:34 +0530 Subject: [PATCH 0321/2098] Fix TransformStream constructor arity --- javascript/externs/web/streamsapi.js | 22 +++++++++++++++++-- ...08-14-transformstream-constructor-arity.md | 4 ++++ .../SpuriousArguments.expected | 1 + .../SpuriousArguments/externs.js | 8 +++++++ .../SpuriousArguments/transformstream.ts | 15 +++++++++++++ 5 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 javascript/ql/src/change-notes/2026-08-14-transformstream-constructor-arity.md create mode 100644 javascript/ql/test/query-tests/LanguageFeatures/SpuriousArguments/transformstream.ts diff --git a/javascript/externs/web/streamsapi.js b/javascript/externs/web/streamsapi.js index 4a335775aadb..2e936a1b7a13 100644 --- a/javascript/externs/web/streamsapi.js +++ b/javascript/externs/web/streamsapi.js @@ -38,9 +38,27 @@ var QueuingStrategy; /** + * A transform stream (https://streams.spec.whatwg.org/#transform-stream). * @record */ -function TransformStream() {}; +function ITransformStream() {}; + +/** @type {!WritableStream} */ +ITransformStream.prototype.writable; + +/** @type {!ReadableStream} */ +ITransformStream.prototype.readable; + + +/** + * @constructor + * @implements {ITransformStream} + * @param {Object=} transformer + * @param {!QueuingStrategy=} writableStrategy + * @param {!QueuingStrategy=} readableStrategy + * @see https://streams.spec.whatwg.org/#ts-class + */ +function TransformStream(transformer, writableStrategy, readableStrategy) {}; /** @type {!WritableStream} */ TransformStream.prototype.writable; @@ -120,7 +138,7 @@ ReadableStream.prototype.cancel = function(reason) {}; ReadableStream.prototype.getReader = function(opt_options) {}; /** - * @param {!TransformStream} transform + * @param {!ITransformStream} transform * @param {!PipeOptions=} opt_options * @return {!ReadableStream} * @see https://streams.spec.whatwg.org/#rs-pipe-through diff --git a/javascript/ql/src/change-notes/2026-08-14-transformstream-constructor-arity.md b/javascript/ql/src/change-notes/2026-08-14-transformstream-constructor-arity.md new file mode 100644 index 000000000000..a8b66c4c612b --- /dev/null +++ b/javascript/ql/src/change-notes/2026-08-14-transformstream-constructor-arity.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `js/superfluous-trailing-arguments` query no longer reports valid arguments passed to the `TransformStream` constructor. diff --git a/javascript/ql/test/query-tests/LanguageFeatures/SpuriousArguments/SpuriousArguments.expected b/javascript/ql/test/query-tests/LanguageFeatures/SpuriousArguments/SpuriousArguments.expected index b88dd7d68e80..40493b31b1ec 100644 --- a/javascript/ql/test/query-tests/LanguageFeatures/SpuriousArguments/SpuriousArguments.expected +++ b/javascript/ql/test/query-tests/LanguageFeatures/SpuriousArguments/SpuriousArguments.expected @@ -8,6 +8,7 @@ | reflection.js:7:15:7:18 | 1 | Superfluous arguments passed to $@. | reflection.js:1:1:1:23 | functio ... eturn;} | function f0 | | reflection.js:12:18:12:18 | 2 | Superfluous argument passed to $@. | reflection.js:2:1:2:24 | functio ... eturn;} | function f1 | | thisparameter.ts:4:11:4:12 | 45 | Superfluous argument passed to $@. | thisparameter.ts:1:1:1:45 | functio ... eturn;} | function foo | +| transformstream.ts:15:33:15:34 | {} | Superfluous argument passed to $@. | externs.js:48:1:48:76 | functio ... egy) {} | function TransformStream | | tst.js:10:3:10:5 | g() | Superfluous argument passed to $@. | tst.js:1:1:4:1 | functio ... x+19;\\n} | function f | | tst.js:31:15:31:18 | 2 | Superfluous arguments passed to $@. | externs.js:34:1:34:27 | functio ... str) {} | function String | | tst.js:34:4:34:5 | 42 | Superfluous argument passed to $@. | tst.js:35:4:35:23 | function() {return;} | anonymous function | diff --git a/javascript/ql/test/query-tests/LanguageFeatures/SpuriousArguments/externs.js b/javascript/ql/test/query-tests/LanguageFeatures/SpuriousArguments/externs.js index c8a88126efbf..cc3bf09cc149 100644 --- a/javascript/ql/test/query-tests/LanguageFeatures/SpuriousArguments/externs.js +++ b/javascript/ql/test/query-tests/LanguageFeatures/SpuriousArguments/externs.js @@ -39,4 +39,12 @@ function Number() {} Number.parseFloat = function(num) {}; +/** + * @param {*=} transformer + * @param {*=} writableStrategy + * @param {*=} readableStrategy + * @constructor + */ +function TransformStream(transformer, writableStrategy, readableStrategy) {} + /** @externs */ diff --git a/javascript/ql/test/query-tests/LanguageFeatures/SpuriousArguments/transformstream.ts b/javascript/ql/test/query-tests/LanguageFeatures/SpuriousArguments/transformstream.ts new file mode 100644 index 000000000000..161ffc4fcf7b --- /dev/null +++ b/javascript/ql/test/query-tests/LanguageFeatures/SpuriousArguments/transformstream.ts @@ -0,0 +1,15 @@ +class CustomTransformStream extends TransformStream { + constructor() { + super({ + transform(chunk, controller) { + controller.enqueue(chunk); + } + }); + } +} + +new TransformStream(); +new TransformStream({}); +new TransformStream({}, {}); +new TransformStream({}, {}, {}); +new TransformStream({}, {}, {}, {}); // $ Alert From 7faf81f60fee7883cb7764689f49c3777ddfaefd Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 14 Aug 2026 18:39:07 +0200 Subject: [PATCH 0322/2098] Rust: reconstruct format-macro expansions on pre-1.94 toolchains `rust-analyzer` 0.0.347 no longer expands the format-family macros (`format!`, `println!`, `write!`, `panic!`, ...) against a pre-1.94 std, so flow through them and the security-query sinks keyed on their callees were lost. Rebuild each macro's real expansion (a `FormatArgsExpr` wrapped in its callee) from the argument tokens so both keep working. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 7492ff50-9c8e-47ef-a70d-f2623b702c8f --- rust/extractor/src/translate.rs | 1 + rust/extractor/src/translate/base.rs | 85 +++++++++ rust/extractor/src/translate/format_args.rs | 165 ++++++++++++++++++ rust/ql/test/.gitignore | 3 + .../format-macros-legacy/Cargo.lock | 7 + .../format-macros-legacy/FormatArgs.expected | 10 ++ .../format-macros-legacy/FormatArgs.ql | 8 + .../LogInjection.expected | 36 ++++ .../format-macros-legacy/LogInjection.qlref | 4 + .../inline-taint-flow.expected | 39 +++++ .../format-macros-legacy/inline-taint-flow.ql | 12 ++ .../format-macros-legacy/main.rs | 59 +++++++ .../format-macros-legacy/rust-toolchain.toml | 14 ++ rust/ql/test/setup.sh | 4 + 14 files changed, 447 insertions(+) create mode 100644 rust/extractor/src/translate/format_args.rs create mode 100644 rust/ql/test/library-tests/format-macros-legacy/Cargo.lock create mode 100644 rust/ql/test/library-tests/format-macros-legacy/FormatArgs.expected create mode 100644 rust/ql/test/library-tests/format-macros-legacy/FormatArgs.ql create mode 100644 rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected create mode 100644 rust/ql/test/library-tests/format-macros-legacy/LogInjection.qlref create mode 100644 rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected create mode 100644 rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.ql create mode 100644 rust/ql/test/library-tests/format-macros-legacy/main.rs create mode 100644 rust/ql/test/library-tests/format-macros-legacy/rust-toolchain.toml diff --git a/rust/extractor/src/translate.rs b/rust/extractor/src/translate.rs index 1e9f3775d40e..586d46ee27e2 100644 --- a/rust/extractor/src/translate.rs +++ b/rust/extractor/src/translate.rs @@ -1,4 +1,5 @@ mod base; +mod format_args; mod generated; mod mappings; diff --git a/rust/extractor/src/translate/base.rs b/rust/extractor/src/translate/base.rs index 29fc664c9805..cf2feb6135b1 100644 --- a/rust/extractor/src/translate/base.rs +++ b/rust/extractor/src/translate/base.rs @@ -1,3 +1,4 @@ +use super::format_args; use super::mappings::Emission; use crate::generated::{self}; use crate::rust_analyzer::FileSemanticInformation; @@ -462,6 +463,12 @@ impl<'a, 'db> Translator<'a, 'db> { )); } } else if self.semantics.is_some() { + if self.reconstruct_format_args_expansion(mcall, label) { + // `rustc <1.94` sysroots no longer expand the format-family macros; we + // reconstruct their real expansion (a `FormatArgsExpr`, wrapped in the + // callee that carries flow and the sink models) so both are preserved. + return; + } // let's not spam warnings if we don't have semantics, we already emitted one let range = self.text_range_for_node(mcall); self.emit_parse_error( @@ -783,6 +790,84 @@ impl<'a, 'db> Translator<'a, 'db> { result } + /// Reconstructs and emits the expansion of a format-family macro (`format!`, + /// `println!`, `write!`, `panic!`, ...). + /// + /// On `rustc <1.94` sysroots these macros no longer resolve, so `expand_macro_call` + /// returns `None` and we get a bare unexpanded `MacroCall` with no flow through it. + /// We rebuild the token tree of the real expansion ourselves (see + /// [`super::format_args`]), parse it, and register the result as the macro + /// expansion. Locations of the synthesized nodes are routed through the expansion + /// span map via `builtin_derive_span_map`. + /// + /// Returns `true` when the macro was recognized and an expansion was emitted. + fn reconstruct_format_args_expansion( + &mut self, + mcall: &ast::MacroCall, + label: Label, + ) -> bool { + let Some(name) = mcall + .path() + .and_then(|p| p.segment()) + .and_then(|s| s.name_ref()) + .map(|n| n.text().to_string()) + else { + return false; + }; + let Some(wrap) = format_args::Wrap::for_macro(&name) else { + return false; + }; + let Some(tt_node) = mcall.token_tree() else { + return false; + }; + let Some(semantics) = self.semantics else { + return false; + }; + let db = semantics.db; + let file_id = semantics.hir_file_for(mcall.syntax()); + let span_map = file_id.span_map(db); + let call_site = span_map.span_for_range(mcall.syntax().text_range()); + let input = syntax_node_to_token_tree( + tt_node.syntax(), + span_map, + call_site, + DocCommentDesugarMode::ProcMacro, + ); + let Some(output) = format_args::reconstruct(wrap, &input, call_site) else { + return false; + }; + + let Some(edition) = self.file_id.map(|f| f.edition(db)) else { + return false; + }; + let (parsed, output_span_map) = + token_tree_to_syntax_node(&output, TopEntryPoint::Expr, &mut |_| edition); + let root = parsed.syntax_node(); + let Some(expr) = ast::Expr::cast(root.clone()) + .or_else(|| root.descendants().find_map(ast::Expr::cast)) + else { + return false; + }; + // Sanity check: the parsed expression must contain the reconstructed + // `FormatArgsExpr` (either directly, or wrapped in the callee above). + if expr + .syntax() + .descendants() + .find_map(ast::FormatArgsExpr::cast) + .is_none() + { + return false; + } + let previous = self.builtin_derive_span_map.replace(output_span_map); + let emitted = self.emit_expr(&expr); + self.builtin_derive_span_map = previous; + let Some(value) = emitted else { + return false; + }; + generated::MacroCall::emit_macro_call_expansion(label, value.into(), &mut self.trap.writer); + true + } + pub(crate) fn emit_derive_expansion( &mut self, node: &(impl Into + Clone), diff --git a/rust/extractor/src/translate/format_args.rs b/rust/extractor/src/translate/format_args.rs new file mode 100644 index 000000000000..431538aca296 --- /dev/null +++ b/rust/extractor/src/translate/format_args.rs @@ -0,0 +1,165 @@ +//! Reconstruction of the `format_args!` expansion of the format-family macros. +//! +//! On `rustc <1.94` sysroots the format-family macros (`format!`, `println!`, +//! `write!`, `panic!`, ...) no longer resolve, so `expand_macro_call` returns `None` +//! and we get a bare unexpanded `MacroCall` with no flow through it (flow is modeled +//! on the `FormatArgsExpr` node, and the security sinks are keyed on the wrapping +//! callee). The syntactic lowering of these macros is a pure, sysroot-independent +//! transform, so we rebuild the same token tree the real (>=1.94) expansion has and +//! parse it ourselves. +//! +//! This module owns the pure token-tree construction; [`super::base::Translator`] +//! handles parsing the result and emitting it as the macro expansion. + +use ra_ap_hir_expand::intern::Symbol; +use ra_ap_hir_expand::tt; +use ra_ap_span::Span; + +/// How a format-family macro wraps its `format_args!`. We rebuild the same shape the +/// real (>=1.94) expansion has, so that both dataflow and the sink models keyed on +/// the wrapping callee keep working on older toolchains. +#[derive(Clone, Copy)] +pub(crate) enum Wrap { + /// `format_args!` and friends are themselves the `FormatArgsExpr`. + Bare, + /// Wrapped in a call to the given absolute path, e.g. `std::fmt::format(..)`. + Call(&'static [&'static str]), + /// `write!`/`writeln!`: `.write_fmt(format_args!(..))`. + WriteMethod, +} + +impl Wrap { + /// Classifies a macro by its name, or returns `None` if it is not a + /// format-family macro we reconstruct. + /// + /// `format_args_nl!`'s trailing newline is intentionally dropped: it is not + /// relevant to flow or to the sinks keyed on the callee, so all variants map to + /// the same `format_args` reconstruction. + pub(crate) fn for_macro(name: &str) -> Option { + Some(match name { + "format_args" | "const_format_args" | "format_args_nl" => Wrap::Bare, + "format" => Wrap::Call(&["std", "fmt", "format"]), + "print" | "println" => Wrap::Call(&["std", "io", "_print"]), + "eprint" | "eprintln" => Wrap::Call(&["std", "io", "_eprint"]), + "panic" => Wrap::Call(&["core", "panicking", "panic_fmt"]), + "write" | "writeln" => Wrap::WriteMethod, + _ => return None, + }) + } +} + +/// Builds the reconstructed expansion token tree for `wrap` from the macro `input`. +/// +/// Returns `None` if the input does not match the expected shape (currently only when +/// a `write!` argument list has no writer/format-args separating comma). `call_site` +/// is used to span the synthesized tokens; the format arguments keep their own spans. +pub(crate) fn reconstruct(wrap: Wrap, input: &tt::TopSubtree, call_site: Span) -> Option { + let (writer, content) = split_arguments(wrap, input)?; + let emitter = Emitter { + call_site, + format_args_parens: input.view().top_subtree().delimiter, + }; + + let mut builder = tt::TopSubtreeBuilder::new(tt::Delimiter::invisible_spanned(call_site)); + match wrap { + Wrap::Bare => emitter.push_format_args(&mut builder, content), + Wrap::Call(path) => { + emitter.push_path(&mut builder, path); + emitter.push_parenthesized_format_args(&mut builder, content); + } + Wrap::WriteMethod => { + builder.extend_with_tt(writer.expect("write! split always yields a writer")); + builder.push(emitter.punct('.', tt::Spacing::Alone)); + builder.push(emitter.ident("write_fmt")); + emitter.push_parenthesized_format_args(&mut builder, content); + } + } + Some(builder.build()) +} + +/// Splits the macro argument list into the leading writer (for `write!`/`writeln!`, +/// everything up to the first top-level comma) and the format arguments. +fn split_arguments<'a>( + wrap: Wrap, + input: &'a tt::TopSubtree, +) -> Option<(Option>, tt::TokenTreesView<'a>)> { + let Wrap::WriteMethod = wrap else { + return Some((None, input.view().token_trees())); + }; + let mut iter = input.view().iter(); + let start = iter.savepoint(); + let mut found_comma = false; + while let Some(element) = iter.peek() { + if let tt::TtElement::Leaf(tt::Leaf::Punct(punct)) = element + && punct.char == ',' + { + found_comma = true; + break; + } + iter.next(); + } + if !found_comma { + return None; + } + let writer = iter.from_savepoint(start); + iter.next(); // consume the comma + Some((Some(writer), iter.remaining())) +} + +/// Emits the synthesized tokens, tagging them with the macro call site span. +struct Emitter { + call_site: Span, + /// The delimiter of the macro input, reused for the `format_args(..)` parentheses + /// so those spans point back at the original argument list. + format_args_parens: tt::Delimiter, +} + +impl Emitter { + fn ident(&self, sym: &str) -> tt::Leaf { + tt::Leaf::Ident(tt::Ident { + sym: Symbol::intern(sym), + span: self.call_site, + is_raw: tt::IdentIsRaw::No, + }) + } + + fn punct(&self, char: char, spacing: tt::Spacing) -> tt::Leaf { + tt::Leaf::Punct(tt::Punct { + char, + spacing, + span: self.call_site, + }) + } + + /// Pushes `builtin # format_args ( )`, the token form the parser turns + /// into a `FormatArgsExpr`. Its argument leaves keep their real source spans. + fn push_format_args(&self, builder: &mut tt::TopSubtreeBuilder, content: tt::TokenTreesView) { + builder.push(self.ident("builtin")); + builder.push(self.punct('#', tt::Spacing::Alone)); + builder.push(self.ident("format_args")); + builder.open(tt::DelimiterKind::Parenthesis, self.format_args_parens.open); + builder.extend_with_tt(content); + builder.close(self.format_args_parens.close); + } + + /// Pushes `:: seg :: seg ...`, an absolute path. + fn push_path(&self, builder: &mut tt::TopSubtreeBuilder, path: &[&str]) { + for segment in path { + builder.push(self.punct(':', tt::Spacing::Joint)); + builder.push(self.punct(':', tt::Spacing::Alone)); + builder.push(self.ident(segment)); + } + } + + /// Pushes `( builtin#format_args() )`, the argument list of the wrapping + /// call or method. + fn push_parenthesized_format_args( + &self, + builder: &mut tt::TopSubtreeBuilder, + content: tt::TokenTreesView, + ) { + builder.open(tt::DelimiterKind::Parenthesis, self.call_site); + self.push_format_args(builder, content); + builder.close(self.call_site); + } +} diff --git a/rust/ql/test/.gitignore b/rust/ql/test/.gitignore index 29291fe2d12c..eb43358aa293 100644 --- a/rust/ql/test/.gitignore +++ b/rust/ql/test/.gitignore @@ -3,6 +3,9 @@ target/ # these are all generated, see `rust/extractor/src/qltest.rs` for details Cargo.toml /*/**/rust-toolchain.toml +# but this one is committed on purpose: it pins a pre-1.94 toolchain to exercise +# the extractor's `FormatArgsExpr` reconstruction fallback. +!/library-tests/format-macros-legacy/rust-toolchain.toml lib.rs .proc_macro/ .lib/ diff --git a/rust/ql/test/library-tests/format-macros-legacy/Cargo.lock b/rust/ql/test/library-tests/format-macros-legacy/Cargo.lock new file mode 100644 index 000000000000..b9856cfaf77d --- /dev/null +++ b/rust/ql/test/library-tests/format-macros-legacy/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "test" +version = "0.0.1" diff --git a/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.expected b/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.expected new file mode 100644 index 000000000000..ed2b1199c6aa --- /dev/null +++ b/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.expected @@ -0,0 +1,10 @@ +| main.rs:13:10:13:25 | FormatArgsExpr | 1 | +| main.rs:16:10:16:23 | FormatArgsExpr | 0 | +| main.rs:19:13:19:36 | FormatArgsExpr | 1 | +| main.rs:33:25:33:33 | FormatArgsExpr | 1 | +| main.rs:38:13:38:32 | FormatArgsExpr | 1 | +| main.rs:39:13:39:32 | FormatArgsExpr | 0 | +| main.rs:49:5:49:27 | FormatArgsExpr | 1 | +| main.rs:50:5:50:26 | FormatArgsExpr | 0 | +| main.rs:51:5:51:25 | FormatArgsExpr | 1 | +| main.rs:52:5:52:24 | FormatArgsExpr | 0 | diff --git a/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.ql b/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.ql new file mode 100644 index 000000000000..77d7ab895bda --- /dev/null +++ b/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.ql @@ -0,0 +1,8 @@ +// Reconstructed `FormatArgsExpr` nodes for the format-family macros. On the +// pinned pre-1.94 toolchain these come entirely from the extractor's +// reconstruction path, so the presence of one node per macro invocation +// (including `write!`/`writeln!`) confirms it fires across the family. +import rust + +from FormatArgsExpr f +select f, f.getNumberOfArgs() diff --git a/rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected b/rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected new file mode 100644 index 000000000000..736d6dda4abd --- /dev/null +++ b/rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected @@ -0,0 +1,36 @@ +#select +| main.rs:49:5:49:27 | ...::_print | main.rs:47:19:47:31 | ...::var | main.rs:49:5:49:27 | ...::_print | Log entry depends on a $@. | main.rs:47:19:47:31 | ...::var | user-provided value | +| main.rs:50:5:50:26 | ...::_eprint | main.rs:47:19:47:31 | ...::var | main.rs:50:5:50:26 | ...::_eprint | Log entry depends on a $@. | main.rs:47:19:47:31 | ...::var | user-provided value | +| main.rs:51:5:51:25 | ...::_print | main.rs:47:19:47:31 | ...::var | main.rs:51:5:51:25 | ...::_print | Log entry depends on a $@. | main.rs:47:19:47:31 | ...::var | user-provided value | +| main.rs:52:5:52:24 | ...::_eprint | main.rs:47:19:47:31 | ...::var | main.rs:52:5:52:24 | ...::_eprint | Log entry depends on a $@. | main.rs:47:19:47:31 | ...::var | user-provided value | +edges +| main.rs:47:9:47:15 | tainted | main.rs:49:5:49:27 | FormatArgsExpr | provenance | | +| main.rs:47:9:47:15 | tainted | main.rs:50:5:50:26 | FormatArgsExpr | provenance | | +| main.rs:47:9:47:15 | tainted | main.rs:51:5:51:25 | FormatArgsExpr | provenance | | +| main.rs:47:9:47:15 | tainted | main.rs:52:5:52:24 | FormatArgsExpr | provenance | | +| main.rs:47:19:47:31 | ...::var | main.rs:47:19:47:45 | ...::var(...) [Ok] | provenance | Src:MaD:3 | +| main.rs:47:19:47:45 | ...::var(...) [Ok] | main.rs:47:19:47:65 | ... .unwrap_or_default() | provenance | MaD:4 | +| main.rs:47:19:47:65 | ... .unwrap_or_default() | main.rs:47:9:47:15 | tainted | provenance | | +| main.rs:49:5:49:27 | FormatArgsExpr | main.rs:49:5:49:27 | ...::_print | provenance | MaD:2 Sink:MaD:2 | +| main.rs:50:5:50:26 | FormatArgsExpr | main.rs:50:5:50:26 | ...::_eprint | provenance | MaD:1 Sink:MaD:1 | +| main.rs:51:5:51:25 | FormatArgsExpr | main.rs:51:5:51:25 | ...::_print | provenance | MaD:2 Sink:MaD:2 | +| main.rs:52:5:52:24 | FormatArgsExpr | main.rs:52:5:52:24 | ...::_eprint | provenance | MaD:1 Sink:MaD:1 | +models +| 1 | Sink: std::io::stdio::_eprint; Argument[0]; log-injection | +| 2 | Sink: std::io::stdio::_print; Argument[0]; log-injection | +| 3 | Source: std::env::var; ReturnValue.Field[core::result::Result::Ok(0)]; environment | +| 4 | Summary: ::unwrap_or_default; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +nodes +| main.rs:47:9:47:15 | tainted | semmle.label | tainted | +| main.rs:47:19:47:31 | ...::var | semmle.label | ...::var | +| main.rs:47:19:47:45 | ...::var(...) [Ok] | semmle.label | ...::var(...) [Ok] | +| main.rs:47:19:47:65 | ... .unwrap_or_default() | semmle.label | ... .unwrap_or_default() | +| main.rs:49:5:49:27 | ...::_print | semmle.label | ...::_print | +| main.rs:49:5:49:27 | FormatArgsExpr | semmle.label | FormatArgsExpr | +| main.rs:50:5:50:26 | ...::_eprint | semmle.label | ...::_eprint | +| main.rs:50:5:50:26 | FormatArgsExpr | semmle.label | FormatArgsExpr | +| main.rs:51:5:51:25 | ...::_print | semmle.label | ...::_print | +| main.rs:51:5:51:25 | FormatArgsExpr | semmle.label | FormatArgsExpr | +| main.rs:52:5:52:24 | ...::_eprint | semmle.label | ...::_eprint | +| main.rs:52:5:52:24 | FormatArgsExpr | semmle.label | FormatArgsExpr | +subpaths diff --git a/rust/ql/test/library-tests/format-macros-legacy/LogInjection.qlref b/rust/ql/test/library-tests/format-macros-legacy/LogInjection.qlref new file mode 100644 index 000000000000..3949abc78143 --- /dev/null +++ b/rust/ql/test/library-tests/format-macros-legacy/LogInjection.qlref @@ -0,0 +1,4 @@ +query: queries/security/CWE-117/LogInjection.ql +postprocess: + - utils/test/PrettyPrintModels.ql + - utils/test/InlineExpectationsTestQuery.ql diff --git a/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected b/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected new file mode 100644 index 000000000000..59e89e2641a0 --- /dev/null +++ b/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected @@ -0,0 +1,39 @@ +models +| 1 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +edges +| main.rs:12:9:12:9 | a | main.rs:13:10:13:25 | FormatArgsExpr | provenance | | +| main.rs:12:13:12:21 | source(...) | main.rs:12:9:12:9 | a | provenance | | +| main.rs:13:10:13:25 | ...::format(...) | main.rs:13:10:13:25 | MacroExpr | provenance | | +| main.rs:13:10:13:25 | FormatArgsExpr | main.rs:13:10:13:25 | ...::format(...) | provenance | MaD:1 | +| main.rs:15:9:15:9 | b | main.rs:16:10:16:23 | FormatArgsExpr | provenance | | +| main.rs:15:13:15:21 | source(...) | main.rs:15:9:15:9 | b | provenance | | +| main.rs:16:10:16:23 | ...::format(...) | main.rs:16:10:16:23 | MacroExpr | provenance | | +| main.rs:16:10:16:23 | FormatArgsExpr | main.rs:16:10:16:23 | ...::format(...) | provenance | MaD:1 | +| main.rs:18:9:18:9 | c | main.rs:19:13:19:36 | FormatArgsExpr | provenance | | +| main.rs:18:13:18:21 | source(...) | main.rs:18:9:18:9 | c | provenance | | +| main.rs:19:9:19:9 | s | main.rs:20:10:20:10 | s | provenance | | +| main.rs:19:13:19:36 | ...::format(...) | main.rs:19:9:19:9 | s | provenance | | +| main.rs:19:13:19:36 | FormatArgsExpr | main.rs:19:13:19:36 | ...::format(...) | provenance | MaD:1 | +nodes +| main.rs:12:9:12:9 | a | semmle.label | a | +| main.rs:12:13:12:21 | source(...) | semmle.label | source(...) | +| main.rs:13:10:13:25 | ...::format(...) | semmle.label | ...::format(...) | +| main.rs:13:10:13:25 | FormatArgsExpr | semmle.label | FormatArgsExpr | +| main.rs:13:10:13:25 | MacroExpr | semmle.label | MacroExpr | +| main.rs:15:9:15:9 | b | semmle.label | b | +| main.rs:15:13:15:21 | source(...) | semmle.label | source(...) | +| main.rs:16:10:16:23 | ...::format(...) | semmle.label | ...::format(...) | +| main.rs:16:10:16:23 | FormatArgsExpr | semmle.label | FormatArgsExpr | +| main.rs:16:10:16:23 | MacroExpr | semmle.label | MacroExpr | +| main.rs:18:9:18:9 | c | semmle.label | c | +| main.rs:18:13:18:21 | source(...) | semmle.label | source(...) | +| main.rs:19:9:19:9 | s | semmle.label | s | +| main.rs:19:13:19:36 | ...::format(...) | semmle.label | ...::format(...) | +| main.rs:19:13:19:36 | FormatArgsExpr | semmle.label | FormatArgsExpr | +| main.rs:20:10:20:10 | s | semmle.label | s | +subpaths +testFailures +#select +| main.rs:13:10:13:25 | MacroExpr | main.rs:12:13:12:21 | source(...) | main.rs:13:10:13:25 | MacroExpr | $@ | main.rs:12:13:12:21 | source(...) | source(...) | +| main.rs:16:10:16:23 | MacroExpr | main.rs:15:13:15:21 | source(...) | main.rs:16:10:16:23 | MacroExpr | $@ | main.rs:15:13:15:21 | source(...) | source(...) | +| main.rs:20:10:20:10 | s | main.rs:18:13:18:21 | source(...) | main.rs:20:10:20:10 | s | $@ | main.rs:18:13:18:21 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.ql b/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.ql new file mode 100644 index 000000000000..5dcb7ee70a9d --- /dev/null +++ b/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.ql @@ -0,0 +1,12 @@ +/** + * @kind path-problem + */ + +import rust +import utils.test.InlineFlowTest +import DefaultFlowTest +import TaintFlow::PathGraph + +from TaintFlow::PathNode source, TaintFlow::PathNode sink +where TaintFlow::flowPath(source, sink) +select sink, source, sink, "$@", source, source.toString() diff --git a/rust/ql/test/library-tests/format-macros-legacy/main.rs b/rust/ql/test/library-tests/format-macros-legacy/main.rs new file mode 100644 index 000000000000..df0d740a1443 --- /dev/null +++ b/rust/ql/test/library-tests/format-macros-legacy/main.rs @@ -0,0 +1,59 @@ +// Verifies that dataflow through the format-family macros is recovered on +// pre-1.94 toolchains, where rust-analyzer no longer expands them and the +// extractor reconstructs the `FormatArgsExpr` (see `rust-toolchain.toml`). + +fn source(i: i64) -> String { + i.to_string() +} + +fn sink(s: String) {} + +pub fn format_flow() { + let a = source(1); + sink(format!("{}", a)); // $ hasTaintFlow=1 + + let b = source(2); + sink(format!("{b}")); // $ hasTaintFlow=2 + + let c = source(3); + let s = format!("x={c} y={}", c); + sink(s); // $ hasTaintFlow=3 +} + +pub fn exercises_reconstruction() { + // No flow assertions here: these exercise reconstruction of the rest of the + // family, including the writer-argument handling of `write!`/`writeln!`. + // + // Flow into a writer buffer is not recovered on <1.94 (the + // `buf.write_fmt(..)` desugaring is absent), but this matches native + // behavior on >=1.94, where the `Write::write_fmt` content-to-self taint + // model is also missing. So it is a pre-existing model gap, not a + // regression from the reconstruction. + let d = source(4); + let _ = format_args!("{}", d); + + use std::fmt::Write; + let mut buf = String::new(); + let e = source(5); + let _ = write!(buf, "{}", e); + let _ = writeln!(buf, "{e}"); + sink(buf); +} + +// The log-injection sinks (`println!`/`eprintln!`/`panic!`) are reconstructed +// into their real callees (`_print`/`_eprint`/`panic_fmt`), so the manual sink +// models keep firing on <1.94 exactly as they do on native expansions. +pub fn log_injection_sinks() { + let tainted = std::env::var("USER_INPUT").unwrap_or_default(); // $ Source=environment + + println!("{}", tainted); // $ Alert[rust/log-injection]=environment + eprintln!("{tainted}"); // $ Alert[rust/log-injection]=environment + print!("{}", tainted); // $ Alert[rust/log-injection]=environment + eprint!("{tainted}"); // $ Alert[rust/log-injection]=environment +} + +fn main() { + format_flow(); + exercises_reconstruction(); + log_injection_sinks(); +} diff --git a/rust/ql/test/library-tests/format-macros-legacy/rust-toolchain.toml b/rust/ql/test/library-tests/format-macros-legacy/rust-toolchain.toml new file mode 100644 index 000000000000..d0d0ba2bb4b2 --- /dev/null +++ b/rust/ql/test/library-tests/format-macros-legacy/rust-toolchain.toml @@ -0,0 +1,14 @@ +# Pinned to a pre-1.94 toolchain on purpose. +# +# rust-analyzer 0.0.347 only expands the builtin `format_args!` machinery against +# a std that carries the new lowering (roughly >= 1.94). On older toolchains the +# format-family macros (`format!`, `println!`, `write!`, ...) fail to expand, so +# the extractor reconstructs the `FormatArgsExpr` itself. This test exercises that +# reconstruction path, which the default 1.95 test toolchain never hits. +# +# Any toolchain named here must also be pre-installed in `../setup.sh`, otherwise +# the parallel QL tests race on `rustup` auto-install. +[toolchain] +channel = "1.93" +profile = "minimal" +components = [ "rust-src" ] diff --git a/rust/ql/test/setup.sh b/rust/ql/test/setup.sh index 1d7feb284eda..ed1f5ab69227 100755 --- a/rust/ql/test/setup.sh +++ b/rust/ql/test/setup.sh @@ -11,5 +11,9 @@ cd "$(dirname "$0")" pushd ../../extractor/src/nightly-toolchain rustup install popd +# pre-1.94 toolchain exercising the extractor's `FormatArgsExpr` reconstruction +pushd library-tests/format-macros-legacy +rustup install +popd # this needs to be last to set the default toolchain rustup install From 110943091d9397bae8397de11281aee457c03b21 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 9 Jul 2026 13:42:20 +0200 Subject: [PATCH 0323/2098] Rust: Add more MaD source/sink tests --- .../library-tests/dataflow/models/main.rs | 80 + .../dataflow/models/models.expected | 1483 +++++++++-------- .../dataflow/models/models.ext.yml | 6 + 3 files changed, 876 insertions(+), 693 deletions(-) diff --git a/rust/ql/test/library-tests/dataflow/models/main.rs b/rust/ql/test/library-tests/dataflow/models/main.rs index 61e5928636d7..a65963600494 100644 --- a/rust/ql/test/library-tests/dataflow/models/main.rs +++ b/rust/ql/test/library-tests/dataflow/models/main.rs @@ -75,6 +75,7 @@ fn test_set_var_pos() { enum MyFieldEnum { C { field_c: i64 }, D { field_d: i64 }, + E { field_e: Option }, } // has a flow model @@ -101,6 +102,7 @@ fn test_set_var_field() { match e1 { MyFieldEnum::C { field_c: i } => sink(i), MyFieldEnum::D { field_d: i } => sink(i), // $ hasValueFlow=5 + MyFieldEnum::E { field_e: o } => () } } @@ -246,11 +248,30 @@ fn enum_source(i: i64) -> MyFieldEnum { MyFieldEnum::C { field_c: 0 } } +// has a source model +fn enum_source_nested(i: i64) -> MyFieldEnum { + MyFieldEnum::C { field_c: 0 } +} + fn test_enum_source() { let s = enum_source(12); match s { MyFieldEnum::C { field_c: i } => sink(i), MyFieldEnum::D { field_d: i } => sink(i), // $ hasValueFlow=12 + MyFieldEnum::E { field_e: o } => () + } + + let s = enum_source_nested(13); + match s { + MyFieldEnum::C { field_c: i } => sink(i), + MyFieldEnum::D { field_d: i } => sink(i), + MyFieldEnum::E { field_e: o } => + { + match o { + Some(i) => sink(i), // $ hasValueFlow=13 + None => () + } + } } } @@ -260,10 +281,12 @@ fn test_enum_method_source() { match s { MyFieldEnum::C { field_c: i } => sink(i), // $ hasValueFlow=13 MyFieldEnum::D { field_d: i } => sink(i), + MyFieldEnum::E { field_e: o } => () } } mod source_into_function { + use crate::MyFieldEnum; use super::sink; // has a source model @@ -271,6 +294,11 @@ mod source_into_function { f(42) } + // has a source model + fn pass_source_nested(_i: i64, f: impl FnOnce(MyFieldEnum) -> ()) { + f(MyFieldEnum::C { field_c: 0 }) + } + fn test_source_into_function() { let a = |a| sink(a); // $ hasValueFlow=1 pass_source(1, a); @@ -287,16 +315,57 @@ mod source_into_function { pass_source(4, async move |a| { sink(a); // $ hasValueFlow=4 }); + + pass_source_nested(5, |e| { + match e { + MyFieldEnum::C { field_c: i } => sink(i), + MyFieldEnum::D { field_d: i } => sink(i), + MyFieldEnum::E { field_e: o } => + { + match o { + Some(i) => sink(i), // $ hasValueFlow=5 + None => () + } + } + } + }); + } +} + +mod sink_out_of_function { + use crate::MyFieldEnum; + use super::source; + + // has a sink model + fn pass_sink(f: impl FnOnce(()) -> i64) { } + + // has a sink model + fn pass_sink_nested(f: impl FnOnce(()) -> MyFieldEnum) { } + + fn test_sink_out_of_function() { + let a = |a| source(1); + pass_sink(a); // $ MISSING: hasValueFlow=1 + + let b = |_a| { + let s = source(2); + MyFieldEnum::E { field_e: Option::Some(s) } + }; + pass_sink_nested(b); // $ MISSING: hasValueFlow=2 } } // has a sink model fn enum_sink(e: MyFieldEnum) {} +// has a sink model +fn enum_sink_nested(e: MyFieldEnum) {} + fn test_enum_sink() { let s = source(14); enum_sink(MyFieldEnum::C { field_c: s }); // $ hasValueFlow=14 enum_sink(MyFieldEnum::D { field_d: s }); + enum_sink_nested(MyFieldEnum::E { field_e: None }); + enum_sink_nested(MyFieldEnum::E { field_e: Some(s) }); // $ hasValueFlow=14 } fn test_enum_method_sink() { @@ -332,6 +401,17 @@ fn test_arg_source() { sink(i) // $ hasValueFlow=i } +trait MyTrait { + // has a source model + fn test_param_source(i: i64); +} + +impl MyTrait for () { + fn test_param_source(i: i64) { + sink(i) // $ MISSING: hasValueFlow=i + } +} + struct MyStruct2(i64); impl PartialEq for MyStruct { diff --git a/rust/ql/test/library-tests/dataflow/models/models.expected b/rust/ql/test/library-tests/dataflow/models/models.expected index e5ea563eaefe..f531b85b6898 100644 --- a/rust/ql/test/library-tests/dataflow/models/models.expected +++ b/rust/ql/test/library-tests/dataflow/models/models.expected @@ -1,36 +1,39 @@ models | 1 | Sink: ::sink; Argument[self].Field[main::MyFieldEnum::D::field_d]; test-sink | | 2 | Sink: main::enum_sink; Argument[0].Field[main::MyFieldEnum::C::field_c]; test-sink | -| 3 | Sink: main::external_file::generated_sink; Argument[0]; test-sink | -| 4 | Sink: main::external_file::neutral_manual_sink; Argument[0]; test-sink | -| 5 | Sink: main::simple_sink; Argument[0]; test-sink | -| 6 | Source: ::source; ReturnValue.Field[main::MyFieldEnum::C::field_c]; test-source | -| 7 | Source: main::arg_source; Argument[0]; test-source | -| 8 | Source: main::enum_source; ReturnValue.Field[main::MyFieldEnum::D::field_d]; test-source | -| 9 | Source: main::external_file::generated_source; ReturnValue; test-source | -| 10 | Source: main::external_file::neutral_manual_source; ReturnValue; test-source | -| 11 | Source: main::simple_source; ReturnValue; test-source | -| 12 | Source: main::source_into_function::pass_source; Argument[1].Parameter[0]; test-source | -| 13 | Summary: <_ as core::cmp::Ord>::max; Argument[self,0]; ReturnValue; value | -| 14 | Summary: <_ as core::cmp::PartialOrd>::lt; Argument[self].Reference; ReturnValue; taint | -| 15 | Summary: <_ as core::ops::index::Index>::index; Argument[self].Reference.Element; ReturnValue.Reference; value | -| 16 | Summary: main::apply; Argument[0]; Argument[1].Parameter[0]; value | -| 17 | Summary: main::apply; Argument[1].ReturnValue; ReturnValue; value | -| 18 | Summary: main::coerce; Argument[0]; ReturnValue; taint | -| 19 | Summary: main::external_file::generated_summary; Argument[0]; ReturnValue; value | -| 20 | Summary: main::external_file::neutral_manual_summary; Argument[0]; ReturnValue; value | -| 21 | Summary: main::get_array_element; Argument[0].Element; ReturnValue; value | -| 22 | Summary: main::get_async_number; Argument[0]; ReturnValue.Future; value | -| 23 | Summary: main::get_struct_field; Argument[0].Field[main::MyStruct::field1]; ReturnValue; value | -| 24 | Summary: main::get_tuple_element; Argument[0].Field[0]; ReturnValue; value | -| 25 | Summary: main::get_var_field; Argument[0].Field[main::MyFieldEnum::C::field_c]; ReturnValue; value | -| 26 | Summary: main::get_var_pos; Argument[0].Field[main::MyPosEnum::A(0)]; ReturnValue; value | -| 27 | Summary: main::set_array_element; Argument[0]; ReturnValue.Element; value | -| 28 | Summary: main::set_struct_field; Argument[0]; ReturnValue.Field[main::MyStruct::field2]; value | -| 29 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value | -| 30 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value | -| 31 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value | -| 32 | Summary: main::snd; Argument[1]; ReturnValue; value | +| 3 | Sink: main::enum_sink_nested; Argument[0].Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-sink | +| 4 | Sink: main::external_file::generated_sink; Argument[0]; test-sink | +| 5 | Sink: main::external_file::neutral_manual_sink; Argument[0]; test-sink | +| 6 | Sink: main::simple_sink; Argument[0]; test-sink | +| 7 | Source: ::source; ReturnValue.Field[main::MyFieldEnum::C::field_c]; test-source | +| 8 | Source: main::arg_source; Argument[0]; test-source | +| 9 | Source: main::enum_source; ReturnValue.Field[main::MyFieldEnum::D::field_d]; test-source | +| 10 | Source: main::enum_source_nested; ReturnValue.Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-source | +| 11 | Source: main::external_file::generated_source; ReturnValue; test-source | +| 12 | Source: main::external_file::neutral_manual_source; ReturnValue; test-source | +| 13 | Source: main::simple_source; ReturnValue; test-source | +| 14 | Source: main::source_into_function::pass_source; Argument[1].Parameter[0]; test-source | +| 15 | Source: main::source_into_function::pass_source_nested; Argument[1].Parameter[0].Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-source | +| 16 | Summary: <_ as core::cmp::Ord>::max; Argument[self,0]; ReturnValue; value | +| 17 | Summary: <_ as core::cmp::PartialOrd>::lt; Argument[self].Reference; ReturnValue; taint | +| 18 | Summary: <_ as core::ops::index::Index>::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 19 | Summary: main::apply; Argument[0]; Argument[1].Parameter[0]; value | +| 20 | Summary: main::apply; Argument[1].ReturnValue; ReturnValue; value | +| 21 | Summary: main::coerce; Argument[0]; ReturnValue; taint | +| 22 | Summary: main::external_file::generated_summary; Argument[0]; ReturnValue; value | +| 23 | Summary: main::external_file::neutral_manual_summary; Argument[0]; ReturnValue; value | +| 24 | Summary: main::get_array_element; Argument[0].Element; ReturnValue; value | +| 25 | Summary: main::get_async_number; Argument[0]; ReturnValue.Future; value | +| 26 | Summary: main::get_struct_field; Argument[0].Field[main::MyStruct::field1]; ReturnValue; value | +| 27 | Summary: main::get_tuple_element; Argument[0].Field[0]; ReturnValue; value | +| 28 | Summary: main::get_var_field; Argument[0].Field[main::MyFieldEnum::C::field_c]; ReturnValue; value | +| 29 | Summary: main::get_var_pos; Argument[0].Field[main::MyPosEnum::A(0)]; ReturnValue; value | +| 30 | Summary: main::set_array_element; Argument[0]; ReturnValue.Element; value | +| 31 | Summary: main::set_struct_field; Argument[0]; ReturnValue.Field[main::MyStruct::field2]; value | +| 32 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value | +| 33 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value | +| 34 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value | +| 35 | Summary: main::snd; Argument[1]; ReturnValue; value | edges | main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | | | main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | | @@ -40,13 +43,13 @@ edges | main.rs:16:19:16:19 | s | main.rs:16:10:16:20 | identity(...) | provenance | QL | | main.rs:25:9:25:9 | s | main.rs:26:17:26:17 | s | provenance | | | main.rs:25:13:25:22 | source(...) | main.rs:25:9:25:9 | s | provenance | | -| main.rs:26:17:26:17 | s | main.rs:26:10:26:18 | coerce(...) | provenance | MaD:18 | +| main.rs:26:17:26:17 | s | main.rs:26:10:26:18 | coerce(...) | provenance | MaD:21 | | main.rs:41:9:41:10 | s1 | main.rs:42:17:42:18 | s1 | provenance | | | main.rs:41:9:41:10 | s1 | main.rs:42:17:42:18 | s1 | provenance | | | main.rs:41:14:41:23 | source(...) | main.rs:41:9:41:10 | s1 | provenance | | | main.rs:41:14:41:23 | source(...) | main.rs:41:9:41:10 | s1 | provenance | | -| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:32 | -| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:32 | +| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:35 | +| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:35 | | main.rs:54:9:54:9 | s | main.rs:55:27:55:27 | s | provenance | | | main.rs:54:9:54:9 | s | main.rs:55:27:55:27 | s | provenance | | | main.rs:54:13:54:21 | source(...) | main.rs:54:9:54:9 | s | provenance | | @@ -57,8 +60,8 @@ edges | main.rs:55:14:55:28 | ...::A(...) [A] | main.rs:55:9:55:10 | e1 [A] | provenance | | | main.rs:55:27:55:27 | s | main.rs:55:14:55:28 | ...::A(...) [A] | provenance | | | main.rs:55:27:55:27 | s | main.rs:55:14:55:28 | ...::A(...) [A] | provenance | | -| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:26 | -| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:26 | +| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:29 | +| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:29 | | main.rs:67:9:67:9 | s | main.rs:68:26:68:26 | s | provenance | | | main.rs:67:9:67:9 | s | main.rs:68:26:68:26 | s | provenance | | | main.rs:67:13:67:21 | source(...) | main.rs:67:9:67:9 | s | provenance | | @@ -67,276 +70,318 @@ edges | main.rs:68:9:68:10 | e1 [B] | main.rs:69:11:69:12 | e1 [B] | provenance | | | main.rs:68:14:68:27 | set_var_pos(...) [B] | main.rs:68:9:68:10 | e1 [B] | provenance | | | main.rs:68:14:68:27 | set_var_pos(...) [B] | main.rs:68:9:68:10 | e1 [B] | provenance | | -| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:31 | -| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:31 | +| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:34 | +| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:34 | | main.rs:69:11:69:12 | e1 [B] | main.rs:71:9:71:23 | ...::B(...) [B] | provenance | | | main.rs:69:11:69:12 | e1 [B] | main.rs:71:9:71:23 | ...::B(...) [B] | provenance | | | main.rs:71:9:71:23 | ...::B(...) [B] | main.rs:71:22:71:22 | i | provenance | | | main.rs:71:9:71:23 | ...::B(...) [B] | main.rs:71:22:71:22 | i | provenance | | | main.rs:71:22:71:22 | i | main.rs:71:33:71:33 | i | provenance | | | main.rs:71:22:71:22 | i | main.rs:71:33:71:33 | i | provenance | | -| main.rs:86:9:86:9 | s | main.rs:87:40:87:40 | s | provenance | | -| main.rs:86:9:86:9 | s | main.rs:87:40:87:40 | s | provenance | | -| main.rs:86:13:86:21 | source(...) | main.rs:86:9:86:9 | s | provenance | | -| main.rs:86:13:86:21 | source(...) | main.rs:86:9:86:9 | s | provenance | | -| main.rs:87:9:87:10 | e1 [C] | main.rs:88:24:88:25 | e1 [C] | provenance | | -| main.rs:87:9:87:10 | e1 [C] | main.rs:88:24:88:25 | e1 [C] | provenance | | -| main.rs:87:14:87:42 | ...::C {...} [C] | main.rs:87:9:87:10 | e1 [C] | provenance | | -| main.rs:87:14:87:42 | ...::C {...} [C] | main.rs:87:9:87:10 | e1 [C] | provenance | | -| main.rs:87:40:87:40 | s | main.rs:87:14:87:42 | ...::C {...} [C] | provenance | | -| main.rs:87:40:87:40 | s | main.rs:87:14:87:42 | ...::C {...} [C] | provenance | | -| main.rs:88:24:88:25 | e1 [C] | main.rs:88:10:88:26 | get_var_field(...) | provenance | MaD:25 | -| main.rs:88:24:88:25 | e1 [C] | main.rs:88:10:88:26 | get_var_field(...) | provenance | MaD:25 | -| main.rs:99:9:99:9 | s | main.rs:100:28:100:28 | s | provenance | | -| main.rs:99:9:99:9 | s | main.rs:100:28:100:28 | s | provenance | | -| main.rs:99:13:99:21 | source(...) | main.rs:99:9:99:9 | s | provenance | | -| main.rs:99:13:99:21 | source(...) | main.rs:99:9:99:9 | s | provenance | | -| main.rs:100:9:100:10 | e1 [D] | main.rs:101:11:101:12 | e1 [D] | provenance | | -| main.rs:100:9:100:10 | e1 [D] | main.rs:101:11:101:12 | e1 [D] | provenance | | -| main.rs:100:14:100:29 | set_var_field(...) [D] | main.rs:100:9:100:10 | e1 [D] | provenance | | -| main.rs:100:14:100:29 | set_var_field(...) [D] | main.rs:100:9:100:10 | e1 [D] | provenance | | -| main.rs:100:28:100:28 | s | main.rs:100:14:100:29 | set_var_field(...) [D] | provenance | MaD:30 | -| main.rs:100:28:100:28 | s | main.rs:100:14:100:29 | set_var_field(...) [D] | provenance | MaD:30 | -| main.rs:101:11:101:12 | e1 [D] | main.rs:103:9:103:37 | ...::D {...} [D] | provenance | | -| main.rs:101:11:101:12 | e1 [D] | main.rs:103:9:103:37 | ...::D {...} [D] | provenance | | -| main.rs:103:9:103:37 | ...::D {...} [D] | main.rs:103:35:103:35 | i | provenance | | -| main.rs:103:9:103:37 | ...::D {...} [D] | main.rs:103:35:103:35 | i | provenance | | -| main.rs:103:35:103:35 | i | main.rs:103:47:103:47 | i | provenance | | -| main.rs:103:35:103:35 | i | main.rs:103:47:103:47 | i | provenance | | -| main.rs:118:9:118:9 | s | main.rs:120:17:120:17 | s | provenance | | -| main.rs:118:9:118:9 | s | main.rs:120:17:120:17 | s | provenance | | -| main.rs:118:13:118:21 | source(...) | main.rs:118:9:118:9 | s | provenance | | -| main.rs:118:13:118:21 | source(...) | main.rs:118:9:118:9 | s | provenance | | -| main.rs:119:9:119:17 | my_struct [MyStruct.field1] | main.rs:123:27:123:35 | my_struct [MyStruct.field1] | provenance | | -| main.rs:119:9:119:17 | my_struct [MyStruct.field1] | main.rs:123:27:123:35 | my_struct [MyStruct.field1] | provenance | | -| main.rs:119:21:122:5 | MyStruct {...} [MyStruct.field1] | main.rs:119:9:119:17 | my_struct [MyStruct.field1] | provenance | | -| main.rs:119:21:122:5 | MyStruct {...} [MyStruct.field1] | main.rs:119:9:119:17 | my_struct [MyStruct.field1] | provenance | | -| main.rs:120:17:120:17 | s | main.rs:119:21:122:5 | MyStruct {...} [MyStruct.field1] | provenance | | -| main.rs:120:17:120:17 | s | main.rs:119:21:122:5 | MyStruct {...} [MyStruct.field1] | provenance | | -| main.rs:123:27:123:35 | my_struct [MyStruct.field1] | main.rs:123:10:123:36 | get_struct_field(...) | provenance | MaD:23 | -| main.rs:123:27:123:35 | my_struct [MyStruct.field1] | main.rs:123:10:123:36 | get_struct_field(...) | provenance | MaD:23 | -| main.rs:140:9:140:9 | s | main.rs:141:38:141:38 | s | provenance | | -| main.rs:140:9:140:9 | s | main.rs:141:38:141:38 | s | provenance | | -| main.rs:140:13:140:21 | source(...) | main.rs:140:9:140:9 | s | provenance | | -| main.rs:140:13:140:21 | source(...) | main.rs:140:9:140:9 | s | provenance | | -| main.rs:141:9:141:17 | my_struct [MyStruct.field2] | main.rs:143:10:143:18 | my_struct [MyStruct.field2] | provenance | | -| main.rs:141:9:141:17 | my_struct [MyStruct.field2] | main.rs:143:10:143:18 | my_struct [MyStruct.field2] | provenance | | -| main.rs:141:21:141:39 | set_struct_field(...) [MyStruct.field2] | main.rs:141:9:141:17 | my_struct [MyStruct.field2] | provenance | | -| main.rs:141:21:141:39 | set_struct_field(...) [MyStruct.field2] | main.rs:141:9:141:17 | my_struct [MyStruct.field2] | provenance | | -| main.rs:141:38:141:38 | s | main.rs:141:21:141:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:28 | -| main.rs:141:38:141:38 | s | main.rs:141:21:141:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:28 | -| main.rs:143:10:143:18 | my_struct [MyStruct.field2] | main.rs:143:10:143:25 | my_struct.field2 | provenance | | -| main.rs:143:10:143:18 | my_struct [MyStruct.field2] | main.rs:143:10:143:25 | my_struct.field2 | provenance | | -| main.rs:152:9:152:9 | s | main.rs:153:29:153:29 | s | provenance | | -| main.rs:152:9:152:9 | s | main.rs:153:29:153:29 | s | provenance | | -| main.rs:152:13:152:21 | source(...) | main.rs:152:9:152:9 | s | provenance | | -| main.rs:152:13:152:21 | source(...) | main.rs:152:9:152:9 | s | provenance | | -| main.rs:153:28:153:30 | [...] [element] | main.rs:153:10:153:31 | get_array_element(...) | provenance | MaD:21 | -| main.rs:153:28:153:30 | [...] [element] | main.rs:153:10:153:31 | get_array_element(...) | provenance | MaD:21 | -| main.rs:153:29:153:29 | s | main.rs:153:28:153:30 | [...] [element] | provenance | | -| main.rs:153:29:153:29 | s | main.rs:153:28:153:30 | [...] [element] | provenance | | -| main.rs:162:9:162:9 | s | main.rs:163:33:163:33 | s | provenance | | -| main.rs:162:9:162:9 | s | main.rs:163:33:163:33 | s | provenance | | -| main.rs:162:13:162:21 | source(...) | main.rs:162:9:162:9 | s | provenance | | -| main.rs:162:13:162:21 | source(...) | main.rs:162:9:162:9 | s | provenance | | -| main.rs:163:9:163:11 | arr [element] | main.rs:164:10:164:12 | arr [element] | provenance | | -| main.rs:163:9:163:11 | arr [element] | main.rs:164:10:164:12 | arr [element] | provenance | | -| main.rs:163:15:163:34 | set_array_element(...) [element] | main.rs:163:9:163:11 | arr [element] | provenance | | -| main.rs:163:15:163:34 | set_array_element(...) [element] | main.rs:163:9:163:11 | arr [element] | provenance | | -| main.rs:163:33:163:33 | s | main.rs:163:15:163:34 | set_array_element(...) [element] | provenance | MaD:27 | -| main.rs:163:33:163:33 | s | main.rs:163:15:163:34 | set_array_element(...) [element] | provenance | MaD:27 | -| main.rs:164:10:164:12 | arr [element] | main.rs:164:10:164:15 | arr[0] | provenance | MaD:15 | -| main.rs:164:10:164:12 | arr [element] | main.rs:164:10:164:15 | arr[0] | provenance | MaD:15 | -| main.rs:173:9:173:9 | s | main.rs:174:14:174:14 | s | provenance | | -| main.rs:173:9:173:9 | s | main.rs:174:14:174:14 | s | provenance | | -| main.rs:173:13:173:22 | source(...) | main.rs:173:9:173:9 | s | provenance | | -| main.rs:173:13:173:22 | source(...) | main.rs:173:9:173:9 | s | provenance | | -| main.rs:174:9:174:9 | t [tuple.0] | main.rs:175:28:175:28 | t [tuple.0] | provenance | | -| main.rs:174:9:174:9 | t [tuple.0] | main.rs:175:28:175:28 | t [tuple.0] | provenance | | -| main.rs:174:13:174:18 | TupleExpr [tuple.0] | main.rs:174:9:174:9 | t [tuple.0] | provenance | | -| main.rs:174:13:174:18 | TupleExpr [tuple.0] | main.rs:174:9:174:9 | t [tuple.0] | provenance | | -| main.rs:174:14:174:14 | s | main.rs:174:13:174:18 | TupleExpr [tuple.0] | provenance | | -| main.rs:174:14:174:14 | s | main.rs:174:13:174:18 | TupleExpr [tuple.0] | provenance | | -| main.rs:175:28:175:28 | t [tuple.0] | main.rs:175:10:175:29 | get_tuple_element(...) | provenance | MaD:24 | -| main.rs:175:28:175:28 | t [tuple.0] | main.rs:175:10:175:29 | get_tuple_element(...) | provenance | MaD:24 | -| main.rs:186:9:186:9 | s | main.rs:187:31:187:31 | s | provenance | | -| main.rs:186:9:186:9 | s | main.rs:187:31:187:31 | s | provenance | | -| main.rs:186:13:186:22 | source(...) | main.rs:186:9:186:9 | s | provenance | | -| main.rs:186:13:186:22 | source(...) | main.rs:186:9:186:9 | s | provenance | | -| main.rs:187:9:187:9 | t [tuple.1] | main.rs:189:10:189:10 | t [tuple.1] | provenance | | -| main.rs:187:9:187:9 | t [tuple.1] | main.rs:189:10:189:10 | t [tuple.1] | provenance | | -| main.rs:187:13:187:32 | set_tuple_element(...) [tuple.1] | main.rs:187:9:187:9 | t [tuple.1] | provenance | | -| main.rs:187:13:187:32 | set_tuple_element(...) [tuple.1] | main.rs:187:9:187:9 | t [tuple.1] | provenance | | -| main.rs:187:31:187:31 | s | main.rs:187:13:187:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:29 | -| main.rs:187:31:187:31 | s | main.rs:187:13:187:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:29 | -| main.rs:189:10:189:10 | t [tuple.1] | main.rs:189:10:189:12 | t.1 | provenance | | -| main.rs:189:10:189:10 | t [tuple.1] | main.rs:189:10:189:12 | t.1 | provenance | | -| main.rs:201:9:201:9 | s | main.rs:206:11:206:11 | s | provenance | | -| main.rs:201:9:201:9 | s | main.rs:206:11:206:11 | s | provenance | | -| main.rs:201:13:201:22 | source(...) | main.rs:201:9:201:9 | s | provenance | | -| main.rs:201:13:201:22 | source(...) | main.rs:201:9:201:9 | s | provenance | | -| main.rs:202:14:202:14 | ... | main.rs:203:14:203:14 | n | provenance | | -| main.rs:202:14:202:14 | ... | main.rs:203:14:203:14 | n | provenance | | -| main.rs:206:11:206:11 | s | main.rs:202:14:202:14 | ... | provenance | MaD:16 | -| main.rs:206:11:206:11 | s | main.rs:202:14:202:14 | ... | provenance | MaD:16 | -| main.rs:210:13:210:22 | source(...) | main.rs:212:23:212:23 | f [captured s] | provenance | | -| main.rs:210:13:210:22 | source(...) | main.rs:212:23:212:23 | f [captured s] | provenance | | -| main.rs:211:40:211:40 | s | main.rs:211:17:211:42 | if ... {...} else {...} | provenance | | -| main.rs:211:40:211:40 | s | main.rs:211:17:211:42 | if ... {...} else {...} | provenance | | -| main.rs:212:9:212:9 | t | main.rs:213:10:213:10 | t | provenance | | -| main.rs:212:9:212:9 | t | main.rs:213:10:213:10 | t | provenance | | -| main.rs:212:13:212:24 | apply(...) | main.rs:212:9:212:9 | t | provenance | | -| main.rs:212:13:212:24 | apply(...) | main.rs:212:9:212:9 | t | provenance | | -| main.rs:212:23:212:23 | f [captured s] | main.rs:211:40:211:40 | s | provenance | MaD:16 | -| main.rs:212:23:212:23 | f [captured s] | main.rs:211:40:211:40 | s | provenance | MaD:16 | -| main.rs:212:23:212:23 | f [captured s] | main.rs:211:40:211:40 | s | provenance | MaD:17 | -| main.rs:212:23:212:23 | f [captured s] | main.rs:211:40:211:40 | s | provenance | MaD:17 | -| main.rs:212:23:212:23 | f [captured s] | main.rs:212:13:212:24 | apply(...) | provenance | MaD:16 | -| main.rs:212:23:212:23 | f [captured s] | main.rs:212:13:212:24 | apply(...) | provenance | MaD:16 | -| main.rs:212:23:212:23 | f [captured s] | main.rs:212:13:212:24 | apply(...) | provenance | MaD:17 | -| main.rs:212:23:212:23 | f [captured s] | main.rs:212:13:212:24 | apply(...) | provenance | MaD:17 | -| main.rs:217:9:217:9 | s | main.rs:219:19:219:19 | s | provenance | | -| main.rs:217:9:217:9 | s | main.rs:219:19:219:19 | s | provenance | | -| main.rs:217:13:217:22 | source(...) | main.rs:217:9:217:9 | s | provenance | | -| main.rs:217:13:217:22 | source(...) | main.rs:217:9:217:9 | s | provenance | | -| main.rs:218:14:218:14 | ... | main.rs:218:17:218:42 | if ... {...} else {...} | provenance | | -| main.rs:218:14:218:14 | ... | main.rs:218:17:218:42 | if ... {...} else {...} | provenance | | -| main.rs:219:9:219:9 | t | main.rs:220:10:220:10 | t | provenance | | -| main.rs:219:9:219:9 | t | main.rs:220:10:220:10 | t | provenance | | -| main.rs:219:13:219:23 | apply(...) | main.rs:219:9:219:9 | t | provenance | | -| main.rs:219:13:219:23 | apply(...) | main.rs:219:9:219:9 | t | provenance | | -| main.rs:219:19:219:19 | s | main.rs:218:14:218:14 | ... | provenance | MaD:16 | -| main.rs:219:19:219:19 | s | main.rs:218:14:218:14 | ... | provenance | MaD:16 | -| main.rs:219:19:219:19 | s | main.rs:219:13:219:23 | apply(...) | provenance | MaD:16 | -| main.rs:219:19:219:19 | s | main.rs:219:13:219:23 | apply(...) | provenance | MaD:16 | -| main.rs:229:9:229:9 | s | main.rs:230:30:230:30 | s | provenance | | -| main.rs:229:9:229:9 | s | main.rs:230:30:230:30 | s | provenance | | -| main.rs:229:13:229:22 | source(...) | main.rs:229:9:229:9 | s | provenance | | -| main.rs:229:13:229:22 | source(...) | main.rs:229:9:229:9 | s | provenance | | -| main.rs:230:9:230:9 | t | main.rs:231:10:231:10 | t | provenance | | -| main.rs:230:9:230:9 | t | main.rs:231:10:231:10 | t | provenance | | -| main.rs:230:13:230:31 | get_async_number(...) [future] | main.rs:230:13:230:37 | await ... | provenance | | -| main.rs:230:13:230:31 | get_async_number(...) [future] | main.rs:230:13:230:37 | await ... | provenance | | -| main.rs:230:13:230:37 | await ... | main.rs:230:9:230:9 | t | provenance | | -| main.rs:230:13:230:37 | await ... | main.rs:230:9:230:9 | t | provenance | | -| main.rs:230:30:230:30 | s | main.rs:230:13:230:31 | get_async_number(...) [future] | provenance | MaD:22 | -| main.rs:230:30:230:30 | s | main.rs:230:13:230:31 | get_async_number(...) [future] | provenance | MaD:22 | -| main.rs:250:9:250:9 | s [D] | main.rs:251:11:251:11 | s [D] | provenance | | -| main.rs:250:9:250:9 | s [D] | main.rs:251:11:251:11 | s [D] | provenance | | -| main.rs:250:13:250:23 | enum_source | main.rs:250:13:250:27 | enum_source(...) [D] | provenance | Src:MaD:8 | -| main.rs:250:13:250:23 | enum_source | main.rs:250:13:250:27 | enum_source(...) [D] | provenance | Src:MaD:8 | -| main.rs:250:13:250:27 | enum_source(...) [D] | main.rs:250:9:250:9 | s [D] | provenance | | -| main.rs:250:13:250:27 | enum_source(...) [D] | main.rs:250:9:250:9 | s [D] | provenance | | -| main.rs:251:11:251:11 | s [D] | main.rs:253:9:253:37 | ...::D {...} [D] | provenance | | -| main.rs:251:11:251:11 | s [D] | main.rs:253:9:253:37 | ...::D {...} [D] | provenance | | -| main.rs:253:9:253:37 | ...::D {...} [D] | main.rs:253:35:253:35 | i | provenance | | -| main.rs:253:9:253:37 | ...::D {...} [D] | main.rs:253:35:253:35 | i | provenance | | -| main.rs:253:35:253:35 | i | main.rs:253:47:253:47 | i | provenance | | -| main.rs:253:35:253:35 | i | main.rs:253:47:253:47 | i | provenance | | -| main.rs:259:9:259:9 | s [C] | main.rs:260:11:260:11 | s [C] | provenance | | -| main.rs:259:9:259:9 | s [C] | main.rs:260:11:260:11 | s [C] | provenance | | -| main.rs:259:13:259:24 | e.source(...) [C] | main.rs:259:9:259:9 | s [C] | provenance | | -| main.rs:259:13:259:24 | e.source(...) [C] | main.rs:259:9:259:9 | s [C] | provenance | | -| main.rs:259:15:259:20 | source | main.rs:259:13:259:24 | e.source(...) [C] | provenance | Src:MaD:6 | -| main.rs:259:15:259:20 | source | main.rs:259:13:259:24 | e.source(...) [C] | provenance | Src:MaD:6 | -| main.rs:260:11:260:11 | s [C] | main.rs:261:9:261:37 | ...::C {...} [C] | provenance | | -| main.rs:260:11:260:11 | s [C] | main.rs:261:9:261:37 | ...::C {...} [C] | provenance | | -| main.rs:261:9:261:37 | ...::C {...} [C] | main.rs:261:35:261:35 | i | provenance | | -| main.rs:261:9:261:37 | ...::C {...} [C] | main.rs:261:35:261:35 | i | provenance | | -| main.rs:261:35:261:35 | i | main.rs:261:47:261:47 | i | provenance | | -| main.rs:261:35:261:35 | i | main.rs:261:47:261:47 | i | provenance | | -| main.rs:275:18:275:18 | ... | main.rs:275:26:275:26 | a | provenance | | -| main.rs:275:18:275:18 | ... | main.rs:275:26:275:26 | a | provenance | | -| main.rs:276:9:276:19 | pass_source | main.rs:275:18:275:18 | ... | provenance | Src:MaD:12 | -| main.rs:276:9:276:19 | pass_source | main.rs:275:18:275:18 | ... | provenance | Src:MaD:12 | -| main.rs:278:9:278:19 | pass_source | main.rs:278:25:278:25 | ... | provenance | Src:MaD:12 | -| main.rs:278:9:278:19 | pass_source | main.rs:278:25:278:25 | ... | provenance | Src:MaD:12 | -| main.rs:278:25:278:25 | ... | main.rs:279:18:279:18 | a | provenance | | -| main.rs:278:25:278:25 | ... | main.rs:279:18:279:18 | a | provenance | | -| main.rs:282:14:282:19 | ...: i64 | main.rs:283:18:283:18 | a | provenance | | -| main.rs:282:14:282:19 | ...: i64 | main.rs:283:18:283:18 | a | provenance | | -| main.rs:285:9:285:19 | pass_source | main.rs:282:14:282:19 | ...: i64 | provenance | Src:MaD:12 | -| main.rs:285:9:285:19 | pass_source | main.rs:282:14:282:19 | ...: i64 | provenance | Src:MaD:12 | -| main.rs:287:9:287:19 | pass_source | main.rs:287:36:287:36 | ... | provenance | Src:MaD:12 | -| main.rs:287:9:287:19 | pass_source | main.rs:287:36:287:36 | ... | provenance | Src:MaD:12 | -| main.rs:287:36:287:36 | ... | main.rs:288:18:288:18 | a | provenance | | -| main.rs:287:36:287:36 | ... | main.rs:288:18:288:18 | a | provenance | | -| main.rs:297:9:297:9 | s | main.rs:298:41:298:41 | s | provenance | | -| main.rs:297:9:297:9 | s | main.rs:298:41:298:41 | s | provenance | | -| main.rs:297:13:297:22 | source(...) | main.rs:297:9:297:9 | s | provenance | | -| main.rs:297:13:297:22 | source(...) | main.rs:297:9:297:9 | s | provenance | | -| main.rs:298:15:298:43 | ...::C {...} [C] | main.rs:298:5:298:13 | enum_sink | provenance | MaD:2 Sink:MaD:2 | -| main.rs:298:15:298:43 | ...::C {...} [C] | main.rs:298:5:298:13 | enum_sink | provenance | MaD:2 Sink:MaD:2 | -| main.rs:298:41:298:41 | s | main.rs:298:15:298:43 | ...::C {...} [C] | provenance | | -| main.rs:298:41:298:41 | s | main.rs:298:15:298:43 | ...::C {...} [C] | provenance | | -| main.rs:303:9:303:9 | s | main.rs:304:39:304:39 | s | provenance | | -| main.rs:303:9:303:9 | s | main.rs:304:39:304:39 | s | provenance | | -| main.rs:303:13:303:22 | source(...) | main.rs:303:9:303:9 | s | provenance | | -| main.rs:303:13:303:22 | source(...) | main.rs:303:9:303:9 | s | provenance | | -| main.rs:304:9:304:9 | e [D] | main.rs:305:5:305:5 | e [D] | provenance | | -| main.rs:304:9:304:9 | e [D] | main.rs:305:5:305:5 | e [D] | provenance | | -| main.rs:304:13:304:41 | ...::D {...} [D] | main.rs:304:9:304:9 | e [D] | provenance | | -| main.rs:304:13:304:41 | ...::D {...} [D] | main.rs:304:9:304:9 | e [D] | provenance | | -| main.rs:304:39:304:39 | s | main.rs:304:13:304:41 | ...::D {...} [D] | provenance | | -| main.rs:304:39:304:39 | s | main.rs:304:13:304:41 | ...::D {...} [D] | provenance | | -| main.rs:305:5:305:5 | e [D] | main.rs:305:7:305:10 | sink | provenance | MaD:1 Sink:MaD:1 | -| main.rs:305:5:305:5 | e [D] | main.rs:305:7:305:10 | sink | provenance | MaD:1 Sink:MaD:1 | -| main.rs:314:9:314:9 | s | main.rs:315:10:315:10 | s | provenance | | -| main.rs:314:9:314:9 | s | main.rs:315:10:315:10 | s | provenance | | -| main.rs:314:13:314:25 | simple_source | main.rs:314:13:314:29 | simple_source(...) | provenance | Src:MaD:11 MaD:11 | -| main.rs:314:13:314:25 | simple_source | main.rs:314:13:314:29 | simple_source(...) | provenance | Src:MaD:11 MaD:11 | -| main.rs:314:13:314:29 | simple_source(...) | main.rs:314:9:314:9 | s | provenance | | -| main.rs:314:13:314:29 | simple_source(...) | main.rs:314:9:314:9 | s | provenance | | -| main.rs:322:9:322:9 | s | main.rs:323:17:323:17 | s | provenance | | -| main.rs:322:9:322:9 | s | main.rs:323:17:323:17 | s | provenance | | -| main.rs:322:13:322:22 | source(...) | main.rs:322:9:322:9 | s | provenance | | -| main.rs:322:13:322:22 | source(...) | main.rs:322:9:322:9 | s | provenance | | -| main.rs:323:17:323:17 | s | main.rs:323:5:323:15 | simple_sink | provenance | MaD:5 Sink:MaD:5 | -| main.rs:323:17:323:17 | s | main.rs:323:5:323:15 | simple_sink | provenance | MaD:5 Sink:MaD:5 | -| main.rs:331:5:331:14 | arg_source | main.rs:331:16:331:16 | [post] i | provenance | Src:MaD:7 MaD:7 | -| main.rs:331:5:331:14 | arg_source | main.rs:331:16:331:16 | [post] i | provenance | Src:MaD:7 MaD:7 | -| main.rs:331:16:331:16 | [post] i | main.rs:332:10:332:10 | i | provenance | | -| main.rs:331:16:331:16 | [post] i | main.rs:332:10:332:10 | i | provenance | | -| main.rs:384:9:384:10 | x1 | main.rs:385:10:385:11 | x1 | provenance | | -| main.rs:384:9:384:10 | x1 | main.rs:385:10:385:11 | x1 | provenance | | -| main.rs:384:14:384:23 | source(...) | main.rs:384:14:384:30 | ... .max(...) | provenance | MaD:13 | -| main.rs:384:14:384:23 | source(...) | main.rs:384:14:384:30 | ... .max(...) | provenance | MaD:13 | -| main.rs:384:14:384:30 | ... .max(...) | main.rs:384:9:384:10 | x1 | provenance | | -| main.rs:384:14:384:30 | ... .max(...) | main.rs:384:9:384:10 | x1 | provenance | | -| main.rs:387:9:387:10 | x2 [MyStruct.field1] | main.rs:395:10:395:11 | x2 [MyStruct.field1] | provenance | | -| main.rs:387:9:387:10 | x2 [MyStruct.field1] | main.rs:395:10:395:11 | x2 [MyStruct.field1] | provenance | | -| main.rs:387:14:394:6 | ... .max(...) [MyStruct.field1] | main.rs:387:9:387:10 | x2 [MyStruct.field1] | provenance | | -| main.rs:387:14:394:6 | ... .max(...) [MyStruct.field1] | main.rs:387:9:387:10 | x2 [MyStruct.field1] | provenance | | -| main.rs:387:15:390:5 | MyStruct {...} [MyStruct.field1] | main.rs:387:14:394:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:13 | -| main.rs:387:15:390:5 | MyStruct {...} [MyStruct.field1] | main.rs:387:14:394:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:13 | -| main.rs:388:17:388:26 | source(...) | main.rs:387:15:390:5 | MyStruct {...} [MyStruct.field1] | provenance | | -| main.rs:388:17:388:26 | source(...) | main.rs:387:15:390:5 | MyStruct {...} [MyStruct.field1] | provenance | | -| main.rs:395:10:395:11 | x2 [MyStruct.field1] | main.rs:395:10:395:18 | x2.field1 | provenance | | -| main.rs:395:10:395:11 | x2 [MyStruct.field1] | main.rs:395:10:395:18 | x2.field1 | provenance | | -| main.rs:400:9:400:10 | x4 | main.rs:401:10:401:11 | x4 | provenance | | -| main.rs:400:9:400:10 | x4 | main.rs:401:10:401:11 | x4 | provenance | | -| main.rs:400:14:400:23 | source(...) | main.rs:400:14:400:30 | ... .max(...) | provenance | MaD:13 | -| main.rs:400:14:400:23 | source(...) | main.rs:400:14:400:30 | ... .max(...) | provenance | MaD:13 | -| main.rs:400:14:400:30 | ... .max(...) | main.rs:400:9:400:10 | x4 | provenance | | -| main.rs:400:14:400:30 | ... .max(...) | main.rs:400:9:400:10 | x4 | provenance | | -| main.rs:403:9:403:10 | x5 | main.rs:404:10:404:11 | x5 | provenance | | -| main.rs:403:14:403:23 | source(...) | main.rs:403:14:403:30 | ... .lt(...) | provenance | MaD:14 | -| main.rs:403:14:403:30 | ... .lt(...) | main.rs:403:9:403:10 | x5 | provenance | | -| main.rs:406:9:406:10 | x6 | main.rs:407:10:407:11 | x6 | provenance | | -| main.rs:406:14:406:23 | source(...) | main.rs:406:14:406:27 | ... < ... | provenance | MaD:14 | -| main.rs:406:14:406:27 | ... < ... | main.rs:406:9:406:10 | x6 | provenance | | -| main.rs:422:10:422:25 | generated_source | main.rs:422:10:422:28 | generated_source(...) | provenance | Src:MaD:9 MaD:9 | -| main.rs:422:10:422:25 | generated_source | main.rs:422:10:422:28 | generated_source(...) | provenance | Src:MaD:9 MaD:9 | -| main.rs:424:10:424:30 | neutral_manual_source | main.rs:424:10:424:33 | neutral_manual_source(...) | provenance | Src:MaD:10 MaD:10 | -| main.rs:424:10:424:30 | neutral_manual_source | main.rs:424:10:424:33 | neutral_manual_source(...) | provenance | Src:MaD:10 MaD:10 | -| main.rs:425:20:425:28 | source(...) | main.rs:425:5:425:18 | generated_sink | provenance | MaD:3 Sink:MaD:3 | -| main.rs:425:20:425:28 | source(...) | main.rs:425:5:425:18 | generated_sink | provenance | MaD:3 Sink:MaD:3 | -| main.rs:427:25:427:33 | source(...) | main.rs:427:5:427:23 | neutral_manual_sink | provenance | MaD:4 Sink:MaD:4 | -| main.rs:427:25:427:33 | source(...) | main.rs:427:5:427:23 | neutral_manual_sink | provenance | MaD:4 Sink:MaD:4 | -| main.rs:428:28:428:36 | source(...) | main.rs:428:10:428:37 | generated_summary(...) | provenance | MaD:19 | -| main.rs:428:28:428:36 | source(...) | main.rs:428:10:428:37 | generated_summary(...) | provenance | MaD:19 | -| main.rs:430:33:430:41 | source(...) | main.rs:430:10:430:42 | neutral_manual_summary(...) | provenance | MaD:20 | -| main.rs:430:33:430:41 | source(...) | main.rs:430:10:430:42 | neutral_manual_summary(...) | provenance | MaD:20 | +| main.rs:87:9:87:9 | s | main.rs:88:40:88:40 | s | provenance | | +| main.rs:87:9:87:9 | s | main.rs:88:40:88:40 | s | provenance | | +| main.rs:87:13:87:21 | source(...) | main.rs:87:9:87:9 | s | provenance | | +| main.rs:87:13:87:21 | source(...) | main.rs:87:9:87:9 | s | provenance | | +| main.rs:88:9:88:10 | e1 [C] | main.rs:89:24:89:25 | e1 [C] | provenance | | +| main.rs:88:9:88:10 | e1 [C] | main.rs:89:24:89:25 | e1 [C] | provenance | | +| main.rs:88:14:88:42 | ...::C {...} [C] | main.rs:88:9:88:10 | e1 [C] | provenance | | +| main.rs:88:14:88:42 | ...::C {...} [C] | main.rs:88:9:88:10 | e1 [C] | provenance | | +| main.rs:88:40:88:40 | s | main.rs:88:14:88:42 | ...::C {...} [C] | provenance | | +| main.rs:88:40:88:40 | s | main.rs:88:14:88:42 | ...::C {...} [C] | provenance | | +| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:28 | +| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:28 | +| main.rs:100:9:100:9 | s | main.rs:101:28:101:28 | s | provenance | | +| main.rs:100:9:100:9 | s | main.rs:101:28:101:28 | s | provenance | | +| main.rs:100:13:100:21 | source(...) | main.rs:100:9:100:9 | s | provenance | | +| main.rs:100:13:100:21 | source(...) | main.rs:100:9:100:9 | s | provenance | | +| main.rs:101:9:101:10 | e1 [D] | main.rs:102:11:102:12 | e1 [D] | provenance | | +| main.rs:101:9:101:10 | e1 [D] | main.rs:102:11:102:12 | e1 [D] | provenance | | +| main.rs:101:14:101:29 | set_var_field(...) [D] | main.rs:101:9:101:10 | e1 [D] | provenance | | +| main.rs:101:14:101:29 | set_var_field(...) [D] | main.rs:101:9:101:10 | e1 [D] | provenance | | +| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:33 | +| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:33 | +| main.rs:102:11:102:12 | e1 [D] | main.rs:104:9:104:37 | ...::D {...} [D] | provenance | | +| main.rs:102:11:102:12 | e1 [D] | main.rs:104:9:104:37 | ...::D {...} [D] | provenance | | +| main.rs:104:9:104:37 | ...::D {...} [D] | main.rs:104:35:104:35 | i | provenance | | +| main.rs:104:9:104:37 | ...::D {...} [D] | main.rs:104:35:104:35 | i | provenance | | +| main.rs:104:35:104:35 | i | main.rs:104:47:104:47 | i | provenance | | +| main.rs:104:35:104:35 | i | main.rs:104:47:104:47 | i | provenance | | +| main.rs:120:9:120:9 | s | main.rs:122:17:122:17 | s | provenance | | +| main.rs:120:9:120:9 | s | main.rs:122:17:122:17 | s | provenance | | +| main.rs:120:13:120:21 | source(...) | main.rs:120:9:120:9 | s | provenance | | +| main.rs:120:13:120:21 | source(...) | main.rs:120:9:120:9 | s | provenance | | +| main.rs:121:9:121:17 | my_struct [MyStruct.field1] | main.rs:125:27:125:35 | my_struct [MyStruct.field1] | provenance | | +| main.rs:121:9:121:17 | my_struct [MyStruct.field1] | main.rs:125:27:125:35 | my_struct [MyStruct.field1] | provenance | | +| main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | main.rs:121:9:121:17 | my_struct [MyStruct.field1] | provenance | | +| main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | main.rs:121:9:121:17 | my_struct [MyStruct.field1] | provenance | | +| main.rs:122:17:122:17 | s | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | provenance | | +| main.rs:122:17:122:17 | s | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | provenance | | +| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:26 | +| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:26 | +| main.rs:142:9:142:9 | s | main.rs:143:38:143:38 | s | provenance | | +| main.rs:142:9:142:9 | s | main.rs:143:38:143:38 | s | provenance | | +| main.rs:142:13:142:21 | source(...) | main.rs:142:9:142:9 | s | provenance | | +| main.rs:142:13:142:21 | source(...) | main.rs:142:9:142:9 | s | provenance | | +| main.rs:143:9:143:17 | my_struct [MyStruct.field2] | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | provenance | | +| main.rs:143:9:143:17 | my_struct [MyStruct.field2] | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | provenance | | +| main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | provenance | | +| main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | provenance | | +| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:31 | +| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:31 | +| main.rs:145:10:145:18 | my_struct [MyStruct.field2] | main.rs:145:10:145:25 | my_struct.field2 | provenance | | +| main.rs:145:10:145:18 | my_struct [MyStruct.field2] | main.rs:145:10:145:25 | my_struct.field2 | provenance | | +| main.rs:154:9:154:9 | s | main.rs:155:29:155:29 | s | provenance | | +| main.rs:154:9:154:9 | s | main.rs:155:29:155:29 | s | provenance | | +| main.rs:154:13:154:21 | source(...) | main.rs:154:9:154:9 | s | provenance | | +| main.rs:154:13:154:21 | source(...) | main.rs:154:9:154:9 | s | provenance | | +| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:24 | +| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:24 | +| main.rs:155:29:155:29 | s | main.rs:155:28:155:30 | [...] [element] | provenance | | +| main.rs:155:29:155:29 | s | main.rs:155:28:155:30 | [...] [element] | provenance | | +| main.rs:164:9:164:9 | s | main.rs:165:33:165:33 | s | provenance | | +| main.rs:164:9:164:9 | s | main.rs:165:33:165:33 | s | provenance | | +| main.rs:164:13:164:21 | source(...) | main.rs:164:9:164:9 | s | provenance | | +| main.rs:164:13:164:21 | source(...) | main.rs:164:9:164:9 | s | provenance | | +| main.rs:165:9:165:11 | arr [element] | main.rs:166:10:166:12 | arr [element] | provenance | | +| main.rs:165:9:165:11 | arr [element] | main.rs:166:10:166:12 | arr [element] | provenance | | +| main.rs:165:15:165:34 | set_array_element(...) [element] | main.rs:165:9:165:11 | arr [element] | provenance | | +| main.rs:165:15:165:34 | set_array_element(...) [element] | main.rs:165:9:165:11 | arr [element] | provenance | | +| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:30 | +| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:30 | +| main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:18 | +| main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:18 | +| main.rs:175:9:175:9 | s | main.rs:176:14:176:14 | s | provenance | | +| main.rs:175:9:175:9 | s | main.rs:176:14:176:14 | s | provenance | | +| main.rs:175:13:175:22 | source(...) | main.rs:175:9:175:9 | s | provenance | | +| main.rs:175:13:175:22 | source(...) | main.rs:175:9:175:9 | s | provenance | | +| main.rs:176:9:176:9 | t [tuple.0] | main.rs:177:28:177:28 | t [tuple.0] | provenance | | +| main.rs:176:9:176:9 | t [tuple.0] | main.rs:177:28:177:28 | t [tuple.0] | provenance | | +| main.rs:176:13:176:18 | TupleExpr [tuple.0] | main.rs:176:9:176:9 | t [tuple.0] | provenance | | +| main.rs:176:13:176:18 | TupleExpr [tuple.0] | main.rs:176:9:176:9 | t [tuple.0] | provenance | | +| main.rs:176:14:176:14 | s | main.rs:176:13:176:18 | TupleExpr [tuple.0] | provenance | | +| main.rs:176:14:176:14 | s | main.rs:176:13:176:18 | TupleExpr [tuple.0] | provenance | | +| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:27 | +| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:27 | +| main.rs:188:9:188:9 | s | main.rs:189:31:189:31 | s | provenance | | +| main.rs:188:9:188:9 | s | main.rs:189:31:189:31 | s | provenance | | +| main.rs:188:13:188:22 | source(...) | main.rs:188:9:188:9 | s | provenance | | +| main.rs:188:13:188:22 | source(...) | main.rs:188:9:188:9 | s | provenance | | +| main.rs:189:9:189:9 | t [tuple.1] | main.rs:191:10:191:10 | t [tuple.1] | provenance | | +| main.rs:189:9:189:9 | t [tuple.1] | main.rs:191:10:191:10 | t [tuple.1] | provenance | | +| main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | main.rs:189:9:189:9 | t [tuple.1] | provenance | | +| main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | main.rs:189:9:189:9 | t [tuple.1] | provenance | | +| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:32 | +| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:32 | +| main.rs:191:10:191:10 | t [tuple.1] | main.rs:191:10:191:12 | t.1 | provenance | | +| main.rs:191:10:191:10 | t [tuple.1] | main.rs:191:10:191:12 | t.1 | provenance | | +| main.rs:203:9:203:9 | s | main.rs:208:11:208:11 | s | provenance | | +| main.rs:203:9:203:9 | s | main.rs:208:11:208:11 | s | provenance | | +| main.rs:203:13:203:22 | source(...) | main.rs:203:9:203:9 | s | provenance | | +| main.rs:203:13:203:22 | source(...) | main.rs:203:9:203:9 | s | provenance | | +| main.rs:204:14:204:14 | ... | main.rs:205:14:205:14 | n | provenance | | +| main.rs:204:14:204:14 | ... | main.rs:205:14:205:14 | n | provenance | | +| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:19 | +| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:19 | +| main.rs:212:13:212:22 | source(...) | main.rs:214:23:214:23 | f [captured s] | provenance | | +| main.rs:212:13:212:22 | source(...) | main.rs:214:23:214:23 | f [captured s] | provenance | | +| main.rs:213:40:213:40 | s | main.rs:213:17:213:42 | if ... {...} else {...} | provenance | | +| main.rs:213:40:213:40 | s | main.rs:213:17:213:42 | if ... {...} else {...} | provenance | | +| main.rs:214:9:214:9 | t | main.rs:215:10:215:10 | t | provenance | | +| main.rs:214:9:214:9 | t | main.rs:215:10:215:10 | t | provenance | | +| main.rs:214:13:214:24 | apply(...) | main.rs:214:9:214:9 | t | provenance | | +| main.rs:214:13:214:24 | apply(...) | main.rs:214:9:214:9 | t | provenance | | +| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:19 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:19 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:20 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:20 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:19 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:19 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:20 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:20 | +| main.rs:219:9:219:9 | s | main.rs:221:19:221:19 | s | provenance | | +| main.rs:219:9:219:9 | s | main.rs:221:19:221:19 | s | provenance | | +| main.rs:219:13:219:22 | source(...) | main.rs:219:9:219:9 | s | provenance | | +| main.rs:219:13:219:22 | source(...) | main.rs:219:9:219:9 | s | provenance | | +| main.rs:220:14:220:14 | ... | main.rs:220:17:220:42 | if ... {...} else {...} | provenance | | +| main.rs:220:14:220:14 | ... | main.rs:220:17:220:42 | if ... {...} else {...} | provenance | | +| main.rs:221:9:221:9 | t | main.rs:222:10:222:10 | t | provenance | | +| main.rs:221:9:221:9 | t | main.rs:222:10:222:10 | t | provenance | | +| main.rs:221:13:221:23 | apply(...) | main.rs:221:9:221:9 | t | provenance | | +| main.rs:221:13:221:23 | apply(...) | main.rs:221:9:221:9 | t | provenance | | +| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | provenance | MaD:19 | +| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | provenance | MaD:19 | +| main.rs:221:19:221:19 | s | main.rs:221:13:221:23 | apply(...) | provenance | MaD:19 | +| main.rs:221:19:221:19 | s | main.rs:221:13:221:23 | apply(...) | provenance | MaD:19 | +| main.rs:231:9:231:9 | s | main.rs:232:30:232:30 | s | provenance | | +| main.rs:231:9:231:9 | s | main.rs:232:30:232:30 | s | provenance | | +| main.rs:231:13:231:22 | source(...) | main.rs:231:9:231:9 | s | provenance | | +| main.rs:231:13:231:22 | source(...) | main.rs:231:9:231:9 | s | provenance | | +| main.rs:232:9:232:9 | t | main.rs:233:10:233:10 | t | provenance | | +| main.rs:232:9:232:9 | t | main.rs:233:10:233:10 | t | provenance | | +| main.rs:232:13:232:31 | get_async_number(...) [future] | main.rs:232:13:232:37 | await ... | provenance | | +| main.rs:232:13:232:31 | get_async_number(...) [future] | main.rs:232:13:232:37 | await ... | provenance | | +| main.rs:232:13:232:37 | await ... | main.rs:232:9:232:9 | t | provenance | | +| main.rs:232:13:232:37 | await ... | main.rs:232:9:232:9 | t | provenance | | +| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:25 | +| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:25 | +| main.rs:257:9:257:9 | s [D] | main.rs:258:11:258:11 | s [D] | provenance | | +| main.rs:257:9:257:9 | s [D] | main.rs:258:11:258:11 | s [D] | provenance | | +| main.rs:257:13:257:23 | enum_source | main.rs:257:13:257:27 | enum_source(...) [D] | provenance | Src:MaD:9 | +| main.rs:257:13:257:23 | enum_source | main.rs:257:13:257:27 | enum_source(...) [D] | provenance | Src:MaD:9 | +| main.rs:257:13:257:27 | enum_source(...) [D] | main.rs:257:9:257:9 | s [D] | provenance | | +| main.rs:257:13:257:27 | enum_source(...) [D] | main.rs:257:9:257:9 | s [D] | provenance | | +| main.rs:258:11:258:11 | s [D] | main.rs:260:9:260:37 | ...::D {...} [D] | provenance | | +| main.rs:258:11:258:11 | s [D] | main.rs:260:9:260:37 | ...::D {...} [D] | provenance | | +| main.rs:260:9:260:37 | ...::D {...} [D] | main.rs:260:35:260:35 | i | provenance | | +| main.rs:260:9:260:37 | ...::D {...} [D] | main.rs:260:35:260:35 | i | provenance | | +| main.rs:260:35:260:35 | i | main.rs:260:47:260:47 | i | provenance | | +| main.rs:260:35:260:35 | i | main.rs:260:47:260:47 | i | provenance | | +| main.rs:264:9:264:9 | s [E, Some] | main.rs:265:11:265:11 | s [E, Some] | provenance | | +| main.rs:264:9:264:9 | s [E, Some] | main.rs:265:11:265:11 | s [E, Some] | provenance | | +| main.rs:264:13:264:30 | enum_source_nested | main.rs:264:13:264:34 | enum_source_nested(...) [E, Some] | provenance | Src:MaD:10 | +| main.rs:264:13:264:30 | enum_source_nested | main.rs:264:13:264:34 | enum_source_nested(...) [E, Some] | provenance | Src:MaD:10 | +| main.rs:264:13:264:34 | enum_source_nested(...) [E, Some] | main.rs:264:9:264:9 | s [E, Some] | provenance | | +| main.rs:264:13:264:34 | enum_source_nested(...) [E, Some] | main.rs:264:9:264:9 | s [E, Some] | provenance | | +| main.rs:265:11:265:11 | s [E, Some] | main.rs:268:9:268:37 | ...::E {...} [E, Some] | provenance | | +| main.rs:265:11:265:11 | s [E, Some] | main.rs:268:9:268:37 | ...::E {...} [E, Some] | provenance | | +| main.rs:268:9:268:37 | ...::E {...} [E, Some] | main.rs:268:35:268:35 | o [Some] | provenance | | +| main.rs:268:9:268:37 | ...::E {...} [E, Some] | main.rs:268:35:268:35 | o [Some] | provenance | | +| main.rs:268:35:268:35 | o [Some] | main.rs:270:19:270:19 | o [Some] | provenance | | +| main.rs:268:35:268:35 | o [Some] | main.rs:270:19:270:19 | o [Some] | provenance | | +| main.rs:270:19:270:19 | o [Some] | main.rs:271:17:271:23 | Some(...) [Some] | provenance | | +| main.rs:270:19:270:19 | o [Some] | main.rs:271:17:271:23 | Some(...) [Some] | provenance | | +| main.rs:271:17:271:23 | Some(...) [Some] | main.rs:271:22:271:22 | i | provenance | | +| main.rs:271:17:271:23 | Some(...) [Some] | main.rs:271:22:271:22 | i | provenance | | +| main.rs:271:22:271:22 | i | main.rs:271:33:271:33 | i | provenance | | +| main.rs:271:22:271:22 | i | main.rs:271:33:271:33 | i | provenance | | +| main.rs:280:9:280:9 | s [C] | main.rs:281:11:281:11 | s [C] | provenance | | +| main.rs:280:9:280:9 | s [C] | main.rs:281:11:281:11 | s [C] | provenance | | +| main.rs:280:13:280:24 | e.source(...) [C] | main.rs:280:9:280:9 | s [C] | provenance | | +| main.rs:280:13:280:24 | e.source(...) [C] | main.rs:280:9:280:9 | s [C] | provenance | | +| main.rs:280:15:280:20 | source | main.rs:280:13:280:24 | e.source(...) [C] | provenance | Src:MaD:7 | +| main.rs:280:15:280:20 | source | main.rs:280:13:280:24 | e.source(...) [C] | provenance | Src:MaD:7 | +| main.rs:281:11:281:11 | s [C] | main.rs:282:9:282:37 | ...::C {...} [C] | provenance | | +| main.rs:281:11:281:11 | s [C] | main.rs:282:9:282:37 | ...::C {...} [C] | provenance | | +| main.rs:282:9:282:37 | ...::C {...} [C] | main.rs:282:35:282:35 | i | provenance | | +| main.rs:282:9:282:37 | ...::C {...} [C] | main.rs:282:35:282:35 | i | provenance | | +| main.rs:282:35:282:35 | i | main.rs:282:47:282:47 | i | provenance | | +| main.rs:282:35:282:35 | i | main.rs:282:47:282:47 | i | provenance | | +| main.rs:303:18:303:18 | ... | main.rs:303:26:303:26 | a | provenance | | +| main.rs:303:18:303:18 | ... | main.rs:303:26:303:26 | a | provenance | | +| main.rs:304:9:304:19 | pass_source | main.rs:303:18:303:18 | ... | provenance | Src:MaD:14 | +| main.rs:304:9:304:19 | pass_source | main.rs:303:18:303:18 | ... | provenance | Src:MaD:14 | +| main.rs:306:9:306:19 | pass_source | main.rs:306:25:306:25 | ... | provenance | Src:MaD:14 | +| main.rs:306:9:306:19 | pass_source | main.rs:306:25:306:25 | ... | provenance | Src:MaD:14 | +| main.rs:306:25:306:25 | ... | main.rs:307:18:307:18 | a | provenance | | +| main.rs:306:25:306:25 | ... | main.rs:307:18:307:18 | a | provenance | | +| main.rs:310:14:310:19 | ...: i64 | main.rs:311:18:311:18 | a | provenance | | +| main.rs:310:14:310:19 | ...: i64 | main.rs:311:18:311:18 | a | provenance | | +| main.rs:313:9:313:19 | pass_source | main.rs:310:14:310:19 | ...: i64 | provenance | Src:MaD:14 | +| main.rs:313:9:313:19 | pass_source | main.rs:310:14:310:19 | ...: i64 | provenance | Src:MaD:14 | +| main.rs:315:9:315:19 | pass_source | main.rs:315:36:315:36 | ... | provenance | Src:MaD:14 | +| main.rs:315:9:315:19 | pass_source | main.rs:315:36:315:36 | ... | provenance | Src:MaD:14 | +| main.rs:315:36:315:36 | ... | main.rs:316:18:316:18 | a | provenance | | +| main.rs:315:36:315:36 | ... | main.rs:316:18:316:18 | a | provenance | | +| main.rs:319:9:319:26 | pass_source_nested | main.rs:319:32:319:32 | ... [E, Some] | provenance | Src:MaD:15 | +| main.rs:319:9:319:26 | pass_source_nested | main.rs:319:32:319:32 | ... [E, Some] | provenance | Src:MaD:15 | +| main.rs:319:32:319:32 | ... [E, Some] | main.rs:320:19:320:19 | e [E, Some] | provenance | | +| main.rs:319:32:319:32 | ... [E, Some] | main.rs:320:19:320:19 | e [E, Some] | provenance | | +| main.rs:320:19:320:19 | e [E, Some] | main.rs:323:17:323:45 | ...::E {...} [E, Some] | provenance | | +| main.rs:320:19:320:19 | e [E, Some] | main.rs:323:17:323:45 | ...::E {...} [E, Some] | provenance | | +| main.rs:323:17:323:45 | ...::E {...} [E, Some] | main.rs:323:43:323:43 | o [Some] | provenance | | +| main.rs:323:17:323:45 | ...::E {...} [E, Some] | main.rs:323:43:323:43 | o [Some] | provenance | | +| main.rs:323:43:323:43 | o [Some] | main.rs:325:27:325:27 | o [Some] | provenance | | +| main.rs:323:43:323:43 | o [Some] | main.rs:325:27:325:27 | o [Some] | provenance | | +| main.rs:325:27:325:27 | o [Some] | main.rs:326:25:326:31 | Some(...) [Some] | provenance | | +| main.rs:325:27:325:27 | o [Some] | main.rs:326:25:326:31 | Some(...) [Some] | provenance | | +| main.rs:326:25:326:31 | Some(...) [Some] | main.rs:326:30:326:30 | i | provenance | | +| main.rs:326:25:326:31 | Some(...) [Some] | main.rs:326:30:326:30 | i | provenance | | +| main.rs:326:30:326:30 | i | main.rs:326:41:326:41 | i | provenance | | +| main.rs:326:30:326:30 | i | main.rs:326:41:326:41 | i | provenance | | +| main.rs:364:9:364:9 | s | main.rs:365:41:365:41 | s | provenance | | +| main.rs:364:9:364:9 | s | main.rs:365:41:365:41 | s | provenance | | +| main.rs:364:9:364:9 | s | main.rs:368:53:368:53 | s | provenance | | +| main.rs:364:9:364:9 | s | main.rs:368:53:368:53 | s | provenance | | +| main.rs:364:13:364:22 | source(...) | main.rs:364:9:364:9 | s | provenance | | +| main.rs:364:13:364:22 | source(...) | main.rs:364:9:364:9 | s | provenance | | +| main.rs:365:15:365:43 | ...::C {...} [C] | main.rs:365:5:365:13 | enum_sink | provenance | MaD:2 Sink:MaD:2 | +| main.rs:365:15:365:43 | ...::C {...} [C] | main.rs:365:5:365:13 | enum_sink | provenance | MaD:2 Sink:MaD:2 | +| main.rs:365:41:365:41 | s | main.rs:365:15:365:43 | ...::C {...} [C] | provenance | | +| main.rs:365:41:365:41 | s | main.rs:365:15:365:43 | ...::C {...} [C] | provenance | | +| main.rs:368:22:368:56 | ...::E {...} [E, Some] | main.rs:368:5:368:20 | enum_sink_nested | provenance | MaD:3 Sink:MaD:3 | +| main.rs:368:22:368:56 | ...::E {...} [E, Some] | main.rs:368:5:368:20 | enum_sink_nested | provenance | MaD:3 Sink:MaD:3 | +| main.rs:368:48:368:54 | Some(...) [Some] | main.rs:368:22:368:56 | ...::E {...} [E, Some] | provenance | | +| main.rs:368:48:368:54 | Some(...) [Some] | main.rs:368:22:368:56 | ...::E {...} [E, Some] | provenance | | +| main.rs:368:53:368:53 | s | main.rs:368:48:368:54 | Some(...) [Some] | provenance | | +| main.rs:368:53:368:53 | s | main.rs:368:48:368:54 | Some(...) [Some] | provenance | | +| main.rs:372:9:372:9 | s | main.rs:373:39:373:39 | s | provenance | | +| main.rs:372:9:372:9 | s | main.rs:373:39:373:39 | s | provenance | | +| main.rs:372:13:372:22 | source(...) | main.rs:372:9:372:9 | s | provenance | | +| main.rs:372:13:372:22 | source(...) | main.rs:372:9:372:9 | s | provenance | | +| main.rs:373:9:373:9 | e [D] | main.rs:374:5:374:5 | e [D] | provenance | | +| main.rs:373:9:373:9 | e [D] | main.rs:374:5:374:5 | e [D] | provenance | | +| main.rs:373:13:373:41 | ...::D {...} [D] | main.rs:373:9:373:9 | e [D] | provenance | | +| main.rs:373:13:373:41 | ...::D {...} [D] | main.rs:373:9:373:9 | e [D] | provenance | | +| main.rs:373:39:373:39 | s | main.rs:373:13:373:41 | ...::D {...} [D] | provenance | | +| main.rs:373:39:373:39 | s | main.rs:373:13:373:41 | ...::D {...} [D] | provenance | | +| main.rs:374:5:374:5 | e [D] | main.rs:374:7:374:10 | sink | provenance | MaD:1 Sink:MaD:1 | +| main.rs:374:5:374:5 | e [D] | main.rs:374:7:374:10 | sink | provenance | MaD:1 Sink:MaD:1 | +| main.rs:383:9:383:9 | s | main.rs:384:10:384:10 | s | provenance | | +| main.rs:383:9:383:9 | s | main.rs:384:10:384:10 | s | provenance | | +| main.rs:383:13:383:25 | simple_source | main.rs:383:13:383:29 | simple_source(...) | provenance | Src:MaD:13 MaD:13 | +| main.rs:383:13:383:25 | simple_source | main.rs:383:13:383:29 | simple_source(...) | provenance | Src:MaD:13 MaD:13 | +| main.rs:383:13:383:29 | simple_source(...) | main.rs:383:9:383:9 | s | provenance | | +| main.rs:383:13:383:29 | simple_source(...) | main.rs:383:9:383:9 | s | provenance | | +| main.rs:391:9:391:9 | s | main.rs:392:17:392:17 | s | provenance | | +| main.rs:391:9:391:9 | s | main.rs:392:17:392:17 | s | provenance | | +| main.rs:391:13:391:22 | source(...) | main.rs:391:9:391:9 | s | provenance | | +| main.rs:391:13:391:22 | source(...) | main.rs:391:9:391:9 | s | provenance | | +| main.rs:392:17:392:17 | s | main.rs:392:5:392:15 | simple_sink | provenance | MaD:6 Sink:MaD:6 | +| main.rs:392:17:392:17 | s | main.rs:392:5:392:15 | simple_sink | provenance | MaD:6 Sink:MaD:6 | +| main.rs:400:5:400:14 | arg_source | main.rs:400:16:400:16 | [post] i | provenance | Src:MaD:8 MaD:8 | +| main.rs:400:5:400:14 | arg_source | main.rs:400:16:400:16 | [post] i | provenance | Src:MaD:8 MaD:8 | +| main.rs:400:16:400:16 | [post] i | main.rs:401:10:401:10 | i | provenance | | +| main.rs:400:16:400:16 | [post] i | main.rs:401:10:401:10 | i | provenance | | +| main.rs:464:9:464:10 | x1 | main.rs:465:10:465:11 | x1 | provenance | | +| main.rs:464:9:464:10 | x1 | main.rs:465:10:465:11 | x1 | provenance | | +| main.rs:464:14:464:23 | source(...) | main.rs:464:14:464:30 | ... .max(...) | provenance | MaD:16 | +| main.rs:464:14:464:23 | source(...) | main.rs:464:14:464:30 | ... .max(...) | provenance | MaD:16 | +| main.rs:464:14:464:30 | ... .max(...) | main.rs:464:9:464:10 | x1 | provenance | | +| main.rs:464:14:464:30 | ... .max(...) | main.rs:464:9:464:10 | x1 | provenance | | +| main.rs:467:9:467:10 | x2 [MyStruct.field1] | main.rs:475:10:475:11 | x2 [MyStruct.field1] | provenance | | +| main.rs:467:9:467:10 | x2 [MyStruct.field1] | main.rs:475:10:475:11 | x2 [MyStruct.field1] | provenance | | +| main.rs:467:14:474:6 | ... .max(...) [MyStruct.field1] | main.rs:467:9:467:10 | x2 [MyStruct.field1] | provenance | | +| main.rs:467:14:474:6 | ... .max(...) [MyStruct.field1] | main.rs:467:9:467:10 | x2 [MyStruct.field1] | provenance | | +| main.rs:467:15:470:5 | MyStruct {...} [MyStruct.field1] | main.rs:467:14:474:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:16 | +| main.rs:467:15:470:5 | MyStruct {...} [MyStruct.field1] | main.rs:467:14:474:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:16 | +| main.rs:468:17:468:26 | source(...) | main.rs:467:15:470:5 | MyStruct {...} [MyStruct.field1] | provenance | | +| main.rs:468:17:468:26 | source(...) | main.rs:467:15:470:5 | MyStruct {...} [MyStruct.field1] | provenance | | +| main.rs:475:10:475:11 | x2 [MyStruct.field1] | main.rs:475:10:475:18 | x2.field1 | provenance | | +| main.rs:475:10:475:11 | x2 [MyStruct.field1] | main.rs:475:10:475:18 | x2.field1 | provenance | | +| main.rs:480:9:480:10 | x4 | main.rs:481:10:481:11 | x4 | provenance | | +| main.rs:480:9:480:10 | x4 | main.rs:481:10:481:11 | x4 | provenance | | +| main.rs:480:14:480:23 | source(...) | main.rs:480:14:480:30 | ... .max(...) | provenance | MaD:16 | +| main.rs:480:14:480:23 | source(...) | main.rs:480:14:480:30 | ... .max(...) | provenance | MaD:16 | +| main.rs:480:14:480:30 | ... .max(...) | main.rs:480:9:480:10 | x4 | provenance | | +| main.rs:480:14:480:30 | ... .max(...) | main.rs:480:9:480:10 | x4 | provenance | | +| main.rs:483:9:483:10 | x5 | main.rs:484:10:484:11 | x5 | provenance | | +| main.rs:483:14:483:23 | source(...) | main.rs:483:14:483:30 | ... .lt(...) | provenance | MaD:17 | +| main.rs:483:14:483:30 | ... .lt(...) | main.rs:483:9:483:10 | x5 | provenance | | +| main.rs:486:9:486:10 | x6 | main.rs:487:10:487:11 | x6 | provenance | | +| main.rs:486:14:486:23 | source(...) | main.rs:486:14:486:27 | ... < ... | provenance | MaD:17 | +| main.rs:486:14:486:27 | ... < ... | main.rs:486:9:486:10 | x6 | provenance | | +| main.rs:502:10:502:25 | generated_source | main.rs:502:10:502:28 | generated_source(...) | provenance | Src:MaD:11 MaD:11 | +| main.rs:502:10:502:25 | generated_source | main.rs:502:10:502:28 | generated_source(...) | provenance | Src:MaD:11 MaD:11 | +| main.rs:504:10:504:30 | neutral_manual_source | main.rs:504:10:504:33 | neutral_manual_source(...) | provenance | Src:MaD:12 MaD:12 | +| main.rs:504:10:504:30 | neutral_manual_source | main.rs:504:10:504:33 | neutral_manual_source(...) | provenance | Src:MaD:12 MaD:12 | +| main.rs:505:20:505:28 | source(...) | main.rs:505:5:505:18 | generated_sink | provenance | MaD:4 Sink:MaD:4 | +| main.rs:505:20:505:28 | source(...) | main.rs:505:5:505:18 | generated_sink | provenance | MaD:4 Sink:MaD:4 | +| main.rs:507:25:507:33 | source(...) | main.rs:507:5:507:23 | neutral_manual_sink | provenance | MaD:5 Sink:MaD:5 | +| main.rs:507:25:507:33 | source(...) | main.rs:507:5:507:23 | neutral_manual_sink | provenance | MaD:5 Sink:MaD:5 | +| main.rs:508:28:508:36 | source(...) | main.rs:508:10:508:37 | generated_summary(...) | provenance | MaD:22 | +| main.rs:508:28:508:36 | source(...) | main.rs:508:10:508:37 | generated_summary(...) | provenance | MaD:22 | +| main.rs:510:33:510:41 | source(...) | main.rs:510:10:510:42 | neutral_manual_summary(...) | provenance | MaD:23 | +| main.rs:510:33:510:41 | source(...) | main.rs:510:10:510:42 | neutral_manual_summary(...) | provenance | MaD:23 | nodes | main.rs:15:9:15:9 | s | semmle.label | s | | main.rs:15:9:15:9 | s | semmle.label | s | @@ -390,335 +435,381 @@ nodes | main.rs:71:22:71:22 | i | semmle.label | i | | main.rs:71:33:71:33 | i | semmle.label | i | | main.rs:71:33:71:33 | i | semmle.label | i | -| main.rs:86:9:86:9 | s | semmle.label | s | -| main.rs:86:9:86:9 | s | semmle.label | s | -| main.rs:86:13:86:21 | source(...) | semmle.label | source(...) | -| main.rs:86:13:86:21 | source(...) | semmle.label | source(...) | -| main.rs:87:9:87:10 | e1 [C] | semmle.label | e1 [C] | -| main.rs:87:9:87:10 | e1 [C] | semmle.label | e1 [C] | -| main.rs:87:14:87:42 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | -| main.rs:87:14:87:42 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | -| main.rs:87:40:87:40 | s | semmle.label | s | -| main.rs:87:40:87:40 | s | semmle.label | s | -| main.rs:88:10:88:26 | get_var_field(...) | semmle.label | get_var_field(...) | -| main.rs:88:10:88:26 | get_var_field(...) | semmle.label | get_var_field(...) | -| main.rs:88:24:88:25 | e1 [C] | semmle.label | e1 [C] | -| main.rs:88:24:88:25 | e1 [C] | semmle.label | e1 [C] | -| main.rs:99:9:99:9 | s | semmle.label | s | -| main.rs:99:9:99:9 | s | semmle.label | s | -| main.rs:99:13:99:21 | source(...) | semmle.label | source(...) | -| main.rs:99:13:99:21 | source(...) | semmle.label | source(...) | -| main.rs:100:9:100:10 | e1 [D] | semmle.label | e1 [D] | -| main.rs:100:9:100:10 | e1 [D] | semmle.label | e1 [D] | -| main.rs:100:14:100:29 | set_var_field(...) [D] | semmle.label | set_var_field(...) [D] | -| main.rs:100:14:100:29 | set_var_field(...) [D] | semmle.label | set_var_field(...) [D] | -| main.rs:100:28:100:28 | s | semmle.label | s | -| main.rs:100:28:100:28 | s | semmle.label | s | -| main.rs:101:11:101:12 | e1 [D] | semmle.label | e1 [D] | -| main.rs:101:11:101:12 | e1 [D] | semmle.label | e1 [D] | -| main.rs:103:9:103:37 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | -| main.rs:103:9:103:37 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | -| main.rs:103:35:103:35 | i | semmle.label | i | -| main.rs:103:35:103:35 | i | semmle.label | i | -| main.rs:103:47:103:47 | i | semmle.label | i | -| main.rs:103:47:103:47 | i | semmle.label | i | -| main.rs:118:9:118:9 | s | semmle.label | s | -| main.rs:118:9:118:9 | s | semmle.label | s | -| main.rs:118:13:118:21 | source(...) | semmle.label | source(...) | -| main.rs:118:13:118:21 | source(...) | semmle.label | source(...) | -| main.rs:119:9:119:17 | my_struct [MyStruct.field1] | semmle.label | my_struct [MyStruct.field1] | -| main.rs:119:9:119:17 | my_struct [MyStruct.field1] | semmle.label | my_struct [MyStruct.field1] | -| main.rs:119:21:122:5 | MyStruct {...} [MyStruct.field1] | semmle.label | MyStruct {...} [MyStruct.field1] | -| main.rs:119:21:122:5 | MyStruct {...} [MyStruct.field1] | semmle.label | MyStruct {...} [MyStruct.field1] | -| main.rs:120:17:120:17 | s | semmle.label | s | -| main.rs:120:17:120:17 | s | semmle.label | s | -| main.rs:123:10:123:36 | get_struct_field(...) | semmle.label | get_struct_field(...) | -| main.rs:123:10:123:36 | get_struct_field(...) | semmle.label | get_struct_field(...) | -| main.rs:123:27:123:35 | my_struct [MyStruct.field1] | semmle.label | my_struct [MyStruct.field1] | -| main.rs:123:27:123:35 | my_struct [MyStruct.field1] | semmle.label | my_struct [MyStruct.field1] | -| main.rs:140:9:140:9 | s | semmle.label | s | -| main.rs:140:9:140:9 | s | semmle.label | s | -| main.rs:140:13:140:21 | source(...) | semmle.label | source(...) | -| main.rs:140:13:140:21 | source(...) | semmle.label | source(...) | -| main.rs:141:9:141:17 | my_struct [MyStruct.field2] | semmle.label | my_struct [MyStruct.field2] | -| main.rs:141:9:141:17 | my_struct [MyStruct.field2] | semmle.label | my_struct [MyStruct.field2] | -| main.rs:141:21:141:39 | set_struct_field(...) [MyStruct.field2] | semmle.label | set_struct_field(...) [MyStruct.field2] | -| main.rs:141:21:141:39 | set_struct_field(...) [MyStruct.field2] | semmle.label | set_struct_field(...) [MyStruct.field2] | -| main.rs:141:38:141:38 | s | semmle.label | s | -| main.rs:141:38:141:38 | s | semmle.label | s | -| main.rs:143:10:143:18 | my_struct [MyStruct.field2] | semmle.label | my_struct [MyStruct.field2] | -| main.rs:143:10:143:18 | my_struct [MyStruct.field2] | semmle.label | my_struct [MyStruct.field2] | -| main.rs:143:10:143:25 | my_struct.field2 | semmle.label | my_struct.field2 | -| main.rs:143:10:143:25 | my_struct.field2 | semmle.label | my_struct.field2 | -| main.rs:152:9:152:9 | s | semmle.label | s | -| main.rs:152:9:152:9 | s | semmle.label | s | -| main.rs:152:13:152:21 | source(...) | semmle.label | source(...) | -| main.rs:152:13:152:21 | source(...) | semmle.label | source(...) | -| main.rs:153:10:153:31 | get_array_element(...) | semmle.label | get_array_element(...) | -| main.rs:153:10:153:31 | get_array_element(...) | semmle.label | get_array_element(...) | -| main.rs:153:28:153:30 | [...] [element] | semmle.label | [...] [element] | -| main.rs:153:28:153:30 | [...] [element] | semmle.label | [...] [element] | -| main.rs:153:29:153:29 | s | semmle.label | s | -| main.rs:153:29:153:29 | s | semmle.label | s | -| main.rs:162:9:162:9 | s | semmle.label | s | -| main.rs:162:9:162:9 | s | semmle.label | s | -| main.rs:162:13:162:21 | source(...) | semmle.label | source(...) | -| main.rs:162:13:162:21 | source(...) | semmle.label | source(...) | -| main.rs:163:9:163:11 | arr [element] | semmle.label | arr [element] | -| main.rs:163:9:163:11 | arr [element] | semmle.label | arr [element] | -| main.rs:163:15:163:34 | set_array_element(...) [element] | semmle.label | set_array_element(...) [element] | -| main.rs:163:15:163:34 | set_array_element(...) [element] | semmle.label | set_array_element(...) [element] | -| main.rs:163:33:163:33 | s | semmle.label | s | -| main.rs:163:33:163:33 | s | semmle.label | s | -| main.rs:164:10:164:12 | arr [element] | semmle.label | arr [element] | -| main.rs:164:10:164:12 | arr [element] | semmle.label | arr [element] | -| main.rs:164:10:164:15 | arr[0] | semmle.label | arr[0] | -| main.rs:164:10:164:15 | arr[0] | semmle.label | arr[0] | -| main.rs:173:9:173:9 | s | semmle.label | s | -| main.rs:173:9:173:9 | s | semmle.label | s | -| main.rs:173:13:173:22 | source(...) | semmle.label | source(...) | -| main.rs:173:13:173:22 | source(...) | semmle.label | source(...) | -| main.rs:174:9:174:9 | t [tuple.0] | semmle.label | t [tuple.0] | -| main.rs:174:9:174:9 | t [tuple.0] | semmle.label | t [tuple.0] | -| main.rs:174:13:174:18 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] | -| main.rs:174:13:174:18 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] | -| main.rs:174:14:174:14 | s | semmle.label | s | -| main.rs:174:14:174:14 | s | semmle.label | s | -| main.rs:175:10:175:29 | get_tuple_element(...) | semmle.label | get_tuple_element(...) | -| main.rs:175:10:175:29 | get_tuple_element(...) | semmle.label | get_tuple_element(...) | -| main.rs:175:28:175:28 | t [tuple.0] | semmle.label | t [tuple.0] | -| main.rs:175:28:175:28 | t [tuple.0] | semmle.label | t [tuple.0] | -| main.rs:186:9:186:9 | s | semmle.label | s | -| main.rs:186:9:186:9 | s | semmle.label | s | -| main.rs:186:13:186:22 | source(...) | semmle.label | source(...) | -| main.rs:186:13:186:22 | source(...) | semmle.label | source(...) | -| main.rs:187:9:187:9 | t [tuple.1] | semmle.label | t [tuple.1] | -| main.rs:187:9:187:9 | t [tuple.1] | semmle.label | t [tuple.1] | -| main.rs:187:13:187:32 | set_tuple_element(...) [tuple.1] | semmle.label | set_tuple_element(...) [tuple.1] | -| main.rs:187:13:187:32 | set_tuple_element(...) [tuple.1] | semmle.label | set_tuple_element(...) [tuple.1] | -| main.rs:187:31:187:31 | s | semmle.label | s | -| main.rs:187:31:187:31 | s | semmle.label | s | -| main.rs:189:10:189:10 | t [tuple.1] | semmle.label | t [tuple.1] | -| main.rs:189:10:189:10 | t [tuple.1] | semmle.label | t [tuple.1] | -| main.rs:189:10:189:12 | t.1 | semmle.label | t.1 | -| main.rs:189:10:189:12 | t.1 | semmle.label | t.1 | -| main.rs:201:9:201:9 | s | semmle.label | s | -| main.rs:201:9:201:9 | s | semmle.label | s | -| main.rs:201:13:201:22 | source(...) | semmle.label | source(...) | -| main.rs:201:13:201:22 | source(...) | semmle.label | source(...) | -| main.rs:202:14:202:14 | ... | semmle.label | ... | -| main.rs:202:14:202:14 | ... | semmle.label | ... | -| main.rs:203:14:203:14 | n | semmle.label | n | -| main.rs:203:14:203:14 | n | semmle.label | n | -| main.rs:206:11:206:11 | s | semmle.label | s | -| main.rs:206:11:206:11 | s | semmle.label | s | -| main.rs:210:13:210:22 | source(...) | semmle.label | source(...) | -| main.rs:210:13:210:22 | source(...) | semmle.label | source(...) | -| main.rs:211:17:211:42 | if ... {...} else {...} | semmle.label | if ... {...} else {...} | -| main.rs:211:17:211:42 | if ... {...} else {...} | semmle.label | if ... {...} else {...} | -| main.rs:211:40:211:40 | s | semmle.label | s | -| main.rs:211:40:211:40 | s | semmle.label | s | -| main.rs:212:9:212:9 | t | semmle.label | t | -| main.rs:212:9:212:9 | t | semmle.label | t | -| main.rs:212:13:212:24 | apply(...) | semmle.label | apply(...) | -| main.rs:212:13:212:24 | apply(...) | semmle.label | apply(...) | -| main.rs:212:23:212:23 | f [captured s] | semmle.label | f [captured s] | -| main.rs:212:23:212:23 | f [captured s] | semmle.label | f [captured s] | -| main.rs:213:10:213:10 | t | semmle.label | t | -| main.rs:213:10:213:10 | t | semmle.label | t | -| main.rs:217:9:217:9 | s | semmle.label | s | -| main.rs:217:9:217:9 | s | semmle.label | s | -| main.rs:217:13:217:22 | source(...) | semmle.label | source(...) | -| main.rs:217:13:217:22 | source(...) | semmle.label | source(...) | -| main.rs:218:14:218:14 | ... | semmle.label | ... | -| main.rs:218:14:218:14 | ... | semmle.label | ... | -| main.rs:218:17:218:42 | if ... {...} else {...} | semmle.label | if ... {...} else {...} | -| main.rs:218:17:218:42 | if ... {...} else {...} | semmle.label | if ... {...} else {...} | -| main.rs:219:9:219:9 | t | semmle.label | t | -| main.rs:219:9:219:9 | t | semmle.label | t | -| main.rs:219:13:219:23 | apply(...) | semmle.label | apply(...) | -| main.rs:219:13:219:23 | apply(...) | semmle.label | apply(...) | -| main.rs:219:19:219:19 | s | semmle.label | s | -| main.rs:219:19:219:19 | s | semmle.label | s | -| main.rs:220:10:220:10 | t | semmle.label | t | -| main.rs:220:10:220:10 | t | semmle.label | t | -| main.rs:229:9:229:9 | s | semmle.label | s | -| main.rs:229:9:229:9 | s | semmle.label | s | -| main.rs:229:13:229:22 | source(...) | semmle.label | source(...) | -| main.rs:229:13:229:22 | source(...) | semmle.label | source(...) | -| main.rs:230:9:230:9 | t | semmle.label | t | -| main.rs:230:9:230:9 | t | semmle.label | t | -| main.rs:230:13:230:31 | get_async_number(...) [future] | semmle.label | get_async_number(...) [future] | -| main.rs:230:13:230:31 | get_async_number(...) [future] | semmle.label | get_async_number(...) [future] | -| main.rs:230:13:230:37 | await ... | semmle.label | await ... | -| main.rs:230:13:230:37 | await ... | semmle.label | await ... | -| main.rs:230:30:230:30 | s | semmle.label | s | -| main.rs:230:30:230:30 | s | semmle.label | s | -| main.rs:231:10:231:10 | t | semmle.label | t | -| main.rs:231:10:231:10 | t | semmle.label | t | -| main.rs:250:9:250:9 | s [D] | semmle.label | s [D] | -| main.rs:250:9:250:9 | s [D] | semmle.label | s [D] | -| main.rs:250:13:250:23 | enum_source | semmle.label | enum_source | -| main.rs:250:13:250:23 | enum_source | semmle.label | enum_source | -| main.rs:250:13:250:27 | enum_source(...) [D] | semmle.label | enum_source(...) [D] | -| main.rs:250:13:250:27 | enum_source(...) [D] | semmle.label | enum_source(...) [D] | -| main.rs:251:11:251:11 | s [D] | semmle.label | s [D] | -| main.rs:251:11:251:11 | s [D] | semmle.label | s [D] | -| main.rs:253:9:253:37 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | -| main.rs:253:9:253:37 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | -| main.rs:253:35:253:35 | i | semmle.label | i | -| main.rs:253:35:253:35 | i | semmle.label | i | -| main.rs:253:47:253:47 | i | semmle.label | i | -| main.rs:253:47:253:47 | i | semmle.label | i | -| main.rs:259:9:259:9 | s [C] | semmle.label | s [C] | -| main.rs:259:9:259:9 | s [C] | semmle.label | s [C] | -| main.rs:259:13:259:24 | e.source(...) [C] | semmle.label | e.source(...) [C] | -| main.rs:259:13:259:24 | e.source(...) [C] | semmle.label | e.source(...) [C] | -| main.rs:259:15:259:20 | source | semmle.label | source | -| main.rs:259:15:259:20 | source | semmle.label | source | -| main.rs:260:11:260:11 | s [C] | semmle.label | s [C] | -| main.rs:260:11:260:11 | s [C] | semmle.label | s [C] | -| main.rs:261:9:261:37 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | -| main.rs:261:9:261:37 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | -| main.rs:261:35:261:35 | i | semmle.label | i | -| main.rs:261:35:261:35 | i | semmle.label | i | -| main.rs:261:47:261:47 | i | semmle.label | i | -| main.rs:261:47:261:47 | i | semmle.label | i | -| main.rs:275:18:275:18 | ... | semmle.label | ... | -| main.rs:275:18:275:18 | ... | semmle.label | ... | -| main.rs:275:26:275:26 | a | semmle.label | a | -| main.rs:275:26:275:26 | a | semmle.label | a | -| main.rs:276:9:276:19 | pass_source | semmle.label | pass_source | -| main.rs:276:9:276:19 | pass_source | semmle.label | pass_source | -| main.rs:278:9:278:19 | pass_source | semmle.label | pass_source | -| main.rs:278:9:278:19 | pass_source | semmle.label | pass_source | -| main.rs:278:25:278:25 | ... | semmle.label | ... | -| main.rs:278:25:278:25 | ... | semmle.label | ... | -| main.rs:279:18:279:18 | a | semmle.label | a | -| main.rs:279:18:279:18 | a | semmle.label | a | -| main.rs:282:14:282:19 | ...: i64 | semmle.label | ...: i64 | -| main.rs:282:14:282:19 | ...: i64 | semmle.label | ...: i64 | -| main.rs:283:18:283:18 | a | semmle.label | a | -| main.rs:283:18:283:18 | a | semmle.label | a | -| main.rs:285:9:285:19 | pass_source | semmle.label | pass_source | -| main.rs:285:9:285:19 | pass_source | semmle.label | pass_source | -| main.rs:287:9:287:19 | pass_source | semmle.label | pass_source | -| main.rs:287:9:287:19 | pass_source | semmle.label | pass_source | -| main.rs:287:36:287:36 | ... | semmle.label | ... | -| main.rs:287:36:287:36 | ... | semmle.label | ... | -| main.rs:288:18:288:18 | a | semmle.label | a | -| main.rs:288:18:288:18 | a | semmle.label | a | -| main.rs:297:9:297:9 | s | semmle.label | s | -| main.rs:297:9:297:9 | s | semmle.label | s | -| main.rs:297:13:297:22 | source(...) | semmle.label | source(...) | -| main.rs:297:13:297:22 | source(...) | semmle.label | source(...) | -| main.rs:298:5:298:13 | enum_sink | semmle.label | enum_sink | -| main.rs:298:5:298:13 | enum_sink | semmle.label | enum_sink | -| main.rs:298:15:298:43 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | -| main.rs:298:15:298:43 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | -| main.rs:298:41:298:41 | s | semmle.label | s | -| main.rs:298:41:298:41 | s | semmle.label | s | -| main.rs:303:9:303:9 | s | semmle.label | s | -| main.rs:303:9:303:9 | s | semmle.label | s | -| main.rs:303:13:303:22 | source(...) | semmle.label | source(...) | -| main.rs:303:13:303:22 | source(...) | semmle.label | source(...) | -| main.rs:304:9:304:9 | e [D] | semmle.label | e [D] | -| main.rs:304:9:304:9 | e [D] | semmle.label | e [D] | -| main.rs:304:13:304:41 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | -| main.rs:304:13:304:41 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | -| main.rs:304:39:304:39 | s | semmle.label | s | -| main.rs:304:39:304:39 | s | semmle.label | s | -| main.rs:305:5:305:5 | e [D] | semmle.label | e [D] | -| main.rs:305:5:305:5 | e [D] | semmle.label | e [D] | -| main.rs:305:7:305:10 | sink | semmle.label | sink | -| main.rs:305:7:305:10 | sink | semmle.label | sink | -| main.rs:314:9:314:9 | s | semmle.label | s | -| main.rs:314:9:314:9 | s | semmle.label | s | -| main.rs:314:13:314:25 | simple_source | semmle.label | simple_source | -| main.rs:314:13:314:25 | simple_source | semmle.label | simple_source | -| main.rs:314:13:314:29 | simple_source(...) | semmle.label | simple_source(...) | -| main.rs:314:13:314:29 | simple_source(...) | semmle.label | simple_source(...) | -| main.rs:315:10:315:10 | s | semmle.label | s | -| main.rs:315:10:315:10 | s | semmle.label | s | -| main.rs:322:9:322:9 | s | semmle.label | s | -| main.rs:322:9:322:9 | s | semmle.label | s | -| main.rs:322:13:322:22 | source(...) | semmle.label | source(...) | -| main.rs:322:13:322:22 | source(...) | semmle.label | source(...) | -| main.rs:323:5:323:15 | simple_sink | semmle.label | simple_sink | -| main.rs:323:5:323:15 | simple_sink | semmle.label | simple_sink | -| main.rs:323:17:323:17 | s | semmle.label | s | -| main.rs:323:17:323:17 | s | semmle.label | s | -| main.rs:331:5:331:14 | arg_source | semmle.label | arg_source | -| main.rs:331:5:331:14 | arg_source | semmle.label | arg_source | -| main.rs:331:16:331:16 | [post] i | semmle.label | [post] i | -| main.rs:331:16:331:16 | [post] i | semmle.label | [post] i | -| main.rs:332:10:332:10 | i | semmle.label | i | -| main.rs:332:10:332:10 | i | semmle.label | i | -| main.rs:384:9:384:10 | x1 | semmle.label | x1 | -| main.rs:384:9:384:10 | x1 | semmle.label | x1 | -| main.rs:384:14:384:23 | source(...) | semmle.label | source(...) | -| main.rs:384:14:384:23 | source(...) | semmle.label | source(...) | -| main.rs:384:14:384:30 | ... .max(...) | semmle.label | ... .max(...) | -| main.rs:384:14:384:30 | ... .max(...) | semmle.label | ... .max(...) | -| main.rs:385:10:385:11 | x1 | semmle.label | x1 | -| main.rs:385:10:385:11 | x1 | semmle.label | x1 | -| main.rs:387:9:387:10 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | -| main.rs:387:9:387:10 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | -| main.rs:387:14:394:6 | ... .max(...) [MyStruct.field1] | semmle.label | ... .max(...) [MyStruct.field1] | -| main.rs:387:14:394:6 | ... .max(...) [MyStruct.field1] | semmle.label | ... .max(...) [MyStruct.field1] | -| main.rs:387:15:390:5 | MyStruct {...} [MyStruct.field1] | semmle.label | MyStruct {...} [MyStruct.field1] | -| main.rs:387:15:390:5 | MyStruct {...} [MyStruct.field1] | semmle.label | MyStruct {...} [MyStruct.field1] | -| main.rs:388:17:388:26 | source(...) | semmle.label | source(...) | -| main.rs:388:17:388:26 | source(...) | semmle.label | source(...) | -| main.rs:395:10:395:11 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | -| main.rs:395:10:395:11 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | -| main.rs:395:10:395:18 | x2.field1 | semmle.label | x2.field1 | -| main.rs:395:10:395:18 | x2.field1 | semmle.label | x2.field1 | -| main.rs:400:9:400:10 | x4 | semmle.label | x4 | -| main.rs:400:9:400:10 | x4 | semmle.label | x4 | -| main.rs:400:14:400:23 | source(...) | semmle.label | source(...) | -| main.rs:400:14:400:23 | source(...) | semmle.label | source(...) | -| main.rs:400:14:400:30 | ... .max(...) | semmle.label | ... .max(...) | -| main.rs:400:14:400:30 | ... .max(...) | semmle.label | ... .max(...) | -| main.rs:401:10:401:11 | x4 | semmle.label | x4 | -| main.rs:401:10:401:11 | x4 | semmle.label | x4 | -| main.rs:403:9:403:10 | x5 | semmle.label | x5 | -| main.rs:403:14:403:23 | source(...) | semmle.label | source(...) | -| main.rs:403:14:403:30 | ... .lt(...) | semmle.label | ... .lt(...) | -| main.rs:404:10:404:11 | x5 | semmle.label | x5 | -| main.rs:406:9:406:10 | x6 | semmle.label | x6 | -| main.rs:406:14:406:23 | source(...) | semmle.label | source(...) | -| main.rs:406:14:406:27 | ... < ... | semmle.label | ... < ... | -| main.rs:407:10:407:11 | x6 | semmle.label | x6 | -| main.rs:422:10:422:25 | generated_source | semmle.label | generated_source | -| main.rs:422:10:422:25 | generated_source | semmle.label | generated_source | -| main.rs:422:10:422:28 | generated_source(...) | semmle.label | generated_source(...) | -| main.rs:422:10:422:28 | generated_source(...) | semmle.label | generated_source(...) | -| main.rs:424:10:424:30 | neutral_manual_source | semmle.label | neutral_manual_source | -| main.rs:424:10:424:30 | neutral_manual_source | semmle.label | neutral_manual_source | -| main.rs:424:10:424:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | -| main.rs:424:10:424:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | -| main.rs:425:5:425:18 | generated_sink | semmle.label | generated_sink | -| main.rs:425:5:425:18 | generated_sink | semmle.label | generated_sink | -| main.rs:425:20:425:28 | source(...) | semmle.label | source(...) | -| main.rs:425:20:425:28 | source(...) | semmle.label | source(...) | -| main.rs:427:5:427:23 | neutral_manual_sink | semmle.label | neutral_manual_sink | -| main.rs:427:5:427:23 | neutral_manual_sink | semmle.label | neutral_manual_sink | -| main.rs:427:25:427:33 | source(...) | semmle.label | source(...) | -| main.rs:427:25:427:33 | source(...) | semmle.label | source(...) | -| main.rs:428:10:428:37 | generated_summary(...) | semmle.label | generated_summary(...) | -| main.rs:428:10:428:37 | generated_summary(...) | semmle.label | generated_summary(...) | -| main.rs:428:28:428:36 | source(...) | semmle.label | source(...) | -| main.rs:428:28:428:36 | source(...) | semmle.label | source(...) | -| main.rs:430:10:430:42 | neutral_manual_summary(...) | semmle.label | neutral_manual_summary(...) | -| main.rs:430:10:430:42 | neutral_manual_summary(...) | semmle.label | neutral_manual_summary(...) | -| main.rs:430:33:430:41 | source(...) | semmle.label | source(...) | -| main.rs:430:33:430:41 | source(...) | semmle.label | source(...) | +| main.rs:87:9:87:9 | s | semmle.label | s | +| main.rs:87:9:87:9 | s | semmle.label | s | +| main.rs:87:13:87:21 | source(...) | semmle.label | source(...) | +| main.rs:87:13:87:21 | source(...) | semmle.label | source(...) | +| main.rs:88:9:88:10 | e1 [C] | semmle.label | e1 [C] | +| main.rs:88:9:88:10 | e1 [C] | semmle.label | e1 [C] | +| main.rs:88:14:88:42 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | +| main.rs:88:14:88:42 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | +| main.rs:88:40:88:40 | s | semmle.label | s | +| main.rs:88:40:88:40 | s | semmle.label | s | +| main.rs:89:10:89:26 | get_var_field(...) | semmle.label | get_var_field(...) | +| main.rs:89:10:89:26 | get_var_field(...) | semmle.label | get_var_field(...) | +| main.rs:89:24:89:25 | e1 [C] | semmle.label | e1 [C] | +| main.rs:89:24:89:25 | e1 [C] | semmle.label | e1 [C] | +| main.rs:100:9:100:9 | s | semmle.label | s | +| main.rs:100:9:100:9 | s | semmle.label | s | +| main.rs:100:13:100:21 | source(...) | semmle.label | source(...) | +| main.rs:100:13:100:21 | source(...) | semmle.label | source(...) | +| main.rs:101:9:101:10 | e1 [D] | semmle.label | e1 [D] | +| main.rs:101:9:101:10 | e1 [D] | semmle.label | e1 [D] | +| main.rs:101:14:101:29 | set_var_field(...) [D] | semmle.label | set_var_field(...) [D] | +| main.rs:101:14:101:29 | set_var_field(...) [D] | semmle.label | set_var_field(...) [D] | +| main.rs:101:28:101:28 | s | semmle.label | s | +| main.rs:101:28:101:28 | s | semmle.label | s | +| main.rs:102:11:102:12 | e1 [D] | semmle.label | e1 [D] | +| main.rs:102:11:102:12 | e1 [D] | semmle.label | e1 [D] | +| main.rs:104:9:104:37 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | +| main.rs:104:9:104:37 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | +| main.rs:104:35:104:35 | i | semmle.label | i | +| main.rs:104:35:104:35 | i | semmle.label | i | +| main.rs:104:47:104:47 | i | semmle.label | i | +| main.rs:104:47:104:47 | i | semmle.label | i | +| main.rs:120:9:120:9 | s | semmle.label | s | +| main.rs:120:9:120:9 | s | semmle.label | s | +| main.rs:120:13:120:21 | source(...) | semmle.label | source(...) | +| main.rs:120:13:120:21 | source(...) | semmle.label | source(...) | +| main.rs:121:9:121:17 | my_struct [MyStruct.field1] | semmle.label | my_struct [MyStruct.field1] | +| main.rs:121:9:121:17 | my_struct [MyStruct.field1] | semmle.label | my_struct [MyStruct.field1] | +| main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | semmle.label | MyStruct {...} [MyStruct.field1] | +| main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | semmle.label | MyStruct {...} [MyStruct.field1] | +| main.rs:122:17:122:17 | s | semmle.label | s | +| main.rs:122:17:122:17 | s | semmle.label | s | +| main.rs:125:10:125:36 | get_struct_field(...) | semmle.label | get_struct_field(...) | +| main.rs:125:10:125:36 | get_struct_field(...) | semmle.label | get_struct_field(...) | +| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | semmle.label | my_struct [MyStruct.field1] | +| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | semmle.label | my_struct [MyStruct.field1] | +| main.rs:142:9:142:9 | s | semmle.label | s | +| main.rs:142:9:142:9 | s | semmle.label | s | +| main.rs:142:13:142:21 | source(...) | semmle.label | source(...) | +| main.rs:142:13:142:21 | source(...) | semmle.label | source(...) | +| main.rs:143:9:143:17 | my_struct [MyStruct.field2] | semmle.label | my_struct [MyStruct.field2] | +| main.rs:143:9:143:17 | my_struct [MyStruct.field2] | semmle.label | my_struct [MyStruct.field2] | +| main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | semmle.label | set_struct_field(...) [MyStruct.field2] | +| main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | semmle.label | set_struct_field(...) [MyStruct.field2] | +| main.rs:143:38:143:38 | s | semmle.label | s | +| main.rs:143:38:143:38 | s | semmle.label | s | +| main.rs:145:10:145:18 | my_struct [MyStruct.field2] | semmle.label | my_struct [MyStruct.field2] | +| main.rs:145:10:145:18 | my_struct [MyStruct.field2] | semmle.label | my_struct [MyStruct.field2] | +| main.rs:145:10:145:25 | my_struct.field2 | semmle.label | my_struct.field2 | +| main.rs:145:10:145:25 | my_struct.field2 | semmle.label | my_struct.field2 | +| main.rs:154:9:154:9 | s | semmle.label | s | +| main.rs:154:9:154:9 | s | semmle.label | s | +| main.rs:154:13:154:21 | source(...) | semmle.label | source(...) | +| main.rs:154:13:154:21 | source(...) | semmle.label | source(...) | +| main.rs:155:10:155:31 | get_array_element(...) | semmle.label | get_array_element(...) | +| main.rs:155:10:155:31 | get_array_element(...) | semmle.label | get_array_element(...) | +| main.rs:155:28:155:30 | [...] [element] | semmle.label | [...] [element] | +| main.rs:155:28:155:30 | [...] [element] | semmle.label | [...] [element] | +| main.rs:155:29:155:29 | s | semmle.label | s | +| main.rs:155:29:155:29 | s | semmle.label | s | +| main.rs:164:9:164:9 | s | semmle.label | s | +| main.rs:164:9:164:9 | s | semmle.label | s | +| main.rs:164:13:164:21 | source(...) | semmle.label | source(...) | +| main.rs:164:13:164:21 | source(...) | semmle.label | source(...) | +| main.rs:165:9:165:11 | arr [element] | semmle.label | arr [element] | +| main.rs:165:9:165:11 | arr [element] | semmle.label | arr [element] | +| main.rs:165:15:165:34 | set_array_element(...) [element] | semmle.label | set_array_element(...) [element] | +| main.rs:165:15:165:34 | set_array_element(...) [element] | semmle.label | set_array_element(...) [element] | +| main.rs:165:33:165:33 | s | semmle.label | s | +| main.rs:165:33:165:33 | s | semmle.label | s | +| main.rs:166:10:166:12 | arr [element] | semmle.label | arr [element] | +| main.rs:166:10:166:12 | arr [element] | semmle.label | arr [element] | +| main.rs:166:10:166:15 | arr[0] | semmle.label | arr[0] | +| main.rs:166:10:166:15 | arr[0] | semmle.label | arr[0] | +| main.rs:175:9:175:9 | s | semmle.label | s | +| main.rs:175:9:175:9 | s | semmle.label | s | +| main.rs:175:13:175:22 | source(...) | semmle.label | source(...) | +| main.rs:175:13:175:22 | source(...) | semmle.label | source(...) | +| main.rs:176:9:176:9 | t [tuple.0] | semmle.label | t [tuple.0] | +| main.rs:176:9:176:9 | t [tuple.0] | semmle.label | t [tuple.0] | +| main.rs:176:13:176:18 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] | +| main.rs:176:13:176:18 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] | +| main.rs:176:14:176:14 | s | semmle.label | s | +| main.rs:176:14:176:14 | s | semmle.label | s | +| main.rs:177:10:177:29 | get_tuple_element(...) | semmle.label | get_tuple_element(...) | +| main.rs:177:10:177:29 | get_tuple_element(...) | semmle.label | get_tuple_element(...) | +| main.rs:177:28:177:28 | t [tuple.0] | semmle.label | t [tuple.0] | +| main.rs:177:28:177:28 | t [tuple.0] | semmle.label | t [tuple.0] | +| main.rs:188:9:188:9 | s | semmle.label | s | +| main.rs:188:9:188:9 | s | semmle.label | s | +| main.rs:188:13:188:22 | source(...) | semmle.label | source(...) | +| main.rs:188:13:188:22 | source(...) | semmle.label | source(...) | +| main.rs:189:9:189:9 | t [tuple.1] | semmle.label | t [tuple.1] | +| main.rs:189:9:189:9 | t [tuple.1] | semmle.label | t [tuple.1] | +| main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | semmle.label | set_tuple_element(...) [tuple.1] | +| main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | semmle.label | set_tuple_element(...) [tuple.1] | +| main.rs:189:31:189:31 | s | semmle.label | s | +| main.rs:189:31:189:31 | s | semmle.label | s | +| main.rs:191:10:191:10 | t [tuple.1] | semmle.label | t [tuple.1] | +| main.rs:191:10:191:10 | t [tuple.1] | semmle.label | t [tuple.1] | +| main.rs:191:10:191:12 | t.1 | semmle.label | t.1 | +| main.rs:191:10:191:12 | t.1 | semmle.label | t.1 | +| main.rs:203:9:203:9 | s | semmle.label | s | +| main.rs:203:9:203:9 | s | semmle.label | s | +| main.rs:203:13:203:22 | source(...) | semmle.label | source(...) | +| main.rs:203:13:203:22 | source(...) | semmle.label | source(...) | +| main.rs:204:14:204:14 | ... | semmle.label | ... | +| main.rs:204:14:204:14 | ... | semmle.label | ... | +| main.rs:205:14:205:14 | n | semmle.label | n | +| main.rs:205:14:205:14 | n | semmle.label | n | +| main.rs:208:11:208:11 | s | semmle.label | s | +| main.rs:208:11:208:11 | s | semmle.label | s | +| main.rs:212:13:212:22 | source(...) | semmle.label | source(...) | +| main.rs:212:13:212:22 | source(...) | semmle.label | source(...) | +| main.rs:213:17:213:42 | if ... {...} else {...} | semmle.label | if ... {...} else {...} | +| main.rs:213:17:213:42 | if ... {...} else {...} | semmle.label | if ... {...} else {...} | +| main.rs:213:40:213:40 | s | semmle.label | s | +| main.rs:213:40:213:40 | s | semmle.label | s | +| main.rs:214:9:214:9 | t | semmle.label | t | +| main.rs:214:9:214:9 | t | semmle.label | t | +| main.rs:214:13:214:24 | apply(...) | semmle.label | apply(...) | +| main.rs:214:13:214:24 | apply(...) | semmle.label | apply(...) | +| main.rs:214:23:214:23 | f [captured s] | semmle.label | f [captured s] | +| main.rs:214:23:214:23 | f [captured s] | semmle.label | f [captured s] | +| main.rs:215:10:215:10 | t | semmle.label | t | +| main.rs:215:10:215:10 | t | semmle.label | t | +| main.rs:219:9:219:9 | s | semmle.label | s | +| main.rs:219:9:219:9 | s | semmle.label | s | +| main.rs:219:13:219:22 | source(...) | semmle.label | source(...) | +| main.rs:219:13:219:22 | source(...) | semmle.label | source(...) | +| main.rs:220:14:220:14 | ... | semmle.label | ... | +| main.rs:220:14:220:14 | ... | semmle.label | ... | +| main.rs:220:17:220:42 | if ... {...} else {...} | semmle.label | if ... {...} else {...} | +| main.rs:220:17:220:42 | if ... {...} else {...} | semmle.label | if ... {...} else {...} | +| main.rs:221:9:221:9 | t | semmle.label | t | +| main.rs:221:9:221:9 | t | semmle.label | t | +| main.rs:221:13:221:23 | apply(...) | semmle.label | apply(...) | +| main.rs:221:13:221:23 | apply(...) | semmle.label | apply(...) | +| main.rs:221:19:221:19 | s | semmle.label | s | +| main.rs:221:19:221:19 | s | semmle.label | s | +| main.rs:222:10:222:10 | t | semmle.label | t | +| main.rs:222:10:222:10 | t | semmle.label | t | +| main.rs:231:9:231:9 | s | semmle.label | s | +| main.rs:231:9:231:9 | s | semmle.label | s | +| main.rs:231:13:231:22 | source(...) | semmle.label | source(...) | +| main.rs:231:13:231:22 | source(...) | semmle.label | source(...) | +| main.rs:232:9:232:9 | t | semmle.label | t | +| main.rs:232:9:232:9 | t | semmle.label | t | +| main.rs:232:13:232:31 | get_async_number(...) [future] | semmle.label | get_async_number(...) [future] | +| main.rs:232:13:232:31 | get_async_number(...) [future] | semmle.label | get_async_number(...) [future] | +| main.rs:232:13:232:37 | await ... | semmle.label | await ... | +| main.rs:232:13:232:37 | await ... | semmle.label | await ... | +| main.rs:232:30:232:30 | s | semmle.label | s | +| main.rs:232:30:232:30 | s | semmle.label | s | +| main.rs:233:10:233:10 | t | semmle.label | t | +| main.rs:233:10:233:10 | t | semmle.label | t | +| main.rs:257:9:257:9 | s [D] | semmle.label | s [D] | +| main.rs:257:9:257:9 | s [D] | semmle.label | s [D] | +| main.rs:257:13:257:23 | enum_source | semmle.label | enum_source | +| main.rs:257:13:257:23 | enum_source | semmle.label | enum_source | +| main.rs:257:13:257:27 | enum_source(...) [D] | semmle.label | enum_source(...) [D] | +| main.rs:257:13:257:27 | enum_source(...) [D] | semmle.label | enum_source(...) [D] | +| main.rs:258:11:258:11 | s [D] | semmle.label | s [D] | +| main.rs:258:11:258:11 | s [D] | semmle.label | s [D] | +| main.rs:260:9:260:37 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | +| main.rs:260:9:260:37 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | +| main.rs:260:35:260:35 | i | semmle.label | i | +| main.rs:260:35:260:35 | i | semmle.label | i | +| main.rs:260:47:260:47 | i | semmle.label | i | +| main.rs:260:47:260:47 | i | semmle.label | i | +| main.rs:264:9:264:9 | s [E, Some] | semmle.label | s [E, Some] | +| main.rs:264:9:264:9 | s [E, Some] | semmle.label | s [E, Some] | +| main.rs:264:13:264:30 | enum_source_nested | semmle.label | enum_source_nested | +| main.rs:264:13:264:30 | enum_source_nested | semmle.label | enum_source_nested | +| main.rs:264:13:264:34 | enum_source_nested(...) [E, Some] | semmle.label | enum_source_nested(...) [E, Some] | +| main.rs:264:13:264:34 | enum_source_nested(...) [E, Some] | semmle.label | enum_source_nested(...) [E, Some] | +| main.rs:265:11:265:11 | s [E, Some] | semmle.label | s [E, Some] | +| main.rs:265:11:265:11 | s [E, Some] | semmle.label | s [E, Some] | +| main.rs:268:9:268:37 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | +| main.rs:268:9:268:37 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | +| main.rs:268:35:268:35 | o [Some] | semmle.label | o [Some] | +| main.rs:268:35:268:35 | o [Some] | semmle.label | o [Some] | +| main.rs:270:19:270:19 | o [Some] | semmle.label | o [Some] | +| main.rs:270:19:270:19 | o [Some] | semmle.label | o [Some] | +| main.rs:271:17:271:23 | Some(...) [Some] | semmle.label | Some(...) [Some] | +| main.rs:271:17:271:23 | Some(...) [Some] | semmle.label | Some(...) [Some] | +| main.rs:271:22:271:22 | i | semmle.label | i | +| main.rs:271:22:271:22 | i | semmle.label | i | +| main.rs:271:33:271:33 | i | semmle.label | i | +| main.rs:271:33:271:33 | i | semmle.label | i | +| main.rs:280:9:280:9 | s [C] | semmle.label | s [C] | +| main.rs:280:9:280:9 | s [C] | semmle.label | s [C] | +| main.rs:280:13:280:24 | e.source(...) [C] | semmle.label | e.source(...) [C] | +| main.rs:280:13:280:24 | e.source(...) [C] | semmle.label | e.source(...) [C] | +| main.rs:280:15:280:20 | source | semmle.label | source | +| main.rs:280:15:280:20 | source | semmle.label | source | +| main.rs:281:11:281:11 | s [C] | semmle.label | s [C] | +| main.rs:281:11:281:11 | s [C] | semmle.label | s [C] | +| main.rs:282:9:282:37 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | +| main.rs:282:9:282:37 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | +| main.rs:282:35:282:35 | i | semmle.label | i | +| main.rs:282:35:282:35 | i | semmle.label | i | +| main.rs:282:47:282:47 | i | semmle.label | i | +| main.rs:282:47:282:47 | i | semmle.label | i | +| main.rs:303:18:303:18 | ... | semmle.label | ... | +| main.rs:303:18:303:18 | ... | semmle.label | ... | +| main.rs:303:26:303:26 | a | semmle.label | a | +| main.rs:303:26:303:26 | a | semmle.label | a | +| main.rs:304:9:304:19 | pass_source | semmle.label | pass_source | +| main.rs:304:9:304:19 | pass_source | semmle.label | pass_source | +| main.rs:306:9:306:19 | pass_source | semmle.label | pass_source | +| main.rs:306:9:306:19 | pass_source | semmle.label | pass_source | +| main.rs:306:25:306:25 | ... | semmle.label | ... | +| main.rs:306:25:306:25 | ... | semmle.label | ... | +| main.rs:307:18:307:18 | a | semmle.label | a | +| main.rs:307:18:307:18 | a | semmle.label | a | +| main.rs:310:14:310:19 | ...: i64 | semmle.label | ...: i64 | +| main.rs:310:14:310:19 | ...: i64 | semmle.label | ...: i64 | +| main.rs:311:18:311:18 | a | semmle.label | a | +| main.rs:311:18:311:18 | a | semmle.label | a | +| main.rs:313:9:313:19 | pass_source | semmle.label | pass_source | +| main.rs:313:9:313:19 | pass_source | semmle.label | pass_source | +| main.rs:315:9:315:19 | pass_source | semmle.label | pass_source | +| main.rs:315:9:315:19 | pass_source | semmle.label | pass_source | +| main.rs:315:36:315:36 | ... | semmle.label | ... | +| main.rs:315:36:315:36 | ... | semmle.label | ... | +| main.rs:316:18:316:18 | a | semmle.label | a | +| main.rs:316:18:316:18 | a | semmle.label | a | +| main.rs:319:9:319:26 | pass_source_nested | semmle.label | pass_source_nested | +| main.rs:319:9:319:26 | pass_source_nested | semmle.label | pass_source_nested | +| main.rs:319:32:319:32 | ... [E, Some] | semmle.label | ... [E, Some] | +| main.rs:319:32:319:32 | ... [E, Some] | semmle.label | ... [E, Some] | +| main.rs:320:19:320:19 | e [E, Some] | semmle.label | e [E, Some] | +| main.rs:320:19:320:19 | e [E, Some] | semmle.label | e [E, Some] | +| main.rs:323:17:323:45 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | +| main.rs:323:17:323:45 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | +| main.rs:323:43:323:43 | o [Some] | semmle.label | o [Some] | +| main.rs:323:43:323:43 | o [Some] | semmle.label | o [Some] | +| main.rs:325:27:325:27 | o [Some] | semmle.label | o [Some] | +| main.rs:325:27:325:27 | o [Some] | semmle.label | o [Some] | +| main.rs:326:25:326:31 | Some(...) [Some] | semmle.label | Some(...) [Some] | +| main.rs:326:25:326:31 | Some(...) [Some] | semmle.label | Some(...) [Some] | +| main.rs:326:30:326:30 | i | semmle.label | i | +| main.rs:326:30:326:30 | i | semmle.label | i | +| main.rs:326:41:326:41 | i | semmle.label | i | +| main.rs:326:41:326:41 | i | semmle.label | i | +| main.rs:364:9:364:9 | s | semmle.label | s | +| main.rs:364:9:364:9 | s | semmle.label | s | +| main.rs:364:13:364:22 | source(...) | semmle.label | source(...) | +| main.rs:364:13:364:22 | source(...) | semmle.label | source(...) | +| main.rs:365:5:365:13 | enum_sink | semmle.label | enum_sink | +| main.rs:365:5:365:13 | enum_sink | semmle.label | enum_sink | +| main.rs:365:15:365:43 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | +| main.rs:365:15:365:43 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | +| main.rs:365:41:365:41 | s | semmle.label | s | +| main.rs:365:41:365:41 | s | semmle.label | s | +| main.rs:368:5:368:20 | enum_sink_nested | semmle.label | enum_sink_nested | +| main.rs:368:5:368:20 | enum_sink_nested | semmle.label | enum_sink_nested | +| main.rs:368:22:368:56 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | +| main.rs:368:22:368:56 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | +| main.rs:368:48:368:54 | Some(...) [Some] | semmle.label | Some(...) [Some] | +| main.rs:368:48:368:54 | Some(...) [Some] | semmle.label | Some(...) [Some] | +| main.rs:368:53:368:53 | s | semmle.label | s | +| main.rs:368:53:368:53 | s | semmle.label | s | +| main.rs:372:9:372:9 | s | semmle.label | s | +| main.rs:372:9:372:9 | s | semmle.label | s | +| main.rs:372:13:372:22 | source(...) | semmle.label | source(...) | +| main.rs:372:13:372:22 | source(...) | semmle.label | source(...) | +| main.rs:373:9:373:9 | e [D] | semmle.label | e [D] | +| main.rs:373:9:373:9 | e [D] | semmle.label | e [D] | +| main.rs:373:13:373:41 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | +| main.rs:373:13:373:41 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | +| main.rs:373:39:373:39 | s | semmle.label | s | +| main.rs:373:39:373:39 | s | semmle.label | s | +| main.rs:374:5:374:5 | e [D] | semmle.label | e [D] | +| main.rs:374:5:374:5 | e [D] | semmle.label | e [D] | +| main.rs:374:7:374:10 | sink | semmle.label | sink | +| main.rs:374:7:374:10 | sink | semmle.label | sink | +| main.rs:383:9:383:9 | s | semmle.label | s | +| main.rs:383:9:383:9 | s | semmle.label | s | +| main.rs:383:13:383:25 | simple_source | semmle.label | simple_source | +| main.rs:383:13:383:25 | simple_source | semmle.label | simple_source | +| main.rs:383:13:383:29 | simple_source(...) | semmle.label | simple_source(...) | +| main.rs:383:13:383:29 | simple_source(...) | semmle.label | simple_source(...) | +| main.rs:384:10:384:10 | s | semmle.label | s | +| main.rs:384:10:384:10 | s | semmle.label | s | +| main.rs:391:9:391:9 | s | semmle.label | s | +| main.rs:391:9:391:9 | s | semmle.label | s | +| main.rs:391:13:391:22 | source(...) | semmle.label | source(...) | +| main.rs:391:13:391:22 | source(...) | semmle.label | source(...) | +| main.rs:392:5:392:15 | simple_sink | semmle.label | simple_sink | +| main.rs:392:5:392:15 | simple_sink | semmle.label | simple_sink | +| main.rs:392:17:392:17 | s | semmle.label | s | +| main.rs:392:17:392:17 | s | semmle.label | s | +| main.rs:400:5:400:14 | arg_source | semmle.label | arg_source | +| main.rs:400:5:400:14 | arg_source | semmle.label | arg_source | +| main.rs:400:16:400:16 | [post] i | semmle.label | [post] i | +| main.rs:400:16:400:16 | [post] i | semmle.label | [post] i | +| main.rs:401:10:401:10 | i | semmle.label | i | +| main.rs:401:10:401:10 | i | semmle.label | i | +| main.rs:464:9:464:10 | x1 | semmle.label | x1 | +| main.rs:464:9:464:10 | x1 | semmle.label | x1 | +| main.rs:464:14:464:23 | source(...) | semmle.label | source(...) | +| main.rs:464:14:464:23 | source(...) | semmle.label | source(...) | +| main.rs:464:14:464:30 | ... .max(...) | semmle.label | ... .max(...) | +| main.rs:464:14:464:30 | ... .max(...) | semmle.label | ... .max(...) | +| main.rs:465:10:465:11 | x1 | semmle.label | x1 | +| main.rs:465:10:465:11 | x1 | semmle.label | x1 | +| main.rs:467:9:467:10 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | +| main.rs:467:9:467:10 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | +| main.rs:467:14:474:6 | ... .max(...) [MyStruct.field1] | semmle.label | ... .max(...) [MyStruct.field1] | +| main.rs:467:14:474:6 | ... .max(...) [MyStruct.field1] | semmle.label | ... .max(...) [MyStruct.field1] | +| main.rs:467:15:470:5 | MyStruct {...} [MyStruct.field1] | semmle.label | MyStruct {...} [MyStruct.field1] | +| main.rs:467:15:470:5 | MyStruct {...} [MyStruct.field1] | semmle.label | MyStruct {...} [MyStruct.field1] | +| main.rs:468:17:468:26 | source(...) | semmle.label | source(...) | +| main.rs:468:17:468:26 | source(...) | semmle.label | source(...) | +| main.rs:475:10:475:11 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | +| main.rs:475:10:475:11 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | +| main.rs:475:10:475:18 | x2.field1 | semmle.label | x2.field1 | +| main.rs:475:10:475:18 | x2.field1 | semmle.label | x2.field1 | +| main.rs:480:9:480:10 | x4 | semmle.label | x4 | +| main.rs:480:9:480:10 | x4 | semmle.label | x4 | +| main.rs:480:14:480:23 | source(...) | semmle.label | source(...) | +| main.rs:480:14:480:23 | source(...) | semmle.label | source(...) | +| main.rs:480:14:480:30 | ... .max(...) | semmle.label | ... .max(...) | +| main.rs:480:14:480:30 | ... .max(...) | semmle.label | ... .max(...) | +| main.rs:481:10:481:11 | x4 | semmle.label | x4 | +| main.rs:481:10:481:11 | x4 | semmle.label | x4 | +| main.rs:483:9:483:10 | x5 | semmle.label | x5 | +| main.rs:483:14:483:23 | source(...) | semmle.label | source(...) | +| main.rs:483:14:483:30 | ... .lt(...) | semmle.label | ... .lt(...) | +| main.rs:484:10:484:11 | x5 | semmle.label | x5 | +| main.rs:486:9:486:10 | x6 | semmle.label | x6 | +| main.rs:486:14:486:23 | source(...) | semmle.label | source(...) | +| main.rs:486:14:486:27 | ... < ... | semmle.label | ... < ... | +| main.rs:487:10:487:11 | x6 | semmle.label | x6 | +| main.rs:502:10:502:25 | generated_source | semmle.label | generated_source | +| main.rs:502:10:502:25 | generated_source | semmle.label | generated_source | +| main.rs:502:10:502:28 | generated_source(...) | semmle.label | generated_source(...) | +| main.rs:502:10:502:28 | generated_source(...) | semmle.label | generated_source(...) | +| main.rs:504:10:504:30 | neutral_manual_source | semmle.label | neutral_manual_source | +| main.rs:504:10:504:30 | neutral_manual_source | semmle.label | neutral_manual_source | +| main.rs:504:10:504:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | +| main.rs:504:10:504:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | +| main.rs:505:5:505:18 | generated_sink | semmle.label | generated_sink | +| main.rs:505:5:505:18 | generated_sink | semmle.label | generated_sink | +| main.rs:505:20:505:28 | source(...) | semmle.label | source(...) | +| main.rs:505:20:505:28 | source(...) | semmle.label | source(...) | +| main.rs:507:5:507:23 | neutral_manual_sink | semmle.label | neutral_manual_sink | +| main.rs:507:5:507:23 | neutral_manual_sink | semmle.label | neutral_manual_sink | +| main.rs:507:25:507:33 | source(...) | semmle.label | source(...) | +| main.rs:507:25:507:33 | source(...) | semmle.label | source(...) | +| main.rs:508:10:508:37 | generated_summary(...) | semmle.label | generated_summary(...) | +| main.rs:508:10:508:37 | generated_summary(...) | semmle.label | generated_summary(...) | +| main.rs:508:28:508:36 | source(...) | semmle.label | source(...) | +| main.rs:508:28:508:36 | source(...) | semmle.label | source(...) | +| main.rs:510:10:510:42 | neutral_manual_summary(...) | semmle.label | neutral_manual_summary(...) | +| main.rs:510:10:510:42 | neutral_manual_summary(...) | semmle.label | neutral_manual_summary(...) | +| main.rs:510:33:510:41 | source(...) | semmle.label | source(...) | +| main.rs:510:33:510:41 | source(...) | semmle.label | source(...) | subpaths -| main.rs:212:23:212:23 | f [captured s] | main.rs:211:40:211:40 | s | main.rs:211:17:211:42 | if ... {...} else {...} | main.rs:212:13:212:24 | apply(...) | -| main.rs:212:23:212:23 | f [captured s] | main.rs:211:40:211:40 | s | main.rs:211:17:211:42 | if ... {...} else {...} | main.rs:212:13:212:24 | apply(...) | -| main.rs:219:19:219:19 | s | main.rs:218:14:218:14 | ... | main.rs:218:17:218:42 | if ... {...} else {...} | main.rs:219:13:219:23 | apply(...) | -| main.rs:219:19:219:19 | s | main.rs:218:14:218:14 | ... | main.rs:218:17:218:42 | if ... {...} else {...} | main.rs:219:13:219:23 | apply(...) | +| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | main.rs:213:17:213:42 | if ... {...} else {...} | main.rs:214:13:214:24 | apply(...) | +| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | main.rs:213:17:213:42 | if ... {...} else {...} | main.rs:214:13:214:24 | apply(...) | +| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | main.rs:220:17:220:42 | if ... {...} else {...} | main.rs:221:13:221:23 | apply(...) | +| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | main.rs:220:17:220:42 | if ... {...} else {...} | main.rs:221:13:221:23 | apply(...) | testFailures invalidSpecComponent #select @@ -731,69 +822,75 @@ invalidSpecComponent | main.rs:56:10:56:24 | get_var_pos(...) | main.rs:54:13:54:21 | source(...) | main.rs:56:10:56:24 | get_var_pos(...) | $@ | main.rs:54:13:54:21 | source(...) | source(...) | | main.rs:71:33:71:33 | i | main.rs:67:13:67:21 | source(...) | main.rs:71:33:71:33 | i | $@ | main.rs:67:13:67:21 | source(...) | source(...) | | main.rs:71:33:71:33 | i | main.rs:67:13:67:21 | source(...) | main.rs:71:33:71:33 | i | $@ | main.rs:67:13:67:21 | source(...) | source(...) | -| main.rs:88:10:88:26 | get_var_field(...) | main.rs:86:13:86:21 | source(...) | main.rs:88:10:88:26 | get_var_field(...) | $@ | main.rs:86:13:86:21 | source(...) | source(...) | -| main.rs:88:10:88:26 | get_var_field(...) | main.rs:86:13:86:21 | source(...) | main.rs:88:10:88:26 | get_var_field(...) | $@ | main.rs:86:13:86:21 | source(...) | source(...) | -| main.rs:103:47:103:47 | i | main.rs:99:13:99:21 | source(...) | main.rs:103:47:103:47 | i | $@ | main.rs:99:13:99:21 | source(...) | source(...) | -| main.rs:103:47:103:47 | i | main.rs:99:13:99:21 | source(...) | main.rs:103:47:103:47 | i | $@ | main.rs:99:13:99:21 | source(...) | source(...) | -| main.rs:123:10:123:36 | get_struct_field(...) | main.rs:118:13:118:21 | source(...) | main.rs:123:10:123:36 | get_struct_field(...) | $@ | main.rs:118:13:118:21 | source(...) | source(...) | -| main.rs:123:10:123:36 | get_struct_field(...) | main.rs:118:13:118:21 | source(...) | main.rs:123:10:123:36 | get_struct_field(...) | $@ | main.rs:118:13:118:21 | source(...) | source(...) | -| main.rs:143:10:143:25 | my_struct.field2 | main.rs:140:13:140:21 | source(...) | main.rs:143:10:143:25 | my_struct.field2 | $@ | main.rs:140:13:140:21 | source(...) | source(...) | -| main.rs:143:10:143:25 | my_struct.field2 | main.rs:140:13:140:21 | source(...) | main.rs:143:10:143:25 | my_struct.field2 | $@ | main.rs:140:13:140:21 | source(...) | source(...) | -| main.rs:153:10:153:31 | get_array_element(...) | main.rs:152:13:152:21 | source(...) | main.rs:153:10:153:31 | get_array_element(...) | $@ | main.rs:152:13:152:21 | source(...) | source(...) | -| main.rs:153:10:153:31 | get_array_element(...) | main.rs:152:13:152:21 | source(...) | main.rs:153:10:153:31 | get_array_element(...) | $@ | main.rs:152:13:152:21 | source(...) | source(...) | -| main.rs:164:10:164:15 | arr[0] | main.rs:162:13:162:21 | source(...) | main.rs:164:10:164:15 | arr[0] | $@ | main.rs:162:13:162:21 | source(...) | source(...) | -| main.rs:164:10:164:15 | arr[0] | main.rs:162:13:162:21 | source(...) | main.rs:164:10:164:15 | arr[0] | $@ | main.rs:162:13:162:21 | source(...) | source(...) | -| main.rs:175:10:175:29 | get_tuple_element(...) | main.rs:173:13:173:22 | source(...) | main.rs:175:10:175:29 | get_tuple_element(...) | $@ | main.rs:173:13:173:22 | source(...) | source(...) | -| main.rs:175:10:175:29 | get_tuple_element(...) | main.rs:173:13:173:22 | source(...) | main.rs:175:10:175:29 | get_tuple_element(...) | $@ | main.rs:173:13:173:22 | source(...) | source(...) | -| main.rs:189:10:189:12 | t.1 | main.rs:186:13:186:22 | source(...) | main.rs:189:10:189:12 | t.1 | $@ | main.rs:186:13:186:22 | source(...) | source(...) | -| main.rs:189:10:189:12 | t.1 | main.rs:186:13:186:22 | source(...) | main.rs:189:10:189:12 | t.1 | $@ | main.rs:186:13:186:22 | source(...) | source(...) | -| main.rs:203:14:203:14 | n | main.rs:201:13:201:22 | source(...) | main.rs:203:14:203:14 | n | $@ | main.rs:201:13:201:22 | source(...) | source(...) | -| main.rs:203:14:203:14 | n | main.rs:201:13:201:22 | source(...) | main.rs:203:14:203:14 | n | $@ | main.rs:201:13:201:22 | source(...) | source(...) | -| main.rs:213:10:213:10 | t | main.rs:210:13:210:22 | source(...) | main.rs:213:10:213:10 | t | $@ | main.rs:210:13:210:22 | source(...) | source(...) | -| main.rs:213:10:213:10 | t | main.rs:210:13:210:22 | source(...) | main.rs:213:10:213:10 | t | $@ | main.rs:210:13:210:22 | source(...) | source(...) | -| main.rs:220:10:220:10 | t | main.rs:217:13:217:22 | source(...) | main.rs:220:10:220:10 | t | $@ | main.rs:217:13:217:22 | source(...) | source(...) | -| main.rs:220:10:220:10 | t | main.rs:217:13:217:22 | source(...) | main.rs:220:10:220:10 | t | $@ | main.rs:217:13:217:22 | source(...) | source(...) | -| main.rs:231:10:231:10 | t | main.rs:229:13:229:22 | source(...) | main.rs:231:10:231:10 | t | $@ | main.rs:229:13:229:22 | source(...) | source(...) | -| main.rs:231:10:231:10 | t | main.rs:229:13:229:22 | source(...) | main.rs:231:10:231:10 | t | $@ | main.rs:229:13:229:22 | source(...) | source(...) | -| main.rs:253:47:253:47 | i | main.rs:250:13:250:23 | enum_source | main.rs:253:47:253:47 | i | $@ | main.rs:250:13:250:23 | enum_source | enum_source | -| main.rs:253:47:253:47 | i | main.rs:250:13:250:23 | enum_source | main.rs:253:47:253:47 | i | $@ | main.rs:250:13:250:23 | enum_source | enum_source | -| main.rs:261:47:261:47 | i | main.rs:259:15:259:20 | source | main.rs:261:47:261:47 | i | $@ | main.rs:259:15:259:20 | source | source | -| main.rs:261:47:261:47 | i | main.rs:259:15:259:20 | source | main.rs:261:47:261:47 | i | $@ | main.rs:259:15:259:20 | source | source | -| main.rs:275:26:275:26 | a | main.rs:276:9:276:19 | pass_source | main.rs:275:26:275:26 | a | $@ | main.rs:276:9:276:19 | pass_source | pass_source | -| main.rs:275:26:275:26 | a | main.rs:276:9:276:19 | pass_source | main.rs:275:26:275:26 | a | $@ | main.rs:276:9:276:19 | pass_source | pass_source | -| main.rs:279:18:279:18 | a | main.rs:278:9:278:19 | pass_source | main.rs:279:18:279:18 | a | $@ | main.rs:278:9:278:19 | pass_source | pass_source | -| main.rs:279:18:279:18 | a | main.rs:278:9:278:19 | pass_source | main.rs:279:18:279:18 | a | $@ | main.rs:278:9:278:19 | pass_source | pass_source | -| main.rs:283:18:283:18 | a | main.rs:285:9:285:19 | pass_source | main.rs:283:18:283:18 | a | $@ | main.rs:285:9:285:19 | pass_source | pass_source | -| main.rs:283:18:283:18 | a | main.rs:285:9:285:19 | pass_source | main.rs:283:18:283:18 | a | $@ | main.rs:285:9:285:19 | pass_source | pass_source | -| main.rs:288:18:288:18 | a | main.rs:287:9:287:19 | pass_source | main.rs:288:18:288:18 | a | $@ | main.rs:287:9:287:19 | pass_source | pass_source | -| main.rs:288:18:288:18 | a | main.rs:287:9:287:19 | pass_source | main.rs:288:18:288:18 | a | $@ | main.rs:287:9:287:19 | pass_source | pass_source | -| main.rs:298:5:298:13 | enum_sink | main.rs:297:13:297:22 | source(...) | main.rs:298:5:298:13 | enum_sink | $@ | main.rs:297:13:297:22 | source(...) | source(...) | -| main.rs:298:5:298:13 | enum_sink | main.rs:297:13:297:22 | source(...) | main.rs:298:5:298:13 | enum_sink | $@ | main.rs:297:13:297:22 | source(...) | source(...) | -| main.rs:305:7:305:10 | sink | main.rs:303:13:303:22 | source(...) | main.rs:305:7:305:10 | sink | $@ | main.rs:303:13:303:22 | source(...) | source(...) | -| main.rs:305:7:305:10 | sink | main.rs:303:13:303:22 | source(...) | main.rs:305:7:305:10 | sink | $@ | main.rs:303:13:303:22 | source(...) | source(...) | -| main.rs:315:10:315:10 | s | main.rs:314:13:314:25 | simple_source | main.rs:315:10:315:10 | s | $@ | main.rs:314:13:314:25 | simple_source | simple_source | -| main.rs:315:10:315:10 | s | main.rs:314:13:314:25 | simple_source | main.rs:315:10:315:10 | s | $@ | main.rs:314:13:314:25 | simple_source | simple_source | -| main.rs:323:5:323:15 | simple_sink | main.rs:322:13:322:22 | source(...) | main.rs:323:5:323:15 | simple_sink | $@ | main.rs:322:13:322:22 | source(...) | source(...) | -| main.rs:323:5:323:15 | simple_sink | main.rs:322:13:322:22 | source(...) | main.rs:323:5:323:15 | simple_sink | $@ | main.rs:322:13:322:22 | source(...) | source(...) | -| main.rs:332:10:332:10 | i | main.rs:331:5:331:14 | arg_source | main.rs:332:10:332:10 | i | $@ | main.rs:331:5:331:14 | arg_source | arg_source | -| main.rs:332:10:332:10 | i | main.rs:331:5:331:14 | arg_source | main.rs:332:10:332:10 | i | $@ | main.rs:331:5:331:14 | arg_source | arg_source | -| main.rs:385:10:385:11 | x1 | main.rs:384:14:384:23 | source(...) | main.rs:385:10:385:11 | x1 | $@ | main.rs:384:14:384:23 | source(...) | source(...) | -| main.rs:385:10:385:11 | x1 | main.rs:384:14:384:23 | source(...) | main.rs:385:10:385:11 | x1 | $@ | main.rs:384:14:384:23 | source(...) | source(...) | -| main.rs:395:10:395:18 | x2.field1 | main.rs:388:17:388:26 | source(...) | main.rs:395:10:395:18 | x2.field1 | $@ | main.rs:388:17:388:26 | source(...) | source(...) | -| main.rs:395:10:395:18 | x2.field1 | main.rs:388:17:388:26 | source(...) | main.rs:395:10:395:18 | x2.field1 | $@ | main.rs:388:17:388:26 | source(...) | source(...) | -| main.rs:401:10:401:11 | x4 | main.rs:400:14:400:23 | source(...) | main.rs:401:10:401:11 | x4 | $@ | main.rs:400:14:400:23 | source(...) | source(...) | -| main.rs:401:10:401:11 | x4 | main.rs:400:14:400:23 | source(...) | main.rs:401:10:401:11 | x4 | $@ | main.rs:400:14:400:23 | source(...) | source(...) | -| main.rs:404:10:404:11 | x5 | main.rs:403:14:403:23 | source(...) | main.rs:404:10:404:11 | x5 | $@ | main.rs:403:14:403:23 | source(...) | source(...) | -| main.rs:407:10:407:11 | x6 | main.rs:406:14:406:23 | source(...) | main.rs:407:10:407:11 | x6 | $@ | main.rs:406:14:406:23 | source(...) | source(...) | -| main.rs:422:10:422:28 | generated_source(...) | main.rs:422:10:422:25 | generated_source | main.rs:422:10:422:28 | generated_source(...) | $@ | main.rs:422:10:422:25 | generated_source | generated_source | -| main.rs:422:10:422:28 | generated_source(...) | main.rs:422:10:422:25 | generated_source | main.rs:422:10:422:28 | generated_source(...) | $@ | main.rs:422:10:422:25 | generated_source | generated_source | -| main.rs:424:10:424:33 | neutral_manual_source(...) | main.rs:424:10:424:30 | neutral_manual_source | main.rs:424:10:424:33 | neutral_manual_source(...) | $@ | main.rs:424:10:424:30 | neutral_manual_source | neutral_manual_source | -| main.rs:424:10:424:33 | neutral_manual_source(...) | main.rs:424:10:424:30 | neutral_manual_source | main.rs:424:10:424:33 | neutral_manual_source(...) | $@ | main.rs:424:10:424:30 | neutral_manual_source | neutral_manual_source | -| main.rs:425:5:425:18 | generated_sink | main.rs:425:20:425:28 | source(...) | main.rs:425:5:425:18 | generated_sink | $@ | main.rs:425:20:425:28 | source(...) | source(...) | -| main.rs:425:5:425:18 | generated_sink | main.rs:425:20:425:28 | source(...) | main.rs:425:5:425:18 | generated_sink | $@ | main.rs:425:20:425:28 | source(...) | source(...) | -| main.rs:427:5:427:23 | neutral_manual_sink | main.rs:427:25:427:33 | source(...) | main.rs:427:5:427:23 | neutral_manual_sink | $@ | main.rs:427:25:427:33 | source(...) | source(...) | -| main.rs:427:5:427:23 | neutral_manual_sink | main.rs:427:25:427:33 | source(...) | main.rs:427:5:427:23 | neutral_manual_sink | $@ | main.rs:427:25:427:33 | source(...) | source(...) | -| main.rs:428:10:428:37 | generated_summary(...) | main.rs:428:28:428:36 | source(...) | main.rs:428:10:428:37 | generated_summary(...) | $@ | main.rs:428:28:428:36 | source(...) | source(...) | -| main.rs:428:10:428:37 | generated_summary(...) | main.rs:428:28:428:36 | source(...) | main.rs:428:10:428:37 | generated_summary(...) | $@ | main.rs:428:28:428:36 | source(...) | source(...) | -| main.rs:430:10:430:42 | neutral_manual_summary(...) | main.rs:430:33:430:41 | source(...) | main.rs:430:10:430:42 | neutral_manual_summary(...) | $@ | main.rs:430:33:430:41 | source(...) | source(...) | -| main.rs:430:10:430:42 | neutral_manual_summary(...) | main.rs:430:33:430:41 | source(...) | main.rs:430:10:430:42 | neutral_manual_summary(...) | $@ | main.rs:430:33:430:41 | source(...) | source(...) | +| main.rs:89:10:89:26 | get_var_field(...) | main.rs:87:13:87:21 | source(...) | main.rs:89:10:89:26 | get_var_field(...) | $@ | main.rs:87:13:87:21 | source(...) | source(...) | +| main.rs:89:10:89:26 | get_var_field(...) | main.rs:87:13:87:21 | source(...) | main.rs:89:10:89:26 | get_var_field(...) | $@ | main.rs:87:13:87:21 | source(...) | source(...) | +| main.rs:104:47:104:47 | i | main.rs:100:13:100:21 | source(...) | main.rs:104:47:104:47 | i | $@ | main.rs:100:13:100:21 | source(...) | source(...) | +| main.rs:104:47:104:47 | i | main.rs:100:13:100:21 | source(...) | main.rs:104:47:104:47 | i | $@ | main.rs:100:13:100:21 | source(...) | source(...) | +| main.rs:125:10:125:36 | get_struct_field(...) | main.rs:120:13:120:21 | source(...) | main.rs:125:10:125:36 | get_struct_field(...) | $@ | main.rs:120:13:120:21 | source(...) | source(...) | +| main.rs:125:10:125:36 | get_struct_field(...) | main.rs:120:13:120:21 | source(...) | main.rs:125:10:125:36 | get_struct_field(...) | $@ | main.rs:120:13:120:21 | source(...) | source(...) | +| main.rs:145:10:145:25 | my_struct.field2 | main.rs:142:13:142:21 | source(...) | main.rs:145:10:145:25 | my_struct.field2 | $@ | main.rs:142:13:142:21 | source(...) | source(...) | +| main.rs:145:10:145:25 | my_struct.field2 | main.rs:142:13:142:21 | source(...) | main.rs:145:10:145:25 | my_struct.field2 | $@ | main.rs:142:13:142:21 | source(...) | source(...) | +| main.rs:155:10:155:31 | get_array_element(...) | main.rs:154:13:154:21 | source(...) | main.rs:155:10:155:31 | get_array_element(...) | $@ | main.rs:154:13:154:21 | source(...) | source(...) | +| main.rs:155:10:155:31 | get_array_element(...) | main.rs:154:13:154:21 | source(...) | main.rs:155:10:155:31 | get_array_element(...) | $@ | main.rs:154:13:154:21 | source(...) | source(...) | +| main.rs:166:10:166:15 | arr[0] | main.rs:164:13:164:21 | source(...) | main.rs:166:10:166:15 | arr[0] | $@ | main.rs:164:13:164:21 | source(...) | source(...) | +| main.rs:166:10:166:15 | arr[0] | main.rs:164:13:164:21 | source(...) | main.rs:166:10:166:15 | arr[0] | $@ | main.rs:164:13:164:21 | source(...) | source(...) | +| main.rs:177:10:177:29 | get_tuple_element(...) | main.rs:175:13:175:22 | source(...) | main.rs:177:10:177:29 | get_tuple_element(...) | $@ | main.rs:175:13:175:22 | source(...) | source(...) | +| main.rs:177:10:177:29 | get_tuple_element(...) | main.rs:175:13:175:22 | source(...) | main.rs:177:10:177:29 | get_tuple_element(...) | $@ | main.rs:175:13:175:22 | source(...) | source(...) | +| main.rs:191:10:191:12 | t.1 | main.rs:188:13:188:22 | source(...) | main.rs:191:10:191:12 | t.1 | $@ | main.rs:188:13:188:22 | source(...) | source(...) | +| main.rs:191:10:191:12 | t.1 | main.rs:188:13:188:22 | source(...) | main.rs:191:10:191:12 | t.1 | $@ | main.rs:188:13:188:22 | source(...) | source(...) | +| main.rs:205:14:205:14 | n | main.rs:203:13:203:22 | source(...) | main.rs:205:14:205:14 | n | $@ | main.rs:203:13:203:22 | source(...) | source(...) | +| main.rs:205:14:205:14 | n | main.rs:203:13:203:22 | source(...) | main.rs:205:14:205:14 | n | $@ | main.rs:203:13:203:22 | source(...) | source(...) | +| main.rs:215:10:215:10 | t | main.rs:212:13:212:22 | source(...) | main.rs:215:10:215:10 | t | $@ | main.rs:212:13:212:22 | source(...) | source(...) | +| main.rs:215:10:215:10 | t | main.rs:212:13:212:22 | source(...) | main.rs:215:10:215:10 | t | $@ | main.rs:212:13:212:22 | source(...) | source(...) | +| main.rs:222:10:222:10 | t | main.rs:219:13:219:22 | source(...) | main.rs:222:10:222:10 | t | $@ | main.rs:219:13:219:22 | source(...) | source(...) | +| main.rs:222:10:222:10 | t | main.rs:219:13:219:22 | source(...) | main.rs:222:10:222:10 | t | $@ | main.rs:219:13:219:22 | source(...) | source(...) | +| main.rs:233:10:233:10 | t | main.rs:231:13:231:22 | source(...) | main.rs:233:10:233:10 | t | $@ | main.rs:231:13:231:22 | source(...) | source(...) | +| main.rs:233:10:233:10 | t | main.rs:231:13:231:22 | source(...) | main.rs:233:10:233:10 | t | $@ | main.rs:231:13:231:22 | source(...) | source(...) | +| main.rs:260:47:260:47 | i | main.rs:257:13:257:23 | enum_source | main.rs:260:47:260:47 | i | $@ | main.rs:257:13:257:23 | enum_source | enum_source | +| main.rs:260:47:260:47 | i | main.rs:257:13:257:23 | enum_source | main.rs:260:47:260:47 | i | $@ | main.rs:257:13:257:23 | enum_source | enum_source | +| main.rs:271:33:271:33 | i | main.rs:264:13:264:30 | enum_source_nested | main.rs:271:33:271:33 | i | $@ | main.rs:264:13:264:30 | enum_source_nested | enum_source_nested | +| main.rs:271:33:271:33 | i | main.rs:264:13:264:30 | enum_source_nested | main.rs:271:33:271:33 | i | $@ | main.rs:264:13:264:30 | enum_source_nested | enum_source_nested | +| main.rs:282:47:282:47 | i | main.rs:280:15:280:20 | source | main.rs:282:47:282:47 | i | $@ | main.rs:280:15:280:20 | source | source | +| main.rs:282:47:282:47 | i | main.rs:280:15:280:20 | source | main.rs:282:47:282:47 | i | $@ | main.rs:280:15:280:20 | source | source | +| main.rs:303:26:303:26 | a | main.rs:304:9:304:19 | pass_source | main.rs:303:26:303:26 | a | $@ | main.rs:304:9:304:19 | pass_source | pass_source | +| main.rs:303:26:303:26 | a | main.rs:304:9:304:19 | pass_source | main.rs:303:26:303:26 | a | $@ | main.rs:304:9:304:19 | pass_source | pass_source | +| main.rs:307:18:307:18 | a | main.rs:306:9:306:19 | pass_source | main.rs:307:18:307:18 | a | $@ | main.rs:306:9:306:19 | pass_source | pass_source | +| main.rs:307:18:307:18 | a | main.rs:306:9:306:19 | pass_source | main.rs:307:18:307:18 | a | $@ | main.rs:306:9:306:19 | pass_source | pass_source | +| main.rs:311:18:311:18 | a | main.rs:313:9:313:19 | pass_source | main.rs:311:18:311:18 | a | $@ | main.rs:313:9:313:19 | pass_source | pass_source | +| main.rs:311:18:311:18 | a | main.rs:313:9:313:19 | pass_source | main.rs:311:18:311:18 | a | $@ | main.rs:313:9:313:19 | pass_source | pass_source | +| main.rs:316:18:316:18 | a | main.rs:315:9:315:19 | pass_source | main.rs:316:18:316:18 | a | $@ | main.rs:315:9:315:19 | pass_source | pass_source | +| main.rs:316:18:316:18 | a | main.rs:315:9:315:19 | pass_source | main.rs:316:18:316:18 | a | $@ | main.rs:315:9:315:19 | pass_source | pass_source | +| main.rs:326:41:326:41 | i | main.rs:319:9:319:26 | pass_source_nested | main.rs:326:41:326:41 | i | $@ | main.rs:319:9:319:26 | pass_source_nested | pass_source_nested | +| main.rs:326:41:326:41 | i | main.rs:319:9:319:26 | pass_source_nested | main.rs:326:41:326:41 | i | $@ | main.rs:319:9:319:26 | pass_source_nested | pass_source_nested | +| main.rs:365:5:365:13 | enum_sink | main.rs:364:13:364:22 | source(...) | main.rs:365:5:365:13 | enum_sink | $@ | main.rs:364:13:364:22 | source(...) | source(...) | +| main.rs:365:5:365:13 | enum_sink | main.rs:364:13:364:22 | source(...) | main.rs:365:5:365:13 | enum_sink | $@ | main.rs:364:13:364:22 | source(...) | source(...) | +| main.rs:368:5:368:20 | enum_sink_nested | main.rs:364:13:364:22 | source(...) | main.rs:368:5:368:20 | enum_sink_nested | $@ | main.rs:364:13:364:22 | source(...) | source(...) | +| main.rs:368:5:368:20 | enum_sink_nested | main.rs:364:13:364:22 | source(...) | main.rs:368:5:368:20 | enum_sink_nested | $@ | main.rs:364:13:364:22 | source(...) | source(...) | +| main.rs:374:7:374:10 | sink | main.rs:372:13:372:22 | source(...) | main.rs:374:7:374:10 | sink | $@ | main.rs:372:13:372:22 | source(...) | source(...) | +| main.rs:374:7:374:10 | sink | main.rs:372:13:372:22 | source(...) | main.rs:374:7:374:10 | sink | $@ | main.rs:372:13:372:22 | source(...) | source(...) | +| main.rs:384:10:384:10 | s | main.rs:383:13:383:25 | simple_source | main.rs:384:10:384:10 | s | $@ | main.rs:383:13:383:25 | simple_source | simple_source | +| main.rs:384:10:384:10 | s | main.rs:383:13:383:25 | simple_source | main.rs:384:10:384:10 | s | $@ | main.rs:383:13:383:25 | simple_source | simple_source | +| main.rs:392:5:392:15 | simple_sink | main.rs:391:13:391:22 | source(...) | main.rs:392:5:392:15 | simple_sink | $@ | main.rs:391:13:391:22 | source(...) | source(...) | +| main.rs:392:5:392:15 | simple_sink | main.rs:391:13:391:22 | source(...) | main.rs:392:5:392:15 | simple_sink | $@ | main.rs:391:13:391:22 | source(...) | source(...) | +| main.rs:401:10:401:10 | i | main.rs:400:5:400:14 | arg_source | main.rs:401:10:401:10 | i | $@ | main.rs:400:5:400:14 | arg_source | arg_source | +| main.rs:401:10:401:10 | i | main.rs:400:5:400:14 | arg_source | main.rs:401:10:401:10 | i | $@ | main.rs:400:5:400:14 | arg_source | arg_source | +| main.rs:465:10:465:11 | x1 | main.rs:464:14:464:23 | source(...) | main.rs:465:10:465:11 | x1 | $@ | main.rs:464:14:464:23 | source(...) | source(...) | +| main.rs:465:10:465:11 | x1 | main.rs:464:14:464:23 | source(...) | main.rs:465:10:465:11 | x1 | $@ | main.rs:464:14:464:23 | source(...) | source(...) | +| main.rs:475:10:475:18 | x2.field1 | main.rs:468:17:468:26 | source(...) | main.rs:475:10:475:18 | x2.field1 | $@ | main.rs:468:17:468:26 | source(...) | source(...) | +| main.rs:475:10:475:18 | x2.field1 | main.rs:468:17:468:26 | source(...) | main.rs:475:10:475:18 | x2.field1 | $@ | main.rs:468:17:468:26 | source(...) | source(...) | +| main.rs:481:10:481:11 | x4 | main.rs:480:14:480:23 | source(...) | main.rs:481:10:481:11 | x4 | $@ | main.rs:480:14:480:23 | source(...) | source(...) | +| main.rs:481:10:481:11 | x4 | main.rs:480:14:480:23 | source(...) | main.rs:481:10:481:11 | x4 | $@ | main.rs:480:14:480:23 | source(...) | source(...) | +| main.rs:484:10:484:11 | x5 | main.rs:483:14:483:23 | source(...) | main.rs:484:10:484:11 | x5 | $@ | main.rs:483:14:483:23 | source(...) | source(...) | +| main.rs:487:10:487:11 | x6 | main.rs:486:14:486:23 | source(...) | main.rs:487:10:487:11 | x6 | $@ | main.rs:486:14:486:23 | source(...) | source(...) | +| main.rs:502:10:502:28 | generated_source(...) | main.rs:502:10:502:25 | generated_source | main.rs:502:10:502:28 | generated_source(...) | $@ | main.rs:502:10:502:25 | generated_source | generated_source | +| main.rs:502:10:502:28 | generated_source(...) | main.rs:502:10:502:25 | generated_source | main.rs:502:10:502:28 | generated_source(...) | $@ | main.rs:502:10:502:25 | generated_source | generated_source | +| main.rs:504:10:504:33 | neutral_manual_source(...) | main.rs:504:10:504:30 | neutral_manual_source | main.rs:504:10:504:33 | neutral_manual_source(...) | $@ | main.rs:504:10:504:30 | neutral_manual_source | neutral_manual_source | +| main.rs:504:10:504:33 | neutral_manual_source(...) | main.rs:504:10:504:30 | neutral_manual_source | main.rs:504:10:504:33 | neutral_manual_source(...) | $@ | main.rs:504:10:504:30 | neutral_manual_source | neutral_manual_source | +| main.rs:505:5:505:18 | generated_sink | main.rs:505:20:505:28 | source(...) | main.rs:505:5:505:18 | generated_sink | $@ | main.rs:505:20:505:28 | source(...) | source(...) | +| main.rs:505:5:505:18 | generated_sink | main.rs:505:20:505:28 | source(...) | main.rs:505:5:505:18 | generated_sink | $@ | main.rs:505:20:505:28 | source(...) | source(...) | +| main.rs:507:5:507:23 | neutral_manual_sink | main.rs:507:25:507:33 | source(...) | main.rs:507:5:507:23 | neutral_manual_sink | $@ | main.rs:507:25:507:33 | source(...) | source(...) | +| main.rs:507:5:507:23 | neutral_manual_sink | main.rs:507:25:507:33 | source(...) | main.rs:507:5:507:23 | neutral_manual_sink | $@ | main.rs:507:25:507:33 | source(...) | source(...) | +| main.rs:508:10:508:37 | generated_summary(...) | main.rs:508:28:508:36 | source(...) | main.rs:508:10:508:37 | generated_summary(...) | $@ | main.rs:508:28:508:36 | source(...) | source(...) | +| main.rs:508:10:508:37 | generated_summary(...) | main.rs:508:28:508:36 | source(...) | main.rs:508:10:508:37 | generated_summary(...) | $@ | main.rs:508:28:508:36 | source(...) | source(...) | +| main.rs:510:10:510:42 | neutral_manual_summary(...) | main.rs:510:33:510:41 | source(...) | main.rs:510:10:510:42 | neutral_manual_summary(...) | $@ | main.rs:510:33:510:41 | source(...) | source(...) | +| main.rs:510:10:510:42 | neutral_manual_summary(...) | main.rs:510:33:510:41 | source(...) | main.rs:510:10:510:42 | neutral_manual_summary(...) | $@ | main.rs:510:33:510:41 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/models/models.ext.yml b/rust/ql/test/library-tests/dataflow/models/models.ext.yml index 4e3377881a36..3fee1227a6df 100644 --- a/rust/ql/test/library-tests/dataflow/models/models.ext.yml +++ b/rust/ql/test/library-tests/dataflow/models/models.ext.yml @@ -5,9 +5,12 @@ extensions: data: - ["main::simple_source", "ReturnValue", "test-source", "manual"] - ["main::enum_source", "ReturnValue.Field[main::MyFieldEnum::D::field_d]", "test-source", "manual"] + - ["main::enum_source_nested", "ReturnValue.Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]", "test-source", "manual"] - ["::source", "ReturnValue.Field[main::MyFieldEnum::C::field_c]", "test-source", "manual"] - ["main::arg_source", "Argument[0]", "test-source", "manual"] + - ["<_ as main::MyTrait>::test_param_source", "Parameter[0]", "test-source", "manual"] - ["main::source_into_function::pass_source", "Argument[1].Parameter[0]", "test-source", "manual"] + - ["main::source_into_function::pass_source_nested", "Argument[1].Parameter[0].Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]", "test-source", "manual"] - ["main::external_file::generated_source", "ReturnValue", "test-source", "dfc-generated"] # not actually generated, but we want to test behaviour of generated models here. - ["main::external_file::neutral_generated_source", "ReturnValue", "test-source", "dfc-generated"] - ["main::external_file::neutral_manual_source", "ReturnValue", "test-source", "manual"] @@ -17,7 +20,10 @@ extensions: data: - ["main::simple_sink", "Argument[0]", "test-sink", "manual"] - ["main::enum_sink", "Argument[0].Field[main::MyFieldEnum::C::field_c]", "test-sink", "manual"] + - ["main::enum_sink_nested", "Argument[0].Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]", "test-sink", "manual"] - ["::sink", "Argument[self].Field[main::MyFieldEnum::D::field_d]", "test-sink", "manual"] + - ["main::sink_out_of_function::pass_sink", "Argument[0].ReturnValue", "test-sink", "manual"] + - ["main::sink_out_of_function::pass_sink_nested", "Argument[0].ReturnValue.Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]", "test-sink", "manual"] - ["main::external_file::generated_sink", "Argument[0]", "test-sink", "dfc-generated"] - ["main::external_file::neutral_generated_sink", "Argument[0]", "test-sink", "dfc-generated"] - ["main::external_file::neutral_manual_sink", "Argument[0]", "test-sink", "manual"] From 7e1f7ed7dbe75e4d29ad4402501caf647ddf66fc Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Wed, 8 Jul 2026 13:03:14 +0200 Subject: [PATCH 0324/2098] FlowSummaryImpl: Introduce `Make2` parameterization --- .../dataflow/internal/FlowSummaryImpl.qll | 1646 +++++++++-------- 1 file changed, 828 insertions(+), 818 deletions(-) diff --git a/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll b/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll index b0828c3384bb..21c43b03fef1 100644 --- a/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll +++ b/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll @@ -1297,847 +1297,963 @@ module Make< } } - private newtype TSummaryNode = - TSummaryInternalNode(SummarizedCallable c, SummaryNodeState state) { - summaryNodeRange(c, state) - } or - TSummaryParameterNode(SummarizedCallable c, ParameterPosition pos) { - summaryParameterNodeRange(c, pos) - } or - TSummaryReturnArgumentNode(FlowSummaryCallBase call, ReturnKind rk) { - exists(SummarizedCallable sc | - call = getASourceCall(sc) and - relevantFlowSummaryPosition(sc, rk) - ) - } or - TSourceOutputNode(SourceElement source, SummaryNodeState state, string kind, string model) { - state.isSourceOutputState(source, _, kind, model) - } or - TSinkInputNode(SinkElement sink, SummaryNodeState state, string kind, string model) { - state.isSinkInputState(sink, _, kind, model) - } - - abstract class SummaryNode extends TSummaryNode { - abstract string toString(); - - abstract SummarizedCallable getSummarizedCallable(); + signature module InputSig2 { + /** + * Gets a data flow node corresponding to the `s` part of `source`. + * + * `s` is typically `ReturnValue` and the result is the node that + * represents the return value of `source`. + */ + Node getSourceNode(SourceBase source, SummaryComponentStack s); - abstract SourceElement getSourceElement(); + /** + * Gets a data flow node corresponding to the `sc` part of `sink`. + * + * `sc` is typically `Argument[i]` and the result is the node that + * represents the `i`th argument of `sink`. + */ + Node getSinkNode(SinkBase sink, SummaryComponent sc); + } - abstract SinkElement getSinkElement(); + module Make2 { + private import Input2 - predicate isHidden() { any() } - } + private newtype TSummaryNode = + TSummaryInternalNode(SummarizedCallable c, SummaryNodeState state) { + summaryNodeRange(c, state) + } or + TSummaryParameterNode(SummarizedCallable c, ParameterPosition pos) { + summaryParameterNodeRange(c, pos) + } or + TSummaryReturnArgumentNode(FlowSummaryCallBase call, ReturnKind rk) { + exists(SummarizedCallable sc | + call = getASourceCall(sc) and + relevantFlowSummaryPosition(sc, rk) + ) + } or + TSourceOutputNode(SourceElement source, SummaryNodeState state, string kind, string model) { + state.isSourceOutputState(source, _, kind, model) + } or + TSinkInputNode(SinkElement sink, SummaryNodeState state, string kind, string model) { + state.isSinkInputState(sink, _, kind, model) + } - private class SummaryInternalNode extends SummaryNode, TSummaryInternalNode { - private SummarizedCallable c; - private SummaryNodeState state; + abstract class SummaryNode extends TSummaryNode { + abstract string toString(); - SummaryInternalNode() { this = TSummaryInternalNode(c, state) } + abstract SummarizedCallable getSummarizedCallable(); - override string toString() { result = "[summary] " + state + " in " + c } + abstract SourceElement getSourceElement(); - override SummarizedCallable getSummarizedCallable() { result = c } + abstract SinkElement getSinkElement(); - override SourceElement getSourceElement() { none() } + predicate isHidden() { any() } + } - override SinkElement getSinkElement() { none() } - } + private class SummaryInternalNode extends SummaryNode, TSummaryInternalNode { + private SummarizedCallable c; + private SummaryNodeState state; - private class SummaryParamNode extends SummaryNode, TSummaryParameterNode { - private SummarizedCallable c; - private ParameterPosition pos; + SummaryInternalNode() { this = TSummaryInternalNode(c, state) } - SummaryParamNode() { this = TSummaryParameterNode(c, pos) } + override string toString() { result = "[summary] " + state + " in " + c } - override string toString() { result = "[summary param] " + pos + " in " + c } + override SummarizedCallable getSummarizedCallable() { result = c } - override SummarizedCallable getSummarizedCallable() { result = c } + override SourceElement getSourceElement() { none() } - override SourceElement getSourceElement() { none() } + override SinkElement getSinkElement() { none() } + } - override SinkElement getSinkElement() { none() } - } + private class SummaryParamNode extends SummaryNode, TSummaryParameterNode { + private SummarizedCallable c; + private ParameterPosition pos; - private class SummaryReturnArgumentNode extends SummaryNode, TSummaryReturnArgumentNode { - private FlowSummaryCallBase call; - private ReturnKind rk; + SummaryParamNode() { this = TSummaryParameterNode(c, pos) } - SummaryReturnArgumentNode() { this = TSummaryReturnArgumentNode(call, rk) } + override string toString() { result = "[summary param] " + pos + " in " + c } - override string toString() { result = "[summary] value written to " + rk + " at " + call } + override SummarizedCallable getSummarizedCallable() { result = c } - override SummarizedCallable getSummarizedCallable() { none() } + override SourceElement getSourceElement() { none() } - override SourceElement getSourceElement() { none() } + override SinkElement getSinkElement() { none() } + } - override SinkElement getSinkElement() { none() } - } + private class SummaryReturnArgumentNode extends SummaryNode, TSummaryReturnArgumentNode { + private FlowSummaryCallBase call; + private ReturnKind rk; - /** - * Gets the summary node that represents the argument node used to transfer - * flow into the caller when a value is written to the value returned by - * `call` with kind `rk`. - */ - SummaryNode summaryArgumentNode(FlowSummaryCallBase call, ReturnKind rk) { - result = TSummaryReturnArgumentNode(call, rk) - } + SummaryReturnArgumentNode() { this = TSummaryReturnArgumentNode(call, rk) } - /** Gets the enclosing callable for summary node `sn`. */ - DataFlowCallable getEnclosingCallable(SummaryNode sn) { - result = getSummarizedCallableAsDataFlowCallable(sn.getSummarizedCallable()) - or - exists(FlowSummaryCallBase call | - sn = TSummaryReturnArgumentNode(call, _) and - result = getSourceCallEnclosingCallable(call) - ) - } + override string toString() { result = "[summary] value written to " + rk + " at " + call } - class SourceOutputNode extends SummaryNode, TSourceOutputNode { - private SourceElement source_; - private SummaryNodeState state_; - private string kind_; - private string model_; + override SummarizedCallable getSummarizedCallable() { none() } - SourceOutputNode() { this = TSourceOutputNode(source_, state_, kind_, model_) } + override SourceElement getSourceElement() { none() } - /** - * Holds if this node is an entry node, i.e. before any stores have been performed. - * - * This node should be used as the actual source node in data flow configurations. - */ - predicate isEntry(string kind, string model) { - model = model_ and - exists(SummaryComponentStack out | - sourceOutputStateEntry(source_, out, kind, model_) and - state_.isSourceOutputState(source_, out, kind, model_) - ) + override SinkElement getSinkElement() { none() } } /** - * Holds if this node is an exit node, i.e. after all stores have been performed. - * - * A local flow step should be added from this node to a data flow node representing - * `s` inside `source`. + * Gets the summary node that represents the argument node used to transfer + * flow into the caller when a value is written to the value returned by + * `call` with kind `rk`. */ - predicate isExit(SourceElement source, SummaryComponentStack s, string model) { - source = source_ and - model = model_ and - state_.isSourceOutputState(source, s, _, model) + SummaryNode summaryArgumentNode(FlowSummaryCallBase call, ReturnKind rk) { + result = TSummaryReturnArgumentNode(call, rk) } - override predicate isHidden() { not this.isEntry(_, _) } - - override string toString() { - if this.isEntry(_, _) - then result = source_.toString() - else result = "[source] " + state_ + " at " + source_ + /** Gets the enclosing callable for summary node `sn`. */ + DataFlowCallable getEnclosingCallable(SummaryNode sn) { + result = getSummarizedCallableAsDataFlowCallable(sn.getSummarizedCallable()) + or + exists(FlowSummaryCallBase call | + sn = TSummaryReturnArgumentNode(call, _) and + result = getSourceCallEnclosingCallable(call) + ) } - override SummarizedCallable getSummarizedCallable() { none() } + class SourceOutputNode extends SummaryNode, TSourceOutputNode { + private SourceElement source_; + private SummaryNodeState state_; + private string kind_; + private string model_; - override SourceElement getSourceElement() { result = source_ } + SourceOutputNode() { this = TSourceOutputNode(source_, state_, kind_, model_) } - override SinkElement getSinkElement() { none() } - } + /** + * Holds if this node is an entry node, i.e. before any stores have been performed. + * + * This node should be used as the actual source node in data flow configurations. + */ + predicate isEntry(string kind, string model) { + model = model_ and + exists(SummaryComponentStack out | + sourceOutputStateEntry(source_, out, kind, model_) and + state_.isSourceOutputState(source_, out, kind, model_) + ) + } - class SinkInputNode extends SummaryNode, TSinkInputNode { - private SinkElement sink_; - private SummaryNodeState state_; - private string kind_; - private string model_; + /** + * Holds if this node is an exit node, i.e. after all stores have been performed. + * + * A local flow step should be added from this node to a data flow node representing + * `s` inside `source`. + */ + predicate isExit(SourceElement source, SummaryComponentStack s, string model) { + source = source_ and + model = model_ and + state_.isSourceOutputState(source, s, _, model) + } - SinkInputNode() { this = TSinkInputNode(sink_, state_, kind_, model_) } + override predicate isHidden() { not this.isEntry(_, _) } - /** - * Holds if this node is an entry node, i.e. before any reads have been performed. - * - * A local flow step should be added to this node from a data flow node representing - * `sc` inside `sink`. - */ - predicate isEntry(SinkElement sink, SummaryComponent sc, string model) { - sink = sink_ and - model = model_ and - state_.isSinkInputState(sink, TSingletonSummaryComponentStack(sc), _, model) - } + override string toString() { + if this.isEntry(_, _) + then result = source_.toString() + else result = "[source] " + state_ + " at " + source_ + } - /** - * Holds if this node is an exit node, i.e. after all reads have been performed. - * - * This node should be used as the actual sink node in data flow configurations. - */ - predicate isExit(string kind, string model) { - kind = kind_ and - model = model_ and - exists(SummaryComponentStack inp | - sinkInputStateExit(sink_, inp, kind, model_) and - state_.isSinkInputState(sink_, inp, kind, model_) - ) - } + override SummarizedCallable getSummarizedCallable() { none() } - override predicate isHidden() { not this.isExit(_, _) } + override SourceElement getSourceElement() { result = source_ } - override string toString() { - if this.isExit(_, _) - then result = sink_.toString() - else result = "[sink] " + state_ + " at " + sink_ + override SinkElement getSinkElement() { none() } } - override SummarizedCallable getSummarizedCallable() { none() } + class SinkInputNode extends SummaryNode, TSinkInputNode { + private SinkElement sink_; + private SummaryNodeState state_; + private string kind_; + private string model_; - override SourceElement getSourceElement() { none() } + SinkInputNode() { this = TSinkInputNode(sink_, state_, kind_, model_) } - override SinkElement getSinkElement() { result = sink_ } - } + /** + * Holds if this node is an entry node, i.e. before any reads have been performed. + * + * A local flow step should be added to this node from a data flow node representing + * `sc` inside `sink`. + */ + predicate isEntry(SinkElement sink, SummaryComponent sc, string model) { + sink = sink_ and + model = model_ and + state_.isSinkInputState(sink, TSingletonSummaryComponentStack(sc), _, model) + } - /** - * Holds if `state` represents having read from a parameter at position - * `pos` in `c`. In this case we are not synthesizing a data-flow node, - * but instead assume that a relevant parameter node already exists. - */ - private predicate parameterReadState( - SummarizedCallable c, SummaryNodeState state, ParameterPosition pos - ) { - state.isInputState(c, SummaryComponentStack::argument(pos)) - or - exists(ReturnKind rk | - relevantFlowSummaryPosition(c, rk) and - state.isInputState(c, SummaryComponentStack::return(rk)) and - pos = getFlowSummaryParameterPosition(rk) - ) - } + /** + * Holds if this node is an exit node, i.e. after all reads have been performed. + * + * This node should be used as the actual sink node in data flow configurations. + */ + predicate isExit(string kind, string model) { + kind = kind_ and + model = model_ and + exists(SummaryComponentStack inp | + sinkInputStateExit(sink_, inp, kind, model_) and + state_.isSinkInputState(sink_, inp, kind, model_) + ) + } - /** - * Holds if a synthesized summary node is needed for the state `state` in summarized - * callable `c`. - */ - private predicate summaryNodeRange(SummarizedCallable c, SummaryNodeState state) { - state.isInputState(c, _) and - not parameterReadState(c, state, _) - or - state.isOutputState(c, _) - } + override predicate isHidden() { not this.isExit(_, _) } - pragma[noinline] - private SummaryNode summaryNodeInputState(SummarizedCallable c, SummaryComponentStack s) { - exists(SummaryNodeState state | state.isInputState(c, s) | - result = TSummaryInternalNode(c, state) - or - exists(ParameterPosition pos | - parameterReadState(c, state, pos) and - result = TSummaryParameterNode(c, pos) - ) - ) - } + override string toString() { + if this.isExit(_, _) + then result = sink_.toString() + else result = "[sink] " + state_ + " at " + sink_ + } - pragma[noinline] - private SummaryNode summaryNodeOutputState(SummarizedCallable c, SummaryComponentStack s) { - exists(SummaryNodeState state | - state.isOutputState(c, s) and - result = TSummaryInternalNode(c, state) - ) - } + override SummarizedCallable getSummarizedCallable() { none() } - pragma[noinline] - private SummaryNode sourceElementOutputState(SourceElement source, SummaryComponentStack s) { - exists(SummaryNodeState state, string kind, string model | - state.isSourceOutputState(source, s, kind, model) and - result = TSourceOutputNode(source, state, kind, model) - ) - } + override SourceElement getSourceElement() { none() } - pragma[noinline] - private SummaryNode sinkElementInputState(SinkElement sink, SummaryComponentStack s) { - exists(SummaryNodeState state, string kind, string model | - state.isSinkInputState(sink, s, kind, model) and - result = TSinkInputNode(sink, state, kind, model) - ) - } + override SinkElement getSinkElement() { result = sink_ } + } - /** - * Holds if a write targets `post`, which is a post-update node for a - * parameter at position `pos` in `c`. - */ - private predicate isParameterPostUpdate( - SummaryNode post, SummarizedCallable c, ParameterPosition pos - ) { - post = summaryNodeOutputState(c, SummaryComponentStack::argument(pos)) - } + /** + * Holds if `state` represents having read from a parameter at position + * `pos` in `c`. In this case we are not synthesizing a data-flow node, + * but instead assume that a relevant parameter node already exists. + */ + private predicate parameterReadState( + SummarizedCallable c, SummaryNodeState state, ParameterPosition pos + ) { + state.isInputState(c, SummaryComponentStack::argument(pos)) + or + exists(ReturnKind rk | + relevantFlowSummaryPosition(c, rk) and + state.isInputState(c, SummaryComponentStack::return(rk)) and + pos = getFlowSummaryParameterPosition(rk) + ) + } - /** Holds if a parameter node at position `pos` is required for `c`. */ - private predicate summaryParameterNodeRange(SummarizedCallable c, ParameterPosition pos) { - parameterReadState(c, _, pos) - or - // Same as `isParameterPostUpdate(_, c, pos)`, but can be used in a negative context - any(SummaryNodeState state).isOutputState(c, SummaryComponentStack::argument(pos)) - } + /** + * Holds if a synthesized summary node is needed for the state `state` in summarized + * callable `c`. + */ + private predicate summaryNodeRange(SummarizedCallable c, SummaryNodeState state) { + state.isInputState(c, _) and + not parameterReadState(c, state, _) + or + state.isOutputState(c, _) + } - private predicate callbackOutput( - SummarizedCallable c, SummaryComponentStack s, SummaryNode receiver, ReturnKind rk - ) { - any(SummaryNodeState state).isInputState(c, s) and - s.head() = TReturnSummaryComponent(rk) and - receiver = summaryNodeInputState(c, s.tail()) - } + pragma[noinline] + private SummaryNode summaryNodeInputState(SummarizedCallable c, SummaryComponentStack s) { + exists(SummaryNodeState state | state.isInputState(c, s) | + result = TSummaryInternalNode(c, state) + or + exists(ParameterPosition pos | + parameterReadState(c, state, pos) and + result = TSummaryParameterNode(c, pos) + ) + ) + } - private predicate callbackInput( - SummarizedCallable c, SummaryComponentStack s, SummaryNode receiver, ArgumentPosition pos - ) { - any(SummaryNodeState state).isOutputState(c, s) and - s.head() = TParameterSummaryComponent(pos) and - receiver = summaryNodeInputState(c, s.tail()) - } + pragma[noinline] + private SummaryNode summaryNodeOutputState(SummarizedCallable c, SummaryComponentStack s) { + exists(SummaryNodeState state | + state.isOutputState(c, s) and + result = TSummaryInternalNode(c, state) + ) + } - /** Holds if a call targeting `receiver` should be synthesized inside `c`. */ - predicate summaryCallbackRange(SummarizedCallable c, SummaryNode receiver) { - callbackOutput(c, _, receiver, _) - or - callbackInput(c, _, receiver, _) - } + pragma[noinline] + private SummaryNode sourceElementOutputState(SourceElement source, SummaryComponentStack s) { + exists(SummaryNodeState state, string kind, string model | + state.isSourceOutputState(source, s, kind, model) and + result = TSourceOutputNode(source, state, kind, model) + ) + } - /** Holds if summary node `p` is a parameter with position `pos`. */ - predicate summaryParameterNode(SummaryNode p, ParameterPosition pos) { - p = TSummaryParameterNode(_, pos) - } + pragma[noinline] + private SummaryNode sinkElementInputState(SinkElement sink, SummaryComponentStack s) { + exists(SummaryNodeState state, string kind, string model | + state.isSinkInputState(sink, s, kind, model) and + result = TSinkInputNode(sink, state, kind, model) + ) + } - /** Holds if summary node `out` contains output of kind `rk` from a call targeting `receiver`. */ - predicate summaryOutNode(SummaryNode receiver, SummaryNode out, ReturnKind rk) { - exists(SummarizedCallable callable, SummaryComponentStack s | - callbackOutput(callable, s, receiver, rk) and - out = summaryNodeInputState(callable, s) - ) - } + /** + * Holds if a write targets `post`, which is a post-update node for a + * parameter at position `pos` in `c`. + */ + private predicate isParameterPostUpdate( + SummaryNode post, SummarizedCallable c, ParameterPosition pos + ) { + post = summaryNodeOutputState(c, SummaryComponentStack::argument(pos)) + } - /** Holds if summary node `arg` is at position `pos` in a call targeting `receiver`. */ - predicate summaryArgumentNode(SummaryNode receiver, SummaryNode arg, ArgumentPosition pos) { - exists(SummarizedCallable callable, SummaryComponentStack s | - callbackInput(callable, s, receiver, pos) and - arg = summaryNodeOutputState(callable, s) - ) - } + /** Holds if a parameter node at position `pos` is required for `c`. */ + private predicate summaryParameterNodeRange(SummarizedCallable c, ParameterPosition pos) { + parameterReadState(c, _, pos) + or + // Same as `isParameterPostUpdate(_, c, pos)`, but can be used in a negative context + any(SummaryNodeState state).isOutputState(c, SummaryComponentStack::argument(pos)) + } - /** Holds if summary node `post` is a post-update node with pre-update node `pre`. */ - predicate summaryPostUpdateNode(SummaryNode post, SummaryNode pre) { - exists(SummarizedCallable c, ParameterPosition pos | - isParameterPostUpdate(post, c, pos) and - pre = TSummaryParameterNode(c, pos) - ) - or - exists(SummarizedCallable callable, SummaryComponentStack s | - callbackInput(callable, s, _, _) and - pre = summaryNodeOutputState(callable, s) and - post = summaryNodeInputState(callable, s) - ) - } + private predicate callbackOutput( + SummarizedCallable c, SummaryComponentStack s, SummaryNode receiver, ReturnKind rk + ) { + any(SummaryNodeState state).isInputState(c, s) and + s.head() = TReturnSummaryComponent(rk) and + receiver = summaryNodeInputState(c, s.tail()) + } - /** Holds if summary node `ret` is a return node of kind `rk`. */ - predicate summaryReturnNode(SummaryNode ret, ReturnKind rk) { - exists(SummaryComponentStack s | - ret = summaryNodeOutputState(_, s) and - s = TSingletonSummaryComponentStack(TReturnSummaryComponent(rk)) - ) - } + private predicate callbackInput( + SummarizedCallable c, SummaryComponentStack s, SummaryNode receiver, ArgumentPosition pos + ) { + any(SummaryNodeState state).isOutputState(c, s) and + s.head() = TParameterSummaryComponent(pos) and + receiver = summaryNodeInputState(c, s.tail()) + } - /** Holds if return kind `rk` is a relevant return kind for flow summary modeling. */ - predicate relevantFlowSummaryPosition(ReturnKind rk) { relevantFlowSummaryPosition(_, rk) } + /** Holds if a call targeting `receiver` should be synthesized inside `c`. */ + predicate summaryCallbackRange(SummarizedCallable c, SummaryNode receiver) { + callbackOutput(c, _, receiver, _) + or + callbackInput(c, _, receiver, _) + } - /** - * Holds if flow is allowed to pass from the parameter at position `pos` of `c`, - * to a return node, and back out to the parameter. - */ - predicate summaryAllowParameterReturnInSelf(SummarizedCallable c, ParameterPosition ppos) { - exists(SummaryComponentStack inputContents, SummaryComponentStack outputContents | - summary(c, inputContents, outputContents, _, _) and - inputContents.bottom() = pragma[only_bind_into](TArgumentSummaryComponent(ppos)) and - outputContents.bottom() = pragma[only_bind_into](TArgumentSummaryComponent(ppos)) - ) - } + /** Holds if summary node `p` is a parameter with position `pos`. */ + predicate summaryParameterNode(SummaryNode p, ParameterPosition pos) { + p = TSummaryParameterNode(_, pos) + } - /** - * Holds if `barrier` is a relevant barrier element with output specification `outSpec`. - */ - predicate barrierSpec( - BarrierElement barrier, SummaryComponentStack outSpec, string kind, string model - ) { - exists(string output | - isRelevantBarrier(barrier, output, kind, _, model) and - External::interpretSpec(output, outSpec) - ) - } + /** Holds if summary node `out` contains output of kind `rk` from a call targeting `receiver`. */ + predicate summaryOutNode(SummaryNode receiver, SummaryNode out, ReturnKind rk) { + exists(SummarizedCallable callable, SummaryComponentStack s | + callbackOutput(callable, s, receiver, rk) and + out = summaryNodeInputState(callable, s) + ) + } - /** - * Holds if `barrierGuard` is a relevant barrier guard element with input specification `inSpec`. - */ - predicate barrierGuardSpec( - BarrierGuardElement barrierGuard, SummaryComponentStack inSpec, string acceptingValue, - string kind, string model - ) { - exists(string input | - isRelevantBarrierGuard(barrierGuard, input, acceptingValue, kind, _, model) and - External::interpretSpec(input, inSpec) - ) - } + /** Holds if summary node `arg` is at position `pos` in a call targeting `receiver`. */ + predicate summaryArgumentNode(SummaryNode receiver, SummaryNode arg, ArgumentPosition pos) { + exists(SummarizedCallable callable, SummaryComponentStack s | + callbackInput(callable, s, receiver, pos) and + arg = summaryNodeOutputState(callable, s) + ) + } - signature module TypesInputSig { - /** Gets the type of content `c`. */ - DataFlowType getContentType(ContentSet c); + /** Holds if summary node `post` is a post-update node with pre-update node `pre`. */ + predicate summaryPostUpdateNode(SummaryNode post, SummaryNode pre) { + exists(SummarizedCallable c, ParameterPosition pos | + isParameterPostUpdate(post, c, pos) and + pre = TSummaryParameterNode(c, pos) + ) + or + exists(SummarizedCallable callable, SummaryComponentStack s | + callbackInput(callable, s, _, _) and + pre = summaryNodeOutputState(callable, s) and + post = summaryNodeInputState(callable, s) + ) + } - /** Gets the type of the parameter at the given position. */ - bindingset[c, pos] - DataFlowType getParameterType(SummarizedCallable c, ParameterPosition pos); + /** Holds if summary node `ret` is a return node of kind `rk`. */ + predicate summaryReturnNode(SummaryNode ret, ReturnKind rk) { + exists(SummaryComponentStack s | + ret = summaryNodeOutputState(_, s) and + s = TSingletonSummaryComponentStack(TReturnSummaryComponent(rk)) + ) + } + + /** Holds if return kind `rk` is a relevant return kind for flow summary modeling. */ + predicate relevantFlowSummaryPosition(ReturnKind rk) { relevantFlowSummaryPosition(_, rk) } - /** Gets the return type of kind `rk` for callable `c`. */ - bindingset[c, rk] - DataFlowType getReturnType(SummarizedCallable c, ReturnKind rk); + /** + * Holds if flow is allowed to pass from the parameter at position `pos` of `c`, + * to a return node, and back out to the parameter. + */ + predicate summaryAllowParameterReturnInSelf(SummarizedCallable c, ParameterPosition ppos) { + exists(SummaryComponentStack inputContents, SummaryComponentStack outputContents | + summary(c, inputContents, outputContents, _, _) and + inputContents.bottom() = pragma[only_bind_into](TArgumentSummaryComponent(ppos)) and + outputContents.bottom() = pragma[only_bind_into](TArgumentSummaryComponent(ppos)) + ) + } /** - * Gets the type of the `i`th parameter in a synthesized call that targets a - * callback of type `t`. + * Holds if `barrier` is a relevant barrier element with output specification `outSpec`. */ - bindingset[t, pos] - DataFlowType getCallbackParameterType(DataFlowType t, ArgumentPosition pos); + predicate barrierSpec( + BarrierElement barrier, SummaryComponentStack outSpec, string kind, string model + ) { + exists(string output | + isRelevantBarrier(barrier, output, kind, _, model) and + External::interpretSpec(output, outSpec) + ) + } /** - * Gets the return type of kind `rk` in a synthesized call that targets a - * callback of type `t`. + * Holds if `barrierGuard` is a relevant barrier guard element with input specification `inSpec`. */ - bindingset[t, rk] - DataFlowType getCallbackReturnType(DataFlowType t, ReturnKind rk); + predicate barrierGuardSpec( + BarrierGuardElement barrierGuard, SummaryComponentStack inSpec, string acceptingValue, + string kind, string model + ) { + exists(string input | + isRelevantBarrierGuard(barrierGuard, input, acceptingValue, kind, _, model) and + External::interpretSpec(input, inSpec) + ) + } - DataFlowType getSyntheticGlobalType(SyntheticGlobal sg); + signature module TypesInputSig { + /** Gets the type of content `c`. */ + DataFlowType getContentType(ContentSet c); - DataFlowType getSourceType(SourceBase source, SummaryComponentStack sc); + /** Gets the type of the parameter at the given position. */ + bindingset[c, pos] + DataFlowType getParameterType(SummarizedCallable c, ParameterPosition pos); - DataFlowType getSinkType(SinkBase sink, SummaryComponent sc); - } + /** Gets the return type of kind `rk` for callable `c`. */ + bindingset[c, rk] + DataFlowType getReturnType(SummarizedCallable c, ReturnKind rk); - /** - * Provides the predicate `summaryNodeType` for associating types with summary nodes. - * - * Only relevant for typed languages. - */ - module Types { - private import TypesInput + /** + * Gets the type of the `i`th parameter in a synthesized call that targets a + * callback of type `t`. + */ + bindingset[t, pos] + DataFlowType getCallbackParameterType(DataFlowType t, ArgumentPosition pos); + + /** + * Gets the return type of kind `rk` in a synthesized call that targets a + * callback of type `t`. + */ + bindingset[t, rk] + DataFlowType getCallbackReturnType(DataFlowType t, ReturnKind rk); + + DataFlowType getSyntheticGlobalType(SyntheticGlobal sg); + + DataFlowType getSourceType(SourceBase source, SummaryComponentStack sc); + + DataFlowType getSinkType(SinkBase sink, SummaryComponent sc); + } /** - * Gets the type of synthesized summary node `n`. + * Provides the predicate `summaryNodeType` for associating types with summary nodes. * - * The type is computed based on the language-specific predicates - * `getContentType()`, `getReturnType()`, `getCallbackParameterType()`, and - * `getCallbackReturnType()`. + * Only relevant for typed languages. */ - DataFlowType summaryNodeType(SummaryNode n) { - exists(SummaryNode pre | - summaryPostUpdateNode(n, pre) and - result = summaryNodeType(pre) - ) - or - exists(SummarizedCallable c, SummaryComponentStack s, SummaryComponent head | - head = s.head() - | - n = summaryNodeInputState(c, s) and - ( - exists(ContentSet cont | result = getContentType(cont) | - head = TContentSummaryComponent(cont) or - head = TWithContentSummaryComponent(cont) + module Types { + private import TypesInput + + /** + * Gets the type of synthesized summary node `n`. + * + * The type is computed based on the language-specific predicates + * `getContentType()`, `getReturnType()`, `getCallbackParameterType()`, and + * `getCallbackReturnType()`. + */ + DataFlowType summaryNodeType(SummaryNode n) { + exists(SummaryNode pre | + summaryPostUpdateNode(n, pre) and + result = summaryNodeType(pre) + ) + or + exists(SummarizedCallable c, SummaryComponentStack s, SummaryComponent head | + head = s.head() + | + n = summaryNodeInputState(c, s) and + ( + exists(ContentSet cont | result = getContentType(cont) | + head = TContentSummaryComponent(cont) or + head = TWithContentSummaryComponent(cont) + ) + or + head = TWithoutContentSummaryComponent(_) and + result = summaryNodeType(summaryNodeInputState(c, s.tail())) + or + exists(ReturnKind rk | + head = TReturnSummaryComponent(rk) and + result = + getCallbackReturnType(summaryNodeType(summaryNodeInputState(pragma[only_bind_out](c), + s.tail())), rk) + ) + or + exists(SyntheticGlobal sg | + head = TSyntheticGlobalSummaryComponent(sg) and + result = getSyntheticGlobalType(sg) + ) + or + exists(ParameterPosition pos | + head = TArgumentSummaryComponent(pos) and + result = getParameterType(c, pos) + ) ) or - head = TWithoutContentSummaryComponent(_) and - result = summaryNodeType(summaryNodeInputState(c, s.tail())) - or - exists(ReturnKind rk | - head = TReturnSummaryComponent(rk) and - result = - getCallbackReturnType(summaryNodeType(summaryNodeInputState(pragma[only_bind_out](c), - s.tail())), rk) + n = summaryNodeOutputState(c, s) and + ( + exists(ContentSet cont | + head = TContentSummaryComponent(cont) and result = getContentType(cont) + ) + or + s.length() = 1 and + exists(ReturnKind rk | + head = TReturnSummaryComponent(rk) and + result = getReturnType(c, rk) + ) + or + exists(ArgumentPosition pos | head = TParameterSummaryComponent(pos) | + result = + getCallbackParameterType(summaryNodeType(summaryNodeInputState(pragma[only_bind_out](c), + s.tail())), pos) + ) + or + exists(SyntheticGlobal sg | + head = TSyntheticGlobalSummaryComponent(sg) and + result = getSyntheticGlobalType(sg) + ) + ) + ) + or + exists(SourceElement source | + exists(SummaryComponentStack s | + n.(SourceOutputNode).isExit(source, s, _) and + result = getSourceType(source, s) ) or - exists(SyntheticGlobal sg | - head = TSyntheticGlobalSummaryComponent(sg) and - result = getSyntheticGlobalType(sg) + exists(SummaryComponentStack s, ContentSet cont | + n = sourceElementOutputState(source, s) and + s.head() = TContentSummaryComponent(cont) and + result = getContentType(cont) + ) + ) + or + exists(SinkElement sink | + exists(SummaryComponent sc | + n.(SinkInputNode).isEntry(sink, sc, _) and + result = getSinkType(sink, sc) ) or - exists(ParameterPosition pos | - head = TArgumentSummaryComponent(pos) and - result = getParameterType(c, pos) + exists(SummaryComponentStack s, ContentSet cont | + n = sinkElementInputState(sink, s) and + s.head() = TContentSummaryComponent(cont) and + result = getContentType(cont) ) ) + } + } + + signature module StepsInputSig { + /** Gets the summary node represented by data-flow node `n`, if any. */ + SummaryNode getSummaryNode(Node n); + + /** Gets a call that targets summarized callable `sc`. */ + DataFlowCall getACall(SummarizedCallable sc); + + /** Gets the out node of kind `rk` for `call`, if any. */ + default Node getSourceOutNode(FlowSummaryCallBase call, ReturnKind rk) { none() } + + /** Gets the enclosing callable of `source`. */ + DataFlowCallable getSourceNodeEnclosingCallable(SourceBase source); + } + + /** Provides a compilation of flow summaries to atomic data-flow steps. */ + module Steps { + /** + * Holds if there is a local step from `pred` to `succ`, which is synthesized + * from a flow summary. + */ + private predicate summaryLocalStepImpl( + SummaryNode pred, SummaryNode succ, boolean preservesValue, string model + ) { + exists( + SummarizedCallable c, SummaryComponentStack inputContents, + SummaryComponentStack outputContents + | + summary(c, inputContents, outputContents, preservesValue, model) and + pred = summaryNodeInputState(pragma[only_bind_into](c), inputContents) and + succ = summaryNodeOutputState(pragma[only_bind_into](c), outputContents) + | + preservesValue = true + or + preservesValue = false and not summary(c, inputContents, outputContents, true, _) + ) + or + exists(SummarizedCallable c, SummaryComponentStack s | + pred = summaryNodeInputState(c, s.tail()) and + succ = summaryNodeInputState(c, s) and + s.head() = [SummaryComponent::withContent(_), SummaryComponent::withoutContent(_)] and + preservesValue = true and + model = "" + ) + } + + predicate sourceStep(SourceOutputNode nodeFrom, Node nodeTo, string model, boolean local) { + exists(SummaryComponentStack sc, SourceElement source | + nodeFrom.isExit(source, sc, model) and + nodeTo = Input2::getSourceNode(source, sc) and + if StepsInput::getSourceNodeEnclosingCallable(source) = getNodeEnclosingCallable(nodeTo) + then local = true + else local = false + ) + } + + predicate sourceLocalStep(SourceOutputNode nodeFrom, Node nodeTo, string model) { + sourceStep(nodeFrom, nodeTo, model, true) + } + + predicate sinkLocalStep(Node nodeFrom, SinkInputNode nodeTo, string model) { + exists(SummaryComponent sc, SinkElement sink | + nodeFrom = Input2::getSinkNode(sink, sc) and + nodeTo.isEntry(sink, sc, model) + ) + } + + /** Holds if there is a local step between data-flow nodes synthesized from a flow summary. */ + predicate summaryLocalStep(Node pred, SummaryNode succ, boolean preservesValue, string model) { + exists(SummaryNode predSummary | + predSummary = StepsInput::getSummaryNode(pred) and + summaryLocalStepImpl(predSummary, succ, preservesValue, model) + ) or - n = summaryNodeOutputState(c, s) and - ( - exists(ContentSet cont | - head = TContentSummaryComponent(cont) and result = getContentType(cont) - ) - or - s.length() = 1 and - exists(ReturnKind rk | - head = TReturnSummaryComponent(rk) and - result = getReturnType(c, rk) - ) - or - exists(ArgumentPosition pos | head = TParameterSummaryComponent(pos) | - result = - getCallbackParameterType(summaryNodeType(summaryNodeInputState(pragma[only_bind_out](c), - s.tail())), pos) - ) - or - exists(SyntheticGlobal sg | - head = TSyntheticGlobalSummaryComponent(sg) and - result = getSyntheticGlobalType(sg) - ) + exists(FlowSummaryCallBase summaryCall, ReturnKind rk, SummarizedCallable sc | + pred = StepsInput::getSourceOutNode(summaryCall, rk) and + summaryCall = getASourceCall(sc) and + summary(sc, SummaryComponentStack::return(rk), _, preservesValue, model) and + succ = TSummaryReturnArgumentNode(summaryCall, rk) ) - ) - or - exists(SourceElement source | - exists(SummaryComponentStack s | - n.(SourceOutputNode).isExit(source, s, _) and - result = getSourceType(source, s) + } + + /** Holds if the value of `succ` is uniquely determined by the value of `pred`. */ + predicate summaryLocalMustFlowStep(SummaryNode pred, SummaryNode succ) { + pred = unique(SummaryNode n1 | summaryLocalStepImpl(n1, succ, true, _)) + } + + /** + * Holds if there is a read step of content `c` from `pred` to `succ`, which + * is synthesized from a flow summary. + */ + predicate summaryReadStep(SummaryNode pred, ContentSet c, SummaryNode succ) { + exists(SummarizedCallable sc, SummaryComponentStack s | + pred = summaryNodeInputState(sc, s.tail()) and + succ = summaryNodeInputState(sc, s) and + SummaryComponent::content(c) = s.head() ) or - exists(SummaryComponentStack s, ContentSet cont | - n = sourceElementOutputState(source, s) and - s.head() = TContentSummaryComponent(cont) and - result = getContentType(cont) + exists(SinkElement sink, SummaryComponentStack s | + pred = sinkElementInputState(sink, s.tail()) and + succ = sinkElementInputState(sink, s) and + SummaryComponent::content(c) = s.head() ) - ) - or - exists(SinkElement sink | - exists(SummaryComponent sc | - n.(SinkInputNode).isEntry(sink, sc, _) and - result = getSinkType(sink, sc) + } + + /** + * Holds if there is a store step of content `c` from `pred` to `succ`, which + * is synthesized from a flow summary. + */ + predicate summaryStoreStep(SummaryNode pred, ContentSet c, SummaryNode succ) { + exists(SummarizedCallable sc, SummaryComponentStack s | + pred = summaryNodeOutputState(sc, s) and + succ = summaryNodeOutputState(sc, s.tail()) and + SummaryComponent::content(c) = s.head() ) or - exists(SummaryComponentStack s, ContentSet cont | - n = sinkElementInputState(sink, s) and - s.head() = TContentSummaryComponent(cont) and - result = getContentType(cont) + exists(SourceElement source, SummaryComponentStack s | + pred = sourceElementOutputState(source, s) and + succ = sourceElementOutputState(source, s.tail()) and + SummaryComponent::content(c) = s.head() ) - ) - } - } + } - signature module StepsInputSig { - /** Gets the summary node represented by data-flow node `n`, if any. */ - SummaryNode getSummaryNode(Node n); + /** + * Holds if there is a jump step from `pred` to `succ`, which is synthesized + * from a flow summary. + */ + predicate summaryJumpStep(SummaryNode pred, SummaryNode succ) { + exists(SummaryComponentStack s | + s = SummaryComponentStack::singleton(SummaryComponent::syntheticGlobal(_)) and + pred = summaryNodeOutputState(_, s) and + succ = summaryNodeInputState(_, s) + ) + } - /** Gets a call that targets summarized callable `sc`. */ - DataFlowCall getACall(SummarizedCallable sc); + predicate sourceJumpStep(SourceOutputNode nodeFrom, Node nodeTo) { + sourceStep(nodeFrom, nodeTo, _, false) + } - /** Gets the out node of kind `rk` for `call`, if any. */ - default Node getSourceOutNode(FlowSummaryCallBase call, ReturnKind rk) { none() } + /** + * Holds if values stored inside content `c` are cleared at `n`. `n` is a + * synthesized summary node, so in order for values to be cleared at calls + * to the relevant method, it is important that flow does not pass over + * the argument, either via use-use flow or def-use flow. + * + * Example: + * + * ``` + * a.b = taint; + * a.clearB(); // assume we have a flow summary for `clearB` that clears `b` on the qualifier + * sink(a.b); + * ``` + * + * In the above, flow should not pass from `a` on the first line (or the second + * line) to `a` on the third line. Instead, there will be synthesized flow from + * `a` on line 2 to the post-update node for `a` on that line (via an intermediate + * node where field `b` is cleared). + */ + predicate summaryClearsContent(SummaryNode n, ContentSet c) { + exists(SummarizedCallable sc, SummaryNodeState state, SummaryComponentStack stack | + n = TSummaryInternalNode(sc, state) and + state.isInputState(sc, stack) and + stack.head() = SummaryComponent::withoutContent(c) + ) + } - /** Gets the enclosing callable of `source`. */ - DataFlowCallable getSourceNodeEnclosingCallable(SourceBase source); + /** + * Holds if the value that is being tracked is expected to be stored inside + * content `c` at `n`. + */ + predicate summaryExpectsContent(SummaryNode n, ContentSet c) { + exists(SummarizedCallable sc, SummaryNodeState state, SummaryComponentStack stack | + n = TSummaryInternalNode(sc, state) and + state.isInputState(sc, stack) and + stack.head() = SummaryComponent::withContent(c) + ) + } - /** - * Gets a data flow node corresponding to the `s` part of `source`. - * - * `s` is typically `ReturnValue` and the result is the node that - * represents the return value of `source`. - */ - Node getSourceNode(SourceBase source, SummaryComponentStack s); + pragma[noinline] + private predicate viableParam( + DataFlowCall call, SummarizedCallable sc, ParameterPosition ppos, SummaryParamNode p + ) { + p = TSummaryParameterNode(sc, ppos) and + call = StepsInput::getACall(sc) + } - /** - * Gets a data flow node corresponding to the `sc` part of `sink`. - * - * `sc` is typically `Argument[i]` and the result is the node that - * represents the `i`th argument of `sink`. - */ - Node getSinkNode(SinkBase sink, SummaryComponent sc); - } + pragma[nomagic] + private SummaryParamNode summaryArgParam( + DataFlowCall call, ArgNode arg, SummarizedCallable sc + ) { + exists(ParameterPosition ppos | + argumentPositionMatch(call, arg, ppos) and + viableParam(call, sc, ppos, result) + ) + } - /** Provides a compilation of flow summaries to atomic data-flow steps. */ - module Steps { - /** - * Holds if there is a local step from `pred` to `succ`, which is synthesized - * from a flow summary. - */ - private predicate summaryLocalStepImpl( - SummaryNode pred, SummaryNode succ, boolean preservesValue, string model - ) { - exists( - SummarizedCallable c, SummaryComponentStack inputContents, - SummaryComponentStack outputContents - | - summary(c, inputContents, outputContents, preservesValue, model) and - pred = summaryNodeInputState(pragma[only_bind_into](c), inputContents) and - succ = summaryNodeOutputState(pragma[only_bind_into](c), outputContents) - | - preservesValue = true + /** + * Holds if `p` can reach `n` in a summarized callable, using only value-preserving + * local steps. `clearsOrExpects` records whether any node on the path from `p` to + * `n` either clears or expects contents. + */ + private predicate paramReachesLocal( + SummaryParamNode p, SummaryNode n, boolean clearsOrExpects + ) { + viableParam(_, _, _, p) and + n = p and + clearsOrExpects = false or - preservesValue = false and not summary(c, inputContents, outputContents, true, _) - ) - or - exists(SummarizedCallable c, SummaryComponentStack s | - pred = summaryNodeInputState(c, s.tail()) and - succ = summaryNodeInputState(c, s) and - s.head() = [SummaryComponent::withContent(_), SummaryComponent::withoutContent(_)] and - preservesValue = true and - model = "" - ) - } - - predicate sourceStep(SourceOutputNode nodeFrom, Node nodeTo, string model, boolean local) { - exists(SummaryComponentStack sc, SourceElement source | - nodeFrom.isExit(source, sc, model) and - nodeTo = StepsInput::getSourceNode(source, sc) and - if StepsInput::getSourceNodeEnclosingCallable(source) = getNodeEnclosingCallable(nodeTo) - then local = true - else local = false - ) - } - - predicate sourceLocalStep(SourceOutputNode nodeFrom, Node nodeTo, string model) { - sourceStep(nodeFrom, nodeTo, model, true) - } + exists(SummaryNode mid, boolean clearsOrExpectsMid | + paramReachesLocal(p, mid, clearsOrExpectsMid) and + summaryLocalStepImpl(mid, n, true, _) and + if + summaryClearsContent(n, _) or + summaryExpectsContent(n, _) + then clearsOrExpects = true + else clearsOrExpects = clearsOrExpectsMid + ) + } - predicate sinkLocalStep(Node nodeFrom, SinkInputNode nodeTo, string model) { - exists(SummaryComponent sc, SinkElement sink | - nodeFrom = StepsInput::getSinkNode(sink, sc) and - nodeTo.isEntry(sink, sc, model) - ) - } + /** + * Holds if use-use flow starting from `arg` should be prohibited. + * + * This is the case when `arg` is the argument of a call that targets a + * flow summary where the corresponding parameter either clears contents + * or expects contents. + */ + pragma[nomagic] + predicate prohibitsUseUseFlow(ArgNode arg, SummarizedCallable sc) { + exists(SummaryParamNode p, ParameterPosition ppos, SummaryNode ret | + paramReachesLocal(p, ret, true) and + p = summaryArgParam(_, arg, sc) and + p = TSummaryParameterNode(_, pragma[only_bind_into](ppos)) and + isParameterPostUpdate(ret, _, pragma[only_bind_into](ppos)) + ) + } - /** Holds if there is a local step between data-flow nodes synthesized from a flow summary. */ - predicate summaryLocalStep(Node pred, SummaryNode succ, boolean preservesValue, string model) { - exists(SummaryNode predSummary | - predSummary = StepsInput::getSummaryNode(pred) and - summaryLocalStepImpl(predSummary, succ, preservesValue, model) - ) - or - exists(FlowSummaryCallBase summaryCall, ReturnKind rk, SummarizedCallable sc | - pred = StepsInput::getSourceOutNode(summaryCall, rk) and - summaryCall = getASourceCall(sc) and - summary(sc, SummaryComponentStack::return(rk), _, preservesValue, model) and - succ = TSummaryReturnArgumentNode(summaryCall, rk) - ) - } + pragma[nomagic] + private predicate summaryReturnNodeExt(SummaryNode ret, ReturnKindExt rk) { + summaryReturnNode(ret, rk.(ValueReturnKind).getKind()) + or + exists(SummaryParamNode p, SummaryNode pre, ParameterPosition pos | + paramReachesLocal(p, pre, _) and + summaryPostUpdateNode(ret, pre) and + p = TSummaryParameterNode(_, pos) and + rk.(ParamUpdateReturnKind).getPosition() = pos + ) + } - /** Holds if the value of `succ` is uniquely determined by the value of `pred`. */ - predicate summaryLocalMustFlowStep(SummaryNode pred, SummaryNode succ) { - pred = unique(SummaryNode n1 | summaryLocalStepImpl(n1, succ, true, _)) - } + bindingset[ret] + private SummaryParamNode summaryArgParamRetOut( + ArgNode arg, SummaryNode ret, OutNodeExt out, SummarizedCallable sc + ) { + exists(DataFlowCall call, ReturnKindExt rk | + result = summaryArgParam(call, arg, sc) and + summaryReturnNodeExt(ret, pragma[only_bind_into](rk)) and + out = getAnOutNodeExt(call, pragma[only_bind_into](rk)) + ) + } - /** - * Holds if there is a read step of content `c` from `pred` to `succ`, which - * is synthesized from a flow summary. - */ - predicate summaryReadStep(SummaryNode pred, ContentSet c, SummaryNode succ) { - exists(SummarizedCallable sc, SummaryComponentStack s | - pred = summaryNodeInputState(sc, s.tail()) and - succ = summaryNodeInputState(sc, s) and - SummaryComponent::content(c) = s.head() - ) - or - exists(SinkElement sink, SummaryComponentStack s | - pred = sinkElementInputState(sink, s.tail()) and - succ = sinkElementInputState(sink, s) and - SummaryComponent::content(c) = s.head() - ) - } + /** + * Holds if `arg` flows to `out` using a simple value-preserving flow + * summary, that is, a flow summary without reads and stores. + * + * NOTE: This step should not be used in global data-flow/taint-tracking, but may + * be useful to include in the exposed local data-flow/taint-tracking relations. + */ + predicate summaryThroughStepValue(ArgNode arg, Node out, SummarizedCallable sc) { + exists(SummaryNode ret | + summaryLocalStepImpl(summaryArgParamRetOut(arg, ret, out, sc), ret, true, _) + ) + } - /** - * Holds if there is a store step of content `c` from `pred` to `succ`, which - * is synthesized from a flow summary. - */ - predicate summaryStoreStep(SummaryNode pred, ContentSet c, SummaryNode succ) { - exists(SummarizedCallable sc, SummaryComponentStack s | - pred = summaryNodeOutputState(sc, s) and - succ = summaryNodeOutputState(sc, s.tail()) and - SummaryComponent::content(c) = s.head() - ) - or - exists(SourceElement source, SummaryComponentStack s | - pred = sourceElementOutputState(source, s) and - succ = sourceElementOutputState(source, s.tail()) and - SummaryComponent::content(c) = s.head() - ) - } + /** + * Holds if `arg` flows to `out` using a simple flow summary involving taint + * step, that is, a flow summary without reads and stores. + * + * NOTE: This step should not be used in global data-flow/taint-tracking, but may + * be useful to include in the exposed local data-flow/taint-tracking relations. + */ + predicate summaryThroughStepTaint(ArgNode arg, Node out, SummarizedCallable sc) { + exists(SummaryNode ret | + summaryLocalStepImpl(summaryArgParamRetOut(arg, ret, out, sc), ret, false, _) + ) + } - /** - * Holds if there is a jump step from `pred` to `succ`, which is synthesized - * from a flow summary. - */ - predicate summaryJumpStep(SummaryNode pred, SummaryNode succ) { - exists(SummaryComponentStack s | - s = SummaryComponentStack::singleton(SummaryComponent::syntheticGlobal(_)) and - pred = summaryNodeOutputState(_, s) and - succ = summaryNodeInputState(_, s) - ) - } + /** + * Holds if there is a read(+taint) of `c` from `arg` to `out` using a + * flow summary. + * + * NOTE: This step should not be used in global data-flow/taint-tracking, but may + * be useful to include in the exposed local data-flow/taint-tracking relations. + */ + predicate summaryGetterStep(ArgNode arg, ContentSet c, Node out, SummarizedCallable sc) { + exists(SummaryNode mid, SummaryNode ret | + summaryReadStep(summaryArgParamRetOut(arg, ret, out, sc), c, mid) and + summaryLocalStepImpl(mid, ret, _, _) + ) + } - predicate sourceJumpStep(SourceOutputNode nodeFrom, Node nodeTo) { - sourceStep(nodeFrom, nodeTo, _, false) + /** + * Holds if there is a (taint+)store of `arg` into content `c` of `out` using a + * flow summary. + * + * NOTE: This step should not be used in global data-flow/taint-tracking, but may + * be useful to include in the exposed local data-flow/taint-tracking relations. + */ + predicate summarySetterStep(ArgNode arg, ContentSet c, Node out, SummarizedCallable sc) { + exists(SummaryNode mid, SummaryNode ret | + summaryLocalStepImpl(summaryArgParamRetOut(arg, ret, out, sc), mid, _, _) and + summaryStoreStep(mid, c, ret) + ) + } } /** - * Holds if values stored inside content `c` are cleared at `n`. `n` is a - * synthesized summary node, so in order for values to be cleared at calls - * to the relevant method, it is important that flow does not pass over - * the argument, either via use-use flow or def-use flow. + * Provides query predicates for rendering the generated data flow graph for + * a summarized callable. * - * Example: - * - * ``` - * a.b = taint; - * a.clearB(); // assume we have a flow summary for `clearB` that clears `b` on the qualifier - * sink(a.b); - * ``` - * - * In the above, flow should not pass from `a` on the first line (or the second - * line) to `a` on the third line. Instead, there will be synthesized flow from - * `a` on line 2 to the post-update node for `a` on that line (via an intermediate - * node where field `b` is cleared). - */ - predicate summaryClearsContent(SummaryNode n, ContentSet c) { - exists(SummarizedCallable sc, SummaryNodeState state, SummaryComponentStack stack | - n = TSummaryInternalNode(sc, state) and - state.isInputState(sc, stack) and - stack.head() = SummaryComponent::withoutContent(c) - ) - } - - /** - * Holds if the value that is being tracked is expected to be stored inside - * content `c` at `n`. + * Import this module into a `.ql` file of `@kind graph` to render the graph. + * The graph is restricted to callables from `RelevantSummarizedCallable`. */ - predicate summaryExpectsContent(SummaryNode n, ContentSet c) { - exists(SummarizedCallable sc, SummaryNodeState state, SummaryComponentStack stack | - n = TSummaryInternalNode(sc, state) and - state.isInputState(sc, stack) and - stack.head() = SummaryComponent::withContent(c) - ) - } + module RenderSummarizedCallable { + private module PrivateSteps = Steps; - pragma[noinline] - private predicate viableParam( - DataFlowCall call, SummarizedCallable sc, ParameterPosition ppos, SummaryParamNode p - ) { - p = TSummaryParameterNode(sc, ppos) and - call = StepsInput::getACall(sc) - } + /** A summarized callable to include in the graph. */ + abstract class RelevantSummarizedCallable instanceof SummarizedCallable { + string toString() { result = super.toString() } + } - pragma[nomagic] - private SummaryParamNode summaryArgParam(DataFlowCall call, ArgNode arg, SummarizedCallable sc) { - exists(ParameterPosition ppos | - argumentPositionMatch(call, arg, ppos) and - viableParam(call, sc, ppos, result) - ) - } + private newtype TNodeOrCall = + MkNode(SummaryNode n) { + exists(RelevantSummarizedCallable c | + n = TSummaryInternalNode(c, _) + or + n = TSummaryParameterNode(c, _) + ) + } or + MkCall(SummaryNode receiver) { + receiver.getSummarizedCallable() instanceof RelevantSummarizedCallable and + ( + callbackInput(_, _, receiver, _) or + callbackOutput(_, _, receiver, _) + ) + } - /** - * Holds if `p` can reach `n` in a summarized callable, using only value-preserving - * local steps. `clearsOrExpects` records whether any node on the path from `p` to - * `n` either clears or expects contents. - */ - private predicate paramReachesLocal(SummaryParamNode p, SummaryNode n, boolean clearsOrExpects) { - viableParam(_, _, _, p) and - n = p and - clearsOrExpects = false - or - exists(SummaryNode mid, boolean clearsOrExpectsMid | - paramReachesLocal(p, mid, clearsOrExpectsMid) and - summaryLocalStepImpl(mid, n, true, _) and - if - summaryClearsContent(n, _) or - summaryExpectsContent(n, _) - then clearsOrExpects = true - else clearsOrExpects = clearsOrExpectsMid - ) - } + private class NodeOrCall extends TNodeOrCall { + SummaryNode asNode() { this = MkNode(result) } - /** - * Holds if use-use flow starting from `arg` should be prohibited. - * - * This is the case when `arg` is the argument of a call that targets a - * flow summary where the corresponding parameter either clears contents - * or expects contents. - */ - pragma[nomagic] - predicate prohibitsUseUseFlow(ArgNode arg, SummarizedCallable sc) { - exists(SummaryParamNode p, ParameterPosition ppos, SummaryNode ret | - paramReachesLocal(p, ret, true) and - p = summaryArgParam(_, arg, sc) and - p = TSummaryParameterNode(_, pragma[only_bind_into](ppos)) and - isParameterPostUpdate(ret, _, pragma[only_bind_into](ppos)) - ) - } + SummaryNode asCallReceiver() { this = MkCall(result) } - pragma[nomagic] - private predicate summaryReturnNodeExt(SummaryNode ret, ReturnKindExt rk) { - summaryReturnNode(ret, rk.(ValueReturnKind).getKind()) - or - exists(SummaryParamNode p, SummaryNode pre, ParameterPosition pos | - paramReachesLocal(p, pre, _) and - summaryPostUpdateNode(ret, pre) and - p = TSummaryParameterNode(_, pos) and - rk.(ParamUpdateReturnKind).getPosition() = pos - ) - } + string toString() { + result = this.asNode().toString() + or + result = this.asCallReceiver().toString() + } - bindingset[ret] - private SummaryParamNode summaryArgParamRetOut( - ArgNode arg, SummaryNode ret, OutNodeExt out, SummarizedCallable sc - ) { - exists(DataFlowCall call, ReturnKindExt rk | - result = summaryArgParam(call, arg, sc) and - summaryReturnNodeExt(ret, pragma[only_bind_into](rk)) and - out = getAnOutNodeExt(call, pragma[only_bind_into](rk)) - ) - } + /** + * Holds if this element is at the specified location. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `filepath`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + filepath = "" and + startline = 0 and + startcolumn = 0 and + endline = 0 and + endcolumn = 0 + } + } - /** - * Holds if `arg` flows to `out` using a simple value-preserving flow - * summary, that is, a flow summary without reads and stores. - * - * NOTE: This step should not be used in global data-flow/taint-tracking, but may - * be useful to include in the exposed local data-flow/taint-tracking relations. - */ - predicate summaryThroughStepValue(ArgNode arg, Node out, SummarizedCallable sc) { - exists(SummaryNode ret | - summaryLocalStepImpl(summaryArgParamRetOut(arg, ret, out, sc), ret, true, _) - ) - } + query predicate nodes(NodeOrCall n, string key, string val) { + key = "semmle.label" and val = n.toString() + } - /** - * Holds if `arg` flows to `out` using a simple flow summary involving taint - * step, that is, a flow summary without reads and stores. - * - * NOTE: This step should not be used in global data-flow/taint-tracking, but may - * be useful to include in the exposed local data-flow/taint-tracking relations. - */ - predicate summaryThroughStepTaint(ArgNode arg, Node out, SummarizedCallable sc) { - exists(SummaryNode ret | - summaryLocalStepImpl(summaryArgParamRetOut(arg, ret, out, sc), ret, false, _) - ) - } + private Node getNode(SummaryNode sn) { sn = StepsInput::getSummaryNode(result) } - /** - * Holds if there is a read(+taint) of `c` from `arg` to `out` using a - * flow summary. - * - * NOTE: This step should not be used in global data-flow/taint-tracking, but may - * be useful to include in the exposed local data-flow/taint-tracking relations. - */ - predicate summaryGetterStep(ArgNode arg, ContentSet c, Node out, SummarizedCallable sc) { - exists(SummaryNode mid, SummaryNode ret | - summaryReadStep(summaryArgParamRetOut(arg, ret, out, sc), c, mid) and - summaryLocalStepImpl(mid, ret, _, _) - ) - } + private predicate edgesComponent(NodeOrCall a, NodeOrCall b, string value) { + exists(boolean preservesValue | + PrivateSteps::summaryLocalStep(getNode(a.asNode()), b.asNode(), preservesValue, _) and + if preservesValue = true then value = "value" else value = "taint" + ) + or + exists(ContentSet c | + PrivateSteps::summaryReadStep(a.asNode(), c, b.asNode()) and + value = "read (" + c + ")" + or + PrivateSteps::summaryStoreStep(a.asNode(), c, b.asNode()) and + value = "store (" + c + ")" + or + PrivateSteps::summaryClearsContent(a.asNode(), c) and + b = a and + value = "clear (" + c + ")" + or + PrivateSteps::summaryExpectsContent(a.asNode(), c) and + b = a and + value = "expect (" + c + ")" + ) + or + summaryPostUpdateNode(b.asNode(), a.asNode()) and + value = "post-update" + or + b.asCallReceiver() = a.asNode() and + value = "receiver" + or + exists(ArgumentPosition pos | + summaryArgumentNode(b.asCallReceiver(), a.asNode(), pos) and + value = "argument (" + pos + ")" + ) + } - /** - * Holds if there is a (taint+)store of `arg` into content `c` of `out` using a - * flow summary. - * - * NOTE: This step should not be used in global data-flow/taint-tracking, but may - * be useful to include in the exposed local data-flow/taint-tracking relations. - */ - predicate summarySetterStep(ArgNode arg, ContentSet c, Node out, SummarizedCallable sc) { - exists(SummaryNode mid, SummaryNode ret | - summaryLocalStepImpl(summaryArgParamRetOut(arg, ret, out, sc), mid, _, _) and - summaryStoreStep(mid, c, ret) - ) + query predicate edges(NodeOrCall a, NodeOrCall b, string key, string value) { + key = "semmle.label" and + value = strictconcat(string s | edgesComponent(a, b, s) | s, " / ") + } } } @@ -2786,111 +2902,5 @@ module Make< ) } } - - /** - * Provides query predicates for rendering the generated data flow graph for - * a summarized callable. - * - * Import this module into a `.ql` file of `@kind graph` to render the graph. - * The graph is restricted to callables from `RelevantSummarizedCallable`. - */ - module RenderSummarizedCallable { - private module PrivateSteps = Private::Steps; - - /** A summarized callable to include in the graph. */ - abstract class RelevantSummarizedCallable instanceof SummarizedCallable { - string toString() { result = super.toString() } - } - - private newtype TNodeOrCall = - MkNode(SummaryNode n) { - exists(RelevantSummarizedCallable c | - n = TSummaryInternalNode(c, _) - or - n = TSummaryParameterNode(c, _) - ) - } or - MkCall(SummaryNode receiver) { - receiver.getSummarizedCallable() instanceof RelevantSummarizedCallable and - ( - callbackInput(_, _, receiver, _) or - callbackOutput(_, _, receiver, _) - ) - } - - private class NodeOrCall extends TNodeOrCall { - SummaryNode asNode() { this = MkNode(result) } - - SummaryNode asCallReceiver() { this = MkCall(result) } - - string toString() { - result = this.asNode().toString() - or - result = this.asCallReceiver().toString() - } - - /** - * Holds if this element is at the specified location. - * The location spans column `startcolumn` of line `startline` to - * column `endcolumn` of line `endline` in file `filepath`. - * For more information, see - * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). - */ - predicate hasLocationInfo( - string filepath, int startline, int startcolumn, int endline, int endcolumn - ) { - filepath = "" and - startline = 0 and - startcolumn = 0 and - endline = 0 and - endcolumn = 0 - } - } - - query predicate nodes(NodeOrCall n, string key, string val) { - key = "semmle.label" and val = n.toString() - } - - private Node getNode(SummaryNode sn) { sn = StepsInput::getSummaryNode(result) } - - private predicate edgesComponent(NodeOrCall a, NodeOrCall b, string value) { - exists(boolean preservesValue | - PrivateSteps::summaryLocalStep(getNode(a.asNode()), b.asNode(), preservesValue, _) and - if preservesValue = true then value = "value" else value = "taint" - ) - or - exists(ContentSet c | - PrivateSteps::summaryReadStep(a.asNode(), c, b.asNode()) and - value = "read (" + c + ")" - or - PrivateSteps::summaryStoreStep(a.asNode(), c, b.asNode()) and - value = "store (" + c + ")" - or - PrivateSteps::summaryClearsContent(a.asNode(), c) and - b = a and - value = "clear (" + c + ")" - or - PrivateSteps::summaryExpectsContent(a.asNode(), c) and - b = a and - value = "expect (" + c + ")" - ) - or - summaryPostUpdateNode(b.asNode(), a.asNode()) and - value = "post-update" - or - b.asCallReceiver() = a.asNode() and - value = "receiver" - or - exists(ArgumentPosition pos | - summaryArgumentNode(b.asCallReceiver(), a.asNode(), pos) and - value = "argument (" + pos + ")" - ) - } - - query predicate edges(NodeOrCall a, NodeOrCall b, string key, string value) { - key = "semmle.label" and - value = strictconcat(string s | edgesComponent(a, b, s) | s, " / ") - } - } } } From d4cefad42fd0c88672af18bcaebdc978a6ba9eac Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 9 Jul 2026 13:14:24 +0200 Subject: [PATCH 0325/2098] FlowSummaryImpl: Embed AST nodes in source/sink summary nodes for better flow paths --- .../dataflow/internal/FlowSummaryImpl.qll | 770 ++++++++++++++---- 1 file changed, 606 insertions(+), 164 deletions(-) diff --git a/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll b/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll index 21c43b03fef1..48ce4f30ca3e 100644 --- a/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll +++ b/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll @@ -19,6 +19,9 @@ signature module InputSig Lang> { class SummarizedCallableBase { bindingset[this] string toString(); + + bindingset[this] + Location getLocation(); } /** Holds if `c` is defined in source code. */ @@ -32,6 +35,8 @@ signature module InputSig Lang> { class SourceBase { bindingset[this] string toString(); + + Location getLocation(); } /** @@ -41,6 +46,8 @@ signature module InputSig Lang> { class SinkBase { bindingset[this] string toString(); + + Location getLocation(); } /** @@ -59,15 +66,15 @@ signature module InputSig Lang> { */ class FlowSummaryCallBase { string toString(); + + Location getLocation(); } /** Gets a call that targets summarized callable `sc`. */ default FlowSummaryCallBase getASourceCall(SummarizedCallableBase sc) { none() } /** Gets the callable corresponding to summarized callable `c`. */ - default Lang::DataFlowCallable getSummarizedCallableAsDataFlowCallable(SummarizedCallableBase c) { - none() - } + Lang::DataFlowCallable getSummarizedCallableAsDataFlowCallable(SummarizedCallableBase c); /** Gets the enclosing callable of `call`. */ default Lang::DataFlowCallable getSourceCallEnclosingCallable(FlowSummaryCallBase call) { none() } @@ -801,6 +808,16 @@ module Make< ) } + private string sourceMarker() { result = "SOURCEMARKER" } + + private string sinkMarker() { result = "SINKMARKER" } + + bindingset[s] + private string addSourceMarker(string s) { result = sourceMarker() + "." + s } + + bindingset[s] + private string addSinkMarker(string s) { result = sinkMarker() + "." + s } + private predicate flowSpec(string spec) { exists(SummarizedCallable c | c.propagatesFlow(spec, _, _, _, _, _) @@ -808,16 +825,126 @@ module Make< c.propagatesFlow(_, spec, _, _, _, _) ) or - isRelevantSource(_, spec, _, _, _) + exists(string sourceSpec | + spec = addSourceMarker(sourceSpec) and + isRelevantSource(_, sourceSpec, _, _, _) + ) or isRelevantBarrier(_, spec, _, _, _) or isRelevantBarrierGuard(_, spec, _, _, _, _) or - isRelevantSink(_, spec, _, _, _) + exists(string sinkSpec | + spec = addSinkMarker(sinkSpec) and + isRelevantSink(_, sinkSpec, _, _, _) + ) + } + + private module Ap = AccessPathSyntax::AccessPath; + + import Ap + + class AccessPath extends Ap::AccessPath { + AccessPathToken getToken(int n) { result = super.getToken(n) } + + int getNumToken() { result = super.getNumToken() } + } + + abstract private class SourceOrSinkAccessPath extends AccessPath { + AccessPathToken getTokenExclMarker(int n) { + result = super.getToken(n + 1) and + n >= 0 + } + + private predicate hasContentAt(int pos) { + exists(External::interpretContent(this.getTokenExclMarker(pos))) + } + + int getFirstContentToken() { + this.hasContentAt(result) and + not this.hasContentAt(result - 1) + } + + override int getNumToken() { + result = super.getNumToken() - 1 // account for the marker + } + } + + /** + * For a source access path like + * + * ``` + * Argument[0].Parameter[1].Field[A].Field[B] + * ``` + * + * we rewrite it into + * + * ``` + * Parameter[1].Argument[0].Field[A].Field[B] + * ``` + * + * which allows us to process the stack top-down, first performing a store into `B`, + * then a store into `A`, and finally a step from a callback argument at position 0 + * to its parameter at position 1. + */ + private class SourceAccessPath extends SourceOrSinkAccessPath, AccessPath { + SourceAccessPath() { AccessPath.super.getToken(0) = sourceMarker() } + + override AccessPathToken getToken(int n) { + not exists(this.getFirstContentToken()) and + exists(int i | + i = this.getNumToken() - 1 and + result = this.getTokenExclMarker(i - n) + ) + or + exists(int first | first = this.getFirstContentToken() | + result = this.getTokenExclMarker(n) and + n >= first + or + result = this.getTokenExclMarker(first - n - 1) and + n >= 0 + ) + } } - import AccessPathSyntax::AccessPath + /** + * For a sink access path like + * + * ``` + * Argument[0].ReturnValue.Field[A].Field[B] + * ``` + * + * we rewrite it into + * + * ``` + * Field[B].Field[A].Argument[0].ReturnValue + * ``` + * + * which allows us to process the stack top-down, first performing a step from the + * returned value of a callback to the place where the callback is supplied as an + * argument at position 0, then a read of `A`, and finally a read of `B`. + */ + private class SinkAccessPath extends SourceOrSinkAccessPath, AccessPath { + SinkAccessPath() { AccessPath.super.getToken(0) = sinkMarker() } + + override AccessPathToken getToken(int n) { + not exists(this.getFirstContentToken()) and + result = this.getTokenExclMarker(n) + or + exists(int first, int num, int i | + first = this.getFirstContentToken() and + num = this.getNumToken() + | + result = this.getTokenExclMarker(first + i) and + i >= 0 and + n = num - first - i - 1 + or + result = this.getTokenExclMarker(i) and + i < first and + n = num - first + i + ) + } + } /** Holds if specification component `token` parses as parameter `pos`. */ predicate parseParam(AccessPathToken token, ArgumentPosition pos) { @@ -1175,7 +1302,7 @@ module Make< ) { exists(string outSpec | isRelevantSource(source, outSpec, kind, _, model) and - External::interpretSpec(outSpec, s) + External::interpretSpec(addSourceMarker(outSpec), s) ) } @@ -1183,22 +1310,19 @@ module Make< private predicate sourceOutputState( SourceElement source, SummaryComponentStack s, string kind, string model ) { - sourceOutputStateEntry(source, s, kind, model) - or - exists(SummaryComponentStack out | - sourceOutputState(source, out, kind, model) and - out.head() = TContentSummaryComponent(_) and - s = out.tail() + exists(SummaryComponentStack entry | + sourceOutputStateEntry(source, entry, kind, model) and + s = entry.drop(_) ) } pragma[nomagic] - private predicate sinkInputStateExit( + private predicate sinkInputStateEntry( SinkElement sink, SummaryComponentStack s, string kind, string model ) { exists(string inSpec | isRelevantSink(sink, inSpec, kind, _, model) and - External::interpretSpec(inSpec, s) + External::interpretSpec(addSinkMarker(inSpec), s) ) } @@ -1206,12 +1330,9 @@ module Make< private predicate sinkInputState( SinkElement sink, SummaryComponentStack s, string kind, string model ) { - sinkInputStateExit(sink, s, kind, model) - or - exists(SummaryComponentStack inp | - sinkInputState(sink, inp, kind, model) and - inp.head() = TContentSummaryComponent(_) and - s = inp.tail() + exists(SummaryComponentStack entry | + sinkInputStateEntry(sink, entry, kind, model) and + s = entry.drop(_) ) } @@ -1299,25 +1420,242 @@ module Make< signature module InputSig2 { /** - * Gets a data flow node corresponding to the `s` part of `source`. + * An element used to represent sources and sinks. + * + * These elements will be embedded into the data flow graph and serve as the + * sources/sinks that the user sees in the output. + * + * For example, if we have a source access path like + * + * ``` + * Argument[0].Parameter[1].Field[A].Field[B] + * ``` + * + * then there should be a reporting element corresponding to the `Argument[0]` part, + * as well as the `Parameter[1]` part, and a flow step will be generated between them. + */ + class SourceSinkReportingElement { + /** Gets the enclosing callable of this element. */ + DataFlowCallable getEnclosingCallable(); + + /** + * Gets a successor element corresponding to the `sc` part of this element. + * + * For example, if `sc` is `Parameter[0]` then the result should be the + * parameter at position 0 of this element (this element may for example be + * a reference to a closure). + */ + bindingset[this, sc] + SourceSinkReportingElement getASuccessor(SummaryComponent sc); + + /** Gets a textual representation of this element. */ + string toString(); + + /** Gets the location of this element. */ + Location getLocation(); + } + + /** + * Gets an element corresponding to the `sc` part of `source`. * - * `s` is typically `ReturnValue` and the result is the node that - * represents the return value of `source`. + * For example, if `sc` is `ReturnValue` then the result should be a + * call to `source`, and if `sc` is `Argument[0]` then the result + * should be an argument at position 0 in a call to `source`. */ - Node getSourceNode(SourceBase source, SummaryComponentStack s); + bindingset[source, sc] + default SourceSinkReportingElement getASourceReportingElement( + SourceBase source, SummaryComponent sc + ) { + none() + } + + /** + * Gets the source data flow node corresponding to `e` and `sc`. + * + * For example, if `sc` is `ReturnValue` then the result should be the node + * that corresponds directly to `e`, and if `sc` is `Argument[0]` then the + * result should be the post-update node whose pre-update node corresponds to + * `e`. + */ + bindingset[e, sc] + default Node getSourceDataFlowNode(SourceSinkReportingElement e, SummaryComponent sc) { + none() + } + + /** + * Gets an element corresponding to the `sc` part of `sink`. + * + * For example, if `sc` is `Argument[0]` then the result should be the argument + * at position 0 in a call to `sink`. + */ + bindingset[sink, sc] + default SourceSinkReportingElement getASinkReportingElement(SinkBase sink, SummaryComponent sc) { + none() + } /** - * Gets a data flow node corresponding to the `sc` part of `sink`. + * Gets the data flow node corresponding to `e` and `sc`. * - * `sc` is typically `Argument[i]` and the result is the node that - * represents the `i`th argument of `sink`. + * For example, if `sc` is `Argument[0]` then the result should be the node + * that corresponds directly to `e`. */ - Node getSinkNode(SinkBase sink, SummaryComponent sc); + bindingset[e, sc] + default Node getSinkDataFlowNode(SourceSinkReportingElement e, SummaryComponent sc) { none() } } module Make2 { private import Input2 + /** + * For a source access path like + * + * ``` + * Argument[0].Parameter[1].Field[A].Field[B] + * ``` + * + * which gets rewritten into + * + * ``` + * Parameter[1].Argument[0].Field[A].Field[B] + * ``` + * + * we first find the entry reporting element based on `Argument[0]`. This entry + * reporting element will also be used for all the stores (done in + * `sourceOutputStoreNode`), but for `Parameter[1]`, we will use the reporting + * element obtained by going to the parameter at position 1 of the entry element + * (done in `sourceOutputStepNode`). + */ + private predicate sourceOutputNodeEntryElement( + SourceElement source, SummaryNodeState state, SourceSinkReportingElement e, string kind, + string model + ) { + exists(SummaryComponentStack entry, SummaryComponentStack stack | + state.isSourceOutputState(source, stack, kind, model) and + // entry = Parameter[1].Argument[0].Field[A].Field[B] + sourceOutputStateEntry(source, entry, kind, model) and + // stack = Parameter[1].Argument[0] + stack = + min(SummaryComponentStack stack0, int i | + stack0 = entry.drop(i) and + not stack0.head() instanceof TContentSummaryComponent + | + stack0 order by i + ) and + e = getASourceReportingElement(source, stack.head()) + ) + } + + private predicate sourceOutputStepNode( + SourceElement source, SummaryNodeState state, SourceSinkReportingElement e, string kind, + string model + ) { + sourceOutputNodeEntryElement(source, state, e, kind, model) + or + sourceOutputNodeStep(source, state, _, e, _, kind, model) + } + + private predicate sourceOutputNodeStep( + SourceElement source, SummaryNodeState state, SummaryNodeState state0, + SourceSinkReportingElement e, SourceSinkReportingElement e0, string kind, string model + ) { + exists(SummaryComponentStack stack, SummaryComponent head, SummaryComponentStack stack0 | + sourceOutputStepNode(source, state0, e0, kind, model) and + state0.isSourceOutputState(source, stack0, kind, model) and + stack = stack0.tail() and + state.isSourceOutputState(source, stack, kind, model) and + head = stack.head() and + e = e0.getASuccessor(head) + ) + } + + private predicate sourceOutputStoreNode( + SourceElement source, SummaryNodeState state, SourceSinkReportingElement e, string kind, + string model + ) { + sourceOutputNodeEntryElement(source, state, e, kind, model) + or + exists(SummaryComponentStack stack, SummaryNodeState state0 | + sourceOutputStoreNode(source, state0, e, kind, model) and + state0.isSourceOutputState(source, stack.tail(), kind, model) and + state.isSourceOutputState(source, stack, kind, model) + ) + } + + /** + * For a sink access path like + * + * ``` + * Argument[0].ReturnValue.Field[A].Field[B] + * ``` + * + * which gets rewritten into + * + * ``` + * Field[B].Field[A].Argument[0].ReturnValue + * ``` + * + * we first find the entry reporting element based on `Argument[0]`. This entry + * reporting element will also be used for all the reads (done in `sinkInputReadNode`), + * but for `ReturnValue`, we will use the reporting element obtained by going to a + * value returned by the entry element (done in `sinkInputStepNode`). + */ + private predicate sinkInputNodeEntryElement( + SinkElement sink, SummaryNodeState state, SourceSinkReportingElement e, string kind, + string model + ) { + exists(SummaryComponentStack entry, SummaryComponentStack stack | + state.isSinkInputState(sink, stack, kind, model) and + // entry = Field[B].Field[A].Argument[0].ReturnValue + sinkInputStateEntry(sink, entry, kind, model) and + // stack = Field[B].Field[A].Argument[0] + stack = + max(SummaryComponentStack stack0, int i | + stack0 = entry.drop(i) and + not stack0.head() instanceof TContentSummaryComponent + | + stack0 order by i + ) and + e = getASinkReportingElement(sink, stack.head()) + ) + } + + private predicate sinkInputStepNode( + SinkElement sink, SummaryNodeState state, SourceSinkReportingElement e, string kind, + string model + ) { + sinkInputNodeEntryElement(sink, state, e, kind, model) + or + sinkInputNodeStep(sink, state, _, e, _, kind, model) + } + + private predicate sinkInputNodeStep( + SinkElement sink, SummaryNodeState state, SummaryNodeState state0, + SourceSinkReportingElement e, SourceSinkReportingElement e0, string kind, string model + ) { + exists(SummaryComponentStack stack, SummaryComponent head, SummaryComponentStack stack0 | + sinkInputStepNode(sink, state0, e0, kind, model) and + state0.isSinkInputState(sink, stack0, kind, model) and + stack.tail() = stack0 and + state.isSinkInputState(sink, stack, kind, model) and + head = stack.head() and + e = e0.getASuccessor(head) + ) + } + + private predicate sinkInputReadNode( + SinkElement sink, SummaryNodeState state, SourceSinkReportingElement e, string kind, + string model + ) { + sinkInputNodeEntryElement(sink, state, e, kind, model) + or + exists(SummaryComponentStack stack, SummaryNodeState state0, SummaryComponentStack stack0 | + sinkInputReadNode(sink, state0, e, kind, model) and + state0.isSinkInputState(sink, stack0, kind, model) and + state.isSinkInputState(sink, stack, kind, model) and + stack = stack0.tail() + ) + } + private newtype TSummaryNode = TSummaryInternalNode(SummarizedCallable c, SummaryNodeState state) { summaryNodeRange(c, state) @@ -1331,11 +1669,21 @@ module Make< relevantFlowSummaryPosition(sc, rk) ) } or - TSourceOutputNode(SourceElement source, SummaryNodeState state, string kind, string model) { - state.isSourceOutputState(source, _, kind, model) + TSourceOutputNode( + SourceElement source, SummaryNodeState state, SourceSinkReportingElement e, string kind, + string model + ) { + sourceOutputStepNode(source, state, e, kind, model) + or + sourceOutputStoreNode(source, state, e, kind, model) } or - TSinkInputNode(SinkElement sink, SummaryNodeState state, string kind, string model) { - state.isSinkInputState(sink, _, kind, model) + TSinkInputNode( + SinkElement sink, SummaryNodeState state, SourceSinkReportingElement e, string kind, + string model + ) { + sinkInputStepNode(sink, state, e, kind, model) + or + sinkInputReadNode(sink, state, e, kind, model) } abstract class SummaryNode extends TSummaryNode { @@ -1347,6 +1695,12 @@ module Make< abstract SinkElement getSinkElement(); + abstract SourceSinkReportingElement getSourceSinkReportingElement(); + + abstract DataFlowCallable getEnclosingCallable(); + + abstract Location getLocation(); + predicate isHidden() { any() } } @@ -1363,6 +1717,14 @@ module Make< override SourceElement getSourceElement() { none() } override SinkElement getSinkElement() { none() } + + override SourceSinkReportingElement getSourceSinkReportingElement() { none() } + + override DataFlowCallable getEnclosingCallable() { + result = getSummarizedCallableAsDataFlowCallable(c) + } + + override Location getLocation() { result = c.getLocation() } } private class SummaryParamNode extends SummaryNode, TSummaryParameterNode { @@ -1378,6 +1740,14 @@ module Make< override SourceElement getSourceElement() { none() } override SinkElement getSinkElement() { none() } + + override SourceSinkReportingElement getSourceSinkReportingElement() { none() } + + override DataFlowCallable getEnclosingCallable() { + result = getSummarizedCallableAsDataFlowCallable(c) + } + + override Location getLocation() { result = c.getLocation() } } private class SummaryReturnArgumentNode extends SummaryNode, TSummaryReturnArgumentNode { @@ -1393,6 +1763,14 @@ module Make< override SourceElement getSourceElement() { none() } override SinkElement getSinkElement() { none() } + + override SourceSinkReportingElement getSourceSinkReportingElement() { none() } + + override DataFlowCallable getEnclosingCallable() { + result = getSourceCallEnclosingCallable(call) + } + + override Location getLocation() { result = call.getLocation() } } /** @@ -1404,55 +1782,61 @@ module Make< result = TSummaryReturnArgumentNode(call, rk) } - /** Gets the enclosing callable for summary node `sn`. */ - DataFlowCallable getEnclosingCallable(SummaryNode sn) { - result = getSummarizedCallableAsDataFlowCallable(sn.getSummarizedCallable()) - or - exists(FlowSummaryCallBase call | - sn = TSummaryReturnArgumentNode(call, _) and - result = getSourceCallEnclosingCallable(call) - ) - } - class SourceOutputNode extends SummaryNode, TSourceOutputNode { private SourceElement source_; private SummaryNodeState state_; + private SourceSinkReportingElement e_; private string kind_; private string model_; - SourceOutputNode() { this = TSourceOutputNode(source_, state_, kind_, model_) } + SourceOutputNode() { this = TSourceOutputNode(source_, state_, e_, kind_, model_) } /** - * Holds if this node is an entry node, i.e. before any stores have been performed. + * Holds if this node is an entry node, i.e. before any stores or steps have been + * performed. * * This node should be used as the actual source node in data flow configurations. */ predicate isEntry(string kind, string model) { model = model_ and - exists(SummaryComponentStack out | - sourceOutputStateEntry(source_, out, kind, model_) and - state_.isSourceOutputState(source_, out, kind, model_) + exists(SummaryComponentStack entry | + state_.isSourceOutputState(source_, entry, kind, model_) and + sourceOutputStateEntry(source_, entry, kind, model_) ) } /** - * Holds if this node is an exit node, i.e. after all stores have been performed. + * Holds if this node is an exit node, i.e. after all stores and steps have been + * performed. * - * A local flow step should be added from this node to a data flow node representing - * `s` inside `source`. + * A flow step is added from this node to a data flow node representing + * `s` inside `source`, using `getSourceDataFlowNode`. */ - predicate isExit(SourceElement source, SummaryComponentStack s, string model) { + predicate isExit( + SourceElement source, SummaryComponent sc, SourceSinkReportingElement e, string model + ) { source = source_ and model = model_ and - state_.isSourceOutputState(source, s, _, model) + state_.isSourceOutputState(source, TSingletonSummaryComponentStack(sc), _, model) and + e = e_ } - override predicate isHidden() { not this.isEntry(_, _) } + override predicate isHidden() { + not this.isEntry(_, _) and + ( + exists(SummaryComponentStack stack | + state_.isSourceOutputState(_, stack, _, _) and + stack.head() instanceof TContentSummaryComponent + ) + or + this.isExit(_, _, _, _) + ) + } override string toString() { - if this.isEntry(_, _) - then result = source_.toString() - else result = "[source] " + state_ + " at " + source_ + if this.isHidden() + then result = "[source] " + state_ + " at " + e_ + else result = e_.toString() } override SummarizedCallable getSummarizedCallable() { none() } @@ -1460,48 +1844,71 @@ module Make< override SourceElement getSourceElement() { result = source_ } override SinkElement getSinkElement() { none() } + + override SourceSinkReportingElement getSourceSinkReportingElement() { result = e_ } + + override DataFlowCallable getEnclosingCallable() { result = e_.getEnclosingCallable() } + + override Location getLocation() { result = e_.getLocation() } } class SinkInputNode extends SummaryNode, TSinkInputNode { private SinkElement sink_; private SummaryNodeState state_; + private SourceSinkReportingElement e_; private string kind_; private string model_; - SinkInputNode() { this = TSinkInputNode(sink_, state_, kind_, model_) } + SinkInputNode() { this = TSinkInputNode(sink_, state_, e_, kind_, model_) } /** - * Holds if this node is an entry node, i.e. before any reads have been performed. + * Holds if this node is an entry node, i.e. before any reads and steps have been + * performed. * - * A local flow step should be added to this node from a data flow node representing - * `sc` inside `sink`. + * A flow step is added to this node from a data flow node representing + * `sc` inside `sink`, using `getSinkDataFlowNode`. */ - predicate isEntry(SinkElement sink, SummaryComponent sc, string model) { + predicate isEntry( + SinkElement sink, SummaryComponent sc, SourceSinkReportingElement e, string model + ) { sink = sink_ and model = model_ and - state_.isSinkInputState(sink, TSingletonSummaryComponentStack(sc), _, model) + e = e_ and + exists(SummaryComponentStack entry | + sinkInputStateEntry(sink, entry, kind_, model) and + state_.isSinkInputState(sink, entry, _, model) and + sc = entry.head() + ) } /** - * Holds if this node is an exit node, i.e. after all reads have been performed. + * Holds if this node is an exit node, i.e. after all reads and steps have been + * performed. * * This node should be used as the actual sink node in data flow configurations. */ predicate isExit(string kind, string model) { kind = kind_ and model = model_ and - exists(SummaryComponentStack inp | - sinkInputStateExit(sink_, inp, kind, model_) and - state_.isSinkInputState(sink_, inp, kind, model_) - ) + state_.isSinkInputState(sink_, TSingletonSummaryComponentStack(_), kind, model_) } - override predicate isHidden() { not this.isExit(_, _) } + override predicate isHidden() { + not this.isExit(_, _) and + ( + exists(SummaryComponentStack stack | + state_.isSourceOutputState(_, stack, _, _) and + stack.head() instanceof TContentSummaryComponent + ) + or + this.isEntry(_, _, _, _) + ) + } override string toString() { - if this.isExit(_, _) - then result = sink_.toString() - else result = "[sink] " + state_ + " at " + sink_ + if this.isHidden() + then result = "[sink] " + state_ + " at " + e_ + else result = e_.toString() } override SummarizedCallable getSummarizedCallable() { none() } @@ -1509,6 +1916,12 @@ module Make< override SourceElement getSourceElement() { none() } override SinkElement getSinkElement() { result = sink_ } + + override SourceSinkReportingElement getSourceSinkReportingElement() { result = e_ } + + override DataFlowCallable getEnclosingCallable() { result = e_.getEnclosingCallable() } + + override Location getLocation() { result = e_.getLocation() } } /** @@ -1560,19 +1973,17 @@ module Make< } pragma[noinline] - private SummaryNode sourceElementOutputState(SourceElement source, SummaryComponentStack s) { - exists(SummaryNodeState state, string kind, string model | - state.isSourceOutputState(source, s, kind, model) and - result = TSourceOutputNode(source, state, kind, model) - ) + private SummaryNode sourceElementOutputState( + SourceElement source, SourceSinkReportingElement e, SummaryComponentStack s + ) { + result = TSourceOutputNode(source, TSourceOutputState(s), e, _, _) } pragma[noinline] - private SummaryNode sinkElementInputState(SinkElement sink, SummaryComponentStack s) { - exists(SummaryNodeState state, string kind, string model | - state.isSinkInputState(sink, s, kind, model) and - result = TSinkInputNode(sink, state, kind, model) - ) + private SummaryNode sinkElementInputState( + SinkElement sink, SourceSinkReportingElement e, SummaryComponentStack s + ) { + result = TSinkInputNode(sink, TSinkInputState(s), e, _, _) } /** @@ -1727,9 +2138,7 @@ module Make< DataFlowType getSyntheticGlobalType(SyntheticGlobal sg); - DataFlowType getSourceType(SourceBase source, SummaryComponentStack sc); - - DataFlowType getSinkType(SinkBase sink, SummaryComponent sc); + DataFlowType getSourceSinkType(SourceSinkReportingElement e); } /** @@ -1809,27 +2218,25 @@ module Make< ) ) or - exists(SourceElement source | - exists(SummaryComponentStack s | - n.(SourceOutputNode).isExit(source, s, _) and - result = getSourceType(source, s) - ) + exists(SourceElement source, SourceSinkReportingElement e | + n.(SourceOutputNode).isExit(source, _, e, _) and + result = getSourceSinkType(e) or exists(SummaryComponentStack s, ContentSet cont | - n = sourceElementOutputState(source, s) and + n = sourceElementOutputState(source, _, s) and s.head() = TContentSummaryComponent(cont) and result = getContentType(cont) ) ) or exists(SinkElement sink | - exists(SummaryComponent sc | - n.(SinkInputNode).isEntry(sink, sc, _) and - result = getSinkType(sink, sc) + exists(SourceSinkReportingElement e | + n.(SinkInputNode).isEntry(sink, _, e, _) and + result = getSourceSinkType(e) ) or exists(SummaryComponentStack s, ContentSet cont | - n = sinkElementInputState(sink, s) and + n = sinkElementInputState(sink, _, s) and s.head() = TContentSummaryComponent(cont) and result = getContentType(cont) ) @@ -1846,13 +2253,30 @@ module Make< /** Gets the out node of kind `rk` for `call`, if any. */ default Node getSourceOutNode(FlowSummaryCallBase call, ReturnKind rk) { none() } - - /** Gets the enclosing callable of `source`. */ - DataFlowCallable getSourceNodeEnclosingCallable(SourceBase source); } /** Provides a compilation of flow summaries to atomic data-flow steps. */ module Steps { + private predicate sourceExitStep(SourceOutputNode nodeFrom, Node nodeTo, boolean local) { + exists(SummaryComponent sc, SourceSinkReportingElement e | + nodeFrom.isExit(_, sc, e, _) and + nodeTo = getSourceDataFlowNode(e, sc) and + if e.getEnclosingCallable() = getNodeEnclosingCallable(nodeTo) + then local = true + else local = false + ) + } + + private predicate sinkEntryStep(Node nodeFrom, SinkInputNode nodeTo, boolean local) { + exists(SummaryComponent sc, SourceSinkReportingElement e | + nodeTo.isEntry(_, sc, e, _) and + nodeFrom = getSinkDataFlowNode(e, sc) and + if e.getEnclosingCallable() = getNodeEnclosingCallable(nodeFrom) + then local = true + else local = false + ) + } + /** * Holds if there is a local step from `pred` to `succ`, which is synthesized * from a flow summary. @@ -1882,39 +2306,29 @@ module Make< ) } - predicate sourceStep(SourceOutputNode nodeFrom, Node nodeTo, string model, boolean local) { - exists(SummaryComponentStack sc, SourceElement source | - nodeFrom.isExit(source, sc, model) and - nodeTo = Input2::getSourceNode(source, sc) and - if StepsInput::getSourceNodeEnclosingCallable(source) = getNodeEnclosingCallable(nodeTo) - then local = true - else local = false - ) - } - - predicate sourceLocalStep(SourceOutputNode nodeFrom, Node nodeTo, string model) { - sourceStep(nodeFrom, nodeTo, model, true) - } - - predicate sinkLocalStep(Node nodeFrom, SinkInputNode nodeTo, string model) { - exists(SummaryComponent sc, SinkElement sink | - nodeFrom = Input2::getSinkNode(sink, sc) and - nodeTo.isEntry(sink, sc, model) - ) - } - /** Holds if there is a local step between data-flow nodes synthesized from a flow summary. */ - predicate summaryLocalStep(Node pred, SummaryNode succ, boolean preservesValue, string model) { - exists(SummaryNode predSummary | - predSummary = StepsInput::getSummaryNode(pred) and - summaryLocalStepImpl(predSummary, succ, preservesValue, model) + predicate summaryLocalStep(Node pred, Node succ, boolean preservesValue, string model) { + exists(SummaryNode predSummary | predSummary = StepsInput::getSummaryNode(pred) | + summaryLocalStepImpl(predSummary, StepsInput::getSummaryNode(succ), preservesValue, + model) + or + sourceExitStep(predSummary, succ, true) and + preservesValue = true and + model = "" + ) + or + exists(SummaryNode succSummary | + succSummary = StepsInput::getSummaryNode(succ) and + sinkEntryStep(pred, succSummary, true) and + preservesValue = true and + model = "" ) or exists(FlowSummaryCallBase summaryCall, ReturnKind rk, SummarizedCallable sc | pred = StepsInput::getSourceOutNode(summaryCall, rk) and summaryCall = getASourceCall(sc) and summary(sc, SummaryComponentStack::return(rk), _, preservesValue, model) and - succ = TSummaryReturnArgumentNode(summaryCall, rk) + StepsInput::getSummaryNode(succ) = TSummaryReturnArgumentNode(summaryCall, rk) ) } @@ -1925,37 +2339,38 @@ module Make< /** * Holds if there is a read step of content `c` from `pred` to `succ`, which - * is synthesized from a flow summary. + * is synthesized from a flow summary or a sink specification. */ predicate summaryReadStep(SummaryNode pred, ContentSet c, SummaryNode succ) { - exists(SummarizedCallable sc, SummaryComponentStack s | - pred = summaryNodeInputState(sc, s.tail()) and - succ = summaryNodeInputState(sc, s) and - SummaryComponent::content(c) = s.head() - ) - or - exists(SinkElement sink, SummaryComponentStack s | - pred = sinkElementInputState(sink, s.tail()) and - succ = sinkElementInputState(sink, s) and - SummaryComponent::content(c) = s.head() + exists(SummaryComponentStack stack | SummaryComponent::content(c) = stack.head() | + exists(SummarizedCallable sc | + pred = summaryNodeInputState(sc, stack.tail()) and + succ = summaryNodeInputState(sc, stack) + ) + or + exists(SinkElement sink, SourceSinkReportingElement e, SummaryComponentStack stack0 | + pred = sinkElementInputState(sink, e, stack0) and + stack = stack0.tail() and + succ = sinkElementInputState(sink, e, stack) + ) ) } /** * Holds if there is a store step of content `c` from `pred` to `succ`, which - * is synthesized from a flow summary. + * is synthesized from a flow summary or a source specification. */ predicate summaryStoreStep(SummaryNode pred, ContentSet c, SummaryNode succ) { - exists(SummarizedCallable sc, SummaryComponentStack s | - pred = summaryNodeOutputState(sc, s) and - succ = summaryNodeOutputState(sc, s.tail()) and - SummaryComponent::content(c) = s.head() - ) - or - exists(SourceElement source, SummaryComponentStack s | - pred = sourceElementOutputState(source, s) and - succ = sourceElementOutputState(source, s.tail()) and - SummaryComponent::content(c) = s.head() + exists(SummaryComponentStack stack | SummaryComponent::content(c) = stack.head() | + exists(SummarizedCallable sc | + pred = summaryNodeOutputState(sc, stack) and + succ = summaryNodeOutputState(sc, stack.tail()) + ) + or + exists(SourceElement source, SourceSinkReportingElement e | + pred = sourceElementOutputState(source, e, stack) and + succ = sourceElementOutputState(source, e, stack.tail()) + ) ) } @@ -1963,18 +2378,44 @@ module Make< * Holds if there is a jump step from `pred` to `succ`, which is synthesized * from a flow summary. */ - predicate summaryJumpStep(SummaryNode pred, SummaryNode succ) { - exists(SummaryComponentStack s | - s = SummaryComponentStack::singleton(SummaryComponent::syntheticGlobal(_)) and - pred = summaryNodeOutputState(_, s) and - succ = summaryNodeInputState(_, s) + predicate summaryJumpStep(Node pred, Node succ) { + exists(SummaryNode predSummary | StepsInput::getSummaryNode(pred) = predSummary | + exists(SummaryNode succSummary | StepsInput::getSummaryNode(succ) = succSummary | + exists(SummaryComponentStack s | + s = SummaryComponentStack::singleton(SummaryComponent::syntheticGlobal(_)) and + predSummary = summaryNodeOutputState(_, s) and + succSummary = summaryNodeInputState(_, s) + ) + or + // We model all non-store steps as jumps in order to ensure that they are not stepped + // over in the path graph. + exists( + SourceElement source, string kind, SummaryNodeState state, SummaryNodeState state0, + SourceSinkReportingElement e, SourceSinkReportingElement e0, string model + | + sourceOutputNodeStep(source, state, state0, e, e0, kind, model) and + predSummary = TSourceOutputNode(source, state0, e0, kind, model) and + succSummary = TSourceOutputNode(source, state, e, kind, model) + ) + or + // We model all non-read steps as jumps in order to ensure that they are not stepped + // over in the path graph. + exists( + SinkElement sink, string kind, SummaryNodeState state, SummaryNodeState state0, + SourceSinkReportingElement e, SourceSinkReportingElement e0, string model + | + sinkInputNodeStep(sink, state, state0, e, e0, kind, model) and + predSummary = TSinkInputNode(sink, state, e, kind, model) and + succSummary = TSinkInputNode(sink, state0, e0, kind, model) + ) + ) + or + sourceExitStep(StepsInput::getSummaryNode(pred), succ, false) + or + sinkEntryStep(pred, StepsInput::getSummaryNode(succ), false) ) } - predicate sourceJumpStep(SourceOutputNode nodeFrom, Node nodeTo) { - sourceStep(nodeFrom, nodeTo, _, false) - } - /** * Holds if values stored inside content `c` are cleared at `n`. `n` is a * synthesized summary node, so in order for values to be cleared at calls @@ -2218,7 +2659,8 @@ module Make< private predicate edgesComponent(NodeOrCall a, NodeOrCall b, string value) { exists(boolean preservesValue | - PrivateSteps::summaryLocalStep(getNode(a.asNode()), b.asNode(), preservesValue, _) and + PrivateSteps::summaryLocalStep(getNode(a.asNode()), getNode(b.asNode()), preservesValue, + _) and if preservesValue = true then value = "value" else value = "taint" ) or @@ -2284,15 +2726,15 @@ module Make< token = encodeWithContent(result, "") } + ContentSet interpretContent(AccessPathToken token) { + result = decodeContent(token) + or + not exists(decodeContent(token)) and + result = decodeUnknownContent(token) + } + private SummaryComponent interpretComponent(AccessPathToken token) { - exists(ContentSet c | - c = decodeContent(token) - or - not exists(decodeContent(token)) and - c = decodeUnknownContent(token) - | - result = SummaryComponent::content(c) - ) + result = SummaryComponent::content(interpretContent(token)) or exists(ParameterPosition pos | parseArg(token, pos) and From 267053666eafecf654d9c2761ef1be10dcd8cd60 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 9 Jul 2026 22:08:34 +0200 Subject: [PATCH 0326/2098] Rust: Adapt to FlowSummaryImpl changes --- .../dataflow/internal/DataFlowConsistency.qll | 2 +- .../rust/dataflow/internal/DataFlowImpl.qll | 38 +--- .../dataflow/internal/FlowSummaryImpl.qll | 162 ++++++++++-------- .../rust/dataflow/internal/ModelsAsData.qll | 8 +- .../codeql/rust/dataflow/internal/Node.qll | 19 +- .../dataflow/internal/TaintTrackingImpl.qll | 3 +- .../DisabledCertificateCheckExtensions.qll | 9 +- .../HardcodedCryptographicValueExtensions.qll | 9 +- .../WeakSensitiveDataHashingExtensions.qll | 10 +- rust/ql/lib/utils/test/InlineFlowTest.qll | 23 ++- .../security/CWE-022/TaintedPathSinks.ql | 75 ++++---- 11 files changed, 184 insertions(+), 174 deletions(-) diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowConsistency.qll b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowConsistency.qll index ca6c0747ba3a..a21552cb3355 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowConsistency.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowConsistency.qll @@ -21,7 +21,7 @@ private module Input implements InputSig { or n.(Node::PostUpdateNode).getPreUpdateNode().asExpr() = getPostUpdateReverseStep(_, _) or - FlowSummaryImpl::Private::Steps::sourceLocalStep(_, n, _) + FlowSummaryImpl::Private::Steps::summaryLocalStep(_, n, _, _) } predicate missingLocationExclude(RustDataFlow::Node n) { not exists(n.asExpr().getLocation()) } diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll index 8793bf7a6272..cb73c7f715d9 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll @@ -179,17 +179,7 @@ Expr getPostUpdateReverseStep(Expr e, boolean preservesValue) { module LocalFlow { predicate flowSummaryLocalStep(Node nodeFrom, Node nodeTo, string model) { - exists(FlowSummaryImpl::Public::SummarizedCallable c | - FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom, - nodeTo.(FlowSummaryNode).getSummaryNode(), true, model) and - c = nodeFrom.(FlowSummaryNode).getSummarizedCallable() - ) - or - FlowSummaryImpl::Private::Steps::sourceLocalStep(nodeFrom.(FlowSummaryNode).getSummaryNode(), - nodeTo, model) - or - FlowSummaryImpl::Private::Steps::sinkLocalStep(nodeFrom, - nodeTo.(FlowSummaryNode).getSummaryNode(), model) + FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom, nodeTo, true, model) } pragma[nomagic] @@ -448,6 +438,8 @@ module RustDataFlowGen implements InputSig or result = ps.getSelfParam() and this.isSelf() } + + ParamBase getParameter(Callable c) { result = this.getParameterIn(c.getParamList()) } } /** @@ -510,10 +502,6 @@ module RustDataFlowGen implements InputSig node.asExpr() = stripParens(match.getScrutinee()) or node.asPat() = match.getAnArm().getPat() ) - or - FlowSummaryImpl::Private::Steps::sourceLocalStep(_, node, _) - or - FlowSummaryImpl::Private::Steps::sinkLocalStep(node, _, _) } class DataFlowExpr = Expr; @@ -652,10 +640,7 @@ module RustDataFlowGen implements InputSig * variable. */ predicate jumpStep(Node node1, Node node2) { - FlowSummaryImpl::Private::Steps::summaryJumpStep(node1.(FlowSummaryNode).getSummaryNode(), - node2.(FlowSummaryNode).getSummaryNode()) - or - FlowSummaryImpl::Private::Steps::sourceJumpStep(node1.(FlowSummaryNode).getSummaryNode(), node2) + FlowSummaryImpl::Private::Steps::summaryJumpStep(node1, node2) or exists(Const c | node1.asExpr() = c.getBody() and @@ -1289,10 +1274,10 @@ private module Cached { FlowSummaryImpl::Public::AcceptingValue acceptingValue, string kind, string model | FlowSummaryImpl::Private::barrierGuardSpec(b, stack, acceptingValue, kind, model) and - e = FlowSummaryImpl::StepsInput::getSinkNode(b, stack.headOfSingleton()).asExpr() and + e = FlowSummaryImpl::Input2::getASinkReportingElement(b, stack.headOfSingleton()) and kmp = TMkPair(kind, model) and gv = convertAcceptingValue(acceptingValue) and - g = b.getCall() + g.(Call).getResolvedTarget() = b ) } @@ -1303,15 +1288,8 @@ private module Cached { FlowSummaryImpl::Public::BarrierElement b, FlowSummaryImpl::Private::SummaryComponentStack stack | - FlowSummaryImpl::Private::barrierSpec(b, stack, kind, model) - | - n = FlowSummaryImpl::StepsInput::getSourceNode(b, stack, false) - or - // For barriers like `Argument[0]` we want to target the pre-update node - n = - FlowSummaryImpl::StepsInput::getSourceNode(b, stack, true) - .(PostUpdateNode) - .getPreUpdateNode() + FlowSummaryImpl::Private::barrierSpec(b, stack, kind, model) and + n.asExpr() = FlowSummaryImpl::Input2::getASourceReportingElement(b, stack.headOfSingleton()) ) or ParameterizedBarrierGuard::getABarrierNode(TMkPair(kind, diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/FlowSummaryImpl.qll b/rust/ql/lib/codeql/rust/dataflow/internal/FlowSummaryImpl.qll index d9104da11ad5..10375c2e180a 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/FlowSummaryImpl.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/FlowSummaryImpl.qll @@ -33,23 +33,19 @@ module Input implements InputSig { class SummarizedCallableBase = Function; - class FlowSummaryCallBase = Void; + class FlowSummaryCallBase extends Void { + Location getLocation() { none() } + } predicate callableFromSource(SummarizedCallableBase c) { c.fromSource() } - abstract private class SourceSinkBase extends AstNode { - /** Gets the associated call. */ - abstract Call getCall(); - - /** Holds if the associated call resolves to `path`. */ - final predicate callResolvesTo(string path) { - path = this.getCall().getResolvedTarget().getCanonicalPath() - } + DataFlowCallable getSummarizedCallableAsDataFlowCallable(SummarizedCallableBase c) { + result.asSummarizedCallable() = c } - abstract class SourceBase extends SourceSinkBase { } + class SourceBase = Function; - abstract class SinkBase extends SourceSinkBase { } + class SinkBase = Function; predicate neutralElement( Input::SummarizedCallableBase c, string kind, string provenance, boolean isExact @@ -61,22 +57,6 @@ module Input implements InputSig { ) } - private class CallExprFunction extends SourceBase, SinkBase { - private CallExpr call; - - CallExprFunction() { this = call.getFunction() } - - override Call getCall() { result = call } - } - - private class MethodCallExprNameRef extends SourceBase, SinkBase { - private MethodCallExpr call; - - MethodCallExprNameRef() { this = call.getIdentifier() } - - override MethodCallExpr getCall() { result = call } - } - RustDataFlow::ArgumentPosition callbackSelfParameterPosition() { result.isClosureSelf() } ReturnKind getStandardReturnValueKind() { result = TNormalReturnKind() } @@ -147,75 +127,109 @@ module Input implements InputSig { private import Make as Impl -module StepsInput implements Impl::Private::StepsInputSig { - Impl::Private::SummaryNode getSummaryNode(RustDataFlow::Node n) { - result = n.(FlowSummaryNode).getSummaryNode() - } +/** Gets the argument of `call` described by `sc`, if any. */ +private Expr getArg(Call call, Impl::Private::SummaryComponent sc) { + exists(RustDataFlow::ArgumentPosition pos | + sc = Impl::Private::SummaryComponent::argument(pos) and + result = pos.getArgument(call) + ) +} - DataFlowCall getACall(Public::SummarizedCallable sc) { result.asCall().getStaticTarget() = sc } +/** Get the callable that `expr` refers to. */ +private Callable getCallable(Expr expr) { + result = resolvePath(expr.(PathExpr).getPath()).(Function) + or + result = expr.(ClosureExpr) + or + // The expression is an SSA read of an assignment of a closure + exists(Ssa::Definition def | + def.getARead() = expr and + def.getAnUltimateDefinition().(Ssa::WriteDefinition).assigns(result.(ClosureExpr)) + ) +} - /** Gets the argument of `source` described by `sc`, if any. */ - private Expr getSourceNodeArgument(Input::SourceBase source, Impl::Private::SummaryComponent sc) { - exists(RustDataFlow::ArgumentPosition pos | - sc = Impl::Private::SummaryComponent::argument(pos) and - result = pos.getArgument(source.getCall()) - ) +module Input2 implements Impl::Private::InputSig2 { + private import codeql.rust.controlflow.CfgNodes + + class SourceSinkReportingElement extends AstNode { + DataFlowCallable getEnclosingCallable() { result.asCfgScope() = this.getEnclosingCfgScope() } + + SourceSinkReportingElement getASuccessor(Impl::Private::SummaryComponent sc) { + exists(RustDataFlow::ArgumentPosition pos | + sc = Impl::Private::SummaryComponent::parameter(pos) and + result = pos.getParameter(getCallable(this)) + ) + or + exists(Callable c | + sc = Impl::Private::SummaryComponent::return(_) and + c = getCallable(this) and + result.getACfgNode().getASuccessor() instanceof AnnotatedExitCfgNode and + result.getEnclosingCfgScope() = c + ) + } } - /** Get the callable that `expr` refers to. */ - private Callable getCallable(Expr expr) { - result = resolvePath(expr.(PathExpr).getPath()).(Function) - or - result = expr.(ClosureExpr) + SourceSinkReportingElement getASourceReportingElement( + Input::SourceBase source, Impl::Private::SummaryComponent sc + ) { + exists(Call call | call.getResolvedTarget() = source | + sc = Impl::Private::SummaryComponent::return(_) and + result = call + or + result = getArg(call, sc) + ) or - // The expression is an SSA read of an assignment of a closure - exists(Ssa::Definition def | - def.getARead() = expr and - def.getAnUltimateDefinition().(Ssa::WriteDefinition).assigns(result.(ClosureExpr)) + exists(RustDataFlow::ArgumentPosition pos | + sc = Impl::Private::SummaryComponent::parameter(pos) + | + exists(Function f | + f = source + or + f.implements(source) + | + result = pos.getParameter(f) + ) ) } - RustDataFlow::DataFlowCallable getSourceNodeEnclosingCallable(Input::SourceBase source) { - result.asCfgScope() = source.getEnclosingCfgScope() + bindingset[e, sc] + NodePublic getSourceDataFlowNode(SourceSinkReportingElement e, Impl::Private::SummaryComponent sc) { + if sc = Impl::Private::SummaryComponent::argument(_) + then result.(PostUpdateNode).getPreUpdateNode().(Node).getAstNode() = e + else result.(Node).getAstNode() = e } - additional RustDataFlow::Node getSourceNode( - Input::SourceBase source, Impl::Private::SummaryComponentStack s, boolean isArgPostUpdate + SourceSinkReportingElement getASinkReportingElement( + Input::SinkBase sink, Impl::Private::SummaryComponent sc ) { - s.head() = Impl::Private::SummaryComponent::return(_) and - result.asExpr() = source.getCall() and - isArgPostUpdate = false - or - exists(RustDataFlow::ArgumentPosition pos, Expr arg | - s.head() = Impl::Private::SummaryComponent::parameter(pos) and - arg = getSourceNodeArgument(source, s.tail().headOfSingleton()) and - result.asParameter() = getCallable(arg).getParam(pos.getPosition()) and - isArgPostUpdate = false + exists(Call call | + call.getResolvedTarget() = sink and + result = getArg(call, sc) ) - or - result.(RustDataFlow::PostUpdateNode).getPreUpdateNode().asExpr() = - getSourceNodeArgument(source, s.headOfSingleton()) and - isArgPostUpdate = true } - RustDataFlow::Node getSourceNode(Input::SourceBase source, Impl::Private::SummaryComponentStack s) { - result = getSourceNode(source, s, _) + bindingset[e, sc] + NodePublic getSinkDataFlowNode(SourceSinkReportingElement e, Impl::Private::SummaryComponent sc) { + result.asExpr() = e and + exists(sc) } +} - RustDataFlow::Node getSinkNode(Input::SinkBase sink, Impl::Private::SummaryComponent sc) { - exists(InvocationExpr call, Expr arg, RustDataFlow::ArgumentPosition pos | - result.asExpr() = arg and - sc = Impl::Private::SummaryComponent::argument(pos) and - call = sink.getCall() and - arg = pos.getArgument(call) - ) +private import Impl::Private::Make2 as Impl2 + +module StepsInput implements Impl2::StepsInputSig { + Impl2::SummaryNode getSummaryNode(RustDataFlow::Node n) { + result = n.(FlowSummaryNode).getSummaryNode() } + + DataFlowCall getACall(Public::SummarizedCallable sc) { result.asCall().getStaticTarget() = sc } } module Private { import Impl::Private + import Impl2 - module Steps = Impl::Private::Steps; + module Steps = Impl2::Steps; private import codeql.rust.dataflow.FlowSource private import codeql.rust.dataflow.FlowSink diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll b/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll index 8b63d818af1b..fddf1bbb5fab 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll @@ -249,7 +249,7 @@ private class FlowSourceFromModel extends FlowSource::Range { FlowSourceFromModel() { sourceModel(path, _, _, _, _) and - this.callResolvesTo(path) + this.getCanonicalPath() = path } override predicate isSource(string output, string kind, Provenance provenance, string model) { @@ -271,7 +271,7 @@ private class FlowSinkFromModel extends FlowSink::Range { FlowSinkFromModel() { sinkModel(path, _, _, _, _) and - this.callResolvesTo(path) + this.getCanonicalPath() = path } override predicate isSink(string input, string kind, Provenance provenance, string model) { @@ -293,7 +293,7 @@ private class FlowBarrierFromModel extends FlowBarrier::Range { FlowBarrierFromModel() { barrierModel(path, _, _, _, _) and - this.callResolvesTo(path) + this.getCanonicalPath() = path } override predicate isBarrier(string output, string kind, Provenance provenance, string model) { @@ -309,7 +309,7 @@ private class FlowBarrierGuardFromModel extends FlowBarrierGuard::Range { FlowBarrierGuardFromModel() { barrierGuardModel(path, _, _, _, _, _) and - this.callResolvesTo(path) + this.getCanonicalPath() = path } override predicate isBarrierGuard( diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/Node.qll b/rust/ql/lib/codeql/rust/dataflow/internal/Node.qll index 9ef2c3a08faf..cbe638d430c4 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/Node.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/Node.qll @@ -93,25 +93,16 @@ class FlowSummaryNode extends Node, TFlowSummaryNode { } override CfgScope getCfgScope() { - result = this.getSummaryNode().getSourceElement().getEnclosingCfgScope() - or - result = this.getSummaryNode().getSinkElement().getEnclosingCfgScope() + result = this.getSummaryNode().getSourceSinkReportingElement().getEnclosingCfgScope() } override DataFlowCallable getEnclosingCallable() { - result.asCfgScope() = this.getCfgScope() - or - result.asSummarizedCallable() = this.getSummarizedCallable() + result = this.getSummaryNode().getEnclosingCallable() } override Location getLocation() { Stages::DataFlowStage::ref() and - exists(this.getSummarizedCallable()) and - result instanceof EmptyLocation - or - result = this.getSourceElement().getLocation() - or - result = this.getSinkElement().getLocation() + result = this.getSummaryNode().getLocation() } override string toString() { @@ -761,9 +752,7 @@ newtype TNode = TIndexOutNode(IndexExpr ie, Boolean isPost) or TSsaNode(SsaImpl::DataFlowIntegration::SsaNode node) or TFlowSummaryNode(FlowSummaryImpl::Private::SummaryNode sn) { - forall(AstNode n | n = sn.getSinkElement() or n = sn.getSourceElement() | - n.hasEnclosingCfgScope() - ) + forall(AstNode n | n = sn.getSourceSinkReportingElement() | n.hasEnclosingCfgScope()) } or TClosureSelfReferenceNode(CfgScope c) { lambdaCreationExpr(c) } or TCaptureNode(VariableCapture::Flow::SynthesizedCaptureNode cn) or diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/TaintTrackingImpl.qll b/rust/ql/lib/codeql/rust/dataflow/internal/TaintTrackingImpl.qll index 7e5af70911d7..6791a22f946f 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/TaintTrackingImpl.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/TaintTrackingImpl.qll @@ -83,8 +83,7 @@ module RustTaintTrackingGen implements pred.(Node::PostUpdateNode).getPreUpdateNode().asExpr(), _, succ, _) ) or - FlowSummaryImpl::Private::Steps::summaryLocalStep(pred, - succ.(Node::FlowSummaryNode).getSummaryNode(), false, model) + FlowSummaryImpl::Private::Steps::summaryLocalStep(pred, succ, false, model) } /** diff --git a/rust/ql/lib/codeql/rust/security/DisabledCertificateCheckExtensions.qll b/rust/ql/lib/codeql/rust/security/DisabledCertificateCheckExtensions.qll index a5933bc74b1c..d6685dfcb161 100644 --- a/rust/ql/lib/codeql/rust/security/DisabledCertificateCheckExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/DisabledCertificateCheckExtensions.qll @@ -39,12 +39,15 @@ module DisabledCertificateCheckExtensions { */ private class HeuristicSink extends Sink { HeuristicSink() { - exists(Call call | + exists(Call call, Expr arg | + arg = this.asExpr() and call.getStaticTarget().getName().getText() = ["danger_accept_invalid_certs", "danger_accept_invalid_hostnames"] and - call.getPositionalArgument(0) = this.asExpr() and + call.getPositionalArgument(0) = arg and // don't duplicate modeled sinks - not exists(ModelsAsDataSink s | s.(Node::FlowSummaryNode).getSinkElement().getCall() = call) + not exists(ModelsAsDataSink s | + s.(Node::FlowSummaryNode).getSummaryNode().getSourceSinkReportingElement() = arg + ) ) } } diff --git a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll index fe5a8b038410..ea57d9427338 100644 --- a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll @@ -118,8 +118,9 @@ module HardcodedCryptographicValue { HeuristicSinks() { // any argument going to a parameter whose name matches a credential name - exists(Call c, Function f, int argIndex, string argName | - c.getPositionalArgument(argIndex) = this.asExpr() and + exists(Call c, Function f, Expr arg, int argIndex, string argName | + arg = this.asExpr() and + c.getPositionalArgument(argIndex) = arg and c.getStaticTarget() = f and f.getParam(argIndex).getPat().(IdentPat).getName().getText() = argName and ( @@ -134,7 +135,9 @@ module HardcodedCryptographicValue { // note: matching "key" results in too many false positives ) and // don't duplicate modeled sinks - not exists(ModelsAsDataSinks s | s.(Node::FlowSummaryNode).getSinkElement().getCall() = c) + not exists(ModelsAsDataSinks s | + s.(Node::FlowSummaryNode).getSummaryNode().getSourceSinkReportingElement() = arg + ) ) } diff --git a/rust/ql/lib/codeql/rust/security/WeakSensitiveDataHashingExtensions.qll b/rust/ql/lib/codeql/rust/security/WeakSensitiveDataHashingExtensions.qll index bd29f0498b35..25e6f4d5c7b7 100644 --- a/rust/ql/lib/codeql/rust/security/WeakSensitiveDataHashingExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/WeakSensitiveDataHashingExtensions.qll @@ -186,11 +186,15 @@ class ModeledHashOperation extends Cryptography::CryptographicOperation::Range { string algorithmName; ModeledHashOperation() { - exists(CallExpr call | + exists(CallExpr call, Expr e | sinkNode(input, "hasher-input") and - call = input.(Node::FlowSummaryNode).getSinkElement().getCall() and - call = this.asExpr() and + e = this.asExpr() and + e = input.(Node::FlowSummaryNode).getSummaryNode().getSourceSinkReportingElement() and algorithmName = call.getFunction().(PathExpr).getPath().getQualifier().getText() + | + call = e + or + call.getASyntacticArgument() = e ) } diff --git a/rust/ql/lib/utils/test/InlineFlowTest.qll b/rust/ql/lib/utils/test/InlineFlowTest.qll index 704172b95bd9..2b43ed49bf87 100644 --- a/rust/ql/lib/utils/test/InlineFlowTest.qll +++ b/rust/ql/lib/utils/test/InlineFlowTest.qll @@ -29,6 +29,21 @@ private module FlowTestImpl implements InputSig { any(CallExpr call | callTargetName(call, "sink")).getASyntacticArgument() = sink.asExpr() } + private string getSummaryNodeArgString(AstNode n) { + exists(Call call | + n = call + or + not n instanceof Call and + n = call.getASyntacticArgument() // `n` is a callback + | + result = call.getPositionalArgument(0).toString() + ) + or + result = n.(Call).getPositionalArgument(0).toString() + or + result = n.(Param).getPat().(IdentPat).getName().getText() + } + private string getSourceArgString(DataFlow::Node src) { defaultSource(src) and exists(Expr arg | arg = src.asExpr().(Call).getPositionalArgument(0) | @@ -38,9 +53,11 @@ private module FlowTestImpl implements InputSig { result = arg.(ArrayListExpr).getExpr(0).toString() ) or - sourceNode(src, _) and - result = - src.(Node::FlowSummaryNode).getSourceElement().getCall().getPositionalArgument(0).toString() and + exists(AstNode n | + sourceNode(src, _) and + n = src.(Node::FlowSummaryNode).getSummaryNode().getSourceSinkReportingElement() and + result = getSummaryNodeArgString(n) + ) and // Don't use the result if it contains spaces not result.matches("% %") } diff --git a/rust/ql/test/query-tests/security/CWE-022/TaintedPathSinks.ql b/rust/ql/test/query-tests/security/CWE-022/TaintedPathSinks.ql index 8660d779e2f0..a38213ae466c 100644 --- a/rust/ql/test/query-tests/security/CWE-022/TaintedPathSinks.ql +++ b/rust/ql/test/query-tests/security/CWE-022/TaintedPathSinks.ql @@ -15,42 +15,45 @@ module TaintedPathSinksTest implements TestSig { } predicate hasActualResult(Location location, string element, string tag, string value) { - exists(TaintedPath::Sink sink | - location = sink.getLocation() and - location.getFile().getBaseName() != "" and - element = sink.toString() and - tag = "path-injection-sink" and - value = "" - ) - or - exists(DataFlow::Node node | - ( - node instanceof TaintedPath::Barrier or - node instanceof TaintedPath::SanitizerGuard // tends to label the node *after* the check - ) and - location = node.getLocation() and - location.getFile().getBaseName() != "" and - element = node.toString() and - tag = "path-injection-barrier" and - value = "" - ) - or - exists(DataFlow::Node node | - DataflowImpl::optionalBarrier(node, "normalize-path") and - location = node.getLocation() and - location.getFile().getBaseName() != "" and - element = node.toString() and - tag = "path-injection-normalize" and - value = "" - ) - or - exists(DataFlow::Node node | - node instanceof Path::SafeAccessCheck and // tends to label the node *after* the check - location = node.getLocation() and - location.getFile().getBaseName() != "" and - element = node.toString() and - tag = "path-injection-checked" and - value = "" + location.fromSource() and + ( + exists(TaintedPath::Sink sink | + location = sink.getLocation() and + location.getFile().getBaseName() != "" and + element = sink.toString() and + tag = "path-injection-sink" and + value = "" + ) + or + exists(DataFlow::Node node | + ( + node instanceof TaintedPath::Barrier or + node instanceof TaintedPath::SanitizerGuard // tends to label the node *after* the check + ) and + location = node.getLocation() and + location.getFile().getBaseName() != "" and + element = node.toString() and + tag = "path-injection-barrier" and + value = "" + ) + or + exists(DataFlow::Node node | + DataflowImpl::optionalBarrier(node, "normalize-path") and + location = node.getLocation() and + location.getFile().getBaseName() != "" and + element = node.toString() and + tag = "path-injection-normalize" and + value = "" + ) + or + exists(DataFlow::Node node | + node instanceof Path::SafeAccessCheck and // tends to label the node *after* the check + location = node.getLocation() and + location.getFile().getBaseName() != "" and + element = node.toString() and + tag = "path-injection-checked" and + value = "" + ) ) } } From 427a24dd181b8b55138aa959f06574ee19f2127d Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 9 Jul 2026 22:06:27 +0200 Subject: [PATCH 0327/2098] Rust: Update expected test output / inline expectations --- .../dataflow/local/DataFlowStep.expected | 7 + .../library-tests/dataflow/models/main.rs | 6 +- .../dataflow/models/models.expected | 479 +++++++++--------- .../sources/database/InlineFlow.expected | 170 +++---- .../sources/database/TaintSources.expected | 50 +- .../dataflow/sources/database/test.rs | 32 +- .../dataflow/sources/env/InlineFlow.expected | 96 ++-- .../sources/env/TaintSources.expected | 30 +- .../dataflow/sources/file/InlineFlow.expected | 194 ++++--- .../sources/file/TaintSources.expected | 66 +-- .../dataflow/sources/net/InlineFlow.expected | 164 +++--- .../sources/net/TaintSources.expected | 34 +- .../sources/stdin/InlineFlow.expected | 166 +++--- .../sources/stdin/TaintSources.expected | 52 +- .../web_frameworks/InlineFlow.expected | 134 ++--- .../web_frameworks/TaintSources.expected | 240 ++++----- .../dataflow/sources/web_frameworks/test.rs | 20 +- .../library-tests/frameworks/postgres/main.rs | 4 +- .../library-tests/frameworks/rusqlite/main.rs | 4 +- .../security/CWE-020/RegexInjection.expected | 6 +- .../security/CWE-022/TaintedPath.expected | 116 ++--- .../security/CWE-079/actix/XSS.expected | 12 +- .../security/CWE-079/actix/main.rs | 4 +- .../security/CWE-079/axum/XSS.expected | 8 +- .../security/CWE-079/warp/XSS.expected | 12 +- .../query-tests/security/CWE-079/warp/main.rs | 4 +- .../security/CWE-089/SqlInjection.expected | 222 ++++---- .../query-tests/security/CWE-089/mysql.rs | 8 +- .../security/CWE-117/LogInjection.expected | 138 ++--- .../CWE-295/DisabledCertificateCheck.expected | 124 ++--- .../CWE-311/CleartextTransmission.expected | 30 +- .../CWE-312/CleartextLogging.expected | 348 +++++-------- .../CWE-312/CleartextStorageDatabase.expected | 54 +- .../security/CWE-319/UseOfHttp.expected | 42 +- .../CryptographicOperations.expected | 10 +- .../WeakSensitiveDataHashing.expected | 18 +- .../security/CWE-614/InsecureCookie.expected | 476 ++++++++--------- .../UncontrolledAllocationSize.expected | 351 +++++-------- .../HardcodedCryptographicValue.expected | 76 ++- .../CWE-825/AccessInvalidPointer.expected | 142 ++---- .../security/CWE-918/RequestForgery.expected | 48 +- .../security/CWE-918/request_forgery_tests.rs | 4 +- 42 files changed, 1901 insertions(+), 2300 deletions(-) diff --git a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected index 7d70ff90eaa6..8f50c8d56e97 100644 --- a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected +++ b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected @@ -9,6 +9,7 @@ localStep | main.rs:7:9:7:9 | s | main.rs:7:9:7:9 | s | | main.rs:7:9:7:14 | ...: i64 | main.rs:7:9:7:9 | s | | main.rs:8:14:8:20 | FormatArgsExpr | main.rs:8:14:8:20 | MacroExpr | +| main.rs:8:14:8:20 | MacroExpr | main.rs:8:14:8:20 | MacroExpr | | main.rs:8:14:8:20 | [post] MacroExpr | main.rs:8:14:8:20 | [post] FormatArgsExpr | | main.rs:8:14:8:20 | { ... } | main.rs:8:5:8:21 | MacroExpr | | main.rs:8:14:8:20 | { ... } | main.rs:8:14:8:20 | { ... } | @@ -17,6 +18,7 @@ localStep | main.rs:11:13:11:14 | sr | main.rs:11:13:11:14 | sr | | main.rs:11:13:11:20 | ...: ... | main.rs:11:13:11:14 | sr | | main.rs:12:14:12:21 | FormatArgsExpr | main.rs:12:14:12:21 | MacroExpr | +| main.rs:12:14:12:21 | MacroExpr | main.rs:12:14:12:21 | MacroExpr | | main.rs:12:14:12:21 | [post] MacroExpr | main.rs:12:14:12:21 | [post] FormatArgsExpr | | main.rs:12:14:12:21 | { ... } | main.rs:12:5:12:22 | MacroExpr | | main.rs:12:14:12:21 | { ... } | main.rs:12:14:12:21 | { ... } | @@ -424,12 +426,16 @@ localStep | main.rs:335:32:335:45 | Ok(...) | main.rs:335:9:335:10 | s1 | | main.rs:336:10:336:11 | [post] s1 | main.rs:337:10:337:11 | s1 | | main.rs:336:10:336:11 | s1 | main.rs:337:10:337:11 | s1 | +| main.rs:336:20:336:21 | "" | main.rs:336:20:336:21 | "" | +| main.rs:337:24:337:25 | "" | main.rs:337:24:337:25 | "" | | main.rs:339:9:339:10 | [SSA] s2 | main.rs:340:10:340:11 | s2 | | main.rs:339:9:339:10 | s2 | main.rs:339:9:339:10 | [SSA] s2 | | main.rs:339:9:339:10 | s2 | main.rs:339:9:339:10 | s2 | | main.rs:339:32:339:46 | Err(...) | main.rs:339:9:339:10 | s2 | | main.rs:340:10:340:11 | [post] s2 | main.rs:341:10:341:11 | s2 | | main.rs:340:10:340:11 | s2 | main.rs:341:10:341:11 | s2 | +| main.rs:340:20:340:21 | "" | main.rs:340:20:340:21 | "" | +| main.rs:341:24:341:25 | "" | main.rs:341:24:341:25 | "" | | main.rs:350:9:350:10 | [SSA] s1 | main.rs:352:11:352:12 | s1 | | main.rs:350:9:350:10 | s1 | main.rs:350:9:350:10 | [SSA] s1 | | main.rs:350:9:350:10 | s1 | main.rs:350:9:350:10 | s1 | @@ -695,6 +701,7 @@ localStep | main.rs:500:16:500:16 | s | main.rs:500:16:500:16 | s | | main.rs:500:16:500:24 | ...: String | main.rs:500:16:500:16 | s | | main.rs:501:14:501:20 | FormatArgsExpr | main.rs:501:14:501:20 | MacroExpr | +| main.rs:501:14:501:20 | MacroExpr | main.rs:501:14:501:20 | MacroExpr | | main.rs:501:14:501:20 | [post] MacroExpr | main.rs:501:14:501:20 | [post] FormatArgsExpr | | main.rs:501:14:501:20 | { ... } | main.rs:501:5:501:21 | MacroExpr | | main.rs:501:14:501:20 | { ... } | main.rs:501:14:501:20 | { ... } | diff --git a/rust/ql/test/library-tests/dataflow/models/main.rs b/rust/ql/test/library-tests/dataflow/models/main.rs index a65963600494..d06ed3069b53 100644 --- a/rust/ql/test/library-tests/dataflow/models/main.rs +++ b/rust/ql/test/library-tests/dataflow/models/main.rs @@ -344,13 +344,13 @@ mod sink_out_of_function { fn test_sink_out_of_function() { let a = |a| source(1); - pass_sink(a); // $ MISSING: hasValueFlow=1 + pass_sink(a); // $ hasValueFlow=1 let b = |_a| { let s = source(2); MyFieldEnum::E { field_e: Option::Some(s) } }; - pass_sink_nested(b); // $ MISSING: hasValueFlow=2 + pass_sink_nested(b); // $ hasValueFlow=2 } } @@ -408,7 +408,7 @@ trait MyTrait { impl MyTrait for () { fn test_param_source(i: i64) { - sink(i) // $ MISSING: hasValueFlow=i + sink(i) // $ hasValueFlow=i } } diff --git a/rust/ql/test/library-tests/dataflow/models/models.expected b/rust/ql/test/library-tests/dataflow/models/models.expected index f531b85b6898..c4fabc6cc1e5 100644 --- a/rust/ql/test/library-tests/dataflow/models/models.expected +++ b/rust/ql/test/library-tests/dataflow/models/models.expected @@ -5,35 +5,38 @@ models | 4 | Sink: main::external_file::generated_sink; Argument[0]; test-sink | | 5 | Sink: main::external_file::neutral_manual_sink; Argument[0]; test-sink | | 6 | Sink: main::simple_sink; Argument[0]; test-sink | -| 7 | Source: ::source; ReturnValue.Field[main::MyFieldEnum::C::field_c]; test-source | -| 8 | Source: main::arg_source; Argument[0]; test-source | -| 9 | Source: main::enum_source; ReturnValue.Field[main::MyFieldEnum::D::field_d]; test-source | -| 10 | Source: main::enum_source_nested; ReturnValue.Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-source | -| 11 | Source: main::external_file::generated_source; ReturnValue; test-source | -| 12 | Source: main::external_file::neutral_manual_source; ReturnValue; test-source | -| 13 | Source: main::simple_source; ReturnValue; test-source | -| 14 | Source: main::source_into_function::pass_source; Argument[1].Parameter[0]; test-source | -| 15 | Source: main::source_into_function::pass_source_nested; Argument[1].Parameter[0].Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-source | -| 16 | Summary: <_ as core::cmp::Ord>::max; Argument[self,0]; ReturnValue; value | -| 17 | Summary: <_ as core::cmp::PartialOrd>::lt; Argument[self].Reference; ReturnValue; taint | -| 18 | Summary: <_ as core::ops::index::Index>::index; Argument[self].Reference.Element; ReturnValue.Reference; value | -| 19 | Summary: main::apply; Argument[0]; Argument[1].Parameter[0]; value | -| 20 | Summary: main::apply; Argument[1].ReturnValue; ReturnValue; value | -| 21 | Summary: main::coerce; Argument[0]; ReturnValue; taint | -| 22 | Summary: main::external_file::generated_summary; Argument[0]; ReturnValue; value | -| 23 | Summary: main::external_file::neutral_manual_summary; Argument[0]; ReturnValue; value | -| 24 | Summary: main::get_array_element; Argument[0].Element; ReturnValue; value | -| 25 | Summary: main::get_async_number; Argument[0]; ReturnValue.Future; value | -| 26 | Summary: main::get_struct_field; Argument[0].Field[main::MyStruct::field1]; ReturnValue; value | -| 27 | Summary: main::get_tuple_element; Argument[0].Field[0]; ReturnValue; value | -| 28 | Summary: main::get_var_field; Argument[0].Field[main::MyFieldEnum::C::field_c]; ReturnValue; value | -| 29 | Summary: main::get_var_pos; Argument[0].Field[main::MyPosEnum::A(0)]; ReturnValue; value | -| 30 | Summary: main::set_array_element; Argument[0]; ReturnValue.Element; value | -| 31 | Summary: main::set_struct_field; Argument[0]; ReturnValue.Field[main::MyStruct::field2]; value | -| 32 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value | -| 33 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value | -| 34 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value | -| 35 | Summary: main::snd; Argument[1]; ReturnValue; value | +| 7 | Sink: main::sink_out_of_function::pass_sink; Argument[0].ReturnValue; test-sink | +| 8 | Sink: main::sink_out_of_function::pass_sink_nested; Argument[0].ReturnValue.Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-sink | +| 9 | Source: <_ as main::MyTrait>::test_param_source; Parameter[0]; test-source | +| 10 | Source: ::source; ReturnValue.Field[main::MyFieldEnum::C::field_c]; test-source | +| 11 | Source: main::arg_source; Argument[0]; test-source | +| 12 | Source: main::enum_source; ReturnValue.Field[main::MyFieldEnum::D::field_d]; test-source | +| 13 | Source: main::enum_source_nested; ReturnValue.Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-source | +| 14 | Source: main::external_file::generated_source; ReturnValue; test-source | +| 15 | Source: main::external_file::neutral_manual_source; ReturnValue; test-source | +| 16 | Source: main::simple_source; ReturnValue; test-source | +| 17 | Source: main::source_into_function::pass_source; Argument[1].Parameter[0]; test-source | +| 18 | Source: main::source_into_function::pass_source_nested; Argument[1].Parameter[0].Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-source | +| 19 | Summary: <_ as core::cmp::Ord>::max; Argument[self,0]; ReturnValue; value | +| 20 | Summary: <_ as core::cmp::PartialOrd>::lt; Argument[self].Reference; ReturnValue; taint | +| 21 | Summary: <_ as core::ops::index::Index>::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 22 | Summary: main::apply; Argument[0]; Argument[1].Parameter[0]; value | +| 23 | Summary: main::apply; Argument[1].ReturnValue; ReturnValue; value | +| 24 | Summary: main::coerce; Argument[0]; ReturnValue; taint | +| 25 | Summary: main::external_file::generated_summary; Argument[0]; ReturnValue; value | +| 26 | Summary: main::external_file::neutral_manual_summary; Argument[0]; ReturnValue; value | +| 27 | Summary: main::get_array_element; Argument[0].Element; ReturnValue; value | +| 28 | Summary: main::get_async_number; Argument[0]; ReturnValue.Future; value | +| 29 | Summary: main::get_struct_field; Argument[0].Field[main::MyStruct::field1]; ReturnValue; value | +| 30 | Summary: main::get_tuple_element; Argument[0].Field[0]; ReturnValue; value | +| 31 | Summary: main::get_var_field; Argument[0].Field[main::MyFieldEnum::C::field_c]; ReturnValue; value | +| 32 | Summary: main::get_var_pos; Argument[0].Field[main::MyPosEnum::A(0)]; ReturnValue; value | +| 33 | Summary: main::set_array_element; Argument[0]; ReturnValue.Element; value | +| 34 | Summary: main::set_struct_field; Argument[0]; ReturnValue.Field[main::MyStruct::field2]; value | +| 35 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value | +| 36 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value | +| 37 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value | +| 38 | Summary: main::snd; Argument[1]; ReturnValue; value | edges | main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | | | main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | | @@ -43,13 +46,13 @@ edges | main.rs:16:19:16:19 | s | main.rs:16:10:16:20 | identity(...) | provenance | QL | | main.rs:25:9:25:9 | s | main.rs:26:17:26:17 | s | provenance | | | main.rs:25:13:25:22 | source(...) | main.rs:25:9:25:9 | s | provenance | | -| main.rs:26:17:26:17 | s | main.rs:26:10:26:18 | coerce(...) | provenance | MaD:21 | +| main.rs:26:17:26:17 | s | main.rs:26:10:26:18 | coerce(...) | provenance | MaD:24 | | main.rs:41:9:41:10 | s1 | main.rs:42:17:42:18 | s1 | provenance | | | main.rs:41:9:41:10 | s1 | main.rs:42:17:42:18 | s1 | provenance | | | main.rs:41:14:41:23 | source(...) | main.rs:41:9:41:10 | s1 | provenance | | | main.rs:41:14:41:23 | source(...) | main.rs:41:9:41:10 | s1 | provenance | | -| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:35 | -| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:35 | +| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:38 | +| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:38 | | main.rs:54:9:54:9 | s | main.rs:55:27:55:27 | s | provenance | | | main.rs:54:9:54:9 | s | main.rs:55:27:55:27 | s | provenance | | | main.rs:54:13:54:21 | source(...) | main.rs:54:9:54:9 | s | provenance | | @@ -60,8 +63,8 @@ edges | main.rs:55:14:55:28 | ...::A(...) [A] | main.rs:55:9:55:10 | e1 [A] | provenance | | | main.rs:55:27:55:27 | s | main.rs:55:14:55:28 | ...::A(...) [A] | provenance | | | main.rs:55:27:55:27 | s | main.rs:55:14:55:28 | ...::A(...) [A] | provenance | | -| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:29 | -| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:29 | +| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:32 | +| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:32 | | main.rs:67:9:67:9 | s | main.rs:68:26:68:26 | s | provenance | | | main.rs:67:9:67:9 | s | main.rs:68:26:68:26 | s | provenance | | | main.rs:67:13:67:21 | source(...) | main.rs:67:9:67:9 | s | provenance | | @@ -70,8 +73,8 @@ edges | main.rs:68:9:68:10 | e1 [B] | main.rs:69:11:69:12 | e1 [B] | provenance | | | main.rs:68:14:68:27 | set_var_pos(...) [B] | main.rs:68:9:68:10 | e1 [B] | provenance | | | main.rs:68:14:68:27 | set_var_pos(...) [B] | main.rs:68:9:68:10 | e1 [B] | provenance | | -| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:34 | -| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:34 | +| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:37 | +| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:37 | | main.rs:69:11:69:12 | e1 [B] | main.rs:71:9:71:23 | ...::B(...) [B] | provenance | | | main.rs:69:11:69:12 | e1 [B] | main.rs:71:9:71:23 | ...::B(...) [B] | provenance | | | main.rs:71:9:71:23 | ...::B(...) [B] | main.rs:71:22:71:22 | i | provenance | | @@ -88,8 +91,8 @@ edges | main.rs:88:14:88:42 | ...::C {...} [C] | main.rs:88:9:88:10 | e1 [C] | provenance | | | main.rs:88:40:88:40 | s | main.rs:88:14:88:42 | ...::C {...} [C] | provenance | | | main.rs:88:40:88:40 | s | main.rs:88:14:88:42 | ...::C {...} [C] | provenance | | -| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:28 | -| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:28 | +| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:31 | +| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:31 | | main.rs:100:9:100:9 | s | main.rs:101:28:101:28 | s | provenance | | | main.rs:100:9:100:9 | s | main.rs:101:28:101:28 | s | provenance | | | main.rs:100:13:100:21 | source(...) | main.rs:100:9:100:9 | s | provenance | | @@ -98,8 +101,8 @@ edges | main.rs:101:9:101:10 | e1 [D] | main.rs:102:11:102:12 | e1 [D] | provenance | | | main.rs:101:14:101:29 | set_var_field(...) [D] | main.rs:101:9:101:10 | e1 [D] | provenance | | | main.rs:101:14:101:29 | set_var_field(...) [D] | main.rs:101:9:101:10 | e1 [D] | provenance | | -| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:33 | -| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:33 | +| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:36 | +| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:36 | | main.rs:102:11:102:12 | e1 [D] | main.rs:104:9:104:37 | ...::D {...} [D] | provenance | | | main.rs:102:11:102:12 | e1 [D] | main.rs:104:9:104:37 | ...::D {...} [D] | provenance | | | main.rs:104:9:104:37 | ...::D {...} [D] | main.rs:104:35:104:35 | i | provenance | | @@ -116,8 +119,8 @@ edges | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | main.rs:121:9:121:17 | my_struct [MyStruct.field1] | provenance | | | main.rs:122:17:122:17 | s | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | provenance | | | main.rs:122:17:122:17 | s | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | provenance | | -| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:26 | -| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:26 | +| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:29 | +| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:29 | | main.rs:142:9:142:9 | s | main.rs:143:38:143:38 | s | provenance | | | main.rs:142:9:142:9 | s | main.rs:143:38:143:38 | s | provenance | | | main.rs:142:13:142:21 | source(...) | main.rs:142:9:142:9 | s | provenance | | @@ -126,16 +129,16 @@ edges | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | provenance | | | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | provenance | | | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | provenance | | -| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:31 | -| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:31 | +| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:34 | +| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:34 | | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | main.rs:145:10:145:25 | my_struct.field2 | provenance | | | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | main.rs:145:10:145:25 | my_struct.field2 | provenance | | | main.rs:154:9:154:9 | s | main.rs:155:29:155:29 | s | provenance | | | main.rs:154:9:154:9 | s | main.rs:155:29:155:29 | s | provenance | | | main.rs:154:13:154:21 | source(...) | main.rs:154:9:154:9 | s | provenance | | | main.rs:154:13:154:21 | source(...) | main.rs:154:9:154:9 | s | provenance | | -| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:24 | -| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:24 | +| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:27 | +| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:27 | | main.rs:155:29:155:29 | s | main.rs:155:28:155:30 | [...] [element] | provenance | | | main.rs:155:29:155:29 | s | main.rs:155:28:155:30 | [...] [element] | provenance | | | main.rs:164:9:164:9 | s | main.rs:165:33:165:33 | s | provenance | | @@ -146,10 +149,10 @@ edges | main.rs:165:9:165:11 | arr [element] | main.rs:166:10:166:12 | arr [element] | provenance | | | main.rs:165:15:165:34 | set_array_element(...) [element] | main.rs:165:9:165:11 | arr [element] | provenance | | | main.rs:165:15:165:34 | set_array_element(...) [element] | main.rs:165:9:165:11 | arr [element] | provenance | | -| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:30 | -| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:30 | -| main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:18 | -| main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:18 | +| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:33 | +| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:33 | +| main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:21 | +| main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:21 | | main.rs:175:9:175:9 | s | main.rs:176:14:176:14 | s | provenance | | | main.rs:175:9:175:9 | s | main.rs:176:14:176:14 | s | provenance | | | main.rs:175:13:175:22 | source(...) | main.rs:175:9:175:9 | s | provenance | | @@ -160,8 +163,8 @@ edges | main.rs:176:13:176:18 | TupleExpr [tuple.0] | main.rs:176:9:176:9 | t [tuple.0] | provenance | | | main.rs:176:14:176:14 | s | main.rs:176:13:176:18 | TupleExpr [tuple.0] | provenance | | | main.rs:176:14:176:14 | s | main.rs:176:13:176:18 | TupleExpr [tuple.0] | provenance | | -| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:27 | -| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:27 | +| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:30 | +| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:30 | | main.rs:188:9:188:9 | s | main.rs:189:31:189:31 | s | provenance | | | main.rs:188:9:188:9 | s | main.rs:189:31:189:31 | s | provenance | | | main.rs:188:13:188:22 | source(...) | main.rs:188:9:188:9 | s | provenance | | @@ -170,8 +173,8 @@ edges | main.rs:189:9:189:9 | t [tuple.1] | main.rs:191:10:191:10 | t [tuple.1] | provenance | | | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | main.rs:189:9:189:9 | t [tuple.1] | provenance | | | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | main.rs:189:9:189:9 | t [tuple.1] | provenance | | -| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:32 | -| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:32 | +| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:35 | +| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:35 | | main.rs:191:10:191:10 | t [tuple.1] | main.rs:191:10:191:12 | t.1 | provenance | | | main.rs:191:10:191:10 | t [tuple.1] | main.rs:191:10:191:12 | t.1 | provenance | | | main.rs:203:9:203:9 | s | main.rs:208:11:208:11 | s | provenance | | @@ -180,8 +183,8 @@ edges | main.rs:203:13:203:22 | source(...) | main.rs:203:9:203:9 | s | provenance | | | main.rs:204:14:204:14 | ... | main.rs:205:14:205:14 | n | provenance | | | main.rs:204:14:204:14 | ... | main.rs:205:14:205:14 | n | provenance | | -| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:19 | -| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:19 | +| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:22 | +| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:22 | | main.rs:212:13:212:22 | source(...) | main.rs:214:23:214:23 | f [captured s] | provenance | | | main.rs:212:13:212:22 | source(...) | main.rs:214:23:214:23 | f [captured s] | provenance | | | main.rs:213:40:213:40 | s | main.rs:213:17:213:42 | if ... {...} else {...} | provenance | | @@ -190,14 +193,14 @@ edges | main.rs:214:9:214:9 | t | main.rs:215:10:215:10 | t | provenance | | | main.rs:214:13:214:24 | apply(...) | main.rs:214:9:214:9 | t | provenance | | | main.rs:214:13:214:24 | apply(...) | main.rs:214:9:214:9 | t | provenance | | -| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:19 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:19 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:20 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:20 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:19 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:19 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:20 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:20 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:22 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:22 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:23 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:23 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:22 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:22 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:23 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:23 | | main.rs:219:9:219:9 | s | main.rs:221:19:221:19 | s | provenance | | | main.rs:219:9:219:9 | s | main.rs:221:19:221:19 | s | provenance | | | main.rs:219:13:219:22 | source(...) | main.rs:219:9:219:9 | s | provenance | | @@ -208,10 +211,10 @@ edges | main.rs:221:9:221:9 | t | main.rs:222:10:222:10 | t | provenance | | | main.rs:221:13:221:23 | apply(...) | main.rs:221:9:221:9 | t | provenance | | | main.rs:221:13:221:23 | apply(...) | main.rs:221:9:221:9 | t | provenance | | -| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | provenance | MaD:19 | -| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | provenance | MaD:19 | -| main.rs:221:19:221:19 | s | main.rs:221:13:221:23 | apply(...) | provenance | MaD:19 | -| main.rs:221:19:221:19 | s | main.rs:221:13:221:23 | apply(...) | provenance | MaD:19 | +| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | provenance | MaD:22 | +| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | provenance | MaD:22 | +| main.rs:221:19:221:19 | s | main.rs:221:13:221:23 | apply(...) | provenance | MaD:22 | +| main.rs:221:19:221:19 | s | main.rs:221:13:221:23 | apply(...) | provenance | MaD:22 | | main.rs:231:9:231:9 | s | main.rs:232:30:232:30 | s | provenance | | | main.rs:231:9:231:9 | s | main.rs:232:30:232:30 | s | provenance | | | main.rs:231:13:231:22 | source(...) | main.rs:231:9:231:9 | s | provenance | | @@ -222,14 +225,12 @@ edges | main.rs:232:13:232:31 | get_async_number(...) [future] | main.rs:232:13:232:37 | await ... | provenance | | | main.rs:232:13:232:37 | await ... | main.rs:232:9:232:9 | t | provenance | | | main.rs:232:13:232:37 | await ... | main.rs:232:9:232:9 | t | provenance | | -| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:25 | -| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:25 | +| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:28 | +| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:28 | | main.rs:257:9:257:9 | s [D] | main.rs:258:11:258:11 | s [D] | provenance | | | main.rs:257:9:257:9 | s [D] | main.rs:258:11:258:11 | s [D] | provenance | | -| main.rs:257:13:257:23 | enum_source | main.rs:257:13:257:27 | enum_source(...) [D] | provenance | Src:MaD:9 | -| main.rs:257:13:257:23 | enum_source | main.rs:257:13:257:27 | enum_source(...) [D] | provenance | Src:MaD:9 | -| main.rs:257:13:257:27 | enum_source(...) [D] | main.rs:257:9:257:9 | s [D] | provenance | | -| main.rs:257:13:257:27 | enum_source(...) [D] | main.rs:257:9:257:9 | s [D] | provenance | | +| main.rs:257:13:257:27 | enum_source(...) | main.rs:257:9:257:9 | s [D] | provenance | Src:MaD:12 | +| main.rs:257:13:257:27 | enum_source(...) | main.rs:257:9:257:9 | s [D] | provenance | Src:MaD:12 | | main.rs:258:11:258:11 | s [D] | main.rs:260:9:260:37 | ...::D {...} [D] | provenance | | | main.rs:258:11:258:11 | s [D] | main.rs:260:9:260:37 | ...::D {...} [D] | provenance | | | main.rs:260:9:260:37 | ...::D {...} [D] | main.rs:260:35:260:35 | i | provenance | | @@ -238,10 +239,8 @@ edges | main.rs:260:35:260:35 | i | main.rs:260:47:260:47 | i | provenance | | | main.rs:264:9:264:9 | s [E, Some] | main.rs:265:11:265:11 | s [E, Some] | provenance | | | main.rs:264:9:264:9 | s [E, Some] | main.rs:265:11:265:11 | s [E, Some] | provenance | | -| main.rs:264:13:264:30 | enum_source_nested | main.rs:264:13:264:34 | enum_source_nested(...) [E, Some] | provenance | Src:MaD:10 | -| main.rs:264:13:264:30 | enum_source_nested | main.rs:264:13:264:34 | enum_source_nested(...) [E, Some] | provenance | Src:MaD:10 | -| main.rs:264:13:264:34 | enum_source_nested(...) [E, Some] | main.rs:264:9:264:9 | s [E, Some] | provenance | | -| main.rs:264:13:264:34 | enum_source_nested(...) [E, Some] | main.rs:264:9:264:9 | s [E, Some] | provenance | | +| main.rs:264:13:264:34 | enum_source_nested(...) | main.rs:264:9:264:9 | s [E, Some] | provenance | Src:MaD:13 | +| main.rs:264:13:264:34 | enum_source_nested(...) | main.rs:264:9:264:9 | s [E, Some] | provenance | Src:MaD:13 | | main.rs:265:11:265:11 | s [E, Some] | main.rs:268:9:268:37 | ...::E {...} [E, Some] | provenance | | | main.rs:265:11:265:11 | s [E, Some] | main.rs:268:9:268:37 | ...::E {...} [E, Some] | provenance | | | main.rs:268:9:268:37 | ...::E {...} [E, Some] | main.rs:268:35:268:35 | o [Some] | provenance | | @@ -256,36 +255,26 @@ edges | main.rs:271:22:271:22 | i | main.rs:271:33:271:33 | i | provenance | | | main.rs:280:9:280:9 | s [C] | main.rs:281:11:281:11 | s [C] | provenance | | | main.rs:280:9:280:9 | s [C] | main.rs:281:11:281:11 | s [C] | provenance | | -| main.rs:280:13:280:24 | e.source(...) [C] | main.rs:280:9:280:9 | s [C] | provenance | | -| main.rs:280:13:280:24 | e.source(...) [C] | main.rs:280:9:280:9 | s [C] | provenance | | -| main.rs:280:15:280:20 | source | main.rs:280:13:280:24 | e.source(...) [C] | provenance | Src:MaD:7 | -| main.rs:280:15:280:20 | source | main.rs:280:13:280:24 | e.source(...) [C] | provenance | Src:MaD:7 | +| main.rs:280:13:280:24 | e.source(...) | main.rs:280:9:280:9 | s [C] | provenance | Src:MaD:10 | +| main.rs:280:13:280:24 | e.source(...) | main.rs:280:9:280:9 | s [C] | provenance | Src:MaD:10 | | main.rs:281:11:281:11 | s [C] | main.rs:282:9:282:37 | ...::C {...} [C] | provenance | | | main.rs:281:11:281:11 | s [C] | main.rs:282:9:282:37 | ...::C {...} [C] | provenance | | | main.rs:282:9:282:37 | ...::C {...} [C] | main.rs:282:35:282:35 | i | provenance | | | main.rs:282:9:282:37 | ...::C {...} [C] | main.rs:282:35:282:35 | i | provenance | | | main.rs:282:35:282:35 | i | main.rs:282:47:282:47 | i | provenance | | | main.rs:282:35:282:35 | i | main.rs:282:47:282:47 | i | provenance | | -| main.rs:303:18:303:18 | ... | main.rs:303:26:303:26 | a | provenance | | -| main.rs:303:18:303:18 | ... | main.rs:303:26:303:26 | a | provenance | | -| main.rs:304:9:304:19 | pass_source | main.rs:303:18:303:18 | ... | provenance | Src:MaD:14 | -| main.rs:304:9:304:19 | pass_source | main.rs:303:18:303:18 | ... | provenance | Src:MaD:14 | -| main.rs:306:9:306:19 | pass_source | main.rs:306:25:306:25 | ... | provenance | Src:MaD:14 | -| main.rs:306:9:306:19 | pass_source | main.rs:306:25:306:25 | ... | provenance | Src:MaD:14 | -| main.rs:306:25:306:25 | ... | main.rs:307:18:307:18 | a | provenance | | -| main.rs:306:25:306:25 | ... | main.rs:307:18:307:18 | a | provenance | | -| main.rs:310:14:310:19 | ...: i64 | main.rs:311:18:311:18 | a | provenance | | -| main.rs:310:14:310:19 | ...: i64 | main.rs:311:18:311:18 | a | provenance | | -| main.rs:313:9:313:19 | pass_source | main.rs:310:14:310:19 | ...: i64 | provenance | Src:MaD:14 | -| main.rs:313:9:313:19 | pass_source | main.rs:310:14:310:19 | ...: i64 | provenance | Src:MaD:14 | -| main.rs:315:9:315:19 | pass_source | main.rs:315:36:315:36 | ... | provenance | Src:MaD:14 | -| main.rs:315:9:315:19 | pass_source | main.rs:315:36:315:36 | ... | provenance | Src:MaD:14 | -| main.rs:315:36:315:36 | ... | main.rs:316:18:316:18 | a | provenance | | -| main.rs:315:36:315:36 | ... | main.rs:316:18:316:18 | a | provenance | | -| main.rs:319:9:319:26 | pass_source_nested | main.rs:319:32:319:32 | ... [E, Some] | provenance | Src:MaD:15 | -| main.rs:319:9:319:26 | pass_source_nested | main.rs:319:32:319:32 | ... [E, Some] | provenance | Src:MaD:15 | -| main.rs:319:32:319:32 | ... [E, Some] | main.rs:320:19:320:19 | e [E, Some] | provenance | | -| main.rs:319:32:319:32 | ... [E, Some] | main.rs:320:19:320:19 | e [E, Some] | provenance | | +| main.rs:304:24:304:24 | a | main.rs:303:26:303:26 | a | provenance | Src:MaD:17 | +| main.rs:304:24:304:24 | a | main.rs:303:26:303:26 | a | provenance | Src:MaD:17 | +| main.rs:306:24:308:9 | \|...\| ... | main.rs:307:18:307:18 | a | provenance | Src:MaD:17 | +| main.rs:306:24:308:9 | \|...\| ... | main.rs:307:18:307:18 | a | provenance | Src:MaD:17 | +| main.rs:313:24:313:24 | f | main.rs:311:18:311:18 | a | provenance | Src:MaD:17 | +| main.rs:313:24:313:24 | f | main.rs:311:18:311:18 | a | provenance | Src:MaD:17 | +| main.rs:315:24:317:9 | \|...\| ... | main.rs:316:18:316:18 | a | provenance | Src:MaD:17 | +| main.rs:315:24:317:9 | \|...\| ... | main.rs:316:18:316:18 | a | provenance | Src:MaD:17 | +| main.rs:319:31:331:9 | \|...\| ... | main.rs:319:31:331:9 | \|...\| ... [E, Some] | provenance | Src:MaD:18 | +| main.rs:319:31:331:9 | \|...\| ... | main.rs:319:31:331:9 | \|...\| ... [E, Some] | provenance | Src:MaD:18 | +| main.rs:319:31:331:9 | \|...\| ... [E, Some] | main.rs:320:19:320:19 | e [E, Some] | provenance | | +| main.rs:319:31:331:9 | \|...\| ... [E, Some] | main.rs:320:19:320:19 | e [E, Some] | provenance | | | main.rs:320:19:320:19 | e [E, Some] | main.rs:323:17:323:45 | ...::E {...} [E, Some] | provenance | | | main.rs:320:19:320:19 | e [E, Some] | main.rs:323:17:323:45 | ...::E {...} [E, Some] | provenance | | | main.rs:323:17:323:45 | ...::E {...} [E, Some] | main.rs:323:43:323:43 | o [Some] | provenance | | @@ -298,18 +287,36 @@ edges | main.rs:326:25:326:31 | Some(...) [Some] | main.rs:326:30:326:30 | i | provenance | | | main.rs:326:30:326:30 | i | main.rs:326:41:326:41 | i | provenance | | | main.rs:326:30:326:30 | i | main.rs:326:41:326:41 | i | provenance | | +| main.rs:346:21:346:29 | source(...) | main.rs:347:19:347:19 | a | provenance | Sink:MaD:7 | +| main.rs:346:21:346:29 | source(...) | main.rs:347:19:347:19 | a | provenance | Sink:MaD:7 | +| main.rs:350:17:350:17 | s | main.rs:351:52:351:52 | s | provenance | | +| main.rs:350:17:350:17 | s | main.rs:351:52:351:52 | s | provenance | | +| main.rs:350:21:350:29 | source(...) | main.rs:350:17:350:17 | s | provenance | | +| main.rs:350:21:350:29 | source(...) | main.rs:350:17:350:17 | s | provenance | | +| main.rs:351:13:351:55 | ...::E {...} [E, Some] | main.rs:353:26:353:26 | b [E, Some] | provenance | | +| main.rs:351:13:351:55 | ...::E {...} [E, Some] | main.rs:353:26:353:26 | b [E, Some] | provenance | | +| main.rs:351:39:351:53 | ...::Some(...) [Some] | main.rs:351:13:351:55 | ...::E {...} [E, Some] | provenance | | +| main.rs:351:39:351:53 | ...::Some(...) [Some] | main.rs:351:13:351:55 | ...::E {...} [E, Some] | provenance | | +| main.rs:351:52:351:52 | s | main.rs:351:39:351:53 | ...::Some(...) [Some] | provenance | | +| main.rs:351:52:351:52 | s | main.rs:351:39:351:53 | ...::Some(...) [Some] | provenance | | +| main.rs:353:26:353:26 | b [E, Some] | main.rs:353:26:353:26 | b [Some] | provenance | | +| main.rs:353:26:353:26 | b [E, Some] | main.rs:353:26:353:26 | b [Some] | provenance | | +| main.rs:353:26:353:26 | b [Some] | main.rs:353:26:353:26 | b | provenance | Sink:MaD:8 | +| main.rs:353:26:353:26 | b [Some] | main.rs:353:26:353:26 | b | provenance | Sink:MaD:8 | | main.rs:364:9:364:9 | s | main.rs:365:41:365:41 | s | provenance | | | main.rs:364:9:364:9 | s | main.rs:365:41:365:41 | s | provenance | | | main.rs:364:9:364:9 | s | main.rs:368:53:368:53 | s | provenance | | | main.rs:364:9:364:9 | s | main.rs:368:53:368:53 | s | provenance | | | main.rs:364:13:364:22 | source(...) | main.rs:364:9:364:9 | s | provenance | | | main.rs:364:13:364:22 | source(...) | main.rs:364:9:364:9 | s | provenance | | -| main.rs:365:15:365:43 | ...::C {...} [C] | main.rs:365:5:365:13 | enum_sink | provenance | MaD:2 Sink:MaD:2 | -| main.rs:365:15:365:43 | ...::C {...} [C] | main.rs:365:5:365:13 | enum_sink | provenance | MaD:2 Sink:MaD:2 | +| main.rs:365:15:365:43 | ...::C {...} [C] | main.rs:365:15:365:43 | ...::C {...} | provenance | Sink:MaD:2 | +| main.rs:365:15:365:43 | ...::C {...} [C] | main.rs:365:15:365:43 | ...::C {...} | provenance | Sink:MaD:2 | | main.rs:365:41:365:41 | s | main.rs:365:15:365:43 | ...::C {...} [C] | provenance | | | main.rs:365:41:365:41 | s | main.rs:365:15:365:43 | ...::C {...} [C] | provenance | | -| main.rs:368:22:368:56 | ...::E {...} [E, Some] | main.rs:368:5:368:20 | enum_sink_nested | provenance | MaD:3 Sink:MaD:3 | -| main.rs:368:22:368:56 | ...::E {...} [E, Some] | main.rs:368:5:368:20 | enum_sink_nested | provenance | MaD:3 Sink:MaD:3 | +| main.rs:368:22:368:56 | ...::E {...} [E, Some] | main.rs:368:22:368:56 | ...::E {...} [Some] | provenance | | +| main.rs:368:22:368:56 | ...::E {...} [E, Some] | main.rs:368:22:368:56 | ...::E {...} [Some] | provenance | | +| main.rs:368:22:368:56 | ...::E {...} [Some] | main.rs:368:22:368:56 | ...::E {...} | provenance | Sink:MaD:3 | +| main.rs:368:22:368:56 | ...::E {...} [Some] | main.rs:368:22:368:56 | ...::E {...} | provenance | Sink:MaD:3 | | main.rs:368:48:368:54 | Some(...) [Some] | main.rs:368:22:368:56 | ...::E {...} [E, Some] | provenance | | | main.rs:368:48:368:54 | Some(...) [Some] | main.rs:368:22:368:56 | ...::E {...} [E, Some] | provenance | | | main.rs:368:53:368:53 | s | main.rs:368:48:368:54 | Some(...) [Some] | provenance | | @@ -318,70 +325,64 @@ edges | main.rs:372:9:372:9 | s | main.rs:373:39:373:39 | s | provenance | | | main.rs:372:13:372:22 | source(...) | main.rs:372:9:372:9 | s | provenance | | | main.rs:372:13:372:22 | source(...) | main.rs:372:9:372:9 | s | provenance | | -| main.rs:373:9:373:9 | e [D] | main.rs:374:5:374:5 | e [D] | provenance | | -| main.rs:373:9:373:9 | e [D] | main.rs:374:5:374:5 | e [D] | provenance | | +| main.rs:373:9:373:9 | e [D] | main.rs:374:5:374:5 | e | provenance | Sink:MaD:1 | +| main.rs:373:9:373:9 | e [D] | main.rs:374:5:374:5 | e | provenance | Sink:MaD:1 | | main.rs:373:13:373:41 | ...::D {...} [D] | main.rs:373:9:373:9 | e [D] | provenance | | | main.rs:373:13:373:41 | ...::D {...} [D] | main.rs:373:9:373:9 | e [D] | provenance | | | main.rs:373:39:373:39 | s | main.rs:373:13:373:41 | ...::D {...} [D] | provenance | | | main.rs:373:39:373:39 | s | main.rs:373:13:373:41 | ...::D {...} [D] | provenance | | -| main.rs:374:5:374:5 | e [D] | main.rs:374:7:374:10 | sink | provenance | MaD:1 Sink:MaD:1 | -| main.rs:374:5:374:5 | e [D] | main.rs:374:7:374:10 | sink | provenance | MaD:1 Sink:MaD:1 | | main.rs:383:9:383:9 | s | main.rs:384:10:384:10 | s | provenance | | | main.rs:383:9:383:9 | s | main.rs:384:10:384:10 | s | provenance | | -| main.rs:383:13:383:25 | simple_source | main.rs:383:13:383:29 | simple_source(...) | provenance | Src:MaD:13 MaD:13 | -| main.rs:383:13:383:25 | simple_source | main.rs:383:13:383:29 | simple_source(...) | provenance | Src:MaD:13 MaD:13 | -| main.rs:383:13:383:29 | simple_source(...) | main.rs:383:9:383:9 | s | provenance | | -| main.rs:383:13:383:29 | simple_source(...) | main.rs:383:9:383:9 | s | provenance | | -| main.rs:391:9:391:9 | s | main.rs:392:17:392:17 | s | provenance | | -| main.rs:391:9:391:9 | s | main.rs:392:17:392:17 | s | provenance | | +| main.rs:383:13:383:29 | simple_source(...) | main.rs:383:9:383:9 | s | provenance | Src:MaD:16 | +| main.rs:383:13:383:29 | simple_source(...) | main.rs:383:9:383:9 | s | provenance | Src:MaD:16 | +| main.rs:391:9:391:9 | s | main.rs:392:17:392:17 | s | provenance | Sink:MaD:6 | +| main.rs:391:9:391:9 | s | main.rs:392:17:392:17 | s | provenance | Sink:MaD:6 | | main.rs:391:13:391:22 | source(...) | main.rs:391:9:391:9 | s | provenance | | | main.rs:391:13:391:22 | source(...) | main.rs:391:9:391:9 | s | provenance | | -| main.rs:392:17:392:17 | s | main.rs:392:5:392:15 | simple_sink | provenance | MaD:6 Sink:MaD:6 | -| main.rs:392:17:392:17 | s | main.rs:392:5:392:15 | simple_sink | provenance | MaD:6 Sink:MaD:6 | -| main.rs:400:5:400:14 | arg_source | main.rs:400:16:400:16 | [post] i | provenance | Src:MaD:8 MaD:8 | -| main.rs:400:5:400:14 | arg_source | main.rs:400:16:400:16 | [post] i | provenance | Src:MaD:8 MaD:8 | -| main.rs:400:16:400:16 | [post] i | main.rs:401:10:401:10 | i | provenance | | -| main.rs:400:16:400:16 | [post] i | main.rs:401:10:401:10 | i | provenance | | +| main.rs:400:16:400:16 | i | main.rs:401:10:401:10 | i | provenance | Src:MaD:11 | +| main.rs:400:16:400:16 | i | main.rs:401:10:401:10 | i | provenance | Src:MaD:11 | +| main.rs:410:26:410:31 | ...: i64 | main.rs:411:14:411:14 | i | provenance | Src:MaD:9 | +| main.rs:410:26:410:31 | ...: i64 | main.rs:411:14:411:14 | i | provenance | Src:MaD:9 | | main.rs:464:9:464:10 | x1 | main.rs:465:10:465:11 | x1 | provenance | | | main.rs:464:9:464:10 | x1 | main.rs:465:10:465:11 | x1 | provenance | | -| main.rs:464:14:464:23 | source(...) | main.rs:464:14:464:30 | ... .max(...) | provenance | MaD:16 | -| main.rs:464:14:464:23 | source(...) | main.rs:464:14:464:30 | ... .max(...) | provenance | MaD:16 | +| main.rs:464:14:464:23 | source(...) | main.rs:464:14:464:30 | ... .max(...) | provenance | MaD:19 | +| main.rs:464:14:464:23 | source(...) | main.rs:464:14:464:30 | ... .max(...) | provenance | MaD:19 | | main.rs:464:14:464:30 | ... .max(...) | main.rs:464:9:464:10 | x1 | provenance | | | main.rs:464:14:464:30 | ... .max(...) | main.rs:464:9:464:10 | x1 | provenance | | | main.rs:467:9:467:10 | x2 [MyStruct.field1] | main.rs:475:10:475:11 | x2 [MyStruct.field1] | provenance | | | main.rs:467:9:467:10 | x2 [MyStruct.field1] | main.rs:475:10:475:11 | x2 [MyStruct.field1] | provenance | | | main.rs:467:14:474:6 | ... .max(...) [MyStruct.field1] | main.rs:467:9:467:10 | x2 [MyStruct.field1] | provenance | | | main.rs:467:14:474:6 | ... .max(...) [MyStruct.field1] | main.rs:467:9:467:10 | x2 [MyStruct.field1] | provenance | | -| main.rs:467:15:470:5 | MyStruct {...} [MyStruct.field1] | main.rs:467:14:474:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:16 | -| main.rs:467:15:470:5 | MyStruct {...} [MyStruct.field1] | main.rs:467:14:474:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:16 | +| main.rs:467:15:470:5 | MyStruct {...} [MyStruct.field1] | main.rs:467:14:474:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:19 | +| main.rs:467:15:470:5 | MyStruct {...} [MyStruct.field1] | main.rs:467:14:474:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:19 | | main.rs:468:17:468:26 | source(...) | main.rs:467:15:470:5 | MyStruct {...} [MyStruct.field1] | provenance | | | main.rs:468:17:468:26 | source(...) | main.rs:467:15:470:5 | MyStruct {...} [MyStruct.field1] | provenance | | | main.rs:475:10:475:11 | x2 [MyStruct.field1] | main.rs:475:10:475:18 | x2.field1 | provenance | | | main.rs:475:10:475:11 | x2 [MyStruct.field1] | main.rs:475:10:475:18 | x2.field1 | provenance | | | main.rs:480:9:480:10 | x4 | main.rs:481:10:481:11 | x4 | provenance | | | main.rs:480:9:480:10 | x4 | main.rs:481:10:481:11 | x4 | provenance | | -| main.rs:480:14:480:23 | source(...) | main.rs:480:14:480:30 | ... .max(...) | provenance | MaD:16 | -| main.rs:480:14:480:23 | source(...) | main.rs:480:14:480:30 | ... .max(...) | provenance | MaD:16 | +| main.rs:480:14:480:23 | source(...) | main.rs:480:14:480:30 | ... .max(...) | provenance | MaD:19 | +| main.rs:480:14:480:23 | source(...) | main.rs:480:14:480:30 | ... .max(...) | provenance | MaD:19 | | main.rs:480:14:480:30 | ... .max(...) | main.rs:480:9:480:10 | x4 | provenance | | | main.rs:480:14:480:30 | ... .max(...) | main.rs:480:9:480:10 | x4 | provenance | | | main.rs:483:9:483:10 | x5 | main.rs:484:10:484:11 | x5 | provenance | | -| main.rs:483:14:483:23 | source(...) | main.rs:483:14:483:30 | ... .lt(...) | provenance | MaD:17 | +| main.rs:483:14:483:23 | source(...) | main.rs:483:14:483:30 | ... .lt(...) | provenance | MaD:20 | | main.rs:483:14:483:30 | ... .lt(...) | main.rs:483:9:483:10 | x5 | provenance | | | main.rs:486:9:486:10 | x6 | main.rs:487:10:487:11 | x6 | provenance | | -| main.rs:486:14:486:23 | source(...) | main.rs:486:14:486:27 | ... < ... | provenance | MaD:17 | +| main.rs:486:14:486:23 | source(...) | main.rs:486:14:486:27 | ... < ... | provenance | MaD:20 | | main.rs:486:14:486:27 | ... < ... | main.rs:486:9:486:10 | x6 | provenance | | -| main.rs:502:10:502:25 | generated_source | main.rs:502:10:502:28 | generated_source(...) | provenance | Src:MaD:11 MaD:11 | -| main.rs:502:10:502:25 | generated_source | main.rs:502:10:502:28 | generated_source(...) | provenance | Src:MaD:11 MaD:11 | -| main.rs:504:10:504:30 | neutral_manual_source | main.rs:504:10:504:33 | neutral_manual_source(...) | provenance | Src:MaD:12 MaD:12 | -| main.rs:504:10:504:30 | neutral_manual_source | main.rs:504:10:504:33 | neutral_manual_source(...) | provenance | Src:MaD:12 MaD:12 | -| main.rs:505:20:505:28 | source(...) | main.rs:505:5:505:18 | generated_sink | provenance | MaD:4 Sink:MaD:4 | -| main.rs:505:20:505:28 | source(...) | main.rs:505:5:505:18 | generated_sink | provenance | MaD:4 Sink:MaD:4 | -| main.rs:507:25:507:33 | source(...) | main.rs:507:5:507:23 | neutral_manual_sink | provenance | MaD:5 Sink:MaD:5 | -| main.rs:507:25:507:33 | source(...) | main.rs:507:5:507:23 | neutral_manual_sink | provenance | MaD:5 Sink:MaD:5 | -| main.rs:508:28:508:36 | source(...) | main.rs:508:10:508:37 | generated_summary(...) | provenance | MaD:22 | -| main.rs:508:28:508:36 | source(...) | main.rs:508:10:508:37 | generated_summary(...) | provenance | MaD:22 | -| main.rs:510:33:510:41 | source(...) | main.rs:510:10:510:42 | neutral_manual_summary(...) | provenance | MaD:23 | -| main.rs:510:33:510:41 | source(...) | main.rs:510:10:510:42 | neutral_manual_summary(...) | provenance | MaD:23 | +| main.rs:502:10:502:28 | generated_source(...) | main.rs:502:10:502:28 | generated_source(...) | provenance | Src:MaD:14 | +| main.rs:502:10:502:28 | generated_source(...) | main.rs:502:10:502:28 | generated_source(...) | provenance | Src:MaD:14 | +| main.rs:504:10:504:33 | neutral_manual_source(...) | main.rs:504:10:504:33 | neutral_manual_source(...) | provenance | Src:MaD:15 | +| main.rs:504:10:504:33 | neutral_manual_source(...) | main.rs:504:10:504:33 | neutral_manual_source(...) | provenance | Src:MaD:15 | +| main.rs:505:20:505:28 | source(...) | main.rs:505:20:505:28 | source(...) | provenance | Sink:MaD:4 | +| main.rs:505:20:505:28 | source(...) | main.rs:505:20:505:28 | source(...) | provenance | Sink:MaD:4 | +| main.rs:507:25:507:33 | source(...) | main.rs:507:25:507:33 | source(...) | provenance | Sink:MaD:5 | +| main.rs:507:25:507:33 | source(...) | main.rs:507:25:507:33 | source(...) | provenance | Sink:MaD:5 | +| main.rs:508:28:508:36 | source(...) | main.rs:508:10:508:37 | generated_summary(...) | provenance | MaD:25 | +| main.rs:508:28:508:36 | source(...) | main.rs:508:10:508:37 | generated_summary(...) | provenance | MaD:25 | +| main.rs:510:33:510:41 | source(...) | main.rs:510:10:510:42 | neutral_manual_summary(...) | provenance | MaD:26 | +| main.rs:510:33:510:41 | source(...) | main.rs:510:10:510:42 | neutral_manual_summary(...) | provenance | MaD:26 | nodes | main.rs:15:9:15:9 | s | semmle.label | s | | main.rs:15:9:15:9 | s | semmle.label | s | @@ -603,10 +604,8 @@ nodes | main.rs:233:10:233:10 | t | semmle.label | t | | main.rs:257:9:257:9 | s [D] | semmle.label | s [D] | | main.rs:257:9:257:9 | s [D] | semmle.label | s [D] | -| main.rs:257:13:257:23 | enum_source | semmle.label | enum_source | -| main.rs:257:13:257:23 | enum_source | semmle.label | enum_source | -| main.rs:257:13:257:27 | enum_source(...) [D] | semmle.label | enum_source(...) [D] | -| main.rs:257:13:257:27 | enum_source(...) [D] | semmle.label | enum_source(...) [D] | +| main.rs:257:13:257:27 | enum_source(...) | semmle.label | enum_source(...) | +| main.rs:257:13:257:27 | enum_source(...) | semmle.label | enum_source(...) | | main.rs:258:11:258:11 | s [D] | semmle.label | s [D] | | main.rs:258:11:258:11 | s [D] | semmle.label | s [D] | | main.rs:260:9:260:37 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | @@ -617,10 +616,8 @@ nodes | main.rs:260:47:260:47 | i | semmle.label | i | | main.rs:264:9:264:9 | s [E, Some] | semmle.label | s [E, Some] | | main.rs:264:9:264:9 | s [E, Some] | semmle.label | s [E, Some] | -| main.rs:264:13:264:30 | enum_source_nested | semmle.label | enum_source_nested | -| main.rs:264:13:264:30 | enum_source_nested | semmle.label | enum_source_nested | -| main.rs:264:13:264:34 | enum_source_nested(...) [E, Some] | semmle.label | enum_source_nested(...) [E, Some] | -| main.rs:264:13:264:34 | enum_source_nested(...) [E, Some] | semmle.label | enum_source_nested(...) [E, Some] | +| main.rs:264:13:264:34 | enum_source_nested(...) | semmle.label | enum_source_nested(...) | +| main.rs:264:13:264:34 | enum_source_nested(...) | semmle.label | enum_source_nested(...) | | main.rs:265:11:265:11 | s [E, Some] | semmle.label | s [E, Some] | | main.rs:265:11:265:11 | s [E, Some] | semmle.label | s [E, Some] | | main.rs:268:9:268:37 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | @@ -637,10 +634,8 @@ nodes | main.rs:271:33:271:33 | i | semmle.label | i | | main.rs:280:9:280:9 | s [C] | semmle.label | s [C] | | main.rs:280:9:280:9 | s [C] | semmle.label | s [C] | -| main.rs:280:13:280:24 | e.source(...) [C] | semmle.label | e.source(...) [C] | -| main.rs:280:13:280:24 | e.source(...) [C] | semmle.label | e.source(...) [C] | -| main.rs:280:15:280:20 | source | semmle.label | source | -| main.rs:280:15:280:20 | source | semmle.label | source | +| main.rs:280:13:280:24 | e.source(...) | semmle.label | e.source(...) | +| main.rs:280:13:280:24 | e.source(...) | semmle.label | e.source(...) | | main.rs:281:11:281:11 | s [C] | semmle.label | s [C] | | main.rs:281:11:281:11 | s [C] | semmle.label | s [C] | | main.rs:282:9:282:37 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | @@ -649,34 +644,26 @@ nodes | main.rs:282:35:282:35 | i | semmle.label | i | | main.rs:282:47:282:47 | i | semmle.label | i | | main.rs:282:47:282:47 | i | semmle.label | i | -| main.rs:303:18:303:18 | ... | semmle.label | ... | -| main.rs:303:18:303:18 | ... | semmle.label | ... | | main.rs:303:26:303:26 | a | semmle.label | a | | main.rs:303:26:303:26 | a | semmle.label | a | -| main.rs:304:9:304:19 | pass_source | semmle.label | pass_source | -| main.rs:304:9:304:19 | pass_source | semmle.label | pass_source | -| main.rs:306:9:306:19 | pass_source | semmle.label | pass_source | -| main.rs:306:9:306:19 | pass_source | semmle.label | pass_source | -| main.rs:306:25:306:25 | ... | semmle.label | ... | -| main.rs:306:25:306:25 | ... | semmle.label | ... | +| main.rs:304:24:304:24 | a | semmle.label | a | +| main.rs:304:24:304:24 | a | semmle.label | a | +| main.rs:306:24:308:9 | \|...\| ... | semmle.label | \|...\| ... | +| main.rs:306:24:308:9 | \|...\| ... | semmle.label | \|...\| ... | | main.rs:307:18:307:18 | a | semmle.label | a | | main.rs:307:18:307:18 | a | semmle.label | a | -| main.rs:310:14:310:19 | ...: i64 | semmle.label | ...: i64 | -| main.rs:310:14:310:19 | ...: i64 | semmle.label | ...: i64 | | main.rs:311:18:311:18 | a | semmle.label | a | | main.rs:311:18:311:18 | a | semmle.label | a | -| main.rs:313:9:313:19 | pass_source | semmle.label | pass_source | -| main.rs:313:9:313:19 | pass_source | semmle.label | pass_source | -| main.rs:315:9:315:19 | pass_source | semmle.label | pass_source | -| main.rs:315:9:315:19 | pass_source | semmle.label | pass_source | -| main.rs:315:36:315:36 | ... | semmle.label | ... | -| main.rs:315:36:315:36 | ... | semmle.label | ... | +| main.rs:313:24:313:24 | f | semmle.label | f | +| main.rs:313:24:313:24 | f | semmle.label | f | +| main.rs:315:24:317:9 | \|...\| ... | semmle.label | \|...\| ... | +| main.rs:315:24:317:9 | \|...\| ... | semmle.label | \|...\| ... | | main.rs:316:18:316:18 | a | semmle.label | a | | main.rs:316:18:316:18 | a | semmle.label | a | -| main.rs:319:9:319:26 | pass_source_nested | semmle.label | pass_source_nested | -| main.rs:319:9:319:26 | pass_source_nested | semmle.label | pass_source_nested | -| main.rs:319:32:319:32 | ... [E, Some] | semmle.label | ... [E, Some] | -| main.rs:319:32:319:32 | ... [E, Some] | semmle.label | ... [E, Some] | +| main.rs:319:31:331:9 | \|...\| ... | semmle.label | \|...\| ... | +| main.rs:319:31:331:9 | \|...\| ... | semmle.label | \|...\| ... | +| main.rs:319:31:331:9 | \|...\| ... [E, Some] | semmle.label | \|...\| ... [E, Some] | +| main.rs:319:31:331:9 | \|...\| ... [E, Some] | semmle.label | \|...\| ... [E, Some] | | main.rs:320:19:320:19 | e [E, Some] | semmle.label | e [E, Some] | | main.rs:320:19:320:19 | e [E, Some] | semmle.label | e [E, Some] | | main.rs:323:17:323:45 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | @@ -691,20 +678,42 @@ nodes | main.rs:326:30:326:30 | i | semmle.label | i | | main.rs:326:41:326:41 | i | semmle.label | i | | main.rs:326:41:326:41 | i | semmle.label | i | +| main.rs:346:21:346:29 | source(...) | semmle.label | source(...) | +| main.rs:346:21:346:29 | source(...) | semmle.label | source(...) | +| main.rs:347:19:347:19 | a | semmle.label | a | +| main.rs:347:19:347:19 | a | semmle.label | a | +| main.rs:350:17:350:17 | s | semmle.label | s | +| main.rs:350:17:350:17 | s | semmle.label | s | +| main.rs:350:21:350:29 | source(...) | semmle.label | source(...) | +| main.rs:350:21:350:29 | source(...) | semmle.label | source(...) | +| main.rs:351:13:351:55 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | +| main.rs:351:13:351:55 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | +| main.rs:351:39:351:53 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | +| main.rs:351:39:351:53 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | +| main.rs:351:52:351:52 | s | semmle.label | s | +| main.rs:351:52:351:52 | s | semmle.label | s | +| main.rs:353:26:353:26 | b | semmle.label | b | +| main.rs:353:26:353:26 | b | semmle.label | b | +| main.rs:353:26:353:26 | b [E, Some] | semmle.label | b [E, Some] | +| main.rs:353:26:353:26 | b [E, Some] | semmle.label | b [E, Some] | +| main.rs:353:26:353:26 | b [Some] | semmle.label | b [Some] | +| main.rs:353:26:353:26 | b [Some] | semmle.label | b [Some] | | main.rs:364:9:364:9 | s | semmle.label | s | | main.rs:364:9:364:9 | s | semmle.label | s | | main.rs:364:13:364:22 | source(...) | semmle.label | source(...) | | main.rs:364:13:364:22 | source(...) | semmle.label | source(...) | -| main.rs:365:5:365:13 | enum_sink | semmle.label | enum_sink | -| main.rs:365:5:365:13 | enum_sink | semmle.label | enum_sink | +| main.rs:365:15:365:43 | ...::C {...} | semmle.label | ...::C {...} | +| main.rs:365:15:365:43 | ...::C {...} | semmle.label | ...::C {...} | | main.rs:365:15:365:43 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | | main.rs:365:15:365:43 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | | main.rs:365:41:365:41 | s | semmle.label | s | | main.rs:365:41:365:41 | s | semmle.label | s | -| main.rs:368:5:368:20 | enum_sink_nested | semmle.label | enum_sink_nested | -| main.rs:368:5:368:20 | enum_sink_nested | semmle.label | enum_sink_nested | +| main.rs:368:22:368:56 | ...::E {...} | semmle.label | ...::E {...} | +| main.rs:368:22:368:56 | ...::E {...} | semmle.label | ...::E {...} | | main.rs:368:22:368:56 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | | main.rs:368:22:368:56 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | +| main.rs:368:22:368:56 | ...::E {...} [Some] | semmle.label | ...::E {...} [Some] | +| main.rs:368:22:368:56 | ...::E {...} [Some] | semmle.label | ...::E {...} [Some] | | main.rs:368:48:368:54 | Some(...) [Some] | semmle.label | Some(...) [Some] | | main.rs:368:48:368:54 | Some(...) [Some] | semmle.label | Some(...) [Some] | | main.rs:368:53:368:53 | s | semmle.label | s | @@ -719,14 +728,10 @@ nodes | main.rs:373:13:373:41 | ...::D {...} [D] | semmle.label | ...::D {...} [D] | | main.rs:373:39:373:39 | s | semmle.label | s | | main.rs:373:39:373:39 | s | semmle.label | s | -| main.rs:374:5:374:5 | e [D] | semmle.label | e [D] | -| main.rs:374:5:374:5 | e [D] | semmle.label | e [D] | -| main.rs:374:7:374:10 | sink | semmle.label | sink | -| main.rs:374:7:374:10 | sink | semmle.label | sink | +| main.rs:374:5:374:5 | e | semmle.label | e | +| main.rs:374:5:374:5 | e | semmle.label | e | | main.rs:383:9:383:9 | s | semmle.label | s | | main.rs:383:9:383:9 | s | semmle.label | s | -| main.rs:383:13:383:25 | simple_source | semmle.label | simple_source | -| main.rs:383:13:383:25 | simple_source | semmle.label | simple_source | | main.rs:383:13:383:29 | simple_source(...) | semmle.label | simple_source(...) | | main.rs:383:13:383:29 | simple_source(...) | semmle.label | simple_source(...) | | main.rs:384:10:384:10 | s | semmle.label | s | @@ -735,16 +740,16 @@ nodes | main.rs:391:9:391:9 | s | semmle.label | s | | main.rs:391:13:391:22 | source(...) | semmle.label | source(...) | | main.rs:391:13:391:22 | source(...) | semmle.label | source(...) | -| main.rs:392:5:392:15 | simple_sink | semmle.label | simple_sink | -| main.rs:392:5:392:15 | simple_sink | semmle.label | simple_sink | | main.rs:392:17:392:17 | s | semmle.label | s | | main.rs:392:17:392:17 | s | semmle.label | s | -| main.rs:400:5:400:14 | arg_source | semmle.label | arg_source | -| main.rs:400:5:400:14 | arg_source | semmle.label | arg_source | -| main.rs:400:16:400:16 | [post] i | semmle.label | [post] i | -| main.rs:400:16:400:16 | [post] i | semmle.label | [post] i | +| main.rs:400:16:400:16 | i | semmle.label | i | +| main.rs:400:16:400:16 | i | semmle.label | i | | main.rs:401:10:401:10 | i | semmle.label | i | | main.rs:401:10:401:10 | i | semmle.label | i | +| main.rs:410:26:410:31 | ...: i64 | semmle.label | ...: i64 | +| main.rs:410:26:410:31 | ...: i64 | semmle.label | ...: i64 | +| main.rs:411:14:411:14 | i | semmle.label | i | +| main.rs:411:14:411:14 | i | semmle.label | i | | main.rs:464:9:464:10 | x1 | semmle.label | x1 | | main.rs:464:9:464:10 | x1 | semmle.label | x1 | | main.rs:464:14:464:23 | source(...) | semmle.label | source(...) | @@ -781,20 +786,20 @@ nodes | main.rs:486:14:486:23 | source(...) | semmle.label | source(...) | | main.rs:486:14:486:27 | ... < ... | semmle.label | ... < ... | | main.rs:487:10:487:11 | x6 | semmle.label | x6 | -| main.rs:502:10:502:25 | generated_source | semmle.label | generated_source | -| main.rs:502:10:502:25 | generated_source | semmle.label | generated_source | | main.rs:502:10:502:28 | generated_source(...) | semmle.label | generated_source(...) | | main.rs:502:10:502:28 | generated_source(...) | semmle.label | generated_source(...) | -| main.rs:504:10:504:30 | neutral_manual_source | semmle.label | neutral_manual_source | -| main.rs:504:10:504:30 | neutral_manual_source | semmle.label | neutral_manual_source | +| main.rs:502:10:502:28 | generated_source(...) | semmle.label | generated_source(...) | +| main.rs:502:10:502:28 | generated_source(...) | semmle.label | generated_source(...) | +| main.rs:504:10:504:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | +| main.rs:504:10:504:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | | main.rs:504:10:504:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | | main.rs:504:10:504:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | -| main.rs:505:5:505:18 | generated_sink | semmle.label | generated_sink | -| main.rs:505:5:505:18 | generated_sink | semmle.label | generated_sink | | main.rs:505:20:505:28 | source(...) | semmle.label | source(...) | | main.rs:505:20:505:28 | source(...) | semmle.label | source(...) | -| main.rs:507:5:507:23 | neutral_manual_sink | semmle.label | neutral_manual_sink | -| main.rs:507:5:507:23 | neutral_manual_sink | semmle.label | neutral_manual_sink | +| main.rs:505:20:505:28 | source(...) | semmle.label | source(...) | +| main.rs:505:20:505:28 | source(...) | semmle.label | source(...) | +| main.rs:507:25:507:33 | source(...) | semmle.label | source(...) | +| main.rs:507:25:507:33 | source(...) | semmle.label | source(...) | | main.rs:507:25:507:33 | source(...) | semmle.label | source(...) | | main.rs:507:25:507:33 | source(...) | semmle.label | source(...) | | main.rs:508:10:508:37 | generated_summary(...) | semmle.label | generated_summary(...) | @@ -846,34 +851,40 @@ invalidSpecComponent | main.rs:222:10:222:10 | t | main.rs:219:13:219:22 | source(...) | main.rs:222:10:222:10 | t | $@ | main.rs:219:13:219:22 | source(...) | source(...) | | main.rs:233:10:233:10 | t | main.rs:231:13:231:22 | source(...) | main.rs:233:10:233:10 | t | $@ | main.rs:231:13:231:22 | source(...) | source(...) | | main.rs:233:10:233:10 | t | main.rs:231:13:231:22 | source(...) | main.rs:233:10:233:10 | t | $@ | main.rs:231:13:231:22 | source(...) | source(...) | -| main.rs:260:47:260:47 | i | main.rs:257:13:257:23 | enum_source | main.rs:260:47:260:47 | i | $@ | main.rs:257:13:257:23 | enum_source | enum_source | -| main.rs:260:47:260:47 | i | main.rs:257:13:257:23 | enum_source | main.rs:260:47:260:47 | i | $@ | main.rs:257:13:257:23 | enum_source | enum_source | -| main.rs:271:33:271:33 | i | main.rs:264:13:264:30 | enum_source_nested | main.rs:271:33:271:33 | i | $@ | main.rs:264:13:264:30 | enum_source_nested | enum_source_nested | -| main.rs:271:33:271:33 | i | main.rs:264:13:264:30 | enum_source_nested | main.rs:271:33:271:33 | i | $@ | main.rs:264:13:264:30 | enum_source_nested | enum_source_nested | -| main.rs:282:47:282:47 | i | main.rs:280:15:280:20 | source | main.rs:282:47:282:47 | i | $@ | main.rs:280:15:280:20 | source | source | -| main.rs:282:47:282:47 | i | main.rs:280:15:280:20 | source | main.rs:282:47:282:47 | i | $@ | main.rs:280:15:280:20 | source | source | -| main.rs:303:26:303:26 | a | main.rs:304:9:304:19 | pass_source | main.rs:303:26:303:26 | a | $@ | main.rs:304:9:304:19 | pass_source | pass_source | -| main.rs:303:26:303:26 | a | main.rs:304:9:304:19 | pass_source | main.rs:303:26:303:26 | a | $@ | main.rs:304:9:304:19 | pass_source | pass_source | -| main.rs:307:18:307:18 | a | main.rs:306:9:306:19 | pass_source | main.rs:307:18:307:18 | a | $@ | main.rs:306:9:306:19 | pass_source | pass_source | -| main.rs:307:18:307:18 | a | main.rs:306:9:306:19 | pass_source | main.rs:307:18:307:18 | a | $@ | main.rs:306:9:306:19 | pass_source | pass_source | -| main.rs:311:18:311:18 | a | main.rs:313:9:313:19 | pass_source | main.rs:311:18:311:18 | a | $@ | main.rs:313:9:313:19 | pass_source | pass_source | -| main.rs:311:18:311:18 | a | main.rs:313:9:313:19 | pass_source | main.rs:311:18:311:18 | a | $@ | main.rs:313:9:313:19 | pass_source | pass_source | -| main.rs:316:18:316:18 | a | main.rs:315:9:315:19 | pass_source | main.rs:316:18:316:18 | a | $@ | main.rs:315:9:315:19 | pass_source | pass_source | -| main.rs:316:18:316:18 | a | main.rs:315:9:315:19 | pass_source | main.rs:316:18:316:18 | a | $@ | main.rs:315:9:315:19 | pass_source | pass_source | -| main.rs:326:41:326:41 | i | main.rs:319:9:319:26 | pass_source_nested | main.rs:326:41:326:41 | i | $@ | main.rs:319:9:319:26 | pass_source_nested | pass_source_nested | -| main.rs:326:41:326:41 | i | main.rs:319:9:319:26 | pass_source_nested | main.rs:326:41:326:41 | i | $@ | main.rs:319:9:319:26 | pass_source_nested | pass_source_nested | -| main.rs:365:5:365:13 | enum_sink | main.rs:364:13:364:22 | source(...) | main.rs:365:5:365:13 | enum_sink | $@ | main.rs:364:13:364:22 | source(...) | source(...) | -| main.rs:365:5:365:13 | enum_sink | main.rs:364:13:364:22 | source(...) | main.rs:365:5:365:13 | enum_sink | $@ | main.rs:364:13:364:22 | source(...) | source(...) | -| main.rs:368:5:368:20 | enum_sink_nested | main.rs:364:13:364:22 | source(...) | main.rs:368:5:368:20 | enum_sink_nested | $@ | main.rs:364:13:364:22 | source(...) | source(...) | -| main.rs:368:5:368:20 | enum_sink_nested | main.rs:364:13:364:22 | source(...) | main.rs:368:5:368:20 | enum_sink_nested | $@ | main.rs:364:13:364:22 | source(...) | source(...) | -| main.rs:374:7:374:10 | sink | main.rs:372:13:372:22 | source(...) | main.rs:374:7:374:10 | sink | $@ | main.rs:372:13:372:22 | source(...) | source(...) | -| main.rs:374:7:374:10 | sink | main.rs:372:13:372:22 | source(...) | main.rs:374:7:374:10 | sink | $@ | main.rs:372:13:372:22 | source(...) | source(...) | -| main.rs:384:10:384:10 | s | main.rs:383:13:383:25 | simple_source | main.rs:384:10:384:10 | s | $@ | main.rs:383:13:383:25 | simple_source | simple_source | -| main.rs:384:10:384:10 | s | main.rs:383:13:383:25 | simple_source | main.rs:384:10:384:10 | s | $@ | main.rs:383:13:383:25 | simple_source | simple_source | -| main.rs:392:5:392:15 | simple_sink | main.rs:391:13:391:22 | source(...) | main.rs:392:5:392:15 | simple_sink | $@ | main.rs:391:13:391:22 | source(...) | source(...) | -| main.rs:392:5:392:15 | simple_sink | main.rs:391:13:391:22 | source(...) | main.rs:392:5:392:15 | simple_sink | $@ | main.rs:391:13:391:22 | source(...) | source(...) | -| main.rs:401:10:401:10 | i | main.rs:400:5:400:14 | arg_source | main.rs:401:10:401:10 | i | $@ | main.rs:400:5:400:14 | arg_source | arg_source | -| main.rs:401:10:401:10 | i | main.rs:400:5:400:14 | arg_source | main.rs:401:10:401:10 | i | $@ | main.rs:400:5:400:14 | arg_source | arg_source | +| main.rs:260:47:260:47 | i | main.rs:257:13:257:27 | enum_source(...) | main.rs:260:47:260:47 | i | $@ | main.rs:257:13:257:27 | enum_source(...) | enum_source(...) | +| main.rs:260:47:260:47 | i | main.rs:257:13:257:27 | enum_source(...) | main.rs:260:47:260:47 | i | $@ | main.rs:257:13:257:27 | enum_source(...) | enum_source(...) | +| main.rs:271:33:271:33 | i | main.rs:264:13:264:34 | enum_source_nested(...) | main.rs:271:33:271:33 | i | $@ | main.rs:264:13:264:34 | enum_source_nested(...) | enum_source_nested(...) | +| main.rs:271:33:271:33 | i | main.rs:264:13:264:34 | enum_source_nested(...) | main.rs:271:33:271:33 | i | $@ | main.rs:264:13:264:34 | enum_source_nested(...) | enum_source_nested(...) | +| main.rs:282:47:282:47 | i | main.rs:280:13:280:24 | e.source(...) | main.rs:282:47:282:47 | i | $@ | main.rs:280:13:280:24 | e.source(...) | e.source(...) | +| main.rs:282:47:282:47 | i | main.rs:280:13:280:24 | e.source(...) | main.rs:282:47:282:47 | i | $@ | main.rs:280:13:280:24 | e.source(...) | e.source(...) | +| main.rs:303:26:303:26 | a | main.rs:304:24:304:24 | a | main.rs:303:26:303:26 | a | $@ | main.rs:304:24:304:24 | a | a | +| main.rs:303:26:303:26 | a | main.rs:304:24:304:24 | a | main.rs:303:26:303:26 | a | $@ | main.rs:304:24:304:24 | a | a | +| main.rs:307:18:307:18 | a | main.rs:306:24:308:9 | \|...\| ... | main.rs:307:18:307:18 | a | $@ | main.rs:306:24:308:9 | \|...\| ... | \|...\| ... | +| main.rs:307:18:307:18 | a | main.rs:306:24:308:9 | \|...\| ... | main.rs:307:18:307:18 | a | $@ | main.rs:306:24:308:9 | \|...\| ... | \|...\| ... | +| main.rs:311:18:311:18 | a | main.rs:313:24:313:24 | f | main.rs:311:18:311:18 | a | $@ | main.rs:313:24:313:24 | f | f | +| main.rs:311:18:311:18 | a | main.rs:313:24:313:24 | f | main.rs:311:18:311:18 | a | $@ | main.rs:313:24:313:24 | f | f | +| main.rs:316:18:316:18 | a | main.rs:315:24:317:9 | \|...\| ... | main.rs:316:18:316:18 | a | $@ | main.rs:315:24:317:9 | \|...\| ... | \|...\| ... | +| main.rs:316:18:316:18 | a | main.rs:315:24:317:9 | \|...\| ... | main.rs:316:18:316:18 | a | $@ | main.rs:315:24:317:9 | \|...\| ... | \|...\| ... | +| main.rs:326:41:326:41 | i | main.rs:319:31:331:9 | \|...\| ... | main.rs:326:41:326:41 | i | $@ | main.rs:319:31:331:9 | \|...\| ... | \|...\| ... | +| main.rs:326:41:326:41 | i | main.rs:319:31:331:9 | \|...\| ... | main.rs:326:41:326:41 | i | $@ | main.rs:319:31:331:9 | \|...\| ... | \|...\| ... | +| main.rs:347:19:347:19 | a | main.rs:346:21:346:29 | source(...) | main.rs:347:19:347:19 | a | $@ | main.rs:346:21:346:29 | source(...) | source(...) | +| main.rs:347:19:347:19 | a | main.rs:346:21:346:29 | source(...) | main.rs:347:19:347:19 | a | $@ | main.rs:346:21:346:29 | source(...) | source(...) | +| main.rs:353:26:353:26 | b | main.rs:350:21:350:29 | source(...) | main.rs:353:26:353:26 | b | $@ | main.rs:350:21:350:29 | source(...) | source(...) | +| main.rs:353:26:353:26 | b | main.rs:350:21:350:29 | source(...) | main.rs:353:26:353:26 | b | $@ | main.rs:350:21:350:29 | source(...) | source(...) | +| main.rs:365:15:365:43 | ...::C {...} | main.rs:364:13:364:22 | source(...) | main.rs:365:15:365:43 | ...::C {...} | $@ | main.rs:364:13:364:22 | source(...) | source(...) | +| main.rs:365:15:365:43 | ...::C {...} | main.rs:364:13:364:22 | source(...) | main.rs:365:15:365:43 | ...::C {...} | $@ | main.rs:364:13:364:22 | source(...) | source(...) | +| main.rs:368:22:368:56 | ...::E {...} | main.rs:364:13:364:22 | source(...) | main.rs:368:22:368:56 | ...::E {...} | $@ | main.rs:364:13:364:22 | source(...) | source(...) | +| main.rs:368:22:368:56 | ...::E {...} | main.rs:364:13:364:22 | source(...) | main.rs:368:22:368:56 | ...::E {...} | $@ | main.rs:364:13:364:22 | source(...) | source(...) | +| main.rs:374:5:374:5 | e | main.rs:372:13:372:22 | source(...) | main.rs:374:5:374:5 | e | $@ | main.rs:372:13:372:22 | source(...) | source(...) | +| main.rs:374:5:374:5 | e | main.rs:372:13:372:22 | source(...) | main.rs:374:5:374:5 | e | $@ | main.rs:372:13:372:22 | source(...) | source(...) | +| main.rs:384:10:384:10 | s | main.rs:383:13:383:29 | simple_source(...) | main.rs:384:10:384:10 | s | $@ | main.rs:383:13:383:29 | simple_source(...) | simple_source(...) | +| main.rs:384:10:384:10 | s | main.rs:383:13:383:29 | simple_source(...) | main.rs:384:10:384:10 | s | $@ | main.rs:383:13:383:29 | simple_source(...) | simple_source(...) | +| main.rs:392:17:392:17 | s | main.rs:391:13:391:22 | source(...) | main.rs:392:17:392:17 | s | $@ | main.rs:391:13:391:22 | source(...) | source(...) | +| main.rs:392:17:392:17 | s | main.rs:391:13:391:22 | source(...) | main.rs:392:17:392:17 | s | $@ | main.rs:391:13:391:22 | source(...) | source(...) | +| main.rs:401:10:401:10 | i | main.rs:400:16:400:16 | i | main.rs:401:10:401:10 | i | $@ | main.rs:400:16:400:16 | i | i | +| main.rs:401:10:401:10 | i | main.rs:400:16:400:16 | i | main.rs:401:10:401:10 | i | $@ | main.rs:400:16:400:16 | i | i | +| main.rs:411:14:411:14 | i | main.rs:410:26:410:31 | ...: i64 | main.rs:411:14:411:14 | i | $@ | main.rs:410:26:410:31 | ...: i64 | ...: i64 | +| main.rs:411:14:411:14 | i | main.rs:410:26:410:31 | ...: i64 | main.rs:411:14:411:14 | i | $@ | main.rs:410:26:410:31 | ...: i64 | ...: i64 | | main.rs:465:10:465:11 | x1 | main.rs:464:14:464:23 | source(...) | main.rs:465:10:465:11 | x1 | $@ | main.rs:464:14:464:23 | source(...) | source(...) | | main.rs:465:10:465:11 | x1 | main.rs:464:14:464:23 | source(...) | main.rs:465:10:465:11 | x1 | $@ | main.rs:464:14:464:23 | source(...) | source(...) | | main.rs:475:10:475:18 | x2.field1 | main.rs:468:17:468:26 | source(...) | main.rs:475:10:475:18 | x2.field1 | $@ | main.rs:468:17:468:26 | source(...) | source(...) | @@ -882,14 +893,14 @@ invalidSpecComponent | main.rs:481:10:481:11 | x4 | main.rs:480:14:480:23 | source(...) | main.rs:481:10:481:11 | x4 | $@ | main.rs:480:14:480:23 | source(...) | source(...) | | main.rs:484:10:484:11 | x5 | main.rs:483:14:483:23 | source(...) | main.rs:484:10:484:11 | x5 | $@ | main.rs:483:14:483:23 | source(...) | source(...) | | main.rs:487:10:487:11 | x6 | main.rs:486:14:486:23 | source(...) | main.rs:487:10:487:11 | x6 | $@ | main.rs:486:14:486:23 | source(...) | source(...) | -| main.rs:502:10:502:28 | generated_source(...) | main.rs:502:10:502:25 | generated_source | main.rs:502:10:502:28 | generated_source(...) | $@ | main.rs:502:10:502:25 | generated_source | generated_source | -| main.rs:502:10:502:28 | generated_source(...) | main.rs:502:10:502:25 | generated_source | main.rs:502:10:502:28 | generated_source(...) | $@ | main.rs:502:10:502:25 | generated_source | generated_source | -| main.rs:504:10:504:33 | neutral_manual_source(...) | main.rs:504:10:504:30 | neutral_manual_source | main.rs:504:10:504:33 | neutral_manual_source(...) | $@ | main.rs:504:10:504:30 | neutral_manual_source | neutral_manual_source | -| main.rs:504:10:504:33 | neutral_manual_source(...) | main.rs:504:10:504:30 | neutral_manual_source | main.rs:504:10:504:33 | neutral_manual_source(...) | $@ | main.rs:504:10:504:30 | neutral_manual_source | neutral_manual_source | -| main.rs:505:5:505:18 | generated_sink | main.rs:505:20:505:28 | source(...) | main.rs:505:5:505:18 | generated_sink | $@ | main.rs:505:20:505:28 | source(...) | source(...) | -| main.rs:505:5:505:18 | generated_sink | main.rs:505:20:505:28 | source(...) | main.rs:505:5:505:18 | generated_sink | $@ | main.rs:505:20:505:28 | source(...) | source(...) | -| main.rs:507:5:507:23 | neutral_manual_sink | main.rs:507:25:507:33 | source(...) | main.rs:507:5:507:23 | neutral_manual_sink | $@ | main.rs:507:25:507:33 | source(...) | source(...) | -| main.rs:507:5:507:23 | neutral_manual_sink | main.rs:507:25:507:33 | source(...) | main.rs:507:5:507:23 | neutral_manual_sink | $@ | main.rs:507:25:507:33 | source(...) | source(...) | +| main.rs:502:10:502:28 | generated_source(...) | main.rs:502:10:502:28 | generated_source(...) | main.rs:502:10:502:28 | generated_source(...) | $@ | main.rs:502:10:502:28 | generated_source(...) | generated_source(...) | +| main.rs:502:10:502:28 | generated_source(...) | main.rs:502:10:502:28 | generated_source(...) | main.rs:502:10:502:28 | generated_source(...) | $@ | main.rs:502:10:502:28 | generated_source(...) | generated_source(...) | +| main.rs:504:10:504:33 | neutral_manual_source(...) | main.rs:504:10:504:33 | neutral_manual_source(...) | main.rs:504:10:504:33 | neutral_manual_source(...) | $@ | main.rs:504:10:504:33 | neutral_manual_source(...) | neutral_manual_source(...) | +| main.rs:504:10:504:33 | neutral_manual_source(...) | main.rs:504:10:504:33 | neutral_manual_source(...) | main.rs:504:10:504:33 | neutral_manual_source(...) | $@ | main.rs:504:10:504:33 | neutral_manual_source(...) | neutral_manual_source(...) | +| main.rs:505:20:505:28 | source(...) | main.rs:505:20:505:28 | source(...) | main.rs:505:20:505:28 | source(...) | $@ | main.rs:505:20:505:28 | source(...) | source(...) | +| main.rs:505:20:505:28 | source(...) | main.rs:505:20:505:28 | source(...) | main.rs:505:20:505:28 | source(...) | $@ | main.rs:505:20:505:28 | source(...) | source(...) | +| main.rs:507:25:507:33 | source(...) | main.rs:507:25:507:33 | source(...) | main.rs:507:25:507:33 | source(...) | $@ | main.rs:507:25:507:33 | source(...) | source(...) | +| main.rs:507:25:507:33 | source(...) | main.rs:507:25:507:33 | source(...) | main.rs:507:25:507:33 | source(...) | $@ | main.rs:507:25:507:33 | source(...) | source(...) | | main.rs:508:10:508:37 | generated_summary(...) | main.rs:508:28:508:36 | source(...) | main.rs:508:10:508:37 | generated_summary(...) | $@ | main.rs:508:28:508:36 | source(...) | source(...) | | main.rs:508:10:508:37 | generated_summary(...) | main.rs:508:28:508:36 | source(...) | main.rs:508:10:508:37 | generated_summary(...) | $@ | main.rs:508:28:508:36 | source(...) | source(...) | | main.rs:510:10:510:42 | neutral_manual_summary(...) | main.rs:510:33:510:41 | source(...) | main.rs:510:10:510:42 | neutral_manual_summary(...) | $@ | main.rs:510:33:510:41 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/sources/database/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/database/InlineFlow.expected index 5b3e890545b3..200c4c4aa581 100644 --- a/rust/ql/test/library-tests/dataflow/sources/database/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/database/InlineFlow.expected @@ -17,88 +17,82 @@ models | 16 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | edges | test.rs:18:13:18:14 | v1 | test.rs:19:14:19:15 | v1 | provenance | | +| test.rs:18:24:18:33 | row.get(...) | test.rs:18:24:18:33 | row.get(...) [Some] | provenance | Src:MaD:7 | | test.rs:18:24:18:33 | row.get(...) [Some] | test.rs:18:24:18:42 | ... .unwrap() | provenance | MaD:15 | | test.rs:18:24:18:42 | ... .unwrap() | test.rs:18:13:18:14 | v1 | provenance | | -| test.rs:18:28:18:30 | get | test.rs:18:24:18:33 | row.get(...) [Some] | provenance | Src:MaD:7 | | test.rs:21:13:21:14 | v2 | test.rs:22:14:22:15 | v2 | provenance | | +| test.rs:21:24:21:37 | row.get_opt(...) | test.rs:21:24:21:37 | row.get_opt(...) [Some, Ok] | provenance | Src:MaD:8 | | test.rs:21:24:21:37 | row.get_opt(...) [Some, Ok] | test.rs:21:24:21:46 | ... .unwrap() [Ok] | provenance | MaD:15 | | test.rs:21:24:21:46 | ... .unwrap() [Ok] | test.rs:21:24:21:55 | ... .unwrap() | provenance | MaD:16 | | test.rs:21:24:21:55 | ... .unwrap() | test.rs:21:13:21:14 | v2 | provenance | | -| test.rs:21:28:21:34 | get_opt | test.rs:21:24:21:37 | row.get_opt(...) [Some, Ok] | provenance | Src:MaD:8 | | test.rs:24:13:24:14 | v3 | test.rs:25:14:25:15 | v3 | provenance | | +| test.rs:24:24:24:34 | row.take(...) | test.rs:24:24:24:34 | row.take(...) [Some] | provenance | Src:MaD:9 | | test.rs:24:24:24:34 | row.take(...) [Some] | test.rs:24:24:24:43 | ... .unwrap() | provenance | MaD:15 | | test.rs:24:24:24:43 | ... .unwrap() | test.rs:24:13:24:14 | v3 | provenance | | -| test.rs:24:28:24:31 | take | test.rs:24:24:24:34 | row.take(...) [Some] | provenance | Src:MaD:9 | | test.rs:27:13:27:14 | v4 | test.rs:28:14:28:15 | v4 | provenance | | +| test.rs:27:24:27:38 | row.take_opt(...) | test.rs:27:24:27:38 | row.take_opt(...) [Some, Ok] | provenance | Src:MaD:10 | | test.rs:27:24:27:38 | row.take_opt(...) [Some, Ok] | test.rs:27:24:27:47 | ... .unwrap() [Ok] | provenance | MaD:15 | | test.rs:27:24:27:47 | ... .unwrap() [Ok] | test.rs:27:24:27:56 | ... .unwrap() | provenance | MaD:16 | | test.rs:27:24:27:56 | ... .unwrap() | test.rs:27:13:27:14 | v4 | provenance | | -| test.rs:27:28:27:35 | take_opt | test.rs:27:24:27:38 | row.take_opt(...) [Some, Ok] | provenance | Src:MaD:10 | | test.rs:37:13:37:14 | v6 | test.rs:38:14:38:15 | v6 | provenance | | +| test.rs:37:23:37:63 | conn.query_first(...) | test.rs:37:23:37:63 | conn.query_first(...) [Ok, Some] | provenance | Src:MaD:1 | | test.rs:37:23:37:63 | conn.query_first(...) [Ok, Some] | test.rs:37:23:37:64 | TryExpr [Some] | provenance | | | test.rs:37:23:37:64 | TryExpr [Some] | test.rs:37:23:37:73 | ... .unwrap() | provenance | MaD:15 | | test.rs:37:23:37:73 | ... .unwrap() | test.rs:37:13:37:14 | v6 | provenance | | -| test.rs:37:28:37:38 | query_first | test.rs:37:23:37:63 | conn.query_first(...) [Ok, Some] | provenance | Src:MaD:1 | | test.rs:40:13:40:18 | mut t1 [element] | test.rs:42:20:42:21 | t1 [element] | provenance | | +| test.rs:40:22:40:71 | conn.exec_iter(...) | test.rs:40:22:40:71 | conn.exec_iter(...) [Ok, element] | provenance | Src:MaD:6 | | test.rs:40:22:40:71 | conn.exec_iter(...) [Ok, element] | test.rs:40:22:40:72 | TryExpr [element] | provenance | | | test.rs:40:22:40:72 | TryExpr [element] | test.rs:40:13:40:18 | mut t1 [element] | provenance | | -| test.rs:40:27:40:35 | exec_iter | test.rs:40:22:40:71 | conn.exec_iter(...) [Ok, element] | provenance | Src:MaD:6 | +| test.rs:41:14:41:61 | ... .get(...) | test.rs:41:14:41:61 | ... .get(...) [Some] | provenance | Src:MaD:7 | | test.rs:41:14:41:61 | ... .get(...) [Some] | test.rs:41:14:41:70 | ... .unwrap() | provenance | MaD:15 | -| test.rs:41:42:41:44 | get | test.rs:41:14:41:61 | ... .get(...) [Some] | provenance | Src:MaD:7 | | test.rs:42:13:42:15 | row | test.rs:44:22:44:22 | v | provenance | | | test.rs:42:20:42:21 | t1 [element] | test.rs:42:13:42:15 | row | provenance | | -| test.rs:48:22:48:30 | query_map | test.rs:50:14:50:24 | ...: i64 | provenance | Src:MaD:3 | -| test.rs:50:14:50:24 | ...: i64 | test.rs:51:22:51:27 | values | provenance | | -| test.rs:55:22:55:30 | query_map | test.rs:57:14:57:39 | ...: ... | provenance | Src:MaD:3 | -| test.rs:57:14:57:39 | ...: ... | test.rs:58:22:58:29 | values.0 | provenance | | -| test.rs:57:14:57:39 | ...: ... | test.rs:59:22:59:29 | values.1 | provenance | | -| test.rs:57:14:57:39 | ...: ... | test.rs:60:22:60:29 | values.2 | provenance | | +| test.rs:50:13:52:13 | \|...\| ... | test.rs:51:22:51:27 | values | provenance | Src:MaD:3 | +| test.rs:57:13:61:13 | \|...\| ... | test.rs:58:22:58:29 | values.0 | provenance | Src:MaD:3 | +| test.rs:57:13:61:13 | \|...\| ... | test.rs:59:22:59:29 | values.1 | provenance | Src:MaD:3 | +| test.rs:57:13:61:13 | \|...\| ... | test.rs:60:22:60:29 | values.2 | provenance | Src:MaD:3 | | test.rs:64:13:64:17 | total | test.rs:68:14:68:18 | total | provenance | | | test.rs:64:13:64:17 | total [Wrapping] | test.rs:68:14:68:18 | total | provenance | | | test.rs:64:21:67:10 | conn.query_fold(...) [Ok, Wrapping] | test.rs:64:21:67:11 | TryExpr [Wrapping] | provenance | | | test.rs:64:21:67:10 | conn.query_fold(...) [Ok] | test.rs:64:21:67:11 | TryExpr | provenance | | | test.rs:64:21:67:11 | TryExpr | test.rs:64:13:64:17 | total | provenance | | | test.rs:64:21:67:11 | TryExpr [Wrapping] | test.rs:64:13:64:17 | total [Wrapping] | provenance | | -| test.rs:64:26:64:35 | query_fold | test.rs:64:76:64:83 | ...: i64 | provenance | Src:MaD:2 | -| test.rs:64:76:64:83 | ...: i64 | test.rs:65:18:65:20 | row | provenance | | -| test.rs:64:76:64:83 | ...: i64 | test.rs:66:19:66:21 | row | provenance | | +| test.rs:64:65:67:9 | \|...\| ... | test.rs:65:18:65:20 | row | provenance | Src:MaD:2 | +| test.rs:64:65:67:9 | \|...\| ... | test.rs:66:19:66:21 | row | provenance | Src:MaD:2 | | test.rs:64:86:67:9 | { ... } | test.rs:64:21:67:10 | conn.query_fold(...) [Ok] | provenance | MaD:13 | | test.rs:64:86:67:9 | { ... } [Wrapping] | test.rs:64:21:67:10 | conn.query_fold(...) [Ok, Wrapping] | provenance | MaD:13 | | test.rs:66:13:66:21 | ... + ... | test.rs:64:86:67:9 | { ... } | provenance | | | test.rs:66:13:66:21 | ... + ... [Wrapping] | test.rs:64:86:67:9 | { ... } [Wrapping] | provenance | | | test.rs:66:19:66:21 | row | test.rs:66:13:66:21 | ... + ... | provenance | MaD:12 | | test.rs:66:19:66:21 | row | test.rs:66:13:66:21 | ... + ... [Wrapping] | provenance | MaD:11 | -| test.rs:70:22:70:31 | query_fold | test.rs:70:83:70:105 | ...: ... | provenance | Src:MaD:2 | -| test.rs:70:83:70:105 | ...: ... | test.rs:71:17:71:18 | id | provenance | | -| test.rs:70:83:70:105 | ...: ... | test.rs:72:17:72:20 | name | provenance | | -| test.rs:70:83:70:105 | ...: ... | test.rs:73:17:73:19 | age | provenance | | +| test.rs:70:72:78:9 | \|...\| ... | test.rs:71:17:71:18 | id | provenance | Src:MaD:2 | +| test.rs:70:72:78:9 | \|...\| ... | test.rs:72:17:72:20 | name | provenance | Src:MaD:2 | +| test.rs:70:72:78:9 | \|...\| ... | test.rs:73:17:73:19 | age | provenance | Src:MaD:2 | | test.rs:71:17:71:18 | id | test.rs:74:18:74:19 | id | provenance | | | test.rs:72:17:72:20 | name | test.rs:75:18:75:21 | name | provenance | | | test.rs:73:17:73:19 | age | test.rs:76:18:76:20 | age | provenance | | | test.rs:105:13:105:14 | v1 | test.rs:106:14:106:15 | v1 | provenance | | +| test.rs:105:24:105:33 | row.get(...) | test.rs:105:24:105:33 | row.get(...) [Some] | provenance | Src:MaD:7 | | test.rs:105:24:105:33 | row.get(...) [Some] | test.rs:105:24:105:42 | ... .unwrap() | provenance | MaD:15 | | test.rs:105:24:105:42 | ... .unwrap() | test.rs:105:13:105:14 | v1 | provenance | | -| test.rs:105:28:105:30 | get | test.rs:105:24:105:33 | row.get(...) [Some] | provenance | Src:MaD:7 | | test.rs:108:13:108:14 | v2 | test.rs:109:14:109:15 | v2 | provenance | | +| test.rs:108:24:108:37 | row.get_opt(...) | test.rs:108:24:108:37 | row.get_opt(...) [Some, Ok] | provenance | Src:MaD:8 | | test.rs:108:24:108:37 | row.get_opt(...) [Some, Ok] | test.rs:108:24:108:46 | ... .unwrap() [Ok] | provenance | MaD:15 | | test.rs:108:24:108:46 | ... .unwrap() [Ok] | test.rs:108:24:108:55 | ... .unwrap() | provenance | MaD:16 | | test.rs:108:24:108:55 | ... .unwrap() | test.rs:108:13:108:14 | v2 | provenance | | -| test.rs:108:28:108:34 | get_opt | test.rs:108:24:108:37 | row.get_opt(...) [Some, Ok] | provenance | Src:MaD:8 | | test.rs:111:13:111:14 | v3 | test.rs:112:14:112:15 | v3 | provenance | | +| test.rs:111:24:111:34 | row.take(...) | test.rs:111:24:111:34 | row.take(...) [Some] | provenance | Src:MaD:9 | | test.rs:111:24:111:34 | row.take(...) [Some] | test.rs:111:24:111:43 | ... .unwrap() | provenance | MaD:15 | | test.rs:111:24:111:43 | ... .unwrap() | test.rs:111:13:111:14 | v3 | provenance | | -| test.rs:111:28:111:31 | take | test.rs:111:24:111:34 | row.take(...) [Some] | provenance | Src:MaD:9 | | test.rs:114:13:114:14 | v4 | test.rs:115:14:115:15 | v4 | provenance | | +| test.rs:114:24:114:38 | row.take_opt(...) | test.rs:114:24:114:38 | row.take_opt(...) [Some, Ok] | provenance | Src:MaD:10 | | test.rs:114:24:114:38 | row.take_opt(...) [Some, Ok] | test.rs:114:24:114:47 | ... .unwrap() [Ok] | provenance | MaD:15 | | test.rs:114:24:114:47 | ... .unwrap() [Ok] | test.rs:114:24:114:56 | ... .unwrap() | provenance | MaD:16 | | test.rs:114:24:114:56 | ... .unwrap() | test.rs:114:13:114:14 | v4 | provenance | | -| test.rs:114:28:114:35 | take_opt | test.rs:114:24:114:38 | row.take_opt(...) [Some, Ok] | provenance | Src:MaD:10 | -| test.rs:135:22:135:30 | query_map | test.rs:137:14:137:24 | ...: i64 | provenance | Src:MaD:5 | -| test.rs:137:14:137:24 | ...: i64 | test.rs:138:22:138:27 | values | provenance | | -| test.rs:142:22:142:30 | query_map | test.rs:144:14:144:39 | ...: ... | provenance | Src:MaD:5 | -| test.rs:144:14:144:39 | ...: ... | test.rs:145:22:145:29 | values.0 | provenance | | -| test.rs:144:14:144:39 | ...: ... | test.rs:146:22:146:29 | values.1 | provenance | | -| test.rs:144:14:144:39 | ...: ... | test.rs:147:22:147:29 | values.2 | provenance | | +| test.rs:137:13:139:13 | \|...\| ... | test.rs:138:22:138:27 | values | provenance | Src:MaD:5 | +| test.rs:144:13:148:13 | \|...\| ... | test.rs:145:22:145:29 | values.0 | provenance | Src:MaD:5 | +| test.rs:144:13:148:13 | \|...\| ... | test.rs:146:22:146:29 | values.1 | provenance | Src:MaD:5 | +| test.rs:144:13:148:13 | \|...\| ... | test.rs:147:22:147:29 | values.2 | provenance | Src:MaD:5 | | test.rs:151:13:151:17 | total | test.rs:155:14:155:18 | total | provenance | | | test.rs:151:13:151:17 | total [Wrapping] | test.rs:155:14:155:18 | total | provenance | | | test.rs:151:21:154:10 | conn.query_fold(...) [future, Ok, Wrapping] | test.rs:151:21:154:16 | await ... [Ok, Wrapping] | provenance | | @@ -107,66 +101,62 @@ edges | test.rs:151:21:154:16 | await ... [Ok] | test.rs:151:21:154:17 | TryExpr | provenance | | | test.rs:151:21:154:17 | TryExpr | test.rs:151:13:151:17 | total | provenance | | | test.rs:151:21:154:17 | TryExpr [Wrapping] | test.rs:151:13:151:17 | total [Wrapping] | provenance | | -| test.rs:151:26:151:35 | query_fold | test.rs:151:76:151:83 | ...: i64 | provenance | Src:MaD:4 | -| test.rs:151:76:151:83 | ...: i64 | test.rs:152:18:152:20 | row | provenance | | -| test.rs:151:76:151:83 | ...: i64 | test.rs:153:19:153:21 | row | provenance | | +| test.rs:151:65:154:9 | \|...\| ... | test.rs:152:18:152:20 | row | provenance | Src:MaD:4 | +| test.rs:151:65:154:9 | \|...\| ... | test.rs:153:19:153:21 | row | provenance | Src:MaD:4 | | test.rs:151:86:154:9 | { ... } | test.rs:151:21:154:10 | conn.query_fold(...) [future, Ok] | provenance | MaD:14 | | test.rs:151:86:154:9 | { ... } [Wrapping] | test.rs:151:21:154:10 | conn.query_fold(...) [future, Ok, Wrapping] | provenance | MaD:14 | | test.rs:153:13:153:21 | ... + ... | test.rs:151:86:154:9 | { ... } | provenance | | | test.rs:153:13:153:21 | ... + ... [Wrapping] | test.rs:151:86:154:9 | { ... } [Wrapping] | provenance | | | test.rs:153:19:153:21 | row | test.rs:153:13:153:21 | ... + ... | provenance | MaD:12 | | test.rs:153:19:153:21 | row | test.rs:153:13:153:21 | ... + ... [Wrapping] | provenance | MaD:11 | -| test.rs:157:22:157:31 | query_fold | test.rs:157:83:157:105 | ...: ... | provenance | Src:MaD:4 | -| test.rs:157:83:157:105 | ...: ... | test.rs:158:17:158:18 | id | provenance | | -| test.rs:157:83:157:105 | ...: ... | test.rs:159:17:159:20 | name | provenance | | -| test.rs:157:83:157:105 | ...: ... | test.rs:160:17:160:19 | age | provenance | | +| test.rs:157:72:165:9 | \|...\| ... | test.rs:158:17:158:18 | id | provenance | Src:MaD:4 | +| test.rs:157:72:165:9 | \|...\| ... | test.rs:159:17:159:20 | name | provenance | Src:MaD:4 | +| test.rs:157:72:165:9 | \|...\| ... | test.rs:160:17:160:19 | age | provenance | Src:MaD:4 | | test.rs:158:17:158:18 | id | test.rs:161:18:161:19 | id | provenance | | | test.rs:159:17:159:20 | name | test.rs:162:18:162:21 | name | provenance | | | test.rs:160:17:160:19 | age | test.rs:163:18:163:20 | age | provenance | | nodes | test.rs:18:13:18:14 | v1 | semmle.label | v1 | +| test.rs:18:24:18:33 | row.get(...) | semmle.label | row.get(...) | | test.rs:18:24:18:33 | row.get(...) [Some] | semmle.label | row.get(...) [Some] | | test.rs:18:24:18:42 | ... .unwrap() | semmle.label | ... .unwrap() | -| test.rs:18:28:18:30 | get | semmle.label | get | | test.rs:19:14:19:15 | v1 | semmle.label | v1 | | test.rs:21:13:21:14 | v2 | semmle.label | v2 | +| test.rs:21:24:21:37 | row.get_opt(...) | semmle.label | row.get_opt(...) | | test.rs:21:24:21:37 | row.get_opt(...) [Some, Ok] | semmle.label | row.get_opt(...) [Some, Ok] | | test.rs:21:24:21:46 | ... .unwrap() [Ok] | semmle.label | ... .unwrap() [Ok] | | test.rs:21:24:21:55 | ... .unwrap() | semmle.label | ... .unwrap() | -| test.rs:21:28:21:34 | get_opt | semmle.label | get_opt | | test.rs:22:14:22:15 | v2 | semmle.label | v2 | | test.rs:24:13:24:14 | v3 | semmle.label | v3 | +| test.rs:24:24:24:34 | row.take(...) | semmle.label | row.take(...) | | test.rs:24:24:24:34 | row.take(...) [Some] | semmle.label | row.take(...) [Some] | | test.rs:24:24:24:43 | ... .unwrap() | semmle.label | ... .unwrap() | -| test.rs:24:28:24:31 | take | semmle.label | take | | test.rs:25:14:25:15 | v3 | semmle.label | v3 | | test.rs:27:13:27:14 | v4 | semmle.label | v4 | +| test.rs:27:24:27:38 | row.take_opt(...) | semmle.label | row.take_opt(...) | | test.rs:27:24:27:38 | row.take_opt(...) [Some, Ok] | semmle.label | row.take_opt(...) [Some, Ok] | | test.rs:27:24:27:47 | ... .unwrap() [Ok] | semmle.label | ... .unwrap() [Ok] | | test.rs:27:24:27:56 | ... .unwrap() | semmle.label | ... .unwrap() | -| test.rs:27:28:27:35 | take_opt | semmle.label | take_opt | | test.rs:28:14:28:15 | v4 | semmle.label | v4 | | test.rs:37:13:37:14 | v6 | semmle.label | v6 | +| test.rs:37:23:37:63 | conn.query_first(...) | semmle.label | conn.query_first(...) | | test.rs:37:23:37:63 | conn.query_first(...) [Ok, Some] | semmle.label | conn.query_first(...) [Ok, Some] | | test.rs:37:23:37:64 | TryExpr [Some] | semmle.label | TryExpr [Some] | | test.rs:37:23:37:73 | ... .unwrap() | semmle.label | ... .unwrap() | -| test.rs:37:28:37:38 | query_first | semmle.label | query_first | | test.rs:38:14:38:15 | v6 | semmle.label | v6 | | test.rs:40:13:40:18 | mut t1 [element] | semmle.label | mut t1 [element] | +| test.rs:40:22:40:71 | conn.exec_iter(...) | semmle.label | conn.exec_iter(...) | | test.rs:40:22:40:71 | conn.exec_iter(...) [Ok, element] | semmle.label | conn.exec_iter(...) [Ok, element] | | test.rs:40:22:40:72 | TryExpr [element] | semmle.label | TryExpr [element] | -| test.rs:40:27:40:35 | exec_iter | semmle.label | exec_iter | +| test.rs:41:14:41:61 | ... .get(...) | semmle.label | ... .get(...) | | test.rs:41:14:41:61 | ... .get(...) [Some] | semmle.label | ... .get(...) [Some] | | test.rs:41:14:41:70 | ... .unwrap() | semmle.label | ... .unwrap() | -| test.rs:41:42:41:44 | get | semmle.label | get | | test.rs:42:13:42:15 | row | semmle.label | row | | test.rs:42:20:42:21 | t1 [element] | semmle.label | t1 [element] | | test.rs:44:22:44:22 | v | semmle.label | v | -| test.rs:48:22:48:30 | query_map | semmle.label | query_map | -| test.rs:50:14:50:24 | ...: i64 | semmle.label | ...: i64 | +| test.rs:50:13:52:13 | \|...\| ... | semmle.label | \|...\| ... | | test.rs:51:22:51:27 | values | semmle.label | values | -| test.rs:55:22:55:30 | query_map | semmle.label | query_map | -| test.rs:57:14:57:39 | ...: ... | semmle.label | ...: ... | +| test.rs:57:13:61:13 | \|...\| ... | semmle.label | \|...\| ... | | test.rs:58:22:58:29 | values.0 | semmle.label | values.0 | | test.rs:59:22:59:29 | values.1 | semmle.label | values.1 | | test.rs:60:22:60:29 | values.2 | semmle.label | values.2 | @@ -176,8 +166,7 @@ nodes | test.rs:64:21:67:10 | conn.query_fold(...) [Ok] | semmle.label | conn.query_fold(...) [Ok] | | test.rs:64:21:67:11 | TryExpr | semmle.label | TryExpr | | test.rs:64:21:67:11 | TryExpr [Wrapping] | semmle.label | TryExpr [Wrapping] | -| test.rs:64:26:64:35 | query_fold | semmle.label | query_fold | -| test.rs:64:76:64:83 | ...: i64 | semmle.label | ...: i64 | +| test.rs:64:65:67:9 | \|...\| ... | semmle.label | \|...\| ... | | test.rs:64:86:67:9 | { ... } | semmle.label | { ... } | | test.rs:64:86:67:9 | { ... } [Wrapping] | semmle.label | { ... } [Wrapping] | | test.rs:65:18:65:20 | row | semmle.label | row | @@ -185,8 +174,7 @@ nodes | test.rs:66:13:66:21 | ... + ... [Wrapping] | semmle.label | ... + ... [Wrapping] | | test.rs:66:19:66:21 | row | semmle.label | row | | test.rs:68:14:68:18 | total | semmle.label | total | -| test.rs:70:22:70:31 | query_fold | semmle.label | query_fold | -| test.rs:70:83:70:105 | ...: ... | semmle.label | ...: ... | +| test.rs:70:72:78:9 | \|...\| ... | semmle.label | \|...\| ... | | test.rs:71:17:71:18 | id | semmle.label | id | | test.rs:72:17:72:20 | name | semmle.label | name | | test.rs:73:17:73:19 | age | semmle.label | age | @@ -194,32 +182,30 @@ nodes | test.rs:75:18:75:21 | name | semmle.label | name | | test.rs:76:18:76:20 | age | semmle.label | age | | test.rs:105:13:105:14 | v1 | semmle.label | v1 | +| test.rs:105:24:105:33 | row.get(...) | semmle.label | row.get(...) | | test.rs:105:24:105:33 | row.get(...) [Some] | semmle.label | row.get(...) [Some] | | test.rs:105:24:105:42 | ... .unwrap() | semmle.label | ... .unwrap() | -| test.rs:105:28:105:30 | get | semmle.label | get | | test.rs:106:14:106:15 | v1 | semmle.label | v1 | | test.rs:108:13:108:14 | v2 | semmle.label | v2 | +| test.rs:108:24:108:37 | row.get_opt(...) | semmle.label | row.get_opt(...) | | test.rs:108:24:108:37 | row.get_opt(...) [Some, Ok] | semmle.label | row.get_opt(...) [Some, Ok] | | test.rs:108:24:108:46 | ... .unwrap() [Ok] | semmle.label | ... .unwrap() [Ok] | | test.rs:108:24:108:55 | ... .unwrap() | semmle.label | ... .unwrap() | -| test.rs:108:28:108:34 | get_opt | semmle.label | get_opt | | test.rs:109:14:109:15 | v2 | semmle.label | v2 | | test.rs:111:13:111:14 | v3 | semmle.label | v3 | +| test.rs:111:24:111:34 | row.take(...) | semmle.label | row.take(...) | | test.rs:111:24:111:34 | row.take(...) [Some] | semmle.label | row.take(...) [Some] | | test.rs:111:24:111:43 | ... .unwrap() | semmle.label | ... .unwrap() | -| test.rs:111:28:111:31 | take | semmle.label | take | | test.rs:112:14:112:15 | v3 | semmle.label | v3 | | test.rs:114:13:114:14 | v4 | semmle.label | v4 | +| test.rs:114:24:114:38 | row.take_opt(...) | semmle.label | row.take_opt(...) | | test.rs:114:24:114:38 | row.take_opt(...) [Some, Ok] | semmle.label | row.take_opt(...) [Some, Ok] | | test.rs:114:24:114:47 | ... .unwrap() [Ok] | semmle.label | ... .unwrap() [Ok] | | test.rs:114:24:114:56 | ... .unwrap() | semmle.label | ... .unwrap() | -| test.rs:114:28:114:35 | take_opt | semmle.label | take_opt | | test.rs:115:14:115:15 | v4 | semmle.label | v4 | -| test.rs:135:22:135:30 | query_map | semmle.label | query_map | -| test.rs:137:14:137:24 | ...: i64 | semmle.label | ...: i64 | +| test.rs:137:13:139:13 | \|...\| ... | semmle.label | \|...\| ... | | test.rs:138:22:138:27 | values | semmle.label | values | -| test.rs:142:22:142:30 | query_map | semmle.label | query_map | -| test.rs:144:14:144:39 | ...: ... | semmle.label | ...: ... | +| test.rs:144:13:148:13 | \|...\| ... | semmle.label | \|...\| ... | | test.rs:145:22:145:29 | values.0 | semmle.label | values.0 | | test.rs:146:22:146:29 | values.1 | semmle.label | values.1 | | test.rs:147:22:147:29 | values.2 | semmle.label | values.2 | @@ -231,8 +217,7 @@ nodes | test.rs:151:21:154:16 | await ... [Ok] | semmle.label | await ... [Ok] | | test.rs:151:21:154:17 | TryExpr | semmle.label | TryExpr | | test.rs:151:21:154:17 | TryExpr [Wrapping] | semmle.label | TryExpr [Wrapping] | -| test.rs:151:26:151:35 | query_fold | semmle.label | query_fold | -| test.rs:151:76:151:83 | ...: i64 | semmle.label | ...: i64 | +| test.rs:151:65:154:9 | \|...\| ... | semmle.label | \|...\| ... | | test.rs:151:86:154:9 | { ... } | semmle.label | { ... } | | test.rs:151:86:154:9 | { ... } [Wrapping] | semmle.label | { ... } [Wrapping] | | test.rs:152:18:152:20 | row | semmle.label | row | @@ -240,8 +225,7 @@ nodes | test.rs:153:13:153:21 | ... + ... [Wrapping] | semmle.label | ... + ... [Wrapping] | | test.rs:153:19:153:21 | row | semmle.label | row | | test.rs:155:14:155:18 | total | semmle.label | total | -| test.rs:157:22:157:31 | query_fold | semmle.label | query_fold | -| test.rs:157:83:157:105 | ...: ... | semmle.label | ...: ... | +| test.rs:157:72:165:9 | \|...\| ... | semmle.label | \|...\| ... | | test.rs:158:17:158:18 | id | semmle.label | id | | test.rs:159:17:159:20 | name | semmle.label | name | | test.rs:160:17:160:19 | age | semmle.label | age | @@ -251,32 +235,32 @@ nodes subpaths testFailures #select -| test.rs:19:14:19:15 | v1 | test.rs:18:28:18:30 | get | test.rs:19:14:19:15 | v1 | $@ | test.rs:18:28:18:30 | get | get | -| test.rs:22:14:22:15 | v2 | test.rs:21:28:21:34 | get_opt | test.rs:22:14:22:15 | v2 | $@ | test.rs:21:28:21:34 | get_opt | get_opt | -| test.rs:25:14:25:15 | v3 | test.rs:24:28:24:31 | take | test.rs:25:14:25:15 | v3 | $@ | test.rs:24:28:24:31 | take | take | -| test.rs:28:14:28:15 | v4 | test.rs:27:28:27:35 | take_opt | test.rs:28:14:28:15 | v4 | $@ | test.rs:27:28:27:35 | take_opt | take_opt | -| test.rs:38:14:38:15 | v6 | test.rs:37:28:37:38 | query_first | test.rs:38:14:38:15 | v6 | $@ | test.rs:37:28:37:38 | query_first | query_first | -| test.rs:41:14:41:70 | ... .unwrap() | test.rs:41:42:41:44 | get | test.rs:41:14:41:70 | ... .unwrap() | $@ | test.rs:41:42:41:44 | get | get | -| test.rs:44:22:44:22 | v | test.rs:40:27:40:35 | exec_iter | test.rs:44:22:44:22 | v | $@ | test.rs:40:27:40:35 | exec_iter | exec_iter | -| test.rs:51:22:51:27 | values | test.rs:48:22:48:30 | query_map | test.rs:51:22:51:27 | values | $@ | test.rs:48:22:48:30 | query_map | query_map | -| test.rs:58:22:58:29 | values.0 | test.rs:55:22:55:30 | query_map | test.rs:58:22:58:29 | values.0 | $@ | test.rs:55:22:55:30 | query_map | query_map | -| test.rs:59:22:59:29 | values.1 | test.rs:55:22:55:30 | query_map | test.rs:59:22:59:29 | values.1 | $@ | test.rs:55:22:55:30 | query_map | query_map | -| test.rs:60:22:60:29 | values.2 | test.rs:55:22:55:30 | query_map | test.rs:60:22:60:29 | values.2 | $@ | test.rs:55:22:55:30 | query_map | query_map | -| test.rs:65:18:65:20 | row | test.rs:64:26:64:35 | query_fold | test.rs:65:18:65:20 | row | $@ | test.rs:64:26:64:35 | query_fold | query_fold | -| test.rs:68:14:68:18 | total | test.rs:64:26:64:35 | query_fold | test.rs:68:14:68:18 | total | $@ | test.rs:64:26:64:35 | query_fold | query_fold | -| test.rs:74:18:74:19 | id | test.rs:70:22:70:31 | query_fold | test.rs:74:18:74:19 | id | $@ | test.rs:70:22:70:31 | query_fold | query_fold | -| test.rs:75:18:75:21 | name | test.rs:70:22:70:31 | query_fold | test.rs:75:18:75:21 | name | $@ | test.rs:70:22:70:31 | query_fold | query_fold | -| test.rs:76:18:76:20 | age | test.rs:70:22:70:31 | query_fold | test.rs:76:18:76:20 | age | $@ | test.rs:70:22:70:31 | query_fold | query_fold | -| test.rs:106:14:106:15 | v1 | test.rs:105:28:105:30 | get | test.rs:106:14:106:15 | v1 | $@ | test.rs:105:28:105:30 | get | get | -| test.rs:109:14:109:15 | v2 | test.rs:108:28:108:34 | get_opt | test.rs:109:14:109:15 | v2 | $@ | test.rs:108:28:108:34 | get_opt | get_opt | -| test.rs:112:14:112:15 | v3 | test.rs:111:28:111:31 | take | test.rs:112:14:112:15 | v3 | $@ | test.rs:111:28:111:31 | take | take | -| test.rs:115:14:115:15 | v4 | test.rs:114:28:114:35 | take_opt | test.rs:115:14:115:15 | v4 | $@ | test.rs:114:28:114:35 | take_opt | take_opt | -| test.rs:138:22:138:27 | values | test.rs:135:22:135:30 | query_map | test.rs:138:22:138:27 | values | $@ | test.rs:135:22:135:30 | query_map | query_map | -| test.rs:145:22:145:29 | values.0 | test.rs:142:22:142:30 | query_map | test.rs:145:22:145:29 | values.0 | $@ | test.rs:142:22:142:30 | query_map | query_map | -| test.rs:146:22:146:29 | values.1 | test.rs:142:22:142:30 | query_map | test.rs:146:22:146:29 | values.1 | $@ | test.rs:142:22:142:30 | query_map | query_map | -| test.rs:147:22:147:29 | values.2 | test.rs:142:22:142:30 | query_map | test.rs:147:22:147:29 | values.2 | $@ | test.rs:142:22:142:30 | query_map | query_map | -| test.rs:152:18:152:20 | row | test.rs:151:26:151:35 | query_fold | test.rs:152:18:152:20 | row | $@ | test.rs:151:26:151:35 | query_fold | query_fold | -| test.rs:155:14:155:18 | total | test.rs:151:26:151:35 | query_fold | test.rs:155:14:155:18 | total | $@ | test.rs:151:26:151:35 | query_fold | query_fold | -| test.rs:161:18:161:19 | id | test.rs:157:22:157:31 | query_fold | test.rs:161:18:161:19 | id | $@ | test.rs:157:22:157:31 | query_fold | query_fold | -| test.rs:162:18:162:21 | name | test.rs:157:22:157:31 | query_fold | test.rs:162:18:162:21 | name | $@ | test.rs:157:22:157:31 | query_fold | query_fold | -| test.rs:163:18:163:20 | age | test.rs:157:22:157:31 | query_fold | test.rs:163:18:163:20 | age | $@ | test.rs:157:22:157:31 | query_fold | query_fold | +| test.rs:19:14:19:15 | v1 | test.rs:18:24:18:33 | row.get(...) | test.rs:19:14:19:15 | v1 | $@ | test.rs:18:24:18:33 | row.get(...) | row.get(...) | +| test.rs:22:14:22:15 | v2 | test.rs:21:24:21:37 | row.get_opt(...) | test.rs:22:14:22:15 | v2 | $@ | test.rs:21:24:21:37 | row.get_opt(...) | row.get_opt(...) | +| test.rs:25:14:25:15 | v3 | test.rs:24:24:24:34 | row.take(...) | test.rs:25:14:25:15 | v3 | $@ | test.rs:24:24:24:34 | row.take(...) | row.take(...) | +| test.rs:28:14:28:15 | v4 | test.rs:27:24:27:38 | row.take_opt(...) | test.rs:28:14:28:15 | v4 | $@ | test.rs:27:24:27:38 | row.take_opt(...) | row.take_opt(...) | +| test.rs:38:14:38:15 | v6 | test.rs:37:23:37:63 | conn.query_first(...) | test.rs:38:14:38:15 | v6 | $@ | test.rs:37:23:37:63 | conn.query_first(...) | conn.query_first(...) | +| test.rs:41:14:41:70 | ... .unwrap() | test.rs:41:14:41:61 | ... .get(...) | test.rs:41:14:41:70 | ... .unwrap() | $@ | test.rs:41:14:41:61 | ... .get(...) | ... .get(...) | +| test.rs:44:22:44:22 | v | test.rs:40:22:40:71 | conn.exec_iter(...) | test.rs:44:22:44:22 | v | $@ | test.rs:40:22:40:71 | conn.exec_iter(...) | conn.exec_iter(...) | +| test.rs:51:22:51:27 | values | test.rs:50:13:52:13 | \|...\| ... | test.rs:51:22:51:27 | values | $@ | test.rs:50:13:52:13 | \|...\| ... | \|...\| ... | +| test.rs:58:22:58:29 | values.0 | test.rs:57:13:61:13 | \|...\| ... | test.rs:58:22:58:29 | values.0 | $@ | test.rs:57:13:61:13 | \|...\| ... | \|...\| ... | +| test.rs:59:22:59:29 | values.1 | test.rs:57:13:61:13 | \|...\| ... | test.rs:59:22:59:29 | values.1 | $@ | test.rs:57:13:61:13 | \|...\| ... | \|...\| ... | +| test.rs:60:22:60:29 | values.2 | test.rs:57:13:61:13 | \|...\| ... | test.rs:60:22:60:29 | values.2 | $@ | test.rs:57:13:61:13 | \|...\| ... | \|...\| ... | +| test.rs:65:18:65:20 | row | test.rs:64:65:67:9 | \|...\| ... | test.rs:65:18:65:20 | row | $@ | test.rs:64:65:67:9 | \|...\| ... | \|...\| ... | +| test.rs:68:14:68:18 | total | test.rs:64:65:67:9 | \|...\| ... | test.rs:68:14:68:18 | total | $@ | test.rs:64:65:67:9 | \|...\| ... | \|...\| ... | +| test.rs:74:18:74:19 | id | test.rs:70:72:78:9 | \|...\| ... | test.rs:74:18:74:19 | id | $@ | test.rs:70:72:78:9 | \|...\| ... | \|...\| ... | +| test.rs:75:18:75:21 | name | test.rs:70:72:78:9 | \|...\| ... | test.rs:75:18:75:21 | name | $@ | test.rs:70:72:78:9 | \|...\| ... | \|...\| ... | +| test.rs:76:18:76:20 | age | test.rs:70:72:78:9 | \|...\| ... | test.rs:76:18:76:20 | age | $@ | test.rs:70:72:78:9 | \|...\| ... | \|...\| ... | +| test.rs:106:14:106:15 | v1 | test.rs:105:24:105:33 | row.get(...) | test.rs:106:14:106:15 | v1 | $@ | test.rs:105:24:105:33 | row.get(...) | row.get(...) | +| test.rs:109:14:109:15 | v2 | test.rs:108:24:108:37 | row.get_opt(...) | test.rs:109:14:109:15 | v2 | $@ | test.rs:108:24:108:37 | row.get_opt(...) | row.get_opt(...) | +| test.rs:112:14:112:15 | v3 | test.rs:111:24:111:34 | row.take(...) | test.rs:112:14:112:15 | v3 | $@ | test.rs:111:24:111:34 | row.take(...) | row.take(...) | +| test.rs:115:14:115:15 | v4 | test.rs:114:24:114:38 | row.take_opt(...) | test.rs:115:14:115:15 | v4 | $@ | test.rs:114:24:114:38 | row.take_opt(...) | row.take_opt(...) | +| test.rs:138:22:138:27 | values | test.rs:137:13:139:13 | \|...\| ... | test.rs:138:22:138:27 | values | $@ | test.rs:137:13:139:13 | \|...\| ... | \|...\| ... | +| test.rs:145:22:145:29 | values.0 | test.rs:144:13:148:13 | \|...\| ... | test.rs:145:22:145:29 | values.0 | $@ | test.rs:144:13:148:13 | \|...\| ... | \|...\| ... | +| test.rs:146:22:146:29 | values.1 | test.rs:144:13:148:13 | \|...\| ... | test.rs:146:22:146:29 | values.1 | $@ | test.rs:144:13:148:13 | \|...\| ... | \|...\| ... | +| test.rs:147:22:147:29 | values.2 | test.rs:144:13:148:13 | \|...\| ... | test.rs:147:22:147:29 | values.2 | $@ | test.rs:144:13:148:13 | \|...\| ... | \|...\| ... | +| test.rs:152:18:152:20 | row | test.rs:151:65:154:9 | \|...\| ... | test.rs:152:18:152:20 | row | $@ | test.rs:151:65:154:9 | \|...\| ... | \|...\| ... | +| test.rs:155:14:155:18 | total | test.rs:151:65:154:9 | \|...\| ... | test.rs:155:14:155:18 | total | $@ | test.rs:151:65:154:9 | \|...\| ... | \|...\| ... | +| test.rs:161:18:161:19 | id | test.rs:157:72:165:9 | \|...\| ... | test.rs:161:18:161:19 | id | $@ | test.rs:157:72:165:9 | \|...\| ... | \|...\| ... | +| test.rs:162:18:162:21 | name | test.rs:157:72:165:9 | \|...\| ... | test.rs:162:18:162:21 | name | $@ | test.rs:157:72:165:9 | \|...\| ... | \|...\| ... | +| test.rs:163:18:163:20 | age | test.rs:157:72:165:9 | \|...\| ... | test.rs:163:18:163:20 | age | $@ | test.rs:157:72:165:9 | \|...\| ... | \|...\| ... | diff --git a/rust/ql/test/library-tests/dataflow/sources/database/TaintSources.expected b/rust/ql/test/library-tests/dataflow/sources/database/TaintSources.expected index 9132dfaa2b0f..3a0de1e351bb 100644 --- a/rust/ql/test/library-tests/dataflow/sources/database/TaintSources.expected +++ b/rust/ql/test/library-tests/dataflow/sources/database/TaintSources.expected @@ -1,25 +1,25 @@ -| test.rs:15:47:15:51 | query | Flow source 'DatabaseSource' of type database (DEFAULT). | -| test.rs:18:28:18:30 | get | Flow source 'DatabaseSource' of type database (DEFAULT). | -| test.rs:21:28:21:34 | get_opt | Flow source 'DatabaseSource' of type database (DEFAULT). | -| test.rs:24:28:24:31 | take | Flow source 'DatabaseSource' of type database (DEFAULT). | -| test.rs:27:28:27:35 | take_opt | Flow source 'DatabaseSource' of type database (DEFAULT). | -| test.rs:30:26:30:31 | as_ref | Flow source 'DatabaseSource' of type database (DEFAULT). | -| test.rs:37:28:37:38 | query_first | Flow source 'DatabaseSource' of type database (DEFAULT). | -| test.rs:40:27:40:35 | exec_iter | Flow source 'DatabaseSource' of type database (DEFAULT). | -| test.rs:41:42:41:44 | get | Flow source 'DatabaseSource' of type database (DEFAULT). | -| test.rs:48:22:48:30 | query_map | Flow source 'DatabaseSource' of type database (DEFAULT). | -| test.rs:55:22:55:30 | query_map | Flow source 'DatabaseSource' of type database (DEFAULT). | -| test.rs:64:26:64:35 | query_fold | Flow source 'DatabaseSource' of type database (DEFAULT). | -| test.rs:70:22:70:31 | query_fold | Flow source 'DatabaseSource' of type database (DEFAULT). | -| test.rs:102:53:102:57 | query | Flow source 'DatabaseSource' of type database (DEFAULT). | -| test.rs:105:28:105:30 | get | Flow source 'DatabaseSource' of type database (DEFAULT). | -| test.rs:108:28:108:34 | get_opt | Flow source 'DatabaseSource' of type database (DEFAULT). | -| test.rs:111:28:111:31 | take | Flow source 'DatabaseSource' of type database (DEFAULT). | -| test.rs:114:28:114:35 | take_opt | Flow source 'DatabaseSource' of type database (DEFAULT). | -| test.rs:117:26:117:31 | as_ref | Flow source 'DatabaseSource' of type database (DEFAULT). | -| test.rs:124:28:124:38 | query_first | Flow source 'DatabaseSource' of type database (DEFAULT). | -| test.rs:127:27:127:35 | exec_iter | Flow source 'DatabaseSource' of type database (DEFAULT). | -| test.rs:135:22:135:30 | query_map | Flow source 'DatabaseSource' of type database (DEFAULT). | -| test.rs:142:22:142:30 | query_map | Flow source 'DatabaseSource' of type database (DEFAULT). | -| test.rs:151:26:151:35 | query_fold | Flow source 'DatabaseSource' of type database (DEFAULT). | -| test.rs:157:22:157:31 | query_fold | Flow source 'DatabaseSource' of type database (DEFAULT). | +| test.rs:15:42:15:87 | conn.query(...) | Flow source 'DatabaseSource' of type database (DEFAULT). | +| test.rs:18:24:18:33 | row.get(...) | Flow source 'DatabaseSource' of type database (DEFAULT). | +| test.rs:21:24:21:37 | row.get_opt(...) | Flow source 'DatabaseSource' of type database (DEFAULT). | +| test.rs:24:24:24:34 | row.take(...) | Flow source 'DatabaseSource' of type database (DEFAULT). | +| test.rs:27:24:27:38 | row.take_opt(...) | Flow source 'DatabaseSource' of type database (DEFAULT). | +| test.rs:30:22:30:34 | row.as_ref(...) | Flow source 'DatabaseSource' of type database (DEFAULT). | +| test.rs:37:23:37:63 | conn.query_first(...) | Flow source 'DatabaseSource' of type database (DEFAULT). | +| test.rs:40:22:40:71 | conn.exec_iter(...) | Flow source 'DatabaseSource' of type database (DEFAULT). | +| test.rs:41:14:41:61 | ... .get(...) | Flow source 'DatabaseSource' of type database (DEFAULT). | +| test.rs:50:13:52:13 | \|...\| ... | Flow source 'DatabaseSource' of type database (DEFAULT). | +| test.rs:57:13:61:13 | \|...\| ... | Flow source 'DatabaseSource' of type database (DEFAULT). | +| test.rs:64:65:67:9 | \|...\| ... | Flow source 'DatabaseSource' of type database (DEFAULT). | +| test.rs:70:72:78:9 | \|...\| ... | Flow source 'DatabaseSource' of type database (DEFAULT). | +| test.rs:102:48:102:93 | conn.query(...) | Flow source 'DatabaseSource' of type database (DEFAULT). | +| test.rs:105:24:105:33 | row.get(...) | Flow source 'DatabaseSource' of type database (DEFAULT). | +| test.rs:108:24:108:37 | row.get_opt(...) | Flow source 'DatabaseSource' of type database (DEFAULT). | +| test.rs:111:24:111:34 | row.take(...) | Flow source 'DatabaseSource' of type database (DEFAULT). | +| test.rs:114:24:114:38 | row.take_opt(...) | Flow source 'DatabaseSource' of type database (DEFAULT). | +| test.rs:117:22:117:34 | row.as_ref(...) | Flow source 'DatabaseSource' of type database (DEFAULT). | +| test.rs:124:23:124:63 | conn.query_first(...) | Flow source 'DatabaseSource' of type database (DEFAULT). | +| test.rs:127:22:127:71 | conn.exec_iter(...) | Flow source 'DatabaseSource' of type database (DEFAULT). | +| test.rs:137:13:139:13 | \|...\| ... | Flow source 'DatabaseSource' of type database (DEFAULT). | +| test.rs:144:13:148:13 | \|...\| ... | Flow source 'DatabaseSource' of type database (DEFAULT). | +| test.rs:151:65:154:9 | \|...\| ... | Flow source 'DatabaseSource' of type database (DEFAULT). | +| test.rs:157:72:165:9 | \|...\| ... | Flow source 'DatabaseSource' of type database (DEFAULT). | diff --git a/rust/ql/test/library-tests/dataflow/sources/database/test.rs b/rust/ql/test/library-tests/dataflow/sources/database/test.rs index 618830091a6c..158cc8188b88 100644 --- a/rust/ql/test/library-tests/dataflow/sources/database/test.rs +++ b/rust/ql/test/library-tests/dataflow/sources/database/test.rs @@ -45,29 +45,29 @@ mod test_mysql { } } - let _ = conn.query_map( // $ Alert[rust/summary/taint-sources] + let _ = conn.query_map( "SELECT id FROM person", |values: i64| -> () { sink(values); // $ hasTaintFlow - } + } // $ Alert[rust/summary/taint-sources] )?; - let _ = conn.query_map( // $ Alert[rust/summary/taint-sources] + let _ = conn.query_map( "SELECT id, name, age FROM person", |values: (i64, String, i32)| -> () { sink(values.0); // $ hasTaintFlow sink(values.1); // $ hasTaintFlow sink(values.2); // $ hasTaintFlow - } + } // $ Alert[rust/summary/taint-sources] )?; - let total = conn.query_fold("SELECT id FROM person", 0, |acc: i64, row: i64| { // $ Alert[rust/summary/taint-sources] + let total = conn.query_fold("SELECT id FROM person", 0, |acc: i64, row: i64| { sink(row); // $ hasTaintFlow acc + row - })?; + })?; // $ Alert[rust/summary/taint-sources] sink(total); // $ hasTaintFlow - let _ = conn.query_fold("SELECT id, name, age FROM person", 0, |acc: i64, row: (i64, String, i32)| { // $ Alert[rust/summary/taint-sources] + let _ = conn.query_fold("SELECT id, name, age FROM person", 0, |acc: i64, row: (i64, String, i32)| { let id: i64 = row.0; let name: String = row.1; let age: i32 = row.2; @@ -75,7 +75,7 @@ mod test_mysql { sink(name); // $ hasTaintFlow sink(age); // $ hasTaintFlow acc + 1 - })?; + })?; // $ Alert[rust/summary/taint-sources] Ok(()) } @@ -132,29 +132,29 @@ mod test_mysql_async { } } - let _ = conn.query_map( // $ Alert[rust/summary/taint-sources] + let _ = conn.query_map( "SELECT id FROM person", |values: i64| -> () { sink(values); // $ hasTaintFlow - } + } // $ Alert[rust/summary/taint-sources] ).await?; - let _ = conn.query_map( // $ Alert[rust/summary/taint-sources] + let _ = conn.query_map( "SELECT id, name, age FROM person", |values: (i64, String, i32)| -> () { sink(values.0); // $ hasTaintFlow sink(values.1); // $ hasTaintFlow sink(values.2); // $ hasTaintFlow - } + } // $ Alert[rust/summary/taint-sources] ).await?; - let total = conn.query_fold("SELECT id FROM person", 0, |acc: i64, row: i64| { // $ Alert[rust/summary/taint-sources] + let total = conn.query_fold("SELECT id FROM person", 0, |acc: i64, row: i64| { sink(row); // $ hasTaintFlow acc + row - }).await?; + }).await?; // $ Alert[rust/summary/taint-sources] sink(total); // $ hasTaintFlow - let _ = conn.query_fold("SELECT id, name, age FROM person", 0, |acc: i64, row: (i64, String, i32)| { // $ Alert[rust/summary/taint-sources] + let _ = conn.query_fold("SELECT id, name, age FROM person", 0, |acc: i64, row: (i64, String, i32)| { let id: i64 = row.0; let name: String = row.1; let age: i32 = row.2; @@ -162,7 +162,7 @@ mod test_mysql_async { sink(name); // $ hasTaintFlow sink(age); // $ hasTaintFlow acc + 1 - }).await?; + }).await?; // $ Alert[rust/summary/taint-sources] let ids = "SELECT id FROM person".with(()).map(&mut conn, |person: i64| -> i64 { diff --git a/rust/ql/test/library-tests/dataflow/sources/env/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/env/InlineFlow.expected index 78527083096e..30c4e844c41e 100644 --- a/rust/ql/test/library-tests/dataflow/sources/env/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/env/InlineFlow.expected @@ -17,27 +17,27 @@ models | 16 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | | 17 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | edges -| test.rs:6:10:6:22 | ...::var | test.rs:6:10:6:30 | ...::var(...) | provenance | Src:MaD:6 | -| test.rs:7:10:7:25 | ...::var_os | test.rs:7:10:7:33 | ...::var_os(...) | provenance | Src:MaD:7 | +| test.rs:6:10:6:30 | ...::var(...) | test.rs:6:10:6:30 | ...::var(...) | provenance | Src:MaD:6 | +| test.rs:7:10:7:33 | ...::var_os(...) | test.rs:7:10:7:33 | ...::var_os(...) | provenance | Src:MaD:7 | | test.rs:9:9:9:12 | var1 | test.rs:12:10:12:13 | var1 | provenance | | -| test.rs:9:16:9:28 | ...::var | test.rs:9:16:9:36 | ...::var(...) [Ok] | provenance | Src:MaD:6 | +| test.rs:9:16:9:36 | ...::var(...) | test.rs:9:16:9:36 | ...::var(...) [Ok] | provenance | Src:MaD:6 | | test.rs:9:16:9:36 | ...::var(...) [Ok] | test.rs:9:16:9:59 | ... .expect(...) | provenance | MaD:16 | | test.rs:9:16:9:59 | ... .expect(...) | test.rs:9:9:9:12 | var1 | provenance | | | test.rs:10:9:10:12 | var2 | test.rs:13:10:13:13 | var2 | provenance | | -| test.rs:10:16:10:31 | ...::var_os | test.rs:10:16:10:39 | ...::var_os(...) [Some] | provenance | Src:MaD:7 | +| test.rs:10:16:10:39 | ...::var_os(...) | test.rs:10:16:10:39 | ...::var_os(...) [Some] | provenance | Src:MaD:7 | | test.rs:10:16:10:39 | ...::var_os(...) [Some] | test.rs:10:16:10:48 | ... .unwrap() | provenance | MaD:15 | | test.rs:10:16:10:48 | ... .unwrap() | test.rs:10:9:10:12 | var2 | provenance | | | test.rs:15:9:15:20 | TuplePat | test.rs:16:14:16:16 | key | provenance | | | test.rs:15:9:15:20 | TuplePat | test.rs:17:14:17:18 | value | provenance | | -| test.rs:15:25:15:38 | ...::vars | test.rs:15:25:15:40 | ...::vars(...) [element] | provenance | Src:MaD:8 | +| test.rs:15:25:15:40 | ...::vars(...) | test.rs:15:25:15:40 | ...::vars(...) [element] | provenance | Src:MaD:8 | | test.rs:15:25:15:40 | ...::vars(...) [element] | test.rs:15:9:15:20 | TuplePat | provenance | | | test.rs:20:9:20:20 | TuplePat | test.rs:21:14:21:16 | key | provenance | | | test.rs:20:9:20:20 | TuplePat | test.rs:22:14:22:18 | value | provenance | | -| test.rs:20:25:20:41 | ...::vars_os | test.rs:20:25:20:43 | ...::vars_os(...) [element] | provenance | Src:MaD:9 | +| test.rs:20:25:20:43 | ...::vars_os(...) | test.rs:20:25:20:43 | ...::vars_os(...) [element] | provenance | Src:MaD:9 | | test.rs:20:25:20:43 | ...::vars_os(...) [element] | test.rs:20:9:20:20 | TuplePat | provenance | | | test.rs:27:9:27:12 | args [element] | test.rs:28:20:28:23 | args [element] | provenance | | | test.rs:27:9:27:12 | args [element] | test.rs:29:17:29:20 | args [element] | provenance | | -| test.rs:27:29:27:42 | ...::args | test.rs:27:29:27:44 | ...::args(...) [element] | provenance | Src:MaD:1 | +| test.rs:27:29:27:44 | ...::args(...) | test.rs:27:29:27:44 | ...::args(...) [element] | provenance | Src:MaD:1 | | test.rs:27:29:27:44 | ...::args(...) [element] | test.rs:27:29:27:54 | ... .collect() [element] | provenance | MaD:10 | | test.rs:27:29:27:54 | ... .collect() [element] | test.rs:27:9:27:12 | args [element] | provenance | | | test.rs:28:9:28:15 | my_path [&ref] | test.rs:34:10:34:16 | my_path | provenance | | @@ -49,67 +49,67 @@ edges | test.rs:29:17:29:20 | args [element] | test.rs:29:17:29:23 | args[1] | provenance | MaD:12 | | test.rs:29:17:29:23 | args[1] | test.rs:29:16:29:23 | &... [&ref] | provenance | | | test.rs:30:9:30:12 | arg2 | test.rs:36:10:36:13 | arg2 | provenance | | -| test.rs:30:16:30:29 | ...::args | test.rs:30:16:30:31 | ...::args(...) [element] | provenance | Src:MaD:1 | +| test.rs:30:16:30:31 | ...::args(...) | test.rs:30:16:30:31 | ...::args(...) [element] | provenance | Src:MaD:1 | | test.rs:30:16:30:31 | ...::args(...) [element] | test.rs:30:16:30:38 | ... .nth(...) [Some] | provenance | MaD:11 | | test.rs:30:16:30:38 | ... .nth(...) [Some] | test.rs:30:16:30:47 | ... .unwrap() | provenance | MaD:15 | | test.rs:30:16:30:47 | ... .unwrap() | test.rs:30:9:30:12 | arg2 | provenance | | | test.rs:31:9:31:12 | arg3 | test.rs:37:10:37:13 | arg3 | provenance | | -| test.rs:31:16:31:32 | ...::args_os | test.rs:31:16:31:34 | ...::args_os(...) [element] | provenance | Src:MaD:2 | +| test.rs:31:16:31:34 | ...::args_os(...) | test.rs:31:16:31:34 | ...::args_os(...) [element] | provenance | Src:MaD:2 | | test.rs:31:16:31:34 | ...::args_os(...) [element] | test.rs:31:16:31:41 | ... .nth(...) [Some] | provenance | MaD:11 | | test.rs:31:16:31:41 | ... .nth(...) [Some] | test.rs:31:16:31:50 | ... .unwrap() | provenance | MaD:15 | | test.rs:31:16:31:50 | ... .unwrap() | test.rs:31:9:31:12 | arg3 | provenance | | | test.rs:32:9:32:12 | arg4 | test.rs:38:10:38:13 | arg4 | provenance | | -| test.rs:32:16:32:29 | ...::args | test.rs:32:16:32:31 | ...::args(...) [element] | provenance | Src:MaD:1 | +| test.rs:32:16:32:31 | ...::args(...) | test.rs:32:16:32:31 | ...::args(...) [element] | provenance | Src:MaD:1 | | test.rs:32:16:32:31 | ...::args(...) [element] | test.rs:32:16:32:38 | ... .nth(...) [Some] | provenance | MaD:11 | | test.rs:32:16:32:38 | ... .nth(...) [Some] | test.rs:32:16:32:47 | ... .unwrap() | provenance | MaD:15 | | test.rs:32:16:32:47 | ... .unwrap() | test.rs:32:16:32:64 | ... .parse() [Ok] | provenance | MaD:13 | | test.rs:32:16:32:64 | ... .parse() [Ok] | test.rs:32:16:32:73 | ... .unwrap() | provenance | MaD:17 | | test.rs:32:16:32:73 | ... .unwrap() | test.rs:32:9:32:12 | arg4 | provenance | | | test.rs:40:9:40:11 | arg | test.rs:41:14:41:16 | arg | provenance | | -| test.rs:40:16:40:29 | ...::args | test.rs:40:16:40:31 | ...::args(...) [element] | provenance | Src:MaD:1 | +| test.rs:40:16:40:31 | ...::args(...) | test.rs:40:16:40:31 | ...::args(...) [element] | provenance | Src:MaD:1 | | test.rs:40:16:40:31 | ...::args(...) [element] | test.rs:40:9:40:11 | arg | provenance | | | test.rs:44:9:44:11 | arg | test.rs:45:14:45:16 | arg | provenance | | -| test.rs:44:16:44:32 | ...::args_os | test.rs:44:16:44:34 | ...::args_os(...) [element] | provenance | Src:MaD:2 | +| test.rs:44:16:44:34 | ...::args_os(...) | test.rs:44:16:44:34 | ...::args_os(...) [element] | provenance | Src:MaD:2 | | test.rs:44:16:44:34 | ...::args_os(...) [element] | test.rs:44:9:44:11 | arg | provenance | | | test.rs:50:9:50:11 | dir | test.rs:54:10:54:12 | dir | provenance | | -| test.rs:50:15:50:35 | ...::current_dir | test.rs:50:15:50:37 | ...::current_dir(...) [Ok] | provenance | Src:MaD:3 | +| test.rs:50:15:50:37 | ...::current_dir(...) | test.rs:50:15:50:37 | ...::current_dir(...) [Ok] | provenance | Src:MaD:3 | | test.rs:50:15:50:37 | ...::current_dir(...) [Ok] | test.rs:50:15:50:54 | ... .expect(...) | provenance | MaD:16 | | test.rs:50:15:50:54 | ... .expect(...) | test.rs:50:9:50:11 | dir | provenance | | | test.rs:51:9:51:11 | exe | test.rs:55:10:55:12 | exe | provenance | | -| test.rs:51:15:51:35 | ...::current_exe | test.rs:51:15:51:37 | ...::current_exe(...) [Ok] | provenance | Src:MaD:4 | +| test.rs:51:15:51:37 | ...::current_exe(...) | test.rs:51:15:51:37 | ...::current_exe(...) [Ok] | provenance | Src:MaD:4 | | test.rs:51:15:51:37 | ...::current_exe(...) [Ok] | test.rs:51:15:51:54 | ... .expect(...) | provenance | MaD:16 | | test.rs:51:15:51:54 | ... .expect(...) | test.rs:51:9:51:11 | exe | provenance | | | test.rs:52:9:52:12 | home | test.rs:56:10:56:13 | home | provenance | | -| test.rs:52:16:52:33 | ...::home_dir | test.rs:52:16:52:35 | ...::home_dir(...) [Some] | provenance | Src:MaD:5 | +| test.rs:52:16:52:35 | ...::home_dir(...) | test.rs:52:16:52:35 | ...::home_dir(...) [Some] | provenance | Src:MaD:5 | | test.rs:52:16:52:35 | ...::home_dir(...) [Some] | test.rs:52:16:52:52 | ... .expect(...) | provenance | MaD:14 | | test.rs:52:16:52:52 | ... .expect(...) | test.rs:52:9:52:12 | home | provenance | | nodes -| test.rs:6:10:6:22 | ...::var | semmle.label | ...::var | | test.rs:6:10:6:30 | ...::var(...) | semmle.label | ...::var(...) | -| test.rs:7:10:7:25 | ...::var_os | semmle.label | ...::var_os | +| test.rs:6:10:6:30 | ...::var(...) | semmle.label | ...::var(...) | +| test.rs:7:10:7:33 | ...::var_os(...) | semmle.label | ...::var_os(...) | | test.rs:7:10:7:33 | ...::var_os(...) | semmle.label | ...::var_os(...) | | test.rs:9:9:9:12 | var1 | semmle.label | var1 | -| test.rs:9:16:9:28 | ...::var | semmle.label | ...::var | +| test.rs:9:16:9:36 | ...::var(...) | semmle.label | ...::var(...) | | test.rs:9:16:9:36 | ...::var(...) [Ok] | semmle.label | ...::var(...) [Ok] | | test.rs:9:16:9:59 | ... .expect(...) | semmle.label | ... .expect(...) | | test.rs:10:9:10:12 | var2 | semmle.label | var2 | -| test.rs:10:16:10:31 | ...::var_os | semmle.label | ...::var_os | +| test.rs:10:16:10:39 | ...::var_os(...) | semmle.label | ...::var_os(...) | | test.rs:10:16:10:39 | ...::var_os(...) [Some] | semmle.label | ...::var_os(...) [Some] | | test.rs:10:16:10:48 | ... .unwrap() | semmle.label | ... .unwrap() | | test.rs:12:10:12:13 | var1 | semmle.label | var1 | | test.rs:13:10:13:13 | var2 | semmle.label | var2 | | test.rs:15:9:15:20 | TuplePat | semmle.label | TuplePat | -| test.rs:15:25:15:38 | ...::vars | semmle.label | ...::vars | +| test.rs:15:25:15:40 | ...::vars(...) | semmle.label | ...::vars(...) | | test.rs:15:25:15:40 | ...::vars(...) [element] | semmle.label | ...::vars(...) [element] | | test.rs:16:14:16:16 | key | semmle.label | key | | test.rs:17:14:17:18 | value | semmle.label | value | | test.rs:20:9:20:20 | TuplePat | semmle.label | TuplePat | -| test.rs:20:25:20:41 | ...::vars_os | semmle.label | ...::vars_os | +| test.rs:20:25:20:43 | ...::vars_os(...) | semmle.label | ...::vars_os(...) | | test.rs:20:25:20:43 | ...::vars_os(...) [element] | semmle.label | ...::vars_os(...) [element] | | test.rs:21:14:21:16 | key | semmle.label | key | | test.rs:22:14:22:18 | value | semmle.label | value | | test.rs:27:9:27:12 | args [element] | semmle.label | args [element] | -| test.rs:27:29:27:42 | ...::args | semmle.label | ...::args | +| test.rs:27:29:27:44 | ...::args(...) | semmle.label | ...::args(...) | | test.rs:27:29:27:44 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | | test.rs:27:29:27:54 | ... .collect() [element] | semmle.label | ... .collect() [element] | | test.rs:28:9:28:15 | my_path [&ref] | semmle.label | my_path [&ref] | @@ -121,17 +121,17 @@ nodes | test.rs:29:17:29:20 | args [element] | semmle.label | args [element] | | test.rs:29:17:29:23 | args[1] | semmle.label | args[1] | | test.rs:30:9:30:12 | arg2 | semmle.label | arg2 | -| test.rs:30:16:30:29 | ...::args | semmle.label | ...::args | +| test.rs:30:16:30:31 | ...::args(...) | semmle.label | ...::args(...) | | test.rs:30:16:30:31 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | | test.rs:30:16:30:38 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | | test.rs:30:16:30:47 | ... .unwrap() | semmle.label | ... .unwrap() | | test.rs:31:9:31:12 | arg3 | semmle.label | arg3 | -| test.rs:31:16:31:32 | ...::args_os | semmle.label | ...::args_os | +| test.rs:31:16:31:34 | ...::args_os(...) | semmle.label | ...::args_os(...) | | test.rs:31:16:31:34 | ...::args_os(...) [element] | semmle.label | ...::args_os(...) [element] | | test.rs:31:16:31:41 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | | test.rs:31:16:31:50 | ... .unwrap() | semmle.label | ... .unwrap() | | test.rs:32:9:32:12 | arg4 | semmle.label | arg4 | -| test.rs:32:16:32:29 | ...::args | semmle.label | ...::args | +| test.rs:32:16:32:31 | ...::args(...) | semmle.label | ...::args(...) | | test.rs:32:16:32:31 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | | test.rs:32:16:32:38 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | | test.rs:32:16:32:47 | ... .unwrap() | semmle.label | ... .unwrap() | @@ -143,23 +143,23 @@ nodes | test.rs:37:10:37:13 | arg3 | semmle.label | arg3 | | test.rs:38:10:38:13 | arg4 | semmle.label | arg4 | | test.rs:40:9:40:11 | arg | semmle.label | arg | -| test.rs:40:16:40:29 | ...::args | semmle.label | ...::args | +| test.rs:40:16:40:31 | ...::args(...) | semmle.label | ...::args(...) | | test.rs:40:16:40:31 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | | test.rs:41:14:41:16 | arg | semmle.label | arg | | test.rs:44:9:44:11 | arg | semmle.label | arg | -| test.rs:44:16:44:32 | ...::args_os | semmle.label | ...::args_os | +| test.rs:44:16:44:34 | ...::args_os(...) | semmle.label | ...::args_os(...) | | test.rs:44:16:44:34 | ...::args_os(...) [element] | semmle.label | ...::args_os(...) [element] | | test.rs:45:14:45:16 | arg | semmle.label | arg | | test.rs:50:9:50:11 | dir | semmle.label | dir | -| test.rs:50:15:50:35 | ...::current_dir | semmle.label | ...::current_dir | +| test.rs:50:15:50:37 | ...::current_dir(...) | semmle.label | ...::current_dir(...) | | test.rs:50:15:50:37 | ...::current_dir(...) [Ok] | semmle.label | ...::current_dir(...) [Ok] | | test.rs:50:15:50:54 | ... .expect(...) | semmle.label | ... .expect(...) | | test.rs:51:9:51:11 | exe | semmle.label | exe | -| test.rs:51:15:51:35 | ...::current_exe | semmle.label | ...::current_exe | +| test.rs:51:15:51:37 | ...::current_exe(...) | semmle.label | ...::current_exe(...) | | test.rs:51:15:51:37 | ...::current_exe(...) [Ok] | semmle.label | ...::current_exe(...) [Ok] | | test.rs:51:15:51:54 | ... .expect(...) | semmle.label | ... .expect(...) | | test.rs:52:9:52:12 | home | semmle.label | home | -| test.rs:52:16:52:33 | ...::home_dir | semmle.label | ...::home_dir | +| test.rs:52:16:52:35 | ...::home_dir(...) | semmle.label | ...::home_dir(...) | | test.rs:52:16:52:35 | ...::home_dir(...) [Some] | semmle.label | ...::home_dir(...) [Some] | | test.rs:52:16:52:52 | ... .expect(...) | semmle.label | ... .expect(...) | | test.rs:54:10:54:12 | dir | semmle.label | dir | @@ -168,21 +168,21 @@ nodes subpaths testFailures #select -| test.rs:6:10:6:30 | ...::var(...) | test.rs:6:10:6:22 | ...::var | test.rs:6:10:6:30 | ...::var(...) | $@ | test.rs:6:10:6:22 | ...::var | ...::var | -| test.rs:7:10:7:33 | ...::var_os(...) | test.rs:7:10:7:25 | ...::var_os | test.rs:7:10:7:33 | ...::var_os(...) | $@ | test.rs:7:10:7:25 | ...::var_os | ...::var_os | -| test.rs:12:10:12:13 | var1 | test.rs:9:16:9:28 | ...::var | test.rs:12:10:12:13 | var1 | $@ | test.rs:9:16:9:28 | ...::var | ...::var | -| test.rs:13:10:13:13 | var2 | test.rs:10:16:10:31 | ...::var_os | test.rs:13:10:13:13 | var2 | $@ | test.rs:10:16:10:31 | ...::var_os | ...::var_os | -| test.rs:16:14:16:16 | key | test.rs:15:25:15:38 | ...::vars | test.rs:16:14:16:16 | key | $@ | test.rs:15:25:15:38 | ...::vars | ...::vars | -| test.rs:17:14:17:18 | value | test.rs:15:25:15:38 | ...::vars | test.rs:17:14:17:18 | value | $@ | test.rs:15:25:15:38 | ...::vars | ...::vars | -| test.rs:21:14:21:16 | key | test.rs:20:25:20:41 | ...::vars_os | test.rs:21:14:21:16 | key | $@ | test.rs:20:25:20:41 | ...::vars_os | ...::vars_os | -| test.rs:22:14:22:18 | value | test.rs:20:25:20:41 | ...::vars_os | test.rs:22:14:22:18 | value | $@ | test.rs:20:25:20:41 | ...::vars_os | ...::vars_os | -| test.rs:34:10:34:16 | my_path | test.rs:27:29:27:42 | ...::args | test.rs:34:10:34:16 | my_path | $@ | test.rs:27:29:27:42 | ...::args | ...::args | -| test.rs:35:10:35:13 | arg1 | test.rs:27:29:27:42 | ...::args | test.rs:35:10:35:13 | arg1 | $@ | test.rs:27:29:27:42 | ...::args | ...::args | -| test.rs:36:10:36:13 | arg2 | test.rs:30:16:30:29 | ...::args | test.rs:36:10:36:13 | arg2 | $@ | test.rs:30:16:30:29 | ...::args | ...::args | -| test.rs:37:10:37:13 | arg3 | test.rs:31:16:31:32 | ...::args_os | test.rs:37:10:37:13 | arg3 | $@ | test.rs:31:16:31:32 | ...::args_os | ...::args_os | -| test.rs:38:10:38:13 | arg4 | test.rs:32:16:32:29 | ...::args | test.rs:38:10:38:13 | arg4 | $@ | test.rs:32:16:32:29 | ...::args | ...::args | -| test.rs:41:14:41:16 | arg | test.rs:40:16:40:29 | ...::args | test.rs:41:14:41:16 | arg | $@ | test.rs:40:16:40:29 | ...::args | ...::args | -| test.rs:45:14:45:16 | arg | test.rs:44:16:44:32 | ...::args_os | test.rs:45:14:45:16 | arg | $@ | test.rs:44:16:44:32 | ...::args_os | ...::args_os | -| test.rs:54:10:54:12 | dir | test.rs:50:15:50:35 | ...::current_dir | test.rs:54:10:54:12 | dir | $@ | test.rs:50:15:50:35 | ...::current_dir | ...::current_dir | -| test.rs:55:10:55:12 | exe | test.rs:51:15:51:35 | ...::current_exe | test.rs:55:10:55:12 | exe | $@ | test.rs:51:15:51:35 | ...::current_exe | ...::current_exe | -| test.rs:56:10:56:13 | home | test.rs:52:16:52:33 | ...::home_dir | test.rs:56:10:56:13 | home | $@ | test.rs:52:16:52:33 | ...::home_dir | ...::home_dir | +| test.rs:6:10:6:30 | ...::var(...) | test.rs:6:10:6:30 | ...::var(...) | test.rs:6:10:6:30 | ...::var(...) | $@ | test.rs:6:10:6:30 | ...::var(...) | ...::var(...) | +| test.rs:7:10:7:33 | ...::var_os(...) | test.rs:7:10:7:33 | ...::var_os(...) | test.rs:7:10:7:33 | ...::var_os(...) | $@ | test.rs:7:10:7:33 | ...::var_os(...) | ...::var_os(...) | +| test.rs:12:10:12:13 | var1 | test.rs:9:16:9:36 | ...::var(...) | test.rs:12:10:12:13 | var1 | $@ | test.rs:9:16:9:36 | ...::var(...) | ...::var(...) | +| test.rs:13:10:13:13 | var2 | test.rs:10:16:10:39 | ...::var_os(...) | test.rs:13:10:13:13 | var2 | $@ | test.rs:10:16:10:39 | ...::var_os(...) | ...::var_os(...) | +| test.rs:16:14:16:16 | key | test.rs:15:25:15:40 | ...::vars(...) | test.rs:16:14:16:16 | key | $@ | test.rs:15:25:15:40 | ...::vars(...) | ...::vars(...) | +| test.rs:17:14:17:18 | value | test.rs:15:25:15:40 | ...::vars(...) | test.rs:17:14:17:18 | value | $@ | test.rs:15:25:15:40 | ...::vars(...) | ...::vars(...) | +| test.rs:21:14:21:16 | key | test.rs:20:25:20:43 | ...::vars_os(...) | test.rs:21:14:21:16 | key | $@ | test.rs:20:25:20:43 | ...::vars_os(...) | ...::vars_os(...) | +| test.rs:22:14:22:18 | value | test.rs:20:25:20:43 | ...::vars_os(...) | test.rs:22:14:22:18 | value | $@ | test.rs:20:25:20:43 | ...::vars_os(...) | ...::vars_os(...) | +| test.rs:34:10:34:16 | my_path | test.rs:27:29:27:44 | ...::args(...) | test.rs:34:10:34:16 | my_path | $@ | test.rs:27:29:27:44 | ...::args(...) | ...::args(...) | +| test.rs:35:10:35:13 | arg1 | test.rs:27:29:27:44 | ...::args(...) | test.rs:35:10:35:13 | arg1 | $@ | test.rs:27:29:27:44 | ...::args(...) | ...::args(...) | +| test.rs:36:10:36:13 | arg2 | test.rs:30:16:30:31 | ...::args(...) | test.rs:36:10:36:13 | arg2 | $@ | test.rs:30:16:30:31 | ...::args(...) | ...::args(...) | +| test.rs:37:10:37:13 | arg3 | test.rs:31:16:31:34 | ...::args_os(...) | test.rs:37:10:37:13 | arg3 | $@ | test.rs:31:16:31:34 | ...::args_os(...) | ...::args_os(...) | +| test.rs:38:10:38:13 | arg4 | test.rs:32:16:32:31 | ...::args(...) | test.rs:38:10:38:13 | arg4 | $@ | test.rs:32:16:32:31 | ...::args(...) | ...::args(...) | +| test.rs:41:14:41:16 | arg | test.rs:40:16:40:31 | ...::args(...) | test.rs:41:14:41:16 | arg | $@ | test.rs:40:16:40:31 | ...::args(...) | ...::args(...) | +| test.rs:45:14:45:16 | arg | test.rs:44:16:44:34 | ...::args_os(...) | test.rs:45:14:45:16 | arg | $@ | test.rs:44:16:44:34 | ...::args_os(...) | ...::args_os(...) | +| test.rs:54:10:54:12 | dir | test.rs:50:15:50:37 | ...::current_dir(...) | test.rs:54:10:54:12 | dir | $@ | test.rs:50:15:50:37 | ...::current_dir(...) | ...::current_dir(...) | +| test.rs:55:10:55:12 | exe | test.rs:51:15:51:37 | ...::current_exe(...) | test.rs:55:10:55:12 | exe | $@ | test.rs:51:15:51:37 | ...::current_exe(...) | ...::current_exe(...) | +| test.rs:56:10:56:13 | home | test.rs:52:16:52:35 | ...::home_dir(...) | test.rs:56:10:56:13 | home | $@ | test.rs:52:16:52:35 | ...::home_dir(...) | ...::home_dir(...) | diff --git a/rust/ql/test/library-tests/dataflow/sources/env/TaintSources.expected b/rust/ql/test/library-tests/dataflow/sources/env/TaintSources.expected index 16f43eff9147..f686e4f83a90 100644 --- a/rust/ql/test/library-tests/dataflow/sources/env/TaintSources.expected +++ b/rust/ql/test/library-tests/dataflow/sources/env/TaintSources.expected @@ -1,15 +1,15 @@ -| test.rs:6:10:6:22 | ...::var | Flow source 'EnvironmentSource' of type environment (DEFAULT). | -| test.rs:7:10:7:25 | ...::var_os | Flow source 'EnvironmentSource' of type environment (DEFAULT). | -| test.rs:9:16:9:28 | ...::var | Flow source 'EnvironmentSource' of type environment (DEFAULT). | -| test.rs:10:16:10:31 | ...::var_os | Flow source 'EnvironmentSource' of type environment (DEFAULT). | -| test.rs:15:25:15:38 | ...::vars | Flow source 'EnvironmentSource' of type environment (DEFAULT). | -| test.rs:20:25:20:41 | ...::vars_os | Flow source 'EnvironmentSource' of type environment (DEFAULT). | -| test.rs:27:29:27:42 | ...::args | Flow source 'CommandLineArgs' of type commandargs (DEFAULT). | -| test.rs:30:16:30:29 | ...::args | Flow source 'CommandLineArgs' of type commandargs (DEFAULT). | -| test.rs:31:16:31:32 | ...::args_os | Flow source 'CommandLineArgs' of type commandargs (DEFAULT). | -| test.rs:32:16:32:29 | ...::args | Flow source 'CommandLineArgs' of type commandargs (DEFAULT). | -| test.rs:40:16:40:29 | ...::args | Flow source 'CommandLineArgs' of type commandargs (DEFAULT). | -| test.rs:44:16:44:32 | ...::args_os | Flow source 'CommandLineArgs' of type commandargs (DEFAULT). | -| test.rs:50:15:50:35 | ...::current_dir | Flow source 'CommandLineArgs' of type commandargs (DEFAULT). | -| test.rs:51:15:51:35 | ...::current_exe | Flow source 'CommandLineArgs' of type commandargs (DEFAULT). | -| test.rs:52:16:52:33 | ...::home_dir | Flow source 'CommandLineArgs' of type commandargs (DEFAULT). | +| test.rs:6:10:6:30 | ...::var(...) | Flow source 'EnvironmentSource' of type environment (DEFAULT). | +| test.rs:7:10:7:33 | ...::var_os(...) | Flow source 'EnvironmentSource' of type environment (DEFAULT). | +| test.rs:9:16:9:36 | ...::var(...) | Flow source 'EnvironmentSource' of type environment (DEFAULT). | +| test.rs:10:16:10:39 | ...::var_os(...) | Flow source 'EnvironmentSource' of type environment (DEFAULT). | +| test.rs:15:25:15:40 | ...::vars(...) | Flow source 'EnvironmentSource' of type environment (DEFAULT). | +| test.rs:20:25:20:43 | ...::vars_os(...) | Flow source 'EnvironmentSource' of type environment (DEFAULT). | +| test.rs:27:29:27:44 | ...::args(...) | Flow source 'CommandLineArgs' of type commandargs (DEFAULT). | +| test.rs:30:16:30:31 | ...::args(...) | Flow source 'CommandLineArgs' of type commandargs (DEFAULT). | +| test.rs:31:16:31:34 | ...::args_os(...) | Flow source 'CommandLineArgs' of type commandargs (DEFAULT). | +| test.rs:32:16:32:31 | ...::args(...) | Flow source 'CommandLineArgs' of type commandargs (DEFAULT). | +| test.rs:40:16:40:31 | ...::args(...) | Flow source 'CommandLineArgs' of type commandargs (DEFAULT). | +| test.rs:44:16:44:34 | ...::args_os(...) | Flow source 'CommandLineArgs' of type commandargs (DEFAULT). | +| test.rs:50:15:50:37 | ...::current_dir(...) | Flow source 'CommandLineArgs' of type commandargs (DEFAULT). | +| test.rs:51:15:51:37 | ...::current_exe(...) | Flow source 'CommandLineArgs' of type commandargs (DEFAULT). | +| test.rs:52:16:52:35 | ...::home_dir(...) | Flow source 'CommandLineArgs' of type commandargs (DEFAULT). | diff --git a/rust/ql/test/library-tests/dataflow/sources/file/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/file/InlineFlow.expected index 27d884fe565b..ca467c32f59c 100644 --- a/rust/ql/test/library-tests/dataflow/sources/file/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/file/InlineFlow.expected @@ -47,15 +47,15 @@ models | 46 | Summary: ::into_os_string; Argument[self].Field[std::path::PathBuf::inner]; ReturnValue; value | edges | test.rs:12:13:12:18 | buffer | test.rs:13:14:13:19 | buffer | provenance | | -| test.rs:12:31:12:43 | ...::read | test.rs:12:31:12:55 | ...::read(...) [Ok] | provenance | Src:MaD:11 | +| test.rs:12:31:12:55 | ...::read(...) | test.rs:12:31:12:55 | ...::read(...) [Ok] | provenance | Src:MaD:11 | | test.rs:12:31:12:55 | ...::read(...) [Ok] | test.rs:12:31:12:56 | TryExpr | provenance | | | test.rs:12:31:12:56 | TryExpr | test.rs:12:13:12:18 | buffer | provenance | | | test.rs:17:13:17:18 | buffer | test.rs:18:14:18:19 | buffer | provenance | | -| test.rs:17:31:17:38 | ...::read | test.rs:17:31:17:50 | ...::read(...) [Ok] | provenance | Src:MaD:11 | +| test.rs:17:31:17:50 | ...::read(...) | test.rs:17:31:17:50 | ...::read(...) [Ok] | provenance | Src:MaD:11 | | test.rs:17:31:17:50 | ...::read(...) [Ok] | test.rs:17:31:17:51 | TryExpr | provenance | | | test.rs:17:31:17:51 | TryExpr | test.rs:17:13:17:18 | buffer | provenance | | | test.rs:22:13:22:18 | buffer | test.rs:23:14:23:19 | buffer | provenance | | -| test.rs:22:22:22:39 | ...::read_to_string | test.rs:22:22:22:51 | ...::read_to_string(...) [Ok] | provenance | Src:MaD:13 | +| test.rs:22:22:22:51 | ...::read_to_string(...) | test.rs:22:22:22:51 | ...::read_to_string(...) [Ok] | provenance | Src:MaD:13 | | test.rs:22:22:22:51 | ...::read_to_string(...) [Ok] | test.rs:22:22:22:52 | TryExpr | provenance | | | test.rs:22:22:22:52 | TryExpr | test.rs:22:13:22:18 | buffer | provenance | | | test.rs:30:13:30:16 | path | test.rs:31:14:31:17 | path | provenance | | @@ -70,8 +70,7 @@ edges | test.rs:30:13:30:16 | path | test.rs:40:14:40:17 | path | provenance | | | test.rs:30:13:30:16 | path | test.rs:41:14:41:17 | path | provenance | | | test.rs:30:13:30:16 | path | test.rs:42:14:42:17 | path | provenance | | -| test.rs:30:20:30:27 | e.path() | test.rs:30:13:30:16 | path | provenance | | -| test.rs:30:22:30:25 | path | test.rs:30:20:30:27 | e.path() | provenance | Src:MaD:4 MaD:4 | +| test.rs:30:20:30:27 | e.path() | test.rs:30:13:30:16 | path | provenance | Src:MaD:4 | | test.rs:31:14:31:17 | path | test.rs:31:14:31:25 | path.clone() | provenance | MaD:18 | | test.rs:32:14:32:17 | path | test.rs:32:14:32:25 | path.clone() | provenance | MaD:18 | | test.rs:32:14:32:25 | path.clone() | test.rs:32:14:32:35 | ... .as_path() | provenance | MaD:44 | @@ -98,8 +97,7 @@ edges | test.rs:44:13:44:21 | file_name | test.rs:48:14:48:22 | file_name | provenance | | | test.rs:44:13:44:21 | file_name | test.rs:49:14:49:22 | file_name | provenance | | | test.rs:44:13:44:21 | file_name | test.rs:50:14:50:22 | file_name | provenance | | -| test.rs:44:25:44:37 | e.file_name() | test.rs:44:13:44:21 | file_name | provenance | | -| test.rs:44:27:44:35 | file_name | test.rs:44:25:44:37 | e.file_name() | provenance | Src:MaD:3 MaD:3 | +| test.rs:44:25:44:37 | e.file_name() | test.rs:44:13:44:21 | file_name | provenance | Src:MaD:3 | | test.rs:45:14:45:22 | file_name | test.rs:45:14:45:30 | file_name.clone() | provenance | MaD:18 | | test.rs:46:14:46:22 | file_name | test.rs:46:14:46:30 | file_name.clone() | provenance | MaD:18 | | test.rs:46:14:46:30 | file_name.clone() | test.rs:46:14:46:44 | ... .into_string() [Ok, String] | provenance | MaD:39 | @@ -111,32 +109,30 @@ edges | test.rs:49:14:49:22 | file_name | test.rs:49:14:49:30 | file_name.clone() | provenance | MaD:18 | | test.rs:49:14:49:30 | file_name.clone() | test.rs:49:14:49:49 | ... .as_encoded_bytes() | provenance | MaD:38 | | test.rs:68:13:68:18 | target | test.rs:69:14:69:19 | target | provenance | | -| test.rs:68:22:68:34 | ...::read_link | test.rs:68:22:68:49 | ...::read_link(...) [Ok] | provenance | Src:MaD:12 | +| test.rs:68:22:68:49 | ...::read_link(...) | test.rs:68:22:68:49 | ...::read_link(...) [Ok] | provenance | Src:MaD:12 | | test.rs:68:22:68:49 | ...::read_link(...) [Ok] | test.rs:68:22:68:50 | TryExpr | provenance | | | test.rs:68:22:68:50 | TryExpr | test.rs:68:13:68:18 | target | provenance | | | test.rs:77:13:77:18 | buffer | test.rs:78:14:78:19 | buffer | provenance | | -| test.rs:77:31:77:45 | ...::read | test.rs:77:31:77:57 | ...::read(...) [future, Ok] | provenance | Src:MaD:14 | +| test.rs:77:31:77:57 | ...::read(...) | test.rs:77:31:77:57 | ...::read(...) [future, Ok] | provenance | Src:MaD:14 | | test.rs:77:31:77:57 | ...::read(...) [future, Ok] | test.rs:77:31:77:63 | await ... [Ok] | provenance | | | test.rs:77:31:77:63 | await ... [Ok] | test.rs:77:31:77:64 | TryExpr | provenance | | | test.rs:77:31:77:64 | TryExpr | test.rs:77:13:77:18 | buffer | provenance | | | test.rs:82:13:82:18 | buffer | test.rs:83:14:83:19 | buffer | provenance | | -| test.rs:82:31:82:45 | ...::read | test.rs:82:31:82:57 | ...::read(...) [future, Ok] | provenance | Src:MaD:14 | +| test.rs:82:31:82:57 | ...::read(...) | test.rs:82:31:82:57 | ...::read(...) [future, Ok] | provenance | Src:MaD:14 | | test.rs:82:31:82:57 | ...::read(...) [future, Ok] | test.rs:82:31:82:63 | await ... [Ok] | provenance | | | test.rs:82:31:82:63 | await ... [Ok] | test.rs:82:31:82:64 | TryExpr | provenance | | | test.rs:82:31:82:64 | TryExpr | test.rs:82:13:82:18 | buffer | provenance | | | test.rs:87:13:87:18 | buffer | test.rs:88:14:88:19 | buffer | provenance | | -| test.rs:87:22:87:46 | ...::read_to_string | test.rs:87:22:87:58 | ...::read_to_string(...) [future, Ok] | provenance | Src:MaD:16 | +| test.rs:87:22:87:58 | ...::read_to_string(...) | test.rs:87:22:87:58 | ...::read_to_string(...) [future, Ok] | provenance | Src:MaD:16 | | test.rs:87:22:87:58 | ...::read_to_string(...) [future, Ok] | test.rs:87:22:87:64 | await ... [Ok] | provenance | | | test.rs:87:22:87:64 | await ... [Ok] | test.rs:87:22:87:65 | TryExpr | provenance | | | test.rs:87:22:87:65 | TryExpr | test.rs:87:13:87:18 | buffer | provenance | | | test.rs:93:13:93:16 | path | test.rs:95:14:95:17 | path | provenance | | -| test.rs:93:20:93:31 | entry.path() | test.rs:93:13:93:16 | path | provenance | | -| test.rs:93:26:93:29 | path | test.rs:93:20:93:31 | entry.path() | provenance | Src:MaD:10 MaD:10 | +| test.rs:93:20:93:31 | entry.path() | test.rs:93:13:93:16 | path | provenance | Src:MaD:10 | | test.rs:94:13:94:21 | file_name | test.rs:96:14:96:22 | file_name | provenance | | -| test.rs:94:25:94:41 | entry.file_name() | test.rs:94:13:94:21 | file_name | provenance | | -| test.rs:94:31:94:39 | file_name | test.rs:94:25:94:41 | entry.file_name() | provenance | Src:MaD:9 MaD:9 | +| test.rs:94:25:94:41 | entry.file_name() | test.rs:94:13:94:21 | file_name | provenance | Src:MaD:9 | | test.rs:100:13:100:18 | target | test.rs:101:14:101:19 | target | provenance | | -| test.rs:100:22:100:41 | ...::read_link | test.rs:100:22:100:56 | ...::read_link(...) [future, Ok] | provenance | Src:MaD:15 | +| test.rs:100:22:100:56 | ...::read_link(...) | test.rs:100:22:100:56 | ...::read_link(...) [future, Ok] | provenance | Src:MaD:15 | | test.rs:100:22:100:56 | ...::read_link(...) [future, Ok] | test.rs:100:22:100:62 | await ... [Ok] | provenance | | | test.rs:100:22:100:62 | await ... [Ok] | test.rs:100:22:100:63 | TryExpr | provenance | | | test.rs:100:22:100:63 | TryExpr | test.rs:100:13:100:18 | target | provenance | | @@ -145,7 +141,7 @@ edges | test.rs:110:9:110:16 | mut file | test.rs:126:22:126:25 | file | provenance | | | test.rs:110:9:110:16 | mut file | test.rs:132:9:132:12 | file | provenance | | | test.rs:110:9:110:16 | mut file | test.rs:136:17:136:20 | file | provenance | | -| test.rs:110:20:110:38 | ...::open | test.rs:110:20:110:50 | ...::open(...) [Ok] | provenance | Src:MaD:5 | +| test.rs:110:20:110:50 | ...::open(...) | test.rs:110:20:110:50 | ...::open(...) [Ok] | provenance | Src:MaD:5 | | test.rs:110:20:110:50 | ...::open(...) [Ok] | test.rs:110:20:110:51 | TryExpr | provenance | | | test.rs:110:20:110:51 | TryExpr | test.rs:110:9:110:16 | mut file | provenance | | | test.rs:114:22:114:25 | file | test.rs:114:32:114:42 | [post] &mut buffer [&ref] | provenance | MaD:22 | @@ -167,35 +163,35 @@ edges | test.rs:136:17:136:20 | file | test.rs:136:17:136:28 | file.bytes() | provenance | MaD:19 | | test.rs:136:17:136:28 | file.bytes() | test.rs:137:14:137:17 | byte | provenance | | | test.rs:143:13:143:18 | mut f1 | test.rs:145:22:145:23 | f1 | provenance | | +| test.rs:143:22:143:63 | ... .open(...) | test.rs:143:22:143:63 | ... .open(...) [Ok] | provenance | Src:MaD:6 | | test.rs:143:22:143:63 | ... .open(...) [Ok] | test.rs:143:22:143:72 | ... .unwrap() | provenance | MaD:37 | | test.rs:143:22:143:72 | ... .unwrap() | test.rs:143:13:143:18 | mut f1 | provenance | | -| test.rs:143:50:143:53 | open | test.rs:143:22:143:63 | ... .open(...) [Ok] | provenance | Src:MaD:6 | | test.rs:145:22:145:23 | f1 | test.rs:145:30:145:40 | [post] &mut buffer [&ref] | provenance | MaD:22 | | test.rs:145:30:145:40 | [post] &mut buffer [&ref] | test.rs:145:35:145:40 | [post] buffer | provenance | | | test.rs:145:35:145:40 | [post] buffer | test.rs:146:15:146:20 | buffer | provenance | | | test.rs:146:15:146:20 | buffer | test.rs:146:14:146:20 | &buffer | provenance | | | test.rs:150:13:150:18 | mut f2 | test.rs:155:22:155:23 | f2 | provenance | | +| test.rs:150:22:152:27 | ... .open(...) | test.rs:150:22:152:27 | ... .open(...) [Ok] | provenance | Src:MaD:6 | | test.rs:150:22:152:27 | ... .open(...) [Ok] | test.rs:150:22:153:21 | ... .unwrap() | provenance | MaD:37 | | test.rs:150:22:153:21 | ... .unwrap() | test.rs:150:13:150:18 | mut f2 | provenance | | -| test.rs:152:14:152:17 | open | test.rs:150:22:152:27 | ... .open(...) [Ok] | provenance | Src:MaD:6 | | test.rs:155:22:155:23 | f2 | test.rs:155:30:155:40 | [post] &mut buffer [&ref] | provenance | MaD:22 | | test.rs:155:30:155:40 | [post] &mut buffer [&ref] | test.rs:155:35:155:40 | [post] buffer | provenance | | | test.rs:155:35:155:40 | [post] buffer | test.rs:156:15:156:20 | buffer | provenance | | | test.rs:156:15:156:20 | buffer | test.rs:156:14:156:20 | &buffer | provenance | | | test.rs:160:13:160:18 | mut f3 | test.rs:168:22:168:23 | f3 | provenance | | +| test.rs:160:22:165:27 | ... .open(...) | test.rs:160:22:165:27 | ... .open(...) [Ok] | provenance | Src:MaD:6 | | test.rs:160:22:165:27 | ... .open(...) [Ok] | test.rs:160:22:166:21 | ... .unwrap() | provenance | MaD:37 | | test.rs:160:22:166:21 | ... .unwrap() | test.rs:160:13:160:18 | mut f3 | provenance | | -| test.rs:165:14:165:17 | open | test.rs:160:22:165:27 | ... .open(...) [Ok] | provenance | Src:MaD:6 | | test.rs:168:22:168:23 | f3 | test.rs:168:30:168:40 | [post] &mut buffer [&ref] | provenance | MaD:22 | | test.rs:168:30:168:40 | [post] &mut buffer [&ref] | test.rs:168:35:168:40 | [post] buffer | provenance | | | test.rs:168:35:168:40 | [post] buffer | test.rs:169:15:169:20 | buffer | provenance | | | test.rs:169:15:169:20 | buffer | test.rs:169:14:169:20 | &buffer | provenance | | | test.rs:176:13:176:17 | file1 | test.rs:178:26:178:30 | file1 | provenance | | -| test.rs:176:21:176:39 | ...::open | test.rs:176:21:176:51 | ...::open(...) [Ok] | provenance | Src:MaD:5 | +| test.rs:176:21:176:51 | ...::open(...) | test.rs:176:21:176:51 | ...::open(...) [Ok] | provenance | Src:MaD:5 | | test.rs:176:21:176:51 | ...::open(...) [Ok] | test.rs:176:21:176:52 | TryExpr | provenance | | | test.rs:176:21:176:52 | TryExpr | test.rs:176:13:176:17 | file1 | provenance | | | test.rs:177:13:177:17 | file2 | test.rs:178:38:178:42 | file2 | provenance | | -| test.rs:177:21:177:39 | ...::open | test.rs:177:21:177:59 | ...::open(...) [Ok] | provenance | Src:MaD:5 | +| test.rs:177:21:177:59 | ...::open(...) | test.rs:177:21:177:59 | ...::open(...) [Ok] | provenance | Src:MaD:5 | | test.rs:177:21:177:59 | ...::open(...) [Ok] | test.rs:177:21:177:60 | TryExpr | provenance | | | test.rs:177:21:177:60 | TryExpr | test.rs:177:13:177:17 | file2 | provenance | | | test.rs:178:13:178:22 | mut reader | test.rs:179:9:179:14 | reader | provenance | | @@ -207,7 +203,7 @@ edges | test.rs:179:36:179:41 | [post] buffer | test.rs:180:15:180:20 | buffer | provenance | | | test.rs:180:15:180:20 | buffer | test.rs:180:14:180:20 | &buffer | provenance | | | test.rs:185:13:185:17 | file1 | test.rs:186:26:186:30 | file1 | provenance | | -| test.rs:185:21:185:39 | ...::open | test.rs:185:21:185:51 | ...::open(...) [Ok] | provenance | Src:MaD:5 | +| test.rs:185:21:185:51 | ...::open(...) | test.rs:185:21:185:51 | ...::open(...) [Ok] | provenance | Src:MaD:5 | | test.rs:185:21:185:51 | ...::open(...) [Ok] | test.rs:185:21:185:52 | TryExpr | provenance | | | test.rs:185:21:185:52 | TryExpr | test.rs:185:13:185:17 | file1 | provenance | | | test.rs:186:13:186:22 | mut reader | test.rs:187:9:187:14 | reader | provenance | | @@ -226,7 +222,7 @@ edges | test.rs:197:9:197:16 | mut file | test.rs:226:18:226:21 | file | provenance | | | test.rs:197:9:197:16 | mut file | test.rs:227:18:227:21 | file | provenance | | | test.rs:197:9:197:16 | mut file | test.rs:236:9:236:12 | file | provenance | | -| test.rs:197:20:197:40 | ...::open | test.rs:197:20:197:52 | ...::open(...) [future, Ok] | provenance | Src:MaD:7 | +| test.rs:197:20:197:52 | ...::open(...) | test.rs:197:20:197:52 | ...::open(...) [future, Ok] | provenance | Src:MaD:7 | | test.rs:197:20:197:52 | ...::open(...) [future, Ok] | test.rs:197:20:197:58 | await ... [Ok] | provenance | | | test.rs:197:20:197:58 | await ... [Ok] | test.rs:197:20:197:59 | TryExpr | provenance | | | test.rs:197:20:197:59 | TryExpr | test.rs:197:9:197:16 | mut file | provenance | | @@ -271,16 +267,16 @@ edges | test.rs:236:28:236:33 | [post] buffer | test.rs:237:15:237:20 | buffer | provenance | | | test.rs:237:15:237:20 | buffer | test.rs:237:14:237:20 | &buffer | provenance | | | test.rs:243:13:243:18 | mut f1 | test.rs:245:22:245:23 | f1 | provenance | | +| test.rs:243:22:243:65 | ... .open(...) | test.rs:243:22:243:65 | ... .open(...) [future, Ok] | provenance | Src:MaD:8 | | test.rs:243:22:243:65 | ... .open(...) [future, Ok] | test.rs:243:22:243:71 | await ... [Ok] | provenance | | | test.rs:243:22:243:71 | await ... [Ok] | test.rs:243:22:243:72 | TryExpr | provenance | | | test.rs:243:22:243:72 | TryExpr | test.rs:243:13:243:18 | mut f1 | provenance | | -| test.rs:243:52:243:55 | open | test.rs:243:22:243:65 | ... .open(...) [future, Ok] | provenance | Src:MaD:8 | | test.rs:245:22:245:23 | f1 | test.rs:245:30:245:40 | [post] &mut buffer [&ref] | provenance | MaD:26 | | test.rs:245:30:245:40 | [post] &mut buffer [&ref] | test.rs:245:35:245:40 | [post] buffer | provenance | | | test.rs:245:35:245:40 | [post] buffer | test.rs:246:15:246:20 | buffer | provenance | | | test.rs:246:15:246:20 | buffer | test.rs:246:14:246:20 | &buffer | provenance | | | test.rs:274:9:274:16 | mut file | test.rs:278:22:278:25 | file | provenance | | -| test.rs:274:20:274:44 | ...::open | test.rs:274:20:274:56 | ...::open(...) [future, Ok] | provenance | Src:MaD:1 | +| test.rs:274:20:274:56 | ...::open(...) | test.rs:274:20:274:56 | ...::open(...) [future, Ok] | provenance | Src:MaD:1 | | test.rs:274:20:274:56 | ...::open(...) [future, Ok] | test.rs:274:20:274:62 | await ... [Ok] | provenance | | | test.rs:274:20:274:62 | await ... [Ok] | test.rs:274:20:274:63 | TryExpr | provenance | | | test.rs:274:20:274:63 | TryExpr | test.rs:274:9:274:16 | mut file | provenance | | @@ -289,33 +285,32 @@ edges | test.rs:278:37:278:42 | [post] buffer | test.rs:279:15:279:20 | buffer | provenance | | | test.rs:279:15:279:20 | buffer | test.rs:279:14:279:20 | &buffer | provenance | | | test.rs:285:13:285:18 | mut f1 | test.rs:287:22:287:23 | f1 | provenance | | +| test.rs:285:22:285:69 | ... .open(...) | test.rs:285:22:285:69 | ... .open(...) [future, Ok] | provenance | Src:MaD:2 | | test.rs:285:22:285:69 | ... .open(...) [future, Ok] | test.rs:285:22:285:75 | await ... [Ok] | provenance | | | test.rs:285:22:285:75 | await ... [Ok] | test.rs:285:22:285:76 | TryExpr | provenance | | | test.rs:285:22:285:76 | TryExpr | test.rs:285:13:285:18 | mut f1 | provenance | | -| test.rs:285:56:285:59 | open | test.rs:285:22:285:69 | ... .open(...) [future, Ok] | provenance | Src:MaD:2 | | test.rs:287:22:287:23 | f1 | test.rs:287:30:287:40 | [post] &mut buffer [&ref] | provenance | MaD:17 | | test.rs:287:30:287:40 | [post] &mut buffer [&ref] | test.rs:287:35:287:40 | [post] buffer | provenance | | | test.rs:287:35:287:40 | [post] buffer | test.rs:288:15:288:20 | buffer | provenance | | | test.rs:288:15:288:20 | buffer | test.rs:288:14:288:20 | &buffer | provenance | | nodes | test.rs:12:13:12:18 | buffer | semmle.label | buffer | -| test.rs:12:31:12:43 | ...::read | semmle.label | ...::read | +| test.rs:12:31:12:55 | ...::read(...) | semmle.label | ...::read(...) | | test.rs:12:31:12:55 | ...::read(...) [Ok] | semmle.label | ...::read(...) [Ok] | | test.rs:12:31:12:56 | TryExpr | semmle.label | TryExpr | | test.rs:13:14:13:19 | buffer | semmle.label | buffer | | test.rs:17:13:17:18 | buffer | semmle.label | buffer | -| test.rs:17:31:17:38 | ...::read | semmle.label | ...::read | +| test.rs:17:31:17:50 | ...::read(...) | semmle.label | ...::read(...) | | test.rs:17:31:17:50 | ...::read(...) [Ok] | semmle.label | ...::read(...) [Ok] | | test.rs:17:31:17:51 | TryExpr | semmle.label | TryExpr | | test.rs:18:14:18:19 | buffer | semmle.label | buffer | | test.rs:22:13:22:18 | buffer | semmle.label | buffer | -| test.rs:22:22:22:39 | ...::read_to_string | semmle.label | ...::read_to_string | +| test.rs:22:22:22:51 | ...::read_to_string(...) | semmle.label | ...::read_to_string(...) | | test.rs:22:22:22:51 | ...::read_to_string(...) [Ok] | semmle.label | ...::read_to_string(...) [Ok] | | test.rs:22:22:22:52 | TryExpr | semmle.label | TryExpr | | test.rs:23:14:23:19 | buffer | semmle.label | buffer | | test.rs:30:13:30:16 | path | semmle.label | path | | test.rs:30:20:30:27 | e.path() | semmle.label | e.path() | -| test.rs:30:22:30:25 | path | semmle.label | path | | test.rs:31:14:31:17 | path | semmle.label | path | | test.rs:31:14:31:25 | path.clone() | semmle.label | path.clone() | | test.rs:32:14:32:17 | path | semmle.label | path | @@ -350,7 +345,6 @@ nodes | test.rs:42:14:42:17 | path | semmle.label | path | | test.rs:44:13:44:21 | file_name | semmle.label | file_name | | test.rs:44:25:44:37 | e.file_name() | semmle.label | e.file_name() | -| test.rs:44:27:44:35 | file_name | semmle.label | file_name | | test.rs:45:14:45:22 | file_name | semmle.label | file_name | | test.rs:45:14:45:30 | file_name.clone() | semmle.label | file_name.clone() | | test.rs:46:14:46:22 | file_name | semmle.label | file_name | @@ -368,44 +362,42 @@ nodes | test.rs:49:14:49:49 | ... .as_encoded_bytes() | semmle.label | ... .as_encoded_bytes() | | test.rs:50:14:50:22 | file_name | semmle.label | file_name | | test.rs:68:13:68:18 | target | semmle.label | target | -| test.rs:68:22:68:34 | ...::read_link | semmle.label | ...::read_link | +| test.rs:68:22:68:49 | ...::read_link(...) | semmle.label | ...::read_link(...) | | test.rs:68:22:68:49 | ...::read_link(...) [Ok] | semmle.label | ...::read_link(...) [Ok] | | test.rs:68:22:68:50 | TryExpr | semmle.label | TryExpr | | test.rs:69:14:69:19 | target | semmle.label | target | | test.rs:77:13:77:18 | buffer | semmle.label | buffer | -| test.rs:77:31:77:45 | ...::read | semmle.label | ...::read | +| test.rs:77:31:77:57 | ...::read(...) | semmle.label | ...::read(...) | | test.rs:77:31:77:57 | ...::read(...) [future, Ok] | semmle.label | ...::read(...) [future, Ok] | | test.rs:77:31:77:63 | await ... [Ok] | semmle.label | await ... [Ok] | | test.rs:77:31:77:64 | TryExpr | semmle.label | TryExpr | | test.rs:78:14:78:19 | buffer | semmle.label | buffer | | test.rs:82:13:82:18 | buffer | semmle.label | buffer | -| test.rs:82:31:82:45 | ...::read | semmle.label | ...::read | +| test.rs:82:31:82:57 | ...::read(...) | semmle.label | ...::read(...) | | test.rs:82:31:82:57 | ...::read(...) [future, Ok] | semmle.label | ...::read(...) [future, Ok] | | test.rs:82:31:82:63 | await ... [Ok] | semmle.label | await ... [Ok] | | test.rs:82:31:82:64 | TryExpr | semmle.label | TryExpr | | test.rs:83:14:83:19 | buffer | semmle.label | buffer | | test.rs:87:13:87:18 | buffer | semmle.label | buffer | -| test.rs:87:22:87:46 | ...::read_to_string | semmle.label | ...::read_to_string | +| test.rs:87:22:87:58 | ...::read_to_string(...) | semmle.label | ...::read_to_string(...) | | test.rs:87:22:87:58 | ...::read_to_string(...) [future, Ok] | semmle.label | ...::read_to_string(...) [future, Ok] | | test.rs:87:22:87:64 | await ... [Ok] | semmle.label | await ... [Ok] | | test.rs:87:22:87:65 | TryExpr | semmle.label | TryExpr | | test.rs:88:14:88:19 | buffer | semmle.label | buffer | | test.rs:93:13:93:16 | path | semmle.label | path | | test.rs:93:20:93:31 | entry.path() | semmle.label | entry.path() | -| test.rs:93:26:93:29 | path | semmle.label | path | | test.rs:94:13:94:21 | file_name | semmle.label | file_name | | test.rs:94:25:94:41 | entry.file_name() | semmle.label | entry.file_name() | -| test.rs:94:31:94:39 | file_name | semmle.label | file_name | | test.rs:95:14:95:17 | path | semmle.label | path | | test.rs:96:14:96:22 | file_name | semmle.label | file_name | | test.rs:100:13:100:18 | target | semmle.label | target | -| test.rs:100:22:100:41 | ...::read_link | semmle.label | ...::read_link | +| test.rs:100:22:100:56 | ...::read_link(...) | semmle.label | ...::read_link(...) | | test.rs:100:22:100:56 | ...::read_link(...) [future, Ok] | semmle.label | ...::read_link(...) [future, Ok] | | test.rs:100:22:100:62 | await ... [Ok] | semmle.label | await ... [Ok] | | test.rs:100:22:100:63 | TryExpr | semmle.label | TryExpr | | test.rs:101:14:101:19 | target | semmle.label | target | | test.rs:110:9:110:16 | mut file | semmle.label | mut file | -| test.rs:110:20:110:38 | ...::open | semmle.label | ...::open | +| test.rs:110:20:110:50 | ...::open(...) | semmle.label | ...::open(...) | | test.rs:110:20:110:50 | ...::open(...) [Ok] | semmle.label | ...::open(...) [Ok] | | test.rs:110:20:110:51 | TryExpr | semmle.label | TryExpr | | test.rs:114:22:114:25 | file | semmle.label | file | @@ -432,38 +424,38 @@ nodes | test.rs:136:17:136:28 | file.bytes() | semmle.label | file.bytes() | | test.rs:137:14:137:17 | byte | semmle.label | byte | | test.rs:143:13:143:18 | mut f1 | semmle.label | mut f1 | +| test.rs:143:22:143:63 | ... .open(...) | semmle.label | ... .open(...) | | test.rs:143:22:143:63 | ... .open(...) [Ok] | semmle.label | ... .open(...) [Ok] | | test.rs:143:22:143:72 | ... .unwrap() | semmle.label | ... .unwrap() | -| test.rs:143:50:143:53 | open | semmle.label | open | | test.rs:145:22:145:23 | f1 | semmle.label | f1 | | test.rs:145:30:145:40 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:145:35:145:40 | [post] buffer | semmle.label | [post] buffer | | test.rs:146:14:146:20 | &buffer | semmle.label | &buffer | | test.rs:146:15:146:20 | buffer | semmle.label | buffer | | test.rs:150:13:150:18 | mut f2 | semmle.label | mut f2 | +| test.rs:150:22:152:27 | ... .open(...) | semmle.label | ... .open(...) | | test.rs:150:22:152:27 | ... .open(...) [Ok] | semmle.label | ... .open(...) [Ok] | | test.rs:150:22:153:21 | ... .unwrap() | semmle.label | ... .unwrap() | -| test.rs:152:14:152:17 | open | semmle.label | open | | test.rs:155:22:155:23 | f2 | semmle.label | f2 | | test.rs:155:30:155:40 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:155:35:155:40 | [post] buffer | semmle.label | [post] buffer | | test.rs:156:14:156:20 | &buffer | semmle.label | &buffer | | test.rs:156:15:156:20 | buffer | semmle.label | buffer | | test.rs:160:13:160:18 | mut f3 | semmle.label | mut f3 | +| test.rs:160:22:165:27 | ... .open(...) | semmle.label | ... .open(...) | | test.rs:160:22:165:27 | ... .open(...) [Ok] | semmle.label | ... .open(...) [Ok] | | test.rs:160:22:166:21 | ... .unwrap() | semmle.label | ... .unwrap() | -| test.rs:165:14:165:17 | open | semmle.label | open | | test.rs:168:22:168:23 | f3 | semmle.label | f3 | | test.rs:168:30:168:40 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:168:35:168:40 | [post] buffer | semmle.label | [post] buffer | | test.rs:169:14:169:20 | &buffer | semmle.label | &buffer | | test.rs:169:15:169:20 | buffer | semmle.label | buffer | | test.rs:176:13:176:17 | file1 | semmle.label | file1 | -| test.rs:176:21:176:39 | ...::open | semmle.label | ...::open | +| test.rs:176:21:176:51 | ...::open(...) | semmle.label | ...::open(...) | | test.rs:176:21:176:51 | ...::open(...) [Ok] | semmle.label | ...::open(...) [Ok] | | test.rs:176:21:176:52 | TryExpr | semmle.label | TryExpr | | test.rs:177:13:177:17 | file2 | semmle.label | file2 | -| test.rs:177:21:177:39 | ...::open | semmle.label | ...::open | +| test.rs:177:21:177:59 | ...::open(...) | semmle.label | ...::open(...) | | test.rs:177:21:177:59 | ...::open(...) [Ok] | semmle.label | ...::open(...) [Ok] | | test.rs:177:21:177:60 | TryExpr | semmle.label | TryExpr | | test.rs:178:13:178:22 | mut reader | semmle.label | mut reader | @@ -476,7 +468,7 @@ nodes | test.rs:180:14:180:20 | &buffer | semmle.label | &buffer | | test.rs:180:15:180:20 | buffer | semmle.label | buffer | | test.rs:185:13:185:17 | file1 | semmle.label | file1 | -| test.rs:185:21:185:39 | ...::open | semmle.label | ...::open | +| test.rs:185:21:185:51 | ...::open(...) | semmle.label | ...::open(...) | | test.rs:185:21:185:51 | ...::open(...) [Ok] | semmle.label | ...::open(...) [Ok] | | test.rs:185:21:185:52 | TryExpr | semmle.label | TryExpr | | test.rs:186:13:186:22 | mut reader | semmle.label | mut reader | @@ -488,7 +480,7 @@ nodes | test.rs:188:14:188:20 | &buffer | semmle.label | &buffer | | test.rs:188:15:188:20 | buffer | semmle.label | buffer | | test.rs:197:9:197:16 | mut file | semmle.label | mut file | -| test.rs:197:20:197:40 | ...::open | semmle.label | ...::open | +| test.rs:197:20:197:52 | ...::open(...) | semmle.label | ...::open(...) | | test.rs:197:20:197:52 | ...::open(...) [future, Ok] | semmle.label | ...::open(...) [future, Ok] | | test.rs:197:20:197:58 | await ... [Ok] | semmle.label | await ... [Ok] | | test.rs:197:20:197:59 | TryExpr | semmle.label | TryExpr | @@ -542,17 +534,17 @@ nodes | test.rs:237:14:237:20 | &buffer | semmle.label | &buffer | | test.rs:237:15:237:20 | buffer | semmle.label | buffer | | test.rs:243:13:243:18 | mut f1 | semmle.label | mut f1 | +| test.rs:243:22:243:65 | ... .open(...) | semmle.label | ... .open(...) | | test.rs:243:22:243:65 | ... .open(...) [future, Ok] | semmle.label | ... .open(...) [future, Ok] | | test.rs:243:22:243:71 | await ... [Ok] | semmle.label | await ... [Ok] | | test.rs:243:22:243:72 | TryExpr | semmle.label | TryExpr | -| test.rs:243:52:243:55 | open | semmle.label | open | | test.rs:245:22:245:23 | f1 | semmle.label | f1 | | test.rs:245:30:245:40 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:245:35:245:40 | [post] buffer | semmle.label | [post] buffer | | test.rs:246:14:246:20 | &buffer | semmle.label | &buffer | | test.rs:246:15:246:20 | buffer | semmle.label | buffer | | test.rs:274:9:274:16 | mut file | semmle.label | mut file | -| test.rs:274:20:274:44 | ...::open | semmle.label | ...::open | +| test.rs:274:20:274:56 | ...::open(...) | semmle.label | ...::open(...) | | test.rs:274:20:274:56 | ...::open(...) [future, Ok] | semmle.label | ...::open(...) [future, Ok] | | test.rs:274:20:274:62 | await ... [Ok] | semmle.label | await ... [Ok] | | test.rs:274:20:274:63 | TryExpr | semmle.label | TryExpr | @@ -562,10 +554,10 @@ nodes | test.rs:279:14:279:20 | &buffer | semmle.label | &buffer | | test.rs:279:15:279:20 | buffer | semmle.label | buffer | | test.rs:285:13:285:18 | mut f1 | semmle.label | mut f1 | +| test.rs:285:22:285:69 | ... .open(...) | semmle.label | ... .open(...) | | test.rs:285:22:285:69 | ... .open(...) [future, Ok] | semmle.label | ... .open(...) [future, Ok] | | test.rs:285:22:285:75 | await ... [Ok] | semmle.label | await ... [Ok] | | test.rs:285:22:285:76 | TryExpr | semmle.label | TryExpr | -| test.rs:285:56:285:59 | open | semmle.label | open | | test.rs:287:22:287:23 | f1 | semmle.label | f1 | | test.rs:287:30:287:40 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:287:35:287:40 | [post] buffer | semmle.label | [post] buffer | @@ -574,54 +566,54 @@ nodes subpaths testFailures #select -| test.rs:13:14:13:19 | buffer | test.rs:12:31:12:43 | ...::read | test.rs:13:14:13:19 | buffer | $@ | test.rs:12:31:12:43 | ...::read | ...::read | -| test.rs:18:14:18:19 | buffer | test.rs:17:31:17:38 | ...::read | test.rs:18:14:18:19 | buffer | $@ | test.rs:17:31:17:38 | ...::read | ...::read | -| test.rs:23:14:23:19 | buffer | test.rs:22:22:22:39 | ...::read_to_string | test.rs:23:14:23:19 | buffer | $@ | test.rs:22:22:22:39 | ...::read_to_string | ...::read_to_string | -| test.rs:31:14:31:25 | path.clone() | test.rs:30:22:30:25 | path | test.rs:31:14:31:25 | path.clone() | $@ | test.rs:30:22:30:25 | path | path | -| test.rs:32:14:32:35 | ... .as_path() | test.rs:30:22:30:25 | path | test.rs:32:14:32:35 | ... .as_path() | $@ | test.rs:30:22:30:25 | path | path | -| test.rs:33:14:33:42 | ... .into_os_string() | test.rs:30:22:30:25 | path | test.rs:33:14:33:42 | ... .into_os_string() | $@ | test.rs:30:22:30:25 | path | path | -| test.rs:34:14:34:69 | ...::from(...) | test.rs:30:22:30:25 | path | test.rs:34:14:34:69 | ...::from(...) | $@ | test.rs:30:22:30:25 | path | path | -| test.rs:35:14:35:37 | ... .as_os_str() | test.rs:30:22:30:25 | path | test.rs:35:14:35:37 | ... .as_os_str() | $@ | test.rs:30:22:30:25 | path | path | -| test.rs:36:14:36:41 | ... .as_mut_os_str() | test.rs:30:22:30:25 | path | test.rs:36:14:36:41 | ... .as_mut_os_str() | $@ | test.rs:30:22:30:25 | path | path | -| test.rs:37:14:37:26 | path.to_str() | test.rs:30:22:30:25 | path | test.rs:37:14:37:26 | path.to_str() | $@ | test.rs:30:22:30:25 | path | path | -| test.rs:38:14:38:31 | path.to_path_buf() | test.rs:30:22:30:25 | path | test.rs:38:14:38:31 | path.to_path_buf() | $@ | test.rs:30:22:30:25 | path | path | -| test.rs:39:14:39:38 | ... .unwrap() | test.rs:30:22:30:25 | path | test.rs:39:14:39:38 | ... .unwrap() | $@ | test.rs:30:22:30:25 | path | path | -| test.rs:40:14:40:38 | ... .unwrap() | test.rs:30:22:30:25 | path | test.rs:40:14:40:38 | ... .unwrap() | $@ | test.rs:30:22:30:25 | path | path | -| test.rs:41:14:41:41 | ... .unwrap() | test.rs:30:22:30:25 | path | test.rs:41:14:41:41 | ... .unwrap() | $@ | test.rs:30:22:30:25 | path | path | -| test.rs:42:14:42:17 | path | test.rs:30:22:30:25 | path | test.rs:42:14:42:17 | path | $@ | test.rs:30:22:30:25 | path | path | -| test.rs:45:14:45:30 | file_name.clone() | test.rs:44:27:44:35 | file_name | test.rs:45:14:45:30 | file_name.clone() | $@ | test.rs:44:27:44:35 | file_name | file_name | -| test.rs:46:14:46:53 | ... .unwrap() | test.rs:44:27:44:35 | file_name | test.rs:46:14:46:53 | ... .unwrap() | $@ | test.rs:44:27:44:35 | file_name | file_name | -| test.rs:47:14:47:40 | ... .unwrap() | test.rs:44:27:44:35 | file_name | test.rs:47:14:47:40 | ... .unwrap() | $@ | test.rs:44:27:44:35 | file_name | file_name | -| test.rs:48:14:48:49 | ... .to_mut() | test.rs:44:27:44:35 | file_name | test.rs:48:14:48:49 | ... .to_mut() | $@ | test.rs:44:27:44:35 | file_name | file_name | -| test.rs:49:14:49:49 | ... .as_encoded_bytes() | test.rs:44:27:44:35 | file_name | test.rs:49:14:49:49 | ... .as_encoded_bytes() | $@ | test.rs:44:27:44:35 | file_name | file_name | -| test.rs:50:14:50:22 | file_name | test.rs:44:27:44:35 | file_name | test.rs:50:14:50:22 | file_name | $@ | test.rs:44:27:44:35 | file_name | file_name | -| test.rs:69:14:69:19 | target | test.rs:68:22:68:34 | ...::read_link | test.rs:69:14:69:19 | target | $@ | test.rs:68:22:68:34 | ...::read_link | ...::read_link | -| test.rs:78:14:78:19 | buffer | test.rs:77:31:77:45 | ...::read | test.rs:78:14:78:19 | buffer | $@ | test.rs:77:31:77:45 | ...::read | ...::read | -| test.rs:83:14:83:19 | buffer | test.rs:82:31:82:45 | ...::read | test.rs:83:14:83:19 | buffer | $@ | test.rs:82:31:82:45 | ...::read | ...::read | -| test.rs:88:14:88:19 | buffer | test.rs:87:22:87:46 | ...::read_to_string | test.rs:88:14:88:19 | buffer | $@ | test.rs:87:22:87:46 | ...::read_to_string | ...::read_to_string | -| test.rs:95:14:95:17 | path | test.rs:93:26:93:29 | path | test.rs:95:14:95:17 | path | $@ | test.rs:93:26:93:29 | path | path | -| test.rs:96:14:96:22 | file_name | test.rs:94:31:94:39 | file_name | test.rs:96:14:96:22 | file_name | $@ | test.rs:94:31:94:39 | file_name | file_name | -| test.rs:101:14:101:19 | target | test.rs:100:22:100:41 | ...::read_link | test.rs:101:14:101:19 | target | $@ | test.rs:100:22:100:41 | ...::read_link | ...::read_link | -| test.rs:115:14:115:20 | &buffer | test.rs:110:20:110:38 | ...::open | test.rs:115:14:115:20 | &buffer | $@ | test.rs:110:20:110:38 | ...::open | ...::open | -| test.rs:121:14:121:20 | &buffer | test.rs:110:20:110:38 | ...::open | test.rs:121:14:121:20 | &buffer | $@ | test.rs:110:20:110:38 | ...::open | ...::open | -| test.rs:127:14:127:20 | &buffer | test.rs:110:20:110:38 | ...::open | test.rs:127:14:127:20 | &buffer | $@ | test.rs:110:20:110:38 | ...::open | ...::open | -| test.rs:133:14:133:20 | &buffer | test.rs:110:20:110:38 | ...::open | test.rs:133:14:133:20 | &buffer | $@ | test.rs:110:20:110:38 | ...::open | ...::open | -| test.rs:137:14:137:17 | byte | test.rs:110:20:110:38 | ...::open | test.rs:137:14:137:17 | byte | $@ | test.rs:110:20:110:38 | ...::open | ...::open | -| test.rs:146:14:146:20 | &buffer | test.rs:143:50:143:53 | open | test.rs:146:14:146:20 | &buffer | $@ | test.rs:143:50:143:53 | open | open | -| test.rs:156:14:156:20 | &buffer | test.rs:152:14:152:17 | open | test.rs:156:14:156:20 | &buffer | $@ | test.rs:152:14:152:17 | open | open | -| test.rs:169:14:169:20 | &buffer | test.rs:165:14:165:17 | open | test.rs:169:14:169:20 | &buffer | $@ | test.rs:165:14:165:17 | open | open | -| test.rs:180:14:180:20 | &buffer | test.rs:176:21:176:39 | ...::open | test.rs:180:14:180:20 | &buffer | $@ | test.rs:176:21:176:39 | ...::open | ...::open | -| test.rs:180:14:180:20 | &buffer | test.rs:177:21:177:39 | ...::open | test.rs:180:14:180:20 | &buffer | $@ | test.rs:177:21:177:39 | ...::open | ...::open | -| test.rs:188:14:188:20 | &buffer | test.rs:185:21:185:39 | ...::open | test.rs:188:14:188:20 | &buffer | $@ | test.rs:185:21:185:39 | ...::open | ...::open | -| test.rs:202:14:202:20 | &buffer | test.rs:197:20:197:40 | ...::open | test.rs:202:14:202:20 | &buffer | $@ | test.rs:197:20:197:40 | ...::open | ...::open | -| test.rs:208:14:208:20 | &buffer | test.rs:197:20:197:40 | ...::open | test.rs:208:14:208:20 | &buffer | $@ | test.rs:197:20:197:40 | ...::open | ...::open | -| test.rs:214:14:214:20 | &buffer | test.rs:197:20:197:40 | ...::open | test.rs:214:14:214:20 | &buffer | $@ | test.rs:197:20:197:40 | ...::open | ...::open | -| test.rs:220:14:220:20 | &buffer | test.rs:197:20:197:40 | ...::open | test.rs:220:14:220:20 | &buffer | $@ | test.rs:197:20:197:40 | ...::open | ...::open | -| test.rs:228:14:228:15 | v1 | test.rs:197:20:197:40 | ...::open | test.rs:228:14:228:15 | v1 | $@ | test.rs:197:20:197:40 | ...::open | ...::open | -| test.rs:229:14:229:15 | v2 | test.rs:197:20:197:40 | ...::open | test.rs:229:14:229:15 | v2 | $@ | test.rs:197:20:197:40 | ...::open | ...::open | -| test.rs:230:14:230:15 | v3 | test.rs:197:20:197:40 | ...::open | test.rs:230:14:230:15 | v3 | $@ | test.rs:197:20:197:40 | ...::open | ...::open | -| test.rs:231:14:231:15 | v4 | test.rs:197:20:197:40 | ...::open | test.rs:231:14:231:15 | v4 | $@ | test.rs:197:20:197:40 | ...::open | ...::open | -| test.rs:237:14:237:20 | &buffer | test.rs:197:20:197:40 | ...::open | test.rs:237:14:237:20 | &buffer | $@ | test.rs:197:20:197:40 | ...::open | ...::open | -| test.rs:246:14:246:20 | &buffer | test.rs:243:52:243:55 | open | test.rs:246:14:246:20 | &buffer | $@ | test.rs:243:52:243:55 | open | open | -| test.rs:279:14:279:20 | &buffer | test.rs:274:20:274:44 | ...::open | test.rs:279:14:279:20 | &buffer | $@ | test.rs:274:20:274:44 | ...::open | ...::open | -| test.rs:288:14:288:20 | &buffer | test.rs:285:56:285:59 | open | test.rs:288:14:288:20 | &buffer | $@ | test.rs:285:56:285:59 | open | open | +| test.rs:13:14:13:19 | buffer | test.rs:12:31:12:55 | ...::read(...) | test.rs:13:14:13:19 | buffer | $@ | test.rs:12:31:12:55 | ...::read(...) | ...::read(...) | +| test.rs:18:14:18:19 | buffer | test.rs:17:31:17:50 | ...::read(...) | test.rs:18:14:18:19 | buffer | $@ | test.rs:17:31:17:50 | ...::read(...) | ...::read(...) | +| test.rs:23:14:23:19 | buffer | test.rs:22:22:22:51 | ...::read_to_string(...) | test.rs:23:14:23:19 | buffer | $@ | test.rs:22:22:22:51 | ...::read_to_string(...) | ...::read_to_string(...) | +| test.rs:31:14:31:25 | path.clone() | test.rs:30:20:30:27 | e.path() | test.rs:31:14:31:25 | path.clone() | $@ | test.rs:30:20:30:27 | e.path() | e.path() | +| test.rs:32:14:32:35 | ... .as_path() | test.rs:30:20:30:27 | e.path() | test.rs:32:14:32:35 | ... .as_path() | $@ | test.rs:30:20:30:27 | e.path() | e.path() | +| test.rs:33:14:33:42 | ... .into_os_string() | test.rs:30:20:30:27 | e.path() | test.rs:33:14:33:42 | ... .into_os_string() | $@ | test.rs:30:20:30:27 | e.path() | e.path() | +| test.rs:34:14:34:69 | ...::from(...) | test.rs:30:20:30:27 | e.path() | test.rs:34:14:34:69 | ...::from(...) | $@ | test.rs:30:20:30:27 | e.path() | e.path() | +| test.rs:35:14:35:37 | ... .as_os_str() | test.rs:30:20:30:27 | e.path() | test.rs:35:14:35:37 | ... .as_os_str() | $@ | test.rs:30:20:30:27 | e.path() | e.path() | +| test.rs:36:14:36:41 | ... .as_mut_os_str() | test.rs:30:20:30:27 | e.path() | test.rs:36:14:36:41 | ... .as_mut_os_str() | $@ | test.rs:30:20:30:27 | e.path() | e.path() | +| test.rs:37:14:37:26 | path.to_str() | test.rs:30:20:30:27 | e.path() | test.rs:37:14:37:26 | path.to_str() | $@ | test.rs:30:20:30:27 | e.path() | e.path() | +| test.rs:38:14:38:31 | path.to_path_buf() | test.rs:30:20:30:27 | e.path() | test.rs:38:14:38:31 | path.to_path_buf() | $@ | test.rs:30:20:30:27 | e.path() | e.path() | +| test.rs:39:14:39:38 | ... .unwrap() | test.rs:30:20:30:27 | e.path() | test.rs:39:14:39:38 | ... .unwrap() | $@ | test.rs:30:20:30:27 | e.path() | e.path() | +| test.rs:40:14:40:38 | ... .unwrap() | test.rs:30:20:30:27 | e.path() | test.rs:40:14:40:38 | ... .unwrap() | $@ | test.rs:30:20:30:27 | e.path() | e.path() | +| test.rs:41:14:41:41 | ... .unwrap() | test.rs:30:20:30:27 | e.path() | test.rs:41:14:41:41 | ... .unwrap() | $@ | test.rs:30:20:30:27 | e.path() | e.path() | +| test.rs:42:14:42:17 | path | test.rs:30:20:30:27 | e.path() | test.rs:42:14:42:17 | path | $@ | test.rs:30:20:30:27 | e.path() | e.path() | +| test.rs:45:14:45:30 | file_name.clone() | test.rs:44:25:44:37 | e.file_name() | test.rs:45:14:45:30 | file_name.clone() | $@ | test.rs:44:25:44:37 | e.file_name() | e.file_name() | +| test.rs:46:14:46:53 | ... .unwrap() | test.rs:44:25:44:37 | e.file_name() | test.rs:46:14:46:53 | ... .unwrap() | $@ | test.rs:44:25:44:37 | e.file_name() | e.file_name() | +| test.rs:47:14:47:40 | ... .unwrap() | test.rs:44:25:44:37 | e.file_name() | test.rs:47:14:47:40 | ... .unwrap() | $@ | test.rs:44:25:44:37 | e.file_name() | e.file_name() | +| test.rs:48:14:48:49 | ... .to_mut() | test.rs:44:25:44:37 | e.file_name() | test.rs:48:14:48:49 | ... .to_mut() | $@ | test.rs:44:25:44:37 | e.file_name() | e.file_name() | +| test.rs:49:14:49:49 | ... .as_encoded_bytes() | test.rs:44:25:44:37 | e.file_name() | test.rs:49:14:49:49 | ... .as_encoded_bytes() | $@ | test.rs:44:25:44:37 | e.file_name() | e.file_name() | +| test.rs:50:14:50:22 | file_name | test.rs:44:25:44:37 | e.file_name() | test.rs:50:14:50:22 | file_name | $@ | test.rs:44:25:44:37 | e.file_name() | e.file_name() | +| test.rs:69:14:69:19 | target | test.rs:68:22:68:49 | ...::read_link(...) | test.rs:69:14:69:19 | target | $@ | test.rs:68:22:68:49 | ...::read_link(...) | ...::read_link(...) | +| test.rs:78:14:78:19 | buffer | test.rs:77:31:77:57 | ...::read(...) | test.rs:78:14:78:19 | buffer | $@ | test.rs:77:31:77:57 | ...::read(...) | ...::read(...) | +| test.rs:83:14:83:19 | buffer | test.rs:82:31:82:57 | ...::read(...) | test.rs:83:14:83:19 | buffer | $@ | test.rs:82:31:82:57 | ...::read(...) | ...::read(...) | +| test.rs:88:14:88:19 | buffer | test.rs:87:22:87:58 | ...::read_to_string(...) | test.rs:88:14:88:19 | buffer | $@ | test.rs:87:22:87:58 | ...::read_to_string(...) | ...::read_to_string(...) | +| test.rs:95:14:95:17 | path | test.rs:93:20:93:31 | entry.path() | test.rs:95:14:95:17 | path | $@ | test.rs:93:20:93:31 | entry.path() | entry.path() | +| test.rs:96:14:96:22 | file_name | test.rs:94:25:94:41 | entry.file_name() | test.rs:96:14:96:22 | file_name | $@ | test.rs:94:25:94:41 | entry.file_name() | entry.file_name() | +| test.rs:101:14:101:19 | target | test.rs:100:22:100:56 | ...::read_link(...) | test.rs:101:14:101:19 | target | $@ | test.rs:100:22:100:56 | ...::read_link(...) | ...::read_link(...) | +| test.rs:115:14:115:20 | &buffer | test.rs:110:20:110:50 | ...::open(...) | test.rs:115:14:115:20 | &buffer | $@ | test.rs:110:20:110:50 | ...::open(...) | ...::open(...) | +| test.rs:121:14:121:20 | &buffer | test.rs:110:20:110:50 | ...::open(...) | test.rs:121:14:121:20 | &buffer | $@ | test.rs:110:20:110:50 | ...::open(...) | ...::open(...) | +| test.rs:127:14:127:20 | &buffer | test.rs:110:20:110:50 | ...::open(...) | test.rs:127:14:127:20 | &buffer | $@ | test.rs:110:20:110:50 | ...::open(...) | ...::open(...) | +| test.rs:133:14:133:20 | &buffer | test.rs:110:20:110:50 | ...::open(...) | test.rs:133:14:133:20 | &buffer | $@ | test.rs:110:20:110:50 | ...::open(...) | ...::open(...) | +| test.rs:137:14:137:17 | byte | test.rs:110:20:110:50 | ...::open(...) | test.rs:137:14:137:17 | byte | $@ | test.rs:110:20:110:50 | ...::open(...) | ...::open(...) | +| test.rs:146:14:146:20 | &buffer | test.rs:143:22:143:63 | ... .open(...) | test.rs:146:14:146:20 | &buffer | $@ | test.rs:143:22:143:63 | ... .open(...) | ... .open(...) | +| test.rs:156:14:156:20 | &buffer | test.rs:150:22:152:27 | ... .open(...) | test.rs:156:14:156:20 | &buffer | $@ | test.rs:150:22:152:27 | ... .open(...) | ... .open(...) | +| test.rs:169:14:169:20 | &buffer | test.rs:160:22:165:27 | ... .open(...) | test.rs:169:14:169:20 | &buffer | $@ | test.rs:160:22:165:27 | ... .open(...) | ... .open(...) | +| test.rs:180:14:180:20 | &buffer | test.rs:176:21:176:51 | ...::open(...) | test.rs:180:14:180:20 | &buffer | $@ | test.rs:176:21:176:51 | ...::open(...) | ...::open(...) | +| test.rs:180:14:180:20 | &buffer | test.rs:177:21:177:59 | ...::open(...) | test.rs:180:14:180:20 | &buffer | $@ | test.rs:177:21:177:59 | ...::open(...) | ...::open(...) | +| test.rs:188:14:188:20 | &buffer | test.rs:185:21:185:51 | ...::open(...) | test.rs:188:14:188:20 | &buffer | $@ | test.rs:185:21:185:51 | ...::open(...) | ...::open(...) | +| test.rs:202:14:202:20 | &buffer | test.rs:197:20:197:52 | ...::open(...) | test.rs:202:14:202:20 | &buffer | $@ | test.rs:197:20:197:52 | ...::open(...) | ...::open(...) | +| test.rs:208:14:208:20 | &buffer | test.rs:197:20:197:52 | ...::open(...) | test.rs:208:14:208:20 | &buffer | $@ | test.rs:197:20:197:52 | ...::open(...) | ...::open(...) | +| test.rs:214:14:214:20 | &buffer | test.rs:197:20:197:52 | ...::open(...) | test.rs:214:14:214:20 | &buffer | $@ | test.rs:197:20:197:52 | ...::open(...) | ...::open(...) | +| test.rs:220:14:220:20 | &buffer | test.rs:197:20:197:52 | ...::open(...) | test.rs:220:14:220:20 | &buffer | $@ | test.rs:197:20:197:52 | ...::open(...) | ...::open(...) | +| test.rs:228:14:228:15 | v1 | test.rs:197:20:197:52 | ...::open(...) | test.rs:228:14:228:15 | v1 | $@ | test.rs:197:20:197:52 | ...::open(...) | ...::open(...) | +| test.rs:229:14:229:15 | v2 | test.rs:197:20:197:52 | ...::open(...) | test.rs:229:14:229:15 | v2 | $@ | test.rs:197:20:197:52 | ...::open(...) | ...::open(...) | +| test.rs:230:14:230:15 | v3 | test.rs:197:20:197:52 | ...::open(...) | test.rs:230:14:230:15 | v3 | $@ | test.rs:197:20:197:52 | ...::open(...) | ...::open(...) | +| test.rs:231:14:231:15 | v4 | test.rs:197:20:197:52 | ...::open(...) | test.rs:231:14:231:15 | v4 | $@ | test.rs:197:20:197:52 | ...::open(...) | ...::open(...) | +| test.rs:237:14:237:20 | &buffer | test.rs:197:20:197:52 | ...::open(...) | test.rs:237:14:237:20 | &buffer | $@ | test.rs:197:20:197:52 | ...::open(...) | ...::open(...) | +| test.rs:246:14:246:20 | &buffer | test.rs:243:22:243:65 | ... .open(...) | test.rs:246:14:246:20 | &buffer | $@ | test.rs:243:22:243:65 | ... .open(...) | ... .open(...) | +| test.rs:279:14:279:20 | &buffer | test.rs:274:20:274:56 | ...::open(...) | test.rs:279:14:279:20 | &buffer | $@ | test.rs:274:20:274:56 | ...::open(...) | ...::open(...) | +| test.rs:288:14:288:20 | &buffer | test.rs:285:22:285:69 | ... .open(...) | test.rs:288:14:288:20 | &buffer | $@ | test.rs:285:22:285:69 | ... .open(...) | ... .open(...) | diff --git a/rust/ql/test/library-tests/dataflow/sources/file/TaintSources.expected b/rust/ql/test/library-tests/dataflow/sources/file/TaintSources.expected index dc17269abe81..70a9ed34806f 100644 --- a/rust/ql/test/library-tests/dataflow/sources/file/TaintSources.expected +++ b/rust/ql/test/library-tests/dataflow/sources/file/TaintSources.expected @@ -1,33 +1,33 @@ -| test.rs:12:31:12:43 | ...::read | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:17:31:17:38 | ...::read | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:22:22:22:39 | ...::read_to_string | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:27:26:27:37 | ...::read_dir | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:30:22:30:25 | path | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:44:27:44:35 | file_name | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:53:60:53:67 | read_dir | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:56:22:56:25 | path | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:57:27:57:35 | file_name | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:60:64:60:71 | read_dir | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:63:22:63:25 | path | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:64:27:64:35 | file_name | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:68:22:68:34 | ...::read_link | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:77:31:77:45 | ...::read | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:82:31:82:45 | ...::read | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:87:22:87:46 | ...::read_to_string | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:93:26:93:29 | path | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:94:31:94:39 | file_name | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:100:22:100:41 | ...::read_link | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:110:20:110:38 | ...::open | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:143:50:143:53 | open | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:152:14:152:17 | open | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:165:14:165:17 | open | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:176:21:176:39 | ...::open | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:177:21:177:39 | ...::open | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:185:21:185:39 | ...::open | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:197:20:197:40 | ...::open | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:243:52:243:55 | open | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:253:21:253:41 | ...::open | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:254:21:254:41 | ...::open | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:262:21:262:41 | ...::open | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:274:20:274:44 | ...::open | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:285:56:285:59 | open | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:12:31:12:55 | ...::read(...) | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:17:31:17:50 | ...::read(...) | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:22:22:22:51 | ...::read_to_string(...) | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:27:26:27:50 | ...::read_dir(...) | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:30:20:30:27 | e.path() | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:44:25:44:37 | e.file_name() | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:53:26:53:69 | ... .read_dir() | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:56:20:56:27 | e.path() | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:57:25:57:37 | e.file_name() | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:60:26:60:73 | ... .read_dir() | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:63:20:63:27 | e.path() | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:64:25:64:37 | e.file_name() | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:68:22:68:49 | ...::read_link(...) | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:77:31:77:57 | ...::read(...) | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:82:31:82:57 | ...::read(...) | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:87:22:87:58 | ...::read_to_string(...) | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:93:20:93:31 | entry.path() | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:94:25:94:41 | entry.file_name() | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:100:22:100:56 | ...::read_link(...) | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:110:20:110:50 | ...::open(...) | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:143:22:143:63 | ... .open(...) | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:150:22:152:27 | ... .open(...) | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:160:22:165:27 | ... .open(...) | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:176:21:176:51 | ...::open(...) | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:177:21:177:59 | ...::open(...) | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:185:21:185:51 | ...::open(...) | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:197:20:197:52 | ...::open(...) | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:243:22:243:65 | ... .open(...) | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:253:21:253:53 | ...::open(...) | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:254:21:254:61 | ...::open(...) | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:262:21:262:53 | ...::open(...) | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:274:20:274:56 | ...::open(...) | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:285:22:285:69 | ... .open(...) | Flow source 'FileSource' of type file (DEFAULT). | diff --git a/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected index b5a008f98388..8e44873ec860 100644 --- a/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected @@ -45,31 +45,31 @@ models | 44 | Summary: ::try_read_buf; Argument[self].Reference; Argument[0].Reference; taint | edges | test.rs:11:9:11:22 | remote_string1 | test.rs:12:10:12:23 | remote_string1 | provenance | | -| test.rs:11:26:11:47 | ...::get | test.rs:11:26:11:62 | ...::get(...) [Ok] | provenance | Src:MaD:7 | +| test.rs:11:26:11:62 | ...::get(...) | test.rs:11:26:11:62 | ...::get(...) [Ok] | provenance | Src:MaD:7 | | test.rs:11:26:11:62 | ...::get(...) [Ok] | test.rs:11:26:11:63 | TryExpr | provenance | | | test.rs:11:26:11:63 | TryExpr | test.rs:11:26:11:70 | ... .text() [Ok] | provenance | MaD:38 | | test.rs:11:26:11:70 | ... .text() [Ok] | test.rs:11:26:11:71 | TryExpr | provenance | | | test.rs:11:26:11:71 | TryExpr | test.rs:11:9:11:22 | remote_string1 | provenance | | | test.rs:14:9:14:22 | remote_string2 | test.rs:15:10:15:23 | remote_string2 | provenance | | -| test.rs:14:26:14:47 | ...::get | test.rs:14:26:14:62 | ...::get(...) [Ok] | provenance | Src:MaD:7 | +| test.rs:14:26:14:62 | ...::get(...) | test.rs:14:26:14:62 | ...::get(...) [Ok] | provenance | Src:MaD:7 | | test.rs:14:26:14:62 | ...::get(...) [Ok] | test.rs:14:26:14:71 | ... .unwrap() | provenance | MaD:28 | | test.rs:14:26:14:71 | ... .unwrap() | test.rs:14:26:14:78 | ... .text() [Ok] | provenance | MaD:38 | | test.rs:14:26:14:78 | ... .text() [Ok] | test.rs:14:26:14:87 | ... .unwrap() | provenance | MaD:28 | | test.rs:14:26:14:87 | ... .unwrap() | test.rs:14:9:14:22 | remote_string2 | provenance | | | test.rs:17:9:17:22 | remote_string3 | test.rs:18:10:18:23 | remote_string3 | provenance | | -| test.rs:17:26:17:47 | ...::get | test.rs:17:26:17:62 | ...::get(...) [Ok] | provenance | Src:MaD:7 | +| test.rs:17:26:17:62 | ...::get(...) | test.rs:17:26:17:62 | ...::get(...) [Ok] | provenance | Src:MaD:7 | | test.rs:17:26:17:62 | ...::get(...) [Ok] | test.rs:17:26:17:71 | ... .unwrap() | provenance | MaD:28 | | test.rs:17:26:17:71 | ... .unwrap() | test.rs:17:26:17:98 | ... .text_with_charset(...) [Ok] | provenance | MaD:39 | | test.rs:17:26:17:98 | ... .text_with_charset(...) [Ok] | test.rs:17:26:17:107 | ... .unwrap() | provenance | MaD:28 | | test.rs:17:26:17:107 | ... .unwrap() | test.rs:17:9:17:22 | remote_string3 | provenance | | | test.rs:20:9:20:22 | remote_string4 | test.rs:21:10:21:23 | remote_string4 | provenance | | -| test.rs:20:26:20:47 | ...::get | test.rs:20:26:20:62 | ...::get(...) [Ok] | provenance | Src:MaD:7 | +| test.rs:20:26:20:62 | ...::get(...) | test.rs:20:26:20:62 | ...::get(...) [Ok] | provenance | Src:MaD:7 | | test.rs:20:26:20:62 | ...::get(...) [Ok] | test.rs:20:26:20:71 | ... .unwrap() | provenance | MaD:28 | | test.rs:20:26:20:71 | ... .unwrap() | test.rs:20:26:20:79 | ... .bytes() [Ok] | provenance | MaD:37 | | test.rs:20:26:20:79 | ... .bytes() [Ok] | test.rs:20:26:20:88 | ... .unwrap() | provenance | MaD:28 | | test.rs:20:26:20:88 | ... .unwrap() | test.rs:20:9:20:22 | remote_string4 | provenance | | | test.rs:23:9:23:22 | remote_string5 | test.rs:24:10:24:23 | remote_string5 | provenance | | -| test.rs:23:26:23:37 | ...::get | test.rs:23:26:23:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:8 | +| test.rs:23:26:23:52 | ...::get(...) | test.rs:23:26:23:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:8 | | test.rs:23:26:23:52 | ...::get(...) [future, Ok] | test.rs:23:26:23:58 | await ... [Ok] | provenance | | | test.rs:23:26:23:58 | await ... [Ok] | test.rs:23:26:23:59 | TryExpr | provenance | | | test.rs:23:26:23:59 | TryExpr | test.rs:23:26:23:66 | ... .text() [future, Ok] | provenance | MaD:36 | @@ -77,7 +77,7 @@ edges | test.rs:23:26:23:72 | await ... [Ok] | test.rs:23:26:23:73 | TryExpr | provenance | | | test.rs:23:26:23:73 | TryExpr | test.rs:23:9:23:22 | remote_string5 | provenance | | | test.rs:26:9:26:22 | remote_string6 | test.rs:27:10:27:23 | remote_string6 | provenance | | -| test.rs:26:26:26:37 | ...::get | test.rs:26:26:26:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:8 | +| test.rs:26:26:26:52 | ...::get(...) | test.rs:26:26:26:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:8 | | test.rs:26:26:26:52 | ...::get(...) [future, Ok] | test.rs:26:26:26:58 | await ... [Ok] | provenance | | | test.rs:26:26:26:58 | await ... [Ok] | test.rs:26:26:26:59 | TryExpr | provenance | | | test.rs:26:26:26:59 | TryExpr | test.rs:26:26:26:67 | ... .bytes() [future, Ok] | provenance | MaD:34 | @@ -86,7 +86,7 @@ edges | test.rs:26:26:26:74 | TryExpr | test.rs:26:9:26:22 | remote_string6 | provenance | | | test.rs:29:9:29:20 | mut request1 | test.rs:30:10:30:17 | request1 | provenance | | | test.rs:29:9:29:20 | mut request1 | test.rs:31:29:31:36 | request1 | provenance | | -| test.rs:29:24:29:35 | ...::get | test.rs:29:24:29:50 | ...::get(...) [future, Ok] | provenance | Src:MaD:8 | +| test.rs:29:24:29:50 | ...::get(...) | test.rs:29:24:29:50 | ...::get(...) [future, Ok] | provenance | Src:MaD:8 | | test.rs:29:24:29:50 | ...::get(...) [future, Ok] | test.rs:29:24:29:56 | await ... [Ok] | provenance | | | test.rs:29:24:29:56 | await ... [Ok] | test.rs:29:24:29:57 | TryExpr | provenance | | | test.rs:29:24:29:57 | TryExpr | test.rs:29:9:29:20 | mut request1 | provenance | | @@ -102,19 +102,19 @@ edges | test.rs:31:29:31:51 | TryExpr [Some] | test.rs:31:15:31:25 | Some(...) [Some] | provenance | | | test.rs:60:13:60:20 | response | test.rs:61:15:61:22 | response | provenance | | | test.rs:60:13:60:20 | response | test.rs:62:14:62:21 | response | provenance | | +| test.rs:60:24:60:51 | sender.send_request(...) | test.rs:60:24:60:51 | sender.send_request(...) [future, Ok] | provenance | Src:MaD:2 | | test.rs:60:24:60:51 | sender.send_request(...) [future, Ok] | test.rs:60:24:60:57 | await ... [Ok] | provenance | | | test.rs:60:24:60:57 | await ... [Ok] | test.rs:60:24:60:58 | TryExpr | provenance | | | test.rs:60:24:60:58 | TryExpr | test.rs:60:13:60:20 | response | provenance | | -| test.rs:60:31:60:42 | send_request | test.rs:60:24:60:51 | sender.send_request(...) [future, Ok] | provenance | Src:MaD:2 | | test.rs:61:15:61:22 | response | test.rs:61:14:61:22 | &response | provenance | | | test.rs:67:9:67:20 | mut response | test.rs:68:11:68:18 | response | provenance | | | test.rs:67:9:67:20 | mut response | test.rs:76:18:76:25 | response | provenance | | | test.rs:67:9:67:20 | mut response | test.rs:77:18:77:25 | response | provenance | | | test.rs:67:9:67:20 | mut response | test.rs:79:24:79:31 | response | provenance | | +| test.rs:67:24:67:51 | sender.send_request(...) | test.rs:67:24:67:51 | sender.send_request(...) [future, Ok] | provenance | Src:MaD:2 | | test.rs:67:24:67:51 | sender.send_request(...) [future, Ok] | test.rs:67:24:67:57 | await ... [Ok] | provenance | | | test.rs:67:24:67:57 | await ... [Ok] | test.rs:67:24:67:58 | TryExpr | provenance | | | test.rs:67:24:67:58 | TryExpr | test.rs:67:9:67:20 | mut response | provenance | | -| test.rs:67:31:67:42 | send_request | test.rs:67:24:67:51 | sender.send_request(...) [future, Ok] | provenance | Src:MaD:2 | | test.rs:68:11:68:18 | response | test.rs:68:10:68:18 | &response | provenance | | | test.rs:76:18:76:25 | response | test.rs:76:18:76:32 | response.body() | provenance | MaD:31 | | test.rs:77:18:77:25 | response | test.rs:77:18:77:36 | response.body_mut() | provenance | MaD:32 | @@ -123,7 +123,7 @@ edges | test.rs:79:24:79:43 | response.into_body() | test.rs:79:17:79:20 | body | provenance | | | test.rs:80:19:80:22 | body | test.rs:80:18:80:22 | &body | provenance | | | test.rs:155:13:155:22 | mut stream | test.rs:162:17:162:22 | stream | provenance | | -| test.rs:155:26:155:53 | ...::connect | test.rs:155:26:155:62 | ...::connect(...) [Ok] | provenance | Src:MaD:4 | +| test.rs:155:26:155:62 | ...::connect(...) | test.rs:155:26:155:62 | ...::connect(...) [Ok] | provenance | Src:MaD:4 | | test.rs:155:26:155:62 | ...::connect(...) [Ok] | test.rs:155:26:155:63 | TryExpr | provenance | | | test.rs:155:26:155:63 | TryExpr | test.rs:155:13:155:22 | mut stream | provenance | | | test.rs:162:17:162:22 | stream | test.rs:162:29:162:39 | [post] &mut buffer [&ref] | provenance | MaD:20 | @@ -134,7 +134,7 @@ edges | test.rs:166:14:166:19 | buffer | test.rs:166:14:166:22 | buffer[0] | provenance | MaD:10 | | test.rs:174:13:174:22 | mut stream | test.rs:182:58:182:63 | stream | provenance | | | test.rs:174:13:174:22 | mut stream | test.rs:203:54:203:59 | stream | provenance | | -| test.rs:174:26:174:61 | ...::connect_timeout | test.rs:174:26:174:105 | ...::connect_timeout(...) [Ok] | provenance | Src:MaD:5 | +| test.rs:174:26:174:105 | ...::connect_timeout(...) | test.rs:174:26:174:105 | ...::connect_timeout(...) [Ok] | provenance | Src:MaD:5 | | test.rs:174:26:174:105 | ...::connect_timeout(...) [Ok] | test.rs:174:26:174:106 | TryExpr | provenance | | | test.rs:174:26:174:106 | TryExpr | test.rs:174:13:174:22 | mut stream | provenance | | | test.rs:182:21:182:30 | mut reader | test.rs:185:27:185:32 | reader | provenance | | @@ -158,7 +158,7 @@ edges | test.rs:224:9:224:24 | mut tokio_stream | test.rs:236:18:236:29 | tokio_stream | provenance | | | test.rs:224:9:224:24 | mut tokio_stream | test.rs:252:19:252:30 | tokio_stream | provenance | | | test.rs:224:9:224:24 | mut tokio_stream | test.rs:275:19:275:30 | tokio_stream | provenance | | -| test.rs:224:28:224:57 | ...::connect | test.rs:224:28:224:66 | ...::connect(...) [future, Ok] | provenance | Src:MaD:6 | +| test.rs:224:28:224:66 | ...::connect(...) | test.rs:224:28:224:66 | ...::connect(...) [future, Ok] | provenance | Src:MaD:6 | | test.rs:224:28:224:66 | ...::connect(...) [future, Ok] | test.rs:224:28:224:72 | await ... [Ok] | provenance | | | test.rs:224:28:224:72 | await ... [Ok] | test.rs:224:28:224:73 | TryExpr | provenance | | | test.rs:224:28:224:73 | TryExpr | test.rs:224:9:224:24 | mut tokio_stream | provenance | | @@ -183,7 +183,7 @@ edges | test.rs:275:50:275:55 | [post] buffer | test.rs:282:27:282:32 | buffer | provenance | | | test.rs:282:27:282:32 | buffer | test.rs:282:26:282:32 | &buffer | provenance | | | test.rs:332:9:332:18 | mut client | test.rs:333:22:333:27 | client | provenance | | -| test.rs:332:22:332:50 | ...::new | test.rs:332:22:332:75 | ...::new(...) [Ok] | provenance | Src:MaD:3 | +| test.rs:332:22:332:75 | ...::new(...) | test.rs:332:22:332:75 | ...::new(...) [Ok] | provenance | Src:MaD:3 | | test.rs:332:22:332:75 | ...::new(...) [Ok] | test.rs:332:22:332:84 | ... .unwrap() | provenance | MaD:28 | | test.rs:332:22:332:84 | ... .unwrap() | test.rs:332:9:332:18 | mut client | provenance | | | test.rs:333:9:333:18 | mut reader | test.rs:334:11:334:16 | reader | provenance | | @@ -207,7 +207,7 @@ edges | test.rs:351:15:351:20 | buffer | test.rs:351:14:351:20 | &buffer | provenance | | | test.rs:373:13:373:15 | tcp | test.rs:374:15:374:17 | tcp | provenance | | | test.rs:373:13:373:15 | tcp | test.rs:380:57:380:59 | tcp | provenance | | -| test.rs:373:19:373:36 | ...::connect | test.rs:373:19:373:41 | ...::connect(...) [future, Ok] | provenance | Src:MaD:1 | +| test.rs:373:19:373:41 | ...::connect(...) | test.rs:373:19:373:41 | ...::connect(...) [future, Ok] | provenance | Src:MaD:1 | | test.rs:373:19:373:41 | ...::connect(...) [future, Ok] | test.rs:373:19:373:47 | await ... [Ok] | provenance | | | test.rs:373:19:373:47 | await ... [Ok] | test.rs:373:19:373:48 | TryExpr | provenance | | | test.rs:373:19:373:48 | TryExpr | test.rs:373:13:373:15 | tcp | provenance | | @@ -370,35 +370,35 @@ edges | test.rs:501:19:501:24 | buffer | test.rs:501:18:501:24 | &buffer | provenance | | nodes | test.rs:11:9:11:22 | remote_string1 | semmle.label | remote_string1 | -| test.rs:11:26:11:47 | ...::get | semmle.label | ...::get | +| test.rs:11:26:11:62 | ...::get(...) | semmle.label | ...::get(...) | | test.rs:11:26:11:62 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | | test.rs:11:26:11:63 | TryExpr | semmle.label | TryExpr | | test.rs:11:26:11:70 | ... .text() [Ok] | semmle.label | ... .text() [Ok] | | test.rs:11:26:11:71 | TryExpr | semmle.label | TryExpr | | test.rs:12:10:12:23 | remote_string1 | semmle.label | remote_string1 | | test.rs:14:9:14:22 | remote_string2 | semmle.label | remote_string2 | -| test.rs:14:26:14:47 | ...::get | semmle.label | ...::get | +| test.rs:14:26:14:62 | ...::get(...) | semmle.label | ...::get(...) | | test.rs:14:26:14:62 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | | test.rs:14:26:14:71 | ... .unwrap() | semmle.label | ... .unwrap() | | test.rs:14:26:14:78 | ... .text() [Ok] | semmle.label | ... .text() [Ok] | | test.rs:14:26:14:87 | ... .unwrap() | semmle.label | ... .unwrap() | | test.rs:15:10:15:23 | remote_string2 | semmle.label | remote_string2 | | test.rs:17:9:17:22 | remote_string3 | semmle.label | remote_string3 | -| test.rs:17:26:17:47 | ...::get | semmle.label | ...::get | +| test.rs:17:26:17:62 | ...::get(...) | semmle.label | ...::get(...) | | test.rs:17:26:17:62 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | | test.rs:17:26:17:71 | ... .unwrap() | semmle.label | ... .unwrap() | | test.rs:17:26:17:98 | ... .text_with_charset(...) [Ok] | semmle.label | ... .text_with_charset(...) [Ok] | | test.rs:17:26:17:107 | ... .unwrap() | semmle.label | ... .unwrap() | | test.rs:18:10:18:23 | remote_string3 | semmle.label | remote_string3 | | test.rs:20:9:20:22 | remote_string4 | semmle.label | remote_string4 | -| test.rs:20:26:20:47 | ...::get | semmle.label | ...::get | +| test.rs:20:26:20:62 | ...::get(...) | semmle.label | ...::get(...) | | test.rs:20:26:20:62 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | | test.rs:20:26:20:71 | ... .unwrap() | semmle.label | ... .unwrap() | | test.rs:20:26:20:79 | ... .bytes() [Ok] | semmle.label | ... .bytes() [Ok] | | test.rs:20:26:20:88 | ... .unwrap() | semmle.label | ... .unwrap() | | test.rs:21:10:21:23 | remote_string4 | semmle.label | remote_string4 | | test.rs:23:9:23:22 | remote_string5 | semmle.label | remote_string5 | -| test.rs:23:26:23:37 | ...::get | semmle.label | ...::get | +| test.rs:23:26:23:52 | ...::get(...) | semmle.label | ...::get(...) | | test.rs:23:26:23:52 | ...::get(...) [future, Ok] | semmle.label | ...::get(...) [future, Ok] | | test.rs:23:26:23:58 | await ... [Ok] | semmle.label | await ... [Ok] | | test.rs:23:26:23:59 | TryExpr | semmle.label | TryExpr | @@ -407,7 +407,7 @@ nodes | test.rs:23:26:23:73 | TryExpr | semmle.label | TryExpr | | test.rs:24:10:24:23 | remote_string5 | semmle.label | remote_string5 | | test.rs:26:9:26:22 | remote_string6 | semmle.label | remote_string6 | -| test.rs:26:26:26:37 | ...::get | semmle.label | ...::get | +| test.rs:26:26:26:52 | ...::get(...) | semmle.label | ...::get(...) | | test.rs:26:26:26:52 | ...::get(...) [future, Ok] | semmle.label | ...::get(...) [future, Ok] | | test.rs:26:26:26:58 | await ... [Ok] | semmle.label | await ... [Ok] | | test.rs:26:26:26:59 | TryExpr | semmle.label | TryExpr | @@ -416,7 +416,7 @@ nodes | test.rs:26:26:26:74 | TryExpr | semmle.label | TryExpr | | test.rs:27:10:27:23 | remote_string6 | semmle.label | remote_string6 | | test.rs:29:9:29:20 | mut request1 | semmle.label | mut request1 | -| test.rs:29:24:29:35 | ...::get | semmle.label | ...::get | +| test.rs:29:24:29:50 | ...::get(...) | semmle.label | ...::get(...) | | test.rs:29:24:29:50 | ...::get(...) [future, Ok] | semmle.label | ...::get(...) [future, Ok] | | test.rs:29:24:29:56 | await ... [Ok] | semmle.label | await ... [Ok] | | test.rs:29:24:29:57 | TryExpr | semmle.label | TryExpr | @@ -433,18 +433,18 @@ nodes | test.rs:31:29:31:51 | TryExpr [Some] | semmle.label | TryExpr [Some] | | test.rs:32:14:32:18 | chunk | semmle.label | chunk | | test.rs:60:13:60:20 | response | semmle.label | response | +| test.rs:60:24:60:51 | sender.send_request(...) | semmle.label | sender.send_request(...) | | test.rs:60:24:60:51 | sender.send_request(...) [future, Ok] | semmle.label | sender.send_request(...) [future, Ok] | | test.rs:60:24:60:57 | await ... [Ok] | semmle.label | await ... [Ok] | | test.rs:60:24:60:58 | TryExpr | semmle.label | TryExpr | -| test.rs:60:31:60:42 | send_request | semmle.label | send_request | | test.rs:61:14:61:22 | &response | semmle.label | &response | | test.rs:61:15:61:22 | response | semmle.label | response | | test.rs:62:14:62:21 | response | semmle.label | response | | test.rs:67:9:67:20 | mut response | semmle.label | mut response | +| test.rs:67:24:67:51 | sender.send_request(...) | semmle.label | sender.send_request(...) | | test.rs:67:24:67:51 | sender.send_request(...) [future, Ok] | semmle.label | sender.send_request(...) [future, Ok] | | test.rs:67:24:67:57 | await ... [Ok] | semmle.label | await ... [Ok] | | test.rs:67:24:67:58 | TryExpr | semmle.label | TryExpr | -| test.rs:67:31:67:42 | send_request | semmle.label | send_request | | test.rs:68:10:68:18 | &response | semmle.label | &response | | test.rs:68:11:68:18 | response | semmle.label | response | | test.rs:76:18:76:25 | response | semmle.label | response | @@ -457,7 +457,7 @@ nodes | test.rs:80:18:80:22 | &body | semmle.label | &body | | test.rs:80:19:80:22 | body | semmle.label | body | | test.rs:155:13:155:22 | mut stream | semmle.label | mut stream | -| test.rs:155:26:155:53 | ...::connect | semmle.label | ...::connect | +| test.rs:155:26:155:62 | ...::connect(...) | semmle.label | ...::connect(...) | | test.rs:155:26:155:62 | ...::connect(...) [Ok] | semmle.label | ...::connect(...) [Ok] | | test.rs:155:26:155:63 | TryExpr | semmle.label | TryExpr | | test.rs:162:17:162:22 | stream | semmle.label | stream | @@ -468,7 +468,7 @@ nodes | test.rs:166:14:166:19 | buffer | semmle.label | buffer | | test.rs:166:14:166:22 | buffer[0] | semmle.label | buffer[0] | | test.rs:174:13:174:22 | mut stream | semmle.label | mut stream | -| test.rs:174:26:174:61 | ...::connect_timeout | semmle.label | ...::connect_timeout | +| test.rs:174:26:174:105 | ...::connect_timeout(...) | semmle.label | ...::connect_timeout(...) | | test.rs:174:26:174:105 | ...::connect_timeout(...) [Ok] | semmle.label | ...::connect_timeout(...) [Ok] | | test.rs:174:26:174:106 | TryExpr | semmle.label | TryExpr | | test.rs:182:21:182:30 | mut reader | semmle.label | mut reader | @@ -491,7 +491,7 @@ nodes | test.rs:205:28:205:37 | Ok(...) | semmle.label | Ok(...) | | test.rs:207:30:207:35 | string | semmle.label | string | | test.rs:224:9:224:24 | mut tokio_stream | semmle.label | mut tokio_stream | -| test.rs:224:28:224:57 | ...::connect | semmle.label | ...::connect | +| test.rs:224:28:224:66 | ...::connect(...) | semmle.label | ...::connect(...) | | test.rs:224:28:224:66 | ...::connect(...) [future, Ok] | semmle.label | ...::connect(...) [future, Ok] | | test.rs:224:28:224:72 | await ... [Ok] | semmle.label | await ... [Ok] | | test.rs:224:28:224:73 | TryExpr | semmle.label | TryExpr | @@ -520,7 +520,7 @@ nodes | test.rs:282:26:282:32 | &buffer | semmle.label | &buffer | | test.rs:282:27:282:32 | buffer | semmle.label | buffer | | test.rs:332:9:332:18 | mut client | semmle.label | mut client | -| test.rs:332:22:332:50 | ...::new | semmle.label | ...::new | +| test.rs:332:22:332:75 | ...::new(...) | semmle.label | ...::new(...) | | test.rs:332:22:332:75 | ...::new(...) [Ok] | semmle.label | ...::new(...) [Ok] | | test.rs:332:22:332:84 | ... .unwrap() | semmle.label | ... .unwrap() | | test.rs:333:9:333:18 | mut reader | semmle.label | mut reader | @@ -544,7 +544,7 @@ nodes | test.rs:351:14:351:20 | &buffer | semmle.label | &buffer | | test.rs:351:15:351:20 | buffer | semmle.label | buffer | | test.rs:373:13:373:15 | tcp | semmle.label | tcp | -| test.rs:373:19:373:36 | ...::connect | semmle.label | ...::connect | +| test.rs:373:19:373:41 | ...::connect(...) | semmle.label | ...::connect(...) | | test.rs:373:19:373:41 | ...::connect(...) [future, Ok] | semmle.label | ...::connect(...) [future, Ok] | | test.rs:373:19:373:47 | await ... [Ok] | semmle.label | await ... [Ok] | | test.rs:373:19:373:48 | TryExpr | semmle.label | TryExpr | @@ -700,57 +700,57 @@ nodes subpaths testFailures #select -| test.rs:12:10:12:23 | remote_string1 | test.rs:11:26:11:47 | ...::get | test.rs:12:10:12:23 | remote_string1 | $@ | test.rs:11:26:11:47 | ...::get | ...::get | -| test.rs:15:10:15:23 | remote_string2 | test.rs:14:26:14:47 | ...::get | test.rs:15:10:15:23 | remote_string2 | $@ | test.rs:14:26:14:47 | ...::get | ...::get | -| test.rs:18:10:18:23 | remote_string3 | test.rs:17:26:17:47 | ...::get | test.rs:18:10:18:23 | remote_string3 | $@ | test.rs:17:26:17:47 | ...::get | ...::get | -| test.rs:21:10:21:23 | remote_string4 | test.rs:20:26:20:47 | ...::get | test.rs:21:10:21:23 | remote_string4 | $@ | test.rs:20:26:20:47 | ...::get | ...::get | -| test.rs:24:10:24:23 | remote_string5 | test.rs:23:26:23:37 | ...::get | test.rs:24:10:24:23 | remote_string5 | $@ | test.rs:23:26:23:37 | ...::get | ...::get | -| test.rs:27:10:27:23 | remote_string6 | test.rs:26:26:26:37 | ...::get | test.rs:27:10:27:23 | remote_string6 | $@ | test.rs:26:26:26:37 | ...::get | ...::get | -| test.rs:30:10:30:41 | ... .unwrap() | test.rs:29:24:29:35 | ...::get | test.rs:30:10:30:41 | ... .unwrap() | $@ | test.rs:29:24:29:35 | ...::get | ...::get | -| test.rs:32:14:32:18 | chunk | test.rs:29:24:29:35 | ...::get | test.rs:32:14:32:18 | chunk | $@ | test.rs:29:24:29:35 | ...::get | ...::get | -| test.rs:61:14:61:22 | &response | test.rs:60:31:60:42 | send_request | test.rs:61:14:61:22 | &response | $@ | test.rs:60:31:60:42 | send_request | send_request | -| test.rs:62:14:62:21 | response | test.rs:60:31:60:42 | send_request | test.rs:62:14:62:21 | response | $@ | test.rs:60:31:60:42 | send_request | send_request | -| test.rs:68:10:68:18 | &response | test.rs:67:31:67:42 | send_request | test.rs:68:10:68:18 | &response | $@ | test.rs:67:31:67:42 | send_request | send_request | -| test.rs:76:18:76:32 | response.body() | test.rs:67:31:67:42 | send_request | test.rs:76:18:76:32 | response.body() | $@ | test.rs:67:31:67:42 | send_request | send_request | -| test.rs:77:18:77:36 | response.body_mut() | test.rs:67:31:67:42 | send_request | test.rs:77:18:77:36 | response.body_mut() | $@ | test.rs:67:31:67:42 | send_request | send_request | -| test.rs:80:18:80:22 | &body | test.rs:67:31:67:42 | send_request | test.rs:80:18:80:22 | &body | $@ | test.rs:67:31:67:42 | send_request | send_request | -| test.rs:165:14:165:20 | &buffer | test.rs:155:26:155:53 | ...::connect | test.rs:165:14:165:20 | &buffer | $@ | test.rs:155:26:155:53 | ...::connect | ...::connect | -| test.rs:166:14:166:22 | buffer[0] | test.rs:155:26:155:53 | ...::connect | test.rs:166:14:166:22 | buffer[0] | $@ | test.rs:155:26:155:53 | ...::connect | ...::connect | -| test.rs:192:34:192:38 | &line | test.rs:174:26:174:61 | ...::connect_timeout | test.rs:192:34:192:38 | &line | $@ | test.rs:174:26:174:61 | ...::connect_timeout | ...::connect_timeout | -| test.rs:207:30:207:35 | string | test.rs:174:26:174:61 | ...::connect_timeout | test.rs:207:30:207:35 | string | $@ | test.rs:174:26:174:61 | ...::connect_timeout | ...::connect_timeout | -| test.rs:239:14:239:21 | &buffer1 | test.rs:224:28:224:57 | ...::connect | test.rs:239:14:239:21 | &buffer1 | $@ | test.rs:224:28:224:57 | ...::connect | ...::connect | -| test.rs:240:14:240:23 | buffer1[0] | test.rs:224:28:224:57 | ...::connect | test.rs:240:14:240:23 | buffer1[0] | $@ | test.rs:224:28:224:57 | ...::connect | ...::connect | -| test.rs:243:14:243:21 | &buffer2 | test.rs:224:28:224:57 | ...::connect | test.rs:243:14:243:21 | &buffer2 | $@ | test.rs:224:28:224:57 | ...::connect | ...::connect | -| test.rs:244:14:244:23 | buffer2[0] | test.rs:224:28:224:57 | ...::connect | test.rs:244:14:244:23 | buffer2[0] | $@ | test.rs:224:28:224:57 | ...::connect | ...::connect | -| test.rs:259:26:259:32 | &buffer | test.rs:224:28:224:57 | ...::connect | test.rs:259:26:259:32 | &buffer | $@ | test.rs:224:28:224:57 | ...::connect | ...::connect | -| test.rs:282:26:282:32 | &buffer | test.rs:224:28:224:57 | ...::connect | test.rs:282:26:282:32 | &buffer | $@ | test.rs:224:28:224:57 | ...::connect | ...::connect | -| test.rs:334:10:334:16 | &reader | test.rs:332:22:332:50 | ...::new | test.rs:334:10:334:16 | &reader | $@ | test.rs:332:22:332:50 | ...::new | ...::new | -| test.rs:339:14:339:20 | &buffer | test.rs:332:22:332:50 | ...::new | test.rs:339:14:339:20 | &buffer | $@ | test.rs:332:22:332:50 | ...::new | ...::new | -| test.rs:345:14:345:20 | &buffer | test.rs:332:22:332:50 | ...::new | test.rs:345:14:345:20 | &buffer | $@ | test.rs:332:22:332:50 | ...::new | ...::new | -| test.rs:351:14:351:20 | &buffer | test.rs:332:22:332:50 | ...::new | test.rs:351:14:351:20 | &buffer | $@ | test.rs:332:22:332:50 | ...::new | ...::new | -| test.rs:374:14:374:17 | &tcp | test.rs:373:19:373:36 | ...::connect | test.rs:374:14:374:17 | &tcp | $@ | test.rs:373:19:373:36 | ...::connect | ...::connect | -| test.rs:381:14:381:20 | &reader | test.rs:373:19:373:36 | ...::connect | test.rs:381:14:381:20 | &reader | $@ | test.rs:373:19:373:36 | ...::connect | ...::connect | -| test.rs:387:18:387:24 | &pinned | test.rs:373:19:373:36 | ...::connect | test.rs:387:18:387:24 | &pinned | $@ | test.rs:373:19:373:36 | ...::connect | ...::connect | -| test.rs:391:22:391:28 | &buffer | test.rs:373:19:373:36 | ...::connect | test.rs:391:22:391:28 | &buffer | $@ | test.rs:373:19:373:36 | ...::connect | ...::connect | -| test.rs:392:22:392:33 | &... | test.rs:373:19:373:36 | ...::connect | test.rs:392:22:392:33 | &... | $@ | test.rs:373:19:373:36 | ...::connect | ...::connect | -| test.rs:400:18:400:40 | &... | test.rs:373:19:373:36 | ...::connect | test.rs:400:18:400:40 | &... | $@ | test.rs:373:19:373:36 | ...::connect | ...::connect | -| test.rs:405:18:405:40 | &... | test.rs:373:19:373:36 | ...::connect | test.rs:405:18:405:40 | &... | $@ | test.rs:373:19:373:36 | ...::connect | ...::connect | -| test.rs:409:14:409:21 | &reader2 | test.rs:373:19:373:36 | ...::connect | test.rs:409:14:409:21 | &reader2 | $@ | test.rs:373:19:373:36 | ...::connect | ...::connect | -| test.rs:414:18:414:24 | &pinned | test.rs:373:19:373:36 | ...::connect | test.rs:414:18:414:24 | &pinned | $@ | test.rs:373:19:373:36 | ...::connect | ...::connect | -| test.rs:418:22:418:28 | &buffer | test.rs:373:19:373:36 | ...::connect | test.rs:418:22:418:28 | &buffer | $@ | test.rs:373:19:373:36 | ...::connect | ...::connect | -| test.rs:419:22:419:24 | buf | test.rs:373:19:373:36 | ...::connect | test.rs:419:22:419:24 | buf | $@ | test.rs:373:19:373:36 | ...::connect | ...::connect | -| test.rs:426:26:426:33 | &buffer2 | test.rs:373:19:373:36 | ...::connect | test.rs:426:26:426:33 | &buffer2 | $@ | test.rs:373:19:373:36 | ...::connect | ...::connect | -| test.rs:427:26:427:28 | buf | test.rs:373:19:373:36 | ...::connect | test.rs:427:26:427:28 | buf | $@ | test.rs:373:19:373:36 | ...::connect | ...::connect | -| test.rs:438:18:438:23 | buffer | test.rs:373:19:373:36 | ...::connect | test.rs:438:18:438:23 | buffer | $@ | test.rs:373:19:373:36 | ...::connect | ...::connect | -| test.rs:445:18:445:24 | &pinned | test.rs:373:19:373:36 | ...::connect | test.rs:445:18:445:24 | &pinned | $@ | test.rs:373:19:373:36 | ...::connect | ...::connect | -| test.rs:448:18:448:24 | &buffer | test.rs:373:19:373:36 | ...::connect | test.rs:448:18:448:24 | &buffer | $@ | test.rs:373:19:373:36 | ...::connect | ...::connect | -| test.rs:450:22:450:33 | &... | test.rs:373:19:373:36 | ...::connect | test.rs:450:22:450:33 | &... | $@ | test.rs:373:19:373:36 | ...::connect | ...::connect | -| test.rs:458:18:458:40 | &... | test.rs:373:19:373:36 | ...::connect | test.rs:458:18:458:40 | &... | $@ | test.rs:373:19:373:36 | ...::connect | ...::connect | -| test.rs:462:18:462:40 | &... | test.rs:373:19:373:36 | ...::connect | test.rs:462:18:462:40 | &... | $@ | test.rs:373:19:373:36 | ...::connect | ...::connect | -| test.rs:468:18:468:24 | &pinned | test.rs:373:19:373:36 | ...::connect | test.rs:468:18:468:24 | &pinned | $@ | test.rs:373:19:373:36 | ...::connect | ...::connect | -| test.rs:471:18:471:24 | &buffer | test.rs:373:19:373:36 | ...::connect | test.rs:471:18:471:24 | &buffer | $@ | test.rs:373:19:373:36 | ...::connect | ...::connect | -| test.rs:473:22:473:24 | buf | test.rs:373:19:373:36 | ...::connect | test.rs:473:22:473:24 | buf | $@ | test.rs:373:19:373:36 | ...::connect | ...::connect | -| test.rs:480:18:480:23 | buffer | test.rs:373:19:373:36 | ...::connect | test.rs:480:18:480:23 | buffer | $@ | test.rs:373:19:373:36 | ...::connect | ...::connect | -| test.rs:487:18:487:22 | &line | test.rs:373:19:373:36 | ...::connect | test.rs:487:18:487:22 | &line | $@ | test.rs:373:19:373:36 | ...::connect | ...::connect | -| test.rs:494:18:494:22 | &line | test.rs:373:19:373:36 | ...::connect | test.rs:494:18:494:22 | &line | $@ | test.rs:373:19:373:36 | ...::connect | ...::connect | -| test.rs:501:18:501:24 | &buffer | test.rs:373:19:373:36 | ...::connect | test.rs:501:18:501:24 | &buffer | $@ | test.rs:373:19:373:36 | ...::connect | ...::connect | +| test.rs:12:10:12:23 | remote_string1 | test.rs:11:26:11:62 | ...::get(...) | test.rs:12:10:12:23 | remote_string1 | $@ | test.rs:11:26:11:62 | ...::get(...) | ...::get(...) | +| test.rs:15:10:15:23 | remote_string2 | test.rs:14:26:14:62 | ...::get(...) | test.rs:15:10:15:23 | remote_string2 | $@ | test.rs:14:26:14:62 | ...::get(...) | ...::get(...) | +| test.rs:18:10:18:23 | remote_string3 | test.rs:17:26:17:62 | ...::get(...) | test.rs:18:10:18:23 | remote_string3 | $@ | test.rs:17:26:17:62 | ...::get(...) | ...::get(...) | +| test.rs:21:10:21:23 | remote_string4 | test.rs:20:26:20:62 | ...::get(...) | test.rs:21:10:21:23 | remote_string4 | $@ | test.rs:20:26:20:62 | ...::get(...) | ...::get(...) | +| test.rs:24:10:24:23 | remote_string5 | test.rs:23:26:23:52 | ...::get(...) | test.rs:24:10:24:23 | remote_string5 | $@ | test.rs:23:26:23:52 | ...::get(...) | ...::get(...) | +| test.rs:27:10:27:23 | remote_string6 | test.rs:26:26:26:52 | ...::get(...) | test.rs:27:10:27:23 | remote_string6 | $@ | test.rs:26:26:26:52 | ...::get(...) | ...::get(...) | +| test.rs:30:10:30:41 | ... .unwrap() | test.rs:29:24:29:50 | ...::get(...) | test.rs:30:10:30:41 | ... .unwrap() | $@ | test.rs:29:24:29:50 | ...::get(...) | ...::get(...) | +| test.rs:32:14:32:18 | chunk | test.rs:29:24:29:50 | ...::get(...) | test.rs:32:14:32:18 | chunk | $@ | test.rs:29:24:29:50 | ...::get(...) | ...::get(...) | +| test.rs:61:14:61:22 | &response | test.rs:60:24:60:51 | sender.send_request(...) | test.rs:61:14:61:22 | &response | $@ | test.rs:60:24:60:51 | sender.send_request(...) | sender.send_request(...) | +| test.rs:62:14:62:21 | response | test.rs:60:24:60:51 | sender.send_request(...) | test.rs:62:14:62:21 | response | $@ | test.rs:60:24:60:51 | sender.send_request(...) | sender.send_request(...) | +| test.rs:68:10:68:18 | &response | test.rs:67:24:67:51 | sender.send_request(...) | test.rs:68:10:68:18 | &response | $@ | test.rs:67:24:67:51 | sender.send_request(...) | sender.send_request(...) | +| test.rs:76:18:76:32 | response.body() | test.rs:67:24:67:51 | sender.send_request(...) | test.rs:76:18:76:32 | response.body() | $@ | test.rs:67:24:67:51 | sender.send_request(...) | sender.send_request(...) | +| test.rs:77:18:77:36 | response.body_mut() | test.rs:67:24:67:51 | sender.send_request(...) | test.rs:77:18:77:36 | response.body_mut() | $@ | test.rs:67:24:67:51 | sender.send_request(...) | sender.send_request(...) | +| test.rs:80:18:80:22 | &body | test.rs:67:24:67:51 | sender.send_request(...) | test.rs:80:18:80:22 | &body | $@ | test.rs:67:24:67:51 | sender.send_request(...) | sender.send_request(...) | +| test.rs:165:14:165:20 | &buffer | test.rs:155:26:155:62 | ...::connect(...) | test.rs:165:14:165:20 | &buffer | $@ | test.rs:155:26:155:62 | ...::connect(...) | ...::connect(...) | +| test.rs:166:14:166:22 | buffer[0] | test.rs:155:26:155:62 | ...::connect(...) | test.rs:166:14:166:22 | buffer[0] | $@ | test.rs:155:26:155:62 | ...::connect(...) | ...::connect(...) | +| test.rs:192:34:192:38 | &line | test.rs:174:26:174:105 | ...::connect_timeout(...) | test.rs:192:34:192:38 | &line | $@ | test.rs:174:26:174:105 | ...::connect_timeout(...) | ...::connect_timeout(...) | +| test.rs:207:30:207:35 | string | test.rs:174:26:174:105 | ...::connect_timeout(...) | test.rs:207:30:207:35 | string | $@ | test.rs:174:26:174:105 | ...::connect_timeout(...) | ...::connect_timeout(...) | +| test.rs:239:14:239:21 | &buffer1 | test.rs:224:28:224:66 | ...::connect(...) | test.rs:239:14:239:21 | &buffer1 | $@ | test.rs:224:28:224:66 | ...::connect(...) | ...::connect(...) | +| test.rs:240:14:240:23 | buffer1[0] | test.rs:224:28:224:66 | ...::connect(...) | test.rs:240:14:240:23 | buffer1[0] | $@ | test.rs:224:28:224:66 | ...::connect(...) | ...::connect(...) | +| test.rs:243:14:243:21 | &buffer2 | test.rs:224:28:224:66 | ...::connect(...) | test.rs:243:14:243:21 | &buffer2 | $@ | test.rs:224:28:224:66 | ...::connect(...) | ...::connect(...) | +| test.rs:244:14:244:23 | buffer2[0] | test.rs:224:28:224:66 | ...::connect(...) | test.rs:244:14:244:23 | buffer2[0] | $@ | test.rs:224:28:224:66 | ...::connect(...) | ...::connect(...) | +| test.rs:259:26:259:32 | &buffer | test.rs:224:28:224:66 | ...::connect(...) | test.rs:259:26:259:32 | &buffer | $@ | test.rs:224:28:224:66 | ...::connect(...) | ...::connect(...) | +| test.rs:282:26:282:32 | &buffer | test.rs:224:28:224:66 | ...::connect(...) | test.rs:282:26:282:32 | &buffer | $@ | test.rs:224:28:224:66 | ...::connect(...) | ...::connect(...) | +| test.rs:334:10:334:16 | &reader | test.rs:332:22:332:75 | ...::new(...) | test.rs:334:10:334:16 | &reader | $@ | test.rs:332:22:332:75 | ...::new(...) | ...::new(...) | +| test.rs:339:14:339:20 | &buffer | test.rs:332:22:332:75 | ...::new(...) | test.rs:339:14:339:20 | &buffer | $@ | test.rs:332:22:332:75 | ...::new(...) | ...::new(...) | +| test.rs:345:14:345:20 | &buffer | test.rs:332:22:332:75 | ...::new(...) | test.rs:345:14:345:20 | &buffer | $@ | test.rs:332:22:332:75 | ...::new(...) | ...::new(...) | +| test.rs:351:14:351:20 | &buffer | test.rs:332:22:332:75 | ...::new(...) | test.rs:351:14:351:20 | &buffer | $@ | test.rs:332:22:332:75 | ...::new(...) | ...::new(...) | +| test.rs:374:14:374:17 | &tcp | test.rs:373:19:373:41 | ...::connect(...) | test.rs:374:14:374:17 | &tcp | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | +| test.rs:381:14:381:20 | &reader | test.rs:373:19:373:41 | ...::connect(...) | test.rs:381:14:381:20 | &reader | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | +| test.rs:387:18:387:24 | &pinned | test.rs:373:19:373:41 | ...::connect(...) | test.rs:387:18:387:24 | &pinned | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | +| test.rs:391:22:391:28 | &buffer | test.rs:373:19:373:41 | ...::connect(...) | test.rs:391:22:391:28 | &buffer | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | +| test.rs:392:22:392:33 | &... | test.rs:373:19:373:41 | ...::connect(...) | test.rs:392:22:392:33 | &... | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | +| test.rs:400:18:400:40 | &... | test.rs:373:19:373:41 | ...::connect(...) | test.rs:400:18:400:40 | &... | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | +| test.rs:405:18:405:40 | &... | test.rs:373:19:373:41 | ...::connect(...) | test.rs:405:18:405:40 | &... | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | +| test.rs:409:14:409:21 | &reader2 | test.rs:373:19:373:41 | ...::connect(...) | test.rs:409:14:409:21 | &reader2 | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | +| test.rs:414:18:414:24 | &pinned | test.rs:373:19:373:41 | ...::connect(...) | test.rs:414:18:414:24 | &pinned | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | +| test.rs:418:22:418:28 | &buffer | test.rs:373:19:373:41 | ...::connect(...) | test.rs:418:22:418:28 | &buffer | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | +| test.rs:419:22:419:24 | buf | test.rs:373:19:373:41 | ...::connect(...) | test.rs:419:22:419:24 | buf | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | +| test.rs:426:26:426:33 | &buffer2 | test.rs:373:19:373:41 | ...::connect(...) | test.rs:426:26:426:33 | &buffer2 | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | +| test.rs:427:26:427:28 | buf | test.rs:373:19:373:41 | ...::connect(...) | test.rs:427:26:427:28 | buf | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | +| test.rs:438:18:438:23 | buffer | test.rs:373:19:373:41 | ...::connect(...) | test.rs:438:18:438:23 | buffer | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | +| test.rs:445:18:445:24 | &pinned | test.rs:373:19:373:41 | ...::connect(...) | test.rs:445:18:445:24 | &pinned | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | +| test.rs:448:18:448:24 | &buffer | test.rs:373:19:373:41 | ...::connect(...) | test.rs:448:18:448:24 | &buffer | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | +| test.rs:450:22:450:33 | &... | test.rs:373:19:373:41 | ...::connect(...) | test.rs:450:22:450:33 | &... | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | +| test.rs:458:18:458:40 | &... | test.rs:373:19:373:41 | ...::connect(...) | test.rs:458:18:458:40 | &... | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | +| test.rs:462:18:462:40 | &... | test.rs:373:19:373:41 | ...::connect(...) | test.rs:462:18:462:40 | &... | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | +| test.rs:468:18:468:24 | &pinned | test.rs:373:19:373:41 | ...::connect(...) | test.rs:468:18:468:24 | &pinned | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | +| test.rs:471:18:471:24 | &buffer | test.rs:373:19:373:41 | ...::connect(...) | test.rs:471:18:471:24 | &buffer | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | +| test.rs:473:22:473:24 | buf | test.rs:373:19:373:41 | ...::connect(...) | test.rs:473:22:473:24 | buf | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | +| test.rs:480:18:480:23 | buffer | test.rs:373:19:373:41 | ...::connect(...) | test.rs:480:18:480:23 | buffer | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | +| test.rs:487:18:487:22 | &line | test.rs:373:19:373:41 | ...::connect(...) | test.rs:487:18:487:22 | &line | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | +| test.rs:494:18:494:22 | &line | test.rs:373:19:373:41 | ...::connect(...) | test.rs:494:18:494:22 | &line | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | +| test.rs:501:18:501:24 | &buffer | test.rs:373:19:373:41 | ...::connect(...) | test.rs:501:18:501:24 | &buffer | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | diff --git a/rust/ql/test/library-tests/dataflow/sources/net/TaintSources.expected b/rust/ql/test/library-tests/dataflow/sources/net/TaintSources.expected index bfe1ce0e56bc..bf0333168e4b 100644 --- a/rust/ql/test/library-tests/dataflow/sources/net/TaintSources.expected +++ b/rust/ql/test/library-tests/dataflow/sources/net/TaintSources.expected @@ -1,17 +1,17 @@ -| test.rs:11:26:11:47 | ...::get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:14:26:14:47 | ...::get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:17:26:17:47 | ...::get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:20:26:20:47 | ...::get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:23:26:23:37 | ...::get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:26:26:26:37 | ...::get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:29:24:29:35 | ...::get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:45:18:45:47 | ...::connect | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:60:31:60:42 | send_request | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:67:31:67:42 | send_request | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:155:26:155:53 | ...::connect | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:174:26:174:61 | ...::connect_timeout | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:224:28:224:57 | ...::connect | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:306:22:306:49 | ...::connect | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:332:22:332:50 | ...::new | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:373:19:373:36 | ...::connect | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:519:16:519:29 | ...::args | Flow source 'CommandLineArgs' of type commandargs (DEFAULT). | +| test.rs:11:26:11:62 | ...::get(...) | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:14:26:14:62 | ...::get(...) | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:17:26:17:62 | ...::get(...) | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:20:26:20:62 | ...::get(...) | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:23:26:23:52 | ...::get(...) | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:26:26:26:52 | ...::get(...) | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:29:24:29:50 | ...::get(...) | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:45:18:45:56 | ...::connect(...) | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:60:24:60:51 | sender.send_request(...) | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:67:24:67:51 | sender.send_request(...) | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:155:26:155:62 | ...::connect(...) | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:174:26:174:105 | ...::connect_timeout(...) | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:224:28:224:66 | ...::connect(...) | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:306:22:306:58 | ...::connect(...) | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:332:22:332:75 | ...::new(...) | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:373:19:373:41 | ...::connect(...) | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:519:16:519:31 | ...::args(...) | Flow source 'CommandLineArgs' of type commandargs (DEFAULT). | diff --git a/rust/ql/test/library-tests/dataflow/sources/stdin/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/stdin/InlineFlow.expected index c407a05f90d2..7dbe5d352532 100644 --- a/rust/ql/test/library-tests/dataflow/sources/stdin/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/stdin/InlineFlow.expected @@ -40,39 +40,39 @@ models | 39 | Summary: ::next_line; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | | 40 | Summary: ::next_segment; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | edges -| test.rs:13:22:13:35 | ...::stdin | test.rs:13:22:13:37 | ...::stdin(...) | provenance | Src:MaD:1 MaD:1 | +| test.rs:13:22:13:37 | ...::stdin(...) | test.rs:13:22:13:37 | ...::stdin(...) | provenance | Src:MaD:1 | | test.rs:13:22:13:37 | ...::stdin(...) | test.rs:13:44:13:54 | [post] &mut buffer [&ref] | provenance | MaD:31 | | test.rs:13:44:13:54 | [post] &mut buffer [&ref] | test.rs:13:49:13:54 | [post] buffer | provenance | | | test.rs:13:49:13:54 | [post] buffer | test.rs:14:15:14:20 | buffer | provenance | | | test.rs:14:15:14:20 | buffer | test.rs:14:14:14:20 | &buffer | provenance | | -| test.rs:19:22:19:35 | ...::stdin | test.rs:19:22:19:37 | ...::stdin(...) | provenance | Src:MaD:1 MaD:1 | +| test.rs:19:22:19:37 | ...::stdin(...) | test.rs:19:22:19:37 | ...::stdin(...) | provenance | Src:MaD:1 | | test.rs:19:22:19:37 | ...::stdin(...) | test.rs:19:51:19:61 | [post] &mut buffer [&ref] | provenance | MaD:33 | | test.rs:19:51:19:61 | [post] &mut buffer [&ref] | test.rs:19:56:19:61 | [post] buffer | provenance | | | test.rs:19:56:19:61 | [post] buffer | test.rs:20:15:20:20 | buffer | provenance | | | test.rs:20:15:20:20 | buffer | test.rs:20:14:20:20 | &buffer | provenance | | -| test.rs:25:22:25:35 | ...::stdin | test.rs:25:22:25:37 | ...::stdin(...) | provenance | Src:MaD:1 MaD:1 | +| test.rs:25:22:25:37 | ...::stdin(...) | test.rs:25:22:25:37 | ...::stdin(...) | provenance | Src:MaD:1 | | test.rs:25:22:25:37 | ...::stdin(...) | test.rs:25:54:25:64 | [post] &mut buffer [&ref] | provenance | MaD:34 | | test.rs:25:54:25:64 | [post] &mut buffer [&ref] | test.rs:25:59:25:64 | [post] buffer | provenance | | | test.rs:25:59:25:64 | [post] buffer | test.rs:26:15:26:20 | buffer | provenance | | | test.rs:26:15:26:20 | buffer | test.rs:26:14:26:20 | &buffer | provenance | | -| test.rs:31:22:31:35 | ...::stdin | test.rs:31:22:31:37 | ...::stdin(...) | provenance | Src:MaD:1 MaD:1 | +| test.rs:31:22:31:37 | ...::stdin(...) | test.rs:31:22:31:37 | ...::stdin(...) | provenance | Src:MaD:1 | | test.rs:31:22:31:37 | ...::stdin(...) | test.rs:31:22:31:44 | ... .lock() | provenance | MaD:35 | | test.rs:31:22:31:44 | ... .lock() | test.rs:31:61:31:71 | [post] &mut buffer [&ref] | provenance | MaD:36 | | test.rs:31:61:31:71 | [post] &mut buffer [&ref] | test.rs:31:66:31:71 | [post] buffer | provenance | | | test.rs:31:66:31:71 | [post] buffer | test.rs:32:15:32:20 | buffer | provenance | | | test.rs:32:15:32:20 | buffer | test.rs:32:14:32:20 | &buffer | provenance | | -| test.rs:37:9:37:22 | ...::stdin | test.rs:37:9:37:24 | ...::stdin(...) | provenance | Src:MaD:1 MaD:1 | +| test.rs:37:9:37:24 | ...::stdin(...) | test.rs:37:9:37:24 | ...::stdin(...) | provenance | Src:MaD:1 | | test.rs:37:9:37:24 | ...::stdin(...) | test.rs:37:37:37:47 | [post] &mut buffer [&ref] | provenance | MaD:32 | | test.rs:37:37:37:47 | [post] &mut buffer [&ref] | test.rs:37:42:37:47 | [post] buffer | provenance | | | test.rs:37:42:37:47 | [post] buffer | test.rs:38:15:38:20 | buffer | provenance | | | test.rs:38:15:38:20 | buffer | test.rs:38:14:38:20 | &buffer | provenance | | -| test.rs:41:17:41:30 | ...::stdin | test.rs:41:17:41:32 | ...::stdin(...) | provenance | Src:MaD:1 MaD:1 | +| test.rs:41:17:41:32 | ...::stdin(...) | test.rs:41:17:41:32 | ...::stdin(...) | provenance | Src:MaD:1 | | test.rs:41:17:41:32 | ...::stdin(...) | test.rs:41:17:41:40 | ... .bytes() | provenance | MaD:10 | | test.rs:41:17:41:40 | ... .bytes() | test.rs:42:14:42:17 | byte | provenance | | | test.rs:48:13:48:22 | mut reader | test.rs:49:20:49:25 | reader | provenance | | | test.rs:48:26:48:66 | ...::new(...) | test.rs:48:13:48:22 | mut reader | provenance | | -| test.rs:48:50:48:63 | ...::stdin | test.rs:48:50:48:65 | ...::stdin(...) | provenance | Src:MaD:1 MaD:1 | | test.rs:48:50:48:65 | ...::stdin(...) | test.rs:48:26:48:66 | ...::new(...) | provenance | MaD:30 | +| test.rs:48:50:48:65 | ...::stdin(...) | test.rs:48:50:48:65 | ...::stdin(...) | provenance | Src:MaD:1 | | test.rs:49:13:49:16 | data | test.rs:50:15:50:18 | data | provenance | | | test.rs:49:20:49:25 | reader | test.rs:49:20:49:36 | reader.fill_buf() [Ok] | provenance | MaD:28 | | test.rs:49:20:49:36 | reader.fill_buf() [Ok] | test.rs:49:20:49:37 | TryExpr | provenance | | @@ -80,24 +80,24 @@ edges | test.rs:50:15:50:18 | data | test.rs:50:14:50:18 | &data | provenance | | | test.rs:54:13:54:18 | reader | test.rs:55:20:55:25 | reader | provenance | | | test.rs:54:22:54:62 | ...::new(...) | test.rs:54:13:54:18 | reader | provenance | | -| test.rs:54:46:54:59 | ...::stdin | test.rs:54:46:54:61 | ...::stdin(...) | provenance | Src:MaD:1 MaD:1 | | test.rs:54:46:54:61 | ...::stdin(...) | test.rs:54:22:54:62 | ...::new(...) | provenance | MaD:30 | +| test.rs:54:46:54:61 | ...::stdin(...) | test.rs:54:46:54:61 | ...::stdin(...) | provenance | Src:MaD:1 | | test.rs:55:13:55:16 | data [&ref] | test.rs:56:15:56:18 | data [&ref] | provenance | | | test.rs:55:20:55:25 | reader | test.rs:55:20:55:34 | reader.buffer() [&ref] | provenance | MaD:29 | | test.rs:55:20:55:34 | reader.buffer() [&ref] | test.rs:55:13:55:16 | data [&ref] | provenance | | | test.rs:56:15:56:18 | data [&ref] | test.rs:56:14:56:18 | &data | provenance | | | test.rs:61:13:61:22 | mut reader | test.rs:62:9:62:14 | reader | provenance | | | test.rs:61:26:61:66 | ...::new(...) | test.rs:61:13:61:22 | mut reader | provenance | | -| test.rs:61:50:61:63 | ...::stdin | test.rs:61:50:61:65 | ...::stdin(...) | provenance | Src:MaD:1 MaD:1 | | test.rs:61:50:61:65 | ...::stdin(...) | test.rs:61:26:61:66 | ...::new(...) | provenance | MaD:30 | +| test.rs:61:50:61:65 | ...::stdin(...) | test.rs:61:50:61:65 | ...::stdin(...) | provenance | Src:MaD:1 | | test.rs:62:9:62:14 | reader | test.rs:62:26:62:36 | [post] &mut buffer [&ref] | provenance | MaD:7 | | test.rs:62:26:62:36 | [post] &mut buffer [&ref] | test.rs:62:31:62:36 | [post] buffer | provenance | | | test.rs:62:31:62:36 | [post] buffer | test.rs:63:15:63:20 | buffer | provenance | | | test.rs:63:15:63:20 | buffer | test.rs:63:14:63:20 | &buffer | provenance | | | test.rs:68:13:68:22 | mut reader | test.rs:69:9:69:14 | reader | provenance | | | test.rs:68:26:68:66 | ...::new(...) | test.rs:68:13:68:22 | mut reader | provenance | | -| test.rs:68:50:68:63 | ...::stdin | test.rs:68:50:68:65 | ...::stdin(...) | provenance | Src:MaD:1 MaD:1 | | test.rs:68:50:68:65 | ...::stdin(...) | test.rs:68:26:68:66 | ...::new(...) | provenance | MaD:30 | +| test.rs:68:50:68:65 | ...::stdin(...) | test.rs:68:50:68:65 | ...::stdin(...) | provenance | Src:MaD:1 | | test.rs:69:9:69:14 | reader | test.rs:69:33:69:43 | [post] &mut buffer [&ref] | provenance | MaD:8 | | test.rs:69:33:69:43 | [post] &mut buffer [&ref] | test.rs:69:38:69:43 | [post] buffer | provenance | | | test.rs:69:38:69:43 | [post] buffer | test.rs:70:15:70:20 | buffer | provenance | | @@ -108,8 +108,8 @@ edges | test.rs:75:13:75:28 | mut reader_split | test.rs:77:33:77:44 | reader_split | provenance | | | test.rs:75:32:75:72 | ...::new(...) | test.rs:75:32:75:84 | ... .split(...) | provenance | MaD:9 | | test.rs:75:32:75:84 | ... .split(...) | test.rs:75:13:75:28 | mut reader_split | provenance | | -| test.rs:75:56:75:69 | ...::stdin | test.rs:75:56:75:71 | ...::stdin(...) | provenance | Src:MaD:1 MaD:1 | | test.rs:75:56:75:71 | ...::stdin(...) | test.rs:75:32:75:72 | ...::new(...) | provenance | MaD:30 | +| test.rs:75:56:75:71 | ...::stdin(...) | test.rs:75:56:75:71 | ...::stdin(...) | provenance | Src:MaD:1 | | test.rs:76:14:76:25 | reader_split | test.rs:76:14:76:32 | reader_split.next() [Some, Ok] | provenance | MaD:27 | | test.rs:76:14:76:32 | reader_split.next() [Some, Ok] | test.rs:76:14:76:41 | ... .unwrap() [Ok] | provenance | MaD:25 | | test.rs:76:14:76:41 | ... .unwrap() [Ok] | test.rs:76:14:76:50 | ... .unwrap() | provenance | MaD:26 | @@ -120,14 +120,14 @@ edges | test.rs:78:18:78:22 | chunk [Ok] | test.rs:78:18:78:31 | chunk.unwrap() | provenance | MaD:26 | | test.rs:83:13:83:18 | reader | test.rs:84:21:84:26 | reader | provenance | | | test.rs:83:22:83:62 | ...::new(...) | test.rs:83:13:83:18 | reader | provenance | | -| test.rs:83:46:83:59 | ...::stdin | test.rs:83:46:83:61 | ...::stdin(...) | provenance | Src:MaD:1 MaD:1 | | test.rs:83:46:83:61 | ...::stdin(...) | test.rs:83:22:83:62 | ...::new(...) | provenance | MaD:30 | +| test.rs:83:46:83:61 | ...::stdin(...) | test.rs:83:46:83:61 | ...::stdin(...) | provenance | Src:MaD:1 | | test.rs:84:21:84:26 | reader | test.rs:84:21:84:34 | reader.lines() | provenance | MaD:6 | | test.rs:84:21:84:34 | reader.lines() | test.rs:85:18:85:21 | line | provenance | | | test.rs:90:13:90:18 | reader | test.rs:91:20:91:25 | reader | provenance | | | test.rs:90:22:90:62 | ...::new(...) | test.rs:90:13:90:18 | reader | provenance | | -| test.rs:90:46:90:59 | ...::stdin | test.rs:90:46:90:61 | ...::stdin(...) | provenance | Src:MaD:1 MaD:1 | | test.rs:90:46:90:61 | ...::stdin(...) | test.rs:90:22:90:62 | ...::new(...) | provenance | MaD:30 | +| test.rs:90:46:90:61 | ...::stdin(...) | test.rs:90:46:90:61 | ...::stdin(...) | provenance | Src:MaD:1 | | test.rs:91:13:91:16 | line | test.rs:92:14:92:17 | line | provenance | | | test.rs:91:20:91:25 | reader | test.rs:91:20:91:33 | reader.lines() | provenance | MaD:6 | | test.rs:91:20:91:33 | reader.lines() | test.rs:91:20:91:40 | ... .nth(...) [Some] | provenance | MaD:4 | @@ -136,29 +136,25 @@ edges | test.rs:92:14:92:17 | line | test.rs:92:14:92:26 | line.unwrap() | provenance | MaD:26 | | test.rs:92:14:92:26 | line.unwrap() | test.rs:92:14:92:34 | ... .clone() | provenance | MaD:3 | | test.rs:109:13:109:21 | mut stdin | test.rs:111:22:111:26 | stdin | provenance | | -| test.rs:109:25:109:40 | ...::stdin | test.rs:109:25:109:42 | ...::stdin(...) | provenance | Src:MaD:2 MaD:2 | -| test.rs:109:25:109:42 | ...::stdin(...) | test.rs:109:13:109:21 | mut stdin | provenance | | +| test.rs:109:25:109:42 | ...::stdin(...) | test.rs:109:13:109:21 | mut stdin | provenance | Src:MaD:2 | | test.rs:111:22:111:26 | stdin | test.rs:111:33:111:43 | [post] &mut buffer [&ref] | provenance | MaD:16 | | test.rs:111:33:111:43 | [post] &mut buffer [&ref] | test.rs:111:38:111:43 | [post] buffer | provenance | | | test.rs:111:38:111:43 | [post] buffer | test.rs:112:15:112:20 | buffer | provenance | | | test.rs:112:15:112:20 | buffer | test.rs:112:14:112:20 | &buffer | provenance | | | test.rs:116:13:116:21 | mut stdin | test.rs:118:22:118:26 | stdin | provenance | | -| test.rs:116:25:116:40 | ...::stdin | test.rs:116:25:116:42 | ...::stdin(...) | provenance | Src:MaD:2 MaD:2 | -| test.rs:116:25:116:42 | ...::stdin(...) | test.rs:116:13:116:21 | mut stdin | provenance | | +| test.rs:116:25:116:42 | ...::stdin(...) | test.rs:116:13:116:21 | mut stdin | provenance | Src:MaD:2 | | test.rs:118:22:118:26 | stdin | test.rs:118:40:118:50 | [post] &mut buffer [&ref] | provenance | MaD:22 | | test.rs:118:40:118:50 | [post] &mut buffer [&ref] | test.rs:118:45:118:50 | [post] buffer | provenance | | | test.rs:118:45:118:50 | [post] buffer | test.rs:119:15:119:20 | buffer | provenance | | | test.rs:119:15:119:20 | buffer | test.rs:119:14:119:20 | &buffer | provenance | | | test.rs:123:13:123:21 | mut stdin | test.rs:125:22:125:26 | stdin | provenance | | -| test.rs:123:25:123:40 | ...::stdin | test.rs:123:25:123:42 | ...::stdin(...) | provenance | Src:MaD:2 MaD:2 | -| test.rs:123:25:123:42 | ...::stdin(...) | test.rs:123:13:123:21 | mut stdin | provenance | | +| test.rs:123:25:123:42 | ...::stdin(...) | test.rs:123:13:123:21 | mut stdin | provenance | Src:MaD:2 | | test.rs:125:22:125:26 | stdin | test.rs:125:43:125:53 | [post] &mut buffer [&ref] | provenance | MaD:23 | | test.rs:125:43:125:53 | [post] &mut buffer [&ref] | test.rs:125:48:125:53 | [post] buffer | provenance | | | test.rs:125:48:125:53 | [post] buffer | test.rs:126:15:126:20 | buffer | provenance | | | test.rs:126:15:126:20 | buffer | test.rs:126:14:126:20 | &buffer | provenance | | | test.rs:130:13:130:21 | mut stdin | test.rs:132:9:132:13 | stdin | provenance | | -| test.rs:130:25:130:40 | ...::stdin | test.rs:130:25:130:42 | ...::stdin(...) | provenance | Src:MaD:2 MaD:2 | -| test.rs:130:25:130:42 | ...::stdin(...) | test.rs:130:13:130:21 | mut stdin | provenance | | +| test.rs:130:25:130:42 | ...::stdin(...) | test.rs:130:13:130:21 | mut stdin | provenance | Src:MaD:2 | | test.rs:132:9:132:13 | stdin | test.rs:132:26:132:36 | [post] &mut buffer [&ref] | provenance | MaD:18 | | test.rs:132:26:132:36 | [post] &mut buffer [&ref] | test.rs:132:31:132:36 | [post] buffer | provenance | | | test.rs:132:31:132:36 | [post] buffer | test.rs:133:15:133:20 | buffer | provenance | | @@ -167,8 +163,7 @@ edges | test.rs:137:13:137:21 | mut stdin | test.rs:139:18:139:22 | stdin | provenance | | | test.rs:137:13:137:21 | mut stdin | test.rs:140:18:140:22 | stdin | provenance | | | test.rs:137:13:137:21 | mut stdin | test.rs:141:18:141:22 | stdin | provenance | | -| test.rs:137:25:137:40 | ...::stdin | test.rs:137:25:137:42 | ...::stdin(...) | provenance | Src:MaD:2 MaD:2 | -| test.rs:137:25:137:42 | ...::stdin(...) | test.rs:137:13:137:21 | mut stdin | provenance | | +| test.rs:137:25:137:42 | ...::stdin(...) | test.rs:137:13:137:21 | mut stdin | provenance | Src:MaD:2 | | test.rs:138:13:138:14 | v1 | test.rs:142:14:142:15 | v1 | provenance | | | test.rs:138:18:138:22 | stdin | test.rs:138:18:138:32 | stdin.read_u8() [future, Ok] | provenance | MaD:24 | | test.rs:138:18:138:32 | stdin.read_u8() [future, Ok] | test.rs:138:18:138:38 | await ... [Ok] | provenance | | @@ -190,16 +185,15 @@ edges | test.rs:141:18:141:42 | await ... [Ok] | test.rs:141:18:141:43 | TryExpr | provenance | | | test.rs:141:18:141:43 | TryExpr | test.rs:141:13:141:14 | v4 | provenance | | | test.rs:149:13:149:21 | mut stdin | test.rs:151:9:151:13 | stdin | provenance | | -| test.rs:149:25:149:40 | ...::stdin | test.rs:149:25:149:42 | ...::stdin(...) | provenance | Src:MaD:2 MaD:2 | -| test.rs:149:25:149:42 | ...::stdin(...) | test.rs:149:13:149:21 | mut stdin | provenance | | +| test.rs:149:25:149:42 | ...::stdin(...) | test.rs:149:13:149:21 | mut stdin | provenance | Src:MaD:2 | | test.rs:151:9:151:13 | stdin | test.rs:151:24:151:34 | [post] &mut buffer [&ref] | provenance | MaD:17 | | test.rs:151:24:151:34 | [post] &mut buffer [&ref] | test.rs:151:29:151:34 | [post] buffer | provenance | | | test.rs:151:29:151:34 | [post] buffer | test.rs:152:15:152:20 | buffer | provenance | | | test.rs:152:15:152:20 | buffer | test.rs:152:14:152:20 | &buffer | provenance | | | test.rs:158:13:158:22 | mut reader | test.rs:159:20:159:25 | reader | provenance | | | test.rs:158:26:158:70 | ...::new(...) | test.rs:158:13:158:22 | mut reader | provenance | | -| test.rs:158:52:158:67 | ...::stdin | test.rs:158:52:158:69 | ...::stdin(...) | provenance | Src:MaD:2 MaD:2 | | test.rs:158:52:158:69 | ...::stdin(...) | test.rs:158:26:158:70 | ...::new(...) | provenance | MaD:38 | +| test.rs:158:52:158:69 | ...::stdin(...) | test.rs:158:52:158:69 | ...::stdin(...) | provenance | Src:MaD:2 | | test.rs:159:13:159:16 | data | test.rs:160:15:160:18 | data | provenance | | | test.rs:159:20:159:25 | reader | test.rs:159:20:159:36 | reader.fill_buf() [future, Ok] | provenance | MaD:11 | | test.rs:159:20:159:36 | reader.fill_buf() [future, Ok] | test.rs:159:20:159:42 | await ... [Ok] | provenance | | @@ -208,24 +202,24 @@ edges | test.rs:160:15:160:18 | data | test.rs:160:14:160:18 | &data | provenance | | | test.rs:164:13:164:18 | reader | test.rs:165:20:165:25 | reader | provenance | | | test.rs:164:22:164:66 | ...::new(...) | test.rs:164:13:164:18 | reader | provenance | | -| test.rs:164:48:164:63 | ...::stdin | test.rs:164:48:164:65 | ...::stdin(...) | provenance | Src:MaD:2 MaD:2 | | test.rs:164:48:164:65 | ...::stdin(...) | test.rs:164:22:164:66 | ...::new(...) | provenance | MaD:38 | +| test.rs:164:48:164:65 | ...::stdin(...) | test.rs:164:48:164:65 | ...::stdin(...) | provenance | Src:MaD:2 | | test.rs:165:13:165:16 | data [&ref] | test.rs:166:15:166:18 | data [&ref] | provenance | | | test.rs:165:20:165:25 | reader | test.rs:165:20:165:34 | reader.buffer() [&ref] | provenance | MaD:37 | | test.rs:165:20:165:34 | reader.buffer() [&ref] | test.rs:165:13:165:16 | data [&ref] | provenance | | | test.rs:166:15:166:18 | data [&ref] | test.rs:166:14:166:18 | &data | provenance | | | test.rs:171:13:171:22 | mut reader | test.rs:172:9:172:14 | reader | provenance | | | test.rs:171:26:171:70 | ...::new(...) | test.rs:171:13:171:22 | mut reader | provenance | | -| test.rs:171:52:171:67 | ...::stdin | test.rs:171:52:171:69 | ...::stdin(...) | provenance | Src:MaD:2 MaD:2 | | test.rs:171:52:171:69 | ...::stdin(...) | test.rs:171:26:171:70 | ...::new(...) | provenance | MaD:38 | +| test.rs:171:52:171:69 | ...::stdin(...) | test.rs:171:52:171:69 | ...::stdin(...) | provenance | Src:MaD:2 | | test.rs:172:9:172:14 | reader | test.rs:172:26:172:36 | [post] &mut buffer [&ref] | provenance | MaD:13 | | test.rs:172:26:172:36 | [post] &mut buffer [&ref] | test.rs:172:31:172:36 | [post] buffer | provenance | | | test.rs:172:31:172:36 | [post] buffer | test.rs:173:15:173:20 | buffer | provenance | | | test.rs:173:15:173:20 | buffer | test.rs:173:14:173:20 | &buffer | provenance | | | test.rs:178:13:178:22 | mut reader | test.rs:179:9:179:14 | reader | provenance | | | test.rs:178:26:178:70 | ...::new(...) | test.rs:178:13:178:22 | mut reader | provenance | | -| test.rs:178:52:178:67 | ...::stdin | test.rs:178:52:178:69 | ...::stdin(...) | provenance | Src:MaD:2 MaD:2 | | test.rs:178:52:178:69 | ...::stdin(...) | test.rs:178:26:178:70 | ...::new(...) | provenance | MaD:38 | +| test.rs:178:52:178:69 | ...::stdin(...) | test.rs:178:52:178:69 | ...::stdin(...) | provenance | Src:MaD:2 | | test.rs:179:9:179:14 | reader | test.rs:179:33:179:43 | [post] &mut buffer [&ref] | provenance | MaD:14 | | test.rs:179:33:179:43 | [post] &mut buffer [&ref] | test.rs:179:38:179:43 | [post] buffer | provenance | | | test.rs:179:38:179:43 | [post] buffer | test.rs:180:15:180:20 | buffer | provenance | | @@ -236,8 +230,8 @@ edges | test.rs:185:13:185:28 | mut reader_split | test.rs:187:33:187:44 | reader_split | provenance | | | test.rs:185:32:185:76 | ...::new(...) | test.rs:185:32:185:88 | ... .split(...) | provenance | MaD:15 | | test.rs:185:32:185:88 | ... .split(...) | test.rs:185:13:185:28 | mut reader_split | provenance | | -| test.rs:185:58:185:73 | ...::stdin | test.rs:185:58:185:75 | ...::stdin(...) | provenance | Src:MaD:2 MaD:2 | | test.rs:185:58:185:75 | ...::stdin(...) | test.rs:185:32:185:76 | ...::new(...) | provenance | MaD:38 | +| test.rs:185:58:185:75 | ...::stdin(...) | test.rs:185:58:185:75 | ...::stdin(...) | provenance | Src:MaD:2 | | test.rs:186:14:186:25 | reader_split | test.rs:186:14:186:40 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:40 | | test.rs:186:14:186:40 | reader_split.next_segment() [future, Ok, Some] | test.rs:186:14:186:46 | await ... [Ok, Some] | provenance | | | test.rs:186:14:186:46 | await ... [Ok, Some] | test.rs:186:14:186:47 | TryExpr [Some] | provenance | | @@ -250,8 +244,8 @@ edges | test.rs:187:33:187:66 | TryExpr [Some] | test.rs:187:19:187:29 | Some(...) [Some] | provenance | | | test.rs:193:13:193:18 | reader | test.rs:194:25:194:30 | reader | provenance | | | test.rs:193:22:193:66 | ...::new(...) | test.rs:193:13:193:18 | reader | provenance | | -| test.rs:193:48:193:63 | ...::stdin | test.rs:193:48:193:65 | ...::stdin(...) | provenance | Src:MaD:2 MaD:2 | | test.rs:193:48:193:65 | ...::stdin(...) | test.rs:193:22:193:66 | ...::new(...) | provenance | MaD:38 | +| test.rs:193:48:193:65 | ...::stdin(...) | test.rs:193:48:193:65 | ...::stdin(...) | provenance | Src:MaD:2 | | test.rs:194:13:194:21 | mut lines | test.rs:195:14:195:18 | lines | provenance | | | test.rs:194:13:194:21 | mut lines | test.rs:196:32:196:36 | lines | provenance | | | test.rs:194:25:194:30 | reader | test.rs:194:25:194:38 | reader.lines() | provenance | MaD:12 | @@ -267,44 +261,44 @@ edges | test.rs:196:32:196:54 | await ... [Ok, Some] | test.rs:196:32:196:55 | TryExpr [Some] | provenance | | | test.rs:196:32:196:55 | TryExpr [Some] | test.rs:196:19:196:28 | Some(...) [Some] | provenance | | nodes -| test.rs:13:22:13:35 | ...::stdin | semmle.label | ...::stdin | +| test.rs:13:22:13:37 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:13:22:13:37 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:13:44:13:54 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:13:49:13:54 | [post] buffer | semmle.label | [post] buffer | | test.rs:14:14:14:20 | &buffer | semmle.label | &buffer | | test.rs:14:15:14:20 | buffer | semmle.label | buffer | -| test.rs:19:22:19:35 | ...::stdin | semmle.label | ...::stdin | +| test.rs:19:22:19:37 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:19:22:19:37 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:19:51:19:61 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:19:56:19:61 | [post] buffer | semmle.label | [post] buffer | | test.rs:20:14:20:20 | &buffer | semmle.label | &buffer | | test.rs:20:15:20:20 | buffer | semmle.label | buffer | -| test.rs:25:22:25:35 | ...::stdin | semmle.label | ...::stdin | +| test.rs:25:22:25:37 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:25:22:25:37 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:25:54:25:64 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:25:59:25:64 | [post] buffer | semmle.label | [post] buffer | | test.rs:26:14:26:20 | &buffer | semmle.label | &buffer | | test.rs:26:15:26:20 | buffer | semmle.label | buffer | -| test.rs:31:22:31:35 | ...::stdin | semmle.label | ...::stdin | +| test.rs:31:22:31:37 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:31:22:31:37 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:31:22:31:44 | ... .lock() | semmle.label | ... .lock() | | test.rs:31:61:31:71 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:31:66:31:71 | [post] buffer | semmle.label | [post] buffer | | test.rs:32:14:32:20 | &buffer | semmle.label | &buffer | | test.rs:32:15:32:20 | buffer | semmle.label | buffer | -| test.rs:37:9:37:22 | ...::stdin | semmle.label | ...::stdin | +| test.rs:37:9:37:24 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:37:9:37:24 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:37:37:37:47 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | | test.rs:37:42:37:47 | [post] buffer | semmle.label | [post] buffer | | test.rs:38:14:38:20 | &buffer | semmle.label | &buffer | | test.rs:38:15:38:20 | buffer | semmle.label | buffer | -| test.rs:41:17:41:30 | ...::stdin | semmle.label | ...::stdin | +| test.rs:41:17:41:32 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:41:17:41:32 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:41:17:41:40 | ... .bytes() | semmle.label | ... .bytes() | | test.rs:42:14:42:17 | byte | semmle.label | byte | | test.rs:48:13:48:22 | mut reader | semmle.label | mut reader | | test.rs:48:26:48:66 | ...::new(...) | semmle.label | ...::new(...) | -| test.rs:48:50:48:63 | ...::stdin | semmle.label | ...::stdin | +| test.rs:48:50:48:65 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:48:50:48:65 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:49:13:49:16 | data | semmle.label | data | | test.rs:49:20:49:25 | reader | semmle.label | reader | @@ -314,7 +308,7 @@ nodes | test.rs:50:15:50:18 | data | semmle.label | data | | test.rs:54:13:54:18 | reader | semmle.label | reader | | test.rs:54:22:54:62 | ...::new(...) | semmle.label | ...::new(...) | -| test.rs:54:46:54:59 | ...::stdin | semmle.label | ...::stdin | +| test.rs:54:46:54:61 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:54:46:54:61 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:55:13:55:16 | data [&ref] | semmle.label | data [&ref] | | test.rs:55:20:55:25 | reader | semmle.label | reader | @@ -323,7 +317,7 @@ nodes | test.rs:56:15:56:18 | data [&ref] | semmle.label | data [&ref] | | test.rs:61:13:61:22 | mut reader | semmle.label | mut reader | | test.rs:61:26:61:66 | ...::new(...) | semmle.label | ...::new(...) | -| test.rs:61:50:61:63 | ...::stdin | semmle.label | ...::stdin | +| test.rs:61:50:61:65 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:61:50:61:65 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:62:9:62:14 | reader | semmle.label | reader | | test.rs:62:26:62:36 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | @@ -332,7 +326,7 @@ nodes | test.rs:63:15:63:20 | buffer | semmle.label | buffer | | test.rs:68:13:68:22 | mut reader | semmle.label | mut reader | | test.rs:68:26:68:66 | ...::new(...) | semmle.label | ...::new(...) | -| test.rs:68:50:68:63 | ...::stdin | semmle.label | ...::stdin | +| test.rs:68:50:68:65 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:68:50:68:65 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:69:9:69:14 | reader | semmle.label | reader | | test.rs:69:33:69:43 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | @@ -344,7 +338,7 @@ nodes | test.rs:75:13:75:28 | mut reader_split | semmle.label | mut reader_split | | test.rs:75:32:75:72 | ...::new(...) | semmle.label | ...::new(...) | | test.rs:75:32:75:84 | ... .split(...) | semmle.label | ... .split(...) | -| test.rs:75:56:75:69 | ...::stdin | semmle.label | ...::stdin | +| test.rs:75:56:75:71 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:75:56:75:71 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:76:14:76:25 | reader_split | semmle.label | reader_split | | test.rs:76:14:76:32 | reader_split.next() [Some, Ok] | semmle.label | reader_split.next() [Some, Ok] | @@ -358,14 +352,14 @@ nodes | test.rs:78:18:78:31 | chunk.unwrap() | semmle.label | chunk.unwrap() | | test.rs:83:13:83:18 | reader | semmle.label | reader | | test.rs:83:22:83:62 | ...::new(...) | semmle.label | ...::new(...) | -| test.rs:83:46:83:59 | ...::stdin | semmle.label | ...::stdin | +| test.rs:83:46:83:61 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:83:46:83:61 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:84:21:84:26 | reader | semmle.label | reader | | test.rs:84:21:84:34 | reader.lines() | semmle.label | reader.lines() | | test.rs:85:18:85:21 | line | semmle.label | line | | test.rs:90:13:90:18 | reader | semmle.label | reader | | test.rs:90:22:90:62 | ...::new(...) | semmle.label | ...::new(...) | -| test.rs:90:46:90:59 | ...::stdin | semmle.label | ...::stdin | +| test.rs:90:46:90:61 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:90:46:90:61 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:91:13:91:16 | line | semmle.label | line | | test.rs:91:20:91:25 | reader | semmle.label | reader | @@ -376,7 +370,6 @@ nodes | test.rs:92:14:92:26 | line.unwrap() | semmle.label | line.unwrap() | | test.rs:92:14:92:34 | ... .clone() | semmle.label | ... .clone() | | test.rs:109:13:109:21 | mut stdin | semmle.label | mut stdin | -| test.rs:109:25:109:40 | ...::stdin | semmle.label | ...::stdin | | test.rs:109:25:109:42 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:111:22:111:26 | stdin | semmle.label | stdin | | test.rs:111:33:111:43 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | @@ -384,7 +377,6 @@ nodes | test.rs:112:14:112:20 | &buffer | semmle.label | &buffer | | test.rs:112:15:112:20 | buffer | semmle.label | buffer | | test.rs:116:13:116:21 | mut stdin | semmle.label | mut stdin | -| test.rs:116:25:116:40 | ...::stdin | semmle.label | ...::stdin | | test.rs:116:25:116:42 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:118:22:118:26 | stdin | semmle.label | stdin | | test.rs:118:40:118:50 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | @@ -392,7 +384,6 @@ nodes | test.rs:119:14:119:20 | &buffer | semmle.label | &buffer | | test.rs:119:15:119:20 | buffer | semmle.label | buffer | | test.rs:123:13:123:21 | mut stdin | semmle.label | mut stdin | -| test.rs:123:25:123:40 | ...::stdin | semmle.label | ...::stdin | | test.rs:123:25:123:42 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:125:22:125:26 | stdin | semmle.label | stdin | | test.rs:125:43:125:53 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | @@ -400,7 +391,6 @@ nodes | test.rs:126:14:126:20 | &buffer | semmle.label | &buffer | | test.rs:126:15:126:20 | buffer | semmle.label | buffer | | test.rs:130:13:130:21 | mut stdin | semmle.label | mut stdin | -| test.rs:130:25:130:40 | ...::stdin | semmle.label | ...::stdin | | test.rs:130:25:130:42 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:132:9:132:13 | stdin | semmle.label | stdin | | test.rs:132:26:132:36 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | @@ -408,7 +398,6 @@ nodes | test.rs:133:14:133:20 | &buffer | semmle.label | &buffer | | test.rs:133:15:133:20 | buffer | semmle.label | buffer | | test.rs:137:13:137:21 | mut stdin | semmle.label | mut stdin | -| test.rs:137:25:137:40 | ...::stdin | semmle.label | ...::stdin | | test.rs:137:25:137:42 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:138:13:138:14 | v1 | semmle.label | v1 | | test.rs:138:18:138:22 | stdin | semmle.label | stdin | @@ -435,7 +424,6 @@ nodes | test.rs:144:14:144:15 | v3 | semmle.label | v3 | | test.rs:145:14:145:15 | v4 | semmle.label | v4 | | test.rs:149:13:149:21 | mut stdin | semmle.label | mut stdin | -| test.rs:149:25:149:40 | ...::stdin | semmle.label | ...::stdin | | test.rs:149:25:149:42 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:151:9:151:13 | stdin | semmle.label | stdin | | test.rs:151:24:151:34 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | @@ -444,7 +432,7 @@ nodes | test.rs:152:15:152:20 | buffer | semmle.label | buffer | | test.rs:158:13:158:22 | mut reader | semmle.label | mut reader | | test.rs:158:26:158:70 | ...::new(...) | semmle.label | ...::new(...) | -| test.rs:158:52:158:67 | ...::stdin | semmle.label | ...::stdin | +| test.rs:158:52:158:69 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:158:52:158:69 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:159:13:159:16 | data | semmle.label | data | | test.rs:159:20:159:25 | reader | semmle.label | reader | @@ -455,7 +443,7 @@ nodes | test.rs:160:15:160:18 | data | semmle.label | data | | test.rs:164:13:164:18 | reader | semmle.label | reader | | test.rs:164:22:164:66 | ...::new(...) | semmle.label | ...::new(...) | -| test.rs:164:48:164:63 | ...::stdin | semmle.label | ...::stdin | +| test.rs:164:48:164:65 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:164:48:164:65 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:165:13:165:16 | data [&ref] | semmle.label | data [&ref] | | test.rs:165:20:165:25 | reader | semmle.label | reader | @@ -464,7 +452,7 @@ nodes | test.rs:166:15:166:18 | data [&ref] | semmle.label | data [&ref] | | test.rs:171:13:171:22 | mut reader | semmle.label | mut reader | | test.rs:171:26:171:70 | ...::new(...) | semmle.label | ...::new(...) | -| test.rs:171:52:171:67 | ...::stdin | semmle.label | ...::stdin | +| test.rs:171:52:171:69 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:171:52:171:69 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:172:9:172:14 | reader | semmle.label | reader | | test.rs:172:26:172:36 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | @@ -473,7 +461,7 @@ nodes | test.rs:173:15:173:20 | buffer | semmle.label | buffer | | test.rs:178:13:178:22 | mut reader | semmle.label | mut reader | | test.rs:178:26:178:70 | ...::new(...) | semmle.label | ...::new(...) | -| test.rs:178:52:178:67 | ...::stdin | semmle.label | ...::stdin | +| test.rs:178:52:178:69 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:178:52:178:69 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:179:9:179:14 | reader | semmle.label | reader | | test.rs:179:33:179:43 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | @@ -485,7 +473,7 @@ nodes | test.rs:185:13:185:28 | mut reader_split | semmle.label | mut reader_split | | test.rs:185:32:185:76 | ...::new(...) | semmle.label | ...::new(...) | | test.rs:185:32:185:88 | ... .split(...) | semmle.label | ... .split(...) | -| test.rs:185:58:185:73 | ...::stdin | semmle.label | ...::stdin | +| test.rs:185:58:185:75 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:185:58:185:75 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:186:14:186:25 | reader_split | semmle.label | reader_split | | test.rs:186:14:186:40 | reader_split.next_segment() [future, Ok, Some] | semmle.label | reader_split.next_segment() [future, Ok, Some] | @@ -501,7 +489,7 @@ nodes | test.rs:188:18:188:22 | chunk | semmle.label | chunk | | test.rs:193:13:193:18 | reader | semmle.label | reader | | test.rs:193:22:193:66 | ...::new(...) | semmle.label | ...::new(...) | -| test.rs:193:48:193:63 | ...::stdin | semmle.label | ...::stdin | +| test.rs:193:48:193:65 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:193:48:193:65 | ...::stdin(...) | semmle.label | ...::stdin(...) | | test.rs:194:13:194:21 | mut lines | semmle.label | mut lines | | test.rs:194:25:194:30 | reader | semmle.label | reader | @@ -521,36 +509,36 @@ nodes subpaths testFailures #select -| test.rs:14:14:14:20 | &buffer | test.rs:13:22:13:35 | ...::stdin | test.rs:14:14:14:20 | &buffer | $@ | test.rs:13:22:13:35 | ...::stdin | ...::stdin | -| test.rs:20:14:20:20 | &buffer | test.rs:19:22:19:35 | ...::stdin | test.rs:20:14:20:20 | &buffer | $@ | test.rs:19:22:19:35 | ...::stdin | ...::stdin | -| test.rs:26:14:26:20 | &buffer | test.rs:25:22:25:35 | ...::stdin | test.rs:26:14:26:20 | &buffer | $@ | test.rs:25:22:25:35 | ...::stdin | ...::stdin | -| test.rs:32:14:32:20 | &buffer | test.rs:31:22:31:35 | ...::stdin | test.rs:32:14:32:20 | &buffer | $@ | test.rs:31:22:31:35 | ...::stdin | ...::stdin | -| test.rs:38:14:38:20 | &buffer | test.rs:37:9:37:22 | ...::stdin | test.rs:38:14:38:20 | &buffer | $@ | test.rs:37:9:37:22 | ...::stdin | ...::stdin | -| test.rs:42:14:42:17 | byte | test.rs:41:17:41:30 | ...::stdin | test.rs:42:14:42:17 | byte | $@ | test.rs:41:17:41:30 | ...::stdin | ...::stdin | -| test.rs:50:14:50:18 | &data | test.rs:48:50:48:63 | ...::stdin | test.rs:50:14:50:18 | &data | $@ | test.rs:48:50:48:63 | ...::stdin | ...::stdin | -| test.rs:56:14:56:18 | &data | test.rs:54:46:54:59 | ...::stdin | test.rs:56:14:56:18 | &data | $@ | test.rs:54:46:54:59 | ...::stdin | ...::stdin | -| test.rs:63:14:63:20 | &buffer | test.rs:61:50:61:63 | ...::stdin | test.rs:63:14:63:20 | &buffer | $@ | test.rs:61:50:61:63 | ...::stdin | ...::stdin | -| test.rs:70:14:70:20 | &buffer | test.rs:68:50:68:63 | ...::stdin | test.rs:70:14:70:20 | &buffer | $@ | test.rs:68:50:68:63 | ...::stdin | ...::stdin | -| test.rs:71:14:71:22 | buffer[0] | test.rs:68:50:68:63 | ...::stdin | test.rs:71:14:71:22 | buffer[0] | $@ | test.rs:68:50:68:63 | ...::stdin | ...::stdin | -| test.rs:76:14:76:50 | ... .unwrap() | test.rs:75:56:75:69 | ...::stdin | test.rs:76:14:76:50 | ... .unwrap() | $@ | test.rs:75:56:75:69 | ...::stdin | ...::stdin | -| test.rs:78:18:78:31 | chunk.unwrap() | test.rs:75:56:75:69 | ...::stdin | test.rs:78:18:78:31 | chunk.unwrap() | $@ | test.rs:75:56:75:69 | ...::stdin | ...::stdin | -| test.rs:85:18:85:21 | line | test.rs:83:46:83:59 | ...::stdin | test.rs:85:18:85:21 | line | $@ | test.rs:83:46:83:59 | ...::stdin | ...::stdin | -| test.rs:92:14:92:34 | ... .clone() | test.rs:90:46:90:59 | ...::stdin | test.rs:92:14:92:34 | ... .clone() | $@ | test.rs:90:46:90:59 | ...::stdin | ...::stdin | -| test.rs:112:14:112:20 | &buffer | test.rs:109:25:109:40 | ...::stdin | test.rs:112:14:112:20 | &buffer | $@ | test.rs:109:25:109:40 | ...::stdin | ...::stdin | -| test.rs:119:14:119:20 | &buffer | test.rs:116:25:116:40 | ...::stdin | test.rs:119:14:119:20 | &buffer | $@ | test.rs:116:25:116:40 | ...::stdin | ...::stdin | -| test.rs:126:14:126:20 | &buffer | test.rs:123:25:123:40 | ...::stdin | test.rs:126:14:126:20 | &buffer | $@ | test.rs:123:25:123:40 | ...::stdin | ...::stdin | -| test.rs:133:14:133:20 | &buffer | test.rs:130:25:130:40 | ...::stdin | test.rs:133:14:133:20 | &buffer | $@ | test.rs:130:25:130:40 | ...::stdin | ...::stdin | -| test.rs:142:14:142:15 | v1 | test.rs:137:25:137:40 | ...::stdin | test.rs:142:14:142:15 | v1 | $@ | test.rs:137:25:137:40 | ...::stdin | ...::stdin | -| test.rs:143:14:143:15 | v2 | test.rs:137:25:137:40 | ...::stdin | test.rs:143:14:143:15 | v2 | $@ | test.rs:137:25:137:40 | ...::stdin | ...::stdin | -| test.rs:144:14:144:15 | v3 | test.rs:137:25:137:40 | ...::stdin | test.rs:144:14:144:15 | v3 | $@ | test.rs:137:25:137:40 | ...::stdin | ...::stdin | -| test.rs:145:14:145:15 | v4 | test.rs:137:25:137:40 | ...::stdin | test.rs:145:14:145:15 | v4 | $@ | test.rs:137:25:137:40 | ...::stdin | ...::stdin | -| test.rs:152:14:152:20 | &buffer | test.rs:149:25:149:40 | ...::stdin | test.rs:152:14:152:20 | &buffer | $@ | test.rs:149:25:149:40 | ...::stdin | ...::stdin | -| test.rs:160:14:160:18 | &data | test.rs:158:52:158:67 | ...::stdin | test.rs:160:14:160:18 | &data | $@ | test.rs:158:52:158:67 | ...::stdin | ...::stdin | -| test.rs:166:14:166:18 | &data | test.rs:164:48:164:63 | ...::stdin | test.rs:166:14:166:18 | &data | $@ | test.rs:164:48:164:63 | ...::stdin | ...::stdin | -| test.rs:173:14:173:20 | &buffer | test.rs:171:52:171:67 | ...::stdin | test.rs:173:14:173:20 | &buffer | $@ | test.rs:171:52:171:67 | ...::stdin | ...::stdin | -| test.rs:180:14:180:20 | &buffer | test.rs:178:52:178:67 | ...::stdin | test.rs:180:14:180:20 | &buffer | $@ | test.rs:178:52:178:67 | ...::stdin | ...::stdin | -| test.rs:181:14:181:22 | buffer[0] | test.rs:178:52:178:67 | ...::stdin | test.rs:181:14:181:22 | buffer[0] | $@ | test.rs:178:52:178:67 | ...::stdin | ...::stdin | -| test.rs:186:14:186:56 | ... .unwrap() | test.rs:185:58:185:73 | ...::stdin | test.rs:186:14:186:56 | ... .unwrap() | $@ | test.rs:185:58:185:73 | ...::stdin | ...::stdin | -| test.rs:188:18:188:22 | chunk | test.rs:185:58:185:73 | ...::stdin | test.rs:188:18:188:22 | chunk | $@ | test.rs:185:58:185:73 | ...::stdin | ...::stdin | -| test.rs:195:14:195:46 | ... .unwrap() | test.rs:193:48:193:63 | ...::stdin | test.rs:195:14:195:46 | ... .unwrap() | $@ | test.rs:193:48:193:63 | ...::stdin | ...::stdin | -| test.rs:197:18:197:21 | line | test.rs:193:48:193:63 | ...::stdin | test.rs:197:18:197:21 | line | $@ | test.rs:193:48:193:63 | ...::stdin | ...::stdin | +| test.rs:14:14:14:20 | &buffer | test.rs:13:22:13:37 | ...::stdin(...) | test.rs:14:14:14:20 | &buffer | $@ | test.rs:13:22:13:37 | ...::stdin(...) | ...::stdin(...) | +| test.rs:20:14:20:20 | &buffer | test.rs:19:22:19:37 | ...::stdin(...) | test.rs:20:14:20:20 | &buffer | $@ | test.rs:19:22:19:37 | ...::stdin(...) | ...::stdin(...) | +| test.rs:26:14:26:20 | &buffer | test.rs:25:22:25:37 | ...::stdin(...) | test.rs:26:14:26:20 | &buffer | $@ | test.rs:25:22:25:37 | ...::stdin(...) | ...::stdin(...) | +| test.rs:32:14:32:20 | &buffer | test.rs:31:22:31:37 | ...::stdin(...) | test.rs:32:14:32:20 | &buffer | $@ | test.rs:31:22:31:37 | ...::stdin(...) | ...::stdin(...) | +| test.rs:38:14:38:20 | &buffer | test.rs:37:9:37:24 | ...::stdin(...) | test.rs:38:14:38:20 | &buffer | $@ | test.rs:37:9:37:24 | ...::stdin(...) | ...::stdin(...) | +| test.rs:42:14:42:17 | byte | test.rs:41:17:41:32 | ...::stdin(...) | test.rs:42:14:42:17 | byte | $@ | test.rs:41:17:41:32 | ...::stdin(...) | ...::stdin(...) | +| test.rs:50:14:50:18 | &data | test.rs:48:50:48:65 | ...::stdin(...) | test.rs:50:14:50:18 | &data | $@ | test.rs:48:50:48:65 | ...::stdin(...) | ...::stdin(...) | +| test.rs:56:14:56:18 | &data | test.rs:54:46:54:61 | ...::stdin(...) | test.rs:56:14:56:18 | &data | $@ | test.rs:54:46:54:61 | ...::stdin(...) | ...::stdin(...) | +| test.rs:63:14:63:20 | &buffer | test.rs:61:50:61:65 | ...::stdin(...) | test.rs:63:14:63:20 | &buffer | $@ | test.rs:61:50:61:65 | ...::stdin(...) | ...::stdin(...) | +| test.rs:70:14:70:20 | &buffer | test.rs:68:50:68:65 | ...::stdin(...) | test.rs:70:14:70:20 | &buffer | $@ | test.rs:68:50:68:65 | ...::stdin(...) | ...::stdin(...) | +| test.rs:71:14:71:22 | buffer[0] | test.rs:68:50:68:65 | ...::stdin(...) | test.rs:71:14:71:22 | buffer[0] | $@ | test.rs:68:50:68:65 | ...::stdin(...) | ...::stdin(...) | +| test.rs:76:14:76:50 | ... .unwrap() | test.rs:75:56:75:71 | ...::stdin(...) | test.rs:76:14:76:50 | ... .unwrap() | $@ | test.rs:75:56:75:71 | ...::stdin(...) | ...::stdin(...) | +| test.rs:78:18:78:31 | chunk.unwrap() | test.rs:75:56:75:71 | ...::stdin(...) | test.rs:78:18:78:31 | chunk.unwrap() | $@ | test.rs:75:56:75:71 | ...::stdin(...) | ...::stdin(...) | +| test.rs:85:18:85:21 | line | test.rs:83:46:83:61 | ...::stdin(...) | test.rs:85:18:85:21 | line | $@ | test.rs:83:46:83:61 | ...::stdin(...) | ...::stdin(...) | +| test.rs:92:14:92:34 | ... .clone() | test.rs:90:46:90:61 | ...::stdin(...) | test.rs:92:14:92:34 | ... .clone() | $@ | test.rs:90:46:90:61 | ...::stdin(...) | ...::stdin(...) | +| test.rs:112:14:112:20 | &buffer | test.rs:109:25:109:42 | ...::stdin(...) | test.rs:112:14:112:20 | &buffer | $@ | test.rs:109:25:109:42 | ...::stdin(...) | ...::stdin(...) | +| test.rs:119:14:119:20 | &buffer | test.rs:116:25:116:42 | ...::stdin(...) | test.rs:119:14:119:20 | &buffer | $@ | test.rs:116:25:116:42 | ...::stdin(...) | ...::stdin(...) | +| test.rs:126:14:126:20 | &buffer | test.rs:123:25:123:42 | ...::stdin(...) | test.rs:126:14:126:20 | &buffer | $@ | test.rs:123:25:123:42 | ...::stdin(...) | ...::stdin(...) | +| test.rs:133:14:133:20 | &buffer | test.rs:130:25:130:42 | ...::stdin(...) | test.rs:133:14:133:20 | &buffer | $@ | test.rs:130:25:130:42 | ...::stdin(...) | ...::stdin(...) | +| test.rs:142:14:142:15 | v1 | test.rs:137:25:137:42 | ...::stdin(...) | test.rs:142:14:142:15 | v1 | $@ | test.rs:137:25:137:42 | ...::stdin(...) | ...::stdin(...) | +| test.rs:143:14:143:15 | v2 | test.rs:137:25:137:42 | ...::stdin(...) | test.rs:143:14:143:15 | v2 | $@ | test.rs:137:25:137:42 | ...::stdin(...) | ...::stdin(...) | +| test.rs:144:14:144:15 | v3 | test.rs:137:25:137:42 | ...::stdin(...) | test.rs:144:14:144:15 | v3 | $@ | test.rs:137:25:137:42 | ...::stdin(...) | ...::stdin(...) | +| test.rs:145:14:145:15 | v4 | test.rs:137:25:137:42 | ...::stdin(...) | test.rs:145:14:145:15 | v4 | $@ | test.rs:137:25:137:42 | ...::stdin(...) | ...::stdin(...) | +| test.rs:152:14:152:20 | &buffer | test.rs:149:25:149:42 | ...::stdin(...) | test.rs:152:14:152:20 | &buffer | $@ | test.rs:149:25:149:42 | ...::stdin(...) | ...::stdin(...) | +| test.rs:160:14:160:18 | &data | test.rs:158:52:158:69 | ...::stdin(...) | test.rs:160:14:160:18 | &data | $@ | test.rs:158:52:158:69 | ...::stdin(...) | ...::stdin(...) | +| test.rs:166:14:166:18 | &data | test.rs:164:48:164:65 | ...::stdin(...) | test.rs:166:14:166:18 | &data | $@ | test.rs:164:48:164:65 | ...::stdin(...) | ...::stdin(...) | +| test.rs:173:14:173:20 | &buffer | test.rs:171:52:171:69 | ...::stdin(...) | test.rs:173:14:173:20 | &buffer | $@ | test.rs:171:52:171:69 | ...::stdin(...) | ...::stdin(...) | +| test.rs:180:14:180:20 | &buffer | test.rs:178:52:178:69 | ...::stdin(...) | test.rs:180:14:180:20 | &buffer | $@ | test.rs:178:52:178:69 | ...::stdin(...) | ...::stdin(...) | +| test.rs:181:14:181:22 | buffer[0] | test.rs:178:52:178:69 | ...::stdin(...) | test.rs:181:14:181:22 | buffer[0] | $@ | test.rs:178:52:178:69 | ...::stdin(...) | ...::stdin(...) | +| test.rs:186:14:186:56 | ... .unwrap() | test.rs:185:58:185:75 | ...::stdin(...) | test.rs:186:14:186:56 | ... .unwrap() | $@ | test.rs:185:58:185:75 | ...::stdin(...) | ...::stdin(...) | +| test.rs:188:18:188:22 | chunk | test.rs:185:58:185:75 | ...::stdin(...) | test.rs:188:18:188:22 | chunk | $@ | test.rs:185:58:185:75 | ...::stdin(...) | ...::stdin(...) | +| test.rs:195:14:195:46 | ... .unwrap() | test.rs:193:48:193:65 | ...::stdin(...) | test.rs:195:14:195:46 | ... .unwrap() | $@ | test.rs:193:48:193:65 | ...::stdin(...) | ...::stdin(...) | +| test.rs:197:18:197:21 | line | test.rs:193:48:193:65 | ...::stdin(...) | test.rs:197:18:197:21 | line | $@ | test.rs:193:48:193:65 | ...::stdin(...) | ...::stdin(...) | diff --git a/rust/ql/test/library-tests/dataflow/sources/stdin/TaintSources.expected b/rust/ql/test/library-tests/dataflow/sources/stdin/TaintSources.expected index 085237733145..aeca83904a13 100644 --- a/rust/ql/test/library-tests/dataflow/sources/stdin/TaintSources.expected +++ b/rust/ql/test/library-tests/dataflow/sources/stdin/TaintSources.expected @@ -1,26 +1,26 @@ -| test.rs:13:22:13:35 | ...::stdin | Flow source 'StdInSource' of type stdin (DEFAULT). | -| test.rs:19:22:19:35 | ...::stdin | Flow source 'StdInSource' of type stdin (DEFAULT). | -| test.rs:25:22:25:35 | ...::stdin | Flow source 'StdInSource' of type stdin (DEFAULT). | -| test.rs:31:22:31:35 | ...::stdin | Flow source 'StdInSource' of type stdin (DEFAULT). | -| test.rs:37:9:37:22 | ...::stdin | Flow source 'StdInSource' of type stdin (DEFAULT). | -| test.rs:41:17:41:30 | ...::stdin | Flow source 'StdInSource' of type stdin (DEFAULT). | -| test.rs:48:50:48:63 | ...::stdin | Flow source 'StdInSource' of type stdin (DEFAULT). | -| test.rs:54:46:54:59 | ...::stdin | Flow source 'StdInSource' of type stdin (DEFAULT). | -| test.rs:61:50:61:63 | ...::stdin | Flow source 'StdInSource' of type stdin (DEFAULT). | -| test.rs:68:50:68:63 | ...::stdin | Flow source 'StdInSource' of type stdin (DEFAULT). | -| test.rs:75:56:75:69 | ...::stdin | Flow source 'StdInSource' of type stdin (DEFAULT). | -| test.rs:83:46:83:59 | ...::stdin | Flow source 'StdInSource' of type stdin (DEFAULT). | -| test.rs:90:46:90:59 | ...::stdin | Flow source 'StdInSource' of type stdin (DEFAULT). | -| test.rs:96:46:96:59 | ...::stdin | Flow source 'StdInSource' of type stdin (DEFAULT). | -| test.rs:109:25:109:40 | ...::stdin | Flow source 'StdInSource' of type stdin (DEFAULT). | -| test.rs:116:25:116:40 | ...::stdin | Flow source 'StdInSource' of type stdin (DEFAULT). | -| test.rs:123:25:123:40 | ...::stdin | Flow source 'StdInSource' of type stdin (DEFAULT). | -| test.rs:130:25:130:40 | ...::stdin | Flow source 'StdInSource' of type stdin (DEFAULT). | -| test.rs:137:25:137:40 | ...::stdin | Flow source 'StdInSource' of type stdin (DEFAULT). | -| test.rs:149:25:149:40 | ...::stdin | Flow source 'StdInSource' of type stdin (DEFAULT). | -| test.rs:158:52:158:67 | ...::stdin | Flow source 'StdInSource' of type stdin (DEFAULT). | -| test.rs:164:48:164:63 | ...::stdin | Flow source 'StdInSource' of type stdin (DEFAULT). | -| test.rs:171:52:171:67 | ...::stdin | Flow source 'StdInSource' of type stdin (DEFAULT). | -| test.rs:178:52:178:67 | ...::stdin | Flow source 'StdInSource' of type stdin (DEFAULT). | -| test.rs:185:58:185:73 | ...::stdin | Flow source 'StdInSource' of type stdin (DEFAULT). | -| test.rs:193:48:193:63 | ...::stdin | Flow source 'StdInSource' of type stdin (DEFAULT). | +| test.rs:13:22:13:37 | ...::stdin(...) | Flow source 'StdInSource' of type stdin (DEFAULT). | +| test.rs:19:22:19:37 | ...::stdin(...) | Flow source 'StdInSource' of type stdin (DEFAULT). | +| test.rs:25:22:25:37 | ...::stdin(...) | Flow source 'StdInSource' of type stdin (DEFAULT). | +| test.rs:31:22:31:37 | ...::stdin(...) | Flow source 'StdInSource' of type stdin (DEFAULT). | +| test.rs:37:9:37:24 | ...::stdin(...) | Flow source 'StdInSource' of type stdin (DEFAULT). | +| test.rs:41:17:41:32 | ...::stdin(...) | Flow source 'StdInSource' of type stdin (DEFAULT). | +| test.rs:48:50:48:65 | ...::stdin(...) | Flow source 'StdInSource' of type stdin (DEFAULT). | +| test.rs:54:46:54:61 | ...::stdin(...) | Flow source 'StdInSource' of type stdin (DEFAULT). | +| test.rs:61:50:61:65 | ...::stdin(...) | Flow source 'StdInSource' of type stdin (DEFAULT). | +| test.rs:68:50:68:65 | ...::stdin(...) | Flow source 'StdInSource' of type stdin (DEFAULT). | +| test.rs:75:56:75:71 | ...::stdin(...) | Flow source 'StdInSource' of type stdin (DEFAULT). | +| test.rs:83:46:83:61 | ...::stdin(...) | Flow source 'StdInSource' of type stdin (DEFAULT). | +| test.rs:90:46:90:61 | ...::stdin(...) | Flow source 'StdInSource' of type stdin (DEFAULT). | +| test.rs:96:46:96:61 | ...::stdin(...) | Flow source 'StdInSource' of type stdin (DEFAULT). | +| test.rs:109:25:109:42 | ...::stdin(...) | Flow source 'StdInSource' of type stdin (DEFAULT). | +| test.rs:116:25:116:42 | ...::stdin(...) | Flow source 'StdInSource' of type stdin (DEFAULT). | +| test.rs:123:25:123:42 | ...::stdin(...) | Flow source 'StdInSource' of type stdin (DEFAULT). | +| test.rs:130:25:130:42 | ...::stdin(...) | Flow source 'StdInSource' of type stdin (DEFAULT). | +| test.rs:137:25:137:42 | ...::stdin(...) | Flow source 'StdInSource' of type stdin (DEFAULT). | +| test.rs:149:25:149:42 | ...::stdin(...) | Flow source 'StdInSource' of type stdin (DEFAULT). | +| test.rs:158:52:158:69 | ...::stdin(...) | Flow source 'StdInSource' of type stdin (DEFAULT). | +| test.rs:164:48:164:65 | ...::stdin(...) | Flow source 'StdInSource' of type stdin (DEFAULT). | +| test.rs:171:52:171:69 | ...::stdin(...) | Flow source 'StdInSource' of type stdin (DEFAULT). | +| test.rs:178:52:178:69 | ...::stdin(...) | Flow source 'StdInSource' of type stdin (DEFAULT). | +| test.rs:185:58:185:75 | ...::stdin(...) | Flow source 'StdInSource' of type stdin (DEFAULT). | +| test.rs:193:48:193:65 | ...::stdin(...) | Flow source 'StdInSource' of type stdin (DEFAULT). | diff --git a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected index 7b8a4b97e60a..49c37938199e 100644 --- a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected @@ -25,7 +25,6 @@ edges | test.rs:58:14:58:15 | ms | test.rs:60:14:60:17 | ms.a | provenance | | | test.rs:58:14:58:15 | ms | test.rs:61:14:61:17 | ms.b | provenance | | | test.rs:68:15:68:15 | a | test.rs:70:14:70:14 | a | provenance | | -| test.rs:97:33:97:55 | ...: ...::Path::<...> | test.rs:98:17:98:20 | path | provenance | | | test.rs:98:13:98:13 | a | test.rs:99:14:99:14 | a | provenance | | | test.rs:98:13:98:13 | a | test.rs:100:14:100:14 | a | provenance | | | test.rs:98:13:98:13 | a | test.rs:101:14:101:14 | a | provenance | | @@ -33,46 +32,33 @@ edges | test.rs:98:17:98:33 | path.into_inner() | test.rs:98:13:98:13 | a | provenance | | | test.rs:99:14:99:14 | a | test.rs:99:14:99:23 | a.as_str() | provenance | MaD:13 | | test.rs:100:14:100:14 | a | test.rs:100:14:100:25 | a.as_bytes() | provenance | MaD:12 | -| test.rs:106:33:106:65 | ...: ...::Path::<...> | test.rs:107:22:107:25 | path | provenance | | | test.rs:107:13:107:18 | TuplePat | test.rs:109:14:109:14 | a | provenance | | | test.rs:107:13:107:18 | TuplePat | test.rs:110:14:110:14 | b | provenance | | | test.rs:107:22:107:25 | path | test.rs:107:22:107:38 | path.into_inner() | provenance | MaD:11 | | test.rs:107:22:107:38 | path.into_inner() | test.rs:107:13:107:18 | TuplePat | provenance | | -| test.rs:115:33:115:65 | ...: ...::Query::<...> | test.rs:116:14:116:14 | a | provenance | | -| test.rs:121:7:121:19 | to | test.rs:122:33:122:55 | ...: ...::Path::<...> | provenance | Src:MaD:4 | -| test.rs:122:33:122:55 | ...: ...::Path::<...> | test.rs:123:17:123:20 | path | provenance | | +| test.rs:122:14:122:31 | my_actix_handler_4 | test.rs:123:17:123:20 | path | provenance | Src:MaD:4 | | test.rs:123:13:123:13 | a | test.rs:124:14:124:14 | a | provenance | | | test.rs:123:17:123:20 | path | test.rs:123:17:123:33 | path.into_inner() | provenance | MaD:11 | | test.rs:123:17:123:33 | path.into_inner() | test.rs:123:13:123:13 | a | provenance | | -| test.rs:131:41:131:42 | to | test.rs:97:33:97:55 | ...: ...::Path::<...> | provenance | Src:MaD:5 | -| test.rs:132:45:132:46 | to | test.rs:106:33:106:65 | ...: ...::Path::<...> | provenance | Src:MaD:5 | -| test.rs:133:41:133:42 | to | test.rs:115:33:115:65 | ...: ...::Query::<...> | provenance | Src:MaD:5 | -| test.rs:147:32:147:52 | ...: Path::<...> | test.rs:148:14:148:14 | a | provenance | | -| test.rs:147:32:147:52 | ...: Path::<...> | test.rs:149:14:149:14 | a | provenance | | -| test.rs:147:32:147:52 | ...: Path::<...> | test.rs:150:14:150:14 | a | provenance | | +| test.rs:131:44:131:61 | my_actix_handler_1 | test.rs:98:17:98:20 | path | provenance | Src:MaD:5 | +| test.rs:132:48:132:65 | my_actix_handler_2 | test.rs:107:22:107:25 | path | provenance | Src:MaD:5 | +| test.rs:133:44:133:61 | my_actix_handler_3 | test.rs:116:14:116:14 | a | provenance | Src:MaD:5 | | test.rs:148:14:148:14 | a | test.rs:148:14:148:23 | a.as_str() | provenance | MaD:13 | | test.rs:149:14:149:14 | a | test.rs:149:14:149:25 | a.as_bytes() | provenance | MaD:12 | -| test.rs:155:32:155:67 | ...: Path::<...> | test.rs:156:14:156:14 | a | provenance | | -| test.rs:155:32:155:67 | ...: Path::<...> | test.rs:157:14:157:14 | b | provenance | | -| test.rs:162:32:162:76 | ...: Query::<...> | test.rs:164:18:164:20 | key | provenance | | -| test.rs:162:32:162:76 | ...: Query::<...> | test.rs:165:18:165:22 | value | provenance | | -| test.rs:179:32:179:69 | ...: Json::<...> | test.rs:181:14:181:20 | payload | provenance | | -| test.rs:186:32:186:43 | ...: String | test.rs:187:14:187:17 | body | provenance | | -| test.rs:192:32:192:43 | ...: String | test.rs:193:14:193:17 | body | provenance | | -| test.rs:200:30:200:32 | get | test.rs:147:32:147:52 | ...: Path::<...> | provenance | Src:MaD:8 | -| test.rs:201:34:201:37 | post | test.rs:155:32:155:67 | ...: Path::<...> | provenance | Src:MaD:9 | -| test.rs:202:29:202:31 | put | test.rs:162:32:162:76 | ...: Query::<...> | provenance | Src:MaD:10 | -| test.rs:205:40:205:41 | on | test.rs:179:32:179:69 | ...: Json::<...> | provenance | Src:MaD:7 | -| test.rs:207:29:207:31 | get | test.rs:186:32:186:43 | ...: String | provenance | Src:MaD:8 | -| test.rs:207:52:207:54 | get | test.rs:192:32:192:43 | ...: String | provenance | Src:MaD:6 | -| test.rs:222:33:222:35 | map | test.rs:222:38:222:46 | ...: String | provenance | Src:MaD:2 | -| test.rs:222:38:222:46 | ...: String | test.rs:224:18:224:18 | a | provenance | | -| test.rs:230:46:230:49 | then | test.rs:231:25:231:33 | ...: String | provenance | Src:MaD:3 | -| test.rs:231:25:231:33 | ...: String | test.rs:232:22:232:22 | a | provenance | | -| test.rs:239:50:239:57 | and_then | test.rs:240:26:240:32 | ...: u64 | provenance | Src:MaD:1 | -| test.rs:240:26:240:32 | ...: u64 | test.rs:243:22:243:23 | id | provenance | | -| test.rs:252:75:252:77 | map | test.rs:253:15:253:23 | ...: String | provenance | Src:MaD:2 | -| test.rs:253:15:253:23 | ...: String | test.rs:255:22:255:22 | a | provenance | | +| test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:148:14:148:14 | a | provenance | Src:MaD:8 | +| test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:149:14:149:14 | a | provenance | Src:MaD:8 | +| test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:150:14:150:14 | a | provenance | Src:MaD:8 | +| test.rs:201:39:201:55 | my_axum_handler_2 | test.rs:156:14:156:14 | a | provenance | Src:MaD:9 | +| test.rs:201:39:201:55 | my_axum_handler_2 | test.rs:157:14:157:14 | b | provenance | Src:MaD:9 | +| test.rs:202:33:202:49 | my_axum_handler_3 | test.rs:164:18:164:20 | key | provenance | Src:MaD:10 | +| test.rs:202:33:202:49 | my_axum_handler_3 | test.rs:165:18:165:22 | value | provenance | Src:MaD:10 | +| test.rs:205:65:205:81 | my_axum_handler_5 | test.rs:181:14:181:20 | payload | provenance | Src:MaD:7 | +| test.rs:207:33:207:49 | my_axum_handler_6 | test.rs:187:14:187:17 | body | provenance | Src:MaD:8 | +| test.rs:207:56:207:72 | my_axum_handler_7 | test.rs:193:14:193:17 | body | provenance | Src:MaD:6 | +| test.rs:222:37:227:9 | \|...\| ... | test.rs:224:18:224:18 | a | provenance | Src:MaD:2 | +| test.rs:231:13:235:13 | \|...\| ... | test.rs:232:22:232:22 | a | provenance | Src:MaD:3 | +| test.rs:240:13:248:9 | \|...\| ... | test.rs:243:22:243:23 | id | provenance | Src:MaD:1 | +| test.rs:253:13:258:14 | \|...\| ... | test.rs:255:22:255:22 | a | provenance | Src:MaD:2 | nodes | test.rs:11:31:11:31 | a | semmle.label | a | | test.rs:13:14:13:14 | a | semmle.label | a | @@ -91,7 +77,6 @@ nodes | test.rs:61:14:61:17 | ms.b | semmle.label | ms.b | | test.rs:68:15:68:15 | a | semmle.label | a | | test.rs:70:14:70:14 | a | semmle.label | a | -| test.rs:97:33:97:55 | ...: ...::Path::<...> | semmle.label | ...: ...::Path::<...> | | test.rs:98:13:98:13 | a | semmle.label | a | | test.rs:98:17:98:20 | path | semmle.label | path | | test.rs:98:17:98:33 | path.into_inner() | semmle.label | path.into_inner() | @@ -100,58 +85,45 @@ nodes | test.rs:100:14:100:14 | a | semmle.label | a | | test.rs:100:14:100:25 | a.as_bytes() | semmle.label | a.as_bytes() | | test.rs:101:14:101:14 | a | semmle.label | a | -| test.rs:106:33:106:65 | ...: ...::Path::<...> | semmle.label | ...: ...::Path::<...> | | test.rs:107:13:107:18 | TuplePat | semmle.label | TuplePat | | test.rs:107:22:107:25 | path | semmle.label | path | | test.rs:107:22:107:38 | path.into_inner() | semmle.label | path.into_inner() | | test.rs:109:14:109:14 | a | semmle.label | a | | test.rs:110:14:110:14 | b | semmle.label | b | -| test.rs:115:33:115:65 | ...: ...::Query::<...> | semmle.label | ...: ...::Query::<...> | | test.rs:116:14:116:14 | a | semmle.label | a | -| test.rs:121:7:121:19 | to | semmle.label | to | -| test.rs:122:33:122:55 | ...: ...::Path::<...> | semmle.label | ...: ...::Path::<...> | +| test.rs:122:14:122:31 | my_actix_handler_4 | semmle.label | my_actix_handler_4 | | test.rs:123:13:123:13 | a | semmle.label | a | | test.rs:123:17:123:20 | path | semmle.label | path | | test.rs:123:17:123:33 | path.into_inner() | semmle.label | path.into_inner() | | test.rs:124:14:124:14 | a | semmle.label | a | -| test.rs:131:41:131:42 | to | semmle.label | to | -| test.rs:132:45:132:46 | to | semmle.label | to | -| test.rs:133:41:133:42 | to | semmle.label | to | -| test.rs:147:32:147:52 | ...: Path::<...> | semmle.label | ...: Path::<...> | +| test.rs:131:44:131:61 | my_actix_handler_1 | semmle.label | my_actix_handler_1 | +| test.rs:132:48:132:65 | my_actix_handler_2 | semmle.label | my_actix_handler_2 | +| test.rs:133:44:133:61 | my_actix_handler_3 | semmle.label | my_actix_handler_3 | | test.rs:148:14:148:14 | a | semmle.label | a | | test.rs:148:14:148:23 | a.as_str() | semmle.label | a.as_str() | | test.rs:149:14:149:14 | a | semmle.label | a | | test.rs:149:14:149:25 | a.as_bytes() | semmle.label | a.as_bytes() | | test.rs:150:14:150:14 | a | semmle.label | a | -| test.rs:155:32:155:67 | ...: Path::<...> | semmle.label | ...: Path::<...> | | test.rs:156:14:156:14 | a | semmle.label | a | | test.rs:157:14:157:14 | b | semmle.label | b | -| test.rs:162:32:162:76 | ...: Query::<...> | semmle.label | ...: Query::<...> | | test.rs:164:18:164:20 | key | semmle.label | key | | test.rs:165:18:165:22 | value | semmle.label | value | -| test.rs:179:32:179:69 | ...: Json::<...> | semmle.label | ...: Json::<...> | | test.rs:181:14:181:20 | payload | semmle.label | payload | -| test.rs:186:32:186:43 | ...: String | semmle.label | ...: String | | test.rs:187:14:187:17 | body | semmle.label | body | -| test.rs:192:32:192:43 | ...: String | semmle.label | ...: String | | test.rs:193:14:193:17 | body | semmle.label | body | -| test.rs:200:30:200:32 | get | semmle.label | get | -| test.rs:201:34:201:37 | post | semmle.label | post | -| test.rs:202:29:202:31 | put | semmle.label | put | -| test.rs:205:40:205:41 | on | semmle.label | on | -| test.rs:207:29:207:31 | get | semmle.label | get | -| test.rs:207:52:207:54 | get | semmle.label | get | -| test.rs:222:33:222:35 | map | semmle.label | map | -| test.rs:222:38:222:46 | ...: String | semmle.label | ...: String | +| test.rs:200:34:200:50 | my_axum_handler_1 | semmle.label | my_axum_handler_1 | +| test.rs:201:39:201:55 | my_axum_handler_2 | semmle.label | my_axum_handler_2 | +| test.rs:202:33:202:49 | my_axum_handler_3 | semmle.label | my_axum_handler_3 | +| test.rs:205:65:205:81 | my_axum_handler_5 | semmle.label | my_axum_handler_5 | +| test.rs:207:33:207:49 | my_axum_handler_6 | semmle.label | my_axum_handler_6 | +| test.rs:207:56:207:72 | my_axum_handler_7 | semmle.label | my_axum_handler_7 | +| test.rs:222:37:227:9 | \|...\| ... | semmle.label | \|...\| ... | | test.rs:224:18:224:18 | a | semmle.label | a | -| test.rs:230:46:230:49 | then | semmle.label | then | -| test.rs:231:25:231:33 | ...: String | semmle.label | ...: String | +| test.rs:231:13:235:13 | \|...\| ... | semmle.label | \|...\| ... | | test.rs:232:22:232:22 | a | semmle.label | a | -| test.rs:239:50:239:57 | and_then | semmle.label | and_then | -| test.rs:240:26:240:32 | ...: u64 | semmle.label | ...: u64 | +| test.rs:240:13:248:9 | \|...\| ... | semmle.label | \|...\| ... | | test.rs:243:22:243:23 | id | semmle.label | id | -| test.rs:252:75:252:77 | map | semmle.label | map | -| test.rs:253:15:253:23 | ...: String | semmle.label | ...: String | +| test.rs:253:13:258:14 | \|...\| ... | semmle.label | \|...\| ... | | test.rs:255:22:255:22 | a | semmle.label | a | subpaths testFailures @@ -166,24 +138,24 @@ testFailures | test.rs:60:14:60:17 | ms.a | test.rs:58:14:58:15 | ms | test.rs:60:14:60:17 | ms.a | $@ | test.rs:58:14:58:15 | ms | ms | | test.rs:61:14:61:17 | ms.b | test.rs:58:14:58:15 | ms | test.rs:61:14:61:17 | ms.b | $@ | test.rs:58:14:58:15 | ms | ms | | test.rs:70:14:70:14 | a | test.rs:68:15:68:15 | a | test.rs:70:14:70:14 | a | $@ | test.rs:68:15:68:15 | a | a | -| test.rs:99:14:99:23 | a.as_str() | test.rs:131:41:131:42 | to | test.rs:99:14:99:23 | a.as_str() | $@ | test.rs:131:41:131:42 | to | to | -| test.rs:100:14:100:25 | a.as_bytes() | test.rs:131:41:131:42 | to | test.rs:100:14:100:25 | a.as_bytes() | $@ | test.rs:131:41:131:42 | to | to | -| test.rs:101:14:101:14 | a | test.rs:131:41:131:42 | to | test.rs:101:14:101:14 | a | $@ | test.rs:131:41:131:42 | to | to | -| test.rs:109:14:109:14 | a | test.rs:132:45:132:46 | to | test.rs:109:14:109:14 | a | $@ | test.rs:132:45:132:46 | to | to | -| test.rs:110:14:110:14 | b | test.rs:132:45:132:46 | to | test.rs:110:14:110:14 | b | $@ | test.rs:132:45:132:46 | to | to | -| test.rs:116:14:116:14 | a | test.rs:133:41:133:42 | to | test.rs:116:14:116:14 | a | $@ | test.rs:133:41:133:42 | to | to | -| test.rs:124:14:124:14 | a | test.rs:121:7:121:19 | to | test.rs:124:14:124:14 | a | $@ | test.rs:121:7:121:19 | to | to | -| test.rs:148:14:148:23 | a.as_str() | test.rs:200:30:200:32 | get | test.rs:148:14:148:23 | a.as_str() | $@ | test.rs:200:30:200:32 | get | get | -| test.rs:149:14:149:25 | a.as_bytes() | test.rs:200:30:200:32 | get | test.rs:149:14:149:25 | a.as_bytes() | $@ | test.rs:200:30:200:32 | get | get | -| test.rs:150:14:150:14 | a | test.rs:200:30:200:32 | get | test.rs:150:14:150:14 | a | $@ | test.rs:200:30:200:32 | get | get | -| test.rs:156:14:156:14 | a | test.rs:201:34:201:37 | post | test.rs:156:14:156:14 | a | $@ | test.rs:201:34:201:37 | post | post | -| test.rs:157:14:157:14 | b | test.rs:201:34:201:37 | post | test.rs:157:14:157:14 | b | $@ | test.rs:201:34:201:37 | post | post | -| test.rs:164:18:164:20 | key | test.rs:202:29:202:31 | put | test.rs:164:18:164:20 | key | $@ | test.rs:202:29:202:31 | put | put | -| test.rs:165:18:165:22 | value | test.rs:202:29:202:31 | put | test.rs:165:18:165:22 | value | $@ | test.rs:202:29:202:31 | put | put | -| test.rs:181:14:181:20 | payload | test.rs:205:40:205:41 | on | test.rs:181:14:181:20 | payload | $@ | test.rs:205:40:205:41 | on | on | -| test.rs:187:14:187:17 | body | test.rs:207:29:207:31 | get | test.rs:187:14:187:17 | body | $@ | test.rs:207:29:207:31 | get | get | -| test.rs:193:14:193:17 | body | test.rs:207:52:207:54 | get | test.rs:193:14:193:17 | body | $@ | test.rs:207:52:207:54 | get | get | -| test.rs:224:18:224:18 | a | test.rs:222:33:222:35 | map | test.rs:224:18:224:18 | a | $@ | test.rs:222:33:222:35 | map | map | -| test.rs:232:22:232:22 | a | test.rs:230:46:230:49 | then | test.rs:232:22:232:22 | a | $@ | test.rs:230:46:230:49 | then | then | -| test.rs:243:22:243:23 | id | test.rs:239:50:239:57 | and_then | test.rs:243:22:243:23 | id | $@ | test.rs:239:50:239:57 | and_then | and_then | -| test.rs:255:22:255:22 | a | test.rs:252:75:252:77 | map | test.rs:255:22:255:22 | a | $@ | test.rs:252:75:252:77 | map | map | +| test.rs:99:14:99:23 | a.as_str() | test.rs:131:44:131:61 | my_actix_handler_1 | test.rs:99:14:99:23 | a.as_str() | $@ | test.rs:131:44:131:61 | my_actix_handler_1 | my_actix_handler_1 | +| test.rs:100:14:100:25 | a.as_bytes() | test.rs:131:44:131:61 | my_actix_handler_1 | test.rs:100:14:100:25 | a.as_bytes() | $@ | test.rs:131:44:131:61 | my_actix_handler_1 | my_actix_handler_1 | +| test.rs:101:14:101:14 | a | test.rs:131:44:131:61 | my_actix_handler_1 | test.rs:101:14:101:14 | a | $@ | test.rs:131:44:131:61 | my_actix_handler_1 | my_actix_handler_1 | +| test.rs:109:14:109:14 | a | test.rs:132:48:132:65 | my_actix_handler_2 | test.rs:109:14:109:14 | a | $@ | test.rs:132:48:132:65 | my_actix_handler_2 | my_actix_handler_2 | +| test.rs:110:14:110:14 | b | test.rs:132:48:132:65 | my_actix_handler_2 | test.rs:110:14:110:14 | b | $@ | test.rs:132:48:132:65 | my_actix_handler_2 | my_actix_handler_2 | +| test.rs:116:14:116:14 | a | test.rs:133:44:133:61 | my_actix_handler_3 | test.rs:116:14:116:14 | a | $@ | test.rs:133:44:133:61 | my_actix_handler_3 | my_actix_handler_3 | +| test.rs:124:14:124:14 | a | test.rs:122:14:122:31 | my_actix_handler_4 | test.rs:124:14:124:14 | a | $@ | test.rs:122:14:122:31 | my_actix_handler_4 | my_actix_handler_4 | +| test.rs:148:14:148:23 | a.as_str() | test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:148:14:148:23 | a.as_str() | $@ | test.rs:200:34:200:50 | my_axum_handler_1 | my_axum_handler_1 | +| test.rs:149:14:149:25 | a.as_bytes() | test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:149:14:149:25 | a.as_bytes() | $@ | test.rs:200:34:200:50 | my_axum_handler_1 | my_axum_handler_1 | +| test.rs:150:14:150:14 | a | test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:150:14:150:14 | a | $@ | test.rs:200:34:200:50 | my_axum_handler_1 | my_axum_handler_1 | +| test.rs:156:14:156:14 | a | test.rs:201:39:201:55 | my_axum_handler_2 | test.rs:156:14:156:14 | a | $@ | test.rs:201:39:201:55 | my_axum_handler_2 | my_axum_handler_2 | +| test.rs:157:14:157:14 | b | test.rs:201:39:201:55 | my_axum_handler_2 | test.rs:157:14:157:14 | b | $@ | test.rs:201:39:201:55 | my_axum_handler_2 | my_axum_handler_2 | +| test.rs:164:18:164:20 | key | test.rs:202:33:202:49 | my_axum_handler_3 | test.rs:164:18:164:20 | key | $@ | test.rs:202:33:202:49 | my_axum_handler_3 | my_axum_handler_3 | +| test.rs:165:18:165:22 | value | test.rs:202:33:202:49 | my_axum_handler_3 | test.rs:165:18:165:22 | value | $@ | test.rs:202:33:202:49 | my_axum_handler_3 | my_axum_handler_3 | +| test.rs:181:14:181:20 | payload | test.rs:205:65:205:81 | my_axum_handler_5 | test.rs:181:14:181:20 | payload | $@ | test.rs:205:65:205:81 | my_axum_handler_5 | my_axum_handler_5 | +| test.rs:187:14:187:17 | body | test.rs:207:33:207:49 | my_axum_handler_6 | test.rs:187:14:187:17 | body | $@ | test.rs:207:33:207:49 | my_axum_handler_6 | my_axum_handler_6 | +| test.rs:193:14:193:17 | body | test.rs:207:56:207:72 | my_axum_handler_7 | test.rs:193:14:193:17 | body | $@ | test.rs:207:56:207:72 | my_axum_handler_7 | my_axum_handler_7 | +| test.rs:224:18:224:18 | a | test.rs:222:37:227:9 | \|...\| ... | test.rs:224:18:224:18 | a | $@ | test.rs:222:37:227:9 | \|...\| ... | \|...\| ... | +| test.rs:232:22:232:22 | a | test.rs:231:13:235:13 | \|...\| ... | test.rs:232:22:232:22 | a | $@ | test.rs:231:13:235:13 | \|...\| ... | \|...\| ... | +| test.rs:243:22:243:23 | id | test.rs:240:13:248:9 | \|...\| ... | test.rs:243:22:243:23 | id | $@ | test.rs:240:13:248:9 | \|...\| ... | \|...\| ... | +| test.rs:255:22:255:22 | a | test.rs:253:13:258:14 | \|...\| ... | test.rs:255:22:255:22 | a | $@ | test.rs:253:13:258:14 | \|...\| ... | \|...\| ... | diff --git a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/TaintSources.expected b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/TaintSources.expected index 6ff9e7cfa031..456ec4949bbe 100644 --- a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/TaintSources.expected +++ b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/TaintSources.expected @@ -3,123 +3,123 @@ | test.rs:48:14:48:30 | MyStruct {...} | Flow source 'RemoteSource' of type remote (DEFAULT). | | test.rs:58:14:58:15 | ms | Flow source 'RemoteSource' of type remote (DEFAULT). | | test.rs:68:15:68:15 | a | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:121:7:121:19 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:121:7:121:19 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:121:7:121:19 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:121:7:121:19 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:121:7:121:19 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:121:7:121:19 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:121:7:121:19 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:121:7:121:19 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:131:41:131:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:131:41:131:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:131:41:131:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:131:41:131:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:131:41:131:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:131:41:131:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:131:41:131:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:131:41:131:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:132:45:132:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:132:45:132:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:132:45:132:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:132:45:132:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:132:45:132:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:132:45:132:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:132:45:132:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:132:45:132:46 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:133:41:133:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:133:41:133:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:133:41:133:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:133:41:133:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:133:41:133:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:133:41:133:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:133:41:133:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:133:41:133:42 | to | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:200:30:200:32 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:200:30:200:32 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:200:30:200:32 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:200:30:200:32 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:200:30:200:32 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:200:30:200:32 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:200:30:200:32 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:200:30:200:32 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:201:34:201:37 | post | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:201:34:201:37 | post | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:201:34:201:37 | post | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:201:34:201:37 | post | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:201:34:201:37 | post | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:201:34:201:37 | post | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:201:34:201:37 | post | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:201:34:201:37 | post | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:202:29:202:31 | put | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:202:29:202:31 | put | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:202:29:202:31 | put | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:202:29:202:31 | put | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:202:29:202:31 | put | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:202:29:202:31 | put | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:202:29:202:31 | put | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:202:29:202:31 | put | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:17:205:19 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:17:205:19 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:17:205:19 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:17:205:19 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:17:205:19 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:17:205:19 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:17:205:19 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:17:205:19 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:40:205:41 | on | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:40:205:41 | on | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:40:205:41 | on | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:40:205:41 | on | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:40:205:41 | on | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:40:205:41 | on | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:40:205:41 | on | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:40:205:41 | on | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:29:207:31 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:29:207:31 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:29:207:31 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:29:207:31 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:29:207:31 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:29:207:31 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:29:207:31 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:29:207:31 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:52:207:54 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:52:207:54 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:52:207:54 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:52:207:54 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:52:207:54 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:52:207:54 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:52:207:54 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:52:207:54 | get | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:222:33:222:35 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:222:33:222:35 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:222:33:222:35 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:222:33:222:35 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:222:33:222:35 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:222:33:222:35 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:222:33:222:35 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:222:33:222:35 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:230:46:230:49 | then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:230:46:230:49 | then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:230:46:230:49 | then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:230:46:230:49 | then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:230:46:230:49 | then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:230:46:230:49 | then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:230:46:230:49 | then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:230:46:230:49 | then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:239:50:239:57 | and_then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:239:50:239:57 | and_then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:239:50:239:57 | and_then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:239:50:239:57 | and_then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:239:50:239:57 | and_then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:239:50:239:57 | and_then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:239:50:239:57 | and_then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:239:50:239:57 | and_then | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:252:75:252:77 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:252:75:252:77 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:252:75:252:77 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:252:75:252:77 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:252:75:252:77 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:252:75:252:77 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:252:75:252:77 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:252:75:252:77 | map | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:122:14:122:31 | my_actix_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:122:14:122:31 | my_actix_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:122:14:122:31 | my_actix_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:122:14:122:31 | my_actix_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:122:14:122:31 | my_actix_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:122:14:122:31 | my_actix_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:122:14:122:31 | my_actix_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:122:14:122:31 | my_actix_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:131:44:131:61 | my_actix_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:131:44:131:61 | my_actix_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:131:44:131:61 | my_actix_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:131:44:131:61 | my_actix_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:131:44:131:61 | my_actix_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:131:44:131:61 | my_actix_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:131:44:131:61 | my_actix_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:131:44:131:61 | my_actix_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:132:48:132:65 | my_actix_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:132:48:132:65 | my_actix_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:132:48:132:65 | my_actix_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:132:48:132:65 | my_actix_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:132:48:132:65 | my_actix_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:132:48:132:65 | my_actix_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:132:48:132:65 | my_actix_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:132:48:132:65 | my_actix_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:133:44:133:61 | my_actix_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:133:44:133:61 | my_actix_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:133:44:133:61 | my_actix_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:133:44:133:61 | my_actix_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:133:44:133:61 | my_actix_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:133:44:133:61 | my_actix_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:133:44:133:61 | my_actix_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:133:44:133:61 | my_actix_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:200:34:200:50 | my_axum_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:200:34:200:50 | my_axum_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:200:34:200:50 | my_axum_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:200:34:200:50 | my_axum_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:200:34:200:50 | my_axum_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:200:34:200:50 | my_axum_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:200:34:200:50 | my_axum_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:200:34:200:50 | my_axum_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:201:39:201:55 | my_axum_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:201:39:201:55 | my_axum_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:201:39:201:55 | my_axum_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:201:39:201:55 | my_axum_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:201:39:201:55 | my_axum_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:201:39:201:55 | my_axum_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:201:39:201:55 | my_axum_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:201:39:201:55 | my_axum_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:202:33:202:49 | my_axum_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:202:33:202:49 | my_axum_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:202:33:202:49 | my_axum_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:202:33:202:49 | my_axum_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:202:33:202:49 | my_axum_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:202:33:202:49 | my_axum_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:202:33:202:49 | my_axum_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:202:33:202:49 | my_axum_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:21:205:37 | my_axum_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:21:205:37 | my_axum_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:21:205:37 | my_axum_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:21:205:37 | my_axum_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:21:205:37 | my_axum_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:21:205:37 | my_axum_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:21:205:37 | my_axum_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:21:205:37 | my_axum_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:65:205:81 | my_axum_handler_5 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:65:205:81 | my_axum_handler_5 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:65:205:81 | my_axum_handler_5 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:65:205:81 | my_axum_handler_5 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:65:205:81 | my_axum_handler_5 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:65:205:81 | my_axum_handler_5 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:65:205:81 | my_axum_handler_5 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:205:65:205:81 | my_axum_handler_5 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:33:207:49 | my_axum_handler_6 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:33:207:49 | my_axum_handler_6 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:33:207:49 | my_axum_handler_6 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:33:207:49 | my_axum_handler_6 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:33:207:49 | my_axum_handler_6 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:33:207:49 | my_axum_handler_6 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:33:207:49 | my_axum_handler_6 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:33:207:49 | my_axum_handler_6 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:56:207:72 | my_axum_handler_7 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:56:207:72 | my_axum_handler_7 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:56:207:72 | my_axum_handler_7 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:56:207:72 | my_axum_handler_7 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:56:207:72 | my_axum_handler_7 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:56:207:72 | my_axum_handler_7 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:56:207:72 | my_axum_handler_7 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:207:56:207:72 | my_axum_handler_7 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:222:37:227:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:222:37:227:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:222:37:227:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:222:37:227:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:222:37:227:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:222:37:227:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:222:37:227:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:222:37:227:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:231:13:235:13 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:231:13:235:13 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:231:13:235:13 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:231:13:235:13 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:231:13:235:13 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:231:13:235:13 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:231:13:235:13 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:231:13:235:13 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:240:13:248:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:240:13:248:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:240:13:248:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:240:13:248:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:240:13:248:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:240:13:248:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:240:13:248:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:240:13:248:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:253:13:258:14 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:253:13:258:14 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:253:13:258:14 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:253:13:258:14 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:253:13:258:14 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:253:13:258:14 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:253:13:258:14 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:253:13:258:14 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | diff --git a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/test.rs b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/test.rs index c6c487fed28d..ab9f129dddbe 100644 --- a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/test.rs +++ b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/test.rs @@ -118,8 +118,8 @@ mod actix_test { "".to_string() } - #[get("/4/{a}")] // $ Alert[rust/summary/taint-sources] - async fn my_actix_handler_4(path: web::Path) -> String { + #[get("/4/{a}")] + async fn my_actix_handler_4(path: web::Path) -> String { // $ Alert[rust/summary/taint-sources] let a = path.into_inner(); sink(a); // $ hasTaintFlow=my_actix_handler_4 @@ -219,24 +219,24 @@ mod warp_test { async fn test_warp() { // A route with parameter and `map` let map_route = - warp::path::param().map(|a: String| // $ Alert[rust/summary/taint-sources] + warp::path::param().map(|a: String| { sink(a); // $ hasTaintFlow "".to_string() - }); + }); // $ Alert[rust/summary/taint-sources] // A route with parameter and `then` - let then_route = warp::path::param().then( // $ Alert[rust/summary/taint-sources] + let then_route = warp::path::param().then( async move |a: String| { sink(a); // $ hasTaintFlow "".to_string() - }, + }, // $ Alert[rust/summary/taint-sources] ); // A route with parameter and `and_then` - let and_then_route = warp::path::param().and_then( // $ Alert[rust/summary/taint-sources] + let and_then_route = warp::path::param().and_then( async move | id: u64 | { if id != 0 { @@ -245,17 +245,17 @@ mod warp_test { } else { Err(warp::reject::not_found()) } - }, + }, // $ Alert[rust/summary/taint-sources] ); // A route with path, parameter, and `and_then` - let path_and_map_route = warp::path("1").and(warp::path::param()).map( // $ Alert[rust/summary/taint-sources] + let path_and_map_route = warp::path("1").and(warp::path::param()).map( | a: String | { sink(a); // $ hasTaintFlow "".to_string() - }, + }, // $ Alert[rust/summary/taint-sources] ); let routes = warp::get().and( diff --git a/rust/ql/test/library-tests/frameworks/postgres/main.rs b/rust/ql/test/library-tests/frameworks/postgres/main.rs index 262e22855bf1..64844da4b238 100644 --- a/rust/ql/test/library-tests/frameworks/postgres/main.rs +++ b/rust/ql/test/library-tests/frameworks/postgres/main.rs @@ -7,12 +7,12 @@ fn main() -> Result<(), Box> { let mut conn = postgres::Client::connect("host=localhost user=postgres", postgres::NoTls)?; - conn.execute( // $ sql-sink + conn.execute( "CREATE TABLE person ( id SERIAL PRIMARY KEY, name VARCHAR NOT NULL, age INT NOT NULL - )", + )", // $ sql-sink &[], )?; diff --git a/rust/ql/test/library-tests/frameworks/rusqlite/main.rs b/rust/ql/test/library-tests/frameworks/rusqlite/main.rs index 441aa35f798b..58fb407e12e9 100644 --- a/rust/ql/test/library-tests/frameworks/rusqlite/main.rs +++ b/rust/ql/test/library-tests/frameworks/rusqlite/main.rs @@ -16,12 +16,12 @@ fn main() -> Result<(), Box> { let connection = Connection::open_in_memory()?; - connection.execute( // $ sql-sink + connection.execute( "CREATE TABLE person ( id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR NOT NULL, age INT NOT NULL - )", + )", // $ sql-sink (), )?; diff --git a/rust/ql/test/query-tests/security/CWE-020/RegexInjection.expected b/rust/ql/test/query-tests/security/CWE-020/RegexInjection.expected index 2814af2b5ede..952fbcef17ff 100644 --- a/rust/ql/test/query-tests/security/CWE-020/RegexInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-020/RegexInjection.expected @@ -1,8 +1,8 @@ #select -| main.rs:6:25:6:30 | ®ex | main.rs:4:20:4:32 | ...::var | main.rs:6:25:6:30 | ®ex | This regular expression is constructed from a $@. | main.rs:4:20:4:32 | ...::var | user-provided value | +| main.rs:6:25:6:30 | ®ex | main.rs:4:20:4:40 | ...::var(...) | main.rs:6:25:6:30 | ®ex | This regular expression is constructed from a $@. | main.rs:4:20:4:40 | ...::var(...) | user-provided value | edges | main.rs:4:9:4:16 | username | main.rs:5:25:5:44 | MacroExpr | provenance | | -| main.rs:4:20:4:32 | ...::var | main.rs:4:20:4:40 | ...::var(...) [Ok] | provenance | Src:MaD:1 | +| main.rs:4:20:4:40 | ...::var(...) | main.rs:4:20:4:40 | ...::var(...) [Ok] | provenance | Src:MaD:1 | | main.rs:4:20:4:40 | ...::var(...) [Ok] | main.rs:4:20:4:66 | ... .unwrap_or(...) | provenance | MaD:2 | | main.rs:4:20:4:66 | ... .unwrap_or(...) | main.rs:4:9:4:16 | username | provenance | | | main.rs:5:9:5:13 | regex | main.rs:6:26:6:30 | regex | provenance | | @@ -18,7 +18,7 @@ models | 4 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes | main.rs:4:9:4:16 | username | semmle.label | username | -| main.rs:4:20:4:32 | ...::var | semmle.label | ...::var | +| main.rs:4:20:4:40 | ...::var(...) | semmle.label | ...::var(...) | | main.rs:4:20:4:40 | ...::var(...) [Ok] | semmle.label | ...::var(...) [Ok] | | main.rs:4:20:4:66 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | | main.rs:5:9:5:13 | regex | semmle.label | regex | diff --git a/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected b/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected index 182648d9caf6..6c2b7f7f578e 100644 --- a/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected +++ b/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected @@ -1,58 +1,53 @@ #select -| src/main.rs:11:5:11:22 | ...::read_to_string | src/main.rs:7:11:7:19 | file_name | src/main.rs:11:5:11:22 | ...::read_to_string | This path depends on a $@. | src/main.rs:7:11:7:19 | file_name | user-provided value | -| src/main.rs:46:5:46:22 | ...::read_to_string | src/main.rs:38:11:38:19 | file_path | src/main.rs:46:5:46:22 | ...::read_to_string | This path depends on a $@. | src/main.rs:38:11:38:19 | file_path | user-provided value | -| src/main.rs:71:5:71:22 | ...::read_to_string | src/main.rs:63:11:63:19 | file_path | src/main.rs:71:5:71:22 | ...::read_to_string | This path depends on a $@. | src/main.rs:63:11:63:19 | file_path | user-provided value | -| src/main.rs:85:5:85:22 | ...::read_to_string | src/main.rs:76:11:76:19 | file_path | src/main.rs:85:5:85:22 | ...::read_to_string | This path depends on a $@. | src/main.rs:76:11:76:19 | file_path | user-provided value | -| src/main.rs:99:5:99:22 | ...::read_to_string | src/main.rs:90:11:90:19 | file_path | src/main.rs:99:5:99:22 | ...::read_to_string | This path depends on a $@. | src/main.rs:90:11:90:19 | file_path | user-provided value | -| src/main.rs:104:13:104:31 | ...::open | src/main.rs:103:17:103:30 | ...::args | src/main.rs:104:13:104:31 | ...::open | This path depends on a $@. | src/main.rs:103:17:103:30 | ...::args | user-provided value | -| src/main.rs:107:13:107:31 | ...::open | src/main.rs:103:17:103:30 | ...::args | src/main.rs:107:13:107:31 | ...::open | This path depends on a $@. | src/main.rs:103:17:103:30 | ...::args | user-provided value | -| src/main.rs:110:13:110:33 | ...::open | src/main.rs:103:17:103:30 | ...::args | src/main.rs:110:13:110:33 | ...::open | This path depends on a $@. | src/main.rs:103:17:103:30 | ...::args | user-provided value | -| src/main.rs:113:13:113:37 | ...::open | src/main.rs:103:17:103:30 | ...::args | src/main.rs:113:13:113:37 | ...::open | This path depends on a $@. | src/main.rs:103:17:103:30 | ...::args | user-provided value | -| src/main.rs:116:13:116:31 | ...::open | src/main.rs:103:17:103:30 | ...::args | src/main.rs:116:13:116:31 | ...::open | This path depends on a $@. | src/main.rs:103:17:103:30 | ...::args | user-provided value | -| src/main.rs:119:13:119:31 | ...::open | src/main.rs:103:17:103:30 | ...::args | src/main.rs:119:13:119:31 | ...::open | This path depends on a $@. | src/main.rs:103:17:103:30 | ...::args | user-provided value | -| src/main.rs:122:13:122:25 | ...::copy | src/main.rs:103:17:103:30 | ...::args | src/main.rs:122:13:122:25 | ...::copy | This path depends on a $@. | src/main.rs:103:17:103:30 | ...::args | user-provided value | -| src/main.rs:123:13:123:25 | ...::copy | src/main.rs:103:17:103:30 | ...::args | src/main.rs:123:13:123:25 | ...::copy | This path depends on a $@. | src/main.rs:103:17:103:30 | ...::args | user-provided value | -| src/main.rs:173:13:173:18 | exists | src/main.rs:185:17:185:30 | ...::args | src/main.rs:173:13:173:18 | exists | This path depends on a $@. | src/main.rs:185:17:185:30 | ...::args | user-provided value | -| src/main.rs:174:25:174:34 | ...::open | src/main.rs:185:17:185:30 | ...::args | src/main.rs:174:25:174:34 | ...::open | This path depends on a $@. | src/main.rs:185:17:185:30 | ...::args | user-provided value | -| src/main.rs:177:25:177:34 | ...::open | src/main.rs:185:17:185:30 | ...::args | src/main.rs:177:25:177:34 | ...::open | This path depends on a $@. | src/main.rs:185:17:185:30 | ...::args | user-provided value | +| src/main.rs:11:24:11:32 | file_path | src/main.rs:7:11:7:19 | file_name | src/main.rs:11:24:11:32 | file_path | This path depends on a $@. | src/main.rs:7:11:7:19 | file_name | user-provided value | +| src/main.rs:46:24:46:32 | file_path | src/main.rs:38:11:38:19 | file_path | src/main.rs:46:24:46:32 | file_path | This path depends on a $@. | src/main.rs:38:11:38:19 | file_path | user-provided value | +| src/main.rs:71:24:71:32 | file_path | src/main.rs:63:11:63:19 | file_path | src/main.rs:71:24:71:32 | file_path | This path depends on a $@. | src/main.rs:63:11:63:19 | file_path | user-provided value | +| src/main.rs:85:24:85:32 | file_path | src/main.rs:76:11:76:19 | file_path | src/main.rs:85:24:85:32 | file_path | This path depends on a $@. | src/main.rs:76:11:76:19 | file_path | user-provided value | +| src/main.rs:99:24:99:32 | file_path | src/main.rs:90:11:90:19 | file_path | src/main.rs:99:24:99:32 | file_path | This path depends on a $@. | src/main.rs:90:11:90:19 | file_path | user-provided value | +| src/main.rs:104:33:104:45 | path1.clone() | src/main.rs:103:17:103:32 | ...::args(...) | src/main.rs:104:33:104:45 | path1.clone() | This path depends on a $@. | src/main.rs:103:17:103:32 | ...::args(...) | user-provided value | +| src/main.rs:107:33:107:37 | path2 | src/main.rs:103:17:103:32 | ...::args(...) | src/main.rs:107:33:107:37 | path2 | This path depends on a $@. | src/main.rs:103:17:103:32 | ...::args(...) | user-provided value | +| src/main.rs:110:35:110:39 | path3 | src/main.rs:103:17:103:32 | ...::args(...) | src/main.rs:110:35:110:39 | path3 | This path depends on a $@. | src/main.rs:103:17:103:32 | ...::args(...) | user-provided value | +| src/main.rs:113:39:113:43 | path4 | src/main.rs:103:17:103:32 | ...::args(...) | src/main.rs:113:39:113:43 | path4 | This path depends on a $@. | src/main.rs:103:17:103:32 | ...::args(...) | user-provided value | +| src/main.rs:116:33:116:37 | path5 | src/main.rs:103:17:103:32 | ...::args(...) | src/main.rs:116:33:116:37 | path5 | This path depends on a $@. | src/main.rs:103:17:103:32 | ...::args(...) | user-provided value | +| src/main.rs:119:33:119:37 | path6 | src/main.rs:103:17:103:32 | ...::args(...) | src/main.rs:119:33:119:37 | path6 | This path depends on a $@. | src/main.rs:103:17:103:32 | ...::args(...) | user-provided value | +| src/main.rs:122:27:122:39 | path1.clone() | src/main.rs:103:17:103:32 | ...::args(...) | src/main.rs:122:27:122:39 | path1.clone() | This path depends on a $@. | src/main.rs:103:17:103:32 | ...::args(...) | user-provided value | +| src/main.rs:123:37:123:49 | path1.clone() | src/main.rs:103:17:103:32 | ...::args(...) | src/main.rs:123:37:123:49 | path1.clone() | This path depends on a $@. | src/main.rs:103:17:103:32 | ...::args(...) | user-provided value | +| src/main.rs:173:8:173:11 | path | src/main.rs:185:17:185:32 | ...::args(...) | src/main.rs:173:8:173:11 | path | This path depends on a $@. | src/main.rs:185:17:185:32 | ...::args(...) | user-provided value | +| src/main.rs:174:36:174:43 | path_str | src/main.rs:185:17:185:32 | ...::args(...) | src/main.rs:174:36:174:43 | path_str | This path depends on a $@. | src/main.rs:185:17:185:32 | ...::args(...) | user-provided value | +| src/main.rs:177:36:177:39 | path | src/main.rs:185:17:185:32 | ...::args(...) | src/main.rs:177:36:177:39 | path | This path depends on a $@. | src/main.rs:185:17:185:32 | ...::args(...) | user-provided value | edges | src/main.rs:7:11:7:19 | file_name | src/main.rs:9:35:9:43 | file_name | provenance | | -| src/main.rs:9:9:9:17 | file_path | src/main.rs:11:24:11:32 | file_path | provenance | | +| src/main.rs:9:9:9:17 | file_path | src/main.rs:11:24:11:32 | file_path | provenance | Sink:MaD:6 | | src/main.rs:9:21:9:44 | ...::from(...) | src/main.rs:9:9:9:17 | file_path | provenance | | | src/main.rs:9:35:9:43 | file_name | src/main.rs:9:21:9:44 | ...::from(...) | provenance | MaD:14 | -| src/main.rs:11:24:11:32 | file_path | src/main.rs:11:5:11:22 | ...::read_to_string | provenance | MaD:6 Sink:MaD:6 | | src/main.rs:38:11:38:19 | file_path | src/main.rs:41:52:41:60 | file_path | provenance | | -| src/main.rs:41:9:41:17 | file_path | src/main.rs:46:24:46:32 | file_path | provenance | | +| src/main.rs:41:9:41:17 | file_path | src/main.rs:46:24:46:32 | file_path | provenance | Sink:MaD:6 | | src/main.rs:41:21:41:62 | public_path.join(...) | src/main.rs:41:9:41:17 | file_path | provenance | | | src/main.rs:41:38:41:61 | ...::from(...) | src/main.rs:41:21:41:62 | public_path.join(...) | provenance | MaD:12 | | src/main.rs:41:52:41:60 | file_path | src/main.rs:41:38:41:61 | ...::from(...) | provenance | MaD:14 | -| src/main.rs:46:24:46:32 | file_path | src/main.rs:46:5:46:22 | ...::read_to_string | provenance | MaD:6 Sink:MaD:6 | | src/main.rs:63:11:63:19 | file_path | src/main.rs:66:32:66:40 | file_path | provenance | | -| src/main.rs:66:9:66:17 | file_path [&ref] | src/main.rs:71:24:71:32 | file_path [&ref] | provenance | | +| src/main.rs:66:9:66:17 | file_path [&ref] | src/main.rs:71:24:71:32 | file_path | provenance | Sink:MaD:6 | | src/main.rs:66:21:66:41 | ...::new(...) [&ref] | src/main.rs:66:9:66:17 | file_path [&ref] | provenance | | | src/main.rs:66:31:66:40 | &file_path [&ref] | src/main.rs:66:21:66:41 | ...::new(...) [&ref] | provenance | MaD:13 | | src/main.rs:66:32:66:40 | file_path | src/main.rs:66:31:66:40 | &file_path [&ref] | provenance | | -| src/main.rs:71:24:71:32 | file_path [&ref] | src/main.rs:71:5:71:22 | ...::read_to_string | provenance | MaD:6 Sink:MaD:6 | | src/main.rs:76:11:76:19 | file_path | src/main.rs:79:52:79:60 | file_path | provenance | | | src/main.rs:79:9:79:17 | file_path | src/main.rs:80:21:80:29 | file_path | provenance | | | src/main.rs:79:21:79:62 | public_path.join(...) | src/main.rs:79:9:79:17 | file_path | provenance | | | src/main.rs:79:38:79:61 | ...::from(...) | src/main.rs:79:21:79:62 | public_path.join(...) | provenance | MaD:12 | | src/main.rs:79:52:79:60 | file_path | src/main.rs:79:38:79:61 | ...::from(...) | provenance | MaD:14 | -| src/main.rs:80:9:80:17 | file_path | src/main.rs:85:24:85:32 | file_path | provenance | | +| src/main.rs:80:9:80:17 | file_path | src/main.rs:85:24:85:32 | file_path | provenance | Sink:MaD:6 | | src/main.rs:80:21:80:29 | file_path | src/main.rs:80:21:80:44 | file_path.canonicalize() [Ok] | provenance | MaD:15 | | src/main.rs:80:21:80:44 | file_path.canonicalize() [Ok] | src/main.rs:80:21:80:53 | ... .unwrap() | provenance | MaD:11 | | src/main.rs:80:21:80:53 | ... .unwrap() | src/main.rs:80:9:80:17 | file_path | provenance | | -| src/main.rs:85:24:85:32 | file_path | src/main.rs:85:5:85:22 | ...::read_to_string | provenance | MaD:6 Sink:MaD:6 | | src/main.rs:90:11:90:19 | file_path | src/main.rs:93:32:93:40 | file_path | provenance | | | src/main.rs:93:9:93:17 | file_path [&ref] | src/main.rs:98:21:98:29 | file_path [&ref] | provenance | | | src/main.rs:93:21:93:41 | ...::new(...) [&ref] | src/main.rs:93:9:93:17 | file_path [&ref] | provenance | | | src/main.rs:93:31:93:40 | &file_path [&ref] | src/main.rs:93:21:93:41 | ...::new(...) [&ref] | provenance | MaD:13 | | src/main.rs:93:32:93:40 | file_path | src/main.rs:93:31:93:40 | &file_path [&ref] | provenance | | -| src/main.rs:98:9:98:17 | file_path | src/main.rs:99:24:99:32 | file_path | provenance | | +| src/main.rs:98:9:98:17 | file_path | src/main.rs:99:24:99:32 | file_path | provenance | Sink:MaD:6 | | src/main.rs:98:21:98:29 | file_path [&ref] | src/main.rs:98:21:98:44 | file_path.canonicalize() [Ok] | provenance | Config | | src/main.rs:98:21:98:44 | file_path.canonicalize() [Ok] | src/main.rs:98:21:98:53 | ... .unwrap() | provenance | MaD:11 | | src/main.rs:98:21:98:53 | ... .unwrap() | src/main.rs:98:9:98:17 | file_path | provenance | | -| src/main.rs:99:24:99:32 | file_path | src/main.rs:99:5:99:22 | ...::read_to_string | provenance | MaD:6 Sink:MaD:6 | | src/main.rs:103:9:103:13 | path1 | src/main.rs:104:33:104:37 | path1 | provenance | | | src/main.rs:103:9:103:13 | path1 | src/main.rs:106:39:106:43 | path1 | provenance | | | src/main.rs:103:9:103:13 | path1 | src/main.rs:109:41:109:45 | path1 | provenance | | @@ -60,58 +55,50 @@ edges | src/main.rs:103:9:103:13 | path1 | src/main.rs:115:39:115:43 | path1 | provenance | | | src/main.rs:103:9:103:13 | path1 | src/main.rs:122:27:122:31 | path1 | provenance | | | src/main.rs:103:9:103:13 | path1 | src/main.rs:123:37:123:41 | path1 | provenance | | -| src/main.rs:103:17:103:30 | ...::args | src/main.rs:103:17:103:32 | ...::args(...) [element] | provenance | Src:MaD:7 | +| src/main.rs:103:17:103:32 | ...::args(...) | src/main.rs:103:17:103:32 | ...::args(...) [element] | provenance | Src:MaD:7 | | src/main.rs:103:17:103:32 | ...::args(...) [element] | src/main.rs:103:17:103:39 | ... .nth(...) [Some] | provenance | MaD:9 | | src/main.rs:103:17:103:39 | ... .nth(...) [Some] | src/main.rs:103:17:103:48 | ... .unwrap() | provenance | MaD:10 | | src/main.rs:103:17:103:48 | ... .unwrap() | src/main.rs:103:9:103:13 | path1 | provenance | | | src/main.rs:104:33:104:37 | path1 | src/main.rs:104:33:104:45 | path1.clone() | provenance | MaD:8 | -| src/main.rs:104:33:104:45 | path1.clone() | src/main.rs:104:13:104:31 | ...::open | provenance | MaD:2 Sink:MaD:2 | -| src/main.rs:106:9:106:13 | path2 | src/main.rs:107:33:107:37 | path2 | provenance | | +| src/main.rs:104:33:104:45 | path1.clone() | src/main.rs:104:33:104:45 | path1.clone() | provenance | Sink:MaD:2 | +| src/main.rs:106:9:106:13 | path2 | src/main.rs:107:33:107:37 | path2 | provenance | Sink:MaD:2 | | src/main.rs:106:17:106:52 | ...::canonicalize(...) [Ok] | src/main.rs:106:17:106:61 | ... .unwrap() | provenance | MaD:11 | | src/main.rs:106:17:106:61 | ... .unwrap() | src/main.rs:106:9:106:13 | path2 | provenance | | | src/main.rs:106:39:106:43 | path1 | src/main.rs:106:39:106:51 | path1.clone() | provenance | MaD:8 | | src/main.rs:106:39:106:51 | path1.clone() | src/main.rs:106:17:106:52 | ...::canonicalize(...) [Ok] | provenance | Config | -| src/main.rs:107:33:107:37 | path2 | src/main.rs:107:13:107:31 | ...::open | provenance | MaD:2 Sink:MaD:2 | -| src/main.rs:109:9:109:13 | path3 | src/main.rs:110:35:110:39 | path3 | provenance | | +| src/main.rs:109:9:109:13 | path3 | src/main.rs:110:35:110:39 | path3 | provenance | Sink:MaD:4 | | src/main.rs:109:17:109:54 | ...::canonicalize(...) [future, Ok] | src/main.rs:109:17:109:60 | await ... [Ok] | provenance | | | src/main.rs:109:17:109:60 | await ... [Ok] | src/main.rs:109:17:109:69 | ... .unwrap() | provenance | MaD:11 | | src/main.rs:109:17:109:69 | ... .unwrap() | src/main.rs:109:9:109:13 | path3 | provenance | | | src/main.rs:109:41:109:45 | path1 | src/main.rs:109:41:109:53 | path1.clone() | provenance | MaD:8 | | src/main.rs:109:41:109:53 | path1.clone() | src/main.rs:109:17:109:54 | ...::canonicalize(...) [future, Ok] | provenance | Config | -| src/main.rs:110:35:110:39 | path3 | src/main.rs:110:13:110:33 | ...::open | provenance | MaD:4 Sink:MaD:4 | -| src/main.rs:112:9:112:13 | path4 | src/main.rs:113:39:113:43 | path4 | provenance | | +| src/main.rs:112:9:112:13 | path4 | src/main.rs:113:39:113:43 | path4 | provenance | Sink:MaD:1 | | src/main.rs:112:17:112:58 | ...::canonicalize(...) [future, Ok] | src/main.rs:112:17:112:64 | await ... [Ok] | provenance | | | src/main.rs:112:17:112:64 | await ... [Ok] | src/main.rs:112:17:112:73 | ... .unwrap() | provenance | MaD:11 | | src/main.rs:112:17:112:73 | ... .unwrap() | src/main.rs:112:9:112:13 | path4 | provenance | | | src/main.rs:112:45:112:49 | path1 | src/main.rs:112:45:112:57 | path1.clone() | provenance | MaD:8 | | src/main.rs:112:45:112:57 | path1.clone() | src/main.rs:112:17:112:58 | ...::canonicalize(...) [future, Ok] | provenance | Config | -| src/main.rs:113:39:113:43 | path4 | src/main.rs:113:13:113:37 | ...::open | provenance | MaD:1 Sink:MaD:1 | -| src/main.rs:115:9:115:13 | path5 [&ref] | src/main.rs:116:33:116:37 | path5 [&ref] | provenance | | +| src/main.rs:115:9:115:13 | path5 [&ref] | src/main.rs:116:33:116:37 | path5 | provenance | Sink:MaD:2 | +| src/main.rs:115:9:115:13 | path5 [&ref] | src/main.rs:118:17:118:21 | path5 [&ref] | provenance | | | src/main.rs:115:17:115:44 | ...::new(...) [&ref] | src/main.rs:115:9:115:13 | path5 [&ref] | provenance | | | src/main.rs:115:38:115:43 | &path1 [&ref] | src/main.rs:115:17:115:44 | ...::new(...) [&ref] | provenance | MaD:13 | | src/main.rs:115:39:115:43 | path1 | src/main.rs:115:38:115:43 | &path1 [&ref] | provenance | | -| src/main.rs:116:33:116:37 | path5 [&ref] | src/main.rs:116:13:116:31 | ...::open | provenance | MaD:2 Sink:MaD:2 | -| src/main.rs:116:33:116:37 | path5 [&ref] | src/main.rs:118:17:118:21 | path5 [&ref] | provenance | | -| src/main.rs:118:9:118:13 | path6 | src/main.rs:119:33:119:37 | path6 | provenance | | +| src/main.rs:118:9:118:13 | path6 | src/main.rs:119:33:119:37 | path6 | provenance | Sink:MaD:2 | | src/main.rs:118:17:118:21 | path5 [&ref] | src/main.rs:118:17:118:36 | path5.canonicalize() [Ok] | provenance | Config | | src/main.rs:118:17:118:36 | path5.canonicalize() [Ok] | src/main.rs:118:17:118:45 | ... .unwrap() | provenance | MaD:11 | | src/main.rs:118:17:118:45 | ... .unwrap() | src/main.rs:118:9:118:13 | path6 | provenance | | -| src/main.rs:119:33:119:37 | path6 | src/main.rs:119:13:119:31 | ...::open | provenance | MaD:2 Sink:MaD:2 | | src/main.rs:122:27:122:31 | path1 | src/main.rs:122:27:122:39 | path1.clone() | provenance | MaD:8 | -| src/main.rs:122:27:122:39 | path1.clone() | src/main.rs:122:13:122:25 | ...::copy | provenance | MaD:5 Sink:MaD:5 | +| src/main.rs:122:27:122:39 | path1.clone() | src/main.rs:122:27:122:39 | path1.clone() | provenance | Sink:MaD:5 | | src/main.rs:123:37:123:41 | path1 | src/main.rs:123:37:123:49 | path1.clone() | provenance | MaD:8 | -| src/main.rs:123:37:123:49 | path1.clone() | src/main.rs:123:13:123:25 | ...::copy | provenance | MaD:5 Sink:MaD:5 | +| src/main.rs:123:37:123:49 | path1.clone() | src/main.rs:123:37:123:49 | path1.clone() | provenance | Sink:MaD:5 | | src/main.rs:170:16:170:29 | ...: ... [&ref] | src/main.rs:172:26:172:33 | path_str [&ref] | provenance | | -| src/main.rs:170:16:170:29 | ...: ... [&ref] | src/main.rs:174:36:174:43 | path_str [&ref] | provenance | | -| src/main.rs:172:9:172:12 | path [&ref] | src/main.rs:173:8:173:11 | path [&ref] | provenance | | +| src/main.rs:170:16:170:29 | ...: ... [&ref] | src/main.rs:174:36:174:43 | path_str | provenance | Sink:MaD:2 | +| src/main.rs:172:9:172:12 | path [&ref] | src/main.rs:173:8:173:11 | path | provenance | Sink:MaD:3 | +| src/main.rs:172:9:172:12 | path [&ref] | src/main.rs:177:36:177:39 | path | provenance | Sink:MaD:2 | | src/main.rs:172:16:172:34 | ...::new(...) [&ref] | src/main.rs:172:9:172:12 | path [&ref] | provenance | | | src/main.rs:172:26:172:33 | path_str [&ref] | src/main.rs:172:16:172:34 | ...::new(...) [&ref] | provenance | MaD:13 | -| src/main.rs:173:8:173:11 | path [&ref] | src/main.rs:173:13:173:18 | exists | provenance | MaD:3 Sink:MaD:3 | -| src/main.rs:173:8:173:11 | path [&ref] | src/main.rs:177:36:177:39 | path [&ref] | provenance | | -| src/main.rs:174:36:174:43 | path_str [&ref] | src/main.rs:174:25:174:34 | ...::open | provenance | MaD:2 Sink:MaD:2 | -| src/main.rs:177:36:177:39 | path [&ref] | src/main.rs:177:25:177:34 | ...::open | provenance | MaD:2 Sink:MaD:2 | | src/main.rs:185:9:185:13 | path1 | src/main.rs:186:18:186:22 | path1 | provenance | | -| src/main.rs:185:17:185:30 | ...::args | src/main.rs:185:17:185:32 | ...::args(...) [element] | provenance | Src:MaD:7 | +| src/main.rs:185:17:185:32 | ...::args(...) | src/main.rs:185:17:185:32 | ...::args(...) [element] | provenance | Src:MaD:7 | | src/main.rs:185:17:185:32 | ...::args(...) [element] | src/main.rs:185:17:185:39 | ... .nth(...) [Some] | provenance | MaD:9 | | src/main.rs:185:17:185:39 | ... .nth(...) [Some] | src/main.rs:185:17:185:48 | ... .unwrap() | provenance | MaD:10 | | src/main.rs:185:17:185:48 | ... .unwrap() | src/main.rs:185:9:185:13 | path1 | provenance | | @@ -138,22 +125,19 @@ nodes | src/main.rs:9:9:9:17 | file_path | semmle.label | file_path | | src/main.rs:9:21:9:44 | ...::from(...) | semmle.label | ...::from(...) | | src/main.rs:9:35:9:43 | file_name | semmle.label | file_name | -| src/main.rs:11:5:11:22 | ...::read_to_string | semmle.label | ...::read_to_string | | src/main.rs:11:24:11:32 | file_path | semmle.label | file_path | | src/main.rs:38:11:38:19 | file_path | semmle.label | file_path | | src/main.rs:41:9:41:17 | file_path | semmle.label | file_path | | src/main.rs:41:21:41:62 | public_path.join(...) | semmle.label | public_path.join(...) | | src/main.rs:41:38:41:61 | ...::from(...) | semmle.label | ...::from(...) | | src/main.rs:41:52:41:60 | file_path | semmle.label | file_path | -| src/main.rs:46:5:46:22 | ...::read_to_string | semmle.label | ...::read_to_string | | src/main.rs:46:24:46:32 | file_path | semmle.label | file_path | | src/main.rs:63:11:63:19 | file_path | semmle.label | file_path | | src/main.rs:66:9:66:17 | file_path [&ref] | semmle.label | file_path [&ref] | | src/main.rs:66:21:66:41 | ...::new(...) [&ref] | semmle.label | ...::new(...) [&ref] | | src/main.rs:66:31:66:40 | &file_path [&ref] | semmle.label | &file_path [&ref] | | src/main.rs:66:32:66:40 | file_path | semmle.label | file_path | -| src/main.rs:71:5:71:22 | ...::read_to_string | semmle.label | ...::read_to_string | -| src/main.rs:71:24:71:32 | file_path [&ref] | semmle.label | file_path [&ref] | +| src/main.rs:71:24:71:32 | file_path | semmle.label | file_path | | src/main.rs:76:11:76:19 | file_path | semmle.label | file_path | | src/main.rs:79:9:79:17 | file_path | semmle.label | file_path | | src/main.rs:79:21:79:62 | public_path.join(...) | semmle.label | public_path.join(...) | @@ -163,7 +147,6 @@ nodes | src/main.rs:80:21:80:29 | file_path | semmle.label | file_path | | src/main.rs:80:21:80:44 | file_path.canonicalize() [Ok] | semmle.label | file_path.canonicalize() [Ok] | | src/main.rs:80:21:80:53 | ... .unwrap() | semmle.label | ... .unwrap() | -| src/main.rs:85:5:85:22 | ...::read_to_string | semmle.label | ...::read_to_string | | src/main.rs:85:24:85:32 | file_path | semmle.label | file_path | | src/main.rs:90:11:90:19 | file_path | semmle.label | file_path | | src/main.rs:93:9:93:17 | file_path [&ref] | semmle.label | file_path [&ref] | @@ -174,22 +157,20 @@ nodes | src/main.rs:98:21:98:29 | file_path [&ref] | semmle.label | file_path [&ref] | | src/main.rs:98:21:98:44 | file_path.canonicalize() [Ok] | semmle.label | file_path.canonicalize() [Ok] | | src/main.rs:98:21:98:53 | ... .unwrap() | semmle.label | ... .unwrap() | -| src/main.rs:99:5:99:22 | ...::read_to_string | semmle.label | ...::read_to_string | | src/main.rs:99:24:99:32 | file_path | semmle.label | file_path | | src/main.rs:103:9:103:13 | path1 | semmle.label | path1 | -| src/main.rs:103:17:103:30 | ...::args | semmle.label | ...::args | +| src/main.rs:103:17:103:32 | ...::args(...) | semmle.label | ...::args(...) | | src/main.rs:103:17:103:32 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | | src/main.rs:103:17:103:39 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | | src/main.rs:103:17:103:48 | ... .unwrap() | semmle.label | ... .unwrap() | -| src/main.rs:104:13:104:31 | ...::open | semmle.label | ...::open | | src/main.rs:104:33:104:37 | path1 | semmle.label | path1 | | src/main.rs:104:33:104:45 | path1.clone() | semmle.label | path1.clone() | +| src/main.rs:104:33:104:45 | path1.clone() | semmle.label | path1.clone() | | src/main.rs:106:9:106:13 | path2 | semmle.label | path2 | | src/main.rs:106:17:106:52 | ...::canonicalize(...) [Ok] | semmle.label | ...::canonicalize(...) [Ok] | | src/main.rs:106:17:106:61 | ... .unwrap() | semmle.label | ... .unwrap() | | src/main.rs:106:39:106:43 | path1 | semmle.label | path1 | | src/main.rs:106:39:106:51 | path1.clone() | semmle.label | path1.clone() | -| src/main.rs:107:13:107:31 | ...::open | semmle.label | ...::open | | src/main.rs:107:33:107:37 | path2 | semmle.label | path2 | | src/main.rs:109:9:109:13 | path3 | semmle.label | path3 | | src/main.rs:109:17:109:54 | ...::canonicalize(...) [future, Ok] | semmle.label | ...::canonicalize(...) [future, Ok] | @@ -197,7 +178,6 @@ nodes | src/main.rs:109:17:109:69 | ... .unwrap() | semmle.label | ... .unwrap() | | src/main.rs:109:41:109:45 | path1 | semmle.label | path1 | | src/main.rs:109:41:109:53 | path1.clone() | semmle.label | path1.clone() | -| src/main.rs:110:13:110:33 | ...::open | semmle.label | ...::open | | src/main.rs:110:35:110:39 | path3 | semmle.label | path3 | | src/main.rs:112:9:112:13 | path4 | semmle.label | path4 | | src/main.rs:112:17:112:58 | ...::canonicalize(...) [future, Ok] | semmle.label | ...::canonicalize(...) [future, Ok] | @@ -205,38 +185,32 @@ nodes | src/main.rs:112:17:112:73 | ... .unwrap() | semmle.label | ... .unwrap() | | src/main.rs:112:45:112:49 | path1 | semmle.label | path1 | | src/main.rs:112:45:112:57 | path1.clone() | semmle.label | path1.clone() | -| src/main.rs:113:13:113:37 | ...::open | semmle.label | ...::open | | src/main.rs:113:39:113:43 | path4 | semmle.label | path4 | | src/main.rs:115:9:115:13 | path5 [&ref] | semmle.label | path5 [&ref] | | src/main.rs:115:17:115:44 | ...::new(...) [&ref] | semmle.label | ...::new(...) [&ref] | | src/main.rs:115:38:115:43 | &path1 [&ref] | semmle.label | &path1 [&ref] | | src/main.rs:115:39:115:43 | path1 | semmle.label | path1 | -| src/main.rs:116:13:116:31 | ...::open | semmle.label | ...::open | -| src/main.rs:116:33:116:37 | path5 [&ref] | semmle.label | path5 [&ref] | +| src/main.rs:116:33:116:37 | path5 | semmle.label | path5 | | src/main.rs:118:9:118:13 | path6 | semmle.label | path6 | | src/main.rs:118:17:118:21 | path5 [&ref] | semmle.label | path5 [&ref] | | src/main.rs:118:17:118:36 | path5.canonicalize() [Ok] | semmle.label | path5.canonicalize() [Ok] | | src/main.rs:118:17:118:45 | ... .unwrap() | semmle.label | ... .unwrap() | -| src/main.rs:119:13:119:31 | ...::open | semmle.label | ...::open | | src/main.rs:119:33:119:37 | path6 | semmle.label | path6 | -| src/main.rs:122:13:122:25 | ...::copy | semmle.label | ...::copy | | src/main.rs:122:27:122:31 | path1 | semmle.label | path1 | | src/main.rs:122:27:122:39 | path1.clone() | semmle.label | path1.clone() | -| src/main.rs:123:13:123:25 | ...::copy | semmle.label | ...::copy | +| src/main.rs:122:27:122:39 | path1.clone() | semmle.label | path1.clone() | | src/main.rs:123:37:123:41 | path1 | semmle.label | path1 | | src/main.rs:123:37:123:49 | path1.clone() | semmle.label | path1.clone() | +| src/main.rs:123:37:123:49 | path1.clone() | semmle.label | path1.clone() | | src/main.rs:170:16:170:29 | ...: ... [&ref] | semmle.label | ...: ... [&ref] | | src/main.rs:172:9:172:12 | path [&ref] | semmle.label | path [&ref] | | src/main.rs:172:16:172:34 | ...::new(...) [&ref] | semmle.label | ...::new(...) [&ref] | | src/main.rs:172:26:172:33 | path_str [&ref] | semmle.label | path_str [&ref] | -| src/main.rs:173:8:173:11 | path [&ref] | semmle.label | path [&ref] | -| src/main.rs:173:13:173:18 | exists | semmle.label | exists | -| src/main.rs:174:25:174:34 | ...::open | semmle.label | ...::open | -| src/main.rs:174:36:174:43 | path_str [&ref] | semmle.label | path_str [&ref] | -| src/main.rs:177:25:177:34 | ...::open | semmle.label | ...::open | -| src/main.rs:177:36:177:39 | path [&ref] | semmle.label | path [&ref] | +| src/main.rs:173:8:173:11 | path | semmle.label | path | +| src/main.rs:174:36:174:43 | path_str | semmle.label | path_str | +| src/main.rs:177:36:177:39 | path | semmle.label | path | | src/main.rs:185:9:185:13 | path1 | semmle.label | path1 | -| src/main.rs:185:17:185:30 | ...::args | semmle.label | ...::args | +| src/main.rs:185:17:185:32 | ...::args(...) | semmle.label | ...::args(...) | | src/main.rs:185:17:185:32 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | | src/main.rs:185:17:185:39 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | | src/main.rs:185:17:185:48 | ... .unwrap() | semmle.label | ... .unwrap() | diff --git a/rust/ql/test/query-tests/security/CWE-079/actix/XSS.expected b/rust/ql/test/query-tests/security/CWE-079/actix/XSS.expected index c388b6d58f09..2e738540c6ee 100644 --- a/rust/ql/test/query-tests/security/CWE-079/actix/XSS.expected +++ b/rust/ql/test/query-tests/security/CWE-079/actix/XSS.expected @@ -1,17 +1,15 @@ #select -| main.rs:25:5:25:13 | ...::new | main.rs:8:3:8:17 | to | main.rs:25:5:25:13 | ...::new | Cross-site scripting vulnerability due to a $@. | main.rs:8:3:8:17 | to | user-provided value | +| main.rs:25:15:25:18 | html | main.rs:9:10:9:27 | vulnerable_handler | main.rs:25:15:25:18 | html | Cross-site scripting vulnerability due to a $@. | main.rs:9:10:9:27 | vulnerable_handler | user-provided value | edges -| main.rs:8:3:8:17 | to | main.rs:9:29:9:51 | ...: ...::Path::<...> | provenance | Src:MaD:2 | -| main.rs:9:29:9:51 | ...: ...::Path::<...> | main.rs:10:22:10:25 | path | provenance | | +| main.rs:9:10:9:27 | vulnerable_handler | main.rs:10:22:10:25 | path | provenance | Src:MaD:2 | | main.rs:10:9:10:18 | user_input | main.rs:13:9:22:18 | MacroExpr | provenance | | | main.rs:10:22:10:25 | path | main.rs:10:22:10:38 | path.into_inner() | provenance | MaD:3 | | main.rs:10:22:10:38 | path.into_inner() | main.rs:10:9:10:18 | user_input | provenance | | -| main.rs:12:9:12:12 | html | main.rs:25:15:25:18 | html | provenance | | +| main.rs:12:9:12:12 | html | main.rs:25:15:25:18 | html | provenance | Sink:MaD:1 | | main.rs:13:9:22:18 | ...::format(...) | main.rs:13:9:22:18 | { ... } | provenance | | | main.rs:13:9:22:18 | ...::must_use(...) | main.rs:12:9:12:12 | html | provenance | | | main.rs:13:9:22:18 | MacroExpr | main.rs:13:9:22:18 | ...::format(...) | provenance | MaD:4 | | main.rs:13:9:22:18 | { ... } | main.rs:13:9:22:18 | ...::must_use(...) | provenance | MaD:5 | -| main.rs:25:15:25:18 | html | main.rs:25:5:25:13 | ...::new | provenance | MaD:1 Sink:MaD:1 | models | 1 | Sink: ::new; Argument[0]; html-injection | | 2 | Source: ::to; Argument[0].Parameter[0..7]; remote | @@ -19,8 +17,7 @@ models | 4 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | | 5 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes -| main.rs:8:3:8:17 | to | semmle.label | to | -| main.rs:9:29:9:51 | ...: ...::Path::<...> | semmle.label | ...: ...::Path::<...> | +| main.rs:9:10:9:27 | vulnerable_handler | semmle.label | vulnerable_handler | | main.rs:10:9:10:18 | user_input | semmle.label | user_input | | main.rs:10:22:10:25 | path | semmle.label | path | | main.rs:10:22:10:38 | path.into_inner() | semmle.label | path.into_inner() | @@ -29,6 +26,5 @@ nodes | main.rs:13:9:22:18 | ...::must_use(...) | semmle.label | ...::must_use(...) | | main.rs:13:9:22:18 | MacroExpr | semmle.label | MacroExpr | | main.rs:13:9:22:18 | { ... } | semmle.label | { ... } | -| main.rs:25:5:25:13 | ...::new | semmle.label | ...::new | | main.rs:25:15:25:18 | html | semmle.label | html | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-079/actix/main.rs b/rust/ql/test/query-tests/security/CWE-079/actix/main.rs index 42cd760ca6cb..9a0cb5def4e2 100644 --- a/rust/ql/test/query-tests/security/CWE-079/actix/main.rs +++ b/rust/ql/test/query-tests/security/CWE-079/actix/main.rs @@ -5,8 +5,8 @@ use actix_web::{ }; // The "bad" example from the qldoc -#[get("/bad/{a}")] // $ Source=a -async fn vulnerable_handler(path: web::Path) -> impl Responder { +#[get("/bad/{a}")] +async fn vulnerable_handler(path: web::Path) -> impl Responder { // $ Source=a let user_input = path.into_inner(); let html = format!( diff --git a/rust/ql/test/query-tests/security/CWE-079/axum/XSS.expected b/rust/ql/test/query-tests/security/CWE-079/axum/XSS.expected index 385ce0f58c48..1a7b911e5ad5 100644 --- a/rust/ql/test/query-tests/security/CWE-079/axum/XSS.expected +++ b/rust/ql/test/query-tests/security/CWE-079/axum/XSS.expected @@ -1,24 +1,22 @@ #select -| main.rs:10:10:10:21 | html_content | main.rs:15:51:15:53 | get | main.rs:10:10:10:21 | html_content | Cross-site scripting vulnerability due to a $@. | main.rs:15:51:15:53 | get | user-provided value | +| main.rs:10:10:10:21 | html_content | main.rs:15:55:15:67 | greet_handler | main.rs:10:10:10:21 | html_content | Cross-site scripting vulnerability due to a $@. | main.rs:15:55:15:67 | greet_handler | user-provided value | edges -| main.rs:8:24:8:59 | ...: Query::<...> | main.rs:9:32:9:63 | MacroExpr | provenance | | | main.rs:9:9:9:20 | html_content | main.rs:10:10:10:21 | html_content | provenance | | | main.rs:9:32:9:63 | ...::format(...) | main.rs:9:32:9:63 | { ... } | provenance | | | main.rs:9:32:9:63 | ...::must_use(...) | main.rs:9:9:9:20 | html_content | provenance | | | main.rs:9:32:9:63 | MacroExpr | main.rs:9:32:9:63 | ...::format(...) | provenance | MaD:2 | | main.rs:9:32:9:63 | { ... } | main.rs:9:32:9:63 | ...::must_use(...) | provenance | MaD:3 | -| main.rs:15:51:15:53 | get | main.rs:8:24:8:59 | ...: Query::<...> | provenance | Src:MaD:1 | +| main.rs:15:55:15:67 | greet_handler | main.rs:9:32:9:63 | MacroExpr | provenance | Src:MaD:1 | models | 1 | Source: axum::routing::method_routing::get; Argument[0].Parameter[0..7]; remote | | 2 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | | 3 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes -| main.rs:8:24:8:59 | ...: Query::<...> | semmle.label | ...: Query::<...> | | main.rs:9:9:9:20 | html_content | semmle.label | html_content | | main.rs:9:32:9:63 | ...::format(...) | semmle.label | ...::format(...) | | main.rs:9:32:9:63 | ...::must_use(...) | semmle.label | ...::must_use(...) | | main.rs:9:32:9:63 | MacroExpr | semmle.label | MacroExpr | | main.rs:9:32:9:63 | { ... } | semmle.label | { ... } | | main.rs:10:10:10:21 | html_content | semmle.label | html_content | -| main.rs:15:51:15:53 | get | semmle.label | get | +| main.rs:15:55:15:67 | greet_handler | semmle.label | greet_handler | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-079/warp/XSS.expected b/rust/ql/test/query-tests/security/CWE-079/warp/XSS.expected index 8a366d3b0d54..e4123b511ef4 100644 --- a/rust/ql/test/query-tests/security/CWE-079/warp/XSS.expected +++ b/rust/ql/test/query-tests/security/CWE-079/warp/XSS.expected @@ -1,27 +1,23 @@ #select -| main.rs:10:13:10:29 | ...::html | main.rs:7:10:7:12 | map | main.rs:10:13:10:29 | ...::html | Cross-site scripting vulnerability due to a $@. | main.rs:7:10:7:12 | map | user-provided value | +| main.rs:10:31:10:34 | body | main.rs:7:14:11:9 | \|...\| ... | main.rs:10:31:10:34 | body | Cross-site scripting vulnerability due to a $@. | main.rs:7:14:11:9 | \|...\| ... | user-provided value | edges -| main.rs:7:10:7:12 | map | main.rs:7:15:7:26 | ...: String | provenance | Src:MaD:2 | -| main.rs:7:15:7:26 | ...: String | main.rs:9:32:9:56 | MacroExpr | provenance | | -| main.rs:9:17:9:20 | body | main.rs:10:31:10:34 | body | provenance | | +| main.rs:7:14:11:9 | \|...\| ... | main.rs:9:32:9:56 | MacroExpr | provenance | Src:MaD:2 | +| main.rs:9:17:9:20 | body | main.rs:10:31:10:34 | body | provenance | Sink:MaD:1 | | main.rs:9:32:9:56 | ...::format(...) | main.rs:9:32:9:56 | { ... } | provenance | | | main.rs:9:32:9:56 | ...::must_use(...) | main.rs:9:17:9:20 | body | provenance | | | main.rs:9:32:9:56 | MacroExpr | main.rs:9:32:9:56 | ...::format(...) | provenance | MaD:3 | | main.rs:9:32:9:56 | { ... } | main.rs:9:32:9:56 | ...::must_use(...) | provenance | MaD:4 | -| main.rs:10:31:10:34 | body | main.rs:10:13:10:29 | ...::html | provenance | MaD:1 Sink:MaD:1 | models | 1 | Sink: warp::reply::html; Argument[0]; html-injection | | 2 | Source: <_ as warp::filter::Filter>::map; Argument[0].Parameter[0..7]; remote | | 3 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | | 4 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes -| main.rs:7:10:7:12 | map | semmle.label | map | -| main.rs:7:15:7:26 | ...: String | semmle.label | ...: String | +| main.rs:7:14:11:9 | \|...\| ... | semmle.label | \|...\| ... | | main.rs:9:17:9:20 | body | semmle.label | body | | main.rs:9:32:9:56 | ...::format(...) | semmle.label | ...::format(...) | | main.rs:9:32:9:56 | ...::must_use(...) | semmle.label | ...::must_use(...) | | main.rs:9:32:9:56 | MacroExpr | semmle.label | MacroExpr | | main.rs:9:32:9:56 | { ... } | semmle.label | { ... } | -| main.rs:10:13:10:29 | ...::html | semmle.label | ...::html | | main.rs:10:31:10:34 | body | semmle.label | body | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-079/warp/main.rs b/rust/ql/test/query-tests/security/CWE-079/warp/main.rs index fb300f4cdd42..c40e14f39a92 100644 --- a/rust/ql/test/query-tests/security/CWE-079/warp/main.rs +++ b/rust/ql/test/query-tests/security/CWE-079/warp/main.rs @@ -4,11 +4,11 @@ use warp::Filter; pub async fn main() { let hello = warp::path("greet") .and(warp::path::param()) - .map(|name: String| { // $ Source=name + .map(|name: String| { // Vulnerable to XSS because it directly includes user input in the response let body = format!("

    Hello, {name}!

    "); warp::reply::html(body) // $ Alert[rust/xss]=name - }); + }); // $ Source=name // Start the web server on port 3000 warp::serve(hello).run(([127, 0, 0, 1], 3000)).await; diff --git a/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected b/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected index 570340060556..a53c7483791f 100644 --- a/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected @@ -1,40 +1,40 @@ #select -| mysql.rs:25:32:25:36 | query | mysql.rs:12:33:12:54 | ...::get | mysql.rs:25:32:25:36 | query | This query depends on a $@. | mysql.rs:12:33:12:54 | ...::get | user-provided value | -| mysql.rs:26:54:26:62 | query_opt | mysql.rs:12:33:12:54 | ...::get | mysql.rs:26:54:26:62 | query_opt | This query depends on a $@. | mysql.rs:12:33:12:54 | ...::get | user-provided value | -| mysql.rs:27:14:27:23 | query_drop | mysql.rs:12:33:12:54 | ...::get | mysql.rs:27:14:27:23 | query_drop | This query depends on a $@. | mysql.rs:12:33:12:54 | ...::get | user-provided value | -| mysql.rs:28:27:28:37 | query_first | mysql.rs:12:33:12:54 | ...::get | mysql.rs:28:27:28:37 | query_first | This query depends on a $@. | mysql.rs:12:33:12:54 | ...::get | user-provided value | -| mysql.rs:29:49:29:63 | query_first_opt | mysql.rs:12:33:12:54 | ...::get | mysql.rs:29:49:29:63 | query_first_opt | This query depends on a $@. | mysql.rs:12:33:12:54 | ...::get | user-provided value | -| mysql.rs:30:22:30:31 | query_fold | mysql.rs:12:33:12:54 | ...::get | mysql.rs:30:22:30:31 | query_fold | This query depends on a $@. | mysql.rs:12:33:12:54 | ...::get | user-provided value | -| mysql.rs:31:22:31:35 | query_fold_opt | mysql.rs:12:33:12:54 | ...::get | mysql.rs:31:22:31:35 | query_fold_opt | This query depends on a $@. | mysql.rs:12:33:12:54 | ...::get | user-provided value | -| mysql.rs:36:22:36:31 | query_iter | mysql.rs:12:33:12:54 | ...::get | mysql.rs:36:22:36:31 | query_iter | This query depends on a $@. | mysql.rs:12:33:12:54 | ...::get | user-provided value | -| mysql.rs:37:22:37:30 | query_map | mysql.rs:12:33:12:54 | ...::get | mysql.rs:37:22:37:30 | query_map | This query depends on a $@. | mysql.rs:12:33:12:54 | ...::get | user-provided value | -| mysql.rs:38:22:38:34 | query_map_opt | mysql.rs:12:33:12:54 | ...::get | mysql.rs:38:22:38:34 | query_map_opt | This query depends on a $@. | mysql.rs:12:33:12:54 | ...::get | user-provided value | -| mysql.rs:42:33:42:37 | query | mysql.rs:12:33:12:54 | ...::get | mysql.rs:42:33:42:37 | query | This query depends on a $@. | mysql.rs:12:33:12:54 | ...::get | user-provided value | -| mysql.rs:75:26:75:29 | prep | mysql.rs:12:33:12:54 | ...::get | mysql.rs:75:26:75:29 | prep | This query depends on a $@. | mysql.rs:12:33:12:54 | ...::get | user-provided value | -| mysql.rs:80:15:80:24 | query_drop | mysql.rs:12:33:12:54 | ...::get | mysql.rs:80:15:80:24 | query_drop | This query depends on a $@. | mysql.rs:12:33:12:54 | ...::get | user-provided value | -| mysql.rs:110:32:110:36 | query | mysql.rs:97:33:97:54 | ...::get | mysql.rs:110:32:110:36 | query | This query depends on a $@. | mysql.rs:97:33:97:54 | ...::get | user-provided value | -| mysql.rs:111:14:111:23 | query_drop | mysql.rs:97:33:97:54 | ...::get | mysql.rs:111:14:111:23 | query_drop | This query depends on a $@. | mysql.rs:97:33:97:54 | ...::get | user-provided value | -| mysql.rs:112:35:112:45 | query_first | mysql.rs:97:33:97:54 | ...::get | mysql.rs:112:35:112:45 | query_first | This query depends on a $@. | mysql.rs:97:33:97:54 | ...::get | user-provided value | -| mysql.rs:114:14:114:23 | query_fold | mysql.rs:97:33:97:54 | ...::get | mysql.rs:114:14:114:23 | query_fold | This query depends on a $@. | mysql.rs:97:33:97:54 | ...::get | user-provided value | -| mysql.rs:116:22:116:31 | query_iter | mysql.rs:97:33:97:54 | ...::get | mysql.rs:116:22:116:31 | query_iter | This query depends on a $@. | mysql.rs:97:33:97:54 | ...::get | user-provided value | -| mysql.rs:118:14:118:25 | query_stream | mysql.rs:97:33:97:54 | ...::get | mysql.rs:118:14:118:25 | query_stream | This query depends on a $@. | mysql.rs:97:33:97:54 | ...::get | user-provided value | -| mysql.rs:121:14:121:22 | query_map | mysql.rs:97:33:97:54 | ...::get | mysql.rs:121:14:121:22 | query_map | This query depends on a $@. | mysql.rs:97:33:97:54 | ...::get | user-provided value | -| mysql.rs:149:26:149:29 | prep | mysql.rs:97:33:97:54 | ...::get | mysql.rs:149:26:149:29 | prep | This query depends on a $@. | mysql.rs:97:33:97:54 | ...::get | user-provided value | -| mysql.rs:154:15:154:24 | query_drop | mysql.rs:97:33:97:54 | ...::get | mysql.rs:154:15:154:24 | query_drop | This query depends on a $@. | mysql.rs:97:33:97:54 | ...::get | user-provided value | -| sqlx.rs:78:13:78:23 | ...::query | sqlx.rs:47:22:47:35 | ...::args | sqlx.rs:78:13:78:23 | ...::query | This query depends on a $@. | sqlx.rs:47:22:47:35 | ...::args | user-provided value | -| sqlx.rs:80:17:80:27 | ...::query | sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:80:17:80:27 | ...::query | This query depends on a $@. | sqlx.rs:48:25:48:46 | ...::get | user-provided value | -| sqlx.rs:81:17:81:27 | ...::query | sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:81:17:81:27 | ...::query | This query depends on a $@. | sqlx.rs:48:25:48:46 | ...::get | user-provided value | -| sqlx.rs:82:17:82:27 | ...::query | sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:82:17:82:27 | ...::query | This query depends on a $@. | sqlx.rs:48:25:48:46 | ...::get | user-provided value | -| sqlx.rs:113:17:113:29 | ...::raw_sql | sqlx.rs:100:25:100:46 | ...::get | sqlx.rs:113:17:113:29 | ...::raw_sql | This query depends on a $@. | sqlx.rs:100:25:100:46 | ...::get | user-provided value | -| sqlx.rs:120:17:120:27 | ...::query | sqlx.rs:100:25:100:46 | ...::get | sqlx.rs:120:17:120:27 | ...::query | This query depends on a $@. | sqlx.rs:100:25:100:46 | ...::get | user-provided value | -| sqlx.rs:127:17:127:27 | ...::query | sqlx.rs:100:25:100:46 | ...::get | sqlx.rs:127:17:127:27 | ...::query | This query depends on a $@. | sqlx.rs:100:25:100:46 | ...::get | user-provided value | -| sqlx.rs:136:40:136:53 | ...::query_as | sqlx.rs:100:25:100:46 | ...::get | sqlx.rs:136:40:136:53 | ...::query_as | This query depends on a $@. | sqlx.rs:100:25:100:46 | ...::get | user-provided value | -| sqlx.rs:145:40:145:53 | ...::query_as | sqlx.rs:100:25:100:46 | ...::get | sqlx.rs:145:40:145:53 | ...::query_as | This query depends on a $@. | sqlx.rs:100:25:100:46 | ...::get | user-provided value | -| sqlx.rs:153:17:153:27 | ...::query | sqlx.rs:100:25:100:46 | ...::get | sqlx.rs:153:17:153:27 | ...::query | This query depends on a $@. | sqlx.rs:100:25:100:46 | ...::get | user-provided value | -| sqlx.rs:188:17:188:27 | ...::query | sqlx.rs:173:25:173:46 | ...::get | sqlx.rs:188:17:188:27 | ...::query | This query depends on a $@. | sqlx.rs:173:25:173:46 | ...::get | user-provided value | +| mysql.rs:25:38:25:58 | unsafe_query.as_str() | mysql.rs:12:33:12:77 | ...::get(...) | mysql.rs:25:38:25:58 | unsafe_query.as_str() | This query depends on a $@. | mysql.rs:12:33:12:77 | ...::get(...) | user-provided value | +| mysql.rs:26:64:26:84 | unsafe_query.as_str() | mysql.rs:12:33:12:77 | ...::get(...) | mysql.rs:26:64:26:84 | unsafe_query.as_str() | This query depends on a $@. | mysql.rs:12:33:12:77 | ...::get(...) | user-provided value | +| mysql.rs:27:25:27:45 | unsafe_query.as_str() | mysql.rs:12:33:12:77 | ...::get(...) | mysql.rs:27:25:27:45 | unsafe_query.as_str() | This query depends on a $@. | mysql.rs:12:33:12:77 | ...::get(...) | user-provided value | +| mysql.rs:28:39:28:59 | unsafe_query.as_str() | mysql.rs:12:33:12:77 | ...::get(...) | mysql.rs:28:39:28:59 | unsafe_query.as_str() | This query depends on a $@. | mysql.rs:12:33:12:77 | ...::get(...) | user-provided value | +| mysql.rs:29:65:29:85 | unsafe_query.as_str() | mysql.rs:12:33:12:77 | ...::get(...) | mysql.rs:29:65:29:85 | unsafe_query.as_str() | This query depends on a $@. | mysql.rs:12:33:12:77 | ...::get(...) | user-provided value | +| mysql.rs:30:33:30:53 | unsafe_query.as_str() | mysql.rs:12:33:12:77 | ...::get(...) | mysql.rs:30:33:30:53 | unsafe_query.as_str() | This query depends on a $@. | mysql.rs:12:33:12:77 | ...::get(...) | user-provided value | +| mysql.rs:32:13:32:33 | unsafe_query.as_str() | mysql.rs:12:33:12:77 | ...::get(...) | mysql.rs:32:13:32:33 | unsafe_query.as_str() | This query depends on a $@. | mysql.rs:12:33:12:77 | ...::get(...) | user-provided value | +| mysql.rs:36:33:36:53 | unsafe_query.as_str() | mysql.rs:12:33:12:77 | ...::get(...) | mysql.rs:36:33:36:53 | unsafe_query.as_str() | This query depends on a $@. | mysql.rs:12:33:12:77 | ...::get(...) | user-provided value | +| mysql.rs:37:32:37:52 | unsafe_query.as_str() | mysql.rs:12:33:12:77 | ...::get(...) | mysql.rs:37:32:37:52 | unsafe_query.as_str() | This query depends on a $@. | mysql.rs:12:33:12:77 | ...::get(...) | user-provided value | +| mysql.rs:39:13:39:33 | unsafe_query.as_str() | mysql.rs:12:33:12:77 | ...::get(...) | mysql.rs:39:13:39:33 | unsafe_query.as_str() | This query depends on a $@. | mysql.rs:12:33:12:77 | ...::get(...) | user-provided value | +| mysql.rs:42:39:42:59 | unsafe_query.as_str() | mysql.rs:12:33:12:77 | ...::get(...) | mysql.rs:42:39:42:59 | unsafe_query.as_str() | This query depends on a $@. | mysql.rs:12:33:12:77 | ...::get(...) | user-provided value | +| mysql.rs:75:31:75:51 | unsafe_query.as_str() | mysql.rs:12:33:12:77 | ...::get(...) | mysql.rs:75:31:75:51 | unsafe_query.as_str() | This query depends on a $@. | mysql.rs:12:33:12:77 | ...::get(...) | user-provided value | +| mysql.rs:80:26:80:46 | unsafe_query.as_str() | mysql.rs:12:33:12:77 | ...::get(...) | mysql.rs:80:26:80:46 | unsafe_query.as_str() | This query depends on a $@. | mysql.rs:12:33:12:77 | ...::get(...) | user-provided value | +| mysql.rs:110:38:110:58 | unsafe_query.as_str() | mysql.rs:97:33:97:77 | ...::get(...) | mysql.rs:110:38:110:58 | unsafe_query.as_str() | This query depends on a $@. | mysql.rs:97:33:97:77 | ...::get(...) | user-provided value | +| mysql.rs:111:25:111:45 | unsafe_query.as_str() | mysql.rs:97:33:97:77 | ...::get(...) | mysql.rs:111:25:111:45 | unsafe_query.as_str() | This query depends on a $@. | mysql.rs:97:33:97:77 | ...::get(...) | user-provided value | +| mysql.rs:112:47:112:67 | unsafe_query.as_str() | mysql.rs:97:33:97:77 | ...::get(...) | mysql.rs:112:47:112:67 | unsafe_query.as_str() | This query depends on a $@. | mysql.rs:97:33:97:77 | ...::get(...) | user-provided value | +| mysql.rs:114:25:114:45 | unsafe_query.as_str() | mysql.rs:97:33:97:77 | ...::get(...) | mysql.rs:114:25:114:45 | unsafe_query.as_str() | This query depends on a $@. | mysql.rs:97:33:97:77 | ...::get(...) | user-provided value | +| mysql.rs:116:33:116:53 | unsafe_query.as_str() | mysql.rs:97:33:97:77 | ...::get(...) | mysql.rs:116:33:116:53 | unsafe_query.as_str() | This query depends on a $@. | mysql.rs:97:33:97:77 | ...::get(...) | user-provided value | +| mysql.rs:118:40:118:60 | unsafe_query.as_str() | mysql.rs:97:33:97:77 | ...::get(...) | mysql.rs:118:40:118:60 | unsafe_query.as_str() | This query depends on a $@. | mysql.rs:97:33:97:77 | ...::get(...) | user-provided value | +| mysql.rs:121:24:121:44 | unsafe_query.as_str() | mysql.rs:97:33:97:77 | ...::get(...) | mysql.rs:121:24:121:44 | unsafe_query.as_str() | This query depends on a $@. | mysql.rs:97:33:97:77 | ...::get(...) | user-provided value | +| mysql.rs:149:31:149:51 | unsafe_query.as_str() | mysql.rs:97:33:97:77 | ...::get(...) | mysql.rs:149:31:149:51 | unsafe_query.as_str() | This query depends on a $@. | mysql.rs:97:33:97:77 | ...::get(...) | user-provided value | +| mysql.rs:154:26:154:46 | unsafe_query.as_str() | mysql.rs:97:33:97:77 | ...::get(...) | mysql.rs:154:26:154:46 | unsafe_query.as_str() | This query depends on a $@. | mysql.rs:97:33:97:77 | ...::get(...) | user-provided value | +| sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() | sqlx.rs:47:22:47:37 | ...::args(...) | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() | This query depends on a $@. | sqlx.rs:47:22:47:37 | ...::args(...) | user-provided value | +| sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() | sqlx.rs:48:25:48:69 | ...::get(...) | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() | This query depends on a $@. | sqlx.rs:48:25:48:69 | ...::get(...) | user-provided value | +| sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() | sqlx.rs:48:25:48:69 | ...::get(...) | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() | This query depends on a $@. | sqlx.rs:48:25:48:69 | ...::get(...) | user-provided value | +| sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | sqlx.rs:48:25:48:69 | ...::get(...) | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | This query depends on a $@. | sqlx.rs:48:25:48:69 | ...::get(...) | user-provided value | +| sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() | sqlx.rs:100:25:100:69 | ...::get(...) | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() | This query depends on a $@. | sqlx.rs:100:25:100:69 | ...::get(...) | user-provided value | +| sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() | sqlx.rs:100:25:100:69 | ...::get(...) | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() | This query depends on a $@. | sqlx.rs:100:25:100:69 | ...::get(...) | user-provided value | +| sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() | sqlx.rs:100:25:100:69 | ...::get(...) | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() | This query depends on a $@. | sqlx.rs:100:25:100:69 | ...::get(...) | user-provided value | +| sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() | sqlx.rs:100:25:100:69 | ...::get(...) | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() | This query depends on a $@. | sqlx.rs:100:25:100:69 | ...::get(...) | user-provided value | +| sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() | sqlx.rs:100:25:100:69 | ...::get(...) | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() | This query depends on a $@. | sqlx.rs:100:25:100:69 | ...::get(...) | user-provided value | +| sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() | sqlx.rs:100:25:100:69 | ...::get(...) | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() | This query depends on a $@. | sqlx.rs:100:25:100:69 | ...::get(...) | user-provided value | +| sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() | sqlx.rs:173:25:173:69 | ...::get(...) | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() | This query depends on a $@. | sqlx.rs:173:25:173:69 | ...::get(...) | user-provided value | edges | mysql.rs:12:13:12:29 | mut remote_string | mysql.rs:18:71:18:83 | remote_string | provenance | | -| mysql.rs:12:33:12:54 | ...::get | mysql.rs:12:33:12:77 | ...::get(...) [Ok] | provenance | Src:MaD:23 | +| mysql.rs:12:33:12:77 | ...::get(...) | mysql.rs:12:33:12:77 | ...::get(...) [Ok] | provenance | Src:MaD:23 | | mysql.rs:12:33:12:77 | ...::get(...) [Ok] | mysql.rs:12:33:13:21 | ... .unwrap() | provenance | MaD:30 | | mysql.rs:12:33:13:21 | ... .unwrap() | mysql.rs:12:33:14:19 | ... .text() [Ok] | provenance | MaD:32 | | mysql.rs:12:33:14:19 | ... .text() [Ok] | mysql.rs:12:33:15:40 | ... .unwrap_or(...) | provenance | MaD:31 | @@ -57,33 +57,33 @@ edges | mysql.rs:18:70:18:83 | &remote_string [&ref] | mysql.rs:18:13:18:83 | ... + ... | provenance | MaD:26 | | mysql.rs:18:71:18:83 | remote_string | mysql.rs:18:70:18:83 | &remote_string [&ref] | provenance | | | mysql.rs:25:38:25:49 | unsafe_query | mysql.rs:25:38:25:58 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:25:38:25:58 | unsafe_query.as_str() [&ref] | mysql.rs:25:32:25:36 | query | provenance | MaD:1 Sink:MaD:1 | +| mysql.rs:25:38:25:58 | unsafe_query.as_str() [&ref] | mysql.rs:25:38:25:58 | unsafe_query.as_str() | provenance | Sink:MaD:1 | | mysql.rs:26:64:26:75 | unsafe_query | mysql.rs:26:64:26:84 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:26:64:26:84 | unsafe_query.as_str() [&ref] | mysql.rs:26:54:26:62 | query_opt | provenance | MaD:9 Sink:MaD:9 | +| mysql.rs:26:64:26:84 | unsafe_query.as_str() [&ref] | mysql.rs:26:64:26:84 | unsafe_query.as_str() | provenance | Sink:MaD:9 | | mysql.rs:27:25:27:36 | unsafe_query | mysql.rs:27:25:27:45 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:27:25:27:45 | unsafe_query.as_str() [&ref] | mysql.rs:27:14:27:23 | query_drop | provenance | MaD:2 Sink:MaD:2 | +| mysql.rs:27:25:27:45 | unsafe_query.as_str() [&ref] | mysql.rs:27:25:27:45 | unsafe_query.as_str() | provenance | Sink:MaD:2 | | mysql.rs:28:39:28:50 | unsafe_query | mysql.rs:28:39:28:59 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:28:39:28:59 | unsafe_query.as_str() [&ref] | mysql.rs:28:27:28:37 | query_first | provenance | MaD:3 Sink:MaD:3 | +| mysql.rs:28:39:28:59 | unsafe_query.as_str() [&ref] | mysql.rs:28:39:28:59 | unsafe_query.as_str() | provenance | Sink:MaD:3 | | mysql.rs:29:65:29:76 | unsafe_query | mysql.rs:29:65:29:85 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:29:65:29:85 | unsafe_query.as_str() [&ref] | mysql.rs:29:49:29:63 | query_first_opt | provenance | MaD:4 Sink:MaD:4 | +| mysql.rs:29:65:29:85 | unsafe_query.as_str() [&ref] | mysql.rs:29:65:29:85 | unsafe_query.as_str() | provenance | Sink:MaD:4 | | mysql.rs:30:33:30:44 | unsafe_query | mysql.rs:30:33:30:53 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:30:33:30:53 | unsafe_query.as_str() [&ref] | mysql.rs:30:22:30:31 | query_fold | provenance | MaD:5 Sink:MaD:5 | +| mysql.rs:30:33:30:53 | unsafe_query.as_str() [&ref] | mysql.rs:30:33:30:53 | unsafe_query.as_str() | provenance | Sink:MaD:5 | | mysql.rs:32:13:32:24 | unsafe_query | mysql.rs:32:13:32:33 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:32:13:32:33 | unsafe_query.as_str() [&ref] | mysql.rs:31:22:31:35 | query_fold_opt | provenance | MaD:6 Sink:MaD:6 | +| mysql.rs:32:13:32:33 | unsafe_query.as_str() [&ref] | mysql.rs:32:13:32:33 | unsafe_query.as_str() | provenance | Sink:MaD:6 | | mysql.rs:36:33:36:44 | unsafe_query | mysql.rs:36:33:36:53 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:36:33:36:53 | unsafe_query.as_str() [&ref] | mysql.rs:36:22:36:31 | query_iter | provenance | MaD:17 Sink:MaD:17 | +| mysql.rs:36:33:36:53 | unsafe_query.as_str() [&ref] | mysql.rs:36:33:36:53 | unsafe_query.as_str() | provenance | Sink:MaD:17 | | mysql.rs:37:32:37:43 | unsafe_query | mysql.rs:37:32:37:52 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:37:32:37:52 | unsafe_query.as_str() [&ref] | mysql.rs:37:22:37:30 | query_map | provenance | MaD:7 Sink:MaD:7 | +| mysql.rs:37:32:37:52 | unsafe_query.as_str() [&ref] | mysql.rs:37:32:37:52 | unsafe_query.as_str() | provenance | Sink:MaD:7 | | mysql.rs:39:13:39:24 | unsafe_query | mysql.rs:39:13:39:33 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:39:13:39:33 | unsafe_query.as_str() [&ref] | mysql.rs:38:22:38:34 | query_map_opt | provenance | MaD:8 Sink:MaD:8 | +| mysql.rs:39:13:39:33 | unsafe_query.as_str() [&ref] | mysql.rs:39:13:39:33 | unsafe_query.as_str() | provenance | Sink:MaD:8 | | mysql.rs:42:39:42:50 | unsafe_query | mysql.rs:42:39:42:59 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:42:39:42:59 | unsafe_query.as_str() [&ref] | mysql.rs:42:33:42:37 | query | provenance | MaD:1 Sink:MaD:1 | +| mysql.rs:42:39:42:59 | unsafe_query.as_str() [&ref] | mysql.rs:42:39:42:59 | unsafe_query.as_str() | provenance | Sink:MaD:1 | | mysql.rs:75:31:75:42 | unsafe_query | mysql.rs:75:31:75:51 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:75:31:75:51 | unsafe_query.as_str() [&ref] | mysql.rs:75:26:75:29 | prep | provenance | MaD:16 Sink:MaD:16 | +| mysql.rs:75:31:75:51 | unsafe_query.as_str() [&ref] | mysql.rs:75:31:75:51 | unsafe_query.as_str() | provenance | Sink:MaD:16 | | mysql.rs:80:26:80:37 | unsafe_query | mysql.rs:80:26:80:46 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:80:26:80:46 | unsafe_query.as_str() [&ref] | mysql.rs:80:15:80:24 | query_drop | provenance | MaD:2 Sink:MaD:2 | +| mysql.rs:80:26:80:46 | unsafe_query.as_str() [&ref] | mysql.rs:80:26:80:46 | unsafe_query.as_str() | provenance | Sink:MaD:2 | | mysql.rs:97:13:97:29 | mut remote_string | mysql.rs:103:71:103:83 | remote_string | provenance | | -| mysql.rs:97:33:97:54 | ...::get | mysql.rs:97:33:97:77 | ...::get(...) [Ok] | provenance | Src:MaD:23 | +| mysql.rs:97:33:97:77 | ...::get(...) | mysql.rs:97:33:97:77 | ...::get(...) [Ok] | provenance | Src:MaD:23 | | mysql.rs:97:33:97:77 | ...::get(...) [Ok] | mysql.rs:97:33:98:21 | ... .unwrap() | provenance | MaD:30 | | mysql.rs:97:33:98:21 | ... .unwrap() | mysql.rs:97:33:99:19 | ... .text() [Ok] | provenance | MaD:32 | | mysql.rs:97:33:99:19 | ... .text() [Ok] | mysql.rs:97:33:100:40 | ... .unwrap_or(...) | provenance | MaD:31 | @@ -102,32 +102,32 @@ edges | mysql.rs:103:70:103:83 | &remote_string [&ref] | mysql.rs:103:13:103:83 | ... + ... | provenance | MaD:26 | | mysql.rs:103:71:103:83 | remote_string | mysql.rs:103:70:103:83 | &remote_string [&ref] | provenance | | | mysql.rs:110:38:110:49 | unsafe_query | mysql.rs:110:38:110:58 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:110:38:110:58 | unsafe_query.as_str() [&ref] | mysql.rs:110:32:110:36 | query | provenance | MaD:10 Sink:MaD:10 | +| mysql.rs:110:38:110:58 | unsafe_query.as_str() [&ref] | mysql.rs:110:38:110:58 | unsafe_query.as_str() | provenance | Sink:MaD:10 | | mysql.rs:111:25:111:36 | unsafe_query | mysql.rs:111:25:111:45 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:111:25:111:45 | unsafe_query.as_str() [&ref] | mysql.rs:111:14:111:23 | query_drop | provenance | MaD:11 Sink:MaD:11 | +| mysql.rs:111:25:111:45 | unsafe_query.as_str() [&ref] | mysql.rs:111:25:111:45 | unsafe_query.as_str() | provenance | Sink:MaD:11 | | mysql.rs:112:47:112:58 | unsafe_query | mysql.rs:112:47:112:67 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:112:47:112:67 | unsafe_query.as_str() [&ref] | mysql.rs:112:35:112:45 | query_first | provenance | MaD:12 Sink:MaD:12 | +| mysql.rs:112:47:112:67 | unsafe_query.as_str() [&ref] | mysql.rs:112:47:112:67 | unsafe_query.as_str() | provenance | Sink:MaD:12 | | mysql.rs:114:25:114:36 | unsafe_query | mysql.rs:114:25:114:45 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:114:25:114:45 | unsafe_query.as_str() [&ref] | mysql.rs:114:14:114:23 | query_fold | provenance | MaD:13 Sink:MaD:13 | +| mysql.rs:114:25:114:45 | unsafe_query.as_str() [&ref] | mysql.rs:114:25:114:45 | unsafe_query.as_str() | provenance | Sink:MaD:13 | | mysql.rs:116:33:116:44 | unsafe_query | mysql.rs:116:33:116:53 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:116:33:116:53 | unsafe_query.as_str() [&ref] | mysql.rs:116:22:116:31 | query_iter | provenance | MaD:19 Sink:MaD:19 | +| mysql.rs:116:33:116:53 | unsafe_query.as_str() [&ref] | mysql.rs:116:33:116:53 | unsafe_query.as_str() | provenance | Sink:MaD:19 | | mysql.rs:118:40:118:51 | unsafe_query | mysql.rs:118:40:118:60 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:118:40:118:60 | unsafe_query.as_str() [&ref] | mysql.rs:118:14:118:25 | query_stream | provenance | MaD:15 Sink:MaD:15 | +| mysql.rs:118:40:118:60 | unsafe_query.as_str() [&ref] | mysql.rs:118:40:118:60 | unsafe_query.as_str() | provenance | Sink:MaD:15 | | mysql.rs:121:24:121:35 | unsafe_query | mysql.rs:121:24:121:44 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:121:24:121:44 | unsafe_query.as_str() [&ref] | mysql.rs:121:14:121:22 | query_map | provenance | MaD:14 Sink:MaD:14 | +| mysql.rs:121:24:121:44 | unsafe_query.as_str() [&ref] | mysql.rs:121:24:121:44 | unsafe_query.as_str() | provenance | Sink:MaD:14 | | mysql.rs:149:31:149:42 | unsafe_query | mysql.rs:149:31:149:51 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:149:31:149:51 | unsafe_query.as_str() [&ref] | mysql.rs:149:26:149:29 | prep | provenance | MaD:18 Sink:MaD:18 | +| mysql.rs:149:31:149:51 | unsafe_query.as_str() [&ref] | mysql.rs:149:31:149:51 | unsafe_query.as_str() | provenance | Sink:MaD:18 | | mysql.rs:154:26:154:37 | unsafe_query | mysql.rs:154:26:154:46 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:154:26:154:46 | unsafe_query.as_str() [&ref] | mysql.rs:154:15:154:24 | query_drop | provenance | MaD:11 Sink:MaD:11 | +| mysql.rs:154:26:154:46 | unsafe_query.as_str() [&ref] | mysql.rs:154:26:154:46 | unsafe_query.as_str() | provenance | Sink:MaD:11 | | sqlx.rs:47:9:47:18 | arg_string | sqlx.rs:53:27:53:36 | arg_string | provenance | | -| sqlx.rs:47:22:47:35 | ...::args | sqlx.rs:47:22:47:37 | ...::args(...) [element] | provenance | Src:MaD:24 | +| sqlx.rs:47:22:47:37 | ...::args(...) | sqlx.rs:47:22:47:37 | ...::args(...) [element] | provenance | Src:MaD:24 | | sqlx.rs:47:22:47:37 | ...::args(...) [element] | sqlx.rs:47:22:47:44 | ... .nth(...) [Some] | provenance | MaD:25 | | sqlx.rs:47:22:47:44 | ... .nth(...) [Some] | sqlx.rs:47:22:47:77 | ... .unwrap_or(...) | provenance | MaD:29 | | sqlx.rs:47:22:47:77 | ... .unwrap_or(...) | sqlx.rs:47:9:47:18 | arg_string | provenance | | | sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:54:27:54:39 | remote_string | provenance | | | sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:55:84:55:96 | remote_string | provenance | | | sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:59:17:59:72 | MacroExpr | provenance | | -| sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:48:25:48:69 | ...::get(...) [Ok] | provenance | Src:MaD:23 | +| sqlx.rs:48:25:48:69 | ...::get(...) | sqlx.rs:48:25:48:69 | ...::get(...) [Ok] | provenance | Src:MaD:23 | | sqlx.rs:48:25:48:69 | ...::get(...) [Ok] | sqlx.rs:48:25:48:78 | ... .unwrap() | provenance | MaD:30 | | sqlx.rs:48:25:48:78 | ... .unwrap() | sqlx.rs:48:25:48:85 | ... .text() [Ok] | provenance | MaD:32 | | sqlx.rs:48:25:48:85 | ... .text() [Ok] | sqlx.rs:48:25:48:118 | ... .unwrap_or(...) | provenance | MaD:31 | @@ -149,15 +149,15 @@ edges | sqlx.rs:59:17:59:72 | MacroExpr | sqlx.rs:59:17:59:72 | ...::format(...) | provenance | MaD:33 | | sqlx.rs:59:17:59:72 | { ... } | sqlx.rs:59:17:59:72 | ...::must_use(...) | provenance | MaD:34 | | sqlx.rs:78:25:78:38 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | provenance | MaD:28 | -| sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | sqlx.rs:78:13:78:23 | ...::query | provenance | MaD:20 Sink:MaD:20 | +| sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() | provenance | Sink:MaD:20 | | sqlx.rs:80:29:80:42 | unsafe_query_2 [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | provenance | MaD:28 | -| sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | sqlx.rs:80:17:80:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | +| sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() | provenance | Sink:MaD:20 | | sqlx.rs:81:29:81:42 | unsafe_query_3 | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() [&ref] | provenance | MaD:28 | -| sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() [&ref] | sqlx.rs:81:17:81:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | +| sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() [&ref] | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() | provenance | Sink:MaD:20 | | sqlx.rs:82:29:82:42 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | provenance | MaD:28 | -| sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | sqlx.rs:82:17:82:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | +| sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | provenance | Sink:MaD:20 | | sqlx.rs:100:9:100:21 | remote_string | sqlx.rs:102:84:102:96 | remote_string | provenance | | -| sqlx.rs:100:25:100:46 | ...::get | sqlx.rs:100:25:100:69 | ...::get(...) [Ok] | provenance | Src:MaD:23 | +| sqlx.rs:100:25:100:69 | ...::get(...) | sqlx.rs:100:25:100:69 | ...::get(...) [Ok] | provenance | Src:MaD:23 | | sqlx.rs:100:25:100:69 | ...::get(...) [Ok] | sqlx.rs:100:25:100:78 | ... .unwrap() | provenance | MaD:30 | | sqlx.rs:100:25:100:78 | ... .unwrap() | sqlx.rs:100:25:100:85 | ... .text() [Ok] | provenance | MaD:32 | | sqlx.rs:100:25:100:85 | ... .text() [Ok] | sqlx.rs:100:25:100:118 | ... .unwrap_or(...) | provenance | MaD:31 | @@ -173,19 +173,19 @@ edges | sqlx.rs:102:83:102:96 | &remote_string [&ref] | sqlx.rs:102:26:102:96 | ... + ... | provenance | MaD:26 | | sqlx.rs:102:84:102:96 | remote_string | sqlx.rs:102:83:102:96 | &remote_string [&ref] | provenance | | | sqlx.rs:113:31:113:44 | unsafe_query_1 | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() [&ref] | provenance | MaD:28 | -| sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() [&ref] | sqlx.rs:113:17:113:29 | ...::raw_sql | provenance | MaD:22 Sink:MaD:22 | +| sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() [&ref] | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() | provenance | Sink:MaD:22 | | sqlx.rs:120:29:120:42 | unsafe_query_1 | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:28 | -| sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:120:17:120:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | +| sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() | provenance | Sink:MaD:20 | | sqlx.rs:127:29:127:42 | unsafe_query_1 | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:28 | -| sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:127:17:127:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | +| sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() | provenance | Sink:MaD:20 | | sqlx.rs:136:55:136:68 | unsafe_query_1 | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:28 | -| sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() [&ref] | sqlx.rs:136:40:136:53 | ...::query_as | provenance | MaD:21 Sink:MaD:21 | +| sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() [&ref] | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() | provenance | Sink:MaD:21 | | sqlx.rs:145:55:145:68 | unsafe_query_1 | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:28 | -| sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() [&ref] | sqlx.rs:145:40:145:53 | ...::query_as | provenance | MaD:21 Sink:MaD:21 | +| sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() [&ref] | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() | provenance | Sink:MaD:21 | | sqlx.rs:153:29:153:42 | unsafe_query_1 | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:28 | -| sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:153:17:153:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | +| sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() | provenance | Sink:MaD:20 | | sqlx.rs:173:9:173:21 | remote_string | sqlx.rs:175:84:175:96 | remote_string | provenance | | -| sqlx.rs:173:25:173:46 | ...::get | sqlx.rs:173:25:173:69 | ...::get(...) [Ok] | provenance | Src:MaD:23 | +| sqlx.rs:173:25:173:69 | ...::get(...) | sqlx.rs:173:25:173:69 | ...::get(...) [Ok] | provenance | Src:MaD:23 | | sqlx.rs:173:25:173:69 | ...::get(...) [Ok] | sqlx.rs:173:25:173:78 | ... .unwrap() | provenance | MaD:30 | | sqlx.rs:173:25:173:78 | ... .unwrap() | sqlx.rs:173:25:173:85 | ... .text() [Ok] | provenance | MaD:32 | | sqlx.rs:173:25:173:85 | ... .text() [Ok] | sqlx.rs:173:25:173:118 | ... .unwrap_or(...) | provenance | MaD:31 | @@ -196,7 +196,7 @@ edges | sqlx.rs:175:83:175:96 | &remote_string [&ref] | sqlx.rs:175:26:175:96 | ... + ... | provenance | MaD:26 | | sqlx.rs:175:84:175:96 | remote_string | sqlx.rs:175:83:175:96 | &remote_string [&ref] | provenance | | | sqlx.rs:188:29:188:42 | unsafe_query_1 | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:28 | -| sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:188:17:188:27 | ...::query | provenance | MaD:20 Sink:MaD:20 | +| sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() | provenance | Sink:MaD:20 | models | 1 | Sink: <_ as mysql::conn::queryable::Queryable>::query; Argument[0]; sql-injection | | 2 | Sink: <_ as mysql::conn::queryable::Queryable>::query_drop; Argument[0]; sql-injection | @@ -234,7 +234,7 @@ models | 34 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes | mysql.rs:12:13:12:29 | mut remote_string | semmle.label | mut remote_string | -| mysql.rs:12:33:12:54 | ...::get | semmle.label | ...::get | +| mysql.rs:12:33:12:77 | ...::get(...) | semmle.label | ...::get(...) | | mysql.rs:12:33:12:77 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | | mysql.rs:12:33:13:21 | ... .unwrap() | semmle.label | ... .unwrap() | | mysql.rs:12:33:14:19 | ... .text() [Ok] | semmle.label | ... .text() [Ok] | @@ -244,47 +244,47 @@ nodes | mysql.rs:18:13:18:89 | ... + ... | semmle.label | ... + ... | | mysql.rs:18:70:18:83 | &remote_string [&ref] | semmle.label | &remote_string [&ref] | | mysql.rs:18:71:18:83 | remote_string | semmle.label | remote_string | -| mysql.rs:25:32:25:36 | query | semmle.label | query | | mysql.rs:25:38:25:49 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:25:38:25:58 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:25:38:25:58 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:26:54:26:62 | query_opt | semmle.label | query_opt | | mysql.rs:26:64:26:75 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:26:64:26:84 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:26:64:26:84 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:27:14:27:23 | query_drop | semmle.label | query_drop | | mysql.rs:27:25:27:36 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:27:25:27:45 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:27:25:27:45 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:28:27:28:37 | query_first | semmle.label | query_first | | mysql.rs:28:39:28:50 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:28:39:28:59 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:28:39:28:59 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:29:49:29:63 | query_first_opt | semmle.label | query_first_opt | | mysql.rs:29:65:29:76 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:29:65:29:85 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:29:65:29:85 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:30:22:30:31 | query_fold | semmle.label | query_fold | | mysql.rs:30:33:30:44 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:30:33:30:53 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:30:33:30:53 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:31:22:31:35 | query_fold_opt | semmle.label | query_fold_opt | | mysql.rs:32:13:32:24 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:32:13:32:33 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:32:13:32:33 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:36:22:36:31 | query_iter | semmle.label | query_iter | | mysql.rs:36:33:36:44 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:36:33:36:53 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:36:33:36:53 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:37:22:37:30 | query_map | semmle.label | query_map | | mysql.rs:37:32:37:43 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:37:32:37:52 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:37:32:37:52 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:38:22:38:34 | query_map_opt | semmle.label | query_map_opt | | mysql.rs:39:13:39:24 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:39:13:39:33 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:39:13:39:33 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:42:33:42:37 | query | semmle.label | query | | mysql.rs:42:39:42:50 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:42:39:42:59 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:42:39:42:59 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:75:26:75:29 | prep | semmle.label | prep | | mysql.rs:75:31:75:42 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:75:31:75:51 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:75:31:75:51 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:80:15:80:24 | query_drop | semmle.label | query_drop | | mysql.rs:80:26:80:37 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:80:26:80:46 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:80:26:80:46 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | | mysql.rs:97:13:97:29 | mut remote_string | semmle.label | mut remote_string | -| mysql.rs:97:33:97:54 | ...::get | semmle.label | ...::get | +| mysql.rs:97:33:97:77 | ...::get(...) | semmle.label | ...::get(...) | | mysql.rs:97:33:97:77 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | | mysql.rs:97:33:98:21 | ... .unwrap() | semmle.label | ... .unwrap() | | mysql.rs:97:33:99:19 | ... .text() [Ok] | semmle.label | ... .text() [Ok] | @@ -294,40 +294,40 @@ nodes | mysql.rs:103:13:103:89 | ... + ... | semmle.label | ... + ... | | mysql.rs:103:70:103:83 | &remote_string [&ref] | semmle.label | &remote_string [&ref] | | mysql.rs:103:71:103:83 | remote_string | semmle.label | remote_string | -| mysql.rs:110:32:110:36 | query | semmle.label | query | | mysql.rs:110:38:110:49 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:110:38:110:58 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:110:38:110:58 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:111:14:111:23 | query_drop | semmle.label | query_drop | | mysql.rs:111:25:111:36 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:111:25:111:45 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:111:25:111:45 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:112:35:112:45 | query_first | semmle.label | query_first | | mysql.rs:112:47:112:58 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:112:47:112:67 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:112:47:112:67 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:114:14:114:23 | query_fold | semmle.label | query_fold | | mysql.rs:114:25:114:36 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:114:25:114:45 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:114:25:114:45 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:116:22:116:31 | query_iter | semmle.label | query_iter | | mysql.rs:116:33:116:44 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:116:33:116:53 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:116:33:116:53 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:118:14:118:25 | query_stream | semmle.label | query_stream | | mysql.rs:118:40:118:51 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:118:40:118:60 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:118:40:118:60 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:121:14:121:22 | query_map | semmle.label | query_map | | mysql.rs:121:24:121:35 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:121:24:121:44 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:121:24:121:44 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:149:26:149:29 | prep | semmle.label | prep | | mysql.rs:149:31:149:42 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:149:31:149:51 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:149:31:149:51 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | -| mysql.rs:154:15:154:24 | query_drop | semmle.label | query_drop | | mysql.rs:154:26:154:37 | unsafe_query | semmle.label | unsafe_query | +| mysql.rs:154:26:154:46 | unsafe_query.as_str() | semmle.label | unsafe_query.as_str() | | mysql.rs:154:26:154:46 | unsafe_query.as_str() [&ref] | semmle.label | unsafe_query.as_str() [&ref] | | sqlx.rs:47:9:47:18 | arg_string | semmle.label | arg_string | -| sqlx.rs:47:22:47:35 | ...::args | semmle.label | ...::args | +| sqlx.rs:47:22:47:37 | ...::args(...) | semmle.label | ...::args(...) | | sqlx.rs:47:22:47:37 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | | sqlx.rs:47:22:47:44 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | | sqlx.rs:47:22:47:77 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | | sqlx.rs:48:9:48:21 | remote_string | semmle.label | remote_string | -| sqlx.rs:48:25:48:46 | ...::get | semmle.label | ...::get | +| sqlx.rs:48:25:48:69 | ...::get(...) | semmle.label | ...::get(...) | | sqlx.rs:48:25:48:69 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | | sqlx.rs:48:25:48:78 | ... .unwrap() | semmle.label | ... .unwrap() | | sqlx.rs:48:25:48:85 | ... .text() [Ok] | semmle.label | ... .text() [Ok] | @@ -348,20 +348,20 @@ nodes | sqlx.rs:59:17:59:72 | ...::must_use(...) | semmle.label | ...::must_use(...) | | sqlx.rs:59:17:59:72 | MacroExpr | semmle.label | MacroExpr | | sqlx.rs:59:17:59:72 | { ... } | semmle.label | { ... } | -| sqlx.rs:78:13:78:23 | ...::query | semmle.label | ...::query | | sqlx.rs:78:25:78:38 | unsafe_query_1 [&ref] | semmle.label | unsafe_query_1 [&ref] | +| sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() | semmle.label | unsafe_query_1.as_str() | | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | semmle.label | unsafe_query_1.as_str() [&ref] | -| sqlx.rs:80:17:80:27 | ...::query | semmle.label | ...::query | | sqlx.rs:80:29:80:42 | unsafe_query_2 [&ref] | semmle.label | unsafe_query_2 [&ref] | +| sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() | semmle.label | unsafe_query_2.as_str() | | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | semmle.label | unsafe_query_2.as_str() [&ref] | -| sqlx.rs:81:17:81:27 | ...::query | semmle.label | ...::query | | sqlx.rs:81:29:81:42 | unsafe_query_3 | semmle.label | unsafe_query_3 | +| sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() | semmle.label | unsafe_query_3.as_str() | | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() [&ref] | semmle.label | unsafe_query_3.as_str() [&ref] | -| sqlx.rs:82:17:82:27 | ...::query | semmle.label | ...::query | | sqlx.rs:82:29:82:42 | unsafe_query_4 | semmle.label | unsafe_query_4 | +| sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | semmle.label | unsafe_query_4.as_str() | | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | semmle.label | unsafe_query_4.as_str() [&ref] | | sqlx.rs:100:9:100:21 | remote_string | semmle.label | remote_string | -| sqlx.rs:100:25:100:46 | ...::get | semmle.label | ...::get | +| sqlx.rs:100:25:100:69 | ...::get(...) | semmle.label | ...::get(...) | | sqlx.rs:100:25:100:69 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | | sqlx.rs:100:25:100:78 | ... .unwrap() | semmle.label | ... .unwrap() | | sqlx.rs:100:25:100:85 | ... .text() [Ok] | semmle.label | ... .text() [Ok] | @@ -371,26 +371,26 @@ nodes | sqlx.rs:102:26:102:102 | ... + ... | semmle.label | ... + ... | | sqlx.rs:102:83:102:96 | &remote_string [&ref] | semmle.label | &remote_string [&ref] | | sqlx.rs:102:84:102:96 | remote_string | semmle.label | remote_string | -| sqlx.rs:113:17:113:29 | ...::raw_sql | semmle.label | ...::raw_sql | | sqlx.rs:113:31:113:44 | unsafe_query_1 | semmle.label | unsafe_query_1 | +| sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() | semmle.label | unsafe_query_1.as_str() | | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() [&ref] | semmle.label | unsafe_query_1.as_str() [&ref] | -| sqlx.rs:120:17:120:27 | ...::query | semmle.label | ...::query | | sqlx.rs:120:29:120:42 | unsafe_query_1 | semmle.label | unsafe_query_1 | +| sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() | semmle.label | unsafe_query_1.as_str() | | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() [&ref] | semmle.label | unsafe_query_1.as_str() [&ref] | -| sqlx.rs:127:17:127:27 | ...::query | semmle.label | ...::query | | sqlx.rs:127:29:127:42 | unsafe_query_1 | semmle.label | unsafe_query_1 | +| sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() | semmle.label | unsafe_query_1.as_str() | | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() [&ref] | semmle.label | unsafe_query_1.as_str() [&ref] | -| sqlx.rs:136:40:136:53 | ...::query_as | semmle.label | ...::query_as | | sqlx.rs:136:55:136:68 | unsafe_query_1 | semmle.label | unsafe_query_1 | +| sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() | semmle.label | unsafe_query_1.as_str() | | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() [&ref] | semmle.label | unsafe_query_1.as_str() [&ref] | -| sqlx.rs:145:40:145:53 | ...::query_as | semmle.label | ...::query_as | | sqlx.rs:145:55:145:68 | unsafe_query_1 | semmle.label | unsafe_query_1 | +| sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() | semmle.label | unsafe_query_1.as_str() | | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() [&ref] | semmle.label | unsafe_query_1.as_str() [&ref] | -| sqlx.rs:153:17:153:27 | ...::query | semmle.label | ...::query | | sqlx.rs:153:29:153:42 | unsafe_query_1 | semmle.label | unsafe_query_1 | +| sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() | semmle.label | unsafe_query_1.as_str() | | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() [&ref] | semmle.label | unsafe_query_1.as_str() [&ref] | | sqlx.rs:173:9:173:21 | remote_string | semmle.label | remote_string | -| sqlx.rs:173:25:173:46 | ...::get | semmle.label | ...::get | +| sqlx.rs:173:25:173:69 | ...::get(...) | semmle.label | ...::get(...) | | sqlx.rs:173:25:173:69 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | | sqlx.rs:173:25:173:78 | ... .unwrap() | semmle.label | ... .unwrap() | | sqlx.rs:173:25:173:85 | ... .text() [Ok] | semmle.label | ... .text() [Ok] | @@ -400,7 +400,7 @@ nodes | sqlx.rs:175:26:175:102 | ... + ... | semmle.label | ... + ... | | sqlx.rs:175:83:175:96 | &remote_string [&ref] | semmle.label | &remote_string [&ref] | | sqlx.rs:175:84:175:96 | remote_string | semmle.label | remote_string | -| sqlx.rs:188:17:188:27 | ...::query | semmle.label | ...::query | | sqlx.rs:188:29:188:42 | unsafe_query_1 | semmle.label | unsafe_query_1 | +| sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() | semmle.label | unsafe_query_1.as_str() | | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() [&ref] | semmle.label | unsafe_query_1.as_str() [&ref] | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-089/mysql.rs b/rust/ql/test/query-tests/security/CWE-089/mysql.rs index 71ee265e8bab..01b5fe7299c0 100644 --- a/rust/ql/test/query-tests/security/CWE-089/mysql.rs +++ b/rust/ql/test/query-tests/security/CWE-089/mysql.rs @@ -28,15 +28,15 @@ mod sync_test { let _: i64 = conn.query_first(unsafe_query.as_str())?.unwrap(); // $ sql-sink Alert[rust/sql-injection]=remote10 let _: Result = conn.query_first_opt(unsafe_query.as_str())?.unwrap(); // $ sql-sink Alert[rust/sql-injection]=remote10 let _ = conn.query_fold(unsafe_query.as_str(), 0, |_: i64, _: i64| -> i64 { 0 })?; // $ sql-sink Alert[rust/sql-injection]=remote10 - let _ = conn.query_fold_opt( // $ sql-sink Alert[rust/sql-injection]=remote10 - unsafe_query.as_str(), + let _ = conn.query_fold_opt( + unsafe_query.as_str(), // $ sql-sink Alert[rust/sql-injection]=remote10 0, |_: i64, _: Result| -> i64 { 0 }, )?; let _ = conn.query_iter(unsafe_query.as_str())?; // $ sql-sink Alert[rust/sql-injection]=remote10 let _ = conn.query_map(unsafe_query.as_str(), |_: i64| -> () {})?; // $ sql-sink Alert[rust/sql-injection]=remote10 - let _ = conn.query_map_opt( // $ sql-sink Alert[rust/sql-injection]=remote10 - unsafe_query.as_str(), + let _ = conn.query_map_opt( + unsafe_query.as_str(), // $ sql-sink Alert[rust/sql-injection]=remote10 |_: Result| -> () {}, )?; let _: Vec = conn2.query(unsafe_query.as_str())?; // $ sql-sink Alert[rust/sql-injection]=remote10 diff --git a/rust/ql/test/query-tests/security/CWE-117/LogInjection.expected b/rust/ql/test/query-tests/security/CWE-117/LogInjection.expected index 4349f3738eb9..60392bc0df12 100644 --- a/rust/ql/test/query-tests/security/CWE-117/LogInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-117/LogInjection.expected @@ -1,67 +1,59 @@ #select -| main.rs:15:5:15:9 | ...::log | main.rs:8:29:8:37 | ...::args | main.rs:15:5:15:9 | ...::log | Log entry depends on a $@. | main.rs:8:29:8:37 | ...::args | user-provided value | -| main.rs:16:5:16:9 | ...::log | main.rs:10:22:10:34 | ...::var | main.rs:16:5:16:9 | ...::log | Log entry depends on a $@. | main.rs:10:22:10:34 | ...::var | user-provided value | -| main.rs:17:5:17:10 | ...::log | main.rs:11:23:11:44 | ...::get | main.rs:17:5:17:10 | ...::log | Log entry depends on a $@. | main.rs:11:23:11:44 | ...::get | user-provided value | -| main.rs:18:5:18:10 | ...::log | main.rs:8:29:8:37 | ...::args | main.rs:18:5:18:10 | ...::log | Log entry depends on a $@. | main.rs:8:29:8:37 | ...::args | user-provided value | -| main.rs:19:5:19:10 | ...::log | main.rs:10:22:10:34 | ...::var | main.rs:19:5:19:10 | ...::log | Log entry depends on a $@. | main.rs:10:22:10:34 | ...::var | user-provided value | -| main.rs:23:5:23:9 | ...::log | main.rs:8:29:8:37 | ...::args | main.rs:23:5:23:9 | ...::log | Log entry depends on a $@. | main.rs:8:29:8:37 | ...::args | user-provided value | -| main.rs:27:5:27:9 | ...::log | main.rs:8:29:8:37 | ...::args | main.rs:27:5:27:9 | ...::log | Log entry depends on a $@. | main.rs:8:29:8:37 | ...::args | user-provided value | -| main.rs:30:5:30:9 | ...::log | main.rs:8:29:8:37 | ...::args | main.rs:30:5:30:9 | ...::log | Log entry depends on a $@. | main.rs:8:29:8:37 | ...::args | user-provided value | -| main.rs:30:5:30:9 | ...::log | main.rs:11:23:11:44 | ...::get | main.rs:30:5:30:9 | ...::log | Log entry depends on a $@. | main.rs:11:23:11:44 | ...::get | user-provided value | -| main.rs:66:5:66:9 | ...::log | main.rs:8:29:8:37 | ...::args | main.rs:66:5:66:9 | ...::log | Log entry depends on a $@. | main.rs:8:29:8:37 | ...::args | user-provided value | -| main.rs:112:9:112:13 | ...::log | main.rs:109:25:109:38 | ...::args | main.rs:112:9:112:13 | ...::log | Log entry depends on a $@. | main.rs:109:25:109:38 | ...::args | user-provided value | -| main.rs:113:9:113:13 | ...::log | main.rs:109:25:109:38 | ...::args | main.rs:113:9:113:13 | ...::log | Log entry depends on a $@. | main.rs:109:25:109:38 | ...::args | user-provided value | -| main.rs:114:9:114:14 | ...::log | main.rs:109:25:109:38 | ...::args | main.rs:114:9:114:14 | ...::log | Log entry depends on a $@. | main.rs:109:25:109:38 | ...::args | user-provided value | -| main.rs:115:9:115:14 | ...::log | main.rs:109:25:109:38 | ...::args | main.rs:115:9:115:14 | ...::log | Log entry depends on a $@. | main.rs:109:25:109:38 | ...::args | user-provided value | -| main.rs:116:9:116:14 | ...::log | main.rs:109:25:109:38 | ...::args | main.rs:116:9:116:14 | ...::log | Log entry depends on a $@. | main.rs:109:25:109:38 | ...::args | user-provided value | -| main.rs:119:9:119:13 | ...::log | main.rs:109:25:109:38 | ...::args | main.rs:119:9:119:13 | ...::log | Log entry depends on a $@. | main.rs:109:25:109:38 | ...::args | user-provided value | -| main.rs:130:9:130:16 | ...::_print | main.rs:127:25:127:37 | ...::var | main.rs:130:9:130:16 | ...::_print | Log entry depends on a $@. | main.rs:127:25:127:37 | ...::var | user-provided value | -| main.rs:131:9:131:17 | ...::_eprint | main.rs:127:25:127:37 | ...::var | main.rs:131:9:131:17 | ...::_eprint | Log entry depends on a $@. | main.rs:127:25:127:37 | ...::var | user-provided value | -| main.rs:143:9:143:16 | ...::_print | main.rs:150:28:150:30 | get | main.rs:143:9:143:16 | ...::_print | Log entry depends on a $@. | main.rs:150:28:150:30 | get | user-provided value | +| main.rs:15:11:15:36 | MacroExpr | main.rs:8:29:8:39 | ...::args(...) | main.rs:15:11:15:36 | MacroExpr | Log entry depends on a $@. | main.rs:8:29:8:39 | ...::args(...) | user-provided value | +| main.rs:16:11:16:44 | MacroExpr | main.rs:10:22:10:48 | ...::var(...) | main.rs:16:11:16:44 | MacroExpr | Log entry depends on a $@. | main.rs:10:22:10:48 | ...::var(...) | user-provided value | +| main.rs:17:12:17:46 | MacroExpr | main.rs:11:23:11:71 | ...::get(...) | main.rs:17:12:17:46 | MacroExpr | Log entry depends on a $@. | main.rs:11:23:11:71 | ...::get(...) | user-provided value | +| main.rs:18:12:18:37 | MacroExpr | main.rs:8:29:8:39 | ...::args(...) | main.rs:18:12:18:37 | MacroExpr | Log entry depends on a $@. | main.rs:8:29:8:39 | ...::args(...) | user-provided value | +| main.rs:19:12:19:39 | MacroExpr | main.rs:10:22:10:48 | ...::var(...) | main.rs:19:12:19:39 | MacroExpr | Log entry depends on a $@. | main.rs:10:22:10:48 | ...::var(...) | user-provided value | +| main.rs:23:11:23:29 | MacroExpr | main.rs:8:29:8:39 | ...::args(...) | main.rs:23:11:23:29 | MacroExpr | Log entry depends on a $@. | main.rs:8:29:8:39 | ...::args(...) | user-provided value | +| main.rs:27:11:27:26 | MacroExpr | main.rs:8:29:8:39 | ...::args(...) | main.rs:27:11:27:26 | MacroExpr | Log entry depends on a $@. | main.rs:8:29:8:39 | ...::args(...) | user-provided value | +| main.rs:30:11:30:66 | MacroExpr | main.rs:8:29:8:39 | ...::args(...) | main.rs:30:11:30:66 | MacroExpr | Log entry depends on a $@. | main.rs:8:29:8:39 | ...::args(...) | user-provided value | +| main.rs:30:11:30:66 | MacroExpr | main.rs:11:23:11:71 | ...::get(...) | main.rs:30:11:30:66 | MacroExpr | Log entry depends on a $@. | main.rs:11:23:11:71 | ...::get(...) | user-provided value | +| main.rs:66:11:66:41 | MacroExpr | main.rs:8:29:8:39 | ...::args(...) | main.rs:66:11:66:41 | MacroExpr | Log entry depends on a $@. | main.rs:8:29:8:39 | ...::args(...) | user-provided value | +| main.rs:112:15:112:35 | MacroExpr | main.rs:109:25:109:40 | ...::args(...) | main.rs:112:15:112:35 | MacroExpr | Log entry depends on a $@. | main.rs:109:25:109:40 | ...::args(...) | user-provided value | +| main.rs:113:15:113:38 | MacroExpr | main.rs:109:25:109:40 | ...::args(...) | main.rs:113:15:113:38 | MacroExpr | Log entry depends on a $@. | main.rs:109:25:109:40 | ...::args(...) | user-provided value | +| main.rs:114:16:114:37 | MacroExpr | main.rs:109:25:109:40 | ...::args(...) | main.rs:114:16:114:37 | MacroExpr | Log entry depends on a $@. | main.rs:109:25:109:40 | ...::args(...) | user-provided value | +| main.rs:115:16:115:37 | MacroExpr | main.rs:109:25:109:40 | ...::args(...) | main.rs:115:16:115:37 | MacroExpr | Log entry depends on a $@. | main.rs:109:25:109:40 | ...::args(...) | user-provided value | +| main.rs:116:16:116:37 | MacroExpr | main.rs:109:25:109:40 | ...::args(...) | main.rs:116:16:116:37 | MacroExpr | Log entry depends on a $@. | main.rs:109:25:109:40 | ...::args(...) | user-provided value | +| main.rs:119:15:119:75 | MacroExpr | main.rs:109:25:109:40 | ...::args(...) | main.rs:119:15:119:75 | MacroExpr | Log entry depends on a $@. | main.rs:109:25:109:40 | ...::args(...) | user-provided value | +| main.rs:130:18:130:38 | MacroExpr | main.rs:127:25:127:45 | ...::var(...) | main.rs:130:18:130:38 | MacroExpr | Log entry depends on a $@. | main.rs:127:25:127:45 | ...::var(...) | user-provided value | +| main.rs:131:19:131:49 | MacroExpr | main.rs:127:25:127:45 | ...::var(...) | main.rs:131:19:131:49 | MacroExpr | Log entry depends on a $@. | main.rs:127:25:127:45 | ...::var(...) | user-provided value | +| main.rs:143:18:143:40 | MacroExpr | main.rs:150:32:150:48 | my_axum_handler_1 | main.rs:143:18:143:40 | MacroExpr | Log entry depends on a $@. | main.rs:150:32:150:48 | my_axum_handler_1 | user-provided value | edges | main.rs:8:9:8:12 | args [element] | main.rs:9:20:9:23 | args [element] | provenance | | -| main.rs:8:29:8:37 | ...::args | main.rs:8:29:8:39 | ...::args(...) [element] | provenance | Src:MaD:6 | +| main.rs:8:29:8:39 | ...::args(...) | main.rs:8:29:8:39 | ...::args(...) [element] | provenance | Src:MaD:6 | | main.rs:8:29:8:39 | ...::args(...) [element] | main.rs:8:29:8:49 | ... .collect() [element] | provenance | MaD:10 | | main.rs:8:29:8:49 | ... .collect() [element] | main.rs:8:9:8:12 | args [element] | provenance | | -| main.rs:9:9:9:16 | username | main.rs:15:11:15:36 | MacroExpr | provenance | | -| main.rs:9:9:9:16 | username | main.rs:18:12:18:37 | MacroExpr | provenance | | +| main.rs:9:9:9:16 | username | main.rs:15:11:15:36 | MacroExpr | provenance | Sink:MaD:1 | +| main.rs:9:9:9:16 | username | main.rs:18:12:18:37 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:9:9:9:16 | username | main.rs:22:33:22:63 | MacroExpr | provenance | | | main.rs:9:9:9:16 | username | main.rs:26:55:26:62 | username | provenance | | -| main.rs:9:9:9:16 | username | main.rs:30:11:30:66 | MacroExpr | provenance | | +| main.rs:9:9:9:16 | username | main.rs:30:11:30:66 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:9:9:9:16 | username | main.rs:52:29:52:36 | username | provenance | | | main.rs:9:20:9:23 | args [element] | main.rs:9:20:9:30 | args.get(...) [Some, &ref] | provenance | MaD:13 | | main.rs:9:20:9:30 | args.get(...) [Some, &ref] | main.rs:9:20:9:64 | ... .unwrap_or(...) [&ref] | provenance | MaD:16 | | main.rs:9:20:9:64 | ... .unwrap_or(...) [&ref] | main.rs:9:20:9:72 | ... .clone() | provenance | MaD:9 | | main.rs:9:20:9:72 | ... .clone() | main.rs:9:9:9:16 | username | provenance | | -| main.rs:10:9:10:18 | user_input | main.rs:16:11:16:44 | MacroExpr | provenance | | -| main.rs:10:9:10:18 | user_input | main.rs:19:12:19:39 | MacroExpr | provenance | | -| main.rs:10:22:10:34 | ...::var | main.rs:10:22:10:48 | ...::var(...) [Ok] | provenance | Src:MaD:7 | +| main.rs:10:9:10:18 | user_input | main.rs:16:11:16:44 | MacroExpr | provenance | Sink:MaD:1 | +| main.rs:10:9:10:18 | user_input | main.rs:19:12:19:39 | MacroExpr | provenance | Sink:MaD:1 | +| main.rs:10:22:10:48 | ...::var(...) | main.rs:10:22:10:48 | ...::var(...) [Ok] | provenance | Src:MaD:7 | | main.rs:10:22:10:48 | ...::var(...) [Ok] | main.rs:10:22:10:81 | ... .unwrap_or(...) | provenance | MaD:19 | | main.rs:10:22:10:81 | ... .unwrap_or(...) | main.rs:10:9:10:18 | user_input | provenance | | -| main.rs:11:9:11:19 | remote_data | main.rs:17:12:17:46 | MacroExpr | provenance | | -| main.rs:11:9:11:19 | remote_data | main.rs:30:11:30:66 | MacroExpr | provenance | | -| main.rs:11:23:11:44 | ...::get | main.rs:11:23:11:71 | ...::get(...) [Ok] | provenance | Src:MaD:5 | +| main.rs:11:9:11:19 | remote_data | main.rs:17:12:17:46 | MacroExpr | provenance | Sink:MaD:1 | +| main.rs:11:9:11:19 | remote_data | main.rs:30:11:30:66 | MacroExpr | provenance | Sink:MaD:1 | +| main.rs:11:23:11:71 | ...::get(...) | main.rs:11:23:11:71 | ...::get(...) [Ok] | provenance | Src:MaD:5 | | main.rs:11:23:11:71 | ...::get(...) [Ok] | main.rs:11:23:12:17 | ... .unwrap() | provenance | MaD:18 | | main.rs:11:23:12:17 | ... .unwrap() | main.rs:11:23:12:24 | ... .text() [Ok] | provenance | MaD:21 | | main.rs:11:23:12:24 | ... .text() [Ok] | main.rs:11:23:12:61 | ... .unwrap_or(...) | provenance | MaD:19 | | main.rs:11:23:12:61 | ... .unwrap_or(...) | main.rs:11:9:11:19 | remote_data | provenance | | -| main.rs:15:11:15:36 | MacroExpr | main.rs:15:5:15:9 | ...::log | provenance | MaD:1 Sink:MaD:1 | -| main.rs:16:11:16:44 | MacroExpr | main.rs:16:5:16:9 | ...::log | provenance | MaD:1 Sink:MaD:1 | -| main.rs:17:12:17:46 | MacroExpr | main.rs:17:5:17:10 | ...::log | provenance | MaD:1 Sink:MaD:1 | -| main.rs:18:12:18:37 | MacroExpr | main.rs:18:5:18:10 | ...::log | provenance | MaD:1 Sink:MaD:1 | -| main.rs:19:12:19:39 | MacroExpr | main.rs:19:5:19:10 | ...::log | provenance | MaD:1 Sink:MaD:1 | -| main.rs:22:9:22:21 | formatted_msg | main.rs:23:11:23:29 | MacroExpr | provenance | | +| main.rs:22:9:22:21 | formatted_msg | main.rs:23:11:23:29 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:22:33:22:63 | ...::format(...) | main.rs:22:33:22:63 | { ... } | provenance | | | main.rs:22:33:22:63 | ...::must_use(...) | main.rs:22:9:22:21 | formatted_msg | provenance | | | main.rs:22:33:22:63 | MacroExpr | main.rs:22:33:22:63 | ...::format(...) | provenance | MaD:22 | | main.rs:22:33:22:63 | { ... } | main.rs:22:33:22:63 | ...::must_use(...) | provenance | MaD:23 | -| main.rs:23:11:23:29 | MacroExpr | main.rs:23:5:23:9 | ...::log | provenance | MaD:1 Sink:MaD:1 | -| main.rs:26:9:26:18 | concat_msg | main.rs:27:11:27:26 | MacroExpr | provenance | | +| main.rs:26:9:26:18 | concat_msg | main.rs:27:11:27:26 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:26:22:26:62 | ... + ... | main.rs:26:9:26:18 | concat_msg | provenance | | | main.rs:26:54:26:62 | &username [&ref] | main.rs:26:22:26:62 | ... + ... | provenance | MaD:12 | | main.rs:26:55:26:62 | username | main.rs:26:54:26:62 | &username [&ref] | provenance | | -| main.rs:27:11:27:26 | MacroExpr | main.rs:27:5:27:9 | ...::log | provenance | MaD:1 Sink:MaD:1 | -| main.rs:30:11:30:66 | MacroExpr | main.rs:30:5:30:9 | ...::log | provenance | MaD:1 Sink:MaD:1 | | main.rs:52:28:52:36 | &username [&ref] | main.rs:56:27:56:40 | ...: ... [&ref] | provenance | | | main.rs:52:29:52:36 | username | main.rs:52:28:52:36 | &username [&ref] | provenance | | | main.rs:56:27:56:40 | ...: ... [&ref] | main.rs:65:38:65:45 | username [&ref] | provenance | | @@ -69,42 +61,31 @@ edges | main.rs:65:21:65:59 | UserInfo {...} [UserInfo] | main.rs:65:9:65:17 | user_info [UserInfo] | provenance | | | main.rs:65:38:65:45 | username [&ref] | main.rs:65:38:65:57 | username.to_string() | provenance | MaD:8 | | main.rs:65:38:65:57 | username.to_string() | main.rs:65:21:65:59 | UserInfo {...} [UserInfo] | provenance | | -| main.rs:66:11:66:41 | MacroExpr | main.rs:66:5:66:9 | ...::log | provenance | MaD:1 Sink:MaD:1 | | main.rs:66:28:66:36 | user_info [UserInfo] | main.rs:66:28:66:41 | user_info.name | provenance | | -| main.rs:66:28:66:41 | user_info.name | main.rs:66:11:66:41 | MacroExpr | provenance | | -| main.rs:109:13:109:21 | user_data | main.rs:112:15:112:35 | MacroExpr | provenance | | -| main.rs:109:13:109:21 | user_data | main.rs:113:15:113:38 | MacroExpr | provenance | | -| main.rs:109:13:109:21 | user_data | main.rs:114:16:114:37 | MacroExpr | provenance | | -| main.rs:109:13:109:21 | user_data | main.rs:115:16:115:37 | MacroExpr | provenance | | -| main.rs:109:13:109:21 | user_data | main.rs:116:16:116:37 | MacroExpr | provenance | | -| main.rs:109:13:109:21 | user_data | main.rs:119:15:119:75 | MacroExpr | provenance | | -| main.rs:109:25:109:38 | ...::args | main.rs:109:25:109:40 | ...::args(...) [element] | provenance | Src:MaD:6 | +| main.rs:66:28:66:41 | user_info.name | main.rs:66:11:66:41 | MacroExpr | provenance | Sink:MaD:1 | +| main.rs:109:13:109:21 | user_data | main.rs:112:15:112:35 | MacroExpr | provenance | Sink:MaD:1 | +| main.rs:109:13:109:21 | user_data | main.rs:113:15:113:38 | MacroExpr | provenance | Sink:MaD:1 | +| main.rs:109:13:109:21 | user_data | main.rs:114:16:114:37 | MacroExpr | provenance | Sink:MaD:1 | +| main.rs:109:13:109:21 | user_data | main.rs:115:16:115:37 | MacroExpr | provenance | Sink:MaD:1 | +| main.rs:109:13:109:21 | user_data | main.rs:116:16:116:37 | MacroExpr | provenance | Sink:MaD:1 | +| main.rs:109:13:109:21 | user_data | main.rs:119:15:119:75 | MacroExpr | provenance | Sink:MaD:1 | +| main.rs:109:25:109:40 | ...::args(...) | main.rs:109:25:109:40 | ...::args(...) [element] | provenance | Src:MaD:6 | | main.rs:109:25:109:40 | ...::args(...) [element] | main.rs:109:25:109:47 | ... .nth(...) [Some] | provenance | MaD:11 | | main.rs:109:25:109:47 | ... .nth(...) [Some] | main.rs:109:25:109:67 | ... .unwrap_or_default() | provenance | MaD:17 | | main.rs:109:25:109:67 | ... .unwrap_or_default() | main.rs:109:13:109:21 | user_data | provenance | | -| main.rs:112:15:112:35 | MacroExpr | main.rs:112:9:112:13 | ...::log | provenance | MaD:1 Sink:MaD:1 | -| main.rs:113:15:113:38 | MacroExpr | main.rs:113:9:113:13 | ...::log | provenance | MaD:1 Sink:MaD:1 | -| main.rs:114:16:114:37 | MacroExpr | main.rs:114:9:114:14 | ...::log | provenance | MaD:1 Sink:MaD:1 | -| main.rs:115:16:115:37 | MacroExpr | main.rs:115:9:115:14 | ...::log | provenance | MaD:1 Sink:MaD:1 | -| main.rs:116:16:116:37 | MacroExpr | main.rs:116:9:116:14 | ...::log | provenance | MaD:1 Sink:MaD:1 | -| main.rs:119:15:119:75 | MacroExpr | main.rs:119:9:119:13 | ...::log | provenance | MaD:1 Sink:MaD:1 | -| main.rs:127:13:127:21 | user_data | main.rs:130:18:130:38 | MacroExpr | provenance | | -| main.rs:127:13:127:21 | user_data | main.rs:131:19:131:49 | MacroExpr | provenance | | -| main.rs:127:25:127:37 | ...::var | main.rs:127:25:127:45 | ...::var(...) [Ok] | provenance | Src:MaD:7 | +| main.rs:127:13:127:21 | user_data | main.rs:130:18:130:38 | MacroExpr | provenance | Sink:MaD:3 | +| main.rs:127:13:127:21 | user_data | main.rs:131:19:131:49 | MacroExpr | provenance | Sink:MaD:2 | +| main.rs:127:25:127:45 | ...::var(...) | main.rs:127:25:127:45 | ...::var(...) [Ok] | provenance | Src:MaD:7 | | main.rs:127:25:127:45 | ...::var(...) [Ok] | main.rs:127:25:127:65 | ... .unwrap_or_default() | provenance | MaD:20 | | main.rs:127:25:127:65 | ... .unwrap_or_default() | main.rs:127:13:127:21 | user_data | provenance | | -| main.rs:130:18:130:38 | MacroExpr | main.rs:130:9:130:16 | ...::_print | provenance | MaD:3 Sink:MaD:3 | -| main.rs:131:19:131:49 | MacroExpr | main.rs:131:9:131:17 | ...::_eprint | provenance | MaD:2 Sink:MaD:2 | -| main.rs:140:32:140:59 | ...: Option::<...> | main.rs:141:22:141:27 | o_path | provenance | | | main.rs:141:13:141:18 | m_path [Some] | main.rs:143:26:143:31 | m_path [Some] | provenance | | | main.rs:141:22:141:27 | o_path | main.rs:141:22:141:38 | o_path.map(...) [Some] | provenance | MaD:14 | | main.rs:141:22:141:27 | o_path | main.rs:141:34:141:34 | ... | provenance | MaD:14 | | main.rs:141:22:141:38 | o_path.map(...) [Some] | main.rs:141:13:141:18 | m_path [Some] | provenance | | | main.rs:141:34:141:34 | ... | main.rs:141:37:141:37 | x | provenance | | -| main.rs:143:18:143:40 | MacroExpr | main.rs:143:9:143:16 | ...::_print | provenance | MaD:3 Sink:MaD:3 | | main.rs:143:26:143:31 | m_path [Some] | main.rs:143:26:143:40 | m_path.unwrap() | provenance | MaD:15 | -| main.rs:143:26:143:40 | m_path.unwrap() | main.rs:143:18:143:40 | MacroExpr | provenance | | -| main.rs:150:28:150:30 | get | main.rs:140:32:140:59 | ...: Option::<...> | provenance | Src:MaD:4 | +| main.rs:143:26:143:40 | m_path.unwrap() | main.rs:143:18:143:40 | MacroExpr | provenance | Sink:MaD:3 | +| main.rs:150:32:150:48 | my_axum_handler_1 | main.rs:141:22:141:27 | o_path | provenance | Src:MaD:4 | models | 1 | Sink: log::__private_api::log; Argument[0]; log-injection | | 2 | Sink: std::io::stdio::_eprint; Argument[0]; log-injection | @@ -131,7 +112,7 @@ models | 23 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes | main.rs:8:9:8:12 | args [element] | semmle.label | args [element] | -| main.rs:8:29:8:37 | ...::args | semmle.label | ...::args | +| main.rs:8:29:8:39 | ...::args(...) | semmle.label | ...::args(...) | | main.rs:8:29:8:39 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | | main.rs:8:29:8:49 | ... .collect() [element] | semmle.label | ... .collect() [element] | | main.rs:9:9:9:16 | username | semmle.label | username | @@ -140,39 +121,31 @@ nodes | main.rs:9:20:9:64 | ... .unwrap_or(...) [&ref] | semmle.label | ... .unwrap_or(...) [&ref] | | main.rs:9:20:9:72 | ... .clone() | semmle.label | ... .clone() | | main.rs:10:9:10:18 | user_input | semmle.label | user_input | -| main.rs:10:22:10:34 | ...::var | semmle.label | ...::var | +| main.rs:10:22:10:48 | ...::var(...) | semmle.label | ...::var(...) | | main.rs:10:22:10:48 | ...::var(...) [Ok] | semmle.label | ...::var(...) [Ok] | | main.rs:10:22:10:81 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | | main.rs:11:9:11:19 | remote_data | semmle.label | remote_data | -| main.rs:11:23:11:44 | ...::get | semmle.label | ...::get | +| main.rs:11:23:11:71 | ...::get(...) | semmle.label | ...::get(...) | | main.rs:11:23:11:71 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | | main.rs:11:23:12:17 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:11:23:12:24 | ... .text() [Ok] | semmle.label | ... .text() [Ok] | | main.rs:11:23:12:61 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | -| main.rs:15:5:15:9 | ...::log | semmle.label | ...::log | | main.rs:15:11:15:36 | MacroExpr | semmle.label | MacroExpr | -| main.rs:16:5:16:9 | ...::log | semmle.label | ...::log | | main.rs:16:11:16:44 | MacroExpr | semmle.label | MacroExpr | -| main.rs:17:5:17:10 | ...::log | semmle.label | ...::log | | main.rs:17:12:17:46 | MacroExpr | semmle.label | MacroExpr | -| main.rs:18:5:18:10 | ...::log | semmle.label | ...::log | | main.rs:18:12:18:37 | MacroExpr | semmle.label | MacroExpr | -| main.rs:19:5:19:10 | ...::log | semmle.label | ...::log | | main.rs:19:12:19:39 | MacroExpr | semmle.label | MacroExpr | | main.rs:22:9:22:21 | formatted_msg | semmle.label | formatted_msg | | main.rs:22:33:22:63 | ...::format(...) | semmle.label | ...::format(...) | | main.rs:22:33:22:63 | ...::must_use(...) | semmle.label | ...::must_use(...) | | main.rs:22:33:22:63 | MacroExpr | semmle.label | MacroExpr | | main.rs:22:33:22:63 | { ... } | semmle.label | { ... } | -| main.rs:23:5:23:9 | ...::log | semmle.label | ...::log | | main.rs:23:11:23:29 | MacroExpr | semmle.label | MacroExpr | | main.rs:26:9:26:18 | concat_msg | semmle.label | concat_msg | | main.rs:26:22:26:62 | ... + ... | semmle.label | ... + ... | | main.rs:26:54:26:62 | &username [&ref] | semmle.label | &username [&ref] | | main.rs:26:55:26:62 | username | semmle.label | username | -| main.rs:27:5:27:9 | ...::log | semmle.label | ...::log | | main.rs:27:11:27:26 | MacroExpr | semmle.label | MacroExpr | -| main.rs:30:5:30:9 | ...::log | semmle.label | ...::log | | main.rs:30:11:30:66 | MacroExpr | semmle.label | MacroExpr | | main.rs:52:28:52:36 | &username [&ref] | semmle.label | &username [&ref] | | main.rs:52:29:52:36 | username | semmle.label | username | @@ -181,45 +154,34 @@ nodes | main.rs:65:21:65:59 | UserInfo {...} [UserInfo] | semmle.label | UserInfo {...} [UserInfo] | | main.rs:65:38:65:45 | username [&ref] | semmle.label | username [&ref] | | main.rs:65:38:65:57 | username.to_string() | semmle.label | username.to_string() | -| main.rs:66:5:66:9 | ...::log | semmle.label | ...::log | | main.rs:66:11:66:41 | MacroExpr | semmle.label | MacroExpr | | main.rs:66:28:66:36 | user_info [UserInfo] | semmle.label | user_info [UserInfo] | | main.rs:66:28:66:41 | user_info.name | semmle.label | user_info.name | | main.rs:109:13:109:21 | user_data | semmle.label | user_data | -| main.rs:109:25:109:38 | ...::args | semmle.label | ...::args | +| main.rs:109:25:109:40 | ...::args(...) | semmle.label | ...::args(...) | | main.rs:109:25:109:40 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | | main.rs:109:25:109:47 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | | main.rs:109:25:109:67 | ... .unwrap_or_default() | semmle.label | ... .unwrap_or_default() | -| main.rs:112:9:112:13 | ...::log | semmle.label | ...::log | | main.rs:112:15:112:35 | MacroExpr | semmle.label | MacroExpr | -| main.rs:113:9:113:13 | ...::log | semmle.label | ...::log | | main.rs:113:15:113:38 | MacroExpr | semmle.label | MacroExpr | -| main.rs:114:9:114:14 | ...::log | semmle.label | ...::log | | main.rs:114:16:114:37 | MacroExpr | semmle.label | MacroExpr | -| main.rs:115:9:115:14 | ...::log | semmle.label | ...::log | | main.rs:115:16:115:37 | MacroExpr | semmle.label | MacroExpr | -| main.rs:116:9:116:14 | ...::log | semmle.label | ...::log | | main.rs:116:16:116:37 | MacroExpr | semmle.label | MacroExpr | -| main.rs:119:9:119:13 | ...::log | semmle.label | ...::log | | main.rs:119:15:119:75 | MacroExpr | semmle.label | MacroExpr | | main.rs:127:13:127:21 | user_data | semmle.label | user_data | -| main.rs:127:25:127:37 | ...::var | semmle.label | ...::var | +| main.rs:127:25:127:45 | ...::var(...) | semmle.label | ...::var(...) | | main.rs:127:25:127:45 | ...::var(...) [Ok] | semmle.label | ...::var(...) [Ok] | | main.rs:127:25:127:65 | ... .unwrap_or_default() | semmle.label | ... .unwrap_or_default() | -| main.rs:130:9:130:16 | ...::_print | semmle.label | ...::_print | | main.rs:130:18:130:38 | MacroExpr | semmle.label | MacroExpr | -| main.rs:131:9:131:17 | ...::_eprint | semmle.label | ...::_eprint | | main.rs:131:19:131:49 | MacroExpr | semmle.label | MacroExpr | -| main.rs:140:32:140:59 | ...: Option::<...> | semmle.label | ...: Option::<...> | | main.rs:141:13:141:18 | m_path [Some] | semmle.label | m_path [Some] | | main.rs:141:22:141:27 | o_path | semmle.label | o_path | | main.rs:141:22:141:38 | o_path.map(...) [Some] | semmle.label | o_path.map(...) [Some] | | main.rs:141:34:141:34 | ... | semmle.label | ... | | main.rs:141:37:141:37 | x | semmle.label | x | -| main.rs:143:9:143:16 | ...::_print | semmle.label | ...::_print | | main.rs:143:18:143:40 | MacroExpr | semmle.label | MacroExpr | | main.rs:143:26:143:31 | m_path [Some] | semmle.label | m_path [Some] | | main.rs:143:26:143:40 | m_path.unwrap() | semmle.label | m_path.unwrap() | -| main.rs:150:28:150:30 | get | semmle.label | get | +| main.rs:150:32:150:48 | my_axum_handler_1 | semmle.label | my_axum_handler_1 | subpaths | main.rs:141:22:141:27 | o_path | main.rs:141:34:141:34 | ... | main.rs:141:37:141:37 | x | main.rs:141:22:141:38 | o_path.map(...) [Some] | diff --git a/rust/ql/test/query-tests/security/CWE-295/DisabledCertificateCheck.expected b/rust/ql/test/query-tests/security/CWE-295/DisabledCertificateCheck.expected index c807bc739fd0..922ebc6d2a3c 100644 --- a/rust/ql/test/query-tests/security/CWE-295/DisabledCertificateCheck.expected +++ b/rust/ql/test/query-tests/security/CWE-295/DisabledCertificateCheck.expected @@ -1,72 +1,63 @@ #select -| main.rs:4:4:4:30 | danger_accept_invalid_certs | main.rs:4:32:4:35 | true | main.rs:4:4:4:30 | danger_accept_invalid_certs | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | -| main.rs:9:4:9:34 | danger_accept_invalid_hostnames | main.rs:9:36:9:39 | true | main.rs:9:4:9:34 | danger_accept_invalid_hostnames | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | -| main.rs:16:4:16:30 | danger_accept_invalid_certs | main.rs:16:32:16:35 | true | main.rs:16:4:16:30 | danger_accept_invalid_certs | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | -| main.rs:17:4:17:34 | danger_accept_invalid_hostnames | main.rs:17:36:17:39 | true | main.rs:17:4:17:34 | danger_accept_invalid_hostnames | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | -| main.rs:37:4:37:30 | danger_accept_invalid_certs | main.rs:37:32:37:35 | true | main.rs:37:4:37:30 | danger_accept_invalid_certs | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | -| main.rs:42:4:42:34 | danger_accept_invalid_hostnames | main.rs:42:36:42:39 | true | main.rs:42:4:42:34 | danger_accept_invalid_hostnames | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | -| main.rs:47:4:47:30 | danger_accept_invalid_certs | main.rs:47:32:47:35 | true | main.rs:47:4:47:30 | danger_accept_invalid_certs | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | -| main.rs:48:4:48:34 | danger_accept_invalid_hostnames | main.rs:48:36:48:39 | true | main.rs:48:4:48:34 | danger_accept_invalid_hostnames | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | -| main.rs:55:4:55:30 | danger_accept_invalid_certs | main.rs:55:32:55:35 | true | main.rs:55:4:55:30 | danger_accept_invalid_certs | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | -| main.rs:56:4:56:34 | danger_accept_invalid_hostnames | main.rs:56:36:56:39 | true | main.rs:56:4:56:34 | danger_accept_invalid_hostnames | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | -| main.rs:83:4:83:30 | danger_accept_invalid_certs | main.rs:74:15:74:18 | true | main.rs:83:4:83:30 | danger_accept_invalid_certs | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | -| main.rs:88:4:88:30 | danger_accept_invalid_certs | main.rs:75:22:75:25 | true | main.rs:88:4:88:30 | danger_accept_invalid_certs | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | -| main.rs:93:4:93:30 | danger_accept_invalid_certs | main.rs:154:17:154:20 | true | main.rs:93:4:93:30 | danger_accept_invalid_certs | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | -| main.rs:109:4:109:34 | danger_accept_invalid_hostnames | main.rs:107:17:107:31 | ...::exists | main.rs:109:4:109:34 | danger_accept_invalid_hostnames | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | -| main.rs:115:4:115:34 | danger_accept_invalid_hostnames | main.rs:113:43:113:50 | metadata | main.rs:115:4:115:34 | danger_accept_invalid_hostnames | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | -| main.rs:121:4:121:34 | danger_accept_invalid_hostnames | main.rs:119:11:119:27 | ...::metadata | main.rs:121:4:121:34 | danger_accept_invalid_hostnames | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | -| main.rs:134:4:134:34 | danger_accept_invalid_hostnames | main.rs:129:14:129:27 | ...::stdin | main.rs:134:4:134:34 | danger_accept_invalid_hostnames | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | -| main.rs:146:4:146:34 | danger_accept_invalid_hostnames | main.rs:144:39:144:42 | true | main.rs:146:4:146:34 | danger_accept_invalid_hostnames | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:4:32:4:35 | true | main.rs:4:32:4:35 | true | main.rs:4:32:4:35 | true | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:9:36:9:39 | true | main.rs:9:36:9:39 | true | main.rs:9:36:9:39 | true | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:16:32:16:35 | true | main.rs:16:32:16:35 | true | main.rs:16:32:16:35 | true | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:17:36:17:39 | true | main.rs:17:36:17:39 | true | main.rs:17:36:17:39 | true | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:37:32:37:35 | true | main.rs:37:32:37:35 | true | main.rs:37:32:37:35 | true | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:42:36:42:39 | true | main.rs:42:36:42:39 | true | main.rs:42:36:42:39 | true | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:47:32:47:35 | true | main.rs:47:32:47:35 | true | main.rs:47:32:47:35 | true | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:48:36:48:39 | true | main.rs:48:36:48:39 | true | main.rs:48:36:48:39 | true | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:55:32:55:35 | true | main.rs:55:32:55:35 | true | main.rs:55:32:55:35 | true | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:56:36:56:39 | true | main.rs:56:36:56:39 | true | main.rs:56:36:56:39 | true | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:83:32:83:37 | always | main.rs:74:15:74:18 | true | main.rs:83:32:83:37 | always | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:88:32:88:40 | sometimes | main.rs:75:22:75:25 | true | main.rs:88:32:88:40 | sometimes | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:93:32:93:47 | sometimes_global | main.rs:154:17:154:20 | true | main.rs:93:32:93:47 | sometimes_global | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:109:36:109:37 | b1 | main.rs:107:17:107:42 | ...::exists(...) | main.rs:109:36:109:37 | b1 | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:115:36:115:37 | b2 | main.rs:113:11:113:52 | ... .metadata() | main.rs:115:36:115:37 | b2 | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:121:36:121:37 | b3 | main.rs:119:11:119:38 | ...::metadata(...) | main.rs:121:36:121:37 | b3 | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:134:36:134:37 | b4 | main.rs:129:14:129:29 | ...::stdin(...) | main.rs:134:36:134:37 | b4 | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:146:36:146:37 | b6 | main.rs:144:39:144:42 | true | main.rs:146:36:146:37 | b6 | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | edges -| main.rs:4:32:4:35 | true | main.rs:4:4:4:30 | danger_accept_invalid_certs | provenance | MaD:1 Sink:MaD:1 | -| main.rs:9:36:9:39 | true | main.rs:9:4:9:34 | danger_accept_invalid_hostnames | provenance | MaD:2 Sink:MaD:2 | -| main.rs:16:32:16:35 | true | main.rs:16:4:16:30 | danger_accept_invalid_certs | provenance | MaD:1 Sink:MaD:1 | -| main.rs:17:36:17:39 | true | main.rs:17:4:17:34 | danger_accept_invalid_hostnames | provenance | MaD:2 Sink:MaD:2 | -| main.rs:37:32:37:35 | true | main.rs:37:4:37:30 | danger_accept_invalid_certs | provenance | MaD:3 Sink:MaD:3 | -| main.rs:42:36:42:39 | true | main.rs:42:4:42:34 | danger_accept_invalid_hostnames | provenance | MaD:6 Sink:MaD:6 | -| main.rs:47:32:47:35 | true | main.rs:47:4:47:30 | danger_accept_invalid_certs | provenance | MaD:3 Sink:MaD:3 | -| main.rs:48:36:48:39 | true | main.rs:48:4:48:34 | danger_accept_invalid_hostnames | provenance | MaD:4 Sink:MaD:4 | -| main.rs:55:32:55:35 | true | main.rs:55:4:55:30 | danger_accept_invalid_certs | provenance | MaD:5 Sink:MaD:5 | -| main.rs:56:36:56:39 | true | main.rs:56:4:56:34 | danger_accept_invalid_hostnames | provenance | MaD:6 Sink:MaD:6 | -| main.rs:73:19:73:40 | ...: bool | main.rs:93:32:93:47 | sometimes_global | provenance | | -| main.rs:74:6:74:11 | always | main.rs:83:32:83:37 | always | provenance | | +| main.rs:4:32:4:35 | true | main.rs:4:32:4:35 | true | provenance | Sink:MaD:1 | +| main.rs:9:36:9:39 | true | main.rs:9:36:9:39 | true | provenance | Sink:MaD:2 | +| main.rs:16:32:16:35 | true | main.rs:16:32:16:35 | true | provenance | Sink:MaD:1 | +| main.rs:17:36:17:39 | true | main.rs:17:36:17:39 | true | provenance | Sink:MaD:2 | +| main.rs:37:32:37:35 | true | main.rs:37:32:37:35 | true | provenance | Sink:MaD:3 | +| main.rs:42:36:42:39 | true | main.rs:42:36:42:39 | true | provenance | Sink:MaD:6 | +| main.rs:47:32:47:35 | true | main.rs:47:32:47:35 | true | provenance | Sink:MaD:3 | +| main.rs:48:36:48:39 | true | main.rs:48:36:48:39 | true | provenance | Sink:MaD:4 | +| main.rs:55:32:55:35 | true | main.rs:55:32:55:35 | true | provenance | Sink:MaD:5 | +| main.rs:56:36:56:39 | true | main.rs:56:36:56:39 | true | provenance | Sink:MaD:6 | +| main.rs:73:19:73:40 | ...: bool | main.rs:93:32:93:47 | sometimes_global | provenance | Sink:MaD:1 | +| main.rs:74:6:74:11 | always | main.rs:83:32:83:37 | always | provenance | Sink:MaD:1 | | main.rs:74:15:74:18 | true | main.rs:74:6:74:11 | always | provenance | | -| main.rs:75:6:75:18 | mut sometimes | main.rs:88:32:88:40 | sometimes | provenance | | +| main.rs:75:6:75:18 | mut sometimes | main.rs:88:32:88:40 | sometimes | provenance | Sink:MaD:1 | | main.rs:75:22:75:25 | true | main.rs:75:6:75:18 | mut sometimes | provenance | | -| main.rs:83:32:83:37 | always | main.rs:83:4:83:30 | danger_accept_invalid_certs | provenance | MaD:1 Sink:MaD:1 | -| main.rs:88:32:88:40 | sometimes | main.rs:88:4:88:30 | danger_accept_invalid_certs | provenance | MaD:1 Sink:MaD:1 | -| main.rs:93:32:93:47 | sometimes_global | main.rs:93:4:93:30 | danger_accept_invalid_certs | provenance | MaD:1 Sink:MaD:1 | -| main.rs:107:6:107:7 | b1 | main.rs:109:36:109:37 | b1 | provenance | | -| main.rs:107:17:107:31 | ...::exists | main.rs:107:17:107:42 | ...::exists(...) [Ok] | provenance | Src:MaD:8 | +| main.rs:107:6:107:7 | b1 | main.rs:109:36:109:37 | b1 | provenance | Sink:MaD:2 | +| main.rs:107:17:107:42 | ...::exists(...) | main.rs:107:17:107:42 | ...::exists(...) [Ok] | provenance | Src:MaD:8 | | main.rs:107:17:107:42 | ...::exists(...) [Ok] | main.rs:107:17:107:51 | ... .unwrap() | provenance | MaD:12 | | main.rs:107:17:107:51 | ... .unwrap() | main.rs:107:6:107:7 | b1 | provenance | | -| main.rs:109:36:109:37 | b1 | main.rs:109:4:109:34 | danger_accept_invalid_hostnames | provenance | MaD:2 Sink:MaD:2 | -| main.rs:113:6:113:7 | b2 | main.rs:115:36:115:37 | b2 | provenance | | +| main.rs:113:6:113:7 | b2 | main.rs:115:36:115:37 | b2 | provenance | Sink:MaD:2 | +| main.rs:113:11:113:52 | ... .metadata() | main.rs:113:11:113:52 | ... .metadata() [Ok] | provenance | Src:MaD:7 | | main.rs:113:11:113:52 | ... .metadata() [Ok] | main.rs:113:11:113:61 | ... .unwrap() | provenance | MaD:12 | | main.rs:113:11:113:61 | ... .unwrap() | main.rs:113:11:113:71 | ... .is_file() | provenance | MaD:15 | | main.rs:113:11:113:71 | ... .is_file() | main.rs:113:6:113:7 | b2 | provenance | | -| main.rs:113:43:113:50 | metadata | main.rs:113:11:113:52 | ... .metadata() [Ok] | provenance | Src:MaD:7 | -| main.rs:115:36:115:37 | b2 | main.rs:115:4:115:34 | danger_accept_invalid_hostnames | provenance | MaD:2 Sink:MaD:2 | -| main.rs:119:6:119:7 | b3 | main.rs:121:36:121:37 | b3 | provenance | | -| main.rs:119:11:119:27 | ...::metadata | main.rs:119:11:119:38 | ...::metadata(...) [Ok] | provenance | Src:MaD:9 | +| main.rs:119:6:119:7 | b3 | main.rs:121:36:121:37 | b3 | provenance | Sink:MaD:2 | +| main.rs:119:11:119:38 | ...::metadata(...) | main.rs:119:11:119:38 | ...::metadata(...) [Ok] | provenance | Src:MaD:9 | | main.rs:119:11:119:38 | ...::metadata(...) [Ok] | main.rs:119:11:119:47 | ... .unwrap() | provenance | MaD:12 | | main.rs:119:11:119:47 | ... .unwrap() | main.rs:119:11:119:56 | ... .is_dir() | provenance | MaD:14 | | main.rs:119:11:119:56 | ... .is_dir() | main.rs:119:6:119:7 | b3 | provenance | | -| main.rs:121:36:121:37 | b3 | main.rs:121:4:121:34 | danger_accept_invalid_hostnames | provenance | MaD:2 Sink:MaD:2 | | main.rs:129:6:129:10 | input | main.rs:130:2:130:6 | input | provenance | | -| main.rs:129:14:129:27 | ...::stdin | main.rs:129:14:129:29 | ...::stdin(...) | provenance | Src:MaD:10 MaD:10 | -| main.rs:129:14:129:29 | ...::stdin(...) | main.rs:129:6:129:10 | input | provenance | | +| main.rs:129:14:129:29 | ...::stdin(...) | main.rs:129:6:129:10 | input | provenance | Src:MaD:10 | | main.rs:130:2:130:6 | input | main.rs:130:18:130:32 | [post] &mut input_line [&ref] | provenance | MaD:16 | | main.rs:130:18:130:32 | [post] &mut input_line [&ref] | main.rs:130:23:130:32 | [post] input_line | provenance | | | main.rs:130:23:130:32 | [post] input_line | main.rs:132:17:132:26 | input_line | provenance | | -| main.rs:132:6:132:7 | b4 | main.rs:134:36:134:37 | b4 | provenance | | +| main.rs:132:6:132:7 | b4 | main.rs:134:36:134:37 | b4 | provenance | Sink:MaD:2 | | main.rs:132:17:132:26 | input_line | main.rs:132:17:132:42 | input_line.parse() [Ok] | provenance | MaD:11 | | main.rs:132:17:132:42 | input_line.parse() [Ok] | main.rs:132:17:132:59 | ... .unwrap_or(...) | provenance | MaD:13 | | main.rs:132:17:132:59 | ... .unwrap_or(...) | main.rs:132:6:132:7 | b4 | provenance | | -| main.rs:134:36:134:37 | b4 | main.rs:134:4:134:34 | danger_accept_invalid_hostnames | provenance | MaD:2 Sink:MaD:2 | -| main.rs:144:6:144:7 | b6 | main.rs:146:36:146:37 | b6 | provenance | | +| main.rs:144:6:144:7 | b6 | main.rs:146:36:146:37 | b6 | provenance | Sink:MaD:2 | | main.rs:144:39:144:42 | true | main.rs:144:6:144:7 | b6 | provenance | | -| main.rs:146:36:146:37 | b6 | main.rs:146:4:146:34 | danger_accept_invalid_hostnames | provenance | MaD:2 Sink:MaD:2 | | main.rs:154:17:154:20 | true | main.rs:73:19:73:40 | ...: bool | provenance | | models | 1 | Sink: ::danger_accept_invalid_certs; Argument[0]; disable-certificate | @@ -86,59 +77,52 @@ models | 15 | Summary: ::is_file; Argument[self].Reference; ReturnValue; taint | | 16 | Summary: ::read_line; Argument[self].Reference; Argument[0].Reference; taint | nodes -| main.rs:4:4:4:30 | danger_accept_invalid_certs | semmle.label | danger_accept_invalid_certs | | main.rs:4:32:4:35 | true | semmle.label | true | -| main.rs:9:4:9:34 | danger_accept_invalid_hostnames | semmle.label | danger_accept_invalid_hostnames | +| main.rs:4:32:4:35 | true | semmle.label | true | +| main.rs:9:36:9:39 | true | semmle.label | true | | main.rs:9:36:9:39 | true | semmle.label | true | -| main.rs:16:4:16:30 | danger_accept_invalid_certs | semmle.label | danger_accept_invalid_certs | | main.rs:16:32:16:35 | true | semmle.label | true | -| main.rs:17:4:17:34 | danger_accept_invalid_hostnames | semmle.label | danger_accept_invalid_hostnames | +| main.rs:16:32:16:35 | true | semmle.label | true | | main.rs:17:36:17:39 | true | semmle.label | true | -| main.rs:37:4:37:30 | danger_accept_invalid_certs | semmle.label | danger_accept_invalid_certs | +| main.rs:17:36:17:39 | true | semmle.label | true | +| main.rs:37:32:37:35 | true | semmle.label | true | | main.rs:37:32:37:35 | true | semmle.label | true | -| main.rs:42:4:42:34 | danger_accept_invalid_hostnames | semmle.label | danger_accept_invalid_hostnames | | main.rs:42:36:42:39 | true | semmle.label | true | -| main.rs:47:4:47:30 | danger_accept_invalid_certs | semmle.label | danger_accept_invalid_certs | +| main.rs:42:36:42:39 | true | semmle.label | true | +| main.rs:47:32:47:35 | true | semmle.label | true | | main.rs:47:32:47:35 | true | semmle.label | true | -| main.rs:48:4:48:34 | danger_accept_invalid_hostnames | semmle.label | danger_accept_invalid_hostnames | | main.rs:48:36:48:39 | true | semmle.label | true | -| main.rs:55:4:55:30 | danger_accept_invalid_certs | semmle.label | danger_accept_invalid_certs | +| main.rs:48:36:48:39 | true | semmle.label | true | | main.rs:55:32:55:35 | true | semmle.label | true | -| main.rs:56:4:56:34 | danger_accept_invalid_hostnames | semmle.label | danger_accept_invalid_hostnames | +| main.rs:55:32:55:35 | true | semmle.label | true | +| main.rs:56:36:56:39 | true | semmle.label | true | | main.rs:56:36:56:39 | true | semmle.label | true | | main.rs:73:19:73:40 | ...: bool | semmle.label | ...: bool | | main.rs:74:6:74:11 | always | semmle.label | always | | main.rs:74:15:74:18 | true | semmle.label | true | | main.rs:75:6:75:18 | mut sometimes | semmle.label | mut sometimes | | main.rs:75:22:75:25 | true | semmle.label | true | -| main.rs:83:4:83:30 | danger_accept_invalid_certs | semmle.label | danger_accept_invalid_certs | | main.rs:83:32:83:37 | always | semmle.label | always | -| main.rs:88:4:88:30 | danger_accept_invalid_certs | semmle.label | danger_accept_invalid_certs | | main.rs:88:32:88:40 | sometimes | semmle.label | sometimes | -| main.rs:93:4:93:30 | danger_accept_invalid_certs | semmle.label | danger_accept_invalid_certs | | main.rs:93:32:93:47 | sometimes_global | semmle.label | sometimes_global | | main.rs:107:6:107:7 | b1 | semmle.label | b1 | -| main.rs:107:17:107:31 | ...::exists | semmle.label | ...::exists | +| main.rs:107:17:107:42 | ...::exists(...) | semmle.label | ...::exists(...) | | main.rs:107:17:107:42 | ...::exists(...) [Ok] | semmle.label | ...::exists(...) [Ok] | | main.rs:107:17:107:51 | ... .unwrap() | semmle.label | ... .unwrap() | -| main.rs:109:4:109:34 | danger_accept_invalid_hostnames | semmle.label | danger_accept_invalid_hostnames | | main.rs:109:36:109:37 | b1 | semmle.label | b1 | | main.rs:113:6:113:7 | b2 | semmle.label | b2 | +| main.rs:113:11:113:52 | ... .metadata() | semmle.label | ... .metadata() | | main.rs:113:11:113:52 | ... .metadata() [Ok] | semmle.label | ... .metadata() [Ok] | | main.rs:113:11:113:61 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:113:11:113:71 | ... .is_file() | semmle.label | ... .is_file() | -| main.rs:113:43:113:50 | metadata | semmle.label | metadata | -| main.rs:115:4:115:34 | danger_accept_invalid_hostnames | semmle.label | danger_accept_invalid_hostnames | | main.rs:115:36:115:37 | b2 | semmle.label | b2 | | main.rs:119:6:119:7 | b3 | semmle.label | b3 | -| main.rs:119:11:119:27 | ...::metadata | semmle.label | ...::metadata | +| main.rs:119:11:119:38 | ...::metadata(...) | semmle.label | ...::metadata(...) | | main.rs:119:11:119:38 | ...::metadata(...) [Ok] | semmle.label | ...::metadata(...) [Ok] | | main.rs:119:11:119:47 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:119:11:119:56 | ... .is_dir() | semmle.label | ... .is_dir() | -| main.rs:121:4:121:34 | danger_accept_invalid_hostnames | semmle.label | danger_accept_invalid_hostnames | | main.rs:121:36:121:37 | b3 | semmle.label | b3 | | main.rs:129:6:129:10 | input | semmle.label | input | -| main.rs:129:14:129:27 | ...::stdin | semmle.label | ...::stdin | | main.rs:129:14:129:29 | ...::stdin(...) | semmle.label | ...::stdin(...) | | main.rs:130:2:130:6 | input | semmle.label | input | | main.rs:130:18:130:32 | [post] &mut input_line [&ref] | semmle.label | [post] &mut input_line [&ref] | @@ -147,11 +131,9 @@ nodes | main.rs:132:17:132:26 | input_line | semmle.label | input_line | | main.rs:132:17:132:42 | input_line.parse() [Ok] | semmle.label | input_line.parse() [Ok] | | main.rs:132:17:132:59 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | -| main.rs:134:4:134:34 | danger_accept_invalid_hostnames | semmle.label | danger_accept_invalid_hostnames | | main.rs:134:36:134:37 | b4 | semmle.label | b4 | | main.rs:144:6:144:7 | b6 | semmle.label | b6 | | main.rs:144:39:144:42 | true | semmle.label | true | -| main.rs:146:4:146:34 | danger_accept_invalid_hostnames | semmle.label | danger_accept_invalid_hostnames | | main.rs:146:36:146:37 | b6 | semmle.label | b6 | | main.rs:154:17:154:20 | true | semmle.label | true | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-311/CleartextTransmission.expected b/rust/ql/test/query-tests/security/CWE-311/CleartextTransmission.expected index 5807220eef0c..9a12c86d010f 100644 --- a/rust/ql/test/query-tests/security/CWE-311/CleartextTransmission.expected +++ b/rust/ql/test/query-tests/security/CWE-311/CleartextTransmission.expected @@ -1,50 +1,45 @@ #select -| main.rs:7:5:7:26 | ...::get | main.rs:6:50:6:57 | password | main.rs:7:5:7:26 | ...::get | This '...::get' operation transmits data which may contain unencrypted sensitive data from $@. | main.rs:6:50:6:57 | password | password | -| main.rs:14:5:14:26 | ...::get | main.rs:12:50:12:57 | password | main.rs:14:5:14:26 | ...::get | This '...::get' operation transmits data which may contain unencrypted sensitive data from $@. | main.rs:12:50:12:57 | password | password | -| main.rs:21:12:21:15 | post | main.rs:19:50:19:57 | password | main.rs:21:12:21:15 | post | This 'post' operation transmits data which may contain unencrypted sensitive data from $@. | main.rs:19:50:19:57 | password | password | -| main.rs:28:12:28:18 | request | main.rs:26:50:26:57 | password | main.rs:28:12:28:18 | request | This 'request' operation transmits data which may contain unencrypted sensitive data from $@. | main.rs:26:50:26:57 | password | password | -| main.rs:35:12:35:18 | request | main.rs:33:50:33:57 | password | main.rs:35:12:35:18 | request | This 'request' operation transmits data which may contain unencrypted sensitive data from $@. | main.rs:33:50:33:57 | password | password | +| main.rs:7:28:7:30 | url | main.rs:6:50:6:57 | password | main.rs:7:28:7:30 | url | This 'url' operation transmits data which may contain unencrypted sensitive data from $@. | main.rs:6:50:6:57 | password | password | +| main.rs:14:28:14:30 | url | main.rs:12:50:12:57 | password | main.rs:14:28:14:30 | url | This 'url' operation transmits data which may contain unencrypted sensitive data from $@. | main.rs:12:50:12:57 | password | password | +| main.rs:21:17:21:19 | url | main.rs:19:50:19:57 | password | main.rs:21:17:21:19 | url | This 'url' operation transmits data which may contain unencrypted sensitive data from $@. | main.rs:19:50:19:57 | password | password | +| main.rs:28:33:28:35 | url | main.rs:26:50:26:57 | password | main.rs:28:33:28:35 | url | This 'url' operation transmits data which may contain unencrypted sensitive data from $@. | main.rs:26:50:26:57 | password | password | +| main.rs:35:33:35:35 | url | main.rs:33:50:33:57 | password | main.rs:35:33:35:35 | url | This 'url' operation transmits data which may contain unencrypted sensitive data from $@. | main.rs:33:50:33:57 | password | password | edges -| main.rs:6:9:6:11 | url | main.rs:7:28:7:30 | url | provenance | | +| main.rs:6:9:6:11 | url | main.rs:7:28:7:30 | url | provenance | Sink:MaD:4 | | main.rs:6:23:6:57 | ...::format(...) | main.rs:6:23:6:57 | { ... } | provenance | | | main.rs:6:23:6:57 | ...::must_use(...) | main.rs:6:9:6:11 | url | provenance | | | main.rs:6:23:6:57 | MacroExpr | main.rs:6:23:6:57 | ...::format(...) | provenance | MaD:7 | | main.rs:6:23:6:57 | { ... } | main.rs:6:23:6:57 | ...::must_use(...) | provenance | MaD:8 | | main.rs:6:50:6:57 | password | main.rs:6:23:6:57 | MacroExpr | provenance | | -| main.rs:7:28:7:30 | url | main.rs:7:5:7:26 | ...::get | provenance | MaD:4 Sink:MaD:4 | | main.rs:12:9:12:15 | address | main.rs:13:27:13:33 | address | provenance | | | main.rs:12:27:12:59 | ...::format(...) | main.rs:12:27:12:59 | { ... } | provenance | | | main.rs:12:27:12:59 | ...::must_use(...) | main.rs:12:9:12:15 | address | provenance | | | main.rs:12:27:12:59 | MacroExpr | main.rs:12:27:12:59 | ...::format(...) | provenance | MaD:7 | | main.rs:12:27:12:59 | { ... } | main.rs:12:27:12:59 | ...::must_use(...) | provenance | MaD:8 | | main.rs:12:50:12:57 | password | main.rs:12:27:12:59 | MacroExpr | provenance | | -| main.rs:13:9:13:11 | url | main.rs:14:28:14:30 | url | provenance | | +| main.rs:13:9:13:11 | url | main.rs:14:28:14:30 | url | provenance | Sink:MaD:4 | | main.rs:13:15:13:34 | ...::parse(...) [Ok] | main.rs:13:15:13:43 | ... .unwrap() | provenance | MaD:5 | | main.rs:13:15:13:43 | ... .unwrap() | main.rs:13:9:13:11 | url | provenance | | | main.rs:13:26:13:33 | &address [&ref] | main.rs:13:15:13:34 | ...::parse(...) [Ok] | provenance | MaD:6 | | main.rs:13:27:13:33 | address | main.rs:13:26:13:33 | &address [&ref] | provenance | | -| main.rs:14:28:14:30 | url | main.rs:14:5:14:26 | ...::get | provenance | MaD:4 Sink:MaD:4 | -| main.rs:19:9:19:11 | url | main.rs:21:17:21:19 | url | provenance | | +| main.rs:19:9:19:11 | url | main.rs:21:17:21:19 | url | provenance | Sink:MaD:1 | | main.rs:19:23:19:57 | ...::format(...) | main.rs:19:23:19:57 | { ... } | provenance | | | main.rs:19:23:19:57 | ...::must_use(...) | main.rs:19:9:19:11 | url | provenance | | | main.rs:19:23:19:57 | MacroExpr | main.rs:19:23:19:57 | ...::format(...) | provenance | MaD:7 | | main.rs:19:23:19:57 | { ... } | main.rs:19:23:19:57 | ...::must_use(...) | provenance | MaD:8 | | main.rs:19:50:19:57 | password | main.rs:19:23:19:57 | MacroExpr | provenance | | -| main.rs:21:17:21:19 | url | main.rs:21:12:21:15 | post | provenance | MaD:1 Sink:MaD:1 | -| main.rs:26:9:26:11 | url | main.rs:28:33:28:35 | url | provenance | | +| main.rs:26:9:26:11 | url | main.rs:28:33:28:35 | url | provenance | Sink:MaD:3 | | main.rs:26:23:26:57 | ...::format(...) | main.rs:26:23:26:57 | { ... } | provenance | | | main.rs:26:23:26:57 | ...::must_use(...) | main.rs:26:9:26:11 | url | provenance | | | main.rs:26:23:26:57 | MacroExpr | main.rs:26:23:26:57 | ...::format(...) | provenance | MaD:7 | | main.rs:26:23:26:57 | { ... } | main.rs:26:23:26:57 | ...::must_use(...) | provenance | MaD:8 | | main.rs:26:50:26:57 | password | main.rs:26:23:26:57 | MacroExpr | provenance | | -| main.rs:28:33:28:35 | url | main.rs:28:12:28:18 | request | provenance | MaD:3 Sink:MaD:3 | -| main.rs:33:9:33:11 | url | main.rs:35:33:35:35 | url | provenance | | +| main.rs:33:9:33:11 | url | main.rs:35:33:35:35 | url | provenance | Sink:MaD:2 | | main.rs:33:23:33:57 | ...::format(...) | main.rs:33:23:33:57 | { ... } | provenance | | | main.rs:33:23:33:57 | ...::must_use(...) | main.rs:33:9:33:11 | url | provenance | | | main.rs:33:23:33:57 | MacroExpr | main.rs:33:23:33:57 | ...::format(...) | provenance | MaD:7 | | main.rs:33:23:33:57 | { ... } | main.rs:33:23:33:57 | ...::must_use(...) | provenance | MaD:8 | | main.rs:33:50:33:57 | password | main.rs:33:23:33:57 | MacroExpr | provenance | | -| main.rs:35:33:35:35 | url | main.rs:35:12:35:18 | request | provenance | MaD:2 Sink:MaD:2 | models | 1 | Sink: ::post; Argument[0]; request-url | | 2 | Sink: ::request; Argument[1]; request-url | @@ -61,7 +56,6 @@ nodes | main.rs:6:23:6:57 | MacroExpr | semmle.label | MacroExpr | | main.rs:6:23:6:57 | { ... } | semmle.label | { ... } | | main.rs:6:50:6:57 | password | semmle.label | password | -| main.rs:7:5:7:26 | ...::get | semmle.label | ...::get | | main.rs:7:28:7:30 | url | semmle.label | url | | main.rs:12:9:12:15 | address | semmle.label | address | | main.rs:12:27:12:59 | ...::format(...) | semmle.label | ...::format(...) | @@ -74,7 +68,6 @@ nodes | main.rs:13:15:13:43 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:13:26:13:33 | &address [&ref] | semmle.label | &address [&ref] | | main.rs:13:27:13:33 | address | semmle.label | address | -| main.rs:14:5:14:26 | ...::get | semmle.label | ...::get | | main.rs:14:28:14:30 | url | semmle.label | url | | main.rs:19:9:19:11 | url | semmle.label | url | | main.rs:19:23:19:57 | ...::format(...) | semmle.label | ...::format(...) | @@ -82,7 +75,6 @@ nodes | main.rs:19:23:19:57 | MacroExpr | semmle.label | MacroExpr | | main.rs:19:23:19:57 | { ... } | semmle.label | { ... } | | main.rs:19:50:19:57 | password | semmle.label | password | -| main.rs:21:12:21:15 | post | semmle.label | post | | main.rs:21:17:21:19 | url | semmle.label | url | | main.rs:26:9:26:11 | url | semmle.label | url | | main.rs:26:23:26:57 | ...::format(...) | semmle.label | ...::format(...) | @@ -90,7 +82,6 @@ nodes | main.rs:26:23:26:57 | MacroExpr | semmle.label | MacroExpr | | main.rs:26:23:26:57 | { ... } | semmle.label | { ... } | | main.rs:26:50:26:57 | password | semmle.label | password | -| main.rs:28:12:28:18 | request | semmle.label | request | | main.rs:28:33:28:35 | url | semmle.label | url | | main.rs:33:9:33:11 | url | semmle.label | url | | main.rs:33:23:33:57 | ...::format(...) | semmle.label | ...::format(...) | @@ -98,6 +89,5 @@ nodes | main.rs:33:23:33:57 | MacroExpr | semmle.label | MacroExpr | | main.rs:33:23:33:57 | { ... } | semmle.label | { ... } | | main.rs:33:50:33:57 | password | semmle.label | password | -| main.rs:35:12:35:18 | request | semmle.label | request | | main.rs:35:33:35:35 | url | semmle.label | url | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected index 61de9de03b58..3a96605753f6 100644 --- a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected +++ b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected @@ -1,167 +1,140 @@ #select -| test_logging.rs:42:5:42:10 | ...::log | test_logging.rs:42:28:42:35 | password | test_logging.rs:42:5:42:10 | ...::log | This operation writes $@ to a log file. | test_logging.rs:42:28:42:35 | password | password | -| test_logging.rs:43:5:43:10 | ...::log | test_logging.rs:43:28:43:35 | password | test_logging.rs:43:5:43:10 | ...::log | This operation writes $@ to a log file. | test_logging.rs:43:28:43:35 | password | password | -| test_logging.rs:44:5:44:9 | ...::log | test_logging.rs:44:27:44:34 | password | test_logging.rs:44:5:44:9 | ...::log | This operation writes $@ to a log file. | test_logging.rs:44:27:44:34 | password | password | -| test_logging.rs:45:5:45:10 | ...::log | test_logging.rs:45:28:45:35 | password | test_logging.rs:45:5:45:10 | ...::log | This operation writes $@ to a log file. | test_logging.rs:45:28:45:35 | password | password | -| test_logging.rs:46:5:46:9 | ...::log | test_logging.rs:46:27:46:34 | password | test_logging.rs:46:5:46:9 | ...::log | This operation writes $@ to a log file. | test_logging.rs:46:27:46:34 | password | password | -| test_logging.rs:47:5:47:8 | ...::log | test_logging.rs:47:40:47:47 | password | test_logging.rs:47:5:47:8 | ...::log | This operation writes $@ to a log file. | test_logging.rs:47:40:47:47 | password | password | -| test_logging.rs:52:5:52:10 | ...::log | test_logging.rs:52:28:52:35 | password | test_logging.rs:52:5:52:10 | ...::log | This operation writes $@ to a log file. | test_logging.rs:52:28:52:35 | password | password | -| test_logging.rs:54:5:54:10 | ...::log | test_logging.rs:54:41:54:48 | password | test_logging.rs:54:5:54:10 | ...::log | This operation writes $@ to a log file. | test_logging.rs:54:41:54:48 | password | password | -| test_logging.rs:56:5:56:10 | ...::log | test_logging.rs:56:39:56:46 | password | test_logging.rs:56:5:56:10 | ...::log | This operation writes $@ to a log file. | test_logging.rs:56:39:56:46 | password | password | -| test_logging.rs:57:5:57:10 | ...::log | test_logging.rs:57:24:57:31 | password | test_logging.rs:57:5:57:10 | ...::log | This operation writes $@ to a log file. | test_logging.rs:57:24:57:31 | password | password | -| test_logging.rs:58:5:58:10 | ...::log | test_logging.rs:58:24:58:31 | password | test_logging.rs:58:5:58:10 | ...::log | This operation writes $@ to a log file. | test_logging.rs:58:24:58:31 | password | password | -| test_logging.rs:60:5:60:10 | ...::log | test_logging.rs:60:46:60:53 | password | test_logging.rs:60:5:60:10 | ...::log | This operation writes $@ to a log file. | test_logging.rs:60:46:60:53 | password | password | -| test_logging.rs:61:5:61:10 | ...::log | test_logging.rs:61:21:61:28 | password | test_logging.rs:61:5:61:10 | ...::log | This operation writes $@ to a log file. | test_logging.rs:61:21:61:28 | password | password | -| test_logging.rs:65:5:65:8 | ...::log | test_logging.rs:65:40:65:47 | password | test_logging.rs:65:5:65:8 | ...::log | This operation writes $@ to a log file. | test_logging.rs:65:40:65:47 | password | password | -| test_logging.rs:67:5:67:8 | ...::log | test_logging.rs:67:58:67:65 | password | test_logging.rs:67:5:67:8 | ...::log | This operation writes $@ to a log file. | test_logging.rs:67:58:67:65 | password | password | -| test_logging.rs:68:5:68:8 | ...::log | test_logging.rs:68:19:68:26 | password | test_logging.rs:68:5:68:8 | ...::log | This operation writes $@ to a log file. | test_logging.rs:68:19:68:26 | password | password | -| test_logging.rs:72:5:72:10 | ...::log | test_logging.rs:72:39:72:46 | password | test_logging.rs:72:5:72:10 | ...::log | This operation writes $@ to a log file. | test_logging.rs:72:39:72:46 | password | password | -| test_logging.rs:74:5:74:10 | ...::log | test_logging.rs:74:57:74:64 | password | test_logging.rs:74:5:74:10 | ...::log | This operation writes $@ to a log file. | test_logging.rs:74:57:74:64 | password | password | -| test_logging.rs:75:5:75:10 | ...::log | test_logging.rs:75:21:75:28 | password | test_logging.rs:75:5:75:10 | ...::log | This operation writes $@ to a log file. | test_logging.rs:75:21:75:28 | password | password | -| test_logging.rs:76:5:76:10 | ...::log | test_logging.rs:76:39:76:46 | password | test_logging.rs:76:5:76:10 | ...::log | This operation writes $@ to a log file. | test_logging.rs:76:39:76:46 | password | password | -| test_logging.rs:82:5:82:10 | ...::log | test_logging.rs:82:36:82:43 | password | test_logging.rs:82:5:82:10 | ...::log | This operation writes $@ to a log file. | test_logging.rs:82:36:82:43 | password | password | -| test_logging.rs:84:5:84:10 | ...::log | test_logging.rs:84:54:84:61 | password | test_logging.rs:84:5:84:10 | ...::log | This operation writes $@ to a log file. | test_logging.rs:84:54:84:61 | password | password | -| test_logging.rs:85:5:85:10 | ...::log | test_logging.rs:85:21:85:28 | password | test_logging.rs:85:5:85:10 | ...::log | This operation writes $@ to a log file. | test_logging.rs:85:21:85:28 | password | password | -| test_logging.rs:86:5:86:10 | ...::log | test_logging.rs:86:36:86:43 | password | test_logging.rs:86:5:86:10 | ...::log | This operation writes $@ to a log file. | test_logging.rs:86:36:86:43 | password | password | -| test_logging.rs:94:5:94:9 | ...::log | test_logging.rs:93:15:93:22 | password | test_logging.rs:94:5:94:9 | ...::log | This operation writes $@ to a log file. | test_logging.rs:93:15:93:22 | password | password | -| test_logging.rs:97:5:97:9 | ...::log | test_logging.rs:96:42:96:49 | password | test_logging.rs:97:5:97:9 | ...::log | This operation writes $@ to a log file. | test_logging.rs:96:42:96:49 | password | password | -| test_logging.rs:100:5:100:9 | ...::log | test_logging.rs:99:38:99:45 | password | test_logging.rs:100:5:100:9 | ...::log | This operation writes $@ to a log file. | test_logging.rs:99:38:99:45 | password | password | -| test_logging.rs:118:5:118:10 | ...::log | test_logging.rs:118:28:118:41 | get_password(...) | test_logging.rs:118:5:118:10 | ...::log | This operation writes $@ to a log file. | test_logging.rs:118:28:118:41 | get_password(...) | get_password(...) | -| test_logging.rs:131:5:131:10 | ...::log | test_logging.rs:129:25:129:32 | password | test_logging.rs:131:5:131:10 | ...::log | This operation writes $@ to a log file. | test_logging.rs:129:25:129:32 | password | password | -| test_logging.rs:141:5:141:9 | ...::log | test_logging.rs:141:27:141:37 | s1.password | test_logging.rs:141:5:141:9 | ...::log | This operation writes $@ to a log file. | test_logging.rs:141:27:141:37 | s1.password | s1.password | -| test_logging.rs:151:5:151:9 | ...::log | test_logging.rs:151:27:151:37 | s2.password | test_logging.rs:151:5:151:9 | ...::log | This operation writes $@ to a log file. | test_logging.rs:151:27:151:37 | s2.password | s2.password | -| test_logging.rs:176:22:176:31 | log_expect | test_logging.rs:176:70:176:78 | password2 | test_logging.rs:176:22:176:31 | log_expect | This operation writes $@ to a log file. | test_logging.rs:176:70:176:78 | password2 | password2 | -| test_logging.rs:180:24:180:33 | log_expect | test_logging.rs:180:72:180:80 | password2 | test_logging.rs:180:24:180:33 | log_expect | This operation writes $@ to a log file. | test_logging.rs:180:72:180:80 | password2 | password2 | -| test_logging.rs:184:25:184:34 | log_expect | test_logging.rs:183:51:183:59 | password2 | test_logging.rs:184:25:184:34 | log_expect | This operation writes $@ to a log file. | test_logging.rs:183:51:183:59 | password2 | password2 | -| test_logging.rs:188:25:188:34 | log_unwrap | test_logging.rs:187:51:187:59 | password2 | test_logging.rs:188:25:188:34 | log_unwrap | This operation writes $@ to a log file. | test_logging.rs:187:51:187:59 | password2 | password2 | -| test_logging.rs:192:5:192:10 | ...::_print | test_logging.rs:192:30:192:37 | password | test_logging.rs:192:5:192:10 | ...::_print | This operation writes $@ to a log file. | test_logging.rs:192:30:192:37 | password | password | -| test_logging.rs:193:5:193:12 | ...::_print | test_logging.rs:193:30:193:37 | password | test_logging.rs:193:5:193:12 | ...::_print | This operation writes $@ to a log file. | test_logging.rs:193:30:193:37 | password | password | -| test_logging.rs:194:5:194:11 | ...::_eprint | test_logging.rs:194:31:194:38 | password | test_logging.rs:194:5:194:11 | ...::_eprint | This operation writes $@ to a log file. | test_logging.rs:194:31:194:38 | password | password | -| test_logging.rs:195:5:195:13 | ...::_eprint | test_logging.rs:195:31:195:38 | password | test_logging.rs:195:5:195:13 | ...::_eprint | This operation writes $@ to a log file. | test_logging.rs:195:31:195:38 | password | password | -| test_logging.rs:199:13:199:18 | ...::panic_fmt | test_logging.rs:199:36:199:43 | password | test_logging.rs:199:13:199:18 | ...::panic_fmt | This operation writes $@ to a log file. | test_logging.rs:199:36:199:43 | password | password | -| test_logging.rs:202:13:202:17 | ...::panic_fmt | test_logging.rs:202:35:202:42 | password | test_logging.rs:202:13:202:17 | ...::panic_fmt | This operation writes $@ to a log file. | test_logging.rs:202:35:202:42 | password | password | -| test_logging.rs:205:13:205:26 | ...::panic_fmt | test_logging.rs:205:44:205:51 | password | test_logging.rs:205:13:205:26 | ...::panic_fmt | This operation writes $@ to a log file. | test_logging.rs:205:44:205:51 | password | password | -| test_logging.rs:208:13:208:24 | ...::panic_fmt | test_logging.rs:208:42:208:49 | password | test_logging.rs:208:13:208:24 | ...::panic_fmt | This operation writes $@ to a log file. | test_logging.rs:208:42:208:49 | password | password | -| test_logging.rs:211:13:211:19 | ...::panic_fmt | test_logging.rs:211:44:211:51 | password | test_logging.rs:211:13:211:19 | ...::panic_fmt | This operation writes $@ to a log file. | test_logging.rs:211:44:211:51 | password | password | -| test_logging.rs:214:13:214:22 | ...::assert_failed | test_logging.rs:214:46:214:53 | password | test_logging.rs:214:13:214:22 | ...::assert_failed | This operation writes $@ to a log file. | test_logging.rs:214:46:214:53 | password | password | -| test_logging.rs:217:13:217:22 | ...::assert_failed | test_logging.rs:217:46:217:53 | password | test_logging.rs:217:13:217:22 | ...::assert_failed | This operation writes $@ to a log file. | test_logging.rs:217:46:217:53 | password | password | -| test_logging.rs:220:13:220:25 | ...::panic_fmt | test_logging.rs:220:50:220:57 | password | test_logging.rs:220:13:220:25 | ...::panic_fmt | This operation writes $@ to a log file. | test_logging.rs:220:50:220:57 | password | password | -| test_logging.rs:223:13:223:28 | ...::assert_failed | test_logging.rs:223:52:223:59 | password | test_logging.rs:223:13:223:28 | ...::assert_failed | This operation writes $@ to a log file. | test_logging.rs:223:52:223:59 | password | password | -| test_logging.rs:226:13:226:28 | ...::assert_failed | test_logging.rs:226:52:226:59 | password | test_logging.rs:226:13:226:28 | ...::assert_failed | This operation writes $@ to a log file. | test_logging.rs:226:52:226:59 | password | password | -| test_logging.rs:229:23:229:28 | expect | test_logging.rs:229:54:229:61 | password | test_logging.rs:229:23:229:28 | expect | This operation writes $@ to a log file. | test_logging.rs:229:54:229:61 | password | password | -| test_logging.rs:242:10:242:14 | write | test_logging.rs:242:42:242:49 | password | test_logging.rs:242:10:242:14 | write | This operation writes $@ to a log file. | test_logging.rs:242:42:242:49 | password | password | -| test_logging.rs:245:10:245:18 | write_all | test_logging.rs:245:46:245:53 | password | test_logging.rs:245:10:245:18 | write_all | This operation writes $@ to a log file. | test_logging.rs:245:46:245:53 | password | password | -| test_logging.rs:248:9:248:13 | write | test_logging.rs:248:41:248:48 | password | test_logging.rs:248:9:248:13 | write | This operation writes $@ to a log file. | test_logging.rs:248:41:248:48 | password | password | -| test_logging.rs:251:9:251:13 | write | test_logging.rs:251:41:251:48 | password | test_logging.rs:251:9:251:13 | write | This operation writes $@ to a log file. | test_logging.rs:251:41:251:48 | password | password | +| test_logging.rs:42:12:42:35 | MacroExpr | test_logging.rs:42:28:42:35 | password | test_logging.rs:42:12:42:35 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:42:28:42:35 | password | password | +| test_logging.rs:43:12:43:35 | MacroExpr | test_logging.rs:43:28:43:35 | password | test_logging.rs:43:12:43:35 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:43:28:43:35 | password | password | +| test_logging.rs:44:11:44:34 | MacroExpr | test_logging.rs:44:27:44:34 | password | test_logging.rs:44:11:44:34 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:44:27:44:34 | password | password | +| test_logging.rs:45:12:45:35 | MacroExpr | test_logging.rs:45:28:45:35 | password | test_logging.rs:45:12:45:35 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:45:28:45:35 | password | password | +| test_logging.rs:46:11:46:34 | MacroExpr | test_logging.rs:46:27:46:34 | password | test_logging.rs:46:11:46:34 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:46:27:46:34 | password | password | +| test_logging.rs:47:24:47:47 | MacroExpr | test_logging.rs:47:40:47:47 | password | test_logging.rs:47:24:47:47 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:47:40:47:47 | password | password | +| test_logging.rs:52:12:52:35 | MacroExpr | test_logging.rs:52:28:52:35 | password | test_logging.rs:52:12:52:35 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:52:28:52:35 | password | password | +| test_logging.rs:54:12:54:48 | MacroExpr | test_logging.rs:54:41:54:48 | password | test_logging.rs:54:12:54:48 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:54:41:54:48 | password | password | +| test_logging.rs:56:12:56:46 | MacroExpr | test_logging.rs:56:39:56:46 | password | test_logging.rs:56:12:56:46 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:56:39:56:46 | password | password | +| test_logging.rs:57:12:57:33 | MacroExpr | test_logging.rs:57:24:57:31 | password | test_logging.rs:57:12:57:33 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:57:24:57:31 | password | password | +| test_logging.rs:58:12:58:35 | MacroExpr | test_logging.rs:58:24:58:31 | password | test_logging.rs:58:12:58:35 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:58:24:58:31 | password | password | +| test_logging.rs:60:30:60:53 | MacroExpr | test_logging.rs:60:46:60:53 | password | test_logging.rs:60:30:60:53 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:60:46:60:53 | password | password | +| test_logging.rs:61:20:61:28 | &... | test_logging.rs:61:21:61:28 | password | test_logging.rs:61:20:61:28 | &... | This operation writes $@ to a log file. | test_logging.rs:61:21:61:28 | password | password | +| test_logging.rs:65:24:65:47 | MacroExpr | test_logging.rs:65:40:65:47 | password | test_logging.rs:65:24:65:47 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:65:40:65:47 | password | password | +| test_logging.rs:67:42:67:65 | MacroExpr | test_logging.rs:67:58:67:65 | password | test_logging.rs:67:42:67:65 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:67:58:67:65 | password | password | +| test_logging.rs:68:18:68:26 | &... | test_logging.rs:68:19:68:26 | password | test_logging.rs:68:18:68:26 | &... | This operation writes $@ to a log file. | test_logging.rs:68:19:68:26 | password | password | +| test_logging.rs:72:23:72:46 | MacroExpr | test_logging.rs:72:39:72:46 | password | test_logging.rs:72:23:72:46 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:72:39:72:46 | password | password | +| test_logging.rs:74:41:74:64 | MacroExpr | test_logging.rs:74:57:74:64 | password | test_logging.rs:74:41:74:64 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:74:57:74:64 | password | password | +| test_logging.rs:75:20:75:28 | &... | test_logging.rs:75:21:75:28 | password | test_logging.rs:75:20:75:28 | &... | This operation writes $@ to a log file. | test_logging.rs:75:21:75:28 | password | password | +| test_logging.rs:76:23:76:46 | MacroExpr | test_logging.rs:76:39:76:46 | password | test_logging.rs:76:23:76:46 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:76:39:76:46 | password | password | +| test_logging.rs:82:20:82:43 | MacroExpr | test_logging.rs:82:36:82:43 | password | test_logging.rs:82:20:82:43 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:82:36:82:43 | password | password | +| test_logging.rs:84:38:84:61 | MacroExpr | test_logging.rs:84:54:84:61 | password | test_logging.rs:84:38:84:61 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:84:54:84:61 | password | password | +| test_logging.rs:85:20:85:28 | &... | test_logging.rs:85:21:85:28 | password | test_logging.rs:85:20:85:28 | &... | This operation writes $@ to a log file. | test_logging.rs:85:21:85:28 | password | password | +| test_logging.rs:86:20:86:43 | MacroExpr | test_logging.rs:86:36:86:43 | password | test_logging.rs:86:20:86:43 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:86:36:86:43 | password | password | +| test_logging.rs:94:11:94:28 | MacroExpr | test_logging.rs:93:15:93:22 | password | test_logging.rs:94:11:94:28 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:93:15:93:22 | password | password | +| test_logging.rs:97:11:97:18 | MacroExpr | test_logging.rs:96:42:96:49 | password | test_logging.rs:97:11:97:18 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:96:42:96:49 | password | password | +| test_logging.rs:100:11:100:18 | MacroExpr | test_logging.rs:99:38:99:45 | password | test_logging.rs:100:11:100:18 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:99:38:99:45 | password | password | +| test_logging.rs:118:12:118:41 | MacroExpr | test_logging.rs:118:28:118:41 | get_password(...) | test_logging.rs:118:12:118:41 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:118:28:118:41 | get_password(...) | get_password(...) | +| test_logging.rs:131:12:131:31 | MacroExpr | test_logging.rs:129:25:129:32 | password | test_logging.rs:131:12:131:31 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:129:25:129:32 | password | password | +| test_logging.rs:141:11:141:37 | MacroExpr | test_logging.rs:141:27:141:37 | s1.password | test_logging.rs:141:11:141:37 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:141:27:141:37 | s1.password | s1.password | +| test_logging.rs:151:11:151:37 | MacroExpr | test_logging.rs:151:27:151:37 | s2.password | test_logging.rs:151:11:151:37 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:151:27:151:37 | s2.password | s2.password | +| test_logging.rs:176:33:176:79 | &... | test_logging.rs:176:70:176:78 | password2 | test_logging.rs:176:33:176:79 | &... | This operation writes $@ to a log file. | test_logging.rs:176:70:176:78 | password2 | password2 | +| test_logging.rs:180:35:180:81 | &... | test_logging.rs:180:72:180:80 | password2 | test_logging.rs:180:35:180:81 | &... | This operation writes $@ to a log file. | test_logging.rs:180:72:180:80 | password2 | password2 | +| test_logging.rs:184:13:184:23 | err_result2 | test_logging.rs:183:51:183:59 | password2 | test_logging.rs:184:13:184:23 | err_result2 | This operation writes $@ to a log file. | test_logging.rs:183:51:183:59 | password2 | password2 | +| test_logging.rs:188:13:188:23 | err_result3 | test_logging.rs:187:51:187:59 | password2 | test_logging.rs:188:13:188:23 | err_result3 | This operation writes $@ to a log file. | test_logging.rs:187:51:187:59 | password2 | password2 | +| test_logging.rs:192:12:192:37 | MacroExpr | test_logging.rs:192:30:192:37 | password | test_logging.rs:192:12:192:37 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:192:30:192:37 | password | password | +| test_logging.rs:193:14:193:37 | MacroExpr | test_logging.rs:193:30:193:37 | password | test_logging.rs:193:14:193:37 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:193:30:193:37 | password | password | +| test_logging.rs:194:13:194:38 | MacroExpr | test_logging.rs:194:31:194:38 | password | test_logging.rs:194:13:194:38 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:194:31:194:38 | password | password | +| test_logging.rs:195:15:195:38 | MacroExpr | test_logging.rs:195:31:195:38 | password | test_logging.rs:195:15:195:38 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:195:31:195:38 | password | password | +| test_logging.rs:199:20:199:43 | MacroExpr | test_logging.rs:199:36:199:43 | password | test_logging.rs:199:20:199:43 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:199:36:199:43 | password | password | +| test_logging.rs:202:19:202:42 | MacroExpr | test_logging.rs:202:35:202:42 | password | test_logging.rs:202:19:202:42 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:202:35:202:42 | password | password | +| test_logging.rs:205:28:205:51 | MacroExpr | test_logging.rs:205:44:205:51 | password | test_logging.rs:205:28:205:51 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:205:44:205:51 | password | password | +| test_logging.rs:208:26:208:49 | MacroExpr | test_logging.rs:208:42:208:49 | password | test_logging.rs:208:26:208:49 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:208:42:208:49 | password | password | +| test_logging.rs:211:28:211:51 | MacroExpr | test_logging.rs:211:44:211:51 | password | test_logging.rs:211:28:211:51 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:211:44:211:51 | password | password | +| test_logging.rs:214:30:214:53 | ...::Some(...) | test_logging.rs:214:46:214:53 | password | test_logging.rs:214:30:214:53 | ...::Some(...) | This operation writes $@ to a log file. | test_logging.rs:214:46:214:53 | password | password | +| test_logging.rs:217:30:217:53 | ...::Some(...) | test_logging.rs:217:46:217:53 | password | test_logging.rs:217:30:217:53 | ...::Some(...) | This operation writes $@ to a log file. | test_logging.rs:217:46:217:53 | password | password | +| test_logging.rs:220:34:220:57 | MacroExpr | test_logging.rs:220:50:220:57 | password | test_logging.rs:220:34:220:57 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:220:50:220:57 | password | password | +| test_logging.rs:223:36:223:59 | ...::Some(...) | test_logging.rs:223:52:223:59 | password | test_logging.rs:223:36:223:59 | ...::Some(...) | This operation writes $@ to a log file. | test_logging.rs:223:52:223:59 | password | password | +| test_logging.rs:226:36:226:59 | ...::Some(...) | test_logging.rs:226:52:226:59 | password | test_logging.rs:226:36:226:59 | ...::Some(...) | This operation writes $@ to a log file. | test_logging.rs:226:52:226:59 | password | password | +| test_logging.rs:229:30:229:71 | ... .as_str() | test_logging.rs:229:54:229:61 | password | test_logging.rs:229:30:229:71 | ... .as_str() | This operation writes $@ to a log file. | test_logging.rs:229:54:229:61 | password | password | +| test_logging.rs:242:16:242:61 | ... .as_bytes() | test_logging.rs:242:42:242:49 | password | test_logging.rs:242:16:242:61 | ... .as_bytes() | This operation writes $@ to a log file. | test_logging.rs:242:42:242:49 | password | password | +| test_logging.rs:245:20:245:65 | ... .as_bytes() | test_logging.rs:245:46:245:53 | password | test_logging.rs:245:20:245:65 | ... .as_bytes() | This operation writes $@ to a log file. | test_logging.rs:245:46:245:53 | password | password | +| test_logging.rs:248:15:248:60 | ... .as_bytes() | test_logging.rs:248:41:248:48 | password | test_logging.rs:248:15:248:60 | ... .as_bytes() | This operation writes $@ to a log file. | test_logging.rs:248:41:248:48 | password | password | +| test_logging.rs:251:15:251:60 | ... .as_bytes() | test_logging.rs:251:41:251:48 | password | test_logging.rs:251:15:251:60 | ... .as_bytes() | This operation writes $@ to a log file. | test_logging.rs:251:41:251:48 | password | password | edges -| test_logging.rs:42:12:42:35 | MacroExpr | test_logging.rs:42:5:42:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | -| test_logging.rs:42:28:42:35 | password | test_logging.rs:42:12:42:35 | MacroExpr | provenance | | -| test_logging.rs:43:12:43:35 | MacroExpr | test_logging.rs:43:5:43:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | -| test_logging.rs:43:28:43:35 | password | test_logging.rs:43:12:43:35 | MacroExpr | provenance | | -| test_logging.rs:44:11:44:34 | MacroExpr | test_logging.rs:44:5:44:9 | ...::log | provenance | MaD:11 Sink:MaD:11 | -| test_logging.rs:44:27:44:34 | password | test_logging.rs:44:11:44:34 | MacroExpr | provenance | | -| test_logging.rs:45:12:45:35 | MacroExpr | test_logging.rs:45:5:45:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | -| test_logging.rs:45:28:45:35 | password | test_logging.rs:45:12:45:35 | MacroExpr | provenance | | -| test_logging.rs:46:11:46:34 | MacroExpr | test_logging.rs:46:5:46:9 | ...::log | provenance | MaD:11 Sink:MaD:11 | -| test_logging.rs:46:27:46:34 | password | test_logging.rs:46:11:46:34 | MacroExpr | provenance | | -| test_logging.rs:47:24:47:47 | MacroExpr | test_logging.rs:47:5:47:8 | ...::log | provenance | MaD:11 Sink:MaD:11 | -| test_logging.rs:47:40:47:47 | password | test_logging.rs:47:24:47:47 | MacroExpr | provenance | | -| test_logging.rs:52:12:52:35 | MacroExpr | test_logging.rs:52:5:52:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | -| test_logging.rs:52:28:52:35 | password | test_logging.rs:52:12:52:35 | MacroExpr | provenance | | -| test_logging.rs:54:12:54:48 | MacroExpr | test_logging.rs:54:5:54:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | -| test_logging.rs:54:41:54:48 | password | test_logging.rs:54:12:54:48 | MacroExpr | provenance | | -| test_logging.rs:56:12:56:46 | MacroExpr | test_logging.rs:56:5:56:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | -| test_logging.rs:56:39:56:46 | password | test_logging.rs:56:12:56:46 | MacroExpr | provenance | | -| test_logging.rs:57:12:57:33 | MacroExpr | test_logging.rs:57:5:57:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | -| test_logging.rs:57:24:57:31 | password | test_logging.rs:57:12:57:33 | MacroExpr | provenance | | -| test_logging.rs:58:12:58:35 | MacroExpr | test_logging.rs:58:5:58:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | -| test_logging.rs:58:24:58:31 | password | test_logging.rs:58:12:58:35 | MacroExpr | provenance | | -| test_logging.rs:60:30:60:53 | MacroExpr | test_logging.rs:60:5:60:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | -| test_logging.rs:60:46:60:53 | password | test_logging.rs:60:30:60:53 | MacroExpr | provenance | | -| test_logging.rs:61:20:61:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:61:5:61:10 | ...::log | provenance | MaD:12 Sink:MaD:12 Sink:MaD:12 | -| test_logging.rs:61:20:61:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:61:5:61:10 | ...::log | provenance | MaD:12 Sink:MaD:12 Sink:MaD:12 Sink:MaD:12 | -| test_logging.rs:61:20:61:28 | &... [&ref, tuple.0] | test_logging.rs:61:5:61:10 | ...::log | provenance | MaD:12 Sink:MaD:12 Sink:MaD:12 | +| test_logging.rs:42:28:42:35 | password | test_logging.rs:42:12:42:35 | MacroExpr | provenance | Sink:MaD:11 | +| test_logging.rs:43:28:43:35 | password | test_logging.rs:43:12:43:35 | MacroExpr | provenance | Sink:MaD:11 | +| test_logging.rs:44:27:44:34 | password | test_logging.rs:44:11:44:34 | MacroExpr | provenance | Sink:MaD:11 | +| test_logging.rs:45:28:45:35 | password | test_logging.rs:45:12:45:35 | MacroExpr | provenance | Sink:MaD:11 | +| test_logging.rs:46:27:46:34 | password | test_logging.rs:46:11:46:34 | MacroExpr | provenance | Sink:MaD:11 | +| test_logging.rs:47:40:47:47 | password | test_logging.rs:47:24:47:47 | MacroExpr | provenance | Sink:MaD:11 | +| test_logging.rs:52:28:52:35 | password | test_logging.rs:52:12:52:35 | MacroExpr | provenance | Sink:MaD:11 | +| test_logging.rs:54:41:54:48 | password | test_logging.rs:54:12:54:48 | MacroExpr | provenance | Sink:MaD:11 | +| test_logging.rs:56:39:56:46 | password | test_logging.rs:56:12:56:46 | MacroExpr | provenance | Sink:MaD:11 | +| test_logging.rs:57:24:57:31 | password | test_logging.rs:57:12:57:33 | MacroExpr | provenance | Sink:MaD:11 | +| test_logging.rs:58:24:58:31 | password | test_logging.rs:58:12:58:35 | MacroExpr | provenance | Sink:MaD:11 | +| test_logging.rs:60:46:60:53 | password | test_logging.rs:60:30:60:53 | MacroExpr | provenance | Sink:MaD:11 | +| test_logging.rs:61:20:61:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:61:20:61:28 | &... | provenance | Sink:MaD:12 Sink:MaD:12 | +| test_logging.rs:61:20:61:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:61:20:61:28 | &... | provenance | Sink:MaD:12 Sink:MaD:12 Sink:MaD:12 | +| test_logging.rs:61:20:61:28 | &... [&ref, tuple.0] | test_logging.rs:61:20:61:28 | &... | provenance | Sink:MaD:12 Sink:MaD:12 | | test_logging.rs:61:20:61:28 | &password | test_logging.rs:61:20:61:28 | TupleExpr [tuple.0] | provenance | | | test_logging.rs:61:20:61:28 | &password [&ref] | test_logging.rs:61:20:61:28 | TupleExpr [tuple.0, &ref] | provenance | | | test_logging.rs:61:20:61:28 | TupleExpr [tuple.0, &ref] | test_logging.rs:61:20:61:28 | &... [&ref, tuple.0, &ref] | provenance | | | test_logging.rs:61:20:61:28 | TupleExpr [tuple.0] | test_logging.rs:61:20:61:28 | &... [&ref, tuple.0] | provenance | | | test_logging.rs:61:21:61:28 | password | test_logging.rs:61:20:61:28 | &password | provenance | Config | | test_logging.rs:61:21:61:28 | password | test_logging.rs:61:20:61:28 | &password [&ref] | provenance | | -| test_logging.rs:65:24:65:47 | MacroExpr | test_logging.rs:65:5:65:8 | ...::log | provenance | MaD:11 Sink:MaD:11 | -| test_logging.rs:65:40:65:47 | password | test_logging.rs:65:24:65:47 | MacroExpr | provenance | | -| test_logging.rs:67:42:67:65 | MacroExpr | test_logging.rs:67:5:67:8 | ...::log | provenance | MaD:11 Sink:MaD:11 | -| test_logging.rs:67:58:67:65 | password | test_logging.rs:67:42:67:65 | MacroExpr | provenance | | -| test_logging.rs:68:18:68:26 | &... [&ref, tuple.0, &ref] | test_logging.rs:68:5:68:8 | ...::log | provenance | MaD:12 Sink:MaD:12 Sink:MaD:12 | -| test_logging.rs:68:18:68:26 | &... [&ref, tuple.0, &ref] | test_logging.rs:68:5:68:8 | ...::log | provenance | MaD:12 Sink:MaD:12 Sink:MaD:12 Sink:MaD:12 | -| test_logging.rs:68:18:68:26 | &... [&ref, tuple.0] | test_logging.rs:68:5:68:8 | ...::log | provenance | MaD:12 Sink:MaD:12 Sink:MaD:12 | +| test_logging.rs:65:40:65:47 | password | test_logging.rs:65:24:65:47 | MacroExpr | provenance | Sink:MaD:11 | +| test_logging.rs:67:58:67:65 | password | test_logging.rs:67:42:67:65 | MacroExpr | provenance | Sink:MaD:11 | +| test_logging.rs:68:18:68:26 | &... [&ref, tuple.0, &ref] | test_logging.rs:68:18:68:26 | &... | provenance | Sink:MaD:12 Sink:MaD:12 | +| test_logging.rs:68:18:68:26 | &... [&ref, tuple.0, &ref] | test_logging.rs:68:18:68:26 | &... | provenance | Sink:MaD:12 Sink:MaD:12 Sink:MaD:12 | +| test_logging.rs:68:18:68:26 | &... [&ref, tuple.0] | test_logging.rs:68:18:68:26 | &... | provenance | Sink:MaD:12 Sink:MaD:12 | | test_logging.rs:68:18:68:26 | &password | test_logging.rs:68:18:68:26 | TupleExpr [tuple.0] | provenance | | | test_logging.rs:68:18:68:26 | &password [&ref] | test_logging.rs:68:18:68:26 | TupleExpr [tuple.0, &ref] | provenance | | | test_logging.rs:68:18:68:26 | TupleExpr [tuple.0, &ref] | test_logging.rs:68:18:68:26 | &... [&ref, tuple.0, &ref] | provenance | | | test_logging.rs:68:18:68:26 | TupleExpr [tuple.0] | test_logging.rs:68:18:68:26 | &... [&ref, tuple.0] | provenance | | | test_logging.rs:68:19:68:26 | password | test_logging.rs:68:18:68:26 | &password | provenance | Config | | test_logging.rs:68:19:68:26 | password | test_logging.rs:68:18:68:26 | &password [&ref] | provenance | | -| test_logging.rs:72:23:72:46 | MacroExpr | test_logging.rs:72:5:72:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | -| test_logging.rs:72:39:72:46 | password | test_logging.rs:72:23:72:46 | MacroExpr | provenance | | -| test_logging.rs:74:41:74:64 | MacroExpr | test_logging.rs:74:5:74:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | -| test_logging.rs:74:57:74:64 | password | test_logging.rs:74:41:74:64 | MacroExpr | provenance | | -| test_logging.rs:75:20:75:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:75:5:75:10 | ...::log | provenance | MaD:12 Sink:MaD:12 Sink:MaD:12 | -| test_logging.rs:75:20:75:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:75:5:75:10 | ...::log | provenance | MaD:12 Sink:MaD:12 Sink:MaD:12 Sink:MaD:12 | -| test_logging.rs:75:20:75:28 | &... [&ref, tuple.0] | test_logging.rs:75:5:75:10 | ...::log | provenance | MaD:12 Sink:MaD:12 Sink:MaD:12 | +| test_logging.rs:72:39:72:46 | password | test_logging.rs:72:23:72:46 | MacroExpr | provenance | Sink:MaD:11 | +| test_logging.rs:74:57:74:64 | password | test_logging.rs:74:41:74:64 | MacroExpr | provenance | Sink:MaD:11 | +| test_logging.rs:75:20:75:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:75:20:75:28 | &... | provenance | Sink:MaD:12 Sink:MaD:12 | +| test_logging.rs:75:20:75:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:75:20:75:28 | &... | provenance | Sink:MaD:12 Sink:MaD:12 Sink:MaD:12 | +| test_logging.rs:75:20:75:28 | &... [&ref, tuple.0] | test_logging.rs:75:20:75:28 | &... | provenance | Sink:MaD:12 Sink:MaD:12 | | test_logging.rs:75:20:75:28 | &password | test_logging.rs:75:20:75:28 | TupleExpr [tuple.0] | provenance | | | test_logging.rs:75:20:75:28 | &password [&ref] | test_logging.rs:75:20:75:28 | TupleExpr [tuple.0, &ref] | provenance | | | test_logging.rs:75:20:75:28 | TupleExpr [tuple.0, &ref] | test_logging.rs:75:20:75:28 | &... [&ref, tuple.0, &ref] | provenance | | | test_logging.rs:75:20:75:28 | TupleExpr [tuple.0] | test_logging.rs:75:20:75:28 | &... [&ref, tuple.0] | provenance | | | test_logging.rs:75:21:75:28 | password | test_logging.rs:75:20:75:28 | &password | provenance | Config | | test_logging.rs:75:21:75:28 | password | test_logging.rs:75:20:75:28 | &password [&ref] | provenance | | -| test_logging.rs:76:23:76:46 | MacroExpr | test_logging.rs:76:5:76:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | -| test_logging.rs:76:39:76:46 | password | test_logging.rs:76:23:76:46 | MacroExpr | provenance | | -| test_logging.rs:82:20:82:43 | MacroExpr | test_logging.rs:82:5:82:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | -| test_logging.rs:82:36:82:43 | password | test_logging.rs:82:20:82:43 | MacroExpr | provenance | | -| test_logging.rs:84:38:84:61 | MacroExpr | test_logging.rs:84:5:84:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | -| test_logging.rs:84:54:84:61 | password | test_logging.rs:84:38:84:61 | MacroExpr | provenance | | -| test_logging.rs:85:20:85:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:85:5:85:10 | ...::log | provenance | MaD:12 Sink:MaD:12 Sink:MaD:12 | -| test_logging.rs:85:20:85:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:85:5:85:10 | ...::log | provenance | MaD:12 Sink:MaD:12 Sink:MaD:12 Sink:MaD:12 | -| test_logging.rs:85:20:85:28 | &... [&ref, tuple.0] | test_logging.rs:85:5:85:10 | ...::log | provenance | MaD:12 Sink:MaD:12 Sink:MaD:12 | +| test_logging.rs:76:39:76:46 | password | test_logging.rs:76:23:76:46 | MacroExpr | provenance | Sink:MaD:11 | +| test_logging.rs:82:36:82:43 | password | test_logging.rs:82:20:82:43 | MacroExpr | provenance | Sink:MaD:11 | +| test_logging.rs:84:54:84:61 | password | test_logging.rs:84:38:84:61 | MacroExpr | provenance | Sink:MaD:11 | +| test_logging.rs:85:20:85:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:85:20:85:28 | &... | provenance | Sink:MaD:12 Sink:MaD:12 | +| test_logging.rs:85:20:85:28 | &... [&ref, tuple.0, &ref] | test_logging.rs:85:20:85:28 | &... | provenance | Sink:MaD:12 Sink:MaD:12 Sink:MaD:12 | +| test_logging.rs:85:20:85:28 | &... [&ref, tuple.0] | test_logging.rs:85:20:85:28 | &... | provenance | Sink:MaD:12 Sink:MaD:12 | | test_logging.rs:85:20:85:28 | &password | test_logging.rs:85:20:85:28 | TupleExpr [tuple.0] | provenance | | | test_logging.rs:85:20:85:28 | &password [&ref] | test_logging.rs:85:20:85:28 | TupleExpr [tuple.0, &ref] | provenance | | | test_logging.rs:85:20:85:28 | TupleExpr [tuple.0, &ref] | test_logging.rs:85:20:85:28 | &... [&ref, tuple.0, &ref] | provenance | | | test_logging.rs:85:20:85:28 | TupleExpr [tuple.0] | test_logging.rs:85:20:85:28 | &... [&ref, tuple.0] | provenance | | | test_logging.rs:85:21:85:28 | password | test_logging.rs:85:20:85:28 | &password | provenance | Config | | test_logging.rs:85:21:85:28 | password | test_logging.rs:85:20:85:28 | &password [&ref] | provenance | | -| test_logging.rs:86:20:86:43 | MacroExpr | test_logging.rs:86:5:86:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | -| test_logging.rs:86:36:86:43 | password | test_logging.rs:86:20:86:43 | MacroExpr | provenance | | -| test_logging.rs:93:9:93:10 | m1 | test_logging.rs:94:11:94:28 | MacroExpr | provenance | | +| test_logging.rs:86:36:86:43 | password | test_logging.rs:86:20:86:43 | MacroExpr | provenance | Sink:MaD:11 | +| test_logging.rs:93:9:93:10 | m1 | test_logging.rs:94:11:94:28 | MacroExpr | provenance | Sink:MaD:11 | | test_logging.rs:93:14:93:22 | &password | test_logging.rs:93:9:93:10 | m1 | provenance | | | test_logging.rs:93:15:93:22 | password | test_logging.rs:93:14:93:22 | &password | provenance | Config | -| test_logging.rs:94:11:94:28 | MacroExpr | test_logging.rs:94:5:94:9 | ...::log | provenance | MaD:11 Sink:MaD:11 | -| test_logging.rs:96:9:96:10 | m2 | test_logging.rs:97:11:97:18 | MacroExpr | provenance | | +| test_logging.rs:96:9:96:10 | m2 | test_logging.rs:97:11:97:18 | MacroExpr | provenance | Sink:MaD:11 | | test_logging.rs:96:14:96:49 | ... + ... | test_logging.rs:96:9:96:10 | m2 | provenance | | | test_logging.rs:96:41:96:49 | &password | test_logging.rs:96:14:96:49 | ... + ... | provenance | MaD:16 | | test_logging.rs:96:41:96:49 | &password [&ref] | test_logging.rs:96:14:96:49 | ... + ... | provenance | MaD:16 | | test_logging.rs:96:42:96:49 | password | test_logging.rs:96:41:96:49 | &password | provenance | Config | | test_logging.rs:96:42:96:49 | password | test_logging.rs:96:41:96:49 | &password [&ref] | provenance | | -| test_logging.rs:97:11:97:18 | MacroExpr | test_logging.rs:97:5:97:9 | ...::log | provenance | MaD:11 Sink:MaD:11 | -| test_logging.rs:99:9:99:10 | m3 | test_logging.rs:100:11:100:18 | MacroExpr | provenance | | +| test_logging.rs:99:9:99:10 | m3 | test_logging.rs:100:11:100:18 | MacroExpr | provenance | Sink:MaD:11 | | test_logging.rs:99:22:99:45 | ...::format(...) | test_logging.rs:99:22:99:45 | { ... } | provenance | | | test_logging.rs:99:22:99:45 | ...::must_use(...) | test_logging.rs:99:9:99:10 | m3 | provenance | | | test_logging.rs:99:22:99:45 | MacroExpr | test_logging.rs:99:22:99:45 | ...::format(...) | provenance | MaD:19 | | test_logging.rs:99:22:99:45 | { ... } | test_logging.rs:99:22:99:45 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:99:38:99:45 | password | test_logging.rs:99:22:99:45 | MacroExpr | provenance | | -| test_logging.rs:100:11:100:18 | MacroExpr | test_logging.rs:100:5:100:9 | ...::log | provenance | MaD:11 Sink:MaD:11 | -| test_logging.rs:118:12:118:41 | MacroExpr | test_logging.rs:118:5:118:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | -| test_logging.rs:118:28:118:41 | get_password(...) | test_logging.rs:118:12:118:41 | MacroExpr | provenance | | +| test_logging.rs:118:28:118:41 | get_password(...) | test_logging.rs:118:12:118:41 | MacroExpr | provenance | Sink:MaD:11 | | test_logging.rs:129:9:129:10 | t1 [tuple.1] | test_logging.rs:131:28:131:29 | t1 [tuple.1] | provenance | | | test_logging.rs:129:14:129:33 | TupleExpr [tuple.1] | test_logging.rs:129:9:129:10 | t1 [tuple.1] | provenance | | | test_logging.rs:129:25:129:32 | password | test_logging.rs:129:14:129:33 | TupleExpr [tuple.1] | provenance | | -| test_logging.rs:131:12:131:31 | MacroExpr | test_logging.rs:131:5:131:10 | ...::log | provenance | MaD:11 Sink:MaD:11 | | test_logging.rs:131:28:131:29 | t1 [tuple.1] | test_logging.rs:131:28:131:31 | t1.1 | provenance | | -| test_logging.rs:131:28:131:31 | t1.1 | test_logging.rs:131:12:131:31 | MacroExpr | provenance | | -| test_logging.rs:141:11:141:37 | MacroExpr | test_logging.rs:141:5:141:9 | ...::log | provenance | MaD:11 Sink:MaD:11 | -| test_logging.rs:141:27:141:37 | s1.password | test_logging.rs:141:11:141:37 | MacroExpr | provenance | | -| test_logging.rs:151:11:151:37 | MacroExpr | test_logging.rs:151:5:151:9 | ...::log | provenance | MaD:11 Sink:MaD:11 | -| test_logging.rs:151:27:151:37 | s2.password | test_logging.rs:151:11:151:37 | MacroExpr | provenance | | -| test_logging.rs:176:33:176:79 | &... | test_logging.rs:176:22:176:31 | log_expect | provenance | MaD:1 Sink:MaD:1 | -| test_logging.rs:176:33:176:79 | &... [&ref] | test_logging.rs:176:22:176:31 | log_expect | provenance | MaD:1 Sink:MaD:1 | +| test_logging.rs:131:28:131:31 | t1.1 | test_logging.rs:131:12:131:31 | MacroExpr | provenance | Sink:MaD:11 | +| test_logging.rs:141:27:141:37 | s1.password | test_logging.rs:141:11:141:37 | MacroExpr | provenance | Sink:MaD:11 | +| test_logging.rs:151:27:151:37 | s2.password | test_logging.rs:151:11:151:37 | MacroExpr | provenance | Sink:MaD:11 | +| test_logging.rs:176:33:176:79 | &... | test_logging.rs:176:33:176:79 | &... | provenance | Sink:MaD:1 | +| test_logging.rs:176:33:176:79 | &... [&ref] | test_logging.rs:176:33:176:79 | &... | provenance | Sink:MaD:1 | | test_logging.rs:176:34:176:79 | MacroExpr | test_logging.rs:176:33:176:79 | &... | provenance | Config | | test_logging.rs:176:34:176:79 | MacroExpr | test_logging.rs:176:33:176:79 | &... [&ref] | provenance | | | test_logging.rs:176:42:176:78 | ...::format(...) | test_logging.rs:176:42:176:78 | { ... } | provenance | | @@ -169,8 +142,8 @@ edges | test_logging.rs:176:42:176:78 | MacroExpr | test_logging.rs:176:42:176:78 | ...::format(...) | provenance | MaD:19 | | test_logging.rs:176:42:176:78 | { ... } | test_logging.rs:176:42:176:78 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:176:70:176:78 | password2 | test_logging.rs:176:42:176:78 | MacroExpr | provenance | | -| test_logging.rs:180:35:180:81 | &... | test_logging.rs:180:24:180:33 | log_expect | provenance | MaD:3 Sink:MaD:3 | -| test_logging.rs:180:35:180:81 | &... [&ref] | test_logging.rs:180:24:180:33 | log_expect | provenance | MaD:3 Sink:MaD:3 | +| test_logging.rs:180:35:180:81 | &... | test_logging.rs:180:35:180:81 | &... | provenance | Sink:MaD:3 | +| test_logging.rs:180:35:180:81 | &... [&ref] | test_logging.rs:180:35:180:81 | &... | provenance | Sink:MaD:3 | | test_logging.rs:180:36:180:81 | MacroExpr | test_logging.rs:180:35:180:81 | &... | provenance | Config | | test_logging.rs:180:36:180:81 | MacroExpr | test_logging.rs:180:35:180:81 | &... [&ref] | provenance | | | test_logging.rs:180:44:180:80 | ...::format(...) | test_logging.rs:180:44:180:80 | { ... } | provenance | | @@ -178,77 +151,65 @@ edges | test_logging.rs:180:44:180:80 | MacroExpr | test_logging.rs:180:44:180:80 | ...::format(...) | provenance | MaD:19 | | test_logging.rs:180:44:180:80 | { ... } | test_logging.rs:180:44:180:80 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:180:72:180:80 | password2 | test_logging.rs:180:44:180:80 | MacroExpr | provenance | | -| test_logging.rs:183:9:183:19 | err_result2 [Err] | test_logging.rs:184:13:184:23 | err_result2 [Err] | provenance | | +| test_logging.rs:183:9:183:19 | err_result2 [Err] | test_logging.rs:184:13:184:23 | err_result2 | provenance | Sink:MaD:4 | | test_logging.rs:183:47:183:68 | Err(...) [Err] | test_logging.rs:183:9:183:19 | err_result2 [Err] | provenance | | | test_logging.rs:183:51:183:59 | password2 | test_logging.rs:183:51:183:67 | password2.clone() | provenance | MaD:15 | | test_logging.rs:183:51:183:67 | password2.clone() | test_logging.rs:183:47:183:68 | Err(...) [Err] | provenance | | -| test_logging.rs:184:13:184:23 | err_result2 [Err] | test_logging.rs:184:25:184:34 | log_expect | provenance | MaD:4 Sink:MaD:4 | -| test_logging.rs:187:9:187:19 | err_result3 [Err] | test_logging.rs:188:13:188:23 | err_result3 [Err] | provenance | | +| test_logging.rs:187:9:187:19 | err_result3 [Err] | test_logging.rs:188:13:188:23 | err_result3 | provenance | Sink:MaD:5 | | test_logging.rs:187:47:187:60 | Err(...) [Err] | test_logging.rs:187:9:187:19 | err_result3 [Err] | provenance | | | test_logging.rs:187:51:187:59 | password2 | test_logging.rs:187:47:187:60 | Err(...) [Err] | provenance | | -| test_logging.rs:188:13:188:23 | err_result3 [Err] | test_logging.rs:188:25:188:34 | log_unwrap | provenance | MaD:5 Sink:MaD:5 | -| test_logging.rs:192:12:192:37 | MacroExpr | test_logging.rs:192:5:192:10 | ...::_print | provenance | MaD:14 Sink:MaD:14 | -| test_logging.rs:192:30:192:37 | password | test_logging.rs:192:12:192:37 | MacroExpr | provenance | | -| test_logging.rs:193:14:193:37 | MacroExpr | test_logging.rs:193:5:193:12 | ...::_print | provenance | MaD:14 Sink:MaD:14 | -| test_logging.rs:193:30:193:37 | password | test_logging.rs:193:14:193:37 | MacroExpr | provenance | | -| test_logging.rs:194:13:194:38 | MacroExpr | test_logging.rs:194:5:194:11 | ...::_eprint | provenance | MaD:13 Sink:MaD:13 | -| test_logging.rs:194:31:194:38 | password | test_logging.rs:194:13:194:38 | MacroExpr | provenance | | -| test_logging.rs:195:15:195:38 | MacroExpr | test_logging.rs:195:5:195:13 | ...::_eprint | provenance | MaD:13 Sink:MaD:13 | -| test_logging.rs:195:31:195:38 | password | test_logging.rs:195:15:195:38 | MacroExpr | provenance | | -| test_logging.rs:199:20:199:43 | MacroExpr | test_logging.rs:199:13:199:18 | ...::panic_fmt | provenance | MaD:10 Sink:MaD:10 | -| test_logging.rs:199:36:199:43 | password | test_logging.rs:199:20:199:43 | MacroExpr | provenance | | -| test_logging.rs:202:19:202:42 | MacroExpr | test_logging.rs:202:13:202:17 | ...::panic_fmt | provenance | MaD:10 Sink:MaD:10 | -| test_logging.rs:202:35:202:42 | password | test_logging.rs:202:19:202:42 | MacroExpr | provenance | | -| test_logging.rs:205:28:205:51 | MacroExpr | test_logging.rs:205:13:205:26 | ...::panic_fmt | provenance | MaD:10 Sink:MaD:10 | -| test_logging.rs:205:44:205:51 | password | test_logging.rs:205:28:205:51 | MacroExpr | provenance | | -| test_logging.rs:208:26:208:49 | MacroExpr | test_logging.rs:208:13:208:24 | ...::panic_fmt | provenance | MaD:10 Sink:MaD:10 | -| test_logging.rs:208:42:208:49 | password | test_logging.rs:208:26:208:49 | MacroExpr | provenance | | -| test_logging.rs:211:28:211:51 | MacroExpr | test_logging.rs:211:13:211:19 | ...::panic_fmt | provenance | MaD:10 Sink:MaD:10 | -| test_logging.rs:211:44:211:51 | password | test_logging.rs:211:28:211:51 | MacroExpr | provenance | | -| test_logging.rs:214:30:214:53 | ...::Some(...) [Some] | test_logging.rs:214:13:214:22 | ...::assert_failed | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:192:30:192:37 | password | test_logging.rs:192:12:192:37 | MacroExpr | provenance | Sink:MaD:14 | +| test_logging.rs:193:30:193:37 | password | test_logging.rs:193:14:193:37 | MacroExpr | provenance | Sink:MaD:14 | +| test_logging.rs:194:31:194:38 | password | test_logging.rs:194:13:194:38 | MacroExpr | provenance | Sink:MaD:13 | +| test_logging.rs:195:31:195:38 | password | test_logging.rs:195:15:195:38 | MacroExpr | provenance | Sink:MaD:13 | +| test_logging.rs:199:36:199:43 | password | test_logging.rs:199:20:199:43 | MacroExpr | provenance | Sink:MaD:10 | +| test_logging.rs:202:35:202:42 | password | test_logging.rs:202:19:202:42 | MacroExpr | provenance | Sink:MaD:10 | +| test_logging.rs:205:44:205:51 | password | test_logging.rs:205:28:205:51 | MacroExpr | provenance | Sink:MaD:10 | +| test_logging.rs:208:42:208:49 | password | test_logging.rs:208:26:208:49 | MacroExpr | provenance | Sink:MaD:10 | +| test_logging.rs:211:44:211:51 | password | test_logging.rs:211:28:211:51 | MacroExpr | provenance | Sink:MaD:10 | +| test_logging.rs:214:30:214:53 | ...::Some(...) [Some] | test_logging.rs:214:30:214:53 | ...::Some(...) | provenance | Sink:MaD:9 | | test_logging.rs:214:30:214:53 | MacroExpr | test_logging.rs:214:30:214:53 | ...::Some(...) [Some] | provenance | | | test_logging.rs:214:46:214:53 | password | test_logging.rs:214:30:214:53 | MacroExpr | provenance | | -| test_logging.rs:217:30:217:53 | ...::Some(...) [Some] | test_logging.rs:217:13:217:22 | ...::assert_failed | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:217:30:217:53 | ...::Some(...) [Some] | test_logging.rs:217:30:217:53 | ...::Some(...) | provenance | Sink:MaD:9 | | test_logging.rs:217:30:217:53 | MacroExpr | test_logging.rs:217:30:217:53 | ...::Some(...) [Some] | provenance | | | test_logging.rs:217:46:217:53 | password | test_logging.rs:217:30:217:53 | MacroExpr | provenance | | -| test_logging.rs:220:34:220:57 | MacroExpr | test_logging.rs:220:13:220:25 | ...::panic_fmt | provenance | MaD:10 Sink:MaD:10 | -| test_logging.rs:220:50:220:57 | password | test_logging.rs:220:34:220:57 | MacroExpr | provenance | | -| test_logging.rs:223:36:223:59 | ...::Some(...) [Some] | test_logging.rs:223:13:223:28 | ...::assert_failed | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:220:50:220:57 | password | test_logging.rs:220:34:220:57 | MacroExpr | provenance | Sink:MaD:10 | +| test_logging.rs:223:36:223:59 | ...::Some(...) [Some] | test_logging.rs:223:36:223:59 | ...::Some(...) | provenance | Sink:MaD:9 | | test_logging.rs:223:36:223:59 | MacroExpr | test_logging.rs:223:36:223:59 | ...::Some(...) [Some] | provenance | | | test_logging.rs:223:52:223:59 | password | test_logging.rs:223:36:223:59 | MacroExpr | provenance | | -| test_logging.rs:226:36:226:59 | ...::Some(...) [Some] | test_logging.rs:226:13:226:28 | ...::assert_failed | provenance | MaD:9 Sink:MaD:9 | +| test_logging.rs:226:36:226:59 | ...::Some(...) [Some] | test_logging.rs:226:36:226:59 | ...::Some(...) | provenance | Sink:MaD:9 | | test_logging.rs:226:36:226:59 | MacroExpr | test_logging.rs:226:36:226:59 | ...::Some(...) [Some] | provenance | | | test_logging.rs:226:52:226:59 | password | test_logging.rs:226:36:226:59 | MacroExpr | provenance | | | test_logging.rs:229:30:229:62 | MacroExpr | test_logging.rs:229:30:229:71 | ... .as_str() [&ref] | provenance | MaD:18 | -| test_logging.rs:229:30:229:71 | ... .as_str() [&ref] | test_logging.rs:229:23:229:28 | expect | provenance | MaD:2 Sink:MaD:2 | +| test_logging.rs:229:30:229:71 | ... .as_str() [&ref] | test_logging.rs:229:30:229:71 | ... .as_str() | provenance | Sink:MaD:2 | | test_logging.rs:229:38:229:61 | ...::format(...) | test_logging.rs:229:38:229:61 | { ... } | provenance | | | test_logging.rs:229:38:229:61 | ...::must_use(...) | test_logging.rs:229:30:229:62 | MacroExpr | provenance | | | test_logging.rs:229:38:229:61 | MacroExpr | test_logging.rs:229:38:229:61 | ...::format(...) | provenance | MaD:19 | | test_logging.rs:229:38:229:61 | { ... } | test_logging.rs:229:38:229:61 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:229:54:229:61 | password | test_logging.rs:229:38:229:61 | MacroExpr | provenance | | | test_logging.rs:242:16:242:50 | MacroExpr | test_logging.rs:242:16:242:61 | ... .as_bytes() [&ref, element] | provenance | MaD:17 | -| test_logging.rs:242:16:242:61 | ... .as_bytes() [&ref, element] | test_logging.rs:242:10:242:14 | write | provenance | MaD:7 Sink:MaD:7 Sink:MaD:7 | +| test_logging.rs:242:16:242:61 | ... .as_bytes() [&ref, element] | test_logging.rs:242:16:242:61 | ... .as_bytes() | provenance | Sink:MaD:7 Sink:MaD:7 | | test_logging.rs:242:24:242:49 | ...::format(...) | test_logging.rs:242:24:242:49 | { ... } | provenance | | | test_logging.rs:242:24:242:49 | ...::must_use(...) | test_logging.rs:242:16:242:50 | MacroExpr | provenance | | | test_logging.rs:242:24:242:49 | MacroExpr | test_logging.rs:242:24:242:49 | ...::format(...) | provenance | MaD:19 | | test_logging.rs:242:24:242:49 | { ... } | test_logging.rs:242:24:242:49 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:242:42:242:49 | password | test_logging.rs:242:24:242:49 | MacroExpr | provenance | | | test_logging.rs:245:20:245:54 | MacroExpr | test_logging.rs:245:20:245:65 | ... .as_bytes() [&ref, element] | provenance | MaD:17 | -| test_logging.rs:245:20:245:65 | ... .as_bytes() [&ref, element] | test_logging.rs:245:10:245:18 | write_all | provenance | MaD:8 Sink:MaD:8 Sink:MaD:8 | +| test_logging.rs:245:20:245:65 | ... .as_bytes() [&ref, element] | test_logging.rs:245:20:245:65 | ... .as_bytes() | provenance | Sink:MaD:8 Sink:MaD:8 | | test_logging.rs:245:28:245:53 | ...::format(...) | test_logging.rs:245:28:245:53 | { ... } | provenance | | | test_logging.rs:245:28:245:53 | ...::must_use(...) | test_logging.rs:245:20:245:54 | MacroExpr | provenance | | | test_logging.rs:245:28:245:53 | MacroExpr | test_logging.rs:245:28:245:53 | ...::format(...) | provenance | MaD:19 | | test_logging.rs:245:28:245:53 | { ... } | test_logging.rs:245:28:245:53 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:245:46:245:53 | password | test_logging.rs:245:28:245:53 | MacroExpr | provenance | | | test_logging.rs:248:15:248:49 | MacroExpr | test_logging.rs:248:15:248:60 | ... .as_bytes() [&ref, element] | provenance | MaD:17 | -| test_logging.rs:248:15:248:60 | ... .as_bytes() [&ref, element] | test_logging.rs:248:9:248:13 | write | provenance | MaD:7 Sink:MaD:7 Sink:MaD:7 | +| test_logging.rs:248:15:248:60 | ... .as_bytes() [&ref, element] | test_logging.rs:248:15:248:60 | ... .as_bytes() | provenance | Sink:MaD:7 Sink:MaD:7 | | test_logging.rs:248:23:248:48 | ...::format(...) | test_logging.rs:248:23:248:48 | { ... } | provenance | | | test_logging.rs:248:23:248:48 | ...::must_use(...) | test_logging.rs:248:15:248:49 | MacroExpr | provenance | | | test_logging.rs:248:23:248:48 | MacroExpr | test_logging.rs:248:23:248:48 | ...::format(...) | provenance | MaD:19 | | test_logging.rs:248:23:248:48 | { ... } | test_logging.rs:248:23:248:48 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:248:41:248:48 | password | test_logging.rs:248:23:248:48 | MacroExpr | provenance | | | test_logging.rs:251:15:251:49 | MacroExpr | test_logging.rs:251:15:251:60 | ... .as_bytes() [&ref, element] | provenance | MaD:17 | -| test_logging.rs:251:15:251:60 | ... .as_bytes() [&ref, element] | test_logging.rs:251:9:251:13 | write | provenance | MaD:6 Sink:MaD:6 Sink:MaD:6 | +| test_logging.rs:251:15:251:60 | ... .as_bytes() [&ref, element] | test_logging.rs:251:15:251:60 | ... .as_bytes() | provenance | Sink:MaD:6 Sink:MaD:6 | | test_logging.rs:251:23:251:48 | ...::format(...) | test_logging.rs:251:23:251:48 | { ... } | provenance | | | test_logging.rs:251:23:251:48 | ...::must_use(...) | test_logging.rs:251:15:251:49 | MacroExpr | provenance | | | test_logging.rs:251:23:251:48 | MacroExpr | test_logging.rs:251:23:251:48 | ...::format(...) | provenance | MaD:19 | @@ -276,43 +237,31 @@ models | 19 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | | 20 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes -| test_logging.rs:42:5:42:10 | ...::log | semmle.label | ...::log | | test_logging.rs:42:12:42:35 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:42:28:42:35 | password | semmle.label | password | -| test_logging.rs:43:5:43:10 | ...::log | semmle.label | ...::log | | test_logging.rs:43:12:43:35 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:43:28:43:35 | password | semmle.label | password | -| test_logging.rs:44:5:44:9 | ...::log | semmle.label | ...::log | | test_logging.rs:44:11:44:34 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:44:27:44:34 | password | semmle.label | password | -| test_logging.rs:45:5:45:10 | ...::log | semmle.label | ...::log | | test_logging.rs:45:12:45:35 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:45:28:45:35 | password | semmle.label | password | -| test_logging.rs:46:5:46:9 | ...::log | semmle.label | ...::log | | test_logging.rs:46:11:46:34 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:46:27:46:34 | password | semmle.label | password | -| test_logging.rs:47:5:47:8 | ...::log | semmle.label | ...::log | | test_logging.rs:47:24:47:47 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:47:40:47:47 | password | semmle.label | password | -| test_logging.rs:52:5:52:10 | ...::log | semmle.label | ...::log | | test_logging.rs:52:12:52:35 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:52:28:52:35 | password | semmle.label | password | -| test_logging.rs:54:5:54:10 | ...::log | semmle.label | ...::log | | test_logging.rs:54:12:54:48 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:54:41:54:48 | password | semmle.label | password | -| test_logging.rs:56:5:56:10 | ...::log | semmle.label | ...::log | | test_logging.rs:56:12:56:46 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:56:39:56:46 | password | semmle.label | password | -| test_logging.rs:57:5:57:10 | ...::log | semmle.label | ...::log | | test_logging.rs:57:12:57:33 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:57:24:57:31 | password | semmle.label | password | -| test_logging.rs:58:5:58:10 | ...::log | semmle.label | ...::log | | test_logging.rs:58:12:58:35 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:58:24:58:31 | password | semmle.label | password | -| test_logging.rs:60:5:60:10 | ...::log | semmle.label | ...::log | | test_logging.rs:60:30:60:53 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:60:46:60:53 | password | semmle.label | password | -| test_logging.rs:61:5:61:10 | ...::log | semmle.label | ...::log | +| test_logging.rs:61:20:61:28 | &... | semmle.label | &... | | test_logging.rs:61:20:61:28 | &... [&ref, tuple.0, &ref] | semmle.label | &... [&ref, tuple.0, &ref] | | test_logging.rs:61:20:61:28 | &... [&ref, tuple.0] | semmle.label | &... [&ref, tuple.0] | | test_logging.rs:61:20:61:28 | &password | semmle.label | &password | @@ -320,13 +269,11 @@ nodes | test_logging.rs:61:20:61:28 | TupleExpr [tuple.0, &ref] | semmle.label | TupleExpr [tuple.0, &ref] | | test_logging.rs:61:20:61:28 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] | | test_logging.rs:61:21:61:28 | password | semmle.label | password | -| test_logging.rs:65:5:65:8 | ...::log | semmle.label | ...::log | | test_logging.rs:65:24:65:47 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:65:40:65:47 | password | semmle.label | password | -| test_logging.rs:67:5:67:8 | ...::log | semmle.label | ...::log | | test_logging.rs:67:42:67:65 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:67:58:67:65 | password | semmle.label | password | -| test_logging.rs:68:5:68:8 | ...::log | semmle.label | ...::log | +| test_logging.rs:68:18:68:26 | &... | semmle.label | &... | | test_logging.rs:68:18:68:26 | &... [&ref, tuple.0, &ref] | semmle.label | &... [&ref, tuple.0, &ref] | | test_logging.rs:68:18:68:26 | &... [&ref, tuple.0] | semmle.label | &... [&ref, tuple.0] | | test_logging.rs:68:18:68:26 | &password | semmle.label | &password | @@ -334,13 +281,11 @@ nodes | test_logging.rs:68:18:68:26 | TupleExpr [tuple.0, &ref] | semmle.label | TupleExpr [tuple.0, &ref] | | test_logging.rs:68:18:68:26 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] | | test_logging.rs:68:19:68:26 | password | semmle.label | password | -| test_logging.rs:72:5:72:10 | ...::log | semmle.label | ...::log | | test_logging.rs:72:23:72:46 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:72:39:72:46 | password | semmle.label | password | -| test_logging.rs:74:5:74:10 | ...::log | semmle.label | ...::log | | test_logging.rs:74:41:74:64 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:74:57:74:64 | password | semmle.label | password | -| test_logging.rs:75:5:75:10 | ...::log | semmle.label | ...::log | +| test_logging.rs:75:20:75:28 | &... | semmle.label | &... | | test_logging.rs:75:20:75:28 | &... [&ref, tuple.0, &ref] | semmle.label | &... [&ref, tuple.0, &ref] | | test_logging.rs:75:20:75:28 | &... [&ref, tuple.0] | semmle.label | &... [&ref, tuple.0] | | test_logging.rs:75:20:75:28 | &password | semmle.label | &password | @@ -348,16 +293,13 @@ nodes | test_logging.rs:75:20:75:28 | TupleExpr [tuple.0, &ref] | semmle.label | TupleExpr [tuple.0, &ref] | | test_logging.rs:75:20:75:28 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] | | test_logging.rs:75:21:75:28 | password | semmle.label | password | -| test_logging.rs:76:5:76:10 | ...::log | semmle.label | ...::log | | test_logging.rs:76:23:76:46 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:76:39:76:46 | password | semmle.label | password | -| test_logging.rs:82:5:82:10 | ...::log | semmle.label | ...::log | | test_logging.rs:82:20:82:43 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:82:36:82:43 | password | semmle.label | password | -| test_logging.rs:84:5:84:10 | ...::log | semmle.label | ...::log | | test_logging.rs:84:38:84:61 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:84:54:84:61 | password | semmle.label | password | -| test_logging.rs:85:5:85:10 | ...::log | semmle.label | ...::log | +| test_logging.rs:85:20:85:28 | &... | semmle.label | &... | | test_logging.rs:85:20:85:28 | &... [&ref, tuple.0, &ref] | semmle.label | &... [&ref, tuple.0, &ref] | | test_logging.rs:85:20:85:28 | &... [&ref, tuple.0] | semmle.label | &... [&ref, tuple.0] | | test_logging.rs:85:20:85:28 | &password | semmle.label | &password | @@ -365,20 +307,17 @@ nodes | test_logging.rs:85:20:85:28 | TupleExpr [tuple.0, &ref] | semmle.label | TupleExpr [tuple.0, &ref] | | test_logging.rs:85:20:85:28 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] | | test_logging.rs:85:21:85:28 | password | semmle.label | password | -| test_logging.rs:86:5:86:10 | ...::log | semmle.label | ...::log | | test_logging.rs:86:20:86:43 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:86:36:86:43 | password | semmle.label | password | | test_logging.rs:93:9:93:10 | m1 | semmle.label | m1 | | test_logging.rs:93:14:93:22 | &password | semmle.label | &password | | test_logging.rs:93:15:93:22 | password | semmle.label | password | -| test_logging.rs:94:5:94:9 | ...::log | semmle.label | ...::log | | test_logging.rs:94:11:94:28 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:96:9:96:10 | m2 | semmle.label | m2 | | test_logging.rs:96:14:96:49 | ... + ... | semmle.label | ... + ... | | test_logging.rs:96:41:96:49 | &password | semmle.label | &password | | test_logging.rs:96:41:96:49 | &password [&ref] | semmle.label | &password [&ref] | | test_logging.rs:96:42:96:49 | password | semmle.label | password | -| test_logging.rs:97:5:97:9 | ...::log | semmle.label | ...::log | | test_logging.rs:97:11:97:18 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:99:9:99:10 | m3 | semmle.label | m3 | | test_logging.rs:99:22:99:45 | ...::format(...) | semmle.label | ...::format(...) | @@ -386,25 +325,20 @@ nodes | test_logging.rs:99:22:99:45 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:99:22:99:45 | { ... } | semmle.label | { ... } | | test_logging.rs:99:38:99:45 | password | semmle.label | password | -| test_logging.rs:100:5:100:9 | ...::log | semmle.label | ...::log | | test_logging.rs:100:11:100:18 | MacroExpr | semmle.label | MacroExpr | -| test_logging.rs:118:5:118:10 | ...::log | semmle.label | ...::log | | test_logging.rs:118:12:118:41 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:118:28:118:41 | get_password(...) | semmle.label | get_password(...) | | test_logging.rs:129:9:129:10 | t1 [tuple.1] | semmle.label | t1 [tuple.1] | | test_logging.rs:129:14:129:33 | TupleExpr [tuple.1] | semmle.label | TupleExpr [tuple.1] | | test_logging.rs:129:25:129:32 | password | semmle.label | password | -| test_logging.rs:131:5:131:10 | ...::log | semmle.label | ...::log | | test_logging.rs:131:12:131:31 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:131:28:131:29 | t1 [tuple.1] | semmle.label | t1 [tuple.1] | | test_logging.rs:131:28:131:31 | t1.1 | semmle.label | t1.1 | -| test_logging.rs:141:5:141:9 | ...::log | semmle.label | ...::log | | test_logging.rs:141:11:141:37 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:141:27:141:37 | s1.password | semmle.label | s1.password | -| test_logging.rs:151:5:151:9 | ...::log | semmle.label | ...::log | | test_logging.rs:151:11:151:37 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:151:27:151:37 | s2.password | semmle.label | s2.password | -| test_logging.rs:176:22:176:31 | log_expect | semmle.label | log_expect | +| test_logging.rs:176:33:176:79 | &... | semmle.label | &... | | test_logging.rs:176:33:176:79 | &... | semmle.label | &... | | test_logging.rs:176:33:176:79 | &... [&ref] | semmle.label | &... [&ref] | | test_logging.rs:176:34:176:79 | MacroExpr | semmle.label | MacroExpr | @@ -413,7 +347,7 @@ nodes | test_logging.rs:176:42:176:78 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:176:42:176:78 | { ... } | semmle.label | { ... } | | test_logging.rs:176:70:176:78 | password2 | semmle.label | password2 | -| test_logging.rs:180:24:180:33 | log_expect | semmle.label | log_expect | +| test_logging.rs:180:35:180:81 | &... | semmle.label | &... | | test_logging.rs:180:35:180:81 | &... | semmle.label | &... | | test_logging.rs:180:35:180:81 | &... [&ref] | semmle.label | &... [&ref] | | test_logging.rs:180:36:180:81 | MacroExpr | semmle.label | MacroExpr | @@ -426,93 +360,81 @@ nodes | test_logging.rs:183:47:183:68 | Err(...) [Err] | semmle.label | Err(...) [Err] | | test_logging.rs:183:51:183:59 | password2 | semmle.label | password2 | | test_logging.rs:183:51:183:67 | password2.clone() | semmle.label | password2.clone() | -| test_logging.rs:184:13:184:23 | err_result2 [Err] | semmle.label | err_result2 [Err] | -| test_logging.rs:184:25:184:34 | log_expect | semmle.label | log_expect | +| test_logging.rs:184:13:184:23 | err_result2 | semmle.label | err_result2 | | test_logging.rs:187:9:187:19 | err_result3 [Err] | semmle.label | err_result3 [Err] | | test_logging.rs:187:47:187:60 | Err(...) [Err] | semmle.label | Err(...) [Err] | | test_logging.rs:187:51:187:59 | password2 | semmle.label | password2 | -| test_logging.rs:188:13:188:23 | err_result3 [Err] | semmle.label | err_result3 [Err] | -| test_logging.rs:188:25:188:34 | log_unwrap | semmle.label | log_unwrap | -| test_logging.rs:192:5:192:10 | ...::_print | semmle.label | ...::_print | +| test_logging.rs:188:13:188:23 | err_result3 | semmle.label | err_result3 | | test_logging.rs:192:12:192:37 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:192:30:192:37 | password | semmle.label | password | -| test_logging.rs:193:5:193:12 | ...::_print | semmle.label | ...::_print | | test_logging.rs:193:14:193:37 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:193:30:193:37 | password | semmle.label | password | -| test_logging.rs:194:5:194:11 | ...::_eprint | semmle.label | ...::_eprint | | test_logging.rs:194:13:194:38 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:194:31:194:38 | password | semmle.label | password | -| test_logging.rs:195:5:195:13 | ...::_eprint | semmle.label | ...::_eprint | | test_logging.rs:195:15:195:38 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:195:31:195:38 | password | semmle.label | password | -| test_logging.rs:199:13:199:18 | ...::panic_fmt | semmle.label | ...::panic_fmt | | test_logging.rs:199:20:199:43 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:199:36:199:43 | password | semmle.label | password | -| test_logging.rs:202:13:202:17 | ...::panic_fmt | semmle.label | ...::panic_fmt | | test_logging.rs:202:19:202:42 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:202:35:202:42 | password | semmle.label | password | -| test_logging.rs:205:13:205:26 | ...::panic_fmt | semmle.label | ...::panic_fmt | | test_logging.rs:205:28:205:51 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:205:44:205:51 | password | semmle.label | password | -| test_logging.rs:208:13:208:24 | ...::panic_fmt | semmle.label | ...::panic_fmt | | test_logging.rs:208:26:208:49 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:208:42:208:49 | password | semmle.label | password | -| test_logging.rs:211:13:211:19 | ...::panic_fmt | semmle.label | ...::panic_fmt | | test_logging.rs:211:28:211:51 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:211:44:211:51 | password | semmle.label | password | -| test_logging.rs:214:13:214:22 | ...::assert_failed | semmle.label | ...::assert_failed | +| test_logging.rs:214:30:214:53 | ...::Some(...) | semmle.label | ...::Some(...) | | test_logging.rs:214:30:214:53 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | | test_logging.rs:214:30:214:53 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:214:46:214:53 | password | semmle.label | password | -| test_logging.rs:217:13:217:22 | ...::assert_failed | semmle.label | ...::assert_failed | +| test_logging.rs:217:30:217:53 | ...::Some(...) | semmle.label | ...::Some(...) | | test_logging.rs:217:30:217:53 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | | test_logging.rs:217:30:217:53 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:217:46:217:53 | password | semmle.label | password | -| test_logging.rs:220:13:220:25 | ...::panic_fmt | semmle.label | ...::panic_fmt | | test_logging.rs:220:34:220:57 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:220:50:220:57 | password | semmle.label | password | -| test_logging.rs:223:13:223:28 | ...::assert_failed | semmle.label | ...::assert_failed | +| test_logging.rs:223:36:223:59 | ...::Some(...) | semmle.label | ...::Some(...) | | test_logging.rs:223:36:223:59 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | | test_logging.rs:223:36:223:59 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:223:52:223:59 | password | semmle.label | password | -| test_logging.rs:226:13:226:28 | ...::assert_failed | semmle.label | ...::assert_failed | +| test_logging.rs:226:36:226:59 | ...::Some(...) | semmle.label | ...::Some(...) | | test_logging.rs:226:36:226:59 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | | test_logging.rs:226:36:226:59 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:226:52:226:59 | password | semmle.label | password | -| test_logging.rs:229:23:229:28 | expect | semmle.label | expect | | test_logging.rs:229:30:229:62 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:229:30:229:71 | ... .as_str() | semmle.label | ... .as_str() | | test_logging.rs:229:30:229:71 | ... .as_str() [&ref] | semmle.label | ... .as_str() [&ref] | | test_logging.rs:229:38:229:61 | ...::format(...) | semmle.label | ...::format(...) | | test_logging.rs:229:38:229:61 | ...::must_use(...) | semmle.label | ...::must_use(...) | | test_logging.rs:229:38:229:61 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:229:38:229:61 | { ... } | semmle.label | { ... } | | test_logging.rs:229:54:229:61 | password | semmle.label | password | -| test_logging.rs:242:10:242:14 | write | semmle.label | write | | test_logging.rs:242:16:242:50 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:242:16:242:61 | ... .as_bytes() | semmle.label | ... .as_bytes() | | test_logging.rs:242:16:242:61 | ... .as_bytes() [&ref, element] | semmle.label | ... .as_bytes() [&ref, element] | | test_logging.rs:242:24:242:49 | ...::format(...) | semmle.label | ...::format(...) | | test_logging.rs:242:24:242:49 | ...::must_use(...) | semmle.label | ...::must_use(...) | | test_logging.rs:242:24:242:49 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:242:24:242:49 | { ... } | semmle.label | { ... } | | test_logging.rs:242:42:242:49 | password | semmle.label | password | -| test_logging.rs:245:10:245:18 | write_all | semmle.label | write_all | | test_logging.rs:245:20:245:54 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:245:20:245:65 | ... .as_bytes() | semmle.label | ... .as_bytes() | | test_logging.rs:245:20:245:65 | ... .as_bytes() [&ref, element] | semmle.label | ... .as_bytes() [&ref, element] | | test_logging.rs:245:28:245:53 | ...::format(...) | semmle.label | ...::format(...) | | test_logging.rs:245:28:245:53 | ...::must_use(...) | semmle.label | ...::must_use(...) | | test_logging.rs:245:28:245:53 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:245:28:245:53 | { ... } | semmle.label | { ... } | | test_logging.rs:245:46:245:53 | password | semmle.label | password | -| test_logging.rs:248:9:248:13 | write | semmle.label | write | | test_logging.rs:248:15:248:49 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:248:15:248:60 | ... .as_bytes() | semmle.label | ... .as_bytes() | | test_logging.rs:248:15:248:60 | ... .as_bytes() [&ref, element] | semmle.label | ... .as_bytes() [&ref, element] | | test_logging.rs:248:23:248:48 | ...::format(...) | semmle.label | ...::format(...) | | test_logging.rs:248:23:248:48 | ...::must_use(...) | semmle.label | ...::must_use(...) | | test_logging.rs:248:23:248:48 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:248:23:248:48 | { ... } | semmle.label | { ... } | | test_logging.rs:248:41:248:48 | password | semmle.label | password | -| test_logging.rs:251:9:251:13 | write | semmle.label | write | | test_logging.rs:251:15:251:49 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:251:15:251:60 | ... .as_bytes() | semmle.label | ... .as_bytes() | | test_logging.rs:251:15:251:60 | ... .as_bytes() [&ref, element] | semmle.label | ... .as_bytes() [&ref, element] | | test_logging.rs:251:23:251:48 | ...::format(...) | semmle.label | ...::format(...) | | test_logging.rs:251:23:251:48 | ...::must_use(...) | semmle.label | ...::must_use(...) | diff --git a/rust/ql/test/query-tests/security/CWE-312/CleartextStorageDatabase.expected b/rust/ql/test/query-tests/security/CWE-312/CleartextStorageDatabase.expected index 732b422c65f2..920ce2e00c27 100644 --- a/rust/ql/test/query-tests/security/CWE-312/CleartextStorageDatabase.expected +++ b/rust/ql/test/query-tests/security/CWE-312/CleartextStorageDatabase.expected @@ -1,12 +1,12 @@ #select -| test_storage.rs:100:13:100:23 | ...::query | test_storage.rs:71:97:71:114 | get_phone_number(...) | test_storage.rs:100:13:100:23 | ...::query | This database operation may read or write unencrypted sensitive data from $@. | test_storage.rs:71:97:71:114 | get_phone_number(...) | get_phone_number(...) | -| test_storage.rs:115:13:115:25 | ...::raw_sql | test_storage.rs:71:97:71:114 | get_phone_number(...) | test_storage.rs:115:13:115:25 | ...::raw_sql | This database operation may read or write unencrypted sensitive data from $@. | test_storage.rs:71:97:71:114 | get_phone_number(...) | get_phone_number(...) | -| test_storage.rs:119:13:119:23 | ...::query | test_storage.rs:71:97:71:114 | get_phone_number(...) | test_storage.rs:119:13:119:23 | ...::query | This database operation may read or write unencrypted sensitive data from $@. | test_storage.rs:71:97:71:114 | get_phone_number(...) | get_phone_number(...) | -| test_storage.rs:125:13:125:23 | ...::query | test_storage.rs:71:97:71:114 | get_phone_number(...) | test_storage.rs:125:13:125:23 | ...::query | This database operation may read or write unencrypted sensitive data from $@. | test_storage.rs:71:97:71:114 | get_phone_number(...) | get_phone_number(...) | -| test_storage.rs:139:13:139:23 | ...::query | test_storage.rs:71:97:71:114 | get_phone_number(...) | test_storage.rs:139:13:139:23 | ...::query | This database operation may read or write unencrypted sensitive data from $@. | test_storage.rs:71:97:71:114 | get_phone_number(...) | get_phone_number(...) | -| test_storage.rs:194:16:194:22 | execute | test_storage.rs:189:100:189:117 | get_phone_number(...) | test_storage.rs:194:16:194:22 | execute | This database operation may read or write unencrypted sensitive data from $@. | test_storage.rs:189:100:189:117 | get_phone_number(...) | get_phone_number(...) | -| test_storage.rs:196:24:196:32 | query_row | test_storage.rs:190:86:190:103 | get_phone_number(...) | test_storage.rs:196:24:196:32 | query_row | This database operation may read or write unencrypted sensitive data from $@. | test_storage.rs:190:86:190:103 | get_phone_number(...) | get_phone_number(...) | -| test_storage.rs:204:31:204:37 | prepare | test_storage.rs:190:86:190:103 | get_phone_number(...) | test_storage.rs:204:31:204:37 | prepare | This database operation may read or write unencrypted sensitive data from $@. | test_storage.rs:190:86:190:103 | get_phone_number(...) | get_phone_number(...) | +| test_storage.rs:100:25:100:46 | insert_query2.as_str() | test_storage.rs:71:97:71:114 | get_phone_number(...) | test_storage.rs:100:25:100:46 | insert_query2.as_str() | This database operation may read or write unencrypted sensitive data from $@. | test_storage.rs:71:97:71:114 | get_phone_number(...) | get_phone_number(...) | +| test_storage.rs:115:27:115:48 | insert_query2.as_str() | test_storage.rs:71:97:71:114 | get_phone_number(...) | test_storage.rs:115:27:115:48 | insert_query2.as_str() | This database operation may read or write unencrypted sensitive data from $@. | test_storage.rs:71:97:71:114 | get_phone_number(...) | get_phone_number(...) | +| test_storage.rs:119:25:119:46 | insert_query2.as_str() | test_storage.rs:71:97:71:114 | get_phone_number(...) | test_storage.rs:119:25:119:46 | insert_query2.as_str() | This database operation may read or write unencrypted sensitive data from $@. | test_storage.rs:71:97:71:114 | get_phone_number(...) | get_phone_number(...) | +| test_storage.rs:125:25:125:46 | insert_query2.as_str() | test_storage.rs:71:97:71:114 | get_phone_number(...) | test_storage.rs:125:25:125:46 | insert_query2.as_str() | This database operation may read or write unencrypted sensitive data from $@. | test_storage.rs:71:97:71:114 | get_phone_number(...) | get_phone_number(...) | +| test_storage.rs:139:25:139:46 | insert_query2.as_str() | test_storage.rs:71:97:71:114 | get_phone_number(...) | test_storage.rs:139:25:139:46 | insert_query2.as_str() | This database operation may read or write unencrypted sensitive data from $@. | test_storage.rs:71:97:71:114 | get_phone_number(...) | get_phone_number(...) | +| test_storage.rs:194:24:194:40 | &insert_query_bad | test_storage.rs:189:100:189:117 | get_phone_number(...) | test_storage.rs:194:24:194:40 | &insert_query_bad | This database operation may read or write unencrypted sensitive data from $@. | test_storage.rs:189:100:189:117 | get_phone_number(...) | get_phone_number(...) | +| test_storage.rs:196:34:196:50 | &select_query_bad | test_storage.rs:190:86:190:103 | get_phone_number(...) | test_storage.rs:196:34:196:50 | &select_query_bad | This database operation may read or write unencrypted sensitive data from $@. | test_storage.rs:190:86:190:103 | get_phone_number(...) | get_phone_number(...) | +| test_storage.rs:204:39:204:55 | &select_query_bad | test_storage.rs:190:86:190:103 | get_phone_number(...) | test_storage.rs:204:39:204:55 | &select_query_bad | This database operation may read or write unencrypted sensitive data from $@. | test_storage.rs:190:86:190:103 | get_phone_number(...) | get_phone_number(...) | edges | test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:100:25:100:37 | insert_query2 | provenance | | | test_storage.rs:71:9:71:21 | insert_query2 | test_storage.rs:115:27:115:39 | insert_query2 | provenance | | @@ -20,15 +20,15 @@ edges | test_storage.rs:71:97:71:114 | get_phone_number(...) | test_storage.rs:71:96:71:114 | &... | provenance | Config | | test_storage.rs:71:97:71:114 | get_phone_number(...) | test_storage.rs:71:96:71:114 | &... [&ref] | provenance | | | test_storage.rs:100:25:100:37 | insert_query2 | test_storage.rs:100:25:100:46 | insert_query2.as_str() [&ref] | provenance | MaD:8 | -| test_storage.rs:100:25:100:46 | insert_query2.as_str() [&ref] | test_storage.rs:100:13:100:23 | ...::query | provenance | MaD:4 Sink:MaD:4 | +| test_storage.rs:100:25:100:46 | insert_query2.as_str() [&ref] | test_storage.rs:100:25:100:46 | insert_query2.as_str() | provenance | Sink:MaD:4 | | test_storage.rs:115:27:115:39 | insert_query2 | test_storage.rs:115:27:115:48 | insert_query2.as_str() [&ref] | provenance | MaD:8 | -| test_storage.rs:115:27:115:48 | insert_query2.as_str() [&ref] | test_storage.rs:115:13:115:25 | ...::raw_sql | provenance | MaD:5 Sink:MaD:5 | +| test_storage.rs:115:27:115:48 | insert_query2.as_str() [&ref] | test_storage.rs:115:27:115:48 | insert_query2.as_str() | provenance | Sink:MaD:5 | | test_storage.rs:119:25:119:37 | insert_query2 | test_storage.rs:119:25:119:46 | insert_query2.as_str() [&ref] | provenance | MaD:8 | -| test_storage.rs:119:25:119:46 | insert_query2.as_str() [&ref] | test_storage.rs:119:13:119:23 | ...::query | provenance | MaD:4 Sink:MaD:4 | +| test_storage.rs:119:25:119:46 | insert_query2.as_str() [&ref] | test_storage.rs:119:25:119:46 | insert_query2.as_str() | provenance | Sink:MaD:4 | | test_storage.rs:125:25:125:37 | insert_query2 | test_storage.rs:125:25:125:46 | insert_query2.as_str() [&ref] | provenance | MaD:8 | -| test_storage.rs:125:25:125:46 | insert_query2.as_str() [&ref] | test_storage.rs:125:13:125:23 | ...::query | provenance | MaD:4 Sink:MaD:4 | +| test_storage.rs:125:25:125:46 | insert_query2.as_str() [&ref] | test_storage.rs:125:25:125:46 | insert_query2.as_str() | provenance | Sink:MaD:4 | | test_storage.rs:139:25:139:37 | insert_query2 | test_storage.rs:139:25:139:46 | insert_query2.as_str() [&ref] | provenance | MaD:8 | -| test_storage.rs:139:25:139:46 | insert_query2.as_str() [&ref] | test_storage.rs:139:13:139:23 | ...::query | provenance | MaD:4 Sink:MaD:4 | +| test_storage.rs:139:25:139:46 | insert_query2.as_str() [&ref] | test_storage.rs:139:25:139:46 | insert_query2.as_str() | provenance | Sink:MaD:4 | | test_storage.rs:189:9:189:24 | insert_query_bad | test_storage.rs:194:25:194:40 | insert_query_bad | provenance | | | test_storage.rs:189:28:189:117 | ... + ... | test_storage.rs:189:28:189:124 | ... + ... | provenance | MaD:7 | | test_storage.rs:189:28:189:124 | ... + ... | test_storage.rs:189:9:189:24 | insert_query_bad | provenance | | @@ -43,17 +43,17 @@ edges | test_storage.rs:190:85:190:103 | &... [&ref] | test_storage.rs:190:28:190:103 | ... + ... | provenance | MaD:6 | | test_storage.rs:190:86:190:103 | get_phone_number(...) | test_storage.rs:190:85:190:103 | &... | provenance | Config | | test_storage.rs:190:86:190:103 | get_phone_number(...) | test_storage.rs:190:85:190:103 | &... [&ref] | provenance | | -| test_storage.rs:194:24:194:40 | &insert_query_bad | test_storage.rs:194:16:194:22 | execute | provenance | MaD:1 Sink:MaD:1 | -| test_storage.rs:194:24:194:40 | &insert_query_bad [&ref] | test_storage.rs:194:16:194:22 | execute | provenance | MaD:1 Sink:MaD:1 | +| test_storage.rs:194:24:194:40 | &insert_query_bad | test_storage.rs:194:24:194:40 | &insert_query_bad | provenance | Sink:MaD:1 | +| test_storage.rs:194:24:194:40 | &insert_query_bad [&ref] | test_storage.rs:194:24:194:40 | &insert_query_bad | provenance | Sink:MaD:1 | | test_storage.rs:194:25:194:40 | insert_query_bad | test_storage.rs:194:24:194:40 | &insert_query_bad | provenance | Config | | test_storage.rs:194:25:194:40 | insert_query_bad | test_storage.rs:194:24:194:40 | &insert_query_bad [&ref] | provenance | | -| test_storage.rs:196:34:196:50 | &select_query_bad | test_storage.rs:196:24:196:32 | query_row | provenance | MaD:3 Sink:MaD:3 | -| test_storage.rs:196:34:196:50 | &select_query_bad [&ref] | test_storage.rs:196:24:196:32 | query_row | provenance | MaD:3 Sink:MaD:3 | +| test_storage.rs:196:34:196:50 | &select_query_bad | test_storage.rs:196:34:196:50 | &select_query_bad | provenance | Sink:MaD:3 | +| test_storage.rs:196:34:196:50 | &select_query_bad [&ref] | test_storage.rs:196:34:196:50 | &select_query_bad | provenance | Sink:MaD:3 | | test_storage.rs:196:35:196:50 | select_query_bad | test_storage.rs:196:34:196:50 | &select_query_bad | provenance | Config | | test_storage.rs:196:35:196:50 | select_query_bad | test_storage.rs:196:34:196:50 | &select_query_bad [&ref] | provenance | | | test_storage.rs:196:35:196:50 | select_query_bad | test_storage.rs:204:40:204:55 | select_query_bad | provenance | | -| test_storage.rs:204:39:204:55 | &select_query_bad | test_storage.rs:204:31:204:37 | prepare | provenance | MaD:2 Sink:MaD:2 | -| test_storage.rs:204:39:204:55 | &select_query_bad [&ref] | test_storage.rs:204:31:204:37 | prepare | provenance | MaD:2 Sink:MaD:2 | +| test_storage.rs:204:39:204:55 | &select_query_bad | test_storage.rs:204:39:204:55 | &select_query_bad | provenance | Sink:MaD:2 | +| test_storage.rs:204:39:204:55 | &select_query_bad [&ref] | test_storage.rs:204:39:204:55 | &select_query_bad | provenance | Sink:MaD:2 | | test_storage.rs:204:40:204:55 | select_query_bad | test_storage.rs:204:39:204:55 | &select_query_bad | provenance | Config | | test_storage.rs:204:40:204:55 | select_query_bad | test_storage.rs:204:39:204:55 | &select_query_bad [&ref] | provenance | | models @@ -72,20 +72,20 @@ nodes | test_storage.rs:71:96:71:114 | &... | semmle.label | &... | | test_storage.rs:71:96:71:114 | &... [&ref] | semmle.label | &... [&ref] | | test_storage.rs:71:97:71:114 | get_phone_number(...) | semmle.label | get_phone_number(...) | -| test_storage.rs:100:13:100:23 | ...::query | semmle.label | ...::query | | test_storage.rs:100:25:100:37 | insert_query2 | semmle.label | insert_query2 | +| test_storage.rs:100:25:100:46 | insert_query2.as_str() | semmle.label | insert_query2.as_str() | | test_storage.rs:100:25:100:46 | insert_query2.as_str() [&ref] | semmle.label | insert_query2.as_str() [&ref] | -| test_storage.rs:115:13:115:25 | ...::raw_sql | semmle.label | ...::raw_sql | | test_storage.rs:115:27:115:39 | insert_query2 | semmle.label | insert_query2 | +| test_storage.rs:115:27:115:48 | insert_query2.as_str() | semmle.label | insert_query2.as_str() | | test_storage.rs:115:27:115:48 | insert_query2.as_str() [&ref] | semmle.label | insert_query2.as_str() [&ref] | -| test_storage.rs:119:13:119:23 | ...::query | semmle.label | ...::query | | test_storage.rs:119:25:119:37 | insert_query2 | semmle.label | insert_query2 | +| test_storage.rs:119:25:119:46 | insert_query2.as_str() | semmle.label | insert_query2.as_str() | | test_storage.rs:119:25:119:46 | insert_query2.as_str() [&ref] | semmle.label | insert_query2.as_str() [&ref] | -| test_storage.rs:125:13:125:23 | ...::query | semmle.label | ...::query | | test_storage.rs:125:25:125:37 | insert_query2 | semmle.label | insert_query2 | +| test_storage.rs:125:25:125:46 | insert_query2.as_str() | semmle.label | insert_query2.as_str() | | test_storage.rs:125:25:125:46 | insert_query2.as_str() [&ref] | semmle.label | insert_query2.as_str() [&ref] | -| test_storage.rs:139:13:139:23 | ...::query | semmle.label | ...::query | | test_storage.rs:139:25:139:37 | insert_query2 | semmle.label | insert_query2 | +| test_storage.rs:139:25:139:46 | insert_query2.as_str() | semmle.label | insert_query2.as_str() | | test_storage.rs:139:25:139:46 | insert_query2.as_str() [&ref] | semmle.label | insert_query2.as_str() [&ref] | | test_storage.rs:189:9:189:24 | insert_query_bad | semmle.label | insert_query_bad | | test_storage.rs:189:28:189:117 | ... + ... | semmle.label | ... + ... | @@ -99,15 +99,15 @@ nodes | test_storage.rs:190:85:190:103 | &... | semmle.label | &... | | test_storage.rs:190:85:190:103 | &... [&ref] | semmle.label | &... [&ref] | | test_storage.rs:190:86:190:103 | get_phone_number(...) | semmle.label | get_phone_number(...) | -| test_storage.rs:194:16:194:22 | execute | semmle.label | execute | +| test_storage.rs:194:24:194:40 | &insert_query_bad | semmle.label | &insert_query_bad | | test_storage.rs:194:24:194:40 | &insert_query_bad | semmle.label | &insert_query_bad | | test_storage.rs:194:24:194:40 | &insert_query_bad [&ref] | semmle.label | &insert_query_bad [&ref] | | test_storage.rs:194:25:194:40 | insert_query_bad | semmle.label | insert_query_bad | -| test_storage.rs:196:24:196:32 | query_row | semmle.label | query_row | +| test_storage.rs:196:34:196:50 | &select_query_bad | semmle.label | &select_query_bad | | test_storage.rs:196:34:196:50 | &select_query_bad | semmle.label | &select_query_bad | | test_storage.rs:196:34:196:50 | &select_query_bad [&ref] | semmle.label | &select_query_bad [&ref] | | test_storage.rs:196:35:196:50 | select_query_bad | semmle.label | select_query_bad | -| test_storage.rs:204:31:204:37 | prepare | semmle.label | prepare | +| test_storage.rs:204:39:204:55 | &select_query_bad | semmle.label | &select_query_bad | | test_storage.rs:204:39:204:55 | &select_query_bad | semmle.label | &select_query_bad | | test_storage.rs:204:39:204:55 | &select_query_bad [&ref] | semmle.label | &select_query_bad [&ref] | | test_storage.rs:204:40:204:55 | select_query_bad | semmle.label | select_query_bad | 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 25890c769856..227ed7a408b3 100644 --- a/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected +++ b/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected @@ -1,15 +1,15 @@ #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 | -| 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 | +| main.rs:12:45:12:68 | "http://example.com/api" | main.rs:12:45:12:68 | "http://example.com/api" | main.rs:12:45:12:68 | "http://example.com/api" | 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:45:13:68 | "HTTP://EXAMPLE.COM/API" | main.rs:13:45:13:68 | "HTTP://EXAMPLE.COM/API" | main.rs:13:45:13:68 | "HTTP://EXAMPLE.COM/API" | 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:45:14:73 | "http://api.example.com/data" | main.rs:14:45:14:73 | "http://api.example.com/data" | main.rs:14:45:14:73 | "http://api.example.com/data" | 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:44:26:52 | &full_url | main.rs:23:20:23:39 | "http://example.com" | main.rs:26:44:26:52 | &full_url | 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:53:37:65 | &insecure_url | main.rs:34:20:34:28 | "http://" | main.rs:37:53:37:65 | &insecure_url | This URL may be constructed with the HTTP protocol, from $@. | main.rs:34:20:34:28 | "http://" | this HTTP URL | +| main.rs:60:43:60:65 | "http://172.32.0.0/baz" | main.rs:60:43:60:65 | "http://172.32.0.0/baz" | main.rs:60:43:60:65 | "http://172.32.0.0/baz" | 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:47:71:49 | url | main.rs:68:19:68:53 | "http://example.com/sensitive-... | main.rs:71:47:71:49 | url | 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:12:45:12:68 | "http://example.com/api" | main.rs:12:45:12:68 | "http://example.com/api" | provenance | Sink:MaD:1 | +| main.rs:13:45:13:68 | "HTTP://EXAMPLE.COM/API" | main.rs:13:45:13:68 | "HTTP://EXAMPLE.COM/API" | provenance | Sink:MaD:1 | +| main.rs:14:45:14:73 | "http://api.example.com/data" | main.rs:14:45:14:73 | "http://api.example.com/data" | provenance | 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 | | | main.rs:25:9:25:16 | full_url | main.rs:26:45:26:52 | full_url | provenance | | @@ -17,7 +17,7 @@ edges | main.rs:25:28:25:53 | ...::must_use(...) | main.rs:25:9:25:16 | full_url | provenance | | | main.rs:25:28:25:53 | MacroExpr | main.rs:25:28:25:53 | ...::format(...) | provenance | MaD:2 | | main.rs:25:28:25:53 | { ... } | main.rs:25:28:25:53 | ...::must_use(...) | provenance | MaD:3 | -| main.rs:26:44:26:52 | &full_url [&ref] | main.rs:26:21:26:42 | ...::get | provenance | MaD:1 Sink:MaD:1 | +| main.rs:26:44:26:52 | &full_url [&ref] | main.rs:26:44:26:52 | &full_url | provenance | Sink:MaD:1 | | main.rs:26:45:26:52 | full_url | main.rs:26:44:26:52 | &full_url [&ref] | provenance | | | main.rs:34:9:34:16 | protocol | main.rs:36:32:36:53 | MacroExpr | provenance | | | main.rs:34:20:34:28 | "http://" | main.rs:34:9:34:16 | protocol | provenance | | @@ -26,22 +26,21 @@ edges | main.rs:36:32:36:53 | ...::must_use(...) | main.rs:36:9:36:20 | insecure_url | provenance | | | main.rs:36:32:36:53 | MacroExpr | main.rs:36:32:36:53 | ...::format(...) | provenance | MaD:2 | | 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:53:37:65 | &insecure_url [&ref] | main.rs:37:53:37:65 | &insecure_url | provenance | Sink:MaD:1 | | main.rs:37:54:37:65 | insecure_url | main.rs:37:53:37:65 | &insecure_url [&ref] | provenance | | -| 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:60:43:60:65 | "http://172.32.0.0/baz" | main.rs:60:43:60:65 | "http://172.32.0.0/baz" | provenance | Sink:MaD:1 | +| main.rs:68:13:68:15 | url | main.rs:71:47:71:49 | url | provenance | Sink:MaD:1 | | main.rs:68:19:68:53 | "http://example.com/sensitive-... | main.rs:68:13:68:15 | url | provenance | | -| main.rs:71:47:71:49 | url | main.rs:71:24:71:45 | ...::get | provenance | MaD:1 Sink:MaD:1 | models | 1 | Sink: reqwest::blocking::get; Argument[0]; request-url | | 2 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | | 3 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | 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:12:45:12:68 | "http://example.com/api" | semmle.label | "http://example.com/api" | +| main.rs:13:45:13:68 | "HTTP://EXAMPLE.COM/API" | semmle.label | "HTTP://EXAMPLE.COM/API" | | 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: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 | | main.rs:23:20:23:39 | "http://example.com" | semmle.label | "http://example.com" | @@ -50,7 +49,7 @@ nodes | main.rs:25:28:25:53 | ...::must_use(...) | semmle.label | ...::must_use(...) | | main.rs:25:28:25:53 | MacroExpr | semmle.label | MacroExpr | | main.rs:25:28:25:53 | { ... } | semmle.label | { ... } | -| main.rs:26:21:26:42 | ...::get | semmle.label | ...::get | +| main.rs:26:44:26:52 | &full_url | semmle.label | &full_url | | main.rs:26:44:26:52 | &full_url [&ref] | semmle.label | &full_url [&ref] | | main.rs:26:45:26:52 | full_url | semmle.label | full_url | | main.rs:34:9:34:16 | protocol | semmle.label | protocol | @@ -60,13 +59,12 @@ nodes | main.rs:36:32:36:53 | ...::must_use(...) | semmle.label | ...::must_use(...) | | main.rs:36:32:36:53 | MacroExpr | semmle.label | MacroExpr | | main.rs:36:32:36:53 | { ... } | semmle.label | { ... } | -| main.rs:37:30:37:51 | ...::get | semmle.label | ...::get | +| main.rs:37:53:37:65 | &insecure_url | semmle.label | &insecure_url | | 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: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: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 | | main.rs:68:19:68:53 | "http://example.com/sensitive-... | semmle.label | "http://example.com/sensitive-... | -| main.rs:71:24:71:45 | ...::get | semmle.label | ...::get | | main.rs:71:47:71:49 | url | semmle.label | url | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-327/WeakSensitiveDataHashing/CryptographicOperations.expected b/rust/ql/test/query-tests/security/CWE-327/WeakSensitiveDataHashing/CryptographicOperations.expected index a190d85cce9a..e9a73ff6fe43 100644 --- a/rust/ql/test/query-tests/security/CWE-327/WeakSensitiveDataHashing/CryptographicOperations.expected +++ b/rust/ql/test/query-tests/security/CWE-327/WeakSensitiveDataHashing/CryptographicOperations.expected @@ -1,7 +1,7 @@ -| test.rs:19:9:19:34 | ...::compute(...) | HashingAlgorithm MD5 WEAK inputs:1 | -| test.rs:20:9:20:40 | ...::compute(...) | HashingAlgorithm MD5 WEAK inputs:1 | -| test.rs:21:9:21:34 | ...::compute(...) | HashingAlgorithm MD5 WEAK inputs:1 | -| test.rs:22:9:22:44 | ...::compute(...) | HashingAlgorithm MD5 WEAK inputs:1 | +| test.rs:19:26:19:33 | harmless | HashingAlgorithm MD5 WEAK inputs:1 | +| test.rs:20:26:20:39 | credit_card_no | HashingAlgorithm MD5 WEAK inputs:1 | +| test.rs:21:26:21:33 | password | HashingAlgorithm MD5 WEAK inputs:1 | +| test.rs:22:26:22:43 | encrypted_password | HashingAlgorithm MD5 WEAK inputs:1 | | test.rs:67:26:67:40 | ...::new(...) | HashingAlgorithm MD5 WEAK | | test.rs:73:9:73:23 | ...::new(...) | HashingAlgorithm MD5 WEAK | | test.rs:74:9:74:23 | ...::new(...) | HashingAlgorithm MD5 WEAK | @@ -9,4 +9,4 @@ | test.rs:156:26:156:40 | ...::new(...) | HashingAlgorithm MD5 WEAK | | test.rs:176:13:176:24 | ...::new(...) | EncryptionAlgorithm SEED | | test.rs:199:22:199:32 | ...::new(...) | HashingAlgorithm SHA1 WEAK | -| test.rs:211:13:211:35 | ...::compute(...) | HashingAlgorithm MD5 WEAK inputs:1 | +| test.rs:211:30:211:34 | value | HashingAlgorithm MD5 WEAK inputs:1 | diff --git a/rust/ql/test/query-tests/security/CWE-327/WeakSensitiveDataHashing/WeakSensitiveDataHashing.expected b/rust/ql/test/query-tests/security/CWE-327/WeakSensitiveDataHashing/WeakSensitiveDataHashing.expected index 89078b7c4b9d..e34feaa0592f 100644 --- a/rust/ql/test/query-tests/security/CWE-327/WeakSensitiveDataHashing/WeakSensitiveDataHashing.expected +++ b/rust/ql/test/query-tests/security/CWE-327/WeakSensitiveDataHashing/WeakSensitiveDataHashing.expected @@ -1,22 +1,20 @@ #select -| test.rs:20:9:20:24 | ...::compute | test.rs:20:26:20:39 | credit_card_no | test.rs:20:9:20:24 | ...::compute | $@ is used in a hashing algorithm (MD5) that is insecure. | test.rs:20:26:20:39 | credit_card_no | Sensitive data (private) | -| test.rs:21:9:21:24 | ...::compute | test.rs:21:26:21:33 | password | test.rs:21:9:21:24 | ...::compute | $@ is used in a hashing algorithm (MD5) that is insecure for password hashing, since it is not a computationally expensive hash function. | test.rs:21:26:21:33 | password | Sensitive data (password) | -| test.rs:211:13:211:28 | ...::compute | test.rs:226:29:226:36 | password | test.rs:211:13:211:28 | ...::compute | $@ is used in a hashing algorithm (MD5) that is insecure for password hashing, since it is not a computationally expensive hash function. | test.rs:226:29:226:36 | password | Sensitive data (password) | +| test.rs:20:26:20:39 | credit_card_no | test.rs:20:26:20:39 | credit_card_no | test.rs:20:26:20:39 | credit_card_no | $@ is used in a hashing algorithm (MD5) that is insecure. | test.rs:20:26:20:39 | credit_card_no | Sensitive data (private) | +| test.rs:21:26:21:33 | password | test.rs:21:26:21:33 | password | test.rs:21:26:21:33 | password | $@ is used in a hashing algorithm (MD5) that is insecure for password hashing, since it is not a computationally expensive hash function. | test.rs:21:26:21:33 | password | Sensitive data (password) | +| test.rs:211:30:211:34 | value | test.rs:226:29:226:36 | password | test.rs:211:30:211:34 | value | $@ is used in a hashing algorithm (MD5) that is insecure for password hashing, since it is not a computationally expensive hash function. | test.rs:226:29:226:36 | password | Sensitive data (password) | edges -| test.rs:20:26:20:39 | credit_card_no | test.rs:20:9:20:24 | ...::compute | provenance | MaD:1 Sink:MaD:1 | -| test.rs:21:26:21:33 | password | test.rs:21:9:21:24 | ...::compute | provenance | MaD:1 Sink:MaD:1 | -| test.rs:210:20:210:30 | ...: ... | test.rs:211:30:211:34 | value | provenance | | -| test.rs:211:30:211:34 | value | test.rs:211:13:211:28 | ...::compute | provenance | MaD:1 Sink:MaD:1 | +| test.rs:20:26:20:39 | credit_card_no | test.rs:20:26:20:39 | credit_card_no | provenance | Sink:MaD:1 | +| test.rs:21:26:21:33 | password | test.rs:21:26:21:33 | password | provenance | Sink:MaD:1 | +| test.rs:210:20:210:30 | ...: ... | test.rs:211:30:211:34 | value | provenance | Sink:MaD:1 | | test.rs:226:29:226:36 | password | test.rs:210:20:210:30 | ...: ... | provenance | | models | 1 | Sink: md5::compute; Argument[0]; hasher-input | nodes -| test.rs:20:9:20:24 | ...::compute | semmle.label | ...::compute | | test.rs:20:26:20:39 | credit_card_no | semmle.label | credit_card_no | -| test.rs:21:9:21:24 | ...::compute | semmle.label | ...::compute | +| test.rs:20:26:20:39 | credit_card_no | semmle.label | credit_card_no | +| test.rs:21:26:21:33 | password | semmle.label | password | | test.rs:21:26:21:33 | password | semmle.label | password | | test.rs:210:20:210:30 | ...: ... | semmle.label | ...: ... | -| test.rs:211:13:211:28 | ...::compute | semmle.label | ...::compute | | test.rs:211:30:211:34 | value | semmle.label | value | | test.rs:226:29:226:36 | password | semmle.label | password | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-614/InsecureCookie.expected b/rust/ql/test/query-tests/security/CWE-614/InsecureCookie.expected index 7decd880f595..e6a8a85922ca 100644 --- a/rust/ql/test/query-tests/security/CWE-614/InsecureCookie.expected +++ b/rust/ql/test/query-tests/security/CWE-614/InsecureCookie.expected @@ -1,137 +1,135 @@ #select -| main.rs:8:66:8:70 | build | main.rs:8:19:8:50 | ...::build(...) | main.rs:8:66:8:70 | build | Cookie attribute 'Secure' is not set to true. | -| main.rs:16:52:16:56 | build | main.rs:16:19:16:31 | ...::build | main.rs:16:52:16:56 | build | Cookie attribute 'Secure' is not set to true. | -| main.rs:20:56:20:60 | build | main.rs:20:5:20:36 | ...::build(...) | main.rs:20:56:20:60 | build | Cookie attribute 'Secure' is not set to true. | -| main.rs:21:57:21:61 | build | main.rs:21:5:21:36 | ...::build(...) | main.rs:21:57:21:61 | build | Cookie attribute 'Secure' is not set to true. | -| main.rs:25:54:25:58 | build | main.rs:25:5:25:36 | ...::build(...) | main.rs:25:54:25:58 | build | Cookie attribute 'Secure' is not set to true. | -| main.rs:26:52:26:56 | build | main.rs:26:5:26:36 | ...::build(...) | main.rs:26:52:26:56 | build | Cookie attribute 'Secure' is not set to true. | -| main.rs:27:53:27:57 | build | main.rs:27:5:27:36 | ...::build(...) | main.rs:27:53:27:57 | build | Cookie attribute 'Secure' is not set to true. | -| main.rs:28:62:28:66 | build | main.rs:28:5:28:36 | ...::build(...) | main.rs:28:62:28:66 | build | Cookie attribute 'Secure' is not set to true. | -| main.rs:29:62:29:66 | build | main.rs:29:5:29:36 | ...::build(...) | main.rs:29:62:29:66 | build | Cookie attribute 'Secure' is not set to true. | -| main.rs:33:60:33:64 | build | main.rs:33:9:33:40 | ...::build(...) | main.rs:33:60:33:64 | build | Cookie attribute 'Secure' is not set to true. | -| main.rs:35:60:35:64 | build | main.rs:35:9:35:40 | ...::build(...) | main.rs:35:60:35:64 | build | Cookie attribute 'Secure' is not set to true. | -| main.rs:39:55:39:59 | build | main.rs:39:5:39:39 | ...::new(...) | main.rs:39:55:39:59 | build | Cookie attribute 'Secure' is not set to true. | -| main.rs:40:66:40:70 | build | main.rs:40:5:40:50 | ... .expires(...) | main.rs:40:66:40:70 | build | Cookie attribute 'Secure' is not set to true. | -| main.rs:41:95:41:99 | build | main.rs:41:5:41:79 | ... .max_age(...) | main.rs:41:95:41:99 | build | Cookie attribute 'Secure' is not set to true. | -| main.rs:42:74:42:78 | build | main.rs:42:5:42:58 | ... .domain(...) | main.rs:42:74:42:78 | build | Cookie attribute 'Secure' is not set to true. | -| main.rs:43:62:43:66 | build | main.rs:43:5:43:46 | ... .path(...) | main.rs:43:62:43:66 | build | Cookie attribute 'Secure' is not set to true. | -| main.rs:44:68:44:72 | build | main.rs:44:5:44:52 | ... .http_only(...) | main.rs:44:68:44:72 | build | Cookie attribute 'Secure' is not set to true. | -| main.rs:45:88:45:92 | build | main.rs:45:5:45:72 | ... .same_site(...) | main.rs:45:88:45:92 | build | Cookie attribute 'Secure' is not set to true. | -| main.rs:46:64:46:68 | build | main.rs:46:5:46:48 | ... .permanent() | main.rs:46:64:46:68 | build | Cookie attribute 'Secure' is not set to true. | -| main.rs:47:62:47:66 | build | main.rs:47:5:47:46 | ... .removal() | main.rs:47:62:47:66 | build | Cookie attribute 'Secure' is not set to true. | -| main.rs:48:52:48:57 | finish | main.rs:48:5:48:36 | ...::build(...) | main.rs:48:52:48:57 | finish | Cookie attribute 'Secure' is not set to true. | -| main.rs:49:41:49:45 | build | main.rs:49:5:49:25 | ...::build(...) | main.rs:49:41:49:45 | build | Cookie attribute 'Secure' is not set to true. | -| main.rs:50:56:50:60 | build | main.rs:50:5:50:40 | ...::build(...) | main.rs:50:56:50:60 | build | Cookie attribute 'Secure' is not set to true. | -| main.rs:53:65:53:69 | build | main.rs:53:5:53:49 | ... .secure(...) | main.rs:53:65:53:69 | build | Cookie attribute 'Secure' is not set to true. | -| main.rs:59:9:59:11 | add | main.rs:58:17:58:27 | ...::new | main.rs:59:9:59:11 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:60:9:60:20 | add_original | main.rs:58:17:58:27 | ...::new | main.rs:60:9:60:20 | add_original | Cookie attribute 'Secure' is not set to true. | -| main.rs:64:9:64:11 | add | main.rs:63:5:63:5 | [SSA] a | main.rs:64:9:64:11 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:64:9:64:11 | add | main.rs:63:5:63:5 | a | main.rs:64:9:64:11 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:69:16:69:18 | add | main.rs:68:17:68:29 | ...::named | main.rs:69:16:69:18 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:70:16:70:27 | add_original | main.rs:63:5:63:5 | [SSA] a | main.rs:70:16:70:27 | add_original | Cookie attribute 'Secure' is not set to true. | -| main.rs:70:16:70:27 | add_original | main.rs:63:5:63:5 | a | main.rs:70:16:70:27 | add_original | Cookie attribute 'Secure' is not set to true. | -| main.rs:72:16:72:18 | add | main.rs:71:5:71:5 | [SSA] b | main.rs:72:16:72:18 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:72:16:72:18 | add | main.rs:71:5:71:5 | b | main.rs:72:16:72:18 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:78:17:78:19 | add | main.rs:77:17:77:28 | ...::from | main.rs:78:17:78:19 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:79:17:79:28 | add_original | main.rs:63:5:63:5 | [SSA] a | main.rs:79:17:79:28 | add_original | Cookie attribute 'Secure' is not set to true. | -| main.rs:79:17:79:28 | add_original | main.rs:63:5:63:5 | a | main.rs:79:17:79:28 | add_original | Cookie attribute 'Secure' is not set to true. | -| main.rs:83:17:83:19 | add | main.rs:77:17:77:28 | ...::from | main.rs:83:17:83:19 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:88:9:88:11 | add | main.rs:87:17:87:28 | ...::from | main.rs:88:9:88:11 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:94:9:94:11 | add | main.rs:87:17:87:28 | ...::from | main.rs:94:9:94:11 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:123:13:123:18 | insert | main.rs:122:13:122:41 | ...::new | main.rs:123:13:123:18 | insert | Cookie attribute 'Secure' is not set to true. | -| main.rs:131:13:131:18 | insert | main.rs:130:13:130:13 | b | main.rs:131:13:131:18 | insert | Cookie attribute 'Secure' is not set to true. | -| main.rs:147:13:147:18 | insert | main.rs:146:13:146:13 | f | main.rs:147:13:147:18 | insert | Cookie attribute 'Secure' is not set to true. | -| main.rs:152:13:152:18 | insert | main.rs:151:13:151:42 | ...::from | main.rs:152:13:152:18 | insert | Cookie attribute 'Secure' is not set to true. | -| main.rs:156:13:156:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:156:13:156:18 | insert | Cookie attribute 'Secure' is not set to true. | -| main.rs:157:13:157:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:157:13:157:18 | insert | Cookie attribute 'Secure' is not set to true. | -| main.rs:158:13:158:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:158:13:158:18 | insert | Cookie attribute 'Secure' is not set to true. | -| main.rs:159:13:159:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:159:13:159:18 | insert | Cookie attribute 'Secure' is not set to true. | -| main.rs:160:13:160:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:160:13:160:18 | insert | Cookie attribute 'Secure' is not set to true. | -| main.rs:161:13:161:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:161:13:161:18 | insert | Cookie attribute 'Secure' is not set to true. | -| main.rs:162:13:162:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:162:13:162:18 | insert | Cookie attribute 'Secure' is not set to true. | -| main.rs:163:13:163:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:163:13:163:18 | insert | Cookie attribute 'Secure' is not set to true. | -| main.rs:164:13:164:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:164:13:164:18 | insert | Cookie attribute 'Secure' is not set to true. | -| main.rs:165:13:165:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:165:13:165:18 | insert | Cookie attribute 'Secure' is not set to true. | -| main.rs:166:13:166:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:166:13:166:18 | insert | Cookie attribute 'Secure' is not set to true. | -| main.rs:167:13:167:18 | insert | main.rs:155:13:155:41 | ...::new | main.rs:167:13:167:18 | insert | Cookie attribute 'Secure' is not set to true. | -| main.rs:173:61:173:65 | build | main.rs:173:22:173:34 | ...::build | main.rs:173:61:173:65 | build | Cookie attribute 'Secure' is not set to true. | -| main.rs:197:55:197:60 | finish | main.rs:197:5:197:39 | ...::build(...) | main.rs:197:55:197:60 | finish | Cookie attribute 'Secure' is not set to true. | -| main.rs:198:65:198:70 | finish | main.rs:198:5:198:39 | ...::build(...) | main.rs:198:65:198:70 | finish | Cookie attribute 'Secure' is not set to true. | -| main.rs:202:9:202:11 | add | main.rs:201:5:201:11 | [SSA] cookie1 | main.rs:202:9:202:11 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:202:9:202:11 | add | main.rs:201:5:201:11 | cookie1 | main.rs:202:9:202:11 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:212:41:212:46 | finish | main.rs:212:5:212:22 | ...::build | main.rs:212:41:212:46 | finish | Cookie attribute 'Secure' is not set to true. | -| main.rs:215:9:215:11 | add | main.rs:214:19:214:34 | ...::new | main.rs:215:9:215:11 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:219:9:219:11 | add | main.rs:218:5:218:11 | [SSA] cookie2 | main.rs:219:9:219:11 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:219:9:219:11 | add | main.rs:218:5:218:11 | cookie2 | main.rs:219:9:219:11 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:229:9:229:11 | add | main.rs:228:5:228:11 | [SSA] cookie1 | main.rs:229:9:229:11 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:229:9:229:11 | add | main.rs:228:5:228:11 | cookie1 | main.rs:229:9:229:11 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:242:9:242:41 | ...::new | main.rs:241:29:241:62 | ...::new(...) | main.rs:242:9:242:41 | ...::new | Cookie attribute 'Secure' is not set to true. | -| main.rs:245:9:245:41 | ...::new | main.rs:244:30:244:63 | ...::new(...) | main.rs:245:9:245:41 | ...::new | Cookie attribute 'Secure' is not set to true. | -| main.rs:259:59:259:64 | finish | main.rs:259:5:259:43 | ...::build(...) | main.rs:259:59:259:64 | finish | Cookie attribute 'Secure' is not set to true. | -| main.rs:260:69:260:74 | finish | main.rs:260:5:260:43 | ...::build(...) | main.rs:260:69:260:74 | finish | Cookie attribute 'Secure' is not set to true. | -| main.rs:264:9:264:11 | add | main.rs:263:5:263:11 | [SSA] cookie1 | main.rs:264:9:264:11 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:264:9:264:11 | add | main.rs:263:5:263:11 | cookie1 | main.rs:264:9:264:11 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:274:45:274:50 | finish | main.rs:274:5:274:26 | ...::build | main.rs:274:45:274:50 | finish | Cookie attribute 'Secure' is not set to true. | -| main.rs:277:9:277:11 | add | main.rs:276:19:276:38 | ...::new | main.rs:277:9:277:11 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:281:9:281:11 | add | main.rs:280:5:280:11 | [SSA] cookie2 | main.rs:281:9:281:11 | add | Cookie attribute 'Secure' is not set to true. | -| main.rs:281:9:281:11 | add | main.rs:280:5:280:11 | cookie2 | main.rs:281:9:281:11 | add | Cookie attribute 'Secure' is not set to true. | +| main.rs:8:19:8:64 | ... .secure(...) | main.rs:8:19:8:50 | ...::build(...) | main.rs:8:19:8:64 | ... .secure(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:16:19:16:50 | ...::build(...) | main.rs:16:19:16:50 | ...::build(...) | main.rs:16:19:16:50 | ...::build(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:20:5:20:54 | ... .secure(...) | main.rs:20:5:20:36 | ...::build(...) | main.rs:20:5:20:54 | ... .secure(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:21:5:21:55 | ... .secure(...) | main.rs:21:5:21:36 | ...::build(...) | main.rs:21:5:21:55 | ... .secure(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:25:5:25:52 | ... .secure(...) | main.rs:25:5:25:36 | ...::build(...) | main.rs:25:5:25:52 | ... .secure(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:26:5:26:50 | ... .secure(...) | main.rs:26:5:26:36 | ...::build(...) | main.rs:26:5:26:50 | ... .secure(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:27:5:27:51 | ... .secure(...) | main.rs:27:5:27:36 | ...::build(...) | main.rs:27:5:27:51 | ... .secure(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:28:5:28:60 | ... .secure(...) | main.rs:28:5:28:36 | ...::build(...) | main.rs:28:5:28:60 | ... .secure(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:29:5:29:60 | ... .secure(...) | main.rs:29:5:29:36 | ...::build(...) | main.rs:29:5:29:60 | ... .secure(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:33:9:33:58 | ... .secure(...) | main.rs:33:9:33:40 | ...::build(...) | main.rs:33:9:33:58 | ... .secure(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:35:9:35:58 | ... .secure(...) | main.rs:35:9:35:40 | ...::build(...) | main.rs:35:9:35:58 | ... .secure(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:39:5:39:53 | ... .secure(...) | main.rs:39:5:39:39 | ...::new(...) | main.rs:39:5:39:53 | ... .secure(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:40:5:40:64 | ... .secure(...) | main.rs:40:5:40:50 | ... .expires(...) | main.rs:40:5:40:64 | ... .secure(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:41:5:41:93 | ... .secure(...) | main.rs:41:5:41:79 | ... .max_age(...) | main.rs:41:5:41:93 | ... .secure(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:42:5:42:72 | ... .secure(...) | main.rs:42:5:42:58 | ... .domain(...) | main.rs:42:5:42:72 | ... .secure(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:43:5:43:60 | ... .secure(...) | main.rs:43:5:43:46 | ... .path(...) | main.rs:43:5:43:60 | ... .secure(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:44:5:44:66 | ... .secure(...) | main.rs:44:5:44:52 | ... .http_only(...) | main.rs:44:5:44:66 | ... .secure(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:45:5:45:86 | ... .secure(...) | main.rs:45:5:45:72 | ... .same_site(...) | main.rs:45:5:45:86 | ... .secure(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:46:5:46:62 | ... .secure(...) | main.rs:46:5:46:48 | ... .permanent() | main.rs:46:5:46:62 | ... .secure(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:47:5:47:60 | ... .secure(...) | main.rs:47:5:47:46 | ... .removal() | main.rs:47:5:47:60 | ... .secure(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:48:5:48:50 | ... .secure(...) | main.rs:48:5:48:36 | ...::build(...) | main.rs:48:5:48:50 | ... .secure(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:49:5:49:39 | ... .secure(...) | main.rs:49:5:49:25 | ...::build(...) | main.rs:49:5:49:39 | ... .secure(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:50:5:50:54 | ... .secure(...) | main.rs:50:5:50:40 | ...::build(...) | main.rs:50:5:50:54 | ... .secure(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:53:5:53:63 | ... .secure(...) | main.rs:53:5:53:49 | ... .secure(...) | main.rs:53:5:53:63 | ... .secure(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:59:13:59:21 | a.clone() | main.rs:58:17:58:44 | ...::new(...) | main.rs:59:13:59:21 | a.clone() | Cookie attribute 'Secure' is not set to true. | +| main.rs:60:22:60:30 | a.clone() | main.rs:58:17:58:44 | ...::new(...) | main.rs:60:22:60:30 | a.clone() | Cookie attribute 'Secure' is not set to true. | +| main.rs:64:13:64:21 | a.clone() | main.rs:63:5:63:5 | [SSA] a | main.rs:64:13:64:21 | a.clone() | Cookie attribute 'Secure' is not set to true. | +| main.rs:64:13:64:21 | a.clone() | main.rs:63:5:63:5 | a | main.rs:64:13:64:21 | a.clone() | Cookie attribute 'Secure' is not set to true. | +| main.rs:69:20:69:28 | b.clone() | main.rs:68:17:68:37 | ...::named(...) | main.rs:69:20:69:28 | b.clone() | Cookie attribute 'Secure' is not set to true. | +| main.rs:70:29:70:37 | a.clone() | main.rs:63:5:63:5 | [SSA] a | main.rs:70:29:70:37 | a.clone() | Cookie attribute 'Secure' is not set to true. | +| main.rs:70:29:70:37 | a.clone() | main.rs:63:5:63:5 | a | main.rs:70:29:70:37 | a.clone() | Cookie attribute 'Secure' is not set to true. | +| main.rs:72:20:72:28 | b.clone() | main.rs:71:5:71:5 | [SSA] b | main.rs:72:20:72:28 | b.clone() | Cookie attribute 'Secure' is not set to true. | +| main.rs:72:20:72:28 | b.clone() | main.rs:71:5:71:5 | b | main.rs:72:20:72:28 | b.clone() | Cookie attribute 'Secure' is not set to true. | +| main.rs:78:21:78:29 | c.clone() | main.rs:77:17:77:36 | ...::from(...) | main.rs:78:21:78:29 | c.clone() | Cookie attribute 'Secure' is not set to true. | +| main.rs:79:30:79:38 | a.clone() | main.rs:63:5:63:5 | [SSA] a | main.rs:79:30:79:38 | a.clone() | Cookie attribute 'Secure' is not set to true. | +| main.rs:79:30:79:38 | a.clone() | main.rs:63:5:63:5 | a | main.rs:79:30:79:38 | a.clone() | Cookie attribute 'Secure' is not set to true. | +| main.rs:83:21:83:29 | c.clone() | main.rs:77:17:77:36 | ...::from(...) | main.rs:83:21:83:29 | c.clone() | Cookie attribute 'Secure' is not set to true. | +| main.rs:88:13:88:21 | d.clone() | main.rs:87:17:87:36 | ...::from(...) | main.rs:88:13:88:21 | d.clone() | Cookie attribute 'Secure' is not set to true. | +| main.rs:94:13:94:21 | d.clone() | main.rs:87:17:87:36 | ...::from(...) | main.rs:94:13:94:21 | d.clone() | Cookie attribute 'Secure' is not set to true. | +| main.rs:123:20:123:28 | a.clone() | main.rs:122:13:122:58 | ...::new(...) | main.rs:123:20:123:28 | a.clone() | Cookie attribute 'Secure' is not set to true. | +| main.rs:131:20:131:28 | c.clone() | main.rs:130:13:130:13 | b | main.rs:131:20:131:28 | c.clone() | Cookie attribute 'Secure' is not set to true. | +| main.rs:147:20:147:28 | g.clone() | main.rs:146:13:146:13 | f | main.rs:147:20:147:28 | g.clone() | Cookie attribute 'Secure' is not set to true. | +| main.rs:152:20:152:20 | h | main.rs:151:13:151:61 | ...::from(...) | main.rs:152:20:152:20 | h | Cookie attribute 'Secure' is not set to true. | +| main.rs:156:20:156:46 | ... .set_name(...) | main.rs:155:13:155:58 | ...::new(...) | main.rs:156:20:156:46 | ... .set_name(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:157:20:157:48 | ... .set_value(...) | main.rs:155:13:155:58 | ...::new(...) | main.rs:157:20:157:48 | ... .set_value(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:158:20:158:48 | ... .set_http_only(...) | main.rs:155:13:155:58 | ...::new(...) | main.rs:158:20:158:48 | ... .set_http_only(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:159:20:159:70 | ... .set_same_site(...) | main.rs:155:13:155:58 | ...::new(...) | main.rs:159:20:159:70 | ... .set_same_site(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:160:20:160:46 | ... .set_max_age(...) | main.rs:155:13:155:58 | ...::new(...) | main.rs:160:20:160:46 | ... .set_max_age(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:161:20:161:42 | ... .set_path(...) | main.rs:155:13:155:58 | ...::new(...) | main.rs:161:20:161:42 | ... .set_path(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:162:20:162:41 | ... .unset_path() | main.rs:155:13:155:58 | ...::new(...) | main.rs:162:20:162:41 | ... .unset_path() | Cookie attribute 'Secure' is not set to true. | +| main.rs:163:20:163:54 | ... .set_domain(...) | main.rs:155:13:155:58 | ...::new(...) | main.rs:163:20:163:54 | ... .set_domain(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:164:20:164:43 | ... .unset_domain() | main.rs:155:13:155:58 | ...::new(...) | main.rs:164:20:164:43 | ... .unset_domain() | Cookie attribute 'Secure' is not set to true. | +| main.rs:165:20:165:46 | ... .set_expires(...) | main.rs:155:13:155:58 | ...::new(...) | main.rs:165:20:165:46 | ... .set_expires(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:166:20:166:44 | ... .unset_expires() | main.rs:155:13:155:58 | ...::new(...) | main.rs:166:20:166:44 | ... .unset_expires() | Cookie attribute 'Secure' is not set to true. | +| main.rs:167:20:167:45 | ... .make_permanent() | main.rs:155:13:155:58 | ...::new(...) | main.rs:167:20:167:45 | ... .make_permanent() | Cookie attribute 'Secure' is not set to true. | +| main.rs:173:22:173:59 | ...::build(...) | main.rs:173:22:173:59 | ...::build(...) | main.rs:173:22:173:59 | ...::build(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:197:5:197:53 | ... .secure(...) | main.rs:197:5:197:39 | ...::build(...) | main.rs:197:5:197:53 | ... .secure(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:198:5:198:63 | ... .path(...) | main.rs:198:5:198:39 | ...::build(...) | main.rs:198:5:198:63 | ... .path(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:202:13:202:27 | cookie1.clone() | main.rs:201:5:201:11 | [SSA] cookie1 | main.rs:202:13:202:27 | cookie1.clone() | Cookie attribute 'Secure' is not set to true. | +| main.rs:202:13:202:27 | cookie1.clone() | main.rs:201:5:201:11 | cookie1 | main.rs:202:13:202:27 | cookie1.clone() | Cookie attribute 'Secure' is not set to true. | +| main.rs:212:5:212:39 | ...::build(...) | main.rs:212:5:212:39 | ...::build(...) | main.rs:212:5:212:39 | ...::build(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:215:13:215:27 | cookie3.clone() | main.rs:214:19:214:51 | ...::new(...) | main.rs:215:13:215:27 | cookie3.clone() | Cookie attribute 'Secure' is not set to true. | +| main.rs:219:13:219:27 | cookie2.clone() | main.rs:218:5:218:11 | [SSA] cookie2 | main.rs:219:13:219:27 | cookie2.clone() | Cookie attribute 'Secure' is not set to true. | +| main.rs:219:13:219:27 | cookie2.clone() | main.rs:218:5:218:11 | cookie2 | main.rs:219:13:219:27 | cookie2.clone() | Cookie attribute 'Secure' is not set to true. | +| main.rs:229:13:229:27 | cookie1.clone() | main.rs:228:5:228:11 | [SSA] cookie1 | main.rs:229:13:229:27 | cookie1.clone() | Cookie attribute 'Secure' is not set to true. | +| main.rs:229:13:229:27 | cookie1.clone() | main.rs:228:5:228:11 | cookie1 | main.rs:229:13:229:27 | cookie1.clone() | Cookie attribute 'Secure' is not set to true. | +| main.rs:242:43:242:59 | cookie_config_bad | main.rs:241:29:241:62 | ...::new(...) | main.rs:242:43:242:59 | cookie_config_bad | Cookie attribute 'Secure' is not set to true. | +| main.rs:245:43:245:60 | cookie_config_bad2 | main.rs:244:30:244:63 | ...::new(...) | main.rs:245:43:245:60 | cookie_config_bad2 | Cookie attribute 'Secure' is not set to true. | +| main.rs:259:5:259:57 | ... .secure(...) | main.rs:259:5:259:43 | ...::build(...) | main.rs:259:5:259:57 | ... .secure(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:260:5:260:67 | ... .path(...) | main.rs:260:5:260:43 | ...::build(...) | main.rs:260:5:260:67 | ... .path(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:264:13:264:27 | cookie1.clone() | main.rs:263:5:263:11 | [SSA] cookie1 | main.rs:264:13:264:27 | cookie1.clone() | Cookie attribute 'Secure' is not set to true. | +| main.rs:264:13:264:27 | cookie1.clone() | main.rs:263:5:263:11 | cookie1 | main.rs:264:13:264:27 | cookie1.clone() | Cookie attribute 'Secure' is not set to true. | +| main.rs:274:5:274:43 | ...::build(...) | main.rs:274:5:274:43 | ...::build(...) | main.rs:274:5:274:43 | ...::build(...) | Cookie attribute 'Secure' is not set to true. | +| main.rs:277:13:277:27 | cookie3.clone() | main.rs:276:19:276:55 | ...::new(...) | main.rs:277:13:277:27 | cookie3.clone() | Cookie attribute 'Secure' is not set to true. | +| main.rs:281:13:281:27 | cookie2.clone() | main.rs:280:5:280:11 | [SSA] cookie2 | main.rs:281:13:281:27 | cookie2.clone() | Cookie attribute 'Secure' is not set to true. | +| main.rs:281:13:281:27 | cookie2.clone() | main.rs:280:5:280:11 | cookie2 | main.rs:281:13:281:27 | cookie2.clone() | Cookie attribute 'Secure' is not set to true. | edges | main.rs:8:19:8:50 | ...::build(...) | main.rs:8:19:8:64 | ... .secure(...) | provenance | MaD:35 | -| main.rs:8:19:8:64 | ... .secure(...) | main.rs:8:66:8:70 | build | provenance | MaD:2 Sink:MaD:2 | -| main.rs:16:19:16:31 | ...::build | main.rs:16:19:16:50 | ...::build(...) | provenance | Src:MaD:15 MaD:15 | -| main.rs:16:19:16:50 | ...::build(...) | main.rs:16:52:16:56 | build | provenance | MaD:2 Sink:MaD:2 | +| main.rs:8:19:8:64 | ... .secure(...) | main.rs:8:19:8:64 | ... .secure(...) | provenance | Sink:MaD:2 | +| main.rs:16:19:16:50 | ...::build(...) | main.rs:16:19:16:50 | ...::build(...) | provenance | Src:MaD:15 Sink:MaD:2 | | main.rs:20:5:20:36 | ...::build(...) | main.rs:20:5:20:54 | ... .secure(...) | provenance | MaD:35 | -| main.rs:20:5:20:54 | ... .secure(...) | main.rs:20:56:20:60 | build | provenance | MaD:2 Sink:MaD:2 | +| main.rs:20:5:20:54 | ... .secure(...) | main.rs:20:5:20:54 | ... .secure(...) | provenance | Sink:MaD:2 | | main.rs:21:5:21:36 | ...::build(...) | main.rs:21:5:21:55 | ... .secure(...) | provenance | MaD:35 | -| main.rs:21:5:21:55 | ... .secure(...) | main.rs:21:57:21:61 | build | provenance | MaD:2 Sink:MaD:2 | +| main.rs:21:5:21:55 | ... .secure(...) | main.rs:21:5:21:55 | ... .secure(...) | provenance | Sink:MaD:2 | | main.rs:25:5:25:36 | ...::build(...) | main.rs:25:5:25:52 | ... .secure(...) | provenance | MaD:35 | -| main.rs:25:5:25:52 | ... .secure(...) | main.rs:25:54:25:58 | build | provenance | MaD:2 Sink:MaD:2 | +| main.rs:25:5:25:52 | ... .secure(...) | main.rs:25:5:25:52 | ... .secure(...) | provenance | Sink:MaD:2 | | main.rs:26:5:26:36 | ...::build(...) | main.rs:26:5:26:50 | ... .secure(...) | provenance | MaD:35 | -| main.rs:26:5:26:50 | ... .secure(...) | main.rs:26:52:26:56 | build | provenance | MaD:2 Sink:MaD:2 | +| main.rs:26:5:26:50 | ... .secure(...) | main.rs:26:5:26:50 | ... .secure(...) | provenance | Sink:MaD:2 | | main.rs:27:5:27:36 | ...::build(...) | main.rs:27:5:27:51 | ... .secure(...) | provenance | MaD:35 | -| main.rs:27:5:27:51 | ... .secure(...) | main.rs:27:53:27:57 | build | provenance | MaD:2 Sink:MaD:2 | +| main.rs:27:5:27:51 | ... .secure(...) | main.rs:27:5:27:51 | ... .secure(...) | provenance | Sink:MaD:2 | | main.rs:28:5:28:36 | ...::build(...) | main.rs:28:5:28:60 | ... .secure(...) | provenance | MaD:35 | -| main.rs:28:5:28:60 | ... .secure(...) | main.rs:28:62:28:66 | build | provenance | MaD:2 Sink:MaD:2 | +| main.rs:28:5:28:60 | ... .secure(...) | main.rs:28:5:28:60 | ... .secure(...) | provenance | Sink:MaD:2 | | main.rs:29:5:29:36 | ...::build(...) | main.rs:29:5:29:60 | ... .secure(...) | provenance | MaD:35 | -| main.rs:29:5:29:60 | ... .secure(...) | main.rs:29:62:29:66 | build | provenance | MaD:2 Sink:MaD:2 | +| main.rs:29:5:29:60 | ... .secure(...) | main.rs:29:5:29:60 | ... .secure(...) | provenance | Sink:MaD:2 | | main.rs:33:9:33:40 | ...::build(...) | main.rs:33:9:33:58 | ... .secure(...) | provenance | MaD:35 | -| main.rs:33:9:33:58 | ... .secure(...) | main.rs:33:60:33:64 | build | provenance | MaD:2 Sink:MaD:2 | +| main.rs:33:9:33:58 | ... .secure(...) | main.rs:33:9:33:58 | ... .secure(...) | provenance | Sink:MaD:2 | | main.rs:35:9:35:40 | ...::build(...) | main.rs:35:9:35:58 | ... .secure(...) | provenance | MaD:35 | -| main.rs:35:9:35:58 | ... .secure(...) | main.rs:35:60:35:64 | build | provenance | MaD:2 Sink:MaD:2 | +| main.rs:35:9:35:58 | ... .secure(...) | main.rs:35:9:35:58 | ... .secure(...) | provenance | Sink:MaD:2 | | main.rs:39:5:39:39 | ...::new(...) | main.rs:39:5:39:53 | ... .secure(...) | provenance | MaD:35 | -| main.rs:39:5:39:53 | ... .secure(...) | main.rs:39:55:39:59 | build | provenance | MaD:2 Sink:MaD:2 | +| main.rs:39:5:39:53 | ... .secure(...) | main.rs:39:5:39:53 | ... .secure(...) | provenance | Sink:MaD:2 | | main.rs:40:5:40:50 | ... .expires(...) | main.rs:40:5:40:64 | ... .secure(...) | provenance | MaD:35 | -| main.rs:40:5:40:64 | ... .secure(...) | main.rs:40:66:40:70 | build | provenance | MaD:2 Sink:MaD:2 | +| main.rs:40:5:40:64 | ... .secure(...) | main.rs:40:5:40:64 | ... .secure(...) | provenance | Sink:MaD:2 | | main.rs:41:5:41:79 | ... .max_age(...) | main.rs:41:5:41:93 | ... .secure(...) | provenance | MaD:35 | -| main.rs:41:5:41:93 | ... .secure(...) | main.rs:41:95:41:99 | build | provenance | MaD:2 Sink:MaD:2 | +| main.rs:41:5:41:93 | ... .secure(...) | main.rs:41:5:41:93 | ... .secure(...) | provenance | Sink:MaD:2 | | main.rs:42:5:42:58 | ... .domain(...) | main.rs:42:5:42:72 | ... .secure(...) | provenance | MaD:35 | -| main.rs:42:5:42:72 | ... .secure(...) | main.rs:42:74:42:78 | build | provenance | MaD:2 Sink:MaD:2 | +| main.rs:42:5:42:72 | ... .secure(...) | main.rs:42:5:42:72 | ... .secure(...) | provenance | Sink:MaD:2 | | main.rs:43:5:43:46 | ... .path(...) | main.rs:43:5:43:60 | ... .secure(...) | provenance | MaD:35 | -| main.rs:43:5:43:60 | ... .secure(...) | main.rs:43:62:43:66 | build | provenance | MaD:2 Sink:MaD:2 | +| main.rs:43:5:43:60 | ... .secure(...) | main.rs:43:5:43:60 | ... .secure(...) | provenance | Sink:MaD:2 | | main.rs:44:5:44:52 | ... .http_only(...) | main.rs:44:5:44:66 | ... .secure(...) | provenance | MaD:35 | -| main.rs:44:5:44:66 | ... .secure(...) | main.rs:44:68:44:72 | build | provenance | MaD:2 Sink:MaD:2 | +| main.rs:44:5:44:66 | ... .secure(...) | main.rs:44:5:44:66 | ... .secure(...) | provenance | Sink:MaD:2 | | main.rs:45:5:45:72 | ... .same_site(...) | main.rs:45:5:45:86 | ... .secure(...) | provenance | MaD:35 | -| main.rs:45:5:45:86 | ... .secure(...) | main.rs:45:88:45:92 | build | provenance | MaD:2 Sink:MaD:2 | +| main.rs:45:5:45:86 | ... .secure(...) | main.rs:45:5:45:86 | ... .secure(...) | provenance | Sink:MaD:2 | | main.rs:46:5:46:48 | ... .permanent() | main.rs:46:5:46:62 | ... .secure(...) | provenance | MaD:35 | -| main.rs:46:5:46:62 | ... .secure(...) | main.rs:46:64:46:68 | build | provenance | MaD:2 Sink:MaD:2 | +| main.rs:46:5:46:62 | ... .secure(...) | main.rs:46:5:46:62 | ... .secure(...) | provenance | Sink:MaD:2 | | main.rs:47:5:47:46 | ... .removal() | main.rs:47:5:47:60 | ... .secure(...) | provenance | MaD:35 | -| main.rs:47:5:47:60 | ... .secure(...) | main.rs:47:62:47:66 | build | provenance | MaD:2 Sink:MaD:2 | +| main.rs:47:5:47:60 | ... .secure(...) | main.rs:47:5:47:60 | ... .secure(...) | provenance | Sink:MaD:2 | | main.rs:48:5:48:36 | ...::build(...) | main.rs:48:5:48:50 | ... .secure(...) | provenance | MaD:35 | -| main.rs:48:5:48:50 | ... .secure(...) | main.rs:48:52:48:57 | finish | provenance | MaD:3 Sink:MaD:3 | +| main.rs:48:5:48:50 | ... .secure(...) | main.rs:48:5:48:50 | ... .secure(...) | provenance | Sink:MaD:3 | | main.rs:49:5:49:25 | ...::build(...) | main.rs:49:5:49:39 | ... .secure(...) | provenance | MaD:35 | -| main.rs:49:5:49:39 | ... .secure(...) | main.rs:49:41:49:45 | build | provenance | MaD:2 Sink:MaD:2 | +| main.rs:49:5:49:39 | ... .secure(...) | main.rs:49:5:49:39 | ... .secure(...) | provenance | Sink:MaD:2 | | main.rs:50:5:50:40 | ...::build(...) | main.rs:50:5:50:54 | ... .secure(...) | provenance | MaD:35 | -| main.rs:50:5:50:54 | ... .secure(...) | main.rs:50:56:50:60 | build | provenance | MaD:2 Sink:MaD:2 | +| main.rs:50:5:50:54 | ... .secure(...) | main.rs:50:5:50:54 | ... .secure(...) | provenance | Sink:MaD:2 | | main.rs:53:5:53:49 | ... .secure(...) | main.rs:53:5:53:63 | ... .secure(...) | provenance | MaD:35 | -| main.rs:53:5:53:63 | ... .secure(...) | main.rs:53:65:53:69 | build | provenance | MaD:2 Sink:MaD:2 | +| main.rs:53:5:53:63 | ... .secure(...) | main.rs:53:5:53:63 | ... .secure(...) | provenance | Sink:MaD:2 | | main.rs:58:9:58:13 | mut a | main.rs:59:13:59:13 | a | provenance | | | main.rs:58:9:58:13 | mut a | main.rs:60:22:60:22 | a | provenance | | -| main.rs:58:17:58:27 | ...::new | main.rs:58:17:58:44 | ...::new(...) | provenance | Src:MaD:17 MaD:17 | -| main.rs:58:17:58:44 | ...::new(...) | main.rs:58:9:58:13 | mut a | provenance | | +| main.rs:58:17:58:44 | ...::new(...) | main.rs:58:9:58:13 | mut a | provenance | Src:MaD:17 | | main.rs:59:13:59:13 | a | main.rs:59:13:59:21 | a.clone() | provenance | MaD:18 | -| main.rs:59:13:59:21 | a.clone() | main.rs:59:9:59:11 | add | provenance | MaD:4 Sink:MaD:4 | +| main.rs:59:13:59:21 | a.clone() | main.rs:59:13:59:21 | a.clone() | provenance | Sink:MaD:4 | | main.rs:60:22:60:22 | a | main.rs:60:22:60:30 | a.clone() | provenance | MaD:18 | -| main.rs:60:22:60:30 | a.clone() | main.rs:60:9:60:20 | add_original | provenance | MaD:5 Sink:MaD:5 | +| main.rs:60:22:60:30 | a.clone() | main.rs:60:22:60:30 | a.clone() | provenance | Sink:MaD:5 | | main.rs:63:5:63:5 | [SSA] a | main.rs:64:13:64:13 | a | provenance | | | main.rs:63:5:63:5 | [SSA] a | main.rs:70:29:70:29 | a | provenance | | | main.rs:63:5:63:5 | [SSA] a | main.rs:79:30:79:30 | a | provenance | | @@ -139,64 +137,58 @@ edges | main.rs:63:5:63:5 | a | main.rs:70:29:70:29 | a | provenance | | | main.rs:63:5:63:5 | a | main.rs:79:30:79:30 | a | provenance | | | main.rs:64:13:64:13 | a | main.rs:64:13:64:21 | a.clone() | provenance | MaD:18 | -| main.rs:64:13:64:21 | a.clone() | main.rs:64:9:64:11 | add | provenance | MaD:4 Sink:MaD:4 | +| main.rs:64:13:64:21 | a.clone() | main.rs:64:13:64:21 | a.clone() | provenance | Sink:MaD:4 | | main.rs:68:9:68:13 | mut b | main.rs:69:20:69:20 | b | provenance | | -| main.rs:68:17:68:29 | ...::named | main.rs:68:17:68:37 | ...::named(...) | provenance | Src:MaD:16 MaD:16 | -| main.rs:68:17:68:37 | ...::named(...) | main.rs:68:9:68:13 | mut b | provenance | | +| main.rs:68:17:68:37 | ...::named(...) | main.rs:68:9:68:13 | mut b | provenance | Src:MaD:16 | | main.rs:69:20:69:20 | b | main.rs:69:20:69:28 | b.clone() | provenance | MaD:18 | -| main.rs:69:20:69:28 | b.clone() | main.rs:69:16:69:18 | add | provenance | MaD:8 Sink:MaD:8 | +| main.rs:69:20:69:28 | b.clone() | main.rs:69:20:69:28 | b.clone() | provenance | Sink:MaD:8 | | main.rs:70:29:70:29 | a | main.rs:70:29:70:37 | a.clone() | provenance | MaD:18 | -| main.rs:70:29:70:37 | a.clone() | main.rs:70:16:70:27 | add_original | provenance | MaD:9 Sink:MaD:9 | +| main.rs:70:29:70:37 | a.clone() | main.rs:70:29:70:37 | a.clone() | provenance | Sink:MaD:9 | | main.rs:71:5:71:5 | [SSA] b | main.rs:72:20:72:20 | b | provenance | | | main.rs:71:5:71:5 | b | main.rs:72:20:72:20 | b | provenance | | | main.rs:72:20:72:20 | b | main.rs:72:20:72:28 | b.clone() | provenance | MaD:18 | -| main.rs:72:20:72:28 | b.clone() | main.rs:72:16:72:18 | add | provenance | MaD:8 Sink:MaD:8 | +| main.rs:72:20:72:28 | b.clone() | main.rs:72:20:72:28 | b.clone() | provenance | Sink:MaD:8 | | main.rs:77:9:77:13 | mut c | main.rs:78:21:78:21 | c | provenance | | | main.rs:77:9:77:13 | mut c | main.rs:83:21:83:21 | c | provenance | | -| main.rs:77:17:77:28 | ...::from | main.rs:77:17:77:36 | ...::from(...) | provenance | Src:MaD:14 MaD:14 | -| main.rs:77:17:77:36 | ...::from(...) | main.rs:77:9:77:13 | mut c | provenance | | +| main.rs:77:17:77:36 | ...::from(...) | main.rs:77:9:77:13 | mut c | provenance | Src:MaD:14 | | main.rs:78:21:78:21 | c | main.rs:78:21:78:29 | c.clone() | provenance | MaD:18 | -| main.rs:78:21:78:29 | c.clone() | main.rs:78:17:78:19 | add | provenance | MaD:6 Sink:MaD:6 | +| main.rs:78:21:78:29 | c.clone() | main.rs:78:21:78:29 | c.clone() | provenance | Sink:MaD:6 | | main.rs:79:30:79:30 | a | main.rs:79:30:79:38 | a.clone() | provenance | MaD:18 | -| main.rs:79:30:79:38 | a.clone() | main.rs:79:17:79:28 | add_original | provenance | MaD:7 Sink:MaD:7 | +| main.rs:79:30:79:38 | a.clone() | main.rs:79:30:79:38 | a.clone() | provenance | Sink:MaD:7 | | main.rs:83:21:83:21 | c | main.rs:83:21:83:29 | c.clone() | provenance | MaD:18 | -| main.rs:83:21:83:29 | c.clone() | main.rs:83:17:83:19 | add | provenance | MaD:6 Sink:MaD:6 | +| main.rs:83:21:83:29 | c.clone() | main.rs:83:21:83:29 | c.clone() | provenance | Sink:MaD:6 | | main.rs:87:9:87:13 | mut d | main.rs:88:13:88:13 | d | provenance | | | main.rs:87:9:87:13 | mut d | main.rs:94:13:94:13 | d | provenance | | -| main.rs:87:17:87:28 | ...::from | main.rs:87:17:87:36 | ...::from(...) | provenance | Src:MaD:14 MaD:14 | -| main.rs:87:17:87:36 | ...::from(...) | main.rs:87:9:87:13 | mut d | provenance | | +| main.rs:87:17:87:36 | ...::from(...) | main.rs:87:9:87:13 | mut d | provenance | Src:MaD:14 | | main.rs:88:13:88:13 | d | main.rs:88:13:88:21 | d.clone() | provenance | MaD:18 | -| main.rs:88:13:88:21 | d.clone() | main.rs:88:9:88:11 | add | provenance | MaD:4 Sink:MaD:4 | +| main.rs:88:13:88:21 | d.clone() | main.rs:88:13:88:21 | d.clone() | provenance | Sink:MaD:4 | | main.rs:94:13:94:13 | d | main.rs:94:13:94:21 | d.clone() | provenance | MaD:18 | -| main.rs:94:13:94:21 | d.clone() | main.rs:94:9:94:11 | add | provenance | MaD:4 Sink:MaD:4 | -| main.rs:114:5:114:17 | ...::build | main.rs:114:5:114:36 | ...::build(...) | provenance | Src:MaD:15 MaD:15 | +| main.rs:94:13:94:21 | d.clone() | main.rs:94:13:94:21 | d.clone() | provenance | Sink:MaD:4 | +| main.rs:114:5:114:36 | ...::build(...) | main.rs:114:5:114:36 | ...::build(...) | provenance | Src:MaD:15 | | main.rs:114:5:114:36 | ...::build(...) | main.rs:114:5:114:54 | ... .partitioned(...) | provenance | MaD:33 | -| main.rs:114:5:114:54 | ... .partitioned(...) | main.rs:114:56:114:60 | build | provenance | MaD:2 Sink:MaD:2 | +| main.rs:114:5:114:54 | ... .partitioned(...) | main.rs:114:5:114:54 | ... .partitioned(...) | provenance | Sink:MaD:2 | | main.rs:122:9:122:9 | a | main.rs:123:20:123:20 | a | provenance | | -| main.rs:122:13:122:41 | ...::new | main.rs:122:13:122:58 | ...::new(...) | provenance | Src:MaD:13 MaD:13 | -| main.rs:122:13:122:58 | ...::new(...) | main.rs:122:9:122:9 | a | provenance | | +| main.rs:122:13:122:58 | ...::new(...) | main.rs:122:9:122:9 | a | provenance | Src:MaD:13 | | main.rs:123:20:123:20 | a | main.rs:123:20:123:28 | a.clone() | provenance | MaD:18 | -| main.rs:123:20:123:28 | a.clone() | main.rs:123:13:123:18 | insert | provenance | MaD:1 Sink:MaD:1 | +| main.rs:123:20:123:28 | a.clone() | main.rs:123:20:123:28 | a.clone() | provenance | Sink:MaD:1 | | main.rs:130:9:130:9 | c | main.rs:131:20:131:20 | c | provenance | | | main.rs:130:9:130:9 | c | main.rs:134:13:134:13 | c | provenance | | | main.rs:130:13:130:13 | b | main.rs:130:13:130:31 | b.set_secure(...) | provenance | MaD:28 | | main.rs:130:13:130:31 | b.set_secure(...) | main.rs:130:9:130:9 | c | provenance | | | main.rs:131:20:131:20 | c | main.rs:131:20:131:28 | c.clone() | provenance | MaD:18 | -| main.rs:131:20:131:28 | c.clone() | main.rs:131:13:131:18 | insert | provenance | MaD:1 Sink:MaD:1 | +| main.rs:131:20:131:28 | c.clone() | main.rs:131:20:131:28 | c.clone() | provenance | Sink:MaD:1 | | main.rs:134:9:134:9 | d | main.rs:135:20:135:20 | d | provenance | | | main.rs:134:13:134:13 | c | main.rs:134:13:134:35 | c.set_partitioned(...) | provenance | MaD:25 | | main.rs:134:13:134:35 | c.set_partitioned(...) | main.rs:134:9:134:9 | d | provenance | | | main.rs:135:20:135:20 | d | main.rs:135:20:135:28 | d.clone() | provenance | MaD:18 | -| main.rs:135:20:135:28 | d.clone() | main.rs:135:13:135:18 | insert | provenance | MaD:1 Sink:MaD:1 | +| main.rs:135:20:135:28 | d.clone() | main.rs:135:20:135:28 | d.clone() | provenance | Sink:MaD:1 | | main.rs:146:9:146:9 | g | main.rs:147:20:147:20 | g | provenance | | | main.rs:146:13:146:13 | f | main.rs:146:13:146:31 | f.set_secure(...) | provenance | MaD:28 | | main.rs:146:13:146:31 | f.set_secure(...) | main.rs:146:9:146:9 | g | provenance | | | main.rs:147:20:147:20 | g | main.rs:147:20:147:28 | g.clone() | provenance | MaD:18 | -| main.rs:147:20:147:28 | g.clone() | main.rs:147:13:147:18 | insert | provenance | MaD:1 Sink:MaD:1 | -| main.rs:151:9:151:9 | h | main.rs:152:20:152:20 | h | provenance | | -| main.rs:151:13:151:42 | ...::from | main.rs:151:13:151:61 | ...::from(...) | provenance | Src:MaD:12 MaD:12 | -| main.rs:151:13:151:61 | ...::from(...) | main.rs:151:9:151:9 | h | provenance | | -| main.rs:152:20:152:20 | h | main.rs:152:13:152:18 | insert | provenance | MaD:1 Sink:MaD:1 | +| main.rs:147:20:147:28 | g.clone() | main.rs:147:20:147:28 | g.clone() | provenance | Sink:MaD:1 | +| main.rs:151:9:151:9 | h | main.rs:152:20:152:20 | h | provenance | Sink:MaD:1 | +| main.rs:151:13:151:61 | ...::from(...) | main.rs:151:9:151:9 | h | provenance | Src:MaD:12 | | main.rs:155:9:155:9 | i | main.rs:156:20:156:20 | i | provenance | | | main.rs:155:9:155:9 | i | main.rs:157:20:157:20 | i | provenance | | | main.rs:155:9:155:9 | i | main.rs:158:20:158:20 | i | provenance | | @@ -209,100 +201,92 @@ edges | main.rs:155:9:155:9 | i | main.rs:165:20:165:20 | i | provenance | | | main.rs:155:9:155:9 | i | main.rs:166:20:166:20 | i | provenance | | | main.rs:155:9:155:9 | i | main.rs:167:20:167:20 | i | provenance | | -| main.rs:155:13:155:41 | ...::new | main.rs:155:13:155:58 | ...::new(...) | provenance | Src:MaD:13 MaD:13 | -| main.rs:155:13:155:58 | ...::new(...) | main.rs:155:9:155:9 | i | provenance | | +| main.rs:155:13:155:58 | ...::new(...) | main.rs:155:9:155:9 | i | provenance | Src:MaD:13 | | main.rs:156:20:156:20 | i | main.rs:156:20:156:28 | i.clone() | provenance | MaD:18 | | main.rs:156:20:156:28 | i.clone() | main.rs:156:20:156:46 | ... .set_name(...) | provenance | MaD:24 | -| main.rs:156:20:156:46 | ... .set_name(...) | main.rs:156:13:156:18 | insert | provenance | MaD:1 Sink:MaD:1 | +| main.rs:156:20:156:46 | ... .set_name(...) | main.rs:156:20:156:46 | ... .set_name(...) | provenance | Sink:MaD:1 | | main.rs:157:20:157:20 | i | main.rs:157:20:157:28 | i.clone() | provenance | MaD:18 | | main.rs:157:20:157:28 | i.clone() | main.rs:157:20:157:48 | ... .set_value(...) | provenance | MaD:29 | -| main.rs:157:20:157:48 | ... .set_value(...) | main.rs:157:13:157:18 | insert | provenance | MaD:1 Sink:MaD:1 | +| main.rs:157:20:157:48 | ... .set_value(...) | main.rs:157:20:157:48 | ... .set_value(...) | provenance | Sink:MaD:1 | | main.rs:158:20:158:20 | i | main.rs:158:20:158:28 | i.clone() | provenance | MaD:18 | | main.rs:158:20:158:28 | i.clone() | main.rs:158:20:158:48 | ... .set_http_only(...) | provenance | MaD:22 | -| main.rs:158:20:158:48 | ... .set_http_only(...) | main.rs:158:13:158:18 | insert | provenance | MaD:1 Sink:MaD:1 | +| main.rs:158:20:158:48 | ... .set_http_only(...) | main.rs:158:20:158:48 | ... .set_http_only(...) | provenance | Sink:MaD:1 | | main.rs:159:20:159:20 | i | main.rs:159:20:159:28 | i.clone() | provenance | MaD:18 | | main.rs:159:20:159:28 | i.clone() | main.rs:159:20:159:70 | ... .set_same_site(...) | provenance | MaD:27 | -| main.rs:159:20:159:70 | ... .set_same_site(...) | main.rs:159:13:159:18 | insert | provenance | MaD:1 Sink:MaD:1 | +| main.rs:159:20:159:70 | ... .set_same_site(...) | main.rs:159:20:159:70 | ... .set_same_site(...) | provenance | Sink:MaD:1 | | main.rs:160:20:160:20 | i | main.rs:160:20:160:28 | i.clone() | provenance | MaD:18 | | main.rs:160:20:160:28 | i.clone() | main.rs:160:20:160:46 | ... .set_max_age(...) | provenance | MaD:23 | -| main.rs:160:20:160:46 | ... .set_max_age(...) | main.rs:160:13:160:18 | insert | provenance | MaD:1 Sink:MaD:1 | +| main.rs:160:20:160:46 | ... .set_max_age(...) | main.rs:160:20:160:46 | ... .set_max_age(...) | provenance | Sink:MaD:1 | | main.rs:161:20:161:20 | i | main.rs:161:20:161:28 | i.clone() | provenance | MaD:18 | | main.rs:161:20:161:28 | i.clone() | main.rs:161:20:161:42 | ... .set_path(...) | provenance | MaD:26 | -| main.rs:161:20:161:42 | ... .set_path(...) | main.rs:161:13:161:18 | insert | provenance | MaD:1 Sink:MaD:1 | +| main.rs:161:20:161:42 | ... .set_path(...) | main.rs:161:20:161:42 | ... .set_path(...) | provenance | Sink:MaD:1 | | main.rs:162:20:162:20 | i | main.rs:162:20:162:28 | i.clone() | provenance | MaD:18 | | main.rs:162:20:162:28 | i.clone() | main.rs:162:20:162:41 | ... .unset_path() | provenance | MaD:32 | -| main.rs:162:20:162:41 | ... .unset_path() | main.rs:162:13:162:18 | insert | provenance | MaD:1 Sink:MaD:1 | +| main.rs:162:20:162:41 | ... .unset_path() | main.rs:162:20:162:41 | ... .unset_path() | provenance | Sink:MaD:1 | | main.rs:163:20:163:20 | i | main.rs:163:20:163:28 | i.clone() | provenance | MaD:18 | | main.rs:163:20:163:28 | i.clone() | main.rs:163:20:163:54 | ... .set_domain(...) | provenance | MaD:20 | -| main.rs:163:20:163:54 | ... .set_domain(...) | main.rs:163:13:163:18 | insert | provenance | MaD:1 Sink:MaD:1 | +| main.rs:163:20:163:54 | ... .set_domain(...) | main.rs:163:20:163:54 | ... .set_domain(...) | provenance | Sink:MaD:1 | | main.rs:164:20:164:20 | i | main.rs:164:20:164:28 | i.clone() | provenance | MaD:18 | | main.rs:164:20:164:28 | i.clone() | main.rs:164:20:164:43 | ... .unset_domain() | provenance | MaD:30 | -| main.rs:164:20:164:43 | ... .unset_domain() | main.rs:164:13:164:18 | insert | provenance | MaD:1 Sink:MaD:1 | +| main.rs:164:20:164:43 | ... .unset_domain() | main.rs:164:20:164:43 | ... .unset_domain() | provenance | Sink:MaD:1 | | main.rs:165:20:165:20 | i | main.rs:165:20:165:28 | i.clone() | provenance | MaD:18 | | main.rs:165:20:165:28 | i.clone() | main.rs:165:20:165:46 | ... .set_expires(...) | provenance | MaD:21 | -| main.rs:165:20:165:46 | ... .set_expires(...) | main.rs:165:13:165:18 | insert | provenance | MaD:1 Sink:MaD:1 | +| main.rs:165:20:165:46 | ... .set_expires(...) | main.rs:165:20:165:46 | ... .set_expires(...) | provenance | Sink:MaD:1 | | main.rs:166:20:166:20 | i | main.rs:166:20:166:28 | i.clone() | provenance | MaD:18 | | main.rs:166:20:166:28 | i.clone() | main.rs:166:20:166:44 | ... .unset_expires() | provenance | MaD:31 | -| main.rs:166:20:166:44 | ... .unset_expires() | main.rs:166:13:166:18 | insert | provenance | MaD:1 Sink:MaD:1 | +| main.rs:166:20:166:44 | ... .unset_expires() | main.rs:166:20:166:44 | ... .unset_expires() | provenance | Sink:MaD:1 | | main.rs:167:20:167:20 | i | main.rs:167:20:167:28 | i.clone() | provenance | MaD:18 | | main.rs:167:20:167:28 | i.clone() | main.rs:167:20:167:45 | ... .make_permanent() | provenance | MaD:19 | -| main.rs:167:20:167:45 | ... .make_permanent() | main.rs:167:13:167:18 | insert | provenance | MaD:1 Sink:MaD:1 | -| main.rs:173:22:173:34 | ...::build | main.rs:173:22:173:59 | ...::build(...) | provenance | Src:MaD:15 MaD:15 | -| main.rs:173:22:173:59 | ...::build(...) | main.rs:173:61:173:65 | build | provenance | MaD:2 Sink:MaD:2 | +| main.rs:167:20:167:45 | ... .make_permanent() | main.rs:167:20:167:45 | ... .make_permanent() | provenance | Sink:MaD:1 | +| main.rs:173:22:173:59 | ...::build(...) | main.rs:173:22:173:59 | ...::build(...) | provenance | Src:MaD:15 Sink:MaD:2 | | main.rs:197:5:197:39 | ...::build(...) | main.rs:197:5:197:53 | ... .secure(...) | provenance | MaD:35 | -| main.rs:197:5:197:53 | ... .secure(...) | main.rs:197:55:197:60 | finish | provenance | MaD:3 Sink:MaD:3 | +| main.rs:197:5:197:53 | ... .secure(...) | main.rs:197:5:197:53 | ... .secure(...) | provenance | Sink:MaD:3 | | main.rs:198:5:198:39 | ...::build(...) | main.rs:198:5:198:53 | ... .secure(...) | provenance | MaD:35 | | main.rs:198:5:198:53 | ... .secure(...) | main.rs:198:5:198:63 | ... .path(...) | provenance | MaD:34 | -| main.rs:198:5:198:63 | ... .path(...) | main.rs:198:65:198:70 | finish | provenance | MaD:3 Sink:MaD:3 | +| main.rs:198:5:198:63 | ... .path(...) | main.rs:198:5:198:63 | ... .path(...) | provenance | Sink:MaD:3 | | main.rs:201:5:201:11 | [SSA] cookie1 | main.rs:202:13:202:19 | cookie1 | provenance | | | main.rs:201:5:201:11 | cookie1 | main.rs:202:13:202:19 | cookie1 | provenance | | | main.rs:202:13:202:19 | cookie1 | main.rs:202:13:202:27 | cookie1.clone() | provenance | MaD:18 | -| main.rs:202:13:202:27 | cookie1.clone() | main.rs:202:9:202:11 | add | provenance | MaD:4 Sink:MaD:4 | -| main.rs:212:5:212:22 | ...::build | main.rs:212:5:212:39 | ...::build(...) | provenance | Src:MaD:15 MaD:15 | -| main.rs:212:5:212:39 | ...::build(...) | main.rs:212:41:212:46 | finish | provenance | MaD:3 Sink:MaD:3 | +| main.rs:202:13:202:27 | cookie1.clone() | main.rs:202:13:202:27 | cookie1.clone() | provenance | Sink:MaD:4 | +| main.rs:212:5:212:39 | ...::build(...) | main.rs:212:5:212:39 | ...::build(...) | provenance | Src:MaD:15 Sink:MaD:3 | | main.rs:214:9:214:15 | cookie3 | main.rs:215:13:215:19 | cookie3 | provenance | | -| main.rs:214:19:214:34 | ...::new | main.rs:214:19:214:51 | ...::new(...) | provenance | Src:MaD:17 MaD:17 | -| main.rs:214:19:214:51 | ...::new(...) | main.rs:214:9:214:15 | cookie3 | provenance | | +| main.rs:214:19:214:51 | ...::new(...) | main.rs:214:9:214:15 | cookie3 | provenance | Src:MaD:17 | | main.rs:215:13:215:19 | cookie3 | main.rs:215:13:215:27 | cookie3.clone() | provenance | MaD:18 | -| main.rs:215:13:215:27 | cookie3.clone() | main.rs:215:9:215:11 | add | provenance | MaD:4 Sink:MaD:4 | +| main.rs:215:13:215:27 | cookie3.clone() | main.rs:215:13:215:27 | cookie3.clone() | provenance | Sink:MaD:4 | | main.rs:218:5:218:11 | [SSA] cookie2 | main.rs:219:13:219:19 | cookie2 | provenance | | | main.rs:218:5:218:11 | cookie2 | main.rs:219:13:219:19 | cookie2 | provenance | | | main.rs:219:13:219:19 | cookie2 | main.rs:219:13:219:27 | cookie2.clone() | provenance | MaD:18 | -| main.rs:219:13:219:27 | cookie2.clone() | main.rs:219:9:219:11 | add | provenance | MaD:4 Sink:MaD:4 | +| main.rs:219:13:219:27 | cookie2.clone() | main.rs:219:13:219:27 | cookie2.clone() | provenance | Sink:MaD:4 | | main.rs:228:5:228:11 | [SSA] cookie1 | main.rs:229:13:229:19 | cookie1 | provenance | | | main.rs:228:5:228:11 | cookie1 | main.rs:229:13:229:19 | cookie1 | provenance | | | main.rs:229:13:229:19 | cookie1 | main.rs:229:13:229:27 | cookie1.clone() | provenance | MaD:18 | -| main.rs:229:13:229:27 | cookie1.clone() | main.rs:229:9:229:11 | add | provenance | MaD:11 Sink:MaD:11 | -| main.rs:241:9:241:25 | cookie_config_bad | main.rs:242:43:242:59 | cookie_config_bad | provenance | | +| main.rs:229:13:229:27 | cookie1.clone() | main.rs:229:13:229:27 | cookie1.clone() | provenance | Sink:MaD:11 | +| main.rs:241:9:241:25 | cookie_config_bad | main.rs:242:43:242:59 | cookie_config_bad | provenance | Sink:MaD:10 | | main.rs:241:29:241:62 | ...::new(...) | main.rs:241:29:241:76 | ... .secure(...) | provenance | MaD:38 | | main.rs:241:29:241:76 | ... .secure(...) | main.rs:241:9:241:25 | cookie_config_bad | provenance | | -| main.rs:242:43:242:59 | cookie_config_bad | main.rs:242:9:242:41 | ...::new | provenance | MaD:10 Sink:MaD:10 | -| main.rs:244:9:244:26 | cookie_config_bad2 | main.rs:245:43:245:60 | cookie_config_bad2 | provenance | | +| main.rs:244:9:244:26 | cookie_config_bad2 | main.rs:245:43:245:60 | cookie_config_bad2 | provenance | Sink:MaD:10 | | main.rs:244:30:244:63 | ...::new(...) | main.rs:244:30:244:77 | ... .secure(...) | provenance | MaD:38 | | main.rs:244:30:244:77 | ... .secure(...) | main.rs:244:30:244:90 | ... .name(...) | provenance | MaD:36 | | main.rs:244:30:244:90 | ... .name(...) | main.rs:244:30:244:100 | ... .path(...) | provenance | MaD:37 | | main.rs:244:30:244:100 | ... .path(...) | main.rs:244:9:244:26 | cookie_config_bad2 | provenance | | -| main.rs:245:43:245:60 | cookie_config_bad2 | main.rs:245:9:245:41 | ...::new | provenance | MaD:10 Sink:MaD:10 | | main.rs:259:5:259:43 | ...::build(...) | main.rs:259:5:259:57 | ... .secure(...) | provenance | MaD:35 | -| main.rs:259:5:259:57 | ... .secure(...) | main.rs:259:59:259:64 | finish | provenance | MaD:3 Sink:MaD:3 | +| main.rs:259:5:259:57 | ... .secure(...) | main.rs:259:5:259:57 | ... .secure(...) | provenance | Sink:MaD:3 | | main.rs:260:5:260:43 | ...::build(...) | main.rs:260:5:260:57 | ... .secure(...) | provenance | MaD:35 | | main.rs:260:5:260:57 | ... .secure(...) | main.rs:260:5:260:67 | ... .path(...) | provenance | MaD:34 | -| main.rs:260:5:260:67 | ... .path(...) | main.rs:260:69:260:74 | finish | provenance | MaD:3 Sink:MaD:3 | +| main.rs:260:5:260:67 | ... .path(...) | main.rs:260:5:260:67 | ... .path(...) | provenance | Sink:MaD:3 | | main.rs:263:5:263:11 | [SSA] cookie1 | main.rs:264:13:264:19 | cookie1 | provenance | | | main.rs:263:5:263:11 | cookie1 | main.rs:264:13:264:19 | cookie1 | provenance | | | main.rs:264:13:264:19 | cookie1 | main.rs:264:13:264:27 | cookie1.clone() | provenance | MaD:18 | -| main.rs:264:13:264:27 | cookie1.clone() | main.rs:264:9:264:11 | add | provenance | MaD:4 Sink:MaD:4 | -| main.rs:274:5:274:26 | ...::build | main.rs:274:5:274:43 | ...::build(...) | provenance | Src:MaD:15 MaD:15 | -| main.rs:274:5:274:43 | ...::build(...) | main.rs:274:45:274:50 | finish | provenance | MaD:3 Sink:MaD:3 | +| main.rs:264:13:264:27 | cookie1.clone() | main.rs:264:13:264:27 | cookie1.clone() | provenance | Sink:MaD:4 | +| main.rs:274:5:274:43 | ...::build(...) | main.rs:274:5:274:43 | ...::build(...) | provenance | Src:MaD:15 Sink:MaD:3 | | main.rs:276:9:276:15 | cookie3 | main.rs:277:13:277:19 | cookie3 | provenance | | -| main.rs:276:19:276:38 | ...::new | main.rs:276:19:276:55 | ...::new(...) | provenance | Src:MaD:17 MaD:17 | -| main.rs:276:19:276:55 | ...::new(...) | main.rs:276:9:276:15 | cookie3 | provenance | | +| main.rs:276:19:276:55 | ...::new(...) | main.rs:276:9:276:15 | cookie3 | provenance | Src:MaD:17 | | main.rs:277:13:277:19 | cookie3 | main.rs:277:13:277:27 | cookie3.clone() | provenance | MaD:18 | -| main.rs:277:13:277:27 | cookie3.clone() | main.rs:277:9:277:11 | add | provenance | MaD:4 Sink:MaD:4 | +| main.rs:277:13:277:27 | cookie3.clone() | main.rs:277:13:277:27 | cookie3.clone() | provenance | Sink:MaD:4 | | main.rs:280:5:280:11 | [SSA] cookie2 | main.rs:281:13:281:19 | cookie2 | provenance | | | main.rs:280:5:280:11 | cookie2 | main.rs:281:13:281:19 | cookie2 | provenance | | | main.rs:281:13:281:19 | cookie2 | main.rs:281:13:281:27 | cookie2.clone() | provenance | MaD:18 | -| main.rs:281:13:281:27 | cookie2.clone() | main.rs:281:9:281:11 | add | provenance | MaD:4 Sink:MaD:4 | +| main.rs:281:13:281:27 | cookie2.clone() | main.rs:281:13:281:27 | cookie2.clone() | provenance | Sink:MaD:4 | models | 1 | Sink: ::insert; Argument[0]; cookie-use | | 2 | Sink: ::build; Argument[self]; cookie-use | @@ -345,279 +329,263 @@ models nodes | main.rs:8:19:8:50 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:8:19:8:64 | ... .secure(...) | semmle.label | ... .secure(...) | -| main.rs:8:66:8:70 | build | semmle.label | build | -| main.rs:16:19:16:31 | ...::build | semmle.label | ...::build | +| main.rs:8:19:8:64 | ... .secure(...) | semmle.label | ... .secure(...) | +| main.rs:16:19:16:50 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:16:19:16:50 | ...::build(...) | semmle.label | ...::build(...) | -| main.rs:16:52:16:56 | build | semmle.label | build | | main.rs:20:5:20:36 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:20:5:20:54 | ... .secure(...) | semmle.label | ... .secure(...) | -| main.rs:20:56:20:60 | build | semmle.label | build | +| main.rs:20:5:20:54 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:21:5:21:36 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:21:5:21:55 | ... .secure(...) | semmle.label | ... .secure(...) | -| main.rs:21:57:21:61 | build | semmle.label | build | +| main.rs:21:5:21:55 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:25:5:25:36 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:25:5:25:52 | ... .secure(...) | semmle.label | ... .secure(...) | -| main.rs:25:54:25:58 | build | semmle.label | build | +| main.rs:25:5:25:52 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:26:5:26:36 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:26:5:26:50 | ... .secure(...) | semmle.label | ... .secure(...) | -| main.rs:26:52:26:56 | build | semmle.label | build | +| main.rs:26:5:26:50 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:27:5:27:36 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:27:5:27:51 | ... .secure(...) | semmle.label | ... .secure(...) | -| main.rs:27:53:27:57 | build | semmle.label | build | +| main.rs:27:5:27:51 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:28:5:28:36 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:28:5:28:60 | ... .secure(...) | semmle.label | ... .secure(...) | -| main.rs:28:62:28:66 | build | semmle.label | build | +| main.rs:28:5:28:60 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:29:5:29:36 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:29:5:29:60 | ... .secure(...) | semmle.label | ... .secure(...) | -| main.rs:29:62:29:66 | build | semmle.label | build | +| main.rs:29:5:29:60 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:33:9:33:40 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:33:9:33:58 | ... .secure(...) | semmle.label | ... .secure(...) | -| main.rs:33:60:33:64 | build | semmle.label | build | +| main.rs:33:9:33:58 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:35:9:35:40 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:35:9:35:58 | ... .secure(...) | semmle.label | ... .secure(...) | -| main.rs:35:60:35:64 | build | semmle.label | build | +| main.rs:35:9:35:58 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:39:5:39:39 | ...::new(...) | semmle.label | ...::new(...) | | main.rs:39:5:39:53 | ... .secure(...) | semmle.label | ... .secure(...) | -| main.rs:39:55:39:59 | build | semmle.label | build | +| main.rs:39:5:39:53 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:40:5:40:50 | ... .expires(...) | semmle.label | ... .expires(...) | | main.rs:40:5:40:64 | ... .secure(...) | semmle.label | ... .secure(...) | -| main.rs:40:66:40:70 | build | semmle.label | build | +| main.rs:40:5:40:64 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:41:5:41:79 | ... .max_age(...) | semmle.label | ... .max_age(...) | | main.rs:41:5:41:93 | ... .secure(...) | semmle.label | ... .secure(...) | -| main.rs:41:95:41:99 | build | semmle.label | build | +| main.rs:41:5:41:93 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:42:5:42:58 | ... .domain(...) | semmle.label | ... .domain(...) | | main.rs:42:5:42:72 | ... .secure(...) | semmle.label | ... .secure(...) | -| main.rs:42:74:42:78 | build | semmle.label | build | +| main.rs:42:5:42:72 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:43:5:43:46 | ... .path(...) | semmle.label | ... .path(...) | | main.rs:43:5:43:60 | ... .secure(...) | semmle.label | ... .secure(...) | -| main.rs:43:62:43:66 | build | semmle.label | build | +| main.rs:43:5:43:60 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:44:5:44:52 | ... .http_only(...) | semmle.label | ... .http_only(...) | | main.rs:44:5:44:66 | ... .secure(...) | semmle.label | ... .secure(...) | -| main.rs:44:68:44:72 | build | semmle.label | build | +| main.rs:44:5:44:66 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:45:5:45:72 | ... .same_site(...) | semmle.label | ... .same_site(...) | | main.rs:45:5:45:86 | ... .secure(...) | semmle.label | ... .secure(...) | -| main.rs:45:88:45:92 | build | semmle.label | build | +| main.rs:45:5:45:86 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:46:5:46:48 | ... .permanent() | semmle.label | ... .permanent() | | main.rs:46:5:46:62 | ... .secure(...) | semmle.label | ... .secure(...) | -| main.rs:46:64:46:68 | build | semmle.label | build | +| main.rs:46:5:46:62 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:47:5:47:46 | ... .removal() | semmle.label | ... .removal() | | main.rs:47:5:47:60 | ... .secure(...) | semmle.label | ... .secure(...) | -| main.rs:47:62:47:66 | build | semmle.label | build | +| main.rs:47:5:47:60 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:48:5:48:36 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:48:5:48:50 | ... .secure(...) | semmle.label | ... .secure(...) | -| main.rs:48:52:48:57 | finish | semmle.label | finish | +| main.rs:48:5:48:50 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:49:5:49:25 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:49:5:49:39 | ... .secure(...) | semmle.label | ... .secure(...) | -| main.rs:49:41:49:45 | build | semmle.label | build | +| main.rs:49:5:49:39 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:50:5:50:40 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:50:5:50:54 | ... .secure(...) | semmle.label | ... .secure(...) | -| main.rs:50:56:50:60 | build | semmle.label | build | +| main.rs:50:5:50:54 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:53:5:53:49 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:53:5:53:63 | ... .secure(...) | semmle.label | ... .secure(...) | -| main.rs:53:65:53:69 | build | semmle.label | build | +| main.rs:53:5:53:63 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:58:9:58:13 | mut a | semmle.label | mut a | -| main.rs:58:17:58:27 | ...::new | semmle.label | ...::new | | main.rs:58:17:58:44 | ...::new(...) | semmle.label | ...::new(...) | -| main.rs:59:9:59:11 | add | semmle.label | add | | main.rs:59:13:59:13 | a | semmle.label | a | | main.rs:59:13:59:21 | a.clone() | semmle.label | a.clone() | -| main.rs:60:9:60:20 | add_original | semmle.label | add_original | +| main.rs:59:13:59:21 | a.clone() | semmle.label | a.clone() | | main.rs:60:22:60:22 | a | semmle.label | a | | main.rs:60:22:60:30 | a.clone() | semmle.label | a.clone() | +| main.rs:60:22:60:30 | a.clone() | semmle.label | a.clone() | | main.rs:63:5:63:5 | [SSA] a | semmle.label | [SSA] a | | main.rs:63:5:63:5 | a | semmle.label | a | -| main.rs:64:9:64:11 | add | semmle.label | add | | main.rs:64:13:64:13 | a | semmle.label | a | | main.rs:64:13:64:21 | a.clone() | semmle.label | a.clone() | +| main.rs:64:13:64:21 | a.clone() | semmle.label | a.clone() | | main.rs:68:9:68:13 | mut b | semmle.label | mut b | -| main.rs:68:17:68:29 | ...::named | semmle.label | ...::named | | main.rs:68:17:68:37 | ...::named(...) | semmle.label | ...::named(...) | -| main.rs:69:16:69:18 | add | semmle.label | add | | main.rs:69:20:69:20 | b | semmle.label | b | | main.rs:69:20:69:28 | b.clone() | semmle.label | b.clone() | -| main.rs:70:16:70:27 | add_original | semmle.label | add_original | +| main.rs:69:20:69:28 | b.clone() | semmle.label | b.clone() | | main.rs:70:29:70:29 | a | semmle.label | a | | main.rs:70:29:70:37 | a.clone() | semmle.label | a.clone() | +| main.rs:70:29:70:37 | a.clone() | semmle.label | a.clone() | | main.rs:71:5:71:5 | [SSA] b | semmle.label | [SSA] b | | main.rs:71:5:71:5 | b | semmle.label | b | -| main.rs:72:16:72:18 | add | semmle.label | add | | main.rs:72:20:72:20 | b | semmle.label | b | | main.rs:72:20:72:28 | b.clone() | semmle.label | b.clone() | +| main.rs:72:20:72:28 | b.clone() | semmle.label | b.clone() | | main.rs:77:9:77:13 | mut c | semmle.label | mut c | -| main.rs:77:17:77:28 | ...::from | semmle.label | ...::from | | main.rs:77:17:77:36 | ...::from(...) | semmle.label | ...::from(...) | -| main.rs:78:17:78:19 | add | semmle.label | add | | main.rs:78:21:78:21 | c | semmle.label | c | | main.rs:78:21:78:29 | c.clone() | semmle.label | c.clone() | -| main.rs:79:17:79:28 | add_original | semmle.label | add_original | +| main.rs:78:21:78:29 | c.clone() | semmle.label | c.clone() | | main.rs:79:30:79:30 | a | semmle.label | a | | main.rs:79:30:79:38 | a.clone() | semmle.label | a.clone() | -| main.rs:83:17:83:19 | add | semmle.label | add | +| main.rs:79:30:79:38 | a.clone() | semmle.label | a.clone() | | main.rs:83:21:83:21 | c | semmle.label | c | | main.rs:83:21:83:29 | c.clone() | semmle.label | c.clone() | +| main.rs:83:21:83:29 | c.clone() | semmle.label | c.clone() | | main.rs:87:9:87:13 | mut d | semmle.label | mut d | -| main.rs:87:17:87:28 | ...::from | semmle.label | ...::from | | main.rs:87:17:87:36 | ...::from(...) | semmle.label | ...::from(...) | -| main.rs:88:9:88:11 | add | semmle.label | add | | main.rs:88:13:88:13 | d | semmle.label | d | | main.rs:88:13:88:21 | d.clone() | semmle.label | d.clone() | -| main.rs:94:9:94:11 | add | semmle.label | add | +| main.rs:88:13:88:21 | d.clone() | semmle.label | d.clone() | | main.rs:94:13:94:13 | d | semmle.label | d | | main.rs:94:13:94:21 | d.clone() | semmle.label | d.clone() | -| main.rs:114:5:114:17 | ...::build | semmle.label | ...::build | +| main.rs:94:13:94:21 | d.clone() | semmle.label | d.clone() | +| main.rs:114:5:114:36 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:114:5:114:36 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:114:5:114:54 | ... .partitioned(...) | semmle.label | ... .partitioned(...) | -| main.rs:114:56:114:60 | build | semmle.label | build | +| main.rs:114:5:114:54 | ... .partitioned(...) | semmle.label | ... .partitioned(...) | | main.rs:122:9:122:9 | a | semmle.label | a | -| main.rs:122:13:122:41 | ...::new | semmle.label | ...::new | | main.rs:122:13:122:58 | ...::new(...) | semmle.label | ...::new(...) | -| main.rs:123:13:123:18 | insert | semmle.label | insert | | main.rs:123:20:123:20 | a | semmle.label | a | | main.rs:123:20:123:28 | a.clone() | semmle.label | a.clone() | +| main.rs:123:20:123:28 | a.clone() | semmle.label | a.clone() | | main.rs:130:9:130:9 | c | semmle.label | c | | main.rs:130:13:130:13 | b | semmle.label | b | | main.rs:130:13:130:31 | b.set_secure(...) | semmle.label | b.set_secure(...) | -| main.rs:131:13:131:18 | insert | semmle.label | insert | | main.rs:131:20:131:20 | c | semmle.label | c | | main.rs:131:20:131:28 | c.clone() | semmle.label | c.clone() | +| main.rs:131:20:131:28 | c.clone() | semmle.label | c.clone() | | main.rs:134:9:134:9 | d | semmle.label | d | | main.rs:134:13:134:13 | c | semmle.label | c | | main.rs:134:13:134:35 | c.set_partitioned(...) | semmle.label | c.set_partitioned(...) | -| main.rs:135:13:135:18 | insert | semmle.label | insert | | main.rs:135:20:135:20 | d | semmle.label | d | | main.rs:135:20:135:28 | d.clone() | semmle.label | d.clone() | +| main.rs:135:20:135:28 | d.clone() | semmle.label | d.clone() | | main.rs:146:9:146:9 | g | semmle.label | g | | main.rs:146:13:146:13 | f | semmle.label | f | | main.rs:146:13:146:31 | f.set_secure(...) | semmle.label | f.set_secure(...) | -| main.rs:147:13:147:18 | insert | semmle.label | insert | | main.rs:147:20:147:20 | g | semmle.label | g | | main.rs:147:20:147:28 | g.clone() | semmle.label | g.clone() | +| main.rs:147:20:147:28 | g.clone() | semmle.label | g.clone() | | main.rs:151:9:151:9 | h | semmle.label | h | -| main.rs:151:13:151:42 | ...::from | semmle.label | ...::from | | main.rs:151:13:151:61 | ...::from(...) | semmle.label | ...::from(...) | -| main.rs:152:13:152:18 | insert | semmle.label | insert | | main.rs:152:20:152:20 | h | semmle.label | h | | main.rs:155:9:155:9 | i | semmle.label | i | -| main.rs:155:13:155:41 | ...::new | semmle.label | ...::new | | main.rs:155:13:155:58 | ...::new(...) | semmle.label | ...::new(...) | -| main.rs:156:13:156:18 | insert | semmle.label | insert | | main.rs:156:20:156:20 | i | semmle.label | i | | main.rs:156:20:156:28 | i.clone() | semmle.label | i.clone() | | main.rs:156:20:156:46 | ... .set_name(...) | semmle.label | ... .set_name(...) | -| main.rs:157:13:157:18 | insert | semmle.label | insert | +| main.rs:156:20:156:46 | ... .set_name(...) | semmle.label | ... .set_name(...) | | main.rs:157:20:157:20 | i | semmle.label | i | | main.rs:157:20:157:28 | i.clone() | semmle.label | i.clone() | | main.rs:157:20:157:48 | ... .set_value(...) | semmle.label | ... .set_value(...) | -| main.rs:158:13:158:18 | insert | semmle.label | insert | +| main.rs:157:20:157:48 | ... .set_value(...) | semmle.label | ... .set_value(...) | | main.rs:158:20:158:20 | i | semmle.label | i | | main.rs:158:20:158:28 | i.clone() | semmle.label | i.clone() | | main.rs:158:20:158:48 | ... .set_http_only(...) | semmle.label | ... .set_http_only(...) | -| main.rs:159:13:159:18 | insert | semmle.label | insert | +| main.rs:158:20:158:48 | ... .set_http_only(...) | semmle.label | ... .set_http_only(...) | | main.rs:159:20:159:20 | i | semmle.label | i | | main.rs:159:20:159:28 | i.clone() | semmle.label | i.clone() | | main.rs:159:20:159:70 | ... .set_same_site(...) | semmle.label | ... .set_same_site(...) | -| main.rs:160:13:160:18 | insert | semmle.label | insert | +| main.rs:159:20:159:70 | ... .set_same_site(...) | semmle.label | ... .set_same_site(...) | | main.rs:160:20:160:20 | i | semmle.label | i | | main.rs:160:20:160:28 | i.clone() | semmle.label | i.clone() | | main.rs:160:20:160:46 | ... .set_max_age(...) | semmle.label | ... .set_max_age(...) | -| main.rs:161:13:161:18 | insert | semmle.label | insert | +| main.rs:160:20:160:46 | ... .set_max_age(...) | semmle.label | ... .set_max_age(...) | | main.rs:161:20:161:20 | i | semmle.label | i | | main.rs:161:20:161:28 | i.clone() | semmle.label | i.clone() | | main.rs:161:20:161:42 | ... .set_path(...) | semmle.label | ... .set_path(...) | -| main.rs:162:13:162:18 | insert | semmle.label | insert | +| main.rs:161:20:161:42 | ... .set_path(...) | semmle.label | ... .set_path(...) | | main.rs:162:20:162:20 | i | semmle.label | i | | main.rs:162:20:162:28 | i.clone() | semmle.label | i.clone() | | main.rs:162:20:162:41 | ... .unset_path() | semmle.label | ... .unset_path() | -| main.rs:163:13:163:18 | insert | semmle.label | insert | +| main.rs:162:20:162:41 | ... .unset_path() | semmle.label | ... .unset_path() | | main.rs:163:20:163:20 | i | semmle.label | i | | main.rs:163:20:163:28 | i.clone() | semmle.label | i.clone() | | main.rs:163:20:163:54 | ... .set_domain(...) | semmle.label | ... .set_domain(...) | -| main.rs:164:13:164:18 | insert | semmle.label | insert | +| main.rs:163:20:163:54 | ... .set_domain(...) | semmle.label | ... .set_domain(...) | | main.rs:164:20:164:20 | i | semmle.label | i | | main.rs:164:20:164:28 | i.clone() | semmle.label | i.clone() | | main.rs:164:20:164:43 | ... .unset_domain() | semmle.label | ... .unset_domain() | -| main.rs:165:13:165:18 | insert | semmle.label | insert | +| main.rs:164:20:164:43 | ... .unset_domain() | semmle.label | ... .unset_domain() | | main.rs:165:20:165:20 | i | semmle.label | i | | main.rs:165:20:165:28 | i.clone() | semmle.label | i.clone() | | main.rs:165:20:165:46 | ... .set_expires(...) | semmle.label | ... .set_expires(...) | -| main.rs:166:13:166:18 | insert | semmle.label | insert | +| main.rs:165:20:165:46 | ... .set_expires(...) | semmle.label | ... .set_expires(...) | | main.rs:166:20:166:20 | i | semmle.label | i | | main.rs:166:20:166:28 | i.clone() | semmle.label | i.clone() | | main.rs:166:20:166:44 | ... .unset_expires() | semmle.label | ... .unset_expires() | -| main.rs:167:13:167:18 | insert | semmle.label | insert | +| main.rs:166:20:166:44 | ... .unset_expires() | semmle.label | ... .unset_expires() | | main.rs:167:20:167:20 | i | semmle.label | i | | main.rs:167:20:167:28 | i.clone() | semmle.label | i.clone() | | main.rs:167:20:167:45 | ... .make_permanent() | semmle.label | ... .make_permanent() | -| main.rs:173:22:173:34 | ...::build | semmle.label | ...::build | +| main.rs:167:20:167:45 | ... .make_permanent() | semmle.label | ... .make_permanent() | +| main.rs:173:22:173:59 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:173:22:173:59 | ...::build(...) | semmle.label | ...::build(...) | -| main.rs:173:61:173:65 | build | semmle.label | build | | main.rs:197:5:197:39 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:197:5:197:53 | ... .secure(...) | semmle.label | ... .secure(...) | -| main.rs:197:55:197:60 | finish | semmle.label | finish | +| main.rs:197:5:197:53 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:198:5:198:39 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:198:5:198:53 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:198:5:198:63 | ... .path(...) | semmle.label | ... .path(...) | -| main.rs:198:65:198:70 | finish | semmle.label | finish | +| main.rs:198:5:198:63 | ... .path(...) | semmle.label | ... .path(...) | | main.rs:201:5:201:11 | [SSA] cookie1 | semmle.label | [SSA] cookie1 | | main.rs:201:5:201:11 | cookie1 | semmle.label | cookie1 | -| main.rs:202:9:202:11 | add | semmle.label | add | | main.rs:202:13:202:19 | cookie1 | semmle.label | cookie1 | | main.rs:202:13:202:27 | cookie1.clone() | semmle.label | cookie1.clone() | -| main.rs:212:5:212:22 | ...::build | semmle.label | ...::build | +| main.rs:202:13:202:27 | cookie1.clone() | semmle.label | cookie1.clone() | +| main.rs:212:5:212:39 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:212:5:212:39 | ...::build(...) | semmle.label | ...::build(...) | -| main.rs:212:41:212:46 | finish | semmle.label | finish | | main.rs:214:9:214:15 | cookie3 | semmle.label | cookie3 | -| main.rs:214:19:214:34 | ...::new | semmle.label | ...::new | | main.rs:214:19:214:51 | ...::new(...) | semmle.label | ...::new(...) | -| main.rs:215:9:215:11 | add | semmle.label | add | | main.rs:215:13:215:19 | cookie3 | semmle.label | cookie3 | | main.rs:215:13:215:27 | cookie3.clone() | semmle.label | cookie3.clone() | +| main.rs:215:13:215:27 | cookie3.clone() | semmle.label | cookie3.clone() | | main.rs:218:5:218:11 | [SSA] cookie2 | semmle.label | [SSA] cookie2 | | main.rs:218:5:218:11 | cookie2 | semmle.label | cookie2 | -| main.rs:219:9:219:11 | add | semmle.label | add | | main.rs:219:13:219:19 | cookie2 | semmle.label | cookie2 | | main.rs:219:13:219:27 | cookie2.clone() | semmle.label | cookie2.clone() | +| main.rs:219:13:219:27 | cookie2.clone() | semmle.label | cookie2.clone() | | main.rs:228:5:228:11 | [SSA] cookie1 | semmle.label | [SSA] cookie1 | | main.rs:228:5:228:11 | cookie1 | semmle.label | cookie1 | -| main.rs:229:9:229:11 | add | semmle.label | add | | main.rs:229:13:229:19 | cookie1 | semmle.label | cookie1 | | main.rs:229:13:229:27 | cookie1.clone() | semmle.label | cookie1.clone() | +| main.rs:229:13:229:27 | cookie1.clone() | semmle.label | cookie1.clone() | | main.rs:241:9:241:25 | cookie_config_bad | semmle.label | cookie_config_bad | | main.rs:241:29:241:62 | ...::new(...) | semmle.label | ...::new(...) | | main.rs:241:29:241:76 | ... .secure(...) | semmle.label | ... .secure(...) | -| main.rs:242:9:242:41 | ...::new | semmle.label | ...::new | | main.rs:242:43:242:59 | cookie_config_bad | semmle.label | cookie_config_bad | | main.rs:244:9:244:26 | cookie_config_bad2 | semmle.label | cookie_config_bad2 | | main.rs:244:30:244:63 | ...::new(...) | semmle.label | ...::new(...) | | main.rs:244:30:244:77 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:244:30:244:90 | ... .name(...) | semmle.label | ... .name(...) | | main.rs:244:30:244:100 | ... .path(...) | semmle.label | ... .path(...) | -| main.rs:245:9:245:41 | ...::new | semmle.label | ...::new | | main.rs:245:43:245:60 | cookie_config_bad2 | semmle.label | cookie_config_bad2 | | main.rs:259:5:259:43 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:259:5:259:57 | ... .secure(...) | semmle.label | ... .secure(...) | -| main.rs:259:59:259:64 | finish | semmle.label | finish | +| main.rs:259:5:259:57 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:260:5:260:43 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:260:5:260:57 | ... .secure(...) | semmle.label | ... .secure(...) | | main.rs:260:5:260:67 | ... .path(...) | semmle.label | ... .path(...) | -| main.rs:260:69:260:74 | finish | semmle.label | finish | +| main.rs:260:5:260:67 | ... .path(...) | semmle.label | ... .path(...) | | main.rs:263:5:263:11 | [SSA] cookie1 | semmle.label | [SSA] cookie1 | | main.rs:263:5:263:11 | cookie1 | semmle.label | cookie1 | -| main.rs:264:9:264:11 | add | semmle.label | add | | main.rs:264:13:264:19 | cookie1 | semmle.label | cookie1 | | main.rs:264:13:264:27 | cookie1.clone() | semmle.label | cookie1.clone() | -| main.rs:274:5:274:26 | ...::build | semmle.label | ...::build | +| main.rs:264:13:264:27 | cookie1.clone() | semmle.label | cookie1.clone() | +| main.rs:274:5:274:43 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:274:5:274:43 | ...::build(...) | semmle.label | ...::build(...) | -| main.rs:274:45:274:50 | finish | semmle.label | finish | | main.rs:276:9:276:15 | cookie3 | semmle.label | cookie3 | -| main.rs:276:19:276:38 | ...::new | semmle.label | ...::new | | main.rs:276:19:276:55 | ...::new(...) | semmle.label | ...::new(...) | -| main.rs:277:9:277:11 | add | semmle.label | add | | main.rs:277:13:277:19 | cookie3 | semmle.label | cookie3 | | main.rs:277:13:277:27 | cookie3.clone() | semmle.label | cookie3.clone() | +| main.rs:277:13:277:27 | cookie3.clone() | semmle.label | cookie3.clone() | | main.rs:280:5:280:11 | [SSA] cookie2 | semmle.label | [SSA] cookie2 | | main.rs:280:5:280:11 | cookie2 | semmle.label | cookie2 | -| main.rs:281:9:281:11 | add | semmle.label | add | | main.rs:281:13:281:19 | cookie2 | semmle.label | cookie2 | | main.rs:281:13:281:27 | cookie2.clone() | semmle.label | cookie2.clone() | +| main.rs:281:13:281:27 | cookie2.clone() | semmle.label | cookie2.clone() | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected b/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected index 477dbee0e0f4..2924834e71c5 100644 --- a/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected +++ b/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected @@ -1,103 +1,96 @@ #select -| main.rs:18:13:18:31 | ...::realloc | main.rs:339:13:339:26 | ...::args | main.rs:18:13:18:31 | ...::realloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:21:13:21:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:21:13:21:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:22:13:22:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:22:13:22:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:23:13:23:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:23:13:23:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:24:13:24:36 | ...::alloc_zeroed | main.rs:339:13:339:26 | ...::args | main.rs:24:13:24:36 | ...::alloc_zeroed | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:30:13:30:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:30:13:30:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:33:13:33:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:33:13:33:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:37:13:37:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:37:13:37:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:40:13:40:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:40:13:40:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:50:13:50:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:50:13:50:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:51:13:51:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:51:13:51:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:53:13:53:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:53:13:53:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:54:13:54:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:54:13:54:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:59:13:59:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:59:13:59:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:61:13:61:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:61:13:61:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:63:13:63:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:63:13:63:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:64:13:64:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:64:13:64:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:65:13:65:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:65:13:65:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:68:13:68:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:68:13:68:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:88:13:88:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:88:13:88:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:96:17:96:33 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:96:17:96:33 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:102:17:102:33 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:102:17:102:33 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:103:17:103:33 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:103:17:103:33 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:109:17:109:33 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:109:17:109:33 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:111:17:111:33 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:111:17:111:33 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:146:17:146:33 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:146:17:146:33 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:148:17:148:33 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:148:17:148:33 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:152:13:152:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:152:13:152:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:155:13:155:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:155:13:155:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:162:17:162:33 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:162:17:162:33 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:169:17:169:33 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:169:17:169:33 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:177:13:177:29 | ...::alloc | main.rs:339:13:339:26 | ...::args | main.rs:177:13:177:29 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:193:32:193:36 | alloc | main.rs:339:13:339:26 | ...::args | main.rs:193:32:193:36 | alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:194:32:194:43 | alloc_zeroed | main.rs:339:13:339:26 | ...::args | main.rs:194:32:194:43 | alloc_zeroed | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:195:32:195:39 | allocate | main.rs:339:13:339:26 | ...::args | main.rs:195:32:195:39 | allocate | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:196:32:196:46 | allocate_zeroed | main.rs:339:13:339:26 | ...::args | main.rs:196:32:196:46 | allocate_zeroed | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:197:32:197:39 | allocate | main.rs:339:13:339:26 | ...::args | main.rs:197:32:197:39 | allocate | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:198:32:198:46 | allocate_zeroed | main.rs:339:13:339:26 | ...::args | main.rs:198:32:198:46 | allocate_zeroed | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:202:32:202:38 | realloc | main.rs:339:13:339:26 | ...::args | main.rs:202:32:202:38 | realloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:208:40:208:43 | grow | main.rs:339:13:339:26 | ...::args | main.rs:208:40:208:43 | grow | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:210:40:210:50 | grow_zeroed | main.rs:339:13:339:26 | ...::args | main.rs:210:40:210:50 | grow_zeroed | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:213:36:213:41 | shrink | main.rs:339:13:339:26 | ...::args | main.rs:213:36:213:41 | shrink | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:219:13:219:24 | ...::malloc | main.rs:339:13:339:26 | ...::args | main.rs:219:13:219:24 | ...::malloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:220:13:220:31 | ...::aligned_alloc | main.rs:339:13:339:26 | ...::args | main.rs:220:13:220:31 | ...::aligned_alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:222:13:222:24 | ...::calloc | main.rs:339:13:339:26 | ...::args | main.rs:222:13:222:24 | ...::calloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:223:13:223:24 | ...::calloc | main.rs:339:13:339:26 | ...::args | main.rs:223:13:223:24 | ...::calloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:224:13:224:25 | ...::realloc | main.rs:339:13:339:26 | ...::args | main.rs:224:13:224:25 | ...::realloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:228:13:228:41 | ...::try_with_capacity | main.rs:339:13:339:26 | ...::args | main.rs:228:13:228:41 | ...::try_with_capacity | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:229:13:229:37 | ...::with_capacity | main.rs:339:13:339:26 | ...::args | main.rs:229:13:229:37 | ...::with_capacity | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:230:13:230:44 | ...::try_with_capacity_in | main.rs:339:13:339:26 | ...::args | main.rs:230:13:230:44 | ...::try_with_capacity_in | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:231:13:231:40 | ...::with_capacity_in | main.rs:339:13:339:26 | ...::args | main.rs:231:13:231:40 | ...::with_capacity_in | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | -| main.rs:287:22:287:38 | ...::alloc | main.rs:311:25:311:38 | ...::args | main.rs:287:22:287:38 | ...::alloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:311:25:311:38 | ...::args | user-provided value | -| main.rs:331:13:331:24 | ...::malloc | main.rs:339:13:339:26 | ...::args | main.rs:331:13:331:24 | ...::malloc | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:26 | ...::args | user-provided value | +| main.rs:18:41:18:41 | v | main.rs:339:13:339:28 | ...::args(...) | main.rs:18:41:18:41 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:21:31:21:32 | l2 | main.rs:339:13:339:28 | ...::args(...) | main.rs:21:31:21:32 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:22:31:22:53 | ... .unwrap() | main.rs:339:13:339:28 | ...::args(...) | main.rs:22:31:22:53 | ... .unwrap() | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:23:31:23:68 | ... .pad_to_align() | main.rs:339:13:339:28 | ...::args(...) | main.rs:23:31:23:68 | ... .pad_to_align() | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:24:38:24:39 | l2 | main.rs:339:13:339:28 | ...::args(...) | main.rs:24:38:24:39 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:30:31:30:32 | l4 | main.rs:339:13:339:28 | ...::args(...) | main.rs:30:31:30:32 | l4 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:33:31:33:32 | l5 | main.rs:339:13:339:28 | ...::args(...) | main.rs:33:31:33:32 | l5 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:37:31:37:32 | l6 | main.rs:339:13:339:28 | ...::args(...) | main.rs:37:31:37:32 | l6 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:40:31:40:32 | l7 | main.rs:339:13:339:28 | ...::args(...) | main.rs:40:31:40:32 | l7 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:50:31:50:53 | ... .0 | main.rs:339:13:339:28 | ...::args(...) | main.rs:50:31:50:53 | ... .0 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:51:31:51:57 | ... .0 | main.rs:339:13:339:28 | ...::args(...) | main.rs:51:31:51:57 | ... .0 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:53:31:53:58 | ... .unwrap() | main.rs:339:13:339:28 | ...::args(...) | main.rs:53:31:53:58 | ... .unwrap() | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:54:31:54:63 | ... .unwrap() | main.rs:339:13:339:28 | ...::args(...) | main.rs:54:31:54:63 | ... .unwrap() | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:59:31:59:32 | k1 | main.rs:339:13:339:28 | ...::args(...) | main.rs:59:31:59:32 | k1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:61:31:61:32 | k2 | main.rs:339:13:339:28 | ...::args(...) | main.rs:61:31:61:32 | k2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:63:31:63:32 | k3 | main.rs:339:13:339:28 | ...::args(...) | main.rs:63:31:63:32 | k3 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:64:31:64:59 | ... .unwrap() | main.rs:339:13:339:28 | ...::args(...) | main.rs:64:31:64:59 | ... .unwrap() | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:65:31:65:59 | ... .unwrap() | main.rs:339:13:339:28 | ...::args(...) | main.rs:65:31:65:59 | ... .unwrap() | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:68:31:68:32 | l4 | main.rs:339:13:339:28 | ...::args(...) | main.rs:68:31:68:32 | l4 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:88:31:88:36 | layout | main.rs:339:13:339:28 | ...::args(...) | main.rs:88:31:88:36 | layout | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:96:35:96:36 | l1 | main.rs:339:13:339:28 | ...::args(...) | main.rs:96:35:96:36 | l1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:102:35:102:36 | l1 | main.rs:339:13:339:28 | ...::args(...) | main.rs:102:35:102:36 | l1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:103:35:103:36 | l3 | main.rs:339:13:339:28 | ...::args(...) | main.rs:103:35:103:36 | l3 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:109:35:109:36 | l1 | main.rs:339:13:339:28 | ...::args(...) | main.rs:109:35:109:36 | l1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:111:35:111:36 | l1 | main.rs:339:13:339:28 | ...::args(...) | main.rs:111:35:111:36 | l1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:146:35:146:36 | l1 | main.rs:339:13:339:28 | ...::args(...) | main.rs:146:35:146:36 | l1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:148:35:148:36 | l9 | main.rs:339:13:339:28 | ...::args(...) | main.rs:148:35:148:36 | l9 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:152:31:152:33 | l10 | main.rs:339:13:339:28 | ...::args(...) | main.rs:152:31:152:33 | l10 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:155:31:155:33 | l11 | main.rs:339:13:339:28 | ...::args(...) | main.rs:155:31:155:33 | l11 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:162:35:162:37 | l13 | main.rs:339:13:339:28 | ...::args(...) | main.rs:162:35:162:37 | l13 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:169:35:169:37 | l13 | main.rs:339:13:339:28 | ...::args(...) | main.rs:169:35:169:37 | l13 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:177:31:177:32 | l1 | main.rs:339:13:339:28 | ...::args(...) | main.rs:177:31:177:32 | l1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:193:38:193:39 | l2 | main.rs:339:13:339:28 | ...::args(...) | main.rs:193:38:193:39 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:194:45:194:46 | l2 | main.rs:339:13:339:28 | ...::args(...) | main.rs:194:45:194:46 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:195:41:195:42 | l2 | main.rs:339:13:339:28 | ...::args(...) | main.rs:195:41:195:42 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:196:48:196:49 | l2 | main.rs:339:13:339:28 | ...::args(...) | main.rs:196:48:196:49 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:197:41:197:42 | l2 | main.rs:339:13:339:28 | ...::args(...) | main.rs:197:41:197:42 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:198:48:198:49 | l2 | main.rs:339:13:339:28 | ...::args(...) | main.rs:198:48:198:49 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:202:48:202:48 | v | main.rs:339:13:339:28 | ...::args(...) | main.rs:202:48:202:48 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:208:53:208:54 | l2 | main.rs:339:13:339:28 | ...::args(...) | main.rs:208:53:208:54 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:210:60:210:61 | l2 | main.rs:339:13:339:28 | ...::args(...) | main.rs:210:60:210:61 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:213:51:213:52 | l2 | main.rs:339:13:339:28 | ...::args(...) | main.rs:213:51:213:52 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:219:26:219:26 | v | main.rs:339:13:339:28 | ...::args(...) | main.rs:219:26:219:26 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:220:36:220:36 | v | main.rs:339:13:339:28 | ...::args(...) | main.rs:220:36:220:36 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:222:30:222:30 | v | main.rs:339:13:339:28 | ...::args(...) | main.rs:222:30:222:30 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:223:26:223:26 | v | main.rs:339:13:339:28 | ...::args(...) | main.rs:223:26:223:26 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:224:31:224:31 | v | main.rs:339:13:339:28 | ...::args(...) | main.rs:224:31:224:31 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:228:43:228:43 | v | main.rs:339:13:339:28 | ...::args(...) | main.rs:228:43:228:43 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:229:39:229:39 | v | main.rs:339:13:339:28 | ...::args(...) | main.rs:229:39:229:39 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:230:46:230:46 | v | main.rs:339:13:339:28 | ...::args(...) | main.rs:230:46:230:46 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:231:42:231:42 | v | main.rs:339:13:339:28 | ...::args(...) | main.rs:231:42:231:42 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:287:40:287:45 | layout | main.rs:311:25:311:40 | ...::args(...) | main.rs:287:40:287:45 | layout | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:311:25:311:40 | ...::args(...) | user-provided value | +| main.rs:331:26:331:26 | a | main.rs:339:13:339:28 | ...::args(...) | main.rs:331:26:331:26 | a | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | edges -| main.rs:12:36:12:43 | ...: usize | main.rs:18:41:18:41 | v | provenance | | -| main.rs:18:41:18:41 | v | main.rs:18:13:18:31 | ...::realloc | provenance | MaD:17 Sink:MaD:17 | -| main.rs:18:41:18:41 | v | main.rs:20:50:20:50 | v | provenance | | -| main.rs:18:41:18:41 | v | main.rs:29:60:29:60 | v | provenance | | -| main.rs:18:41:18:41 | v | main.rs:32:60:32:60 | v | provenance | | -| main.rs:18:41:18:41 | v | main.rs:35:49:35:49 | v | provenance | | -| main.rs:20:9:20:10 | l2 | main.rs:21:31:21:32 | l2 | provenance | | +| main.rs:12:36:12:43 | ...: usize | main.rs:18:41:18:41 | v | provenance | Sink:MaD:17 | +| main.rs:12:36:12:43 | ...: usize | main.rs:20:50:20:50 | v | provenance | | +| main.rs:12:36:12:43 | ...: usize | main.rs:29:60:29:60 | v | provenance | | +| main.rs:12:36:12:43 | ...: usize | main.rs:32:60:32:60 | v | provenance | | +| main.rs:12:36:12:43 | ...: usize | main.rs:35:49:35:49 | v | provenance | | +| main.rs:20:9:20:10 | l2 | main.rs:21:31:21:32 | l2 | provenance | Sink:MaD:15 | +| main.rs:20:9:20:10 | l2 | main.rs:22:31:22:32 | l2 | provenance | | +| main.rs:20:9:20:10 | l2 | main.rs:23:31:23:32 | l2 | provenance | | +| main.rs:20:9:20:10 | l2 | main.rs:24:38:24:39 | l2 | provenance | Sink:MaD:16 | | main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | main.rs:20:14:20:63 | ... .unwrap() | provenance | MaD:41 | | main.rs:20:14:20:63 | ... .unwrap() | main.rs:20:9:20:10 | l2 | provenance | | | main.rs:20:50:20:50 | v | main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | provenance | MaD:33 | -| main.rs:21:31:21:32 | l2 | main.rs:21:13:21:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:21:31:21:32 | l2 | main.rs:22:31:22:32 | l2 | provenance | | -| main.rs:21:31:21:32 | l2 | main.rs:23:31:23:32 | l2 | provenance | | -| main.rs:21:31:21:32 | l2 | main.rs:24:38:24:39 | l2 | provenance | | | main.rs:22:31:22:32 | l2 | main.rs:22:31:22:44 | l2.align_to(...) [Ok] | provenance | MaD:27 | | main.rs:22:31:22:44 | l2.align_to(...) [Ok] | main.rs:22:31:22:53 | ... .unwrap() | provenance | MaD:41 | -| main.rs:22:31:22:53 | ... .unwrap() | main.rs:22:13:22:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | +| main.rs:22:31:22:53 | ... .unwrap() | main.rs:22:31:22:53 | ... .unwrap() | provenance | Sink:MaD:15 | | main.rs:23:31:23:32 | l2 | main.rs:23:31:23:44 | l2.align_to(...) [Ok] | provenance | MaD:27 | | main.rs:23:31:23:44 | l2.align_to(...) [Ok] | main.rs:23:31:23:53 | ... .unwrap() | provenance | MaD:41 | | main.rs:23:31:23:53 | ... .unwrap() | main.rs:23:31:23:68 | ... .pad_to_align() | provenance | MaD:35 | -| main.rs:23:31:23:68 | ... .pad_to_align() | main.rs:23:13:23:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:24:38:24:39 | l2 | main.rs:24:13:24:36 | ...::alloc_zeroed | provenance | MaD:16 Sink:MaD:16 | -| main.rs:29:9:29:10 | l4 | main.rs:30:31:30:32 | l4 | provenance | | +| main.rs:23:31:23:68 | ... .pad_to_align() | main.rs:23:31:23:68 | ... .pad_to_align() | provenance | Sink:MaD:15 | +| main.rs:29:9:29:10 | l4 | main.rs:30:31:30:32 | l4 | provenance | Sink:MaD:15 | | main.rs:29:14:29:64 | ...::from_size_align_unchecked(...) | main.rs:29:9:29:10 | l4 | provenance | | | main.rs:29:60:29:60 | v | main.rs:29:14:29:64 | ...::from_size_align_unchecked(...) | provenance | MaD:34 | -| main.rs:30:31:30:32 | l4 | main.rs:30:13:30:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:32:9:32:10 | l5 | main.rs:33:31:33:32 | l5 | provenance | | +| main.rs:32:9:32:10 | l5 | main.rs:33:31:33:32 | l5 | provenance | Sink:MaD:15 | | main.rs:32:14:32:118 | ...::from_size_align_unchecked(...) | main.rs:32:9:32:10 | l5 | provenance | | | main.rs:32:60:32:60 | v | main.rs:32:60:32:89 | ... * ... | provenance | MaD:25 | | main.rs:32:60:32:89 | ... * ... | main.rs:32:14:32:118 | ...::from_size_align_unchecked(...) | provenance | MaD:34 | -| main.rs:33:31:33:32 | l5 | main.rs:33:13:33:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:35:9:35:10 | s6 | main.rs:36:60:36:61 | s6 | provenance | | | main.rs:35:14:35:54 | ... + ... | main.rs:35:9:35:10 | s6 | provenance | | | main.rs:35:15:35:49 | ... * ... | main.rs:35:14:35:54 | ... + ... | provenance | MaD:24 | | main.rs:35:49:35:49 | v | main.rs:35:15:35:49 | ... * ... | provenance | MaD:25 | -| main.rs:36:9:36:10 | l6 | main.rs:37:31:37:32 | l6 | provenance | | +| main.rs:36:9:36:10 | l6 | main.rs:37:31:37:32 | l6 | provenance | Sink:MaD:15 | +| main.rs:36:9:36:10 | l6 | main.rs:39:60:39:61 | l6 | provenance | | | main.rs:36:14:36:65 | ...::from_size_align_unchecked(...) | main.rs:36:9:36:10 | l6 | provenance | | | main.rs:36:60:36:61 | s6 | main.rs:36:14:36:65 | ...::from_size_align_unchecked(...) | provenance | MaD:34 | -| main.rs:37:31:37:32 | l6 | main.rs:37:13:37:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:37:31:37:32 | l6 | main.rs:39:60:39:61 | l6 | provenance | | -| main.rs:39:9:39:10 | l7 | main.rs:40:31:40:32 | l7 | provenance | | +| main.rs:39:9:39:10 | l7 | main.rs:40:31:40:32 | l7 | provenance | Sink:MaD:15 | | main.rs:39:14:39:72 | ...::from_size_align_unchecked(...) | main.rs:39:9:39:10 | l7 | provenance | | | main.rs:39:60:39:61 | l6 | main.rs:39:60:39:68 | l6.size() | provenance | MaD:38 | | main.rs:39:60:39:68 | l6.size() | main.rs:39:14:39:72 | ...::from_size_align_unchecked(...) | provenance | MaD:34 | -| main.rs:40:31:40:32 | l7 | main.rs:40:13:40:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:43:44:43:51 | ...: usize | main.rs:50:41:50:41 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:51:41:51:41 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:53:48:53:48 | v | provenance | | @@ -106,59 +99,54 @@ edges | main.rs:43:44:43:51 | ...: usize | main.rs:67:46:67:46 | v | provenance | | | main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | main.rs:50:31:50:51 | ... .unwrap() [tuple.0] | provenance | MaD:41 | | main.rs:50:31:50:51 | ... .unwrap() [tuple.0] | main.rs:50:31:50:53 | ... .0 | provenance | | -| main.rs:50:31:50:53 | ... .0 | main.rs:50:13:50:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | +| main.rs:50:31:50:53 | ... .0 | main.rs:50:31:50:53 | ... .0 | provenance | Sink:MaD:15 | | main.rs:50:41:50:41 | v | main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:36 | | main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | main.rs:51:31:51:55 | ... .unwrap() [tuple.0] | provenance | MaD:41 | | main.rs:51:31:51:55 | ... .unwrap() [tuple.0] | main.rs:51:31:51:57 | ... .0 | provenance | | -| main.rs:51:31:51:57 | ... .0 | main.rs:51:13:51:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | +| main.rs:51:31:51:57 | ... .0 | main.rs:51:31:51:57 | ... .0 | provenance | Sink:MaD:15 | | main.rs:51:41:51:41 | v | main.rs:51:41:51:45 | ... + ... | provenance | MaD:24 | | main.rs:51:41:51:45 | ... + ... | main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:36 | | main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | main.rs:53:31:53:58 | ... .unwrap() | provenance | MaD:41 | -| main.rs:53:31:53:58 | ... .unwrap() | main.rs:53:13:53:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | +| main.rs:53:31:53:58 | ... .unwrap() | main.rs:53:31:53:58 | ... .unwrap() | provenance | Sink:MaD:15 | | main.rs:53:48:53:48 | v | main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | provenance | MaD:37 | | main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | main.rs:54:31:54:63 | ... .unwrap() | provenance | MaD:41 | -| main.rs:54:31:54:63 | ... .unwrap() | main.rs:54:13:54:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | +| main.rs:54:31:54:63 | ... .unwrap() | main.rs:54:31:54:63 | ... .unwrap() | provenance | Sink:MaD:15 | | main.rs:54:48:54:48 | v | main.rs:54:48:54:53 | ... * ... | provenance | MaD:25 | | main.rs:54:48:54:53 | ... * ... | main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | provenance | MaD:37 | | main.rs:58:9:58:20 | TuplePat [tuple.0] | main.rs:58:10:58:11 | k1 | provenance | | -| main.rs:58:10:58:11 | k1 | main.rs:59:31:59:32 | k1 | provenance | | +| main.rs:58:10:58:11 | k1 | main.rs:59:31:59:32 | k1 | provenance | Sink:MaD:15 | +| main.rs:58:10:58:11 | k1 | main.rs:60:34:60:35 | k1 | provenance | | +| main.rs:58:10:58:11 | k1 | main.rs:62:24:62:25 | k1 | provenance | | +| main.rs:58:10:58:11 | k1 | main.rs:64:48:64:49 | k1 | provenance | | +| main.rs:58:10:58:11 | k1 | main.rs:65:31:65:32 | k1 | provenance | | | main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | main.rs:58:24:58:66 | ... .expect(...) [tuple.0] | provenance | MaD:40 | | main.rs:58:24:58:66 | ... .expect(...) [tuple.0] | main.rs:58:9:58:20 | TuplePat [tuple.0] | provenance | | | main.rs:58:34:58:34 | v | main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | provenance | MaD:36 | -| main.rs:59:31:59:32 | k1 | main.rs:59:13:59:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:59:31:59:32 | k1 | main.rs:60:34:60:35 | k1 | provenance | | -| main.rs:59:31:59:32 | k1 | main.rs:62:24:62:25 | k1 | provenance | | -| main.rs:59:31:59:32 | k1 | main.rs:64:48:64:49 | k1 | provenance | | -| main.rs:59:31:59:32 | k1 | main.rs:65:31:65:32 | k1 | provenance | | | main.rs:60:9:60:20 | TuplePat [tuple.0] | main.rs:60:10:60:11 | k2 | provenance | | -| main.rs:60:10:60:11 | k2 | main.rs:61:31:61:32 | k2 | provenance | | +| main.rs:60:10:60:11 | k2 | main.rs:61:31:61:32 | k2 | provenance | Sink:MaD:15 | | main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | main.rs:60:24:60:45 | ... .unwrap() [tuple.0] | provenance | MaD:41 | | main.rs:60:24:60:45 | ... .unwrap() [tuple.0] | main.rs:60:9:60:20 | TuplePat [tuple.0] | provenance | | | main.rs:60:34:60:35 | k1 | main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | provenance | MaD:29 | -| main.rs:61:31:61:32 | k2 | main.rs:61:13:61:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:62:9:62:20 | TuplePat [tuple.0] | main.rs:62:10:62:11 | k3 | provenance | | -| main.rs:62:10:62:11 | k3 | main.rs:63:31:63:32 | k3 | provenance | | +| main.rs:62:10:62:11 | k3 | main.rs:63:31:63:32 | k3 | provenance | Sink:MaD:15 | | main.rs:62:24:62:25 | k1 | main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | provenance | MaD:30 | | main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | main.rs:62:24:62:45 | ... .unwrap() [tuple.0] | provenance | MaD:41 | | main.rs:62:24:62:45 | ... .unwrap() [tuple.0] | main.rs:62:9:62:20 | TuplePat [tuple.0] | provenance | | -| main.rs:63:31:63:32 | k3 | main.rs:63:13:63:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | main.rs:64:31:64:59 | ... .unwrap() | provenance | MaD:41 | -| main.rs:64:31:64:59 | ... .unwrap() | main.rs:64:13:64:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | +| main.rs:64:31:64:59 | ... .unwrap() | main.rs:64:31:64:59 | ... .unwrap() | provenance | Sink:MaD:15 | | main.rs:64:48:64:49 | k1 | main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | provenance | MaD:31 | | main.rs:65:31:65:32 | k1 | main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | provenance | MaD:32 | | main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | main.rs:65:31:65:59 | ... .unwrap() | provenance | MaD:41 | -| main.rs:65:31:65:59 | ... .unwrap() | main.rs:65:13:65:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:67:9:67:10 | l4 | main.rs:68:31:68:32 | l4 | provenance | | +| main.rs:65:31:65:59 | ... .unwrap() | main.rs:65:31:65:59 | ... .unwrap() | provenance | Sink:MaD:15 | +| main.rs:67:9:67:10 | l4 | main.rs:68:31:68:32 | l4 | provenance | Sink:MaD:15 | | main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | main.rs:67:14:67:56 | ... .unwrap() | provenance | MaD:41 | | main.rs:67:14:67:56 | ... .unwrap() | main.rs:67:9:67:10 | l4 | provenance | | | main.rs:67:46:67:46 | v | main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | -| main.rs:68:31:68:32 | l4 | main.rs:68:13:68:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:86:35:86:42 | ...: usize | main.rs:87:54:87:54 | v | provenance | | -| main.rs:87:9:87:14 | layout | main.rs:88:31:88:36 | layout | provenance | | +| main.rs:87:9:87:14 | layout | main.rs:88:31:88:36 | layout | provenance | Sink:MaD:15 | | main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | main.rs:87:18:87:67 | ... .unwrap() | provenance | MaD:41 | | main.rs:87:18:87:67 | ... .unwrap() | main.rs:87:9:87:14 | layout | provenance | | | main.rs:87:54:87:54 | v | main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | provenance | MaD:33 | -| main.rs:88:31:88:36 | layout | main.rs:88:13:88:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:91:38:91:45 | ...: usize | main.rs:92:47:92:47 | v | provenance | | | main.rs:91:38:91:45 | ...: usize | main.rs:101:51:101:51 | v | provenance | | | main.rs:91:38:91:45 | ...: usize | main.rs:105:33:105:33 | v | provenance | | @@ -166,113 +154,77 @@ edges | main.rs:91:38:91:45 | ...: usize | main.rs:151:62:151:62 | v | provenance | | | main.rs:91:38:91:45 | ...: usize | main.rs:154:62:154:62 | v | provenance | | | main.rs:91:38:91:45 | ...: usize | main.rs:161:55:161:55 | v | provenance | | -| main.rs:92:9:92:10 | l1 | main.rs:96:35:96:36 | l1 | provenance | | -| main.rs:92:9:92:10 | l1 | main.rs:102:35:102:36 | l1 | provenance | | +| main.rs:92:9:92:10 | l1 | main.rs:96:35:96:36 | l1 | provenance | Sink:MaD:15 | +| main.rs:92:9:92:10 | l1 | main.rs:102:35:102:36 | l1 | provenance | Sink:MaD:15 | +| main.rs:92:9:92:10 | l1 | main.rs:109:35:109:36 | l1 | provenance | Sink:MaD:15 | +| main.rs:92:9:92:10 | l1 | main.rs:111:35:111:36 | l1 | provenance | Sink:MaD:15 | +| main.rs:92:9:92:10 | l1 | main.rs:146:35:146:36 | l1 | provenance | Sink:MaD:15 | +| main.rs:92:9:92:10 | l1 | main.rs:177:31:177:32 | l1 | provenance | Sink:MaD:15 | | main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | main.rs:92:14:92:57 | ... .unwrap() | provenance | MaD:41 | | main.rs:92:14:92:57 | ... .unwrap() | main.rs:92:9:92:10 | l1 | provenance | | | main.rs:92:47:92:47 | v | main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | -| main.rs:96:35:96:36 | l1 | main.rs:96:17:96:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:96:35:96:36 | l1 | main.rs:109:35:109:36 | l1 | provenance | | -| main.rs:96:35:96:36 | l1 | main.rs:111:35:111:36 | l1 | provenance | | -| main.rs:101:13:101:14 | l3 | main.rs:103:35:103:36 | l3 | provenance | | +| main.rs:101:13:101:14 | l3 | main.rs:103:35:103:36 | l3 | provenance | Sink:MaD:15 | | main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | main.rs:101:18:101:61 | ... .unwrap() | provenance | MaD:41 | | main.rs:101:18:101:61 | ... .unwrap() | main.rs:101:13:101:14 | l3 | provenance | | | main.rs:101:51:101:51 | v | main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | -| main.rs:102:35:102:36 | l1 | main.rs:102:17:102:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:102:35:102:36 | l1 | main.rs:109:35:109:36 | l1 | provenance | | -| main.rs:102:35:102:36 | l1 | main.rs:111:35:111:36 | l1 | provenance | | -| main.rs:103:35:103:36 | l3 | main.rs:103:17:103:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:105:33:105:33 | v | main.rs:86:35:86:42 | ...: usize | provenance | | -| main.rs:109:35:109:36 | l1 | main.rs:109:17:109:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:109:35:109:36 | l1 | main.rs:146:35:146:36 | l1 | provenance | | -| main.rs:111:35:111:36 | l1 | main.rs:111:17:111:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:111:35:111:36 | l1 | main.rs:146:35:146:36 | l1 | provenance | | -| main.rs:145:13:145:14 | l9 | main.rs:148:35:148:36 | l9 | provenance | | +| main.rs:145:13:145:14 | l9 | main.rs:148:35:148:36 | l9 | provenance | Sink:MaD:15 | | main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | main.rs:145:18:145:61 | ... .unwrap() | provenance | MaD:41 | | main.rs:145:18:145:61 | ... .unwrap() | main.rs:145:13:145:14 | l9 | provenance | | | main.rs:145:51:145:51 | v | main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | -| main.rs:146:35:146:36 | l1 | main.rs:146:17:146:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:146:35:146:36 | l1 | main.rs:177:31:177:32 | l1 | provenance | | -| main.rs:148:35:148:36 | l9 | main.rs:148:17:148:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:151:9:151:11 | l10 | main.rs:152:31:152:33 | l10 | provenance | | +| main.rs:151:9:151:11 | l10 | main.rs:152:31:152:33 | l10 | provenance | Sink:MaD:15 | | main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | main.rs:151:15:151:78 | ... .unwrap() | provenance | MaD:41 | | main.rs:151:15:151:78 | ... .unwrap() | main.rs:151:9:151:11 | l10 | provenance | | | main.rs:151:48:151:68 | ...::min(...) | main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | | main.rs:151:62:151:62 | v | main.rs:151:48:151:68 | ...::min(...) | provenance | MaD:43 | -| main.rs:152:31:152:33 | l10 | main.rs:152:13:152:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:154:9:154:11 | l11 | main.rs:155:31:155:33 | l11 | provenance | | +| main.rs:154:9:154:11 | l11 | main.rs:155:31:155:33 | l11 | provenance | Sink:MaD:15 | | main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | main.rs:154:15:154:78 | ... .unwrap() | provenance | MaD:41 | | main.rs:154:15:154:78 | ... .unwrap() | main.rs:154:9:154:11 | l11 | provenance | | | main.rs:154:48:154:68 | ...::max(...) | main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | | main.rs:154:62:154:62 | v | main.rs:154:48:154:68 | ...::max(...) | provenance | MaD:42 | -| main.rs:155:31:155:33 | l11 | main.rs:155:13:155:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:161:13:161:15 | l13 | main.rs:162:35:162:37 | l13 | provenance | | +| main.rs:161:13:161:15 | l13 | main.rs:162:35:162:37 | l13 | provenance | Sink:MaD:15 | +| main.rs:161:13:161:15 | l13 | main.rs:169:35:169:37 | l13 | provenance | Sink:MaD:15 | | main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | main.rs:161:19:161:68 | ... .unwrap() | provenance | MaD:41 | | main.rs:161:19:161:68 | ... .unwrap() | main.rs:161:13:161:15 | l13 | provenance | | | main.rs:161:55:161:55 | v | main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | provenance | MaD:33 | -| main.rs:162:35:162:37 | l13 | main.rs:162:17:162:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:162:35:162:37 | l13 | main.rs:169:35:169:37 | l13 | provenance | | -| main.rs:169:35:169:37 | l13 | main.rs:169:17:169:33 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:177:31:177:32 | l1 | main.rs:177:13:177:29 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | | main.rs:183:29:183:36 | ...: usize | main.rs:192:46:192:46 | v | provenance | | -| main.rs:183:29:183:36 | ...: usize | main.rs:202:48:202:48 | v | provenance | | -| main.rs:192:9:192:10 | l2 | main.rs:193:38:193:39 | l2 | provenance | | +| main.rs:183:29:183:36 | ...: usize | main.rs:202:48:202:48 | v | provenance | Sink:MaD:14 | +| main.rs:192:9:192:10 | l2 | main.rs:193:38:193:39 | l2 | provenance | Sink:MaD:12 | +| main.rs:192:9:192:10 | l2 | main.rs:194:45:194:46 | l2 | provenance | Sink:MaD:13 | +| main.rs:192:9:192:10 | l2 | main.rs:195:41:195:42 | l2 | provenance | Sink:MaD:7 | +| main.rs:192:9:192:10 | l2 | main.rs:196:48:196:49 | l2 | provenance | Sink:MaD:8 | +| main.rs:192:9:192:10 | l2 | main.rs:197:41:197:42 | l2 | provenance | Sink:MaD:1 | +| main.rs:192:9:192:10 | l2 | main.rs:198:48:198:49 | l2 | provenance | Sink:MaD:2 | +| main.rs:192:9:192:10 | l2 | main.rs:208:53:208:54 | l2 | provenance | Sink:MaD:9 | +| main.rs:192:9:192:10 | l2 | main.rs:210:60:210:61 | l2 | provenance | Sink:MaD:10 | +| main.rs:192:9:192:10 | l2 | main.rs:213:51:213:52 | l2 | provenance | Sink:MaD:11 | | main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | main.rs:192:14:192:56 | ... .unwrap() | provenance | MaD:41 | | main.rs:192:14:192:56 | ... .unwrap() | main.rs:192:9:192:10 | l2 | provenance | | | main.rs:192:46:192:46 | v | main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | -| main.rs:193:38:193:39 | l2 | main.rs:193:32:193:36 | alloc | provenance | MaD:12 Sink:MaD:12 | -| main.rs:193:38:193:39 | l2 | main.rs:194:45:194:46 | l2 | provenance | | -| main.rs:194:45:194:46 | l2 | main.rs:194:32:194:43 | alloc_zeroed | provenance | MaD:13 Sink:MaD:13 | -| main.rs:194:45:194:46 | l2 | main.rs:195:41:195:42 | l2 | provenance | | -| main.rs:195:41:195:42 | l2 | main.rs:195:32:195:39 | allocate | provenance | MaD:7 Sink:MaD:7 | -| main.rs:195:41:195:42 | l2 | main.rs:196:48:196:49 | l2 | provenance | | -| main.rs:196:48:196:49 | l2 | main.rs:196:32:196:46 | allocate_zeroed | provenance | MaD:8 Sink:MaD:8 | -| main.rs:196:48:196:49 | l2 | main.rs:197:41:197:42 | l2 | provenance | | -| main.rs:197:41:197:42 | l2 | main.rs:197:32:197:39 | allocate | provenance | MaD:1 Sink:MaD:1 | -| main.rs:197:41:197:42 | l2 | main.rs:198:48:198:49 | l2 | provenance | | -| main.rs:198:48:198:49 | l2 | main.rs:198:32:198:46 | allocate_zeroed | provenance | MaD:2 Sink:MaD:2 | -| main.rs:198:48:198:49 | l2 | main.rs:208:53:208:54 | l2 | provenance | | -| main.rs:198:48:198:49 | l2 | main.rs:210:60:210:61 | l2 | provenance | | -| main.rs:198:48:198:49 | l2 | main.rs:213:51:213:52 | l2 | provenance | | -| main.rs:202:48:202:48 | v | main.rs:202:32:202:38 | realloc | provenance | MaD:14 Sink:MaD:14 | -| main.rs:208:53:208:54 | l2 | main.rs:208:40:208:43 | grow | provenance | MaD:9 Sink:MaD:9 | -| main.rs:210:60:210:61 | l2 | main.rs:210:40:210:50 | grow_zeroed | provenance | MaD:10 Sink:MaD:10 | -| main.rs:213:51:213:52 | l2 | main.rs:213:36:213:41 | shrink | provenance | MaD:11 Sink:MaD:11 | -| main.rs:217:27:217:34 | ...: usize | main.rs:219:26:219:26 | v | provenance | | -| main.rs:219:26:219:26 | v | main.rs:219:13:219:24 | ...::malloc | provenance | MaD:20 Sink:MaD:20 | -| main.rs:219:26:219:26 | v | main.rs:220:36:220:36 | v | provenance | | -| main.rs:220:36:220:36 | v | main.rs:220:13:220:31 | ...::aligned_alloc | provenance | MaD:18 Sink:MaD:18 | -| main.rs:220:36:220:36 | v | main.rs:222:30:222:30 | v | provenance | | -| main.rs:222:30:222:30 | v | main.rs:222:13:222:24 | ...::calloc | provenance | MaD:19 Sink:MaD:19 | -| main.rs:222:30:222:30 | v | main.rs:223:26:223:26 | v | provenance | | -| main.rs:223:26:223:26 | v | main.rs:223:13:223:24 | ...::calloc | provenance | MaD:19 Sink:MaD:19 | -| main.rs:223:26:223:26 | v | main.rs:224:31:224:31 | v | provenance | | -| main.rs:224:31:224:31 | v | main.rs:224:13:224:25 | ...::realloc | provenance | MaD:21 Sink:MaD:21 | -| main.rs:227:24:227:31 | ...: usize | main.rs:228:43:228:43 | v | provenance | | -| main.rs:228:43:228:43 | v | main.rs:228:13:228:41 | ...::try_with_capacity | provenance | MaD:3 Sink:MaD:3 | -| main.rs:228:43:228:43 | v | main.rs:229:39:229:39 | v | provenance | | -| main.rs:229:39:229:39 | v | main.rs:229:13:229:37 | ...::with_capacity | provenance | MaD:5 Sink:MaD:5 | -| main.rs:229:39:229:39 | v | main.rs:230:46:230:46 | v | provenance | | -| main.rs:230:46:230:46 | v | main.rs:230:13:230:44 | ...::try_with_capacity_in | provenance | MaD:4 Sink:MaD:4 | -| main.rs:230:46:230:46 | v | main.rs:231:42:231:42 | v | provenance | | -| main.rs:231:42:231:42 | v | main.rs:231:13:231:40 | ...::with_capacity_in | provenance | MaD:6 Sink:MaD:6 | +| main.rs:217:27:217:34 | ...: usize | main.rs:219:26:219:26 | v | provenance | Sink:MaD:20 | +| main.rs:217:27:217:34 | ...: usize | main.rs:220:36:220:36 | v | provenance | Sink:MaD:18 | +| main.rs:217:27:217:34 | ...: usize | main.rs:222:30:222:30 | v | provenance | Sink:MaD:19 | +| main.rs:217:27:217:34 | ...: usize | main.rs:223:26:223:26 | v | provenance | Sink:MaD:19 | +| main.rs:217:27:217:34 | ...: usize | main.rs:224:31:224:31 | v | provenance | Sink:MaD:21 | +| main.rs:227:24:227:31 | ...: usize | main.rs:228:43:228:43 | v | provenance | Sink:MaD:3 | +| main.rs:227:24:227:31 | ...: usize | main.rs:229:39:229:39 | v | provenance | Sink:MaD:5 | +| main.rs:227:24:227:31 | ...: usize | main.rs:230:46:230:46 | v | provenance | Sink:MaD:4 | +| main.rs:227:24:227:31 | ...: usize | main.rs:231:42:231:42 | v | provenance | Sink:MaD:6 | | main.rs:282:24:282:41 | ...: String | main.rs:283:21:283:30 | user_input | provenance | | | main.rs:283:9:283:17 | num_bytes | main.rs:285:54:285:62 | num_bytes | provenance | | | main.rs:283:21:283:30 | user_input | main.rs:283:21:283:47 | user_input.parse() [Ok] | provenance | MaD:26 | | main.rs:283:21:283:47 | user_input.parse() [Ok] | main.rs:283:21:283:48 | TryExpr | provenance | | | main.rs:283:21:283:48 | TryExpr | main.rs:283:21:283:77 | ... * ... | provenance | MaD:25 | | main.rs:283:21:283:77 | ... * ... | main.rs:283:9:283:17 | num_bytes | provenance | | -| main.rs:285:9:285:14 | layout | main.rs:287:40:287:45 | layout | provenance | | +| main.rs:285:9:285:14 | layout | main.rs:287:40:287:45 | layout | provenance | Sink:MaD:15 | | main.rs:285:18:285:66 | ...::from_size_align(...) [Ok] | main.rs:285:18:285:75 | ... .unwrap() | provenance | MaD:41 | | main.rs:285:18:285:75 | ... .unwrap() | main.rs:285:9:285:14 | layout | provenance | | | main.rs:285:54:285:62 | num_bytes | main.rs:285:18:285:66 | ...::from_size_align(...) [Ok] | provenance | MaD:33 | -| main.rs:287:40:287:45 | layout | main.rs:287:22:287:38 | ...::alloc | provenance | MaD:15 Sink:MaD:15 | -| main.rs:311:25:311:38 | ...::args | main.rs:311:25:311:40 | ...::args(...) [element] | provenance | Src:MaD:22 | +| main.rs:311:25:311:40 | ...::args(...) | main.rs:311:25:311:40 | ...::args(...) [element] | provenance | Src:MaD:22 | | main.rs:311:25:311:40 | ...::args(...) [element] | main.rs:311:25:311:47 | ... .nth(...) [Some] | provenance | MaD:23 | | main.rs:311:25:311:47 | ... .nth(...) [Some] | main.rs:311:25:311:74 | ... .unwrap_or(...) | provenance | MaD:39 | | main.rs:311:25:311:74 | ... .unwrap_or(...) | main.rs:282:24:282:41 | ...: String | provenance | | -| main.rs:317:26:317:33 | ...: usize | main.rs:331:26:331:26 | a | provenance | | -| main.rs:331:26:331:26 | a | main.rs:331:13:331:24 | ...::malloc | provenance | MaD:20 Sink:MaD:20 | +| main.rs:317:26:317:33 | ...: usize | main.rs:331:26:331:26 | a | provenance | Sink:MaD:20 | | main.rs:339:9:339:9 | v | main.rs:342:34:342:34 | v | provenance | | | main.rs:339:9:339:9 | v | main.rs:343:42:343:42 | v | provenance | | | main.rs:339:9:339:9 | v | main.rs:344:36:344:36 | v | provenance | | @@ -280,7 +232,7 @@ edges | main.rs:339:9:339:9 | v | main.rs:346:25:346:25 | v | provenance | | | main.rs:339:9:339:9 | v | main.rs:347:22:347:22 | v | provenance | | | main.rs:339:9:339:9 | v | main.rs:349:24:349:24 | v | provenance | | -| main.rs:339:13:339:26 | ...::args | main.rs:339:13:339:28 | ...::args(...) [element] | provenance | Src:MaD:22 | +| main.rs:339:13:339:28 | ...::args(...) | main.rs:339:13:339:28 | ...::args(...) [element] | provenance | Src:MaD:22 | | main.rs:339:13:339:28 | ...::args(...) [element] | main.rs:339:13:339:35 | ... .nth(...) [Some] | provenance | MaD:23 | | main.rs:339:13:339:35 | ... .nth(...) [Some] | main.rs:339:13:339:65 | ... .unwrap_or(...) | provenance | MaD:39 | | main.rs:339:13:339:65 | ... .unwrap_or(...) | main.rs:339:13:339:82 | ... .parse() [Ok] | provenance | MaD:26 | @@ -339,35 +291,30 @@ models | 43 | Summary: core::cmp::min; Argument[0]; ReturnValue; value | nodes | main.rs:12:36:12:43 | ...: usize | semmle.label | ...: usize | -| main.rs:18:13:18:31 | ...::realloc | semmle.label | ...::realloc | | main.rs:18:41:18:41 | v | semmle.label | v | | main.rs:20:9:20:10 | l2 | semmle.label | l2 | | main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | semmle.label | ...::from_size_align(...) [Ok] | | main.rs:20:14:20:63 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:20:50:20:50 | v | semmle.label | v | -| main.rs:21:13:21:29 | ...::alloc | semmle.label | ...::alloc | | main.rs:21:31:21:32 | l2 | semmle.label | l2 | -| main.rs:22:13:22:29 | ...::alloc | semmle.label | ...::alloc | | main.rs:22:31:22:32 | l2 | semmle.label | l2 | | main.rs:22:31:22:44 | l2.align_to(...) [Ok] | semmle.label | l2.align_to(...) [Ok] | | main.rs:22:31:22:53 | ... .unwrap() | semmle.label | ... .unwrap() | -| main.rs:23:13:23:29 | ...::alloc | semmle.label | ...::alloc | +| main.rs:22:31:22:53 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:23:31:23:32 | l2 | semmle.label | l2 | | main.rs:23:31:23:44 | l2.align_to(...) [Ok] | semmle.label | l2.align_to(...) [Ok] | | main.rs:23:31:23:53 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:23:31:23:68 | ... .pad_to_align() | semmle.label | ... .pad_to_align() | -| main.rs:24:13:24:36 | ...::alloc_zeroed | semmle.label | ...::alloc_zeroed | +| main.rs:23:31:23:68 | ... .pad_to_align() | semmle.label | ... .pad_to_align() | | main.rs:24:38:24:39 | l2 | semmle.label | l2 | | main.rs:29:9:29:10 | l4 | semmle.label | l4 | | main.rs:29:14:29:64 | ...::from_size_align_unchecked(...) | semmle.label | ...::from_size_align_unchecked(...) | | main.rs:29:60:29:60 | v | semmle.label | v | -| main.rs:30:13:30:29 | ...::alloc | semmle.label | ...::alloc | | main.rs:30:31:30:32 | l4 | semmle.label | l4 | | main.rs:32:9:32:10 | l5 | semmle.label | l5 | | main.rs:32:14:32:118 | ...::from_size_align_unchecked(...) | semmle.label | ...::from_size_align_unchecked(...) | | main.rs:32:60:32:60 | v | semmle.label | v | | main.rs:32:60:32:89 | ... * ... | semmle.label | ... * ... | -| main.rs:33:13:33:29 | ...::alloc | semmle.label | ...::alloc | | main.rs:33:31:33:32 | l5 | semmle.label | l5 | | main.rs:35:9:35:10 | s6 | semmle.label | s6 | | main.rs:35:14:35:54 | ... + ... | semmle.label | ... + ... | @@ -376,33 +323,31 @@ nodes | main.rs:36:9:36:10 | l6 | semmle.label | l6 | | main.rs:36:14:36:65 | ...::from_size_align_unchecked(...) | semmle.label | ...::from_size_align_unchecked(...) | | main.rs:36:60:36:61 | s6 | semmle.label | s6 | -| main.rs:37:13:37:29 | ...::alloc | semmle.label | ...::alloc | | main.rs:37:31:37:32 | l6 | semmle.label | l6 | | main.rs:39:9:39:10 | l7 | semmle.label | l7 | | main.rs:39:14:39:72 | ...::from_size_align_unchecked(...) | semmle.label | ...::from_size_align_unchecked(...) | | main.rs:39:60:39:61 | l6 | semmle.label | l6 | | main.rs:39:60:39:68 | l6.size() | semmle.label | l6.size() | -| main.rs:40:13:40:29 | ...::alloc | semmle.label | ...::alloc | | main.rs:40:31:40:32 | l7 | semmle.label | l7 | | main.rs:43:44:43:51 | ...: usize | semmle.label | ...: usize | -| main.rs:50:13:50:29 | ...::alloc | semmle.label | ...::alloc | | main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | semmle.label | l2.repeat(...) [Ok, tuple.0] | | main.rs:50:31:50:51 | ... .unwrap() [tuple.0] | semmle.label | ... .unwrap() [tuple.0] | | main.rs:50:31:50:53 | ... .0 | semmle.label | ... .0 | +| main.rs:50:31:50:53 | ... .0 | semmle.label | ... .0 | | main.rs:50:41:50:41 | v | semmle.label | v | -| main.rs:51:13:51:29 | ...::alloc | semmle.label | ...::alloc | | main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | semmle.label | l2.repeat(...) [Ok, tuple.0] | | main.rs:51:31:51:55 | ... .unwrap() [tuple.0] | semmle.label | ... .unwrap() [tuple.0] | | main.rs:51:31:51:57 | ... .0 | semmle.label | ... .0 | +| main.rs:51:31:51:57 | ... .0 | semmle.label | ... .0 | | main.rs:51:41:51:41 | v | semmle.label | v | | main.rs:51:41:51:45 | ... + ... | semmle.label | ... + ... | -| main.rs:53:13:53:29 | ...::alloc | semmle.label | ...::alloc | | main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | semmle.label | l2.repeat_packed(...) [Ok] | | main.rs:53:31:53:58 | ... .unwrap() | semmle.label | ... .unwrap() | +| main.rs:53:31:53:58 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:53:48:53:48 | v | semmle.label | v | -| main.rs:54:13:54:29 | ...::alloc | semmle.label | ...::alloc | | main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | semmle.label | l2.repeat_packed(...) [Ok] | | main.rs:54:31:54:63 | ... .unwrap() | semmle.label | ... .unwrap() | +| main.rs:54:31:54:63 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:54:48:54:48 | v | semmle.label | v | | main.rs:54:48:54:53 | ... * ... | semmle.label | ... * ... | | main.rs:58:9:58:20 | TuplePat [tuple.0] | semmle.label | TuplePat [tuple.0] | @@ -410,139 +355,103 @@ nodes | main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | semmle.label | l3.repeat(...) [Ok, tuple.0] | | main.rs:58:24:58:66 | ... .expect(...) [tuple.0] | semmle.label | ... .expect(...) [tuple.0] | | main.rs:58:34:58:34 | v | semmle.label | v | -| main.rs:59:13:59:29 | ...::alloc | semmle.label | ...::alloc | | main.rs:59:31:59:32 | k1 | semmle.label | k1 | | main.rs:60:9:60:20 | TuplePat [tuple.0] | semmle.label | TuplePat [tuple.0] | | main.rs:60:10:60:11 | k2 | semmle.label | k2 | | main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | semmle.label | l3.extend(...) [Ok, tuple.0] | | main.rs:60:24:60:45 | ... .unwrap() [tuple.0] | semmle.label | ... .unwrap() [tuple.0] | | main.rs:60:34:60:35 | k1 | semmle.label | k1 | -| main.rs:61:13:61:29 | ...::alloc | semmle.label | ...::alloc | | main.rs:61:31:61:32 | k2 | semmle.label | k2 | | main.rs:62:9:62:20 | TuplePat [tuple.0] | semmle.label | TuplePat [tuple.0] | | main.rs:62:10:62:11 | k3 | semmle.label | k3 | | main.rs:62:24:62:25 | k1 | semmle.label | k1 | | main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | semmle.label | k1.extend(...) [Ok, tuple.0] | | main.rs:62:24:62:45 | ... .unwrap() [tuple.0] | semmle.label | ... .unwrap() [tuple.0] | -| main.rs:63:13:63:29 | ...::alloc | semmle.label | ...::alloc | | main.rs:63:31:63:32 | k3 | semmle.label | k3 | -| main.rs:64:13:64:29 | ...::alloc | semmle.label | ...::alloc | | main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | semmle.label | l3.extend_packed(...) [Ok] | | main.rs:64:31:64:59 | ... .unwrap() | semmle.label | ... .unwrap() | +| main.rs:64:31:64:59 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:64:48:64:49 | k1 | semmle.label | k1 | -| main.rs:65:13:65:29 | ...::alloc | semmle.label | ...::alloc | | main.rs:65:31:65:32 | k1 | semmle.label | k1 | | main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | semmle.label | k1.extend_packed(...) [Ok] | | main.rs:65:31:65:59 | ... .unwrap() | semmle.label | ... .unwrap() | +| main.rs:65:31:65:59 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:67:9:67:10 | l4 | semmle.label | l4 | | main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | semmle.label | ...::array::<...>(...) [Ok] | | main.rs:67:14:67:56 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:67:46:67:46 | v | semmle.label | v | -| main.rs:68:13:68:29 | ...::alloc | semmle.label | ...::alloc | | main.rs:68:31:68:32 | l4 | semmle.label | l4 | | main.rs:86:35:86:42 | ...: usize | semmle.label | ...: usize | | main.rs:87:9:87:14 | layout | semmle.label | layout | | main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | semmle.label | ...::from_size_align(...) [Ok] | | main.rs:87:18:87:67 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:87:54:87:54 | v | semmle.label | v | -| main.rs:88:13:88:29 | ...::alloc | semmle.label | ...::alloc | | main.rs:88:31:88:36 | layout | semmle.label | layout | | main.rs:91:38:91:45 | ...: usize | semmle.label | ...: usize | | main.rs:92:9:92:10 | l1 | semmle.label | l1 | | main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | semmle.label | ...::array::<...>(...) [Ok] | | main.rs:92:14:92:57 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:92:47:92:47 | v | semmle.label | v | -| main.rs:96:17:96:33 | ...::alloc | semmle.label | ...::alloc | | main.rs:96:35:96:36 | l1 | semmle.label | l1 | | main.rs:101:13:101:14 | l3 | semmle.label | l3 | | main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | semmle.label | ...::array::<...>(...) [Ok] | | main.rs:101:18:101:61 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:101:51:101:51 | v | semmle.label | v | -| main.rs:102:17:102:33 | ...::alloc | semmle.label | ...::alloc | | main.rs:102:35:102:36 | l1 | semmle.label | l1 | -| main.rs:103:17:103:33 | ...::alloc | semmle.label | ...::alloc | | main.rs:103:35:103:36 | l3 | semmle.label | l3 | | main.rs:105:33:105:33 | v | semmle.label | v | -| main.rs:109:17:109:33 | ...::alloc | semmle.label | ...::alloc | | main.rs:109:35:109:36 | l1 | semmle.label | l1 | -| main.rs:111:17:111:33 | ...::alloc | semmle.label | ...::alloc | | main.rs:111:35:111:36 | l1 | semmle.label | l1 | | main.rs:145:13:145:14 | l9 | semmle.label | l9 | | main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | semmle.label | ...::array::<...>(...) [Ok] | | main.rs:145:18:145:61 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:145:51:145:51 | v | semmle.label | v | -| main.rs:146:17:146:33 | ...::alloc | semmle.label | ...::alloc | | main.rs:146:35:146:36 | l1 | semmle.label | l1 | -| main.rs:148:17:148:33 | ...::alloc | semmle.label | ...::alloc | | main.rs:148:35:148:36 | l9 | semmle.label | l9 | | main.rs:151:9:151:11 | l10 | semmle.label | l10 | | main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | semmle.label | ...::array::<...>(...) [Ok] | | main.rs:151:15:151:78 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:151:48:151:68 | ...::min(...) | semmle.label | ...::min(...) | | main.rs:151:62:151:62 | v | semmle.label | v | -| main.rs:152:13:152:29 | ...::alloc | semmle.label | ...::alloc | | main.rs:152:31:152:33 | l10 | semmle.label | l10 | | main.rs:154:9:154:11 | l11 | semmle.label | l11 | | main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | semmle.label | ...::array::<...>(...) [Ok] | | main.rs:154:15:154:78 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:154:48:154:68 | ...::max(...) | semmle.label | ...::max(...) | | main.rs:154:62:154:62 | v | semmle.label | v | -| main.rs:155:13:155:29 | ...::alloc | semmle.label | ...::alloc | | main.rs:155:31:155:33 | l11 | semmle.label | l11 | | main.rs:161:13:161:15 | l13 | semmle.label | l13 | | main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | semmle.label | ...::from_size_align(...) [Ok] | | main.rs:161:19:161:68 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:161:55:161:55 | v | semmle.label | v | -| main.rs:162:17:162:33 | ...::alloc | semmle.label | ...::alloc | | main.rs:162:35:162:37 | l13 | semmle.label | l13 | -| main.rs:169:17:169:33 | ...::alloc | semmle.label | ...::alloc | | main.rs:169:35:169:37 | l13 | semmle.label | l13 | -| main.rs:177:13:177:29 | ...::alloc | semmle.label | ...::alloc | | main.rs:177:31:177:32 | l1 | semmle.label | l1 | | main.rs:183:29:183:36 | ...: usize | semmle.label | ...: usize | | main.rs:192:9:192:10 | l2 | semmle.label | l2 | | main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | semmle.label | ...::array::<...>(...) [Ok] | | main.rs:192:14:192:56 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:192:46:192:46 | v | semmle.label | v | -| main.rs:193:32:193:36 | alloc | semmle.label | alloc | | main.rs:193:38:193:39 | l2 | semmle.label | l2 | -| main.rs:194:32:194:43 | alloc_zeroed | semmle.label | alloc_zeroed | | main.rs:194:45:194:46 | l2 | semmle.label | l2 | -| main.rs:195:32:195:39 | allocate | semmle.label | allocate | | main.rs:195:41:195:42 | l2 | semmle.label | l2 | -| main.rs:196:32:196:46 | allocate_zeroed | semmle.label | allocate_zeroed | | main.rs:196:48:196:49 | l2 | semmle.label | l2 | -| main.rs:197:32:197:39 | allocate | semmle.label | allocate | | main.rs:197:41:197:42 | l2 | semmle.label | l2 | -| main.rs:198:32:198:46 | allocate_zeroed | semmle.label | allocate_zeroed | | main.rs:198:48:198:49 | l2 | semmle.label | l2 | -| main.rs:202:32:202:38 | realloc | semmle.label | realloc | | main.rs:202:48:202:48 | v | semmle.label | v | -| main.rs:208:40:208:43 | grow | semmle.label | grow | | main.rs:208:53:208:54 | l2 | semmle.label | l2 | -| main.rs:210:40:210:50 | grow_zeroed | semmle.label | grow_zeroed | | main.rs:210:60:210:61 | l2 | semmle.label | l2 | -| main.rs:213:36:213:41 | shrink | semmle.label | shrink | | main.rs:213:51:213:52 | l2 | semmle.label | l2 | | main.rs:217:27:217:34 | ...: usize | semmle.label | ...: usize | -| main.rs:219:13:219:24 | ...::malloc | semmle.label | ...::malloc | | main.rs:219:26:219:26 | v | semmle.label | v | -| main.rs:220:13:220:31 | ...::aligned_alloc | semmle.label | ...::aligned_alloc | | main.rs:220:36:220:36 | v | semmle.label | v | -| main.rs:222:13:222:24 | ...::calloc | semmle.label | ...::calloc | | main.rs:222:30:222:30 | v | semmle.label | v | -| main.rs:223:13:223:24 | ...::calloc | semmle.label | ...::calloc | | main.rs:223:26:223:26 | v | semmle.label | v | -| main.rs:224:13:224:25 | ...::realloc | semmle.label | ...::realloc | | main.rs:224:31:224:31 | v | semmle.label | v | | main.rs:227:24:227:31 | ...: usize | semmle.label | ...: usize | -| main.rs:228:13:228:41 | ...::try_with_capacity | semmle.label | ...::try_with_capacity | | main.rs:228:43:228:43 | v | semmle.label | v | -| main.rs:229:13:229:37 | ...::with_capacity | semmle.label | ...::with_capacity | | main.rs:229:39:229:39 | v | semmle.label | v | -| main.rs:230:13:230:44 | ...::try_with_capacity_in | semmle.label | ...::try_with_capacity_in | | main.rs:230:46:230:46 | v | semmle.label | v | -| main.rs:231:13:231:40 | ...::with_capacity_in | semmle.label | ...::with_capacity_in | | main.rs:231:42:231:42 | v | semmle.label | v | | main.rs:282:24:282:41 | ...: String | semmle.label | ...: String | | main.rs:283:9:283:17 | num_bytes | semmle.label | num_bytes | @@ -554,17 +463,15 @@ nodes | main.rs:285:18:285:66 | ...::from_size_align(...) [Ok] | semmle.label | ...::from_size_align(...) [Ok] | | main.rs:285:18:285:75 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:285:54:285:62 | num_bytes | semmle.label | num_bytes | -| main.rs:287:22:287:38 | ...::alloc | semmle.label | ...::alloc | | main.rs:287:40:287:45 | layout | semmle.label | layout | -| main.rs:311:25:311:38 | ...::args | semmle.label | ...::args | +| main.rs:311:25:311:40 | ...::args(...) | semmle.label | ...::args(...) | | main.rs:311:25:311:40 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | | main.rs:311:25:311:47 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | | main.rs:311:25:311:74 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | | main.rs:317:26:317:33 | ...: usize | semmle.label | ...: usize | -| main.rs:331:13:331:24 | ...::malloc | semmle.label | ...::malloc | | main.rs:331:26:331:26 | a | semmle.label | a | | main.rs:339:9:339:9 | v | semmle.label | v | -| main.rs:339:13:339:26 | ...::args | semmle.label | ...::args | +| main.rs:339:13:339:28 | ...::args(...) | semmle.label | ...::args(...) | | main.rs:339:13:339:28 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | | main.rs:339:13:339:35 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | | main.rs:339:13:339:65 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index f3dfe9220a47..f350a8a4434f 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -1,15 +1,15 @@ #select -| test_cipher.rs:18:29:18:36 | [0u8; 16] | test_cipher.rs:18:29:18:36 | [0u8; 16] | test_cipher.rs:19:30:19:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:19:30:19:47 | ...::new | a key | -| test_cipher.rs:25:29:25:36 | [0u8; 16] | test_cipher.rs:25:29:25:36 | [0u8; 16] | test_cipher.rs:26:30:26:40 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:26:30:26:40 | ...::new | a key | -| test_cipher.rs:29:29:29:36 | [0u8; 16] | test_cipher.rs:29:29:29:36 | [0u8; 16] | test_cipher.rs:30:30:30:40 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:30:30:30:40 | ...::new | an initialization vector | -| test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:38:30:38:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:38:30:38:47 | ...::new | a key | -| test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:42:30:42:47 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:42:30:42:47 | ...::new | a key | -| test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:51:31:51:48 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:51:31:51:48 | ...::new | a key | -| test_cipher.rs:73:19:73:26 | [0u8; 32] | test_cipher.rs:73:19:73:26 | [0u8; 32] | test_cipher.rs:74:23:74:44 | ...::new_from_slice | This hard-coded value is used as $@. | test_cipher.rs:74:23:74:44 | ...::new_from_slice | a key | -| test_cookie.rs:17:28:17:34 | [0; 64] | test_cookie.rs:17:28:17:34 | [0; 64] | test_cookie.rs:18:16:18:24 | ...::from | This hard-coded value is used as $@. | test_cookie.rs:18:16:18:24 | ...::from | a key | -| test_cookie.rs:21:28:21:34 | [0; 64] | test_cookie.rs:21:28:21:34 | [0; 64] | test_cookie.rs:22:16:22:24 | ...::from | This hard-coded value is used as $@. | test_cookie.rs:22:16:22:24 | ...::from | a key | -| test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:42:14:42:32 | ...::from | This hard-coded value is used as $@. | test_cookie.rs:42:14:42:32 | ...::from | a key | -| test_cookie.rs:49:23:49:25 | 0u8 | test_cookie.rs:49:23:49:25 | 0u8 | test_cookie.rs:53:14:53:32 | ...::from | This hard-coded value is used as $@. | test_cookie.rs:53:14:53:32 | ...::from | a key | +| test_cipher.rs:18:29:18:36 | [0u8; 16] | test_cipher.rs:18:29:18:36 | [0u8; 16] | test_cipher.rs:19:49:19:79 | ...::from_slice(...) | This hard-coded value is used as $@. | test_cipher.rs:19:49:19:79 | ...::from_slice(...) | a key | +| test_cipher.rs:25:29:25:36 | [0u8; 16] | test_cipher.rs:25:29:25:36 | [0u8; 16] | test_cipher.rs:26:42:26:72 | ...::from_slice(...) | This hard-coded value is used as $@. | test_cipher.rs:26:42:26:72 | ...::from_slice(...) | a key | +| test_cipher.rs:29:29:29:36 | [0u8; 16] | test_cipher.rs:29:29:29:36 | [0u8; 16] | test_cipher.rs:30:72:30:101 | ...::from_slice(...) | This hard-coded value is used as $@. | test_cipher.rs:30:72:30:101 | ...::from_slice(...) | an initialization vector | +| test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) | This hard-coded value is used as $@. | test_cipher.rs:38:49:38:80 | ...::from_slice(...) | a key | +| test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) | This hard-coded value is used as $@. | test_cipher.rs:42:49:42:79 | ...::from_slice(...) | a key | +| test_cipher.rs:50:37:50:54 | ...::zeroed(...) | test_cipher.rs:50:37:50:54 | ...::zeroed(...) | test_cipher.rs:51:50:51:82 | ...::from_slice(...) | This hard-coded value is used as $@. | test_cipher.rs:51:50:51:82 | ...::from_slice(...) | a key | +| test_cipher.rs:73:19:73:26 | [0u8; 32] | test_cipher.rs:73:19:73:26 | [0u8; 32] | test_cipher.rs:74:46:74:51 | const2 | This hard-coded value is used as $@. | test_cipher.rs:74:46:74:51 | const2 | a key | +| test_cookie.rs:17:28:17:34 | [0; 64] | test_cookie.rs:17:28:17:34 | [0; 64] | test_cookie.rs:18:26:18:32 | &array1 | This hard-coded value is used as $@. | test_cookie.rs:18:26:18:32 | &array1 | a key | +| test_cookie.rs:21:28:21:34 | [0; 64] | test_cookie.rs:21:28:21:34 | [0; 64] | test_cookie.rs:22:26:22:32 | &array2 | This hard-coded value is used as $@. | test_cookie.rs:22:26:22:32 | &array2 | a key | +| test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:42:34:42:39 | array2 | This hard-coded value is used as $@. | test_cookie.rs:42:34:42:39 | array2 | a key | +| test_cookie.rs:49:23:49:25 | 0u8 | test_cookie.rs:49:23:49:25 | 0u8 | test_cookie.rs:53:34:53:39 | array3 | This hard-coded value is used as $@. | test_cookie.rs:53:34:53:39 | array3 | a key | | test_heuristic.rs:38:25:38:30 | 0xFFFF | test_heuristic.rs:38:25:38:30 | 0xFFFF | test_heuristic.rs:81:22:81:31 | MY_CONST_1 | This hard-coded value is used as $@. | test_heuristic.rs:81:22:81:31 | MY_CONST_1 | a salt | | test_heuristic.rs:39:25:39:59 | ... as u64 | test_heuristic.rs:39:25:39:59 | ... as u64 | test_heuristic.rs:82:22:82:31 | MY_CONST_2 | This hard-coded value is used as $@. | test_heuristic.rs:82:22:82:31 | MY_CONST_2 | a salt | | test_heuristic.rs:40:27:40:32 | 0xFFFF | test_heuristic.rs:40:27:40:32 | 0xFFFF | test_heuristic.rs:83:22:83:32 | MY_STATIC_3 | This hard-coded value is used as $@. | test_heuristic.rs:83:22:83:32 | MY_STATIC_3 | a salt | @@ -27,58 +27,54 @@ edges | test_cipher.rs:18:9:18:14 | const1 [&ref] | test_cipher.rs:19:73:19:78 | const1 [&ref] | provenance | | | test_cipher.rs:18:28:18:36 | &... [&ref] | test_cipher.rs:18:9:18:14 | const1 [&ref] | provenance | | | test_cipher.rs:18:29:18:36 | [0u8; 16] | test_cipher.rs:18:28:18:36 | &... [&ref] | provenance | | -| test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref] | test_cipher.rs:19:30:19:47 | ...::new | provenance | MaD:3 Sink:MaD:3 | +| test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref] | test_cipher.rs:19:49:19:79 | ...::from_slice(...) | provenance | Sink:MaD:3 | | test_cipher.rs:19:73:19:78 | const1 [&ref] | test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref] | provenance | MaD:13 | | test_cipher.rs:25:9:25:14 | const4 [&ref] | test_cipher.rs:26:66:26:71 | const4 [&ref] | provenance | | | test_cipher.rs:25:28:25:36 | &... [&ref] | test_cipher.rs:25:9:25:14 | const4 [&ref] | provenance | | | test_cipher.rs:25:29:25:36 | [0u8; 16] | test_cipher.rs:25:28:25:36 | &... [&ref] | provenance | | -| test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref] | test_cipher.rs:26:30:26:40 | ...::new | provenance | MaD:4 Sink:MaD:4 | +| test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref] | test_cipher.rs:26:42:26:72 | ...::from_slice(...) | provenance | Sink:MaD:4 | | test_cipher.rs:26:66:26:71 | const4 [&ref] | test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref] | provenance | MaD:13 | | test_cipher.rs:29:9:29:14 | const5 [&ref] | test_cipher.rs:30:95:30:100 | const5 [&ref] | provenance | | | test_cipher.rs:29:28:29:36 | &... [&ref] | test_cipher.rs:29:9:29:14 | const5 [&ref] | provenance | | | test_cipher.rs:29:29:29:36 | [0u8; 16] | test_cipher.rs:29:28:29:36 | &... [&ref] | provenance | | -| test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref] | test_cipher.rs:30:30:30:40 | ...::new | provenance | MaD:5 Sink:MaD:5 | +| test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref] | test_cipher.rs:30:72:30:101 | ...::from_slice(...) | provenance | Sink:MaD:5 | | test_cipher.rs:30:95:30:100 | const5 [&ref] | test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref] | provenance | MaD:13 | | test_cipher.rs:37:9:37:14 | const7 | test_cipher.rs:38:74:38:79 | const7 | provenance | | | test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:37:9:37:14 | const7 | provenance | | -| test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | test_cipher.rs:38:30:38:47 | ...::new | provenance | MaD:3 Sink:MaD:3 | +| test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) | provenance | Sink:MaD:3 | | test_cipher.rs:38:73:38:79 | &const7 [&ref] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | provenance | MaD:13 | | test_cipher.rs:38:74:38:79 | const7 | test_cipher.rs:38:73:38:79 | &const7 [&ref] | provenance | | | test_cipher.rs:41:9:41:14 | const8 [&ref] | test_cipher.rs:42:73:42:78 | const8 [&ref] | provenance | | | test_cipher.rs:41:28:41:76 | &... [&ref] | test_cipher.rs:41:9:41:14 | const8 [&ref] | provenance | | | test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:41:28:41:76 | &... [&ref] | provenance | | -| test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | test_cipher.rs:42:30:42:47 | ...::new | provenance | MaD:3 Sink:MaD:3 | +| test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) | provenance | Sink:MaD:3 | | test_cipher.rs:42:73:42:78 | const8 [&ref] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | provenance | MaD:13 | | test_cipher.rs:50:9:50:15 | const10 [element] | test_cipher.rs:51:75:51:81 | const10 [element] | provenance | | -| test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:50:37:50:54 | ...::zeroed(...) [element] | provenance | Src:MaD:7 | -| test_cipher.rs:50:37:50:54 | ...::zeroed(...) [element] | test_cipher.rs:50:9:50:15 | const10 [element] | provenance | | -| test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | test_cipher.rs:51:31:51:48 | ...::new | provenance | MaD:3 Sink:MaD:3 Sink:MaD:3 | +| test_cipher.rs:50:37:50:54 | ...::zeroed(...) | test_cipher.rs:50:9:50:15 | const10 [element] | provenance | Src:MaD:7 | +| test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | test_cipher.rs:51:50:51:82 | ...::from_slice(...) | provenance | Sink:MaD:3 Sink:MaD:3 | | test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | provenance | MaD:13 | | test_cipher.rs:51:75:51:81 | const10 [element] | test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | provenance | | -| test_cipher.rs:73:9:73:14 | const2 [&ref] | test_cipher.rs:74:46:74:51 | const2 [&ref] | provenance | | +| test_cipher.rs:73:9:73:14 | const2 [&ref] | test_cipher.rs:74:46:74:51 | const2 | provenance | Sink:MaD:1 | | test_cipher.rs:73:18:73:26 | &... [&ref] | test_cipher.rs:73:9:73:14 | const2 [&ref] | provenance | | | test_cipher.rs:73:19:73:26 | [0u8; 32] | test_cipher.rs:73:18:73:26 | &... [&ref] | provenance | | -| test_cipher.rs:74:46:74:51 | const2 [&ref] | test_cipher.rs:74:23:74:44 | ...::new_from_slice | provenance | MaD:1 Sink:MaD:1 | | test_cookie.rs:17:9:17:14 | array1 | test_cookie.rs:18:27:18:32 | array1 | provenance | | | test_cookie.rs:17:28:17:34 | [0; 64] | test_cookie.rs:17:9:17:14 | array1 | provenance | | -| test_cookie.rs:18:26:18:32 | &array1 [&ref] | test_cookie.rs:18:16:18:24 | ...::from | provenance | MaD:6 Sink:MaD:6 | +| test_cookie.rs:18:26:18:32 | &array1 [&ref] | test_cookie.rs:18:26:18:32 | &array1 | provenance | Sink:MaD:6 | | test_cookie.rs:18:27:18:32 | array1 | test_cookie.rs:18:26:18:32 | &array1 [&ref] | provenance | | | test_cookie.rs:21:9:21:14 | array2 | test_cookie.rs:22:27:22:32 | array2 | provenance | | | test_cookie.rs:21:28:21:34 | [0; 64] | test_cookie.rs:21:9:21:14 | array2 | provenance | | -| test_cookie.rs:22:26:22:32 | &array2 [&ref] | test_cookie.rs:22:16:22:24 | ...::from | provenance | MaD:6 Sink:MaD:6 | +| test_cookie.rs:22:26:22:32 | &array2 [&ref] | test_cookie.rs:22:26:22:32 | &array2 | provenance | Sink:MaD:6 | | test_cookie.rs:22:27:22:32 | array2 | test_cookie.rs:22:26:22:32 | &array2 [&ref] | provenance | | -| test_cookie.rs:38:9:38:14 | array2 | test_cookie.rs:42:34:42:39 | array2 | provenance | | +| test_cookie.rs:38:9:38:14 | array2 | test_cookie.rs:42:34:42:39 | array2 | provenance | Sink:MaD:2 | | test_cookie.rs:38:18:38:37 | ...::from(...) | test_cookie.rs:38:9:38:14 | array2 | provenance | | | test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:38:18:38:37 | ...::from(...) | provenance | MaD:8 | | test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:38:18:38:37 | ...::from(...) | provenance | MaD:9 | | test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:38:18:38:37 | ...::from(...) | provenance | MaD:10 | | test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:38:18:38:37 | ...::from(...) | provenance | MaD:11 | | test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:38:18:38:37 | ...::from(...) | provenance | MaD:12 | -| test_cookie.rs:42:34:42:39 | array2 | test_cookie.rs:42:14:42:32 | ...::from | provenance | MaD:2 Sink:MaD:2 | -| test_cookie.rs:49:9:49:14 | array3 [element] | test_cookie.rs:53:34:53:39 | array3 [element] | provenance | | +| test_cookie.rs:49:9:49:14 | array3 [element] | test_cookie.rs:53:34:53:39 | array3 | provenance | Sink:MaD:2 | | test_cookie.rs:49:23:49:25 | 0u8 | test_cookie.rs:49:23:49:29 | ...::from_elem(...) [element] | provenance | MaD:14 | | test_cookie.rs:49:23:49:29 | ...::from_elem(...) [element] | test_cookie.rs:49:9:49:14 | array3 [element] | provenance | | -| test_cookie.rs:53:34:53:39 | array3 [element] | test_cookie.rs:53:14:53:32 | ...::from | provenance | MaD:2 Sink:MaD:2 | | test_heuristic.rs:38:25:38:30 | 0xFFFF | test_heuristic.rs:81:22:81:31 | MY_CONST_1 | provenance | | | test_heuristic.rs:39:25:39:59 | ... as u64 | test_heuristic.rs:82:22:82:31 | MY_CONST_2 | provenance | | | test_heuristic.rs:39:62:40:33 | static MY_STATIC_3 | test_heuristic.rs:83:22:83:32 | MY_STATIC_3 | provenance | | @@ -109,65 +105,61 @@ nodes | test_cipher.rs:18:9:18:14 | const1 [&ref] | semmle.label | const1 [&ref] | | test_cipher.rs:18:28:18:36 | &... [&ref] | semmle.label | &... [&ref] | | test_cipher.rs:18:29:18:36 | [0u8; 16] | semmle.label | [0u8; 16] | -| test_cipher.rs:19:30:19:47 | ...::new | semmle.label | ...::new | +| test_cipher.rs:19:49:19:79 | ...::from_slice(...) | semmle.label | ...::from_slice(...) | | test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref] | semmle.label | ...::from_slice(...) [&ref] | | test_cipher.rs:19:73:19:78 | const1 [&ref] | semmle.label | const1 [&ref] | | test_cipher.rs:25:9:25:14 | const4 [&ref] | semmle.label | const4 [&ref] | | test_cipher.rs:25:28:25:36 | &... [&ref] | semmle.label | &... [&ref] | | test_cipher.rs:25:29:25:36 | [0u8; 16] | semmle.label | [0u8; 16] | -| test_cipher.rs:26:30:26:40 | ...::new | semmle.label | ...::new | +| test_cipher.rs:26:42:26:72 | ...::from_slice(...) | semmle.label | ...::from_slice(...) | | test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref] | semmle.label | ...::from_slice(...) [&ref] | | test_cipher.rs:26:66:26:71 | const4 [&ref] | semmle.label | const4 [&ref] | | test_cipher.rs:29:9:29:14 | const5 [&ref] | semmle.label | const5 [&ref] | | test_cipher.rs:29:28:29:36 | &... [&ref] | semmle.label | &... [&ref] | | test_cipher.rs:29:29:29:36 | [0u8; 16] | semmle.label | [0u8; 16] | -| test_cipher.rs:30:30:30:40 | ...::new | semmle.label | ...::new | +| test_cipher.rs:30:72:30:101 | ...::from_slice(...) | semmle.label | ...::from_slice(...) | | test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref] | semmle.label | ...::from_slice(...) [&ref] | | test_cipher.rs:30:95:30:100 | const5 [&ref] | semmle.label | const5 [&ref] | | test_cipher.rs:37:9:37:14 | const7 | semmle.label | const7 | | test_cipher.rs:37:27:37:74 | [...] | semmle.label | [...] | -| test_cipher.rs:38:30:38:47 | ...::new | semmle.label | ...::new | +| test_cipher.rs:38:49:38:80 | ...::from_slice(...) | semmle.label | ...::from_slice(...) | | test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | semmle.label | ...::from_slice(...) [&ref] | | test_cipher.rs:38:73:38:79 | &const7 [&ref] | semmle.label | &const7 [&ref] | | test_cipher.rs:38:74:38:79 | const7 | semmle.label | const7 | | test_cipher.rs:41:9:41:14 | const8 [&ref] | semmle.label | const8 [&ref] | | test_cipher.rs:41:28:41:76 | &... [&ref] | semmle.label | &... [&ref] | | test_cipher.rs:41:29:41:76 | [...] | semmle.label | [...] | -| test_cipher.rs:42:30:42:47 | ...::new | semmle.label | ...::new | +| test_cipher.rs:42:49:42:79 | ...::from_slice(...) | semmle.label | ...::from_slice(...) | | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | semmle.label | ...::from_slice(...) [&ref] | | test_cipher.rs:42:73:42:78 | const8 [&ref] | semmle.label | const8 [&ref] | | test_cipher.rs:50:9:50:15 | const10 [element] | semmle.label | const10 [element] | -| test_cipher.rs:50:37:50:52 | ...::zeroed | semmle.label | ...::zeroed | -| test_cipher.rs:50:37:50:54 | ...::zeroed(...) [element] | semmle.label | ...::zeroed(...) [element] | -| test_cipher.rs:51:31:51:48 | ...::new | semmle.label | ...::new | +| test_cipher.rs:50:37:50:54 | ...::zeroed(...) | semmle.label | ...::zeroed(...) | +| test_cipher.rs:51:50:51:82 | ...::from_slice(...) | semmle.label | ...::from_slice(...) | | test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | semmle.label | ...::from_slice(...) [&ref, element] | | test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | semmle.label | &const10 [&ref, element] | | test_cipher.rs:51:75:51:81 | const10 [element] | semmle.label | const10 [element] | | test_cipher.rs:73:9:73:14 | const2 [&ref] | semmle.label | const2 [&ref] | | test_cipher.rs:73:18:73:26 | &... [&ref] | semmle.label | &... [&ref] | | test_cipher.rs:73:19:73:26 | [0u8; 32] | semmle.label | [0u8; 32] | -| test_cipher.rs:74:23:74:44 | ...::new_from_slice | semmle.label | ...::new_from_slice | -| test_cipher.rs:74:46:74:51 | const2 [&ref] | semmle.label | const2 [&ref] | +| test_cipher.rs:74:46:74:51 | const2 | semmle.label | const2 | | test_cookie.rs:17:9:17:14 | array1 | semmle.label | array1 | | test_cookie.rs:17:28:17:34 | [0; 64] | semmle.label | [0; 64] | -| test_cookie.rs:18:16:18:24 | ...::from | semmle.label | ...::from | +| test_cookie.rs:18:26:18:32 | &array1 | semmle.label | &array1 | | test_cookie.rs:18:26:18:32 | &array1 [&ref] | semmle.label | &array1 [&ref] | | test_cookie.rs:18:27:18:32 | array1 | semmle.label | array1 | | test_cookie.rs:21:9:21:14 | array2 | semmle.label | array2 | | test_cookie.rs:21:28:21:34 | [0; 64] | semmle.label | [0; 64] | -| test_cookie.rs:22:16:22:24 | ...::from | semmle.label | ...::from | +| test_cookie.rs:22:26:22:32 | &array2 | semmle.label | &array2 | | test_cookie.rs:22:26:22:32 | &array2 [&ref] | semmle.label | &array2 [&ref] | | test_cookie.rs:22:27:22:32 | array2 | semmle.label | array2 | | test_cookie.rs:38:9:38:14 | array2 | semmle.label | array2 | | test_cookie.rs:38:18:38:37 | ...::from(...) | semmle.label | ...::from(...) | | test_cookie.rs:38:28:38:36 | [0u8; 64] | semmle.label | [0u8; 64] | -| test_cookie.rs:42:14:42:32 | ...::from | semmle.label | ...::from | | test_cookie.rs:42:34:42:39 | array2 | semmle.label | array2 | | test_cookie.rs:49:9:49:14 | array3 [element] | semmle.label | array3 [element] | | test_cookie.rs:49:23:49:25 | 0u8 | semmle.label | 0u8 | | test_cookie.rs:49:23:49:29 | ...::from_elem(...) [element] | semmle.label | ...::from_elem(...) [element] | -| test_cookie.rs:53:14:53:32 | ...::from | semmle.label | ...::from | -| test_cookie.rs:53:34:53:39 | array3 [element] | semmle.label | array3 [element] | +| test_cookie.rs:53:34:53:39 | array3 | semmle.label | array3 | | test_heuristic.rs:38:25:38:30 | 0xFFFF | semmle.label | 0xFFFF | | test_heuristic.rs:39:25:39:59 | ... as u64 | semmle.label | ... as u64 | | test_heuristic.rs:39:62:40:33 | static MY_STATIC_3 | semmle.label | static MY_STATIC_3 | diff --git a/rust/ql/test/query-tests/security/CWE-825/AccessInvalidPointer.expected b/rust/ql/test/query-tests/security/CWE-825/AccessInvalidPointer.expected index d3b5456063ff..f825c0ad5985 100644 --- a/rust/ql/test/query-tests/security/CWE-825/AccessInvalidPointer.expected +++ b/rust/ql/test/query-tests/security/CWE-825/AccessInvalidPointer.expected @@ -1,87 +1,70 @@ #select -| deallocation.rs:26:15:26:16 | m1 | deallocation.rs:20:3:20:21 | ...::dealloc | deallocation.rs:26:15:26:16 | m1 | This operation dereferences a pointer that may be $@. | deallocation.rs:20:3:20:21 | ...::dealloc | invalid | -| deallocation.rs:37:14:37:33 | ...::read::<...> | deallocation.rs:20:3:20:21 | ...::dealloc | deallocation.rs:37:14:37:33 | ...::read::<...> | This operation dereferences a pointer that may be $@. | deallocation.rs:20:3:20:21 | ...::dealloc | invalid | -| deallocation.rs:44:6:44:7 | m1 | deallocation.rs:20:3:20:21 | ...::dealloc | deallocation.rs:44:6:44:7 | m1 | This operation dereferences a pointer that may be $@. | deallocation.rs:20:3:20:21 | ...::dealloc | invalid | -| deallocation.rs:49:5:49:25 | ...::write::<...> | deallocation.rs:20:3:20:21 | ...::dealloc | deallocation.rs:49:5:49:25 | ...::write::<...> | This operation dereferences a pointer that may be $@. | deallocation.rs:20:3:20:21 | ...::dealloc | invalid | -| deallocation.rs:76:16:76:17 | m2 | deallocation.rs:70:3:70:21 | ...::dealloc | deallocation.rs:76:16:76:17 | m2 | This operation dereferences a pointer that may be $@. | deallocation.rs:70:3:70:21 | ...::dealloc | invalid | -| deallocation.rs:81:16:81:17 | m2 | deallocation.rs:70:3:70:21 | ...::dealloc | deallocation.rs:81:16:81:17 | m2 | This operation dereferences a pointer that may be $@. | deallocation.rs:70:3:70:21 | ...::dealloc | invalid | -| deallocation.rs:86:7:86:8 | m2 | deallocation.rs:70:3:70:21 | ...::dealloc | deallocation.rs:86:7:86:8 | m2 | This operation dereferences a pointer that may be $@. | deallocation.rs:70:3:70:21 | ...::dealloc | invalid | -| deallocation.rs:90:7:90:8 | m2 | deallocation.rs:70:3:70:21 | ...::dealloc | deallocation.rs:90:7:90:8 | m2 | This operation dereferences a pointer that may be $@. | deallocation.rs:70:3:70:21 | ...::dealloc | invalid | -| deallocation.rs:95:5:95:31 | ...::write::<...> | deallocation.rs:70:3:70:21 | ...::dealloc | deallocation.rs:95:5:95:31 | ...::write::<...> | This operation dereferences a pointer that may be $@. | deallocation.rs:70:3:70:21 | ...::dealloc | invalid | -| deallocation.rs:115:13:115:18 | my_ptr | deallocation.rs:112:3:112:12 | ...::free | deallocation.rs:115:13:115:18 | my_ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:112:3:112:12 | ...::free | invalid | -| deallocation.rs:130:14:130:15 | p1 | deallocation.rs:123:23:123:40 | ...::dangling | deallocation.rs:130:14:130:15 | p1 | This operation dereferences a pointer that may be $@. | deallocation.rs:123:23:123:40 | ...::dangling | invalid | -| deallocation.rs:131:14:131:15 | p2 | deallocation.rs:124:21:124:42 | ...::dangling_mut | deallocation.rs:131:14:131:15 | p2 | This operation dereferences a pointer that may be $@. | deallocation.rs:124:21:124:42 | ...::dangling_mut | invalid | -| deallocation.rs:132:14:132:15 | p3 | deallocation.rs:125:23:125:36 | ...::null | deallocation.rs:132:14:132:15 | p3 | This operation dereferences a pointer that may be $@. | deallocation.rs:125:23:125:36 | ...::null | invalid | -| deallocation.rs:163:13:163:15 | ptr | deallocation.rs:159:9:159:26 | ...::null_mut | deallocation.rs:163:13:163:15 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:159:9:159:26 | ...::null_mut | invalid | -| deallocation.rs:166:13:166:15 | ptr | deallocation.rs:159:9:159:26 | ...::null_mut | deallocation.rs:166:13:166:15 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:159:9:159:26 | ...::null_mut | invalid | -| deallocation.rs:175:13:175:15 | ptr | deallocation.rs:171:9:171:26 | ...::null_mut | deallocation.rs:175:13:175:15 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:171:9:171:26 | ...::null_mut | invalid | -| deallocation.rs:178:13:178:15 | ptr | deallocation.rs:171:9:171:26 | ...::null_mut | deallocation.rs:178:13:178:15 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:171:9:171:26 | ...::null_mut | invalid | -| deallocation.rs:186:24:186:26 | ptr | deallocation.rs:183:9:183:26 | ...::null_mut | deallocation.rs:186:24:186:26 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:183:9:183:26 | ...::null_mut | invalid | -| deallocation.rs:190:24:190:26 | ptr | deallocation.rs:183:9:183:26 | ...::null_mut | deallocation.rs:190:24:190:26 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:183:9:183:26 | ...::null_mut | invalid | -| deallocation.rs:194:25:194:27 | ptr | deallocation.rs:183:9:183:26 | ...::null_mut | deallocation.rs:194:25:194:27 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:183:9:183:26 | ...::null_mut | invalid | -| deallocation.rs:202:24:202:26 | ptr | deallocation.rs:183:9:183:26 | ...::null_mut | deallocation.rs:202:24:202:26 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:183:9:183:26 | ...::null_mut | invalid | -| deallocation.rs:202:24:202:26 | ptr | deallocation.rs:199:9:199:26 | ...::null_mut | deallocation.rs:202:24:202:26 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:199:9:199:26 | ...::null_mut | invalid | -| deallocation.rs:210:7:210:9 | ptr | deallocation.rs:183:9:183:26 | ...::null_mut | deallocation.rs:210:7:210:9 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:183:9:183:26 | ...::null_mut | invalid | -| deallocation.rs:210:7:210:9 | ptr | deallocation.rs:199:9:199:26 | ...::null_mut | deallocation.rs:210:7:210:9 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:199:9:199:26 | ...::null_mut | invalid | -| deallocation.rs:210:7:210:9 | ptr | deallocation.rs:207:9:207:26 | ...::null_mut | deallocation.rs:210:7:210:9 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:207:9:207:26 | ...::null_mut | invalid | -| deallocation.rs:226:13:226:21 | const_ptr | deallocation.rs:219:15:219:32 | ...::null_mut | deallocation.rs:226:13:226:21 | const_ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:219:15:219:32 | ...::null_mut | invalid | -| deallocation.rs:274:15:274:16 | p1 | deallocation.rs:270:3:270:25 | ...::drop_in_place | deallocation.rs:274:15:274:16 | p1 | This operation dereferences a pointer that may be $@. | deallocation.rs:270:3:270:25 | ...::drop_in_place | invalid | -| deallocation.rs:342:18:342:20 | ptr | deallocation.rs:336:3:336:25 | ...::drop_in_place | deallocation.rs:342:18:342:20 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:336:3:336:25 | ...::drop_in_place | invalid | +| deallocation.rs:26:15:26:16 | m1 | deallocation.rs:20:23:20:24 | m1 | deallocation.rs:26:15:26:16 | m1 | This operation dereferences a pointer that may be $@. | deallocation.rs:20:23:20:24 | m1 | invalid | +| deallocation.rs:37:35:37:36 | m1 | deallocation.rs:20:23:20:24 | m1 | deallocation.rs:37:35:37:36 | m1 | This operation dereferences a pointer that may be $@. | deallocation.rs:20:23:20:24 | m1 | invalid | +| deallocation.rs:44:6:44:7 | m1 | deallocation.rs:20:23:20:24 | m1 | deallocation.rs:44:6:44:7 | m1 | This operation dereferences a pointer that may be $@. | deallocation.rs:20:23:20:24 | m1 | invalid | +| deallocation.rs:49:27:49:28 | m1 | deallocation.rs:20:23:20:24 | m1 | deallocation.rs:49:27:49:28 | m1 | This operation dereferences a pointer that may be $@. | deallocation.rs:20:23:20:24 | m1 | invalid | +| deallocation.rs:76:16:76:17 | m2 | deallocation.rs:70:23:70:35 | m2 as ... | deallocation.rs:76:16:76:17 | m2 | This operation dereferences a pointer that may be $@. | deallocation.rs:70:23:70:35 | m2 as ... | invalid | +| deallocation.rs:81:16:81:17 | m2 | deallocation.rs:70:23:70:35 | m2 as ... | deallocation.rs:81:16:81:17 | m2 | This operation dereferences a pointer that may be $@. | deallocation.rs:70:23:70:35 | m2 as ... | invalid | +| deallocation.rs:86:7:86:8 | m2 | deallocation.rs:70:23:70:35 | m2 as ... | deallocation.rs:86:7:86:8 | m2 | This operation dereferences a pointer that may be $@. | deallocation.rs:70:23:70:35 | m2 as ... | invalid | +| deallocation.rs:90:7:90:8 | m2 | deallocation.rs:70:23:70:35 | m2 as ... | deallocation.rs:90:7:90:8 | m2 | This operation dereferences a pointer that may be $@. | deallocation.rs:70:23:70:35 | m2 as ... | invalid | +| deallocation.rs:95:33:95:34 | m2 | deallocation.rs:70:23:70:35 | m2 as ... | deallocation.rs:95:33:95:34 | m2 | This operation dereferences a pointer that may be $@. | deallocation.rs:70:23:70:35 | m2 as ... | invalid | +| deallocation.rs:115:13:115:18 | my_ptr | deallocation.rs:112:14:112:40 | my_ptr as ... | deallocation.rs:115:13:115:18 | my_ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:112:14:112:40 | my_ptr as ... | invalid | +| deallocation.rs:130:14:130:15 | p1 | deallocation.rs:123:23:123:42 | ...::dangling(...) | deallocation.rs:130:14:130:15 | p1 | This operation dereferences a pointer that may be $@. | deallocation.rs:123:23:123:42 | ...::dangling(...) | invalid | +| deallocation.rs:131:14:131:15 | p2 | deallocation.rs:124:21:124:44 | ...::dangling_mut(...) | deallocation.rs:131:14:131:15 | p2 | This operation dereferences a pointer that may be $@. | deallocation.rs:124:21:124:44 | ...::dangling_mut(...) | invalid | +| deallocation.rs:132:14:132:15 | p3 | deallocation.rs:125:23:125:38 | ...::null(...) | deallocation.rs:132:14:132:15 | p3 | This operation dereferences a pointer that may be $@. | deallocation.rs:125:23:125:38 | ...::null(...) | invalid | +| deallocation.rs:163:13:163:15 | ptr | deallocation.rs:159:9:159:28 | ...::null_mut(...) | deallocation.rs:163:13:163:15 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:159:9:159:28 | ...::null_mut(...) | invalid | +| deallocation.rs:166:13:166:15 | ptr | deallocation.rs:159:9:159:28 | ...::null_mut(...) | deallocation.rs:166:13:166:15 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:159:9:159:28 | ...::null_mut(...) | invalid | +| deallocation.rs:175:13:175:15 | ptr | deallocation.rs:171:9:171:28 | ...::null_mut(...) | deallocation.rs:175:13:175:15 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:171:9:171:28 | ...::null_mut(...) | invalid | +| deallocation.rs:178:13:178:15 | ptr | deallocation.rs:171:9:171:28 | ...::null_mut(...) | deallocation.rs:178:13:178:15 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:171:9:171:28 | ...::null_mut(...) | invalid | +| deallocation.rs:186:24:186:26 | ptr | deallocation.rs:183:9:183:28 | ...::null_mut(...) | deallocation.rs:186:24:186:26 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:183:9:183:28 | ...::null_mut(...) | invalid | +| deallocation.rs:190:24:190:26 | ptr | deallocation.rs:183:9:183:28 | ...::null_mut(...) | deallocation.rs:190:24:190:26 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:183:9:183:28 | ...::null_mut(...) | invalid | +| deallocation.rs:194:25:194:27 | ptr | deallocation.rs:183:9:183:28 | ...::null_mut(...) | deallocation.rs:194:25:194:27 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:183:9:183:28 | ...::null_mut(...) | invalid | +| deallocation.rs:202:24:202:26 | ptr | deallocation.rs:183:9:183:28 | ...::null_mut(...) | deallocation.rs:202:24:202:26 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:183:9:183:28 | ...::null_mut(...) | invalid | +| deallocation.rs:202:24:202:26 | ptr | deallocation.rs:199:9:199:28 | ...::null_mut(...) | deallocation.rs:202:24:202:26 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:199:9:199:28 | ...::null_mut(...) | invalid | +| deallocation.rs:210:7:210:9 | ptr | deallocation.rs:183:9:183:28 | ...::null_mut(...) | deallocation.rs:210:7:210:9 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:183:9:183:28 | ...::null_mut(...) | invalid | +| deallocation.rs:210:7:210:9 | ptr | deallocation.rs:199:9:199:28 | ...::null_mut(...) | deallocation.rs:210:7:210:9 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:199:9:199:28 | ...::null_mut(...) | invalid | +| deallocation.rs:210:7:210:9 | ptr | deallocation.rs:207:9:207:28 | ...::null_mut(...) | deallocation.rs:210:7:210:9 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:207:9:207:28 | ...::null_mut(...) | invalid | +| deallocation.rs:226:13:226:21 | const_ptr | deallocation.rs:219:15:219:34 | ...::null_mut(...) | deallocation.rs:226:13:226:21 | const_ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:219:15:219:34 | ...::null_mut(...) | invalid | +| deallocation.rs:274:15:274:16 | p1 | deallocation.rs:270:27:270:28 | p1 | deallocation.rs:274:15:274:16 | p1 | This operation dereferences a pointer that may be $@. | deallocation.rs:270:27:270:28 | p1 | invalid | +| deallocation.rs:342:18:342:20 | ptr | deallocation.rs:336:27:336:29 | ptr | deallocation.rs:342:18:342:20 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:336:27:336:29 | ptr | invalid | edges -| deallocation.rs:20:3:20:21 | ...::dealloc | deallocation.rs:20:23:20:24 | [post] m1 | provenance | Src:MaD:3 MaD:3 | -| deallocation.rs:20:23:20:24 | [post] m1 | deallocation.rs:26:15:26:16 | m1 | provenance | | -| deallocation.rs:20:23:20:24 | [post] m1 | deallocation.rs:37:35:37:36 | m1 | provenance | | -| deallocation.rs:20:23:20:24 | [post] m1 | deallocation.rs:44:6:44:7 | m1 | provenance | | -| deallocation.rs:20:23:20:24 | [post] m1 | deallocation.rs:49:27:49:28 | m1 | provenance | | -| deallocation.rs:37:35:37:36 | m1 | deallocation.rs:37:14:37:33 | ...::read::<...> | provenance | MaD:1 Sink:MaD:1 | -| deallocation.rs:49:27:49:28 | m1 | deallocation.rs:49:5:49:25 | ...::write::<...> | provenance | MaD:2 Sink:MaD:2 | -| deallocation.rs:70:3:70:21 | ...::dealloc | deallocation.rs:70:23:70:35 | [post] m2 as ... | provenance | Src:MaD:3 MaD:3 | -| deallocation.rs:70:23:70:35 | [post] m2 as ... | deallocation.rs:76:16:76:17 | m2 | provenance | | -| deallocation.rs:70:23:70:35 | [post] m2 as ... | deallocation.rs:81:16:81:17 | m2 | provenance | | -| deallocation.rs:70:23:70:35 | [post] m2 as ... | deallocation.rs:86:7:86:8 | m2 | provenance | | -| deallocation.rs:70:23:70:35 | [post] m2 as ... | deallocation.rs:90:7:90:8 | m2 | provenance | | -| deallocation.rs:70:23:70:35 | [post] m2 as ... | deallocation.rs:95:33:95:34 | m2 | provenance | | -| deallocation.rs:95:33:95:34 | m2 | deallocation.rs:95:5:95:31 | ...::write::<...> | provenance | MaD:2 Sink:MaD:2 | -| deallocation.rs:112:3:112:12 | ...::free | deallocation.rs:112:14:112:40 | [post] my_ptr as ... | provenance | Src:MaD:9 MaD:9 | -| deallocation.rs:112:14:112:40 | [post] my_ptr as ... | deallocation.rs:115:13:115:18 | my_ptr | provenance | | +| deallocation.rs:20:23:20:24 | m1 | deallocation.rs:26:15:26:16 | m1 | provenance | Src:MaD:3 | +| deallocation.rs:20:23:20:24 | m1 | deallocation.rs:37:35:37:36 | m1 | provenance | Src:MaD:3 Sink:MaD:1 | +| deallocation.rs:20:23:20:24 | m1 | deallocation.rs:44:6:44:7 | m1 | provenance | Src:MaD:3 | +| deallocation.rs:20:23:20:24 | m1 | deallocation.rs:49:27:49:28 | m1 | provenance | Src:MaD:3 Sink:MaD:2 | +| deallocation.rs:70:23:70:35 | m2 as ... | deallocation.rs:76:16:76:17 | m2 | provenance | Src:MaD:3 | +| deallocation.rs:70:23:70:35 | m2 as ... | deallocation.rs:81:16:81:17 | m2 | provenance | Src:MaD:3 | +| deallocation.rs:70:23:70:35 | m2 as ... | deallocation.rs:86:7:86:8 | m2 | provenance | Src:MaD:3 | +| deallocation.rs:70:23:70:35 | m2 as ... | deallocation.rs:90:7:90:8 | m2 | provenance | Src:MaD:3 | +| deallocation.rs:70:23:70:35 | m2 as ... | deallocation.rs:95:33:95:34 | m2 | provenance | Src:MaD:3 Sink:MaD:2 | +| deallocation.rs:112:14:112:40 | my_ptr as ... | deallocation.rs:115:13:115:18 | my_ptr | provenance | Src:MaD:9 | | deallocation.rs:123:6:123:7 | p1 | deallocation.rs:130:14:130:15 | p1 | provenance | | -| deallocation.rs:123:23:123:40 | ...::dangling | deallocation.rs:123:23:123:42 | ...::dangling(...) | provenance | Src:MaD:4 MaD:4 | -| deallocation.rs:123:23:123:42 | ...::dangling(...) | deallocation.rs:123:6:123:7 | p1 | provenance | | +| deallocation.rs:123:23:123:42 | ...::dangling(...) | deallocation.rs:123:6:123:7 | p1 | provenance | Src:MaD:4 | | deallocation.rs:124:6:124:7 | p2 | deallocation.rs:131:14:131:15 | p2 | provenance | | -| deallocation.rs:124:21:124:42 | ...::dangling_mut | deallocation.rs:124:21:124:44 | ...::dangling_mut(...) | provenance | Src:MaD:5 MaD:5 | -| deallocation.rs:124:21:124:44 | ...::dangling_mut(...) | deallocation.rs:124:6:124:7 | p2 | provenance | | +| deallocation.rs:124:21:124:44 | ...::dangling_mut(...) | deallocation.rs:124:6:124:7 | p2 | provenance | Src:MaD:5 | | deallocation.rs:125:6:125:7 | p3 | deallocation.rs:132:14:132:15 | p3 | provenance | | -| deallocation.rs:125:23:125:36 | ...::null | deallocation.rs:125:23:125:38 | ...::null(...) | provenance | Src:MaD:7 MaD:7 | -| deallocation.rs:125:23:125:38 | ...::null(...) | deallocation.rs:125:6:125:7 | p3 | provenance | | +| deallocation.rs:125:23:125:38 | ...::null(...) | deallocation.rs:125:6:125:7 | p3 | provenance | Src:MaD:7 | | deallocation.rs:159:3:159:5 | ptr | deallocation.rs:163:13:163:15 | ptr | provenance | | | deallocation.rs:159:3:159:5 | ptr | deallocation.rs:166:13:166:15 | ptr | provenance | | -| deallocation.rs:159:9:159:26 | ...::null_mut | deallocation.rs:159:9:159:28 | ...::null_mut(...) | provenance | Src:MaD:8 MaD:8 | -| deallocation.rs:159:9:159:28 | ...::null_mut(...) | deallocation.rs:159:3:159:5 | ptr | provenance | | +| deallocation.rs:159:9:159:28 | ...::null_mut(...) | deallocation.rs:159:3:159:5 | ptr | provenance | Src:MaD:8 | | deallocation.rs:171:3:171:5 | ptr | deallocation.rs:175:13:175:15 | ptr | provenance | | | deallocation.rs:171:3:171:5 | ptr | deallocation.rs:178:13:178:15 | ptr | provenance | | -| deallocation.rs:171:9:171:26 | ...::null_mut | deallocation.rs:171:9:171:28 | ...::null_mut(...) | provenance | Src:MaD:8 MaD:8 | -| deallocation.rs:171:9:171:28 | ...::null_mut(...) | deallocation.rs:171:3:171:5 | ptr | provenance | | +| deallocation.rs:171:9:171:28 | ...::null_mut(...) | deallocation.rs:171:3:171:5 | ptr | provenance | Src:MaD:8 | | deallocation.rs:183:3:183:5 | ptr | deallocation.rs:186:24:186:26 | ptr | provenance | | | deallocation.rs:183:3:183:5 | ptr | deallocation.rs:190:24:190:26 | ptr | provenance | | | deallocation.rs:183:3:183:5 | ptr | deallocation.rs:194:25:194:27 | ptr | provenance | | | deallocation.rs:183:3:183:5 | ptr | deallocation.rs:202:24:202:26 | ptr | provenance | | | deallocation.rs:183:3:183:5 | ptr | deallocation.rs:210:7:210:9 | ptr | provenance | | -| deallocation.rs:183:9:183:26 | ...::null_mut | deallocation.rs:183:9:183:28 | ...::null_mut(...) | provenance | Src:MaD:8 MaD:8 | -| deallocation.rs:183:9:183:28 | ...::null_mut(...) | deallocation.rs:183:3:183:5 | ptr | provenance | | +| deallocation.rs:183:9:183:28 | ...::null_mut(...) | deallocation.rs:183:3:183:5 | ptr | provenance | Src:MaD:8 | | deallocation.rs:199:3:199:5 | ptr | deallocation.rs:202:24:202:26 | ptr | provenance | | | deallocation.rs:199:3:199:5 | ptr | deallocation.rs:210:7:210:9 | ptr | provenance | | -| deallocation.rs:199:9:199:26 | ...::null_mut | deallocation.rs:199:9:199:28 | ...::null_mut(...) | provenance | Src:MaD:8 MaD:8 | -| deallocation.rs:199:9:199:28 | ...::null_mut(...) | deallocation.rs:199:3:199:5 | ptr | provenance | | +| deallocation.rs:199:9:199:28 | ...::null_mut(...) | deallocation.rs:199:3:199:5 | ptr | provenance | Src:MaD:8 | | deallocation.rs:207:3:207:5 | ptr | deallocation.rs:210:7:210:9 | ptr | provenance | | -| deallocation.rs:207:9:207:26 | ...::null_mut | deallocation.rs:207:9:207:28 | ...::null_mut(...) | provenance | Src:MaD:8 MaD:8 | -| deallocation.rs:207:9:207:28 | ...::null_mut(...) | deallocation.rs:207:3:207:5 | ptr | provenance | | +| deallocation.rs:207:9:207:28 | ...::null_mut(...) | deallocation.rs:207:3:207:5 | ptr | provenance | Src:MaD:8 | | deallocation.rs:219:3:219:11 | const_ptr | deallocation.rs:226:13:226:21 | const_ptr | provenance | | -| deallocation.rs:219:15:219:32 | ...::null_mut | deallocation.rs:219:15:219:34 | ...::null_mut(...) | provenance | Src:MaD:8 MaD:8 | -| deallocation.rs:219:15:219:34 | ...::null_mut(...) | deallocation.rs:219:3:219:11 | const_ptr | provenance | | -| deallocation.rs:270:3:270:25 | ...::drop_in_place | deallocation.rs:270:27:270:28 | [post] p1 | provenance | Src:MaD:6 MaD:6 | -| deallocation.rs:270:27:270:28 | [post] p1 | deallocation.rs:274:15:274:16 | p1 | provenance | | -| deallocation.rs:336:3:336:25 | ...::drop_in_place | deallocation.rs:336:27:336:29 | [post] ptr | provenance | Src:MaD:6 MaD:6 | -| deallocation.rs:336:27:336:29 | [post] ptr | deallocation.rs:342:18:342:20 | ptr | provenance | | +| deallocation.rs:219:15:219:34 | ...::null_mut(...) | deallocation.rs:219:3:219:11 | const_ptr | provenance | Src:MaD:8 | +| deallocation.rs:270:27:270:28 | p1 | deallocation.rs:274:15:274:16 | p1 | provenance | Src:MaD:6 | +| deallocation.rs:336:27:336:29 | ptr | deallocation.rs:342:18:342:20 | ptr | provenance | Src:MaD:6 | models | 1 | Sink: core::ptr::read; Argument[0]; pointer-access | | 2 | Sink: core::ptr::write; Argument[0]; pointer-access | @@ -93,69 +76,52 @@ models | 8 | Source: core::ptr::null_mut; ReturnValue; pointer-invalidate | | 9 | Source: libc::unix::free; Argument[0]; pointer-invalidate | nodes -| deallocation.rs:20:3:20:21 | ...::dealloc | semmle.label | ...::dealloc | -| deallocation.rs:20:23:20:24 | [post] m1 | semmle.label | [post] m1 | +| deallocation.rs:20:23:20:24 | m1 | semmle.label | m1 | | deallocation.rs:26:15:26:16 | m1 | semmle.label | m1 | -| deallocation.rs:37:14:37:33 | ...::read::<...> | semmle.label | ...::read::<...> | | deallocation.rs:37:35:37:36 | m1 | semmle.label | m1 | | deallocation.rs:44:6:44:7 | m1 | semmle.label | m1 | -| deallocation.rs:49:5:49:25 | ...::write::<...> | semmle.label | ...::write::<...> | | deallocation.rs:49:27:49:28 | m1 | semmle.label | m1 | -| deallocation.rs:70:3:70:21 | ...::dealloc | semmle.label | ...::dealloc | -| deallocation.rs:70:23:70:35 | [post] m2 as ... | semmle.label | [post] m2 as ... | +| deallocation.rs:70:23:70:35 | m2 as ... | semmle.label | m2 as ... | | deallocation.rs:76:16:76:17 | m2 | semmle.label | m2 | | deallocation.rs:81:16:81:17 | m2 | semmle.label | m2 | | deallocation.rs:86:7:86:8 | m2 | semmle.label | m2 | | deallocation.rs:90:7:90:8 | m2 | semmle.label | m2 | -| deallocation.rs:95:5:95:31 | ...::write::<...> | semmle.label | ...::write::<...> | | deallocation.rs:95:33:95:34 | m2 | semmle.label | m2 | -| deallocation.rs:112:3:112:12 | ...::free | semmle.label | ...::free | -| deallocation.rs:112:14:112:40 | [post] my_ptr as ... | semmle.label | [post] my_ptr as ... | +| deallocation.rs:112:14:112:40 | my_ptr as ... | semmle.label | my_ptr as ... | | deallocation.rs:115:13:115:18 | my_ptr | semmle.label | my_ptr | | deallocation.rs:123:6:123:7 | p1 | semmle.label | p1 | -| deallocation.rs:123:23:123:40 | ...::dangling | semmle.label | ...::dangling | | deallocation.rs:123:23:123:42 | ...::dangling(...) | semmle.label | ...::dangling(...) | | deallocation.rs:124:6:124:7 | p2 | semmle.label | p2 | -| deallocation.rs:124:21:124:42 | ...::dangling_mut | semmle.label | ...::dangling_mut | | deallocation.rs:124:21:124:44 | ...::dangling_mut(...) | semmle.label | ...::dangling_mut(...) | | deallocation.rs:125:6:125:7 | p3 | semmle.label | p3 | -| deallocation.rs:125:23:125:36 | ...::null | semmle.label | ...::null | | deallocation.rs:125:23:125:38 | ...::null(...) | semmle.label | ...::null(...) | | deallocation.rs:130:14:130:15 | p1 | semmle.label | p1 | | deallocation.rs:131:14:131:15 | p2 | semmle.label | p2 | | deallocation.rs:132:14:132:15 | p3 | semmle.label | p3 | | deallocation.rs:159:3:159:5 | ptr | semmle.label | ptr | -| deallocation.rs:159:9:159:26 | ...::null_mut | semmle.label | ...::null_mut | | deallocation.rs:159:9:159:28 | ...::null_mut(...) | semmle.label | ...::null_mut(...) | | deallocation.rs:163:13:163:15 | ptr | semmle.label | ptr | | deallocation.rs:166:13:166:15 | ptr | semmle.label | ptr | | deallocation.rs:171:3:171:5 | ptr | semmle.label | ptr | -| deallocation.rs:171:9:171:26 | ...::null_mut | semmle.label | ...::null_mut | | deallocation.rs:171:9:171:28 | ...::null_mut(...) | semmle.label | ...::null_mut(...) | | deallocation.rs:175:13:175:15 | ptr | semmle.label | ptr | | deallocation.rs:178:13:178:15 | ptr | semmle.label | ptr | | deallocation.rs:183:3:183:5 | ptr | semmle.label | ptr | -| deallocation.rs:183:9:183:26 | ...::null_mut | semmle.label | ...::null_mut | | deallocation.rs:183:9:183:28 | ...::null_mut(...) | semmle.label | ...::null_mut(...) | | deallocation.rs:186:24:186:26 | ptr | semmle.label | ptr | | deallocation.rs:190:24:190:26 | ptr | semmle.label | ptr | | deallocation.rs:194:25:194:27 | ptr | semmle.label | ptr | | deallocation.rs:199:3:199:5 | ptr | semmle.label | ptr | -| deallocation.rs:199:9:199:26 | ...::null_mut | semmle.label | ...::null_mut | | deallocation.rs:199:9:199:28 | ...::null_mut(...) | semmle.label | ...::null_mut(...) | | deallocation.rs:202:24:202:26 | ptr | semmle.label | ptr | | deallocation.rs:207:3:207:5 | ptr | semmle.label | ptr | -| deallocation.rs:207:9:207:26 | ...::null_mut | semmle.label | ...::null_mut | | deallocation.rs:207:9:207:28 | ...::null_mut(...) | semmle.label | ...::null_mut(...) | | deallocation.rs:210:7:210:9 | ptr | semmle.label | ptr | | deallocation.rs:219:3:219:11 | const_ptr | semmle.label | const_ptr | -| deallocation.rs:219:15:219:32 | ...::null_mut | semmle.label | ...::null_mut | | deallocation.rs:219:15:219:34 | ...::null_mut(...) | semmle.label | ...::null_mut(...) | | deallocation.rs:226:13:226:21 | const_ptr | semmle.label | const_ptr | -| deallocation.rs:270:3:270:25 | ...::drop_in_place | semmle.label | ...::drop_in_place | -| deallocation.rs:270:27:270:28 | [post] p1 | semmle.label | [post] p1 | +| deallocation.rs:270:27:270:28 | p1 | semmle.label | p1 | | deallocation.rs:274:15:274:16 | p1 | semmle.label | p1 | -| deallocation.rs:336:3:336:25 | ...::drop_in_place | semmle.label | ...::drop_in_place | -| deallocation.rs:336:27:336:29 | [post] ptr | semmle.label | [post] ptr | +| deallocation.rs:336:27:336:29 | ptr | semmle.label | ptr | | deallocation.rs:342:18:342:20 | ptr | semmle.label | ptr | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-918/RequestForgery.expected b/rust/ql/test/query-tests/security/CWE-918/RequestForgery.expected index 0f931ed3a0f8..0b6342593baa 100644 --- a/rust/ql/test/query-tests/security/CWE-918/RequestForgery.expected +++ b/rust/ql/test/query-tests/security/CWE-918/RequestForgery.expected @@ -1,11 +1,11 @@ #select -| request_forgery_tests.rs:8:24:8:35 | ...::get | request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:8:24:8:35 | ...::get | The URL of this request depends on a $@. | request_forgery_tests.rs:5:29:5:36 | user_url | user-provided value | -| request_forgery_tests.rs:17:25:17:36 | ...::get | request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:17:25:17:36 | ...::get | The URL of this request depends on a $@. | request_forgery_tests.rs:5:29:5:36 | user_url | user-provided value | -| request_forgery_tests.rs:21:25:21:36 | ...::get | request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:21:25:21:36 | ...::get | The URL of this request depends on a $@. | request_forgery_tests.rs:5:29:5:36 | user_url | user-provided value | -| request_forgery_tests.rs:25:25:25:36 | ...::get | request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:25:25:25:36 | ...::get | The URL of this request depends on a $@. | request_forgery_tests.rs:5:29:5:36 | user_url | user-provided value | -| request_forgery_tests.rs:31:29:31:40 | ...::get | request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:31:29:31:40 | ...::get | The URL of this request depends on a $@. | request_forgery_tests.rs:5:29:5:36 | user_url | user-provided value | -| request_forgery_tests.rs:37:37:37:48 | ...::get | request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:37:37:37:48 | ...::get | The URL of this request depends on a $@. | request_forgery_tests.rs:5:29:5:36 | user_url | user-provided value | -| request_forgery_tests.rs:68:28:68:39 | ...::get | request_forgery_tests.rs:65:33:65:40 | and_then | request_forgery_tests.rs:68:28:68:39 | ...::get | The URL of this request depends on a $@. | request_forgery_tests.rs:65:33:65:40 | and_then | user-provided value | +| request_forgery_tests.rs:8:37:8:45 | &user_url | request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:8:37:8:45 | &user_url | The URL of this request depends on a $@. | request_forgery_tests.rs:5:29:5:36 | user_url | user-provided value | +| request_forgery_tests.rs:17:38:17:41 | &url | request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:17:38:17:41 | &url | The URL of this request depends on a $@. | request_forgery_tests.rs:5:29:5:36 | user_url | user-provided value | +| request_forgery_tests.rs:21:38:21:41 | &url | request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:21:38:21:41 | &url | The URL of this request depends on a $@. | request_forgery_tests.rs:5:29:5:36 | user_url | user-provided value | +| request_forgery_tests.rs:25:38:25:41 | &url | request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:25:38:25:41 | &url | The URL of this request depends on a $@. | request_forgery_tests.rs:5:29:5:36 | user_url | user-provided value | +| request_forgery_tests.rs:31:42:31:50 | &user_url | request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:31:42:31:50 | &user_url | The URL of this request depends on a $@. | request_forgery_tests.rs:5:29:5:36 | user_url | user-provided value | +| request_forgery_tests.rs:37:50:37:58 | &user_url | request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:37:50:37:58 | &user_url | The URL of this request depends on a $@. | request_forgery_tests.rs:5:29:5:36 | user_url | user-provided value | +| request_forgery_tests.rs:68:41:68:42 | &a | request_forgery_tests.rs:65:42:73:9 | \|...\| ... | request_forgery_tests.rs:68:41:68:42 | &a | The URL of this request depends on a $@. | request_forgery_tests.rs:65:42:73:9 | \|...\| ... | user-provided value | edges | request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:8:38:8:45 | user_url | provenance | | | request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:16:27:16:49 | MacroExpr | provenance | | @@ -13,36 +13,35 @@ edges | request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:24:27:24:70 | MacroExpr | provenance | | | request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:31:43:31:50 | user_url | provenance | | | request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:37:51:37:58 | user_url | provenance | | -| request_forgery_tests.rs:8:37:8:45 | &user_url [&ref] | request_forgery_tests.rs:8:24:8:35 | ...::get | provenance | MaD:1 Sink:MaD:1 | +| request_forgery_tests.rs:8:37:8:45 | &user_url [&ref] | request_forgery_tests.rs:8:37:8:45 | &user_url | provenance | Sink:MaD:1 | | request_forgery_tests.rs:8:38:8:45 | user_url | request_forgery_tests.rs:8:37:8:45 | &user_url [&ref] | provenance | | | request_forgery_tests.rs:16:13:16:15 | url | request_forgery_tests.rs:17:39:17:41 | url | provenance | | | request_forgery_tests.rs:16:27:16:49 | ...::format(...) | request_forgery_tests.rs:16:27:16:49 | { ... } | provenance | | | request_forgery_tests.rs:16:27:16:49 | ...::must_use(...) | request_forgery_tests.rs:16:13:16:15 | url | provenance | | | request_forgery_tests.rs:16:27:16:49 | MacroExpr | request_forgery_tests.rs:16:27:16:49 | ...::format(...) | provenance | MaD:3 | | request_forgery_tests.rs:16:27:16:49 | { ... } | request_forgery_tests.rs:16:27:16:49 | ...::must_use(...) | provenance | MaD:4 | -| request_forgery_tests.rs:17:38:17:41 | &url [&ref] | request_forgery_tests.rs:17:25:17:36 | ...::get | provenance | MaD:1 Sink:MaD:1 | +| request_forgery_tests.rs:17:38:17:41 | &url [&ref] | request_forgery_tests.rs:17:38:17:41 | &url | provenance | Sink:MaD:1 | | request_forgery_tests.rs:17:39:17:41 | url | request_forgery_tests.rs:17:38:17:41 | &url [&ref] | provenance | | | request_forgery_tests.rs:20:13:20:15 | url | request_forgery_tests.rs:21:39:21:41 | url | provenance | | | request_forgery_tests.rs:20:27:20:57 | ...::format(...) | request_forgery_tests.rs:20:27:20:57 | { ... } | provenance | | | request_forgery_tests.rs:20:27:20:57 | ...::must_use(...) | request_forgery_tests.rs:20:13:20:15 | url | provenance | | | request_forgery_tests.rs:20:27:20:57 | MacroExpr | request_forgery_tests.rs:20:27:20:57 | ...::format(...) | provenance | MaD:3 | | request_forgery_tests.rs:20:27:20:57 | { ... } | request_forgery_tests.rs:20:27:20:57 | ...::must_use(...) | provenance | MaD:4 | -| request_forgery_tests.rs:21:38:21:41 | &url [&ref] | request_forgery_tests.rs:21:25:21:36 | ...::get | provenance | MaD:1 Sink:MaD:1 | +| request_forgery_tests.rs:21:38:21:41 | &url [&ref] | request_forgery_tests.rs:21:38:21:41 | &url | provenance | Sink:MaD:1 | | request_forgery_tests.rs:21:39:21:41 | url | request_forgery_tests.rs:21:38:21:41 | &url [&ref] | provenance | | | request_forgery_tests.rs:24:13:24:15 | url | request_forgery_tests.rs:25:39:25:41 | url | provenance | | | request_forgery_tests.rs:24:27:24:70 | ...::format(...) | request_forgery_tests.rs:24:27:24:70 | { ... } | provenance | | | request_forgery_tests.rs:24:27:24:70 | ...::must_use(...) | request_forgery_tests.rs:24:13:24:15 | url | provenance | | | request_forgery_tests.rs:24:27:24:70 | MacroExpr | request_forgery_tests.rs:24:27:24:70 | ...::format(...) | provenance | MaD:3 | | request_forgery_tests.rs:24:27:24:70 | { ... } | request_forgery_tests.rs:24:27:24:70 | ...::must_use(...) | provenance | MaD:4 | -| request_forgery_tests.rs:25:38:25:41 | &url [&ref] | request_forgery_tests.rs:25:25:25:36 | ...::get | provenance | MaD:1 Sink:MaD:1 | +| request_forgery_tests.rs:25:38:25:41 | &url [&ref] | request_forgery_tests.rs:25:38:25:41 | &url | provenance | Sink:MaD:1 | | request_forgery_tests.rs:25:39:25:41 | url | request_forgery_tests.rs:25:38:25:41 | &url [&ref] | provenance | | -| request_forgery_tests.rs:31:42:31:50 | &user_url [&ref] | request_forgery_tests.rs:31:29:31:40 | ...::get | provenance | MaD:1 Sink:MaD:1 | +| request_forgery_tests.rs:31:42:31:50 | &user_url [&ref] | request_forgery_tests.rs:31:42:31:50 | &user_url | provenance | Sink:MaD:1 | | request_forgery_tests.rs:31:43:31:50 | user_url | request_forgery_tests.rs:31:42:31:50 | &user_url [&ref] | provenance | | -| request_forgery_tests.rs:37:50:37:58 | &user_url [&ref] | request_forgery_tests.rs:37:37:37:48 | ...::get | provenance | MaD:1 Sink:MaD:1 | +| request_forgery_tests.rs:37:50:37:58 | &user_url [&ref] | request_forgery_tests.rs:37:50:37:58 | &user_url | provenance | Sink:MaD:1 | | request_forgery_tests.rs:37:51:37:58 | user_url | request_forgery_tests.rs:37:50:37:58 | &user_url [&ref] | provenance | | -| request_forgery_tests.rs:65:33:65:40 | and_then | request_forgery_tests.rs:65:49:65:57 | ...: String | provenance | Src:MaD:2 | -| request_forgery_tests.rs:65:49:65:57 | ...: String | request_forgery_tests.rs:68:42:68:42 | a | provenance | | -| request_forgery_tests.rs:68:41:68:42 | &a [&ref] | request_forgery_tests.rs:68:28:68:39 | ...::get | provenance | MaD:1 Sink:MaD:1 | +| request_forgery_tests.rs:65:42:73:9 | \|...\| ... | request_forgery_tests.rs:68:42:68:42 | a | provenance | Src:MaD:2 | +| request_forgery_tests.rs:68:41:68:42 | &a [&ref] | request_forgery_tests.rs:68:41:68:42 | &a | provenance | Sink:MaD:1 | | request_forgery_tests.rs:68:42:68:42 | a | request_forgery_tests.rs:68:41:68:42 | &a [&ref] | provenance | | models | 1 | Sink: reqwest::get; Argument[0]; request-url | @@ -51,7 +50,7 @@ models | 4 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes | request_forgery_tests.rs:5:29:5:36 | user_url | semmle.label | user_url | -| request_forgery_tests.rs:8:24:8:35 | ...::get | semmle.label | ...::get | +| request_forgery_tests.rs:8:37:8:45 | &user_url | semmle.label | &user_url | | request_forgery_tests.rs:8:37:8:45 | &user_url [&ref] | semmle.label | &user_url [&ref] | | request_forgery_tests.rs:8:38:8:45 | user_url | semmle.label | user_url | | request_forgery_tests.rs:16:13:16:15 | url | semmle.label | url | @@ -59,7 +58,7 @@ nodes | request_forgery_tests.rs:16:27:16:49 | ...::must_use(...) | semmle.label | ...::must_use(...) | | request_forgery_tests.rs:16:27:16:49 | MacroExpr | semmle.label | MacroExpr | | request_forgery_tests.rs:16:27:16:49 | { ... } | semmle.label | { ... } | -| request_forgery_tests.rs:17:25:17:36 | ...::get | semmle.label | ...::get | +| request_forgery_tests.rs:17:38:17:41 | &url | semmle.label | &url | | request_forgery_tests.rs:17:38:17:41 | &url [&ref] | semmle.label | &url [&ref] | | request_forgery_tests.rs:17:39:17:41 | url | semmle.label | url | | request_forgery_tests.rs:20:13:20:15 | url | semmle.label | url | @@ -67,7 +66,7 @@ nodes | request_forgery_tests.rs:20:27:20:57 | ...::must_use(...) | semmle.label | ...::must_use(...) | | request_forgery_tests.rs:20:27:20:57 | MacroExpr | semmle.label | MacroExpr | | request_forgery_tests.rs:20:27:20:57 | { ... } | semmle.label | { ... } | -| request_forgery_tests.rs:21:25:21:36 | ...::get | semmle.label | ...::get | +| request_forgery_tests.rs:21:38:21:41 | &url | semmle.label | &url | | request_forgery_tests.rs:21:38:21:41 | &url [&ref] | semmle.label | &url [&ref] | | request_forgery_tests.rs:21:39:21:41 | url | semmle.label | url | | request_forgery_tests.rs:24:13:24:15 | url | semmle.label | url | @@ -75,18 +74,17 @@ nodes | request_forgery_tests.rs:24:27:24:70 | ...::must_use(...) | semmle.label | ...::must_use(...) | | request_forgery_tests.rs:24:27:24:70 | MacroExpr | semmle.label | MacroExpr | | request_forgery_tests.rs:24:27:24:70 | { ... } | semmle.label | { ... } | -| request_forgery_tests.rs:25:25:25:36 | ...::get | semmle.label | ...::get | +| request_forgery_tests.rs:25:38:25:41 | &url | semmle.label | &url | | request_forgery_tests.rs:25:38:25:41 | &url [&ref] | semmle.label | &url [&ref] | | request_forgery_tests.rs:25:39:25:41 | url | semmle.label | url | -| request_forgery_tests.rs:31:29:31:40 | ...::get | semmle.label | ...::get | +| request_forgery_tests.rs:31:42:31:50 | &user_url | semmle.label | &user_url | | request_forgery_tests.rs:31:42:31:50 | &user_url [&ref] | semmle.label | &user_url [&ref] | | request_forgery_tests.rs:31:43:31:50 | user_url | semmle.label | user_url | -| request_forgery_tests.rs:37:37:37:48 | ...::get | semmle.label | ...::get | +| request_forgery_tests.rs:37:50:37:58 | &user_url | semmle.label | &user_url | | request_forgery_tests.rs:37:50:37:58 | &user_url [&ref] | semmle.label | &user_url [&ref] | | request_forgery_tests.rs:37:51:37:58 | user_url | semmle.label | user_url | -| request_forgery_tests.rs:65:33:65:40 | and_then | semmle.label | and_then | -| request_forgery_tests.rs:65:49:65:57 | ...: String | semmle.label | ...: String | -| request_forgery_tests.rs:68:28:68:39 | ...::get | semmle.label | ...::get | +| request_forgery_tests.rs:65:42:73:9 | \|...\| ... | semmle.label | \|...\| ... | +| request_forgery_tests.rs:68:41:68:42 | &a | semmle.label | &a | | request_forgery_tests.rs:68:41:68:42 | &a [&ref] | semmle.label | &a [&ref] | | request_forgery_tests.rs:68:42:68:42 | a | semmle.label | a | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-918/request_forgery_tests.rs b/rust/ql/test/query-tests/security/CWE-918/request_forgery_tests.rs index f9abf14de4fc..2610d8d7a39d 100644 --- a/rust/ql/test/query-tests/security/CWE-918/request_forgery_tests.rs +++ b/rust/ql/test/query-tests/security/CWE-918/request_forgery_tests.rs @@ -62,7 +62,7 @@ mod warp_test { async fn test_warp() { // A route with parameter and `and_then` let map_route = - warp::path::param().and_then(async |a: String| // $ Source=a + warp::path::param().and_then(async |a: String| { let response = reqwest::get(&a).await; // $ Alert[rust/request-forgery]=a @@ -70,7 +70,7 @@ mod warp_test { Ok(resp) => Ok(resp.text().await.unwrap_or_default()), Err(_err) => Err(warp::reject::not_found()), } - }); + }); // $ Source=a } } From b6eff32d16dc573bb68dacf4cdc9fd8d0a3ba932 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 9 Jul 2026 13:59:30 +0200 Subject: [PATCH 0328/2098] C++: Adapt to FlowSummaryImpl changes --- .../cpp/dataflow/internal/FlowSummaryImpl.qll | 33 ++++++++++++------- .../ir/dataflow/internal/DataFlowNodes.qll | 4 +-- .../ir/dataflow/internal/DataFlowPrivate.qll | 3 +- .../cpp/ir/dataflow/internal/DataFlowUtil.qll | 3 +- .../dataflow/internal/TaintTrackingUtil.qll | 3 +- 5 files changed, 26 insertions(+), 20 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll index 66b33b1ed522..dda9218855f8 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll @@ -17,9 +17,11 @@ module Input implements InputSig { class SummarizedCallableBase = Function; - class SourceBase = Void; + class SourceBase extends Void { + Location getLocation() { none() } + } - class SinkBase = Void; + class SinkBase = SourceBase; class FlowSummaryCallBase = CallInstruction; @@ -132,10 +134,22 @@ module Input implements InputSig { private import Make as Impl -private module StepsInput implements Impl::Private::StepsInputSig { - Impl::Private::SummaryNode getSummaryNode(Node n) { - result = n.(FlowSummaryNode).getSummaryNode() +private module Input2 implements Impl::Private::InputSig2 { + private import codeql.util.Void + + class SourceSinkReportingElement extends Void { + Location getLocation() { none() } + + DataFlowCallable getEnclosingCallable() { none() } + + SourceSinkReportingElement getASuccessor(Impl::Private::SummaryComponent sc) { none() } } +} + +private import Impl::Private::Make2 as Impl2 + +private module StepsInput implements Impl2::StepsInputSig { + Impl2::SummaryNode getSummaryNode(Node n) { result = n.(FlowSummaryNode).getSummaryNode() } DataFlowCall getACall(Public::SummarizedCallable sc) { result.getStaticCallTarget().getUnderlyingCallable() = sc @@ -148,12 +162,6 @@ private module StepsInput implements Impl::Private::StepsInputSig { pragma[only_bind_out](out.getIndirectionIndex()) ) } - - DataFlowCallable getSourceNodeEnclosingCallable(Input::SourceBase source) { none() } - - Node getSourceNode(Input::SourceBase source, Impl::Private::SummaryComponentStack s) { none() } - - Node getSinkNode(Input::SinkBase sink, Impl::Private::SummaryComponent sc) { none() } } module SourceSinkInterpretationInput implements @@ -270,8 +278,9 @@ module SourceSinkInterpretationInput implements module Private { import Impl::Private + import Impl2 - module Steps = Impl::Private::Steps; + module Steps = Impl2::Steps; module External { import Impl::Private::External diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll index abcff398420c..27f7497422db 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll @@ -1535,10 +1535,10 @@ class FlowSummaryNode extends Node, TFlowSummaryNode { } override DataFlowCallable getEnclosingCallable() { - result = FlowSummaryImpl::Private::getEnclosingCallable(this.getSummaryNode()) + result = this.getSummaryNode().getEnclosingCallable() } - override Location getLocationImpl() { result = this.getSummarizedCallable().getLocation() } + override Location getLocationImpl() { result = this.getSummaryNode().getLocation() } override string toStringImpl() { result = this.getSummaryNode().toString() } } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll index cdcbaa438d3a..df4901b65fe8 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll @@ -119,8 +119,7 @@ private module Cached { ) or // models-as-data summarized flow - FlowSummaryImpl::Private::Steps::summaryJumpStep(n1.(FlowSummaryNode).getSummaryNode(), - n2.(FlowSummaryNode).getSummaryNode()) + FlowSummaryImpl::Private::Steps::summaryJumpStep(n1, n2) } /** diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll index 2e3274c82c7c..13d16375f236 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll @@ -158,8 +158,7 @@ private module Cached { model = "" or // models-as-data summarized flow - FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom, - nodeTo.(FlowSummaryNode).getSummaryNode(), true, model) + FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom, nodeTo, true, model) } private predicate simpleInstructionLocalFlowStep(Operand opFrom, Instruction iTo) { diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/TaintTrackingUtil.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/TaintTrackingUtil.qll index e4e0adf5897b..84c0a92ec8e6 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/TaintTrackingUtil.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/TaintTrackingUtil.qll @@ -67,8 +67,7 @@ private module Cached { model = "" or // models-as-data summarized flow - FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom, - nodeTo.(FlowSummaryNode).getSummaryNode(), false, model) + FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom, nodeTo, false, model) or // object->field conflation for content that is a `TaintInheritingContent`. exists(DataFlow::ContentSet f | From c89504da27f68e9617f0c0e45e42c78c6efeca17 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 9 Jul 2026 14:03:16 +0200 Subject: [PATCH 0329/2098] Go: Adapt to FlowSummaryImpl changes --- .../go/dataflow/internal/DataFlowNodes.qll | 2 +- .../go/dataflow/internal/DataFlowPrivate.qll | 3 +- .../go/dataflow/internal/DataFlowUtil.qll | 3 +- .../go/dataflow/internal/FlowSummaryImpl.qll | 39 ++++++++++++------- .../dataflow/internal/TaintTrackingUtil.qll | 3 +- 5 files changed, 30 insertions(+), 20 deletions(-) diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll index 7069cf36bd01..247f535e6fad 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll @@ -82,7 +82,7 @@ module Private { result = this.getSummaryNode().getSummarizedCallable() } - override Location getLocation() { result = this.getSummarizedCallable().getLocation() } + override Location getLocation() { result = this.getSummaryNode().getLocation() } override string toString() { result = this.getSummaryNode().toString() } diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowPrivate.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowPrivate.qll index 2c5c64ace7d5..e65b2493dd9b 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowPrivate.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowPrivate.qll @@ -153,8 +153,7 @@ predicate jumpStep(Node n1, Node n2) { n2 = recvRead ) or - FlowSummaryImpl::Private::Steps::summaryJumpStep(n1.(FlowSummaryNode).getSummaryNode(), - n2.(FlowSummaryNode).getSummaryNode()) + FlowSummaryImpl::Private::Steps::summaryJumpStep(n1, n2) } /** diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowUtil.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowUtil.qll index e207a72727f9..98e7d90667e0 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowUtil.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowUtil.qll @@ -141,8 +141,7 @@ predicate simpleLocalFlowStep(Node nodeFrom, Node nodeTo, string model) { any(FunctionModel m).flowStep(nodeFrom, nodeTo) and model = "FunctionModel" or - FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom, - nodeTo.(FlowSummaryNode).getSummaryNode(), true, model) + FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom, nodeTo, true, model) } /** diff --git a/go/ql/lib/semmle/go/dataflow/internal/FlowSummaryImpl.qll b/go/ql/lib/semmle/go/dataflow/internal/FlowSummaryImpl.qll index 868066af1e45..cce64ab5c32b 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/FlowSummaryImpl.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/FlowSummaryImpl.qll @@ -27,14 +27,20 @@ module Input implements InputSig { class SummarizedCallableBase = Callable; - class SourceBase = Void; + class SourceBase extends Void { + Location getLocation() { none() } + } - class SinkBase = Void; + class SinkBase = SourceBase; - class FlowSummaryCallBase = Void; + class FlowSummaryCallBase = SourceBase; predicate callableFromSource(SummarizedCallableBase c) { exists(c.getFuncDef()) } + DataFlowCallable getSummarizedCallableAsDataFlowCallable(SummarizedCallableBase c) { + result.asSummarizedCallable() = c + } + predicate neutralElement( Input::SummarizedCallableBase c, string kind, string provenance, boolean isExact ) { @@ -114,10 +120,22 @@ module Input implements InputSig { private import Make as Impl -private module StepsInput implements Impl::Private::StepsInputSig { - Impl::Private::SummaryNode getSummaryNode(Node n) { - result = n.(FlowSummaryNode).getSummaryNode() +private module Input2 implements Impl::Private::InputSig2 { + private import codeql.util.Void + + class SourceSinkReportingElement extends Void { + Location getLocation() { none() } + + DataFlowCallable getEnclosingCallable() { none() } + + SourceSinkReportingElement getASuccessor(Impl::Private::SummaryComponent sc) { none() } } +} + +private import Impl::Private::Make2 as Impl2 + +private module StepsInput implements Impl2::StepsInputSig { + Impl2::SummaryNode getSummaryNode(Node n) { result = n.(FlowSummaryNode).getSummaryNode() } DataFlowCall getACall(Public::SummarizedCallable sc) { exists(DataFlow::CallNode call | @@ -125,12 +143,6 @@ private module StepsInput implements Impl::Private::StepsInputSig { call.getACalleeIncludingExternals() = sc ) } - - DataFlowCallable getSourceNodeEnclosingCallable(Input::SourceBase source) { none() } - - Node getSourceNode(Input::SourceBase source, Impl::Private::SummaryComponentStack s) { none() } - - Node getSinkNode(Input::SinkBase sink, Impl::Private::SummaryComponent sc) { none() } } module SourceSinkInterpretationInput implements @@ -500,8 +512,9 @@ private predicate parseReturn(AccessPath::AccessPathTokenBase c, int n) { module Private { import Impl::Private + import Impl2 - module Steps = Impl::Private::Steps; + module Steps = Impl2::Steps; module External { import Impl::Private::External diff --git a/go/ql/lib/semmle/go/dataflow/internal/TaintTrackingUtil.qll b/go/ql/lib/semmle/go/dataflow/internal/TaintTrackingUtil.qll index de7a1f743c53..4b04c84fc856 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/TaintTrackingUtil.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/TaintTrackingUtil.qll @@ -109,8 +109,7 @@ private predicate localAdditionalForwardTaintStep( or any(AdditionalTaintStep a).step(pred, succ) and model = "AdditionalTaintStep" or - FlowSummaryImpl::Private::Steps::summaryLocalStep(pred, - succ.(DataFlowPrivate::FlowSummaryNode).getSummaryNode(), false, model) + FlowSummaryImpl::Private::Steps::summaryLocalStep(pred, succ, false, model) } /** From 1b64bbc1c8f4e05fbbb66fa1548a85f2b6bbf37b Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 9 Jul 2026 14:06:12 +0200 Subject: [PATCH 0330/2098] Ruby: Adapt to FlowSummaryImpl changes --- .../dataflow/internal/DataFlowPrivate.qll | 9 ++-- .../dataflow/internal/FlowSummaryImpl.qll | 47 +++++++++++++------ .../internal/TaintTrackingPrivate.qll | 3 +- 3 files changed, 38 insertions(+), 21 deletions(-) diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll index 2203ff8e1054..c4b696532b66 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll @@ -198,7 +198,7 @@ module LocalFlow { FlowSummaryNode nodeFrom, FlowSummaryNode nodeTo, FlowSummaryImpl::Public::SummarizedCallable c, string model ) { - FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom, nodeTo.getSummaryNode(), true, model) and + FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom, nodeTo, true, model) and c = nodeFrom.getSummarizedCallable() } @@ -1296,10 +1296,10 @@ class FlowSummaryNode extends NodeImpl, TFlowSummaryNode { override CfgScope getCfgScopeImpl() { none() } override DataFlowCallable getEnclosingCallable() { - result.asLibraryCallable() = this.getSummarizedCallable() + result = this.getSummaryNode().getEnclosingCallable() } - override EmptyLocation getLocationImpl() { any() } + override Location getLocationImpl() { result = this.getSummaryNode().getLocation() } override string toStringImpl() { result = this.getSummaryNode().toString() } } @@ -1778,8 +1778,7 @@ import OutNodes predicate jumpStep(Node pred, Node succ) { succ.asExpr().getExpr().(ConstantReadAccess).getValue() = pred.asExpr().getExpr() or - FlowSummaryImpl::Private::Steps::summaryJumpStep(pred.(FlowSummaryNode).getSummaryNode(), - succ.(FlowSummaryNode).getSummaryNode()) + FlowSummaryImpl::Private::Steps::summaryJumpStep(pred, succ) or any(AdditionalJumpStep s).step(pred, succ) or diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/FlowSummaryImpl.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/FlowSummaryImpl.qll index d94bba89bf5a..629ad0c284ee 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/FlowSummaryImpl.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/FlowSummaryImpl.qll @@ -12,16 +12,28 @@ private import DataFlowImplSpecific::Public module Input implements InputSig { private import codeql.util.Void - class SummarizedCallableBase = string; + class SummarizedCallableBase extends string { + bindingset[this] + SummarizedCallableBase() { exists(this) } - class SourceBase = Void; + bindingset[this] + Location getLocation() { result instanceof EmptyLocation } + } + + class SourceBase extends Void { + Location getLocation() { none() } + } - class SinkBase = Void; + class SinkBase = SourceBase; - class FlowSummaryCallBase = Void; + class FlowSummaryCallBase = SourceBase; predicate callableFromSource(SummarizedCallableBase c) { none() } + DataFlowCallable getSummarizedCallableAsDataFlowCallable(SummarizedCallableBase c) { + result.asLibraryCallable() = c + } + ArgumentPosition callbackSelfParameterPosition() { result.isLambdaSelf() } ReturnKind getStandardReturnValueKind() { result instanceof NormalReturnKind } @@ -158,28 +170,35 @@ module Input implements InputSig { private import Make as Impl -private module StepsInput implements Impl::Private::StepsInputSig { - Impl::Private::SummaryNode getSummaryNode(Node n) { - result = n.(FlowSummaryNode).getSummaryNode() +private module Input2 implements Impl::Private::InputSig2 { + private import codeql.util.Void + + class SourceSinkReportingElement extends Void { + Location getLocation() { none() } + + DataFlowCallable getEnclosingCallable() { none() } + + SourceSinkReportingElement getASuccessor(Impl::Private::SummaryComponent sc) { none() } } +} + +private import Impl::Private::Make2 as Impl2 + +private module StepsInput implements Impl2::StepsInputSig { + Impl2::SummaryNode getSummaryNode(Node n) { result = n.(FlowSummaryNode).getSummaryNode() } DataFlowCall getACall(Public::SummarizedCallable sc) { result.asCall().getAstNode() = sc.(LibraryCallable).getACall() or result.asCall().getAstNode() = sc.(LibraryCallable).getACallSimple() } - - DataFlowCallable getSourceNodeEnclosingCallable(Input::SourceBase source) { none() } - - Node getSourceNode(Input::SourceBase source, Impl::Private::SummaryComponentStack s) { none() } - - Node getSinkNode(Input::SinkBase sink, Impl::Private::SummaryComponent sc) { none() } } module Private { import Impl::Private + import Impl2 - module Steps = Impl::Private::Steps; + module Steps = Impl2::Steps; /** * Provides predicates for constructing summary components. diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/TaintTrackingPrivate.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/TaintTrackingPrivate.qll index a41f7c924820..c1675cd43d4c 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/TaintTrackingPrivate.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/TaintTrackingPrivate.qll @@ -109,8 +109,7 @@ private module Cached { ) and model = "" or - FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom, - nodeTo.(FlowSummaryNode).getSummaryNode(), false, model) + FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom, nodeTo, false, model) or any(FlowSteps::AdditionalTaintStep s).step(nodeFrom, nodeTo) and model = "AdditionalTaintStep" or From 385f721197d105980670d781a0d951a97abaf323 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 9 Jul 2026 14:09:06 +0200 Subject: [PATCH 0331/2098] Python: Adapt to FlowSummaryImpl changes --- .../new/internal/DataFlowDispatch.qll | 13 +----- .../dataflow/new/internal/DataFlowPrivate.qll | 6 +-- .../dataflow/new/internal/FlowSummaryImpl.qll | 46 +++++++++++++------ .../new/internal/TaintTrackingPrivate.qll | 3 +- 4 files changed, 37 insertions(+), 31 deletions(-) diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll index 23b49882445e..4a1f08315caf 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll @@ -1711,21 +1711,12 @@ class FlowSummaryNode extends Node, TFlowSummaryNode { } override DataFlowCallable getEnclosingCallable() { - result.asLibraryCallable() = this.getSummarizedCallable() + result = this.getSummaryNode().getEnclosingCallable() } override string toString() { result = this.getSummaryNode().toString() } - // Hack to return "empty location" - deprecated override predicate hasLocationInfo( - string file, int startline, int startcolumn, int endline, int endcolumn - ) { - file = "" and - startline = 0 and - startcolumn = 0 and - endline = 0 and - endcolumn = 0 - } + override Location getLocation() { result = this.getSummaryNode().getLocation() } } private class SummaryReturnNode extends FlowSummaryNode, ReturnNode { diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll index 01b9f04c01c4..c8a90b1cc598 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll @@ -529,8 +529,7 @@ predicate simpleLocalFlowStepForTypetracking(Node nodeFrom, Node nodeTo) { } private predicate summaryLocalStep(Node nodeFrom, Node nodeTo, string model) { - FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom, - nodeTo.(FlowSummaryNode).getSummaryNode(), true, model) + FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom, nodeTo, true, model) } predicate variableCaptureLocalFlowStep(Node nodeFrom, Node nodeTo) { @@ -697,8 +696,7 @@ predicate jumpStep(Node nodeFrom, Node nodeTo) { or jumpStepNotSharedWithTypeTracker(nodeFrom, nodeTo) or - FlowSummaryImpl::Private::Steps::summaryJumpStep(nodeFrom.(FlowSummaryNode).getSummaryNode(), - nodeTo.(FlowSummaryNode).getSummaryNode()) + FlowSummaryImpl::Private::Steps::summaryJumpStep(nodeFrom, nodeTo) } /** diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/FlowSummaryImpl.qll b/python/ql/lib/semmle/python/dataflow/new/internal/FlowSummaryImpl.qll index 22c2f75944a0..ca943351f833 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/FlowSummaryImpl.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/FlowSummaryImpl.qll @@ -14,16 +14,27 @@ private import DataFlowImplSpecific::Public module Input implements InputSig { private import codeql.util.Void - class SummarizedCallableBase = string; + class SummarizedCallableBase extends string { + bindingset[this] + SummarizedCallableBase() { exists(this) } - class SourceBase = Void; + Location getLocation() { none() } + } + + class SourceBase extends Void { + Location getLocation() { none() } + } - class SinkBase = Void; + class SinkBase = SourceBase; - class FlowSummaryCallBase = Void; + class FlowSummaryCallBase = SourceBase; predicate callableFromSource(SummarizedCallableBase c) { none() } + DataFlowCallable getSummarizedCallableAsDataFlowCallable(SummarizedCallableBase c) { + result.asLibraryCallable() = c + } + ArgumentPosition callbackSelfParameterPosition() { result.isLambdaSelf() } ReturnKind getStandardReturnValueKind() { any() } @@ -112,10 +123,22 @@ module Input implements InputSig private import Make as Impl -private module StepsInput implements Impl::Private::StepsInputSig { - Impl::Private::SummaryNode getSummaryNode(Node n) { - result = n.(FlowSummaryNode).getSummaryNode() +private module Input2 implements Impl::Private::InputSig2 { + private import codeql.util.Void + + class SourceSinkReportingElement extends Void { + Location getLocation() { none() } + + DataFlowCallable getEnclosingCallable() { none() } + + SourceSinkReportingElement getASuccessor(Impl::Private::SummaryComponent sc) { none() } } +} + +private import Impl::Private::Make2 as Impl2 + +private module StepsInput implements Impl2::StepsInputSig { + Impl2::SummaryNode getSummaryNode(Node n) { result = n.(FlowSummaryNode).getSummaryNode() } overlay[global] DataFlowCall getACall(Public::SummarizedCallable sc) { @@ -125,18 +148,13 @@ private module StepsInput implements Impl::Private::StepsInputSig { sc.(LibraryCallable).getACallSimple().asCfgNode() ]) } - - DataFlowCallable getSourceNodeEnclosingCallable(Input::SourceBase source) { none() } - - Node getSourceNode(Input::SourceBase source, Impl::Private::SummaryComponentStack s) { none() } - - Node getSinkNode(Input::SinkBase sink, Impl::Private::SummaryComponent sc) { none() } } module Private { import Impl::Private + import Impl2 - module Steps = Impl::Private::Steps; + module Steps = Impl2::Steps; /** * Provides predicates for constructing summary components. diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/TaintTrackingPrivate.qll b/python/ql/lib/semmle/python/dataflow/new/internal/TaintTrackingPrivate.qll index 50a6be72d9b5..b7285a1b3871 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/TaintTrackingPrivate.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/TaintTrackingPrivate.qll @@ -80,8 +80,7 @@ private module Cached { ) and model = "" or - FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom, - nodeTo.(DataFlowPrivate::FlowSummaryNode).getSummaryNode(), false, model) + FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom, nodeTo, false, model) } } From 0abb0388048f56892c5284f70b62e164261ac041 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 9 Jul 2026 14:12:38 +0200 Subject: [PATCH 0332/2098] C#: Adapt to FlowSummaryImpl changes --- .../dataflow/internal/DataFlowPrivate.qll | 10 ++-- .../dataflow/internal/FlowSummaryImpl.qll | 51 +++++++++++-------- .../internal/TaintTrackingPrivate.qll | 3 +- 3 files changed, 35 insertions(+), 29 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll index d12c65c9fffd..d114101a7a38 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll @@ -714,8 +714,7 @@ predicate simpleLocalFlowStep(Node nodeFrom, Node nodeTo, string model) { ) and model = "" or - FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom, - nodeTo.(FlowSummaryNode).getSummaryNode(), true, model) + FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom, nodeTo, true, model) } /** @@ -1778,7 +1777,7 @@ class FlowSummaryNode extends NodeImpl, TFlowSummaryNode { } override DataFlowCallable getEnclosingCallableImpl() { - result.asSummarizedCallable() = this.getSummarizedCallable() + result = this.getSummaryNode().getEnclosingCallable() } override DataFlowType getDataFlowType() { @@ -1789,7 +1788,7 @@ class FlowSummaryNode extends NodeImpl, TFlowSummaryNode { override ControlFlowNode getControlFlowNodeImpl() { none() } - override Location getLocationImpl() { result = this.getSummarizedCallable().getLocation() } + override Location getLocationImpl() { result = this.getSummaryNode().getLocation() } override string toStringImpl() { result = this.getSummaryNode().toString() } } @@ -2085,8 +2084,7 @@ predicate jumpStep(Node pred, Node succ) { ) ) or - FlowSummaryImpl::Private::Steps::summaryJumpStep(pred.(FlowSummaryNode).getSummaryNode(), - succ.(FlowSummaryNode).getSummaryNode()) + FlowSummaryImpl::Private::Steps::summaryJumpStep(pred, succ) or succ = pred.(LocalFunctionCreationNode).getAnAccess(false) } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll index f936a206e2b1..816b31580daf 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll @@ -30,11 +30,17 @@ module Input implements InputSig ) } - class SourceBase = Void; + class SourceBase extends Void { + Location getLocation() { none() } + } + + class SinkBase = SourceBase; - class SinkBase = Void; + class FlowSummaryCallBase = SourceBase; - class FlowSummaryCallBase = Void; + DataFlowCallable getSummarizedCallableAsDataFlowCallable(SummarizedCallableBase c) { + result.asSummarizedCallable() = c + } predicate neutralElement(SummarizedCallableBase c, string kind, string provenance, boolean isExact) { interpretNeutral(c, kind, provenance, isExact) @@ -122,7 +128,21 @@ module Input implements InputSig private import Make as Impl -private module TypesInput implements Impl::Private::TypesInputSig { +private module Input2 implements Impl::Private::InputSig2 { + private import codeql.util.Void + + class SourceSinkReportingElement extends Void { + Location getLocation() { none() } + + DataFlowCallable getEnclosingCallable() { none() } + + SourceSinkReportingElement getASuccessor(Impl::Private::SummaryComponent sc) { none() } + } +} + +private import Impl::Private::Make2 as Impl2 + +private module TypesInput implements Impl2::TypesInputSig { DataFlowType getSyntheticGlobalType(Impl::Private::SyntheticGlobal sg) { exists(sg) and result.asGvnType() = Gvn::getGlobalValueNumber(any(ObjectType t)) @@ -195,27 +215,15 @@ private module TypesInput implements Impl::Private::TypesInputSig { ) } - DataFlowType getSourceType(Input::SourceBase source, Impl::Private::SummaryComponentStack s) { - none() - } - - DataFlowType getSinkType(Input::SinkBase sink, Impl::Private::SummaryComponent sc) { none() } + DataFlowType getSourceSinkType(Input2::SourceSinkReportingElement e) { none() } } -private module StepsInput implements Impl::Private::StepsInputSig { - Impl::Private::SummaryNode getSummaryNode(Node n) { - result = n.(FlowSummaryNode).getSummaryNode() - } +private module StepsInput implements Impl2::StepsInputSig { + Impl2::SummaryNode getSummaryNode(Node n) { result = n.(FlowSummaryNode).getSummaryNode() } DataFlowCall getACall(Public::SummarizedCallable sc) { sc = viableCallable(result).asSummarizedCallable() } - - DataFlowCallable getSourceNodeEnclosingCallable(Input::SourceBase source) { none() } - - Node getSourceNode(Input::SourceBase source, Impl::Private::SummaryComponentStack s) { none() } - - Node getSinkNode(Input::SinkBase sink, Impl::Private::SummaryComponent sc) { none() } } module SourceSinkInterpretationInput implements @@ -339,9 +347,10 @@ module SourceSinkInterpretationInput implements module Private { import Impl::Private - import Impl::Private::Types + import Impl2 + import Types - module Steps = Impl::Private::Steps; + module Steps = Impl2::Steps; module External { import Impl::Private::External diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll index e51eaf4bbcb4..2c90aa678050 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll @@ -171,8 +171,7 @@ private module Cached { ) and model = "" or - FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom, - nodeTo.(FlowSummaryNode).getSummaryNode(), false, model) + FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom, nodeTo, false, model) } } From c37ef2427ad016efefb1ac6ffa8785991dfa3104 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 9 Jul 2026 14:15:32 +0200 Subject: [PATCH 0333/2098] Swift: Adapt to FlowSummaryImpl changes --- .../dataflow/internal/DataFlowPrivate.qll | 10 ++--- .../dataflow/internal/FlowSummaryImpl.qll | 37 +++++++++++++------ .../internal/TaintTrackingPrivate.qll | 3 +- 3 files changed, 30 insertions(+), 20 deletions(-) diff --git a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowPrivate.qll b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowPrivate.qll index 135924c0eb72..715743b5fe93 100644 --- a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowPrivate.qll +++ b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowPrivate.qll @@ -305,8 +305,7 @@ private module Cached { model = "" or // flow through a flow summary (extension of `SummaryModelCsv`) - FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom, - nodeTo.(FlowSummaryNode).getSummaryNode(), true, model) + FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom, nodeTo, true, model) } /** @@ -497,10 +496,10 @@ class FlowSummaryNode extends NodeImpl, TFlowSummaryNode { } override DataFlowCallable getEnclosingCallable() { - result.asSummarizedCallable() = this.getSummarizedCallable() + result = this.getSummaryNode().getEnclosingCallable() } - override Location getLocationImpl() { result = this.getSummarizedCallable().getLocation() } + override Location getLocationImpl() { result = this.getSummaryNode().getLocation() } override string toStringImpl() { result = this.getSummaryNode().toString() } } @@ -1014,8 +1013,7 @@ predicate captureValueStep(Node node1, Node node2) { predicate jumpStep(Node pred, Node succ) { // models-as-data summarized flow - FlowSummaryImpl::Private::Steps::summaryJumpStep(pred.(FlowSummaryNode).getSummaryNode(), - succ.(FlowSummaryNode).getSummaryNode()) + FlowSummaryImpl::Private::Steps::summaryJumpStep(pred, succ) } predicate storeStep(Node node1, ContentSet c, Node node2) { diff --git a/swift/ql/lib/codeql/swift/dataflow/internal/FlowSummaryImpl.qll b/swift/ql/lib/codeql/swift/dataflow/internal/FlowSummaryImpl.qll index 6ca8e12ef6b6..4c83edf66823 100644 --- a/swift/ql/lib/codeql/swift/dataflow/internal/FlowSummaryImpl.qll +++ b/swift/ql/lib/codeql/swift/dataflow/internal/FlowSummaryImpl.qll @@ -16,14 +16,20 @@ module Input implements InputSig class SummarizedCallableBase = Function; - class SourceBase = Void; + class SourceBase extends Void { + Location getLocation() { none() } + } - class SinkBase = Void; + class SinkBase = SourceBase; - class FlowSummaryCallBase = Void; + class FlowSummaryCallBase = SourceBase; predicate callableFromSource(SummarizedCallableBase c) { c.hasBody() } + DataFlowCallable getSummarizedCallableAsDataFlowCallable(SummarizedCallableBase c) { + result.asSummarizedCallable() = c + } + ArgumentPosition callbackSelfParameterPosition() { result instanceof ThisArgumentPosition } ReturnKind getStandardReturnValueKind() { result instanceof NormalReturnKind } @@ -114,18 +120,24 @@ module Input implements InputSig private import Make as Impl -private module StepsInput implements Impl::Private::StepsInputSig { - Impl::Private::SummaryNode getSummaryNode(Node n) { - result = n.(FlowSummaryNode).getSummaryNode() - } +private module Input2 implements Impl::Private::InputSig2 { + private import codeql.util.Void - DataFlowCall getACall(Public::SummarizedCallable sc) { result.asCall().getStaticTarget() = sc } + class SourceSinkReportingElement extends Void { + Location getLocation() { none() } - DataFlowCallable getSourceNodeEnclosingCallable(Input::SourceBase source) { none() } + DataFlowCallable getEnclosingCallable() { none() } - Node getSourceNode(Input::SourceBase source, Impl::Private::SummaryComponentStack s) { none() } + SourceSinkReportingElement getASuccessor(Impl::Private::SummaryComponent sc) { none() } + } +} + +private import Impl::Private::Make2 as Impl2 - Node getSinkNode(Input::SinkBase sink, Impl::Private::SummaryComponent sc) { none() } +private module StepsInput implements Impl2::StepsInputSig { + Impl2::SummaryNode getSummaryNode(Node n) { result = n.(FlowSummaryNode).getSummaryNode() } + + DataFlowCall getACall(Public::SummarizedCallable sc) { result.asCall().getStaticTarget() = sc } } module SourceSinkInterpretationInput implements @@ -252,8 +264,9 @@ module SourceSinkInterpretationInput implements module Private { import Impl::Private + import Impl2 - module Steps = Impl::Private::Steps; + module Steps = Impl2::Steps; module External { import Impl::Private::External diff --git a/swift/ql/lib/codeql/swift/dataflow/internal/TaintTrackingPrivate.qll b/swift/ql/lib/codeql/swift/dataflow/internal/TaintTrackingPrivate.qll index 6960dcf6177f..ace77e4584b5 100644 --- a/swift/ql/lib/codeql/swift/dataflow/internal/TaintTrackingPrivate.qll +++ b/swift/ql/lib/codeql/swift/dataflow/internal/TaintTrackingPrivate.qll @@ -76,8 +76,7 @@ private module Cached { model = "" or // flow through a flow summary (extension of `SummaryModelCsv`) - FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom, - nodeTo.(FlowSummaryNode).getSummaryNode(), false, model) + FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom, nodeTo, false, model) or any(AdditionalTaintStep a).step(nodeFrom, nodeTo) and model = "AdditionalTaintStep" } From b1c5b5b3af0479ead50a8a61eef7772ef24c2420 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 9 Jul 2026 14:18:31 +0200 Subject: [PATCH 0334/2098] Java: Adapt to FlowSummaryImpl changes --- .../java/dataflow/internal/DataFlowNodes.qll | 4 +- .../dataflow/internal/DataFlowPrivate.qll | 3 +- .../java/dataflow/internal/DataFlowUtil.qll | 3 +- .../dataflow/internal/FlowSummaryImpl.qll | 51 +++++++++++-------- .../dataflow/internal/TaintTrackingUtil.qll | 3 +- .../localAdditionalTaintStep.ql | 2 +- 6 files changed, 36 insertions(+), 30 deletions(-) diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowNodes.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowNodes.qll index 8957442b39ac..5a0df6a222c6 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowNodes.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowNodes.qll @@ -439,7 +439,7 @@ module Private { result.asCallable() = n.(ImplicitInstanceAccess).getInstanceAccess().getEnclosingCallable() or result.asCallable() = n.(MallocNode).getClassInstanceExpr().getEnclosingCallable() or result = nodeGetEnclosingCallable(n.(ImplicitPostUpdateNode).getPreUpdateNode()) or - result.asSummarizedCallable() = n.(FlowSummaryNode).getSummarizedCallable() or + result = n.(FlowSummaryNode).getSummaryNode().getEnclosingCallable() or result.asCallable() = n.(CaptureNode).getSynthesizedCaptureNode().getEnclosingCallable() or result.asFieldScope() = n.(FieldValueNode).getField() or result.asCallable() = any(Expr e | n.(AdditionalNode).nodeAt(e, _)).getEnclosingCallable() or @@ -531,7 +531,7 @@ module Private { result = this.getSummaryNode().getSummarizedCallable() } - override Location getLocation() { result = this.getSummarizedCallable().getLocation() } + override Location getLocation() { result = this.getSummaryNode().getLocation() } override string toString() { result = this.getSummaryNode().toString() } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowPrivate.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowPrivate.qll index 3dcdc1887614..e727e698e5fa 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowPrivate.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowPrivate.qll @@ -199,8 +199,7 @@ predicate jumpStep(Node node1, Node node2) { any(AdditionalValueStep a).step(node1, node2) and node1.getEnclosingCallable() != node2.getEnclosingCallable() or - FlowSummaryImpl::Private::Steps::summaryJumpStep(node1.(FlowSummaryNode).getSummaryNode(), - node2.(FlowSummaryNode).getSummaryNode()) + FlowSummaryImpl::Private::Steps::summaryJumpStep(node1, node2) } /** 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 e1df870da7eb..4dea36c40b81 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowUtil.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowUtil.qll @@ -247,8 +247,7 @@ private predicate simpleLocalFlowStep0(Node node1, Node node2, string model) { or cloneStep(node1, node2) and model = "CloneStep" or - FlowSummaryImpl::Private::Steps::summaryLocalStep(node1, node2.(FlowSummaryNode).getSummaryNode(), - true, model) + FlowSummaryImpl::Private::Steps::summaryLocalStep(node1, node2, true, model) } /** diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImpl.qll b/java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImpl.qll index 5ff113db730e..20d26c67baac 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImpl.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImpl.qll @@ -37,11 +37,17 @@ module Input implements InputSig { sc.asCallable() = any(Callable c | c.fromSource() and not c.isStub()) } - class SourceBase = Void; + class SourceBase extends Void { + Location getLocation() { none() } + } + + class SinkBase = SourceBase; - class SinkBase = Void; + class FlowSummaryCallBase = SourceBase; - class FlowSummaryCallBase = Void; + DataFlowCallable getSummarizedCallableAsDataFlowCallable(SummarizedCallableBase c) { + result.asSummarizedCallable() = c + } predicate neutralElement( Input::SummarizedCallableBase c, string kind, string provenance, boolean isExact @@ -110,7 +116,21 @@ module Input implements InputSig { private import Make as Impl -private module TypesInput implements Impl::Private::TypesInputSig { +private module Input2 implements Impl::Private::InputSig2 { + private import codeql.util.Void + + class SourceSinkReportingElement extends Void { + Location getLocation() { none() } + + DataFlowCallable getEnclosingCallable() { none() } + + SourceSinkReportingElement getASuccessor(Impl::Private::SummaryComponent sc) { none() } + } +} + +private import Impl::Private::Make2 as Impl2 + +private module TypesInput implements Impl2::TypesInputSig { DataFlowType getSyntheticGlobalType(Impl::Private::SyntheticGlobal sg) { exists(sg) and result instanceof TypeObject @@ -138,27 +158,15 @@ private module TypesInput implements Impl::Private::TypesInputSig { exists(rk) } - DataFlowType getSourceType(Input::SourceBase source, Impl::Private::SummaryComponentStack s) { - none() - } - - DataFlowType getSinkType(Input::SinkBase sink, Impl::Private::SummaryComponent sc) { none() } + DataFlowType getSourceSinkType(Input2::SourceSinkReportingElement e) { none() } } -private module StepsInput implements Impl::Private::StepsInputSig { - Impl::Private::SummaryNode getSummaryNode(Node n) { - result = n.(FlowSummaryNode).getSummaryNode() - } +private module StepsInput implements Impl2::StepsInputSig { + Impl2::SummaryNode getSummaryNode(Node n) { result = n.(FlowSummaryNode).getSummaryNode() } DataFlowCall getACall(Public::SummarizedCallable sc) { sc = viableCallable(result).asSummarizedCallable() } - - DataFlowCallable getSourceNodeEnclosingCallable(Input::SourceBase source) { none() } - - Node getSourceNode(Input::SourceBase source, Impl::Private::SummaryComponentStack s) { none() } - - Node getSinkNode(Input::SinkBase sink, Impl::Private::SummaryComponent sc) { none() } } private predicate relatedArgSpec(Callable c, string spec) { @@ -372,9 +380,10 @@ module SourceSinkInterpretationInput implements module Private { import Impl::Private - import Impl::Private::Types + import Impl2 + import Types - module Steps = Impl::Private::Steps; + module Steps = Impl2::Steps; module External { import Impl::Private::External diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/TaintTrackingUtil.qll b/java/ql/lib/semmle/code/java/dataflow/internal/TaintTrackingUtil.qll index dc6b075aed31..7cf0c3d536b3 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/TaintTrackingUtil.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/TaintTrackingUtil.qll @@ -145,8 +145,7 @@ private module Cached { ) ) or - FlowSummaryImpl::Private::Steps::summaryLocalStep(src, - sink.(DataFlowPrivate::FlowSummaryNode).getSummaryNode(), false, model) + FlowSummaryImpl::Private::Steps::summaryLocalStep(src, sink, false, model) } /** diff --git a/java/ql/test/library-tests/dataflow/local-additional-taint/localAdditionalTaintStep.ql b/java/ql/test/library-tests/dataflow/local-additional-taint/localAdditionalTaintStep.ql index ce43c1a216aa..dc1aa584a890 100644 --- a/java/ql/test/library-tests/dataflow/local-additional-taint/localAdditionalTaintStep.ql +++ b/java/ql/test/library-tests/dataflow/local-additional-taint/localAdditionalTaintStep.ql @@ -13,7 +13,7 @@ predicate taintFlowUpdate(DataFlow::ParameterNode p1, DataFlow::ParameterNode p2 } predicate summaryStep(FlowSummaryNode src, FlowSummaryNode sink) { - FlowSummaryImpl::Private::Steps::summaryLocalStep(src, sink.getSummaryNode(), false, _) or + FlowSummaryImpl::Private::Steps::summaryLocalStep(src, sink, false, _) or FlowSummaryImpl::Private::Steps::summaryReadStep(src.getSummaryNode(), _, sink.getSummaryNode()) or FlowSummaryImpl::Private::Steps::summaryStoreStep(src.getSummaryNode(), _, sink.getSummaryNode()) } From 8614e9706522f0db4cec3728fd64f6fb40b049f0 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 9 Jul 2026 14:35:26 +0200 Subject: [PATCH 0335/2098] JS: Adapt to FlowSummaryImpl changes --- .../dataflow/internal/DataFlowPrivate.qll | 10 ++--- .../dataflow/internal/FlowSummaryPrivate.qll | 44 +++++++++++++------ .../internal/TaintTrackingPrivate.qll | 3 +- .../internal/sharedlib/DataFlowArg.qll | 2 - .../internal/sharedlib/FlowSummaryImpl.qll | 11 ++++- 5 files changed, 47 insertions(+), 23 deletions(-) diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/DataFlowPrivate.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/DataFlowPrivate.qll index 922dd5acc869..1c3eb1dc9e31 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/DataFlowPrivate.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/DataFlowPrivate.qll @@ -65,6 +65,8 @@ class FlowSummaryNode extends DataFlow::Node, TFlowSummaryNode { cached override string toString() { result = this.getSummaryNode().toString() } + + override Location getLocation() { result = this.getSummaryNode().getLocation() } } class FlowSummaryDynamicParameterArrayNode extends DataFlow::Node, @@ -541,7 +543,7 @@ predicate isArgumentNode(ArgumentNode n, DataFlowCall call, ArgumentPosition pos DataFlowCallable nodeGetEnclosingCallable(Node node) { result.asSourceCallable() = node.getContainer() or - result.asLibraryCallable() = node.(FlowSummaryNode).getSummarizedCallable() + result = node.(FlowSummaryNode).getSummaryNode().getEnclosingCallable() or result.asLibraryCallable() = node.(FlowSummaryDynamicParameterArrayNode).getSummarizedCallable() or @@ -1212,8 +1214,7 @@ private predicate valuePreservingStep(Node node1, Node node2) { or node2 = FlowSteps::getThrowTarget(node1) or - FlowSummaryPrivate::Steps::summaryLocalStep(node1, node2.(FlowSummaryNode).getSummaryNode(), true, - _) // TODO: preserve 'model' + FlowSummaryPrivate::Steps::summaryLocalStep(node1, node2, true, _) // TODO: preserve 'model' } predicate knownSourceModel(Node sink, string model) { none() } @@ -1365,8 +1366,7 @@ predicate jumpStep(Node node1, Node node2) { node1.getContainer() != node2.getContainer() and not excludedJumpStep(node1, node2) or - FlowSummaryPrivate::Steps::summaryJumpStep(node1.(FlowSummaryNode).getSummaryNode(), - node2.(FlowSummaryNode).getSummaryNode()) + FlowSummaryPrivate::Steps::summaryJumpStep(node1, node2) or DataFlow::AdditionalFlowStep::jumpStep(node1, node2) } diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/FlowSummaryPrivate.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/FlowSummaryPrivate.qll index a7519f4180b4..ba0d84d2a6bf 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/FlowSummaryPrivate.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/FlowSummaryPrivate.qll @@ -12,18 +12,28 @@ private import sharedlib.FlowSummaryImpl::Private as Private private import sharedlib.FlowSummaryImpl::Public private import codeql.dataflow.internal.AccessPathSyntax as AccessPathSyntax private import semmle.javascript.internal.flow_summaries.ExceptionFlow +private import codeql.util.Void /** * A class of callables that are candidates for flow summary modeling. */ -class SummarizedCallableBase = string; +class SummarizedCallableBase extends string { + bindingset[this] + SummarizedCallableBase() { exists(this) } -class SourceBase extends Unit { - SourceBase() { none() } + Location getLocation() { none() } } -class SinkBase extends Unit { - SinkBase() { none() } +class SourceBase extends Void { + Location getLocation() { none() } +} + +class SinkBase = SourceBase; + +class FlowSummaryCallBase = SourceBase; + +DataFlowCallable getSummarizedCallableAsDataFlowCallable(SummarizedCallableBase c) { + result.asLibraryCallable() = c } /** Gets the parameter position representing a callback itself, if any. */ @@ -141,8 +151,22 @@ string encodeArgumentPosition(ArgumentPosition pos) { /** Gets the return kind corresponding to specification `"ReturnValue"`. */ ReturnKind getStandardReturnValueKind() { result = MkNormalReturnKind() and Stage::ref() } -private module FlowSummaryStepInput implements Private::StepsInputSig { - Private::SummaryNode getSummaryNode(DataFlow::Node n) { +private module Input2 implements Private::InputSig2 { + private import codeql.util.Void + + class SourceSinkReportingElement extends Void { + Location getLocation() { none() } + + DataFlowCallable getEnclosingCallable() { none() } + + SourceSinkReportingElement getASuccessor(Private::SummaryComponent sc) { none() } + } +} + +import Private::Make2 as Impl2 + +private module FlowSummaryStepInput implements Impl2::StepsInputSig { + Impl2::SummaryNode getSummaryNode(DataFlow::Node n) { result = n.(FlowSummaryNode).getSummaryNode() } @@ -156,12 +180,6 @@ private module FlowSummaryStepInput implements Private::StepsInputSig { ] ) } - - DataFlowCallable getSourceNodeEnclosingCallable(SourceBase source) { none() } - - DataFlow::Node getSourceNode(SourceBase source, Private::SummaryComponentStack s) { none() } - - DataFlow::Node getSinkNode(SinkBase sink, Private::SummaryComponent sc) { none() } } module Steps = Private::Steps; diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/TaintTrackingPrivate.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/TaintTrackingPrivate.qll index e7b3a6e5658a..61678d6fbdab 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/TaintTrackingPrivate.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/TaintTrackingPrivate.qll @@ -12,8 +12,7 @@ cached predicate defaultAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { TaintTracking::AdditionalTaintStep::step(node1, node2) or - FlowSummaryPrivate::Steps::summaryLocalStep(node1, node2.(FlowSummaryNode).getSummaryNode(), - false, _) // TODO: preserve 'model' parameter + FlowSummaryPrivate::Steps::summaryLocalStep(node1, node2, false, _) // TODO: preserve 'model' parameter or // Convert steps out of array elements to plain taint steps FlowSummaryPrivate::Steps::summaryReadStep(node1.(FlowSummaryNode).getSummaryNode(), diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/sharedlib/DataFlowArg.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/sharedlib/DataFlowArg.qll index 0f0966cb27c9..494a216696d5 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/sharedlib/DataFlowArg.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/sharedlib/DataFlowArg.qll @@ -29,8 +29,6 @@ module JSFlowSummary implements FlowSummaryImpl::InputSig private import semmle.javascript.dataflow.internal.FlowSummaryPrivate as FlowSummaryPrivate import FlowSummaryPrivate - class FlowSummaryCallBase = Void; - overlay[local] predicate callableFromSource(SummarizedCallableBase c) { none() } diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/sharedlib/FlowSummaryImpl.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/sharedlib/FlowSummaryImpl.qll index bf370eb9a271..93245cdf9088 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/sharedlib/FlowSummaryImpl.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/sharedlib/FlowSummaryImpl.qll @@ -1,4 +1,13 @@ private import semmle.javascript.Locations private import codeql.dataflow.internal.FlowSummaryImpl private import DataFlowArg -import Make +private import semmle.javascript.dataflow.internal.FlowSummaryPrivate as Priv + +private module Impl = Make; + +module Private { + import Impl::Private + import Priv::Impl2 +} + +module Public = Impl::Public; From 2418e606aeedc1966fbd2e76a90eb2de738da765 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Wed, 5 Aug 2026 14:29:08 +0200 Subject: [PATCH 0336/2098] Rust: Add change note --- .../2026-08-05-data-flow-alert-locations.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 rust/ql/lib/change-notes/2026-08-05-data-flow-alert-locations.md diff --git a/rust/ql/lib/change-notes/2026-08-05-data-flow-alert-locations.md b/rust/ql/lib/change-notes/2026-08-05-data-flow-alert-locations.md new file mode 100644 index 000000000000..d5691b49750b --- /dev/null +++ b/rust/ql/lib/change-notes/2026-08-05-data-flow-alert-locations.md @@ -0,0 +1,12 @@ +--- +category: majorAnalysis +--- +* The alert locations for data flow queries have been improved. The new locations are more precise and are based on the actual source and sink nodes. Example: +```rust +let _ = conn.query( +// ^^^^ old alert location + unsafe_query.as_str(), +// ^^^^^^^^^^^^^^^^^^^^^ new alert location +)?; +``` +This means that some alerts will have their locations changed, and hence appear as new alerts (while the old alerts will disappear). \ No newline at end of file From 163e3ca8b0a12784e2a5da8f3114d66b10a129a7 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 10 Aug 2026 09:35:09 +0200 Subject: [PATCH 0337/2098] FlowSummaryImpl: Fix CP --- .../dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll b/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll index 48ce4f30ca3e..05e3bb96d7b5 100644 --- a/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll +++ b/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll @@ -2218,9 +2218,11 @@ module Make< ) ) or - exists(SourceElement source, SourceSinkReportingElement e | - n.(SourceOutputNode).isExit(source, _, e, _) and - result = getSourceSinkType(e) + exists(SourceElement source | + exists(SourceSinkReportingElement e | + n.(SourceOutputNode).isExit(source, _, e, _) and + result = getSourceSinkType(e) + ) or exists(SummaryComponentStack s, ContentSet cont | n = sourceElementOutputState(source, _, s) and From 4fda454c60e9171d1f967dfda8d74cc90d7f45ab Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 13 Aug 2026 21:11:04 +0200 Subject: [PATCH 0338/2098] Address review comments --- .../dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll b/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll index 05e3bb96d7b5..32273b92507f 100644 --- a/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll +++ b/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll @@ -1897,7 +1897,7 @@ module Make< not this.isExit(_, _) and ( exists(SummaryComponentStack stack | - state_.isSourceOutputState(_, stack, _, _) and + state_.isSinkInputState(_, stack, _, _) and stack.head() instanceof TContentSummaryComponent ) or @@ -2412,10 +2412,10 @@ module Make< ) ) or - sourceExitStep(StepsInput::getSummaryNode(pred), succ, false) - or - sinkEntryStep(pred, StepsInput::getSummaryNode(succ), false) + sourceExitStep(predSummary, succ, false) ) + or + sinkEntryStep(pred, StepsInput::getSummaryNode(succ), false) } /** From 5c0b66f673af3cb1fcb953aa56b807af9ecd42b3 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 13 Aug 2026 21:32:30 +0200 Subject: [PATCH 0339/2098] Rust: Update expected test output following bug fix --- .../dataflow/models/models.expected | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/rust/ql/test/library-tests/dataflow/models/models.expected b/rust/ql/test/library-tests/dataflow/models/models.expected index c4fabc6cc1e5..75e57a39edd7 100644 --- a/rust/ql/test/library-tests/dataflow/models/models.expected +++ b/rust/ql/test/library-tests/dataflow/models/models.expected @@ -299,10 +299,8 @@ edges | main.rs:351:39:351:53 | ...::Some(...) [Some] | main.rs:351:13:351:55 | ...::E {...} [E, Some] | provenance | | | main.rs:351:52:351:52 | s | main.rs:351:39:351:53 | ...::Some(...) [Some] | provenance | | | main.rs:351:52:351:52 | s | main.rs:351:39:351:53 | ...::Some(...) [Some] | provenance | | -| main.rs:353:26:353:26 | b [E, Some] | main.rs:353:26:353:26 | b [Some] | provenance | | -| main.rs:353:26:353:26 | b [E, Some] | main.rs:353:26:353:26 | b [Some] | provenance | | -| main.rs:353:26:353:26 | b [Some] | main.rs:353:26:353:26 | b | provenance | Sink:MaD:8 | -| main.rs:353:26:353:26 | b [Some] | main.rs:353:26:353:26 | b | provenance | Sink:MaD:8 | +| main.rs:353:26:353:26 | b [E, Some] | main.rs:353:26:353:26 | b | provenance | Sink:MaD:8 | +| main.rs:353:26:353:26 | b [E, Some] | main.rs:353:26:353:26 | b | provenance | Sink:MaD:8 | | main.rs:364:9:364:9 | s | main.rs:365:41:365:41 | s | provenance | | | main.rs:364:9:364:9 | s | main.rs:365:41:365:41 | s | provenance | | | main.rs:364:9:364:9 | s | main.rs:368:53:368:53 | s | provenance | | @@ -313,10 +311,8 @@ edges | main.rs:365:15:365:43 | ...::C {...} [C] | main.rs:365:15:365:43 | ...::C {...} | provenance | Sink:MaD:2 | | main.rs:365:41:365:41 | s | main.rs:365:15:365:43 | ...::C {...} [C] | provenance | | | main.rs:365:41:365:41 | s | main.rs:365:15:365:43 | ...::C {...} [C] | provenance | | -| main.rs:368:22:368:56 | ...::E {...} [E, Some] | main.rs:368:22:368:56 | ...::E {...} [Some] | provenance | | -| main.rs:368:22:368:56 | ...::E {...} [E, Some] | main.rs:368:22:368:56 | ...::E {...} [Some] | provenance | | -| main.rs:368:22:368:56 | ...::E {...} [Some] | main.rs:368:22:368:56 | ...::E {...} | provenance | Sink:MaD:3 | -| main.rs:368:22:368:56 | ...::E {...} [Some] | main.rs:368:22:368:56 | ...::E {...} | provenance | Sink:MaD:3 | +| main.rs:368:22:368:56 | ...::E {...} [E, Some] | main.rs:368:22:368:56 | ...::E {...} | provenance | Sink:MaD:3 | +| main.rs:368:22:368:56 | ...::E {...} [E, Some] | main.rs:368:22:368:56 | ...::E {...} | provenance | Sink:MaD:3 | | main.rs:368:48:368:54 | Some(...) [Some] | main.rs:368:22:368:56 | ...::E {...} [E, Some] | provenance | | | main.rs:368:48:368:54 | Some(...) [Some] | main.rs:368:22:368:56 | ...::E {...} [E, Some] | provenance | | | main.rs:368:53:368:53 | s | main.rs:368:48:368:54 | Some(...) [Some] | provenance | | @@ -696,8 +692,6 @@ nodes | main.rs:353:26:353:26 | b | semmle.label | b | | main.rs:353:26:353:26 | b [E, Some] | semmle.label | b [E, Some] | | main.rs:353:26:353:26 | b [E, Some] | semmle.label | b [E, Some] | -| main.rs:353:26:353:26 | b [Some] | semmle.label | b [Some] | -| main.rs:353:26:353:26 | b [Some] | semmle.label | b [Some] | | main.rs:364:9:364:9 | s | semmle.label | s | | main.rs:364:9:364:9 | s | semmle.label | s | | main.rs:364:13:364:22 | source(...) | semmle.label | source(...) | @@ -712,8 +706,6 @@ nodes | main.rs:368:22:368:56 | ...::E {...} | semmle.label | ...::E {...} | | main.rs:368:22:368:56 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | | main.rs:368:22:368:56 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | -| main.rs:368:22:368:56 | ...::E {...} [Some] | semmle.label | ...::E {...} [Some] | -| main.rs:368:22:368:56 | ...::E {...} [Some] | semmle.label | ...::E {...} [Some] | | main.rs:368:48:368:54 | Some(...) [Some] | semmle.label | Some(...) [Some] | | main.rs:368:48:368:54 | Some(...) [Some] | semmle.label | Some(...) [Some] | | main.rs:368:53:368:53 | s | semmle.label | s | From ce7fee4e97f4e671223df44f26b2e62d0f5d499b Mon Sep 17 00:00:00 2001 From: hugo-syn Date: Sat, 15 Aug 2026 12:25:14 +0200 Subject: [PATCH 0340/2098] C#: add AdditionalTaintStep extension point for taint-tracking Mirrors Java's AdditionalTaintStep (java/ql/lib/semmle/code/java/dataflow/FlowSteps.qll) and Ruby/Swift's existing ports of the same pattern: a `Unit`-based class that lets library code contribute additional taint steps applied to every taint-tracking configuration, with zero opt-in required. Wired into defaultAdditionalTaintStep in TaintTrackingPrivate.qll, tagged with model = "AdditionalTaintStep" for provenance. Co-Authored-By: Claude Sonnet 5 --- .../2026-08-15-additional-taint-step.md | 4 ++++ .../semmle/code/csharp/dataflow/FlowSteps.qll | 20 +++++++++++++++++++ .../internal/TaintTrackingPrivate.qll | 3 +++ .../AdditionalTaintStep.expected | 1 + .../AdditionalTaintStep.ql | 7 +++++++ .../dataflow/additional-taint-step/Test.cs | 18 +++++++++++++++++ .../TestAdditionalTaintStep.qll | 19 ++++++++++++++++++ 7 files changed, 72 insertions(+) create mode 100644 csharp/ql/lib/change-notes/2026-08-15-additional-taint-step.md create mode 100644 csharp/ql/lib/semmle/code/csharp/dataflow/FlowSteps.qll create mode 100644 csharp/ql/test/library-tests/dataflow/additional-taint-step/AdditionalTaintStep.expected create mode 100644 csharp/ql/test/library-tests/dataflow/additional-taint-step/AdditionalTaintStep.ql create mode 100644 csharp/ql/test/library-tests/dataflow/additional-taint-step/Test.cs create mode 100644 csharp/ql/test/library-tests/dataflow/additional-taint-step/TestAdditionalTaintStep.qll diff --git a/csharp/ql/lib/change-notes/2026-08-15-additional-taint-step.md b/csharp/ql/lib/change-notes/2026-08-15-additional-taint-step.md new file mode 100644 index 000000000000..6b87eef63b3a --- /dev/null +++ b/csharp/ql/lib/change-notes/2026-08-15-additional-taint-step.md @@ -0,0 +1,4 @@ +--- +category: feature +--- +* Added the `AdditionalTaintStep` extension point (`semmle.code.csharp.dataflow.FlowSteps`). Extend this class to add additional taint steps that apply to all taint-tracking configurations. diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/FlowSteps.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/FlowSteps.qll new file mode 100644 index 000000000000..6be7cd936ff1 --- /dev/null +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/FlowSteps.qll @@ -0,0 +1,20 @@ +/** + * Provides classes representing various flow steps for taint tracking. + */ + +private import codeql.util.Unit +private import semmle.code.csharp.dataflow.DataFlow + +/** + * A unit class for adding additional taint steps. + * + * Extend this class to add additional taint steps that should apply to all + * taint configurations. + */ +class AdditionalTaintStep extends Unit { + /** + * Holds if the step from `node1` to `node2` should be considered a taint + * step for all configurations. + */ + abstract predicate step(DataFlow::Node node1, DataFlow::Node node2); +} diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll index e51eaf4bbcb4..131b2cb72e73 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll @@ -2,6 +2,7 @@ private import csharp private import TaintTrackingPublic private import FlowSummaryImpl as FlowSummaryImpl private import semmle.code.csharp.Caching +private import semmle.code.csharp.dataflow.FlowSteps private import semmle.code.csharp.dataflow.internal.DataFlowDispatch private import semmle.code.csharp.dataflow.internal.DataFlowPrivate private import semmle.code.csharp.dispatch.Dispatch @@ -173,6 +174,8 @@ private module Cached { or FlowSummaryImpl::Private::Steps::summaryLocalStep(nodeFrom, nodeTo.(FlowSummaryNode).getSummaryNode(), false, model) + or + any(AdditionalTaintStep a).step(nodeFrom, nodeTo) and model = "AdditionalTaintStep" } } diff --git a/csharp/ql/test/library-tests/dataflow/additional-taint-step/AdditionalTaintStep.expected b/csharp/ql/test/library-tests/dataflow/additional-taint-step/AdditionalTaintStep.expected new file mode 100644 index 000000000000..acd241d386f5 --- /dev/null +++ b/csharp/ql/test/library-tests/dataflow/additional-taint-step/AdditionalTaintStep.expected @@ -0,0 +1 @@ +| Test.cs:13:35:13:45 | access to parameter taintSource | Test.cs:13:23:13:46 | call to method Step | AdditionalTaintStep | diff --git a/csharp/ql/test/library-tests/dataflow/additional-taint-step/AdditionalTaintStep.ql b/csharp/ql/test/library-tests/dataflow/additional-taint-step/AdditionalTaintStep.ql new file mode 100644 index 000000000000..b499c2ce51d1 --- /dev/null +++ b/csharp/ql/test/library-tests/dataflow/additional-taint-step/AdditionalTaintStep.ql @@ -0,0 +1,7 @@ +import csharp +import semmle.code.csharp.dataflow.internal.TaintTrackingPrivate +import TestAdditionalTaintStep + +from DataFlow::Node src, DataFlow::Node sink, string model +where defaultAdditionalTaintStep(src, sink, model) and model = "AdditionalTaintStep" +select src, sink, model diff --git a/csharp/ql/test/library-tests/dataflow/additional-taint-step/Test.cs b/csharp/ql/test/library-tests/dataflow/additional-taint-step/Test.cs new file mode 100644 index 000000000000..051793e2c855 --- /dev/null +++ b/csharp/ql/test/library-tests/dataflow/additional-taint-step/Test.cs @@ -0,0 +1,18 @@ +class Marker +{ + // A stand-in for a framework method that isn't otherwise understood by the + // taint-tracking library, whose taint behaviour is modelled by a test-only + // `AdditionalTaintStep` subclass instead. + public static object Step(object x) => new object(); +} + +class Test +{ + void M(object taintSource) + { + var tainted = Marker.Step(taintSource); + Sink(tainted); + } + + static void Sink(object o) { } +} diff --git a/csharp/ql/test/library-tests/dataflow/additional-taint-step/TestAdditionalTaintStep.qll b/csharp/ql/test/library-tests/dataflow/additional-taint-step/TestAdditionalTaintStep.qll new file mode 100644 index 000000000000..d17109ba730c --- /dev/null +++ b/csharp/ql/test/library-tests/dataflow/additional-taint-step/TestAdditionalTaintStep.qll @@ -0,0 +1,19 @@ +import csharp +import semmle.code.csharp.dataflow.FlowSteps + +/** + * A test-only additional taint step that treats calls to `Marker.Step` as + * propagating taint from the argument to the call result, to verify that + * `AdditionalTaintStep` subclasses are picked up by `defaultAdditionalTaintStep`. + */ +private class MarkerStepTaintStep extends AdditionalTaintStep { + override predicate step(DataFlow::Node node1, DataFlow::Node node2) { + exists(MethodCall mc | + mc.getTarget().hasName("Step") and + mc.getTarget().getDeclaringType().hasName("Marker") + | + node1.asExpr() = mc.getArgument(0) and + node2.asExpr() = mc + ) + } +} From c88eb8e618b692ffbe6e6722c6999a559b6ede34 Mon Sep 17 00:00:00 2001 From: jtabsbm <317336566@users.noreply.github.com> Date: Sat, 15 Aug 2026 13:40:40 -0700 Subject: [PATCH 0341/2098] Docs: list psycopg (v3) in supported frameworks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Psycopg 3 has been modeled since python/ql/lib/semmle/python/frameworks/Psycopg.qll (imported in Frameworks.qll) but was never added to the supported frameworks table — only psycopg2 is listed. Signed-off-by: jtabsbm <317336566@users.noreply.github.com> --- docs/codeql/reusables/supported-frameworks.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/codeql/reusables/supported-frameworks.rst b/docs/codeql/reusables/supported-frameworks.rst index 0552a3495175..257fc17e5a44 100644 --- a/docs/codeql/reusables/supported-frameworks.rst +++ b/docs/codeql/reusables/supported-frameworks.rst @@ -263,6 +263,7 @@ and the CodeQL library pack ``codeql/python-all`` (`changelog Date: Thu, 13 Aug 2026 20:13:52 +0100 Subject: [PATCH 0342/2098] Rust: Add the test .expected file. --- .../CWE-078/CommandInjection.expected | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected diff --git a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected new file mode 100644 index 000000000000..29906c333d44 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected @@ -0,0 +1,96 @@ +#select +| main.rs:27:5:27:16 | ...::new | main.rs:4:22:4:35 | ...::args | main.rs:27:5:27:16 | ...::new | This command line depends on a $@. | main.rs:4:22:4:35 | ...::args | user-provided value | +| main.rs:34:10:34:12 | arg | main.rs:5:25:5:46 | ...::get | main.rs:34:10:34:12 | arg | This command line depends on a $@. | main.rs:5:25:5:46 | ...::get | user-provided value | +| main.rs:40:10:40:12 | arg | main.rs:4:22:4:35 | ...::args | main.rs:40:10:40:12 | arg | This command line depends on a $@. | main.rs:4:22:4:35 | ...::args | user-provided value | +| main.rs:47:10:47:13 | args | main.rs:5:25:5:46 | ...::get | main.rs:47:10:47:13 | args | This command line depends on a $@. | main.rs:5:25:5:46 | ...::get | user-provided value | +| main.rs:59:19:59:46 | ...::new | main.rs:53:25:53:46 | ...::get | main.rs:59:19:59:46 | ...::new | This command line depends on a $@. | main.rs:53:25:53:46 | ...::get | user-provided value | +| main.rs:67:10:67:12 | arg | main.rs:53:25:53:46 | ...::get | main.rs:67:10:67:12 | arg | This command line depends on a $@. | main.rs:53:25:53:46 | ...::get | user-provided value | +edges +| main.rs:4:9:4:18 | arg_string | main.rs:27:18:27:27 | arg_string | provenance | | +| main.rs:4:9:4:18 | arg_string | main.rs:40:14:40:23 | arg_string | provenance | | +| main.rs:4:22:4:35 | ...::args | main.rs:4:22:4:37 | ...::args(...) [element] | provenance | Src:MaD:7 | +| main.rs:4:22:4:37 | ...::args(...) [element] | main.rs:4:22:4:44 | ... .nth(...) [Some] | provenance | MaD:8 | +| main.rs:4:22:4:44 | ... .nth(...) [Some] | main.rs:4:22:4:74 | ... .unwrap_or(...) | provenance | MaD:10 | +| main.rs:4:22:4:74 | ... .unwrap_or(...) | main.rs:4:9:4:18 | arg_string | provenance | | +| main.rs:5:9:5:21 | remote_string | main.rs:34:14:34:26 | remote_string | provenance | | +| main.rs:5:9:5:21 | remote_string | main.rs:47:23:47:35 | remote_string | provenance | | +| main.rs:5:25:5:46 | ...::get | main.rs:5:25:5:69 | ...::get(...) [Ok] | provenance | Src:MaD:6 | +| main.rs:5:25:5:69 | ...::get(...) [Ok] | main.rs:5:25:6:17 | ... .unwrap() | provenance | MaD:11 | +| main.rs:5:25:6:17 | ... .unwrap() | main.rs:5:25:7:15 | ... .text() [Ok] | provenance | MaD:13 | +| main.rs:5:25:7:15 | ... .text() [Ok] | main.rs:5:25:8:38 | ... .unwrap_or(...) | provenance | MaD:12 | +| main.rs:5:25:8:38 | ... .unwrap_or(...) | main.rs:5:9:5:21 | remote_string | provenance | | +| main.rs:27:18:27:27 | arg_string | main.rs:27:18:27:36 | arg_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:27:18:27:36 | arg_string.as_str() [&ref] | main.rs:27:5:27:16 | ...::new | provenance | MaD:3 Sink:MaD:3 | +| main.rs:34:14:34:26 | remote_string | main.rs:34:14:34:35 | remote_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:34:14:34:35 | remote_string.as_str() [&ref] | main.rs:34:10:34:12 | arg | provenance | MaD:1 Sink:MaD:1 | +| main.rs:40:14:40:23 | arg_string | main.rs:40:14:40:32 | arg_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:40:14:40:32 | arg_string.as_str() [&ref] | main.rs:40:10:40:12 | arg | provenance | MaD:1 Sink:MaD:1 | +| main.rs:47:15:47:45 | &... [&ref, element, &ref] | main.rs:47:10:47:13 | args | provenance | MaD:2 Sink:MaD:2 Sink:MaD:2 | +| main.rs:47:15:47:45 | &... [&ref, element, &ref] | main.rs:47:10:47:13 | args | provenance | MaD:2 Sink:MaD:2 Sink:MaD:2 Sink:MaD:2 | +| main.rs:47:16:47:45 | [...] [element, &ref] | main.rs:47:15:47:45 | &... [&ref, element, &ref] | provenance | | +| main.rs:47:23:47:35 | remote_string | main.rs:47:23:47:44 | remote_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:47:23:47:44 | remote_string.as_str() [&ref] | main.rs:47:16:47:45 | [...] [element, &ref] | provenance | | +| main.rs:53:9:53:21 | remote_string | main.rs:59:48:59:60 | remote_string | provenance | | +| main.rs:53:9:53:21 | remote_string | main.rs:67:14:67:26 | remote_string | provenance | | +| main.rs:53:25:53:46 | ...::get | main.rs:53:25:53:69 | ...::get(...) [Ok] | provenance | Src:MaD:6 | +| main.rs:53:25:53:69 | ...::get(...) [Ok] | main.rs:53:25:54:17 | ... .unwrap() | provenance | MaD:11 | +| main.rs:53:25:54:17 | ... .unwrap() | main.rs:53:25:55:15 | ... .text() [Ok] | provenance | MaD:13 | +| main.rs:53:25:55:15 | ... .text() [Ok] | main.rs:53:25:56:38 | ... .unwrap_or(...) | provenance | MaD:12 | +| main.rs:53:25:56:38 | ... .unwrap_or(...) | main.rs:53:9:53:21 | remote_string | provenance | | +| main.rs:59:48:59:60 | remote_string | main.rs:59:48:59:69 | remote_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:59:48:59:69 | remote_string.as_str() [&ref] | main.rs:59:19:59:46 | ...::new | provenance | MaD:5 Sink:MaD:5 | +| main.rs:67:14:67:26 | remote_string | main.rs:67:14:67:35 | remote_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:67:14:67:35 | remote_string.as_str() [&ref] | main.rs:67:10:67:12 | arg | provenance | MaD:4 Sink:MaD:4 | +models +| 1 | Sink: ::arg; Argument[0]; command-injection | +| 2 | Sink: ::args; Argument[0]; command-injection | +| 3 | Sink: ::new; Argument[0]; command-injection | +| 4 | Sink: ::arg; Argument[0]; command-injection | +| 5 | Sink: ::new; Argument[0]; command-injection | +| 6 | Source: reqwest::blocking::get; ReturnValue.Field[core::result::Result::Ok(0)]; remote | +| 7 | Source: std::env::args; ReturnValue.Element; commandargs | +| 8 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 9 | Summary: ::as_str; Argument[self].Reference; ReturnValue.Reference; taint | +| 10 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 11 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 12 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 13 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +nodes +| main.rs:4:9:4:18 | arg_string | semmle.label | arg_string | +| main.rs:4:22:4:35 | ...::args | semmle.label | ...::args | +| main.rs:4:22:4:37 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | +| main.rs:4:22:4:44 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | +| main.rs:4:22:4:74 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | +| main.rs:5:9:5:21 | remote_string | semmle.label | remote_string | +| main.rs:5:25:5:46 | ...::get | semmle.label | ...::get | +| main.rs:5:25:5:69 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | +| main.rs:5:25:6:17 | ... .unwrap() | semmle.label | ... .unwrap() | +| main.rs:5:25:7:15 | ... .text() [Ok] | semmle.label | ... .text() [Ok] | +| main.rs:5:25:8:38 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | +| main.rs:27:5:27:16 | ...::new | semmle.label | ...::new | +| main.rs:27:18:27:27 | arg_string | semmle.label | arg_string | +| main.rs:27:18:27:36 | arg_string.as_str() [&ref] | semmle.label | arg_string.as_str() [&ref] | +| main.rs:34:10:34:12 | arg | semmle.label | arg | +| main.rs:34:14:34:26 | remote_string | semmle.label | remote_string | +| main.rs:34:14:34:35 | remote_string.as_str() [&ref] | semmle.label | remote_string.as_str() [&ref] | +| main.rs:40:10:40:12 | arg | semmle.label | arg | +| main.rs:40:14:40:23 | arg_string | semmle.label | arg_string | +| main.rs:40:14:40:32 | arg_string.as_str() [&ref] | semmle.label | arg_string.as_str() [&ref] | +| main.rs:47:10:47:13 | args | semmle.label | args | +| main.rs:47:15:47:45 | &... [&ref, element, &ref] | semmle.label | &... [&ref, element, &ref] | +| main.rs:47:16:47:45 | [...] [element, &ref] | semmle.label | [...] [element, &ref] | +| main.rs:47:23:47:35 | remote_string | semmle.label | remote_string | +| main.rs:47:23:47:44 | remote_string.as_str() [&ref] | semmle.label | remote_string.as_str() [&ref] | +| main.rs:53:9:53:21 | remote_string | semmle.label | remote_string | +| main.rs:53:25:53:46 | ...::get | semmle.label | ...::get | +| main.rs:53:25:53:69 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | +| main.rs:53:25:54:17 | ... .unwrap() | semmle.label | ... .unwrap() | +| main.rs:53:25:55:15 | ... .text() [Ok] | semmle.label | ... .text() [Ok] | +| main.rs:53:25:56:38 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | +| main.rs:59:19:59:46 | ...::new | semmle.label | ...::new | +| main.rs:59:48:59:60 | remote_string | semmle.label | remote_string | +| main.rs:59:48:59:69 | remote_string.as_str() [&ref] | semmle.label | remote_string.as_str() [&ref] | +| main.rs:67:10:67:12 | arg | semmle.label | arg | +| main.rs:67:14:67:26 | remote_string | semmle.label | remote_string | +| main.rs:67:14:67:35 | remote_string.as_str() [&ref] | semmle.label | remote_string.as_str() [&ref] | +subpaths From c412722c3acba43b9ae83e93b44dbe4510612bc5 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Thu, 13 Aug 2026 20:25:28 +0100 Subject: [PATCH 0343/2098] Rust: Add a test case containing string concatenation. --- .../CWE-078/CommandInjection.expected | 69 ++++++++++++------- .../test/query-tests/security/CWE-078/main.rs | 7 ++ 2 files changed, 51 insertions(+), 25 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected index 29906c333d44..21485f4e3a3b 100644 --- a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected @@ -3,8 +3,9 @@ | main.rs:34:10:34:12 | arg | main.rs:5:25:5:46 | ...::get | main.rs:34:10:34:12 | arg | This command line depends on a $@. | main.rs:5:25:5:46 | ...::get | user-provided value | | main.rs:40:10:40:12 | arg | main.rs:4:22:4:35 | ...::args | main.rs:40:10:40:12 | arg | This command line depends on a $@. | main.rs:4:22:4:35 | ...::args | user-provided value | | main.rs:47:10:47:13 | args | main.rs:5:25:5:46 | ...::get | main.rs:47:10:47:13 | args | This command line depends on a $@. | main.rs:5:25:5:46 | ...::get | user-provided value | -| main.rs:59:19:59:46 | ...::new | main.rs:53:25:53:46 | ...::get | main.rs:59:19:59:46 | ...::new | This command line depends on a $@. | main.rs:53:25:53:46 | ...::get | user-provided value | -| main.rs:67:10:67:12 | arg | main.rs:53:25:53:46 | ...::get | main.rs:67:10:67:12 | arg | This command line depends on a $@. | main.rs:53:25:53:46 | ...::get | user-provided value | +| main.rs:53:5:53:16 | ...::new | main.rs:5:25:5:46 | ...::get | main.rs:53:5:53:16 | ...::new | This command line depends on a $@. | main.rs:5:25:5:46 | ...::get | user-provided value | +| main.rs:65:19:65:46 | ...::new | main.rs:59:25:59:46 | ...::get | main.rs:65:19:65:46 | ...::new | This command line depends on a $@. | main.rs:59:25:59:46 | ...::get | user-provided value | +| main.rs:73:10:73:12 | arg | main.rs:59:25:59:46 | ...::get | main.rs:73:10:73:12 | arg | This command line depends on a $@. | main.rs:59:25:59:46 | ...::get | user-provided value | edges | main.rs:4:9:4:18 | arg_string | main.rs:27:18:27:27 | arg_string | provenance | | | main.rs:4:9:4:18 | arg_string | main.rs:40:14:40:23 | arg_string | provenance | | @@ -14,6 +15,7 @@ edges | main.rs:4:22:4:74 | ... .unwrap_or(...) | main.rs:4:9:4:18 | arg_string | provenance | | | main.rs:5:9:5:21 | remote_string | main.rs:34:14:34:26 | remote_string | provenance | | | main.rs:5:9:5:21 | remote_string | main.rs:47:23:47:35 | remote_string | provenance | | +| main.rs:5:9:5:21 | remote_string | main.rs:52:40:52:69 | MacroExpr | provenance | | | main.rs:5:25:5:46 | ...::get | main.rs:5:25:5:69 | ...::get(...) [Ok] | provenance | Src:MaD:6 | | main.rs:5:25:5:69 | ...::get(...) [Ok] | main.rs:5:25:6:17 | ... .unwrap() | provenance | MaD:11 | | main.rs:5:25:6:17 | ... .unwrap() | main.rs:5:25:7:15 | ... .text() [Ok] | provenance | MaD:13 | @@ -30,17 +32,24 @@ edges | main.rs:47:16:47:45 | [...] [element, &ref] | main.rs:47:15:47:45 | &... [&ref, element, &ref] | provenance | | | main.rs:47:23:47:35 | remote_string | main.rs:47:23:47:44 | remote_string.as_str() [&ref] | provenance | MaD:9 | | main.rs:47:23:47:44 | remote_string.as_str() [&ref] | main.rs:47:16:47:45 | [...] [element, &ref] | provenance | | -| main.rs:53:9:53:21 | remote_string | main.rs:59:48:59:60 | remote_string | provenance | | -| main.rs:53:9:53:21 | remote_string | main.rs:67:14:67:26 | remote_string | provenance | | -| main.rs:53:25:53:46 | ...::get | main.rs:53:25:53:69 | ...::get(...) [Ok] | provenance | Src:MaD:6 | -| main.rs:53:25:53:69 | ...::get(...) [Ok] | main.rs:53:25:54:17 | ... .unwrap() | provenance | MaD:11 | -| main.rs:53:25:54:17 | ... .unwrap() | main.rs:53:25:55:15 | ... .text() [Ok] | provenance | MaD:13 | -| main.rs:53:25:55:15 | ... .text() [Ok] | main.rs:53:25:56:38 | ... .unwrap_or(...) | provenance | MaD:12 | -| main.rs:53:25:56:38 | ... .unwrap_or(...) | main.rs:53:9:53:21 | remote_string | provenance | | -| main.rs:59:48:59:60 | remote_string | main.rs:59:48:59:69 | remote_string.as_str() [&ref] | provenance | MaD:9 | -| main.rs:59:48:59:69 | remote_string.as_str() [&ref] | main.rs:59:19:59:46 | ...::new | provenance | MaD:5 Sink:MaD:5 | -| main.rs:67:14:67:26 | remote_string | main.rs:67:14:67:35 | remote_string.as_str() [&ref] | provenance | MaD:9 | -| main.rs:67:14:67:35 | remote_string.as_str() [&ref] | main.rs:67:10:67:12 | arg | provenance | MaD:4 Sink:MaD:4 | +| main.rs:52:9:52:28 | concatenated_command | main.rs:53:18:53:37 | concatenated_command | provenance | | +| main.rs:52:40:52:69 | ...::format(...) | main.rs:52:40:52:69 | { ... } | provenance | | +| main.rs:52:40:52:69 | ...::must_use(...) | main.rs:52:9:52:28 | concatenated_command | provenance | | +| main.rs:52:40:52:69 | MacroExpr | main.rs:52:40:52:69 | ...::format(...) | provenance | MaD:14 | +| main.rs:52:40:52:69 | { ... } | main.rs:52:40:52:69 | ...::must_use(...) | provenance | MaD:15 | +| main.rs:53:18:53:37 | concatenated_command | main.rs:53:18:53:46 | concatenated_command.as_str() [&ref] | provenance | MaD:9 | +| main.rs:53:18:53:46 | concatenated_command.as_str() [&ref] | main.rs:53:5:53:16 | ...::new | provenance | MaD:3 Sink:MaD:3 | +| main.rs:59:9:59:21 | remote_string | main.rs:65:48:65:60 | remote_string | provenance | | +| main.rs:59:9:59:21 | remote_string | main.rs:73:14:73:26 | remote_string | provenance | | +| main.rs:59:25:59:46 | ...::get | main.rs:59:25:59:69 | ...::get(...) [Ok] | provenance | Src:MaD:6 | +| main.rs:59:25:59:69 | ...::get(...) [Ok] | main.rs:59:25:60:17 | ... .unwrap() | provenance | MaD:11 | +| main.rs:59:25:60:17 | ... .unwrap() | main.rs:59:25:61:15 | ... .text() [Ok] | provenance | MaD:13 | +| main.rs:59:25:61:15 | ... .text() [Ok] | main.rs:59:25:62:38 | ... .unwrap_or(...) | provenance | MaD:12 | +| main.rs:59:25:62:38 | ... .unwrap_or(...) | main.rs:59:9:59:21 | remote_string | provenance | | +| main.rs:65:48:65:60 | remote_string | main.rs:65:48:65:69 | remote_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:65:48:65:69 | remote_string.as_str() [&ref] | main.rs:65:19:65:46 | ...::new | provenance | MaD:5 Sink:MaD:5 | +| main.rs:73:14:73:26 | remote_string | main.rs:73:14:73:35 | remote_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:73:14:73:35 | remote_string.as_str() [&ref] | main.rs:73:10:73:12 | arg | provenance | MaD:4 Sink:MaD:4 | models | 1 | Sink: ::arg; Argument[0]; command-injection | | 2 | Sink: ::args; Argument[0]; command-injection | @@ -55,6 +64,8 @@ models | 11 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | | 12 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | | 13 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 14 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 15 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes | main.rs:4:9:4:18 | arg_string | semmle.label | arg_string | | main.rs:4:22:4:35 | ...::args | semmle.label | ...::args | @@ -81,16 +92,24 @@ nodes | main.rs:47:16:47:45 | [...] [element, &ref] | semmle.label | [...] [element, &ref] | | main.rs:47:23:47:35 | remote_string | semmle.label | remote_string | | main.rs:47:23:47:44 | remote_string.as_str() [&ref] | semmle.label | remote_string.as_str() [&ref] | -| main.rs:53:9:53:21 | remote_string | semmle.label | remote_string | -| main.rs:53:25:53:46 | ...::get | semmle.label | ...::get | -| main.rs:53:25:53:69 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | -| main.rs:53:25:54:17 | ... .unwrap() | semmle.label | ... .unwrap() | -| main.rs:53:25:55:15 | ... .text() [Ok] | semmle.label | ... .text() [Ok] | -| main.rs:53:25:56:38 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | -| main.rs:59:19:59:46 | ...::new | semmle.label | ...::new | -| main.rs:59:48:59:60 | remote_string | semmle.label | remote_string | -| main.rs:59:48:59:69 | remote_string.as_str() [&ref] | semmle.label | remote_string.as_str() [&ref] | -| main.rs:67:10:67:12 | arg | semmle.label | arg | -| main.rs:67:14:67:26 | remote_string | semmle.label | remote_string | -| main.rs:67:14:67:35 | remote_string.as_str() [&ref] | semmle.label | remote_string.as_str() [&ref] | +| main.rs:52:9:52:28 | concatenated_command | semmle.label | concatenated_command | +| main.rs:52:40:52:69 | ...::format(...) | semmle.label | ...::format(...) | +| main.rs:52:40:52:69 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| main.rs:52:40:52:69 | MacroExpr | semmle.label | MacroExpr | +| main.rs:52:40:52:69 | { ... } | semmle.label | { ... } | +| main.rs:53:5:53:16 | ...::new | semmle.label | ...::new | +| main.rs:53:18:53:37 | concatenated_command | semmle.label | concatenated_command | +| main.rs:53:18:53:46 | concatenated_command.as_str() [&ref] | semmle.label | concatenated_command.as_str() [&ref] | +| main.rs:59:9:59:21 | remote_string | semmle.label | remote_string | +| main.rs:59:25:59:46 | ...::get | semmle.label | ...::get | +| main.rs:59:25:59:69 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | +| main.rs:59:25:60:17 | ... .unwrap() | semmle.label | ... .unwrap() | +| main.rs:59:25:61:15 | ... .text() [Ok] | semmle.label | ... .text() [Ok] | +| main.rs:59:25:62:38 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | +| main.rs:65:19:65:46 | ...::new | semmle.label | ...::new | +| main.rs:65:48:65:60 | remote_string | semmle.label | remote_string | +| main.rs:65:48:65:69 | remote_string.as_str() [&ref] | semmle.label | remote_string.as_str() [&ref] | +| main.rs:73:10:73:12 | arg | semmle.label | arg | +| main.rs:73:14:73:26 | remote_string | semmle.label | remote_string | +| main.rs:73:14:73:35 | remote_string.as_str() [&ref] | semmle.label | remote_string.as_str() [&ref] | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-078/main.rs b/rust/ql/test/query-tests/security/CWE-078/main.rs index eecf95cec33d..f81ec33fba3a 100644 --- a/rust/ql/test/query-tests/security/CWE-078/main.rs +++ b/rust/ql/test/query-tests/security/CWE-078/main.rs @@ -47,6 +47,12 @@ fn test_std_command_injection() { .args(&["-c", remote_string.as_str()]) // $ Alert[rust/command-line-injection]=remote1 .output() .expect("failed"); + + // Remote input concatenated into a command + let concatenated_command = format!("sh -c echo {}", remote_string); + Command::new(concatenated_command.as_str()) // $ Alert[rust/command-line-injection]=remote1 + .output() + .expect("failed"); } async fn test_tokio_command_injection() { @@ -72,4 +78,5 @@ async fn test_tokio_command_injection() { fn main() { test_std_command_injection(); + test_tokio_command_injection(); } From bd564489a6d3b15ce01f8b1ce99bf163001ff7a1 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Thu, 13 Aug 2026 22:17:44 +0100 Subject: [PATCH 0344/2098] Rust: Add the examples as test cases. --- .../CWE-078/CommandInjection.expected | 31 ++++++++++++++++++ .../test/query-tests/security/CWE-078/main.rs | 32 +++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected index 21485f4e3a3b..71be73855bbd 100644 --- a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected @@ -6,6 +6,8 @@ | main.rs:53:5:53:16 | ...::new | main.rs:5:25:5:46 | ...::get | main.rs:53:5:53:16 | ...::new | This command line depends on a $@. | main.rs:5:25:5:46 | ...::get | user-provided value | | main.rs:65:19:65:46 | ...::new | main.rs:59:25:59:46 | ...::get | main.rs:65:19:65:46 | ...::new | This command line depends on a $@. | main.rs:59:25:59:46 | ...::get | user-provided value | | main.rs:73:10:73:12 | arg | main.rs:59:25:59:46 | ...::get | main.rs:73:10:73:12 | arg | This command line depends on a $@. | main.rs:59:25:59:46 | ...::get | user-provided value | +| main.rs:86:14:86:16 | arg | main.rs:108:22:108:35 | ...::args | main.rs:86:14:86:16 | arg | This command line depends on a $@. | main.rs:108:22:108:35 | ...::args | user-provided value | +| main.rs:100:18:100:20 | arg | main.rs:108:22:108:35 | ...::args | main.rs:100:18:100:20 | arg | This command line depends on a $@. | main.rs:108:22:108:35 | ...::args | user-provided value | edges | main.rs:4:9:4:18 | arg_string | main.rs:27:18:27:27 | arg_string | provenance | | | main.rs:4:9:4:18 | arg_string | main.rs:40:14:40:23 | arg_string | provenance | | @@ -50,6 +52,20 @@ edges | main.rs:65:48:65:69 | remote_string.as_str() [&ref] | main.rs:65:19:65:46 | ...::new | provenance | MaD:5 Sink:MaD:5 | | main.rs:73:14:73:26 | remote_string | main.rs:73:14:73:35 | remote_string.as_str() [&ref] | provenance | MaD:9 | | main.rs:73:14:73:35 | remote_string.as_str() [&ref] | main.rs:73:10:73:12 | arg | provenance | MaD:4 Sink:MaD:4 | +| main.rs:82:27:82:42 | ...: ... [&ref] | main.rs:86:18:86:27 | user_input [&ref] | provenance | | +| main.rs:86:18:86:27 | user_input [&ref] | main.rs:86:14:86:16 | arg | provenance | MaD:1 Sink:MaD:1 | +| main.rs:95:27:95:40 | ...: ... [&ref] | main.rs:100:22:100:29 | filename [&ref] | provenance | | +| main.rs:100:22:100:29 | filename [&ref] | main.rs:100:18:100:20 | arg | provenance | MaD:1 Sink:MaD:1 | +| main.rs:108:9:108:18 | arg_string | main.rs:112:39:112:48 | arg_string | provenance | | +| main.rs:108:9:108:18 | arg_string | main.rs:113:40:113:49 | arg_string | provenance | | +| main.rs:108:22:108:35 | ...::args | main.rs:108:22:108:37 | ...::args(...) [element] | provenance | Src:MaD:7 | +| main.rs:108:22:108:37 | ...::args(...) [element] | main.rs:108:22:108:44 | ... .nth(...) [Some] | provenance | MaD:8 | +| main.rs:108:22:108:44 | ... .nth(...) [Some] | main.rs:108:22:108:74 | ... .unwrap_or(...) | provenance | MaD:10 | +| main.rs:108:22:108:74 | ... .unwrap_or(...) | main.rs:108:9:108:18 | arg_string | provenance | | +| main.rs:112:39:112:48 | arg_string | main.rs:112:39:112:57 | arg_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:112:39:112:57 | arg_string.as_str() [&ref] | main.rs:82:27:82:42 | ...: ... [&ref] | provenance | | +| main.rs:113:40:113:49 | arg_string | main.rs:113:40:113:58 | arg_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:113:40:113:58 | arg_string.as_str() [&ref] | main.rs:95:27:95:40 | ...: ... [&ref] | provenance | | models | 1 | Sink: ::arg; Argument[0]; command-injection | | 2 | Sink: ::args; Argument[0]; command-injection | @@ -112,4 +128,19 @@ nodes | main.rs:73:10:73:12 | arg | semmle.label | arg | | main.rs:73:14:73:26 | remote_string | semmle.label | remote_string | | main.rs:73:14:73:35 | remote_string.as_str() [&ref] | semmle.label | remote_string.as_str() [&ref] | +| main.rs:82:27:82:42 | ...: ... [&ref] | semmle.label | ...: ... [&ref] | +| main.rs:86:14:86:16 | arg | semmle.label | arg | +| main.rs:86:18:86:27 | user_input [&ref] | semmle.label | user_input [&ref] | +| main.rs:95:27:95:40 | ...: ... [&ref] | semmle.label | ...: ... [&ref] | +| main.rs:100:18:100:20 | arg | semmle.label | arg | +| main.rs:100:22:100:29 | filename [&ref] | semmle.label | filename [&ref] | +| main.rs:108:9:108:18 | arg_string | semmle.label | arg_string | +| main.rs:108:22:108:35 | ...::args | semmle.label | ...::args | +| main.rs:108:22:108:37 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | +| main.rs:108:22:108:44 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | +| main.rs:108:22:108:74 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | +| main.rs:112:39:112:48 | arg_string | semmle.label | arg_string | +| main.rs:112:39:112:57 | arg_string.as_str() [&ref] | semmle.label | arg_string.as_str() [&ref] | +| main.rs:113:40:113:49 | arg_string | semmle.label | arg_string | +| main.rs:113:40:113:58 | arg_string.as_str() [&ref] | semmle.label | arg_string.as_str() [&ref] | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-078/main.rs b/rust/ql/test/query-tests/security/CWE-078/main.rs index f81ec33fba3a..6fc29ceb2104 100644 --- a/rust/ql/test/query-tests/security/CWE-078/main.rs +++ b/rust/ql/test/query-tests/security/CWE-078/main.rs @@ -76,7 +76,39 @@ async fn test_tokio_command_injection() { .expect("failed"); } +mod qhelp_example_bad { + use std::process::Command; + + pub fn handle_request(user_input: &str) { + // BAD + Command::new("sh") + .arg("-c") + .arg(user_input) // $ Alert[rust/command-line-injection]=args2 + .output() + .expect("failed to execute"); + } +} + +mod qhelp_example_good { + use std::process::Command; + + pub fn handle_request(filename: &str) { + // GOOD + let allowed_names = ["report.pdf", "summary.txt", "data.csv"]; + if allowed_names.contains(&filename) { + Command::new("cat") + .arg(filename) // $ SPURIOUS: Alert[rust/command-line-injection]=args2 + .output() + .expect("failed to execute"); + } + } +} + fn main() { + let arg_string = std::env::args().nth(1).unwrap_or(String::from("ls")); // $ Source=args2 + test_std_command_injection(); test_tokio_command_injection(); + qhelp_example_bad::handle_request(arg_string.as_str()); + qhelp_example_good::handle_request(arg_string.as_str()); } From 89625ec3b0a58fc4c54f5ccd23ecf3d584fe1509 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Aug 2026 03:05:34 +0000 Subject: [PATCH 0345/2098] build(deps): bump the extractor-dependencies group Bumps the extractor-dependencies group in /go/extractor with 2 updates: [golang.org/x/mod](https://github.com/golang/mod) and [golang.org/x/tools](https://github.com/golang/tools). Updates `golang.org/x/mod` from 0.39.0 to 0.40.0 - [Commits](https://github.com/golang/mod/compare/v0.39.0...v0.40.0) Updates `golang.org/x/tools` from 0.48.0 to 0.49.0 - [Release notes](https://github.com/golang/tools/releases) - [Commits](https://github.com/golang/tools/compare/v0.48.0...v0.49.0) --- updated-dependencies: - dependency-name: golang.org/x/mod dependency-version: 0.40.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: extractor-dependencies - dependency-name: golang.org/x/tools dependency-version: 0.49.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: extractor-dependencies ... Signed-off-by: dependabot[bot] --- go/extractor/go.mod | 4 ++-- go/extractor/go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go/extractor/go.mod b/go/extractor/go.mod index fc48b4cffeba..eb29d527ffb7 100644 --- a/go/extractor/go.mod +++ b/go/extractor/go.mod @@ -9,8 +9,8 @@ toolchain go1.26.5 // when adding or removing dependencies, run // bazel mod tidy require ( - golang.org/x/mod v0.39.0 - golang.org/x/tools v0.48.0 + golang.org/x/mod v0.40.0 + golang.org/x/tools v0.49.0 ) require ( diff --git a/go/extractor/go.sum b/go/extractor/go.sum index 889863082b11..f06d2fb2b567 100644 --- a/go/extractor/go.sum +++ b/go/extractor/go.sum @@ -6,14 +6,14 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -golang.org/x/mod v0.39.0 h1:UF5zwQdCRRUpHfyPwr7d4UrGiVeldIsogtzWVnczL74= -golang.org/x/mod v0.39.0/go.mod h1:bvIbwjQ0HUFFf5AKukeeYQG4ZBUG9yxQbR9aEweIwYY= +golang.org/x/mod v0.40.0 h1:hUv+3cXcdRHz08UmSiOob7sadHig73uo5bkXxQ/tvUs= +golang.org/x/mod v0.40.0/go.mod h1:0/weTWkPWGBikyTWAX3dkjVztMmBA5hM0DH6BElSupE= golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/tools v0.48.0 h1:3+hClM1aLL5mjMKm5ovokw9epgRXPuu2tILgismM6RE= -golang.org/x/tools v0.48.0/go.mod h1:08xX0orndb/F7jJxGDicx061tyd5pcMto75YMAXr6lk= +golang.org/x/tools v0.49.0 h1:3NI7VXzL9+1WZD52Dx2ttoPwD5DWrFGpl9mFZDlmisI= +golang.org/x/tools v0.49.0/go.mod h1:SJNXV9DBKT0UbdttsQjbfJlAE/q+y36++zo3uL3N0Oo= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= From bd657ab9c88d595ebeb678e5a303598d45a63d21 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 17 Aug 2026 03:18:12 +0000 Subject: [PATCH 0346/2098] Go: Update to 1.26.6 --- MODULE.bazel | 2 +- go/actions/test/action.yml | 2 +- go/extractor/go.mod | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 4679589528f5..6d562ff80b69 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -302,7 +302,7 @@ use_repo( ) go_sdk = use_extension("@rules_go//go:extensions.bzl", "go_sdk") -go_sdk.download(version = "1.26.5") +go_sdk.download(version = "1.26.6") go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps") go_deps.from_file(go_mod = "//go/extractor:go.mod") diff --git a/go/actions/test/action.yml b/go/actions/test/action.yml index d4c391cd0103..4f3d7ad9377d 100644 --- a/go/actions/test/action.yml +++ b/go/actions/test/action.yml @@ -4,7 +4,7 @@ inputs: go-test-version: description: Which Go version to use for running the tests required: false - default: "~1.26.5" + default: "~1.26.6" run-code-checks: description: Whether to run formatting, code and qhelp generation checks required: false diff --git a/go/extractor/go.mod b/go/extractor/go.mod index fc48b4cffeba..703623a89f97 100644 --- a/go/extractor/go.mod +++ b/go/extractor/go.mod @@ -2,7 +2,7 @@ module github.com/github/codeql-go/extractor go 1.26 -toolchain go1.26.5 +toolchain go1.26.6 // when updating this, run // bazel run @rules_go//go -- mod tidy From 9327d2382b1ad3904326e86de5db41a763a3eb18 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 17 Aug 2026 08:45:56 +0200 Subject: [PATCH 0347/2098] Add unified jump-to-definition query Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 3aaa555d-064b-443a-bc65-61a1b99dd0ad --- unified/ql/lib/codeql/Definitions.qll | 16 +++++++++++++++ .../lib/ide-contextual-queries/definitions.ql | 20 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 unified/ql/lib/codeql/Definitions.qll create mode 100644 unified/ql/lib/ide-contextual-queries/definitions.ql diff --git a/unified/ql/lib/codeql/Definitions.qll b/unified/ql/lib/codeql/Definitions.qll new file mode 100644 index 000000000000..927119530401 --- /dev/null +++ b/unified/ql/lib/codeql/Definitions.qll @@ -0,0 +1,16 @@ +/** + * Provides predicates related to jump-to-definition links in the code viewer. + */ + +private import unified +private import codeql.unified.internal.StaticNameBinding + +/** + * Holds if `reference` refers to `definition`. + */ +cached +predicate definitionOf(Identifier reference, NameDeclaration definition, string kind) { + reference = trackNameDeclaration(definition).asIdentifier() and + not reference instanceof NameDeclaration and + kind = "name" +} diff --git a/unified/ql/lib/ide-contextual-queries/definitions.ql b/unified/ql/lib/ide-contextual-queries/definitions.ql new file mode 100644 index 000000000000..f72c91bcd9dd --- /dev/null +++ b/unified/ql/lib/ide-contextual-queries/definitions.ql @@ -0,0 +1,20 @@ +/** + * @name Jump-to-definition links + * @description Generates use-definition pairs that provide the data + * for jump-to-definition in the code viewer. + * @kind definitions + * @id unified/ide-jump-to-definition + * @tags ide-contextual-queries/local-definitions + */ + +import codeql.Definitions +import codeql.IDEContextual +import unified + +external string selectedSourceFile(); + +from Identifier reference, NameDeclaration definition, string kind +where + definitionOf(reference, definition, kind) and + reference.getLocation().getFile() = getFileBySourceArchiveName(selectedSourceFile()) +select reference, definition, kind From c0b5a4a98b304731113eec189ea9973f0fdcff04 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 17 Aug 2026 09:13:06 +0200 Subject: [PATCH 0348/2098] Test unified jump-to-definition logic Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 3aaa555d-064b-443a-bc65-61a1b99dd0ad --- unified/ql/lib/utils/test/TestUtils.qll | 33 ++++++++++++++++++ .../library-tests/definitions/test.expected | 0 .../ql/test/library-tests/definitions/test.ql | 20 +++++++++++ .../test/library-tests/definitions/test.swift | 18 ++++++++++ .../library-tests/static-name-binding/test.ql | 34 ++----------------- 5 files changed, 73 insertions(+), 32 deletions(-) create mode 100644 unified/ql/lib/utils/test/TestUtils.qll create mode 100644 unified/ql/test/library-tests/definitions/test.expected create mode 100644 unified/ql/test/library-tests/definitions/test.ql create mode 100644 unified/ql/test/library-tests/definitions/test.swift diff --git a/unified/ql/lib/utils/test/TestUtils.qll b/unified/ql/lib/utils/test/TestUtils.qll new file mode 100644 index 000000000000..8a35f6277465 --- /dev/null +++ b/unified/ql/lib/utils/test/TestUtils.qll @@ -0,0 +1,33 @@ +private import unified +private import CommentUtil +private import codeql.unified.internal.StaticNameBinding + +private string deriveClassName(ClassLikeDeclaration cls) { + not exists(cls.getParent().getEnclosingClass()) and + result = cls.getName().getValue() + or + result = deriveClassName(cls.getParent().getEnclosingClass()) + "." + cls.getName().getValue() +} + +private string defaultName(NameDeclaration decl) { + exists(ClassLikeDeclaration cls | + decl.getDeclaration() = cls.getAMember() and + result = deriveClassName(cls) + "." + decl.getName() + ) + or + not decl.getDeclaration() = any(ClassLikeDeclaration cls).getAMember() and + result = decl.getName() +} + +private predicate declAt(NameDeclaration v, string filepath, int line) { + v.getLocation().hasLocationInfo(filepath, line, _, _, _) +} + +predicate nameDeclaration(NameDeclaration v, string alias) { + exists(string filepath, int line | declAt(v, filepath, line) | + keyValueCommentAt(filepath, line, "name", alias) + or + not keyValueCommentAt(filepath, line, "name", _) and + alias = defaultName(v) + ) +} diff --git a/unified/ql/test/library-tests/definitions/test.expected b/unified/ql/test/library-tests/definitions/test.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/unified/ql/test/library-tests/definitions/test.ql b/unified/ql/test/library-tests/definitions/test.ql new file mode 100644 index 000000000000..361a9fd6a03c --- /dev/null +++ b/unified/ql/test/library-tests/definitions/test.ql @@ -0,0 +1,20 @@ +import unified +import utils.test.InlineExpectationsTest +import utils.test.TestUtils +import codeql.Definitions + +module DefinitionsTest implements TestSig { + string getARelevantTag() { result = "definition" } + + predicate hasActualResult(Location location, string element, string tag, string value) { + exists(Identifier reference, NameDeclaration definition | + definitionOf(reference, definition, "name") and + location = reference.getLocation() and + element = reference.toString() and + nameDeclaration(definition, value) and + tag = "definition" + ) + } +} + +import MakeTest diff --git a/unified/ql/test/library-tests/definitions/test.swift b/unified/ql/test/library-tests/definitions/test.swift new file mode 100644 index 000000000000..5bbbd59e21e8 --- /dev/null +++ b/unified/ql/test/library-tests/definitions/test.swift @@ -0,0 +1,18 @@ +class Base { + class Nested {} + static let member = 1 +} + +class Derived : Base {} // $ definition=Base + +func test() { + let local = 1 // name=local1 + local // $ definition=local1 + let local = 2 // name=local2 + local // $ definition=local2 + Derived.member // $ definition=Derived definition=Base.member + let _: Derived.Nested? // $ definition=Derived definition=Base.Nested +} + +typealias Alias = Derived // $ definition=Derived +let _: Alias.Nested? // $ definition=Alias definition=Base.Nested diff --git a/unified/ql/test/library-tests/static-name-binding/test.ql b/unified/ql/test/library-tests/static-name-binding/test.ql index 272606e2bd20..a1e49ce0609c 100644 --- a/unified/ql/test/library-tests/static-name-binding/test.ql +++ b/unified/ql/test/library-tests/static-name-binding/test.ql @@ -1,48 +1,18 @@ import unified import utils.test.InlineExpectationsTest -import utils.test.CommentUtil +import utils.test.TestUtils import codeql.unified.internal.StaticNameBinding module StaticDeclAccess implements TestSig { string getARelevantTag() { result = "access" } - private string deriveClassName(ClassLikeDeclaration cls) { - not exists(cls.getParent().getEnclosingClass()) and - result = cls.getName().getValue() - or - result = deriveClassName(cls.getParent().getEnclosingClass()) + "." + cls.getName().getValue() - } - - private string defaultName(NameDeclaration decl) { - exists(ClassLikeDeclaration cls | - decl.getDeclaration() = cls.getAMember() and - result = deriveClassName(cls) + "." + decl.getName() - ) - or - not decl.getDeclaration() = any(ClassLikeDeclaration cls).getAMember() and - result = decl.getName() - } - - additional predicate declAt(NameDeclaration v, string filepath, int line) { - v.getLocation().hasLocationInfo(filepath, line, _, _, _) - } - - private predicate decl(NameDeclaration v, string alias) { - exists(string filepath, int line | declAt(v, filepath, line) | - keyValueCommentAt(filepath, line, "name", alias) - or - not keyValueCommentAt(filepath, line, "name", _) and - alias = defaultName(v) - ) - } - predicate hasActualResult(Location location, string element, string tag, string value) { exists(NameDeclaration decl, Identifier access | access = trackNameDeclaration(decl).asIdentifier() and not access instanceof NameDeclaration and location = access.getLocation() and element = access.toString() and - decl(decl, value) and + nameDeclaration(decl, value) and tag = "access" ) } From ef41c1cc75c2c10ed183c08f501388a158f35266 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Mon, 17 Aug 2026 09:20:44 +0200 Subject: [PATCH 0349/2098] Rust: rustfmt extractor sources Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 890cb55d-0437-4bd7-9268-87b8897ada01 --- rust/extractor/src/translate/base.rs | 4 ++-- rust/extractor/src/translate/format_args.rs | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/rust/extractor/src/translate/base.rs b/rust/extractor/src/translate/base.rs index cf2feb6135b1..63b394f89c32 100644 --- a/rust/extractor/src/translate/base.rs +++ b/rust/extractor/src/translate/base.rs @@ -843,8 +843,8 @@ impl<'a, 'db> Translator<'a, 'db> { let (parsed, output_span_map) = token_tree_to_syntax_node(&output, TopEntryPoint::Expr, &mut |_| edition); let root = parsed.syntax_node(); - let Some(expr) = ast::Expr::cast(root.clone()) - .or_else(|| root.descendants().find_map(ast::Expr::cast)) + let Some(expr) = + ast::Expr::cast(root.clone()).or_else(|| root.descendants().find_map(ast::Expr::cast)) else { return false; }; diff --git a/rust/extractor/src/translate/format_args.rs b/rust/extractor/src/translate/format_args.rs index 431538aca296..9e0895cf3cb2 100644 --- a/rust/extractor/src/translate/format_args.rs +++ b/rust/extractor/src/translate/format_args.rs @@ -53,7 +53,11 @@ impl Wrap { /// Returns `None` if the input does not match the expected shape (currently only when /// a `write!` argument list has no writer/format-args separating comma). `call_site` /// is used to span the synthesized tokens; the format arguments keep their own spans. -pub(crate) fn reconstruct(wrap: Wrap, input: &tt::TopSubtree, call_site: Span) -> Option { +pub(crate) fn reconstruct( + wrap: Wrap, + input: &tt::TopSubtree, + call_site: Span, +) -> Option { let (writer, content) = split_arguments(wrap, input)?; let emitter = Emitter { call_site, From 1a811d5da04f5c6d75312899f69e1a59f1eb9be5 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Mon, 17 Aug 2026 11:22:50 +0100 Subject: [PATCH 0350/2098] C++: Cleanup in preparation for adding access paths at sources and sinks (no test changes). --- .../ir/dataflow/internal/DataFlowNodes.qll | 12 ++-- .../ir/dataflow/internal/DataFlowPrivate.qll | 71 ++++++++++++++++--- 2 files changed, 71 insertions(+), 12 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll index 27f7497422db..9e33969c85f8 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll @@ -1655,13 +1655,13 @@ abstract private class AbstractParameterNode extends Node { * Holds if this node represents an implicit `this` parameter, if it exists. */ predicate isThis() { none() } // overridden by subclasses -} -abstract private class AbstractIndirectParameterNode extends AbstractParameterNode { /** Gets the indirection index of this parameter node. */ - abstract int getIndirectionIndex(); + int getIndirectionIndex() { none() } } +abstract private class AbstractIndirectParameterNode extends AbstractParameterNode { } + pragma[noinline] private predicate indirectParameterNodeHasArgumentIndexAndIndex( IndirectInstructionParameterNode node, int argumentIndex, int indirectionIndex @@ -1725,7 +1725,9 @@ private class IndirectInstructionParameterNode extends AbstractIndirectParameter final override int getIndirectionIndex() { this.hasInstructionAndIndirectionIndex(init, result) } } -abstract private class AbstractDirectParameterNode extends AbstractParameterNode { } +abstract private class AbstractDirectParameterNode extends AbstractParameterNode { + override int getIndirectionIndex() { result = 0 } +} /** * A non-indirect parameter node that is represented as an `Instruction`. @@ -1796,6 +1798,8 @@ private class DirectBodyLessParameterNode extends AbstractExplicitParameterNode, } override Parameter getParameter() { result = p } + + final override int getIndirectionIndex() { result = 0 } } private class IndirectBodyLessParameterNode extends AbstractIndirectParameterNode, diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll index df4901b65fe8..0513c2ba92e9 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll @@ -508,11 +508,31 @@ predicate isArgumentNode(ArgumentNode arg, DataFlowCall c, ArgumentPosition pos) * on parameters are also included. */ abstract class ArgumentNode extends Node { + /** + * Holds if this argument occurs at the given position in the given call, + * and this call is represented in the source code. + * The instance argument is considered to have index `-1`. + */ + predicate sourceArgumentOf(CallInstruction call, ArgumentPosition pos) { none() } + + /** + * Holds if this argument occurs at the given position in the given call, + * and this call part of a summary. + * The instance argument is considered to have index `-1`. + */ + predicate summaryArgumentOf(FlowSummaryImpl::Public::SummarizedCallable call, ArgumentPosition pos) { + none() + } + /** * Holds if this argument occurs at the given position in the given call. * The instance argument is considered to have index `-1`. */ - abstract predicate argumentOf(DataFlowCall call, ArgumentPosition pos); + final predicate argumentOf(DataFlowCall call, ArgumentPosition pos) { + this.sourceArgumentOf(call.asCallInstruction(), pos) + or + this.summaryArgumentOf(call.asSummaryCall(), pos) + } /** Gets the call in which this node is an argument. */ DataFlowCall getCall() { this.argumentOf(result, _) } @@ -527,16 +547,16 @@ private class PrimaryArgumentNode extends ArgumentNode, OperandNode { PrimaryArgumentNode() { exists(CallInstruction call | op = call.getAnArgumentOperand()) } - override predicate argumentOf(DataFlowCall call, ArgumentPosition pos) { + override predicate sourceArgumentOf(CallInstruction call, ArgumentPosition pos) { op = call.getArgumentOperand(pos.(DirectPosition).getArgumentIndex()) } } private class SideEffectArgumentNode extends ArgumentNode, SideEffectOperandNode { - override predicate argumentOf(DataFlowCall dfCall, ArgumentPosition pos) { + override predicate sourceArgumentOf(CallInstruction c, ArgumentPosition pos) { exists(int indirectionIndex | pos = TIndirectionPosition(argumentIndex, pragma[only_bind_into](indirectionIndex)) and - this.getCallInstruction() = dfCall.asCallInstruction() and + this.getCallInstruction() = c and super.hasAddressOperandAndIndirectionIndex(arg, pragma[only_bind_into](indirectionIndex)) ) } @@ -554,8 +574,10 @@ class SummaryArgumentNode extends ArgumentNode, FlowSummaryNode { FlowSummaryImpl::Private::summaryArgumentNode(call_.getReceiver(), this.getSummaryNode(), pos_) } - override predicate argumentOf(DataFlowCall call, ArgumentPosition pos) { - call = call_ and + override predicate summaryArgumentOf( + FlowSummaryImpl::Public::SummarizedCallable call, ArgumentPosition pos + ) { + call = call_.asSummaryCall() and pos = pos_ } } @@ -569,8 +591,8 @@ private class FlowSummaryArgumentNode extends ArgumentNode, FlowSummaryNode { this.getSummaryNode() = FlowSummaryImpl::Private::summaryArgumentNode(callInstruction, rk) } - override predicate argumentOf(DataFlowCall call, ArgumentPosition pos) { - call.asCallInstruction() = callInstruction and + override predicate sourceArgumentOf(CallInstruction call, ArgumentPosition pos) { + call = callInstruction and pos = TFlowSummaryPosition(rk) } } @@ -593,6 +615,32 @@ abstract class Position extends TPosition { /** Gets the indirection index of this position. */ abstract int getIndirectionIndex(); + + /** + * Gets the parameter associated with this position, if any. + * + * Since a `Position` is defined by both an argument index and an + * indirection multiple `Position`s can be associated with the + * same `Parameter`. + */ + Parameter getParameter(Function f) { + result.getFunction() = f and + this.getArgumentIndex() = result.getIndex() + } + + /** + * Gets the argument (or qualifier) associated with this position, if any. + * + * Since a `Position` is defined by both an argument index and an + * indirection multiple `Position`s can be associated with the + * same argument/qualifier. + */ + Expr getArgument(Cpp::Call call) { + result = call.getArgument(this.getArgumentIndex()) + or + this.getArgumentIndex() = -1 and + result = call.getQualifier() + } } class DirectPosition extends Position, TDirectPosition { @@ -1189,6 +1237,11 @@ class DataFlowCall extends TDataFlowCall { */ CallInstruction asCallInstruction() { none() } + /** + * Gets the underlying summarized call, if any. + */ + FlowSummaryImpl::Public::SummarizedCallable asSummaryCall() { none() } + /** * Gets the operand the specifies the target function of the call. */ @@ -1306,6 +1359,8 @@ class SummaryCall extends DataFlowCall, TSummaryCall { */ FlowSummaryImpl::Private::SummaryNode getReceiver() { result = receiver } + final override FlowSummaryImpl::Public::SummarizedCallable asSummaryCall() { result = c } + // no implementation for `getCallTargetOperand()`, `getStaticCallTarget()` // or `getArgumentOperand(int index)`. This is because the flow summary // library is responsible for finding the call target, and there are no From 6d29fdbdb33fa2fe2872004b34a2fc7ad8c0608f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 17 Aug 2026 19:42:50 +0000 Subject: [PATCH 0351/2098] update codeql documentation --- .../codeql-changelog/codeql-cli-2.26.3.rst | 119 ++++++++++++++++++ .../codeql-changelog/index.rst | 1 + 2 files changed, 120 insertions(+) create mode 100644 docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.26.3.rst diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.26.3.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.26.3.rst new file mode 100644 index 000000000000..57a19ae4633a --- /dev/null +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.26.3.rst @@ -0,0 +1,119 @@ +.. _codeql-cli-2.26.3: + +========================== +CodeQL 2.26.3 (2026-08-12) +========================== + +.. contents:: Contents + :depth: 2 + :local: + :backlinks: none + +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. + +Security Coverage +----------------- + +CodeQL 2.26.3 runs a total of 497 security queries when configured with the Default suite (covering 170 CWE). The Extended suite enables an additional 131 queries (covering 32 more CWE). + +CodeQL CLI +---------- + +Bug Fixes +~~~~~~~~~ + +* Fixed the pack upload format to comply with the OCI-image-manifest specification, by ensuring that all required fields are present/valid, and that no extraneous/non-compliant fields are included. +* Fixed path canonicalization on Windows so that paths located on :code:`subst`\ ed drives are always resolved to their underlying target paths. Previously, :code:`subst`\ ed drives were not handled consistently by the CodeQL CLI and the language-specific extractors. + +Improvements +~~~~~~~~~~~~ + +* Commands that accept a :code:`--ram` option now report a clear error when given a value that is far too large to be a sensible amount of memory in megabytes (for example, a number of bytes passed by mistake), instead of failing with a cryptic "is not an int" message. + +Miscellaneous +~~~~~~~~~~~~~ + +* Upgraded Jackson from 2.18.6 to 2.18.9. + +Query Packs +----------- + +Bug Fixes +~~~~~~~~~ + +GitHub Actions +"""""""""""""" + +* The :code:`actions/output-clobbering/high` query now provides messages tailored to the affected output channel and includes expanded documentation and recommendations. +* The :code:`actions/cache-poisoning/poisonable-step` and :code:`actions/untrusted-checkout/critical` queries now start paths at the expressions that control untrusted checkouts and link their alert messages to those expressions. +* Fixed a performance issue in the :code:`actions/output-clobbering/high` query caused by using unescaped source-code input in a regular expression. + +Minor Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +JavaScript/TypeScript +""""""""""""""""""""" + +* The :code:`js/missing-rate-limiting` query now recognizes the :code:`@fastify/rate-limit` package as a rate limiter. + +GitHub Actions +"""""""""""""" + +* The :code:`actions/output-clobbering/high` query no longer reports simple :code:`jq` path filters when their output remains JSON-encoded. Raw-output modes, complex filters, and unrecognized options remain reportable. +* GitHub Actions queries now correctly classify the :code:`schedule` event when determining whether a workflow is externally triggerable. +* The :code:`actions/envvar-injection/critical` query now requires the untrusted source and privileged context to originate from the same trigger event. The environment variable injection queries also no longer treat pull request head labels as injection-capable because they cannot contain newlines. +* The :code:`actions/cache-poisoning/code-injection`, :code:`actions/cache-poisoning/direct-cache`, and :code:`actions/cache-poisoning/poisonable-step` queries now account for read-only cache access on low-trust triggers that run in the default branch scope. Results are retained for triggers that GitHub allows to write to that cache scope. + +Query Metadata Changes +~~~~~~~~~~~~~~~~~~~~~~ + +GitHub Actions +"""""""""""""" + +* The name and alert message of the :code:`actions/cache-poisoning/code-injection` query have been reworded for clarity. + +Language Libraries +------------------ + +Breaking Changes +~~~~~~~~~~~~~~~~ + +GitHub Actions +"""""""""""""" + +* The :code:`codeql.actions.security.SelfHostedQuery` module has been removed because runner labels do not reliably distinguish self-hosted runners from managed runners. + +Major Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +JavaScript/TypeScript +""""""""""""""""""""" + +* It is now possible for custom models to refer to specific files in the codebase, using a package name of form :code:`file:`. The model should describe the public exports of that file. This can be used to derive sources and sinks in code that imports the file, but note that sources and sinks will not generally be placed within the file itself. + For example, a source model :code:`['file:lib/service.js', 'Member[getData].ReturnValue', 'remote']` could identify :code:`require('../lib/service').getData()` as a source. + +Minor Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +C/C++ +""""" + +* Added flow source models for :code:`RegQueryValue` and related functions from the :code:`winreg.h` Windows header. + +JavaScript/TypeScript +""""""""""""""""""""" + +* JavaScript security queries using the :code:`response` threat model now track promise-wrapped client response data into promise fulfillment values. This may improve results for queries such as :code:`js/xss` when response data is consumed through :code:`.then(...)` chains. +* The route object returned by Vue Router's :code:`useRoute()` Composition API is now recognized as a client-side remote flow source, covering its :code:`query`, :code:`params`, :code:`path`, :code:`fullPath`, and :code:`hash` members. These members are additionally reported under the corresponding :code:`browser-url-query`, :code:`browser-url-path`, and :code:`browser-url-fragment` threat models. +* Added flow models for Vue's :code:`ref`, :code:`shallowRef`, :code:`toRef`, :code:`reactive`, and :code:`computed` Composition API helpers. +* Added support for treating declared :code:`inputs` properties in Sails Action2 controller files as remote flow sources. This may improve results for security queries such as :code:`js/path-injection`. + +Ruby +"""" + +* Removed library input to vendored gems from the set of taint sources. This should reduce false positives for :code:`rb/polynomial-redos`, :code:`rb/regex/badly-anchored-regexp`, :code:`rb/unsafe-code-construction`, :code:`rb/html-constructed-from-input`, and :code:`rb/shell-command-constructed-from-input` whenever vendoring is used. + +GitHub Actions +"""""""""""""" + +* GitHub Actions analysis now recognizes untrusted data in :code:`github.event.merge_group` for workflows triggered by the :code:`merge_group` event. diff --git a/docs/codeql/codeql-overview/codeql-changelog/index.rst b/docs/codeql/codeql-overview/codeql-changelog/index.rst index a0a2e1832d83..6562d3482c54 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/index.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/index.rst @@ -11,6 +11,7 @@ A list of queries for each suite and language `is available here Date: Mon, 17 Aug 2026 19:44:12 -0400 Subject: [PATCH 0352/2098] Actions: ActorIfCheck should not protect events that do not populate the checked field A condition like 'github.event.pull_request.user.login != ...' on a workflow triggered by issues events is always true since github.event.pull_request is not populated for issues events, but ActorIfCheck still treated it as a protective check, suppressing alerts such as actions/code-injection/critical. Override protectsCategoryAndEvent in ActorIfCheck so that checks on event payload fields only protect events whose payload contains the corresponding context, using contextTriggerDataModel as the mapping. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 4084febb-f9c7-44df-baf3-c8be8e9932a7 --- ...026-08-17-actor-if-check-event-validity.md | 4 ++ .../codeql/actions/security/ControlChecks.qll | 54 ++++++++++++++++--- .../workflows/actor_check_valid_event.yml | 12 +++++ .../workflows/actor_check_wrong_event.yml | 20 +++++++ .../CWE-094/CodeInjectionCritical.expected | 4 ++ .../CWE-094/CodeInjectionMedium.expected | 5 ++ 6 files changed, 93 insertions(+), 6 deletions(-) create mode 100644 actions/ql/lib/change-notes/2026-08-17-actor-if-check-event-validity.md create mode 100644 actions/ql/test/query-tests/Security/CWE-094/.github/workflows/actor_check_valid_event.yml create mode 100644 actions/ql/test/query-tests/Security/CWE-094/.github/workflows/actor_check_wrong_event.yml diff --git a/actions/ql/lib/change-notes/2026-08-17-actor-if-check-event-validity.md b/actions/ql/lib/change-notes/2026-08-17-actor-if-check-event-validity.md new file mode 100644 index 000000000000..18d10595a756 --- /dev/null +++ b/actions/ql/lib/change-notes/2026-08-17-actor-if-check-event-validity.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Altered the logic of `ActorIfCheck` so that checks on actor fields read from the event payload (e.g. `github.event.pull_request.user.login`) only count as protection for events whose payload actually populates that field. Previously, a condition such as `github.event.pull_request.user.login != 'name'` on a workflow triggered by `issues` events was treated as a protective check even though `github.event.pull_request` is not populated for `issues` events, which makes the condition vacuous. This change will result in more results being found by the queries that rely on control checks, such as `actions/code-injection/critical`. diff --git a/actions/ql/lib/codeql/actions/security/ControlChecks.qll b/actions/ql/lib/codeql/actions/security/ControlChecks.qll index 2228e9f96e21..a1058610871c 100644 --- a/actions/ql/lib/codeql/actions/security/ControlChecks.qll +++ b/actions/ql/lib/codeql/actions/security/ControlChecks.qll @@ -312,17 +312,28 @@ class LabelIfCheck extends LabelCheck instanceof If { } } +/** + * Gets a regular expression matching a condition on an actor field that is + * only populated for events whose payload contains the `context_prefix` context. + */ +private string eventPayloadActorFieldRegex(string context_prefix) { + context_prefix = "github.event.pull_request" and + result = "\\bgithub\\.event\\.pull_request\\.user\\.login\\b" + or + context_prefix = "github.event.head_commit" and + result = "\\bgithub\\.event\\.head_commit\\.author\\.name\\b" + or + context_prefix = "github.event.commits" and + result = "\\bgithub\\.event\\.commits.*\\.author\\.name\\b" +} + class ActorIfCheck extends ActorCheck instanceof If { ActorIfCheck() { // eg: github.event.pull_request.user.login == 'admin' exists( normalizeExpr(this.getCondition()) - .regexpFind([ - "\\bgithub\\.event\\.pull_request\\.user\\.login\\b", - "\\bgithub\\.event\\.head_commit\\.author\\.name\\b", - "\\bgithub\\.event\\.commits.*\\.author\\.name\\b", - "\\bgithub\\.event\\.sender\\.login\\b" - ], _, _) + .regexpFind([eventPayloadActorFieldRegex(_), "\\bgithub\\.event\\.sender\\.login\\b"], _, + _) ) or // eg: github.actor == 'admin' @@ -333,6 +344,37 @@ class ActorIfCheck extends ActorCheck instanceof If { ) and not normalizeExpr(this.getCondition()).matches("%[bot]%") } + + override predicate protectsCategoryAndEvent(string category, string event) { + ActorCheck.super.protectsCategoryAndEvent(category, event) and + ( + // `github.actor`, `github.triggering_actor` and `github.event.sender.login` + // are populated for every event + exists( + normalizeExpr(this.(If).getCondition()) + .regexpFind("\\bgithub\\.event\\.sender\\.login\\b", _, _) + ) + or + exists( + normalizeExpr(this.(If).getCondition()) + .regexpFind(["\\bgithub\\.actor\\b", "\\bgithub\\.triggering_actor\\b",], _, _) + ) and + not normalizeExpr(this.(If).getCondition()).matches("%[bot]%") + or + // actor fields read from the event payload are only populated for events + // whose payload contains the corresponding context. eg: a check on + // `github.event.pull_request.user.login` cannot restrict the actor of an + // `issues` event since `github.event.pull_request` is not populated there, + // which makes the condition vacuous + exists(string context_prefix | + contextTriggerDataModel(event, context_prefix) and + exists( + normalizeExpr(this.(If).getCondition()) + .regexpFind(eventPayloadActorFieldRegex(context_prefix), _, _) + ) + ) + ) + } } class PullRequestTargetRepositoryIfCheck extends RepositoryCheck instanceof If { diff --git a/actions/ql/test/query-tests/Security/CWE-094/.github/workflows/actor_check_valid_event.yml b/actions/ql/test/query-tests/Security/CWE-094/.github/workflows/actor_check_valid_event.yml new file mode 100644 index 000000000000..cd139700f078 --- /dev/null +++ b/actions/ql/test/query-tests/Security/CWE-094/.github/workflows/actor_check_valid_event.yml @@ -0,0 +1,12 @@ +on: + pull_request_target: + types: [opened] + +jobs: + # The `if:` condition checks an actor field that is populated for + # `pull_request_target` events, so the injectable step is protected. + valid-actor-check: + runs-on: ubuntu-latest + if: github.event.pull_request.user.login == 'trusted-user' + steps: + - run: echo '${{ github.event.pull_request.title }}' diff --git a/actions/ql/test/query-tests/Security/CWE-094/.github/workflows/actor_check_wrong_event.yml b/actions/ql/test/query-tests/Security/CWE-094/.github/workflows/actor_check_wrong_event.yml new file mode 100644 index 000000000000..fce829d4a9b4 --- /dev/null +++ b/actions/ql/test/query-tests/Security/CWE-094/.github/workflows/actor_check_wrong_event.yml @@ -0,0 +1,20 @@ +on: + issues: + types: [opened] + +jobs: + # The `if:` condition compares an actor field that is never populated for + # `issues` events, so it is always true and does not protect the injectable step. + vacuous-actor-check: + runs-on: ubuntu-latest + if: github.event.pull_request.user.login != 'some-bot[bot]' + steps: + - run: echo '${{ github.event.issue.title }}' + + # The `if:` condition checks an actor context that is populated for every + # event, so the injectable step is protected. + valid-actor-check: + runs-on: ubuntu-latest + if: github.actor == 'trusted-user' + steps: + - run: echo '${{ github.event.issue.title }}' diff --git a/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionCritical.expected b/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionCritical.expected index 02f7f68c05f4..d58f13b44d7f 100644 --- a/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionCritical.expected +++ b/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionCritical.expected @@ -270,6 +270,9 @@ nodes | .github/actions/external/ultralytics/actions/action.yaml:66:3:66:6 | input body | semmle.label | input body | | .github/actions/external/ultralytics/actions/action.yaml:96:16:96:33 | inputs.body | semmle.label | inputs.body | | .github/actions/external/ultralytics/actions/action.yaml:223:25:223:60 | github.head_ref \|\| github.ref | semmle.label | github.head_ref \|\| github.ref | +| .github/workflows/actor_check_valid_event.yml:12:21:12:58 | github.event.pull_request.title | semmle.label | github.event.pull_request.title | +| .github/workflows/actor_check_wrong_event.yml:12:21:12:51 | github.event.issue.title | semmle.label | github.event.issue.title | +| .github/workflows/actor_check_wrong_event.yml:20:21:20:51 | github.event.issue.title | semmle.label | github.event.issue.title | | .github/workflows/argus_case_study.yml:15:9:24:6 | Uses Step: remove_quotations [replaced] | semmle.label | Uses Step: remove_quotations [replaced] | | .github/workflows/argus_case_study.yml:17:25:17:53 | github.event.issue.title | semmle.label | github.event.issue.title | | .github/workflows/argus_case_study.yml:22:20:22:39 | env.ISSUE_TITLE | semmle.label | env.ISSUE_TITLE | @@ -710,6 +713,7 @@ subpaths | .github/actions/external/TestOrg/TestRepo/.github/actions/clone-repo/action.yaml:22:19:22:37 | inputs.title | .github/workflows/composite-action-caller-4.yml:14:19:14:56 | github.event.pull_request.title | .github/actions/external/TestOrg/TestRepo/.github/actions/clone-repo/action.yaml:22:19:22:37 | inputs.title | Potential code injection in $@, which may be controlled by an external user ($@). | .github/actions/external/TestOrg/TestRepo/.github/actions/clone-repo/action.yaml:22:19:22:37 | inputs.title | ${{ inputs.title }} | .github/workflows/composite-action-caller-4.yml:4:3:4:21 | pull_request_target | pull_request_target | | .github/actions/external/ultralytics/actions/action.yaml:96:16:96:33 | inputs.body | .github/workflows/test29.yml:35:18:35:54 | github.event.pull_request.body | .github/actions/external/ultralytics/actions/action.yaml:96:16:96:33 | inputs.body | Potential code injection in $@, which may be controlled by an external user ($@). | .github/actions/external/ultralytics/actions/action.yaml:96:16:96:33 | inputs.body | ${{ inputs.body }} | .github/workflows/test29.yml:12:3:12:21 | pull_request_target | pull_request_target | | .github/actions/external/ultralytics/actions/action.yaml:223:25:223:60 | github.head_ref \|\| github.ref | .github/actions/external/ultralytics/actions/action.yaml:223:25:223:60 | github.head_ref \|\| github.ref | .github/actions/external/ultralytics/actions/action.yaml:223:25:223:60 | github.head_ref \|\| github.ref | Potential code injection in $@, which may be controlled by an external user ($@). | .github/actions/external/ultralytics/actions/action.yaml:223:25:223:60 | github.head_ref \|\| github.ref | ${{ github.head_ref \|\| github.ref }} | .github/workflows/test29.yml:12:3:12:21 | pull_request_target | pull_request_target | +| .github/workflows/actor_check_wrong_event.yml:12:21:12:51 | github.event.issue.title | .github/workflows/actor_check_wrong_event.yml:12:21:12:51 | github.event.issue.title | .github/workflows/actor_check_wrong_event.yml:12:21:12:51 | github.event.issue.title | Potential code injection in $@, which may be controlled by an external user ($@). | .github/workflows/actor_check_wrong_event.yml:12:21:12:51 | github.event.issue.title | ${{ github.event.issue.title }} | .github/workflows/actor_check_wrong_event.yml:2:3:2:8 | issues | issues | | .github/workflows/argus_case_study.yml:27:33:27:77 | steps.remove_quotations.outputs.replaced | .github/workflows/argus_case_study.yml:17:25:17:53 | github.event.issue.title | .github/workflows/argus_case_study.yml:27:33:27:77 | steps.remove_quotations.outputs.replaced | Potential code injection in $@, which may be controlled by an external user ($@). | .github/workflows/argus_case_study.yml:27:33:27:77 | steps.remove_quotations.outputs.replaced | ${{steps.remove_quotations.outputs.replaced}} | .github/workflows/argus_case_study.yml:4:3:4:8 | issues | issues | | .github/workflows/artifactpoisoning1.yml:27:67:27:92 | steps.pr.outputs.id | .github/workflows/artifactpoisoning1.yml:14:9:20:6 | Uses Step | .github/workflows/artifactpoisoning1.yml:27:67:27:92 | steps.pr.outputs.id | Potential code injection in $@, which may be controlled by an external user ($@). | .github/workflows/artifactpoisoning1.yml:27:67:27:92 | steps.pr.outputs.id | ${{ steps.pr.outputs.id }} | .github/workflows/artifactpoisoning1.yml:4:3:4:14 | workflow_run | workflow_run | | .github/workflows/artifactpoisoning2.yml:22:17:22:42 | steps.pr.outputs.id | .github/workflows/artifactpoisoning2.yml:13:9:19:6 | Uses Step: pr | .github/workflows/artifactpoisoning2.yml:22:17:22:42 | steps.pr.outputs.id | Potential code injection in $@, which may be controlled by an external user ($@). | .github/workflows/artifactpoisoning2.yml:22:17:22:42 | steps.pr.outputs.id | ${{ steps.pr.outputs.id }} | .github/workflows/artifactpoisoning2.yml:4:3:4:14 | workflow_run | workflow_run | diff --git a/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionMedium.expected b/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionMedium.expected index 231d41bc2518..9833fd104e96 100644 --- a/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionMedium.expected +++ b/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionMedium.expected @@ -270,6 +270,9 @@ nodes | .github/actions/external/ultralytics/actions/action.yaml:66:3:66:6 | input body | semmle.label | input body | | .github/actions/external/ultralytics/actions/action.yaml:96:16:96:33 | inputs.body | semmle.label | inputs.body | | .github/actions/external/ultralytics/actions/action.yaml:223:25:223:60 | github.head_ref \|\| github.ref | semmle.label | github.head_ref \|\| github.ref | +| .github/workflows/actor_check_valid_event.yml:12:21:12:58 | github.event.pull_request.title | semmle.label | github.event.pull_request.title | +| .github/workflows/actor_check_wrong_event.yml:12:21:12:51 | github.event.issue.title | semmle.label | github.event.issue.title | +| .github/workflows/actor_check_wrong_event.yml:20:21:20:51 | github.event.issue.title | semmle.label | github.event.issue.title | | .github/workflows/argus_case_study.yml:15:9:24:6 | Uses Step: remove_quotations [replaced] | semmle.label | Uses Step: remove_quotations [replaced] | | .github/workflows/argus_case_study.yml:17:25:17:53 | github.event.issue.title | semmle.label | github.event.issue.title | | .github/workflows/argus_case_study.yml:22:20:22:39 | env.ISSUE_TITLE | semmle.label | env.ISSUE_TITLE | @@ -709,6 +712,8 @@ subpaths | .github/actions/action7/action.yml:214:41:214:69 | inputs.github_username | .github/actions/action7/action.yml:214:41:214:69 | inputs.github_username | .github/actions/action7/action.yml:214:41:214:69 | inputs.github_username | Potential code injection in $@, which may be controlled by an external user. | .github/actions/action7/action.yml:214:41:214:69 | inputs.github_username | ${{ inputs.github_username }} | | .github/actions/action7/action.yml:215:41:215:66 | inputs.github_email | .github/actions/action7/action.yml:215:41:215:66 | inputs.github_email | .github/actions/action7/action.yml:215:41:215:66 | inputs.github_email | Potential code injection in $@, which may be controlled by an external user. | .github/actions/action7/action.yml:215:41:215:66 | inputs.github_email | ${{ inputs.github_email }} | | .github/actions/action7/action.yml:217:25:217:60 | github.head_ref \|\| github.ref | .github/actions/action7/action.yml:217:25:217:60 | github.head_ref \|\| github.ref | .github/actions/action7/action.yml:217:25:217:60 | github.head_ref \|\| github.ref | Potential code injection in $@, which may be controlled by an external user. | .github/actions/action7/action.yml:217:25:217:60 | github.head_ref \|\| github.ref | ${{ github.head_ref \|\| github.ref }} | +| .github/workflows/actor_check_valid_event.yml:12:21:12:58 | github.event.pull_request.title | .github/workflows/actor_check_valid_event.yml:12:21:12:58 | github.event.pull_request.title | .github/workflows/actor_check_valid_event.yml:12:21:12:58 | github.event.pull_request.title | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/actor_check_valid_event.yml:12:21:12:58 | github.event.pull_request.title | ${{ github.event.pull_request.title }} | +| .github/workflows/actor_check_wrong_event.yml:20:21:20:51 | github.event.issue.title | .github/workflows/actor_check_wrong_event.yml:20:21:20:51 | github.event.issue.title | .github/workflows/actor_check_wrong_event.yml:20:21:20:51 | github.event.issue.title | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/actor_check_wrong_event.yml:20:21:20:51 | github.event.issue.title | ${{ github.event.issue.title }} | | .github/workflows/changed-files.yml:20:24:20:76 | steps.changed-files1.outputs.all_changed_files | .github/workflows/changed-files.yml:15:9:18:6 | Uses Step: changed-files1 | .github/workflows/changed-files.yml:20:24:20:76 | steps.changed-files1.outputs.all_changed_files | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/changed-files.yml:20:24:20:76 | steps.changed-files1.outputs.all_changed_files | ${{ steps.changed-files1.outputs.all_changed_files }} | | .github/workflows/changed-files.yml:40:24:40:76 | steps.changed-files3.outputs.all_changed_files | .github/workflows/changed-files.yml:33:9:38:6 | Uses Step: changed-files3 | .github/workflows/changed-files.yml:40:24:40:76 | steps.changed-files3.outputs.all_changed_files | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/changed-files.yml:40:24:40:76 | steps.changed-files3.outputs.all_changed_files | ${{ steps.changed-files3.outputs.all_changed_files }} | | .github/workflows/changed-files.yml:58:24:58:76 | steps.changed-files5.outputs.all_changed_files | .github/workflows/changed-files.yml:53:9:56:6 | Uses Step: changed-files5 | .github/workflows/changed-files.yml:58:24:58:76 | steps.changed-files5.outputs.all_changed_files | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/changed-files.yml:58:24:58:76 | steps.changed-files5.outputs.all_changed_files | ${{ steps.changed-files5.outputs.all_changed_files }} | From e51dc86f767c09c5a5dc2699378396cf9626fc89 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Tue, 18 Aug 2026 09:18:23 +0200 Subject: [PATCH 0353/2098] Update Rust log injection expected Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 890cb55d-0437-4bd7-9268-87b8897ada01 --- .../LogInjection.expected | 28 +++++++------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected b/rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected index 736d6dda4abd..6ab010521f33 100644 --- a/rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected +++ b/rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected @@ -1,20 +1,16 @@ #select -| main.rs:49:5:49:27 | ...::_print | main.rs:47:19:47:31 | ...::var | main.rs:49:5:49:27 | ...::_print | Log entry depends on a $@. | main.rs:47:19:47:31 | ...::var | user-provided value | -| main.rs:50:5:50:26 | ...::_eprint | main.rs:47:19:47:31 | ...::var | main.rs:50:5:50:26 | ...::_eprint | Log entry depends on a $@. | main.rs:47:19:47:31 | ...::var | user-provided value | -| main.rs:51:5:51:25 | ...::_print | main.rs:47:19:47:31 | ...::var | main.rs:51:5:51:25 | ...::_print | Log entry depends on a $@. | main.rs:47:19:47:31 | ...::var | user-provided value | -| main.rs:52:5:52:24 | ...::_eprint | main.rs:47:19:47:31 | ...::var | main.rs:52:5:52:24 | ...::_eprint | Log entry depends on a $@. | main.rs:47:19:47:31 | ...::var | user-provided value | +| main.rs:49:5:49:27 | FormatArgsExpr | main.rs:47:19:47:45 | ...::var(...) | main.rs:49:5:49:27 | FormatArgsExpr | Log entry depends on a $@. | main.rs:47:19:47:45 | ...::var(...) | user-provided value | +| main.rs:50:5:50:26 | FormatArgsExpr | main.rs:47:19:47:45 | ...::var(...) | main.rs:50:5:50:26 | FormatArgsExpr | Log entry depends on a $@. | main.rs:47:19:47:45 | ...::var(...) | user-provided value | +| main.rs:51:5:51:25 | FormatArgsExpr | main.rs:47:19:47:45 | ...::var(...) | main.rs:51:5:51:25 | FormatArgsExpr | Log entry depends on a $@. | main.rs:47:19:47:45 | ...::var(...) | user-provided value | +| main.rs:52:5:52:24 | FormatArgsExpr | main.rs:47:19:47:45 | ...::var(...) | main.rs:52:5:52:24 | FormatArgsExpr | Log entry depends on a $@. | main.rs:47:19:47:45 | ...::var(...) | user-provided value | edges -| main.rs:47:9:47:15 | tainted | main.rs:49:5:49:27 | FormatArgsExpr | provenance | | -| main.rs:47:9:47:15 | tainted | main.rs:50:5:50:26 | FormatArgsExpr | provenance | | -| main.rs:47:9:47:15 | tainted | main.rs:51:5:51:25 | FormatArgsExpr | provenance | | -| main.rs:47:9:47:15 | tainted | main.rs:52:5:52:24 | FormatArgsExpr | provenance | | -| main.rs:47:19:47:31 | ...::var | main.rs:47:19:47:45 | ...::var(...) [Ok] | provenance | Src:MaD:3 | +| main.rs:47:9:47:15 | tainted | main.rs:49:5:49:27 | FormatArgsExpr | provenance | Sink:MaD:2 | +| main.rs:47:9:47:15 | tainted | main.rs:50:5:50:26 | FormatArgsExpr | provenance | Sink:MaD:1 | +| main.rs:47:9:47:15 | tainted | main.rs:51:5:51:25 | FormatArgsExpr | provenance | Sink:MaD:2 | +| main.rs:47:9:47:15 | tainted | main.rs:52:5:52:24 | FormatArgsExpr | provenance | Sink:MaD:1 | +| main.rs:47:19:47:45 | ...::var(...) | main.rs:47:19:47:45 | ...::var(...) [Ok] | provenance | Src:MaD:3 | | main.rs:47:19:47:45 | ...::var(...) [Ok] | main.rs:47:19:47:65 | ... .unwrap_or_default() | provenance | MaD:4 | | main.rs:47:19:47:65 | ... .unwrap_or_default() | main.rs:47:9:47:15 | tainted | provenance | | -| main.rs:49:5:49:27 | FormatArgsExpr | main.rs:49:5:49:27 | ...::_print | provenance | MaD:2 Sink:MaD:2 | -| main.rs:50:5:50:26 | FormatArgsExpr | main.rs:50:5:50:26 | ...::_eprint | provenance | MaD:1 Sink:MaD:1 | -| main.rs:51:5:51:25 | FormatArgsExpr | main.rs:51:5:51:25 | ...::_print | provenance | MaD:2 Sink:MaD:2 | -| main.rs:52:5:52:24 | FormatArgsExpr | main.rs:52:5:52:24 | ...::_eprint | provenance | MaD:1 Sink:MaD:1 | models | 1 | Sink: std::io::stdio::_eprint; Argument[0]; log-injection | | 2 | Sink: std::io::stdio::_print; Argument[0]; log-injection | @@ -22,15 +18,11 @@ models | 4 | Summary: ::unwrap_or_default; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | nodes | main.rs:47:9:47:15 | tainted | semmle.label | tainted | -| main.rs:47:19:47:31 | ...::var | semmle.label | ...::var | +| main.rs:47:19:47:45 | ...::var(...) | semmle.label | ...::var(...) | | main.rs:47:19:47:45 | ...::var(...) [Ok] | semmle.label | ...::var(...) [Ok] | | main.rs:47:19:47:65 | ... .unwrap_or_default() | semmle.label | ... .unwrap_or_default() | -| main.rs:49:5:49:27 | ...::_print | semmle.label | ...::_print | | main.rs:49:5:49:27 | FormatArgsExpr | semmle.label | FormatArgsExpr | -| main.rs:50:5:50:26 | ...::_eprint | semmle.label | ...::_eprint | | main.rs:50:5:50:26 | FormatArgsExpr | semmle.label | FormatArgsExpr | -| main.rs:51:5:51:25 | ...::_print | semmle.label | ...::_print | | main.rs:51:5:51:25 | FormatArgsExpr | semmle.label | FormatArgsExpr | -| main.rs:52:5:52:24 | ...::_eprint | semmle.label | ...::_eprint | | main.rs:52:5:52:24 | FormatArgsExpr | semmle.label | FormatArgsExpr | subpaths From 5f1e8b894fe52ff0fb4275fa1c8510cee41e4a0e Mon Sep 17 00:00:00 2001 From: "Piotr P. Karwasz" Date: Tue, 18 Aug 2026 10:07:09 +0200 Subject: [PATCH 0354/2098] Java: update newSchemaFactory to the merged Commons XML 0.1.0 API apache/commons-xml#32 replaced the no-argument newSchemaFactory() with newSchemaFactory(String schemaLanguage), without keeping an overload. Update the 0.1.0 stub and the XXE test accordingly, as suggested by Copilot. The QL model matches the method by name, so no query or library changes are needed. Assisted-By: Claude Fable 5 --- .../test/query-tests/security/CWE-611/XmlFactoriesTests.java | 3 ++- .../org/apache/commons/xml/XmlFactories.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/java/ql/test/query-tests/security/CWE-611/XmlFactoriesTests.java b/java/ql/test/query-tests/security/CWE-611/XmlFactoriesTests.java index ebb1b54e3382..c5fcc18a3daa 100644 --- a/java/ql/test/query-tests/security/CWE-611/XmlFactoriesTests.java +++ b/java/ql/test/query-tests/security/CWE-611/XmlFactoriesTests.java @@ -1,5 +1,6 @@ import java.net.Socket; +import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.SAXParser; @@ -56,7 +57,7 @@ public void hardenedTransformer(Socket sock) throws Exception { } public void hardenedSchema(Socket sock) throws Exception { - SchemaFactory factory = XmlFactories.newSchemaFactory(); + SchemaFactory factory = XmlFactories.newSchemaFactory(XMLConstants.W3C_XML_SCHEMA_NS_URI); Schema schema = factory.newSchema(new StreamSource(sock.getInputStream())); // safe } } diff --git a/java/ql/test/stubs/apache-commons-xml-0.1.0/org/apache/commons/xml/XmlFactories.java b/java/ql/test/stubs/apache-commons-xml-0.1.0/org/apache/commons/xml/XmlFactories.java index 733a3f5aad33..0b820c958214 100644 --- a/java/ql/test/stubs/apache-commons-xml-0.1.0/org/apache/commons/xml/XmlFactories.java +++ b/java/ql/test/stubs/apache-commons-xml-0.1.0/org/apache/commons/xml/XmlFactories.java @@ -19,7 +19,7 @@ public static SAXParserFactory newSAXParserFactory() { return null; } - public static SchemaFactory newSchemaFactory() { + public static SchemaFactory newSchemaFactory(final String schemaLanguage) { return null; } From 4c4e13c20d5a7b5aef3f2369df1f5074d5d82e45 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Tue, 18 Aug 2026 09:58:26 +0200 Subject: [PATCH 0355/2098] Rust: Set `RUSTUP_AUTO_INSTALL=1` --- rust/extractor/src/config.rs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/rust/extractor/src/config.rs b/rust/extractor/src/config.rs index 7677025a66f2..8ff68ea8a547 100644 --- a/rust/extractor/src/config.rs +++ b/rust/extractor/src/config.rs @@ -108,14 +108,23 @@ impl Config { figment.extract().context("loading configuration") } + fn get_extra_env(&self) -> FxHashMap> { + let mut extra_env = FxHashMap::default(); + // RUSTUP_AUTO_INSTALL is set to 0 by rust-analyzer (https://github.com/rust-lang/rust-analyzer/issues/20719), + // but we do want to allow rustup to auto-install toolchains if needed, so we set it to 1 here. + extra_env.insert("RUSTUP_AUTO_INSTALL".to_owned(), Some("1".to_owned())); + extra_env.extend(self.cargo_extra_env.clone()); + extra_env + } + fn sysroot(&self, dir: &AbsPath) -> Sysroot { let sysroot_input = self.sysroot.as_ref().map(|p| join_path_buf(dir, p)); let sysroot_src_input = self.sysroot_src.as_ref().map(|p| join_path_buf(dir, p)); match (sysroot_input, sysroot_src_input) { - (None, None) => Sysroot::discover(dir, &self.cargo_extra_env), + (None, None) => Sysroot::discover(dir, &self.get_extra_env()), (Some(sysroot), None) => Sysroot::discover_rust_lib_src_dir(sysroot), (None, Some(sysroot_src)) => { - Sysroot::discover_with_src_override(dir, &self.cargo_extra_env, sysroot_src) + Sysroot::discover_with_src_override(dir, &self.get_extra_env(), sysroot_src) } (Some(sysroot), Some(sysroot_src)) => Sysroot::new(Some(sysroot), Some(sysroot_src)), } @@ -166,7 +175,7 @@ impl Config { .map(ToOwned::to_owned) .map(RustLibSource::Path), - extra_env: self.cargo_extra_env.clone(), + extra_env: self.get_extra_env(), extra_args: self.cargo_extra_args.clone(), extra_includes: self .extra_includes From df3ae641a0b765bac4ad5e3d0df212c806b160c7 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Tue, 18 Aug 2026 12:37:12 +0200 Subject: [PATCH 0356/2098] Go: move extractor smoke test into integration tests The standalone `go/extractor-smoke-test` (run only from `go/Makefile`'s `test` target) was redundant: its core invariant, that traced and untraced extraction produce the same result, is already asserted by the `test-extraction` integration test, whose traced and autobuild cases share a single `test.expected`. The control-flow query it ran is covered far more thoroughly by the CFG library test. The only combination not reproduced was autobuild under build tracing, so add a `test_autobuild_traced` case to `test-extraction` and delete the smoke test. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- CODEOWNERS | 1 - go/Makefile | 1 - go/extractor-smoke-test/.gitignore | 4 --- go/extractor-smoke-test/expected.csv | 12 --------- go/extractor-smoke-test/go.mod | 3 --- go/extractor-smoke-test/main.go | 8 ------ go/extractor-smoke-test/test.sh | 26 ------------------- .../integration-tests/test-extraction/test.py | 9 +++++++ 8 files changed, 9 insertions(+), 55 deletions(-) delete mode 100644 go/extractor-smoke-test/.gitignore delete mode 100644 go/extractor-smoke-test/expected.csv delete mode 100644 go/extractor-smoke-test/go.mod delete mode 100644 go/extractor-smoke-test/main.go delete mode 100755 go/extractor-smoke-test/test.sh diff --git a/CODEOWNERS b/CODEOWNERS index bceaafdbc07c..4b5bfd124d2a 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -11,7 +11,6 @@ /go/codeql-tools/ @github/codeql-go @github/code-scanning-language-coverage /go/downgrades/ @github/codeql-go @github/code-scanning-language-coverage /go/extractor/ @github/codeql-go @github/code-scanning-language-coverage -/go/extractor-smoke-test/ @github/codeql-go @github/code-scanning-language-coverage /go/ql/test/extractor-tests/ @github/codeql-go @github/code-scanning-language-coverage /java/ @github/codeql-java /javascript/ @github/codeql-javascript diff --git a/go/Makefile b/go/Makefile index 0b9dc9e4ea4c..86c690fcad9b 100644 --- a/go/Makefile +++ b/go/Makefile @@ -58,7 +58,6 @@ test: all build/testdb/check-upgrade-path # use GOOS=linux because GOOS=darwin GOARCH=386 is no longer supported env GOOS=linux GOARCH=386 codeql$(EXE) test run -j0 ql/test/query-tests/Security/CWE-681 --search-path .. --check-diff-informed --consistency-queries ql/consistency-queries --compilation-cache=$(cache) --dynamic-join-order-mode=$(rtjo) cd extractor; $(BAZEL) test ... - bash extractor-smoke-test/test.sh || (echo "Extractor smoke test FAILED"; exit 1) .PHONY: build/testdb/check-upgrade-path build/testdb/check-upgrade-path : build/testdb/go.dbscheme ql/lib/go.dbscheme diff --git a/go/extractor-smoke-test/.gitignore b/go/extractor-smoke-test/.gitignore deleted file mode 100644 index e32b11d7ee16..000000000000 --- a/go/extractor-smoke-test/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -*.bqrs -tracing-out.csv -notracing-out.csv -testdb diff --git a/go/extractor-smoke-test/expected.csv b/go/extractor-smoke-test/expected.csv deleted file mode 100644 index cb0eb08f8f42..000000000000 --- a/go/extractor-smoke-test/expected.csv +++ /dev/null @@ -1,12 +0,0 @@ -"1","assignment to i" -"assignment to i","selection of Println" -"call to Println","exit" -"entry","skip" -"entry","skip" -"function declaration","exit" -"i","call to Println" -"nd","col1" -"selection of Println","i" -"skip","1" -"skip","function declaration" -"skip","skip" diff --git a/go/extractor-smoke-test/go.mod b/go/extractor-smoke-test/go.mod deleted file mode 100644 index 0659b4eaec81..000000000000 --- a/go/extractor-smoke-test/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/codeql-go-extractor-smoke-test - -go 1.14 diff --git a/go/extractor-smoke-test/main.go b/go/extractor-smoke-test/main.go deleted file mode 100644 index 2f7b1325daa0..000000000000 --- a/go/extractor-smoke-test/main.go +++ /dev/null @@ -1,8 +0,0 @@ -package main - -import "fmt" - -func main() { - var i int = 1 - fmt.Println(i) -} diff --git a/go/extractor-smoke-test/test.sh b/go/extractor-smoke-test/test.sh deleted file mode 100755 index bd22da4d906e..000000000000 --- a/go/extractor-smoke-test/test.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash - -set -e - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" -cd $DIR - -rm -rf testdb - -codeql database create --language=go testdb --search-path ../.. -codeql dataset check testdb/db-go -codeql query run ../ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.ql --database=testdb --output=notracing-out.bqrs --search-path .. -codeql bqrs decode notracing-out.bqrs --format=csv --output=notracing-out.csv -diff -w -u <(sort notracing-out.csv) expected.csv - -# Now do it again with tracing enabled - -export CODEQL_EXTRACTOR_GO_BUILD_TRACING=on - -rm -rf testdb - -codeql database create --language=go testdb --search-path ../.. -codeql dataset check testdb/db-go -codeql query run ../ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.ql --database=testdb --output=tracing-out.bqrs --search-path .. -codeql bqrs decode tracing-out.bqrs --format=csv --output=tracing-out.csv -diff -w -u <(sort tracing-out.csv) expected.csv diff --git a/go/ql/integration-tests/test-extraction/test.py b/go/ql/integration-tests/test-extraction/test.py index e25b46801146..7b6caad350a1 100644 --- a/go/ql/integration-tests/test-extraction/test.py +++ b/go/ql/integration-tests/test-extraction/test.py @@ -5,3 +5,12 @@ def test_traced(codeql, go): def test_autobuild(codeql, go): codeql.database.create(source_root="src", extractor_option = ["extract_tests=true"]) + +def test_autobuild_traced(codeql, go): + # Autobuild under build tracing must produce the same database as untraced + # autobuild and explicit traced builds, all checked against test.expected. + codeql.database.create( + source_root="src", + extractor_option = ["extract_tests=true"], + _env={"CODEQL_EXTRACTOR_GO_BUILD_TRACING": "on"}, + ) From c537c1b524472a24d607a41a1c05378faaa7a497 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Tue, 18 Aug 2026 12:45:45 +0200 Subject: [PATCH 0357/2098] Rust: correct CWE-770 GlobalAlloc MISSING comments The `System.alloc`/`alloc_zeroed`/`realloc` sinks stopped matching because the standard library made `GlobalAlloc` a legacy trait blanket-implemented for `GlobalAllocator` types. These calls now resolve to the blanket-impl methods, which have no canonical path, so the `GlobalAlloc::*` sink models miss them. This is a QL/model matching gap, not a rust-analyzer resolution failure. --- rust/ql/test/query-tests/security/CWE-770/main.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-770/main.rs b/rust/ql/test/query-tests/security/CWE-770/main.rs index 33f8ed6e8412..df773adac6d0 100644 --- a/rust/ql/test/query-tests/security/CWE-770/main.rs +++ b/rust/ql/test/query-tests/security/CWE-770/main.rs @@ -190,8 +190,8 @@ unsafe fn test_system_alloc(v: usize) { let _ = std::alloc::Global.allocate_zeroed(l1).unwrap(); let l2 = std::alloc::Layout::array::(v).unwrap(); - // RA 0.0.347 no longer resolves the `GlobalAlloc` methods `System.alloc`/`alloc_zeroed`/`realloc`, - // so these sinks are no longer detected; tracked as MISSING pending a fix. + // `GlobalAlloc` is a legacy trait, blanket-implemented for `GlobalAllocator` types, so these + // resolve to the blanket impl whose methods have no canonical path; the sink models miss them. let _ = std::alloc::System.alloc(l2); // $ MISSING: Alert[rust/uncontrolled-allocation-size]=arg1 let _ = std::alloc::System.alloc_zeroed(l2); // $ MISSING: Alert[rust/uncontrolled-allocation-size]=arg1 let _ = std::alloc::System.allocate(l2).unwrap(); // $ Alert[rust/uncontrolled-allocation-size]=arg1 @@ -201,7 +201,7 @@ unsafe fn test_system_alloc(v: usize) { let l3 = std::alloc::Layout::array::(10).unwrap(); let m3 = std::alloc::System.alloc(l3); - // `System.realloc` unresolved by RA 0.0.347 (see note above); tracked as MISSING. + // `System.realloc` resolves to that same `GlobalAlloc` blanket impl (see above); MISSING. let _ = std::alloc::System.realloc(m3, l3, v); // $ MISSING: Alert[rust/uncontrolled-allocation-size]=arg1 let l4 = std::alloc::Layout::array::(10).unwrap(); From 5e4b7008390a553fc2e1643d9ba1104e1f376bce Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Tue, 18 Aug 2026 14:46:26 +0200 Subject: [PATCH 0358/2098] Go: de-bazel checks in test action The codegen drift and gofmt checks move to `semmle-code`, so drop them here to avoid duplication and replace the bazel build with a plain `go build ./...` sanity check. Keep the qhelp-to-markdown steps. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- go/actions/test/action.yml | 25 ++++--------------------- 1 file changed, 4 insertions(+), 21 deletions(-) diff --git a/go/actions/test/action.yml b/go/actions/test/action.yml index 4f3d7ad9377d..9f641e9125ae 100644 --- a/go/actions/test/action.yml +++ b/go/actions/test/action.yml @@ -1,12 +1,12 @@ name: Test Go extractor -description: Run build, QL tests, and optionally basic code sanity checks (formatting and generated code) for the Go extractor +description: Run build, QL tests, and optionally qhelp generation for the Go extractor inputs: go-test-version: description: Which Go version to use for running the tests required: false default: "~1.26.6" run-code-checks: - description: Whether to run formatting, code and qhelp generation checks + description: Whether to run qhelp generation checks required: false default: false runs: @@ -26,28 +26,11 @@ runs: shell: bash run: 'find .github/problem-matchers -name \*.json -exec echo "::add-matcher::{}" \;' - - name: Check checked-in generated code - if: inputs.run-code-checks == 'true' - shell: bash - run: | - bazel run go:gen - git add . - git diff --exit-code HEAD || ( - echo "please run bazel run //go:gen" - exit 1 - ) - - name: Build shell: bash run: | - bazel run go:go-installer - - - name: Check that all Go code is autoformatted - if: inputs.run-code-checks == 'true' && !cancelled() - shell: bash - run: | - cd go - make check-formatting + cd go/extractor + go build ./... - name: Compile qhelp files to markdown if: inputs.run-code-checks == 'true' && !cancelled() From f499e73c5e28741bd6173bd6b67c39c907a76b20 Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 18 Aug 2026 13:15:03 +0200 Subject: [PATCH 0359/2098] unified: Disable build on linux-arm64 --- unified/BUILD.bazel | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/unified/BUILD.bazel b/unified/BUILD.bazel index c30dbbdeee58..738a95b31552 100644 --- a/unified/BUILD.bazel +++ b/unified/BUILD.bazel @@ -1,6 +1,6 @@ load("@rules_pkg//pkg:mappings.bzl", "pkg_filegroup") +load("//misc/bazel:os.bzl", "codeql_platform_select") load("//misc/bazel:pkg.bzl", "codeql_pack", "codeql_pkg_files") -load("//misc/bazel:utils.bzl", "select_os") package(default_visibility = ["//visibility:public"]) @@ -41,12 +41,14 @@ codeql_pkg_files( codeql_pkg_files( name = "extractor-arch", - exes = select_os( - posix = ["//unified/extractor"], - windows = ["//unified/extractor-unsupported-os:extractor"], - ) + select_os( - linux = ["//unified/swift-syntax-rs:swift_runtime_libs"], - otherwise = [], + exes = codeql_platform_select( + linux64 = [ + "//unified/extractor", + "//unified/swift-syntax-rs:swift_runtime_libs", + ], + linux_arm64 = ["//unified/extractor-unsupported-os:extractor"], + osx64 = ["//unified/extractor"], + win64 = ["//unified/extractor-unsupported-os:extractor"], ), prefix = "tools/{CODEQL_PLATFORM}", ) From 3048f4788ed8339e238669c2aa85ab2324100cb2 Mon Sep 17 00:00:00 2001 From: Jordan Pike Date: Tue, 18 Aug 2026 10:13:43 -0400 Subject: [PATCH 0360/2098] Split payload-field actor checks into EventActorIfCheck Per review, ActorIfCheck now only covers github.actor and github.triggering_actor, which are populated for every event and need no event-validity override. Checks on actor fields read from the event payload move to the new EventActorIfCheck class, which only protects events whose payload populates the checked field. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 4084febb-f9c7-44df-baf3-c8be8e9932a7 --- ...026-08-17-actor-if-check-event-validity.md | 2 +- .../codeql/actions/security/ControlChecks.qll | 39 ++++++++++--------- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/actions/ql/lib/change-notes/2026-08-17-actor-if-check-event-validity.md b/actions/ql/lib/change-notes/2026-08-17-actor-if-check-event-validity.md index 18d10595a756..4397e9487415 100644 --- a/actions/ql/lib/change-notes/2026-08-17-actor-if-check-event-validity.md +++ b/actions/ql/lib/change-notes/2026-08-17-actor-if-check-event-validity.md @@ -1,4 +1,4 @@ --- category: minorAnalysis --- -* Altered the logic of `ActorIfCheck` so that checks on actor fields read from the event payload (e.g. `github.event.pull_request.user.login`) only count as protection for events whose payload actually populates that field. Previously, a condition such as `github.event.pull_request.user.login != 'name'` on a workflow triggered by `issues` events was treated as a protective check even though `github.event.pull_request` is not populated for `issues` events, which makes the condition vacuous. This change will result in more results being found by the queries that rely on control checks, such as `actions/code-injection/critical`. +* Checks on actor fields read from the event payload (e.g. `github.event.pull_request.user.login`) now only count as protection for events whose payload actually populates that field. These checks were split out of `ActorIfCheck` into a new class `EventActorIfCheck`, and `ActorIfCheck` now only covers `github.actor` and `github.triggering_actor`. Previously, a condition such as `github.event.pull_request.user.login != 'name'` on a workflow triggered by `issues` events was treated as a protective check even though `github.event.pull_request` is not populated for `issues` events, which makes the condition vacuous. This change will result in more results being found by the queries that rely on control checks, such as `actions/code-injection/critical`. diff --git a/actions/ql/lib/codeql/actions/security/ControlChecks.qll b/actions/ql/lib/codeql/actions/security/ControlChecks.qll index a1058610871c..a9fd20c12565 100644 --- a/actions/ql/lib/codeql/actions/security/ControlChecks.qll +++ b/actions/ql/lib/codeql/actions/security/ControlChecks.qll @@ -329,13 +329,6 @@ private string eventPayloadActorFieldRegex(string context_prefix) { class ActorIfCheck extends ActorCheck instanceof If { ActorIfCheck() { - // eg: github.event.pull_request.user.login == 'admin' - exists( - normalizeExpr(this.getCondition()) - .regexpFind([eventPayloadActorFieldRegex(_), "\\bgithub\\.event\\.sender\\.login\\b"], _, - _) - ) - or // eg: github.actor == 'admin' // eg: github.triggering_actor == 'admin' exists( @@ -344,28 +337,38 @@ class ActorIfCheck extends ActorCheck instanceof If { ) and not normalizeExpr(this.getCondition()).matches("%[bot]%") } +} + +/** An If node that checks an actor field from the event payload */ +class EventActorIfCheck extends ActorCheck instanceof If { + EventActorIfCheck() { + // eg: github.event.pull_request.user.login == 'admin' + exists( + normalizeExpr(this.getCondition()) + .regexpFind([eventPayloadActorFieldRegex(_), "\\bgithub\\.event\\.sender\\.login\\b"], _, + _) + ) + } override predicate protectsCategoryAndEvent(string category, string event) { ActorCheck.super.protectsCategoryAndEvent(category, event) and ( - // `github.actor`, `github.triggering_actor` and `github.event.sender.login` - // are populated for every event + // the `sender` object is part of every webhook event payload, + // so `github.event.sender.login` is populated for every event exists( normalizeExpr(this.(If).getCondition()) .regexpFind("\\bgithub\\.event\\.sender\\.login\\b", _, _) ) or - exists( - normalizeExpr(this.(If).getCondition()) - .regexpFind(["\\bgithub\\.actor\\b", "\\bgithub\\.triggering_actor\\b",], _, _) - ) and - not normalizeExpr(this.(If).getCondition()).matches("%[bot]%") - or - // actor fields read from the event payload are only populated for events - // whose payload contains the corresponding context. eg: a check on + // other actor fields are only populated for events whose payload contains + // the corresponding context. eg: a check on // `github.event.pull_request.user.login` cannot restrict the actor of an // `issues` event since `github.event.pull_request` is not populated there, - // which makes the condition vacuous + // which makes the condition vacuous. + // note that `github.event.head_commit` and `github.event.commits` are only + // populated for `push` events, which are not protectable by ActorCheck, so + // checks on those fields never count as protection here. they are still + // matched so that these Ifs keep being classified as actor checks exists(string context_prefix | contextTriggerDataModel(event, context_prefix) and exists( From 2ea969ddbc50e27c939508a8d497434cf04ad200 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Mon, 17 Aug 2026 13:39:04 +0100 Subject: [PATCH 0361/2098] C++: Add tests with missing flow sources. --- .../dataflow/external-models/flow.ext.yml | 3 ++ .../dataflow/external-models/sinks.expected | 5 +++ .../dataflow/external-models/test.cpp | 42 +++++++++++++++++++ 3 files changed, 50 insertions(+) diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml b/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml index 130e13a92571..87756c451f3a 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml @@ -4,6 +4,9 @@ extensions: extensible: sourceModel data: # namespace, type, subtypes, name, signature, ext, output, kind, provenance - ["", "", False, "ymlSource", "", "", "ReturnValue", "local", "manual"] + - ["", "", False, "ymlFieldSource", "", "", "ReturnValue.Field[SourceWrapper::value]", "local", "manual"] + - ["", "", False, "source_from_callback_template", "", "", "Argument[0].Parameter[*0].Field[SourceWrapper::value]", "local", "manual"] + - ["", "", False, "source_from_callback_ptr", "", "", "Argument[0].Parameter[*0].Field[SourceWrapper::value]", "local", "manual"] - addsTo: pack: codeql/cpp-all extensible: sinkModel diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected index a1f44de81589..858f12bdd69e 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected @@ -23,3 +23,8 @@ | test.cpp:201:10:201:10 | x | test-sink | | test.cpp:218:11:218:11 | x | test-sink | | test.cpp:224:11:224:11 | c | test-sink | +| test.cpp:243:13:243:17 | value | test-sink | +| test.cpp:248:18:248:22 | value | test-sink | +| test.cpp:254:14:254:18 | value | test-sink | +| test.cpp:258:14:258:18 | value | test-sink | +| test.cpp:263:15:263:19 | value | test-sink | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp index ebb20bab6497..44138fd16e79 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp @@ -223,4 +223,46 @@ void test_reverse_flow(unsigned i, unsigned j) { char c = s[j]; ymlSink(c); // $ ir } +} + + +struct SourceWrapper { + int value; +}; + +SourceWrapper ymlFieldSource(); + +template +void source_from_callback_template(F); + +using Callback = void(*)(const SourceWrapper*); + +void source_from_callback_ptr(Callback); + +void f(const SourceWrapper* s) { + ymlSink(s->value); // $ MISSING: ir=250:32 ir=251:27 +} + +void test_source_access_path() { + SourceWrapper wrapper = ymlFieldSource(); + ymlSink(wrapper.value); // $ MISSING: ir + + source_from_callback_template(f); + source_from_callback_ptr(f); + + source_from_callback_template([](const SourceWrapper* s) { + ymlSink(s->value); // $ MISSING: ir + }); + + source_from_callback_ptr([](const SourceWrapper* s) { + ymlSink(s->value); // $ MISSING: ir + }); + + struct S { + void operator()(const SourceWrapper* s) { + ymlSink(s->value); // $ MISSING: ir + } + }; + + source_from_callback_template(S()); } \ No newline at end of file From e9d9d3a007b115258255d83210505a8a28dbcf4d Mon Sep 17 00:00:00 2001 From: Jordan Pike Date: Tue, 18 Aug 2026 15:00:09 -0400 Subject: [PATCH 0362/2098] Simplify EventActorIfCheck by binding context_prefix as a field Per review, fold the sender case into eventPayloadActorFieldRegex and keep the matched context_prefix on the class instead of re-matching in the override. Also move the helper next to the class that uses it. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 4084febb-f9c7-44df-baf3-c8be8e9932a7 --- .../codeql/actions/security/ControlChecks.qll | 61 ++++++++----------- 1 file changed, 25 insertions(+), 36 deletions(-) diff --git a/actions/ql/lib/codeql/actions/security/ControlChecks.qll b/actions/ql/lib/codeql/actions/security/ControlChecks.qll index a9fd20c12565..675c1d18852b 100644 --- a/actions/ql/lib/codeql/actions/security/ControlChecks.qll +++ b/actions/ql/lib/codeql/actions/security/ControlChecks.qll @@ -312,6 +312,18 @@ class LabelIfCheck extends LabelCheck instanceof If { } } +class ActorIfCheck extends ActorCheck instanceof If { + ActorIfCheck() { + // eg: github.actor == 'admin' + // eg: github.triggering_actor == 'admin' + exists( + normalizeExpr(this.getCondition()) + .regexpFind(["\\bgithub\\.actor\\b", "\\bgithub\\.triggering_actor\\b",], _, _) + ) and + not normalizeExpr(this.getCondition()).matches("%[bot]%") + } +} + /** * Gets a regular expression matching a condition on an actor field that is * only populated for events whose payload contains the `context_prefix` context. @@ -325,57 +337,34 @@ private string eventPayloadActorFieldRegex(string context_prefix) { or context_prefix = "github.event.commits" and result = "\\bgithub\\.event\\.commits.*\\.author\\.name\\b" -} - -class ActorIfCheck extends ActorCheck instanceof If { - ActorIfCheck() { - // eg: github.actor == 'admin' - // eg: github.triggering_actor == 'admin' - exists( - normalizeExpr(this.getCondition()) - .regexpFind(["\\bgithub\\.actor\\b", "\\bgithub\\.triggering_actor\\b",], _, _) - ) and - not normalizeExpr(this.getCondition()).matches("%[bot]%") - } + or + context_prefix = "github.event.sender" and + result = "\\bgithub\\.event\\.sender\\.login\\b" } /** An If node that checks an actor field from the event payload */ class EventActorIfCheck extends ActorCheck instanceof If { + string context_prefix; + EventActorIfCheck() { // eg: github.event.pull_request.user.login == 'admin' exists( normalizeExpr(this.getCondition()) - .regexpFind([eventPayloadActorFieldRegex(_), "\\bgithub\\.event\\.sender\\.login\\b"], _, - _) + .regexpFind(eventPayloadActorFieldRegex(context_prefix), _, _) ) } override predicate protectsCategoryAndEvent(string category, string event) { ActorCheck.super.protectsCategoryAndEvent(category, event) and ( - // the `sender` object is part of every webhook event payload, - // so `github.event.sender.login` is populated for every event - exists( - normalizeExpr(this.(If).getCondition()) - .regexpFind("\\bgithub\\.event\\.sender\\.login\\b", _, _) - ) + // the `sender` object is part of every webhook event payload + context_prefix = "github.event.sender" or - // other actor fields are only populated for events whose payload contains - // the corresponding context. eg: a check on - // `github.event.pull_request.user.login` cannot restrict the actor of an - // `issues` event since `github.event.pull_request` is not populated there, - // which makes the condition vacuous. - // note that `github.event.head_commit` and `github.event.commits` are only - // populated for `push` events, which are not protectable by ActorCheck, so - // checks on those fields never count as protection here. they are still - // matched so that these Ifs keep being classified as actor checks - exists(string context_prefix | - contextTriggerDataModel(event, context_prefix) and - exists( - normalizeExpr(this.(If).getCondition()) - .regexpFind(eventPayloadActorFieldRegex(context_prefix), _, _) - ) - ) + // other actor fields only restrict events whose payload populates them. + // eg: `github.event.pull_request.user.login` cannot restrict the actor + // of an `issues` event since `github.event.pull_request` is not + // populated there, which makes the condition vacuous + contextTriggerDataModel(event, context_prefix) ) } } From dc6ee115443e58ff8f84ad2d2118aaafbf2b65b5 Mon Sep 17 00:00:00 2001 From: Jordan Pike Date: Tue, 18 Aug 2026 15:54:56 -0400 Subject: [PATCH 0363/2098] Add test coverage for sender, head_commit and commits checks Pins the sender.login special case (protects every event) and that head_commit/commits checks do not protect issues events, where those fields are not populated. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 4084febb-f9c7-44df-baf3-c8be8e9932a7 --- .../workflows/actor_check_wrong_event.yml | 26 +++++++++++++++++++ .../CWE-094/CodeInjectionCritical.expected | 5 ++++ .../CWE-094/CodeInjectionMedium.expected | 4 +++ 3 files changed, 35 insertions(+) diff --git a/actions/ql/test/query-tests/Security/CWE-094/.github/workflows/actor_check_wrong_event.yml b/actions/ql/test/query-tests/Security/CWE-094/.github/workflows/actor_check_wrong_event.yml index fce829d4a9b4..982956b3d953 100644 --- a/actions/ql/test/query-tests/Security/CWE-094/.github/workflows/actor_check_wrong_event.yml +++ b/actions/ql/test/query-tests/Security/CWE-094/.github/workflows/actor_check_wrong_event.yml @@ -18,3 +18,29 @@ jobs: if: github.actor == 'trusted-user' steps: - run: echo '${{ github.event.issue.title }}' + + # The `sender` object is part of every webhook event payload, so this + # check is effective and the injectable step is protected. + valid-sender-check: + runs-on: ubuntu-latest + if: github.event.sender.login == 'trusted-user' + steps: + - run: echo '${{ github.event.issue.title }}' + + # `github.event.head_commit` is only populated for `push` events, so this + # condition is always true for `issues` events and does not protect the + # injectable step. + vacuous-head-commit-check: + runs-on: ubuntu-latest + if: github.event.head_commit.author.name != 'some-bot' + steps: + - run: echo '${{ github.event.issue.title }}' + + # `github.event.commits` is only populated for `push` events, so this + # condition is always true for `issues` events and does not protect the + # injectable step. + vacuous-commits-check: + runs-on: ubuntu-latest + if: github.event.commits[0].author.name != 'some-bot' + steps: + - run: echo '${{ github.event.issue.title }}' diff --git a/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionCritical.expected b/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionCritical.expected index d58f13b44d7f..14e50942d734 100644 --- a/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionCritical.expected +++ b/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionCritical.expected @@ -273,6 +273,9 @@ nodes | .github/workflows/actor_check_valid_event.yml:12:21:12:58 | github.event.pull_request.title | semmle.label | github.event.pull_request.title | | .github/workflows/actor_check_wrong_event.yml:12:21:12:51 | github.event.issue.title | semmle.label | github.event.issue.title | | .github/workflows/actor_check_wrong_event.yml:20:21:20:51 | github.event.issue.title | semmle.label | github.event.issue.title | +| .github/workflows/actor_check_wrong_event.yml:28:21:28:51 | github.event.issue.title | semmle.label | github.event.issue.title | +| .github/workflows/actor_check_wrong_event.yml:37:21:37:51 | github.event.issue.title | semmle.label | github.event.issue.title | +| .github/workflows/actor_check_wrong_event.yml:46:21:46:51 | github.event.issue.title | semmle.label | github.event.issue.title | | .github/workflows/argus_case_study.yml:15:9:24:6 | Uses Step: remove_quotations [replaced] | semmle.label | Uses Step: remove_quotations [replaced] | | .github/workflows/argus_case_study.yml:17:25:17:53 | github.event.issue.title | semmle.label | github.event.issue.title | | .github/workflows/argus_case_study.yml:22:20:22:39 | env.ISSUE_TITLE | semmle.label | env.ISSUE_TITLE | @@ -714,6 +717,8 @@ subpaths | .github/actions/external/ultralytics/actions/action.yaml:96:16:96:33 | inputs.body | .github/workflows/test29.yml:35:18:35:54 | github.event.pull_request.body | .github/actions/external/ultralytics/actions/action.yaml:96:16:96:33 | inputs.body | Potential code injection in $@, which may be controlled by an external user ($@). | .github/actions/external/ultralytics/actions/action.yaml:96:16:96:33 | inputs.body | ${{ inputs.body }} | .github/workflows/test29.yml:12:3:12:21 | pull_request_target | pull_request_target | | .github/actions/external/ultralytics/actions/action.yaml:223:25:223:60 | github.head_ref \|\| github.ref | .github/actions/external/ultralytics/actions/action.yaml:223:25:223:60 | github.head_ref \|\| github.ref | .github/actions/external/ultralytics/actions/action.yaml:223:25:223:60 | github.head_ref \|\| github.ref | Potential code injection in $@, which may be controlled by an external user ($@). | .github/actions/external/ultralytics/actions/action.yaml:223:25:223:60 | github.head_ref \|\| github.ref | ${{ github.head_ref \|\| github.ref }} | .github/workflows/test29.yml:12:3:12:21 | pull_request_target | pull_request_target | | .github/workflows/actor_check_wrong_event.yml:12:21:12:51 | github.event.issue.title | .github/workflows/actor_check_wrong_event.yml:12:21:12:51 | github.event.issue.title | .github/workflows/actor_check_wrong_event.yml:12:21:12:51 | github.event.issue.title | Potential code injection in $@, which may be controlled by an external user ($@). | .github/workflows/actor_check_wrong_event.yml:12:21:12:51 | github.event.issue.title | ${{ github.event.issue.title }} | .github/workflows/actor_check_wrong_event.yml:2:3:2:8 | issues | issues | +| .github/workflows/actor_check_wrong_event.yml:37:21:37:51 | github.event.issue.title | .github/workflows/actor_check_wrong_event.yml:37:21:37:51 | github.event.issue.title | .github/workflows/actor_check_wrong_event.yml:37:21:37:51 | github.event.issue.title | Potential code injection in $@, which may be controlled by an external user ($@). | .github/workflows/actor_check_wrong_event.yml:37:21:37:51 | github.event.issue.title | ${{ github.event.issue.title }} | .github/workflows/actor_check_wrong_event.yml:2:3:2:8 | issues | issues | +| .github/workflows/actor_check_wrong_event.yml:46:21:46:51 | github.event.issue.title | .github/workflows/actor_check_wrong_event.yml:46:21:46:51 | github.event.issue.title | .github/workflows/actor_check_wrong_event.yml:46:21:46:51 | github.event.issue.title | Potential code injection in $@, which may be controlled by an external user ($@). | .github/workflows/actor_check_wrong_event.yml:46:21:46:51 | github.event.issue.title | ${{ github.event.issue.title }} | .github/workflows/actor_check_wrong_event.yml:2:3:2:8 | issues | issues | | .github/workflows/argus_case_study.yml:27:33:27:77 | steps.remove_quotations.outputs.replaced | .github/workflows/argus_case_study.yml:17:25:17:53 | github.event.issue.title | .github/workflows/argus_case_study.yml:27:33:27:77 | steps.remove_quotations.outputs.replaced | Potential code injection in $@, which may be controlled by an external user ($@). | .github/workflows/argus_case_study.yml:27:33:27:77 | steps.remove_quotations.outputs.replaced | ${{steps.remove_quotations.outputs.replaced}} | .github/workflows/argus_case_study.yml:4:3:4:8 | issues | issues | | .github/workflows/artifactpoisoning1.yml:27:67:27:92 | steps.pr.outputs.id | .github/workflows/artifactpoisoning1.yml:14:9:20:6 | Uses Step | .github/workflows/artifactpoisoning1.yml:27:67:27:92 | steps.pr.outputs.id | Potential code injection in $@, which may be controlled by an external user ($@). | .github/workflows/artifactpoisoning1.yml:27:67:27:92 | steps.pr.outputs.id | ${{ steps.pr.outputs.id }} | .github/workflows/artifactpoisoning1.yml:4:3:4:14 | workflow_run | workflow_run | | .github/workflows/artifactpoisoning2.yml:22:17:22:42 | steps.pr.outputs.id | .github/workflows/artifactpoisoning2.yml:13:9:19:6 | Uses Step: pr | .github/workflows/artifactpoisoning2.yml:22:17:22:42 | steps.pr.outputs.id | Potential code injection in $@, which may be controlled by an external user ($@). | .github/workflows/artifactpoisoning2.yml:22:17:22:42 | steps.pr.outputs.id | ${{ steps.pr.outputs.id }} | .github/workflows/artifactpoisoning2.yml:4:3:4:14 | workflow_run | workflow_run | diff --git a/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionMedium.expected b/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionMedium.expected index 9833fd104e96..f10a7a55c049 100644 --- a/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionMedium.expected +++ b/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionMedium.expected @@ -273,6 +273,9 @@ nodes | .github/workflows/actor_check_valid_event.yml:12:21:12:58 | github.event.pull_request.title | semmle.label | github.event.pull_request.title | | .github/workflows/actor_check_wrong_event.yml:12:21:12:51 | github.event.issue.title | semmle.label | github.event.issue.title | | .github/workflows/actor_check_wrong_event.yml:20:21:20:51 | github.event.issue.title | semmle.label | github.event.issue.title | +| .github/workflows/actor_check_wrong_event.yml:28:21:28:51 | github.event.issue.title | semmle.label | github.event.issue.title | +| .github/workflows/actor_check_wrong_event.yml:37:21:37:51 | github.event.issue.title | semmle.label | github.event.issue.title | +| .github/workflows/actor_check_wrong_event.yml:46:21:46:51 | github.event.issue.title | semmle.label | github.event.issue.title | | .github/workflows/argus_case_study.yml:15:9:24:6 | Uses Step: remove_quotations [replaced] | semmle.label | Uses Step: remove_quotations [replaced] | | .github/workflows/argus_case_study.yml:17:25:17:53 | github.event.issue.title | semmle.label | github.event.issue.title | | .github/workflows/argus_case_study.yml:22:20:22:39 | env.ISSUE_TITLE | semmle.label | env.ISSUE_TITLE | @@ -714,6 +717,7 @@ subpaths | .github/actions/action7/action.yml:217:25:217:60 | github.head_ref \|\| github.ref | .github/actions/action7/action.yml:217:25:217:60 | github.head_ref \|\| github.ref | .github/actions/action7/action.yml:217:25:217:60 | github.head_ref \|\| github.ref | Potential code injection in $@, which may be controlled by an external user. | .github/actions/action7/action.yml:217:25:217:60 | github.head_ref \|\| github.ref | ${{ github.head_ref \|\| github.ref }} | | .github/workflows/actor_check_valid_event.yml:12:21:12:58 | github.event.pull_request.title | .github/workflows/actor_check_valid_event.yml:12:21:12:58 | github.event.pull_request.title | .github/workflows/actor_check_valid_event.yml:12:21:12:58 | github.event.pull_request.title | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/actor_check_valid_event.yml:12:21:12:58 | github.event.pull_request.title | ${{ github.event.pull_request.title }} | | .github/workflows/actor_check_wrong_event.yml:20:21:20:51 | github.event.issue.title | .github/workflows/actor_check_wrong_event.yml:20:21:20:51 | github.event.issue.title | .github/workflows/actor_check_wrong_event.yml:20:21:20:51 | github.event.issue.title | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/actor_check_wrong_event.yml:20:21:20:51 | github.event.issue.title | ${{ github.event.issue.title }} | +| .github/workflows/actor_check_wrong_event.yml:28:21:28:51 | github.event.issue.title | .github/workflows/actor_check_wrong_event.yml:28:21:28:51 | github.event.issue.title | .github/workflows/actor_check_wrong_event.yml:28:21:28:51 | github.event.issue.title | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/actor_check_wrong_event.yml:28:21:28:51 | github.event.issue.title | ${{ github.event.issue.title }} | | .github/workflows/changed-files.yml:20:24:20:76 | steps.changed-files1.outputs.all_changed_files | .github/workflows/changed-files.yml:15:9:18:6 | Uses Step: changed-files1 | .github/workflows/changed-files.yml:20:24:20:76 | steps.changed-files1.outputs.all_changed_files | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/changed-files.yml:20:24:20:76 | steps.changed-files1.outputs.all_changed_files | ${{ steps.changed-files1.outputs.all_changed_files }} | | .github/workflows/changed-files.yml:40:24:40:76 | steps.changed-files3.outputs.all_changed_files | .github/workflows/changed-files.yml:33:9:38:6 | Uses Step: changed-files3 | .github/workflows/changed-files.yml:40:24:40:76 | steps.changed-files3.outputs.all_changed_files | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/changed-files.yml:40:24:40:76 | steps.changed-files3.outputs.all_changed_files | ${{ steps.changed-files3.outputs.all_changed_files }} | | .github/workflows/changed-files.yml:58:24:58:76 | steps.changed-files5.outputs.all_changed_files | .github/workflows/changed-files.yml:53:9:56:6 | Uses Step: changed-files5 | .github/workflows/changed-files.yml:58:24:58:76 | steps.changed-files5.outputs.all_changed_files | Potential code injection in $@, which may be controlled by an external user. | .github/workflows/changed-files.yml:58:24:58:76 | steps.changed-files5.outputs.all_changed_files | ${{ steps.changed-files5.outputs.all_changed_files }} | From bb6b3b9ed3ca2f0cc4d79c12a98b41f969d5e438 Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 19 Aug 2026 06:12:22 +0200 Subject: [PATCH 0364/2098] unified: Update error message --- unified/extractor-unsupported-os/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/extractor-unsupported-os/src/main.rs b/unified/extractor-unsupported-os/src/main.rs index a59217a2c09d..f8d4da14845e 100644 --- a/unified/extractor-unsupported-os/src/main.rs +++ b/unified/extractor-unsupported-os/src/main.rs @@ -1,4 +1,4 @@ fn main() { - eprintln!("Unsupported OS. Extraction is not currently supported on Windows."); + eprintln!("Unsupported OS. Extraction is not currently supported on this platform."); std::process::exit(1); } From 8a9ef4c1dd16604b858c727fccdac3ed2158d295 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Wed, 19 Aug 2026 09:42:05 +0200 Subject: [PATCH 0365/2098] Rust: Change canonical paths for trait items Use `crate::Trait::foo` instead of `<_ as crate::Trait>::foo` for trait items. --- .../ql/lib/codeql/rust/internal/PathResolution.qll | 14 ++++---------- .../canonical_path/canonical_paths.expected | 6 +++--- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index 15a67ff62679..dc061eab4e30 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -1095,31 +1095,25 @@ final class TraitItemNode extends ImplOrTraitItemNode, NamedItemNode, TypeItemNo bindingset[c] private string getCanonicalPathPart(Crate c, int i) { i = 0 and - result = "<_ as " - or - i = 1 and result = this.getCanonicalPathPrefix(c) or - i = 2 and + i = 1 and result = "::" or - i = 3 and + i = 2 and result = this.getName() - or - i = 4 and - result = ">" } language[monotonicAggregates] override string getCanonicalPath(Crate c) { this.hasCanonicalPath(c) and - result = strictconcat(int i | i in [1 .. 3] | this.getCanonicalPathPart(c, i) order by i) + result = strictconcat(int i | i in [0 .. 2] | this.getCanonicalPathPart(c, i) order by i) } language[monotonicAggregates] override string getCanonicalPathPrefixFor(Crate c, ItemNode child) { this.providesCanonicalPathPrefixFor(c, child) and - result = strictconcat(int i | i in [0 .. 4] | this.getCanonicalPathPart(c, i) order by i) + result = this.getCanonicalPath(c) } } diff --git a/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected b/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected index b6187932ec9b..7077a475647b 100644 --- a/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected +++ b/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected @@ -8,13 +8,13 @@ | regular.rs:1:1:2:18 | impl ...::PartialEq for Struct::<...> { ... } | | | regular.rs:1:1:2:18 | struct Struct | test::regular::Struct | | regular.rs:4:1:6:1 | trait Trait | test::regular::Trait | -| regular.rs:5:5:5:16 | fn f | <_ as test::regular::Trait>::f | +| regular.rs:5:5:5:16 | fn f | test::regular::Trait::f | | regular.rs:8:1:10:1 | impl Trait for Struct { ... } | | | regular.rs:9:5:9:18 | fn f | ::f | | regular.rs:12:1:14:1 | impl Struct { ... } | | | regular.rs:13:5:13:18 | fn g | ::g | | regular.rs:16:1:18:1 | trait TraitWithBlanketImpl | test::regular::TraitWithBlanketImpl | -| regular.rs:17:5:17:16 | fn h | <_ as test::regular::TraitWithBlanketImpl>::h | +| regular.rs:17:5:17:16 | fn h | test::regular::TraitWithBlanketImpl::h | | regular.rs:24:1:24:12 | fn free | test::regular::free | | regular.rs:26:1:32:1 | fn usage | test::regular::usage | | regular.rs:34:1:38:1 | enum MyEnum | test::regular::MyEnum | @@ -27,6 +27,6 @@ | regular.rs:66:5:66:40 | fn is_alphanum | test::regular::is_alphanum | | regular.rs:69:1:71:1 | fn is_number_or_letter | test::regular::is_number_or_letter | | regular.rs:73:1:75:1 | trait Abs | test::regular::Abs | -| regular.rs:74:5:74:25 | fn abs | <_ as test::regular::Abs>::abs | +| regular.rs:74:5:74:25 | fn abs | test::regular::Abs::abs | | regular.rs:77:1:85:1 | impl Abs for i32 { ... } | | | regular.rs:78:5:84:5 | fn abs | ::abs | From 2a7c932a8c33fd4eb6d1045853c76f60f558d122 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Wed, 19 Aug 2026 10:20:45 +0200 Subject: [PATCH 0366/2098] Rust: Update trait item canonical path references Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 5a15104d-a9a3-4506-8325-203af6db47f8 --- .../customizing-library-models-for-rust.rst | 6 +- .../rust/dataflow/internal/DataFlowImpl.qll | 2 +- .../rust/frameworks/asyncstd/io.model.yml | 4 +- .../codeql/rust/frameworks/futures.model.yml | 16 +- .../rust/frameworks/mysql-async.model.yml | 40 +-- .../codeql/rust/frameworks/mysql.model.yml | 74 +++--- .../rustcrypto/rustcrypto.model.yml | 26 +- .../lib/codeql/rust/frameworks/sqlx.model.yml | 2 +- .../rust/frameworks/stdlib/alloc.model.yml | 18 +- .../rust/frameworks/stdlib/core.model.yml | 164 ++++++------ .../rust/frameworks/stdlib/io.model.yml | 26 +- .../codeql/rust/frameworks/tokio/io.model.yml | 68 ++--- .../lib/codeql/rust/frameworks/warp.model.yml | 6 +- .../dataflow/collections/inline-flow.expected | 4 +- .../dataflow/global/inline-flow.expected | 2 +- .../dataflow/local/inline-flow.expected | 94 +++---- .../dataflow/modeled/inline-flow.expected | 114 ++++---- .../dataflow/models/models.expected | 18 +- .../dataflow/models/models.ext.yml | 4 +- .../sources/database/InlineFlow.expected | 134 +++++----- .../dataflow/sources/env/InlineFlow.expected | 48 ++-- .../dataflow/sources/file/InlineFlow.expected | 176 ++++++------- .../dataflow/sources/net/InlineFlow.expected | 210 +++++++-------- .../sources/stdin/InlineFlow.expected | 194 +++++++------- .../web_frameworks/InlineFlow.expected | 56 ++-- .../strings/inline-taint-flow.expected | 46 ++-- .../dataflow/taint/inline-taint-flow.expected | 248 +++++++++--------- .../security/CWE-022/TaintedPath.expected | 68 ++--- .../security/CWE-079/warp/XSS.expected | 2 +- .../security/CWE-089/SqlInjection.expected | 226 ++++++++-------- .../security/CWE-117/LogInjection.expected | 68 ++--- .../CWE-312/CleartextLogging.expected | 42 +-- .../security/CWE-614/InsecureCookie.expected | 208 +++++++-------- .../UncontrolledAllocationSize.expected | 172 ++++++------ .../HardcodedCryptographicValue.expected | 34 +-- .../security/CWE-918/RequestForgery.expected | 2 +- 36 files changed, 1311 insertions(+), 1311 deletions(-) diff --git a/docs/codeql/codeql-language-guides/customizing-library-models-for-rust.rst b/docs/codeql/codeql-language-guides/customizing-library-models-for-rust.rst index 7057812b31f5..16e0307421b4 100644 --- a/docs/codeql/codeql-language-guides/customizing-library-models-for-rust.rst +++ b/docs/codeql/codeql-language-guides/customizing-library-models-for-rust.rst @@ -74,7 +74,7 @@ Canonical paths take the following forms: - **Free functions**: ``crate::module::function``, for example ``std::env::var`` or ``std::fs::read_to_string``. - **Inherent methods**: ``::method``, for example ``::open``. - **Trait methods with a concrete type**: ``::method``, for example ``::read_to_end``. -- **Trait methods with a wildcard type**: ``<_ as Trait>::method``, for example ``<_ as core::clone::Clone>::clone``. This form matches any type that implements the trait and is useful for modeling broadly applicable trait methods. For a type that has a specific model (::method), that model will take precedence over the trait model. +- **Trait methods**: ``Trait::method``, for example ``core::clone::Clone::clone``. This form matches any type that implements the trait and is useful for modeling broadly applicable trait methods. For a type that has a specific model (``::method``), that model will take precedence over the trait model. Examples of custom model definitions ------------------------------------- @@ -270,10 +270,10 @@ We need to add tuples to the ``summaryModel(path, input, output, kind, provenanc pack: codeql/rust-all extensible: summaryModel data: - - ["<_ as core::iter::traits::iterator::Iterator>::map", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"] + - ["core::iter::traits::iterator::Iterator::map", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"] -- The first value ``<_ as core::iter::traits::iterator::Iterator>::map`` is the canonical path. The ``<_ as Trait>::method`` form uses a wildcard type (``_``) to match any type that implements the ``Iterator`` trait. +- The first value ``core::iter::traits::iterator::Iterator::map`` is the canonical path. The ``Trait::method`` form matches any type that implements the ``Iterator`` trait. - The second value ``Argument[self].Element`` is the access path to the input — the elements of the iterator (the receiver). - The third value ``Argument[0].Parameter[0]`` is the access path to the output: diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll index cb73c7f715d9..c038312f84dc 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll @@ -357,7 +357,7 @@ private module Aliases { * * However, this would require support for [generalized reverse flow][1], which * is not yet implemented, so instead we simulate reverse flow where it would - * have applied via the model for `<_ as core::ops::index::IndexMut>::index_mut`. + * have applied via the model for `core::ops::index::IndexMut::index_mut`. * * The same is the case for compound assignments like `a[i] += rhs`, which are * treated as `(*a.index_mut(i)).add_assign(rhs)`. diff --git a/rust/ql/lib/codeql/rust/frameworks/asyncstd/io.model.yml b/rust/ql/lib/codeql/rust/frameworks/asyncstd/io.model.yml index 99e14d0f0bc6..10c5b112a336 100644 --- a/rust/ql/lib/codeql/rust/frameworks/asyncstd/io.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/asyncstd/io.model.yml @@ -3,5 +3,5 @@ extensions: 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"] + - ["async_std::io::read::ReadExt::read", "Argument[self]", "Argument[0].Reference", "taint", "manual"] + - ["async_std::io::read::ReadExt::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/futures.model.yml b/rust/ql/lib/codeql/rust/frameworks/futures.model.yml index 29feee13616d..ccd7aebb6309 100644 --- a/rust/ql/lib/codeql/rust/frameworks/futures.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/futures.model.yml @@ -5,11 +5,11 @@ extensions: data: - ["futures_executor::local_pool::block_on", "Argument[0]", "ReturnValue", "value", "manual"] - ["::new", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["<_ as futures_util::io::AsyncReadExt>::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["<_ as futures_util::io::AsyncReadExt>::read_to_end", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["<_ as futures_util::io::AsyncBufReadExt>::read_line", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["<_ as futures_util::io::AsyncBufReadExt>::read_until", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"] - - ["<_ as futures_util::io::AsyncBufReadExt>::fill_buf", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as futures_util::io::AsyncBufReadExt>::lines", "Argument[self]", "ReturnValue", "taint", "manual"] - - ["<_ 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", "manual"] - - ["<_ as futures_io::if_std::AsyncRead>::poll_read", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"] + - ["futures_util::io::AsyncReadExt::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["futures_util::io::AsyncReadExt::read_to_end", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["futures_util::io::AsyncBufReadExt::read_line", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["futures_util::io::AsyncBufReadExt::read_until", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"] + - ["futures_util::io::AsyncBufReadExt::fill_buf", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["futures_util::io::AsyncBufReadExt::lines", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["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", "manual"] + - ["futures_io::if_std::AsyncRead::poll_read", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/mysql-async.model.yml b/rust/ql/lib/codeql/rust/frameworks/mysql-async.model.yml index 4c8858457c1d..9925945ecd69 100644 --- a/rust/ql/lib/codeql/rust/frameworks/mysql-async.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/mysql-async.model.yml @@ -3,28 +3,28 @@ extensions: pack: codeql/rust-all extensible: sinkModel data: - - ["<_ as mysql_async::queryable::Queryable>::query", "Argument[0]", "sql-injection", "manual"] - - ["<_ as mysql_async::queryable::Queryable>::query_drop", "Argument[0]", "sql-injection", "manual"] - - ["<_ as mysql_async::queryable::Queryable>::query_first", "Argument[0]", "sql-injection", "manual"] - - ["<_ as mysql_async::queryable::Queryable>::query_fold", "Argument[0]", "sql-injection", "manual"] - - ["<_ as mysql_async::queryable::Queryable>::query_stream", "Argument[0]", "sql-injection", "manual"] - - ["<_ as mysql_async::queryable::Queryable>::query_map", "Argument[0]", "sql-injection", "manual"] + - ["mysql_async::queryable::Queryable::query", "Argument[0]", "sql-injection", "manual"] + - ["mysql_async::queryable::Queryable::query_drop", "Argument[0]", "sql-injection", "manual"] + - ["mysql_async::queryable::Queryable::query_first", "Argument[0]", "sql-injection", "manual"] + - ["mysql_async::queryable::Queryable::query_fold", "Argument[0]", "sql-injection", "manual"] + - ["mysql_async::queryable::Queryable::query_stream", "Argument[0]", "sql-injection", "manual"] + - ["mysql_async::queryable::Queryable::query_map", "Argument[0]", "sql-injection", "manual"] - ["::query_iter", "Argument[0]", "sql-injection", "manual"] - ["::prep", "Argument[0]", "sql-injection", "manual"] - addsTo: pack: codeql/rust-all extensible: sourceModel data: - - ["<_ as mysql_async::queryable::Queryable>::query", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "database", "manual"] - - ["<_ as mysql_async::queryable::Queryable>::exec", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "database", "manual"] - - ["<_ as mysql_async::queryable::Queryable>::query_first", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "database", "manual"] - - ["<_ as mysql_async::queryable::Queryable>::exec_first", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "database", "manual"] - - ["<_ as mysql_async::queryable::Queryable>::query_fold", "Argument[2].Parameter[1]", "database", "manual"] - - ["<_ as mysql_async::queryable::Queryable>::exec_fold", "Argument[3].Parameter[1]", "database", "manual"] + - ["mysql_async::queryable::Queryable::query", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "database", "manual"] + - ["mysql_async::queryable::Queryable::exec", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "database", "manual"] + - ["mysql_async::queryable::Queryable::query_first", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "database", "manual"] + - ["mysql_async::queryable::Queryable::exec_first", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "database", "manual"] + - ["mysql_async::queryable::Queryable::query_fold", "Argument[2].Parameter[1]", "database", "manual"] + - ["mysql_async::queryable::Queryable::exec_fold", "Argument[3].Parameter[1]", "database", "manual"] - ["::query_iter", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "database", "manual"] - ["::exec_iter", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "database", "manual"] - - ["<_ as mysql_async::queryable::Queryable>::query_map", "Argument[1].Parameter[0]", "database", "manual"] - - ["<_ as mysql_async::queryable::Queryable>::exec_map", "Argument[2].Parameter[0]", "database", "manual"] + - ["mysql_async::queryable::Queryable::query_map", "Argument[1].Parameter[0]", "database", "manual"] + - ["mysql_async::queryable::Queryable::exec_map", "Argument[2].Parameter[0]", "database", "manual"] - ["::get", "ReturnValue.Field[core::option::Option::Some(0)]", "database", "manual"] - ["::get_opt", "ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]", "database", "manual"] - ["::take", "ReturnValue.Field[core::option::Option::Some(0)]", "database", "manual"] @@ -35,9 +35,9 @@ extensions: pack: codeql/rust-all extensible: summaryModel data: - - ["<_ as mysql_async::queryable::Queryable>::query_fold", "Argument[1]", "Argument[2].Parameter[0]", "value", "manual"] - - ["<_ as mysql_async::queryable::Queryable>::query_fold", "Argument[2].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "value", "manual"] - - ["<_ as mysql_async::queryable::Queryable>::exec_fold", "Argument[2]", "Argument[3].Parameter[0]", "value", "manual"] - - ["<_ as mysql_async::queryable::Queryable>::exec_fold", "Argument[3].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "value", "manual"] - - ["<_ as mysql_async::queryable::Queryable>::query_map", "Argument[1].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "value", "manual"] - - ["<_ as mysql_async::queryable::Queryable>::query_map", "Argument[2].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "value", "manual"] + - ["mysql_async::queryable::Queryable::query_fold", "Argument[1]", "Argument[2].Parameter[0]", "value", "manual"] + - ["mysql_async::queryable::Queryable::query_fold", "Argument[2].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "value", "manual"] + - ["mysql_async::queryable::Queryable::exec_fold", "Argument[2]", "Argument[3].Parameter[0]", "value", "manual"] + - ["mysql_async::queryable::Queryable::exec_fold", "Argument[3].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "value", "manual"] + - ["mysql_async::queryable::Queryable::query_map", "Argument[1].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "value", "manual"] + - ["mysql_async::queryable::Queryable::query_map", "Argument[2].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "value", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/mysql.model.yml b/rust/ql/lib/codeql/rust/frameworks/mysql.model.yml index 7d6fa520eb85..b1f43db0db14 100644 --- a/rust/ql/lib/codeql/rust/frameworks/mysql.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/mysql.model.yml @@ -3,52 +3,52 @@ extensions: pack: codeql/rust-all extensible: sinkModel data: - - ["<_ as mysql::conn::queryable::Queryable>::query", "Argument[0]", "sql-injection", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::query_opt", "Argument[0]", "sql-injection", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::query_drop", "Argument[0]", "sql-injection", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::query_first", "Argument[0]", "sql-injection", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::query_first_opt", "Argument[0]", "sql-injection", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::query_fold", "Argument[0]", "sql-injection", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::query_fold_opt", "Argument[0]", "sql-injection", "manual"] + - ["mysql::conn::queryable::Queryable::query", "Argument[0]", "sql-injection", "manual"] + - ["mysql::conn::queryable::Queryable::query_opt", "Argument[0]", "sql-injection", "manual"] + - ["mysql::conn::queryable::Queryable::query_drop", "Argument[0]", "sql-injection", "manual"] + - ["mysql::conn::queryable::Queryable::query_first", "Argument[0]", "sql-injection", "manual"] + - ["mysql::conn::queryable::Queryable::query_first_opt", "Argument[0]", "sql-injection", "manual"] + - ["mysql::conn::queryable::Queryable::query_fold", "Argument[0]", "sql-injection", "manual"] + - ["mysql::conn::queryable::Queryable::query_fold_opt", "Argument[0]", "sql-injection", "manual"] - ["::query_iter", "Argument[0]", "sql-injection", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::query_map", "Argument[0]", "sql-injection", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::query_map_opt", "Argument[0]", "sql-injection", "manual"] + - ["mysql::conn::queryable::Queryable::query_map", "Argument[0]", "sql-injection", "manual"] + - ["mysql::conn::queryable::Queryable::query_map_opt", "Argument[0]", "sql-injection", "manual"] - ["::prep", "Argument[0]", "sql-injection", "manual"] - addsTo: pack: codeql/rust-all extensible: sourceModel data: - - ["<_ as mysql::conn::queryable::Queryable>::query", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "database", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::exec", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "database", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::query_opt", "ReturnValue.Field[core::result::Result::Ok(0)].Element.Field[core::result::Result::Ok(0)]", "database", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::exec_opt", "ReturnValue.Field[core::result::Result::Ok(0)].Element.Field[core::result::Result::Ok(0)]", "database", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::query_first", "ReturnValue.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "database", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::exec_first", "ReturnValue.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "database", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::query_first_opt", "ReturnValue.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]", "database", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::exec_first_opt", "ReturnValue.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]", "database", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::query_fold", "Argument[2].Parameter[1]", "database", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::exec_fold", "Argument[3].Parameter[1]", "database", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::query_fold_opt", "Argument[2].Parameter[1].Field[core::result::Result::Ok(0)]", "database", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::exec_fold_opt", "Argument[3].Parameter[1].Field[core::result::Result::Ok(0)]", "database", "manual"] + - ["mysql::conn::queryable::Queryable::query", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "database", "manual"] + - ["mysql::conn::queryable::Queryable::exec", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "database", "manual"] + - ["mysql::conn::queryable::Queryable::query_opt", "ReturnValue.Field[core::result::Result::Ok(0)].Element.Field[core::result::Result::Ok(0)]", "database", "manual"] + - ["mysql::conn::queryable::Queryable::exec_opt", "ReturnValue.Field[core::result::Result::Ok(0)].Element.Field[core::result::Result::Ok(0)]", "database", "manual"] + - ["mysql::conn::queryable::Queryable::query_first", "ReturnValue.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "database", "manual"] + - ["mysql::conn::queryable::Queryable::exec_first", "ReturnValue.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "database", "manual"] + - ["mysql::conn::queryable::Queryable::query_first_opt", "ReturnValue.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]", "database", "manual"] + - ["mysql::conn::queryable::Queryable::exec_first_opt", "ReturnValue.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]", "database", "manual"] + - ["mysql::conn::queryable::Queryable::query_fold", "Argument[2].Parameter[1]", "database", "manual"] + - ["mysql::conn::queryable::Queryable::exec_fold", "Argument[3].Parameter[1]", "database", "manual"] + - ["mysql::conn::queryable::Queryable::query_fold_opt", "Argument[2].Parameter[1].Field[core::result::Result::Ok(0)]", "database", "manual"] + - ["mysql::conn::queryable::Queryable::exec_fold_opt", "Argument[3].Parameter[1].Field[core::result::Result::Ok(0)]", "database", "manual"] - ["::query_iter", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "database", "manual"] - ["::exec_iter", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "database", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::query_map", "Argument[1].Parameter[0]", "database", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::query_map_opt", "Argument[1].Parameter[0].Field[core::result::Result::Ok(0)]", "database", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::exec_map", "Argument[2].Parameter[0]", "database", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::exec_map_opt", "Argument[2].Parameter[0].Field[core::result::Result::Ok(0)]", "database", "manual"] + - ["mysql::conn::queryable::Queryable::query_map", "Argument[1].Parameter[0]", "database", "manual"] + - ["mysql::conn::queryable::Queryable::query_map_opt", "Argument[1].Parameter[0].Field[core::result::Result::Ok(0)]", "database", "manual"] + - ["mysql::conn::queryable::Queryable::exec_map", "Argument[2].Parameter[0]", "database", "manual"] + - ["mysql::conn::queryable::Queryable::exec_map_opt", "Argument[2].Parameter[0].Field[core::result::Result::Ok(0)]", "database", "manual"] - addsTo: pack: codeql/rust-all extensible: summaryModel data: - - ["<_ as mysql::conn::queryable::Queryable>::query_fold", "Argument[1]", "Argument[2].Parameter[0]", "value", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::query_fold", "Argument[2].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)]", "value", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::exec_fold", "Argument[2]", "Argument[3].Parameter[0]", "value", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::exec_fold", "Argument[3].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)]", "value", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::query_fold_opt", "Argument[1]", "Argument[2].Parameter[0]", "value", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::query_fold_opt", "Argument[2].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)]", "value", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::exec_fold_opt", "Argument[2]", "Argument[3].Parameter[0]", "value", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::exec_fold_opt", "Argument[3].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)]", "value", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::query_map", "Argument[1].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "value", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::query_map_opt", "Argument[1].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "value", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::exec_map", "Argument[2].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "value", "manual"] - - ["<_ as mysql::conn::queryable::Queryable>::exec_map_opt", "Argument[2].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "value", "manual"] + - ["mysql::conn::queryable::Queryable::query_fold", "Argument[1]", "Argument[2].Parameter[0]", "value", "manual"] + - ["mysql::conn::queryable::Queryable::query_fold", "Argument[2].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)]", "value", "manual"] + - ["mysql::conn::queryable::Queryable::exec_fold", "Argument[2]", "Argument[3].Parameter[0]", "value", "manual"] + - ["mysql::conn::queryable::Queryable::exec_fold", "Argument[3].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)]", "value", "manual"] + - ["mysql::conn::queryable::Queryable::query_fold_opt", "Argument[1]", "Argument[2].Parameter[0]", "value", "manual"] + - ["mysql::conn::queryable::Queryable::query_fold_opt", "Argument[2].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)]", "value", "manual"] + - ["mysql::conn::queryable::Queryable::exec_fold_opt", "Argument[2]", "Argument[3].Parameter[0]", "value", "manual"] + - ["mysql::conn::queryable::Queryable::exec_fold_opt", "Argument[3].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)]", "value", "manual"] + - ["mysql::conn::queryable::Queryable::query_map", "Argument[1].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "value", "manual"] + - ["mysql::conn::queryable::Queryable::query_map_opt", "Argument[1].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "value", "manual"] + - ["mysql::conn::queryable::Queryable::exec_map", "Argument[2].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "value", "manual"] + - ["mysql::conn::queryable::Queryable::exec_map_opt", "Argument[2].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "value", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml b/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml index 7ceae820001c..f4bcb94ba206 100644 --- a/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml @@ -3,19 +3,19 @@ extensions: pack: codeql/rust-all extensible: sinkModel data: - - ["<_ as digest::digest::Digest>::new_with_prefix", "Argument[0]", "hasher-input", "manual"] - - ["<_ as digest::digest::Digest>::update", "Argument[0]", "hasher-input", "manual"] - - ["<_ as digest::digest::Digest>::chain_update", "Argument[0]", "hasher-input", "manual"] - - ["<_ as digest::digest::Digest>::digest", "Argument[0]", "hasher-input", "manual"] + - ["digest::digest::Digest::new_with_prefix", "Argument[0]", "hasher-input", "manual"] + - ["digest::digest::Digest::update", "Argument[0]", "hasher-input", "manual"] + - ["digest::digest::Digest::chain_update", "Argument[0]", "hasher-input", "manual"] + - ["digest::digest::Digest::digest", "Argument[0]", "hasher-input", "manual"] - ["md5::compute", "Argument[0]", "hasher-input", "manual"] - - ["<_ as crypto_common::KeyInit>::new", "Argument[0]", "credentials-key", "manual"] - - ["<_ as crypto_common::KeyInit>::new", "Argument[1]", "credentials-iv", "manual"] - - ["<_ as crypto_common::KeyInit>::new_from_slice", "Argument[0]", "credentials-key", "manual"] - - ["<_ as crypto_common::KeyInit>::new_from_slice", "Argument[1]", "credentials-iv", "manual"] - - ["<_ as crypto_common::KeyIvInit>::new", "Argument[0]", "credentials-key", "manual"] - - ["<_ as crypto_common::KeyIvInit>::new", "Argument[1]", "credentials-iv", "manual"] - - ["<_ as crypto_common::KeyIvInit>::new_from_slice", "Argument[0]", "credentials-key", "manual"] - - ["<_ as crypto_common::KeyIvInit>::new_from_slice", "Argument[1]", "credentials-iv", "manual"] + - ["crypto_common::KeyInit::new", "Argument[0]", "credentials-key", "manual"] + - ["crypto_common::KeyInit::new", "Argument[1]", "credentials-iv", "manual"] + - ["crypto_common::KeyInit::new_from_slice", "Argument[0]", "credentials-key", "manual"] + - ["crypto_common::KeyInit::new_from_slice", "Argument[1]", "credentials-iv", "manual"] + - ["crypto_common::KeyIvInit::new", "Argument[0]", "credentials-key", "manual"] + - ["crypto_common::KeyIvInit::new", "Argument[1]", "credentials-iv", "manual"] + - ["crypto_common::KeyIvInit::new_from_slice", "Argument[0]", "credentials-key", "manual"] + - ["crypto_common::KeyIvInit::new_from_slice", "Argument[1]", "credentials-iv", "manual"] - ["::new", "Argument[0]", "credentials-key", "manual"] - ["::new", "Argument[1]", "credentials-iv", "manual"] - ["::new_from_slice", "Argument[0]", "credentials-key", "manual"] @@ -32,4 +32,4 @@ extensions: - ["::new", "Argument[1]", "credentials-iv", "manual"] - ["::new_from_slice", "Argument[0]", "credentials-key", "manual"] - ["::new_from_slice", "Argument[1]", "credentials-iv", "manual"] - - ["<_ as aead::Aead>::encrypt", "Argument[0]", "credentials-nonce", "manual"] + - ["aead::Aead::encrypt", "Argument[0]", "credentials-nonce", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/sqlx.model.yml b/rust/ql/lib/codeql/rust/frameworks/sqlx.model.yml index 082bde1f9425..57db37bd9eb5 100644 --- a/rust/ql/lib/codeql/rust/frameworks/sqlx.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/sqlx.model.yml @@ -10,7 +10,7 @@ extensions: - ["sqlx_core::query_scalar::query_scalar", "Argument[0]", "sql-injection", "manual"] - ["sqlx_core::query_scalar_with::query_scalar_with", "Argument[0]", "sql-injection", "manual"] - ["sqlx_core::raw_sql::raw_sql", "Argument[0]", "sql-injection", "manual"] - - ["<_ as sqlx_core::executor::Executor>::execute", "Argument[0]", "sql-injection", "manual"] + - ["sqlx_core::executor::Executor::execute", "Argument[0]", "sql-injection", "manual"] - addsTo: pack: codeql/rust-all extensible: sourceModel diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml index 427f0e6aed0b..7b97fdb1c4c9 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml @@ -13,12 +13,12 @@ extensions: - ["alloc::alloc::alloc", "Argument[0]", "alloc-layout", "manual"] - ["alloc::alloc::alloc_zeroed", "Argument[0]", "alloc-layout", "manual"] - ["alloc::alloc::realloc", "Argument[2]", "alloc-size", "manual"] - - ["<_ as core::alloc::global::GlobalAlloc>::alloc", "Argument[0]", "alloc-layout", "manual"] - - ["<_ as core::alloc::global::GlobalAlloc>::alloc_zeroed", "Argument[0]", "alloc-layout", "manual"] - - ["<_ as core::alloc::Allocator>::allocate", "Argument[0]", "alloc-layout", "manual"] - - ["<_ as core::alloc::Allocator>::allocate_zeroed", "Argument[0]", "alloc-layout", "manual"] - - ["<_ as core::alloc::Allocator>::grow", "Argument[2]", "alloc-layout", "manual"] - - ["<_ as core::alloc::Allocator>::grow_zeroed", "Argument[2]", "alloc-layout", "manual"] + - ["core::alloc::global::GlobalAlloc::alloc", "Argument[0]", "alloc-layout", "manual"] + - ["core::alloc::global::GlobalAlloc::alloc_zeroed", "Argument[0]", "alloc-layout", "manual"] + - ["core::alloc::Allocator::allocate", "Argument[0]", "alloc-layout", "manual"] + - ["core::alloc::Allocator::allocate_zeroed", "Argument[0]", "alloc-layout", "manual"] + - ["core::alloc::Allocator::grow", "Argument[2]", "alloc-layout", "manual"] + - ["core::alloc::Allocator::grow_zeroed", "Argument[2]", "alloc-layout", "manual"] - addsTo: pack: codeql/rust-all extensible: summaryModel @@ -49,7 +49,7 @@ extensions: # String - ["::as_str", "Argument[self].Reference", "ReturnValue.Reference", "taint", "manual"] - ["::as_bytes", "Argument[self].Reference", "ReturnValue.Reference.Element", "taint", "manual"] - - ["<_ as alloc::string::ToString>::to_string", "Argument[self].Reference", "ReturnValue", "taint", "manual"] + - ["alloc::string::ToString::to_string", "Argument[self].Reference", "ReturnValue", "taint", "manual"] # Overwrite generated model - ["::add", "Argument[self]", "ReturnValue", "taint", "manual"] - ["::add", "Argument[0].Reference", "ReturnValue", "taint", "manual"] @@ -57,8 +57,8 @@ extensions: - ["alloc::vec::from_elem", "Argument[0]", "ReturnValue.Element", "value", "manual"] - ["::deref", "Argument[self].Reference.Element", "ReturnValue.Reference.Element", "value", "manual"] # ToOwned - - ["<_ as alloc::borrow::ToOwned>::to_owned", "Argument[self].Reference", "ReturnValue", "taint", "manual"] - - ["<_ as alloc::borrow::ToOwned>::clone_into", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["alloc::borrow::ToOwned::to_owned", "Argument[self].Reference", "ReturnValue", "taint", "manual"] + - ["alloc::borrow::ToOwned::clone_into", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - addsTo: pack: codeql/rust-all extensible: neutralModel diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml index 895ebe98bd6b..69887cea50a4 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml @@ -6,102 +6,102 @@ extensions: # Builtin deref - ["<& as core::ops::deref::Deref>::deref", "Argument[self].Reference", "ReturnValue", "value", "manual"] - ["<&mut as core::ops::deref::Deref>::deref", "Argument[self].Reference", "ReturnValue", "value", "manual"] - - ["<_ as core::ops::deref::Deref>::deref", "Argument[self].Reference", "ReturnValue.Reference", "taint", "manual"] + - ["core::ops::deref::Deref::deref", "Argument[self].Reference", "ReturnValue.Reference", "taint", "manual"] # Index - - ["<_ as core::ops::index::Index>::index", "Argument[self].Reference.Element", "ReturnValue.Reference", "value", "manual"] - - ["<_ as core::ops::index::IndexMut>::index_mut", "Argument[self].Reference.Element", "ReturnValue.Reference", "value", "manual"] + - ["core::ops::index::Index::index", "Argument[self].Reference.Element", "ReturnValue.Reference", "value", "manual"] + - ["core::ops::index::IndexMut::index_mut", "Argument[self].Reference.Element", "ReturnValue.Reference", "value", "manual"] # Unary operators - - ["<_ as core::ops::arith::Neg>::neg", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["core::ops::arith::Neg::neg", "Argument[self]", "ReturnValue", "taint", "manual"] - ["::neg", "Argument[self].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["<_ as core::ops::bit::Not>::not", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["core::ops::bit::Not::not", "Argument[self]", "ReturnValue", "taint", "manual"] - ["::not", "Argument[self].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] # Arithmetic operators - - ["<_ as core::ops::arith::Add>::add", "Argument[self,0]", "ReturnValue", "taint", "manual"] - - ["<_ as core::ops::arith::Add>::add", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["<_ as core::ops::arith::Sub>::sub", "Argument[self,0]", "ReturnValue", "taint", "manual"] - - ["<_ as core::ops::arith::Sub>::sub", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["<_ as core::ops::arith::Mul>::mul", "Argument[self,0]", "ReturnValue", "taint", "manual"] - - ["<_ as core::ops::arith::Mul>::mul", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["<_ as core::ops::arith::Div>::div", "Argument[self,0]", "ReturnValue", "taint", "manual"] - - ["<_ as core::ops::arith::Div>::div", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["<_ as core::ops::arith::Rem>::rem", "Argument[self,0]", "ReturnValue", "taint", "manual"] - - ["<_ as core::ops::arith::Rem>::rem", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["core::ops::arith::Add::add", "Argument[self,0]", "ReturnValue", "taint", "manual"] + - ["core::ops::arith::Add::add", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["core::ops::arith::Sub::sub", "Argument[self,0]", "ReturnValue", "taint", "manual"] + - ["core::ops::arith::Sub::sub", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["core::ops::arith::Mul::mul", "Argument[self,0]", "ReturnValue", "taint", "manual"] + - ["core::ops::arith::Mul::mul", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["core::ops::arith::Div::div", "Argument[self,0]", "ReturnValue", "taint", "manual"] + - ["core::ops::arith::Div::div", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["core::ops::arith::Rem::rem", "Argument[self,0]", "ReturnValue", "taint", "manual"] + - ["core::ops::arith::Rem::rem", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] # Arithmetic assignment expressions - - ["<_ as core::ops::arith::AddAssign>::add_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] - - ["<_ as core::ops::arith::AddAssign>::add_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - - ["<_ as core::ops::arith::AddAssign>::add_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["<_ as core::ops::arith::AddAssign>::add_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["<_ as core::ops::arith::SubAssign>::sub_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] - - ["<_ as core::ops::arith::SubAssign>::sub_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - - ["<_ as core::ops::arith::SubAssign>::sub_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["<_ as core::ops::arith::SubAssign>::sub_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["<_ as core::ops::arith::MulAssign>::mul_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] - - ["<_ as core::ops::arith::MulAssign>::mul_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - - ["<_ as core::ops::arith::MulAssign>::mul_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["<_ as core::ops::arith::MulAssign>::mul_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["<_ as core::ops::arith::DivAssign>::div_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] - - ["<_ as core::ops::arith::DivAssign>::div_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - - ["<_ as core::ops::arith::DivAssign>::div_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["<_ as core::ops::arith::DivAssign>::div_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["<_ as core::ops::arith::RemAssign>::rem_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] - - ["<_ as core::ops::arith::RemAssign>::rem_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - - ["<_ as core::ops::arith::RemAssign>::rem_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["<_ as core::ops::arith::RemAssign>::rem_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["core::ops::arith::AddAssign::add_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["core::ops::arith::AddAssign::add_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["core::ops::arith::AddAssign::add_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["core::ops::arith::AddAssign::add_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["core::ops::arith::SubAssign::sub_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["core::ops::arith::SubAssign::sub_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["core::ops::arith::SubAssign::sub_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["core::ops::arith::SubAssign::sub_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["core::ops::arith::MulAssign::mul_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["core::ops::arith::MulAssign::mul_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["core::ops::arith::MulAssign::mul_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["core::ops::arith::MulAssign::mul_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["core::ops::arith::DivAssign::div_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["core::ops::arith::DivAssign::div_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["core::ops::arith::DivAssign::div_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["core::ops::arith::DivAssign::div_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["core::ops::arith::RemAssign::rem_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["core::ops::arith::RemAssign::rem_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["core::ops::arith::RemAssign::rem_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["core::ops::arith::RemAssign::rem_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] # Bitwise operators - - ["<_ as core::ops::bit::BitAnd>::bitand", "Argument[self,0]", "ReturnValue", "taint", "manual"] - - ["<_ as core::ops::bit::BitAnd>::bitand", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["<_ as core::ops::bit::BitOr>::bitor", "Argument[self,0]", "ReturnValue", "taint", "manual"] - - ["<_ as core::ops::bit::BitOr>::bitor", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["<_ as core::ops::bit::BitXor>::bitxor", "Argument[self,0]", "ReturnValue", "taint", "manual"] - - ["<_ as core::ops::bit::BitXor>::bitxor", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["core::ops::bit::BitAnd::bitand", "Argument[self,0]", "ReturnValue", "taint", "manual"] + - ["core::ops::bit::BitAnd::bitand", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["core::ops::bit::BitOr::bitor", "Argument[self,0]", "ReturnValue", "taint", "manual"] + - ["core::ops::bit::BitOr::bitor", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["core::ops::bit::BitXor::bitxor", "Argument[self,0]", "ReturnValue", "taint", "manual"] + - ["core::ops::bit::BitXor::bitxor", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] # Bitwise assignment operators - - ["<_ as core::ops::bit::BitAndAssign>::bitand_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] - - ["<_ as core::ops::bit::BitAndAssign>::bitand_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - - ["<_ as core::ops::bit::BitAndAssign>::bitand_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["<_ as core::ops::bit::BitAndAssign>::bitand_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["<_ as core::ops::bit::BitOrAssign>::bitor_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] - - ["<_ as core::ops::bit::BitOrAssign>::bitor_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - - ["<_ as core::ops::bit::BitOrAssign>::bitor_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["<_ as core::ops::bit::BitOrAssign>::bitor_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["<_ as core::ops::bit::BitXorAssign>::bitxor_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] - - ["<_ as core::ops::bit::BitXorAssign>::bitxor_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - - ["<_ as core::ops::bit::BitXorAssign>::bitxor_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["<_ as core::ops::bit::BitXorAssign>::bitxor_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["core::ops::bit::BitAndAssign::bitand_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["core::ops::bit::BitAndAssign::bitand_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["core::ops::bit::BitAndAssign::bitand_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["core::ops::bit::BitAndAssign::bitand_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["core::ops::bit::BitOrAssign::bitor_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["core::ops::bit::BitOrAssign::bitor_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["core::ops::bit::BitOrAssign::bitor_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["core::ops::bit::BitOrAssign::bitor_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["core::ops::bit::BitXorAssign::bitxor_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["core::ops::bit::BitXorAssign::bitxor_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["core::ops::bit::BitXorAssign::bitxor_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["core::ops::bit::BitXorAssign::bitxor_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] # Shift operators - - ["<_ as core::ops::bit::Shl>::shl", "Argument[self,0]", "ReturnValue", "taint", "manual"] - - ["<_ as core::ops::bit::Shl>::shl", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["<_ as core::ops::bit::Shr>::shr", "Argument[self,0]", "ReturnValue", "taint", "manual"] - - ["<_ as core::ops::bit::Shr>::shr", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["core::ops::bit::Shl::shl", "Argument[self,0]", "ReturnValue", "taint", "manual"] + - ["core::ops::bit::Shl::shl", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["core::ops::bit::Shr::shr", "Argument[self,0]", "ReturnValue", "taint", "manual"] + - ["core::ops::bit::Shr::shr", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] # Shift assignment operators - - ["<_ as core::ops::bit::ShlAssign>::shl_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] - - ["<_ as core::ops::bit::ShlAssign>::shl_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - - ["<_ as core::ops::bit::ShlAssign>::shl_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["<_ as core::ops::bit::ShlAssign>::shl_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["<_ as core::ops::bit::ShrAssign>::shr_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] - - ["<_ as core::ops::bit::ShrAssign>::shr_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - - ["<_ as core::ops::bit::ShrAssign>::shr_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["<_ as core::ops::bit::ShrAssign>::shr_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["core::ops::bit::ShlAssign::shl_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["core::ops::bit::ShlAssign::shl_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["core::ops::bit::ShlAssign::shl_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["core::ops::bit::ShlAssign::shl_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["core::ops::bit::ShrAssign::shr_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["core::ops::bit::ShrAssign::shr_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["core::ops::bit::ShrAssign::shr_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["core::ops::bit::ShrAssign::shr_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] # Clone - - ["<_ as core::clone::Clone>::clone", "Argument[self].Reference", "ReturnValue", "value", "manual"] + - ["core::clone::Clone::clone", "Argument[self].Reference", "ReturnValue", "value", "manual"] # Conversions - - ["<_ as core::convert::Into>::into", "Argument[self].Element", "ReturnValue.Element", "taint", "manual"] - - ["<_ as core::convert::Into>::into", "Argument[self].Reference.Element", "ReturnValue.Element", "taint", "manual"] + - ["core::convert::Into::into", "Argument[self].Element", "ReturnValue.Element", "taint", "manual"] + - ["core::convert::Into::into", "Argument[self].Reference.Element", "ReturnValue.Element", "taint", "manual"] # From - - ["<_ as core::convert::From>::from", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["core::convert::From::from", "Argument[0]", "ReturnValue", "taint", "manual"] # Iterator - ["::iter", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] - - ["<_ as value_trait::array::Array>::iter", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] + - ["value_trait::array::Array::iter", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] - ["::iter_mut", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] - ["::into_iter", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] - - ["<_ as core::iter::traits::iterator::Iterator>::for_each", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"] - - ["<_ as core::iter::traits::iterator::Iterator>::nth", "Argument[self].Reference.Element", "ReturnValue.Field[core::option::Option::Some(0)]", "value", "manual"] - - ["<_ as core::iter::traits::iterator::Iterator>::next", "Argument[self].Reference.Element", "ReturnValue.Field[core::option::Option::Some(0)]", "value", "manual"] - - ["<_ as core::iter::traits::iterator::Iterator>::collect", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] - - ["<_ as core::iter::traits::iterator::Iterator>::map", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"] - - ["<_ as core::iter::traits::iterator::Iterator>::for_each", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"] - - ["<_ as core::iter::traits::iterator::Iterator>::chain", "Argument[self]", "ReturnValue", "taint", "manual"] - - ["<_ as core::iter::traits::iterator::Iterator>::chain", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["<_ as core::iter::traits::iterator::Iterator>::take", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["core::iter::traits::iterator::Iterator::for_each", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"] + - ["core::iter::traits::iterator::Iterator::nth", "Argument[self].Reference.Element", "ReturnValue.Field[core::option::Option::Some(0)]", "value", "manual"] + - ["core::iter::traits::iterator::Iterator::next", "Argument[self].Reference.Element", "ReturnValue.Field[core::option::Option::Some(0)]", "value", "manual"] + - ["core::iter::traits::iterator::Iterator::collect", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] + - ["core::iter::traits::iterator::Iterator::map", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"] + - ["core::iter::traits::iterator::Iterator::for_each", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"] + - ["core::iter::traits::iterator::Iterator::chain", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["core::iter::traits::iterator::Iterator::chain", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["core::iter::traits::iterator::Iterator::take", "Argument[self]", "ReturnValue", "taint", "manual"] # Option - ["::map", "Argument[self].Field[core::option::Option::Some(0)]", "Argument[0].Parameter[0]", "value", "manual"] - ["::map", "Argument[0].ReturnValue", "ReturnValue.Field[core::option::Option::Some(0)]", "value", "manual"] @@ -130,9 +130,9 @@ extensions: - ["::trim", "Argument[self].Reference", "ReturnValue.Reference", "taint", "manual"] - ["::to_string", "Argument[self].Reference", "ReturnValue", "taint", "manual"] # Ord - - ["<_ as core::cmp::Ord>::min", "Argument[self,0]", "ReturnValue", "value", "manual"] - - ["<_ as core::cmp::Ord>::max", "Argument[self,0]", "ReturnValue", "value", "manual"] - - ["<_ as core::cmp::Ord>::clamp", "Argument[self,0,1]", "ReturnValue", "value", "manual"] + - ["core::cmp::Ord::min", "Argument[self,0]", "ReturnValue", "value", "manual"] + - ["core::cmp::Ord::max", "Argument[self,0]", "ReturnValue", "value", "manual"] + - ["core::cmp::Ord::clamp", "Argument[self,0,1]", "ReturnValue", "value", "manual"] # Slice - ["<[]>::get", "Argument[self].Reference.Element", "ReturnValue.Field[core::option::Option::Some(0)].Reference", "value", "manual"] - addsTo: diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/io.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/io.model.yml index d3eb2fa58af3..f6527ae912b7 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/io.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/io.model.yml @@ -9,20 +9,20 @@ extensions: extensible: summaryModel data: - ["::new", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["<_ as std::io::BufRead>::fill_buf", "Argument[self].Reference", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["std::io::BufRead::fill_buf", "Argument[self].Reference", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] - ["::buffer", "Argument[self].Reference", "ReturnValue.Reference", "taint", "manual"] - - ["<_ as std::io::Read>::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["<_ as std::io::Read>::read_to_string", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["<_ as std::io::Read>::read_to_end", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["<_ as std::io::Read>::read_exact", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["<_ as std::io::BufRead>::read_line", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["<_ as std::io::BufRead>::read_until", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"] - - ["<_ as std::io::BufRead>::split", "Argument[self]", "ReturnValue", "taint", "manual"] - - ["<_ as std::io::BufRead>::lines", "Argument[self]", "ReturnValue", "taint", "manual"] - - ["<_ as std::io::Read>::bytes", "Argument[self]", "ReturnValue", "taint", "manual"] - - ["<_ as std::io::Read>::chain", "Argument[self]", "ReturnValue", "taint", "manual"] - - ["<_ as std::io::Read>::chain", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["<_ as std::io::Read>::take", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["std::io::Read::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["std::io::Read::read_to_string", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["std::io::Read::read_to_end", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["std::io::Read::read_exact", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["std::io::BufRead::read_line", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["std::io::BufRead::read_until", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"] + - ["std::io::BufRead::split", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["std::io::BufRead::lines", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["std::io::Read::bytes", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["std::io::Read::chain", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["std::io::Read::chain", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["std::io::Read::take", "Argument[self]", "ReturnValue", "taint", "manual"] - ["::lock", "Argument[self].Reference", "ReturnValue", "taint", "manual"] - ["::read_line", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - ["::next", "Argument[self].Reference.Element", "ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]", "value", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/tokio/io.model.yml b/rust/ql/lib/codeql/rust/frameworks/tokio/io.model.yml index b5dafedb8b38..d2d7ce1a598f 100644 --- a/rust/ql/lib/codeql/rust/frameworks/tokio/io.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/tokio/io.model.yml @@ -9,40 +9,40 @@ extensions: extensible: summaryModel data: - ["::new", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["<_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::fill_buf", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["tokio::io::util::async_buf_read_ext::AsyncBufReadExt::fill_buf", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - ["::buffer", "Argument[self].Reference", "ReturnValue.Reference", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_string", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_end", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_exact", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["<_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_line", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["<_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_until", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"] - - ["<_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::split", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["tokio::io::util::async_read_ext::AsyncReadExt::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["tokio::io::util::async_read_ext::AsyncReadExt::read_to_string", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["tokio::io::util::async_read_ext::AsyncReadExt::read_to_end", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["tokio::io::util::async_read_ext::AsyncReadExt::read_exact", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["tokio::io::util::async_buf_read_ext::AsyncBufReadExt::read_line", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["tokio::io::util::async_buf_read_ext::AsyncBufReadExt::read_until", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"] + - ["tokio::io::util::async_buf_read_ext::AsyncBufReadExt::split", "Argument[self]", "ReturnValue", "taint", "manual"] - ["::next_segment", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::lines", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["tokio::io::util::async_buf_read_ext::AsyncBufReadExt::lines", "Argument[self]", "ReturnValue", "taint", "manual"] - ["::next_line", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_buf", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u8", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u8_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u16", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u16_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u32", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u32_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u64", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u64_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u128", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u128_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i8", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i8_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i16", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i16_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i32", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i32_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i64", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i64_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i128", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i128_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_f32", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>:::read_f32_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_f64", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["<_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_f64_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["tokio::io::util::async_read_ext::AsyncReadExt::read_buf", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["tokio::io::util::async_read_ext::AsyncReadExt::read_u8", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["tokio::io::util::async_read_ext::AsyncReadExt::read_u8_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["tokio::io::util::async_read_ext::AsyncReadExt::read_u16", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["tokio::io::util::async_read_ext::AsyncReadExt::read_u16_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["tokio::io::util::async_read_ext::AsyncReadExt::read_u32", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["tokio::io::util::async_read_ext::AsyncReadExt::read_u32_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["tokio::io::util::async_read_ext::AsyncReadExt::read_u64", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["tokio::io::util::async_read_ext::AsyncReadExt::read_u64_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["tokio::io::util::async_read_ext::AsyncReadExt::read_u128", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["tokio::io::util::async_read_ext::AsyncReadExt::read_u128_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i8", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i8_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i16", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i16_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i32", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i32_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i64", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i64_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i128", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i128_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["tokio::io::util::async_read_ext::AsyncReadExt::read_f32", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["tokio::io::util::async_read_ext::AsyncReadExt:::read_f32_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["tokio::io::util::async_read_ext::AsyncReadExt::read_f64", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["tokio::io::util::async_read_ext::AsyncReadExt::read_f64_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/warp.model.yml b/rust/ql/lib/codeql/rust/frameworks/warp.model.yml index 18757da57109..32ba4f1f0a84 100644 --- a/rust/ql/lib/codeql/rust/frameworks/warp.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/warp.model.yml @@ -3,9 +3,9 @@ extensions: pack: codeql/rust-all extensible: sourceModel data: - - ["<_ as warp::filter::Filter>::then", "Argument[0].Parameter[0..7]", "remote", "manual"] - - ["<_ as warp::filter::Filter>::map", "Argument[0].Parameter[0..7]", "remote", "manual"] - - ["<_ as warp::filter::Filter>::and_then", "Argument[0].Parameter[0..7]", "remote", "manual"] + - ["warp::filter::Filter::then", "Argument[0].Parameter[0..7]", "remote", "manual"] + - ["warp::filter::Filter::map", "Argument[0].Parameter[0..7]", "remote", "manual"] + - ["warp::filter::Filter::and_then", "Argument[0].Parameter[0..7]", "remote", "manual"] - addsTo: pack: codeql/rust-all extensible: sinkModel diff --git a/rust/ql/test/library-tests/dataflow/collections/inline-flow.expected b/rust/ql/test/library-tests/dataflow/collections/inline-flow.expected index e3eba23d036a..e4d20768e1e4 100644 --- a/rust/ql/test/library-tests/dataflow/collections/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/collections/inline-flow.expected @@ -1,7 +1,7 @@ models | 1 | Summary: <& as core::ops::deref::Deref>::deref; Argument[self].Reference; ReturnValue; value | -| 2 | Summary: <_ as core::ops::arith::AddAssign>::add_assign; Argument[0]; Argument[self].Reference; taint | -| 3 | Summary: <_ as core::ops::index::Index>::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 2 | Summary: core::ops::arith::AddAssign::add_assign; Argument[0]; Argument[self].Reference; taint | +| 3 | Summary: core::ops::index::Index::index; Argument[self].Reference.Element; ReturnValue.Reference; value | edges | main.rs:15:13:15:13 | s | main.rs:16:20:16:20 | s | provenance | | | main.rs:15:17:15:25 | source(...) | main.rs:15:13:15:13 | s | provenance | | diff --git a/rust/ql/test/library-tests/dataflow/global/inline-flow.expected b/rust/ql/test/library-tests/dataflow/global/inline-flow.expected index 4828b56542b8..299fd896ad68 100644 --- a/rust/ql/test/library-tests/dataflow/global/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/global/inline-flow.expected @@ -1,6 +1,6 @@ models | 1 | Summary: <& as core::ops::deref::Deref>::deref; Argument[self].Reference; ReturnValue; value | -| 2 | Summary: <_ as core::ops::arith::Mul>::mul; Argument[self,0]; ReturnValue; taint | +| 2 | Summary: core::ops::arith::Mul::mul; Argument[self,0]; ReturnValue; taint | | 3 | Summary: futures_executor::local_pool::block_on; Argument[0]; ReturnValue; value | edges | main.rs:12:28:14:1 | { ... } | main.rs:17:13:17:23 | get_data(...) | provenance | | 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 3b8052fdc84a..e9c603a97eb3 100644 --- a/rust/ql/test/library-tests/dataflow/local/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/local/inline-flow.expected @@ -1,23 +1,23 @@ models | 1 | Summary: <& as core::ops::deref::Deref>::deref; Argument[self].Reference; ReturnValue; value | -| 2 | Summary: <_ as alloc::string::ToString>::to_string; Argument[self].Reference; ReturnValue; taint | -| 3 | Summary: <_ as core::convert::Into>::into; Argument[self].Element; ReturnValue.Element; taint | -| 4 | Summary: <_ as core::convert::Into>::into; Argument[self].Reference.Element; ReturnValue.Element; taint | -| 5 | Summary: <_ as core::ops::index::Index>::index; Argument[self].Reference.Element; ReturnValue.Reference; value | -| 6 | Summary: ::deref; Argument[self].Reference.Field[alloc::boxed::Box(0)]; ReturnValue.Reference; value | -| 7 | Summary: ::new; Argument[0]; ReturnValue.Field[alloc::boxed::Box(0)]; value | -| 8 | Summary: ::deref; Argument[self]; ReturnValue; value | -| 9 | Summary: ::from; Argument[0]; ReturnValue; taint | -| 10 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 11 | Summary: ::unwrap_or; Argument[0]; ReturnValue; value | -| 12 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 13 | Summary: ::unwrap_or_else; Argument[0].ReturnValue; ReturnValue; value | -| 14 | Summary: ::unwrap_or_else; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 15 | Summary: ::err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 16 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 17 | Summary: ::expect_err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue; value | -| 18 | Summary: ::ok; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 19 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 2 | Summary: ::deref; Argument[self].Reference.Field[alloc::boxed::Box(0)]; ReturnValue.Reference; value | +| 3 | Summary: ::new; Argument[0]; ReturnValue.Field[alloc::boxed::Box(0)]; value | +| 4 | Summary: ::deref; Argument[self]; ReturnValue; value | +| 5 | Summary: ::from; Argument[0]; ReturnValue; taint | +| 6 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 7 | Summary: ::unwrap_or; Argument[0]; ReturnValue; value | +| 8 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 9 | Summary: ::unwrap_or_else; Argument[0].ReturnValue; ReturnValue; value | +| 10 | Summary: ::unwrap_or_else; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 11 | Summary: ::err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 12 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 13 | Summary: ::expect_err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue; value | +| 14 | Summary: ::ok; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 15 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 16 | Summary: alloc::string::ToString::to_string; Argument[self].Reference; ReturnValue; taint | +| 17 | Summary: core::convert::Into::into; Argument[self].Element; ReturnValue.Element; taint | +| 18 | Summary: core::convert::Into::into; Argument[self].Reference.Element; ReturnValue.Element; taint | +| 19 | Summary: core::ops::index::Index::index; Argument[self].Reference.Element; ReturnValue.Reference; value | edges | main.rs:23:9:23:9 | s | main.rs:24:10:24:10 | s | provenance | | | main.rs:23:9:23:9 | s | main.rs:26:12:26:12 | x | provenance | | @@ -45,8 +45,8 @@ edges | main.rs:82:5:82:5 | l | main.rs:83:10:83:10 | l | provenance | | | main.rs:115:9:115:9 | i [Box(0)] | main.rs:116:11:116:11 | i [Box(0)] | provenance | | | main.rs:115:13:115:31 | ...::new(...) [Box(0)] | main.rs:115:9:115:9 | i [Box(0)] | provenance | | -| main.rs:115:22:115:30 | source(...) | main.rs:115:13:115:31 | ...::new(...) [Box(0)] | provenance | MaD:7 | -| main.rs:116:11:116:11 | i [Box(0)] | main.rs:116:10:116:11 | * ... | provenance | MaD:6 | +| main.rs:115:22:115:30 | source(...) | main.rs:115:13:115:31 | ...::new(...) [Box(0)] | provenance | MaD:3 | +| main.rs:116:11:116:11 | i [Box(0)] | main.rs:116:10:116:11 | * ... | provenance | MaD:2 | | main.rs:123:9:123:9 | a [tuple.0] | main.rs:124:10:124:10 | a [tuple.0] | provenance | | | main.rs:123:13:123:26 | TupleExpr [tuple.0] | main.rs:123:9:123:9 | a [tuple.0] | provenance | | | main.rs:123:14:123:22 | source(...) | main.rs:123:13:123:26 | TupleExpr [tuple.0] | provenance | | @@ -129,17 +129,17 @@ edges | main.rs:278:9:278:10 | s1 [Some] | main.rs:279:10:279:11 | s1 [Some] | provenance | | | main.rs:278:14:278:29 | Some(...) [Some] | main.rs:278:9:278:10 | s1 [Some] | provenance | | | main.rs:278:19:278:28 | source(...) | main.rs:278:14:278:29 | Some(...) [Some] | provenance | | -| main.rs:279:10:279:11 | s1 [Some] | main.rs:279:10:279:20 | s1.unwrap() | provenance | MaD:10 | +| main.rs:279:10:279:11 | s1 [Some] | main.rs:279:10:279:20 | s1.unwrap() | provenance | MaD:6 | | main.rs:283:9:283:10 | s1 [Some] | main.rs:284:10:284:11 | s1 [Some] | provenance | | | main.rs:283:14:283:29 | Some(...) [Some] | main.rs:283:9:283:10 | s1 [Some] | provenance | | | main.rs:283:19:283:28 | source(...) | main.rs:283:14:283:29 | Some(...) [Some] | provenance | | -| main.rs:284:10:284:11 | s1 [Some] | main.rs:284:10:284:24 | s1.unwrap_or(...) | provenance | MaD:12 | -| main.rs:287:23:287:32 | source(...) | main.rs:287:10:287:33 | s2.unwrap_or(...) | provenance | MaD:11 | +| main.rs:284:10:284:11 | s1 [Some] | main.rs:284:10:284:24 | s1.unwrap_or(...) | provenance | MaD:8 | +| main.rs:287:23:287:32 | source(...) | main.rs:287:10:287:33 | s2.unwrap_or(...) | provenance | MaD:7 | | main.rs:291:9:291:10 | s1 [Some] | main.rs:292:10:292:11 | s1 [Some] | provenance | | | main.rs:291:14:291:29 | Some(...) [Some] | main.rs:291:9:291:10 | s1 [Some] | provenance | | | main.rs:291:19:291:28 | source(...) | main.rs:291:14:291:29 | Some(...) [Some] | provenance | | -| main.rs:292:10:292:11 | s1 [Some] | main.rs:292:10:292:32 | s1.unwrap_or_else(...) | provenance | MaD:14 | -| main.rs:295:31:295:40 | source(...) | main.rs:295:10:295:41 | s2.unwrap_or_else(...) | provenance | MaD:13 | +| main.rs:292:10:292:11 | s1 [Some] | main.rs:292:10:292:32 | s1.unwrap_or_else(...) | provenance | MaD:10 | +| main.rs:295:31:295:40 | source(...) | main.rs:295:10:295:41 | s2.unwrap_or_else(...) | provenance | MaD:9 | | main.rs:299:9:299:10 | s1 [Some] | main.rs:301:14:301:15 | s1 [Some] | provenance | | | main.rs:299:14:299:29 | Some(...) [Some] | main.rs:299:9:299:10 | s1 [Some] | provenance | | | main.rs:299:19:299:28 | source(...) | main.rs:299:14:299:29 | Some(...) [Some] | provenance | | @@ -150,16 +150,16 @@ edges | main.rs:308:32:308:45 | Ok(...) [Ok] | main.rs:308:9:308:10 | r1 [Ok] | provenance | | | main.rs:308:35:308:44 | source(...) | main.rs:308:32:308:45 | Ok(...) [Ok] | provenance | | | main.rs:309:9:309:11 | o1a [Some] | main.rs:311:10:311:12 | o1a [Some] | provenance | | -| main.rs:309:28:309:29 | r1 [Ok] | main.rs:309:28:309:34 | r1.ok() [Some] | provenance | MaD:18 | +| main.rs:309:28:309:29 | r1 [Ok] | main.rs:309:28:309:34 | r1.ok() [Some] | provenance | MaD:14 | | main.rs:309:28:309:34 | r1.ok() [Some] | main.rs:309:9:309:11 | o1a [Some] | provenance | | -| main.rs:311:10:311:12 | o1a [Some] | main.rs:311:10:311:21 | o1a.unwrap() | provenance | MaD:10 | +| main.rs:311:10:311:12 | o1a [Some] | main.rs:311:10:311:21 | o1a.unwrap() | provenance | MaD:6 | | main.rs:314:9:314:10 | r2 [Err] | main.rs:316:28:316:29 | r2 [Err] | provenance | | | main.rs:314:32:314:46 | Err(...) [Err] | main.rs:314:9:314:10 | r2 [Err] | provenance | | | main.rs:314:36:314:45 | source(...) | main.rs:314:32:314:46 | Err(...) [Err] | provenance | | | main.rs:316:9:316:11 | o2b [Some] | main.rs:318:10:318:12 | o2b [Some] | provenance | | -| main.rs:316:28:316:29 | r2 [Err] | main.rs:316:28:316:35 | r2.err() [Some] | provenance | MaD:15 | +| main.rs:316:28:316:29 | r2 [Err] | main.rs:316:28:316:35 | r2.err() [Some] | provenance | MaD:11 | | main.rs:316:28:316:35 | r2.err() [Some] | main.rs:316:9:316:11 | o2b [Some] | provenance | | -| main.rs:318:10:318:12 | o2b [Some] | main.rs:318:10:318:21 | o2b.unwrap() | provenance | MaD:10 | +| main.rs:318:10:318:12 | o2b [Some] | main.rs:318:10:318:21 | o2b.unwrap() | provenance | MaD:6 | | main.rs:322:9:322:10 | s1 [Ok] | main.rs:325:14:325:15 | s1 [Ok] | provenance | | | main.rs:322:32:322:45 | Ok(...) [Ok] | main.rs:322:9:322:10 | s1 [Ok] | provenance | | | main.rs:322:35:322:44 | source(...) | main.rs:322:32:322:45 | Ok(...) [Ok] | provenance | | @@ -169,11 +169,11 @@ edges | main.rs:335:9:335:10 | s1 [Ok] | main.rs:336:10:336:11 | s1 [Ok] | provenance | | | main.rs:335:32:335:45 | Ok(...) [Ok] | main.rs:335:9:335:10 | s1 [Ok] | provenance | | | main.rs:335:35:335:44 | source(...) | main.rs:335:32:335:45 | Ok(...) [Ok] | provenance | | -| main.rs:336:10:336:11 | s1 [Ok] | main.rs:336:10:336:22 | s1.expect(...) | provenance | MaD:16 | +| main.rs:336:10:336:11 | s1 [Ok] | main.rs:336:10:336:22 | s1.expect(...) | provenance | MaD:12 | | main.rs:339:9:339:10 | s2 [Err] | main.rs:341:10:341:11 | s2 [Err] | provenance | | | main.rs:339:32:339:46 | Err(...) [Err] | main.rs:339:9:339:10 | s2 [Err] | provenance | | | main.rs:339:36:339:45 | source(...) | main.rs:339:32:339:46 | Err(...) [Err] | provenance | | -| main.rs:341:10:341:11 | s2 [Err] | main.rs:341:10:341:26 | s2.expect_err(...) | provenance | MaD:17 | +| main.rs:341:10:341:11 | s2 [Err] | main.rs:341:10:341:26 | s2.expect_err(...) | provenance | MaD:13 | | main.rs:350:9:350:10 | s1 [A] | main.rs:352:11:352:12 | s1 [A] | provenance | | | main.rs:350:14:350:39 | ...::A(...) [A] | main.rs:350:9:350:10 | s1 [A] | provenance | | | main.rs:350:29:350:38 | source(...) | main.rs:350:14:350:39 | ...::A(...) [A] | provenance | | @@ -222,13 +222,13 @@ edges | main.rs:430:16:430:33 | [...] [element] | main.rs:430:9:430:12 | arr1 [element] | provenance | | | main.rs:430:23:430:32 | source(...) | main.rs:430:16:430:33 | [...] [element] | provenance | | | main.rs:431:9:431:10 | n1 | main.rs:432:10:432:11 | n1 | provenance | | -| main.rs:431:14:431:17 | arr1 [element] | main.rs:431:14:431:20 | arr1[2] | provenance | MaD:5 | +| main.rs:431:14:431:17 | arr1 [element] | main.rs:431:14:431:20 | arr1[2] | provenance | MaD:19 | | main.rs:431:14:431:20 | arr1[2] | main.rs:431:9:431:10 | n1 | provenance | | | main.rs:434:9:434:12 | arr2 [element] | main.rs:435:14:435:17 | arr2 [element] | provenance | | | main.rs:434:16:434:31 | [...; 10] [element] | main.rs:434:9:434:12 | arr2 [element] | provenance | | | main.rs:434:17:434:26 | source(...) | main.rs:434:16:434:31 | [...; 10] [element] | provenance | | | main.rs:435:9:435:10 | n2 | main.rs:436:10:436:11 | n2 | provenance | | -| main.rs:435:14:435:17 | arr2 [element] | main.rs:435:14:435:20 | arr2[4] | provenance | MaD:5 | +| main.rs:435:14:435:17 | arr2 [element] | main.rs:435:14:435:20 | arr2[4] | provenance | MaD:19 | | main.rs:435:14:435:20 | arr2[4] | main.rs:435:9:435:10 | n2 | provenance | | | main.rs:444:9:444:12 | arr1 [element] | main.rs:445:15:445:18 | arr1 [element] | provenance | | | main.rs:444:16:444:33 | [...] [element] | main.rs:444:9:444:12 | arr1 [element] | provenance | | @@ -249,9 +249,9 @@ edges | main.rs:470:5:470:11 | [post] mut_arr [element] | main.rs:473:10:473:16 | mut_arr [element] | provenance | | | main.rs:470:18:470:27 | source(...) | main.rs:470:5:470:11 | [post] mut_arr [element] | provenance | | | main.rs:471:9:471:9 | d | main.rs:472:10:472:10 | d | provenance | | -| main.rs:471:13:471:19 | mut_arr [element] | main.rs:471:13:471:22 | mut_arr[1] | provenance | MaD:5 | +| main.rs:471:13:471:19 | mut_arr [element] | main.rs:471:13:471:22 | mut_arr[1] | provenance | MaD:19 | | main.rs:471:13:471:22 | mut_arr[1] | main.rs:471:9:471:9 | d | provenance | | -| main.rs:473:10:473:16 | mut_arr [element] | main.rs:473:10:473:19 | mut_arr[0] | provenance | MaD:5 | +| main.rs:473:10:473:16 | mut_arr [element] | main.rs:473:10:473:19 | mut_arr[0] | provenance | MaD:19 | | main.rs:496:9:496:9 | s | main.rs:497:10:497:10 | s | provenance | | | main.rs:496:25:496:26 | source(...) | main.rs:496:9:496:9 | s | provenance | | | main.rs:505:9:505:9 | a | main.rs:506:13:506:13 | a | provenance | | @@ -260,27 +260,27 @@ edges | main.rs:506:9:506:9 | b | main.rs:507:13:507:13 | b | provenance | | | main.rs:506:9:506:9 | b | main.rs:508:18:508:18 | b | provenance | | | main.rs:506:9:506:9 | b | main.rs:511:17:511:17 | b | provenance | | -| main.rs:506:13:506:13 | a | main.rs:506:13:506:25 | a.to_string() | provenance | MaD:2 | +| main.rs:506:13:506:13 | a | main.rs:506:13:506:25 | a.to_string() | provenance | MaD:16 | | main.rs:506:13:506:25 | a.to_string() | main.rs:506:9:506:9 | b | provenance | | | main.rs:507:9:507:9 | c | main.rs:512:10:512:10 | c | provenance | | -| main.rs:507:13:507:13 | b | main.rs:507:13:507:28 | b.parse() [Ok] | provenance | MaD:8 | -| main.rs:507:13:507:28 | b.parse() [Ok] | main.rs:507:13:507:37 | ... .unwrap() | provenance | MaD:19 | +| main.rs:507:13:507:13 | b | main.rs:507:13:507:28 | b.parse() [Ok] | provenance | MaD:4 | +| main.rs:507:13:507:28 | b.parse() [Ok] | main.rs:507:13:507:37 | ... .unwrap() | provenance | MaD:15 | | main.rs:507:13:507:37 | ... .unwrap() | main.rs:507:9:507:9 | c | provenance | | | main.rs:508:9:508:9 | d | main.rs:513:10:513:10 | d | provenance | | -| main.rs:508:18:508:18 | b | main.rs:508:18:508:26 | b.parse() [Ok] | provenance | MaD:8 | -| main.rs:508:18:508:26 | b.parse() [Ok] | main.rs:508:18:508:35 | ... .unwrap() | provenance | MaD:19 | +| main.rs:508:18:508:18 | b | main.rs:508:18:508:26 | b.parse() [Ok] | provenance | MaD:4 | +| main.rs:508:18:508:26 | b.parse() [Ok] | main.rs:508:18:508:35 | ... .unwrap() | provenance | MaD:15 | | main.rs:508:18:508:35 | ... .unwrap() | main.rs:508:9:508:9 | d | provenance | | | main.rs:517:9:517:10 | vs [element] | main.rs:519:10:519:11 | vs [element] | provenance | | | main.rs:517:9:517:10 | vs [element] | main.rs:523:14:523:15 | vs [element] | provenance | | | main.rs:517:14:517:34 | [...] [element] | main.rs:517:9:517:10 | vs [element] | provenance | | | main.rs:517:15:517:24 | source(...) | main.rs:517:14:517:34 | [...] [element] | provenance | | -| main.rs:519:10:519:11 | vs [element] | main.rs:519:10:519:14 | vs[0] | provenance | MaD:5 | +| main.rs:519:10:519:11 | vs [element] | main.rs:519:10:519:14 | vs[0] | provenance | MaD:19 | | main.rs:523:9:523:9 | v | main.rs:524:14:524:14 | v | provenance | | | main.rs:523:14:523:15 | vs [element] | main.rs:523:9:523:9 | v | provenance | | | main.rs:542:9:542:18 | mut vs_mut [element] | main.rs:544:10:544:15 | vs_mut [element] | provenance | | | main.rs:542:22:542:42 | [...] [element] | main.rs:542:9:542:18 | mut vs_mut [element] | provenance | | | main.rs:542:23:542:32 | source(...) | main.rs:542:22:542:42 | [...] [element] | provenance | | -| main.rs:544:10:544:15 | vs_mut [element] | main.rs:544:10:544:18 | vs_mut[0] | provenance | MaD:5 | +| main.rs:544:10:544:15 | vs_mut [element] | main.rs:544:10:544:18 | vs_mut[0] | provenance | MaD:19 | | main.rs:554:9:554:9 | a | main.rs:559:10:559:10 | a | provenance | | | main.rs:554:13:554:22 | source(...) | main.rs:554:9:554:9 | a | provenance | | | main.rs:555:9:555:9 | b | main.rs:560:15:560:15 | b | provenance | | @@ -297,16 +297,16 @@ edges | main.rs:566:9:566:9 | a | main.rs:569:10:569:10 | a | provenance | | | main.rs:566:9:566:9 | a | main.rs:570:20:570:20 | a | provenance | | | main.rs:566:18:566:27 | source(...) | main.rs:566:9:566:9 | a | provenance | | -| main.rs:569:10:569:10 | a | main.rs:569:10:569:17 | a.into() | provenance | MaD:3 | -| main.rs:569:10:569:10 | a | main.rs:569:10:569:17 | a.into() | provenance | MaD:4 | +| main.rs:569:10:569:10 | a | main.rs:569:10:569:17 | a.into() | provenance | MaD:17 | +| main.rs:569:10:569:10 | a | main.rs:569:10:569:17 | a.into() | provenance | MaD:18 | | main.rs:570:20:570:20 | a | main.rs:570:10:570:21 | ...::from(...) | provenance | ReflexiveFrom | | main.rs:572:9:572:9 | b | main.rs:574:10:574:17 | b as i64 | provenance | | | main.rs:572:9:572:9 | b | main.rs:575:10:575:10 | b | provenance | | | main.rs:572:9:572:9 | b | main.rs:576:20:576:20 | b | provenance | | | main.rs:572:18:572:27 | source(...) | main.rs:572:9:572:9 | b | provenance | | -| main.rs:575:10:575:10 | b | main.rs:575:10:575:17 | b.into() | provenance | MaD:3 | -| main.rs:575:10:575:10 | b | main.rs:575:10:575:17 | b.into() | provenance | MaD:4 | -| main.rs:576:20:576:20 | b | main.rs:576:10:576:21 | ...::from(...) | provenance | MaD:9 | +| main.rs:575:10:575:10 | b | main.rs:575:10:575:17 | b.into() | provenance | MaD:17 | +| main.rs:575:10:575:10 | b | main.rs:575:10:575:17 | b.into() | provenance | MaD:18 | +| main.rs:576:20:576:20 | b | main.rs:576:10:576:21 | ...::from(...) | provenance | MaD:5 | nodes | main.rs:19:10:19:18 | source(...) | semmle.label | source(...) | | main.rs:23:9:23:9 | s | semmle.label | s | diff --git a/rust/ql/test/library-tests/dataflow/modeled/inline-flow.expected b/rust/ql/test/library-tests/dataflow/modeled/inline-flow.expected index cba4f0a3028e..cbab732aef78 100644 --- a/rust/ql/test/library-tests/dataflow/modeled/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/modeled/inline-flow.expected @@ -1,26 +1,26 @@ models | 1 | Summary: <& as core::ops::deref::Deref>::deref; Argument[self].Reference; ReturnValue; value | -| 2 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | -| 3 | Summary: <_ as core::cmp::Ord>::clamp; Argument[self,0,1]; ReturnValue; value | -| 4 | Summary: <_ as core::cmp::Ord>::max; Argument[self,0]; ReturnValue; value | -| 5 | Summary: <_ as core::cmp::Ord>::min; Argument[self,0]; ReturnValue; value | -| 6 | Summary: <_ as core::ops::arith::Add>::add; Argument[self,0]; ReturnValue; taint | -| 7 | Summary: ::into_pin; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer]; value | -| 8 | Summary: ::new; Argument[0]; ReturnValue.Field[alloc::boxed::Box(0)]; value | -| 9 | Summary: ::pin; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer].Field[alloc::boxed::Box(0)]; value | -| 10 | Summary: ::clone; Argument[self].Reference; ReturnValue; value | -| 11 | Summary: ::clone; Argument[self]; ReturnValue; value | -| 12 | Summary: ::map_or; Argument[1].ReturnValue; ReturnValue; value | -| 13 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 14 | Summary: ::zip; Argument[0].Field[core::option::Option::Some(0)]; ReturnValue.Field[core::option::Option::Some(0)].Field[1]; value | -| 15 | Summary: ::deref; Argument[self].Reference.Field[core::pin::Pin::pointer].Field[alloc::boxed::Box(0)]; ReturnValue.Reference; value | -| 16 | Summary: ::deref; Argument[self].Reference.Field[core::pin::Pin::pointer].Reference; ReturnValue.Reference; value | -| 17 | Summary: ::into_inner; Argument[0].Field[core::pin::Pin::pointer]; ReturnValue; value | -| 18 | Summary: ::into_inner_unchecked; Argument[0].Field[core::pin::Pin::pointer]; ReturnValue; value | -| 19 | Summary: ::new; Argument[0].Reference; ReturnValue; value | -| 20 | Summary: ::new; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer]; value | -| 21 | Summary: ::new_unchecked; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer]; value | -| 22 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 2 | Summary: ::into_pin; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer]; value | +| 3 | Summary: ::new; Argument[0]; ReturnValue.Field[alloc::boxed::Box(0)]; value | +| 4 | Summary: ::pin; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer].Field[alloc::boxed::Box(0)]; value | +| 5 | Summary: ::clone; Argument[self].Reference; ReturnValue; value | +| 6 | Summary: ::clone; Argument[self]; ReturnValue; value | +| 7 | Summary: ::map_or; Argument[1].ReturnValue; ReturnValue; value | +| 8 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 9 | Summary: ::zip; Argument[0].Field[core::option::Option::Some(0)]; ReturnValue.Field[core::option::Option::Some(0)].Field[1]; value | +| 10 | Summary: ::deref; Argument[self].Reference.Field[core::pin::Pin::pointer].Field[alloc::boxed::Box(0)]; ReturnValue.Reference; value | +| 11 | Summary: ::deref; Argument[self].Reference.Field[core::pin::Pin::pointer].Reference; ReturnValue.Reference; value | +| 12 | Summary: ::into_inner; Argument[0].Field[core::pin::Pin::pointer]; ReturnValue; value | +| 13 | Summary: ::into_inner_unchecked; Argument[0].Field[core::pin::Pin::pointer]; ReturnValue; value | +| 14 | Summary: ::new; Argument[0].Reference; ReturnValue; value | +| 15 | Summary: ::new; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer]; value | +| 16 | Summary: ::new_unchecked; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer]; value | +| 17 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 18 | Summary: core::clone::Clone::clone; Argument[self].Reference; ReturnValue; value | +| 19 | Summary: core::cmp::Ord::clamp; Argument[self,0,1]; ReturnValue; value | +| 20 | Summary: core::cmp::Ord::max; Argument[self,0]; ReturnValue; value | +| 21 | Summary: core::cmp::Ord::min; Argument[self,0]; ReturnValue; value | +| 22 | Summary: core::ops::arith::Add::add; Argument[self,0]; ReturnValue; taint | | 23 | Summary: core::ptr::read; Argument[0].Reference; ReturnValue; value | | 24 | Summary: core::ptr::write; Argument[1]; Argument[0].Reference; value | edges @@ -28,27 +28,27 @@ edges | main.rs:12:9:12:9 | a [Some] | main.rs:14:13:14:13 | a [Some] | provenance | | | main.rs:12:13:12:28 | Some(...) [Some] | main.rs:12:9:12:9 | a [Some] | provenance | | | main.rs:12:18:12:27 | source(...) | main.rs:12:13:12:28 | Some(...) [Some] | provenance | | -| main.rs:13:10:13:10 | a [Some] | main.rs:13:10:13:19 | a.unwrap() | provenance | MaD:13 | +| main.rs:13:10:13:10 | a [Some] | main.rs:13:10:13:19 | a.unwrap() | provenance | MaD:8 | | main.rs:14:9:14:9 | b [Some] | main.rs:15:10:15:10 | b [Some] | provenance | | -| main.rs:14:13:14:13 | a [Some] | main.rs:14:13:14:21 | a.clone() [Some] | provenance | MaD:2 | +| main.rs:14:13:14:13 | a [Some] | main.rs:14:13:14:21 | a.clone() [Some] | provenance | MaD:18 | | main.rs:14:13:14:21 | a.clone() [Some] | main.rs:14:9:14:9 | b [Some] | provenance | | -| main.rs:15:10:15:10 | b [Some] | main.rs:15:10:15:19 | b.unwrap() | provenance | MaD:13 | +| main.rs:15:10:15:10 | b [Some] | main.rs:15:10:15:19 | b.unwrap() | provenance | MaD:8 | | main.rs:19:9:19:9 | a [Ok] | main.rs:20:10:20:10 | a [Ok] | provenance | | | main.rs:19:9:19:9 | a [Ok] | main.rs:21:13:21:13 | a [Ok] | provenance | | | main.rs:19:31:19:44 | Ok(...) [Ok] | main.rs:19:9:19:9 | a [Ok] | provenance | | | main.rs:19:34:19:43 | source(...) | main.rs:19:31:19:44 | Ok(...) [Ok] | provenance | | -| main.rs:20:10:20:10 | a [Ok] | main.rs:20:10:20:19 | a.unwrap() | provenance | MaD:22 | +| main.rs:20:10:20:10 | a [Ok] | main.rs:20:10:20:19 | a.unwrap() | provenance | MaD:17 | | main.rs:21:9:21:9 | b [Ok] | main.rs:22:10:22:10 | b [Ok] | provenance | | -| main.rs:21:13:21:13 | a [Ok] | main.rs:21:13:21:21 | a.clone() [Ok] | provenance | MaD:2 | +| main.rs:21:13:21:13 | a [Ok] | main.rs:21:13:21:21 | a.clone() [Ok] | provenance | MaD:18 | | main.rs:21:13:21:21 | a.clone() [Ok] | main.rs:21:9:21:9 | b [Ok] | provenance | | -| main.rs:22:10:22:10 | b [Ok] | main.rs:22:10:22:19 | b.unwrap() | provenance | MaD:22 | +| main.rs:22:10:22:10 | b [Ok] | main.rs:22:10:22:19 | b.unwrap() | provenance | MaD:17 | | main.rs:26:9:26:9 | a | main.rs:27:10:27:10 | a | provenance | | | main.rs:26:9:26:9 | a | main.rs:28:13:28:13 | a | provenance | | | main.rs:26:13:26:22 | source(...) | main.rs:26:9:26:9 | a | provenance | | | main.rs:28:9:28:9 | b | main.rs:29:10:29:10 | b | provenance | | | main.rs:28:9:28:9 | b [&ref] | main.rs:29:10:29:10 | b | provenance | | -| main.rs:28:13:28:13 | a | main.rs:28:13:28:21 | a.clone() | provenance | MaD:10 | -| main.rs:28:13:28:13 | a | main.rs:28:13:28:21 | a.clone() [&ref] | provenance | MaD:11 | +| main.rs:28:13:28:13 | a | main.rs:28:13:28:21 | a.clone() | provenance | MaD:5 | +| main.rs:28:13:28:13 | a | main.rs:28:13:28:21 | a.clone() [&ref] | provenance | MaD:6 | | main.rs:28:13:28:21 | a.clone() | main.rs:28:9:28:9 | b | provenance | | | main.rs:28:13:28:21 | a.clone() [&ref] | main.rs:28:9:28:9 | b [&ref] | provenance | | | main.rs:43:18:43:22 | SelfParam [&ref, Wrapper] | main.rs:44:26:44:31 | self.n | provenance | | @@ -73,15 +73,15 @@ edges | main.rs:66:22:66:31 | source(...) | main.rs:66:17:66:32 | Some(...) [Some] | provenance | | | main.rs:67:13:67:13 | z [Some, tuple.1] | main.rs:68:15:68:15 | z [Some, tuple.1] | provenance | | | main.rs:67:17:67:24 | a.zip(...) [Some, tuple.1] | main.rs:67:13:67:13 | z [Some, tuple.1] | provenance | | -| main.rs:67:23:67:23 | b [Some] | main.rs:67:17:67:24 | a.zip(...) [Some, tuple.1] | provenance | MaD:14 | +| main.rs:67:23:67:23 | b [Some] | main.rs:67:17:67:24 | a.zip(...) [Some, tuple.1] | provenance | MaD:9 | | main.rs:68:15:68:15 | z [Some, tuple.1] | main.rs:69:13:69:24 | Some(...) [Some, tuple.1] | provenance | | | main.rs:69:13:69:24 | Some(...) [Some, tuple.1] | main.rs:69:18:69:23 | TuplePat [tuple.1] | provenance | | | main.rs:69:18:69:23 | TuplePat [tuple.1] | main.rs:69:22:69:22 | m | provenance | | | main.rs:69:22:69:22 | m | main.rs:71:22:71:22 | m | provenance | | | main.rs:79:13:79:13 | b | main.rs:80:14:80:14 | b | provenance | | | main.rs:79:17:79:47 | a.map_or(...) | main.rs:79:13:79:13 | b | provenance | | -| main.rs:79:33:79:46 | ... + ... | main.rs:79:17:79:47 | a.map_or(...) | provenance | MaD:12 | -| main.rs:79:37:79:46 | source(...) | main.rs:79:33:79:46 | ... + ... | provenance | MaD:6 | +| main.rs:79:33:79:46 | ... + ... | main.rs:79:17:79:47 | a.map_or(...) | provenance | MaD:7 | +| main.rs:79:37:79:46 | source(...) | main.rs:79:33:79:46 | ... + ... | provenance | MaD:22 | | main.rs:92:29:92:29 | [post] y [&ref] | main.rs:93:33:93:33 | y [&ref] | provenance | | | main.rs:92:32:92:41 | source(...) | main.rs:92:29:92:29 | [post] y [&ref] | provenance | MaD:24 | | main.rs:93:33:93:33 | y [&ref] | main.rs:93:18:93:34 | ...::read(...) | provenance | MaD:23 | @@ -97,67 +97,67 @@ edges | main.rs:109:13:109:20 | mut pin1 [Pin, &ref] | main.rs:115:31:115:34 | pin1 [Pin, &ref] | provenance | | | main.rs:109:24:109:35 | ...::new(...) | main.rs:109:13:109:20 | mut pin1 | provenance | | | main.rs:109:24:109:35 | ...::new(...) [Pin, &ref] | main.rs:109:13:109:20 | mut pin1 [Pin, &ref] | provenance | | -| main.rs:109:33:109:34 | &i [&ref] | main.rs:109:24:109:35 | ...::new(...) | provenance | MaD:19 | -| main.rs:109:33:109:34 | &i [&ref] | main.rs:109:24:109:35 | ...::new(...) [Pin, &ref] | provenance | MaD:20 | +| main.rs:109:33:109:34 | &i [&ref] | main.rs:109:24:109:35 | ...::new(...) | provenance | MaD:14 | +| main.rs:109:33:109:34 | &i [&ref] | main.rs:109:24:109:35 | ...::new(...) [Pin, &ref] | provenance | MaD:15 | | main.rs:109:34:109:34 | i | main.rs:109:33:109:34 | &i [&ref] | provenance | | | main.rs:110:13:110:20 | mut pin2 [Pin, Box(0)] | main.rs:116:15:116:18 | pin2 [Pin, Box(0)] | provenance | | | main.rs:110:24:110:34 | ...::pin(...) [Pin, Box(0)] | main.rs:110:13:110:20 | mut pin2 [Pin, Box(0)] | provenance | | -| main.rs:110:33:110:33 | i | main.rs:110:24:110:34 | ...::pin(...) [Pin, Box(0)] | provenance | MaD:9 | +| main.rs:110:33:110:33 | i | main.rs:110:24:110:34 | ...::pin(...) [Pin, Box(0)] | provenance | MaD:4 | | main.rs:111:13:111:20 | mut pin3 [Pin, Box(0)] | main.rs:117:15:117:18 | pin3 [Pin, Box(0)] | provenance | | | main.rs:111:24:111:49 | ...::into_pin(...) [Pin, Box(0)] | main.rs:111:13:111:20 | mut pin3 [Pin, Box(0)] | provenance | | -| main.rs:111:38:111:48 | ...::new(...) [Box(0)] | main.rs:111:24:111:49 | ...::into_pin(...) [Pin, Box(0)] | provenance | MaD:7 | -| main.rs:111:47:111:47 | i | main.rs:111:38:111:48 | ...::new(...) [Box(0)] | provenance | MaD:8 | +| main.rs:111:38:111:48 | ...::new(...) [Box(0)] | main.rs:111:24:111:49 | ...::into_pin(...) [Pin, Box(0)] | provenance | MaD:2 | +| main.rs:111:47:111:47 | i | main.rs:111:38:111:48 | ...::new(...) [Box(0)] | provenance | MaD:3 | | main.rs:112:13:112:20 | mut pin4 [Pin, &ref] | main.rs:118:15:118:18 | pin4 [Pin, &ref] | provenance | | -| main.rs:112:24:112:27 | &mut pinned [&ref] | main.rs:112:24:112:27 | ...::new_unchecked(...) [Pin, &ref] | provenance | MaD:21 | +| main.rs:112:24:112:27 | &mut pinned [&ref] | main.rs:112:24:112:27 | ...::new_unchecked(...) [Pin, &ref] | provenance | MaD:16 | | main.rs:112:24:112:27 | ...::new_unchecked(...) [Pin, &ref] | main.rs:112:13:112:20 | mut pin4 [Pin, &ref] | provenance | | | main.rs:112:24:112:27 | mut pinned | main.rs:112:24:112:27 | pinned | provenance | | | main.rs:112:24:112:27 | pinned | main.rs:112:24:112:27 | &mut pinned [&ref] | provenance | | -| main.rs:114:15:114:18 | pin1 | main.rs:114:14:114:18 | * ... | provenance | MaD:15 | -| main.rs:114:15:114:18 | pin1 | main.rs:114:14:114:18 | * ... | provenance | MaD:16 | -| main.rs:114:15:114:18 | pin1 [Pin, &ref] | main.rs:114:14:114:18 | * ... | provenance | MaD:16 | +| main.rs:114:15:114:18 | pin1 | main.rs:114:14:114:18 | * ... | provenance | MaD:10 | +| main.rs:114:15:114:18 | pin1 | main.rs:114:14:114:18 | * ... | provenance | MaD:11 | +| main.rs:114:15:114:18 | pin1 [Pin, &ref] | main.rs:114:14:114:18 | * ... | provenance | MaD:11 | | main.rs:115:15:115:35 | ...::into_inner(...) | main.rs:115:14:115:35 | * ... | provenance | MaD:1 | | main.rs:115:15:115:35 | ...::into_inner(...) [&ref] | main.rs:115:14:115:35 | * ... | provenance | MaD:1 | -| main.rs:115:31:115:34 | pin1 | main.rs:115:15:115:35 | ...::into_inner(...) | provenance | MaD:17 | -| main.rs:115:31:115:34 | pin1 [Pin, &ref] | main.rs:115:15:115:35 | ...::into_inner(...) [&ref] | provenance | MaD:17 | -| main.rs:116:15:116:18 | pin2 [Pin, Box(0)] | main.rs:116:14:116:18 | * ... | provenance | MaD:15 | -| main.rs:117:15:117:18 | pin3 [Pin, Box(0)] | main.rs:117:14:117:18 | * ... | provenance | MaD:15 | -| main.rs:118:15:118:18 | pin4 [Pin, &ref] | main.rs:118:14:118:18 | * ... | provenance | MaD:16 | +| main.rs:115:31:115:34 | pin1 | main.rs:115:15:115:35 | ...::into_inner(...) | provenance | MaD:12 | +| main.rs:115:31:115:34 | pin1 [Pin, &ref] | main.rs:115:15:115:35 | ...::into_inner(...) [&ref] | provenance | MaD:12 | +| main.rs:116:15:116:18 | pin2 [Pin, Box(0)] | main.rs:116:14:116:18 | * ... | provenance | MaD:10 | +| main.rs:117:15:117:18 | pin3 [Pin, Box(0)] | main.rs:117:14:117:18 | * ... | provenance | MaD:10 | +| main.rs:118:15:118:18 | pin4 [Pin, &ref] | main.rs:118:14:118:18 | * ... | provenance | MaD:11 | | main.rs:122:13:122:18 | mut ms [MyStruct] | main.rs:123:34:123:35 | ms [MyStruct] | provenance | | | main.rs:122:13:122:18 | mut ms [MyStruct] | main.rs:127:14:127:15 | ms [MyStruct] | provenance | | | main.rs:122:22:122:49 | MyStruct {...} [MyStruct] | main.rs:122:13:122:18 | mut ms [MyStruct] | provenance | | | main.rs:122:38:122:47 | source(...) | main.rs:122:22:122:49 | MyStruct {...} [MyStruct] | provenance | | | main.rs:123:13:123:20 | mut pin1 [Pin, &ref, MyStruct] | main.rs:129:30:129:33 | pin1 [Pin, &ref, MyStruct] | provenance | | | main.rs:123:24:123:36 | ...::new(...) [Pin, &ref, MyStruct] | main.rs:123:13:123:20 | mut pin1 [Pin, &ref, MyStruct] | provenance | | -| main.rs:123:33:123:35 | &ms [&ref, MyStruct] | main.rs:123:24:123:36 | ...::new(...) [Pin, &ref, MyStruct] | provenance | MaD:20 | +| main.rs:123:33:123:35 | &ms [&ref, MyStruct] | main.rs:123:24:123:36 | ...::new(...) [Pin, &ref, MyStruct] | provenance | MaD:15 | | main.rs:123:34:123:35 | ms [MyStruct] | main.rs:123:33:123:35 | &ms [&ref, MyStruct] | provenance | | | main.rs:127:14:127:15 | ms [MyStruct] | main.rs:127:14:127:19 | ms.val | provenance | | | main.rs:129:14:129:34 | ...::into_inner(...) [&ref, MyStruct] | main.rs:129:14:129:38 | ... .val | provenance | | -| main.rs:129:30:129:33 | pin1 [Pin, &ref, MyStruct] | main.rs:129:14:129:34 | ...::into_inner(...) [&ref, MyStruct] | provenance | MaD:17 | +| main.rs:129:30:129:33 | pin1 [Pin, &ref, MyStruct] | main.rs:129:14:129:34 | ...::into_inner(...) [&ref, MyStruct] | provenance | MaD:12 | | main.rs:136:13:136:18 | mut ms [MyStruct] | main.rs:137:44:137:45 | ms [MyStruct] | provenance | | | main.rs:136:22:136:49 | MyStruct {...} [MyStruct] | main.rs:136:13:136:18 | mut ms [MyStruct] | provenance | | | main.rs:136:38:136:47 | source(...) | main.rs:136:22:136:49 | MyStruct {...} [MyStruct] | provenance | | | main.rs:137:13:137:20 | mut pin5 [Pin, &ref, MyStruct] | main.rs:139:40:139:43 | pin5 [Pin, &ref, MyStruct] | provenance | | | main.rs:137:24:137:46 | ...::new_unchecked(...) [Pin, &ref, MyStruct] | main.rs:137:13:137:20 | mut pin5 [Pin, &ref, MyStruct] | provenance | | -| main.rs:137:43:137:45 | &ms [&ref, MyStruct] | main.rs:137:24:137:46 | ...::new_unchecked(...) [Pin, &ref, MyStruct] | provenance | MaD:21 | +| main.rs:137:43:137:45 | &ms [&ref, MyStruct] | main.rs:137:24:137:46 | ...::new_unchecked(...) [Pin, &ref, MyStruct] | provenance | MaD:16 | | main.rs:137:44:137:45 | ms [MyStruct] | main.rs:137:43:137:45 | &ms [&ref, MyStruct] | provenance | | | main.rs:139:14:139:44 | ...::into_inner_unchecked(...) [&ref, MyStruct] | main.rs:139:14:139:48 | ... .val | provenance | | -| main.rs:139:40:139:43 | pin5 [Pin, &ref, MyStruct] | main.rs:139:14:139:44 | ...::into_inner_unchecked(...) [&ref, MyStruct] | provenance | MaD:18 | +| main.rs:139:40:139:43 | pin5 [Pin, &ref, MyStruct] | main.rs:139:14:139:44 | ...::into_inner_unchecked(...) [&ref, MyStruct] | provenance | MaD:13 | | main.rs:153:9:153:9 | a | main.rs:155:13:155:13 | a | provenance | | | main.rs:153:13:153:22 | source(...) | main.rs:153:9:153:9 | a | provenance | | | main.rs:154:9:154:9 | b | main.rs:155:19:155:19 | b | provenance | | | main.rs:154:13:154:22 | source(...) | main.rs:154:9:154:9 | b | provenance | | | main.rs:155:9:155:9 | c | main.rs:156:10:156:10 | c | provenance | | -| main.rs:155:13:155:13 | a | main.rs:155:13:155:20 | a.min(...) | provenance | MaD:5 | +| main.rs:155:13:155:13 | a | main.rs:155:13:155:20 | a.min(...) | provenance | MaD:21 | | main.rs:155:13:155:20 | a.min(...) | main.rs:155:9:155:9 | c | provenance | | -| main.rs:155:19:155:19 | b | main.rs:155:13:155:20 | a.min(...) | provenance | MaD:5 | +| main.rs:155:19:155:19 | b | main.rs:155:13:155:20 | a.min(...) | provenance | MaD:21 | | main.rs:158:9:158:9 | d | main.rs:160:13:160:13 | d | provenance | | | main.rs:158:13:158:22 | source(...) | main.rs:158:9:158:9 | d | provenance | | | main.rs:159:9:159:9 | e | main.rs:160:19:160:19 | e | provenance | | | main.rs:159:13:159:22 | source(...) | main.rs:159:9:159:9 | e | provenance | | | main.rs:160:9:160:9 | f | main.rs:161:10:161:10 | f | provenance | | -| main.rs:160:13:160:13 | d | main.rs:160:13:160:20 | d.max(...) | provenance | MaD:4 | +| main.rs:160:13:160:13 | d | main.rs:160:13:160:20 | d.max(...) | provenance | MaD:20 | | main.rs:160:13:160:20 | d.max(...) | main.rs:160:9:160:9 | f | provenance | | -| main.rs:160:19:160:19 | e | main.rs:160:13:160:20 | d.max(...) | provenance | MaD:4 | +| main.rs:160:19:160:19 | e | main.rs:160:13:160:20 | d.max(...) | provenance | MaD:20 | | main.rs:163:9:163:9 | g | main.rs:166:13:166:13 | g | provenance | | | main.rs:163:13:163:22 | source(...) | main.rs:163:9:163:9 | g | provenance | | | main.rs:164:9:164:9 | h | main.rs:166:21:166:21 | h | provenance | | @@ -165,10 +165,10 @@ edges | main.rs:165:9:165:9 | i | main.rs:166:24:166:24 | i | provenance | | | main.rs:165:13:165:22 | source(...) | main.rs:165:9:165:9 | i | provenance | | | main.rs:166:9:166:9 | j | main.rs:167:10:167:10 | j | provenance | | -| main.rs:166:13:166:13 | g | main.rs:166:13:166:25 | g.clamp(...) | provenance | MaD:3 | +| main.rs:166:13:166:13 | g | main.rs:166:13:166:25 | g.clamp(...) | provenance | MaD:19 | | main.rs:166:13:166:25 | g.clamp(...) | main.rs:166:9:166:9 | j | provenance | | -| main.rs:166:21:166:21 | h | main.rs:166:13:166:25 | g.clamp(...) | provenance | MaD:3 | -| main.rs:166:24:166:24 | i | main.rs:166:13:166:25 | g.clamp(...) | provenance | MaD:3 | +| main.rs:166:21:166:21 | h | main.rs:166:13:166:25 | g.clamp(...) | provenance | MaD:19 | +| main.rs:166:24:166:24 | i | main.rs:166:13:166:25 | g.clamp(...) | provenance | MaD:19 | nodes | main.rs:12:9:12:9 | a [Some] | semmle.label | a [Some] | | main.rs:12:13:12:28 | Some(...) [Some] | semmle.label | Some(...) [Some] | diff --git a/rust/ql/test/library-tests/dataflow/models/models.expected b/rust/ql/test/library-tests/dataflow/models/models.expected index 75e57a39edd7..81add2ae3f6b 100644 --- a/rust/ql/test/library-tests/dataflow/models/models.expected +++ b/rust/ql/test/library-tests/dataflow/models/models.expected @@ -7,8 +7,8 @@ models | 6 | Sink: main::simple_sink; Argument[0]; test-sink | | 7 | Sink: main::sink_out_of_function::pass_sink; Argument[0].ReturnValue; test-sink | | 8 | Sink: main::sink_out_of_function::pass_sink_nested; Argument[0].ReturnValue.Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-sink | -| 9 | Source: <_ as main::MyTrait>::test_param_source; Parameter[0]; test-source | -| 10 | Source: ::source; ReturnValue.Field[main::MyFieldEnum::C::field_c]; test-source | +| 9 | Source: ::source; ReturnValue.Field[main::MyFieldEnum::C::field_c]; test-source | +| 10 | Source: main::MyTrait::test_param_source; Parameter[0]; test-source | | 11 | Source: main::arg_source; Argument[0]; test-source | | 12 | Source: main::enum_source; ReturnValue.Field[main::MyFieldEnum::D::field_d]; test-source | | 13 | Source: main::enum_source_nested; ReturnValue.Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-source | @@ -17,9 +17,9 @@ models | 16 | Source: main::simple_source; ReturnValue; test-source | | 17 | Source: main::source_into_function::pass_source; Argument[1].Parameter[0]; test-source | | 18 | Source: main::source_into_function::pass_source_nested; Argument[1].Parameter[0].Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-source | -| 19 | Summary: <_ as core::cmp::Ord>::max; Argument[self,0]; ReturnValue; value | -| 20 | Summary: <_ as core::cmp::PartialOrd>::lt; Argument[self].Reference; ReturnValue; taint | -| 21 | Summary: <_ as core::ops::index::Index>::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 19 | Summary: core::cmp::Ord::max; Argument[self,0]; ReturnValue; value | +| 20 | Summary: core::cmp::PartialOrd::lt; Argument[self].Reference; ReturnValue; taint | +| 21 | Summary: core::ops::index::Index::index; Argument[self].Reference.Element; ReturnValue.Reference; value | | 22 | Summary: main::apply; Argument[0]; Argument[1].Parameter[0]; value | | 23 | Summary: main::apply; Argument[1].ReturnValue; ReturnValue; value | | 24 | Summary: main::coerce; Argument[0]; ReturnValue; taint | @@ -255,8 +255,8 @@ edges | main.rs:271:22:271:22 | i | main.rs:271:33:271:33 | i | provenance | | | main.rs:280:9:280:9 | s [C] | main.rs:281:11:281:11 | s [C] | provenance | | | main.rs:280:9:280:9 | s [C] | main.rs:281:11:281:11 | s [C] | provenance | | -| main.rs:280:13:280:24 | e.source(...) | main.rs:280:9:280:9 | s [C] | provenance | Src:MaD:10 | -| main.rs:280:13:280:24 | e.source(...) | main.rs:280:9:280:9 | s [C] | provenance | Src:MaD:10 | +| main.rs:280:13:280:24 | e.source(...) | main.rs:280:9:280:9 | s [C] | provenance | Src:MaD:9 | +| main.rs:280:13:280:24 | e.source(...) | main.rs:280:9:280:9 | s [C] | provenance | Src:MaD:9 | | main.rs:281:11:281:11 | s [C] | main.rs:282:9:282:37 | ...::C {...} [C] | provenance | | | main.rs:281:11:281:11 | s [C] | main.rs:282:9:282:37 | ...::C {...} [C] | provenance | | | main.rs:282:9:282:37 | ...::C {...} [C] | main.rs:282:35:282:35 | i | provenance | | @@ -337,8 +337,8 @@ edges | main.rs:391:13:391:22 | source(...) | main.rs:391:9:391:9 | s | provenance | | | main.rs:400:16:400:16 | i | main.rs:401:10:401:10 | i | provenance | Src:MaD:11 | | main.rs:400:16:400:16 | i | main.rs:401:10:401:10 | i | provenance | Src:MaD:11 | -| main.rs:410:26:410:31 | ...: i64 | main.rs:411:14:411:14 | i | provenance | Src:MaD:9 | -| main.rs:410:26:410:31 | ...: i64 | main.rs:411:14:411:14 | i | provenance | Src:MaD:9 | +| main.rs:410:26:410:31 | ...: i64 | main.rs:411:14:411:14 | i | provenance | Src:MaD:10 | +| main.rs:410:26:410:31 | ...: i64 | main.rs:411:14:411:14 | i | provenance | Src:MaD:10 | | main.rs:464:9:464:10 | x1 | main.rs:465:10:465:11 | x1 | provenance | | | main.rs:464:9:464:10 | x1 | main.rs:465:10:465:11 | x1 | provenance | | | main.rs:464:14:464:23 | source(...) | main.rs:464:14:464:30 | ... .max(...) | provenance | MaD:19 | diff --git a/rust/ql/test/library-tests/dataflow/models/models.ext.yml b/rust/ql/test/library-tests/dataflow/models/models.ext.yml index 3fee1227a6df..38624e1fc198 100644 --- a/rust/ql/test/library-tests/dataflow/models/models.ext.yml +++ b/rust/ql/test/library-tests/dataflow/models/models.ext.yml @@ -8,7 +8,7 @@ extensions: - ["main::enum_source_nested", "ReturnValue.Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]", "test-source", "manual"] - ["::source", "ReturnValue.Field[main::MyFieldEnum::C::field_c]", "test-source", "manual"] - ["main::arg_source", "Argument[0]", "test-source", "manual"] - - ["<_ as main::MyTrait>::test_param_source", "Parameter[0]", "test-source", "manual"] + - ["main::MyTrait::test_param_source", "Parameter[0]", "test-source", "manual"] - ["main::source_into_function::pass_source", "Argument[1].Parameter[0]", "test-source", "manual"] - ["main::source_into_function::pass_source_nested", "Argument[1].Parameter[0].Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]", "test-source", "manual"] - ["main::external_file::generated_source", "ReturnValue", "test-source", "dfc-generated"] # not actually generated, but we want to test behaviour of generated models here. @@ -48,7 +48,7 @@ extensions: - ["main::apply", "Argument[0]", "Argument[1].Parameter[0]", "value", "manual"] - ["main::apply", "Argument[1].ReturnValue", "ReturnValue", "value", "manual"] - ["main::get_async_number", "Argument[0]", "ReturnValue.Future", "value", "manual"] - - ["<_ as core::cmp::PartialOrd>::lt", "Argument[self].Reference", "ReturnValue", "taint", "manual"] + - ["core::cmp::PartialOrd::lt", "Argument[self].Reference", "ReturnValue", "taint", "manual"] # Overwrites the generic trait model for i32 - ["::lt", "Argument[0]", "ReturnValue", "taint", "manual"] - ["main::external_file::generated_summary", "Argument[0]", "ReturnValue", "value", "dfc-generated"] diff --git a/rust/ql/test/library-tests/dataflow/sources/database/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/database/InlineFlow.expected index 200c4c4aa581..e59f8893b52e 100644 --- a/rust/ql/test/library-tests/dataflow/sources/database/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/database/InlineFlow.expected @@ -1,98 +1,98 @@ models -| 1 | Source: <_ as mysql::conn::queryable::Queryable>::query_first; ReturnValue.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; database | -| 2 | Source: <_ as mysql::conn::queryable::Queryable>::query_fold; Argument[2].Parameter[1]; database | -| 3 | Source: <_ as mysql::conn::queryable::Queryable>::query_map; Argument[1].Parameter[0]; database | -| 4 | Source: <_ as mysql_async::queryable::Queryable>::query_fold; Argument[2].Parameter[1]; database | -| 5 | Source: <_ as mysql_async::queryable::Queryable>::query_map; Argument[1].Parameter[0]; database | -| 6 | Source: ::exec_iter; ReturnValue.Field[core::result::Result::Ok(0)].Element; database | -| 7 | Source: ::get; ReturnValue.Field[core::option::Option::Some(0)]; database | -| 8 | Source: ::get_opt; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; database | -| 9 | Source: ::take; ReturnValue.Field[core::option::Option::Some(0)]; database | -| 10 | Source: ::take_opt; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; database | -| 11 | Summary: <_ as core::ops::arith::Add>::add; Argument[self,0].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | -| 12 | Summary: <_ as core::ops::arith::Add>::add; Argument[self,0]; ReturnValue; taint | -| 13 | Summary: <_ as mysql::conn::queryable::Queryable>::query_fold; Argument[2].ReturnValue; ReturnValue.Field[core::result::Result::Ok(0)]; value | -| 14 | Summary: <_ as mysql_async::queryable::Queryable>::query_fold; Argument[2].ReturnValue; ReturnValue.Future.Field[core::result::Result::Ok(0)]; value | -| 15 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 16 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 1 | Source: ::exec_iter; ReturnValue.Field[core::result::Result::Ok(0)].Element; database | +| 2 | Source: ::get; ReturnValue.Field[core::option::Option::Some(0)]; database | +| 3 | Source: ::get_opt; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; database | +| 4 | Source: ::take; ReturnValue.Field[core::option::Option::Some(0)]; database | +| 5 | Source: ::take_opt; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; database | +| 6 | Source: mysql::conn::queryable::Queryable::query_first; ReturnValue.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; database | +| 7 | Source: mysql::conn::queryable::Queryable::query_fold; Argument[2].Parameter[1]; database | +| 8 | Source: mysql::conn::queryable::Queryable::query_map; Argument[1].Parameter[0]; database | +| 9 | Source: mysql_async::queryable::Queryable::query_fold; Argument[2].Parameter[1]; database | +| 10 | Source: mysql_async::queryable::Queryable::query_map; Argument[1].Parameter[0]; database | +| 11 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 12 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 13 | Summary: core::ops::arith::Add::add; Argument[self,0].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | +| 14 | Summary: core::ops::arith::Add::add; Argument[self,0]; ReturnValue; taint | +| 15 | Summary: mysql::conn::queryable::Queryable::query_fold; Argument[2].ReturnValue; ReturnValue.Field[core::result::Result::Ok(0)]; value | +| 16 | Summary: mysql_async::queryable::Queryable::query_fold; Argument[2].ReturnValue; ReturnValue.Future.Field[core::result::Result::Ok(0)]; value | edges | test.rs:18:13:18:14 | v1 | test.rs:19:14:19:15 | v1 | provenance | | -| test.rs:18:24:18:33 | row.get(...) | test.rs:18:24:18:33 | row.get(...) [Some] | provenance | Src:MaD:7 | -| test.rs:18:24:18:33 | row.get(...) [Some] | test.rs:18:24:18:42 | ... .unwrap() | provenance | MaD:15 | +| test.rs:18:24:18:33 | row.get(...) | test.rs:18:24:18:33 | row.get(...) [Some] | provenance | Src:MaD:2 | +| test.rs:18:24:18:33 | row.get(...) [Some] | test.rs:18:24:18:42 | ... .unwrap() | provenance | MaD:11 | | test.rs:18:24:18:42 | ... .unwrap() | test.rs:18:13:18:14 | v1 | provenance | | | test.rs:21:13:21:14 | v2 | test.rs:22:14:22:15 | v2 | provenance | | -| test.rs:21:24:21:37 | row.get_opt(...) | test.rs:21:24:21:37 | row.get_opt(...) [Some, Ok] | provenance | Src:MaD:8 | -| test.rs:21:24:21:37 | row.get_opt(...) [Some, Ok] | test.rs:21:24:21:46 | ... .unwrap() [Ok] | provenance | MaD:15 | -| test.rs:21:24:21:46 | ... .unwrap() [Ok] | test.rs:21:24:21:55 | ... .unwrap() | provenance | MaD:16 | +| test.rs:21:24:21:37 | row.get_opt(...) | test.rs:21:24:21:37 | row.get_opt(...) [Some, Ok] | provenance | Src:MaD:3 | +| test.rs:21:24:21:37 | row.get_opt(...) [Some, Ok] | test.rs:21:24:21:46 | ... .unwrap() [Ok] | provenance | MaD:11 | +| test.rs:21:24:21:46 | ... .unwrap() [Ok] | test.rs:21:24:21:55 | ... .unwrap() | provenance | MaD:12 | | test.rs:21:24:21:55 | ... .unwrap() | test.rs:21:13:21:14 | v2 | provenance | | | test.rs:24:13:24:14 | v3 | test.rs:25:14:25:15 | v3 | provenance | | -| test.rs:24:24:24:34 | row.take(...) | test.rs:24:24:24:34 | row.take(...) [Some] | provenance | Src:MaD:9 | -| test.rs:24:24:24:34 | row.take(...) [Some] | test.rs:24:24:24:43 | ... .unwrap() | provenance | MaD:15 | +| test.rs:24:24:24:34 | row.take(...) | test.rs:24:24:24:34 | row.take(...) [Some] | provenance | Src:MaD:4 | +| test.rs:24:24:24:34 | row.take(...) [Some] | test.rs:24:24:24:43 | ... .unwrap() | provenance | MaD:11 | | test.rs:24:24:24:43 | ... .unwrap() | test.rs:24:13:24:14 | v3 | provenance | | | test.rs:27:13:27:14 | v4 | test.rs:28:14:28:15 | v4 | provenance | | -| test.rs:27:24:27:38 | row.take_opt(...) | test.rs:27:24:27:38 | row.take_opt(...) [Some, Ok] | provenance | Src:MaD:10 | -| test.rs:27:24:27:38 | row.take_opt(...) [Some, Ok] | test.rs:27:24:27:47 | ... .unwrap() [Ok] | provenance | MaD:15 | -| test.rs:27:24:27:47 | ... .unwrap() [Ok] | test.rs:27:24:27:56 | ... .unwrap() | provenance | MaD:16 | +| test.rs:27:24:27:38 | row.take_opt(...) | test.rs:27:24:27:38 | row.take_opt(...) [Some, Ok] | provenance | Src:MaD:5 | +| test.rs:27:24:27:38 | row.take_opt(...) [Some, Ok] | test.rs:27:24:27:47 | ... .unwrap() [Ok] | provenance | MaD:11 | +| test.rs:27:24:27:47 | ... .unwrap() [Ok] | test.rs:27:24:27:56 | ... .unwrap() | provenance | MaD:12 | | test.rs:27:24:27:56 | ... .unwrap() | test.rs:27:13:27:14 | v4 | provenance | | | test.rs:37:13:37:14 | v6 | test.rs:38:14:38:15 | v6 | provenance | | -| test.rs:37:23:37:63 | conn.query_first(...) | test.rs:37:23:37:63 | conn.query_first(...) [Ok, Some] | provenance | Src:MaD:1 | +| test.rs:37:23:37:63 | conn.query_first(...) | test.rs:37:23:37:63 | conn.query_first(...) [Ok, Some] | provenance | Src:MaD:6 | | test.rs:37:23:37:63 | conn.query_first(...) [Ok, Some] | test.rs:37:23:37:64 | TryExpr [Some] | provenance | | -| test.rs:37:23:37:64 | TryExpr [Some] | test.rs:37:23:37:73 | ... .unwrap() | provenance | MaD:15 | +| test.rs:37:23:37:64 | TryExpr [Some] | test.rs:37:23:37:73 | ... .unwrap() | provenance | MaD:11 | | test.rs:37:23:37:73 | ... .unwrap() | test.rs:37:13:37:14 | v6 | provenance | | | test.rs:40:13:40:18 | mut t1 [element] | test.rs:42:20:42:21 | t1 [element] | provenance | | -| test.rs:40:22:40:71 | conn.exec_iter(...) | test.rs:40:22:40:71 | conn.exec_iter(...) [Ok, element] | provenance | Src:MaD:6 | +| test.rs:40:22:40:71 | conn.exec_iter(...) | test.rs:40:22:40:71 | conn.exec_iter(...) [Ok, element] | provenance | Src:MaD:1 | | test.rs:40:22:40:71 | conn.exec_iter(...) [Ok, element] | test.rs:40:22:40:72 | TryExpr [element] | provenance | | | test.rs:40:22:40:72 | TryExpr [element] | test.rs:40:13:40:18 | mut t1 [element] | provenance | | -| test.rs:41:14:41:61 | ... .get(...) | test.rs:41:14:41:61 | ... .get(...) [Some] | provenance | Src:MaD:7 | -| test.rs:41:14:41:61 | ... .get(...) [Some] | test.rs:41:14:41:70 | ... .unwrap() | provenance | MaD:15 | +| test.rs:41:14:41:61 | ... .get(...) | test.rs:41:14:41:61 | ... .get(...) [Some] | provenance | Src:MaD:2 | +| test.rs:41:14:41:61 | ... .get(...) [Some] | test.rs:41:14:41:70 | ... .unwrap() | provenance | MaD:11 | | test.rs:42:13:42:15 | row | test.rs:44:22:44:22 | v | provenance | | | test.rs:42:20:42:21 | t1 [element] | test.rs:42:13:42:15 | row | provenance | | -| test.rs:50:13:52:13 | \|...\| ... | test.rs:51:22:51:27 | values | provenance | Src:MaD:3 | -| test.rs:57:13:61:13 | \|...\| ... | test.rs:58:22:58:29 | values.0 | provenance | Src:MaD:3 | -| test.rs:57:13:61:13 | \|...\| ... | test.rs:59:22:59:29 | values.1 | provenance | Src:MaD:3 | -| test.rs:57:13:61:13 | \|...\| ... | test.rs:60:22:60:29 | values.2 | provenance | Src:MaD:3 | +| test.rs:50:13:52:13 | \|...\| ... | test.rs:51:22:51:27 | values | provenance | Src:MaD:8 | +| test.rs:57:13:61:13 | \|...\| ... | test.rs:58:22:58:29 | values.0 | provenance | Src:MaD:8 | +| test.rs:57:13:61:13 | \|...\| ... | test.rs:59:22:59:29 | values.1 | provenance | Src:MaD:8 | +| test.rs:57:13:61:13 | \|...\| ... | test.rs:60:22:60:29 | values.2 | provenance | Src:MaD:8 | | test.rs:64:13:64:17 | total | test.rs:68:14:68:18 | total | provenance | | | test.rs:64:13:64:17 | total [Wrapping] | test.rs:68:14:68:18 | total | provenance | | | test.rs:64:21:67:10 | conn.query_fold(...) [Ok, Wrapping] | test.rs:64:21:67:11 | TryExpr [Wrapping] | provenance | | | test.rs:64:21:67:10 | conn.query_fold(...) [Ok] | test.rs:64:21:67:11 | TryExpr | provenance | | | test.rs:64:21:67:11 | TryExpr | test.rs:64:13:64:17 | total | provenance | | | test.rs:64:21:67:11 | TryExpr [Wrapping] | test.rs:64:13:64:17 | total [Wrapping] | provenance | | -| test.rs:64:65:67:9 | \|...\| ... | test.rs:65:18:65:20 | row | provenance | Src:MaD:2 | -| test.rs:64:65:67:9 | \|...\| ... | test.rs:66:19:66:21 | row | provenance | Src:MaD:2 | -| test.rs:64:86:67:9 | { ... } | test.rs:64:21:67:10 | conn.query_fold(...) [Ok] | provenance | MaD:13 | -| test.rs:64:86:67:9 | { ... } [Wrapping] | test.rs:64:21:67:10 | conn.query_fold(...) [Ok, Wrapping] | provenance | MaD:13 | +| test.rs:64:65:67:9 | \|...\| ... | test.rs:65:18:65:20 | row | provenance | Src:MaD:7 | +| test.rs:64:65:67:9 | \|...\| ... | test.rs:66:19:66:21 | row | provenance | Src:MaD:7 | +| test.rs:64:86:67:9 | { ... } | test.rs:64:21:67:10 | conn.query_fold(...) [Ok] | provenance | MaD:15 | +| test.rs:64:86:67:9 | { ... } [Wrapping] | test.rs:64:21:67:10 | conn.query_fold(...) [Ok, Wrapping] | provenance | MaD:15 | | test.rs:66:13:66:21 | ... + ... | test.rs:64:86:67:9 | { ... } | provenance | | | test.rs:66:13:66:21 | ... + ... [Wrapping] | test.rs:64:86:67:9 | { ... } [Wrapping] | provenance | | -| test.rs:66:19:66:21 | row | test.rs:66:13:66:21 | ... + ... | provenance | MaD:12 | -| test.rs:66:19:66:21 | row | test.rs:66:13:66:21 | ... + ... [Wrapping] | provenance | MaD:11 | -| test.rs:70:72:78:9 | \|...\| ... | test.rs:71:17:71:18 | id | provenance | Src:MaD:2 | -| test.rs:70:72:78:9 | \|...\| ... | test.rs:72:17:72:20 | name | provenance | Src:MaD:2 | -| test.rs:70:72:78:9 | \|...\| ... | test.rs:73:17:73:19 | age | provenance | Src:MaD:2 | +| test.rs:66:19:66:21 | row | test.rs:66:13:66:21 | ... + ... | provenance | MaD:14 | +| test.rs:66:19:66:21 | row | test.rs:66:13:66:21 | ... + ... [Wrapping] | provenance | MaD:13 | +| test.rs:70:72:78:9 | \|...\| ... | test.rs:71:17:71:18 | id | provenance | Src:MaD:7 | +| test.rs:70:72:78:9 | \|...\| ... | test.rs:72:17:72:20 | name | provenance | Src:MaD:7 | +| test.rs:70:72:78:9 | \|...\| ... | test.rs:73:17:73:19 | age | provenance | Src:MaD:7 | | test.rs:71:17:71:18 | id | test.rs:74:18:74:19 | id | provenance | | | test.rs:72:17:72:20 | name | test.rs:75:18:75:21 | name | provenance | | | test.rs:73:17:73:19 | age | test.rs:76:18:76:20 | age | provenance | | | test.rs:105:13:105:14 | v1 | test.rs:106:14:106:15 | v1 | provenance | | -| test.rs:105:24:105:33 | row.get(...) | test.rs:105:24:105:33 | row.get(...) [Some] | provenance | Src:MaD:7 | -| test.rs:105:24:105:33 | row.get(...) [Some] | test.rs:105:24:105:42 | ... .unwrap() | provenance | MaD:15 | +| test.rs:105:24:105:33 | row.get(...) | test.rs:105:24:105:33 | row.get(...) [Some] | provenance | Src:MaD:2 | +| test.rs:105:24:105:33 | row.get(...) [Some] | test.rs:105:24:105:42 | ... .unwrap() | provenance | MaD:11 | | test.rs:105:24:105:42 | ... .unwrap() | test.rs:105:13:105:14 | v1 | provenance | | | test.rs:108:13:108:14 | v2 | test.rs:109:14:109:15 | v2 | provenance | | -| test.rs:108:24:108:37 | row.get_opt(...) | test.rs:108:24:108:37 | row.get_opt(...) [Some, Ok] | provenance | Src:MaD:8 | -| test.rs:108:24:108:37 | row.get_opt(...) [Some, Ok] | test.rs:108:24:108:46 | ... .unwrap() [Ok] | provenance | MaD:15 | -| test.rs:108:24:108:46 | ... .unwrap() [Ok] | test.rs:108:24:108:55 | ... .unwrap() | provenance | MaD:16 | +| test.rs:108:24:108:37 | row.get_opt(...) | test.rs:108:24:108:37 | row.get_opt(...) [Some, Ok] | provenance | Src:MaD:3 | +| test.rs:108:24:108:37 | row.get_opt(...) [Some, Ok] | test.rs:108:24:108:46 | ... .unwrap() [Ok] | provenance | MaD:11 | +| test.rs:108:24:108:46 | ... .unwrap() [Ok] | test.rs:108:24:108:55 | ... .unwrap() | provenance | MaD:12 | | test.rs:108:24:108:55 | ... .unwrap() | test.rs:108:13:108:14 | v2 | provenance | | | test.rs:111:13:111:14 | v3 | test.rs:112:14:112:15 | v3 | provenance | | -| test.rs:111:24:111:34 | row.take(...) | test.rs:111:24:111:34 | row.take(...) [Some] | provenance | Src:MaD:9 | -| test.rs:111:24:111:34 | row.take(...) [Some] | test.rs:111:24:111:43 | ... .unwrap() | provenance | MaD:15 | +| test.rs:111:24:111:34 | row.take(...) | test.rs:111:24:111:34 | row.take(...) [Some] | provenance | Src:MaD:4 | +| test.rs:111:24:111:34 | row.take(...) [Some] | test.rs:111:24:111:43 | ... .unwrap() | provenance | MaD:11 | | test.rs:111:24:111:43 | ... .unwrap() | test.rs:111:13:111:14 | v3 | provenance | | | test.rs:114:13:114:14 | v4 | test.rs:115:14:115:15 | v4 | provenance | | -| test.rs:114:24:114:38 | row.take_opt(...) | test.rs:114:24:114:38 | row.take_opt(...) [Some, Ok] | provenance | Src:MaD:10 | -| test.rs:114:24:114:38 | row.take_opt(...) [Some, Ok] | test.rs:114:24:114:47 | ... .unwrap() [Ok] | provenance | MaD:15 | -| test.rs:114:24:114:47 | ... .unwrap() [Ok] | test.rs:114:24:114:56 | ... .unwrap() | provenance | MaD:16 | +| test.rs:114:24:114:38 | row.take_opt(...) | test.rs:114:24:114:38 | row.take_opt(...) [Some, Ok] | provenance | Src:MaD:5 | +| test.rs:114:24:114:38 | row.take_opt(...) [Some, Ok] | test.rs:114:24:114:47 | ... .unwrap() [Ok] | provenance | MaD:11 | +| test.rs:114:24:114:47 | ... .unwrap() [Ok] | test.rs:114:24:114:56 | ... .unwrap() | provenance | MaD:12 | | test.rs:114:24:114:56 | ... .unwrap() | test.rs:114:13:114:14 | v4 | provenance | | -| test.rs:137:13:139:13 | \|...\| ... | test.rs:138:22:138:27 | values | provenance | Src:MaD:5 | -| test.rs:144:13:148:13 | \|...\| ... | test.rs:145:22:145:29 | values.0 | provenance | Src:MaD:5 | -| test.rs:144:13:148:13 | \|...\| ... | test.rs:146:22:146:29 | values.1 | provenance | Src:MaD:5 | -| test.rs:144:13:148:13 | \|...\| ... | test.rs:147:22:147:29 | values.2 | provenance | Src:MaD:5 | +| test.rs:137:13:139:13 | \|...\| ... | test.rs:138:22:138:27 | values | provenance | Src:MaD:10 | +| test.rs:144:13:148:13 | \|...\| ... | test.rs:145:22:145:29 | values.0 | provenance | Src:MaD:10 | +| test.rs:144:13:148:13 | \|...\| ... | test.rs:146:22:146:29 | values.1 | provenance | Src:MaD:10 | +| test.rs:144:13:148:13 | \|...\| ... | test.rs:147:22:147:29 | values.2 | provenance | Src:MaD:10 | | test.rs:151:13:151:17 | total | test.rs:155:14:155:18 | total | provenance | | | test.rs:151:13:151:17 | total [Wrapping] | test.rs:155:14:155:18 | total | provenance | | | test.rs:151:21:154:10 | conn.query_fold(...) [future, Ok, Wrapping] | test.rs:151:21:154:16 | await ... [Ok, Wrapping] | provenance | | @@ -101,17 +101,17 @@ edges | test.rs:151:21:154:16 | await ... [Ok] | test.rs:151:21:154:17 | TryExpr | provenance | | | test.rs:151:21:154:17 | TryExpr | test.rs:151:13:151:17 | total | provenance | | | test.rs:151:21:154:17 | TryExpr [Wrapping] | test.rs:151:13:151:17 | total [Wrapping] | provenance | | -| test.rs:151:65:154:9 | \|...\| ... | test.rs:152:18:152:20 | row | provenance | Src:MaD:4 | -| test.rs:151:65:154:9 | \|...\| ... | test.rs:153:19:153:21 | row | provenance | Src:MaD:4 | -| test.rs:151:86:154:9 | { ... } | test.rs:151:21:154:10 | conn.query_fold(...) [future, Ok] | provenance | MaD:14 | -| test.rs:151:86:154:9 | { ... } [Wrapping] | test.rs:151:21:154:10 | conn.query_fold(...) [future, Ok, Wrapping] | provenance | MaD:14 | +| test.rs:151:65:154:9 | \|...\| ... | test.rs:152:18:152:20 | row | provenance | Src:MaD:9 | +| test.rs:151:65:154:9 | \|...\| ... | test.rs:153:19:153:21 | row | provenance | Src:MaD:9 | +| test.rs:151:86:154:9 | { ... } | test.rs:151:21:154:10 | conn.query_fold(...) [future, Ok] | provenance | MaD:16 | +| test.rs:151:86:154:9 | { ... } [Wrapping] | test.rs:151:21:154:10 | conn.query_fold(...) [future, Ok, Wrapping] | provenance | MaD:16 | | test.rs:153:13:153:21 | ... + ... | test.rs:151:86:154:9 | { ... } | provenance | | | test.rs:153:13:153:21 | ... + ... [Wrapping] | test.rs:151:86:154:9 | { ... } [Wrapping] | provenance | | -| test.rs:153:19:153:21 | row | test.rs:153:13:153:21 | ... + ... | provenance | MaD:12 | -| test.rs:153:19:153:21 | row | test.rs:153:13:153:21 | ... + ... [Wrapping] | provenance | MaD:11 | -| test.rs:157:72:165:9 | \|...\| ... | test.rs:158:17:158:18 | id | provenance | Src:MaD:4 | -| test.rs:157:72:165:9 | \|...\| ... | test.rs:159:17:159:20 | name | provenance | Src:MaD:4 | -| test.rs:157:72:165:9 | \|...\| ... | test.rs:160:17:160:19 | age | provenance | Src:MaD:4 | +| test.rs:153:19:153:21 | row | test.rs:153:13:153:21 | ... + ... | provenance | MaD:14 | +| test.rs:153:19:153:21 | row | test.rs:153:13:153:21 | ... + ... [Wrapping] | provenance | MaD:13 | +| test.rs:157:72:165:9 | \|...\| ... | test.rs:158:17:158:18 | id | provenance | Src:MaD:9 | +| test.rs:157:72:165:9 | \|...\| ... | test.rs:159:17:159:20 | name | provenance | Src:MaD:9 | +| test.rs:157:72:165:9 | \|...\| ... | test.rs:160:17:160:19 | age | provenance | Src:MaD:9 | | test.rs:158:17:158:18 | id | test.rs:161:18:161:19 | id | provenance | | | test.rs:159:17:159:20 | name | test.rs:162:18:162:21 | name | provenance | | | test.rs:160:17:160:19 | age | test.rs:163:18:163:20 | age | provenance | | diff --git a/rust/ql/test/library-tests/dataflow/sources/env/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/env/InlineFlow.expected index 30c4e844c41e..5f09299d8536 100644 --- a/rust/ql/test/library-tests/dataflow/sources/env/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/env/InlineFlow.expected @@ -8,24 +8,24 @@ models | 7 | Source: std::env::var_os; ReturnValue.Field[core::option::Option::Some(0)]; environment | | 8 | Source: std::env::vars; ReturnValue.Element; environment | | 9 | Source: std::env::vars_os; ReturnValue.Element; environment | -| 10 | Summary: <_ as core::iter::traits::iterator::Iterator>::collect; Argument[self].Element; ReturnValue.Element; value | -| 11 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 12 | Summary: <_ as core::ops::index::Index>::index; Argument[self].Reference.Element; ReturnValue.Reference; value | -| 13 | Summary: ::deref; Argument[self]; ReturnValue; value | -| 14 | Summary: ::expect; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 15 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 16 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 17 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 10 | Summary: ::deref; Argument[self]; ReturnValue; value | +| 11 | Summary: ::expect; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 12 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 13 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 14 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 15 | Summary: core::iter::traits::iterator::Iterator::collect; Argument[self].Element; ReturnValue.Element; value | +| 16 | Summary: core::iter::traits::iterator::Iterator::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 17 | Summary: core::ops::index::Index::index; Argument[self].Reference.Element; ReturnValue.Reference; value | edges | test.rs:6:10:6:30 | ...::var(...) | test.rs:6:10:6:30 | ...::var(...) | provenance | Src:MaD:6 | | test.rs:7:10:7:33 | ...::var_os(...) | test.rs:7:10:7:33 | ...::var_os(...) | provenance | Src:MaD:7 | | test.rs:9:9:9:12 | var1 | test.rs:12:10:12:13 | var1 | provenance | | | test.rs:9:16:9:36 | ...::var(...) | test.rs:9:16:9:36 | ...::var(...) [Ok] | provenance | Src:MaD:6 | -| test.rs:9:16:9:36 | ...::var(...) [Ok] | test.rs:9:16:9:59 | ... .expect(...) | provenance | MaD:16 | +| test.rs:9:16:9:36 | ...::var(...) [Ok] | test.rs:9:16:9:59 | ... .expect(...) | provenance | MaD:13 | | test.rs:9:16:9:59 | ... .expect(...) | test.rs:9:9:9:12 | var1 | provenance | | | test.rs:10:9:10:12 | var2 | test.rs:13:10:13:13 | var2 | provenance | | | test.rs:10:16:10:39 | ...::var_os(...) | test.rs:10:16:10:39 | ...::var_os(...) [Some] | provenance | Src:MaD:7 | -| test.rs:10:16:10:39 | ...::var_os(...) [Some] | test.rs:10:16:10:48 | ... .unwrap() | provenance | MaD:15 | +| test.rs:10:16:10:39 | ...::var_os(...) [Some] | test.rs:10:16:10:48 | ... .unwrap() | provenance | MaD:12 | | test.rs:10:16:10:48 | ... .unwrap() | test.rs:10:9:10:12 | var2 | provenance | | | test.rs:15:9:15:20 | TuplePat | test.rs:16:14:16:16 | key | provenance | | | test.rs:15:9:15:20 | TuplePat | test.rs:17:14:17:18 | value | provenance | | @@ -38,32 +38,32 @@ edges | test.rs:27:9:27:12 | args [element] | test.rs:28:20:28:23 | args [element] | provenance | | | test.rs:27:9:27:12 | args [element] | test.rs:29:17:29:20 | args [element] | provenance | | | test.rs:27:29:27:44 | ...::args(...) | test.rs:27:29:27:44 | ...::args(...) [element] | provenance | Src:MaD:1 | -| test.rs:27:29:27:44 | ...::args(...) [element] | test.rs:27:29:27:54 | ... .collect() [element] | provenance | MaD:10 | +| test.rs:27:29:27:44 | ...::args(...) [element] | test.rs:27:29:27:54 | ... .collect() [element] | provenance | MaD:15 | | test.rs:27:29:27:54 | ... .collect() [element] | test.rs:27:9:27:12 | args [element] | provenance | | | test.rs:28:9:28:15 | my_path [&ref] | test.rs:34:10:34:16 | my_path | provenance | | | test.rs:28:19:28:26 | &... [&ref] | test.rs:28:9:28:15 | my_path [&ref] | provenance | | -| test.rs:28:20:28:23 | args [element] | test.rs:28:20:28:26 | args[0] | provenance | MaD:12 | +| test.rs:28:20:28:23 | args [element] | test.rs:28:20:28:26 | args[0] | provenance | MaD:17 | | test.rs:28:20:28:26 | args[0] | test.rs:28:19:28:26 | &... [&ref] | provenance | | | test.rs:29:9:29:12 | arg1 [&ref] | test.rs:35:10:35:13 | arg1 | provenance | | | test.rs:29:16:29:23 | &... [&ref] | test.rs:29:9:29:12 | arg1 [&ref] | provenance | | -| test.rs:29:17:29:20 | args [element] | test.rs:29:17:29:23 | args[1] | provenance | MaD:12 | +| test.rs:29:17:29:20 | args [element] | test.rs:29:17:29:23 | args[1] | provenance | MaD:17 | | test.rs:29:17:29:23 | args[1] | test.rs:29:16:29:23 | &... [&ref] | provenance | | | test.rs:30:9:30:12 | arg2 | test.rs:36:10:36:13 | arg2 | provenance | | | test.rs:30:16:30:31 | ...::args(...) | test.rs:30:16:30:31 | ...::args(...) [element] | provenance | Src:MaD:1 | -| test.rs:30:16:30:31 | ...::args(...) [element] | test.rs:30:16:30:38 | ... .nth(...) [Some] | provenance | MaD:11 | -| test.rs:30:16:30:38 | ... .nth(...) [Some] | test.rs:30:16:30:47 | ... .unwrap() | provenance | MaD:15 | +| test.rs:30:16:30:31 | ...::args(...) [element] | test.rs:30:16:30:38 | ... .nth(...) [Some] | provenance | MaD:16 | +| test.rs:30:16:30:38 | ... .nth(...) [Some] | test.rs:30:16:30:47 | ... .unwrap() | provenance | MaD:12 | | test.rs:30:16:30:47 | ... .unwrap() | test.rs:30:9:30:12 | arg2 | provenance | | | test.rs:31:9:31:12 | arg3 | test.rs:37:10:37:13 | arg3 | provenance | | | test.rs:31:16:31:34 | ...::args_os(...) | test.rs:31:16:31:34 | ...::args_os(...) [element] | provenance | Src:MaD:2 | -| test.rs:31:16:31:34 | ...::args_os(...) [element] | test.rs:31:16:31:41 | ... .nth(...) [Some] | provenance | MaD:11 | -| test.rs:31:16:31:41 | ... .nth(...) [Some] | test.rs:31:16:31:50 | ... .unwrap() | provenance | MaD:15 | +| test.rs:31:16:31:34 | ...::args_os(...) [element] | test.rs:31:16:31:41 | ... .nth(...) [Some] | provenance | MaD:16 | +| test.rs:31:16:31:41 | ... .nth(...) [Some] | test.rs:31:16:31:50 | ... .unwrap() | provenance | MaD:12 | | test.rs:31:16:31:50 | ... .unwrap() | test.rs:31:9:31:12 | arg3 | provenance | | | test.rs:32:9:32:12 | arg4 | test.rs:38:10:38:13 | arg4 | provenance | | | test.rs:32:16:32:31 | ...::args(...) | test.rs:32:16:32:31 | ...::args(...) [element] | provenance | Src:MaD:1 | -| test.rs:32:16:32:31 | ...::args(...) [element] | test.rs:32:16:32:38 | ... .nth(...) [Some] | provenance | MaD:11 | -| test.rs:32:16:32:38 | ... .nth(...) [Some] | test.rs:32:16:32:47 | ... .unwrap() | provenance | MaD:15 | -| test.rs:32:16:32:47 | ... .unwrap() | test.rs:32:16:32:64 | ... .parse() [Ok] | provenance | MaD:13 | -| test.rs:32:16:32:64 | ... .parse() [Ok] | test.rs:32:16:32:73 | ... .unwrap() | provenance | MaD:17 | +| test.rs:32:16:32:31 | ...::args(...) [element] | test.rs:32:16:32:38 | ... .nth(...) [Some] | provenance | MaD:16 | +| test.rs:32:16:32:38 | ... .nth(...) [Some] | test.rs:32:16:32:47 | ... .unwrap() | provenance | MaD:12 | +| test.rs:32:16:32:47 | ... .unwrap() | test.rs:32:16:32:64 | ... .parse() [Ok] | provenance | MaD:10 | +| test.rs:32:16:32:64 | ... .parse() [Ok] | test.rs:32:16:32:73 | ... .unwrap() | provenance | MaD:14 | | test.rs:32:16:32:73 | ... .unwrap() | test.rs:32:9:32:12 | arg4 | provenance | | | test.rs:40:9:40:11 | arg | test.rs:41:14:41:16 | arg | provenance | | | test.rs:40:16:40:31 | ...::args(...) | test.rs:40:16:40:31 | ...::args(...) [element] | provenance | Src:MaD:1 | @@ -73,15 +73,15 @@ edges | test.rs:44:16:44:34 | ...::args_os(...) [element] | test.rs:44:9:44:11 | arg | provenance | | | test.rs:50:9:50:11 | dir | test.rs:54:10:54:12 | dir | provenance | | | test.rs:50:15:50:37 | ...::current_dir(...) | test.rs:50:15:50:37 | ...::current_dir(...) [Ok] | provenance | Src:MaD:3 | -| test.rs:50:15:50:37 | ...::current_dir(...) [Ok] | test.rs:50:15:50:54 | ... .expect(...) | provenance | MaD:16 | +| test.rs:50:15:50:37 | ...::current_dir(...) [Ok] | test.rs:50:15:50:54 | ... .expect(...) | provenance | MaD:13 | | test.rs:50:15:50:54 | ... .expect(...) | test.rs:50:9:50:11 | dir | provenance | | | test.rs:51:9:51:11 | exe | test.rs:55:10:55:12 | exe | provenance | | | test.rs:51:15:51:37 | ...::current_exe(...) | test.rs:51:15:51:37 | ...::current_exe(...) [Ok] | provenance | Src:MaD:4 | -| test.rs:51:15:51:37 | ...::current_exe(...) [Ok] | test.rs:51:15:51:54 | ... .expect(...) | provenance | MaD:16 | +| test.rs:51:15:51:37 | ...::current_exe(...) [Ok] | test.rs:51:15:51:54 | ... .expect(...) | provenance | MaD:13 | | test.rs:51:15:51:54 | ... .expect(...) | test.rs:51:9:51:11 | exe | provenance | | | test.rs:52:9:52:12 | home | test.rs:56:10:56:13 | home | provenance | | | test.rs:52:16:52:35 | ...::home_dir(...) | test.rs:52:16:52:35 | ...::home_dir(...) [Some] | provenance | Src:MaD:5 | -| test.rs:52:16:52:35 | ...::home_dir(...) [Some] | test.rs:52:16:52:52 | ... .expect(...) | provenance | MaD:14 | +| test.rs:52:16:52:35 | ...::home_dir(...) [Some] | test.rs:52:16:52:52 | ... .expect(...) | provenance | MaD:11 | | test.rs:52:16:52:52 | ... .expect(...) | test.rs:52:9:52:12 | home | provenance | | nodes | test.rs:6:10:6:30 | ...::var(...) | semmle.label | ...::var(...) | diff --git a/rust/ql/test/library-tests/dataflow/sources/file/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/file/InlineFlow.expected index ca467c32f59c..77cebe65dd52 100644 --- a/rust/ql/test/library-tests/dataflow/sources/file/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/file/InlineFlow.expected @@ -15,36 +15,36 @@ models | 14 | Source: tokio::fs::read::read; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | | 15 | Source: tokio::fs::read_link::read_link; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | | 16 | Source: tokio::fs::read_to_string::read_to_string; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | -| 17 | Summary: <_ as async_std::io::read::ReadExt>::read; Argument[self].Reference; Argument[0].Reference; taint | -| 18 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | -| 19 | Summary: <_ as std::io::Read>::bytes; Argument[self]; ReturnValue; taint | -| 20 | Summary: <_ as std::io::Read>::chain; Argument[0]; ReturnValue; taint | -| 21 | Summary: <_ as std::io::Read>::chain; Argument[self]; ReturnValue; taint | -| 22 | Summary: <_ as std::io::Read>::read; Argument[self].Reference; Argument[0].Reference; taint | -| 23 | Summary: <_ as std::io::Read>::read_exact; Argument[self].Reference; Argument[0].Reference; taint | -| 24 | Summary: <_ as std::io::Read>::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | -| 25 | Summary: <_ as std::io::Read>::take; Argument[self]; ReturnValue; taint | -| 26 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read; Argument[self].Reference; Argument[0].Reference; taint | -| 27 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_buf; Argument[self].Reference; Argument[0].Reference; taint | -| 28 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_exact; Argument[self].Reference; Argument[0].Reference; taint | -| 29 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_f32; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 30 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i16; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 31 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i64_le; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 32 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | -| 33 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | -| 34 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u8; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 35 | Summary: ::to_mut; Argument[self].Reference.Field[alloc::borrow::Cow::Owned(0)]; ReturnValue.Reference; value | -| 36 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 37 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 38 | Summary: ::deref; Argument[self].Reference; ReturnValue.Reference; taint | -| 39 | Summary: ::into_string; Argument[self].Field[std::ffi::os_str::OsString::inner].Field[std::sys::os_str::bytes::Buf::inner]; ReturnValue.Field[core::result::Result::Ok(0)].Field[alloc::string::String::vec]; value | -| 40 | Summary: ::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | -| 41 | Summary: ::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | -| 42 | Summary: ::from; Argument[0]; ReturnValue.Field[std::path::PathBuf::inner]; value | -| 43 | Summary: ::deref; Argument[self].Reference.Field[std::path::PathBuf::inner]; ReturnValue.Reference; value | -| 44 | Summary: ::as_path; Argument[self].Reference; ReturnValue.Reference; value | -| 45 | Summary: ::into_boxed_path; Argument[self]; ReturnValue.Field[alloc::boxed::Box(0)]; taint | -| 46 | Summary: ::into_os_string; Argument[self].Field[std::path::PathBuf::inner]; ReturnValue; value | +| 17 | Summary: ::to_mut; Argument[self].Reference.Field[alloc::borrow::Cow::Owned(0)]; ReturnValue.Reference; value | +| 18 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 19 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 20 | Summary: ::deref; Argument[self].Reference; ReturnValue.Reference; taint | +| 21 | Summary: ::into_string; Argument[self].Field[std::ffi::os_str::OsString::inner].Field[std::sys::os_str::bytes::Buf::inner]; ReturnValue.Field[core::result::Result::Ok(0)].Field[alloc::string::String::vec]; value | +| 22 | Summary: ::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | +| 23 | Summary: ::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | +| 24 | Summary: ::from; Argument[0]; ReturnValue.Field[std::path::PathBuf::inner]; value | +| 25 | Summary: ::deref; Argument[self].Reference.Field[std::path::PathBuf::inner]; ReturnValue.Reference; value | +| 26 | Summary: ::as_path; Argument[self].Reference; ReturnValue.Reference; value | +| 27 | Summary: ::into_boxed_path; Argument[self]; ReturnValue.Field[alloc::boxed::Box(0)]; taint | +| 28 | Summary: ::into_os_string; Argument[self].Field[std::path::PathBuf::inner]; ReturnValue; value | +| 29 | Summary: async_std::io::read::ReadExt::read; Argument[self].Reference; Argument[0].Reference; taint | +| 30 | Summary: core::clone::Clone::clone; Argument[self].Reference; ReturnValue; value | +| 31 | Summary: std::io::Read::bytes; Argument[self]; ReturnValue; taint | +| 32 | Summary: std::io::Read::chain; Argument[0]; ReturnValue; taint | +| 33 | Summary: std::io::Read::chain; Argument[self]; ReturnValue; taint | +| 34 | Summary: std::io::Read::read; Argument[self].Reference; Argument[0].Reference; taint | +| 35 | Summary: std::io::Read::read_exact; Argument[self].Reference; Argument[0].Reference; taint | +| 36 | Summary: std::io::Read::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | +| 37 | Summary: std::io::Read::take; Argument[self]; ReturnValue; taint | +| 38 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read; Argument[self].Reference; Argument[0].Reference; taint | +| 39 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_buf; Argument[self].Reference; Argument[0].Reference; taint | +| 40 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_exact; Argument[self].Reference; Argument[0].Reference; taint | +| 41 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_f32; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 42 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_i16; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 43 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_i64_le; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 44 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | +| 45 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | +| 46 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_u8; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | edges | test.rs:12:13:12:18 | buffer | test.rs:13:14:13:19 | buffer | provenance | | | test.rs:12:31:12:55 | ...::read(...) | test.rs:12:31:12:55 | ...::read(...) [Ok] | provenance | Src:MaD:11 | @@ -71,26 +71,26 @@ edges | test.rs:30:13:30:16 | path | test.rs:41:14:41:17 | path | provenance | | | test.rs:30:13:30:16 | path | test.rs:42:14:42:17 | path | provenance | | | test.rs:30:20:30:27 | e.path() | test.rs:30:13:30:16 | path | provenance | Src:MaD:4 | -| test.rs:31:14:31:17 | path | test.rs:31:14:31:25 | path.clone() | provenance | MaD:18 | -| test.rs:32:14:32:17 | path | test.rs:32:14:32:25 | path.clone() | provenance | MaD:18 | -| test.rs:32:14:32:25 | path.clone() | test.rs:32:14:32:35 | ... .as_path() | provenance | MaD:44 | -| test.rs:33:14:33:17 | path | test.rs:33:14:33:25 | path.clone() | provenance | MaD:18 | -| test.rs:33:14:33:25 | path.clone() | test.rs:33:14:33:42 | ... .into_os_string() | provenance | MaD:46 | -| test.rs:34:39:34:42 | path | test.rs:34:39:34:50 | path.clone() | provenance | MaD:18 | -| test.rs:34:39:34:50 | path.clone() | test.rs:34:39:34:68 | ... .into_boxed_path() [Box(0)] | provenance | MaD:45 | -| test.rs:34:39:34:68 | ... .into_boxed_path() [Box(0)] | test.rs:34:14:34:69 | ...::from(...) | provenance | MaD:42 | -| test.rs:35:14:35:17 | path | test.rs:35:14:35:25 | path.clone() | provenance | MaD:18 | -| test.rs:35:14:35:25 | path.clone() | test.rs:35:14:35:37 | ... .as_os_str() | provenance | MaD:43 | -| test.rs:36:14:36:17 | path | test.rs:36:14:36:25 | path.clone() | provenance | MaD:18 | -| test.rs:36:14:36:25 | path.clone() | test.rs:36:14:36:41 | ... .as_mut_os_str() | provenance | MaD:43 | -| test.rs:37:14:37:17 | path | test.rs:37:14:37:26 | path.to_str() | provenance | MaD:43 | -| test.rs:38:14:38:17 | path | test.rs:38:14:38:31 | path.to_path_buf() | provenance | MaD:43 | -| test.rs:39:14:39:17 | path | test.rs:39:14:39:29 | path.file_name() [Some, &ref] | provenance | MaD:43 | -| test.rs:39:14:39:29 | path.file_name() [Some, &ref] | test.rs:39:14:39:38 | ... .unwrap() | provenance | MaD:36 | -| test.rs:40:14:40:17 | path | test.rs:40:14:40:29 | path.extension() [Some, &ref] | provenance | MaD:43 | -| test.rs:40:14:40:29 | path.extension() [Some, &ref] | test.rs:40:14:40:38 | ... .unwrap() | provenance | MaD:36 | -| test.rs:41:14:41:17 | path | test.rs:41:14:41:32 | path.canonicalize() [Ok] | provenance | MaD:43 | -| test.rs:41:14:41:32 | path.canonicalize() [Ok] | test.rs:41:14:41:41 | ... .unwrap() | provenance | MaD:37 | +| test.rs:31:14:31:17 | path | test.rs:31:14:31:25 | path.clone() | provenance | MaD:30 | +| test.rs:32:14:32:17 | path | test.rs:32:14:32:25 | path.clone() | provenance | MaD:30 | +| test.rs:32:14:32:25 | path.clone() | test.rs:32:14:32:35 | ... .as_path() | provenance | MaD:26 | +| test.rs:33:14:33:17 | path | test.rs:33:14:33:25 | path.clone() | provenance | MaD:30 | +| test.rs:33:14:33:25 | path.clone() | test.rs:33:14:33:42 | ... .into_os_string() | provenance | MaD:28 | +| test.rs:34:39:34:42 | path | test.rs:34:39:34:50 | path.clone() | provenance | MaD:30 | +| test.rs:34:39:34:50 | path.clone() | test.rs:34:39:34:68 | ... .into_boxed_path() [Box(0)] | provenance | MaD:27 | +| test.rs:34:39:34:68 | ... .into_boxed_path() [Box(0)] | test.rs:34:14:34:69 | ...::from(...) | provenance | MaD:24 | +| test.rs:35:14:35:17 | path | test.rs:35:14:35:25 | path.clone() | provenance | MaD:30 | +| test.rs:35:14:35:25 | path.clone() | test.rs:35:14:35:37 | ... .as_os_str() | provenance | MaD:25 | +| test.rs:36:14:36:17 | path | test.rs:36:14:36:25 | path.clone() | provenance | MaD:30 | +| test.rs:36:14:36:25 | path.clone() | test.rs:36:14:36:41 | ... .as_mut_os_str() | provenance | MaD:25 | +| test.rs:37:14:37:17 | path | test.rs:37:14:37:26 | path.to_str() | provenance | MaD:25 | +| test.rs:38:14:38:17 | path | test.rs:38:14:38:31 | path.to_path_buf() | provenance | MaD:25 | +| test.rs:39:14:39:17 | path | test.rs:39:14:39:29 | path.file_name() [Some, &ref] | provenance | MaD:25 | +| test.rs:39:14:39:29 | path.file_name() [Some, &ref] | test.rs:39:14:39:38 | ... .unwrap() | provenance | MaD:18 | +| test.rs:40:14:40:17 | path | test.rs:40:14:40:29 | path.extension() [Some, &ref] | provenance | MaD:25 | +| test.rs:40:14:40:29 | path.extension() [Some, &ref] | test.rs:40:14:40:38 | ... .unwrap() | provenance | MaD:18 | +| test.rs:41:14:41:17 | path | test.rs:41:14:41:32 | path.canonicalize() [Ok] | provenance | MaD:25 | +| test.rs:41:14:41:32 | path.canonicalize() [Ok] | test.rs:41:14:41:41 | ... .unwrap() | provenance | MaD:19 | | test.rs:44:13:44:21 | file_name | test.rs:45:14:45:22 | file_name | provenance | | | test.rs:44:13:44:21 | file_name | test.rs:46:14:46:22 | file_name | provenance | | | test.rs:44:13:44:21 | file_name | test.rs:47:14:47:22 | file_name | provenance | | @@ -98,16 +98,16 @@ edges | test.rs:44:13:44:21 | file_name | test.rs:49:14:49:22 | file_name | provenance | | | test.rs:44:13:44:21 | file_name | test.rs:50:14:50:22 | file_name | provenance | | | test.rs:44:25:44:37 | e.file_name() | test.rs:44:13:44:21 | file_name | provenance | Src:MaD:3 | -| test.rs:45:14:45:22 | file_name | test.rs:45:14:45:30 | file_name.clone() | provenance | MaD:18 | -| test.rs:46:14:46:22 | file_name | test.rs:46:14:46:30 | file_name.clone() | provenance | MaD:18 | -| test.rs:46:14:46:30 | file_name.clone() | test.rs:46:14:46:44 | ... .into_string() [Ok, String] | provenance | MaD:39 | -| test.rs:46:14:46:44 | ... .into_string() [Ok, String] | test.rs:46:14:46:53 | ... .unwrap() | provenance | MaD:37 | -| test.rs:47:14:47:22 | file_name | test.rs:47:14:47:31 | file_name.to_str() [Some, &ref] | provenance | MaD:38 | -| test.rs:47:14:47:31 | file_name.to_str() [Some, &ref] | test.rs:47:14:47:40 | ... .unwrap() | provenance | MaD:36 | -| test.rs:48:14:48:22 | file_name | test.rs:48:14:48:40 | file_name.to_string_lossy() [Owned] | provenance | MaD:38 | -| test.rs:48:14:48:40 | file_name.to_string_lossy() [Owned] | test.rs:48:14:48:49 | ... .to_mut() | provenance | MaD:35 | -| test.rs:49:14:49:22 | file_name | test.rs:49:14:49:30 | file_name.clone() | provenance | MaD:18 | -| test.rs:49:14:49:30 | file_name.clone() | test.rs:49:14:49:49 | ... .as_encoded_bytes() | provenance | MaD:38 | +| test.rs:45:14:45:22 | file_name | test.rs:45:14:45:30 | file_name.clone() | provenance | MaD:30 | +| test.rs:46:14:46:22 | file_name | test.rs:46:14:46:30 | file_name.clone() | provenance | MaD:30 | +| test.rs:46:14:46:30 | file_name.clone() | test.rs:46:14:46:44 | ... .into_string() [Ok, String] | provenance | MaD:21 | +| test.rs:46:14:46:44 | ... .into_string() [Ok, String] | test.rs:46:14:46:53 | ... .unwrap() | provenance | MaD:19 | +| test.rs:47:14:47:22 | file_name | test.rs:47:14:47:31 | file_name.to_str() [Some, &ref] | provenance | MaD:20 | +| test.rs:47:14:47:31 | file_name.to_str() [Some, &ref] | test.rs:47:14:47:40 | ... .unwrap() | provenance | MaD:18 | +| test.rs:48:14:48:22 | file_name | test.rs:48:14:48:40 | file_name.to_string_lossy() [Owned] | provenance | MaD:20 | +| test.rs:48:14:48:40 | file_name.to_string_lossy() [Owned] | test.rs:48:14:48:49 | ... .to_mut() | provenance | MaD:17 | +| test.rs:49:14:49:22 | file_name | test.rs:49:14:49:30 | file_name.clone() | provenance | MaD:30 | +| test.rs:49:14:49:30 | file_name.clone() | test.rs:49:14:49:49 | ... .as_encoded_bytes() | provenance | MaD:20 | | test.rs:68:13:68:18 | target | test.rs:69:14:69:19 | target | provenance | | | test.rs:68:22:68:49 | ...::read_link(...) | test.rs:68:22:68:49 | ...::read_link(...) [Ok] | provenance | Src:MaD:12 | | test.rs:68:22:68:49 | ...::read_link(...) [Ok] | test.rs:68:22:68:50 | TryExpr | provenance | | @@ -144,45 +144,45 @@ edges | test.rs:110:20:110:50 | ...::open(...) | test.rs:110:20:110:50 | ...::open(...) [Ok] | provenance | Src:MaD:5 | | test.rs:110:20:110:50 | ...::open(...) [Ok] | test.rs:110:20:110:51 | TryExpr | provenance | | | test.rs:110:20:110:51 | TryExpr | test.rs:110:9:110:16 | mut file | provenance | | -| test.rs:114:22:114:25 | file | test.rs:114:32:114:42 | [post] &mut buffer [&ref] | provenance | MaD:22 | +| test.rs:114:22:114:25 | file | test.rs:114:32:114:42 | [post] &mut buffer [&ref] | provenance | MaD:34 | | test.rs:114:32:114:42 | [post] &mut buffer [&ref] | test.rs:114:37:114:42 | [post] buffer | provenance | | | test.rs:114:37:114:42 | [post] buffer | test.rs:115:15:115:20 | buffer | provenance | | | test.rs:115:15:115:20 | buffer | test.rs:115:14:115:20 | &buffer | provenance | | -| test.rs:120:22:120:25 | file | test.rs:120:39:120:49 | [post] &mut buffer [&ref] | provenance | MaD:40 | +| test.rs:120:22:120:25 | file | test.rs:120:39:120:49 | [post] &mut buffer [&ref] | provenance | MaD:22 | | test.rs:120:39:120:49 | [post] &mut buffer [&ref] | test.rs:120:44:120:49 | [post] buffer | provenance | | | test.rs:120:44:120:49 | [post] buffer | test.rs:121:15:121:20 | buffer | provenance | | | test.rs:121:15:121:20 | buffer | test.rs:121:14:121:20 | &buffer | provenance | | -| test.rs:126:22:126:25 | file | test.rs:126:42:126:52 | [post] &mut buffer [&ref] | provenance | MaD:41 | +| test.rs:126:22:126:25 | file | test.rs:126:42:126:52 | [post] &mut buffer [&ref] | provenance | MaD:23 | | test.rs:126:42:126:52 | [post] &mut buffer [&ref] | test.rs:126:47:126:52 | [post] buffer | provenance | | | test.rs:126:47:126:52 | [post] buffer | test.rs:127:15:127:20 | buffer | provenance | | | test.rs:127:15:127:20 | buffer | test.rs:127:14:127:20 | &buffer | provenance | | -| test.rs:132:9:132:12 | file | test.rs:132:25:132:35 | [post] &mut buffer [&ref] | provenance | MaD:23 | +| test.rs:132:9:132:12 | file | test.rs:132:25:132:35 | [post] &mut buffer [&ref] | provenance | MaD:35 | | test.rs:132:25:132:35 | [post] &mut buffer [&ref] | test.rs:132:30:132:35 | [post] buffer | provenance | | | test.rs:132:30:132:35 | [post] buffer | test.rs:133:15:133:20 | buffer | provenance | | | test.rs:133:15:133:20 | buffer | test.rs:133:14:133:20 | &buffer | provenance | | -| test.rs:136:17:136:20 | file | test.rs:136:17:136:28 | file.bytes() | provenance | MaD:19 | +| test.rs:136:17:136:20 | file | test.rs:136:17:136:28 | file.bytes() | provenance | MaD:31 | | test.rs:136:17:136:28 | file.bytes() | test.rs:137:14:137:17 | byte | provenance | | | test.rs:143:13:143:18 | mut f1 | test.rs:145:22:145:23 | f1 | provenance | | | test.rs:143:22:143:63 | ... .open(...) | test.rs:143:22:143:63 | ... .open(...) [Ok] | provenance | Src:MaD:6 | -| test.rs:143:22:143:63 | ... .open(...) [Ok] | test.rs:143:22:143:72 | ... .unwrap() | provenance | MaD:37 | +| test.rs:143:22:143:63 | ... .open(...) [Ok] | test.rs:143:22:143:72 | ... .unwrap() | provenance | MaD:19 | | test.rs:143:22:143:72 | ... .unwrap() | test.rs:143:13:143:18 | mut f1 | provenance | | -| test.rs:145:22:145:23 | f1 | test.rs:145:30:145:40 | [post] &mut buffer [&ref] | provenance | MaD:22 | +| test.rs:145:22:145:23 | f1 | test.rs:145:30:145:40 | [post] &mut buffer [&ref] | provenance | MaD:34 | | test.rs:145:30:145:40 | [post] &mut buffer [&ref] | test.rs:145:35:145:40 | [post] buffer | provenance | | | test.rs:145:35:145:40 | [post] buffer | test.rs:146:15:146:20 | buffer | provenance | | | test.rs:146:15:146:20 | buffer | test.rs:146:14:146:20 | &buffer | provenance | | | test.rs:150:13:150:18 | mut f2 | test.rs:155:22:155:23 | f2 | provenance | | | test.rs:150:22:152:27 | ... .open(...) | test.rs:150:22:152:27 | ... .open(...) [Ok] | provenance | Src:MaD:6 | -| test.rs:150:22:152:27 | ... .open(...) [Ok] | test.rs:150:22:153:21 | ... .unwrap() | provenance | MaD:37 | +| test.rs:150:22:152:27 | ... .open(...) [Ok] | test.rs:150:22:153:21 | ... .unwrap() | provenance | MaD:19 | | test.rs:150:22:153:21 | ... .unwrap() | test.rs:150:13:150:18 | mut f2 | provenance | | -| test.rs:155:22:155:23 | f2 | test.rs:155:30:155:40 | [post] &mut buffer [&ref] | provenance | MaD:22 | +| test.rs:155:22:155:23 | f2 | test.rs:155:30:155:40 | [post] &mut buffer [&ref] | provenance | MaD:34 | | test.rs:155:30:155:40 | [post] &mut buffer [&ref] | test.rs:155:35:155:40 | [post] buffer | provenance | | | test.rs:155:35:155:40 | [post] buffer | test.rs:156:15:156:20 | buffer | provenance | | | test.rs:156:15:156:20 | buffer | test.rs:156:14:156:20 | &buffer | provenance | | | test.rs:160:13:160:18 | mut f3 | test.rs:168:22:168:23 | f3 | provenance | | | test.rs:160:22:165:27 | ... .open(...) | test.rs:160:22:165:27 | ... .open(...) [Ok] | provenance | Src:MaD:6 | -| test.rs:160:22:165:27 | ... .open(...) [Ok] | test.rs:160:22:166:21 | ... .unwrap() | provenance | MaD:37 | +| test.rs:160:22:165:27 | ... .open(...) [Ok] | test.rs:160:22:166:21 | ... .unwrap() | provenance | MaD:19 | | test.rs:160:22:166:21 | ... .unwrap() | test.rs:160:13:160:18 | mut f3 | provenance | | -| test.rs:168:22:168:23 | f3 | test.rs:168:30:168:40 | [post] &mut buffer [&ref] | provenance | MaD:22 | +| test.rs:168:22:168:23 | f3 | test.rs:168:30:168:40 | [post] &mut buffer [&ref] | provenance | MaD:34 | | test.rs:168:30:168:40 | [post] &mut buffer [&ref] | test.rs:168:35:168:40 | [post] buffer | provenance | | | test.rs:168:35:168:40 | [post] buffer | test.rs:169:15:169:20 | buffer | provenance | | | test.rs:169:15:169:20 | buffer | test.rs:169:14:169:20 | &buffer | provenance | | @@ -195,10 +195,10 @@ edges | test.rs:177:21:177:59 | ...::open(...) [Ok] | test.rs:177:21:177:60 | TryExpr | provenance | | | test.rs:177:21:177:60 | TryExpr | test.rs:177:13:177:17 | file2 | provenance | | | test.rs:178:13:178:22 | mut reader | test.rs:179:9:179:14 | reader | provenance | | -| test.rs:178:26:178:30 | file1 | test.rs:178:26:178:43 | file1.chain(...) | provenance | MaD:21 | +| test.rs:178:26:178:30 | file1 | test.rs:178:26:178:43 | file1.chain(...) | provenance | MaD:33 | | test.rs:178:26:178:43 | file1.chain(...) | test.rs:178:13:178:22 | mut reader | provenance | | -| test.rs:178:38:178:42 | file2 | test.rs:178:26:178:43 | file1.chain(...) | provenance | MaD:20 | -| test.rs:179:9:179:14 | reader | test.rs:179:31:179:41 | [post] &mut buffer [&ref] | provenance | MaD:24 | +| test.rs:178:38:178:42 | file2 | test.rs:178:26:178:43 | file1.chain(...) | provenance | MaD:32 | +| test.rs:179:9:179:14 | reader | test.rs:179:31:179:41 | [post] &mut buffer [&ref] | provenance | MaD:36 | | test.rs:179:31:179:41 | [post] &mut buffer [&ref] | test.rs:179:36:179:41 | [post] buffer | provenance | | | test.rs:179:36:179:41 | [post] buffer | test.rs:180:15:180:20 | buffer | provenance | | | test.rs:180:15:180:20 | buffer | test.rs:180:14:180:20 | &buffer | provenance | | @@ -207,9 +207,9 @@ edges | test.rs:185:21:185:51 | ...::open(...) [Ok] | test.rs:185:21:185:52 | TryExpr | provenance | | | test.rs:185:21:185:52 | TryExpr | test.rs:185:13:185:17 | file1 | provenance | | | test.rs:186:13:186:22 | mut reader | test.rs:187:9:187:14 | reader | provenance | | -| test.rs:186:26:186:30 | file1 | test.rs:186:26:186:40 | file1.take(...) | provenance | MaD:25 | +| test.rs:186:26:186:30 | file1 | test.rs:186:26:186:40 | file1.take(...) | provenance | MaD:37 | | test.rs:186:26:186:40 | file1.take(...) | test.rs:186:13:186:22 | mut reader | provenance | | -| test.rs:187:9:187:14 | reader | test.rs:187:31:187:41 | [post] &mut buffer [&ref] | provenance | MaD:24 | +| test.rs:187:9:187:14 | reader | test.rs:187:31:187:41 | [post] &mut buffer [&ref] | provenance | MaD:36 | | test.rs:187:31:187:41 | [post] &mut buffer [&ref] | test.rs:187:36:187:41 | [post] buffer | provenance | | | test.rs:187:36:187:41 | [post] buffer | test.rs:188:15:188:20 | buffer | provenance | | | test.rs:188:15:188:20 | buffer | test.rs:188:14:188:20 | &buffer | provenance | | @@ -226,43 +226,43 @@ edges | test.rs:197:20:197:52 | ...::open(...) [future, Ok] | test.rs:197:20:197:58 | await ... [Ok] | provenance | | | test.rs:197:20:197:58 | await ... [Ok] | test.rs:197:20:197:59 | TryExpr | provenance | | | test.rs:197:20:197:59 | TryExpr | test.rs:197:9:197:16 | mut file | provenance | | -| test.rs:201:22:201:25 | file | test.rs:201:32:201:42 | [post] &mut buffer [&ref] | provenance | MaD:26 | +| test.rs:201:22:201:25 | file | test.rs:201:32:201:42 | [post] &mut buffer [&ref] | provenance | MaD:38 | | test.rs:201:32:201:42 | [post] &mut buffer [&ref] | test.rs:201:37:201:42 | [post] buffer | provenance | | | test.rs:201:37:201:42 | [post] buffer | test.rs:202:15:202:20 | buffer | provenance | | | test.rs:202:15:202:20 | buffer | test.rs:202:14:202:20 | &buffer | provenance | | -| test.rs:207:22:207:25 | file | test.rs:207:39:207:49 | [post] &mut buffer [&ref] | provenance | MaD:32 | +| test.rs:207:22:207:25 | file | test.rs:207:39:207:49 | [post] &mut buffer [&ref] | provenance | MaD:44 | | test.rs:207:39:207:49 | [post] &mut buffer [&ref] | test.rs:207:44:207:49 | [post] buffer | provenance | | | test.rs:207:44:207:49 | [post] buffer | test.rs:208:15:208:20 | buffer | provenance | | | test.rs:208:15:208:20 | buffer | test.rs:208:14:208:20 | &buffer | provenance | | -| test.rs:213:22:213:25 | file | test.rs:213:42:213:52 | [post] &mut buffer [&ref] | provenance | MaD:33 | +| test.rs:213:22:213:25 | file | test.rs:213:42:213:52 | [post] &mut buffer [&ref] | provenance | MaD:45 | | test.rs:213:42:213:52 | [post] &mut buffer [&ref] | test.rs:213:47:213:52 | [post] buffer | provenance | | | test.rs:213:47:213:52 | [post] buffer | test.rs:214:15:214:20 | buffer | provenance | | | test.rs:214:15:214:20 | buffer | test.rs:214:14:214:20 | &buffer | provenance | | -| test.rs:219:9:219:12 | file | test.rs:219:25:219:35 | [post] &mut buffer [&ref] | provenance | MaD:28 | +| test.rs:219:9:219:12 | file | test.rs:219:25:219:35 | [post] &mut buffer [&ref] | provenance | MaD:40 | | test.rs:219:25:219:35 | [post] &mut buffer [&ref] | test.rs:219:30:219:35 | [post] buffer | provenance | | | test.rs:219:30:219:35 | [post] buffer | test.rs:220:15:220:20 | buffer | provenance | | | test.rs:220:15:220:20 | buffer | test.rs:220:14:220:20 | &buffer | provenance | | | test.rs:224:13:224:14 | v1 | test.rs:228:14:228:15 | v1 | provenance | | -| test.rs:224:18:224:21 | file | test.rs:224:18:224:31 | file.read_u8() [future, Ok] | provenance | MaD:34 | +| test.rs:224:18:224:21 | file | test.rs:224:18:224:31 | file.read_u8() [future, Ok] | provenance | MaD:46 | | test.rs:224:18:224:31 | file.read_u8() [future, Ok] | test.rs:224:18:224:37 | await ... [Ok] | provenance | | | test.rs:224:18:224:37 | await ... [Ok] | test.rs:224:18:224:38 | TryExpr | provenance | | | test.rs:224:18:224:38 | TryExpr | test.rs:224:13:224:14 | v1 | provenance | | | test.rs:225:13:225:14 | v2 | test.rs:229:14:229:15 | v2 | provenance | | -| test.rs:225:18:225:21 | file | test.rs:225:18:225:32 | file.read_i16() [future, Ok] | provenance | MaD:30 | +| test.rs:225:18:225:21 | file | test.rs:225:18:225:32 | file.read_i16() [future, Ok] | provenance | MaD:42 | | test.rs:225:18:225:32 | file.read_i16() [future, Ok] | test.rs:225:18:225:38 | await ... [Ok] | provenance | | | test.rs:225:18:225:38 | await ... [Ok] | test.rs:225:18:225:39 | TryExpr | provenance | | | test.rs:225:18:225:39 | TryExpr | test.rs:225:13:225:14 | v2 | provenance | | | test.rs:226:13:226:14 | v3 | test.rs:230:14:230:15 | v3 | provenance | | -| test.rs:226:18:226:21 | file | test.rs:226:18:226:32 | file.read_f32() [future, Ok] | provenance | MaD:29 | +| test.rs:226:18:226:21 | file | test.rs:226:18:226:32 | file.read_f32() [future, Ok] | provenance | MaD:41 | | test.rs:226:18:226:32 | file.read_f32() [future, Ok] | test.rs:226:18:226:38 | await ... [Ok] | provenance | | | test.rs:226:18:226:38 | await ... [Ok] | test.rs:226:18:226:39 | TryExpr | provenance | | | test.rs:226:18:226:39 | TryExpr | test.rs:226:13:226:14 | v3 | provenance | | | test.rs:227:13:227:14 | v4 | test.rs:231:14:231:15 | v4 | provenance | | -| test.rs:227:18:227:21 | file | test.rs:227:18:227:35 | file.read_i64_le() [future, Ok] | provenance | MaD:31 | +| test.rs:227:18:227:21 | file | test.rs:227:18:227:35 | file.read_i64_le() [future, Ok] | provenance | MaD:43 | | test.rs:227:18:227:35 | file.read_i64_le() [future, Ok] | test.rs:227:18:227:41 | await ... [Ok] | provenance | | | test.rs:227:18:227:41 | await ... [Ok] | test.rs:227:18:227:42 | TryExpr | provenance | | | test.rs:227:18:227:42 | TryExpr | test.rs:227:13:227:14 | v4 | provenance | | -| test.rs:236:9:236:12 | file | test.rs:236:23:236:33 | [post] &mut buffer [&ref] | provenance | MaD:27 | +| test.rs:236:9:236:12 | file | test.rs:236:23:236:33 | [post] &mut buffer [&ref] | provenance | MaD:39 | | test.rs:236:23:236:33 | [post] &mut buffer [&ref] | test.rs:236:28:236:33 | [post] buffer | provenance | | | test.rs:236:28:236:33 | [post] buffer | test.rs:237:15:237:20 | buffer | provenance | | | test.rs:237:15:237:20 | buffer | test.rs:237:14:237:20 | &buffer | provenance | | @@ -271,7 +271,7 @@ edges | test.rs:243:22:243:65 | ... .open(...) [future, Ok] | test.rs:243:22:243:71 | await ... [Ok] | provenance | | | test.rs:243:22:243:71 | await ... [Ok] | test.rs:243:22:243:72 | TryExpr | provenance | | | test.rs:243:22:243:72 | TryExpr | test.rs:243:13:243:18 | mut f1 | provenance | | -| test.rs:245:22:245:23 | f1 | test.rs:245:30:245:40 | [post] &mut buffer [&ref] | provenance | MaD:26 | +| test.rs:245:22:245:23 | f1 | test.rs:245:30:245:40 | [post] &mut buffer [&ref] | provenance | MaD:38 | | test.rs:245:30:245:40 | [post] &mut buffer [&ref] | test.rs:245:35:245:40 | [post] buffer | provenance | | | test.rs:245:35:245:40 | [post] buffer | test.rs:246:15:246:20 | buffer | provenance | | | test.rs:246:15:246:20 | buffer | test.rs:246:14:246:20 | &buffer | provenance | | @@ -280,7 +280,7 @@ edges | test.rs:274:20:274:56 | ...::open(...) [future, Ok] | test.rs:274:20:274:62 | await ... [Ok] | provenance | | | test.rs:274:20:274:62 | await ... [Ok] | test.rs:274:20:274:63 | TryExpr | provenance | | | test.rs:274:20:274:63 | TryExpr | test.rs:274:9:274:16 | mut file | provenance | | -| test.rs:278:22:278:25 | file | test.rs:278:32:278:42 | [post] &mut buffer [&ref] | provenance | MaD:17 | +| test.rs:278:22:278:25 | file | test.rs:278:32:278:42 | [post] &mut buffer [&ref] | provenance | MaD:29 | | test.rs:278:32:278:42 | [post] &mut buffer [&ref] | test.rs:278:37:278:42 | [post] buffer | provenance | | | test.rs:278:37:278:42 | [post] buffer | test.rs:279:15:279:20 | buffer | provenance | | | test.rs:279:15:279:20 | buffer | test.rs:279:14:279:20 | &buffer | provenance | | @@ -289,7 +289,7 @@ edges | test.rs:285:22:285:69 | ... .open(...) [future, Ok] | test.rs:285:22:285:75 | await ... [Ok] | provenance | | | test.rs:285:22:285:75 | await ... [Ok] | test.rs:285:22:285:76 | TryExpr | provenance | | | test.rs:285:22:285:76 | TryExpr | test.rs:285:13:285:18 | mut f1 | provenance | | -| test.rs:287:22:287:23 | f1 | test.rs:287:30:287:40 | [post] &mut buffer [&ref] | provenance | MaD:17 | +| test.rs:287:22:287:23 | f1 | test.rs:287:30:287:40 | [post] &mut buffer [&ref] | provenance | MaD:29 | | test.rs:287:30:287:40 | [post] &mut buffer [&ref] | test.rs:287:35:287:40 | [post] buffer | provenance | | | test.rs:287:35:287:40 | [post] buffer | test.rs:288:15:288:20 | buffer | provenance | | | test.rs:288:15:288:20 | buffer | test.rs:288:14:288:20 | &buffer | provenance | | diff --git a/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected index 8e44873ec860..cbe63e1acbdf 100644 --- a/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected @@ -7,72 +7,72 @@ models | 6 | Source: ::connect; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote | | 7 | Source: reqwest::blocking::get; ReturnValue.Field[core::result::Result::Ok(0)]; remote | | 8 | Source: reqwest::get; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote | -| 9 | Summary: <_ as core::ops::deref::Deref>::deref; Argument[self].Reference; ReturnValue.Reference; taint | -| 10 | Summary: <_ as core::ops::index::Index>::index; Argument[self].Reference.Element; ReturnValue.Reference; value | -| 11 | 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 | -| 12 | Summary: <_ as futures_io::if_std::AsyncRead>::poll_read; Argument[self].Reference; Argument[1].Reference; taint | -| 13 | Summary: <_ as futures_util::io::AsyncBufReadExt>::fill_buf; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 14 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_line; Argument[self].Reference; Argument[0].Reference; taint | -| 15 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_until; Argument[self].Reference; Argument[1].Reference; taint | -| 16 | Summary: <_ as futures_util::io::AsyncReadExt>::read; Argument[self].Reference; Argument[0].Reference; taint | -| 17 | Summary: <_ as futures_util::io::AsyncReadExt>::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | -| 18 | Summary: <_ as std::io::BufRead>::lines; Argument[self]; ReturnValue; taint | -| 19 | Summary: <_ as std::io::BufRead>::read_line; Argument[self].Reference; Argument[0].Reference; taint | -| 20 | Summary: <_ as std::io::Read>::read; Argument[self].Reference; Argument[0].Reference; taint | -| 21 | Summary: <_ as std::io::Read>::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | -| 22 | Summary: <_ as std::io::Read>::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | -| 23 | Summary: <_ as std::io::Read>::take; Argument[self]; ReturnValue; taint | -| 24 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read; Argument[self].Reference; Argument[0].Reference; taint | -| 25 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 26 | Summary: ::new; Argument[0].Reference; ReturnValue; value | -| 27 | Summary: ::new; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer]; value | -| 28 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 29 | Summary: ::connect; Argument[1]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 30 | Summary: ::new; Argument[0]; ReturnValue; taint | -| 31 | Summary: ::body; Argument[self].Reference.Field[http::response::Response::body]; ReturnValue.Reference; value | -| 32 | Summary: ::body_mut; Argument[self].Reference.Field[http::response::Response::body]; ReturnValue.Reference; value | -| 33 | Summary: ::into_body; Argument[self].Field[http::response::Response::body]; ReturnValue; value | -| 34 | Summary: ::bytes; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 35 | Summary: ::chunk; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | -| 36 | Summary: ::text; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 37 | Summary: ::bytes; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 38 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 39 | Summary: ::text_with_charset; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 40 | Summary: ::new; Argument[0]; ReturnValue; taint | -| 41 | Summary: ::try_clone; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 42 | Summary: ::peek; Argument[self].Reference; Argument[0].Reference; taint | -| 43 | Summary: ::try_read; Argument[self].Reference; Argument[0].Reference; taint | -| 44 | Summary: ::try_read_buf; Argument[self].Reference; Argument[0].Reference; taint | +| 9 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 10 | Summary: ::new; Argument[0].Reference; ReturnValue; value | +| 11 | Summary: ::new; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer]; value | +| 12 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 13 | Summary: ::connect; Argument[1]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 14 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 15 | Summary: ::body; Argument[self].Reference.Field[http::response::Response::body]; ReturnValue.Reference; value | +| 16 | Summary: ::body_mut; Argument[self].Reference.Field[http::response::Response::body]; ReturnValue.Reference; value | +| 17 | Summary: ::into_body; Argument[self].Field[http::response::Response::body]; ReturnValue; value | +| 18 | Summary: ::bytes; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 19 | Summary: ::chunk; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | +| 20 | Summary: ::text; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 21 | Summary: ::bytes; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 22 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 23 | Summary: ::text_with_charset; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 24 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 25 | Summary: ::try_clone; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 26 | Summary: ::peek; Argument[self].Reference; Argument[0].Reference; taint | +| 27 | Summary: ::try_read; Argument[self].Reference; Argument[0].Reference; taint | +| 28 | Summary: ::try_read_buf; Argument[self].Reference; Argument[0].Reference; taint | +| 29 | Summary: core::ops::deref::Deref::deref; Argument[self].Reference; ReturnValue.Reference; taint | +| 30 | Summary: core::ops::index::Index::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 31 | Summary: 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 | +| 32 | Summary: futures_io::if_std::AsyncRead::poll_read; Argument[self].Reference; Argument[1].Reference; taint | +| 33 | Summary: futures_util::io::AsyncBufReadExt::fill_buf; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 34 | Summary: futures_util::io::AsyncBufReadExt::read_line; Argument[self].Reference; Argument[0].Reference; taint | +| 35 | Summary: futures_util::io::AsyncBufReadExt::read_until; Argument[self].Reference; Argument[1].Reference; taint | +| 36 | Summary: futures_util::io::AsyncReadExt::read; Argument[self].Reference; Argument[0].Reference; taint | +| 37 | Summary: futures_util::io::AsyncReadExt::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | +| 38 | Summary: std::io::BufRead::lines; Argument[self]; ReturnValue; taint | +| 39 | Summary: std::io::BufRead::read_line; Argument[self].Reference; Argument[0].Reference; taint | +| 40 | Summary: std::io::Read::read; Argument[self].Reference; Argument[0].Reference; taint | +| 41 | Summary: std::io::Read::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | +| 42 | Summary: std::io::Read::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | +| 43 | Summary: std::io::Read::take; Argument[self]; ReturnValue; taint | +| 44 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read; Argument[self].Reference; Argument[0].Reference; taint | edges | test.rs:11:9:11:22 | remote_string1 | test.rs:12:10:12:23 | remote_string1 | provenance | | | test.rs:11:26:11:62 | ...::get(...) | test.rs:11:26:11:62 | ...::get(...) [Ok] | provenance | Src:MaD:7 | | test.rs:11:26:11:62 | ...::get(...) [Ok] | test.rs:11:26:11:63 | TryExpr | provenance | | -| test.rs:11:26:11:63 | TryExpr | test.rs:11:26:11:70 | ... .text() [Ok] | provenance | MaD:38 | +| test.rs:11:26:11:63 | TryExpr | test.rs:11:26:11:70 | ... .text() [Ok] | provenance | MaD:22 | | test.rs:11:26:11:70 | ... .text() [Ok] | test.rs:11:26:11:71 | TryExpr | provenance | | | test.rs:11:26:11:71 | TryExpr | test.rs:11:9:11:22 | remote_string1 | provenance | | | test.rs:14:9:14:22 | remote_string2 | test.rs:15:10:15:23 | remote_string2 | provenance | | | test.rs:14:26:14:62 | ...::get(...) | test.rs:14:26:14:62 | ...::get(...) [Ok] | provenance | Src:MaD:7 | -| test.rs:14:26:14:62 | ...::get(...) [Ok] | test.rs:14:26:14:71 | ... .unwrap() | provenance | MaD:28 | -| test.rs:14:26:14:71 | ... .unwrap() | test.rs:14:26:14:78 | ... .text() [Ok] | provenance | MaD:38 | -| test.rs:14:26:14:78 | ... .text() [Ok] | test.rs:14:26:14:87 | ... .unwrap() | provenance | MaD:28 | +| test.rs:14:26:14:62 | ...::get(...) [Ok] | test.rs:14:26:14:71 | ... .unwrap() | provenance | MaD:12 | +| test.rs:14:26:14:71 | ... .unwrap() | test.rs:14:26:14:78 | ... .text() [Ok] | provenance | MaD:22 | +| test.rs:14:26:14:78 | ... .text() [Ok] | test.rs:14:26:14:87 | ... .unwrap() | provenance | MaD:12 | | test.rs:14:26:14:87 | ... .unwrap() | test.rs:14:9:14:22 | remote_string2 | provenance | | | test.rs:17:9:17:22 | remote_string3 | test.rs:18:10:18:23 | remote_string3 | provenance | | | test.rs:17:26:17:62 | ...::get(...) | test.rs:17:26:17:62 | ...::get(...) [Ok] | provenance | Src:MaD:7 | -| test.rs:17:26:17:62 | ...::get(...) [Ok] | test.rs:17:26:17:71 | ... .unwrap() | provenance | MaD:28 | -| test.rs:17:26:17:71 | ... .unwrap() | test.rs:17:26:17:98 | ... .text_with_charset(...) [Ok] | provenance | MaD:39 | -| test.rs:17:26:17:98 | ... .text_with_charset(...) [Ok] | test.rs:17:26:17:107 | ... .unwrap() | provenance | MaD:28 | +| test.rs:17:26:17:62 | ...::get(...) [Ok] | test.rs:17:26:17:71 | ... .unwrap() | provenance | MaD:12 | +| test.rs:17:26:17:71 | ... .unwrap() | test.rs:17:26:17:98 | ... .text_with_charset(...) [Ok] | provenance | MaD:23 | +| test.rs:17:26:17:98 | ... .text_with_charset(...) [Ok] | test.rs:17:26:17:107 | ... .unwrap() | provenance | MaD:12 | | test.rs:17:26:17:107 | ... .unwrap() | test.rs:17:9:17:22 | remote_string3 | provenance | | | test.rs:20:9:20:22 | remote_string4 | test.rs:21:10:21:23 | remote_string4 | provenance | | | test.rs:20:26:20:62 | ...::get(...) | test.rs:20:26:20:62 | ...::get(...) [Ok] | provenance | Src:MaD:7 | -| test.rs:20:26:20:62 | ...::get(...) [Ok] | test.rs:20:26:20:71 | ... .unwrap() | provenance | MaD:28 | -| test.rs:20:26:20:71 | ... .unwrap() | test.rs:20:26:20:79 | ... .bytes() [Ok] | provenance | MaD:37 | -| test.rs:20:26:20:79 | ... .bytes() [Ok] | test.rs:20:26:20:88 | ... .unwrap() | provenance | MaD:28 | +| test.rs:20:26:20:62 | ...::get(...) [Ok] | test.rs:20:26:20:71 | ... .unwrap() | provenance | MaD:12 | +| test.rs:20:26:20:71 | ... .unwrap() | test.rs:20:26:20:79 | ... .bytes() [Ok] | provenance | MaD:21 | +| test.rs:20:26:20:79 | ... .bytes() [Ok] | test.rs:20:26:20:88 | ... .unwrap() | provenance | MaD:12 | | test.rs:20:26:20:88 | ... .unwrap() | test.rs:20:9:20:22 | remote_string4 | provenance | | | test.rs:23:9:23:22 | remote_string5 | test.rs:24:10:24:23 | remote_string5 | provenance | | | test.rs:23:26:23:52 | ...::get(...) | test.rs:23:26:23:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:8 | | test.rs:23:26:23:52 | ...::get(...) [future, Ok] | test.rs:23:26:23:58 | await ... [Ok] | provenance | | | test.rs:23:26:23:58 | await ... [Ok] | test.rs:23:26:23:59 | TryExpr | provenance | | -| test.rs:23:26:23:59 | TryExpr | test.rs:23:26:23:66 | ... .text() [future, Ok] | provenance | MaD:36 | +| test.rs:23:26:23:59 | TryExpr | test.rs:23:26:23:66 | ... .text() [future, Ok] | provenance | MaD:20 | | test.rs:23:26:23:66 | ... .text() [future, Ok] | test.rs:23:26:23:72 | await ... [Ok] | provenance | | | test.rs:23:26:23:72 | await ... [Ok] | test.rs:23:26:23:73 | TryExpr | provenance | | | test.rs:23:26:23:73 | TryExpr | test.rs:23:9:23:22 | remote_string5 | provenance | | @@ -80,7 +80,7 @@ edges | test.rs:26:26:26:52 | ...::get(...) | test.rs:26:26:26:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:8 | | test.rs:26:26:26:52 | ...::get(...) [future, Ok] | test.rs:26:26:26:58 | await ... [Ok] | provenance | | | test.rs:26:26:26:58 | await ... [Ok] | test.rs:26:26:26:59 | TryExpr | provenance | | -| test.rs:26:26:26:59 | TryExpr | test.rs:26:26:26:67 | ... .bytes() [future, Ok] | provenance | MaD:34 | +| test.rs:26:26:26:59 | TryExpr | test.rs:26:26:26:67 | ... .bytes() [future, Ok] | provenance | MaD:18 | | test.rs:26:26:26:67 | ... .bytes() [future, Ok] | test.rs:26:26:26:73 | await ... [Ok] | provenance | | | test.rs:26:26:26:73 | await ... [Ok] | test.rs:26:26:26:74 | TryExpr | provenance | | | test.rs:26:26:26:74 | TryExpr | test.rs:26:9:26:22 | remote_string6 | provenance | | @@ -90,13 +90,13 @@ edges | test.rs:29:24:29:50 | ...::get(...) [future, Ok] | test.rs:29:24:29:56 | await ... [Ok] | provenance | | | test.rs:29:24:29:56 | await ... [Ok] | test.rs:29:24:29:57 | TryExpr | provenance | | | test.rs:29:24:29:57 | TryExpr | test.rs:29:9:29:20 | mut request1 | provenance | | -| test.rs:30:10:30:17 | request1 | test.rs:30:10:30:25 | request1.chunk() [future, Ok, Some] | provenance | MaD:35 | +| test.rs:30:10:30:17 | request1 | test.rs:30:10:30:25 | request1.chunk() [future, Ok, Some] | provenance | MaD:19 | | test.rs:30:10:30:25 | request1.chunk() [future, Ok, Some] | test.rs:30:10:30:31 | await ... [Ok, Some] | provenance | | | test.rs:30:10:30:31 | await ... [Ok, Some] | test.rs:30:10:30:32 | TryExpr [Some] | provenance | | -| test.rs:30:10:30:32 | TryExpr [Some] | test.rs:30:10:30:41 | ... .unwrap() | provenance | MaD:25 | +| test.rs:30:10:30:32 | TryExpr [Some] | test.rs:30:10:30:41 | ... .unwrap() | provenance | MaD:9 | | test.rs:31:15:31:25 | Some(...) [Some] | test.rs:31:20:31:24 | chunk | provenance | | | test.rs:31:20:31:24 | chunk | test.rs:32:14:32:18 | chunk | provenance | | -| test.rs:31:29:31:36 | request1 | test.rs:31:29:31:44 | request1.chunk() [future, Ok, Some] | provenance | MaD:35 | +| test.rs:31:29:31:36 | request1 | test.rs:31:29:31:44 | request1.chunk() [future, Ok, Some] | provenance | MaD:19 | | test.rs:31:29:31:44 | request1.chunk() [future, Ok, Some] | test.rs:31:29:31:50 | await ... [Ok, Some] | provenance | | | test.rs:31:29:31:50 | await ... [Ok, Some] | test.rs:31:29:31:51 | TryExpr [Some] | provenance | | | test.rs:31:29:31:51 | TryExpr [Some] | test.rs:31:15:31:25 | Some(...) [Some] | provenance | | @@ -116,42 +116,42 @@ edges | test.rs:67:24:67:57 | await ... [Ok] | test.rs:67:24:67:58 | TryExpr | provenance | | | test.rs:67:24:67:58 | TryExpr | test.rs:67:9:67:20 | mut response | provenance | | | test.rs:68:11:68:18 | response | test.rs:68:10:68:18 | &response | provenance | | -| test.rs:76:18:76:25 | response | test.rs:76:18:76:32 | response.body() | provenance | MaD:31 | -| test.rs:77:18:77:25 | response | test.rs:77:18:77:36 | response.body_mut() | provenance | MaD:32 | +| test.rs:76:18:76:25 | response | test.rs:76:18:76:32 | response.body() | provenance | MaD:15 | +| test.rs:77:18:77:25 | response | test.rs:77:18:77:36 | response.body_mut() | provenance | MaD:16 | | test.rs:79:17:79:20 | body | test.rs:80:19:80:22 | body | provenance | | -| test.rs:79:24:79:31 | response | test.rs:79:24:79:43 | response.into_body() | provenance | MaD:33 | +| test.rs:79:24:79:31 | response | test.rs:79:24:79:43 | response.into_body() | provenance | MaD:17 | | test.rs:79:24:79:43 | response.into_body() | test.rs:79:17:79:20 | body | provenance | | | test.rs:80:19:80:22 | body | test.rs:80:18:80:22 | &body | provenance | | | test.rs:155:13:155:22 | mut stream | test.rs:162:17:162:22 | stream | provenance | | | test.rs:155:26:155:62 | ...::connect(...) | test.rs:155:26:155:62 | ...::connect(...) [Ok] | provenance | Src:MaD:4 | | test.rs:155:26:155:62 | ...::connect(...) [Ok] | test.rs:155:26:155:63 | TryExpr | provenance | | | test.rs:155:26:155:63 | TryExpr | test.rs:155:13:155:22 | mut stream | provenance | | -| test.rs:162:17:162:22 | stream | test.rs:162:29:162:39 | [post] &mut buffer [&ref] | provenance | MaD:20 | +| test.rs:162:17:162:22 | stream | test.rs:162:29:162:39 | [post] &mut buffer [&ref] | provenance | MaD:40 | | test.rs:162:29:162:39 | [post] &mut buffer [&ref] | test.rs:162:34:162:39 | [post] buffer | provenance | | | test.rs:162:34:162:39 | [post] buffer | test.rs:165:15:165:20 | buffer | provenance | | | test.rs:162:34:162:39 | [post] buffer | test.rs:166:14:166:19 | buffer | provenance | | | test.rs:165:15:165:20 | buffer | test.rs:165:14:165:20 | &buffer | provenance | | -| test.rs:166:14:166:19 | buffer | test.rs:166:14:166:22 | buffer[0] | provenance | MaD:10 | +| test.rs:166:14:166:19 | buffer | test.rs:166:14:166:22 | buffer[0] | provenance | MaD:30 | | test.rs:174:13:174:22 | mut stream | test.rs:182:58:182:63 | stream | provenance | | | test.rs:174:13:174:22 | mut stream | test.rs:203:54:203:59 | stream | provenance | | | test.rs:174:26:174:105 | ...::connect_timeout(...) | test.rs:174:26:174:105 | ...::connect_timeout(...) [Ok] | provenance | Src:MaD:5 | | test.rs:174:26:174:105 | ...::connect_timeout(...) [Ok] | test.rs:174:26:174:106 | TryExpr | provenance | | | test.rs:174:26:174:106 | TryExpr | test.rs:174:13:174:22 | mut stream | provenance | | | test.rs:182:21:182:30 | mut reader | test.rs:185:27:185:32 | reader | provenance | | -| test.rs:182:34:182:64 | ...::new(...) | test.rs:182:34:182:74 | ... .take(...) | provenance | MaD:23 | +| test.rs:182:34:182:64 | ...::new(...) | test.rs:182:34:182:74 | ... .take(...) | provenance | MaD:43 | | test.rs:182:34:182:74 | ... .take(...) | test.rs:182:21:182:30 | mut reader | provenance | | -| test.rs:182:58:182:63 | stream | test.rs:182:34:182:64 | ...::new(...) | provenance | MaD:40 | -| test.rs:185:27:185:32 | reader | test.rs:185:44:185:52 | [post] &mut line [&ref] | provenance | MaD:19 | +| test.rs:182:58:182:63 | stream | test.rs:182:34:182:64 | ...::new(...) | provenance | MaD:24 | +| test.rs:185:27:185:32 | reader | test.rs:185:44:185:52 | [post] &mut line [&ref] | provenance | MaD:39 | | test.rs:185:44:185:52 | [post] &mut line [&ref] | test.rs:185:49:185:52 | [post] line | provenance | | | test.rs:185:49:185:52 | [post] line | test.rs:192:35:192:38 | line | provenance | | | test.rs:192:35:192:38 | line | test.rs:192:34:192:38 | &line | provenance | | | test.rs:203:21:203:26 | reader | test.rs:204:29:204:34 | reader | provenance | | -| test.rs:203:30:203:73 | ...::new(...) | test.rs:203:30:203:83 | ... .take(...) | provenance | MaD:23 | +| test.rs:203:30:203:73 | ...::new(...) | test.rs:203:30:203:83 | ... .take(...) | provenance | MaD:43 | | test.rs:203:30:203:83 | ... .take(...) | test.rs:203:21:203:26 | reader | provenance | | -| test.rs:203:54:203:59 | stream | test.rs:203:54:203:71 | stream.try_clone() [Ok] | provenance | MaD:41 | +| test.rs:203:54:203:59 | stream | test.rs:203:54:203:71 | stream.try_clone() [Ok] | provenance | MaD:25 | | test.rs:203:54:203:71 | stream.try_clone() [Ok] | test.rs:203:54:203:72 | TryExpr | provenance | | -| test.rs:203:54:203:72 | TryExpr | test.rs:203:30:203:73 | ...::new(...) | provenance | MaD:40 | -| test.rs:204:29:204:34 | reader | test.rs:204:29:204:42 | reader.lines() | provenance | MaD:18 | +| test.rs:203:54:203:72 | TryExpr | test.rs:203:30:203:73 | ...::new(...) | provenance | MaD:24 | +| test.rs:204:29:204:34 | reader | test.rs:204:29:204:42 | reader.lines() | provenance | MaD:38 | | test.rs:204:29:204:42 | reader.lines() | test.rs:205:28:205:37 | Ok(...) | provenance | | | test.rs:205:28:205:37 | Ok(...) | test.rs:207:30:207:35 | string | provenance | | | test.rs:224:9:224:24 | mut tokio_stream | test.rs:232:17:232:28 | tokio_stream | provenance | | @@ -162,46 +162,46 @@ edges | test.rs:224:28:224:66 | ...::connect(...) [future, Ok] | test.rs:224:28:224:72 | await ... [Ok] | provenance | | | test.rs:224:28:224:72 | await ... [Ok] | test.rs:224:28:224:73 | TryExpr | provenance | | | test.rs:224:28:224:73 | TryExpr | test.rs:224:9:224:24 | mut tokio_stream | provenance | | -| test.rs:232:17:232:28 | tokio_stream | test.rs:232:35:232:46 | [post] &mut buffer1 [&ref] | provenance | MaD:42 | +| test.rs:232:17:232:28 | tokio_stream | test.rs:232:35:232:46 | [post] &mut buffer1 [&ref] | provenance | MaD:26 | | test.rs:232:35:232:46 | [post] &mut buffer1 [&ref] | test.rs:232:40:232:46 | [post] buffer1 | provenance | | | test.rs:232:40:232:46 | [post] buffer1 | test.rs:239:15:239:21 | buffer1 | provenance | | | test.rs:232:40:232:46 | [post] buffer1 | test.rs:240:14:240:20 | buffer1 | provenance | | -| test.rs:236:18:236:29 | tokio_stream | test.rs:236:36:236:47 | [post] &mut buffer2 [&ref] | provenance | MaD:24 | +| test.rs:236:18:236:29 | tokio_stream | test.rs:236:36:236:47 | [post] &mut buffer2 [&ref] | provenance | MaD:44 | | test.rs:236:36:236:47 | [post] &mut buffer2 [&ref] | test.rs:236:41:236:47 | [post] buffer2 | provenance | | | test.rs:236:41:236:47 | [post] buffer2 | test.rs:243:15:243:21 | buffer2 | provenance | | | test.rs:236:41:236:47 | [post] buffer2 | test.rs:244:14:244:20 | buffer2 | provenance | | | test.rs:239:15:239:21 | buffer1 | test.rs:239:14:239:21 | &buffer1 | provenance | | -| test.rs:240:14:240:20 | buffer1 | test.rs:240:14:240:23 | buffer1[0] | provenance | MaD:10 | +| test.rs:240:14:240:20 | buffer1 | test.rs:240:14:240:23 | buffer1[0] | provenance | MaD:30 | | test.rs:243:15:243:21 | buffer2 | test.rs:243:14:243:21 | &buffer2 | provenance | | -| test.rs:244:14:244:20 | buffer2 | test.rs:244:14:244:23 | buffer2[0] | provenance | MaD:10 | -| test.rs:252:19:252:30 | tokio_stream | test.rs:252:41:252:51 | [post] &mut buffer [&ref] | provenance | MaD:43 | +| test.rs:244:14:244:20 | buffer2 | test.rs:244:14:244:23 | buffer2[0] | provenance | MaD:30 | +| test.rs:252:19:252:30 | tokio_stream | test.rs:252:41:252:51 | [post] &mut buffer [&ref] | provenance | MaD:27 | | test.rs:252:41:252:51 | [post] &mut buffer [&ref] | test.rs:252:46:252:51 | [post] buffer | provenance | | | test.rs:252:46:252:51 | [post] buffer | test.rs:259:27:259:32 | buffer | provenance | | | test.rs:259:27:259:32 | buffer | test.rs:259:26:259:32 | &buffer | provenance | | -| test.rs:275:19:275:30 | tokio_stream | test.rs:275:45:275:55 | [post] &mut buffer [&ref] | provenance | MaD:44 | +| test.rs:275:19:275:30 | tokio_stream | test.rs:275:45:275:55 | [post] &mut buffer [&ref] | provenance | MaD:28 | | test.rs:275:45:275:55 | [post] &mut buffer [&ref] | test.rs:275:50:275:55 | [post] buffer | provenance | | | test.rs:275:50:275:55 | [post] buffer | test.rs:282:27:282:32 | buffer | provenance | | | test.rs:282:27:282:32 | buffer | test.rs:282:26:282:32 | &buffer | provenance | | | test.rs:332:9:332:18 | mut client | test.rs:333:22:333:27 | client | provenance | | | test.rs:332:22:332:75 | ...::new(...) | test.rs:332:22:332:75 | ...::new(...) [Ok] | provenance | Src:MaD:3 | -| test.rs:332:22:332:75 | ...::new(...) [Ok] | test.rs:332:22:332:84 | ... .unwrap() | provenance | MaD:28 | +| test.rs:332:22:332:75 | ...::new(...) [Ok] | test.rs:332:22:332:84 | ... .unwrap() | provenance | MaD:12 | | test.rs:332:22:332:84 | ... .unwrap() | test.rs:332:9:332:18 | mut client | provenance | | | test.rs:333:9:333:18 | mut reader | test.rs:334:11:334:16 | reader | provenance | | | test.rs:333:9:333:18 | mut reader | test.rs:338:22:338:27 | reader | provenance | | | test.rs:333:9:333:18 | mut reader | test.rs:344:22:344:27 | reader | provenance | | | test.rs:333:9:333:18 | mut reader | test.rs:350:22:350:27 | reader | provenance | | -| test.rs:333:22:333:27 | client | test.rs:333:22:333:36 | client.reader() | provenance | MaD:9 | +| test.rs:333:22:333:27 | client | test.rs:333:22:333:36 | client.reader() | provenance | MaD:29 | | test.rs:333:22:333:36 | client.reader() | test.rs:333:9:333:18 | mut reader | provenance | | | test.rs:334:11:334:16 | reader | test.rs:334:10:334:16 | &reader | provenance | | -| test.rs:338:22:338:27 | reader | test.rs:338:34:338:44 | [post] &mut buffer [&ref] | provenance | MaD:20 | +| test.rs:338:22:338:27 | reader | test.rs:338:34:338:44 | [post] &mut buffer [&ref] | provenance | MaD:40 | | test.rs:338:34:338:44 | [post] &mut buffer [&ref] | test.rs:338:39:338:44 | [post] buffer | provenance | | | test.rs:338:39:338:44 | [post] buffer | test.rs:339:15:339:20 | buffer | provenance | | | test.rs:339:15:339:20 | buffer | test.rs:339:14:339:20 | &buffer | provenance | | -| test.rs:344:22:344:27 | reader | test.rs:344:41:344:51 | [post] &mut buffer [&ref] | provenance | MaD:21 | +| test.rs:344:22:344:27 | reader | test.rs:344:41:344:51 | [post] &mut buffer [&ref] | provenance | MaD:41 | | test.rs:344:41:344:51 | [post] &mut buffer [&ref] | test.rs:344:46:344:51 | [post] buffer | provenance | | | test.rs:344:46:344:51 | [post] buffer | test.rs:345:15:345:20 | buffer | provenance | | | test.rs:345:15:345:20 | buffer | test.rs:345:14:345:20 | &buffer | provenance | | -| test.rs:350:22:350:27 | reader | test.rs:350:44:350:54 | [post] &mut buffer [&ref] | provenance | MaD:22 | +| test.rs:350:22:350:27 | reader | test.rs:350:44:350:54 | [post] &mut buffer [&ref] | provenance | MaD:42 | | test.rs:350:44:350:54 | [post] &mut buffer [&ref] | test.rs:350:49:350:54 | [post] buffer | provenance | | | test.rs:350:49:350:54 | [post] buffer | test.rs:351:15:351:20 | buffer | provenance | | | test.rs:351:15:351:20 | buffer | test.rs:351:14:351:20 | &buffer | provenance | | @@ -220,38 +220,38 @@ edges | test.rs:380:26:380:60 | connector.connect(...) [future, Ok] | test.rs:380:26:380:66 | await ... [Ok] | provenance | | | test.rs:380:26:380:66 | await ... [Ok] | test.rs:380:26:380:67 | TryExpr | provenance | | | test.rs:380:26:380:67 | TryExpr | test.rs:380:13:380:22 | mut reader | provenance | | -| test.rs:380:57:380:59 | tcp | test.rs:380:26:380:60 | connector.connect(...) [future, Ok] | provenance | MaD:29 | +| test.rs:380:57:380:59 | tcp | test.rs:380:26:380:60 | connector.connect(...) [future, Ok] | provenance | MaD:13 | | test.rs:381:15:381:20 | reader | test.rs:381:14:381:20 | &reader | provenance | | | test.rs:386:17:386:26 | mut pinned | test.rs:387:19:387:24 | pinned | provenance | | | test.rs:386:17:386:26 | mut pinned | test.rs:389:30:389:35 | pinned | provenance | | | test.rs:386:17:386:26 | mut pinned [Pin, &ref] | test.rs:387:19:387:24 | pinned [Pin, &ref] | provenance | | | test.rs:386:30:386:50 | ...::new(...) | test.rs:386:17:386:26 | mut pinned | provenance | | | test.rs:386:30:386:50 | ...::new(...) [Pin, &ref] | test.rs:386:17:386:26 | mut pinned [Pin, &ref] | provenance | | -| test.rs:386:39:386:49 | &mut reader [&ref] | test.rs:386:30:386:50 | ...::new(...) | provenance | MaD:26 | -| test.rs:386:39:386:49 | &mut reader [&ref] | test.rs:386:30:386:50 | ...::new(...) [Pin, &ref] | provenance | MaD:27 | +| test.rs:386:39:386:49 | &mut reader [&ref] | test.rs:386:30:386:50 | ...::new(...) | provenance | MaD:10 | +| test.rs:386:39:386:49 | &mut reader [&ref] | test.rs:386:30:386:50 | ...::new(...) [Pin, &ref] | provenance | MaD:11 | | test.rs:386:44:386:49 | reader | test.rs:386:39:386:49 | &mut reader [&ref] | provenance | | | test.rs:387:19:387:24 | pinned | test.rs:387:18:387:24 | &pinned | provenance | | | test.rs:387:19:387:24 | pinned [Pin, &ref] | test.rs:387:18:387:24 | &pinned | provenance | | -| test.rs:389:30:389:35 | pinned | test.rs:389:56:389:66 | [post] &mut buffer [&ref] | provenance | MaD:12 | +| test.rs:389:30:389:35 | pinned | test.rs:389:56:389:66 | [post] &mut buffer [&ref] | provenance | MaD:32 | | test.rs:389:56:389:66 | [post] &mut buffer [&ref] | test.rs:389:61:389:66 | [post] buffer | provenance | | | test.rs:389:61:389:66 | [post] buffer | test.rs:391:23:391:28 | buffer | provenance | | | test.rs:389:61:389:66 | [post] buffer | test.rs:392:23:392:28 | buffer | provenance | | | test.rs:389:61:389:66 | [post] buffer | test.rs:392:23:392:33 | buffer[...] | provenance | | | test.rs:391:23:391:28 | buffer | test.rs:391:22:391:28 | &buffer | provenance | | -| test.rs:392:23:392:28 | buffer | test.rs:392:23:392:33 | buffer[...] | provenance | MaD:10 | +| test.rs:392:23:392:28 | buffer | test.rs:392:23:392:33 | buffer[...] | provenance | MaD:30 | | test.rs:392:23:392:33 | buffer[...] | test.rs:392:22:392:33 | &... | provenance | | -| test.rs:399:63:399:73 | &mut reader [&ref] | test.rs:399:76:399:87 | [post] &mut buffer1 [&ref] | provenance | MaD:16 | +| test.rs:399:63:399:73 | &mut reader [&ref] | test.rs:399:76:399:87 | [post] &mut buffer1 [&ref] | provenance | MaD:36 | | test.rs:399:68:399:73 | reader | test.rs:399:63:399:73 | &mut reader [&ref] | provenance | | | test.rs:399:76:399:87 | [post] &mut buffer1 [&ref] | test.rs:399:81:399:87 | [post] buffer1 | provenance | | | test.rs:399:81:399:87 | [post] buffer1 | test.rs:400:19:400:25 | buffer1 | provenance | | | test.rs:399:81:399:87 | [post] buffer1 | test.rs:400:19:400:40 | buffer1[...] | provenance | | -| test.rs:400:19:400:25 | buffer1 | test.rs:400:19:400:40 | buffer1[...] | provenance | MaD:10 | +| test.rs:400:19:400:25 | buffer1 | test.rs:400:19:400:40 | buffer1[...] | provenance | MaD:30 | | test.rs:400:19:400:40 | buffer1[...] | test.rs:400:18:400:40 | &... | provenance | | -| test.rs:403:31:403:36 | reader | test.rs:403:43:403:54 | [post] &mut buffer2 [&ref] | provenance | MaD:16 | +| test.rs:403:31:403:36 | reader | test.rs:403:43:403:54 | [post] &mut buffer2 [&ref] | provenance | MaD:36 | | test.rs:403:43:403:54 | [post] &mut buffer2 [&ref] | test.rs:403:48:403:54 | [post] buffer2 | provenance | | | test.rs:403:48:403:54 | [post] buffer2 | test.rs:405:19:405:25 | buffer2 | provenance | | | test.rs:403:48:403:54 | [post] buffer2 | test.rs:405:19:405:40 | buffer2[...] | provenance | | -| test.rs:405:19:405:25 | buffer2 | test.rs:405:19:405:40 | buffer2[...] | provenance | MaD:10 | +| test.rs:405:19:405:25 | buffer2 | test.rs:405:19:405:40 | buffer2[...] | provenance | MaD:30 | | test.rs:405:19:405:40 | buffer2[...] | test.rs:405:18:405:40 | &... | provenance | | | test.rs:408:13:408:23 | mut reader2 | test.rs:409:15:409:21 | reader2 | provenance | | | test.rs:408:13:408:23 | mut reader2 | test.rs:413:44:413:50 | reader2 | provenance | | @@ -266,30 +266,30 @@ edges | test.rs:408:13:408:23 | mut reader2 | test.rs:493:31:493:37 | reader2 | provenance | | | test.rs:408:13:408:23 | mut reader2 | test.rs:500:31:500:37 | reader2 | provenance | | | test.rs:408:27:408:61 | ...::new(...) | test.rs:408:13:408:23 | mut reader2 | provenance | | -| test.rs:408:55:408:60 | reader | test.rs:408:27:408:61 | ...::new(...) | provenance | MaD:30 | +| test.rs:408:55:408:60 | reader | test.rs:408:27:408:61 | ...::new(...) | provenance | MaD:14 | | test.rs:409:15:409:21 | reader2 | test.rs:409:14:409:21 | &reader2 | provenance | | | test.rs:413:17:413:26 | mut pinned | test.rs:414:19:414:24 | pinned | provenance | | | test.rs:413:17:413:26 | mut pinned | test.rs:416:26:416:31 | pinned | provenance | | | test.rs:413:17:413:26 | mut pinned [Pin, &ref] | test.rs:414:19:414:24 | pinned [Pin, &ref] | provenance | | | test.rs:413:30:413:51 | ...::new(...) | test.rs:413:17:413:26 | mut pinned | provenance | | | test.rs:413:30:413:51 | ...::new(...) [Pin, &ref] | test.rs:413:17:413:26 | mut pinned [Pin, &ref] | provenance | | -| test.rs:413:39:413:50 | &mut reader2 [&ref] | test.rs:413:30:413:51 | ...::new(...) | provenance | MaD:26 | -| test.rs:413:39:413:50 | &mut reader2 [&ref] | test.rs:413:30:413:51 | ...::new(...) [Pin, &ref] | provenance | MaD:27 | +| test.rs:413:39:413:50 | &mut reader2 [&ref] | test.rs:413:30:413:51 | ...::new(...) | provenance | MaD:10 | +| test.rs:413:39:413:50 | &mut reader2 [&ref] | test.rs:413:30:413:51 | ...::new(...) [Pin, &ref] | provenance | MaD:11 | | test.rs:413:44:413:50 | reader2 | test.rs:413:39:413:50 | &mut reader2 [&ref] | provenance | | | test.rs:414:19:414:24 | pinned | test.rs:414:18:414:24 | &pinned | provenance | | | test.rs:414:19:414:24 | pinned [Pin, &ref] | test.rs:414:18:414:24 | &pinned | provenance | | | test.rs:416:17:416:22 | buffer [Ready, Ok] | test.rs:417:20:417:39 | ...::Ready(...) [Ready, Ok] | provenance | | | test.rs:416:17:416:22 | buffer [Ready, Ok] | test.rs:418:23:418:28 | buffer [Ready, Ok] | provenance | | -| test.rs:416:26:416:31 | pinned | test.rs:416:26:416:54 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:11 | +| test.rs:416:26:416:31 | pinned | test.rs:416:26:416:54 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:31 | | test.rs:416:26:416:54 | pinned.poll_fill_buf(...) [Ready, Ok] | test.rs:416:17:416:22 | buffer [Ready, Ok] | provenance | | | test.rs:417:20:417:39 | ...::Ready(...) [Ready, Ok] | test.rs:417:32:417:38 | Ok(...) [Ok] | provenance | | | test.rs:417:32:417:38 | Ok(...) [Ok] | test.rs:417:35:417:37 | buf | provenance | | | test.rs:417:35:417:37 | buf | test.rs:419:22:419:24 | buf | provenance | | | test.rs:418:23:418:28 | buffer [Ready, Ok] | test.rs:418:22:418:28 | &buffer | provenance | | | test.rs:423:17:423:23 | buffer2 [Ready, Ok] | test.rs:424:20:424:26 | buffer2 [Ready, Ok] | provenance | | -| test.rs:423:27:423:48 | ...::new(...) | test.rs:423:27:423:71 | ... .poll_fill_buf(...) [Ready, Ok] | provenance | MaD:11 | +| test.rs:423:27:423:48 | ...::new(...) | test.rs:423:27:423:71 | ... .poll_fill_buf(...) [Ready, Ok] | provenance | MaD:31 | | test.rs:423:27:423:71 | ... .poll_fill_buf(...) [Ready, Ok] | test.rs:423:17:423:23 | buffer2 [Ready, Ok] | provenance | | -| test.rs:423:36:423:47 | &mut reader2 [&ref] | test.rs:423:27:423:48 | ...::new(...) | provenance | MaD:26 | +| test.rs:423:36:423:47 | &mut reader2 [&ref] | test.rs:423:27:423:48 | ...::new(...) | provenance | MaD:10 | | test.rs:423:41:423:47 | reader2 | test.rs:423:36:423:47 | &mut reader2 [&ref] | provenance | | | test.rs:424:20:424:26 | buffer2 [Ready, Ok] | test.rs:425:17:425:36 | ...::Ready(...) [Ready, Ok] | provenance | | | test.rs:424:20:424:26 | buffer2 [Ready, Ok] | test.rs:426:27:426:33 | buffer2 [Ready, Ok] | provenance | | @@ -298,7 +298,7 @@ edges | test.rs:425:32:425:34 | buf | test.rs:427:26:427:28 | buf | provenance | | | test.rs:426:27:426:33 | buffer2 [Ready, Ok] | test.rs:426:26:426:33 | &buffer2 | provenance | | | test.rs:437:17:437:22 | buffer | test.rs:438:18:438:23 | buffer | provenance | | -| test.rs:437:26:437:32 | reader2 | test.rs:437:26:437:43 | reader2.fill_buf() [future, Ok] | provenance | MaD:13 | +| test.rs:437:26:437:32 | reader2 | test.rs:437:26:437:43 | reader2.fill_buf() [future, Ok] | provenance | MaD:33 | | test.rs:437:26:437:43 | reader2.fill_buf() [future, Ok] | test.rs:437:26:437:49 | await ... [Ok] | provenance | | | test.rs:437:26:437:49 | await ... [Ok] | test.rs:437:26:437:50 | TryExpr | provenance | | | test.rs:437:26:437:50 | TryExpr | test.rs:437:17:437:22 | buffer | provenance | | @@ -307,64 +307,64 @@ edges | test.rs:444:17:444:26 | mut pinned [Pin, &ref] | test.rs:445:19:445:24 | pinned [Pin, &ref] | provenance | | | test.rs:444:30:444:51 | ...::new(...) | test.rs:444:17:444:26 | mut pinned | provenance | | | test.rs:444:30:444:51 | ...::new(...) [Pin, &ref] | test.rs:444:17:444:26 | mut pinned [Pin, &ref] | provenance | | -| test.rs:444:39:444:50 | &mut reader2 [&ref] | test.rs:444:30:444:51 | ...::new(...) | provenance | MaD:26 | -| test.rs:444:39:444:50 | &mut reader2 [&ref] | test.rs:444:30:444:51 | ...::new(...) [Pin, &ref] | provenance | MaD:27 | +| test.rs:444:39:444:50 | &mut reader2 [&ref] | test.rs:444:30:444:51 | ...::new(...) | provenance | MaD:10 | +| test.rs:444:39:444:50 | &mut reader2 [&ref] | test.rs:444:30:444:51 | ...::new(...) [Pin, &ref] | provenance | MaD:11 | | test.rs:444:44:444:50 | reader2 | test.rs:444:39:444:50 | &mut reader2 [&ref] | provenance | | | test.rs:445:19:445:24 | pinned | test.rs:445:18:445:24 | &pinned | provenance | | | test.rs:445:19:445:24 | pinned [Pin, &ref] | test.rs:445:18:445:24 | &pinned | provenance | | -| test.rs:447:30:447:35 | pinned | test.rs:447:56:447:66 | [post] &mut buffer [&ref] | provenance | MaD:12 | +| test.rs:447:30:447:35 | pinned | test.rs:447:56:447:66 | [post] &mut buffer [&ref] | provenance | MaD:32 | | test.rs:447:56:447:66 | [post] &mut buffer [&ref] | test.rs:447:61:447:66 | [post] buffer | provenance | | | test.rs:447:61:447:66 | [post] buffer | test.rs:448:19:448:24 | buffer | provenance | | | test.rs:447:61:447:66 | [post] buffer | test.rs:450:23:450:28 | buffer | provenance | | | test.rs:447:61:447:66 | [post] buffer | test.rs:450:23:450:33 | buffer[...] | provenance | | | test.rs:448:19:448:24 | buffer | test.rs:448:18:448:24 | &buffer | provenance | | -| test.rs:450:23:450:28 | buffer | test.rs:450:23:450:33 | buffer[...] | provenance | MaD:10 | +| test.rs:450:23:450:28 | buffer | test.rs:450:23:450:33 | buffer[...] | provenance | MaD:30 | | test.rs:450:23:450:33 | buffer[...] | test.rs:450:22:450:33 | &... | provenance | | -| test.rs:457:63:457:74 | &mut reader2 [&ref] | test.rs:457:77:457:88 | [post] &mut buffer1 [&ref] | provenance | MaD:16 | +| test.rs:457:63:457:74 | &mut reader2 [&ref] | test.rs:457:77:457:88 | [post] &mut buffer1 [&ref] | provenance | MaD:36 | | test.rs:457:68:457:74 | reader2 | test.rs:457:63:457:74 | &mut reader2 [&ref] | provenance | | | test.rs:457:77:457:88 | [post] &mut buffer1 [&ref] | test.rs:457:82:457:88 | [post] buffer1 | provenance | | | test.rs:457:82:457:88 | [post] buffer1 | test.rs:458:19:458:25 | buffer1 | provenance | | | test.rs:457:82:457:88 | [post] buffer1 | test.rs:458:19:458:40 | buffer1[...] | provenance | | -| test.rs:458:19:458:25 | buffer1 | test.rs:458:19:458:40 | buffer1[...] | provenance | MaD:10 | +| test.rs:458:19:458:25 | buffer1 | test.rs:458:19:458:40 | buffer1[...] | provenance | MaD:30 | | test.rs:458:19:458:40 | buffer1[...] | test.rs:458:18:458:40 | &... | provenance | | -| test.rs:461:31:461:37 | reader2 | test.rs:461:44:461:55 | [post] &mut buffer2 [&ref] | provenance | MaD:16 | +| test.rs:461:31:461:37 | reader2 | test.rs:461:44:461:55 | [post] &mut buffer2 [&ref] | provenance | MaD:36 | | test.rs:461:44:461:55 | [post] &mut buffer2 [&ref] | test.rs:461:49:461:55 | [post] buffer2 | provenance | | | test.rs:461:49:461:55 | [post] buffer2 | test.rs:462:19:462:25 | buffer2 | provenance | | | test.rs:461:49:461:55 | [post] buffer2 | test.rs:462:19:462:40 | buffer2[...] | provenance | | -| test.rs:462:19:462:25 | buffer2 | test.rs:462:19:462:40 | buffer2[...] | provenance | MaD:10 | +| test.rs:462:19:462:25 | buffer2 | test.rs:462:19:462:40 | buffer2[...] | provenance | MaD:30 | | test.rs:462:19:462:40 | buffer2[...] | test.rs:462:18:462:40 | &... | provenance | | | test.rs:467:17:467:26 | mut pinned | test.rs:468:19:468:24 | pinned | provenance | | | test.rs:467:17:467:26 | mut pinned | test.rs:470:26:470:31 | pinned | provenance | | | test.rs:467:17:467:26 | mut pinned [Pin, &ref] | test.rs:468:19:468:24 | pinned [Pin, &ref] | provenance | | | test.rs:467:30:467:51 | ...::new(...) | test.rs:467:17:467:26 | mut pinned | provenance | | | test.rs:467:30:467:51 | ...::new(...) [Pin, &ref] | test.rs:467:17:467:26 | mut pinned [Pin, &ref] | provenance | | -| test.rs:467:39:467:50 | &mut reader2 [&ref] | test.rs:467:30:467:51 | ...::new(...) | provenance | MaD:26 | -| test.rs:467:39:467:50 | &mut reader2 [&ref] | test.rs:467:30:467:51 | ...::new(...) [Pin, &ref] | provenance | MaD:27 | +| test.rs:467:39:467:50 | &mut reader2 [&ref] | test.rs:467:30:467:51 | ...::new(...) | provenance | MaD:10 | +| test.rs:467:39:467:50 | &mut reader2 [&ref] | test.rs:467:30:467:51 | ...::new(...) [Pin, &ref] | provenance | MaD:11 | | test.rs:467:44:467:50 | reader2 | test.rs:467:39:467:50 | &mut reader2 [&ref] | provenance | | | test.rs:468:19:468:24 | pinned | test.rs:468:18:468:24 | &pinned | provenance | | | test.rs:468:19:468:24 | pinned [Pin, &ref] | test.rs:468:18:468:24 | &pinned | provenance | | | test.rs:470:17:470:22 | buffer [Ready, Ok] | test.rs:471:19:471:24 | buffer [Ready, Ok] | provenance | | | test.rs:470:17:470:22 | buffer [Ready, Ok] | test.rs:472:20:472:39 | ...::Ready(...) [Ready, Ok] | provenance | | -| test.rs:470:26:470:31 | pinned | test.rs:470:26:470:54 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:11 | +| test.rs:470:26:470:31 | pinned | test.rs:470:26:470:54 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:31 | | test.rs:470:26:470:54 | pinned.poll_fill_buf(...) [Ready, Ok] | test.rs:470:17:470:22 | buffer [Ready, Ok] | provenance | | | test.rs:471:19:471:24 | buffer [Ready, Ok] | test.rs:471:18:471:24 | &buffer | provenance | | | test.rs:472:20:472:39 | ...::Ready(...) [Ready, Ok] | test.rs:472:32:472:38 | Ok(...) [Ok] | provenance | | | test.rs:472:32:472:38 | Ok(...) [Ok] | test.rs:472:35:472:37 | buf | provenance | | | test.rs:472:35:472:37 | buf | test.rs:473:22:473:24 | buf | provenance | | | test.rs:479:17:479:22 | buffer | test.rs:480:18:480:23 | buffer | provenance | | -| test.rs:479:26:479:32 | reader2 | test.rs:479:26:479:43 | reader2.fill_buf() [future, Ok] | provenance | MaD:13 | +| test.rs:479:26:479:32 | reader2 | test.rs:479:26:479:43 | reader2.fill_buf() [future, Ok] | provenance | MaD:33 | | test.rs:479:26:479:43 | reader2.fill_buf() [future, Ok] | test.rs:479:26:479:49 | await ... [Ok] | provenance | | | test.rs:479:26:479:49 | await ... [Ok] | test.rs:479:26:479:50 | TryExpr | provenance | | | test.rs:479:26:479:50 | TryExpr | test.rs:479:17:479:22 | buffer | provenance | | -| test.rs:486:31:486:37 | reader2 | test.rs:486:57:486:65 | [post] &mut line [&ref] | provenance | MaD:15 | +| test.rs:486:31:486:37 | reader2 | test.rs:486:57:486:65 | [post] &mut line [&ref] | provenance | MaD:35 | | test.rs:486:57:486:65 | [post] &mut line [&ref] | test.rs:486:62:486:65 | [post] line | provenance | | | test.rs:486:62:486:65 | [post] line | test.rs:487:19:487:22 | line | provenance | | | test.rs:487:19:487:22 | line | test.rs:487:18:487:22 | &line | provenance | | -| test.rs:493:31:493:37 | reader2 | test.rs:493:49:493:57 | [post] &mut line [&ref] | provenance | MaD:14 | +| test.rs:493:31:493:37 | reader2 | test.rs:493:49:493:57 | [post] &mut line [&ref] | provenance | MaD:34 | | test.rs:493:49:493:57 | [post] &mut line [&ref] | test.rs:493:54:493:57 | [post] line | provenance | | | test.rs:493:54:493:57 | [post] line | test.rs:494:19:494:22 | line | provenance | | | test.rs:494:19:494:22 | line | test.rs:494:18:494:22 | &line | provenance | | -| test.rs:500:31:500:37 | reader2 | test.rs:500:51:500:61 | [post] &mut buffer [&ref] | provenance | MaD:17 | +| test.rs:500:31:500:37 | reader2 | test.rs:500:51:500:61 | [post] &mut buffer [&ref] | provenance | MaD:37 | | test.rs:500:51:500:61 | [post] &mut buffer [&ref] | test.rs:500:56:500:61 | [post] buffer | provenance | | | test.rs:500:56:500:61 | [post] buffer | test.rs:501:19:501:24 | buffer | provenance | | | test.rs:501:19:501:24 | buffer | test.rs:501:18:501:24 | &buffer | provenance | | diff --git a/rust/ql/test/library-tests/dataflow/sources/stdin/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/stdin/InlineFlow.expected index 7dbe5d352532..02ca3cbc184d 100644 --- a/rust/ql/test/library-tests/dataflow/sources/stdin/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/stdin/InlineFlow.expected @@ -1,161 +1,161 @@ models | 1 | Source: std::io::stdio::stdin; ReturnValue; stdin | | 2 | Source: tokio::io::stdin::stdin; ReturnValue; stdin | -| 3 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | -| 4 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 5 | Summary: <_ as core::ops::index::Index>::index; Argument[self].Reference.Element; ReturnValue.Reference; value | -| 6 | Summary: <_ as std::io::BufRead>::lines; Argument[self]; ReturnValue; taint | -| 7 | Summary: <_ as std::io::BufRead>::read_line; Argument[self].Reference; Argument[0].Reference; taint | -| 8 | Summary: <_ as std::io::BufRead>::read_until; Argument[self].Reference; Argument[1].Reference; taint | -| 9 | Summary: <_ as std::io::BufRead>::split; Argument[self]; ReturnValue; taint | -| 10 | Summary: <_ as std::io::Read>::bytes; Argument[self]; ReturnValue; taint | -| 11 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::fill_buf; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 12 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::lines; Argument[self]; ReturnValue; taint | -| 13 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_line; Argument[self].Reference; Argument[0].Reference; taint | -| 14 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_until; Argument[self].Reference; Argument[1].Reference; taint | -| 15 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::split; Argument[self]; ReturnValue; taint | -| 16 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read; Argument[self].Reference; Argument[0].Reference; taint | -| 17 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_buf; Argument[self].Reference; Argument[0].Reference; taint | -| 18 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_exact; Argument[self].Reference; Argument[0].Reference; taint | -| 19 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_f32; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 20 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i16; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 21 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i64_le; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 22 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | -| 23 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | -| 24 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u8; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 25 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 26 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 27 | Summary: ::next; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; value | -| 28 | Summary: ::fill_buf; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 29 | Summary: ::buffer; Argument[self].Reference; ReturnValue.Reference; taint | -| 30 | Summary: ::new; Argument[0]; ReturnValue; taint | -| 31 | Summary: ::read; Argument[self].Reference; Argument[0].Reference; taint | -| 32 | Summary: ::read_exact; Argument[self].Reference; Argument[0].Reference; taint | -| 33 | Summary: ::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | -| 34 | Summary: ::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | -| 35 | Summary: ::lock; Argument[self].Reference; ReturnValue; taint | -| 36 | Summary: ::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | -| 37 | Summary: ::buffer; Argument[self].Reference; ReturnValue.Reference; taint | -| 38 | Summary: ::new; Argument[0]; ReturnValue; taint | -| 39 | Summary: ::next_line; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | -| 40 | Summary: ::next_segment; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | +| 3 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 4 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 5 | Summary: ::next; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; value | +| 6 | Summary: ::fill_buf; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 7 | Summary: ::buffer; Argument[self].Reference; ReturnValue.Reference; taint | +| 8 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 9 | Summary: ::read; Argument[self].Reference; Argument[0].Reference; taint | +| 10 | Summary: ::read_exact; Argument[self].Reference; Argument[0].Reference; taint | +| 11 | Summary: ::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | +| 12 | Summary: ::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | +| 13 | Summary: ::lock; Argument[self].Reference; ReturnValue; taint | +| 14 | Summary: ::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | +| 15 | Summary: ::buffer; Argument[self].Reference; ReturnValue.Reference; taint | +| 16 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 17 | Summary: ::next_line; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | +| 18 | Summary: ::next_segment; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | +| 19 | Summary: core::clone::Clone::clone; Argument[self].Reference; ReturnValue; value | +| 20 | Summary: core::iter::traits::iterator::Iterator::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 21 | Summary: core::ops::index::Index::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 22 | Summary: std::io::BufRead::lines; Argument[self]; ReturnValue; taint | +| 23 | Summary: std::io::BufRead::read_line; Argument[self].Reference; Argument[0].Reference; taint | +| 24 | Summary: std::io::BufRead::read_until; Argument[self].Reference; Argument[1].Reference; taint | +| 25 | Summary: std::io::BufRead::split; Argument[self]; ReturnValue; taint | +| 26 | Summary: std::io::Read::bytes; Argument[self]; ReturnValue; taint | +| 27 | Summary: tokio::io::util::async_buf_read_ext::AsyncBufReadExt::fill_buf; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 28 | Summary: tokio::io::util::async_buf_read_ext::AsyncBufReadExt::lines; Argument[self]; ReturnValue; taint | +| 29 | Summary: tokio::io::util::async_buf_read_ext::AsyncBufReadExt::read_line; Argument[self].Reference; Argument[0].Reference; taint | +| 30 | Summary: tokio::io::util::async_buf_read_ext::AsyncBufReadExt::read_until; Argument[self].Reference; Argument[1].Reference; taint | +| 31 | Summary: tokio::io::util::async_buf_read_ext::AsyncBufReadExt::split; Argument[self]; ReturnValue; taint | +| 32 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read; Argument[self].Reference; Argument[0].Reference; taint | +| 33 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_buf; Argument[self].Reference; Argument[0].Reference; taint | +| 34 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_exact; Argument[self].Reference; Argument[0].Reference; taint | +| 35 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_f32; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 36 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_i16; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 37 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_i64_le; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 38 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | +| 39 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | +| 40 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_u8; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | edges | test.rs:13:22:13:37 | ...::stdin(...) | test.rs:13:22:13:37 | ...::stdin(...) | provenance | Src:MaD:1 | -| test.rs:13:22:13:37 | ...::stdin(...) | test.rs:13:44:13:54 | [post] &mut buffer [&ref] | provenance | MaD:31 | +| test.rs:13:22:13:37 | ...::stdin(...) | test.rs:13:44:13:54 | [post] &mut buffer [&ref] | provenance | MaD:9 | | test.rs:13:44:13:54 | [post] &mut buffer [&ref] | test.rs:13:49:13:54 | [post] buffer | provenance | | | test.rs:13:49:13:54 | [post] buffer | test.rs:14:15:14:20 | buffer | provenance | | | test.rs:14:15:14:20 | buffer | test.rs:14:14:14:20 | &buffer | provenance | | | test.rs:19:22:19:37 | ...::stdin(...) | test.rs:19:22:19:37 | ...::stdin(...) | provenance | Src:MaD:1 | -| test.rs:19:22:19:37 | ...::stdin(...) | test.rs:19:51:19:61 | [post] &mut buffer [&ref] | provenance | MaD:33 | +| test.rs:19:22:19:37 | ...::stdin(...) | test.rs:19:51:19:61 | [post] &mut buffer [&ref] | provenance | MaD:11 | | test.rs:19:51:19:61 | [post] &mut buffer [&ref] | test.rs:19:56:19:61 | [post] buffer | provenance | | | test.rs:19:56:19:61 | [post] buffer | test.rs:20:15:20:20 | buffer | provenance | | | test.rs:20:15:20:20 | buffer | test.rs:20:14:20:20 | &buffer | provenance | | | test.rs:25:22:25:37 | ...::stdin(...) | test.rs:25:22:25:37 | ...::stdin(...) | provenance | Src:MaD:1 | -| test.rs:25:22:25:37 | ...::stdin(...) | test.rs:25:54:25:64 | [post] &mut buffer [&ref] | provenance | MaD:34 | +| test.rs:25:22:25:37 | ...::stdin(...) | test.rs:25:54:25:64 | [post] &mut buffer [&ref] | provenance | MaD:12 | | test.rs:25:54:25:64 | [post] &mut buffer [&ref] | test.rs:25:59:25:64 | [post] buffer | provenance | | | test.rs:25:59:25:64 | [post] buffer | test.rs:26:15:26:20 | buffer | provenance | | | test.rs:26:15:26:20 | buffer | test.rs:26:14:26:20 | &buffer | provenance | | | test.rs:31:22:31:37 | ...::stdin(...) | test.rs:31:22:31:37 | ...::stdin(...) | provenance | Src:MaD:1 | -| test.rs:31:22:31:37 | ...::stdin(...) | test.rs:31:22:31:44 | ... .lock() | provenance | MaD:35 | -| test.rs:31:22:31:44 | ... .lock() | test.rs:31:61:31:71 | [post] &mut buffer [&ref] | provenance | MaD:36 | +| test.rs:31:22:31:37 | ...::stdin(...) | test.rs:31:22:31:44 | ... .lock() | provenance | MaD:13 | +| test.rs:31:22:31:44 | ... .lock() | test.rs:31:61:31:71 | [post] &mut buffer [&ref] | provenance | MaD:14 | | test.rs:31:61:31:71 | [post] &mut buffer [&ref] | test.rs:31:66:31:71 | [post] buffer | provenance | | | test.rs:31:66:31:71 | [post] buffer | test.rs:32:15:32:20 | buffer | provenance | | | test.rs:32:15:32:20 | buffer | test.rs:32:14:32:20 | &buffer | provenance | | | test.rs:37:9:37:24 | ...::stdin(...) | test.rs:37:9:37:24 | ...::stdin(...) | provenance | Src:MaD:1 | -| test.rs:37:9:37:24 | ...::stdin(...) | test.rs:37:37:37:47 | [post] &mut buffer [&ref] | provenance | MaD:32 | +| test.rs:37:9:37:24 | ...::stdin(...) | test.rs:37:37:37:47 | [post] &mut buffer [&ref] | provenance | MaD:10 | | test.rs:37:37:37:47 | [post] &mut buffer [&ref] | test.rs:37:42:37:47 | [post] buffer | provenance | | | test.rs:37:42:37:47 | [post] buffer | test.rs:38:15:38:20 | buffer | provenance | | | test.rs:38:15:38:20 | buffer | test.rs:38:14:38:20 | &buffer | provenance | | | test.rs:41:17:41:32 | ...::stdin(...) | test.rs:41:17:41:32 | ...::stdin(...) | provenance | Src:MaD:1 | -| test.rs:41:17:41:32 | ...::stdin(...) | test.rs:41:17:41:40 | ... .bytes() | provenance | MaD:10 | +| test.rs:41:17:41:32 | ...::stdin(...) | test.rs:41:17:41:40 | ... .bytes() | provenance | MaD:26 | | test.rs:41:17:41:40 | ... .bytes() | test.rs:42:14:42:17 | byte | provenance | | | test.rs:48:13:48:22 | mut reader | test.rs:49:20:49:25 | reader | provenance | | | test.rs:48:26:48:66 | ...::new(...) | test.rs:48:13:48:22 | mut reader | provenance | | -| test.rs:48:50:48:65 | ...::stdin(...) | test.rs:48:26:48:66 | ...::new(...) | provenance | MaD:30 | +| test.rs:48:50:48:65 | ...::stdin(...) | test.rs:48:26:48:66 | ...::new(...) | provenance | MaD:8 | | test.rs:48:50:48:65 | ...::stdin(...) | test.rs:48:50:48:65 | ...::stdin(...) | provenance | Src:MaD:1 | | test.rs:49:13:49:16 | data | test.rs:50:15:50:18 | data | provenance | | -| test.rs:49:20:49:25 | reader | test.rs:49:20:49:36 | reader.fill_buf() [Ok] | provenance | MaD:28 | +| test.rs:49:20:49:25 | reader | test.rs:49:20:49:36 | reader.fill_buf() [Ok] | provenance | MaD:6 | | test.rs:49:20:49:36 | reader.fill_buf() [Ok] | test.rs:49:20:49:37 | TryExpr | provenance | | | test.rs:49:20:49:37 | TryExpr | test.rs:49:13:49:16 | data | provenance | | | test.rs:50:15:50:18 | data | test.rs:50:14:50:18 | &data | provenance | | | test.rs:54:13:54:18 | reader | test.rs:55:20:55:25 | reader | provenance | | | test.rs:54:22:54:62 | ...::new(...) | test.rs:54:13:54:18 | reader | provenance | | -| test.rs:54:46:54:61 | ...::stdin(...) | test.rs:54:22:54:62 | ...::new(...) | provenance | MaD:30 | +| test.rs:54:46:54:61 | ...::stdin(...) | test.rs:54:22:54:62 | ...::new(...) | provenance | MaD:8 | | test.rs:54:46:54:61 | ...::stdin(...) | test.rs:54:46:54:61 | ...::stdin(...) | provenance | Src:MaD:1 | | test.rs:55:13:55:16 | data [&ref] | test.rs:56:15:56:18 | data [&ref] | provenance | | -| test.rs:55:20:55:25 | reader | test.rs:55:20:55:34 | reader.buffer() [&ref] | provenance | MaD:29 | +| test.rs:55:20:55:25 | reader | test.rs:55:20:55:34 | reader.buffer() [&ref] | provenance | MaD:7 | | test.rs:55:20:55:34 | reader.buffer() [&ref] | test.rs:55:13:55:16 | data [&ref] | provenance | | | test.rs:56:15:56:18 | data [&ref] | test.rs:56:14:56:18 | &data | provenance | | | test.rs:61:13:61:22 | mut reader | test.rs:62:9:62:14 | reader | provenance | | | test.rs:61:26:61:66 | ...::new(...) | test.rs:61:13:61:22 | mut reader | provenance | | -| test.rs:61:50:61:65 | ...::stdin(...) | test.rs:61:26:61:66 | ...::new(...) | provenance | MaD:30 | +| test.rs:61:50:61:65 | ...::stdin(...) | test.rs:61:26:61:66 | ...::new(...) | provenance | MaD:8 | | test.rs:61:50:61:65 | ...::stdin(...) | test.rs:61:50:61:65 | ...::stdin(...) | provenance | Src:MaD:1 | -| test.rs:62:9:62:14 | reader | test.rs:62:26:62:36 | [post] &mut buffer [&ref] | provenance | MaD:7 | +| test.rs:62:9:62:14 | reader | test.rs:62:26:62:36 | [post] &mut buffer [&ref] | provenance | MaD:23 | | test.rs:62:26:62:36 | [post] &mut buffer [&ref] | test.rs:62:31:62:36 | [post] buffer | provenance | | | test.rs:62:31:62:36 | [post] buffer | test.rs:63:15:63:20 | buffer | provenance | | | test.rs:63:15:63:20 | buffer | test.rs:63:14:63:20 | &buffer | provenance | | | test.rs:68:13:68:22 | mut reader | test.rs:69:9:69:14 | reader | provenance | | | test.rs:68:26:68:66 | ...::new(...) | test.rs:68:13:68:22 | mut reader | provenance | | -| test.rs:68:50:68:65 | ...::stdin(...) | test.rs:68:26:68:66 | ...::new(...) | provenance | MaD:30 | +| test.rs:68:50:68:65 | ...::stdin(...) | test.rs:68:26:68:66 | ...::new(...) | provenance | MaD:8 | | test.rs:68:50:68:65 | ...::stdin(...) | test.rs:68:50:68:65 | ...::stdin(...) | provenance | Src:MaD:1 | -| test.rs:69:9:69:14 | reader | test.rs:69:33:69:43 | [post] &mut buffer [&ref] | provenance | MaD:8 | +| test.rs:69:9:69:14 | reader | test.rs:69:33:69:43 | [post] &mut buffer [&ref] | provenance | MaD:24 | | test.rs:69:33:69:43 | [post] &mut buffer [&ref] | test.rs:69:38:69:43 | [post] buffer | provenance | | | test.rs:69:38:69:43 | [post] buffer | test.rs:70:15:70:20 | buffer | provenance | | | test.rs:69:38:69:43 | [post] buffer | test.rs:71:14:71:19 | buffer | provenance | | | test.rs:70:15:70:20 | buffer | test.rs:70:14:70:20 | &buffer | provenance | | -| test.rs:71:14:71:19 | buffer | test.rs:71:14:71:22 | buffer[0] | provenance | MaD:5 | +| test.rs:71:14:71:19 | buffer | test.rs:71:14:71:22 | buffer[0] | provenance | MaD:21 | | test.rs:75:13:75:28 | mut reader_split | test.rs:76:14:76:25 | reader_split | provenance | | | test.rs:75:13:75:28 | mut reader_split | test.rs:77:33:77:44 | reader_split | provenance | | -| test.rs:75:32:75:72 | ...::new(...) | test.rs:75:32:75:84 | ... .split(...) | provenance | MaD:9 | +| test.rs:75:32:75:72 | ...::new(...) | test.rs:75:32:75:84 | ... .split(...) | provenance | MaD:25 | | test.rs:75:32:75:84 | ... .split(...) | test.rs:75:13:75:28 | mut reader_split | provenance | | -| test.rs:75:56:75:71 | ...::stdin(...) | test.rs:75:32:75:72 | ...::new(...) | provenance | MaD:30 | +| test.rs:75:56:75:71 | ...::stdin(...) | test.rs:75:32:75:72 | ...::new(...) | provenance | MaD:8 | | test.rs:75:56:75:71 | ...::stdin(...) | test.rs:75:56:75:71 | ...::stdin(...) | provenance | Src:MaD:1 | -| test.rs:76:14:76:25 | reader_split | test.rs:76:14:76:32 | reader_split.next() [Some, Ok] | provenance | MaD:27 | -| test.rs:76:14:76:32 | reader_split.next() [Some, Ok] | test.rs:76:14:76:41 | ... .unwrap() [Ok] | provenance | MaD:25 | -| test.rs:76:14:76:41 | ... .unwrap() [Ok] | test.rs:76:14:76:50 | ... .unwrap() | provenance | MaD:26 | +| test.rs:76:14:76:25 | reader_split | test.rs:76:14:76:32 | reader_split.next() [Some, Ok] | provenance | MaD:5 | +| test.rs:76:14:76:32 | reader_split.next() [Some, Ok] | test.rs:76:14:76:41 | ... .unwrap() [Ok] | provenance | MaD:3 | +| test.rs:76:14:76:41 | ... .unwrap() [Ok] | test.rs:76:14:76:50 | ... .unwrap() | provenance | MaD:4 | | test.rs:77:19:77:29 | Some(...) [Some, Ok] | test.rs:77:24:77:28 | chunk [Ok] | provenance | | | test.rs:77:24:77:28 | chunk [Ok] | test.rs:78:18:78:22 | chunk [Ok] | provenance | | -| test.rs:77:33:77:44 | reader_split | test.rs:77:33:77:51 | reader_split.next() [Some, Ok] | provenance | MaD:27 | +| test.rs:77:33:77:44 | reader_split | test.rs:77:33:77:51 | reader_split.next() [Some, Ok] | provenance | MaD:5 | | test.rs:77:33:77:51 | reader_split.next() [Some, Ok] | test.rs:77:19:77:29 | Some(...) [Some, Ok] | provenance | | -| test.rs:78:18:78:22 | chunk [Ok] | test.rs:78:18:78:31 | chunk.unwrap() | provenance | MaD:26 | +| test.rs:78:18:78:22 | chunk [Ok] | test.rs:78:18:78:31 | chunk.unwrap() | provenance | MaD:4 | | test.rs:83:13:83:18 | reader | test.rs:84:21:84:26 | reader | provenance | | | test.rs:83:22:83:62 | ...::new(...) | test.rs:83:13:83:18 | reader | provenance | | -| test.rs:83:46:83:61 | ...::stdin(...) | test.rs:83:22:83:62 | ...::new(...) | provenance | MaD:30 | +| test.rs:83:46:83:61 | ...::stdin(...) | test.rs:83:22:83:62 | ...::new(...) | provenance | MaD:8 | | test.rs:83:46:83:61 | ...::stdin(...) | test.rs:83:46:83:61 | ...::stdin(...) | provenance | Src:MaD:1 | -| test.rs:84:21:84:26 | reader | test.rs:84:21:84:34 | reader.lines() | provenance | MaD:6 | +| test.rs:84:21:84:26 | reader | test.rs:84:21:84:34 | reader.lines() | provenance | MaD:22 | | test.rs:84:21:84:34 | reader.lines() | test.rs:85:18:85:21 | line | provenance | | | test.rs:90:13:90:18 | reader | test.rs:91:20:91:25 | reader | provenance | | | test.rs:90:22:90:62 | ...::new(...) | test.rs:90:13:90:18 | reader | provenance | | -| test.rs:90:46:90:61 | ...::stdin(...) | test.rs:90:22:90:62 | ...::new(...) | provenance | MaD:30 | +| test.rs:90:46:90:61 | ...::stdin(...) | test.rs:90:22:90:62 | ...::new(...) | provenance | MaD:8 | | test.rs:90:46:90:61 | ...::stdin(...) | test.rs:90:46:90:61 | ...::stdin(...) | provenance | Src:MaD:1 | | test.rs:91:13:91:16 | line | test.rs:92:14:92:17 | line | provenance | | -| test.rs:91:20:91:25 | reader | test.rs:91:20:91:33 | reader.lines() | provenance | MaD:6 | -| test.rs:91:20:91:33 | reader.lines() | test.rs:91:20:91:40 | ... .nth(...) [Some] | provenance | MaD:4 | -| test.rs:91:20:91:40 | ... .nth(...) [Some] | test.rs:91:20:91:49 | ... .unwrap() | provenance | MaD:25 | +| test.rs:91:20:91:25 | reader | test.rs:91:20:91:33 | reader.lines() | provenance | MaD:22 | +| test.rs:91:20:91:33 | reader.lines() | test.rs:91:20:91:40 | ... .nth(...) [Some] | provenance | MaD:20 | +| test.rs:91:20:91:40 | ... .nth(...) [Some] | test.rs:91:20:91:49 | ... .unwrap() | provenance | MaD:3 | | test.rs:91:20:91:49 | ... .unwrap() | test.rs:91:13:91:16 | line | provenance | | -| test.rs:92:14:92:17 | line | test.rs:92:14:92:26 | line.unwrap() | provenance | MaD:26 | -| test.rs:92:14:92:26 | line.unwrap() | test.rs:92:14:92:34 | ... .clone() | provenance | MaD:3 | +| test.rs:92:14:92:17 | line | test.rs:92:14:92:26 | line.unwrap() | provenance | MaD:4 | +| test.rs:92:14:92:26 | line.unwrap() | test.rs:92:14:92:34 | ... .clone() | provenance | MaD:19 | | test.rs:109:13:109:21 | mut stdin | test.rs:111:22:111:26 | stdin | provenance | | | test.rs:109:25:109:42 | ...::stdin(...) | test.rs:109:13:109:21 | mut stdin | provenance | Src:MaD:2 | -| test.rs:111:22:111:26 | stdin | test.rs:111:33:111:43 | [post] &mut buffer [&ref] | provenance | MaD:16 | +| test.rs:111:22:111:26 | stdin | test.rs:111:33:111:43 | [post] &mut buffer [&ref] | provenance | MaD:32 | | test.rs:111:33:111:43 | [post] &mut buffer [&ref] | test.rs:111:38:111:43 | [post] buffer | provenance | | | test.rs:111:38:111:43 | [post] buffer | test.rs:112:15:112:20 | buffer | provenance | | | test.rs:112:15:112:20 | buffer | test.rs:112:14:112:20 | &buffer | provenance | | | test.rs:116:13:116:21 | mut stdin | test.rs:118:22:118:26 | stdin | provenance | | | test.rs:116:25:116:42 | ...::stdin(...) | test.rs:116:13:116:21 | mut stdin | provenance | Src:MaD:2 | -| test.rs:118:22:118:26 | stdin | test.rs:118:40:118:50 | [post] &mut buffer [&ref] | provenance | MaD:22 | +| test.rs:118:22:118:26 | stdin | test.rs:118:40:118:50 | [post] &mut buffer [&ref] | provenance | MaD:38 | | test.rs:118:40:118:50 | [post] &mut buffer [&ref] | test.rs:118:45:118:50 | [post] buffer | provenance | | | test.rs:118:45:118:50 | [post] buffer | test.rs:119:15:119:20 | buffer | provenance | | | test.rs:119:15:119:20 | buffer | test.rs:119:14:119:20 | &buffer | provenance | | | test.rs:123:13:123:21 | mut stdin | test.rs:125:22:125:26 | stdin | provenance | | | test.rs:123:25:123:42 | ...::stdin(...) | test.rs:123:13:123:21 | mut stdin | provenance | Src:MaD:2 | -| test.rs:125:22:125:26 | stdin | test.rs:125:43:125:53 | [post] &mut buffer [&ref] | provenance | MaD:23 | +| test.rs:125:22:125:26 | stdin | test.rs:125:43:125:53 | [post] &mut buffer [&ref] | provenance | MaD:39 | | test.rs:125:43:125:53 | [post] &mut buffer [&ref] | test.rs:125:48:125:53 | [post] buffer | provenance | | | test.rs:125:48:125:53 | [post] buffer | test.rs:126:15:126:20 | buffer | provenance | | | test.rs:126:15:126:20 | buffer | test.rs:126:14:126:20 | &buffer | provenance | | | test.rs:130:13:130:21 | mut stdin | test.rs:132:9:132:13 | stdin | provenance | | | test.rs:130:25:130:42 | ...::stdin(...) | test.rs:130:13:130:21 | mut stdin | provenance | Src:MaD:2 | -| test.rs:132:9:132:13 | stdin | test.rs:132:26:132:36 | [post] &mut buffer [&ref] | provenance | MaD:18 | +| test.rs:132:9:132:13 | stdin | test.rs:132:26:132:36 | [post] &mut buffer [&ref] | provenance | MaD:34 | | test.rs:132:26:132:36 | [post] &mut buffer [&ref] | test.rs:132:31:132:36 | [post] buffer | provenance | | | test.rs:132:31:132:36 | [post] buffer | test.rs:133:15:133:20 | buffer | provenance | | | test.rs:133:15:133:20 | buffer | test.rs:133:14:133:20 | &buffer | provenance | | @@ -165,98 +165,98 @@ edges | test.rs:137:13:137:21 | mut stdin | test.rs:141:18:141:22 | stdin | provenance | | | test.rs:137:25:137:42 | ...::stdin(...) | test.rs:137:13:137:21 | mut stdin | provenance | Src:MaD:2 | | test.rs:138:13:138:14 | v1 | test.rs:142:14:142:15 | v1 | provenance | | -| test.rs:138:18:138:22 | stdin | test.rs:138:18:138:32 | stdin.read_u8() [future, Ok] | provenance | MaD:24 | +| test.rs:138:18:138:22 | stdin | test.rs:138:18:138:32 | stdin.read_u8() [future, Ok] | provenance | MaD:40 | | test.rs:138:18:138:32 | stdin.read_u8() [future, Ok] | test.rs:138:18:138:38 | await ... [Ok] | provenance | | | test.rs:138:18:138:38 | await ... [Ok] | test.rs:138:18:138:39 | TryExpr | provenance | | | test.rs:138:18:138:39 | TryExpr | test.rs:138:13:138:14 | v1 | provenance | | | test.rs:139:13:139:14 | v2 | test.rs:143:14:143:15 | v2 | provenance | | -| test.rs:139:18:139:22 | stdin | test.rs:139:18:139:33 | stdin.read_i16() [future, Ok] | provenance | MaD:20 | +| test.rs:139:18:139:22 | stdin | test.rs:139:18:139:33 | stdin.read_i16() [future, Ok] | provenance | MaD:36 | | test.rs:139:18:139:33 | stdin.read_i16() [future, Ok] | test.rs:139:18:139:39 | await ... [Ok] | provenance | | | test.rs:139:18:139:39 | await ... [Ok] | test.rs:139:18:139:40 | TryExpr | provenance | | | test.rs:139:18:139:40 | TryExpr | test.rs:139:13:139:14 | v2 | provenance | | | test.rs:140:13:140:14 | v3 | test.rs:144:14:144:15 | v3 | provenance | | -| test.rs:140:18:140:22 | stdin | test.rs:140:18:140:33 | stdin.read_f32() [future, Ok] | provenance | MaD:19 | +| test.rs:140:18:140:22 | stdin | test.rs:140:18:140:33 | stdin.read_f32() [future, Ok] | provenance | MaD:35 | | test.rs:140:18:140:33 | stdin.read_f32() [future, Ok] | test.rs:140:18:140:39 | await ... [Ok] | provenance | | | test.rs:140:18:140:39 | await ... [Ok] | test.rs:140:18:140:40 | TryExpr | provenance | | | test.rs:140:18:140:40 | TryExpr | test.rs:140:13:140:14 | v3 | provenance | | | test.rs:141:13:141:14 | v4 | test.rs:145:14:145:15 | v4 | provenance | | -| test.rs:141:18:141:22 | stdin | test.rs:141:18:141:36 | stdin.read_i64_le() [future, Ok] | provenance | MaD:21 | +| test.rs:141:18:141:22 | stdin | test.rs:141:18:141:36 | stdin.read_i64_le() [future, Ok] | provenance | MaD:37 | | test.rs:141:18:141:36 | stdin.read_i64_le() [future, Ok] | test.rs:141:18:141:42 | await ... [Ok] | provenance | | | test.rs:141:18:141:42 | await ... [Ok] | test.rs:141:18:141:43 | TryExpr | provenance | | | test.rs:141:18:141:43 | TryExpr | test.rs:141:13:141:14 | v4 | provenance | | | test.rs:149:13:149:21 | mut stdin | test.rs:151:9:151:13 | stdin | provenance | | | test.rs:149:25:149:42 | ...::stdin(...) | test.rs:149:13:149:21 | mut stdin | provenance | Src:MaD:2 | -| test.rs:151:9:151:13 | stdin | test.rs:151:24:151:34 | [post] &mut buffer [&ref] | provenance | MaD:17 | +| test.rs:151:9:151:13 | stdin | test.rs:151:24:151:34 | [post] &mut buffer [&ref] | provenance | MaD:33 | | test.rs:151:24:151:34 | [post] &mut buffer [&ref] | test.rs:151:29:151:34 | [post] buffer | provenance | | | test.rs:151:29:151:34 | [post] buffer | test.rs:152:15:152:20 | buffer | provenance | | | test.rs:152:15:152:20 | buffer | test.rs:152:14:152:20 | &buffer | provenance | | | test.rs:158:13:158:22 | mut reader | test.rs:159:20:159:25 | reader | provenance | | | test.rs:158:26:158:70 | ...::new(...) | test.rs:158:13:158:22 | mut reader | provenance | | -| test.rs:158:52:158:69 | ...::stdin(...) | test.rs:158:26:158:70 | ...::new(...) | provenance | MaD:38 | +| test.rs:158:52:158:69 | ...::stdin(...) | test.rs:158:26:158:70 | ...::new(...) | provenance | MaD:16 | | test.rs:158:52:158:69 | ...::stdin(...) | test.rs:158:52:158:69 | ...::stdin(...) | provenance | Src:MaD:2 | | test.rs:159:13:159:16 | data | test.rs:160:15:160:18 | data | provenance | | -| test.rs:159:20:159:25 | reader | test.rs:159:20:159:36 | reader.fill_buf() [future, Ok] | provenance | MaD:11 | +| test.rs:159:20:159:25 | reader | test.rs:159:20:159:36 | reader.fill_buf() [future, Ok] | provenance | MaD:27 | | test.rs:159:20:159:36 | reader.fill_buf() [future, Ok] | test.rs:159:20:159:42 | await ... [Ok] | provenance | | | test.rs:159:20:159:42 | await ... [Ok] | test.rs:159:20:159:43 | TryExpr | provenance | | | test.rs:159:20:159:43 | TryExpr | test.rs:159:13:159:16 | data | provenance | | | test.rs:160:15:160:18 | data | test.rs:160:14:160:18 | &data | provenance | | | test.rs:164:13:164:18 | reader | test.rs:165:20:165:25 | reader | provenance | | | test.rs:164:22:164:66 | ...::new(...) | test.rs:164:13:164:18 | reader | provenance | | -| test.rs:164:48:164:65 | ...::stdin(...) | test.rs:164:22:164:66 | ...::new(...) | provenance | MaD:38 | +| test.rs:164:48:164:65 | ...::stdin(...) | test.rs:164:22:164:66 | ...::new(...) | provenance | MaD:16 | | test.rs:164:48:164:65 | ...::stdin(...) | test.rs:164:48:164:65 | ...::stdin(...) | provenance | Src:MaD:2 | | test.rs:165:13:165:16 | data [&ref] | test.rs:166:15:166:18 | data [&ref] | provenance | | -| test.rs:165:20:165:25 | reader | test.rs:165:20:165:34 | reader.buffer() [&ref] | provenance | MaD:37 | +| test.rs:165:20:165:25 | reader | test.rs:165:20:165:34 | reader.buffer() [&ref] | provenance | MaD:15 | | test.rs:165:20:165:34 | reader.buffer() [&ref] | test.rs:165:13:165:16 | data [&ref] | provenance | | | test.rs:166:15:166:18 | data [&ref] | test.rs:166:14:166:18 | &data | provenance | | | test.rs:171:13:171:22 | mut reader | test.rs:172:9:172:14 | reader | provenance | | | test.rs:171:26:171:70 | ...::new(...) | test.rs:171:13:171:22 | mut reader | provenance | | -| test.rs:171:52:171:69 | ...::stdin(...) | test.rs:171:26:171:70 | ...::new(...) | provenance | MaD:38 | +| test.rs:171:52:171:69 | ...::stdin(...) | test.rs:171:26:171:70 | ...::new(...) | provenance | MaD:16 | | test.rs:171:52:171:69 | ...::stdin(...) | test.rs:171:52:171:69 | ...::stdin(...) | provenance | Src:MaD:2 | -| test.rs:172:9:172:14 | reader | test.rs:172:26:172:36 | [post] &mut buffer [&ref] | provenance | MaD:13 | +| test.rs:172:9:172:14 | reader | test.rs:172:26:172:36 | [post] &mut buffer [&ref] | provenance | MaD:29 | | test.rs:172:26:172:36 | [post] &mut buffer [&ref] | test.rs:172:31:172:36 | [post] buffer | provenance | | | test.rs:172:31:172:36 | [post] buffer | test.rs:173:15:173:20 | buffer | provenance | | | test.rs:173:15:173:20 | buffer | test.rs:173:14:173:20 | &buffer | provenance | | | test.rs:178:13:178:22 | mut reader | test.rs:179:9:179:14 | reader | provenance | | | test.rs:178:26:178:70 | ...::new(...) | test.rs:178:13:178:22 | mut reader | provenance | | -| test.rs:178:52:178:69 | ...::stdin(...) | test.rs:178:26:178:70 | ...::new(...) | provenance | MaD:38 | +| test.rs:178:52:178:69 | ...::stdin(...) | test.rs:178:26:178:70 | ...::new(...) | provenance | MaD:16 | | test.rs:178:52:178:69 | ...::stdin(...) | test.rs:178:52:178:69 | ...::stdin(...) | provenance | Src:MaD:2 | -| test.rs:179:9:179:14 | reader | test.rs:179:33:179:43 | [post] &mut buffer [&ref] | provenance | MaD:14 | +| test.rs:179:9:179:14 | reader | test.rs:179:33:179:43 | [post] &mut buffer [&ref] | provenance | MaD:30 | | test.rs:179:33:179:43 | [post] &mut buffer [&ref] | test.rs:179:38:179:43 | [post] buffer | provenance | | | test.rs:179:38:179:43 | [post] buffer | test.rs:180:15:180:20 | buffer | provenance | | | test.rs:179:38:179:43 | [post] buffer | test.rs:181:14:181:19 | buffer | provenance | | | test.rs:180:15:180:20 | buffer | test.rs:180:14:180:20 | &buffer | provenance | | -| test.rs:181:14:181:19 | buffer | test.rs:181:14:181:22 | buffer[0] | provenance | MaD:5 | +| test.rs:181:14:181:19 | buffer | test.rs:181:14:181:22 | buffer[0] | provenance | MaD:21 | | test.rs:185:13:185:28 | mut reader_split | test.rs:186:14:186:25 | reader_split | provenance | | | test.rs:185:13:185:28 | mut reader_split | test.rs:187:33:187:44 | reader_split | provenance | | -| test.rs:185:32:185:76 | ...::new(...) | test.rs:185:32:185:88 | ... .split(...) | provenance | MaD:15 | +| test.rs:185:32:185:76 | ...::new(...) | test.rs:185:32:185:88 | ... .split(...) | provenance | MaD:31 | | test.rs:185:32:185:88 | ... .split(...) | test.rs:185:13:185:28 | mut reader_split | provenance | | -| test.rs:185:58:185:75 | ...::stdin(...) | test.rs:185:32:185:76 | ...::new(...) | provenance | MaD:38 | +| test.rs:185:58:185:75 | ...::stdin(...) | test.rs:185:32:185:76 | ...::new(...) | provenance | MaD:16 | | test.rs:185:58:185:75 | ...::stdin(...) | test.rs:185:58:185:75 | ...::stdin(...) | provenance | Src:MaD:2 | -| test.rs:186:14:186:25 | reader_split | test.rs:186:14:186:40 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:40 | +| test.rs:186:14:186:25 | reader_split | test.rs:186:14:186:40 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:18 | | test.rs:186:14:186:40 | reader_split.next_segment() [future, Ok, Some] | test.rs:186:14:186:46 | await ... [Ok, Some] | provenance | | | test.rs:186:14:186:46 | await ... [Ok, Some] | test.rs:186:14:186:47 | TryExpr [Some] | provenance | | -| test.rs:186:14:186:47 | TryExpr [Some] | test.rs:186:14:186:56 | ... .unwrap() | provenance | MaD:25 | +| test.rs:186:14:186:47 | TryExpr [Some] | test.rs:186:14:186:56 | ... .unwrap() | provenance | MaD:3 | | test.rs:187:19:187:29 | Some(...) [Some] | test.rs:187:24:187:28 | chunk | provenance | | | test.rs:187:24:187:28 | chunk | test.rs:188:18:188:22 | chunk | provenance | | -| test.rs:187:33:187:44 | reader_split | test.rs:187:33:187:59 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:40 | +| test.rs:187:33:187:44 | reader_split | test.rs:187:33:187:59 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:18 | | test.rs:187:33:187:59 | reader_split.next_segment() [future, Ok, Some] | test.rs:187:33:187:65 | await ... [Ok, Some] | provenance | | | test.rs:187:33:187:65 | await ... [Ok, Some] | test.rs:187:33:187:66 | TryExpr [Some] | provenance | | | test.rs:187:33:187:66 | TryExpr [Some] | test.rs:187:19:187:29 | Some(...) [Some] | provenance | | | test.rs:193:13:193:18 | reader | test.rs:194:25:194:30 | reader | provenance | | | test.rs:193:22:193:66 | ...::new(...) | test.rs:193:13:193:18 | reader | provenance | | -| test.rs:193:48:193:65 | ...::stdin(...) | test.rs:193:22:193:66 | ...::new(...) | provenance | MaD:38 | +| test.rs:193:48:193:65 | ...::stdin(...) | test.rs:193:22:193:66 | ...::new(...) | provenance | MaD:16 | | test.rs:193:48:193:65 | ...::stdin(...) | test.rs:193:48:193:65 | ...::stdin(...) | provenance | Src:MaD:2 | | test.rs:194:13:194:21 | mut lines | test.rs:195:14:195:18 | lines | provenance | | | test.rs:194:13:194:21 | mut lines | test.rs:196:32:196:36 | lines | provenance | | -| test.rs:194:25:194:30 | reader | test.rs:194:25:194:38 | reader.lines() | provenance | MaD:12 | +| test.rs:194:25:194:30 | reader | test.rs:194:25:194:38 | reader.lines() | provenance | MaD:28 | | test.rs:194:25:194:38 | reader.lines() | test.rs:194:13:194:21 | mut lines | provenance | | -| test.rs:195:14:195:18 | lines | test.rs:195:14:195:30 | lines.next_line() [future, Ok, Some] | provenance | MaD:39 | +| test.rs:195:14:195:18 | lines | test.rs:195:14:195:30 | lines.next_line() [future, Ok, Some] | provenance | MaD:17 | | test.rs:195:14:195:30 | lines.next_line() [future, Ok, Some] | test.rs:195:14:195:36 | await ... [Ok, Some] | provenance | | | test.rs:195:14:195:36 | await ... [Ok, Some] | test.rs:195:14:195:37 | TryExpr [Some] | provenance | | -| test.rs:195:14:195:37 | TryExpr [Some] | test.rs:195:14:195:46 | ... .unwrap() | provenance | MaD:25 | +| test.rs:195:14:195:37 | TryExpr [Some] | test.rs:195:14:195:46 | ... .unwrap() | provenance | MaD:3 | | test.rs:196:19:196:28 | Some(...) [Some] | test.rs:196:24:196:27 | line | provenance | | | test.rs:196:24:196:27 | line | test.rs:197:18:197:21 | line | provenance | | -| test.rs:196:32:196:36 | lines | test.rs:196:32:196:48 | lines.next_line() [future, Ok, Some] | provenance | MaD:39 | +| test.rs:196:32:196:36 | lines | test.rs:196:32:196:48 | lines.next_line() [future, Ok, Some] | provenance | MaD:17 | | test.rs:196:32:196:48 | lines.next_line() [future, Ok, Some] | test.rs:196:32:196:54 | await ... [Ok, Some] | provenance | | | test.rs:196:32:196:54 | await ... [Ok, Some] | test.rs:196:32:196:55 | TryExpr [Some] | provenance | | | test.rs:196:32:196:55 | TryExpr [Some] | test.rs:196:19:196:28 | Some(...) [Some] | provenance | | diff --git a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected index 49c37938199e..1a4b8bf8faac 100644 --- a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected @@ -1,14 +1,14 @@ models -| 1 | Source: <_ as warp::filter::Filter>::and_then; Argument[0].Parameter[0..7]; remote | -| 2 | Source: <_ as warp::filter::Filter>::map; Argument[0].Parameter[0..7]; remote | -| 3 | Source: <_ as warp::filter::Filter>::then; Argument[0].Parameter[0..7]; remote | -| 4 | Source: ::to; Argument[0].Parameter[0..7]; remote | -| 5 | Source: ::to; Argument[0].Parameter[0..7]; remote | -| 6 | Source: ::get; Argument[0].Parameter[0..7]; remote | -| 7 | Source: ::on; Argument[1].Parameter[0..7]; remote | -| 8 | Source: axum::routing::method_routing::get; Argument[0].Parameter[0..7]; remote | -| 9 | Source: axum::routing::method_routing::post; Argument[0].Parameter[0..7]; remote | -| 10 | Source: axum::routing::method_routing::put; Argument[0].Parameter[0..7]; remote | +| 1 | Source: ::to; Argument[0].Parameter[0..7]; remote | +| 2 | Source: ::to; Argument[0].Parameter[0..7]; remote | +| 3 | Source: ::get; Argument[0].Parameter[0..7]; remote | +| 4 | Source: ::on; Argument[1].Parameter[0..7]; remote | +| 5 | Source: axum::routing::method_routing::get; Argument[0].Parameter[0..7]; remote | +| 6 | Source: axum::routing::method_routing::post; Argument[0].Parameter[0..7]; remote | +| 7 | Source: axum::routing::method_routing::put; Argument[0].Parameter[0..7]; remote | +| 8 | Source: warp::filter::Filter::and_then; Argument[0].Parameter[0..7]; remote | +| 9 | Source: warp::filter::Filter::map; Argument[0].Parameter[0..7]; remote | +| 10 | Source: warp::filter::Filter::then; Argument[0].Parameter[0..7]; remote | | 11 | Summary: ::into_inner; Argument[self]; ReturnValue; taint | | 12 | Summary: ::as_bytes; Argument[self].Reference; ReturnValue.Reference.Element; taint | | 13 | Summary: ::as_str; Argument[self].Reference; ReturnValue.Reference; taint | @@ -36,29 +36,29 @@ edges | test.rs:107:13:107:18 | TuplePat | test.rs:110:14:110:14 | b | provenance | | | test.rs:107:22:107:25 | path | test.rs:107:22:107:38 | path.into_inner() | provenance | MaD:11 | | test.rs:107:22:107:38 | path.into_inner() | test.rs:107:13:107:18 | TuplePat | provenance | | -| test.rs:122:14:122:31 | my_actix_handler_4 | test.rs:123:17:123:20 | path | provenance | Src:MaD:4 | +| test.rs:122:14:122:31 | my_actix_handler_4 | test.rs:123:17:123:20 | path | provenance | Src:MaD:1 | | test.rs:123:13:123:13 | a | test.rs:124:14:124:14 | a | provenance | | | test.rs:123:17:123:20 | path | test.rs:123:17:123:33 | path.into_inner() | provenance | MaD:11 | | test.rs:123:17:123:33 | path.into_inner() | test.rs:123:13:123:13 | a | provenance | | -| test.rs:131:44:131:61 | my_actix_handler_1 | test.rs:98:17:98:20 | path | provenance | Src:MaD:5 | -| test.rs:132:48:132:65 | my_actix_handler_2 | test.rs:107:22:107:25 | path | provenance | Src:MaD:5 | -| test.rs:133:44:133:61 | my_actix_handler_3 | test.rs:116:14:116:14 | a | provenance | Src:MaD:5 | +| test.rs:131:44:131:61 | my_actix_handler_1 | test.rs:98:17:98:20 | path | provenance | Src:MaD:2 | +| test.rs:132:48:132:65 | my_actix_handler_2 | test.rs:107:22:107:25 | path | provenance | Src:MaD:2 | +| test.rs:133:44:133:61 | my_actix_handler_3 | test.rs:116:14:116:14 | a | provenance | Src:MaD:2 | | test.rs:148:14:148:14 | a | test.rs:148:14:148:23 | a.as_str() | provenance | MaD:13 | | test.rs:149:14:149:14 | a | test.rs:149:14:149:25 | a.as_bytes() | provenance | MaD:12 | -| test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:148:14:148:14 | a | provenance | Src:MaD:8 | -| test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:149:14:149:14 | a | provenance | Src:MaD:8 | -| test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:150:14:150:14 | a | provenance | Src:MaD:8 | -| test.rs:201:39:201:55 | my_axum_handler_2 | test.rs:156:14:156:14 | a | provenance | Src:MaD:9 | -| test.rs:201:39:201:55 | my_axum_handler_2 | test.rs:157:14:157:14 | b | provenance | Src:MaD:9 | -| test.rs:202:33:202:49 | my_axum_handler_3 | test.rs:164:18:164:20 | key | provenance | Src:MaD:10 | -| test.rs:202:33:202:49 | my_axum_handler_3 | test.rs:165:18:165:22 | value | provenance | Src:MaD:10 | -| test.rs:205:65:205:81 | my_axum_handler_5 | test.rs:181:14:181:20 | payload | provenance | Src:MaD:7 | -| test.rs:207:33:207:49 | my_axum_handler_6 | test.rs:187:14:187:17 | body | provenance | Src:MaD:8 | -| test.rs:207:56:207:72 | my_axum_handler_7 | test.rs:193:14:193:17 | body | provenance | Src:MaD:6 | -| test.rs:222:37:227:9 | \|...\| ... | test.rs:224:18:224:18 | a | provenance | Src:MaD:2 | -| test.rs:231:13:235:13 | \|...\| ... | test.rs:232:22:232:22 | a | provenance | Src:MaD:3 | -| test.rs:240:13:248:9 | \|...\| ... | test.rs:243:22:243:23 | id | provenance | Src:MaD:1 | -| test.rs:253:13:258:14 | \|...\| ... | test.rs:255:22:255:22 | a | provenance | Src:MaD:2 | +| test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:148:14:148:14 | a | provenance | Src:MaD:5 | +| test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:149:14:149:14 | a | provenance | Src:MaD:5 | +| test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:150:14:150:14 | a | provenance | Src:MaD:5 | +| test.rs:201:39:201:55 | my_axum_handler_2 | test.rs:156:14:156:14 | a | provenance | Src:MaD:6 | +| test.rs:201:39:201:55 | my_axum_handler_2 | test.rs:157:14:157:14 | b | provenance | Src:MaD:6 | +| test.rs:202:33:202:49 | my_axum_handler_3 | test.rs:164:18:164:20 | key | provenance | Src:MaD:7 | +| test.rs:202:33:202:49 | my_axum_handler_3 | test.rs:165:18:165:22 | value | provenance | Src:MaD:7 | +| test.rs:205:65:205:81 | my_axum_handler_5 | test.rs:181:14:181:20 | payload | provenance | Src:MaD:4 | +| test.rs:207:33:207:49 | my_axum_handler_6 | test.rs:187:14:187:17 | body | provenance | Src:MaD:5 | +| test.rs:207:56:207:72 | my_axum_handler_7 | test.rs:193:14:193:17 | body | provenance | Src:MaD:3 | +| test.rs:222:37:227:9 | \|...\| ... | test.rs:224:18:224:18 | a | provenance | Src:MaD:9 | +| test.rs:231:13:235:13 | \|...\| ... | test.rs:232:22:232:22 | a | provenance | Src:MaD:10 | +| test.rs:240:13:248:9 | \|...\| ... | test.rs:243:22:243:23 | id | provenance | Src:MaD:8 | +| test.rs:253:13:258:14 | \|...\| ... | test.rs:255:22:255:22 | a | provenance | Src:MaD:9 | nodes | test.rs:11:31:11:31 | a | semmle.label | a | | test.rs:13:14:13:14 | a | semmle.label | a | diff --git a/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected b/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected index 4f8a04f22ab3..55d2b7cd679e 100644 --- a/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected +++ b/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected @@ -1,42 +1,42 @@ models -| 1 | Summary: <_ as alloc::string::ToString>::to_string; Argument[self].Reference; ReturnValue; taint | -| 2 | Summary: <_ as core::ops::index::Index>::index; Argument[self].Reference.Element; ReturnValue.Reference; value | -| 3 | Summary: ::from; Argument[0].Field[alloc::borrow::Cow::Owned(0)]; ReturnValue; value | -| 4 | Summary: ::add; Argument[0].Reference; ReturnValue; taint | -| 5 | Summary: ::add; Argument[self]; ReturnValue; taint | -| 6 | Summary: ::as_str; Argument[self].Reference; ReturnValue.Reference; taint | -| 7 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | -| 8 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | +| 1 | Summary: ::from; Argument[0].Field[alloc::borrow::Cow::Owned(0)]; ReturnValue; value | +| 2 | Summary: ::add; Argument[0].Reference; ReturnValue; taint | +| 3 | Summary: ::add; Argument[self]; ReturnValue; taint | +| 4 | Summary: ::as_str; Argument[self].Reference; ReturnValue.Reference; taint | +| 5 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 6 | Summary: alloc::string::ToString::to_string; Argument[self].Reference; ReturnValue; taint | +| 7 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | +| 8 | Summary: core::ops::index::Index::index; Argument[self].Reference.Element; ReturnValue.Reference; value | edges | main.rs:27:9:27:9 | s | main.rs:28:19:28:19 | s | provenance | | | main.rs:27:9:27:9 | s | main.rs:28:19:28:25 | s[...] | provenance | | | main.rs:27:13:27:22 | source(...) | main.rs:27:9:27:9 | s | provenance | | | main.rs:28:9:28:14 | sliced [&ref] | main.rs:29:16:29:21 | sliced | provenance | | | main.rs:28:18:28:25 | &... [&ref] | main.rs:28:9:28:14 | sliced [&ref] | provenance | | -| main.rs:28:19:28:19 | s | main.rs:28:19:28:25 | s[...] | provenance | MaD:2 | +| main.rs:28:19:28:19 | s | main.rs:28:19:28:25 | s[...] | provenance | MaD:8 | | main.rs:28:19:28:25 | s[...] | main.rs:28:18:28:25 | &... [&ref] | provenance | | | main.rs:33:9:33:10 | s1 | main.rs:36:14:36:15 | s1 | provenance | | | main.rs:33:14:33:23 | source(...) | main.rs:33:9:33:10 | s1 | provenance | | | main.rs:36:9:36:10 | s4 | main.rs:39:10:39:11 | s4 | provenance | | -| main.rs:36:14:36:15 | s1 | main.rs:36:14:36:20 | ... + ... | provenance | MaD:5 | +| main.rs:36:14:36:15 | s1 | main.rs:36:14:36:20 | ... + ... | provenance | MaD:3 | | main.rs:36:14:36:20 | ... + ... | main.rs:36:9:36:10 | s4 | provenance | | | main.rs:44:9:44:10 | s1 | main.rs:47:34:47:35 | s1 | provenance | | | main.rs:44:14:44:23 | source(...) | main.rs:44:9:44:10 | s1 | provenance | | -| main.rs:47:33:47:35 | &s1 [&ref] | main.rs:47:10:47:35 | ... + ... | provenance | MaD:4 | +| main.rs:47:33:47:35 | &s1 [&ref] | main.rs:47:10:47:35 | ... + ... | provenance | MaD:2 | | main.rs:47:34:47:35 | s1 | main.rs:47:33:47:35 | &s1 [&ref] | provenance | | | main.rs:52:9:52:10 | s1 | main.rs:53:27:53:28 | s1 | provenance | | | main.rs:52:14:52:29 | source_slice(...) | main.rs:52:9:52:10 | s1 | provenance | | | main.rs:53:9:53:10 | s2 | main.rs:54:10:54:11 | s2 | provenance | | | main.rs:53:14:53:29 | ...::from(...) | main.rs:53:9:53:10 | s2 | provenance | | -| main.rs:53:27:53:28 | s1 | main.rs:53:14:53:29 | ...::from(...) | provenance | MaD:3 | +| main.rs:53:27:53:28 | s1 | main.rs:53:14:53:29 | ...::from(...) | provenance | MaD:1 | | main.rs:58:9:58:10 | s1 | main.rs:59:14:59:15 | s1 | provenance | | | main.rs:58:14:58:29 | source_slice(...) | main.rs:58:9:58:10 | s1 | provenance | | | main.rs:59:9:59:10 | s2 | main.rs:60:10:60:11 | s2 | provenance | | -| main.rs:59:14:59:15 | s1 | main.rs:59:14:59:27 | s1.to_string() | provenance | MaD:1 | +| main.rs:59:14:59:15 | s1 | main.rs:59:14:59:27 | s1.to_string() | provenance | MaD:6 | | main.rs:59:14:59:27 | s1.to_string() | main.rs:59:9:59:10 | s2 | provenance | | | main.rs:64:9:64:9 | s | main.rs:65:16:65:16 | s | provenance | | | main.rs:64:13:64:22 | source(...) | main.rs:64:9:64:9 | s | provenance | | -| main.rs:65:16:65:16 | s | main.rs:65:16:65:25 | s.as_str() | provenance | MaD:6 | +| main.rs:65:16:65:16 | s | main.rs:65:16:65:25 | s.as_str() | provenance | MaD:4 | | main.rs:69:9:69:9 | s | main.rs:71:34:71:61 | MacroExpr | provenance | | | main.rs:69:9:69:9 | s | main.rs:74:34:74:59 | MacroExpr | provenance | | | main.rs:69:9:69:9 | s | main.rs:81:39:81:64 | MacroExpr | provenance | | @@ -44,32 +44,32 @@ edges | main.rs:69:13:69:22 | source(...) | main.rs:69:9:69:9 | s | provenance | | | main.rs:71:9:71:18 | formatted1 | main.rs:72:10:72:19 | formatted1 | provenance | | | main.rs:71:22:71:62 | ...::format(...) | main.rs:71:9:71:18 | formatted1 | provenance | | -| main.rs:71:34:71:61 | MacroExpr | main.rs:71:22:71:62 | ...::format(...) | provenance | MaD:7 | +| main.rs:71:34:71:61 | MacroExpr | main.rs:71:22:71:62 | ...::format(...) | provenance | MaD:5 | | main.rs:74:9:74:18 | formatted2 | main.rs:75:10:75:19 | formatted2 | provenance | | | main.rs:74:22:74:60 | ...::format(...) | main.rs:74:9:74:18 | formatted2 | provenance | | -| main.rs:74:34:74:59 | MacroExpr | main.rs:74:22:74:60 | ...::format(...) | provenance | MaD:7 | +| main.rs:74:34:74:59 | MacroExpr | main.rs:74:22:74:60 | ...::format(...) | provenance | MaD:5 | | main.rs:77:9:77:13 | width | main.rs:78:34:78:74 | MacroExpr | provenance | | | main.rs:77:17:77:32 | source_usize(...) | main.rs:77:9:77:13 | width | provenance | | | main.rs:78:9:78:18 | formatted3 | main.rs:79:10:79:19 | formatted3 | provenance | | | main.rs:78:22:78:75 | ...::format(...) | main.rs:78:9:78:18 | formatted3 | provenance | | -| main.rs:78:34:78:74 | MacroExpr | main.rs:78:22:78:75 | ...::format(...) | provenance | MaD:7 | +| main.rs:78:34:78:74 | MacroExpr | main.rs:78:22:78:75 | ...::format(...) | provenance | MaD:5 | | main.rs:81:9:81:18 | formatted4 | main.rs:82:10:82:19 | formatted4 | provenance | | | main.rs:81:22:81:65 | ...::format(...) | main.rs:81:9:81:18 | formatted4 | provenance | | -| main.rs:81:39:81:64 | MacroExpr | main.rs:81:22:81:65 | ...::format(...) | provenance | MaD:7 | +| main.rs:81:39:81:64 | MacroExpr | main.rs:81:22:81:65 | ...::format(...) | provenance | MaD:5 | | main.rs:84:9:84:18 | formatted5 | main.rs:85:10:85:19 | formatted5 | provenance | | | main.rs:84:22:84:67 | ...::format(...) | main.rs:84:9:84:18 | formatted5 | provenance | | -| main.rs:84:41:84:66 | MacroExpr | main.rs:84:22:84:67 | ...::format(...) | provenance | MaD:7 | +| main.rs:84:41:84:66 | MacroExpr | main.rs:84:22:84:67 | ...::format(...) | provenance | MaD:5 | | main.rs:89:9:89:10 | s1 | main.rs:93:18:93:25 | MacroExpr | provenance | | | main.rs:89:9:89:10 | s1 | main.rs:94:18:94:32 | MacroExpr | provenance | | | main.rs:89:14:89:23 | source(...) | main.rs:89:9:89:10 | s1 | provenance | | | main.rs:93:18:93:25 | ...::format(...) | main.rs:93:18:93:25 | { ... } | provenance | | | main.rs:93:18:93:25 | ...::must_use(...) | main.rs:93:10:93:26 | MacroExpr | provenance | | -| main.rs:93:18:93:25 | MacroExpr | main.rs:93:18:93:25 | ...::format(...) | provenance | MaD:7 | -| main.rs:93:18:93:25 | { ... } | main.rs:93:18:93:25 | ...::must_use(...) | provenance | MaD:8 | +| main.rs:93:18:93:25 | MacroExpr | main.rs:93:18:93:25 | ...::format(...) | provenance | MaD:5 | +| main.rs:93:18:93:25 | { ... } | main.rs:93:18:93:25 | ...::must_use(...) | provenance | MaD:7 | | main.rs:94:18:94:32 | ...::format(...) | main.rs:94:18:94:32 | { ... } | provenance | | | main.rs:94:18:94:32 | ...::must_use(...) | main.rs:94:10:94:33 | MacroExpr | provenance | | -| main.rs:94:18:94:32 | MacroExpr | main.rs:94:18:94:32 | ...::format(...) | provenance | MaD:7 | -| main.rs:94:18:94:32 | { ... } | main.rs:94:18:94:32 | ...::must_use(...) | provenance | MaD:8 | +| main.rs:94:18:94:32 | MacroExpr | main.rs:94:18:94:32 | ...::format(...) | provenance | MaD:5 | +| main.rs:94:18:94:32 | { ... } | main.rs:94:18:94:32 | ...::must_use(...) | provenance | MaD:7 | nodes | main.rs:27:9:27:9 | s | semmle.label | s | | main.rs:27:13:27:22 | source(...) | semmle.label | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/taint/inline-taint-flow.expected b/rust/ql/test/library-tests/dataflow/taint/inline-taint-flow.expected index 763bff966d3f..360578746a53 100644 --- a/rust/ql/test/library-tests/dataflow/taint/inline-taint-flow.expected +++ b/rust/ql/test/library-tests/dataflow/taint/inline-taint-flow.expected @@ -1,61 +1,61 @@ models -| 1 | Summary: <_ as core::ops::arith::Add>::add; Argument[self,0].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | -| 2 | Summary: <_ as core::ops::arith::Add>::add; Argument[self,0]; ReturnValue; taint | -| 3 | Summary: <_ as core::ops::arith::AddAssign>::add_assign; Argument[0].Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | -| 4 | Summary: <_ as core::ops::arith::AddAssign>::add_assign; Argument[0]; Argument[self].Reference; taint | -| 5 | Summary: <_ as core::ops::arith::AddAssign>::add_assign; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | -| 6 | Summary: <_ as core::ops::arith::AddAssign>::add_assign; Argument[self].Reference; Argument[self].Reference; taint | -| 7 | Summary: <_ as core::ops::arith::Mul>::mul; Argument[self,0]; ReturnValue; taint | -| 8 | Summary: <_ as core::ops::arith::MulAssign>::mul_assign; Argument[0]; Argument[self].Reference; taint | -| 9 | Summary: <_ as core::ops::arith::MulAssign>::mul_assign; Argument[self].Reference; Argument[self].Reference; taint | -| 10 | Summary: <_ as core::ops::arith::Neg>::neg; Argument[self]; ReturnValue; taint | -| 11 | Summary: <_ as core::ops::arith::Sub>::sub; Argument[self,0]; ReturnValue; taint | -| 12 | Summary: <_ as core::ops::arith::SubAssign>::sub_assign; Argument[0]; Argument[self].Reference; taint | -| 13 | Summary: <_ as core::ops::arith::SubAssign>::sub_assign; Argument[self].Reference; Argument[self].Reference; taint | -| 14 | Summary: <_ as core::ops::bit::BitAnd>::bitand; Argument[self,0].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | -| 15 | Summary: <_ as core::ops::bit::BitAndAssign>::bitand_assign; Argument[0].Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | -| 16 | Summary: <_ as core::ops::bit::BitAndAssign>::bitand_assign; Argument[0]; Argument[self].Reference; taint | -| 17 | Summary: <_ as core::ops::bit::BitAndAssign>::bitand_assign; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | -| 18 | Summary: <_ as core::ops::bit::BitAndAssign>::bitand_assign; Argument[self].Reference; Argument[self].Reference; taint | -| 19 | Summary: <_ as core::ops::bit::BitOr>::bitor; Argument[self,0]; ReturnValue; taint | -| 20 | Summary: <_ as core::ops::bit::BitXor>::bitxor; Argument[self,0]; ReturnValue; taint | -| 21 | Summary: <_ as core::ops::bit::BitXorAssign>::bitxor_assign; Argument[0]; Argument[self].Reference; taint | -| 22 | Summary: <_ as core::ops::bit::BitXorAssign>::bitxor_assign; Argument[self].Reference; Argument[self].Reference; taint | -| 23 | Summary: <_ as core::ops::bit::Not>::not; Argument[self]; ReturnValue; taint | -| 24 | Summary: <_ as core::ops::bit::Shl>::shl; Argument[self,0].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | -| 25 | Summary: <_ as core::ops::bit::Shl>::shl; Argument[self,0]; ReturnValue; taint | -| 26 | Summary: <_ as core::ops::bit::ShlAssign>::shl_assign; Argument[0].Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | -| 27 | Summary: <_ as core::ops::bit::ShlAssign>::shl_assign; Argument[0]; Argument[self].Reference; taint | -| 28 | Summary: <_ as core::ops::bit::ShlAssign>::shl_assign; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | -| 29 | Summary: <_ as core::ops::bit::ShlAssign>::shl_assign; Argument[self].Reference; Argument[self].Reference; taint | -| 30 | Summary: <_ as core::ops::bit::Shr>::shr; Argument[self,0]; ReturnValue; taint | -| 31 | Summary: <_ as core::ops::bit::ShrAssign>::shr_assign; Argument[0]; Argument[self].Reference; taint | -| 32 | Summary: <_ as core::ops::bit::ShrAssign>::shr_assign; Argument[self].Reference; Argument[self].Reference; taint | -| 33 | Summary: <_ as core::ops::index::Index>::index; Argument[self].Reference.Element; ReturnValue.Reference; value | -| 34 | Summary: ::neg; Argument[self].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | -| 35 | Summary: ::not; Argument[self].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | +| 1 | Summary: ::neg; Argument[self].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | +| 2 | Summary: ::not; Argument[self].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | +| 3 | Summary: core::ops::arith::Add::add; Argument[self,0].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | +| 4 | Summary: core::ops::arith::Add::add; Argument[self,0]; ReturnValue; taint | +| 5 | Summary: core::ops::arith::AddAssign::add_assign; Argument[0].Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | +| 6 | Summary: core::ops::arith::AddAssign::add_assign; Argument[0]; Argument[self].Reference; taint | +| 7 | Summary: core::ops::arith::AddAssign::add_assign; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | +| 8 | Summary: core::ops::arith::AddAssign::add_assign; Argument[self].Reference; Argument[self].Reference; taint | +| 9 | Summary: core::ops::arith::Mul::mul; Argument[self,0]; ReturnValue; taint | +| 10 | Summary: core::ops::arith::MulAssign::mul_assign; Argument[0]; Argument[self].Reference; taint | +| 11 | Summary: core::ops::arith::MulAssign::mul_assign; Argument[self].Reference; Argument[self].Reference; taint | +| 12 | Summary: core::ops::arith::Neg::neg; Argument[self]; ReturnValue; taint | +| 13 | Summary: core::ops::arith::Sub::sub; Argument[self,0]; ReturnValue; taint | +| 14 | Summary: core::ops::arith::SubAssign::sub_assign; Argument[0]; Argument[self].Reference; taint | +| 15 | Summary: core::ops::arith::SubAssign::sub_assign; Argument[self].Reference; Argument[self].Reference; taint | +| 16 | Summary: core::ops::bit::BitAnd::bitand; Argument[self,0].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | +| 17 | Summary: core::ops::bit::BitAndAssign::bitand_assign; Argument[0].Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | +| 18 | Summary: core::ops::bit::BitAndAssign::bitand_assign; Argument[0]; Argument[self].Reference; taint | +| 19 | Summary: core::ops::bit::BitAndAssign::bitand_assign; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | +| 20 | Summary: core::ops::bit::BitAndAssign::bitand_assign; Argument[self].Reference; Argument[self].Reference; taint | +| 21 | Summary: core::ops::bit::BitOr::bitor; Argument[self,0]; ReturnValue; taint | +| 22 | Summary: core::ops::bit::BitXor::bitxor; Argument[self,0]; ReturnValue; taint | +| 23 | Summary: core::ops::bit::BitXorAssign::bitxor_assign; Argument[0]; Argument[self].Reference; taint | +| 24 | Summary: core::ops::bit::BitXorAssign::bitxor_assign; Argument[self].Reference; Argument[self].Reference; taint | +| 25 | Summary: core::ops::bit::Not::not; Argument[self]; ReturnValue; taint | +| 26 | Summary: core::ops::bit::Shl::shl; Argument[self,0].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | +| 27 | Summary: core::ops::bit::Shl::shl; Argument[self,0]; ReturnValue; taint | +| 28 | Summary: core::ops::bit::ShlAssign::shl_assign; Argument[0].Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | +| 29 | Summary: core::ops::bit::ShlAssign::shl_assign; Argument[0]; Argument[self].Reference; taint | +| 30 | Summary: core::ops::bit::ShlAssign::shl_assign; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | +| 31 | Summary: core::ops::bit::ShlAssign::shl_assign; Argument[self].Reference; Argument[self].Reference; taint | +| 32 | Summary: core::ops::bit::Shr::shr; Argument[self,0]; ReturnValue; taint | +| 33 | Summary: core::ops::bit::ShrAssign::shr_assign; Argument[0]; Argument[self].Reference; taint | +| 34 | Summary: core::ops::bit::ShrAssign::shr_assign; Argument[self].Reference; Argument[self].Reference; taint | +| 35 | Summary: core::ops::index::Index::index; Argument[self].Reference.Element; ReturnValue.Reference; value | edges | main.rs:12:9:12:9 | a | main.rs:13:10:13:10 | a | provenance | | | main.rs:12:9:12:9 | a | main.rs:14:14:14:14 | a | provenance | | | main.rs:12:13:12:22 | source(...) | main.rs:12:9:12:9 | a | provenance | | -| main.rs:13:10:13:10 | a | main.rs:13:10:13:14 | ... + ... | provenance | MaD:2 | -| main.rs:14:14:14:14 | a | main.rs:14:10:14:14 | ... + ... | provenance | MaD:2 | +| main.rs:13:10:13:10 | a | main.rs:13:10:13:14 | ... + ... | provenance | MaD:4 | +| main.rs:14:14:14:14 | a | main.rs:14:10:14:14 | ... + ... | provenance | MaD:4 | | main.rs:16:9:16:13 | mut b | main.rs:17:5:17:5 | b | provenance | | | main.rs:16:17:16:26 | source(...) | main.rs:16:9:16:13 | mut b | provenance | | -| main.rs:17:5:17:5 | b | main.rs:18:10:18:10 | b | provenance | MaD:6 | -| main.rs:21:10:21:19 | source(...) | main.rs:22:10:22:10 | c | provenance | MaD:4 | +| main.rs:17:5:17:5 | b | main.rs:18:10:18:10 | b | provenance | MaD:8 | +| main.rs:21:10:21:19 | source(...) | main.rs:22:10:22:10 | c | provenance | MaD:6 | | main.rs:26:9:26:9 | a | main.rs:27:11:27:11 | a | provenance | | | main.rs:26:13:26:21 | source(...) | main.rs:26:9:26:9 | a | provenance | | -| main.rs:27:11:27:11 | a | main.rs:27:10:27:11 | - ... | provenance | MaD:10 | -| main.rs:29:11:29:19 | source(...) | main.rs:29:10:29:19 | ! ... | provenance | MaD:23 | -| main.rs:31:10:31:18 | source(...) | main.rs:31:10:31:22 | ... - ... | provenance | MaD:11 | -| main.rs:32:17:32:25 | source(...) | main.rs:32:10:32:25 | ... - ... | provenance | MaD:11 | -| main.rs:34:10:34:18 | source(...) | main.rs:34:10:34:22 | ... * ... | provenance | MaD:7 | -| main.rs:35:17:35:25 | source(...) | main.rs:35:10:35:25 | ... * ... | provenance | MaD:7 | -| main.rs:37:10:37:18 | source(...) | main.rs:37:10:37:23 | ... << ... | provenance | MaD:25 | -| main.rs:38:18:38:26 | source(...) | main.rs:38:10:38:26 | ... << ... | provenance | MaD:25 | -| main.rs:40:10:40:18 | source(...) | main.rs:40:10:40:22 | ... ^ ... | provenance | MaD:20 | -| main.rs:41:18:41:27 | source(...) | main.rs:41:10:41:27 | ... ^ ... | provenance | MaD:20 | +| main.rs:27:11:27:11 | a | main.rs:27:10:27:11 | - ... | provenance | MaD:12 | +| main.rs:29:11:29:19 | source(...) | main.rs:29:10:29:19 | ! ... | provenance | MaD:25 | +| main.rs:31:10:31:18 | source(...) | main.rs:31:10:31:22 | ... - ... | provenance | MaD:13 | +| main.rs:32:17:32:25 | source(...) | main.rs:32:10:32:25 | ... - ... | provenance | MaD:13 | +| main.rs:34:10:34:18 | source(...) | main.rs:34:10:34:22 | ... * ... | provenance | MaD:9 | +| main.rs:35:17:35:25 | source(...) | main.rs:35:10:35:25 | ... * ... | provenance | MaD:9 | +| main.rs:37:10:37:18 | source(...) | main.rs:37:10:37:23 | ... << ... | provenance | MaD:27 | +| main.rs:38:18:38:26 | source(...) | main.rs:38:10:38:26 | ... << ... | provenance | MaD:27 | +| main.rs:40:10:40:18 | source(...) | main.rs:40:10:40:22 | ... ^ ... | provenance | MaD:22 | +| main.rs:41:18:41:27 | source(...) | main.rs:41:10:41:27 | ... ^ ... | provenance | MaD:22 | | main.rs:45:9:45:9 | a | main.rs:46:9:46:9 | b | provenance | | | main.rs:45:13:45:22 | source(...) | main.rs:45:9:45:9 | a | provenance | | | main.rs:46:9:46:9 | b | main.rs:47:10:47:17 | b as i64 | provenance | | @@ -64,11 +64,11 @@ edges | main.rs:60:17:60:26 | source(...) | main.rs:60:13:60:13 | s | provenance | | | main.rs:61:13:61:18 | sliced [&ref] | main.rs:62:14:62:19 | sliced | provenance | | | main.rs:61:22:61:29 | &... [&ref] | main.rs:61:13:61:18 | sliced [&ref] | provenance | | -| main.rs:61:23:61:23 | s | main.rs:61:23:61:29 | s[...] | provenance | MaD:33 | +| main.rs:61:23:61:23 | s | main.rs:61:23:61:29 | s[...] | provenance | MaD:35 | | main.rs:61:23:61:29 | s[...] | main.rs:61:22:61:29 | &... [&ref] | provenance | | | main.rs:76:13:76:15 | arr | main.rs:77:14:77:16 | arr | provenance | | | main.rs:76:19:76:28 | source(...) | main.rs:76:13:76:15 | arr | provenance | | -| main.rs:77:14:77:16 | arr | main.rs:77:14:77:19 | arr[1] | provenance | MaD:33 | +| main.rs:77:14:77:16 | arr | main.rs:77:14:77:19 | arr[1] | provenance | MaD:35 | | main.rs:92:9:92:12 | [post] arr2 [element] | main.rs:93:14:93:17 | arr2 | provenance | | | main.rs:92:19:92:28 | source(...) | main.rs:92:9:92:12 | [post] arr2 [element] | provenance | | | main.rs:113:14:113:47 | TupleExpr [tuple.0] | main.rs:113:14:113:49 | ... .0 | provenance | | @@ -87,56 +87,56 @@ edges | main.rs:131:14:131:64 | TupleExpr [tuple.0] | main.rs:131:14:131:66 | ... .0 | provenance | | | main.rs:131:14:131:66 | ... .0 | main.rs:131:14:131:68 | ... .1 | provenance | | | main.rs:131:15:131:29 | source_tuple(...) | main.rs:131:14:131:64 | TupleExpr [tuple.0] | provenance | | -| main.rs:141:10:141:18 | source(...) | main.rs:141:10:141:28 | ... .add(...) | provenance | MaD:2 | -| main.rs:143:19:143:27 | source(...) | main.rs:143:10:143:28 | 1i64.add(...) | provenance | MaD:2 | -| main.rs:146:10:146:18 | source(...) | main.rs:146:10:146:28 | ... .sub(...) | provenance | MaD:11 | -| main.rs:148:19:148:27 | source(...) | main.rs:148:10:148:28 | 1i64.sub(...) | provenance | MaD:11 | -| main.rs:151:10:151:18 | source(...) | main.rs:151:10:151:28 | ... .mul(...) | provenance | MaD:7 | -| main.rs:153:19:153:27 | source(...) | main.rs:153:10:153:28 | 1i64.mul(...) | provenance | MaD:7 | -| main.rs:156:10:156:18 | source(...) | main.rs:156:10:156:28 | ... .shl(...) | provenance | MaD:25 | -| main.rs:157:10:157:18 | source(...) | main.rs:157:10:157:25 | ... .shl(...) | provenance | MaD:25 | -| main.rs:158:19:158:27 | source(...) | main.rs:158:10:158:28 | 1i64.shl(...) | provenance | MaD:25 | -| main.rs:160:10:160:18 | source(...) | main.rs:160:10:160:28 | ... .shr(...) | provenance | MaD:30 | -| main.rs:161:10:161:18 | source(...) | main.rs:161:10:161:25 | ... .shr(...) | provenance | MaD:30 | -| main.rs:162:19:162:27 | source(...) | main.rs:162:10:162:28 | 1i64.shr(...) | provenance | MaD:30 | -| main.rs:164:10:164:18 | source(...) | main.rs:164:10:164:30 | ... .bitor(...) | provenance | MaD:19 | -| main.rs:165:10:165:18 | source(...) | main.rs:165:10:165:27 | ... .bitor(...) | provenance | MaD:19 | -| main.rs:166:21:166:29 | source(...) | main.rs:166:10:166:30 | 1i64.bitor(...) | provenance | MaD:19 | -| main.rs:167:18:167:26 | source(...) | main.rs:167:10:167:27 | 1.bitor(...) | provenance | MaD:19 | +| main.rs:141:10:141:18 | source(...) | main.rs:141:10:141:28 | ... .add(...) | provenance | MaD:4 | +| main.rs:143:19:143:27 | source(...) | main.rs:143:10:143:28 | 1i64.add(...) | provenance | MaD:4 | +| main.rs:146:10:146:18 | source(...) | main.rs:146:10:146:28 | ... .sub(...) | provenance | MaD:13 | +| main.rs:148:19:148:27 | source(...) | main.rs:148:10:148:28 | 1i64.sub(...) | provenance | MaD:13 | +| main.rs:151:10:151:18 | source(...) | main.rs:151:10:151:28 | ... .mul(...) | provenance | MaD:9 | +| main.rs:153:19:153:27 | source(...) | main.rs:153:10:153:28 | 1i64.mul(...) | provenance | MaD:9 | +| main.rs:156:10:156:18 | source(...) | main.rs:156:10:156:28 | ... .shl(...) | provenance | MaD:27 | +| main.rs:157:10:157:18 | source(...) | main.rs:157:10:157:25 | ... .shl(...) | provenance | MaD:27 | +| main.rs:158:19:158:27 | source(...) | main.rs:158:10:158:28 | 1i64.shl(...) | provenance | MaD:27 | +| main.rs:160:10:160:18 | source(...) | main.rs:160:10:160:28 | ... .shr(...) | provenance | MaD:32 | +| main.rs:161:10:161:18 | source(...) | main.rs:161:10:161:25 | ... .shr(...) | provenance | MaD:32 | +| main.rs:162:19:162:27 | source(...) | main.rs:162:10:162:28 | 1i64.shr(...) | provenance | MaD:32 | +| main.rs:164:10:164:18 | source(...) | main.rs:164:10:164:30 | ... .bitor(...) | provenance | MaD:21 | +| main.rs:165:10:165:18 | source(...) | main.rs:165:10:165:27 | ... .bitor(...) | provenance | MaD:21 | +| main.rs:166:21:166:29 | source(...) | main.rs:166:10:166:30 | 1i64.bitor(...) | provenance | MaD:21 | +| main.rs:167:18:167:26 | source(...) | main.rs:167:10:167:27 | 1.bitor(...) | provenance | MaD:21 | | main.rs:170:5:170:5 | [post] a | main.rs:171:5:171:5 | a | provenance | | | main.rs:170:5:170:5 | [post] a | main.rs:172:5:172:5 | a | provenance | | | main.rs:170:5:170:5 | [post] a | main.rs:173:5:173:5 | a | provenance | | | main.rs:170:5:170:5 | [post] a | main.rs:174:5:174:5 | a | provenance | | | main.rs:170:5:170:5 | [post] a | main.rs:175:5:175:5 | a | provenance | | | main.rs:170:5:170:5 | [post] a | main.rs:176:10:176:10 | a | provenance | | -| main.rs:170:18:170:26 | source(...) | main.rs:170:5:170:5 | [post] a | provenance | MaD:4 | +| main.rs:170:18:170:26 | source(...) | main.rs:170:5:170:5 | [post] a | provenance | MaD:6 | | main.rs:171:5:171:5 | [post] a | main.rs:172:5:172:5 | a | provenance | | | main.rs:171:5:171:5 | [post] a | main.rs:173:5:173:5 | a | provenance | | | main.rs:171:5:171:5 | [post] a | main.rs:174:5:174:5 | a | provenance | | | main.rs:171:5:171:5 | [post] a | main.rs:175:5:175:5 | a | provenance | | | main.rs:171:5:171:5 | [post] a | main.rs:176:10:176:10 | a | provenance | | -| main.rs:171:5:171:5 | a | main.rs:171:5:171:5 | [post] a | provenance | MaD:13 | -| main.rs:171:18:171:26 | source(...) | main.rs:171:5:171:5 | [post] a | provenance | MaD:12 | +| main.rs:171:5:171:5 | a | main.rs:171:5:171:5 | [post] a | provenance | MaD:15 | +| main.rs:171:18:171:26 | source(...) | main.rs:171:5:171:5 | [post] a | provenance | MaD:14 | | main.rs:172:5:172:5 | [post] a | main.rs:173:5:173:5 | a | provenance | | | main.rs:172:5:172:5 | [post] a | main.rs:174:5:174:5 | a | provenance | | | main.rs:172:5:172:5 | [post] a | main.rs:175:5:175:5 | a | provenance | | | main.rs:172:5:172:5 | [post] a | main.rs:176:10:176:10 | a | provenance | | -| main.rs:172:5:172:5 | a | main.rs:172:5:172:5 | [post] a | provenance | MaD:9 | -| main.rs:172:18:172:26 | source(...) | main.rs:172:5:172:5 | [post] a | provenance | MaD:8 | +| main.rs:172:5:172:5 | a | main.rs:172:5:172:5 | [post] a | provenance | MaD:11 | +| main.rs:172:18:172:26 | source(...) | main.rs:172:5:172:5 | [post] a | provenance | MaD:10 | | main.rs:173:5:173:5 | [post] a | main.rs:174:5:174:5 | a | provenance | | | main.rs:173:5:173:5 | [post] a | main.rs:175:5:175:5 | a | provenance | | | main.rs:173:5:173:5 | [post] a | main.rs:176:10:176:10 | a | provenance | | -| main.rs:173:5:173:5 | a | main.rs:173:5:173:5 | [post] a | provenance | MaD:29 | -| main.rs:173:18:173:26 | source(...) | main.rs:173:5:173:5 | [post] a | provenance | MaD:27 | +| main.rs:173:5:173:5 | a | main.rs:173:5:173:5 | [post] a | provenance | MaD:31 | +| main.rs:173:18:173:26 | source(...) | main.rs:173:5:173:5 | [post] a | provenance | MaD:29 | | main.rs:174:5:174:5 | [post] a | main.rs:175:5:175:5 | a | provenance | | | main.rs:174:5:174:5 | [post] a | main.rs:176:10:176:10 | a | provenance | | -| main.rs:174:5:174:5 | a | main.rs:174:5:174:5 | [post] a | provenance | MaD:32 | -| main.rs:174:18:174:26 | source(...) | main.rs:174:5:174:5 | [post] a | provenance | MaD:31 | +| main.rs:174:5:174:5 | a | main.rs:174:5:174:5 | [post] a | provenance | MaD:34 | +| main.rs:174:18:174:26 | source(...) | main.rs:174:5:174:5 | [post] a | provenance | MaD:33 | | main.rs:175:5:175:5 | [post] a | main.rs:176:10:176:10 | a | provenance | | -| main.rs:175:5:175:5 | a | main.rs:175:5:175:5 | [post] a | provenance | MaD:22 | -| main.rs:175:21:175:29 | source(...) | main.rs:175:5:175:5 | [post] a | provenance | MaD:21 | -| main.rs:178:10:178:18 | source(...) | main.rs:178:10:178:24 | ... .neg() | provenance | MaD:10 | -| main.rs:179:10:179:18 | source(...) | main.rs:179:10:179:24 | ... .not() | provenance | MaD:23 | +| main.rs:175:5:175:5 | a | main.rs:175:5:175:5 | [post] a | provenance | MaD:24 | +| main.rs:175:21:175:29 | source(...) | main.rs:175:5:175:5 | [post] a | provenance | MaD:23 | +| main.rs:178:10:178:18 | source(...) | main.rs:178:10:178:24 | ... .neg() | provenance | MaD:12 | +| main.rs:179:10:179:18 | source(...) | main.rs:179:10:179:24 | ... .not() | provenance | MaD:25 | | main.rs:199:13:199:17 | mut a [Wrapping] | main.rs:201:21:201:21 | a [Wrapping] | provenance | | | main.rs:199:13:199:17 | mut a [Wrapping] | main.rs:203:9:203:9 | a [Wrapping] | provenance | | | main.rs:199:13:199:17 | mut a [Wrapping] | main.rs:204:9:204:9 | a [Wrapping] | provenance | | @@ -149,52 +149,52 @@ edges | main.rs:203:9:203:9 | [post] a | main.rs:206:21:206:23 | a.0 | provenance | | | main.rs:203:9:203:9 | [post] a [Wrapping] | main.rs:204:9:204:9 | a [Wrapping] | provenance | | | main.rs:203:9:203:9 | [post] a [Wrapping] | main.rs:206:21:206:21 | a [Wrapping] | provenance | | -| main.rs:203:9:203:9 | a [Wrapping] | main.rs:203:9:203:9 | [post] a [Wrapping] | provenance | MaD:5 | -| main.rs:203:22:203:30 | source(...) | main.rs:203:9:203:9 | [post] a | provenance | MaD:4 | -| main.rs:203:22:203:30 | source(...) | main.rs:203:9:203:9 | [post] a [Wrapping] | provenance | MaD:3 | +| main.rs:203:9:203:9 | a [Wrapping] | main.rs:203:9:203:9 | [post] a [Wrapping] | provenance | MaD:7 | +| main.rs:203:22:203:30 | source(...) | main.rs:203:9:203:9 | [post] a | provenance | MaD:6 | +| main.rs:203:22:203:30 | source(...) | main.rs:203:9:203:9 | [post] a [Wrapping] | provenance | MaD:5 | | main.rs:204:9:204:9 | [post] a | main.rs:205:14:205:14 | a | provenance | | | main.rs:204:9:204:9 | [post] a | main.rs:206:21:206:23 | a.0 | provenance | | | main.rs:204:9:204:9 | [post] a [Wrapping] | main.rs:206:21:206:21 | a [Wrapping] | provenance | | -| main.rs:204:9:204:9 | a | main.rs:204:9:204:9 | [post] a | provenance | MaD:6 | -| main.rs:204:9:204:9 | a | main.rs:204:9:204:9 | [post] a [Wrapping] | provenance | MaD:5 | -| main.rs:204:9:204:9 | a [Wrapping] | main.rs:204:9:204:9 | [post] a [Wrapping] | provenance | MaD:5 | -| main.rs:204:22:204:47 | Wrapping(...) [Wrapping] | main.rs:204:9:204:9 | [post] a [Wrapping] | provenance | MaD:3 | +| main.rs:204:9:204:9 | a | main.rs:204:9:204:9 | [post] a | provenance | MaD:8 | +| main.rs:204:9:204:9 | a | main.rs:204:9:204:9 | [post] a [Wrapping] | provenance | MaD:7 | +| main.rs:204:9:204:9 | a [Wrapping] | main.rs:204:9:204:9 | [post] a [Wrapping] | provenance | MaD:7 | +| main.rs:204:22:204:47 | Wrapping(...) [Wrapping] | main.rs:204:9:204:9 | [post] a [Wrapping] | provenance | MaD:5 | | main.rs:204:31:204:46 | ...::source(...) | main.rs:204:22:204:47 | Wrapping(...) [Wrapping] | provenance | | | main.rs:206:21:206:21 | a [Wrapping] | main.rs:206:21:206:23 | a.0 | provenance | | | main.rs:208:9:208:9 | a | main.rs:209:9:209:9 | a | provenance | | | main.rs:208:13:208:21 | source(...) | main.rs:208:9:208:9 | a | provenance | | -| main.rs:209:9:209:9 | a | main.rs:210:9:210:9 | a | provenance | MaD:6 | -| main.rs:209:9:209:9 | a | main.rs:210:9:210:9 | a [Wrapping] | provenance | MaD:5 | -| main.rs:209:14:209:22 | source(...) | main.rs:210:9:210:9 | a | provenance | MaD:4 | -| main.rs:209:14:209:22 | source(...) | main.rs:210:9:210:9 | a [Wrapping] | provenance | MaD:3 | -| main.rs:210:9:210:9 | a | main.rs:211:14:211:14 | a | provenance | MaD:6 | -| main.rs:210:9:210:9 | a | main.rs:212:21:212:21 | a [Wrapping] | provenance | MaD:5 | -| main.rs:210:9:210:9 | a | main.rs:212:21:212:23 | a.0 | provenance | MaD:6 | -| main.rs:210:9:210:9 | a [Wrapping] | main.rs:212:21:212:21 | a [Wrapping] | provenance | MaD:5 | -| main.rs:210:14:210:49 | ...::Wrapping(...) [Wrapping] | main.rs:212:21:212:21 | a [Wrapping] | provenance | MaD:3 | +| main.rs:209:9:209:9 | a | main.rs:210:9:210:9 | a | provenance | MaD:8 | +| main.rs:209:9:209:9 | a | main.rs:210:9:210:9 | a [Wrapping] | provenance | MaD:7 | +| main.rs:209:14:209:22 | source(...) | main.rs:210:9:210:9 | a | provenance | MaD:6 | +| main.rs:209:14:209:22 | source(...) | main.rs:210:9:210:9 | a [Wrapping] | provenance | MaD:5 | +| main.rs:210:9:210:9 | a | main.rs:211:14:211:14 | a | provenance | MaD:8 | +| main.rs:210:9:210:9 | a | main.rs:212:21:212:21 | a [Wrapping] | provenance | MaD:7 | +| main.rs:210:9:210:9 | a | main.rs:212:21:212:23 | a.0 | provenance | MaD:8 | +| main.rs:210:9:210:9 | a [Wrapping] | main.rs:212:21:212:21 | a [Wrapping] | provenance | MaD:7 | +| main.rs:210:14:210:49 | ...::Wrapping(...) [Wrapping] | main.rs:212:21:212:21 | a [Wrapping] | provenance | MaD:5 | | main.rs:210:33:210:48 | ...::source(...) | main.rs:210:14:210:49 | ...::Wrapping(...) [Wrapping] | provenance | | | main.rs:212:21:212:21 | a [Wrapping] | main.rs:212:21:212:23 | a.0 | provenance | | | main.rs:214:9:214:9 | a | main.rs:215:9:215:9 | a | provenance | | | main.rs:214:13:214:21 | source(...) | main.rs:214:9:214:9 | a | provenance | | -| main.rs:215:9:215:9 | a | main.rs:216:9:216:9 | a | provenance | MaD:18 | -| main.rs:215:9:215:9 | a | main.rs:216:9:216:9 | a [Wrapping] | provenance | MaD:17 | -| main.rs:215:14:215:22 | source(...) | main.rs:216:9:216:9 | a | provenance | MaD:16 | -| main.rs:215:14:215:22 | source(...) | main.rs:216:9:216:9 | a [Wrapping] | provenance | MaD:15 | -| main.rs:216:9:216:9 | a | main.rs:217:14:217:14 | a | provenance | MaD:18 | -| main.rs:216:9:216:9 | a | main.rs:218:21:218:21 | a [Wrapping] | provenance | MaD:17 | -| main.rs:216:9:216:9 | a | main.rs:218:21:218:23 | a.0 | provenance | MaD:18 | -| main.rs:216:9:216:9 | a [Wrapping] | main.rs:218:21:218:21 | a [Wrapping] | provenance | MaD:17 | -| main.rs:216:14:216:39 | Wrapping(...) [Wrapping] | main.rs:218:21:218:21 | a [Wrapping] | provenance | MaD:15 | +| main.rs:215:9:215:9 | a | main.rs:216:9:216:9 | a | provenance | MaD:20 | +| main.rs:215:9:215:9 | a | main.rs:216:9:216:9 | a [Wrapping] | provenance | MaD:19 | +| main.rs:215:14:215:22 | source(...) | main.rs:216:9:216:9 | a | provenance | MaD:18 | +| main.rs:215:14:215:22 | source(...) | main.rs:216:9:216:9 | a [Wrapping] | provenance | MaD:17 | +| main.rs:216:9:216:9 | a | main.rs:217:14:217:14 | a | provenance | MaD:20 | +| main.rs:216:9:216:9 | a | main.rs:218:21:218:21 | a [Wrapping] | provenance | MaD:19 | +| main.rs:216:9:216:9 | a | main.rs:218:21:218:23 | a.0 | provenance | MaD:20 | +| main.rs:216:9:216:9 | a [Wrapping] | main.rs:218:21:218:21 | a [Wrapping] | provenance | MaD:19 | +| main.rs:216:14:216:39 | Wrapping(...) [Wrapping] | main.rs:218:21:218:21 | a [Wrapping] | provenance | MaD:17 | | main.rs:216:23:216:38 | ...::source(...) | main.rs:216:14:216:39 | Wrapping(...) [Wrapping] | provenance | | | main.rs:218:21:218:21 | a [Wrapping] | main.rs:218:21:218:23 | a.0 | provenance | | | main.rs:220:9:220:9 | a | main.rs:221:9:221:9 | a | provenance | | | main.rs:220:13:220:22 | source(...) | main.rs:220:9:220:9 | a | provenance | | -| main.rs:221:9:221:9 | a | main.rs:222:14:222:14 | a | provenance | MaD:29 | -| main.rs:221:9:221:9 | a | main.rs:223:21:223:21 | a [Wrapping] | provenance | MaD:28 | -| main.rs:221:9:221:9 | a | main.rs:223:21:223:23 | a.0 | provenance | MaD:29 | -| main.rs:221:15:221:30 | source_usize(...) | main.rs:222:14:222:14 | a | provenance | MaD:27 | -| main.rs:221:15:221:30 | source_usize(...) | main.rs:223:21:223:21 | a [Wrapping] | provenance | MaD:26 | -| main.rs:221:15:221:30 | source_usize(...) | main.rs:223:21:223:23 | a.0 | provenance | MaD:27 | +| main.rs:221:9:221:9 | a | main.rs:222:14:222:14 | a | provenance | MaD:31 | +| main.rs:221:9:221:9 | a | main.rs:223:21:223:21 | a [Wrapping] | provenance | MaD:30 | +| main.rs:221:9:221:9 | a | main.rs:223:21:223:23 | a.0 | provenance | MaD:31 | +| main.rs:221:15:221:30 | source_usize(...) | main.rs:222:14:222:14 | a | provenance | MaD:29 | +| main.rs:221:15:221:30 | source_usize(...) | main.rs:223:21:223:21 | a [Wrapping] | provenance | MaD:28 | +| main.rs:221:15:221:30 | source_usize(...) | main.rs:223:21:223:23 | a.0 | provenance | MaD:29 | | main.rs:223:21:223:21 | a [Wrapping] | main.rs:223:21:223:23 | a.0 | provenance | | | main.rs:225:13:225:13 | b [Wrapping] | main.rs:227:18:227:18 | b [Wrapping] | provenance | | | main.rs:225:13:225:13 | b [Wrapping] | main.rs:229:18:229:18 | b [Wrapping] | provenance | | @@ -212,43 +212,43 @@ edges | main.rs:226:32:226:57 | Wrapping(...) [Wrapping] | main.rs:226:13:226:13 | c [Wrapping] | provenance | | | main.rs:226:41:226:56 | ...::source(...) | main.rs:226:32:226:57 | Wrapping(...) [Wrapping] | provenance | | | main.rs:227:13:227:14 | v1 [Wrapping] | main.rs:228:21:228:22 | v1 [Wrapping] | provenance | | -| main.rs:227:18:227:18 | b [Wrapping] | main.rs:227:18:227:22 | ... + ... [Wrapping] | provenance | MaD:1 | +| main.rs:227:18:227:18 | b [Wrapping] | main.rs:227:18:227:22 | ... + ... [Wrapping] | provenance | MaD:3 | | main.rs:227:18:227:22 | ... + ... [Wrapping] | main.rs:227:13:227:14 | v1 [Wrapping] | provenance | | -| main.rs:227:22:227:22 | c [Wrapping] | main.rs:227:18:227:22 | ... + ... [Wrapping] | provenance | MaD:1 | +| main.rs:227:22:227:22 | c [Wrapping] | main.rs:227:18:227:22 | ... + ... [Wrapping] | provenance | MaD:3 | | main.rs:228:21:228:22 | v1 [Wrapping] | main.rs:228:21:228:24 | v1.0 | provenance | | | main.rs:229:13:229:14 | v2 [Wrapping] | main.rs:230:21:230:22 | v2 [Wrapping] | provenance | | -| main.rs:229:18:229:18 | b [Wrapping] | main.rs:229:18:229:25 | b.add(...) [Wrapping] | provenance | MaD:1 | +| main.rs:229:18:229:18 | b [Wrapping] | main.rs:229:18:229:25 | b.add(...) [Wrapping] | provenance | MaD:3 | | main.rs:229:18:229:25 | b.add(...) [Wrapping] | main.rs:229:13:229:14 | v2 [Wrapping] | provenance | | -| main.rs:229:24:229:24 | c [Wrapping] | main.rs:229:18:229:25 | b.add(...) [Wrapping] | provenance | MaD:1 | +| main.rs:229:24:229:24 | c [Wrapping] | main.rs:229:18:229:25 | b.add(...) [Wrapping] | provenance | MaD:3 | | main.rs:230:21:230:22 | v2 [Wrapping] | main.rs:230:21:230:24 | v2.0 | provenance | | | main.rs:231:13:231:14 | v3 [Wrapping] | main.rs:232:21:232:22 | v3 [Wrapping] | provenance | | | main.rs:231:18:231:19 | - ... [Wrapping] | main.rs:231:13:231:14 | v3 [Wrapping] | provenance | | -| main.rs:231:19:231:19 | b [Wrapping] | main.rs:231:18:231:19 | - ... [Wrapping] | provenance | MaD:34 | +| main.rs:231:19:231:19 | b [Wrapping] | main.rs:231:18:231:19 | - ... [Wrapping] | provenance | MaD:1 | | main.rs:232:21:232:22 | v3 [Wrapping] | main.rs:232:21:232:24 | v3.0 | provenance | | | main.rs:233:13:233:14 | v4 [Wrapping] | main.rs:234:21:234:22 | v4 [Wrapping] | provenance | | -| main.rs:233:18:233:18 | b [Wrapping] | main.rs:233:18:233:24 | b.neg() [Wrapping] | provenance | MaD:34 | +| main.rs:233:18:233:18 | b [Wrapping] | main.rs:233:18:233:24 | b.neg() [Wrapping] | provenance | MaD:1 | | main.rs:233:18:233:24 | b.neg() [Wrapping] | main.rs:233:13:233:14 | v4 [Wrapping] | provenance | | | main.rs:234:21:234:22 | v4 [Wrapping] | main.rs:234:21:234:24 | v4.0 | provenance | | | main.rs:235:13:235:14 | v5 [Wrapping] | main.rs:236:21:236:22 | v5 [Wrapping] | provenance | | | main.rs:235:18:235:19 | ! ... [Wrapping] | main.rs:235:13:235:14 | v5 [Wrapping] | provenance | | -| main.rs:235:19:235:19 | b [Wrapping] | main.rs:235:18:235:19 | ! ... [Wrapping] | provenance | MaD:35 | +| main.rs:235:19:235:19 | b [Wrapping] | main.rs:235:18:235:19 | ! ... [Wrapping] | provenance | MaD:2 | | main.rs:236:21:236:22 | v5 [Wrapping] | main.rs:236:21:236:24 | v5.0 | provenance | | | main.rs:237:13:237:14 | v6 [Wrapping] | main.rs:238:21:238:22 | v6 [Wrapping] | provenance | | -| main.rs:237:18:237:18 | b [Wrapping] | main.rs:237:18:237:24 | b.not() [Wrapping] | provenance | MaD:35 | +| main.rs:237:18:237:18 | b [Wrapping] | main.rs:237:18:237:24 | b.not() [Wrapping] | provenance | MaD:2 | | main.rs:237:18:237:24 | b.not() [Wrapping] | main.rs:237:13:237:14 | v6 [Wrapping] | provenance | | | main.rs:238:21:238:22 | v6 [Wrapping] | main.rs:238:21:238:24 | v6.0 | provenance | | | main.rs:239:13:239:14 | v7 [Wrapping] | main.rs:240:21:240:22 | v7 [Wrapping] | provenance | | -| main.rs:239:18:239:18 | b [Wrapping] | main.rs:239:18:239:22 | ... & ... [Wrapping] | provenance | MaD:14 | +| main.rs:239:18:239:18 | b [Wrapping] | main.rs:239:18:239:22 | ... & ... [Wrapping] | provenance | MaD:16 | | main.rs:239:18:239:22 | ... & ... [Wrapping] | main.rs:239:13:239:14 | v7 [Wrapping] | provenance | | -| main.rs:239:22:239:22 | c [Wrapping] | main.rs:239:18:239:22 | ... & ... [Wrapping] | provenance | MaD:14 | +| main.rs:239:22:239:22 | c [Wrapping] | main.rs:239:18:239:22 | ... & ... [Wrapping] | provenance | MaD:16 | | main.rs:240:21:240:22 | v7 [Wrapping] | main.rs:240:21:240:24 | v7.0 | provenance | | | main.rs:241:13:241:14 | v8 | main.rs:242:21:242:24 | v8.0 | provenance | | | main.rs:241:13:241:14 | v8 [Wrapping] | main.rs:242:21:242:22 | v8 [Wrapping] | provenance | | -| main.rs:241:18:241:18 | b [Wrapping] | main.rs:241:18:241:37 | ... << ... [Wrapping] | provenance | MaD:24 | +| main.rs:241:18:241:18 | b [Wrapping] | main.rs:241:18:241:37 | ... << ... [Wrapping] | provenance | MaD:26 | | main.rs:241:18:241:37 | ... << ... | main.rs:241:13:241:14 | v8 | provenance | | | main.rs:241:18:241:37 | ... << ... [Wrapping] | main.rs:241:13:241:14 | v8 [Wrapping] | provenance | | -| main.rs:241:23:241:37 | source_usize(...) | main.rs:241:18:241:37 | ... << ... | provenance | MaD:25 | -| main.rs:241:23:241:37 | source_usize(...) | main.rs:241:18:241:37 | ... << ... [Wrapping] | provenance | MaD:24 | +| main.rs:241:23:241:37 | source_usize(...) | main.rs:241:18:241:37 | ... << ... | provenance | MaD:27 | +| main.rs:241:23:241:37 | source_usize(...) | main.rs:241:18:241:37 | ... << ... [Wrapping] | provenance | MaD:26 | | main.rs:242:21:242:22 | v8 [Wrapping] | main.rs:242:21:242:24 | v8.0 | provenance | | nodes | main.rs:12:9:12:9 | a | semmle.label | a | diff --git a/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected b/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected index 6c2b7f7f578e..4c263e2c9498 100644 --- a/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected +++ b/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected @@ -19,34 +19,34 @@ edges | src/main.rs:7:11:7:19 | file_name | src/main.rs:9:35:9:43 | file_name | provenance | | | src/main.rs:9:9:9:17 | file_path | src/main.rs:11:24:11:32 | file_path | provenance | Sink:MaD:6 | | src/main.rs:9:21:9:44 | ...::from(...) | src/main.rs:9:9:9:17 | file_path | provenance | | -| src/main.rs:9:35:9:43 | file_name | src/main.rs:9:21:9:44 | ...::from(...) | provenance | MaD:14 | +| src/main.rs:9:35:9:43 | file_name | src/main.rs:9:21:9:44 | ...::from(...) | provenance | MaD:12 | | src/main.rs:38:11:38:19 | file_path | src/main.rs:41:52:41:60 | file_path | provenance | | | src/main.rs:41:9:41:17 | file_path | src/main.rs:46:24:46:32 | file_path | provenance | Sink:MaD:6 | | src/main.rs:41:21:41:62 | public_path.join(...) | src/main.rs:41:9:41:17 | file_path | provenance | | -| src/main.rs:41:38:41:61 | ...::from(...) | src/main.rs:41:21:41:62 | public_path.join(...) | provenance | MaD:12 | -| src/main.rs:41:52:41:60 | file_path | src/main.rs:41:38:41:61 | ...::from(...) | provenance | MaD:14 | +| src/main.rs:41:38:41:61 | ...::from(...) | src/main.rs:41:21:41:62 | public_path.join(...) | provenance | MaD:10 | +| src/main.rs:41:52:41:60 | file_path | src/main.rs:41:38:41:61 | ...::from(...) | provenance | MaD:12 | | src/main.rs:63:11:63:19 | file_path | src/main.rs:66:32:66:40 | file_path | provenance | | | src/main.rs:66:9:66:17 | file_path [&ref] | src/main.rs:71:24:71:32 | file_path | provenance | Sink:MaD:6 | | src/main.rs:66:21:66:41 | ...::new(...) [&ref] | src/main.rs:66:9:66:17 | file_path [&ref] | provenance | | -| src/main.rs:66:31:66:40 | &file_path [&ref] | src/main.rs:66:21:66:41 | ...::new(...) [&ref] | provenance | MaD:13 | +| src/main.rs:66:31:66:40 | &file_path [&ref] | src/main.rs:66:21:66:41 | ...::new(...) [&ref] | provenance | MaD:11 | | src/main.rs:66:32:66:40 | file_path | src/main.rs:66:31:66:40 | &file_path [&ref] | provenance | | | src/main.rs:76:11:76:19 | file_path | src/main.rs:79:52:79:60 | file_path | provenance | | | src/main.rs:79:9:79:17 | file_path | src/main.rs:80:21:80:29 | file_path | provenance | | | src/main.rs:79:21:79:62 | public_path.join(...) | src/main.rs:79:9:79:17 | file_path | provenance | | -| src/main.rs:79:38:79:61 | ...::from(...) | src/main.rs:79:21:79:62 | public_path.join(...) | provenance | MaD:12 | -| src/main.rs:79:52:79:60 | file_path | src/main.rs:79:38:79:61 | ...::from(...) | provenance | MaD:14 | +| src/main.rs:79:38:79:61 | ...::from(...) | src/main.rs:79:21:79:62 | public_path.join(...) | provenance | MaD:10 | +| src/main.rs:79:52:79:60 | file_path | src/main.rs:79:38:79:61 | ...::from(...) | provenance | MaD:12 | | src/main.rs:80:9:80:17 | file_path | src/main.rs:85:24:85:32 | file_path | provenance | Sink:MaD:6 | -| src/main.rs:80:21:80:29 | file_path | src/main.rs:80:21:80:44 | file_path.canonicalize() [Ok] | provenance | MaD:15 | -| src/main.rs:80:21:80:44 | file_path.canonicalize() [Ok] | src/main.rs:80:21:80:53 | ... .unwrap() | provenance | MaD:11 | +| src/main.rs:80:21:80:29 | file_path | src/main.rs:80:21:80:44 | file_path.canonicalize() [Ok] | provenance | MaD:13 | +| src/main.rs:80:21:80:44 | file_path.canonicalize() [Ok] | src/main.rs:80:21:80:53 | ... .unwrap() | provenance | MaD:9 | | src/main.rs:80:21:80:53 | ... .unwrap() | src/main.rs:80:9:80:17 | file_path | provenance | | | src/main.rs:90:11:90:19 | file_path | src/main.rs:93:32:93:40 | file_path | provenance | | | src/main.rs:93:9:93:17 | file_path [&ref] | src/main.rs:98:21:98:29 | file_path [&ref] | provenance | | | src/main.rs:93:21:93:41 | ...::new(...) [&ref] | src/main.rs:93:9:93:17 | file_path [&ref] | provenance | | -| src/main.rs:93:31:93:40 | &file_path [&ref] | src/main.rs:93:21:93:41 | ...::new(...) [&ref] | provenance | MaD:13 | +| src/main.rs:93:31:93:40 | &file_path [&ref] | src/main.rs:93:21:93:41 | ...::new(...) [&ref] | provenance | MaD:11 | | src/main.rs:93:32:93:40 | file_path | src/main.rs:93:31:93:40 | &file_path [&ref] | provenance | | | src/main.rs:98:9:98:17 | file_path | src/main.rs:99:24:99:32 | file_path | provenance | Sink:MaD:6 | | src/main.rs:98:21:98:29 | file_path [&ref] | src/main.rs:98:21:98:44 | file_path.canonicalize() [Ok] | provenance | Config | -| src/main.rs:98:21:98:44 | file_path.canonicalize() [Ok] | src/main.rs:98:21:98:53 | ... .unwrap() | provenance | MaD:11 | +| src/main.rs:98:21:98:44 | file_path.canonicalize() [Ok] | src/main.rs:98:21:98:53 | ... .unwrap() | provenance | MaD:9 | | src/main.rs:98:21:98:53 | ... .unwrap() | src/main.rs:98:9:98:17 | file_path | provenance | | | src/main.rs:103:9:103:13 | path1 | src/main.rs:104:33:104:37 | path1 | provenance | | | src/main.rs:103:9:103:13 | path1 | src/main.rs:106:39:106:43 | path1 | provenance | | @@ -56,51 +56,51 @@ edges | src/main.rs:103:9:103:13 | path1 | src/main.rs:122:27:122:31 | path1 | provenance | | | src/main.rs:103:9:103:13 | path1 | src/main.rs:123:37:123:41 | path1 | provenance | | | src/main.rs:103:17:103:32 | ...::args(...) | src/main.rs:103:17:103:32 | ...::args(...) [element] | provenance | Src:MaD:7 | -| src/main.rs:103:17:103:32 | ...::args(...) [element] | src/main.rs:103:17:103:39 | ... .nth(...) [Some] | provenance | MaD:9 | -| src/main.rs:103:17:103:39 | ... .nth(...) [Some] | src/main.rs:103:17:103:48 | ... .unwrap() | provenance | MaD:10 | +| src/main.rs:103:17:103:32 | ...::args(...) [element] | src/main.rs:103:17:103:39 | ... .nth(...) [Some] | provenance | MaD:15 | +| src/main.rs:103:17:103:39 | ... .nth(...) [Some] | src/main.rs:103:17:103:48 | ... .unwrap() | provenance | MaD:8 | | src/main.rs:103:17:103:48 | ... .unwrap() | src/main.rs:103:9:103:13 | path1 | provenance | | -| src/main.rs:104:33:104:37 | path1 | src/main.rs:104:33:104:45 | path1.clone() | provenance | MaD:8 | +| src/main.rs:104:33:104:37 | path1 | src/main.rs:104:33:104:45 | path1.clone() | provenance | MaD:14 | | src/main.rs:104:33:104:45 | path1.clone() | src/main.rs:104:33:104:45 | path1.clone() | provenance | Sink:MaD:2 | | src/main.rs:106:9:106:13 | path2 | src/main.rs:107:33:107:37 | path2 | provenance | Sink:MaD:2 | -| src/main.rs:106:17:106:52 | ...::canonicalize(...) [Ok] | src/main.rs:106:17:106:61 | ... .unwrap() | provenance | MaD:11 | +| src/main.rs:106:17:106:52 | ...::canonicalize(...) [Ok] | src/main.rs:106:17:106:61 | ... .unwrap() | provenance | MaD:9 | | src/main.rs:106:17:106:61 | ... .unwrap() | src/main.rs:106:9:106:13 | path2 | provenance | | -| src/main.rs:106:39:106:43 | path1 | src/main.rs:106:39:106:51 | path1.clone() | provenance | MaD:8 | +| src/main.rs:106:39:106:43 | path1 | src/main.rs:106:39:106:51 | path1.clone() | provenance | MaD:14 | | src/main.rs:106:39:106:51 | path1.clone() | src/main.rs:106:17:106:52 | ...::canonicalize(...) [Ok] | provenance | Config | | src/main.rs:109:9:109:13 | path3 | src/main.rs:110:35:110:39 | path3 | provenance | Sink:MaD:4 | | src/main.rs:109:17:109:54 | ...::canonicalize(...) [future, Ok] | src/main.rs:109:17:109:60 | await ... [Ok] | provenance | | -| src/main.rs:109:17:109:60 | await ... [Ok] | src/main.rs:109:17:109:69 | ... .unwrap() | provenance | MaD:11 | +| src/main.rs:109:17:109:60 | await ... [Ok] | src/main.rs:109:17:109:69 | ... .unwrap() | provenance | MaD:9 | | src/main.rs:109:17:109:69 | ... .unwrap() | src/main.rs:109:9:109:13 | path3 | provenance | | -| src/main.rs:109:41:109:45 | path1 | src/main.rs:109:41:109:53 | path1.clone() | provenance | MaD:8 | +| src/main.rs:109:41:109:45 | path1 | src/main.rs:109:41:109:53 | path1.clone() | provenance | MaD:14 | | src/main.rs:109:41:109:53 | path1.clone() | src/main.rs:109:17:109:54 | ...::canonicalize(...) [future, Ok] | provenance | Config | | src/main.rs:112:9:112:13 | path4 | src/main.rs:113:39:113:43 | path4 | provenance | Sink:MaD:1 | | src/main.rs:112:17:112:58 | ...::canonicalize(...) [future, Ok] | src/main.rs:112:17:112:64 | await ... [Ok] | provenance | | -| src/main.rs:112:17:112:64 | await ... [Ok] | src/main.rs:112:17:112:73 | ... .unwrap() | provenance | MaD:11 | +| src/main.rs:112:17:112:64 | await ... [Ok] | src/main.rs:112:17:112:73 | ... .unwrap() | provenance | MaD:9 | | src/main.rs:112:17:112:73 | ... .unwrap() | src/main.rs:112:9:112:13 | path4 | provenance | | -| src/main.rs:112:45:112:49 | path1 | src/main.rs:112:45:112:57 | path1.clone() | provenance | MaD:8 | +| src/main.rs:112:45:112:49 | path1 | src/main.rs:112:45:112:57 | path1.clone() | provenance | MaD:14 | | src/main.rs:112:45:112:57 | path1.clone() | src/main.rs:112:17:112:58 | ...::canonicalize(...) [future, Ok] | provenance | Config | | src/main.rs:115:9:115:13 | path5 [&ref] | src/main.rs:116:33:116:37 | path5 | provenance | Sink:MaD:2 | | src/main.rs:115:9:115:13 | path5 [&ref] | src/main.rs:118:17:118:21 | path5 [&ref] | provenance | | | src/main.rs:115:17:115:44 | ...::new(...) [&ref] | src/main.rs:115:9:115:13 | path5 [&ref] | provenance | | -| src/main.rs:115:38:115:43 | &path1 [&ref] | src/main.rs:115:17:115:44 | ...::new(...) [&ref] | provenance | MaD:13 | +| src/main.rs:115:38:115:43 | &path1 [&ref] | src/main.rs:115:17:115:44 | ...::new(...) [&ref] | provenance | MaD:11 | | src/main.rs:115:39:115:43 | path1 | src/main.rs:115:38:115:43 | &path1 [&ref] | provenance | | | src/main.rs:118:9:118:13 | path6 | src/main.rs:119:33:119:37 | path6 | provenance | Sink:MaD:2 | | src/main.rs:118:17:118:21 | path5 [&ref] | src/main.rs:118:17:118:36 | path5.canonicalize() [Ok] | provenance | Config | -| src/main.rs:118:17:118:36 | path5.canonicalize() [Ok] | src/main.rs:118:17:118:45 | ... .unwrap() | provenance | MaD:11 | +| src/main.rs:118:17:118:36 | path5.canonicalize() [Ok] | src/main.rs:118:17:118:45 | ... .unwrap() | provenance | MaD:9 | | src/main.rs:118:17:118:45 | ... .unwrap() | src/main.rs:118:9:118:13 | path6 | provenance | | -| src/main.rs:122:27:122:31 | path1 | src/main.rs:122:27:122:39 | path1.clone() | provenance | MaD:8 | +| src/main.rs:122:27:122:31 | path1 | src/main.rs:122:27:122:39 | path1.clone() | provenance | MaD:14 | | src/main.rs:122:27:122:39 | path1.clone() | src/main.rs:122:27:122:39 | path1.clone() | provenance | Sink:MaD:5 | -| src/main.rs:123:37:123:41 | path1 | src/main.rs:123:37:123:49 | path1.clone() | provenance | MaD:8 | +| src/main.rs:123:37:123:41 | path1 | src/main.rs:123:37:123:49 | path1.clone() | provenance | MaD:14 | | src/main.rs:123:37:123:49 | path1.clone() | src/main.rs:123:37:123:49 | path1.clone() | provenance | Sink:MaD:5 | | src/main.rs:170:16:170:29 | ...: ... [&ref] | src/main.rs:172:26:172:33 | path_str [&ref] | provenance | | | src/main.rs:170:16:170:29 | ...: ... [&ref] | src/main.rs:174:36:174:43 | path_str | provenance | Sink:MaD:2 | | src/main.rs:172:9:172:12 | path [&ref] | src/main.rs:173:8:173:11 | path | provenance | Sink:MaD:3 | | src/main.rs:172:9:172:12 | path [&ref] | src/main.rs:177:36:177:39 | path | provenance | Sink:MaD:2 | | src/main.rs:172:16:172:34 | ...::new(...) [&ref] | src/main.rs:172:9:172:12 | path [&ref] | provenance | | -| src/main.rs:172:26:172:33 | path_str [&ref] | src/main.rs:172:16:172:34 | ...::new(...) [&ref] | provenance | MaD:13 | +| src/main.rs:172:26:172:33 | path_str [&ref] | src/main.rs:172:16:172:34 | ...::new(...) [&ref] | provenance | MaD:11 | | src/main.rs:185:9:185:13 | path1 | src/main.rs:186:18:186:22 | path1 | provenance | | | src/main.rs:185:17:185:32 | ...::args(...) | src/main.rs:185:17:185:32 | ...::args(...) [element] | provenance | Src:MaD:7 | -| src/main.rs:185:17:185:32 | ...::args(...) [element] | src/main.rs:185:17:185:39 | ... .nth(...) [Some] | provenance | MaD:9 | -| src/main.rs:185:17:185:39 | ... .nth(...) [Some] | src/main.rs:185:17:185:48 | ... .unwrap() | provenance | MaD:10 | +| src/main.rs:185:17:185:32 | ...::args(...) [element] | src/main.rs:185:17:185:39 | ... .nth(...) [Some] | provenance | MaD:15 | +| src/main.rs:185:17:185:39 | ... .nth(...) [Some] | src/main.rs:185:17:185:48 | ... .unwrap() | provenance | MaD:8 | | src/main.rs:185:17:185:48 | ... .unwrap() | src/main.rs:185:9:185:13 | path1 | provenance | | | src/main.rs:186:17:186:22 | &path1 [&ref] | src/main.rs:170:16:170:29 | ...: ... [&ref] | provenance | | | src/main.rs:186:18:186:22 | path1 | src/main.rs:186:17:186:22 | &path1 [&ref] | provenance | | @@ -112,14 +112,14 @@ models | 5 | Sink: std::fs::copy; Argument[0,1]; path-injection | | 6 | Sink: std::fs::read_to_string; Argument[0]; path-injection | | 7 | Source: std::env::args; ReturnValue.Element; commandargs | -| 8 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | -| 9 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 10 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 11 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 12 | Summary: ::join; Argument[0]; ReturnValue; taint | -| 13 | Summary: ::new; Argument[0].Reference; ReturnValue.Reference; value | -| 14 | Summary: ::from; Argument[0].Field[alloc::borrow::Cow::Owned(0)]; ReturnValue; value | -| 15 | Summary: ::deref; Argument[self].Reference.Field[std::path::PathBuf::inner]; ReturnValue.Reference; value | +| 8 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 9 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 10 | Summary: ::join; Argument[0]; ReturnValue; taint | +| 11 | Summary: ::new; Argument[0].Reference; ReturnValue.Reference; value | +| 12 | Summary: ::from; Argument[0].Field[alloc::borrow::Cow::Owned(0)]; ReturnValue; value | +| 13 | Summary: ::deref; Argument[self].Reference.Field[std::path::PathBuf::inner]; ReturnValue.Reference; value | +| 14 | Summary: core::clone::Clone::clone; Argument[self].Reference; ReturnValue; value | +| 15 | Summary: core::iter::traits::iterator::Iterator::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | nodes | src/main.rs:7:11:7:19 | file_name | semmle.label | file_name | | src/main.rs:9:9:9:17 | file_path | semmle.label | file_path | diff --git a/rust/ql/test/query-tests/security/CWE-079/warp/XSS.expected b/rust/ql/test/query-tests/security/CWE-079/warp/XSS.expected index e4123b511ef4..2190976dafc8 100644 --- a/rust/ql/test/query-tests/security/CWE-079/warp/XSS.expected +++ b/rust/ql/test/query-tests/security/CWE-079/warp/XSS.expected @@ -9,7 +9,7 @@ edges | main.rs:9:32:9:56 | { ... } | main.rs:9:32:9:56 | ...::must_use(...) | provenance | MaD:4 | models | 1 | Sink: warp::reply::html; Argument[0]; html-injection | -| 2 | Source: <_ as warp::filter::Filter>::map; Argument[0].Parameter[0..7]; remote | +| 2 | Source: warp::filter::Filter::map; Argument[0].Parameter[0..7]; remote | | 3 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | | 4 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes diff --git a/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected b/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected index a53c7483791f..ec9018280bc3 100644 --- a/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected @@ -35,9 +35,9 @@ edges | mysql.rs:12:13:12:29 | mut remote_string | mysql.rs:18:71:18:83 | remote_string | provenance | | | mysql.rs:12:33:12:77 | ...::get(...) | mysql.rs:12:33:12:77 | ...::get(...) [Ok] | provenance | Src:MaD:23 | -| mysql.rs:12:33:12:77 | ...::get(...) [Ok] | mysql.rs:12:33:13:21 | ... .unwrap() | provenance | MaD:30 | -| mysql.rs:12:33:13:21 | ... .unwrap() | mysql.rs:12:33:14:19 | ... .text() [Ok] | provenance | MaD:32 | -| mysql.rs:12:33:14:19 | ... .text() [Ok] | mysql.rs:12:33:15:40 | ... .unwrap_or(...) | provenance | MaD:31 | +| mysql.rs:12:33:12:77 | ...::get(...) [Ok] | mysql.rs:12:33:13:21 | ... .unwrap() | provenance | MaD:29 | +| mysql.rs:12:33:13:21 | ... .unwrap() | mysql.rs:12:33:14:19 | ... .text() [Ok] | provenance | MaD:31 | +| mysql.rs:12:33:14:19 | ... .text() [Ok] | mysql.rs:12:33:15:40 | ... .unwrap_or(...) | provenance | MaD:30 | | mysql.rs:12:33:15:40 | ... .unwrap_or(...) | mysql.rs:12:13:12:29 | mut remote_string | provenance | | | mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:25:38:25:49 | unsafe_query | provenance | | | mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:26:64:26:75 | unsafe_query | provenance | | @@ -52,41 +52,41 @@ edges | mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:42:39:42:50 | unsafe_query | provenance | | | mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:75:31:75:42 | unsafe_query | provenance | | | mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:80:26:80:37 | unsafe_query | provenance | | -| mysql.rs:18:13:18:83 | ... + ... | mysql.rs:18:13:18:89 | ... + ... | provenance | MaD:27 | +| mysql.rs:18:13:18:83 | ... + ... | mysql.rs:18:13:18:89 | ... + ... | provenance | MaD:26 | | mysql.rs:18:13:18:89 | ... + ... | mysql.rs:17:13:17:24 | unsafe_query | provenance | | -| mysql.rs:18:70:18:83 | &remote_string [&ref] | mysql.rs:18:13:18:83 | ... + ... | provenance | MaD:26 | +| mysql.rs:18:70:18:83 | &remote_string [&ref] | mysql.rs:18:13:18:83 | ... + ... | provenance | MaD:25 | | mysql.rs:18:71:18:83 | remote_string | mysql.rs:18:70:18:83 | &remote_string [&ref] | provenance | | -| mysql.rs:25:38:25:49 | unsafe_query | mysql.rs:25:38:25:58 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:25:38:25:58 | unsafe_query.as_str() [&ref] | mysql.rs:25:38:25:58 | unsafe_query.as_str() | provenance | Sink:MaD:1 | -| mysql.rs:26:64:26:75 | unsafe_query | mysql.rs:26:64:26:84 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:26:64:26:84 | unsafe_query.as_str() [&ref] | mysql.rs:26:64:26:84 | unsafe_query.as_str() | provenance | Sink:MaD:9 | -| mysql.rs:27:25:27:36 | unsafe_query | mysql.rs:27:25:27:45 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:27:25:27:45 | unsafe_query.as_str() [&ref] | mysql.rs:27:25:27:45 | unsafe_query.as_str() | provenance | Sink:MaD:2 | -| mysql.rs:28:39:28:50 | unsafe_query | mysql.rs:28:39:28:59 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:28:39:28:59 | unsafe_query.as_str() [&ref] | mysql.rs:28:39:28:59 | unsafe_query.as_str() | provenance | Sink:MaD:3 | -| mysql.rs:29:65:29:76 | unsafe_query | mysql.rs:29:65:29:85 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:29:65:29:85 | unsafe_query.as_str() [&ref] | mysql.rs:29:65:29:85 | unsafe_query.as_str() | provenance | Sink:MaD:4 | -| mysql.rs:30:33:30:44 | unsafe_query | mysql.rs:30:33:30:53 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:30:33:30:53 | unsafe_query.as_str() [&ref] | mysql.rs:30:33:30:53 | unsafe_query.as_str() | provenance | Sink:MaD:5 | -| mysql.rs:32:13:32:24 | unsafe_query | mysql.rs:32:13:32:33 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:32:13:32:33 | unsafe_query.as_str() [&ref] | mysql.rs:32:13:32:33 | unsafe_query.as_str() | provenance | Sink:MaD:6 | -| mysql.rs:36:33:36:44 | unsafe_query | mysql.rs:36:33:36:53 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:36:33:36:53 | unsafe_query.as_str() [&ref] | mysql.rs:36:33:36:53 | unsafe_query.as_str() | provenance | Sink:MaD:17 | -| mysql.rs:37:32:37:43 | unsafe_query | mysql.rs:37:32:37:52 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:37:32:37:52 | unsafe_query.as_str() [&ref] | mysql.rs:37:32:37:52 | unsafe_query.as_str() | provenance | Sink:MaD:7 | -| mysql.rs:39:13:39:24 | unsafe_query | mysql.rs:39:13:39:33 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:39:13:39:33 | unsafe_query.as_str() [&ref] | mysql.rs:39:13:39:33 | unsafe_query.as_str() | provenance | Sink:MaD:8 | -| mysql.rs:42:39:42:50 | unsafe_query | mysql.rs:42:39:42:59 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:42:39:42:59 | unsafe_query.as_str() [&ref] | mysql.rs:42:39:42:59 | unsafe_query.as_str() | provenance | Sink:MaD:1 | -| mysql.rs:75:31:75:42 | unsafe_query | mysql.rs:75:31:75:51 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:75:31:75:51 | unsafe_query.as_str() [&ref] | mysql.rs:75:31:75:51 | unsafe_query.as_str() | provenance | Sink:MaD:16 | -| mysql.rs:80:26:80:37 | unsafe_query | mysql.rs:80:26:80:46 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:80:26:80:46 | unsafe_query.as_str() [&ref] | mysql.rs:80:26:80:46 | unsafe_query.as_str() | provenance | Sink:MaD:2 | +| mysql.rs:25:38:25:49 | unsafe_query | mysql.rs:25:38:25:58 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | +| mysql.rs:25:38:25:58 | unsafe_query.as_str() [&ref] | mysql.rs:25:38:25:58 | unsafe_query.as_str() | provenance | Sink:MaD:5 | +| mysql.rs:26:64:26:75 | unsafe_query | mysql.rs:26:64:26:84 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | +| mysql.rs:26:64:26:84 | unsafe_query.as_str() [&ref] | mysql.rs:26:64:26:84 | unsafe_query.as_str() | provenance | Sink:MaD:13 | +| mysql.rs:27:25:27:36 | unsafe_query | mysql.rs:27:25:27:45 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | +| mysql.rs:27:25:27:45 | unsafe_query.as_str() [&ref] | mysql.rs:27:25:27:45 | unsafe_query.as_str() | provenance | Sink:MaD:6 | +| mysql.rs:28:39:28:50 | unsafe_query | mysql.rs:28:39:28:59 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | +| mysql.rs:28:39:28:59 | unsafe_query.as_str() [&ref] | mysql.rs:28:39:28:59 | unsafe_query.as_str() | provenance | Sink:MaD:7 | +| mysql.rs:29:65:29:76 | unsafe_query | mysql.rs:29:65:29:85 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | +| mysql.rs:29:65:29:85 | unsafe_query.as_str() [&ref] | mysql.rs:29:65:29:85 | unsafe_query.as_str() | provenance | Sink:MaD:8 | +| mysql.rs:30:33:30:44 | unsafe_query | mysql.rs:30:33:30:53 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | +| mysql.rs:30:33:30:53 | unsafe_query.as_str() [&ref] | mysql.rs:30:33:30:53 | unsafe_query.as_str() | provenance | Sink:MaD:9 | +| mysql.rs:32:13:32:24 | unsafe_query | mysql.rs:32:13:32:33 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | +| mysql.rs:32:13:32:33 | unsafe_query.as_str() [&ref] | mysql.rs:32:13:32:33 | unsafe_query.as_str() | provenance | Sink:MaD:10 | +| mysql.rs:36:33:36:44 | unsafe_query | mysql.rs:36:33:36:53 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | +| mysql.rs:36:33:36:53 | unsafe_query.as_str() [&ref] | mysql.rs:36:33:36:53 | unsafe_query.as_str() | provenance | Sink:MaD:2 | +| mysql.rs:37:32:37:43 | unsafe_query | mysql.rs:37:32:37:52 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | +| mysql.rs:37:32:37:52 | unsafe_query.as_str() [&ref] | mysql.rs:37:32:37:52 | unsafe_query.as_str() | provenance | Sink:MaD:11 | +| mysql.rs:39:13:39:24 | unsafe_query | mysql.rs:39:13:39:33 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | +| mysql.rs:39:13:39:33 | unsafe_query.as_str() [&ref] | mysql.rs:39:13:39:33 | unsafe_query.as_str() | provenance | Sink:MaD:12 | +| mysql.rs:42:39:42:50 | unsafe_query | mysql.rs:42:39:42:59 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | +| mysql.rs:42:39:42:59 | unsafe_query.as_str() [&ref] | mysql.rs:42:39:42:59 | unsafe_query.as_str() | provenance | Sink:MaD:5 | +| mysql.rs:75:31:75:42 | unsafe_query | mysql.rs:75:31:75:51 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | +| mysql.rs:75:31:75:51 | unsafe_query.as_str() [&ref] | mysql.rs:75:31:75:51 | unsafe_query.as_str() | provenance | Sink:MaD:1 | +| mysql.rs:80:26:80:37 | unsafe_query | mysql.rs:80:26:80:46 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | +| mysql.rs:80:26:80:46 | unsafe_query.as_str() [&ref] | mysql.rs:80:26:80:46 | unsafe_query.as_str() | provenance | Sink:MaD:6 | | mysql.rs:97:13:97:29 | mut remote_string | mysql.rs:103:71:103:83 | remote_string | provenance | | | mysql.rs:97:33:97:77 | ...::get(...) | mysql.rs:97:33:97:77 | ...::get(...) [Ok] | provenance | Src:MaD:23 | -| mysql.rs:97:33:97:77 | ...::get(...) [Ok] | mysql.rs:97:33:98:21 | ... .unwrap() | provenance | MaD:30 | -| mysql.rs:97:33:98:21 | ... .unwrap() | mysql.rs:97:33:99:19 | ... .text() [Ok] | provenance | MaD:32 | -| mysql.rs:97:33:99:19 | ... .text() [Ok] | mysql.rs:97:33:100:40 | ... .unwrap_or(...) | provenance | MaD:31 | +| mysql.rs:97:33:97:77 | ...::get(...) [Ok] | mysql.rs:97:33:98:21 | ... .unwrap() | provenance | MaD:29 | +| mysql.rs:97:33:98:21 | ... .unwrap() | mysql.rs:97:33:99:19 | ... .text() [Ok] | provenance | MaD:31 | +| mysql.rs:97:33:99:19 | ... .text() [Ok] | mysql.rs:97:33:100:40 | ... .unwrap_or(...) | provenance | MaD:30 | | mysql.rs:97:33:100:40 | ... .unwrap_or(...) | mysql.rs:97:13:97:29 | mut remote_string | provenance | | | mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:110:38:110:49 | unsafe_query | provenance | | | mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:111:25:111:36 | unsafe_query | provenance | | @@ -97,40 +97,40 @@ edges | mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:121:24:121:35 | unsafe_query | provenance | | | mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:149:31:149:42 | unsafe_query | provenance | | | mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:154:26:154:37 | unsafe_query | provenance | | -| mysql.rs:103:13:103:83 | ... + ... | mysql.rs:103:13:103:89 | ... + ... | provenance | MaD:27 | +| mysql.rs:103:13:103:83 | ... + ... | mysql.rs:103:13:103:89 | ... + ... | provenance | MaD:26 | | mysql.rs:103:13:103:89 | ... + ... | mysql.rs:102:13:102:24 | unsafe_query | provenance | | -| mysql.rs:103:70:103:83 | &remote_string [&ref] | mysql.rs:103:13:103:83 | ... + ... | provenance | MaD:26 | +| mysql.rs:103:70:103:83 | &remote_string [&ref] | mysql.rs:103:13:103:83 | ... + ... | provenance | MaD:25 | | mysql.rs:103:71:103:83 | remote_string | mysql.rs:103:70:103:83 | &remote_string [&ref] | provenance | | -| mysql.rs:110:38:110:49 | unsafe_query | mysql.rs:110:38:110:58 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:110:38:110:58 | unsafe_query.as_str() [&ref] | mysql.rs:110:38:110:58 | unsafe_query.as_str() | provenance | Sink:MaD:10 | -| mysql.rs:111:25:111:36 | unsafe_query | mysql.rs:111:25:111:45 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:111:25:111:45 | unsafe_query.as_str() [&ref] | mysql.rs:111:25:111:45 | unsafe_query.as_str() | provenance | Sink:MaD:11 | -| mysql.rs:112:47:112:58 | unsafe_query | mysql.rs:112:47:112:67 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:112:47:112:67 | unsafe_query.as_str() [&ref] | mysql.rs:112:47:112:67 | unsafe_query.as_str() | provenance | Sink:MaD:12 | -| mysql.rs:114:25:114:36 | unsafe_query | mysql.rs:114:25:114:45 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:114:25:114:45 | unsafe_query.as_str() [&ref] | mysql.rs:114:25:114:45 | unsafe_query.as_str() | provenance | Sink:MaD:13 | -| mysql.rs:116:33:116:44 | unsafe_query | mysql.rs:116:33:116:53 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:116:33:116:53 | unsafe_query.as_str() [&ref] | mysql.rs:116:33:116:53 | unsafe_query.as_str() | provenance | Sink:MaD:19 | -| mysql.rs:118:40:118:51 | unsafe_query | mysql.rs:118:40:118:60 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:118:40:118:60 | unsafe_query.as_str() [&ref] | mysql.rs:118:40:118:60 | unsafe_query.as_str() | provenance | Sink:MaD:15 | -| mysql.rs:121:24:121:35 | unsafe_query | mysql.rs:121:24:121:44 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:121:24:121:44 | unsafe_query.as_str() [&ref] | mysql.rs:121:24:121:44 | unsafe_query.as_str() | provenance | Sink:MaD:14 | -| mysql.rs:149:31:149:42 | unsafe_query | mysql.rs:149:31:149:51 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:149:31:149:51 | unsafe_query.as_str() [&ref] | mysql.rs:149:31:149:51 | unsafe_query.as_str() | provenance | Sink:MaD:18 | -| mysql.rs:154:26:154:37 | unsafe_query | mysql.rs:154:26:154:46 | unsafe_query.as_str() [&ref] | provenance | MaD:28 | -| mysql.rs:154:26:154:46 | unsafe_query.as_str() [&ref] | mysql.rs:154:26:154:46 | unsafe_query.as_str() | provenance | Sink:MaD:11 | +| mysql.rs:110:38:110:49 | unsafe_query | mysql.rs:110:38:110:58 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | +| mysql.rs:110:38:110:58 | unsafe_query.as_str() [&ref] | mysql.rs:110:38:110:58 | unsafe_query.as_str() | provenance | Sink:MaD:14 | +| mysql.rs:111:25:111:36 | unsafe_query | mysql.rs:111:25:111:45 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | +| mysql.rs:111:25:111:45 | unsafe_query.as_str() [&ref] | mysql.rs:111:25:111:45 | unsafe_query.as_str() | provenance | Sink:MaD:15 | +| mysql.rs:112:47:112:58 | unsafe_query | mysql.rs:112:47:112:67 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | +| mysql.rs:112:47:112:67 | unsafe_query.as_str() [&ref] | mysql.rs:112:47:112:67 | unsafe_query.as_str() | provenance | Sink:MaD:16 | +| mysql.rs:114:25:114:36 | unsafe_query | mysql.rs:114:25:114:45 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | +| mysql.rs:114:25:114:45 | unsafe_query.as_str() [&ref] | mysql.rs:114:25:114:45 | unsafe_query.as_str() | provenance | Sink:MaD:17 | +| mysql.rs:116:33:116:44 | unsafe_query | mysql.rs:116:33:116:53 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | +| mysql.rs:116:33:116:53 | unsafe_query.as_str() [&ref] | mysql.rs:116:33:116:53 | unsafe_query.as_str() | provenance | Sink:MaD:4 | +| mysql.rs:118:40:118:51 | unsafe_query | mysql.rs:118:40:118:60 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | +| mysql.rs:118:40:118:60 | unsafe_query.as_str() [&ref] | mysql.rs:118:40:118:60 | unsafe_query.as_str() | provenance | Sink:MaD:19 | +| mysql.rs:121:24:121:35 | unsafe_query | mysql.rs:121:24:121:44 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | +| mysql.rs:121:24:121:44 | unsafe_query.as_str() [&ref] | mysql.rs:121:24:121:44 | unsafe_query.as_str() | provenance | Sink:MaD:18 | +| mysql.rs:149:31:149:42 | unsafe_query | mysql.rs:149:31:149:51 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | +| mysql.rs:149:31:149:51 | unsafe_query.as_str() [&ref] | mysql.rs:149:31:149:51 | unsafe_query.as_str() | provenance | Sink:MaD:3 | +| mysql.rs:154:26:154:37 | unsafe_query | mysql.rs:154:26:154:46 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | +| mysql.rs:154:26:154:46 | unsafe_query.as_str() [&ref] | mysql.rs:154:26:154:46 | unsafe_query.as_str() | provenance | Sink:MaD:15 | | sqlx.rs:47:9:47:18 | arg_string | sqlx.rs:53:27:53:36 | arg_string | provenance | | | sqlx.rs:47:22:47:37 | ...::args(...) | sqlx.rs:47:22:47:37 | ...::args(...) [element] | provenance | Src:MaD:24 | -| sqlx.rs:47:22:47:37 | ...::args(...) [element] | sqlx.rs:47:22:47:44 | ... .nth(...) [Some] | provenance | MaD:25 | -| sqlx.rs:47:22:47:44 | ... .nth(...) [Some] | sqlx.rs:47:22:47:77 | ... .unwrap_or(...) | provenance | MaD:29 | +| sqlx.rs:47:22:47:37 | ...::args(...) [element] | sqlx.rs:47:22:47:44 | ... .nth(...) [Some] | provenance | MaD:34 | +| sqlx.rs:47:22:47:44 | ... .nth(...) [Some] | sqlx.rs:47:22:47:77 | ... .unwrap_or(...) | provenance | MaD:28 | | sqlx.rs:47:22:47:77 | ... .unwrap_or(...) | sqlx.rs:47:9:47:18 | arg_string | provenance | | | sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:54:27:54:39 | remote_string | provenance | | | sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:55:84:55:96 | remote_string | provenance | | | sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:59:17:59:72 | MacroExpr | provenance | | | sqlx.rs:48:25:48:69 | ...::get(...) | sqlx.rs:48:25:48:69 | ...::get(...) [Ok] | provenance | Src:MaD:23 | -| sqlx.rs:48:25:48:69 | ...::get(...) [Ok] | sqlx.rs:48:25:48:78 | ... .unwrap() | provenance | MaD:30 | -| sqlx.rs:48:25:48:78 | ... .unwrap() | sqlx.rs:48:25:48:85 | ... .text() [Ok] | provenance | MaD:32 | -| sqlx.rs:48:25:48:85 | ... .text() [Ok] | sqlx.rs:48:25:48:118 | ... .unwrap_or(...) | provenance | MaD:31 | +| sqlx.rs:48:25:48:69 | ...::get(...) [Ok] | sqlx.rs:48:25:48:78 | ... .unwrap() | provenance | MaD:29 | +| sqlx.rs:48:25:48:78 | ... .unwrap() | sqlx.rs:48:25:48:85 | ... .text() [Ok] | provenance | MaD:31 | +| sqlx.rs:48:25:48:85 | ... .text() [Ok] | sqlx.rs:48:25:48:118 | ... .unwrap_or(...) | provenance | MaD:30 | | sqlx.rs:48:25:48:118 | ... .unwrap_or(...) | sqlx.rs:48:9:48:21 | remote_string | provenance | | | sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:38 | unsafe_query_1 [&ref] | provenance | | | sqlx.rs:53:26:53:36 | &arg_string [&ref] | sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | provenance | | @@ -139,28 +139,28 @@ edges | sqlx.rs:54:26:54:39 | &remote_string [&ref] | sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | provenance | | | sqlx.rs:54:27:54:39 | remote_string | sqlx.rs:54:26:54:39 | &remote_string [&ref] | provenance | | | sqlx.rs:55:9:55:22 | unsafe_query_3 | sqlx.rs:81:29:81:42 | unsafe_query_3 | provenance | | -| sqlx.rs:55:26:55:96 | ... + ... | sqlx.rs:55:26:55:102 | ... + ... | provenance | MaD:27 | +| sqlx.rs:55:26:55:96 | ... + ... | sqlx.rs:55:26:55:102 | ... + ... | provenance | MaD:26 | | sqlx.rs:55:26:55:102 | ... + ... | sqlx.rs:55:9:55:22 | unsafe_query_3 | provenance | | -| sqlx.rs:55:83:55:96 | &remote_string [&ref] | sqlx.rs:55:26:55:96 | ... + ... | provenance | MaD:26 | +| sqlx.rs:55:83:55:96 | &remote_string [&ref] | sqlx.rs:55:26:55:96 | ... + ... | provenance | MaD:25 | | sqlx.rs:55:84:55:96 | remote_string | sqlx.rs:55:83:55:96 | &remote_string [&ref] | provenance | | | sqlx.rs:56:9:56:22 | unsafe_query_4 | sqlx.rs:82:29:82:42 | unsafe_query_4 | provenance | | | sqlx.rs:59:17:59:72 | ...::format(...) | sqlx.rs:59:17:59:72 | { ... } | provenance | | | sqlx.rs:59:17:59:72 | ...::must_use(...) | sqlx.rs:56:9:56:22 | unsafe_query_4 | provenance | | -| sqlx.rs:59:17:59:72 | MacroExpr | sqlx.rs:59:17:59:72 | ...::format(...) | provenance | MaD:33 | -| sqlx.rs:59:17:59:72 | { ... } | sqlx.rs:59:17:59:72 | ...::must_use(...) | provenance | MaD:34 | -| sqlx.rs:78:25:78:38 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | provenance | MaD:28 | +| sqlx.rs:59:17:59:72 | MacroExpr | sqlx.rs:59:17:59:72 | ...::format(...) | provenance | MaD:32 | +| sqlx.rs:59:17:59:72 | { ... } | sqlx.rs:59:17:59:72 | ...::must_use(...) | provenance | MaD:33 | +| sqlx.rs:78:25:78:38 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | provenance | MaD:27 | | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() | provenance | Sink:MaD:20 | -| sqlx.rs:80:29:80:42 | unsafe_query_2 [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | provenance | MaD:28 | +| sqlx.rs:80:29:80:42 | unsafe_query_2 [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | provenance | MaD:27 | | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() | provenance | Sink:MaD:20 | -| sqlx.rs:81:29:81:42 | unsafe_query_3 | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() [&ref] | provenance | MaD:28 | +| sqlx.rs:81:29:81:42 | unsafe_query_3 | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() [&ref] | provenance | MaD:27 | | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() [&ref] | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() | provenance | Sink:MaD:20 | -| sqlx.rs:82:29:82:42 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | provenance | MaD:28 | +| sqlx.rs:82:29:82:42 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | provenance | MaD:27 | | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | provenance | Sink:MaD:20 | | sqlx.rs:100:9:100:21 | remote_string | sqlx.rs:102:84:102:96 | remote_string | provenance | | | sqlx.rs:100:25:100:69 | ...::get(...) | sqlx.rs:100:25:100:69 | ...::get(...) [Ok] | provenance | Src:MaD:23 | -| sqlx.rs:100:25:100:69 | ...::get(...) [Ok] | sqlx.rs:100:25:100:78 | ... .unwrap() | provenance | MaD:30 | -| sqlx.rs:100:25:100:78 | ... .unwrap() | sqlx.rs:100:25:100:85 | ... .text() [Ok] | provenance | MaD:32 | -| sqlx.rs:100:25:100:85 | ... .text() [Ok] | sqlx.rs:100:25:100:118 | ... .unwrap_or(...) | provenance | MaD:31 | +| sqlx.rs:100:25:100:69 | ...::get(...) [Ok] | sqlx.rs:100:25:100:78 | ... .unwrap() | provenance | MaD:29 | +| sqlx.rs:100:25:100:78 | ... .unwrap() | sqlx.rs:100:25:100:85 | ... .text() [Ok] | provenance | MaD:31 | +| sqlx.rs:100:25:100:85 | ... .text() [Ok] | sqlx.rs:100:25:100:118 | ... .unwrap_or(...) | provenance | MaD:30 | | sqlx.rs:100:25:100:118 | ... .unwrap_or(...) | sqlx.rs:100:9:100:21 | remote_string | provenance | | | sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:113:31:113:44 | unsafe_query_1 | provenance | | | sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:120:29:120:42 | unsafe_query_1 | provenance | | @@ -168,70 +168,70 @@ edges | sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:136:55:136:68 | unsafe_query_1 | provenance | | | sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:145:55:145:68 | unsafe_query_1 | provenance | | | sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:153:29:153:42 | unsafe_query_1 | provenance | | -| sqlx.rs:102:26:102:96 | ... + ... | sqlx.rs:102:26:102:102 | ... + ... | provenance | MaD:27 | +| sqlx.rs:102:26:102:96 | ... + ... | sqlx.rs:102:26:102:102 | ... + ... | provenance | MaD:26 | | sqlx.rs:102:26:102:102 | ... + ... | sqlx.rs:102:9:102:22 | unsafe_query_1 | provenance | | -| sqlx.rs:102:83:102:96 | &remote_string [&ref] | sqlx.rs:102:26:102:96 | ... + ... | provenance | MaD:26 | +| sqlx.rs:102:83:102:96 | &remote_string [&ref] | sqlx.rs:102:26:102:96 | ... + ... | provenance | MaD:25 | | sqlx.rs:102:84:102:96 | remote_string | sqlx.rs:102:83:102:96 | &remote_string [&ref] | provenance | | -| sqlx.rs:113:31:113:44 | unsafe_query_1 | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() [&ref] | provenance | MaD:28 | +| sqlx.rs:113:31:113:44 | unsafe_query_1 | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() [&ref] | provenance | MaD:27 | | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() [&ref] | sqlx.rs:113:31:113:53 | unsafe_query_1.as_str() | provenance | Sink:MaD:22 | -| sqlx.rs:120:29:120:42 | unsafe_query_1 | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:28 | +| sqlx.rs:120:29:120:42 | unsafe_query_1 | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:27 | | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:120:29:120:51 | unsafe_query_1.as_str() | provenance | Sink:MaD:20 | -| sqlx.rs:127:29:127:42 | unsafe_query_1 | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:28 | +| sqlx.rs:127:29:127:42 | unsafe_query_1 | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:27 | | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:127:29:127:51 | unsafe_query_1.as_str() | provenance | Sink:MaD:20 | -| sqlx.rs:136:55:136:68 | unsafe_query_1 | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:28 | +| sqlx.rs:136:55:136:68 | unsafe_query_1 | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:27 | | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() [&ref] | sqlx.rs:136:55:136:77 | unsafe_query_1.as_str() | provenance | Sink:MaD:21 | -| sqlx.rs:145:55:145:68 | unsafe_query_1 | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:28 | +| sqlx.rs:145:55:145:68 | unsafe_query_1 | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() [&ref] | provenance | MaD:27 | | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() [&ref] | sqlx.rs:145:55:145:77 | unsafe_query_1.as_str() | provenance | Sink:MaD:21 | -| sqlx.rs:153:29:153:42 | unsafe_query_1 | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:28 | +| sqlx.rs:153:29:153:42 | unsafe_query_1 | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:27 | | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() | provenance | Sink:MaD:20 | | sqlx.rs:173:9:173:21 | remote_string | sqlx.rs:175:84:175:96 | remote_string | provenance | | | sqlx.rs:173:25:173:69 | ...::get(...) | sqlx.rs:173:25:173:69 | ...::get(...) [Ok] | provenance | Src:MaD:23 | -| sqlx.rs:173:25:173:69 | ...::get(...) [Ok] | sqlx.rs:173:25:173:78 | ... .unwrap() | provenance | MaD:30 | -| sqlx.rs:173:25:173:78 | ... .unwrap() | sqlx.rs:173:25:173:85 | ... .text() [Ok] | provenance | MaD:32 | -| sqlx.rs:173:25:173:85 | ... .text() [Ok] | sqlx.rs:173:25:173:118 | ... .unwrap_or(...) | provenance | MaD:31 | +| sqlx.rs:173:25:173:69 | ...::get(...) [Ok] | sqlx.rs:173:25:173:78 | ... .unwrap() | provenance | MaD:29 | +| sqlx.rs:173:25:173:78 | ... .unwrap() | sqlx.rs:173:25:173:85 | ... .text() [Ok] | provenance | MaD:31 | +| sqlx.rs:173:25:173:85 | ... .text() [Ok] | sqlx.rs:173:25:173:118 | ... .unwrap_or(...) | provenance | MaD:30 | | sqlx.rs:173:25:173:118 | ... .unwrap_or(...) | sqlx.rs:173:9:173:21 | remote_string | provenance | | | sqlx.rs:175:9:175:22 | unsafe_query_1 | sqlx.rs:188:29:188:42 | unsafe_query_1 | provenance | | -| sqlx.rs:175:26:175:96 | ... + ... | sqlx.rs:175:26:175:102 | ... + ... | provenance | MaD:27 | +| sqlx.rs:175:26:175:96 | ... + ... | sqlx.rs:175:26:175:102 | ... + ... | provenance | MaD:26 | | sqlx.rs:175:26:175:102 | ... + ... | sqlx.rs:175:9:175:22 | unsafe_query_1 | provenance | | -| sqlx.rs:175:83:175:96 | &remote_string [&ref] | sqlx.rs:175:26:175:96 | ... + ... | provenance | MaD:26 | +| sqlx.rs:175:83:175:96 | &remote_string [&ref] | sqlx.rs:175:26:175:96 | ... + ... | provenance | MaD:25 | | sqlx.rs:175:84:175:96 | remote_string | sqlx.rs:175:83:175:96 | &remote_string [&ref] | provenance | | -| sqlx.rs:188:29:188:42 | unsafe_query_1 | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:28 | +| sqlx.rs:188:29:188:42 | unsafe_query_1 | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() [&ref] | provenance | MaD:27 | | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:188:29:188:51 | unsafe_query_1.as_str() | provenance | Sink:MaD:20 | models -| 1 | Sink: <_ as mysql::conn::queryable::Queryable>::query; Argument[0]; sql-injection | -| 2 | Sink: <_ as mysql::conn::queryable::Queryable>::query_drop; Argument[0]; sql-injection | -| 3 | Sink: <_ as mysql::conn::queryable::Queryable>::query_first; Argument[0]; sql-injection | -| 4 | Sink: <_ as mysql::conn::queryable::Queryable>::query_first_opt; Argument[0]; sql-injection | -| 5 | Sink: <_ as mysql::conn::queryable::Queryable>::query_fold; Argument[0]; sql-injection | -| 6 | Sink: <_ as mysql::conn::queryable::Queryable>::query_fold_opt; Argument[0]; sql-injection | -| 7 | Sink: <_ as mysql::conn::queryable::Queryable>::query_map; Argument[0]; sql-injection | -| 8 | Sink: <_ as mysql::conn::queryable::Queryable>::query_map_opt; Argument[0]; sql-injection | -| 9 | Sink: <_ as mysql::conn::queryable::Queryable>::query_opt; Argument[0]; sql-injection | -| 10 | Sink: <_ as mysql_async::queryable::Queryable>::query; Argument[0]; sql-injection | -| 11 | Sink: <_ as mysql_async::queryable::Queryable>::query_drop; Argument[0]; sql-injection | -| 12 | Sink: <_ as mysql_async::queryable::Queryable>::query_first; Argument[0]; sql-injection | -| 13 | Sink: <_ as mysql_async::queryable::Queryable>::query_fold; Argument[0]; sql-injection | -| 14 | Sink: <_ as mysql_async::queryable::Queryable>::query_map; Argument[0]; sql-injection | -| 15 | Sink: <_ as mysql_async::queryable::Queryable>::query_stream; Argument[0]; sql-injection | -| 16 | Sink: ::prep; Argument[0]; sql-injection | -| 17 | Sink: ::query_iter; Argument[0]; sql-injection | -| 18 | Sink: ::prep; Argument[0]; sql-injection | -| 19 | Sink: ::query_iter; Argument[0]; sql-injection | +| 1 | Sink: ::prep; Argument[0]; sql-injection | +| 2 | Sink: ::query_iter; Argument[0]; sql-injection | +| 3 | Sink: ::prep; Argument[0]; sql-injection | +| 4 | Sink: ::query_iter; Argument[0]; sql-injection | +| 5 | Sink: mysql::conn::queryable::Queryable::query; Argument[0]; sql-injection | +| 6 | Sink: mysql::conn::queryable::Queryable::query_drop; Argument[0]; sql-injection | +| 7 | Sink: mysql::conn::queryable::Queryable::query_first; Argument[0]; sql-injection | +| 8 | Sink: mysql::conn::queryable::Queryable::query_first_opt; Argument[0]; sql-injection | +| 9 | Sink: mysql::conn::queryable::Queryable::query_fold; Argument[0]; sql-injection | +| 10 | Sink: mysql::conn::queryable::Queryable::query_fold_opt; Argument[0]; sql-injection | +| 11 | Sink: mysql::conn::queryable::Queryable::query_map; Argument[0]; sql-injection | +| 12 | Sink: mysql::conn::queryable::Queryable::query_map_opt; Argument[0]; sql-injection | +| 13 | Sink: mysql::conn::queryable::Queryable::query_opt; Argument[0]; sql-injection | +| 14 | Sink: mysql_async::queryable::Queryable::query; Argument[0]; sql-injection | +| 15 | Sink: mysql_async::queryable::Queryable::query_drop; Argument[0]; sql-injection | +| 16 | Sink: mysql_async::queryable::Queryable::query_first; Argument[0]; sql-injection | +| 17 | Sink: mysql_async::queryable::Queryable::query_fold; Argument[0]; sql-injection | +| 18 | Sink: mysql_async::queryable::Queryable::query_map; Argument[0]; sql-injection | +| 19 | Sink: mysql_async::queryable::Queryable::query_stream; Argument[0]; sql-injection | | 20 | Sink: sqlx_core::query::query; Argument[0]; sql-injection | | 21 | Sink: sqlx_core::query_as::query_as; Argument[0]; sql-injection | | 22 | Sink: sqlx_core::raw_sql::raw_sql; Argument[0]; sql-injection | | 23 | Source: reqwest::blocking::get; ReturnValue.Field[core::result::Result::Ok(0)]; remote | | 24 | Source: std::env::args; ReturnValue.Element; commandargs | -| 25 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 26 | Summary: ::add; Argument[0].Reference; ReturnValue; taint | -| 27 | Summary: ::add; Argument[self]; ReturnValue; taint | -| 28 | Summary: ::as_str; Argument[self].Reference; ReturnValue.Reference; taint | -| 29 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 30 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 31 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 32 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 33 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | -| 34 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | +| 25 | Summary: ::add; Argument[0].Reference; ReturnValue; taint | +| 26 | Summary: ::add; Argument[self]; ReturnValue; taint | +| 27 | Summary: ::as_str; Argument[self].Reference; ReturnValue.Reference; taint | +| 28 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 29 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 30 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 31 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 32 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 33 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | +| 34 | Summary: core::iter::traits::iterator::Iterator::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | nodes | mysql.rs:12:13:12:29 | mut remote_string | semmle.label | mut remote_string | | mysql.rs:12:33:12:77 | ...::get(...) | semmle.label | ...::get(...) | diff --git a/rust/ql/test/query-tests/security/CWE-117/LogInjection.expected b/rust/ql/test/query-tests/security/CWE-117/LogInjection.expected index 60392bc0df12..ad2659ce297f 100644 --- a/rust/ql/test/query-tests/security/CWE-117/LogInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-117/LogInjection.expected @@ -21,7 +21,7 @@ edges | main.rs:8:9:8:12 | args [element] | main.rs:9:20:9:23 | args [element] | provenance | | | main.rs:8:29:8:39 | ...::args(...) | main.rs:8:29:8:39 | ...::args(...) [element] | provenance | Src:MaD:6 | -| main.rs:8:29:8:39 | ...::args(...) [element] | main.rs:8:29:8:49 | ... .collect() [element] | provenance | MaD:10 | +| main.rs:8:29:8:39 | ...::args(...) [element] | main.rs:8:29:8:49 | ... .collect() [element] | provenance | MaD:22 | | main.rs:8:29:8:49 | ... .collect() [element] | main.rs:8:9:8:12 | args [element] | provenance | | | main.rs:9:9:9:16 | username | main.rs:15:11:15:36 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:9:9:9:16 | username | main.rs:18:12:18:37 | MacroExpr | provenance | Sink:MaD:1 | @@ -29,37 +29,37 @@ edges | main.rs:9:9:9:16 | username | main.rs:26:55:26:62 | username | provenance | | | main.rs:9:9:9:16 | username | main.rs:30:11:30:66 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:9:9:9:16 | username | main.rs:52:29:52:36 | username | provenance | | -| main.rs:9:20:9:23 | args [element] | main.rs:9:20:9:30 | args.get(...) [Some, &ref] | provenance | MaD:13 | -| main.rs:9:20:9:30 | args.get(...) [Some, &ref] | main.rs:9:20:9:64 | ... .unwrap_or(...) [&ref] | provenance | MaD:16 | -| main.rs:9:20:9:64 | ... .unwrap_or(...) [&ref] | main.rs:9:20:9:72 | ... .clone() | provenance | MaD:9 | +| main.rs:9:20:9:23 | args [element] | main.rs:9:20:9:30 | args.get(...) [Some, &ref] | provenance | MaD:9 | +| main.rs:9:20:9:30 | args.get(...) [Some, &ref] | main.rs:9:20:9:64 | ... .unwrap_or(...) [&ref] | provenance | MaD:12 | +| main.rs:9:20:9:64 | ... .unwrap_or(...) [&ref] | main.rs:9:20:9:72 | ... .clone() | provenance | MaD:20 | | main.rs:9:20:9:72 | ... .clone() | main.rs:9:9:9:16 | username | provenance | | | main.rs:10:9:10:18 | user_input | main.rs:16:11:16:44 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:10:9:10:18 | user_input | main.rs:19:12:19:39 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:10:22:10:48 | ...::var(...) | main.rs:10:22:10:48 | ...::var(...) [Ok] | provenance | Src:MaD:7 | -| main.rs:10:22:10:48 | ...::var(...) [Ok] | main.rs:10:22:10:81 | ... .unwrap_or(...) | provenance | MaD:19 | +| main.rs:10:22:10:48 | ...::var(...) [Ok] | main.rs:10:22:10:81 | ... .unwrap_or(...) | provenance | MaD:15 | | main.rs:10:22:10:81 | ... .unwrap_or(...) | main.rs:10:9:10:18 | user_input | provenance | | | main.rs:11:9:11:19 | remote_data | main.rs:17:12:17:46 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:11:9:11:19 | remote_data | main.rs:30:11:30:66 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:11:23:11:71 | ...::get(...) | main.rs:11:23:11:71 | ...::get(...) [Ok] | provenance | Src:MaD:5 | -| main.rs:11:23:11:71 | ...::get(...) [Ok] | main.rs:11:23:12:17 | ... .unwrap() | provenance | MaD:18 | -| main.rs:11:23:12:17 | ... .unwrap() | main.rs:11:23:12:24 | ... .text() [Ok] | provenance | MaD:21 | -| main.rs:11:23:12:24 | ... .text() [Ok] | main.rs:11:23:12:61 | ... .unwrap_or(...) | provenance | MaD:19 | +| main.rs:11:23:11:71 | ...::get(...) [Ok] | main.rs:11:23:12:17 | ... .unwrap() | provenance | MaD:14 | +| main.rs:11:23:12:17 | ... .unwrap() | main.rs:11:23:12:24 | ... .text() [Ok] | provenance | MaD:17 | +| main.rs:11:23:12:24 | ... .text() [Ok] | main.rs:11:23:12:61 | ... .unwrap_or(...) | provenance | MaD:15 | | main.rs:11:23:12:61 | ... .unwrap_or(...) | main.rs:11:9:11:19 | remote_data | provenance | | | main.rs:22:9:22:21 | formatted_msg | main.rs:23:11:23:29 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:22:33:22:63 | ...::format(...) | main.rs:22:33:22:63 | { ... } | provenance | | | main.rs:22:33:22:63 | ...::must_use(...) | main.rs:22:9:22:21 | formatted_msg | provenance | | -| main.rs:22:33:22:63 | MacroExpr | main.rs:22:33:22:63 | ...::format(...) | provenance | MaD:22 | -| main.rs:22:33:22:63 | { ... } | main.rs:22:33:22:63 | ...::must_use(...) | provenance | MaD:23 | +| main.rs:22:33:22:63 | MacroExpr | main.rs:22:33:22:63 | ...::format(...) | provenance | MaD:18 | +| main.rs:22:33:22:63 | { ... } | main.rs:22:33:22:63 | ...::must_use(...) | provenance | MaD:21 | | main.rs:26:9:26:18 | concat_msg | main.rs:27:11:27:26 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:26:22:26:62 | ... + ... | main.rs:26:9:26:18 | concat_msg | provenance | | -| main.rs:26:54:26:62 | &username [&ref] | main.rs:26:22:26:62 | ... + ... | provenance | MaD:12 | +| main.rs:26:54:26:62 | &username [&ref] | main.rs:26:22:26:62 | ... + ... | provenance | MaD:8 | | main.rs:26:55:26:62 | username | main.rs:26:54:26:62 | &username [&ref] | provenance | | | main.rs:52:28:52:36 | &username [&ref] | main.rs:56:27:56:40 | ...: ... [&ref] | provenance | | | main.rs:52:29:52:36 | username | main.rs:52:28:52:36 | &username [&ref] | provenance | | | main.rs:56:27:56:40 | ...: ... [&ref] | main.rs:65:38:65:45 | username [&ref] | provenance | | | main.rs:65:9:65:17 | user_info [UserInfo] | main.rs:66:28:66:36 | user_info [UserInfo] | provenance | | | main.rs:65:21:65:59 | UserInfo {...} [UserInfo] | main.rs:65:9:65:17 | user_info [UserInfo] | provenance | | -| main.rs:65:38:65:45 | username [&ref] | main.rs:65:38:65:57 | username.to_string() | provenance | MaD:8 | +| main.rs:65:38:65:45 | username [&ref] | main.rs:65:38:65:57 | username.to_string() | provenance | MaD:19 | | main.rs:65:38:65:57 | username.to_string() | main.rs:65:21:65:59 | UserInfo {...} [UserInfo] | provenance | | | main.rs:66:28:66:36 | user_info [UserInfo] | main.rs:66:28:66:41 | user_info.name | provenance | | | main.rs:66:28:66:41 | user_info.name | main.rs:66:11:66:41 | MacroExpr | provenance | Sink:MaD:1 | @@ -70,20 +70,20 @@ edges | main.rs:109:13:109:21 | user_data | main.rs:116:16:116:37 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:109:13:109:21 | user_data | main.rs:119:15:119:75 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:109:25:109:40 | ...::args(...) | main.rs:109:25:109:40 | ...::args(...) [element] | provenance | Src:MaD:6 | -| main.rs:109:25:109:40 | ...::args(...) [element] | main.rs:109:25:109:47 | ... .nth(...) [Some] | provenance | MaD:11 | -| main.rs:109:25:109:47 | ... .nth(...) [Some] | main.rs:109:25:109:67 | ... .unwrap_or_default() | provenance | MaD:17 | +| main.rs:109:25:109:40 | ...::args(...) [element] | main.rs:109:25:109:47 | ... .nth(...) [Some] | provenance | MaD:23 | +| main.rs:109:25:109:47 | ... .nth(...) [Some] | main.rs:109:25:109:67 | ... .unwrap_or_default() | provenance | MaD:13 | | main.rs:109:25:109:67 | ... .unwrap_or_default() | main.rs:109:13:109:21 | user_data | provenance | | | main.rs:127:13:127:21 | user_data | main.rs:130:18:130:38 | MacroExpr | provenance | Sink:MaD:3 | | main.rs:127:13:127:21 | user_data | main.rs:131:19:131:49 | MacroExpr | provenance | Sink:MaD:2 | | main.rs:127:25:127:45 | ...::var(...) | main.rs:127:25:127:45 | ...::var(...) [Ok] | provenance | Src:MaD:7 | -| main.rs:127:25:127:45 | ...::var(...) [Ok] | main.rs:127:25:127:65 | ... .unwrap_or_default() | provenance | MaD:20 | +| main.rs:127:25:127:45 | ...::var(...) [Ok] | main.rs:127:25:127:65 | ... .unwrap_or_default() | provenance | MaD:16 | | main.rs:127:25:127:65 | ... .unwrap_or_default() | main.rs:127:13:127:21 | user_data | provenance | | | main.rs:141:13:141:18 | m_path [Some] | main.rs:143:26:143:31 | m_path [Some] | provenance | | -| main.rs:141:22:141:27 | o_path | main.rs:141:22:141:38 | o_path.map(...) [Some] | provenance | MaD:14 | -| main.rs:141:22:141:27 | o_path | main.rs:141:34:141:34 | ... | provenance | MaD:14 | +| main.rs:141:22:141:27 | o_path | main.rs:141:22:141:38 | o_path.map(...) [Some] | provenance | MaD:10 | +| main.rs:141:22:141:27 | o_path | main.rs:141:34:141:34 | ... | provenance | MaD:10 | | main.rs:141:22:141:38 | o_path.map(...) [Some] | main.rs:141:13:141:18 | m_path [Some] | provenance | | | main.rs:141:34:141:34 | ... | main.rs:141:37:141:37 | x | provenance | | -| main.rs:143:26:143:31 | m_path [Some] | main.rs:143:26:143:40 | m_path.unwrap() | provenance | MaD:15 | +| main.rs:143:26:143:31 | m_path [Some] | main.rs:143:26:143:40 | m_path.unwrap() | provenance | MaD:11 | | main.rs:143:26:143:40 | m_path.unwrap() | main.rs:143:18:143:40 | MacroExpr | provenance | Sink:MaD:3 | | main.rs:150:32:150:48 | my_axum_handler_1 | main.rs:141:22:141:27 | o_path | provenance | Src:MaD:4 | models @@ -94,22 +94,22 @@ models | 5 | Source: reqwest::blocking::get; ReturnValue.Field[core::result::Result::Ok(0)]; remote | | 6 | Source: std::env::args; ReturnValue.Element; commandargs | | 7 | Source: std::env::var; ReturnValue.Field[core::result::Result::Ok(0)]; environment | -| 8 | Summary: <_ as alloc::string::ToString>::to_string; Argument[self].Reference; ReturnValue; taint | -| 9 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | -| 10 | Summary: <_ as core::iter::traits::iterator::Iterator>::collect; Argument[self].Element; ReturnValue.Element; value | -| 11 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 12 | Summary: ::add; Argument[0].Reference; ReturnValue; taint | -| 13 | Summary: ::deref; Argument[self].Reference.Element; ReturnValue.Reference.Element; value | -| 14 | Summary: ::map; Argument[self].Field[core::option::Option::Some(0)]; Argument[0].Parameter[0]; value | -| 15 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 16 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 17 | Summary: ::unwrap_or_default; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 18 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 19 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 20 | Summary: ::unwrap_or_default; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 21 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 22 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | -| 23 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | +| 8 | Summary: ::add; Argument[0].Reference; ReturnValue; taint | +| 9 | Summary: ::deref; Argument[self].Reference.Element; ReturnValue.Reference.Element; value | +| 10 | Summary: ::map; Argument[self].Field[core::option::Option::Some(0)]; Argument[0].Parameter[0]; value | +| 11 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 12 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 13 | Summary: ::unwrap_or_default; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 14 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 15 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 16 | Summary: ::unwrap_or_default; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 17 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 18 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 19 | Summary: alloc::string::ToString::to_string; Argument[self].Reference; ReturnValue; taint | +| 20 | Summary: core::clone::Clone::clone; Argument[self].Reference; ReturnValue; value | +| 21 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | +| 22 | Summary: core::iter::traits::iterator::Iterator::collect; Argument[self].Element; ReturnValue.Element; value | +| 23 | Summary: core::iter::traits::iterator::Iterator::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | nodes | main.rs:8:9:8:12 | args [element] | semmle.label | args [element] | | main.rs:8:29:8:39 | ...::args(...) | semmle.label | ...::args(...) | diff --git a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected index 3a96605753f6..702f5f48952d 100644 --- a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected +++ b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected @@ -115,14 +115,14 @@ edges | test_logging.rs:93:15:93:22 | password | test_logging.rs:93:14:93:22 | &password | provenance | Config | | test_logging.rs:96:9:96:10 | m2 | test_logging.rs:97:11:97:18 | MacroExpr | provenance | Sink:MaD:11 | | test_logging.rs:96:14:96:49 | ... + ... | test_logging.rs:96:9:96:10 | m2 | provenance | | -| test_logging.rs:96:41:96:49 | &password | test_logging.rs:96:14:96:49 | ... + ... | provenance | MaD:16 | -| test_logging.rs:96:41:96:49 | &password [&ref] | test_logging.rs:96:14:96:49 | ... + ... | provenance | MaD:16 | +| test_logging.rs:96:41:96:49 | &password | test_logging.rs:96:14:96:49 | ... + ... | provenance | MaD:15 | +| test_logging.rs:96:41:96:49 | &password [&ref] | test_logging.rs:96:14:96:49 | ... + ... | provenance | MaD:15 | | test_logging.rs:96:42:96:49 | password | test_logging.rs:96:41:96:49 | &password | provenance | Config | | test_logging.rs:96:42:96:49 | password | test_logging.rs:96:41:96:49 | &password [&ref] | provenance | | | test_logging.rs:99:9:99:10 | m3 | test_logging.rs:100:11:100:18 | MacroExpr | provenance | Sink:MaD:11 | | test_logging.rs:99:22:99:45 | ...::format(...) | test_logging.rs:99:22:99:45 | { ... } | provenance | | | test_logging.rs:99:22:99:45 | ...::must_use(...) | test_logging.rs:99:9:99:10 | m3 | provenance | | -| test_logging.rs:99:22:99:45 | MacroExpr | test_logging.rs:99:22:99:45 | ...::format(...) | provenance | MaD:19 | +| test_logging.rs:99:22:99:45 | MacroExpr | test_logging.rs:99:22:99:45 | ...::format(...) | provenance | MaD:18 | | test_logging.rs:99:22:99:45 | { ... } | test_logging.rs:99:22:99:45 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:99:38:99:45 | password | test_logging.rs:99:22:99:45 | MacroExpr | provenance | | | test_logging.rs:118:28:118:41 | get_password(...) | test_logging.rs:118:12:118:41 | MacroExpr | provenance | Sink:MaD:11 | @@ -139,7 +139,7 @@ edges | test_logging.rs:176:34:176:79 | MacroExpr | test_logging.rs:176:33:176:79 | &... [&ref] | provenance | | | test_logging.rs:176:42:176:78 | ...::format(...) | test_logging.rs:176:42:176:78 | { ... } | provenance | | | test_logging.rs:176:42:176:78 | ...::must_use(...) | test_logging.rs:176:34:176:79 | MacroExpr | provenance | | -| test_logging.rs:176:42:176:78 | MacroExpr | test_logging.rs:176:42:176:78 | ...::format(...) | provenance | MaD:19 | +| test_logging.rs:176:42:176:78 | MacroExpr | test_logging.rs:176:42:176:78 | ...::format(...) | provenance | MaD:18 | | test_logging.rs:176:42:176:78 | { ... } | test_logging.rs:176:42:176:78 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:176:70:176:78 | password2 | test_logging.rs:176:42:176:78 | MacroExpr | provenance | | | test_logging.rs:180:35:180:81 | &... | test_logging.rs:180:35:180:81 | &... | provenance | Sink:MaD:3 | @@ -148,12 +148,12 @@ edges | test_logging.rs:180:36:180:81 | MacroExpr | test_logging.rs:180:35:180:81 | &... [&ref] | provenance | | | test_logging.rs:180:44:180:80 | ...::format(...) | test_logging.rs:180:44:180:80 | { ... } | provenance | | | test_logging.rs:180:44:180:80 | ...::must_use(...) | test_logging.rs:180:36:180:81 | MacroExpr | provenance | | -| test_logging.rs:180:44:180:80 | MacroExpr | test_logging.rs:180:44:180:80 | ...::format(...) | provenance | MaD:19 | +| test_logging.rs:180:44:180:80 | MacroExpr | test_logging.rs:180:44:180:80 | ...::format(...) | provenance | MaD:18 | | test_logging.rs:180:44:180:80 | { ... } | test_logging.rs:180:44:180:80 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:180:72:180:80 | password2 | test_logging.rs:180:44:180:80 | MacroExpr | provenance | | | test_logging.rs:183:9:183:19 | err_result2 [Err] | test_logging.rs:184:13:184:23 | err_result2 | provenance | Sink:MaD:4 | | test_logging.rs:183:47:183:68 | Err(...) [Err] | test_logging.rs:183:9:183:19 | err_result2 [Err] | provenance | | -| test_logging.rs:183:51:183:59 | password2 | test_logging.rs:183:51:183:67 | password2.clone() | provenance | MaD:15 | +| test_logging.rs:183:51:183:59 | password2 | test_logging.rs:183:51:183:67 | password2.clone() | provenance | MaD:19 | | test_logging.rs:183:51:183:67 | password2.clone() | test_logging.rs:183:47:183:68 | Err(...) [Err] | provenance | | | test_logging.rs:187:9:187:19 | err_result3 [Err] | test_logging.rs:188:13:188:23 | err_result3 | provenance | Sink:MaD:5 | | test_logging.rs:187:47:187:60 | Err(...) [Err] | test_logging.rs:187:9:187:19 | err_result3 [Err] | provenance | | @@ -180,39 +180,39 @@ edges | test_logging.rs:226:36:226:59 | ...::Some(...) [Some] | test_logging.rs:226:36:226:59 | ...::Some(...) | provenance | Sink:MaD:9 | | test_logging.rs:226:36:226:59 | MacroExpr | test_logging.rs:226:36:226:59 | ...::Some(...) [Some] | provenance | | | test_logging.rs:226:52:226:59 | password | test_logging.rs:226:36:226:59 | MacroExpr | provenance | | -| test_logging.rs:229:30:229:62 | MacroExpr | test_logging.rs:229:30:229:71 | ... .as_str() [&ref] | provenance | MaD:18 | +| test_logging.rs:229:30:229:62 | MacroExpr | test_logging.rs:229:30:229:71 | ... .as_str() [&ref] | provenance | MaD:17 | | test_logging.rs:229:30:229:71 | ... .as_str() [&ref] | test_logging.rs:229:30:229:71 | ... .as_str() | provenance | Sink:MaD:2 | | test_logging.rs:229:38:229:61 | ...::format(...) | test_logging.rs:229:38:229:61 | { ... } | provenance | | | test_logging.rs:229:38:229:61 | ...::must_use(...) | test_logging.rs:229:30:229:62 | MacroExpr | provenance | | -| test_logging.rs:229:38:229:61 | MacroExpr | test_logging.rs:229:38:229:61 | ...::format(...) | provenance | MaD:19 | +| test_logging.rs:229:38:229:61 | MacroExpr | test_logging.rs:229:38:229:61 | ...::format(...) | provenance | MaD:18 | | test_logging.rs:229:38:229:61 | { ... } | test_logging.rs:229:38:229:61 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:229:54:229:61 | password | test_logging.rs:229:38:229:61 | MacroExpr | provenance | | -| test_logging.rs:242:16:242:50 | MacroExpr | test_logging.rs:242:16:242:61 | ... .as_bytes() [&ref, element] | provenance | MaD:17 | +| test_logging.rs:242:16:242:50 | MacroExpr | test_logging.rs:242:16:242:61 | ... .as_bytes() [&ref, element] | provenance | MaD:16 | | test_logging.rs:242:16:242:61 | ... .as_bytes() [&ref, element] | test_logging.rs:242:16:242:61 | ... .as_bytes() | provenance | Sink:MaD:7 Sink:MaD:7 | | test_logging.rs:242:24:242:49 | ...::format(...) | test_logging.rs:242:24:242:49 | { ... } | provenance | | | test_logging.rs:242:24:242:49 | ...::must_use(...) | test_logging.rs:242:16:242:50 | MacroExpr | provenance | | -| test_logging.rs:242:24:242:49 | MacroExpr | test_logging.rs:242:24:242:49 | ...::format(...) | provenance | MaD:19 | +| test_logging.rs:242:24:242:49 | MacroExpr | test_logging.rs:242:24:242:49 | ...::format(...) | provenance | MaD:18 | | test_logging.rs:242:24:242:49 | { ... } | test_logging.rs:242:24:242:49 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:242:42:242:49 | password | test_logging.rs:242:24:242:49 | MacroExpr | provenance | | -| test_logging.rs:245:20:245:54 | MacroExpr | test_logging.rs:245:20:245:65 | ... .as_bytes() [&ref, element] | provenance | MaD:17 | +| test_logging.rs:245:20:245:54 | MacroExpr | test_logging.rs:245:20:245:65 | ... .as_bytes() [&ref, element] | provenance | MaD:16 | | test_logging.rs:245:20:245:65 | ... .as_bytes() [&ref, element] | test_logging.rs:245:20:245:65 | ... .as_bytes() | provenance | Sink:MaD:8 Sink:MaD:8 | | test_logging.rs:245:28:245:53 | ...::format(...) | test_logging.rs:245:28:245:53 | { ... } | provenance | | | test_logging.rs:245:28:245:53 | ...::must_use(...) | test_logging.rs:245:20:245:54 | MacroExpr | provenance | | -| test_logging.rs:245:28:245:53 | MacroExpr | test_logging.rs:245:28:245:53 | ...::format(...) | provenance | MaD:19 | +| test_logging.rs:245:28:245:53 | MacroExpr | test_logging.rs:245:28:245:53 | ...::format(...) | provenance | MaD:18 | | test_logging.rs:245:28:245:53 | { ... } | test_logging.rs:245:28:245:53 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:245:46:245:53 | password | test_logging.rs:245:28:245:53 | MacroExpr | provenance | | -| test_logging.rs:248:15:248:49 | MacroExpr | test_logging.rs:248:15:248:60 | ... .as_bytes() [&ref, element] | provenance | MaD:17 | +| test_logging.rs:248:15:248:49 | MacroExpr | test_logging.rs:248:15:248:60 | ... .as_bytes() [&ref, element] | provenance | MaD:16 | | test_logging.rs:248:15:248:60 | ... .as_bytes() [&ref, element] | test_logging.rs:248:15:248:60 | ... .as_bytes() | provenance | Sink:MaD:7 Sink:MaD:7 | | test_logging.rs:248:23:248:48 | ...::format(...) | test_logging.rs:248:23:248:48 | { ... } | provenance | | | test_logging.rs:248:23:248:48 | ...::must_use(...) | test_logging.rs:248:15:248:49 | MacroExpr | provenance | | -| test_logging.rs:248:23:248:48 | MacroExpr | test_logging.rs:248:23:248:48 | ...::format(...) | provenance | MaD:19 | +| test_logging.rs:248:23:248:48 | MacroExpr | test_logging.rs:248:23:248:48 | ...::format(...) | provenance | MaD:18 | | test_logging.rs:248:23:248:48 | { ... } | test_logging.rs:248:23:248:48 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:248:41:248:48 | password | test_logging.rs:248:23:248:48 | MacroExpr | provenance | | -| test_logging.rs:251:15:251:49 | MacroExpr | test_logging.rs:251:15:251:60 | ... .as_bytes() [&ref, element] | provenance | MaD:17 | +| test_logging.rs:251:15:251:49 | MacroExpr | test_logging.rs:251:15:251:60 | ... .as_bytes() [&ref, element] | provenance | MaD:16 | | test_logging.rs:251:15:251:60 | ... .as_bytes() [&ref, element] | test_logging.rs:251:15:251:60 | ... .as_bytes() | provenance | Sink:MaD:6 Sink:MaD:6 | | test_logging.rs:251:23:251:48 | ...::format(...) | test_logging.rs:251:23:251:48 | { ... } | provenance | | | test_logging.rs:251:23:251:48 | ...::must_use(...) | test_logging.rs:251:15:251:49 | MacroExpr | provenance | | -| test_logging.rs:251:23:251:48 | MacroExpr | test_logging.rs:251:23:251:48 | ...::format(...) | provenance | MaD:19 | +| test_logging.rs:251:23:251:48 | MacroExpr | test_logging.rs:251:23:251:48 | ...::format(...) | provenance | MaD:18 | | test_logging.rs:251:23:251:48 | { ... } | test_logging.rs:251:23:251:48 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:251:41:251:48 | password | test_logging.rs:251:23:251:48 | MacroExpr | provenance | | models @@ -230,11 +230,11 @@ models | 12 | Sink: log::__private_api::log; Argument[3]; log-injection | | 13 | Sink: std::io::stdio::_eprint; Argument[0]; log-injection | | 14 | Sink: std::io::stdio::_print; Argument[0]; log-injection | -| 15 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | -| 16 | Summary: ::add; Argument[0].Reference; ReturnValue; taint | -| 17 | Summary: ::as_bytes; Argument[self].Reference; ReturnValue.Reference.Element; taint | -| 18 | Summary: ::as_str; Argument[self].Reference; ReturnValue.Reference; taint | -| 19 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 15 | Summary: ::add; Argument[0].Reference; ReturnValue; taint | +| 16 | Summary: ::as_bytes; Argument[self].Reference; ReturnValue.Reference.Element; taint | +| 17 | Summary: ::as_str; Argument[self].Reference; ReturnValue.Reference; taint | +| 18 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 19 | Summary: core::clone::Clone::clone; Argument[self].Reference; ReturnValue; value | | 20 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes | test_logging.rs:42:12:42:35 | MacroExpr | semmle.label | MacroExpr | diff --git a/rust/ql/test/query-tests/security/CWE-614/InsecureCookie.expected b/rust/ql/test/query-tests/security/CWE-614/InsecureCookie.expected index e6a8a85922ca..3719d4c9d7e2 100644 --- a/rust/ql/test/query-tests/security/CWE-614/InsecureCookie.expected +++ b/rust/ql/test/query-tests/security/CWE-614/InsecureCookie.expected @@ -76,59 +76,59 @@ | main.rs:281:13:281:27 | cookie2.clone() | main.rs:280:5:280:11 | [SSA] cookie2 | main.rs:281:13:281:27 | cookie2.clone() | Cookie attribute 'Secure' is not set to true. | | main.rs:281:13:281:27 | cookie2.clone() | main.rs:280:5:280:11 | cookie2 | main.rs:281:13:281:27 | cookie2.clone() | Cookie attribute 'Secure' is not set to true. | edges -| main.rs:8:19:8:50 | ...::build(...) | main.rs:8:19:8:64 | ... .secure(...) | provenance | MaD:35 | +| main.rs:8:19:8:50 | ...::build(...) | main.rs:8:19:8:64 | ... .secure(...) | provenance | MaD:34 | | main.rs:8:19:8:64 | ... .secure(...) | main.rs:8:19:8:64 | ... .secure(...) | provenance | Sink:MaD:2 | | main.rs:16:19:16:50 | ...::build(...) | main.rs:16:19:16:50 | ...::build(...) | provenance | Src:MaD:15 Sink:MaD:2 | -| main.rs:20:5:20:36 | ...::build(...) | main.rs:20:5:20:54 | ... .secure(...) | provenance | MaD:35 | +| main.rs:20:5:20:36 | ...::build(...) | main.rs:20:5:20:54 | ... .secure(...) | provenance | MaD:34 | | main.rs:20:5:20:54 | ... .secure(...) | main.rs:20:5:20:54 | ... .secure(...) | provenance | Sink:MaD:2 | -| main.rs:21:5:21:36 | ...::build(...) | main.rs:21:5:21:55 | ... .secure(...) | provenance | MaD:35 | +| main.rs:21:5:21:36 | ...::build(...) | main.rs:21:5:21:55 | ... .secure(...) | provenance | MaD:34 | | main.rs:21:5:21:55 | ... .secure(...) | main.rs:21:5:21:55 | ... .secure(...) | provenance | Sink:MaD:2 | -| main.rs:25:5:25:36 | ...::build(...) | main.rs:25:5:25:52 | ... .secure(...) | provenance | MaD:35 | +| main.rs:25:5:25:36 | ...::build(...) | main.rs:25:5:25:52 | ... .secure(...) | provenance | MaD:34 | | main.rs:25:5:25:52 | ... .secure(...) | main.rs:25:5:25:52 | ... .secure(...) | provenance | Sink:MaD:2 | -| main.rs:26:5:26:36 | ...::build(...) | main.rs:26:5:26:50 | ... .secure(...) | provenance | MaD:35 | +| main.rs:26:5:26:36 | ...::build(...) | main.rs:26:5:26:50 | ... .secure(...) | provenance | MaD:34 | | main.rs:26:5:26:50 | ... .secure(...) | main.rs:26:5:26:50 | ... .secure(...) | provenance | Sink:MaD:2 | -| main.rs:27:5:27:36 | ...::build(...) | main.rs:27:5:27:51 | ... .secure(...) | provenance | MaD:35 | +| main.rs:27:5:27:36 | ...::build(...) | main.rs:27:5:27:51 | ... .secure(...) | provenance | MaD:34 | | main.rs:27:5:27:51 | ... .secure(...) | main.rs:27:5:27:51 | ... .secure(...) | provenance | Sink:MaD:2 | -| main.rs:28:5:28:36 | ...::build(...) | main.rs:28:5:28:60 | ... .secure(...) | provenance | MaD:35 | +| main.rs:28:5:28:36 | ...::build(...) | main.rs:28:5:28:60 | ... .secure(...) | provenance | MaD:34 | | main.rs:28:5:28:60 | ... .secure(...) | main.rs:28:5:28:60 | ... .secure(...) | provenance | Sink:MaD:2 | -| main.rs:29:5:29:36 | ...::build(...) | main.rs:29:5:29:60 | ... .secure(...) | provenance | MaD:35 | +| main.rs:29:5:29:36 | ...::build(...) | main.rs:29:5:29:60 | ... .secure(...) | provenance | MaD:34 | | main.rs:29:5:29:60 | ... .secure(...) | main.rs:29:5:29:60 | ... .secure(...) | provenance | Sink:MaD:2 | -| main.rs:33:9:33:40 | ...::build(...) | main.rs:33:9:33:58 | ... .secure(...) | provenance | MaD:35 | +| main.rs:33:9:33:40 | ...::build(...) | main.rs:33:9:33:58 | ... .secure(...) | provenance | MaD:34 | | main.rs:33:9:33:58 | ... .secure(...) | main.rs:33:9:33:58 | ... .secure(...) | provenance | Sink:MaD:2 | -| main.rs:35:9:35:40 | ...::build(...) | main.rs:35:9:35:58 | ... .secure(...) | provenance | MaD:35 | +| main.rs:35:9:35:40 | ...::build(...) | main.rs:35:9:35:58 | ... .secure(...) | provenance | MaD:34 | | main.rs:35:9:35:58 | ... .secure(...) | main.rs:35:9:35:58 | ... .secure(...) | provenance | Sink:MaD:2 | -| main.rs:39:5:39:39 | ...::new(...) | main.rs:39:5:39:53 | ... .secure(...) | provenance | MaD:35 | +| main.rs:39:5:39:39 | ...::new(...) | main.rs:39:5:39:53 | ... .secure(...) | provenance | MaD:34 | | main.rs:39:5:39:53 | ... .secure(...) | main.rs:39:5:39:53 | ... .secure(...) | provenance | Sink:MaD:2 | -| main.rs:40:5:40:50 | ... .expires(...) | main.rs:40:5:40:64 | ... .secure(...) | provenance | MaD:35 | +| main.rs:40:5:40:50 | ... .expires(...) | main.rs:40:5:40:64 | ... .secure(...) | provenance | MaD:34 | | main.rs:40:5:40:64 | ... .secure(...) | main.rs:40:5:40:64 | ... .secure(...) | provenance | Sink:MaD:2 | -| main.rs:41:5:41:79 | ... .max_age(...) | main.rs:41:5:41:93 | ... .secure(...) | provenance | MaD:35 | +| main.rs:41:5:41:79 | ... .max_age(...) | main.rs:41:5:41:93 | ... .secure(...) | provenance | MaD:34 | | main.rs:41:5:41:93 | ... .secure(...) | main.rs:41:5:41:93 | ... .secure(...) | provenance | Sink:MaD:2 | -| main.rs:42:5:42:58 | ... .domain(...) | main.rs:42:5:42:72 | ... .secure(...) | provenance | MaD:35 | +| main.rs:42:5:42:58 | ... .domain(...) | main.rs:42:5:42:72 | ... .secure(...) | provenance | MaD:34 | | main.rs:42:5:42:72 | ... .secure(...) | main.rs:42:5:42:72 | ... .secure(...) | provenance | Sink:MaD:2 | -| main.rs:43:5:43:46 | ... .path(...) | main.rs:43:5:43:60 | ... .secure(...) | provenance | MaD:35 | +| main.rs:43:5:43:46 | ... .path(...) | main.rs:43:5:43:60 | ... .secure(...) | provenance | MaD:34 | | main.rs:43:5:43:60 | ... .secure(...) | main.rs:43:5:43:60 | ... .secure(...) | provenance | Sink:MaD:2 | -| main.rs:44:5:44:52 | ... .http_only(...) | main.rs:44:5:44:66 | ... .secure(...) | provenance | MaD:35 | +| main.rs:44:5:44:52 | ... .http_only(...) | main.rs:44:5:44:66 | ... .secure(...) | provenance | MaD:34 | | main.rs:44:5:44:66 | ... .secure(...) | main.rs:44:5:44:66 | ... .secure(...) | provenance | Sink:MaD:2 | -| main.rs:45:5:45:72 | ... .same_site(...) | main.rs:45:5:45:86 | ... .secure(...) | provenance | MaD:35 | +| main.rs:45:5:45:72 | ... .same_site(...) | main.rs:45:5:45:86 | ... .secure(...) | provenance | MaD:34 | | main.rs:45:5:45:86 | ... .secure(...) | main.rs:45:5:45:86 | ... .secure(...) | provenance | Sink:MaD:2 | -| main.rs:46:5:46:48 | ... .permanent() | main.rs:46:5:46:62 | ... .secure(...) | provenance | MaD:35 | +| main.rs:46:5:46:48 | ... .permanent() | main.rs:46:5:46:62 | ... .secure(...) | provenance | MaD:34 | | main.rs:46:5:46:62 | ... .secure(...) | main.rs:46:5:46:62 | ... .secure(...) | provenance | Sink:MaD:2 | -| main.rs:47:5:47:46 | ... .removal() | main.rs:47:5:47:60 | ... .secure(...) | provenance | MaD:35 | +| main.rs:47:5:47:46 | ... .removal() | main.rs:47:5:47:60 | ... .secure(...) | provenance | MaD:34 | | main.rs:47:5:47:60 | ... .secure(...) | main.rs:47:5:47:60 | ... .secure(...) | provenance | Sink:MaD:2 | -| main.rs:48:5:48:36 | ...::build(...) | main.rs:48:5:48:50 | ... .secure(...) | provenance | MaD:35 | +| main.rs:48:5:48:36 | ...::build(...) | main.rs:48:5:48:50 | ... .secure(...) | provenance | MaD:34 | | main.rs:48:5:48:50 | ... .secure(...) | main.rs:48:5:48:50 | ... .secure(...) | provenance | Sink:MaD:3 | -| main.rs:49:5:49:25 | ...::build(...) | main.rs:49:5:49:39 | ... .secure(...) | provenance | MaD:35 | +| main.rs:49:5:49:25 | ...::build(...) | main.rs:49:5:49:39 | ... .secure(...) | provenance | MaD:34 | | main.rs:49:5:49:39 | ... .secure(...) | main.rs:49:5:49:39 | ... .secure(...) | provenance | Sink:MaD:2 | -| main.rs:50:5:50:40 | ...::build(...) | main.rs:50:5:50:54 | ... .secure(...) | provenance | MaD:35 | +| main.rs:50:5:50:40 | ...::build(...) | main.rs:50:5:50:54 | ... .secure(...) | provenance | MaD:34 | | main.rs:50:5:50:54 | ... .secure(...) | main.rs:50:5:50:54 | ... .secure(...) | provenance | Sink:MaD:2 | -| main.rs:53:5:53:49 | ... .secure(...) | main.rs:53:5:53:63 | ... .secure(...) | provenance | MaD:35 | +| main.rs:53:5:53:49 | ... .secure(...) | main.rs:53:5:53:63 | ... .secure(...) | provenance | MaD:34 | | main.rs:53:5:53:63 | ... .secure(...) | main.rs:53:5:53:63 | ... .secure(...) | provenance | Sink:MaD:2 | | main.rs:58:9:58:13 | mut a | main.rs:59:13:59:13 | a | provenance | | | main.rs:58:9:58:13 | mut a | main.rs:60:22:60:22 | a | provenance | | | main.rs:58:17:58:44 | ...::new(...) | main.rs:58:9:58:13 | mut a | provenance | Src:MaD:17 | -| main.rs:59:13:59:13 | a | main.rs:59:13:59:21 | a.clone() | provenance | MaD:18 | +| main.rs:59:13:59:13 | a | main.rs:59:13:59:21 | a.clone() | provenance | MaD:38 | | main.rs:59:13:59:21 | a.clone() | main.rs:59:13:59:21 | a.clone() | provenance | Sink:MaD:4 | -| main.rs:60:22:60:22 | a | main.rs:60:22:60:30 | a.clone() | provenance | MaD:18 | +| main.rs:60:22:60:22 | a | main.rs:60:22:60:30 | a.clone() | provenance | MaD:38 | | main.rs:60:22:60:30 | a.clone() | main.rs:60:22:60:30 | a.clone() | provenance | Sink:MaD:5 | | main.rs:63:5:63:5 | [SSA] a | main.rs:64:13:64:13 | a | provenance | | | main.rs:63:5:63:5 | [SSA] a | main.rs:70:29:70:29 | a | provenance | | @@ -136,56 +136,56 @@ edges | main.rs:63:5:63:5 | a | main.rs:64:13:64:13 | a | provenance | | | main.rs:63:5:63:5 | a | main.rs:70:29:70:29 | a | provenance | | | main.rs:63:5:63:5 | a | main.rs:79:30:79:30 | a | provenance | | -| main.rs:64:13:64:13 | a | main.rs:64:13:64:21 | a.clone() | provenance | MaD:18 | +| main.rs:64:13:64:13 | a | main.rs:64:13:64:21 | a.clone() | provenance | MaD:38 | | main.rs:64:13:64:21 | a.clone() | main.rs:64:13:64:21 | a.clone() | provenance | Sink:MaD:4 | | main.rs:68:9:68:13 | mut b | main.rs:69:20:69:20 | b | provenance | | | main.rs:68:17:68:37 | ...::named(...) | main.rs:68:9:68:13 | mut b | provenance | Src:MaD:16 | -| main.rs:69:20:69:20 | b | main.rs:69:20:69:28 | b.clone() | provenance | MaD:18 | +| main.rs:69:20:69:20 | b | main.rs:69:20:69:28 | b.clone() | provenance | MaD:38 | | main.rs:69:20:69:28 | b.clone() | main.rs:69:20:69:28 | b.clone() | provenance | Sink:MaD:8 | -| main.rs:70:29:70:29 | a | main.rs:70:29:70:37 | a.clone() | provenance | MaD:18 | +| main.rs:70:29:70:29 | a | main.rs:70:29:70:37 | a.clone() | provenance | MaD:38 | | main.rs:70:29:70:37 | a.clone() | main.rs:70:29:70:37 | a.clone() | provenance | Sink:MaD:9 | | main.rs:71:5:71:5 | [SSA] b | main.rs:72:20:72:20 | b | provenance | | | main.rs:71:5:71:5 | b | main.rs:72:20:72:20 | b | provenance | | -| main.rs:72:20:72:20 | b | main.rs:72:20:72:28 | b.clone() | provenance | MaD:18 | +| main.rs:72:20:72:20 | b | main.rs:72:20:72:28 | b.clone() | provenance | MaD:38 | | main.rs:72:20:72:28 | b.clone() | main.rs:72:20:72:28 | b.clone() | provenance | Sink:MaD:8 | | main.rs:77:9:77:13 | mut c | main.rs:78:21:78:21 | c | provenance | | | main.rs:77:9:77:13 | mut c | main.rs:83:21:83:21 | c | provenance | | | main.rs:77:17:77:36 | ...::from(...) | main.rs:77:9:77:13 | mut c | provenance | Src:MaD:14 | -| main.rs:78:21:78:21 | c | main.rs:78:21:78:29 | c.clone() | provenance | MaD:18 | +| main.rs:78:21:78:21 | c | main.rs:78:21:78:29 | c.clone() | provenance | MaD:38 | | main.rs:78:21:78:29 | c.clone() | main.rs:78:21:78:29 | c.clone() | provenance | Sink:MaD:6 | -| main.rs:79:30:79:30 | a | main.rs:79:30:79:38 | a.clone() | provenance | MaD:18 | +| main.rs:79:30:79:30 | a | main.rs:79:30:79:38 | a.clone() | provenance | MaD:38 | | main.rs:79:30:79:38 | a.clone() | main.rs:79:30:79:38 | a.clone() | provenance | Sink:MaD:7 | -| main.rs:83:21:83:21 | c | main.rs:83:21:83:29 | c.clone() | provenance | MaD:18 | +| main.rs:83:21:83:21 | c | main.rs:83:21:83:29 | c.clone() | provenance | MaD:38 | | main.rs:83:21:83:29 | c.clone() | main.rs:83:21:83:29 | c.clone() | provenance | Sink:MaD:6 | | main.rs:87:9:87:13 | mut d | main.rs:88:13:88:13 | d | provenance | | | main.rs:87:9:87:13 | mut d | main.rs:94:13:94:13 | d | provenance | | | main.rs:87:17:87:36 | ...::from(...) | main.rs:87:9:87:13 | mut d | provenance | Src:MaD:14 | -| main.rs:88:13:88:13 | d | main.rs:88:13:88:21 | d.clone() | provenance | MaD:18 | +| main.rs:88:13:88:13 | d | main.rs:88:13:88:21 | d.clone() | provenance | MaD:38 | | main.rs:88:13:88:21 | d.clone() | main.rs:88:13:88:21 | d.clone() | provenance | Sink:MaD:4 | -| main.rs:94:13:94:13 | d | main.rs:94:13:94:21 | d.clone() | provenance | MaD:18 | +| main.rs:94:13:94:13 | d | main.rs:94:13:94:21 | d.clone() | provenance | MaD:38 | | main.rs:94:13:94:21 | d.clone() | main.rs:94:13:94:21 | d.clone() | provenance | Sink:MaD:4 | | main.rs:114:5:114:36 | ...::build(...) | main.rs:114:5:114:36 | ...::build(...) | provenance | Src:MaD:15 | -| main.rs:114:5:114:36 | ...::build(...) | main.rs:114:5:114:54 | ... .partitioned(...) | provenance | MaD:33 | +| main.rs:114:5:114:36 | ...::build(...) | main.rs:114:5:114:54 | ... .partitioned(...) | provenance | MaD:32 | | main.rs:114:5:114:54 | ... .partitioned(...) | main.rs:114:5:114:54 | ... .partitioned(...) | provenance | Sink:MaD:2 | | main.rs:122:9:122:9 | a | main.rs:123:20:123:20 | a | provenance | | | main.rs:122:13:122:58 | ...::new(...) | main.rs:122:9:122:9 | a | provenance | Src:MaD:13 | -| main.rs:123:20:123:20 | a | main.rs:123:20:123:28 | a.clone() | provenance | MaD:18 | +| main.rs:123:20:123:20 | a | main.rs:123:20:123:28 | a.clone() | provenance | MaD:38 | | main.rs:123:20:123:28 | a.clone() | main.rs:123:20:123:28 | a.clone() | provenance | Sink:MaD:1 | | main.rs:130:9:130:9 | c | main.rs:131:20:131:20 | c | provenance | | | main.rs:130:9:130:9 | c | main.rs:134:13:134:13 | c | provenance | | -| main.rs:130:13:130:13 | b | main.rs:130:13:130:31 | b.set_secure(...) | provenance | MaD:28 | +| main.rs:130:13:130:13 | b | main.rs:130:13:130:31 | b.set_secure(...) | provenance | MaD:27 | | main.rs:130:13:130:31 | b.set_secure(...) | main.rs:130:9:130:9 | c | provenance | | -| main.rs:131:20:131:20 | c | main.rs:131:20:131:28 | c.clone() | provenance | MaD:18 | +| main.rs:131:20:131:20 | c | main.rs:131:20:131:28 | c.clone() | provenance | MaD:38 | | main.rs:131:20:131:28 | c.clone() | main.rs:131:20:131:28 | c.clone() | provenance | Sink:MaD:1 | | main.rs:134:9:134:9 | d | main.rs:135:20:135:20 | d | provenance | | -| main.rs:134:13:134:13 | c | main.rs:134:13:134:35 | c.set_partitioned(...) | provenance | MaD:25 | +| main.rs:134:13:134:13 | c | main.rs:134:13:134:35 | c.set_partitioned(...) | provenance | MaD:24 | | main.rs:134:13:134:35 | c.set_partitioned(...) | main.rs:134:9:134:9 | d | provenance | | -| main.rs:135:20:135:20 | d | main.rs:135:20:135:28 | d.clone() | provenance | MaD:18 | +| main.rs:135:20:135:20 | d | main.rs:135:20:135:28 | d.clone() | provenance | MaD:38 | | main.rs:135:20:135:28 | d.clone() | main.rs:135:20:135:28 | d.clone() | provenance | Sink:MaD:1 | | main.rs:146:9:146:9 | g | main.rs:147:20:147:20 | g | provenance | | -| main.rs:146:13:146:13 | f | main.rs:146:13:146:31 | f.set_secure(...) | provenance | MaD:28 | +| main.rs:146:13:146:13 | f | main.rs:146:13:146:31 | f.set_secure(...) | provenance | MaD:27 | | main.rs:146:13:146:31 | f.set_secure(...) | main.rs:146:9:146:9 | g | provenance | | -| main.rs:147:20:147:20 | g | main.rs:147:20:147:28 | g.clone() | provenance | MaD:18 | +| main.rs:147:20:147:20 | g | main.rs:147:20:147:28 | g.clone() | provenance | MaD:38 | | main.rs:147:20:147:28 | g.clone() | main.rs:147:20:147:28 | g.clone() | provenance | Sink:MaD:1 | | main.rs:151:9:151:9 | h | main.rs:152:20:152:20 | h | provenance | Sink:MaD:1 | | main.rs:151:13:151:61 | ...::from(...) | main.rs:151:9:151:9 | h | provenance | Src:MaD:12 | @@ -202,90 +202,90 @@ edges | main.rs:155:9:155:9 | i | main.rs:166:20:166:20 | i | provenance | | | main.rs:155:9:155:9 | i | main.rs:167:20:167:20 | i | provenance | | | main.rs:155:13:155:58 | ...::new(...) | main.rs:155:9:155:9 | i | provenance | Src:MaD:13 | -| main.rs:156:20:156:20 | i | main.rs:156:20:156:28 | i.clone() | provenance | MaD:18 | -| main.rs:156:20:156:28 | i.clone() | main.rs:156:20:156:46 | ... .set_name(...) | provenance | MaD:24 | +| main.rs:156:20:156:20 | i | main.rs:156:20:156:28 | i.clone() | provenance | MaD:38 | +| main.rs:156:20:156:28 | i.clone() | main.rs:156:20:156:46 | ... .set_name(...) | provenance | MaD:23 | | main.rs:156:20:156:46 | ... .set_name(...) | main.rs:156:20:156:46 | ... .set_name(...) | provenance | Sink:MaD:1 | -| main.rs:157:20:157:20 | i | main.rs:157:20:157:28 | i.clone() | provenance | MaD:18 | -| main.rs:157:20:157:28 | i.clone() | main.rs:157:20:157:48 | ... .set_value(...) | provenance | MaD:29 | +| main.rs:157:20:157:20 | i | main.rs:157:20:157:28 | i.clone() | provenance | MaD:38 | +| main.rs:157:20:157:28 | i.clone() | main.rs:157:20:157:48 | ... .set_value(...) | provenance | MaD:28 | | main.rs:157:20:157:48 | ... .set_value(...) | main.rs:157:20:157:48 | ... .set_value(...) | provenance | Sink:MaD:1 | -| main.rs:158:20:158:20 | i | main.rs:158:20:158:28 | i.clone() | provenance | MaD:18 | -| main.rs:158:20:158:28 | i.clone() | main.rs:158:20:158:48 | ... .set_http_only(...) | provenance | MaD:22 | +| main.rs:158:20:158:20 | i | main.rs:158:20:158:28 | i.clone() | provenance | MaD:38 | +| main.rs:158:20:158:28 | i.clone() | main.rs:158:20:158:48 | ... .set_http_only(...) | provenance | MaD:21 | | main.rs:158:20:158:48 | ... .set_http_only(...) | main.rs:158:20:158:48 | ... .set_http_only(...) | provenance | Sink:MaD:1 | -| main.rs:159:20:159:20 | i | main.rs:159:20:159:28 | i.clone() | provenance | MaD:18 | -| main.rs:159:20:159:28 | i.clone() | main.rs:159:20:159:70 | ... .set_same_site(...) | provenance | MaD:27 | +| main.rs:159:20:159:20 | i | main.rs:159:20:159:28 | i.clone() | provenance | MaD:38 | +| main.rs:159:20:159:28 | i.clone() | main.rs:159:20:159:70 | ... .set_same_site(...) | provenance | MaD:26 | | main.rs:159:20:159:70 | ... .set_same_site(...) | main.rs:159:20:159:70 | ... .set_same_site(...) | provenance | Sink:MaD:1 | -| main.rs:160:20:160:20 | i | main.rs:160:20:160:28 | i.clone() | provenance | MaD:18 | -| main.rs:160:20:160:28 | i.clone() | main.rs:160:20:160:46 | ... .set_max_age(...) | provenance | MaD:23 | +| main.rs:160:20:160:20 | i | main.rs:160:20:160:28 | i.clone() | provenance | MaD:38 | +| main.rs:160:20:160:28 | i.clone() | main.rs:160:20:160:46 | ... .set_max_age(...) | provenance | MaD:22 | | main.rs:160:20:160:46 | ... .set_max_age(...) | main.rs:160:20:160:46 | ... .set_max_age(...) | provenance | Sink:MaD:1 | -| main.rs:161:20:161:20 | i | main.rs:161:20:161:28 | i.clone() | provenance | MaD:18 | -| main.rs:161:20:161:28 | i.clone() | main.rs:161:20:161:42 | ... .set_path(...) | provenance | MaD:26 | +| main.rs:161:20:161:20 | i | main.rs:161:20:161:28 | i.clone() | provenance | MaD:38 | +| main.rs:161:20:161:28 | i.clone() | main.rs:161:20:161:42 | ... .set_path(...) | provenance | MaD:25 | | main.rs:161:20:161:42 | ... .set_path(...) | main.rs:161:20:161:42 | ... .set_path(...) | provenance | Sink:MaD:1 | -| main.rs:162:20:162:20 | i | main.rs:162:20:162:28 | i.clone() | provenance | MaD:18 | -| main.rs:162:20:162:28 | i.clone() | main.rs:162:20:162:41 | ... .unset_path() | provenance | MaD:32 | +| main.rs:162:20:162:20 | i | main.rs:162:20:162:28 | i.clone() | provenance | MaD:38 | +| main.rs:162:20:162:28 | i.clone() | main.rs:162:20:162:41 | ... .unset_path() | provenance | MaD:31 | | main.rs:162:20:162:41 | ... .unset_path() | main.rs:162:20:162:41 | ... .unset_path() | provenance | Sink:MaD:1 | -| main.rs:163:20:163:20 | i | main.rs:163:20:163:28 | i.clone() | provenance | MaD:18 | -| main.rs:163:20:163:28 | i.clone() | main.rs:163:20:163:54 | ... .set_domain(...) | provenance | MaD:20 | +| main.rs:163:20:163:20 | i | main.rs:163:20:163:28 | i.clone() | provenance | MaD:38 | +| main.rs:163:20:163:28 | i.clone() | main.rs:163:20:163:54 | ... .set_domain(...) | provenance | MaD:19 | | main.rs:163:20:163:54 | ... .set_domain(...) | main.rs:163:20:163:54 | ... .set_domain(...) | provenance | Sink:MaD:1 | -| main.rs:164:20:164:20 | i | main.rs:164:20:164:28 | i.clone() | provenance | MaD:18 | -| main.rs:164:20:164:28 | i.clone() | main.rs:164:20:164:43 | ... .unset_domain() | provenance | MaD:30 | +| main.rs:164:20:164:20 | i | main.rs:164:20:164:28 | i.clone() | provenance | MaD:38 | +| main.rs:164:20:164:28 | i.clone() | main.rs:164:20:164:43 | ... .unset_domain() | provenance | MaD:29 | | main.rs:164:20:164:43 | ... .unset_domain() | main.rs:164:20:164:43 | ... .unset_domain() | provenance | Sink:MaD:1 | -| main.rs:165:20:165:20 | i | main.rs:165:20:165:28 | i.clone() | provenance | MaD:18 | -| main.rs:165:20:165:28 | i.clone() | main.rs:165:20:165:46 | ... .set_expires(...) | provenance | MaD:21 | +| main.rs:165:20:165:20 | i | main.rs:165:20:165:28 | i.clone() | provenance | MaD:38 | +| main.rs:165:20:165:28 | i.clone() | main.rs:165:20:165:46 | ... .set_expires(...) | provenance | MaD:20 | | main.rs:165:20:165:46 | ... .set_expires(...) | main.rs:165:20:165:46 | ... .set_expires(...) | provenance | Sink:MaD:1 | -| main.rs:166:20:166:20 | i | main.rs:166:20:166:28 | i.clone() | provenance | MaD:18 | -| main.rs:166:20:166:28 | i.clone() | main.rs:166:20:166:44 | ... .unset_expires() | provenance | MaD:31 | +| main.rs:166:20:166:20 | i | main.rs:166:20:166:28 | i.clone() | provenance | MaD:38 | +| main.rs:166:20:166:28 | i.clone() | main.rs:166:20:166:44 | ... .unset_expires() | provenance | MaD:30 | | main.rs:166:20:166:44 | ... .unset_expires() | main.rs:166:20:166:44 | ... .unset_expires() | provenance | Sink:MaD:1 | -| main.rs:167:20:167:20 | i | main.rs:167:20:167:28 | i.clone() | provenance | MaD:18 | -| main.rs:167:20:167:28 | i.clone() | main.rs:167:20:167:45 | ... .make_permanent() | provenance | MaD:19 | +| main.rs:167:20:167:20 | i | main.rs:167:20:167:28 | i.clone() | provenance | MaD:38 | +| main.rs:167:20:167:28 | i.clone() | main.rs:167:20:167:45 | ... .make_permanent() | provenance | MaD:18 | | main.rs:167:20:167:45 | ... .make_permanent() | main.rs:167:20:167:45 | ... .make_permanent() | provenance | Sink:MaD:1 | | main.rs:173:22:173:59 | ...::build(...) | main.rs:173:22:173:59 | ...::build(...) | provenance | Src:MaD:15 Sink:MaD:2 | -| main.rs:197:5:197:39 | ...::build(...) | main.rs:197:5:197:53 | ... .secure(...) | provenance | MaD:35 | +| main.rs:197:5:197:39 | ...::build(...) | main.rs:197:5:197:53 | ... .secure(...) | provenance | MaD:34 | | main.rs:197:5:197:53 | ... .secure(...) | main.rs:197:5:197:53 | ... .secure(...) | provenance | Sink:MaD:3 | -| main.rs:198:5:198:39 | ...::build(...) | main.rs:198:5:198:53 | ... .secure(...) | provenance | MaD:35 | -| main.rs:198:5:198:53 | ... .secure(...) | main.rs:198:5:198:63 | ... .path(...) | provenance | MaD:34 | +| main.rs:198:5:198:39 | ...::build(...) | main.rs:198:5:198:53 | ... .secure(...) | provenance | MaD:34 | +| main.rs:198:5:198:53 | ... .secure(...) | main.rs:198:5:198:63 | ... .path(...) | provenance | MaD:33 | | main.rs:198:5:198:63 | ... .path(...) | main.rs:198:5:198:63 | ... .path(...) | provenance | Sink:MaD:3 | | main.rs:201:5:201:11 | [SSA] cookie1 | main.rs:202:13:202:19 | cookie1 | provenance | | | main.rs:201:5:201:11 | cookie1 | main.rs:202:13:202:19 | cookie1 | provenance | | -| main.rs:202:13:202:19 | cookie1 | main.rs:202:13:202:27 | cookie1.clone() | provenance | MaD:18 | +| main.rs:202:13:202:19 | cookie1 | main.rs:202:13:202:27 | cookie1.clone() | provenance | MaD:38 | | main.rs:202:13:202:27 | cookie1.clone() | main.rs:202:13:202:27 | cookie1.clone() | provenance | Sink:MaD:4 | | main.rs:212:5:212:39 | ...::build(...) | main.rs:212:5:212:39 | ...::build(...) | provenance | Src:MaD:15 Sink:MaD:3 | | main.rs:214:9:214:15 | cookie3 | main.rs:215:13:215:19 | cookie3 | provenance | | | main.rs:214:19:214:51 | ...::new(...) | main.rs:214:9:214:15 | cookie3 | provenance | Src:MaD:17 | -| main.rs:215:13:215:19 | cookie3 | main.rs:215:13:215:27 | cookie3.clone() | provenance | MaD:18 | +| main.rs:215:13:215:19 | cookie3 | main.rs:215:13:215:27 | cookie3.clone() | provenance | MaD:38 | | main.rs:215:13:215:27 | cookie3.clone() | main.rs:215:13:215:27 | cookie3.clone() | provenance | Sink:MaD:4 | | main.rs:218:5:218:11 | [SSA] cookie2 | main.rs:219:13:219:19 | cookie2 | provenance | | | main.rs:218:5:218:11 | cookie2 | main.rs:219:13:219:19 | cookie2 | provenance | | -| main.rs:219:13:219:19 | cookie2 | main.rs:219:13:219:27 | cookie2.clone() | provenance | MaD:18 | +| main.rs:219:13:219:19 | cookie2 | main.rs:219:13:219:27 | cookie2.clone() | provenance | MaD:38 | | main.rs:219:13:219:27 | cookie2.clone() | main.rs:219:13:219:27 | cookie2.clone() | provenance | Sink:MaD:4 | | main.rs:228:5:228:11 | [SSA] cookie1 | main.rs:229:13:229:19 | cookie1 | provenance | | | main.rs:228:5:228:11 | cookie1 | main.rs:229:13:229:19 | cookie1 | provenance | | -| main.rs:229:13:229:19 | cookie1 | main.rs:229:13:229:27 | cookie1.clone() | provenance | MaD:18 | +| main.rs:229:13:229:19 | cookie1 | main.rs:229:13:229:27 | cookie1.clone() | provenance | MaD:38 | | main.rs:229:13:229:27 | cookie1.clone() | main.rs:229:13:229:27 | cookie1.clone() | provenance | Sink:MaD:11 | | main.rs:241:9:241:25 | cookie_config_bad | main.rs:242:43:242:59 | cookie_config_bad | provenance | Sink:MaD:10 | -| main.rs:241:29:241:62 | ...::new(...) | main.rs:241:29:241:76 | ... .secure(...) | provenance | MaD:38 | +| main.rs:241:29:241:62 | ...::new(...) | main.rs:241:29:241:76 | ... .secure(...) | provenance | MaD:37 | | main.rs:241:29:241:76 | ... .secure(...) | main.rs:241:9:241:25 | cookie_config_bad | provenance | | | main.rs:244:9:244:26 | cookie_config_bad2 | main.rs:245:43:245:60 | cookie_config_bad2 | provenance | Sink:MaD:10 | -| main.rs:244:30:244:63 | ...::new(...) | main.rs:244:30:244:77 | ... .secure(...) | provenance | MaD:38 | -| main.rs:244:30:244:77 | ... .secure(...) | main.rs:244:30:244:90 | ... .name(...) | provenance | MaD:36 | -| main.rs:244:30:244:90 | ... .name(...) | main.rs:244:30:244:100 | ... .path(...) | provenance | MaD:37 | +| main.rs:244:30:244:63 | ...::new(...) | main.rs:244:30:244:77 | ... .secure(...) | provenance | MaD:37 | +| main.rs:244:30:244:77 | ... .secure(...) | main.rs:244:30:244:90 | ... .name(...) | provenance | MaD:35 | +| main.rs:244:30:244:90 | ... .name(...) | main.rs:244:30:244:100 | ... .path(...) | provenance | MaD:36 | | main.rs:244:30:244:100 | ... .path(...) | main.rs:244:9:244:26 | cookie_config_bad2 | provenance | | -| main.rs:259:5:259:43 | ...::build(...) | main.rs:259:5:259:57 | ... .secure(...) | provenance | MaD:35 | +| main.rs:259:5:259:43 | ...::build(...) | main.rs:259:5:259:57 | ... .secure(...) | provenance | MaD:34 | | main.rs:259:5:259:57 | ... .secure(...) | main.rs:259:5:259:57 | ... .secure(...) | provenance | Sink:MaD:3 | -| main.rs:260:5:260:43 | ...::build(...) | main.rs:260:5:260:57 | ... .secure(...) | provenance | MaD:35 | -| main.rs:260:5:260:57 | ... .secure(...) | main.rs:260:5:260:67 | ... .path(...) | provenance | MaD:34 | +| main.rs:260:5:260:43 | ...::build(...) | main.rs:260:5:260:57 | ... .secure(...) | provenance | MaD:34 | +| main.rs:260:5:260:57 | ... .secure(...) | main.rs:260:5:260:67 | ... .path(...) | provenance | MaD:33 | | main.rs:260:5:260:67 | ... .path(...) | main.rs:260:5:260:67 | ... .path(...) | provenance | Sink:MaD:3 | | main.rs:263:5:263:11 | [SSA] cookie1 | main.rs:264:13:264:19 | cookie1 | provenance | | | main.rs:263:5:263:11 | cookie1 | main.rs:264:13:264:19 | cookie1 | provenance | | -| main.rs:264:13:264:19 | cookie1 | main.rs:264:13:264:27 | cookie1.clone() | provenance | MaD:18 | +| main.rs:264:13:264:19 | cookie1 | main.rs:264:13:264:27 | cookie1.clone() | provenance | MaD:38 | | main.rs:264:13:264:27 | cookie1.clone() | main.rs:264:13:264:27 | cookie1.clone() | provenance | Sink:MaD:4 | | main.rs:274:5:274:43 | ...::build(...) | main.rs:274:5:274:43 | ...::build(...) | provenance | Src:MaD:15 Sink:MaD:3 | | main.rs:276:9:276:15 | cookie3 | main.rs:277:13:277:19 | cookie3 | provenance | | | main.rs:276:19:276:55 | ...::new(...) | main.rs:276:9:276:15 | cookie3 | provenance | Src:MaD:17 | -| main.rs:277:13:277:19 | cookie3 | main.rs:277:13:277:27 | cookie3.clone() | provenance | MaD:18 | +| main.rs:277:13:277:19 | cookie3 | main.rs:277:13:277:27 | cookie3.clone() | provenance | MaD:38 | | main.rs:277:13:277:27 | cookie3.clone() | main.rs:277:13:277:27 | cookie3.clone() | provenance | Sink:MaD:4 | | main.rs:280:5:280:11 | [SSA] cookie2 | main.rs:281:13:281:19 | cookie2 | provenance | | | main.rs:280:5:280:11 | cookie2 | main.rs:281:13:281:19 | cookie2 | provenance | | -| main.rs:281:13:281:19 | cookie2 | main.rs:281:13:281:27 | cookie2.clone() | provenance | MaD:18 | +| main.rs:281:13:281:19 | cookie2 | main.rs:281:13:281:27 | cookie2.clone() | provenance | MaD:38 | | main.rs:281:13:281:27 | cookie2.clone() | main.rs:281:13:281:27 | cookie2.clone() | provenance | Sink:MaD:4 | models | 1 | Sink: ::insert; Argument[0]; cookie-use | @@ -305,27 +305,27 @@ models | 15 | Source: ::build; ReturnValue; cookie-create | | 16 | Source: ::named; ReturnValue; cookie-create | | 17 | Source: ::new; ReturnValue; cookie-create | -| 18 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | -| 19 | Summary: ::make_permanent; Argument[self]; ReturnValue; taint | -| 20 | Summary: ::set_domain; Argument[self]; ReturnValue; taint | -| 21 | Summary: ::set_expires; Argument[self]; ReturnValue; taint | -| 22 | Summary: ::set_http_only; Argument[self]; ReturnValue; taint | -| 23 | Summary: ::set_max_age; Argument[self]; ReturnValue; taint | -| 24 | Summary: ::set_name; Argument[self]; ReturnValue; taint | -| 25 | Summary: ::set_partitioned; Argument[self].OptionalBarrier[cookie-partitioned-arg0]; ReturnValue; taint | -| 26 | Summary: ::set_path; Argument[self]; ReturnValue; taint | -| 27 | Summary: ::set_same_site; Argument[self]; ReturnValue; taint | -| 28 | Summary: ::set_secure; Argument[self].OptionalBarrier[cookie-secure-arg0]; ReturnValue; taint | -| 29 | Summary: ::set_value; Argument[self]; ReturnValue; taint | -| 30 | Summary: ::unset_domain; Argument[self]; ReturnValue; taint | -| 31 | Summary: ::unset_expires; Argument[self]; ReturnValue; taint | -| 32 | Summary: ::unset_path; Argument[self]; ReturnValue; taint | -| 33 | Summary: ::partitioned; Argument[self].OptionalBarrier[cookie-partitioned-arg0]; ReturnValue; taint | -| 34 | Summary: ::path; Argument[self]; ReturnValue; taint | -| 35 | Summary: ::secure; Argument[self].OptionalBarrier[cookie-secure-arg0]; ReturnValue; taint | -| 36 | Summary: ::name; Argument[self]; ReturnValue; taint | -| 37 | Summary: ::path; Argument[self]; ReturnValue; taint | -| 38 | Summary: ::secure; Argument[self].OptionalBarrier[cookie-secure-arg0]; ReturnValue; taint | +| 18 | Summary: ::make_permanent; Argument[self]; ReturnValue; taint | +| 19 | Summary: ::set_domain; Argument[self]; ReturnValue; taint | +| 20 | Summary: ::set_expires; Argument[self]; ReturnValue; taint | +| 21 | Summary: ::set_http_only; Argument[self]; ReturnValue; taint | +| 22 | Summary: ::set_max_age; Argument[self]; ReturnValue; taint | +| 23 | Summary: ::set_name; Argument[self]; ReturnValue; taint | +| 24 | Summary: ::set_partitioned; Argument[self].OptionalBarrier[cookie-partitioned-arg0]; ReturnValue; taint | +| 25 | Summary: ::set_path; Argument[self]; ReturnValue; taint | +| 26 | Summary: ::set_same_site; Argument[self]; ReturnValue; taint | +| 27 | Summary: ::set_secure; Argument[self].OptionalBarrier[cookie-secure-arg0]; ReturnValue; taint | +| 28 | Summary: ::set_value; Argument[self]; ReturnValue; taint | +| 29 | Summary: ::unset_domain; Argument[self]; ReturnValue; taint | +| 30 | Summary: ::unset_expires; Argument[self]; ReturnValue; taint | +| 31 | Summary: ::unset_path; Argument[self]; ReturnValue; taint | +| 32 | Summary: ::partitioned; Argument[self].OptionalBarrier[cookie-partitioned-arg0]; ReturnValue; taint | +| 33 | Summary: ::path; Argument[self]; ReturnValue; taint | +| 34 | Summary: ::secure; Argument[self].OptionalBarrier[cookie-secure-arg0]; ReturnValue; taint | +| 35 | Summary: ::name; Argument[self]; ReturnValue; taint | +| 36 | Summary: ::path; Argument[self]; ReturnValue; taint | +| 37 | Summary: ::secure; Argument[self].OptionalBarrier[cookie-secure-arg0]; ReturnValue; taint | +| 38 | Summary: core::clone::Clone::clone; Argument[self].Reference; ReturnValue; value | nodes | main.rs:8:19:8:50 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:8:19:8:64 | ... .secure(...) | semmle.label | ... .secure(...) | diff --git a/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected b/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected index 2924834e71c5..92ecb8e09d84 100644 --- a/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected +++ b/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected @@ -62,91 +62,91 @@ edges | main.rs:20:9:20:10 | l2 | main.rs:22:31:22:32 | l2 | provenance | | | main.rs:20:9:20:10 | l2 | main.rs:23:31:23:32 | l2 | provenance | | | main.rs:20:9:20:10 | l2 | main.rs:24:38:24:39 | l2 | provenance | Sink:MaD:16 | -| main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | main.rs:20:14:20:63 | ... .unwrap() | provenance | MaD:41 | +| main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | main.rs:20:14:20:63 | ... .unwrap() | provenance | MaD:38 | | main.rs:20:14:20:63 | ... .unwrap() | main.rs:20:9:20:10 | l2 | provenance | | -| main.rs:20:50:20:50 | v | main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | provenance | MaD:33 | -| main.rs:22:31:22:32 | l2 | main.rs:22:31:22:44 | l2.align_to(...) [Ok] | provenance | MaD:27 | -| main.rs:22:31:22:44 | l2.align_to(...) [Ok] | main.rs:22:31:22:53 | ... .unwrap() | provenance | MaD:41 | +| main.rs:20:50:20:50 | v | main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | provenance | MaD:30 | +| main.rs:22:31:22:32 | l2 | main.rs:22:31:22:44 | l2.align_to(...) [Ok] | provenance | MaD:24 | +| main.rs:22:31:22:44 | l2.align_to(...) [Ok] | main.rs:22:31:22:53 | ... .unwrap() | provenance | MaD:38 | | main.rs:22:31:22:53 | ... .unwrap() | main.rs:22:31:22:53 | ... .unwrap() | provenance | Sink:MaD:15 | -| main.rs:23:31:23:32 | l2 | main.rs:23:31:23:44 | l2.align_to(...) [Ok] | provenance | MaD:27 | -| main.rs:23:31:23:44 | l2.align_to(...) [Ok] | main.rs:23:31:23:53 | ... .unwrap() | provenance | MaD:41 | -| main.rs:23:31:23:53 | ... .unwrap() | main.rs:23:31:23:68 | ... .pad_to_align() | provenance | MaD:35 | +| main.rs:23:31:23:32 | l2 | main.rs:23:31:23:44 | l2.align_to(...) [Ok] | provenance | MaD:24 | +| main.rs:23:31:23:44 | l2.align_to(...) [Ok] | main.rs:23:31:23:53 | ... .unwrap() | provenance | MaD:38 | +| main.rs:23:31:23:53 | ... .unwrap() | main.rs:23:31:23:68 | ... .pad_to_align() | provenance | MaD:32 | | main.rs:23:31:23:68 | ... .pad_to_align() | main.rs:23:31:23:68 | ... .pad_to_align() | provenance | Sink:MaD:15 | | main.rs:29:9:29:10 | l4 | main.rs:30:31:30:32 | l4 | provenance | Sink:MaD:15 | | main.rs:29:14:29:64 | ...::from_size_align_unchecked(...) | main.rs:29:9:29:10 | l4 | provenance | | -| main.rs:29:60:29:60 | v | main.rs:29:14:29:64 | ...::from_size_align_unchecked(...) | provenance | MaD:34 | +| main.rs:29:60:29:60 | v | main.rs:29:14:29:64 | ...::from_size_align_unchecked(...) | provenance | MaD:31 | | main.rs:32:9:32:10 | l5 | main.rs:33:31:33:32 | l5 | provenance | Sink:MaD:15 | | main.rs:32:14:32:118 | ...::from_size_align_unchecked(...) | main.rs:32:9:32:10 | l5 | provenance | | -| main.rs:32:60:32:60 | v | main.rs:32:60:32:89 | ... * ... | provenance | MaD:25 | -| main.rs:32:60:32:89 | ... * ... | main.rs:32:14:32:118 | ...::from_size_align_unchecked(...) | provenance | MaD:34 | +| main.rs:32:60:32:60 | v | main.rs:32:60:32:89 | ... * ... | provenance | MaD:43 | +| main.rs:32:60:32:89 | ... * ... | main.rs:32:14:32:118 | ...::from_size_align_unchecked(...) | provenance | MaD:31 | | main.rs:35:9:35:10 | s6 | main.rs:36:60:36:61 | s6 | provenance | | | main.rs:35:14:35:54 | ... + ... | main.rs:35:9:35:10 | s6 | provenance | | -| main.rs:35:15:35:49 | ... * ... | main.rs:35:14:35:54 | ... + ... | provenance | MaD:24 | -| main.rs:35:49:35:49 | v | main.rs:35:15:35:49 | ... * ... | provenance | MaD:25 | +| main.rs:35:15:35:49 | ... * ... | main.rs:35:14:35:54 | ... + ... | provenance | MaD:42 | +| main.rs:35:49:35:49 | v | main.rs:35:15:35:49 | ... * ... | provenance | MaD:43 | | main.rs:36:9:36:10 | l6 | main.rs:37:31:37:32 | l6 | provenance | Sink:MaD:15 | | main.rs:36:9:36:10 | l6 | main.rs:39:60:39:61 | l6 | provenance | | | main.rs:36:14:36:65 | ...::from_size_align_unchecked(...) | main.rs:36:9:36:10 | l6 | provenance | | -| main.rs:36:60:36:61 | s6 | main.rs:36:14:36:65 | ...::from_size_align_unchecked(...) | provenance | MaD:34 | +| main.rs:36:60:36:61 | s6 | main.rs:36:14:36:65 | ...::from_size_align_unchecked(...) | provenance | MaD:31 | | main.rs:39:9:39:10 | l7 | main.rs:40:31:40:32 | l7 | provenance | Sink:MaD:15 | | main.rs:39:14:39:72 | ...::from_size_align_unchecked(...) | main.rs:39:9:39:10 | l7 | provenance | | -| main.rs:39:60:39:61 | l6 | main.rs:39:60:39:68 | l6.size() | provenance | MaD:38 | -| main.rs:39:60:39:68 | l6.size() | main.rs:39:14:39:72 | ...::from_size_align_unchecked(...) | provenance | MaD:34 | +| main.rs:39:60:39:61 | l6 | main.rs:39:60:39:68 | l6.size() | provenance | MaD:35 | +| main.rs:39:60:39:68 | l6.size() | main.rs:39:14:39:72 | ...::from_size_align_unchecked(...) | provenance | MaD:31 | | main.rs:43:44:43:51 | ...: usize | main.rs:50:41:50:41 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:51:41:51:41 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:53:48:53:48 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:54:48:54:48 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:58:34:58:34 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:67:46:67:46 | v | provenance | | -| main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | main.rs:50:31:50:51 | ... .unwrap() [tuple.0] | provenance | MaD:41 | +| main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | main.rs:50:31:50:51 | ... .unwrap() [tuple.0] | provenance | MaD:38 | | main.rs:50:31:50:51 | ... .unwrap() [tuple.0] | main.rs:50:31:50:53 | ... .0 | provenance | | | main.rs:50:31:50:53 | ... .0 | main.rs:50:31:50:53 | ... .0 | provenance | Sink:MaD:15 | -| main.rs:50:41:50:41 | v | main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:36 | -| main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | main.rs:51:31:51:55 | ... .unwrap() [tuple.0] | provenance | MaD:41 | +| main.rs:50:41:50:41 | v | main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:33 | +| main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | main.rs:51:31:51:55 | ... .unwrap() [tuple.0] | provenance | MaD:38 | | main.rs:51:31:51:55 | ... .unwrap() [tuple.0] | main.rs:51:31:51:57 | ... .0 | provenance | | | main.rs:51:31:51:57 | ... .0 | main.rs:51:31:51:57 | ... .0 | provenance | Sink:MaD:15 | -| main.rs:51:41:51:41 | v | main.rs:51:41:51:45 | ... + ... | provenance | MaD:24 | -| main.rs:51:41:51:45 | ... + ... | main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:36 | -| main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | main.rs:53:31:53:58 | ... .unwrap() | provenance | MaD:41 | +| main.rs:51:41:51:41 | v | main.rs:51:41:51:45 | ... + ... | provenance | MaD:42 | +| main.rs:51:41:51:45 | ... + ... | main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:33 | +| main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | main.rs:53:31:53:58 | ... .unwrap() | provenance | MaD:38 | | main.rs:53:31:53:58 | ... .unwrap() | main.rs:53:31:53:58 | ... .unwrap() | provenance | Sink:MaD:15 | -| main.rs:53:48:53:48 | v | main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | provenance | MaD:37 | -| main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | main.rs:54:31:54:63 | ... .unwrap() | provenance | MaD:41 | +| main.rs:53:48:53:48 | v | main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | provenance | MaD:34 | +| main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | main.rs:54:31:54:63 | ... .unwrap() | provenance | MaD:38 | | main.rs:54:31:54:63 | ... .unwrap() | main.rs:54:31:54:63 | ... .unwrap() | provenance | Sink:MaD:15 | -| main.rs:54:48:54:48 | v | main.rs:54:48:54:53 | ... * ... | provenance | MaD:25 | -| main.rs:54:48:54:53 | ... * ... | main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | provenance | MaD:37 | +| main.rs:54:48:54:48 | v | main.rs:54:48:54:53 | ... * ... | provenance | MaD:43 | +| main.rs:54:48:54:53 | ... * ... | main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | provenance | MaD:34 | | main.rs:58:9:58:20 | TuplePat [tuple.0] | main.rs:58:10:58:11 | k1 | provenance | | | main.rs:58:10:58:11 | k1 | main.rs:59:31:59:32 | k1 | provenance | Sink:MaD:15 | | main.rs:58:10:58:11 | k1 | main.rs:60:34:60:35 | k1 | provenance | | | main.rs:58:10:58:11 | k1 | main.rs:62:24:62:25 | k1 | provenance | | | main.rs:58:10:58:11 | k1 | main.rs:64:48:64:49 | k1 | provenance | | | main.rs:58:10:58:11 | k1 | main.rs:65:31:65:32 | k1 | provenance | | -| main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | main.rs:58:24:58:66 | ... .expect(...) [tuple.0] | provenance | MaD:40 | +| main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | main.rs:58:24:58:66 | ... .expect(...) [tuple.0] | provenance | MaD:37 | | main.rs:58:24:58:66 | ... .expect(...) [tuple.0] | main.rs:58:9:58:20 | TuplePat [tuple.0] | provenance | | -| main.rs:58:34:58:34 | v | main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | provenance | MaD:36 | +| main.rs:58:34:58:34 | v | main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | provenance | MaD:33 | | main.rs:60:9:60:20 | TuplePat [tuple.0] | main.rs:60:10:60:11 | k2 | provenance | | | main.rs:60:10:60:11 | k2 | main.rs:61:31:61:32 | k2 | provenance | Sink:MaD:15 | -| main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | main.rs:60:24:60:45 | ... .unwrap() [tuple.0] | provenance | MaD:41 | +| main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | main.rs:60:24:60:45 | ... .unwrap() [tuple.0] | provenance | MaD:38 | | main.rs:60:24:60:45 | ... .unwrap() [tuple.0] | main.rs:60:9:60:20 | TuplePat [tuple.0] | provenance | | -| main.rs:60:34:60:35 | k1 | main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | provenance | MaD:29 | +| main.rs:60:34:60:35 | k1 | main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | provenance | MaD:26 | | main.rs:62:9:62:20 | TuplePat [tuple.0] | main.rs:62:10:62:11 | k3 | provenance | | | main.rs:62:10:62:11 | k3 | main.rs:63:31:63:32 | k3 | provenance | Sink:MaD:15 | -| main.rs:62:24:62:25 | k1 | main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | provenance | MaD:30 | -| main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | main.rs:62:24:62:45 | ... .unwrap() [tuple.0] | provenance | MaD:41 | +| main.rs:62:24:62:25 | k1 | main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | provenance | MaD:27 | +| main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | main.rs:62:24:62:45 | ... .unwrap() [tuple.0] | provenance | MaD:38 | | main.rs:62:24:62:45 | ... .unwrap() [tuple.0] | main.rs:62:9:62:20 | TuplePat [tuple.0] | provenance | | -| main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | main.rs:64:31:64:59 | ... .unwrap() | provenance | MaD:41 | +| main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | main.rs:64:31:64:59 | ... .unwrap() | provenance | MaD:38 | | main.rs:64:31:64:59 | ... .unwrap() | main.rs:64:31:64:59 | ... .unwrap() | provenance | Sink:MaD:15 | -| main.rs:64:48:64:49 | k1 | main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | provenance | MaD:31 | -| main.rs:65:31:65:32 | k1 | main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | provenance | MaD:32 | -| main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | main.rs:65:31:65:59 | ... .unwrap() | provenance | MaD:41 | +| main.rs:64:48:64:49 | k1 | main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | provenance | MaD:28 | +| main.rs:65:31:65:32 | k1 | main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | provenance | MaD:29 | +| main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | main.rs:65:31:65:59 | ... .unwrap() | provenance | MaD:38 | | main.rs:65:31:65:59 | ... .unwrap() | main.rs:65:31:65:59 | ... .unwrap() | provenance | Sink:MaD:15 | | main.rs:67:9:67:10 | l4 | main.rs:68:31:68:32 | l4 | provenance | Sink:MaD:15 | -| main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | main.rs:67:14:67:56 | ... .unwrap() | provenance | MaD:41 | +| main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | main.rs:67:14:67:56 | ... .unwrap() | provenance | MaD:38 | | main.rs:67:14:67:56 | ... .unwrap() | main.rs:67:9:67:10 | l4 | provenance | | -| main.rs:67:46:67:46 | v | main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | +| main.rs:67:46:67:46 | v | main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | | main.rs:86:35:86:42 | ...: usize | main.rs:87:54:87:54 | v | provenance | | | main.rs:87:9:87:14 | layout | main.rs:88:31:88:36 | layout | provenance | Sink:MaD:15 | -| main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | main.rs:87:18:87:67 | ... .unwrap() | provenance | MaD:41 | +| main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | main.rs:87:18:87:67 | ... .unwrap() | provenance | MaD:38 | | main.rs:87:18:87:67 | ... .unwrap() | main.rs:87:9:87:14 | layout | provenance | | -| main.rs:87:54:87:54 | v | main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | provenance | MaD:33 | +| main.rs:87:54:87:54 | v | main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | provenance | MaD:30 | | main.rs:91:38:91:45 | ...: usize | main.rs:92:47:92:47 | v | provenance | | | main.rs:91:38:91:45 | ...: usize | main.rs:101:51:101:51 | v | provenance | | | main.rs:91:38:91:45 | ...: usize | main.rs:105:33:105:33 | v | provenance | | @@ -160,33 +160,33 @@ edges | main.rs:92:9:92:10 | l1 | main.rs:111:35:111:36 | l1 | provenance | Sink:MaD:15 | | main.rs:92:9:92:10 | l1 | main.rs:146:35:146:36 | l1 | provenance | Sink:MaD:15 | | main.rs:92:9:92:10 | l1 | main.rs:177:31:177:32 | l1 | provenance | Sink:MaD:15 | -| main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | main.rs:92:14:92:57 | ... .unwrap() | provenance | MaD:41 | +| main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | main.rs:92:14:92:57 | ... .unwrap() | provenance | MaD:38 | | main.rs:92:14:92:57 | ... .unwrap() | main.rs:92:9:92:10 | l1 | provenance | | -| main.rs:92:47:92:47 | v | main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | +| main.rs:92:47:92:47 | v | main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | | main.rs:101:13:101:14 | l3 | main.rs:103:35:103:36 | l3 | provenance | Sink:MaD:15 | -| main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | main.rs:101:18:101:61 | ... .unwrap() | provenance | MaD:41 | +| main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | main.rs:101:18:101:61 | ... .unwrap() | provenance | MaD:38 | | main.rs:101:18:101:61 | ... .unwrap() | main.rs:101:13:101:14 | l3 | provenance | | -| main.rs:101:51:101:51 | v | main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | +| main.rs:101:51:101:51 | v | main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | | main.rs:105:33:105:33 | v | main.rs:86:35:86:42 | ...: usize | provenance | | | main.rs:145:13:145:14 | l9 | main.rs:148:35:148:36 | l9 | provenance | Sink:MaD:15 | -| main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | main.rs:145:18:145:61 | ... .unwrap() | provenance | MaD:41 | +| main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | main.rs:145:18:145:61 | ... .unwrap() | provenance | MaD:38 | | main.rs:145:18:145:61 | ... .unwrap() | main.rs:145:13:145:14 | l9 | provenance | | -| main.rs:145:51:145:51 | v | main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | +| main.rs:145:51:145:51 | v | main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | | main.rs:151:9:151:11 | l10 | main.rs:152:31:152:33 | l10 | provenance | Sink:MaD:15 | -| main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | main.rs:151:15:151:78 | ... .unwrap() | provenance | MaD:41 | +| main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | main.rs:151:15:151:78 | ... .unwrap() | provenance | MaD:38 | | main.rs:151:15:151:78 | ... .unwrap() | main.rs:151:9:151:11 | l10 | provenance | | -| main.rs:151:48:151:68 | ...::min(...) | main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | -| main.rs:151:62:151:62 | v | main.rs:151:48:151:68 | ...::min(...) | provenance | MaD:43 | +| main.rs:151:48:151:68 | ...::min(...) | main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | +| main.rs:151:62:151:62 | v | main.rs:151:48:151:68 | ...::min(...) | provenance | MaD:40 | | main.rs:154:9:154:11 | l11 | main.rs:155:31:155:33 | l11 | provenance | Sink:MaD:15 | -| main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | main.rs:154:15:154:78 | ... .unwrap() | provenance | MaD:41 | +| main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | main.rs:154:15:154:78 | ... .unwrap() | provenance | MaD:38 | | main.rs:154:15:154:78 | ... .unwrap() | main.rs:154:9:154:11 | l11 | provenance | | -| main.rs:154:48:154:68 | ...::max(...) | main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | -| main.rs:154:62:154:62 | v | main.rs:154:48:154:68 | ...::max(...) | provenance | MaD:42 | +| main.rs:154:48:154:68 | ...::max(...) | main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | +| main.rs:154:62:154:62 | v | main.rs:154:48:154:68 | ...::max(...) | provenance | MaD:39 | | main.rs:161:13:161:15 | l13 | main.rs:162:35:162:37 | l13 | provenance | Sink:MaD:15 | | main.rs:161:13:161:15 | l13 | main.rs:169:35:169:37 | l13 | provenance | Sink:MaD:15 | -| main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | main.rs:161:19:161:68 | ... .unwrap() | provenance | MaD:41 | +| main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | main.rs:161:19:161:68 | ... .unwrap() | provenance | MaD:38 | | main.rs:161:19:161:68 | ... .unwrap() | main.rs:161:13:161:15 | l13 | provenance | | -| main.rs:161:55:161:55 | v | main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | provenance | MaD:33 | +| main.rs:161:55:161:55 | v | main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | provenance | MaD:30 | | main.rs:183:29:183:36 | ...: usize | main.rs:192:46:192:46 | v | provenance | | | main.rs:183:29:183:36 | ...: usize | main.rs:202:48:202:48 | v | provenance | Sink:MaD:14 | | main.rs:192:9:192:10 | l2 | main.rs:193:38:193:39 | l2 | provenance | Sink:MaD:12 | @@ -198,9 +198,9 @@ edges | main.rs:192:9:192:10 | l2 | main.rs:208:53:208:54 | l2 | provenance | Sink:MaD:9 | | main.rs:192:9:192:10 | l2 | main.rs:210:60:210:61 | l2 | provenance | Sink:MaD:10 | | main.rs:192:9:192:10 | l2 | main.rs:213:51:213:52 | l2 | provenance | Sink:MaD:11 | -| main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | main.rs:192:14:192:56 | ... .unwrap() | provenance | MaD:41 | +| main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | main.rs:192:14:192:56 | ... .unwrap() | provenance | MaD:38 | | main.rs:192:14:192:56 | ... .unwrap() | main.rs:192:9:192:10 | l2 | provenance | | -| main.rs:192:46:192:46 | v | main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | provenance | MaD:28 | +| main.rs:192:46:192:46 | v | main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | | main.rs:217:27:217:34 | ...: usize | main.rs:219:26:219:26 | v | provenance | Sink:MaD:20 | | main.rs:217:27:217:34 | ...: usize | main.rs:220:36:220:36 | v | provenance | Sink:MaD:18 | | main.rs:217:27:217:34 | ...: usize | main.rs:222:30:222:30 | v | provenance | Sink:MaD:19 | @@ -212,17 +212,17 @@ edges | main.rs:227:24:227:31 | ...: usize | main.rs:231:42:231:42 | v | provenance | Sink:MaD:6 | | main.rs:282:24:282:41 | ...: String | main.rs:283:21:283:30 | user_input | provenance | | | main.rs:283:9:283:17 | num_bytes | main.rs:285:54:285:62 | num_bytes | provenance | | -| main.rs:283:21:283:30 | user_input | main.rs:283:21:283:47 | user_input.parse() [Ok] | provenance | MaD:26 | +| main.rs:283:21:283:30 | user_input | main.rs:283:21:283:47 | user_input.parse() [Ok] | provenance | MaD:23 | | main.rs:283:21:283:47 | user_input.parse() [Ok] | main.rs:283:21:283:48 | TryExpr | provenance | | -| main.rs:283:21:283:48 | TryExpr | main.rs:283:21:283:77 | ... * ... | provenance | MaD:25 | +| main.rs:283:21:283:48 | TryExpr | main.rs:283:21:283:77 | ... * ... | provenance | MaD:43 | | main.rs:283:21:283:77 | ... * ... | main.rs:283:9:283:17 | num_bytes | provenance | | | main.rs:285:9:285:14 | layout | main.rs:287:40:287:45 | layout | provenance | Sink:MaD:15 | -| main.rs:285:18:285:66 | ...::from_size_align(...) [Ok] | main.rs:285:18:285:75 | ... .unwrap() | provenance | MaD:41 | +| main.rs:285:18:285:66 | ...::from_size_align(...) [Ok] | main.rs:285:18:285:75 | ... .unwrap() | provenance | MaD:38 | | main.rs:285:18:285:75 | ... .unwrap() | main.rs:285:9:285:14 | layout | provenance | | -| main.rs:285:54:285:62 | num_bytes | main.rs:285:18:285:66 | ...::from_size_align(...) [Ok] | provenance | MaD:33 | +| main.rs:285:54:285:62 | num_bytes | main.rs:285:18:285:66 | ...::from_size_align(...) [Ok] | provenance | MaD:30 | | main.rs:311:25:311:40 | ...::args(...) | main.rs:311:25:311:40 | ...::args(...) [element] | provenance | Src:MaD:22 | -| main.rs:311:25:311:40 | ...::args(...) [element] | main.rs:311:25:311:47 | ... .nth(...) [Some] | provenance | MaD:23 | -| main.rs:311:25:311:47 | ... .nth(...) [Some] | main.rs:311:25:311:74 | ... .unwrap_or(...) | provenance | MaD:39 | +| main.rs:311:25:311:40 | ...::args(...) [element] | main.rs:311:25:311:47 | ... .nth(...) [Some] | provenance | MaD:41 | +| main.rs:311:25:311:47 | ... .nth(...) [Some] | main.rs:311:25:311:74 | ... .unwrap_or(...) | provenance | MaD:36 | | main.rs:311:25:311:74 | ... .unwrap_or(...) | main.rs:282:24:282:41 | ...: String | provenance | | | main.rs:317:26:317:33 | ...: usize | main.rs:331:26:331:26 | a | provenance | Sink:MaD:20 | | main.rs:339:9:339:9 | v | main.rs:342:34:342:34 | v | provenance | | @@ -233,10 +233,10 @@ edges | main.rs:339:9:339:9 | v | main.rs:347:22:347:22 | v | provenance | | | main.rs:339:9:339:9 | v | main.rs:349:24:349:24 | v | provenance | | | main.rs:339:13:339:28 | ...::args(...) | main.rs:339:13:339:28 | ...::args(...) [element] | provenance | Src:MaD:22 | -| main.rs:339:13:339:28 | ...::args(...) [element] | main.rs:339:13:339:35 | ... .nth(...) [Some] | provenance | MaD:23 | -| main.rs:339:13:339:35 | ... .nth(...) [Some] | main.rs:339:13:339:65 | ... .unwrap_or(...) | provenance | MaD:39 | -| main.rs:339:13:339:65 | ... .unwrap_or(...) | main.rs:339:13:339:82 | ... .parse() [Ok] | provenance | MaD:26 | -| main.rs:339:13:339:82 | ... .parse() [Ok] | main.rs:339:13:339:91 | ... .unwrap() | provenance | MaD:41 | +| main.rs:339:13:339:28 | ...::args(...) [element] | main.rs:339:13:339:35 | ... .nth(...) [Some] | provenance | MaD:41 | +| main.rs:339:13:339:35 | ... .nth(...) [Some] | main.rs:339:13:339:65 | ... .unwrap_or(...) | provenance | MaD:36 | +| main.rs:339:13:339:65 | ... .unwrap_or(...) | main.rs:339:13:339:82 | ... .parse() [Ok] | provenance | MaD:23 | +| main.rs:339:13:339:82 | ... .parse() [Ok] | main.rs:339:13:339:91 | ... .unwrap() | provenance | MaD:38 | | main.rs:339:13:339:91 | ... .unwrap() | main.rs:339:9:339:9 | v | provenance | | | main.rs:342:34:342:34 | v | main.rs:12:36:12:43 | ...: usize | provenance | | | main.rs:343:42:343:42 | v | main.rs:43:44:43:51 | ...: usize | provenance | | @@ -268,27 +268,27 @@ models | 20 | Sink: libc::unix::malloc; Argument[0]; alloc-size | | 21 | Sink: libc::unix::realloc; Argument[1]; alloc-size | | 22 | Source: std::env::args; ReturnValue.Element; commandargs | -| 23 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 24 | Summary: <_ as core::ops::arith::Add>::add; Argument[self,0]; ReturnValue; taint | -| 25 | Summary: <_ as core::ops::arith::Mul>::mul; Argument[self,0]; ReturnValue; taint | -| 26 | Summary: ::deref; Argument[self]; ReturnValue; value | -| 27 | Summary: ::align_to; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 28 | Summary: ::array; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 29 | Summary: ::extend; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | -| 30 | Summary: ::extend; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | -| 31 | Summary: ::extend_packed; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 32 | Summary: ::extend_packed; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 33 | Summary: ::from_size_align; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 34 | Summary: ::from_size_align_unchecked; Argument[0]; ReturnValue; taint | -| 35 | Summary: ::pad_to_align; Argument[self].Reference; ReturnValue; taint | -| 36 | Summary: ::repeat; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | -| 37 | Summary: ::repeat_packed; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 38 | Summary: ::size; Argument[self].Reference; ReturnValue; taint | -| 39 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 40 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 41 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 42 | Summary: core::cmp::max; Argument[0]; ReturnValue; value | -| 43 | Summary: core::cmp::min; Argument[0]; ReturnValue; value | +| 23 | Summary: ::deref; Argument[self]; ReturnValue; value | +| 24 | Summary: ::align_to; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 25 | Summary: ::array; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 26 | Summary: ::extend; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | +| 27 | Summary: ::extend; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | +| 28 | Summary: ::extend_packed; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 29 | Summary: ::extend_packed; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 30 | Summary: ::from_size_align; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 31 | Summary: ::from_size_align_unchecked; Argument[0]; ReturnValue; taint | +| 32 | Summary: ::pad_to_align; Argument[self].Reference; ReturnValue; taint | +| 33 | Summary: ::repeat; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | +| 34 | Summary: ::repeat_packed; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 35 | Summary: ::size; Argument[self].Reference; ReturnValue; taint | +| 36 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 37 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 38 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 39 | Summary: core::cmp::max; Argument[0]; ReturnValue; value | +| 40 | Summary: core::cmp::min; Argument[0]; ReturnValue; value | +| 41 | Summary: core::iter::traits::iterator::Iterator::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 42 | Summary: core::ops::arith::Add::add; Argument[self,0]; ReturnValue; taint | +| 43 | Summary: core::ops::arith::Mul::mul; Argument[self,0]; ReturnValue; taint | nodes | main.rs:12:36:12:43 | ...: usize | semmle.label | ...: usize | | main.rs:18:41:18:41 | v | semmle.label | v | diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index f350a8a4434f..3290d7bca875 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -27,52 +27,52 @@ edges | test_cipher.rs:18:9:18:14 | const1 [&ref] | test_cipher.rs:19:73:19:78 | const1 [&ref] | provenance | | | test_cipher.rs:18:28:18:36 | &... [&ref] | test_cipher.rs:18:9:18:14 | const1 [&ref] | provenance | | | test_cipher.rs:18:29:18:36 | [0u8; 16] | test_cipher.rs:18:28:18:36 | &... [&ref] | provenance | | -| test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref] | test_cipher.rs:19:49:19:79 | ...::from_slice(...) | provenance | Sink:MaD:3 | +| test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref] | test_cipher.rs:19:49:19:79 | ...::from_slice(...) | provenance | Sink:MaD:2 | | test_cipher.rs:19:73:19:78 | const1 [&ref] | test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref] | provenance | MaD:13 | | test_cipher.rs:25:9:25:14 | const4 [&ref] | test_cipher.rs:26:66:26:71 | const4 [&ref] | provenance | | | test_cipher.rs:25:28:25:36 | &... [&ref] | test_cipher.rs:25:9:25:14 | const4 [&ref] | provenance | | | test_cipher.rs:25:29:25:36 | [0u8; 16] | test_cipher.rs:25:28:25:36 | &... [&ref] | provenance | | -| test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref] | test_cipher.rs:26:42:26:72 | ...::from_slice(...) | provenance | Sink:MaD:4 | +| test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref] | test_cipher.rs:26:42:26:72 | ...::from_slice(...) | provenance | Sink:MaD:3 | | test_cipher.rs:26:66:26:71 | const4 [&ref] | test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref] | provenance | MaD:13 | | test_cipher.rs:29:9:29:14 | const5 [&ref] | test_cipher.rs:30:95:30:100 | const5 [&ref] | provenance | | | test_cipher.rs:29:28:29:36 | &... [&ref] | test_cipher.rs:29:9:29:14 | const5 [&ref] | provenance | | | test_cipher.rs:29:29:29:36 | [0u8; 16] | test_cipher.rs:29:28:29:36 | &... [&ref] | provenance | | -| test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref] | test_cipher.rs:30:72:30:101 | ...::from_slice(...) | provenance | Sink:MaD:5 | +| test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref] | test_cipher.rs:30:72:30:101 | ...::from_slice(...) | provenance | Sink:MaD:4 | | test_cipher.rs:30:95:30:100 | const5 [&ref] | test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref] | provenance | MaD:13 | | test_cipher.rs:37:9:37:14 | const7 | test_cipher.rs:38:74:38:79 | const7 | provenance | | | test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:37:9:37:14 | const7 | provenance | | -| test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) | provenance | Sink:MaD:3 | +| test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) | provenance | Sink:MaD:2 | | test_cipher.rs:38:73:38:79 | &const7 [&ref] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | provenance | MaD:13 | | test_cipher.rs:38:74:38:79 | const7 | test_cipher.rs:38:73:38:79 | &const7 [&ref] | provenance | | | test_cipher.rs:41:9:41:14 | const8 [&ref] | test_cipher.rs:42:73:42:78 | const8 [&ref] | provenance | | | test_cipher.rs:41:28:41:76 | &... [&ref] | test_cipher.rs:41:9:41:14 | const8 [&ref] | provenance | | | test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:41:28:41:76 | &... [&ref] | provenance | | -| test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) | provenance | Sink:MaD:3 | +| test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) | provenance | Sink:MaD:2 | | test_cipher.rs:42:73:42:78 | const8 [&ref] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | provenance | MaD:13 | | test_cipher.rs:50:9:50:15 | const10 [element] | test_cipher.rs:51:75:51:81 | const10 [element] | provenance | | | test_cipher.rs:50:37:50:54 | ...::zeroed(...) | test_cipher.rs:50:9:50:15 | const10 [element] | provenance | Src:MaD:7 | -| test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | test_cipher.rs:51:50:51:82 | ...::from_slice(...) | provenance | Sink:MaD:3 Sink:MaD:3 | +| test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | test_cipher.rs:51:50:51:82 | ...::from_slice(...) | provenance | Sink:MaD:2 Sink:MaD:2 | | test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | provenance | MaD:13 | | test_cipher.rs:51:75:51:81 | const10 [element] | test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | provenance | | -| test_cipher.rs:73:9:73:14 | const2 [&ref] | test_cipher.rs:74:46:74:51 | const2 | provenance | Sink:MaD:1 | +| test_cipher.rs:73:9:73:14 | const2 [&ref] | test_cipher.rs:74:46:74:51 | const2 | provenance | Sink:MaD:6 | | test_cipher.rs:73:18:73:26 | &... [&ref] | test_cipher.rs:73:9:73:14 | const2 [&ref] | provenance | | | test_cipher.rs:73:19:73:26 | [0u8; 32] | test_cipher.rs:73:18:73:26 | &... [&ref] | provenance | | | test_cookie.rs:17:9:17:14 | array1 | test_cookie.rs:18:27:18:32 | array1 | provenance | | | test_cookie.rs:17:28:17:34 | [0; 64] | test_cookie.rs:17:9:17:14 | array1 | provenance | | -| test_cookie.rs:18:26:18:32 | &array1 [&ref] | test_cookie.rs:18:26:18:32 | &array1 | provenance | Sink:MaD:6 | +| test_cookie.rs:18:26:18:32 | &array1 [&ref] | test_cookie.rs:18:26:18:32 | &array1 | provenance | Sink:MaD:5 | | test_cookie.rs:18:27:18:32 | array1 | test_cookie.rs:18:26:18:32 | &array1 [&ref] | provenance | | | test_cookie.rs:21:9:21:14 | array2 | test_cookie.rs:22:27:22:32 | array2 | provenance | | | test_cookie.rs:21:28:21:34 | [0; 64] | test_cookie.rs:21:9:21:14 | array2 | provenance | | -| test_cookie.rs:22:26:22:32 | &array2 [&ref] | test_cookie.rs:22:26:22:32 | &array2 | provenance | Sink:MaD:6 | +| test_cookie.rs:22:26:22:32 | &array2 [&ref] | test_cookie.rs:22:26:22:32 | &array2 | provenance | Sink:MaD:5 | | test_cookie.rs:22:27:22:32 | array2 | test_cookie.rs:22:26:22:32 | &array2 [&ref] | provenance | | -| test_cookie.rs:38:9:38:14 | array2 | test_cookie.rs:42:34:42:39 | array2 | provenance | Sink:MaD:2 | +| test_cookie.rs:38:9:38:14 | array2 | test_cookie.rs:42:34:42:39 | array2 | provenance | Sink:MaD:1 | | test_cookie.rs:38:18:38:37 | ...::from(...) | test_cookie.rs:38:9:38:14 | array2 | provenance | | | test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:38:18:38:37 | ...::from(...) | provenance | MaD:8 | | test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:38:18:38:37 | ...::from(...) | provenance | MaD:9 | | test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:38:18:38:37 | ...::from(...) | provenance | MaD:10 | | test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:38:18:38:37 | ...::from(...) | provenance | MaD:11 | | test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:38:18:38:37 | ...::from(...) | provenance | MaD:12 | -| test_cookie.rs:49:9:49:14 | array3 [element] | test_cookie.rs:53:34:53:39 | array3 | provenance | Sink:MaD:2 | +| test_cookie.rs:49:9:49:14 | array3 [element] | test_cookie.rs:53:34:53:39 | array3 | provenance | Sink:MaD:1 | | test_cookie.rs:49:23:49:25 | 0u8 | test_cookie.rs:49:23:49:29 | ...::from_elem(...) [element] | provenance | MaD:14 | | test_cookie.rs:49:23:49:29 | ...::from_elem(...) [element] | test_cookie.rs:49:9:49:14 | array3 [element] | provenance | | | test_heuristic.rs:38:25:38:30 | 0xFFFF | test_heuristic.rs:81:22:81:31 | MY_CONST_1 | provenance | | @@ -87,12 +87,12 @@ edges | test_heuristic.rs:86:29:86:32 | 1u64 | test_heuristic.rs:87:22:87:31 | MY_CONST_5 | provenance | | | test_heuristic.rs:88:29:88:33 | ... + ... | test_heuristic.rs:89:22:89:31 | MY_CONST_6 | provenance | | models -| 1 | Sink: <_ as crypto_common::KeyInit>::new_from_slice; Argument[0]; credentials-key | -| 2 | Sink: ::from; Argument[0]; credentials-key | -| 3 | Sink: ::new; Argument[0]; credentials-key | -| 4 | Sink: ::new; Argument[0]; credentials-key | -| 5 | Sink: ::new; Argument[1]; credentials-iv | -| 6 | Sink: ::from; Argument[0].Reference; credentials-key | +| 1 | Sink: ::from; Argument[0]; credentials-key | +| 2 | Sink: ::new; Argument[0]; credentials-key | +| 3 | Sink: ::new; Argument[0]; credentials-key | +| 4 | Sink: ::new; Argument[1]; credentials-iv | +| 5 | Sink: ::from; Argument[0].Reference; credentials-key | +| 6 | Sink: crypto_common::KeyInit::new_from_slice; Argument[0]; credentials-key | | 7 | Source: core::mem::zeroed; ReturnValue.Element; constant-source | | 8 | Summary: ::from; Argument[0].Field[alloc::borrow::Cow::Owned(0)]; ReturnValue; value | | 9 | Summary: ::from; Argument[0].Field[alloc::bstr::ByteString(0)]; ReturnValue; value | diff --git a/rust/ql/test/query-tests/security/CWE-918/RequestForgery.expected b/rust/ql/test/query-tests/security/CWE-918/RequestForgery.expected index 0b6342593baa..53b03f7ed2f1 100644 --- a/rust/ql/test/query-tests/security/CWE-918/RequestForgery.expected +++ b/rust/ql/test/query-tests/security/CWE-918/RequestForgery.expected @@ -45,7 +45,7 @@ edges | request_forgery_tests.rs:68:42:68:42 | a | request_forgery_tests.rs:68:41:68:42 | &a [&ref] | provenance | | models | 1 | Sink: reqwest::get; Argument[0]; request-url | -| 2 | Source: <_ as warp::filter::Filter>::and_then; Argument[0].Parameter[0..7]; remote | +| 2 | Source: warp::filter::Filter::and_then; Argument[0].Parameter[0..7]; remote | | 3 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | | 4 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes From 29f91cc0d556be67295d5cb40f598cc5cf654a6c Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Wed, 19 Aug 2026 09:35:18 +0200 Subject: [PATCH 0367/2098] Rust: Use `zstd` compression for TRAP files by default --- rust/codeql-extractor.yml | 4 ++-- rust/extractor/src/config.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rust/codeql-extractor.yml b/rust/codeql-extractor.yml index 6675dd3a2718..4556e29ca9d3 100644 --- a/rust/codeql-extractor.yml +++ b/rust/codeql-extractor.yml @@ -25,8 +25,8 @@ options: title: Controls compression for the TRAP files written by the extractor. description: > This option is only intended for use in debugging the extractor. Accepted - values are 'gzip' (to write gzip-compressed TRAP) 'zstd' (to write - Zstandard-compressed TRAP) and 'none' (the default, to write uncompressed + values are 'gzip' (to write gzip-compressed TRAP) 'zstd' (the default, + to write Zstandard-compressed TRAP) and 'none' (to write uncompressed TRAP). type: string pattern: "^(none|gzip|zstd)$" diff --git a/rust/extractor/src/config.rs b/rust/extractor/src/config.rs index 8ff68ea8a547..bd615c083bc2 100644 --- a/rust/extractor/src/config.rs +++ b/rust/extractor/src/config.rs @@ -28,9 +28,9 @@ use std::path::{Path, PathBuf}; #[serde(rename_all = "lowercase")] #[clap(rename_all = "lowercase")] pub enum Compression { - #[default] // TODO make gzip default None, Gzip, + #[default] Zstd, } From f90254119e53da9de32165839fcd4deb927e7d0c Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Wed, 19 Aug 2026 10:28:32 +0200 Subject: [PATCH 0368/2098] Rust: Document trait item canonical path change Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 5a15104d-a9a3-4506-8325-203af6db47f8 --- .../ql/lib/change-notes/2026-08-19-trait-canonical-paths.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 rust/ql/lib/change-notes/2026-08-19-trait-canonical-paths.md diff --git a/rust/ql/lib/change-notes/2026-08-19-trait-canonical-paths.md b/rust/ql/lib/change-notes/2026-08-19-trait-canonical-paths.md new file mode 100644 index 000000000000..9398a7c187fe --- /dev/null +++ b/rust/ql/lib/change-notes/2026-08-19-trait-canonical-paths.md @@ -0,0 +1,6 @@ +--- +category: minorAnalysis +--- +* Canonical paths for Rust trait items now use the format `crate::Trait::item` instead of + `<_ as crate::Trait>::item`. Custom data extension models that reference trait items + must be updated to use the new format. \ No newline at end of file From 4f48b452e12813aade9553c9362f3b9a5701d6b2 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Wed, 19 Aug 2026 10:45:47 +0200 Subject: [PATCH 0369/2098] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- rust/ql/lib/codeql/rust/frameworks/tokio/io.model.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust/ql/lib/codeql/rust/frameworks/tokio/io.model.yml b/rust/ql/lib/codeql/rust/frameworks/tokio/io.model.yml index d2d7ce1a598f..ceb3e8372d3a 100644 --- a/rust/ql/lib/codeql/rust/frameworks/tokio/io.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/tokio/io.model.yml @@ -43,6 +43,6 @@ extensions: - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i128", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i128_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - ["tokio::io::util::async_read_ext::AsyncReadExt::read_f32", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt:::read_f32_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["tokio::io::util::async_read_ext::AsyncReadExt::read_f32_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - ["tokio::io::util::async_read_ext::AsyncReadExt::read_f64", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - ["tokio::io::util::async_read_ext::AsyncReadExt::read_f64_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] From b5825df9a31a6536eee9f750f30771740b5e9591 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Thu, 13 Aug 2026 17:41:33 +0100 Subject: [PATCH 0370/2098] Rust: Add a couple of missing crates to supported-frameworks.rst. --- docs/codeql/reusables/supported-frameworks.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/codeql/reusables/supported-frameworks.rst b/docs/codeql/reusables/supported-frameworks.rst index 257fc17e5a44..2f6061bc9b6b 100644 --- a/docs/codeql/reusables/supported-frameworks.rst +++ b/docs/codeql/reusables/supported-frameworks.rst @@ -327,6 +327,7 @@ and the CodeQL library pack ``codeql/rust-all`` (`changelog `__, Web framework alloc, Standard library `async-std `__, Asynchronous programming library + `axum `__, Web framework `biscotti `__, Cookie management `clap `__, Utility library `cookie `__, Cookie management @@ -341,6 +342,8 @@ and the CodeQL library pack ``codeql/rust-all`` (`changelog `__, Utility library `mysql `__, Database `mysql_async `__, Database + `native-tls `__, Network communicator + `async-native-tls `__, Network communicator `once_cell `__, Utility library `poem `__, Web framework `postgres `__, Database From 946e116fa327062ed6c46a235e5ab9a7a3fab655 Mon Sep 17 00:00:00 2001 From: hugo-syn Date: Wed, 19 Aug 2026 12:07:14 +0200 Subject: [PATCH 0371/2098] C#: inline TestAdditionalTaintStep.qll into AdditionalTaintStep.ql Addresses review comment: the test-only AdditionalTaintStep subclass only has a single consumer, so fold it directly into the query file instead of keeping it in a separate .qll. Co-Authored-By: Claude Sonnet 5 --- .../AdditionalTaintStep.ql | 19 ++++++++++++++++++- .../TestAdditionalTaintStep.qll | 19 ------------------- 2 files changed, 18 insertions(+), 20 deletions(-) delete mode 100644 csharp/ql/test/library-tests/dataflow/additional-taint-step/TestAdditionalTaintStep.qll diff --git a/csharp/ql/test/library-tests/dataflow/additional-taint-step/AdditionalTaintStep.ql b/csharp/ql/test/library-tests/dataflow/additional-taint-step/AdditionalTaintStep.ql index b499c2ce51d1..39d9e154b6f7 100644 --- a/csharp/ql/test/library-tests/dataflow/additional-taint-step/AdditionalTaintStep.ql +++ b/csharp/ql/test/library-tests/dataflow/additional-taint-step/AdditionalTaintStep.ql @@ -1,6 +1,23 @@ import csharp +import semmle.code.csharp.dataflow.FlowSteps import semmle.code.csharp.dataflow.internal.TaintTrackingPrivate -import TestAdditionalTaintStep + +/** + * A test-only additional taint step that treats calls to `Marker.Step` as + * propagating taint from the argument to the call result, to verify that + * `AdditionalTaintStep` subclasses are picked up by `defaultAdditionalTaintStep`. + */ +private class MarkerStepTaintStep extends AdditionalTaintStep { + override predicate step(DataFlow::Node node1, DataFlow::Node node2) { + exists(MethodCall mc | + mc.getTarget().hasName("Step") and + mc.getTarget().getDeclaringType().hasName("Marker") + | + node1.asExpr() = mc.getArgument(0) and + node2.asExpr() = mc + ) + } +} from DataFlow::Node src, DataFlow::Node sink, string model where defaultAdditionalTaintStep(src, sink, model) and model = "AdditionalTaintStep" diff --git a/csharp/ql/test/library-tests/dataflow/additional-taint-step/TestAdditionalTaintStep.qll b/csharp/ql/test/library-tests/dataflow/additional-taint-step/TestAdditionalTaintStep.qll deleted file mode 100644 index d17109ba730c..000000000000 --- a/csharp/ql/test/library-tests/dataflow/additional-taint-step/TestAdditionalTaintStep.qll +++ /dev/null @@ -1,19 +0,0 @@ -import csharp -import semmle.code.csharp.dataflow.FlowSteps - -/** - * A test-only additional taint step that treats calls to `Marker.Step` as - * propagating taint from the argument to the call result, to verify that - * `AdditionalTaintStep` subclasses are picked up by `defaultAdditionalTaintStep`. - */ -private class MarkerStepTaintStep extends AdditionalTaintStep { - override predicate step(DataFlow::Node node1, DataFlow::Node node2) { - exists(MethodCall mc | - mc.getTarget().hasName("Step") and - mc.getTarget().getDeclaringType().hasName("Marker") - | - node1.asExpr() = mc.getArgument(0) and - node2.asExpr() = mc - ) - } -} From 79ac0090d24d49009260ffc80dec901bb70a3a2b Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Mon, 17 Aug 2026 13:44:04 +0100 Subject: [PATCH 0372/2098] C++: Support for access path at sources and sinks. --- .../semmle/code/cpp/dataflow/ExternalFlow.qll | 9 +- .../cpp/dataflow/internal/FlowSummaryImpl.qll | 157 +++++++++++++++++- .../ir/dataflow/internal/DataFlowNodes.qll | 36 ++++ 3 files changed, 188 insertions(+), 14 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll index 29da7f7204c0..4f84b30d557e 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll @@ -113,6 +113,7 @@ import cpp private import new.DataFlow private import semmle.code.cpp.controlflow.IRGuards +private import semmle.code.cpp.ir.dataflow.internal.DataFlowNodes as Nodes private import semmle.code.cpp.ir.dataflow.internal.DataFlowPrivate as Private private import semmle.code.cpp.ir.dataflow.internal.DataFlowUtil private import internal.FlowSummaryImpl @@ -952,9 +953,7 @@ private module Cached { */ cached predicate sourceNode(DataFlow::Node node, string kind, string model) { - exists(SourceSinkInterpretationInput::InterpretNode n | - isSourceNode(n, kind, model) and n.asNode() = node - ) + node.(Nodes::FlowSummaryNode).isSource(kind, model) } /** @@ -963,9 +962,7 @@ private module Cached { */ cached predicate sinkNode(DataFlow::Node node, string kind, string model) { - exists(SourceSinkInterpretationInput::InterpretNode n | - isSinkNode(n, kind, model) and n.asNode() = node - ) + node.(Nodes::FlowSummaryNode).isSink(kind, model) } private newtype TKindModelPair = diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll index dda9218855f8..7a43fe19492e 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll @@ -17,11 +17,9 @@ module Input implements InputSig { class SummarizedCallableBase = Function; - class SourceBase extends Void { - Location getLocation() { none() } - } + class SourceBase = Function; - class SinkBase = SourceBase; + class SinkBase = Function; class FlowSummaryCallBase = CallInstruction; @@ -134,15 +132,120 @@ module Input implements InputSig { private import Make as Impl +private class ConversionCall extends Call { + ConversionCall() { this.getTarget() instanceof ConversionOperator } +} + private module Input2 implements Impl::Private::InputSig2 { private import codeql.util.Void - class SourceSinkReportingElement extends Void { - Location getLocation() { none() } + class SourceSinkReportingElement extends Element { + SourceSinkReportingElement() { this instanceof Expr or this instanceof Parameter } + + DataFlowCallable getEnclosingCallable() { + result.asSourceCallable() = + [this.(Expr).getEnclosingFunction(), this.(Parameter).getFunction()] + } + + /** + * Gets the member function corresponding to an overloaded `operator()` when this element is + * invoked. + */ + private MemberFunction getOperatorCallFunction() { + // An `operator()` on a struct + result.getClassAndName("operator()").getADerivedClass*() = this.(Expr).getUnspecifiedType() + or + // A lambda that has undergone "lambda to function-pointer conversion" + result = this.(ConversionCall).getQualifier().(LambdaExpression).getLambdaFunction() + } + + SourceSinkReportingElement getASuccessor(Impl::Private::SummaryComponent sc) { + exists(ParameterPosition pos | sc = Impl::Private::SummaryComponent::parameter(pos) | + // Taking the address of a function + result = pos.getParameter(this.(FunctionAccess).getTarget()) + or + // Passing an object with an overloaded `operator()` + result = pos.getParameter(this.getOperatorCallFunction()) + ) + } + } + + bindingset[source, sc] + SourceSinkReportingElement getASourceReportingElement( + Input::SourceBase source, Impl::Private::SummaryComponent sc + ) { + exists(Call call | call.getTarget() = source | + sc = Impl::Private::SummaryComponent::return(_) and + result = call + or + exists(ArgumentPosition pos | + sc = Impl::Private::SummaryComponent::argument(pos) and + result = pos.getArgument(call) + ) + ) + or + exists(ParameterPosition pos | + sc = Impl::Private::SummaryComponent::parameter(pos) and + result = pos.getParameter(source) + ) + } + + pragma[nomagic] + private IndirectReturnOutNode getIndirectReturn(CallInstruction call, NormalReturnKind rk) { + result.getCallInstruction() = call and + pragma[only_bind_out](result.getIndirectionIndex()) = + pragma[only_bind_out](rk.getIndirectionIndex()) + } + + bindingset[e, sc] + Node getSourceDataFlowNode(SourceSinkReportingElement e, Impl::Private::SummaryComponent sc) { + exists(DataFlowCall call | + exists(ArgumentPosition pos | + sc = Impl::Private::SummaryComponent::argument(pos) and + pos.getArgument(call.asCallInstruction().getUnconvertedResultExpression()) = e + | + pos.getIndirectionIndex() = 0 and + result.(PostUpdateNode).getPreUpdateNode().asExpr() = e + or + result.(PostUpdateNode).getPreUpdateNode().asIndirectExpr(pos.getIndirectionIndex()) = e + ) + or + exists(ReturnKind rk | + sc = Impl::Private::SummaryComponent::return(rk) and + e = call.asCallInstruction().getUnconvertedResultExpression() + | + rk.getIndirectionIndex() = 0 and + simpleOutNode(result, call.asCallInstruction()) + or + result = getIndirectReturn(call.asCallInstruction(), rk) + ) + ) + or + exists(ParameterPosition pos, ParameterNode p | + sc = Impl::Private::SummaryComponent::parameter(pos) and + p.isParameterOf(e.getEnclosingCallable(), pos) and + result = p + ) + } - DataFlowCallable getEnclosingCallable() { none() } + bindingset[sink, sc] + SourceSinkReportingElement getASinkReportingElement( + Input::SinkBase sink, Impl::Private::SummaryComponent sc + ) { + exists(Call call, ArgumentPosition pos | + call.getTarget() = sink and + sc = Impl::Private::SummaryComponent::argument(pos) and + result = pos.getArgument(call) + ) + } - SourceSinkReportingElement getASuccessor(Impl::Private::SummaryComponent sc) { none() } + bindingset[e, sc] + Node getSinkDataFlowNode(SourceSinkReportingElement e, Impl::Private::SummaryComponent sc) { + exists(ArgumentPosition pos, CallInstruction call | + sc = Impl::Private::SummaryComponent::argument(pos) and + pos.getArgument(call.getUnconvertedResultExpression()) = e and + result.(ArgumentNode).sourceArgumentOf(call, pos) + ) } } @@ -319,3 +422,41 @@ module Private { } module Public = Impl::Public; + +private class SourceModelFunction extends Public::SourceElement instanceof Function { + private string namespace; + private string type; + private boolean subtypes; + private string name; + private string signature; + private string ext; + + SourceModelFunction() { + sourceModel(namespace, type, subtypes, name, signature, ext, _, _, _, _) and + this = interpretElement(namespace, type, subtypes, name, signature, ext) + } + + override predicate isSource( + string output, string kind, Public::Provenance provenance, string model + ) { + sourceModel(namespace, type, subtypes, name, signature, ext, output, kind, provenance, model) + } +} + +private class SinkModelFunction extends Public::SinkElement instanceof Function { + private string namespace; + private string type; + private boolean subtypes; + private string name; + private string signature; + private string ext; + + SinkModelFunction() { + sinkModel(namespace, type, subtypes, name, signature, ext, _, _, _, _) and + this = interpretElement(namespace, type, subtypes, name, signature, ext) + } + + override predicate isSink(string input, string kind, Public::Provenance provenance, string model) { + sinkModel(namespace, type, subtypes, name, signature, ext, input, kind, provenance, model) + } +} diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll index 9e33969c85f8..16e2130eb229 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll @@ -1541,6 +1541,42 @@ class FlowSummaryNode extends Node, TFlowSummaryNode { override Location getLocationImpl() { result = this.getSummaryNode().getLocation() } override string toStringImpl() { result = this.getSummaryNode().toString() } + + /** Gets the source element that this node belongs to, if any. */ + FlowSummaryImpl::Public::SourceElement getSourceElement() { + result = this.getSummaryNode().getSourceElement() + } + + /** Gets the sink element that this node belongs to, if any. */ + FlowSummaryImpl::Public::SinkElement getSinkElement() { + result = this.getSummaryNode().getSinkElement() + } + + /** Holds if this node is a source node of kind `kind`. */ + predicate isSource(string kind, string model) { + this.getSummaryNode().(FlowSummaryImpl::Private::SourceOutputNode).isEntry(kind, model) + } + + /** Holds if this node is a sink node of kind `kind`. */ + predicate isSink(string kind, string model) { + this.getSummaryNode().(FlowSummaryImpl::Private::SinkInputNode).isExit(kind, model) + } +} + +private class SourceOutputNode extends FlowSummaryImpl::Private::SourceOutputNode { + final override string toString() { + exists(Call call | + this.isOutArgument(call) and + result = call.getTarget() + " output argument" + ) + or + not this.isOutArgument(_) and + result = super.toString() + } + + private predicate isOutArgument(Call call) { + [call.getAnArgument(), call.getQualifier()] = this.getSourceSinkReportingElement() + } } /** From af7db963b711eab1294eab35f717ca8bf0196ca7 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Mon, 17 Aug 2026 14:39:14 +0100 Subject: [PATCH 0373/2098] C++: Accept test changes. --- .../dataflow/external-models/flow.expected | 344 ++++++++++-------- .../dataflow/external-models/sinks.expected | 4 +- .../dataflow/external-models/sources.expected | 30 +- .../dataflow/external-models/test.cpp | 10 +- .../models-as-data/testModels.expected | 67 ++++ 5 files changed, 288 insertions(+), 167 deletions(-) diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index 24ba3b2aa686..99ce09880165 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -33,106 +33,109 @@ models | 32 | Source: ; ; false; WinHttpQueryHeadersEx; ; ; Argument[*6]; remote; manual | | 33 | Source: ; ; false; WinHttpReadData; ; ; Argument[*1]; remote; manual | | 34 | Source: ; ; false; WinHttpReadDataEx; ; ; Argument[*1]; remote; manual | -| 35 | Source: ; ; false; ymlSource; ; ; ReturnValue; local; manual | -| 36 | Source: Azure::Core::Http; RawResponse; true; ExtractBodyStream; ; ; ReturnValue[*]; remote; manual | -| 37 | Source: Azure::Core::Http; RawResponse; true; GetBody; ; ; ReturnValue[*]; remote; manual | -| 38 | Source: Azure::Core::Http; RawResponse; true; GetHeaders; ; ; ReturnValue[*]; remote; manual | -| 39 | Source: Azure::Core::Http; Request; true; GetBodyStream; ; ; ReturnValue[*]; remote; manual | -| 40 | Source: Azure::Core::Http; Request; true; GetHeader; ; ; ReturnValue; remote; manual | -| 41 | Source: Azure::Core::Http; Request; true; GetHeaders; ; ; ReturnValue; remote; manual | -| 42 | Source: boost::asio; ; false; read_until; ; ; Argument[*1]; remote; manual | -| 43 | Summary: ; ; false; CLSIDFromProgID; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 44 | Summary: ; ; false; CLSIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 45 | Summary: ; ; false; CommandLineToArgvA; ; ; Argument[*0]; ReturnValue[**]; taint; manual | -| 46 | Summary: ; ; false; CreateRemoteThread; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | -| 47 | Summary: ; ; false; CreateRemoteThreadEx; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | -| 48 | Summary: ; ; false; CreateThread; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | -| 49 | Summary: ; ; false; GUIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 50 | Summary: ; ; false; IIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 51 | Summary: ; ; false; ProgIDFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | -| 52 | Summary: ; ; false; ReadFileEx; ; ; Argument[*3].Field[@hEvent]; Argument[4].Parameter[*2].Field[@hEvent]; value; manual | -| 53 | Summary: ; ; false; RtlCopyDeviceMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 54 | Summary: ; ; false; RtlCopyMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 55 | Summary: ; ; false; RtlCopyMemoryNonTemporal; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 56 | Summary: ; ; false; RtlCopyUnicodeString; ; ; Argument[*1].Field[*Buffer]; Argument[*0].Field[*Buffer]; value; manual | -| 57 | Summary: ; ; false; RtlCopyVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 58 | Summary: ; ; false; RtlInitUnicodeString; ; ; Argument[*1]; Argument[*0].Field[*Buffer]; value; manual | -| 59 | Summary: ; ; false; RtlMoveMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 60 | Summary: ; ; false; RtlMoveVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 61 | Summary: ; ; false; StringFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | -| 62 | Summary: ; ; false; StringFromGUID2; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 63 | Summary: ; ; false; StringFromIID; ; ; Argument[*0]; Argument[**1]; taint; manual | -| 64 | Summary: ; ; false; WinHttpCrackUrl; ; ; Argument[*0]; Argument[*3]; taint; manual | -| 65 | Summary: ; ; false; callWithArgument; ; ; Argument[1]; Argument[0].Parameter[0]; value; manual | -| 66 | Summary: ; ; false; callWithNonTypeTemplate; (const T &); ; Argument[*0]; ReturnValue; value; manual | -| 67 | Summary: ; ; false; pthread_create; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | -| 68 | Summary: ; ; false; read_field_from_struct; ; ; Argument[*0].Field[MyNamespace::MyStructInNamespace::myField]; ReturnValue; value; manual | -| 69 | Summary: ; ; false; read_field_from_struct_2; ; ; Argument[*0].Field[MyGlobalStruct::myField]; ReturnValue; value; manual | -| 70 | Summary: ; ; false; ymlStepGenerated; ; ; Argument[0]; ReturnValue; taint; df-generated | -| 71 | Summary: ; ; false; ymlStepManual; ; ; Argument[0]; ReturnValue; taint; manual | -| 72 | Summary: ; ; false; ymlStepManual_with_body; ; ; Argument[0]; ReturnValue; taint; manual | -| 73 | Summary: ; MyString; true; operator[]; ; ; Argument[-1]; ReturnValue[*]; taint; manual | -| 74 | Summary: ; MyString; true; operator[]; ; ; ReturnValue[*]; Argument[-1]; taint; manual | -| 75 | Summary: ; ReverseFlow; true; get_ptr; ; ; ReturnValue[*]; Argument[-1].Field[ReverseFlow::value]; value; manual | -| 76 | Summary: ; TemplateClass1; true; templateFunction2; (U,V); ; Argument[1]; ReturnValue; value; manual | -| 77 | Summary: ; TemplateClass1; false; templateFunction; (T,U); ; Argument[0]; ReturnValue; value; manual | -| 78 | Summary: ; TemplateClass2; true; function; (U,T); ; Argument[1]; ReturnValue; value; manual | -| 79 | Summary: Azure::Core::IO; BodyStream; true; Read; ; ; Argument[-1]; Argument[*0]; taint; manual | -| 80 | Summary: Azure::Core::IO; BodyStream; true; ReadToCount; ; ; Argument[-1]; Argument[*0]; taint; manual | -| 81 | Summary: Azure::Core::IO; BodyStream; true; ReadToEnd; ; ; Argument[-1]; ReturnValue.Element; taint; manual | -| 82 | Summary: Azure; Nullable; true; Value; ; ; Argument[-1]; ReturnValue[*]; taint; manual | -| 83 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | +| 35 | Source: ; ; false; source_from_callback_ptr; ; ; Argument[0].Parameter[*0].Field[SourceWrapper::value]; local; manual | +| 36 | Source: ; ; false; source_from_callback_template; ; ; Argument[0].Parameter[*0].Field[SourceWrapper::value]; local; manual | +| 37 | Source: ; ; false; ymlFieldSource; ; ; ReturnValue.Field[SourceWrapper::value]; local; manual | +| 38 | Source: ; ; false; ymlSource; ; ; ReturnValue; local; manual | +| 39 | Source: Azure::Core::Http; RawResponse; true; ExtractBodyStream; ; ; ReturnValue[*]; remote; manual | +| 40 | Source: Azure::Core::Http; RawResponse; true; GetBody; ; ; ReturnValue[*]; remote; manual | +| 41 | Source: Azure::Core::Http; RawResponse; true; GetHeaders; ; ; ReturnValue[*]; remote; manual | +| 42 | Source: Azure::Core::Http; Request; true; GetBodyStream; ; ; ReturnValue[*]; remote; manual | +| 43 | Source: Azure::Core::Http; Request; true; GetHeader; ; ; ReturnValue; remote; manual | +| 44 | Source: Azure::Core::Http; Request; true; GetHeaders; ; ; ReturnValue; remote; manual | +| 45 | Source: boost::asio; ; false; read_until; ; ; Argument[*1]; remote; manual | +| 46 | Summary: ; ; false; CLSIDFromProgID; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 47 | Summary: ; ; false; CLSIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 48 | Summary: ; ; false; CommandLineToArgvA; ; ; Argument[*0]; ReturnValue[**]; taint; manual | +| 49 | Summary: ; ; false; CreateRemoteThread; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | +| 50 | Summary: ; ; false; CreateRemoteThreadEx; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | +| 51 | Summary: ; ; false; CreateThread; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | +| 52 | Summary: ; ; false; GUIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 53 | Summary: ; ; false; IIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 54 | Summary: ; ; false; ProgIDFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | +| 55 | Summary: ; ; false; ReadFileEx; ; ; Argument[*3].Field[@hEvent]; Argument[4].Parameter[*2].Field[@hEvent]; value; manual | +| 56 | Summary: ; ; false; RtlCopyDeviceMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 57 | Summary: ; ; false; RtlCopyMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 58 | Summary: ; ; false; RtlCopyMemoryNonTemporal; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 59 | Summary: ; ; false; RtlCopyUnicodeString; ; ; Argument[*1].Field[*Buffer]; Argument[*0].Field[*Buffer]; value; manual | +| 60 | Summary: ; ; false; RtlCopyVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 61 | Summary: ; ; false; RtlInitUnicodeString; ; ; Argument[*1]; Argument[*0].Field[*Buffer]; value; manual | +| 62 | Summary: ; ; false; RtlMoveMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 63 | Summary: ; ; false; RtlMoveVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 64 | Summary: ; ; false; StringFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | +| 65 | Summary: ; ; false; StringFromGUID2; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 66 | Summary: ; ; false; StringFromIID; ; ; Argument[*0]; Argument[**1]; taint; manual | +| 67 | Summary: ; ; false; WinHttpCrackUrl; ; ; Argument[*0]; Argument[*3]; taint; manual | +| 68 | Summary: ; ; false; callWithArgument; ; ; Argument[1]; Argument[0].Parameter[0]; value; manual | +| 69 | Summary: ; ; false; callWithNonTypeTemplate; (const T &); ; Argument[*0]; ReturnValue; value; manual | +| 70 | Summary: ; ; false; pthread_create; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | +| 71 | Summary: ; ; false; read_field_from_struct; ; ; Argument[*0].Field[MyNamespace::MyStructInNamespace::myField]; ReturnValue; value; manual | +| 72 | Summary: ; ; false; read_field_from_struct_2; ; ; Argument[*0].Field[MyGlobalStruct::myField]; ReturnValue; value; manual | +| 73 | Summary: ; ; false; ymlStepGenerated; ; ; Argument[0]; ReturnValue; taint; df-generated | +| 74 | Summary: ; ; false; ymlStepManual; ; ; Argument[0]; ReturnValue; taint; manual | +| 75 | Summary: ; ; false; ymlStepManual_with_body; ; ; Argument[0]; ReturnValue; taint; manual | +| 76 | Summary: ; MyString; true; operator[]; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 77 | Summary: ; MyString; true; operator[]; ; ; ReturnValue[*]; Argument[-1]; taint; manual | +| 78 | Summary: ; ReverseFlow; true; get_ptr; ; ; ReturnValue[*]; Argument[-1].Field[ReverseFlow::value]; value; manual | +| 79 | Summary: ; TemplateClass1; true; templateFunction2; (U,V); ; Argument[1]; ReturnValue; value; manual | +| 80 | Summary: ; TemplateClass1; false; templateFunction; (T,U); ; Argument[0]; ReturnValue; value; manual | +| 81 | Summary: ; TemplateClass2; true; function; (U,T); ; Argument[1]; ReturnValue; value; manual | +| 82 | Summary: Azure::Core::IO; BodyStream; true; Read; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 83 | Summary: Azure::Core::IO; BodyStream; true; ReadToCount; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 84 | Summary: Azure::Core::IO; BodyStream; true; ReadToEnd; ; ; Argument[-1]; ReturnValue.Element; taint; manual | +| 85 | Summary: Azure; Nullable; true; Value; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 86 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | edges -| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:91:7:91:17 | recv_buffer | provenance | Src:MaD:42 | -| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:93:29:93:39 | *recv_buffer | provenance | Src:MaD:42 Sink:MaD:2 | +| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:91:7:91:17 | recv_buffer | provenance | Src:MaD:45 | +| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:93:29:93:39 | recv_buffer | provenance | Src:MaD:45 Sink:MaD:2 | | asio_streams.cpp:97:37:97:44 | call to source | asio_streams.cpp:98:7:98:14 | send_str | provenance | TaintFunction | | asio_streams.cpp:97:37:97:44 | call to source | asio_streams.cpp:100:64:100:71 | *send_str | provenance | TaintFunction | | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | | | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:101:7:101:17 | send_buffer | provenance | | -| asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:103:29:103:39 | *send_buffer | provenance | Sink:MaD:2 | -| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:83 | -| azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:253:48:253:60 | *call to GetBodyStream | provenance | Src:MaD:39 | +| asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:103:29:103:39 | send_buffer | provenance | Sink:MaD:2 | +| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:86 | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:257:5:257:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:262:5:262:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:266:38:266:41 | *resp | provenance | | -| azure.cpp:257:5:257:8 | *resp | azure.cpp:257:16:257:21 | Read output argument | provenance | MaD:79 | +| azure.cpp:253:48:253:60 | call to GetBodyStream | azure.cpp:253:48:253:60 | *call to GetBodyStream | provenance | Src:MaD:42 | +| azure.cpp:257:5:257:8 | *resp | azure.cpp:257:16:257:21 | Read output argument | provenance | MaD:82 | | azure.cpp:257:16:257:21 | Read output argument | azure.cpp:258:10:258:16 | * ... | provenance | | -| azure.cpp:262:5:262:8 | *resp | azure.cpp:262:23:262:28 | ReadToCount output argument | provenance | MaD:80 | +| azure.cpp:262:5:262:8 | *resp | azure.cpp:262:23:262:28 | ReadToCount output argument | provenance | MaD:83 | | azure.cpp:262:23:262:28 | ReadToCount output argument | azure.cpp:263:10:263:16 | * ... | provenance | | -| azure.cpp:266:38:266:41 | *resp | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | provenance | MaD:81 | +| azure.cpp:266:38:266:41 | *resp | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | provenance | MaD:84 | | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | provenance | | | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | azure.cpp:267:10:267:12 | vec [element] | provenance | | | azure.cpp:267:10:267:12 | vec [element] | azure.cpp:267:10:267:12 | vec | provenance | | -| azure.cpp:273:62:273:64 | call to GetHeaders | azure.cpp:273:62:273:64 | call to GetHeaders | provenance | Src:MaD:38 | +| azure.cpp:273:52:273:61 | call to GetHeaders | azure.cpp:273:62:273:64 | call to GetHeaders | provenance | Src:MaD:41 | | azure.cpp:273:62:273:64 | call to GetHeaders | azure.cpp:274:14:274:29 | call to operator[] | provenance | TaintFunction | | azure.cpp:273:62:273:64 | call to GetHeaders | azure.cpp:274:14:274:29 | call to operator[] | provenance | TaintFunction | | azure.cpp:273:62:273:64 | call to GetHeaders | azure.cpp:274:14:274:29 | call to operator[] | provenance | TaintFunction | | azure.cpp:274:14:274:29 | call to operator[] | azure.cpp:274:10:274:29 | call to operator[] | provenance | | | azure.cpp:274:14:274:29 | call to operator[] | azure.cpp:274:14:274:29 | call to operator[] | provenance | | -| azure.cpp:277:45:277:47 | call to GetBody | azure.cpp:277:45:277:47 | call to GetBody | provenance | Src:MaD:37 | +| azure.cpp:277:38:277:44 | call to GetBody | azure.cpp:277:45:277:47 | call to GetBody | provenance | Src:MaD:40 | | azure.cpp:277:45:277:47 | call to GetBody | azure.cpp:278:10:278:13 | body | provenance | | | azure.cpp:277:45:277:47 | call to GetBody | azure.cpp:278:10:278:13 | body | provenance | | | azure.cpp:278:10:278:13 | body | azure.cpp:278:10:278:13 | body | provenance | | -| azure.cpp:281:68:281:84 | *call to ExtractBodyStream | azure.cpp:281:68:281:84 | *call to ExtractBodyStream | provenance | Src:MaD:36 | | azure.cpp:281:68:281:84 | *call to ExtractBodyStream | azure.cpp:282:21:282:23 | *call to get | provenance | | -| azure.cpp:282:21:282:23 | *call to get | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | MaD:81 | +| azure.cpp:281:68:281:84 | call to ExtractBodyStream | azure.cpp:281:68:281:84 | *call to ExtractBodyStream | provenance | Src:MaD:39 | +| azure.cpp:282:21:282:23 | *call to get | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | MaD:84 | | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | azure.cpp:282:10:282:38 | call to ReadToEnd | provenance | | | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | | -| azure.cpp:289:24:289:56 | call to GetHeader | azure.cpp:289:63:289:65 | call to Value | provenance | MaD:82 | +| azure.cpp:289:24:289:56 | call to GetHeader | azure.cpp:289:63:289:65 | call to Value | provenance | MaD:85 | +| azure.cpp:289:32:289:40 | Value output argument | azure.cpp:289:32:289:40 | call to GetHeader | provenance | Src:MaD:43 | | azure.cpp:289:32:289:40 | call to GetHeader | azure.cpp:289:24:289:56 | call to GetHeader | provenance | | -| azure.cpp:289:32:289:40 | call to GetHeader | azure.cpp:289:32:289:40 | call to GetHeader | provenance | Src:MaD:40 | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:289:63:289:65 | call to Value | provenance | | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:290:10:290:20 | headerValue | provenance | | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:290:10:290:20 | headerValue | provenance | | | azure.cpp:290:10:290:20 | headerValue | azure.cpp:290:10:290:20 | headerValue | provenance | | -| azure.cpp:293:58:293:67 | call to GetHeaders | azure.cpp:293:58:293:67 | call to GetHeaders | provenance | Src:MaD:41 | +| azure.cpp:293:58:293:67 | call to GetHeaders | azure.cpp:293:58:293:67 | call to GetHeaders | provenance | Src:MaD:44 | | azure.cpp:293:58:293:67 | call to GetHeaders | azure.cpp:294:38:294:53 | call to operator[] | provenance | TaintFunction | | azure.cpp:294:38:294:53 | call to operator[] | azure.cpp:295:10:295:20 | contentType | provenance | | | azure.cpp:294:38:294:53 | call to operator[] | azure.cpp:295:10:295:20 | contentType | provenance | | | azure.cpp:295:10:295:20 | contentType | azure.cpp:295:10:295:20 | contentType | provenance | | | test.cpp:7:47:7:52 | value2 | test.cpp:7:64:7:69 | value2 | provenance | | | test.cpp:7:64:7:69 | value2 | test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | provenance | | -| test.cpp:10:10:10:18 | call to ymlSource | test.cpp:10:10:10:18 | call to ymlSource | provenance | Src:MaD:35 | +| test.cpp:10:10:10:18 | call to ymlSource | test.cpp:10:10:10:18 | call to ymlSource | provenance | Src:MaD:38 | | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:14:10:14:10 | x | provenance | Sink:MaD:1 | | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:17:24:17:24 | x | provenance | | | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:21:27:21:27 | x | provenance | | @@ -140,99 +143,122 @@ edges | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:32:41:32:41 | x | provenance | | | test.cpp:17:10:17:22 | call to ymlStepManual | test.cpp:17:10:17:22 | call to ymlStepManual | provenance | | | test.cpp:17:10:17:22 | call to ymlStepManual | test.cpp:18:10:18:10 | y | provenance | Sink:MaD:1 | -| test.cpp:17:24:17:24 | x | test.cpp:17:10:17:22 | call to ymlStepManual | provenance | MaD:71 | +| test.cpp:17:24:17:24 | x | test.cpp:17:10:17:22 | call to ymlStepManual | provenance | MaD:74 | | test.cpp:21:10:21:25 | call to ymlStepGenerated | test.cpp:21:10:21:25 | call to ymlStepGenerated | provenance | | | test.cpp:21:10:21:25 | call to ymlStepGenerated | test.cpp:22:10:22:10 | z | provenance | Sink:MaD:1 | -| test.cpp:21:27:21:27 | x | test.cpp:21:10:21:25 | call to ymlStepGenerated | provenance | MaD:70 | +| test.cpp:21:27:21:27 | x | test.cpp:21:10:21:25 | call to ymlStepGenerated | provenance | MaD:73 | | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | provenance | | | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | test.cpp:26:10:26:11 | y2 | provenance | Sink:MaD:1 | -| test.cpp:25:35:25:35 | x | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | provenance | MaD:72 | +| test.cpp:25:35:25:35 | x | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | provenance | MaD:75 | | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | provenance | | | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | test.cpp:33:10:33:11 | z2 | provenance | Sink:MaD:1 | | test.cpp:32:41:32:41 | x | test.cpp:7:47:7:52 | value2 | provenance | | | test.cpp:32:41:32:41 | x | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | provenance | | | test.cpp:46:30:46:32 | *arg [x] | test.cpp:47:12:47:19 | *arg [x] | provenance | | | test.cpp:47:12:47:19 | *arg [x] | test.cpp:48:13:48:13 | *s [x] | provenance | | -| test.cpp:48:13:48:13 | *s [x] | test.cpp:48:16:48:16 | x | provenance | Sink:MaD:1 | +| test.cpp:48:13:48:13 | *s [x] | test.cpp:48:16:48:16 | x | provenance | | +| test.cpp:48:16:48:16 | x | test.cpp:48:16:48:16 | x | provenance | Sink:MaD:1 | | test.cpp:56:2:56:2 | *s [post update] [x] | test.cpp:59:55:59:64 | *& ... [x] | provenance | | | test.cpp:56:2:56:18 | ... = ... | test.cpp:56:2:56:2 | *s [post update] [x] | provenance | | -| test.cpp:56:8:56:16 | call to ymlSource | test.cpp:56:2:56:18 | ... = ... | provenance | Src:MaD:35 | -| test.cpp:59:55:59:64 | *& ... [x] | test.cpp:46:30:46:32 | *arg [x] | provenance | MaD:67 | +| test.cpp:56:8:56:16 | call to ymlSource | test.cpp:56:2:56:18 | ... = ... | provenance | Src:MaD:38 | +| test.cpp:59:55:59:64 | *& ... [x] | test.cpp:46:30:46:32 | *arg [x] | provenance | MaD:70 | | test.cpp:68:22:68:22 | y | test.cpp:69:11:69:11 | y | provenance | Sink:MaD:1 | | test.cpp:74:22:74:22 | y | test.cpp:75:11:75:11 | y | provenance | Sink:MaD:1 | | test.cpp:82:22:82:22 | y | test.cpp:83:11:83:11 | y | provenance | Sink:MaD:1 | | test.cpp:88:22:88:22 | y | test.cpp:89:11:89:11 | y | provenance | Sink:MaD:1 | -| test.cpp:94:10:94:18 | call to ymlSource | test.cpp:94:10:94:18 | call to ymlSource | provenance | Src:MaD:35 | +| test.cpp:94:10:94:18 | call to ymlSource | test.cpp:94:10:94:18 | call to ymlSource | provenance | Src:MaD:38 | | test.cpp:94:10:94:18 | call to ymlSource | test.cpp:97:26:97:26 | x | provenance | | | test.cpp:94:10:94:18 | call to ymlSource | test.cpp:101:26:101:26 | x | provenance | | | test.cpp:94:10:94:18 | call to ymlSource | test.cpp:103:63:103:63 | x | provenance | | | test.cpp:94:10:94:18 | call to ymlSource | test.cpp:104:62:104:62 | x | provenance | | -| test.cpp:97:26:97:26 | x | test.cpp:68:22:68:22 | y | provenance | MaD:65 | -| test.cpp:101:26:101:26 | x | test.cpp:74:22:74:22 | y | provenance | MaD:65 | -| test.cpp:103:63:103:63 | x | test.cpp:82:22:82:22 | y | provenance | MaD:65 | -| test.cpp:104:62:104:62 | x | test.cpp:88:22:88:22 | y | provenance | MaD:65 | -| test.cpp:114:10:114:18 | call to ymlSource | test.cpp:114:10:114:18 | call to ymlSource | provenance | Src:MaD:35 | +| test.cpp:97:26:97:26 | x | test.cpp:68:22:68:22 | y | provenance | MaD:68 | +| test.cpp:101:26:101:26 | x | test.cpp:74:22:74:22 | y | provenance | MaD:68 | +| test.cpp:103:63:103:63 | x | test.cpp:82:22:82:22 | y | provenance | MaD:68 | +| test.cpp:104:62:104:62 | x | test.cpp:88:22:88:22 | y | provenance | MaD:68 | +| test.cpp:114:10:114:18 | call to ymlSource | test.cpp:114:10:114:18 | call to ymlSource | provenance | Src:MaD:38 | | test.cpp:114:10:114:18 | call to ymlSource | test.cpp:118:44:118:44 | *x | provenance | | | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | provenance | | | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | test.cpp:119:10:119:11 | y2 | provenance | Sink:MaD:1 | -| test.cpp:118:44:118:44 | *x | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | provenance | MaD:66 | -| test.cpp:133:10:133:18 | call to ymlSource | test.cpp:133:10:133:18 | call to ymlSource | provenance | Src:MaD:35 | +| test.cpp:118:44:118:44 | *x | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | provenance | MaD:69 | +| test.cpp:133:10:133:18 | call to ymlSource | test.cpp:133:10:133:18 | call to ymlSource | provenance | Src:MaD:38 | | test.cpp:133:10:133:18 | call to ymlSource | test.cpp:134:45:134:45 | x | provenance | | | test.cpp:134:13:134:43 | call to templateFunction | test.cpp:134:13:134:43 | call to templateFunction | provenance | | | test.cpp:134:13:134:43 | call to templateFunction | test.cpp:135:10:135:10 | y | provenance | Sink:MaD:1 | -| test.cpp:134:45:134:45 | x | test.cpp:134:13:134:43 | call to templateFunction | provenance | MaD:77 | -| test.cpp:146:10:146:18 | call to ymlSource | test.cpp:146:10:146:18 | call to ymlSource | provenance | Src:MaD:35 | +| test.cpp:134:45:134:45 | x | test.cpp:134:13:134:43 | call to templateFunction | provenance | MaD:80 | +| test.cpp:146:10:146:18 | call to ymlSource | test.cpp:146:10:146:18 | call to ymlSource | provenance | Src:MaD:38 | | test.cpp:146:10:146:18 | call to ymlSource | test.cpp:148:26:148:26 | x | provenance | | | test.cpp:148:10:148:27 | call to function | test.cpp:148:10:148:27 | call to function | provenance | | | test.cpp:148:10:148:27 | call to function | test.cpp:149:10:149:10 | z | provenance | Sink:MaD:1 | -| test.cpp:148:26:148:26 | x | test.cpp:148:10:148:27 | call to function | provenance | MaD:78 | -| test.cpp:155:10:155:18 | call to ymlSource | test.cpp:155:10:155:18 | call to ymlSource | provenance | Src:MaD:35 | +| test.cpp:148:26:148:26 | x | test.cpp:148:10:148:27 | call to function | provenance | MaD:81 | +| test.cpp:155:10:155:18 | call to ymlSource | test.cpp:155:10:155:18 | call to ymlSource | provenance | Src:MaD:38 | | test.cpp:155:10:155:18 | call to ymlSource | test.cpp:157:26:157:26 | x | provenance | | | test.cpp:157:13:157:20 | call to function | test.cpp:157:13:157:20 | call to function | provenance | | | test.cpp:157:13:157:20 | call to function | test.cpp:158:10:158:10 | z | provenance | Sink:MaD:1 | -| test.cpp:157:26:157:26 | x | test.cpp:157:13:157:20 | call to function | provenance | MaD:78 | +| test.cpp:157:26:157:26 | x | test.cpp:157:13:157:20 | call to function | provenance | MaD:81 | | test.cpp:164:34:164:34 | x | test.cpp:165:69:165:69 | x | provenance | | | test.cpp:165:12:165:64 | call to templateFunction2 | test.cpp:164:7:164:7 | *templateFunction3 | provenance | | | test.cpp:165:12:165:64 | call to templateFunction2 | test.cpp:165:12:165:64 | call to templateFunction2 | provenance | | -| test.cpp:165:69:165:69 | x | test.cpp:165:12:165:64 | call to templateFunction2 | provenance | MaD:76 | -| test.cpp:170:10:170:18 | call to ymlSource | test.cpp:170:10:170:18 | call to ymlSource | provenance | Src:MaD:35 | +| test.cpp:165:69:165:69 | x | test.cpp:165:12:165:64 | call to templateFunction2 | provenance | MaD:79 | +| test.cpp:170:10:170:18 | call to ymlSource | test.cpp:170:10:170:18 | call to ymlSource | provenance | Src:MaD:38 | | test.cpp:170:10:170:18 | call to ymlSource | test.cpp:172:51:172:51 | x | provenance | | | test.cpp:172:13:172:44 | call to templateFunction3 | test.cpp:172:13:172:44 | call to templateFunction3 | provenance | | | test.cpp:172:13:172:44 | call to templateFunction3 | test.cpp:173:10:173:10 | y | provenance | Sink:MaD:1 | | test.cpp:172:51:172:51 | x | test.cpp:164:34:164:34 | x | provenance | | -| test.cpp:172:51:172:51 | x | test.cpp:172:13:172:44 | call to templateFunction3 | provenance | MaD:76 | +| test.cpp:172:51:172:51 | x | test.cpp:172:13:172:44 | call to templateFunction3 | provenance | MaD:79 | | test.cpp:186:2:186:2 | *s [post update] [myField] | test.cpp:187:33:187:34 | *& ... [myField] | provenance | | | test.cpp:186:2:186:24 | ... = ... | test.cpp:186:2:186:2 | *s [post update] [myField] | provenance | | -| test.cpp:186:14:186:22 | call to ymlSource | test.cpp:186:2:186:24 | ... = ... | provenance | Src:MaD:35 | +| test.cpp:186:14:186:22 | call to ymlSource | test.cpp:186:2:186:24 | ... = ... | provenance | Src:MaD:38 | | test.cpp:187:10:187:31 | call to read_field_from_struct | test.cpp:187:10:187:31 | call to read_field_from_struct | provenance | | | test.cpp:187:10:187:31 | call to read_field_from_struct | test.cpp:188:10:188:10 | x | provenance | Sink:MaD:1 | -| test.cpp:187:33:187:34 | *& ... [myField] | test.cpp:187:10:187:31 | call to read_field_from_struct | provenance | MaD:68 | +| test.cpp:187:33:187:34 | *& ... [myField] | test.cpp:187:10:187:31 | call to read_field_from_struct | provenance | MaD:71 | | test.cpp:199:2:199:2 | *s [post update] [myField] | test.cpp:200:35:200:36 | *& ... [myField] | provenance | | | test.cpp:199:2:199:24 | ... = ... | test.cpp:199:2:199:2 | *s [post update] [myField] | provenance | | -| test.cpp:199:14:199:22 | call to ymlSource | test.cpp:199:2:199:24 | ... = ... | provenance | Src:MaD:35 | +| test.cpp:199:14:199:22 | call to ymlSource | test.cpp:199:2:199:24 | ... = ... | provenance | Src:MaD:38 | | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | provenance | | | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | test.cpp:201:10:201:10 | x | provenance | Sink:MaD:1 | -| test.cpp:200:35:200:36 | *& ... [myField] | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | provenance | MaD:69 | +| test.cpp:200:35:200:36 | *& ... [myField] | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | provenance | MaD:72 | | test.cpp:216:3:216:4 | get_ptr output argument [value] | test.cpp:217:11:217:12 | *rf [value] | provenance | | -| test.cpp:216:3:216:28 | ... = ... | test.cpp:216:3:216:4 | get_ptr output argument [value] | provenance | MaD:75 | -| test.cpp:216:18:216:26 | call to ymlSource | test.cpp:216:3:216:28 | ... = ... | provenance | Src:MaD:35 | +| test.cpp:216:3:216:28 | ... = ... | test.cpp:216:3:216:4 | get_ptr output argument [value] | provenance | MaD:78 | +| test.cpp:216:18:216:26 | call to ymlSource | test.cpp:216:3:216:28 | ... = ... | provenance | Src:MaD:38 | | test.cpp:217:11:217:12 | *rf [value] | test.cpp:217:14:217:18 | value | provenance | | | test.cpp:217:14:217:18 | value | test.cpp:217:14:217:18 | value | provenance | | | test.cpp:217:14:217:18 | value | test.cpp:218:11:218:11 | x | provenance | Sink:MaD:1 | | test.cpp:222:3:222:3 | operator[] output argument | test.cpp:223:12:223:12 | *s | provenance | | -| test.cpp:222:3:222:20 | ... = ... | test.cpp:222:3:222:3 | operator[] output argument | provenance | MaD:74 | -| test.cpp:222:10:222:20 | call to ymlSource | test.cpp:222:3:222:20 | ... = ... | provenance | Src:MaD:35 | -| test.cpp:223:12:223:12 | *s | test.cpp:223:13:223:15 | call to operator[] | provenance | MaD:73 | +| test.cpp:222:3:222:20 | ... = ... | test.cpp:222:3:222:3 | operator[] output argument | provenance | MaD:77 | +| test.cpp:222:10:222:18 | call to ymlSource | test.cpp:222:3:222:20 | ... = ... | provenance | Src:MaD:38 | +| test.cpp:223:12:223:12 | *s | test.cpp:223:13:223:15 | call to operator[] | provenance | MaD:76 | | test.cpp:223:13:223:15 | call to operator[] | test.cpp:223:13:223:15 | call to operator[] | provenance | | | test.cpp:223:13:223:15 | call to operator[] | test.cpp:224:11:224:11 | c | provenance | Sink:MaD:1 | -| windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:22:15:22:29 | *call to GetCommandLineA | provenance | Src:MaD:3 | +| test.cpp:243:10:243:10 | *s [value] | test.cpp:243:13:243:17 | value | provenance | | +| test.cpp:243:13:243:17 | value | test.cpp:243:13:243:17 | value | provenance | Sink:MaD:1 | +| test.cpp:247:26:247:39 | call to ymlFieldSource | test.cpp:247:26:247:39 | call to ymlFieldSource [value] | provenance | Src:MaD:37 | +| test.cpp:247:26:247:39 | call to ymlFieldSource [value] | test.cpp:248:10:248:16 | *wrapper [value] | provenance | | +| test.cpp:248:10:248:16 | *wrapper [value] | test.cpp:248:18:248:22 | value | provenance | | +| test.cpp:248:18:248:22 | value | test.cpp:248:18:248:22 | value | provenance | Sink:MaD:1 | +| test.cpp:250:32:250:32 | source_from_callback_template output argument | test.cpp:250:32:250:32 | source_from_callback_template output argument [value] | provenance | Src:MaD:36 | +| test.cpp:250:32:250:32 | source_from_callback_template output argument [value] | test.cpp:243:10:243:10 | *s [value] | provenance | | +| test.cpp:251:27:251:27 | source_from_callback_ptr output argument | test.cpp:251:27:251:27 | source_from_callback_ptr output argument [value] | provenance | Src:MaD:35 | +| test.cpp:251:27:251:27 | source_from_callback_ptr output argument [value] | test.cpp:243:10:243:10 | *s [value] | provenance | | +| test.cpp:253:32:255:2 | source_from_callback_template output argument | test.cpp:253:32:255:2 | source_from_callback_template output argument [value] | provenance | Src:MaD:36 | +| test.cpp:253:32:255:2 | source_from_callback_template output argument [value] | test.cpp:254:11:254:11 | *s [value] | provenance | | +| test.cpp:254:11:254:11 | *s [value] | test.cpp:254:14:254:18 | value | provenance | | +| test.cpp:254:14:254:18 | value | test.cpp:254:14:254:18 | value | provenance | Sink:MaD:1 | +| test.cpp:257:27:257:27 | source_from_callback_ptr output argument | test.cpp:257:27:257:27 | source_from_callback_ptr output argument [value] | provenance | Src:MaD:35 | +| test.cpp:257:27:257:27 | source_from_callback_ptr output argument [value] | test.cpp:258:11:258:11 | *s [value] | provenance | | +| test.cpp:258:11:258:11 | *s [value] | test.cpp:258:14:258:18 | value | provenance | | +| test.cpp:258:14:258:18 | value | test.cpp:258:14:258:18 | value | provenance | Sink:MaD:1 | +| test.cpp:263:12:263:12 | *s [value] | test.cpp:263:15:263:19 | value | provenance | | +| test.cpp:263:15:263:19 | value | test.cpp:263:15:263:19 | value | provenance | Sink:MaD:1 | +| test.cpp:267:32:267:34 | source_from_callback_template output argument | test.cpp:267:32:267:34 | source_from_callback_template output argument [value] | provenance | Src:MaD:36 | +| test.cpp:267:32:267:34 | source_from_callback_template output argument [value] | test.cpp:263:12:263:12 | *s [value] | provenance | | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:24:8:24:11 | * ... | provenance | | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:27:36:27:38 | *cmd | provenance | | +| windows.cpp:22:15:22:29 | call to GetCommandLineA | windows.cpp:22:15:22:29 | *call to GetCommandLineA | provenance | Src:MaD:3 | | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | provenance | | | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | windows.cpp:30:8:30:15 | * ... | provenance | | -| windows.cpp:27:36:27:38 | *cmd | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | provenance | MaD:45 | -| windows.cpp:34:17:34:38 | *call to GetEnvironmentStringsA | windows.cpp:34:17:34:38 | *call to GetEnvironmentStringsA | provenance | Src:MaD:4 | +| windows.cpp:27:36:27:38 | *cmd | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | provenance | MaD:48 | | windows.cpp:34:17:34:38 | *call to GetEnvironmentStringsA | windows.cpp:36:10:36:13 | * ... | provenance | | +| windows.cpp:34:17:34:38 | call to GetEnvironmentStringsA | windows.cpp:34:17:34:38 | *call to GetEnvironmentStringsA | provenance | Src:MaD:4 | | windows.cpp:39:36:39:38 | GetEnvironmentVariableA output argument | windows.cpp:41:10:41:13 | * ... | provenance | Src:MaD:5 | | windows.cpp:147:16:147:27 | *lpOverlapped [*hEvent] | windows.cpp:149:42:149:53 | *lpOverlapped [*hEvent] | provenance | | | windows.cpp:149:18:149:62 | *hEvent | windows.cpp:149:18:149:62 | *hEvent | provenance | | @@ -250,32 +276,32 @@ edges | windows.cpp:189:21:189:26 | ReadFile output argument | windows.cpp:190:5:190:56 | *... = ... | provenance | Src:MaD:17 | | windows.cpp:190:5:190:14 | *overlapped [post update] [*hEvent] | windows.cpp:192:53:192:63 | *& ... [*hEvent] | provenance | | | windows.cpp:190:5:190:56 | *... = ... | windows.cpp:190:5:190:14 | *overlapped [post update] [*hEvent] | provenance | | -| windows.cpp:192:53:192:63 | *& ... [*hEvent] | windows.cpp:147:16:147:27 | *lpOverlapped [*hEvent] | provenance | MaD:52 | +| windows.cpp:192:53:192:63 | *& ... [*hEvent] | windows.cpp:147:16:147:27 | *lpOverlapped [*hEvent] | provenance | MaD:55 | | windows.cpp:198:21:198:26 | ReadFile output argument | windows.cpp:199:5:199:57 | ... = ... | provenance | Src:MaD:17 | | windows.cpp:199:5:199:14 | *overlapped [post update] [hEvent] | windows.cpp:201:53:201:63 | *& ... [hEvent] | provenance | | | windows.cpp:199:5:199:57 | ... = ... | windows.cpp:199:5:199:14 | *overlapped [post update] [hEvent] | provenance | | -| windows.cpp:201:53:201:63 | *& ... [hEvent] | windows.cpp:157:16:157:27 | *lpOverlapped [hEvent] | provenance | MaD:52 | +| windows.cpp:201:53:201:63 | *& ... [hEvent] | windows.cpp:157:16:157:27 | *lpOverlapped [hEvent] | provenance | MaD:55 | | windows.cpp:209:84:209:89 | NtReadFile output argument | windows.cpp:211:10:211:16 | * ... | provenance | Src:MaD:16 | -| windows.cpp:286:23:286:35 | *call to MapViewOfFile | windows.cpp:286:23:286:35 | *call to MapViewOfFile | provenance | Src:MaD:12 | | windows.cpp:286:23:286:35 | *call to MapViewOfFile | windows.cpp:287:20:287:52 | *pMapView | provenance | | +| windows.cpp:286:23:286:35 | call to MapViewOfFile | windows.cpp:286:23:286:35 | *call to MapViewOfFile | provenance | Src:MaD:12 | | windows.cpp:287:20:287:52 | *pMapView | windows.cpp:289:10:289:16 | * ... | provenance | | -| windows.cpp:293:23:293:36 | *call to MapViewOfFile2 | windows.cpp:293:23:293:36 | *call to MapViewOfFile2 | provenance | Src:MaD:9 | | windows.cpp:293:23:293:36 | *call to MapViewOfFile2 | windows.cpp:294:20:294:52 | *pMapView | provenance | | +| windows.cpp:293:23:293:36 | call to MapViewOfFile2 | windows.cpp:293:23:293:36 | *call to MapViewOfFile2 | provenance | Src:MaD:9 | | windows.cpp:294:20:294:52 | *pMapView | windows.cpp:296:10:296:16 | * ... | provenance | | -| windows.cpp:302:23:302:36 | *call to MapViewOfFile3 | windows.cpp:302:23:302:36 | *call to MapViewOfFile3 | provenance | Src:MaD:10 | | windows.cpp:302:23:302:36 | *call to MapViewOfFile3 | windows.cpp:303:20:303:52 | *pMapView | provenance | | +| windows.cpp:302:23:302:36 | call to MapViewOfFile3 | windows.cpp:302:23:302:36 | *call to MapViewOfFile3 | provenance | Src:MaD:10 | | windows.cpp:303:20:303:52 | *pMapView | windows.cpp:305:10:305:16 | * ... | provenance | | -| windows.cpp:311:23:311:43 | *call to MapViewOfFile3FromApp | windows.cpp:311:23:311:43 | *call to MapViewOfFile3FromApp | provenance | Src:MaD:11 | | windows.cpp:311:23:311:43 | *call to MapViewOfFile3FromApp | windows.cpp:312:20:312:52 | *pMapView | provenance | | +| windows.cpp:311:23:311:43 | call to MapViewOfFile3FromApp | windows.cpp:311:23:311:43 | *call to MapViewOfFile3FromApp | provenance | Src:MaD:11 | | windows.cpp:312:20:312:52 | *pMapView | windows.cpp:314:10:314:16 | * ... | provenance | | -| windows.cpp:318:23:318:37 | *call to MapViewOfFileEx | windows.cpp:318:23:318:37 | *call to MapViewOfFileEx | provenance | Src:MaD:13 | | windows.cpp:318:23:318:37 | *call to MapViewOfFileEx | windows.cpp:319:20:319:52 | *pMapView | provenance | | +| windows.cpp:318:23:318:37 | call to MapViewOfFileEx | windows.cpp:318:23:318:37 | *call to MapViewOfFileEx | provenance | Src:MaD:13 | | windows.cpp:319:20:319:52 | *pMapView | windows.cpp:321:10:321:16 | * ... | provenance | | -| windows.cpp:325:23:325:42 | *call to MapViewOfFileFromApp | windows.cpp:325:23:325:42 | *call to MapViewOfFileFromApp | provenance | Src:MaD:14 | | windows.cpp:325:23:325:42 | *call to MapViewOfFileFromApp | windows.cpp:326:20:326:52 | *pMapView | provenance | | +| windows.cpp:325:23:325:42 | call to MapViewOfFileFromApp | windows.cpp:325:23:325:42 | *call to MapViewOfFileFromApp | provenance | Src:MaD:14 | | windows.cpp:326:20:326:52 | *pMapView | windows.cpp:328:10:328:16 | * ... | provenance | | -| windows.cpp:332:23:332:40 | *call to MapViewOfFileNuma2 | windows.cpp:332:23:332:40 | *call to MapViewOfFileNuma2 | provenance | Src:MaD:15 | | windows.cpp:332:23:332:40 | *call to MapViewOfFileNuma2 | windows.cpp:333:20:333:52 | *pMapView | provenance | | +| windows.cpp:332:23:332:40 | call to MapViewOfFileNuma2 | windows.cpp:332:23:332:40 | *call to MapViewOfFileNuma2 | provenance | Src:MaD:15 | | windows.cpp:333:20:333:52 | *pMapView | windows.cpp:335:10:335:16 | * ... | provenance | | | windows.cpp:403:26:403:36 | *lpParameter [x] | windows.cpp:405:10:405:25 | *lpParameter [x] | provenance | | | windows.cpp:405:10:405:25 | *lpParameter [x] | windows.cpp:406:8:406:8 | *s [x] | provenance | | @@ -291,9 +317,9 @@ edges | windows.cpp:431:3:431:3 | *s [post update] [x] | windows.cpp:464:7:464:8 | *& ... [x] | provenance | | | windows.cpp:431:3:431:16 | ... = ... | windows.cpp:431:3:431:3 | *s [post update] [x] | provenance | | | windows.cpp:431:9:431:14 | call to source | windows.cpp:431:3:431:16 | ... = ... | provenance | | -| windows.cpp:439:7:439:8 | *& ... [x] | windows.cpp:403:26:403:36 | *lpParameter [x] | provenance | MaD:48 | -| windows.cpp:451:7:451:8 | *& ... [x] | windows.cpp:410:26:410:36 | *lpParameter [x] | provenance | MaD:46 | -| windows.cpp:464:7:464:8 | *& ... [x] | windows.cpp:417:26:417:36 | *lpParameter [x] | provenance | MaD:47 | +| windows.cpp:439:7:439:8 | *& ... [x] | windows.cpp:403:26:403:36 | *lpParameter [x] | provenance | MaD:51 | +| windows.cpp:451:7:451:8 | *& ... [x] | windows.cpp:410:26:410:36 | *lpParameter [x] | provenance | MaD:49 | +| windows.cpp:464:7:464:8 | *& ... [x] | windows.cpp:417:26:417:36 | *lpParameter [x] | provenance | MaD:50 | | windows.cpp:533:11:533:16 | call to source | windows.cpp:533:11:533:16 | call to source | provenance | | | windows.cpp:533:11:533:16 | call to source | windows.cpp:537:40:537:41 | *& ... | provenance | | | windows.cpp:533:11:533:16 | call to source | windows.cpp:542:38:542:39 | *& ... | provenance | | @@ -302,30 +328,30 @@ edges | windows.cpp:533:11:533:16 | call to source | windows.cpp:568:32:568:33 | *& ... | provenance | | | windows.cpp:533:11:533:16 | call to source | windows.cpp:573:40:573:41 | *& ... | provenance | | | windows.cpp:537:27:537:37 | RtlCopyVolatileMemory output argument | windows.cpp:538:10:538:23 | access to array | provenance | | -| windows.cpp:537:40:537:41 | *& ... | windows.cpp:537:27:537:37 | RtlCopyVolatileMemory output argument | provenance | MaD:57 | +| windows.cpp:537:40:537:41 | *& ... | windows.cpp:537:27:537:37 | RtlCopyVolatileMemory output argument | provenance | MaD:60 | | windows.cpp:542:25:542:35 | RtlCopyDeviceMemory output argument | windows.cpp:543:10:543:23 | access to array | provenance | | -| windows.cpp:542:38:542:39 | *& ... | windows.cpp:542:25:542:35 | RtlCopyDeviceMemory output argument | provenance | MaD:53 | +| windows.cpp:542:38:542:39 | *& ... | windows.cpp:542:25:542:35 | RtlCopyDeviceMemory output argument | provenance | MaD:56 | | windows.cpp:547:19:547:29 | RtlCopyMemory output argument | windows.cpp:548:10:548:23 | access to array | provenance | | -| windows.cpp:547:32:547:33 | *& ... | windows.cpp:547:19:547:29 | RtlCopyMemory output argument | provenance | MaD:54 | +| windows.cpp:547:32:547:33 | *& ... | windows.cpp:547:19:547:29 | RtlCopyMemory output argument | provenance | MaD:57 | | windows.cpp:552:30:552:40 | RtlCopyMemoryNonTemporal output argument | windows.cpp:553:10:553:23 | access to array | provenance | | -| windows.cpp:552:43:552:44 | *& ... | windows.cpp:552:30:552:40 | RtlCopyMemoryNonTemporal output argument | provenance | MaD:55 | +| windows.cpp:552:43:552:44 | *& ... | windows.cpp:552:30:552:40 | RtlCopyMemoryNonTemporal output argument | provenance | MaD:58 | | windows.cpp:559:5:559:24 | ... = ... | windows.cpp:561:39:561:44 | *buffer | provenance | | | windows.cpp:559:17:559:24 | call to source | windows.cpp:559:5:559:24 | ... = ... | provenance | | | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | windows.cpp:562:10:562:19 | *src_string [*Buffer] | provenance | | | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | windows.cpp:563:40:563:50 | *& ... [*Buffer] | provenance | | -| windows.cpp:561:39:561:44 | *buffer | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | provenance | MaD:58 | +| windows.cpp:561:39:561:44 | *buffer | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | provenance | MaD:61 | | windows.cpp:562:10:562:19 | *src_string [*Buffer] | windows.cpp:562:10:562:29 | access to array | provenance | | | windows.cpp:562:10:562:19 | *src_string [*Buffer] | windows.cpp:562:21:562:26 | *Buffer | provenance | | | windows.cpp:562:21:562:26 | *Buffer | windows.cpp:562:10:562:29 | access to array | provenance | | | windows.cpp:563:26:563:37 | RtlCopyUnicodeString output argument [*Buffer] | windows.cpp:564:10:564:20 | *dest_string [*Buffer] | provenance | | -| windows.cpp:563:40:563:50 | *& ... [*Buffer] | windows.cpp:563:26:563:37 | RtlCopyUnicodeString output argument [*Buffer] | provenance | MaD:56 | +| windows.cpp:563:40:563:50 | *& ... [*Buffer] | windows.cpp:563:26:563:37 | RtlCopyUnicodeString output argument [*Buffer] | provenance | MaD:59 | | windows.cpp:564:10:564:20 | *dest_string [*Buffer] | windows.cpp:564:10:564:30 | access to array | provenance | | | windows.cpp:564:10:564:20 | *dest_string [*Buffer] | windows.cpp:564:22:564:27 | *Buffer | provenance | | | windows.cpp:564:22:564:27 | *Buffer | windows.cpp:564:10:564:30 | access to array | provenance | | | windows.cpp:568:19:568:29 | RtlMoveMemory output argument | windows.cpp:569:10:569:23 | access to array | provenance | | -| windows.cpp:568:32:568:33 | *& ... | windows.cpp:568:19:568:29 | RtlMoveMemory output argument | provenance | MaD:59 | +| windows.cpp:568:32:568:33 | *& ... | windows.cpp:568:19:568:29 | RtlMoveMemory output argument | provenance | MaD:62 | | windows.cpp:573:27:573:37 | RtlMoveVolatileMemory output argument | windows.cpp:574:10:574:23 | access to array | provenance | | -| windows.cpp:573:40:573:41 | *& ... | windows.cpp:573:27:573:37 | RtlMoveVolatileMemory output argument | provenance | MaD:60 | +| windows.cpp:573:40:573:41 | *& ... | windows.cpp:573:27:573:37 | RtlMoveVolatileMemory output argument | provenance | MaD:63 | | windows.cpp:645:45:645:50 | WinHttpReadData output argument | windows.cpp:647:10:647:16 | * ... | provenance | Src:MaD:33 | | windows.cpp:652:48:652:53 | WinHttpReadDataEx output argument | windows.cpp:654:10:654:16 | * ... | provenance | Src:MaD:34 | | windows.cpp:659:47:659:52 | WinHttpQueryHeaders output argument | windows.cpp:661:10:661:16 | * ... | provenance | Src:MaD:29 | @@ -334,7 +360,7 @@ edges | windows.cpp:669:105:669:112 | WinHttpQueryHeadersEx output argument | windows.cpp:675:10:675:27 | * ... | provenance | Src:MaD:30 | | windows.cpp:728:5:728:28 | ... = ... | windows.cpp:729:35:729:35 | *x | provenance | | | windows.cpp:728:12:728:28 | call to source | windows.cpp:728:5:728:28 | ... = ... | provenance | | -| windows.cpp:729:35:729:35 | *x | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | provenance | MaD:64 | +| windows.cpp:729:35:729:35 | *x | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | provenance | MaD:67 | | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | windows.cpp:731:10:731:36 | * ... | provenance | | | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | windows.cpp:733:10:733:35 | * ... | provenance | | | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | windows.cpp:735:10:735:37 | * ... | provenance | | @@ -369,49 +395,49 @@ edges | windows.cpp:1087:71:1087:74 | RegEnumValueW output argument | windows.cpp:1089:10:1089:14 | * ... | provenance | Src:MaD:20 | | windows.cpp:1122:5:1122:27 | ... = ... | windows.cpp:1124:19:1124:21 | *str | provenance | | | windows.cpp:1122:14:1122:27 | call to source | windows.cpp:1122:5:1122:27 | ... = ... | provenance | | -| windows.cpp:1124:19:1124:21 | *str | windows.cpp:1124:24:1124:27 | IIDFromString output argument | provenance | MaD:50 | +| windows.cpp:1124:19:1124:21 | *str | windows.cpp:1124:24:1124:27 | IIDFromString output argument | provenance | MaD:53 | | windows.cpp:1124:24:1124:27 | IIDFromString output argument | windows.cpp:1125:10:1125:12 | iid | provenance | | | windows.cpp:1128:15:1128:20 | call to source | windows.cpp:1128:15:1128:20 | call to source | provenance | | | windows.cpp:1128:15:1128:20 | call to source | windows.cpp:1130:19:1130:21 | *iid | provenance | | -| windows.cpp:1130:19:1130:21 | *iid | windows.cpp:1130:24:1130:27 | StringFromIID output argument | provenance | MaD:63 | +| windows.cpp:1130:19:1130:21 | *iid | windows.cpp:1130:24:1130:27 | StringFromIID output argument | provenance | MaD:66 | | windows.cpp:1130:24:1130:27 | StringFromIID output argument | windows.cpp:1132:10:1132:13 | * ... | provenance | | | windows.cpp:1135:19:1135:24 | call to source | windows.cpp:1135:19:1135:24 | call to source | provenance | | | windows.cpp:1135:19:1135:24 | call to source | windows.cpp:1137:21:1137:25 | *clsid | provenance | | -| windows.cpp:1137:21:1137:25 | *clsid | windows.cpp:1137:28:1137:31 | ProgIDFromCLSID output argument | provenance | MaD:51 | +| windows.cpp:1137:21:1137:25 | *clsid | windows.cpp:1137:28:1137:31 | ProgIDFromCLSID output argument | provenance | MaD:54 | | windows.cpp:1137:28:1137:31 | ProgIDFromCLSID output argument | windows.cpp:1139:10:1139:13 | * ... | provenance | | | windows.cpp:1143:5:1143:30 | ... = ... | windows.cpp:1145:21:1145:26 | *progID | provenance | | | windows.cpp:1143:17:1143:30 | call to source | windows.cpp:1143:5:1143:30 | ... = ... | provenance | | -| windows.cpp:1145:21:1145:26 | *progID | windows.cpp:1145:29:1145:34 | CLSIDFromProgID output argument | provenance | MaD:43 | +| windows.cpp:1145:21:1145:26 | *progID | windows.cpp:1145:29:1145:34 | CLSIDFromProgID output argument | provenance | MaD:46 | | windows.cpp:1145:29:1145:34 | CLSIDFromProgID output argument | windows.cpp:1146:10:1146:14 | clsid | provenance | | | windows.cpp:1150:5:1150:27 | ... = ... | windows.cpp:1152:21:1152:23 | *str | provenance | | | windows.cpp:1150:14:1150:27 | call to source | windows.cpp:1150:5:1150:27 | ... = ... | provenance | | -| windows.cpp:1152:21:1152:23 | *str | windows.cpp:1152:26:1152:31 | CLSIDFromString output argument | provenance | MaD:44 | +| windows.cpp:1152:21:1152:23 | *str | windows.cpp:1152:26:1152:31 | CLSIDFromString output argument | provenance | MaD:47 | | windows.cpp:1152:26:1152:31 | CLSIDFromString output argument | windows.cpp:1153:10:1153:14 | clsid | provenance | | | windows.cpp:1156:19:1156:24 | call to source | windows.cpp:1156:19:1156:24 | call to source | provenance | | | windows.cpp:1156:19:1156:24 | call to source | windows.cpp:1158:21:1158:25 | *clsid | provenance | | -| windows.cpp:1158:21:1158:25 | *clsid | windows.cpp:1158:28:1158:31 | StringFromCLSID output argument | provenance | MaD:61 | +| windows.cpp:1158:21:1158:25 | *clsid | windows.cpp:1158:28:1158:31 | StringFromCLSID output argument | provenance | MaD:64 | | windows.cpp:1158:28:1158:31 | StringFromCLSID output argument | windows.cpp:1160:10:1160:13 | * ... | provenance | | | windows.cpp:1164:5:1164:27 | ... = ... | windows.cpp:1166:20:1166:22 | *str | provenance | | | windows.cpp:1164:14:1164:27 | call to source | windows.cpp:1164:5:1164:27 | ... = ... | provenance | | -| windows.cpp:1166:20:1166:22 | *str | windows.cpp:1166:25:1166:29 | GUIDFromString output argument | provenance | MaD:49 | +| windows.cpp:1166:20:1166:22 | *str | windows.cpp:1166:25:1166:29 | GUIDFromString output argument | provenance | MaD:52 | | windows.cpp:1166:25:1166:29 | GUIDFromString output argument | windows.cpp:1167:10:1167:13 | guid | provenance | | | windows.cpp:1170:17:1170:22 | call to source | windows.cpp:1170:17:1170:22 | call to source | provenance | | | windows.cpp:1170:17:1170:22 | call to source | windows.cpp:1172:21:1172:24 | *guid | provenance | | -| windows.cpp:1172:21:1172:24 | *guid | windows.cpp:1172:27:1172:29 | StringFromGUID2 output argument | provenance | MaD:62 | +| windows.cpp:1172:21:1172:24 | *guid | windows.cpp:1172:27:1172:29 | StringFromGUID2 output argument | provenance | MaD:65 | | windows.cpp:1172:27:1172:29 | StringFromGUID2 output argument | windows.cpp:1174:10:1174:13 | * ... | provenance | | nodes | asio_streams.cpp:87:34:87:44 | read_until output argument | semmle.label | read_until output argument | | asio_streams.cpp:91:7:91:17 | recv_buffer | semmle.label | recv_buffer | -| asio_streams.cpp:93:29:93:39 | *recv_buffer | semmle.label | *recv_buffer | +| asio_streams.cpp:93:29:93:39 | recv_buffer | semmle.label | recv_buffer | | asio_streams.cpp:97:37:97:44 | call to source | semmle.label | call to source | | asio_streams.cpp:98:7:98:14 | send_str | semmle.label | send_str | | asio_streams.cpp:100:44:100:62 | call to buffer | semmle.label | call to buffer | | asio_streams.cpp:100:44:100:62 | call to buffer | semmle.label | call to buffer | | asio_streams.cpp:100:64:100:71 | *send_str | semmle.label | *send_str | | asio_streams.cpp:101:7:101:17 | send_buffer | semmle.label | send_buffer | -| asio_streams.cpp:103:29:103:39 | *send_buffer | semmle.label | *send_buffer | -| azure.cpp:253:48:253:60 | *call to GetBodyStream | semmle.label | *call to GetBodyStream | +| asio_streams.cpp:103:29:103:39 | send_buffer | semmle.label | send_buffer | | azure.cpp:253:48:253:60 | *call to GetBodyStream | semmle.label | *call to GetBodyStream | +| azure.cpp:253:48:253:60 | call to GetBodyStream | semmle.label | call to GetBodyStream | | azure.cpp:257:5:257:8 | *resp | semmle.label | *resp | | azure.cpp:257:16:257:21 | Read output argument | semmle.label | Read output argument | | azure.cpp:258:10:258:16 | * ... | semmle.label | * ... | @@ -423,25 +449,25 @@ nodes | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | semmle.label | call to ReadToEnd [element] | | azure.cpp:267:10:267:12 | vec | semmle.label | vec | | azure.cpp:267:10:267:12 | vec [element] | semmle.label | vec [element] | -| azure.cpp:273:62:273:64 | call to GetHeaders | semmle.label | call to GetHeaders | +| azure.cpp:273:52:273:61 | call to GetHeaders | semmle.label | call to GetHeaders | | azure.cpp:273:62:273:64 | call to GetHeaders | semmle.label | call to GetHeaders | | azure.cpp:274:10:274:29 | call to operator[] | semmle.label | call to operator[] | | azure.cpp:274:14:274:29 | call to operator[] | semmle.label | call to operator[] | | azure.cpp:274:14:274:29 | call to operator[] | semmle.label | call to operator[] | | azure.cpp:274:14:274:29 | call to operator[] | semmle.label | call to operator[] | -| azure.cpp:277:45:277:47 | call to GetBody | semmle.label | call to GetBody | +| azure.cpp:277:38:277:44 | call to GetBody | semmle.label | call to GetBody | | azure.cpp:277:45:277:47 | call to GetBody | semmle.label | call to GetBody | | azure.cpp:278:10:278:13 | body | semmle.label | body | | azure.cpp:278:10:278:13 | body | semmle.label | body | | azure.cpp:278:10:278:13 | body | semmle.label | body | | azure.cpp:281:68:281:84 | *call to ExtractBodyStream | semmle.label | *call to ExtractBodyStream | -| azure.cpp:281:68:281:84 | *call to ExtractBodyStream | semmle.label | *call to ExtractBodyStream | +| azure.cpp:281:68:281:84 | call to ExtractBodyStream | semmle.label | call to ExtractBodyStream | | azure.cpp:282:10:282:38 | call to ReadToEnd | semmle.label | call to ReadToEnd | | azure.cpp:282:21:282:23 | *call to get | semmle.label | *call to get | | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | semmle.label | call to ReadToEnd [element] | | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | semmle.label | call to ReadToEnd [element] | | azure.cpp:289:24:289:56 | call to GetHeader | semmle.label | call to GetHeader | -| azure.cpp:289:32:289:40 | call to GetHeader | semmle.label | call to GetHeader | +| azure.cpp:289:32:289:40 | Value output argument | semmle.label | Value output argument | | azure.cpp:289:32:289:40 | call to GetHeader | semmle.label | call to GetHeader | | azure.cpp:289:63:289:65 | call to Value | semmle.label | call to Value | | azure.cpp:289:63:289:65 | call to Value | semmle.label | call to Value | @@ -480,6 +506,7 @@ nodes | test.cpp:47:12:47:19 | *arg [x] | semmle.label | *arg [x] | | test.cpp:48:13:48:13 | *s [x] | semmle.label | *s [x] | | test.cpp:48:16:48:16 | x | semmle.label | x | +| test.cpp:48:16:48:16 | x | semmle.label | x | | test.cpp:56:2:56:2 | *s [post update] [x] | semmle.label | *s [post update] [x] | | test.cpp:56:2:56:18 | ... = ... | semmle.label | ... = ... | | test.cpp:56:8:56:16 | call to ymlSource | semmle.label | call to ymlSource | @@ -556,20 +583,47 @@ nodes | test.cpp:218:11:218:11 | x | semmle.label | x | | test.cpp:222:3:222:3 | operator[] output argument | semmle.label | operator[] output argument | | test.cpp:222:3:222:20 | ... = ... | semmle.label | ... = ... | -| test.cpp:222:10:222:20 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:222:10:222:18 | call to ymlSource | semmle.label | call to ymlSource | | test.cpp:223:12:223:12 | *s | semmle.label | *s | | test.cpp:223:13:223:15 | call to operator[] | semmle.label | call to operator[] | | test.cpp:223:13:223:15 | call to operator[] | semmle.label | call to operator[] | | test.cpp:224:11:224:11 | c | semmle.label | c | +| test.cpp:243:10:243:10 | *s [value] | semmle.label | *s [value] | +| test.cpp:243:13:243:17 | value | semmle.label | value | +| test.cpp:243:13:243:17 | value | semmle.label | value | +| test.cpp:247:26:247:39 | call to ymlFieldSource | semmle.label | call to ymlFieldSource | +| test.cpp:247:26:247:39 | call to ymlFieldSource [value] | semmle.label | call to ymlFieldSource [value] | +| test.cpp:248:10:248:16 | *wrapper [value] | semmle.label | *wrapper [value] | +| test.cpp:248:18:248:22 | value | semmle.label | value | +| test.cpp:248:18:248:22 | value | semmle.label | value | +| test.cpp:250:32:250:32 | source_from_callback_template output argument | semmle.label | source_from_callback_template output argument | +| test.cpp:250:32:250:32 | source_from_callback_template output argument [value] | semmle.label | source_from_callback_template output argument [value] | +| test.cpp:251:27:251:27 | source_from_callback_ptr output argument | semmle.label | source_from_callback_ptr output argument | +| test.cpp:251:27:251:27 | source_from_callback_ptr output argument [value] | semmle.label | source_from_callback_ptr output argument [value] | +| test.cpp:253:32:255:2 | source_from_callback_template output argument | semmle.label | source_from_callback_template output argument | +| test.cpp:253:32:255:2 | source_from_callback_template output argument [value] | semmle.label | source_from_callback_template output argument [value] | +| test.cpp:254:11:254:11 | *s [value] | semmle.label | *s [value] | +| test.cpp:254:14:254:18 | value | semmle.label | value | +| test.cpp:254:14:254:18 | value | semmle.label | value | +| test.cpp:257:27:257:27 | source_from_callback_ptr output argument | semmle.label | source_from_callback_ptr output argument | +| test.cpp:257:27:257:27 | source_from_callback_ptr output argument [value] | semmle.label | source_from_callback_ptr output argument [value] | +| test.cpp:258:11:258:11 | *s [value] | semmle.label | *s [value] | +| test.cpp:258:14:258:18 | value | semmle.label | value | +| test.cpp:258:14:258:18 | value | semmle.label | value | +| test.cpp:263:12:263:12 | *s [value] | semmle.label | *s [value] | +| test.cpp:263:15:263:19 | value | semmle.label | value | +| test.cpp:263:15:263:19 | value | semmle.label | value | +| test.cpp:267:32:267:34 | source_from_callback_template output argument | semmle.label | source_from_callback_template output argument | +| test.cpp:267:32:267:34 | source_from_callback_template output argument [value] | semmle.label | source_from_callback_template output argument [value] | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | semmle.label | *call to GetCommandLineA | -| windows.cpp:22:15:22:29 | *call to GetCommandLineA | semmle.label | *call to GetCommandLineA | +| windows.cpp:22:15:22:29 | call to GetCommandLineA | semmle.label | call to GetCommandLineA | | windows.cpp:24:8:24:11 | * ... | semmle.label | * ... | | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | semmle.label | **call to CommandLineToArgvA | | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | semmle.label | **call to CommandLineToArgvA | | windows.cpp:27:36:27:38 | *cmd | semmle.label | *cmd | | windows.cpp:30:8:30:15 | * ... | semmle.label | * ... | | windows.cpp:34:17:34:38 | *call to GetEnvironmentStringsA | semmle.label | *call to GetEnvironmentStringsA | -| windows.cpp:34:17:34:38 | *call to GetEnvironmentStringsA | semmle.label | *call to GetEnvironmentStringsA | +| windows.cpp:34:17:34:38 | call to GetEnvironmentStringsA | semmle.label | call to GetEnvironmentStringsA | | windows.cpp:36:10:36:13 | * ... | semmle.label | * ... | | windows.cpp:39:36:39:38 | GetEnvironmentVariableA output argument | semmle.label | GetEnvironmentVariableA output argument | | windows.cpp:41:10:41:13 | * ... | semmle.label | * ... | @@ -599,31 +653,31 @@ nodes | windows.cpp:209:84:209:89 | NtReadFile output argument | semmle.label | NtReadFile output argument | | windows.cpp:211:10:211:16 | * ... | semmle.label | * ... | | windows.cpp:286:23:286:35 | *call to MapViewOfFile | semmle.label | *call to MapViewOfFile | -| windows.cpp:286:23:286:35 | *call to MapViewOfFile | semmle.label | *call to MapViewOfFile | +| windows.cpp:286:23:286:35 | call to MapViewOfFile | semmle.label | call to MapViewOfFile | | windows.cpp:287:20:287:52 | *pMapView | semmle.label | *pMapView | | windows.cpp:289:10:289:16 | * ... | semmle.label | * ... | | windows.cpp:293:23:293:36 | *call to MapViewOfFile2 | semmle.label | *call to MapViewOfFile2 | -| windows.cpp:293:23:293:36 | *call to MapViewOfFile2 | semmle.label | *call to MapViewOfFile2 | +| windows.cpp:293:23:293:36 | call to MapViewOfFile2 | semmle.label | call to MapViewOfFile2 | | windows.cpp:294:20:294:52 | *pMapView | semmle.label | *pMapView | | windows.cpp:296:10:296:16 | * ... | semmle.label | * ... | | windows.cpp:302:23:302:36 | *call to MapViewOfFile3 | semmle.label | *call to MapViewOfFile3 | -| windows.cpp:302:23:302:36 | *call to MapViewOfFile3 | semmle.label | *call to MapViewOfFile3 | +| windows.cpp:302:23:302:36 | call to MapViewOfFile3 | semmle.label | call to MapViewOfFile3 | | windows.cpp:303:20:303:52 | *pMapView | semmle.label | *pMapView | | windows.cpp:305:10:305:16 | * ... | semmle.label | * ... | | windows.cpp:311:23:311:43 | *call to MapViewOfFile3FromApp | semmle.label | *call to MapViewOfFile3FromApp | -| windows.cpp:311:23:311:43 | *call to MapViewOfFile3FromApp | semmle.label | *call to MapViewOfFile3FromApp | +| windows.cpp:311:23:311:43 | call to MapViewOfFile3FromApp | semmle.label | call to MapViewOfFile3FromApp | | windows.cpp:312:20:312:52 | *pMapView | semmle.label | *pMapView | | windows.cpp:314:10:314:16 | * ... | semmle.label | * ... | | windows.cpp:318:23:318:37 | *call to MapViewOfFileEx | semmle.label | *call to MapViewOfFileEx | -| windows.cpp:318:23:318:37 | *call to MapViewOfFileEx | semmle.label | *call to MapViewOfFileEx | +| windows.cpp:318:23:318:37 | call to MapViewOfFileEx | semmle.label | call to MapViewOfFileEx | | windows.cpp:319:20:319:52 | *pMapView | semmle.label | *pMapView | | windows.cpp:321:10:321:16 | * ... | semmle.label | * ... | | windows.cpp:325:23:325:42 | *call to MapViewOfFileFromApp | semmle.label | *call to MapViewOfFileFromApp | -| windows.cpp:325:23:325:42 | *call to MapViewOfFileFromApp | semmle.label | *call to MapViewOfFileFromApp | +| windows.cpp:325:23:325:42 | call to MapViewOfFileFromApp | semmle.label | call to MapViewOfFileFromApp | | windows.cpp:326:20:326:52 | *pMapView | semmle.label | *pMapView | | windows.cpp:328:10:328:16 | * ... | semmle.label | * ... | | windows.cpp:332:23:332:40 | *call to MapViewOfFileNuma2 | semmle.label | *call to MapViewOfFileNuma2 | -| windows.cpp:332:23:332:40 | *call to MapViewOfFileNuma2 | semmle.label | *call to MapViewOfFileNuma2 | +| windows.cpp:332:23:332:40 | call to MapViewOfFileNuma2 | semmle.label | call to MapViewOfFileNuma2 | | windows.cpp:333:20:333:52 | *pMapView | semmle.label | *pMapView | | windows.cpp:335:10:335:16 | * ... | semmle.label | * ... | | windows.cpp:403:26:403:36 | *lpParameter [x] | semmle.label | *lpParameter [x] | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected index 858f12bdd69e..32f130cd165d 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected @@ -1,5 +1,5 @@ -| asio_streams.cpp:93:29:93:39 | *recv_buffer | remote-sink | -| asio_streams.cpp:103:29:103:39 | *send_buffer | remote-sink | +| asio_streams.cpp:93:29:93:39 | recv_buffer | remote-sink | +| asio_streams.cpp:103:29:103:39 | send_buffer | remote-sink | | test.cpp:12:10:12:10 | 0 | test-sink | | test.cpp:14:10:14:10 | x | test-sink | | test.cpp:18:10:18:10 | y | test-sink | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected index 3556bd9d51dd..9dfb62bdafde 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected @@ -1,9 +1,9 @@ | asio_streams.cpp:87:34:87:44 | read_until output argument | remote | -| azure.cpp:253:48:253:60 | *call to GetBodyStream | remote | -| azure.cpp:273:62:273:64 | call to GetHeaders | remote | -| azure.cpp:277:45:277:47 | call to GetBody | remote | -| azure.cpp:281:68:281:84 | *call to ExtractBodyStream | remote | -| azure.cpp:289:32:289:40 | call to GetHeader | remote | +| azure.cpp:253:48:253:60 | call to GetBodyStream | remote | +| azure.cpp:273:52:273:61 | call to GetHeaders | remote | +| azure.cpp:277:38:277:44 | call to GetBody | remote | +| azure.cpp:281:68:281:84 | call to ExtractBodyStream | remote | +| azure.cpp:289:32:289:40 | Value output argument | remote | | azure.cpp:293:58:293:67 | call to GetHeaders | remote | | test.cpp:10:10:10:18 | call to ymlSource | local | | test.cpp:56:8:56:16 | call to ymlSource | local | @@ -16,9 +16,9 @@ | test.cpp:186:14:186:22 | call to ymlSource | local | | test.cpp:199:14:199:22 | call to ymlSource | local | | test.cpp:216:18:216:26 | call to ymlSource | local | -| test.cpp:222:10:222:20 | call to ymlSource | local | -| windows.cpp:22:15:22:29 | *call to GetCommandLineA | local | -| windows.cpp:34:17:34:38 | *call to GetEnvironmentStringsA | local | +| test.cpp:222:10:222:18 | call to ymlSource | local | +| windows.cpp:22:15:22:29 | call to GetCommandLineA | local | +| windows.cpp:34:17:34:38 | call to GetEnvironmentStringsA | local | | windows.cpp:39:36:39:38 | GetEnvironmentVariableA output argument | local | | windows.cpp:168:35:168:40 | ReadFile output argument | local | | windows.cpp:177:23:177:28 | ReadFileEx output argument | local | @@ -27,13 +27,13 @@ | windows.cpp:198:21:198:26 | ReadFile output argument | local | | windows.cpp:201:23:201:29 | ReadFileEx output argument | local | | windows.cpp:209:84:209:89 | NtReadFile output argument | local | -| windows.cpp:286:23:286:35 | *call to MapViewOfFile | local | -| windows.cpp:293:23:293:36 | *call to MapViewOfFile2 | local | -| windows.cpp:302:23:302:36 | *call to MapViewOfFile3 | local | -| windows.cpp:311:23:311:43 | *call to MapViewOfFile3FromApp | local | -| windows.cpp:318:23:318:37 | *call to MapViewOfFileEx | local | -| windows.cpp:325:23:325:42 | *call to MapViewOfFileFromApp | local | -| windows.cpp:332:23:332:40 | *call to MapViewOfFileNuma2 | local | +| windows.cpp:286:23:286:35 | call to MapViewOfFile | local | +| windows.cpp:293:23:293:36 | call to MapViewOfFile2 | local | +| windows.cpp:302:23:302:36 | call to MapViewOfFile3 | local | +| windows.cpp:311:23:311:43 | call to MapViewOfFile3FromApp | local | +| windows.cpp:318:23:318:37 | call to MapViewOfFileEx | local | +| windows.cpp:325:23:325:42 | call to MapViewOfFileFromApp | local | +| windows.cpp:332:23:332:40 | call to MapViewOfFileNuma2 | local | | windows.cpp:645:45:645:50 | WinHttpReadData output argument | remote | | windows.cpp:652:48:652:53 | WinHttpReadDataEx output argument | remote | | windows.cpp:659:47:659:52 | WinHttpQueryHeaders output argument | remote | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp index 44138fd16e79..bfdf213fc3c1 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp @@ -240,27 +240,27 @@ using Callback = void(*)(const SourceWrapper*); void source_from_callback_ptr(Callback); void f(const SourceWrapper* s) { - ymlSink(s->value); // $ MISSING: ir=250:32 ir=251:27 + ymlSink(s->value); // $ ir=250:32 ir=251:27 } void test_source_access_path() { SourceWrapper wrapper = ymlFieldSource(); - ymlSink(wrapper.value); // $ MISSING: ir + ymlSink(wrapper.value); // $ ir source_from_callback_template(f); source_from_callback_ptr(f); source_from_callback_template([](const SourceWrapper* s) { - ymlSink(s->value); // $ MISSING: ir + ymlSink(s->value); // $ ir }); source_from_callback_ptr([](const SourceWrapper* s) { - ymlSink(s->value); // $ MISSING: ir + ymlSink(s->value); // $ ir }); struct S { void operator()(const SourceWrapper* s) { - ymlSink(s->value); // $ MISSING: ir + ymlSink(s->value); // $ ir } }; diff --git a/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.expected b/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.expected index 7d1e2bc9327a..8492e0c9ddec 100644 --- a/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.expected +++ b/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.expected @@ -18,6 +18,10 @@ postIsInSameCallable reverseRead argHasPostUpdate postWithInFlow +| tests.cpp:60:30:60:31 | remoteMadSourceIndirectArg0 output argument | PostUpdateNode should not be the target of local flow. | +| tests.cpp:63:33:63:33 | remoteMadSourceIndirectArg1 output argument | PostUpdateNode should not be the target of local flow. | +| tests.cpp:295:39:295:40 | memberRemoteMadSourceIndirectArg0 output argument | PostUpdateNode should not be the target of local flow. | +| tests.cpp:369:2:369:4 | qualifierSource output argument | PostUpdateNode should not be the target of local flow. | viableImplInCallContextTooLarge uniqueParameterNodeAtPosition uniqueParameterNodePosition @@ -283,6 +287,42 @@ sourceCallables | tests.cpp:433:6:433:10 | array | | tests.cpp:434:6:434:6 | y | flowSummaryNode +| tests.cpp:36:7:36:20 | sink output argument | | | test_sources | +| tests.cpp:37:7:37:21 | sink output argument | | | test_sources | +| tests.cpp:39:7:39:24 | sink output argument | | | test_sources | +| tests.cpp:40:7:40:27 | sink output argument | | | test_sources | +| tests.cpp:45:10:45:23 | call to localMadSource | | | test_sources | +| tests.cpp:53:7:53:29 | sink output argument | | | test_sources | +| tests.cpp:54:8:54:30 | call to remoteMadSourceIndirect | | | test_sources | +| tests.cpp:55:8:55:36 | call to remoteMadSourceDoubleIndirect | | | test_sources | +| tests.cpp:56:9:56:37 | call to remoteMadSourceDoubleIndirect | | | test_sources | +| tests.cpp:60:30:60:31 | remoteMadSourceIndirectArg0 output argument | | | test_sources | +| tests.cpp:63:33:63:33 | remoteMadSourceIndirectArg1 output argument | | | test_sources | +| tests.cpp:67:10:67:23 | call to localMadSource | | | test_sources | +| tests.cpp:70:7:70:57 | sink output argument | | | test_sources | +| tests.cpp:75:32:75:32 | x | | | remoteMadSourceParam0 | +| tests.cpp:95:14:95:19 | call to source | | | test_sinks | +| tests.cpp:97:24:97:24 | 0 | | | test_sinks | +| tests.cpp:98:17:98:22 | call to source | | | test_sinks | +| tests.cpp:99:15:99:20 | call to source | | | test_sinks | +| tests.cpp:99:25:99:25 | 0 | | | test_sinks | +| tests.cpp:100:15:100:15 | 0 | | | test_sinks | +| tests.cpp:100:18:100:23 | call to source | | | test_sinks | +| tests.cpp:101:15:101:15 | 0 | | | test_sinks | +| tests.cpp:101:18:101:18 | 0 | | | test_sinks | +| tests.cpp:102:15:102:20 | call to source | | | test_sinks | +| tests.cpp:102:28:102:28 | 0 | | | test_sinks | +| tests.cpp:103:15:103:15 | 0 | | | test_sinks | +| tests.cpp:103:28:103:28 | 0 | | | test_sinks | +| tests.cpp:104:15:104:15 | 0 | | | test_sinks | +| tests.cpp:104:21:104:26 | call to source | | | test_sinks | +| tests.cpp:108:22:108:23 | & ... | | | test_sinks | +| tests.cpp:109:22:109:26 | a_ptr | | | test_sinks | +| tests.cpp:110:28:110:33 | & ... | | | test_sinks | +| tests.cpp:111:14:111:27 | call to localMadSource | | | test_sinks | +| tests.cpp:111:14:111:27 | madSinkArg0 output argument | | | test_sinks | +| tests.cpp:112:22:112:44 | call to remoteMadSourceIndirect | | | test_sinks | +| tests.cpp:112:22:112:44 | madSinkIndirectArg0 output argument | | | test_sinks | | tests.cpp:127:5:127:19 | [summary param] 0 in madArg0ToReturn | ParameterNode | madArg0ToReturn | madArg0ToReturn | | tests.cpp:127:5:127:19 | [summary] to write: ReturnValue in madArg0ToReturn | ReturnNode | madArg0ToReturn | madArg0ToReturn | | tests.cpp:128:6:128:28 | [summary param] 0 in madArg0ToReturnIndirect | ParameterNode | madArg0ToReturnIndirect | madArg0ToReturnIndirect | @@ -325,6 +365,12 @@ flowSummaryNode | tests.cpp:148:13:148:40 | [summary param] 0 in madArg0ToReturnFieldIndirect | ParameterNode | madArg0ToReturnFieldIndirect | madArg0ToReturnFieldIndirect | | tests.cpp:148:13:148:40 | [summary] to write: ReturnValue in madArg0ToReturnFieldIndirect | ReturnNode | madArg0ToReturnFieldIndirect | madArg0ToReturnFieldIndirect | | tests.cpp:148:13:148:40 | [summary] to write: ReturnValue.Field[*MyContainer::ptr]/Field[*ptr] in madArg0ToReturnFieldIndirect | | madArg0ToReturnFieldIndirect | madArg0ToReturnFieldIndirect | +| tests.cpp:225:14:225:28 | call to madArg0ToReturn | | | test_summaries | +| tests.cpp:225:30:225:44 | madArg0ToReturn output argument | | | test_summaries | +| tests.cpp:226:14:226:37 | call to madArg0ToReturnValueFlow | | | test_summaries | +| tests.cpp:226:39:226:53 | madArg0ToReturnValueFlow output argument | | | test_summaries | +| tests.cpp:227:14:227:36 | call to madArg0IndirectToReturn | | | test_summaries | +| tests.cpp:228:14:228:36 | call to madArg0IndirectToReturn | | | test_summaries | | tests.cpp:250:7:250:19 | [summary param] 0 in madArg0ToSelf | ParameterNode | madArg0ToSelf | madArg0ToSelf | | tests.cpp:250:7:250:19 | [summary param] this in madArg0ToSelf | ParameterNode | madArg0ToSelf | madArg0ToSelf | | tests.cpp:250:7:250:19 | [summary] to write: Argument[this] in madArg0ToSelf | PostUpdateNode | madArg0ToSelf | madArg0ToSelf | @@ -339,6 +385,27 @@ flowSummaryNode | tests.cpp:254:6:254:21 | [summary] to write: ReturnValue in madFieldToReturn | ReturnNode | madFieldToReturn | madFieldToReturn | | tests.cpp:277:7:277:30 | [summary param] this in namespaceMadSelfToReturn | ParameterNode | namespaceMadSelfToReturn | namespaceMadSelfToReturn | | tests.cpp:277:7:277:30 | [summary] to write: ReturnValue in namespaceMadSelfToReturn | ReturnNode | namespaceMadSelfToReturn | namespaceMadSelfToReturn | +| tests.cpp:292:10:292:30 | sink output argument | | | test_class_members | +| tests.cpp:295:39:295:40 | memberRemoteMadSourceIndirectArg0 output argument | | | test_class_members | +| tests.cpp:300:11:300:31 | sink output argument | | | test_class_members | +| tests.cpp:301:11:301:33 | sink output argument | | | test_class_members | +| tests.cpp:303:11:303:33 | sink output argument | | | test_class_members | +| tests.cpp:307:23:307:28 | call to source | | | test_class_members | +| tests.cpp:309:33:309:38 | call to source | | | test_class_members | +| tests.cpp:310:57:310:62 | call to source | | | test_class_members | +| tests.cpp:351:26:351:46 | call to memberRemoteMadSource | | | test_class_members | +| tests.cpp:351:26:351:46 | memberMadSinkArg0 output argument | | | test_class_members | +| tests.cpp:362:2:362:4 | mc8 | | | test_class_members | +| tests.cpp:362:24:362:24 | 0 | | | test_class_members | +| tests.cpp:363:2:363:4 | mc8 | | | test_class_members | +| tests.cpp:363:24:363:29 | call to source | | | test_class_members | +| tests.cpp:366:2:366:4 | mc9 | | | test_class_members | +| tests.cpp:367:2:367:4 | mc9 | | | test_class_members | +| tests.cpp:367:24:367:24 | 0 | | | test_class_members | +| tests.cpp:369:2:369:4 | qualifierSource output argument | | | test_class_members | +| tests.cpp:371:2:371:4 | mc8 | | | test_class_members | +| tests.cpp:372:2:372:4 | mc9 | | | test_class_members | +| tests.cpp:372:24:372:24 | 0 | | | test_class_members | | tests.cpp:392:5:392:29 | [summary param] 0 in madCallArg0ReturnToReturn | ParameterNode | madCallArg0ReturnToReturn | madCallArg0ReturnToReturn | | tests.cpp:392:5:392:29 | [summary] read: Argument[0].Parameter[this pointer] in madCallArg0ReturnToReturn | PostUpdateNode | madCallArg0ReturnToReturn | madCallArg0ReturnToReturn | | tests.cpp:392:5:392:29 | [summary] read: Argument[0].ReturnValue in madCallArg0ReturnToReturn | OutNode | madCallArg0ReturnToReturn | madCallArg0ReturnToReturn | From b89e4f124781f1e69a423f6f83de69b823cccff3 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 18 Aug 2026 16:36:14 +0100 Subject: [PATCH 0374/2098] C++: Hide flow summary nodes from consistency just like Rust does. --- .../cpp/ir/dataflow/internal/DataFlowImplConsistency.qll | 8 ++++++++ .../dataflow/models-as-data/testModels.expected | 4 ---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImplConsistency.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImplConsistency.qll index 6b0de326d114..3b900320882b 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImplConsistency.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImplConsistency.qll @@ -6,6 +6,8 @@ private import cpp private import DataFlowImplSpecific private import TaintTrackingImplSpecific +private import DataFlowNodes as Nodes +private import semmle.code.cpp.dataflow.internal.FlowSummaryImpl as FlowSummaryImpl private import codeql.dataflow.internal.DataFlowImplConsistency private module Input implements InputSig { @@ -14,6 +16,12 @@ private module Input implements InputSig { // complex to model here. any() } + + predicate postWithInFlowExclude(CppDataFlow::Node n) { + n instanceof Nodes::FlowSummaryNode + or + FlowSummaryImpl::Private::Steps::summaryLocalStep(_, n, _, _) + } } module Consistency = MakeConsistency; diff --git a/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.expected b/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.expected index 8492e0c9ddec..899b9bf80353 100644 --- a/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.expected +++ b/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.expected @@ -18,10 +18,6 @@ postIsInSameCallable reverseRead argHasPostUpdate postWithInFlow -| tests.cpp:60:30:60:31 | remoteMadSourceIndirectArg0 output argument | PostUpdateNode should not be the target of local flow. | -| tests.cpp:63:33:63:33 | remoteMadSourceIndirectArg1 output argument | PostUpdateNode should not be the target of local flow. | -| tests.cpp:295:39:295:40 | memberRemoteMadSourceIndirectArg0 output argument | PostUpdateNode should not be the target of local flow. | -| tests.cpp:369:2:369:4 | qualifierSource output argument | PostUpdateNode should not be the target of local flow. | viableImplInCallContextTooLarge uniqueParameterNodeAtPosition uniqueParameterNodePosition From 54750786824defe2da92cd2bc7d8d5376903f5c7 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Wed, 19 Aug 2026 14:01:02 +0200 Subject: [PATCH 0375/2098] C#: Address review comments. --- csharp/ql/lib/change-notes/2026-07-17-nuget-package-restore.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csharp/ql/lib/change-notes/2026-07-17-nuget-package-restore.md b/csharp/ql/lib/change-notes/2026-07-17-nuget-package-restore.md index 0673bffa3049..5dd7388d04fe 100644 --- a/csharp/ql/lib/change-notes/2026-07-17-nuget-package-restore.md +++ b/csharp/ql/lib/change-notes/2026-07-17-nuget-package-restore.md @@ -1,4 +1,4 @@ --- category: majorAnalysis --- -* Simplified and streamlined the use of NuGet sources when downloading dependencies. In fallback scenarios and specialized package downloads, NuGet sources are now passed directly to `dotnet restore` via `-s`. Furthermore, no `nuget.config` files are created for fallback scenarios, and private registries are used when attempting to download missing packages that were not restored as part of the normal `dotnet restore` process. +* Simplified and streamlined the use of NuGet sources when downloading dependencies. In fallback scenarios and specialized package downloads, NuGet sources are now passed directly to `dotnet restore` via the CLI. Furthermore, no `nuget.config` files are created for fallback scenarios, and private registries are used when attempting to download missing packages that were not restored as part of the normal `dotnet restore` process. From ccb0003512ab0a29fd02e138c86bb8b7da5537fd Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 19 Aug 2026 11:26:03 +0100 Subject: [PATCH 0376/2098] Rust: Add a bit more test coverage for native-tls. --- .../dataflow/sources/net/Cargo.lock | 1 + .../dataflow/sources/net/InlineFlow.expected | 648 +++++++++--------- .../sources/net/TaintSources.expected | 5 +- .../dataflow/sources/net/options.yml | 1 + .../dataflow/sources/net/test.rs | 29 + 5 files changed, 358 insertions(+), 326 deletions(-) diff --git a/rust/ql/test/library-tests/dataflow/sources/net/Cargo.lock b/rust/ql/test/library-tests/dataflow/sources/net/Cargo.lock index 27790b8b768d..f30f79630c4f 100644 --- a/rust/ql/test/library-tests/dataflow/sources/net/Cargo.lock +++ b/rust/ql/test/library-tests/dataflow/sources/net/Cargo.lock @@ -1558,6 +1558,7 @@ dependencies = [ "http-body-util", "hyper", "hyper-util", + "native-tls", "reqwest", "rustls", "tokio", diff --git a/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected index 8e44873ec860..f9ab8bb801a1 100644 --- a/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected @@ -205,136 +205,105 @@ edges | test.rs:350:44:350:54 | [post] &mut buffer [&ref] | test.rs:350:49:350:54 | [post] buffer | provenance | | | test.rs:350:49:350:54 | [post] buffer | test.rs:351:15:351:20 | buffer | provenance | | | test.rs:351:15:351:20 | buffer | test.rs:351:14:351:20 | &buffer | provenance | | -| test.rs:373:13:373:15 | tcp | test.rs:374:15:374:17 | tcp | provenance | | -| test.rs:373:13:373:15 | tcp | test.rs:380:57:380:59 | tcp | provenance | | -| test.rs:373:19:373:41 | ...::connect(...) | test.rs:373:19:373:41 | ...::connect(...) [future, Ok] | provenance | Src:MaD:1 | -| test.rs:373:19:373:41 | ...::connect(...) [future, Ok] | test.rs:373:19:373:47 | await ... [Ok] | provenance | | -| test.rs:373:19:373:47 | await ... [Ok] | test.rs:373:19:373:48 | TryExpr | provenance | | -| test.rs:373:19:373:48 | TryExpr | test.rs:373:13:373:15 | tcp | provenance | | -| test.rs:374:15:374:17 | tcp | test.rs:374:14:374:17 | &tcp | provenance | | -| test.rs:380:13:380:22 | mut reader | test.rs:381:15:381:20 | reader | provenance | | -| test.rs:380:13:380:22 | mut reader | test.rs:386:44:386:49 | reader | provenance | | -| test.rs:380:13:380:22 | mut reader | test.rs:399:68:399:73 | reader | provenance | | -| test.rs:380:13:380:22 | mut reader | test.rs:403:31:403:36 | reader | provenance | | -| test.rs:380:13:380:22 | mut reader | test.rs:408:55:408:60 | reader | provenance | | -| test.rs:380:26:380:60 | connector.connect(...) [future, Ok] | test.rs:380:26:380:66 | await ... [Ok] | provenance | | -| test.rs:380:26:380:66 | await ... [Ok] | test.rs:380:26:380:67 | TryExpr | provenance | | -| test.rs:380:26:380:67 | TryExpr | test.rs:380:13:380:22 | mut reader | provenance | | -| test.rs:380:57:380:59 | tcp | test.rs:380:26:380:60 | connector.connect(...) [future, Ok] | provenance | MaD:29 | -| test.rs:381:15:381:20 | reader | test.rs:381:14:381:20 | &reader | provenance | | -| test.rs:386:17:386:26 | mut pinned | test.rs:387:19:387:24 | pinned | provenance | | -| test.rs:386:17:386:26 | mut pinned | test.rs:389:30:389:35 | pinned | provenance | | -| test.rs:386:17:386:26 | mut pinned [Pin, &ref] | test.rs:387:19:387:24 | pinned [Pin, &ref] | provenance | | -| test.rs:386:30:386:50 | ...::new(...) | test.rs:386:17:386:26 | mut pinned | provenance | | -| test.rs:386:30:386:50 | ...::new(...) [Pin, &ref] | test.rs:386:17:386:26 | mut pinned [Pin, &ref] | provenance | | -| test.rs:386:39:386:49 | &mut reader [&ref] | test.rs:386:30:386:50 | ...::new(...) | provenance | MaD:26 | -| test.rs:386:39:386:49 | &mut reader [&ref] | test.rs:386:30:386:50 | ...::new(...) [Pin, &ref] | provenance | MaD:27 | -| test.rs:386:44:386:49 | reader | test.rs:386:39:386:49 | &mut reader [&ref] | provenance | | -| test.rs:387:19:387:24 | pinned | test.rs:387:18:387:24 | &pinned | provenance | | -| test.rs:387:19:387:24 | pinned [Pin, &ref] | test.rs:387:18:387:24 | &pinned | provenance | | -| test.rs:389:30:389:35 | pinned | test.rs:389:56:389:66 | [post] &mut buffer [&ref] | provenance | MaD:12 | -| test.rs:389:56:389:66 | [post] &mut buffer [&ref] | test.rs:389:61:389:66 | [post] buffer | provenance | | -| test.rs:389:61:389:66 | [post] buffer | test.rs:391:23:391:28 | buffer | provenance | | -| test.rs:389:61:389:66 | [post] buffer | test.rs:392:23:392:28 | buffer | provenance | | -| test.rs:389:61:389:66 | [post] buffer | test.rs:392:23:392:33 | buffer[...] | provenance | | -| test.rs:391:23:391:28 | buffer | test.rs:391:22:391:28 | &buffer | provenance | | -| test.rs:392:23:392:28 | buffer | test.rs:392:23:392:33 | buffer[...] | provenance | MaD:10 | -| test.rs:392:23:392:33 | buffer[...] | test.rs:392:22:392:33 | &... | provenance | | -| test.rs:399:63:399:73 | &mut reader [&ref] | test.rs:399:76:399:87 | [post] &mut buffer1 [&ref] | provenance | MaD:16 | -| test.rs:399:68:399:73 | reader | test.rs:399:63:399:73 | &mut reader [&ref] | provenance | | -| test.rs:399:76:399:87 | [post] &mut buffer1 [&ref] | test.rs:399:81:399:87 | [post] buffer1 | provenance | | -| test.rs:399:81:399:87 | [post] buffer1 | test.rs:400:19:400:25 | buffer1 | provenance | | -| test.rs:399:81:399:87 | [post] buffer1 | test.rs:400:19:400:40 | buffer1[...] | provenance | | -| test.rs:400:19:400:25 | buffer1 | test.rs:400:19:400:40 | buffer1[...] | provenance | MaD:10 | -| test.rs:400:19:400:40 | buffer1[...] | test.rs:400:18:400:40 | &... | provenance | | -| test.rs:403:31:403:36 | reader | test.rs:403:43:403:54 | [post] &mut buffer2 [&ref] | provenance | MaD:16 | -| test.rs:403:43:403:54 | [post] &mut buffer2 [&ref] | test.rs:403:48:403:54 | [post] buffer2 | provenance | | -| test.rs:403:48:403:54 | [post] buffer2 | test.rs:405:19:405:25 | buffer2 | provenance | | -| test.rs:403:48:403:54 | [post] buffer2 | test.rs:405:19:405:40 | buffer2[...] | provenance | | -| test.rs:405:19:405:25 | buffer2 | test.rs:405:19:405:40 | buffer2[...] | provenance | MaD:10 | -| test.rs:405:19:405:40 | buffer2[...] | test.rs:405:18:405:40 | &... | provenance | | -| test.rs:408:13:408:23 | mut reader2 | test.rs:409:15:409:21 | reader2 | provenance | | -| test.rs:408:13:408:23 | mut reader2 | test.rs:413:44:413:50 | reader2 | provenance | | -| test.rs:408:13:408:23 | mut reader2 | test.rs:423:41:423:47 | reader2 | provenance | | -| test.rs:408:13:408:23 | mut reader2 | test.rs:437:26:437:32 | reader2 | provenance | | -| test.rs:408:13:408:23 | mut reader2 | test.rs:444:44:444:50 | reader2 | provenance | | -| test.rs:408:13:408:23 | mut reader2 | test.rs:457:68:457:74 | reader2 | provenance | | -| test.rs:408:13:408:23 | mut reader2 | test.rs:461:31:461:37 | reader2 | provenance | | -| test.rs:408:13:408:23 | mut reader2 | test.rs:467:44:467:50 | reader2 | provenance | | -| test.rs:408:13:408:23 | mut reader2 | test.rs:479:26:479:32 | reader2 | provenance | | -| test.rs:408:13:408:23 | mut reader2 | test.rs:486:31:486:37 | reader2 | provenance | | -| test.rs:408:13:408:23 | mut reader2 | test.rs:493:31:493:37 | reader2 | provenance | | -| test.rs:408:13:408:23 | mut reader2 | test.rs:500:31:500:37 | reader2 | provenance | | -| test.rs:408:27:408:61 | ...::new(...) | test.rs:408:13:408:23 | mut reader2 | provenance | | -| test.rs:408:55:408:60 | reader | test.rs:408:27:408:61 | ...::new(...) | provenance | MaD:30 | -| test.rs:409:15:409:21 | reader2 | test.rs:409:14:409:21 | &reader2 | provenance | | -| test.rs:413:17:413:26 | mut pinned | test.rs:414:19:414:24 | pinned | provenance | | -| test.rs:413:17:413:26 | mut pinned | test.rs:416:26:416:31 | pinned | provenance | | -| test.rs:413:17:413:26 | mut pinned [Pin, &ref] | test.rs:414:19:414:24 | pinned [Pin, &ref] | provenance | | -| test.rs:413:30:413:51 | ...::new(...) | test.rs:413:17:413:26 | mut pinned | provenance | | -| test.rs:413:30:413:51 | ...::new(...) [Pin, &ref] | test.rs:413:17:413:26 | mut pinned [Pin, &ref] | provenance | | -| test.rs:413:39:413:50 | &mut reader2 [&ref] | test.rs:413:30:413:51 | ...::new(...) | provenance | MaD:26 | -| test.rs:413:39:413:50 | &mut reader2 [&ref] | test.rs:413:30:413:51 | ...::new(...) [Pin, &ref] | provenance | MaD:27 | -| test.rs:413:44:413:50 | reader2 | test.rs:413:39:413:50 | &mut reader2 [&ref] | provenance | | -| test.rs:414:19:414:24 | pinned | test.rs:414:18:414:24 | &pinned | provenance | | -| test.rs:414:19:414:24 | pinned [Pin, &ref] | test.rs:414:18:414:24 | &pinned | provenance | | -| test.rs:416:17:416:22 | buffer [Ready, Ok] | test.rs:417:20:417:39 | ...::Ready(...) [Ready, Ok] | provenance | | -| test.rs:416:17:416:22 | buffer [Ready, Ok] | test.rs:418:23:418:28 | buffer [Ready, Ok] | provenance | | -| test.rs:416:26:416:31 | pinned | test.rs:416:26:416:54 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:11 | -| test.rs:416:26:416:54 | pinned.poll_fill_buf(...) [Ready, Ok] | test.rs:416:17:416:22 | buffer [Ready, Ok] | provenance | | -| test.rs:417:20:417:39 | ...::Ready(...) [Ready, Ok] | test.rs:417:32:417:38 | Ok(...) [Ok] | provenance | | -| test.rs:417:32:417:38 | Ok(...) [Ok] | test.rs:417:35:417:37 | buf | provenance | | -| test.rs:417:35:417:37 | buf | test.rs:419:22:419:24 | buf | provenance | | -| test.rs:418:23:418:28 | buffer [Ready, Ok] | test.rs:418:22:418:28 | &buffer | provenance | | -| test.rs:423:17:423:23 | buffer2 [Ready, Ok] | test.rs:424:20:424:26 | buffer2 [Ready, Ok] | provenance | | -| test.rs:423:27:423:48 | ...::new(...) | test.rs:423:27:423:71 | ... .poll_fill_buf(...) [Ready, Ok] | provenance | MaD:11 | -| test.rs:423:27:423:71 | ... .poll_fill_buf(...) [Ready, Ok] | test.rs:423:17:423:23 | buffer2 [Ready, Ok] | provenance | | -| test.rs:423:36:423:47 | &mut reader2 [&ref] | test.rs:423:27:423:48 | ...::new(...) | provenance | MaD:26 | -| test.rs:423:41:423:47 | reader2 | test.rs:423:36:423:47 | &mut reader2 [&ref] | provenance | | -| test.rs:424:20:424:26 | buffer2 [Ready, Ok] | test.rs:425:17:425:36 | ...::Ready(...) [Ready, Ok] | provenance | | -| test.rs:424:20:424:26 | buffer2 [Ready, Ok] | test.rs:426:27:426:33 | buffer2 [Ready, Ok] | provenance | | -| test.rs:425:17:425:36 | ...::Ready(...) [Ready, Ok] | test.rs:425:29:425:35 | Ok(...) [Ok] | provenance | | -| test.rs:425:29:425:35 | Ok(...) [Ok] | test.rs:425:32:425:34 | buf | provenance | | -| test.rs:425:32:425:34 | buf | test.rs:427:26:427:28 | buf | provenance | | -| test.rs:426:27:426:33 | buffer2 [Ready, Ok] | test.rs:426:26:426:33 | &buffer2 | provenance | | -| test.rs:437:17:437:22 | buffer | test.rs:438:18:438:23 | buffer | provenance | | -| test.rs:437:26:437:32 | reader2 | test.rs:437:26:437:43 | reader2.fill_buf() [future, Ok] | provenance | MaD:13 | -| test.rs:437:26:437:43 | reader2.fill_buf() [future, Ok] | test.rs:437:26:437:49 | await ... [Ok] | provenance | | -| test.rs:437:26:437:49 | await ... [Ok] | test.rs:437:26:437:50 | TryExpr | provenance | | -| test.rs:437:26:437:50 | TryExpr | test.rs:437:17:437:22 | buffer | provenance | | -| test.rs:444:17:444:26 | mut pinned | test.rs:445:19:445:24 | pinned | provenance | | -| test.rs:444:17:444:26 | mut pinned | test.rs:447:30:447:35 | pinned | provenance | | -| test.rs:444:17:444:26 | mut pinned [Pin, &ref] | test.rs:445:19:445:24 | pinned [Pin, &ref] | provenance | | -| test.rs:444:30:444:51 | ...::new(...) | test.rs:444:17:444:26 | mut pinned | provenance | | -| test.rs:444:30:444:51 | ...::new(...) [Pin, &ref] | test.rs:444:17:444:26 | mut pinned [Pin, &ref] | provenance | | -| test.rs:444:39:444:50 | &mut reader2 [&ref] | test.rs:444:30:444:51 | ...::new(...) | provenance | MaD:26 | -| test.rs:444:39:444:50 | &mut reader2 [&ref] | test.rs:444:30:444:51 | ...::new(...) [Pin, &ref] | provenance | MaD:27 | -| test.rs:444:44:444:50 | reader2 | test.rs:444:39:444:50 | &mut reader2 [&ref] | provenance | | -| test.rs:445:19:445:24 | pinned | test.rs:445:18:445:24 | &pinned | provenance | | -| test.rs:445:19:445:24 | pinned [Pin, &ref] | test.rs:445:18:445:24 | &pinned | provenance | | -| test.rs:447:30:447:35 | pinned | test.rs:447:56:447:66 | [post] &mut buffer [&ref] | provenance | MaD:12 | -| test.rs:447:56:447:66 | [post] &mut buffer [&ref] | test.rs:447:61:447:66 | [post] buffer | provenance | | -| test.rs:447:61:447:66 | [post] buffer | test.rs:448:19:448:24 | buffer | provenance | | -| test.rs:447:61:447:66 | [post] buffer | test.rs:450:23:450:28 | buffer | provenance | | -| test.rs:447:61:447:66 | [post] buffer | test.rs:450:23:450:33 | buffer[...] | provenance | | -| test.rs:448:19:448:24 | buffer | test.rs:448:18:448:24 | &buffer | provenance | | -| test.rs:450:23:450:28 | buffer | test.rs:450:23:450:33 | buffer[...] | provenance | MaD:10 | -| test.rs:450:23:450:33 | buffer[...] | test.rs:450:22:450:33 | &... | provenance | | -| test.rs:457:63:457:74 | &mut reader2 [&ref] | test.rs:457:77:457:88 | [post] &mut buffer1 [&ref] | provenance | MaD:16 | -| test.rs:457:68:457:74 | reader2 | test.rs:457:63:457:74 | &mut reader2 [&ref] | provenance | | -| test.rs:457:77:457:88 | [post] &mut buffer1 [&ref] | test.rs:457:82:457:88 | [post] buffer1 | provenance | | -| test.rs:457:82:457:88 | [post] buffer1 | test.rs:458:19:458:25 | buffer1 | provenance | | -| test.rs:457:82:457:88 | [post] buffer1 | test.rs:458:19:458:40 | buffer1[...] | provenance | | -| test.rs:458:19:458:25 | buffer1 | test.rs:458:19:458:40 | buffer1[...] | provenance | MaD:10 | -| test.rs:458:19:458:40 | buffer1[...] | test.rs:458:18:458:40 | &... | provenance | | -| test.rs:461:31:461:37 | reader2 | test.rs:461:44:461:55 | [post] &mut buffer2 [&ref] | provenance | MaD:16 | -| test.rs:461:44:461:55 | [post] &mut buffer2 [&ref] | test.rs:461:49:461:55 | [post] buffer2 | provenance | | -| test.rs:461:49:461:55 | [post] buffer2 | test.rs:462:19:462:25 | buffer2 | provenance | | -| test.rs:461:49:461:55 | [post] buffer2 | test.rs:462:19:462:40 | buffer2[...] | provenance | | -| test.rs:462:19:462:25 | buffer2 | test.rs:462:19:462:40 | buffer2[...] | provenance | MaD:10 | -| test.rs:462:19:462:40 | buffer2[...] | test.rs:462:18:462:40 | &... | provenance | | +| test.rs:396:13:396:15 | tcp | test.rs:397:15:397:17 | tcp | provenance | | +| test.rs:396:13:396:15 | tcp | test.rs:403:57:403:59 | tcp | provenance | | +| test.rs:396:19:396:41 | ...::connect(...) | test.rs:396:19:396:41 | ...::connect(...) [future, Ok] | provenance | Src:MaD:1 | +| test.rs:396:19:396:41 | ...::connect(...) [future, Ok] | test.rs:396:19:396:47 | await ... [Ok] | provenance | | +| test.rs:396:19:396:47 | await ... [Ok] | test.rs:396:19:396:48 | TryExpr | provenance | | +| test.rs:396:19:396:48 | TryExpr | test.rs:396:13:396:15 | tcp | provenance | | +| test.rs:397:15:397:17 | tcp | test.rs:397:14:397:17 | &tcp | provenance | | +| test.rs:403:13:403:22 | mut reader | test.rs:404:15:404:20 | reader | provenance | | +| test.rs:403:13:403:22 | mut reader | test.rs:409:44:409:49 | reader | provenance | | +| test.rs:403:13:403:22 | mut reader | test.rs:422:68:422:73 | reader | provenance | | +| test.rs:403:13:403:22 | mut reader | test.rs:426:31:426:36 | reader | provenance | | +| test.rs:403:13:403:22 | mut reader | test.rs:431:55:431:60 | reader | provenance | | +| test.rs:403:26:403:60 | connector.connect(...) [future, Ok] | test.rs:403:26:403:66 | await ... [Ok] | provenance | | +| test.rs:403:26:403:66 | await ... [Ok] | test.rs:403:26:403:67 | TryExpr | provenance | | +| test.rs:403:26:403:67 | TryExpr | test.rs:403:13:403:22 | mut reader | provenance | | +| test.rs:403:57:403:59 | tcp | test.rs:403:26:403:60 | connector.connect(...) [future, Ok] | provenance | MaD:29 | +| test.rs:404:15:404:20 | reader | test.rs:404:14:404:20 | &reader | provenance | | +| test.rs:409:17:409:26 | mut pinned | test.rs:410:19:410:24 | pinned | provenance | | +| test.rs:409:17:409:26 | mut pinned | test.rs:412:30:412:35 | pinned | provenance | | +| test.rs:409:17:409:26 | mut pinned [Pin, &ref] | test.rs:410:19:410:24 | pinned [Pin, &ref] | provenance | | +| test.rs:409:30:409:50 | ...::new(...) | test.rs:409:17:409:26 | mut pinned | provenance | | +| test.rs:409:30:409:50 | ...::new(...) [Pin, &ref] | test.rs:409:17:409:26 | mut pinned [Pin, &ref] | provenance | | +| test.rs:409:39:409:49 | &mut reader [&ref] | test.rs:409:30:409:50 | ...::new(...) | provenance | MaD:26 | +| test.rs:409:39:409:49 | &mut reader [&ref] | test.rs:409:30:409:50 | ...::new(...) [Pin, &ref] | provenance | MaD:27 | +| test.rs:409:44:409:49 | reader | test.rs:409:39:409:49 | &mut reader [&ref] | provenance | | +| test.rs:410:19:410:24 | pinned | test.rs:410:18:410:24 | &pinned | provenance | | +| test.rs:410:19:410:24 | pinned [Pin, &ref] | test.rs:410:18:410:24 | &pinned | provenance | | +| test.rs:412:30:412:35 | pinned | test.rs:412:56:412:66 | [post] &mut buffer [&ref] | provenance | MaD:12 | +| test.rs:412:56:412:66 | [post] &mut buffer [&ref] | test.rs:412:61:412:66 | [post] buffer | provenance | | +| test.rs:412:61:412:66 | [post] buffer | test.rs:414:23:414:28 | buffer | provenance | | +| test.rs:412:61:412:66 | [post] buffer | test.rs:415:23:415:28 | buffer | provenance | | +| test.rs:412:61:412:66 | [post] buffer | test.rs:415:23:415:33 | buffer[...] | provenance | | +| test.rs:414:23:414:28 | buffer | test.rs:414:22:414:28 | &buffer | provenance | | +| test.rs:415:23:415:28 | buffer | test.rs:415:23:415:33 | buffer[...] | provenance | MaD:10 | +| test.rs:415:23:415:33 | buffer[...] | test.rs:415:22:415:33 | &... | provenance | | +| test.rs:422:63:422:73 | &mut reader [&ref] | test.rs:422:76:422:87 | [post] &mut buffer1 [&ref] | provenance | MaD:16 | +| test.rs:422:68:422:73 | reader | test.rs:422:63:422:73 | &mut reader [&ref] | provenance | | +| test.rs:422:76:422:87 | [post] &mut buffer1 [&ref] | test.rs:422:81:422:87 | [post] buffer1 | provenance | | +| test.rs:422:81:422:87 | [post] buffer1 | test.rs:423:19:423:25 | buffer1 | provenance | | +| test.rs:422:81:422:87 | [post] buffer1 | test.rs:423:19:423:40 | buffer1[...] | provenance | | +| test.rs:423:19:423:25 | buffer1 | test.rs:423:19:423:40 | buffer1[...] | provenance | MaD:10 | +| test.rs:423:19:423:40 | buffer1[...] | test.rs:423:18:423:40 | &... | provenance | | +| test.rs:426:31:426:36 | reader | test.rs:426:43:426:54 | [post] &mut buffer2 [&ref] | provenance | MaD:16 | +| test.rs:426:43:426:54 | [post] &mut buffer2 [&ref] | test.rs:426:48:426:54 | [post] buffer2 | provenance | | +| test.rs:426:48:426:54 | [post] buffer2 | test.rs:428:19:428:25 | buffer2 | provenance | | +| test.rs:426:48:426:54 | [post] buffer2 | test.rs:428:19:428:40 | buffer2[...] | provenance | | +| test.rs:428:19:428:25 | buffer2 | test.rs:428:19:428:40 | buffer2[...] | provenance | MaD:10 | +| test.rs:428:19:428:40 | buffer2[...] | test.rs:428:18:428:40 | &... | provenance | | +| test.rs:431:13:431:23 | mut reader2 | test.rs:432:15:432:21 | reader2 | provenance | | +| test.rs:431:13:431:23 | mut reader2 | test.rs:436:44:436:50 | reader2 | provenance | | +| test.rs:431:13:431:23 | mut reader2 | test.rs:446:41:446:47 | reader2 | provenance | | +| test.rs:431:13:431:23 | mut reader2 | test.rs:460:26:460:32 | reader2 | provenance | | +| test.rs:431:13:431:23 | mut reader2 | test.rs:467:44:467:50 | reader2 | provenance | | +| test.rs:431:13:431:23 | mut reader2 | test.rs:480:68:480:74 | reader2 | provenance | | +| test.rs:431:13:431:23 | mut reader2 | test.rs:484:31:484:37 | reader2 | provenance | | +| test.rs:431:13:431:23 | mut reader2 | test.rs:490:44:490:50 | reader2 | provenance | | +| test.rs:431:13:431:23 | mut reader2 | test.rs:502:26:502:32 | reader2 | provenance | | +| test.rs:431:13:431:23 | mut reader2 | test.rs:509:31:509:37 | reader2 | provenance | | +| test.rs:431:13:431:23 | mut reader2 | test.rs:516:31:516:37 | reader2 | provenance | | +| test.rs:431:13:431:23 | mut reader2 | test.rs:523:31:523:37 | reader2 | provenance | | +| test.rs:431:27:431:61 | ...::new(...) | test.rs:431:13:431:23 | mut reader2 | provenance | | +| test.rs:431:55:431:60 | reader | test.rs:431:27:431:61 | ...::new(...) | provenance | MaD:30 | +| test.rs:432:15:432:21 | reader2 | test.rs:432:14:432:21 | &reader2 | provenance | | +| test.rs:436:17:436:26 | mut pinned | test.rs:437:19:437:24 | pinned | provenance | | +| test.rs:436:17:436:26 | mut pinned | test.rs:439:26:439:31 | pinned | provenance | | +| test.rs:436:17:436:26 | mut pinned [Pin, &ref] | test.rs:437:19:437:24 | pinned [Pin, &ref] | provenance | | +| test.rs:436:30:436:51 | ...::new(...) | test.rs:436:17:436:26 | mut pinned | provenance | | +| test.rs:436:30:436:51 | ...::new(...) [Pin, &ref] | test.rs:436:17:436:26 | mut pinned [Pin, &ref] | provenance | | +| test.rs:436:39:436:50 | &mut reader2 [&ref] | test.rs:436:30:436:51 | ...::new(...) | provenance | MaD:26 | +| test.rs:436:39:436:50 | &mut reader2 [&ref] | test.rs:436:30:436:51 | ...::new(...) [Pin, &ref] | provenance | MaD:27 | +| test.rs:436:44:436:50 | reader2 | test.rs:436:39:436:50 | &mut reader2 [&ref] | provenance | | +| test.rs:437:19:437:24 | pinned | test.rs:437:18:437:24 | &pinned | provenance | | +| test.rs:437:19:437:24 | pinned [Pin, &ref] | test.rs:437:18:437:24 | &pinned | provenance | | +| test.rs:439:17:439:22 | buffer [Ready, Ok] | test.rs:440:20:440:39 | ...::Ready(...) [Ready, Ok] | provenance | | +| test.rs:439:17:439:22 | buffer [Ready, Ok] | test.rs:441:23:441:28 | buffer [Ready, Ok] | provenance | | +| test.rs:439:26:439:31 | pinned | test.rs:439:26:439:54 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:11 | +| test.rs:439:26:439:54 | pinned.poll_fill_buf(...) [Ready, Ok] | test.rs:439:17:439:22 | buffer [Ready, Ok] | provenance | | +| test.rs:440:20:440:39 | ...::Ready(...) [Ready, Ok] | test.rs:440:32:440:38 | Ok(...) [Ok] | provenance | | +| test.rs:440:32:440:38 | Ok(...) [Ok] | test.rs:440:35:440:37 | buf | provenance | | +| test.rs:440:35:440:37 | buf | test.rs:442:22:442:24 | buf | provenance | | +| test.rs:441:23:441:28 | buffer [Ready, Ok] | test.rs:441:22:441:28 | &buffer | provenance | | +| test.rs:446:17:446:23 | buffer2 [Ready, Ok] | test.rs:447:20:447:26 | buffer2 [Ready, Ok] | provenance | | +| test.rs:446:27:446:48 | ...::new(...) | test.rs:446:27:446:71 | ... .poll_fill_buf(...) [Ready, Ok] | provenance | MaD:11 | +| test.rs:446:27:446:71 | ... .poll_fill_buf(...) [Ready, Ok] | test.rs:446:17:446:23 | buffer2 [Ready, Ok] | provenance | | +| test.rs:446:36:446:47 | &mut reader2 [&ref] | test.rs:446:27:446:48 | ...::new(...) | provenance | MaD:26 | +| test.rs:446:41:446:47 | reader2 | test.rs:446:36:446:47 | &mut reader2 [&ref] | provenance | | +| test.rs:447:20:447:26 | buffer2 [Ready, Ok] | test.rs:448:17:448:36 | ...::Ready(...) [Ready, Ok] | provenance | | +| test.rs:447:20:447:26 | buffer2 [Ready, Ok] | test.rs:449:27:449:33 | buffer2 [Ready, Ok] | provenance | | +| test.rs:448:17:448:36 | ...::Ready(...) [Ready, Ok] | test.rs:448:29:448:35 | Ok(...) [Ok] | provenance | | +| test.rs:448:29:448:35 | Ok(...) [Ok] | test.rs:448:32:448:34 | buf | provenance | | +| test.rs:448:32:448:34 | buf | test.rs:450:26:450:28 | buf | provenance | | +| test.rs:449:27:449:33 | buffer2 [Ready, Ok] | test.rs:449:26:449:33 | &buffer2 | provenance | | +| test.rs:460:17:460:22 | buffer | test.rs:461:18:461:23 | buffer | provenance | | +| test.rs:460:26:460:32 | reader2 | test.rs:460:26:460:43 | reader2.fill_buf() [future, Ok] | provenance | MaD:13 | +| test.rs:460:26:460:43 | reader2.fill_buf() [future, Ok] | test.rs:460:26:460:49 | await ... [Ok] | provenance | | +| test.rs:460:26:460:49 | await ... [Ok] | test.rs:460:26:460:50 | TryExpr | provenance | | +| test.rs:460:26:460:50 | TryExpr | test.rs:460:17:460:22 | buffer | provenance | | | test.rs:467:17:467:26 | mut pinned | test.rs:468:19:468:24 | pinned | provenance | | -| test.rs:467:17:467:26 | mut pinned | test.rs:470:26:470:31 | pinned | provenance | | +| test.rs:467:17:467:26 | mut pinned | test.rs:470:30:470:35 | pinned | provenance | | | test.rs:467:17:467:26 | mut pinned [Pin, &ref] | test.rs:468:19:468:24 | pinned [Pin, &ref] | provenance | | | test.rs:467:30:467:51 | ...::new(...) | test.rs:467:17:467:26 | mut pinned | provenance | | | test.rs:467:30:467:51 | ...::new(...) [Pin, &ref] | test.rs:467:17:467:26 | mut pinned [Pin, &ref] | provenance | | @@ -343,31 +312,62 @@ edges | test.rs:467:44:467:50 | reader2 | test.rs:467:39:467:50 | &mut reader2 [&ref] | provenance | | | test.rs:468:19:468:24 | pinned | test.rs:468:18:468:24 | &pinned | provenance | | | test.rs:468:19:468:24 | pinned [Pin, &ref] | test.rs:468:18:468:24 | &pinned | provenance | | -| test.rs:470:17:470:22 | buffer [Ready, Ok] | test.rs:471:19:471:24 | buffer [Ready, Ok] | provenance | | -| test.rs:470:17:470:22 | buffer [Ready, Ok] | test.rs:472:20:472:39 | ...::Ready(...) [Ready, Ok] | provenance | | -| test.rs:470:26:470:31 | pinned | test.rs:470:26:470:54 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:11 | -| test.rs:470:26:470:54 | pinned.poll_fill_buf(...) [Ready, Ok] | test.rs:470:17:470:22 | buffer [Ready, Ok] | provenance | | -| test.rs:471:19:471:24 | buffer [Ready, Ok] | test.rs:471:18:471:24 | &buffer | provenance | | -| test.rs:472:20:472:39 | ...::Ready(...) [Ready, Ok] | test.rs:472:32:472:38 | Ok(...) [Ok] | provenance | | -| test.rs:472:32:472:38 | Ok(...) [Ok] | test.rs:472:35:472:37 | buf | provenance | | -| test.rs:472:35:472:37 | buf | test.rs:473:22:473:24 | buf | provenance | | -| test.rs:479:17:479:22 | buffer | test.rs:480:18:480:23 | buffer | provenance | | -| test.rs:479:26:479:32 | reader2 | test.rs:479:26:479:43 | reader2.fill_buf() [future, Ok] | provenance | MaD:13 | -| test.rs:479:26:479:43 | reader2.fill_buf() [future, Ok] | test.rs:479:26:479:49 | await ... [Ok] | provenance | | -| test.rs:479:26:479:49 | await ... [Ok] | test.rs:479:26:479:50 | TryExpr | provenance | | -| test.rs:479:26:479:50 | TryExpr | test.rs:479:17:479:22 | buffer | provenance | | -| test.rs:486:31:486:37 | reader2 | test.rs:486:57:486:65 | [post] &mut line [&ref] | provenance | MaD:15 | -| test.rs:486:57:486:65 | [post] &mut line [&ref] | test.rs:486:62:486:65 | [post] line | provenance | | -| test.rs:486:62:486:65 | [post] line | test.rs:487:19:487:22 | line | provenance | | -| test.rs:487:19:487:22 | line | test.rs:487:18:487:22 | &line | provenance | | -| test.rs:493:31:493:37 | reader2 | test.rs:493:49:493:57 | [post] &mut line [&ref] | provenance | MaD:14 | -| test.rs:493:49:493:57 | [post] &mut line [&ref] | test.rs:493:54:493:57 | [post] line | provenance | | -| test.rs:493:54:493:57 | [post] line | test.rs:494:19:494:22 | line | provenance | | -| test.rs:494:19:494:22 | line | test.rs:494:18:494:22 | &line | provenance | | -| test.rs:500:31:500:37 | reader2 | test.rs:500:51:500:61 | [post] &mut buffer [&ref] | provenance | MaD:17 | -| test.rs:500:51:500:61 | [post] &mut buffer [&ref] | test.rs:500:56:500:61 | [post] buffer | provenance | | -| test.rs:500:56:500:61 | [post] buffer | test.rs:501:19:501:24 | buffer | provenance | | -| test.rs:501:19:501:24 | buffer | test.rs:501:18:501:24 | &buffer | provenance | | +| test.rs:470:30:470:35 | pinned | test.rs:470:56:470:66 | [post] &mut buffer [&ref] | provenance | MaD:12 | +| test.rs:470:56:470:66 | [post] &mut buffer [&ref] | test.rs:470:61:470:66 | [post] buffer | provenance | | +| test.rs:470:61:470:66 | [post] buffer | test.rs:471:19:471:24 | buffer | provenance | | +| test.rs:470:61:470:66 | [post] buffer | test.rs:473:23:473:28 | buffer | provenance | | +| test.rs:470:61:470:66 | [post] buffer | test.rs:473:23:473:33 | buffer[...] | provenance | | +| test.rs:471:19:471:24 | buffer | test.rs:471:18:471:24 | &buffer | provenance | | +| test.rs:473:23:473:28 | buffer | test.rs:473:23:473:33 | buffer[...] | provenance | MaD:10 | +| test.rs:473:23:473:33 | buffer[...] | test.rs:473:22:473:33 | &... | provenance | | +| test.rs:480:63:480:74 | &mut reader2 [&ref] | test.rs:480:77:480:88 | [post] &mut buffer1 [&ref] | provenance | MaD:16 | +| test.rs:480:68:480:74 | reader2 | test.rs:480:63:480:74 | &mut reader2 [&ref] | provenance | | +| test.rs:480:77:480:88 | [post] &mut buffer1 [&ref] | test.rs:480:82:480:88 | [post] buffer1 | provenance | | +| test.rs:480:82:480:88 | [post] buffer1 | test.rs:481:19:481:25 | buffer1 | provenance | | +| test.rs:480:82:480:88 | [post] buffer1 | test.rs:481:19:481:40 | buffer1[...] | provenance | | +| test.rs:481:19:481:25 | buffer1 | test.rs:481:19:481:40 | buffer1[...] | provenance | MaD:10 | +| test.rs:481:19:481:40 | buffer1[...] | test.rs:481:18:481:40 | &... | provenance | | +| test.rs:484:31:484:37 | reader2 | test.rs:484:44:484:55 | [post] &mut buffer2 [&ref] | provenance | MaD:16 | +| test.rs:484:44:484:55 | [post] &mut buffer2 [&ref] | test.rs:484:49:484:55 | [post] buffer2 | provenance | | +| test.rs:484:49:484:55 | [post] buffer2 | test.rs:485:19:485:25 | buffer2 | provenance | | +| test.rs:484:49:484:55 | [post] buffer2 | test.rs:485:19:485:40 | buffer2[...] | provenance | | +| test.rs:485:19:485:25 | buffer2 | test.rs:485:19:485:40 | buffer2[...] | provenance | MaD:10 | +| test.rs:485:19:485:40 | buffer2[...] | test.rs:485:18:485:40 | &... | provenance | | +| test.rs:490:17:490:26 | mut pinned | test.rs:491:19:491:24 | pinned | provenance | | +| test.rs:490:17:490:26 | mut pinned | test.rs:493:26:493:31 | pinned | provenance | | +| test.rs:490:17:490:26 | mut pinned [Pin, &ref] | test.rs:491:19:491:24 | pinned [Pin, &ref] | provenance | | +| test.rs:490:30:490:51 | ...::new(...) | test.rs:490:17:490:26 | mut pinned | provenance | | +| test.rs:490:30:490:51 | ...::new(...) [Pin, &ref] | test.rs:490:17:490:26 | mut pinned [Pin, &ref] | provenance | | +| test.rs:490:39:490:50 | &mut reader2 [&ref] | test.rs:490:30:490:51 | ...::new(...) | provenance | MaD:26 | +| test.rs:490:39:490:50 | &mut reader2 [&ref] | test.rs:490:30:490:51 | ...::new(...) [Pin, &ref] | provenance | MaD:27 | +| test.rs:490:44:490:50 | reader2 | test.rs:490:39:490:50 | &mut reader2 [&ref] | provenance | | +| test.rs:491:19:491:24 | pinned | test.rs:491:18:491:24 | &pinned | provenance | | +| test.rs:491:19:491:24 | pinned [Pin, &ref] | test.rs:491:18:491:24 | &pinned | provenance | | +| test.rs:493:17:493:22 | buffer [Ready, Ok] | test.rs:494:19:494:24 | buffer [Ready, Ok] | provenance | | +| test.rs:493:17:493:22 | buffer [Ready, Ok] | test.rs:495:20:495:39 | ...::Ready(...) [Ready, Ok] | provenance | | +| test.rs:493:26:493:31 | pinned | test.rs:493:26:493:54 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:11 | +| test.rs:493:26:493:54 | pinned.poll_fill_buf(...) [Ready, Ok] | test.rs:493:17:493:22 | buffer [Ready, Ok] | provenance | | +| test.rs:494:19:494:24 | buffer [Ready, Ok] | test.rs:494:18:494:24 | &buffer | provenance | | +| test.rs:495:20:495:39 | ...::Ready(...) [Ready, Ok] | test.rs:495:32:495:38 | Ok(...) [Ok] | provenance | | +| test.rs:495:32:495:38 | Ok(...) [Ok] | test.rs:495:35:495:37 | buf | provenance | | +| test.rs:495:35:495:37 | buf | test.rs:496:22:496:24 | buf | provenance | | +| test.rs:502:17:502:22 | buffer | test.rs:503:18:503:23 | buffer | provenance | | +| test.rs:502:26:502:32 | reader2 | test.rs:502:26:502:43 | reader2.fill_buf() [future, Ok] | provenance | MaD:13 | +| test.rs:502:26:502:43 | reader2.fill_buf() [future, Ok] | test.rs:502:26:502:49 | await ... [Ok] | provenance | | +| test.rs:502:26:502:49 | await ... [Ok] | test.rs:502:26:502:50 | TryExpr | provenance | | +| test.rs:502:26:502:50 | TryExpr | test.rs:502:17:502:22 | buffer | provenance | | +| test.rs:509:31:509:37 | reader2 | test.rs:509:57:509:65 | [post] &mut line [&ref] | provenance | MaD:15 | +| test.rs:509:57:509:65 | [post] &mut line [&ref] | test.rs:509:62:509:65 | [post] line | provenance | | +| test.rs:509:62:509:65 | [post] line | test.rs:510:19:510:22 | line | provenance | | +| test.rs:510:19:510:22 | line | test.rs:510:18:510:22 | &line | provenance | | +| test.rs:516:31:516:37 | reader2 | test.rs:516:49:516:57 | [post] &mut line [&ref] | provenance | MaD:14 | +| test.rs:516:49:516:57 | [post] &mut line [&ref] | test.rs:516:54:516:57 | [post] line | provenance | | +| test.rs:516:54:516:57 | [post] line | test.rs:517:19:517:22 | line | provenance | | +| test.rs:517:19:517:22 | line | test.rs:517:18:517:22 | &line | provenance | | +| test.rs:523:31:523:37 | reader2 | test.rs:523:51:523:61 | [post] &mut buffer [&ref] | provenance | MaD:17 | +| test.rs:523:51:523:61 | [post] &mut buffer [&ref] | test.rs:523:56:523:61 | [post] buffer | provenance | | +| test.rs:523:56:523:61 | [post] buffer | test.rs:524:19:524:24 | buffer | provenance | | +| test.rs:524:19:524:24 | buffer | test.rs:524:18:524:24 | &buffer | provenance | | nodes | test.rs:11:9:11:22 | remote_string1 | semmle.label | remote_string1 | | test.rs:11:26:11:62 | ...::get(...) | semmle.label | ...::get(...) | @@ -543,121 +543,91 @@ nodes | test.rs:350:49:350:54 | [post] buffer | semmle.label | [post] buffer | | test.rs:351:14:351:20 | &buffer | semmle.label | &buffer | | test.rs:351:15:351:20 | buffer | semmle.label | buffer | -| test.rs:373:13:373:15 | tcp | semmle.label | tcp | -| test.rs:373:19:373:41 | ...::connect(...) | semmle.label | ...::connect(...) | -| test.rs:373:19:373:41 | ...::connect(...) [future, Ok] | semmle.label | ...::connect(...) [future, Ok] | -| test.rs:373:19:373:47 | await ... [Ok] | semmle.label | await ... [Ok] | -| test.rs:373:19:373:48 | TryExpr | semmle.label | TryExpr | -| test.rs:374:14:374:17 | &tcp | semmle.label | &tcp | -| test.rs:374:15:374:17 | tcp | semmle.label | tcp | -| test.rs:380:13:380:22 | mut reader | semmle.label | mut reader | -| test.rs:380:26:380:60 | connector.connect(...) [future, Ok] | semmle.label | connector.connect(...) [future, Ok] | -| test.rs:380:26:380:66 | await ... [Ok] | semmle.label | await ... [Ok] | -| test.rs:380:26:380:67 | TryExpr | semmle.label | TryExpr | -| test.rs:380:57:380:59 | tcp | semmle.label | tcp | -| test.rs:381:14:381:20 | &reader | semmle.label | &reader | -| test.rs:381:15:381:20 | reader | semmle.label | reader | -| test.rs:386:17:386:26 | mut pinned | semmle.label | mut pinned | -| test.rs:386:17:386:26 | mut pinned [Pin, &ref] | semmle.label | mut pinned [Pin, &ref] | -| test.rs:386:30:386:50 | ...::new(...) | semmle.label | ...::new(...) | -| test.rs:386:30:386:50 | ...::new(...) [Pin, &ref] | semmle.label | ...::new(...) [Pin, &ref] | -| test.rs:386:39:386:49 | &mut reader [&ref] | semmle.label | &mut reader [&ref] | -| test.rs:386:44:386:49 | reader | semmle.label | reader | -| test.rs:387:18:387:24 | &pinned | semmle.label | &pinned | -| test.rs:387:19:387:24 | pinned | semmle.label | pinned | -| test.rs:387:19:387:24 | pinned [Pin, &ref] | semmle.label | pinned [Pin, &ref] | -| test.rs:389:30:389:35 | pinned | semmle.label | pinned | -| test.rs:389:56:389:66 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | -| test.rs:389:61:389:66 | [post] buffer | semmle.label | [post] buffer | -| test.rs:391:22:391:28 | &buffer | semmle.label | &buffer | -| test.rs:391:23:391:28 | buffer | semmle.label | buffer | -| test.rs:392:22:392:33 | &... | semmle.label | &... | -| test.rs:392:23:392:28 | buffer | semmle.label | buffer | -| test.rs:392:23:392:33 | buffer[...] | semmle.label | buffer[...] | -| test.rs:399:63:399:73 | &mut reader [&ref] | semmle.label | &mut reader [&ref] | -| test.rs:399:68:399:73 | reader | semmle.label | reader | -| test.rs:399:76:399:87 | [post] &mut buffer1 [&ref] | semmle.label | [post] &mut buffer1 [&ref] | -| test.rs:399:81:399:87 | [post] buffer1 | semmle.label | [post] buffer1 | -| test.rs:400:18:400:40 | &... | semmle.label | &... | -| test.rs:400:19:400:25 | buffer1 | semmle.label | buffer1 | -| test.rs:400:19:400:40 | buffer1[...] | semmle.label | buffer1[...] | -| test.rs:403:31:403:36 | reader | semmle.label | reader | -| test.rs:403:43:403:54 | [post] &mut buffer2 [&ref] | semmle.label | [post] &mut buffer2 [&ref] | -| test.rs:403:48:403:54 | [post] buffer2 | semmle.label | [post] buffer2 | -| test.rs:405:18:405:40 | &... | semmle.label | &... | -| test.rs:405:19:405:25 | buffer2 | semmle.label | buffer2 | -| test.rs:405:19:405:40 | buffer2[...] | semmle.label | buffer2[...] | -| test.rs:408:13:408:23 | mut reader2 | semmle.label | mut reader2 | -| test.rs:408:27:408:61 | ...::new(...) | semmle.label | ...::new(...) | -| test.rs:408:55:408:60 | reader | semmle.label | reader | -| test.rs:409:14:409:21 | &reader2 | semmle.label | &reader2 | -| test.rs:409:15:409:21 | reader2 | semmle.label | reader2 | -| test.rs:413:17:413:26 | mut pinned | semmle.label | mut pinned | -| test.rs:413:17:413:26 | mut pinned [Pin, &ref] | semmle.label | mut pinned [Pin, &ref] | -| test.rs:413:30:413:51 | ...::new(...) | semmle.label | ...::new(...) | -| test.rs:413:30:413:51 | ...::new(...) [Pin, &ref] | semmle.label | ...::new(...) [Pin, &ref] | -| test.rs:413:39:413:50 | &mut reader2 [&ref] | semmle.label | &mut reader2 [&ref] | -| test.rs:413:44:413:50 | reader2 | semmle.label | reader2 | -| test.rs:414:18:414:24 | &pinned | semmle.label | &pinned | -| test.rs:414:19:414:24 | pinned | semmle.label | pinned | -| test.rs:414:19:414:24 | pinned [Pin, &ref] | semmle.label | pinned [Pin, &ref] | -| test.rs:416:17:416:22 | buffer [Ready, Ok] | semmle.label | buffer [Ready, Ok] | -| test.rs:416:26:416:31 | pinned | semmle.label | pinned | -| test.rs:416:26:416:54 | pinned.poll_fill_buf(...) [Ready, Ok] | semmle.label | pinned.poll_fill_buf(...) [Ready, Ok] | -| test.rs:417:20:417:39 | ...::Ready(...) [Ready, Ok] | semmle.label | ...::Ready(...) [Ready, Ok] | -| test.rs:417:32:417:38 | Ok(...) [Ok] | semmle.label | Ok(...) [Ok] | -| test.rs:417:35:417:37 | buf | semmle.label | buf | -| test.rs:418:22:418:28 | &buffer | semmle.label | &buffer | -| test.rs:418:23:418:28 | buffer [Ready, Ok] | semmle.label | buffer [Ready, Ok] | -| test.rs:419:22:419:24 | buf | semmle.label | buf | -| test.rs:423:17:423:23 | buffer2 [Ready, Ok] | semmle.label | buffer2 [Ready, Ok] | -| test.rs:423:27:423:48 | ...::new(...) | semmle.label | ...::new(...) | -| test.rs:423:27:423:71 | ... .poll_fill_buf(...) [Ready, Ok] | semmle.label | ... .poll_fill_buf(...) [Ready, Ok] | -| test.rs:423:36:423:47 | &mut reader2 [&ref] | semmle.label | &mut reader2 [&ref] | -| test.rs:423:41:423:47 | reader2 | semmle.label | reader2 | -| test.rs:424:20:424:26 | buffer2 [Ready, Ok] | semmle.label | buffer2 [Ready, Ok] | -| test.rs:425:17:425:36 | ...::Ready(...) [Ready, Ok] | semmle.label | ...::Ready(...) [Ready, Ok] | -| test.rs:425:29:425:35 | Ok(...) [Ok] | semmle.label | Ok(...) [Ok] | -| test.rs:425:32:425:34 | buf | semmle.label | buf | -| test.rs:426:26:426:33 | &buffer2 | semmle.label | &buffer2 | -| test.rs:426:27:426:33 | buffer2 [Ready, Ok] | semmle.label | buffer2 [Ready, Ok] | -| test.rs:427:26:427:28 | buf | semmle.label | buf | -| test.rs:437:17:437:22 | buffer | semmle.label | buffer | -| test.rs:437:26:437:32 | reader2 | semmle.label | reader2 | -| test.rs:437:26:437:43 | reader2.fill_buf() [future, Ok] | semmle.label | reader2.fill_buf() [future, Ok] | -| test.rs:437:26:437:49 | await ... [Ok] | semmle.label | await ... [Ok] | -| test.rs:437:26:437:50 | TryExpr | semmle.label | TryExpr | -| test.rs:438:18:438:23 | buffer | semmle.label | buffer | -| test.rs:444:17:444:26 | mut pinned | semmle.label | mut pinned | -| test.rs:444:17:444:26 | mut pinned [Pin, &ref] | semmle.label | mut pinned [Pin, &ref] | -| test.rs:444:30:444:51 | ...::new(...) | semmle.label | ...::new(...) | -| test.rs:444:30:444:51 | ...::new(...) [Pin, &ref] | semmle.label | ...::new(...) [Pin, &ref] | -| test.rs:444:39:444:50 | &mut reader2 [&ref] | semmle.label | &mut reader2 [&ref] | -| test.rs:444:44:444:50 | reader2 | semmle.label | reader2 | -| test.rs:445:18:445:24 | &pinned | semmle.label | &pinned | -| test.rs:445:19:445:24 | pinned | semmle.label | pinned | -| test.rs:445:19:445:24 | pinned [Pin, &ref] | semmle.label | pinned [Pin, &ref] | -| test.rs:447:30:447:35 | pinned | semmle.label | pinned | -| test.rs:447:56:447:66 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | -| test.rs:447:61:447:66 | [post] buffer | semmle.label | [post] buffer | -| test.rs:448:18:448:24 | &buffer | semmle.label | &buffer | -| test.rs:448:19:448:24 | buffer | semmle.label | buffer | -| test.rs:450:22:450:33 | &... | semmle.label | &... | -| test.rs:450:23:450:28 | buffer | semmle.label | buffer | -| test.rs:450:23:450:33 | buffer[...] | semmle.label | buffer[...] | -| test.rs:457:63:457:74 | &mut reader2 [&ref] | semmle.label | &mut reader2 [&ref] | -| test.rs:457:68:457:74 | reader2 | semmle.label | reader2 | -| test.rs:457:77:457:88 | [post] &mut buffer1 [&ref] | semmle.label | [post] &mut buffer1 [&ref] | -| test.rs:457:82:457:88 | [post] buffer1 | semmle.label | [post] buffer1 | -| test.rs:458:18:458:40 | &... | semmle.label | &... | -| test.rs:458:19:458:25 | buffer1 | semmle.label | buffer1 | -| test.rs:458:19:458:40 | buffer1[...] | semmle.label | buffer1[...] | -| test.rs:461:31:461:37 | reader2 | semmle.label | reader2 | -| test.rs:461:44:461:55 | [post] &mut buffer2 [&ref] | semmle.label | [post] &mut buffer2 [&ref] | -| test.rs:461:49:461:55 | [post] buffer2 | semmle.label | [post] buffer2 | -| test.rs:462:18:462:40 | &... | semmle.label | &... | -| test.rs:462:19:462:25 | buffer2 | semmle.label | buffer2 | -| test.rs:462:19:462:40 | buffer2[...] | semmle.label | buffer2[...] | +| test.rs:396:13:396:15 | tcp | semmle.label | tcp | +| test.rs:396:19:396:41 | ...::connect(...) | semmle.label | ...::connect(...) | +| test.rs:396:19:396:41 | ...::connect(...) [future, Ok] | semmle.label | ...::connect(...) [future, Ok] | +| test.rs:396:19:396:47 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:396:19:396:48 | TryExpr | semmle.label | TryExpr | +| test.rs:397:14:397:17 | &tcp | semmle.label | &tcp | +| test.rs:397:15:397:17 | tcp | semmle.label | tcp | +| test.rs:403:13:403:22 | mut reader | semmle.label | mut reader | +| test.rs:403:26:403:60 | connector.connect(...) [future, Ok] | semmle.label | connector.connect(...) [future, Ok] | +| test.rs:403:26:403:66 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:403:26:403:67 | TryExpr | semmle.label | TryExpr | +| test.rs:403:57:403:59 | tcp | semmle.label | tcp | +| test.rs:404:14:404:20 | &reader | semmle.label | &reader | +| test.rs:404:15:404:20 | reader | semmle.label | reader | +| test.rs:409:17:409:26 | mut pinned | semmle.label | mut pinned | +| test.rs:409:17:409:26 | mut pinned [Pin, &ref] | semmle.label | mut pinned [Pin, &ref] | +| test.rs:409:30:409:50 | ...::new(...) | semmle.label | ...::new(...) | +| test.rs:409:30:409:50 | ...::new(...) [Pin, &ref] | semmle.label | ...::new(...) [Pin, &ref] | +| test.rs:409:39:409:49 | &mut reader [&ref] | semmle.label | &mut reader [&ref] | +| test.rs:409:44:409:49 | reader | semmle.label | reader | +| test.rs:410:18:410:24 | &pinned | semmle.label | &pinned | +| test.rs:410:19:410:24 | pinned | semmle.label | pinned | +| test.rs:410:19:410:24 | pinned [Pin, &ref] | semmle.label | pinned [Pin, &ref] | +| test.rs:412:30:412:35 | pinned | semmle.label | pinned | +| test.rs:412:56:412:66 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:412:61:412:66 | [post] buffer | semmle.label | [post] buffer | +| test.rs:414:22:414:28 | &buffer | semmle.label | &buffer | +| test.rs:414:23:414:28 | buffer | semmle.label | buffer | +| test.rs:415:22:415:33 | &... | semmle.label | &... | +| test.rs:415:23:415:28 | buffer | semmle.label | buffer | +| test.rs:415:23:415:33 | buffer[...] | semmle.label | buffer[...] | +| test.rs:422:63:422:73 | &mut reader [&ref] | semmle.label | &mut reader [&ref] | +| test.rs:422:68:422:73 | reader | semmle.label | reader | +| test.rs:422:76:422:87 | [post] &mut buffer1 [&ref] | semmle.label | [post] &mut buffer1 [&ref] | +| test.rs:422:81:422:87 | [post] buffer1 | semmle.label | [post] buffer1 | +| test.rs:423:18:423:40 | &... | semmle.label | &... | +| test.rs:423:19:423:25 | buffer1 | semmle.label | buffer1 | +| test.rs:423:19:423:40 | buffer1[...] | semmle.label | buffer1[...] | +| test.rs:426:31:426:36 | reader | semmle.label | reader | +| test.rs:426:43:426:54 | [post] &mut buffer2 [&ref] | semmle.label | [post] &mut buffer2 [&ref] | +| test.rs:426:48:426:54 | [post] buffer2 | semmle.label | [post] buffer2 | +| test.rs:428:18:428:40 | &... | semmle.label | &... | +| test.rs:428:19:428:25 | buffer2 | semmle.label | buffer2 | +| test.rs:428:19:428:40 | buffer2[...] | semmle.label | buffer2[...] | +| test.rs:431:13:431:23 | mut reader2 | semmle.label | mut reader2 | +| test.rs:431:27:431:61 | ...::new(...) | semmle.label | ...::new(...) | +| test.rs:431:55:431:60 | reader | semmle.label | reader | +| test.rs:432:14:432:21 | &reader2 | semmle.label | &reader2 | +| test.rs:432:15:432:21 | reader2 | semmle.label | reader2 | +| test.rs:436:17:436:26 | mut pinned | semmle.label | mut pinned | +| test.rs:436:17:436:26 | mut pinned [Pin, &ref] | semmle.label | mut pinned [Pin, &ref] | +| test.rs:436:30:436:51 | ...::new(...) | semmle.label | ...::new(...) | +| test.rs:436:30:436:51 | ...::new(...) [Pin, &ref] | semmle.label | ...::new(...) [Pin, &ref] | +| test.rs:436:39:436:50 | &mut reader2 [&ref] | semmle.label | &mut reader2 [&ref] | +| test.rs:436:44:436:50 | reader2 | semmle.label | reader2 | +| test.rs:437:18:437:24 | &pinned | semmle.label | &pinned | +| test.rs:437:19:437:24 | pinned | semmle.label | pinned | +| test.rs:437:19:437:24 | pinned [Pin, &ref] | semmle.label | pinned [Pin, &ref] | +| test.rs:439:17:439:22 | buffer [Ready, Ok] | semmle.label | buffer [Ready, Ok] | +| test.rs:439:26:439:31 | pinned | semmle.label | pinned | +| test.rs:439:26:439:54 | pinned.poll_fill_buf(...) [Ready, Ok] | semmle.label | pinned.poll_fill_buf(...) [Ready, Ok] | +| test.rs:440:20:440:39 | ...::Ready(...) [Ready, Ok] | semmle.label | ...::Ready(...) [Ready, Ok] | +| test.rs:440:32:440:38 | Ok(...) [Ok] | semmle.label | Ok(...) [Ok] | +| test.rs:440:35:440:37 | buf | semmle.label | buf | +| test.rs:441:22:441:28 | &buffer | semmle.label | &buffer | +| test.rs:441:23:441:28 | buffer [Ready, Ok] | semmle.label | buffer [Ready, Ok] | +| test.rs:442:22:442:24 | buf | semmle.label | buf | +| test.rs:446:17:446:23 | buffer2 [Ready, Ok] | semmle.label | buffer2 [Ready, Ok] | +| test.rs:446:27:446:48 | ...::new(...) | semmle.label | ...::new(...) | +| test.rs:446:27:446:71 | ... .poll_fill_buf(...) [Ready, Ok] | semmle.label | ... .poll_fill_buf(...) [Ready, Ok] | +| test.rs:446:36:446:47 | &mut reader2 [&ref] | semmle.label | &mut reader2 [&ref] | +| test.rs:446:41:446:47 | reader2 | semmle.label | reader2 | +| test.rs:447:20:447:26 | buffer2 [Ready, Ok] | semmle.label | buffer2 [Ready, Ok] | +| test.rs:448:17:448:36 | ...::Ready(...) [Ready, Ok] | semmle.label | ...::Ready(...) [Ready, Ok] | +| test.rs:448:29:448:35 | Ok(...) [Ok] | semmle.label | Ok(...) [Ok] | +| test.rs:448:32:448:34 | buf | semmle.label | buf | +| test.rs:449:26:449:33 | &buffer2 | semmle.label | &buffer2 | +| test.rs:449:27:449:33 | buffer2 [Ready, Ok] | semmle.label | buffer2 [Ready, Ok] | +| test.rs:450:26:450:28 | buf | semmle.label | buf | +| test.rs:460:17:460:22 | buffer | semmle.label | buffer | +| test.rs:460:26:460:32 | reader2 | semmle.label | reader2 | +| test.rs:460:26:460:43 | reader2.fill_buf() [future, Ok] | semmle.label | reader2.fill_buf() [future, Ok] | +| test.rs:460:26:460:49 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:460:26:460:50 | TryExpr | semmle.label | TryExpr | +| test.rs:461:18:461:23 | buffer | semmle.label | buffer | | test.rs:467:17:467:26 | mut pinned | semmle.label | mut pinned | | test.rs:467:17:467:26 | mut pinned [Pin, &ref] | semmle.label | mut pinned [Pin, &ref] | | test.rs:467:30:467:51 | ...::new(...) | semmle.label | ...::new(...) | @@ -667,36 +637,66 @@ nodes | test.rs:468:18:468:24 | &pinned | semmle.label | &pinned | | test.rs:468:19:468:24 | pinned | semmle.label | pinned | | test.rs:468:19:468:24 | pinned [Pin, &ref] | semmle.label | pinned [Pin, &ref] | -| test.rs:470:17:470:22 | buffer [Ready, Ok] | semmle.label | buffer [Ready, Ok] | -| test.rs:470:26:470:31 | pinned | semmle.label | pinned | -| test.rs:470:26:470:54 | pinned.poll_fill_buf(...) [Ready, Ok] | semmle.label | pinned.poll_fill_buf(...) [Ready, Ok] | +| test.rs:470:30:470:35 | pinned | semmle.label | pinned | +| test.rs:470:56:470:66 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:470:61:470:66 | [post] buffer | semmle.label | [post] buffer | | test.rs:471:18:471:24 | &buffer | semmle.label | &buffer | -| test.rs:471:19:471:24 | buffer [Ready, Ok] | semmle.label | buffer [Ready, Ok] | -| test.rs:472:20:472:39 | ...::Ready(...) [Ready, Ok] | semmle.label | ...::Ready(...) [Ready, Ok] | -| test.rs:472:32:472:38 | Ok(...) [Ok] | semmle.label | Ok(...) [Ok] | -| test.rs:472:35:472:37 | buf | semmle.label | buf | -| test.rs:473:22:473:24 | buf | semmle.label | buf | -| test.rs:479:17:479:22 | buffer | semmle.label | buffer | -| test.rs:479:26:479:32 | reader2 | semmle.label | reader2 | -| test.rs:479:26:479:43 | reader2.fill_buf() [future, Ok] | semmle.label | reader2.fill_buf() [future, Ok] | -| test.rs:479:26:479:49 | await ... [Ok] | semmle.label | await ... [Ok] | -| test.rs:479:26:479:50 | TryExpr | semmle.label | TryExpr | -| test.rs:480:18:480:23 | buffer | semmle.label | buffer | -| test.rs:486:31:486:37 | reader2 | semmle.label | reader2 | -| test.rs:486:57:486:65 | [post] &mut line [&ref] | semmle.label | [post] &mut line [&ref] | -| test.rs:486:62:486:65 | [post] line | semmle.label | [post] line | -| test.rs:487:18:487:22 | &line | semmle.label | &line | -| test.rs:487:19:487:22 | line | semmle.label | line | -| test.rs:493:31:493:37 | reader2 | semmle.label | reader2 | -| test.rs:493:49:493:57 | [post] &mut line [&ref] | semmle.label | [post] &mut line [&ref] | -| test.rs:493:54:493:57 | [post] line | semmle.label | [post] line | -| test.rs:494:18:494:22 | &line | semmle.label | &line | -| test.rs:494:19:494:22 | line | semmle.label | line | -| test.rs:500:31:500:37 | reader2 | semmle.label | reader2 | -| test.rs:500:51:500:61 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | -| test.rs:500:56:500:61 | [post] buffer | semmle.label | [post] buffer | -| test.rs:501:18:501:24 | &buffer | semmle.label | &buffer | -| test.rs:501:19:501:24 | buffer | semmle.label | buffer | +| test.rs:471:19:471:24 | buffer | semmle.label | buffer | +| test.rs:473:22:473:33 | &... | semmle.label | &... | +| test.rs:473:23:473:28 | buffer | semmle.label | buffer | +| test.rs:473:23:473:33 | buffer[...] | semmle.label | buffer[...] | +| test.rs:480:63:480:74 | &mut reader2 [&ref] | semmle.label | &mut reader2 [&ref] | +| test.rs:480:68:480:74 | reader2 | semmle.label | reader2 | +| test.rs:480:77:480:88 | [post] &mut buffer1 [&ref] | semmle.label | [post] &mut buffer1 [&ref] | +| test.rs:480:82:480:88 | [post] buffer1 | semmle.label | [post] buffer1 | +| test.rs:481:18:481:40 | &... | semmle.label | &... | +| test.rs:481:19:481:25 | buffer1 | semmle.label | buffer1 | +| test.rs:481:19:481:40 | buffer1[...] | semmle.label | buffer1[...] | +| test.rs:484:31:484:37 | reader2 | semmle.label | reader2 | +| test.rs:484:44:484:55 | [post] &mut buffer2 [&ref] | semmle.label | [post] &mut buffer2 [&ref] | +| test.rs:484:49:484:55 | [post] buffer2 | semmle.label | [post] buffer2 | +| test.rs:485:18:485:40 | &... | semmle.label | &... | +| test.rs:485:19:485:25 | buffer2 | semmle.label | buffer2 | +| test.rs:485:19:485:40 | buffer2[...] | semmle.label | buffer2[...] | +| test.rs:490:17:490:26 | mut pinned | semmle.label | mut pinned | +| test.rs:490:17:490:26 | mut pinned [Pin, &ref] | semmle.label | mut pinned [Pin, &ref] | +| test.rs:490:30:490:51 | ...::new(...) | semmle.label | ...::new(...) | +| test.rs:490:30:490:51 | ...::new(...) [Pin, &ref] | semmle.label | ...::new(...) [Pin, &ref] | +| test.rs:490:39:490:50 | &mut reader2 [&ref] | semmle.label | &mut reader2 [&ref] | +| test.rs:490:44:490:50 | reader2 | semmle.label | reader2 | +| test.rs:491:18:491:24 | &pinned | semmle.label | &pinned | +| test.rs:491:19:491:24 | pinned | semmle.label | pinned | +| test.rs:491:19:491:24 | pinned [Pin, &ref] | semmle.label | pinned [Pin, &ref] | +| test.rs:493:17:493:22 | buffer [Ready, Ok] | semmle.label | buffer [Ready, Ok] | +| test.rs:493:26:493:31 | pinned | semmle.label | pinned | +| test.rs:493:26:493:54 | pinned.poll_fill_buf(...) [Ready, Ok] | semmle.label | pinned.poll_fill_buf(...) [Ready, Ok] | +| test.rs:494:18:494:24 | &buffer | semmle.label | &buffer | +| test.rs:494:19:494:24 | buffer [Ready, Ok] | semmle.label | buffer [Ready, Ok] | +| test.rs:495:20:495:39 | ...::Ready(...) [Ready, Ok] | semmle.label | ...::Ready(...) [Ready, Ok] | +| test.rs:495:32:495:38 | Ok(...) [Ok] | semmle.label | Ok(...) [Ok] | +| test.rs:495:35:495:37 | buf | semmle.label | buf | +| test.rs:496:22:496:24 | buf | semmle.label | buf | +| test.rs:502:17:502:22 | buffer | semmle.label | buffer | +| test.rs:502:26:502:32 | reader2 | semmle.label | reader2 | +| test.rs:502:26:502:43 | reader2.fill_buf() [future, Ok] | semmle.label | reader2.fill_buf() [future, Ok] | +| test.rs:502:26:502:49 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:502:26:502:50 | TryExpr | semmle.label | TryExpr | +| test.rs:503:18:503:23 | buffer | semmle.label | buffer | +| test.rs:509:31:509:37 | reader2 | semmle.label | reader2 | +| test.rs:509:57:509:65 | [post] &mut line [&ref] | semmle.label | [post] &mut line [&ref] | +| test.rs:509:62:509:65 | [post] line | semmle.label | [post] line | +| test.rs:510:18:510:22 | &line | semmle.label | &line | +| test.rs:510:19:510:22 | line | semmle.label | line | +| test.rs:516:31:516:37 | reader2 | semmle.label | reader2 | +| test.rs:516:49:516:57 | [post] &mut line [&ref] | semmle.label | [post] &mut line [&ref] | +| test.rs:516:54:516:57 | [post] line | semmle.label | [post] line | +| test.rs:517:18:517:22 | &line | semmle.label | &line | +| test.rs:517:19:517:22 | line | semmle.label | line | +| test.rs:523:31:523:37 | reader2 | semmle.label | reader2 | +| test.rs:523:51:523:61 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:523:56:523:61 | [post] buffer | semmle.label | [post] buffer | +| test.rs:524:18:524:24 | &buffer | semmle.label | &buffer | +| test.rs:524:19:524:24 | buffer | semmle.label | buffer | subpaths testFailures #select @@ -728,29 +728,29 @@ testFailures | test.rs:339:14:339:20 | &buffer | test.rs:332:22:332:75 | ...::new(...) | test.rs:339:14:339:20 | &buffer | $@ | test.rs:332:22:332:75 | ...::new(...) | ...::new(...) | | test.rs:345:14:345:20 | &buffer | test.rs:332:22:332:75 | ...::new(...) | test.rs:345:14:345:20 | &buffer | $@ | test.rs:332:22:332:75 | ...::new(...) | ...::new(...) | | test.rs:351:14:351:20 | &buffer | test.rs:332:22:332:75 | ...::new(...) | test.rs:351:14:351:20 | &buffer | $@ | test.rs:332:22:332:75 | ...::new(...) | ...::new(...) | -| test.rs:374:14:374:17 | &tcp | test.rs:373:19:373:41 | ...::connect(...) | test.rs:374:14:374:17 | &tcp | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | -| test.rs:381:14:381:20 | &reader | test.rs:373:19:373:41 | ...::connect(...) | test.rs:381:14:381:20 | &reader | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | -| test.rs:387:18:387:24 | &pinned | test.rs:373:19:373:41 | ...::connect(...) | test.rs:387:18:387:24 | &pinned | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | -| test.rs:391:22:391:28 | &buffer | test.rs:373:19:373:41 | ...::connect(...) | test.rs:391:22:391:28 | &buffer | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | -| test.rs:392:22:392:33 | &... | test.rs:373:19:373:41 | ...::connect(...) | test.rs:392:22:392:33 | &... | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | -| test.rs:400:18:400:40 | &... | test.rs:373:19:373:41 | ...::connect(...) | test.rs:400:18:400:40 | &... | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | -| test.rs:405:18:405:40 | &... | test.rs:373:19:373:41 | ...::connect(...) | test.rs:405:18:405:40 | &... | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | -| test.rs:409:14:409:21 | &reader2 | test.rs:373:19:373:41 | ...::connect(...) | test.rs:409:14:409:21 | &reader2 | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | -| test.rs:414:18:414:24 | &pinned | test.rs:373:19:373:41 | ...::connect(...) | test.rs:414:18:414:24 | &pinned | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | -| test.rs:418:22:418:28 | &buffer | test.rs:373:19:373:41 | ...::connect(...) | test.rs:418:22:418:28 | &buffer | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | -| test.rs:419:22:419:24 | buf | test.rs:373:19:373:41 | ...::connect(...) | test.rs:419:22:419:24 | buf | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | -| test.rs:426:26:426:33 | &buffer2 | test.rs:373:19:373:41 | ...::connect(...) | test.rs:426:26:426:33 | &buffer2 | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | -| test.rs:427:26:427:28 | buf | test.rs:373:19:373:41 | ...::connect(...) | test.rs:427:26:427:28 | buf | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | -| test.rs:438:18:438:23 | buffer | test.rs:373:19:373:41 | ...::connect(...) | test.rs:438:18:438:23 | buffer | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | -| test.rs:445:18:445:24 | &pinned | test.rs:373:19:373:41 | ...::connect(...) | test.rs:445:18:445:24 | &pinned | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | -| test.rs:448:18:448:24 | &buffer | test.rs:373:19:373:41 | ...::connect(...) | test.rs:448:18:448:24 | &buffer | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | -| test.rs:450:22:450:33 | &... | test.rs:373:19:373:41 | ...::connect(...) | test.rs:450:22:450:33 | &... | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | -| test.rs:458:18:458:40 | &... | test.rs:373:19:373:41 | ...::connect(...) | test.rs:458:18:458:40 | &... | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | -| test.rs:462:18:462:40 | &... | test.rs:373:19:373:41 | ...::connect(...) | test.rs:462:18:462:40 | &... | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | -| test.rs:468:18:468:24 | &pinned | test.rs:373:19:373:41 | ...::connect(...) | test.rs:468:18:468:24 | &pinned | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | -| test.rs:471:18:471:24 | &buffer | test.rs:373:19:373:41 | ...::connect(...) | test.rs:471:18:471:24 | &buffer | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | -| test.rs:473:22:473:24 | buf | test.rs:373:19:373:41 | ...::connect(...) | test.rs:473:22:473:24 | buf | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | -| test.rs:480:18:480:23 | buffer | test.rs:373:19:373:41 | ...::connect(...) | test.rs:480:18:480:23 | buffer | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | -| test.rs:487:18:487:22 | &line | test.rs:373:19:373:41 | ...::connect(...) | test.rs:487:18:487:22 | &line | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | -| test.rs:494:18:494:22 | &line | test.rs:373:19:373:41 | ...::connect(...) | test.rs:494:18:494:22 | &line | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | -| test.rs:501:18:501:24 | &buffer | test.rs:373:19:373:41 | ...::connect(...) | test.rs:501:18:501:24 | &buffer | $@ | test.rs:373:19:373:41 | ...::connect(...) | ...::connect(...) | +| test.rs:397:14:397:17 | &tcp | test.rs:396:19:396:41 | ...::connect(...) | test.rs:397:14:397:17 | &tcp | $@ | test.rs:396:19:396:41 | ...::connect(...) | ...::connect(...) | +| test.rs:404:14:404:20 | &reader | test.rs:396:19:396:41 | ...::connect(...) | test.rs:404:14:404:20 | &reader | $@ | test.rs:396:19:396:41 | ...::connect(...) | ...::connect(...) | +| test.rs:410:18:410:24 | &pinned | test.rs:396:19:396:41 | ...::connect(...) | test.rs:410:18:410:24 | &pinned | $@ | test.rs:396:19:396:41 | ...::connect(...) | ...::connect(...) | +| test.rs:414:22:414:28 | &buffer | test.rs:396:19:396:41 | ...::connect(...) | test.rs:414:22:414:28 | &buffer | $@ | test.rs:396:19:396:41 | ...::connect(...) | ...::connect(...) | +| test.rs:415:22:415:33 | &... | test.rs:396:19:396:41 | ...::connect(...) | test.rs:415:22:415:33 | &... | $@ | test.rs:396:19:396:41 | ...::connect(...) | ...::connect(...) | +| test.rs:423:18:423:40 | &... | test.rs:396:19:396:41 | ...::connect(...) | test.rs:423:18:423:40 | &... | $@ | test.rs:396:19:396:41 | ...::connect(...) | ...::connect(...) | +| test.rs:428:18:428:40 | &... | test.rs:396:19:396:41 | ...::connect(...) | test.rs:428:18:428:40 | &... | $@ | test.rs:396:19:396:41 | ...::connect(...) | ...::connect(...) | +| test.rs:432:14:432:21 | &reader2 | test.rs:396:19:396:41 | ...::connect(...) | test.rs:432:14:432:21 | &reader2 | $@ | test.rs:396:19:396:41 | ...::connect(...) | ...::connect(...) | +| test.rs:437:18:437:24 | &pinned | test.rs:396:19:396:41 | ...::connect(...) | test.rs:437:18:437:24 | &pinned | $@ | test.rs:396:19:396:41 | ...::connect(...) | ...::connect(...) | +| test.rs:441:22:441:28 | &buffer | test.rs:396:19:396:41 | ...::connect(...) | test.rs:441:22:441:28 | &buffer | $@ | test.rs:396:19:396:41 | ...::connect(...) | ...::connect(...) | +| test.rs:442:22:442:24 | buf | test.rs:396:19:396:41 | ...::connect(...) | test.rs:442:22:442:24 | buf | $@ | test.rs:396:19:396:41 | ...::connect(...) | ...::connect(...) | +| test.rs:449:26:449:33 | &buffer2 | test.rs:396:19:396:41 | ...::connect(...) | test.rs:449:26:449:33 | &buffer2 | $@ | test.rs:396:19:396:41 | ...::connect(...) | ...::connect(...) | +| test.rs:450:26:450:28 | buf | test.rs:396:19:396:41 | ...::connect(...) | test.rs:450:26:450:28 | buf | $@ | test.rs:396:19:396:41 | ...::connect(...) | ...::connect(...) | +| test.rs:461:18:461:23 | buffer | test.rs:396:19:396:41 | ...::connect(...) | test.rs:461:18:461:23 | buffer | $@ | test.rs:396:19:396:41 | ...::connect(...) | ...::connect(...) | +| test.rs:468:18:468:24 | &pinned | test.rs:396:19:396:41 | ...::connect(...) | test.rs:468:18:468:24 | &pinned | $@ | test.rs:396:19:396:41 | ...::connect(...) | ...::connect(...) | +| test.rs:471:18:471:24 | &buffer | test.rs:396:19:396:41 | ...::connect(...) | test.rs:471:18:471:24 | &buffer | $@ | test.rs:396:19:396:41 | ...::connect(...) | ...::connect(...) | +| test.rs:473:22:473:33 | &... | test.rs:396:19:396:41 | ...::connect(...) | test.rs:473:22:473:33 | &... | $@ | test.rs:396:19:396:41 | ...::connect(...) | ...::connect(...) | +| test.rs:481:18:481:40 | &... | test.rs:396:19:396:41 | ...::connect(...) | test.rs:481:18:481:40 | &... | $@ | test.rs:396:19:396:41 | ...::connect(...) | ...::connect(...) | +| test.rs:485:18:485:40 | &... | test.rs:396:19:396:41 | ...::connect(...) | test.rs:485:18:485:40 | &... | $@ | test.rs:396:19:396:41 | ...::connect(...) | ...::connect(...) | +| test.rs:491:18:491:24 | &pinned | test.rs:396:19:396:41 | ...::connect(...) | test.rs:491:18:491:24 | &pinned | $@ | test.rs:396:19:396:41 | ...::connect(...) | ...::connect(...) | +| test.rs:494:18:494:24 | &buffer | test.rs:396:19:396:41 | ...::connect(...) | test.rs:494:18:494:24 | &buffer | $@ | test.rs:396:19:396:41 | ...::connect(...) | ...::connect(...) | +| test.rs:496:22:496:24 | buf | test.rs:396:19:396:41 | ...::connect(...) | test.rs:496:22:496:24 | buf | $@ | test.rs:396:19:396:41 | ...::connect(...) | ...::connect(...) | +| test.rs:503:18:503:23 | buffer | test.rs:396:19:396:41 | ...::connect(...) | test.rs:503:18:503:23 | buffer | $@ | test.rs:396:19:396:41 | ...::connect(...) | ...::connect(...) | +| test.rs:510:18:510:22 | &line | test.rs:396:19:396:41 | ...::connect(...) | test.rs:510:18:510:22 | &line | $@ | test.rs:396:19:396:41 | ...::connect(...) | ...::connect(...) | +| test.rs:517:18:517:22 | &line | test.rs:396:19:396:41 | ...::connect(...) | test.rs:517:18:517:22 | &line | $@ | test.rs:396:19:396:41 | ...::connect(...) | ...::connect(...) | +| test.rs:524:18:524:24 | &buffer | test.rs:396:19:396:41 | ...::connect(...) | test.rs:524:18:524:24 | &buffer | $@ | test.rs:396:19:396:41 | ...::connect(...) | ...::connect(...) | diff --git a/rust/ql/test/library-tests/dataflow/sources/net/TaintSources.expected b/rust/ql/test/library-tests/dataflow/sources/net/TaintSources.expected index bf0333168e4b..78f45810e4d8 100644 --- a/rust/ql/test/library-tests/dataflow/sources/net/TaintSources.expected +++ b/rust/ql/test/library-tests/dataflow/sources/net/TaintSources.expected @@ -13,5 +13,6 @@ | test.rs:224:28:224:66 | ...::connect(...) | Flow source 'RemoteSource' of type remote (DEFAULT). | | test.rs:306:22:306:58 | ...::connect(...) | Flow source 'RemoteSource' of type remote (DEFAULT). | | test.rs:332:22:332:75 | ...::new(...) | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:373:19:373:41 | ...::connect(...) | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:519:16:519:31 | ...::args(...) | Flow source 'CommandLineArgs' of type commandargs (DEFAULT). | +| test.rs:359:18:359:54 | ...::connect(...) | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:396:19:396:41 | ...::connect(...) | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:542:16:542:31 | ...::args(...) | Flow source 'CommandLineArgs' of type commandargs (DEFAULT). | diff --git a/rust/ql/test/library-tests/dataflow/sources/net/options.yml b/rust/ql/test/library-tests/dataflow/sources/net/options.yml index 24cda1561c0f..d4a803ef79a6 100644 --- a/rust/ql/test/library-tests/dataflow/sources/net/options.yml +++ b/rust/ql/test/library-tests/dataflow/sources/net/options.yml @@ -10,3 +10,4 @@ qltest_dependencies: - rustls = { version = "0.23.27" } - futures-rustls = { version = "0.26.0" } - async-std = { version = "1.13.1" } + - native-tls = { version = "0.2.14" } diff --git a/rust/ql/test/library-tests/dataflow/sources/net/test.rs b/rust/ql/test/library-tests/dataflow/sources/net/test.rs index bb6f54cb913d..ee52f7a37cec 100644 --- a/rust/ql/test/library-tests/dataflow/sources/net/test.rs +++ b/rust/ql/test/library-tests/dataflow/sources/net/test.rs @@ -354,6 +354,29 @@ fn test_rustls() -> std::io::Result<()> { Ok(()) } +fn test_native_tls() -> Result<(), Box> { + let address = "www.example.com:443"; + let stream = std::net::TcpStream::connect(address)?; // $ Alert[rust/summary/taint-sources] + let connector = native_tls::TlsConnector::new()?; + let mut stream = connector.connect("www.example.com", stream)?; + sink(&stream); // $ MISSING: hasTaintFlow=address + + stream.write_all(b"GET / HTTP/1.1\r\nHost: www.example.com\r\nConnection: close\r\n\r\n")?; + + let mut buffer = [0u8; 100]; + let bytes_read = stream.read(&mut buffer)?; + println!("bytes_read = {}", bytes_read); + println!("buffer = {:?}", &buffer[..bytes_read]); + sink(&buffer[..bytes_read]); // $ MISSING: hasTaintFlow=address + + let mut response = String::new(); + stream.read_to_string(&mut response)?; + println!("rest of response = '{}'", response); + sink(response); // $ MISSING: hasTaintFlow=address + + Ok(()) +} + mod futures_rustls { use async_std::net::TcpStream; use async_std::sync::Arc; @@ -548,6 +571,12 @@ async fn main() -> Result<(), Box> { Err(e) => println!("error: {}", e), } + println!("test_native_tls..."); + match test_native_tls() { + Ok(_) => println!("complete"), + Err(e) => println!("error: {}", e), + } + println!("test_rustls..."); match test_rustls() { Ok(_) => println!("complete"), From 355c9662eba39bc2061f365197cc636b32c90bfe Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Thu, 13 Aug 2026 18:46:29 +0100 Subject: [PATCH 0377/2098] Rust: Add a few more models for native_tls and related crates. --- .../rust/frameworks/native-tls.model.yml | 8 ++ .../dataflow/sources/net/InlineFlow.expected | 94 ++++++++++++++----- .../dataflow/sources/net/test.rs | 6 +- 3 files changed, 80 insertions(+), 28 deletions(-) diff --git a/rust/ql/lib/codeql/rust/frameworks/native-tls.model.yml b/rust/ql/lib/codeql/rust/frameworks/native-tls.model.yml index 1da63eb7961a..5491e7e5fc23 100644 --- a/rust/ql/lib/codeql/rust/frameworks/native-tls.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/native-tls.model.yml @@ -7,3 +7,11 @@ extensions: - ["::danger_accept_invalid_hostnames", "Argument[0]", "disable-certificate", "manual"] - ["::danger_accept_invalid_certs", "Argument[0]", "disable-certificate", "manual"] - ["::danger_accept_invalid_hostnames", "Argument[0]", "disable-certificate", "manual"] + - addsTo: + pack: codeql/rust-all + extensible: summaryModel + data: + - ["::connect", "Argument[1]", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::connect", "Argument[1]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["async_native_tls::connect", "Argument[1]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::connect", "Argument[1]", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] diff --git a/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected index f9ab8bb801a1..8669b8288446 100644 --- a/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected @@ -32,47 +32,48 @@ models | 31 | Summary: ::body; Argument[self].Reference.Field[http::response::Response::body]; ReturnValue.Reference; value | | 32 | Summary: ::body_mut; Argument[self].Reference.Field[http::response::Response::body]; ReturnValue.Reference; value | | 33 | Summary: ::into_body; Argument[self].Field[http::response::Response::body]; ReturnValue; value | -| 34 | Summary: ::bytes; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 35 | Summary: ::chunk; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | -| 36 | Summary: ::text; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 37 | Summary: ::bytes; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 38 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 39 | Summary: ::text_with_charset; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 40 | Summary: ::new; Argument[0]; ReturnValue; taint | -| 41 | Summary: ::try_clone; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 42 | Summary: ::peek; Argument[self].Reference; Argument[0].Reference; taint | -| 43 | Summary: ::try_read; Argument[self].Reference; Argument[0].Reference; taint | -| 44 | Summary: ::try_read_buf; Argument[self].Reference; Argument[0].Reference; taint | +| 34 | Summary: ::connect; Argument[1]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 35 | Summary: ::bytes; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 36 | Summary: ::chunk; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | +| 37 | Summary: ::text; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 38 | Summary: ::bytes; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 39 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 40 | Summary: ::text_with_charset; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 41 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 42 | Summary: ::try_clone; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 43 | Summary: ::peek; Argument[self].Reference; Argument[0].Reference; taint | +| 44 | Summary: ::try_read; Argument[self].Reference; Argument[0].Reference; taint | +| 45 | Summary: ::try_read_buf; Argument[self].Reference; Argument[0].Reference; taint | edges | test.rs:11:9:11:22 | remote_string1 | test.rs:12:10:12:23 | remote_string1 | provenance | | | test.rs:11:26:11:62 | ...::get(...) | test.rs:11:26:11:62 | ...::get(...) [Ok] | provenance | Src:MaD:7 | | test.rs:11:26:11:62 | ...::get(...) [Ok] | test.rs:11:26:11:63 | TryExpr | provenance | | -| test.rs:11:26:11:63 | TryExpr | test.rs:11:26:11:70 | ... .text() [Ok] | provenance | MaD:38 | +| test.rs:11:26:11:63 | TryExpr | test.rs:11:26:11:70 | ... .text() [Ok] | provenance | MaD:39 | | test.rs:11:26:11:70 | ... .text() [Ok] | test.rs:11:26:11:71 | TryExpr | provenance | | | test.rs:11:26:11:71 | TryExpr | test.rs:11:9:11:22 | remote_string1 | provenance | | | test.rs:14:9:14:22 | remote_string2 | test.rs:15:10:15:23 | remote_string2 | provenance | | | test.rs:14:26:14:62 | ...::get(...) | test.rs:14:26:14:62 | ...::get(...) [Ok] | provenance | Src:MaD:7 | | test.rs:14:26:14:62 | ...::get(...) [Ok] | test.rs:14:26:14:71 | ... .unwrap() | provenance | MaD:28 | -| test.rs:14:26:14:71 | ... .unwrap() | test.rs:14:26:14:78 | ... .text() [Ok] | provenance | MaD:38 | +| test.rs:14:26:14:71 | ... .unwrap() | test.rs:14:26:14:78 | ... .text() [Ok] | provenance | MaD:39 | | test.rs:14:26:14:78 | ... .text() [Ok] | test.rs:14:26:14:87 | ... .unwrap() | provenance | MaD:28 | | test.rs:14:26:14:87 | ... .unwrap() | test.rs:14:9:14:22 | remote_string2 | provenance | | | test.rs:17:9:17:22 | remote_string3 | test.rs:18:10:18:23 | remote_string3 | provenance | | | test.rs:17:26:17:62 | ...::get(...) | test.rs:17:26:17:62 | ...::get(...) [Ok] | provenance | Src:MaD:7 | | test.rs:17:26:17:62 | ...::get(...) [Ok] | test.rs:17:26:17:71 | ... .unwrap() | provenance | MaD:28 | -| test.rs:17:26:17:71 | ... .unwrap() | test.rs:17:26:17:98 | ... .text_with_charset(...) [Ok] | provenance | MaD:39 | +| test.rs:17:26:17:71 | ... .unwrap() | test.rs:17:26:17:98 | ... .text_with_charset(...) [Ok] | provenance | MaD:40 | | test.rs:17:26:17:98 | ... .text_with_charset(...) [Ok] | test.rs:17:26:17:107 | ... .unwrap() | provenance | MaD:28 | | test.rs:17:26:17:107 | ... .unwrap() | test.rs:17:9:17:22 | remote_string3 | provenance | | | test.rs:20:9:20:22 | remote_string4 | test.rs:21:10:21:23 | remote_string4 | provenance | | | test.rs:20:26:20:62 | ...::get(...) | test.rs:20:26:20:62 | ...::get(...) [Ok] | provenance | Src:MaD:7 | | test.rs:20:26:20:62 | ...::get(...) [Ok] | test.rs:20:26:20:71 | ... .unwrap() | provenance | MaD:28 | -| test.rs:20:26:20:71 | ... .unwrap() | test.rs:20:26:20:79 | ... .bytes() [Ok] | provenance | MaD:37 | +| test.rs:20:26:20:71 | ... .unwrap() | test.rs:20:26:20:79 | ... .bytes() [Ok] | provenance | MaD:38 | | test.rs:20:26:20:79 | ... .bytes() [Ok] | test.rs:20:26:20:88 | ... .unwrap() | provenance | MaD:28 | | test.rs:20:26:20:88 | ... .unwrap() | test.rs:20:9:20:22 | remote_string4 | provenance | | | test.rs:23:9:23:22 | remote_string5 | test.rs:24:10:24:23 | remote_string5 | provenance | | | test.rs:23:26:23:52 | ...::get(...) | test.rs:23:26:23:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:8 | | test.rs:23:26:23:52 | ...::get(...) [future, Ok] | test.rs:23:26:23:58 | await ... [Ok] | provenance | | | test.rs:23:26:23:58 | await ... [Ok] | test.rs:23:26:23:59 | TryExpr | provenance | | -| test.rs:23:26:23:59 | TryExpr | test.rs:23:26:23:66 | ... .text() [future, Ok] | provenance | MaD:36 | +| test.rs:23:26:23:59 | TryExpr | test.rs:23:26:23:66 | ... .text() [future, Ok] | provenance | MaD:37 | | test.rs:23:26:23:66 | ... .text() [future, Ok] | test.rs:23:26:23:72 | await ... [Ok] | provenance | | | test.rs:23:26:23:72 | await ... [Ok] | test.rs:23:26:23:73 | TryExpr | provenance | | | test.rs:23:26:23:73 | TryExpr | test.rs:23:9:23:22 | remote_string5 | provenance | | @@ -80,7 +81,7 @@ edges | test.rs:26:26:26:52 | ...::get(...) | test.rs:26:26:26:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:8 | | test.rs:26:26:26:52 | ...::get(...) [future, Ok] | test.rs:26:26:26:58 | await ... [Ok] | provenance | | | test.rs:26:26:26:58 | await ... [Ok] | test.rs:26:26:26:59 | TryExpr | provenance | | -| test.rs:26:26:26:59 | TryExpr | test.rs:26:26:26:67 | ... .bytes() [future, Ok] | provenance | MaD:34 | +| test.rs:26:26:26:59 | TryExpr | test.rs:26:26:26:67 | ... .bytes() [future, Ok] | provenance | MaD:35 | | test.rs:26:26:26:67 | ... .bytes() [future, Ok] | test.rs:26:26:26:73 | await ... [Ok] | provenance | | | test.rs:26:26:26:73 | await ... [Ok] | test.rs:26:26:26:74 | TryExpr | provenance | | | test.rs:26:26:26:74 | TryExpr | test.rs:26:9:26:22 | remote_string6 | provenance | | @@ -90,13 +91,13 @@ edges | test.rs:29:24:29:50 | ...::get(...) [future, Ok] | test.rs:29:24:29:56 | await ... [Ok] | provenance | | | test.rs:29:24:29:56 | await ... [Ok] | test.rs:29:24:29:57 | TryExpr | provenance | | | test.rs:29:24:29:57 | TryExpr | test.rs:29:9:29:20 | mut request1 | provenance | | -| test.rs:30:10:30:17 | request1 | test.rs:30:10:30:25 | request1.chunk() [future, Ok, Some] | provenance | MaD:35 | +| test.rs:30:10:30:17 | request1 | test.rs:30:10:30:25 | request1.chunk() [future, Ok, Some] | provenance | MaD:36 | | test.rs:30:10:30:25 | request1.chunk() [future, Ok, Some] | test.rs:30:10:30:31 | await ... [Ok, Some] | provenance | | | test.rs:30:10:30:31 | await ... [Ok, Some] | test.rs:30:10:30:32 | TryExpr [Some] | provenance | | | test.rs:30:10:30:32 | TryExpr [Some] | test.rs:30:10:30:41 | ... .unwrap() | provenance | MaD:25 | | test.rs:31:15:31:25 | Some(...) [Some] | test.rs:31:20:31:24 | chunk | provenance | | | test.rs:31:20:31:24 | chunk | test.rs:32:14:32:18 | chunk | provenance | | -| test.rs:31:29:31:36 | request1 | test.rs:31:29:31:44 | request1.chunk() [future, Ok, Some] | provenance | MaD:35 | +| test.rs:31:29:31:36 | request1 | test.rs:31:29:31:44 | request1.chunk() [future, Ok, Some] | provenance | MaD:36 | | test.rs:31:29:31:44 | request1.chunk() [future, Ok, Some] | test.rs:31:29:31:50 | await ... [Ok, Some] | provenance | | | test.rs:31:29:31:50 | await ... [Ok, Some] | test.rs:31:29:31:51 | TryExpr [Some] | provenance | | | test.rs:31:29:31:51 | TryExpr [Some] | test.rs:31:15:31:25 | Some(...) [Some] | provenance | | @@ -140,7 +141,7 @@ edges | test.rs:182:21:182:30 | mut reader | test.rs:185:27:185:32 | reader | provenance | | | test.rs:182:34:182:64 | ...::new(...) | test.rs:182:34:182:74 | ... .take(...) | provenance | MaD:23 | | test.rs:182:34:182:74 | ... .take(...) | test.rs:182:21:182:30 | mut reader | provenance | | -| test.rs:182:58:182:63 | stream | test.rs:182:34:182:64 | ...::new(...) | provenance | MaD:40 | +| test.rs:182:58:182:63 | stream | test.rs:182:34:182:64 | ...::new(...) | provenance | MaD:41 | | test.rs:185:27:185:32 | reader | test.rs:185:44:185:52 | [post] &mut line [&ref] | provenance | MaD:19 | | test.rs:185:44:185:52 | [post] &mut line [&ref] | test.rs:185:49:185:52 | [post] line | provenance | | | test.rs:185:49:185:52 | [post] line | test.rs:192:35:192:38 | line | provenance | | @@ -148,9 +149,9 @@ edges | test.rs:203:21:203:26 | reader | test.rs:204:29:204:34 | reader | provenance | | | test.rs:203:30:203:73 | ...::new(...) | test.rs:203:30:203:83 | ... .take(...) | provenance | MaD:23 | | test.rs:203:30:203:83 | ... .take(...) | test.rs:203:21:203:26 | reader | provenance | | -| test.rs:203:54:203:59 | stream | test.rs:203:54:203:71 | stream.try_clone() [Ok] | provenance | MaD:41 | +| test.rs:203:54:203:59 | stream | test.rs:203:54:203:71 | stream.try_clone() [Ok] | provenance | MaD:42 | | test.rs:203:54:203:71 | stream.try_clone() [Ok] | test.rs:203:54:203:72 | TryExpr | provenance | | -| test.rs:203:54:203:72 | TryExpr | test.rs:203:30:203:73 | ...::new(...) | provenance | MaD:40 | +| test.rs:203:54:203:72 | TryExpr | test.rs:203:30:203:73 | ...::new(...) | provenance | MaD:41 | | test.rs:204:29:204:34 | reader | test.rs:204:29:204:42 | reader.lines() | provenance | MaD:18 | | test.rs:204:29:204:42 | reader.lines() | test.rs:205:28:205:37 | Ok(...) | provenance | | | test.rs:205:28:205:37 | Ok(...) | test.rs:207:30:207:35 | string | provenance | | @@ -162,7 +163,7 @@ edges | test.rs:224:28:224:66 | ...::connect(...) [future, Ok] | test.rs:224:28:224:72 | await ... [Ok] | provenance | | | test.rs:224:28:224:72 | await ... [Ok] | test.rs:224:28:224:73 | TryExpr | provenance | | | test.rs:224:28:224:73 | TryExpr | test.rs:224:9:224:24 | mut tokio_stream | provenance | | -| test.rs:232:17:232:28 | tokio_stream | test.rs:232:35:232:46 | [post] &mut buffer1 [&ref] | provenance | MaD:42 | +| test.rs:232:17:232:28 | tokio_stream | test.rs:232:35:232:46 | [post] &mut buffer1 [&ref] | provenance | MaD:43 | | test.rs:232:35:232:46 | [post] &mut buffer1 [&ref] | test.rs:232:40:232:46 | [post] buffer1 | provenance | | | test.rs:232:40:232:46 | [post] buffer1 | test.rs:239:15:239:21 | buffer1 | provenance | | | test.rs:232:40:232:46 | [post] buffer1 | test.rs:240:14:240:20 | buffer1 | provenance | | @@ -174,11 +175,11 @@ edges | test.rs:240:14:240:20 | buffer1 | test.rs:240:14:240:23 | buffer1[0] | provenance | MaD:10 | | test.rs:243:15:243:21 | buffer2 | test.rs:243:14:243:21 | &buffer2 | provenance | | | test.rs:244:14:244:20 | buffer2 | test.rs:244:14:244:23 | buffer2[0] | provenance | MaD:10 | -| test.rs:252:19:252:30 | tokio_stream | test.rs:252:41:252:51 | [post] &mut buffer [&ref] | provenance | MaD:43 | +| test.rs:252:19:252:30 | tokio_stream | test.rs:252:41:252:51 | [post] &mut buffer [&ref] | provenance | MaD:44 | | test.rs:252:41:252:51 | [post] &mut buffer [&ref] | test.rs:252:46:252:51 | [post] buffer | provenance | | | test.rs:252:46:252:51 | [post] buffer | test.rs:259:27:259:32 | buffer | provenance | | | test.rs:259:27:259:32 | buffer | test.rs:259:26:259:32 | &buffer | provenance | | -| test.rs:275:19:275:30 | tokio_stream | test.rs:275:45:275:55 | [post] &mut buffer [&ref] | provenance | MaD:44 | +| test.rs:275:19:275:30 | tokio_stream | test.rs:275:45:275:55 | [post] &mut buffer [&ref] | provenance | MaD:45 | | test.rs:275:45:275:55 | [post] &mut buffer [&ref] | test.rs:275:50:275:55 | [post] buffer | provenance | | | test.rs:275:50:275:55 | [post] buffer | test.rs:282:27:282:32 | buffer | provenance | | | test.rs:282:27:282:32 | buffer | test.rs:282:26:282:32 | &buffer | provenance | | @@ -205,6 +206,26 @@ edges | test.rs:350:44:350:54 | [post] &mut buffer [&ref] | test.rs:350:49:350:54 | [post] buffer | provenance | | | test.rs:350:49:350:54 | [post] buffer | test.rs:351:15:351:20 | buffer | provenance | | | test.rs:351:15:351:20 | buffer | test.rs:351:14:351:20 | &buffer | provenance | | +| test.rs:359:9:359:14 | stream | test.rs:361:59:361:64 | stream | provenance | | +| test.rs:359:18:359:54 | ...::connect(...) | test.rs:359:18:359:54 | ...::connect(...) [Ok] | provenance | Src:MaD:4 | +| test.rs:359:18:359:54 | ...::connect(...) [Ok] | test.rs:359:18:359:55 | TryExpr | provenance | | +| test.rs:359:18:359:55 | TryExpr | test.rs:359:9:359:14 | stream | provenance | | +| test.rs:361:9:361:18 | mut stream | test.rs:362:11:362:16 | stream | provenance | | +| test.rs:361:9:361:18 | mut stream | test.rs:367:22:367:27 | stream | provenance | | +| test.rs:361:9:361:18 | mut stream | test.rs:373:5:373:10 | stream | provenance | | +| test.rs:361:22:361:65 | connector.connect(...) [Ok] | test.rs:361:22:361:66 | TryExpr | provenance | | +| test.rs:361:22:361:66 | TryExpr | test.rs:361:9:361:18 | mut stream | provenance | | +| test.rs:361:59:361:64 | stream | test.rs:361:22:361:65 | connector.connect(...) [Ok] | provenance | MaD:34 | +| test.rs:362:11:362:16 | stream | test.rs:362:10:362:16 | &stream | provenance | | +| test.rs:367:22:367:27 | stream | test.rs:367:34:367:44 | [post] &mut buffer [&ref] | provenance | MaD:20 | +| test.rs:367:34:367:44 | [post] &mut buffer [&ref] | test.rs:367:39:367:44 | [post] buffer | provenance | | +| test.rs:367:39:367:44 | [post] buffer | test.rs:370:11:370:16 | buffer | provenance | | +| test.rs:367:39:367:44 | [post] buffer | test.rs:370:11:370:30 | buffer[...] | provenance | | +| test.rs:370:11:370:16 | buffer | test.rs:370:11:370:30 | buffer[...] | provenance | MaD:10 | +| test.rs:370:11:370:30 | buffer[...] | test.rs:370:10:370:30 | &... | provenance | | +| test.rs:373:5:373:10 | stream | test.rs:373:27:373:39 | [post] &mut response [&ref] | provenance | MaD:22 | +| test.rs:373:27:373:39 | [post] &mut response [&ref] | test.rs:373:32:373:39 | [post] response | provenance | | +| test.rs:373:32:373:39 | [post] response | test.rs:375:10:375:17 | response | provenance | | | test.rs:396:13:396:15 | tcp | test.rs:397:15:397:17 | tcp | provenance | | | test.rs:396:13:396:15 | tcp | test.rs:403:57:403:59 | tcp | provenance | | | test.rs:396:19:396:41 | ...::connect(...) | test.rs:396:19:396:41 | ...::connect(...) [future, Ok] | provenance | Src:MaD:1 | @@ -543,6 +564,26 @@ nodes | test.rs:350:49:350:54 | [post] buffer | semmle.label | [post] buffer | | test.rs:351:14:351:20 | &buffer | semmle.label | &buffer | | test.rs:351:15:351:20 | buffer | semmle.label | buffer | +| test.rs:359:9:359:14 | stream | semmle.label | stream | +| test.rs:359:18:359:54 | ...::connect(...) | semmle.label | ...::connect(...) | +| test.rs:359:18:359:54 | ...::connect(...) [Ok] | semmle.label | ...::connect(...) [Ok] | +| test.rs:359:18:359:55 | TryExpr | semmle.label | TryExpr | +| test.rs:361:9:361:18 | mut stream | semmle.label | mut stream | +| test.rs:361:22:361:65 | connector.connect(...) [Ok] | semmle.label | connector.connect(...) [Ok] | +| test.rs:361:22:361:66 | TryExpr | semmle.label | TryExpr | +| test.rs:361:59:361:64 | stream | semmle.label | stream | +| test.rs:362:10:362:16 | &stream | semmle.label | &stream | +| test.rs:362:11:362:16 | stream | semmle.label | stream | +| test.rs:367:22:367:27 | stream | semmle.label | stream | +| test.rs:367:34:367:44 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:367:39:367:44 | [post] buffer | semmle.label | [post] buffer | +| test.rs:370:10:370:30 | &... | semmle.label | &... | +| test.rs:370:11:370:16 | buffer | semmle.label | buffer | +| test.rs:370:11:370:30 | buffer[...] | semmle.label | buffer[...] | +| test.rs:373:5:373:10 | stream | semmle.label | stream | +| test.rs:373:27:373:39 | [post] &mut response [&ref] | semmle.label | [post] &mut response [&ref] | +| test.rs:373:32:373:39 | [post] response | semmle.label | [post] response | +| test.rs:375:10:375:17 | response | semmle.label | response | | test.rs:396:13:396:15 | tcp | semmle.label | tcp | | test.rs:396:19:396:41 | ...::connect(...) | semmle.label | ...::connect(...) | | test.rs:396:19:396:41 | ...::connect(...) [future, Ok] | semmle.label | ...::connect(...) [future, Ok] | @@ -728,6 +769,9 @@ testFailures | test.rs:339:14:339:20 | &buffer | test.rs:332:22:332:75 | ...::new(...) | test.rs:339:14:339:20 | &buffer | $@ | test.rs:332:22:332:75 | ...::new(...) | ...::new(...) | | test.rs:345:14:345:20 | &buffer | test.rs:332:22:332:75 | ...::new(...) | test.rs:345:14:345:20 | &buffer | $@ | test.rs:332:22:332:75 | ...::new(...) | ...::new(...) | | test.rs:351:14:351:20 | &buffer | test.rs:332:22:332:75 | ...::new(...) | test.rs:351:14:351:20 | &buffer | $@ | test.rs:332:22:332:75 | ...::new(...) | ...::new(...) | +| test.rs:362:10:362:16 | &stream | test.rs:359:18:359:54 | ...::connect(...) | test.rs:362:10:362:16 | &stream | $@ | test.rs:359:18:359:54 | ...::connect(...) | ...::connect(...) | +| test.rs:370:10:370:30 | &... | test.rs:359:18:359:54 | ...::connect(...) | test.rs:370:10:370:30 | &... | $@ | test.rs:359:18:359:54 | ...::connect(...) | ...::connect(...) | +| test.rs:375:10:375:17 | response | test.rs:359:18:359:54 | ...::connect(...) | test.rs:375:10:375:17 | response | $@ | test.rs:359:18:359:54 | ...::connect(...) | ...::connect(...) | | test.rs:397:14:397:17 | &tcp | test.rs:396:19:396:41 | ...::connect(...) | test.rs:397:14:397:17 | &tcp | $@ | test.rs:396:19:396:41 | ...::connect(...) | ...::connect(...) | | test.rs:404:14:404:20 | &reader | test.rs:396:19:396:41 | ...::connect(...) | test.rs:404:14:404:20 | &reader | $@ | test.rs:396:19:396:41 | ...::connect(...) | ...::connect(...) | | test.rs:410:18:410:24 | &pinned | test.rs:396:19:396:41 | ...::connect(...) | test.rs:410:18:410:24 | &pinned | $@ | test.rs:396:19:396:41 | ...::connect(...) | ...::connect(...) | diff --git a/rust/ql/test/library-tests/dataflow/sources/net/test.rs b/rust/ql/test/library-tests/dataflow/sources/net/test.rs index ee52f7a37cec..16a42f75da95 100644 --- a/rust/ql/test/library-tests/dataflow/sources/net/test.rs +++ b/rust/ql/test/library-tests/dataflow/sources/net/test.rs @@ -359,7 +359,7 @@ fn test_native_tls() -> Result<(), Box> { let stream = std::net::TcpStream::connect(address)?; // $ Alert[rust/summary/taint-sources] let connector = native_tls::TlsConnector::new()?; let mut stream = connector.connect("www.example.com", stream)?; - sink(&stream); // $ MISSING: hasTaintFlow=address + sink(&stream); // $ hasTaintFlow=address stream.write_all(b"GET / HTTP/1.1\r\nHost: www.example.com\r\nConnection: close\r\n\r\n")?; @@ -367,12 +367,12 @@ fn test_native_tls() -> Result<(), Box> { let bytes_read = stream.read(&mut buffer)?; println!("bytes_read = {}", bytes_read); println!("buffer = {:?}", &buffer[..bytes_read]); - sink(&buffer[..bytes_read]); // $ MISSING: hasTaintFlow=address + sink(&buffer[..bytes_read]); // $ hasTaintFlow=address let mut response = String::new(); stream.read_to_string(&mut response)?; println!("rest of response = '{}'", response); - sink(response); // $ MISSING: hasTaintFlow=address + sink(response); // $ hasTaintFlow=address Ok(()) } From fe411d7c2615119ae20a274839e8035438e5cca7 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 19 Aug 2026 14:06:38 +0100 Subject: [PATCH 0378/2098] Rust: Change note. --- .../lib/change-notes/2026-08-19-native-tls-summary-models.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 rust/ql/lib/change-notes/2026-08-19-native-tls-summary-models.md diff --git a/rust/ql/lib/change-notes/2026-08-19-native-tls-summary-models.md b/rust/ql/lib/change-notes/2026-08-19-native-tls-summary-models.md new file mode 100644 index 000000000000..1a5ef111fedc --- /dev/null +++ b/rust/ql/lib/change-notes/2026-08-19-native-tls-summary-models.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added new flow summary models for the `native-tls`, `async-native-tls`, and `tokio-native-tls` crates. From a1f2b815669d92bcde42d6dc77c96d23f33d7ad5 Mon Sep 17 00:00:00 2001 From: hugo-syn Date: Wed, 19 Aug 2026 15:30:47 +0200 Subject: [PATCH 0379/2098] C#: add OData action-parameter taint modeling Adds semmle.code.csharp.frameworks.OData, following the WCF.qll/JsonNET.qll convention: values cast, as-converted, or type-tested out of an untyped ODataActionParameters dictionary, and entities tracked by Delta (via GetInstance/Patch/Put/CopyChangedValues/CopyUnchangedValues), have no static type relationship to the action method's own parameter types, so their members aren't picked up by the existing AspNetRemoteFlowSourceMember modeling. This adds a TaintedMember for those bound types (with the same nested-type/collection recursion as AspNetRemoteFlowSourceMember), plus two AdditionalTaintStep steps for the Delta method calls, which don't fit the member-read shape TaintedMember covers. Co-Authored-By: Claude Sonnet 5 --- .../2026-08-19-odata-taint-step.md | 4 + .../internal/TaintTrackingPrivate.qll | 1 + .../semmle/code/csharp/frameworks/OData.qll | 161 ++++++++++++++++++ .../library-tests/frameworks/OData/OData.cs | 125 ++++++++++++++ .../frameworks/OData/OData.expected | 9 + .../library-tests/frameworks/OData/OData.ql | 21 +++ 6 files changed, 321 insertions(+) create mode 100644 csharp/ql/lib/change-notes/2026-08-19-odata-taint-step.md create mode 100644 csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll create mode 100644 csharp/ql/test/library-tests/frameworks/OData/OData.cs create mode 100644 csharp/ql/test/library-tests/frameworks/OData/OData.expected create mode 100644 csharp/ql/test/library-tests/frameworks/OData/OData.ql diff --git a/csharp/ql/lib/change-notes/2026-08-19-odata-taint-step.md b/csharp/ql/lib/change-notes/2026-08-19-odata-taint-step.md new file mode 100644 index 000000000000..3d0a6cbeb8ae --- /dev/null +++ b/csharp/ql/lib/change-notes/2026-08-19-odata-taint-step.md @@ -0,0 +1,4 @@ +--- +category: feature +--- +* Added taint modeling for OData action parameter binding (`Microsoft.AspNet.OData`/`Microsoft.AspNetCore.OData`). Values cast, `as`-converted, or type-tested out of `ODataActionParameters`, and entities tracked by `Delta` (via `GetInstance`, `Patch`, `Put`, `CopyChangedValues`, and `CopyUnchangedValues`), now taint the members of the target type. diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll index 238ecab13461..418573cae8cc 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll @@ -9,6 +9,7 @@ private import semmle.code.csharp.dispatch.Dispatch private import semmle.code.csharp.commons.ComparisonTest // import `TaintedMember` definitions from other files to avoid potential reevaluation private import semmle.code.csharp.frameworks.JsonNET +private import semmle.code.csharp.frameworks.OData private import semmle.code.csharp.frameworks.WCF private import semmle.code.csharp.security.dataflow.flowsources.Remote diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll new file mode 100644 index 000000000000..899f1cbd036a --- /dev/null +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll @@ -0,0 +1,161 @@ +/** + * Provides taint modeling for `Microsoft.AspNet.OData`/`Microsoft.AspNetCore.OData` + * (and the older `System.Web.Http.OData`) OData action parameter binding. + * + * OData actions receive their untrusted payload in one of two shapes that + * bypass the usual "type used as an action-method parameter" taint modeling: + * + * - `ODataActionParameters`, an untyped `Dictionary` whose + * values are cast, `as`-converted, or type-tested to arbitrary model types + * by the action method body. + * - `Delta`, a change-tracking wrapper for PATCH/PUT requests, whose + * tracked property values are exposed via `GetInstance()` or copied onto an + * existing entity via `Patch`/`Put`/`CopyChangedValues`/`CopyUnchangedValues`. + * + * In both cases the type that ends up holding the client-controlled data has + * no static relationship to the action method's parameter types, so its + * members need to be taint-tracked explicitly. + */ + +private import csharp +private import semmle.code.csharp.commons.Collections +private import semmle.code.csharp.dataflow.FlowSteps +private import semmle.code.csharp.dataflow.TaintTracking +private import semmle.code.csharp.dataflow.internal.DataFlowPrivate + +/** The `ODataActionParameters` dictionary type, across OData library versions. */ +private class ODataActionParametersClass extends Class { + ODataActionParametersClass() { + this.hasFullyQualifiedName("Microsoft.AspNet.OData", "ODataActionParameters") or + this.hasFullyQualifiedName("Microsoft.AspNetCore.OData.Formatter", "ODataActionParameters") or + this.hasFullyQualifiedName("System.Web.Http.OData", "ODataActionParameters") + } +} + +/** An indexer read on an `ODataActionParameters` dictionary, e.g. `parameters["CabFile"]`. */ +private class ODataActionParameterRead extends ElementAccess { + ODataActionParameterRead() { this.getQualifier().getType() instanceof ODataActionParametersClass } +} + +/** Holds if `e` may (locally) hold the value of an `ODataActionParameters` entry. */ +private predicate isODataParameterValue(Expr e) { + TaintTracking::localExprTaint(any(ODataActionParameterRead r), e) +} + +/** The generic `Delta` change-tracking class, across OData library versions. */ +private class DeltaClass extends UnboundGenericClass { + DeltaClass() { + this.getNumberOfTypeParameters() = 1 and + ( + this.hasFullyQualifiedName("Microsoft.AspNet.OData", "Delta`1") or + this.hasFullyQualifiedName("Microsoft.AspNetCore.OData.Deltas", "Delta`1") + ) + } +} + +/** + * A type that a value read out of `ODataActionParameters` is cast, `as`-converted, + * or type-tested to -- directly, or wrapped in a collection (`List`, + * `IEnumerable`, arrays, ...) -- or a type that is tracked by a `Delta`. + */ +private class ODataBoundType extends ValueOrRefType { + ODataBoundType() { + exists(Cast c | isODataParameterValue(c.getExpr()) | + this = c.getTargetType() or + this = c.getTargetType().(CollectionType).getElementType() or + this = c.getTargetType().(ParamsCollectionType).getElementType() + ) + or + exists(IsExpr ie, Type t | + isODataParameterValue(ie.getExpr()) and + t = ie.getPattern().(TypePatternExpr).getCheckedType() + | + this = t or + this = t.(CollectionType).getElementType() or + this = t.(ParamsCollectionType).getElementType() + ) + or + this = any(ConstructedClass c | c.getUnboundGeneric() instanceof DeltaClass).getTypeArgument(0) + } +} + +private class CandidateODataMember extends Member { + CandidateODataMember() { + this.isPublic() and + not this.isStatic() and + ( + this = + any(Property p | + p.isAutoImplemented() and + p.getGetter().isPublic() and + p.getSetter().isPublic() + ) + or + this = any(Field f | f.isPublic()) + ) + } +} + +/** + * Taint members (transitively) on types used in + * 1. Casts, `as`-conversions, or type tests applied to `ODataActionParameters` values. + * 2. The type argument of a `Delta`. + * + * Note that this also impacts uses of such types in other contexts, the same + * trade-off `AspNetRemoteFlowSourceMember` (`Remote.qll`) makes for ASP.NET + * action-method parameters. + */ +private class ODataBoundMember extends TaintTracking::TaintedMember, CandidateODataMember { + ODataBoundMember() { + exists(Type t, Type t0 | t = this.getDeclaringType() | + (t = t0 or t = t0.(CollectionType).getElementType()) and + ( + t0 = any(ODataBoundMember m).getType() + or + t0 instanceof ODataBoundType + ) + ) + } +} + +/** The `Patch`, `Put`, `CopyChangedValues`, and `CopyUnchangedValues` methods on `Delta`. */ +private class DeltaMutatingMethod extends Method { + DeltaMutatingMethod() { + this.getDeclaringType() instanceof DeltaClass and + this.hasName(["Patch", "Put", "CopyChangedValues", "CopyUnchangedValues"]) + } +} + +/** + * A call to `Delta.Patch`/`Put`/`CopyChangedValues`/`CopyUnchangedValues` + * copies the changes tracked by the `Delta` receiver onto its `original` + * entity argument. + */ +private class DeltaMutatingCallTaintStep extends AdditionalTaintStep { + override predicate step(DataFlow::Node node1, DataFlow::Node node2) { + exists(MethodCall mc | + mc.getTarget().getUnboundDeclaration() instanceof DeltaMutatingMethod and + node1.asExpr() = mc.getQualifier() and + node2.(PostUpdateNode).getPreUpdateNode().asExpr() = mc.getArgument(0) + ) + } +} + +/** The `GetInstance` method on `Delta`. */ +private class DeltaGetInstanceMethod extends Method { + DeltaGetInstanceMethod() { + this.getDeclaringType() instanceof DeltaClass and + this.hasName("GetInstance") + } +} + +/** `Delta.GetInstance()` returns the tracked entity, carrying the same taint as the `Delta` itself. */ +private class DeltaGetInstanceTaintStep extends AdditionalTaintStep { + override predicate step(DataFlow::Node node1, DataFlow::Node node2) { + exists(MethodCall mc | + mc.getTarget().getUnboundDeclaration() instanceof DeltaGetInstanceMethod and + node1.asExpr() = mc.getQualifier() and + node2.asExpr() = mc + ) + } +} diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.cs b/csharp/ql/test/library-tests/frameworks/OData/OData.cs new file mode 100644 index 000000000000..ade9366f64d0 --- /dev/null +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.cs @@ -0,0 +1,125 @@ +using System.Collections.Generic; + +namespace Microsoft.AspNet.OData +{ + public class ODataActionParameters : Dictionary + { + } + + public class Delta where TStructuralType : class + { + private TStructuralType instance; + + public Delta() { instance = default(TStructuralType); } + + public TStructuralType GetInstance() => instance; + + public void Patch(TStructuralType original) { } + + public void Put(TStructuralType original) { } + + public void CopyChangedValues(TStructuralType original) { } + + public void CopyUnchangedValues(TStructuralType original) { } + } +} + +namespace Test +{ + using Microsoft.AspNet.OData; + using System.Collections.Generic; + + public class FileMetadata + { + public string Author { get; set; } + } + + public class UploadedFile + { + public string FileName { get; set; } + + public string FileContent { get; set; } + + public FileMetadata Metadata { get; set; } + + public List History { get; set; } + } + + public class SubscriptionRelation + { + public string EventName { get; set; } + + public string EventType { get; set; } + } + + public class Widget + { + public string Name { get; set; } + } + + public class UnrelatedType + { + // Never reached via an ODataActionParameters/Delta cast, so this + // member must stay untainted even though `UnrelatedType` itself is + // used elsewhere in the file. + public string Name { get; set; } + } + + public class OrderController + { + void Sink(object o) { } + + void CastFromDictionary(ODataActionParameters parameters) + { + var file = (UploadedFile)parameters["CabFile"]; + Sink(file); + Sink(file.FileName); + Sink(file.FileContent); + Sink(file.Metadata.Author); + foreach (var m in file.History) + { + Sink(m.Author); + } + } + + void IsAsFromDictionary(ODataActionParameters parameters) + { + if (parameters["NewEvents"] is IEnumerable relations1) + { + foreach (var item in relations1) + { + Sink(item.EventName); + } + } + + var relations2 = parameters["NewEvents"] as IEnumerable; + foreach (var item in relations2) + { + Sink(item.EventType); + } + } + + void DeltaPatch(Delta delta, Widget original) + { + delta.Patch(original); + Sink(original.Name); + } + + void DeltaGetInstance(Delta delta) + { + var w = delta.GetInstance(); + Sink(w.Name); + } + + void Untainted() + { + var w = new Widget(); + w.Name = "safe"; + Sink(w.Name); + + var u = new UnrelatedType(); + u.Name = "also safe"; + Sink(u.Name); + } + } +} diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.expected b/csharp/ql/test/library-tests/frameworks/OData/OData.expected new file mode 100644 index 000000000000..dbaffab69b1d --- /dev/null +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.expected @@ -0,0 +1,9 @@ +| OData.cs:72:55:72:64 | parameters | OData.cs:75:18:75:21 | access to local variable file | +| OData.cs:72:55:72:64 | parameters | OData.cs:76:18:76:30 | access to property FileName | +| OData.cs:72:55:72:64 | parameters | OData.cs:77:18:77:33 | access to property FileContent | +| OData.cs:72:55:72:64 | parameters | OData.cs:78:18:78:37 | access to property Author | +| OData.cs:72:55:72:64 | parameters | OData.cs:81:22:81:29 | access to property Author | +| OData.cs:85:55:85:64 | parameters | OData.cs:91:26:91:39 | access to property EventName | +| OData.cs:85:55:85:64 | parameters | OData.cs:98:22:98:35 | access to property EventType | +| OData.cs:102:39:102:43 | delta | OData.cs:105:18:105:30 | access to property Name | +| OData.cs:108:45:108:49 | delta | OData.cs:111:18:111:23 | access to property Name | diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.ql b/csharp/ql/test/library-tests/frameworks/OData/OData.ql new file mode 100644 index 000000000000..80d0f1d04dec --- /dev/null +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.ql @@ -0,0 +1,21 @@ +import csharp + +module TaintConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { + exists(Parameter p | p = n.asParameter() | + p.getType().hasFullyQualifiedName("Microsoft.AspNet.OData", "ODataActionParameters") + or + p.getType().getUnboundDeclaration().hasFullyQualifiedName("Microsoft.AspNet.OData", "Delta`1") + ) + } + + predicate isSink(DataFlow::Node sink) { + exists(MethodCall c | c.getArgument(0) = sink.asExpr() and c.getTarget().hasName("Sink")) + } +} + +module Taint = TaintTracking::Global; + +from DataFlow::Node source, DataFlow::Node sink +where Taint::flow(source, sink) +select source, sink From 08724a877b2bb1c4335eace3f47fca742b44a1c6 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 19 Aug 2026 14:33:42 +0100 Subject: [PATCH 0380/2098] Rust: Remove the colocated nodes metric. Not proven useful. --- rust/ql/src/queries/summary/Stats.qll | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/rust/ql/src/queries/summary/Stats.qll b/rust/ql/src/queries/summary/Stats.qll index 5e0169254486..a9c040e4b3c7 100644 --- a/rust/ql/src/queries/summary/Stats.qll +++ b/rust/ql/src/queries/summary/Stats.qll @@ -104,17 +104,6 @@ int getTaintEdgesCount() { */ int getQuerySinksCount() { result = count(QuerySink s) } -/** - * Holds if there are at least 10 data flow nodes in the same location - * as `n`. - */ -private predicate isColocated10(DataFlow::Node n) { - exists(Location l | - l = n.getLocation() and - strictcount(DataFlow::Node other | other.getLocation() = l) >= 10 - ) -} - class CrateElement extends Element { CrateElement() { this instanceof Crate or @@ -220,9 +209,6 @@ predicate taintStats(string key, int value) { or key = "Taint reach - per million nodes" and value = getTaintReach().floor() or - key = "Taint nodes - highly colocated nodes" and - value = count(DataFlow::Node n | isColocated10(n)) - or key = "Taint sinks - query sinks" and value = getQuerySinksCount() or key = "Taint sinks - cryptographic operations" and From e88e00388effca676a02f87fc8ce712905f725ee Mon Sep 17 00:00:00 2001 From: hugo-syn Date: Wed, 19 Aug 2026 15:45:00 +0200 Subject: [PATCH 0381/2098] C#: make OData.qll classes public, genericize test fixtures Match WCF.qll's convention: only the TaintedMember/AdditionalTaintStep wiring classes stay private, everything else that identifies a reusable OData domain concept (ODataActionParametersClass, DeltaClass, ODataBoundType, DeltaMutatingMethod, DeltaGetInstanceMethod) is public. Also renames the test fixtures to generic placeholder names. Co-Authored-By: Claude Sonnet 5 --- .../semmle/code/csharp/frameworks/OData.qll | 44 ++++++++--------- .../library-tests/frameworks/OData/OData.cs | 48 +++++++++---------- .../frameworks/OData/OData.expected | 14 +++--- 3 files changed, 53 insertions(+), 53 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll index 899f1cbd036a..406041f04e10 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll @@ -17,14 +17,14 @@ * members need to be taint-tracked explicitly. */ -private import csharp +import csharp private import semmle.code.csharp.commons.Collections private import semmle.code.csharp.dataflow.FlowSteps private import semmle.code.csharp.dataflow.TaintTracking private import semmle.code.csharp.dataflow.internal.DataFlowPrivate /** The `ODataActionParameters` dictionary type, across OData library versions. */ -private class ODataActionParametersClass extends Class { +class ODataActionParametersClass extends Class { ODataActionParametersClass() { this.hasFullyQualifiedName("Microsoft.AspNet.OData", "ODataActionParameters") or this.hasFullyQualifiedName("Microsoft.AspNetCore.OData.Formatter", "ODataActionParameters") or @@ -32,8 +32,8 @@ private class ODataActionParametersClass extends Class { } } -/** An indexer read on an `ODataActionParameters` dictionary, e.g. `parameters["CabFile"]`. */ -private class ODataActionParameterRead extends ElementAccess { +/** An indexer read on an `ODataActionParameters` dictionary, e.g. `parameters["Foo"]`. */ +class ODataActionParameterRead extends ElementAccess { ODataActionParameterRead() { this.getQualifier().getType() instanceof ODataActionParametersClass } } @@ -43,7 +43,7 @@ private predicate isODataParameterValue(Expr e) { } /** The generic `Delta` change-tracking class, across OData library versions. */ -private class DeltaClass extends UnboundGenericClass { +class DeltaClass extends UnboundGenericClass { DeltaClass() { this.getNumberOfTypeParameters() = 1 and ( @@ -58,7 +58,7 @@ private class DeltaClass extends UnboundGenericClass { * or type-tested to -- directly, or wrapped in a collection (`List`, * `IEnumerable`, arrays, ...) -- or a type that is tracked by a `Delta`. */ -private class ODataBoundType extends ValueOrRefType { +class ODataBoundType extends ValueOrRefType { ODataBoundType() { exists(Cast c | isODataParameterValue(c.getExpr()) | this = c.getTargetType() or @@ -79,6 +79,22 @@ private class ODataBoundType extends ValueOrRefType { } } +/** The `Patch`, `Put`, `CopyChangedValues`, and `CopyUnchangedValues` methods on `Delta`. */ +class DeltaMutatingMethod extends Method { + DeltaMutatingMethod() { + this.getDeclaringType() instanceof DeltaClass and + this.hasName(["Patch", "Put", "CopyChangedValues", "CopyUnchangedValues"]) + } +} + +/** The `GetInstance` method on `Delta`. */ +class DeltaGetInstanceMethod extends Method { + DeltaGetInstanceMethod() { + this.getDeclaringType() instanceof DeltaClass and + this.hasName("GetInstance") + } +} + private class CandidateODataMember extends Member { CandidateODataMember() { this.isPublic() and @@ -118,14 +134,6 @@ private class ODataBoundMember extends TaintTracking::TaintedMember, CandidateOD } } -/** The `Patch`, `Put`, `CopyChangedValues`, and `CopyUnchangedValues` methods on `Delta`. */ -private class DeltaMutatingMethod extends Method { - DeltaMutatingMethod() { - this.getDeclaringType() instanceof DeltaClass and - this.hasName(["Patch", "Put", "CopyChangedValues", "CopyUnchangedValues"]) - } -} - /** * A call to `Delta.Patch`/`Put`/`CopyChangedValues`/`CopyUnchangedValues` * copies the changes tracked by the `Delta` receiver onto its `original` @@ -141,14 +149,6 @@ private class DeltaMutatingCallTaintStep extends AdditionalTaintStep { } } -/** The `GetInstance` method on `Delta`. */ -private class DeltaGetInstanceMethod extends Method { - DeltaGetInstanceMethod() { - this.getDeclaringType() instanceof DeltaClass and - this.hasName("GetInstance") - } -} - /** `Delta.GetInstance()` returns the tracked entity, carrying the same taint as the `Delta` itself. */ private class DeltaGetInstanceTaintStep extends AdditionalTaintStep { override predicate step(DataFlow::Node node1, DataFlow::Node node2) { diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.cs b/csharp/ql/test/library-tests/frameworks/OData/OData.cs index ade9366f64d0..71a5c2218b68 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.cs +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.cs @@ -29,27 +29,27 @@ namespace Test using Microsoft.AspNet.OData; using System.Collections.Generic; - public class FileMetadata + public class EntityMetadata { - public string Author { get; set; } + public string Owner { get; set; } } - public class UploadedFile + public class BoundEntity { - public string FileName { get; set; } + public string Name { get; set; } - public string FileContent { get; set; } + public string Content { get; set; } - public FileMetadata Metadata { get; set; } + public EntityMetadata Metadata { get; set; } - public List History { get; set; } + public List Revisions { get; set; } } - public class SubscriptionRelation + public class RelatedItem { - public string EventName { get; set; } + public string Label { get; set; } - public string EventType { get; set; } + public string Category { get; set; } } public class Widget @@ -65,37 +65,37 @@ public class UnrelatedType public string Name { get; set; } } - public class OrderController + public class SampleController { void Sink(object o) { } void CastFromDictionary(ODataActionParameters parameters) { - var file = (UploadedFile)parameters["CabFile"]; - Sink(file); - Sink(file.FileName); - Sink(file.FileContent); - Sink(file.Metadata.Author); - foreach (var m in file.History) + var entity = (BoundEntity)parameters["Entity"]; + Sink(entity); + Sink(entity.Name); + Sink(entity.Content); + Sink(entity.Metadata.Owner); + foreach (var m in entity.Revisions) { - Sink(m.Author); + Sink(m.Owner); } } void IsAsFromDictionary(ODataActionParameters parameters) { - if (parameters["NewEvents"] is IEnumerable relations1) + if (parameters["Items"] is IEnumerable items1) { - foreach (var item in relations1) + foreach (var item in items1) { - Sink(item.EventName); + Sink(item.Label); } } - var relations2 = parameters["NewEvents"] as IEnumerable; - foreach (var item in relations2) + var items2 = parameters["Items"] as IEnumerable; + foreach (var item in items2) { - Sink(item.EventType); + Sink(item.Category); } } diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.expected b/csharp/ql/test/library-tests/frameworks/OData/OData.expected index dbaffab69b1d..a9a2796c0ca5 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.expected +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.expected @@ -1,9 +1,9 @@ -| OData.cs:72:55:72:64 | parameters | OData.cs:75:18:75:21 | access to local variable file | -| OData.cs:72:55:72:64 | parameters | OData.cs:76:18:76:30 | access to property FileName | -| OData.cs:72:55:72:64 | parameters | OData.cs:77:18:77:33 | access to property FileContent | -| OData.cs:72:55:72:64 | parameters | OData.cs:78:18:78:37 | access to property Author | -| OData.cs:72:55:72:64 | parameters | OData.cs:81:22:81:29 | access to property Author | -| OData.cs:85:55:85:64 | parameters | OData.cs:91:26:91:39 | access to property EventName | -| OData.cs:85:55:85:64 | parameters | OData.cs:98:22:98:35 | access to property EventType | +| OData.cs:72:55:72:64 | parameters | OData.cs:75:18:75:23 | access to local variable entity | +| OData.cs:72:55:72:64 | parameters | OData.cs:76:18:76:28 | access to property Name | +| OData.cs:72:55:72:64 | parameters | OData.cs:77:18:77:31 | access to property Content | +| OData.cs:72:55:72:64 | parameters | OData.cs:78:18:78:38 | access to property Owner | +| OData.cs:72:55:72:64 | parameters | OData.cs:81:22:81:28 | access to property Owner | +| OData.cs:85:55:85:64 | parameters | OData.cs:91:26:91:35 | access to property Label | +| OData.cs:85:55:85:64 | parameters | OData.cs:98:22:98:34 | access to property Category | | OData.cs:102:39:102:43 | delta | OData.cs:105:18:105:30 | access to property Name | | OData.cs:108:45:108:49 | delta | OData.cs:111:18:111:23 | access to property Name | From 3440d4a1eb5338c78c5faf7e40fdacd53c4f8a77 Mon Sep 17 00:00:00 2001 From: hugo-syn Date: Wed, 19 Aug 2026 15:53:23 +0200 Subject: [PATCH 0382/2098] C#: drop redundant TaintTracking import in OData.qll import csharp already publicly imports semmle.code.csharp.dataflow.TaintTracking (and DataFlow), same as WCF.qll/JsonNET.qll rely on implicitly. Co-Authored-By: Claude Sonnet 5 --- csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll | 1 - 1 file changed, 1 deletion(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll index 406041f04e10..80917322f441 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll @@ -20,7 +20,6 @@ import csharp private import semmle.code.csharp.commons.Collections private import semmle.code.csharp.dataflow.FlowSteps -private import semmle.code.csharp.dataflow.TaintTracking private import semmle.code.csharp.dataflow.internal.DataFlowPrivate /** The `ODataActionParameters` dictionary type, across OData library versions. */ From 9919db5493601eaa1c5354602f36c39351168b07 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Wed, 19 Aug 2026 16:33:44 +0200 Subject: [PATCH 0383/2098] Actions: Fix typo in change note --- .../change-notes/2026-07-22-environment-check-sanitizer-mad.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actions/ql/lib/change-notes/2026-07-22-environment-check-sanitizer-mad.md b/actions/ql/lib/change-notes/2026-07-22-environment-check-sanitizer-mad.md index ef901cdc7603..0af62ba426de 100644 --- a/actions/ql/lib/change-notes/2026-07-22-environment-check-sanitizer-mad.md +++ b/actions/ql/lib/change-notes/2026-07-22-environment-check-sanitizer-mad.md @@ -1,4 +1,4 @@ --- category: minorAnalysis --- -* Added an option to `EnvironmentCheck` to become specified by a MaD model, otherwise it will continue as the default it previously was. Without adding models to `actions/ql/lib/ext/config/deployment_environment.yml` the behavior of every query will be unchanged. When models are added queries using `ControlCheck` may find more results in cases where an enironment is no longer a sufficient sanitizer. \ No newline at end of file +* Added an option to `EnvironmentCheck` to become specified by a MaD model, otherwise it will continue as the default it previously was. Without adding models to `actions/ql/lib/ext/config/deployment_environment.yml` the behavior of every query will be unchanged. When models are added queries using `ControlCheck` may find more results in cases where an environment is no longer a sufficient sanitizer. \ No newline at end of file From fe46062a1245c31652303040c735584a28453906 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 18 Aug 2026 18:45:58 +0100 Subject: [PATCH 0384/2098] C++: Fixup 'cpp/sql-injection' so that it doesn't require the sink to be an (indirect)expr. --- cpp/ql/src/Security/CWE/CWE-089/SqlTainted.ql | 40 +++++++------------ .../CWE-089/SqlTainted/SqlTainted.expected | 22 +++++----- 2 files changed, 26 insertions(+), 36 deletions(-) diff --git a/cpp/ql/src/Security/CWE/CWE-089/SqlTainted.ql b/cpp/ql/src/Security/CWE/CWE-089/SqlTainted.ql index 802888be271a..eb5d23b5fd6a 100644 --- a/cpp/ql/src/Security/CWE/CWE-089/SqlTainted.ql +++ b/cpp/ql/src/Security/CWE/CWE-089/SqlTainted.ql @@ -33,15 +33,20 @@ Expr asSinkExpr(DataFlow::Node node) { result = node.asExpr() } +private predicate isSink(DataFlow::Node sink, string extraText) { + exists(SqlLikeFunction runSql, string callChain | + runSql.outermostWrapperFunctionCall(asSinkExpr(sink), callChain) and + extraText = " and then passed to " + callChain + ) + or + // sink defined using models-as-data + sinkNode(sink, "sql-injection") and extraText = "" +} + module SqlTaintedConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node node) { node instanceof FlowSource } - predicate isSink(DataFlow::Node node) { - exists(SqlLikeFunction runSql | runSql.outermostWrapperFunctionCall(asSinkExpr(node), _)) - or - // sink defined using models-as-data - sinkNode(node, "sql-injection") - } + predicate isSink(DataFlow::Node node) { isSink(node, _) } predicate isBarrier(DataFlow::Node node) { node.asExpr().getUnspecifiedType() instanceof IntegralType @@ -57,32 +62,17 @@ module SqlTaintedConfig implements DataFlow::ConfigSig { } predicate observeDiffInformedIncrementalMode() { any() } - - Location getASelectedSinkLocation(DataFlow::Node sink) { - exists(Expr taintedArg | result = [taintedArg.getLocation(), sink.getLocation()] | - taintedArg = asSinkExpr(sink) - ) - } } module SqlTainted = TaintTracking::Global; from - Expr taintedArg, FlowSource taintSource, SqlTainted::PathNode sourceNode, - SqlTainted::PathNode sinkNode, string extraText + FlowSource taintSource, SqlTainted::PathNode sourceNode, SqlTainted::PathNode sinkNode, + string extraText where - ( - exists(SqlLikeFunction runSql, string callChain | - runSql.outermostWrapperFunctionCall(taintedArg, callChain) and - extraText = " and then passed to " + callChain - ) - or - sinkNode(sinkNode.getNode(), "sql-injection") and - extraText = "" - ) and SqlTainted::flowPath(sourceNode, sinkNode) and - taintedArg = asSinkExpr(sinkNode.getNode()) and + isSink(sinkNode.getNode(), extraText) and taintSource = sourceNode.getNode() -select taintedArg, sourceNode, sinkNode, +select sinkNode.getNode(), sourceNode, sinkNode, "This argument to a SQL query function is derived from $@" + extraText + ".", taintSource, "user input (" + taintSource.getSourceType() + ")" diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected index df780acdd8d0..2e00cb866749 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected @@ -1,11 +1,11 @@ #select -| test.c:21:18:21:23 | query1 | test.c:14:27:14:30 | **argv | test.c:21:18:21:23 | *query1 | This argument to a SQL query function is derived from $@ and then passed to mysql_query(sqlArg). | test.c:14:27:14:30 | **argv | user input (a command-line argument) | -| test.c:51:18:51:23 | query1 | test.c:14:27:14:30 | **argv | test.c:51:18:51:23 | *query1 | This argument to a SQL query function is derived from $@ and then passed to mysql_query(sqlArg). | test.c:14:27:14:30 | **argv | user input (a command-line argument) | -| test.c:76:17:76:25 | userInput | test.c:75:8:75:16 | gets output argument | test.c:76:17:76:25 | *userInput | This argument to a SQL query function is derived from $@ and then passed to SQLPrepare(StatementText). | test.c:75:8:75:16 | gets output argument | user input (string read by gets) | -| test.c:77:20:77:28 | userInput | test.c:75:8:75:16 | gets output argument | test.c:77:20:77:28 | *userInput | This argument to a SQL query function is derived from $@ and then passed to SQLExecDirect(StatementText). | test.c:75:8:75:16 | gets output argument | user input (string read by gets) | -| test.c:106:24:106:29 | query1 | test.c:101:8:101:16 | gets output argument | test.c:106:24:106:29 | *query1 | This argument to a SQL query function is derived from $@. | test.c:101:8:101:16 | gets output argument | user input (string read by gets) | -| test.c:107:28:107:33 | query1 | test.c:101:8:101:16 | gets output argument | test.c:107:28:107:33 | *query1 | This argument to a SQL query function is derived from $@. | test.c:101:8:101:16 | gets output argument | user input (string read by gets) | -| test.cpp:43:27:43:33 | access to array | test.cpp:39:27:39:30 | **argv | test.cpp:43:27:43:33 | *access to array | This argument to a SQL query function is derived from $@ and then passed to pqxx::work::exec1((unnamed parameter 0)). | test.cpp:39:27:39:30 | **argv | user input (a command-line argument) | +| test.c:21:18:21:23 | *query1 | test.c:14:27:14:30 | **argv | test.c:21:18:21:23 | *query1 | This argument to a SQL query function is derived from $@ and then passed to mysql_query(sqlArg). | test.c:14:27:14:30 | **argv | user input (a command-line argument) | +| test.c:51:18:51:23 | *query1 | test.c:14:27:14:30 | **argv | test.c:51:18:51:23 | *query1 | This argument to a SQL query function is derived from $@ and then passed to mysql_query(sqlArg). | test.c:14:27:14:30 | **argv | user input (a command-line argument) | +| test.c:76:17:76:25 | *userInput | test.c:75:8:75:16 | gets output argument | test.c:76:17:76:25 | *userInput | This argument to a SQL query function is derived from $@ and then passed to SQLPrepare(StatementText). | test.c:75:8:75:16 | gets output argument | user input (string read by gets) | +| test.c:77:20:77:28 | *userInput | test.c:75:8:75:16 | gets output argument | test.c:77:20:77:28 | *userInput | This argument to a SQL query function is derived from $@ and then passed to SQLExecDirect(StatementText). | test.c:75:8:75:16 | gets output argument | user input (string read by gets) | +| test.c:106:24:106:29 | query1 | test.c:101:8:101:16 | gets output argument | test.c:106:24:106:29 | query1 | This argument to a SQL query function is derived from $@. | test.c:101:8:101:16 | gets output argument | user input (string read by gets) | +| test.c:107:28:107:33 | query1 | test.c:101:8:101:16 | gets output argument | test.c:107:28:107:33 | query1 | This argument to a SQL query function is derived from $@. | test.c:101:8:101:16 | gets output argument | user input (string read by gets) | +| test.cpp:43:27:43:33 | *access to array | test.cpp:39:27:39:30 | **argv | test.cpp:43:27:43:33 | *access to array | This argument to a SQL query function is derived from $@ and then passed to pqxx::work::exec1((unnamed parameter 0)). | test.cpp:39:27:39:30 | **argv | user input (a command-line argument) | edges | test.c:14:27:14:30 | **argv | test.c:15:20:15:26 | *access to array | provenance | | | test.c:15:20:15:26 | *access to array | test.c:21:18:21:23 | *query1 | provenance | TaintFunction | @@ -17,8 +17,8 @@ edges | test.c:48:20:48:33 | *globalUsername | test.c:51:18:51:23 | *query1 | provenance | TaintFunction | | test.c:75:8:75:16 | gets output argument | test.c:76:17:76:25 | *userInput | provenance | | | test.c:75:8:75:16 | gets output argument | test.c:77:20:77:28 | *userInput | provenance | | -| test.c:101:8:101:16 | gets output argument | test.c:106:24:106:29 | *query1 | provenance | TaintFunction Sink:MaD:2 | -| test.c:101:8:101:16 | gets output argument | test.c:107:28:107:33 | *query1 | provenance | TaintFunction Sink:MaD:1 | +| test.c:101:8:101:16 | gets output argument | test.c:106:24:106:29 | query1 | provenance | TaintFunction Sink:MaD:2 | +| test.c:101:8:101:16 | gets output argument | test.c:107:28:107:33 | query1 | provenance | TaintFunction Sink:MaD:1 | | test.cpp:39:27:39:30 | **argv | test.cpp:43:27:43:33 | *access to array | provenance | | models | 1 | Sink: ; ; false; OCIStmtPrepare2; ; ; Argument[*3]; sql-injection; manual | @@ -37,8 +37,8 @@ nodes | test.c:76:17:76:25 | *userInput | semmle.label | *userInput | | test.c:77:20:77:28 | *userInput | semmle.label | *userInput | | test.c:101:8:101:16 | gets output argument | semmle.label | gets output argument | -| test.c:106:24:106:29 | *query1 | semmle.label | *query1 | -| test.c:107:28:107:33 | *query1 | semmle.label | *query1 | +| test.c:106:24:106:29 | query1 | semmle.label | query1 | +| test.c:107:28:107:33 | query1 | semmle.label | query1 | | test.cpp:39:27:39:30 | **argv | semmle.label | **argv | | test.cpp:43:27:43:33 | *access to array | semmle.label | *access to array | subpaths From 5077b54c4be744ed7638d91092dca9ea92736546 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 18 Aug 2026 18:46:19 +0100 Subject: [PATCH 0385/2098] C++: Accept test changes. Nothing exciting here. --- .../semmle/tests/ExposedSystemData.expected | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/ExposedSystemData.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/ExposedSystemData.expected index 6b4be51fd33e..a174000efec8 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/ExposedSystemData.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/ExposedSystemData.expected @@ -9,11 +9,11 @@ | tests2.cpp:93:14:93:17 | *str1 | tests2.cpp:91:42:91:45 | *str1 | tests2.cpp:93:14:93:17 | *str1 | This operation exposes system data from $@. | tests2.cpp:91:42:91:45 | *str1 | *str1 | | tests2.cpp:102:14:102:15 | *pw | tests2.cpp:101:8:101:15 | *call to getpwuid | tests2.cpp:102:14:102:15 | *pw | This operation exposes system data from $@. | tests2.cpp:101:8:101:15 | *call to getpwuid | *call to getpwuid | | tests2.cpp:111:14:111:19 | *ptr | tests2.cpp:109:12:109:17 | *call to getenv | tests2.cpp:111:14:111:19 | *ptr | This operation exposes system data from $@. | tests2.cpp:109:12:109:17 | *call to getenv | *call to getenv | -| tests2.cpp:138:23:138:34 | *message_data | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:138:23:138:34 | *message_data | This operation exposes system data from $@. | tests2.cpp:134:17:134:22 | *call to getenv | *call to getenv | -| tests2.cpp:144:33:144:40 | *& ... | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:144:33:144:40 | *& ... | This operation exposes system data from $@. | tests2.cpp:134:17:134:22 | *call to getenv | *call to getenv | -| tests2.cpp:147:20:147:27 | *& ... | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:147:20:147:27 | *& ... | This operation exposes system data from $@. | tests2.cpp:134:17:134:22 | *call to getenv | *call to getenv | -| tests2.cpp:155:32:155:39 | *& ... | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:155:32:155:39 | *& ... | This operation exposes system data from $@. | tests2.cpp:134:17:134:22 | *call to getenv | *call to getenv | -| tests2.cpp:158:20:158:27 | *& ... | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:158:20:158:27 | *& ... | This operation exposes system data from $@. | tests2.cpp:134:17:134:22 | *call to getenv | *call to getenv | +| tests2.cpp:138:23:138:34 | message_data | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:138:23:138:34 | message_data | This operation exposes system data from $@. | tests2.cpp:134:17:134:22 | *call to getenv | *call to getenv | +| tests2.cpp:144:33:144:40 | & ... | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:144:33:144:40 | & ... | This operation exposes system data from $@. | tests2.cpp:134:17:134:22 | *call to getenv | *call to getenv | +| tests2.cpp:147:20:147:27 | & ... | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:147:20:147:27 | & ... | This operation exposes system data from $@. | tests2.cpp:134:17:134:22 | *call to getenv | *call to getenv | +| tests2.cpp:155:32:155:39 | & ... | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:155:32:155:39 | & ... | This operation exposes system data from $@. | tests2.cpp:134:17:134:22 | *call to getenv | *call to getenv | +| tests2.cpp:158:20:158:27 | & ... | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:158:20:158:27 | & ... | This operation exposes system data from $@. | tests2.cpp:134:17:134:22 | *call to getenv | *call to getenv | | tests_sockets.cpp:39:19:39:22 | *path | tests_sockets.cpp:26:15:26:20 | *call to getenv | tests_sockets.cpp:39:19:39:22 | *path | This operation exposes system data from $@. | tests_sockets.cpp:26:15:26:20 | *call to getenv | *call to getenv | | tests_sockets.cpp:43:20:43:23 | *path | tests_sockets.cpp:26:15:26:20 | *call to getenv | tests_sockets.cpp:43:20:43:23 | *path | This operation exposes system data from $@. | tests_sockets.cpp:26:15:26:20 | *call to getenv | *call to getenv | | tests_sockets.cpp:76:19:76:22 | *path | tests_sockets.cpp:63:15:63:20 | *call to getenv | tests_sockets.cpp:76:19:76:22 | *path | This operation exposes system data from $@. | tests_sockets.cpp:63:15:63:20 | *call to getenv | *call to getenv | @@ -33,13 +33,13 @@ edges | tests2.cpp:111:14:111:15 | *c1 [*ptr] | tests2.cpp:111:14:111:19 | *ptr | provenance | | | tests2.cpp:111:14:111:15 | *c1 [*ptr] | tests2.cpp:111:17:111:19 | *ptr | provenance | | | tests2.cpp:111:17:111:19 | *ptr | tests2.cpp:111:14:111:19 | *ptr | provenance | | -| tests2.cpp:134:2:134:30 | *... = ... | tests2.cpp:138:23:138:34 | *message_data | provenance | Sink:MaD:2 | +| tests2.cpp:134:2:134:30 | *... = ... | tests2.cpp:138:23:138:34 | message_data | provenance | Sink:MaD:2 | | tests2.cpp:134:2:134:30 | *... = ... | tests2.cpp:143:34:143:45 | *message_data | provenance | | | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:134:2:134:30 | *... = ... | provenance | | -| tests2.cpp:143:24:143:31 | zmq_msg_init_data output argument | tests2.cpp:144:33:144:40 | *& ... | provenance | Sink:MaD:3 | -| tests2.cpp:143:24:143:31 | zmq_msg_init_data output argument | tests2.cpp:147:20:147:27 | *& ... | provenance | Sink:MaD:1 | -| tests2.cpp:143:24:143:31 | zmq_msg_init_data output argument | tests2.cpp:155:32:155:39 | *& ... | provenance | Sink:MaD:3 | -| tests2.cpp:143:24:143:31 | zmq_msg_init_data output argument | tests2.cpp:158:20:158:27 | *& ... | provenance | Sink:MaD:1 | +| tests2.cpp:143:24:143:31 | zmq_msg_init_data output argument | tests2.cpp:144:33:144:40 | & ... | provenance | Sink:MaD:3 | +| tests2.cpp:143:24:143:31 | zmq_msg_init_data output argument | tests2.cpp:147:20:147:27 | & ... | provenance | Sink:MaD:1 | +| tests2.cpp:143:24:143:31 | zmq_msg_init_data output argument | tests2.cpp:155:32:155:39 | & ... | provenance | Sink:MaD:3 | +| tests2.cpp:143:24:143:31 | zmq_msg_init_data output argument | tests2.cpp:158:20:158:27 | & ... | provenance | Sink:MaD:1 | | tests2.cpp:143:34:143:45 | *message_data | tests2.cpp:143:24:143:31 | zmq_msg_init_data output argument | provenance | MaD:4 | | tests_sockets.cpp:26:15:26:20 | *call to getenv | tests_sockets.cpp:26:15:26:20 | *call to getenv | provenance | | | tests_sockets.cpp:26:15:26:20 | *call to getenv | tests_sockets.cpp:39:19:39:22 | *path | provenance | | @@ -78,13 +78,13 @@ nodes | tests2.cpp:111:17:111:19 | *ptr | semmle.label | *ptr | | tests2.cpp:134:2:134:30 | *... = ... | semmle.label | *... = ... | | tests2.cpp:134:17:134:22 | *call to getenv | semmle.label | *call to getenv | -| tests2.cpp:138:23:138:34 | *message_data | semmle.label | *message_data | +| tests2.cpp:138:23:138:34 | message_data | semmle.label | message_data | | tests2.cpp:143:24:143:31 | zmq_msg_init_data output argument | semmle.label | zmq_msg_init_data output argument | | tests2.cpp:143:34:143:45 | *message_data | semmle.label | *message_data | -| tests2.cpp:144:33:144:40 | *& ... | semmle.label | *& ... | -| tests2.cpp:147:20:147:27 | *& ... | semmle.label | *& ... | -| tests2.cpp:155:32:155:39 | *& ... | semmle.label | *& ... | -| tests2.cpp:158:20:158:27 | *& ... | semmle.label | *& ... | +| tests2.cpp:144:33:144:40 | & ... | semmle.label | & ... | +| tests2.cpp:147:20:147:27 | & ... | semmle.label | & ... | +| tests2.cpp:155:32:155:39 | & ... | semmle.label | & ... | +| tests2.cpp:158:20:158:27 | & ... | semmle.label | & ... | | tests_sockets.cpp:26:15:26:20 | *call to getenv | semmle.label | *call to getenv | | tests_sockets.cpp:26:15:26:20 | *call to getenv | semmle.label | *call to getenv | | tests_sockets.cpp:39:19:39:22 | *path | semmle.label | *path | From 20788f1f69c794294d53ab52154ec26e5e0ccd5f Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Wed, 19 Aug 2026 16:23:55 +0100 Subject: [PATCH 0386/2098] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll index 0513c2ba92e9..d09b10aa632b 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll @@ -517,7 +517,7 @@ abstract class ArgumentNode extends Node { /** * Holds if this argument occurs at the given position in the given call, - * and this call part of a summary. + * and this call is part of a summary. * The instance argument is considered to have index `-1`. */ predicate summaryArgumentOf(FlowSummaryImpl::Public::SummarizedCallable call, ArgumentPosition pos) { From 98285faab0e4d569537d70c37f4a021c043cf0e5 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Wed, 19 Aug 2026 16:26:13 +0100 Subject: [PATCH 0387/2098] C++: Add change note. --- .../2026-08-19-access-paths-for-sources-and-sinks.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 cpp/ql/lib/change-notes/2026-08-19-access-paths-for-sources-and-sinks.md diff --git a/cpp/ql/lib/change-notes/2026-08-19-access-paths-for-sources-and-sinks.md b/cpp/ql/lib/change-notes/2026-08-19-access-paths-for-sources-and-sinks.md new file mode 100644 index 000000000000..7cbe82b6f8e9 --- /dev/null +++ b/cpp/ql/lib/change-notes/2026-08-19-access-paths-for-sources-and-sinks.md @@ -0,0 +1,4 @@ +--- +category: feature +--- +* Sources and sinks defined using models-as-data now support access paths with fields. For example, the path `ReturnValue.Field[S::f]` makes the field `S::f` a flow source when it is returned by a call. \ No newline at end of file From 2e43cea169c42743745fb9bb897808d0b776d721 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Wed, 19 Aug 2026 16:41:36 +0100 Subject: [PATCH 0388/2098] C++: Fix bug spotted by Copilot. --- .../ir/dataflow/internal/DataFlowNodes.qll | 1 + .../dataflow/external-models/flow.expected | 4 +-- .../dataflow/external-models/sources.expected | 2 +- .../models-as-data/testModels.expected | 30 +++++++++---------- 4 files changed, 19 insertions(+), 18 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll index 16e2130eb229..541b6d13b149 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll @@ -1575,6 +1575,7 @@ private class SourceOutputNode extends FlowSummaryImpl::Private::SourceOutputNod } private predicate isOutArgument(Call call) { + call.getTarget() = this.getSourceElement() and [call.getAnArgument(), call.getQualifier()] = this.getSourceSinkReportingElement() } } diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index 99ce09880165..2532476fd1a0 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -122,8 +122,8 @@ edges | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | azure.cpp:282:10:282:38 | call to ReadToEnd | provenance | | | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | | | azure.cpp:289:24:289:56 | call to GetHeader | azure.cpp:289:63:289:65 | call to Value | provenance | MaD:85 | -| azure.cpp:289:32:289:40 | Value output argument | azure.cpp:289:32:289:40 | call to GetHeader | provenance | Src:MaD:43 | | azure.cpp:289:32:289:40 | call to GetHeader | azure.cpp:289:24:289:56 | call to GetHeader | provenance | | +| azure.cpp:289:32:289:40 | call to GetHeader | azure.cpp:289:32:289:40 | call to GetHeader | provenance | Src:MaD:43 | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:289:63:289:65 | call to Value | provenance | | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:290:10:290:20 | headerValue | provenance | | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:290:10:290:20 | headerValue | provenance | | @@ -467,7 +467,7 @@ nodes | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | semmle.label | call to ReadToEnd [element] | | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | semmle.label | call to ReadToEnd [element] | | azure.cpp:289:24:289:56 | call to GetHeader | semmle.label | call to GetHeader | -| azure.cpp:289:32:289:40 | Value output argument | semmle.label | Value output argument | +| azure.cpp:289:32:289:40 | call to GetHeader | semmle.label | call to GetHeader | | azure.cpp:289:32:289:40 | call to GetHeader | semmle.label | call to GetHeader | | azure.cpp:289:63:289:65 | call to Value | semmle.label | call to Value | | azure.cpp:289:63:289:65 | call to Value | semmle.label | call to Value | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected index 9dfb62bdafde..9c04945642e9 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected @@ -3,7 +3,7 @@ | azure.cpp:273:52:273:61 | call to GetHeaders | remote | | azure.cpp:277:38:277:44 | call to GetBody | remote | | azure.cpp:281:68:281:84 | call to ExtractBodyStream | remote | -| azure.cpp:289:32:289:40 | Value output argument | remote | +| azure.cpp:289:32:289:40 | call to GetHeader | remote | | azure.cpp:293:58:293:67 | call to GetHeaders | remote | | test.cpp:10:10:10:18 | call to ymlSource | local | | test.cpp:56:8:56:16 | call to ymlSource | local | diff --git a/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.expected b/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.expected index 899b9bf80353..ee106e24edb1 100644 --- a/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.expected +++ b/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.expected @@ -283,19 +283,19 @@ sourceCallables | tests.cpp:433:6:433:10 | array | | tests.cpp:434:6:434:6 | y | flowSummaryNode -| tests.cpp:36:7:36:20 | sink output argument | | | test_sources | -| tests.cpp:37:7:37:21 | sink output argument | | | test_sources | -| tests.cpp:39:7:39:24 | sink output argument | | | test_sources | -| tests.cpp:40:7:40:27 | sink output argument | | | test_sources | +| tests.cpp:36:7:36:20 | call to localMadSource | | | test_sources | +| tests.cpp:37:7:37:21 | call to remoteMadSource | | | test_sources | +| tests.cpp:39:7:39:24 | call to localMadSourceVoid | | | test_sources | +| tests.cpp:40:7:40:27 | call to localMadSourceHasBody | | | test_sources | | tests.cpp:45:10:45:23 | call to localMadSource | | | test_sources | -| tests.cpp:53:7:53:29 | sink output argument | | | test_sources | +| tests.cpp:53:7:53:29 | call to remoteMadSourceIndirect | | | test_sources | | tests.cpp:54:8:54:30 | call to remoteMadSourceIndirect | | | test_sources | | tests.cpp:55:8:55:36 | call to remoteMadSourceDoubleIndirect | | | test_sources | | tests.cpp:56:9:56:37 | call to remoteMadSourceDoubleIndirect | | | test_sources | | tests.cpp:60:30:60:31 | remoteMadSourceIndirectArg0 output argument | | | test_sources | | tests.cpp:63:33:63:33 | remoteMadSourceIndirectArg1 output argument | | | test_sources | | tests.cpp:67:10:67:23 | call to localMadSource | | | test_sources | -| tests.cpp:70:7:70:57 | sink output argument | | | test_sources | +| tests.cpp:70:7:70:57 | call to namespace2LocalMadSource | | | test_sources | | tests.cpp:75:32:75:32 | x | | | remoteMadSourceParam0 | | tests.cpp:95:14:95:19 | call to source | | | test_sinks | | tests.cpp:97:24:97:24 | 0 | | | test_sinks | @@ -316,9 +316,9 @@ flowSummaryNode | tests.cpp:109:22:109:26 | a_ptr | | | test_sinks | | tests.cpp:110:28:110:33 | & ... | | | test_sinks | | tests.cpp:111:14:111:27 | call to localMadSource | | | test_sinks | -| tests.cpp:111:14:111:27 | madSinkArg0 output argument | | | test_sinks | +| tests.cpp:111:14:111:27 | call to localMadSource | | | test_sinks | +| tests.cpp:112:22:112:44 | call to remoteMadSourceIndirect | | | test_sinks | | tests.cpp:112:22:112:44 | call to remoteMadSourceIndirect | | | test_sinks | -| tests.cpp:112:22:112:44 | madSinkIndirectArg0 output argument | | | test_sinks | | tests.cpp:127:5:127:19 | [summary param] 0 in madArg0ToReturn | ParameterNode | madArg0ToReturn | madArg0ToReturn | | tests.cpp:127:5:127:19 | [summary] to write: ReturnValue in madArg0ToReturn | ReturnNode | madArg0ToReturn | madArg0ToReturn | | tests.cpp:128:6:128:28 | [summary param] 0 in madArg0ToReturnIndirect | ParameterNode | madArg0ToReturnIndirect | madArg0ToReturnIndirect | @@ -362,9 +362,9 @@ flowSummaryNode | tests.cpp:148:13:148:40 | [summary] to write: ReturnValue in madArg0ToReturnFieldIndirect | ReturnNode | madArg0ToReturnFieldIndirect | madArg0ToReturnFieldIndirect | | tests.cpp:148:13:148:40 | [summary] to write: ReturnValue.Field[*MyContainer::ptr]/Field[*ptr] in madArg0ToReturnFieldIndirect | | madArg0ToReturnFieldIndirect | madArg0ToReturnFieldIndirect | | tests.cpp:225:14:225:28 | call to madArg0ToReturn | | | test_summaries | -| tests.cpp:225:30:225:44 | madArg0ToReturn output argument | | | test_summaries | +| tests.cpp:225:30:225:44 | call to remoteMadSource | | | test_summaries | | tests.cpp:226:14:226:37 | call to madArg0ToReturnValueFlow | | | test_summaries | -| tests.cpp:226:39:226:53 | madArg0ToReturnValueFlow output argument | | | test_summaries | +| tests.cpp:226:39:226:53 | call to remoteMadSource | | | test_summaries | | tests.cpp:227:14:227:36 | call to madArg0IndirectToReturn | | | test_summaries | | tests.cpp:228:14:228:36 | call to madArg0IndirectToReturn | | | test_summaries | | tests.cpp:250:7:250:19 | [summary param] 0 in madArg0ToSelf | ParameterNode | madArg0ToSelf | madArg0ToSelf | @@ -381,16 +381,16 @@ flowSummaryNode | tests.cpp:254:6:254:21 | [summary] to write: ReturnValue in madFieldToReturn | ReturnNode | madFieldToReturn | madFieldToReturn | | tests.cpp:277:7:277:30 | [summary param] this in namespaceMadSelfToReturn | ParameterNode | namespaceMadSelfToReturn | namespaceMadSelfToReturn | | tests.cpp:277:7:277:30 | [summary] to write: ReturnValue in namespaceMadSelfToReturn | ReturnNode | namespaceMadSelfToReturn | namespaceMadSelfToReturn | -| tests.cpp:292:10:292:30 | sink output argument | | | test_class_members | +| tests.cpp:292:10:292:30 | call to memberRemoteMadSource | | | test_class_members | | tests.cpp:295:39:295:40 | memberRemoteMadSourceIndirectArg0 output argument | | | test_class_members | -| tests.cpp:300:11:300:31 | sink output argument | | | test_class_members | -| tests.cpp:301:11:301:33 | sink output argument | | | test_class_members | -| tests.cpp:303:11:303:33 | sink output argument | | | test_class_members | +| tests.cpp:300:11:300:31 | call to memberRemoteMadSource | | | test_class_members | +| tests.cpp:301:11:301:33 | call to subtypeRemoteMadSource1 | | | test_class_members | +| tests.cpp:303:11:303:33 | call to subtypeRemoteMadSource2 | | | test_class_members | | tests.cpp:307:23:307:28 | call to source | | | test_class_members | | tests.cpp:309:33:309:38 | call to source | | | test_class_members | | tests.cpp:310:57:310:62 | call to source | | | test_class_members | | tests.cpp:351:26:351:46 | call to memberRemoteMadSource | | | test_class_members | -| tests.cpp:351:26:351:46 | memberMadSinkArg0 output argument | | | test_class_members | +| tests.cpp:351:26:351:46 | call to memberRemoteMadSource | | | test_class_members | | tests.cpp:362:2:362:4 | mc8 | | | test_class_members | | tests.cpp:362:24:362:24 | 0 | | | test_class_members | | tests.cpp:363:2:363:4 | mc8 | | | test_class_members | From f6e24e33d9f7064e2fa0aa71e91cc7a887eb2a38 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Wed, 19 Aug 2026 17:52:15 +0200 Subject: [PATCH 0389/2098] C++/Ruby: Clean up supported compilers * C++: Since preliminary support for clang-cl was added, our frontend provider has much improved support. Drop the preliminary note. * Ruby: We require glibc 2.17 everywhere on Linux x86. So, Ruby isn't special here anymore. Drop the note. --- .../supported-versions-compilers.rst | 40 +++++++++---------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/docs/codeql/reusables/supported-versions-compilers.rst b/docs/codeql/reusables/supported-versions-compilers.rst index 15b21cc94b04..8e7928cb2784 100644 --- a/docs/codeql/reusables/supported-versions-compilers.rst +++ b/docs/codeql/reusables/supported-versions-compilers.rst @@ -4,13 +4,13 @@ :stub-columns: 1 Language,Variants,Compilers,Extensions - C/C++,"C89, C99, C11, C17, C23, C++98, C++03, C++11, C++14, C++17, C++20, C++23 [1]_ [2]_ [3]_","Clang (including clang-cl [4]_ and armclang) extensions (up to Clang 21), + C/C++,"C89, C99, C11, C17, C23, C++98, C++03, C++11, C++14, C++17, C++20, C++23 [1]_ [2]_ [3]_","Clang (including clang-cl and armclang) extensions (up to Clang 21), GNU extensions (up to GCC 15), Microsoft extensions (up to VS 2022), - Arm Compiler 5 [5]_","``.cpp``, ``.c++``, ``.cxx``, ``.hpp``, ``.hh``, ``.h++``, ``.hxx``, ``.c``, ``.cc``, ``.h``" + Arm Compiler 5 [4]_","``.cpp``, ``.c++``, ``.cxx``, ``.hpp``, ``.hh``, ``.h++``, ``.hxx``, ``.c``, ``.cc``, ``.h``" C#,C# up to 14,"Microsoft Visual Studio up to 2019 with .NET up to 4.8, .NET Core up to 3.1 @@ -18,30 +18,28 @@ .NET 5, .NET 6, .NET 7, .NET 8, .NET 9, .NET 10","``.sln``, ``.slnx``, ``.csproj``, ``.cs``, ``.cshtml``, ``.xaml``" GitHub Actions,"Not applicable",Not applicable,"``.github/workflows/*.yml``, ``.github/workflows/*.yaml``, ``**/action.yml``, ``**/action.yaml``" Go (aka Golang), "Go up to 1.26", "Go 1.11 or more recent", ``.go`` - Java,"Java 7 to 26 [6]_","javac (OpenJDK and Oracle JDK), + Java,"Java 7 to 26 [5]_","javac (OpenJDK and Oracle JDK), - Eclipse compiler for Java (ECJ) [7]_",``.java`` + Eclipse compiler for Java (ECJ) [6]_",``.java`` Kotlin,"Kotlin 1.8.0 to 2.4.1\ *x*","kotlinc",``.kt`` - JavaScript,ECMAScript 2022 or lower,Not applicable,"``.js``, ``.jsx``, ``.mjs``, ``.es``, ``.es6``, ``.htm``, ``.html``, ``.xhtm``, ``.xhtml``, ``.vue``, ``.hbs``, ``.ejs``, ``.njk``, ``.json``, ``.yaml``, ``.yml``, ``.raml``, ``.xml`` [8]_" - Python [9]_,"2.7, 3.5, 3.6, 3.7, 3.8, 3.9, 3.10, 3.11, 3.12, 3.13, 3.14",Not applicable,``.py`` - Ruby [10]_,"up to 3.3",Not applicable,"``.rb``, ``.erb``, ``.gemspec``, ``Gemfile``" - Rust [11]_,"Rust editions 2021 and 2024","Rust compiler","``.rs``, ``Cargo.toml``" - Swift [12]_ [13]_,"Swift 5.4-6.3","Swift compiler","``.swift``" - TypeScript [14]_,"2.6-7.0",Standard TypeScript compiler,"``.ts``, ``.tsx``, ``.mts``, ``.cts``" + JavaScript,ECMAScript 2022 or lower,Not applicable,"``.js``, ``.jsx``, ``.mjs``, ``.es``, ``.es6``, ``.htm``, ``.html``, ``.xhtm``, ``.xhtml``, ``.vue``, ``.hbs``, ``.ejs``, ``.njk``, ``.json``, ``.yaml``, ``.yml``, ``.raml``, ``.xml`` [7]_" + Python [8]_,"2.7, 3.5, 3.6, 3.7, 3.8, 3.9, 3.10, 3.11, 3.12, 3.13, 3.14",Not applicable,``.py`` + Ruby,"up to 3.3",Not applicable,"``.rb``, ``.erb``, ``.gemspec``, ``Gemfile``" + Rust [9]_,"Rust editions 2021 and 2024","Rust compiler","``.rs``, ``Cargo.toml``" + Swift [10]_ [11]_,"Swift 5.4-6.3","Swift compiler","``.swift``" + TypeScript [12]_,"2.6-7.0",Standard TypeScript compiler,"``.ts``, ``.tsx``, ``.mts``, ``.cts``" .. container:: footnote-group .. [1] C++20 modules are *not* supported. .. [2] C23 and C++23 support is currently in beta. .. [3] Objective-C, Objective-C++, C++/CLI, and C++/CX are not supported. - .. [4] Support for the clang-cl compiler is preliminary. - .. [5] Support for the Arm Compiler (armcc) is preliminary. - .. [6] Builds that execute on Java 7 to 26 can be analyzed. The analysis understands standard language features in Java 8 to 26; "preview" and "incubator" features are not supported. Source code using Java language versions older than Java 8 are analyzed as Java 8 code. - .. [7] ECJ is supported when the build invokes it via the Maven Compiler plugin or the Takari Lifecycle plugin. - .. [8] JSX and Flow code, YAML, JSON, HTML, and XML files may also be analyzed with JavaScript files. - .. [9] The extractor requires Python 3 to run. To analyze Python 2.7 you should install both versions of Python. - .. [10] Requires glibc 2.17. - .. [11] Requires ``rustup`` and ``cargo`` to be installed. Features from nightly toolchains are not supported. - .. [12] Support for the analysis of Swift requires macOS. - .. [13] Embedded Swift is not supported. - .. [14] TypeScript analysis is performed by running the JavaScript extractor with TypeScript enabled. This is the default. + .. [4] Support for the Arm Compiler (armcc) is preliminary. + .. [5] Builds that execute on Java 7 to 26 can be analyzed. The analysis understands standard language features in Java 8 to 26; "preview" and "incubator" features are not supported. Source code using Java language versions older than Java 8 are analyzed as Java 8 code. + .. [6] ECJ is supported when the build invokes it via the Maven Compiler plugin or the Takari Lifecycle plugin. + .. [7] JSX and Flow code, YAML, JSON, HTML, and XML files may also be analyzed with JavaScript files. + .. [8] The extractor requires Python 3 to run. To analyze Python 2.7 you should install both versions of Python. + .. [9] Requires ``rustup`` and ``cargo`` to be installed. Features from nightly toolchains are not supported. + .. [10] Support for the analysis of Swift requires macOS. + .. [11] Embedded Swift is not supported. + .. [12] TypeScript analysis is performed by running the JavaScript extractor with TypeScript enabled. This is the default. From 0a376e8023eebdfc888cbc87fae8f295f2f3fc1e Mon Sep 17 00:00:00 2001 From: Jordan Pike Date: Wed, 19 Aug 2026 11:59:07 -0400 Subject: [PATCH 0390/2098] Split change note into breaking and minorAnalysis notes The introduction of EventActorIfCheck is technically a breaking change for anything extending or referencing ActorIfCheck, so record the class split separately under the breaking category. Also stop naming a specific query in the analysis note since many queries use ControlCheck. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 4084febb-f9c7-44df-baf3-c8be8e9932a7 --- .../change-notes/2026-08-17-actor-if-check-event-validity.md | 2 +- .../lib/change-notes/2026-08-18-split-event-actor-if-check.md | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 actions/ql/lib/change-notes/2026-08-18-split-event-actor-if-check.md diff --git a/actions/ql/lib/change-notes/2026-08-17-actor-if-check-event-validity.md b/actions/ql/lib/change-notes/2026-08-17-actor-if-check-event-validity.md index 4397e9487415..72f3c3fd4ece 100644 --- a/actions/ql/lib/change-notes/2026-08-17-actor-if-check-event-validity.md +++ b/actions/ql/lib/change-notes/2026-08-17-actor-if-check-event-validity.md @@ -1,4 +1,4 @@ --- category: minorAnalysis --- -* Checks on actor fields read from the event payload (e.g. `github.event.pull_request.user.login`) now only count as protection for events whose payload actually populates that field. These checks were split out of `ActorIfCheck` into a new class `EventActorIfCheck`, and `ActorIfCheck` now only covers `github.actor` and `github.triggering_actor`. Previously, a condition such as `github.event.pull_request.user.login != 'name'` on a workflow triggered by `issues` events was treated as a protective check even though `github.event.pull_request` is not populated for `issues` events, which makes the condition vacuous. This change will result in more results being found by the queries that rely on control checks, such as `actions/code-injection/critical`. +* Checks on actor fields read from the event payload (e.g. `github.event.pull_request.user.login`) now only count as protection for events whose payload actually populates that field. Previously, a condition such as `github.event.pull_request.user.login != 'name'` on a workflow triggered by `issues` events was treated as a protective check even though `github.event.pull_request` is not populated for `issues` events, which makes the condition vacuous. This change may result in more alerts for queries using the `ControlCheck` class. diff --git a/actions/ql/lib/change-notes/2026-08-18-split-event-actor-if-check.md b/actions/ql/lib/change-notes/2026-08-18-split-event-actor-if-check.md new file mode 100644 index 000000000000..6b6d94df337c --- /dev/null +++ b/actions/ql/lib/change-notes/2026-08-18-split-event-actor-if-check.md @@ -0,0 +1,4 @@ +--- +category: breaking +--- +* Checks on actor fields read from the event payload (e.g. `github.event.pull_request.user.login`) were split out of `ActorIfCheck` into a new class `EventActorIfCheck`. The `ActorIfCheck` class now only covers `github.actor` and `github.triggering_actor`. From e082ae85db41e0f8172cb381957c0c5c1eba2034 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 19 Aug 2026 15:51:28 +0100 Subject: [PATCH 0391/2098] Rust: Expand the test cases. --- .../format-macros-legacy/FormatArgs.expected | 14 ++++--- .../LogInjection.expected | 38 +++++++++---------- .../inline-taint-flow.expected | 14 +++++++ .../format-macros-legacy/main.rs | 37 ++++++++++++++---- 4 files changed, 70 insertions(+), 33 deletions(-) diff --git a/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.expected b/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.expected index ed2b1199c6aa..0935662bb71c 100644 --- a/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.expected +++ b/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.expected @@ -2,9 +2,11 @@ | main.rs:16:10:16:23 | FormatArgsExpr | 0 | | main.rs:19:13:19:36 | FormatArgsExpr | 1 | | main.rs:33:25:33:33 | FormatArgsExpr | 1 | -| main.rs:38:13:38:32 | FormatArgsExpr | 1 | -| main.rs:39:13:39:32 | FormatArgsExpr | 0 | -| main.rs:49:5:49:27 | FormatArgsExpr | 1 | -| main.rs:50:5:50:26 | FormatArgsExpr | 0 | -| main.rs:51:5:51:25 | FormatArgsExpr | 1 | -| main.rs:52:5:52:24 | FormatArgsExpr | 0 | +| main.rs:44:40:44:46 | FormatArgsExpr | 0 | +| main.rs:49:52:49:58 | FormatArgsExpr | 0 | +| main.rs:55:13:55:33 | FormatArgsExpr | 1 | +| main.rs:60:13:60:33 | FormatArgsExpr | 0 | +| main.rs:70:5:70:27 | FormatArgsExpr | 1 | +| main.rs:71:5:71:26 | FormatArgsExpr | 0 | +| main.rs:72:5:72:25 | FormatArgsExpr | 1 | +| main.rs:73:5:73:24 | FormatArgsExpr | 0 | diff --git a/rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected b/rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected index 6ab010521f33..a08e58f094fc 100644 --- a/rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected +++ b/rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected @@ -1,28 +1,28 @@ #select -| main.rs:49:5:49:27 | FormatArgsExpr | main.rs:47:19:47:45 | ...::var(...) | main.rs:49:5:49:27 | FormatArgsExpr | Log entry depends on a $@. | main.rs:47:19:47:45 | ...::var(...) | user-provided value | -| main.rs:50:5:50:26 | FormatArgsExpr | main.rs:47:19:47:45 | ...::var(...) | main.rs:50:5:50:26 | FormatArgsExpr | Log entry depends on a $@. | main.rs:47:19:47:45 | ...::var(...) | user-provided value | -| main.rs:51:5:51:25 | FormatArgsExpr | main.rs:47:19:47:45 | ...::var(...) | main.rs:51:5:51:25 | FormatArgsExpr | Log entry depends on a $@. | main.rs:47:19:47:45 | ...::var(...) | user-provided value | -| main.rs:52:5:52:24 | FormatArgsExpr | main.rs:47:19:47:45 | ...::var(...) | main.rs:52:5:52:24 | FormatArgsExpr | Log entry depends on a $@. | main.rs:47:19:47:45 | ...::var(...) | user-provided value | +| main.rs:70:5:70:27 | FormatArgsExpr | main.rs:68:19:68:45 | ...::var(...) | main.rs:70:5:70:27 | FormatArgsExpr | Log entry depends on a $@. | main.rs:68:19:68:45 | ...::var(...) | user-provided value | +| main.rs:71:5:71:26 | FormatArgsExpr | main.rs:68:19:68:45 | ...::var(...) | main.rs:71:5:71:26 | FormatArgsExpr | Log entry depends on a $@. | main.rs:68:19:68:45 | ...::var(...) | user-provided value | +| main.rs:72:5:72:25 | FormatArgsExpr | main.rs:68:19:68:45 | ...::var(...) | main.rs:72:5:72:25 | FormatArgsExpr | Log entry depends on a $@. | main.rs:68:19:68:45 | ...::var(...) | user-provided value | +| main.rs:73:5:73:24 | FormatArgsExpr | main.rs:68:19:68:45 | ...::var(...) | main.rs:73:5:73:24 | FormatArgsExpr | Log entry depends on a $@. | main.rs:68:19:68:45 | ...::var(...) | user-provided value | edges -| main.rs:47:9:47:15 | tainted | main.rs:49:5:49:27 | FormatArgsExpr | provenance | Sink:MaD:2 | -| main.rs:47:9:47:15 | tainted | main.rs:50:5:50:26 | FormatArgsExpr | provenance | Sink:MaD:1 | -| main.rs:47:9:47:15 | tainted | main.rs:51:5:51:25 | FormatArgsExpr | provenance | Sink:MaD:2 | -| main.rs:47:9:47:15 | tainted | main.rs:52:5:52:24 | FormatArgsExpr | provenance | Sink:MaD:1 | -| main.rs:47:19:47:45 | ...::var(...) | main.rs:47:19:47:45 | ...::var(...) [Ok] | provenance | Src:MaD:3 | -| main.rs:47:19:47:45 | ...::var(...) [Ok] | main.rs:47:19:47:65 | ... .unwrap_or_default() | provenance | MaD:4 | -| main.rs:47:19:47:65 | ... .unwrap_or_default() | main.rs:47:9:47:15 | tainted | provenance | | +| main.rs:68:9:68:15 | tainted | main.rs:70:5:70:27 | FormatArgsExpr | provenance | Sink:MaD:2 | +| main.rs:68:9:68:15 | tainted | main.rs:71:5:71:26 | FormatArgsExpr | provenance | Sink:MaD:1 | +| main.rs:68:9:68:15 | tainted | main.rs:72:5:72:25 | FormatArgsExpr | provenance | Sink:MaD:2 | +| main.rs:68:9:68:15 | tainted | main.rs:73:5:73:24 | FormatArgsExpr | provenance | Sink:MaD:1 | +| main.rs:68:19:68:45 | ...::var(...) | main.rs:68:19:68:45 | ...::var(...) [Ok] | provenance | Src:MaD:3 | +| main.rs:68:19:68:45 | ...::var(...) [Ok] | main.rs:68:19:68:65 | ... .unwrap_or_default() | provenance | MaD:4 | +| main.rs:68:19:68:65 | ... .unwrap_or_default() | main.rs:68:9:68:15 | tainted | provenance | | models | 1 | Sink: std::io::stdio::_eprint; Argument[0]; log-injection | | 2 | Sink: std::io::stdio::_print; Argument[0]; log-injection | | 3 | Source: std::env::var; ReturnValue.Field[core::result::Result::Ok(0)]; environment | | 4 | Summary: ::unwrap_or_default; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | nodes -| main.rs:47:9:47:15 | tainted | semmle.label | tainted | -| main.rs:47:19:47:45 | ...::var(...) | semmle.label | ...::var(...) | -| main.rs:47:19:47:45 | ...::var(...) [Ok] | semmle.label | ...::var(...) [Ok] | -| main.rs:47:19:47:65 | ... .unwrap_or_default() | semmle.label | ... .unwrap_or_default() | -| main.rs:49:5:49:27 | FormatArgsExpr | semmle.label | FormatArgsExpr | -| main.rs:50:5:50:26 | FormatArgsExpr | semmle.label | FormatArgsExpr | -| main.rs:51:5:51:25 | FormatArgsExpr | semmle.label | FormatArgsExpr | -| main.rs:52:5:52:24 | FormatArgsExpr | semmle.label | FormatArgsExpr | +| main.rs:68:9:68:15 | tainted | semmle.label | tainted | +| main.rs:68:19:68:45 | ...::var(...) | semmle.label | ...::var(...) | +| main.rs:68:19:68:45 | ...::var(...) [Ok] | semmle.label | ...::var(...) [Ok] | +| main.rs:68:19:68:65 | ... .unwrap_or_default() | semmle.label | ... .unwrap_or_default() | +| main.rs:70:5:70:27 | FormatArgsExpr | semmle.label | FormatArgsExpr | +| main.rs:71:5:71:26 | FormatArgsExpr | semmle.label | FormatArgsExpr | +| main.rs:72:5:72:25 | FormatArgsExpr | semmle.label | FormatArgsExpr | +| main.rs:73:5:73:24 | FormatArgsExpr | semmle.label | FormatArgsExpr | subpaths diff --git a/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected b/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected index 59e89e2641a0..b2503dd3a2e5 100644 --- a/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected +++ b/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected @@ -14,6 +14,12 @@ edges | main.rs:19:9:19:9 | s | main.rs:20:10:20:10 | s | provenance | | | main.rs:19:13:19:36 | ...::format(...) | main.rs:19:9:19:9 | s | provenance | | | main.rs:19:13:19:36 | FormatArgsExpr | main.rs:19:13:19:36 | ...::format(...) | provenance | MaD:1 | +| main.rs:32:9:32:9 | a | main.rs:33:9:33:9 | b | provenance | | +| main.rs:32:13:32:21 | source(...) | main.rs:32:9:32:9 | a | provenance | | +| main.rs:33:9:33:9 | b | main.rs:34:30:34:30 | b | provenance | | +| main.rs:34:9:34:9 | c | main.rs:35:10:35:10 | c | provenance | | +| main.rs:34:13:34:31 | ...::format(...) | main.rs:34:9:34:9 | c | provenance | | +| main.rs:34:30:34:30 | b | main.rs:34:13:34:31 | ...::format(...) | provenance | MaD:1 | nodes | main.rs:12:9:12:9 | a | semmle.label | a | | main.rs:12:13:12:21 | source(...) | semmle.label | source(...) | @@ -31,9 +37,17 @@ nodes | main.rs:19:13:19:36 | ...::format(...) | semmle.label | ...::format(...) | | main.rs:19:13:19:36 | FormatArgsExpr | semmle.label | FormatArgsExpr | | main.rs:20:10:20:10 | s | semmle.label | s | +| main.rs:32:9:32:9 | a | semmle.label | a | +| main.rs:32:13:32:21 | source(...) | semmle.label | source(...) | +| main.rs:33:9:33:9 | b | semmle.label | b | +| main.rs:34:9:34:9 | c | semmle.label | c | +| main.rs:34:13:34:31 | ...::format(...) | semmle.label | ...::format(...) | +| main.rs:34:30:34:30 | b | semmle.label | b | +| main.rs:35:10:35:10 | c | semmle.label | c | subpaths testFailures #select | main.rs:13:10:13:25 | MacroExpr | main.rs:12:13:12:21 | source(...) | main.rs:13:10:13:25 | MacroExpr | $@ | main.rs:12:13:12:21 | source(...) | source(...) | | main.rs:16:10:16:23 | MacroExpr | main.rs:15:13:15:21 | source(...) | main.rs:16:10:16:23 | MacroExpr | $@ | main.rs:15:13:15:21 | source(...) | source(...) | | main.rs:20:10:20:10 | s | main.rs:18:13:18:21 | source(...) | main.rs:20:10:20:10 | s | $@ | main.rs:18:13:18:21 | source(...) | source(...) | +| main.rs:35:10:35:10 | c | main.rs:32:13:32:21 | source(...) | main.rs:35:10:35:10 | c | $@ | main.rs:32:13:32:21 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/format-macros-legacy/main.rs b/rust/ql/test/library-tests/format-macros-legacy/main.rs index df0d740a1443..2fe9acba1213 100644 --- a/rust/ql/test/library-tests/format-macros-legacy/main.rs +++ b/rust/ql/test/library-tests/format-macros-legacy/main.rs @@ -6,7 +6,7 @@ fn source(i: i64) -> String { i.to_string() } -fn sink(s: String) {} +fn sink(_s: String) {} pub fn format_flow() { let a = source(1); @@ -29,15 +29,36 @@ pub fn exercises_reconstruction() { // behavior on >=1.94, where the `Write::write_fmt` content-to-self taint // model is also missing. So it is a pre-existing model gap, not a // regression from the reconstruction. - let d = source(4); - let _ = format_args!("{}", d); + let a = source(4); + let b = format_args!("{}", a); + let c = std::fmt::format(b); + sink(c); // $ hasTaintFlow=4 + + let mut buf1 = String::new(); + let d = source(5); + let _ = buf1.write_str(d.as_str()); + sink(buf1); // $ MISSING: hasTaintFlow=5 + + let mut buf2 = String::new(); + let e = source(6); + let _ = buf2.write_fmt(format_args!("{e}")); + sink(buf2); // $ MISSING: hasTaintFlow=6 + + let mut buf3 = String::new(); + let f = source(7); + let _ = std::fmt::write(&mut buf3, format_args!("{f}")); + sink(buf3); // $ MISSING: hasTaintFlow=7 use std::fmt::Write; - let mut buf = String::new(); - let e = source(5); - let _ = write!(buf, "{}", e); - let _ = writeln!(buf, "{e}"); - sink(buf); + let mut buf4 = String::new(); + let g = source(8); + let _ = write!(buf4, "{}", g); + sink(buf4); // $ MISSING: hasTaintFlow=8 + + let mut buf5 = String::new(); + let h = source(9); + let _ = writeln!(buf5, "{h}"); + sink(buf5); // $ MISSING: hasTaintFlow=9 } // The log-injection sinks (`println!`/`eprintln!`/`panic!`) are reconstructed From 0ce4b7bc39df02eea2e9d230f44b842d2a86e0b1 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 19 Aug 2026 17:39:57 +0100 Subject: [PATCH 0392/2098] Rust: Add models. --- .../rust/frameworks/stdlib/core.model.yml | 5 ++ .../inline-taint-flow.expected | 68 +++++++++++++++++-- .../format-macros-legacy/main.rs | 10 +-- 3 files changed, 73 insertions(+), 10 deletions(-) diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml index 895ebe98bd6b..4a0e85764ec7 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml @@ -129,6 +129,11 @@ extensions: - ["::parse", "Argument[self].Reference", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] - ["::trim", "Argument[self].Reference", "ReturnValue.Reference", "taint", "manual"] - ["::to_string", "Argument[self].Reference", "ReturnValue", "taint", "manual"] + # Fmt + - ["<_ as core::fmt::Write>::write_fmt", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["<_ as core::fmt::Write>::write_str", "Argument[0].Reference", "Argument[self].Reference", "taint", "manual"] + - ["<_ as core::fmt::Write>::write_char", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["core::fmt::write", "Argument[1]", "Argument[0].Reference", "taint", "manual"] # Ord - ["<_ as core::cmp::Ord>::min", "Argument[self,0]", "ReturnValue", "value", "manual"] - ["<_ as core::cmp::Ord>::max", "Argument[self,0]", "ReturnValue", "value", "manual"] diff --git a/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected b/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected index b2503dd3a2e5..052888d641f7 100644 --- a/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected +++ b/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected @@ -1,25 +1,51 @@ models -| 1 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 1 | Summary: <_ as core::fmt::Write>::write_fmt; Argument[0]; Argument[self].Reference; taint | +| 2 | Summary: <_ as core::fmt::Write>::write_str; Argument[0].Reference; Argument[self].Reference; taint | +| 3 | Summary: ::as_str; Argument[self].Reference; ReturnValue.Reference; taint | +| 4 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 5 | Summary: core::fmt::write; Argument[1]; Argument[0].Reference; taint | edges | main.rs:12:9:12:9 | a | main.rs:13:10:13:25 | FormatArgsExpr | provenance | | | main.rs:12:13:12:21 | source(...) | main.rs:12:9:12:9 | a | provenance | | | main.rs:13:10:13:25 | ...::format(...) | main.rs:13:10:13:25 | MacroExpr | provenance | | -| main.rs:13:10:13:25 | FormatArgsExpr | main.rs:13:10:13:25 | ...::format(...) | provenance | MaD:1 | +| main.rs:13:10:13:25 | FormatArgsExpr | main.rs:13:10:13:25 | ...::format(...) | provenance | MaD:4 | | main.rs:15:9:15:9 | b | main.rs:16:10:16:23 | FormatArgsExpr | provenance | | | main.rs:15:13:15:21 | source(...) | main.rs:15:9:15:9 | b | provenance | | | main.rs:16:10:16:23 | ...::format(...) | main.rs:16:10:16:23 | MacroExpr | provenance | | -| main.rs:16:10:16:23 | FormatArgsExpr | main.rs:16:10:16:23 | ...::format(...) | provenance | MaD:1 | +| main.rs:16:10:16:23 | FormatArgsExpr | main.rs:16:10:16:23 | ...::format(...) | provenance | MaD:4 | | main.rs:18:9:18:9 | c | main.rs:19:13:19:36 | FormatArgsExpr | provenance | | | main.rs:18:13:18:21 | source(...) | main.rs:18:9:18:9 | c | provenance | | | main.rs:19:9:19:9 | s | main.rs:20:10:20:10 | s | provenance | | | main.rs:19:13:19:36 | ...::format(...) | main.rs:19:9:19:9 | s | provenance | | -| main.rs:19:13:19:36 | FormatArgsExpr | main.rs:19:13:19:36 | ...::format(...) | provenance | MaD:1 | +| main.rs:19:13:19:36 | FormatArgsExpr | main.rs:19:13:19:36 | ...::format(...) | provenance | MaD:4 | | main.rs:32:9:32:9 | a | main.rs:33:9:33:9 | b | provenance | | | main.rs:32:13:32:21 | source(...) | main.rs:32:9:32:9 | a | provenance | | | main.rs:33:9:33:9 | b | main.rs:34:30:34:30 | b | provenance | | | main.rs:34:9:34:9 | c | main.rs:35:10:35:10 | c | provenance | | | main.rs:34:13:34:31 | ...::format(...) | main.rs:34:9:34:9 | c | provenance | | -| main.rs:34:30:34:30 | b | main.rs:34:13:34:31 | ...::format(...) | provenance | MaD:1 | +| main.rs:34:30:34:30 | b | main.rs:34:13:34:31 | ...::format(...) | provenance | MaD:4 | +| main.rs:38:9:38:9 | d | main.rs:39:28:39:28 | d | provenance | | +| main.rs:38:13:38:21 | source(...) | main.rs:38:9:38:9 | d | provenance | | +| main.rs:39:13:39:16 | [post] buf1 | main.rs:40:10:40:13 | buf1 | provenance | | +| main.rs:39:28:39:28 | d | main.rs:39:28:39:37 | d.as_str() [&ref] | provenance | MaD:3 | +| main.rs:39:28:39:37 | d.as_str() [&ref] | main.rs:39:13:39:16 | [post] buf1 | provenance | MaD:2 | +| main.rs:43:9:43:9 | e | main.rs:44:28:44:46 | MacroExpr | provenance | | +| main.rs:43:13:43:21 | source(...) | main.rs:43:9:43:9 | e | provenance | | +| main.rs:44:13:44:16 | [post] buf2 | main.rs:45:10:45:13 | buf2 | provenance | | +| main.rs:44:28:44:46 | MacroExpr | main.rs:44:13:44:16 | [post] buf2 | provenance | MaD:1 | +| main.rs:48:9:48:9 | f | main.rs:49:40:49:58 | MacroExpr | provenance | | +| main.rs:48:13:48:21 | source(...) | main.rs:48:9:48:9 | f | provenance | | +| main.rs:49:29:49:37 | [post] &mut buf3 [&ref] | main.rs:49:34:49:37 | [post] buf3 | provenance | | +| main.rs:49:34:49:37 | [post] buf3 | main.rs:50:10:50:13 | buf3 | provenance | | +| main.rs:49:40:49:58 | MacroExpr | main.rs:49:29:49:37 | [post] &mut buf3 [&ref] | provenance | MaD:5 | +| main.rs:54:9:54:9 | g | main.rs:55:13:55:33 | FormatArgsExpr | provenance | | +| main.rs:54:13:54:21 | source(...) | main.rs:54:9:54:9 | g | provenance | | +| main.rs:55:13:55:33 | FormatArgsExpr | main.rs:55:20:55:23 | [post] buf4 | provenance | MaD:1 | +| main.rs:55:20:55:23 | [post] buf4 | main.rs:56:10:56:13 | buf4 | provenance | | +| main.rs:59:9:59:9 | h | main.rs:60:13:60:33 | FormatArgsExpr | provenance | | +| main.rs:59:13:59:21 | source(...) | main.rs:59:9:59:9 | h | provenance | | +| main.rs:60:13:60:33 | FormatArgsExpr | main.rs:60:22:60:25 | [post] buf5 | provenance | MaD:1 | +| main.rs:60:22:60:25 | [post] buf5 | main.rs:61:10:61:13 | buf5 | provenance | | nodes | main.rs:12:9:12:9 | a | semmle.label | a | | main.rs:12:13:12:21 | source(...) | semmle.label | source(...) | @@ -44,6 +70,33 @@ nodes | main.rs:34:13:34:31 | ...::format(...) | semmle.label | ...::format(...) | | main.rs:34:30:34:30 | b | semmle.label | b | | main.rs:35:10:35:10 | c | semmle.label | c | +| main.rs:38:9:38:9 | d | semmle.label | d | +| main.rs:38:13:38:21 | source(...) | semmle.label | source(...) | +| main.rs:39:13:39:16 | [post] buf1 | semmle.label | [post] buf1 | +| main.rs:39:28:39:28 | d | semmle.label | d | +| main.rs:39:28:39:37 | d.as_str() [&ref] | semmle.label | d.as_str() [&ref] | +| main.rs:40:10:40:13 | buf1 | semmle.label | buf1 | +| main.rs:43:9:43:9 | e | semmle.label | e | +| main.rs:43:13:43:21 | source(...) | semmle.label | source(...) | +| main.rs:44:13:44:16 | [post] buf2 | semmle.label | [post] buf2 | +| main.rs:44:28:44:46 | MacroExpr | semmle.label | MacroExpr | +| main.rs:45:10:45:13 | buf2 | semmle.label | buf2 | +| main.rs:48:9:48:9 | f | semmle.label | f | +| main.rs:48:13:48:21 | source(...) | semmle.label | source(...) | +| main.rs:49:29:49:37 | [post] &mut buf3 [&ref] | semmle.label | [post] &mut buf3 [&ref] | +| main.rs:49:34:49:37 | [post] buf3 | semmle.label | [post] buf3 | +| main.rs:49:40:49:58 | MacroExpr | semmle.label | MacroExpr | +| main.rs:50:10:50:13 | buf3 | semmle.label | buf3 | +| main.rs:54:9:54:9 | g | semmle.label | g | +| main.rs:54:13:54:21 | source(...) | semmle.label | source(...) | +| main.rs:55:13:55:33 | FormatArgsExpr | semmle.label | FormatArgsExpr | +| main.rs:55:20:55:23 | [post] buf4 | semmle.label | [post] buf4 | +| main.rs:56:10:56:13 | buf4 | semmle.label | buf4 | +| main.rs:59:9:59:9 | h | semmle.label | h | +| main.rs:59:13:59:21 | source(...) | semmle.label | source(...) | +| main.rs:60:13:60:33 | FormatArgsExpr | semmle.label | FormatArgsExpr | +| main.rs:60:22:60:25 | [post] buf5 | semmle.label | [post] buf5 | +| main.rs:61:10:61:13 | buf5 | semmle.label | buf5 | subpaths testFailures #select @@ -51,3 +104,8 @@ testFailures | main.rs:16:10:16:23 | MacroExpr | main.rs:15:13:15:21 | source(...) | main.rs:16:10:16:23 | MacroExpr | $@ | main.rs:15:13:15:21 | source(...) | source(...) | | main.rs:20:10:20:10 | s | main.rs:18:13:18:21 | source(...) | main.rs:20:10:20:10 | s | $@ | main.rs:18:13:18:21 | source(...) | source(...) | | main.rs:35:10:35:10 | c | main.rs:32:13:32:21 | source(...) | main.rs:35:10:35:10 | c | $@ | main.rs:32:13:32:21 | source(...) | source(...) | +| main.rs:40:10:40:13 | buf1 | main.rs:38:13:38:21 | source(...) | main.rs:40:10:40:13 | buf1 | $@ | main.rs:38:13:38:21 | source(...) | source(...) | +| main.rs:45:10:45:13 | buf2 | main.rs:43:13:43:21 | source(...) | main.rs:45:10:45:13 | buf2 | $@ | main.rs:43:13:43:21 | source(...) | source(...) | +| main.rs:50:10:50:13 | buf3 | main.rs:48:13:48:21 | source(...) | main.rs:50:10:50:13 | buf3 | $@ | main.rs:48:13:48:21 | source(...) | source(...) | +| main.rs:56:10:56:13 | buf4 | main.rs:54:13:54:21 | source(...) | main.rs:56:10:56:13 | buf4 | $@ | main.rs:54:13:54:21 | source(...) | source(...) | +| main.rs:61:10:61:13 | buf5 | main.rs:59:13:59:21 | source(...) | main.rs:61:10:61:13 | buf5 | $@ | main.rs:59:13:59:21 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/format-macros-legacy/main.rs b/rust/ql/test/library-tests/format-macros-legacy/main.rs index 2fe9acba1213..24b955c65356 100644 --- a/rust/ql/test/library-tests/format-macros-legacy/main.rs +++ b/rust/ql/test/library-tests/format-macros-legacy/main.rs @@ -37,28 +37,28 @@ pub fn exercises_reconstruction() { let mut buf1 = String::new(); let d = source(5); let _ = buf1.write_str(d.as_str()); - sink(buf1); // $ MISSING: hasTaintFlow=5 + sink(buf1); // $ hasTaintFlow=5 let mut buf2 = String::new(); let e = source(6); let _ = buf2.write_fmt(format_args!("{e}")); - sink(buf2); // $ MISSING: hasTaintFlow=6 + sink(buf2); // $ hasTaintFlow=6 let mut buf3 = String::new(); let f = source(7); let _ = std::fmt::write(&mut buf3, format_args!("{f}")); - sink(buf3); // $ MISSING: hasTaintFlow=7 + sink(buf3); // $ hasTaintFlow=7 use std::fmt::Write; let mut buf4 = String::new(); let g = source(8); let _ = write!(buf4, "{}", g); - sink(buf4); // $ MISSING: hasTaintFlow=8 + sink(buf4); // $ hasTaintFlow=8 let mut buf5 = String::new(); let h = source(9); let _ = writeln!(buf5, "{h}"); - sink(buf5); // $ MISSING: hasTaintFlow=9 + sink(buf5); // $ hasTaintFlow=9 } // The log-injection sinks (`println!`/`eprintln!`/`panic!`) are reconstructed From ac0cf1a7832484ee081eebd66ab71c64ba2316a3 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 19 Aug 2026 17:50:48 +0100 Subject: [PATCH 0393/2098] Rust: Change note. --- .../lib/change-notes/2026-08-19-rust-core-fmt-flow-models.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 rust/ql/lib/change-notes/2026-08-19-rust-core-fmt-flow-models.md diff --git a/rust/ql/lib/change-notes/2026-08-19-rust-core-fmt-flow-models.md b/rust/ql/lib/change-notes/2026-08-19-rust-core-fmt-flow-models.md new file mode 100644 index 000000000000..87b8b08ed067 --- /dev/null +++ b/rust/ql/lib/change-notes/2026-08-19-rust-core-fmt-flow-models.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added data-flow models for `core::fmt::Write`. This may improve detection of vulnerabilities where tainted data is written to a formatted output buffer. From 846666e3e067ca2ca01f5039f4f5fe13ab747344 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 19 Aug 2026 18:17:20 +0100 Subject: [PATCH 0394/2098] Rust: Update comment. --- .../format-macros-legacy/FormatArgs.expected | 18 +-- .../LogInjection.expected | 38 ++--- .../inline-taint-flow.expected | 132 +++++++++--------- .../format-macros-legacy/main.rs | 10 +- 4 files changed, 96 insertions(+), 102 deletions(-) diff --git a/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.expected b/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.expected index 0935662bb71c..56bf946de0e7 100644 --- a/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.expected +++ b/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.expected @@ -1,12 +1,12 @@ | main.rs:13:10:13:25 | FormatArgsExpr | 1 | | main.rs:16:10:16:23 | FormatArgsExpr | 0 | | main.rs:19:13:19:36 | FormatArgsExpr | 1 | -| main.rs:33:25:33:33 | FormatArgsExpr | 1 | -| main.rs:44:40:44:46 | FormatArgsExpr | 0 | -| main.rs:49:52:49:58 | FormatArgsExpr | 0 | -| main.rs:55:13:55:33 | FormatArgsExpr | 1 | -| main.rs:60:13:60:33 | FormatArgsExpr | 0 | -| main.rs:70:5:70:27 | FormatArgsExpr | 1 | -| main.rs:71:5:71:26 | FormatArgsExpr | 0 | -| main.rs:72:5:72:25 | FormatArgsExpr | 1 | -| main.rs:73:5:73:24 | FormatArgsExpr | 0 | +| main.rs:27:25:27:33 | FormatArgsExpr | 1 | +| main.rs:38:40:38:46 | FormatArgsExpr | 0 | +| main.rs:43:52:43:58 | FormatArgsExpr | 0 | +| main.rs:49:13:49:33 | FormatArgsExpr | 1 | +| main.rs:54:13:54:33 | FormatArgsExpr | 0 | +| main.rs:64:5:64:27 | FormatArgsExpr | 1 | +| main.rs:65:5:65:26 | FormatArgsExpr | 0 | +| main.rs:66:5:66:25 | FormatArgsExpr | 1 | +| main.rs:67:5:67:24 | FormatArgsExpr | 0 | diff --git a/rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected b/rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected index a08e58f094fc..853f6f401549 100644 --- a/rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected +++ b/rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected @@ -1,28 +1,28 @@ #select -| main.rs:70:5:70:27 | FormatArgsExpr | main.rs:68:19:68:45 | ...::var(...) | main.rs:70:5:70:27 | FormatArgsExpr | Log entry depends on a $@. | main.rs:68:19:68:45 | ...::var(...) | user-provided value | -| main.rs:71:5:71:26 | FormatArgsExpr | main.rs:68:19:68:45 | ...::var(...) | main.rs:71:5:71:26 | FormatArgsExpr | Log entry depends on a $@. | main.rs:68:19:68:45 | ...::var(...) | user-provided value | -| main.rs:72:5:72:25 | FormatArgsExpr | main.rs:68:19:68:45 | ...::var(...) | main.rs:72:5:72:25 | FormatArgsExpr | Log entry depends on a $@. | main.rs:68:19:68:45 | ...::var(...) | user-provided value | -| main.rs:73:5:73:24 | FormatArgsExpr | main.rs:68:19:68:45 | ...::var(...) | main.rs:73:5:73:24 | FormatArgsExpr | Log entry depends on a $@. | main.rs:68:19:68:45 | ...::var(...) | user-provided value | +| main.rs:64:5:64:27 | FormatArgsExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:64:5:64:27 | FormatArgsExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | +| main.rs:65:5:65:26 | FormatArgsExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:65:5:65:26 | FormatArgsExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | +| main.rs:66:5:66:25 | FormatArgsExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:66:5:66:25 | FormatArgsExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | +| main.rs:67:5:67:24 | FormatArgsExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:67:5:67:24 | FormatArgsExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | edges -| main.rs:68:9:68:15 | tainted | main.rs:70:5:70:27 | FormatArgsExpr | provenance | Sink:MaD:2 | -| main.rs:68:9:68:15 | tainted | main.rs:71:5:71:26 | FormatArgsExpr | provenance | Sink:MaD:1 | -| main.rs:68:9:68:15 | tainted | main.rs:72:5:72:25 | FormatArgsExpr | provenance | Sink:MaD:2 | -| main.rs:68:9:68:15 | tainted | main.rs:73:5:73:24 | FormatArgsExpr | provenance | Sink:MaD:1 | -| main.rs:68:19:68:45 | ...::var(...) | main.rs:68:19:68:45 | ...::var(...) [Ok] | provenance | Src:MaD:3 | -| main.rs:68:19:68:45 | ...::var(...) [Ok] | main.rs:68:19:68:65 | ... .unwrap_or_default() | provenance | MaD:4 | -| main.rs:68:19:68:65 | ... .unwrap_or_default() | main.rs:68:9:68:15 | tainted | provenance | | +| main.rs:62:9:62:15 | tainted | main.rs:64:5:64:27 | FormatArgsExpr | provenance | Sink:MaD:2 | +| main.rs:62:9:62:15 | tainted | main.rs:65:5:65:26 | FormatArgsExpr | provenance | Sink:MaD:1 | +| main.rs:62:9:62:15 | tainted | main.rs:66:5:66:25 | FormatArgsExpr | provenance | Sink:MaD:2 | +| main.rs:62:9:62:15 | tainted | main.rs:67:5:67:24 | FormatArgsExpr | provenance | Sink:MaD:1 | +| main.rs:62:19:62:45 | ...::var(...) | main.rs:62:19:62:45 | ...::var(...) [Ok] | provenance | Src:MaD:3 | +| main.rs:62:19:62:45 | ...::var(...) [Ok] | main.rs:62:19:62:65 | ... .unwrap_or_default() | provenance | MaD:4 | +| main.rs:62:19:62:65 | ... .unwrap_or_default() | main.rs:62:9:62:15 | tainted | provenance | | models | 1 | Sink: std::io::stdio::_eprint; Argument[0]; log-injection | | 2 | Sink: std::io::stdio::_print; Argument[0]; log-injection | | 3 | Source: std::env::var; ReturnValue.Field[core::result::Result::Ok(0)]; environment | | 4 | Summary: ::unwrap_or_default; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | nodes -| main.rs:68:9:68:15 | tainted | semmle.label | tainted | -| main.rs:68:19:68:45 | ...::var(...) | semmle.label | ...::var(...) | -| main.rs:68:19:68:45 | ...::var(...) [Ok] | semmle.label | ...::var(...) [Ok] | -| main.rs:68:19:68:65 | ... .unwrap_or_default() | semmle.label | ... .unwrap_or_default() | -| main.rs:70:5:70:27 | FormatArgsExpr | semmle.label | FormatArgsExpr | -| main.rs:71:5:71:26 | FormatArgsExpr | semmle.label | FormatArgsExpr | -| main.rs:72:5:72:25 | FormatArgsExpr | semmle.label | FormatArgsExpr | -| main.rs:73:5:73:24 | FormatArgsExpr | semmle.label | FormatArgsExpr | +| main.rs:62:9:62:15 | tainted | semmle.label | tainted | +| main.rs:62:19:62:45 | ...::var(...) | semmle.label | ...::var(...) | +| main.rs:62:19:62:45 | ...::var(...) [Ok] | semmle.label | ...::var(...) [Ok] | +| main.rs:62:19:62:65 | ... .unwrap_or_default() | semmle.label | ... .unwrap_or_default() | +| main.rs:64:5:64:27 | FormatArgsExpr | semmle.label | FormatArgsExpr | +| main.rs:65:5:65:26 | FormatArgsExpr | semmle.label | FormatArgsExpr | +| main.rs:66:5:66:25 | FormatArgsExpr | semmle.label | FormatArgsExpr | +| main.rs:67:5:67:24 | FormatArgsExpr | semmle.label | FormatArgsExpr | subpaths diff --git a/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected b/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected index 052888d641f7..7123164d2bfb 100644 --- a/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected +++ b/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected @@ -18,34 +18,34 @@ edges | main.rs:19:9:19:9 | s | main.rs:20:10:20:10 | s | provenance | | | main.rs:19:13:19:36 | ...::format(...) | main.rs:19:9:19:9 | s | provenance | | | main.rs:19:13:19:36 | FormatArgsExpr | main.rs:19:13:19:36 | ...::format(...) | provenance | MaD:4 | -| main.rs:32:9:32:9 | a | main.rs:33:9:33:9 | b | provenance | | -| main.rs:32:13:32:21 | source(...) | main.rs:32:9:32:9 | a | provenance | | -| main.rs:33:9:33:9 | b | main.rs:34:30:34:30 | b | provenance | | -| main.rs:34:9:34:9 | c | main.rs:35:10:35:10 | c | provenance | | -| main.rs:34:13:34:31 | ...::format(...) | main.rs:34:9:34:9 | c | provenance | | -| main.rs:34:30:34:30 | b | main.rs:34:13:34:31 | ...::format(...) | provenance | MaD:4 | -| main.rs:38:9:38:9 | d | main.rs:39:28:39:28 | d | provenance | | -| main.rs:38:13:38:21 | source(...) | main.rs:38:9:38:9 | d | provenance | | -| main.rs:39:13:39:16 | [post] buf1 | main.rs:40:10:40:13 | buf1 | provenance | | -| main.rs:39:28:39:28 | d | main.rs:39:28:39:37 | d.as_str() [&ref] | provenance | MaD:3 | -| main.rs:39:28:39:37 | d.as_str() [&ref] | main.rs:39:13:39:16 | [post] buf1 | provenance | MaD:2 | -| main.rs:43:9:43:9 | e | main.rs:44:28:44:46 | MacroExpr | provenance | | -| main.rs:43:13:43:21 | source(...) | main.rs:43:9:43:9 | e | provenance | | -| main.rs:44:13:44:16 | [post] buf2 | main.rs:45:10:45:13 | buf2 | provenance | | -| main.rs:44:28:44:46 | MacroExpr | main.rs:44:13:44:16 | [post] buf2 | provenance | MaD:1 | -| main.rs:48:9:48:9 | f | main.rs:49:40:49:58 | MacroExpr | provenance | | -| main.rs:48:13:48:21 | source(...) | main.rs:48:9:48:9 | f | provenance | | -| main.rs:49:29:49:37 | [post] &mut buf3 [&ref] | main.rs:49:34:49:37 | [post] buf3 | provenance | | -| main.rs:49:34:49:37 | [post] buf3 | main.rs:50:10:50:13 | buf3 | provenance | | -| main.rs:49:40:49:58 | MacroExpr | main.rs:49:29:49:37 | [post] &mut buf3 [&ref] | provenance | MaD:5 | -| main.rs:54:9:54:9 | g | main.rs:55:13:55:33 | FormatArgsExpr | provenance | | -| main.rs:54:13:54:21 | source(...) | main.rs:54:9:54:9 | g | provenance | | -| main.rs:55:13:55:33 | FormatArgsExpr | main.rs:55:20:55:23 | [post] buf4 | provenance | MaD:1 | -| main.rs:55:20:55:23 | [post] buf4 | main.rs:56:10:56:13 | buf4 | provenance | | -| main.rs:59:9:59:9 | h | main.rs:60:13:60:33 | FormatArgsExpr | provenance | | -| main.rs:59:13:59:21 | source(...) | main.rs:59:9:59:9 | h | provenance | | -| main.rs:60:13:60:33 | FormatArgsExpr | main.rs:60:22:60:25 | [post] buf5 | provenance | MaD:1 | -| main.rs:60:22:60:25 | [post] buf5 | main.rs:61:10:61:13 | buf5 | provenance | | +| main.rs:26:9:26:9 | a | main.rs:27:9:27:9 | b | provenance | | +| main.rs:26:13:26:21 | source(...) | main.rs:26:9:26:9 | a | provenance | | +| main.rs:27:9:27:9 | b | main.rs:28:30:28:30 | b | provenance | | +| main.rs:28:9:28:9 | c | main.rs:29:10:29:10 | c | provenance | | +| main.rs:28:13:28:31 | ...::format(...) | main.rs:28:9:28:9 | c | provenance | | +| main.rs:28:30:28:30 | b | main.rs:28:13:28:31 | ...::format(...) | provenance | MaD:4 | +| main.rs:32:9:32:9 | d | main.rs:33:28:33:28 | d | provenance | | +| main.rs:32:13:32:21 | source(...) | main.rs:32:9:32:9 | d | provenance | | +| main.rs:33:13:33:16 | [post] buf1 | main.rs:34:10:34:13 | buf1 | provenance | | +| main.rs:33:28:33:28 | d | main.rs:33:28:33:37 | d.as_str() [&ref] | provenance | MaD:3 | +| main.rs:33:28:33:37 | d.as_str() [&ref] | main.rs:33:13:33:16 | [post] buf1 | provenance | MaD:2 | +| main.rs:37:9:37:9 | e | main.rs:38:28:38:46 | MacroExpr | provenance | | +| main.rs:37:13:37:21 | source(...) | main.rs:37:9:37:9 | e | provenance | | +| main.rs:38:13:38:16 | [post] buf2 | main.rs:39:10:39:13 | buf2 | provenance | | +| main.rs:38:28:38:46 | MacroExpr | main.rs:38:13:38:16 | [post] buf2 | provenance | MaD:1 | +| main.rs:42:9:42:9 | f | main.rs:43:40:43:58 | MacroExpr | provenance | | +| main.rs:42:13:42:21 | source(...) | main.rs:42:9:42:9 | f | provenance | | +| main.rs:43:29:43:37 | [post] &mut buf3 [&ref] | main.rs:43:34:43:37 | [post] buf3 | provenance | | +| main.rs:43:34:43:37 | [post] buf3 | main.rs:44:10:44:13 | buf3 | provenance | | +| main.rs:43:40:43:58 | MacroExpr | main.rs:43:29:43:37 | [post] &mut buf3 [&ref] | provenance | MaD:5 | +| main.rs:48:9:48:9 | g | main.rs:49:13:49:33 | FormatArgsExpr | provenance | | +| main.rs:48:13:48:21 | source(...) | main.rs:48:9:48:9 | g | provenance | | +| main.rs:49:13:49:33 | FormatArgsExpr | main.rs:49:20:49:23 | [post] buf4 | provenance | MaD:1 | +| main.rs:49:20:49:23 | [post] buf4 | main.rs:50:10:50:13 | buf4 | provenance | | +| main.rs:53:9:53:9 | h | main.rs:54:13:54:33 | FormatArgsExpr | provenance | | +| main.rs:53:13:53:21 | source(...) | main.rs:53:9:53:9 | h | provenance | | +| main.rs:54:13:54:33 | FormatArgsExpr | main.rs:54:22:54:25 | [post] buf5 | provenance | MaD:1 | +| main.rs:54:22:54:25 | [post] buf5 | main.rs:55:10:55:13 | buf5 | provenance | | nodes | main.rs:12:9:12:9 | a | semmle.label | a | | main.rs:12:13:12:21 | source(...) | semmle.label | source(...) | @@ -63,49 +63,49 @@ nodes | main.rs:19:13:19:36 | ...::format(...) | semmle.label | ...::format(...) | | main.rs:19:13:19:36 | FormatArgsExpr | semmle.label | FormatArgsExpr | | main.rs:20:10:20:10 | s | semmle.label | s | -| main.rs:32:9:32:9 | a | semmle.label | a | +| main.rs:26:9:26:9 | a | semmle.label | a | +| main.rs:26:13:26:21 | source(...) | semmle.label | source(...) | +| main.rs:27:9:27:9 | b | semmle.label | b | +| main.rs:28:9:28:9 | c | semmle.label | c | +| main.rs:28:13:28:31 | ...::format(...) | semmle.label | ...::format(...) | +| main.rs:28:30:28:30 | b | semmle.label | b | +| main.rs:29:10:29:10 | c | semmle.label | c | +| main.rs:32:9:32:9 | d | semmle.label | d | | main.rs:32:13:32:21 | source(...) | semmle.label | source(...) | -| main.rs:33:9:33:9 | b | semmle.label | b | -| main.rs:34:9:34:9 | c | semmle.label | c | -| main.rs:34:13:34:31 | ...::format(...) | semmle.label | ...::format(...) | -| main.rs:34:30:34:30 | b | semmle.label | b | -| main.rs:35:10:35:10 | c | semmle.label | c | -| main.rs:38:9:38:9 | d | semmle.label | d | -| main.rs:38:13:38:21 | source(...) | semmle.label | source(...) | -| main.rs:39:13:39:16 | [post] buf1 | semmle.label | [post] buf1 | -| main.rs:39:28:39:28 | d | semmle.label | d | -| main.rs:39:28:39:37 | d.as_str() [&ref] | semmle.label | d.as_str() [&ref] | -| main.rs:40:10:40:13 | buf1 | semmle.label | buf1 | -| main.rs:43:9:43:9 | e | semmle.label | e | -| main.rs:43:13:43:21 | source(...) | semmle.label | source(...) | -| main.rs:44:13:44:16 | [post] buf2 | semmle.label | [post] buf2 | -| main.rs:44:28:44:46 | MacroExpr | semmle.label | MacroExpr | -| main.rs:45:10:45:13 | buf2 | semmle.label | buf2 | -| main.rs:48:9:48:9 | f | semmle.label | f | +| main.rs:33:13:33:16 | [post] buf1 | semmle.label | [post] buf1 | +| main.rs:33:28:33:28 | d | semmle.label | d | +| main.rs:33:28:33:37 | d.as_str() [&ref] | semmle.label | d.as_str() [&ref] | +| main.rs:34:10:34:13 | buf1 | semmle.label | buf1 | +| main.rs:37:9:37:9 | e | semmle.label | e | +| main.rs:37:13:37:21 | source(...) | semmle.label | source(...) | +| main.rs:38:13:38:16 | [post] buf2 | semmle.label | [post] buf2 | +| main.rs:38:28:38:46 | MacroExpr | semmle.label | MacroExpr | +| main.rs:39:10:39:13 | buf2 | semmle.label | buf2 | +| main.rs:42:9:42:9 | f | semmle.label | f | +| main.rs:42:13:42:21 | source(...) | semmle.label | source(...) | +| main.rs:43:29:43:37 | [post] &mut buf3 [&ref] | semmle.label | [post] &mut buf3 [&ref] | +| main.rs:43:34:43:37 | [post] buf3 | semmle.label | [post] buf3 | +| main.rs:43:40:43:58 | MacroExpr | semmle.label | MacroExpr | +| main.rs:44:10:44:13 | buf3 | semmle.label | buf3 | +| main.rs:48:9:48:9 | g | semmle.label | g | | main.rs:48:13:48:21 | source(...) | semmle.label | source(...) | -| main.rs:49:29:49:37 | [post] &mut buf3 [&ref] | semmle.label | [post] &mut buf3 [&ref] | -| main.rs:49:34:49:37 | [post] buf3 | semmle.label | [post] buf3 | -| main.rs:49:40:49:58 | MacroExpr | semmle.label | MacroExpr | -| main.rs:50:10:50:13 | buf3 | semmle.label | buf3 | -| main.rs:54:9:54:9 | g | semmle.label | g | -| main.rs:54:13:54:21 | source(...) | semmle.label | source(...) | -| main.rs:55:13:55:33 | FormatArgsExpr | semmle.label | FormatArgsExpr | -| main.rs:55:20:55:23 | [post] buf4 | semmle.label | [post] buf4 | -| main.rs:56:10:56:13 | buf4 | semmle.label | buf4 | -| main.rs:59:9:59:9 | h | semmle.label | h | -| main.rs:59:13:59:21 | source(...) | semmle.label | source(...) | -| main.rs:60:13:60:33 | FormatArgsExpr | semmle.label | FormatArgsExpr | -| main.rs:60:22:60:25 | [post] buf5 | semmle.label | [post] buf5 | -| main.rs:61:10:61:13 | buf5 | semmle.label | buf5 | +| main.rs:49:13:49:33 | FormatArgsExpr | semmle.label | FormatArgsExpr | +| main.rs:49:20:49:23 | [post] buf4 | semmle.label | [post] buf4 | +| main.rs:50:10:50:13 | buf4 | semmle.label | buf4 | +| main.rs:53:9:53:9 | h | semmle.label | h | +| main.rs:53:13:53:21 | source(...) | semmle.label | source(...) | +| main.rs:54:13:54:33 | FormatArgsExpr | semmle.label | FormatArgsExpr | +| main.rs:54:22:54:25 | [post] buf5 | semmle.label | [post] buf5 | +| main.rs:55:10:55:13 | buf5 | semmle.label | buf5 | subpaths testFailures #select | main.rs:13:10:13:25 | MacroExpr | main.rs:12:13:12:21 | source(...) | main.rs:13:10:13:25 | MacroExpr | $@ | main.rs:12:13:12:21 | source(...) | source(...) | | main.rs:16:10:16:23 | MacroExpr | main.rs:15:13:15:21 | source(...) | main.rs:16:10:16:23 | MacroExpr | $@ | main.rs:15:13:15:21 | source(...) | source(...) | | main.rs:20:10:20:10 | s | main.rs:18:13:18:21 | source(...) | main.rs:20:10:20:10 | s | $@ | main.rs:18:13:18:21 | source(...) | source(...) | -| main.rs:35:10:35:10 | c | main.rs:32:13:32:21 | source(...) | main.rs:35:10:35:10 | c | $@ | main.rs:32:13:32:21 | source(...) | source(...) | -| main.rs:40:10:40:13 | buf1 | main.rs:38:13:38:21 | source(...) | main.rs:40:10:40:13 | buf1 | $@ | main.rs:38:13:38:21 | source(...) | source(...) | -| main.rs:45:10:45:13 | buf2 | main.rs:43:13:43:21 | source(...) | main.rs:45:10:45:13 | buf2 | $@ | main.rs:43:13:43:21 | source(...) | source(...) | -| main.rs:50:10:50:13 | buf3 | main.rs:48:13:48:21 | source(...) | main.rs:50:10:50:13 | buf3 | $@ | main.rs:48:13:48:21 | source(...) | source(...) | -| main.rs:56:10:56:13 | buf4 | main.rs:54:13:54:21 | source(...) | main.rs:56:10:56:13 | buf4 | $@ | main.rs:54:13:54:21 | source(...) | source(...) | -| main.rs:61:10:61:13 | buf5 | main.rs:59:13:59:21 | source(...) | main.rs:61:10:61:13 | buf5 | $@ | main.rs:59:13:59:21 | source(...) | source(...) | +| main.rs:29:10:29:10 | c | main.rs:26:13:26:21 | source(...) | main.rs:29:10:29:10 | c | $@ | main.rs:26:13:26:21 | source(...) | source(...) | +| main.rs:34:10:34:13 | buf1 | main.rs:32:13:32:21 | source(...) | main.rs:34:10:34:13 | buf1 | $@ | main.rs:32:13:32:21 | source(...) | source(...) | +| main.rs:39:10:39:13 | buf2 | main.rs:37:13:37:21 | source(...) | main.rs:39:10:39:13 | buf2 | $@ | main.rs:37:13:37:21 | source(...) | source(...) | +| main.rs:44:10:44:13 | buf3 | main.rs:42:13:42:21 | source(...) | main.rs:44:10:44:13 | buf3 | $@ | main.rs:42:13:42:21 | source(...) | source(...) | +| main.rs:50:10:50:13 | buf4 | main.rs:48:13:48:21 | source(...) | main.rs:50:10:50:13 | buf4 | $@ | main.rs:48:13:48:21 | source(...) | source(...) | +| main.rs:55:10:55:13 | buf5 | main.rs:53:13:53:21 | source(...) | main.rs:55:10:55:13 | buf5 | $@ | main.rs:53:13:53:21 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/format-macros-legacy/main.rs b/rust/ql/test/library-tests/format-macros-legacy/main.rs index 24b955c65356..641391211618 100644 --- a/rust/ql/test/library-tests/format-macros-legacy/main.rs +++ b/rust/ql/test/library-tests/format-macros-legacy/main.rs @@ -21,14 +21,8 @@ pub fn format_flow() { } pub fn exercises_reconstruction() { - // No flow assertions here: these exercise reconstruction of the rest of the - // family, including the writer-argument handling of `write!`/`writeln!`. - // - // Flow into a writer buffer is not recovered on <1.94 (the - // `buf.write_fmt(..)` desugaring is absent), but this matches native - // behavior on >=1.94, where the `Write::write_fmt` content-to-self taint - // model is also missing. So it is a pre-existing model gap, not a - // regression from the reconstruction. + // these exercise reconstruction of the rest of the family, including the + // writer-argument handling of `write!`/`writeln!`. let a = source(4); let b = format_args!("{}", a); let c = std::fmt::format(b); From 35423c22fde84fffffb26c84b67ff892c0e2f946 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 19 Aug 2026 18:57:42 +0100 Subject: [PATCH 0395/2098] Rust: Accept fixes for rust/cleartext-logging. --- .../CWE-312/CleartextLogging.expected | 77 ++++++++++++------- .../security/CWE-312/test_logging.rs | 14 ++-- 2 files changed, 56 insertions(+), 35 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected index 3a96605753f6..d719721c3ba4 100644 --- a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected +++ b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected @@ -26,6 +26,8 @@ | test_logging.rs:94:11:94:28 | MacroExpr | test_logging.rs:93:15:93:22 | password | test_logging.rs:94:11:94:28 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:93:15:93:22 | password | password | | test_logging.rs:97:11:97:18 | MacroExpr | test_logging.rs:96:42:96:49 | password | test_logging.rs:97:11:97:18 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:96:42:96:49 | password | password | | test_logging.rs:100:11:100:18 | MacroExpr | test_logging.rs:99:38:99:45 | password | test_logging.rs:100:11:100:18 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:99:38:99:45 | password | password | +| test_logging.rs:104:11:104:18 | MacroExpr | test_logging.rs:103:37:103:44 | password | test_logging.rs:104:11:104:18 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:103:37:103:44 | password | password | +| test_logging.rs:108:11:108:18 | MacroExpr | test_logging.rs:107:39:107:46 | password | test_logging.rs:108:11:108:18 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:107:39:107:46 | password | password | | test_logging.rs:118:12:118:41 | MacroExpr | test_logging.rs:118:28:118:41 | get_password(...) | test_logging.rs:118:12:118:41 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:118:28:118:41 | get_password(...) | get_password(...) | | test_logging.rs:131:12:131:31 | MacroExpr | test_logging.rs:129:25:129:32 | password | test_logging.rs:131:12:131:31 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:129:25:129:32 | password | password | | test_logging.rs:141:11:141:37 | MacroExpr | test_logging.rs:141:27:141:37 | s1.password | test_logging.rs:141:11:141:37 | MacroExpr | This operation writes $@ to a log file. | test_logging.rs:141:27:141:37 | s1.password | s1.password | @@ -115,16 +117,24 @@ edges | test_logging.rs:93:15:93:22 | password | test_logging.rs:93:14:93:22 | &password | provenance | Config | | test_logging.rs:96:9:96:10 | m2 | test_logging.rs:97:11:97:18 | MacroExpr | provenance | Sink:MaD:11 | | test_logging.rs:96:14:96:49 | ... + ... | test_logging.rs:96:9:96:10 | m2 | provenance | | -| test_logging.rs:96:41:96:49 | &password | test_logging.rs:96:14:96:49 | ... + ... | provenance | MaD:16 | -| test_logging.rs:96:41:96:49 | &password [&ref] | test_logging.rs:96:14:96:49 | ... + ... | provenance | MaD:16 | +| test_logging.rs:96:41:96:49 | &password | test_logging.rs:96:14:96:49 | ... + ... | provenance | MaD:17 | +| test_logging.rs:96:41:96:49 | &password [&ref] | test_logging.rs:96:14:96:49 | ... + ... | provenance | MaD:17 | | test_logging.rs:96:42:96:49 | password | test_logging.rs:96:41:96:49 | &password | provenance | Config | | test_logging.rs:96:42:96:49 | password | test_logging.rs:96:41:96:49 | &password [&ref] | provenance | | | test_logging.rs:99:9:99:10 | m3 | test_logging.rs:100:11:100:18 | MacroExpr | provenance | Sink:MaD:11 | | test_logging.rs:99:22:99:45 | ...::format(...) | test_logging.rs:99:22:99:45 | { ... } | provenance | | | test_logging.rs:99:22:99:45 | ...::must_use(...) | test_logging.rs:99:9:99:10 | m3 | provenance | | -| test_logging.rs:99:22:99:45 | MacroExpr | test_logging.rs:99:22:99:45 | ...::format(...) | provenance | MaD:19 | -| test_logging.rs:99:22:99:45 | { ... } | test_logging.rs:99:22:99:45 | ...::must_use(...) | provenance | MaD:20 | +| test_logging.rs:99:22:99:45 | MacroExpr | test_logging.rs:99:22:99:45 | ...::format(...) | provenance | MaD:20 | +| test_logging.rs:99:22:99:45 | { ... } | test_logging.rs:99:22:99:45 | ...::must_use(...) | provenance | MaD:21 | | test_logging.rs:99:38:99:45 | password | test_logging.rs:99:22:99:45 | MacroExpr | provenance | | +| test_logging.rs:103:12:103:18 | [post] &mut m4 [&ref] | test_logging.rs:103:17:103:18 | [post] m4 | provenance | | +| test_logging.rs:103:17:103:18 | [post] m4 | test_logging.rs:104:11:104:18 | MacroExpr | provenance | Sink:MaD:11 | +| test_logging.rs:103:21:103:44 | MacroExpr | test_logging.rs:103:12:103:18 | [post] &mut m4 [&ref] | provenance | MaD:16 | +| test_logging.rs:103:37:103:44 | password | test_logging.rs:103:21:103:44 | MacroExpr | provenance | | +| test_logging.rs:107:14:107:20 | [post] &mut m5 [&ref] | test_logging.rs:107:19:107:20 | [post] m5 | provenance | | +| test_logging.rs:107:19:107:20 | [post] m5 | test_logging.rs:108:11:108:18 | MacroExpr | provenance | Sink:MaD:11 | +| test_logging.rs:107:23:107:46 | MacroExpr | test_logging.rs:107:14:107:20 | [post] &mut m5 [&ref] | provenance | MaD:16 | +| test_logging.rs:107:39:107:46 | password | test_logging.rs:107:23:107:46 | MacroExpr | provenance | | | test_logging.rs:118:28:118:41 | get_password(...) | test_logging.rs:118:12:118:41 | MacroExpr | provenance | Sink:MaD:11 | | test_logging.rs:129:9:129:10 | t1 [tuple.1] | test_logging.rs:131:28:131:29 | t1 [tuple.1] | provenance | | | test_logging.rs:129:14:129:33 | TupleExpr [tuple.1] | test_logging.rs:129:9:129:10 | t1 [tuple.1] | provenance | | @@ -139,8 +149,8 @@ edges | test_logging.rs:176:34:176:79 | MacroExpr | test_logging.rs:176:33:176:79 | &... [&ref] | provenance | | | test_logging.rs:176:42:176:78 | ...::format(...) | test_logging.rs:176:42:176:78 | { ... } | provenance | | | test_logging.rs:176:42:176:78 | ...::must_use(...) | test_logging.rs:176:34:176:79 | MacroExpr | provenance | | -| test_logging.rs:176:42:176:78 | MacroExpr | test_logging.rs:176:42:176:78 | ...::format(...) | provenance | MaD:19 | -| test_logging.rs:176:42:176:78 | { ... } | test_logging.rs:176:42:176:78 | ...::must_use(...) | provenance | MaD:20 | +| test_logging.rs:176:42:176:78 | MacroExpr | test_logging.rs:176:42:176:78 | ...::format(...) | provenance | MaD:20 | +| test_logging.rs:176:42:176:78 | { ... } | test_logging.rs:176:42:176:78 | ...::must_use(...) | provenance | MaD:21 | | test_logging.rs:176:70:176:78 | password2 | test_logging.rs:176:42:176:78 | MacroExpr | provenance | | | test_logging.rs:180:35:180:81 | &... | test_logging.rs:180:35:180:81 | &... | provenance | Sink:MaD:3 | | test_logging.rs:180:35:180:81 | &... [&ref] | test_logging.rs:180:35:180:81 | &... | provenance | Sink:MaD:3 | @@ -148,8 +158,8 @@ edges | test_logging.rs:180:36:180:81 | MacroExpr | test_logging.rs:180:35:180:81 | &... [&ref] | provenance | | | test_logging.rs:180:44:180:80 | ...::format(...) | test_logging.rs:180:44:180:80 | { ... } | provenance | | | test_logging.rs:180:44:180:80 | ...::must_use(...) | test_logging.rs:180:36:180:81 | MacroExpr | provenance | | -| test_logging.rs:180:44:180:80 | MacroExpr | test_logging.rs:180:44:180:80 | ...::format(...) | provenance | MaD:19 | -| test_logging.rs:180:44:180:80 | { ... } | test_logging.rs:180:44:180:80 | ...::must_use(...) | provenance | MaD:20 | +| test_logging.rs:180:44:180:80 | MacroExpr | test_logging.rs:180:44:180:80 | ...::format(...) | provenance | MaD:20 | +| test_logging.rs:180:44:180:80 | { ... } | test_logging.rs:180:44:180:80 | ...::must_use(...) | provenance | MaD:21 | | test_logging.rs:180:72:180:80 | password2 | test_logging.rs:180:44:180:80 | MacroExpr | provenance | | | test_logging.rs:183:9:183:19 | err_result2 [Err] | test_logging.rs:184:13:184:23 | err_result2 | provenance | Sink:MaD:4 | | test_logging.rs:183:47:183:68 | Err(...) [Err] | test_logging.rs:183:9:183:19 | err_result2 [Err] | provenance | | @@ -180,40 +190,40 @@ edges | test_logging.rs:226:36:226:59 | ...::Some(...) [Some] | test_logging.rs:226:36:226:59 | ...::Some(...) | provenance | Sink:MaD:9 | | test_logging.rs:226:36:226:59 | MacroExpr | test_logging.rs:226:36:226:59 | ...::Some(...) [Some] | provenance | | | test_logging.rs:226:52:226:59 | password | test_logging.rs:226:36:226:59 | MacroExpr | provenance | | -| test_logging.rs:229:30:229:62 | MacroExpr | test_logging.rs:229:30:229:71 | ... .as_str() [&ref] | provenance | MaD:18 | +| test_logging.rs:229:30:229:62 | MacroExpr | test_logging.rs:229:30:229:71 | ... .as_str() [&ref] | provenance | MaD:19 | | test_logging.rs:229:30:229:71 | ... .as_str() [&ref] | test_logging.rs:229:30:229:71 | ... .as_str() | provenance | Sink:MaD:2 | | test_logging.rs:229:38:229:61 | ...::format(...) | test_logging.rs:229:38:229:61 | { ... } | provenance | | | test_logging.rs:229:38:229:61 | ...::must_use(...) | test_logging.rs:229:30:229:62 | MacroExpr | provenance | | -| test_logging.rs:229:38:229:61 | MacroExpr | test_logging.rs:229:38:229:61 | ...::format(...) | provenance | MaD:19 | -| test_logging.rs:229:38:229:61 | { ... } | test_logging.rs:229:38:229:61 | ...::must_use(...) | provenance | MaD:20 | +| test_logging.rs:229:38:229:61 | MacroExpr | test_logging.rs:229:38:229:61 | ...::format(...) | provenance | MaD:20 | +| test_logging.rs:229:38:229:61 | { ... } | test_logging.rs:229:38:229:61 | ...::must_use(...) | provenance | MaD:21 | | test_logging.rs:229:54:229:61 | password | test_logging.rs:229:38:229:61 | MacroExpr | provenance | | -| test_logging.rs:242:16:242:50 | MacroExpr | test_logging.rs:242:16:242:61 | ... .as_bytes() [&ref, element] | provenance | MaD:17 | +| test_logging.rs:242:16:242:50 | MacroExpr | test_logging.rs:242:16:242:61 | ... .as_bytes() [&ref, element] | provenance | MaD:18 | | test_logging.rs:242:16:242:61 | ... .as_bytes() [&ref, element] | test_logging.rs:242:16:242:61 | ... .as_bytes() | provenance | Sink:MaD:7 Sink:MaD:7 | | test_logging.rs:242:24:242:49 | ...::format(...) | test_logging.rs:242:24:242:49 | { ... } | provenance | | | test_logging.rs:242:24:242:49 | ...::must_use(...) | test_logging.rs:242:16:242:50 | MacroExpr | provenance | | -| test_logging.rs:242:24:242:49 | MacroExpr | test_logging.rs:242:24:242:49 | ...::format(...) | provenance | MaD:19 | -| test_logging.rs:242:24:242:49 | { ... } | test_logging.rs:242:24:242:49 | ...::must_use(...) | provenance | MaD:20 | +| test_logging.rs:242:24:242:49 | MacroExpr | test_logging.rs:242:24:242:49 | ...::format(...) | provenance | MaD:20 | +| test_logging.rs:242:24:242:49 | { ... } | test_logging.rs:242:24:242:49 | ...::must_use(...) | provenance | MaD:21 | | test_logging.rs:242:42:242:49 | password | test_logging.rs:242:24:242:49 | MacroExpr | provenance | | -| test_logging.rs:245:20:245:54 | MacroExpr | test_logging.rs:245:20:245:65 | ... .as_bytes() [&ref, element] | provenance | MaD:17 | +| test_logging.rs:245:20:245:54 | MacroExpr | test_logging.rs:245:20:245:65 | ... .as_bytes() [&ref, element] | provenance | MaD:18 | | test_logging.rs:245:20:245:65 | ... .as_bytes() [&ref, element] | test_logging.rs:245:20:245:65 | ... .as_bytes() | provenance | Sink:MaD:8 Sink:MaD:8 | | test_logging.rs:245:28:245:53 | ...::format(...) | test_logging.rs:245:28:245:53 | { ... } | provenance | | | test_logging.rs:245:28:245:53 | ...::must_use(...) | test_logging.rs:245:20:245:54 | MacroExpr | provenance | | -| test_logging.rs:245:28:245:53 | MacroExpr | test_logging.rs:245:28:245:53 | ...::format(...) | provenance | MaD:19 | -| test_logging.rs:245:28:245:53 | { ... } | test_logging.rs:245:28:245:53 | ...::must_use(...) | provenance | MaD:20 | +| test_logging.rs:245:28:245:53 | MacroExpr | test_logging.rs:245:28:245:53 | ...::format(...) | provenance | MaD:20 | +| test_logging.rs:245:28:245:53 | { ... } | test_logging.rs:245:28:245:53 | ...::must_use(...) | provenance | MaD:21 | | test_logging.rs:245:46:245:53 | password | test_logging.rs:245:28:245:53 | MacroExpr | provenance | | -| test_logging.rs:248:15:248:49 | MacroExpr | test_logging.rs:248:15:248:60 | ... .as_bytes() [&ref, element] | provenance | MaD:17 | +| test_logging.rs:248:15:248:49 | MacroExpr | test_logging.rs:248:15:248:60 | ... .as_bytes() [&ref, element] | provenance | MaD:18 | | test_logging.rs:248:15:248:60 | ... .as_bytes() [&ref, element] | test_logging.rs:248:15:248:60 | ... .as_bytes() | provenance | Sink:MaD:7 Sink:MaD:7 | | test_logging.rs:248:23:248:48 | ...::format(...) | test_logging.rs:248:23:248:48 | { ... } | provenance | | | test_logging.rs:248:23:248:48 | ...::must_use(...) | test_logging.rs:248:15:248:49 | MacroExpr | provenance | | -| test_logging.rs:248:23:248:48 | MacroExpr | test_logging.rs:248:23:248:48 | ...::format(...) | provenance | MaD:19 | -| test_logging.rs:248:23:248:48 | { ... } | test_logging.rs:248:23:248:48 | ...::must_use(...) | provenance | MaD:20 | +| test_logging.rs:248:23:248:48 | MacroExpr | test_logging.rs:248:23:248:48 | ...::format(...) | provenance | MaD:20 | +| test_logging.rs:248:23:248:48 | { ... } | test_logging.rs:248:23:248:48 | ...::must_use(...) | provenance | MaD:21 | | test_logging.rs:248:41:248:48 | password | test_logging.rs:248:23:248:48 | MacroExpr | provenance | | -| test_logging.rs:251:15:251:49 | MacroExpr | test_logging.rs:251:15:251:60 | ... .as_bytes() [&ref, element] | provenance | MaD:17 | +| test_logging.rs:251:15:251:49 | MacroExpr | test_logging.rs:251:15:251:60 | ... .as_bytes() [&ref, element] | provenance | MaD:18 | | test_logging.rs:251:15:251:60 | ... .as_bytes() [&ref, element] | test_logging.rs:251:15:251:60 | ... .as_bytes() | provenance | Sink:MaD:6 Sink:MaD:6 | | test_logging.rs:251:23:251:48 | ...::format(...) | test_logging.rs:251:23:251:48 | { ... } | provenance | | | test_logging.rs:251:23:251:48 | ...::must_use(...) | test_logging.rs:251:15:251:49 | MacroExpr | provenance | | -| test_logging.rs:251:23:251:48 | MacroExpr | test_logging.rs:251:23:251:48 | ...::format(...) | provenance | MaD:19 | -| test_logging.rs:251:23:251:48 | { ... } | test_logging.rs:251:23:251:48 | ...::must_use(...) | provenance | MaD:20 | +| test_logging.rs:251:23:251:48 | MacroExpr | test_logging.rs:251:23:251:48 | ...::format(...) | provenance | MaD:20 | +| test_logging.rs:251:23:251:48 | { ... } | test_logging.rs:251:23:251:48 | ...::must_use(...) | provenance | MaD:21 | | test_logging.rs:251:41:251:48 | password | test_logging.rs:251:23:251:48 | MacroExpr | provenance | | models | 1 | Sink: ::log_expect; Argument[0]; log-injection | @@ -231,11 +241,12 @@ models | 13 | Sink: std::io::stdio::_eprint; Argument[0]; log-injection | | 14 | Sink: std::io::stdio::_print; Argument[0]; log-injection | | 15 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | -| 16 | Summary: ::add; Argument[0].Reference; ReturnValue; taint | -| 17 | Summary: ::as_bytes; Argument[self].Reference; ReturnValue.Reference.Element; taint | -| 18 | Summary: ::as_str; Argument[self].Reference; ReturnValue.Reference; taint | -| 19 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | -| 20 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | +| 16 | Summary: <_ as core::fmt::Write>::write_fmt; Argument[0]; Argument[self].Reference; taint | +| 17 | Summary: ::add; Argument[0].Reference; ReturnValue; taint | +| 18 | Summary: ::as_bytes; Argument[self].Reference; ReturnValue.Reference.Element; taint | +| 19 | Summary: ::as_str; Argument[self].Reference; ReturnValue.Reference; taint | +| 20 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 21 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes | test_logging.rs:42:12:42:35 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:42:28:42:35 | password | semmle.label | password | @@ -326,6 +337,16 @@ nodes | test_logging.rs:99:22:99:45 | { ... } | semmle.label | { ... } | | test_logging.rs:99:38:99:45 | password | semmle.label | password | | test_logging.rs:100:11:100:18 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:103:12:103:18 | [post] &mut m4 [&ref] | semmle.label | [post] &mut m4 [&ref] | +| test_logging.rs:103:17:103:18 | [post] m4 | semmle.label | [post] m4 | +| test_logging.rs:103:21:103:44 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:103:37:103:44 | password | semmle.label | password | +| test_logging.rs:104:11:104:18 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:107:14:107:20 | [post] &mut m5 [&ref] | semmle.label | [post] &mut m5 [&ref] | +| test_logging.rs:107:19:107:20 | [post] m5 | semmle.label | [post] m5 | +| test_logging.rs:107:23:107:46 | MacroExpr | semmle.label | MacroExpr | +| test_logging.rs:107:39:107:46 | password | semmle.label | password | +| test_logging.rs:108:11:108:18 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:118:12:118:41 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:118:28:118:41 | get_password(...) | semmle.label | get_password(...) | | test_logging.rs:129:9:129:10 | t1 [tuple.1] | semmle.label | t1 [tuple.1] | diff --git a/rust/ql/test/query-tests/security/CWE-312/test_logging.rs b/rust/ql/test/query-tests/security/CWE-312/test_logging.rs index 43bcd8894f3c..d9dc9952086a 100644 --- a/rust/ql/test/query-tests/security/CWE-312/test_logging.rs +++ b/rust/ql/test/query-tests/security/CWE-312/test_logging.rs @@ -100,15 +100,15 @@ fn test_log(harmless: String, password: String, encrypted_password: String) { info!("{}", m3); // $ Alert[rust/cleartext-logging]=m3 let mut m4 = String::new(); - write!(&mut m4, "message = {}", password); // $ MISSING: Source=m4 - info!("{}", m4); // $ MISSING: Alert[rust/cleartext-logging]=m4 + write!(&mut m4, "message = {}", password); // $ Source[rust/cleartext-logging]=m4 + info!("{}", m4); // $ Alert[rust/cleartext-logging]=m4 let mut m5 = String::new(); - writeln!(&mut m5, "message = {}", password); // $ MISSING: Source=m5 - info!("{}", m5); // $ MISSING: Alert[rust/cleartext-logging]=m5 + writeln!(&mut m5, "message = {}", password); // $ Source[rust/cleartext-logging]=m5 + info!("{}", m5); // $ Alert[rust/cleartext-logging]=m5 let mut m6 = Vec::new(); - write!(&mut m6, "message = {}", password); // $ MISSING: Source=m6 + write!(&mut m6, "message = {}", password); // $ MISSING: Source[rust/cleartext-logging]=m6 info!("{}", std::str::from_utf8(&m6).unwrap()); // $ MISSING: Alert[rust/cleartext-logging]=m6 unsafe { info!("{}", std::str::from_utf8_unchecked(&m6)); // $ MISSING: Alert[rust/cleartext-logging]=m6 @@ -135,7 +135,7 @@ fn test_log(harmless: String, password: String, encrypted_password: String) { // logging from a struct let s1 = MyStruct1 { harmless: "foo".to_string(), - password: "123456".to_string(), // $ MISSING: Source=s1 + password: "123456".to_string(), // $ MISSING: Source[rust/cleartext-logging]=s1 }; warn!("message = {}", s1.harmless); warn!("message = {}", s1.password); // $ Alert[rust/cleartext-logging] @@ -145,7 +145,7 @@ fn test_log(harmless: String, password: String, encrypted_password: String) { let s2 = MyStruct2 { harmless: "foo".to_string(), - password: "123456".to_string(), // $ MISSING: Source=s2 + password: "123456".to_string(), // $ MISSING: Source[rust/cleartext-logging]=s2 }; warn!("message = {}", s2.harmless); warn!("message = {}", s2.password); // $ Alert[rust/cleartext-logging] From 50455bddda2b25073b277775dfa31850cd937527 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Wed, 24 Jun 2026 11:08:57 +0200 Subject: [PATCH 0396/2098] Go: Update to 1.27 --- MODULE.bazel | 2 +- go/actions/test/action.yml | 2 +- go/extractor/go.mod | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 6d562ff80b69..91c871445eb4 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -302,7 +302,7 @@ use_repo( ) go_sdk = use_extension("@rules_go//go:extensions.bzl", "go_sdk") -go_sdk.download(version = "1.26.6") +go_sdk.download(version = "1.27.0") go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps") go_deps.from_file(go_mod = "//go/extractor:go.mod") diff --git a/go/actions/test/action.yml b/go/actions/test/action.yml index 9f641e9125ae..25ff389dc01e 100644 --- a/go/actions/test/action.yml +++ b/go/actions/test/action.yml @@ -4,7 +4,7 @@ inputs: go-test-version: description: Which Go version to use for running the tests required: false - default: "~1.26.6" + default: "~1.27.0" run-code-checks: description: Whether to run qhelp generation checks required: false diff --git a/go/extractor/go.mod b/go/extractor/go.mod index 4518f3b8a98d..74a25627fdce 100644 --- a/go/extractor/go.mod +++ b/go/extractor/go.mod @@ -1,8 +1,8 @@ module github.com/github/codeql-go/extractor -go 1.26 +go 1.27 -toolchain go1.26.6 +toolchain go1.27.0 // when updating this, run // bazel run @rules_go//go -- mod tidy From 3dfe5e6703200a845a17898c3ff5ad7478d55e49 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Wed, 24 Jun 2026 11:38:38 +0200 Subject: [PATCH 0397/2098] Go: Bump `maxGoVersion` to 1.27 --- go/extractor/autobuilder/build-environment.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/extractor/autobuilder/build-environment.go b/go/extractor/autobuilder/build-environment.go index c660373205b2..bd7fc0adabe1 100644 --- a/go/extractor/autobuilder/build-environment.go +++ b/go/extractor/autobuilder/build-environment.go @@ -12,7 +12,7 @@ import ( ) var minGoVersion = util.NewSemVer("1.11") -var maxGoVersion = util.NewSemVer("1.26") +var maxGoVersion = util.NewSemVer("1.27") type versionInfo struct { goModVersion util.SemVer // The version of Go found in the go directive in the `go.mod` file. From f404c6ad43453738f188e65d17166863cee7d098 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Wed, 24 Jun 2026 11:42:04 +0200 Subject: [PATCH 0398/2098] Go: Update test formatting --- go/extractor/toolchain/toolchain_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/go/extractor/toolchain/toolchain_test.go b/go/extractor/toolchain/toolchain_test.go index 8a6b38318cb9..a62c9016a700 100644 --- a/go/extractor/toolchain/toolchain_test.go +++ b/go/extractor/toolchain/toolchain_test.go @@ -8,9 +8,9 @@ import ( func TestParseGoVersion(t *testing.T) { tests := map[string]string{ - "go version go1.18.9 linux/amd64": "go1.18.9", - "go version go1.26.3-X:nodwarf5 linux/amd64": "go1.26.3", - "go version go1.26.3rc1 linux/amd64": "go1.26.3rc1", + "go version go1.18.9 linux/amd64": "go1.18.9", + "go version go1.26.3-X:nodwarf5 linux/amd64": "go1.26.3", + "go version go1.26.3rc1 linux/amd64": "go1.26.3rc1", "warning: GOPATH set to GOROOT (/usr/local/go) has no effect\ngo version go1.18.9 linux/amd64": "go1.18.9", } for input, expected := range tests { From 31851854b69ca7e844c91505f57993b8dd7b3400 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Wed, 24 Jun 2026 12:37:39 +0200 Subject: [PATCH 0399/2098] Go: Add change note --- go/ql/lib/change-notes/2026-06-25-go-1.27.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 go/ql/lib/change-notes/2026-06-25-go-1.27.md diff --git a/go/ql/lib/change-notes/2026-06-25-go-1.27.md b/go/ql/lib/change-notes/2026-06-25-go-1.27.md new file mode 100644 index 000000000000..b1998aee7f54 --- /dev/null +++ b/go/ql/lib/change-notes/2026-06-25-go-1.27.md @@ -0,0 +1,4 @@ +--- +category: majorAnalysis +--- +* Go 1.27 is now supported. From 777c089e30624b9ae6ad0bda2b893305ac62bb07 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Wed, 24 Jun 2026 12:39:14 +0200 Subject: [PATCH 0400/2098] Go: Update supported versions to include 1.27 --- docs/codeql/reusables/supported-versions-compilers.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/codeql/reusables/supported-versions-compilers.rst b/docs/codeql/reusables/supported-versions-compilers.rst index 8e7928cb2784..8651fa91a269 100644 --- a/docs/codeql/reusables/supported-versions-compilers.rst +++ b/docs/codeql/reusables/supported-versions-compilers.rst @@ -17,7 +17,7 @@ .NET 5, .NET 6, .NET 7, .NET 8, .NET 9, .NET 10","``.sln``, ``.slnx``, ``.csproj``, ``.cs``, ``.cshtml``, ``.xaml``" GitHub Actions,"Not applicable",Not applicable,"``.github/workflows/*.yml``, ``.github/workflows/*.yaml``, ``**/action.yml``, ``**/action.yaml``" - Go (aka Golang), "Go up to 1.26", "Go 1.11 or more recent", ``.go`` + Go (aka Golang), "Go up to 1.27", "Go 1.11 or more recent", ``.go`` Java,"Java 7 to 26 [5]_","javac (OpenJDK and Oracle JDK), Eclipse compiler for Java (ECJ) [6]_",``.java`` From 9db5585299075dc9ec9912b0c8e19f192d7eb630 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Wed, 24 Jun 2026 15:36:53 +0200 Subject: [PATCH 0401/2098] Go: Fix `findMethodOnTypeWithGivenReceiver` for Go 1.27 --- go/extractor/trap/labels.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/extractor/trap/labels.go b/go/extractor/trap/labels.go index 473e2e761f2e..ca43bc370252 100644 --- a/go/extractor/trap/labels.go +++ b/go/extractor/trap/labels.go @@ -187,7 +187,7 @@ func findMethodOnTypeWithGivenReceiver(tp types.Type, object types.Object) *type if definedType, ok := tp.(*types.Named); ok { for i := 0; i < definedType.NumMethods(); i++ { meth := definedType.Method(i) - if object == meth.Type().(*types.Signature).Recv() { + if object == meth.Type().(*types.Signature).Recv().Origin() { return meth } } From 28d44f7f4d7233773b5dbbd13a80ff9ee213bbb1 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Tue, 30 Jun 2026 10:25:06 +0200 Subject: [PATCH 0402/2098] Go: Add generic method test --- .../GenericFunctionInstantiationExpr.expected | 1 + .../semmle/go/Function/TypeParamType.expected | 7 +++++++ .../semmle/go/Function/genericMethods.go | 19 +++++++++++++++++++ .../semmle/go/Function/getParameter.expected | 4 ++++ .../go/Function/getTypeParameter.expected | 3 +++ .../library-tests/semmle/go/Function/go.mod | 2 +- 6 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 go/ql/test/library-tests/semmle/go/Function/genericMethods.go diff --git a/go/ql/test/library-tests/semmle/go/Function/GenericFunctionInstantiationExpr.expected b/go/ql/test/library-tests/semmle/go/Function/GenericFunctionInstantiationExpr.expected index 6528a0ae7f3d..d244960a5e09 100644 --- a/go/ql/test/library-tests/semmle/go/Function/GenericFunctionInstantiationExpr.expected +++ b/go/ql/test/library-tests/semmle/go/Function/GenericFunctionInstantiationExpr.expected @@ -6,3 +6,4 @@ | genericFunctions.go:45:6:45:50 | generic function instantiation expression | genericFunctions.go:45:6:45:33 | GenericFunctionTwoTypeParams | 1 | genericFunctions.go:45:43:45:49 | float64 | | genericFunctions.go:141:6:141:41 | generic function instantiation expression | genericFunctions.go:141:6:141:33 | GenericFunctionInAnotherFile | 0 | genericFunctions.go:141:35:141:40 | string | | genericFunctions.go:146:6:146:55 | generic function instantiation expression | genericFunctions.go:146:6:146:47 | selection of GenericFunctionInAnotherPackage | 0 | genericFunctions.go:146:49:146:54 | string | +| genericMethods.go:13:2:13:23 | generic function instantiation expression | genericMethods.go:13:2:13:18 | selection of GenericMethod1 | 0 | genericMethods.go:13:20:13:22 | int | diff --git a/go/ql/test/library-tests/semmle/go/Function/TypeParamType.expected b/go/ql/test/library-tests/semmle/go/Function/TypeParamType.expected index 4addfa50f349..a04289ef71b7 100644 --- a/go/ql/test/library-tests/semmle/go/Function/TypeParamType.expected +++ b/go/ql/test/library-tests/semmle/go/Function/TypeParamType.expected @@ -19,6 +19,9 @@ numberOfTypeParameters | genericFunctions.go:150:6:150:36 | multipleAnonymousTypeParamsFunc | 3 | | genericFunctions.go:152:6:152:36 | multipleAnonymousTypeParamsType | 3 | | genericFunctions.go:154:51:154:51 | f | 3 | +| genericMethods.go:5:33:5:46 | GenericMethod1 | 1 | +| genericMethods.go:7:6:7:28 | StructForGenericMethod2 | 1 | +| genericMethods.go:9:37:9:50 | GenericMethod2 | 2 | #select | codeql-go-tests/function.EdgeConstraint | 0 | | Node | interface { } | | codeql-go-tests/function.Element | 0 | | S | interface { } | @@ -44,6 +47,10 @@ numberOfTypeParameters | codeql-go-tests/function.New | 0 | | Node | NodeConstraint | | codeql-go-tests/function.New | 1 | | Edge | EdgeConstraint | | codeql-go-tests/function.NodeConstraint | 0 | | Edge | interface { } | +| codeql-go-tests/function.StructForGenericMethod1.GenericMethod1 | 0 | | P1 | interface { } | +| codeql-go-tests/function.StructForGenericMethod2 | 0 | | P2 | interface { } | +| codeql-go-tests/function.StructForGenericMethod2.GenericMethod2 | 0 | | P4 | interface { } | +| codeql-go-tests/function.StructForGenericMethod2.GenericMethod2 | 0 | from receiver | P3 | interface { } | | codeql-go-tests/function.multipleAnonymousTypeParamsFunc | 0 | | _ | interface { } | | codeql-go-tests/function.multipleAnonymousTypeParamsFunc | 1 | | _ | interface { string } | | codeql-go-tests/function.multipleAnonymousTypeParamsFunc | 2 | | _ | interface { } | diff --git a/go/ql/test/library-tests/semmle/go/Function/genericMethods.go b/go/ql/test/library-tests/semmle/go/Function/genericMethods.go new file mode 100644 index 000000000000..860430088ed2 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/Function/genericMethods.go @@ -0,0 +1,19 @@ +package main + +type StructForGenericMethod1 struct{} + +func (*StructForGenericMethod1) GenericMethod1[P1 any](x P1) {} + +type StructForGenericMethod2[P2 any] struct{} + +func (*StructForGenericMethod2[P3]) GenericMethod2[P4 any](x P4) {} + +func generic_methods(s1 StructForGenericMethod1, s2 StructForGenericMethod2[int]) { + // Call the generic method specifying the type + s1.GenericMethod1[int](1) + //s2.GenericMethod2[string]("hello") + + // Call the generic method without specifying the type + s1.GenericMethod1("hello") + //s2.GenericMethod2(42) +} diff --git a/go/ql/test/library-tests/semmle/go/Function/getParameter.expected b/go/ql/test/library-tests/semmle/go/Function/getParameter.expected index 80171d5e79a6..55fb6e4a9579 100644 --- a/go/ql/test/library-tests/semmle/go/Function/getParameter.expected +++ b/go/ql/test/library-tests/semmle/go/Function/getParameter.expected @@ -11,6 +11,10 @@ | genericFunctions.go:138:29:138:40 | ShortestPath | 1 | genericFunctions.go:138:48:138:49 | to | | genericFunctions.go:138:29:138:40 | ShortestPath | -1 | genericFunctions.go:138:7:138:7 | g | | genericFunctions.go:154:51:154:51 | f | -1 | genericFunctions.go:154:7:154:7 | x | +| genericMethods.go:5:33:5:46 | GenericMethod1 | 0 | genericMethods.go:5:56:5:56 | x | +| genericMethods.go:9:37:9:50 | GenericMethod2 | 0 | genericMethods.go:9:60:9:60 | x | +| genericMethods.go:11:6:11:20 | generic_methods | 0 | genericMethods.go:11:22:11:23 | s1 | +| genericMethods.go:11:6:11:20 | generic_methods | 1 | genericMethods.go:11:50:11:51 | s2 | | main.go:7:6:7:7 | f1 | 0 | main.go:7:9:7:9 | x | | main.go:9:12:9:13 | f2 | 0 | main.go:9:15:9:15 | x | | main.go:9:12:9:13 | f2 | 1 | main.go:9:18:9:18 | y | diff --git a/go/ql/test/library-tests/semmle/go/Function/getTypeParameter.expected b/go/ql/test/library-tests/semmle/go/Function/getTypeParameter.expected index 27a89adf95e2..9f758d14ee88 100644 --- a/go/ql/test/library-tests/semmle/go/Function/getTypeParameter.expected +++ b/go/ql/test/library-tests/semmle/go/Function/getTypeParameter.expected @@ -19,3 +19,6 @@ | genericFunctions.go:152:6:152:69 | type declaration specifier | TypeSpec | 0 | genericFunctions.go:152:38:152:42 | type parameter declaration | 0 | genericFunctions.go:152:38:152:38 | _ | genericFunctions.go:152:40:152:42 | any | interface { } | | genericFunctions.go:152:6:152:69 | type declaration specifier | TypeSpec | 1 | genericFunctions.go:152:45:152:52 | type parameter declaration | 0 | genericFunctions.go:152:45:152:45 | _ | genericFunctions.go:152:47:152:52 | string | interface { string } | | genericFunctions.go:152:6:152:69 | type declaration specifier | TypeSpec | 2 | genericFunctions.go:152:55:152:59 | type parameter declaration | 0 | genericFunctions.go:152:55:152:55 | _ | genericFunctions.go:152:57:152:59 | any | interface { } | +| genericMethods.go:5:1:5:63 | function declaration | MethodDecl | 0 | genericMethods.go:5:48:5:53 | type parameter declaration | 0 | genericMethods.go:5:48:5:49 | P1 | genericMethods.go:5:51:5:53 | any | interface { } | +| genericMethods.go:7:6:7:45 | type declaration specifier | TypeSpec | 0 | genericMethods.go:7:30:7:35 | type parameter declaration | 0 | genericMethods.go:7:30:7:31 | P2 | genericMethods.go:7:33:7:35 | any | interface { } | +| genericMethods.go:9:1:9:67 | function declaration | MethodDecl | 0 | genericMethods.go:9:52:9:57 | type parameter declaration | 0 | genericMethods.go:9:52:9:53 | P4 | genericMethods.go:9:55:9:57 | any | interface { } | diff --git a/go/ql/test/library-tests/semmle/go/Function/go.mod b/go/ql/test/library-tests/semmle/go/Function/go.mod index 85d3db5c5a37..6be32d80e106 100644 --- a/go/ql/test/library-tests/semmle/go/Function/go.mod +++ b/go/ql/test/library-tests/semmle/go/Function/go.mod @@ -1,6 +1,6 @@ module codeql-go-tests/function -go 1.18 +go 1.27 require github.com/anotherpkg v0.0.0-20200203000000-0000000000000 From 072b298c66bb0c085c3cc24319f00ccbfcf0c25a Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Tue, 14 Jul 2026 11:35:28 +0200 Subject: [PATCH 0403/2098] Go: Fix crash in `getTypeParamParentLabel` --- go/extractor/extractor.go | 24 ++++++++++++++++++- .../GenericFunctionInstantiationExpr.expected | 1 + .../semmle/go/Function/genericMethods.go | 4 ++-- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/go/extractor/extractor.go b/go/extractor/extractor.go index 7f8ae557e3c4..5d33576e03e9 100644 --- a/go/extractor/extractor.go +++ b/go/extractor/extractor.go @@ -1657,8 +1657,30 @@ func extractType(tw *trap.Writer, tp types.Type) trap.Label { // parent scope, so they are not dealt with by `extractScopes` for i := 0; i < origintp.NumMethods(); i++ { meth := origintp.Method(i).Origin() - extractMethod(tw, meth) + + // Consider a generic struct and a generic method: + // + // type S[P any] struct{} + // func (*S[P]) m[Q any](x Q) {} + // + // If we have a variable 's' of type 'S[int]' and the expression + // 's.m[string]("")', then the type of the selector expression 's.m' + // is ' func(Q)'. The method 'm' here is an instantiation of the + // declaration, which has its own type with type parameter 'Q'. + // As we do not extract method instantiations, 'populateTypeParamParents' + // does not automatically get called for the type parameter 'Q' + // from the instantiation of 'm'. To compensate, we add the type + // parameters here. + // + // As a parent we use the origin method. This suffices, as the name + // and index of the type parameter in the instantiation will be + // identical to those of the uninstantiated method, and as only + // these two properties will be extracted for a type parameter. + if tp.Method(i) != meth { + signature := tp.Method(i).Type().(*types.Signature) + populateTypeParamParents(signature.TypeParams(), meth, false) + } } underlyingInterface, underlyingIsInterface := underlying.(*types.Interface) diff --git a/go/ql/test/library-tests/semmle/go/Function/GenericFunctionInstantiationExpr.expected b/go/ql/test/library-tests/semmle/go/Function/GenericFunctionInstantiationExpr.expected index d244960a5e09..5c01d626b28a 100644 --- a/go/ql/test/library-tests/semmle/go/Function/GenericFunctionInstantiationExpr.expected +++ b/go/ql/test/library-tests/semmle/go/Function/GenericFunctionInstantiationExpr.expected @@ -7,3 +7,4 @@ | genericFunctions.go:141:6:141:41 | generic function instantiation expression | genericFunctions.go:141:6:141:33 | GenericFunctionInAnotherFile | 0 | genericFunctions.go:141:35:141:40 | string | | genericFunctions.go:146:6:146:55 | generic function instantiation expression | genericFunctions.go:146:6:146:47 | selection of GenericFunctionInAnotherPackage | 0 | genericFunctions.go:146:49:146:54 | string | | genericMethods.go:13:2:13:23 | generic function instantiation expression | genericMethods.go:13:2:13:18 | selection of GenericMethod1 | 0 | genericMethods.go:13:20:13:22 | int | +| genericMethods.go:14:2:14:26 | generic function instantiation expression | genericMethods.go:14:2:14:18 | selection of GenericMethod2 | 0 | genericMethods.go:14:20:14:25 | string | diff --git a/go/ql/test/library-tests/semmle/go/Function/genericMethods.go b/go/ql/test/library-tests/semmle/go/Function/genericMethods.go index 860430088ed2..54bd4135da2f 100644 --- a/go/ql/test/library-tests/semmle/go/Function/genericMethods.go +++ b/go/ql/test/library-tests/semmle/go/Function/genericMethods.go @@ -11,9 +11,9 @@ func (*StructForGenericMethod2[P3]) GenericMethod2[P4 any](x P4) {} func generic_methods(s1 StructForGenericMethod1, s2 StructForGenericMethod2[int]) { // Call the generic method specifying the type s1.GenericMethod1[int](1) - //s2.GenericMethod2[string]("hello") + s2.GenericMethod2[string]("hello") // Call the generic method without specifying the type s1.GenericMethod1("hello") - //s2.GenericMethod2(42) + s2.GenericMethod2(42) } From 1a430070f83f17353e929a9d383a8df4b3624344 Mon Sep 17 00:00:00 2001 From: Jordan Pike Date: Wed, 19 Aug 2026 14:53:30 -0400 Subject: [PATCH 0404/2098] Actions: AssociationIfCheck should not protect events that do not populate the checked field Same problem as EventActorIfCheck had. A condition like 'github.event.pull_request.author_association != NONE' on a workflow triggered by issues events is always true since github.event.pull_request is not populated there, but it still counted as a protective check for those events. Bind the matched context prefix in the characteristic predicate and require contextTriggerDataModel to populate it for the event, following the pattern from #22368. Existing TOCTOU alerts on vacuous gates migrate to the untrusted-checkout critical query, since a vacuous gate is no protection rather than raceable protection. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 4084febb-f9c7-44df-baf3-c8be8e9932a7 --- ...-19-association-if-check-event-validity.md | 4 +++ .../codeql/actions/security/ControlChecks.qll | 35 +++++++++++++++---- .../association_check_wrong_event.yml | 21 +++++++++++ .../CWE-094/CodeInjectionCritical.expected | 3 ++ .../CWE-094/CodeInjectionMedium.expected | 3 ++ .../UntrustedCheckoutTOCTOUCritical.expected | 5 --- .../UntrustedCheckoutTOCTOUHigh.expected | 2 -- .../UntrustedCheckoutCritical.expected | 5 +++ 8 files changed, 64 insertions(+), 14 deletions(-) create mode 100644 actions/ql/lib/change-notes/2026-08-19-association-if-check-event-validity.md create mode 100644 actions/ql/test/query-tests/Security/CWE-094/.github/workflows/association_check_wrong_event.yml diff --git a/actions/ql/lib/change-notes/2026-08-19-association-if-check-event-validity.md b/actions/ql/lib/change-notes/2026-08-19-association-if-check-event-validity.md new file mode 100644 index 000000000000..28ef240b2394 --- /dev/null +++ b/actions/ql/lib/change-notes/2026-08-19-association-if-check-event-validity.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Checks on author association fields read from the event payload (e.g. `github.event.pull_request.author_association`) now only count as protection for events whose payload actually populates that field. Previously, a condition such as `github.event.pull_request.author_association != 'NONE'` on a workflow triggered by `issues` events was treated as a protective check even though `github.event.pull_request` is not populated for `issues` events, which makes the condition vacuous. This change may result in more alerts for queries using the `ControlCheck` class. diff --git a/actions/ql/lib/codeql/actions/security/ControlChecks.qll b/actions/ql/lib/codeql/actions/security/ControlChecks.qll index 675c1d18852b..aea57fdc4b71 100644 --- a/actions/ql/lib/codeql/actions/security/ControlChecks.qll +++ b/actions/ql/lib/codeql/actions/security/ControlChecks.qll @@ -408,16 +408,37 @@ class WorkflowRunRepositoryIfCheck extends RepositoryCheck instanceof If { } } +/** + * Gets a regular expression matching a condition on an author association field + * that is only populated for events whose payload contains the `context_prefix` + * context. + */ +private string eventPayloadAssociationFieldRegex(string context_prefix) { + context_prefix = "github.event.comment" and + result = "\\bgithub\\.event\\.comment\\.author_association\\b" + or + context_prefix = "github.event.issue" and + result = "\\bgithub\\.event\\.issue\\.author_association\\b" + or + context_prefix = "github.event.pull_request" and + result = "\\bgithub\\.event\\.pull_request\\.author_association\\b" +} + class AssociationIfCheck extends AssociationCheck instanceof If { + string context_prefix; + AssociationIfCheck() { // eg: contains(fromJson('["MEMBER", "OWNER"]'), github.event.comment.author_association) - normalizeExpr(this.getCondition()) - .splitAt("\n") - .regexpMatch([ - ".*\\bgithub\\.event\\.comment\\.author_association\\b.*", - ".*\\bgithub\\.event\\.issue\\.author_association\\b.*", - ".*\\bgithub\\.event\\.pull_request\\.author_association\\b.*", - ]) + exists( + normalizeExpr(this.getCondition()) + .regexpFind(eventPayloadAssociationFieldRegex(context_prefix), _, _) + ) + } + + override predicate protectsCategoryAndEvent(string category, string event) { + AssociationCheck.super.protectsCategoryAndEvent(category, event) and + // association fields only restrict events whose payload populates them + contextTriggerDataModel(event, context_prefix) } } diff --git a/actions/ql/test/query-tests/Security/CWE-094/.github/workflows/association_check_wrong_event.yml b/actions/ql/test/query-tests/Security/CWE-094/.github/workflows/association_check_wrong_event.yml new file mode 100644 index 000000000000..b1cef25955dd --- /dev/null +++ b/actions/ql/test/query-tests/Security/CWE-094/.github/workflows/association_check_wrong_event.yml @@ -0,0 +1,21 @@ +on: + issues: + types: [opened] + +jobs: + # The `if:` condition compares an association field that is never populated + # for `issues` events, so it is always true and does not protect the + # injectable step. + vacuous-association-check: + runs-on: ubuntu-latest + if: github.event.pull_request.author_association != 'NONE' + steps: + - run: echo '${{ github.event.issue.title }}' + + # `github.event.issue` is populated for `issues` events, so this check is + # effective and the injectable step is protected. + valid-association-check: + runs-on: ubuntu-latest + if: github.event.issue.author_association == 'MEMBER' + steps: + - run: echo '${{ github.event.issue.title }}' diff --git a/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionCritical.expected b/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionCritical.expected index 14e50942d734..e32155dffe93 100644 --- a/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionCritical.expected +++ b/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionCritical.expected @@ -312,6 +312,8 @@ nodes | .github/workflows/artifactpoisoning8.yml:17:9:21:6 | Run Step: artifact [id] | semmle.label | Run Step: artifact [id] | | .github/workflows/artifactpoisoning8.yml:19:14:19:58 | echo "::set-output name=id::$( Date: Thu, 20 Aug 2026 09:18:45 +0200 Subject: [PATCH 0405/2098] C#: Harden cs/useless-cast-to-self for BMN extracted databases. --- csharp/ql/src/Language Abuse/UselessCastToSelf.ql | 1 + 1 file changed, 1 insertion(+) diff --git a/csharp/ql/src/Language Abuse/UselessCastToSelf.ql b/csharp/ql/src/Language Abuse/UselessCastToSelf.ql index d1a08e1db1c5..96f93131fa6a 100644 --- a/csharp/ql/src/Language Abuse/UselessCastToSelf.ql +++ b/csharp/ql/src/Language Abuse/UselessCastToSelf.ql @@ -19,5 +19,6 @@ where type = cast.getTargetType() and type = e.getType() and not type instanceof NullType and + not type instanceof UnknownType and not e.(ImplicitDelegateCreation).getArgument() instanceof AnonymousFunctionExpr select cast, "This cast is redundant because the expression already has type " + type + "." From 97985c87fec0680950a84d72d58822ae890bb11b Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 20 Aug 2026 09:26:25 +0200 Subject: [PATCH 0406/2098] C#: Add change-note. --- .../change-notes/2026-08-20-harden-useless-cast-to-self.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 csharp/ql/src/change-notes/2026-08-20-harden-useless-cast-to-self.md diff --git a/csharp/ql/src/change-notes/2026-08-20-harden-useless-cast-to-self.md b/csharp/ql/src/change-notes/2026-08-20-harden-useless-cast-to-self.md new file mode 100644 index 000000000000..bb5bb85b86e7 --- /dev/null +++ b/csharp/ql/src/change-notes/2026-08-20-harden-useless-cast-to-self.md @@ -0,0 +1,4 @@ +--- +category: fix +--- +* The query `cs/useless-cast-to-self` no longer reports casts when both the expression type and the cast target type are unknown, which can occur in `build-mode: none` databases. From d28a06092bf7fb909d4bdbe4d5b32ae1dc7cbba8 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Thu, 20 Aug 2026 10:00:22 +0100 Subject: [PATCH 0407/2098] Rust: Update an .expected file in integration tests. --- rust/ql/integration-tests/hello-project/summary.expected | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust/ql/integration-tests/hello-project/summary.expected b/rust/ql/integration-tests/hello-project/summary.expected index 0d639fe44f75..e83ef6d22658 100644 --- a/rust/ql/integration-tests/hello-project/summary.expected +++ b/rust/ql/integration-tests/hello-project/summary.expected @@ -1,6 +1,6 @@ | Extraction errors | 0 | | Extraction warnings | 0 | -| Files extracted - total | 5 | +| Files extracted - total user | 5 | | Files extracted - with errors | 0 | | Files extracted - without errors | 5 | | Files extracted - without errors % | 100 | From 66573bb5951d60ad88d20fce4989345ee5d1aeaf Mon Sep 17 00:00:00 2001 From: Alex Ausch Date: Wed, 19 Aug 2026 17:11:54 +0200 Subject: [PATCH 0408/2098] Python: fix PEP 758 `except A, B:` in the default parser The grammar rule shared by both readings is except_clause: 'except' [test [(',' | 'as') test]] and `visit_except_clause` ignored the separator token, always treating the fourth child as an alias to bind. So `except A, B:` extracted `B` as a Store rather than a use, which is the Python 2 reading. Queries that reason about whether a name is used then report false positives; `py/unused-import` flags the import of `B` as unused. The tree-sitter parser already extracts this as a tuple of exception types (#20990), so the two parsers disagreed. `tests/parser/exceptions_relaxed.py` is an unsuffixed parser test, which asserts the two parsers produce identical ASTs; it fails without this change. With the fix, the default parser reproduces the existing `tests/parser/exceptions_new.expected` byte for byte, and of the 37 parser test files only the two containing PEP 758 syntax change at all. Co-Authored-By: Claude Opus 5 (1M context) --- python/extractor/semmle/python/parser/ast.py | 11 ++++++++++- python/extractor/tests/parser/exceptions_relaxed.py | 10 ++++++++++ .../2026-08-19-legacy-parser-relaxed-except.md | 4 ++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 python/extractor/tests/parser/exceptions_relaxed.py create mode 100644 python/ql/lib/change-notes/2026-08-19-legacy-parser-relaxed-except.md diff --git a/python/extractor/semmle/python/parser/ast.py b/python/extractor/semmle/python/parser/ast.py index e1843131554a..0712bf08ae45 100644 --- a/python/extractor/semmle/python/parser/ast.py +++ b/python/extractor/semmle/python/parser/ast.py @@ -981,7 +981,16 @@ def visit_except_clause(self, node): if len(node.children) > 1: type = self.visit(node.children[1], LOAD) if len(node.children) > 3: - name = self.visit(node.children[3], STORE) + if is_token(node.children[2], "as"): + name = self.visit(node.children[3], STORE) + else: + # PEP 758 (Python 3.14+): `except A, B:` is an unparenthesized + # tuple of exception types, not a Python 2 alias binding. The + # grammar rule `'except' [test [(',' | 'as') test]]` is shared + # between both readings, so the separator token decides. + elts = [type, self.visit(node.children[3], LOAD)] + type = ast.Tuple(elts, LOAD) + set_location(type, node.children[1].start, node.children[3].end) return type, name def visit_del_stmt(self, node): diff --git a/python/extractor/tests/parser/exceptions_relaxed.py b/python/extractor/tests/parser/exceptions_relaxed.py new file mode 100644 index 000000000000..a0dea76dfa81 --- /dev/null +++ b/python/extractor/tests/parser/exceptions_relaxed.py @@ -0,0 +1,10 @@ +try: + a +except b, c: + d +except (e, f): + g +except h as i: + j +except k: + l diff --git a/python/ql/lib/change-notes/2026-08-19-legacy-parser-relaxed-except.md b/python/ql/lib/change-notes/2026-08-19-legacy-parser-relaxed-except.md new file mode 100644 index 000000000000..bd4bd599f568 --- /dev/null +++ b/python/ql/lib/change-notes/2026-08-19-legacy-parser-relaxed-except.md @@ -0,0 +1,4 @@ +--- +category: fix +--- +* Fixed the extraction of PEP 758 `except A, B:` clauses by the default (non-tree-sitter) Python parser. Previously the second exception type was extracted as a Python 2 style alias binding, so it was recorded as a `Store` rather than a use. This caused false positives from queries that reason about whether a name is used, such as `py/unused-import`. From 896d8d78b45d489a317cace26b4219399653e4e3 Mon Sep 17 00:00:00 2001 From: Alex Ausch Date: Thu, 20 Aug 2026 10:53:23 +0200 Subject: [PATCH 0409/2098] Python: add query tests for unparenthesized except chains of every length The parser test added with the fix pins the AST. These pin the behaviour a user actually sees, through the real extraction path including the tree-sitter fallback, and they cover chains longer than two. Chains of three or more behave differently from chains of two, which is worth having written down. `except A, B, C:` fails the default parser outright, so `Module.py_ast` falls back to tree-sitter and the result is already correct. `except A, B:` parses successfully under the Python 2 reading, so the fallback never fires and the bad AST reaches the queries. That is why only the two-type form produced a false positive. It also means the two cases cannot share a file: any three-type clause sends the whole file to tree-sitter and masks the two-type behaviour. Hence relaxed_except.py and relaxed_except_long.py, with a comment in each saying so. Each name is used in exactly one clause for the same reason -- a name reused in a parenthesized clause is a use regardless, and hides the defect. Verified by reverting the extractor fix in a 2.26.3 bundle: relaxed_except.py then reports `Import of 'Beta' is not used.` and the test fails. Co-Authored-By: Claude Opus 5 (1M context) --- .../Imports/unused/UnusedImport.expected | 1 + .../Imports/unused/relaxed_except.py | 26 +++++++++++++++++++ .../Imports/unused/relaxed_except_defs.py | 26 +++++++++++++++++++ .../Imports/unused/relaxed_except_long.py | 17 ++++++++++++ 4 files changed, 70 insertions(+) create mode 100644 python/ql/test/query-tests/Imports/unused/relaxed_except.py create mode 100644 python/ql/test/query-tests/Imports/unused/relaxed_except_defs.py create mode 100644 python/ql/test/query-tests/Imports/unused/relaxed_except_long.py diff --git a/python/ql/test/query-tests/Imports/unused/UnusedImport.expected b/python/ql/test/query-tests/Imports/unused/UnusedImport.expected index 2f27961d92e3..801305defafd 100644 --- a/python/ql/test/query-tests/Imports/unused/UnusedImport.expected +++ b/python/ql/test/query-tests/Imports/unused/UnusedImport.expected @@ -6,3 +6,4 @@ | imports_test.py:27:1:27:25 | Import | Import of 'func2' is not used. | | imports_test.py:34:1:34:14 | Import | Import of 'module2' is not used. | | imports_test.py:116:1:116:41 | Import | Import of 'not_a_fixture' is not used. | +| relaxed_except.py:12:1:12:68 | Import | Import of 'NeverUsed' is not used. | diff --git a/python/ql/test/query-tests/Imports/unused/relaxed_except.py b/python/ql/test/query-tests/Imports/unused/relaxed_except.py new file mode 100644 index 000000000000..0f1f29d71ceb --- /dev/null +++ b/python/ql/test/query-tests/Imports/unused/relaxed_except.py @@ -0,0 +1,26 @@ +# PEP 758 allows unparenthesized exception types when there is no `as` clause. +# Every name below is used as an exception type, so no import here is unused. +# `NeverUsed` is imported and never used, and is the one expected result. +# +# Each name appears in exactly one clause on purpose: a name that also appeared +# in a parenthesized clause would be a use regardless, and would mask the +# behaviour under test. +# +# This file deliberately contains no `except A, B, C:` clause. Three or more +# unparenthesized types fail the default parser, which sends the whole file to +# the tree-sitter parser and would likewise mask it. +from relaxed_except_defs import Alpha, Beta, Delta, Gamma, NeverUsed + + +def unparenthesized(): + try: + pass + except Alpha, Beta: + raise + + +def parenthesized(): + try: + pass + except (Gamma, Delta): + raise diff --git a/python/ql/test/query-tests/Imports/unused/relaxed_except_defs.py b/python/ql/test/query-tests/Imports/unused/relaxed_except_defs.py new file mode 100644 index 000000000000..1c6e63828666 --- /dev/null +++ b/python/ql/test/query-tests/Imports/unused/relaxed_except_defs.py @@ -0,0 +1,26 @@ +class Alpha(Exception): + pass + + +class Beta(Exception): + pass + + +class Gamma(Exception): + pass + + +class Delta(Exception): + pass + + +class Epsilon(Exception): + pass + + +class NeverUsed(Exception): + pass + + +class Zeta(Exception): + pass diff --git a/python/ql/test/query-tests/Imports/unused/relaxed_except_long.py b/python/ql/test/query-tests/Imports/unused/relaxed_except_long.py new file mode 100644 index 000000000000..cadecb48cd3c --- /dev/null +++ b/python/ql/test/query-tests/Imports/unused/relaxed_except_long.py @@ -0,0 +1,17 @@ +# Three or more unparenthesized exception types. These fail the default parser +# and are extracted by the tree-sitter parser instead; all names are still uses. +from relaxed_except_defs import Delta, Epsilon, Gamma, Zeta + + +def three(): + try: + pass + except Gamma, Delta, Epsilon: + raise + + +def four(): + try: + pass + except Gamma, Delta, Epsilon, Zeta: + raise From 04790c95d5823d5a2f69a43bd05e46dbb08fbaff Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 13 Aug 2026 11:49:49 +0200 Subject: [PATCH 0410/2098] C#: Remove the explicit feed timeout fallback. --- .../NugetPackageRestorer.cs | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs index aeedbc176867..9ff4760ed396 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs @@ -129,17 +129,6 @@ public HashSet Restore() var allExplicitReachable = explicitFeeds.Count == feedManager.ReachableExplicitFeeds.Count; EmitUnreachableFeedsDiagnostics(allExplicitReachable); - - if (feedManager.ExplicitFeedTimeout) - { - // If we experience a timeout, we use this fallback. - // todo: we could also check the reachability of the inherited nuget feeds, but to use those in the fallback we would need to handle authentication too. - var unresponsiveMissingPackageLocation = DownloadMissingPackages([]); - return unresponsiveMissingPackageLocation is null - ? [] - : [unresponsiveMissingPackageLocation]; - } - } try From 71377e7d7bcec95a89703fcd06f366594f6fcbbd Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 13 Aug 2026 12:44:27 +0200 Subject: [PATCH 0411/2098] C#: Remove the timeout bool logic in the feed manager. --- .../FeedManager.cs | 52 +++++-------------- 1 file changed, 13 insertions(+), 39 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs index 1d5523a983cb..0cbf106df38a 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs @@ -60,17 +60,12 @@ internal sealed partial class FeedManager : IDisposable /// public ImmutableHashSet InheritedFeeds => AllFeeds.Except(ExplicitFeeds).ToImmutableHashSet(); - private readonly Lazy<(bool, ImmutableHashSet)> lazyReachableExplicitFeeds; - - /// - /// Gets whether there was a timeout when checking the reachability of the explicitly configured NuGet feeds. - /// - public bool ExplicitFeedTimeout => lazyReachableExplicitFeeds.Value.Item1; + private readonly Lazy> lazyReachableExplicitFeeds; /// /// Gets the list of reachable NuGet feeds that are explicitly configured. /// - public ImmutableHashSet ReachableExplicitFeeds => lazyReachableExplicitFeeds.Value.Item2; + public ImmutableHashSet ReachableExplicitFeeds => lazyReachableExplicitFeeds.Value; private readonly Lazy> lazyReachableFeeds; /// @@ -96,15 +91,11 @@ public FeedManager(ILogger logger, IDotNet dotnet, DependabotProxy? dependabotPr lazyExplicitFeeds = new Lazy>(GetExplicitFeeds); lazyAllFeeds = new Lazy>(GetAllFeeds); - lazyReachableExplicitFeeds = new Lazy<(bool, ImmutableHashSet)>(() => - { - var timeout = CheckSpecifiedFeeds(ExplicitFeeds, out var reachableFeeds); - return (timeout, reachableFeeds); - }); + lazyReachableExplicitFeeds = new Lazy>(() => CheckSpecifiedFeeds(ExplicitFeeds)); lazyReachableFeeds = new Lazy>(() => { // Inherited feeds should only be used, if they are indeed reachable (as they may be environment specific). - CheckSpecifiedFeeds(InheritedFeeds, out var reachableInheritedFeeds); + var reachableInheritedFeeds = CheckSpecifiedFeeds(InheritedFeeds); return ReachableExplicitFeeds.Union(reachableInheritedFeeds).ToImmutableHashSet(); }); lazyReachableFallbackFeeds = new Lazy>(() => @@ -271,7 +262,7 @@ private static async Task ExecuteGetRequest(string address, return await httpClient.GetAsync(address, HttpCompletionOption.ResponseHeadersRead, cancellationToken); } - private bool IsFeedReachable(string feed, int timeoutMilliSeconds, int tryCount, out bool isTimeout) + private bool IsFeedReachable(string feed, int timeoutMilliSeconds, int tryCount) { logger.LogInfo($"Checking if NuGet feed '{feed}' is reachable..."); @@ -304,8 +295,6 @@ private bool IsFeedReachable(string feed, int timeoutMilliSeconds, int tryCount, using HttpClient client = new(httpClientHandler); - isTimeout = false; - for (var i = 0; i < tryCount; i++) { using var cts = new CancellationTokenSource(); @@ -335,7 +324,6 @@ private bool IsFeedReachable(string feed, int timeoutMilliSeconds, int tryCount, } logger.LogWarning($"Didn't receive answer from NuGet feed '{feed}'. Tried it {tryCount} times."); - isTimeout = true; return false; } @@ -359,12 +347,8 @@ private HashSet GetExcludedFeeds() /// Checks that we can connect to the specified NuGet feeds. /// /// The set of package feeds to check. - /// The list of feeds that were reachable. - /// - /// True if there is a timeout when trying to reach the feeds (excluding any feeds that are configured - /// to be excluded from the check) or false otherwise. - /// - private bool CheckSpecifiedFeeds(ImmutableHashSet feeds, out ImmutableHashSet reachableFeeds) + /// The list of feeds that were reachable. + private ImmutableHashSet CheckSpecifiedFeeds(ImmutableHashSet feeds) { // Exclude any feeds from the feed check that are configured by the corresponding environment variable. // These feeds are always assumed to be reachable. @@ -380,12 +364,10 @@ private bool CheckSpecifiedFeeds(ImmutableHashSet feeds, out ImmutableHa return true; }).ToHashSet(); - var reachable = GetReachableNuGetFeeds(feedsToCheck, isFallback: false, out var isTimeout); + var reachable = GetReachableNuGetFeeds(feedsToCheck, isFallback: false); // Always consider feeds excluded for the reachability check as reachable. - reachableFeeds = reachable.Union(feeds.Where(feed => excludedFeeds.Contains(feed))).ToImmutableHashSet(); - - return isTimeout; + return reachable.Union(feeds.Where(feed => excludedFeeds.Contains(feed))).ToImmutableHashSet(); } /// @@ -398,7 +380,7 @@ public bool IsDefaultFeedReachable() if (CheckNugetFeedResponsiveness) { var (initialTimeout, tryCount) = GetFeedRequestSettings(isFallback: false); - return IsFeedReachable(PublicNugetOrgFeed, initialTimeout, tryCount, out var _); + return IsFeedReachable(PublicNugetOrgFeed, initialTimeout, tryCount); } return true; @@ -409,22 +391,15 @@ public bool IsDefaultFeedReachable() /// /// The feeds to check. /// Whether the feeds are fallback feeds or not. - /// Whether a timeout occurred while checking the feeds. /// The list of feeds that could be reached. - private List GetReachableNuGetFeeds(HashSet feedsToCheck, bool isFallback, out bool isTimeout) + private List GetReachableNuGetFeeds(HashSet feedsToCheck, bool isFallback) { var fallbackStr = isFallback ? "fallback " : ""; logger.LogInfo($"Checking {fallbackStr}NuGet feed reachability on feeds: {string.Join(", ", feedsToCheck.OrderBy(f => f))}"); var (initialTimeout, tryCount) = GetFeedRequestSettings(isFallback); - var timeout = false; var reachableFeeds = feedsToCheck - .Where(feed => - { - var reachable = IsFeedReachable(feed, initialTimeout, tryCount, out var feedTimeout); - timeout |= feedTimeout; - return reachable; - }) + .Where(feed => IsFeedReachable(feed, initialTimeout, tryCount)) .ToList(); if (reachableFeeds.Count == 0) @@ -436,7 +411,6 @@ private List GetReachableNuGetFeeds(HashSet feedsToCheck, bool i logger.LogInfo($"Reachable {fallbackStr}NuGet feeds: {string.Join(", ", reachableFeeds.OrderBy(f => f))}"); } - isTimeout = timeout; return reachableFeeds; } @@ -460,7 +434,7 @@ private List GetReachableFallbackNugetFeeds() } } - return GetReachableNuGetFeeds(fallbackFeeds, isFallback: true, out var _); + return GetReachableNuGetFeeds(fallbackFeeds, isFallback: true); } private ImmutableHashSet GetExplicitFeeds() From 984061fbe38448b503b24f7d2e84806050927afe Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 13 Aug 2026 15:25:16 +0200 Subject: [PATCH 0412/2098] C#: Update integration tests. --- .../CompilationInfo.expected | 7 +++++++ .../CompilationInfo.expected | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/CompilationInfo.expected b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/CompilationInfo.expected index 5a7abcf543c8..4acd4f54e8a6 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/CompilationInfo.expected +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/CompilationInfo.expected @@ -1,4 +1,8 @@ | All NuGet feeds reachable | 0.0 | +| Failed project restore with missing package error | 1.0 | +| Failed project restore with package source error | 0.0 | +| Failed solution restore with missing package error | 0.0 | +| Failed solution restore with package source error | 0.0 | | Fallback nuget restore | 1.0 | | Inherited NuGet feed count | 1.0 | | NuGet feed responsiveness checked | 1.0 | @@ -7,10 +11,13 @@ | Resolved assembly conflicts | 7.0 | | Resource extraction enabled | 0.0 | | Restored .NET framework variants | 0.0 | +| Restored projects through solution files | 0.0 | | Solution files on filesystem | 1.0 | | Source files generated | 0.0 | | Source files on filesystem | 1.0 | | Successfully ran fallback nuget restore | 1.0 | +| Successfully restored project files | 0.0 | +| Successfully restored solution files | 1.0 | | Unresolved references | 0.0 | | UseWPF set | 0.0 | | UseWindowsForms set | 0.0 | diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/CompilationInfo.expected b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/CompilationInfo.expected index 9cc03f2f5372..d421cfc42e1a 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/CompilationInfo.expected +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/CompilationInfo.expected @@ -1,4 +1,8 @@ | All NuGet feeds reachable | 0.0 | +| Failed project restore with missing package error | 1.0 | +| Failed project restore with package source error | 0.0 | +| Failed solution restore with missing package error | 0.0 | +| Failed solution restore with package source error | 0.0 | | Fallback nuget restore | 1.0 | | Inherited NuGet feed count | 1.0 | | NuGet feed responsiveness checked | 1.0 | @@ -7,10 +11,13 @@ | Resolved assembly conflicts | 7.0 | | Resource extraction enabled | 0.0 | | Restored .NET framework variants | 0.0 | +| Restored projects through solution files | 0.0 | | Solution files on filesystem | 1.0 | | Source files generated | 0.0 | | Source files on filesystem | 1.0 | | Successfully ran fallback nuget restore | 1.0 | +| Successfully restored project files | 0.0 | +| Successfully restored solution files | 1.0 | | Unresolved references | 0.0 | | UseWPF set | 0.0 | | UseWindowsForms set | 0.0 | From 04b546cae8cfdf6eb269241c9eaa1b1308846a56 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Wed, 19 Aug 2026 15:09:39 +0200 Subject: [PATCH 0413/2098] C#: Remove some dead code. --- .../NugetPackageRestorer.cs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs index 9ff4760ed396..38924e2f876e 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs @@ -614,14 +614,6 @@ public void Dispose() feedManager.Dispose(); } - /// - /// Returns the full path to a temporary directory with the given subfolder name. - /// - private static string ComputeTempDirectoryPath(string subfolderName) - { - return Path.Join(FileUtils.GetTemporaryWorkingDirectory(out _), subfolderName); - } - /// /// Computes a unique temporary directory path based on the source directory and the subfolder name. /// From 8a747a63fbdf18d0fe02d346ff6e66758a90b22b Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 20 Aug 2026 11:35:20 +0200 Subject: [PATCH 0414/2098] C#: Add change-note. --- csharp/ql/lib/change-notes/2026-08-20-dotnet-restore.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 csharp/ql/lib/change-notes/2026-08-20-dotnet-restore.md diff --git a/csharp/ql/lib/change-notes/2026-08-20-dotnet-restore.md b/csharp/ql/lib/change-notes/2026-08-20-dotnet-restore.md new file mode 100644 index 000000000000..9bd47c960e18 --- /dev/null +++ b/csharp/ql/lib/change-notes/2026-08-20-dotnet-restore.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* In `build-mode: none`, project and solution restoration is now always attempted using the feeds available. From 054af504299c706b140e1fcea3324ecf31f4e47c Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 20 Aug 2026 13:14:50 +0200 Subject: [PATCH 0415/2098] Ruby: Document missing BeginExpr flow. --- .../dataflow/local/DataflowStep.expected | 45 ++++++++++++++++-- .../dataflow/local/Nodes.expected | 34 ++++++++++++++ .../dataflow/local/TaintStep.expected | 46 +++++++++++++++++-- .../dataflow/local/local_dataflow.rb | 26 ++++++++++- 4 files changed, 144 insertions(+), 7 deletions(-) diff --git a/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected b/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected index 7122b4c0ae2f..f9b7cad4c35f 100644 --- a/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected +++ b/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected @@ -2504,9 +2504,9 @@ | UseUseExplosion.rb:24:5:25:7 | use | UseUseExplosion.rb:1:1:26:3 | C | | local_dataflow.rb:1:1:7:3 | self (foo) | local_dataflow.rb:3:8:3:10 | self | | local_dataflow.rb:1:1:7:3 | self in foo | local_dataflow.rb:1:1:7:3 | self (foo) | -| local_dataflow.rb:1:1:150:3 | x | local_dataflow.rb:10:9:10:9 | x | -| local_dataflow.rb:1:1:150:3 | self (local_dataflow.rb) | local_dataflow.rb:49:1:53:3 | self | -| local_dataflow.rb:1:1:150:3 | self in local_dataflow.rb | local_dataflow.rb:1:1:150:3 | self (local_dataflow.rb) | +| local_dataflow.rb:1:1:174:4 | x | local_dataflow.rb:10:9:10:9 | x | +| local_dataflow.rb:1:1:174:4 | self (local_dataflow.rb) | local_dataflow.rb:49:1:53:3 | self | +| local_dataflow.rb:1:1:174:4 | self in local_dataflow.rb | local_dataflow.rb:1:1:174:4 | self (local_dataflow.rb) | | local_dataflow.rb:1:9:1:9 | a | local_dataflow.rb:1:9:1:9 | a | | local_dataflow.rb:1:9:1:9 | a | local_dataflow.rb:2:7:2:7 | a | | local_dataflow.rb:2:3:2:3 | b | local_dataflow.rb:3:13:3:13 | b | @@ -2979,3 +2979,42 @@ | local_dataflow.rb:147:9:147:9 | [post] x | local_dataflow.rb:148:9:148:9 | x | | local_dataflow.rb:147:9:147:9 | x | local_dataflow.rb:148:9:148:9 | x | | local_dataflow.rb:148:5:148:10 | call to use | local_dataflow.rb:132:12:148:10 | then ... | +| local_dataflow.rb:152:1:174:3 | self (begin_expr) | local_dataflow.rb:154:9:154:21 | self | +| local_dataflow.rb:152:1:174:3 | self (begin_expr) | local_dataflow.rb:155:9:155:17 | self | +| local_dataflow.rb:152:1:174:3 | self in begin_expr | local_dataflow.rb:152:1:174:3 | self (begin_expr) | +| local_dataflow.rb:152:16:152:16 | r | local_dataflow.rb:152:16:152:16 | r | +| local_dataflow.rb:152:16:152:16 | r | local_dataflow.rb:154:26:154:26 | r | +| local_dataflow.rb:153:3:153:3 | x | local_dataflow.rb:161:8:161:8 | x | +| local_dataflow.rb:154:9:154:21 | [post] self | local_dataflow.rb:157:9:157:17 | self | +| local_dataflow.rb:154:9:154:21 | self | local_dataflow.rb:157:9:157:17 | self | +| local_dataflow.rb:154:26:154:26 | r | local_dataflow.rb:164:26:164:26 | r | +| local_dataflow.rb:155:9:155:17 | [post] self | local_dataflow.rb:157:9:157:17 | self | +| local_dataflow.rb:155:9:155:17 | [post] self | local_dataflow.rb:159:9:159:17 | self | +| local_dataflow.rb:155:9:155:17 | self | local_dataflow.rb:157:9:157:17 | self | +| local_dataflow.rb:155:9:155:17 | self | local_dataflow.rb:159:9:159:17 | self | +| local_dataflow.rb:157:9:157:17 | [post] self | local_dataflow.rb:159:9:159:17 | self | +| local_dataflow.rb:157:9:157:17 | call to source | local_dataflow.rb:156:13:157:17 | then ... | +| local_dataflow.rb:157:9:157:17 | self | local_dataflow.rb:159:9:159:17 | self | +| local_dataflow.rb:159:9:159:17 | [post] self | local_dataflow.rb:161:3:161:9 | self | +| local_dataflow.rb:159:9:159:17 | call to source | local_dataflow.rb:158:7:159:17 | ensure ... | +| local_dataflow.rb:159:9:159:17 | self | local_dataflow.rb:161:3:161:9 | self | +| local_dataflow.rb:161:3:161:9 | [post] self | local_dataflow.rb:164:9:164:21 | self | +| local_dataflow.rb:161:3:161:9 | [post] self | local_dataflow.rb:165:9:165:17 | self | +| local_dataflow.rb:161:3:161:9 | self | local_dataflow.rb:164:9:164:21 | self | +| local_dataflow.rb:161:3:161:9 | self | local_dataflow.rb:165:9:165:17 | self | +| local_dataflow.rb:163:3:163:3 | y | local_dataflow.rb:173:8:173:8 | y | +| local_dataflow.rb:164:9:164:21 | [post] self | local_dataflow.rb:167:9:167:17 | self | +| local_dataflow.rb:164:9:164:21 | self | local_dataflow.rb:167:9:167:17 | self | +| local_dataflow.rb:165:9:165:17 | [post] self | local_dataflow.rb:167:9:167:17 | self | +| local_dataflow.rb:165:9:165:17 | [post] self | local_dataflow.rb:169:9:169:17 | self | +| local_dataflow.rb:165:9:165:17 | self | local_dataflow.rb:167:9:167:17 | self | +| local_dataflow.rb:165:9:165:17 | self | local_dataflow.rb:169:9:169:17 | self | +| local_dataflow.rb:167:9:167:17 | [post] self | local_dataflow.rb:171:9:171:17 | self | +| local_dataflow.rb:167:9:167:17 | call to source | local_dataflow.rb:166:13:167:17 | then ... | +| local_dataflow.rb:167:9:167:17 | self | local_dataflow.rb:171:9:171:17 | self | +| local_dataflow.rb:169:9:169:17 | [post] self | local_dataflow.rb:171:9:171:17 | self | +| local_dataflow.rb:169:9:169:17 | call to source | local_dataflow.rb:168:7:169:17 | else ... | +| local_dataflow.rb:169:9:169:17 | self | local_dataflow.rb:171:9:171:17 | self | +| local_dataflow.rb:171:9:171:17 | [post] self | local_dataflow.rb:173:3:173:9 | self | +| local_dataflow.rb:171:9:171:17 | call to source | local_dataflow.rb:170:7:171:17 | ensure ... | +| local_dataflow.rb:171:9:171:17 | self | local_dataflow.rb:173:3:173:9 | self | diff --git a/ruby/ql/test/library-tests/dataflow/local/Nodes.expected b/ruby/ql/test/library-tests/dataflow/local/Nodes.expected index 2ce5b9c2f237..18ce6eca2c53 100644 --- a/ruby/ql/test/library-tests/dataflow/local/Nodes.expected +++ b/ruby/ql/test/library-tests/dataflow/local/Nodes.expected @@ -21,6 +21,7 @@ ret | local_dataflow.rb:123:32:123:43 | call to puts | | local_dataflow.rb:127:3:127:8 | call to rand | | local_dataflow.rb:132:3:149:5 | if ... | +| local_dataflow.rb:173:3:173:9 | call to sink | arg | UseUseExplosion.rb:20:13:20:17 | @prop | UseUseExplosion.rb:20:13:20:23 | ... > ... | self | | UseUseExplosion.rb:20:13:20:23 | synthetic splat argument | UseUseExplosion.rb:20:13:20:23 | ... > ... | synthetic * | @@ -1524,3 +1525,36 @@ arg | local_dataflow.rb:148:5:148:10 | self | local_dataflow.rb:148:5:148:10 | call to use | self | | local_dataflow.rb:148:5:148:10 | synthetic splat argument | local_dataflow.rb:148:5:148:10 | call to use | synthetic * | | local_dataflow.rb:148:9:148:9 | x | local_dataflow.rb:148:5:148:10 | call to use | position 0 | +| local_dataflow.rb:154:9:154:21 | self | local_dataflow.rb:154:9:154:21 | call to raise | self | +| local_dataflow.rb:154:9:154:21 | synthetic splat argument | local_dataflow.rb:154:9:154:21 | call to raise | synthetic * | +| local_dataflow.rb:154:15:154:21 | "error" | local_dataflow.rb:154:9:154:21 | call to raise | position 0 | +| local_dataflow.rb:155:9:155:17 | self | local_dataflow.rb:155:9:155:17 | call to source | self | +| local_dataflow.rb:155:9:155:17 | synthetic splat argument | local_dataflow.rb:155:9:155:17 | call to source | synthetic * | +| local_dataflow.rb:155:16:155:16 | 1 | local_dataflow.rb:155:9:155:17 | call to source | position 0 | +| local_dataflow.rb:157:9:157:17 | self | local_dataflow.rb:157:9:157:17 | call to source | self | +| local_dataflow.rb:157:9:157:17 | synthetic splat argument | local_dataflow.rb:157:9:157:17 | call to source | synthetic * | +| local_dataflow.rb:157:16:157:16 | 2 | local_dataflow.rb:157:9:157:17 | call to source | position 0 | +| local_dataflow.rb:159:9:159:17 | self | local_dataflow.rb:159:9:159:17 | call to source | self | +| local_dataflow.rb:159:9:159:17 | synthetic splat argument | local_dataflow.rb:159:9:159:17 | call to source | synthetic * | +| local_dataflow.rb:159:16:159:16 | 3 | local_dataflow.rb:159:9:159:17 | call to source | position 0 | +| local_dataflow.rb:161:3:161:9 | self | local_dataflow.rb:161:3:161:9 | call to sink | self | +| local_dataflow.rb:161:3:161:9 | synthetic splat argument | local_dataflow.rb:161:3:161:9 | call to sink | synthetic * | +| local_dataflow.rb:161:8:161:8 | x | local_dataflow.rb:161:3:161:9 | call to sink | position 0 | +| local_dataflow.rb:164:9:164:21 | self | local_dataflow.rb:164:9:164:21 | call to raise | self | +| local_dataflow.rb:164:9:164:21 | synthetic splat argument | local_dataflow.rb:164:9:164:21 | call to raise | synthetic * | +| local_dataflow.rb:164:15:164:21 | "error" | local_dataflow.rb:164:9:164:21 | call to raise | position 0 | +| local_dataflow.rb:165:9:165:17 | self | local_dataflow.rb:165:9:165:17 | call to source | self | +| local_dataflow.rb:165:9:165:17 | synthetic splat argument | local_dataflow.rb:165:9:165:17 | call to source | synthetic * | +| local_dataflow.rb:165:16:165:16 | 4 | local_dataflow.rb:165:9:165:17 | call to source | position 0 | +| local_dataflow.rb:167:9:167:17 | self | local_dataflow.rb:167:9:167:17 | call to source | self | +| local_dataflow.rb:167:9:167:17 | synthetic splat argument | local_dataflow.rb:167:9:167:17 | call to source | synthetic * | +| local_dataflow.rb:167:16:167:16 | 5 | local_dataflow.rb:167:9:167:17 | call to source | position 0 | +| local_dataflow.rb:169:9:169:17 | self | local_dataflow.rb:169:9:169:17 | call to source | self | +| local_dataflow.rb:169:9:169:17 | synthetic splat argument | local_dataflow.rb:169:9:169:17 | call to source | synthetic * | +| local_dataflow.rb:169:16:169:16 | 6 | local_dataflow.rb:169:9:169:17 | call to source | position 0 | +| local_dataflow.rb:171:9:171:17 | self | local_dataflow.rb:171:9:171:17 | call to source | self | +| local_dataflow.rb:171:9:171:17 | synthetic splat argument | local_dataflow.rb:171:9:171:17 | call to source | synthetic * | +| local_dataflow.rb:171:16:171:16 | 7 | local_dataflow.rb:171:9:171:17 | call to source | position 0 | +| local_dataflow.rb:173:3:173:9 | self | local_dataflow.rb:173:3:173:9 | call to sink | self | +| local_dataflow.rb:173:3:173:9 | synthetic splat argument | local_dataflow.rb:173:3:173:9 | call to sink | synthetic * | +| local_dataflow.rb:173:8:173:8 | y | local_dataflow.rb:173:3:173:9 | call to sink | position 0 | diff --git a/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected index 353edd203f95..028746bbcdca 100644 --- a/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected +++ b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected @@ -2951,9 +2951,9 @@ | local_dataflow.rb:1:1:7:3 | self (foo) | local_dataflow.rb:3:8:3:10 | self | | local_dataflow.rb:1:1:7:3 | self in foo | local_dataflow.rb:1:1:7:3 | self (foo) | | local_dataflow.rb:1:1:7:3 | synthetic splat parameter | local_dataflow.rb:1:9:1:9 | a | -| local_dataflow.rb:1:1:150:3 | x | local_dataflow.rb:10:9:10:9 | x | -| local_dataflow.rb:1:1:150:3 | self (local_dataflow.rb) | local_dataflow.rb:49:1:53:3 | self | -| local_dataflow.rb:1:1:150:3 | self in local_dataflow.rb | local_dataflow.rb:1:1:150:3 | self (local_dataflow.rb) | +| local_dataflow.rb:1:1:174:4 | x | local_dataflow.rb:10:9:10:9 | x | +| local_dataflow.rb:1:1:174:4 | self (local_dataflow.rb) | local_dataflow.rb:49:1:53:3 | self | +| local_dataflow.rb:1:1:174:4 | self in local_dataflow.rb | local_dataflow.rb:1:1:174:4 | self (local_dataflow.rb) | | local_dataflow.rb:1:9:1:9 | a | local_dataflow.rb:1:9:1:9 | a | | local_dataflow.rb:1:9:1:9 | a | local_dataflow.rb:2:7:2:7 | a | | local_dataflow.rb:2:3:2:3 | b | local_dataflow.rb:3:13:3:13 | b | @@ -3474,3 +3474,43 @@ | local_dataflow.rb:147:9:147:9 | [post] x | local_dataflow.rb:148:9:148:9 | x | | local_dataflow.rb:147:9:147:9 | x | local_dataflow.rb:148:9:148:9 | x | | local_dataflow.rb:148:5:148:10 | call to use | local_dataflow.rb:132:12:148:10 | then ... | +| local_dataflow.rb:152:1:174:3 | self (begin_expr) | local_dataflow.rb:154:9:154:21 | self | +| local_dataflow.rb:152:1:174:3 | self (begin_expr) | local_dataflow.rb:155:9:155:17 | self | +| local_dataflow.rb:152:1:174:3 | self in begin_expr | local_dataflow.rb:152:1:174:3 | self (begin_expr) | +| local_dataflow.rb:152:1:174:3 | synthetic splat parameter | local_dataflow.rb:152:16:152:16 | r | +| local_dataflow.rb:152:16:152:16 | r | local_dataflow.rb:152:16:152:16 | r | +| local_dataflow.rb:152:16:152:16 | r | local_dataflow.rb:154:26:154:26 | r | +| local_dataflow.rb:153:3:153:3 | x | local_dataflow.rb:161:8:161:8 | x | +| local_dataflow.rb:154:9:154:21 | [post] self | local_dataflow.rb:157:9:157:17 | self | +| local_dataflow.rb:154:9:154:21 | self | local_dataflow.rb:157:9:157:17 | self | +| local_dataflow.rb:154:26:154:26 | r | local_dataflow.rb:164:26:164:26 | r | +| local_dataflow.rb:155:9:155:17 | [post] self | local_dataflow.rb:157:9:157:17 | self | +| local_dataflow.rb:155:9:155:17 | [post] self | local_dataflow.rb:159:9:159:17 | self | +| local_dataflow.rb:155:9:155:17 | self | local_dataflow.rb:157:9:157:17 | self | +| local_dataflow.rb:155:9:155:17 | self | local_dataflow.rb:159:9:159:17 | self | +| local_dataflow.rb:157:9:157:17 | [post] self | local_dataflow.rb:159:9:159:17 | self | +| local_dataflow.rb:157:9:157:17 | call to source | local_dataflow.rb:156:13:157:17 | then ... | +| local_dataflow.rb:157:9:157:17 | self | local_dataflow.rb:159:9:159:17 | self | +| local_dataflow.rb:159:9:159:17 | [post] self | local_dataflow.rb:161:3:161:9 | self | +| local_dataflow.rb:159:9:159:17 | call to source | local_dataflow.rb:158:7:159:17 | ensure ... | +| local_dataflow.rb:159:9:159:17 | self | local_dataflow.rb:161:3:161:9 | self | +| local_dataflow.rb:161:3:161:9 | [post] self | local_dataflow.rb:164:9:164:21 | self | +| local_dataflow.rb:161:3:161:9 | [post] self | local_dataflow.rb:165:9:165:17 | self | +| local_dataflow.rb:161:3:161:9 | self | local_dataflow.rb:164:9:164:21 | self | +| local_dataflow.rb:161:3:161:9 | self | local_dataflow.rb:165:9:165:17 | self | +| local_dataflow.rb:163:3:163:3 | y | local_dataflow.rb:173:8:173:8 | y | +| local_dataflow.rb:164:9:164:21 | [post] self | local_dataflow.rb:167:9:167:17 | self | +| local_dataflow.rb:164:9:164:21 | self | local_dataflow.rb:167:9:167:17 | self | +| local_dataflow.rb:165:9:165:17 | [post] self | local_dataflow.rb:167:9:167:17 | self | +| local_dataflow.rb:165:9:165:17 | [post] self | local_dataflow.rb:169:9:169:17 | self | +| local_dataflow.rb:165:9:165:17 | self | local_dataflow.rb:167:9:167:17 | self | +| local_dataflow.rb:165:9:165:17 | self | local_dataflow.rb:169:9:169:17 | self | +| local_dataflow.rb:167:9:167:17 | [post] self | local_dataflow.rb:171:9:171:17 | self | +| local_dataflow.rb:167:9:167:17 | call to source | local_dataflow.rb:166:13:167:17 | then ... | +| local_dataflow.rb:167:9:167:17 | self | local_dataflow.rb:171:9:171:17 | self | +| local_dataflow.rb:169:9:169:17 | [post] self | local_dataflow.rb:171:9:171:17 | self | +| local_dataflow.rb:169:9:169:17 | call to source | local_dataflow.rb:168:7:169:17 | else ... | +| local_dataflow.rb:169:9:169:17 | self | local_dataflow.rb:171:9:171:17 | self | +| local_dataflow.rb:171:9:171:17 | [post] self | local_dataflow.rb:173:3:173:9 | self | +| local_dataflow.rb:171:9:171:17 | call to source | local_dataflow.rb:170:7:171:17 | ensure ... | +| local_dataflow.rb:171:9:171:17 | self | local_dataflow.rb:173:3:173:9 | self | diff --git a/ruby/ql/test/library-tests/dataflow/local/local_dataflow.rb b/ruby/ql/test/library-tests/dataflow/local/local_dataflow.rb index 6adff401655b..c58c61122d69 100644 --- a/ruby/ql/test/library-tests/dataflow/local/local_dataflow.rb +++ b/ruby/ql/test/library-tests/dataflow/local/local_dataflow.rb @@ -147,4 +147,28 @@ def use_use_madness use(x) use(x) end -end \ No newline at end of file +end + +def begin_expr r + x = begin + raise "error" if r + source(1) + rescue + source(2) + ensure + source(3) + end + sink(x) # $ MISSING: hasValueFlow=1 hasValueFlow=2 + + y = begin + raise "error" if r + source(4) + rescue + source(5) + else + source(6) + ensure + source(7) + end + sink(y) # $ MISSING: hasValueFlow=5 hasValueFlow=6 +end From 360aec3a0249d8c2260db934b14cfec6d4154220 Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 11 Aug 2026 10:59:33 +0200 Subject: [PATCH 0416/2098] unified: Add meta and diagmetric queries for static name binding --- shared/util/codeql/util/ReportStats.qll | 37 +++++++++++ .../unified/internal/AnalysisQuality.qll | 61 +++++++++++++++++++ .../ql/src/diagnostic/ExtractorInformation.ql | 24 ++++++++ .../FilesCoveredByModuleManifest.ql | 18 ++++++ .../ql/src/diagnostic/StaticNameResolution.ql | 17 ++++++ 5 files changed, 157 insertions(+) create mode 100644 unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll create mode 100644 unified/ql/src/diagnostic/ExtractorInformation.ql create mode 100644 unified/ql/src/diagnostic/FilesCoveredByModuleManifest.ql create mode 100644 unified/ql/src/diagnostic/StaticNameResolution.ql diff --git a/shared/util/codeql/util/ReportStats.qll b/shared/util/codeql/util/ReportStats.qll index 947eff548e75..10157d95c006 100644 --- a/shared/util/codeql/util/ReportStats.qll +++ b/shared/util/codeql/util/ReportStats.qll @@ -29,4 +29,41 @@ module ReportStats { value = Stats::getNumberOfOk() * 100.0 / (Stats::getNumberOfOk() + Stats::getNumberOfNotOk()) and key = "Percentage of " + Stats::getOkText() } + + predicate keyValuePair(string key, float value) { + numberOfOk(key, value) or + numberOfNotOk(key, value) or + percentageOfOk(key, value) + } +} + +/** + * Stats where each Ok/NotOk occurrence has an associated entity. + */ +signature module EntityStatsSig { + class Candidate { + predicate isOk(); + } + + string getOkText(); + + string getNotOkText(); +} + +module EntityReportStats { + private import Input + + private module StatsInput implements StatsSig { + int getNumberOfOk() { result = count(Candidate c | c.isOk()) } + + int getNumberOfNotOk() { result = count(Candidate c | not c.isOk()) } + + import Input + } + + import StatsInput + + private module ScalarReport = ReportStats; + + import ScalarReport } diff --git a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll new file mode 100644 index 000000000000..a10257ed8326 --- /dev/null +++ b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll @@ -0,0 +1,61 @@ +private import unified +private import codeql.util.ReportStats +private import codeql.unified.internal.StaticNameBinding +private import codeql.unified.internal.LocalNameBinding +private import codeql.unified.internal.NameBindingPlugin + +/** Stats about identifiers that static name binding could resolve. */ +module StaticNameResolutionStats implements EntityStatsSig { + class Candidate extends Identifier { + Candidate() { + this = getIdentifierFromRef(_) and + not this instanceof NameDeclaration + // TODO: exclude names we know are not static references, e.g. unqualified instance-field access, + // currently blocked on getting static name binding to report this information. + } + + NameBindingNode getTarget() { + ( + exists(NameDeclaration decl | + result.isIdentifier(decl) and + trackNameDeclaration(decl).isIdentifier(this) + ) + or + result.isModuleScopeNode(_) and + result.(NamespaceNode).ref().isIdentifier(this) + ) and + // Do not consider a type extension to be a valid target + // TODO: Fix in the AST mapping: type extensions should reference their type, not declare it + not exists(ClassLikeDeclaration cls | + cls.hasModifier("extension") and + result.isIdentifier(cls.getName()) + ) + } + + predicate isOk() { exists(this.getTarget()) } + } + + string getOkText() { result = "statically resolvable names" } + + string getNotOkText() { result = "statically unresolvable names" } +} + +module StaticNameResolutionStatsReport = EntityReportStats; + +/** Stats about which files are covered by a module manifest. */ +module FilesCoveredByModuleManifestStats implements EntityStatsSig { + class Candidate extends File { + Candidate() { this.getExtension() = "swift" } + + ModuleScopeRepr getAModule() { result.getAnIncludedFile() = this } + + predicate isOk() { exists(this.getAModule()) } + } + + string getOkText() { result = "files covered by a module manifest" } + + string getNotOkText() { result = "files not covered by any module manifest" } +} + +module FilesCoveredByModuleManifestStatsReport = + EntityReportStats; diff --git a/unified/ql/src/diagnostic/ExtractorInformation.ql b/unified/ql/src/diagnostic/ExtractorInformation.ql new file mode 100644 index 000000000000..37469504b617 --- /dev/null +++ b/unified/ql/src/diagnostic/ExtractorInformation.ql @@ -0,0 +1,24 @@ +/** + * @name Unified extractor/analysis information + * @description Information about the extraction and analysis for a database + * @kind metric + * @tags summary telemetry + * @id unified/telemetry/extraction-information + */ + +private import unified +private import codeql.unified.internal.AnalysisQuality + +from string key, float value +where + ( + StaticNameResolutionStatsReport::keyValuePair(key, value) or + FilesCoveredByModuleManifestStatsReport::keyValuePair(key, value) + ) and + /* Infinity */ + value != 1.0 / 0.0 and + /* -Infinity */ + value != -1.0 / 0.0 and + /* NaN */ + value != 0.0 / 0.0 +select key, value diff --git a/unified/ql/src/diagnostic/FilesCoveredByModuleManifest.ql b/unified/ql/src/diagnostic/FilesCoveredByModuleManifest.ql new file mode 100644 index 000000000000..b426b6c06786 --- /dev/null +++ b/unified/ql/src/diagnostic/FilesCoveredByModuleManifest.ql @@ -0,0 +1,18 @@ +/** + * @name Files covered by module manifest + * @description Files that are included from a module manifest + * @kind problem + * @problem.severity recommendation + * @id unified/diagnostic/files-covered-by-module-manifest + * @tags meta + * @precision very-low + */ + +import unified +import codeql.unified.internal.StaticNameBinding +import codeql.unified.internal.NameBindingPlugin +import codeql.unified.internal.AnalysisQuality + +from FilesCoveredByModuleManifestStats::Candidate c, ModuleScopeRepr mod +where c.isOk() and mod = c.getAModule() +select c, "File included in $@", mod, mod.toString() diff --git a/unified/ql/src/diagnostic/StaticNameResolution.ql b/unified/ql/src/diagnostic/StaticNameResolution.ql new file mode 100644 index 000000000000..a49ba94791b6 --- /dev/null +++ b/unified/ql/src/diagnostic/StaticNameResolution.ql @@ -0,0 +1,17 @@ +/** + * @name Static name resolution + * @description Static name references that could be resolved to a target + * @kind problem + * @problem.severity recommendation + * @id unified/diagnostic/static-name-resolution + * @tags meta + * @precision very-low + */ + +import unified +import codeql.unified.internal.StaticNameBinding +import codeql.unified.internal.AnalysisQuality + +from StaticNameResolutionStats::Candidate c, NameBindingNode target +where target = c.getTarget() +select c, "Resolved to $@", target, target.toString() From 0a2b80a15fdfdb9f28a09ec0f974c3e2f51a329c Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 12 Aug 2026 11:45:03 +0200 Subject: [PATCH 0417/2098] unified: Add folder-based fallback heuristic --- .../unified/internal/StaticNameBinding.qll | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 907cc9f14010..ca9cca2fc61a 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -16,6 +16,7 @@ private newtype TNameBindingNode = n instanceof ClassLikeDeclaration } or TModuleScope(ModuleScopeRepr repr) or + TFolderScope(Folder folder) or TModuleRoot() /** @@ -39,6 +40,9 @@ class NameBindingNode extends TNameBindingNode { /** Holds if this represents the given module scope. */ predicate isModuleScopeNode(ModuleScopeRepr repr) { this = TModuleScope(repr) } + /** Holds if this represents the set of members that can be accessed unqualified within the given folder and subfolders. */ + predicate isFolderScope(Folder folder) { this = TFolderScope(folder) } + /** Holds if this represents the root namespace in which all named modules are members. */ predicate isModuleRoot() { this = TModuleRoot() } @@ -76,6 +80,8 @@ class NameBindingNode extends TNameBindingNode { this.isModuleScopeNode(repr) and result = "ModuleScope(" + repr + ")" ) or + exists(Folder folder | this.isFolderScope(folder) and result = "FolderScope(" + folder + ")") + or this.isModuleRoot() and result = "ModuleRoot" } @@ -173,6 +179,8 @@ predicate storeStep(NameBindingNode node1, string name, NameBindingNode node2) { mod.hasImportableName(name) and node2.isModuleRoot() ) + or + FolderHeuristic::storeStep(node1, name, node2) } predicate valueStep(NameBindingNode node1, NameBindingNode node2) { @@ -224,6 +232,8 @@ predicate valueStep(NameBindingNode node1, NameBindingNode node2) { node1 = getNodeFromRef(p) and node2 = getNodeFromRef(p.getSubPattern()) ) + or + FolderHeuristic::valueStep(node1, node2) } private predicate isImportPrefix(Expr e) { @@ -403,3 +413,96 @@ module DebugGraph { ) } } + +/** + * Implements a folder-based heuristic to linking up top-level names + * between files that are not included in any module scope. + */ +private module FolderHeuristic { + private predicate topLevelNameDef(File file, string name, NameBindingNode node) { + exists(TopLevel top, Stmt stmt, NameDeclaration nameDecl | + top.getFile() = file and + stmt = top.getBody().getAStmt() and + not stmt.(ClassLikeDeclaration).hasModifier("extension") and // TODO: target of type extensions should not be seen as a NameDeclaration + not isPrivateToLocalScope(nameDecl) and + nameDecl.getDeclaration() = stmt and + name = nameDecl.getName() and + node.isIdentifier(nameDecl) + ) + } + + private predicate uniqueTopLevelName(File file, string name) { + file = unique(File f | topLevelNameDef(f, name, _)) + } + + /** + * Holds if `file` has a one of the definitions of the given ambiguous name. + * + * A name is considered "ambiguous" if there is more than one file exporting it. + */ + private predicate ambiguousTopLevelName(File file, string name) { + topLevelNameDef(file, name, _) and + not uniqueTopLevelName(file, name) + } + + /** Holds if `folder` contains one or more definitions of the given ambiguous name */ + private predicate containsDef(Folder folder, string name) { + exists(File f | + ambiguousTopLevelName(f, name) and + folder = f.getParentContainer+() + ) + } + + /** + * Holds if `folder` has two or more subfolders containing a definition of `name`. + */ + private predicate hasConflictingDefs(Folder folder, string name) { + containsDef(folder, name) and + not exists(unique(Folder child | child = folder.getAFolder() and containsDef(child, name))) + } + + /** + * Holds if `folder` is an outermost folder containing exactly one definition of `name`. + * + * This means `folder` should act as the scope of that definition. + */ + private predicate isOutermostNonConflictingScope(Folder folder, string name) { + containsDef(folder, name) and + hasConflictingDefs(folder.getParentContainer(), name) and + not hasConflictingDefs(folder, name) + } + + /** + * Gets the scope into which a definition of `name` appearing in `folder` should target. + */ + private Folder getOutermostNonConflictingScope(Folder folder, string name) { + isOutermostNonConflictingScope(folder, name) and + result = folder + or + result = getOutermostNonConflictingScope(folder.getParentContainer(), name) and + not isOutermostNonConflictingScope(folder, name) and + containsDef(folder, name) // Prune to the subfolder actually containing the definition + } + + predicate storeStep(NameBindingNode node1, string name, NameBindingNode node2) { + exists(File file | topLevelNameDef(file, name, node1) | + node2.isFolderScope(getOutermostNonConflictingScope(file.getParentContainer(), name)) + or + uniqueTopLevelName(file, name) and + node2.isFolderScope(any(Folder f | f.getRelativePath() = "")) + ) + } + + predicate valueStep(NameBindingNode node1, NameBindingNode node2) { + exists(TopLevel top | + node1.isFolderScope(top.getFile().getParentContainer()) and + node2.isLocalNamespace(top.getBody()) and + not top.getFile() = any(ModuleScopeRepr r).getAnIncludedFile() + ) + or + exists(Folder folder | + node1.isFolderScope(folder.getParentContainer()) and + node2.isFolderScope(folder) + ) + } +} From 468d392fd74b9304590f1f5e87dca2621e8b9272 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 13 Aug 2026 13:41:25 +0200 Subject: [PATCH 0418/2098] unified: Add test exercising folder-based heuristic --- .../not-a-package/Main/Drivers/Driver.swift | 4 ++++ .../static-name-binding/not-a-package/Main/Runner.swift | 5 +++++ .../static-name-binding/not-a-package/Main/Util/Util.swift | 3 +++ .../not-a-package/Mock/Drivers/Driver.swift | 4 ++++ .../static-name-binding/not-a-package/Mock/Runner.swift | 5 +++++ .../static-name-binding/not-a-package/Mock/Util/Util.swift | 3 +++ 6 files changed, 24 insertions(+) create mode 100644 unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Drivers/Driver.swift create mode 100644 unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Runner.swift create mode 100644 unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Util/Util.swift create mode 100644 unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Drivers/Driver.swift create mode 100644 unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Runner.swift create mode 100644 unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Util/Util.swift diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Drivers/Driver.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Drivers/Driver.swift new file mode 100644 index 000000000000..0b9dea4e773e --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Drivers/Driver.swift @@ -0,0 +1,4 @@ +class Driver { // name=Main.Driver +} + +class UniqueToMain {} diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Runner.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Runner.swift new file mode 100644 index 000000000000..19589ab35cba --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Runner.swift @@ -0,0 +1,5 @@ +func main() { + Driver(); // $ access=Main.Driver + UniqueToMain(); // $ access=UniqueToMain + UniqueToMock(); // $ access=UniqueToMock +} diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Util/Util.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Util/Util.swift new file mode 100644 index 000000000000..adc7a3004127 --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Util/Util.swift @@ -0,0 +1,3 @@ +func getDriver() -> Driver { // $ access=Main.Driver + return Driver() // $ access=Main.Driver +} diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Drivers/Driver.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Drivers/Driver.swift new file mode 100644 index 000000000000..e3b5d0a789cf --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Drivers/Driver.swift @@ -0,0 +1,4 @@ +class Driver { // name=Mock.Driver +} + +class UniqueToMock {} diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Runner.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Runner.swift new file mode 100644 index 000000000000..06712f12b2b7 --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Runner.swift @@ -0,0 +1,5 @@ +func main() { + Driver(); // $ access=Mock.Driver + UniqueToMain(); // $ access=UniqueToMain + UniqueToMock(); // $ access=UniqueToMock +} diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Util/Util.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Util/Util.swift new file mode 100644 index 000000000000..1d83c82c4f9d --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Util/Util.swift @@ -0,0 +1,3 @@ +func getDriver() -> Driver { // $ access=Mock.Driver + return Driver() // $ access=Mock.Driver +} From a143d2c03e20ed380851af1ef8b3d323c0499691 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 13 Aug 2026 13:42:09 +0200 Subject: [PATCH 0419/2098] unified: Record spurious result from lack of shadowing The spurious result is offered by the folder-based heuristic, but would have been blocked by proper shadowing support. --- .../library-tests/static-name-binding/unqualified-access.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/ql/test/library-tests/static-name-binding/unqualified-access.swift b/unified/ql/test/library-tests/static-name-binding/unqualified-access.swift index 732e65563b3b..86cadc0b7a1f 100644 --- a/unified/ql/test/library-tests/static-name-binding/unqualified-access.swift +++ b/unified/ql/test/library-tests/static-name-binding/unqualified-access.swift @@ -10,7 +10,7 @@ class ASub : A { // $ access=A class BSub : B { // $ access=A.B let x3: B = nil; // $ access=A.B - let x4: C = nil; // $ access=A.B.C + let x4: C = nil; // $ access=A.B.C SPURIOUS: access=Target3.C // spurious result from folder-based heuristic } class BSub2 : B { // $ access=A.B From eb9d80b49fb34fd188aa1502e8258c11142c741d Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 13 Aug 2026 13:51:40 +0200 Subject: [PATCH 0420/2098] unified: Add test with inheritance+nested classes Inheritance and access to nested classes is one of the reasons not to apply the heuristic as a "fixup" after the recursive layer, because when a base class is resolved through the folder heuristic, access to nested members still need to be resolved through the standard logic. --- .../not-a-package/Main/Drivers/Driver.swift | 1 + .../static-name-binding/not-a-package/Main/Runner.swift | 5 +++++ .../not-a-package/Mock/Drivers/Driver.swift | 1 + .../static-name-binding/not-a-package/Mock/Runner.swift | 5 +++++ 4 files changed, 12 insertions(+) diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Drivers/Driver.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Drivers/Driver.swift index 0b9dea4e773e..4b41a6324afb 100644 --- a/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Drivers/Driver.swift +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Drivers/Driver.swift @@ -1,4 +1,5 @@ class Driver { // name=Main.Driver + class Nested {} // name=Main.Driver.Nested } class UniqueToMain {} diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Runner.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Runner.swift index 19589ab35cba..894e6257dbb1 100644 --- a/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Runner.swift +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Runner.swift @@ -1,5 +1,10 @@ func main() { Driver(); // $ access=Main.Driver + Driver.Nested(); // $ access=Main.Driver access=Main.Driver.Nested UniqueToMain(); // $ access=UniqueToMain UniqueToMock(); // $ access=UniqueToMock } + +class MyDriver: Driver { // $ access=Main.Driver + class B: Nested {} // $ access=Main.Driver.Nested +} diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Drivers/Driver.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Drivers/Driver.swift index e3b5d0a789cf..75d9e81affe5 100644 --- a/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Drivers/Driver.swift +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Drivers/Driver.swift @@ -1,4 +1,5 @@ class Driver { // name=Mock.Driver + class Nested {} // name=Mock.Driver.Nested } class UniqueToMock {} diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Runner.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Runner.swift index 06712f12b2b7..930301ab9015 100644 --- a/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Runner.swift +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Runner.swift @@ -1,5 +1,10 @@ func main() { Driver(); // $ access=Mock.Driver + Driver.Nested(); // $ access=Mock.Driver access=Mock.Driver.Nested UniqueToMain(); // $ access=UniqueToMain UniqueToMock(); // $ access=UniqueToMock } + +class MyDriver: Driver { // $ access=Mock.Driver + class B: Nested {} // $ access=Mock.Driver.Nested +} From b6741aad142080ccab6849fcec24a46c7498a9e9 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 14 Aug 2026 09:54:56 +0200 Subject: [PATCH 0421/2098] unified: Add some same-folder tests --- .../not-a-package/SiblingFiles/Def1.swift | 3 +++ .../not-a-package/SiblingFiles/Def2.swift | 3 +++ .../not-a-package/SiblingFiles/SubFolder1/Def.swift | 3 +++ .../not-a-package/SiblingFiles/SubFolder2/Def.swift | 3 +++ .../not-a-package/SiblingFiles/Use.swift | 9 +++++++++ 5 files changed, 21 insertions(+) create mode 100644 unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/Def1.swift create mode 100644 unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/Def2.swift create mode 100644 unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Def.swift create mode 100644 unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder2/Def.swift create mode 100644 unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/Use.swift diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/Def1.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/Def1.swift new file mode 100644 index 000000000000..6edb39c550d7 --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/Def1.swift @@ -0,0 +1,3 @@ +class DeclaredTwiceInSameFolder {} // name=Def1.DeclaredTwiceInSameFolder + +class OnlyInDef1 {} diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/Def2.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/Def2.swift new file mode 100644 index 000000000000..f41e33bc34bb --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/Def2.swift @@ -0,0 +1,3 @@ +class DeclaredTwiceInSameFolder {} // name=Def2.DeclaredTwiceInSameFolder + +class OnlyInDef2 {} diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Def.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Def.swift new file mode 100644 index 000000000000..139c0d2ab378 --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Def.swift @@ -0,0 +1,3 @@ +class DeclaredTwiceInSubFolder {} // name=Subfolder2.DeclaredTwiceInSubFolder + +class OnlyInSubFolder2 {} diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder2/Def.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder2/Def.swift new file mode 100644 index 000000000000..07e2510e5cd1 --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder2/Def.swift @@ -0,0 +1,3 @@ +class DeclaredTwiceInSubFolder {} // name=Subfolder1.DeclaredTwiceInSubFolder + +class OnlyInSubFolder1 {} diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/Use.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/Use.swift new file mode 100644 index 000000000000..897386e9e93e --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/Use.swift @@ -0,0 +1,9 @@ +private protocol P { + let x1: DeclaredTwiceInSameFolder; // unresolved; ambiguous reference + let x2: OnlyInDef1; // $ access=OnlyInDef1 + let x3: OnlyInDef2; // $ access=OnlyInDef2 + + let x4: DeclaredTwiceInSubFolder; // unresolved; ambiguous reference + let x5: OnlyInSubFolder1; // $ access=OnlyInSubFolder1 + let x6: OnlyInSubFolder2; // $ access=OnlyInSubFolder2 +} From 17afaf22625101796d977a5fbf0f8b07a4746871 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Thu, 20 Aug 2026 14:29:31 +0200 Subject: [PATCH 0422/2098] Go: Add test that shows that constraints might not be uniquely determined --- .../semmle/go/Function/TypeParamType.expected | 7 +++++++ .../library-tests/semmle/go/Function/genericMethods.go | 9 +++++++++ .../semmle/go/Function/getParameter.expected | 3 +++ .../semmle/go/Function/getTypeParameter.expected | 2 ++ 4 files changed, 21 insertions(+) diff --git a/go/ql/test/library-tests/semmle/go/Function/TypeParamType.expected b/go/ql/test/library-tests/semmle/go/Function/TypeParamType.expected index a04289ef71b7..bf4a67b8d096 100644 --- a/go/ql/test/library-tests/semmle/go/Function/TypeParamType.expected +++ b/go/ql/test/library-tests/semmle/go/Function/TypeParamType.expected @@ -22,6 +22,8 @@ numberOfTypeParameters | genericMethods.go:5:33:5:46 | GenericMethod1 | 1 | | genericMethods.go:7:6:7:28 | StructForGenericMethod2 | 1 | | genericMethods.go:9:37:9:50 | GenericMethod2 | 2 | +| genericMethods.go:21:6:21:29 | StructWithDependentBound | 1 | +| genericMethods.go:23:38:23:68 | GenericMethodWithDependentBound | 2 | #select | codeql-go-tests/function.EdgeConstraint | 0 | | Node | interface { } | | codeql-go-tests/function.Element | 0 | | S | interface { } | @@ -51,6 +53,11 @@ numberOfTypeParameters | codeql-go-tests/function.StructForGenericMethod2 | 0 | | P2 | interface { } | | codeql-go-tests/function.StructForGenericMethod2.GenericMethod2 | 0 | | P4 | interface { } | | codeql-go-tests/function.StructForGenericMethod2.GenericMethod2 | 0 | from receiver | P3 | interface { } | +| codeql-go-tests/function.StructWithDependentBound | 0 | | P5 | interface { } | +| codeql-go-tests/function.StructWithDependentBound.GenericMethodWithDependentBound | 0 | | P7 | interface { ~[]P6 } | +| codeql-go-tests/function.StructWithDependentBound.GenericMethodWithDependentBound | 0 | | P7 | interface { ~[]int } | +| codeql-go-tests/function.StructWithDependentBound.GenericMethodWithDependentBound | 0 | | P7 | interface { ~[]string } | +| codeql-go-tests/function.StructWithDependentBound.GenericMethodWithDependentBound | 0 | from receiver | P6 | interface { } | | codeql-go-tests/function.multipleAnonymousTypeParamsFunc | 0 | | _ | interface { } | | codeql-go-tests/function.multipleAnonymousTypeParamsFunc | 1 | | _ | interface { string } | | codeql-go-tests/function.multipleAnonymousTypeParamsFunc | 2 | | _ | interface { } | diff --git a/go/ql/test/library-tests/semmle/go/Function/genericMethods.go b/go/ql/test/library-tests/semmle/go/Function/genericMethods.go index 54bd4135da2f..3d9c414fbe6b 100644 --- a/go/ql/test/library-tests/semmle/go/Function/genericMethods.go +++ b/go/ql/test/library-tests/semmle/go/Function/genericMethods.go @@ -17,3 +17,12 @@ func generic_methods(s1 StructForGenericMethod1, s2 StructForGenericMethod2[int] s1.GenericMethod1("hello") s2.GenericMethod2(42) } + +type StructWithDependentBound[P5 any] struct{} + +func (*StructWithDependentBound[P6]) GenericMethodWithDependentBound[P7 ~[]P6](x P7) {} + +func genericMethodDependentBounds(t1 StructWithDependentBound[int], t2 StructWithDependentBound[string]) { + t1.GenericMethodWithDependentBound([]int{}) + t2.GenericMethodWithDependentBound([]string{}) +} diff --git a/go/ql/test/library-tests/semmle/go/Function/getParameter.expected b/go/ql/test/library-tests/semmle/go/Function/getParameter.expected index 55fb6e4a9579..39961b50a07b 100644 --- a/go/ql/test/library-tests/semmle/go/Function/getParameter.expected +++ b/go/ql/test/library-tests/semmle/go/Function/getParameter.expected @@ -15,6 +15,9 @@ | genericMethods.go:9:37:9:50 | GenericMethod2 | 0 | genericMethods.go:9:60:9:60 | x | | genericMethods.go:11:6:11:20 | generic_methods | 0 | genericMethods.go:11:22:11:23 | s1 | | genericMethods.go:11:6:11:20 | generic_methods | 1 | genericMethods.go:11:50:11:51 | s2 | +| genericMethods.go:23:38:23:68 | GenericMethodWithDependentBound | 0 | genericMethods.go:23:80:23:80 | x | +| genericMethods.go:25:6:25:33 | genericMethodDependentBounds | 0 | genericMethods.go:25:35:25:36 | t1 | +| genericMethods.go:25:6:25:33 | genericMethodDependentBounds | 1 | genericMethods.go:25:69:25:70 | t2 | | main.go:7:6:7:7 | f1 | 0 | main.go:7:9:7:9 | x | | main.go:9:12:9:13 | f2 | 0 | main.go:9:15:9:15 | x | | main.go:9:12:9:13 | f2 | 1 | main.go:9:18:9:18 | y | diff --git a/go/ql/test/library-tests/semmle/go/Function/getTypeParameter.expected b/go/ql/test/library-tests/semmle/go/Function/getTypeParameter.expected index 9f758d14ee88..2519efae0ed2 100644 --- a/go/ql/test/library-tests/semmle/go/Function/getTypeParameter.expected +++ b/go/ql/test/library-tests/semmle/go/Function/getTypeParameter.expected @@ -22,3 +22,5 @@ | genericMethods.go:5:1:5:63 | function declaration | MethodDecl | 0 | genericMethods.go:5:48:5:53 | type parameter declaration | 0 | genericMethods.go:5:48:5:49 | P1 | genericMethods.go:5:51:5:53 | any | interface { } | | genericMethods.go:7:6:7:45 | type declaration specifier | TypeSpec | 0 | genericMethods.go:7:30:7:35 | type parameter declaration | 0 | genericMethods.go:7:30:7:31 | P2 | genericMethods.go:7:33:7:35 | any | interface { } | | genericMethods.go:9:1:9:67 | function declaration | MethodDecl | 0 | genericMethods.go:9:52:9:57 | type parameter declaration | 0 | genericMethods.go:9:52:9:53 | P4 | genericMethods.go:9:55:9:57 | any | interface { } | +| genericMethods.go:21:6:21:46 | type declaration specifier | TypeSpec | 0 | genericMethods.go:21:31:21:36 | type parameter declaration | 0 | genericMethods.go:21:31:21:32 | P5 | genericMethods.go:21:34:21:36 | any | interface { } | +| genericMethods.go:23:1:23:87 | function declaration | MethodDecl | 0 | genericMethods.go:23:70:23:77 | type parameter declaration | 0 | genericMethods.go:23:70:23:71 | P7 | genericMethods.go:23:73:23:77 | type set literal | interface { ~[]P6 } | From b52ffdc78ab2ab69dcfddec7dc5045b728ffc7b7 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 20 Aug 2026 14:35:28 +0200 Subject: [PATCH 0423/2098] unified: Satisfy ql4ql warning --- unified/ql/src/diagnostic/FilesCoveredByModuleManifest.ql | 2 +- unified/ql/src/diagnostic/StaticNameResolution.ql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/unified/ql/src/diagnostic/FilesCoveredByModuleManifest.ql b/unified/ql/src/diagnostic/FilesCoveredByModuleManifest.ql index b426b6c06786..6ac4cec641bd 100644 --- a/unified/ql/src/diagnostic/FilesCoveredByModuleManifest.ql +++ b/unified/ql/src/diagnostic/FilesCoveredByModuleManifest.ql @@ -15,4 +15,4 @@ import codeql.unified.internal.AnalysisQuality from FilesCoveredByModuleManifestStats::Candidate c, ModuleScopeRepr mod where c.isOk() and mod = c.getAModule() -select c, "File included in $@", mod, mod.toString() +select c, "File included in $@.", mod, mod.toString() diff --git a/unified/ql/src/diagnostic/StaticNameResolution.ql b/unified/ql/src/diagnostic/StaticNameResolution.ql index a49ba94791b6..501c39126e54 100644 --- a/unified/ql/src/diagnostic/StaticNameResolution.ql +++ b/unified/ql/src/diagnostic/StaticNameResolution.ql @@ -14,4 +14,4 @@ import codeql.unified.internal.AnalysisQuality from StaticNameResolutionStats::Candidate c, NameBindingNode target where target = c.getTarget() -select c, "Resolved to $@", target, target.toString() +select c, "Resolved to $@.", target, target.toString() From 420769740a8dea8acbad2ed34bc749f84d0e01a0 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 20 Aug 2026 14:44:53 +0200 Subject: [PATCH 0424/2098] unified: Fix accidentally swapped def names --- .../not-a-package/SiblingFiles/SubFolder1/Def.swift | 2 +- .../not-a-package/SiblingFiles/SubFolder2/Def.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Def.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Def.swift index 139c0d2ab378..3e5ce0ba952f 100644 --- a/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Def.swift +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Def.swift @@ -1,3 +1,3 @@ -class DeclaredTwiceInSubFolder {} // name=Subfolder2.DeclaredTwiceInSubFolder +class DeclaredTwiceInSubFolder {} // name=Subfolder1.DeclaredTwiceInSubFolder class OnlyInSubFolder2 {} diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder2/Def.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder2/Def.swift index 07e2510e5cd1..b82b472f39f6 100644 --- a/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder2/Def.swift +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder2/Def.swift @@ -1,3 +1,3 @@ -class DeclaredTwiceInSubFolder {} // name=Subfolder1.DeclaredTwiceInSubFolder +class DeclaredTwiceInSubFolder {} // name=Subfolder2.DeclaredTwiceInSubFolder class OnlyInSubFolder1 {} From 771130a57d6bb25708a7caadd9843c44b1b30340 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 20 Aug 2026 14:46:18 +0200 Subject: [PATCH 0425/2098] unified: Add a test showing FN for same-folder ref --- .../not-a-package/SiblingFiles/SubFolder1/Use.swift | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Use.swift diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Use.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Use.swift new file mode 100644 index 000000000000..cada63b4ca4e --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Use.swift @@ -0,0 +1,5 @@ +private protocol P { + let x4: DeclaredTwiceInSubFolder; // $ MISSING: access=Subfolder1.DeclaredTwiceInSubFolder + let x5: OnlyInSubFolder1; // $ access=OnlyInSubFolder1 + let x6: OnlyInSubFolder2; // $ access=OnlyInSubFolder2 +} From 42c07b37451377858666e8716b60c1ceef022f83 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 20 Aug 2026 14:47:33 +0200 Subject: [PATCH 0426/2098] Rust: Exclude 'unused variable' results for functions containing `todo!()` or `unimplemented!()` --- rust/ql/src/queries/unusedentities/UnusedVariable.qll | 9 +++++++-- rust/ql/test/query-tests/unusedentities/main.rs | 8 ++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/rust/ql/src/queries/unusedentities/UnusedVariable.qll b/rust/ql/src/queries/unusedentities/UnusedVariable.qll index 744af559dd2a..22070162d78a 100644 --- a/rust/ql/src/queries/unusedentities/UnusedVariable.qll +++ b/rust/ql/src/queries/unusedentities/UnusedVariable.qll @@ -1,4 +1,5 @@ import rust +private import codeql.rust.internal.PathResolution /** * A deliberately unused variable, for example `_` or `_x`. @@ -23,9 +24,13 @@ predicate isUnused(Variable v) { */ class IncompleteCallable extends Callable { IncompleteCallable() { - exists(MacroExpr me | - me.getEnclosingCallable() = this and + exists(MacroExpr me | me.getEnclosingCallable() = this | not me.getMacroCall().hasMacroCallExpansion() + or + exists(ItemNode i | + i.getCanonicalPath(_) = ["core::macros::unimplemented", "core::macros::todo"] and + me.getMacroCall().resolveMacro() = i + ) ) } } diff --git a/rust/ql/test/query-tests/unusedentities/main.rs b/rust/ql/test/query-tests/unusedentities/main.rs index a08a05a83bde..3f89e1d79155 100644 --- a/rust/ql/test/query-tests/unusedentities/main.rs +++ b/rust/ql/test/query-tests/unusedentities/main.rs @@ -558,6 +558,14 @@ trait MyTrait { fn my_func2(&self, x: i32) -> i32; } +fn unimplemented(x : i32) { + unimplemented!() +} + +fn todo(x : i32) { + todo!() +} + // --- main --- fn main() { From e49a71242ddc0ae689026b34bb5c64628206cc31 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 20 Aug 2026 14:51:58 +0200 Subject: [PATCH 0427/2098] unified: Fix same-folder bug --- unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll | 2 ++ .../not-a-package/SiblingFiles/SubFolder1/Use.swift | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index ca9cca2fc61a..463c7a13f818 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -458,6 +458,8 @@ private module FolderHeuristic { */ private predicate hasConflictingDefs(Folder folder, string name) { containsDef(folder, name) and + // Check for "two or more" using `exists(X) and not exists(unique(X))` + containsDef(folder.getAFolder(), name) and not exists(unique(Folder child | child = folder.getAFolder() and containsDef(child, name))) } diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Use.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Use.swift index cada63b4ca4e..ac4305b455fc 100644 --- a/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Use.swift +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Use.swift @@ -1,5 +1,5 @@ private protocol P { - let x4: DeclaredTwiceInSubFolder; // $ MISSING: access=Subfolder1.DeclaredTwiceInSubFolder + let x4: DeclaredTwiceInSubFolder; // $ access=Subfolder1.DeclaredTwiceInSubFolder let x5: OnlyInSubFolder1; // $ access=OnlyInSubFolder1 let x6: OnlyInSubFolder2; // $ access=OnlyInSubFolder2 } From 1a89fe4802bff44046d873596820e69c709f0443 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 20 Aug 2026 14:58:08 +0200 Subject: [PATCH 0428/2098] unified: fix typo --- unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 463c7a13f818..a1334ff0cd1f 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -415,7 +415,7 @@ module DebugGraph { } /** - * Implements a folder-based heuristic to linking up top-level names + * Implements a folder-based heuristic for linking up top-level names * between files that are not included in any module scope. */ private module FolderHeuristic { From b1ab236ca7f4ab71b020e6ad88b5142aef4ef81f Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Wed, 24 Jun 2026 09:39:56 +0200 Subject: [PATCH 0429/2098] Ruby: Replace control flow graph with shared implementation. --- ruby/ql/consistency-queries/CfgConsistency.ql | 31 +- .../DataFlowConsistency.ql | 11 - ruby/ql/lib/codeql/ruby/CFG.qll | 1 - ruby/ql/lib/codeql/ruby/ast/Statement.qll | 9 +- .../codeql/ruby/ast/internal/Synthesis.qll | 4 + .../codeql/ruby/controlflow/BasicBlocks.qll | 314 ---- .../lib/codeql/ruby/controlflow/CfgNodes.qll | 394 +---- .../ruby/controlflow/ControlFlowGraph.qll | 535 +++++- .../ruby/controlflow/internal/Completion.qll | 565 ------ .../internal/ControlFlowGraphImpl.qll | 1510 ----------------- .../ruby/controlflow/internal/Guards.qll | 8 +- .../controlflow/internal/NonReturning.qll | 10 +- .../ruby/controlflow/internal/Splitting.qll | 348 ---- ruby/ql/lib/codeql/ruby/dataflow/SSA.qll | 15 +- .../dataflow/internal/DataFlowDispatch.qll | 4 +- .../dataflow/internal/DataFlowPrivate.qll | 29 +- .../codeql/ruby/dataflow/internal/SsaImpl.qll | 37 +- .../ql/lib/codeql/ruby/frameworks/Sinatra.qll | 2 +- .../ConditionalBypassCustomizations.qll | 4 +- .../ql/lib/ide-contextual-queries/printCfg.ql | 7 +- .../src/experimental/performance/UseDetect.ql | 12 +- .../performance/DatabaseQueryInLoop.ql | 2 +- .../src/queries/variables/DeadStoreOfLocal.ql | 7 +- .../controlflow/graph/BasicBlocks.ql | 9 +- .../library-tests/controlflow/graph/Cfg.ql | 2 +- .../dataflow/barrier-guards/barrier-guards.ql | 3 +- 26 files changed, 668 insertions(+), 3205 deletions(-) delete mode 100644 ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll delete mode 100644 ruby/ql/lib/codeql/ruby/controlflow/internal/Completion.qll delete mode 100644 ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImpl.qll delete mode 100644 ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll diff --git a/ruby/ql/consistency-queries/CfgConsistency.ql b/ruby/ql/consistency-queries/CfgConsistency.ql index 5af4f22fc26a..d67d67a8d3fd 100644 --- a/ruby/ql/consistency-queries/CfgConsistency.ql +++ b/ruby/ql/consistency-queries/CfgConsistency.ql @@ -1,31 +1,2 @@ -import codeql.ruby.controlflow.internal.ControlFlowGraphImpl::Consistency as Consistency -import Consistency -import codeql.ruby.AST import codeql.ruby.CFG -import codeql.ruby.controlflow.internal.Completion -import codeql.ruby.controlflow.internal.ControlFlowGraphImpl as CfgImpl - -/** - * All `Expr` nodes are `PostOrderTree`s - */ -query predicate nonPostOrderExpr(Expr e, string cls) { - cls = e.getPrimaryQlClasses() and - not exists(e.getDesugared()) and - not e instanceof BodyStmt and - exists(AstNode last, Completion c | - CfgImpl::last(e, last, c) and - last != e and - c instanceof NormalCompletion - ) -} - -query predicate scopeNoFirst(CfgScope scope) { - Consistency::scopeNoFirst(scope) and - not scope = any(StmtSequence seq | not exists(seq.getAStmt())) and - not scope = - any(Callable c | - not exists(c.getAParameter()) and - not c.getBody().hasEnsure() and - not exists(c.getBody().getARescue()) - ) -} +import ControlFlow::Consistency diff --git a/ruby/ql/consistency-queries/DataFlowConsistency.ql b/ruby/ql/consistency-queries/DataFlowConsistency.ql index 4e0588d5d4a1..de63a4309b5b 100644 --- a/ruby/ql/consistency-queries/DataFlowConsistency.ql +++ b/ruby/ql/consistency-queries/DataFlowConsistency.ql @@ -22,17 +22,6 @@ private module Input implements InputSig { not isNonConstantExpr(n.asExpr()) } - predicate multipleArgumentCallExclude(ArgumentNode arg, DataFlowCall call) { - // An argument such as `x` in `if not x then ...` has two successors (and hence - // two calls); one for each Boolean outcome of `x`. - exists(CfgNodes::ExprCfgNode n | - arg.argumentOf(call, _) and - n = call.asCall() and - arg.asExpr().getASuccessor(any(ConditionalSuccessor c)).getASuccessor*() = n and - n.getASplit() instanceof Split::ConditionalCompletionSplit - ) - } - predicate uniqueTypeExclude(Node n) { n = any(DataFlow::CallNode call | diff --git a/ruby/ql/lib/codeql/ruby/CFG.qll b/ruby/ql/lib/codeql/ruby/CFG.qll index d3401821f199..5fe7da86df05 100644 --- a/ruby/ql/lib/codeql/ruby/CFG.qll +++ b/ruby/ql/lib/codeql/ruby/CFG.qll @@ -3,4 +3,3 @@ import codeql.Locations import controlflow.ControlFlowGraph import controlflow.CfgNodes as CfgNodes -import controlflow.BasicBlocks diff --git a/ruby/ql/lib/codeql/ruby/ast/Statement.qll b/ruby/ql/lib/codeql/ruby/ast/Statement.qll index dcd51dbb3272..0081fd5d593e 100644 --- a/ruby/ql/lib/codeql/ruby/ast/Statement.qll +++ b/ruby/ql/lib/codeql/ruby/ast/Statement.qll @@ -6,7 +6,6 @@ private import codeql.ruby.CFG private import internal.AST private import internal.TreeSitter private import internal.Variable -private import codeql.ruby.controlflow.internal.ControlFlowGraphImpl as CfgImpl /** * A statement. @@ -14,14 +13,14 @@ private import codeql.ruby.controlflow.internal.ControlFlowGraphImpl as CfgImpl * This is the root QL class for all statements. */ class Stmt extends AstNode, TStmt { + /** Gets the control-flow node for this statement, if any. */ + ControlFlowNode getControlFlowNode() { result.injects(this) } + /** Gets a control-flow node for this statement, if any. */ CfgNodes::AstCfgNode getAControlFlowNode() { result.getAstNode() = this } - /** Gets a control-flow entry node for this statement, if any */ - AstNode getAControlFlowEntryNode() { result = CfgImpl::getAControlFlowEntryNode(this) } - /** Gets the control-flow scope of this statement, if any. */ - CfgScope getCfgScope() { result = CfgImpl::getCfgScope(this) } + CfgScope getCfgScope() { result = getEnclosingCallable(this) } /** Gets the enclosing callable, if any. */ Callable getEnclosingCallable() { result = this.getCfgScope() } diff --git a/ruby/ql/lib/codeql/ruby/ast/internal/Synthesis.qll b/ruby/ql/lib/codeql/ruby/ast/internal/Synthesis.qll index f05deae59623..0b45d26ef12a 100644 --- a/ruby/ql/lib/codeql/ruby/ast/internal/Synthesis.qll +++ b/ruby/ql/lib/codeql/ruby/ast/internal/Synthesis.qll @@ -833,6 +833,10 @@ private module AssignOperationDesugar { ) ) } + + final override predicate excludeFromControlFlowTree(AstNode n) { + n = any(ScopeResolutionAssignOperation sao).getLeftOperand() + } } /** An assignment operation where the left-hand side is a method call. */ diff --git a/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll b/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll deleted file mode 100644 index e085dbd90a38..000000000000 --- a/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll +++ /dev/null @@ -1,314 +0,0 @@ -/** Provides classes representing basic blocks. */ -overlay[local] -module; - -private import codeql.ruby.AST -private import codeql.ruby.ast.internal.AST -private import codeql.ruby.ast.internal.TreeSitter -private import codeql.ruby.controlflow.ControlFlowGraph -private import internal.ControlFlowGraphImpl as CfgImpl -private import CfgNodes -private import CfgImpl::BasicBlocks as BasicBlocksImpl -private import codeql.controlflow.BasicBlock as BB - -/** - * A basic block, that is, a maximal straight-line sequence of control flow nodes - * without branches or joins. - */ -final class BasicBlock extends BasicBlocksImpl::BasicBlock { - /** Gets an immediate successor of this basic block, if any. */ - BasicBlock getASuccessor() { result = super.getASuccessor() } - - /** Gets an immediate successor of this basic block of a given type, if any. */ - BasicBlock getASuccessor(SuccessorType t) { result = super.getASuccessor(t) } - - /** Gets an immediate predecessor of this basic block, if any. */ - BasicBlock getAPredecessor() { result = super.getAPredecessor() } - - /** Gets an immediate predecessor of this basic block of a given type, if any. */ - BasicBlock getAPredecessor(SuccessorType t) { result = super.getAPredecessor(t) } - - // The overrides below are to use `CfgNode` instead of `CfgImpl::Node` - CfgNode getNode(int pos) { result = super.getNode(pos) } - - CfgNode getANode() { result = super.getANode() } - - /** Gets the first control flow node in this basic block. */ - CfgNode getFirstNode() { result = super.getFirstNode() } - - /** Gets the last control flow node in this basic block. */ - CfgNode getLastNode() { result = super.getLastNode() } - - /** - * Holds if this basic block immediately dominates basic block `bb`. - * - * That is, this basic block is the unique basic block satisfying: - * 1. This basic block strictly dominates `bb` - * 2. There exists no other basic block that is strictly dominated by this - * basic block and which strictly dominates `bb`. - * - * All basic blocks, except entry basic blocks, have a unique immediate - * dominator. - * - * Example: - * - * ```rb - * def m b - * if b - * return 0 - * end - * return 1 - * end - * ``` - * - * The basic block starting on line 2 immediately dominates the - * basic block on line 5 (all paths from the entry point of `m` - * to `return 1` must go through the `if` block). - */ - predicate immediatelyDominates(BasicBlock bb) { super.immediatelyDominates(bb) } - - /** - * Holds if this basic block strictly dominates basic block `bb`. - * - * That is, all paths reaching basic block `bb` from some entry point - * basic block must go through this basic block (which must be different - * from `bb`). - * - * Example: - * - * ```rb - * def m b - * if b - * return 0 - * end - * return 1 - * end - * ``` - * - * The basic block starting on line 2 strictly dominates the - * basic block on line 5 (all paths from the entry point of `m` - * to `return 1` must go through the `if` block). - */ - predicate strictlyDominates(BasicBlock bb) { super.strictlyDominates(bb) } - - /** - * Holds if this basic block dominates basic block `bb`. - * - * That is, all paths reaching basic block `bb` from some entry point - * basic block must go through this basic block. - * - * Example: - * - * ```rb - * def m b - * if b - * return 0 - * end - * return 1 - * end - * ``` - * - * The basic block starting on line 2 dominates the basic - * basic block on line 5 (all paths from the entry point of `m` - * to `return 1` must go through the `if` block). - */ - predicate dominates(BasicBlock bb) { super.dominates(bb) } - - /** - * Holds if `df` is in the dominance frontier of this basic block. - * That is, this basic block dominates a predecessor of `df`, but - * does not dominate `df` itself. - * - * Example: - * - * ```rb - * def m x - * if x < 0 - * x = -x - * if x > 10 - * x = x - 1 - * end - * end - * puts x - * end - * ``` - * - * The basic block on line 8 is in the dominance frontier - * of the basic block starting on line 3 because that block - * dominates the basic block on line 4, which is a predecessor of - * `puts x`. Also, the basic block starting on line 3 does not - * dominate the basic block on line 8. - */ - predicate inDominanceFrontier(BasicBlock df) { super.inDominanceFrontier(df) } - - /** - * Gets the basic block that immediately dominates this basic block, if any. - * - * That is, the result is the unique basic block satisfying: - * 1. The result strictly dominates this basic block. - * 2. There exists no other basic block that is strictly dominated by the - * result and which strictly dominates this basic block. - * - * All basic blocks, except entry basic blocks, have a unique immediate - * dominator. - * - * Example: - * - * ```rb - * def m b - * if b - * return 0 - * end - * return 1 - * end - * ``` - * - * The basic block starting on line 2 is an immediate dominator of - * the basic block on line 5 (all paths from the entry point of `m` - * to `return 1` must go through the `if` block, and the `if` block - * is an immediate predecessor of `return 1`). - */ - BasicBlock getImmediateDominator() { result = super.getImmediateDominator() } - - /** - * Holds if the edge with successor type `s` out of this basic block is a - * dominating edge for `dominated`. - * - * That is, all paths reaching `dominated` from the entry point basic - * block must go through the `s` edge out of this basic block. - * - * Edge dominance is similar to node dominance except it concerns edges - * instead of nodes: A basic block is dominated by a _basic block_ `bb` if it - * can only be reached through `bb` and dominated by an _edge_ `e` if it can - * only be reached through `e`. - * - * Note that where all basic blocks (except the entry basic block) are - * strictly dominated by at least one basic block, a basic block may not be - * dominated by any edge. If an edge dominates a basic block `bb`, then - * both endpoints of the edge dominates `bb`. The converse is not the case, - * as there may be multiple paths between the endpoints with none of them - * dominating. - */ - predicate edgeDominates(BasicBlock dominated, SuccessorType s) { - super.edgeDominates(dominated, s) - } - - /** - * Holds if this basic block strictly post-dominates basic block `bb`. - * - * That is, all paths reaching a normal exit point basic block from basic - * block `bb` must go through this basic block (which must be different - * from `bb`). - * - * Example: - * - * ```rb - * def m b - * if b - * puts "b" - * end - * puts "m" - * end - * ``` - * - * The basic block on line 5 strictly post-dominates the basic block on - * line 3 (all paths to the exit point of `m` from `puts "b"` must go - * through `puts "m"`). - */ - predicate strictlyPostDominates(BasicBlock bb) { super.strictlyPostDominates(bb) } - - /** - * Holds if this basic block post-dominates basic block `bb`. - * - * That is, all paths reaching a normal exit point basic block from basic - * block `bb` must go through this basic block. - * - * Example: - * - * ```rb - * def m b - * if b - * puts "b" - * end - * puts "m" - * end - * ``` - * - * The basic block on line 5 post-dominates the basic block on line 3 - * (all paths to the exit point of `m` from `puts "b"` must go through - * `puts "m"`). - */ - predicate postDominates(BasicBlock bb) { super.postDominates(bb) } -} - -/** - * An entry basic block, that is, a basic block whose first node is - * an entry node. - */ -final class EntryBasicBlock extends BasicBlock, BasicBlocksImpl::EntryBasicBlock { } - -/** - * An annotated exit basic block, that is, a basic block that contains an - * annotated exit node. - */ -final class AnnotatedExitBasicBlock extends BasicBlock, BasicBlocksImpl::AnnotatedExitBasicBlock { } - -/** - * An exit basic block, that is, a basic block whose last node is - * an exit node. - */ -final class ExitBasicBlock extends BasicBlock, BasicBlocksImpl::ExitBasicBlock { } - -/** A basic block with more than one predecessor. */ -final class JoinBlock extends BasicBlock, BasicBlocksImpl::JoinBasicBlock { - JoinBlockPredecessor getJoinBlockPredecessor(int i) { result = super.getJoinBlockPredecessor(i) } -} - -/** A basic block that is an immediate predecessor of a join block. */ -final class JoinBlockPredecessor extends BasicBlock, BasicBlocksImpl::JoinPredecessorBasicBlock { } - -/** - * A basic block that terminates in a condition, splitting the subsequent - * control flow. - */ -final class ConditionBlock extends BasicBlock, BasicBlocksImpl::ConditionBasicBlock { - /** - * DEPRECATED: Use `edgeDominates` instead. - * - * Holds if basic block `succ` is immediately controlled by this basic - * block with conditional value `s`. That is, `succ` is an immediate - * successor of this block, and `succ` can only be reached from - * the callable entry point by going via the `s` edge out of this basic block. - */ - deprecated predicate immediatelyControls(BasicBlock succ, ConditionalSuccessor s) { - this.getASuccessor(s) = succ and - BasicBlocksImpl::dominatingEdge(this, succ) - } - - /** - * DEPRECATED: Use `edgeDominates` instead. - * - * Holds if basic block `controlled` is controlled by this basic block with - * conditional value `s`. That is, `controlled` can only be reached from the - * callable entry point by going via the `s` edge out of this basic block. - */ - deprecated predicate controls(BasicBlock controlled, ConditionalSuccessor s) { - super.edgeDominates(controlled, s) - } -} - -private class BasicBlockAlias = BasicBlock; - -private class EntryBasicBlockAlias = EntryBasicBlock; - -module Cfg implements BB::CfgSig { - class ControlFlowNode = CfgNode; - - class BasicBlock = BasicBlockAlias; - - class EntryBasicBlock = EntryBasicBlockAlias; - - predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) { - BasicBlocksImpl::dominatingEdge(bb1, bb2) - } -} diff --git a/ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll b/ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll index 0da31370ff01..72806211f3f7 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll @@ -3,30 +3,9 @@ overlay[local] module; private import codeql.ruby.AST -private import codeql.ruby.controlflow.BasicBlocks private import codeql.ruby.dataflow.SSA private import codeql.ruby.ast.internal.Constant private import ControlFlowGraph -private import internal.ControlFlowGraphImpl as CfgImpl - -/** An entry node for a given scope. */ -class EntryNode extends CfgNode, CfgImpl::EntryNode { - override string getAPrimaryQlClass() { result = "EntryNode" } - - final override EntryBasicBlock getBasicBlock() { result = super.getBasicBlock() } -} - -/** An exit node for a given scope, annotated with the type of exit. */ -class AnnotatedExitNode extends CfgNode, CfgImpl::AnnotatedExitNode { - override string getAPrimaryQlClass() { result = "AnnotatedExitNode" } - - final override AnnotatedExitBasicBlock getBasicBlock() { result = super.getBasicBlock() } -} - -/** An exit node for a given scope. */ -class ExitNode extends CfgNode, CfgImpl::ExitNode { - override string getAPrimaryQlClass() { result = "ExitNode" } -} /** * A node for an AST node. @@ -35,7 +14,11 @@ class ExitNode extends CfgNode, CfgImpl::ExitNode { * (dead) code or not important for control flow, and multiple when there are different * splits for the AST node. */ -class AstCfgNode extends CfgNode, CfgImpl::AstCfgNode { +class AstCfgNode extends CfgNode { + AstCfgNode() { this.injects(_) } + + AstNode getAstNode() { this.injects(result) } + /** Gets the name of the primary QL class for this node. */ overlay[global] override string getAPrimaryQlClass() { result = "AstCfgNode" } @@ -67,10 +50,7 @@ class ReturningCfgNode extends AstCfgNode { ReturningCfgNode() { s = this.getAstNode() } /** Gets the node of the returned value, if any. */ - ExprCfgNode getReturnedValueNode() { - result = this.getAPredecessor() and - result.getAstNode() = s.getValue() - } + ExprCfgNode getReturnedValueNode() { result.getAstNode() = s.getValue() } } /** A control-flow node that wraps a `StringComponent` AST expression. */ @@ -100,108 +80,31 @@ private AstNode desugar(AstNode n) { result = n } -/** - * A class for mapping parent-child AST nodes to parent-child CFG nodes. - */ -abstract private class ChildMapping extends AstNode { - /** - * Holds if `child` is a (possibly nested) child of this expression - * for which we would like to find a matching CFG child. - */ - abstract predicate relevantChild(AstNode child); - - pragma[nomagic] - abstract predicate reachesBasicBlock(AstNode child, CfgNode cfn, BasicBlock bb); - - /** - * Holds if there is a control-flow path from `cfn` to `cfnChild`, where `cfn` - * is a control-flow node for this expression, and `cfnChild` is a control-flow - * node for `child`. - * - * The path never escapes the syntactic scope of this expression. - */ - cached - predicate hasCfgChild(AstNode child, CfgNode cfn, CfgNode cfnChild) { - this.reachesBasicBlock(child, cfn, cfnChild.getBasicBlock()) and - cfnChild.getAstNode() = desugar(child) - } -} - -/** - * A class for mapping parent-child AST nodes to parent-child CFG nodes. - */ -abstract private class ExprChildMapping extends Expr, ChildMapping { - pragma[nomagic] - override predicate reachesBasicBlock(AstNode child, CfgNode cfn, BasicBlock bb) { - this.relevantChild(child) and - cfn = this.getAControlFlowNode() and - bb.getANode() = cfn - or - exists(BasicBlock mid | - this.reachesBasicBlock(child, cfn, mid) and - bb = mid.getAPredecessor() and - not mid.getANode().getAstNode() = child - ) - } -} - -/** - * A class for mapping parent-child AST nodes to parent-child CFG nodes. - */ -abstract private class NonExprChildMapping extends ChildMapping { - NonExprChildMapping() { not this instanceof Expr } - - pragma[nomagic] - override predicate reachesBasicBlock(AstNode child, CfgNode cfn, BasicBlock bb) { - this.relevantChild(child) and - cfn.getAstNode() = this and - bb.getANode() = cfn - or - exists(BasicBlock mid | - this.reachesBasicBlock(child, cfn, mid) and - bb = mid.getASuccessor() and - not mid.getANode().getAstNode() = child - ) - } -} - /** Provides classes for control-flow nodes that wrap AST expressions. */ module ExprNodes { - private class LiteralChildMapping extends ExprChildMapping, Literal { - override predicate relevantChild(AstNode n) { none() } - } - /** A control-flow node that wraps a `Literal` AST expression. */ class LiteralCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "LiteralCfgNode" } - override LiteralChildMapping e; + override Literal e; override Literal getExpr() { result = super.getExpr() } } - private class ControlExprChildMapping extends ExprChildMapping, ControlExpr { - override predicate relevantChild(AstNode n) { none() } - } - /** A control-flow node that wraps a `ControlExpr` AST expression. */ class ControlExprCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "ControlExprCfgNode" } - override ControlExprChildMapping e; + override ControlExpr e; override ControlExpr getExpr() { result = super.getExpr() } } - private class LhsExprChildMapping extends ExprChildMapping, LhsExpr { - override predicate relevantChild(AstNode n) { none() } - } - /** A control-flow node that wraps a `LhsExpr` AST expression. */ class LhsExprCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "LhsExprCfgNode" } - override LhsExprChildMapping e; + override LhsExpr e; override LhsExpr getExpr() { result = super.getExpr() } @@ -209,34 +112,26 @@ module ExprNodes { Variable getVariable() { result = e.(VariableAccess).getVariable() } } - private class AssignExprChildMapping extends ExprChildMapping, AssignExpr { - override predicate relevantChild(AstNode n) { n = this.getAnOperand() } - } - /** A control-flow node that wraps an `AssignExpr` AST expression. */ class AssignExprCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "AssignExprCfgNode" } - override AssignExprChildMapping e; + override AssignExpr e; final override AssignExpr getExpr() { result = super.getExpr() } /** Gets the LHS of this assignment. */ - final LhsExprCfgNode getLhs() { e.hasCfgChild(e.getLeftOperand(), this, result) } + final LhsExprCfgNode getLhs() { result.injects(desugar(e.getLeftOperand())) } /** Gets the RHS of this assignment. */ - final ExprCfgNode getRhs() { e.hasCfgChild(e.getRightOperand(), this, result) } - } - - private class OperationExprChildMapping extends ExprChildMapping, Operation { - override predicate relevantChild(AstNode n) { n = this.getAnOperand() } + final ExprCfgNode getRhs() { result.injects(desugar(e.getRightOperand())) } } /** A control-flow node that wraps an `Operation` AST expression. */ class OperationCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "OperationCfgNode" } - override OperationExprChildMapping e; + override Operation e; override Operation getExpr() { result = super.getExpr() } @@ -244,7 +139,7 @@ module ExprNodes { string getOperator() { result = this.getExpr().getOperator() } /** Gets an operand of this operation. */ - final ExprCfgNode getAnOperand() { e.hasCfgChild(e.getAnOperand(), this, result) } + final ExprCfgNode getAnOperand() { result.injects(desugar(e.getAnOperand())) } } /** A control-flow node that wraps a `UnaryOperation` AST expression. */ @@ -258,7 +153,7 @@ module ExprNodes { override UnaryOperation getExpr() { result = super.getExpr() } /** Gets the operand of this unary operation. */ - final ExprCfgNode getOperand() { e.hasCfgChild(uo.getOperand(), this, result) } + final ExprCfgNode getOperand() { result.injects(desugar(uo.getOperand())) } } /** A control-flow node that wraps a `BinaryOperation` AST expression. */ @@ -272,32 +167,22 @@ module ExprNodes { override BinaryOperation getExpr() { result = super.getExpr() } /** Gets the left operand of this binary operation. */ - final ExprCfgNode getLeftOperand() { e.hasCfgChild(bo.getLeftOperand(), this, result) } + final ExprCfgNode getLeftOperand() { result.injects(desugar(bo.getLeftOperand())) } /** Gets the right operand of this binary operation. */ - final ExprCfgNode getRightOperand() { e.hasCfgChild(bo.getRightOperand(), this, result) } - } - - private class BlockArgumentChildMapping extends ExprChildMapping, BlockArgument { - override predicate relevantChild(AstNode n) { n = this.getValue() } + final ExprCfgNode getRightOperand() { result.injects(desugar(bo.getRightOperand())) } } /** A control-flow node that wraps a `BlockArgument` AST expression. */ class BlockArgumentCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "BlockArgumentCfgNode" } - override BlockArgumentChildMapping e; + override BlockArgument e; final override BlockArgument getExpr() { result = super.getExpr() } /** Gets the value of this block argument. */ - final ExprCfgNode getValue() { e.hasCfgChild(e.getValue(), this, result) } - } - - private class CallExprChildMapping extends ExprChildMapping, Call { - override predicate relevantChild(AstNode n) { - n = [this.getAnArgument(), this.(MethodCall).getReceiver(), this.(MethodCall).getBlock()] - } + final ExprCfgNode getValue() { result.injects(desugar(e.getValue())) } } /** A control-flow node that wraps a `Call` AST expression. */ @@ -305,12 +190,12 @@ module ExprNodes { overlay[global] override string getAPrimaryQlClass() { result = "CallCfgNode" } - override CallExprChildMapping e; + override Call e; override Call getExpr() { result = super.getExpr() } /** Gets the `n`th argument of this call. */ - final ExprCfgNode getArgument(int n) { e.hasCfgChild(e.getArgument(n), this, result) } + final ExprCfgNode getArgument(int n) { result.injects(desugar(e.getArgument(n))) } /** Gets an argument of this call. */ final ExprCfgNode getAnArgument() { result = this.getArgument(_) } @@ -319,7 +204,7 @@ module ExprNodes { overlay[global] final ExprCfgNode getKeywordArgument(string keyword) { exists(PairCfgNode n | - e.hasCfgChild(e.getAnArgument(), this, n) and + n.injects(desugar(e.getAnArgument())) and n.getKey().getExpr().getConstantValue().isSymbol(keyword) and result = n.getValue() ) @@ -337,10 +222,10 @@ module ExprNodes { final int getNumberOfArguments() { result = e.getNumberOfArguments() } /** Gets the receiver of this call. */ - final ExprCfgNode getReceiver() { e.hasCfgChild(e.(MethodCall).getReceiver(), this, result) } + final ExprCfgNode getReceiver() { result.injects(desugar(e.(MethodCall).getReceiver())) } /** Gets the block of this call. */ - final ExprCfgNode getBlock() { e.hasCfgChild(e.(MethodCall).getBlock(), this, result) } + final ExprCfgNode getBlock() { result.injects(desugar(e.(MethodCall).getBlock())) } } /** A control-flow node that wraps a `MethodCall` AST expression. */ @@ -356,104 +241,54 @@ module ExprNodes { string getMethodName() { result = this.getExpr().getMethodName() } } - private class CaseExprChildMapping extends ExprChildMapping, CaseExpr { - override predicate relevantChild(AstNode e) { e = this.getValue() or e = this.getABranch() } - } - /** A control-flow node that wraps a `CaseExpr` AST expression. */ class CaseExprCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "CaseExprCfgNode" } - override CaseExprChildMapping e; + override CaseExpr e; final override CaseExpr getExpr() { result = super.getExpr() } /** Gets the expression being compared, if any. */ - final ExprCfgNode getValue() { e.hasCfgChild(e.getValue(), this, result) } + final ExprCfgNode getValue() { result.injects(desugar(e.getValue())) } /** * Gets the `n`th branch of this case expression, either a `when` clause, an `in` clause, or an `else` branch. */ - final AstCfgNode getBranch(int n) { e.hasCfgChild(e.getBranch(n), this, result) } - } - - private class InClauseChildMapping extends NonExprChildMapping, InClause { - override predicate relevantChild(AstNode e) { - e = this.getPattern() or - e = this.getCondition() or - e = this.getBody() - } + final AstCfgNode getBranch(int n) { result.injects(desugar(e.getBranch(n))) } } /** A control-flow node that wraps an `InClause` AST expression. */ class InClauseCfgNode extends AstCfgNode { - private InClauseChildMapping e; + private InClause e; InClauseCfgNode() { e = this.getAstNode() } override string getAPrimaryQlClass() { result = "InClauseCfgNode" } /** Gets the pattern in this `in`-clause. */ - final AstCfgNode getPattern() { e.hasCfgChild(e.getPattern(), this, result) } + final AstCfgNode getPattern() { result.injects(desugar(e.getPattern())) } /** Gets the pattern guard condition in this `in` clause, if any. */ - final ExprCfgNode getCondition() { e.hasCfgChild(e.getCondition(), this, result) } + final ExprCfgNode getCondition() { result.injects(desugar(e.getCondition())) } /** Gets the body of this `in`-clause. */ - final ExprCfgNode getBody() { e.hasCfgChild(e.getBody(), this, result) } - } - - // `when` clauses need special treatment, since they are neither pre-order - // nor post-order - private class WhenClauseChildMapping extends WhenClause { - predicate patternReachesBasicBlock(int i, CfgNode cfnPattern, BasicBlock bb) { - exists(Expr pattern | - pattern = this.getPattern(i) and - cfnPattern.getAstNode() = pattern and - bb.getANode() = cfnPattern - ) - or - exists(BasicBlock mid | - this.patternReachesBasicBlock(i, cfnPattern, mid) and - bb = mid.getASuccessor() and - not mid.getANode().getAstNode() = this - ) - } - - predicate bodyReachesBasicBlock(CfgNode cfnBody, BasicBlock bb) { - exists(Stmt body | - body = this.getBody() and - cfnBody.getAstNode() = body and - bb.getANode() = cfnBody - ) - or - exists(BasicBlock mid | - this.bodyReachesBasicBlock(cfnBody, mid) and - bb = mid.getAPredecessor() and - not mid.getANode().getAstNode() = this - ) - } + final ExprCfgNode getBody() { result.injects(desugar(e.getBody())) } } /** A control-flow node that wraps a `WhenClause` AST expression. */ class WhenClauseCfgNode extends AstCfgNode { - private WhenClauseChildMapping e; + private WhenClause e; WhenClauseCfgNode() { e = this.getAstNode() } override string getAPrimaryQlClass() { result = "WhenClauseCfgNode" } /** Gets the body of this `when`-clause. */ - final ExprCfgNode getBody() { - result.getAstNode() = desugar(e.getBody()) and - e.bodyReachesBasicBlock(result, this.getBasicBlock()) - } + final ExprCfgNode getBody() { result.getAstNode() = desugar(e.getBody()) } /** Gets the `i`th pattern this `when`-clause. */ - final ExprCfgNode getPattern(int i) { - result.getAstNode() = desugar(e.getPattern(i)) and - e.patternReachesBasicBlock(i, result, this.getBasicBlock()) - } + final ExprCfgNode getPattern(int i) { result.getAstNode() = desugar(e.getPattern(i)) } } /** A control-flow node that wraps a `CasePattern`. */ @@ -465,41 +300,25 @@ module ExprNodes { override string getAPrimaryQlClass() { result = "CasePatternCfgNode" } } - private class ArrayPatternChildMapping extends NonExprChildMapping, ArrayPattern { - override predicate relevantChild(AstNode e) { - e = this.getPrefixElement(_) or - e = this.getSuffixElement(_) or - e = this.getRestVariableAccess() - } - } - /** A control-flow node that wraps an `ArrayPattern` node. */ class ArrayPatternCfgNode extends CasePatternCfgNode { override string getAPrimaryQlClass() { result = "ArrayPatternCfgNode" } - override ArrayPatternChildMapping e; + override ArrayPattern e; /** Gets the `n`th element of this list pattern's prefix. */ final CasePatternCfgNode getPrefixElement(int n) { - e.hasCfgChild(e.getPrefixElement(n), this, result) + result.injects(desugar(e.getPrefixElement(n))) } /** Gets the `n`th element of this list pattern's suffix. */ final CasePatternCfgNode getSuffixElement(int n) { - e.hasCfgChild(e.getSuffixElement(n), this, result) + result.injects(desugar(e.getSuffixElement(n))) } /** Gets the variable of the rest token, if any. */ final VariableWriteAccessCfgNode getRestVariableAccess() { - e.hasCfgChild(e.getRestVariableAccess(), this, result) - } - } - - private class FindPatternChildMapping extends NonExprChildMapping, FindPattern { - override predicate relevantChild(AstNode e) { - e = this.getElement(_) or - e = this.getPrefixVariableAccess() or - e = this.getSuffixVariableAccess() + result.injects(desugar(e.getRestVariableAccess())) } } @@ -507,26 +326,19 @@ module ExprNodes { class FindPatternCfgNode extends CasePatternCfgNode { override string getAPrimaryQlClass() { result = "FindPatternCfgNode" } - override FindPatternChildMapping e; + override FindPattern e; /** Gets the `n`th element of this find pattern. */ - final CasePatternCfgNode getElement(int n) { e.hasCfgChild(e.getElement(n), this, result) } + final CasePatternCfgNode getElement(int n) { result.injects(desugar(e.getElement(n))) } /** Gets the variable for the prefix of this find pattern, if any. */ final VariableWriteAccessCfgNode getPrefixVariableAccess() { - e.hasCfgChild(e.getPrefixVariableAccess(), this, result) + result.injects(desugar(e.getPrefixVariableAccess())) } /** Gets the variable for the suffix of this find pattern, if any. */ final VariableWriteAccessCfgNode getSuffixVariableAccess() { - e.hasCfgChild(e.getSuffixVariableAccess(), this, result) - } - } - - private class HashPatternChildMapping extends NonExprChildMapping, HashPattern { - override predicate relevantChild(AstNode e) { - e = this.getValue(_) or - e = this.getRestVariableAccess() + result.injects(desugar(e.getSuffixVariableAccess())) } } @@ -534,136 +346,104 @@ module ExprNodes { class HashPatternCfgNode extends CasePatternCfgNode { override string getAPrimaryQlClass() { result = "HashPatternCfgNode" } - override HashPatternChildMapping e; + override HashPattern e; /** Gets the value of the `n`th pair. */ - final CasePatternCfgNode getValue(int n) { e.hasCfgChild(e.getValue(n), this, result) } + final CasePatternCfgNode getValue(int n) { result.injects(desugar(e.getValue(n))) } /** Gets the variable of the keyword rest token, if any. */ final VariableWriteAccessCfgNode getRestVariableAccess() { - e.hasCfgChild(e.getRestVariableAccess(), this, result) + result.injects(desugar(e.getRestVariableAccess())) } } - private class AlternativePatternChildMapping extends NonExprChildMapping, AlternativePattern { - override predicate relevantChild(AstNode e) { e = this.getAnAlternative() } - } - /** A control-flow node that wraps an `AlternativePattern` node. */ class AlternativePatternCfgNode extends CasePatternCfgNode { override string getAPrimaryQlClass() { result = "AlternativePatternCfgNode" } - override AlternativePatternChildMapping e; + override AlternativePattern e; /** Gets the `n`th alternative. */ - final CasePatternCfgNode getAlternative(int n) { - e.hasCfgChild(e.getAlternative(n), this, result) - } - } - - private class AsPatternChildMapping extends NonExprChildMapping, AsPattern { - override predicate relevantChild(AstNode e) { - e = this.getPattern() or e = this.getVariableAccess() - } + final CasePatternCfgNode getAlternative(int n) { result.injects(desugar(e.getAlternative(n))) } } /** A control-flow node that wraps an `AsPattern` node. */ class AsPatternCfgNode extends CasePatternCfgNode { override string getAPrimaryQlClass() { result = "AsPatternCfgNode" } - override AsPatternChildMapping e; + override AsPattern e; /** Gets the underlying pattern. */ - final CasePatternCfgNode getPattern() { e.hasCfgChild(e.getPattern(), this, result) } + final CasePatternCfgNode getPattern() { result.injects(desugar(e.getPattern())) } /** Gets the variable access for this pattern. */ final VariableWriteAccessCfgNode getVariableAccess() { - e.hasCfgChild(e.getVariableAccess(), this, result) + result.injects(desugar(e.getVariableAccess())) } } - private class ParenthesizedPatternChildMapping extends NonExprChildMapping, ParenthesizedPattern { - override predicate relevantChild(AstNode e) { e = this.getPattern() } - } - /** A control-flow node that wraps a `ParenthesizedPattern` node. */ class ParenthesizedPatternCfgNode extends CasePatternCfgNode { override string getAPrimaryQlClass() { result = "ParenthesizedPatternCfgNode" } - override ParenthesizedPatternChildMapping e; + override ParenthesizedPattern e; /** Gets the underlying pattern. */ - final CasePatternCfgNode getPattern() { e.hasCfgChild(e.getPattern(), this, result) } - } - - private class ConditionalExprChildMapping extends ExprChildMapping, ConditionalExpr { - override predicate relevantChild(AstNode n) { n = [this.getCondition(), this.getBranch(_)] } + final CasePatternCfgNode getPattern() { result.injects(desugar(e.getPattern())) } } /** A control-flow node that wraps a `ConditionalExpr` AST expression. */ class ConditionalExprCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "ConditionalExprCfgNode" } - override ConditionalExprChildMapping e; + override ConditionalExpr e; final override ConditionalExpr getExpr() { result = super.getExpr() } /** Gets the condition expression. */ - final ExprCfgNode getCondition() { e.hasCfgChild(e.getCondition(), this, result) } + final ExprCfgNode getCondition() { result.injects(desugar(e.getCondition())) } /** * Gets the branch of this conditional expression that is taken when the condition * evaluates to cond, if any. */ - final ExprCfgNode getBranch(boolean cond) { e.hasCfgChild(e.getBranch(cond), this, result) } - } - - private class ConstantAccessChildMapping extends ExprChildMapping, ConstantAccess { - override predicate relevantChild(AstNode n) { n = this.getScopeExpr() } + final ExprCfgNode getBranch(boolean cond) { result.injects(desugar(e.getBranch(cond))) } } - /** A control-flow node that wraps a `ConditionalExpr` AST expression. */ + /** A control-flow node that wraps a `ConstantAccess` AST expression. */ class ConstantAccessCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "ConstantAccessCfgNode" } - override ConstantAccessChildMapping e; + override ConstantAccess e; final override ConstantAccess getExpr() { result = super.getExpr() } /** Gets the scope expression. */ - final ExprCfgNode getScopeExpr() { e.hasCfgChild(e.getScopeExpr(), this, result) } - } - - private class StmtSequenceChildMapping extends ExprChildMapping, StmtSequence { - override predicate relevantChild(AstNode n) { n = this.getLastStmt() } + final ExprCfgNode getScopeExpr() { result.injects(desugar(e.getScopeExpr())) } } /** A control-flow node that wraps a `StmtSequence` AST expression. */ class StmtSequenceCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "StmtSequenceCfgNode" } - override StmtSequenceChildMapping e; + override StmtSequence e; final override StmtSequence getExpr() { result = super.getExpr() } /** Gets the last statement in this sequence, if any. */ - final ExprCfgNode getLastStmt() { e.hasCfgChild(e.getLastStmt(), this, result) } - } - - private class ForExprChildMapping extends ExprChildMapping, ForExpr { - override predicate relevantChild(AstNode n) { n = this.getValue() } + final ExprCfgNode getLastStmt() { result.injects(desugar(e.getLastStmt())) } } /** A control-flow node that wraps a `ForExpr` AST expression. */ class ForExprCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "ForExprCfgNode" } - override ForExprChildMapping e; + override ForExpr e; final override ForExpr getExpr() { result = super.getExpr() } /** Gets the value being iterated over. */ - final ExprCfgNode getValue() { e.hasCfgChild(e.getValue(), this, result) } + final ExprCfgNode getValue() { result.injects(desugar(e.getValue())) } } /** A control-flow node that wraps a `ParenthesizedExpr` AST expression. */ @@ -673,27 +453,23 @@ module ExprNodes { ParenthesizedExprCfgNode() { this.getExpr() instanceof ParenthesizedExpr } } - private class PairChildMapping extends ExprChildMapping, Pair { - override predicate relevantChild(AstNode n) { n = [this.getKey(), this.getValue()] } - } - /** A control-flow node that wraps a `Pair` AST expression. */ class PairCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "PairCfgNode" } - override PairChildMapping e; + override Pair e; final override Pair getExpr() { result = super.getExpr() } /** * Gets the key expression of this pair. */ - final ExprCfgNode getKey() { e.hasCfgChild(e.getKey(), this, result) } + final ExprCfgNode getKey() { result.injects(desugar(e.getKey())) } /** * Gets the value expression of this pair. */ - final ExprCfgNode getValue() { e.hasCfgChild(e.getValue(), this, result) } + final ExprCfgNode getValue() { result.injects(desugar(e.getValue())) } } /** A control-flow node that wraps a `VariableAccess` AST expression. */ @@ -728,41 +504,29 @@ module ExprNodes { final override LocalVariable getVariable() { result = super.getVariable() } } - private class InstanceVariableAccessMapping extends ExprChildMapping, InstanceVariableAccess { - override predicate relevantChild(AstNode n) { n = this.getReceiver() } - } - /** A control-flow node that wraps an `InstanceVariableAccess` AST expression. */ class InstanceVariableAccessCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "InstanceVariableAccessCfgNode" } - override InstanceVariableAccessMapping e; + override InstanceVariableAccess e; override InstanceVariableAccess getExpr() { result = super.getExpr() } /** * Gets the synthetic receiver (`self`) of this instance variable access. */ - final CfgNode getReceiver() { e.hasCfgChild(e.getReceiver(), this, result) } - } - - private class SelfVariableAccessMapping extends ExprChildMapping, SelfVariableAccess { - override predicate relevantChild(AstNode n) { none() } + final CfgNode getReceiver() { result.injects(desugar(e.getReceiver())) } } /** A control-flow node that wraps a `SelfVariableAccess` AST expression. */ class SelfVariableAccessCfgNode extends VariableAccessCfgNode { final override string getAPrimaryQlClass() { result = "SelfVariableAccessCfgNode" } - override SelfVariableAccessMapping e; + override SelfVariableAccess e; override SelfVariableAccess getExpr() { result = super.getExpr() } } - private class VariableWriteAccessChildMapping extends ExprChildMapping, VariableWriteAccess { - override predicate relevantChild(AstNode n) { this.isExplicitWrite(n) } - } - /** A control-flow node that wraps a `VariableWriteAccess` AST expression. */ class VariableWriteAccessCfgNode extends VariableAccessCfgNode { /** @@ -784,20 +548,16 @@ module ExprNodes { override string getAPrimaryQlClass() { result = "VariableWriteAccessCfgNode" } - override VariableWriteAccessChildMapping e; + override VariableWriteAccess e; override VariableWriteAccess getExpr() { result = super.getExpr() } } - private class LocalVariableWriteAccessChildMapping extends VariableWriteAccessChildMapping, - LocalVariableWriteAccess - { } - /** A control-flow node that wraps a `LocalVariableWriteAccess` AST expression. */ class LocalVariableWriteAccessCfgNode extends VariableWriteAccessCfgNode { override string getAPrimaryQlClass() { result = "LocalVariableWriteAccessCfgNode" } - override LocalVariableWriteAccessChildMapping e; + override LocalVariableWriteAccess e; final override LocalVariableWriteAccess getExpr() { result = super.getExpr() } @@ -870,20 +630,16 @@ module ExprNodes { } } - private class StringlikeLiteralChildMapping extends ExprChildMapping, StringlikeLiteral { - override predicate relevantChild(AstNode n) { n = this.getComponent(_) } - } - /** A control-flow node that wraps a `StringlikeLiteral` AST expression. */ class StringlikeLiteralCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "StringlikeLiteralCfgNode" } - override StringlikeLiteralChildMapping e; + override StringlikeLiteral e; override StringlikeLiteral getExpr() { result = super.getExpr() } /** Gets the `n`th component of this `StringlikeLiteral` */ - StringComponentCfgNode getComponent(int n) { e.hasCfgChild(e.getComponent(n), this, result) } + StringComponentCfgNode getComponent(int n) { result.injects(desugar(e.getComponent(n))) } /** Gets a component of this `StringlikeLiteral` */ StringComponentCfgNode getAComponent() { result = this.getComponent(_) } @@ -929,15 +685,11 @@ module ExprNodes { final override RelationalOperation getExpr() { result = super.getExpr() } } - private class SplatExprChildMapping extends OperationExprChildMapping, SplatExpr { - override predicate relevantChild(AstNode n) { n = this.getOperand() } - } - /** A control-flow node that wraps a `SplatExpr` AST expression. */ class SplatExprCfgNode extends UnaryOperationCfgNode { override string getAPrimaryQlClass() { result = "SplatExprCfgNode" } - override SplatExprChildMapping e; + override SplatExpr e; final override SplatExpr getExpr() { result = super.getExpr() } } diff --git a/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll b/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll index 8a7abea30904..06ca1ef1e7e7 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll @@ -2,12 +2,23 @@ overlay[local] module; +private import ruby as R +private import codeql.Locations +private import codeql.controlflow.ControlFlowGraph import codeql.controlflow.SuccessorType -private import codeql.ruby.AST -private import codeql.ruby.controlflow.BasicBlocks -private import internal.ControlFlowGraphImpl as CfgImpl -private import internal.Splitting as Splitting -private import internal.Completion +private import codeql.ruby.ast.internal.Synthesis +private import codeql.ruby.ast.internal.Scope + +private module Cfg0 = Make0; + +private module Cfg1 = Make1; + +private module Cfg2 = Make2; + +private import Cfg0 +private import Cfg1 +private import Cfg2 +import Public /** * An AST node with an associated control-flow graph. @@ -17,12 +28,12 @@ private import internal.Completion * Note that module declarations are not themselves CFG scopes, as they are part of * the CFG of the enclosing top-level or callable. */ -class CfgScope extends Scope instanceof CfgImpl::CfgScopeImpl { +class CfgScope extends R::Ast::Scope instanceof CfgScopeImpl { /** Gets the CFG scope that this scope is nested under, if any. */ final CfgScope getOuterCfgScope() { - exists(AstNode parent | + exists(R::Ast::AstNode parent | parent = this.getParent() and - result = CfgImpl::getCfgScope(parent) + result = getEnclosingCallable(parent) ) } } @@ -35,14 +46,11 @@ class CfgScope extends Scope instanceof CfgImpl::CfgScopeImpl { * * Only nodes that can be reached from an entry point are included in the CFG. */ -class CfgNode extends CfgImpl::Node { +class CfgNode extends ControlFlowNode { /** Gets the name of the primary QL class for this node. */ overlay[global] string getAPrimaryQlClass() { none() } - /** Gets the file of this control flow node. */ - final File getFile() { result = this.getLocation().getFile() } - /** Gets a successor node of a given type, if any. */ final CfgNode getASuccessor(SuccessorType t) { result = super.getASuccessor(t) } @@ -54,14 +62,505 @@ class CfgNode extends CfgImpl::Node { /** Gets an immediate predecessor, if any. */ final CfgNode getAPredecessor() { result = this.getAPredecessor(_) } +} + +private Ast::AstNode desugar(R::Ast::AstNode n) { result = n or result = n.getDesugared() } + +class CfgScopeImpl = Ast::Callable; + +predicate getEnclosingCallable = Ast::getEnclosingCallable/1; + +/** Provides an implementation of the AST signature for Ruby. */ +private module Ast implements AstSig { + private import codeql.ruby.ast.internal.AST + + private predicate additionalExclude(R::Ast::AstNode n) { + n instanceof R::Ast::DestructuredLhsExpr or + exists(n.getDesugared()) + } + + class AstNode extends R::Ast::AstNode { + AstNode() { + not any(Synthesis s).excludeFromControlFlowTree(this) and not additionalExclude(this) + } + } + + private R::Ast::AstNode adjustedGetChild(R::Ast::AstNode parent, int index) { + exists(R::Ast::WhenClause when | parent = when | + when.getPattern(index) = result + or + when.getBody() = result and index = toGenerated(result).getParentIndex() + ) + or + exists(R::Ast::MethodCall call | parent = call and not call instanceof R::Ast::BinaryOperation | + index = -1 and call.getReceiver() = result + or + call.getArgument(index) = result + or + index = call.getNumberOfArguments() and + call.getBlock() = result + ) + or + exists(R::Ast::ClassDeclaration cls | parent = cls | + index = 0 and cls.getScopeExpr() = result + or + index = 1 and cls.getSuperclassExpr() = result + or + cls.getStmt(index - 2) = result + ) + or + exists(R::Ast::ModuleDeclaration mod | parent = mod | + index = 0 and mod.getScopeExpr() = result + or + mod.getStmt(index - 1) = result + ) + or + exists(R::Ast::SingletonClass cls | parent = cls | + index = 0 and cls.getValue() = result + or + cls.getStmt(index - 1) = result + ) + or + exists(R::Ast::SingletonMethod method | parent = method | + index = 0 and method.getObject() = result + ) + or + exists(R::Ast::Pair pair | parent = pair | + index = 0 and pair.getKey() = result + or + index = 1 and pair.getValue() = result + ) + or + exists(R::Ast::ArrayPattern arraypattern | parent = arraypattern | + index = -1 and arraypattern.getClass() = result + or + arraypattern.getPrefixElement(index) = result + or + exists(int restix | restix = count(arraypattern.getPrefixElement(_)) | + restix = index and arraypattern.getRestVariableAccess() = result + or + arraypattern.getSuffixElement(index - restix - 1) = result + ) + ) + or + exists(R::Ast::FindPattern findpattern | parent = findpattern | + index = -2 and findpattern.getClass() = result + or + index = -1 and findpattern.getPrefixVariableAccess() = result + or + findpattern.getElement(index) = result + or + index = 1 + max(int i | exists(findpattern.getElement(i))) and + findpattern.getSuffixVariableAccess() = result + ) + or + exists(R::Ast::HashPattern hashpattern | parent = hashpattern | + index = -1 and hashpattern.getClass() = result + or + exists(int i | + hashpattern.getKey(i) = result and + index = 2 * i + or + hashpattern.getValue(i) = result and + index = 2 * i + 1 + ) + or + index = 2 * count(hashpattern.getValue(_)) and hashpattern.getRestVariableAccess() = result + ) + } + + private R::Ast::AstNode baseGetChild(R::Ast::AstNode parent, int index) { + result = adjustedGetChild(parent, index) + or + not exists(adjustedGetChild(parent, _)) and + not parent instanceof R::Ast::Callable and + ( + synthChild(parent, index, result) + or + result = parent.getAChild() and + not synthChild(parent, _, result) and + toGenerated(result).getParentIndex() = index + ) + } + + AstNode getChild(AstNode parent, int index) { result = desugar(baseGetChild(parent, index)) } + + private R::Ast::Scope parentScope(R::Ast::Scope n) { + result = n.getOuterScope() and + not n instanceof Callable + } + + cached + Callable getEnclosingCallable(AstNode node) { result = parentScope*(scopeOfInclSynth(node)) } + + // TODO: Include EndBlock + class Callable extends AstNode { + Callable() { this instanceof R::Ast::Toplevel or this instanceof R::Ast::Callable } + } + + AstNode callableGetBody(Callable c) { + result = c.(R::Ast::Toplevel).getABeginBlock() or + result = c.(R::Ast::Toplevel).getAStmt() or + result = c.(R::Ast::Callable).getBody() + } + + class Parameter extends AstNode instanceof R::Ast::Parameter { + AstNode getPattern() { + this.(R::Ast::NamedParameter).getDefiningAccess() = result + or + not exists(this.(R::Ast::NamedParameter).getDefiningAccess()) and + this = result + } + + Expr getDefaultValue() { + result = desugar(this.(R::Ast::KeywordParameter).getDefaultValue()) or + result = desugar(this.(R::Ast::OptionalParameter).getDefaultValue()) + } + } + + Parameter callableGetParameter(Callable c, int index) { + c.(R::Ast::Callable).getParameter(index) = result + } + + class Stmt extends AstNode instanceof R::Ast::Stmt { } + + // Most ast nodes in Ruby are both statements and expressions with only a few + // that are only statements. Similarly, most nodes accept statement children, + // but a few only accept expression children. But since this really only + // matters for parsing, we can just treat expressions and statements as the + // same thing to avoid hard-to-find mistakes. + class Expr = Stmt; + + class BlockStmt extends Stmt instanceof R::Ast::StmtSequence { + BlockStmt() { not this instanceof TryStmt } + + Stmt getStmt(int n) { result = desugar(super.getStmt(n)) } + + Stmt getLastStmt() { result = desugar(super.getLastStmt()) } + } + + class ExprStmt extends Stmt { + ExprStmt() { none() } + + Expr getExpr() { none() } + } + + class IfStmt extends Stmt instanceof R::Ast::ConditionalExpr { + IfStmt() { + exists(Stmt branch | + branch = desugar(super.getBranch(_)) and not branch instanceof R::Ast::Expr + ) + } + + Expr getCondition() { result = desugar(super.getCondition()) } + + Stmt getThen() { result = desugar(super.getBranch(true)) } + + Stmt getElse() { result = desugar(super.getBranch(false)) } + } + + class LoopStmt extends Stmt instanceof R::Ast::Loop { + Stmt getBody() { result = desugar(super.getBody()) } + } + + class WhileStmt extends LoopStmt instanceof R::Ast::ConditionalLoop { + WhileStmt() { this instanceof R::Ast::WhileExpr or this instanceof R::Ast::WhileModifierExpr } + + Expr getCondition() { result = desugar(super.getCondition()) } + } + + class UntilStmt extends LoopStmt instanceof R::Ast::ConditionalLoop { + UntilStmt() { this instanceof R::Ast::UntilExpr or this instanceof R::Ast::UntilModifierExpr } + + Expr getCondition() { result = desugar(super.getCondition()) } + } + + class DoStmt extends LoopStmt { + DoStmt() { none() } + + Expr getCondition() { none() } + } + + class ForStmt extends LoopStmt { + ForStmt() { none() } + + AstNode getInit(int index) { none() } + + Expr getCondition() { none() } + + AstNode getUpdate(int index) { none() } + } + + // `ForExpr` would be a match for `ForeachStmt`, but it is desugared. + class ForeachStmt extends LoopStmt { + ForeachStmt() { none() } + + Expr getVariable() { none() } + + Expr getCollection() { none() } + } + + class BreakStmt extends Stmt instanceof R::Ast::BreakStmt { } + + class ContinueStmt extends Stmt instanceof R::Ast::NextStmt { } + + class GotoStmt extends Stmt { + GotoStmt() { none() } + } + + class ReturnStmt extends Stmt instanceof R::Ast::ReturnStmt { + Expr getExpr() { result = desugar(super.getValue()) } + } + + // raise is just a method call + class Throw extends AstNode { + Throw() { none() } + + Expr getExpr() { none() } + } + + class TryStmt extends Stmt instanceof R::Ast::BodyStmt { + TryStmt() { exists(this.getRescue(_)) or exists(this.getElse()) or this.hasEnsure() } + + AstNode getBody(int index) { result = desugar(super.getStmt(index)) } + + CatchClause getCatch(int index) { result = super.getRescue(index) } + + Stmt getFinally() { result = super.getEnsure() } + } + + AstNode getTryElse(TryStmt try) { result = try.(R::Ast::BodyStmt).getElse() } + + class CatchClause extends AstNode instanceof R::Ast::RescueClause { + AstNode getPattern() { result = desugar(super.getPattern()) } + + AstNode getVariable() { result = super.getVariableExpr() } + + Expr getCondition() { none() } + + Stmt getBody() { result = super.getBody() } + } + + class Switch extends AstNode instanceof R::Ast::CaseExpr { + Expr getExpr() { result = desugar(super.getValue()) } + + Case getCase(int index) { result = super.getBranch(index) } + + Stmt getStmt(int index) { none() } + } + + class Case extends AstNode { + Case() { this = any(R::Ast::CaseExpr switch).getABranch() } + + AstNode getPattern(int index) { + desugar(this.(R::Ast::WhenClause).getPattern(index)) = result + or + desugar(this.(R::Ast::InClause).getPattern()) = result and index = 0 + } + + Expr getGuard() { desugar(this.(R::Ast::InClause).getCondition()) = result } + + AstNode getBody() { + desugar(this.(R::Ast::WhenClause).getBody()) = result or + desugar(this.(R::Ast::InClause).getBody()) = result or + desugar(this.(R::Ast::CaseElseBranch).getBody()) = result + } + } + + class DefaultCase extends Case instanceof R::Ast::CaseElseBranch { } + + predicate fallsThrough(Case c) { none() } + + class ConditionalExpr extends Expr instanceof R::Ast::ConditionalExpr { + ConditionalExpr() { not this instanceof IfStmt } + + Expr getCondition() { result = desugar(super.getCondition()) } + + Expr getThen() { result = desugar(super.getBranch(true)) } + + Expr getElse() { result = desugar(super.getBranch(false)) } + } + + class BinaryExpr extends Expr { + BinaryExpr() { this instanceof R::Ast::BinaryOperation or this instanceof R::Ast::Assignment } + + Expr getLeftOperand() { + result = desugar(this.(R::Ast::BinaryOperation).getLeftOperand()) or + result = desugar(this.(R::Ast::Assignment).getLeftOperand()) + } + + Expr getRightOperand() { + result = desugar(this.(R::Ast::BinaryOperation).getRightOperand()) or + result = desugar(this.(R::Ast::Assignment).getRightOperand()) + } + } + + class LogicalAndExpr extends BinaryExpr instanceof R::Ast::LogicalAndExpr { } + + class LogicalOrExpr extends BinaryExpr instanceof R::Ast::LogicalOrExpr { } + + class NullCoalescingExpr extends BinaryExpr { + NullCoalescingExpr() { none() } + } + + class UnaryExpr extends Expr instanceof R::Ast::UnaryOperation { + Expr getOperand() { result = desugar(super.getOperand()) } + } - /** Gets the basic block that this control flow node belongs to. */ - BasicBlock getBasicBlock() { result.getANode() = this } + class LogicalNotExpr extends UnaryExpr instanceof R::Ast::NotExpr { } + + class Assignment extends BinaryExpr instanceof R::Ast::Assignment { } + + class AssignExpr extends Assignment instanceof R::Ast::AssignExpr { } + + // Compound assignments are desugared. + class CompoundAssignment extends Assignment { + CompoundAssignment() { none() } + } + + class AssignLogicalAndExpr extends CompoundAssignment { } + + class AssignLogicalOrExpr extends CompoundAssignment { } + + class AssignNullCoalescingExpr extends CompoundAssignment { } + + class BooleanLiteral extends Expr instanceof R::Ast::BooleanLiteral { + boolean getValue() { result = super.getValue() } + } + + class PatternMatchExpr extends Expr { + PatternMatchExpr() { none() } + + Expr getExpr() { none() } + + AstNode getPattern() { none() } + } +} + +private predicate rescuable(R::Ast::AstNode n) { + exists(R::Ast::RescueModifierExpr rescueModifier | n = desugar(rescueModifier.getBody())) + or + exists(Ast::TryStmt try | n = try.getBody(_)) + or + exists(R::Ast::AstNode parent | n = desugar(parent.getAChild()) and rescuable(parent)) } -class Split = Splitting::Split; +/** + * Holds if `c` happens in an exception-aware context, that is, it may be + * `rescue`d or `ensure`d. In such cases, we assume that the target of `c` + * may raise an exception (in addition to evaluating normally). + */ +private predicate mayRaise(R::Ast::Call c) { rescuable(c) } + +private module Input implements InputSig1, InputSig2 { + private import codeql.util.Void + private import codeql.util.Unit + private import internal.NonReturning + + predicate cfgCachedStageRef() { CfgCachedStage::ref() } + + class Label = Void; -/** Provides different kinds of control flow graph splittings. */ -module Split { - class ConditionalCompletionSplit = Splitting::ConditionalCompletionSplit; + predicate preOrderExpr(Ast::Expr e) { + e instanceof R::Ast::StmtSequence or + e instanceof R::Ast::RescueClause or + e instanceof R::Ast::ConditionalExpr or + e instanceof R::Ast::Loop or + e instanceof R::Ast::RescueModifierExpr + } + + predicate postOrInOrder(Ast::AstNode n) { + n instanceof R::Ast::Call and + not n instanceof R::Ast::BinaryOperation and + not n instanceof R::Ast::UnaryOperation + or + n instanceof R::Ast::RedoStmt + or + n instanceof R::Ast::RetryStmt + } + + class CallableContext = Unit; + + Ast::AstNode callableGetBodyPart(Ast::Callable c, CallableContext ctx, int index) { + exists(R::Ast::Toplevel t | + c = t and + exists(ctx) + | + result = t.getBeginBlock(index) or + result = desugar(t.getStmt(index - count(t.getABeginBlock()))) + ) + } + + predicate catchAll(Ast::CatchClause catch) { + not exists(catch.(R::Ast::RescueClause).getAnException()) + } + + predicate beginAbruptCompletion( + Ast::AstNode ast, PreControlFlowNode n, AbruptCompletion c, boolean always + ) { + ast.(NonReturningCall).getASuccessorType() = c.asSimpleAbruptCompletion() and + n.isIn(ast) and + always = true + or + mayRaise(ast) and + n.isIn(ast) and + c.asSimpleAbruptCompletion() instanceof ExceptionSuccessor and + always = false + or + ast instanceof R::Ast::RedoStmt and + n.isIn(ast) and + c.asSimpleAbruptCompletion() instanceof RedoSuccessor and + always = true + or + ast instanceof R::Ast::RetryStmt and + n.isIn(ast) and + c.asSimpleAbruptCompletion() instanceof RetrySuccessor and + always = true + } + + predicate endAbruptCompletion(Ast::AstNode ast, PreControlFlowNode n, AbruptCompletion c) { + exists(R::Ast::Callable callable | + callable.getBody() = ast and + n.(NormalExitNodeImpl).getEnclosingCallable() = callable + | + c.asSimpleAbruptCompletion() instanceof BreakSuccessor or + c.asSimpleAbruptCompletion() instanceof ContinueSuccessor or + c.asSimpleAbruptCompletion() instanceof RedoSuccessor + ) + or + exists(R::Ast::RescueModifierExpr rescueModifier | + ast = desugar(rescueModifier.getBody()) and + c.getSuccessorType() instanceof ExceptionSuccessor and + n.isBefore(desugar(rescueModifier.getHandler())) + ) + or + ast = any(Ast::LoopStmt loop).getBody() and + c.asSimpleAbruptCompletion() instanceof RedoSuccessor and + n.isBefore(ast) + or + exists(Ast::TryStmt try | + ast = try.getCatch(_).getBody() and + c.asSimpleAbruptCompletion() instanceof RetrySuccessor and + n.isBefore(try.getBody(0)) + ) + } + + predicate step(PreControlFlowNode n1, PreControlFlowNode n2) { + exists(Ast::ConditionalExpr ce | + n1.isAfterTrue(ce.getCondition()) and not exists(ce.getThen()) and n2.isAfter(ce) + or + n1.isAfterFalse(ce.getCondition()) and not exists(ce.getElse()) and n2.isAfter(ce) + ) + or + exists(R::Ast::RescueModifierExpr rescueModifier | + n1.isBefore(rescueModifier) and + n2.isBefore(desugar(rescueModifier.getBody())) + or + n1.isAfter(desugar(rescueModifier.getBody())) and + n2.isAfter(rescueModifier) + or + n1.isAfter(desugar(rescueModifier.getHandler())) and + n2.isAfter(rescueModifier) + ) + } } diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/Completion.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/Completion.qll deleted file mode 100644 index bcfe8f98d437..000000000000 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/Completion.qll +++ /dev/null @@ -1,565 +0,0 @@ -/** - * Provides classes representing control flow completions. - * - * A completion represents how a statement or expression terminates. - */ -overlay[local] -module; - -private import codeql.ruby.AST -private import codeql.ruby.ast.internal.AST -private import codeql.ruby.ast.internal.Control -private import codeql.ruby.controlflow.ControlFlowGraph -private import ControlFlowGraphImpl as CfgImpl -private import NonReturning - -private newtype TCompletion = - TSimpleCompletion() or - TBooleanCompletion(boolean b) { b in [false, true] } or - TMatchingCompletion(boolean isMatch) { isMatch in [false, true] } or - TReturnCompletion() or - TBreakCompletion() or - TNextCompletion() or - TRedoCompletion() or - TRetryCompletion() or - TRaiseCompletion() or // TODO: Add exception type? - TExitCompletion() or - TNestedCompletion(TCompletion inner, TCompletion outer, int nestLevel) { - inner = TBreakCompletion() and - outer instanceof NonNestedNormalCompletion and - nestLevel = 0 - or - inner instanceof TBooleanCompletion and - outer instanceof TMatchingCompletion and - nestLevel = 0 - or - inner instanceof NormalCompletion and - nestedEnsureCompletion(outer, nestLevel) - } - -pragma[noinline] -private predicate nestedEnsureCompletion(TCompletion outer, int nestLevel) { - ( - outer = TReturnCompletion() - or - outer = TBreakCompletion() - or - outer = TNextCompletion() - or - outer = TRedoCompletion() - or - outer = TRetryCompletion() - or - outer = TRaiseCompletion() - or - outer = TExitCompletion() - ) and - nestLevel = any(CfgImpl::Trees::BodyStmtTree t).getNestLevel() -} - -pragma[noinline] -private predicate completionIsValidForStmt(AstNode n, Completion c) { - n instanceof BreakStmt and - c = TBreakCompletion() - or - n instanceof NextStmt and - c = TNextCompletion() - or - n instanceof RedoStmt and - c = TRedoCompletion() - or - n instanceof ReturnStmt and - c = TReturnCompletion() -} - -private AstNode getARescuableBodyChild() { - exists(CfgImpl::Trees::BodyStmtTree bst | result = bst.getBodyChild(_, true) | - exists(bst.getARescue()) - or - exists(bst.getEnsure()) - ) - or - result = getARescuableBodyChild().getAChild() -} - -/** - * Holds if `c` happens in an exception-aware context, that is, it may be - * `rescue`d or `ensure`d. In such cases, we assume that the target of `c` - * may raise an exception (in addition to evaluating normally). - */ -private predicate mayRaise(Call c) { c = getARescuableBodyChild() } - -/** A completion of a statement or an expression. */ -abstract class Completion extends TCompletion { - private predicate isValidForSpecific0(AstNode n) { - this = n.(NonReturningCall).getACompletion() - or - completionIsValidForStmt(n, this) - or - mustHaveBooleanCompletion(n) and - ( - exists(boolean value | isBooleanConstant(n, value) | this = TBooleanCompletion(value)) - or - not isBooleanConstant(n, _) and - this = TBooleanCompletion(_) - ) - or - mustHaveMatchingCompletion(n) and - this = TMatchingCompletion(_) - or - n = any(RescueModifierExpr parent).getBody() and - this = [TSimpleCompletion().(TCompletion), TRaiseCompletion()] - } - - private predicate isValidForSpecific(AstNode n) { - this.isValidForSpecific0(n) - or - exists(AstNode other | n = other.getDesugared() and this.isValidForSpecific(other)) - or - mayRaise(n) and - ( - this = TRaiseCompletion() - or - not any(Completion c).isValidForSpecific0(n) and - this = TSimpleCompletion() - ) - } - - /** Holds if this completion is valid for node `n`. */ - predicate isValidFor(AstNode n) { - this.isValidForSpecific(n) - or - not any(Completion c).isValidForSpecific(n) and - this = TSimpleCompletion() - } - - /** - * Holds if this completion will continue a loop when it is the completion - * of a loop body. - */ - predicate continuesLoop() { - this instanceof NormalCompletion or - this instanceof NextCompletion - } - - /** - * Gets the inner completion. This is either the inner completion, - * when the completion is nested, or the completion itself. - */ - Completion getInnerCompletion() { result = this } - - /** - * Gets the outer completion. This is either the outer completion, - * when the completion is nested, or the completion itself. - */ - Completion getOuterCompletion() { result = this } - - /** Gets a successor type that matches this completion. */ - abstract SuccessorType getAMatchingSuccessorType(); - - /** Gets a textual representation of this completion. */ - abstract string toString(); -} - -/** Holds if node `n` has the Boolean constant value `value`. */ -private predicate isBooleanConstant(AstNode n, boolean value) { - mustHaveBooleanCompletion(n) and - ( - n.(BooleanLiteral).isTrue() and - value = true - or - n.(BooleanLiteral).isFalse() and - value = false - ) -} - -/** - * Holds if a normal completion of `n` must be a Boolean completion. - */ -private predicate mustHaveBooleanCompletion(AstNode n) { - inBooleanContext(n) and - not n instanceof NonReturningCall -} - -/** - * Holds if `n` is used in a Boolean context. That is, the value - * that `n` evaluates to determines a true/false branch successor. - */ -private predicate inBooleanContext(AstNode n) { - exists(ConditionalExpr i | - n = i.getCondition() - or - inBooleanContext(i) and - n = i.getBranch(_) - ) - or - n = any(ConditionalLoop parent).getCondition() - or - n = any(InClause parent).getCondition() - or - exists(LogicalAndExpr parent | - n = parent.getLeftOperand() - or - inBooleanContext(parent) and - n = parent.getRightOperand() - ) - or - exists(LogicalOrExpr parent | - n = parent.getLeftOperand() - or - inBooleanContext(parent) and - n = parent.getRightOperand() - ) - or - n = any(NotExpr parent | inBooleanContext(parent)).getOperand() - or - n = any(StmtSequence parent | inBooleanContext(parent)).getLastStmt() - or - exists(CaseExpr c, WhenClause w | - not exists(c.getValue()) and - c.getABranch() = w - | - w.getPattern(_) = n - or - w = n - ) -} - -/** - * Holds if a normal completion of `n` must be a matching completion. - */ -private predicate mustHaveMatchingCompletion(AstNode n) { - inMatchingContext(n) and - not n instanceof NonReturningCall -} - -/** - * Holds if `n` is used in a matching context. That is, whether or - * not the value of `n` matches, determines the successor. - */ -private predicate inMatchingContext(AstNode n) { - n = any(RescueClause r).getException(_) - or - exists(CaseExpr c, WhenClause w | - exists(c.getValue()) and - c.getABranch() = w - | - w.getPattern(_) = n - or - w = n - ) - or - n instanceof CasePattern - or - n = any(ReferencePattern p).getExpr() - or - n.(CfgImpl::Trees::DefaultValueParameterTree).hasDefaultValue() -} - -/** - * A completion that represents normal evaluation of a statement or an - * expression. - */ -abstract class NormalCompletion extends Completion { } - -abstract private class NonNestedNormalCompletion extends NormalCompletion { } - -/** A simple (normal) completion. */ -class SimpleCompletion extends NonNestedNormalCompletion, TSimpleCompletion { - override DirectSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { result = "simple" } -} - -/** - * A completion that represents evaluation of an expression, whose value determines - * the successor. Either a Boolean completion (`BooleanCompletion`), or a matching - * completion (`MatchingCompletion`). - */ -abstract class ConditionalCompletion extends NormalCompletion { - boolean value; - - bindingset[value] - ConditionalCompletion() { any() } - - /** Gets the Boolean value of this conditional completion. */ - final boolean getValue() { result = value } -} - -/** - * A completion that represents evaluation of an expression - * with a Boolean value. - */ -class BooleanCompletion extends ConditionalCompletion, NonNestedNormalCompletion, TBooleanCompletion -{ - BooleanCompletion() { this = TBooleanCompletion(value) } - - /** Gets the dual Boolean completion. */ - BooleanCompletion getDual() { result = TBooleanCompletion(value.booleanNot()) } - - override BooleanSuccessor getAMatchingSuccessorType() { result.getValue() = value } - - override string toString() { result = value.toString() } -} - -/** A Boolean `true` completion. */ -class TrueCompletion extends BooleanCompletion { - TrueCompletion() { this.getValue() = true } -} - -/** A Boolean `false` completion. */ -class FalseCompletion extends BooleanCompletion { - FalseCompletion() { this.getValue() = false } -} - -/** - * A completion that represents evaluation of a matching test, for example - * a test in a `rescue` statement. - */ -class MatchingCompletion extends ConditionalCompletion { - MatchingCompletion() { - this = TMatchingCompletion(value) - or - this = TNestedCompletion(_, TMatchingCompletion(value), _) - } - - override ConditionalSuccessor getAMatchingSuccessorType() { - this = TMatchingCompletion(result.(MatchingSuccessor).getValue()) - } - - override string toString() { if value = true then result = "match" else result = "no-match" } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in a return. - */ -class ReturnCompletion extends Completion { - ReturnCompletion() { - this = TReturnCompletion() or - this = TNestedCompletion(_, TReturnCompletion(), _) - } - - override ReturnSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TReturnCompletion() and result = "return" - } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in a break from a loop. - */ -class BreakCompletion extends Completion { - BreakCompletion() { - this = TBreakCompletion() or - this = TNestedCompletion(_, TBreakCompletion(), _) - } - - override BreakSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TBreakCompletion() and result = "break" - } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in a continuation of a loop. - */ -class NextCompletion extends Completion { - NextCompletion() { - this = TNextCompletion() or - this = TNestedCompletion(_, TNextCompletion(), _) - } - - override ContinueSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TNextCompletion() and result = "next" - } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in a redo of a loop iteration. - */ -class RedoCompletion extends Completion { - RedoCompletion() { - this = TRedoCompletion() or - this = TNestedCompletion(_, TRedoCompletion(), _) - } - - override RedoSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TRedoCompletion() and result = "redo" - } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in a retry. - */ -class RetryCompletion extends Completion { - RetryCompletion() { - this = TRetryCompletion() or - this = TNestedCompletion(_, TRetryCompletion(), _) - } - - override RetrySuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TRetryCompletion() and result = "retry" - } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in a thrown exception. - */ -class RaiseCompletion extends Completion { - RaiseCompletion() { - this = TRaiseCompletion() or - this = TNestedCompletion(_, TRaiseCompletion(), _) - } - - override ExceptionSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TRaiseCompletion() and result = "raise" - } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in an abort/exit. - */ -class ExitCompletion extends Completion { - ExitCompletion() { - this = TExitCompletion() or - this = TNestedCompletion(_, TExitCompletion(), _) - } - - override ExitSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TExitCompletion() and result = "exit" - } -} - -/** - * A nested completion. For example, in - * - * ```rb - * def m - * while x >= 0 - * x -= 1 - * if num > 100 - * break - * end - * end - * puts "done" - * end - * ``` - * - * the `while` loop can have a nested completion where the inner completion - * is a `break` and the outer completion is a simple successor. - */ -abstract class NestedCompletion extends Completion, TNestedCompletion { - Completion inner; - Completion outer; - int nestLevel; - - NestedCompletion() { this = TNestedCompletion(inner, outer, nestLevel) } - - /** Gets a completion that is compatible with the inner completion. */ - Completion getAnInnerCompatibleCompletion() { - result.getOuterCompletion() = this.getInnerCompletion() - } - - /** Gets the level of this nested completion. */ - final int getNestLevel() { result = nestLevel } - - override string toString() { result = outer + " [" + inner + "] (" + nestLevel + ")" } -} - -class NestedBreakCompletion extends NormalCompletion, NestedCompletion { - NestedBreakCompletion() { - inner = TBreakCompletion() and - outer instanceof NonNestedNormalCompletion - } - - override BreakCompletion getInnerCompletion() { result = inner } - - override NonNestedNormalCompletion getOuterCompletion() { result = outer } - - override Completion getAnInnerCompatibleCompletion() { - result = inner and - outer = TSimpleCompletion() - or - result = TNestedCompletion(outer, inner, _) - } - - override SuccessorType getAMatchingSuccessorType() { - outer instanceof SimpleCompletion and - result instanceof BreakSuccessor - or - result = outer.(ConditionalCompletion).getAMatchingSuccessorType() - } -} - -class NestedEnsureCompletion extends NestedCompletion { - NestedEnsureCompletion() { - inner instanceof NormalCompletion and - nestedEnsureCompletion(outer, nestLevel) - } - - override NormalCompletion getInnerCompletion() { result = inner } - - override Completion getOuterCompletion() { result = outer } - - override SuccessorType getAMatchingSuccessorType() { none() } -} - -/** - * A completion used for conditions in pattern matching: - * - * ```rb - * in x if x == 5 then puts "five" - * in x unless x == 4 then puts "not four" - * ``` - * - * The outer (Matching) completion indicates whether there is a match, and - * the inner (Boolean) completion indicates what the condition evaluated - * to. - * - * For the condition `x == 5` above, `TNestedCompletion(true, true, 0)` and - * `TNestedCompletion(false, false, 0)` are both valid completions, while - * `TNestedCompletion(true, false, 0)` and `TNestedCompletion(false, true, 0)` - * are valid completions for `x == 4`. - */ -class NestedMatchingCompletion extends NestedCompletion, MatchingCompletion { - NestedMatchingCompletion() { - inner instanceof TBooleanCompletion and - outer instanceof TMatchingCompletion - } - - override BooleanCompletion getInnerCompletion() { result = inner } - - override MatchingCompletion getOuterCompletion() { result = outer } - - override BooleanSuccessor getAMatchingSuccessorType() { - result.getValue() = this.getInnerCompletion().getValue() - } - - override string toString() { result = NestedCompletion.super.toString() } -} diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImpl.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImpl.qll deleted file mode 100644 index e66e8bad0037..000000000000 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImpl.qll +++ /dev/null @@ -1,1510 +0,0 @@ -/** - * Provides an implementation for constructing control-flow graphs (CFGs) from - * abstract syntax trees (ASTs), using the shared library from `codeql.controlflow.Cfg`. - */ -overlay[local] -module; - -private import codeql.controlflow.Cfg as CfgShared -private import codeql.ruby.AST -private import codeql.ruby.AST as Ast -private import codeql.ruby.ast.internal.AST as AstInternal -private import codeql.ruby.ast.internal.Scope -private import codeql.ruby.ast.internal.Synthesis -private import codeql.ruby.ast.Scope -private import codeql.ruby.ast.internal.TreeSitter -private import codeql.ruby.ast.internal.Variable -private import codeql.ruby.controlflow.ControlFlowGraph -private import Completion - -class AstNode extends Ast::AstNode { - AstNode() { not any(Synthesis s).excludeFromControlFlowTree(this) } -} - -private module CfgInput implements CfgShared::InputSig { - private import ControlFlowGraphImpl as Impl - private import Completion as Comp - private import codeql.ruby.CFG as Cfg - - class AstNode = Impl::AstNode; - - class Completion = Comp::Completion; - - predicate completionIsNormal(Completion c) { c instanceof Comp::NormalCompletion } - - predicate completionIsSimple(Completion c) { c instanceof Comp::SimpleCompletion } - - predicate completionIsValidFor(Completion c, AstNode e) { c.isValidFor(e) } - - class CfgScope = Cfg::CfgScope; - - CfgScope getCfgScope(AstNode n) { result = Impl::getCfgScope(n) } - - predicate scopeFirst(CfgScope scope, AstNode first) { scope.(Impl::CfgScopeImpl).entry(first) } - - predicate scopeLast(CfgScope scope, AstNode last, Completion c) { - scope.(Impl::CfgScopeImpl).exit(last, c) - } - - private class SuccessorType = Cfg::SuccessorType; - - SuccessorType getAMatchingSuccessorType(Completion c) { result = c.getAMatchingSuccessorType() } - - private predicate id(Ruby::AstNode node1, Ruby::AstNode node2) { node1 = node2 } - - private predicate idOf(Ruby::AstNode node, int id) = equivalenceRelation(id/2)(node, id) - - int idOfAstNode(AstNode node) { idOf(AstInternal::toGeneratedInclSynth(node), result) } - - int idOfCfgScope(CfgScope node) { result = idOfAstNode(node) } -} - -private module CfgSplittingInput implements CfgShared::SplittingInputSig { - private import Splitting as S - - class SplitKindBase = S::TSplitKind; - - class Split = S::Split; -} - -private module ConditionalCompletionSplittingInput implements - CfgShared::ConditionalCompletionSplittingInputSig -{ - import Splitting::ConditionalCompletionSplitting::ConditionalCompletionSplittingInput -} - -import CfgShared::MakeWithSplitting - -abstract class CfgScopeImpl extends AstNode { - abstract predicate entry(AstNode first); - - abstract predicate exit(AstNode last, Completion c); -} - -private class ToplevelScope extends CfgScopeImpl, Toplevel { - final override predicate entry(AstNode first) { first(this, first) } - - final override predicate exit(AstNode last, Completion c) { last(this, last, c) } -} - -private class EndBlockScope extends CfgScopeImpl, EndBlock { - final override predicate entry(AstNode first) { - first(this.(Trees::EndBlockTree).getBodyChild(0, _), first) - } - - final override predicate exit(AstNode last, Completion c) { - last(this.(Trees::EndBlockTree).getLastBodyChild(), last, c) - or - last(this.(Trees::EndBlockTree).getBodyChild(_, _), last, c) and - not c instanceof NormalCompletion - } -} - -private class CallableScope extends CfgScopeImpl, Callable { - final override predicate entry(AstNode first) { - first(this.(Trees::CallableTree).getBodyChild(0), first) - } - - final override predicate exit(AstNode last, Completion c) { - this.getBody().(Trees::BodyStmtTree).last(last, c) - or - exists(int i | - not exists(this.getBody()) and - last(this.(Trees::CallableTree).getBodyChild(i), last, c) and - not exists(this.(Trees::CallableTree).getBodyChild(i + 1)) - ) - or - exists(AstNode child | - child = this.(Trees::CallableTree).getBodyChild(_) and - not child = this.getBody() and - last(child, last, c) and - not c instanceof NormalCompletion - ) - } -} - -/** Holds if `first` is first executed when entering `scope`. */ -pragma[nomagic] -predicate succEntry(CfgScopeImpl scope, AstNode first) { scope.entry(first) } - -/** Holds if `last` with completion `c` can exit `scope`. */ -pragma[nomagic] -predicate succExit(CfgScopeImpl scope, AstNode last, Completion c) { scope.exit(last, c) } - -/** Defines the CFG by dispatch on the various AST types. */ -module Trees { - private class AliasStmtTree extends StandardPreOrderTree instanceof AliasStmt { - final override ControlFlowTree getChildNode(int i) { - result = super.getNewName() and i = 0 - or - result = super.getOldName() and i = 1 - } - } - - private class ArgumentListTree extends StandardPostOrderTree instanceof ArgumentList { - final override ControlFlowTree getChildNode(int i) { result = super.getElement(i) } - } - - private class AssignExprTree extends StandardPostOrderTree instanceof AssignExpr { - AssignExprTree() { - exists(Expr left | left = super.getLeftOperand() | - left instanceof VariableAccess or - left instanceof ConstantAccess - ) - } - - final override ControlFlowTree getChildNode(int i) { - result = super.getLeftOperand() and i = 0 - or - result = super.getRightOperand() and i = 1 - } - } - - private class BeginTree extends BodyStmtTree instanceof BeginExpr { - final override predicate propagatesAbnormal(AstNode child) { none() } - } - - private class BlockArgumentTree extends StandardPostOrderTree instanceof BlockArgument { - final override ControlFlowTree getChildNode(int i) { result = super.getValue() and i = 0 } - } - - abstract private class NonDefaultValueParameterTree extends ControlFlowTree instanceof NamedParameter - { - final override predicate first(AstNode first) { - super.getDefiningAccess().(ControlFlowTree).first(first) - or - not exists(super.getDefiningAccess()) and first = this - } - - final override predicate last(AstNode last, Completion c) { - super.getDefiningAccess().(ControlFlowTree).last(last, c) - or - not exists(super.getDefiningAccess()) and - last = this and - c.isValidFor(this) - } - - override predicate propagatesAbnormal(AstNode child) { - super.getDefiningAccess().(ControlFlowTree).propagatesAbnormal(child) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { none() } - } - - private class BlockParameterTree extends NonDefaultValueParameterTree instanceof BlockParameter { - } - - class BodyStmtTree extends StmtSequenceTree instanceof BodyStmt { - /** Gets a rescue clause in this block. */ - final RescueClause getARescue() { result = super.getRescue(_) } - - /** Gets the `ensure` clause in this block, if any. */ - final StmtSequence getEnsure() { result = super.getEnsure() } - - override predicate first(AstNode first) { - first(this.getBodyChild(0, _), first) - or - not exists(this.getBodyChild(_, _)) and - first(super.getEnsure(), first) - } - - override predicate last(AstNode last, Completion c) { - exists(boolean ensurable | last = this.getAnEnsurePredecessor(c, ensurable) | - not super.hasEnsure() - or - ensurable = false - ) - or - // If the body completes normally, take the completion from the `ensure` block - this.lastEnsure(last, c, any(NormalCompletion nc), _) - or - // If the `ensure` block completes normally, it inherits any non-normal - // completion from the body - c = - any(NestedEnsureCompletion nec | - this.lastEnsure(last, nec.getAnInnerCompatibleCompletion(), nec.getOuterCompletion(), - nec.getNestLevel()) - ) - or - not exists(this.getBodyChild(_, _)) and - not exists(super.getRescue(_)) and - this.lastEnsure0(last, c) - or - last([super.getEnsure().(AstNode), this.getBodyChild(_, false)], last, c) and - not c instanceof NormalCompletion - } - - override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Normal left-to-right evaluation in the body - exists(int i | - last(this.getBodyChild(i, _), pred, c) and - first(this.getBodyChild(i + 1, _), succ) and - c instanceof NormalCompletion - ) - or - // Exceptional flow from body to first `rescue` - this.lastBody(pred, c, true) and - first(super.getRescue(0), succ) and - c instanceof RaiseCompletion - or - // Flow from one `rescue` clause to the next when there is no match - exists(RescueTree rescue, int i | rescue = super.getRescue(i) | - rescue.lastNoMatch(pred, c) and - first(super.getRescue(i + 1), succ) - ) - or - // Flow from body to `else` block when no exception - this.lastBody(pred, c, _) and - first(super.getElse(), succ) and - c instanceof NormalCompletion - or - // Flow into `ensure` block - pred = this.getAnEnsurePredecessor(c, true) and - first(super.getEnsure(), succ) - } - - /** - * Gets a last element from this block that may finish with completion `c`, such - * that control may be transferred to the `ensure` block (if it exists), but only - * if `ensurable = true`. - */ - pragma[nomagic] - private AstNode getAnEnsurePredecessor(Completion c, boolean ensurable) { - this.lastBody(result, c, ensurable) and - ( - // Any non-throw completion will always continue directly to the `ensure` block, - // unless there is an `else` block - not c instanceof RaiseCompletion and - not exists(super.getElse()) - or - // Any completion will continue to the `ensure` block when there are no `rescue` - // blocks - not exists(super.getRescue(_)) - ) - or - // Last element from any matching `rescue` block continues to the `ensure` block - last(super.getRescue(_), result, c) and - ensurable = true - or - // If the last `rescue` block does not match, continue to the `ensure` block - exists(int lst, MatchingCompletion mc | - super.getRescue(lst).(RescueTree).lastNoMatch(result, mc) and - mc.getValue() = false and - not exists(super.getRescue(lst + 1)) and - c = - any(NestedEnsureCompletion nec | - nec.getOuterCompletion() instanceof RaiseCompletion and - nec.getInnerCompletion() = mc and - nec.getNestLevel() = 0 - ) and - ensurable = true - ) - or - // Last element of `else` block continues to the `ensure` block - last(super.getElse(), result, c) and - ensurable = true - } - - pragma[nomagic] - private predicate lastEnsure0(AstNode last, Completion c) { last(super.getEnsure(), last, c) } - - /** - * Gets a descendant that belongs to the `ensure` block of this block, if any. - * Nested `ensure` blocks are not included. - */ - pragma[nomagic] - AstNode getAnEnsureDescendant() { - result = super.getEnsure() - or - exists(AstNode mid | - mid = this.getAnEnsureDescendant() and - result = mid.getAChild() and - getCfgScope(result) = getCfgScope(mid) and - not exists(BodyStmt nestedBlock | - result = nestedBlock.getEnsure() and - nestedBlock != this - ) - ) - } - - /** - * Holds if `innerBlock` has an `ensure` block and is immediately nested inside the - * `ensure` block of this block. - */ - private predicate nestedEnsure(BodyStmtTree innerBlock) { - exists(StmtSequence innerEnsure | - innerEnsure = this.getAnEnsureDescendant().getAChild() and - getCfgScope(innerEnsure) = getCfgScope(this) and - innerEnsure = innerBlock.getEnsure() - ) - } - - /** - * Gets the `ensure`-nesting level of this block. That is, the number of `ensure` - * blocks that this block is nested under. - */ - int getNestLevel() { result = count(BodyStmtTree outer | outer.nestedEnsure+(this)) } - - pragma[nomagic] - private predicate lastEnsure( - AstNode last, NormalCompletion ensure, Completion outer, int nestLevel - ) { - this.lastEnsure0(last, ensure) and - exists( - this.getAnEnsurePredecessor(any(Completion c0 | outer = c0.getOuterCompletion()), true) - ) and - nestLevel = this.getNestLevel() - } - - /** - * Holds if `last` is a last element in the body of this block. `ensurable` - * indicates whether `last` may be a predecessor of an `ensure` block. - */ - pragma[nomagic] - private predicate lastBody(AstNode last, Completion c, boolean ensurable) { - exists(boolean rescuable | - if c instanceof RaiseCompletion then ensurable = rescuable else ensurable = true - | - last(this.getBodyChild(_, rescuable), last, c) and - not c instanceof NormalCompletion - or - exists(int lst | - last(this.getBodyChild(lst, rescuable), last, c) and - not exists(this.getBodyChild(lst + 1, _)) - ) - ) - } - } - - private class BooleanLiteralTree extends LeafTree instanceof BooleanLiteral { } - - class BraceBlockTree extends CallableTree instanceof BraceBlock { - final override AstNode getBodyChild(int i) { - result = super.getParameter(i) - or - result = super.getLocalVariable(i - super.getNumberOfParameters()) - or - result = super.getBody() and - i = super.getNumberOfParameters() + count(super.getALocalVariable()) - } - } - - class CallableTree extends PostOrderTree instanceof Callable { - final override predicate propagatesAbnormal(AstNode child) { none() } - - override predicate first(AstNode first) { first = this } - - abstract AstNode getBodyChild(int i); - - override predicate succ(AstNode pred, AstNode succ, Completion c) { - exists(int i | - last(this.getBodyChild(i), pred, c) and - first(this.getBodyChild(i + 1), succ) and - c instanceof NormalCompletion - ) - } - } - - private class CallTree extends StandardPostOrderTree instanceof Call { - CallTree() { - // Logical operations are handled separately - not this instanceof UnaryLogicalOperation and - not this instanceof BinaryLogicalOperation and - // Calls with the `&.` operator are desugared - not this.(MethodCall).isSafeNavigation() - } - - override ControlFlowTree getChildNode(int i) { result = super.getArgument(i) } - } - - private class CaseTree extends PostOrderTree instanceof CaseExpr, AstInternal::TCaseExpr { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getValue() or child = super.getABranch() - } - - final override predicate first(AstNode first) { - first(super.getValue(), first) - or - not exists(super.getValue()) and first(super.getBranch(0), first) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getValue(), pred, c) and - first(super.getBranch(0), succ) and - c instanceof SimpleCompletion - or - exists(int i, WhenTree branch | branch = super.getBranch(i) | - pred = branch and - first(super.getBranch(i + 1), succ) and - c.isValidFor(branch) and - c.(ConditionalCompletion).getValue() = false - ) - or - succ = this and - c instanceof NormalCompletion and - ( - last(super.getValue(), pred, c) and not exists(super.getABranch()) - or - last(super.getABranch().(WhenClause).getBody(), pred, c) - or - exists(int i, ControlFlowTree lastBranch | - lastBranch = super.getBranch(i) and - not exists(super.getBranch(i + 1)) and - last(lastBranch, pred, c) - ) - ) - } - } - - private class CaseMatchTree extends PostOrderTree instanceof CaseExpr, AstInternal::TCaseMatch { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getValue() or child = super.getABranch() - } - - final override predicate first(AstNode first) { first(super.getValue(), first) } - - final override predicate last(AstNode last, Completion c) { - super.last(last, c) - or - not exists(super.getElseBranch()) and - exists(MatchingCompletion lc, AstNode lastBranch | - lastBranch = max(int i | | super.getBranch(i) order by i) and - lc.getValue() = false and - last(lastBranch, last, lc) and - c instanceof RaiseCompletion and - not c instanceof NestedCompletion - ) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getValue(), pred, c) and - first(super.getBranch(0), succ) and - c instanceof SimpleCompletion - or - exists(int i, AstNode branch | branch = super.getBranch(i) | - last(branch, pred, c) and - first(super.getBranch(i + 1), succ) and - c.(MatchingCompletion).getValue() = false - ) - or - succ = this and - c instanceof NormalCompletion and - ( - last(super.getABranch(), pred, c) and - not c.(MatchingCompletion).getValue() = false - or - last(super.getElseBranch(), pred, c) - ) - } - } - - private class CaseElseBranchTree extends ControlFlowTree instanceof CaseElseBranch { - final override predicate propagatesAbnormal(AstNode child) { child = super.getBody() } - - final override predicate first(AstNode first) { first(super.getBody(), first) } - - final override predicate last(AstNode last, Completion c) { last(super.getBody(), last, c) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { none() } - } - - private class PatternVariableAccessTree extends LocalVariableAccessTree instanceof LocalVariableWriteAccess, - CasePattern - { - final override predicate last(AstNode last, Completion c) { - super.last(last, c) and - c.(MatchingCompletion).getValue() = true - } - } - - private class ArrayPatternTree extends ControlFlowTree instanceof ArrayPattern { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getClass() or - child = super.getPrefixElement(_) or - child = super.getRestVariableAccess() or - child = super.getSuffixElement(_) - } - - final override predicate first(AstNode first) { - first(super.getClass(), first) - or - not exists(super.getClass()) and first = this - } - - final override predicate last(AstNode last, Completion c) { - c.(MatchingCompletion).getValue() = false and - ( - last = this and - c.isValidFor(this) - or - exists(AstNode node | - node = super.getClass() or - node = super.getPrefixElement(_) or - node = super.getSuffixElement(_) - | - last(node, last, c) - ) - ) - or - c.(MatchingCompletion).getValue() = true and - last = this and - c.isValidFor(this) and - not exists(super.getPrefixElement(_)) and - not exists(super.getRestVariableAccess()) - or - c.(MatchingCompletion).getValue() = true and - last(max(int i | | super.getPrefixElement(i) order by i), last, c) and - not exists(super.getRestVariableAccess()) - or - last(super.getRestVariableAccess(), last, c) and - not exists(super.getSuffixElement(_)) - or - c.(MatchingCompletion).getValue() = true and - last(max(int i | | super.getSuffixElement(i) order by i), last, c) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getClass(), pred, c) and - succ = this and - c.(MatchingCompletion).getValue() = true - or - exists(AstNode next | - pred = this and - c.(MatchingCompletion).getValue() = true and - first(next, succ) - | - next = super.getPrefixElement(0) - or - not exists(super.getPrefixElement(_)) and - next = super.getRestVariableAccess() - ) - or - last(max(int i | | super.getPrefixElement(i) order by i), pred, c) and - first(super.getRestVariableAccess(), succ) and - c.(MatchingCompletion).getValue() = true - or - exists(int i | - last(super.getPrefixElement(i), pred, c) and - first(super.getPrefixElement(i + 1), succ) and - c.(MatchingCompletion).getValue() = true - ) - or - last(super.getRestVariableAccess(), pred, c) and - first(super.getSuffixElement(0), succ) and - c instanceof SimpleCompletion - or - exists(int i | - last(super.getSuffixElement(i), pred, c) and - first(super.getSuffixElement(i + 1), succ) and - c.(MatchingCompletion).getValue() = true - ) - } - } - - private class FindPatternTree extends ControlFlowTree instanceof FindPattern { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getClass() or - child = super.getPrefixVariableAccess() or - child = super.getElement(_) or - child = super.getSuffixVariableAccess() - } - - final override predicate first(AstNode first) { - first(super.getClass(), first) - or - not exists(super.getClass()) and first = this - } - - final override predicate last(AstNode last, Completion c) { - last(super.getSuffixVariableAccess(), last, c) - or - last(max(int i | | super.getElement(i) order by i), last, c) and - not exists(super.getSuffixVariableAccess()) - or - c.(MatchingCompletion).getValue() = false and - ( - last = this and - c.isValidFor(this) - or - exists(AstNode node | node = super.getClass() or node = super.getElement(_) | - last(node, last, c) - ) - ) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getClass(), pred, c) and - succ = this and - c.(MatchingCompletion).getValue() = true - or - exists(AstNode next | - pred = this and - c.(MatchingCompletion).getValue() = true and - first(next, succ) - | - next = super.getPrefixVariableAccess() - or - not exists(super.getPrefixVariableAccess()) and - next = super.getElement(0) - ) - or - last(super.getPrefixVariableAccess(), pred, c) and - first(super.getElement(0), succ) and - c instanceof SimpleCompletion - or - c.(MatchingCompletion).getValue() = true and - exists(int i | - last(super.getElement(i), pred, c) and - first(super.getElement(i + 1), succ) - ) - or - c.(MatchingCompletion).getValue() = true and - last(max(int i | | super.getElement(i) order by i), pred, c) and - first(super.getSuffixVariableAccess(), succ) - } - } - - private class HashPatternTree extends ControlFlowTree instanceof HashPattern { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getClass() or - child = super.getValue(_) or - child = super.getRestVariableAccess() - } - - final override predicate first(AstNode first) { - first(super.getClass(), first) - or - not exists(super.getClass()) and first = this - } - - final override predicate last(AstNode last, Completion c) { - c.(MatchingCompletion).getValue() = false and - ( - last = this and - c.isValidFor(this) - or - exists(AstNode node | - node = super.getClass() or - node = super.getValue(_) - | - last(node, last, c) - ) - ) - or - c.(MatchingCompletion).getValue() = true and - last = this and - not exists(super.getValue(_)) and - not exists(super.getRestVariableAccess()) - or - c.(MatchingCompletion).getValue() = true and - last(max(int i | | super.getValue(i) order by i), last, c) and - not exists(super.getRestVariableAccess()) - or - last(super.getRestVariableAccess(), last, c) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getClass(), pred, c) and - succ = this and - c.(MatchingCompletion).getValue() = true - or - exists(AstNode next | - pred = this and - c.(MatchingCompletion).getValue() = true and - first(next, succ) - | - next = super.getValue(0) - or - not exists(super.getValue(_)) and - next = super.getRestVariableAccess() - ) - or - last(max(int i | | super.getValue(i) order by i), pred, c) and - first(super.getRestVariableAccess(), succ) and - c.(MatchingCompletion).getValue() = true - or - exists(int i | - last(super.getValue(i), pred, c) and - first(super.getValue(i + 1), succ) and - c.(MatchingCompletion).getValue() = true - ) - } - } - - private class LineLiteralTree extends LeafTree instanceof LineLiteral { } - - private class FileLiteralTree extends LeafTree instanceof FileLiteral { } - - private class EncodingLiteralTree extends LeafTree instanceof EncodingLiteral { } - - private class AlternativePatternTree extends PreOrderTree instanceof AlternativePattern { - final override predicate propagatesAbnormal(AstNode child) { child = super.getAnAlternative() } - - final override predicate last(AstNode last, Completion c) { - last(super.getAnAlternative(), last, c) and - c.(MatchingCompletion).getValue() = true - or - last(max(int i | | super.getAlternative(i) order by i), last, c) and - c.(MatchingCompletion).getValue() = false - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - pred = this and - first(super.getAlternative(0), succ) and - c instanceof SimpleCompletion - or - exists(int i | - last(super.getAlternative(i), pred, c) and - first(super.getAlternative(i + 1), succ) and - c.(MatchingCompletion).getValue() = false - ) - } - } - - private class AsPatternTree extends PreOrderTree instanceof AsPattern { - final override predicate propagatesAbnormal(AstNode child) { child = super.getPattern() } - - final override predicate last(AstNode last, Completion c) { - last(super.getPattern(), last, c) and - c.(MatchingCompletion).getValue() = false - or - last(super.getVariableAccess(), last, any(SimpleCompletion x)) and - c.(MatchingCompletion).getValue() = true and - not c instanceof NestedCompletion - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - pred = this and - first(super.getPattern(), succ) and - c instanceof SimpleCompletion - or - last(super.getPattern(), pred, c) and - first(super.getVariableAccess(), succ) and - c.(MatchingCompletion).getValue() = true - } - } - - private class ParenthesizedPatternTree extends StandardPreOrderTree instanceof ParenthesizedPattern - { - override ControlFlowTree getChildNode(int i) { result = super.getPattern() and i = 0 } - } - - private class ReferencePatternTree extends StandardPreOrderTree instanceof ReferencePattern { - override ControlFlowTree getChildNode(int i) { result = super.getExpr() and i = 0 } - } - - private class InClauseTree extends PreOrderTree instanceof InClause { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getPattern() or - child = super.getCondition() - } - - private predicate lastCondition(AstNode last, BooleanCompletion c, boolean flag) { - last(super.getCondition(), last, c) and - ( - flag = true and super.hasIfCondition() - or - flag = false and super.hasUnlessCondition() - ) - } - - final override predicate last(AstNode last, Completion c) { - last(super.getPattern(), last, c) and - c.(MatchingCompletion).getValue() = false - or - exists(BooleanCompletion bc, boolean flag, MatchingCompletion mc | - this.lastCondition(last, bc, flag) and - c = - any(NestedMatchingCompletion nmc | - nmc.getInnerCompletion() = bc and nmc.getOuterCompletion() = mc - ) - | - mc.getValue() = false and - bc.getValue() = flag.booleanNot() - or - not exists(super.getBody()) and - mc.getValue() = true and - bc.getValue() = flag - ) - or - last(super.getBody(), last, c) - or - not exists(super.getBody()) and - not exists(super.getCondition()) and - last(super.getPattern(), last, c) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - pred = this and - first(super.getPattern(), succ) and - c instanceof SimpleCompletion - or - exists(Expr next | - last(super.getPattern(), pred, c) and - c.(MatchingCompletion).getValue() = true and - first(next, succ) - | - next = super.getCondition() - or - not exists(super.getCondition()) and next = super.getBody() - ) - or - exists(boolean flag | - this.lastCondition(pred, c, flag) and - c.(BooleanCompletion).getValue() = flag and - first(super.getBody(), succ) - ) - } - } - - private class CharacterTree extends LeafTree instanceof CharacterLiteral { } - - private class ClassDeclarationTree extends NamespaceTree instanceof ClassDeclaration { - /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i, boolean rescuable) { - result = super.getScopeExpr() and i = 0 and rescuable = false - or - result = super.getSuperclassExpr() and - i = count(super.getScopeExpr()) and - rescuable = true - or - result = - super - .getBodyChild(i - count(super.getScopeExpr()) - count(super.getSuperclassExpr()), - rescuable) - } - } - - private class ClassVariableTree extends LeafTree instanceof ClassVariableAccess { } - - private class ConditionalExprTree extends PostOrderTree instanceof ConditionalExpr { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getCondition() or child = super.getBranch(_) - } - - final override predicate first(AstNode first) { first(super.getCondition(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - exists(boolean b | - last(super.getCondition(), pred, c) and - b = c.(BooleanCompletion).getValue() - | - first(super.getBranch(b), succ) - or - not exists(super.getBranch(b)) and - succ = this - ) - or - last(super.getBranch(_), pred, c) and - succ = this and - c instanceof NormalCompletion - } - } - - private class ConditionalLoopTree extends PostOrderTree instanceof ConditionalLoop { - final override predicate propagatesAbnormal(AstNode child) { child = super.getCondition() } - - final override predicate first(AstNode first) { first(super.getCondition(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getCondition(), pred, c) and - super.entersLoopWhenConditionIs(c.(BooleanCompletion).getValue()) and - first(super.getBody(), succ) - or - last(super.getBody(), pred, c) and - first(super.getCondition(), succ) and - c.continuesLoop() - or - last(super.getBody(), pred, c) and - first(super.getBody(), succ) and - c instanceof RedoCompletion - or - succ = this and - ( - last(super.getCondition(), pred, c) and - super.entersLoopWhenConditionIs(c.(BooleanCompletion).getValue().booleanNot()) - or - last(super.getBody(), pred, c) and - not c.continuesLoop() and - not c instanceof BreakCompletion and - not c instanceof RedoCompletion - or - last(super.getBody(), pred, c.(NestedBreakCompletion).getAnInnerCompatibleCompletion()) - ) - } - } - - private class ConstantAccessTree extends PostOrderTree instanceof ConstantAccess { - ConstantAccessTree() { - not this instanceof ClassDeclaration and - not this instanceof ModuleDeclaration and - // constant accesses with scope expression in compound assignments are desugared - not ( - this = any(AssignOperation op).getLeftOperand() and - exists(super.getScopeExpr()) - ) - } - - final override predicate propagatesAbnormal(AstNode child) { child = super.getScopeExpr() } - - final override predicate first(AstNode first) { - first(super.getScopeExpr(), first) - or - not exists(super.getScopeExpr()) and - first = this - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getScopeExpr(), pred, c) and - succ = this and - c instanceof NormalCompletion - } - } - - /** A parameter that may have a default value. */ - abstract class DefaultValueParameterTree extends ControlFlowTree { - abstract Expr getDefaultValueExpr(); - - abstract AstNode getAccessNode(); - - predicate hasDefaultValue() { exists(this.getDefaultValueExpr()) } - - final override predicate propagatesAbnormal(AstNode child) { - child = this.getDefaultValueExpr() or child = this.getAccessNode() - } - - final override predicate first(AstNode first) { first = this.getAccessNode() } - - final override predicate last(AstNode last, Completion c) { - last(this.getDefaultValueExpr(), last, c) and - c instanceof NormalCompletion - or - last = this.getAccessNode() and - ( - not this.hasDefaultValue() and - c instanceof SimpleCompletion - or - this.hasDefaultValue() and - c.(MatchingCompletion).getValue() = true and - c.isValidFor(this) - ) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - pred = this.getAccessNode() and - first(this.getDefaultValueExpr(), succ) and - c.(MatchingCompletion).getValue() = false - } - } - - private class DestructuredParameterTree extends StandardPostOrderTree instanceof DestructuredParameter - { - final override ControlFlowTree getChildNode(int i) { result = super.getElement(i) } - } - - private class DesugaredTree extends ControlFlowTree { - ControlFlowTree desugared; - - DesugaredTree() { desugared = this.getDesugared() } - - final override predicate propagatesAbnormal(AstNode child) { - desugared.propagatesAbnormal(child) - } - - final override predicate first(AstNode first) { desugared.first(first) } - - final override predicate last(AstNode last, Completion c) { desugared.last(last, c) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { none() } - } - - private class DoBlockTree extends CallableTree instanceof DoBlock { - /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i) { - result = super.getParameter(i) - or - result = super.getLocalVariable(i - super.getNumberOfParameters()) - or - result = super.getBody() and - i = super.getNumberOfParameters() + count(super.getALocalVariable()) - } - } - - private class EmptyStatementTree extends LeafTree instanceof EmptyStmt { } - - class EndBlockTree extends StmtSequenceTree instanceof EndBlock { - override predicate first(AstNode first) { first = this } - - override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Normal left-to-right evaluation in the body - exists(int i | - last(super.getBodyChild(i, _), pred, c) and - first(super.getBodyChild(i + 1, _), succ) and - c instanceof NormalCompletion - ) - } - } - - private class ForwardedArgumentsTree extends LeafTree instanceof ForwardedArguments { } - - private class ForwardParameterTree extends LeafTree instanceof ForwardParameter { } - - private class GlobalVariableTree extends LeafTree instanceof GlobalVariableAccess { } - - private class HashSplatNilParameterTree extends LeafTree instanceof HashSplatNilParameter { } - - private class HashSplatParameterTree extends NonDefaultValueParameterTree instanceof HashSplatParameter - { } - - private class HereDocTree extends StandardPostOrderTree instanceof HereDoc { - final override ControlFlowTree getChildNode(int i) { result = super.getComponent(i) } - } - - private class InstanceVariableTree extends StandardPostOrderTree instanceof InstanceVariableAccess - { - final override ControlFlowTree getChildNode(int i) { result = super.getReceiver() and i = 0 } - } - - private class KeywordParameterTree extends DefaultValueParameterTree instanceof KeywordParameter { - final override Expr getDefaultValueExpr() { result = super.getDefaultValue() } - - final override AstNode getAccessNode() { result = super.getDefiningAccess() } - } - - private class LambdaTree extends CallableTree instanceof Lambda { - /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i) { - result = super.getParameter(i) - or - result = super.getBody() and i = super.getNumberOfParameters() - } - } - - private class LocalVariableAccessTree extends LeafTree instanceof LocalVariableAccess { } - - private class LogicalAndTree extends PostOrderTree instanceof LogicalAndExpr { - final override predicate propagatesAbnormal(AstNode child) { child = super.getAnOperand() } - - final override predicate first(AstNode first) { first(super.getLeftOperand(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getLeftOperand(), pred, c) and - c instanceof TrueCompletion and - first(super.getRightOperand(), succ) - or - last(super.getLeftOperand(), pred, c) and - c instanceof FalseCompletion and - succ = this - or - last(super.getRightOperand(), pred, c) and - c instanceof NormalCompletion and - succ = this - } - } - - private class LogicalNotTree extends PostOrderTree instanceof NotExpr { - final override predicate propagatesAbnormal(AstNode child) { child = super.getOperand() } - - final override predicate first(AstNode first) { first(super.getOperand(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - succ = this and - last(super.getOperand(), pred, c) and - c instanceof NormalCompletion - } - } - - private class LogicalOrTree extends PostOrderTree instanceof LogicalOrExpr { - final override predicate propagatesAbnormal(AstNode child) { child = super.getAnOperand() } - - final override predicate first(AstNode first) { first(super.getLeftOperand(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getLeftOperand(), pred, c) and - c instanceof FalseCompletion and - first(super.getRightOperand(), succ) - or - last(super.getLeftOperand(), pred, c) and - c instanceof TrueCompletion and - succ = this - or - last(super.getRightOperand(), pred, c) and - c instanceof NormalCompletion and - succ = this - } - } - - private class MethodCallTree extends CallTree instanceof MethodCall { - final override ControlFlowTree getChildNode(int i) { - result = super.getReceiver() and i = 0 - or - result = super.getArgument(i - 1) - or - result = super.getBlock() and i = 1 + super.getNumberOfArguments() - } - } - - private class MethodNameTree extends LeafTree instanceof MethodName, AstInternal::TTokenMethodName - { } - - private class MethodTree extends CallableTree instanceof Method { - /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i) { - result = super.getParameter(i) - or - result = super.getBody() and i = super.getNumberOfParameters() - } - } - - private class ModuleDeclarationTree extends NamespaceTree instanceof ModuleDeclaration { - /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i, boolean rescuable) { - result = super.getScopeExpr() and i = 0 and rescuable = false - or - result = NamespaceTree.super.getBodyChild(i - count(super.getScopeExpr()), rescuable) - } - } - - /** - * Namespaces (i.e. modules or classes) behave like other `BodyStmt`s except they are - * executed in pre-order rather than post-order. We do this in order to insert a write for - * `self` before any subsequent reads in the namespace body. - */ - private class NamespaceTree extends BodyStmtTree instanceof Namespace { - final override predicate first(AstNode first) { first = this } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - BodyStmtTree.super.succ(pred, succ, c) - or - pred = this and - super.first(succ) and - c instanceof SimpleCompletion - } - - final override predicate last(AstNode last, Completion c) { - super.last(last, c) - or - not exists(this.getAChild(_)) and - last = this and - c.isValidFor(this) - } - } - - private class NilTree extends LeafTree instanceof NilLiteral { } - - private class NumericLiteralTree extends LeafTree instanceof NumericLiteral { } - - private class OptionalParameterTree extends DefaultValueParameterTree instanceof OptionalParameter - { - final override Expr getDefaultValueExpr() { result = super.getDefaultValue() } - - final override AstNode getAccessNode() { result = super.getDefiningAccess() } - } - - private class PairTree extends StandardPostOrderTree instanceof Pair { - final override ControlFlowTree getChildNode(int i) { - result = super.getKey() and i = 0 - or - result = super.getValue() and i = 1 - } - } - - private class RangeLiteralTree extends StandardPostOrderTree instanceof RangeLiteral { - final override ControlFlowTree getChildNode(int i) { - result = super.getBegin() and i = 0 - or - result = super.getEnd() and i = 1 - } - } - - private class RedoStmtTree extends LeafTree instanceof RedoStmt { } - - private class RescueModifierTree extends PostOrderTree instanceof RescueModifierExpr { - final override predicate propagatesAbnormal(AstNode child) { child = super.getHandler() } - - final override predicate first(AstNode first) { first(super.getBody(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getBody(), pred, c) and - ( - c instanceof RaiseCompletion and - first(super.getHandler(), succ) - or - not c instanceof RaiseCompletion and - succ = this - ) - or - last(super.getHandler(), pred, c) and - c instanceof NormalCompletion and - succ = this - } - } - - private class RescueTree extends PostOrderTree instanceof RescueClause { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getAnException() or - child = super.getBody() - } - - final override predicate first(AstNode first) { - first(super.getException(0), first) - or - not exists(super.getException(0)) and - ( - first(super.getVariableExpr(), first) - or - not exists(super.getVariableExpr()) and - ( - first(super.getBody(), first) - or - not exists(super.getBody()) and first = this - ) - ) - } - - private Expr getLastException() { - exists(int i | result = super.getException(i) and not exists(super.getException(i + 1))) - } - - predicate lastNoMatch(AstNode last, Completion c) { - last(this.getLastException(), last, c) and - c.(MatchingCompletion).getValue() = false - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getAnException(), pred, c) and - c.(MatchingCompletion).getValue() = true and - ( - first(super.getVariableExpr(), succ) - or - not exists(super.getVariableExpr()) and - ( - first(super.getBody(), succ) - or - not exists(super.getBody()) and succ = this - ) - ) - or - exists(int i | - last(super.getException(i), pred, c) and - c.(MatchingCompletion).getValue() = false and - first(super.getException(i + 1), succ) - ) - or - last(super.getVariableExpr(), pred, c) and - c instanceof NormalCompletion and - ( - first(super.getBody(), succ) - or - not exists(super.getBody()) and succ = this - ) - or - last(super.getBody(), pred, c) and - c instanceof NormalCompletion and - succ = this - } - } - - private class RetryStmtTree extends LeafTree instanceof RetryStmt { } - - private class ReturningStmtTree extends StandardPostOrderTree instanceof ReturningStmt { - final override ControlFlowTree getChildNode(int i) { result = super.getValue() and i = 0 } - } - - private class SimpleParameterTree extends NonDefaultValueParameterTree instanceof SimpleParameter { - } - - // Corner case: For duplicated '_' parameters, only the first occurrence has a defining - // access. For subsequent parameters we simply include the parameter itself in the CFG - private class SimpleParameterTreeDupUnderscore extends LeafTree instanceof SimpleParameter { - SimpleParameterTreeDupUnderscore() { not exists(this.getDefiningAccess()) } - } - - private class SingletonClassTree extends BodyStmtTree instanceof SingletonClass { - final override predicate first(AstNode first) { - super.first(first) - or - not exists(this.getAChild(_)) and - first = this - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - BodyStmtTree.super.succ(pred, succ, c) - or - succ = this and - super.last(pred, c) - } - - final override predicate last(AstNode last, Completion c) { - last = this and - c.isValidFor(this) - } - - /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i, boolean rescuable) { - ( - result = super.getValue() and i = 0 and rescuable = false - or - result = BodyStmtTree.super.getBodyChild(i - 1, rescuable) - ) - } - } - - private class SingletonMethodTree extends CallableTree instanceof SingletonMethod { - /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i) { - result = super.getParameter(i) - or - result = super.getBody() and i = super.getNumberOfParameters() - } - - override predicate first(AstNode first) { first(super.getObject(), first) } - - override predicate succ(AstNode pred, AstNode succ, Completion c) { - CallableTree.super.succ(pred, succ, c) - or - last(super.getObject(), pred, c) and - succ = this and - c instanceof NormalCompletion - } - } - - private class SplatParameterTree extends NonDefaultValueParameterTree instanceof SplatParameter { - } - - class StmtSequenceTree extends PostOrderTree instanceof StmtSequence { - override predicate propagatesAbnormal(AstNode child) { child = super.getAStmt() } - - override predicate first(AstNode first) { - // If this sequence contains any statements, go to the first one. - first(super.getStmt(0), first) - or - // Otherwise, treat this node as a leaf node. - not exists(super.getStmt(0)) and first = this - } - - /** Gets the `i`th child in the body of this body statement. */ - AstNode getBodyChild(int i, boolean rescuable) { - result = super.getStmt(i) and - rescuable = true - } - - final AstNode getLastBodyChild() { - exists(int i | - result = this.getBodyChild(i, _) and - not exists(this.getBodyChild(i + 1, _)) - ) - } - - override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Normal left-to-right evaluation in the body - exists(int i | - last(this.getBodyChild(i, _), pred, c) and - first(this.getBodyChild(i + 1, _), succ) and - c instanceof NormalCompletion - ) - or - succ = this and - last(this.getLastBodyChild(), pred, c) and - c instanceof NormalCompletion - } - } - - private class StringConcatenationTree extends StandardPostOrderTree instanceof StringConcatenation - { - final override ControlFlowTree getChildNode(int i) { result = super.getString(i) } - } - - private class StringlikeLiteralTree extends StandardPostOrderTree instanceof StringlikeLiteral { - StringlikeLiteralTree() { - not this instanceof HereDoc and - not this instanceof AstInternal::TSimpleSymbolLiteralSynth - } - - final override ControlFlowTree getChildNode(int i) { result = super.getComponent(i) } - } - - private class StringComponentTree extends LeafTree instanceof StringComponent { - StringComponentTree() { - // Interpolations contain `StmtSequence`s, so they shouldn't be treated as leaf nodes. - not this instanceof StringInterpolationComponent and - // In the interests of brevity we treat regexes as string literals when constructing the CFG. - // Thus we must exclude regex interpolations here too. - not this instanceof RegExpInterpolationComponent - } - } - - private class ToplevelTree extends BodyStmtTree instanceof Toplevel { - final override AstNode getBodyChild(int i, boolean rescuable) { - result = super.getBeginBlock(i) and rescuable = true - or - result = BodyStmtTree.super.getBodyChild(i - count(super.getABeginBlock()), rescuable) - } - } - - private class UndefStmtTree extends StandardPreOrderTree instanceof UndefStmt { - final override ControlFlowTree getChildNode(int i) { result = super.getMethodName(i) } - } - - private class WhenTree extends ControlFlowTree instanceof WhenClause { - final override predicate propagatesAbnormal(AstNode child) { - child = [super.getAPattern(), super.getBody()] - } - - final Expr getLastPattern() { - exists(int i | - result = super.getPattern(i) and - not exists(super.getPattern(i + 1)) - ) - } - - final override predicate first(AstNode first) { first(super.getPattern(0), first) } - - final override predicate last(AstNode last, Completion c) { - last = this and - c.isValidFor(this) and - c.(ConditionalCompletion).getValue() = false - or - last(super.getBody(), last, c) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - pred = this and - c.isValidFor(this) and - c.(ConditionalCompletion).getValue() = true and - first(super.getBody(), succ) - or - exists(int i, Expr p, boolean b | - p = super.getPattern(i) and - last(p, pred, c) and - b = c.(ConditionalCompletion).getValue() - | - b = true and - succ = this - or - b = false and - first(super.getPattern(i + 1), succ) - or - not exists(super.getPattern(i + 1)) and - succ = this - ) - } - } -} - -private Scope parent(Scope n) { - result = n.getOuterScope() and - not n instanceof CfgScopeImpl -} - -cached -private CfgScope getCfgScopeImpl(AstNode n) { result = parent*(scopeOfInclSynth(n)) } - -/** Gets the CFG scope of node `n`. */ -pragma[inline] -CfgScope getCfgScope(AstNode n) { - exists(AstNode n0 | - pragma[only_bind_into](n0) = n and - pragma[only_bind_into](result) = getCfgScopeImpl(n0) - ) -} diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/Guards.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/Guards.qll index 387fb03dc9a8..e1f2e2397729 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/Guards.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/internal/Guards.qll @@ -6,9 +6,15 @@ private import codeql.ruby.CFG /** Holds if the guard `guard` controls block `bb` upon evaluating to `branch`. */ pragma[nomagic] predicate guardControlsBlock(CfgNodes::AstCfgNode guard, BasicBlock bb, boolean branch) { - exists(ConditionBlock conditionBlock, ConditionalSuccessor s | + exists(BasicBlock conditionBlock, ConditionalSuccessor s | guard = conditionBlock.getLastNode() and s.getValue() = branch and conditionBlock.edgeDominates(bb, s) ) + or + exists(ConditionalSuccessor s, ControlFlowNode guardNode | + guardNode.isAfterValue(guard.getAstNode(), s) and + s.getValue() = branch and + guardNode.getBasicBlock().dominates(bb) + ) } diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/NonReturning.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/NonReturning.qll index 45b299a5d2b7..36061ea5f635 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/NonReturning.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/internal/NonReturning.qll @@ -3,22 +3,22 @@ overlay[local] module; private import codeql.ruby.AST -private import Completion +private import codeql.controlflow.SuccessorType /** A call that definitely does not return (conservative analysis). */ abstract class NonReturningCall extends MethodCall { - /** Gets a valid completion for this non-returning call. */ - abstract Completion getACompletion(); + /** Gets a valid successor type for this non-returning call. */ + abstract AbruptSuccessor getASuccessorType(); } private class RaiseCall extends NonReturningCall { RaiseCall() { this.getMethodName() = "raise" } - override RaiseCompletion getACompletion() { not result instanceof NestedCompletion } + override ExceptionSuccessor getASuccessorType() { any() } } private class ExitCall extends NonReturningCall { ExitCall() { this.getMethodName() in ["abort", "exit"] } - override ExitCompletion getACompletion() { not result instanceof NestedCompletion } + override ExitSuccessor getASuccessorType() { any() } } diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll deleted file mode 100644 index 737f450b4f23..000000000000 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll +++ /dev/null @@ -1,348 +0,0 @@ -/** - * Provides classes and predicates relevant for splitting the control flow graph. - */ -overlay[local] -module; - -private import codeql.ruby.AST as Ast -private import Completion as Comp -private import Comp -private import ControlFlowGraphImpl -private import codeql.ruby.controlflow.ControlFlowGraph - -cached -private module Cached { - cached - newtype TSplitKind = - TConditionalCompletionSplitKind() { forceCachingInSameStage() } or - TEnsureSplitKind(int nestLevel) { nestLevel = any(Trees::BodyStmtTree t).getNestLevel() } - - cached - newtype TSplit = - TConditionalCompletionSplit(ConditionalCompletion c) or - TEnsureSplit(EnsureSplitting::EnsureSplitType type, int nestLevel) { - nestLevel = any(Trees::BodyStmtTree t).getNestLevel() - } -} - -import Cached - -/** A split for a control flow node. */ -class Split extends TSplit { - /** Gets a textual representation of this split. */ - string toString() { none() } -} - -module ConditionalCompletionSplitting { - /** - * A split for conditional completions. For example, in - * - * ```rb - * def method x - * if x < 2 and x > 0 - * puts "x is 1" - * end - * end - * ``` - * - * we record whether `x < 2` and `x > 0` evaluate to `true` or `false`, and - * restrict the edges out of `x < 2 and x > 0` accordingly. - */ - class ConditionalCompletionSplit extends Split, TConditionalCompletionSplit { - ConditionalCompletion completion; - - ConditionalCompletionSplit() { this = TConditionalCompletionSplit(completion) } - - ConditionalCompletion getCompletion() { result = completion } - - override string toString() { result = completion.toString() } - } - - private class ConditionalCompletionSplitKind_ extends SplitKind, TConditionalCompletionSplitKind { - override int getListOrder() { result = 0 } - - override predicate isEnabled(AstNode n) { this.appliesTo(n) } - - override string toString() { result = "ConditionalCompletion" } - } - - module ConditionalCompletionSplittingInput { - private import Completion as Comp - - class ConditionalCompletion = Comp::ConditionalCompletion; - - class ConditionalCompletionSplitKind extends ConditionalCompletionSplitKind_, TSplitKind { } - - class ConditionalCompletionSplit = ConditionalCompletionSplitting::ConditionalCompletionSplit; - - bindingset[parent, parentCompletion] - predicate condPropagateExpr( - AstNode parent, ConditionalCompletion parentCompletion, AstNode child, - ConditionalCompletion childCompletion - ) { - child = parent.(Ast::NotExpr).getOperand() and - childCompletion.(BooleanCompletion).getDual() = parentCompletion - or - childCompletion = parentCompletion and - ( - child = parent.(Ast::LogicalAndExpr).getAnOperand() - or - child = parent.(Ast::LogicalOrExpr).getAnOperand() - or - child = parent.(Ast::StmtSequence).getLastStmt() - or - child = parent.(Ast::ConditionalExpr).getBranch(_) - ) - } - } - - int getNextListOrder() { result = 1 } - - private class ConditionalCompletionSplitImpl extends SplitImplementations::ConditionalCompletionSplitting::ConditionalCompletionSplitImpl - { - override predicate hasEntry(AstNode pred, AstNode succ, Completion c) { - super.hasEntry(pred, succ, c) - or - // a non-standard case is needed for `when` clauses - succ(pred, succ, c) and - succ instanceof Ast::WhenClause and - c = this.getCompletion() - } - } -} - -class ConditionalCompletionSplit = ConditionalCompletionSplitting::ConditionalCompletionSplit; - -module EnsureSplitting { - /** - * The type of a split `ensure` node. - * - * The type represents one of the possible ways of entering an `ensure` - * block. For example, if a block ends with a `return` statement, then - * the `ensure` block must end with a `return` as well (provided that - * the `ensure` block executes normally). - */ - class EnsureSplitType extends SuccessorType { - EnsureSplitType() { not this instanceof ConditionalSuccessor } - - /** Holds if this split type matches entry into an `ensure` block with completion `c`. */ - predicate isSplitForEntryCompletion(Completion c) { - if c instanceof NormalCompletion - then - // If the entry into the `ensure` block completes with any normal completion, - // it simply means normal execution after the `ensure` block - this instanceof DirectSuccessor - else this = c.getAMatchingSuccessorType() - } - } - - /** A node that belongs to an `ensure` block. */ - private class EnsureNode extends AstNode { - private Trees::BodyStmtTree block; - - EnsureNode() { this = block.getAnEnsureDescendant() } - - int getNestLevel() { result = block.getNestLevel() } - - /** Holds if this node is the entry node in the `ensure` block it belongs to. */ - predicate isEntryNode() { first(block.getEnsure(), this) } - - Ast::BodyStmt getBlock() { result = block } - - pragma[noinline] - predicate isEntered(AstNode pred, int nestLevel, Completion c) { - this.isEntryNode() and - nestLevel = this.getNestLevel() and - succ(pred, this, c) and - // the entry node may be reachable via a backwards loop edge; in this case - // the split has already been entered - not pred = block.getAnEnsureDescendant() - } - } - - /** - * A split for nodes belonging to an `ensure` block, which determines how to - * continue execution after leaving the `ensure` block. For example, in - * - * ```rb - * begin - * if x - * raise "Exception" - * end - * ensure - * puts "Ensure" - * end - * ``` - * - * all control flow nodes in the `ensure` block have two splits: one representing - * normal execution of the body (when `x` evaluates to `true`), and one representing - * exceptional execution of the body (when `x` evaluates to `false`). - */ - class EnsureSplit extends Split, TEnsureSplit { - private EnsureSplitType type; - private int nestLevel; - - EnsureSplit() { this = TEnsureSplit(type, nestLevel) } - - /** - * Gets the type of this `ensure` split, that is, how to continue execution after the - * `ensure` block. - */ - EnsureSplitType getType() { result = type } - - /** Gets the nesting level. */ - int getNestLevel() { result = nestLevel } - - override string toString() { - if type instanceof DirectSuccessor - then result = "" - else - if nestLevel > 0 - then result = "ensure(" + nestLevel + "): " + type.toString() - else result = "ensure: " + type.toString() - } - } - - private int getListOrder(EnsureSplitKind kind) { - result = ConditionalCompletionSplitting::getNextListOrder() + kind.getNestLevel() - } - - int getNextListOrder() { - result = max([getListOrder(_) + 1, ConditionalCompletionSplitting::getNextListOrder()]) - } - - private class EnsureSplitKind extends SplitKind, TEnsureSplitKind { - private int nestLevel; - - EnsureSplitKind() { this = TEnsureSplitKind(nestLevel) } - - /** Gets the nesting level. */ - int getNestLevel() { result = nestLevel } - - override int getListOrder() { result = getListOrder(this) } - - override string toString() { result = "ensure (" + nestLevel + ")" } - } - - private class EnsureSplitImpl extends SplitImpl instanceof EnsureSplit { - override EnsureSplitKind getKind() { result.getNestLevel() = super.getNestLevel() } - - override predicate hasEntry(AstNode pred, AstNode succ, Completion c) { - succ.(EnsureNode).isEntered(pred, super.getNestLevel(), c) and - super.getType().isSplitForEntryCompletion(c) - } - - override predicate hasEntryScope(CfgScope scope, AstNode first) { none() } - - /** - * Holds if this split applies to `pred`, where `pred` is a valid predecessor. - */ - private predicate appliesToPredecessor(AstNode pred) { - this.appliesTo(pred) and - (succ(pred, _, _) or succExit(_, pred, _)) - } - - pragma[noinline] - private predicate exit0(AstNode pred, Trees::BodyStmtTree block, int nestLevel, Completion c) { - this.appliesToPredecessor(pred) and - nestLevel = block.getNestLevel() and - block.last(pred, c) - } - - /** - * Holds if `pred` may exit this split with completion `c`. The Boolean - * `inherited` indicates whether `c` is an inherited completion from the - * body. - */ - private predicate exit(AstNode pred, Completion c, boolean inherited) { - exists(Trees::BodyStmtTree block, EnsureSplitType type | - this.exit0(pred, block, super.getNestLevel(), c) and - type = super.getType() - | - if last(block.getEnsure(), pred, c) - then - // `ensure` block can itself exit with completion `c`: either `c` must - // match this split, `c` must be an abnormal completion, or this split - // does not require another completion to be recovered - inherited = false and - ( - type = c.getAMatchingSuccessorType() - or - not c instanceof NormalCompletion - or - type instanceof DirectSuccessor - ) - else ( - // `ensure` block can exit with inherited completion `c`, which must - // match this split - inherited = true and - type = c.getAMatchingSuccessorType() and - not type instanceof DirectSuccessor - ) - ) - or - // If this split is normal, and an outer split can exit based on an inherited - // completion, we need to exit this split as well. For example, in - // - // ```rb - // def m(b1, b2) - // if b1 - // return - // end - // ensure - // begin - // if b2 - // raise "Exception" - // end - // ensure - // puts "inner ensure" - // end - // end - // ``` - // - // if the outer split for `puts "inner ensure"` is `return` and the inner split - // is "normal" (corresponding to `b1 = true` and `b2 = false`), then the inner - // split must be able to exit with a `return` completion. - this.appliesToPredecessor(pred) and - exists(EnsureSplitImpl outer | - outer.(EnsureSplit).getNestLevel() = super.getNestLevel() - 1 and - outer.exit(pred, c, inherited) and - super.getType() instanceof DirectSuccessor and - inherited = true - ) - } - - override predicate hasExit(AstNode pred, AstNode succ, Completion c) { - succ(pred, succ, c) and - ( - this.exit(pred, c, _) - or - this.exit(pred, c.(NestedBreakCompletion).getAnInnerCompatibleCompletion(), _) - ) - } - - override predicate hasExitScope(CfgScope scope, AstNode last, Completion c) { - succExit(scope, last, c) and - ( - this.exit(last, c, _) - or - this.exit(last, c.(NestedBreakCompletion).getAnInnerCompatibleCompletion(), _) - ) - } - - override predicate hasSuccessor(AstNode pred, AstNode succ, Completion c) { - this.appliesToPredecessor(pred) and - succ(pred, succ, c) and - succ = - any(EnsureNode en | - if en.isEntryNode() and en.getBlock() != pred.(EnsureNode).getBlock() - then - // entering a nested `ensure` block - en.getNestLevel() > super.getNestLevel() - else - // staying in the same (possibly nested) `ensure` block as `pred` - en.getNestLevel() >= super.getNestLevel() - ) - } - } -} diff --git a/ruby/ql/lib/codeql/ruby/dataflow/SSA.qll b/ruby/ql/lib/codeql/ruby/dataflow/SSA.qll index 08ca08732b6b..d95740a8c867 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/SSA.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/SSA.qll @@ -384,20 +384,7 @@ module Ssa { inp = SsaImpl::phiHasInputFromBlock(this, bb) } - private string getSplitString() { - result = this.getBasicBlock().getFirstNode().(CfgNodes::AstCfgNode).getSplitsString() - } - - override string toString() { - exists(string prefix | - prefix = "[" + this.getSplitString() + "] " - or - not exists(this.getSplitString()) and - prefix = "" - | - result = prefix + "phi" - ) - } + override string toString() { result = "phi" } /* * The location of a phi node is the same as the location of the first node diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll index 3c647f41bbbe..3d3e8a4d0d04 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll @@ -183,7 +183,7 @@ class NormalCall extends DataFlowCall, TNormalCall { override CfgNodes::ExprNodes::CallCfgNode asCall() { result = c } - override DataFlowCallable getEnclosingCallable() { result = TCfgScope(c.getScope()) } + override DataFlowCallable getEnclosingCallable() { result = TCfgScope(c.getEnclosingCallable()) } override string toString() { result = c.toString() } @@ -700,7 +700,7 @@ private CfgScope privateFilter(DataFlowCall call) { // This may remove some plausible targets, but also removes a lot of // implausible targets ( - isToplevelMethodInFile(result, call.asCall().getFile()) or + isToplevelMethodInFile(result, call.asCall().getLocation().getFile()) or not isToplevelMethodInFile(result, _) ) } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll index c4b696532b66..10dab22ca193 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll @@ -95,7 +95,7 @@ CfgNodes::ExprCfgNode getPostUpdateReverseStep(CfgNodes::ExprCfgNode e) { pragma[nomagic] Ssa::Definition getParameterDef(NamedParameter p) { exists(BasicBlock bb, int i | - bb.getNode(i).getAstNode() = p.getDefiningAccess() and + bb.getNode(i).injects(p.getDefiningAccess()) and result.definesAt(_, bb, i) ) } @@ -159,7 +159,7 @@ module LocalFlow { exprTo = nodeTo.asExpr() and n.getReturningNode().getAstNode() instanceof BreakStmt and exprTo.getAstNode() instanceof Loop and - nodeTo.asExpr().getAPredecessor(any(BreakSuccessor s)) = n.getReturningNode() + n.getReturningNode().getASuccessor(any(BreakSuccessor s)).getAstNode() = exprTo.getAstNode() ) or nodeFrom.asExpr() = nodeTo.(ReturningStatementNode).getReturningNode().getReturnedValueNode() @@ -285,7 +285,6 @@ predicate isNonConstantExpr(CfgNodes::ExprCfgNode n) { /** Provides logic related to captured variables. */ module VariableCapture { private import codeql.dataflow.VariableCapture as Shared - private import codeql.ruby.controlflow.BasicBlocks as BasicBlocks private predicate closureFlowStep(CfgNodes::ExprCfgNode e1, CfgNodes::ExprCfgNode e2) { e1 = getALastEvalNode(e2) @@ -296,13 +295,11 @@ module VariableCapture { ) } - private module CaptureInput implements Shared::InputSig { + private module CaptureInput implements Shared::InputSig { private import codeql.ruby.controlflow.ControlFlowGraph as Cfg private import TaintTrackingPrivate as TaintTrackingPrivate - Callable basicBlockGetEnclosingCallable(BasicBlocks::Cfg::BasicBlock bb) { - result = bb.getScope() - } + Callable basicBlockGetEnclosingCallable(BasicBlock bb) { result = bb.getScope() } class CapturedVariable extends LocalVariable { CapturedVariable() { @@ -374,7 +371,7 @@ module VariableCapture { class ClosureExpr = CaptureInput::ClosureExpr; - module Flow = Shared::Flow; + module Flow = Shared::Flow; private Flow::ClosureNode asClosureNode(Node n) { result = n.(CaptureNode).getSynthesizedCaptureNode() @@ -864,7 +861,7 @@ class ReturningStatementNode extends NodeImpl, TReturningNode { /** Gets the expression corresponding to this node. */ CfgNodes::ReturningCfgNode getReturningNode() { result = n } - override CfgScope getCfgScopeImpl() { result = n.getScope() } + override CfgScope getCfgScopeImpl() { result = n.getEnclosingCallable() } override Location getLocationImpl() { result = n.getLocation() } @@ -1364,7 +1361,7 @@ module ArgumentNodes { this.sourceArgumentOf(call.asCall(), pos) } - override CfgScope getCfgScopeImpl() { result = yield.getScope() } + override CfgScope getCfgScopeImpl() { result = yield.getEnclosingCallable() } override Location getLocationImpl() { result = yield.getLocation() } } @@ -1394,7 +1391,7 @@ module ArgumentNodes { this.sourceArgumentOf(call.asCall(), pos) } - override CfgScope getCfgScopeImpl() { result = sup.getScope() } + override CfgScope getCfgScopeImpl() { result = sup.getEnclosingCallable() } override Location getLocationImpl() { result = sup.getLocation() } } @@ -1617,7 +1614,7 @@ private module ReturnNodes { private predicate isValid(CfgNodes::ReturningCfgNode node) { exists(ReturningStmt stmt, Callable scope | stmt = node.getAstNode() and - scope = node.getScope() + scope = node.getEnclosingCallable() | stmt instanceof ReturnStmt and (scope instanceof Method or scope instanceof SingletonMethod or scope instanceof Lambda) @@ -1637,8 +1634,8 @@ private module ReturnNodes { class ExplicitReturnNode extends SourceReturnNode, ReturningStatementNode { ExplicitReturnNode() { isValid(n) and - n.getASuccessor().(CfgNodes::AnnotatedExitNode).isNormal() and - n.getScope() instanceof Callable + n.getASuccessor() instanceof ControlFlow::NormalExitNode and + n.getEnclosingCallable() instanceof Callable } override ReturnKind getKindSource() { @@ -2414,9 +2411,7 @@ module TypeInference { private predicate hasTypeCheckedRead( Ssa::Definition def, CfgNodes::ExprCfgNode caseRead, CfgNodes::ExprCfgNode read, Module m ) { - exists( - CfgNodes::ExprCfgNode pattern, ConditionBlock cb, CfgNodes::ExprNodes::CaseExprCfgNode case - | + exists(CfgNodes::ExprCfgNode pattern, BasicBlock cb, CfgNodes::ExprNodes::CaseExprCfgNode case | m = resolveConstantReadAccess(pattern.getExpr()) and cb.getLastNode() = pattern and cb.edgeDominates(read.getBasicBlock(), any(MatchingSuccessor match | match.getValue() = true)) and diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll index 74394150ca32..9f5dfd9dcc25 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll @@ -4,13 +4,11 @@ module; private import codeql.ssa.Ssa as SsaImplCommon private import codeql.ruby.AST private import codeql.ruby.CFG as Cfg -private import codeql.ruby.controlflow.BasicBlocks as BasicBlocks -private import codeql.ruby.controlflow.internal.ControlFlowGraphImpl as ControlFlowGraphImpl private import codeql.ruby.dataflow.SSA private import codeql.ruby.ast.Variable private import Cfg::CfgNodes::ExprNodes -private class BasicBlock = BasicBlocks::Cfg::BasicBlock; +private class BasicBlock = Cfg::BasicBlock; module SsaInput implements SsaImplCommon::InputSig { private import codeql.ruby.controlflow.ControlFlowGraph as Cfg @@ -25,11 +23,11 @@ module SsaInput implements SsaImplCommon::InputSig { ( exists(Scope scope | scope = v.(SelfVariable).getDeclaringScope() | // We consider the `self` variable to have a single write at the entry to a method block... - scope = bb.(BasicBlocks::EntryBasicBlock).getScope() and + scope = bb.(Cfg::EntryBasicBlock).getScope() and i = 0 or // ...or a class or module block. - bb.getNode(i).getAstNode() = scope.(ModuleBase).getAControlFlowEntryNode() and + bb.getNode(i).isBefore(scope.(ModuleBase)) and not scope instanceof Toplevel // handled by case above ) or @@ -60,7 +58,7 @@ module SsaInput implements SsaImplCommon::InputSig { } } -import SsaImplCommon::Make as Impl +import SsaImplCommon::Make as Impl class Definition = Impl::Definition; @@ -98,12 +96,17 @@ private predicate writesCapturedVariable(Cfg::BasicBlock bb, LocalVariable v) { ) } +private predicate isAnnotatedExitBlock(BasicBlock bb) { + bb.getANode() instanceof Cfg::ControlFlow::AnnotatedExitNode +} + /** * Holds if a pseudo read of captured variable `v` should be inserted * at index `i` in exit block `bb`. */ -private predicate capturedExitRead(Cfg::AnnotatedExitBasicBlock bb, int i, LocalVariable v) { +private predicate capturedExitRead(BasicBlock bb, int i, LocalVariable v) { writesCapturedVariable(bb.getAPredecessor*(), v) and + isAnnotatedExitBlock(bb) and i = bb.length() } @@ -112,13 +115,11 @@ private predicate capturedExitRead(Cfg::AnnotatedExitBasicBlock bb, int i, Local * at index `i` in basic block `bb`. We do this to ensure that namespace * self-variables always get an SSA definition. */ -private predicate namespaceSelfExitRead(Cfg::AnnotatedExitBasicBlock bb, int i, SelfVariable v) { - exists(Namespace ns, AstNode last | +private predicate namespaceSelfExitRead(BasicBlock bb, int i, SelfVariable v) { + exists(Namespace ns, Cfg::ControlFlowNode n | v.getDeclaringScope() = ns and - last = ControlFlowGraphImpl::getAControlFlowExitNode(ns) and - if last = ns - then bb.getNode(i).getAPredecessor().getAstNode() = last - else bb.getNode(i).getAstNode() = last + n.isAfter(ns) and + if n.isBefore(ns) then bb.getNode(i - 1) = n else bb.getNode(i) = n ) } @@ -129,7 +130,8 @@ private predicate namespaceSelfExitRead(Cfg::AnnotatedExitBasicBlock bb, int i, pragma[noinline] private predicate hasCapturedRead(Variable v, Cfg::CfgScope scope) { any(LocalVariableReadAccessCfgNode read | - read.getVariable() = v and scope = read.getScope().getOuterCfgScope*() + read.getVariable() = v and + scope = read.getEnclosingCallable().(Cfg::CfgScope).getOuterCfgScope*() ).getExpr().isCapturedAccess() } @@ -177,7 +179,7 @@ private predicate capturedCallRead(CallCfgNode call, Cfg::BasicBlock bb, int i, private predicate variableReadActual(Cfg::BasicBlock bb, int i, LocalVariable v) { exists(VariableReadAccess read | read.getVariable() = v and - read = bb.getNode(i).getAstNode() + bb.getNode(i).injects(read) ) } @@ -188,7 +190,8 @@ private predicate variableReadActual(Cfg::BasicBlock bb, int i, LocalVariable v) pragma[noinline] private predicate hasCapturedWrite(Variable v, Cfg::CfgScope scope) { any(LocalVariableWriteAccessCfgNode write | - write.getVariable() = v and scope = write.getScope().getOuterCfgScope*() + write.getVariable() = v and + scope = write.getEnclosingCallable().(Cfg::CfgScope).getOuterCfgScope*() ).getExpr().isCapturedAccess() } @@ -393,7 +396,7 @@ class NormalParameter extends Parameter { pragma[nomagic] Definition getParameterDef(NamedParameter p) { exists(Cfg::BasicBlock bb, int i | - bb.getNode(i).getAstNode() = p.getDefiningAccess() and + bb.getNode(i).injects(p.getDefiningAccess()) and result.definesAt(_, bb, i) ) } diff --git a/ruby/ql/lib/codeql/ruby/frameworks/Sinatra.qll b/ruby/ql/lib/codeql/ruby/frameworks/Sinatra.qll index eabee2ea5133..3ffdb915c6f3 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/Sinatra.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/Sinatra.qll @@ -289,7 +289,7 @@ module Sinatra { private predicate blockPostSelf(DataFlow::PostUpdateNode n, DataFlow::BlockNode b) { exists(SelfVariableAccessCfgNode self | n.getPreUpdateNode().asExpr() = self and - self.getScope() = b.asExpr().getAstNode() + self.getEnclosingCallable() = b.asExpr().getAstNode() ) } diff --git a/ruby/ql/lib/codeql/ruby/security/ConditionalBypassCustomizations.qll b/ruby/ql/lib/codeql/ruby/security/ConditionalBypassCustomizations.qll index a64cd1039c17..cf752c3aaeb1 100644 --- a/ruby/ql/lib/codeql/ruby/security/ConditionalBypassCustomizations.qll +++ b/ruby/ql/lib/codeql/ruby/security/ConditionalBypassCustomizations.qll @@ -46,8 +46,8 @@ module ConditionalBypass { SensitiveAction action; SensitiveActionGuardConditional() { - exists(ConditionBlock cb, BasicBlock controlled | - cb.edgeDominates(controlled, _) and + exists(BasicBlock cb, BasicBlock controlled | + cb.edgeDominates(controlled, any(ConditionalSuccessor s)) and controlled.getANode() = action.asExpr() and cb.getLastNode() = this.asExpr() ) diff --git a/ruby/ql/lib/ide-contextual-queries/printCfg.ql b/ruby/ql/lib/ide-contextual-queries/printCfg.ql index 1c4cec61a3ef..c749f035f748 100644 --- a/ruby/ql/lib/ide-contextual-queries/printCfg.ql +++ b/ruby/ql/lib/ide-contextual-queries/printCfg.ql @@ -8,7 +8,6 @@ */ private import codeql.Locations -private import codeql.ruby.controlflow.internal.ControlFlowGraphImpl private import codeql.ruby.controlflow.ControlFlowGraph external string selectedSourceFile(); @@ -23,7 +22,7 @@ external int selectedSourceColumn(); private predicate selectedSourceColumnAlias = selectedSourceColumn/0; -module ViewCfgQueryInput implements ViewCfgQueryInputSig { +module ViewCfgQueryInput implements ControlFlow::ViewCfgQueryInputSig { predicate selectedSourceFile = selectedSourceFileAlias/0; predicate selectedSourceLine = selectedSourceLineAlias/0; @@ -31,11 +30,11 @@ module ViewCfgQueryInput implements ViewCfgQueryInputSig { predicate selectedSourceColumn = selectedSourceColumnAlias/0; predicate cfgScopeSpan( - CfgScope scope, File file, int startLine, int startColumn, int endLine, int endColumn + CfgScopeImpl scope, File file, int startLine, int startColumn, int endLine, int endColumn ) { file = scope.getFile() and scope.getLocation().hasLocationInfo(_, startLine, startColumn, endLine, endColumn) } } -import ViewCfgQuery +import ControlFlow::ViewCfgQuery diff --git a/ruby/ql/src/experimental/performance/UseDetect.ql b/ruby/ql/src/experimental/performance/UseDetect.ql index 56ab99ae4056..61cf8ccd3f33 100644 --- a/ruby/ql/src/experimental/performance/UseDetect.ql +++ b/ruby/ql/src/experimental/performance/UseDetect.ql @@ -42,13 +42,11 @@ class EndCall extends MethodCall { } Expr getUniqueRead(Expr e) { - forex(CfgNode eNode | eNode.getAstNode() = e | - exists(Ssa::WriteDefinition def | - def.assigns(eNode) and - strictcount(def.getARead()) = 1 and - not def = any(Ssa::PhiNode phi).getAnInput() and - def.getARead().getAstNode() = result - ) + exists(Ssa::WriteDefinition def | + def.assigns(e.getControlFlowNode()) and + strictcount(def.getARead()) = 1 and + not def = any(Ssa::PhiNode phi).getAnInput() and + def.getARead().getAstNode() = result ) } diff --git a/ruby/ql/src/queries/performance/DatabaseQueryInLoop.ql b/ruby/ql/src/queries/performance/DatabaseQueryInLoop.ql index c81cdd6b2f63..67e9ba4f9c77 100644 --- a/ruby/ql/src/queries/performance/DatabaseQueryInLoop.ql +++ b/ruby/ql/src/queries/performance/DatabaseQueryInLoop.ql @@ -36,7 +36,7 @@ class LoopingCall extends DataFlow::CallNode { } /** Holds if `c` is executed as part of the body of this loop. */ - predicate executesCall(DataFlow::CallNode c) { c.asExpr().getScope() = loopScope } + predicate executesCall(DataFlow::CallNode c) { c.asExpr().getEnclosingCallable() = loopScope } } /** Holds if `ar` influences a guard that may control the execution of a loop. */ diff --git a/ruby/ql/src/queries/variables/DeadStoreOfLocal.ql b/ruby/ql/src/queries/variables/DeadStoreOfLocal.ql index 849fb8ecd5a7..70d3191b8a72 100644 --- a/ruby/ql/src/queries/variables/DeadStoreOfLocal.ql +++ b/ruby/ql/src/queries/variables/DeadStoreOfLocal.ql @@ -19,7 +19,12 @@ import codeql.ruby.ApiGraphs pragma[nomagic] private predicate hasErbResultCall(CfgScope scope) { - scope = API::getTopLevelMember("ERB").getInstance().getAMethodCall("result").asExpr().getScope() + scope = + API::getTopLevelMember("ERB") + .getInstance() + .getAMethodCall("result") + .asExpr() + .getEnclosingCallable() } class RelevantLocalVariableWriteAccess extends LocalVariableWriteAccess { diff --git a/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.ql b/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.ql index c99de9bc0a86..de648d227e72 100644 --- a/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.ql +++ b/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.ql @@ -1,5 +1,4 @@ import codeql.ruby.controlflow.ControlFlowGraph -import codeql.ruby.controlflow.BasicBlocks query predicate dominates(BasicBlock bb1, BasicBlock bb2) { bb1.dominates(bb2) } @@ -9,14 +8,10 @@ query predicate immediateDominator(BasicBlock bb1, BasicBlock bb2) { bb1.getImmediateDominator() = bb2 } -query predicate controls(ConditionBlock bb1, BasicBlock bb2, ConditionalSuccessor t) { +query predicate controls(BasicBlock bb1, BasicBlock bb2, ConditionalSuccessor t) { bb1.edgeDominates(bb2, t) } -query predicate successor(ConditionBlock bb1, BasicBlock bb2, SuccessorType t) { +query predicate successor(BasicBlock bb1, BasicBlock bb2, ConditionalSuccessor t) { bb1.getASuccessor(t) = bb2 } - -query predicate joinBlockPredecessor(JoinBlock bb1, BasicBlock bb2, int i) { - bb1.getJoinBlockPredecessor(i) = bb2 -} diff --git a/ruby/ql/test/library-tests/controlflow/graph/Cfg.ql b/ruby/ql/test/library-tests/controlflow/graph/Cfg.ql index 39d0627613e9..54fc30b8eec3 100644 --- a/ruby/ql/test/library-tests/controlflow/graph/Cfg.ql +++ b/ruby/ql/test/library-tests/controlflow/graph/Cfg.ql @@ -1,2 +1,2 @@ import codeql.ruby.CFG -import codeql.ruby.controlflow.internal.ControlFlowGraphImpl::TestOutput +import ControlFlow::TestOutput diff --git a/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.ql b/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.ql index 86609a73909c..e4f35886dd70 100644 --- a/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.ql +++ b/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.ql @@ -3,7 +3,6 @@ import codeql.ruby.dataflow.internal.DataFlowPublic import codeql.ruby.dataflow.BarrierGuards import codeql.ruby.controlflow.CfgNodes import codeql.ruby.controlflow.ControlFlowGraph -import codeql.ruby.controlflow.BasicBlocks import codeql.ruby.DataFlow import utils.test.InlineExpectationsTest @@ -13,7 +12,7 @@ query predicate newStyleBarrierGuards(DataFlow::Node n) { } query predicate controls(CfgNode condition, BasicBlock bb, ConditionalSuccessor s) { - exists(ConditionBlock cb | + exists(BasicBlock cb | cb.edgeDominates(bb, s) and condition = cb.getLastNode() ) From 1b7dde8f118f2b25d693f572d983e7e0c321c26d Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Wed, 5 Aug 2026 14:26:05 +0200 Subject: [PATCH 0430/2098] Ruby: Accept qltest changes due to removed splitting. --- .../controlflow/graph/Nodes.expected | 50 +- .../dataflow/local/DataflowStep.expected | 631 ++++++----------- .../dataflow/local/Nodes.expected | 64 +- .../dataflow/local/TaintStep.expected | 649 ++++++------------ 4 files changed, 454 insertions(+), 940 deletions(-) diff --git a/ruby/ql/test/library-tests/controlflow/graph/Nodes.expected b/ruby/ql/test/library-tests/controlflow/graph/Nodes.expected index 54cf1d085433..1bb35e0987c9 100644 --- a/ruby/ql/test/library-tests/controlflow/graph/Nodes.expected +++ b/ruby/ql/test/library-tests/controlflow/graph/Nodes.expected @@ -1,10 +1,6 @@ callsWithNoArguments -| break_ensure.rb:8:6:8:13 | [ensure: exception] call to elements | | break_ensure.rb:8:6:8:13 | call to elements | -| break_ensure.rb:8:6:8:18 | [ensure: exception] call to nil? | | break_ensure.rb:8:6:8:18 | call to nil? | -| break_ensure.rb:20:10:20:15 | [ensure: break] call to nil? | -| break_ensure.rb:20:10:20:15 | [ensure: exception] call to nil? | | break_ensure.rb:20:10:20:15 | call to nil? | | break_ensure.rb:29:8:29:13 | call to nil? | | case.rb:2:8:2:9 | call to x1 | @@ -26,8 +22,7 @@ callsWithNoArguments | cfg.rb:62:7:62:12 | * ... | | cfg.rb:62:17:62:27 | * ... | | cfg.rb:90:1:93:3 | call to each | -| cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:90:5:90:5 | [true] ! ... | +| cfg.rb:90:5:90:5 | ! ... | | cfg.rb:90:5:90:5 | defined? ... | | cfg.rb:98:10:98:15 | ** ... | | cfg.rb:98:30:98:35 | ** ... | @@ -61,10 +56,9 @@ callsWithNoArguments | desugar.rb:22:18:22:29 | * ... | | desugar.rb:26:6:26:11 | * ... | | desugar.rb:26:15:26:25 | * ... | -| ifs.rb:4:30:4:38 | [false] ! ... | -| ifs.rb:4:30:4:38 | [true] ! ... | +| ifs.rb:4:30:4:38 | ! ... | | ifs.rb:20:9:20:10 | - ... | -| ifs.rb:41:6:41:10 | [false] ! ... | +| ifs.rb:41:6:41:10 | ! ... | | loops.rb:25:3:27:5 | call to each | | raise.rb:155:3:155:50 | call to each | | raise.rb:155:37:155:48 | call to nil? | @@ -72,25 +66,17 @@ callsWithNoArguments positionalArguments | break_ensure.rb:2:9:2:13 | ... < ... | break_ensure.rb:2:13:2:13 | 0 | | break_ensure.rb:3:8:3:12 | ... > ... | break_ensure.rb:3:12:3:12 | 0 | -| break_ensure.rb:9:5:9:23 | [ensure: exception] call to puts | break_ensure.rb:9:10:9:23 | [ensure: exception] "elements nil" | | break_ensure.rb:9:5:9:23 | call to puts | break_ensure.rb:9:10:9:23 | "elements nil" | | break_ensure.rb:14:9:14:13 | ... < ... | break_ensure.rb:14:13:14:13 | 0 | | break_ensure.rb:16:10:16:14 | ... > ... | break_ensure.rb:16:14:16:14 | 0 | -| break_ensure.rb:21:9:21:20 | [ensure: break] call to puts | break_ensure.rb:21:14:21:20 | [ensure: break] "y nil" | -| break_ensure.rb:21:9:21:20 | [ensure: exception] call to puts | break_ensure.rb:21:14:21:20 | [ensure: exception] "y nil" | | break_ensure.rb:21:9:21:20 | call to puts | break_ensure.rb:21:14:21:20 | "y nil" | | break_ensure.rb:33:11:33:15 | ... < ... | break_ensure.rb:33:15:33:15 | 0 | -| break_ensure.rb:33:11:33:15 | [ensure: exception] ... < ... | break_ensure.rb:33:15:33:15 | [ensure: exception] 0 | -| break_ensure.rb:33:11:33:15 | [ensure: return] ... < ... | break_ensure.rb:33:15:33:15 | [ensure: return] 0 | | break_ensure.rb:35:12:35:16 | ... > ... | break_ensure.rb:35:16:35:16 | 0 | -| break_ensure.rb:35:12:35:16 | [ensure: exception] ... > ... | break_ensure.rb:35:16:35:16 | [ensure: exception] 0 | -| break_ensure.rb:35:12:35:16 | [ensure: return] ... > ... | break_ensure.rb:35:16:35:16 | [ensure: return] 0 | | break_ensure.rb:41:3:41:13 | call to puts | break_ensure.rb:41:8:41:13 | "Done" | | break_ensure.rb:45:9:45:13 | ... < ... | break_ensure.rb:45:13:45:13 | 0 | | break_ensure.rb:47:10:47:14 | ... > ... | break_ensure.rb:47:14:47:14 | 1 | | break_ensure.rb:48:9:48:16 | call to raise | break_ensure.rb:48:15:48:16 | "" | | break_ensure.rb:51:10:51:14 | ... > ... | break_ensure.rb:51:14:51:14 | 0 | -| break_ensure.rb:51:10:51:14 | [ensure: exception] ... > ... | break_ensure.rb:51:14:51:14 | [ensure: exception] 0 | | case.rb:3:29:3:37 | call to puts | case.rb:3:34:3:37 | "x2" | | case.rb:4:17:4:24 | call to puts | case.rb:4:22:4:24 | "2" | | case.rb:14:13:14:18 | ... == ... | case.rb:14:18:14:18 | 5 | @@ -263,10 +249,8 @@ positionalArguments | ifs.rb:2:6:2:10 | ... > ... | ifs.rb:2:10:2:10 | 2 | | ifs.rb:3:5:3:30 | call to puts | ifs.rb:3:10:3:30 | "x is greater than 2" | | ifs.rb:4:9:4:14 | ... <= ... | ifs.rb:4:14:4:14 | 2 | -| ifs.rb:4:9:4:24 | [false] ... and ... | ifs.rb:4:20:4:24 | ... > ... | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:20:4:24 | ... > ... | -| ifs.rb:4:9:4:38 | [false] ... and ... | ifs.rb:4:30:4:38 | [false] ! ... | -| ifs.rb:4:9:4:38 | [true] ... and ... | ifs.rb:4:30:4:38 | [true] ! ... | +| ifs.rb:4:9:4:24 | ... and ... | ifs.rb:4:20:4:24 | ... > ... | +| ifs.rb:4:9:4:38 | ... and ... | ifs.rb:4:30:4:38 | ! ... | | ifs.rb:4:20:4:24 | ... > ... | ifs.rb:4:24:4:24 | 0 | | ifs.rb:4:32:4:37 | ... == ... | ifs.rb:4:37:4:37 | 5 | | ifs.rb:5:5:5:17 | call to puts | ifs.rb:5:10:5:17 | "x is 1" | @@ -279,8 +263,7 @@ positionalArguments | ifs.rb:38:12:38:17 | ... == ... | ifs.rb:38:17:38:17 | 2 | | ifs.rb:48:5:48:15 | call to puts | ifs.rb:48:10:48:15 | "true" | | ifs.rb:51:3:51:13 | call to puts | ifs.rb:51:8:51:13 | "done" | -| ifs.rb:55:7:55:14 | [false] ... \|\| ... | ifs.rb:55:13:55:14 | b2 | -| ifs.rb:55:7:55:14 | [true] ... \|\| ... | ifs.rb:55:13:55:14 | b2 | +| ifs.rb:55:7:55:14 | ... \|\| ... | ifs.rb:55:13:55:14 | b2 | | ifs.rb:56:5:56:19 | call to puts | ifs.rb:56:10:56:19 | "b1 or b2" | | loops.rb:2:9:2:14 | ... >= ... | loops.rb:2:14:2:14 | 0 | | loops.rb:3:5:3:10 | call to puts | loops.rb:3:10:3:10 | x | @@ -319,16 +302,12 @@ positionalArguments | raise.rb:70:5:70:17 | call to raise | raise.rb:70:11:70:17 | "x > 2" | | raise.rb:71:9:71:13 | ... < ... | raise.rb:71:13:71:13 | 0 | | raise.rb:74:3:74:20 | call to puts | raise.rb:74:8:74:20 | "0 <= x <= 2" | -| raise.rb:76:3:76:15 | [ensure: exception] call to puts | raise.rb:76:8:76:15 | [ensure: exception] "ensure" | -| raise.rb:76:3:76:15 | [ensure: return] call to puts | raise.rb:76:8:76:15 | [ensure: return] "ensure" | | raise.rb:76:3:76:15 | call to puts | raise.rb:76:8:76:15 | "ensure" | | raise.rb:80:3:80:17 | call to puts | raise.rb:80:8:80:17 | "Begin m8" | | raise.rb:82:8:82:12 | ... > ... | raise.rb:82:12:82:12 | 2 | | raise.rb:83:7:83:19 | call to raise | raise.rb:83:13:83:19 | "x > 2" | | raise.rb:84:11:84:15 | ... < ... | raise.rb:84:15:84:15 | 0 | | raise.rb:87:5:87:22 | call to puts | raise.rb:87:10:87:22 | "0 <= x <= 2" | -| raise.rb:89:5:89:17 | [ensure: exception] call to puts | raise.rb:89:10:89:17 | [ensure: exception] "ensure" | -| raise.rb:89:5:89:17 | [ensure: return] call to puts | raise.rb:89:10:89:17 | [ensure: return] "ensure" | | raise.rb:89:5:89:17 | call to puts | raise.rb:89:10:89:17 | "ensure" | | raise.rb:91:3:91:15 | call to puts | raise.rb:91:8:91:15 | "End m8" | | raise.rb:95:3:95:17 | call to puts | raise.rb:95:8:95:17 | "Begin m9" | @@ -336,30 +315,16 @@ positionalArguments | raise.rb:98:7:98:19 | call to raise | raise.rb:98:13:98:19 | "x > 2" | | raise.rb:99:11:99:15 | ... < ... | raise.rb:99:15:99:15 | 0 | | raise.rb:102:5:102:22 | call to puts | raise.rb:102:10:102:22 | "0 <= x <= 2" | -| raise.rb:104:5:104:23 | [ensure: exception] call to puts | raise.rb:104:10:104:23 | [ensure: exception] "outer ensure" | -| raise.rb:104:5:104:23 | [ensure: return] call to puts | raise.rb:104:10:104:23 | [ensure: return] "outer ensure" | | raise.rb:104:5:104:23 | call to puts | raise.rb:104:10:104:23 | "outer ensure" | -| raise.rb:107:9:107:26 | [ensure: exception] call to raise | raise.rb:107:15:107:26 | [ensure: exception] "b1 is true" | -| raise.rb:107:9:107:26 | [ensure: return] call to raise | raise.rb:107:15:107:26 | [ensure: return] "b1 is true" | | raise.rb:107:9:107:26 | call to raise | raise.rb:107:15:107:26 | "b1 is true" | -| raise.rb:110:7:110:25 | [ensure(1): exception] call to puts | raise.rb:110:12:110:25 | [ensure(1): exception] "inner ensure" | -| raise.rb:110:7:110:25 | [ensure: exception, ensure(1): exception] call to puts | raise.rb:110:12:110:25 | [ensure: exception, ensure(1): exception] "inner ensure" | -| raise.rb:110:7:110:25 | [ensure: exception] call to puts | raise.rb:110:12:110:25 | [ensure: exception] "inner ensure" | -| raise.rb:110:7:110:25 | [ensure: return, ensure(1): exception] call to puts | raise.rb:110:12:110:25 | [ensure: return, ensure(1): exception] "inner ensure" | -| raise.rb:110:7:110:25 | [ensure: return] call to puts | raise.rb:110:12:110:25 | [ensure: return] "inner ensure" | | raise.rb:110:7:110:25 | call to puts | raise.rb:110:12:110:25 | "inner ensure" | | raise.rb:113:3:113:15 | call to puts | raise.rb:113:8:113:15 | "End m9" | -| raise.rb:115:3:115:22 | [ensure: exception] call to puts | raise.rb:115:8:115:22 | [ensure: exception] "method ensure" | -| raise.rb:115:3:115:22 | [ensure: return] call to puts | raise.rb:115:8:115:22 | [ensure: return] "method ensure" | | raise.rb:115:3:115:22 | call to puts | raise.rb:115:8:115:22 | "method ensure" | -| raise.rb:117:5:117:22 | [ensure: exception] call to raise | raise.rb:117:11:117:22 | [ensure: exception] "b2 is true" | -| raise.rb:117:5:117:22 | [ensure: return] call to raise | raise.rb:117:11:117:22 | [ensure: return] "b2 is true" | | raise.rb:117:5:117:22 | call to raise | raise.rb:117:11:117:22 | "b2 is true" | | raise.rb:121:14:121:30 | call to raise | raise.rb:121:20:121:30 | "Exception" | | raise.rb:125:3:125:51 | call to puts | raise.rb:125:8:125:51 | "Will not get executed if p is..." | | raise.rb:131:7:131:22 | call to raise | raise.rb:131:13:131:22 | ExceptionA | | raise.rb:135:5:135:21 | call to puts | raise.rb:135:10:135:21 | "ExceptionB" | -| raise.rb:137:5:137:17 | [ensure: exception] call to puts | raise.rb:137:10:137:17 | [ensure: exception] "Ensure" | | raise.rb:137:5:137:17 | call to puts | raise.rb:137:10:137:17 | "Ensure" | | raise.rb:139:3:139:16 | call to puts | raise.rb:139:8:139:16 | "End m11" | | raise.rb:144:5:144:12 | call to raise | raise.rb:144:11:144:12 | "" | @@ -367,8 +332,7 @@ positionalArguments | raise.rb:160:5:162:7 | call to bar | raise.rb:160:9:162:7 | -> { ... } | | raise.rb:161:7:161:14 | call to raise | raise.rb:161:13:161:14 | "" | | raise.rb:168:5:168:12 | call to raise | raise.rb:168:11:168:12 | "" | -| raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:174:14:174:23 | ... == ... | -| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:174:14:174:23 | ... == ... | +| raise.rb:174:8:174:23 | ... \|\| ... | raise.rb:174:14:174:23 | ... == ... | | raise.rb:174:14:174:23 | ... == ... | raise.rb:174:20:174:23 | true | keywordArguments | cfg.html.erb:6:9:6:58 | call to stylesheet_link_tag | media | cfg.html.erb:6:54:6:58 | "all" | diff --git a/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected b/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected index f9b7cad4c35f..c919dc71dd5c 100644 --- a/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected +++ b/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected @@ -207,800 +207,700 @@ | UseUseExplosion.rb:20:13:20:17 | [post] self | UseUseExplosion.rb:20:3691:20:3696 | self | | UseUseExplosion.rb:20:13:20:17 | self | UseUseExplosion.rb:20:35:20:39 | self | | UseUseExplosion.rb:20:13:20:17 | self | UseUseExplosion.rb:20:3691:20:3696 | self | -| UseUseExplosion.rb:20:13:20:23 | ... > ... | UseUseExplosion.rb:20:12:20:24 | [false] ( ... ) | -| UseUseExplosion.rb:20:13:20:23 | ... > ... | UseUseExplosion.rb:20:12:20:24 | [true] ( ... ) | +| UseUseExplosion.rb:20:13:20:23 | ... > ... | UseUseExplosion.rb:20:12:20:24 | ( ... ) | | UseUseExplosion.rb:20:26:20:3684 | then ... | UseUseExplosion.rb:20:9:20:3700 | if ... | | UseUseExplosion.rb:20:31:20:3684 | if ... | UseUseExplosion.rb:20:26:20:3684 | then ... | | UseUseExplosion.rb:20:35:20:39 | [post] self | UseUseExplosion.rb:20:56:20:60 | self | | UseUseExplosion.rb:20:35:20:39 | [post] self | UseUseExplosion.rb:20:3675:20:3680 | self | | UseUseExplosion.rb:20:35:20:39 | self | UseUseExplosion.rb:20:56:20:60 | self | | UseUseExplosion.rb:20:35:20:39 | self | UseUseExplosion.rb:20:3675:20:3680 | self | -| UseUseExplosion.rb:20:35:20:44 | ... > ... | UseUseExplosion.rb:20:34:20:45 | [false] ( ... ) | -| UseUseExplosion.rb:20:35:20:44 | ... > ... | UseUseExplosion.rb:20:34:20:45 | [true] ( ... ) | +| UseUseExplosion.rb:20:35:20:44 | ... > ... | UseUseExplosion.rb:20:34:20:45 | ( ... ) | | UseUseExplosion.rb:20:47:20:3668 | then ... | UseUseExplosion.rb:20:31:20:3684 | if ... | | UseUseExplosion.rb:20:52:20:3668 | if ... | UseUseExplosion.rb:20:47:20:3668 | then ... | | UseUseExplosion.rb:20:56:20:60 | [post] self | UseUseExplosion.rb:20:77:20:81 | self | | UseUseExplosion.rb:20:56:20:60 | [post] self | UseUseExplosion.rb:20:3659:20:3664 | self | | UseUseExplosion.rb:20:56:20:60 | self | UseUseExplosion.rb:20:77:20:81 | self | | UseUseExplosion.rb:20:56:20:60 | self | UseUseExplosion.rb:20:3659:20:3664 | self | -| UseUseExplosion.rb:20:56:20:65 | ... > ... | UseUseExplosion.rb:20:55:20:66 | [false] ( ... ) | -| UseUseExplosion.rb:20:56:20:65 | ... > ... | UseUseExplosion.rb:20:55:20:66 | [true] ( ... ) | +| UseUseExplosion.rb:20:56:20:65 | ... > ... | UseUseExplosion.rb:20:55:20:66 | ( ... ) | | UseUseExplosion.rb:20:68:20:3652 | then ... | UseUseExplosion.rb:20:52:20:3668 | if ... | | UseUseExplosion.rb:20:73:20:3652 | if ... | UseUseExplosion.rb:20:68:20:3652 | then ... | | UseUseExplosion.rb:20:77:20:81 | [post] self | UseUseExplosion.rb:20:98:20:102 | self | | UseUseExplosion.rb:20:77:20:81 | [post] self | UseUseExplosion.rb:20:3643:20:3648 | self | | UseUseExplosion.rb:20:77:20:81 | self | UseUseExplosion.rb:20:98:20:102 | self | | UseUseExplosion.rb:20:77:20:81 | self | UseUseExplosion.rb:20:3643:20:3648 | self | -| UseUseExplosion.rb:20:77:20:86 | ... > ... | UseUseExplosion.rb:20:76:20:87 | [false] ( ... ) | -| UseUseExplosion.rb:20:77:20:86 | ... > ... | UseUseExplosion.rb:20:76:20:87 | [true] ( ... ) | +| UseUseExplosion.rb:20:77:20:86 | ... > ... | UseUseExplosion.rb:20:76:20:87 | ( ... ) | | UseUseExplosion.rb:20:89:20:3636 | then ... | UseUseExplosion.rb:20:73:20:3652 | if ... | | UseUseExplosion.rb:20:94:20:3636 | if ... | UseUseExplosion.rb:20:89:20:3636 | then ... | | UseUseExplosion.rb:20:98:20:102 | [post] self | UseUseExplosion.rb:20:119:20:123 | self | | UseUseExplosion.rb:20:98:20:102 | [post] self | UseUseExplosion.rb:20:3627:20:3632 | self | | UseUseExplosion.rb:20:98:20:102 | self | UseUseExplosion.rb:20:119:20:123 | self | | UseUseExplosion.rb:20:98:20:102 | self | UseUseExplosion.rb:20:3627:20:3632 | self | -| UseUseExplosion.rb:20:98:20:107 | ... > ... | UseUseExplosion.rb:20:97:20:108 | [false] ( ... ) | -| UseUseExplosion.rb:20:98:20:107 | ... > ... | UseUseExplosion.rb:20:97:20:108 | [true] ( ... ) | +| UseUseExplosion.rb:20:98:20:107 | ... > ... | UseUseExplosion.rb:20:97:20:108 | ( ... ) | | UseUseExplosion.rb:20:110:20:3620 | then ... | UseUseExplosion.rb:20:94:20:3636 | if ... | | UseUseExplosion.rb:20:115:20:3620 | if ... | UseUseExplosion.rb:20:110:20:3620 | then ... | | UseUseExplosion.rb:20:119:20:123 | [post] self | UseUseExplosion.rb:20:140:20:144 | self | | UseUseExplosion.rb:20:119:20:123 | [post] self | UseUseExplosion.rb:20:3611:20:3616 | self | | UseUseExplosion.rb:20:119:20:123 | self | UseUseExplosion.rb:20:140:20:144 | self | | UseUseExplosion.rb:20:119:20:123 | self | UseUseExplosion.rb:20:3611:20:3616 | self | -| UseUseExplosion.rb:20:119:20:128 | ... > ... | UseUseExplosion.rb:20:118:20:129 | [false] ( ... ) | -| UseUseExplosion.rb:20:119:20:128 | ... > ... | UseUseExplosion.rb:20:118:20:129 | [true] ( ... ) | +| UseUseExplosion.rb:20:119:20:128 | ... > ... | UseUseExplosion.rb:20:118:20:129 | ( ... ) | | UseUseExplosion.rb:20:131:20:3604 | then ... | UseUseExplosion.rb:20:115:20:3620 | if ... | | UseUseExplosion.rb:20:136:20:3604 | if ... | UseUseExplosion.rb:20:131:20:3604 | then ... | | UseUseExplosion.rb:20:140:20:144 | [post] self | UseUseExplosion.rb:20:161:20:165 | self | | UseUseExplosion.rb:20:140:20:144 | [post] self | UseUseExplosion.rb:20:3595:20:3600 | self | | UseUseExplosion.rb:20:140:20:144 | self | UseUseExplosion.rb:20:161:20:165 | self | | UseUseExplosion.rb:20:140:20:144 | self | UseUseExplosion.rb:20:3595:20:3600 | self | -| UseUseExplosion.rb:20:140:20:149 | ... > ... | UseUseExplosion.rb:20:139:20:150 | [false] ( ... ) | -| UseUseExplosion.rb:20:140:20:149 | ... > ... | UseUseExplosion.rb:20:139:20:150 | [true] ( ... ) | +| UseUseExplosion.rb:20:140:20:149 | ... > ... | UseUseExplosion.rb:20:139:20:150 | ( ... ) | | UseUseExplosion.rb:20:152:20:3588 | then ... | UseUseExplosion.rb:20:136:20:3604 | if ... | | UseUseExplosion.rb:20:157:20:3588 | if ... | UseUseExplosion.rb:20:152:20:3588 | then ... | | UseUseExplosion.rb:20:161:20:165 | [post] self | UseUseExplosion.rb:20:182:20:186 | self | | UseUseExplosion.rb:20:161:20:165 | [post] self | UseUseExplosion.rb:20:3579:20:3584 | self | | UseUseExplosion.rb:20:161:20:165 | self | UseUseExplosion.rb:20:182:20:186 | self | | UseUseExplosion.rb:20:161:20:165 | self | UseUseExplosion.rb:20:3579:20:3584 | self | -| UseUseExplosion.rb:20:161:20:170 | ... > ... | UseUseExplosion.rb:20:160:20:171 | [false] ( ... ) | -| UseUseExplosion.rb:20:161:20:170 | ... > ... | UseUseExplosion.rb:20:160:20:171 | [true] ( ... ) | +| UseUseExplosion.rb:20:161:20:170 | ... > ... | UseUseExplosion.rb:20:160:20:171 | ( ... ) | | UseUseExplosion.rb:20:173:20:3572 | then ... | UseUseExplosion.rb:20:157:20:3588 | if ... | | UseUseExplosion.rb:20:178:20:3572 | if ... | UseUseExplosion.rb:20:173:20:3572 | then ... | | UseUseExplosion.rb:20:182:20:186 | [post] self | UseUseExplosion.rb:20:203:20:207 | self | | UseUseExplosion.rb:20:182:20:186 | [post] self | UseUseExplosion.rb:20:3563:20:3568 | self | | UseUseExplosion.rb:20:182:20:186 | self | UseUseExplosion.rb:20:203:20:207 | self | | UseUseExplosion.rb:20:182:20:186 | self | UseUseExplosion.rb:20:3563:20:3568 | self | -| UseUseExplosion.rb:20:182:20:191 | ... > ... | UseUseExplosion.rb:20:181:20:192 | [false] ( ... ) | -| UseUseExplosion.rb:20:182:20:191 | ... > ... | UseUseExplosion.rb:20:181:20:192 | [true] ( ... ) | +| UseUseExplosion.rb:20:182:20:191 | ... > ... | UseUseExplosion.rb:20:181:20:192 | ( ... ) | | UseUseExplosion.rb:20:194:20:3556 | then ... | UseUseExplosion.rb:20:178:20:3572 | if ... | | UseUseExplosion.rb:20:199:20:3556 | if ... | UseUseExplosion.rb:20:194:20:3556 | then ... | | UseUseExplosion.rb:20:203:20:207 | [post] self | UseUseExplosion.rb:20:224:20:228 | self | | UseUseExplosion.rb:20:203:20:207 | [post] self | UseUseExplosion.rb:20:3547:20:3552 | self | | UseUseExplosion.rb:20:203:20:207 | self | UseUseExplosion.rb:20:224:20:228 | self | | UseUseExplosion.rb:20:203:20:207 | self | UseUseExplosion.rb:20:3547:20:3552 | self | -| UseUseExplosion.rb:20:203:20:212 | ... > ... | UseUseExplosion.rb:20:202:20:213 | [false] ( ... ) | -| UseUseExplosion.rb:20:203:20:212 | ... > ... | UseUseExplosion.rb:20:202:20:213 | [true] ( ... ) | +| UseUseExplosion.rb:20:203:20:212 | ... > ... | UseUseExplosion.rb:20:202:20:213 | ( ... ) | | UseUseExplosion.rb:20:215:20:3540 | then ... | UseUseExplosion.rb:20:199:20:3556 | if ... | | UseUseExplosion.rb:20:220:20:3540 | if ... | UseUseExplosion.rb:20:215:20:3540 | then ... | | UseUseExplosion.rb:20:224:20:228 | [post] self | UseUseExplosion.rb:20:245:20:249 | self | | UseUseExplosion.rb:20:224:20:228 | [post] self | UseUseExplosion.rb:20:3531:20:3536 | self | | UseUseExplosion.rb:20:224:20:228 | self | UseUseExplosion.rb:20:245:20:249 | self | | UseUseExplosion.rb:20:224:20:228 | self | UseUseExplosion.rb:20:3531:20:3536 | self | -| UseUseExplosion.rb:20:224:20:233 | ... > ... | UseUseExplosion.rb:20:223:20:234 | [false] ( ... ) | -| UseUseExplosion.rb:20:224:20:233 | ... > ... | UseUseExplosion.rb:20:223:20:234 | [true] ( ... ) | +| UseUseExplosion.rb:20:224:20:233 | ... > ... | UseUseExplosion.rb:20:223:20:234 | ( ... ) | | UseUseExplosion.rb:20:236:20:3524 | then ... | UseUseExplosion.rb:20:220:20:3540 | if ... | | UseUseExplosion.rb:20:241:20:3524 | if ... | UseUseExplosion.rb:20:236:20:3524 | then ... | | UseUseExplosion.rb:20:245:20:249 | [post] self | UseUseExplosion.rb:20:266:20:270 | self | | UseUseExplosion.rb:20:245:20:249 | [post] self | UseUseExplosion.rb:20:3515:20:3520 | self | | UseUseExplosion.rb:20:245:20:249 | self | UseUseExplosion.rb:20:266:20:270 | self | | UseUseExplosion.rb:20:245:20:249 | self | UseUseExplosion.rb:20:3515:20:3520 | self | -| UseUseExplosion.rb:20:245:20:254 | ... > ... | UseUseExplosion.rb:20:244:20:255 | [false] ( ... ) | -| UseUseExplosion.rb:20:245:20:254 | ... > ... | UseUseExplosion.rb:20:244:20:255 | [true] ( ... ) | +| UseUseExplosion.rb:20:245:20:254 | ... > ... | UseUseExplosion.rb:20:244:20:255 | ( ... ) | | UseUseExplosion.rb:20:257:20:3508 | then ... | UseUseExplosion.rb:20:241:20:3524 | if ... | | UseUseExplosion.rb:20:262:20:3508 | if ... | UseUseExplosion.rb:20:257:20:3508 | then ... | | UseUseExplosion.rb:20:266:20:270 | [post] self | UseUseExplosion.rb:20:287:20:291 | self | | UseUseExplosion.rb:20:266:20:270 | [post] self | UseUseExplosion.rb:20:3499:20:3504 | self | | UseUseExplosion.rb:20:266:20:270 | self | UseUseExplosion.rb:20:287:20:291 | self | | UseUseExplosion.rb:20:266:20:270 | self | UseUseExplosion.rb:20:3499:20:3504 | self | -| UseUseExplosion.rb:20:266:20:275 | ... > ... | UseUseExplosion.rb:20:265:20:276 | [false] ( ... ) | -| UseUseExplosion.rb:20:266:20:275 | ... > ... | UseUseExplosion.rb:20:265:20:276 | [true] ( ... ) | +| UseUseExplosion.rb:20:266:20:275 | ... > ... | UseUseExplosion.rb:20:265:20:276 | ( ... ) | | UseUseExplosion.rb:20:278:20:3492 | then ... | UseUseExplosion.rb:20:262:20:3508 | if ... | | UseUseExplosion.rb:20:283:20:3492 | if ... | UseUseExplosion.rb:20:278:20:3492 | then ... | | UseUseExplosion.rb:20:287:20:291 | [post] self | UseUseExplosion.rb:20:308:20:312 | self | | UseUseExplosion.rb:20:287:20:291 | [post] self | UseUseExplosion.rb:20:3483:20:3488 | self | | UseUseExplosion.rb:20:287:20:291 | self | UseUseExplosion.rb:20:308:20:312 | self | | UseUseExplosion.rb:20:287:20:291 | self | UseUseExplosion.rb:20:3483:20:3488 | self | -| UseUseExplosion.rb:20:287:20:296 | ... > ... | UseUseExplosion.rb:20:286:20:297 | [false] ( ... ) | -| UseUseExplosion.rb:20:287:20:296 | ... > ... | UseUseExplosion.rb:20:286:20:297 | [true] ( ... ) | +| UseUseExplosion.rb:20:287:20:296 | ... > ... | UseUseExplosion.rb:20:286:20:297 | ( ... ) | | UseUseExplosion.rb:20:299:20:3476 | then ... | UseUseExplosion.rb:20:283:20:3492 | if ... | | UseUseExplosion.rb:20:304:20:3476 | if ... | UseUseExplosion.rb:20:299:20:3476 | then ... | | UseUseExplosion.rb:20:308:20:312 | [post] self | UseUseExplosion.rb:20:329:20:333 | self | | UseUseExplosion.rb:20:308:20:312 | [post] self | UseUseExplosion.rb:20:3467:20:3472 | self | | UseUseExplosion.rb:20:308:20:312 | self | UseUseExplosion.rb:20:329:20:333 | self | | UseUseExplosion.rb:20:308:20:312 | self | UseUseExplosion.rb:20:3467:20:3472 | self | -| UseUseExplosion.rb:20:308:20:317 | ... > ... | UseUseExplosion.rb:20:307:20:318 | [false] ( ... ) | -| UseUseExplosion.rb:20:308:20:317 | ... > ... | UseUseExplosion.rb:20:307:20:318 | [true] ( ... ) | +| UseUseExplosion.rb:20:308:20:317 | ... > ... | UseUseExplosion.rb:20:307:20:318 | ( ... ) | | UseUseExplosion.rb:20:320:20:3460 | then ... | UseUseExplosion.rb:20:304:20:3476 | if ... | | UseUseExplosion.rb:20:325:20:3460 | if ... | UseUseExplosion.rb:20:320:20:3460 | then ... | | UseUseExplosion.rb:20:329:20:333 | [post] self | UseUseExplosion.rb:20:350:20:354 | self | | UseUseExplosion.rb:20:329:20:333 | [post] self | UseUseExplosion.rb:20:3451:20:3456 | self | | UseUseExplosion.rb:20:329:20:333 | self | UseUseExplosion.rb:20:350:20:354 | self | | UseUseExplosion.rb:20:329:20:333 | self | UseUseExplosion.rb:20:3451:20:3456 | self | -| UseUseExplosion.rb:20:329:20:338 | ... > ... | UseUseExplosion.rb:20:328:20:339 | [false] ( ... ) | -| UseUseExplosion.rb:20:329:20:338 | ... > ... | UseUseExplosion.rb:20:328:20:339 | [true] ( ... ) | +| UseUseExplosion.rb:20:329:20:338 | ... > ... | UseUseExplosion.rb:20:328:20:339 | ( ... ) | | UseUseExplosion.rb:20:341:20:3444 | then ... | UseUseExplosion.rb:20:325:20:3460 | if ... | | UseUseExplosion.rb:20:346:20:3444 | if ... | UseUseExplosion.rb:20:341:20:3444 | then ... | | UseUseExplosion.rb:20:350:20:354 | [post] self | UseUseExplosion.rb:20:371:20:375 | self | | UseUseExplosion.rb:20:350:20:354 | [post] self | UseUseExplosion.rb:20:3435:20:3440 | self | | UseUseExplosion.rb:20:350:20:354 | self | UseUseExplosion.rb:20:371:20:375 | self | | UseUseExplosion.rb:20:350:20:354 | self | UseUseExplosion.rb:20:3435:20:3440 | self | -| UseUseExplosion.rb:20:350:20:359 | ... > ... | UseUseExplosion.rb:20:349:20:360 | [false] ( ... ) | -| UseUseExplosion.rb:20:350:20:359 | ... > ... | UseUseExplosion.rb:20:349:20:360 | [true] ( ... ) | +| UseUseExplosion.rb:20:350:20:359 | ... > ... | UseUseExplosion.rb:20:349:20:360 | ( ... ) | | UseUseExplosion.rb:20:362:20:3428 | then ... | UseUseExplosion.rb:20:346:20:3444 | if ... | | UseUseExplosion.rb:20:367:20:3428 | if ... | UseUseExplosion.rb:20:362:20:3428 | then ... | | UseUseExplosion.rb:20:371:20:375 | [post] self | UseUseExplosion.rb:20:392:20:396 | self | | UseUseExplosion.rb:20:371:20:375 | [post] self | UseUseExplosion.rb:20:3419:20:3424 | self | | UseUseExplosion.rb:20:371:20:375 | self | UseUseExplosion.rb:20:392:20:396 | self | | UseUseExplosion.rb:20:371:20:375 | self | UseUseExplosion.rb:20:3419:20:3424 | self | -| UseUseExplosion.rb:20:371:20:380 | ... > ... | UseUseExplosion.rb:20:370:20:381 | [false] ( ... ) | -| UseUseExplosion.rb:20:371:20:380 | ... > ... | UseUseExplosion.rb:20:370:20:381 | [true] ( ... ) | +| UseUseExplosion.rb:20:371:20:380 | ... > ... | UseUseExplosion.rb:20:370:20:381 | ( ... ) | | UseUseExplosion.rb:20:383:20:3412 | then ... | UseUseExplosion.rb:20:367:20:3428 | if ... | | UseUseExplosion.rb:20:388:20:3412 | if ... | UseUseExplosion.rb:20:383:20:3412 | then ... | | UseUseExplosion.rb:20:392:20:396 | [post] self | UseUseExplosion.rb:20:413:20:417 | self | | UseUseExplosion.rb:20:392:20:396 | [post] self | UseUseExplosion.rb:20:3403:20:3408 | self | | UseUseExplosion.rb:20:392:20:396 | self | UseUseExplosion.rb:20:413:20:417 | self | | UseUseExplosion.rb:20:392:20:396 | self | UseUseExplosion.rb:20:3403:20:3408 | self | -| UseUseExplosion.rb:20:392:20:401 | ... > ... | UseUseExplosion.rb:20:391:20:402 | [false] ( ... ) | -| UseUseExplosion.rb:20:392:20:401 | ... > ... | UseUseExplosion.rb:20:391:20:402 | [true] ( ... ) | +| UseUseExplosion.rb:20:392:20:401 | ... > ... | UseUseExplosion.rb:20:391:20:402 | ( ... ) | | UseUseExplosion.rb:20:404:20:3396 | then ... | UseUseExplosion.rb:20:388:20:3412 | if ... | | UseUseExplosion.rb:20:409:20:3396 | if ... | UseUseExplosion.rb:20:404:20:3396 | then ... | | UseUseExplosion.rb:20:413:20:417 | [post] self | UseUseExplosion.rb:20:434:20:438 | self | | UseUseExplosion.rb:20:413:20:417 | [post] self | UseUseExplosion.rb:20:3387:20:3392 | self | | UseUseExplosion.rb:20:413:20:417 | self | UseUseExplosion.rb:20:434:20:438 | self | | UseUseExplosion.rb:20:413:20:417 | self | UseUseExplosion.rb:20:3387:20:3392 | self | -| UseUseExplosion.rb:20:413:20:422 | ... > ... | UseUseExplosion.rb:20:412:20:423 | [false] ( ... ) | -| UseUseExplosion.rb:20:413:20:422 | ... > ... | UseUseExplosion.rb:20:412:20:423 | [true] ( ... ) | +| UseUseExplosion.rb:20:413:20:422 | ... > ... | UseUseExplosion.rb:20:412:20:423 | ( ... ) | | UseUseExplosion.rb:20:425:20:3380 | then ... | UseUseExplosion.rb:20:409:20:3396 | if ... | | UseUseExplosion.rb:20:430:20:3380 | if ... | UseUseExplosion.rb:20:425:20:3380 | then ... | | UseUseExplosion.rb:20:434:20:438 | [post] self | UseUseExplosion.rb:20:455:20:459 | self | | UseUseExplosion.rb:20:434:20:438 | [post] self | UseUseExplosion.rb:20:3371:20:3376 | self | | UseUseExplosion.rb:20:434:20:438 | self | UseUseExplosion.rb:20:455:20:459 | self | | UseUseExplosion.rb:20:434:20:438 | self | UseUseExplosion.rb:20:3371:20:3376 | self | -| UseUseExplosion.rb:20:434:20:443 | ... > ... | UseUseExplosion.rb:20:433:20:444 | [false] ( ... ) | -| UseUseExplosion.rb:20:434:20:443 | ... > ... | UseUseExplosion.rb:20:433:20:444 | [true] ( ... ) | +| UseUseExplosion.rb:20:434:20:443 | ... > ... | UseUseExplosion.rb:20:433:20:444 | ( ... ) | | UseUseExplosion.rb:20:446:20:3364 | then ... | UseUseExplosion.rb:20:430:20:3380 | if ... | | UseUseExplosion.rb:20:451:20:3364 | if ... | UseUseExplosion.rb:20:446:20:3364 | then ... | | UseUseExplosion.rb:20:455:20:459 | [post] self | UseUseExplosion.rb:20:476:20:480 | self | | UseUseExplosion.rb:20:455:20:459 | [post] self | UseUseExplosion.rb:20:3355:20:3360 | self | | UseUseExplosion.rb:20:455:20:459 | self | UseUseExplosion.rb:20:476:20:480 | self | | UseUseExplosion.rb:20:455:20:459 | self | UseUseExplosion.rb:20:3355:20:3360 | self | -| UseUseExplosion.rb:20:455:20:464 | ... > ... | UseUseExplosion.rb:20:454:20:465 | [false] ( ... ) | -| UseUseExplosion.rb:20:455:20:464 | ... > ... | UseUseExplosion.rb:20:454:20:465 | [true] ( ... ) | +| UseUseExplosion.rb:20:455:20:464 | ... > ... | UseUseExplosion.rb:20:454:20:465 | ( ... ) | | UseUseExplosion.rb:20:467:20:3348 | then ... | UseUseExplosion.rb:20:451:20:3364 | if ... | | UseUseExplosion.rb:20:472:20:3348 | if ... | UseUseExplosion.rb:20:467:20:3348 | then ... | | UseUseExplosion.rb:20:476:20:480 | [post] self | UseUseExplosion.rb:20:497:20:501 | self | | UseUseExplosion.rb:20:476:20:480 | [post] self | UseUseExplosion.rb:20:3339:20:3344 | self | | UseUseExplosion.rb:20:476:20:480 | self | UseUseExplosion.rb:20:497:20:501 | self | | UseUseExplosion.rb:20:476:20:480 | self | UseUseExplosion.rb:20:3339:20:3344 | self | -| UseUseExplosion.rb:20:476:20:485 | ... > ... | UseUseExplosion.rb:20:475:20:486 | [false] ( ... ) | -| UseUseExplosion.rb:20:476:20:485 | ... > ... | UseUseExplosion.rb:20:475:20:486 | [true] ( ... ) | +| UseUseExplosion.rb:20:476:20:485 | ... > ... | UseUseExplosion.rb:20:475:20:486 | ( ... ) | | UseUseExplosion.rb:20:488:20:3332 | then ... | UseUseExplosion.rb:20:472:20:3348 | if ... | | UseUseExplosion.rb:20:493:20:3332 | if ... | UseUseExplosion.rb:20:488:20:3332 | then ... | | UseUseExplosion.rb:20:497:20:501 | [post] self | UseUseExplosion.rb:20:518:20:522 | self | | UseUseExplosion.rb:20:497:20:501 | [post] self | UseUseExplosion.rb:20:3323:20:3328 | self | | UseUseExplosion.rb:20:497:20:501 | self | UseUseExplosion.rb:20:518:20:522 | self | | UseUseExplosion.rb:20:497:20:501 | self | UseUseExplosion.rb:20:3323:20:3328 | self | -| UseUseExplosion.rb:20:497:20:506 | ... > ... | UseUseExplosion.rb:20:496:20:507 | [false] ( ... ) | -| UseUseExplosion.rb:20:497:20:506 | ... > ... | UseUseExplosion.rb:20:496:20:507 | [true] ( ... ) | +| UseUseExplosion.rb:20:497:20:506 | ... > ... | UseUseExplosion.rb:20:496:20:507 | ( ... ) | | UseUseExplosion.rb:20:509:20:3316 | then ... | UseUseExplosion.rb:20:493:20:3332 | if ... | | UseUseExplosion.rb:20:514:20:3316 | if ... | UseUseExplosion.rb:20:509:20:3316 | then ... | | UseUseExplosion.rb:20:518:20:522 | [post] self | UseUseExplosion.rb:20:539:20:543 | self | | UseUseExplosion.rb:20:518:20:522 | [post] self | UseUseExplosion.rb:20:3307:20:3312 | self | | UseUseExplosion.rb:20:518:20:522 | self | UseUseExplosion.rb:20:539:20:543 | self | | UseUseExplosion.rb:20:518:20:522 | self | UseUseExplosion.rb:20:3307:20:3312 | self | -| UseUseExplosion.rb:20:518:20:527 | ... > ... | UseUseExplosion.rb:20:517:20:528 | [false] ( ... ) | -| UseUseExplosion.rb:20:518:20:527 | ... > ... | UseUseExplosion.rb:20:517:20:528 | [true] ( ... ) | +| UseUseExplosion.rb:20:518:20:527 | ... > ... | UseUseExplosion.rb:20:517:20:528 | ( ... ) | | UseUseExplosion.rb:20:530:20:3300 | then ... | UseUseExplosion.rb:20:514:20:3316 | if ... | | UseUseExplosion.rb:20:535:20:3300 | if ... | UseUseExplosion.rb:20:530:20:3300 | then ... | | UseUseExplosion.rb:20:539:20:543 | [post] self | UseUseExplosion.rb:20:560:20:564 | self | | UseUseExplosion.rb:20:539:20:543 | [post] self | UseUseExplosion.rb:20:3291:20:3296 | self | | UseUseExplosion.rb:20:539:20:543 | self | UseUseExplosion.rb:20:560:20:564 | self | | UseUseExplosion.rb:20:539:20:543 | self | UseUseExplosion.rb:20:3291:20:3296 | self | -| UseUseExplosion.rb:20:539:20:548 | ... > ... | UseUseExplosion.rb:20:538:20:549 | [false] ( ... ) | -| UseUseExplosion.rb:20:539:20:548 | ... > ... | UseUseExplosion.rb:20:538:20:549 | [true] ( ... ) | +| UseUseExplosion.rb:20:539:20:548 | ... > ... | UseUseExplosion.rb:20:538:20:549 | ( ... ) | | UseUseExplosion.rb:20:551:20:3284 | then ... | UseUseExplosion.rb:20:535:20:3300 | if ... | | UseUseExplosion.rb:20:556:20:3284 | if ... | UseUseExplosion.rb:20:551:20:3284 | then ... | | UseUseExplosion.rb:20:560:20:564 | [post] self | UseUseExplosion.rb:20:581:20:585 | self | | UseUseExplosion.rb:20:560:20:564 | [post] self | UseUseExplosion.rb:20:3275:20:3280 | self | | UseUseExplosion.rb:20:560:20:564 | self | UseUseExplosion.rb:20:581:20:585 | self | | UseUseExplosion.rb:20:560:20:564 | self | UseUseExplosion.rb:20:3275:20:3280 | self | -| UseUseExplosion.rb:20:560:20:569 | ... > ... | UseUseExplosion.rb:20:559:20:570 | [false] ( ... ) | -| UseUseExplosion.rb:20:560:20:569 | ... > ... | UseUseExplosion.rb:20:559:20:570 | [true] ( ... ) | +| UseUseExplosion.rb:20:560:20:569 | ... > ... | UseUseExplosion.rb:20:559:20:570 | ( ... ) | | UseUseExplosion.rb:20:572:20:3268 | then ... | UseUseExplosion.rb:20:556:20:3284 | if ... | | UseUseExplosion.rb:20:577:20:3268 | if ... | UseUseExplosion.rb:20:572:20:3268 | then ... | | UseUseExplosion.rb:20:581:20:585 | [post] self | UseUseExplosion.rb:20:602:20:606 | self | | UseUseExplosion.rb:20:581:20:585 | [post] self | UseUseExplosion.rb:20:3259:20:3264 | self | | UseUseExplosion.rb:20:581:20:585 | self | UseUseExplosion.rb:20:602:20:606 | self | | UseUseExplosion.rb:20:581:20:585 | self | UseUseExplosion.rb:20:3259:20:3264 | self | -| UseUseExplosion.rb:20:581:20:590 | ... > ... | UseUseExplosion.rb:20:580:20:591 | [false] ( ... ) | -| UseUseExplosion.rb:20:581:20:590 | ... > ... | UseUseExplosion.rb:20:580:20:591 | [true] ( ... ) | +| UseUseExplosion.rb:20:581:20:590 | ... > ... | UseUseExplosion.rb:20:580:20:591 | ( ... ) | | UseUseExplosion.rb:20:593:20:3252 | then ... | UseUseExplosion.rb:20:577:20:3268 | if ... | | UseUseExplosion.rb:20:598:20:3252 | if ... | UseUseExplosion.rb:20:593:20:3252 | then ... | | UseUseExplosion.rb:20:602:20:606 | [post] self | UseUseExplosion.rb:20:623:20:627 | self | | UseUseExplosion.rb:20:602:20:606 | [post] self | UseUseExplosion.rb:20:3243:20:3248 | self | | UseUseExplosion.rb:20:602:20:606 | self | UseUseExplosion.rb:20:623:20:627 | self | | UseUseExplosion.rb:20:602:20:606 | self | UseUseExplosion.rb:20:3243:20:3248 | self | -| UseUseExplosion.rb:20:602:20:611 | ... > ... | UseUseExplosion.rb:20:601:20:612 | [false] ( ... ) | -| UseUseExplosion.rb:20:602:20:611 | ... > ... | UseUseExplosion.rb:20:601:20:612 | [true] ( ... ) | +| UseUseExplosion.rb:20:602:20:611 | ... > ... | UseUseExplosion.rb:20:601:20:612 | ( ... ) | | UseUseExplosion.rb:20:614:20:3236 | then ... | UseUseExplosion.rb:20:598:20:3252 | if ... | | UseUseExplosion.rb:20:619:20:3236 | if ... | UseUseExplosion.rb:20:614:20:3236 | then ... | | UseUseExplosion.rb:20:623:20:627 | [post] self | UseUseExplosion.rb:20:644:20:648 | self | | UseUseExplosion.rb:20:623:20:627 | [post] self | UseUseExplosion.rb:20:3227:20:3232 | self | | UseUseExplosion.rb:20:623:20:627 | self | UseUseExplosion.rb:20:644:20:648 | self | | UseUseExplosion.rb:20:623:20:627 | self | UseUseExplosion.rb:20:3227:20:3232 | self | -| UseUseExplosion.rb:20:623:20:632 | ... > ... | UseUseExplosion.rb:20:622:20:633 | [false] ( ... ) | -| UseUseExplosion.rb:20:623:20:632 | ... > ... | UseUseExplosion.rb:20:622:20:633 | [true] ( ... ) | +| UseUseExplosion.rb:20:623:20:632 | ... > ... | UseUseExplosion.rb:20:622:20:633 | ( ... ) | | UseUseExplosion.rb:20:635:20:3220 | then ... | UseUseExplosion.rb:20:619:20:3236 | if ... | | UseUseExplosion.rb:20:640:20:3220 | if ... | UseUseExplosion.rb:20:635:20:3220 | then ... | | UseUseExplosion.rb:20:644:20:648 | [post] self | UseUseExplosion.rb:20:665:20:669 | self | | UseUseExplosion.rb:20:644:20:648 | [post] self | UseUseExplosion.rb:20:3211:20:3216 | self | | UseUseExplosion.rb:20:644:20:648 | self | UseUseExplosion.rb:20:665:20:669 | self | | UseUseExplosion.rb:20:644:20:648 | self | UseUseExplosion.rb:20:3211:20:3216 | self | -| UseUseExplosion.rb:20:644:20:653 | ... > ... | UseUseExplosion.rb:20:643:20:654 | [false] ( ... ) | -| UseUseExplosion.rb:20:644:20:653 | ... > ... | UseUseExplosion.rb:20:643:20:654 | [true] ( ... ) | +| UseUseExplosion.rb:20:644:20:653 | ... > ... | UseUseExplosion.rb:20:643:20:654 | ( ... ) | | UseUseExplosion.rb:20:656:20:3204 | then ... | UseUseExplosion.rb:20:640:20:3220 | if ... | | UseUseExplosion.rb:20:661:20:3204 | if ... | UseUseExplosion.rb:20:656:20:3204 | then ... | | UseUseExplosion.rb:20:665:20:669 | [post] self | UseUseExplosion.rb:20:686:20:690 | self | | UseUseExplosion.rb:20:665:20:669 | [post] self | UseUseExplosion.rb:20:3195:20:3200 | self | | UseUseExplosion.rb:20:665:20:669 | self | UseUseExplosion.rb:20:686:20:690 | self | | UseUseExplosion.rb:20:665:20:669 | self | UseUseExplosion.rb:20:3195:20:3200 | self | -| UseUseExplosion.rb:20:665:20:674 | ... > ... | UseUseExplosion.rb:20:664:20:675 | [false] ( ... ) | -| UseUseExplosion.rb:20:665:20:674 | ... > ... | UseUseExplosion.rb:20:664:20:675 | [true] ( ... ) | +| UseUseExplosion.rb:20:665:20:674 | ... > ... | UseUseExplosion.rb:20:664:20:675 | ( ... ) | | UseUseExplosion.rb:20:677:20:3188 | then ... | UseUseExplosion.rb:20:661:20:3204 | if ... | | UseUseExplosion.rb:20:682:20:3188 | if ... | UseUseExplosion.rb:20:677:20:3188 | then ... | | UseUseExplosion.rb:20:686:20:690 | [post] self | UseUseExplosion.rb:20:707:20:711 | self | | UseUseExplosion.rb:20:686:20:690 | [post] self | UseUseExplosion.rb:20:3179:20:3184 | self | | UseUseExplosion.rb:20:686:20:690 | self | UseUseExplosion.rb:20:707:20:711 | self | | UseUseExplosion.rb:20:686:20:690 | self | UseUseExplosion.rb:20:3179:20:3184 | self | -| UseUseExplosion.rb:20:686:20:695 | ... > ... | UseUseExplosion.rb:20:685:20:696 | [false] ( ... ) | -| UseUseExplosion.rb:20:686:20:695 | ... > ... | UseUseExplosion.rb:20:685:20:696 | [true] ( ... ) | +| UseUseExplosion.rb:20:686:20:695 | ... > ... | UseUseExplosion.rb:20:685:20:696 | ( ... ) | | UseUseExplosion.rb:20:698:20:3172 | then ... | UseUseExplosion.rb:20:682:20:3188 | if ... | | UseUseExplosion.rb:20:703:20:3172 | if ... | UseUseExplosion.rb:20:698:20:3172 | then ... | | UseUseExplosion.rb:20:707:20:711 | [post] self | UseUseExplosion.rb:20:728:20:732 | self | | UseUseExplosion.rb:20:707:20:711 | [post] self | UseUseExplosion.rb:20:3163:20:3168 | self | | UseUseExplosion.rb:20:707:20:711 | self | UseUseExplosion.rb:20:728:20:732 | self | | UseUseExplosion.rb:20:707:20:711 | self | UseUseExplosion.rb:20:3163:20:3168 | self | -| UseUseExplosion.rb:20:707:20:716 | ... > ... | UseUseExplosion.rb:20:706:20:717 | [false] ( ... ) | -| UseUseExplosion.rb:20:707:20:716 | ... > ... | UseUseExplosion.rb:20:706:20:717 | [true] ( ... ) | +| UseUseExplosion.rb:20:707:20:716 | ... > ... | UseUseExplosion.rb:20:706:20:717 | ( ... ) | | UseUseExplosion.rb:20:719:20:3156 | then ... | UseUseExplosion.rb:20:703:20:3172 | if ... | | UseUseExplosion.rb:20:724:20:3156 | if ... | UseUseExplosion.rb:20:719:20:3156 | then ... | | UseUseExplosion.rb:20:728:20:732 | [post] self | UseUseExplosion.rb:20:749:20:753 | self | | UseUseExplosion.rb:20:728:20:732 | [post] self | UseUseExplosion.rb:20:3147:20:3152 | self | | UseUseExplosion.rb:20:728:20:732 | self | UseUseExplosion.rb:20:749:20:753 | self | | UseUseExplosion.rb:20:728:20:732 | self | UseUseExplosion.rb:20:3147:20:3152 | self | -| UseUseExplosion.rb:20:728:20:737 | ... > ... | UseUseExplosion.rb:20:727:20:738 | [false] ( ... ) | -| UseUseExplosion.rb:20:728:20:737 | ... > ... | UseUseExplosion.rb:20:727:20:738 | [true] ( ... ) | +| UseUseExplosion.rb:20:728:20:737 | ... > ... | UseUseExplosion.rb:20:727:20:738 | ( ... ) | | UseUseExplosion.rb:20:740:20:3140 | then ... | UseUseExplosion.rb:20:724:20:3156 | if ... | | UseUseExplosion.rb:20:745:20:3140 | if ... | UseUseExplosion.rb:20:740:20:3140 | then ... | | UseUseExplosion.rb:20:749:20:753 | [post] self | UseUseExplosion.rb:20:770:20:774 | self | | UseUseExplosion.rb:20:749:20:753 | [post] self | UseUseExplosion.rb:20:3131:20:3136 | self | | UseUseExplosion.rb:20:749:20:753 | self | UseUseExplosion.rb:20:770:20:774 | self | | UseUseExplosion.rb:20:749:20:753 | self | UseUseExplosion.rb:20:3131:20:3136 | self | -| UseUseExplosion.rb:20:749:20:758 | ... > ... | UseUseExplosion.rb:20:748:20:759 | [false] ( ... ) | -| UseUseExplosion.rb:20:749:20:758 | ... > ... | UseUseExplosion.rb:20:748:20:759 | [true] ( ... ) | +| UseUseExplosion.rb:20:749:20:758 | ... > ... | UseUseExplosion.rb:20:748:20:759 | ( ... ) | | UseUseExplosion.rb:20:761:20:3124 | then ... | UseUseExplosion.rb:20:745:20:3140 | if ... | | UseUseExplosion.rb:20:766:20:3124 | if ... | UseUseExplosion.rb:20:761:20:3124 | then ... | | UseUseExplosion.rb:20:770:20:774 | [post] self | UseUseExplosion.rb:20:791:20:795 | self | | UseUseExplosion.rb:20:770:20:774 | [post] self | UseUseExplosion.rb:20:3115:20:3120 | self | | UseUseExplosion.rb:20:770:20:774 | self | UseUseExplosion.rb:20:791:20:795 | self | | UseUseExplosion.rb:20:770:20:774 | self | UseUseExplosion.rb:20:3115:20:3120 | self | -| UseUseExplosion.rb:20:770:20:779 | ... > ... | UseUseExplosion.rb:20:769:20:780 | [false] ( ... ) | -| UseUseExplosion.rb:20:770:20:779 | ... > ... | UseUseExplosion.rb:20:769:20:780 | [true] ( ... ) | +| UseUseExplosion.rb:20:770:20:779 | ... > ... | UseUseExplosion.rb:20:769:20:780 | ( ... ) | | UseUseExplosion.rb:20:782:20:3108 | then ... | UseUseExplosion.rb:20:766:20:3124 | if ... | | UseUseExplosion.rb:20:787:20:3108 | if ... | UseUseExplosion.rb:20:782:20:3108 | then ... | | UseUseExplosion.rb:20:791:20:795 | [post] self | UseUseExplosion.rb:20:812:20:816 | self | | UseUseExplosion.rb:20:791:20:795 | [post] self | UseUseExplosion.rb:20:3099:20:3104 | self | | UseUseExplosion.rb:20:791:20:795 | self | UseUseExplosion.rb:20:812:20:816 | self | | UseUseExplosion.rb:20:791:20:795 | self | UseUseExplosion.rb:20:3099:20:3104 | self | -| UseUseExplosion.rb:20:791:20:800 | ... > ... | UseUseExplosion.rb:20:790:20:801 | [false] ( ... ) | -| UseUseExplosion.rb:20:791:20:800 | ... > ... | UseUseExplosion.rb:20:790:20:801 | [true] ( ... ) | +| UseUseExplosion.rb:20:791:20:800 | ... > ... | UseUseExplosion.rb:20:790:20:801 | ( ... ) | | UseUseExplosion.rb:20:803:20:3092 | then ... | UseUseExplosion.rb:20:787:20:3108 | if ... | | UseUseExplosion.rb:20:808:20:3092 | if ... | UseUseExplosion.rb:20:803:20:3092 | then ... | | UseUseExplosion.rb:20:812:20:816 | [post] self | UseUseExplosion.rb:20:833:20:837 | self | | UseUseExplosion.rb:20:812:20:816 | [post] self | UseUseExplosion.rb:20:3083:20:3088 | self | | UseUseExplosion.rb:20:812:20:816 | self | UseUseExplosion.rb:20:833:20:837 | self | | UseUseExplosion.rb:20:812:20:816 | self | UseUseExplosion.rb:20:3083:20:3088 | self | -| UseUseExplosion.rb:20:812:20:821 | ... > ... | UseUseExplosion.rb:20:811:20:822 | [false] ( ... ) | -| UseUseExplosion.rb:20:812:20:821 | ... > ... | UseUseExplosion.rb:20:811:20:822 | [true] ( ... ) | +| UseUseExplosion.rb:20:812:20:821 | ... > ... | UseUseExplosion.rb:20:811:20:822 | ( ... ) | | UseUseExplosion.rb:20:824:20:3076 | then ... | UseUseExplosion.rb:20:808:20:3092 | if ... | | UseUseExplosion.rb:20:829:20:3076 | if ... | UseUseExplosion.rb:20:824:20:3076 | then ... | | UseUseExplosion.rb:20:833:20:837 | [post] self | UseUseExplosion.rb:20:854:20:858 | self | | UseUseExplosion.rb:20:833:20:837 | [post] self | UseUseExplosion.rb:20:3067:20:3072 | self | | UseUseExplosion.rb:20:833:20:837 | self | UseUseExplosion.rb:20:854:20:858 | self | | UseUseExplosion.rb:20:833:20:837 | self | UseUseExplosion.rb:20:3067:20:3072 | self | -| UseUseExplosion.rb:20:833:20:842 | ... > ... | UseUseExplosion.rb:20:832:20:843 | [false] ( ... ) | -| UseUseExplosion.rb:20:833:20:842 | ... > ... | UseUseExplosion.rb:20:832:20:843 | [true] ( ... ) | +| UseUseExplosion.rb:20:833:20:842 | ... > ... | UseUseExplosion.rb:20:832:20:843 | ( ... ) | | UseUseExplosion.rb:20:845:20:3060 | then ... | UseUseExplosion.rb:20:829:20:3076 | if ... | | UseUseExplosion.rb:20:850:20:3060 | if ... | UseUseExplosion.rb:20:845:20:3060 | then ... | | UseUseExplosion.rb:20:854:20:858 | [post] self | UseUseExplosion.rb:20:875:20:879 | self | | UseUseExplosion.rb:20:854:20:858 | [post] self | UseUseExplosion.rb:20:3051:20:3056 | self | | UseUseExplosion.rb:20:854:20:858 | self | UseUseExplosion.rb:20:875:20:879 | self | | UseUseExplosion.rb:20:854:20:858 | self | UseUseExplosion.rb:20:3051:20:3056 | self | -| UseUseExplosion.rb:20:854:20:863 | ... > ... | UseUseExplosion.rb:20:853:20:864 | [false] ( ... ) | -| UseUseExplosion.rb:20:854:20:863 | ... > ... | UseUseExplosion.rb:20:853:20:864 | [true] ( ... ) | +| UseUseExplosion.rb:20:854:20:863 | ... > ... | UseUseExplosion.rb:20:853:20:864 | ( ... ) | | UseUseExplosion.rb:20:866:20:3044 | then ... | UseUseExplosion.rb:20:850:20:3060 | if ... | | UseUseExplosion.rb:20:871:20:3044 | if ... | UseUseExplosion.rb:20:866:20:3044 | then ... | | UseUseExplosion.rb:20:875:20:879 | [post] self | UseUseExplosion.rb:20:896:20:900 | self | | UseUseExplosion.rb:20:875:20:879 | [post] self | UseUseExplosion.rb:20:3035:20:3040 | self | | UseUseExplosion.rb:20:875:20:879 | self | UseUseExplosion.rb:20:896:20:900 | self | | UseUseExplosion.rb:20:875:20:879 | self | UseUseExplosion.rb:20:3035:20:3040 | self | -| UseUseExplosion.rb:20:875:20:884 | ... > ... | UseUseExplosion.rb:20:874:20:885 | [false] ( ... ) | -| UseUseExplosion.rb:20:875:20:884 | ... > ... | UseUseExplosion.rb:20:874:20:885 | [true] ( ... ) | +| UseUseExplosion.rb:20:875:20:884 | ... > ... | UseUseExplosion.rb:20:874:20:885 | ( ... ) | | UseUseExplosion.rb:20:887:20:3028 | then ... | UseUseExplosion.rb:20:871:20:3044 | if ... | | UseUseExplosion.rb:20:892:20:3028 | if ... | UseUseExplosion.rb:20:887:20:3028 | then ... | | UseUseExplosion.rb:20:896:20:900 | [post] self | UseUseExplosion.rb:20:917:20:921 | self | | UseUseExplosion.rb:20:896:20:900 | [post] self | UseUseExplosion.rb:20:3019:20:3024 | self | | UseUseExplosion.rb:20:896:20:900 | self | UseUseExplosion.rb:20:917:20:921 | self | | UseUseExplosion.rb:20:896:20:900 | self | UseUseExplosion.rb:20:3019:20:3024 | self | -| UseUseExplosion.rb:20:896:20:905 | ... > ... | UseUseExplosion.rb:20:895:20:906 | [false] ( ... ) | -| UseUseExplosion.rb:20:896:20:905 | ... > ... | UseUseExplosion.rb:20:895:20:906 | [true] ( ... ) | +| UseUseExplosion.rb:20:896:20:905 | ... > ... | UseUseExplosion.rb:20:895:20:906 | ( ... ) | | UseUseExplosion.rb:20:908:20:3012 | then ... | UseUseExplosion.rb:20:892:20:3028 | if ... | | UseUseExplosion.rb:20:913:20:3012 | if ... | UseUseExplosion.rb:20:908:20:3012 | then ... | | UseUseExplosion.rb:20:917:20:921 | [post] self | UseUseExplosion.rb:20:938:20:942 | self | | UseUseExplosion.rb:20:917:20:921 | [post] self | UseUseExplosion.rb:20:3003:20:3008 | self | | UseUseExplosion.rb:20:917:20:921 | self | UseUseExplosion.rb:20:938:20:942 | self | | UseUseExplosion.rb:20:917:20:921 | self | UseUseExplosion.rb:20:3003:20:3008 | self | -| UseUseExplosion.rb:20:917:20:926 | ... > ... | UseUseExplosion.rb:20:916:20:927 | [false] ( ... ) | -| UseUseExplosion.rb:20:917:20:926 | ... > ... | UseUseExplosion.rb:20:916:20:927 | [true] ( ... ) | +| UseUseExplosion.rb:20:917:20:926 | ... > ... | UseUseExplosion.rb:20:916:20:927 | ( ... ) | | UseUseExplosion.rb:20:929:20:2996 | then ... | UseUseExplosion.rb:20:913:20:3012 | if ... | | UseUseExplosion.rb:20:934:20:2996 | if ... | UseUseExplosion.rb:20:929:20:2996 | then ... | | UseUseExplosion.rb:20:938:20:942 | [post] self | UseUseExplosion.rb:20:959:20:963 | self | | UseUseExplosion.rb:20:938:20:942 | [post] self | UseUseExplosion.rb:20:2987:20:2992 | self | | UseUseExplosion.rb:20:938:20:942 | self | UseUseExplosion.rb:20:959:20:963 | self | | UseUseExplosion.rb:20:938:20:942 | self | UseUseExplosion.rb:20:2987:20:2992 | self | -| UseUseExplosion.rb:20:938:20:947 | ... > ... | UseUseExplosion.rb:20:937:20:948 | [false] ( ... ) | -| UseUseExplosion.rb:20:938:20:947 | ... > ... | UseUseExplosion.rb:20:937:20:948 | [true] ( ... ) | +| UseUseExplosion.rb:20:938:20:947 | ... > ... | UseUseExplosion.rb:20:937:20:948 | ( ... ) | | UseUseExplosion.rb:20:950:20:2980 | then ... | UseUseExplosion.rb:20:934:20:2996 | if ... | | UseUseExplosion.rb:20:955:20:2980 | if ... | UseUseExplosion.rb:20:950:20:2980 | then ... | | UseUseExplosion.rb:20:959:20:963 | [post] self | UseUseExplosion.rb:20:980:20:984 | self | | UseUseExplosion.rb:20:959:20:963 | [post] self | UseUseExplosion.rb:20:2971:20:2976 | self | | UseUseExplosion.rb:20:959:20:963 | self | UseUseExplosion.rb:20:980:20:984 | self | | UseUseExplosion.rb:20:959:20:963 | self | UseUseExplosion.rb:20:2971:20:2976 | self | -| UseUseExplosion.rb:20:959:20:968 | ... > ... | UseUseExplosion.rb:20:958:20:969 | [false] ( ... ) | -| UseUseExplosion.rb:20:959:20:968 | ... > ... | UseUseExplosion.rb:20:958:20:969 | [true] ( ... ) | +| UseUseExplosion.rb:20:959:20:968 | ... > ... | UseUseExplosion.rb:20:958:20:969 | ( ... ) | | UseUseExplosion.rb:20:971:20:2964 | then ... | UseUseExplosion.rb:20:955:20:2980 | if ... | | UseUseExplosion.rb:20:976:20:2964 | if ... | UseUseExplosion.rb:20:971:20:2964 | then ... | | UseUseExplosion.rb:20:980:20:984 | [post] self | UseUseExplosion.rb:20:1001:20:1005 | self | | UseUseExplosion.rb:20:980:20:984 | [post] self | UseUseExplosion.rb:20:2955:20:2960 | self | | UseUseExplosion.rb:20:980:20:984 | self | UseUseExplosion.rb:20:1001:20:1005 | self | | UseUseExplosion.rb:20:980:20:984 | self | UseUseExplosion.rb:20:2955:20:2960 | self | -| UseUseExplosion.rb:20:980:20:989 | ... > ... | UseUseExplosion.rb:20:979:20:990 | [false] ( ... ) | -| UseUseExplosion.rb:20:980:20:989 | ... > ... | UseUseExplosion.rb:20:979:20:990 | [true] ( ... ) | +| UseUseExplosion.rb:20:980:20:989 | ... > ... | UseUseExplosion.rb:20:979:20:990 | ( ... ) | | UseUseExplosion.rb:20:992:20:2948 | then ... | UseUseExplosion.rb:20:976:20:2964 | if ... | | UseUseExplosion.rb:20:997:20:2948 | if ... | UseUseExplosion.rb:20:992:20:2948 | then ... | | UseUseExplosion.rb:20:1001:20:1005 | [post] self | UseUseExplosion.rb:20:1022:20:1026 | self | | UseUseExplosion.rb:20:1001:20:1005 | [post] self | UseUseExplosion.rb:20:2939:20:2944 | self | | UseUseExplosion.rb:20:1001:20:1005 | self | UseUseExplosion.rb:20:1022:20:1026 | self | | UseUseExplosion.rb:20:1001:20:1005 | self | UseUseExplosion.rb:20:2939:20:2944 | self | -| UseUseExplosion.rb:20:1001:20:1010 | ... > ... | UseUseExplosion.rb:20:1000:20:1011 | [false] ( ... ) | -| UseUseExplosion.rb:20:1001:20:1010 | ... > ... | UseUseExplosion.rb:20:1000:20:1011 | [true] ( ... ) | +| UseUseExplosion.rb:20:1001:20:1010 | ... > ... | UseUseExplosion.rb:20:1000:20:1011 | ( ... ) | | UseUseExplosion.rb:20:1013:20:2932 | then ... | UseUseExplosion.rb:20:997:20:2948 | if ... | | UseUseExplosion.rb:20:1018:20:2932 | if ... | UseUseExplosion.rb:20:1013:20:2932 | then ... | | UseUseExplosion.rb:20:1022:20:1026 | [post] self | UseUseExplosion.rb:20:1043:20:1047 | self | | UseUseExplosion.rb:20:1022:20:1026 | [post] self | UseUseExplosion.rb:20:2923:20:2928 | self | | UseUseExplosion.rb:20:1022:20:1026 | self | UseUseExplosion.rb:20:1043:20:1047 | self | | UseUseExplosion.rb:20:1022:20:1026 | self | UseUseExplosion.rb:20:2923:20:2928 | self | -| UseUseExplosion.rb:20:1022:20:1031 | ... > ... | UseUseExplosion.rb:20:1021:20:1032 | [false] ( ... ) | -| UseUseExplosion.rb:20:1022:20:1031 | ... > ... | UseUseExplosion.rb:20:1021:20:1032 | [true] ( ... ) | +| UseUseExplosion.rb:20:1022:20:1031 | ... > ... | UseUseExplosion.rb:20:1021:20:1032 | ( ... ) | | UseUseExplosion.rb:20:1034:20:2916 | then ... | UseUseExplosion.rb:20:1018:20:2932 | if ... | | UseUseExplosion.rb:20:1039:20:2916 | if ... | UseUseExplosion.rb:20:1034:20:2916 | then ... | | UseUseExplosion.rb:20:1043:20:1047 | [post] self | UseUseExplosion.rb:20:1064:20:1068 | self | | UseUseExplosion.rb:20:1043:20:1047 | [post] self | UseUseExplosion.rb:20:2907:20:2912 | self | | UseUseExplosion.rb:20:1043:20:1047 | self | UseUseExplosion.rb:20:1064:20:1068 | self | | UseUseExplosion.rb:20:1043:20:1047 | self | UseUseExplosion.rb:20:2907:20:2912 | self | -| UseUseExplosion.rb:20:1043:20:1052 | ... > ... | UseUseExplosion.rb:20:1042:20:1053 | [false] ( ... ) | -| UseUseExplosion.rb:20:1043:20:1052 | ... > ... | UseUseExplosion.rb:20:1042:20:1053 | [true] ( ... ) | +| UseUseExplosion.rb:20:1043:20:1052 | ... > ... | UseUseExplosion.rb:20:1042:20:1053 | ( ... ) | | UseUseExplosion.rb:20:1055:20:2900 | then ... | UseUseExplosion.rb:20:1039:20:2916 | if ... | | UseUseExplosion.rb:20:1060:20:2900 | if ... | UseUseExplosion.rb:20:1055:20:2900 | then ... | | UseUseExplosion.rb:20:1064:20:1068 | [post] self | UseUseExplosion.rb:20:1085:20:1089 | self | | UseUseExplosion.rb:20:1064:20:1068 | [post] self | UseUseExplosion.rb:20:2891:20:2896 | self | | UseUseExplosion.rb:20:1064:20:1068 | self | UseUseExplosion.rb:20:1085:20:1089 | self | | UseUseExplosion.rb:20:1064:20:1068 | self | UseUseExplosion.rb:20:2891:20:2896 | self | -| UseUseExplosion.rb:20:1064:20:1073 | ... > ... | UseUseExplosion.rb:20:1063:20:1074 | [false] ( ... ) | -| UseUseExplosion.rb:20:1064:20:1073 | ... > ... | UseUseExplosion.rb:20:1063:20:1074 | [true] ( ... ) | +| UseUseExplosion.rb:20:1064:20:1073 | ... > ... | UseUseExplosion.rb:20:1063:20:1074 | ( ... ) | | UseUseExplosion.rb:20:1076:20:2884 | then ... | UseUseExplosion.rb:20:1060:20:2900 | if ... | | UseUseExplosion.rb:20:1081:20:2884 | if ... | UseUseExplosion.rb:20:1076:20:2884 | then ... | | UseUseExplosion.rb:20:1085:20:1089 | [post] self | UseUseExplosion.rb:20:1106:20:1110 | self | | UseUseExplosion.rb:20:1085:20:1089 | [post] self | UseUseExplosion.rb:20:2875:20:2880 | self | | UseUseExplosion.rb:20:1085:20:1089 | self | UseUseExplosion.rb:20:1106:20:1110 | self | | UseUseExplosion.rb:20:1085:20:1089 | self | UseUseExplosion.rb:20:2875:20:2880 | self | -| UseUseExplosion.rb:20:1085:20:1094 | ... > ... | UseUseExplosion.rb:20:1084:20:1095 | [false] ( ... ) | -| UseUseExplosion.rb:20:1085:20:1094 | ... > ... | UseUseExplosion.rb:20:1084:20:1095 | [true] ( ... ) | +| UseUseExplosion.rb:20:1085:20:1094 | ... > ... | UseUseExplosion.rb:20:1084:20:1095 | ( ... ) | | UseUseExplosion.rb:20:1097:20:2868 | then ... | UseUseExplosion.rb:20:1081:20:2884 | if ... | | UseUseExplosion.rb:20:1102:20:2868 | if ... | UseUseExplosion.rb:20:1097:20:2868 | then ... | | UseUseExplosion.rb:20:1106:20:1110 | [post] self | UseUseExplosion.rb:20:1127:20:1131 | self | | UseUseExplosion.rb:20:1106:20:1110 | [post] self | UseUseExplosion.rb:20:2859:20:2864 | self | | UseUseExplosion.rb:20:1106:20:1110 | self | UseUseExplosion.rb:20:1127:20:1131 | self | | UseUseExplosion.rb:20:1106:20:1110 | self | UseUseExplosion.rb:20:2859:20:2864 | self | -| UseUseExplosion.rb:20:1106:20:1115 | ... > ... | UseUseExplosion.rb:20:1105:20:1116 | [false] ( ... ) | -| UseUseExplosion.rb:20:1106:20:1115 | ... > ... | UseUseExplosion.rb:20:1105:20:1116 | [true] ( ... ) | +| UseUseExplosion.rb:20:1106:20:1115 | ... > ... | UseUseExplosion.rb:20:1105:20:1116 | ( ... ) | | UseUseExplosion.rb:20:1118:20:2852 | then ... | UseUseExplosion.rb:20:1102:20:2868 | if ... | | UseUseExplosion.rb:20:1123:20:2852 | if ... | UseUseExplosion.rb:20:1118:20:2852 | then ... | | UseUseExplosion.rb:20:1127:20:1131 | [post] self | UseUseExplosion.rb:20:1148:20:1152 | self | | UseUseExplosion.rb:20:1127:20:1131 | [post] self | UseUseExplosion.rb:20:2843:20:2848 | self | | UseUseExplosion.rb:20:1127:20:1131 | self | UseUseExplosion.rb:20:1148:20:1152 | self | | UseUseExplosion.rb:20:1127:20:1131 | self | UseUseExplosion.rb:20:2843:20:2848 | self | -| UseUseExplosion.rb:20:1127:20:1136 | ... > ... | UseUseExplosion.rb:20:1126:20:1137 | [false] ( ... ) | -| UseUseExplosion.rb:20:1127:20:1136 | ... > ... | UseUseExplosion.rb:20:1126:20:1137 | [true] ( ... ) | +| UseUseExplosion.rb:20:1127:20:1136 | ... > ... | UseUseExplosion.rb:20:1126:20:1137 | ( ... ) | | UseUseExplosion.rb:20:1139:20:2836 | then ... | UseUseExplosion.rb:20:1123:20:2852 | if ... | | UseUseExplosion.rb:20:1144:20:2836 | if ... | UseUseExplosion.rb:20:1139:20:2836 | then ... | | UseUseExplosion.rb:20:1148:20:1152 | [post] self | UseUseExplosion.rb:20:1169:20:1173 | self | | UseUseExplosion.rb:20:1148:20:1152 | [post] self | UseUseExplosion.rb:20:2827:20:2832 | self | | UseUseExplosion.rb:20:1148:20:1152 | self | UseUseExplosion.rb:20:1169:20:1173 | self | | UseUseExplosion.rb:20:1148:20:1152 | self | UseUseExplosion.rb:20:2827:20:2832 | self | -| UseUseExplosion.rb:20:1148:20:1157 | ... > ... | UseUseExplosion.rb:20:1147:20:1158 | [false] ( ... ) | -| UseUseExplosion.rb:20:1148:20:1157 | ... > ... | UseUseExplosion.rb:20:1147:20:1158 | [true] ( ... ) | +| UseUseExplosion.rb:20:1148:20:1157 | ... > ... | UseUseExplosion.rb:20:1147:20:1158 | ( ... ) | | UseUseExplosion.rb:20:1160:20:2820 | then ... | UseUseExplosion.rb:20:1144:20:2836 | if ... | | UseUseExplosion.rb:20:1165:20:2820 | if ... | UseUseExplosion.rb:20:1160:20:2820 | then ... | | UseUseExplosion.rb:20:1169:20:1173 | [post] self | UseUseExplosion.rb:20:1190:20:1194 | self | | UseUseExplosion.rb:20:1169:20:1173 | [post] self | UseUseExplosion.rb:20:2811:20:2816 | self | | UseUseExplosion.rb:20:1169:20:1173 | self | UseUseExplosion.rb:20:1190:20:1194 | self | | UseUseExplosion.rb:20:1169:20:1173 | self | UseUseExplosion.rb:20:2811:20:2816 | self | -| UseUseExplosion.rb:20:1169:20:1178 | ... > ... | UseUseExplosion.rb:20:1168:20:1179 | [false] ( ... ) | -| UseUseExplosion.rb:20:1169:20:1178 | ... > ... | UseUseExplosion.rb:20:1168:20:1179 | [true] ( ... ) | +| UseUseExplosion.rb:20:1169:20:1178 | ... > ... | UseUseExplosion.rb:20:1168:20:1179 | ( ... ) | | UseUseExplosion.rb:20:1181:20:2804 | then ... | UseUseExplosion.rb:20:1165:20:2820 | if ... | | UseUseExplosion.rb:20:1186:20:2804 | if ... | UseUseExplosion.rb:20:1181:20:2804 | then ... | | UseUseExplosion.rb:20:1190:20:1194 | [post] self | UseUseExplosion.rb:20:1211:20:1215 | self | | UseUseExplosion.rb:20:1190:20:1194 | [post] self | UseUseExplosion.rb:20:2795:20:2800 | self | | UseUseExplosion.rb:20:1190:20:1194 | self | UseUseExplosion.rb:20:1211:20:1215 | self | | UseUseExplosion.rb:20:1190:20:1194 | self | UseUseExplosion.rb:20:2795:20:2800 | self | -| UseUseExplosion.rb:20:1190:20:1199 | ... > ... | UseUseExplosion.rb:20:1189:20:1200 | [false] ( ... ) | -| UseUseExplosion.rb:20:1190:20:1199 | ... > ... | UseUseExplosion.rb:20:1189:20:1200 | [true] ( ... ) | +| UseUseExplosion.rb:20:1190:20:1199 | ... > ... | UseUseExplosion.rb:20:1189:20:1200 | ( ... ) | | UseUseExplosion.rb:20:1202:20:2788 | then ... | UseUseExplosion.rb:20:1186:20:2804 | if ... | | UseUseExplosion.rb:20:1207:20:2788 | if ... | UseUseExplosion.rb:20:1202:20:2788 | then ... | | UseUseExplosion.rb:20:1211:20:1215 | [post] self | UseUseExplosion.rb:20:1232:20:1236 | self | | UseUseExplosion.rb:20:1211:20:1215 | [post] self | UseUseExplosion.rb:20:2779:20:2784 | self | | UseUseExplosion.rb:20:1211:20:1215 | self | UseUseExplosion.rb:20:1232:20:1236 | self | | UseUseExplosion.rb:20:1211:20:1215 | self | UseUseExplosion.rb:20:2779:20:2784 | self | -| UseUseExplosion.rb:20:1211:20:1220 | ... > ... | UseUseExplosion.rb:20:1210:20:1221 | [false] ( ... ) | -| UseUseExplosion.rb:20:1211:20:1220 | ... > ... | UseUseExplosion.rb:20:1210:20:1221 | [true] ( ... ) | +| UseUseExplosion.rb:20:1211:20:1220 | ... > ... | UseUseExplosion.rb:20:1210:20:1221 | ( ... ) | | UseUseExplosion.rb:20:1223:20:2772 | then ... | UseUseExplosion.rb:20:1207:20:2788 | if ... | | UseUseExplosion.rb:20:1228:20:2772 | if ... | UseUseExplosion.rb:20:1223:20:2772 | then ... | | UseUseExplosion.rb:20:1232:20:1236 | [post] self | UseUseExplosion.rb:20:1253:20:1257 | self | | UseUseExplosion.rb:20:1232:20:1236 | [post] self | UseUseExplosion.rb:20:2763:20:2768 | self | | UseUseExplosion.rb:20:1232:20:1236 | self | UseUseExplosion.rb:20:1253:20:1257 | self | | UseUseExplosion.rb:20:1232:20:1236 | self | UseUseExplosion.rb:20:2763:20:2768 | self | -| UseUseExplosion.rb:20:1232:20:1241 | ... > ... | UseUseExplosion.rb:20:1231:20:1242 | [false] ( ... ) | -| UseUseExplosion.rb:20:1232:20:1241 | ... > ... | UseUseExplosion.rb:20:1231:20:1242 | [true] ( ... ) | +| UseUseExplosion.rb:20:1232:20:1241 | ... > ... | UseUseExplosion.rb:20:1231:20:1242 | ( ... ) | | UseUseExplosion.rb:20:1244:20:2756 | then ... | UseUseExplosion.rb:20:1228:20:2772 | if ... | | UseUseExplosion.rb:20:1249:20:2756 | if ... | UseUseExplosion.rb:20:1244:20:2756 | then ... | | UseUseExplosion.rb:20:1253:20:1257 | [post] self | UseUseExplosion.rb:20:1274:20:1278 | self | | UseUseExplosion.rb:20:1253:20:1257 | [post] self | UseUseExplosion.rb:20:2747:20:2752 | self | | UseUseExplosion.rb:20:1253:20:1257 | self | UseUseExplosion.rb:20:1274:20:1278 | self | | UseUseExplosion.rb:20:1253:20:1257 | self | UseUseExplosion.rb:20:2747:20:2752 | self | -| UseUseExplosion.rb:20:1253:20:1262 | ... > ... | UseUseExplosion.rb:20:1252:20:1263 | [false] ( ... ) | -| UseUseExplosion.rb:20:1253:20:1262 | ... > ... | UseUseExplosion.rb:20:1252:20:1263 | [true] ( ... ) | +| UseUseExplosion.rb:20:1253:20:1262 | ... > ... | UseUseExplosion.rb:20:1252:20:1263 | ( ... ) | | UseUseExplosion.rb:20:1265:20:2740 | then ... | UseUseExplosion.rb:20:1249:20:2756 | if ... | | UseUseExplosion.rb:20:1270:20:2740 | if ... | UseUseExplosion.rb:20:1265:20:2740 | then ... | | UseUseExplosion.rb:20:1274:20:1278 | [post] self | UseUseExplosion.rb:20:1295:20:1299 | self | | UseUseExplosion.rb:20:1274:20:1278 | [post] self | UseUseExplosion.rb:20:2731:20:2736 | self | | UseUseExplosion.rb:20:1274:20:1278 | self | UseUseExplosion.rb:20:1295:20:1299 | self | | UseUseExplosion.rb:20:1274:20:1278 | self | UseUseExplosion.rb:20:2731:20:2736 | self | -| UseUseExplosion.rb:20:1274:20:1283 | ... > ... | UseUseExplosion.rb:20:1273:20:1284 | [false] ( ... ) | -| UseUseExplosion.rb:20:1274:20:1283 | ... > ... | UseUseExplosion.rb:20:1273:20:1284 | [true] ( ... ) | +| UseUseExplosion.rb:20:1274:20:1283 | ... > ... | UseUseExplosion.rb:20:1273:20:1284 | ( ... ) | | UseUseExplosion.rb:20:1286:20:2724 | then ... | UseUseExplosion.rb:20:1270:20:2740 | if ... | | UseUseExplosion.rb:20:1291:20:2724 | if ... | UseUseExplosion.rb:20:1286:20:2724 | then ... | | UseUseExplosion.rb:20:1295:20:1299 | [post] self | UseUseExplosion.rb:20:1316:20:1320 | self | | UseUseExplosion.rb:20:1295:20:1299 | [post] self | UseUseExplosion.rb:20:2715:20:2720 | self | | UseUseExplosion.rb:20:1295:20:1299 | self | UseUseExplosion.rb:20:1316:20:1320 | self | | UseUseExplosion.rb:20:1295:20:1299 | self | UseUseExplosion.rb:20:2715:20:2720 | self | -| UseUseExplosion.rb:20:1295:20:1304 | ... > ... | UseUseExplosion.rb:20:1294:20:1305 | [false] ( ... ) | -| UseUseExplosion.rb:20:1295:20:1304 | ... > ... | UseUseExplosion.rb:20:1294:20:1305 | [true] ( ... ) | +| UseUseExplosion.rb:20:1295:20:1304 | ... > ... | UseUseExplosion.rb:20:1294:20:1305 | ( ... ) | | UseUseExplosion.rb:20:1307:20:2708 | then ... | UseUseExplosion.rb:20:1291:20:2724 | if ... | | UseUseExplosion.rb:20:1312:20:2708 | if ... | UseUseExplosion.rb:20:1307:20:2708 | then ... | | UseUseExplosion.rb:20:1316:20:1320 | [post] self | UseUseExplosion.rb:20:1337:20:1341 | self | | UseUseExplosion.rb:20:1316:20:1320 | [post] self | UseUseExplosion.rb:20:2699:20:2704 | self | | UseUseExplosion.rb:20:1316:20:1320 | self | UseUseExplosion.rb:20:1337:20:1341 | self | | UseUseExplosion.rb:20:1316:20:1320 | self | UseUseExplosion.rb:20:2699:20:2704 | self | -| UseUseExplosion.rb:20:1316:20:1325 | ... > ... | UseUseExplosion.rb:20:1315:20:1326 | [false] ( ... ) | -| UseUseExplosion.rb:20:1316:20:1325 | ... > ... | UseUseExplosion.rb:20:1315:20:1326 | [true] ( ... ) | +| UseUseExplosion.rb:20:1316:20:1325 | ... > ... | UseUseExplosion.rb:20:1315:20:1326 | ( ... ) | | UseUseExplosion.rb:20:1328:20:2692 | then ... | UseUseExplosion.rb:20:1312:20:2708 | if ... | | UseUseExplosion.rb:20:1333:20:2692 | if ... | UseUseExplosion.rb:20:1328:20:2692 | then ... | | UseUseExplosion.rb:20:1337:20:1341 | [post] self | UseUseExplosion.rb:20:1358:20:1362 | self | | UseUseExplosion.rb:20:1337:20:1341 | [post] self | UseUseExplosion.rb:20:2683:20:2688 | self | | UseUseExplosion.rb:20:1337:20:1341 | self | UseUseExplosion.rb:20:1358:20:1362 | self | | UseUseExplosion.rb:20:1337:20:1341 | self | UseUseExplosion.rb:20:2683:20:2688 | self | -| UseUseExplosion.rb:20:1337:20:1346 | ... > ... | UseUseExplosion.rb:20:1336:20:1347 | [false] ( ... ) | -| UseUseExplosion.rb:20:1337:20:1346 | ... > ... | UseUseExplosion.rb:20:1336:20:1347 | [true] ( ... ) | +| UseUseExplosion.rb:20:1337:20:1346 | ... > ... | UseUseExplosion.rb:20:1336:20:1347 | ( ... ) | | UseUseExplosion.rb:20:1349:20:2676 | then ... | UseUseExplosion.rb:20:1333:20:2692 | if ... | | UseUseExplosion.rb:20:1354:20:2676 | if ... | UseUseExplosion.rb:20:1349:20:2676 | then ... | | UseUseExplosion.rb:20:1358:20:1362 | [post] self | UseUseExplosion.rb:20:1379:20:1383 | self | | UseUseExplosion.rb:20:1358:20:1362 | [post] self | UseUseExplosion.rb:20:2667:20:2672 | self | | UseUseExplosion.rb:20:1358:20:1362 | self | UseUseExplosion.rb:20:1379:20:1383 | self | | UseUseExplosion.rb:20:1358:20:1362 | self | UseUseExplosion.rb:20:2667:20:2672 | self | -| UseUseExplosion.rb:20:1358:20:1367 | ... > ... | UseUseExplosion.rb:20:1357:20:1368 | [false] ( ... ) | -| UseUseExplosion.rb:20:1358:20:1367 | ... > ... | UseUseExplosion.rb:20:1357:20:1368 | [true] ( ... ) | +| UseUseExplosion.rb:20:1358:20:1367 | ... > ... | UseUseExplosion.rb:20:1357:20:1368 | ( ... ) | | UseUseExplosion.rb:20:1370:20:2660 | then ... | UseUseExplosion.rb:20:1354:20:2676 | if ... | | UseUseExplosion.rb:20:1375:20:2660 | if ... | UseUseExplosion.rb:20:1370:20:2660 | then ... | | UseUseExplosion.rb:20:1379:20:1383 | [post] self | UseUseExplosion.rb:20:1400:20:1404 | self | | UseUseExplosion.rb:20:1379:20:1383 | [post] self | UseUseExplosion.rb:20:2651:20:2656 | self | | UseUseExplosion.rb:20:1379:20:1383 | self | UseUseExplosion.rb:20:1400:20:1404 | self | | UseUseExplosion.rb:20:1379:20:1383 | self | UseUseExplosion.rb:20:2651:20:2656 | self | -| UseUseExplosion.rb:20:1379:20:1388 | ... > ... | UseUseExplosion.rb:20:1378:20:1389 | [false] ( ... ) | -| UseUseExplosion.rb:20:1379:20:1388 | ... > ... | UseUseExplosion.rb:20:1378:20:1389 | [true] ( ... ) | +| UseUseExplosion.rb:20:1379:20:1388 | ... > ... | UseUseExplosion.rb:20:1378:20:1389 | ( ... ) | | UseUseExplosion.rb:20:1391:20:2644 | then ... | UseUseExplosion.rb:20:1375:20:2660 | if ... | | UseUseExplosion.rb:20:1396:20:2644 | if ... | UseUseExplosion.rb:20:1391:20:2644 | then ... | | UseUseExplosion.rb:20:1400:20:1404 | [post] self | UseUseExplosion.rb:20:1421:20:1425 | self | | UseUseExplosion.rb:20:1400:20:1404 | [post] self | UseUseExplosion.rb:20:2635:20:2640 | self | | UseUseExplosion.rb:20:1400:20:1404 | self | UseUseExplosion.rb:20:1421:20:1425 | self | | UseUseExplosion.rb:20:1400:20:1404 | self | UseUseExplosion.rb:20:2635:20:2640 | self | -| UseUseExplosion.rb:20:1400:20:1409 | ... > ... | UseUseExplosion.rb:20:1399:20:1410 | [false] ( ... ) | -| UseUseExplosion.rb:20:1400:20:1409 | ... > ... | UseUseExplosion.rb:20:1399:20:1410 | [true] ( ... ) | +| UseUseExplosion.rb:20:1400:20:1409 | ... > ... | UseUseExplosion.rb:20:1399:20:1410 | ( ... ) | | UseUseExplosion.rb:20:1412:20:2628 | then ... | UseUseExplosion.rb:20:1396:20:2644 | if ... | | UseUseExplosion.rb:20:1417:20:2628 | if ... | UseUseExplosion.rb:20:1412:20:2628 | then ... | | UseUseExplosion.rb:20:1421:20:1425 | [post] self | UseUseExplosion.rb:20:1442:20:1446 | self | | UseUseExplosion.rb:20:1421:20:1425 | [post] self | UseUseExplosion.rb:20:2619:20:2624 | self | | UseUseExplosion.rb:20:1421:20:1425 | self | UseUseExplosion.rb:20:1442:20:1446 | self | | UseUseExplosion.rb:20:1421:20:1425 | self | UseUseExplosion.rb:20:2619:20:2624 | self | -| UseUseExplosion.rb:20:1421:20:1430 | ... > ... | UseUseExplosion.rb:20:1420:20:1431 | [false] ( ... ) | -| UseUseExplosion.rb:20:1421:20:1430 | ... > ... | UseUseExplosion.rb:20:1420:20:1431 | [true] ( ... ) | +| UseUseExplosion.rb:20:1421:20:1430 | ... > ... | UseUseExplosion.rb:20:1420:20:1431 | ( ... ) | | UseUseExplosion.rb:20:1433:20:2612 | then ... | UseUseExplosion.rb:20:1417:20:2628 | if ... | | UseUseExplosion.rb:20:1438:20:2612 | if ... | UseUseExplosion.rb:20:1433:20:2612 | then ... | | UseUseExplosion.rb:20:1442:20:1446 | [post] self | UseUseExplosion.rb:20:1463:20:1467 | self | | UseUseExplosion.rb:20:1442:20:1446 | [post] self | UseUseExplosion.rb:20:2603:20:2608 | self | | UseUseExplosion.rb:20:1442:20:1446 | self | UseUseExplosion.rb:20:1463:20:1467 | self | | UseUseExplosion.rb:20:1442:20:1446 | self | UseUseExplosion.rb:20:2603:20:2608 | self | -| UseUseExplosion.rb:20:1442:20:1451 | ... > ... | UseUseExplosion.rb:20:1441:20:1452 | [false] ( ... ) | -| UseUseExplosion.rb:20:1442:20:1451 | ... > ... | UseUseExplosion.rb:20:1441:20:1452 | [true] ( ... ) | +| UseUseExplosion.rb:20:1442:20:1451 | ... > ... | UseUseExplosion.rb:20:1441:20:1452 | ( ... ) | | UseUseExplosion.rb:20:1454:20:2596 | then ... | UseUseExplosion.rb:20:1438:20:2612 | if ... | | UseUseExplosion.rb:20:1459:20:2596 | if ... | UseUseExplosion.rb:20:1454:20:2596 | then ... | | UseUseExplosion.rb:20:1463:20:1467 | [post] self | UseUseExplosion.rb:20:1484:20:1488 | self | | UseUseExplosion.rb:20:1463:20:1467 | [post] self | UseUseExplosion.rb:20:2587:20:2592 | self | | UseUseExplosion.rb:20:1463:20:1467 | self | UseUseExplosion.rb:20:1484:20:1488 | self | | UseUseExplosion.rb:20:1463:20:1467 | self | UseUseExplosion.rb:20:2587:20:2592 | self | -| UseUseExplosion.rb:20:1463:20:1472 | ... > ... | UseUseExplosion.rb:20:1462:20:1473 | [false] ( ... ) | -| UseUseExplosion.rb:20:1463:20:1472 | ... > ... | UseUseExplosion.rb:20:1462:20:1473 | [true] ( ... ) | +| UseUseExplosion.rb:20:1463:20:1472 | ... > ... | UseUseExplosion.rb:20:1462:20:1473 | ( ... ) | | UseUseExplosion.rb:20:1475:20:2580 | then ... | UseUseExplosion.rb:20:1459:20:2596 | if ... | | UseUseExplosion.rb:20:1480:20:2580 | if ... | UseUseExplosion.rb:20:1475:20:2580 | then ... | | UseUseExplosion.rb:20:1484:20:1488 | [post] self | UseUseExplosion.rb:20:1505:20:1509 | self | | UseUseExplosion.rb:20:1484:20:1488 | [post] self | UseUseExplosion.rb:20:2571:20:2576 | self | | UseUseExplosion.rb:20:1484:20:1488 | self | UseUseExplosion.rb:20:1505:20:1509 | self | | UseUseExplosion.rb:20:1484:20:1488 | self | UseUseExplosion.rb:20:2571:20:2576 | self | -| UseUseExplosion.rb:20:1484:20:1493 | ... > ... | UseUseExplosion.rb:20:1483:20:1494 | [false] ( ... ) | -| UseUseExplosion.rb:20:1484:20:1493 | ... > ... | UseUseExplosion.rb:20:1483:20:1494 | [true] ( ... ) | +| UseUseExplosion.rb:20:1484:20:1493 | ... > ... | UseUseExplosion.rb:20:1483:20:1494 | ( ... ) | | UseUseExplosion.rb:20:1496:20:2564 | then ... | UseUseExplosion.rb:20:1480:20:2580 | if ... | | UseUseExplosion.rb:20:1501:20:2564 | if ... | UseUseExplosion.rb:20:1496:20:2564 | then ... | | UseUseExplosion.rb:20:1505:20:1509 | [post] self | UseUseExplosion.rb:20:1526:20:1530 | self | | UseUseExplosion.rb:20:1505:20:1509 | [post] self | UseUseExplosion.rb:20:2555:20:2560 | self | | UseUseExplosion.rb:20:1505:20:1509 | self | UseUseExplosion.rb:20:1526:20:1530 | self | | UseUseExplosion.rb:20:1505:20:1509 | self | UseUseExplosion.rb:20:2555:20:2560 | self | -| UseUseExplosion.rb:20:1505:20:1514 | ... > ... | UseUseExplosion.rb:20:1504:20:1515 | [false] ( ... ) | -| UseUseExplosion.rb:20:1505:20:1514 | ... > ... | UseUseExplosion.rb:20:1504:20:1515 | [true] ( ... ) | +| UseUseExplosion.rb:20:1505:20:1514 | ... > ... | UseUseExplosion.rb:20:1504:20:1515 | ( ... ) | | UseUseExplosion.rb:20:1517:20:2548 | then ... | UseUseExplosion.rb:20:1501:20:2564 | if ... | | UseUseExplosion.rb:20:1522:20:2548 | if ... | UseUseExplosion.rb:20:1517:20:2548 | then ... | | UseUseExplosion.rb:20:1526:20:1530 | [post] self | UseUseExplosion.rb:20:1547:20:1551 | self | | UseUseExplosion.rb:20:1526:20:1530 | [post] self | UseUseExplosion.rb:20:2539:20:2544 | self | | UseUseExplosion.rb:20:1526:20:1530 | self | UseUseExplosion.rb:20:1547:20:1551 | self | | UseUseExplosion.rb:20:1526:20:1530 | self | UseUseExplosion.rb:20:2539:20:2544 | self | -| UseUseExplosion.rb:20:1526:20:1535 | ... > ... | UseUseExplosion.rb:20:1525:20:1536 | [false] ( ... ) | -| UseUseExplosion.rb:20:1526:20:1535 | ... > ... | UseUseExplosion.rb:20:1525:20:1536 | [true] ( ... ) | +| UseUseExplosion.rb:20:1526:20:1535 | ... > ... | UseUseExplosion.rb:20:1525:20:1536 | ( ... ) | | UseUseExplosion.rb:20:1538:20:2532 | then ... | UseUseExplosion.rb:20:1522:20:2548 | if ... | | UseUseExplosion.rb:20:1543:20:2532 | if ... | UseUseExplosion.rb:20:1538:20:2532 | then ... | | UseUseExplosion.rb:20:1547:20:1551 | [post] self | UseUseExplosion.rb:20:1568:20:1572 | self | | UseUseExplosion.rb:20:1547:20:1551 | [post] self | UseUseExplosion.rb:20:2523:20:2528 | self | | UseUseExplosion.rb:20:1547:20:1551 | self | UseUseExplosion.rb:20:1568:20:1572 | self | | UseUseExplosion.rb:20:1547:20:1551 | self | UseUseExplosion.rb:20:2523:20:2528 | self | -| UseUseExplosion.rb:20:1547:20:1556 | ... > ... | UseUseExplosion.rb:20:1546:20:1557 | [false] ( ... ) | -| UseUseExplosion.rb:20:1547:20:1556 | ... > ... | UseUseExplosion.rb:20:1546:20:1557 | [true] ( ... ) | +| UseUseExplosion.rb:20:1547:20:1556 | ... > ... | UseUseExplosion.rb:20:1546:20:1557 | ( ... ) | | UseUseExplosion.rb:20:1559:20:2516 | then ... | UseUseExplosion.rb:20:1543:20:2532 | if ... | | UseUseExplosion.rb:20:1564:20:2516 | if ... | UseUseExplosion.rb:20:1559:20:2516 | then ... | | UseUseExplosion.rb:20:1568:20:1572 | [post] self | UseUseExplosion.rb:20:1589:20:1593 | self | | UseUseExplosion.rb:20:1568:20:1572 | [post] self | UseUseExplosion.rb:20:2507:20:2512 | self | | UseUseExplosion.rb:20:1568:20:1572 | self | UseUseExplosion.rb:20:1589:20:1593 | self | | UseUseExplosion.rb:20:1568:20:1572 | self | UseUseExplosion.rb:20:2507:20:2512 | self | -| UseUseExplosion.rb:20:1568:20:1577 | ... > ... | UseUseExplosion.rb:20:1567:20:1578 | [false] ( ... ) | -| UseUseExplosion.rb:20:1568:20:1577 | ... > ... | UseUseExplosion.rb:20:1567:20:1578 | [true] ( ... ) | +| UseUseExplosion.rb:20:1568:20:1577 | ... > ... | UseUseExplosion.rb:20:1567:20:1578 | ( ... ) | | UseUseExplosion.rb:20:1580:20:2500 | then ... | UseUseExplosion.rb:20:1564:20:2516 | if ... | | UseUseExplosion.rb:20:1585:20:2500 | if ... | UseUseExplosion.rb:20:1580:20:2500 | then ... | | UseUseExplosion.rb:20:1589:20:1593 | [post] self | UseUseExplosion.rb:20:1610:20:1614 | self | | UseUseExplosion.rb:20:1589:20:1593 | [post] self | UseUseExplosion.rb:20:2491:20:2496 | self | | UseUseExplosion.rb:20:1589:20:1593 | self | UseUseExplosion.rb:20:1610:20:1614 | self | | UseUseExplosion.rb:20:1589:20:1593 | self | UseUseExplosion.rb:20:2491:20:2496 | self | -| UseUseExplosion.rb:20:1589:20:1598 | ... > ... | UseUseExplosion.rb:20:1588:20:1599 | [false] ( ... ) | -| UseUseExplosion.rb:20:1589:20:1598 | ... > ... | UseUseExplosion.rb:20:1588:20:1599 | [true] ( ... ) | +| UseUseExplosion.rb:20:1589:20:1598 | ... > ... | UseUseExplosion.rb:20:1588:20:1599 | ( ... ) | | UseUseExplosion.rb:20:1601:20:2484 | then ... | UseUseExplosion.rb:20:1585:20:2500 | if ... | | UseUseExplosion.rb:20:1606:20:2484 | if ... | UseUseExplosion.rb:20:1601:20:2484 | then ... | | UseUseExplosion.rb:20:1610:20:1614 | [post] self | UseUseExplosion.rb:20:1631:20:1635 | self | | UseUseExplosion.rb:20:1610:20:1614 | [post] self | UseUseExplosion.rb:20:2475:20:2480 | self | | UseUseExplosion.rb:20:1610:20:1614 | self | UseUseExplosion.rb:20:1631:20:1635 | self | | UseUseExplosion.rb:20:1610:20:1614 | self | UseUseExplosion.rb:20:2475:20:2480 | self | -| UseUseExplosion.rb:20:1610:20:1619 | ... > ... | UseUseExplosion.rb:20:1609:20:1620 | [false] ( ... ) | -| UseUseExplosion.rb:20:1610:20:1619 | ... > ... | UseUseExplosion.rb:20:1609:20:1620 | [true] ( ... ) | +| UseUseExplosion.rb:20:1610:20:1619 | ... > ... | UseUseExplosion.rb:20:1609:20:1620 | ( ... ) | | UseUseExplosion.rb:20:1622:20:2468 | then ... | UseUseExplosion.rb:20:1606:20:2484 | if ... | | UseUseExplosion.rb:20:1627:20:2468 | if ... | UseUseExplosion.rb:20:1622:20:2468 | then ... | | UseUseExplosion.rb:20:1631:20:1635 | [post] self | UseUseExplosion.rb:20:1652:20:1656 | self | | UseUseExplosion.rb:20:1631:20:1635 | [post] self | UseUseExplosion.rb:20:2459:20:2464 | self | | UseUseExplosion.rb:20:1631:20:1635 | self | UseUseExplosion.rb:20:1652:20:1656 | self | | UseUseExplosion.rb:20:1631:20:1635 | self | UseUseExplosion.rb:20:2459:20:2464 | self | -| UseUseExplosion.rb:20:1631:20:1640 | ... > ... | UseUseExplosion.rb:20:1630:20:1641 | [false] ( ... ) | -| UseUseExplosion.rb:20:1631:20:1640 | ... > ... | UseUseExplosion.rb:20:1630:20:1641 | [true] ( ... ) | +| UseUseExplosion.rb:20:1631:20:1640 | ... > ... | UseUseExplosion.rb:20:1630:20:1641 | ( ... ) | | UseUseExplosion.rb:20:1643:20:2452 | then ... | UseUseExplosion.rb:20:1627:20:2468 | if ... | | UseUseExplosion.rb:20:1648:20:2452 | if ... | UseUseExplosion.rb:20:1643:20:2452 | then ... | | UseUseExplosion.rb:20:1652:20:1656 | [post] self | UseUseExplosion.rb:20:1673:20:1677 | self | | UseUseExplosion.rb:20:1652:20:1656 | [post] self | UseUseExplosion.rb:20:2443:20:2448 | self | | UseUseExplosion.rb:20:1652:20:1656 | self | UseUseExplosion.rb:20:1673:20:1677 | self | | UseUseExplosion.rb:20:1652:20:1656 | self | UseUseExplosion.rb:20:2443:20:2448 | self | -| UseUseExplosion.rb:20:1652:20:1661 | ... > ... | UseUseExplosion.rb:20:1651:20:1662 | [false] ( ... ) | -| UseUseExplosion.rb:20:1652:20:1661 | ... > ... | UseUseExplosion.rb:20:1651:20:1662 | [true] ( ... ) | +| UseUseExplosion.rb:20:1652:20:1661 | ... > ... | UseUseExplosion.rb:20:1651:20:1662 | ( ... ) | | UseUseExplosion.rb:20:1664:20:2436 | then ... | UseUseExplosion.rb:20:1648:20:2452 | if ... | | UseUseExplosion.rb:20:1669:20:2436 | if ... | UseUseExplosion.rb:20:1664:20:2436 | then ... | | UseUseExplosion.rb:20:1673:20:1677 | [post] self | UseUseExplosion.rb:20:1694:20:1698 | self | | UseUseExplosion.rb:20:1673:20:1677 | [post] self | UseUseExplosion.rb:20:2427:20:2432 | self | | UseUseExplosion.rb:20:1673:20:1677 | self | UseUseExplosion.rb:20:1694:20:1698 | self | | UseUseExplosion.rb:20:1673:20:1677 | self | UseUseExplosion.rb:20:2427:20:2432 | self | -| UseUseExplosion.rb:20:1673:20:1682 | ... > ... | UseUseExplosion.rb:20:1672:20:1683 | [false] ( ... ) | -| UseUseExplosion.rb:20:1673:20:1682 | ... > ... | UseUseExplosion.rb:20:1672:20:1683 | [true] ( ... ) | +| UseUseExplosion.rb:20:1673:20:1682 | ... > ... | UseUseExplosion.rb:20:1672:20:1683 | ( ... ) | | UseUseExplosion.rb:20:1685:20:2420 | then ... | UseUseExplosion.rb:20:1669:20:2436 | if ... | | UseUseExplosion.rb:20:1690:20:2420 | if ... | UseUseExplosion.rb:20:1685:20:2420 | then ... | | UseUseExplosion.rb:20:1694:20:1698 | [post] self | UseUseExplosion.rb:20:1715:20:1719 | self | | UseUseExplosion.rb:20:1694:20:1698 | [post] self | UseUseExplosion.rb:20:2411:20:2416 | self | | UseUseExplosion.rb:20:1694:20:1698 | self | UseUseExplosion.rb:20:1715:20:1719 | self | | UseUseExplosion.rb:20:1694:20:1698 | self | UseUseExplosion.rb:20:2411:20:2416 | self | -| UseUseExplosion.rb:20:1694:20:1703 | ... > ... | UseUseExplosion.rb:20:1693:20:1704 | [false] ( ... ) | -| UseUseExplosion.rb:20:1694:20:1703 | ... > ... | UseUseExplosion.rb:20:1693:20:1704 | [true] ( ... ) | +| UseUseExplosion.rb:20:1694:20:1703 | ... > ... | UseUseExplosion.rb:20:1693:20:1704 | ( ... ) | | UseUseExplosion.rb:20:1706:20:2404 | then ... | UseUseExplosion.rb:20:1690:20:2420 | if ... | | UseUseExplosion.rb:20:1711:20:2404 | if ... | UseUseExplosion.rb:20:1706:20:2404 | then ... | | UseUseExplosion.rb:20:1715:20:1719 | [post] self | UseUseExplosion.rb:20:1736:20:1740 | self | | UseUseExplosion.rb:20:1715:20:1719 | [post] self | UseUseExplosion.rb:20:2395:20:2400 | self | | UseUseExplosion.rb:20:1715:20:1719 | self | UseUseExplosion.rb:20:1736:20:1740 | self | | UseUseExplosion.rb:20:1715:20:1719 | self | UseUseExplosion.rb:20:2395:20:2400 | self | -| UseUseExplosion.rb:20:1715:20:1724 | ... > ... | UseUseExplosion.rb:20:1714:20:1725 | [false] ( ... ) | -| UseUseExplosion.rb:20:1715:20:1724 | ... > ... | UseUseExplosion.rb:20:1714:20:1725 | [true] ( ... ) | +| UseUseExplosion.rb:20:1715:20:1724 | ... > ... | UseUseExplosion.rb:20:1714:20:1725 | ( ... ) | | UseUseExplosion.rb:20:1727:20:2388 | then ... | UseUseExplosion.rb:20:1711:20:2404 | if ... | | UseUseExplosion.rb:20:1732:20:2388 | if ... | UseUseExplosion.rb:20:1727:20:2388 | then ... | | UseUseExplosion.rb:20:1736:20:1740 | [post] self | UseUseExplosion.rb:20:1757:20:1761 | self | | UseUseExplosion.rb:20:1736:20:1740 | [post] self | UseUseExplosion.rb:20:2379:20:2384 | self | | UseUseExplosion.rb:20:1736:20:1740 | self | UseUseExplosion.rb:20:1757:20:1761 | self | | UseUseExplosion.rb:20:1736:20:1740 | self | UseUseExplosion.rb:20:2379:20:2384 | self | -| UseUseExplosion.rb:20:1736:20:1745 | ... > ... | UseUseExplosion.rb:20:1735:20:1746 | [false] ( ... ) | -| UseUseExplosion.rb:20:1736:20:1745 | ... > ... | UseUseExplosion.rb:20:1735:20:1746 | [true] ( ... ) | +| UseUseExplosion.rb:20:1736:20:1745 | ... > ... | UseUseExplosion.rb:20:1735:20:1746 | ( ... ) | | UseUseExplosion.rb:20:1748:20:2372 | then ... | UseUseExplosion.rb:20:1732:20:2388 | if ... | | UseUseExplosion.rb:20:1753:20:2372 | if ... | UseUseExplosion.rb:20:1748:20:2372 | then ... | | UseUseExplosion.rb:20:1757:20:1761 | [post] self | UseUseExplosion.rb:20:1778:20:1782 | self | | UseUseExplosion.rb:20:1757:20:1761 | [post] self | UseUseExplosion.rb:20:2363:20:2368 | self | | UseUseExplosion.rb:20:1757:20:1761 | self | UseUseExplosion.rb:20:1778:20:1782 | self | | UseUseExplosion.rb:20:1757:20:1761 | self | UseUseExplosion.rb:20:2363:20:2368 | self | -| UseUseExplosion.rb:20:1757:20:1766 | ... > ... | UseUseExplosion.rb:20:1756:20:1767 | [false] ( ... ) | -| UseUseExplosion.rb:20:1757:20:1766 | ... > ... | UseUseExplosion.rb:20:1756:20:1767 | [true] ( ... ) | +| UseUseExplosion.rb:20:1757:20:1766 | ... > ... | UseUseExplosion.rb:20:1756:20:1767 | ( ... ) | | UseUseExplosion.rb:20:1769:20:2356 | then ... | UseUseExplosion.rb:20:1753:20:2372 | if ... | | UseUseExplosion.rb:20:1774:20:2356 | if ... | UseUseExplosion.rb:20:1769:20:2356 | then ... | | UseUseExplosion.rb:20:1778:20:1782 | [post] self | UseUseExplosion.rb:20:1799:20:1803 | self | | UseUseExplosion.rb:20:1778:20:1782 | [post] self | UseUseExplosion.rb:20:2347:20:2352 | self | | UseUseExplosion.rb:20:1778:20:1782 | self | UseUseExplosion.rb:20:1799:20:1803 | self | | UseUseExplosion.rb:20:1778:20:1782 | self | UseUseExplosion.rb:20:2347:20:2352 | self | -| UseUseExplosion.rb:20:1778:20:1787 | ... > ... | UseUseExplosion.rb:20:1777:20:1788 | [false] ( ... ) | -| UseUseExplosion.rb:20:1778:20:1787 | ... > ... | UseUseExplosion.rb:20:1777:20:1788 | [true] ( ... ) | +| UseUseExplosion.rb:20:1778:20:1787 | ... > ... | UseUseExplosion.rb:20:1777:20:1788 | ( ... ) | | UseUseExplosion.rb:20:1790:20:2340 | then ... | UseUseExplosion.rb:20:1774:20:2356 | if ... | | UseUseExplosion.rb:20:1795:20:2340 | if ... | UseUseExplosion.rb:20:1790:20:2340 | then ... | | UseUseExplosion.rb:20:1799:20:1803 | [post] self | UseUseExplosion.rb:20:1820:20:1824 | self | | UseUseExplosion.rb:20:1799:20:1803 | [post] self | UseUseExplosion.rb:20:2331:20:2336 | self | | UseUseExplosion.rb:20:1799:20:1803 | self | UseUseExplosion.rb:20:1820:20:1824 | self | | UseUseExplosion.rb:20:1799:20:1803 | self | UseUseExplosion.rb:20:2331:20:2336 | self | -| UseUseExplosion.rb:20:1799:20:1808 | ... > ... | UseUseExplosion.rb:20:1798:20:1809 | [false] ( ... ) | -| UseUseExplosion.rb:20:1799:20:1808 | ... > ... | UseUseExplosion.rb:20:1798:20:1809 | [true] ( ... ) | +| UseUseExplosion.rb:20:1799:20:1808 | ... > ... | UseUseExplosion.rb:20:1798:20:1809 | ( ... ) | | UseUseExplosion.rb:20:1811:20:2324 | then ... | UseUseExplosion.rb:20:1795:20:2340 | if ... | | UseUseExplosion.rb:20:1816:20:2324 | if ... | UseUseExplosion.rb:20:1811:20:2324 | then ... | | UseUseExplosion.rb:20:1820:20:1824 | [post] self | UseUseExplosion.rb:20:1841:20:1845 | self | | UseUseExplosion.rb:20:1820:20:1824 | [post] self | UseUseExplosion.rb:20:2315:20:2320 | self | | UseUseExplosion.rb:20:1820:20:1824 | self | UseUseExplosion.rb:20:1841:20:1845 | self | | UseUseExplosion.rb:20:1820:20:1824 | self | UseUseExplosion.rb:20:2315:20:2320 | self | -| UseUseExplosion.rb:20:1820:20:1829 | ... > ... | UseUseExplosion.rb:20:1819:20:1830 | [false] ( ... ) | -| UseUseExplosion.rb:20:1820:20:1829 | ... > ... | UseUseExplosion.rb:20:1819:20:1830 | [true] ( ... ) | +| UseUseExplosion.rb:20:1820:20:1829 | ... > ... | UseUseExplosion.rb:20:1819:20:1830 | ( ... ) | | UseUseExplosion.rb:20:1832:20:2308 | then ... | UseUseExplosion.rb:20:1816:20:2324 | if ... | | UseUseExplosion.rb:20:1837:20:2308 | if ... | UseUseExplosion.rb:20:1832:20:2308 | then ... | | UseUseExplosion.rb:20:1841:20:1845 | [post] self | UseUseExplosion.rb:20:1862:20:1866 | self | | UseUseExplosion.rb:20:1841:20:1845 | [post] self | UseUseExplosion.rb:20:2299:20:2304 | self | | UseUseExplosion.rb:20:1841:20:1845 | self | UseUseExplosion.rb:20:1862:20:1866 | self | | UseUseExplosion.rb:20:1841:20:1845 | self | UseUseExplosion.rb:20:2299:20:2304 | self | -| UseUseExplosion.rb:20:1841:20:1850 | ... > ... | UseUseExplosion.rb:20:1840:20:1851 | [false] ( ... ) | -| UseUseExplosion.rb:20:1841:20:1850 | ... > ... | UseUseExplosion.rb:20:1840:20:1851 | [true] ( ... ) | +| UseUseExplosion.rb:20:1841:20:1850 | ... > ... | UseUseExplosion.rb:20:1840:20:1851 | ( ... ) | | UseUseExplosion.rb:20:1853:20:2292 | then ... | UseUseExplosion.rb:20:1837:20:2308 | if ... | | UseUseExplosion.rb:20:1858:20:2292 | if ... | UseUseExplosion.rb:20:1853:20:2292 | then ... | | UseUseExplosion.rb:20:1862:20:1866 | [post] self | UseUseExplosion.rb:20:1883:20:1887 | self | | UseUseExplosion.rb:20:1862:20:1866 | [post] self | UseUseExplosion.rb:20:2283:20:2288 | self | | UseUseExplosion.rb:20:1862:20:1866 | self | UseUseExplosion.rb:20:1883:20:1887 | self | | UseUseExplosion.rb:20:1862:20:1866 | self | UseUseExplosion.rb:20:2283:20:2288 | self | -| UseUseExplosion.rb:20:1862:20:1871 | ... > ... | UseUseExplosion.rb:20:1861:20:1872 | [false] ( ... ) | -| UseUseExplosion.rb:20:1862:20:1871 | ... > ... | UseUseExplosion.rb:20:1861:20:1872 | [true] ( ... ) | +| UseUseExplosion.rb:20:1862:20:1871 | ... > ... | UseUseExplosion.rb:20:1861:20:1872 | ( ... ) | | UseUseExplosion.rb:20:1874:20:2276 | then ... | UseUseExplosion.rb:20:1858:20:2292 | if ... | | UseUseExplosion.rb:20:1879:20:2276 | if ... | UseUseExplosion.rb:20:1874:20:2276 | then ... | | UseUseExplosion.rb:20:1883:20:1887 | [post] self | UseUseExplosion.rb:20:1904:20:1908 | self | | UseUseExplosion.rb:20:1883:20:1887 | [post] self | UseUseExplosion.rb:20:2267:20:2272 | self | | UseUseExplosion.rb:20:1883:20:1887 | self | UseUseExplosion.rb:20:1904:20:1908 | self | | UseUseExplosion.rb:20:1883:20:1887 | self | UseUseExplosion.rb:20:2267:20:2272 | self | -| UseUseExplosion.rb:20:1883:20:1892 | ... > ... | UseUseExplosion.rb:20:1882:20:1893 | [false] ( ... ) | -| UseUseExplosion.rb:20:1883:20:1892 | ... > ... | UseUseExplosion.rb:20:1882:20:1893 | [true] ( ... ) | +| UseUseExplosion.rb:20:1883:20:1892 | ... > ... | UseUseExplosion.rb:20:1882:20:1893 | ( ... ) | | UseUseExplosion.rb:20:1895:20:2260 | then ... | UseUseExplosion.rb:20:1879:20:2276 | if ... | | UseUseExplosion.rb:20:1900:20:2260 | if ... | UseUseExplosion.rb:20:1895:20:2260 | then ... | | UseUseExplosion.rb:20:1904:20:1908 | [post] self | UseUseExplosion.rb:20:1925:20:1929 | self | | UseUseExplosion.rb:20:1904:20:1908 | [post] self | UseUseExplosion.rb:20:2251:20:2256 | self | | UseUseExplosion.rb:20:1904:20:1908 | self | UseUseExplosion.rb:20:1925:20:1929 | self | | UseUseExplosion.rb:20:1904:20:1908 | self | UseUseExplosion.rb:20:2251:20:2256 | self | -| UseUseExplosion.rb:20:1904:20:1913 | ... > ... | UseUseExplosion.rb:20:1903:20:1914 | [false] ( ... ) | -| UseUseExplosion.rb:20:1904:20:1913 | ... > ... | UseUseExplosion.rb:20:1903:20:1914 | [true] ( ... ) | +| UseUseExplosion.rb:20:1904:20:1913 | ... > ... | UseUseExplosion.rb:20:1903:20:1914 | ( ... ) | | UseUseExplosion.rb:20:1916:20:2244 | then ... | UseUseExplosion.rb:20:1900:20:2260 | if ... | | UseUseExplosion.rb:20:1921:20:2244 | if ... | UseUseExplosion.rb:20:1916:20:2244 | then ... | | UseUseExplosion.rb:20:1925:20:1929 | [post] self | UseUseExplosion.rb:20:1945:20:1949 | self | | UseUseExplosion.rb:20:1925:20:1929 | [post] self | UseUseExplosion.rb:20:2235:20:2240 | self | | UseUseExplosion.rb:20:1925:20:1929 | self | UseUseExplosion.rb:20:1945:20:1949 | self | | UseUseExplosion.rb:20:1925:20:1929 | self | UseUseExplosion.rb:20:2235:20:2240 | self | -| UseUseExplosion.rb:20:1925:20:1933 | ... > ... | UseUseExplosion.rb:20:1924:20:1934 | [false] ( ... ) | -| UseUseExplosion.rb:20:1925:20:1933 | ... > ... | UseUseExplosion.rb:20:1924:20:1934 | [true] ( ... ) | +| UseUseExplosion.rb:20:1925:20:1933 | ... > ... | UseUseExplosion.rb:20:1924:20:1934 | ( ... ) | | UseUseExplosion.rb:20:1936:20:2228 | then ... | UseUseExplosion.rb:20:1921:20:2244 | if ... | | UseUseExplosion.rb:20:1941:20:2228 | if ... | UseUseExplosion.rb:20:1936:20:2228 | then ... | | UseUseExplosion.rb:20:1945:20:1949 | [post] self | UseUseExplosion.rb:20:1965:20:1969 | self | | UseUseExplosion.rb:20:1945:20:1949 | [post] self | UseUseExplosion.rb:20:2219:20:2224 | self | | UseUseExplosion.rb:20:1945:20:1949 | self | UseUseExplosion.rb:20:1965:20:1969 | self | | UseUseExplosion.rb:20:1945:20:1949 | self | UseUseExplosion.rb:20:2219:20:2224 | self | -| UseUseExplosion.rb:20:1945:20:1953 | ... > ... | UseUseExplosion.rb:20:1944:20:1954 | [false] ( ... ) | -| UseUseExplosion.rb:20:1945:20:1953 | ... > ... | UseUseExplosion.rb:20:1944:20:1954 | [true] ( ... ) | +| UseUseExplosion.rb:20:1945:20:1953 | ... > ... | UseUseExplosion.rb:20:1944:20:1954 | ( ... ) | | UseUseExplosion.rb:20:1956:20:2212 | then ... | UseUseExplosion.rb:20:1941:20:2228 | if ... | | UseUseExplosion.rb:20:1961:20:2212 | if ... | UseUseExplosion.rb:20:1956:20:2212 | then ... | | UseUseExplosion.rb:20:1965:20:1969 | [post] self | UseUseExplosion.rb:20:1985:20:1989 | self | | UseUseExplosion.rb:20:1965:20:1969 | [post] self | UseUseExplosion.rb:20:2203:20:2208 | self | | UseUseExplosion.rb:20:1965:20:1969 | self | UseUseExplosion.rb:20:1985:20:1989 | self | | UseUseExplosion.rb:20:1965:20:1969 | self | UseUseExplosion.rb:20:2203:20:2208 | self | -| UseUseExplosion.rb:20:1965:20:1973 | ... > ... | UseUseExplosion.rb:20:1964:20:1974 | [false] ( ... ) | -| UseUseExplosion.rb:20:1965:20:1973 | ... > ... | UseUseExplosion.rb:20:1964:20:1974 | [true] ( ... ) | +| UseUseExplosion.rb:20:1965:20:1973 | ... > ... | UseUseExplosion.rb:20:1964:20:1974 | ( ... ) | | UseUseExplosion.rb:20:1976:20:2196 | then ... | UseUseExplosion.rb:20:1961:20:2212 | if ... | | UseUseExplosion.rb:20:1981:20:2196 | if ... | UseUseExplosion.rb:20:1976:20:2196 | then ... | | UseUseExplosion.rb:20:1985:20:1989 | [post] self | UseUseExplosion.rb:20:2005:20:2009 | self | | UseUseExplosion.rb:20:1985:20:1989 | [post] self | UseUseExplosion.rb:20:2187:20:2192 | self | | UseUseExplosion.rb:20:1985:20:1989 | self | UseUseExplosion.rb:20:2005:20:2009 | self | | UseUseExplosion.rb:20:1985:20:1989 | self | UseUseExplosion.rb:20:2187:20:2192 | self | -| UseUseExplosion.rb:20:1985:20:1993 | ... > ... | UseUseExplosion.rb:20:1984:20:1994 | [false] ( ... ) | -| UseUseExplosion.rb:20:1985:20:1993 | ... > ... | UseUseExplosion.rb:20:1984:20:1994 | [true] ( ... ) | +| UseUseExplosion.rb:20:1985:20:1993 | ... > ... | UseUseExplosion.rb:20:1984:20:1994 | ( ... ) | | UseUseExplosion.rb:20:1996:20:2180 | then ... | UseUseExplosion.rb:20:1981:20:2196 | if ... | | UseUseExplosion.rb:20:2001:20:2180 | if ... | UseUseExplosion.rb:20:1996:20:2180 | then ... | | UseUseExplosion.rb:20:2005:20:2009 | [post] self | UseUseExplosion.rb:20:2025:20:2029 | self | | UseUseExplosion.rb:20:2005:20:2009 | [post] self | UseUseExplosion.rb:20:2171:20:2176 | self | | UseUseExplosion.rb:20:2005:20:2009 | self | UseUseExplosion.rb:20:2025:20:2029 | self | | UseUseExplosion.rb:20:2005:20:2009 | self | UseUseExplosion.rb:20:2171:20:2176 | self | -| UseUseExplosion.rb:20:2005:20:2013 | ... > ... | UseUseExplosion.rb:20:2004:20:2014 | [false] ( ... ) | -| UseUseExplosion.rb:20:2005:20:2013 | ... > ... | UseUseExplosion.rb:20:2004:20:2014 | [true] ( ... ) | +| UseUseExplosion.rb:20:2005:20:2013 | ... > ... | UseUseExplosion.rb:20:2004:20:2014 | ( ... ) | | UseUseExplosion.rb:20:2016:20:2164 | then ... | UseUseExplosion.rb:20:2001:20:2180 | if ... | | UseUseExplosion.rb:20:2021:20:2164 | if ... | UseUseExplosion.rb:20:2016:20:2164 | then ... | | UseUseExplosion.rb:20:2025:20:2029 | [post] self | UseUseExplosion.rb:20:2045:20:2049 | self | | UseUseExplosion.rb:20:2025:20:2029 | [post] self | UseUseExplosion.rb:20:2155:20:2160 | self | | UseUseExplosion.rb:20:2025:20:2029 | self | UseUseExplosion.rb:20:2045:20:2049 | self | | UseUseExplosion.rb:20:2025:20:2029 | self | UseUseExplosion.rb:20:2155:20:2160 | self | -| UseUseExplosion.rb:20:2025:20:2033 | ... > ... | UseUseExplosion.rb:20:2024:20:2034 | [false] ( ... ) | -| UseUseExplosion.rb:20:2025:20:2033 | ... > ... | UseUseExplosion.rb:20:2024:20:2034 | [true] ( ... ) | +| UseUseExplosion.rb:20:2025:20:2033 | ... > ... | UseUseExplosion.rb:20:2024:20:2034 | ( ... ) | | UseUseExplosion.rb:20:2036:20:2148 | then ... | UseUseExplosion.rb:20:2021:20:2164 | if ... | | UseUseExplosion.rb:20:2041:20:2148 | if ... | UseUseExplosion.rb:20:2036:20:2148 | then ... | | UseUseExplosion.rb:20:2045:20:2049 | [post] self | UseUseExplosion.rb:20:2065:20:2069 | self | | UseUseExplosion.rb:20:2045:20:2049 | [post] self | UseUseExplosion.rb:20:2139:20:2144 | self | | UseUseExplosion.rb:20:2045:20:2049 | self | UseUseExplosion.rb:20:2065:20:2069 | self | | UseUseExplosion.rb:20:2045:20:2049 | self | UseUseExplosion.rb:20:2139:20:2144 | self | -| UseUseExplosion.rb:20:2045:20:2053 | ... > ... | UseUseExplosion.rb:20:2044:20:2054 | [false] ( ... ) | -| UseUseExplosion.rb:20:2045:20:2053 | ... > ... | UseUseExplosion.rb:20:2044:20:2054 | [true] ( ... ) | +| UseUseExplosion.rb:20:2045:20:2053 | ... > ... | UseUseExplosion.rb:20:2044:20:2054 | ( ... ) | | UseUseExplosion.rb:20:2056:20:2132 | then ... | UseUseExplosion.rb:20:2041:20:2148 | if ... | | UseUseExplosion.rb:20:2061:20:2132 | if ... | UseUseExplosion.rb:20:2056:20:2132 | then ... | | UseUseExplosion.rb:20:2065:20:2069 | [post] self | UseUseExplosion.rb:20:2085:20:2089 | self | | UseUseExplosion.rb:20:2065:20:2069 | [post] self | UseUseExplosion.rb:20:2123:20:2128 | self | | UseUseExplosion.rb:20:2065:20:2069 | self | UseUseExplosion.rb:20:2085:20:2089 | self | | UseUseExplosion.rb:20:2065:20:2069 | self | UseUseExplosion.rb:20:2123:20:2128 | self | -| UseUseExplosion.rb:20:2065:20:2073 | ... > ... | UseUseExplosion.rb:20:2064:20:2074 | [false] ( ... ) | -| UseUseExplosion.rb:20:2065:20:2073 | ... > ... | UseUseExplosion.rb:20:2064:20:2074 | [true] ( ... ) | +| UseUseExplosion.rb:20:2065:20:2073 | ... > ... | UseUseExplosion.rb:20:2064:20:2074 | ( ... ) | | UseUseExplosion.rb:20:2076:20:2116 | then ... | UseUseExplosion.rb:20:2061:20:2132 | if ... | | UseUseExplosion.rb:20:2081:20:2116 | if ... | UseUseExplosion.rb:20:2076:20:2116 | then ... | | UseUseExplosion.rb:20:2085:20:2089 | [post] self | UseUseExplosion.rb:20:2096:20:2099 | [input] SSA phi read(self) | | UseUseExplosion.rb:20:2085:20:2089 | [post] self | UseUseExplosion.rb:20:2107:20:2112 | self | | UseUseExplosion.rb:20:2085:20:2089 | self | UseUseExplosion.rb:20:2096:20:2099 | [input] SSA phi read(self) | | UseUseExplosion.rb:20:2085:20:2089 | self | UseUseExplosion.rb:20:2107:20:2112 | self | -| UseUseExplosion.rb:20:2085:20:2093 | ... > ... | UseUseExplosion.rb:20:2084:20:2094 | [false] ( ... ) | -| UseUseExplosion.rb:20:2085:20:2093 | ... > ... | UseUseExplosion.rb:20:2084:20:2094 | [true] ( ... ) | +| UseUseExplosion.rb:20:2085:20:2093 | ... > ... | UseUseExplosion.rb:20:2084:20:2094 | ( ... ) | | UseUseExplosion.rb:20:2096:20:2099 | [input] SSA phi read(self) | UseUseExplosion.rb:21:13:21:17 | self | | UseUseExplosion.rb:20:2096:20:2099 | [input] SSA phi read(x) | UseUseExplosion.rb:20:9:20:3700 | SSA phi read(x) | | UseUseExplosion.rb:20:2096:20:2099 | then ... | UseUseExplosion.rb:20:2081:20:2116 | if ... | @@ -1508,798 +1408,698 @@ | UseUseExplosion.rb:21:13:21:17 | [post] self | UseUseExplosion.rb:21:3691:21:3696 | self | | UseUseExplosion.rb:21:13:21:17 | self | UseUseExplosion.rb:21:35:21:39 | self | | UseUseExplosion.rb:21:13:21:17 | self | UseUseExplosion.rb:21:3691:21:3696 | self | -| UseUseExplosion.rb:21:13:21:23 | ... > ... | UseUseExplosion.rb:21:12:21:24 | [false] ( ... ) | -| UseUseExplosion.rb:21:13:21:23 | ... > ... | UseUseExplosion.rb:21:12:21:24 | [true] ( ... ) | +| UseUseExplosion.rb:21:13:21:23 | ... > ... | UseUseExplosion.rb:21:12:21:24 | ( ... ) | | UseUseExplosion.rb:21:26:21:3684 | then ... | UseUseExplosion.rb:21:9:21:3700 | if ... | | UseUseExplosion.rb:21:31:21:3684 | if ... | UseUseExplosion.rb:21:26:21:3684 | then ... | | UseUseExplosion.rb:21:35:21:39 | [post] self | UseUseExplosion.rb:21:56:21:60 | self | | UseUseExplosion.rb:21:35:21:39 | [post] self | UseUseExplosion.rb:21:3675:21:3680 | self | | UseUseExplosion.rb:21:35:21:39 | self | UseUseExplosion.rb:21:56:21:60 | self | | UseUseExplosion.rb:21:35:21:39 | self | UseUseExplosion.rb:21:3675:21:3680 | self | -| UseUseExplosion.rb:21:35:21:44 | ... > ... | UseUseExplosion.rb:21:34:21:45 | [false] ( ... ) | -| UseUseExplosion.rb:21:35:21:44 | ... > ... | UseUseExplosion.rb:21:34:21:45 | [true] ( ... ) | +| UseUseExplosion.rb:21:35:21:44 | ... > ... | UseUseExplosion.rb:21:34:21:45 | ( ... ) | | UseUseExplosion.rb:21:47:21:3668 | then ... | UseUseExplosion.rb:21:31:21:3684 | if ... | | UseUseExplosion.rb:21:52:21:3668 | if ... | UseUseExplosion.rb:21:47:21:3668 | then ... | | UseUseExplosion.rb:21:56:21:60 | [post] self | UseUseExplosion.rb:21:77:21:81 | self | | UseUseExplosion.rb:21:56:21:60 | [post] self | UseUseExplosion.rb:21:3659:21:3664 | self | | UseUseExplosion.rb:21:56:21:60 | self | UseUseExplosion.rb:21:77:21:81 | self | | UseUseExplosion.rb:21:56:21:60 | self | UseUseExplosion.rb:21:3659:21:3664 | self | -| UseUseExplosion.rb:21:56:21:65 | ... > ... | UseUseExplosion.rb:21:55:21:66 | [false] ( ... ) | -| UseUseExplosion.rb:21:56:21:65 | ... > ... | UseUseExplosion.rb:21:55:21:66 | [true] ( ... ) | +| UseUseExplosion.rb:21:56:21:65 | ... > ... | UseUseExplosion.rb:21:55:21:66 | ( ... ) | | UseUseExplosion.rb:21:68:21:3652 | then ... | UseUseExplosion.rb:21:52:21:3668 | if ... | | UseUseExplosion.rb:21:73:21:3652 | if ... | UseUseExplosion.rb:21:68:21:3652 | then ... | | UseUseExplosion.rb:21:77:21:81 | [post] self | UseUseExplosion.rb:21:98:21:102 | self | | UseUseExplosion.rb:21:77:21:81 | [post] self | UseUseExplosion.rb:21:3643:21:3648 | self | | UseUseExplosion.rb:21:77:21:81 | self | UseUseExplosion.rb:21:98:21:102 | self | | UseUseExplosion.rb:21:77:21:81 | self | UseUseExplosion.rb:21:3643:21:3648 | self | -| UseUseExplosion.rb:21:77:21:86 | ... > ... | UseUseExplosion.rb:21:76:21:87 | [false] ( ... ) | -| UseUseExplosion.rb:21:77:21:86 | ... > ... | UseUseExplosion.rb:21:76:21:87 | [true] ( ... ) | +| UseUseExplosion.rb:21:77:21:86 | ... > ... | UseUseExplosion.rb:21:76:21:87 | ( ... ) | | UseUseExplosion.rb:21:89:21:3636 | then ... | UseUseExplosion.rb:21:73:21:3652 | if ... | | UseUseExplosion.rb:21:94:21:3636 | if ... | UseUseExplosion.rb:21:89:21:3636 | then ... | | UseUseExplosion.rb:21:98:21:102 | [post] self | UseUseExplosion.rb:21:119:21:123 | self | | UseUseExplosion.rb:21:98:21:102 | [post] self | UseUseExplosion.rb:21:3627:21:3632 | self | | UseUseExplosion.rb:21:98:21:102 | self | UseUseExplosion.rb:21:119:21:123 | self | | UseUseExplosion.rb:21:98:21:102 | self | UseUseExplosion.rb:21:3627:21:3632 | self | -| UseUseExplosion.rb:21:98:21:107 | ... > ... | UseUseExplosion.rb:21:97:21:108 | [false] ( ... ) | -| UseUseExplosion.rb:21:98:21:107 | ... > ... | UseUseExplosion.rb:21:97:21:108 | [true] ( ... ) | +| UseUseExplosion.rb:21:98:21:107 | ... > ... | UseUseExplosion.rb:21:97:21:108 | ( ... ) | | UseUseExplosion.rb:21:110:21:3620 | then ... | UseUseExplosion.rb:21:94:21:3636 | if ... | | UseUseExplosion.rb:21:115:21:3620 | if ... | UseUseExplosion.rb:21:110:21:3620 | then ... | | UseUseExplosion.rb:21:119:21:123 | [post] self | UseUseExplosion.rb:21:140:21:144 | self | | UseUseExplosion.rb:21:119:21:123 | [post] self | UseUseExplosion.rb:21:3611:21:3616 | self | | UseUseExplosion.rb:21:119:21:123 | self | UseUseExplosion.rb:21:140:21:144 | self | | UseUseExplosion.rb:21:119:21:123 | self | UseUseExplosion.rb:21:3611:21:3616 | self | -| UseUseExplosion.rb:21:119:21:128 | ... > ... | UseUseExplosion.rb:21:118:21:129 | [false] ( ... ) | -| UseUseExplosion.rb:21:119:21:128 | ... > ... | UseUseExplosion.rb:21:118:21:129 | [true] ( ... ) | +| UseUseExplosion.rb:21:119:21:128 | ... > ... | UseUseExplosion.rb:21:118:21:129 | ( ... ) | | UseUseExplosion.rb:21:131:21:3604 | then ... | UseUseExplosion.rb:21:115:21:3620 | if ... | | UseUseExplosion.rb:21:136:21:3604 | if ... | UseUseExplosion.rb:21:131:21:3604 | then ... | | UseUseExplosion.rb:21:140:21:144 | [post] self | UseUseExplosion.rb:21:161:21:165 | self | | UseUseExplosion.rb:21:140:21:144 | [post] self | UseUseExplosion.rb:21:3595:21:3600 | self | | UseUseExplosion.rb:21:140:21:144 | self | UseUseExplosion.rb:21:161:21:165 | self | | UseUseExplosion.rb:21:140:21:144 | self | UseUseExplosion.rb:21:3595:21:3600 | self | -| UseUseExplosion.rb:21:140:21:149 | ... > ... | UseUseExplosion.rb:21:139:21:150 | [false] ( ... ) | -| UseUseExplosion.rb:21:140:21:149 | ... > ... | UseUseExplosion.rb:21:139:21:150 | [true] ( ... ) | +| UseUseExplosion.rb:21:140:21:149 | ... > ... | UseUseExplosion.rb:21:139:21:150 | ( ... ) | | UseUseExplosion.rb:21:152:21:3588 | then ... | UseUseExplosion.rb:21:136:21:3604 | if ... | | UseUseExplosion.rb:21:157:21:3588 | if ... | UseUseExplosion.rb:21:152:21:3588 | then ... | | UseUseExplosion.rb:21:161:21:165 | [post] self | UseUseExplosion.rb:21:182:21:186 | self | | UseUseExplosion.rb:21:161:21:165 | [post] self | UseUseExplosion.rb:21:3579:21:3584 | self | | UseUseExplosion.rb:21:161:21:165 | self | UseUseExplosion.rb:21:182:21:186 | self | | UseUseExplosion.rb:21:161:21:165 | self | UseUseExplosion.rb:21:3579:21:3584 | self | -| UseUseExplosion.rb:21:161:21:170 | ... > ... | UseUseExplosion.rb:21:160:21:171 | [false] ( ... ) | -| UseUseExplosion.rb:21:161:21:170 | ... > ... | UseUseExplosion.rb:21:160:21:171 | [true] ( ... ) | +| UseUseExplosion.rb:21:161:21:170 | ... > ... | UseUseExplosion.rb:21:160:21:171 | ( ... ) | | UseUseExplosion.rb:21:173:21:3572 | then ... | UseUseExplosion.rb:21:157:21:3588 | if ... | | UseUseExplosion.rb:21:178:21:3572 | if ... | UseUseExplosion.rb:21:173:21:3572 | then ... | | UseUseExplosion.rb:21:182:21:186 | [post] self | UseUseExplosion.rb:21:203:21:207 | self | | UseUseExplosion.rb:21:182:21:186 | [post] self | UseUseExplosion.rb:21:3563:21:3568 | self | | UseUseExplosion.rb:21:182:21:186 | self | UseUseExplosion.rb:21:203:21:207 | self | | UseUseExplosion.rb:21:182:21:186 | self | UseUseExplosion.rb:21:3563:21:3568 | self | -| UseUseExplosion.rb:21:182:21:191 | ... > ... | UseUseExplosion.rb:21:181:21:192 | [false] ( ... ) | -| UseUseExplosion.rb:21:182:21:191 | ... > ... | UseUseExplosion.rb:21:181:21:192 | [true] ( ... ) | +| UseUseExplosion.rb:21:182:21:191 | ... > ... | UseUseExplosion.rb:21:181:21:192 | ( ... ) | | UseUseExplosion.rb:21:194:21:3556 | then ... | UseUseExplosion.rb:21:178:21:3572 | if ... | | UseUseExplosion.rb:21:199:21:3556 | if ... | UseUseExplosion.rb:21:194:21:3556 | then ... | | UseUseExplosion.rb:21:203:21:207 | [post] self | UseUseExplosion.rb:21:224:21:228 | self | | UseUseExplosion.rb:21:203:21:207 | [post] self | UseUseExplosion.rb:21:3547:21:3552 | self | | UseUseExplosion.rb:21:203:21:207 | self | UseUseExplosion.rb:21:224:21:228 | self | | UseUseExplosion.rb:21:203:21:207 | self | UseUseExplosion.rb:21:3547:21:3552 | self | -| UseUseExplosion.rb:21:203:21:212 | ... > ... | UseUseExplosion.rb:21:202:21:213 | [false] ( ... ) | -| UseUseExplosion.rb:21:203:21:212 | ... > ... | UseUseExplosion.rb:21:202:21:213 | [true] ( ... ) | +| UseUseExplosion.rb:21:203:21:212 | ... > ... | UseUseExplosion.rb:21:202:21:213 | ( ... ) | | UseUseExplosion.rb:21:215:21:3540 | then ... | UseUseExplosion.rb:21:199:21:3556 | if ... | | UseUseExplosion.rb:21:220:21:3540 | if ... | UseUseExplosion.rb:21:215:21:3540 | then ... | | UseUseExplosion.rb:21:224:21:228 | [post] self | UseUseExplosion.rb:21:245:21:249 | self | | UseUseExplosion.rb:21:224:21:228 | [post] self | UseUseExplosion.rb:21:3531:21:3536 | self | | UseUseExplosion.rb:21:224:21:228 | self | UseUseExplosion.rb:21:245:21:249 | self | | UseUseExplosion.rb:21:224:21:228 | self | UseUseExplosion.rb:21:3531:21:3536 | self | -| UseUseExplosion.rb:21:224:21:233 | ... > ... | UseUseExplosion.rb:21:223:21:234 | [false] ( ... ) | -| UseUseExplosion.rb:21:224:21:233 | ... > ... | UseUseExplosion.rb:21:223:21:234 | [true] ( ... ) | +| UseUseExplosion.rb:21:224:21:233 | ... > ... | UseUseExplosion.rb:21:223:21:234 | ( ... ) | | UseUseExplosion.rb:21:236:21:3524 | then ... | UseUseExplosion.rb:21:220:21:3540 | if ... | | UseUseExplosion.rb:21:241:21:3524 | if ... | UseUseExplosion.rb:21:236:21:3524 | then ... | | UseUseExplosion.rb:21:245:21:249 | [post] self | UseUseExplosion.rb:21:266:21:270 | self | | UseUseExplosion.rb:21:245:21:249 | [post] self | UseUseExplosion.rb:21:3515:21:3520 | self | | UseUseExplosion.rb:21:245:21:249 | self | UseUseExplosion.rb:21:266:21:270 | self | | UseUseExplosion.rb:21:245:21:249 | self | UseUseExplosion.rb:21:3515:21:3520 | self | -| UseUseExplosion.rb:21:245:21:254 | ... > ... | UseUseExplosion.rb:21:244:21:255 | [false] ( ... ) | -| UseUseExplosion.rb:21:245:21:254 | ... > ... | UseUseExplosion.rb:21:244:21:255 | [true] ( ... ) | +| UseUseExplosion.rb:21:245:21:254 | ... > ... | UseUseExplosion.rb:21:244:21:255 | ( ... ) | | UseUseExplosion.rb:21:257:21:3508 | then ... | UseUseExplosion.rb:21:241:21:3524 | if ... | | UseUseExplosion.rb:21:262:21:3508 | if ... | UseUseExplosion.rb:21:257:21:3508 | then ... | | UseUseExplosion.rb:21:266:21:270 | [post] self | UseUseExplosion.rb:21:287:21:291 | self | | UseUseExplosion.rb:21:266:21:270 | [post] self | UseUseExplosion.rb:21:3499:21:3504 | self | | UseUseExplosion.rb:21:266:21:270 | self | UseUseExplosion.rb:21:287:21:291 | self | | UseUseExplosion.rb:21:266:21:270 | self | UseUseExplosion.rb:21:3499:21:3504 | self | -| UseUseExplosion.rb:21:266:21:275 | ... > ... | UseUseExplosion.rb:21:265:21:276 | [false] ( ... ) | -| UseUseExplosion.rb:21:266:21:275 | ... > ... | UseUseExplosion.rb:21:265:21:276 | [true] ( ... ) | +| UseUseExplosion.rb:21:266:21:275 | ... > ... | UseUseExplosion.rb:21:265:21:276 | ( ... ) | | UseUseExplosion.rb:21:278:21:3492 | then ... | UseUseExplosion.rb:21:262:21:3508 | if ... | | UseUseExplosion.rb:21:283:21:3492 | if ... | UseUseExplosion.rb:21:278:21:3492 | then ... | | UseUseExplosion.rb:21:287:21:291 | [post] self | UseUseExplosion.rb:21:308:21:312 | self | | UseUseExplosion.rb:21:287:21:291 | [post] self | UseUseExplosion.rb:21:3483:21:3488 | self | | UseUseExplosion.rb:21:287:21:291 | self | UseUseExplosion.rb:21:308:21:312 | self | | UseUseExplosion.rb:21:287:21:291 | self | UseUseExplosion.rb:21:3483:21:3488 | self | -| UseUseExplosion.rb:21:287:21:296 | ... > ... | UseUseExplosion.rb:21:286:21:297 | [false] ( ... ) | -| UseUseExplosion.rb:21:287:21:296 | ... > ... | UseUseExplosion.rb:21:286:21:297 | [true] ( ... ) | +| UseUseExplosion.rb:21:287:21:296 | ... > ... | UseUseExplosion.rb:21:286:21:297 | ( ... ) | | UseUseExplosion.rb:21:299:21:3476 | then ... | UseUseExplosion.rb:21:283:21:3492 | if ... | | UseUseExplosion.rb:21:304:21:3476 | if ... | UseUseExplosion.rb:21:299:21:3476 | then ... | | UseUseExplosion.rb:21:308:21:312 | [post] self | UseUseExplosion.rb:21:329:21:333 | self | | UseUseExplosion.rb:21:308:21:312 | [post] self | UseUseExplosion.rb:21:3467:21:3472 | self | | UseUseExplosion.rb:21:308:21:312 | self | UseUseExplosion.rb:21:329:21:333 | self | | UseUseExplosion.rb:21:308:21:312 | self | UseUseExplosion.rb:21:3467:21:3472 | self | -| UseUseExplosion.rb:21:308:21:317 | ... > ... | UseUseExplosion.rb:21:307:21:318 | [false] ( ... ) | -| UseUseExplosion.rb:21:308:21:317 | ... > ... | UseUseExplosion.rb:21:307:21:318 | [true] ( ... ) | +| UseUseExplosion.rb:21:308:21:317 | ... > ... | UseUseExplosion.rb:21:307:21:318 | ( ... ) | | UseUseExplosion.rb:21:320:21:3460 | then ... | UseUseExplosion.rb:21:304:21:3476 | if ... | | UseUseExplosion.rb:21:325:21:3460 | if ... | UseUseExplosion.rb:21:320:21:3460 | then ... | | UseUseExplosion.rb:21:329:21:333 | [post] self | UseUseExplosion.rb:21:350:21:354 | self | | UseUseExplosion.rb:21:329:21:333 | [post] self | UseUseExplosion.rb:21:3451:21:3456 | self | | UseUseExplosion.rb:21:329:21:333 | self | UseUseExplosion.rb:21:350:21:354 | self | | UseUseExplosion.rb:21:329:21:333 | self | UseUseExplosion.rb:21:3451:21:3456 | self | -| UseUseExplosion.rb:21:329:21:338 | ... > ... | UseUseExplosion.rb:21:328:21:339 | [false] ( ... ) | -| UseUseExplosion.rb:21:329:21:338 | ... > ... | UseUseExplosion.rb:21:328:21:339 | [true] ( ... ) | +| UseUseExplosion.rb:21:329:21:338 | ... > ... | UseUseExplosion.rb:21:328:21:339 | ( ... ) | | UseUseExplosion.rb:21:341:21:3444 | then ... | UseUseExplosion.rb:21:325:21:3460 | if ... | | UseUseExplosion.rb:21:346:21:3444 | if ... | UseUseExplosion.rb:21:341:21:3444 | then ... | | UseUseExplosion.rb:21:350:21:354 | [post] self | UseUseExplosion.rb:21:371:21:375 | self | | UseUseExplosion.rb:21:350:21:354 | [post] self | UseUseExplosion.rb:21:3435:21:3440 | self | | UseUseExplosion.rb:21:350:21:354 | self | UseUseExplosion.rb:21:371:21:375 | self | | UseUseExplosion.rb:21:350:21:354 | self | UseUseExplosion.rb:21:3435:21:3440 | self | -| UseUseExplosion.rb:21:350:21:359 | ... > ... | UseUseExplosion.rb:21:349:21:360 | [false] ( ... ) | -| UseUseExplosion.rb:21:350:21:359 | ... > ... | UseUseExplosion.rb:21:349:21:360 | [true] ( ... ) | +| UseUseExplosion.rb:21:350:21:359 | ... > ... | UseUseExplosion.rb:21:349:21:360 | ( ... ) | | UseUseExplosion.rb:21:362:21:3428 | then ... | UseUseExplosion.rb:21:346:21:3444 | if ... | | UseUseExplosion.rb:21:367:21:3428 | if ... | UseUseExplosion.rb:21:362:21:3428 | then ... | | UseUseExplosion.rb:21:371:21:375 | [post] self | UseUseExplosion.rb:21:392:21:396 | self | | UseUseExplosion.rb:21:371:21:375 | [post] self | UseUseExplosion.rb:21:3419:21:3424 | self | | UseUseExplosion.rb:21:371:21:375 | self | UseUseExplosion.rb:21:392:21:396 | self | | UseUseExplosion.rb:21:371:21:375 | self | UseUseExplosion.rb:21:3419:21:3424 | self | -| UseUseExplosion.rb:21:371:21:380 | ... > ... | UseUseExplosion.rb:21:370:21:381 | [false] ( ... ) | -| UseUseExplosion.rb:21:371:21:380 | ... > ... | UseUseExplosion.rb:21:370:21:381 | [true] ( ... ) | +| UseUseExplosion.rb:21:371:21:380 | ... > ... | UseUseExplosion.rb:21:370:21:381 | ( ... ) | | UseUseExplosion.rb:21:383:21:3412 | then ... | UseUseExplosion.rb:21:367:21:3428 | if ... | | UseUseExplosion.rb:21:388:21:3412 | if ... | UseUseExplosion.rb:21:383:21:3412 | then ... | | UseUseExplosion.rb:21:392:21:396 | [post] self | UseUseExplosion.rb:21:413:21:417 | self | | UseUseExplosion.rb:21:392:21:396 | [post] self | UseUseExplosion.rb:21:3403:21:3408 | self | | UseUseExplosion.rb:21:392:21:396 | self | UseUseExplosion.rb:21:413:21:417 | self | | UseUseExplosion.rb:21:392:21:396 | self | UseUseExplosion.rb:21:3403:21:3408 | self | -| UseUseExplosion.rb:21:392:21:401 | ... > ... | UseUseExplosion.rb:21:391:21:402 | [false] ( ... ) | -| UseUseExplosion.rb:21:392:21:401 | ... > ... | UseUseExplosion.rb:21:391:21:402 | [true] ( ... ) | +| UseUseExplosion.rb:21:392:21:401 | ... > ... | UseUseExplosion.rb:21:391:21:402 | ( ... ) | | UseUseExplosion.rb:21:404:21:3396 | then ... | UseUseExplosion.rb:21:388:21:3412 | if ... | | UseUseExplosion.rb:21:409:21:3396 | if ... | UseUseExplosion.rb:21:404:21:3396 | then ... | | UseUseExplosion.rb:21:413:21:417 | [post] self | UseUseExplosion.rb:21:434:21:438 | self | | UseUseExplosion.rb:21:413:21:417 | [post] self | UseUseExplosion.rb:21:3387:21:3392 | self | | UseUseExplosion.rb:21:413:21:417 | self | UseUseExplosion.rb:21:434:21:438 | self | | UseUseExplosion.rb:21:413:21:417 | self | UseUseExplosion.rb:21:3387:21:3392 | self | -| UseUseExplosion.rb:21:413:21:422 | ... > ... | UseUseExplosion.rb:21:412:21:423 | [false] ( ... ) | -| UseUseExplosion.rb:21:413:21:422 | ... > ... | UseUseExplosion.rb:21:412:21:423 | [true] ( ... ) | +| UseUseExplosion.rb:21:413:21:422 | ... > ... | UseUseExplosion.rb:21:412:21:423 | ( ... ) | | UseUseExplosion.rb:21:425:21:3380 | then ... | UseUseExplosion.rb:21:409:21:3396 | if ... | | UseUseExplosion.rb:21:430:21:3380 | if ... | UseUseExplosion.rb:21:425:21:3380 | then ... | | UseUseExplosion.rb:21:434:21:438 | [post] self | UseUseExplosion.rb:21:455:21:459 | self | | UseUseExplosion.rb:21:434:21:438 | [post] self | UseUseExplosion.rb:21:3371:21:3376 | self | | UseUseExplosion.rb:21:434:21:438 | self | UseUseExplosion.rb:21:455:21:459 | self | | UseUseExplosion.rb:21:434:21:438 | self | UseUseExplosion.rb:21:3371:21:3376 | self | -| UseUseExplosion.rb:21:434:21:443 | ... > ... | UseUseExplosion.rb:21:433:21:444 | [false] ( ... ) | -| UseUseExplosion.rb:21:434:21:443 | ... > ... | UseUseExplosion.rb:21:433:21:444 | [true] ( ... ) | +| UseUseExplosion.rb:21:434:21:443 | ... > ... | UseUseExplosion.rb:21:433:21:444 | ( ... ) | | UseUseExplosion.rb:21:446:21:3364 | then ... | UseUseExplosion.rb:21:430:21:3380 | if ... | | UseUseExplosion.rb:21:451:21:3364 | if ... | UseUseExplosion.rb:21:446:21:3364 | then ... | | UseUseExplosion.rb:21:455:21:459 | [post] self | UseUseExplosion.rb:21:476:21:480 | self | | UseUseExplosion.rb:21:455:21:459 | [post] self | UseUseExplosion.rb:21:3355:21:3360 | self | | UseUseExplosion.rb:21:455:21:459 | self | UseUseExplosion.rb:21:476:21:480 | self | | UseUseExplosion.rb:21:455:21:459 | self | UseUseExplosion.rb:21:3355:21:3360 | self | -| UseUseExplosion.rb:21:455:21:464 | ... > ... | UseUseExplosion.rb:21:454:21:465 | [false] ( ... ) | -| UseUseExplosion.rb:21:455:21:464 | ... > ... | UseUseExplosion.rb:21:454:21:465 | [true] ( ... ) | +| UseUseExplosion.rb:21:455:21:464 | ... > ... | UseUseExplosion.rb:21:454:21:465 | ( ... ) | | UseUseExplosion.rb:21:467:21:3348 | then ... | UseUseExplosion.rb:21:451:21:3364 | if ... | | UseUseExplosion.rb:21:472:21:3348 | if ... | UseUseExplosion.rb:21:467:21:3348 | then ... | | UseUseExplosion.rb:21:476:21:480 | [post] self | UseUseExplosion.rb:21:497:21:501 | self | | UseUseExplosion.rb:21:476:21:480 | [post] self | UseUseExplosion.rb:21:3339:21:3344 | self | | UseUseExplosion.rb:21:476:21:480 | self | UseUseExplosion.rb:21:497:21:501 | self | | UseUseExplosion.rb:21:476:21:480 | self | UseUseExplosion.rb:21:3339:21:3344 | self | -| UseUseExplosion.rb:21:476:21:485 | ... > ... | UseUseExplosion.rb:21:475:21:486 | [false] ( ... ) | -| UseUseExplosion.rb:21:476:21:485 | ... > ... | UseUseExplosion.rb:21:475:21:486 | [true] ( ... ) | +| UseUseExplosion.rb:21:476:21:485 | ... > ... | UseUseExplosion.rb:21:475:21:486 | ( ... ) | | UseUseExplosion.rb:21:488:21:3332 | then ... | UseUseExplosion.rb:21:472:21:3348 | if ... | | UseUseExplosion.rb:21:493:21:3332 | if ... | UseUseExplosion.rb:21:488:21:3332 | then ... | | UseUseExplosion.rb:21:497:21:501 | [post] self | UseUseExplosion.rb:21:518:21:522 | self | | UseUseExplosion.rb:21:497:21:501 | [post] self | UseUseExplosion.rb:21:3323:21:3328 | self | | UseUseExplosion.rb:21:497:21:501 | self | UseUseExplosion.rb:21:518:21:522 | self | | UseUseExplosion.rb:21:497:21:501 | self | UseUseExplosion.rb:21:3323:21:3328 | self | -| UseUseExplosion.rb:21:497:21:506 | ... > ... | UseUseExplosion.rb:21:496:21:507 | [false] ( ... ) | -| UseUseExplosion.rb:21:497:21:506 | ... > ... | UseUseExplosion.rb:21:496:21:507 | [true] ( ... ) | +| UseUseExplosion.rb:21:497:21:506 | ... > ... | UseUseExplosion.rb:21:496:21:507 | ( ... ) | | UseUseExplosion.rb:21:509:21:3316 | then ... | UseUseExplosion.rb:21:493:21:3332 | if ... | | UseUseExplosion.rb:21:514:21:3316 | if ... | UseUseExplosion.rb:21:509:21:3316 | then ... | | UseUseExplosion.rb:21:518:21:522 | [post] self | UseUseExplosion.rb:21:539:21:543 | self | | UseUseExplosion.rb:21:518:21:522 | [post] self | UseUseExplosion.rb:21:3307:21:3312 | self | | UseUseExplosion.rb:21:518:21:522 | self | UseUseExplosion.rb:21:539:21:543 | self | | UseUseExplosion.rb:21:518:21:522 | self | UseUseExplosion.rb:21:3307:21:3312 | self | -| UseUseExplosion.rb:21:518:21:527 | ... > ... | UseUseExplosion.rb:21:517:21:528 | [false] ( ... ) | -| UseUseExplosion.rb:21:518:21:527 | ... > ... | UseUseExplosion.rb:21:517:21:528 | [true] ( ... ) | +| UseUseExplosion.rb:21:518:21:527 | ... > ... | UseUseExplosion.rb:21:517:21:528 | ( ... ) | | UseUseExplosion.rb:21:530:21:3300 | then ... | UseUseExplosion.rb:21:514:21:3316 | if ... | | UseUseExplosion.rb:21:535:21:3300 | if ... | UseUseExplosion.rb:21:530:21:3300 | then ... | | UseUseExplosion.rb:21:539:21:543 | [post] self | UseUseExplosion.rb:21:560:21:564 | self | | UseUseExplosion.rb:21:539:21:543 | [post] self | UseUseExplosion.rb:21:3291:21:3296 | self | | UseUseExplosion.rb:21:539:21:543 | self | UseUseExplosion.rb:21:560:21:564 | self | | UseUseExplosion.rb:21:539:21:543 | self | UseUseExplosion.rb:21:3291:21:3296 | self | -| UseUseExplosion.rb:21:539:21:548 | ... > ... | UseUseExplosion.rb:21:538:21:549 | [false] ( ... ) | -| UseUseExplosion.rb:21:539:21:548 | ... > ... | UseUseExplosion.rb:21:538:21:549 | [true] ( ... ) | +| UseUseExplosion.rb:21:539:21:548 | ... > ... | UseUseExplosion.rb:21:538:21:549 | ( ... ) | | UseUseExplosion.rb:21:551:21:3284 | then ... | UseUseExplosion.rb:21:535:21:3300 | if ... | | UseUseExplosion.rb:21:556:21:3284 | if ... | UseUseExplosion.rb:21:551:21:3284 | then ... | | UseUseExplosion.rb:21:560:21:564 | [post] self | UseUseExplosion.rb:21:581:21:585 | self | | UseUseExplosion.rb:21:560:21:564 | [post] self | UseUseExplosion.rb:21:3275:21:3280 | self | | UseUseExplosion.rb:21:560:21:564 | self | UseUseExplosion.rb:21:581:21:585 | self | | UseUseExplosion.rb:21:560:21:564 | self | UseUseExplosion.rb:21:3275:21:3280 | self | -| UseUseExplosion.rb:21:560:21:569 | ... > ... | UseUseExplosion.rb:21:559:21:570 | [false] ( ... ) | -| UseUseExplosion.rb:21:560:21:569 | ... > ... | UseUseExplosion.rb:21:559:21:570 | [true] ( ... ) | +| UseUseExplosion.rb:21:560:21:569 | ... > ... | UseUseExplosion.rb:21:559:21:570 | ( ... ) | | UseUseExplosion.rb:21:572:21:3268 | then ... | UseUseExplosion.rb:21:556:21:3284 | if ... | | UseUseExplosion.rb:21:577:21:3268 | if ... | UseUseExplosion.rb:21:572:21:3268 | then ... | | UseUseExplosion.rb:21:581:21:585 | [post] self | UseUseExplosion.rb:21:602:21:606 | self | | UseUseExplosion.rb:21:581:21:585 | [post] self | UseUseExplosion.rb:21:3259:21:3264 | self | | UseUseExplosion.rb:21:581:21:585 | self | UseUseExplosion.rb:21:602:21:606 | self | | UseUseExplosion.rb:21:581:21:585 | self | UseUseExplosion.rb:21:3259:21:3264 | self | -| UseUseExplosion.rb:21:581:21:590 | ... > ... | UseUseExplosion.rb:21:580:21:591 | [false] ( ... ) | -| UseUseExplosion.rb:21:581:21:590 | ... > ... | UseUseExplosion.rb:21:580:21:591 | [true] ( ... ) | +| UseUseExplosion.rb:21:581:21:590 | ... > ... | UseUseExplosion.rb:21:580:21:591 | ( ... ) | | UseUseExplosion.rb:21:593:21:3252 | then ... | UseUseExplosion.rb:21:577:21:3268 | if ... | | UseUseExplosion.rb:21:598:21:3252 | if ... | UseUseExplosion.rb:21:593:21:3252 | then ... | | UseUseExplosion.rb:21:602:21:606 | [post] self | UseUseExplosion.rb:21:623:21:627 | self | | UseUseExplosion.rb:21:602:21:606 | [post] self | UseUseExplosion.rb:21:3243:21:3248 | self | | UseUseExplosion.rb:21:602:21:606 | self | UseUseExplosion.rb:21:623:21:627 | self | | UseUseExplosion.rb:21:602:21:606 | self | UseUseExplosion.rb:21:3243:21:3248 | self | -| UseUseExplosion.rb:21:602:21:611 | ... > ... | UseUseExplosion.rb:21:601:21:612 | [false] ( ... ) | -| UseUseExplosion.rb:21:602:21:611 | ... > ... | UseUseExplosion.rb:21:601:21:612 | [true] ( ... ) | +| UseUseExplosion.rb:21:602:21:611 | ... > ... | UseUseExplosion.rb:21:601:21:612 | ( ... ) | | UseUseExplosion.rb:21:614:21:3236 | then ... | UseUseExplosion.rb:21:598:21:3252 | if ... | | UseUseExplosion.rb:21:619:21:3236 | if ... | UseUseExplosion.rb:21:614:21:3236 | then ... | | UseUseExplosion.rb:21:623:21:627 | [post] self | UseUseExplosion.rb:21:644:21:648 | self | | UseUseExplosion.rb:21:623:21:627 | [post] self | UseUseExplosion.rb:21:3227:21:3232 | self | | UseUseExplosion.rb:21:623:21:627 | self | UseUseExplosion.rb:21:644:21:648 | self | | UseUseExplosion.rb:21:623:21:627 | self | UseUseExplosion.rb:21:3227:21:3232 | self | -| UseUseExplosion.rb:21:623:21:632 | ... > ... | UseUseExplosion.rb:21:622:21:633 | [false] ( ... ) | -| UseUseExplosion.rb:21:623:21:632 | ... > ... | UseUseExplosion.rb:21:622:21:633 | [true] ( ... ) | +| UseUseExplosion.rb:21:623:21:632 | ... > ... | UseUseExplosion.rb:21:622:21:633 | ( ... ) | | UseUseExplosion.rb:21:635:21:3220 | then ... | UseUseExplosion.rb:21:619:21:3236 | if ... | | UseUseExplosion.rb:21:640:21:3220 | if ... | UseUseExplosion.rb:21:635:21:3220 | then ... | | UseUseExplosion.rb:21:644:21:648 | [post] self | UseUseExplosion.rb:21:665:21:669 | self | | UseUseExplosion.rb:21:644:21:648 | [post] self | UseUseExplosion.rb:21:3211:21:3216 | self | | UseUseExplosion.rb:21:644:21:648 | self | UseUseExplosion.rb:21:665:21:669 | self | | UseUseExplosion.rb:21:644:21:648 | self | UseUseExplosion.rb:21:3211:21:3216 | self | -| UseUseExplosion.rb:21:644:21:653 | ... > ... | UseUseExplosion.rb:21:643:21:654 | [false] ( ... ) | -| UseUseExplosion.rb:21:644:21:653 | ... > ... | UseUseExplosion.rb:21:643:21:654 | [true] ( ... ) | +| UseUseExplosion.rb:21:644:21:653 | ... > ... | UseUseExplosion.rb:21:643:21:654 | ( ... ) | | UseUseExplosion.rb:21:656:21:3204 | then ... | UseUseExplosion.rb:21:640:21:3220 | if ... | | UseUseExplosion.rb:21:661:21:3204 | if ... | UseUseExplosion.rb:21:656:21:3204 | then ... | | UseUseExplosion.rb:21:665:21:669 | [post] self | UseUseExplosion.rb:21:686:21:690 | self | | UseUseExplosion.rb:21:665:21:669 | [post] self | UseUseExplosion.rb:21:3195:21:3200 | self | | UseUseExplosion.rb:21:665:21:669 | self | UseUseExplosion.rb:21:686:21:690 | self | | UseUseExplosion.rb:21:665:21:669 | self | UseUseExplosion.rb:21:3195:21:3200 | self | -| UseUseExplosion.rb:21:665:21:674 | ... > ... | UseUseExplosion.rb:21:664:21:675 | [false] ( ... ) | -| UseUseExplosion.rb:21:665:21:674 | ... > ... | UseUseExplosion.rb:21:664:21:675 | [true] ( ... ) | +| UseUseExplosion.rb:21:665:21:674 | ... > ... | UseUseExplosion.rb:21:664:21:675 | ( ... ) | | UseUseExplosion.rb:21:677:21:3188 | then ... | UseUseExplosion.rb:21:661:21:3204 | if ... | | UseUseExplosion.rb:21:682:21:3188 | if ... | UseUseExplosion.rb:21:677:21:3188 | then ... | | UseUseExplosion.rb:21:686:21:690 | [post] self | UseUseExplosion.rb:21:707:21:711 | self | | UseUseExplosion.rb:21:686:21:690 | [post] self | UseUseExplosion.rb:21:3179:21:3184 | self | | UseUseExplosion.rb:21:686:21:690 | self | UseUseExplosion.rb:21:707:21:711 | self | | UseUseExplosion.rb:21:686:21:690 | self | UseUseExplosion.rb:21:3179:21:3184 | self | -| UseUseExplosion.rb:21:686:21:695 | ... > ... | UseUseExplosion.rb:21:685:21:696 | [false] ( ... ) | -| UseUseExplosion.rb:21:686:21:695 | ... > ... | UseUseExplosion.rb:21:685:21:696 | [true] ( ... ) | +| UseUseExplosion.rb:21:686:21:695 | ... > ... | UseUseExplosion.rb:21:685:21:696 | ( ... ) | | UseUseExplosion.rb:21:698:21:3172 | then ... | UseUseExplosion.rb:21:682:21:3188 | if ... | | UseUseExplosion.rb:21:703:21:3172 | if ... | UseUseExplosion.rb:21:698:21:3172 | then ... | | UseUseExplosion.rb:21:707:21:711 | [post] self | UseUseExplosion.rb:21:728:21:732 | self | | UseUseExplosion.rb:21:707:21:711 | [post] self | UseUseExplosion.rb:21:3163:21:3168 | self | | UseUseExplosion.rb:21:707:21:711 | self | UseUseExplosion.rb:21:728:21:732 | self | | UseUseExplosion.rb:21:707:21:711 | self | UseUseExplosion.rb:21:3163:21:3168 | self | -| UseUseExplosion.rb:21:707:21:716 | ... > ... | UseUseExplosion.rb:21:706:21:717 | [false] ( ... ) | -| UseUseExplosion.rb:21:707:21:716 | ... > ... | UseUseExplosion.rb:21:706:21:717 | [true] ( ... ) | +| UseUseExplosion.rb:21:707:21:716 | ... > ... | UseUseExplosion.rb:21:706:21:717 | ( ... ) | | UseUseExplosion.rb:21:719:21:3156 | then ... | UseUseExplosion.rb:21:703:21:3172 | if ... | | UseUseExplosion.rb:21:724:21:3156 | if ... | UseUseExplosion.rb:21:719:21:3156 | then ... | | UseUseExplosion.rb:21:728:21:732 | [post] self | UseUseExplosion.rb:21:749:21:753 | self | | UseUseExplosion.rb:21:728:21:732 | [post] self | UseUseExplosion.rb:21:3147:21:3152 | self | | UseUseExplosion.rb:21:728:21:732 | self | UseUseExplosion.rb:21:749:21:753 | self | | UseUseExplosion.rb:21:728:21:732 | self | UseUseExplosion.rb:21:3147:21:3152 | self | -| UseUseExplosion.rb:21:728:21:737 | ... > ... | UseUseExplosion.rb:21:727:21:738 | [false] ( ... ) | -| UseUseExplosion.rb:21:728:21:737 | ... > ... | UseUseExplosion.rb:21:727:21:738 | [true] ( ... ) | +| UseUseExplosion.rb:21:728:21:737 | ... > ... | UseUseExplosion.rb:21:727:21:738 | ( ... ) | | UseUseExplosion.rb:21:740:21:3140 | then ... | UseUseExplosion.rb:21:724:21:3156 | if ... | | UseUseExplosion.rb:21:745:21:3140 | if ... | UseUseExplosion.rb:21:740:21:3140 | then ... | | UseUseExplosion.rb:21:749:21:753 | [post] self | UseUseExplosion.rb:21:770:21:774 | self | | UseUseExplosion.rb:21:749:21:753 | [post] self | UseUseExplosion.rb:21:3131:21:3136 | self | | UseUseExplosion.rb:21:749:21:753 | self | UseUseExplosion.rb:21:770:21:774 | self | | UseUseExplosion.rb:21:749:21:753 | self | UseUseExplosion.rb:21:3131:21:3136 | self | -| UseUseExplosion.rb:21:749:21:758 | ... > ... | UseUseExplosion.rb:21:748:21:759 | [false] ( ... ) | -| UseUseExplosion.rb:21:749:21:758 | ... > ... | UseUseExplosion.rb:21:748:21:759 | [true] ( ... ) | +| UseUseExplosion.rb:21:749:21:758 | ... > ... | UseUseExplosion.rb:21:748:21:759 | ( ... ) | | UseUseExplosion.rb:21:761:21:3124 | then ... | UseUseExplosion.rb:21:745:21:3140 | if ... | | UseUseExplosion.rb:21:766:21:3124 | if ... | UseUseExplosion.rb:21:761:21:3124 | then ... | | UseUseExplosion.rb:21:770:21:774 | [post] self | UseUseExplosion.rb:21:791:21:795 | self | | UseUseExplosion.rb:21:770:21:774 | [post] self | UseUseExplosion.rb:21:3115:21:3120 | self | | UseUseExplosion.rb:21:770:21:774 | self | UseUseExplosion.rb:21:791:21:795 | self | | UseUseExplosion.rb:21:770:21:774 | self | UseUseExplosion.rb:21:3115:21:3120 | self | -| UseUseExplosion.rb:21:770:21:779 | ... > ... | UseUseExplosion.rb:21:769:21:780 | [false] ( ... ) | -| UseUseExplosion.rb:21:770:21:779 | ... > ... | UseUseExplosion.rb:21:769:21:780 | [true] ( ... ) | +| UseUseExplosion.rb:21:770:21:779 | ... > ... | UseUseExplosion.rb:21:769:21:780 | ( ... ) | | UseUseExplosion.rb:21:782:21:3108 | then ... | UseUseExplosion.rb:21:766:21:3124 | if ... | | UseUseExplosion.rb:21:787:21:3108 | if ... | UseUseExplosion.rb:21:782:21:3108 | then ... | | UseUseExplosion.rb:21:791:21:795 | [post] self | UseUseExplosion.rb:21:812:21:816 | self | | UseUseExplosion.rb:21:791:21:795 | [post] self | UseUseExplosion.rb:21:3099:21:3104 | self | | UseUseExplosion.rb:21:791:21:795 | self | UseUseExplosion.rb:21:812:21:816 | self | | UseUseExplosion.rb:21:791:21:795 | self | UseUseExplosion.rb:21:3099:21:3104 | self | -| UseUseExplosion.rb:21:791:21:800 | ... > ... | UseUseExplosion.rb:21:790:21:801 | [false] ( ... ) | -| UseUseExplosion.rb:21:791:21:800 | ... > ... | UseUseExplosion.rb:21:790:21:801 | [true] ( ... ) | +| UseUseExplosion.rb:21:791:21:800 | ... > ... | UseUseExplosion.rb:21:790:21:801 | ( ... ) | | UseUseExplosion.rb:21:803:21:3092 | then ... | UseUseExplosion.rb:21:787:21:3108 | if ... | | UseUseExplosion.rb:21:808:21:3092 | if ... | UseUseExplosion.rb:21:803:21:3092 | then ... | | UseUseExplosion.rb:21:812:21:816 | [post] self | UseUseExplosion.rb:21:833:21:837 | self | | UseUseExplosion.rb:21:812:21:816 | [post] self | UseUseExplosion.rb:21:3083:21:3088 | self | | UseUseExplosion.rb:21:812:21:816 | self | UseUseExplosion.rb:21:833:21:837 | self | | UseUseExplosion.rb:21:812:21:816 | self | UseUseExplosion.rb:21:3083:21:3088 | self | -| UseUseExplosion.rb:21:812:21:821 | ... > ... | UseUseExplosion.rb:21:811:21:822 | [false] ( ... ) | -| UseUseExplosion.rb:21:812:21:821 | ... > ... | UseUseExplosion.rb:21:811:21:822 | [true] ( ... ) | +| UseUseExplosion.rb:21:812:21:821 | ... > ... | UseUseExplosion.rb:21:811:21:822 | ( ... ) | | UseUseExplosion.rb:21:824:21:3076 | then ... | UseUseExplosion.rb:21:808:21:3092 | if ... | | UseUseExplosion.rb:21:829:21:3076 | if ... | UseUseExplosion.rb:21:824:21:3076 | then ... | | UseUseExplosion.rb:21:833:21:837 | [post] self | UseUseExplosion.rb:21:854:21:858 | self | | UseUseExplosion.rb:21:833:21:837 | [post] self | UseUseExplosion.rb:21:3067:21:3072 | self | | UseUseExplosion.rb:21:833:21:837 | self | UseUseExplosion.rb:21:854:21:858 | self | | UseUseExplosion.rb:21:833:21:837 | self | UseUseExplosion.rb:21:3067:21:3072 | self | -| UseUseExplosion.rb:21:833:21:842 | ... > ... | UseUseExplosion.rb:21:832:21:843 | [false] ( ... ) | -| UseUseExplosion.rb:21:833:21:842 | ... > ... | UseUseExplosion.rb:21:832:21:843 | [true] ( ... ) | +| UseUseExplosion.rb:21:833:21:842 | ... > ... | UseUseExplosion.rb:21:832:21:843 | ( ... ) | | UseUseExplosion.rb:21:845:21:3060 | then ... | UseUseExplosion.rb:21:829:21:3076 | if ... | | UseUseExplosion.rb:21:850:21:3060 | if ... | UseUseExplosion.rb:21:845:21:3060 | then ... | | UseUseExplosion.rb:21:854:21:858 | [post] self | UseUseExplosion.rb:21:875:21:879 | self | | UseUseExplosion.rb:21:854:21:858 | [post] self | UseUseExplosion.rb:21:3051:21:3056 | self | | UseUseExplosion.rb:21:854:21:858 | self | UseUseExplosion.rb:21:875:21:879 | self | | UseUseExplosion.rb:21:854:21:858 | self | UseUseExplosion.rb:21:3051:21:3056 | self | -| UseUseExplosion.rb:21:854:21:863 | ... > ... | UseUseExplosion.rb:21:853:21:864 | [false] ( ... ) | -| UseUseExplosion.rb:21:854:21:863 | ... > ... | UseUseExplosion.rb:21:853:21:864 | [true] ( ... ) | +| UseUseExplosion.rb:21:854:21:863 | ... > ... | UseUseExplosion.rb:21:853:21:864 | ( ... ) | | UseUseExplosion.rb:21:866:21:3044 | then ... | UseUseExplosion.rb:21:850:21:3060 | if ... | | UseUseExplosion.rb:21:871:21:3044 | if ... | UseUseExplosion.rb:21:866:21:3044 | then ... | | UseUseExplosion.rb:21:875:21:879 | [post] self | UseUseExplosion.rb:21:896:21:900 | self | | UseUseExplosion.rb:21:875:21:879 | [post] self | UseUseExplosion.rb:21:3035:21:3040 | self | | UseUseExplosion.rb:21:875:21:879 | self | UseUseExplosion.rb:21:896:21:900 | self | | UseUseExplosion.rb:21:875:21:879 | self | UseUseExplosion.rb:21:3035:21:3040 | self | -| UseUseExplosion.rb:21:875:21:884 | ... > ... | UseUseExplosion.rb:21:874:21:885 | [false] ( ... ) | -| UseUseExplosion.rb:21:875:21:884 | ... > ... | UseUseExplosion.rb:21:874:21:885 | [true] ( ... ) | +| UseUseExplosion.rb:21:875:21:884 | ... > ... | UseUseExplosion.rb:21:874:21:885 | ( ... ) | | UseUseExplosion.rb:21:887:21:3028 | then ... | UseUseExplosion.rb:21:871:21:3044 | if ... | | UseUseExplosion.rb:21:892:21:3028 | if ... | UseUseExplosion.rb:21:887:21:3028 | then ... | | UseUseExplosion.rb:21:896:21:900 | [post] self | UseUseExplosion.rb:21:917:21:921 | self | | UseUseExplosion.rb:21:896:21:900 | [post] self | UseUseExplosion.rb:21:3019:21:3024 | self | | UseUseExplosion.rb:21:896:21:900 | self | UseUseExplosion.rb:21:917:21:921 | self | | UseUseExplosion.rb:21:896:21:900 | self | UseUseExplosion.rb:21:3019:21:3024 | self | -| UseUseExplosion.rb:21:896:21:905 | ... > ... | UseUseExplosion.rb:21:895:21:906 | [false] ( ... ) | -| UseUseExplosion.rb:21:896:21:905 | ... > ... | UseUseExplosion.rb:21:895:21:906 | [true] ( ... ) | +| UseUseExplosion.rb:21:896:21:905 | ... > ... | UseUseExplosion.rb:21:895:21:906 | ( ... ) | | UseUseExplosion.rb:21:908:21:3012 | then ... | UseUseExplosion.rb:21:892:21:3028 | if ... | | UseUseExplosion.rb:21:913:21:3012 | if ... | UseUseExplosion.rb:21:908:21:3012 | then ... | | UseUseExplosion.rb:21:917:21:921 | [post] self | UseUseExplosion.rb:21:938:21:942 | self | | UseUseExplosion.rb:21:917:21:921 | [post] self | UseUseExplosion.rb:21:3003:21:3008 | self | | UseUseExplosion.rb:21:917:21:921 | self | UseUseExplosion.rb:21:938:21:942 | self | | UseUseExplosion.rb:21:917:21:921 | self | UseUseExplosion.rb:21:3003:21:3008 | self | -| UseUseExplosion.rb:21:917:21:926 | ... > ... | UseUseExplosion.rb:21:916:21:927 | [false] ( ... ) | -| UseUseExplosion.rb:21:917:21:926 | ... > ... | UseUseExplosion.rb:21:916:21:927 | [true] ( ... ) | +| UseUseExplosion.rb:21:917:21:926 | ... > ... | UseUseExplosion.rb:21:916:21:927 | ( ... ) | | UseUseExplosion.rb:21:929:21:2996 | then ... | UseUseExplosion.rb:21:913:21:3012 | if ... | | UseUseExplosion.rb:21:934:21:2996 | if ... | UseUseExplosion.rb:21:929:21:2996 | then ... | | UseUseExplosion.rb:21:938:21:942 | [post] self | UseUseExplosion.rb:21:959:21:963 | self | | UseUseExplosion.rb:21:938:21:942 | [post] self | UseUseExplosion.rb:21:2987:21:2992 | self | | UseUseExplosion.rb:21:938:21:942 | self | UseUseExplosion.rb:21:959:21:963 | self | | UseUseExplosion.rb:21:938:21:942 | self | UseUseExplosion.rb:21:2987:21:2992 | self | -| UseUseExplosion.rb:21:938:21:947 | ... > ... | UseUseExplosion.rb:21:937:21:948 | [false] ( ... ) | -| UseUseExplosion.rb:21:938:21:947 | ... > ... | UseUseExplosion.rb:21:937:21:948 | [true] ( ... ) | +| UseUseExplosion.rb:21:938:21:947 | ... > ... | UseUseExplosion.rb:21:937:21:948 | ( ... ) | | UseUseExplosion.rb:21:950:21:2980 | then ... | UseUseExplosion.rb:21:934:21:2996 | if ... | | UseUseExplosion.rb:21:955:21:2980 | if ... | UseUseExplosion.rb:21:950:21:2980 | then ... | | UseUseExplosion.rb:21:959:21:963 | [post] self | UseUseExplosion.rb:21:980:21:984 | self | | UseUseExplosion.rb:21:959:21:963 | [post] self | UseUseExplosion.rb:21:2971:21:2976 | self | | UseUseExplosion.rb:21:959:21:963 | self | UseUseExplosion.rb:21:980:21:984 | self | | UseUseExplosion.rb:21:959:21:963 | self | UseUseExplosion.rb:21:2971:21:2976 | self | -| UseUseExplosion.rb:21:959:21:968 | ... > ... | UseUseExplosion.rb:21:958:21:969 | [false] ( ... ) | -| UseUseExplosion.rb:21:959:21:968 | ... > ... | UseUseExplosion.rb:21:958:21:969 | [true] ( ... ) | +| UseUseExplosion.rb:21:959:21:968 | ... > ... | UseUseExplosion.rb:21:958:21:969 | ( ... ) | | UseUseExplosion.rb:21:971:21:2964 | then ... | UseUseExplosion.rb:21:955:21:2980 | if ... | | UseUseExplosion.rb:21:976:21:2964 | if ... | UseUseExplosion.rb:21:971:21:2964 | then ... | | UseUseExplosion.rb:21:980:21:984 | [post] self | UseUseExplosion.rb:21:1001:21:1005 | self | | UseUseExplosion.rb:21:980:21:984 | [post] self | UseUseExplosion.rb:21:2955:21:2960 | self | | UseUseExplosion.rb:21:980:21:984 | self | UseUseExplosion.rb:21:1001:21:1005 | self | | UseUseExplosion.rb:21:980:21:984 | self | UseUseExplosion.rb:21:2955:21:2960 | self | -| UseUseExplosion.rb:21:980:21:989 | ... > ... | UseUseExplosion.rb:21:979:21:990 | [false] ( ... ) | -| UseUseExplosion.rb:21:980:21:989 | ... > ... | UseUseExplosion.rb:21:979:21:990 | [true] ( ... ) | +| UseUseExplosion.rb:21:980:21:989 | ... > ... | UseUseExplosion.rb:21:979:21:990 | ( ... ) | | UseUseExplosion.rb:21:992:21:2948 | then ... | UseUseExplosion.rb:21:976:21:2964 | if ... | | UseUseExplosion.rb:21:997:21:2948 | if ... | UseUseExplosion.rb:21:992:21:2948 | then ... | | UseUseExplosion.rb:21:1001:21:1005 | [post] self | UseUseExplosion.rb:21:1022:21:1026 | self | | UseUseExplosion.rb:21:1001:21:1005 | [post] self | UseUseExplosion.rb:21:2939:21:2944 | self | | UseUseExplosion.rb:21:1001:21:1005 | self | UseUseExplosion.rb:21:1022:21:1026 | self | | UseUseExplosion.rb:21:1001:21:1005 | self | UseUseExplosion.rb:21:2939:21:2944 | self | -| UseUseExplosion.rb:21:1001:21:1010 | ... > ... | UseUseExplosion.rb:21:1000:21:1011 | [false] ( ... ) | -| UseUseExplosion.rb:21:1001:21:1010 | ... > ... | UseUseExplosion.rb:21:1000:21:1011 | [true] ( ... ) | +| UseUseExplosion.rb:21:1001:21:1010 | ... > ... | UseUseExplosion.rb:21:1000:21:1011 | ( ... ) | | UseUseExplosion.rb:21:1013:21:2932 | then ... | UseUseExplosion.rb:21:997:21:2948 | if ... | | UseUseExplosion.rb:21:1018:21:2932 | if ... | UseUseExplosion.rb:21:1013:21:2932 | then ... | | UseUseExplosion.rb:21:1022:21:1026 | [post] self | UseUseExplosion.rb:21:1043:21:1047 | self | | UseUseExplosion.rb:21:1022:21:1026 | [post] self | UseUseExplosion.rb:21:2923:21:2928 | self | | UseUseExplosion.rb:21:1022:21:1026 | self | UseUseExplosion.rb:21:1043:21:1047 | self | | UseUseExplosion.rb:21:1022:21:1026 | self | UseUseExplosion.rb:21:2923:21:2928 | self | -| UseUseExplosion.rb:21:1022:21:1031 | ... > ... | UseUseExplosion.rb:21:1021:21:1032 | [false] ( ... ) | -| UseUseExplosion.rb:21:1022:21:1031 | ... > ... | UseUseExplosion.rb:21:1021:21:1032 | [true] ( ... ) | +| UseUseExplosion.rb:21:1022:21:1031 | ... > ... | UseUseExplosion.rb:21:1021:21:1032 | ( ... ) | | UseUseExplosion.rb:21:1034:21:2916 | then ... | UseUseExplosion.rb:21:1018:21:2932 | if ... | | UseUseExplosion.rb:21:1039:21:2916 | if ... | UseUseExplosion.rb:21:1034:21:2916 | then ... | | UseUseExplosion.rb:21:1043:21:1047 | [post] self | UseUseExplosion.rb:21:1064:21:1068 | self | | UseUseExplosion.rb:21:1043:21:1047 | [post] self | UseUseExplosion.rb:21:2907:21:2912 | self | | UseUseExplosion.rb:21:1043:21:1047 | self | UseUseExplosion.rb:21:1064:21:1068 | self | | UseUseExplosion.rb:21:1043:21:1047 | self | UseUseExplosion.rb:21:2907:21:2912 | self | -| UseUseExplosion.rb:21:1043:21:1052 | ... > ... | UseUseExplosion.rb:21:1042:21:1053 | [false] ( ... ) | -| UseUseExplosion.rb:21:1043:21:1052 | ... > ... | UseUseExplosion.rb:21:1042:21:1053 | [true] ( ... ) | +| UseUseExplosion.rb:21:1043:21:1052 | ... > ... | UseUseExplosion.rb:21:1042:21:1053 | ( ... ) | | UseUseExplosion.rb:21:1055:21:2900 | then ... | UseUseExplosion.rb:21:1039:21:2916 | if ... | | UseUseExplosion.rb:21:1060:21:2900 | if ... | UseUseExplosion.rb:21:1055:21:2900 | then ... | | UseUseExplosion.rb:21:1064:21:1068 | [post] self | UseUseExplosion.rb:21:1085:21:1089 | self | | UseUseExplosion.rb:21:1064:21:1068 | [post] self | UseUseExplosion.rb:21:2891:21:2896 | self | | UseUseExplosion.rb:21:1064:21:1068 | self | UseUseExplosion.rb:21:1085:21:1089 | self | | UseUseExplosion.rb:21:1064:21:1068 | self | UseUseExplosion.rb:21:2891:21:2896 | self | -| UseUseExplosion.rb:21:1064:21:1073 | ... > ... | UseUseExplosion.rb:21:1063:21:1074 | [false] ( ... ) | -| UseUseExplosion.rb:21:1064:21:1073 | ... > ... | UseUseExplosion.rb:21:1063:21:1074 | [true] ( ... ) | +| UseUseExplosion.rb:21:1064:21:1073 | ... > ... | UseUseExplosion.rb:21:1063:21:1074 | ( ... ) | | UseUseExplosion.rb:21:1076:21:2884 | then ... | UseUseExplosion.rb:21:1060:21:2900 | if ... | | UseUseExplosion.rb:21:1081:21:2884 | if ... | UseUseExplosion.rb:21:1076:21:2884 | then ... | | UseUseExplosion.rb:21:1085:21:1089 | [post] self | UseUseExplosion.rb:21:1106:21:1110 | self | | UseUseExplosion.rb:21:1085:21:1089 | [post] self | UseUseExplosion.rb:21:2875:21:2880 | self | | UseUseExplosion.rb:21:1085:21:1089 | self | UseUseExplosion.rb:21:1106:21:1110 | self | | UseUseExplosion.rb:21:1085:21:1089 | self | UseUseExplosion.rb:21:2875:21:2880 | self | -| UseUseExplosion.rb:21:1085:21:1094 | ... > ... | UseUseExplosion.rb:21:1084:21:1095 | [false] ( ... ) | -| UseUseExplosion.rb:21:1085:21:1094 | ... > ... | UseUseExplosion.rb:21:1084:21:1095 | [true] ( ... ) | +| UseUseExplosion.rb:21:1085:21:1094 | ... > ... | UseUseExplosion.rb:21:1084:21:1095 | ( ... ) | | UseUseExplosion.rb:21:1097:21:2868 | then ... | UseUseExplosion.rb:21:1081:21:2884 | if ... | | UseUseExplosion.rb:21:1102:21:2868 | if ... | UseUseExplosion.rb:21:1097:21:2868 | then ... | | UseUseExplosion.rb:21:1106:21:1110 | [post] self | UseUseExplosion.rb:21:1127:21:1131 | self | | UseUseExplosion.rb:21:1106:21:1110 | [post] self | UseUseExplosion.rb:21:2859:21:2864 | self | | UseUseExplosion.rb:21:1106:21:1110 | self | UseUseExplosion.rb:21:1127:21:1131 | self | | UseUseExplosion.rb:21:1106:21:1110 | self | UseUseExplosion.rb:21:2859:21:2864 | self | -| UseUseExplosion.rb:21:1106:21:1115 | ... > ... | UseUseExplosion.rb:21:1105:21:1116 | [false] ( ... ) | -| UseUseExplosion.rb:21:1106:21:1115 | ... > ... | UseUseExplosion.rb:21:1105:21:1116 | [true] ( ... ) | +| UseUseExplosion.rb:21:1106:21:1115 | ... > ... | UseUseExplosion.rb:21:1105:21:1116 | ( ... ) | | UseUseExplosion.rb:21:1118:21:2852 | then ... | UseUseExplosion.rb:21:1102:21:2868 | if ... | | UseUseExplosion.rb:21:1123:21:2852 | if ... | UseUseExplosion.rb:21:1118:21:2852 | then ... | | UseUseExplosion.rb:21:1127:21:1131 | [post] self | UseUseExplosion.rb:21:1148:21:1152 | self | | UseUseExplosion.rb:21:1127:21:1131 | [post] self | UseUseExplosion.rb:21:2843:21:2848 | self | | UseUseExplosion.rb:21:1127:21:1131 | self | UseUseExplosion.rb:21:1148:21:1152 | self | | UseUseExplosion.rb:21:1127:21:1131 | self | UseUseExplosion.rb:21:2843:21:2848 | self | -| UseUseExplosion.rb:21:1127:21:1136 | ... > ... | UseUseExplosion.rb:21:1126:21:1137 | [false] ( ... ) | -| UseUseExplosion.rb:21:1127:21:1136 | ... > ... | UseUseExplosion.rb:21:1126:21:1137 | [true] ( ... ) | +| UseUseExplosion.rb:21:1127:21:1136 | ... > ... | UseUseExplosion.rb:21:1126:21:1137 | ( ... ) | | UseUseExplosion.rb:21:1139:21:2836 | then ... | UseUseExplosion.rb:21:1123:21:2852 | if ... | | UseUseExplosion.rb:21:1144:21:2836 | if ... | UseUseExplosion.rb:21:1139:21:2836 | then ... | | UseUseExplosion.rb:21:1148:21:1152 | [post] self | UseUseExplosion.rb:21:1169:21:1173 | self | | UseUseExplosion.rb:21:1148:21:1152 | [post] self | UseUseExplosion.rb:21:2827:21:2832 | self | | UseUseExplosion.rb:21:1148:21:1152 | self | UseUseExplosion.rb:21:1169:21:1173 | self | | UseUseExplosion.rb:21:1148:21:1152 | self | UseUseExplosion.rb:21:2827:21:2832 | self | -| UseUseExplosion.rb:21:1148:21:1157 | ... > ... | UseUseExplosion.rb:21:1147:21:1158 | [false] ( ... ) | -| UseUseExplosion.rb:21:1148:21:1157 | ... > ... | UseUseExplosion.rb:21:1147:21:1158 | [true] ( ... ) | +| UseUseExplosion.rb:21:1148:21:1157 | ... > ... | UseUseExplosion.rb:21:1147:21:1158 | ( ... ) | | UseUseExplosion.rb:21:1160:21:2820 | then ... | UseUseExplosion.rb:21:1144:21:2836 | if ... | | UseUseExplosion.rb:21:1165:21:2820 | if ... | UseUseExplosion.rb:21:1160:21:2820 | then ... | | UseUseExplosion.rb:21:1169:21:1173 | [post] self | UseUseExplosion.rb:21:1190:21:1194 | self | | UseUseExplosion.rb:21:1169:21:1173 | [post] self | UseUseExplosion.rb:21:2811:21:2816 | self | | UseUseExplosion.rb:21:1169:21:1173 | self | UseUseExplosion.rb:21:1190:21:1194 | self | | UseUseExplosion.rb:21:1169:21:1173 | self | UseUseExplosion.rb:21:2811:21:2816 | self | -| UseUseExplosion.rb:21:1169:21:1178 | ... > ... | UseUseExplosion.rb:21:1168:21:1179 | [false] ( ... ) | -| UseUseExplosion.rb:21:1169:21:1178 | ... > ... | UseUseExplosion.rb:21:1168:21:1179 | [true] ( ... ) | +| UseUseExplosion.rb:21:1169:21:1178 | ... > ... | UseUseExplosion.rb:21:1168:21:1179 | ( ... ) | | UseUseExplosion.rb:21:1181:21:2804 | then ... | UseUseExplosion.rb:21:1165:21:2820 | if ... | | UseUseExplosion.rb:21:1186:21:2804 | if ... | UseUseExplosion.rb:21:1181:21:2804 | then ... | | UseUseExplosion.rb:21:1190:21:1194 | [post] self | UseUseExplosion.rb:21:1211:21:1215 | self | | UseUseExplosion.rb:21:1190:21:1194 | [post] self | UseUseExplosion.rb:21:2795:21:2800 | self | | UseUseExplosion.rb:21:1190:21:1194 | self | UseUseExplosion.rb:21:1211:21:1215 | self | | UseUseExplosion.rb:21:1190:21:1194 | self | UseUseExplosion.rb:21:2795:21:2800 | self | -| UseUseExplosion.rb:21:1190:21:1199 | ... > ... | UseUseExplosion.rb:21:1189:21:1200 | [false] ( ... ) | -| UseUseExplosion.rb:21:1190:21:1199 | ... > ... | UseUseExplosion.rb:21:1189:21:1200 | [true] ( ... ) | +| UseUseExplosion.rb:21:1190:21:1199 | ... > ... | UseUseExplosion.rb:21:1189:21:1200 | ( ... ) | | UseUseExplosion.rb:21:1202:21:2788 | then ... | UseUseExplosion.rb:21:1186:21:2804 | if ... | | UseUseExplosion.rb:21:1207:21:2788 | if ... | UseUseExplosion.rb:21:1202:21:2788 | then ... | | UseUseExplosion.rb:21:1211:21:1215 | [post] self | UseUseExplosion.rb:21:1232:21:1236 | self | | UseUseExplosion.rb:21:1211:21:1215 | [post] self | UseUseExplosion.rb:21:2779:21:2784 | self | | UseUseExplosion.rb:21:1211:21:1215 | self | UseUseExplosion.rb:21:1232:21:1236 | self | | UseUseExplosion.rb:21:1211:21:1215 | self | UseUseExplosion.rb:21:2779:21:2784 | self | -| UseUseExplosion.rb:21:1211:21:1220 | ... > ... | UseUseExplosion.rb:21:1210:21:1221 | [false] ( ... ) | -| UseUseExplosion.rb:21:1211:21:1220 | ... > ... | UseUseExplosion.rb:21:1210:21:1221 | [true] ( ... ) | +| UseUseExplosion.rb:21:1211:21:1220 | ... > ... | UseUseExplosion.rb:21:1210:21:1221 | ( ... ) | | UseUseExplosion.rb:21:1223:21:2772 | then ... | UseUseExplosion.rb:21:1207:21:2788 | if ... | | UseUseExplosion.rb:21:1228:21:2772 | if ... | UseUseExplosion.rb:21:1223:21:2772 | then ... | | UseUseExplosion.rb:21:1232:21:1236 | [post] self | UseUseExplosion.rb:21:1253:21:1257 | self | | UseUseExplosion.rb:21:1232:21:1236 | [post] self | UseUseExplosion.rb:21:2763:21:2768 | self | | UseUseExplosion.rb:21:1232:21:1236 | self | UseUseExplosion.rb:21:1253:21:1257 | self | | UseUseExplosion.rb:21:1232:21:1236 | self | UseUseExplosion.rb:21:2763:21:2768 | self | -| UseUseExplosion.rb:21:1232:21:1241 | ... > ... | UseUseExplosion.rb:21:1231:21:1242 | [false] ( ... ) | -| UseUseExplosion.rb:21:1232:21:1241 | ... > ... | UseUseExplosion.rb:21:1231:21:1242 | [true] ( ... ) | +| UseUseExplosion.rb:21:1232:21:1241 | ... > ... | UseUseExplosion.rb:21:1231:21:1242 | ( ... ) | | UseUseExplosion.rb:21:1244:21:2756 | then ... | UseUseExplosion.rb:21:1228:21:2772 | if ... | | UseUseExplosion.rb:21:1249:21:2756 | if ... | UseUseExplosion.rb:21:1244:21:2756 | then ... | | UseUseExplosion.rb:21:1253:21:1257 | [post] self | UseUseExplosion.rb:21:1274:21:1278 | self | | UseUseExplosion.rb:21:1253:21:1257 | [post] self | UseUseExplosion.rb:21:2747:21:2752 | self | | UseUseExplosion.rb:21:1253:21:1257 | self | UseUseExplosion.rb:21:1274:21:1278 | self | | UseUseExplosion.rb:21:1253:21:1257 | self | UseUseExplosion.rb:21:2747:21:2752 | self | -| UseUseExplosion.rb:21:1253:21:1262 | ... > ... | UseUseExplosion.rb:21:1252:21:1263 | [false] ( ... ) | -| UseUseExplosion.rb:21:1253:21:1262 | ... > ... | UseUseExplosion.rb:21:1252:21:1263 | [true] ( ... ) | +| UseUseExplosion.rb:21:1253:21:1262 | ... > ... | UseUseExplosion.rb:21:1252:21:1263 | ( ... ) | | UseUseExplosion.rb:21:1265:21:2740 | then ... | UseUseExplosion.rb:21:1249:21:2756 | if ... | | UseUseExplosion.rb:21:1270:21:2740 | if ... | UseUseExplosion.rb:21:1265:21:2740 | then ... | | UseUseExplosion.rb:21:1274:21:1278 | [post] self | UseUseExplosion.rb:21:1295:21:1299 | self | | UseUseExplosion.rb:21:1274:21:1278 | [post] self | UseUseExplosion.rb:21:2731:21:2736 | self | | UseUseExplosion.rb:21:1274:21:1278 | self | UseUseExplosion.rb:21:1295:21:1299 | self | | UseUseExplosion.rb:21:1274:21:1278 | self | UseUseExplosion.rb:21:2731:21:2736 | self | -| UseUseExplosion.rb:21:1274:21:1283 | ... > ... | UseUseExplosion.rb:21:1273:21:1284 | [false] ( ... ) | -| UseUseExplosion.rb:21:1274:21:1283 | ... > ... | UseUseExplosion.rb:21:1273:21:1284 | [true] ( ... ) | +| UseUseExplosion.rb:21:1274:21:1283 | ... > ... | UseUseExplosion.rb:21:1273:21:1284 | ( ... ) | | UseUseExplosion.rb:21:1286:21:2724 | then ... | UseUseExplosion.rb:21:1270:21:2740 | if ... | | UseUseExplosion.rb:21:1291:21:2724 | if ... | UseUseExplosion.rb:21:1286:21:2724 | then ... | | UseUseExplosion.rb:21:1295:21:1299 | [post] self | UseUseExplosion.rb:21:1316:21:1320 | self | | UseUseExplosion.rb:21:1295:21:1299 | [post] self | UseUseExplosion.rb:21:2715:21:2720 | self | | UseUseExplosion.rb:21:1295:21:1299 | self | UseUseExplosion.rb:21:1316:21:1320 | self | | UseUseExplosion.rb:21:1295:21:1299 | self | UseUseExplosion.rb:21:2715:21:2720 | self | -| UseUseExplosion.rb:21:1295:21:1304 | ... > ... | UseUseExplosion.rb:21:1294:21:1305 | [false] ( ... ) | -| UseUseExplosion.rb:21:1295:21:1304 | ... > ... | UseUseExplosion.rb:21:1294:21:1305 | [true] ( ... ) | +| UseUseExplosion.rb:21:1295:21:1304 | ... > ... | UseUseExplosion.rb:21:1294:21:1305 | ( ... ) | | UseUseExplosion.rb:21:1307:21:2708 | then ... | UseUseExplosion.rb:21:1291:21:2724 | if ... | | UseUseExplosion.rb:21:1312:21:2708 | if ... | UseUseExplosion.rb:21:1307:21:2708 | then ... | | UseUseExplosion.rb:21:1316:21:1320 | [post] self | UseUseExplosion.rb:21:1337:21:1341 | self | | UseUseExplosion.rb:21:1316:21:1320 | [post] self | UseUseExplosion.rb:21:2699:21:2704 | self | | UseUseExplosion.rb:21:1316:21:1320 | self | UseUseExplosion.rb:21:1337:21:1341 | self | | UseUseExplosion.rb:21:1316:21:1320 | self | UseUseExplosion.rb:21:2699:21:2704 | self | -| UseUseExplosion.rb:21:1316:21:1325 | ... > ... | UseUseExplosion.rb:21:1315:21:1326 | [false] ( ... ) | -| UseUseExplosion.rb:21:1316:21:1325 | ... > ... | UseUseExplosion.rb:21:1315:21:1326 | [true] ( ... ) | +| UseUseExplosion.rb:21:1316:21:1325 | ... > ... | UseUseExplosion.rb:21:1315:21:1326 | ( ... ) | | UseUseExplosion.rb:21:1328:21:2692 | then ... | UseUseExplosion.rb:21:1312:21:2708 | if ... | | UseUseExplosion.rb:21:1333:21:2692 | if ... | UseUseExplosion.rb:21:1328:21:2692 | then ... | | UseUseExplosion.rb:21:1337:21:1341 | [post] self | UseUseExplosion.rb:21:1358:21:1362 | self | | UseUseExplosion.rb:21:1337:21:1341 | [post] self | UseUseExplosion.rb:21:2683:21:2688 | self | | UseUseExplosion.rb:21:1337:21:1341 | self | UseUseExplosion.rb:21:1358:21:1362 | self | | UseUseExplosion.rb:21:1337:21:1341 | self | UseUseExplosion.rb:21:2683:21:2688 | self | -| UseUseExplosion.rb:21:1337:21:1346 | ... > ... | UseUseExplosion.rb:21:1336:21:1347 | [false] ( ... ) | -| UseUseExplosion.rb:21:1337:21:1346 | ... > ... | UseUseExplosion.rb:21:1336:21:1347 | [true] ( ... ) | +| UseUseExplosion.rb:21:1337:21:1346 | ... > ... | UseUseExplosion.rb:21:1336:21:1347 | ( ... ) | | UseUseExplosion.rb:21:1349:21:2676 | then ... | UseUseExplosion.rb:21:1333:21:2692 | if ... | | UseUseExplosion.rb:21:1354:21:2676 | if ... | UseUseExplosion.rb:21:1349:21:2676 | then ... | | UseUseExplosion.rb:21:1358:21:1362 | [post] self | UseUseExplosion.rb:21:1379:21:1383 | self | | UseUseExplosion.rb:21:1358:21:1362 | [post] self | UseUseExplosion.rb:21:2667:21:2672 | self | | UseUseExplosion.rb:21:1358:21:1362 | self | UseUseExplosion.rb:21:1379:21:1383 | self | | UseUseExplosion.rb:21:1358:21:1362 | self | UseUseExplosion.rb:21:2667:21:2672 | self | -| UseUseExplosion.rb:21:1358:21:1367 | ... > ... | UseUseExplosion.rb:21:1357:21:1368 | [false] ( ... ) | -| UseUseExplosion.rb:21:1358:21:1367 | ... > ... | UseUseExplosion.rb:21:1357:21:1368 | [true] ( ... ) | +| UseUseExplosion.rb:21:1358:21:1367 | ... > ... | UseUseExplosion.rb:21:1357:21:1368 | ( ... ) | | UseUseExplosion.rb:21:1370:21:2660 | then ... | UseUseExplosion.rb:21:1354:21:2676 | if ... | | UseUseExplosion.rb:21:1375:21:2660 | if ... | UseUseExplosion.rb:21:1370:21:2660 | then ... | | UseUseExplosion.rb:21:1379:21:1383 | [post] self | UseUseExplosion.rb:21:1400:21:1404 | self | | UseUseExplosion.rb:21:1379:21:1383 | [post] self | UseUseExplosion.rb:21:2651:21:2656 | self | | UseUseExplosion.rb:21:1379:21:1383 | self | UseUseExplosion.rb:21:1400:21:1404 | self | | UseUseExplosion.rb:21:1379:21:1383 | self | UseUseExplosion.rb:21:2651:21:2656 | self | -| UseUseExplosion.rb:21:1379:21:1388 | ... > ... | UseUseExplosion.rb:21:1378:21:1389 | [false] ( ... ) | -| UseUseExplosion.rb:21:1379:21:1388 | ... > ... | UseUseExplosion.rb:21:1378:21:1389 | [true] ( ... ) | +| UseUseExplosion.rb:21:1379:21:1388 | ... > ... | UseUseExplosion.rb:21:1378:21:1389 | ( ... ) | | UseUseExplosion.rb:21:1391:21:2644 | then ... | UseUseExplosion.rb:21:1375:21:2660 | if ... | | UseUseExplosion.rb:21:1396:21:2644 | if ... | UseUseExplosion.rb:21:1391:21:2644 | then ... | | UseUseExplosion.rb:21:1400:21:1404 | [post] self | UseUseExplosion.rb:21:1421:21:1425 | self | | UseUseExplosion.rb:21:1400:21:1404 | [post] self | UseUseExplosion.rb:21:2635:21:2640 | self | | UseUseExplosion.rb:21:1400:21:1404 | self | UseUseExplosion.rb:21:1421:21:1425 | self | | UseUseExplosion.rb:21:1400:21:1404 | self | UseUseExplosion.rb:21:2635:21:2640 | self | -| UseUseExplosion.rb:21:1400:21:1409 | ... > ... | UseUseExplosion.rb:21:1399:21:1410 | [false] ( ... ) | -| UseUseExplosion.rb:21:1400:21:1409 | ... > ... | UseUseExplosion.rb:21:1399:21:1410 | [true] ( ... ) | +| UseUseExplosion.rb:21:1400:21:1409 | ... > ... | UseUseExplosion.rb:21:1399:21:1410 | ( ... ) | | UseUseExplosion.rb:21:1412:21:2628 | then ... | UseUseExplosion.rb:21:1396:21:2644 | if ... | | UseUseExplosion.rb:21:1417:21:2628 | if ... | UseUseExplosion.rb:21:1412:21:2628 | then ... | | UseUseExplosion.rb:21:1421:21:1425 | [post] self | UseUseExplosion.rb:21:1442:21:1446 | self | | UseUseExplosion.rb:21:1421:21:1425 | [post] self | UseUseExplosion.rb:21:2619:21:2624 | self | | UseUseExplosion.rb:21:1421:21:1425 | self | UseUseExplosion.rb:21:1442:21:1446 | self | | UseUseExplosion.rb:21:1421:21:1425 | self | UseUseExplosion.rb:21:2619:21:2624 | self | -| UseUseExplosion.rb:21:1421:21:1430 | ... > ... | UseUseExplosion.rb:21:1420:21:1431 | [false] ( ... ) | -| UseUseExplosion.rb:21:1421:21:1430 | ... > ... | UseUseExplosion.rb:21:1420:21:1431 | [true] ( ... ) | +| UseUseExplosion.rb:21:1421:21:1430 | ... > ... | UseUseExplosion.rb:21:1420:21:1431 | ( ... ) | | UseUseExplosion.rb:21:1433:21:2612 | then ... | UseUseExplosion.rb:21:1417:21:2628 | if ... | | UseUseExplosion.rb:21:1438:21:2612 | if ... | UseUseExplosion.rb:21:1433:21:2612 | then ... | | UseUseExplosion.rb:21:1442:21:1446 | [post] self | UseUseExplosion.rb:21:1463:21:1467 | self | | UseUseExplosion.rb:21:1442:21:1446 | [post] self | UseUseExplosion.rb:21:2603:21:2608 | self | | UseUseExplosion.rb:21:1442:21:1446 | self | UseUseExplosion.rb:21:1463:21:1467 | self | | UseUseExplosion.rb:21:1442:21:1446 | self | UseUseExplosion.rb:21:2603:21:2608 | self | -| UseUseExplosion.rb:21:1442:21:1451 | ... > ... | UseUseExplosion.rb:21:1441:21:1452 | [false] ( ... ) | -| UseUseExplosion.rb:21:1442:21:1451 | ... > ... | UseUseExplosion.rb:21:1441:21:1452 | [true] ( ... ) | +| UseUseExplosion.rb:21:1442:21:1451 | ... > ... | UseUseExplosion.rb:21:1441:21:1452 | ( ... ) | | UseUseExplosion.rb:21:1454:21:2596 | then ... | UseUseExplosion.rb:21:1438:21:2612 | if ... | | UseUseExplosion.rb:21:1459:21:2596 | if ... | UseUseExplosion.rb:21:1454:21:2596 | then ... | | UseUseExplosion.rb:21:1463:21:1467 | [post] self | UseUseExplosion.rb:21:1484:21:1488 | self | | UseUseExplosion.rb:21:1463:21:1467 | [post] self | UseUseExplosion.rb:21:2587:21:2592 | self | | UseUseExplosion.rb:21:1463:21:1467 | self | UseUseExplosion.rb:21:1484:21:1488 | self | | UseUseExplosion.rb:21:1463:21:1467 | self | UseUseExplosion.rb:21:2587:21:2592 | self | -| UseUseExplosion.rb:21:1463:21:1472 | ... > ... | UseUseExplosion.rb:21:1462:21:1473 | [false] ( ... ) | -| UseUseExplosion.rb:21:1463:21:1472 | ... > ... | UseUseExplosion.rb:21:1462:21:1473 | [true] ( ... ) | +| UseUseExplosion.rb:21:1463:21:1472 | ... > ... | UseUseExplosion.rb:21:1462:21:1473 | ( ... ) | | UseUseExplosion.rb:21:1475:21:2580 | then ... | UseUseExplosion.rb:21:1459:21:2596 | if ... | | UseUseExplosion.rb:21:1480:21:2580 | if ... | UseUseExplosion.rb:21:1475:21:2580 | then ... | | UseUseExplosion.rb:21:1484:21:1488 | [post] self | UseUseExplosion.rb:21:1505:21:1509 | self | | UseUseExplosion.rb:21:1484:21:1488 | [post] self | UseUseExplosion.rb:21:2571:21:2576 | self | | UseUseExplosion.rb:21:1484:21:1488 | self | UseUseExplosion.rb:21:1505:21:1509 | self | | UseUseExplosion.rb:21:1484:21:1488 | self | UseUseExplosion.rb:21:2571:21:2576 | self | -| UseUseExplosion.rb:21:1484:21:1493 | ... > ... | UseUseExplosion.rb:21:1483:21:1494 | [false] ( ... ) | -| UseUseExplosion.rb:21:1484:21:1493 | ... > ... | UseUseExplosion.rb:21:1483:21:1494 | [true] ( ... ) | +| UseUseExplosion.rb:21:1484:21:1493 | ... > ... | UseUseExplosion.rb:21:1483:21:1494 | ( ... ) | | UseUseExplosion.rb:21:1496:21:2564 | then ... | UseUseExplosion.rb:21:1480:21:2580 | if ... | | UseUseExplosion.rb:21:1501:21:2564 | if ... | UseUseExplosion.rb:21:1496:21:2564 | then ... | | UseUseExplosion.rb:21:1505:21:1509 | [post] self | UseUseExplosion.rb:21:1526:21:1530 | self | | UseUseExplosion.rb:21:1505:21:1509 | [post] self | UseUseExplosion.rb:21:2555:21:2560 | self | | UseUseExplosion.rb:21:1505:21:1509 | self | UseUseExplosion.rb:21:1526:21:1530 | self | | UseUseExplosion.rb:21:1505:21:1509 | self | UseUseExplosion.rb:21:2555:21:2560 | self | -| UseUseExplosion.rb:21:1505:21:1514 | ... > ... | UseUseExplosion.rb:21:1504:21:1515 | [false] ( ... ) | -| UseUseExplosion.rb:21:1505:21:1514 | ... > ... | UseUseExplosion.rb:21:1504:21:1515 | [true] ( ... ) | +| UseUseExplosion.rb:21:1505:21:1514 | ... > ... | UseUseExplosion.rb:21:1504:21:1515 | ( ... ) | | UseUseExplosion.rb:21:1517:21:2548 | then ... | UseUseExplosion.rb:21:1501:21:2564 | if ... | | UseUseExplosion.rb:21:1522:21:2548 | if ... | UseUseExplosion.rb:21:1517:21:2548 | then ... | | UseUseExplosion.rb:21:1526:21:1530 | [post] self | UseUseExplosion.rb:21:1547:21:1551 | self | | UseUseExplosion.rb:21:1526:21:1530 | [post] self | UseUseExplosion.rb:21:2539:21:2544 | self | | UseUseExplosion.rb:21:1526:21:1530 | self | UseUseExplosion.rb:21:1547:21:1551 | self | | UseUseExplosion.rb:21:1526:21:1530 | self | UseUseExplosion.rb:21:2539:21:2544 | self | -| UseUseExplosion.rb:21:1526:21:1535 | ... > ... | UseUseExplosion.rb:21:1525:21:1536 | [false] ( ... ) | -| UseUseExplosion.rb:21:1526:21:1535 | ... > ... | UseUseExplosion.rb:21:1525:21:1536 | [true] ( ... ) | +| UseUseExplosion.rb:21:1526:21:1535 | ... > ... | UseUseExplosion.rb:21:1525:21:1536 | ( ... ) | | UseUseExplosion.rb:21:1538:21:2532 | then ... | UseUseExplosion.rb:21:1522:21:2548 | if ... | | UseUseExplosion.rb:21:1543:21:2532 | if ... | UseUseExplosion.rb:21:1538:21:2532 | then ... | | UseUseExplosion.rb:21:1547:21:1551 | [post] self | UseUseExplosion.rb:21:1568:21:1572 | self | | UseUseExplosion.rb:21:1547:21:1551 | [post] self | UseUseExplosion.rb:21:2523:21:2528 | self | | UseUseExplosion.rb:21:1547:21:1551 | self | UseUseExplosion.rb:21:1568:21:1572 | self | | UseUseExplosion.rb:21:1547:21:1551 | self | UseUseExplosion.rb:21:2523:21:2528 | self | -| UseUseExplosion.rb:21:1547:21:1556 | ... > ... | UseUseExplosion.rb:21:1546:21:1557 | [false] ( ... ) | -| UseUseExplosion.rb:21:1547:21:1556 | ... > ... | UseUseExplosion.rb:21:1546:21:1557 | [true] ( ... ) | +| UseUseExplosion.rb:21:1547:21:1556 | ... > ... | UseUseExplosion.rb:21:1546:21:1557 | ( ... ) | | UseUseExplosion.rb:21:1559:21:2516 | then ... | UseUseExplosion.rb:21:1543:21:2532 | if ... | | UseUseExplosion.rb:21:1564:21:2516 | if ... | UseUseExplosion.rb:21:1559:21:2516 | then ... | | UseUseExplosion.rb:21:1568:21:1572 | [post] self | UseUseExplosion.rb:21:1589:21:1593 | self | | UseUseExplosion.rb:21:1568:21:1572 | [post] self | UseUseExplosion.rb:21:2507:21:2512 | self | | UseUseExplosion.rb:21:1568:21:1572 | self | UseUseExplosion.rb:21:1589:21:1593 | self | | UseUseExplosion.rb:21:1568:21:1572 | self | UseUseExplosion.rb:21:2507:21:2512 | self | -| UseUseExplosion.rb:21:1568:21:1577 | ... > ... | UseUseExplosion.rb:21:1567:21:1578 | [false] ( ... ) | -| UseUseExplosion.rb:21:1568:21:1577 | ... > ... | UseUseExplosion.rb:21:1567:21:1578 | [true] ( ... ) | +| UseUseExplosion.rb:21:1568:21:1577 | ... > ... | UseUseExplosion.rb:21:1567:21:1578 | ( ... ) | | UseUseExplosion.rb:21:1580:21:2500 | then ... | UseUseExplosion.rb:21:1564:21:2516 | if ... | | UseUseExplosion.rb:21:1585:21:2500 | if ... | UseUseExplosion.rb:21:1580:21:2500 | then ... | | UseUseExplosion.rb:21:1589:21:1593 | [post] self | UseUseExplosion.rb:21:1610:21:1614 | self | | UseUseExplosion.rb:21:1589:21:1593 | [post] self | UseUseExplosion.rb:21:2491:21:2496 | self | | UseUseExplosion.rb:21:1589:21:1593 | self | UseUseExplosion.rb:21:1610:21:1614 | self | | UseUseExplosion.rb:21:1589:21:1593 | self | UseUseExplosion.rb:21:2491:21:2496 | self | -| UseUseExplosion.rb:21:1589:21:1598 | ... > ... | UseUseExplosion.rb:21:1588:21:1599 | [false] ( ... ) | -| UseUseExplosion.rb:21:1589:21:1598 | ... > ... | UseUseExplosion.rb:21:1588:21:1599 | [true] ( ... ) | +| UseUseExplosion.rb:21:1589:21:1598 | ... > ... | UseUseExplosion.rb:21:1588:21:1599 | ( ... ) | | UseUseExplosion.rb:21:1601:21:2484 | then ... | UseUseExplosion.rb:21:1585:21:2500 | if ... | | UseUseExplosion.rb:21:1606:21:2484 | if ... | UseUseExplosion.rb:21:1601:21:2484 | then ... | | UseUseExplosion.rb:21:1610:21:1614 | [post] self | UseUseExplosion.rb:21:1631:21:1635 | self | | UseUseExplosion.rb:21:1610:21:1614 | [post] self | UseUseExplosion.rb:21:2475:21:2480 | self | | UseUseExplosion.rb:21:1610:21:1614 | self | UseUseExplosion.rb:21:1631:21:1635 | self | | UseUseExplosion.rb:21:1610:21:1614 | self | UseUseExplosion.rb:21:2475:21:2480 | self | -| UseUseExplosion.rb:21:1610:21:1619 | ... > ... | UseUseExplosion.rb:21:1609:21:1620 | [false] ( ... ) | -| UseUseExplosion.rb:21:1610:21:1619 | ... > ... | UseUseExplosion.rb:21:1609:21:1620 | [true] ( ... ) | +| UseUseExplosion.rb:21:1610:21:1619 | ... > ... | UseUseExplosion.rb:21:1609:21:1620 | ( ... ) | | UseUseExplosion.rb:21:1622:21:2468 | then ... | UseUseExplosion.rb:21:1606:21:2484 | if ... | | UseUseExplosion.rb:21:1627:21:2468 | if ... | UseUseExplosion.rb:21:1622:21:2468 | then ... | | UseUseExplosion.rb:21:1631:21:1635 | [post] self | UseUseExplosion.rb:21:1652:21:1656 | self | | UseUseExplosion.rb:21:1631:21:1635 | [post] self | UseUseExplosion.rb:21:2459:21:2464 | self | | UseUseExplosion.rb:21:1631:21:1635 | self | UseUseExplosion.rb:21:1652:21:1656 | self | | UseUseExplosion.rb:21:1631:21:1635 | self | UseUseExplosion.rb:21:2459:21:2464 | self | -| UseUseExplosion.rb:21:1631:21:1640 | ... > ... | UseUseExplosion.rb:21:1630:21:1641 | [false] ( ... ) | -| UseUseExplosion.rb:21:1631:21:1640 | ... > ... | UseUseExplosion.rb:21:1630:21:1641 | [true] ( ... ) | +| UseUseExplosion.rb:21:1631:21:1640 | ... > ... | UseUseExplosion.rb:21:1630:21:1641 | ( ... ) | | UseUseExplosion.rb:21:1643:21:2452 | then ... | UseUseExplosion.rb:21:1627:21:2468 | if ... | | UseUseExplosion.rb:21:1648:21:2452 | if ... | UseUseExplosion.rb:21:1643:21:2452 | then ... | | UseUseExplosion.rb:21:1652:21:1656 | [post] self | UseUseExplosion.rb:21:1673:21:1677 | self | | UseUseExplosion.rb:21:1652:21:1656 | [post] self | UseUseExplosion.rb:21:2443:21:2448 | self | | UseUseExplosion.rb:21:1652:21:1656 | self | UseUseExplosion.rb:21:1673:21:1677 | self | | UseUseExplosion.rb:21:1652:21:1656 | self | UseUseExplosion.rb:21:2443:21:2448 | self | -| UseUseExplosion.rb:21:1652:21:1661 | ... > ... | UseUseExplosion.rb:21:1651:21:1662 | [false] ( ... ) | -| UseUseExplosion.rb:21:1652:21:1661 | ... > ... | UseUseExplosion.rb:21:1651:21:1662 | [true] ( ... ) | +| UseUseExplosion.rb:21:1652:21:1661 | ... > ... | UseUseExplosion.rb:21:1651:21:1662 | ( ... ) | | UseUseExplosion.rb:21:1664:21:2436 | then ... | UseUseExplosion.rb:21:1648:21:2452 | if ... | | UseUseExplosion.rb:21:1669:21:2436 | if ... | UseUseExplosion.rb:21:1664:21:2436 | then ... | | UseUseExplosion.rb:21:1673:21:1677 | [post] self | UseUseExplosion.rb:21:1694:21:1698 | self | | UseUseExplosion.rb:21:1673:21:1677 | [post] self | UseUseExplosion.rb:21:2427:21:2432 | self | | UseUseExplosion.rb:21:1673:21:1677 | self | UseUseExplosion.rb:21:1694:21:1698 | self | | UseUseExplosion.rb:21:1673:21:1677 | self | UseUseExplosion.rb:21:2427:21:2432 | self | -| UseUseExplosion.rb:21:1673:21:1682 | ... > ... | UseUseExplosion.rb:21:1672:21:1683 | [false] ( ... ) | -| UseUseExplosion.rb:21:1673:21:1682 | ... > ... | UseUseExplosion.rb:21:1672:21:1683 | [true] ( ... ) | +| UseUseExplosion.rb:21:1673:21:1682 | ... > ... | UseUseExplosion.rb:21:1672:21:1683 | ( ... ) | | UseUseExplosion.rb:21:1685:21:2420 | then ... | UseUseExplosion.rb:21:1669:21:2436 | if ... | | UseUseExplosion.rb:21:1690:21:2420 | if ... | UseUseExplosion.rb:21:1685:21:2420 | then ... | | UseUseExplosion.rb:21:1694:21:1698 | [post] self | UseUseExplosion.rb:21:1715:21:1719 | self | | UseUseExplosion.rb:21:1694:21:1698 | [post] self | UseUseExplosion.rb:21:2411:21:2416 | self | | UseUseExplosion.rb:21:1694:21:1698 | self | UseUseExplosion.rb:21:1715:21:1719 | self | | UseUseExplosion.rb:21:1694:21:1698 | self | UseUseExplosion.rb:21:2411:21:2416 | self | -| UseUseExplosion.rb:21:1694:21:1703 | ... > ... | UseUseExplosion.rb:21:1693:21:1704 | [false] ( ... ) | -| UseUseExplosion.rb:21:1694:21:1703 | ... > ... | UseUseExplosion.rb:21:1693:21:1704 | [true] ( ... ) | +| UseUseExplosion.rb:21:1694:21:1703 | ... > ... | UseUseExplosion.rb:21:1693:21:1704 | ( ... ) | | UseUseExplosion.rb:21:1706:21:2404 | then ... | UseUseExplosion.rb:21:1690:21:2420 | if ... | | UseUseExplosion.rb:21:1711:21:2404 | if ... | UseUseExplosion.rb:21:1706:21:2404 | then ... | | UseUseExplosion.rb:21:1715:21:1719 | [post] self | UseUseExplosion.rb:21:1736:21:1740 | self | | UseUseExplosion.rb:21:1715:21:1719 | [post] self | UseUseExplosion.rb:21:2395:21:2400 | self | | UseUseExplosion.rb:21:1715:21:1719 | self | UseUseExplosion.rb:21:1736:21:1740 | self | | UseUseExplosion.rb:21:1715:21:1719 | self | UseUseExplosion.rb:21:2395:21:2400 | self | -| UseUseExplosion.rb:21:1715:21:1724 | ... > ... | UseUseExplosion.rb:21:1714:21:1725 | [false] ( ... ) | -| UseUseExplosion.rb:21:1715:21:1724 | ... > ... | UseUseExplosion.rb:21:1714:21:1725 | [true] ( ... ) | +| UseUseExplosion.rb:21:1715:21:1724 | ... > ... | UseUseExplosion.rb:21:1714:21:1725 | ( ... ) | | UseUseExplosion.rb:21:1727:21:2388 | then ... | UseUseExplosion.rb:21:1711:21:2404 | if ... | | UseUseExplosion.rb:21:1732:21:2388 | if ... | UseUseExplosion.rb:21:1727:21:2388 | then ... | | UseUseExplosion.rb:21:1736:21:1740 | [post] self | UseUseExplosion.rb:21:1757:21:1761 | self | | UseUseExplosion.rb:21:1736:21:1740 | [post] self | UseUseExplosion.rb:21:2379:21:2384 | self | | UseUseExplosion.rb:21:1736:21:1740 | self | UseUseExplosion.rb:21:1757:21:1761 | self | | UseUseExplosion.rb:21:1736:21:1740 | self | UseUseExplosion.rb:21:2379:21:2384 | self | -| UseUseExplosion.rb:21:1736:21:1745 | ... > ... | UseUseExplosion.rb:21:1735:21:1746 | [false] ( ... ) | -| UseUseExplosion.rb:21:1736:21:1745 | ... > ... | UseUseExplosion.rb:21:1735:21:1746 | [true] ( ... ) | +| UseUseExplosion.rb:21:1736:21:1745 | ... > ... | UseUseExplosion.rb:21:1735:21:1746 | ( ... ) | | UseUseExplosion.rb:21:1748:21:2372 | then ... | UseUseExplosion.rb:21:1732:21:2388 | if ... | | UseUseExplosion.rb:21:1753:21:2372 | if ... | UseUseExplosion.rb:21:1748:21:2372 | then ... | | UseUseExplosion.rb:21:1757:21:1761 | [post] self | UseUseExplosion.rb:21:1778:21:1782 | self | | UseUseExplosion.rb:21:1757:21:1761 | [post] self | UseUseExplosion.rb:21:2363:21:2368 | self | | UseUseExplosion.rb:21:1757:21:1761 | self | UseUseExplosion.rb:21:1778:21:1782 | self | | UseUseExplosion.rb:21:1757:21:1761 | self | UseUseExplosion.rb:21:2363:21:2368 | self | -| UseUseExplosion.rb:21:1757:21:1766 | ... > ... | UseUseExplosion.rb:21:1756:21:1767 | [false] ( ... ) | -| UseUseExplosion.rb:21:1757:21:1766 | ... > ... | UseUseExplosion.rb:21:1756:21:1767 | [true] ( ... ) | +| UseUseExplosion.rb:21:1757:21:1766 | ... > ... | UseUseExplosion.rb:21:1756:21:1767 | ( ... ) | | UseUseExplosion.rb:21:1769:21:2356 | then ... | UseUseExplosion.rb:21:1753:21:2372 | if ... | | UseUseExplosion.rb:21:1774:21:2356 | if ... | UseUseExplosion.rb:21:1769:21:2356 | then ... | | UseUseExplosion.rb:21:1778:21:1782 | [post] self | UseUseExplosion.rb:21:1799:21:1803 | self | | UseUseExplosion.rb:21:1778:21:1782 | [post] self | UseUseExplosion.rb:21:2347:21:2352 | self | | UseUseExplosion.rb:21:1778:21:1782 | self | UseUseExplosion.rb:21:1799:21:1803 | self | | UseUseExplosion.rb:21:1778:21:1782 | self | UseUseExplosion.rb:21:2347:21:2352 | self | -| UseUseExplosion.rb:21:1778:21:1787 | ... > ... | UseUseExplosion.rb:21:1777:21:1788 | [false] ( ... ) | -| UseUseExplosion.rb:21:1778:21:1787 | ... > ... | UseUseExplosion.rb:21:1777:21:1788 | [true] ( ... ) | +| UseUseExplosion.rb:21:1778:21:1787 | ... > ... | UseUseExplosion.rb:21:1777:21:1788 | ( ... ) | | UseUseExplosion.rb:21:1790:21:2340 | then ... | UseUseExplosion.rb:21:1774:21:2356 | if ... | | UseUseExplosion.rb:21:1795:21:2340 | if ... | UseUseExplosion.rb:21:1790:21:2340 | then ... | | UseUseExplosion.rb:21:1799:21:1803 | [post] self | UseUseExplosion.rb:21:1820:21:1824 | self | | UseUseExplosion.rb:21:1799:21:1803 | [post] self | UseUseExplosion.rb:21:2331:21:2336 | self | | UseUseExplosion.rb:21:1799:21:1803 | self | UseUseExplosion.rb:21:1820:21:1824 | self | | UseUseExplosion.rb:21:1799:21:1803 | self | UseUseExplosion.rb:21:2331:21:2336 | self | -| UseUseExplosion.rb:21:1799:21:1808 | ... > ... | UseUseExplosion.rb:21:1798:21:1809 | [false] ( ... ) | -| UseUseExplosion.rb:21:1799:21:1808 | ... > ... | UseUseExplosion.rb:21:1798:21:1809 | [true] ( ... ) | +| UseUseExplosion.rb:21:1799:21:1808 | ... > ... | UseUseExplosion.rb:21:1798:21:1809 | ( ... ) | | UseUseExplosion.rb:21:1811:21:2324 | then ... | UseUseExplosion.rb:21:1795:21:2340 | if ... | | UseUseExplosion.rb:21:1816:21:2324 | if ... | UseUseExplosion.rb:21:1811:21:2324 | then ... | | UseUseExplosion.rb:21:1820:21:1824 | [post] self | UseUseExplosion.rb:21:1841:21:1845 | self | | UseUseExplosion.rb:21:1820:21:1824 | [post] self | UseUseExplosion.rb:21:2315:21:2320 | self | | UseUseExplosion.rb:21:1820:21:1824 | self | UseUseExplosion.rb:21:1841:21:1845 | self | | UseUseExplosion.rb:21:1820:21:1824 | self | UseUseExplosion.rb:21:2315:21:2320 | self | -| UseUseExplosion.rb:21:1820:21:1829 | ... > ... | UseUseExplosion.rb:21:1819:21:1830 | [false] ( ... ) | -| UseUseExplosion.rb:21:1820:21:1829 | ... > ... | UseUseExplosion.rb:21:1819:21:1830 | [true] ( ... ) | +| UseUseExplosion.rb:21:1820:21:1829 | ... > ... | UseUseExplosion.rb:21:1819:21:1830 | ( ... ) | | UseUseExplosion.rb:21:1832:21:2308 | then ... | UseUseExplosion.rb:21:1816:21:2324 | if ... | | UseUseExplosion.rb:21:1837:21:2308 | if ... | UseUseExplosion.rb:21:1832:21:2308 | then ... | | UseUseExplosion.rb:21:1841:21:1845 | [post] self | UseUseExplosion.rb:21:1862:21:1866 | self | | UseUseExplosion.rb:21:1841:21:1845 | [post] self | UseUseExplosion.rb:21:2299:21:2304 | self | | UseUseExplosion.rb:21:1841:21:1845 | self | UseUseExplosion.rb:21:1862:21:1866 | self | | UseUseExplosion.rb:21:1841:21:1845 | self | UseUseExplosion.rb:21:2299:21:2304 | self | -| UseUseExplosion.rb:21:1841:21:1850 | ... > ... | UseUseExplosion.rb:21:1840:21:1851 | [false] ( ... ) | -| UseUseExplosion.rb:21:1841:21:1850 | ... > ... | UseUseExplosion.rb:21:1840:21:1851 | [true] ( ... ) | +| UseUseExplosion.rb:21:1841:21:1850 | ... > ... | UseUseExplosion.rb:21:1840:21:1851 | ( ... ) | | UseUseExplosion.rb:21:1853:21:2292 | then ... | UseUseExplosion.rb:21:1837:21:2308 | if ... | | UseUseExplosion.rb:21:1858:21:2292 | if ... | UseUseExplosion.rb:21:1853:21:2292 | then ... | | UseUseExplosion.rb:21:1862:21:1866 | [post] self | UseUseExplosion.rb:21:1883:21:1887 | self | | UseUseExplosion.rb:21:1862:21:1866 | [post] self | UseUseExplosion.rb:21:2283:21:2288 | self | | UseUseExplosion.rb:21:1862:21:1866 | self | UseUseExplosion.rb:21:1883:21:1887 | self | | UseUseExplosion.rb:21:1862:21:1866 | self | UseUseExplosion.rb:21:2283:21:2288 | self | -| UseUseExplosion.rb:21:1862:21:1871 | ... > ... | UseUseExplosion.rb:21:1861:21:1872 | [false] ( ... ) | -| UseUseExplosion.rb:21:1862:21:1871 | ... > ... | UseUseExplosion.rb:21:1861:21:1872 | [true] ( ... ) | +| UseUseExplosion.rb:21:1862:21:1871 | ... > ... | UseUseExplosion.rb:21:1861:21:1872 | ( ... ) | | UseUseExplosion.rb:21:1874:21:2276 | then ... | UseUseExplosion.rb:21:1858:21:2292 | if ... | | UseUseExplosion.rb:21:1879:21:2276 | if ... | UseUseExplosion.rb:21:1874:21:2276 | then ... | | UseUseExplosion.rb:21:1883:21:1887 | [post] self | UseUseExplosion.rb:21:1904:21:1908 | self | | UseUseExplosion.rb:21:1883:21:1887 | [post] self | UseUseExplosion.rb:21:2267:21:2272 | self | | UseUseExplosion.rb:21:1883:21:1887 | self | UseUseExplosion.rb:21:1904:21:1908 | self | | UseUseExplosion.rb:21:1883:21:1887 | self | UseUseExplosion.rb:21:2267:21:2272 | self | -| UseUseExplosion.rb:21:1883:21:1892 | ... > ... | UseUseExplosion.rb:21:1882:21:1893 | [false] ( ... ) | -| UseUseExplosion.rb:21:1883:21:1892 | ... > ... | UseUseExplosion.rb:21:1882:21:1893 | [true] ( ... ) | +| UseUseExplosion.rb:21:1883:21:1892 | ... > ... | UseUseExplosion.rb:21:1882:21:1893 | ( ... ) | | UseUseExplosion.rb:21:1895:21:2260 | then ... | UseUseExplosion.rb:21:1879:21:2276 | if ... | | UseUseExplosion.rb:21:1900:21:2260 | if ... | UseUseExplosion.rb:21:1895:21:2260 | then ... | | UseUseExplosion.rb:21:1904:21:1908 | [post] self | UseUseExplosion.rb:21:1925:21:1929 | self | | UseUseExplosion.rb:21:1904:21:1908 | [post] self | UseUseExplosion.rb:21:2251:21:2256 | self | | UseUseExplosion.rb:21:1904:21:1908 | self | UseUseExplosion.rb:21:1925:21:1929 | self | | UseUseExplosion.rb:21:1904:21:1908 | self | UseUseExplosion.rb:21:2251:21:2256 | self | -| UseUseExplosion.rb:21:1904:21:1913 | ... > ... | UseUseExplosion.rb:21:1903:21:1914 | [false] ( ... ) | -| UseUseExplosion.rb:21:1904:21:1913 | ... > ... | UseUseExplosion.rb:21:1903:21:1914 | [true] ( ... ) | +| UseUseExplosion.rb:21:1904:21:1913 | ... > ... | UseUseExplosion.rb:21:1903:21:1914 | ( ... ) | | UseUseExplosion.rb:21:1916:21:2244 | then ... | UseUseExplosion.rb:21:1900:21:2260 | if ... | | UseUseExplosion.rb:21:1921:21:2244 | if ... | UseUseExplosion.rb:21:1916:21:2244 | then ... | | UseUseExplosion.rb:21:1925:21:1929 | [post] self | UseUseExplosion.rb:21:1945:21:1949 | self | | UseUseExplosion.rb:21:1925:21:1929 | [post] self | UseUseExplosion.rb:21:2235:21:2240 | self | | UseUseExplosion.rb:21:1925:21:1929 | self | UseUseExplosion.rb:21:1945:21:1949 | self | | UseUseExplosion.rb:21:1925:21:1929 | self | UseUseExplosion.rb:21:2235:21:2240 | self | -| UseUseExplosion.rb:21:1925:21:1933 | ... > ... | UseUseExplosion.rb:21:1924:21:1934 | [false] ( ... ) | -| UseUseExplosion.rb:21:1925:21:1933 | ... > ... | UseUseExplosion.rb:21:1924:21:1934 | [true] ( ... ) | +| UseUseExplosion.rb:21:1925:21:1933 | ... > ... | UseUseExplosion.rb:21:1924:21:1934 | ( ... ) | | UseUseExplosion.rb:21:1936:21:2228 | then ... | UseUseExplosion.rb:21:1921:21:2244 | if ... | | UseUseExplosion.rb:21:1941:21:2228 | if ... | UseUseExplosion.rb:21:1936:21:2228 | then ... | | UseUseExplosion.rb:21:1945:21:1949 | [post] self | UseUseExplosion.rb:21:1965:21:1969 | self | | UseUseExplosion.rb:21:1945:21:1949 | [post] self | UseUseExplosion.rb:21:2219:21:2224 | self | | UseUseExplosion.rb:21:1945:21:1949 | self | UseUseExplosion.rb:21:1965:21:1969 | self | | UseUseExplosion.rb:21:1945:21:1949 | self | UseUseExplosion.rb:21:2219:21:2224 | self | -| UseUseExplosion.rb:21:1945:21:1953 | ... > ... | UseUseExplosion.rb:21:1944:21:1954 | [false] ( ... ) | -| UseUseExplosion.rb:21:1945:21:1953 | ... > ... | UseUseExplosion.rb:21:1944:21:1954 | [true] ( ... ) | +| UseUseExplosion.rb:21:1945:21:1953 | ... > ... | UseUseExplosion.rb:21:1944:21:1954 | ( ... ) | | UseUseExplosion.rb:21:1956:21:2212 | then ... | UseUseExplosion.rb:21:1941:21:2228 | if ... | | UseUseExplosion.rb:21:1961:21:2212 | if ... | UseUseExplosion.rb:21:1956:21:2212 | then ... | | UseUseExplosion.rb:21:1965:21:1969 | [post] self | UseUseExplosion.rb:21:1985:21:1989 | self | | UseUseExplosion.rb:21:1965:21:1969 | [post] self | UseUseExplosion.rb:21:2203:21:2208 | self | | UseUseExplosion.rb:21:1965:21:1969 | self | UseUseExplosion.rb:21:1985:21:1989 | self | | UseUseExplosion.rb:21:1965:21:1969 | self | UseUseExplosion.rb:21:2203:21:2208 | self | -| UseUseExplosion.rb:21:1965:21:1973 | ... > ... | UseUseExplosion.rb:21:1964:21:1974 | [false] ( ... ) | -| UseUseExplosion.rb:21:1965:21:1973 | ... > ... | UseUseExplosion.rb:21:1964:21:1974 | [true] ( ... ) | +| UseUseExplosion.rb:21:1965:21:1973 | ... > ... | UseUseExplosion.rb:21:1964:21:1974 | ( ... ) | | UseUseExplosion.rb:21:1976:21:2196 | then ... | UseUseExplosion.rb:21:1961:21:2212 | if ... | | UseUseExplosion.rb:21:1981:21:2196 | if ... | UseUseExplosion.rb:21:1976:21:2196 | then ... | | UseUseExplosion.rb:21:1985:21:1989 | [post] self | UseUseExplosion.rb:21:2005:21:2009 | self | | UseUseExplosion.rb:21:1985:21:1989 | [post] self | UseUseExplosion.rb:21:2187:21:2192 | self | | UseUseExplosion.rb:21:1985:21:1989 | self | UseUseExplosion.rb:21:2005:21:2009 | self | | UseUseExplosion.rb:21:1985:21:1989 | self | UseUseExplosion.rb:21:2187:21:2192 | self | -| UseUseExplosion.rb:21:1985:21:1993 | ... > ... | UseUseExplosion.rb:21:1984:21:1994 | [false] ( ... ) | -| UseUseExplosion.rb:21:1985:21:1993 | ... > ... | UseUseExplosion.rb:21:1984:21:1994 | [true] ( ... ) | +| UseUseExplosion.rb:21:1985:21:1993 | ... > ... | UseUseExplosion.rb:21:1984:21:1994 | ( ... ) | | UseUseExplosion.rb:21:1996:21:2180 | then ... | UseUseExplosion.rb:21:1981:21:2196 | if ... | | UseUseExplosion.rb:21:2001:21:2180 | if ... | UseUseExplosion.rb:21:1996:21:2180 | then ... | | UseUseExplosion.rb:21:2005:21:2009 | [post] self | UseUseExplosion.rb:21:2025:21:2029 | self | | UseUseExplosion.rb:21:2005:21:2009 | [post] self | UseUseExplosion.rb:21:2171:21:2176 | self | | UseUseExplosion.rb:21:2005:21:2009 | self | UseUseExplosion.rb:21:2025:21:2029 | self | | UseUseExplosion.rb:21:2005:21:2009 | self | UseUseExplosion.rb:21:2171:21:2176 | self | -| UseUseExplosion.rb:21:2005:21:2013 | ... > ... | UseUseExplosion.rb:21:2004:21:2014 | [false] ( ... ) | -| UseUseExplosion.rb:21:2005:21:2013 | ... > ... | UseUseExplosion.rb:21:2004:21:2014 | [true] ( ... ) | +| UseUseExplosion.rb:21:2005:21:2013 | ... > ... | UseUseExplosion.rb:21:2004:21:2014 | ( ... ) | | UseUseExplosion.rb:21:2016:21:2164 | then ... | UseUseExplosion.rb:21:2001:21:2180 | if ... | | UseUseExplosion.rb:21:2021:21:2164 | if ... | UseUseExplosion.rb:21:2016:21:2164 | then ... | | UseUseExplosion.rb:21:2025:21:2029 | [post] self | UseUseExplosion.rb:21:2045:21:2049 | self | | UseUseExplosion.rb:21:2025:21:2029 | [post] self | UseUseExplosion.rb:21:2155:21:2160 | self | | UseUseExplosion.rb:21:2025:21:2029 | self | UseUseExplosion.rb:21:2045:21:2049 | self | | UseUseExplosion.rb:21:2025:21:2029 | self | UseUseExplosion.rb:21:2155:21:2160 | self | -| UseUseExplosion.rb:21:2025:21:2033 | ... > ... | UseUseExplosion.rb:21:2024:21:2034 | [false] ( ... ) | -| UseUseExplosion.rb:21:2025:21:2033 | ... > ... | UseUseExplosion.rb:21:2024:21:2034 | [true] ( ... ) | +| UseUseExplosion.rb:21:2025:21:2033 | ... > ... | UseUseExplosion.rb:21:2024:21:2034 | ( ... ) | | UseUseExplosion.rb:21:2036:21:2148 | then ... | UseUseExplosion.rb:21:2021:21:2164 | if ... | | UseUseExplosion.rb:21:2041:21:2148 | if ... | UseUseExplosion.rb:21:2036:21:2148 | then ... | | UseUseExplosion.rb:21:2045:21:2049 | [post] self | UseUseExplosion.rb:21:2065:21:2069 | self | | UseUseExplosion.rb:21:2045:21:2049 | [post] self | UseUseExplosion.rb:21:2139:21:2144 | self | | UseUseExplosion.rb:21:2045:21:2049 | self | UseUseExplosion.rb:21:2065:21:2069 | self | | UseUseExplosion.rb:21:2045:21:2049 | self | UseUseExplosion.rb:21:2139:21:2144 | self | -| UseUseExplosion.rb:21:2045:21:2053 | ... > ... | UseUseExplosion.rb:21:2044:21:2054 | [false] ( ... ) | -| UseUseExplosion.rb:21:2045:21:2053 | ... > ... | UseUseExplosion.rb:21:2044:21:2054 | [true] ( ... ) | +| UseUseExplosion.rb:21:2045:21:2053 | ... > ... | UseUseExplosion.rb:21:2044:21:2054 | ( ... ) | | UseUseExplosion.rb:21:2056:21:2132 | then ... | UseUseExplosion.rb:21:2041:21:2148 | if ... | | UseUseExplosion.rb:21:2061:21:2132 | if ... | UseUseExplosion.rb:21:2056:21:2132 | then ... | | UseUseExplosion.rb:21:2065:21:2069 | [post] self | UseUseExplosion.rb:21:2085:21:2089 | self | | UseUseExplosion.rb:21:2065:21:2069 | [post] self | UseUseExplosion.rb:21:2123:21:2128 | self | | UseUseExplosion.rb:21:2065:21:2069 | self | UseUseExplosion.rb:21:2085:21:2089 | self | | UseUseExplosion.rb:21:2065:21:2069 | self | UseUseExplosion.rb:21:2123:21:2128 | self | -| UseUseExplosion.rb:21:2065:21:2073 | ... > ... | UseUseExplosion.rb:21:2064:21:2074 | [false] ( ... ) | -| UseUseExplosion.rb:21:2065:21:2073 | ... > ... | UseUseExplosion.rb:21:2064:21:2074 | [true] ( ... ) | +| UseUseExplosion.rb:21:2065:21:2073 | ... > ... | UseUseExplosion.rb:21:2064:21:2074 | ( ... ) | | UseUseExplosion.rb:21:2076:21:2116 | then ... | UseUseExplosion.rb:21:2061:21:2132 | if ... | | UseUseExplosion.rb:21:2081:21:2116 | if ... | UseUseExplosion.rb:21:2076:21:2116 | then ... | | UseUseExplosion.rb:21:2085:21:2089 | [post] self | UseUseExplosion.rb:21:2107:21:2112 | self | | UseUseExplosion.rb:21:2085:21:2089 | self | UseUseExplosion.rb:21:2107:21:2112 | self | -| UseUseExplosion.rb:21:2085:21:2093 | ... > ... | UseUseExplosion.rb:21:2084:21:2094 | [false] ( ... ) | -| UseUseExplosion.rb:21:2085:21:2093 | ... > ... | UseUseExplosion.rb:21:2084:21:2094 | [true] ( ... ) | +| UseUseExplosion.rb:21:2085:21:2093 | ... > ... | UseUseExplosion.rb:21:2084:21:2094 | ( ... ) | | UseUseExplosion.rb:21:2096:21:2099 | then ... | UseUseExplosion.rb:21:2081:21:2116 | if ... | | UseUseExplosion.rb:21:2102:21:2112 | else ... | UseUseExplosion.rb:21:2081:21:2116 | if ... | | UseUseExplosion.rb:21:2107:21:2112 | call to use | UseUseExplosion.rb:21:2102:21:2112 | else ... | @@ -2836,8 +2636,7 @@ | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(x) | local_dataflow.rb:134:11:134:11 | x | | local_dataflow.rb:133:8:133:13 | [post] self | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(self) | | local_dataflow.rb:133:8:133:13 | [post] self | local_dataflow.rb:133:18:133:23 | self | -| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | [false] ... \|\| ... | -| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | [true] ... \|\| ... | +| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | ... \|\| ... | | local_dataflow.rb:133:8:133:13 | self | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(self) | | local_dataflow.rb:133:8:133:13 | self | local_dataflow.rb:133:18:133:23 | self | | local_dataflow.rb:133:12:133:12 | [post] x | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(x) | @@ -2848,8 +2647,7 @@ | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(x) | local_dataflow.rb:134:11:134:11 | x | | local_dataflow.rb:133:18:133:23 | [post] self | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(self) | | local_dataflow.rb:133:18:133:23 | [post] self | local_dataflow.rb:136:7:136:12 | self | -| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | [false] ... \|\| ... | -| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | [true] ... \|\| ... | +| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | ... \|\| ... | | local_dataflow.rb:133:18:133:23 | self | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(self) | | local_dataflow.rb:133:18:133:23 | self | local_dataflow.rb:136:7:136:12 | self | | local_dataflow.rb:133:22:133:22 | [post] x | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(x) | @@ -2882,10 +2680,9 @@ | local_dataflow.rb:137:14:137:14 | [post] x | local_dataflow.rb:137:25:137:25 | x | | local_dataflow.rb:137:14:137:14 | x | local_dataflow.rb:137:10:137:15 | [input] SSA phi read(x) | | local_dataflow.rb:137:14:137:14 | x | local_dataflow.rb:137:25:137:25 | x | -| local_dataflow.rb:137:20:137:26 | [false] ! ... | local_dataflow.rb:137:10:137:26 | [false] ... && ... | +| local_dataflow.rb:137:20:137:26 | ! ... | local_dataflow.rb:137:10:137:26 | ... && ... | | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(self) | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | -| local_dataflow.rb:137:20:137:26 | [true] ! ... | local_dataflow.rb:137:10:137:26 | [true] ... && ... | | local_dataflow.rb:137:21:137:26 | [post] self | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:21:137:26 | [post] self | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:21:137:26 | self | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | @@ -2894,11 +2691,9 @@ | local_dataflow.rb:137:25:137:25 | [post] x | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | | local_dataflow.rb:137:25:137:25 | x | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | | local_dataflow.rb:137:25:137:25 | x | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | -| local_dataflow.rb:141:8:141:14 | [false] ! ... | local_dataflow.rb:141:8:141:37 | [false] ... \|\| ... | -| local_dataflow.rb:141:8:141:14 | [false] ! ... | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | +| local_dataflow.rb:141:8:141:14 | ! ... | local_dataflow.rb:141:8:141:37 | ... \|\| ... | | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(self) | | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(x) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(x) | -| local_dataflow.rb:141:8:141:14 | [true] ! ... | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | | local_dataflow.rb:141:9:141:14 | [post] self | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | | local_dataflow.rb:141:9:141:14 | [post] self | local_dataflow.rb:141:20:141:25 | self | | local_dataflow.rb:141:9:141:14 | self | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | @@ -2907,28 +2702,24 @@ | local_dataflow.rb:141:13:141:13 | [post] x | local_dataflow.rb:141:24:141:24 | x | | local_dataflow.rb:141:13:141:13 | x | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(x) | | local_dataflow.rb:141:13:141:13 | x | local_dataflow.rb:141:24:141:24 | x | -| local_dataflow.rb:141:19:141:37 | [false] ( ... ) | local_dataflow.rb:141:8:141:37 | [false] ... \|\| ... | +| local_dataflow.rb:141:19:141:37 | ( ... ) | local_dataflow.rb:141:8:141:37 | ... \|\| ... | | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(self) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(self) | | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(x) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(x) | -| local_dataflow.rb:141:19:141:37 | [post] [false] ( ... ) | local_dataflow.rb:141:20:141:36 | [post] [false] ... && ... | -| local_dataflow.rb:141:19:141:37 | [post] [true] ( ... ) | local_dataflow.rb:141:20:141:36 | [post] [true] ... && ... | -| local_dataflow.rb:141:19:141:37 | [true] ( ... ) | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | +| local_dataflow.rb:141:19:141:37 | [post] ( ... ) | local_dataflow.rb:141:20:141:36 | [post] ... && ... | | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(self) | local_dataflow.rb:143:11:143:16 | self | | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(x) | local_dataflow.rb:143:15:143:15 | x | | local_dataflow.rb:141:20:141:25 | [post] self | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(self) | | local_dataflow.rb:141:20:141:25 | [post] self | local_dataflow.rb:141:31:141:36 | self | | local_dataflow.rb:141:20:141:25 | self | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(self) | | local_dataflow.rb:141:20:141:25 | self | local_dataflow.rb:141:31:141:36 | self | -| local_dataflow.rb:141:20:141:36 | [false] ... && ... | local_dataflow.rb:141:19:141:37 | [false] ( ... ) | -| local_dataflow.rb:141:20:141:36 | [true] ... && ... | local_dataflow.rb:141:19:141:37 | [true] ( ... ) | +| local_dataflow.rb:141:20:141:36 | ... && ... | local_dataflow.rb:141:19:141:37 | ( ... ) | | local_dataflow.rb:141:24:141:24 | [post] x | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(x) | | local_dataflow.rb:141:24:141:24 | [post] x | local_dataflow.rb:141:35:141:35 | x | | local_dataflow.rb:141:24:141:24 | x | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(x) | | local_dataflow.rb:141:24:141:24 | x | local_dataflow.rb:141:35:141:35 | x | -| local_dataflow.rb:141:30:141:36 | [false] ! ... | local_dataflow.rb:141:20:141:36 | [false] ... && ... | +| local_dataflow.rb:141:30:141:36 | ! ... | local_dataflow.rb:141:20:141:36 | ... && ... | | local_dataflow.rb:141:30:141:36 | [input] SSA phi read(self) | local_dataflow.rb:143:11:143:16 | self | | local_dataflow.rb:141:30:141:36 | [input] SSA phi read(x) | local_dataflow.rb:143:15:143:15 | x | -| local_dataflow.rb:141:30:141:36 | [true] ! ... | local_dataflow.rb:141:20:141:36 | [true] ... && ... | | local_dataflow.rb:141:31:141:36 | [post] self | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(self) | | local_dataflow.rb:141:31:141:36 | [post] self | local_dataflow.rb:141:30:141:36 | [input] SSA phi read(self) | | local_dataflow.rb:141:31:141:36 | self | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(self) | @@ -2946,8 +2737,7 @@ | local_dataflow.rb:143:11:143:16 | [input] SSA phi read(x) | local_dataflow.rb:144:15:144:15 | x | | local_dataflow.rb:143:11:143:16 | [post] self | local_dataflow.rb:143:11:143:16 | [input] SSA phi read(self) | | local_dataflow.rb:143:11:143:16 | [post] self | local_dataflow.rb:143:21:143:26 | self | -| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | [false] ... \|\| ... | -| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | [true] ... \|\| ... | +| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | ... \|\| ... | | local_dataflow.rb:143:11:143:16 | self | local_dataflow.rb:143:11:143:16 | [input] SSA phi read(self) | | local_dataflow.rb:143:11:143:16 | self | local_dataflow.rb:143:21:143:26 | self | | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(self) | local_dataflow.rb:147:5:147:10 | self | @@ -2960,8 +2750,7 @@ | local_dataflow.rb:143:21:143:26 | [input] SSA phi read(x) | local_dataflow.rb:144:15:144:15 | x | | local_dataflow.rb:143:21:143:26 | [post] self | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(self) | | local_dataflow.rb:143:21:143:26 | [post] self | local_dataflow.rb:143:21:143:26 | [input] SSA phi read(self) | -| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | [false] ... \|\| ... | -| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | [true] ... \|\| ... | +| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | ... \|\| ... | | local_dataflow.rb:143:21:143:26 | self | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(self) | | local_dataflow.rb:143:21:143:26 | self | local_dataflow.rb:143:21:143:26 | [input] SSA phi read(self) | | local_dataflow.rb:143:25:143:25 | [post] x | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(x) | diff --git a/ruby/ql/test/library-tests/dataflow/local/Nodes.expected b/ruby/ql/test/library-tests/dataflow/local/Nodes.expected index 18ce6eca2c53..3f13439012e9 100644 --- a/ruby/ql/test/library-tests/dataflow/local/Nodes.expected +++ b/ruby/ql/test/library-tests/dataflow/local/Nodes.expected @@ -1235,8 +1235,7 @@ arg | local_dataflow.rb:9:12:9:12 | 2 | local_dataflow.rb:9:9:9:15 | call to [] | position 1 | | local_dataflow.rb:9:14:9:14 | 3 | local_dataflow.rb:9:9:9:15 | call to [] | position 2 | | local_dataflow.rb:10:5:13:3 | { ... } | local_dataflow.rb:10:5:13:3 | call to each | block | -| local_dataflow.rb:10:9:10:9 | defined? ... | local_dataflow.rb:10:9:10:9 | [false] ! ... | self | -| local_dataflow.rb:10:9:10:9 | defined? ... | local_dataflow.rb:10:9:10:9 | [true] ! ... | self | +| local_dataflow.rb:10:9:10:9 | defined? ... | local_dataflow.rb:10:9:10:9 | ! ... | self | | local_dataflow.rb:10:9:10:9 | x | local_dataflow.rb:10:9:10:9 | defined? ... | self | | local_dataflow.rb:10:14:10:18 | array | local_dataflow.rb:10:5:13:3 | call to each | self | | local_dataflow.rb:11:1:11:2 | self | local_dataflow.rb:11:1:11:2 | call to do | self | @@ -1244,13 +1243,11 @@ arg | local_dataflow.rb:12:3:12:5 | synthetic splat argument | local_dataflow.rb:12:3:12:5 | call to p | synthetic * | | local_dataflow.rb:12:5:12:5 | x | local_dataflow.rb:12:3:12:5 | call to p | position 0 | | local_dataflow.rb:15:1:17:3 | { ... } | local_dataflow.rb:15:1:17:3 | call to each | block | -| local_dataflow.rb:15:5:15:5 | defined? ... | local_dataflow.rb:15:5:15:5 | [false] ! ... | self | -| local_dataflow.rb:15:5:15:5 | defined? ... | local_dataflow.rb:15:5:15:5 | [true] ! ... | self | +| local_dataflow.rb:15:5:15:5 | defined? ... | local_dataflow.rb:15:5:15:5 | ! ... | self | | local_dataflow.rb:15:5:15:5 | x | local_dataflow.rb:15:5:15:5 | defined? ... | self | | local_dataflow.rb:15:10:15:14 | array | local_dataflow.rb:15:1:17:3 | call to each | self | | local_dataflow.rb:19:1:21:3 | { ... } | local_dataflow.rb:19:1:21:3 | call to each | block | -| local_dataflow.rb:19:5:19:5 | defined? ... | local_dataflow.rb:19:5:19:5 | [false] ! ... | self | -| local_dataflow.rb:19:5:19:5 | defined? ... | local_dataflow.rb:19:5:19:5 | [true] ! ... | self | +| local_dataflow.rb:19:5:19:5 | defined? ... | local_dataflow.rb:19:5:19:5 | ! ... | self | | local_dataflow.rb:19:5:19:5 | x | local_dataflow.rb:19:5:19:5 | defined? ... | self | | local_dataflow.rb:19:10:19:14 | array | local_dataflow.rb:19:1:21:3 | call to each | self | | local_dataflow.rb:20:6:20:6 | x | local_dataflow.rb:20:6:20:10 | ... > ... | self | @@ -1446,15 +1443,12 @@ arg | local_dataflow.rb:132:6:132:11 | self | local_dataflow.rb:132:6:132:11 | call to use | self | | local_dataflow.rb:132:6:132:11 | synthetic splat argument | local_dataflow.rb:132:6:132:11 | call to use | synthetic * | | local_dataflow.rb:132:10:132:10 | x | local_dataflow.rb:132:6:132:11 | call to use | position 0 | -| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | [false] ... \|\| ... | self | -| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | [true] ... \|\| ... | self | +| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | ... \|\| ... | self | | local_dataflow.rb:133:8:133:13 | self | local_dataflow.rb:133:8:133:13 | call to use | self | | local_dataflow.rb:133:8:133:13 | synthetic splat argument | local_dataflow.rb:133:8:133:13 | call to use | synthetic * | -| local_dataflow.rb:133:8:133:23 | synthetic splat argument | local_dataflow.rb:133:8:133:23 | [false] ... \|\| ... | synthetic * | -| local_dataflow.rb:133:8:133:23 | synthetic splat argument | local_dataflow.rb:133:8:133:23 | [true] ... \|\| ... | synthetic * | +| local_dataflow.rb:133:8:133:23 | synthetic splat argument | local_dataflow.rb:133:8:133:23 | ... \|\| ... | synthetic * | | local_dataflow.rb:133:12:133:12 | x | local_dataflow.rb:133:8:133:13 | call to use | position 0 | -| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | [false] ... \|\| ... | position 0 | -| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | [true] ... \|\| ... | position 0 | +| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | ... \|\| ... | position 0 | | local_dataflow.rb:133:18:133:23 | self | local_dataflow.rb:133:18:133:23 | call to use | self | | local_dataflow.rb:133:18:133:23 | synthetic splat argument | local_dataflow.rb:133:18:133:23 | call to use | synthetic * | | local_dataflow.rb:133:22:133:22 | x | local_dataflow.rb:133:18:133:23 | call to use | position 0 | @@ -1464,55 +1458,39 @@ arg | local_dataflow.rb:136:7:136:12 | self | local_dataflow.rb:136:7:136:12 | call to use | self | | local_dataflow.rb:136:7:136:12 | synthetic splat argument | local_dataflow.rb:136:7:136:12 | call to use | synthetic * | | local_dataflow.rb:136:11:136:11 | x | local_dataflow.rb:136:7:136:12 | call to use | position 0 | -| local_dataflow.rb:137:10:137:15 | call to use | local_dataflow.rb:137:10:137:26 | [false] ... && ... | self | -| local_dataflow.rb:137:10:137:15 | call to use | local_dataflow.rb:137:10:137:26 | [true] ... && ... | self | +| local_dataflow.rb:137:10:137:15 | call to use | local_dataflow.rb:137:10:137:26 | ... && ... | self | | local_dataflow.rb:137:10:137:15 | self | local_dataflow.rb:137:10:137:15 | call to use | self | | local_dataflow.rb:137:10:137:15 | synthetic splat argument | local_dataflow.rb:137:10:137:15 | call to use | synthetic * | -| local_dataflow.rb:137:10:137:26 | synthetic splat argument | local_dataflow.rb:137:10:137:26 | [false] ... && ... | synthetic * | -| local_dataflow.rb:137:10:137:26 | synthetic splat argument | local_dataflow.rb:137:10:137:26 | [true] ... && ... | synthetic * | +| local_dataflow.rb:137:10:137:26 | synthetic splat argument | local_dataflow.rb:137:10:137:26 | ... && ... | synthetic * | | local_dataflow.rb:137:14:137:14 | x | local_dataflow.rb:137:10:137:15 | call to use | position 0 | -| local_dataflow.rb:137:20:137:26 | [false] ! ... | local_dataflow.rb:137:10:137:26 | [false] ... && ... | position 0 | -| local_dataflow.rb:137:20:137:26 | [true] ! ... | local_dataflow.rb:137:10:137:26 | [true] ... && ... | position 0 | -| local_dataflow.rb:137:21:137:26 | call to use | local_dataflow.rb:137:20:137:26 | [false] ! ... | self | -| local_dataflow.rb:137:21:137:26 | call to use | local_dataflow.rb:137:20:137:26 | [true] ! ... | self | +| local_dataflow.rb:137:20:137:26 | ! ... | local_dataflow.rb:137:10:137:26 | ... && ... | position 0 | +| local_dataflow.rb:137:21:137:26 | call to use | local_dataflow.rb:137:20:137:26 | ! ... | self | | local_dataflow.rb:137:21:137:26 | self | local_dataflow.rb:137:21:137:26 | call to use | self | | local_dataflow.rb:137:21:137:26 | synthetic splat argument | local_dataflow.rb:137:21:137:26 | call to use | synthetic * | | local_dataflow.rb:137:25:137:25 | x | local_dataflow.rb:137:21:137:26 | call to use | position 0 | -| local_dataflow.rb:141:8:141:14 | [false] ! ... | local_dataflow.rb:141:8:141:37 | [false] ... \|\| ... | self | -| local_dataflow.rb:141:8:141:14 | [false] ! ... | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | self | -| local_dataflow.rb:141:8:141:14 | [true] ! ... | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | self | -| local_dataflow.rb:141:8:141:37 | synthetic splat argument | local_dataflow.rb:141:8:141:37 | [false] ... \|\| ... | synthetic * | -| local_dataflow.rb:141:8:141:37 | synthetic splat argument | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | synthetic * | -| local_dataflow.rb:141:9:141:14 | call to use | local_dataflow.rb:141:8:141:14 | [false] ! ... | self | -| local_dataflow.rb:141:9:141:14 | call to use | local_dataflow.rb:141:8:141:14 | [true] ! ... | self | +| local_dataflow.rb:141:8:141:14 | ! ... | local_dataflow.rb:141:8:141:37 | ... \|\| ... | self | +| local_dataflow.rb:141:8:141:37 | synthetic splat argument | local_dataflow.rb:141:8:141:37 | ... \|\| ... | synthetic * | +| local_dataflow.rb:141:9:141:14 | call to use | local_dataflow.rb:141:8:141:14 | ! ... | self | | local_dataflow.rb:141:9:141:14 | self | local_dataflow.rb:141:9:141:14 | call to use | self | | local_dataflow.rb:141:9:141:14 | synthetic splat argument | local_dataflow.rb:141:9:141:14 | call to use | synthetic * | | local_dataflow.rb:141:13:141:13 | x | local_dataflow.rb:141:9:141:14 | call to use | position 0 | -| local_dataflow.rb:141:19:141:37 | [false] ( ... ) | local_dataflow.rb:141:8:141:37 | [false] ... \|\| ... | position 0 | -| local_dataflow.rb:141:19:141:37 | [true] ( ... ) | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | position 0 | -| local_dataflow.rb:141:20:141:25 | call to use | local_dataflow.rb:141:20:141:36 | [false] ... && ... | self | -| local_dataflow.rb:141:20:141:25 | call to use | local_dataflow.rb:141:20:141:36 | [true] ... && ... | self | +| local_dataflow.rb:141:19:141:37 | ( ... ) | local_dataflow.rb:141:8:141:37 | ... \|\| ... | position 0 | +| local_dataflow.rb:141:20:141:25 | call to use | local_dataflow.rb:141:20:141:36 | ... && ... | self | | local_dataflow.rb:141:20:141:25 | self | local_dataflow.rb:141:20:141:25 | call to use | self | | local_dataflow.rb:141:20:141:25 | synthetic splat argument | local_dataflow.rb:141:20:141:25 | call to use | synthetic * | -| local_dataflow.rb:141:20:141:36 | synthetic splat argument | local_dataflow.rb:141:20:141:36 | [false] ... && ... | synthetic * | -| local_dataflow.rb:141:20:141:36 | synthetic splat argument | local_dataflow.rb:141:20:141:36 | [true] ... && ... | synthetic * | +| local_dataflow.rb:141:20:141:36 | synthetic splat argument | local_dataflow.rb:141:20:141:36 | ... && ... | synthetic * | | local_dataflow.rb:141:24:141:24 | x | local_dataflow.rb:141:20:141:25 | call to use | position 0 | -| local_dataflow.rb:141:30:141:36 | [false] ! ... | local_dataflow.rb:141:20:141:36 | [false] ... && ... | position 0 | -| local_dataflow.rb:141:30:141:36 | [true] ! ... | local_dataflow.rb:141:20:141:36 | [true] ... && ... | position 0 | -| local_dataflow.rb:141:31:141:36 | call to use | local_dataflow.rb:141:30:141:36 | [false] ! ... | self | -| local_dataflow.rb:141:31:141:36 | call to use | local_dataflow.rb:141:30:141:36 | [true] ! ... | self | +| local_dataflow.rb:141:30:141:36 | ! ... | local_dataflow.rb:141:20:141:36 | ... && ... | position 0 | +| local_dataflow.rb:141:31:141:36 | call to use | local_dataflow.rb:141:30:141:36 | ! ... | self | | local_dataflow.rb:141:31:141:36 | self | local_dataflow.rb:141:31:141:36 | call to use | self | | local_dataflow.rb:141:31:141:36 | synthetic splat argument | local_dataflow.rb:141:31:141:36 | call to use | synthetic * | | local_dataflow.rb:141:35:141:35 | x | local_dataflow.rb:141:31:141:36 | call to use | position 0 | -| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | [false] ... \|\| ... | self | -| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | [true] ... \|\| ... | self | +| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | ... \|\| ... | self | | local_dataflow.rb:143:11:143:16 | self | local_dataflow.rb:143:11:143:16 | call to use | self | | local_dataflow.rb:143:11:143:16 | synthetic splat argument | local_dataflow.rb:143:11:143:16 | call to use | synthetic * | -| local_dataflow.rb:143:11:143:26 | synthetic splat argument | local_dataflow.rb:143:11:143:26 | [false] ... \|\| ... | synthetic * | -| local_dataflow.rb:143:11:143:26 | synthetic splat argument | local_dataflow.rb:143:11:143:26 | [true] ... \|\| ... | synthetic * | +| local_dataflow.rb:143:11:143:26 | synthetic splat argument | local_dataflow.rb:143:11:143:26 | ... \|\| ... | synthetic * | | local_dataflow.rb:143:15:143:15 | x | local_dataflow.rb:143:11:143:16 | call to use | position 0 | -| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | [false] ... \|\| ... | position 0 | -| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | [true] ... \|\| ... | position 0 | +| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | ... \|\| ... | position 0 | | local_dataflow.rb:143:21:143:26 | self | local_dataflow.rb:143:21:143:26 | call to use | self | | local_dataflow.rb:143:21:143:26 | synthetic splat argument | local_dataflow.rb:143:21:143:26 | call to use | synthetic * | | local_dataflow.rb:143:25:143:25 | x | local_dataflow.rb:143:21:143:26 | call to use | position 0 | diff --git a/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected index 028746bbcdca..c81cd6fc0646 100644 --- a/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected +++ b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected @@ -208,8 +208,7 @@ | UseUseExplosion.rb:20:13:20:17 | [post] self | UseUseExplosion.rb:20:3691:20:3696 | self | | UseUseExplosion.rb:20:13:20:17 | self | UseUseExplosion.rb:20:35:20:39 | self | | UseUseExplosion.rb:20:13:20:17 | self | UseUseExplosion.rb:20:3691:20:3696 | self | -| UseUseExplosion.rb:20:13:20:23 | ... > ... | UseUseExplosion.rb:20:12:20:24 | [false] ( ... ) | -| UseUseExplosion.rb:20:13:20:23 | ... > ... | UseUseExplosion.rb:20:12:20:24 | [true] ( ... ) | +| UseUseExplosion.rb:20:13:20:23 | ... > ... | UseUseExplosion.rb:20:12:20:24 | ( ... ) | | UseUseExplosion.rb:20:21:20:23 | 100 | UseUseExplosion.rb:20:13:20:23 | ... > ... | | UseUseExplosion.rb:20:26:20:3684 | then ... | UseUseExplosion.rb:20:9:20:3700 | if ... | | UseUseExplosion.rb:20:31:20:3684 | if ... | UseUseExplosion.rb:20:26:20:3684 | then ... | @@ -218,8 +217,7 @@ | UseUseExplosion.rb:20:35:20:39 | [post] self | UseUseExplosion.rb:20:3675:20:3680 | self | | UseUseExplosion.rb:20:35:20:39 | self | UseUseExplosion.rb:20:56:20:60 | self | | UseUseExplosion.rb:20:35:20:39 | self | UseUseExplosion.rb:20:3675:20:3680 | self | -| UseUseExplosion.rb:20:35:20:44 | ... > ... | UseUseExplosion.rb:20:34:20:45 | [false] ( ... ) | -| UseUseExplosion.rb:20:35:20:44 | ... > ... | UseUseExplosion.rb:20:34:20:45 | [true] ( ... ) | +| UseUseExplosion.rb:20:35:20:44 | ... > ... | UseUseExplosion.rb:20:34:20:45 | ( ... ) | | UseUseExplosion.rb:20:43:20:44 | 99 | UseUseExplosion.rb:20:35:20:44 | ... > ... | | UseUseExplosion.rb:20:47:20:3668 | then ... | UseUseExplosion.rb:20:31:20:3684 | if ... | | UseUseExplosion.rb:20:52:20:3668 | if ... | UseUseExplosion.rb:20:47:20:3668 | then ... | @@ -228,8 +226,7 @@ | UseUseExplosion.rb:20:56:20:60 | [post] self | UseUseExplosion.rb:20:3659:20:3664 | self | | UseUseExplosion.rb:20:56:20:60 | self | UseUseExplosion.rb:20:77:20:81 | self | | UseUseExplosion.rb:20:56:20:60 | self | UseUseExplosion.rb:20:3659:20:3664 | self | -| UseUseExplosion.rb:20:56:20:65 | ... > ... | UseUseExplosion.rb:20:55:20:66 | [false] ( ... ) | -| UseUseExplosion.rb:20:56:20:65 | ... > ... | UseUseExplosion.rb:20:55:20:66 | [true] ( ... ) | +| UseUseExplosion.rb:20:56:20:65 | ... > ... | UseUseExplosion.rb:20:55:20:66 | ( ... ) | | UseUseExplosion.rb:20:64:20:65 | 98 | UseUseExplosion.rb:20:56:20:65 | ... > ... | | UseUseExplosion.rb:20:68:20:3652 | then ... | UseUseExplosion.rb:20:52:20:3668 | if ... | | UseUseExplosion.rb:20:73:20:3652 | if ... | UseUseExplosion.rb:20:68:20:3652 | then ... | @@ -238,8 +235,7 @@ | UseUseExplosion.rb:20:77:20:81 | [post] self | UseUseExplosion.rb:20:3643:20:3648 | self | | UseUseExplosion.rb:20:77:20:81 | self | UseUseExplosion.rb:20:98:20:102 | self | | UseUseExplosion.rb:20:77:20:81 | self | UseUseExplosion.rb:20:3643:20:3648 | self | -| UseUseExplosion.rb:20:77:20:86 | ... > ... | UseUseExplosion.rb:20:76:20:87 | [false] ( ... ) | -| UseUseExplosion.rb:20:77:20:86 | ... > ... | UseUseExplosion.rb:20:76:20:87 | [true] ( ... ) | +| UseUseExplosion.rb:20:77:20:86 | ... > ... | UseUseExplosion.rb:20:76:20:87 | ( ... ) | | UseUseExplosion.rb:20:85:20:86 | 97 | UseUseExplosion.rb:20:77:20:86 | ... > ... | | UseUseExplosion.rb:20:89:20:3636 | then ... | UseUseExplosion.rb:20:73:20:3652 | if ... | | UseUseExplosion.rb:20:94:20:3636 | if ... | UseUseExplosion.rb:20:89:20:3636 | then ... | @@ -248,8 +244,7 @@ | UseUseExplosion.rb:20:98:20:102 | [post] self | UseUseExplosion.rb:20:3627:20:3632 | self | | UseUseExplosion.rb:20:98:20:102 | self | UseUseExplosion.rb:20:119:20:123 | self | | UseUseExplosion.rb:20:98:20:102 | self | UseUseExplosion.rb:20:3627:20:3632 | self | -| UseUseExplosion.rb:20:98:20:107 | ... > ... | UseUseExplosion.rb:20:97:20:108 | [false] ( ... ) | -| UseUseExplosion.rb:20:98:20:107 | ... > ... | UseUseExplosion.rb:20:97:20:108 | [true] ( ... ) | +| UseUseExplosion.rb:20:98:20:107 | ... > ... | UseUseExplosion.rb:20:97:20:108 | ( ... ) | | UseUseExplosion.rb:20:106:20:107 | 96 | UseUseExplosion.rb:20:98:20:107 | ... > ... | | UseUseExplosion.rb:20:110:20:3620 | then ... | UseUseExplosion.rb:20:94:20:3636 | if ... | | UseUseExplosion.rb:20:115:20:3620 | if ... | UseUseExplosion.rb:20:110:20:3620 | then ... | @@ -258,8 +253,7 @@ | UseUseExplosion.rb:20:119:20:123 | [post] self | UseUseExplosion.rb:20:3611:20:3616 | self | | UseUseExplosion.rb:20:119:20:123 | self | UseUseExplosion.rb:20:140:20:144 | self | | UseUseExplosion.rb:20:119:20:123 | self | UseUseExplosion.rb:20:3611:20:3616 | self | -| UseUseExplosion.rb:20:119:20:128 | ... > ... | UseUseExplosion.rb:20:118:20:129 | [false] ( ... ) | -| UseUseExplosion.rb:20:119:20:128 | ... > ... | UseUseExplosion.rb:20:118:20:129 | [true] ( ... ) | +| UseUseExplosion.rb:20:119:20:128 | ... > ... | UseUseExplosion.rb:20:118:20:129 | ( ... ) | | UseUseExplosion.rb:20:127:20:128 | 95 | UseUseExplosion.rb:20:119:20:128 | ... > ... | | UseUseExplosion.rb:20:131:20:3604 | then ... | UseUseExplosion.rb:20:115:20:3620 | if ... | | UseUseExplosion.rb:20:136:20:3604 | if ... | UseUseExplosion.rb:20:131:20:3604 | then ... | @@ -268,8 +262,7 @@ | UseUseExplosion.rb:20:140:20:144 | [post] self | UseUseExplosion.rb:20:3595:20:3600 | self | | UseUseExplosion.rb:20:140:20:144 | self | UseUseExplosion.rb:20:161:20:165 | self | | UseUseExplosion.rb:20:140:20:144 | self | UseUseExplosion.rb:20:3595:20:3600 | self | -| UseUseExplosion.rb:20:140:20:149 | ... > ... | UseUseExplosion.rb:20:139:20:150 | [false] ( ... ) | -| UseUseExplosion.rb:20:140:20:149 | ... > ... | UseUseExplosion.rb:20:139:20:150 | [true] ( ... ) | +| UseUseExplosion.rb:20:140:20:149 | ... > ... | UseUseExplosion.rb:20:139:20:150 | ( ... ) | | UseUseExplosion.rb:20:148:20:149 | 94 | UseUseExplosion.rb:20:140:20:149 | ... > ... | | UseUseExplosion.rb:20:152:20:3588 | then ... | UseUseExplosion.rb:20:136:20:3604 | if ... | | UseUseExplosion.rb:20:157:20:3588 | if ... | UseUseExplosion.rb:20:152:20:3588 | then ... | @@ -278,8 +271,7 @@ | UseUseExplosion.rb:20:161:20:165 | [post] self | UseUseExplosion.rb:20:3579:20:3584 | self | | UseUseExplosion.rb:20:161:20:165 | self | UseUseExplosion.rb:20:182:20:186 | self | | UseUseExplosion.rb:20:161:20:165 | self | UseUseExplosion.rb:20:3579:20:3584 | self | -| UseUseExplosion.rb:20:161:20:170 | ... > ... | UseUseExplosion.rb:20:160:20:171 | [false] ( ... ) | -| UseUseExplosion.rb:20:161:20:170 | ... > ... | UseUseExplosion.rb:20:160:20:171 | [true] ( ... ) | +| UseUseExplosion.rb:20:161:20:170 | ... > ... | UseUseExplosion.rb:20:160:20:171 | ( ... ) | | UseUseExplosion.rb:20:169:20:170 | 93 | UseUseExplosion.rb:20:161:20:170 | ... > ... | | UseUseExplosion.rb:20:173:20:3572 | then ... | UseUseExplosion.rb:20:157:20:3588 | if ... | | UseUseExplosion.rb:20:178:20:3572 | if ... | UseUseExplosion.rb:20:173:20:3572 | then ... | @@ -288,8 +280,7 @@ | UseUseExplosion.rb:20:182:20:186 | [post] self | UseUseExplosion.rb:20:3563:20:3568 | self | | UseUseExplosion.rb:20:182:20:186 | self | UseUseExplosion.rb:20:203:20:207 | self | | UseUseExplosion.rb:20:182:20:186 | self | UseUseExplosion.rb:20:3563:20:3568 | self | -| UseUseExplosion.rb:20:182:20:191 | ... > ... | UseUseExplosion.rb:20:181:20:192 | [false] ( ... ) | -| UseUseExplosion.rb:20:182:20:191 | ... > ... | UseUseExplosion.rb:20:181:20:192 | [true] ( ... ) | +| UseUseExplosion.rb:20:182:20:191 | ... > ... | UseUseExplosion.rb:20:181:20:192 | ( ... ) | | UseUseExplosion.rb:20:190:20:191 | 92 | UseUseExplosion.rb:20:182:20:191 | ... > ... | | UseUseExplosion.rb:20:194:20:3556 | then ... | UseUseExplosion.rb:20:178:20:3572 | if ... | | UseUseExplosion.rb:20:199:20:3556 | if ... | UseUseExplosion.rb:20:194:20:3556 | then ... | @@ -298,8 +289,7 @@ | UseUseExplosion.rb:20:203:20:207 | [post] self | UseUseExplosion.rb:20:3547:20:3552 | self | | UseUseExplosion.rb:20:203:20:207 | self | UseUseExplosion.rb:20:224:20:228 | self | | UseUseExplosion.rb:20:203:20:207 | self | UseUseExplosion.rb:20:3547:20:3552 | self | -| UseUseExplosion.rb:20:203:20:212 | ... > ... | UseUseExplosion.rb:20:202:20:213 | [false] ( ... ) | -| UseUseExplosion.rb:20:203:20:212 | ... > ... | UseUseExplosion.rb:20:202:20:213 | [true] ( ... ) | +| UseUseExplosion.rb:20:203:20:212 | ... > ... | UseUseExplosion.rb:20:202:20:213 | ( ... ) | | UseUseExplosion.rb:20:211:20:212 | 91 | UseUseExplosion.rb:20:203:20:212 | ... > ... | | UseUseExplosion.rb:20:215:20:3540 | then ... | UseUseExplosion.rb:20:199:20:3556 | if ... | | UseUseExplosion.rb:20:220:20:3540 | if ... | UseUseExplosion.rb:20:215:20:3540 | then ... | @@ -308,8 +298,7 @@ | UseUseExplosion.rb:20:224:20:228 | [post] self | UseUseExplosion.rb:20:3531:20:3536 | self | | UseUseExplosion.rb:20:224:20:228 | self | UseUseExplosion.rb:20:245:20:249 | self | | UseUseExplosion.rb:20:224:20:228 | self | UseUseExplosion.rb:20:3531:20:3536 | self | -| UseUseExplosion.rb:20:224:20:233 | ... > ... | UseUseExplosion.rb:20:223:20:234 | [false] ( ... ) | -| UseUseExplosion.rb:20:224:20:233 | ... > ... | UseUseExplosion.rb:20:223:20:234 | [true] ( ... ) | +| UseUseExplosion.rb:20:224:20:233 | ... > ... | UseUseExplosion.rb:20:223:20:234 | ( ... ) | | UseUseExplosion.rb:20:232:20:233 | 90 | UseUseExplosion.rb:20:224:20:233 | ... > ... | | UseUseExplosion.rb:20:236:20:3524 | then ... | UseUseExplosion.rb:20:220:20:3540 | if ... | | UseUseExplosion.rb:20:241:20:3524 | if ... | UseUseExplosion.rb:20:236:20:3524 | then ... | @@ -318,8 +307,7 @@ | UseUseExplosion.rb:20:245:20:249 | [post] self | UseUseExplosion.rb:20:3515:20:3520 | self | | UseUseExplosion.rb:20:245:20:249 | self | UseUseExplosion.rb:20:266:20:270 | self | | UseUseExplosion.rb:20:245:20:249 | self | UseUseExplosion.rb:20:3515:20:3520 | self | -| UseUseExplosion.rb:20:245:20:254 | ... > ... | UseUseExplosion.rb:20:244:20:255 | [false] ( ... ) | -| UseUseExplosion.rb:20:245:20:254 | ... > ... | UseUseExplosion.rb:20:244:20:255 | [true] ( ... ) | +| UseUseExplosion.rb:20:245:20:254 | ... > ... | UseUseExplosion.rb:20:244:20:255 | ( ... ) | | UseUseExplosion.rb:20:253:20:254 | 89 | UseUseExplosion.rb:20:245:20:254 | ... > ... | | UseUseExplosion.rb:20:257:20:3508 | then ... | UseUseExplosion.rb:20:241:20:3524 | if ... | | UseUseExplosion.rb:20:262:20:3508 | if ... | UseUseExplosion.rb:20:257:20:3508 | then ... | @@ -328,8 +316,7 @@ | UseUseExplosion.rb:20:266:20:270 | [post] self | UseUseExplosion.rb:20:3499:20:3504 | self | | UseUseExplosion.rb:20:266:20:270 | self | UseUseExplosion.rb:20:287:20:291 | self | | UseUseExplosion.rb:20:266:20:270 | self | UseUseExplosion.rb:20:3499:20:3504 | self | -| UseUseExplosion.rb:20:266:20:275 | ... > ... | UseUseExplosion.rb:20:265:20:276 | [false] ( ... ) | -| UseUseExplosion.rb:20:266:20:275 | ... > ... | UseUseExplosion.rb:20:265:20:276 | [true] ( ... ) | +| UseUseExplosion.rb:20:266:20:275 | ... > ... | UseUseExplosion.rb:20:265:20:276 | ( ... ) | | UseUseExplosion.rb:20:274:20:275 | 88 | UseUseExplosion.rb:20:266:20:275 | ... > ... | | UseUseExplosion.rb:20:278:20:3492 | then ... | UseUseExplosion.rb:20:262:20:3508 | if ... | | UseUseExplosion.rb:20:283:20:3492 | if ... | UseUseExplosion.rb:20:278:20:3492 | then ... | @@ -338,8 +325,7 @@ | UseUseExplosion.rb:20:287:20:291 | [post] self | UseUseExplosion.rb:20:3483:20:3488 | self | | UseUseExplosion.rb:20:287:20:291 | self | UseUseExplosion.rb:20:308:20:312 | self | | UseUseExplosion.rb:20:287:20:291 | self | UseUseExplosion.rb:20:3483:20:3488 | self | -| UseUseExplosion.rb:20:287:20:296 | ... > ... | UseUseExplosion.rb:20:286:20:297 | [false] ( ... ) | -| UseUseExplosion.rb:20:287:20:296 | ... > ... | UseUseExplosion.rb:20:286:20:297 | [true] ( ... ) | +| UseUseExplosion.rb:20:287:20:296 | ... > ... | UseUseExplosion.rb:20:286:20:297 | ( ... ) | | UseUseExplosion.rb:20:295:20:296 | 87 | UseUseExplosion.rb:20:287:20:296 | ... > ... | | UseUseExplosion.rb:20:299:20:3476 | then ... | UseUseExplosion.rb:20:283:20:3492 | if ... | | UseUseExplosion.rb:20:304:20:3476 | if ... | UseUseExplosion.rb:20:299:20:3476 | then ... | @@ -348,8 +334,7 @@ | UseUseExplosion.rb:20:308:20:312 | [post] self | UseUseExplosion.rb:20:3467:20:3472 | self | | UseUseExplosion.rb:20:308:20:312 | self | UseUseExplosion.rb:20:329:20:333 | self | | UseUseExplosion.rb:20:308:20:312 | self | UseUseExplosion.rb:20:3467:20:3472 | self | -| UseUseExplosion.rb:20:308:20:317 | ... > ... | UseUseExplosion.rb:20:307:20:318 | [false] ( ... ) | -| UseUseExplosion.rb:20:308:20:317 | ... > ... | UseUseExplosion.rb:20:307:20:318 | [true] ( ... ) | +| UseUseExplosion.rb:20:308:20:317 | ... > ... | UseUseExplosion.rb:20:307:20:318 | ( ... ) | | UseUseExplosion.rb:20:316:20:317 | 86 | UseUseExplosion.rb:20:308:20:317 | ... > ... | | UseUseExplosion.rb:20:320:20:3460 | then ... | UseUseExplosion.rb:20:304:20:3476 | if ... | | UseUseExplosion.rb:20:325:20:3460 | if ... | UseUseExplosion.rb:20:320:20:3460 | then ... | @@ -358,8 +343,7 @@ | UseUseExplosion.rb:20:329:20:333 | [post] self | UseUseExplosion.rb:20:3451:20:3456 | self | | UseUseExplosion.rb:20:329:20:333 | self | UseUseExplosion.rb:20:350:20:354 | self | | UseUseExplosion.rb:20:329:20:333 | self | UseUseExplosion.rb:20:3451:20:3456 | self | -| UseUseExplosion.rb:20:329:20:338 | ... > ... | UseUseExplosion.rb:20:328:20:339 | [false] ( ... ) | -| UseUseExplosion.rb:20:329:20:338 | ... > ... | UseUseExplosion.rb:20:328:20:339 | [true] ( ... ) | +| UseUseExplosion.rb:20:329:20:338 | ... > ... | UseUseExplosion.rb:20:328:20:339 | ( ... ) | | UseUseExplosion.rb:20:337:20:338 | 85 | UseUseExplosion.rb:20:329:20:338 | ... > ... | | UseUseExplosion.rb:20:341:20:3444 | then ... | UseUseExplosion.rb:20:325:20:3460 | if ... | | UseUseExplosion.rb:20:346:20:3444 | if ... | UseUseExplosion.rb:20:341:20:3444 | then ... | @@ -368,8 +352,7 @@ | UseUseExplosion.rb:20:350:20:354 | [post] self | UseUseExplosion.rb:20:3435:20:3440 | self | | UseUseExplosion.rb:20:350:20:354 | self | UseUseExplosion.rb:20:371:20:375 | self | | UseUseExplosion.rb:20:350:20:354 | self | UseUseExplosion.rb:20:3435:20:3440 | self | -| UseUseExplosion.rb:20:350:20:359 | ... > ... | UseUseExplosion.rb:20:349:20:360 | [false] ( ... ) | -| UseUseExplosion.rb:20:350:20:359 | ... > ... | UseUseExplosion.rb:20:349:20:360 | [true] ( ... ) | +| UseUseExplosion.rb:20:350:20:359 | ... > ... | UseUseExplosion.rb:20:349:20:360 | ( ... ) | | UseUseExplosion.rb:20:358:20:359 | 84 | UseUseExplosion.rb:20:350:20:359 | ... > ... | | UseUseExplosion.rb:20:362:20:3428 | then ... | UseUseExplosion.rb:20:346:20:3444 | if ... | | UseUseExplosion.rb:20:367:20:3428 | if ... | UseUseExplosion.rb:20:362:20:3428 | then ... | @@ -378,8 +361,7 @@ | UseUseExplosion.rb:20:371:20:375 | [post] self | UseUseExplosion.rb:20:3419:20:3424 | self | | UseUseExplosion.rb:20:371:20:375 | self | UseUseExplosion.rb:20:392:20:396 | self | | UseUseExplosion.rb:20:371:20:375 | self | UseUseExplosion.rb:20:3419:20:3424 | self | -| UseUseExplosion.rb:20:371:20:380 | ... > ... | UseUseExplosion.rb:20:370:20:381 | [false] ( ... ) | -| UseUseExplosion.rb:20:371:20:380 | ... > ... | UseUseExplosion.rb:20:370:20:381 | [true] ( ... ) | +| UseUseExplosion.rb:20:371:20:380 | ... > ... | UseUseExplosion.rb:20:370:20:381 | ( ... ) | | UseUseExplosion.rb:20:379:20:380 | 83 | UseUseExplosion.rb:20:371:20:380 | ... > ... | | UseUseExplosion.rb:20:383:20:3412 | then ... | UseUseExplosion.rb:20:367:20:3428 | if ... | | UseUseExplosion.rb:20:388:20:3412 | if ... | UseUseExplosion.rb:20:383:20:3412 | then ... | @@ -388,8 +370,7 @@ | UseUseExplosion.rb:20:392:20:396 | [post] self | UseUseExplosion.rb:20:3403:20:3408 | self | | UseUseExplosion.rb:20:392:20:396 | self | UseUseExplosion.rb:20:413:20:417 | self | | UseUseExplosion.rb:20:392:20:396 | self | UseUseExplosion.rb:20:3403:20:3408 | self | -| UseUseExplosion.rb:20:392:20:401 | ... > ... | UseUseExplosion.rb:20:391:20:402 | [false] ( ... ) | -| UseUseExplosion.rb:20:392:20:401 | ... > ... | UseUseExplosion.rb:20:391:20:402 | [true] ( ... ) | +| UseUseExplosion.rb:20:392:20:401 | ... > ... | UseUseExplosion.rb:20:391:20:402 | ( ... ) | | UseUseExplosion.rb:20:400:20:401 | 82 | UseUseExplosion.rb:20:392:20:401 | ... > ... | | UseUseExplosion.rb:20:404:20:3396 | then ... | UseUseExplosion.rb:20:388:20:3412 | if ... | | UseUseExplosion.rb:20:409:20:3396 | if ... | UseUseExplosion.rb:20:404:20:3396 | then ... | @@ -398,8 +379,7 @@ | UseUseExplosion.rb:20:413:20:417 | [post] self | UseUseExplosion.rb:20:3387:20:3392 | self | | UseUseExplosion.rb:20:413:20:417 | self | UseUseExplosion.rb:20:434:20:438 | self | | UseUseExplosion.rb:20:413:20:417 | self | UseUseExplosion.rb:20:3387:20:3392 | self | -| UseUseExplosion.rb:20:413:20:422 | ... > ... | UseUseExplosion.rb:20:412:20:423 | [false] ( ... ) | -| UseUseExplosion.rb:20:413:20:422 | ... > ... | UseUseExplosion.rb:20:412:20:423 | [true] ( ... ) | +| UseUseExplosion.rb:20:413:20:422 | ... > ... | UseUseExplosion.rb:20:412:20:423 | ( ... ) | | UseUseExplosion.rb:20:421:20:422 | 81 | UseUseExplosion.rb:20:413:20:422 | ... > ... | | UseUseExplosion.rb:20:425:20:3380 | then ... | UseUseExplosion.rb:20:409:20:3396 | if ... | | UseUseExplosion.rb:20:430:20:3380 | if ... | UseUseExplosion.rb:20:425:20:3380 | then ... | @@ -408,8 +388,7 @@ | UseUseExplosion.rb:20:434:20:438 | [post] self | UseUseExplosion.rb:20:3371:20:3376 | self | | UseUseExplosion.rb:20:434:20:438 | self | UseUseExplosion.rb:20:455:20:459 | self | | UseUseExplosion.rb:20:434:20:438 | self | UseUseExplosion.rb:20:3371:20:3376 | self | -| UseUseExplosion.rb:20:434:20:443 | ... > ... | UseUseExplosion.rb:20:433:20:444 | [false] ( ... ) | -| UseUseExplosion.rb:20:434:20:443 | ... > ... | UseUseExplosion.rb:20:433:20:444 | [true] ( ... ) | +| UseUseExplosion.rb:20:434:20:443 | ... > ... | UseUseExplosion.rb:20:433:20:444 | ( ... ) | | UseUseExplosion.rb:20:442:20:443 | 80 | UseUseExplosion.rb:20:434:20:443 | ... > ... | | UseUseExplosion.rb:20:446:20:3364 | then ... | UseUseExplosion.rb:20:430:20:3380 | if ... | | UseUseExplosion.rb:20:451:20:3364 | if ... | UseUseExplosion.rb:20:446:20:3364 | then ... | @@ -418,8 +397,7 @@ | UseUseExplosion.rb:20:455:20:459 | [post] self | UseUseExplosion.rb:20:3355:20:3360 | self | | UseUseExplosion.rb:20:455:20:459 | self | UseUseExplosion.rb:20:476:20:480 | self | | UseUseExplosion.rb:20:455:20:459 | self | UseUseExplosion.rb:20:3355:20:3360 | self | -| UseUseExplosion.rb:20:455:20:464 | ... > ... | UseUseExplosion.rb:20:454:20:465 | [false] ( ... ) | -| UseUseExplosion.rb:20:455:20:464 | ... > ... | UseUseExplosion.rb:20:454:20:465 | [true] ( ... ) | +| UseUseExplosion.rb:20:455:20:464 | ... > ... | UseUseExplosion.rb:20:454:20:465 | ( ... ) | | UseUseExplosion.rb:20:463:20:464 | 79 | UseUseExplosion.rb:20:455:20:464 | ... > ... | | UseUseExplosion.rb:20:467:20:3348 | then ... | UseUseExplosion.rb:20:451:20:3364 | if ... | | UseUseExplosion.rb:20:472:20:3348 | if ... | UseUseExplosion.rb:20:467:20:3348 | then ... | @@ -428,8 +406,7 @@ | UseUseExplosion.rb:20:476:20:480 | [post] self | UseUseExplosion.rb:20:3339:20:3344 | self | | UseUseExplosion.rb:20:476:20:480 | self | UseUseExplosion.rb:20:497:20:501 | self | | UseUseExplosion.rb:20:476:20:480 | self | UseUseExplosion.rb:20:3339:20:3344 | self | -| UseUseExplosion.rb:20:476:20:485 | ... > ... | UseUseExplosion.rb:20:475:20:486 | [false] ( ... ) | -| UseUseExplosion.rb:20:476:20:485 | ... > ... | UseUseExplosion.rb:20:475:20:486 | [true] ( ... ) | +| UseUseExplosion.rb:20:476:20:485 | ... > ... | UseUseExplosion.rb:20:475:20:486 | ( ... ) | | UseUseExplosion.rb:20:484:20:485 | 78 | UseUseExplosion.rb:20:476:20:485 | ... > ... | | UseUseExplosion.rb:20:488:20:3332 | then ... | UseUseExplosion.rb:20:472:20:3348 | if ... | | UseUseExplosion.rb:20:493:20:3332 | if ... | UseUseExplosion.rb:20:488:20:3332 | then ... | @@ -438,8 +415,7 @@ | UseUseExplosion.rb:20:497:20:501 | [post] self | UseUseExplosion.rb:20:3323:20:3328 | self | | UseUseExplosion.rb:20:497:20:501 | self | UseUseExplosion.rb:20:518:20:522 | self | | UseUseExplosion.rb:20:497:20:501 | self | UseUseExplosion.rb:20:3323:20:3328 | self | -| UseUseExplosion.rb:20:497:20:506 | ... > ... | UseUseExplosion.rb:20:496:20:507 | [false] ( ... ) | -| UseUseExplosion.rb:20:497:20:506 | ... > ... | UseUseExplosion.rb:20:496:20:507 | [true] ( ... ) | +| UseUseExplosion.rb:20:497:20:506 | ... > ... | UseUseExplosion.rb:20:496:20:507 | ( ... ) | | UseUseExplosion.rb:20:505:20:506 | 77 | UseUseExplosion.rb:20:497:20:506 | ... > ... | | UseUseExplosion.rb:20:509:20:3316 | then ... | UseUseExplosion.rb:20:493:20:3332 | if ... | | UseUseExplosion.rb:20:514:20:3316 | if ... | UseUseExplosion.rb:20:509:20:3316 | then ... | @@ -448,8 +424,7 @@ | UseUseExplosion.rb:20:518:20:522 | [post] self | UseUseExplosion.rb:20:3307:20:3312 | self | | UseUseExplosion.rb:20:518:20:522 | self | UseUseExplosion.rb:20:539:20:543 | self | | UseUseExplosion.rb:20:518:20:522 | self | UseUseExplosion.rb:20:3307:20:3312 | self | -| UseUseExplosion.rb:20:518:20:527 | ... > ... | UseUseExplosion.rb:20:517:20:528 | [false] ( ... ) | -| UseUseExplosion.rb:20:518:20:527 | ... > ... | UseUseExplosion.rb:20:517:20:528 | [true] ( ... ) | +| UseUseExplosion.rb:20:518:20:527 | ... > ... | UseUseExplosion.rb:20:517:20:528 | ( ... ) | | UseUseExplosion.rb:20:526:20:527 | 76 | UseUseExplosion.rb:20:518:20:527 | ... > ... | | UseUseExplosion.rb:20:530:20:3300 | then ... | UseUseExplosion.rb:20:514:20:3316 | if ... | | UseUseExplosion.rb:20:535:20:3300 | if ... | UseUseExplosion.rb:20:530:20:3300 | then ... | @@ -458,8 +433,7 @@ | UseUseExplosion.rb:20:539:20:543 | [post] self | UseUseExplosion.rb:20:3291:20:3296 | self | | UseUseExplosion.rb:20:539:20:543 | self | UseUseExplosion.rb:20:560:20:564 | self | | UseUseExplosion.rb:20:539:20:543 | self | UseUseExplosion.rb:20:3291:20:3296 | self | -| UseUseExplosion.rb:20:539:20:548 | ... > ... | UseUseExplosion.rb:20:538:20:549 | [false] ( ... ) | -| UseUseExplosion.rb:20:539:20:548 | ... > ... | UseUseExplosion.rb:20:538:20:549 | [true] ( ... ) | +| UseUseExplosion.rb:20:539:20:548 | ... > ... | UseUseExplosion.rb:20:538:20:549 | ( ... ) | | UseUseExplosion.rb:20:547:20:548 | 75 | UseUseExplosion.rb:20:539:20:548 | ... > ... | | UseUseExplosion.rb:20:551:20:3284 | then ... | UseUseExplosion.rb:20:535:20:3300 | if ... | | UseUseExplosion.rb:20:556:20:3284 | if ... | UseUseExplosion.rb:20:551:20:3284 | then ... | @@ -468,8 +442,7 @@ | UseUseExplosion.rb:20:560:20:564 | [post] self | UseUseExplosion.rb:20:3275:20:3280 | self | | UseUseExplosion.rb:20:560:20:564 | self | UseUseExplosion.rb:20:581:20:585 | self | | UseUseExplosion.rb:20:560:20:564 | self | UseUseExplosion.rb:20:3275:20:3280 | self | -| UseUseExplosion.rb:20:560:20:569 | ... > ... | UseUseExplosion.rb:20:559:20:570 | [false] ( ... ) | -| UseUseExplosion.rb:20:560:20:569 | ... > ... | UseUseExplosion.rb:20:559:20:570 | [true] ( ... ) | +| UseUseExplosion.rb:20:560:20:569 | ... > ... | UseUseExplosion.rb:20:559:20:570 | ( ... ) | | UseUseExplosion.rb:20:568:20:569 | 74 | UseUseExplosion.rb:20:560:20:569 | ... > ... | | UseUseExplosion.rb:20:572:20:3268 | then ... | UseUseExplosion.rb:20:556:20:3284 | if ... | | UseUseExplosion.rb:20:577:20:3268 | if ... | UseUseExplosion.rb:20:572:20:3268 | then ... | @@ -478,8 +451,7 @@ | UseUseExplosion.rb:20:581:20:585 | [post] self | UseUseExplosion.rb:20:3259:20:3264 | self | | UseUseExplosion.rb:20:581:20:585 | self | UseUseExplosion.rb:20:602:20:606 | self | | UseUseExplosion.rb:20:581:20:585 | self | UseUseExplosion.rb:20:3259:20:3264 | self | -| UseUseExplosion.rb:20:581:20:590 | ... > ... | UseUseExplosion.rb:20:580:20:591 | [false] ( ... ) | -| UseUseExplosion.rb:20:581:20:590 | ... > ... | UseUseExplosion.rb:20:580:20:591 | [true] ( ... ) | +| UseUseExplosion.rb:20:581:20:590 | ... > ... | UseUseExplosion.rb:20:580:20:591 | ( ... ) | | UseUseExplosion.rb:20:589:20:590 | 73 | UseUseExplosion.rb:20:581:20:590 | ... > ... | | UseUseExplosion.rb:20:593:20:3252 | then ... | UseUseExplosion.rb:20:577:20:3268 | if ... | | UseUseExplosion.rb:20:598:20:3252 | if ... | UseUseExplosion.rb:20:593:20:3252 | then ... | @@ -488,8 +460,7 @@ | UseUseExplosion.rb:20:602:20:606 | [post] self | UseUseExplosion.rb:20:3243:20:3248 | self | | UseUseExplosion.rb:20:602:20:606 | self | UseUseExplosion.rb:20:623:20:627 | self | | UseUseExplosion.rb:20:602:20:606 | self | UseUseExplosion.rb:20:3243:20:3248 | self | -| UseUseExplosion.rb:20:602:20:611 | ... > ... | UseUseExplosion.rb:20:601:20:612 | [false] ( ... ) | -| UseUseExplosion.rb:20:602:20:611 | ... > ... | UseUseExplosion.rb:20:601:20:612 | [true] ( ... ) | +| UseUseExplosion.rb:20:602:20:611 | ... > ... | UseUseExplosion.rb:20:601:20:612 | ( ... ) | | UseUseExplosion.rb:20:610:20:611 | 72 | UseUseExplosion.rb:20:602:20:611 | ... > ... | | UseUseExplosion.rb:20:614:20:3236 | then ... | UseUseExplosion.rb:20:598:20:3252 | if ... | | UseUseExplosion.rb:20:619:20:3236 | if ... | UseUseExplosion.rb:20:614:20:3236 | then ... | @@ -498,8 +469,7 @@ | UseUseExplosion.rb:20:623:20:627 | [post] self | UseUseExplosion.rb:20:3227:20:3232 | self | | UseUseExplosion.rb:20:623:20:627 | self | UseUseExplosion.rb:20:644:20:648 | self | | UseUseExplosion.rb:20:623:20:627 | self | UseUseExplosion.rb:20:3227:20:3232 | self | -| UseUseExplosion.rb:20:623:20:632 | ... > ... | UseUseExplosion.rb:20:622:20:633 | [false] ( ... ) | -| UseUseExplosion.rb:20:623:20:632 | ... > ... | UseUseExplosion.rb:20:622:20:633 | [true] ( ... ) | +| UseUseExplosion.rb:20:623:20:632 | ... > ... | UseUseExplosion.rb:20:622:20:633 | ( ... ) | | UseUseExplosion.rb:20:631:20:632 | 71 | UseUseExplosion.rb:20:623:20:632 | ... > ... | | UseUseExplosion.rb:20:635:20:3220 | then ... | UseUseExplosion.rb:20:619:20:3236 | if ... | | UseUseExplosion.rb:20:640:20:3220 | if ... | UseUseExplosion.rb:20:635:20:3220 | then ... | @@ -508,8 +478,7 @@ | UseUseExplosion.rb:20:644:20:648 | [post] self | UseUseExplosion.rb:20:3211:20:3216 | self | | UseUseExplosion.rb:20:644:20:648 | self | UseUseExplosion.rb:20:665:20:669 | self | | UseUseExplosion.rb:20:644:20:648 | self | UseUseExplosion.rb:20:3211:20:3216 | self | -| UseUseExplosion.rb:20:644:20:653 | ... > ... | UseUseExplosion.rb:20:643:20:654 | [false] ( ... ) | -| UseUseExplosion.rb:20:644:20:653 | ... > ... | UseUseExplosion.rb:20:643:20:654 | [true] ( ... ) | +| UseUseExplosion.rb:20:644:20:653 | ... > ... | UseUseExplosion.rb:20:643:20:654 | ( ... ) | | UseUseExplosion.rb:20:652:20:653 | 70 | UseUseExplosion.rb:20:644:20:653 | ... > ... | | UseUseExplosion.rb:20:656:20:3204 | then ... | UseUseExplosion.rb:20:640:20:3220 | if ... | | UseUseExplosion.rb:20:661:20:3204 | if ... | UseUseExplosion.rb:20:656:20:3204 | then ... | @@ -518,8 +487,7 @@ | UseUseExplosion.rb:20:665:20:669 | [post] self | UseUseExplosion.rb:20:3195:20:3200 | self | | UseUseExplosion.rb:20:665:20:669 | self | UseUseExplosion.rb:20:686:20:690 | self | | UseUseExplosion.rb:20:665:20:669 | self | UseUseExplosion.rb:20:3195:20:3200 | self | -| UseUseExplosion.rb:20:665:20:674 | ... > ... | UseUseExplosion.rb:20:664:20:675 | [false] ( ... ) | -| UseUseExplosion.rb:20:665:20:674 | ... > ... | UseUseExplosion.rb:20:664:20:675 | [true] ( ... ) | +| UseUseExplosion.rb:20:665:20:674 | ... > ... | UseUseExplosion.rb:20:664:20:675 | ( ... ) | | UseUseExplosion.rb:20:673:20:674 | 69 | UseUseExplosion.rb:20:665:20:674 | ... > ... | | UseUseExplosion.rb:20:677:20:3188 | then ... | UseUseExplosion.rb:20:661:20:3204 | if ... | | UseUseExplosion.rb:20:682:20:3188 | if ... | UseUseExplosion.rb:20:677:20:3188 | then ... | @@ -528,8 +496,7 @@ | UseUseExplosion.rb:20:686:20:690 | [post] self | UseUseExplosion.rb:20:3179:20:3184 | self | | UseUseExplosion.rb:20:686:20:690 | self | UseUseExplosion.rb:20:707:20:711 | self | | UseUseExplosion.rb:20:686:20:690 | self | UseUseExplosion.rb:20:3179:20:3184 | self | -| UseUseExplosion.rb:20:686:20:695 | ... > ... | UseUseExplosion.rb:20:685:20:696 | [false] ( ... ) | -| UseUseExplosion.rb:20:686:20:695 | ... > ... | UseUseExplosion.rb:20:685:20:696 | [true] ( ... ) | +| UseUseExplosion.rb:20:686:20:695 | ... > ... | UseUseExplosion.rb:20:685:20:696 | ( ... ) | | UseUseExplosion.rb:20:694:20:695 | 68 | UseUseExplosion.rb:20:686:20:695 | ... > ... | | UseUseExplosion.rb:20:698:20:3172 | then ... | UseUseExplosion.rb:20:682:20:3188 | if ... | | UseUseExplosion.rb:20:703:20:3172 | if ... | UseUseExplosion.rb:20:698:20:3172 | then ... | @@ -538,8 +505,7 @@ | UseUseExplosion.rb:20:707:20:711 | [post] self | UseUseExplosion.rb:20:3163:20:3168 | self | | UseUseExplosion.rb:20:707:20:711 | self | UseUseExplosion.rb:20:728:20:732 | self | | UseUseExplosion.rb:20:707:20:711 | self | UseUseExplosion.rb:20:3163:20:3168 | self | -| UseUseExplosion.rb:20:707:20:716 | ... > ... | UseUseExplosion.rb:20:706:20:717 | [false] ( ... ) | -| UseUseExplosion.rb:20:707:20:716 | ... > ... | UseUseExplosion.rb:20:706:20:717 | [true] ( ... ) | +| UseUseExplosion.rb:20:707:20:716 | ... > ... | UseUseExplosion.rb:20:706:20:717 | ( ... ) | | UseUseExplosion.rb:20:715:20:716 | 67 | UseUseExplosion.rb:20:707:20:716 | ... > ... | | UseUseExplosion.rb:20:719:20:3156 | then ... | UseUseExplosion.rb:20:703:20:3172 | if ... | | UseUseExplosion.rb:20:724:20:3156 | if ... | UseUseExplosion.rb:20:719:20:3156 | then ... | @@ -548,8 +514,7 @@ | UseUseExplosion.rb:20:728:20:732 | [post] self | UseUseExplosion.rb:20:3147:20:3152 | self | | UseUseExplosion.rb:20:728:20:732 | self | UseUseExplosion.rb:20:749:20:753 | self | | UseUseExplosion.rb:20:728:20:732 | self | UseUseExplosion.rb:20:3147:20:3152 | self | -| UseUseExplosion.rb:20:728:20:737 | ... > ... | UseUseExplosion.rb:20:727:20:738 | [false] ( ... ) | -| UseUseExplosion.rb:20:728:20:737 | ... > ... | UseUseExplosion.rb:20:727:20:738 | [true] ( ... ) | +| UseUseExplosion.rb:20:728:20:737 | ... > ... | UseUseExplosion.rb:20:727:20:738 | ( ... ) | | UseUseExplosion.rb:20:736:20:737 | 66 | UseUseExplosion.rb:20:728:20:737 | ... > ... | | UseUseExplosion.rb:20:740:20:3140 | then ... | UseUseExplosion.rb:20:724:20:3156 | if ... | | UseUseExplosion.rb:20:745:20:3140 | if ... | UseUseExplosion.rb:20:740:20:3140 | then ... | @@ -558,8 +523,7 @@ | UseUseExplosion.rb:20:749:20:753 | [post] self | UseUseExplosion.rb:20:3131:20:3136 | self | | UseUseExplosion.rb:20:749:20:753 | self | UseUseExplosion.rb:20:770:20:774 | self | | UseUseExplosion.rb:20:749:20:753 | self | UseUseExplosion.rb:20:3131:20:3136 | self | -| UseUseExplosion.rb:20:749:20:758 | ... > ... | UseUseExplosion.rb:20:748:20:759 | [false] ( ... ) | -| UseUseExplosion.rb:20:749:20:758 | ... > ... | UseUseExplosion.rb:20:748:20:759 | [true] ( ... ) | +| UseUseExplosion.rb:20:749:20:758 | ... > ... | UseUseExplosion.rb:20:748:20:759 | ( ... ) | | UseUseExplosion.rb:20:757:20:758 | 65 | UseUseExplosion.rb:20:749:20:758 | ... > ... | | UseUseExplosion.rb:20:761:20:3124 | then ... | UseUseExplosion.rb:20:745:20:3140 | if ... | | UseUseExplosion.rb:20:766:20:3124 | if ... | UseUseExplosion.rb:20:761:20:3124 | then ... | @@ -568,8 +532,7 @@ | UseUseExplosion.rb:20:770:20:774 | [post] self | UseUseExplosion.rb:20:3115:20:3120 | self | | UseUseExplosion.rb:20:770:20:774 | self | UseUseExplosion.rb:20:791:20:795 | self | | UseUseExplosion.rb:20:770:20:774 | self | UseUseExplosion.rb:20:3115:20:3120 | self | -| UseUseExplosion.rb:20:770:20:779 | ... > ... | UseUseExplosion.rb:20:769:20:780 | [false] ( ... ) | -| UseUseExplosion.rb:20:770:20:779 | ... > ... | UseUseExplosion.rb:20:769:20:780 | [true] ( ... ) | +| UseUseExplosion.rb:20:770:20:779 | ... > ... | UseUseExplosion.rb:20:769:20:780 | ( ... ) | | UseUseExplosion.rb:20:778:20:779 | 64 | UseUseExplosion.rb:20:770:20:779 | ... > ... | | UseUseExplosion.rb:20:782:20:3108 | then ... | UseUseExplosion.rb:20:766:20:3124 | if ... | | UseUseExplosion.rb:20:787:20:3108 | if ... | UseUseExplosion.rb:20:782:20:3108 | then ... | @@ -578,8 +541,7 @@ | UseUseExplosion.rb:20:791:20:795 | [post] self | UseUseExplosion.rb:20:3099:20:3104 | self | | UseUseExplosion.rb:20:791:20:795 | self | UseUseExplosion.rb:20:812:20:816 | self | | UseUseExplosion.rb:20:791:20:795 | self | UseUseExplosion.rb:20:3099:20:3104 | self | -| UseUseExplosion.rb:20:791:20:800 | ... > ... | UseUseExplosion.rb:20:790:20:801 | [false] ( ... ) | -| UseUseExplosion.rb:20:791:20:800 | ... > ... | UseUseExplosion.rb:20:790:20:801 | [true] ( ... ) | +| UseUseExplosion.rb:20:791:20:800 | ... > ... | UseUseExplosion.rb:20:790:20:801 | ( ... ) | | UseUseExplosion.rb:20:799:20:800 | 63 | UseUseExplosion.rb:20:791:20:800 | ... > ... | | UseUseExplosion.rb:20:803:20:3092 | then ... | UseUseExplosion.rb:20:787:20:3108 | if ... | | UseUseExplosion.rb:20:808:20:3092 | if ... | UseUseExplosion.rb:20:803:20:3092 | then ... | @@ -588,8 +550,7 @@ | UseUseExplosion.rb:20:812:20:816 | [post] self | UseUseExplosion.rb:20:3083:20:3088 | self | | UseUseExplosion.rb:20:812:20:816 | self | UseUseExplosion.rb:20:833:20:837 | self | | UseUseExplosion.rb:20:812:20:816 | self | UseUseExplosion.rb:20:3083:20:3088 | self | -| UseUseExplosion.rb:20:812:20:821 | ... > ... | UseUseExplosion.rb:20:811:20:822 | [false] ( ... ) | -| UseUseExplosion.rb:20:812:20:821 | ... > ... | UseUseExplosion.rb:20:811:20:822 | [true] ( ... ) | +| UseUseExplosion.rb:20:812:20:821 | ... > ... | UseUseExplosion.rb:20:811:20:822 | ( ... ) | | UseUseExplosion.rb:20:820:20:821 | 62 | UseUseExplosion.rb:20:812:20:821 | ... > ... | | UseUseExplosion.rb:20:824:20:3076 | then ... | UseUseExplosion.rb:20:808:20:3092 | if ... | | UseUseExplosion.rb:20:829:20:3076 | if ... | UseUseExplosion.rb:20:824:20:3076 | then ... | @@ -598,8 +559,7 @@ | UseUseExplosion.rb:20:833:20:837 | [post] self | UseUseExplosion.rb:20:3067:20:3072 | self | | UseUseExplosion.rb:20:833:20:837 | self | UseUseExplosion.rb:20:854:20:858 | self | | UseUseExplosion.rb:20:833:20:837 | self | UseUseExplosion.rb:20:3067:20:3072 | self | -| UseUseExplosion.rb:20:833:20:842 | ... > ... | UseUseExplosion.rb:20:832:20:843 | [false] ( ... ) | -| UseUseExplosion.rb:20:833:20:842 | ... > ... | UseUseExplosion.rb:20:832:20:843 | [true] ( ... ) | +| UseUseExplosion.rb:20:833:20:842 | ... > ... | UseUseExplosion.rb:20:832:20:843 | ( ... ) | | UseUseExplosion.rb:20:841:20:842 | 61 | UseUseExplosion.rb:20:833:20:842 | ... > ... | | UseUseExplosion.rb:20:845:20:3060 | then ... | UseUseExplosion.rb:20:829:20:3076 | if ... | | UseUseExplosion.rb:20:850:20:3060 | if ... | UseUseExplosion.rb:20:845:20:3060 | then ... | @@ -608,8 +568,7 @@ | UseUseExplosion.rb:20:854:20:858 | [post] self | UseUseExplosion.rb:20:3051:20:3056 | self | | UseUseExplosion.rb:20:854:20:858 | self | UseUseExplosion.rb:20:875:20:879 | self | | UseUseExplosion.rb:20:854:20:858 | self | UseUseExplosion.rb:20:3051:20:3056 | self | -| UseUseExplosion.rb:20:854:20:863 | ... > ... | UseUseExplosion.rb:20:853:20:864 | [false] ( ... ) | -| UseUseExplosion.rb:20:854:20:863 | ... > ... | UseUseExplosion.rb:20:853:20:864 | [true] ( ... ) | +| UseUseExplosion.rb:20:854:20:863 | ... > ... | UseUseExplosion.rb:20:853:20:864 | ( ... ) | | UseUseExplosion.rb:20:862:20:863 | 60 | UseUseExplosion.rb:20:854:20:863 | ... > ... | | UseUseExplosion.rb:20:866:20:3044 | then ... | UseUseExplosion.rb:20:850:20:3060 | if ... | | UseUseExplosion.rb:20:871:20:3044 | if ... | UseUseExplosion.rb:20:866:20:3044 | then ... | @@ -618,8 +577,7 @@ | UseUseExplosion.rb:20:875:20:879 | [post] self | UseUseExplosion.rb:20:3035:20:3040 | self | | UseUseExplosion.rb:20:875:20:879 | self | UseUseExplosion.rb:20:896:20:900 | self | | UseUseExplosion.rb:20:875:20:879 | self | UseUseExplosion.rb:20:3035:20:3040 | self | -| UseUseExplosion.rb:20:875:20:884 | ... > ... | UseUseExplosion.rb:20:874:20:885 | [false] ( ... ) | -| UseUseExplosion.rb:20:875:20:884 | ... > ... | UseUseExplosion.rb:20:874:20:885 | [true] ( ... ) | +| UseUseExplosion.rb:20:875:20:884 | ... > ... | UseUseExplosion.rb:20:874:20:885 | ( ... ) | | UseUseExplosion.rb:20:883:20:884 | 59 | UseUseExplosion.rb:20:875:20:884 | ... > ... | | UseUseExplosion.rb:20:887:20:3028 | then ... | UseUseExplosion.rb:20:871:20:3044 | if ... | | UseUseExplosion.rb:20:892:20:3028 | if ... | UseUseExplosion.rb:20:887:20:3028 | then ... | @@ -628,8 +586,7 @@ | UseUseExplosion.rb:20:896:20:900 | [post] self | UseUseExplosion.rb:20:3019:20:3024 | self | | UseUseExplosion.rb:20:896:20:900 | self | UseUseExplosion.rb:20:917:20:921 | self | | UseUseExplosion.rb:20:896:20:900 | self | UseUseExplosion.rb:20:3019:20:3024 | self | -| UseUseExplosion.rb:20:896:20:905 | ... > ... | UseUseExplosion.rb:20:895:20:906 | [false] ( ... ) | -| UseUseExplosion.rb:20:896:20:905 | ... > ... | UseUseExplosion.rb:20:895:20:906 | [true] ( ... ) | +| UseUseExplosion.rb:20:896:20:905 | ... > ... | UseUseExplosion.rb:20:895:20:906 | ( ... ) | | UseUseExplosion.rb:20:904:20:905 | 58 | UseUseExplosion.rb:20:896:20:905 | ... > ... | | UseUseExplosion.rb:20:908:20:3012 | then ... | UseUseExplosion.rb:20:892:20:3028 | if ... | | UseUseExplosion.rb:20:913:20:3012 | if ... | UseUseExplosion.rb:20:908:20:3012 | then ... | @@ -638,8 +595,7 @@ | UseUseExplosion.rb:20:917:20:921 | [post] self | UseUseExplosion.rb:20:3003:20:3008 | self | | UseUseExplosion.rb:20:917:20:921 | self | UseUseExplosion.rb:20:938:20:942 | self | | UseUseExplosion.rb:20:917:20:921 | self | UseUseExplosion.rb:20:3003:20:3008 | self | -| UseUseExplosion.rb:20:917:20:926 | ... > ... | UseUseExplosion.rb:20:916:20:927 | [false] ( ... ) | -| UseUseExplosion.rb:20:917:20:926 | ... > ... | UseUseExplosion.rb:20:916:20:927 | [true] ( ... ) | +| UseUseExplosion.rb:20:917:20:926 | ... > ... | UseUseExplosion.rb:20:916:20:927 | ( ... ) | | UseUseExplosion.rb:20:925:20:926 | 57 | UseUseExplosion.rb:20:917:20:926 | ... > ... | | UseUseExplosion.rb:20:929:20:2996 | then ... | UseUseExplosion.rb:20:913:20:3012 | if ... | | UseUseExplosion.rb:20:934:20:2996 | if ... | UseUseExplosion.rb:20:929:20:2996 | then ... | @@ -648,8 +604,7 @@ | UseUseExplosion.rb:20:938:20:942 | [post] self | UseUseExplosion.rb:20:2987:20:2992 | self | | UseUseExplosion.rb:20:938:20:942 | self | UseUseExplosion.rb:20:959:20:963 | self | | UseUseExplosion.rb:20:938:20:942 | self | UseUseExplosion.rb:20:2987:20:2992 | self | -| UseUseExplosion.rb:20:938:20:947 | ... > ... | UseUseExplosion.rb:20:937:20:948 | [false] ( ... ) | -| UseUseExplosion.rb:20:938:20:947 | ... > ... | UseUseExplosion.rb:20:937:20:948 | [true] ( ... ) | +| UseUseExplosion.rb:20:938:20:947 | ... > ... | UseUseExplosion.rb:20:937:20:948 | ( ... ) | | UseUseExplosion.rb:20:946:20:947 | 56 | UseUseExplosion.rb:20:938:20:947 | ... > ... | | UseUseExplosion.rb:20:950:20:2980 | then ... | UseUseExplosion.rb:20:934:20:2996 | if ... | | UseUseExplosion.rb:20:955:20:2980 | if ... | UseUseExplosion.rb:20:950:20:2980 | then ... | @@ -658,8 +613,7 @@ | UseUseExplosion.rb:20:959:20:963 | [post] self | UseUseExplosion.rb:20:2971:20:2976 | self | | UseUseExplosion.rb:20:959:20:963 | self | UseUseExplosion.rb:20:980:20:984 | self | | UseUseExplosion.rb:20:959:20:963 | self | UseUseExplosion.rb:20:2971:20:2976 | self | -| UseUseExplosion.rb:20:959:20:968 | ... > ... | UseUseExplosion.rb:20:958:20:969 | [false] ( ... ) | -| UseUseExplosion.rb:20:959:20:968 | ... > ... | UseUseExplosion.rb:20:958:20:969 | [true] ( ... ) | +| UseUseExplosion.rb:20:959:20:968 | ... > ... | UseUseExplosion.rb:20:958:20:969 | ( ... ) | | UseUseExplosion.rb:20:967:20:968 | 55 | UseUseExplosion.rb:20:959:20:968 | ... > ... | | UseUseExplosion.rb:20:971:20:2964 | then ... | UseUseExplosion.rb:20:955:20:2980 | if ... | | UseUseExplosion.rb:20:976:20:2964 | if ... | UseUseExplosion.rb:20:971:20:2964 | then ... | @@ -668,8 +622,7 @@ | UseUseExplosion.rb:20:980:20:984 | [post] self | UseUseExplosion.rb:20:2955:20:2960 | self | | UseUseExplosion.rb:20:980:20:984 | self | UseUseExplosion.rb:20:1001:20:1005 | self | | UseUseExplosion.rb:20:980:20:984 | self | UseUseExplosion.rb:20:2955:20:2960 | self | -| UseUseExplosion.rb:20:980:20:989 | ... > ... | UseUseExplosion.rb:20:979:20:990 | [false] ( ... ) | -| UseUseExplosion.rb:20:980:20:989 | ... > ... | UseUseExplosion.rb:20:979:20:990 | [true] ( ... ) | +| UseUseExplosion.rb:20:980:20:989 | ... > ... | UseUseExplosion.rb:20:979:20:990 | ( ... ) | | UseUseExplosion.rb:20:988:20:989 | 54 | UseUseExplosion.rb:20:980:20:989 | ... > ... | | UseUseExplosion.rb:20:992:20:2948 | then ... | UseUseExplosion.rb:20:976:20:2964 | if ... | | UseUseExplosion.rb:20:997:20:2948 | if ... | UseUseExplosion.rb:20:992:20:2948 | then ... | @@ -678,8 +631,7 @@ | UseUseExplosion.rb:20:1001:20:1005 | [post] self | UseUseExplosion.rb:20:2939:20:2944 | self | | UseUseExplosion.rb:20:1001:20:1005 | self | UseUseExplosion.rb:20:1022:20:1026 | self | | UseUseExplosion.rb:20:1001:20:1005 | self | UseUseExplosion.rb:20:2939:20:2944 | self | -| UseUseExplosion.rb:20:1001:20:1010 | ... > ... | UseUseExplosion.rb:20:1000:20:1011 | [false] ( ... ) | -| UseUseExplosion.rb:20:1001:20:1010 | ... > ... | UseUseExplosion.rb:20:1000:20:1011 | [true] ( ... ) | +| UseUseExplosion.rb:20:1001:20:1010 | ... > ... | UseUseExplosion.rb:20:1000:20:1011 | ( ... ) | | UseUseExplosion.rb:20:1009:20:1010 | 53 | UseUseExplosion.rb:20:1001:20:1010 | ... > ... | | UseUseExplosion.rb:20:1013:20:2932 | then ... | UseUseExplosion.rb:20:997:20:2948 | if ... | | UseUseExplosion.rb:20:1018:20:2932 | if ... | UseUseExplosion.rb:20:1013:20:2932 | then ... | @@ -688,8 +640,7 @@ | UseUseExplosion.rb:20:1022:20:1026 | [post] self | UseUseExplosion.rb:20:2923:20:2928 | self | | UseUseExplosion.rb:20:1022:20:1026 | self | UseUseExplosion.rb:20:1043:20:1047 | self | | UseUseExplosion.rb:20:1022:20:1026 | self | UseUseExplosion.rb:20:2923:20:2928 | self | -| UseUseExplosion.rb:20:1022:20:1031 | ... > ... | UseUseExplosion.rb:20:1021:20:1032 | [false] ( ... ) | -| UseUseExplosion.rb:20:1022:20:1031 | ... > ... | UseUseExplosion.rb:20:1021:20:1032 | [true] ( ... ) | +| UseUseExplosion.rb:20:1022:20:1031 | ... > ... | UseUseExplosion.rb:20:1021:20:1032 | ( ... ) | | UseUseExplosion.rb:20:1030:20:1031 | 52 | UseUseExplosion.rb:20:1022:20:1031 | ... > ... | | UseUseExplosion.rb:20:1034:20:2916 | then ... | UseUseExplosion.rb:20:1018:20:2932 | if ... | | UseUseExplosion.rb:20:1039:20:2916 | if ... | UseUseExplosion.rb:20:1034:20:2916 | then ... | @@ -698,8 +649,7 @@ | UseUseExplosion.rb:20:1043:20:1047 | [post] self | UseUseExplosion.rb:20:2907:20:2912 | self | | UseUseExplosion.rb:20:1043:20:1047 | self | UseUseExplosion.rb:20:1064:20:1068 | self | | UseUseExplosion.rb:20:1043:20:1047 | self | UseUseExplosion.rb:20:2907:20:2912 | self | -| UseUseExplosion.rb:20:1043:20:1052 | ... > ... | UseUseExplosion.rb:20:1042:20:1053 | [false] ( ... ) | -| UseUseExplosion.rb:20:1043:20:1052 | ... > ... | UseUseExplosion.rb:20:1042:20:1053 | [true] ( ... ) | +| UseUseExplosion.rb:20:1043:20:1052 | ... > ... | UseUseExplosion.rb:20:1042:20:1053 | ( ... ) | | UseUseExplosion.rb:20:1051:20:1052 | 51 | UseUseExplosion.rb:20:1043:20:1052 | ... > ... | | UseUseExplosion.rb:20:1055:20:2900 | then ... | UseUseExplosion.rb:20:1039:20:2916 | if ... | | UseUseExplosion.rb:20:1060:20:2900 | if ... | UseUseExplosion.rb:20:1055:20:2900 | then ... | @@ -708,8 +658,7 @@ | UseUseExplosion.rb:20:1064:20:1068 | [post] self | UseUseExplosion.rb:20:2891:20:2896 | self | | UseUseExplosion.rb:20:1064:20:1068 | self | UseUseExplosion.rb:20:1085:20:1089 | self | | UseUseExplosion.rb:20:1064:20:1068 | self | UseUseExplosion.rb:20:2891:20:2896 | self | -| UseUseExplosion.rb:20:1064:20:1073 | ... > ... | UseUseExplosion.rb:20:1063:20:1074 | [false] ( ... ) | -| UseUseExplosion.rb:20:1064:20:1073 | ... > ... | UseUseExplosion.rb:20:1063:20:1074 | [true] ( ... ) | +| UseUseExplosion.rb:20:1064:20:1073 | ... > ... | UseUseExplosion.rb:20:1063:20:1074 | ( ... ) | | UseUseExplosion.rb:20:1072:20:1073 | 50 | UseUseExplosion.rb:20:1064:20:1073 | ... > ... | | UseUseExplosion.rb:20:1076:20:2884 | then ... | UseUseExplosion.rb:20:1060:20:2900 | if ... | | UseUseExplosion.rb:20:1081:20:2884 | if ... | UseUseExplosion.rb:20:1076:20:2884 | then ... | @@ -718,8 +667,7 @@ | UseUseExplosion.rb:20:1085:20:1089 | [post] self | UseUseExplosion.rb:20:2875:20:2880 | self | | UseUseExplosion.rb:20:1085:20:1089 | self | UseUseExplosion.rb:20:1106:20:1110 | self | | UseUseExplosion.rb:20:1085:20:1089 | self | UseUseExplosion.rb:20:2875:20:2880 | self | -| UseUseExplosion.rb:20:1085:20:1094 | ... > ... | UseUseExplosion.rb:20:1084:20:1095 | [false] ( ... ) | -| UseUseExplosion.rb:20:1085:20:1094 | ... > ... | UseUseExplosion.rb:20:1084:20:1095 | [true] ( ... ) | +| UseUseExplosion.rb:20:1085:20:1094 | ... > ... | UseUseExplosion.rb:20:1084:20:1095 | ( ... ) | | UseUseExplosion.rb:20:1093:20:1094 | 49 | UseUseExplosion.rb:20:1085:20:1094 | ... > ... | | UseUseExplosion.rb:20:1097:20:2868 | then ... | UseUseExplosion.rb:20:1081:20:2884 | if ... | | UseUseExplosion.rb:20:1102:20:2868 | if ... | UseUseExplosion.rb:20:1097:20:2868 | then ... | @@ -728,8 +676,7 @@ | UseUseExplosion.rb:20:1106:20:1110 | [post] self | UseUseExplosion.rb:20:2859:20:2864 | self | | UseUseExplosion.rb:20:1106:20:1110 | self | UseUseExplosion.rb:20:1127:20:1131 | self | | UseUseExplosion.rb:20:1106:20:1110 | self | UseUseExplosion.rb:20:2859:20:2864 | self | -| UseUseExplosion.rb:20:1106:20:1115 | ... > ... | UseUseExplosion.rb:20:1105:20:1116 | [false] ( ... ) | -| UseUseExplosion.rb:20:1106:20:1115 | ... > ... | UseUseExplosion.rb:20:1105:20:1116 | [true] ( ... ) | +| UseUseExplosion.rb:20:1106:20:1115 | ... > ... | UseUseExplosion.rb:20:1105:20:1116 | ( ... ) | | UseUseExplosion.rb:20:1114:20:1115 | 48 | UseUseExplosion.rb:20:1106:20:1115 | ... > ... | | UseUseExplosion.rb:20:1118:20:2852 | then ... | UseUseExplosion.rb:20:1102:20:2868 | if ... | | UseUseExplosion.rb:20:1123:20:2852 | if ... | UseUseExplosion.rb:20:1118:20:2852 | then ... | @@ -738,8 +685,7 @@ | UseUseExplosion.rb:20:1127:20:1131 | [post] self | UseUseExplosion.rb:20:2843:20:2848 | self | | UseUseExplosion.rb:20:1127:20:1131 | self | UseUseExplosion.rb:20:1148:20:1152 | self | | UseUseExplosion.rb:20:1127:20:1131 | self | UseUseExplosion.rb:20:2843:20:2848 | self | -| UseUseExplosion.rb:20:1127:20:1136 | ... > ... | UseUseExplosion.rb:20:1126:20:1137 | [false] ( ... ) | -| UseUseExplosion.rb:20:1127:20:1136 | ... > ... | UseUseExplosion.rb:20:1126:20:1137 | [true] ( ... ) | +| UseUseExplosion.rb:20:1127:20:1136 | ... > ... | UseUseExplosion.rb:20:1126:20:1137 | ( ... ) | | UseUseExplosion.rb:20:1135:20:1136 | 47 | UseUseExplosion.rb:20:1127:20:1136 | ... > ... | | UseUseExplosion.rb:20:1139:20:2836 | then ... | UseUseExplosion.rb:20:1123:20:2852 | if ... | | UseUseExplosion.rb:20:1144:20:2836 | if ... | UseUseExplosion.rb:20:1139:20:2836 | then ... | @@ -748,8 +694,7 @@ | UseUseExplosion.rb:20:1148:20:1152 | [post] self | UseUseExplosion.rb:20:2827:20:2832 | self | | UseUseExplosion.rb:20:1148:20:1152 | self | UseUseExplosion.rb:20:1169:20:1173 | self | | UseUseExplosion.rb:20:1148:20:1152 | self | UseUseExplosion.rb:20:2827:20:2832 | self | -| UseUseExplosion.rb:20:1148:20:1157 | ... > ... | UseUseExplosion.rb:20:1147:20:1158 | [false] ( ... ) | -| UseUseExplosion.rb:20:1148:20:1157 | ... > ... | UseUseExplosion.rb:20:1147:20:1158 | [true] ( ... ) | +| UseUseExplosion.rb:20:1148:20:1157 | ... > ... | UseUseExplosion.rb:20:1147:20:1158 | ( ... ) | | UseUseExplosion.rb:20:1156:20:1157 | 46 | UseUseExplosion.rb:20:1148:20:1157 | ... > ... | | UseUseExplosion.rb:20:1160:20:2820 | then ... | UseUseExplosion.rb:20:1144:20:2836 | if ... | | UseUseExplosion.rb:20:1165:20:2820 | if ... | UseUseExplosion.rb:20:1160:20:2820 | then ... | @@ -758,8 +703,7 @@ | UseUseExplosion.rb:20:1169:20:1173 | [post] self | UseUseExplosion.rb:20:2811:20:2816 | self | | UseUseExplosion.rb:20:1169:20:1173 | self | UseUseExplosion.rb:20:1190:20:1194 | self | | UseUseExplosion.rb:20:1169:20:1173 | self | UseUseExplosion.rb:20:2811:20:2816 | self | -| UseUseExplosion.rb:20:1169:20:1178 | ... > ... | UseUseExplosion.rb:20:1168:20:1179 | [false] ( ... ) | -| UseUseExplosion.rb:20:1169:20:1178 | ... > ... | UseUseExplosion.rb:20:1168:20:1179 | [true] ( ... ) | +| UseUseExplosion.rb:20:1169:20:1178 | ... > ... | UseUseExplosion.rb:20:1168:20:1179 | ( ... ) | | UseUseExplosion.rb:20:1177:20:1178 | 45 | UseUseExplosion.rb:20:1169:20:1178 | ... > ... | | UseUseExplosion.rb:20:1181:20:2804 | then ... | UseUseExplosion.rb:20:1165:20:2820 | if ... | | UseUseExplosion.rb:20:1186:20:2804 | if ... | UseUseExplosion.rb:20:1181:20:2804 | then ... | @@ -768,8 +712,7 @@ | UseUseExplosion.rb:20:1190:20:1194 | [post] self | UseUseExplosion.rb:20:2795:20:2800 | self | | UseUseExplosion.rb:20:1190:20:1194 | self | UseUseExplosion.rb:20:1211:20:1215 | self | | UseUseExplosion.rb:20:1190:20:1194 | self | UseUseExplosion.rb:20:2795:20:2800 | self | -| UseUseExplosion.rb:20:1190:20:1199 | ... > ... | UseUseExplosion.rb:20:1189:20:1200 | [false] ( ... ) | -| UseUseExplosion.rb:20:1190:20:1199 | ... > ... | UseUseExplosion.rb:20:1189:20:1200 | [true] ( ... ) | +| UseUseExplosion.rb:20:1190:20:1199 | ... > ... | UseUseExplosion.rb:20:1189:20:1200 | ( ... ) | | UseUseExplosion.rb:20:1198:20:1199 | 44 | UseUseExplosion.rb:20:1190:20:1199 | ... > ... | | UseUseExplosion.rb:20:1202:20:2788 | then ... | UseUseExplosion.rb:20:1186:20:2804 | if ... | | UseUseExplosion.rb:20:1207:20:2788 | if ... | UseUseExplosion.rb:20:1202:20:2788 | then ... | @@ -778,8 +721,7 @@ | UseUseExplosion.rb:20:1211:20:1215 | [post] self | UseUseExplosion.rb:20:2779:20:2784 | self | | UseUseExplosion.rb:20:1211:20:1215 | self | UseUseExplosion.rb:20:1232:20:1236 | self | | UseUseExplosion.rb:20:1211:20:1215 | self | UseUseExplosion.rb:20:2779:20:2784 | self | -| UseUseExplosion.rb:20:1211:20:1220 | ... > ... | UseUseExplosion.rb:20:1210:20:1221 | [false] ( ... ) | -| UseUseExplosion.rb:20:1211:20:1220 | ... > ... | UseUseExplosion.rb:20:1210:20:1221 | [true] ( ... ) | +| UseUseExplosion.rb:20:1211:20:1220 | ... > ... | UseUseExplosion.rb:20:1210:20:1221 | ( ... ) | | UseUseExplosion.rb:20:1219:20:1220 | 43 | UseUseExplosion.rb:20:1211:20:1220 | ... > ... | | UseUseExplosion.rb:20:1223:20:2772 | then ... | UseUseExplosion.rb:20:1207:20:2788 | if ... | | UseUseExplosion.rb:20:1228:20:2772 | if ... | UseUseExplosion.rb:20:1223:20:2772 | then ... | @@ -788,8 +730,7 @@ | UseUseExplosion.rb:20:1232:20:1236 | [post] self | UseUseExplosion.rb:20:2763:20:2768 | self | | UseUseExplosion.rb:20:1232:20:1236 | self | UseUseExplosion.rb:20:1253:20:1257 | self | | UseUseExplosion.rb:20:1232:20:1236 | self | UseUseExplosion.rb:20:2763:20:2768 | self | -| UseUseExplosion.rb:20:1232:20:1241 | ... > ... | UseUseExplosion.rb:20:1231:20:1242 | [false] ( ... ) | -| UseUseExplosion.rb:20:1232:20:1241 | ... > ... | UseUseExplosion.rb:20:1231:20:1242 | [true] ( ... ) | +| UseUseExplosion.rb:20:1232:20:1241 | ... > ... | UseUseExplosion.rb:20:1231:20:1242 | ( ... ) | | UseUseExplosion.rb:20:1240:20:1241 | 42 | UseUseExplosion.rb:20:1232:20:1241 | ... > ... | | UseUseExplosion.rb:20:1244:20:2756 | then ... | UseUseExplosion.rb:20:1228:20:2772 | if ... | | UseUseExplosion.rb:20:1249:20:2756 | if ... | UseUseExplosion.rb:20:1244:20:2756 | then ... | @@ -798,8 +739,7 @@ | UseUseExplosion.rb:20:1253:20:1257 | [post] self | UseUseExplosion.rb:20:2747:20:2752 | self | | UseUseExplosion.rb:20:1253:20:1257 | self | UseUseExplosion.rb:20:1274:20:1278 | self | | UseUseExplosion.rb:20:1253:20:1257 | self | UseUseExplosion.rb:20:2747:20:2752 | self | -| UseUseExplosion.rb:20:1253:20:1262 | ... > ... | UseUseExplosion.rb:20:1252:20:1263 | [false] ( ... ) | -| UseUseExplosion.rb:20:1253:20:1262 | ... > ... | UseUseExplosion.rb:20:1252:20:1263 | [true] ( ... ) | +| UseUseExplosion.rb:20:1253:20:1262 | ... > ... | UseUseExplosion.rb:20:1252:20:1263 | ( ... ) | | UseUseExplosion.rb:20:1261:20:1262 | 41 | UseUseExplosion.rb:20:1253:20:1262 | ... > ... | | UseUseExplosion.rb:20:1265:20:2740 | then ... | UseUseExplosion.rb:20:1249:20:2756 | if ... | | UseUseExplosion.rb:20:1270:20:2740 | if ... | UseUseExplosion.rb:20:1265:20:2740 | then ... | @@ -808,8 +748,7 @@ | UseUseExplosion.rb:20:1274:20:1278 | [post] self | UseUseExplosion.rb:20:2731:20:2736 | self | | UseUseExplosion.rb:20:1274:20:1278 | self | UseUseExplosion.rb:20:1295:20:1299 | self | | UseUseExplosion.rb:20:1274:20:1278 | self | UseUseExplosion.rb:20:2731:20:2736 | self | -| UseUseExplosion.rb:20:1274:20:1283 | ... > ... | UseUseExplosion.rb:20:1273:20:1284 | [false] ( ... ) | -| UseUseExplosion.rb:20:1274:20:1283 | ... > ... | UseUseExplosion.rb:20:1273:20:1284 | [true] ( ... ) | +| UseUseExplosion.rb:20:1274:20:1283 | ... > ... | UseUseExplosion.rb:20:1273:20:1284 | ( ... ) | | UseUseExplosion.rb:20:1282:20:1283 | 40 | UseUseExplosion.rb:20:1274:20:1283 | ... > ... | | UseUseExplosion.rb:20:1286:20:2724 | then ... | UseUseExplosion.rb:20:1270:20:2740 | if ... | | UseUseExplosion.rb:20:1291:20:2724 | if ... | UseUseExplosion.rb:20:1286:20:2724 | then ... | @@ -818,8 +757,7 @@ | UseUseExplosion.rb:20:1295:20:1299 | [post] self | UseUseExplosion.rb:20:2715:20:2720 | self | | UseUseExplosion.rb:20:1295:20:1299 | self | UseUseExplosion.rb:20:1316:20:1320 | self | | UseUseExplosion.rb:20:1295:20:1299 | self | UseUseExplosion.rb:20:2715:20:2720 | self | -| UseUseExplosion.rb:20:1295:20:1304 | ... > ... | UseUseExplosion.rb:20:1294:20:1305 | [false] ( ... ) | -| UseUseExplosion.rb:20:1295:20:1304 | ... > ... | UseUseExplosion.rb:20:1294:20:1305 | [true] ( ... ) | +| UseUseExplosion.rb:20:1295:20:1304 | ... > ... | UseUseExplosion.rb:20:1294:20:1305 | ( ... ) | | UseUseExplosion.rb:20:1303:20:1304 | 39 | UseUseExplosion.rb:20:1295:20:1304 | ... > ... | | UseUseExplosion.rb:20:1307:20:2708 | then ... | UseUseExplosion.rb:20:1291:20:2724 | if ... | | UseUseExplosion.rb:20:1312:20:2708 | if ... | UseUseExplosion.rb:20:1307:20:2708 | then ... | @@ -828,8 +766,7 @@ | UseUseExplosion.rb:20:1316:20:1320 | [post] self | UseUseExplosion.rb:20:2699:20:2704 | self | | UseUseExplosion.rb:20:1316:20:1320 | self | UseUseExplosion.rb:20:1337:20:1341 | self | | UseUseExplosion.rb:20:1316:20:1320 | self | UseUseExplosion.rb:20:2699:20:2704 | self | -| UseUseExplosion.rb:20:1316:20:1325 | ... > ... | UseUseExplosion.rb:20:1315:20:1326 | [false] ( ... ) | -| UseUseExplosion.rb:20:1316:20:1325 | ... > ... | UseUseExplosion.rb:20:1315:20:1326 | [true] ( ... ) | +| UseUseExplosion.rb:20:1316:20:1325 | ... > ... | UseUseExplosion.rb:20:1315:20:1326 | ( ... ) | | UseUseExplosion.rb:20:1324:20:1325 | 38 | UseUseExplosion.rb:20:1316:20:1325 | ... > ... | | UseUseExplosion.rb:20:1328:20:2692 | then ... | UseUseExplosion.rb:20:1312:20:2708 | if ... | | UseUseExplosion.rb:20:1333:20:2692 | if ... | UseUseExplosion.rb:20:1328:20:2692 | then ... | @@ -838,8 +775,7 @@ | UseUseExplosion.rb:20:1337:20:1341 | [post] self | UseUseExplosion.rb:20:2683:20:2688 | self | | UseUseExplosion.rb:20:1337:20:1341 | self | UseUseExplosion.rb:20:1358:20:1362 | self | | UseUseExplosion.rb:20:1337:20:1341 | self | UseUseExplosion.rb:20:2683:20:2688 | self | -| UseUseExplosion.rb:20:1337:20:1346 | ... > ... | UseUseExplosion.rb:20:1336:20:1347 | [false] ( ... ) | -| UseUseExplosion.rb:20:1337:20:1346 | ... > ... | UseUseExplosion.rb:20:1336:20:1347 | [true] ( ... ) | +| UseUseExplosion.rb:20:1337:20:1346 | ... > ... | UseUseExplosion.rb:20:1336:20:1347 | ( ... ) | | UseUseExplosion.rb:20:1345:20:1346 | 37 | UseUseExplosion.rb:20:1337:20:1346 | ... > ... | | UseUseExplosion.rb:20:1349:20:2676 | then ... | UseUseExplosion.rb:20:1333:20:2692 | if ... | | UseUseExplosion.rb:20:1354:20:2676 | if ... | UseUseExplosion.rb:20:1349:20:2676 | then ... | @@ -848,8 +784,7 @@ | UseUseExplosion.rb:20:1358:20:1362 | [post] self | UseUseExplosion.rb:20:2667:20:2672 | self | | UseUseExplosion.rb:20:1358:20:1362 | self | UseUseExplosion.rb:20:1379:20:1383 | self | | UseUseExplosion.rb:20:1358:20:1362 | self | UseUseExplosion.rb:20:2667:20:2672 | self | -| UseUseExplosion.rb:20:1358:20:1367 | ... > ... | UseUseExplosion.rb:20:1357:20:1368 | [false] ( ... ) | -| UseUseExplosion.rb:20:1358:20:1367 | ... > ... | UseUseExplosion.rb:20:1357:20:1368 | [true] ( ... ) | +| UseUseExplosion.rb:20:1358:20:1367 | ... > ... | UseUseExplosion.rb:20:1357:20:1368 | ( ... ) | | UseUseExplosion.rb:20:1366:20:1367 | 36 | UseUseExplosion.rb:20:1358:20:1367 | ... > ... | | UseUseExplosion.rb:20:1370:20:2660 | then ... | UseUseExplosion.rb:20:1354:20:2676 | if ... | | UseUseExplosion.rb:20:1375:20:2660 | if ... | UseUseExplosion.rb:20:1370:20:2660 | then ... | @@ -858,8 +793,7 @@ | UseUseExplosion.rb:20:1379:20:1383 | [post] self | UseUseExplosion.rb:20:2651:20:2656 | self | | UseUseExplosion.rb:20:1379:20:1383 | self | UseUseExplosion.rb:20:1400:20:1404 | self | | UseUseExplosion.rb:20:1379:20:1383 | self | UseUseExplosion.rb:20:2651:20:2656 | self | -| UseUseExplosion.rb:20:1379:20:1388 | ... > ... | UseUseExplosion.rb:20:1378:20:1389 | [false] ( ... ) | -| UseUseExplosion.rb:20:1379:20:1388 | ... > ... | UseUseExplosion.rb:20:1378:20:1389 | [true] ( ... ) | +| UseUseExplosion.rb:20:1379:20:1388 | ... > ... | UseUseExplosion.rb:20:1378:20:1389 | ( ... ) | | UseUseExplosion.rb:20:1387:20:1388 | 35 | UseUseExplosion.rb:20:1379:20:1388 | ... > ... | | UseUseExplosion.rb:20:1391:20:2644 | then ... | UseUseExplosion.rb:20:1375:20:2660 | if ... | | UseUseExplosion.rb:20:1396:20:2644 | if ... | UseUseExplosion.rb:20:1391:20:2644 | then ... | @@ -868,8 +802,7 @@ | UseUseExplosion.rb:20:1400:20:1404 | [post] self | UseUseExplosion.rb:20:2635:20:2640 | self | | UseUseExplosion.rb:20:1400:20:1404 | self | UseUseExplosion.rb:20:1421:20:1425 | self | | UseUseExplosion.rb:20:1400:20:1404 | self | UseUseExplosion.rb:20:2635:20:2640 | self | -| UseUseExplosion.rb:20:1400:20:1409 | ... > ... | UseUseExplosion.rb:20:1399:20:1410 | [false] ( ... ) | -| UseUseExplosion.rb:20:1400:20:1409 | ... > ... | UseUseExplosion.rb:20:1399:20:1410 | [true] ( ... ) | +| UseUseExplosion.rb:20:1400:20:1409 | ... > ... | UseUseExplosion.rb:20:1399:20:1410 | ( ... ) | | UseUseExplosion.rb:20:1408:20:1409 | 34 | UseUseExplosion.rb:20:1400:20:1409 | ... > ... | | UseUseExplosion.rb:20:1412:20:2628 | then ... | UseUseExplosion.rb:20:1396:20:2644 | if ... | | UseUseExplosion.rb:20:1417:20:2628 | if ... | UseUseExplosion.rb:20:1412:20:2628 | then ... | @@ -878,8 +811,7 @@ | UseUseExplosion.rb:20:1421:20:1425 | [post] self | UseUseExplosion.rb:20:2619:20:2624 | self | | UseUseExplosion.rb:20:1421:20:1425 | self | UseUseExplosion.rb:20:1442:20:1446 | self | | UseUseExplosion.rb:20:1421:20:1425 | self | UseUseExplosion.rb:20:2619:20:2624 | self | -| UseUseExplosion.rb:20:1421:20:1430 | ... > ... | UseUseExplosion.rb:20:1420:20:1431 | [false] ( ... ) | -| UseUseExplosion.rb:20:1421:20:1430 | ... > ... | UseUseExplosion.rb:20:1420:20:1431 | [true] ( ... ) | +| UseUseExplosion.rb:20:1421:20:1430 | ... > ... | UseUseExplosion.rb:20:1420:20:1431 | ( ... ) | | UseUseExplosion.rb:20:1429:20:1430 | 33 | UseUseExplosion.rb:20:1421:20:1430 | ... > ... | | UseUseExplosion.rb:20:1433:20:2612 | then ... | UseUseExplosion.rb:20:1417:20:2628 | if ... | | UseUseExplosion.rb:20:1438:20:2612 | if ... | UseUseExplosion.rb:20:1433:20:2612 | then ... | @@ -888,8 +820,7 @@ | UseUseExplosion.rb:20:1442:20:1446 | [post] self | UseUseExplosion.rb:20:2603:20:2608 | self | | UseUseExplosion.rb:20:1442:20:1446 | self | UseUseExplosion.rb:20:1463:20:1467 | self | | UseUseExplosion.rb:20:1442:20:1446 | self | UseUseExplosion.rb:20:2603:20:2608 | self | -| UseUseExplosion.rb:20:1442:20:1451 | ... > ... | UseUseExplosion.rb:20:1441:20:1452 | [false] ( ... ) | -| UseUseExplosion.rb:20:1442:20:1451 | ... > ... | UseUseExplosion.rb:20:1441:20:1452 | [true] ( ... ) | +| UseUseExplosion.rb:20:1442:20:1451 | ... > ... | UseUseExplosion.rb:20:1441:20:1452 | ( ... ) | | UseUseExplosion.rb:20:1450:20:1451 | 32 | UseUseExplosion.rb:20:1442:20:1451 | ... > ... | | UseUseExplosion.rb:20:1454:20:2596 | then ... | UseUseExplosion.rb:20:1438:20:2612 | if ... | | UseUseExplosion.rb:20:1459:20:2596 | if ... | UseUseExplosion.rb:20:1454:20:2596 | then ... | @@ -898,8 +829,7 @@ | UseUseExplosion.rb:20:1463:20:1467 | [post] self | UseUseExplosion.rb:20:2587:20:2592 | self | | UseUseExplosion.rb:20:1463:20:1467 | self | UseUseExplosion.rb:20:1484:20:1488 | self | | UseUseExplosion.rb:20:1463:20:1467 | self | UseUseExplosion.rb:20:2587:20:2592 | self | -| UseUseExplosion.rb:20:1463:20:1472 | ... > ... | UseUseExplosion.rb:20:1462:20:1473 | [false] ( ... ) | -| UseUseExplosion.rb:20:1463:20:1472 | ... > ... | UseUseExplosion.rb:20:1462:20:1473 | [true] ( ... ) | +| UseUseExplosion.rb:20:1463:20:1472 | ... > ... | UseUseExplosion.rb:20:1462:20:1473 | ( ... ) | | UseUseExplosion.rb:20:1471:20:1472 | 31 | UseUseExplosion.rb:20:1463:20:1472 | ... > ... | | UseUseExplosion.rb:20:1475:20:2580 | then ... | UseUseExplosion.rb:20:1459:20:2596 | if ... | | UseUseExplosion.rb:20:1480:20:2580 | if ... | UseUseExplosion.rb:20:1475:20:2580 | then ... | @@ -908,8 +838,7 @@ | UseUseExplosion.rb:20:1484:20:1488 | [post] self | UseUseExplosion.rb:20:2571:20:2576 | self | | UseUseExplosion.rb:20:1484:20:1488 | self | UseUseExplosion.rb:20:1505:20:1509 | self | | UseUseExplosion.rb:20:1484:20:1488 | self | UseUseExplosion.rb:20:2571:20:2576 | self | -| UseUseExplosion.rb:20:1484:20:1493 | ... > ... | UseUseExplosion.rb:20:1483:20:1494 | [false] ( ... ) | -| UseUseExplosion.rb:20:1484:20:1493 | ... > ... | UseUseExplosion.rb:20:1483:20:1494 | [true] ( ... ) | +| UseUseExplosion.rb:20:1484:20:1493 | ... > ... | UseUseExplosion.rb:20:1483:20:1494 | ( ... ) | | UseUseExplosion.rb:20:1492:20:1493 | 30 | UseUseExplosion.rb:20:1484:20:1493 | ... > ... | | UseUseExplosion.rb:20:1496:20:2564 | then ... | UseUseExplosion.rb:20:1480:20:2580 | if ... | | UseUseExplosion.rb:20:1501:20:2564 | if ... | UseUseExplosion.rb:20:1496:20:2564 | then ... | @@ -918,8 +847,7 @@ | UseUseExplosion.rb:20:1505:20:1509 | [post] self | UseUseExplosion.rb:20:2555:20:2560 | self | | UseUseExplosion.rb:20:1505:20:1509 | self | UseUseExplosion.rb:20:1526:20:1530 | self | | UseUseExplosion.rb:20:1505:20:1509 | self | UseUseExplosion.rb:20:2555:20:2560 | self | -| UseUseExplosion.rb:20:1505:20:1514 | ... > ... | UseUseExplosion.rb:20:1504:20:1515 | [false] ( ... ) | -| UseUseExplosion.rb:20:1505:20:1514 | ... > ... | UseUseExplosion.rb:20:1504:20:1515 | [true] ( ... ) | +| UseUseExplosion.rb:20:1505:20:1514 | ... > ... | UseUseExplosion.rb:20:1504:20:1515 | ( ... ) | | UseUseExplosion.rb:20:1513:20:1514 | 29 | UseUseExplosion.rb:20:1505:20:1514 | ... > ... | | UseUseExplosion.rb:20:1517:20:2548 | then ... | UseUseExplosion.rb:20:1501:20:2564 | if ... | | UseUseExplosion.rb:20:1522:20:2548 | if ... | UseUseExplosion.rb:20:1517:20:2548 | then ... | @@ -928,8 +856,7 @@ | UseUseExplosion.rb:20:1526:20:1530 | [post] self | UseUseExplosion.rb:20:2539:20:2544 | self | | UseUseExplosion.rb:20:1526:20:1530 | self | UseUseExplosion.rb:20:1547:20:1551 | self | | UseUseExplosion.rb:20:1526:20:1530 | self | UseUseExplosion.rb:20:2539:20:2544 | self | -| UseUseExplosion.rb:20:1526:20:1535 | ... > ... | UseUseExplosion.rb:20:1525:20:1536 | [false] ( ... ) | -| UseUseExplosion.rb:20:1526:20:1535 | ... > ... | UseUseExplosion.rb:20:1525:20:1536 | [true] ( ... ) | +| UseUseExplosion.rb:20:1526:20:1535 | ... > ... | UseUseExplosion.rb:20:1525:20:1536 | ( ... ) | | UseUseExplosion.rb:20:1534:20:1535 | 28 | UseUseExplosion.rb:20:1526:20:1535 | ... > ... | | UseUseExplosion.rb:20:1538:20:2532 | then ... | UseUseExplosion.rb:20:1522:20:2548 | if ... | | UseUseExplosion.rb:20:1543:20:2532 | if ... | UseUseExplosion.rb:20:1538:20:2532 | then ... | @@ -938,8 +865,7 @@ | UseUseExplosion.rb:20:1547:20:1551 | [post] self | UseUseExplosion.rb:20:2523:20:2528 | self | | UseUseExplosion.rb:20:1547:20:1551 | self | UseUseExplosion.rb:20:1568:20:1572 | self | | UseUseExplosion.rb:20:1547:20:1551 | self | UseUseExplosion.rb:20:2523:20:2528 | self | -| UseUseExplosion.rb:20:1547:20:1556 | ... > ... | UseUseExplosion.rb:20:1546:20:1557 | [false] ( ... ) | -| UseUseExplosion.rb:20:1547:20:1556 | ... > ... | UseUseExplosion.rb:20:1546:20:1557 | [true] ( ... ) | +| UseUseExplosion.rb:20:1547:20:1556 | ... > ... | UseUseExplosion.rb:20:1546:20:1557 | ( ... ) | | UseUseExplosion.rb:20:1555:20:1556 | 27 | UseUseExplosion.rb:20:1547:20:1556 | ... > ... | | UseUseExplosion.rb:20:1559:20:2516 | then ... | UseUseExplosion.rb:20:1543:20:2532 | if ... | | UseUseExplosion.rb:20:1564:20:2516 | if ... | UseUseExplosion.rb:20:1559:20:2516 | then ... | @@ -948,8 +874,7 @@ | UseUseExplosion.rb:20:1568:20:1572 | [post] self | UseUseExplosion.rb:20:2507:20:2512 | self | | UseUseExplosion.rb:20:1568:20:1572 | self | UseUseExplosion.rb:20:1589:20:1593 | self | | UseUseExplosion.rb:20:1568:20:1572 | self | UseUseExplosion.rb:20:2507:20:2512 | self | -| UseUseExplosion.rb:20:1568:20:1577 | ... > ... | UseUseExplosion.rb:20:1567:20:1578 | [false] ( ... ) | -| UseUseExplosion.rb:20:1568:20:1577 | ... > ... | UseUseExplosion.rb:20:1567:20:1578 | [true] ( ... ) | +| UseUseExplosion.rb:20:1568:20:1577 | ... > ... | UseUseExplosion.rb:20:1567:20:1578 | ( ... ) | | UseUseExplosion.rb:20:1576:20:1577 | 26 | UseUseExplosion.rb:20:1568:20:1577 | ... > ... | | UseUseExplosion.rb:20:1580:20:2500 | then ... | UseUseExplosion.rb:20:1564:20:2516 | if ... | | UseUseExplosion.rb:20:1585:20:2500 | if ... | UseUseExplosion.rb:20:1580:20:2500 | then ... | @@ -958,8 +883,7 @@ | UseUseExplosion.rb:20:1589:20:1593 | [post] self | UseUseExplosion.rb:20:2491:20:2496 | self | | UseUseExplosion.rb:20:1589:20:1593 | self | UseUseExplosion.rb:20:1610:20:1614 | self | | UseUseExplosion.rb:20:1589:20:1593 | self | UseUseExplosion.rb:20:2491:20:2496 | self | -| UseUseExplosion.rb:20:1589:20:1598 | ... > ... | UseUseExplosion.rb:20:1588:20:1599 | [false] ( ... ) | -| UseUseExplosion.rb:20:1589:20:1598 | ... > ... | UseUseExplosion.rb:20:1588:20:1599 | [true] ( ... ) | +| UseUseExplosion.rb:20:1589:20:1598 | ... > ... | UseUseExplosion.rb:20:1588:20:1599 | ( ... ) | | UseUseExplosion.rb:20:1597:20:1598 | 25 | UseUseExplosion.rb:20:1589:20:1598 | ... > ... | | UseUseExplosion.rb:20:1601:20:2484 | then ... | UseUseExplosion.rb:20:1585:20:2500 | if ... | | UseUseExplosion.rb:20:1606:20:2484 | if ... | UseUseExplosion.rb:20:1601:20:2484 | then ... | @@ -968,8 +892,7 @@ | UseUseExplosion.rb:20:1610:20:1614 | [post] self | UseUseExplosion.rb:20:2475:20:2480 | self | | UseUseExplosion.rb:20:1610:20:1614 | self | UseUseExplosion.rb:20:1631:20:1635 | self | | UseUseExplosion.rb:20:1610:20:1614 | self | UseUseExplosion.rb:20:2475:20:2480 | self | -| UseUseExplosion.rb:20:1610:20:1619 | ... > ... | UseUseExplosion.rb:20:1609:20:1620 | [false] ( ... ) | -| UseUseExplosion.rb:20:1610:20:1619 | ... > ... | UseUseExplosion.rb:20:1609:20:1620 | [true] ( ... ) | +| UseUseExplosion.rb:20:1610:20:1619 | ... > ... | UseUseExplosion.rb:20:1609:20:1620 | ( ... ) | | UseUseExplosion.rb:20:1618:20:1619 | 24 | UseUseExplosion.rb:20:1610:20:1619 | ... > ... | | UseUseExplosion.rb:20:1622:20:2468 | then ... | UseUseExplosion.rb:20:1606:20:2484 | if ... | | UseUseExplosion.rb:20:1627:20:2468 | if ... | UseUseExplosion.rb:20:1622:20:2468 | then ... | @@ -978,8 +901,7 @@ | UseUseExplosion.rb:20:1631:20:1635 | [post] self | UseUseExplosion.rb:20:2459:20:2464 | self | | UseUseExplosion.rb:20:1631:20:1635 | self | UseUseExplosion.rb:20:1652:20:1656 | self | | UseUseExplosion.rb:20:1631:20:1635 | self | UseUseExplosion.rb:20:2459:20:2464 | self | -| UseUseExplosion.rb:20:1631:20:1640 | ... > ... | UseUseExplosion.rb:20:1630:20:1641 | [false] ( ... ) | -| UseUseExplosion.rb:20:1631:20:1640 | ... > ... | UseUseExplosion.rb:20:1630:20:1641 | [true] ( ... ) | +| UseUseExplosion.rb:20:1631:20:1640 | ... > ... | UseUseExplosion.rb:20:1630:20:1641 | ( ... ) | | UseUseExplosion.rb:20:1639:20:1640 | 23 | UseUseExplosion.rb:20:1631:20:1640 | ... > ... | | UseUseExplosion.rb:20:1643:20:2452 | then ... | UseUseExplosion.rb:20:1627:20:2468 | if ... | | UseUseExplosion.rb:20:1648:20:2452 | if ... | UseUseExplosion.rb:20:1643:20:2452 | then ... | @@ -988,8 +910,7 @@ | UseUseExplosion.rb:20:1652:20:1656 | [post] self | UseUseExplosion.rb:20:2443:20:2448 | self | | UseUseExplosion.rb:20:1652:20:1656 | self | UseUseExplosion.rb:20:1673:20:1677 | self | | UseUseExplosion.rb:20:1652:20:1656 | self | UseUseExplosion.rb:20:2443:20:2448 | self | -| UseUseExplosion.rb:20:1652:20:1661 | ... > ... | UseUseExplosion.rb:20:1651:20:1662 | [false] ( ... ) | -| UseUseExplosion.rb:20:1652:20:1661 | ... > ... | UseUseExplosion.rb:20:1651:20:1662 | [true] ( ... ) | +| UseUseExplosion.rb:20:1652:20:1661 | ... > ... | UseUseExplosion.rb:20:1651:20:1662 | ( ... ) | | UseUseExplosion.rb:20:1660:20:1661 | 22 | UseUseExplosion.rb:20:1652:20:1661 | ... > ... | | UseUseExplosion.rb:20:1664:20:2436 | then ... | UseUseExplosion.rb:20:1648:20:2452 | if ... | | UseUseExplosion.rb:20:1669:20:2436 | if ... | UseUseExplosion.rb:20:1664:20:2436 | then ... | @@ -998,8 +919,7 @@ | UseUseExplosion.rb:20:1673:20:1677 | [post] self | UseUseExplosion.rb:20:2427:20:2432 | self | | UseUseExplosion.rb:20:1673:20:1677 | self | UseUseExplosion.rb:20:1694:20:1698 | self | | UseUseExplosion.rb:20:1673:20:1677 | self | UseUseExplosion.rb:20:2427:20:2432 | self | -| UseUseExplosion.rb:20:1673:20:1682 | ... > ... | UseUseExplosion.rb:20:1672:20:1683 | [false] ( ... ) | -| UseUseExplosion.rb:20:1673:20:1682 | ... > ... | UseUseExplosion.rb:20:1672:20:1683 | [true] ( ... ) | +| UseUseExplosion.rb:20:1673:20:1682 | ... > ... | UseUseExplosion.rb:20:1672:20:1683 | ( ... ) | | UseUseExplosion.rb:20:1681:20:1682 | 21 | UseUseExplosion.rb:20:1673:20:1682 | ... > ... | | UseUseExplosion.rb:20:1685:20:2420 | then ... | UseUseExplosion.rb:20:1669:20:2436 | if ... | | UseUseExplosion.rb:20:1690:20:2420 | if ... | UseUseExplosion.rb:20:1685:20:2420 | then ... | @@ -1008,8 +928,7 @@ | UseUseExplosion.rb:20:1694:20:1698 | [post] self | UseUseExplosion.rb:20:2411:20:2416 | self | | UseUseExplosion.rb:20:1694:20:1698 | self | UseUseExplosion.rb:20:1715:20:1719 | self | | UseUseExplosion.rb:20:1694:20:1698 | self | UseUseExplosion.rb:20:2411:20:2416 | self | -| UseUseExplosion.rb:20:1694:20:1703 | ... > ... | UseUseExplosion.rb:20:1693:20:1704 | [false] ( ... ) | -| UseUseExplosion.rb:20:1694:20:1703 | ... > ... | UseUseExplosion.rb:20:1693:20:1704 | [true] ( ... ) | +| UseUseExplosion.rb:20:1694:20:1703 | ... > ... | UseUseExplosion.rb:20:1693:20:1704 | ( ... ) | | UseUseExplosion.rb:20:1702:20:1703 | 20 | UseUseExplosion.rb:20:1694:20:1703 | ... > ... | | UseUseExplosion.rb:20:1706:20:2404 | then ... | UseUseExplosion.rb:20:1690:20:2420 | if ... | | UseUseExplosion.rb:20:1711:20:2404 | if ... | UseUseExplosion.rb:20:1706:20:2404 | then ... | @@ -1018,8 +937,7 @@ | UseUseExplosion.rb:20:1715:20:1719 | [post] self | UseUseExplosion.rb:20:2395:20:2400 | self | | UseUseExplosion.rb:20:1715:20:1719 | self | UseUseExplosion.rb:20:1736:20:1740 | self | | UseUseExplosion.rb:20:1715:20:1719 | self | UseUseExplosion.rb:20:2395:20:2400 | self | -| UseUseExplosion.rb:20:1715:20:1724 | ... > ... | UseUseExplosion.rb:20:1714:20:1725 | [false] ( ... ) | -| UseUseExplosion.rb:20:1715:20:1724 | ... > ... | UseUseExplosion.rb:20:1714:20:1725 | [true] ( ... ) | +| UseUseExplosion.rb:20:1715:20:1724 | ... > ... | UseUseExplosion.rb:20:1714:20:1725 | ( ... ) | | UseUseExplosion.rb:20:1723:20:1724 | 19 | UseUseExplosion.rb:20:1715:20:1724 | ... > ... | | UseUseExplosion.rb:20:1727:20:2388 | then ... | UseUseExplosion.rb:20:1711:20:2404 | if ... | | UseUseExplosion.rb:20:1732:20:2388 | if ... | UseUseExplosion.rb:20:1727:20:2388 | then ... | @@ -1028,8 +946,7 @@ | UseUseExplosion.rb:20:1736:20:1740 | [post] self | UseUseExplosion.rb:20:2379:20:2384 | self | | UseUseExplosion.rb:20:1736:20:1740 | self | UseUseExplosion.rb:20:1757:20:1761 | self | | UseUseExplosion.rb:20:1736:20:1740 | self | UseUseExplosion.rb:20:2379:20:2384 | self | -| UseUseExplosion.rb:20:1736:20:1745 | ... > ... | UseUseExplosion.rb:20:1735:20:1746 | [false] ( ... ) | -| UseUseExplosion.rb:20:1736:20:1745 | ... > ... | UseUseExplosion.rb:20:1735:20:1746 | [true] ( ... ) | +| UseUseExplosion.rb:20:1736:20:1745 | ... > ... | UseUseExplosion.rb:20:1735:20:1746 | ( ... ) | | UseUseExplosion.rb:20:1744:20:1745 | 18 | UseUseExplosion.rb:20:1736:20:1745 | ... > ... | | UseUseExplosion.rb:20:1748:20:2372 | then ... | UseUseExplosion.rb:20:1732:20:2388 | if ... | | UseUseExplosion.rb:20:1753:20:2372 | if ... | UseUseExplosion.rb:20:1748:20:2372 | then ... | @@ -1038,8 +955,7 @@ | UseUseExplosion.rb:20:1757:20:1761 | [post] self | UseUseExplosion.rb:20:2363:20:2368 | self | | UseUseExplosion.rb:20:1757:20:1761 | self | UseUseExplosion.rb:20:1778:20:1782 | self | | UseUseExplosion.rb:20:1757:20:1761 | self | UseUseExplosion.rb:20:2363:20:2368 | self | -| UseUseExplosion.rb:20:1757:20:1766 | ... > ... | UseUseExplosion.rb:20:1756:20:1767 | [false] ( ... ) | -| UseUseExplosion.rb:20:1757:20:1766 | ... > ... | UseUseExplosion.rb:20:1756:20:1767 | [true] ( ... ) | +| UseUseExplosion.rb:20:1757:20:1766 | ... > ... | UseUseExplosion.rb:20:1756:20:1767 | ( ... ) | | UseUseExplosion.rb:20:1765:20:1766 | 17 | UseUseExplosion.rb:20:1757:20:1766 | ... > ... | | UseUseExplosion.rb:20:1769:20:2356 | then ... | UseUseExplosion.rb:20:1753:20:2372 | if ... | | UseUseExplosion.rb:20:1774:20:2356 | if ... | UseUseExplosion.rb:20:1769:20:2356 | then ... | @@ -1048,8 +964,7 @@ | UseUseExplosion.rb:20:1778:20:1782 | [post] self | UseUseExplosion.rb:20:2347:20:2352 | self | | UseUseExplosion.rb:20:1778:20:1782 | self | UseUseExplosion.rb:20:1799:20:1803 | self | | UseUseExplosion.rb:20:1778:20:1782 | self | UseUseExplosion.rb:20:2347:20:2352 | self | -| UseUseExplosion.rb:20:1778:20:1787 | ... > ... | UseUseExplosion.rb:20:1777:20:1788 | [false] ( ... ) | -| UseUseExplosion.rb:20:1778:20:1787 | ... > ... | UseUseExplosion.rb:20:1777:20:1788 | [true] ( ... ) | +| UseUseExplosion.rb:20:1778:20:1787 | ... > ... | UseUseExplosion.rb:20:1777:20:1788 | ( ... ) | | UseUseExplosion.rb:20:1786:20:1787 | 16 | UseUseExplosion.rb:20:1778:20:1787 | ... > ... | | UseUseExplosion.rb:20:1790:20:2340 | then ... | UseUseExplosion.rb:20:1774:20:2356 | if ... | | UseUseExplosion.rb:20:1795:20:2340 | if ... | UseUseExplosion.rb:20:1790:20:2340 | then ... | @@ -1058,8 +973,7 @@ | UseUseExplosion.rb:20:1799:20:1803 | [post] self | UseUseExplosion.rb:20:2331:20:2336 | self | | UseUseExplosion.rb:20:1799:20:1803 | self | UseUseExplosion.rb:20:1820:20:1824 | self | | UseUseExplosion.rb:20:1799:20:1803 | self | UseUseExplosion.rb:20:2331:20:2336 | self | -| UseUseExplosion.rb:20:1799:20:1808 | ... > ... | UseUseExplosion.rb:20:1798:20:1809 | [false] ( ... ) | -| UseUseExplosion.rb:20:1799:20:1808 | ... > ... | UseUseExplosion.rb:20:1798:20:1809 | [true] ( ... ) | +| UseUseExplosion.rb:20:1799:20:1808 | ... > ... | UseUseExplosion.rb:20:1798:20:1809 | ( ... ) | | UseUseExplosion.rb:20:1807:20:1808 | 15 | UseUseExplosion.rb:20:1799:20:1808 | ... > ... | | UseUseExplosion.rb:20:1811:20:2324 | then ... | UseUseExplosion.rb:20:1795:20:2340 | if ... | | UseUseExplosion.rb:20:1816:20:2324 | if ... | UseUseExplosion.rb:20:1811:20:2324 | then ... | @@ -1068,8 +982,7 @@ | UseUseExplosion.rb:20:1820:20:1824 | [post] self | UseUseExplosion.rb:20:2315:20:2320 | self | | UseUseExplosion.rb:20:1820:20:1824 | self | UseUseExplosion.rb:20:1841:20:1845 | self | | UseUseExplosion.rb:20:1820:20:1824 | self | UseUseExplosion.rb:20:2315:20:2320 | self | -| UseUseExplosion.rb:20:1820:20:1829 | ... > ... | UseUseExplosion.rb:20:1819:20:1830 | [false] ( ... ) | -| UseUseExplosion.rb:20:1820:20:1829 | ... > ... | UseUseExplosion.rb:20:1819:20:1830 | [true] ( ... ) | +| UseUseExplosion.rb:20:1820:20:1829 | ... > ... | UseUseExplosion.rb:20:1819:20:1830 | ( ... ) | | UseUseExplosion.rb:20:1828:20:1829 | 14 | UseUseExplosion.rb:20:1820:20:1829 | ... > ... | | UseUseExplosion.rb:20:1832:20:2308 | then ... | UseUseExplosion.rb:20:1816:20:2324 | if ... | | UseUseExplosion.rb:20:1837:20:2308 | if ... | UseUseExplosion.rb:20:1832:20:2308 | then ... | @@ -1078,8 +991,7 @@ | UseUseExplosion.rb:20:1841:20:1845 | [post] self | UseUseExplosion.rb:20:2299:20:2304 | self | | UseUseExplosion.rb:20:1841:20:1845 | self | UseUseExplosion.rb:20:1862:20:1866 | self | | UseUseExplosion.rb:20:1841:20:1845 | self | UseUseExplosion.rb:20:2299:20:2304 | self | -| UseUseExplosion.rb:20:1841:20:1850 | ... > ... | UseUseExplosion.rb:20:1840:20:1851 | [false] ( ... ) | -| UseUseExplosion.rb:20:1841:20:1850 | ... > ... | UseUseExplosion.rb:20:1840:20:1851 | [true] ( ... ) | +| UseUseExplosion.rb:20:1841:20:1850 | ... > ... | UseUseExplosion.rb:20:1840:20:1851 | ( ... ) | | UseUseExplosion.rb:20:1849:20:1850 | 13 | UseUseExplosion.rb:20:1841:20:1850 | ... > ... | | UseUseExplosion.rb:20:1853:20:2292 | then ... | UseUseExplosion.rb:20:1837:20:2308 | if ... | | UseUseExplosion.rb:20:1858:20:2292 | if ... | UseUseExplosion.rb:20:1853:20:2292 | then ... | @@ -1088,8 +1000,7 @@ | UseUseExplosion.rb:20:1862:20:1866 | [post] self | UseUseExplosion.rb:20:2283:20:2288 | self | | UseUseExplosion.rb:20:1862:20:1866 | self | UseUseExplosion.rb:20:1883:20:1887 | self | | UseUseExplosion.rb:20:1862:20:1866 | self | UseUseExplosion.rb:20:2283:20:2288 | self | -| UseUseExplosion.rb:20:1862:20:1871 | ... > ... | UseUseExplosion.rb:20:1861:20:1872 | [false] ( ... ) | -| UseUseExplosion.rb:20:1862:20:1871 | ... > ... | UseUseExplosion.rb:20:1861:20:1872 | [true] ( ... ) | +| UseUseExplosion.rb:20:1862:20:1871 | ... > ... | UseUseExplosion.rb:20:1861:20:1872 | ( ... ) | | UseUseExplosion.rb:20:1870:20:1871 | 12 | UseUseExplosion.rb:20:1862:20:1871 | ... > ... | | UseUseExplosion.rb:20:1874:20:2276 | then ... | UseUseExplosion.rb:20:1858:20:2292 | if ... | | UseUseExplosion.rb:20:1879:20:2276 | if ... | UseUseExplosion.rb:20:1874:20:2276 | then ... | @@ -1098,8 +1009,7 @@ | UseUseExplosion.rb:20:1883:20:1887 | [post] self | UseUseExplosion.rb:20:2267:20:2272 | self | | UseUseExplosion.rb:20:1883:20:1887 | self | UseUseExplosion.rb:20:1904:20:1908 | self | | UseUseExplosion.rb:20:1883:20:1887 | self | UseUseExplosion.rb:20:2267:20:2272 | self | -| UseUseExplosion.rb:20:1883:20:1892 | ... > ... | UseUseExplosion.rb:20:1882:20:1893 | [false] ( ... ) | -| UseUseExplosion.rb:20:1883:20:1892 | ... > ... | UseUseExplosion.rb:20:1882:20:1893 | [true] ( ... ) | +| UseUseExplosion.rb:20:1883:20:1892 | ... > ... | UseUseExplosion.rb:20:1882:20:1893 | ( ... ) | | UseUseExplosion.rb:20:1891:20:1892 | 11 | UseUseExplosion.rb:20:1883:20:1892 | ... > ... | | UseUseExplosion.rb:20:1895:20:2260 | then ... | UseUseExplosion.rb:20:1879:20:2276 | if ... | | UseUseExplosion.rb:20:1900:20:2260 | if ... | UseUseExplosion.rb:20:1895:20:2260 | then ... | @@ -1108,8 +1018,7 @@ | UseUseExplosion.rb:20:1904:20:1908 | [post] self | UseUseExplosion.rb:20:2251:20:2256 | self | | UseUseExplosion.rb:20:1904:20:1908 | self | UseUseExplosion.rb:20:1925:20:1929 | self | | UseUseExplosion.rb:20:1904:20:1908 | self | UseUseExplosion.rb:20:2251:20:2256 | self | -| UseUseExplosion.rb:20:1904:20:1913 | ... > ... | UseUseExplosion.rb:20:1903:20:1914 | [false] ( ... ) | -| UseUseExplosion.rb:20:1904:20:1913 | ... > ... | UseUseExplosion.rb:20:1903:20:1914 | [true] ( ... ) | +| UseUseExplosion.rb:20:1904:20:1913 | ... > ... | UseUseExplosion.rb:20:1903:20:1914 | ( ... ) | | UseUseExplosion.rb:20:1912:20:1913 | 10 | UseUseExplosion.rb:20:1904:20:1913 | ... > ... | | UseUseExplosion.rb:20:1916:20:2244 | then ... | UseUseExplosion.rb:20:1900:20:2260 | if ... | | UseUseExplosion.rb:20:1921:20:2244 | if ... | UseUseExplosion.rb:20:1916:20:2244 | then ... | @@ -1118,8 +1027,7 @@ | UseUseExplosion.rb:20:1925:20:1929 | [post] self | UseUseExplosion.rb:20:2235:20:2240 | self | | UseUseExplosion.rb:20:1925:20:1929 | self | UseUseExplosion.rb:20:1945:20:1949 | self | | UseUseExplosion.rb:20:1925:20:1929 | self | UseUseExplosion.rb:20:2235:20:2240 | self | -| UseUseExplosion.rb:20:1925:20:1933 | ... > ... | UseUseExplosion.rb:20:1924:20:1934 | [false] ( ... ) | -| UseUseExplosion.rb:20:1925:20:1933 | ... > ... | UseUseExplosion.rb:20:1924:20:1934 | [true] ( ... ) | +| UseUseExplosion.rb:20:1925:20:1933 | ... > ... | UseUseExplosion.rb:20:1924:20:1934 | ( ... ) | | UseUseExplosion.rb:20:1933:20:1933 | 9 | UseUseExplosion.rb:20:1925:20:1933 | ... > ... | | UseUseExplosion.rb:20:1936:20:2228 | then ... | UseUseExplosion.rb:20:1921:20:2244 | if ... | | UseUseExplosion.rb:20:1941:20:2228 | if ... | UseUseExplosion.rb:20:1936:20:2228 | then ... | @@ -1128,8 +1036,7 @@ | UseUseExplosion.rb:20:1945:20:1949 | [post] self | UseUseExplosion.rb:20:2219:20:2224 | self | | UseUseExplosion.rb:20:1945:20:1949 | self | UseUseExplosion.rb:20:1965:20:1969 | self | | UseUseExplosion.rb:20:1945:20:1949 | self | UseUseExplosion.rb:20:2219:20:2224 | self | -| UseUseExplosion.rb:20:1945:20:1953 | ... > ... | UseUseExplosion.rb:20:1944:20:1954 | [false] ( ... ) | -| UseUseExplosion.rb:20:1945:20:1953 | ... > ... | UseUseExplosion.rb:20:1944:20:1954 | [true] ( ... ) | +| UseUseExplosion.rb:20:1945:20:1953 | ... > ... | UseUseExplosion.rb:20:1944:20:1954 | ( ... ) | | UseUseExplosion.rb:20:1953:20:1953 | 8 | UseUseExplosion.rb:20:1945:20:1953 | ... > ... | | UseUseExplosion.rb:20:1956:20:2212 | then ... | UseUseExplosion.rb:20:1941:20:2228 | if ... | | UseUseExplosion.rb:20:1961:20:2212 | if ... | UseUseExplosion.rb:20:1956:20:2212 | then ... | @@ -1138,8 +1045,7 @@ | UseUseExplosion.rb:20:1965:20:1969 | [post] self | UseUseExplosion.rb:20:2203:20:2208 | self | | UseUseExplosion.rb:20:1965:20:1969 | self | UseUseExplosion.rb:20:1985:20:1989 | self | | UseUseExplosion.rb:20:1965:20:1969 | self | UseUseExplosion.rb:20:2203:20:2208 | self | -| UseUseExplosion.rb:20:1965:20:1973 | ... > ... | UseUseExplosion.rb:20:1964:20:1974 | [false] ( ... ) | -| UseUseExplosion.rb:20:1965:20:1973 | ... > ... | UseUseExplosion.rb:20:1964:20:1974 | [true] ( ... ) | +| UseUseExplosion.rb:20:1965:20:1973 | ... > ... | UseUseExplosion.rb:20:1964:20:1974 | ( ... ) | | UseUseExplosion.rb:20:1973:20:1973 | 7 | UseUseExplosion.rb:20:1965:20:1973 | ... > ... | | UseUseExplosion.rb:20:1976:20:2196 | then ... | UseUseExplosion.rb:20:1961:20:2212 | if ... | | UseUseExplosion.rb:20:1981:20:2196 | if ... | UseUseExplosion.rb:20:1976:20:2196 | then ... | @@ -1148,8 +1054,7 @@ | UseUseExplosion.rb:20:1985:20:1989 | [post] self | UseUseExplosion.rb:20:2187:20:2192 | self | | UseUseExplosion.rb:20:1985:20:1989 | self | UseUseExplosion.rb:20:2005:20:2009 | self | | UseUseExplosion.rb:20:1985:20:1989 | self | UseUseExplosion.rb:20:2187:20:2192 | self | -| UseUseExplosion.rb:20:1985:20:1993 | ... > ... | UseUseExplosion.rb:20:1984:20:1994 | [false] ( ... ) | -| UseUseExplosion.rb:20:1985:20:1993 | ... > ... | UseUseExplosion.rb:20:1984:20:1994 | [true] ( ... ) | +| UseUseExplosion.rb:20:1985:20:1993 | ... > ... | UseUseExplosion.rb:20:1984:20:1994 | ( ... ) | | UseUseExplosion.rb:20:1993:20:1993 | 6 | UseUseExplosion.rb:20:1985:20:1993 | ... > ... | | UseUseExplosion.rb:20:1996:20:2180 | then ... | UseUseExplosion.rb:20:1981:20:2196 | if ... | | UseUseExplosion.rb:20:2001:20:2180 | if ... | UseUseExplosion.rb:20:1996:20:2180 | then ... | @@ -1158,8 +1063,7 @@ | UseUseExplosion.rb:20:2005:20:2009 | [post] self | UseUseExplosion.rb:20:2171:20:2176 | self | | UseUseExplosion.rb:20:2005:20:2009 | self | UseUseExplosion.rb:20:2025:20:2029 | self | | UseUseExplosion.rb:20:2005:20:2009 | self | UseUseExplosion.rb:20:2171:20:2176 | self | -| UseUseExplosion.rb:20:2005:20:2013 | ... > ... | UseUseExplosion.rb:20:2004:20:2014 | [false] ( ... ) | -| UseUseExplosion.rb:20:2005:20:2013 | ... > ... | UseUseExplosion.rb:20:2004:20:2014 | [true] ( ... ) | +| UseUseExplosion.rb:20:2005:20:2013 | ... > ... | UseUseExplosion.rb:20:2004:20:2014 | ( ... ) | | UseUseExplosion.rb:20:2013:20:2013 | 5 | UseUseExplosion.rb:20:2005:20:2013 | ... > ... | | UseUseExplosion.rb:20:2016:20:2164 | then ... | UseUseExplosion.rb:20:2001:20:2180 | if ... | | UseUseExplosion.rb:20:2021:20:2164 | if ... | UseUseExplosion.rb:20:2016:20:2164 | then ... | @@ -1168,8 +1072,7 @@ | UseUseExplosion.rb:20:2025:20:2029 | [post] self | UseUseExplosion.rb:20:2155:20:2160 | self | | UseUseExplosion.rb:20:2025:20:2029 | self | UseUseExplosion.rb:20:2045:20:2049 | self | | UseUseExplosion.rb:20:2025:20:2029 | self | UseUseExplosion.rb:20:2155:20:2160 | self | -| UseUseExplosion.rb:20:2025:20:2033 | ... > ... | UseUseExplosion.rb:20:2024:20:2034 | [false] ( ... ) | -| UseUseExplosion.rb:20:2025:20:2033 | ... > ... | UseUseExplosion.rb:20:2024:20:2034 | [true] ( ... ) | +| UseUseExplosion.rb:20:2025:20:2033 | ... > ... | UseUseExplosion.rb:20:2024:20:2034 | ( ... ) | | UseUseExplosion.rb:20:2033:20:2033 | 4 | UseUseExplosion.rb:20:2025:20:2033 | ... > ... | | UseUseExplosion.rb:20:2036:20:2148 | then ... | UseUseExplosion.rb:20:2021:20:2164 | if ... | | UseUseExplosion.rb:20:2041:20:2148 | if ... | UseUseExplosion.rb:20:2036:20:2148 | then ... | @@ -1178,8 +1081,7 @@ | UseUseExplosion.rb:20:2045:20:2049 | [post] self | UseUseExplosion.rb:20:2139:20:2144 | self | | UseUseExplosion.rb:20:2045:20:2049 | self | UseUseExplosion.rb:20:2065:20:2069 | self | | UseUseExplosion.rb:20:2045:20:2049 | self | UseUseExplosion.rb:20:2139:20:2144 | self | -| UseUseExplosion.rb:20:2045:20:2053 | ... > ... | UseUseExplosion.rb:20:2044:20:2054 | [false] ( ... ) | -| UseUseExplosion.rb:20:2045:20:2053 | ... > ... | UseUseExplosion.rb:20:2044:20:2054 | [true] ( ... ) | +| UseUseExplosion.rb:20:2045:20:2053 | ... > ... | UseUseExplosion.rb:20:2044:20:2054 | ( ... ) | | UseUseExplosion.rb:20:2053:20:2053 | 3 | UseUseExplosion.rb:20:2045:20:2053 | ... > ... | | UseUseExplosion.rb:20:2056:20:2132 | then ... | UseUseExplosion.rb:20:2041:20:2148 | if ... | | UseUseExplosion.rb:20:2061:20:2132 | if ... | UseUseExplosion.rb:20:2056:20:2132 | then ... | @@ -1188,8 +1090,7 @@ | UseUseExplosion.rb:20:2065:20:2069 | [post] self | UseUseExplosion.rb:20:2123:20:2128 | self | | UseUseExplosion.rb:20:2065:20:2069 | self | UseUseExplosion.rb:20:2085:20:2089 | self | | UseUseExplosion.rb:20:2065:20:2069 | self | UseUseExplosion.rb:20:2123:20:2128 | self | -| UseUseExplosion.rb:20:2065:20:2073 | ... > ... | UseUseExplosion.rb:20:2064:20:2074 | [false] ( ... ) | -| UseUseExplosion.rb:20:2065:20:2073 | ... > ... | UseUseExplosion.rb:20:2064:20:2074 | [true] ( ... ) | +| UseUseExplosion.rb:20:2065:20:2073 | ... > ... | UseUseExplosion.rb:20:2064:20:2074 | ( ... ) | | UseUseExplosion.rb:20:2073:20:2073 | 2 | UseUseExplosion.rb:20:2065:20:2073 | ... > ... | | UseUseExplosion.rb:20:2076:20:2116 | then ... | UseUseExplosion.rb:20:2061:20:2132 | if ... | | UseUseExplosion.rb:20:2081:20:2116 | if ... | UseUseExplosion.rb:20:2076:20:2116 | then ... | @@ -1198,8 +1099,7 @@ | UseUseExplosion.rb:20:2085:20:2089 | [post] self | UseUseExplosion.rb:20:2107:20:2112 | self | | UseUseExplosion.rb:20:2085:20:2089 | self | UseUseExplosion.rb:20:2096:20:2099 | [input] SSA phi read(self) | | UseUseExplosion.rb:20:2085:20:2089 | self | UseUseExplosion.rb:20:2107:20:2112 | self | -| UseUseExplosion.rb:20:2085:20:2093 | ... > ... | UseUseExplosion.rb:20:2084:20:2094 | [false] ( ... ) | -| UseUseExplosion.rb:20:2085:20:2093 | ... > ... | UseUseExplosion.rb:20:2084:20:2094 | [true] ( ... ) | +| UseUseExplosion.rb:20:2085:20:2093 | ... > ... | UseUseExplosion.rb:20:2084:20:2094 | ( ... ) | | UseUseExplosion.rb:20:2093:20:2093 | 1 | UseUseExplosion.rb:20:2085:20:2093 | ... > ... | | UseUseExplosion.rb:20:2096:20:2099 | [input] SSA phi read(self) | UseUseExplosion.rb:21:13:21:17 | self | | UseUseExplosion.rb:20:2096:20:2099 | [input] SSA phi read(x) | UseUseExplosion.rb:20:9:20:3700 | SSA phi read(x) | @@ -1709,8 +1609,7 @@ | UseUseExplosion.rb:21:13:21:17 | [post] self | UseUseExplosion.rb:21:3691:21:3696 | self | | UseUseExplosion.rb:21:13:21:17 | self | UseUseExplosion.rb:21:35:21:39 | self | | UseUseExplosion.rb:21:13:21:17 | self | UseUseExplosion.rb:21:3691:21:3696 | self | -| UseUseExplosion.rb:21:13:21:23 | ... > ... | UseUseExplosion.rb:21:12:21:24 | [false] ( ... ) | -| UseUseExplosion.rb:21:13:21:23 | ... > ... | UseUseExplosion.rb:21:12:21:24 | [true] ( ... ) | +| UseUseExplosion.rb:21:13:21:23 | ... > ... | UseUseExplosion.rb:21:12:21:24 | ( ... ) | | UseUseExplosion.rb:21:21:21:23 | 100 | UseUseExplosion.rb:21:13:21:23 | ... > ... | | UseUseExplosion.rb:21:26:21:3684 | then ... | UseUseExplosion.rb:21:9:21:3700 | if ... | | UseUseExplosion.rb:21:31:21:3684 | if ... | UseUseExplosion.rb:21:26:21:3684 | then ... | @@ -1719,8 +1618,7 @@ | UseUseExplosion.rb:21:35:21:39 | [post] self | UseUseExplosion.rb:21:3675:21:3680 | self | | UseUseExplosion.rb:21:35:21:39 | self | UseUseExplosion.rb:21:56:21:60 | self | | UseUseExplosion.rb:21:35:21:39 | self | UseUseExplosion.rb:21:3675:21:3680 | self | -| UseUseExplosion.rb:21:35:21:44 | ... > ... | UseUseExplosion.rb:21:34:21:45 | [false] ( ... ) | -| UseUseExplosion.rb:21:35:21:44 | ... > ... | UseUseExplosion.rb:21:34:21:45 | [true] ( ... ) | +| UseUseExplosion.rb:21:35:21:44 | ... > ... | UseUseExplosion.rb:21:34:21:45 | ( ... ) | | UseUseExplosion.rb:21:43:21:44 | 99 | UseUseExplosion.rb:21:35:21:44 | ... > ... | | UseUseExplosion.rb:21:47:21:3668 | then ... | UseUseExplosion.rb:21:31:21:3684 | if ... | | UseUseExplosion.rb:21:52:21:3668 | if ... | UseUseExplosion.rb:21:47:21:3668 | then ... | @@ -1729,8 +1627,7 @@ | UseUseExplosion.rb:21:56:21:60 | [post] self | UseUseExplosion.rb:21:3659:21:3664 | self | | UseUseExplosion.rb:21:56:21:60 | self | UseUseExplosion.rb:21:77:21:81 | self | | UseUseExplosion.rb:21:56:21:60 | self | UseUseExplosion.rb:21:3659:21:3664 | self | -| UseUseExplosion.rb:21:56:21:65 | ... > ... | UseUseExplosion.rb:21:55:21:66 | [false] ( ... ) | -| UseUseExplosion.rb:21:56:21:65 | ... > ... | UseUseExplosion.rb:21:55:21:66 | [true] ( ... ) | +| UseUseExplosion.rb:21:56:21:65 | ... > ... | UseUseExplosion.rb:21:55:21:66 | ( ... ) | | UseUseExplosion.rb:21:64:21:65 | 98 | UseUseExplosion.rb:21:56:21:65 | ... > ... | | UseUseExplosion.rb:21:68:21:3652 | then ... | UseUseExplosion.rb:21:52:21:3668 | if ... | | UseUseExplosion.rb:21:73:21:3652 | if ... | UseUseExplosion.rb:21:68:21:3652 | then ... | @@ -1739,8 +1636,7 @@ | UseUseExplosion.rb:21:77:21:81 | [post] self | UseUseExplosion.rb:21:3643:21:3648 | self | | UseUseExplosion.rb:21:77:21:81 | self | UseUseExplosion.rb:21:98:21:102 | self | | UseUseExplosion.rb:21:77:21:81 | self | UseUseExplosion.rb:21:3643:21:3648 | self | -| UseUseExplosion.rb:21:77:21:86 | ... > ... | UseUseExplosion.rb:21:76:21:87 | [false] ( ... ) | -| UseUseExplosion.rb:21:77:21:86 | ... > ... | UseUseExplosion.rb:21:76:21:87 | [true] ( ... ) | +| UseUseExplosion.rb:21:77:21:86 | ... > ... | UseUseExplosion.rb:21:76:21:87 | ( ... ) | | UseUseExplosion.rb:21:85:21:86 | 97 | UseUseExplosion.rb:21:77:21:86 | ... > ... | | UseUseExplosion.rb:21:89:21:3636 | then ... | UseUseExplosion.rb:21:73:21:3652 | if ... | | UseUseExplosion.rb:21:94:21:3636 | if ... | UseUseExplosion.rb:21:89:21:3636 | then ... | @@ -1749,8 +1645,7 @@ | UseUseExplosion.rb:21:98:21:102 | [post] self | UseUseExplosion.rb:21:3627:21:3632 | self | | UseUseExplosion.rb:21:98:21:102 | self | UseUseExplosion.rb:21:119:21:123 | self | | UseUseExplosion.rb:21:98:21:102 | self | UseUseExplosion.rb:21:3627:21:3632 | self | -| UseUseExplosion.rb:21:98:21:107 | ... > ... | UseUseExplosion.rb:21:97:21:108 | [false] ( ... ) | -| UseUseExplosion.rb:21:98:21:107 | ... > ... | UseUseExplosion.rb:21:97:21:108 | [true] ( ... ) | +| UseUseExplosion.rb:21:98:21:107 | ... > ... | UseUseExplosion.rb:21:97:21:108 | ( ... ) | | UseUseExplosion.rb:21:106:21:107 | 96 | UseUseExplosion.rb:21:98:21:107 | ... > ... | | UseUseExplosion.rb:21:110:21:3620 | then ... | UseUseExplosion.rb:21:94:21:3636 | if ... | | UseUseExplosion.rb:21:115:21:3620 | if ... | UseUseExplosion.rb:21:110:21:3620 | then ... | @@ -1759,8 +1654,7 @@ | UseUseExplosion.rb:21:119:21:123 | [post] self | UseUseExplosion.rb:21:3611:21:3616 | self | | UseUseExplosion.rb:21:119:21:123 | self | UseUseExplosion.rb:21:140:21:144 | self | | UseUseExplosion.rb:21:119:21:123 | self | UseUseExplosion.rb:21:3611:21:3616 | self | -| UseUseExplosion.rb:21:119:21:128 | ... > ... | UseUseExplosion.rb:21:118:21:129 | [false] ( ... ) | -| UseUseExplosion.rb:21:119:21:128 | ... > ... | UseUseExplosion.rb:21:118:21:129 | [true] ( ... ) | +| UseUseExplosion.rb:21:119:21:128 | ... > ... | UseUseExplosion.rb:21:118:21:129 | ( ... ) | | UseUseExplosion.rb:21:127:21:128 | 95 | UseUseExplosion.rb:21:119:21:128 | ... > ... | | UseUseExplosion.rb:21:131:21:3604 | then ... | UseUseExplosion.rb:21:115:21:3620 | if ... | | UseUseExplosion.rb:21:136:21:3604 | if ... | UseUseExplosion.rb:21:131:21:3604 | then ... | @@ -1769,8 +1663,7 @@ | UseUseExplosion.rb:21:140:21:144 | [post] self | UseUseExplosion.rb:21:3595:21:3600 | self | | UseUseExplosion.rb:21:140:21:144 | self | UseUseExplosion.rb:21:161:21:165 | self | | UseUseExplosion.rb:21:140:21:144 | self | UseUseExplosion.rb:21:3595:21:3600 | self | -| UseUseExplosion.rb:21:140:21:149 | ... > ... | UseUseExplosion.rb:21:139:21:150 | [false] ( ... ) | -| UseUseExplosion.rb:21:140:21:149 | ... > ... | UseUseExplosion.rb:21:139:21:150 | [true] ( ... ) | +| UseUseExplosion.rb:21:140:21:149 | ... > ... | UseUseExplosion.rb:21:139:21:150 | ( ... ) | | UseUseExplosion.rb:21:148:21:149 | 94 | UseUseExplosion.rb:21:140:21:149 | ... > ... | | UseUseExplosion.rb:21:152:21:3588 | then ... | UseUseExplosion.rb:21:136:21:3604 | if ... | | UseUseExplosion.rb:21:157:21:3588 | if ... | UseUseExplosion.rb:21:152:21:3588 | then ... | @@ -1779,8 +1672,7 @@ | UseUseExplosion.rb:21:161:21:165 | [post] self | UseUseExplosion.rb:21:3579:21:3584 | self | | UseUseExplosion.rb:21:161:21:165 | self | UseUseExplosion.rb:21:182:21:186 | self | | UseUseExplosion.rb:21:161:21:165 | self | UseUseExplosion.rb:21:3579:21:3584 | self | -| UseUseExplosion.rb:21:161:21:170 | ... > ... | UseUseExplosion.rb:21:160:21:171 | [false] ( ... ) | -| UseUseExplosion.rb:21:161:21:170 | ... > ... | UseUseExplosion.rb:21:160:21:171 | [true] ( ... ) | +| UseUseExplosion.rb:21:161:21:170 | ... > ... | UseUseExplosion.rb:21:160:21:171 | ( ... ) | | UseUseExplosion.rb:21:169:21:170 | 93 | UseUseExplosion.rb:21:161:21:170 | ... > ... | | UseUseExplosion.rb:21:173:21:3572 | then ... | UseUseExplosion.rb:21:157:21:3588 | if ... | | UseUseExplosion.rb:21:178:21:3572 | if ... | UseUseExplosion.rb:21:173:21:3572 | then ... | @@ -1789,8 +1681,7 @@ | UseUseExplosion.rb:21:182:21:186 | [post] self | UseUseExplosion.rb:21:3563:21:3568 | self | | UseUseExplosion.rb:21:182:21:186 | self | UseUseExplosion.rb:21:203:21:207 | self | | UseUseExplosion.rb:21:182:21:186 | self | UseUseExplosion.rb:21:3563:21:3568 | self | -| UseUseExplosion.rb:21:182:21:191 | ... > ... | UseUseExplosion.rb:21:181:21:192 | [false] ( ... ) | -| UseUseExplosion.rb:21:182:21:191 | ... > ... | UseUseExplosion.rb:21:181:21:192 | [true] ( ... ) | +| UseUseExplosion.rb:21:182:21:191 | ... > ... | UseUseExplosion.rb:21:181:21:192 | ( ... ) | | UseUseExplosion.rb:21:190:21:191 | 92 | UseUseExplosion.rb:21:182:21:191 | ... > ... | | UseUseExplosion.rb:21:194:21:3556 | then ... | UseUseExplosion.rb:21:178:21:3572 | if ... | | UseUseExplosion.rb:21:199:21:3556 | if ... | UseUseExplosion.rb:21:194:21:3556 | then ... | @@ -1799,8 +1690,7 @@ | UseUseExplosion.rb:21:203:21:207 | [post] self | UseUseExplosion.rb:21:3547:21:3552 | self | | UseUseExplosion.rb:21:203:21:207 | self | UseUseExplosion.rb:21:224:21:228 | self | | UseUseExplosion.rb:21:203:21:207 | self | UseUseExplosion.rb:21:3547:21:3552 | self | -| UseUseExplosion.rb:21:203:21:212 | ... > ... | UseUseExplosion.rb:21:202:21:213 | [false] ( ... ) | -| UseUseExplosion.rb:21:203:21:212 | ... > ... | UseUseExplosion.rb:21:202:21:213 | [true] ( ... ) | +| UseUseExplosion.rb:21:203:21:212 | ... > ... | UseUseExplosion.rb:21:202:21:213 | ( ... ) | | UseUseExplosion.rb:21:211:21:212 | 91 | UseUseExplosion.rb:21:203:21:212 | ... > ... | | UseUseExplosion.rb:21:215:21:3540 | then ... | UseUseExplosion.rb:21:199:21:3556 | if ... | | UseUseExplosion.rb:21:220:21:3540 | if ... | UseUseExplosion.rb:21:215:21:3540 | then ... | @@ -1809,8 +1699,7 @@ | UseUseExplosion.rb:21:224:21:228 | [post] self | UseUseExplosion.rb:21:3531:21:3536 | self | | UseUseExplosion.rb:21:224:21:228 | self | UseUseExplosion.rb:21:245:21:249 | self | | UseUseExplosion.rb:21:224:21:228 | self | UseUseExplosion.rb:21:3531:21:3536 | self | -| UseUseExplosion.rb:21:224:21:233 | ... > ... | UseUseExplosion.rb:21:223:21:234 | [false] ( ... ) | -| UseUseExplosion.rb:21:224:21:233 | ... > ... | UseUseExplosion.rb:21:223:21:234 | [true] ( ... ) | +| UseUseExplosion.rb:21:224:21:233 | ... > ... | UseUseExplosion.rb:21:223:21:234 | ( ... ) | | UseUseExplosion.rb:21:232:21:233 | 90 | UseUseExplosion.rb:21:224:21:233 | ... > ... | | UseUseExplosion.rb:21:236:21:3524 | then ... | UseUseExplosion.rb:21:220:21:3540 | if ... | | UseUseExplosion.rb:21:241:21:3524 | if ... | UseUseExplosion.rb:21:236:21:3524 | then ... | @@ -1819,8 +1708,7 @@ | UseUseExplosion.rb:21:245:21:249 | [post] self | UseUseExplosion.rb:21:3515:21:3520 | self | | UseUseExplosion.rb:21:245:21:249 | self | UseUseExplosion.rb:21:266:21:270 | self | | UseUseExplosion.rb:21:245:21:249 | self | UseUseExplosion.rb:21:3515:21:3520 | self | -| UseUseExplosion.rb:21:245:21:254 | ... > ... | UseUseExplosion.rb:21:244:21:255 | [false] ( ... ) | -| UseUseExplosion.rb:21:245:21:254 | ... > ... | UseUseExplosion.rb:21:244:21:255 | [true] ( ... ) | +| UseUseExplosion.rb:21:245:21:254 | ... > ... | UseUseExplosion.rb:21:244:21:255 | ( ... ) | | UseUseExplosion.rb:21:253:21:254 | 89 | UseUseExplosion.rb:21:245:21:254 | ... > ... | | UseUseExplosion.rb:21:257:21:3508 | then ... | UseUseExplosion.rb:21:241:21:3524 | if ... | | UseUseExplosion.rb:21:262:21:3508 | if ... | UseUseExplosion.rb:21:257:21:3508 | then ... | @@ -1829,8 +1717,7 @@ | UseUseExplosion.rb:21:266:21:270 | [post] self | UseUseExplosion.rb:21:3499:21:3504 | self | | UseUseExplosion.rb:21:266:21:270 | self | UseUseExplosion.rb:21:287:21:291 | self | | UseUseExplosion.rb:21:266:21:270 | self | UseUseExplosion.rb:21:3499:21:3504 | self | -| UseUseExplosion.rb:21:266:21:275 | ... > ... | UseUseExplosion.rb:21:265:21:276 | [false] ( ... ) | -| UseUseExplosion.rb:21:266:21:275 | ... > ... | UseUseExplosion.rb:21:265:21:276 | [true] ( ... ) | +| UseUseExplosion.rb:21:266:21:275 | ... > ... | UseUseExplosion.rb:21:265:21:276 | ( ... ) | | UseUseExplosion.rb:21:274:21:275 | 88 | UseUseExplosion.rb:21:266:21:275 | ... > ... | | UseUseExplosion.rb:21:278:21:3492 | then ... | UseUseExplosion.rb:21:262:21:3508 | if ... | | UseUseExplosion.rb:21:283:21:3492 | if ... | UseUseExplosion.rb:21:278:21:3492 | then ... | @@ -1839,8 +1726,7 @@ | UseUseExplosion.rb:21:287:21:291 | [post] self | UseUseExplosion.rb:21:3483:21:3488 | self | | UseUseExplosion.rb:21:287:21:291 | self | UseUseExplosion.rb:21:308:21:312 | self | | UseUseExplosion.rb:21:287:21:291 | self | UseUseExplosion.rb:21:3483:21:3488 | self | -| UseUseExplosion.rb:21:287:21:296 | ... > ... | UseUseExplosion.rb:21:286:21:297 | [false] ( ... ) | -| UseUseExplosion.rb:21:287:21:296 | ... > ... | UseUseExplosion.rb:21:286:21:297 | [true] ( ... ) | +| UseUseExplosion.rb:21:287:21:296 | ... > ... | UseUseExplosion.rb:21:286:21:297 | ( ... ) | | UseUseExplosion.rb:21:295:21:296 | 87 | UseUseExplosion.rb:21:287:21:296 | ... > ... | | UseUseExplosion.rb:21:299:21:3476 | then ... | UseUseExplosion.rb:21:283:21:3492 | if ... | | UseUseExplosion.rb:21:304:21:3476 | if ... | UseUseExplosion.rb:21:299:21:3476 | then ... | @@ -1849,8 +1735,7 @@ | UseUseExplosion.rb:21:308:21:312 | [post] self | UseUseExplosion.rb:21:3467:21:3472 | self | | UseUseExplosion.rb:21:308:21:312 | self | UseUseExplosion.rb:21:329:21:333 | self | | UseUseExplosion.rb:21:308:21:312 | self | UseUseExplosion.rb:21:3467:21:3472 | self | -| UseUseExplosion.rb:21:308:21:317 | ... > ... | UseUseExplosion.rb:21:307:21:318 | [false] ( ... ) | -| UseUseExplosion.rb:21:308:21:317 | ... > ... | UseUseExplosion.rb:21:307:21:318 | [true] ( ... ) | +| UseUseExplosion.rb:21:308:21:317 | ... > ... | UseUseExplosion.rb:21:307:21:318 | ( ... ) | | UseUseExplosion.rb:21:316:21:317 | 86 | UseUseExplosion.rb:21:308:21:317 | ... > ... | | UseUseExplosion.rb:21:320:21:3460 | then ... | UseUseExplosion.rb:21:304:21:3476 | if ... | | UseUseExplosion.rb:21:325:21:3460 | if ... | UseUseExplosion.rb:21:320:21:3460 | then ... | @@ -1859,8 +1744,7 @@ | UseUseExplosion.rb:21:329:21:333 | [post] self | UseUseExplosion.rb:21:3451:21:3456 | self | | UseUseExplosion.rb:21:329:21:333 | self | UseUseExplosion.rb:21:350:21:354 | self | | UseUseExplosion.rb:21:329:21:333 | self | UseUseExplosion.rb:21:3451:21:3456 | self | -| UseUseExplosion.rb:21:329:21:338 | ... > ... | UseUseExplosion.rb:21:328:21:339 | [false] ( ... ) | -| UseUseExplosion.rb:21:329:21:338 | ... > ... | UseUseExplosion.rb:21:328:21:339 | [true] ( ... ) | +| UseUseExplosion.rb:21:329:21:338 | ... > ... | UseUseExplosion.rb:21:328:21:339 | ( ... ) | | UseUseExplosion.rb:21:337:21:338 | 85 | UseUseExplosion.rb:21:329:21:338 | ... > ... | | UseUseExplosion.rb:21:341:21:3444 | then ... | UseUseExplosion.rb:21:325:21:3460 | if ... | | UseUseExplosion.rb:21:346:21:3444 | if ... | UseUseExplosion.rb:21:341:21:3444 | then ... | @@ -1869,8 +1753,7 @@ | UseUseExplosion.rb:21:350:21:354 | [post] self | UseUseExplosion.rb:21:3435:21:3440 | self | | UseUseExplosion.rb:21:350:21:354 | self | UseUseExplosion.rb:21:371:21:375 | self | | UseUseExplosion.rb:21:350:21:354 | self | UseUseExplosion.rb:21:3435:21:3440 | self | -| UseUseExplosion.rb:21:350:21:359 | ... > ... | UseUseExplosion.rb:21:349:21:360 | [false] ( ... ) | -| UseUseExplosion.rb:21:350:21:359 | ... > ... | UseUseExplosion.rb:21:349:21:360 | [true] ( ... ) | +| UseUseExplosion.rb:21:350:21:359 | ... > ... | UseUseExplosion.rb:21:349:21:360 | ( ... ) | | UseUseExplosion.rb:21:358:21:359 | 84 | UseUseExplosion.rb:21:350:21:359 | ... > ... | | UseUseExplosion.rb:21:362:21:3428 | then ... | UseUseExplosion.rb:21:346:21:3444 | if ... | | UseUseExplosion.rb:21:367:21:3428 | if ... | UseUseExplosion.rb:21:362:21:3428 | then ... | @@ -1879,8 +1762,7 @@ | UseUseExplosion.rb:21:371:21:375 | [post] self | UseUseExplosion.rb:21:3419:21:3424 | self | | UseUseExplosion.rb:21:371:21:375 | self | UseUseExplosion.rb:21:392:21:396 | self | | UseUseExplosion.rb:21:371:21:375 | self | UseUseExplosion.rb:21:3419:21:3424 | self | -| UseUseExplosion.rb:21:371:21:380 | ... > ... | UseUseExplosion.rb:21:370:21:381 | [false] ( ... ) | -| UseUseExplosion.rb:21:371:21:380 | ... > ... | UseUseExplosion.rb:21:370:21:381 | [true] ( ... ) | +| UseUseExplosion.rb:21:371:21:380 | ... > ... | UseUseExplosion.rb:21:370:21:381 | ( ... ) | | UseUseExplosion.rb:21:379:21:380 | 83 | UseUseExplosion.rb:21:371:21:380 | ... > ... | | UseUseExplosion.rb:21:383:21:3412 | then ... | UseUseExplosion.rb:21:367:21:3428 | if ... | | UseUseExplosion.rb:21:388:21:3412 | if ... | UseUseExplosion.rb:21:383:21:3412 | then ... | @@ -1889,8 +1771,7 @@ | UseUseExplosion.rb:21:392:21:396 | [post] self | UseUseExplosion.rb:21:3403:21:3408 | self | | UseUseExplosion.rb:21:392:21:396 | self | UseUseExplosion.rb:21:413:21:417 | self | | UseUseExplosion.rb:21:392:21:396 | self | UseUseExplosion.rb:21:3403:21:3408 | self | -| UseUseExplosion.rb:21:392:21:401 | ... > ... | UseUseExplosion.rb:21:391:21:402 | [false] ( ... ) | -| UseUseExplosion.rb:21:392:21:401 | ... > ... | UseUseExplosion.rb:21:391:21:402 | [true] ( ... ) | +| UseUseExplosion.rb:21:392:21:401 | ... > ... | UseUseExplosion.rb:21:391:21:402 | ( ... ) | | UseUseExplosion.rb:21:400:21:401 | 82 | UseUseExplosion.rb:21:392:21:401 | ... > ... | | UseUseExplosion.rb:21:404:21:3396 | then ... | UseUseExplosion.rb:21:388:21:3412 | if ... | | UseUseExplosion.rb:21:409:21:3396 | if ... | UseUseExplosion.rb:21:404:21:3396 | then ... | @@ -1899,8 +1780,7 @@ | UseUseExplosion.rb:21:413:21:417 | [post] self | UseUseExplosion.rb:21:3387:21:3392 | self | | UseUseExplosion.rb:21:413:21:417 | self | UseUseExplosion.rb:21:434:21:438 | self | | UseUseExplosion.rb:21:413:21:417 | self | UseUseExplosion.rb:21:3387:21:3392 | self | -| UseUseExplosion.rb:21:413:21:422 | ... > ... | UseUseExplosion.rb:21:412:21:423 | [false] ( ... ) | -| UseUseExplosion.rb:21:413:21:422 | ... > ... | UseUseExplosion.rb:21:412:21:423 | [true] ( ... ) | +| UseUseExplosion.rb:21:413:21:422 | ... > ... | UseUseExplosion.rb:21:412:21:423 | ( ... ) | | UseUseExplosion.rb:21:421:21:422 | 81 | UseUseExplosion.rb:21:413:21:422 | ... > ... | | UseUseExplosion.rb:21:425:21:3380 | then ... | UseUseExplosion.rb:21:409:21:3396 | if ... | | UseUseExplosion.rb:21:430:21:3380 | if ... | UseUseExplosion.rb:21:425:21:3380 | then ... | @@ -1909,8 +1789,7 @@ | UseUseExplosion.rb:21:434:21:438 | [post] self | UseUseExplosion.rb:21:3371:21:3376 | self | | UseUseExplosion.rb:21:434:21:438 | self | UseUseExplosion.rb:21:455:21:459 | self | | UseUseExplosion.rb:21:434:21:438 | self | UseUseExplosion.rb:21:3371:21:3376 | self | -| UseUseExplosion.rb:21:434:21:443 | ... > ... | UseUseExplosion.rb:21:433:21:444 | [false] ( ... ) | -| UseUseExplosion.rb:21:434:21:443 | ... > ... | UseUseExplosion.rb:21:433:21:444 | [true] ( ... ) | +| UseUseExplosion.rb:21:434:21:443 | ... > ... | UseUseExplosion.rb:21:433:21:444 | ( ... ) | | UseUseExplosion.rb:21:442:21:443 | 80 | UseUseExplosion.rb:21:434:21:443 | ... > ... | | UseUseExplosion.rb:21:446:21:3364 | then ... | UseUseExplosion.rb:21:430:21:3380 | if ... | | UseUseExplosion.rb:21:451:21:3364 | if ... | UseUseExplosion.rb:21:446:21:3364 | then ... | @@ -1919,8 +1798,7 @@ | UseUseExplosion.rb:21:455:21:459 | [post] self | UseUseExplosion.rb:21:3355:21:3360 | self | | UseUseExplosion.rb:21:455:21:459 | self | UseUseExplosion.rb:21:476:21:480 | self | | UseUseExplosion.rb:21:455:21:459 | self | UseUseExplosion.rb:21:3355:21:3360 | self | -| UseUseExplosion.rb:21:455:21:464 | ... > ... | UseUseExplosion.rb:21:454:21:465 | [false] ( ... ) | -| UseUseExplosion.rb:21:455:21:464 | ... > ... | UseUseExplosion.rb:21:454:21:465 | [true] ( ... ) | +| UseUseExplosion.rb:21:455:21:464 | ... > ... | UseUseExplosion.rb:21:454:21:465 | ( ... ) | | UseUseExplosion.rb:21:463:21:464 | 79 | UseUseExplosion.rb:21:455:21:464 | ... > ... | | UseUseExplosion.rb:21:467:21:3348 | then ... | UseUseExplosion.rb:21:451:21:3364 | if ... | | UseUseExplosion.rb:21:472:21:3348 | if ... | UseUseExplosion.rb:21:467:21:3348 | then ... | @@ -1929,8 +1807,7 @@ | UseUseExplosion.rb:21:476:21:480 | [post] self | UseUseExplosion.rb:21:3339:21:3344 | self | | UseUseExplosion.rb:21:476:21:480 | self | UseUseExplosion.rb:21:497:21:501 | self | | UseUseExplosion.rb:21:476:21:480 | self | UseUseExplosion.rb:21:3339:21:3344 | self | -| UseUseExplosion.rb:21:476:21:485 | ... > ... | UseUseExplosion.rb:21:475:21:486 | [false] ( ... ) | -| UseUseExplosion.rb:21:476:21:485 | ... > ... | UseUseExplosion.rb:21:475:21:486 | [true] ( ... ) | +| UseUseExplosion.rb:21:476:21:485 | ... > ... | UseUseExplosion.rb:21:475:21:486 | ( ... ) | | UseUseExplosion.rb:21:484:21:485 | 78 | UseUseExplosion.rb:21:476:21:485 | ... > ... | | UseUseExplosion.rb:21:488:21:3332 | then ... | UseUseExplosion.rb:21:472:21:3348 | if ... | | UseUseExplosion.rb:21:493:21:3332 | if ... | UseUseExplosion.rb:21:488:21:3332 | then ... | @@ -1939,8 +1816,7 @@ | UseUseExplosion.rb:21:497:21:501 | [post] self | UseUseExplosion.rb:21:3323:21:3328 | self | | UseUseExplosion.rb:21:497:21:501 | self | UseUseExplosion.rb:21:518:21:522 | self | | UseUseExplosion.rb:21:497:21:501 | self | UseUseExplosion.rb:21:3323:21:3328 | self | -| UseUseExplosion.rb:21:497:21:506 | ... > ... | UseUseExplosion.rb:21:496:21:507 | [false] ( ... ) | -| UseUseExplosion.rb:21:497:21:506 | ... > ... | UseUseExplosion.rb:21:496:21:507 | [true] ( ... ) | +| UseUseExplosion.rb:21:497:21:506 | ... > ... | UseUseExplosion.rb:21:496:21:507 | ( ... ) | | UseUseExplosion.rb:21:505:21:506 | 77 | UseUseExplosion.rb:21:497:21:506 | ... > ... | | UseUseExplosion.rb:21:509:21:3316 | then ... | UseUseExplosion.rb:21:493:21:3332 | if ... | | UseUseExplosion.rb:21:514:21:3316 | if ... | UseUseExplosion.rb:21:509:21:3316 | then ... | @@ -1949,8 +1825,7 @@ | UseUseExplosion.rb:21:518:21:522 | [post] self | UseUseExplosion.rb:21:3307:21:3312 | self | | UseUseExplosion.rb:21:518:21:522 | self | UseUseExplosion.rb:21:539:21:543 | self | | UseUseExplosion.rb:21:518:21:522 | self | UseUseExplosion.rb:21:3307:21:3312 | self | -| UseUseExplosion.rb:21:518:21:527 | ... > ... | UseUseExplosion.rb:21:517:21:528 | [false] ( ... ) | -| UseUseExplosion.rb:21:518:21:527 | ... > ... | UseUseExplosion.rb:21:517:21:528 | [true] ( ... ) | +| UseUseExplosion.rb:21:518:21:527 | ... > ... | UseUseExplosion.rb:21:517:21:528 | ( ... ) | | UseUseExplosion.rb:21:526:21:527 | 76 | UseUseExplosion.rb:21:518:21:527 | ... > ... | | UseUseExplosion.rb:21:530:21:3300 | then ... | UseUseExplosion.rb:21:514:21:3316 | if ... | | UseUseExplosion.rb:21:535:21:3300 | if ... | UseUseExplosion.rb:21:530:21:3300 | then ... | @@ -1959,8 +1834,7 @@ | UseUseExplosion.rb:21:539:21:543 | [post] self | UseUseExplosion.rb:21:3291:21:3296 | self | | UseUseExplosion.rb:21:539:21:543 | self | UseUseExplosion.rb:21:560:21:564 | self | | UseUseExplosion.rb:21:539:21:543 | self | UseUseExplosion.rb:21:3291:21:3296 | self | -| UseUseExplosion.rb:21:539:21:548 | ... > ... | UseUseExplosion.rb:21:538:21:549 | [false] ( ... ) | -| UseUseExplosion.rb:21:539:21:548 | ... > ... | UseUseExplosion.rb:21:538:21:549 | [true] ( ... ) | +| UseUseExplosion.rb:21:539:21:548 | ... > ... | UseUseExplosion.rb:21:538:21:549 | ( ... ) | | UseUseExplosion.rb:21:547:21:548 | 75 | UseUseExplosion.rb:21:539:21:548 | ... > ... | | UseUseExplosion.rb:21:551:21:3284 | then ... | UseUseExplosion.rb:21:535:21:3300 | if ... | | UseUseExplosion.rb:21:556:21:3284 | if ... | UseUseExplosion.rb:21:551:21:3284 | then ... | @@ -1969,8 +1843,7 @@ | UseUseExplosion.rb:21:560:21:564 | [post] self | UseUseExplosion.rb:21:3275:21:3280 | self | | UseUseExplosion.rb:21:560:21:564 | self | UseUseExplosion.rb:21:581:21:585 | self | | UseUseExplosion.rb:21:560:21:564 | self | UseUseExplosion.rb:21:3275:21:3280 | self | -| UseUseExplosion.rb:21:560:21:569 | ... > ... | UseUseExplosion.rb:21:559:21:570 | [false] ( ... ) | -| UseUseExplosion.rb:21:560:21:569 | ... > ... | UseUseExplosion.rb:21:559:21:570 | [true] ( ... ) | +| UseUseExplosion.rb:21:560:21:569 | ... > ... | UseUseExplosion.rb:21:559:21:570 | ( ... ) | | UseUseExplosion.rb:21:568:21:569 | 74 | UseUseExplosion.rb:21:560:21:569 | ... > ... | | UseUseExplosion.rb:21:572:21:3268 | then ... | UseUseExplosion.rb:21:556:21:3284 | if ... | | UseUseExplosion.rb:21:577:21:3268 | if ... | UseUseExplosion.rb:21:572:21:3268 | then ... | @@ -1979,8 +1852,7 @@ | UseUseExplosion.rb:21:581:21:585 | [post] self | UseUseExplosion.rb:21:3259:21:3264 | self | | UseUseExplosion.rb:21:581:21:585 | self | UseUseExplosion.rb:21:602:21:606 | self | | UseUseExplosion.rb:21:581:21:585 | self | UseUseExplosion.rb:21:3259:21:3264 | self | -| UseUseExplosion.rb:21:581:21:590 | ... > ... | UseUseExplosion.rb:21:580:21:591 | [false] ( ... ) | -| UseUseExplosion.rb:21:581:21:590 | ... > ... | UseUseExplosion.rb:21:580:21:591 | [true] ( ... ) | +| UseUseExplosion.rb:21:581:21:590 | ... > ... | UseUseExplosion.rb:21:580:21:591 | ( ... ) | | UseUseExplosion.rb:21:589:21:590 | 73 | UseUseExplosion.rb:21:581:21:590 | ... > ... | | UseUseExplosion.rb:21:593:21:3252 | then ... | UseUseExplosion.rb:21:577:21:3268 | if ... | | UseUseExplosion.rb:21:598:21:3252 | if ... | UseUseExplosion.rb:21:593:21:3252 | then ... | @@ -1989,8 +1861,7 @@ | UseUseExplosion.rb:21:602:21:606 | [post] self | UseUseExplosion.rb:21:3243:21:3248 | self | | UseUseExplosion.rb:21:602:21:606 | self | UseUseExplosion.rb:21:623:21:627 | self | | UseUseExplosion.rb:21:602:21:606 | self | UseUseExplosion.rb:21:3243:21:3248 | self | -| UseUseExplosion.rb:21:602:21:611 | ... > ... | UseUseExplosion.rb:21:601:21:612 | [false] ( ... ) | -| UseUseExplosion.rb:21:602:21:611 | ... > ... | UseUseExplosion.rb:21:601:21:612 | [true] ( ... ) | +| UseUseExplosion.rb:21:602:21:611 | ... > ... | UseUseExplosion.rb:21:601:21:612 | ( ... ) | | UseUseExplosion.rb:21:610:21:611 | 72 | UseUseExplosion.rb:21:602:21:611 | ... > ... | | UseUseExplosion.rb:21:614:21:3236 | then ... | UseUseExplosion.rb:21:598:21:3252 | if ... | | UseUseExplosion.rb:21:619:21:3236 | if ... | UseUseExplosion.rb:21:614:21:3236 | then ... | @@ -1999,8 +1870,7 @@ | UseUseExplosion.rb:21:623:21:627 | [post] self | UseUseExplosion.rb:21:3227:21:3232 | self | | UseUseExplosion.rb:21:623:21:627 | self | UseUseExplosion.rb:21:644:21:648 | self | | UseUseExplosion.rb:21:623:21:627 | self | UseUseExplosion.rb:21:3227:21:3232 | self | -| UseUseExplosion.rb:21:623:21:632 | ... > ... | UseUseExplosion.rb:21:622:21:633 | [false] ( ... ) | -| UseUseExplosion.rb:21:623:21:632 | ... > ... | UseUseExplosion.rb:21:622:21:633 | [true] ( ... ) | +| UseUseExplosion.rb:21:623:21:632 | ... > ... | UseUseExplosion.rb:21:622:21:633 | ( ... ) | | UseUseExplosion.rb:21:631:21:632 | 71 | UseUseExplosion.rb:21:623:21:632 | ... > ... | | UseUseExplosion.rb:21:635:21:3220 | then ... | UseUseExplosion.rb:21:619:21:3236 | if ... | | UseUseExplosion.rb:21:640:21:3220 | if ... | UseUseExplosion.rb:21:635:21:3220 | then ... | @@ -2009,8 +1879,7 @@ | UseUseExplosion.rb:21:644:21:648 | [post] self | UseUseExplosion.rb:21:3211:21:3216 | self | | UseUseExplosion.rb:21:644:21:648 | self | UseUseExplosion.rb:21:665:21:669 | self | | UseUseExplosion.rb:21:644:21:648 | self | UseUseExplosion.rb:21:3211:21:3216 | self | -| UseUseExplosion.rb:21:644:21:653 | ... > ... | UseUseExplosion.rb:21:643:21:654 | [false] ( ... ) | -| UseUseExplosion.rb:21:644:21:653 | ... > ... | UseUseExplosion.rb:21:643:21:654 | [true] ( ... ) | +| UseUseExplosion.rb:21:644:21:653 | ... > ... | UseUseExplosion.rb:21:643:21:654 | ( ... ) | | UseUseExplosion.rb:21:652:21:653 | 70 | UseUseExplosion.rb:21:644:21:653 | ... > ... | | UseUseExplosion.rb:21:656:21:3204 | then ... | UseUseExplosion.rb:21:640:21:3220 | if ... | | UseUseExplosion.rb:21:661:21:3204 | if ... | UseUseExplosion.rb:21:656:21:3204 | then ... | @@ -2019,8 +1888,7 @@ | UseUseExplosion.rb:21:665:21:669 | [post] self | UseUseExplosion.rb:21:3195:21:3200 | self | | UseUseExplosion.rb:21:665:21:669 | self | UseUseExplosion.rb:21:686:21:690 | self | | UseUseExplosion.rb:21:665:21:669 | self | UseUseExplosion.rb:21:3195:21:3200 | self | -| UseUseExplosion.rb:21:665:21:674 | ... > ... | UseUseExplosion.rb:21:664:21:675 | [false] ( ... ) | -| UseUseExplosion.rb:21:665:21:674 | ... > ... | UseUseExplosion.rb:21:664:21:675 | [true] ( ... ) | +| UseUseExplosion.rb:21:665:21:674 | ... > ... | UseUseExplosion.rb:21:664:21:675 | ( ... ) | | UseUseExplosion.rb:21:673:21:674 | 69 | UseUseExplosion.rb:21:665:21:674 | ... > ... | | UseUseExplosion.rb:21:677:21:3188 | then ... | UseUseExplosion.rb:21:661:21:3204 | if ... | | UseUseExplosion.rb:21:682:21:3188 | if ... | UseUseExplosion.rb:21:677:21:3188 | then ... | @@ -2029,8 +1897,7 @@ | UseUseExplosion.rb:21:686:21:690 | [post] self | UseUseExplosion.rb:21:3179:21:3184 | self | | UseUseExplosion.rb:21:686:21:690 | self | UseUseExplosion.rb:21:707:21:711 | self | | UseUseExplosion.rb:21:686:21:690 | self | UseUseExplosion.rb:21:3179:21:3184 | self | -| UseUseExplosion.rb:21:686:21:695 | ... > ... | UseUseExplosion.rb:21:685:21:696 | [false] ( ... ) | -| UseUseExplosion.rb:21:686:21:695 | ... > ... | UseUseExplosion.rb:21:685:21:696 | [true] ( ... ) | +| UseUseExplosion.rb:21:686:21:695 | ... > ... | UseUseExplosion.rb:21:685:21:696 | ( ... ) | | UseUseExplosion.rb:21:694:21:695 | 68 | UseUseExplosion.rb:21:686:21:695 | ... > ... | | UseUseExplosion.rb:21:698:21:3172 | then ... | UseUseExplosion.rb:21:682:21:3188 | if ... | | UseUseExplosion.rb:21:703:21:3172 | if ... | UseUseExplosion.rb:21:698:21:3172 | then ... | @@ -2039,8 +1906,7 @@ | UseUseExplosion.rb:21:707:21:711 | [post] self | UseUseExplosion.rb:21:3163:21:3168 | self | | UseUseExplosion.rb:21:707:21:711 | self | UseUseExplosion.rb:21:728:21:732 | self | | UseUseExplosion.rb:21:707:21:711 | self | UseUseExplosion.rb:21:3163:21:3168 | self | -| UseUseExplosion.rb:21:707:21:716 | ... > ... | UseUseExplosion.rb:21:706:21:717 | [false] ( ... ) | -| UseUseExplosion.rb:21:707:21:716 | ... > ... | UseUseExplosion.rb:21:706:21:717 | [true] ( ... ) | +| UseUseExplosion.rb:21:707:21:716 | ... > ... | UseUseExplosion.rb:21:706:21:717 | ( ... ) | | UseUseExplosion.rb:21:715:21:716 | 67 | UseUseExplosion.rb:21:707:21:716 | ... > ... | | UseUseExplosion.rb:21:719:21:3156 | then ... | UseUseExplosion.rb:21:703:21:3172 | if ... | | UseUseExplosion.rb:21:724:21:3156 | if ... | UseUseExplosion.rb:21:719:21:3156 | then ... | @@ -2049,8 +1915,7 @@ | UseUseExplosion.rb:21:728:21:732 | [post] self | UseUseExplosion.rb:21:3147:21:3152 | self | | UseUseExplosion.rb:21:728:21:732 | self | UseUseExplosion.rb:21:749:21:753 | self | | UseUseExplosion.rb:21:728:21:732 | self | UseUseExplosion.rb:21:3147:21:3152 | self | -| UseUseExplosion.rb:21:728:21:737 | ... > ... | UseUseExplosion.rb:21:727:21:738 | [false] ( ... ) | -| UseUseExplosion.rb:21:728:21:737 | ... > ... | UseUseExplosion.rb:21:727:21:738 | [true] ( ... ) | +| UseUseExplosion.rb:21:728:21:737 | ... > ... | UseUseExplosion.rb:21:727:21:738 | ( ... ) | | UseUseExplosion.rb:21:736:21:737 | 66 | UseUseExplosion.rb:21:728:21:737 | ... > ... | | UseUseExplosion.rb:21:740:21:3140 | then ... | UseUseExplosion.rb:21:724:21:3156 | if ... | | UseUseExplosion.rb:21:745:21:3140 | if ... | UseUseExplosion.rb:21:740:21:3140 | then ... | @@ -2059,8 +1924,7 @@ | UseUseExplosion.rb:21:749:21:753 | [post] self | UseUseExplosion.rb:21:3131:21:3136 | self | | UseUseExplosion.rb:21:749:21:753 | self | UseUseExplosion.rb:21:770:21:774 | self | | UseUseExplosion.rb:21:749:21:753 | self | UseUseExplosion.rb:21:3131:21:3136 | self | -| UseUseExplosion.rb:21:749:21:758 | ... > ... | UseUseExplosion.rb:21:748:21:759 | [false] ( ... ) | -| UseUseExplosion.rb:21:749:21:758 | ... > ... | UseUseExplosion.rb:21:748:21:759 | [true] ( ... ) | +| UseUseExplosion.rb:21:749:21:758 | ... > ... | UseUseExplosion.rb:21:748:21:759 | ( ... ) | | UseUseExplosion.rb:21:757:21:758 | 65 | UseUseExplosion.rb:21:749:21:758 | ... > ... | | UseUseExplosion.rb:21:761:21:3124 | then ... | UseUseExplosion.rb:21:745:21:3140 | if ... | | UseUseExplosion.rb:21:766:21:3124 | if ... | UseUseExplosion.rb:21:761:21:3124 | then ... | @@ -2069,8 +1933,7 @@ | UseUseExplosion.rb:21:770:21:774 | [post] self | UseUseExplosion.rb:21:3115:21:3120 | self | | UseUseExplosion.rb:21:770:21:774 | self | UseUseExplosion.rb:21:791:21:795 | self | | UseUseExplosion.rb:21:770:21:774 | self | UseUseExplosion.rb:21:3115:21:3120 | self | -| UseUseExplosion.rb:21:770:21:779 | ... > ... | UseUseExplosion.rb:21:769:21:780 | [false] ( ... ) | -| UseUseExplosion.rb:21:770:21:779 | ... > ... | UseUseExplosion.rb:21:769:21:780 | [true] ( ... ) | +| UseUseExplosion.rb:21:770:21:779 | ... > ... | UseUseExplosion.rb:21:769:21:780 | ( ... ) | | UseUseExplosion.rb:21:778:21:779 | 64 | UseUseExplosion.rb:21:770:21:779 | ... > ... | | UseUseExplosion.rb:21:782:21:3108 | then ... | UseUseExplosion.rb:21:766:21:3124 | if ... | | UseUseExplosion.rb:21:787:21:3108 | if ... | UseUseExplosion.rb:21:782:21:3108 | then ... | @@ -2079,8 +1942,7 @@ | UseUseExplosion.rb:21:791:21:795 | [post] self | UseUseExplosion.rb:21:3099:21:3104 | self | | UseUseExplosion.rb:21:791:21:795 | self | UseUseExplosion.rb:21:812:21:816 | self | | UseUseExplosion.rb:21:791:21:795 | self | UseUseExplosion.rb:21:3099:21:3104 | self | -| UseUseExplosion.rb:21:791:21:800 | ... > ... | UseUseExplosion.rb:21:790:21:801 | [false] ( ... ) | -| UseUseExplosion.rb:21:791:21:800 | ... > ... | UseUseExplosion.rb:21:790:21:801 | [true] ( ... ) | +| UseUseExplosion.rb:21:791:21:800 | ... > ... | UseUseExplosion.rb:21:790:21:801 | ( ... ) | | UseUseExplosion.rb:21:799:21:800 | 63 | UseUseExplosion.rb:21:791:21:800 | ... > ... | | UseUseExplosion.rb:21:803:21:3092 | then ... | UseUseExplosion.rb:21:787:21:3108 | if ... | | UseUseExplosion.rb:21:808:21:3092 | if ... | UseUseExplosion.rb:21:803:21:3092 | then ... | @@ -2089,8 +1951,7 @@ | UseUseExplosion.rb:21:812:21:816 | [post] self | UseUseExplosion.rb:21:3083:21:3088 | self | | UseUseExplosion.rb:21:812:21:816 | self | UseUseExplosion.rb:21:833:21:837 | self | | UseUseExplosion.rb:21:812:21:816 | self | UseUseExplosion.rb:21:3083:21:3088 | self | -| UseUseExplosion.rb:21:812:21:821 | ... > ... | UseUseExplosion.rb:21:811:21:822 | [false] ( ... ) | -| UseUseExplosion.rb:21:812:21:821 | ... > ... | UseUseExplosion.rb:21:811:21:822 | [true] ( ... ) | +| UseUseExplosion.rb:21:812:21:821 | ... > ... | UseUseExplosion.rb:21:811:21:822 | ( ... ) | | UseUseExplosion.rb:21:820:21:821 | 62 | UseUseExplosion.rb:21:812:21:821 | ... > ... | | UseUseExplosion.rb:21:824:21:3076 | then ... | UseUseExplosion.rb:21:808:21:3092 | if ... | | UseUseExplosion.rb:21:829:21:3076 | if ... | UseUseExplosion.rb:21:824:21:3076 | then ... | @@ -2099,8 +1960,7 @@ | UseUseExplosion.rb:21:833:21:837 | [post] self | UseUseExplosion.rb:21:3067:21:3072 | self | | UseUseExplosion.rb:21:833:21:837 | self | UseUseExplosion.rb:21:854:21:858 | self | | UseUseExplosion.rb:21:833:21:837 | self | UseUseExplosion.rb:21:3067:21:3072 | self | -| UseUseExplosion.rb:21:833:21:842 | ... > ... | UseUseExplosion.rb:21:832:21:843 | [false] ( ... ) | -| UseUseExplosion.rb:21:833:21:842 | ... > ... | UseUseExplosion.rb:21:832:21:843 | [true] ( ... ) | +| UseUseExplosion.rb:21:833:21:842 | ... > ... | UseUseExplosion.rb:21:832:21:843 | ( ... ) | | UseUseExplosion.rb:21:841:21:842 | 61 | UseUseExplosion.rb:21:833:21:842 | ... > ... | | UseUseExplosion.rb:21:845:21:3060 | then ... | UseUseExplosion.rb:21:829:21:3076 | if ... | | UseUseExplosion.rb:21:850:21:3060 | if ... | UseUseExplosion.rb:21:845:21:3060 | then ... | @@ -2109,8 +1969,7 @@ | UseUseExplosion.rb:21:854:21:858 | [post] self | UseUseExplosion.rb:21:3051:21:3056 | self | | UseUseExplosion.rb:21:854:21:858 | self | UseUseExplosion.rb:21:875:21:879 | self | | UseUseExplosion.rb:21:854:21:858 | self | UseUseExplosion.rb:21:3051:21:3056 | self | -| UseUseExplosion.rb:21:854:21:863 | ... > ... | UseUseExplosion.rb:21:853:21:864 | [false] ( ... ) | -| UseUseExplosion.rb:21:854:21:863 | ... > ... | UseUseExplosion.rb:21:853:21:864 | [true] ( ... ) | +| UseUseExplosion.rb:21:854:21:863 | ... > ... | UseUseExplosion.rb:21:853:21:864 | ( ... ) | | UseUseExplosion.rb:21:862:21:863 | 60 | UseUseExplosion.rb:21:854:21:863 | ... > ... | | UseUseExplosion.rb:21:866:21:3044 | then ... | UseUseExplosion.rb:21:850:21:3060 | if ... | | UseUseExplosion.rb:21:871:21:3044 | if ... | UseUseExplosion.rb:21:866:21:3044 | then ... | @@ -2119,8 +1978,7 @@ | UseUseExplosion.rb:21:875:21:879 | [post] self | UseUseExplosion.rb:21:3035:21:3040 | self | | UseUseExplosion.rb:21:875:21:879 | self | UseUseExplosion.rb:21:896:21:900 | self | | UseUseExplosion.rb:21:875:21:879 | self | UseUseExplosion.rb:21:3035:21:3040 | self | -| UseUseExplosion.rb:21:875:21:884 | ... > ... | UseUseExplosion.rb:21:874:21:885 | [false] ( ... ) | -| UseUseExplosion.rb:21:875:21:884 | ... > ... | UseUseExplosion.rb:21:874:21:885 | [true] ( ... ) | +| UseUseExplosion.rb:21:875:21:884 | ... > ... | UseUseExplosion.rb:21:874:21:885 | ( ... ) | | UseUseExplosion.rb:21:883:21:884 | 59 | UseUseExplosion.rb:21:875:21:884 | ... > ... | | UseUseExplosion.rb:21:887:21:3028 | then ... | UseUseExplosion.rb:21:871:21:3044 | if ... | | UseUseExplosion.rb:21:892:21:3028 | if ... | UseUseExplosion.rb:21:887:21:3028 | then ... | @@ -2129,8 +1987,7 @@ | UseUseExplosion.rb:21:896:21:900 | [post] self | UseUseExplosion.rb:21:3019:21:3024 | self | | UseUseExplosion.rb:21:896:21:900 | self | UseUseExplosion.rb:21:917:21:921 | self | | UseUseExplosion.rb:21:896:21:900 | self | UseUseExplosion.rb:21:3019:21:3024 | self | -| UseUseExplosion.rb:21:896:21:905 | ... > ... | UseUseExplosion.rb:21:895:21:906 | [false] ( ... ) | -| UseUseExplosion.rb:21:896:21:905 | ... > ... | UseUseExplosion.rb:21:895:21:906 | [true] ( ... ) | +| UseUseExplosion.rb:21:896:21:905 | ... > ... | UseUseExplosion.rb:21:895:21:906 | ( ... ) | | UseUseExplosion.rb:21:904:21:905 | 58 | UseUseExplosion.rb:21:896:21:905 | ... > ... | | UseUseExplosion.rb:21:908:21:3012 | then ... | UseUseExplosion.rb:21:892:21:3028 | if ... | | UseUseExplosion.rb:21:913:21:3012 | if ... | UseUseExplosion.rb:21:908:21:3012 | then ... | @@ -2139,8 +1996,7 @@ | UseUseExplosion.rb:21:917:21:921 | [post] self | UseUseExplosion.rb:21:3003:21:3008 | self | | UseUseExplosion.rb:21:917:21:921 | self | UseUseExplosion.rb:21:938:21:942 | self | | UseUseExplosion.rb:21:917:21:921 | self | UseUseExplosion.rb:21:3003:21:3008 | self | -| UseUseExplosion.rb:21:917:21:926 | ... > ... | UseUseExplosion.rb:21:916:21:927 | [false] ( ... ) | -| UseUseExplosion.rb:21:917:21:926 | ... > ... | UseUseExplosion.rb:21:916:21:927 | [true] ( ... ) | +| UseUseExplosion.rb:21:917:21:926 | ... > ... | UseUseExplosion.rb:21:916:21:927 | ( ... ) | | UseUseExplosion.rb:21:925:21:926 | 57 | UseUseExplosion.rb:21:917:21:926 | ... > ... | | UseUseExplosion.rb:21:929:21:2996 | then ... | UseUseExplosion.rb:21:913:21:3012 | if ... | | UseUseExplosion.rb:21:934:21:2996 | if ... | UseUseExplosion.rb:21:929:21:2996 | then ... | @@ -2149,8 +2005,7 @@ | UseUseExplosion.rb:21:938:21:942 | [post] self | UseUseExplosion.rb:21:2987:21:2992 | self | | UseUseExplosion.rb:21:938:21:942 | self | UseUseExplosion.rb:21:959:21:963 | self | | UseUseExplosion.rb:21:938:21:942 | self | UseUseExplosion.rb:21:2987:21:2992 | self | -| UseUseExplosion.rb:21:938:21:947 | ... > ... | UseUseExplosion.rb:21:937:21:948 | [false] ( ... ) | -| UseUseExplosion.rb:21:938:21:947 | ... > ... | UseUseExplosion.rb:21:937:21:948 | [true] ( ... ) | +| UseUseExplosion.rb:21:938:21:947 | ... > ... | UseUseExplosion.rb:21:937:21:948 | ( ... ) | | UseUseExplosion.rb:21:946:21:947 | 56 | UseUseExplosion.rb:21:938:21:947 | ... > ... | | UseUseExplosion.rb:21:950:21:2980 | then ... | UseUseExplosion.rb:21:934:21:2996 | if ... | | UseUseExplosion.rb:21:955:21:2980 | if ... | UseUseExplosion.rb:21:950:21:2980 | then ... | @@ -2159,8 +2014,7 @@ | UseUseExplosion.rb:21:959:21:963 | [post] self | UseUseExplosion.rb:21:2971:21:2976 | self | | UseUseExplosion.rb:21:959:21:963 | self | UseUseExplosion.rb:21:980:21:984 | self | | UseUseExplosion.rb:21:959:21:963 | self | UseUseExplosion.rb:21:2971:21:2976 | self | -| UseUseExplosion.rb:21:959:21:968 | ... > ... | UseUseExplosion.rb:21:958:21:969 | [false] ( ... ) | -| UseUseExplosion.rb:21:959:21:968 | ... > ... | UseUseExplosion.rb:21:958:21:969 | [true] ( ... ) | +| UseUseExplosion.rb:21:959:21:968 | ... > ... | UseUseExplosion.rb:21:958:21:969 | ( ... ) | | UseUseExplosion.rb:21:967:21:968 | 55 | UseUseExplosion.rb:21:959:21:968 | ... > ... | | UseUseExplosion.rb:21:971:21:2964 | then ... | UseUseExplosion.rb:21:955:21:2980 | if ... | | UseUseExplosion.rb:21:976:21:2964 | if ... | UseUseExplosion.rb:21:971:21:2964 | then ... | @@ -2169,8 +2023,7 @@ | UseUseExplosion.rb:21:980:21:984 | [post] self | UseUseExplosion.rb:21:2955:21:2960 | self | | UseUseExplosion.rb:21:980:21:984 | self | UseUseExplosion.rb:21:1001:21:1005 | self | | UseUseExplosion.rb:21:980:21:984 | self | UseUseExplosion.rb:21:2955:21:2960 | self | -| UseUseExplosion.rb:21:980:21:989 | ... > ... | UseUseExplosion.rb:21:979:21:990 | [false] ( ... ) | -| UseUseExplosion.rb:21:980:21:989 | ... > ... | UseUseExplosion.rb:21:979:21:990 | [true] ( ... ) | +| UseUseExplosion.rb:21:980:21:989 | ... > ... | UseUseExplosion.rb:21:979:21:990 | ( ... ) | | UseUseExplosion.rb:21:988:21:989 | 54 | UseUseExplosion.rb:21:980:21:989 | ... > ... | | UseUseExplosion.rb:21:992:21:2948 | then ... | UseUseExplosion.rb:21:976:21:2964 | if ... | | UseUseExplosion.rb:21:997:21:2948 | if ... | UseUseExplosion.rb:21:992:21:2948 | then ... | @@ -2179,8 +2032,7 @@ | UseUseExplosion.rb:21:1001:21:1005 | [post] self | UseUseExplosion.rb:21:2939:21:2944 | self | | UseUseExplosion.rb:21:1001:21:1005 | self | UseUseExplosion.rb:21:1022:21:1026 | self | | UseUseExplosion.rb:21:1001:21:1005 | self | UseUseExplosion.rb:21:2939:21:2944 | self | -| UseUseExplosion.rb:21:1001:21:1010 | ... > ... | UseUseExplosion.rb:21:1000:21:1011 | [false] ( ... ) | -| UseUseExplosion.rb:21:1001:21:1010 | ... > ... | UseUseExplosion.rb:21:1000:21:1011 | [true] ( ... ) | +| UseUseExplosion.rb:21:1001:21:1010 | ... > ... | UseUseExplosion.rb:21:1000:21:1011 | ( ... ) | | UseUseExplosion.rb:21:1009:21:1010 | 53 | UseUseExplosion.rb:21:1001:21:1010 | ... > ... | | UseUseExplosion.rb:21:1013:21:2932 | then ... | UseUseExplosion.rb:21:997:21:2948 | if ... | | UseUseExplosion.rb:21:1018:21:2932 | if ... | UseUseExplosion.rb:21:1013:21:2932 | then ... | @@ -2189,8 +2041,7 @@ | UseUseExplosion.rb:21:1022:21:1026 | [post] self | UseUseExplosion.rb:21:2923:21:2928 | self | | UseUseExplosion.rb:21:1022:21:1026 | self | UseUseExplosion.rb:21:1043:21:1047 | self | | UseUseExplosion.rb:21:1022:21:1026 | self | UseUseExplosion.rb:21:2923:21:2928 | self | -| UseUseExplosion.rb:21:1022:21:1031 | ... > ... | UseUseExplosion.rb:21:1021:21:1032 | [false] ( ... ) | -| UseUseExplosion.rb:21:1022:21:1031 | ... > ... | UseUseExplosion.rb:21:1021:21:1032 | [true] ( ... ) | +| UseUseExplosion.rb:21:1022:21:1031 | ... > ... | UseUseExplosion.rb:21:1021:21:1032 | ( ... ) | | UseUseExplosion.rb:21:1030:21:1031 | 52 | UseUseExplosion.rb:21:1022:21:1031 | ... > ... | | UseUseExplosion.rb:21:1034:21:2916 | then ... | UseUseExplosion.rb:21:1018:21:2932 | if ... | | UseUseExplosion.rb:21:1039:21:2916 | if ... | UseUseExplosion.rb:21:1034:21:2916 | then ... | @@ -2199,8 +2050,7 @@ | UseUseExplosion.rb:21:1043:21:1047 | [post] self | UseUseExplosion.rb:21:2907:21:2912 | self | | UseUseExplosion.rb:21:1043:21:1047 | self | UseUseExplosion.rb:21:1064:21:1068 | self | | UseUseExplosion.rb:21:1043:21:1047 | self | UseUseExplosion.rb:21:2907:21:2912 | self | -| UseUseExplosion.rb:21:1043:21:1052 | ... > ... | UseUseExplosion.rb:21:1042:21:1053 | [false] ( ... ) | -| UseUseExplosion.rb:21:1043:21:1052 | ... > ... | UseUseExplosion.rb:21:1042:21:1053 | [true] ( ... ) | +| UseUseExplosion.rb:21:1043:21:1052 | ... > ... | UseUseExplosion.rb:21:1042:21:1053 | ( ... ) | | UseUseExplosion.rb:21:1051:21:1052 | 51 | UseUseExplosion.rb:21:1043:21:1052 | ... > ... | | UseUseExplosion.rb:21:1055:21:2900 | then ... | UseUseExplosion.rb:21:1039:21:2916 | if ... | | UseUseExplosion.rb:21:1060:21:2900 | if ... | UseUseExplosion.rb:21:1055:21:2900 | then ... | @@ -2209,8 +2059,7 @@ | UseUseExplosion.rb:21:1064:21:1068 | [post] self | UseUseExplosion.rb:21:2891:21:2896 | self | | UseUseExplosion.rb:21:1064:21:1068 | self | UseUseExplosion.rb:21:1085:21:1089 | self | | UseUseExplosion.rb:21:1064:21:1068 | self | UseUseExplosion.rb:21:2891:21:2896 | self | -| UseUseExplosion.rb:21:1064:21:1073 | ... > ... | UseUseExplosion.rb:21:1063:21:1074 | [false] ( ... ) | -| UseUseExplosion.rb:21:1064:21:1073 | ... > ... | UseUseExplosion.rb:21:1063:21:1074 | [true] ( ... ) | +| UseUseExplosion.rb:21:1064:21:1073 | ... > ... | UseUseExplosion.rb:21:1063:21:1074 | ( ... ) | | UseUseExplosion.rb:21:1072:21:1073 | 50 | UseUseExplosion.rb:21:1064:21:1073 | ... > ... | | UseUseExplosion.rb:21:1076:21:2884 | then ... | UseUseExplosion.rb:21:1060:21:2900 | if ... | | UseUseExplosion.rb:21:1081:21:2884 | if ... | UseUseExplosion.rb:21:1076:21:2884 | then ... | @@ -2219,8 +2068,7 @@ | UseUseExplosion.rb:21:1085:21:1089 | [post] self | UseUseExplosion.rb:21:2875:21:2880 | self | | UseUseExplosion.rb:21:1085:21:1089 | self | UseUseExplosion.rb:21:1106:21:1110 | self | | UseUseExplosion.rb:21:1085:21:1089 | self | UseUseExplosion.rb:21:2875:21:2880 | self | -| UseUseExplosion.rb:21:1085:21:1094 | ... > ... | UseUseExplosion.rb:21:1084:21:1095 | [false] ( ... ) | -| UseUseExplosion.rb:21:1085:21:1094 | ... > ... | UseUseExplosion.rb:21:1084:21:1095 | [true] ( ... ) | +| UseUseExplosion.rb:21:1085:21:1094 | ... > ... | UseUseExplosion.rb:21:1084:21:1095 | ( ... ) | | UseUseExplosion.rb:21:1093:21:1094 | 49 | UseUseExplosion.rb:21:1085:21:1094 | ... > ... | | UseUseExplosion.rb:21:1097:21:2868 | then ... | UseUseExplosion.rb:21:1081:21:2884 | if ... | | UseUseExplosion.rb:21:1102:21:2868 | if ... | UseUseExplosion.rb:21:1097:21:2868 | then ... | @@ -2229,8 +2077,7 @@ | UseUseExplosion.rb:21:1106:21:1110 | [post] self | UseUseExplosion.rb:21:2859:21:2864 | self | | UseUseExplosion.rb:21:1106:21:1110 | self | UseUseExplosion.rb:21:1127:21:1131 | self | | UseUseExplosion.rb:21:1106:21:1110 | self | UseUseExplosion.rb:21:2859:21:2864 | self | -| UseUseExplosion.rb:21:1106:21:1115 | ... > ... | UseUseExplosion.rb:21:1105:21:1116 | [false] ( ... ) | -| UseUseExplosion.rb:21:1106:21:1115 | ... > ... | UseUseExplosion.rb:21:1105:21:1116 | [true] ( ... ) | +| UseUseExplosion.rb:21:1106:21:1115 | ... > ... | UseUseExplosion.rb:21:1105:21:1116 | ( ... ) | | UseUseExplosion.rb:21:1114:21:1115 | 48 | UseUseExplosion.rb:21:1106:21:1115 | ... > ... | | UseUseExplosion.rb:21:1118:21:2852 | then ... | UseUseExplosion.rb:21:1102:21:2868 | if ... | | UseUseExplosion.rb:21:1123:21:2852 | if ... | UseUseExplosion.rb:21:1118:21:2852 | then ... | @@ -2239,8 +2086,7 @@ | UseUseExplosion.rb:21:1127:21:1131 | [post] self | UseUseExplosion.rb:21:2843:21:2848 | self | | UseUseExplosion.rb:21:1127:21:1131 | self | UseUseExplosion.rb:21:1148:21:1152 | self | | UseUseExplosion.rb:21:1127:21:1131 | self | UseUseExplosion.rb:21:2843:21:2848 | self | -| UseUseExplosion.rb:21:1127:21:1136 | ... > ... | UseUseExplosion.rb:21:1126:21:1137 | [false] ( ... ) | -| UseUseExplosion.rb:21:1127:21:1136 | ... > ... | UseUseExplosion.rb:21:1126:21:1137 | [true] ( ... ) | +| UseUseExplosion.rb:21:1127:21:1136 | ... > ... | UseUseExplosion.rb:21:1126:21:1137 | ( ... ) | | UseUseExplosion.rb:21:1135:21:1136 | 47 | UseUseExplosion.rb:21:1127:21:1136 | ... > ... | | UseUseExplosion.rb:21:1139:21:2836 | then ... | UseUseExplosion.rb:21:1123:21:2852 | if ... | | UseUseExplosion.rb:21:1144:21:2836 | if ... | UseUseExplosion.rb:21:1139:21:2836 | then ... | @@ -2249,8 +2095,7 @@ | UseUseExplosion.rb:21:1148:21:1152 | [post] self | UseUseExplosion.rb:21:2827:21:2832 | self | | UseUseExplosion.rb:21:1148:21:1152 | self | UseUseExplosion.rb:21:1169:21:1173 | self | | UseUseExplosion.rb:21:1148:21:1152 | self | UseUseExplosion.rb:21:2827:21:2832 | self | -| UseUseExplosion.rb:21:1148:21:1157 | ... > ... | UseUseExplosion.rb:21:1147:21:1158 | [false] ( ... ) | -| UseUseExplosion.rb:21:1148:21:1157 | ... > ... | UseUseExplosion.rb:21:1147:21:1158 | [true] ( ... ) | +| UseUseExplosion.rb:21:1148:21:1157 | ... > ... | UseUseExplosion.rb:21:1147:21:1158 | ( ... ) | | UseUseExplosion.rb:21:1156:21:1157 | 46 | UseUseExplosion.rb:21:1148:21:1157 | ... > ... | | UseUseExplosion.rb:21:1160:21:2820 | then ... | UseUseExplosion.rb:21:1144:21:2836 | if ... | | UseUseExplosion.rb:21:1165:21:2820 | if ... | UseUseExplosion.rb:21:1160:21:2820 | then ... | @@ -2259,8 +2104,7 @@ | UseUseExplosion.rb:21:1169:21:1173 | [post] self | UseUseExplosion.rb:21:2811:21:2816 | self | | UseUseExplosion.rb:21:1169:21:1173 | self | UseUseExplosion.rb:21:1190:21:1194 | self | | UseUseExplosion.rb:21:1169:21:1173 | self | UseUseExplosion.rb:21:2811:21:2816 | self | -| UseUseExplosion.rb:21:1169:21:1178 | ... > ... | UseUseExplosion.rb:21:1168:21:1179 | [false] ( ... ) | -| UseUseExplosion.rb:21:1169:21:1178 | ... > ... | UseUseExplosion.rb:21:1168:21:1179 | [true] ( ... ) | +| UseUseExplosion.rb:21:1169:21:1178 | ... > ... | UseUseExplosion.rb:21:1168:21:1179 | ( ... ) | | UseUseExplosion.rb:21:1177:21:1178 | 45 | UseUseExplosion.rb:21:1169:21:1178 | ... > ... | | UseUseExplosion.rb:21:1181:21:2804 | then ... | UseUseExplosion.rb:21:1165:21:2820 | if ... | | UseUseExplosion.rb:21:1186:21:2804 | if ... | UseUseExplosion.rb:21:1181:21:2804 | then ... | @@ -2269,8 +2113,7 @@ | UseUseExplosion.rb:21:1190:21:1194 | [post] self | UseUseExplosion.rb:21:2795:21:2800 | self | | UseUseExplosion.rb:21:1190:21:1194 | self | UseUseExplosion.rb:21:1211:21:1215 | self | | UseUseExplosion.rb:21:1190:21:1194 | self | UseUseExplosion.rb:21:2795:21:2800 | self | -| UseUseExplosion.rb:21:1190:21:1199 | ... > ... | UseUseExplosion.rb:21:1189:21:1200 | [false] ( ... ) | -| UseUseExplosion.rb:21:1190:21:1199 | ... > ... | UseUseExplosion.rb:21:1189:21:1200 | [true] ( ... ) | +| UseUseExplosion.rb:21:1190:21:1199 | ... > ... | UseUseExplosion.rb:21:1189:21:1200 | ( ... ) | | UseUseExplosion.rb:21:1198:21:1199 | 44 | UseUseExplosion.rb:21:1190:21:1199 | ... > ... | | UseUseExplosion.rb:21:1202:21:2788 | then ... | UseUseExplosion.rb:21:1186:21:2804 | if ... | | UseUseExplosion.rb:21:1207:21:2788 | if ... | UseUseExplosion.rb:21:1202:21:2788 | then ... | @@ -2279,8 +2122,7 @@ | UseUseExplosion.rb:21:1211:21:1215 | [post] self | UseUseExplosion.rb:21:2779:21:2784 | self | | UseUseExplosion.rb:21:1211:21:1215 | self | UseUseExplosion.rb:21:1232:21:1236 | self | | UseUseExplosion.rb:21:1211:21:1215 | self | UseUseExplosion.rb:21:2779:21:2784 | self | -| UseUseExplosion.rb:21:1211:21:1220 | ... > ... | UseUseExplosion.rb:21:1210:21:1221 | [false] ( ... ) | -| UseUseExplosion.rb:21:1211:21:1220 | ... > ... | UseUseExplosion.rb:21:1210:21:1221 | [true] ( ... ) | +| UseUseExplosion.rb:21:1211:21:1220 | ... > ... | UseUseExplosion.rb:21:1210:21:1221 | ( ... ) | | UseUseExplosion.rb:21:1219:21:1220 | 43 | UseUseExplosion.rb:21:1211:21:1220 | ... > ... | | UseUseExplosion.rb:21:1223:21:2772 | then ... | UseUseExplosion.rb:21:1207:21:2788 | if ... | | UseUseExplosion.rb:21:1228:21:2772 | if ... | UseUseExplosion.rb:21:1223:21:2772 | then ... | @@ -2289,8 +2131,7 @@ | UseUseExplosion.rb:21:1232:21:1236 | [post] self | UseUseExplosion.rb:21:2763:21:2768 | self | | UseUseExplosion.rb:21:1232:21:1236 | self | UseUseExplosion.rb:21:1253:21:1257 | self | | UseUseExplosion.rb:21:1232:21:1236 | self | UseUseExplosion.rb:21:2763:21:2768 | self | -| UseUseExplosion.rb:21:1232:21:1241 | ... > ... | UseUseExplosion.rb:21:1231:21:1242 | [false] ( ... ) | -| UseUseExplosion.rb:21:1232:21:1241 | ... > ... | UseUseExplosion.rb:21:1231:21:1242 | [true] ( ... ) | +| UseUseExplosion.rb:21:1232:21:1241 | ... > ... | UseUseExplosion.rb:21:1231:21:1242 | ( ... ) | | UseUseExplosion.rb:21:1240:21:1241 | 42 | UseUseExplosion.rb:21:1232:21:1241 | ... > ... | | UseUseExplosion.rb:21:1244:21:2756 | then ... | UseUseExplosion.rb:21:1228:21:2772 | if ... | | UseUseExplosion.rb:21:1249:21:2756 | if ... | UseUseExplosion.rb:21:1244:21:2756 | then ... | @@ -2299,8 +2140,7 @@ | UseUseExplosion.rb:21:1253:21:1257 | [post] self | UseUseExplosion.rb:21:2747:21:2752 | self | | UseUseExplosion.rb:21:1253:21:1257 | self | UseUseExplosion.rb:21:1274:21:1278 | self | | UseUseExplosion.rb:21:1253:21:1257 | self | UseUseExplosion.rb:21:2747:21:2752 | self | -| UseUseExplosion.rb:21:1253:21:1262 | ... > ... | UseUseExplosion.rb:21:1252:21:1263 | [false] ( ... ) | -| UseUseExplosion.rb:21:1253:21:1262 | ... > ... | UseUseExplosion.rb:21:1252:21:1263 | [true] ( ... ) | +| UseUseExplosion.rb:21:1253:21:1262 | ... > ... | UseUseExplosion.rb:21:1252:21:1263 | ( ... ) | | UseUseExplosion.rb:21:1261:21:1262 | 41 | UseUseExplosion.rb:21:1253:21:1262 | ... > ... | | UseUseExplosion.rb:21:1265:21:2740 | then ... | UseUseExplosion.rb:21:1249:21:2756 | if ... | | UseUseExplosion.rb:21:1270:21:2740 | if ... | UseUseExplosion.rb:21:1265:21:2740 | then ... | @@ -2309,8 +2149,7 @@ | UseUseExplosion.rb:21:1274:21:1278 | [post] self | UseUseExplosion.rb:21:2731:21:2736 | self | | UseUseExplosion.rb:21:1274:21:1278 | self | UseUseExplosion.rb:21:1295:21:1299 | self | | UseUseExplosion.rb:21:1274:21:1278 | self | UseUseExplosion.rb:21:2731:21:2736 | self | -| UseUseExplosion.rb:21:1274:21:1283 | ... > ... | UseUseExplosion.rb:21:1273:21:1284 | [false] ( ... ) | -| UseUseExplosion.rb:21:1274:21:1283 | ... > ... | UseUseExplosion.rb:21:1273:21:1284 | [true] ( ... ) | +| UseUseExplosion.rb:21:1274:21:1283 | ... > ... | UseUseExplosion.rb:21:1273:21:1284 | ( ... ) | | UseUseExplosion.rb:21:1282:21:1283 | 40 | UseUseExplosion.rb:21:1274:21:1283 | ... > ... | | UseUseExplosion.rb:21:1286:21:2724 | then ... | UseUseExplosion.rb:21:1270:21:2740 | if ... | | UseUseExplosion.rb:21:1291:21:2724 | if ... | UseUseExplosion.rb:21:1286:21:2724 | then ... | @@ -2319,8 +2158,7 @@ | UseUseExplosion.rb:21:1295:21:1299 | [post] self | UseUseExplosion.rb:21:2715:21:2720 | self | | UseUseExplosion.rb:21:1295:21:1299 | self | UseUseExplosion.rb:21:1316:21:1320 | self | | UseUseExplosion.rb:21:1295:21:1299 | self | UseUseExplosion.rb:21:2715:21:2720 | self | -| UseUseExplosion.rb:21:1295:21:1304 | ... > ... | UseUseExplosion.rb:21:1294:21:1305 | [false] ( ... ) | -| UseUseExplosion.rb:21:1295:21:1304 | ... > ... | UseUseExplosion.rb:21:1294:21:1305 | [true] ( ... ) | +| UseUseExplosion.rb:21:1295:21:1304 | ... > ... | UseUseExplosion.rb:21:1294:21:1305 | ( ... ) | | UseUseExplosion.rb:21:1303:21:1304 | 39 | UseUseExplosion.rb:21:1295:21:1304 | ... > ... | | UseUseExplosion.rb:21:1307:21:2708 | then ... | UseUseExplosion.rb:21:1291:21:2724 | if ... | | UseUseExplosion.rb:21:1312:21:2708 | if ... | UseUseExplosion.rb:21:1307:21:2708 | then ... | @@ -2329,8 +2167,7 @@ | UseUseExplosion.rb:21:1316:21:1320 | [post] self | UseUseExplosion.rb:21:2699:21:2704 | self | | UseUseExplosion.rb:21:1316:21:1320 | self | UseUseExplosion.rb:21:1337:21:1341 | self | | UseUseExplosion.rb:21:1316:21:1320 | self | UseUseExplosion.rb:21:2699:21:2704 | self | -| UseUseExplosion.rb:21:1316:21:1325 | ... > ... | UseUseExplosion.rb:21:1315:21:1326 | [false] ( ... ) | -| UseUseExplosion.rb:21:1316:21:1325 | ... > ... | UseUseExplosion.rb:21:1315:21:1326 | [true] ( ... ) | +| UseUseExplosion.rb:21:1316:21:1325 | ... > ... | UseUseExplosion.rb:21:1315:21:1326 | ( ... ) | | UseUseExplosion.rb:21:1324:21:1325 | 38 | UseUseExplosion.rb:21:1316:21:1325 | ... > ... | | UseUseExplosion.rb:21:1328:21:2692 | then ... | UseUseExplosion.rb:21:1312:21:2708 | if ... | | UseUseExplosion.rb:21:1333:21:2692 | if ... | UseUseExplosion.rb:21:1328:21:2692 | then ... | @@ -2339,8 +2176,7 @@ | UseUseExplosion.rb:21:1337:21:1341 | [post] self | UseUseExplosion.rb:21:2683:21:2688 | self | | UseUseExplosion.rb:21:1337:21:1341 | self | UseUseExplosion.rb:21:1358:21:1362 | self | | UseUseExplosion.rb:21:1337:21:1341 | self | UseUseExplosion.rb:21:2683:21:2688 | self | -| UseUseExplosion.rb:21:1337:21:1346 | ... > ... | UseUseExplosion.rb:21:1336:21:1347 | [false] ( ... ) | -| UseUseExplosion.rb:21:1337:21:1346 | ... > ... | UseUseExplosion.rb:21:1336:21:1347 | [true] ( ... ) | +| UseUseExplosion.rb:21:1337:21:1346 | ... > ... | UseUseExplosion.rb:21:1336:21:1347 | ( ... ) | | UseUseExplosion.rb:21:1345:21:1346 | 37 | UseUseExplosion.rb:21:1337:21:1346 | ... > ... | | UseUseExplosion.rb:21:1349:21:2676 | then ... | UseUseExplosion.rb:21:1333:21:2692 | if ... | | UseUseExplosion.rb:21:1354:21:2676 | if ... | UseUseExplosion.rb:21:1349:21:2676 | then ... | @@ -2349,8 +2185,7 @@ | UseUseExplosion.rb:21:1358:21:1362 | [post] self | UseUseExplosion.rb:21:2667:21:2672 | self | | UseUseExplosion.rb:21:1358:21:1362 | self | UseUseExplosion.rb:21:1379:21:1383 | self | | UseUseExplosion.rb:21:1358:21:1362 | self | UseUseExplosion.rb:21:2667:21:2672 | self | -| UseUseExplosion.rb:21:1358:21:1367 | ... > ... | UseUseExplosion.rb:21:1357:21:1368 | [false] ( ... ) | -| UseUseExplosion.rb:21:1358:21:1367 | ... > ... | UseUseExplosion.rb:21:1357:21:1368 | [true] ( ... ) | +| UseUseExplosion.rb:21:1358:21:1367 | ... > ... | UseUseExplosion.rb:21:1357:21:1368 | ( ... ) | | UseUseExplosion.rb:21:1366:21:1367 | 36 | UseUseExplosion.rb:21:1358:21:1367 | ... > ... | | UseUseExplosion.rb:21:1370:21:2660 | then ... | UseUseExplosion.rb:21:1354:21:2676 | if ... | | UseUseExplosion.rb:21:1375:21:2660 | if ... | UseUseExplosion.rb:21:1370:21:2660 | then ... | @@ -2359,8 +2194,7 @@ | UseUseExplosion.rb:21:1379:21:1383 | [post] self | UseUseExplosion.rb:21:2651:21:2656 | self | | UseUseExplosion.rb:21:1379:21:1383 | self | UseUseExplosion.rb:21:1400:21:1404 | self | | UseUseExplosion.rb:21:1379:21:1383 | self | UseUseExplosion.rb:21:2651:21:2656 | self | -| UseUseExplosion.rb:21:1379:21:1388 | ... > ... | UseUseExplosion.rb:21:1378:21:1389 | [false] ( ... ) | -| UseUseExplosion.rb:21:1379:21:1388 | ... > ... | UseUseExplosion.rb:21:1378:21:1389 | [true] ( ... ) | +| UseUseExplosion.rb:21:1379:21:1388 | ... > ... | UseUseExplosion.rb:21:1378:21:1389 | ( ... ) | | UseUseExplosion.rb:21:1387:21:1388 | 35 | UseUseExplosion.rb:21:1379:21:1388 | ... > ... | | UseUseExplosion.rb:21:1391:21:2644 | then ... | UseUseExplosion.rb:21:1375:21:2660 | if ... | | UseUseExplosion.rb:21:1396:21:2644 | if ... | UseUseExplosion.rb:21:1391:21:2644 | then ... | @@ -2369,8 +2203,7 @@ | UseUseExplosion.rb:21:1400:21:1404 | [post] self | UseUseExplosion.rb:21:2635:21:2640 | self | | UseUseExplosion.rb:21:1400:21:1404 | self | UseUseExplosion.rb:21:1421:21:1425 | self | | UseUseExplosion.rb:21:1400:21:1404 | self | UseUseExplosion.rb:21:2635:21:2640 | self | -| UseUseExplosion.rb:21:1400:21:1409 | ... > ... | UseUseExplosion.rb:21:1399:21:1410 | [false] ( ... ) | -| UseUseExplosion.rb:21:1400:21:1409 | ... > ... | UseUseExplosion.rb:21:1399:21:1410 | [true] ( ... ) | +| UseUseExplosion.rb:21:1400:21:1409 | ... > ... | UseUseExplosion.rb:21:1399:21:1410 | ( ... ) | | UseUseExplosion.rb:21:1408:21:1409 | 34 | UseUseExplosion.rb:21:1400:21:1409 | ... > ... | | UseUseExplosion.rb:21:1412:21:2628 | then ... | UseUseExplosion.rb:21:1396:21:2644 | if ... | | UseUseExplosion.rb:21:1417:21:2628 | if ... | UseUseExplosion.rb:21:1412:21:2628 | then ... | @@ -2379,8 +2212,7 @@ | UseUseExplosion.rb:21:1421:21:1425 | [post] self | UseUseExplosion.rb:21:2619:21:2624 | self | | UseUseExplosion.rb:21:1421:21:1425 | self | UseUseExplosion.rb:21:1442:21:1446 | self | | UseUseExplosion.rb:21:1421:21:1425 | self | UseUseExplosion.rb:21:2619:21:2624 | self | -| UseUseExplosion.rb:21:1421:21:1430 | ... > ... | UseUseExplosion.rb:21:1420:21:1431 | [false] ( ... ) | -| UseUseExplosion.rb:21:1421:21:1430 | ... > ... | UseUseExplosion.rb:21:1420:21:1431 | [true] ( ... ) | +| UseUseExplosion.rb:21:1421:21:1430 | ... > ... | UseUseExplosion.rb:21:1420:21:1431 | ( ... ) | | UseUseExplosion.rb:21:1429:21:1430 | 33 | UseUseExplosion.rb:21:1421:21:1430 | ... > ... | | UseUseExplosion.rb:21:1433:21:2612 | then ... | UseUseExplosion.rb:21:1417:21:2628 | if ... | | UseUseExplosion.rb:21:1438:21:2612 | if ... | UseUseExplosion.rb:21:1433:21:2612 | then ... | @@ -2389,8 +2221,7 @@ | UseUseExplosion.rb:21:1442:21:1446 | [post] self | UseUseExplosion.rb:21:2603:21:2608 | self | | UseUseExplosion.rb:21:1442:21:1446 | self | UseUseExplosion.rb:21:1463:21:1467 | self | | UseUseExplosion.rb:21:1442:21:1446 | self | UseUseExplosion.rb:21:2603:21:2608 | self | -| UseUseExplosion.rb:21:1442:21:1451 | ... > ... | UseUseExplosion.rb:21:1441:21:1452 | [false] ( ... ) | -| UseUseExplosion.rb:21:1442:21:1451 | ... > ... | UseUseExplosion.rb:21:1441:21:1452 | [true] ( ... ) | +| UseUseExplosion.rb:21:1442:21:1451 | ... > ... | UseUseExplosion.rb:21:1441:21:1452 | ( ... ) | | UseUseExplosion.rb:21:1450:21:1451 | 32 | UseUseExplosion.rb:21:1442:21:1451 | ... > ... | | UseUseExplosion.rb:21:1454:21:2596 | then ... | UseUseExplosion.rb:21:1438:21:2612 | if ... | | UseUseExplosion.rb:21:1459:21:2596 | if ... | UseUseExplosion.rb:21:1454:21:2596 | then ... | @@ -2399,8 +2230,7 @@ | UseUseExplosion.rb:21:1463:21:1467 | [post] self | UseUseExplosion.rb:21:2587:21:2592 | self | | UseUseExplosion.rb:21:1463:21:1467 | self | UseUseExplosion.rb:21:1484:21:1488 | self | | UseUseExplosion.rb:21:1463:21:1467 | self | UseUseExplosion.rb:21:2587:21:2592 | self | -| UseUseExplosion.rb:21:1463:21:1472 | ... > ... | UseUseExplosion.rb:21:1462:21:1473 | [false] ( ... ) | -| UseUseExplosion.rb:21:1463:21:1472 | ... > ... | UseUseExplosion.rb:21:1462:21:1473 | [true] ( ... ) | +| UseUseExplosion.rb:21:1463:21:1472 | ... > ... | UseUseExplosion.rb:21:1462:21:1473 | ( ... ) | | UseUseExplosion.rb:21:1471:21:1472 | 31 | UseUseExplosion.rb:21:1463:21:1472 | ... > ... | | UseUseExplosion.rb:21:1475:21:2580 | then ... | UseUseExplosion.rb:21:1459:21:2596 | if ... | | UseUseExplosion.rb:21:1480:21:2580 | if ... | UseUseExplosion.rb:21:1475:21:2580 | then ... | @@ -2409,8 +2239,7 @@ | UseUseExplosion.rb:21:1484:21:1488 | [post] self | UseUseExplosion.rb:21:2571:21:2576 | self | | UseUseExplosion.rb:21:1484:21:1488 | self | UseUseExplosion.rb:21:1505:21:1509 | self | | UseUseExplosion.rb:21:1484:21:1488 | self | UseUseExplosion.rb:21:2571:21:2576 | self | -| UseUseExplosion.rb:21:1484:21:1493 | ... > ... | UseUseExplosion.rb:21:1483:21:1494 | [false] ( ... ) | -| UseUseExplosion.rb:21:1484:21:1493 | ... > ... | UseUseExplosion.rb:21:1483:21:1494 | [true] ( ... ) | +| UseUseExplosion.rb:21:1484:21:1493 | ... > ... | UseUseExplosion.rb:21:1483:21:1494 | ( ... ) | | UseUseExplosion.rb:21:1492:21:1493 | 30 | UseUseExplosion.rb:21:1484:21:1493 | ... > ... | | UseUseExplosion.rb:21:1496:21:2564 | then ... | UseUseExplosion.rb:21:1480:21:2580 | if ... | | UseUseExplosion.rb:21:1501:21:2564 | if ... | UseUseExplosion.rb:21:1496:21:2564 | then ... | @@ -2419,8 +2248,7 @@ | UseUseExplosion.rb:21:1505:21:1509 | [post] self | UseUseExplosion.rb:21:2555:21:2560 | self | | UseUseExplosion.rb:21:1505:21:1509 | self | UseUseExplosion.rb:21:1526:21:1530 | self | | UseUseExplosion.rb:21:1505:21:1509 | self | UseUseExplosion.rb:21:2555:21:2560 | self | -| UseUseExplosion.rb:21:1505:21:1514 | ... > ... | UseUseExplosion.rb:21:1504:21:1515 | [false] ( ... ) | -| UseUseExplosion.rb:21:1505:21:1514 | ... > ... | UseUseExplosion.rb:21:1504:21:1515 | [true] ( ... ) | +| UseUseExplosion.rb:21:1505:21:1514 | ... > ... | UseUseExplosion.rb:21:1504:21:1515 | ( ... ) | | UseUseExplosion.rb:21:1513:21:1514 | 29 | UseUseExplosion.rb:21:1505:21:1514 | ... > ... | | UseUseExplosion.rb:21:1517:21:2548 | then ... | UseUseExplosion.rb:21:1501:21:2564 | if ... | | UseUseExplosion.rb:21:1522:21:2548 | if ... | UseUseExplosion.rb:21:1517:21:2548 | then ... | @@ -2429,8 +2257,7 @@ | UseUseExplosion.rb:21:1526:21:1530 | [post] self | UseUseExplosion.rb:21:2539:21:2544 | self | | UseUseExplosion.rb:21:1526:21:1530 | self | UseUseExplosion.rb:21:1547:21:1551 | self | | UseUseExplosion.rb:21:1526:21:1530 | self | UseUseExplosion.rb:21:2539:21:2544 | self | -| UseUseExplosion.rb:21:1526:21:1535 | ... > ... | UseUseExplosion.rb:21:1525:21:1536 | [false] ( ... ) | -| UseUseExplosion.rb:21:1526:21:1535 | ... > ... | UseUseExplosion.rb:21:1525:21:1536 | [true] ( ... ) | +| UseUseExplosion.rb:21:1526:21:1535 | ... > ... | UseUseExplosion.rb:21:1525:21:1536 | ( ... ) | | UseUseExplosion.rb:21:1534:21:1535 | 28 | UseUseExplosion.rb:21:1526:21:1535 | ... > ... | | UseUseExplosion.rb:21:1538:21:2532 | then ... | UseUseExplosion.rb:21:1522:21:2548 | if ... | | UseUseExplosion.rb:21:1543:21:2532 | if ... | UseUseExplosion.rb:21:1538:21:2532 | then ... | @@ -2439,8 +2266,7 @@ | UseUseExplosion.rb:21:1547:21:1551 | [post] self | UseUseExplosion.rb:21:2523:21:2528 | self | | UseUseExplosion.rb:21:1547:21:1551 | self | UseUseExplosion.rb:21:1568:21:1572 | self | | UseUseExplosion.rb:21:1547:21:1551 | self | UseUseExplosion.rb:21:2523:21:2528 | self | -| UseUseExplosion.rb:21:1547:21:1556 | ... > ... | UseUseExplosion.rb:21:1546:21:1557 | [false] ( ... ) | -| UseUseExplosion.rb:21:1547:21:1556 | ... > ... | UseUseExplosion.rb:21:1546:21:1557 | [true] ( ... ) | +| UseUseExplosion.rb:21:1547:21:1556 | ... > ... | UseUseExplosion.rb:21:1546:21:1557 | ( ... ) | | UseUseExplosion.rb:21:1555:21:1556 | 27 | UseUseExplosion.rb:21:1547:21:1556 | ... > ... | | UseUseExplosion.rb:21:1559:21:2516 | then ... | UseUseExplosion.rb:21:1543:21:2532 | if ... | | UseUseExplosion.rb:21:1564:21:2516 | if ... | UseUseExplosion.rb:21:1559:21:2516 | then ... | @@ -2449,8 +2275,7 @@ | UseUseExplosion.rb:21:1568:21:1572 | [post] self | UseUseExplosion.rb:21:2507:21:2512 | self | | UseUseExplosion.rb:21:1568:21:1572 | self | UseUseExplosion.rb:21:1589:21:1593 | self | | UseUseExplosion.rb:21:1568:21:1572 | self | UseUseExplosion.rb:21:2507:21:2512 | self | -| UseUseExplosion.rb:21:1568:21:1577 | ... > ... | UseUseExplosion.rb:21:1567:21:1578 | [false] ( ... ) | -| UseUseExplosion.rb:21:1568:21:1577 | ... > ... | UseUseExplosion.rb:21:1567:21:1578 | [true] ( ... ) | +| UseUseExplosion.rb:21:1568:21:1577 | ... > ... | UseUseExplosion.rb:21:1567:21:1578 | ( ... ) | | UseUseExplosion.rb:21:1576:21:1577 | 26 | UseUseExplosion.rb:21:1568:21:1577 | ... > ... | | UseUseExplosion.rb:21:1580:21:2500 | then ... | UseUseExplosion.rb:21:1564:21:2516 | if ... | | UseUseExplosion.rb:21:1585:21:2500 | if ... | UseUseExplosion.rb:21:1580:21:2500 | then ... | @@ -2459,8 +2284,7 @@ | UseUseExplosion.rb:21:1589:21:1593 | [post] self | UseUseExplosion.rb:21:2491:21:2496 | self | | UseUseExplosion.rb:21:1589:21:1593 | self | UseUseExplosion.rb:21:1610:21:1614 | self | | UseUseExplosion.rb:21:1589:21:1593 | self | UseUseExplosion.rb:21:2491:21:2496 | self | -| UseUseExplosion.rb:21:1589:21:1598 | ... > ... | UseUseExplosion.rb:21:1588:21:1599 | [false] ( ... ) | -| UseUseExplosion.rb:21:1589:21:1598 | ... > ... | UseUseExplosion.rb:21:1588:21:1599 | [true] ( ... ) | +| UseUseExplosion.rb:21:1589:21:1598 | ... > ... | UseUseExplosion.rb:21:1588:21:1599 | ( ... ) | | UseUseExplosion.rb:21:1597:21:1598 | 25 | UseUseExplosion.rb:21:1589:21:1598 | ... > ... | | UseUseExplosion.rb:21:1601:21:2484 | then ... | UseUseExplosion.rb:21:1585:21:2500 | if ... | | UseUseExplosion.rb:21:1606:21:2484 | if ... | UseUseExplosion.rb:21:1601:21:2484 | then ... | @@ -2469,8 +2293,7 @@ | UseUseExplosion.rb:21:1610:21:1614 | [post] self | UseUseExplosion.rb:21:2475:21:2480 | self | | UseUseExplosion.rb:21:1610:21:1614 | self | UseUseExplosion.rb:21:1631:21:1635 | self | | UseUseExplosion.rb:21:1610:21:1614 | self | UseUseExplosion.rb:21:2475:21:2480 | self | -| UseUseExplosion.rb:21:1610:21:1619 | ... > ... | UseUseExplosion.rb:21:1609:21:1620 | [false] ( ... ) | -| UseUseExplosion.rb:21:1610:21:1619 | ... > ... | UseUseExplosion.rb:21:1609:21:1620 | [true] ( ... ) | +| UseUseExplosion.rb:21:1610:21:1619 | ... > ... | UseUseExplosion.rb:21:1609:21:1620 | ( ... ) | | UseUseExplosion.rb:21:1618:21:1619 | 24 | UseUseExplosion.rb:21:1610:21:1619 | ... > ... | | UseUseExplosion.rb:21:1622:21:2468 | then ... | UseUseExplosion.rb:21:1606:21:2484 | if ... | | UseUseExplosion.rb:21:1627:21:2468 | if ... | UseUseExplosion.rb:21:1622:21:2468 | then ... | @@ -2479,8 +2302,7 @@ | UseUseExplosion.rb:21:1631:21:1635 | [post] self | UseUseExplosion.rb:21:2459:21:2464 | self | | UseUseExplosion.rb:21:1631:21:1635 | self | UseUseExplosion.rb:21:1652:21:1656 | self | | UseUseExplosion.rb:21:1631:21:1635 | self | UseUseExplosion.rb:21:2459:21:2464 | self | -| UseUseExplosion.rb:21:1631:21:1640 | ... > ... | UseUseExplosion.rb:21:1630:21:1641 | [false] ( ... ) | -| UseUseExplosion.rb:21:1631:21:1640 | ... > ... | UseUseExplosion.rb:21:1630:21:1641 | [true] ( ... ) | +| UseUseExplosion.rb:21:1631:21:1640 | ... > ... | UseUseExplosion.rb:21:1630:21:1641 | ( ... ) | | UseUseExplosion.rb:21:1639:21:1640 | 23 | UseUseExplosion.rb:21:1631:21:1640 | ... > ... | | UseUseExplosion.rb:21:1643:21:2452 | then ... | UseUseExplosion.rb:21:1627:21:2468 | if ... | | UseUseExplosion.rb:21:1648:21:2452 | if ... | UseUseExplosion.rb:21:1643:21:2452 | then ... | @@ -2489,8 +2311,7 @@ | UseUseExplosion.rb:21:1652:21:1656 | [post] self | UseUseExplosion.rb:21:2443:21:2448 | self | | UseUseExplosion.rb:21:1652:21:1656 | self | UseUseExplosion.rb:21:1673:21:1677 | self | | UseUseExplosion.rb:21:1652:21:1656 | self | UseUseExplosion.rb:21:2443:21:2448 | self | -| UseUseExplosion.rb:21:1652:21:1661 | ... > ... | UseUseExplosion.rb:21:1651:21:1662 | [false] ( ... ) | -| UseUseExplosion.rb:21:1652:21:1661 | ... > ... | UseUseExplosion.rb:21:1651:21:1662 | [true] ( ... ) | +| UseUseExplosion.rb:21:1652:21:1661 | ... > ... | UseUseExplosion.rb:21:1651:21:1662 | ( ... ) | | UseUseExplosion.rb:21:1660:21:1661 | 22 | UseUseExplosion.rb:21:1652:21:1661 | ... > ... | | UseUseExplosion.rb:21:1664:21:2436 | then ... | UseUseExplosion.rb:21:1648:21:2452 | if ... | | UseUseExplosion.rb:21:1669:21:2436 | if ... | UseUseExplosion.rb:21:1664:21:2436 | then ... | @@ -2499,8 +2320,7 @@ | UseUseExplosion.rb:21:1673:21:1677 | [post] self | UseUseExplosion.rb:21:2427:21:2432 | self | | UseUseExplosion.rb:21:1673:21:1677 | self | UseUseExplosion.rb:21:1694:21:1698 | self | | UseUseExplosion.rb:21:1673:21:1677 | self | UseUseExplosion.rb:21:2427:21:2432 | self | -| UseUseExplosion.rb:21:1673:21:1682 | ... > ... | UseUseExplosion.rb:21:1672:21:1683 | [false] ( ... ) | -| UseUseExplosion.rb:21:1673:21:1682 | ... > ... | UseUseExplosion.rb:21:1672:21:1683 | [true] ( ... ) | +| UseUseExplosion.rb:21:1673:21:1682 | ... > ... | UseUseExplosion.rb:21:1672:21:1683 | ( ... ) | | UseUseExplosion.rb:21:1681:21:1682 | 21 | UseUseExplosion.rb:21:1673:21:1682 | ... > ... | | UseUseExplosion.rb:21:1685:21:2420 | then ... | UseUseExplosion.rb:21:1669:21:2436 | if ... | | UseUseExplosion.rb:21:1690:21:2420 | if ... | UseUseExplosion.rb:21:1685:21:2420 | then ... | @@ -2509,8 +2329,7 @@ | UseUseExplosion.rb:21:1694:21:1698 | [post] self | UseUseExplosion.rb:21:2411:21:2416 | self | | UseUseExplosion.rb:21:1694:21:1698 | self | UseUseExplosion.rb:21:1715:21:1719 | self | | UseUseExplosion.rb:21:1694:21:1698 | self | UseUseExplosion.rb:21:2411:21:2416 | self | -| UseUseExplosion.rb:21:1694:21:1703 | ... > ... | UseUseExplosion.rb:21:1693:21:1704 | [false] ( ... ) | -| UseUseExplosion.rb:21:1694:21:1703 | ... > ... | UseUseExplosion.rb:21:1693:21:1704 | [true] ( ... ) | +| UseUseExplosion.rb:21:1694:21:1703 | ... > ... | UseUseExplosion.rb:21:1693:21:1704 | ( ... ) | | UseUseExplosion.rb:21:1702:21:1703 | 20 | UseUseExplosion.rb:21:1694:21:1703 | ... > ... | | UseUseExplosion.rb:21:1706:21:2404 | then ... | UseUseExplosion.rb:21:1690:21:2420 | if ... | | UseUseExplosion.rb:21:1711:21:2404 | if ... | UseUseExplosion.rb:21:1706:21:2404 | then ... | @@ -2519,8 +2338,7 @@ | UseUseExplosion.rb:21:1715:21:1719 | [post] self | UseUseExplosion.rb:21:2395:21:2400 | self | | UseUseExplosion.rb:21:1715:21:1719 | self | UseUseExplosion.rb:21:1736:21:1740 | self | | UseUseExplosion.rb:21:1715:21:1719 | self | UseUseExplosion.rb:21:2395:21:2400 | self | -| UseUseExplosion.rb:21:1715:21:1724 | ... > ... | UseUseExplosion.rb:21:1714:21:1725 | [false] ( ... ) | -| UseUseExplosion.rb:21:1715:21:1724 | ... > ... | UseUseExplosion.rb:21:1714:21:1725 | [true] ( ... ) | +| UseUseExplosion.rb:21:1715:21:1724 | ... > ... | UseUseExplosion.rb:21:1714:21:1725 | ( ... ) | | UseUseExplosion.rb:21:1723:21:1724 | 19 | UseUseExplosion.rb:21:1715:21:1724 | ... > ... | | UseUseExplosion.rb:21:1727:21:2388 | then ... | UseUseExplosion.rb:21:1711:21:2404 | if ... | | UseUseExplosion.rb:21:1732:21:2388 | if ... | UseUseExplosion.rb:21:1727:21:2388 | then ... | @@ -2529,8 +2347,7 @@ | UseUseExplosion.rb:21:1736:21:1740 | [post] self | UseUseExplosion.rb:21:2379:21:2384 | self | | UseUseExplosion.rb:21:1736:21:1740 | self | UseUseExplosion.rb:21:1757:21:1761 | self | | UseUseExplosion.rb:21:1736:21:1740 | self | UseUseExplosion.rb:21:2379:21:2384 | self | -| UseUseExplosion.rb:21:1736:21:1745 | ... > ... | UseUseExplosion.rb:21:1735:21:1746 | [false] ( ... ) | -| UseUseExplosion.rb:21:1736:21:1745 | ... > ... | UseUseExplosion.rb:21:1735:21:1746 | [true] ( ... ) | +| UseUseExplosion.rb:21:1736:21:1745 | ... > ... | UseUseExplosion.rb:21:1735:21:1746 | ( ... ) | | UseUseExplosion.rb:21:1744:21:1745 | 18 | UseUseExplosion.rb:21:1736:21:1745 | ... > ... | | UseUseExplosion.rb:21:1748:21:2372 | then ... | UseUseExplosion.rb:21:1732:21:2388 | if ... | | UseUseExplosion.rb:21:1753:21:2372 | if ... | UseUseExplosion.rb:21:1748:21:2372 | then ... | @@ -2539,8 +2356,7 @@ | UseUseExplosion.rb:21:1757:21:1761 | [post] self | UseUseExplosion.rb:21:2363:21:2368 | self | | UseUseExplosion.rb:21:1757:21:1761 | self | UseUseExplosion.rb:21:1778:21:1782 | self | | UseUseExplosion.rb:21:1757:21:1761 | self | UseUseExplosion.rb:21:2363:21:2368 | self | -| UseUseExplosion.rb:21:1757:21:1766 | ... > ... | UseUseExplosion.rb:21:1756:21:1767 | [false] ( ... ) | -| UseUseExplosion.rb:21:1757:21:1766 | ... > ... | UseUseExplosion.rb:21:1756:21:1767 | [true] ( ... ) | +| UseUseExplosion.rb:21:1757:21:1766 | ... > ... | UseUseExplosion.rb:21:1756:21:1767 | ( ... ) | | UseUseExplosion.rb:21:1765:21:1766 | 17 | UseUseExplosion.rb:21:1757:21:1766 | ... > ... | | UseUseExplosion.rb:21:1769:21:2356 | then ... | UseUseExplosion.rb:21:1753:21:2372 | if ... | | UseUseExplosion.rb:21:1774:21:2356 | if ... | UseUseExplosion.rb:21:1769:21:2356 | then ... | @@ -2549,8 +2365,7 @@ | UseUseExplosion.rb:21:1778:21:1782 | [post] self | UseUseExplosion.rb:21:2347:21:2352 | self | | UseUseExplosion.rb:21:1778:21:1782 | self | UseUseExplosion.rb:21:1799:21:1803 | self | | UseUseExplosion.rb:21:1778:21:1782 | self | UseUseExplosion.rb:21:2347:21:2352 | self | -| UseUseExplosion.rb:21:1778:21:1787 | ... > ... | UseUseExplosion.rb:21:1777:21:1788 | [false] ( ... ) | -| UseUseExplosion.rb:21:1778:21:1787 | ... > ... | UseUseExplosion.rb:21:1777:21:1788 | [true] ( ... ) | +| UseUseExplosion.rb:21:1778:21:1787 | ... > ... | UseUseExplosion.rb:21:1777:21:1788 | ( ... ) | | UseUseExplosion.rb:21:1786:21:1787 | 16 | UseUseExplosion.rb:21:1778:21:1787 | ... > ... | | UseUseExplosion.rb:21:1790:21:2340 | then ... | UseUseExplosion.rb:21:1774:21:2356 | if ... | | UseUseExplosion.rb:21:1795:21:2340 | if ... | UseUseExplosion.rb:21:1790:21:2340 | then ... | @@ -2559,8 +2374,7 @@ | UseUseExplosion.rb:21:1799:21:1803 | [post] self | UseUseExplosion.rb:21:2331:21:2336 | self | | UseUseExplosion.rb:21:1799:21:1803 | self | UseUseExplosion.rb:21:1820:21:1824 | self | | UseUseExplosion.rb:21:1799:21:1803 | self | UseUseExplosion.rb:21:2331:21:2336 | self | -| UseUseExplosion.rb:21:1799:21:1808 | ... > ... | UseUseExplosion.rb:21:1798:21:1809 | [false] ( ... ) | -| UseUseExplosion.rb:21:1799:21:1808 | ... > ... | UseUseExplosion.rb:21:1798:21:1809 | [true] ( ... ) | +| UseUseExplosion.rb:21:1799:21:1808 | ... > ... | UseUseExplosion.rb:21:1798:21:1809 | ( ... ) | | UseUseExplosion.rb:21:1807:21:1808 | 15 | UseUseExplosion.rb:21:1799:21:1808 | ... > ... | | UseUseExplosion.rb:21:1811:21:2324 | then ... | UseUseExplosion.rb:21:1795:21:2340 | if ... | | UseUseExplosion.rb:21:1816:21:2324 | if ... | UseUseExplosion.rb:21:1811:21:2324 | then ... | @@ -2569,8 +2383,7 @@ | UseUseExplosion.rb:21:1820:21:1824 | [post] self | UseUseExplosion.rb:21:2315:21:2320 | self | | UseUseExplosion.rb:21:1820:21:1824 | self | UseUseExplosion.rb:21:1841:21:1845 | self | | UseUseExplosion.rb:21:1820:21:1824 | self | UseUseExplosion.rb:21:2315:21:2320 | self | -| UseUseExplosion.rb:21:1820:21:1829 | ... > ... | UseUseExplosion.rb:21:1819:21:1830 | [false] ( ... ) | -| UseUseExplosion.rb:21:1820:21:1829 | ... > ... | UseUseExplosion.rb:21:1819:21:1830 | [true] ( ... ) | +| UseUseExplosion.rb:21:1820:21:1829 | ... > ... | UseUseExplosion.rb:21:1819:21:1830 | ( ... ) | | UseUseExplosion.rb:21:1828:21:1829 | 14 | UseUseExplosion.rb:21:1820:21:1829 | ... > ... | | UseUseExplosion.rb:21:1832:21:2308 | then ... | UseUseExplosion.rb:21:1816:21:2324 | if ... | | UseUseExplosion.rb:21:1837:21:2308 | if ... | UseUseExplosion.rb:21:1832:21:2308 | then ... | @@ -2579,8 +2392,7 @@ | UseUseExplosion.rb:21:1841:21:1845 | [post] self | UseUseExplosion.rb:21:2299:21:2304 | self | | UseUseExplosion.rb:21:1841:21:1845 | self | UseUseExplosion.rb:21:1862:21:1866 | self | | UseUseExplosion.rb:21:1841:21:1845 | self | UseUseExplosion.rb:21:2299:21:2304 | self | -| UseUseExplosion.rb:21:1841:21:1850 | ... > ... | UseUseExplosion.rb:21:1840:21:1851 | [false] ( ... ) | -| UseUseExplosion.rb:21:1841:21:1850 | ... > ... | UseUseExplosion.rb:21:1840:21:1851 | [true] ( ... ) | +| UseUseExplosion.rb:21:1841:21:1850 | ... > ... | UseUseExplosion.rb:21:1840:21:1851 | ( ... ) | | UseUseExplosion.rb:21:1849:21:1850 | 13 | UseUseExplosion.rb:21:1841:21:1850 | ... > ... | | UseUseExplosion.rb:21:1853:21:2292 | then ... | UseUseExplosion.rb:21:1837:21:2308 | if ... | | UseUseExplosion.rb:21:1858:21:2292 | if ... | UseUseExplosion.rb:21:1853:21:2292 | then ... | @@ -2589,8 +2401,7 @@ | UseUseExplosion.rb:21:1862:21:1866 | [post] self | UseUseExplosion.rb:21:2283:21:2288 | self | | UseUseExplosion.rb:21:1862:21:1866 | self | UseUseExplosion.rb:21:1883:21:1887 | self | | UseUseExplosion.rb:21:1862:21:1866 | self | UseUseExplosion.rb:21:2283:21:2288 | self | -| UseUseExplosion.rb:21:1862:21:1871 | ... > ... | UseUseExplosion.rb:21:1861:21:1872 | [false] ( ... ) | -| UseUseExplosion.rb:21:1862:21:1871 | ... > ... | UseUseExplosion.rb:21:1861:21:1872 | [true] ( ... ) | +| UseUseExplosion.rb:21:1862:21:1871 | ... > ... | UseUseExplosion.rb:21:1861:21:1872 | ( ... ) | | UseUseExplosion.rb:21:1870:21:1871 | 12 | UseUseExplosion.rb:21:1862:21:1871 | ... > ... | | UseUseExplosion.rb:21:1874:21:2276 | then ... | UseUseExplosion.rb:21:1858:21:2292 | if ... | | UseUseExplosion.rb:21:1879:21:2276 | if ... | UseUseExplosion.rb:21:1874:21:2276 | then ... | @@ -2599,8 +2410,7 @@ | UseUseExplosion.rb:21:1883:21:1887 | [post] self | UseUseExplosion.rb:21:2267:21:2272 | self | | UseUseExplosion.rb:21:1883:21:1887 | self | UseUseExplosion.rb:21:1904:21:1908 | self | | UseUseExplosion.rb:21:1883:21:1887 | self | UseUseExplosion.rb:21:2267:21:2272 | self | -| UseUseExplosion.rb:21:1883:21:1892 | ... > ... | UseUseExplosion.rb:21:1882:21:1893 | [false] ( ... ) | -| UseUseExplosion.rb:21:1883:21:1892 | ... > ... | UseUseExplosion.rb:21:1882:21:1893 | [true] ( ... ) | +| UseUseExplosion.rb:21:1883:21:1892 | ... > ... | UseUseExplosion.rb:21:1882:21:1893 | ( ... ) | | UseUseExplosion.rb:21:1891:21:1892 | 11 | UseUseExplosion.rb:21:1883:21:1892 | ... > ... | | UseUseExplosion.rb:21:1895:21:2260 | then ... | UseUseExplosion.rb:21:1879:21:2276 | if ... | | UseUseExplosion.rb:21:1900:21:2260 | if ... | UseUseExplosion.rb:21:1895:21:2260 | then ... | @@ -2609,8 +2419,7 @@ | UseUseExplosion.rb:21:1904:21:1908 | [post] self | UseUseExplosion.rb:21:2251:21:2256 | self | | UseUseExplosion.rb:21:1904:21:1908 | self | UseUseExplosion.rb:21:1925:21:1929 | self | | UseUseExplosion.rb:21:1904:21:1908 | self | UseUseExplosion.rb:21:2251:21:2256 | self | -| UseUseExplosion.rb:21:1904:21:1913 | ... > ... | UseUseExplosion.rb:21:1903:21:1914 | [false] ( ... ) | -| UseUseExplosion.rb:21:1904:21:1913 | ... > ... | UseUseExplosion.rb:21:1903:21:1914 | [true] ( ... ) | +| UseUseExplosion.rb:21:1904:21:1913 | ... > ... | UseUseExplosion.rb:21:1903:21:1914 | ( ... ) | | UseUseExplosion.rb:21:1912:21:1913 | 10 | UseUseExplosion.rb:21:1904:21:1913 | ... > ... | | UseUseExplosion.rb:21:1916:21:2244 | then ... | UseUseExplosion.rb:21:1900:21:2260 | if ... | | UseUseExplosion.rb:21:1921:21:2244 | if ... | UseUseExplosion.rb:21:1916:21:2244 | then ... | @@ -2619,8 +2428,7 @@ | UseUseExplosion.rb:21:1925:21:1929 | [post] self | UseUseExplosion.rb:21:2235:21:2240 | self | | UseUseExplosion.rb:21:1925:21:1929 | self | UseUseExplosion.rb:21:1945:21:1949 | self | | UseUseExplosion.rb:21:1925:21:1929 | self | UseUseExplosion.rb:21:2235:21:2240 | self | -| UseUseExplosion.rb:21:1925:21:1933 | ... > ... | UseUseExplosion.rb:21:1924:21:1934 | [false] ( ... ) | -| UseUseExplosion.rb:21:1925:21:1933 | ... > ... | UseUseExplosion.rb:21:1924:21:1934 | [true] ( ... ) | +| UseUseExplosion.rb:21:1925:21:1933 | ... > ... | UseUseExplosion.rb:21:1924:21:1934 | ( ... ) | | UseUseExplosion.rb:21:1933:21:1933 | 9 | UseUseExplosion.rb:21:1925:21:1933 | ... > ... | | UseUseExplosion.rb:21:1936:21:2228 | then ... | UseUseExplosion.rb:21:1921:21:2244 | if ... | | UseUseExplosion.rb:21:1941:21:2228 | if ... | UseUseExplosion.rb:21:1936:21:2228 | then ... | @@ -2629,8 +2437,7 @@ | UseUseExplosion.rb:21:1945:21:1949 | [post] self | UseUseExplosion.rb:21:2219:21:2224 | self | | UseUseExplosion.rb:21:1945:21:1949 | self | UseUseExplosion.rb:21:1965:21:1969 | self | | UseUseExplosion.rb:21:1945:21:1949 | self | UseUseExplosion.rb:21:2219:21:2224 | self | -| UseUseExplosion.rb:21:1945:21:1953 | ... > ... | UseUseExplosion.rb:21:1944:21:1954 | [false] ( ... ) | -| UseUseExplosion.rb:21:1945:21:1953 | ... > ... | UseUseExplosion.rb:21:1944:21:1954 | [true] ( ... ) | +| UseUseExplosion.rb:21:1945:21:1953 | ... > ... | UseUseExplosion.rb:21:1944:21:1954 | ( ... ) | | UseUseExplosion.rb:21:1953:21:1953 | 8 | UseUseExplosion.rb:21:1945:21:1953 | ... > ... | | UseUseExplosion.rb:21:1956:21:2212 | then ... | UseUseExplosion.rb:21:1941:21:2228 | if ... | | UseUseExplosion.rb:21:1961:21:2212 | if ... | UseUseExplosion.rb:21:1956:21:2212 | then ... | @@ -2639,8 +2446,7 @@ | UseUseExplosion.rb:21:1965:21:1969 | [post] self | UseUseExplosion.rb:21:2203:21:2208 | self | | UseUseExplosion.rb:21:1965:21:1969 | self | UseUseExplosion.rb:21:1985:21:1989 | self | | UseUseExplosion.rb:21:1965:21:1969 | self | UseUseExplosion.rb:21:2203:21:2208 | self | -| UseUseExplosion.rb:21:1965:21:1973 | ... > ... | UseUseExplosion.rb:21:1964:21:1974 | [false] ( ... ) | -| UseUseExplosion.rb:21:1965:21:1973 | ... > ... | UseUseExplosion.rb:21:1964:21:1974 | [true] ( ... ) | +| UseUseExplosion.rb:21:1965:21:1973 | ... > ... | UseUseExplosion.rb:21:1964:21:1974 | ( ... ) | | UseUseExplosion.rb:21:1973:21:1973 | 7 | UseUseExplosion.rb:21:1965:21:1973 | ... > ... | | UseUseExplosion.rb:21:1976:21:2196 | then ... | UseUseExplosion.rb:21:1961:21:2212 | if ... | | UseUseExplosion.rb:21:1981:21:2196 | if ... | UseUseExplosion.rb:21:1976:21:2196 | then ... | @@ -2649,8 +2455,7 @@ | UseUseExplosion.rb:21:1985:21:1989 | [post] self | UseUseExplosion.rb:21:2187:21:2192 | self | | UseUseExplosion.rb:21:1985:21:1989 | self | UseUseExplosion.rb:21:2005:21:2009 | self | | UseUseExplosion.rb:21:1985:21:1989 | self | UseUseExplosion.rb:21:2187:21:2192 | self | -| UseUseExplosion.rb:21:1985:21:1993 | ... > ... | UseUseExplosion.rb:21:1984:21:1994 | [false] ( ... ) | -| UseUseExplosion.rb:21:1985:21:1993 | ... > ... | UseUseExplosion.rb:21:1984:21:1994 | [true] ( ... ) | +| UseUseExplosion.rb:21:1985:21:1993 | ... > ... | UseUseExplosion.rb:21:1984:21:1994 | ( ... ) | | UseUseExplosion.rb:21:1993:21:1993 | 6 | UseUseExplosion.rb:21:1985:21:1993 | ... > ... | | UseUseExplosion.rb:21:1996:21:2180 | then ... | UseUseExplosion.rb:21:1981:21:2196 | if ... | | UseUseExplosion.rb:21:2001:21:2180 | if ... | UseUseExplosion.rb:21:1996:21:2180 | then ... | @@ -2659,8 +2464,7 @@ | UseUseExplosion.rb:21:2005:21:2009 | [post] self | UseUseExplosion.rb:21:2171:21:2176 | self | | UseUseExplosion.rb:21:2005:21:2009 | self | UseUseExplosion.rb:21:2025:21:2029 | self | | UseUseExplosion.rb:21:2005:21:2009 | self | UseUseExplosion.rb:21:2171:21:2176 | self | -| UseUseExplosion.rb:21:2005:21:2013 | ... > ... | UseUseExplosion.rb:21:2004:21:2014 | [false] ( ... ) | -| UseUseExplosion.rb:21:2005:21:2013 | ... > ... | UseUseExplosion.rb:21:2004:21:2014 | [true] ( ... ) | +| UseUseExplosion.rb:21:2005:21:2013 | ... > ... | UseUseExplosion.rb:21:2004:21:2014 | ( ... ) | | UseUseExplosion.rb:21:2013:21:2013 | 5 | UseUseExplosion.rb:21:2005:21:2013 | ... > ... | | UseUseExplosion.rb:21:2016:21:2164 | then ... | UseUseExplosion.rb:21:2001:21:2180 | if ... | | UseUseExplosion.rb:21:2021:21:2164 | if ... | UseUseExplosion.rb:21:2016:21:2164 | then ... | @@ -2669,8 +2473,7 @@ | UseUseExplosion.rb:21:2025:21:2029 | [post] self | UseUseExplosion.rb:21:2155:21:2160 | self | | UseUseExplosion.rb:21:2025:21:2029 | self | UseUseExplosion.rb:21:2045:21:2049 | self | | UseUseExplosion.rb:21:2025:21:2029 | self | UseUseExplosion.rb:21:2155:21:2160 | self | -| UseUseExplosion.rb:21:2025:21:2033 | ... > ... | UseUseExplosion.rb:21:2024:21:2034 | [false] ( ... ) | -| UseUseExplosion.rb:21:2025:21:2033 | ... > ... | UseUseExplosion.rb:21:2024:21:2034 | [true] ( ... ) | +| UseUseExplosion.rb:21:2025:21:2033 | ... > ... | UseUseExplosion.rb:21:2024:21:2034 | ( ... ) | | UseUseExplosion.rb:21:2033:21:2033 | 4 | UseUseExplosion.rb:21:2025:21:2033 | ... > ... | | UseUseExplosion.rb:21:2036:21:2148 | then ... | UseUseExplosion.rb:21:2021:21:2164 | if ... | | UseUseExplosion.rb:21:2041:21:2148 | if ... | UseUseExplosion.rb:21:2036:21:2148 | then ... | @@ -2679,8 +2482,7 @@ | UseUseExplosion.rb:21:2045:21:2049 | [post] self | UseUseExplosion.rb:21:2139:21:2144 | self | | UseUseExplosion.rb:21:2045:21:2049 | self | UseUseExplosion.rb:21:2065:21:2069 | self | | UseUseExplosion.rb:21:2045:21:2049 | self | UseUseExplosion.rb:21:2139:21:2144 | self | -| UseUseExplosion.rb:21:2045:21:2053 | ... > ... | UseUseExplosion.rb:21:2044:21:2054 | [false] ( ... ) | -| UseUseExplosion.rb:21:2045:21:2053 | ... > ... | UseUseExplosion.rb:21:2044:21:2054 | [true] ( ... ) | +| UseUseExplosion.rb:21:2045:21:2053 | ... > ... | UseUseExplosion.rb:21:2044:21:2054 | ( ... ) | | UseUseExplosion.rb:21:2053:21:2053 | 3 | UseUseExplosion.rb:21:2045:21:2053 | ... > ... | | UseUseExplosion.rb:21:2056:21:2132 | then ... | UseUseExplosion.rb:21:2041:21:2148 | if ... | | UseUseExplosion.rb:21:2061:21:2132 | if ... | UseUseExplosion.rb:21:2056:21:2132 | then ... | @@ -2689,16 +2491,14 @@ | UseUseExplosion.rb:21:2065:21:2069 | [post] self | UseUseExplosion.rb:21:2123:21:2128 | self | | UseUseExplosion.rb:21:2065:21:2069 | self | UseUseExplosion.rb:21:2085:21:2089 | self | | UseUseExplosion.rb:21:2065:21:2069 | self | UseUseExplosion.rb:21:2123:21:2128 | self | -| UseUseExplosion.rb:21:2065:21:2073 | ... > ... | UseUseExplosion.rb:21:2064:21:2074 | [false] ( ... ) | -| UseUseExplosion.rb:21:2065:21:2073 | ... > ... | UseUseExplosion.rb:21:2064:21:2074 | [true] ( ... ) | +| UseUseExplosion.rb:21:2065:21:2073 | ... > ... | UseUseExplosion.rb:21:2064:21:2074 | ( ... ) | | UseUseExplosion.rb:21:2073:21:2073 | 2 | UseUseExplosion.rb:21:2065:21:2073 | ... > ... | | UseUseExplosion.rb:21:2076:21:2116 | then ... | UseUseExplosion.rb:21:2061:21:2132 | if ... | | UseUseExplosion.rb:21:2081:21:2116 | if ... | UseUseExplosion.rb:21:2076:21:2116 | then ... | | UseUseExplosion.rb:21:2085:21:2089 | @prop | UseUseExplosion.rb:21:2085:21:2093 | ... > ... | | UseUseExplosion.rb:21:2085:21:2089 | [post] self | UseUseExplosion.rb:21:2107:21:2112 | self | | UseUseExplosion.rb:21:2085:21:2089 | self | UseUseExplosion.rb:21:2107:21:2112 | self | -| UseUseExplosion.rb:21:2085:21:2093 | ... > ... | UseUseExplosion.rb:21:2084:21:2094 | [false] ( ... ) | -| UseUseExplosion.rb:21:2085:21:2093 | ... > ... | UseUseExplosion.rb:21:2084:21:2094 | [true] ( ... ) | +| UseUseExplosion.rb:21:2085:21:2093 | ... > ... | UseUseExplosion.rb:21:2084:21:2094 | ( ... ) | | UseUseExplosion.rb:21:2093:21:2093 | 1 | UseUseExplosion.rb:21:2085:21:2093 | ... > ... | | UseUseExplosion.rb:21:2096:21:2099 | then ... | UseUseExplosion.rb:21:2081:21:2116 | if ... | | UseUseExplosion.rb:21:2102:21:2112 | else ... | UseUseExplosion.rb:21:2081:21:2116 | if ... | @@ -2994,8 +2794,7 @@ | local_dataflow.rb:10:9:10:9 | ... = ... | local_dataflow.rb:10:9:10:9 | if ... | | local_dataflow.rb:10:9:10:9 | [input] phi | local_dataflow.rb:10:9:10:9 | phi | | local_dataflow.rb:10:9:10:9 | [post] x | local_dataflow.rb:10:9:10:9 | [input] phi | -| local_dataflow.rb:10:9:10:9 | defined? ... | local_dataflow.rb:10:9:10:9 | [false] ! ... | -| local_dataflow.rb:10:9:10:9 | defined? ... | local_dataflow.rb:10:9:10:9 | [true] ! ... | +| local_dataflow.rb:10:9:10:9 | defined? ... | local_dataflow.rb:10:9:10:9 | ! ... | | local_dataflow.rb:10:9:10:9 | nil | local_dataflow.rb:10:9:10:9 | ... = ... | | local_dataflow.rb:10:9:10:9 | nil | local_dataflow.rb:10:9:10:9 | x | | local_dataflow.rb:10:9:10:9 | x | local_dataflow.rb:10:9:10:9 | [input] phi | @@ -3016,8 +2815,7 @@ | local_dataflow.rb:15:5:15:5 | ... = ... | local_dataflow.rb:15:5:15:5 | if ... | | local_dataflow.rb:15:5:15:5 | [input] phi | local_dataflow.rb:15:5:15:5 | phi | | local_dataflow.rb:15:5:15:5 | [post] x | local_dataflow.rb:15:5:15:5 | [input] phi | -| local_dataflow.rb:15:5:15:5 | defined? ... | local_dataflow.rb:15:5:15:5 | [false] ! ... | -| local_dataflow.rb:15:5:15:5 | defined? ... | local_dataflow.rb:15:5:15:5 | [true] ! ... | +| local_dataflow.rb:15:5:15:5 | defined? ... | local_dataflow.rb:15:5:15:5 | ! ... | | local_dataflow.rb:15:5:15:5 | nil | local_dataflow.rb:15:5:15:5 | ... = ... | | local_dataflow.rb:15:5:15:5 | nil | local_dataflow.rb:15:5:15:5 | x | | local_dataflow.rb:15:5:15:5 | x | local_dataflow.rb:15:5:15:5 | [input] phi | @@ -3035,8 +2833,7 @@ | local_dataflow.rb:19:5:19:5 | ... = ... | local_dataflow.rb:19:5:19:5 | if ... | | local_dataflow.rb:19:5:19:5 | [input] phi | local_dataflow.rb:19:5:19:5 | phi | | local_dataflow.rb:19:5:19:5 | [post] x | local_dataflow.rb:19:5:19:5 | [input] phi | -| local_dataflow.rb:19:5:19:5 | defined? ... | local_dataflow.rb:19:5:19:5 | [false] ! ... | -| local_dataflow.rb:19:5:19:5 | defined? ... | local_dataflow.rb:19:5:19:5 | [true] ! ... | +| local_dataflow.rb:19:5:19:5 | defined? ... | local_dataflow.rb:19:5:19:5 | ! ... | | local_dataflow.rb:19:5:19:5 | nil | local_dataflow.rb:19:5:19:5 | ... = ... | | local_dataflow.rb:19:5:19:5 | nil | local_dataflow.rb:19:5:19:5 | x | | local_dataflow.rb:19:5:19:5 | x | local_dataflow.rb:19:5:19:5 | [input] phi | @@ -3325,8 +3122,7 @@ | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(x) | local_dataflow.rb:134:11:134:11 | x | | local_dataflow.rb:133:8:133:13 | [post] self | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(self) | | local_dataflow.rb:133:8:133:13 | [post] self | local_dataflow.rb:133:18:133:23 | self | -| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | [false] ... \|\| ... | -| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | [true] ... \|\| ... | +| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | ... \|\| ... | | local_dataflow.rb:133:8:133:13 | self | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(self) | | local_dataflow.rb:133:8:133:13 | self | local_dataflow.rb:133:18:133:23 | self | | local_dataflow.rb:133:12:133:12 | [post] x | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(x) | @@ -3337,8 +3133,7 @@ | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(x) | local_dataflow.rb:134:11:134:11 | x | | local_dataflow.rb:133:18:133:23 | [post] self | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(self) | | local_dataflow.rb:133:18:133:23 | [post] self | local_dataflow.rb:136:7:136:12 | self | -| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | [false] ... \|\| ... | -| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | [true] ... \|\| ... | +| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | ... \|\| ... | | local_dataflow.rb:133:18:133:23 | self | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(self) | | local_dataflow.rb:133:18:133:23 | self | local_dataflow.rb:136:7:136:12 | self | | local_dataflow.rb:133:22:133:22 | [post] x | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(x) | @@ -3371,61 +3166,51 @@ | local_dataflow.rb:137:14:137:14 | [post] x | local_dataflow.rb:137:25:137:25 | x | | local_dataflow.rb:137:14:137:14 | x | local_dataflow.rb:137:10:137:15 | [input] SSA phi read(x) | | local_dataflow.rb:137:14:137:14 | x | local_dataflow.rb:137:25:137:25 | x | -| local_dataflow.rb:137:20:137:26 | [false] ! ... | local_dataflow.rb:137:10:137:26 | [false] ... && ... | +| local_dataflow.rb:137:20:137:26 | ! ... | local_dataflow.rb:137:10:137:26 | ... && ... | | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(self) | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | -| local_dataflow.rb:137:20:137:26 | [true] ! ... | local_dataflow.rb:137:10:137:26 | [true] ... && ... | | local_dataflow.rb:137:21:137:26 | [post] self | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:21:137:26 | [post] self | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(self) | -| local_dataflow.rb:137:21:137:26 | call to use | local_dataflow.rb:137:20:137:26 | [false] ! ... | -| local_dataflow.rb:137:21:137:26 | call to use | local_dataflow.rb:137:20:137:26 | [true] ! ... | +| local_dataflow.rb:137:21:137:26 | call to use | local_dataflow.rb:137:20:137:26 | ! ... | | local_dataflow.rb:137:21:137:26 | self | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:21:137:26 | self | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:25:137:25 | [post] x | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | | local_dataflow.rb:137:25:137:25 | [post] x | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | | local_dataflow.rb:137:25:137:25 | x | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | | local_dataflow.rb:137:25:137:25 | x | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | -| local_dataflow.rb:141:8:141:14 | [false] ! ... | local_dataflow.rb:141:8:141:37 | [false] ... \|\| ... | -| local_dataflow.rb:141:8:141:14 | [false] ! ... | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | +| local_dataflow.rb:141:8:141:14 | ! ... | local_dataflow.rb:141:8:141:37 | ... \|\| ... | | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(self) | | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(x) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(x) | -| local_dataflow.rb:141:8:141:14 | [true] ! ... | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | | local_dataflow.rb:141:9:141:14 | [post] self | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | | local_dataflow.rb:141:9:141:14 | [post] self | local_dataflow.rb:141:20:141:25 | self | -| local_dataflow.rb:141:9:141:14 | call to use | local_dataflow.rb:141:8:141:14 | [false] ! ... | -| local_dataflow.rb:141:9:141:14 | call to use | local_dataflow.rb:141:8:141:14 | [true] ! ... | +| local_dataflow.rb:141:9:141:14 | call to use | local_dataflow.rb:141:8:141:14 | ! ... | | local_dataflow.rb:141:9:141:14 | self | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | | local_dataflow.rb:141:9:141:14 | self | local_dataflow.rb:141:20:141:25 | self | | local_dataflow.rb:141:13:141:13 | [post] x | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(x) | | local_dataflow.rb:141:13:141:13 | [post] x | local_dataflow.rb:141:24:141:24 | x | | local_dataflow.rb:141:13:141:13 | x | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(x) | | local_dataflow.rb:141:13:141:13 | x | local_dataflow.rb:141:24:141:24 | x | -| local_dataflow.rb:141:19:141:37 | [false] ( ... ) | local_dataflow.rb:141:8:141:37 | [false] ... \|\| ... | +| local_dataflow.rb:141:19:141:37 | ( ... ) | local_dataflow.rb:141:8:141:37 | ... \|\| ... | | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(self) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(self) | | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(x) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(x) | -| local_dataflow.rb:141:19:141:37 | [post] [false] ( ... ) | local_dataflow.rb:141:20:141:36 | [post] [false] ... && ... | -| local_dataflow.rb:141:19:141:37 | [post] [true] ( ... ) | local_dataflow.rb:141:20:141:36 | [post] [true] ... && ... | -| local_dataflow.rb:141:19:141:37 | [true] ( ... ) | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | +| local_dataflow.rb:141:19:141:37 | [post] ( ... ) | local_dataflow.rb:141:20:141:36 | [post] ... && ... | | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(self) | local_dataflow.rb:143:11:143:16 | self | | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(x) | local_dataflow.rb:143:15:143:15 | x | | local_dataflow.rb:141:20:141:25 | [post] self | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(self) | | local_dataflow.rb:141:20:141:25 | [post] self | local_dataflow.rb:141:31:141:36 | self | | local_dataflow.rb:141:20:141:25 | self | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(self) | | local_dataflow.rb:141:20:141:25 | self | local_dataflow.rb:141:31:141:36 | self | -| local_dataflow.rb:141:20:141:36 | [false] ... && ... | local_dataflow.rb:141:19:141:37 | [false] ( ... ) | -| local_dataflow.rb:141:20:141:36 | [true] ... && ... | local_dataflow.rb:141:19:141:37 | [true] ( ... ) | +| local_dataflow.rb:141:20:141:36 | ... && ... | local_dataflow.rb:141:19:141:37 | ( ... ) | | local_dataflow.rb:141:24:141:24 | [post] x | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(x) | | local_dataflow.rb:141:24:141:24 | [post] x | local_dataflow.rb:141:35:141:35 | x | | local_dataflow.rb:141:24:141:24 | x | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(x) | | local_dataflow.rb:141:24:141:24 | x | local_dataflow.rb:141:35:141:35 | x | -| local_dataflow.rb:141:30:141:36 | [false] ! ... | local_dataflow.rb:141:20:141:36 | [false] ... && ... | +| local_dataflow.rb:141:30:141:36 | ! ... | local_dataflow.rb:141:20:141:36 | ... && ... | | local_dataflow.rb:141:30:141:36 | [input] SSA phi read(self) | local_dataflow.rb:143:11:143:16 | self | | local_dataflow.rb:141:30:141:36 | [input] SSA phi read(x) | local_dataflow.rb:143:15:143:15 | x | -| local_dataflow.rb:141:30:141:36 | [true] ! ... | local_dataflow.rb:141:20:141:36 | [true] ... && ... | | local_dataflow.rb:141:31:141:36 | [post] self | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(self) | | local_dataflow.rb:141:31:141:36 | [post] self | local_dataflow.rb:141:30:141:36 | [input] SSA phi read(self) | -| local_dataflow.rb:141:31:141:36 | call to use | local_dataflow.rb:141:30:141:36 | [false] ! ... | -| local_dataflow.rb:141:31:141:36 | call to use | local_dataflow.rb:141:30:141:36 | [true] ! ... | +| local_dataflow.rb:141:31:141:36 | call to use | local_dataflow.rb:141:30:141:36 | ! ... | | local_dataflow.rb:141:31:141:36 | self | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(self) | | local_dataflow.rb:141:31:141:36 | self | local_dataflow.rb:141:30:141:36 | [input] SSA phi read(self) | | local_dataflow.rb:141:35:141:35 | [post] x | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(x) | @@ -3441,8 +3226,7 @@ | local_dataflow.rb:143:11:143:16 | [input] SSA phi read(x) | local_dataflow.rb:144:15:144:15 | x | | local_dataflow.rb:143:11:143:16 | [post] self | local_dataflow.rb:143:11:143:16 | [input] SSA phi read(self) | | local_dataflow.rb:143:11:143:16 | [post] self | local_dataflow.rb:143:21:143:26 | self | -| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | [false] ... \|\| ... | -| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | [true] ... \|\| ... | +| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | ... \|\| ... | | local_dataflow.rb:143:11:143:16 | self | local_dataflow.rb:143:11:143:16 | [input] SSA phi read(self) | | local_dataflow.rb:143:11:143:16 | self | local_dataflow.rb:143:21:143:26 | self | | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(self) | local_dataflow.rb:147:5:147:10 | self | @@ -3455,8 +3239,7 @@ | local_dataflow.rb:143:21:143:26 | [input] SSA phi read(x) | local_dataflow.rb:144:15:144:15 | x | | local_dataflow.rb:143:21:143:26 | [post] self | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(self) | | local_dataflow.rb:143:21:143:26 | [post] self | local_dataflow.rb:143:21:143:26 | [input] SSA phi read(self) | -| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | [false] ... \|\| ... | -| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | [true] ... \|\| ... | +| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | ... \|\| ... | | local_dataflow.rb:143:21:143:26 | self | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(self) | | local_dataflow.rb:143:21:143:26 | self | local_dataflow.rb:143:21:143:26 | [input] SSA phi read(self) | | local_dataflow.rb:143:25:143:25 | [post] x | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(x) | From 54e4bb35ab007306f7a14ac928ecec8377d2cd3f Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Fri, 7 Aug 2026 14:54:22 +0200 Subject: [PATCH 0431/2098] Ruby: Accept qltest changes due to method body inclusion in CFG. --- .../dataflow/local/DataflowStep.expected | 15 +++ .../dataflow/local/TaintStep.expected | 16 +++ .../dataflow/params/TypeTracker.expected | 127 ++++++++++++++++++ .../type-tracker/TypeTracker.expected | 16 +++ .../active_record/ActiveRecord.expected | 7 + 5 files changed, 181 insertions(+) diff --git a/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected b/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected index c919dc71dd5c..da64eaf3949c 100644 --- a/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected +++ b/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected @@ -1404,6 +1404,7 @@ | UseUseExplosion.rb:20:3691:20:3696 | call to use | UseUseExplosion.rb:20:3686:20:3696 | else ... | | UseUseExplosion.rb:20:3691:20:3696 | self | UseUseExplosion.rb:21:13:21:17 | self | | UseUseExplosion.rb:20:3695:20:3695 | x | UseUseExplosion.rb:20:9:20:3700 | SSA phi read(x) | +| UseUseExplosion.rb:21:9:21:3700 | if ... | UseUseExplosion.rb:19:9:21:3700 | ... | | UseUseExplosion.rb:21:13:21:17 | [post] self | UseUseExplosion.rb:21:35:21:39 | self | | UseUseExplosion.rb:21:13:21:17 | [post] self | UseUseExplosion.rb:21:3691:21:3696 | self | | UseUseExplosion.rb:21:13:21:17 | self | UseUseExplosion.rb:21:35:21:39 | self | @@ -2325,6 +2326,7 @@ | local_dataflow.rb:5:8:5:12 | ... = ... | local_dataflow.rb:5:7:5:13 | ( ... ) | | local_dataflow.rb:5:12:5:12 | a | local_dataflow.rb:5:8:5:12 | ... = ... | | local_dataflow.rb:5:12:5:12 | a | local_dataflow.rb:6:8:6:8 | a | +| local_dataflow.rb:6:3:6:14 | ... = ... | local_dataflow.rb:2:3:6:14 | ... | | local_dataflow.rb:6:7:6:14 | ( ... ) | local_dataflow.rb:6:3:6:14 | ... = ... | | local_dataflow.rb:6:8:6:13 | ... = ... | local_dataflow.rb:6:7:6:14 | ( ... ) | | local_dataflow.rb:6:10:6:11 | ... + ... | local_dataflow.rb:6:8:6:13 | ... = ... | @@ -2352,6 +2354,7 @@ | local_dataflow.rb:10:14:10:18 | array | local_dataflow.rb:15:10:15:14 | array | | local_dataflow.rb:11:1:11:2 | [post] self | local_dataflow.rb:12:3:12:5 | self | | local_dataflow.rb:11:1:11:2 | self | local_dataflow.rb:12:3:12:5 | self | +| local_dataflow.rb:12:3:12:5 | call to p | local_dataflow.rb:10:5:13:3 | ... | | local_dataflow.rb:15:1:17:3 | x | local_dataflow.rb:19:5:19:5 | x | | local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:1:17:3 | ... = ... | | local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:1:17:3 | __synth__0__1 | @@ -2389,9 +2392,11 @@ | local_dataflow.rb:30:14:30:20 | "class" | local_dataflow.rb:30:5:30:24 | C | | local_dataflow.rb:32:5:32:25 | bar | local_dataflow.rb:32:1:32:1 | x | | local_dataflow.rb:32:5:32:25 | bar | local_dataflow.rb:32:1:32:25 | ... = ... | +| local_dataflow.rb:32:14:32:21 | "method" | local_dataflow.rb:32:14:32:21 | ... | | local_dataflow.rb:34:7:34:7 | x | local_dataflow.rb:34:7:34:7 | x | | local_dataflow.rb:34:7:34:7 | x | local_dataflow.rb:35:6:35:6 | x | | local_dataflow.rb:36:13:36:13 | 7 | local_dataflow.rb:36:6:36:13 | return | +| local_dataflow.rb:38:3:38:13 | "reachable" | local_dataflow.rb:35:3:38:13 | ... | | local_dataflow.rb:41:7:41:7 | x | local_dataflow.rb:41:7:41:7 | x | | local_dataflow.rb:41:7:41:7 | x | local_dataflow.rb:42:6:42:6 | x | | local_dataflow.rb:43:13:43:13 | 7 | local_dataflow.rb:43:6:43:13 | return | @@ -2403,6 +2408,7 @@ | local_dataflow.rb:50:18:50:18 | [post] x | local_dataflow.rb:51:20:51:20 | x | | local_dataflow.rb:50:18:50:18 | x | local_dataflow.rb:51:20:51:20 | x | | local_dataflow.rb:51:9:51:15 | "break" | local_dataflow.rb:51:3:51:15 | break | +| local_dataflow.rb:52:3:52:10 | "normal" | local_dataflow.rb:50:3:52:10 | ... | | local_dataflow.rb:55:5:55:13 | synthetic splat argument | local_dataflow.rb:55:5:55:13 | call to [] | | local_dataflow.rb:60:1:90:3 | self (test_case) | local_dataflow.rb:78:12:78:20 | self | | local_dataflow.rb:60:1:90:3 | self in test_case | local_dataflow.rb:60:1:90:3 | self (test_case) | @@ -2495,6 +2501,7 @@ | local_dataflow.rb:87:25:87:25 | [post] x | local_dataflow.rb:87:29:87:29 | x | | local_dataflow.rb:87:25:87:25 | x | local_dataflow.rb:87:29:87:29 | x | | local_dataflow.rb:87:29:87:29 | x | local_dataflow.rb:87:15:87:48 | then ... | +| local_dataflow.rb:89:3:89:9 | call to sink | local_dataflow.rb:61:3:89:28 | ... | | local_dataflow.rb:92:1:109:3 | self (and_or) | local_dataflow.rb:93:7:93:15 | self | | local_dataflow.rb:92:1:109:3 | self in and_or | local_dataflow.rb:92:1:109:3 | self (and_or) | | local_dataflow.rb:93:3:93:3 | a | local_dataflow.rb:94:8:94:8 | a | @@ -2584,6 +2591,7 @@ | local_dataflow.rb:107:9:107:17 | [post] self | local_dataflow.rb:108:3:108:9 | self | | local_dataflow.rb:107:9:107:17 | call to source | local_dataflow.rb:107:5:107:7 | ... && ... | | local_dataflow.rb:107:9:107:17 | self | local_dataflow.rb:108:3:108:9 | self | +| local_dataflow.rb:108:3:108:9 | call to sink | local_dataflow.rb:93:3:108:28 | ... | | local_dataflow.rb:111:1:114:3 | self (object_dup) | local_dataflow.rb:112:3:112:21 | self | | local_dataflow.rb:111:1:114:3 | self in object_dup | local_dataflow.rb:111:1:114:3 | self (object_dup) | | local_dataflow.rb:112:3:112:21 | [post] self | local_dataflow.rb:112:8:112:16 | self | @@ -2592,6 +2600,7 @@ | local_dataflow.rb:112:8:112:16 | call to source | local_dataflow.rb:112:8:112:20 | call to dup | | local_dataflow.rb:112:8:112:16 | self | local_dataflow.rb:113:3:113:25 | self | | local_dataflow.rb:113:3:113:25 | [post] self | local_dataflow.rb:113:8:113:16 | self | +| local_dataflow.rb:113:3:113:25 | call to sink | local_dataflow.rb:112:3:113:44 | ... | | local_dataflow.rb:113:3:113:25 | self | local_dataflow.rb:113:8:113:16 | self | | local_dataflow.rb:113:8:113:16 | call to source | local_dataflow.rb:113:8:113:20 | call to dup | | local_dataflow.rb:113:8:113:20 | call to dup | local_dataflow.rb:113:8:113:24 | call to dup | @@ -2608,25 +2617,31 @@ | local_dataflow.rb:118:17:118:31 | self | local_dataflow.rb:118:23:118:29 | self | | local_dataflow.rb:118:20:118:20 | x | local_dataflow.rb:118:20:118:20 | x | | local_dataflow.rb:118:20:118:20 | x | local_dataflow.rb:118:28:118:28 | x | +| local_dataflow.rb:118:23:118:29 | call to sink | local_dataflow.rb:118:23:118:29 | ... | | local_dataflow.rb:119:3:119:31 | [post] self | local_dataflow.rb:119:8:119:16 | self | +| local_dataflow.rb:119:3:119:31 | call to sink | local_dataflow.rb:117:3:119:50 | ... | | local_dataflow.rb:119:3:119:31 | self | local_dataflow.rb:119:8:119:16 | self | | local_dataflow.rb:119:8:119:16 | call to source | local_dataflow.rb:119:8:119:23 | call to tap | | local_dataflow.rb:119:8:119:23 | call to tap | local_dataflow.rb:119:8:119:30 | call to tap | | local_dataflow.rb:122:1:124:3 | self (dup_tap) | local_dataflow.rb:123:3:123:50 | self | | local_dataflow.rb:122:1:124:3 | self in dup_tap | local_dataflow.rb:122:1:124:3 | self (dup_tap) | | local_dataflow.rb:123:3:123:50 | [post] self | local_dataflow.rb:123:8:123:16 | self | +| local_dataflow.rb:123:3:123:50 | call to sink | local_dataflow.rb:123:3:123:70 | ... | | local_dataflow.rb:123:3:123:50 | self | local_dataflow.rb:123:8:123:16 | self | | local_dataflow.rb:123:8:123:16 | call to source | local_dataflow.rb:123:8:123:20 | call to dup | | local_dataflow.rb:123:8:123:20 | call to dup | local_dataflow.rb:123:8:123:45 | call to tap | | local_dataflow.rb:123:8:123:45 | call to tap | local_dataflow.rb:123:8:123:49 | call to dup | | local_dataflow.rb:123:26:123:45 | self | local_dataflow.rb:123:32:123:43 | self | +| local_dataflow.rb:123:32:123:43 | call to puts | local_dataflow.rb:123:32:123:43 | ... | | local_dataflow.rb:126:1:128:3 | self (use) | local_dataflow.rb:127:3:127:8 | self | | local_dataflow.rb:126:1:128:3 | self in use | local_dataflow.rb:126:1:128:3 | self (use) | +| local_dataflow.rb:127:3:127:8 | call to rand | local_dataflow.rb:127:3:127:8 | ... | | local_dataflow.rb:130:1:150:3 | self (use_use_madness) | local_dataflow.rb:132:6:132:11 | self | | local_dataflow.rb:130:1:150:3 | self in use_use_madness | local_dataflow.rb:130:1:150:3 | self (use_use_madness) | | local_dataflow.rb:131:3:131:3 | x | local_dataflow.rb:132:10:132:10 | x | | local_dataflow.rb:131:7:131:8 | "" | local_dataflow.rb:131:3:131:3 | x | | local_dataflow.rb:131:7:131:8 | "" | local_dataflow.rb:131:3:131:8 | ... = ... | +| local_dataflow.rb:132:3:149:5 | if ... | local_dataflow.rb:131:3:149:5 | ... | | local_dataflow.rb:132:6:132:11 | [post] self | local_dataflow.rb:133:8:133:13 | self | | local_dataflow.rb:132:6:132:11 | self | local_dataflow.rb:133:8:133:13 | self | | local_dataflow.rb:132:10:132:10 | [post] x | local_dataflow.rb:133:12:133:12 | x | diff --git a/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected index c81cd6fc0646..4eaaa96538b2 100644 --- a/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected +++ b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected @@ -1604,6 +1604,7 @@ | UseUseExplosion.rb:20:3691:20:3696 | call to use | UseUseExplosion.rb:20:3686:20:3696 | else ... | | UseUseExplosion.rb:20:3691:20:3696 | self | UseUseExplosion.rb:21:13:21:17 | self | | UseUseExplosion.rb:20:3695:20:3695 | x | UseUseExplosion.rb:20:9:20:3700 | SSA phi read(x) | +| UseUseExplosion.rb:21:9:21:3700 | if ... | UseUseExplosion.rb:19:9:21:3700 | ... | | UseUseExplosion.rb:21:13:21:17 | @prop | UseUseExplosion.rb:21:13:21:23 | ... > ... | | UseUseExplosion.rb:21:13:21:17 | [post] self | UseUseExplosion.rb:21:35:21:39 | self | | UseUseExplosion.rb:21:13:21:17 | [post] self | UseUseExplosion.rb:21:3691:21:3696 | self | @@ -2772,6 +2773,7 @@ | local_dataflow.rb:5:8:5:12 | ... = ... | local_dataflow.rb:5:7:5:13 | ( ... ) | | local_dataflow.rb:5:12:5:12 | a | local_dataflow.rb:5:8:5:12 | ... = ... | | local_dataflow.rb:5:12:5:12 | a | local_dataflow.rb:6:8:6:8 | a | +| local_dataflow.rb:6:3:6:14 | ... = ... | local_dataflow.rb:2:3:6:14 | ... | | local_dataflow.rb:6:7:6:14 | ( ... ) | local_dataflow.rb:6:3:6:14 | ... = ... | | local_dataflow.rb:6:8:6:8 | a | local_dataflow.rb:6:10:6:11 | ... + ... | | local_dataflow.rb:6:8:6:13 | ... = ... | local_dataflow.rb:6:7:6:14 | ( ... ) | @@ -2805,6 +2807,7 @@ | local_dataflow.rb:10:14:10:18 | array | local_dataflow.rb:15:10:15:14 | array | | local_dataflow.rb:11:1:11:2 | [post] self | local_dataflow.rb:12:3:12:5 | self | | local_dataflow.rb:11:1:11:2 | self | local_dataflow.rb:12:3:12:5 | self | +| local_dataflow.rb:12:3:12:5 | call to p | local_dataflow.rb:10:5:13:3 | ... | | local_dataflow.rb:15:1:17:3 | x | local_dataflow.rb:19:5:19:5 | x | | local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:1:17:3 | ... = ... | | local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:1:17:3 | __synth__0__1 | @@ -2840,6 +2843,7 @@ | local_dataflow.rb:19:5:19:5 | x | local_dataflow.rb:19:5:19:5 | defined? ... | | local_dataflow.rb:19:5:19:5 | x | local_dataflow.rb:19:5:19:5 | phi | | local_dataflow.rb:19:5:19:5 | x | local_dataflow.rb:20:6:20:6 | x | +| local_dataflow.rb:20:3:20:25 | if ... | local_dataflow.rb:19:1:21:3 | ... | | local_dataflow.rb:20:6:20:6 | x | local_dataflow.rb:20:6:20:10 | ... > ... | | local_dataflow.rb:20:10:20:10 | 1 | local_dataflow.rb:20:6:20:10 | ... > ... | | local_dataflow.rb:24:2:24:8 | break | local_dataflow.rb:23:1:25:3 | while ... | @@ -2850,12 +2854,14 @@ | local_dataflow.rb:30:14:30:20 | "class" | local_dataflow.rb:30:5:30:24 | C | | local_dataflow.rb:32:5:32:25 | bar | local_dataflow.rb:32:1:32:1 | x | | local_dataflow.rb:32:5:32:25 | bar | local_dataflow.rb:32:1:32:25 | ... = ... | +| local_dataflow.rb:32:14:32:21 | "method" | local_dataflow.rb:32:14:32:21 | ... | | local_dataflow.rb:34:1:39:3 | synthetic splat parameter | local_dataflow.rb:34:7:34:7 | x | | local_dataflow.rb:34:7:34:7 | x | local_dataflow.rb:34:7:34:7 | x | | local_dataflow.rb:34:7:34:7 | x | local_dataflow.rb:35:6:35:6 | x | | local_dataflow.rb:35:6:35:6 | x | local_dataflow.rb:35:6:35:11 | ... == ... | | local_dataflow.rb:35:11:35:11 | 4 | local_dataflow.rb:35:6:35:11 | ... == ... | | local_dataflow.rb:36:13:36:13 | 7 | local_dataflow.rb:36:6:36:13 | return | +| local_dataflow.rb:38:3:38:13 | "reachable" | local_dataflow.rb:35:3:38:13 | ... | | local_dataflow.rb:41:1:47:3 | synthetic splat parameter | local_dataflow.rb:41:7:41:7 | x | | local_dataflow.rb:41:7:41:7 | x | local_dataflow.rb:41:7:41:7 | x | | local_dataflow.rb:41:7:41:7 | x | local_dataflow.rb:42:6:42:6 | x | @@ -2874,6 +2880,7 @@ | local_dataflow.rb:51:9:51:15 | "break" | local_dataflow.rb:51:3:51:15 | break | | local_dataflow.rb:51:20:51:20 | x | local_dataflow.rb:51:20:51:24 | ... < ... | | local_dataflow.rb:51:24:51:24 | 9 | local_dataflow.rb:51:20:51:24 | ... < ... | +| local_dataflow.rb:52:3:52:10 | "normal" | local_dataflow.rb:50:3:52:10 | ... | | local_dataflow.rb:55:5:55:13 | Array | local_dataflow.rb:55:5:55:13 | call to [] | | local_dataflow.rb:55:5:55:13 | synthetic splat argument | local_dataflow.rb:55:5:55:13 | call to [] | | local_dataflow.rb:57:1:58:3 | synthetic splat parameter | local_dataflow.rb:57:9:57:9 | x | @@ -2978,6 +2985,7 @@ | local_dataflow.rb:87:25:87:25 | [post] x | local_dataflow.rb:87:29:87:29 | x | | local_dataflow.rb:87:25:87:25 | x | local_dataflow.rb:87:29:87:29 | x | | local_dataflow.rb:87:29:87:29 | x | local_dataflow.rb:87:15:87:48 | then ... | +| local_dataflow.rb:89:3:89:9 | call to sink | local_dataflow.rb:61:3:89:28 | ... | | local_dataflow.rb:92:1:109:3 | self (and_or) | local_dataflow.rb:93:7:93:15 | self | | local_dataflow.rb:92:1:109:3 | self in and_or | local_dataflow.rb:92:1:109:3 | self (and_or) | | local_dataflow.rb:93:3:93:3 | a | local_dataflow.rb:94:8:94:8 | a | @@ -3067,6 +3075,7 @@ | local_dataflow.rb:107:9:107:17 | [post] self | local_dataflow.rb:108:3:108:9 | self | | local_dataflow.rb:107:9:107:17 | call to source | local_dataflow.rb:107:5:107:7 | ... && ... | | local_dataflow.rb:107:9:107:17 | self | local_dataflow.rb:108:3:108:9 | self | +| local_dataflow.rb:108:3:108:9 | call to sink | local_dataflow.rb:93:3:108:28 | ... | | local_dataflow.rb:111:1:114:3 | self (object_dup) | local_dataflow.rb:112:3:112:21 | self | | local_dataflow.rb:111:1:114:3 | self in object_dup | local_dataflow.rb:111:1:114:3 | self (object_dup) | | local_dataflow.rb:112:3:112:21 | [post] self | local_dataflow.rb:112:8:112:16 | self | @@ -3075,6 +3084,7 @@ | local_dataflow.rb:112:8:112:16 | call to source | local_dataflow.rb:112:8:112:20 | call to dup | | local_dataflow.rb:112:8:112:16 | self | local_dataflow.rb:113:3:113:25 | self | | local_dataflow.rb:113:3:113:25 | [post] self | local_dataflow.rb:113:8:113:16 | self | +| local_dataflow.rb:113:3:113:25 | call to sink | local_dataflow.rb:112:3:113:44 | ... | | local_dataflow.rb:113:3:113:25 | self | local_dataflow.rb:113:8:113:16 | self | | local_dataflow.rb:113:8:113:16 | call to source | local_dataflow.rb:113:8:113:20 | call to dup | | local_dataflow.rb:113:8:113:20 | call to dup | local_dataflow.rb:113:8:113:24 | call to dup | @@ -3092,27 +3102,33 @@ | local_dataflow.rb:118:17:118:31 | synthetic splat parameter | local_dataflow.rb:118:20:118:20 | x | | local_dataflow.rb:118:20:118:20 | x | local_dataflow.rb:118:20:118:20 | x | | local_dataflow.rb:118:20:118:20 | x | local_dataflow.rb:118:28:118:28 | x | +| local_dataflow.rb:118:23:118:29 | call to sink | local_dataflow.rb:118:23:118:29 | ... | | local_dataflow.rb:119:3:119:31 | [post] self | local_dataflow.rb:119:8:119:16 | self | +| local_dataflow.rb:119:3:119:31 | call to sink | local_dataflow.rb:117:3:119:50 | ... | | local_dataflow.rb:119:3:119:31 | self | local_dataflow.rb:119:8:119:16 | self | | local_dataflow.rb:119:8:119:16 | call to source | local_dataflow.rb:119:8:119:23 | call to tap | | local_dataflow.rb:119:8:119:23 | call to tap | local_dataflow.rb:119:8:119:30 | call to tap | | local_dataflow.rb:122:1:124:3 | self (dup_tap) | local_dataflow.rb:123:3:123:50 | self | | local_dataflow.rb:122:1:124:3 | self in dup_tap | local_dataflow.rb:122:1:124:3 | self (dup_tap) | | local_dataflow.rb:123:3:123:50 | [post] self | local_dataflow.rb:123:8:123:16 | self | +| local_dataflow.rb:123:3:123:50 | call to sink | local_dataflow.rb:123:3:123:70 | ... | | local_dataflow.rb:123:3:123:50 | self | local_dataflow.rb:123:8:123:16 | self | | local_dataflow.rb:123:8:123:16 | call to source | local_dataflow.rb:123:8:123:20 | call to dup | | local_dataflow.rb:123:8:123:20 | call to dup | local_dataflow.rb:123:8:123:45 | call to tap | | local_dataflow.rb:123:8:123:45 | call to tap | local_dataflow.rb:123:8:123:49 | call to dup | | local_dataflow.rb:123:26:123:45 | self | local_dataflow.rb:123:32:123:43 | self | | local_dataflow.rb:123:26:123:45 | synthetic splat parameter | local_dataflow.rb:123:29:123:29 | x | +| local_dataflow.rb:123:32:123:43 | call to puts | local_dataflow.rb:123:32:123:43 | ... | | local_dataflow.rb:126:1:128:3 | self (use) | local_dataflow.rb:127:3:127:8 | self | | local_dataflow.rb:126:1:128:3 | self in use | local_dataflow.rb:126:1:128:3 | self (use) | | local_dataflow.rb:126:1:128:3 | synthetic splat parameter | local_dataflow.rb:126:9:126:9 | x | +| local_dataflow.rb:127:3:127:8 | call to rand | local_dataflow.rb:127:3:127:8 | ... | | local_dataflow.rb:130:1:150:3 | self (use_use_madness) | local_dataflow.rb:132:6:132:11 | self | | local_dataflow.rb:130:1:150:3 | self in use_use_madness | local_dataflow.rb:130:1:150:3 | self (use_use_madness) | | local_dataflow.rb:131:3:131:3 | x | local_dataflow.rb:132:10:132:10 | x | | local_dataflow.rb:131:7:131:8 | "" | local_dataflow.rb:131:3:131:3 | x | | local_dataflow.rb:131:7:131:8 | "" | local_dataflow.rb:131:3:131:8 | ... = ... | +| local_dataflow.rb:132:3:149:5 | if ... | local_dataflow.rb:131:3:149:5 | ... | | local_dataflow.rb:132:6:132:11 | [post] self | local_dataflow.rb:133:8:133:13 | self | | local_dataflow.rb:132:6:132:11 | self | local_dataflow.rb:133:8:133:13 | self | | local_dataflow.rb:132:10:132:10 | [post] x | local_dataflow.rb:133:12:133:12 | x | diff --git a/ruby/ql/test/library-tests/dataflow/params/TypeTracker.expected b/ruby/ql/test/library-tests/dataflow/params/TypeTracker.expected index 80e9e84a83a1..7eae6c7cfd1e 100644 --- a/ruby/ql/test/library-tests/dataflow/params/TypeTracker.expected +++ b/ruby/ql/test/library-tests/dataflow/params/TypeTracker.expected @@ -3668,6 +3668,7 @@ trackEnd | params_flow.rb:1:11:1:11 | x | params_flow.rb:1:11:1:11 | x | | params_flow.rb:1:11:1:11 | x | params_flow.rb:1:11:1:11 | x | | params_flow.rb:1:11:1:11 | x | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:1:11:1:11 | x | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:1:11:1:11 | x | params_flow.rb:2:5:2:5 | x | | params_flow.rb:1:11:1:11 | x | params_flow.rb:5:10:5:10 | x | | params_flow.rb:1:11:1:11 | x | params_flow.rb:5:10:5:10 | x | @@ -3869,16 +3870,20 @@ trackEnd | params_flow.rb:5:10:5:10 | x | params_flow.rb:5:10:5:10 | x | | params_flow.rb:5:10:5:10 | x | params_flow.rb:5:10:5:10 | x | | params_flow.rb:5:10:5:10 | x | params_flow.rb:6:10:6:10 | x | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:6:5:6:10 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:6:5:6:10 | call to puts | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:10:5:10:11 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:10:5:11:84 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:11:5:11:11 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:14:1:14:30 | call to positional | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:17:5:17:11 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:17:5:18:82 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:18:5:18:11 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:21:1:21:35 | call to keyword | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:22:1:22:35 | call to keyword | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:23:1:23:41 | call to keyword | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:26:5:26:11 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:26:5:30:22 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:27:5:27:22 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:28:5:28:22 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:29:5:29:22 | call to sink | @@ -3890,14 +3895,17 @@ trackEnd | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:44:1:44:28 | call to positional | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:47:1:47:17 | call to positional | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:50:5:50:11 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:50:5:52:21 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:51:5:51:21 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:52:5:52:21 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:55:1:55:29 | call to posargs | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:58:1:58:25 | call to posargs | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:61:1:61:14 | call to posargs | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:65:5:65:13 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:65:5:65:33 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:67:1:67:17 | call to splatstuff | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:70:5:70:10 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:70:5:75:75 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:71:5:71:10 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:72:5:72:13 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:73:5:73:13 | call to sink | @@ -3906,6 +3914,7 @@ trackEnd | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:78:1:78:63 | call to splatmid | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:81:1:81:37 | call to splatmid | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:84:5:84:10 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:84:5:90:39 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:85:5:85:10 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:86:5:86:10 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:87:5:87:10 | call to sink | @@ -3915,17 +3924,20 @@ trackEnd | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:94:1:94:48 | call to pos_many | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:96:1:96:88 | call to splatmid | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:99:5:99:10 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:99:5:102:57 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:100:5:100:18 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:101:5:101:18 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:102:5:102:10 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:105:1:105:49 | call to splatmidsmall | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:106:1:106:46 | call to splatmidsmall | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:109:5:109:10 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:109:5:111:30 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:110:5:110:13 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:111:5:111:10 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:114:1:114:67 | call to splat_followed_by_keyword_param | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:118:1:118:14 | call to positional | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:121:5:121:10 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:121:5:125:39 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:122:5:122:10 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:123:5:123:10 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:124:5:124:10 | call to sink | @@ -3933,6 +3945,7 @@ trackEnd | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:128:1:128:61 | call to destruct | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:131:1:131:46 | call to pos_many | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:134:5:134:16 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:134:5:134:36 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:137:1:137:44 | call to splatall | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:144:1:144:20 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:146:1:146:20 | call to sink | @@ -3951,20 +3964,24 @@ trackEnd | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:191:1:191:11 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:193:1:193:11 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:201:5:201:15 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:201:5:204:15 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:202:5:202:15 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:203:5:203:15 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:204:5:204:15 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:207:1:207:14 | call to foo | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:211:9:211:15 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:211:9:217:23 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:212:9:212:21 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:213:9:213:21 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:214:9:214:21 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:215:9:215:16 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:216:9:216:25 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:217:9:217:23 | yield ... | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:223:9:223:13 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:223:9:223:13 | super call to m | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:227:1:229:3 | call to m | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:228:5:228:11 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:228:5:228:31 | ... | | params_flow.rb:6:5:6:10 | synthetic splat argument | params_flow.rb:6:5:6:10 | synthetic splat argument | | params_flow.rb:9:1:12:3 | &block | params_flow.rb:9:1:12:3 | &block | | params_flow.rb:9:1:12:3 | positional | params_flow.rb:9:1:12:3 | positional | @@ -3992,6 +4009,7 @@ trackEnd | params_flow.rb:9:20:9:21 | p2 | params_flow.rb:11:10:11:11 | p2 | | params_flow.rb:10:5:10:11 | call to sink | params_flow.rb:10:5:10:11 | call to sink | | params_flow.rb:10:5:10:11 | synthetic splat argument | params_flow.rb:10:5:10:11 | synthetic splat argument | +| params_flow.rb:11:5:11:11 | call to sink | params_flow.rb:10:5:11:84 | ... | | params_flow.rb:11:5:11:11 | call to sink | params_flow.rb:11:5:11:11 | call to sink | | params_flow.rb:11:5:11:11 | call to sink | params_flow.rb:14:1:14:30 | call to positional | | params_flow.rb:11:5:11:11 | call to sink | params_flow.rb:44:1:44:28 | call to positional | @@ -4010,6 +4028,7 @@ trackEnd | params_flow.rb:14:12:14:19 | synthetic splat argument | params_flow.rb:14:12:14:19 | synthetic splat argument | | params_flow.rb:14:18:14:18 | 1 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:14:18:14:18 | 1 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:14:18:14:18 | 1 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:14:18:14:18 | 1 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:14:18:14:18 | 1 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:14:18:14:18 | 1 | params_flow.rb:5:10:5:10 | x | @@ -4029,6 +4048,7 @@ trackEnd | params_flow.rb:14:22:14:29 | synthetic splat argument | params_flow.rb:14:22:14:29 | synthetic splat argument | | params_flow.rb:14:28:14:28 | 2 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:14:28:14:28 | 2 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:14:28:14:28 | 2 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:14:28:14:28 | 2 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:14:28:14:28 | 2 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:14:28:14:28 | 2 | params_flow.rb:5:10:5:10 | x | @@ -4064,6 +4084,7 @@ trackEnd | params_flow.rb:16:18:16:19 | p2 | params_flow.rb:18:10:18:11 | p2 | | params_flow.rb:17:5:17:11 | call to sink | params_flow.rb:17:5:17:11 | call to sink | | params_flow.rb:17:5:17:11 | synthetic splat argument | params_flow.rb:17:5:17:11 | synthetic splat argument | +| params_flow.rb:18:5:18:11 | call to sink | params_flow.rb:17:5:18:82 | ... | | params_flow.rb:18:5:18:11 | call to sink | params_flow.rb:18:5:18:11 | call to sink | | params_flow.rb:18:5:18:11 | call to sink | params_flow.rb:21:1:21:35 | call to keyword | | params_flow.rb:18:5:18:11 | call to sink | params_flow.rb:22:1:22:35 | call to keyword | @@ -4084,6 +4105,7 @@ trackEnd | params_flow.rb:21:13:21:20 | synthetic splat argument | params_flow.rb:21:13:21:20 | synthetic splat argument | | params_flow.rb:21:19:21:19 | 3 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:21:19:21:19 | 3 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:21:19:21:19 | 3 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:21:19:21:19 | 3 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:21:19:21:19 | 3 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:21:19:21:19 | 3 | params_flow.rb:5:10:5:10 | x | @@ -4105,6 +4127,7 @@ trackEnd | params_flow.rb:21:27:21:34 | synthetic splat argument | params_flow.rb:21:27:21:34 | synthetic splat argument | | params_flow.rb:21:33:21:33 | 4 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:21:33:21:33 | 4 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:21:33:21:33 | 4 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:21:33:21:33 | 4 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:21:33:21:33 | 4 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:21:33:21:33 | 4 | params_flow.rb:5:10:5:10 | x | @@ -4128,6 +4151,7 @@ trackEnd | params_flow.rb:22:13:22:20 | synthetic splat argument | params_flow.rb:22:13:22:20 | synthetic splat argument | | params_flow.rb:22:19:22:19 | 5 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:22:19:22:19 | 5 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:22:19:22:19 | 5 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:22:19:22:19 | 5 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:22:19:22:19 | 5 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:22:19:22:19 | 5 | params_flow.rb:5:10:5:10 | x | @@ -4149,6 +4173,7 @@ trackEnd | params_flow.rb:22:27:22:34 | synthetic splat argument | params_flow.rb:22:27:22:34 | synthetic splat argument | | params_flow.rb:22:33:22:33 | 6 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:22:33:22:33 | 6 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:22:33:22:33 | 6 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:22:33:22:33 | 6 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:22:33:22:33 | 6 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:22:33:22:33 | 6 | params_flow.rb:5:10:5:10 | x | @@ -4172,6 +4197,7 @@ trackEnd | params_flow.rb:23:16:23:23 | synthetic splat argument | params_flow.rb:23:16:23:23 | synthetic splat argument | | params_flow.rb:23:22:23:22 | 7 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:23:22:23:22 | 7 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:23:22:23:22 | 7 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:23:22:23:22 | 7 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:23:22:23:22 | 7 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:23:22:23:22 | 7 | params_flow.rb:5:10:5:10 | x | @@ -4193,6 +4219,7 @@ trackEnd | params_flow.rb:23:33:23:40 | synthetic splat argument | params_flow.rb:23:33:23:40 | synthetic splat argument | | params_flow.rb:23:39:23:39 | 8 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:23:39:23:39 | 8 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:23:39:23:39 | 8 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:23:39:23:39 | 8 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:23:39:23:39 | 8 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:23:39:23:39 | 8 | params_flow.rb:5:10:5:10 | x | @@ -4258,6 +4285,7 @@ trackEnd | params_flow.rb:29:11:29:21 | ...[...] | params_flow.rb:29:11:29:21 | ...[...] | | params_flow.rb:29:11:29:21 | synthetic splat argument | params_flow.rb:29:11:29:21 | synthetic splat argument | | params_flow.rb:29:18:29:20 | :p3 | params_flow.rb:29:18:29:20 | :p3 | +| params_flow.rb:30:5:30:22 | call to sink | params_flow.rb:26:5:30:22 | ... | | params_flow.rb:30:5:30:22 | call to sink | params_flow.rb:30:5:30:22 | call to sink | | params_flow.rb:30:5:30:22 | call to sink | params_flow.rb:33:1:33:58 | call to kwargs | | params_flow.rb:30:5:30:22 | call to sink | params_flow.rb:35:1:35:29 | call to kwargs | @@ -4292,6 +4320,7 @@ trackEnd | params_flow.rb:33:12:33:19 | synthetic splat argument | params_flow.rb:33:12:33:19 | synthetic splat argument | | params_flow.rb:33:18:33:18 | 9 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:33:18:33:18 | 9 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:33:18:33:18 | 9 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:33:18:33:18 | 9 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:33:18:33:18 | 9 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:33:18:33:18 | 9 | params_flow.rb:5:10:5:10 | x | @@ -4314,6 +4343,7 @@ trackEnd | params_flow.rb:33:26:33:34 | synthetic splat argument | params_flow.rb:33:26:33:34 | synthetic splat argument | | params_flow.rb:33:32:33:33 | 10 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:33:32:33:33 | 10 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:33:32:33:33 | 10 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:33:32:33:33 | 10 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:33:32:33:33 | 10 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:33:32:33:33 | 10 | params_flow.rb:5:10:5:10 | x | @@ -4333,6 +4363,7 @@ trackEnd | params_flow.rb:33:41:33:49 | synthetic splat argument | params_flow.rb:33:41:33:49 | synthetic splat argument | | params_flow.rb:33:47:33:48 | 11 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:33:47:33:48 | 11 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:33:47:33:48 | 11 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:33:47:33:48 | 11 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:33:47:33:48 | 11 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:33:47:33:48 | 11 | params_flow.rb:5:10:5:10 | x | @@ -4371,6 +4402,7 @@ trackEnd | params_flow.rb:34:14:34:22 | synthetic splat argument | params_flow.rb:34:14:34:22 | synthetic splat argument | | params_flow.rb:34:20:34:21 | 12 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:34:20:34:21 | 12 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:34:20:34:21 | 12 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:34:20:34:21 | 12 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:34:20:34:21 | 12 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:34:20:34:21 | 12 | params_flow.rb:5:10:5:10 | x | @@ -4409,6 +4441,7 @@ trackEnd | params_flow.rb:35:12:35:20 | synthetic splat argument | params_flow.rb:35:12:35:20 | synthetic splat argument | | params_flow.rb:35:18:35:19 | 13 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:35:18:35:19 | 13 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:35:18:35:19 | 13 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:35:18:35:19 | 13 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:35:18:35:19 | 13 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:35:18:35:19 | 13 | params_flow.rb:5:10:5:10 | x | @@ -4453,6 +4486,7 @@ trackEnd | params_flow.rb:37:16:37:24 | synthetic splat argument | params_flow.rb:37:16:37:24 | synthetic splat argument | | params_flow.rb:37:22:37:23 | 14 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:37:22:37:23 | 14 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:37:22:37:23 | 14 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:37:22:37:23 | 14 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:37:22:37:23 | 14 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:37:22:37:23 | 14 | params_flow.rb:5:10:5:10 | x | @@ -4475,6 +4509,7 @@ trackEnd | params_flow.rb:37:34:37:42 | synthetic splat argument | params_flow.rb:37:34:37:42 | synthetic splat argument | | params_flow.rb:37:40:37:41 | 15 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:37:40:37:41 | 15 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:37:40:37:41 | 15 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:37:40:37:41 | 15 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:37:40:37:41 | 15 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:37:40:37:41 | 15 | params_flow.rb:5:10:5:10 | x | @@ -4515,6 +4550,7 @@ trackEnd | params_flow.rb:40:16:40:24 | synthetic splat argument | params_flow.rb:40:16:40:24 | synthetic splat argument | | params_flow.rb:40:22:40:23 | 16 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:40:22:40:23 | 16 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:40:22:40:23 | 16 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:40:22:40:23 | 16 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:40:22:40:23 | 16 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:40:22:40:23 | 16 | params_flow.rb:5:10:5:10 | x | @@ -4538,6 +4574,7 @@ trackEnd | params_flow.rb:41:13:41:21 | synthetic splat argument | params_flow.rb:41:13:41:21 | synthetic splat argument | | params_flow.rb:41:19:41:20 | 17 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:41:19:41:20 | 17 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:41:19:41:20 | 17 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:41:19:41:20 | 17 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:41:19:41:20 | 17 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:41:19:41:20 | 17 | params_flow.rb:5:10:5:10 | x | @@ -4582,6 +4619,7 @@ trackEnd | params_flow.rb:43:9:43:17 | synthetic splat argument | params_flow.rb:43:9:43:17 | synthetic splat argument | | params_flow.rb:43:15:43:16 | 17 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:43:15:43:16 | 17 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:43:15:43:16 | 17 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:43:15:43:16 | 17 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:43:15:43:16 | 17 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:43:15:43:16 | 17 | params_flow.rb:5:10:5:10 | x | @@ -4604,6 +4642,7 @@ trackEnd | params_flow.rb:44:12:44:20 | synthetic splat argument | params_flow.rb:44:12:44:20 | synthetic splat argument | | params_flow.rb:44:18:44:19 | 16 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:44:18:44:19 | 16 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:44:18:44:19 | 16 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:44:18:44:19 | 16 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:44:18:44:19 | 16 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:44:18:44:19 | 16 | params_flow.rb:5:10:5:10 | x | @@ -4647,6 +4686,7 @@ trackEnd | params_flow.rb:46:9:46:17 | synthetic splat argument | params_flow.rb:46:9:46:17 | synthetic splat argument | | params_flow.rb:46:15:46:16 | 18 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:46:15:46:16 | 18 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:46:15:46:16 | 18 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:46:15:46:16 | 18 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:46:15:46:16 | 18 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:46:15:46:16 | 18 | params_flow.rb:5:10:5:10 | x | @@ -4666,6 +4706,7 @@ trackEnd | params_flow.rb:46:20:46:28 | synthetic splat argument | params_flow.rb:46:20:46:28 | synthetic splat argument | | params_flow.rb:46:26:46:27 | 19 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:46:26:46:27 | 19 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:46:26:46:27 | 19 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:46:26:46:27 | 19 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:46:26:46:27 | 19 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:46:26:46:27 | 19 | params_flow.rb:5:10:5:10 | x | @@ -4712,6 +4753,7 @@ trackEnd | params_flow.rb:51:11:51:20 | ...[...] | params_flow.rb:51:11:51:20 | ...[...] | | params_flow.rb:51:11:51:20 | synthetic splat argument | params_flow.rb:51:11:51:20 | synthetic splat argument | | params_flow.rb:51:19:51:19 | 0 | params_flow.rb:51:19:51:19 | 0 | +| params_flow.rb:52:5:52:21 | call to sink | params_flow.rb:50:5:52:21 | ... | | params_flow.rb:52:5:52:21 | call to sink | params_flow.rb:52:5:52:21 | call to sink | | params_flow.rb:52:5:52:21 | call to sink | params_flow.rb:55:1:55:29 | call to posargs | | params_flow.rb:52:5:52:21 | call to sink | params_flow.rb:58:1:58:25 | call to posargs | @@ -4737,6 +4779,7 @@ trackEnd | params_flow.rb:55:9:55:17 | synthetic splat argument | params_flow.rb:55:9:55:17 | synthetic splat argument | | params_flow.rb:55:15:55:16 | 20 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:55:15:55:16 | 20 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:55:15:55:16 | 20 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:55:15:55:16 | 20 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:55:15:55:16 | 20 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:55:15:55:16 | 20 | params_flow.rb:5:10:5:10 | x | @@ -4755,6 +4798,7 @@ trackEnd | params_flow.rb:55:20:55:28 | synthetic splat argument | params_flow.rb:55:20:55:28 | synthetic splat argument | | params_flow.rb:55:26:55:27 | 21 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:55:26:55:27 | 21 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:55:26:55:27 | 21 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:55:26:55:27 | 21 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:55:26:55:27 | 21 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:55:26:55:27 | 21 | params_flow.rb:5:10:5:10 | x | @@ -4793,6 +4837,7 @@ trackEnd | params_flow.rb:57:9:57:17 | synthetic splat argument | params_flow.rb:57:9:57:17 | synthetic splat argument | | params_flow.rb:57:15:57:16 | 22 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:57:15:57:16 | 22 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:57:15:57:16 | 22 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:57:15:57:16 | 22 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:57:15:57:16 | 22 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:57:15:57:16 | 22 | params_flow.rb:5:10:5:10 | x | @@ -4813,6 +4858,7 @@ trackEnd | params_flow.rb:58:9:58:17 | synthetic splat argument | params_flow.rb:58:9:58:17 | synthetic splat argument | | params_flow.rb:58:15:58:16 | 23 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:58:15:58:16 | 23 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:58:15:58:16 | 23 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:58:15:58:16 | 23 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:58:15:58:16 | 23 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:58:15:58:16 | 23 | params_flow.rb:5:10:5:10 | x | @@ -4860,6 +4906,7 @@ trackEnd | params_flow.rb:60:9:60:17 | synthetic splat argument | params_flow.rb:60:9:60:17 | synthetic splat argument | | params_flow.rb:60:15:60:16 | 24 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:60:15:60:16 | 24 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:60:15:60:16 | 24 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:60:15:60:16 | 24 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:60:15:60:16 | 24 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:60:15:60:16 | 24 | params_flow.rb:5:10:5:10 | x | @@ -4878,6 +4925,7 @@ trackEnd | params_flow.rb:60:20:60:28 | synthetic splat argument | params_flow.rb:60:20:60:28 | synthetic splat argument | | params_flow.rb:60:26:60:27 | 25 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:60:26:60:27 | 25 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:60:26:60:27 | 25 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:60:26:60:27 | 25 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:60:26:60:27 | 25 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:60:26:60:27 | 25 | params_flow.rb:5:10:5:10 | x | @@ -4901,6 +4949,7 @@ trackEnd | params_flow.rb:63:8:63:16 | synthetic splat argument | params_flow.rb:63:8:63:16 | synthetic splat argument | | params_flow.rb:63:14:63:15 | 26 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:63:14:63:15 | 26 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:63:14:63:15 | 26 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:63:14:63:15 | 26 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:63:14:63:15 | 26 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:63:14:63:15 | 26 | params_flow.rb:5:10:5:10 | x | @@ -4924,6 +4973,7 @@ trackEnd | params_flow.rb:64:16:64:17 | *x | params_flow.rb:65:10:65:10 | x | | params_flow.rb:64:17:64:17 | x | params_flow.rb:64:17:64:17 | x | | params_flow.rb:65:5:65:13 | call to sink | params_flow.rb:65:5:65:13 | call to sink | +| params_flow.rb:65:5:65:13 | call to sink | params_flow.rb:65:5:65:33 | ... | | params_flow.rb:65:5:65:13 | call to sink | params_flow.rb:67:1:67:17 | call to splatstuff | | params_flow.rb:65:5:65:13 | synthetic splat argument | params_flow.rb:65:5:65:13 | synthetic splat argument | | params_flow.rb:65:10:65:13 | ...[...] | params_flow.rb:5:10:5:10 | x | @@ -5006,6 +5056,7 @@ trackEnd | params_flow.rb:73:12:73:12 | 1 | params_flow.rb:73:12:73:12 | 1 | | params_flow.rb:74:5:74:10 | call to sink | params_flow.rb:74:5:74:10 | call to sink | | params_flow.rb:74:5:74:10 | synthetic splat argument | params_flow.rb:74:5:74:10 | synthetic splat argument | +| params_flow.rb:75:5:75:10 | call to sink | params_flow.rb:70:5:75:75 | ... | | params_flow.rb:75:5:75:10 | call to sink | params_flow.rb:75:5:75:10 | call to sink | | params_flow.rb:75:5:75:10 | call to sink | params_flow.rb:78:1:78:63 | call to splatmid | | params_flow.rb:75:5:75:10 | call to sink | params_flow.rb:81:1:81:37 | call to splatmid | @@ -5024,6 +5075,7 @@ trackEnd | params_flow.rb:78:10:78:18 | synthetic splat argument | params_flow.rb:78:10:78:18 | synthetic splat argument | | params_flow.rb:78:16:78:17 | 27 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:78:16:78:17 | 27 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:78:16:78:17 | 27 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:78:16:78:17 | 27 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:78:16:78:17 | 27 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:78:16:78:17 | 27 | params_flow.rb:5:10:5:10 | x | @@ -5043,6 +5095,7 @@ trackEnd | params_flow.rb:78:21:78:29 | synthetic splat argument | params_flow.rb:78:21:78:29 | synthetic splat argument | | params_flow.rb:78:27:78:28 | 28 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:78:27:78:28 | 28 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:78:27:78:28 | 28 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:78:27:78:28 | 28 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:78:27:78:28 | 28 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:78:27:78:28 | 28 | params_flow.rb:5:10:5:10 | x | @@ -5056,6 +5109,7 @@ trackEnd | params_flow.rb:78:32:78:40 | synthetic splat argument | params_flow.rb:78:32:78:40 | synthetic splat argument | | params_flow.rb:78:38:78:39 | 29 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:78:38:78:39 | 29 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:78:38:78:39 | 29 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:78:38:78:39 | 29 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:78:38:78:39 | 29 | params_flow.rb:78:32:78:40 | call to taint | | params_flow.rb:78:38:78:39 | 29 | params_flow.rb:78:38:78:39 | 29 | @@ -5063,6 +5117,7 @@ trackEnd | params_flow.rb:78:43:78:51 | synthetic splat argument | params_flow.rb:78:43:78:51 | synthetic splat argument | | params_flow.rb:78:49:78:50 | 30 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:78:49:78:50 | 30 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:78:49:78:50 | 30 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:78:49:78:50 | 30 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:78:49:78:50 | 30 | params_flow.rb:78:43:78:51 | call to taint | | params_flow.rb:78:49:78:50 | 30 | params_flow.rb:78:49:78:50 | 30 | @@ -5070,6 +5125,7 @@ trackEnd | params_flow.rb:78:54:78:62 | synthetic splat argument | params_flow.rb:78:54:78:62 | synthetic splat argument | | params_flow.rb:78:60:78:61 | 31 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:78:60:78:61 | 31 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:78:60:78:61 | 31 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:78:60:78:61 | 31 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:78:60:78:61 | 31 | params_flow.rb:78:54:78:62 | call to taint | | params_flow.rb:78:60:78:61 | 31 | params_flow.rb:78:60:78:61 | 31 | @@ -5106,6 +5162,7 @@ trackEnd | params_flow.rb:80:9:80:17 | synthetic splat argument | params_flow.rb:80:9:80:17 | synthetic splat argument | | params_flow.rb:80:15:80:16 | 33 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:80:15:80:16 | 33 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:80:15:80:16 | 33 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:80:15:80:16 | 33 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:80:15:80:16 | 33 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:80:15:80:16 | 33 | params_flow.rb:5:10:5:10 | x | @@ -5119,6 +5176,7 @@ trackEnd | params_flow.rb:80:20:80:28 | synthetic splat argument | params_flow.rb:80:20:80:28 | synthetic splat argument | | params_flow.rb:80:26:80:27 | 34 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:80:26:80:27 | 34 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:80:26:80:27 | 34 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:80:26:80:27 | 34 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:80:26:80:27 | 34 | params_flow.rb:80:20:80:28 | call to taint | | params_flow.rb:80:26:80:27 | 34 | params_flow.rb:80:26:80:27 | 34 | @@ -5126,6 +5184,7 @@ trackEnd | params_flow.rb:80:31:80:39 | synthetic splat argument | params_flow.rb:80:31:80:39 | synthetic splat argument | | params_flow.rb:80:37:80:38 | 35 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:80:37:80:38 | 35 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:80:37:80:38 | 35 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:80:37:80:38 | 35 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:80:37:80:38 | 35 | params_flow.rb:80:31:80:39 | call to taint | | params_flow.rb:80:37:80:38 | 35 | params_flow.rb:80:37:80:38 | 35 | @@ -5133,6 +5192,7 @@ trackEnd | params_flow.rb:80:42:80:50 | synthetic splat argument | params_flow.rb:80:42:80:50 | synthetic splat argument | | params_flow.rb:80:48:80:49 | 36 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:80:48:80:49 | 36 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:80:48:80:49 | 36 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:80:48:80:49 | 36 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:80:48:80:49 | 36 | params_flow.rb:80:42:80:50 | call to taint | | params_flow.rb:80:48:80:49 | 36 | params_flow.rb:80:48:80:49 | 36 | @@ -5149,6 +5209,7 @@ trackEnd | params_flow.rb:81:10:81:18 | synthetic splat argument | params_flow.rb:81:10:81:18 | synthetic splat argument | | params_flow.rb:81:16:81:17 | 32 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:81:16:81:17 | 32 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:81:16:81:17 | 32 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:81:16:81:17 | 32 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:81:16:81:17 | 32 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:81:16:81:17 | 32 | params_flow.rb:5:10:5:10 | x | @@ -5163,6 +5224,7 @@ trackEnd | params_flow.rb:81:28:81:36 | synthetic splat argument | params_flow.rb:81:28:81:36 | synthetic splat argument | | params_flow.rb:81:34:81:35 | 37 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:81:34:81:35 | 37 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:81:34:81:35 | 37 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:81:34:81:35 | 37 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:81:34:81:35 | 37 | params_flow.rb:81:28:81:36 | call to taint | | params_flow.rb:81:34:81:35 | 37 | params_flow.rb:81:34:81:35 | 37 | @@ -5242,6 +5304,7 @@ trackEnd | params_flow.rb:88:5:88:10 | synthetic splat argument | params_flow.rb:88:5:88:10 | synthetic splat argument | | params_flow.rb:89:5:89:10 | call to sink | params_flow.rb:89:5:89:10 | call to sink | | params_flow.rb:89:5:89:10 | synthetic splat argument | params_flow.rb:89:5:89:10 | synthetic splat argument | +| params_flow.rb:90:5:90:10 | call to sink | params_flow.rb:84:5:90:39 | ... | | params_flow.rb:90:5:90:10 | call to sink | params_flow.rb:90:5:90:10 | call to sink | | params_flow.rb:90:5:90:10 | call to sink | params_flow.rb:94:1:94:48 | call to pos_many | | params_flow.rb:90:5:90:10 | call to sink | params_flow.rb:131:1:131:46 | call to pos_many | @@ -5279,6 +5342,7 @@ trackEnd | params_flow.rb:93:9:93:17 | synthetic splat argument | params_flow.rb:93:9:93:17 | synthetic splat argument | | params_flow.rb:93:15:93:16 | 40 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:93:15:93:16 | 40 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:93:15:93:16 | 40 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:93:15:93:16 | 40 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:93:15:93:16 | 40 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:93:15:93:16 | 40 | params_flow.rb:5:10:5:10 | x | @@ -5298,6 +5362,7 @@ trackEnd | params_flow.rb:93:20:93:28 | synthetic splat argument | params_flow.rb:93:20:93:28 | synthetic splat argument | | params_flow.rb:93:26:93:27 | 41 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:93:26:93:27 | 41 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:93:26:93:27 | 41 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:93:26:93:27 | 41 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:93:26:93:27 | 41 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:93:26:93:27 | 41 | params_flow.rb:5:10:5:10 | x | @@ -5317,6 +5382,7 @@ trackEnd | params_flow.rb:93:31:93:39 | synthetic splat argument | params_flow.rb:93:31:93:39 | synthetic splat argument | | params_flow.rb:93:37:93:38 | 42 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:93:37:93:38 | 42 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:93:37:93:38 | 42 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:93:37:93:38 | 42 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:93:37:93:38 | 42 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:93:37:93:38 | 42 | params_flow.rb:5:10:5:10 | x | @@ -5336,6 +5402,7 @@ trackEnd | params_flow.rb:93:42:93:50 | synthetic splat argument | params_flow.rb:93:42:93:50 | synthetic splat argument | | params_flow.rb:93:48:93:49 | 43 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:93:48:93:49 | 43 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:93:48:93:49 | 43 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:93:48:93:49 | 43 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:93:48:93:49 | 43 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:93:48:93:49 | 43 | params_flow.rb:5:10:5:10 | x | @@ -5358,6 +5425,7 @@ trackEnd | params_flow.rb:94:10:94:18 | synthetic splat argument | params_flow.rb:94:10:94:18 | synthetic splat argument | | params_flow.rb:94:16:94:17 | 38 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:94:16:94:17 | 38 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:94:16:94:17 | 38 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:94:16:94:17 | 38 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:94:16:94:17 | 38 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:94:16:94:17 | 38 | params_flow.rb:5:10:5:10 | x | @@ -5377,6 +5445,7 @@ trackEnd | params_flow.rb:94:21:94:29 | synthetic splat argument | params_flow.rb:94:21:94:29 | synthetic splat argument | | params_flow.rb:94:27:94:28 | 39 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:94:27:94:28 | 39 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:94:27:94:28 | 39 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:94:27:94:28 | 39 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:94:27:94:28 | 39 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:94:27:94:28 | 39 | params_flow.rb:5:10:5:10 | x | @@ -5391,6 +5460,7 @@ trackEnd | params_flow.rb:94:39:94:47 | synthetic splat argument | params_flow.rb:94:39:94:47 | synthetic splat argument | | params_flow.rb:94:45:94:46 | 44 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:94:45:94:46 | 44 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:94:45:94:46 | 44 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:94:45:94:46 | 44 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:94:45:94:46 | 44 | params_flow.rb:94:39:94:47 | call to taint | | params_flow.rb:94:45:94:46 | 44 | params_flow.rb:94:45:94:46 | 44 | @@ -5406,6 +5476,7 @@ trackEnd | params_flow.rb:96:10:96:18 | synthetic splat argument | params_flow.rb:96:10:96:18 | synthetic splat argument | | params_flow.rb:96:16:96:17 | 45 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:96:16:96:17 | 45 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:96:16:96:17 | 45 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:96:16:96:17 | 45 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:96:16:96:17 | 45 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:96:16:96:17 | 45 | params_flow.rb:5:10:5:10 | x | @@ -5425,6 +5496,7 @@ trackEnd | params_flow.rb:96:21:96:29 | synthetic splat argument | params_flow.rb:96:21:96:29 | synthetic splat argument | | params_flow.rb:96:27:96:28 | 46 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:96:27:96:28 | 46 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:96:27:96:28 | 46 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:96:27:96:28 | 46 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:96:27:96:28 | 46 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:96:27:96:28 | 46 | params_flow.rb:5:10:5:10 | x | @@ -5443,6 +5515,7 @@ trackEnd | params_flow.rb:96:34:96:42 | synthetic splat argument | params_flow.rb:96:34:96:42 | synthetic splat argument | | params_flow.rb:96:40:96:41 | 47 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:96:40:96:41 | 47 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:96:40:96:41 | 47 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:96:40:96:41 | 47 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:96:40:96:41 | 47 | params_flow.rb:96:34:96:42 | call to taint | | params_flow.rb:96:40:96:41 | 47 | params_flow.rb:96:40:96:41 | 47 | @@ -5450,6 +5523,7 @@ trackEnd | params_flow.rb:96:45:96:53 | synthetic splat argument | params_flow.rb:96:45:96:53 | synthetic splat argument | | params_flow.rb:96:51:96:52 | 48 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:96:51:96:52 | 48 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:96:51:96:52 | 48 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:96:51:96:52 | 48 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:96:51:96:52 | 48 | params_flow.rb:96:45:96:53 | call to taint | | params_flow.rb:96:51:96:52 | 48 | params_flow.rb:96:51:96:52 | 48 | @@ -5457,6 +5531,7 @@ trackEnd | params_flow.rb:96:56:96:64 | synthetic splat argument | params_flow.rb:96:56:96:64 | synthetic splat argument | | params_flow.rb:96:62:96:63 | 49 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:96:62:96:63 | 49 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:96:62:96:63 | 49 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:96:62:96:63 | 49 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:96:62:96:63 | 49 | params_flow.rb:96:56:96:64 | call to taint | | params_flow.rb:96:62:96:63 | 49 | params_flow.rb:96:62:96:63 | 49 | @@ -5464,6 +5539,7 @@ trackEnd | params_flow.rb:96:68:96:76 | synthetic splat argument | params_flow.rb:96:68:96:76 | synthetic splat argument | | params_flow.rb:96:74:96:75 | 50 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:96:74:96:75 | 50 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:96:74:96:75 | 50 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:96:74:96:75 | 50 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:96:74:96:75 | 50 | params_flow.rb:96:68:96:76 | call to taint | | params_flow.rb:96:74:96:75 | 50 | params_flow.rb:96:74:96:75 | 50 | @@ -5471,6 +5547,7 @@ trackEnd | params_flow.rb:96:79:96:87 | synthetic splat argument | params_flow.rb:96:79:96:87 | synthetic splat argument | | params_flow.rb:96:85:96:86 | 51 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:96:85:96:86 | 51 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:96:85:96:86 | 51 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:96:85:96:86 | 51 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:96:85:96:86 | 51 | params_flow.rb:96:79:96:87 | call to taint | | params_flow.rb:96:85:96:86 | 51 | params_flow.rb:96:85:96:86 | 51 | @@ -5523,6 +5600,7 @@ trackEnd | params_flow.rb:101:10:101:18 | ...[...] | params_flow.rb:101:10:101:18 | ...[...] | | params_flow.rb:101:10:101:18 | synthetic splat argument | params_flow.rb:101:10:101:18 | synthetic splat argument | | params_flow.rb:101:17:101:17 | 1 | params_flow.rb:101:17:101:17 | 1 | +| params_flow.rb:102:5:102:10 | call to sink | params_flow.rb:99:5:102:57 | ... | | params_flow.rb:102:5:102:10 | call to sink | params_flow.rb:102:5:102:10 | call to sink | | params_flow.rb:102:5:102:10 | call to sink | params_flow.rb:105:1:105:49 | call to splatmidsmall | | params_flow.rb:102:5:102:10 | call to sink | params_flow.rb:106:1:106:46 | call to splatmidsmall | @@ -5539,6 +5617,7 @@ trackEnd | params_flow.rb:105:15:105:23 | synthetic splat argument | params_flow.rb:105:15:105:23 | synthetic splat argument | | params_flow.rb:105:21:105:22 | 52 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:105:21:105:22 | 52 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:105:21:105:22 | 52 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:105:21:105:22 | 52 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:105:21:105:22 | 52 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:105:21:105:22 | 52 | params_flow.rb:5:10:5:10 | x | @@ -5557,6 +5636,7 @@ trackEnd | params_flow.rb:105:28:105:36 | synthetic splat argument | params_flow.rb:105:28:105:36 | synthetic splat argument | | params_flow.rb:105:34:105:35 | 53 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:105:34:105:35 | 53 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:105:34:105:35 | 53 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:105:34:105:35 | 53 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:105:34:105:35 | 53 | params_flow.rb:105:28:105:36 | call to taint | | params_flow.rb:105:34:105:35 | 53 | params_flow.rb:105:34:105:35 | 53 | @@ -5564,6 +5644,7 @@ trackEnd | params_flow.rb:105:39:105:47 | synthetic splat argument | params_flow.rb:105:39:105:47 | synthetic splat argument | | params_flow.rb:105:45:105:46 | 54 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:105:45:105:46 | 54 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:105:45:105:46 | 54 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:105:45:105:46 | 54 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:105:45:105:46 | 54 | params_flow.rb:105:39:105:47 | call to taint | | params_flow.rb:105:45:105:46 | 54 | params_flow.rb:105:45:105:46 | 54 | @@ -5580,6 +5661,7 @@ trackEnd | params_flow.rb:106:15:106:23 | synthetic splat argument | params_flow.rb:106:15:106:23 | synthetic splat argument | | params_flow.rb:106:21:106:22 | 55 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:106:21:106:22 | 55 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:106:21:106:22 | 55 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:106:21:106:22 | 55 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:106:21:106:22 | 55 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:106:21:106:22 | 55 | params_flow.rb:5:10:5:10 | x | @@ -5593,6 +5675,7 @@ trackEnd | params_flow.rb:106:26:106:34 | synthetic splat argument | params_flow.rb:106:26:106:34 | synthetic splat argument | | params_flow.rb:106:32:106:33 | 56 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:106:32:106:33 | 56 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:106:32:106:33 | 56 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:106:32:106:33 | 56 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:106:32:106:33 | 56 | params_flow.rb:106:26:106:34 | call to taint | | params_flow.rb:106:32:106:33 | 56 | params_flow.rb:106:32:106:33 | 56 | @@ -5600,6 +5683,7 @@ trackEnd | params_flow.rb:106:37:106:45 | synthetic splat argument | params_flow.rb:106:37:106:45 | synthetic splat argument | | params_flow.rb:106:43:106:44 | 57 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:106:43:106:44 | 57 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:106:43:106:44 | 57 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:106:43:106:44 | 57 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:106:43:106:44 | 57 | params_flow.rb:106:37:106:45 | call to taint | | params_flow.rb:106:43:106:44 | 57 | params_flow.rb:106:43:106:44 | 57 | @@ -5643,6 +5727,7 @@ trackEnd | params_flow.rb:110:10:110:13 | ...[...] | params_flow.rb:110:10:110:13 | ...[...] | | params_flow.rb:110:10:110:13 | synthetic splat argument | params_flow.rb:110:10:110:13 | synthetic splat argument | | params_flow.rb:110:12:110:12 | 0 | params_flow.rb:110:12:110:12 | 0 | +| params_flow.rb:111:5:111:10 | call to sink | params_flow.rb:109:5:111:30 | ... | | params_flow.rb:111:5:111:10 | call to sink | params_flow.rb:111:5:111:10 | call to sink | | params_flow.rb:111:5:111:10 | call to sink | params_flow.rb:114:1:114:67 | call to splat_followed_by_keyword_param | | params_flow.rb:111:5:111:10 | synthetic splat argument | params_flow.rb:111:5:111:10 | synthetic splat argument | @@ -5660,6 +5745,7 @@ trackEnd | params_flow.rb:114:33:114:41 | synthetic splat argument | params_flow.rb:114:33:114:41 | synthetic splat argument | | params_flow.rb:114:39:114:40 | 58 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:114:39:114:40 | 58 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:114:39:114:40 | 58 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:114:39:114:40 | 58 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:114:39:114:40 | 58 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:114:39:114:40 | 58 | params_flow.rb:5:10:5:10 | x | @@ -5677,6 +5763,7 @@ trackEnd | params_flow.rb:114:44:114:52 | synthetic splat argument | params_flow.rb:114:44:114:52 | synthetic splat argument | | params_flow.rb:114:50:114:51 | 59 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:114:50:114:51 | 59 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:114:50:114:51 | 59 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:114:50:114:51 | 59 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:114:50:114:51 | 59 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:114:50:114:51 | 59 | params_flow.rb:5:10:5:10 | x | @@ -5696,6 +5783,7 @@ trackEnd | params_flow.rb:114:58:114:66 | synthetic splat argument | params_flow.rb:114:58:114:66 | synthetic splat argument | | params_flow.rb:114:64:114:65 | 60 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:114:64:114:65 | 60 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:114:64:114:65 | 60 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:114:64:114:65 | 60 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:114:64:114:65 | 60 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:114:64:114:65 | 60 | params_flow.rb:5:10:5:10 | x | @@ -5747,6 +5835,7 @@ trackEnd | params_flow.rb:117:19:117:27 | synthetic splat argument | params_flow.rb:117:19:117:27 | synthetic splat argument | | params_flow.rb:117:25:117:26 | 61 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:117:25:117:26 | 61 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:117:25:117:26 | 61 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:117:25:117:26 | 61 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:117:25:117:26 | 61 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:117:25:117:26 | 61 | params_flow.rb:5:10:5:10 | x | @@ -5816,6 +5905,7 @@ trackEnd | params_flow.rb:123:5:123:10 | synthetic splat argument | params_flow.rb:123:5:123:10 | synthetic splat argument | | params_flow.rb:124:5:124:10 | call to sink | params_flow.rb:124:5:124:10 | call to sink | | params_flow.rb:124:5:124:10 | synthetic splat argument | params_flow.rb:124:5:124:10 | synthetic splat argument | +| params_flow.rb:125:5:125:10 | call to sink | params_flow.rb:121:5:125:39 | ... | | params_flow.rb:125:5:125:10 | call to sink | params_flow.rb:125:5:125:10 | call to sink | | params_flow.rb:125:5:125:10 | call to sink | params_flow.rb:128:1:128:61 | call to destruct | | params_flow.rb:125:5:125:10 | synthetic splat argument | params_flow.rb:125:5:125:10 | synthetic splat argument | @@ -5829,6 +5919,7 @@ trackEnd | params_flow.rb:128:11:128:19 | synthetic splat argument | params_flow.rb:128:11:128:19 | synthetic splat argument | | params_flow.rb:128:17:128:18 | 62 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:128:17:128:18 | 62 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:128:17:128:18 | 62 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:128:17:128:18 | 62 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:128:17:128:18 | 62 | params_flow.rb:128:11:128:19 | call to taint | | params_flow.rb:128:17:128:18 | 62 | params_flow.rb:128:17:128:18 | 62 | @@ -5836,6 +5927,7 @@ trackEnd | params_flow.rb:128:22:128:30 | synthetic splat argument | params_flow.rb:128:22:128:30 | synthetic splat argument | | params_flow.rb:128:28:128:29 | 63 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:128:28:128:29 | 63 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:128:28:128:29 | 63 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:128:28:128:29 | 63 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:128:28:128:29 | 63 | params_flow.rb:128:22:128:30 | call to taint | | params_flow.rb:128:28:128:29 | 63 | params_flow.rb:128:28:128:29 | 63 | @@ -5847,6 +5939,7 @@ trackEnd | params_flow.rb:128:35:128:43 | synthetic splat argument | params_flow.rb:128:35:128:43 | synthetic splat argument | | params_flow.rb:128:41:128:42 | 64 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:128:41:128:42 | 64 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:128:41:128:42 | 64 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:128:41:128:42 | 64 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:128:41:128:42 | 64 | params_flow.rb:128:35:128:43 | call to taint | | params_flow.rb:128:41:128:42 | 64 | params_flow.rb:128:41:128:42 | 64 | @@ -5859,6 +5952,7 @@ trackEnd | params_flow.rb:128:50:128:58 | synthetic splat argument | params_flow.rb:128:50:128:58 | synthetic splat argument | | params_flow.rb:128:56:128:57 | 65 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:128:56:128:57 | 65 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:128:56:128:57 | 65 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:128:56:128:57 | 65 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:128:56:128:57 | 65 | params_flow.rb:128:50:128:58 | call to taint | | params_flow.rb:128:56:128:57 | 65 | params_flow.rb:128:56:128:57 | 65 | @@ -5895,6 +5989,7 @@ trackEnd | params_flow.rb:130:9:130:17 | synthetic splat argument | params_flow.rb:130:9:130:17 | synthetic splat argument | | params_flow.rb:130:15:130:16 | 66 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:130:15:130:16 | 66 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:130:15:130:16 | 66 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:130:15:130:16 | 66 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:130:15:130:16 | 66 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:130:15:130:16 | 66 | params_flow.rb:5:10:5:10 | x | @@ -5914,6 +6009,7 @@ trackEnd | params_flow.rb:130:20:130:28 | synthetic splat argument | params_flow.rb:130:20:130:28 | synthetic splat argument | | params_flow.rb:130:26:130:27 | 67 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:130:26:130:27 | 67 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:130:26:130:27 | 67 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:130:26:130:27 | 67 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:130:26:130:27 | 67 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:130:26:130:27 | 67 | params_flow.rb:5:10:5:10 | x | @@ -5930,6 +6026,7 @@ trackEnd | params_flow.rb:131:17:131:25 | synthetic splat argument | params_flow.rb:131:17:131:25 | synthetic splat argument | | params_flow.rb:131:23:131:24 | 68 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:131:23:131:24 | 68 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:131:23:131:24 | 68 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:131:23:131:24 | 68 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:131:23:131:24 | 68 | params_flow.rb:131:17:131:25 | call to taint | | params_flow.rb:131:23:131:24 | 68 | params_flow.rb:131:23:131:24 | 68 | @@ -5950,6 +6047,7 @@ trackEnd | params_flow.rb:133:14:133:18 | *args | params_flow.rb:134:10:134:13 | args | | params_flow.rb:133:15:133:18 | args | params_flow.rb:133:15:133:18 | args | | params_flow.rb:134:5:134:16 | call to sink | params_flow.rb:134:5:134:16 | call to sink | +| params_flow.rb:134:5:134:16 | call to sink | params_flow.rb:134:5:134:36 | ... | | params_flow.rb:134:5:134:16 | call to sink | params_flow.rb:137:1:137:44 | call to splatall | | params_flow.rb:134:5:134:16 | synthetic splat argument | params_flow.rb:134:5:134:16 | synthetic splat argument | | params_flow.rb:134:10:134:16 | ...[...] | params_flow.rb:5:10:5:10 | x | @@ -5971,6 +6069,7 @@ trackEnd | params_flow.rb:137:12:137:20 | synthetic splat argument | params_flow.rb:137:12:137:20 | synthetic splat argument | | params_flow.rb:137:18:137:19 | 69 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:137:18:137:19 | 69 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:137:18:137:19 | 69 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:137:18:137:19 | 69 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:137:18:137:19 | 69 | params_flow.rb:137:12:137:20 | call to taint | | params_flow.rb:137:18:137:19 | 69 | params_flow.rb:137:18:137:19 | 69 | @@ -5982,6 +6081,7 @@ trackEnd | params_flow.rb:137:23:137:31 | synthetic splat argument | params_flow.rb:137:23:137:31 | synthetic splat argument | | params_flow.rb:137:29:137:30 | 70 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:137:29:137:30 | 70 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:137:29:137:30 | 70 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:137:29:137:30 | 70 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:137:29:137:30 | 70 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:137:29:137:30 | 70 | params_flow.rb:5:10:5:10 | x | @@ -5993,6 +6093,7 @@ trackEnd | params_flow.rb:137:34:137:42 | synthetic splat argument | params_flow.rb:137:34:137:42 | synthetic splat argument | | params_flow.rb:137:40:137:41 | 71 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:137:40:137:41 | 71 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:137:40:137:41 | 71 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:137:40:137:41 | 71 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:137:40:137:41 | 71 | params_flow.rb:137:34:137:42 | call to taint | | params_flow.rb:137:40:137:41 | 71 | params_flow.rb:137:40:137:41 | 71 | @@ -6007,6 +6108,7 @@ trackEnd | params_flow.rb:140:5:140:15 | ...[...] | params_flow.rb:140:5:140:15 | ...[...] | | params_flow.rb:140:5:140:15 | [post] ...[...] | params_flow.rb:140:5:140:15 | [post] ...[...] | | params_flow.rb:140:5:140:15 | synthetic splat argument | params_flow.rb:140:5:140:15 | synthetic splat argument | +| params_flow.rb:140:5:140:38 | call to insert | params_flow.rb:140:5:140:38 | ... | | params_flow.rb:140:5:140:38 | call to insert | params_flow.rb:140:5:140:38 | call to insert | | params_flow.rb:140:5:140:38 | call to insert | params_flow.rb:145:1:145:29 | call to hashSplatSideEffect | | params_flow.rb:140:5:140:38 | call to insert | params_flow.rb:150:1:150:42 | call to hashSplatSideEffect | @@ -6045,6 +6147,7 @@ trackEnd | params_flow.rb:143:24:143:32 | synthetic splat argument | params_flow.rb:143:24:143:32 | synthetic splat argument | | params_flow.rb:143:30:143:31 | 72 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:143:30:143:31 | 72 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:143:30:143:31 | 72 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:143:30:143:31 | 72 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:143:30:143:31 | 72 | params_flow.rb:140:27:140:37 | ...[...] | | params_flow.rb:143:30:143:31 | 72 | params_flow.rb:143:24:143:32 | call to taint | @@ -6109,6 +6212,7 @@ trackEnd | params_flow.rb:150:33:150:41 | synthetic splat argument | params_flow.rb:150:33:150:41 | synthetic splat argument | | params_flow.rb:150:39:150:40 | 73 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:150:39:150:40 | 73 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:150:39:150:40 | 73 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:150:39:150:40 | 73 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:150:39:150:40 | 73 | params_flow.rb:140:27:140:37 | ...[...] | | params_flow.rb:150:39:150:40 | 73 | params_flow.rb:150:33:150:41 | call to taint | @@ -6134,6 +6238,7 @@ trackEnd | params_flow.rb:153:28:153:29 | p2 | params_flow.rb:153:28:153:29 | p2 | | params_flow.rb:153:28:153:29 | p2 | params_flow.rb:154:18:154:19 | p2 | | params_flow.rb:154:5:154:6 | [post] p1 | params_flow.rb:154:5:154:6 | [post] p1 | +| params_flow.rb:154:5:154:20 | call to insert | params_flow.rb:154:5:154:20 | ... | | params_flow.rb:154:5:154:20 | call to insert | params_flow.rb:154:5:154:20 | call to insert | | params_flow.rb:154:5:154:20 | call to insert | params_flow.rb:159:1:159:27 | call to keywordSideEffect | | params_flow.rb:154:5:154:20 | call to insert | params_flow.rb:164:1:164:40 | call to keywordSideEffect | @@ -6172,6 +6277,7 @@ trackEnd | params_flow.rb:157:24:157:32 | synthetic splat argument | params_flow.rb:157:24:157:32 | synthetic splat argument | | params_flow.rb:157:30:157:31 | 74 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:157:30:157:31 | 74 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:157:30:157:31 | 74 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:157:30:157:31 | 74 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:157:30:157:31 | 74 | params_flow.rb:153:28:153:29 | p2 | | params_flow.rb:157:30:157:31 | 74 | params_flow.rb:153:28:153:29 | p2 | @@ -6235,6 +6341,7 @@ trackEnd | params_flow.rb:164:31:164:39 | synthetic splat argument | params_flow.rb:164:31:164:39 | synthetic splat argument | | params_flow.rb:164:37:164:38 | 75 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:164:37:164:38 | 75 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:164:37:164:38 | 75 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:164:37:164:38 | 75 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:164:37:164:38 | 75 | params_flow.rb:153:28:153:29 | p2 | | params_flow.rb:164:37:164:38 | 75 | params_flow.rb:153:28:153:29 | p2 | @@ -6260,6 +6367,7 @@ trackEnd | params_flow.rb:168:5:168:14 | ...[...] | params_flow.rb:168:5:168:14 | ...[...] | | params_flow.rb:168:5:168:14 | [post] ...[...] | params_flow.rb:168:5:168:14 | [post] ...[...] | | params_flow.rb:168:5:168:14 | synthetic splat argument | params_flow.rb:168:5:168:14 | synthetic splat argument | +| params_flow.rb:168:5:168:36 | call to insert | params_flow.rb:168:5:168:36 | ... | | params_flow.rb:168:5:168:36 | call to insert | params_flow.rb:168:5:168:36 | call to insert | | params_flow.rb:168:5:168:36 | call to insert | params_flow.rb:173:1:173:25 | call to splatSideEffect | | params_flow.rb:168:5:168:36 | call to insert | params_flow.rb:178:1:178:30 | call to splatSideEffect | @@ -6296,6 +6404,7 @@ trackEnd | params_flow.rb:171:17:171:25 | synthetic splat argument | params_flow.rb:171:17:171:25 | synthetic splat argument | | params_flow.rb:171:23:171:24 | 76 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:171:23:171:24 | 76 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:171:23:171:24 | 76 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:171:23:171:24 | 76 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:171:23:171:24 | 76 | params_flow.rb:168:26:168:35 | ...[...] | | params_flow.rb:171:23:171:24 | 76 | params_flow.rb:171:17:171:25 | call to taint | @@ -6356,6 +6465,7 @@ trackEnd | params_flow.rb:178:21:178:29 | synthetic splat argument | params_flow.rb:178:21:178:29 | synthetic splat argument | | params_flow.rb:178:27:178:28 | 77 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:178:27:178:28 | 77 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:178:27:178:28 | 77 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:178:27:178:28 | 77 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:178:27:178:28 | 77 | params_flow.rb:168:26:168:35 | ...[...] | | params_flow.rb:178:27:178:28 | 77 | params_flow.rb:178:21:178:29 | call to taint | @@ -6381,6 +6491,7 @@ trackEnd | params_flow.rb:181:28:181:29 | p2 | params_flow.rb:181:28:181:29 | p2 | | params_flow.rb:181:28:181:29 | p2 | params_flow.rb:182:18:182:19 | p2 | | params_flow.rb:182:5:182:6 | [post] p1 | params_flow.rb:182:5:182:6 | [post] p1 | +| params_flow.rb:182:5:182:20 | call to insert | params_flow.rb:182:5:182:20 | ... | | params_flow.rb:182:5:182:20 | call to insert | params_flow.rb:182:5:182:20 | call to insert | | params_flow.rb:182:5:182:20 | call to insert | params_flow.rb:187:1:187:25 | call to positionSideEffect | | params_flow.rb:182:5:182:20 | call to insert | params_flow.rb:192:1:192:33 | call to positionSideEffect | @@ -6421,6 +6532,7 @@ trackEnd | params_flow.rb:185:14:185:22 | synthetic splat argument | params_flow.rb:185:14:185:22 | synthetic splat argument | | params_flow.rb:185:20:185:21 | 78 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:185:20:185:21 | 78 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:185:20:185:21 | 78 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:185:20:185:21 | 78 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:185:20:185:21 | 78 | params_flow.rb:181:28:181:29 | p2 | | params_flow.rb:185:20:185:21 | 78 | params_flow.rb:181:28:181:29 | p2 | @@ -6480,6 +6592,7 @@ trackEnd | params_flow.rb:192:24:192:32 | synthetic splat argument | params_flow.rb:192:24:192:32 | synthetic splat argument | | params_flow.rb:192:30:192:31 | 79 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:192:30:192:31 | 79 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:192:30:192:31 | 79 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:192:30:192:31 | 79 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:192:30:192:31 | 79 | params_flow.rb:181:28:181:29 | p2 | | params_flow.rb:192:30:192:31 | 79 | params_flow.rb:181:28:181:29 | p2 | @@ -6524,6 +6637,7 @@ trackEnd | params_flow.rb:196:10:196:18 | synthetic splat argument | params_flow.rb:196:10:196:18 | synthetic splat argument | | params_flow.rb:196:16:196:17 | 80 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:196:16:196:17 | 80 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:196:16:196:17 | 80 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:196:16:196:17 | 80 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:196:16:196:17 | 80 | params_flow.rb:196:10:196:18 | call to taint | | params_flow.rb:196:16:196:17 | 80 | params_flow.rb:196:16:196:17 | 80 | @@ -6587,6 +6701,7 @@ trackEnd | params_flow.rb:203:11:203:14 | ...[...] | params_flow.rb:203:11:203:14 | ...[...] | | params_flow.rb:203:11:203:14 | synthetic splat argument | params_flow.rb:203:11:203:14 | synthetic splat argument | | params_flow.rb:203:13:203:13 | 0 | params_flow.rb:203:13:203:13 | 0 | +| params_flow.rb:204:5:204:15 | call to sink | params_flow.rb:201:5:204:15 | ... | | params_flow.rb:204:5:204:15 | call to sink | params_flow.rb:204:5:204:15 | call to sink | | params_flow.rb:204:5:204:15 | call to sink | params_flow.rb:207:1:207:14 | call to foo | | params_flow.rb:204:5:204:15 | synthetic splat argument | params_flow.rb:204:5:204:15 | synthetic splat argument | @@ -6681,7 +6796,9 @@ trackEnd | params_flow.rb:216:14:216:24 | synthetic splat argument | params_flow.rb:216:14:216:24 | synthetic splat argument | | params_flow.rb:216:21:216:23 | :k2 | params_flow.rb:216:21:216:23 | :k2 | | params_flow.rb:217:9:217:23 | synthetic splat argument | params_flow.rb:217:9:217:23 | synthetic splat argument | +| params_flow.rb:217:9:217:23 | yield ... | params_flow.rb:211:9:217:23 | ... | | params_flow.rb:217:9:217:23 | yield ... | params_flow.rb:217:9:217:23 | yield ... | +| params_flow.rb:217:9:217:23 | yield ... | params_flow.rb:223:9:223:13 | ... | | params_flow.rb:217:9:217:23 | yield ... | params_flow.rb:223:9:223:13 | super call to m | | params_flow.rb:217:9:217:23 | yield ... | params_flow.rb:227:1:229:3 | call to m | | params_flow.rb:217:9:217:23 | yield block argument | params_flow.rb:217:9:217:23 | yield block argument | @@ -6695,6 +6812,7 @@ trackEnd | params_flow.rb:217:15:217:23 | synthetic splat argument | params_flow.rb:217:15:217:23 | synthetic splat argument | | params_flow.rb:217:21:217:22 | 86 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:217:21:217:22 | 86 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:217:21:217:22 | 86 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:217:21:217:22 | 86 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:217:21:217:22 | 86 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:217:21:217:22 | 86 | params_flow.rb:5:10:5:10 | x | @@ -6760,6 +6878,7 @@ trackEnd | params_flow.rb:223:9:223:13 | ** ... | params_flow.rb:223:9:223:13 | ** ... | | params_flow.rb:223:9:223:13 | Pair | params_flow.rb:223:9:223:13 | Pair | | params_flow.rb:223:9:223:13 | k1 | params_flow.rb:223:9:223:13 | k1 | +| params_flow.rb:223:9:223:13 | super call to m | params_flow.rb:223:9:223:13 | ... | | params_flow.rb:223:9:223:13 | super call to m | params_flow.rb:223:9:223:13 | super call to m | | params_flow.rb:223:9:223:13 | super call to m | params_flow.rb:227:1:229:3 | call to m | | params_flow.rb:223:9:223:13 | synthetic hash-splat argument | params_flow.rb:210:26:210:33 | **kwargs | @@ -6793,6 +6912,7 @@ trackEnd | params_flow.rb:227:11:227:19 | synthetic splat argument | params_flow.rb:227:11:227:19 | synthetic splat argument | | params_flow.rb:227:17:227:18 | 81 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:227:17:227:18 | 81 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:227:17:227:18 | 81 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:227:17:227:18 | 81 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:227:17:227:18 | 81 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:227:17:227:18 | 81 | params_flow.rb:5:10:5:10 | x | @@ -6813,6 +6933,7 @@ trackEnd | params_flow.rb:227:22:227:30 | synthetic splat argument | params_flow.rb:227:22:227:30 | synthetic splat argument | | params_flow.rb:227:28:227:29 | 82 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:227:28:227:29 | 82 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:227:28:227:29 | 82 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:227:28:227:29 | 82 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:227:28:227:29 | 82 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:227:28:227:29 | 82 | params_flow.rb:5:10:5:10 | x | @@ -6833,6 +6954,7 @@ trackEnd | params_flow.rb:227:36:227:44 | synthetic splat argument | params_flow.rb:227:36:227:44 | synthetic splat argument | | params_flow.rb:227:42:227:43 | 83 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:227:42:227:43 | 83 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:227:42:227:43 | 83 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:227:42:227:43 | 83 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:227:42:227:43 | 83 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:227:42:227:43 | 83 | params_flow.rb:5:10:5:10 | x | @@ -6855,6 +6977,7 @@ trackEnd | params_flow.rb:227:51:227:59 | synthetic splat argument | params_flow.rb:227:51:227:59 | synthetic splat argument | | params_flow.rb:227:57:227:58 | 84 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:227:57:227:58 | 84 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:227:57:227:58 | 84 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:227:57:227:58 | 84 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:227:57:227:58 | 84 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:227:57:227:58 | 84 | params_flow.rb:5:10:5:10 | x | @@ -6877,6 +7000,7 @@ trackEnd | params_flow.rb:227:66:227:74 | synthetic splat argument | params_flow.rb:227:66:227:74 | synthetic splat argument | | params_flow.rb:227:72:227:73 | 85 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:227:72:227:73 | 85 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:227:72:227:73 | 85 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:227:72:227:73 | 85 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:227:72:227:73 | 85 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:227:72:227:73 | 85 | params_flow.rb:5:10:5:10 | x | @@ -6902,10 +7026,13 @@ trackEnd | params_flow.rb:227:81:227:81 | x | params_flow.rb:227:81:227:81 | x | | params_flow.rb:227:81:227:81 | x | params_flow.rb:227:81:227:81 | x | | params_flow.rb:227:81:227:81 | x | params_flow.rb:228:10:228:10 | x | +| params_flow.rb:228:5:228:11 | call to sink | params_flow.rb:211:9:217:23 | ... | | params_flow.rb:228:5:228:11 | call to sink | params_flow.rb:217:9:217:23 | yield ... | +| params_flow.rb:228:5:228:11 | call to sink | params_flow.rb:223:9:223:13 | ... | | params_flow.rb:228:5:228:11 | call to sink | params_flow.rb:223:9:223:13 | super call to m | | params_flow.rb:228:5:228:11 | call to sink | params_flow.rb:227:1:229:3 | call to m | | params_flow.rb:228:5:228:11 | call to sink | params_flow.rb:228:5:228:11 | call to sink | +| params_flow.rb:228:5:228:11 | call to sink | params_flow.rb:228:5:228:31 | ... | | params_flow.rb:228:5:228:11 | synthetic splat argument | params_flow.rb:228:5:228:11 | synthetic splat argument | forwardButNoBackwardFlow backwardButNoForwardFlow diff --git a/ruby/ql/test/library-tests/dataflow/type-tracker/TypeTracker.expected b/ruby/ql/test/library-tests/dataflow/type-tracker/TypeTracker.expected index 7b308c6816cd..bfecc4ec629d 100644 --- a/ruby/ql/test/library-tests/dataflow/type-tracker/TypeTracker.expected +++ b/ruby/ql/test/library-tests/dataflow/type-tracker/TypeTracker.expected @@ -360,9 +360,11 @@ trackEnd | type_tracker.rb:2:16:2:18 | val | type_tracker.rb:2:16:2:18 | val | | type_tracker.rb:2:16:2:18 | val | type_tracker.rb:2:16:2:18 | val | | type_tracker.rb:2:16:2:18 | val | type_tracker.rb:2:16:2:18 | val | +| type_tracker.rb:2:16:2:18 | val | type_tracker.rb:3:9:4:20 | ... | | type_tracker.rb:2:16:2:18 | val | type_tracker.rb:3:14:3:23 | call to field | | type_tracker.rb:2:16:2:18 | val | type_tracker.rb:4:9:4:20 | ... = ... | | type_tracker.rb:2:16:2:18 | val | type_tracker.rb:4:18:4:20 | val | +| type_tracker.rb:2:16:2:18 | val | type_tracker.rb:8:9:8:14 | ... | | type_tracker.rb:2:16:2:18 | val | type_tracker.rb:8:9:8:14 | @field | | type_tracker.rb:2:16:2:18 | val | type_tracker.rb:14:5:14:13 | call to field= | | type_tracker.rb:2:16:2:18 | val | type_tracker.rb:15:10:15:18 | call to field | @@ -377,6 +379,7 @@ trackEnd | type_tracker.rb:7:5:9:7 | self in field | type_tracker.rb:7:5:9:7 | self in field | | type_tracker.rb:7:5:9:7 | self in field | type_tracker.rb:8:9:8:14 | self | | type_tracker.rb:8:9:8:14 | @field | type_tracker.rb:3:14:3:23 | call to field | +| type_tracker.rb:8:9:8:14 | @field | type_tracker.rb:8:9:8:14 | ... | | type_tracker.rb:8:9:8:14 | @field | type_tracker.rb:8:9:8:14 | @field | | type_tracker.rb:8:9:8:14 | @field | type_tracker.rb:15:10:15:18 | call to field | | type_tracker.rb:12:1:16:3 | &block | type_tracker.rb:12:1:16:3 | &block | @@ -408,8 +411,10 @@ trackEnd | type_tracker.rb:14:5:14:13 | synthetic splat argument | type_tracker.rb:14:5:14:13 | synthetic splat argument | | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:2:16:2:18 | val | | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:2:16:2:18 | val | +| type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:3:9:4:20 | ... | | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:4:9:4:20 | ... = ... | | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:4:18:4:20 | val | +| type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:8:9:8:14 | ... | | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:8:9:8:14 | @field | | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:14:5:14:13 | __synth__0 | | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:14:5:14:13 | call to field= | @@ -419,6 +424,7 @@ trackEnd | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:14:17:14:23 | __synth__0 | | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:15:10:15:18 | call to field | | type_tracker.rb:14:17:14:23 | __synth__0 | type_tracker.rb:14:17:14:23 | __synth__0 | +| type_tracker.rb:15:5:15:18 | call to puts | type_tracker.rb:13:5:15:18 | ... | | type_tracker.rb:15:5:15:18 | call to puts | type_tracker.rb:15:5:15:18 | call to puts | | type_tracker.rb:15:5:15:18 | synthetic splat argument | type_tracker.rb:15:5:15:18 | synthetic splat argument | | type_tracker.rb:15:10:15:18 | call to field | type_tracker.rb:15:10:15:18 | call to field | @@ -439,6 +445,7 @@ trackEnd | type_tracker.rb:18:20:18:21 | p2 | type_tracker.rb:20:10:20:11 | p2 | | type_tracker.rb:19:5:19:11 | call to puts | type_tracker.rb:19:5:19:11 | call to puts | | type_tracker.rb:19:5:19:11 | synthetic splat argument | type_tracker.rb:19:5:19:11 | synthetic splat argument | +| type_tracker.rb:20:5:20:11 | call to puts | type_tracker.rb:19:5:20:11 | ... | | type_tracker.rb:20:5:20:11 | call to puts | type_tracker.rb:20:5:20:11 | call to puts | | type_tracker.rb:20:5:20:11 | call to puts | type_tracker.rb:23:1:23:16 | call to positional | | type_tracker.rb:20:5:20:11 | synthetic splat argument | type_tracker.rb:20:5:20:11 | synthetic splat argument | @@ -469,6 +476,7 @@ trackEnd | type_tracker.rb:25:18:25:19 | p2 | type_tracker.rb:27:10:27:11 | p2 | | type_tracker.rb:26:5:26:11 | call to puts | type_tracker.rb:26:5:26:11 | call to puts | | type_tracker.rb:26:5:26:11 | synthetic splat argument | type_tracker.rb:26:5:26:11 | synthetic splat argument | +| type_tracker.rb:27:5:27:11 | call to puts | type_tracker.rb:26:5:27:11 | ... | | type_tracker.rb:27:5:27:11 | call to puts | type_tracker.rb:27:5:27:11 | call to puts | | type_tracker.rb:27:5:27:11 | call to puts | type_tracker.rb:30:1:30:21 | call to keyword | | type_tracker.rb:27:5:27:11 | call to puts | type_tracker.rb:31:1:31:21 | call to keyword | @@ -523,6 +531,7 @@ trackEnd | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:34:18:34:20 | obj | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:34:18:34:20 | obj | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:34:18:34:20 | obj | +| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:35:5:52:13 | ... | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:35:12:35:14 | obj | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:36:5:36:10 | ...[...] | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:39:5:39:12 | __synth__0 | @@ -679,16 +688,22 @@ trackEnd | type_tracker.rb:50:14:50:26 | synthetic splat argument | type_tracker.rb:50:14:50:26 | synthetic splat argument | | type_tracker.rb:50:14:50:26 | synthetic splat argument | type_tracker.rb:51:5:51:10 | array4 | | type_tracker.rb:50:14:50:26 | synthetic splat argument | type_tracker.rb:52:5:52:10 | array4 | +| type_tracker.rb:50:15:50:15 | 1 | type_tracker.rb:35:5:52:13 | ... | | type_tracker.rb:50:15:50:15 | 1 | type_tracker.rb:50:15:50:15 | 1 | | type_tracker.rb:50:15:50:15 | 1 | type_tracker.rb:52:5:52:13 | ...[...] | +| type_tracker.rb:50:17:50:17 | 2 | type_tracker.rb:35:5:52:13 | ... | | type_tracker.rb:50:17:50:17 | 2 | type_tracker.rb:50:17:50:17 | 2 | | type_tracker.rb:50:17:50:17 | 2 | type_tracker.rb:52:5:52:13 | ...[...] | +| type_tracker.rb:50:19:50:19 | 3 | type_tracker.rb:35:5:52:13 | ... | | type_tracker.rb:50:19:50:19 | 3 | type_tracker.rb:50:19:50:19 | 3 | | type_tracker.rb:50:19:50:19 | 3 | type_tracker.rb:52:5:52:13 | ...[...] | +| type_tracker.rb:50:21:50:21 | 4 | type_tracker.rb:35:5:52:13 | ... | | type_tracker.rb:50:21:50:21 | 4 | type_tracker.rb:50:21:50:21 | 4 | | type_tracker.rb:50:21:50:21 | 4 | type_tracker.rb:52:5:52:13 | ...[...] | +| type_tracker.rb:50:23:50:23 | 5 | type_tracker.rb:35:5:52:13 | ... | | type_tracker.rb:50:23:50:23 | 5 | type_tracker.rb:50:23:50:23 | 5 | | type_tracker.rb:50:23:50:23 | 5 | type_tracker.rb:52:5:52:13 | ...[...] | +| type_tracker.rb:50:25:50:25 | 6 | type_tracker.rb:35:5:52:13 | ... | | type_tracker.rb:50:25:50:25 | 6 | type_tracker.rb:50:25:50:25 | 6 | | type_tracker.rb:50:25:50:25 | 6 | type_tracker.rb:52:5:52:13 | ...[...] | | type_tracker.rb:51:5:51:10 | [post] array4 | type_tracker.rb:51:5:51:10 | [post] array4 | @@ -696,6 +711,7 @@ trackEnd | type_tracker.rb:51:5:51:13 | call to []= | type_tracker.rb:51:5:51:13 | call to []= | | type_tracker.rb:51:5:51:13 | synthetic splat argument | type_tracker.rb:51:5:51:13 | synthetic splat argument | | type_tracker.rb:51:17:51:19 | __synth__0 | type_tracker.rb:51:17:51:19 | __synth__0 | +| type_tracker.rb:52:5:52:13 | ...[...] | type_tracker.rb:35:5:52:13 | ... | | type_tracker.rb:52:5:52:13 | ...[...] | type_tracker.rb:52:5:52:13 | ...[...] | | type_tracker.rb:52:5:52:13 | synthetic splat argument | type_tracker.rb:52:5:52:13 | synthetic splat argument | forwardButNoBackwardFlow diff --git a/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected b/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected index 6b6fdbf22fac..1a78fc816ad9 100644 --- a/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected +++ b/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected @@ -7,8 +7,10 @@ activeRecordModelClasses | associations.rb:11:1:13:3 | Tag | | associations.rb:15:1:17:3 | Comment | activeRecordInstances +| ActiveRecord.rb:9:5:9:68 | ... | | ActiveRecord.rb:9:5:9:68 | call to find | | ActiveRecord.rb:13:5:13:40 | call to find_by | +| ActiveRecord.rb:13:5:13:46 | ... | | ActiveRecord.rb:13:5:13:46 | call to users | | ActiveRecord.rb:16:3:31:5 | self (exec) | | ActiveRecord.rb:16:3:31:5 | self in exec | @@ -28,14 +30,19 @@ activeRecordInstances | ActiveRecord.rb:30:5:30:14 | self | | ActiveRecord.rb:52:5:52:51 | call to authenticate | | ActiveRecord.rb:53:5:53:30 | call to find_by_name | +| ActiveRecord.rb:67:5:79:34 | ... | | ActiveRecord.rb:72:5:74:7 | if ... | | ActiveRecord.rb:72:43:73:40 | then ... | | ActiveRecord.rb:73:7:73:40 | call to find_by | | ActiveRecord.rb:77:5:77:33 | call to find_by | | ActiveRecord.rb:79:5:79:34 | call to find | +| ActiveRecord.rb:89:5:89:24 | ... | | ActiveRecord.rb:89:5:89:24 | call to create | +| ActiveRecord.rb:93:5:93:66 | ... | | ActiveRecord.rb:93:5:93:66 | call to create | +| ActiveRecord.rb:97:5:97:68 | ... | | ActiveRecord.rb:97:5:97:68 | call to create | +| ActiveRecord.rb:101:5:101:16 | ... | | ActiveRecord.rb:101:5:101:16 | call to create | | associations.rb:19:1:19:7 | author1 | | associations.rb:19:1:19:20 | ... = ... | From c42cd270ca9c189682f3dc83e398b62b849bc3c2 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Tue, 11 Aug 2026 11:32:55 +0200 Subject: [PATCH 0432/2098] Ruby: Accept new nodes in END block. --- ruby/ql/test/library-tests/controlflow/graph/Nodes.expected | 1 + 1 file changed, 1 insertion(+) diff --git a/ruby/ql/test/library-tests/controlflow/graph/Nodes.expected b/ruby/ql/test/library-tests/controlflow/graph/Nodes.expected index 1bb35e0987c9..3d0f3d6db8a1 100644 --- a/ruby/ql/test/library-tests/controlflow/graph/Nodes.expected +++ b/ruby/ql/test/library-tests/controlflow/graph/Nodes.expected @@ -107,6 +107,7 @@ positionalArguments | cfg.rb:9:1:9:21 | call to [] | cfg.rb:9:14:9:20 | "another" | | cfg.rb:12:3:12:8 | call to puts | cfg.rb:12:8:12:8 | 4 | | cfg.rb:16:3:16:14 | call to puts | cfg.rb:16:8:16:14 | "hello" | +| cfg.rb:20:3:20:14 | call to puts | cfg.rb:20:8:20:14 | "world" | | cfg.rb:23:1:23:6 | ... + ... | cfg.rb:23:6:23:6 | 1 | | cfg.rb:25:15:25:20 | call to puts | cfg.rb:25:20:25:20 | x | | cfg.rb:27:1:27:11 | call to puts | cfg.rb:27:6:27:11 | &... | From 958438252caf57cd4e796c2e631428f129d078dc Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Tue, 11 Aug 2026 11:43:07 +0200 Subject: [PATCH 0433/2098] Ruby: Accept location changes for SSA. --- .../test/library-tests/variables/ssa.expected | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/ruby/ql/test/library-tests/variables/ssa.expected b/ruby/ql/test/library-tests/variables/ssa.expected index 69222157b05a..dfea893b9490 100644 --- a/ruby/ql/test/library-tests/variables/ssa.expected +++ b/ruby/ql/test/library-tests/variables/ssa.expected @@ -38,7 +38,7 @@ definition | nested_scopes.rb:22:9:24:11 | self (show_a2) | nested_scopes.rb:22:9:24:11 | self | | nested_scopes.rb:22:21:22:21 | a | nested_scopes.rb:22:21:22:21 | a | | nested_scopes.rb:27:7:29:9 | self (show) | nested_scopes.rb:27:7:29:9 | self | -| nested_scopes.rb:30:16:30:19 | self (class << ...) | nested_scopes.rb:30:7:33:9 | self | +| nested_scopes.rb:30:7:33:9 | self (class << ...) | nested_scopes.rb:30:7:33:9 | self | | nested_scopes.rb:31:11:31:11 | a | nested_scopes.rb:31:11:31:11 | a | | nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:40:1:40:1 | d | | parameters.rb:1:1:62:1 | self (parameters.rb) | parameters.rb:1:1:62:1 | self | @@ -81,7 +81,7 @@ definition | parameters.rb:54:9:57:3 | x | parameters.rb:53:1:53:1 | x | | parameters.rb:54:14:54:14 | y | parameters.rb:54:14:54:14 | y | | parameters.rb:54:19:54:19 | x | parameters.rb:53:1:53:1 | x | -| parameters.rb:55:4:55:9 | phi | parameters.rb:53:1:53:1 | x | +| parameters.rb:55:4:56:9 | phi | parameters.rb:53:1:53:1 | x | | parameters.rb:59:1:61:3 | self (tuples_nested) | parameters.rb:59:1:61:3 | self | | parameters.rb:59:20:59:20 | a | parameters.rb:59:20:59:20 | a | | parameters.rb:59:23:59:23 | b | parameters.rb:59:23:59:23 | b | @@ -125,7 +125,7 @@ definition | ssa.rb:10:5:10:5 | i | ssa.rb:2:3:2:3 | i | | ssa.rb:18:1:23:3 | self (m1) | ssa.rb:18:1:23:3 | self | | ssa.rb:18:8:18:8 | x | ssa.rb:18:8:18:8 | x | -| ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | +| ssa.rb:19:3:22:5 | phi | ssa.rb:18:8:18:8 | x | | ssa.rb:21:5:21:5 | x | ssa.rb:18:8:18:8 | x | | ssa.rb:25:1:30:3 | elem | ssa.rb:26:7:26:10 | elem | | ssa.rb:25:1:30:3 | self (m2) | ssa.rb:25:1:30:3 | self | @@ -227,7 +227,7 @@ read | nested_scopes.rb:22:21:22:21 | a | nested_scopes.rb:22:21:22:21 | a | nested_scopes.rb:23:16:23:16 | a | | nested_scopes.rb:27:7:29:9 | self (show) | nested_scopes.rb:27:7:29:9 | self | nested_scopes.rb:28:11:28:16 | self | | nested_scopes.rb:27:7:29:9 | self (show) | nested_scopes.rb:27:7:29:9 | self | nested_scopes.rb:28:16:28:16 | self | -| nested_scopes.rb:30:16:30:19 | self (class << ...) | nested_scopes.rb:30:7:33:9 | self | nested_scopes.rb:32:11:32:16 | self | +| nested_scopes.rb:30:7:33:9 | self (class << ...) | nested_scopes.rb:30:7:33:9 | self | nested_scopes.rb:32:11:32:16 | self | | nested_scopes.rb:31:11:31:11 | a | nested_scopes.rb:31:11:31:11 | a | nested_scopes.rb:32:16:32:16 | a | | nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:41:1:41:1 | d | | parameters.rb:1:9:5:3 | self | parameters.rb:1:1:62:1 | self | parameters.rb:3:4:3:9 | self | @@ -268,7 +268,7 @@ read | parameters.rb:54:9:57:3 | self | parameters.rb:1:1:62:1 | self | parameters.rb:55:4:55:9 | self | | parameters.rb:54:9:57:3 | self | parameters.rb:1:1:62:1 | self | parameters.rb:56:4:56:9 | self | | parameters.rb:54:14:54:14 | y | parameters.rb:54:14:54:14 | y | parameters.rb:56:9:56:9 | y | -| parameters.rb:55:4:55:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:55:9:55:9 | x | +| parameters.rb:55:4:56:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:55:9:55:9 | x | | parameters.rb:59:1:61:3 | self (tuples_nested) | parameters.rb:59:1:61:3 | self | parameters.rb:60:3:60:23 | self | | parameters.rb:59:20:59:20 | a | parameters.rb:59:20:59:20 | a | parameters.rb:60:11:60:11 | a | | parameters.rb:59:23:59:23 | b | parameters.rb:59:23:59:23 | b | parameters.rb:60:16:60:16 | b | @@ -339,9 +339,9 @@ read | ssa.rb:10:5:10:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:11:10:11:10 | i | | ssa.rb:10:5:10:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:12:10:12:10 | i | | ssa.rb:18:1:23:3 | self (m1) | ssa.rb:18:1:23:3 | self | ssa.rb:20:5:20:10 | self | -| ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:19:9:19:9 | x | -| ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:20:10:20:10 | x | -| ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:21:5:21:5 | x | +| ssa.rb:19:3:22:5 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:19:9:19:9 | x | +| ssa.rb:19:3:22:5 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:20:10:20:10 | x | +| ssa.rb:19:3:22:5 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:21:5:21:5 | x | | ssa.rb:25:1:30:3 | elem | ssa.rb:26:7:26:10 | elem | ssa.rb:26:7:26:10 | elem | | ssa.rb:25:1:30:3 | self (m2) | ssa.rb:25:1:30:3 | self | ssa.rb:29:3:29:11 | self | | ssa.rb:25:8:25:15 | elements | ssa.rb:25:8:25:15 | elements | ssa.rb:26:15:26:22 | elements | @@ -430,7 +430,7 @@ firstRead | nested_scopes.rb:22:9:24:11 | self (show_a2) | nested_scopes.rb:22:9:24:11 | self | nested_scopes.rb:23:11:23:16 | self | | nested_scopes.rb:22:21:22:21 | a | nested_scopes.rb:22:21:22:21 | a | nested_scopes.rb:23:16:23:16 | a | | nested_scopes.rb:27:7:29:9 | self (show) | nested_scopes.rb:27:7:29:9 | self | nested_scopes.rb:28:11:28:16 | self | -| nested_scopes.rb:30:16:30:19 | self (class << ...) | nested_scopes.rb:30:7:33:9 | self | nested_scopes.rb:32:11:32:16 | self | +| nested_scopes.rb:30:7:33:9 | self (class << ...) | nested_scopes.rb:30:7:33:9 | self | nested_scopes.rb:32:11:32:16 | self | | nested_scopes.rb:31:11:31:11 | a | nested_scopes.rb:31:11:31:11 | a | nested_scopes.rb:32:16:32:16 | a | | nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:41:1:41:1 | d | | parameters.rb:1:9:5:3 | self | parameters.rb:1:1:62:1 | self | parameters.rb:3:4:3:9 | self | @@ -467,7 +467,7 @@ firstRead | parameters.rb:49:15:49:15 | b | parameters.rb:49:15:49:15 | b | parameters.rb:50:16:50:16 | b | | parameters.rb:54:9:57:3 | self | parameters.rb:1:1:62:1 | self | parameters.rb:55:4:55:9 | self | | parameters.rb:54:14:54:14 | y | parameters.rb:54:14:54:14 | y | parameters.rb:56:9:56:9 | y | -| parameters.rb:55:4:55:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:55:9:55:9 | x | +| parameters.rb:55:4:56:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:55:9:55:9 | x | | parameters.rb:59:1:61:3 | self (tuples_nested) | parameters.rb:59:1:61:3 | self | parameters.rb:60:3:60:23 | self | | parameters.rb:59:20:59:20 | a | parameters.rb:59:20:59:20 | a | parameters.rb:60:11:60:11 | a | | parameters.rb:59:23:59:23 | b | parameters.rb:59:23:59:23 | b | parameters.rb:60:16:60:16 | b | @@ -509,7 +509,7 @@ firstRead | ssa.rb:6:5:6:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:7:10:7:10 | i | | ssa.rb:10:5:10:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:11:10:11:10 | i | | ssa.rb:18:1:23:3 | self (m1) | ssa.rb:18:1:23:3 | self | ssa.rb:20:5:20:10 | self | -| ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:19:9:19:9 | x | +| ssa.rb:19:3:22:5 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:19:9:19:9 | x | | ssa.rb:25:1:30:3 | elem | ssa.rb:26:7:26:10 | elem | ssa.rb:26:7:26:10 | elem | | ssa.rb:25:1:30:3 | self (m2) | ssa.rb:25:1:30:3 | self | ssa.rb:29:3:29:11 | self | | ssa.rb:25:8:25:15 | elements | ssa.rb:25:8:25:15 | elements | ssa.rb:26:15:26:22 | elements | @@ -605,8 +605,8 @@ adjacentReads | ssa.rb:6:5:6:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:7:10:7:10 | i | ssa.rb:8:10:8:10 | i | | ssa.rb:10:5:10:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:11:10:11:10 | i | ssa.rb:12:10:12:10 | i | | ssa.rb:18:1:23:3 | self (m1) | ssa.rb:18:1:23:3 | self | ssa.rb:20:5:20:10 | self | ssa.rb:20:5:20:10 | self | -| ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:19:9:19:9 | x | ssa.rb:20:10:20:10 | x | -| ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:20:10:20:10 | x | ssa.rb:21:5:21:5 | x | +| ssa.rb:19:3:22:5 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:19:9:19:9 | x | ssa.rb:20:10:20:10 | x | +| ssa.rb:19:3:22:5 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:20:10:20:10 | x | ssa.rb:21:5:21:5 | x | | ssa.rb:38:1:42:3 | self (m4) | ssa.rb:38:1:42:3 | self | ssa.rb:39:3:39:9 | self | ssa.rb:39:8:39:9 | self | | ssa.rb:38:1:42:3 | self (m4) | ssa.rb:38:1:42:3 | self | ssa.rb:39:8:39:9 | self | ssa.rb:41:3:41:13 | self | | ssa.rb:66:11:70:5 | captured | ssa.rb:65:3:65:10 | captured | ssa.rb:68:10:68:17 | captured | ssa.rb:69:5:69:12 | captured | @@ -624,12 +624,12 @@ phi | parameters.rb:37:3:37:18 | phi | parameters.rb:35:16:35:16 | b | parameters.rb:35:16:35:16 | b | | parameters.rb:42:3:42:18 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:40:1:43:3 | e | | parameters.rb:42:3:42:18 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:40:15:40:15 | e | -| parameters.rb:55:4:55:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:54:9:57:3 | x | -| parameters.rb:55:4:55:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:54:19:54:19 | x | +| parameters.rb:55:4:56:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:54:9:57:3 | x | +| parameters.rb:55:4:56:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:54:19:54:19 | x | | ssa.rb:5:3:13:5 | phi | ssa.rb:2:3:2:3 | i | ssa.rb:6:5:6:5 | i | | ssa.rb:5:3:13:5 | phi | ssa.rb:2:3:2:3 | i | ssa.rb:10:5:10:5 | i | -| ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:18:8:18:8 | x | -| ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:21:5:21:5 | x | +| ssa.rb:19:3:22:5 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:18:8:18:8 | x | +| ssa.rb:19:3:22:5 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:21:5:21:5 | x | | ssa.rb:26:7:26:10 | phi | ssa.rb:26:7:26:10 | elem | ssa.rb:25:1:30:3 | elem | | ssa.rb:26:7:26:10 | phi | ssa.rb:26:7:26:10 | elem | ssa.rb:26:7:26:10 | elem | | ssa.rb:45:3:45:12 | phi | ssa.rb:45:3:45:3 | x | ssa.rb:44:1:47:3 | x | @@ -637,28 +637,28 @@ phi | ssa.rb:50:3:50:8 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:49:1:51:3 | y | | ssa.rb:50:3:50:8 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:49:14:49:14 | y | phiReadNode -| parameters.rb:26:3:26:11 | SSA phi read(name) | parameters.rb:25:15:25:18 | name | +| parameters.rb:26:3:27:13 | SSA phi read(name) | parameters.rb:25:15:25:18 | name | | ssa.rb:5:3:13:5 | SSA phi read(self) | ssa.rb:1:1:16:3 | self | -| ssa.rb:19:9:19:9 | SSA phi read(self) | ssa.rb:18:1:23:3 | self | +| ssa.rb:19:3:22:5 | SSA phi read(self) | ssa.rb:18:1:23:3 | self | | ssa.rb:92:3:96:5 | SSA phi read(self) | ssa.rb:90:1:103:3 | self | | ssa.rb:92:3:96:5 | SSA phi read(x) | ssa.rb:91:3:91:3 | x | | ssa.rb:94:3:95:10 | SSA phi read(self) | ssa.rb:90:1:103:3 | self | | ssa.rb:94:3:95:10 | SSA phi read(x) | ssa.rb:91:3:91:3 | x | phiReadNodeFirstRead -| parameters.rb:26:3:26:11 | SSA phi read(name) | parameters.rb:25:15:25:18 | name | parameters.rb:26:8:26:11 | name | +| parameters.rb:26:3:27:13 | SSA phi read(name) | parameters.rb:25:15:25:18 | name | parameters.rb:26:8:26:11 | name | | ssa.rb:5:3:13:5 | SSA phi read(self) | ssa.rb:1:1:16:3 | self | ssa.rb:15:3:15:8 | self | -| ssa.rb:19:9:19:9 | SSA phi read(self) | ssa.rb:18:1:23:3 | self | ssa.rb:20:5:20:10 | self | +| ssa.rb:19:3:22:5 | SSA phi read(self) | ssa.rb:18:1:23:3 | self | ssa.rb:20:5:20:10 | self | | ssa.rb:92:3:96:5 | SSA phi read(self) | ssa.rb:90:1:103:3 | self | ssa.rb:99:5:99:10 | self | | ssa.rb:92:3:96:5 | SSA phi read(self) | ssa.rb:90:1:103:3 | self | ssa.rb:101:5:101:10 | self | | ssa.rb:92:3:96:5 | SSA phi read(x) | ssa.rb:91:3:91:3 | x | ssa.rb:99:10:99:10 | x | | ssa.rb:92:3:96:5 | SSA phi read(x) | ssa.rb:91:3:91:3 | x | ssa.rb:101:10:101:10 | x | phiReadInput -| parameters.rb:26:3:26:11 | SSA phi read(name) | parameters.rb:25:15:25:18 | name | -| parameters.rb:26:3:26:11 | SSA phi read(name) | parameters.rb:25:40:25:43 | SSA read(name) | +| parameters.rb:26:3:27:13 | SSA phi read(name) | parameters.rb:25:15:25:18 | name | +| parameters.rb:26:3:27:13 | SSA phi read(name) | parameters.rb:25:40:25:43 | SSA read(name) | | ssa.rb:5:3:13:5 | SSA phi read(self) | ssa.rb:8:5:8:14 | SSA read(self) | | ssa.rb:5:3:13:5 | SSA phi read(self) | ssa.rb:12:5:12:14 | SSA read(self) | -| ssa.rb:19:9:19:9 | SSA phi read(self) | ssa.rb:18:1:23:3 | self (m1) | -| ssa.rb:19:9:19:9 | SSA phi read(self) | ssa.rb:20:5:20:10 | SSA read(self) | +| ssa.rb:19:3:22:5 | SSA phi read(self) | ssa.rb:18:1:23:3 | self (m1) | +| ssa.rb:19:3:22:5 | SSA phi read(self) | ssa.rb:20:5:20:10 | SSA read(self) | | ssa.rb:92:3:96:5 | SSA phi read(self) | ssa.rb:93:5:93:10 | SSA read(self) | | ssa.rb:92:3:96:5 | SSA phi read(self) | ssa.rb:94:3:95:10 | SSA phi read(self) | | ssa.rb:92:3:96:5 | SSA phi read(x) | ssa.rb:93:10:93:10 | SSA read(x) | From a293c9830aa1b023ba198ebf9e0bea2f1205fcaa Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Tue, 11 Aug 2026 14:02:38 +0200 Subject: [PATCH 0434/2098] Ruby: Accept remaining qltests. --- .../test/library-tests/ast/ValueText.expected | 31 +- .../controlflow/graph/BasicBlocks.expected | 11910 +++++++--------- .../controlflow/graph/Cfg.expected | 5098 ++++--- .../barrier-guards/barrier-guards.expected | 574 +- .../dataflow/local/DataflowStep.expected | 27 +- .../dataflow/local/TaintStep.expected | 26 +- .../test/library-tests/variables/ssa.expected | 4 + 7 files changed, 9051 insertions(+), 8619 deletions(-) diff --git a/ruby/ql/test/library-tests/ast/ValueText.expected b/ruby/ql/test/library-tests/ast/ValueText.expected index 42eab5f74d9e..d662062f6470 100644 --- a/ruby/ql/test/library-tests/ast/ValueText.expected +++ b/ruby/ql/test/library-tests/ast/ValueText.expected @@ -1130,13 +1130,24 @@ exprCfgNodeValue | control/cases.rb:46:12:46:12 | 3 | 3 | int | | control/cases.rb:47:6:47:6 | 1 | 1 | int | | control/cases.rb:47:13:47:13 | 3 | 3 | int | +| control/cases.rb:49:9:49:9 | 3 | 3 | int | +| control/cases.rb:49:12:49:12 | 4 | 4 | int | | control/cases.rb:50:9:50:9 | 3 | 3 | int | | control/cases.rb:51:10:51:10 | 3 | 3 | int | +| control/cases.rb:52:6:52:6 | :a | :a | symbol | +| control/cases.rb:53:6:53:6 | :a | :a | symbol | | control/cases.rb:53:9:53:9 | 5 | 5 | int | +| control/cases.rb:54:6:54:6 | :a | :a | symbol | | control/cases.rb:54:9:54:9 | 5 | 5 | int | +| control/cases.rb:55:6:55:6 | :a | :a | symbol | | control/cases.rb:55:9:55:9 | 5 | 5 | int | +| control/cases.rb:55:12:55:12 | :b | :b | symbol | +| control/cases.rb:56:6:56:6 | :a | :a | symbol | | control/cases.rb:56:9:56:9 | 5 | 5 | int | +| control/cases.rb:56:12:56:12 | :b | :b | symbol | +| control/cases.rb:57:6:57:6 | :a | :a | symbol | | control/cases.rb:57:9:57:9 | 5 | 5 | int | +| control/cases.rb:57:12:57:12 | :b | :b | symbol | | control/cases.rb:59:7:59:7 | 5 | 5 | int | | control/cases.rb:60:7:60:7 | 5 | 5 | int | | control/cases.rb:61:7:61:7 | 1 | 1 | int | @@ -1158,11 +1169,20 @@ exprCfgNodeValue | control/cases.rb:68:14:68:14 | 4 | 4 | int | | control/cases.rb:69:10:69:10 | 3 | 3 | int | | control/cases.rb:70:11:70:11 | 3 | 3 | int | +| control/cases.rb:71:7:71:7 | :a | :a | symbol | +| control/cases.rb:72:7:72:7 | :a | :a | symbol | | control/cases.rb:72:10:72:10 | 5 | 5 | int | +| control/cases.rb:73:7:73:7 | :a | :a | symbol | | control/cases.rb:73:10:73:10 | 5 | 5 | int | +| control/cases.rb:74:7:74:7 | :a | :a | symbol | | control/cases.rb:74:10:74:10 | 5 | 5 | int | +| control/cases.rb:74:13:74:13 | :b | :b | symbol | +| control/cases.rb:75:7:75:7 | :a | :a | symbol | | control/cases.rb:75:10:75:10 | 5 | 5 | int | +| control/cases.rb:75:13:75:13 | :b | :b | symbol | +| control/cases.rb:76:7:76:7 | :a | :a | symbol | | control/cases.rb:76:10:76:10 | 5 | 5 | int | +| control/cases.rb:76:13:76:13 | :b | :b | symbol | | control/cases.rb:84:7:84:8 | 42 | 42 | int | | control/cases.rb:87:6:87:6 | 5 | 5 | int | | control/cases.rb:88:7:88:9 | foo | 42 | int | @@ -1199,8 +1219,14 @@ exprCfgNodeValue | control/cases.rb:130:11:130:11 | 1 | 1 | int | | control/cases.rb:130:14:130:14 | 2 | 2 | int | | control/cases.rb:131:18:131:18 | 1 | 1 | int | +| control/cases.rb:139:7:139:7 | :x | :x | symbol | +| control/cases.rb:140:16:140:16 | :x | :x | symbol | | control/cases.rb:140:18:140:18 | 1 | 1 | int | +| control/cases.rb:141:16:141:16 | :x | :x | symbol | | control/cases.rb:141:18:141:18 | 1 | 1 | int | +| control/cases.rb:141:21:141:21 | :a | :a | symbol | +| control/cases.rb:142:11:142:11 | :y | :y | symbol | +| control/cases.rb:144:11:144:11 | :a | :a | symbol | | control/cases.rb:144:14:144:14 | 1 | 1 | int | | control/cases.rb:148:7:148:9 | foo | 42 | int | | control/cases.rb:155:8:155:10 | foo | 42 | int | @@ -1212,6 +1238,8 @@ exprCfgNodeValue | control/cases.rb:160:10:160:10 | 1 | 1 | int | | control/cases.rb:160:13:160:13 | 2 | 2 | int | | control/cases.rb:162:1:162:20 | nil | nil | nil | +| control/cases.rb:162:10:162:10 | :x | :x | symbol | +| control/cases.rb:162:16:162:16 | :y | :y | symbol | | control/cases.rb:162:19:162:19 | 1 | 1 | int | | control/cases.rb:165:3:165:5 | foo | 42 | int | | control/cases.rb:166:6:166:6 | 1 | 1 | int | @@ -1740,6 +1768,7 @@ exprCfgNodeValue | modules/modules.rb:55:8:55:30 | "module Foo::Bar again" | module Foo::Bar again | string | | modules/modules.rb:56:17:56:17 | 4 | 4 | int | | modules/toplevel.rb:1:6:1:12 | "world" | world | string | +| modules/toplevel.rb:3:12:3:16 | "!!!" | !!! | string | | modules/toplevel.rb:5:14:5:20 | "hello" | hello | string | | operations/operations.rb:3:5:3:5 | 0 | 0 | int | | operations/operations.rb:4:5:4:5 | 0 | 0 | int | @@ -1885,8 +1914,6 @@ exprCfgNodeValue | params/params.rb:47:32:47:32 | 3 | 3 | int | | params/params.rb:49:37:49:39 | 100 | 100 | int | | params/params.rb:53:44:53:44 | 3 | 3 | int | -| params/params.rb:58:46:58:46 | 0 | 0 | int | -| params/params.rb:58:56:58:58 | 100 | 100 | int | | params/params.rb:63:14:63:19 | "Zeus" | Zeus | string | | params/params.rb:65:41:65:42 | 99 | 99 | int | | params/params.rb:70:42:70:45 | 1000 | 1000 | int | diff --git a/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.expected b/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.expected index dd9e84f487a7..b4470adb57db 100644 --- a/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.expected +++ b/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.expected @@ -1,6546 +1,5386 @@ dominates -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:1:1:11:3 | enter m1 | -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:1:1:11:3 | exit m1 | -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:2:3:6:5 | while ... | -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:2:9:2:9 | x | -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:3:5:5:7 | if ... | -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:3:8:3:8 | x | -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:4:7:4:11 | break | -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:8:3:10:5 | if ... | -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:8:6:8:13 | [ensure: exception] self | -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:9:5:9:23 | [ensure: exception] self | -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:9:5:9:23 | self | -| break_ensure.rb:1:1:11:3 | exit m1 | break_ensure.rb:1:1:11:3 | exit m1 | -| break_ensure.rb:1:1:56:4 | enter break_ensure.rb | break_ensure.rb:1:1:56:4 | enter break_ensure.rb | -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:2:3:6:5 | while ... | -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:8:3:10:5 | if ... | -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:9:5:9:23 | self | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:1:1:11:3 | exit m1 | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:2:3:6:5 | while ... | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:2:9:2:9 | x | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:3:5:5:7 | if ... | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:3:8:3:8 | x | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:4:7:4:11 | break | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:8:3:10:5 | if ... | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:8:6:8:13 | [ensure: exception] self | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:9:5:9:23 | [ensure: exception] self | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:9:5:9:23 | self | -| break_ensure.rb:3:5:5:7 | if ... | break_ensure.rb:3:5:5:7 | if ... | -| break_ensure.rb:3:8:3:8 | x | break_ensure.rb:3:5:5:7 | if ... | -| break_ensure.rb:3:8:3:8 | x | break_ensure.rb:3:8:3:8 | x | -| break_ensure.rb:3:8:3:8 | x | break_ensure.rb:4:7:4:11 | break | -| break_ensure.rb:4:7:4:11 | break | break_ensure.rb:4:7:4:11 | break | -| break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | -| break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:8:3:10:5 | if ... | -| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | -| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:8:6:8:13 | [ensure: exception] self | -| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:9:5:9:23 | [ensure: exception] self | -| break_ensure.rb:9:5:9:23 | [ensure: exception] self | break_ensure.rb:9:5:9:23 | [ensure: exception] self | -| break_ensure.rb:9:5:9:23 | self | break_ensure.rb:9:5:9:23 | self | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:13:1:25:3 | enter m2 | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:14:3:24:5 | while ... | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:14:9:14:9 | x | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:16:7:18:9 | if ... | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:16:10:16:10 | x | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:17:9:17:13 | break | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:20:7:22:9 | if ... | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:20:10:20:10 | [ensure: exception] y | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:21:9:21:20 | [ensure: break] self | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:21:9:21:20 | [ensure: exception] self | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:21:9:21:20 | self | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:14:3:24:5 | while ... | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:14:3:24:5 | while ... | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:14:9:14:9 | x | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:16:7:18:9 | if ... | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:16:10:16:10 | x | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:17:9:17:13 | break | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | if ... | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:10:20:10 | [ensure: exception] y | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:21:9:21:20 | [ensure: break] self | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:21:9:21:20 | [ensure: exception] self | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:21:9:21:20 | self | -| break_ensure.rb:16:7:18:9 | if ... | break_ensure.rb:16:7:18:9 | if ... | -| break_ensure.rb:16:7:18:9 | if ... | break_ensure.rb:20:7:22:9 | if ... | -| break_ensure.rb:16:7:18:9 | if ... | break_ensure.rb:21:9:21:20 | self | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:16:7:18:9 | if ... | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:16:10:16:10 | x | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:17:9:17:13 | break | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:20:7:22:9 | if ... | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:20:10:20:10 | [ensure: exception] y | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:21:9:21:20 | [ensure: break] self | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:21:9:21:20 | [ensure: exception] self | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:21:9:21:20 | self | -| break_ensure.rb:17:9:17:13 | break | break_ensure.rb:17:9:17:13 | break | -| break_ensure.rb:17:9:17:13 | break | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | -| break_ensure.rb:17:9:17:13 | break | break_ensure.rb:21:9:21:20 | [ensure: break] self | -| break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | -| break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | -| break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:20:7:22:9 | if ... | -| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | -| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:20:10:20:10 | [ensure: exception] y | -| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:21:9:21:20 | [ensure: exception] self | -| break_ensure.rb:21:9:21:20 | [ensure: break] self | break_ensure.rb:21:9:21:20 | [ensure: break] self | -| break_ensure.rb:21:9:21:20 | [ensure: exception] self | break_ensure.rb:21:9:21:20 | [ensure: exception] self | -| break_ensure.rb:21:9:21:20 | self | break_ensure.rb:21:9:21:20 | self | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:27:1:42:3 | enter m3 | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:27:1:42:3 | exit m3 | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:27:1:42:3 | exit m3 (normal) | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:29:5:31:7 | if ... | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:30:7:30:12 | return | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:5:39:7 | while ... | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:11:33:11 | [ensure: exception] y | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:11:33:11 | [ensure: return] y | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:11:33:11 | y | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:9:37:11 | if ... | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:12:35:12 | [ensure: exception] x | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:12:35:12 | [ensure: return] x | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:12:35:12 | x | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:36:11:36:15 | [ensure: exception] break | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:36:11:36:15 | [ensure: return] break | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:36:11:36:15 | break | -| break_ensure.rb:27:1:42:3 | exit m3 | break_ensure.rb:27:1:42:3 | exit m3 | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:27:1:42:3 | exit m3 (normal) | -| break_ensure.rb:29:5:31:7 | if ... | break_ensure.rb:29:5:31:7 | if ... | -| break_ensure.rb:29:5:31:7 | if ... | break_ensure.rb:33:5:39:7 | while ... | -| break_ensure.rb:29:5:31:7 | if ... | break_ensure.rb:33:11:33:11 | y | -| break_ensure.rb:29:5:31:7 | if ... | break_ensure.rb:35:9:37:11 | if ... | -| break_ensure.rb:29:5:31:7 | if ... | break_ensure.rb:35:12:35:12 | x | -| break_ensure.rb:29:5:31:7 | if ... | break_ensure.rb:36:11:36:15 | break | -| break_ensure.rb:30:7:30:12 | return | break_ensure.rb:30:7:30:12 | return | -| break_ensure.rb:30:7:30:12 | return | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | -| break_ensure.rb:30:7:30:12 | return | break_ensure.rb:33:11:33:11 | [ensure: return] y | -| break_ensure.rb:30:7:30:12 | return | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | -| break_ensure.rb:30:7:30:12 | return | break_ensure.rb:35:12:35:12 | [ensure: return] x | -| break_ensure.rb:30:7:30:12 | return | break_ensure.rb:36:11:36:15 | [ensure: return] break | -| break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | -| break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | -| break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:33:5:39:7 | while ... | -| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | -| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:33:11:33:11 | [ensure: exception] y | -| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | -| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:35:12:35:12 | [ensure: exception] x | -| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:36:11:36:15 | [ensure: exception] break | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:33:11:33:11 | [ensure: return] y | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:35:12:35:12 | [ensure: return] x | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:36:11:36:15 | [ensure: return] break | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:33:5:39:7 | while ... | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:33:11:33:11 | y | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:35:9:37:11 | if ... | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:35:12:35:12 | x | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:36:11:36:15 | break | -| break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | -| break_ensure.rb:35:9:37:11 | [ensure: return] if ... | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | -| break_ensure.rb:35:9:37:11 | if ... | break_ensure.rb:35:9:37:11 | if ... | -| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | -| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:35:12:35:12 | [ensure: exception] x | -| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:36:11:36:15 | [ensure: exception] break | -| break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | -| break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:35:12:35:12 | [ensure: return] x | -| break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:36:11:36:15 | [ensure: return] break | -| break_ensure.rb:35:12:35:12 | x | break_ensure.rb:35:9:37:11 | if ... | -| break_ensure.rb:35:12:35:12 | x | break_ensure.rb:35:12:35:12 | x | -| break_ensure.rb:35:12:35:12 | x | break_ensure.rb:36:11:36:15 | break | -| break_ensure.rb:36:11:36:15 | [ensure: exception] break | break_ensure.rb:36:11:36:15 | [ensure: exception] break | -| break_ensure.rb:36:11:36:15 | [ensure: return] break | break_ensure.rb:36:11:36:15 | [ensure: return] break | -| break_ensure.rb:36:11:36:15 | break | break_ensure.rb:36:11:36:15 | break | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:44:1:56:3 | enter m4 | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:45:3:55:5 | while ... | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:45:9:45:9 | x | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:47:7:49:9 | if ... | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:47:10:47:10 | x | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:48:9:48:16 | self | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:51:7:53:9 | if ... | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:51:10:51:10 | [ensure: exception] x | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:52:15:52:16 | 10 | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:45:3:55:5 | while ... | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:45:3:55:5 | while ... | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:45:9:45:9 | x | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:47:7:49:9 | if ... | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:47:10:47:10 | x | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:48:9:48:16 | self | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:7:53:9 | if ... | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:10:51:10 | [ensure: exception] x | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:52:15:52:16 | 10 | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | -| break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:47:7:49:9 | if ... | -| break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:51:7:53:9 | if ... | -| break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:52:15:52:16 | 10 | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:47:7:49:9 | if ... | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:47:10:47:10 | x | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:48:9:48:16 | self | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:51:7:53:9 | if ... | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:51:10:51:10 | [ensure: exception] x | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:52:15:52:16 | 10 | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | -| break_ensure.rb:48:9:48:16 | self | break_ensure.rb:48:9:48:16 | self | -| break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | -| break_ensure.rb:51:7:53:9 | if ... | break_ensure.rb:51:7:53:9 | if ... | -| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | -| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:51:10:51:10 | [ensure: exception] x | -| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | -| break_ensure.rb:52:15:52:16 | 10 | break_ensure.rb:52:15:52:16 | 10 | -| break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:1:1:6:3 | enter if_in_case | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:2:3:5:5 | case ... | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:3:5:3:42 | [match] when ... | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:3:5:3:42 | [no-match] when ... | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:3:18:3:41 | if ... | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:3:21:3:22 | self | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:3:29:3:37 | self | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:4:5:4:24 | [match] when ... | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:4:5:4:24 | [no-match] when ... | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:4:10:4:10 | 2 | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:4:17:4:24 | self | -| case.rb:1:1:99:4 | enter case.rb | case.rb:1:1:99:4 | enter case.rb | -| case.rb:2:3:5:5 | case ... | case.rb:2:3:5:5 | case ... | -| case.rb:3:5:3:42 | [match] when ... | case.rb:3:5:3:42 | [match] when ... | -| case.rb:3:5:3:42 | [match] when ... | case.rb:3:18:3:41 | if ... | -| case.rb:3:5:3:42 | [match] when ... | case.rb:3:21:3:22 | self | -| case.rb:3:5:3:42 | [match] when ... | case.rb:3:29:3:37 | self | -| case.rb:3:5:3:42 | [no-match] when ... | case.rb:3:5:3:42 | [no-match] when ... | -| case.rb:3:5:3:42 | [no-match] when ... | case.rb:4:5:4:24 | [match] when ... | -| case.rb:3:5:3:42 | [no-match] when ... | case.rb:4:5:4:24 | [no-match] when ... | -| case.rb:3:5:3:42 | [no-match] when ... | case.rb:4:10:4:10 | 2 | -| case.rb:3:5:3:42 | [no-match] when ... | case.rb:4:17:4:24 | self | -| case.rb:3:18:3:41 | if ... | case.rb:3:18:3:41 | if ... | -| case.rb:3:21:3:22 | self | case.rb:3:18:3:41 | if ... | -| case.rb:3:21:3:22 | self | case.rb:3:21:3:22 | self | -| case.rb:3:21:3:22 | self | case.rb:3:29:3:37 | self | -| case.rb:3:29:3:37 | self | case.rb:3:29:3:37 | self | -| case.rb:4:5:4:24 | [match] when ... | case.rb:4:5:4:24 | [match] when ... | -| case.rb:4:5:4:24 | [match] when ... | case.rb:4:17:4:24 | self | -| case.rb:4:5:4:24 | [no-match] when ... | case.rb:4:5:4:24 | [no-match] when ... | -| case.rb:4:10:4:10 | 2 | case.rb:4:5:4:24 | [match] when ... | -| case.rb:4:10:4:10 | 2 | case.rb:4:5:4:24 | [no-match] when ... | -| case.rb:4:10:4:10 | 2 | case.rb:4:10:4:10 | 2 | -| case.rb:4:10:4:10 | 2 | case.rb:4:17:4:24 | self | -| case.rb:4:17:4:24 | self | case.rb:4:17:4:24 | self | -| case.rb:8:1:18:3 | enter case_match | case.rb:8:1:18:3 | enter case_match | -| case.rb:8:1:18:3 | enter case_match | case.rb:9:3:17:5 | case ... | -| case.rb:8:1:18:3 | enter case_match | case.rb:11:5:11:15 | in ... then ... | -| case.rb:8:1:18:3 | enter case_match | case.rb:11:15:11:15 | 3 | -| case.rb:8:1:18:3 | enter case_match | case.rb:12:5:13:7 | in ... then ... | -| case.rb:8:1:18:3 | enter case_match | case.rb:13:7:13:7 | 4 | -| case.rb:8:1:18:3 | enter case_match | case.rb:14:5:14:25 | in ... then ... | -| case.rb:8:1:18:3 | enter case_match | case.rb:14:13:14:13 | x | -| case.rb:8:1:18:3 | enter case_match | case.rb:14:25:14:25 | 6 | -| case.rb:8:1:18:3 | enter case_match | case.rb:15:5:15:28 | in ... then ... | -| case.rb:8:1:18:3 | enter case_match | case.rb:15:17:15:17 | x | -| case.rb:8:1:18:3 | enter case_match | case.rb:15:28:15:28 | 7 | -| case.rb:8:1:18:3 | enter case_match | case.rb:16:10:16:10 | 8 | -| case.rb:9:3:17:5 | case ... | case.rb:9:3:17:5 | case ... | -| case.rb:11:5:11:15 | in ... then ... | case.rb:11:5:11:15 | in ... then ... | -| case.rb:11:5:11:15 | in ... then ... | case.rb:11:15:11:15 | 3 | -| case.rb:11:5:11:15 | in ... then ... | case.rb:12:5:13:7 | in ... then ... | -| case.rb:11:5:11:15 | in ... then ... | case.rb:13:7:13:7 | 4 | -| case.rb:11:5:11:15 | in ... then ... | case.rb:14:5:14:25 | in ... then ... | -| case.rb:11:5:11:15 | in ... then ... | case.rb:14:13:14:13 | x | -| case.rb:11:5:11:15 | in ... then ... | case.rb:14:25:14:25 | 6 | -| case.rb:11:5:11:15 | in ... then ... | case.rb:15:5:15:28 | in ... then ... | -| case.rb:11:5:11:15 | in ... then ... | case.rb:15:17:15:17 | x | -| case.rb:11:5:11:15 | in ... then ... | case.rb:15:28:15:28 | 7 | -| case.rb:11:5:11:15 | in ... then ... | case.rb:16:10:16:10 | 8 | -| case.rb:11:15:11:15 | 3 | case.rb:11:15:11:15 | 3 | -| case.rb:12:5:13:7 | in ... then ... | case.rb:12:5:13:7 | in ... then ... | -| case.rb:12:5:13:7 | in ... then ... | case.rb:13:7:13:7 | 4 | -| case.rb:12:5:13:7 | in ... then ... | case.rb:14:5:14:25 | in ... then ... | -| case.rb:12:5:13:7 | in ... then ... | case.rb:14:13:14:13 | x | -| case.rb:12:5:13:7 | in ... then ... | case.rb:14:25:14:25 | 6 | -| case.rb:12:5:13:7 | in ... then ... | case.rb:15:5:15:28 | in ... then ... | -| case.rb:12:5:13:7 | in ... then ... | case.rb:15:17:15:17 | x | -| case.rb:12:5:13:7 | in ... then ... | case.rb:15:28:15:28 | 7 | -| case.rb:12:5:13:7 | in ... then ... | case.rb:16:10:16:10 | 8 | -| case.rb:13:7:13:7 | 4 | case.rb:13:7:13:7 | 4 | -| case.rb:14:5:14:25 | in ... then ... | case.rb:14:5:14:25 | in ... then ... | -| case.rb:14:5:14:25 | in ... then ... | case.rb:14:13:14:13 | x | -| case.rb:14:5:14:25 | in ... then ... | case.rb:14:25:14:25 | 6 | -| case.rb:14:5:14:25 | in ... then ... | case.rb:15:5:15:28 | in ... then ... | -| case.rb:14:5:14:25 | in ... then ... | case.rb:15:17:15:17 | x | -| case.rb:14:5:14:25 | in ... then ... | case.rb:15:28:15:28 | 7 | -| case.rb:14:5:14:25 | in ... then ... | case.rb:16:10:16:10 | 8 | -| case.rb:14:13:14:13 | x | case.rb:14:13:14:13 | x | -| case.rb:14:13:14:13 | x | case.rb:14:25:14:25 | 6 | -| case.rb:14:13:14:13 | x | case.rb:15:5:15:28 | in ... then ... | -| case.rb:14:13:14:13 | x | case.rb:15:17:15:17 | x | -| case.rb:14:13:14:13 | x | case.rb:15:28:15:28 | 7 | -| case.rb:14:13:14:13 | x | case.rb:16:10:16:10 | 8 | -| case.rb:14:25:14:25 | 6 | case.rb:14:25:14:25 | 6 | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:1:1:11:3 | Entry | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:1:1:11:3 | Exceptional Exit | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:1:1:11:3 | Exit | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:2:3:6:5 | After while ... | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:2:3:10:5 | After ... | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:2:9:2:13 | After ... < ... [false] | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:2:9:2:13 | After ... < ... [true] | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:3:8:3:12 | After ... > ... [false] | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:3:8:3:12 | After ... > ... [true] | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:7:1:10:5 | ensure ... | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:8:3:10:5 | After if ... | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:8:6:8:18 | After call to nil? [false] | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:8:6:8:18 | After call to nil? [true] | +| break_ensure.rb:1:1:11:3 | Exceptional Exit | break_ensure.rb:1:1:11:3 | Exceptional Exit | +| break_ensure.rb:1:1:11:3 | Exit | break_ensure.rb:1:1:11:3 | Exit | +| break_ensure.rb:1:1:56:4 | Entry | break_ensure.rb:1:1:56:4 | Entry | +| break_ensure.rb:2:3:6:5 | After while ... | break_ensure.rb:2:3:6:5 | After while ... | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:1:1:11:3 | Exceptional Exit | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:1:1:11:3 | Exit | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:2:3:6:5 | After while ... | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:2:3:10:5 | After ... | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:2:9:2:13 | After ... < ... [false] | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:2:9:2:13 | After ... < ... [true] | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:3:8:3:12 | After ... > ... [false] | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:3:8:3:12 | After ... > ... [true] | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:7:1:10:5 | ensure ... | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:8:3:10:5 | After if ... | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:8:6:8:18 | After call to nil? [false] | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:8:6:8:18 | After call to nil? [true] | +| break_ensure.rb:2:3:10:5 | After ... | break_ensure.rb:2:3:10:5 | After ... | +| break_ensure.rb:2:9:2:13 | After ... < ... [false] | break_ensure.rb:2:9:2:13 | After ... < ... [false] | +| break_ensure.rb:2:9:2:13 | After ... < ... [true] | break_ensure.rb:2:9:2:13 | After ... < ... [true] | +| break_ensure.rb:2:9:2:13 | After ... < ... [true] | break_ensure.rb:3:8:3:12 | After ... > ... [false] | +| break_ensure.rb:2:9:2:13 | After ... < ... [true] | break_ensure.rb:3:8:3:12 | After ... > ... [true] | +| break_ensure.rb:3:8:3:12 | After ... > ... [false] | break_ensure.rb:3:8:3:12 | After ... > ... [false] | +| break_ensure.rb:3:8:3:12 | After ... > ... [true] | break_ensure.rb:3:8:3:12 | After ... > ... [true] | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:1:1:11:3 | Exceptional Exit | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:1:1:11:3 | Exit | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:2:3:10:5 | After ... | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:7:1:10:5 | ensure ... | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:8:3:10:5 | After if ... | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:8:6:8:18 | After call to nil? [false] | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:8:6:8:18 | After call to nil? [true] | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:1:1:11:3 | Exceptional Exit | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:1:1:11:3 | Exit | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:2:3:10:5 | After ... | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:8:3:10:5 | After if ... | +| break_ensure.rb:8:6:8:18 | After call to nil? [false] | break_ensure.rb:8:6:8:18 | After call to nil? [false] | +| break_ensure.rb:8:6:8:18 | After call to nil? [true] | break_ensure.rb:8:6:8:18 | After call to nil? [true] | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:13:1:25:3 | Entry | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:13:1:25:3 | Exceptional Exit | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:13:1:25:3 | Exit | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:14:3:24:5 | After while ... | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:14:9:14:13 | After ... < ... [false] | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:14:9:14:13 | After ... < ... [true] | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:15:5:23:7 | After begin ... | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:16:10:16:14 | After ... > ... [false] | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:16:10:16:14 | After ... > ... [true] | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:19:5:22:9 | ensure ... | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:20:7:22:9 | After if ... | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:20:10:20:15 | After call to nil? [false] | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:20:10:20:15 | After call to nil? [true] | +| break_ensure.rb:13:1:25:3 | Exceptional Exit | break_ensure.rb:13:1:25:3 | Exceptional Exit | +| break_ensure.rb:13:1:25:3 | Exit | break_ensure.rb:13:1:25:3 | Exit | +| break_ensure.rb:14:3:24:5 | After while ... | break_ensure.rb:14:3:24:5 | After while ... | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:13:1:25:3 | Exceptional Exit | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:13:1:25:3 | Exit | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:14:3:24:5 | After while ... | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:14:9:14:13 | After ... < ... [false] | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:14:9:14:13 | After ... < ... [true] | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:15:5:23:7 | After begin ... | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:16:10:16:14 | After ... > ... [false] | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:16:10:16:14 | After ... > ... [true] | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:19:5:22:9 | ensure ... | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:20:7:22:9 | After if ... | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:20:10:20:15 | After call to nil? [false] | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:20:10:20:15 | After call to nil? [true] | +| break_ensure.rb:14:9:14:13 | After ... < ... [false] | break_ensure.rb:14:9:14:13 | After ... < ... [false] | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:13:1:25:3 | Exceptional Exit | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:14:9:14:13 | After ... < ... [true] | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:15:5:23:7 | After begin ... | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:16:10:16:14 | After ... > ... [false] | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:16:10:16:14 | After ... > ... [true] | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:19:5:22:9 | ensure ... | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:20:7:22:9 | After if ... | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:20:10:20:15 | After call to nil? [false] | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:20:10:20:15 | After call to nil? [true] | +| break_ensure.rb:15:5:23:7 | After begin ... | break_ensure.rb:15:5:23:7 | After begin ... | +| break_ensure.rb:16:10:16:14 | After ... > ... [false] | break_ensure.rb:16:10:16:14 | After ... > ... [false] | +| break_ensure.rb:16:10:16:14 | After ... > ... [true] | break_ensure.rb:16:10:16:14 | After ... > ... [true] | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:13:1:25:3 | Exceptional Exit | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:15:5:23:7 | After begin ... | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:19:5:22:9 | ensure ... | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:20:7:22:9 | After if ... | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:20:10:20:15 | After call to nil? [false] | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:20:10:20:15 | After call to nil? [true] | +| break_ensure.rb:20:7:22:9 | After if ... | break_ensure.rb:13:1:25:3 | Exceptional Exit | +| break_ensure.rb:20:7:22:9 | After if ... | break_ensure.rb:15:5:23:7 | After begin ... | +| break_ensure.rb:20:7:22:9 | After if ... | break_ensure.rb:20:7:22:9 | After if ... | +| break_ensure.rb:20:10:20:15 | After call to nil? [false] | break_ensure.rb:20:10:20:15 | After call to nil? [false] | +| break_ensure.rb:20:10:20:15 | After call to nil? [true] | break_ensure.rb:20:10:20:15 | After call to nil? [true] | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:27:1:42:3 | Entry | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:27:1:42:3 | Exceptional Exit | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:27:1:42:3 | Exit | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:27:1:42:3 | Normal Exit | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:28:3:40:5 | After begin ... | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:29:8:29:13 | After call to nil? [false] | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:29:8:29:13 | After call to nil? [true] | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:32:3:39:7 | ensure ... | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:33:5:39:7 | After while ... | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:33:11:33:15 | After ... < ... [false] | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:33:11:33:15 | After ... < ... [true] | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:35:12:35:16 | After ... > ... [false] | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:35:12:35:16 | After ... > ... [true] | +| break_ensure.rb:27:1:42:3 | Exceptional Exit | break_ensure.rb:27:1:42:3 | Exceptional Exit | +| break_ensure.rb:27:1:42:3 | Exit | break_ensure.rb:27:1:42:3 | Exit | +| break_ensure.rb:27:1:42:3 | Normal Exit | break_ensure.rb:27:1:42:3 | Normal Exit | +| break_ensure.rb:28:3:40:5 | After begin ... | break_ensure.rb:28:3:40:5 | After begin ... | +| break_ensure.rb:29:8:29:13 | After call to nil? [false] | break_ensure.rb:29:8:29:13 | After call to nil? [false] | +| break_ensure.rb:29:8:29:13 | After call to nil? [true] | break_ensure.rb:29:8:29:13 | After call to nil? [true] | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:27:1:42:3 | Exceptional Exit | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:27:1:42:3 | Exit | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:27:1:42:3 | Normal Exit | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:28:3:40:5 | After begin ... | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:32:3:39:7 | ensure ... | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:33:5:39:7 | After while ... | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:33:11:33:15 | After ... < ... [false] | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:33:11:33:15 | After ... < ... [true] | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:35:12:35:16 | After ... > ... [false] | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:35:12:35:16 | After ... > ... [true] | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:27:1:42:3 | Exceptional Exit | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:27:1:42:3 | Exit | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:27:1:42:3 | Normal Exit | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:28:3:40:5 | After begin ... | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:33:5:39:7 | After while ... | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:27:1:42:3 | Exceptional Exit | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:27:1:42:3 | Exit | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:27:1:42:3 | Normal Exit | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:28:3:40:5 | After begin ... | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:33:5:39:7 | After while ... | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:33:11:33:15 | After ... < ... [false] | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:33:11:33:15 | After ... < ... [true] | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:35:12:35:16 | After ... > ... [false] | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:35:12:35:16 | After ... > ... [true] | +| break_ensure.rb:33:11:33:15 | After ... < ... [false] | break_ensure.rb:33:11:33:15 | After ... < ... [false] | +| break_ensure.rb:33:11:33:15 | After ... < ... [true] | break_ensure.rb:33:11:33:15 | After ... < ... [true] | +| break_ensure.rb:33:11:33:15 | After ... < ... [true] | break_ensure.rb:35:12:35:16 | After ... > ... [false] | +| break_ensure.rb:33:11:33:15 | After ... < ... [true] | break_ensure.rb:35:12:35:16 | After ... > ... [true] | +| break_ensure.rb:35:12:35:16 | After ... > ... [false] | break_ensure.rb:35:12:35:16 | After ... > ... [false] | +| break_ensure.rb:35:12:35:16 | After ... > ... [true] | break_ensure.rb:35:12:35:16 | After ... > ... [true] | +| break_ensure.rb:44:1:56:3 | Entry | break_ensure.rb:44:1:56:3 | Entry | +| break_ensure.rb:44:1:56:3 | Entry | break_ensure.rb:44:1:56:3 | Exceptional Exit | +| break_ensure.rb:44:1:56:3 | Entry | break_ensure.rb:44:1:56:3 | Exit | +| break_ensure.rb:44:1:56:3 | Entry | break_ensure.rb:45:3:55:5 | After while ... | +| break_ensure.rb:44:1:56:3 | Entry | break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | +| break_ensure.rb:44:1:56:3 | Entry | break_ensure.rb:45:9:45:13 | After ... < ... [false] | +| break_ensure.rb:44:1:56:3 | Entry | break_ensure.rb:45:9:45:13 | After ... < ... [true] | +| break_ensure.rb:44:1:56:3 | Entry | break_ensure.rb:46:5:54:7 | After begin ... | +| break_ensure.rb:44:1:56:3 | Entry | break_ensure.rb:47:10:47:14 | After ... > ... [false] | +| break_ensure.rb:44:1:56:3 | Entry | break_ensure.rb:47:10:47:14 | After ... > ... [true] | +| break_ensure.rb:44:1:56:3 | Entry | break_ensure.rb:50:5:53:9 | ensure ... | +| break_ensure.rb:44:1:56:3 | Entry | break_ensure.rb:51:10:51:14 | After ... > ... [false] | +| break_ensure.rb:44:1:56:3 | Entry | break_ensure.rb:51:10:51:14 | After ... > ... [true] | +| break_ensure.rb:44:1:56:3 | Exceptional Exit | break_ensure.rb:44:1:56:3 | Exceptional Exit | +| break_ensure.rb:44:1:56:3 | Exit | break_ensure.rb:44:1:56:3 | Exit | +| break_ensure.rb:45:3:55:5 | After while ... | break_ensure.rb:45:3:55:5 | After while ... | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:44:1:56:3 | Exceptional Exit | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:44:1:56:3 | Exit | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:45:3:55:5 | After while ... | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:45:9:45:13 | After ... < ... [false] | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:45:9:45:13 | After ... < ... [true] | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:46:5:54:7 | After begin ... | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:47:10:47:14 | After ... > ... [false] | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:47:10:47:14 | After ... > ... [true] | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:50:5:53:9 | ensure ... | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:51:10:51:14 | After ... > ... [false] | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:51:10:51:14 | After ... > ... [true] | +| break_ensure.rb:45:9:45:13 | After ... < ... [false] | break_ensure.rb:45:9:45:13 | After ... < ... [false] | +| break_ensure.rb:45:9:45:13 | After ... < ... [true] | break_ensure.rb:44:1:56:3 | Exceptional Exit | +| break_ensure.rb:45:9:45:13 | After ... < ... [true] | break_ensure.rb:45:9:45:13 | After ... < ... [true] | +| break_ensure.rb:45:9:45:13 | After ... < ... [true] | break_ensure.rb:46:5:54:7 | After begin ... | +| break_ensure.rb:45:9:45:13 | After ... < ... [true] | break_ensure.rb:47:10:47:14 | After ... > ... [false] | +| break_ensure.rb:45:9:45:13 | After ... < ... [true] | break_ensure.rb:47:10:47:14 | After ... > ... [true] | +| break_ensure.rb:45:9:45:13 | After ... < ... [true] | break_ensure.rb:50:5:53:9 | ensure ... | +| break_ensure.rb:45:9:45:13 | After ... < ... [true] | break_ensure.rb:51:10:51:14 | After ... > ... [false] | +| break_ensure.rb:45:9:45:13 | After ... < ... [true] | break_ensure.rb:51:10:51:14 | After ... > ... [true] | +| break_ensure.rb:46:5:54:7 | After begin ... | break_ensure.rb:46:5:54:7 | After begin ... | +| break_ensure.rb:47:10:47:14 | After ... > ... [false] | break_ensure.rb:47:10:47:14 | After ... > ... [false] | +| break_ensure.rb:47:10:47:14 | After ... > ... [true] | break_ensure.rb:47:10:47:14 | After ... > ... [true] | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:44:1:56:3 | Exceptional Exit | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:46:5:54:7 | After begin ... | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:50:5:53:9 | ensure ... | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:51:10:51:14 | After ... > ... [false] | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:51:10:51:14 | After ... > ... [true] | +| break_ensure.rb:51:10:51:14 | After ... > ... [false] | break_ensure.rb:44:1:56:3 | Exceptional Exit | +| break_ensure.rb:51:10:51:14 | After ... > ... [false] | break_ensure.rb:46:5:54:7 | After begin ... | +| break_ensure.rb:51:10:51:14 | After ... > ... [false] | break_ensure.rb:51:10:51:14 | After ... > ... [false] | +| break_ensure.rb:51:10:51:14 | After ... > ... [true] | break_ensure.rb:51:10:51:14 | After ... > ... [true] | +| case.rb:1:1:6:3 | Entry | case.rb:1:1:6:3 | Entry | +| case.rb:1:1:6:3 | Entry | case.rb:2:3:5:5 | After case ... | +| case.rb:1:1:6:3 | Entry | case.rb:3:10:3:10 | After 1 [match] | +| case.rb:1:1:6:3 | Entry | case.rb:3:10:3:10 | After 1 [no-match] | +| case.rb:1:1:6:3 | Entry | case.rb:3:18:3:41 | After if ... | +| case.rb:1:1:6:3 | Entry | case.rb:3:21:3:22 | After call to x2 [false] | +| case.rb:1:1:6:3 | Entry | case.rb:3:21:3:22 | After call to x2 [true] | +| case.rb:1:1:6:3 | Entry | case.rb:4:10:4:10 | After 2 [match] | +| case.rb:1:1:6:3 | Entry | case.rb:4:10:4:10 | After 2 [no-match] | +| case.rb:1:1:99:4 | Entry | case.rb:1:1:99:4 | Entry | +| case.rb:2:3:5:5 | After case ... | case.rb:2:3:5:5 | After case ... | +| case.rb:3:10:3:10 | After 1 [match] | case.rb:3:10:3:10 | After 1 [match] | +| case.rb:3:10:3:10 | After 1 [match] | case.rb:3:18:3:41 | After if ... | +| case.rb:3:10:3:10 | After 1 [match] | case.rb:3:21:3:22 | After call to x2 [false] | +| case.rb:3:10:3:10 | After 1 [match] | case.rb:3:21:3:22 | After call to x2 [true] | +| case.rb:3:10:3:10 | After 1 [no-match] | case.rb:3:10:3:10 | After 1 [no-match] | +| case.rb:3:10:3:10 | After 1 [no-match] | case.rb:4:10:4:10 | After 2 [match] | +| case.rb:3:10:3:10 | After 1 [no-match] | case.rb:4:10:4:10 | After 2 [no-match] | +| case.rb:3:18:3:41 | After if ... | case.rb:3:18:3:41 | After if ... | +| case.rb:3:21:3:22 | After call to x2 [false] | case.rb:3:21:3:22 | After call to x2 [false] | +| case.rb:3:21:3:22 | After call to x2 [true] | case.rb:3:21:3:22 | After call to x2 [true] | +| case.rb:4:10:4:10 | After 2 [match] | case.rb:4:10:4:10 | After 2 [match] | +| case.rb:4:10:4:10 | After 2 [no-match] | case.rb:4:10:4:10 | After 2 [no-match] | +| case.rb:8:1:18:3 | Entry | case.rb:8:1:18:3 | Entry | +| case.rb:8:1:18:3 | Entry | case.rb:9:3:17:5 | After case ... | +| case.rb:8:1:18:3 | Entry | case.rb:10:8:10:8 | After 0 [match] | +| case.rb:8:1:18:3 | Entry | case.rb:10:8:10:8 | After 0 [no-match] | +| case.rb:8:1:18:3 | Entry | case.rb:11:8:11:8 | After 1 [match] | +| case.rb:8:1:18:3 | Entry | case.rb:11:8:11:8 | After 1 [no-match] | +| case.rb:8:1:18:3 | Entry | case.rb:12:8:12:8 | After 2 [match] | +| case.rb:8:1:18:3 | Entry | case.rb:12:8:12:8 | After 2 [no-match] | +| case.rb:8:1:18:3 | Entry | case.rb:14:8:14:8 | After x [match] | +| case.rb:8:1:18:3 | Entry | case.rb:14:8:14:8 | After x [no-match] | +| case.rb:8:1:18:3 | Entry | case.rb:14:13:14:18 | After ... == ... [false] | +| case.rb:8:1:18:3 | Entry | case.rb:14:13:14:18 | After ... == ... [true] | +| case.rb:8:1:18:3 | Entry | case.rb:15:5:15:28 | in ... then ... | +| case.rb:8:1:18:3 | Entry | case.rb:15:8:15:8 | After x [match] | +| case.rb:8:1:18:3 | Entry | case.rb:15:8:15:8 | After x [no-match] | +| case.rb:8:1:18:3 | Entry | case.rb:15:17:15:21 | After ... < ... [false] | +| case.rb:8:1:18:3 | Entry | case.rb:15:17:15:21 | After ... < ... [true] | +| case.rb:8:1:18:3 | Entry | case.rb:16:5:16:10 | else ... | +| case.rb:9:3:17:5 | After case ... | case.rb:9:3:17:5 | After case ... | +| case.rb:10:8:10:8 | After 0 [match] | case.rb:10:8:10:8 | After 0 [match] | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:10:8:10:8 | After 0 [no-match] | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:11:8:11:8 | After 1 [match] | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:11:8:11:8 | After 1 [no-match] | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:12:8:12:8 | After 2 [match] | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:12:8:12:8 | After 2 [no-match] | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:14:8:14:8 | After x [match] | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:14:8:14:8 | After x [no-match] | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:14:13:14:18 | After ... == ... [false] | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:14:13:14:18 | After ... == ... [true] | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:15:5:15:28 | in ... then ... | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:15:8:15:8 | After x [match] | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:15:8:15:8 | After x [no-match] | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:15:17:15:21 | After ... < ... [false] | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:15:17:15:21 | After ... < ... [true] | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:16:5:16:10 | else ... | +| case.rb:11:8:11:8 | After 1 [match] | case.rb:11:8:11:8 | After 1 [match] | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:11:8:11:8 | After 1 [no-match] | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:12:8:12:8 | After 2 [match] | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:12:8:12:8 | After 2 [no-match] | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:14:8:14:8 | After x [match] | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:14:8:14:8 | After x [no-match] | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:14:13:14:18 | After ... == ... [false] | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:14:13:14:18 | After ... == ... [true] | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:15:5:15:28 | in ... then ... | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:15:8:15:8 | After x [match] | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:15:8:15:8 | After x [no-match] | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:15:17:15:21 | After ... < ... [false] | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:15:17:15:21 | After ... < ... [true] | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:16:5:16:10 | else ... | +| case.rb:12:8:12:8 | After 2 [match] | case.rb:12:8:12:8 | After 2 [match] | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:12:8:12:8 | After 2 [no-match] | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:14:8:14:8 | After x [match] | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:14:8:14:8 | After x [no-match] | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:14:13:14:18 | After ... == ... [false] | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:14:13:14:18 | After ... == ... [true] | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:15:5:15:28 | in ... then ... | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:15:8:15:8 | After x [match] | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:15:8:15:8 | After x [no-match] | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:15:17:15:21 | After ... < ... [false] | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:15:17:15:21 | After ... < ... [true] | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:16:5:16:10 | else ... | +| case.rb:14:8:14:8 | After x [match] | case.rb:14:8:14:8 | After x [match] | +| case.rb:14:8:14:8 | After x [match] | case.rb:14:13:14:18 | After ... == ... [false] | +| case.rb:14:8:14:8 | After x [match] | case.rb:14:13:14:18 | After ... == ... [true] | +| case.rb:14:8:14:8 | After x [no-match] | case.rb:14:8:14:8 | After x [no-match] | +| case.rb:14:13:14:18 | After ... == ... [false] | case.rb:14:13:14:18 | After ... == ... [false] | +| case.rb:14:13:14:18 | After ... == ... [true] | case.rb:14:13:14:18 | After ... == ... [true] | | case.rb:15:5:15:28 | in ... then ... | case.rb:15:5:15:28 | in ... then ... | -| case.rb:15:5:15:28 | in ... then ... | case.rb:15:17:15:17 | x | -| case.rb:15:5:15:28 | in ... then ... | case.rb:15:28:15:28 | 7 | -| case.rb:15:5:15:28 | in ... then ... | case.rb:16:10:16:10 | 8 | -| case.rb:15:17:15:17 | x | case.rb:15:17:15:17 | x | -| case.rb:15:17:15:17 | x | case.rb:15:28:15:28 | 7 | -| case.rb:15:17:15:17 | x | case.rb:16:10:16:10 | 8 | -| case.rb:15:28:15:28 | 7 | case.rb:15:28:15:28 | 7 | -| case.rb:16:10:16:10 | 8 | case.rb:16:10:16:10 | 8 | -| case.rb:20:1:24:3 | enter case_match_no_match | case.rb:20:1:24:3 | enter case_match_no_match | -| case.rb:20:1:24:3 | enter case_match_no_match | case.rb:20:1:24:3 | exit case_match_no_match | -| case.rb:20:1:24:3 | enter case_match_no_match | case.rb:20:1:24:3 | exit case_match_no_match (abnormal) | -| case.rb:20:1:24:3 | enter case_match_no_match | case.rb:21:3:23:5 | case ... | -| case.rb:20:1:24:3 | exit case_match_no_match | case.rb:20:1:24:3 | exit case_match_no_match | -| case.rb:20:1:24:3 | exit case_match_no_match (abnormal) | case.rb:20:1:24:3 | exit case_match_no_match (abnormal) | -| case.rb:21:3:23:5 | case ... | case.rb:21:3:23:5 | case ... | -| case.rb:26:1:30:3 | enter case_match_raise | case.rb:26:1:30:3 | enter case_match_raise | -| case.rb:26:1:30:3 | enter case_match_raise | case.rb:26:1:30:3 | exit case_match_raise | -| case.rb:26:1:30:3 | enter case_match_raise | case.rb:26:1:30:3 | exit case_match_raise (abnormal) | -| case.rb:26:1:30:3 | enter case_match_raise | case.rb:27:3:29:5 | case ... | -| case.rb:26:1:30:3 | exit case_match_raise | case.rb:26:1:30:3 | exit case_match_raise | -| case.rb:26:1:30:3 | exit case_match_raise (abnormal) | case.rb:26:1:30:3 | exit case_match_raise (abnormal) | -| case.rb:27:3:29:5 | case ... | case.rb:27:3:29:5 | case ... | -| case.rb:28:7:28:28 | enter -> { ... } | case.rb:28:7:28:28 | enter -> { ... } | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:32:1:39:3 | enter case_match_array | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:32:1:39:3 | exit case_match_array | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:32:1:39:3 | exit case_match_array (abnormal) | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:33:3:38:5 | case ... | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:35:5:35:11 | in ... then ... | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:35:9:35:9 | x | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:36:5:36:13 | in ... then ... | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:36:9:36:9 | x | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:37:5:37:27 | in ... then ... | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:37:8:37:26 | [ ..., * ] | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:37:12:37:12 | a | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:37:15:37:15 | b | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:37:19:37:19 | c | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:37:25:37:25 | e | -| case.rb:32:1:39:3 | exit case_match_array | case.rb:32:1:39:3 | exit case_match_array | -| case.rb:32:1:39:3 | exit case_match_array (abnormal) | case.rb:32:1:39:3 | exit case_match_array (abnormal) | -| case.rb:33:3:38:5 | case ... | case.rb:33:3:38:5 | case ... | -| case.rb:35:5:35:11 | in ... then ... | case.rb:32:1:39:3 | exit case_match_array (abnormal) | -| case.rb:35:5:35:11 | in ... then ... | case.rb:35:5:35:11 | in ... then ... | -| case.rb:35:5:35:11 | in ... then ... | case.rb:35:9:35:9 | x | -| case.rb:35:5:35:11 | in ... then ... | case.rb:36:5:36:13 | in ... then ... | -| case.rb:35:5:35:11 | in ... then ... | case.rb:36:9:36:9 | x | -| case.rb:35:5:35:11 | in ... then ... | case.rb:37:5:37:27 | in ... then ... | -| case.rb:35:5:35:11 | in ... then ... | case.rb:37:8:37:26 | [ ..., * ] | -| case.rb:35:5:35:11 | in ... then ... | case.rb:37:12:37:12 | a | -| case.rb:35:5:35:11 | in ... then ... | case.rb:37:15:37:15 | b | -| case.rb:35:5:35:11 | in ... then ... | case.rb:37:19:37:19 | c | -| case.rb:35:5:35:11 | in ... then ... | case.rb:37:25:37:25 | e | -| case.rb:35:9:35:9 | x | case.rb:35:9:35:9 | x | -| case.rb:36:5:36:13 | in ... then ... | case.rb:32:1:39:3 | exit case_match_array (abnormal) | -| case.rb:36:5:36:13 | in ... then ... | case.rb:36:5:36:13 | in ... then ... | -| case.rb:36:5:36:13 | in ... then ... | case.rb:36:9:36:9 | x | -| case.rb:36:5:36:13 | in ... then ... | case.rb:37:5:37:27 | in ... then ... | -| case.rb:36:5:36:13 | in ... then ... | case.rb:37:8:37:26 | [ ..., * ] | -| case.rb:36:5:36:13 | in ... then ... | case.rb:37:12:37:12 | a | -| case.rb:36:5:36:13 | in ... then ... | case.rb:37:15:37:15 | b | -| case.rb:36:5:36:13 | in ... then ... | case.rb:37:19:37:19 | c | -| case.rb:36:5:36:13 | in ... then ... | case.rb:37:25:37:25 | e | -| case.rb:36:9:36:9 | x | case.rb:36:9:36:9 | x | -| case.rb:37:5:37:27 | in ... then ... | case.rb:32:1:39:3 | exit case_match_array (abnormal) | -| case.rb:37:5:37:27 | in ... then ... | case.rb:37:5:37:27 | in ... then ... | -| case.rb:37:5:37:27 | in ... then ... | case.rb:37:8:37:26 | [ ..., * ] | -| case.rb:37:5:37:27 | in ... then ... | case.rb:37:12:37:12 | a | -| case.rb:37:5:37:27 | in ... then ... | case.rb:37:15:37:15 | b | -| case.rb:37:5:37:27 | in ... then ... | case.rb:37:19:37:19 | c | -| case.rb:37:5:37:27 | in ... then ... | case.rb:37:25:37:25 | e | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:8:37:26 | [ ..., * ] | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:12:37:12 | a | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:15:37:15 | b | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:19:37:19 | c | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:25:37:25 | e | -| case.rb:37:12:37:12 | a | case.rb:37:12:37:12 | a | -| case.rb:37:12:37:12 | a | case.rb:37:15:37:15 | b | -| case.rb:37:12:37:12 | a | case.rb:37:19:37:19 | c | -| case.rb:37:12:37:12 | a | case.rb:37:25:37:25 | e | -| case.rb:37:15:37:15 | b | case.rb:37:15:37:15 | b | -| case.rb:37:15:37:15 | b | case.rb:37:19:37:19 | c | -| case.rb:37:15:37:15 | b | case.rb:37:25:37:25 | e | -| case.rb:37:19:37:19 | c | case.rb:37:19:37:19 | c | -| case.rb:37:19:37:19 | c | case.rb:37:25:37:25 | e | -| case.rb:37:25:37:25 | e | case.rb:37:25:37:25 | e | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:41:1:45:3 | enter case_match_find | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:41:1:45:3 | exit case_match_find | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:41:1:45:3 | exit case_match_find (abnormal) | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:43:10:43:10 | x | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:43:16:43:16 | 2 | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:43:20:43:20 | y | -| case.rb:41:1:45:3 | exit case_match_find | case.rb:41:1:45:3 | exit case_match_find | -| case.rb:41:1:45:3 | exit case_match_find (abnormal) | case.rb:41:1:45:3 | exit case_match_find (abnormal) | -| case.rb:43:10:43:10 | x | case.rb:43:10:43:10 | x | -| case.rb:43:10:43:10 | x | case.rb:43:16:43:16 | 2 | -| case.rb:43:10:43:10 | x | case.rb:43:20:43:20 | y | -| case.rb:43:16:43:16 | 2 | case.rb:43:16:43:16 | 2 | -| case.rb:43:16:43:16 | 2 | case.rb:43:20:43:20 | y | -| case.rb:43:20:43:20 | y | case.rb:43:20:43:20 | y | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:47:1:53:3 | enter case_match_hash | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:47:1:53:3 | exit case_match_hash | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:48:3:52:5 | case ... | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:49:8:49:34 | { ..., ** } | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:49:20:49:20 | 1 | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:49:23:49:23 | a | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:49:29:49:32 | rest | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:50:5:50:25 | in ... then ... | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:50:8:50:24 | { ..., ** } | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:50:16:50:16 | 1 | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:51:5:51:17 | in ... then ... | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:51:8:51:16 | { ..., ** } | -| case.rb:47:1:53:3 | exit case_match_hash | case.rb:47:1:53:3 | exit case_match_hash | -| case.rb:47:1:53:3 | exit case_match_hash (abnormal) | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | -| case.rb:48:3:52:5 | case ... | case.rb:48:3:52:5 | case ... | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:8:49:34 | { ..., ** } | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:20:49:20 | 1 | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:23:49:23 | a | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:29:49:32 | rest | -| case.rb:49:20:49:20 | 1 | case.rb:49:20:49:20 | 1 | -| case.rb:49:20:49:20 | 1 | case.rb:49:23:49:23 | a | -| case.rb:49:20:49:20 | 1 | case.rb:49:29:49:32 | rest | -| case.rb:49:23:49:23 | a | case.rb:49:23:49:23 | a | -| case.rb:49:23:49:23 | a | case.rb:49:29:49:32 | rest | -| case.rb:49:29:49:32 | rest | case.rb:49:29:49:32 | rest | -| case.rb:50:5:50:25 | in ... then ... | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | -| case.rb:50:5:50:25 | in ... then ... | case.rb:50:5:50:25 | in ... then ... | -| case.rb:50:5:50:25 | in ... then ... | case.rb:50:8:50:24 | { ..., ** } | -| case.rb:50:5:50:25 | in ... then ... | case.rb:50:16:50:16 | 1 | -| case.rb:50:5:50:25 | in ... then ... | case.rb:51:5:51:17 | in ... then ... | -| case.rb:50:5:50:25 | in ... then ... | case.rb:51:8:51:16 | { ..., ** } | -| case.rb:50:8:50:24 | { ..., ** } | case.rb:50:8:50:24 | { ..., ** } | -| case.rb:50:8:50:24 | { ..., ** } | case.rb:50:16:50:16 | 1 | -| case.rb:50:16:50:16 | 1 | case.rb:50:16:50:16 | 1 | -| case.rb:51:5:51:17 | in ... then ... | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | -| case.rb:51:5:51:17 | in ... then ... | case.rb:51:5:51:17 | in ... then ... | -| case.rb:51:5:51:17 | in ... then ... | case.rb:51:8:51:16 | { ..., ** } | -| case.rb:51:8:51:16 | { ..., ** } | case.rb:51:8:51:16 | { ..., ** } | -| case.rb:55:1:61:3 | enter case_match_variable | case.rb:55:1:61:3 | enter case_match_variable | -| case.rb:55:1:61:3 | enter case_match_variable | case.rb:56:3:60:5 | case ... | -| case.rb:55:1:61:3 | enter case_match_variable | case.rb:58:5:58:10 | in ... then ... | -| case.rb:56:3:60:5 | case ... | case.rb:56:3:60:5 | case ... | -| case.rb:58:5:58:10 | in ... then ... | case.rb:58:5:58:10 | in ... then ... | -| case.rb:63:1:67:3 | enter case_match_underscore | case.rb:63:1:67:3 | enter case_match_underscore | -| case.rb:63:1:67:3 | enter case_match_underscore | case.rb:64:3:66:5 | case ... | -| case.rb:63:1:67:3 | enter case_match_underscore | case.rb:65:12:65:12 | _ | -| case.rb:64:3:66:5 | case ... | case.rb:64:3:66:5 | case ... | -| case.rb:65:12:65:12 | _ | case.rb:65:12:65:12 | _ | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:69:1:93:3 | enter case_match_various | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:69:1:93:3 | exit case_match_various | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:72:3:92:5 | case ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:74:5:74:11 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:75:5:75:15 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:76:5:76:18 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:77:5:77:18 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:78:5:78:19 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:79:5:79:14 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:80:5:80:12 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:81:5:81:11 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:82:5:82:20 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:82:13:82:13 | x | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:82:20:82:20 | 1 | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:83:5:83:26 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:83:12:83:15 | ^... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:83:20:83:25 | string | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:84:5:84:17 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:85:5:85:23 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:86:5:86:11 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:87:5:87:17 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:88:5:88:15 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:88:14:88:15 | 10 | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:89:5:89:69 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:89:14:89:17 | self | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:89:21:89:24 | true | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:89:28:89:32 | false | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:89:36:89:43 | __LINE__ | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:89:47:89:54 | __FILE__ | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:90:5:90:13 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:91:5:91:25 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:91:13:91:14 | "" | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:69:1:93:3 | exit case_match_various | case.rb:69:1:93:3 | exit case_match_various | -| case.rb:69:1:93:3 | exit case_match_various (abnormal) | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:72:3:92:5 | case ... | case.rb:72:3:92:5 | case ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:74:5:74:11 | in ... then ... | case.rb:74:5:74:11 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:75:5:75:15 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:76:5:76:18 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:77:5:77:18 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:78:5:78:19 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:79:5:79:14 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:82:13:82:13 | x | -| case.rb:74:5:74:11 | in ... then ... | case.rb:82:20:82:20 | 1 | -| case.rb:74:5:74:11 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:83:12:83:15 | ^... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:83:20:83:25 | string | -| case.rb:74:5:74:11 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:74:5:74:11 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:74:5:74:11 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:74:5:74:11 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:74:5:74:11 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:74:5:74:11 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:74:5:74:11 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:74:5:74:11 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:74:5:74:11 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:74:5:74:11 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:75:5:75:15 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:75:5:75:15 | in ... then ... | case.rb:75:5:75:15 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:76:5:76:18 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:77:5:77:18 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:78:5:78:19 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:79:5:79:14 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:82:13:82:13 | x | -| case.rb:75:5:75:15 | in ... then ... | case.rb:82:20:82:20 | 1 | -| case.rb:75:5:75:15 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:83:12:83:15 | ^... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:83:20:83:25 | string | -| case.rb:75:5:75:15 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:75:5:75:15 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:75:5:75:15 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:75:5:75:15 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:75:5:75:15 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:75:5:75:15 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:75:5:75:15 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:75:5:75:15 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:75:5:75:15 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:75:5:75:15 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:76:5:76:18 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:76:5:76:18 | in ... then ... | case.rb:76:5:76:18 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:77:5:77:18 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:78:5:78:19 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:79:5:79:14 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:82:13:82:13 | x | -| case.rb:76:5:76:18 | in ... then ... | case.rb:82:20:82:20 | 1 | -| case.rb:76:5:76:18 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:83:12:83:15 | ^... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:83:20:83:25 | string | -| case.rb:76:5:76:18 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:76:5:76:18 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:76:5:76:18 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:76:5:76:18 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:76:5:76:18 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:76:5:76:18 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:76:5:76:18 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:76:5:76:18 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:76:5:76:18 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:76:5:76:18 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:77:5:77:18 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:77:5:77:18 | in ... then ... | case.rb:77:5:77:18 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:78:5:78:19 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:79:5:79:14 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:82:13:82:13 | x | -| case.rb:77:5:77:18 | in ... then ... | case.rb:82:20:82:20 | 1 | -| case.rb:77:5:77:18 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:83:12:83:15 | ^... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:83:20:83:25 | string | -| case.rb:77:5:77:18 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:77:5:77:18 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:77:5:77:18 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:77:5:77:18 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:77:5:77:18 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:77:5:77:18 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:77:5:77:18 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:77:5:77:18 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:77:5:77:18 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:77:5:77:18 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:78:5:78:19 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:78:5:78:19 | in ... then ... | case.rb:78:5:78:19 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:79:5:79:14 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:82:13:82:13 | x | -| case.rb:78:5:78:19 | in ... then ... | case.rb:82:20:82:20 | 1 | -| case.rb:78:5:78:19 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:83:12:83:15 | ^... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:83:20:83:25 | string | -| case.rb:78:5:78:19 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:78:5:78:19 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:78:5:78:19 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:78:5:78:19 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:78:5:78:19 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:78:5:78:19 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:78:5:78:19 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:78:5:78:19 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:78:5:78:19 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:78:5:78:19 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:79:5:79:14 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:79:5:79:14 | in ... then ... | case.rb:79:5:79:14 | in ... then ... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:82:13:82:13 | x | -| case.rb:79:5:79:14 | in ... then ... | case.rb:82:20:82:20 | 1 | -| case.rb:79:5:79:14 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:83:12:83:15 | ^... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:83:20:83:25 | string | -| case.rb:79:5:79:14 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:79:5:79:14 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:79:5:79:14 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:79:5:79:14 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:79:5:79:14 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:79:5:79:14 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:79:5:79:14 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:79:5:79:14 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:79:5:79:14 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:79:5:79:14 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:80:5:80:12 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:80:5:80:12 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | -| case.rb:80:5:80:12 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | -| case.rb:80:5:80:12 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | -| case.rb:80:5:80:12 | in ... then ... | case.rb:82:13:82:13 | x | -| case.rb:80:5:80:12 | in ... then ... | case.rb:82:20:82:20 | 1 | -| case.rb:80:5:80:12 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | -| case.rb:80:5:80:12 | in ... then ... | case.rb:83:12:83:15 | ^... | -| case.rb:80:5:80:12 | in ... then ... | case.rb:83:20:83:25 | string | -| case.rb:80:5:80:12 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | -| case.rb:80:5:80:12 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:80:5:80:12 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:80:5:80:12 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:80:5:80:12 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:80:5:80:12 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:80:5:80:12 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:80:5:80:12 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:80:5:80:12 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:80:5:80:12 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:80:5:80:12 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:80:5:80:12 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:80:5:80:12 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:80:5:80:12 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:80:5:80:12 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:80:5:80:12 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:80:5:80:12 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:80:5:80:12 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:81:5:81:11 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:81:5:81:11 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | -| case.rb:81:5:81:11 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | -| case.rb:81:5:81:11 | in ... then ... | case.rb:82:13:82:13 | x | -| case.rb:81:5:81:11 | in ... then ... | case.rb:82:20:82:20 | 1 | -| case.rb:81:5:81:11 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | -| case.rb:81:5:81:11 | in ... then ... | case.rb:83:12:83:15 | ^... | -| case.rb:81:5:81:11 | in ... then ... | case.rb:83:20:83:25 | string | -| case.rb:81:5:81:11 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | -| case.rb:81:5:81:11 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:81:5:81:11 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:81:5:81:11 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:81:5:81:11 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:81:5:81:11 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:81:5:81:11 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:81:5:81:11 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:81:5:81:11 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:81:5:81:11 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:81:5:81:11 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:81:5:81:11 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:81:5:81:11 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:81:5:81:11 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:81:5:81:11 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:81:5:81:11 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:81:5:81:11 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:81:5:81:11 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:82:5:82:20 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:82:5:82:20 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | -| case.rb:82:5:82:20 | in ... then ... | case.rb:82:13:82:13 | x | -| case.rb:82:5:82:20 | in ... then ... | case.rb:82:20:82:20 | 1 | -| case.rb:82:5:82:20 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | -| case.rb:82:5:82:20 | in ... then ... | case.rb:83:12:83:15 | ^... | -| case.rb:82:5:82:20 | in ... then ... | case.rb:83:20:83:25 | string | -| case.rb:82:5:82:20 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | -| case.rb:82:5:82:20 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:82:5:82:20 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:82:5:82:20 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:82:5:82:20 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:82:5:82:20 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:82:5:82:20 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:82:5:82:20 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:82:5:82:20 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:82:5:82:20 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:82:5:82:20 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:82:5:82:20 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:82:5:82:20 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:82:5:82:20 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:82:5:82:20 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:82:5:82:20 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:82:5:82:20 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:82:5:82:20 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:82:13:82:13 | x | case.rb:82:13:82:13 | x | -| case.rb:82:13:82:13 | x | case.rb:82:20:82:20 | 1 | -| case.rb:82:20:82:20 | 1 | case.rb:82:20:82:20 | 1 | -| case.rb:83:5:83:26 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:83:5:83:26 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | -| case.rb:83:5:83:26 | in ... then ... | case.rb:83:12:83:15 | ^... | -| case.rb:83:5:83:26 | in ... then ... | case.rb:83:20:83:25 | string | -| case.rb:83:5:83:26 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | -| case.rb:83:5:83:26 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:83:5:83:26 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:83:5:83:26 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:83:5:83:26 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:83:5:83:26 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:83:5:83:26 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:83:5:83:26 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:83:5:83:26 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:83:5:83:26 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:83:5:83:26 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:83:5:83:26 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:83:5:83:26 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:83:5:83:26 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:83:5:83:26 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:83:5:83:26 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:83:5:83:26 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:83:5:83:26 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:83:12:83:15 | ^... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:83:12:83:15 | ^... | case.rb:83:12:83:15 | ^... | -| case.rb:83:12:83:15 | ^... | case.rb:83:20:83:25 | string | -| case.rb:83:12:83:15 | ^... | case.rb:84:5:84:17 | in ... then ... | -| case.rb:83:12:83:15 | ^... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:83:12:83:15 | ^... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:83:12:83:15 | ^... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:83:12:83:15 | ^... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:83:12:83:15 | ^... | case.rb:88:14:88:15 | 10 | -| case.rb:83:12:83:15 | ^... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:83:12:83:15 | ^... | case.rb:89:14:89:17 | self | -| case.rb:83:12:83:15 | ^... | case.rb:89:21:89:24 | true | -| case.rb:83:12:83:15 | ^... | case.rb:89:28:89:32 | false | -| case.rb:83:12:83:15 | ^... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:83:12:83:15 | ^... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:83:12:83:15 | ^... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:83:12:83:15 | ^... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:83:12:83:15 | ^... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:83:12:83:15 | ^... | case.rb:91:13:91:14 | "" | -| case.rb:83:12:83:15 | ^... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:83:12:83:15 | ^... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:83:20:83:25 | string | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:83:20:83:25 | string | case.rb:83:20:83:25 | string | -| case.rb:83:20:83:25 | string | case.rb:84:5:84:17 | in ... then ... | -| case.rb:83:20:83:25 | string | case.rb:85:5:85:23 | in ... then ... | -| case.rb:83:20:83:25 | string | case.rb:86:5:86:11 | in ... then ... | -| case.rb:83:20:83:25 | string | case.rb:87:5:87:17 | in ... then ... | -| case.rb:83:20:83:25 | string | case.rb:88:5:88:15 | in ... then ... | -| case.rb:83:20:83:25 | string | case.rb:88:14:88:15 | 10 | -| case.rb:83:20:83:25 | string | case.rb:89:5:89:69 | in ... then ... | -| case.rb:83:20:83:25 | string | case.rb:89:14:89:17 | self | -| case.rb:83:20:83:25 | string | case.rb:89:21:89:24 | true | -| case.rb:83:20:83:25 | string | case.rb:89:28:89:32 | false | -| case.rb:83:20:83:25 | string | case.rb:89:36:89:43 | __LINE__ | -| case.rb:83:20:83:25 | string | case.rb:89:47:89:54 | __FILE__ | -| case.rb:83:20:83:25 | string | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:83:20:83:25 | string | case.rb:90:5:90:13 | in ... then ... | -| case.rb:83:20:83:25 | string | case.rb:91:5:91:25 | in ... then ... | -| case.rb:83:20:83:25 | string | case.rb:91:13:91:14 | "" | -| case.rb:83:20:83:25 | string | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:83:20:83:25 | string | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:84:5:84:17 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:84:5:84:17 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | -| case.rb:84:5:84:17 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:84:5:84:17 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:84:5:84:17 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:84:5:84:17 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:84:5:84:17 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:84:5:84:17 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:84:5:84:17 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:84:5:84:17 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:84:5:84:17 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:84:5:84:17 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:84:5:84:17 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:84:5:84:17 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:84:5:84:17 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:84:5:84:17 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:84:5:84:17 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:84:5:84:17 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:84:5:84:17 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:85:5:85:23 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:85:5:85:23 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:85:5:85:23 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:85:5:85:23 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:85:5:85:23 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:85:5:85:23 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:85:5:85:23 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:85:5:85:23 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:85:5:85:23 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:85:5:85:23 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:85:5:85:23 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:85:5:85:23 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:85:5:85:23 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:85:5:85:23 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:85:5:85:23 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:85:5:85:23 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:85:5:85:23 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:85:5:85:23 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:85:8:85:23 | enter -> { ... } | case.rb:85:8:85:23 | enter -> { ... } | -| case.rb:86:5:86:11 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:86:5:86:11 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:86:5:86:11 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:86:5:86:11 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:86:5:86:11 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:86:5:86:11 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:86:5:86:11 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:86:5:86:11 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:86:5:86:11 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:86:5:86:11 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:86:5:86:11 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:86:5:86:11 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:86:5:86:11 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:86:5:86:11 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:86:5:86:11 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:86:5:86:11 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:86:5:86:11 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:87:5:87:17 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:87:5:87:17 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:87:5:87:17 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:87:5:87:17 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:87:5:87:17 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:87:5:87:17 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:87:5:87:17 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:87:5:87:17 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:87:5:87:17 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:87:5:87:17 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:87:5:87:17 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:87:5:87:17 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:87:5:87:17 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:87:5:87:17 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:87:5:87:17 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:87:5:87:17 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:88:5:88:15 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:88:5:88:15 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:88:5:88:15 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:88:5:88:15 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:88:5:88:15 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:88:5:88:15 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:88:5:88:15 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:88:5:88:15 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:88:5:88:15 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:88:5:88:15 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:88:5:88:15 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:88:5:88:15 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:88:5:88:15 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:88:5:88:15 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:88:5:88:15 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:88:14:88:15 | 10 | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:88:14:88:15 | 10 | case.rb:88:14:88:15 | 10 | -| case.rb:88:14:88:15 | 10 | case.rb:89:5:89:69 | in ... then ... | -| case.rb:88:14:88:15 | 10 | case.rb:89:14:89:17 | self | -| case.rb:88:14:88:15 | 10 | case.rb:89:21:89:24 | true | -| case.rb:88:14:88:15 | 10 | case.rb:89:28:89:32 | false | -| case.rb:88:14:88:15 | 10 | case.rb:89:36:89:43 | __LINE__ | -| case.rb:88:14:88:15 | 10 | case.rb:89:47:89:54 | __FILE__ | -| case.rb:88:14:88:15 | 10 | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:88:14:88:15 | 10 | case.rb:90:5:90:13 | in ... then ... | -| case.rb:88:14:88:15 | 10 | case.rb:91:5:91:25 | in ... then ... | -| case.rb:88:14:88:15 | 10 | case.rb:91:13:91:14 | "" | -| case.rb:88:14:88:15 | 10 | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:88:14:88:15 | 10 | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:89:5:89:69 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:89:5:89:69 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:89:5:89:69 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:89:5:89:69 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:89:5:89:69 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:89:5:89:69 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:89:5:89:69 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:89:5:89:69 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:89:5:89:69 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:89:5:89:69 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:89:5:89:69 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:89:5:89:69 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:89:5:89:69 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:89:14:89:17 | self | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:89:14:89:17 | self | case.rb:89:14:89:17 | self | -| case.rb:89:14:89:17 | self | case.rb:89:21:89:24 | true | -| case.rb:89:14:89:17 | self | case.rb:89:28:89:32 | false | -| case.rb:89:14:89:17 | self | case.rb:89:36:89:43 | __LINE__ | -| case.rb:89:14:89:17 | self | case.rb:89:47:89:54 | __FILE__ | -| case.rb:89:14:89:17 | self | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:89:14:89:17 | self | case.rb:90:5:90:13 | in ... then ... | -| case.rb:89:14:89:17 | self | case.rb:91:5:91:25 | in ... then ... | -| case.rb:89:14:89:17 | self | case.rb:91:13:91:14 | "" | -| case.rb:89:14:89:17 | self | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:89:14:89:17 | self | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:89:21:89:24 | true | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:89:21:89:24 | true | case.rb:89:21:89:24 | true | -| case.rb:89:21:89:24 | true | case.rb:89:28:89:32 | false | -| case.rb:89:21:89:24 | true | case.rb:89:36:89:43 | __LINE__ | -| case.rb:89:21:89:24 | true | case.rb:89:47:89:54 | __FILE__ | -| case.rb:89:21:89:24 | true | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:89:21:89:24 | true | case.rb:90:5:90:13 | in ... then ... | -| case.rb:89:21:89:24 | true | case.rb:91:5:91:25 | in ... then ... | -| case.rb:89:21:89:24 | true | case.rb:91:13:91:14 | "" | -| case.rb:89:21:89:24 | true | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:89:21:89:24 | true | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:89:28:89:32 | false | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:89:28:89:32 | false | case.rb:89:28:89:32 | false | -| case.rb:89:28:89:32 | false | case.rb:89:36:89:43 | __LINE__ | -| case.rb:89:28:89:32 | false | case.rb:89:47:89:54 | __FILE__ | -| case.rb:89:28:89:32 | false | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:89:28:89:32 | false | case.rb:90:5:90:13 | in ... then ... | -| case.rb:89:28:89:32 | false | case.rb:91:5:91:25 | in ... then ... | -| case.rb:89:28:89:32 | false | case.rb:91:13:91:14 | "" | -| case.rb:89:28:89:32 | false | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:89:28:89:32 | false | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:89:36:89:43 | __LINE__ | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:89:36:89:43 | __LINE__ | case.rb:89:36:89:43 | __LINE__ | -| case.rb:89:36:89:43 | __LINE__ | case.rb:89:47:89:54 | __FILE__ | -| case.rb:89:36:89:43 | __LINE__ | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:89:36:89:43 | __LINE__ | case.rb:90:5:90:13 | in ... then ... | -| case.rb:89:36:89:43 | __LINE__ | case.rb:91:5:91:25 | in ... then ... | -| case.rb:89:36:89:43 | __LINE__ | case.rb:91:13:91:14 | "" | -| case.rb:89:36:89:43 | __LINE__ | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:89:36:89:43 | __LINE__ | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:89:47:89:54 | __FILE__ | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:89:47:89:54 | __FILE__ | case.rb:89:47:89:54 | __FILE__ | -| case.rb:89:47:89:54 | __FILE__ | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:89:47:89:54 | __FILE__ | case.rb:90:5:90:13 | in ... then ... | -| case.rb:89:47:89:54 | __FILE__ | case.rb:91:5:91:25 | in ... then ... | -| case.rb:89:47:89:54 | __FILE__ | case.rb:91:13:91:14 | "" | -| case.rb:89:47:89:54 | __FILE__ | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:89:47:89:54 | __FILE__ | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:90:5:90:13 | in ... then ... | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:91:5:91:25 | in ... then ... | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:91:13:91:14 | "" | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:90:5:90:13 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:90:5:90:13 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:90:5:90:13 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:90:5:90:13 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:90:5:90:13 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:90:5:90:13 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:91:5:91:25 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:91:5:91:25 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:91:5:91:25 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:91:5:91:25 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:91:5:91:25 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:91:13:91:14 | "" | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:91:13:91:14 | "" | case.rb:91:13:91:14 | "" | -| case.rb:91:13:91:14 | "" | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:91:13:91:14 | "" | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:91:18:91:19 | [ ..., * ] | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:91:18:91:19 | [ ..., * ] | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:91:18:91:19 | [ ..., * ] | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:91:23:91:24 | { ..., ** } | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:91:23:91:24 | { ..., ** } | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:95:1:99:3 | enter case_match_guard_no_else | case.rb:95:1:99:3 | enter case_match_guard_no_else | -| case.rb:95:1:99:3 | enter case_match_guard_no_else | case.rb:95:1:99:3 | exit case_match_guard_no_else | -| case.rb:95:1:99:3 | enter case_match_guard_no_else | case.rb:95:1:99:3 | exit case_match_guard_no_else (abnormal) | -| case.rb:95:1:99:3 | enter case_match_guard_no_else | case.rb:97:13:97:13 | x | -| case.rb:95:1:99:3 | enter case_match_guard_no_else | case.rb:97:25:97:25 | 6 | -| case.rb:95:1:99:3 | exit case_match_guard_no_else | case.rb:95:1:99:3 | exit case_match_guard_no_else | -| case.rb:95:1:99:3 | exit case_match_guard_no_else (abnormal) | case.rb:95:1:99:3 | exit case_match_guard_no_else (abnormal) | -| case.rb:97:13:97:13 | x | case.rb:95:1:99:3 | exit case_match_guard_no_else | -| case.rb:97:13:97:13 | x | case.rb:95:1:99:3 | exit case_match_guard_no_else (abnormal) | -| case.rb:97:13:97:13 | x | case.rb:97:13:97:13 | x | -| case.rb:97:13:97:13 | x | case.rb:97:25:97:25 | 6 | -| case.rb:97:25:97:25 | 6 | case.rb:97:25:97:25 | 6 | -| cfg.html.erb:5:16:31:12 | enter cfg.html.erb | cfg.html.erb:5:16:31:12 | enter cfg.html.erb | -| cfg.html.erb:5:16:31:12 | enter cfg.html.erb | cfg.html.erb:18:14:22:16 | if ... | -| cfg.html.erb:5:16:31:12 | enter cfg.html.erb | cfg.html.erb:19:19:19:32 | self | -| cfg.html.erb:5:16:31:12 | enter cfg.html.erb | cfg.html.erb:21:19:21:32 | self | -| cfg.html.erb:18:14:22:16 | if ... | cfg.html.erb:18:14:22:16 | if ... | -| cfg.html.erb:19:19:19:32 | self | cfg.html.erb:19:19:19:32 | self | -| cfg.html.erb:21:19:21:32 | self | cfg.html.erb:21:19:21:32 | self | -| cfg.html.erb:29:24:31:10 | enter do ... end | cfg.html.erb:29:24:31:10 | enter do ... end | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:42:15:42:24 | self | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:43:21:43:31 | self | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:44:8:44:18 | self | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:48:20:48:29 | self | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:49:8:49:8 | b | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:49:16:49:16 | b | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:49:27:49:37 | self | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:60:27:60:31 | hello | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:60:37:60:39 | bye | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:75:23:75:23 | x | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:75:43:75:43 | x | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:90:5:90:5 | x | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:113:1:113:9 | self | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:136:12:136:29 | self | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:172:21:172:29 | self | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:172:36:172:45 | self | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:174:1:174:9 | self | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:176:7:176:7 | x | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:176:17:176:17 | x | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:179:2:179:13 | self | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:179:30:179:30 | i | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:182:7:182:7 | x | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:183:3:183:3 | x | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:184:18:184:21 | redo | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:188:2:188:13 | self | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:188:30:188:30 | i | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:205:1:205:3 | nil | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:25:9:25:22 | enter { ... } | cfg.rb:25:9:25:22 | enter { ... } | -| cfg.rb:29:10:29:24 | enter { ... } | cfg.rb:29:10:29:24 | enter { ... } | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:42:15:42:24 | self | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:43:21:43:31 | self | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:44:8:44:18 | self | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:48:20:48:29 | self | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:49:8:49:8 | b | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:49:16:49:16 | b | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:49:27:49:37 | self | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:60:27:60:31 | hello | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:60:37:60:39 | bye | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:75:23:75:23 | x | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:75:43:75:43 | x | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:90:5:90:5 | x | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:113:1:113:9 | self | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:136:12:136:29 | self | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:172:21:172:29 | self | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:172:36:172:45 | self | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:174:1:174:9 | self | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:176:7:176:7 | x | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:176:17:176:17 | x | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:179:2:179:13 | self | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:179:30:179:30 | i | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:182:7:182:7 | x | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:183:3:183:3 | x | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:184:18:184:21 | redo | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:188:2:188:13 | self | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:188:30:188:30 | i | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:205:1:205:3 | nil | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:60:27:60:31 | hello | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:60:37:60:39 | bye | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:113:1:113:9 | self | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:136:12:136:29 | self | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:172:21:172:29 | self | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:172:36:172:45 | self | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:174:1:174:9 | self | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:176:17:176:17 | x | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:179:2:179:13 | self | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:188:2:188:13 | self | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:205:1:205:3 | nil | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:60:27:60:31 | hello | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:60:37:60:39 | bye | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:113:1:113:9 | self | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:136:12:136:29 | self | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:172:21:172:29 | self | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:172:36:172:45 | self | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:174:1:174:9 | self | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:176:17:176:17 | x | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:179:2:179:13 | self | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:188:2:188:13 | self | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:205:1:205:3 | nil | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:42:3:42:24 | [match] when ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:42:3:42:24 | [match] when ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:42:15:42:24 | self | cfg.rb:42:15:42:24 | self | -| cfg.rb:43:3:43:31 | [match] when ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:43:3:43:31 | [match] when ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:43:3:43:31 | [no-match] when ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:43:3:43:31 | [no-match] when ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:21:43:31 | self | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:44:8:44:18 | self | -| cfg.rb:43:11:43:11 | 3 | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:43:11:43:11 | 3 | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:43:11:43:11 | 3 | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:43:11:43:11 | 3 | cfg.rb:44:8:44:18 | self | -| cfg.rb:43:14:43:14 | 4 | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:43:14:43:14 | 4 | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:43:14:43:14 | 4 | cfg.rb:44:8:44:18 | self | -| cfg.rb:43:21:43:31 | self | cfg.rb:43:21:43:31 | self | -| cfg.rb:44:8:44:18 | self | cfg.rb:44:8:44:18 | self | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:60:27:60:31 | hello | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:60:37:60:39 | bye | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:113:1:113:9 | self | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:136:12:136:29 | self | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:172:21:172:29 | self | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:172:36:172:45 | self | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:174:1:174:9 | self | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:176:17:176:17 | x | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:179:2:179:13 | self | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:188:2:188:13 | self | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:205:1:205:3 | nil | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:48:3:48:29 | [match] when ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:48:3:48:29 | [match] when ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:48:3:48:29 | [no-match] when ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:48:3:48:29 | [no-match] when ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:48:3:48:29 | [no-match] when ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:48:3:48:29 | [no-match] when ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:48:3:48:29 | [no-match] when ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:48:3:48:29 | [no-match] when ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:48:20:48:29 | self | cfg.rb:48:20:48:29 | self | -| cfg.rb:49:3:49:37 | [match] when ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:49:3:49:37 | [match] when ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:49:3:49:37 | [no-match] when ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:49:8:49:8 | b | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:49:8:49:8 | b | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:49:8:49:8 | b | cfg.rb:49:8:49:8 | b | -| cfg.rb:49:8:49:8 | b | cfg.rb:49:16:49:16 | b | -| cfg.rb:49:8:49:8 | b | cfg.rb:49:27:49:37 | self | -| cfg.rb:49:16:49:16 | b | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:49:16:49:16 | b | cfg.rb:49:16:49:16 | b | -| cfg.rb:49:27:49:37 | self | cfg.rb:49:27:49:37 | self | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:113:1:113:9 | self | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:136:12:136:29 | self | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:172:21:172:29 | self | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:172:36:172:45 | self | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:174:1:174:9 | self | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:176:17:176:17 | x | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:179:2:179:13 | self | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:188:2:188:13 | self | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:205:1:205:3 | nil | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:60:27:60:31 | hello | cfg.rb:60:27:60:31 | hello | -| cfg.rb:60:37:60:39 | bye | cfg.rb:60:37:60:39 | bye | -| cfg.rb:63:3:66:5 | enter pattern | cfg.rb:63:3:66:5 | enter pattern | -| cfg.rb:69:3:71:5 | enter print | cfg.rb:69:3:71:5 | enter print | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:113:1:113:9 | self | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:136:12:136:29 | self | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:172:21:172:29 | self | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:172:36:172:45 | self | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:174:1:174:9 | self | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:176:17:176:17 | x | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:179:2:179:13 | self | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:188:2:188:13 | self | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:205:1:205:3 | nil | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:75:15:75:15 | 0 | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:75:17:75:43 | elsif ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:75:23:75:23 | x | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:75:23:75:23 | x | cfg.rb:75:23:75:23 | x | -| cfg.rb:75:23:75:23 | x | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:75:23:75:23 | x | cfg.rb:75:43:75:43 | x | -| cfg.rb:75:35:75:36 | 10 | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:75:43:75:43 | x | cfg.rb:75:43:75:43 | x | -| cfg.rb:90:1:93:3 | enter { ... } | cfg.rb:90:1:93:3 | enter { ... } | -| cfg.rb:90:1:93:3 | enter { ... } | cfg.rb:90:1:93:3 | exit { ... } (normal) | -| cfg.rb:90:1:93:3 | enter { ... } | cfg.rb:91:3:91:24 | if ... | -| cfg.rb:90:1:93:3 | enter { ... } | cfg.rb:91:17:91:20 | next | -| cfg.rb:90:1:93:3 | exit { ... } (normal) | cfg.rb:90:1:93:3 | exit { ... } (normal) | -| cfg.rb:90:5:90:5 | [false] ! ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:90:5:90:5 | [true] ! ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:90:5:90:5 | [true] ! ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:113:1:113:9 | self | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:136:12:136:29 | self | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:172:21:172:29 | self | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:172:36:172:45 | self | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:174:1:174:9 | self | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:176:17:176:17 | x | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:179:2:179:13 | self | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:188:2:188:13 | self | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:205:1:205:3 | nil | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:90:5:90:5 | x | cfg.rb:90:5:90:5 | x | -| cfg.rb:91:3:91:24 | if ... | cfg.rb:91:3:91:24 | if ... | -| cfg.rb:91:17:91:20 | next | cfg.rb:91:17:91:20 | next | -| cfg.rb:101:1:104:3 | enter parameters | cfg.rb:101:1:104:3 | enter parameters | -| cfg.rb:101:1:104:3 | enter parameters | cfg.rb:101:24:101:25 | 42 | -| cfg.rb:101:1:104:3 | enter parameters | cfg.rb:101:28:101:30 | key | -| cfg.rb:101:24:101:25 | 42 | cfg.rb:101:24:101:25 | 42 | +| case.rb:15:5:15:28 | in ... then ... | case.rb:15:8:15:8 | After x [match] | +| case.rb:15:5:15:28 | in ... then ... | case.rb:15:8:15:8 | After x [no-match] | +| case.rb:15:5:15:28 | in ... then ... | case.rb:15:17:15:21 | After ... < ... [false] | +| case.rb:15:5:15:28 | in ... then ... | case.rb:15:17:15:21 | After ... < ... [true] | +| case.rb:15:5:15:28 | in ... then ... | case.rb:16:5:16:10 | else ... | +| case.rb:15:8:15:8 | After x [match] | case.rb:15:8:15:8 | After x [match] | +| case.rb:15:8:15:8 | After x [match] | case.rb:15:17:15:21 | After ... < ... [false] | +| case.rb:15:8:15:8 | After x [match] | case.rb:15:17:15:21 | After ... < ... [true] | +| case.rb:15:8:15:8 | After x [no-match] | case.rb:15:8:15:8 | After x [no-match] | +| case.rb:15:17:15:21 | After ... < ... [false] | case.rb:15:17:15:21 | After ... < ... [false] | +| case.rb:15:17:15:21 | After ... < ... [true] | case.rb:15:17:15:21 | After ... < ... [true] | +| case.rb:16:5:16:10 | else ... | case.rb:16:5:16:10 | else ... | +| case.rb:20:1:24:3 | Entry | case.rb:20:1:24:3 | Entry | +| case.rb:20:1:24:3 | Entry | case.rb:21:3:23:5 | After case ... | +| case.rb:20:1:24:3 | Entry | case.rb:22:8:22:8 | After 1 [match] | +| case.rb:20:1:24:3 | Entry | case.rb:22:8:22:8 | After 1 [no-match] | +| case.rb:21:3:23:5 | After case ... | case.rb:21:3:23:5 | After case ... | +| case.rb:22:8:22:8 | After 1 [match] | case.rb:22:8:22:8 | After 1 [match] | +| case.rb:22:8:22:8 | After 1 [no-match] | case.rb:22:8:22:8 | After 1 [no-match] | +| case.rb:26:1:30:3 | Entry | case.rb:26:1:30:3 | Entry | +| case.rb:26:1:30:3 | Entry | case.rb:27:3:29:5 | After case ... | +| case.rb:26:1:30:3 | Entry | case.rb:28:7:28:28 | After -> { ... } [match] | +| case.rb:26:1:30:3 | Entry | case.rb:28:7:28:28 | After -> { ... } [no-match] | +| case.rb:27:3:29:5 | After case ... | case.rb:27:3:29:5 | After case ... | +| case.rb:28:7:28:28 | After -> { ... } [match] | case.rb:28:7:28:28 | After -> { ... } [match] | +| case.rb:28:7:28:28 | After -> { ... } [no-match] | case.rb:28:7:28:28 | After -> { ... } [no-match] | +| case.rb:28:7:28:28 | Entry | case.rb:28:7:28:28 | Entry | +| case.rb:32:1:39:3 | Entry | case.rb:32:1:39:3 | Entry | +| case.rb:32:1:39:3 | Entry | case.rb:33:3:38:5 | After case ... | +| case.rb:32:1:39:3 | Entry | case.rb:34:8:34:9 | After [ ..., * ] [match] | +| case.rb:32:1:39:3 | Entry | case.rb:34:8:34:9 | After [ ..., * ] [no-match] | +| case.rb:32:1:39:3 | Entry | case.rb:35:8:35:10 | After [ ..., * ] [match] | +| case.rb:32:1:39:3 | Entry | case.rb:35:8:35:10 | After [ ..., * ] [no-match] | +| case.rb:32:1:39:3 | Entry | case.rb:36:8:36:12 | After [ ..., * ] [match] | +| case.rb:32:1:39:3 | Entry | case.rb:36:8:36:12 | After [ ..., * ] [no-match] | +| case.rb:32:1:39:3 | Entry | case.rb:37:8:37:26 | After [ ..., * ] [match] | +| case.rb:32:1:39:3 | Entry | case.rb:37:8:37:26 | After [ ..., * ] [no-match] | +| case.rb:33:3:38:5 | After case ... | case.rb:33:3:38:5 | After case ... | +| case.rb:34:8:34:9 | After [ ..., * ] [match] | case.rb:34:8:34:9 | After [ ..., * ] [match] | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:34:8:34:9 | After [ ..., * ] [no-match] | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:35:8:35:10 | After [ ..., * ] [match] | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:35:8:35:10 | After [ ..., * ] [no-match] | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:36:8:36:12 | After [ ..., * ] [match] | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:36:8:36:12 | After [ ..., * ] [no-match] | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [match] | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [no-match] | +| case.rb:35:8:35:10 | After [ ..., * ] [match] | case.rb:35:8:35:10 | After [ ..., * ] [match] | +| case.rb:35:8:35:10 | After [ ..., * ] [no-match] | case.rb:35:8:35:10 | After [ ..., * ] [no-match] | +| case.rb:35:8:35:10 | After [ ..., * ] [no-match] | case.rb:36:8:36:12 | After [ ..., * ] [match] | +| case.rb:35:8:35:10 | After [ ..., * ] [no-match] | case.rb:36:8:36:12 | After [ ..., * ] [no-match] | +| case.rb:35:8:35:10 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [match] | +| case.rb:35:8:35:10 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [no-match] | +| case.rb:36:8:36:12 | After [ ..., * ] [match] | case.rb:36:8:36:12 | After [ ..., * ] [match] | +| case.rb:36:8:36:12 | After [ ..., * ] [no-match] | case.rb:36:8:36:12 | After [ ..., * ] [no-match] | +| case.rb:36:8:36:12 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [match] | +| case.rb:36:8:36:12 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [no-match] | +| case.rb:37:8:37:26 | After [ ..., * ] [match] | case.rb:37:8:37:26 | After [ ..., * ] [match] | +| case.rb:37:8:37:26 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [no-match] | +| case.rb:41:1:45:3 | Entry | case.rb:41:1:45:3 | Entry | +| case.rb:41:1:45:3 | Entry | case.rb:42:3:44:5 | After case ... | +| case.rb:41:1:45:3 | Entry | case.rb:43:8:43:21 | After [ *,...,* ] [match] | +| case.rb:41:1:45:3 | Entry | case.rb:43:8:43:21 | After [ *,...,* ] [no-match] | +| case.rb:42:3:44:5 | After case ... | case.rb:42:3:44:5 | After case ... | +| case.rb:43:8:43:21 | After [ *,...,* ] [match] | case.rb:43:8:43:21 | After [ *,...,* ] [match] | +| case.rb:43:8:43:21 | After [ *,...,* ] [no-match] | case.rb:43:8:43:21 | After [ *,...,* ] [no-match] | +| case.rb:47:1:53:3 | Entry | case.rb:47:1:53:3 | Entry | +| case.rb:47:1:53:3 | Entry | case.rb:48:3:52:5 | After case ... | +| case.rb:47:1:53:3 | Entry | case.rb:49:8:49:34 | After { ..., ** } [match] | +| case.rb:47:1:53:3 | Entry | case.rb:49:8:49:34 | After { ..., ** } [no-match] | +| case.rb:47:1:53:3 | Entry | case.rb:50:8:50:24 | After { ..., ** } [match] | +| case.rb:47:1:53:3 | Entry | case.rb:50:8:50:24 | After { ..., ** } [no-match] | +| case.rb:47:1:53:3 | Entry | case.rb:51:8:51:16 | After { ..., ** } [match] | +| case.rb:47:1:53:3 | Entry | case.rb:51:8:51:16 | After { ..., ** } [no-match] | +| case.rb:48:3:52:5 | After case ... | case.rb:48:3:52:5 | After case ... | +| case.rb:49:8:49:34 | After { ..., ** } [match] | case.rb:49:8:49:34 | After { ..., ** } [match] | +| case.rb:49:8:49:34 | After { ..., ** } [no-match] | case.rb:49:8:49:34 | After { ..., ** } [no-match] | +| case.rb:49:8:49:34 | After { ..., ** } [no-match] | case.rb:50:8:50:24 | After { ..., ** } [match] | +| case.rb:49:8:49:34 | After { ..., ** } [no-match] | case.rb:50:8:50:24 | After { ..., ** } [no-match] | +| case.rb:49:8:49:34 | After { ..., ** } [no-match] | case.rb:51:8:51:16 | After { ..., ** } [match] | +| case.rb:49:8:49:34 | After { ..., ** } [no-match] | case.rb:51:8:51:16 | After { ..., ** } [no-match] | +| case.rb:50:8:50:24 | After { ..., ** } [match] | case.rb:50:8:50:24 | After { ..., ** } [match] | +| case.rb:50:8:50:24 | After { ..., ** } [no-match] | case.rb:50:8:50:24 | After { ..., ** } [no-match] | +| case.rb:50:8:50:24 | After { ..., ** } [no-match] | case.rb:51:8:51:16 | After { ..., ** } [match] | +| case.rb:50:8:50:24 | After { ..., ** } [no-match] | case.rb:51:8:51:16 | After { ..., ** } [no-match] | +| case.rb:51:8:51:16 | After { ..., ** } [match] | case.rb:51:8:51:16 | After { ..., ** } [match] | +| case.rb:51:8:51:16 | After { ..., ** } [no-match] | case.rb:51:8:51:16 | After { ..., ** } [no-match] | +| case.rb:55:1:61:3 | Entry | case.rb:55:1:61:3 | Entry | +| case.rb:55:1:61:3 | Entry | case.rb:56:3:60:5 | After case ... | +| case.rb:55:1:61:3 | Entry | case.rb:57:8:57:8 | After 5 [match] | +| case.rb:55:1:61:3 | Entry | case.rb:57:8:57:8 | After 5 [no-match] | +| case.rb:55:1:61:3 | Entry | case.rb:58:8:58:10 | After var [match] | +| case.rb:55:1:61:3 | Entry | case.rb:58:8:58:10 | After var [no-match] | +| case.rb:55:1:61:3 | Entry | case.rb:59:8:59:20 | After "unreachable" [match] | +| case.rb:55:1:61:3 | Entry | case.rb:59:8:59:20 | After "unreachable" [no-match] | +| case.rb:56:3:60:5 | After case ... | case.rb:56:3:60:5 | After case ... | +| case.rb:57:8:57:8 | After 5 [match] | case.rb:57:8:57:8 | After 5 [match] | +| case.rb:57:8:57:8 | After 5 [no-match] | case.rb:57:8:57:8 | After 5 [no-match] | +| case.rb:57:8:57:8 | After 5 [no-match] | case.rb:58:8:58:10 | After var [match] | +| case.rb:57:8:57:8 | After 5 [no-match] | case.rb:58:8:58:10 | After var [no-match] | +| case.rb:57:8:57:8 | After 5 [no-match] | case.rb:59:8:59:20 | After "unreachable" [match] | +| case.rb:57:8:57:8 | After 5 [no-match] | case.rb:59:8:59:20 | After "unreachable" [no-match] | +| case.rb:58:8:58:10 | After var [match] | case.rb:58:8:58:10 | After var [match] | +| case.rb:58:8:58:10 | After var [no-match] | case.rb:58:8:58:10 | After var [no-match] | +| case.rb:58:8:58:10 | After var [no-match] | case.rb:59:8:59:20 | After "unreachable" [match] | +| case.rb:58:8:58:10 | After var [no-match] | case.rb:59:8:59:20 | After "unreachable" [no-match] | +| case.rb:59:8:59:20 | After "unreachable" [match] | case.rb:59:8:59:20 | After "unreachable" [match] | +| case.rb:59:8:59:20 | After "unreachable" [no-match] | case.rb:59:8:59:20 | After "unreachable" [no-match] | +| case.rb:63:1:67:3 | Entry | case.rb:63:1:67:3 | Entry | +| case.rb:63:1:67:3 | Entry | case.rb:64:3:66:5 | After case ... | +| case.rb:63:1:67:3 | Entry | case.rb:65:8:65:28 | After ... \| ... [match] | +| case.rb:63:1:67:3 | Entry | case.rb:65:8:65:28 | After ... \| ... [no-match] | +| case.rb:64:3:66:5 | After case ... | case.rb:64:3:66:5 | After case ... | +| case.rb:65:8:65:28 | After ... \| ... [match] | case.rb:65:8:65:28 | After ... \| ... [match] | +| case.rb:65:8:65:28 | After ... \| ... [no-match] | case.rb:65:8:65:28 | After ... \| ... [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:69:1:93:3 | Entry | +| case.rb:69:1:93:3 | Entry | case.rb:72:3:92:5 | After case ... | +| case.rb:69:1:93:3 | Entry | case.rb:73:8:73:8 | After 5 [match] | +| case.rb:69:1:93:3 | Entry | case.rb:73:8:73:8 | After 5 [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:74:8:74:11 | After ^... [match] | +| case.rb:69:1:93:3 | Entry | case.rb:74:8:74:11 | After ^... [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:75:8:75:15 | After "string" [match] | +| case.rb:69:1:93:3 | Entry | case.rb:75:8:75:15 | After "string" [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:76:8:76:18 | After call to [] [match] | +| case.rb:69:1:93:3 | Entry | case.rb:76:8:76:18 | After call to [] [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:77:8:77:18 | After call to [] [match] | +| case.rb:69:1:93:3 | Entry | case.rb:77:8:77:18 | After call to [] [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | +| case.rb:69:1:93:3 | Entry | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:79:8:79:14 | After _ .. _ [match] | +| case.rb:69:1:93:3 | Entry | case.rb:79:8:79:14 | After _ .. _ [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:80:8:80:12 | After _ .. _ [match] | +| case.rb:69:1:93:3 | Entry | case.rb:80:8:80:12 | After _ .. _ [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:81:8:81:11 | After _ .. _ [match] | +| case.rb:69:1:93:3 | Entry | case.rb:81:8:81:11 | After _ .. _ [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:82:8:82:13 | After ... => ... [match] | +| case.rb:69:1:93:3 | Entry | case.rb:82:8:82:13 | After ... => ... [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:83:8:83:26 | After ... \| ... [match] | +| case.rb:69:1:93:3 | Entry | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:84:8:84:17 | After Bar [match] | +| case.rb:69:1:93:3 | Entry | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:69:1:93:3 | Entry | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:69:1:93:3 | Entry | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:69:1:93:3 | Entry | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:69:1:93:3 | Entry | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:69:1:93:3 | Entry | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:69:1:93:3 | Entry | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:69:1:93:3 | Entry | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:72:3:92:5 | After case ... | +| case.rb:73:8:73:8 | After 5 [match] | case.rb:73:8:73:8 | After 5 [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:73:8:73:8 | After 5 [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:74:8:74:11 | After ^... [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:74:8:74:11 | After ^... [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:75:8:75:15 | After "string" [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:75:8:75:15 | After "string" [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:76:8:76:18 | After call to [] [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:76:8:76:18 | After call to [] [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:77:8:77:18 | After call to [] [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:77:8:77:18 | After call to [] [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:79:8:79:14 | After _ .. _ [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:80:8:80:12 | After _ .. _ [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:84:8:84:17 | After Bar [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:74:8:74:11 | After ^... [match] | case.rb:74:8:74:11 | After ^... [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:74:8:74:11 | After ^... [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:75:8:75:15 | After "string" [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:75:8:75:15 | After "string" [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:76:8:76:18 | After call to [] [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:76:8:76:18 | After call to [] [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:77:8:77:18 | After call to [] [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:77:8:77:18 | After call to [] [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:79:8:79:14 | After _ .. _ [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:80:8:80:12 | After _ .. _ [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:84:8:84:17 | After Bar [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:75:8:75:15 | After "string" [match] | case.rb:75:8:75:15 | After "string" [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:75:8:75:15 | After "string" [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:76:8:76:18 | After call to [] [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:76:8:76:18 | After call to [] [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:77:8:77:18 | After call to [] [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:77:8:77:18 | After call to [] [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:79:8:79:14 | After _ .. _ [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:80:8:80:12 | After _ .. _ [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:84:8:84:17 | After Bar [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:76:8:76:18 | After call to [] [match] | case.rb:76:8:76:18 | After call to [] [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:76:8:76:18 | After call to [] [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:77:8:77:18 | After call to [] [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:77:8:77:18 | After call to [] [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:79:8:79:14 | After _ .. _ [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:80:8:80:12 | After _ .. _ [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:84:8:84:17 | After Bar [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:77:8:77:18 | After call to [] [match] | case.rb:77:8:77:18 | After call to [] [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:77:8:77:18 | After call to [] [no-match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:79:8:79:14 | After _ .. _ [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:80:8:80:12 | After _ .. _ [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:84:8:84:17 | After Bar [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:79:8:79:14 | After _ .. _ [match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:80:8:80:12 | After _ .. _ [match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:84:8:84:17 | After Bar [match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [match] | case.rb:79:8:79:14 | After _ .. _ [match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:80:8:80:12 | After _ .. _ [match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:84:8:84:17 | After Bar [match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:80:8:80:12 | After _ .. _ [match] | case.rb:80:8:80:12 | After _ .. _ [match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:84:8:84:17 | After Bar [match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:81:8:81:11 | After _ .. _ [match] | case.rb:81:8:81:11 | After _ .. _ [match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:84:8:84:17 | After Bar [match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:82:8:82:13 | After ... => ... [match] | case.rb:82:8:82:13 | After ... => ... [match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:84:8:84:17 | After Bar [match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:83:8:83:26 | After ... \| ... [match] | case.rb:83:8:83:26 | After ... \| ... [match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:84:8:84:17 | After Bar [match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:84:8:84:17 | After Bar [match] | case.rb:84:8:84:17 | After Bar [match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:85:8:85:23 | After -> { ... } [match] | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:85:8:85:23 | Entry | case.rb:85:8:85:23 | Entry | +| case.rb:86:8:86:11 | After :foo [match] | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:87:8:87:17 | After :"foo bar" [match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:88:8:88:15 | After ... \| ... [match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:89:8:89:69 | After ... \| ... [match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:89:8:89:69 | After ... \| ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:89:8:89:69 | After ... \| ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:89:8:89:69 | After ... \| ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:89:8:89:69 | After ... \| ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:89:8:89:69 | After ... \| ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:90:8:90:13 | After ( ... ) [match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:90:8:90:13 | After ( ... ) [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:90:8:90:13 | After ( ... ) [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:90:8:90:13 | After ( ... ) [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:91:8:91:25 | After ( ... ) [match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:91:8:91:25 | After ( ... ) [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:95:1:99:3 | Entry | case.rb:95:1:99:3 | Entry | +| case.rb:95:1:99:3 | Entry | case.rb:96:3:98:5 | After case ... | +| case.rb:95:1:99:3 | Entry | case.rb:97:8:97:8 | After x [match] | +| case.rb:95:1:99:3 | Entry | case.rb:97:8:97:8 | After x [no-match] | +| case.rb:95:1:99:3 | Entry | case.rb:97:13:97:18 | After ... == ... [false] | +| case.rb:95:1:99:3 | Entry | case.rb:97:13:97:18 | After ... == ... [true] | +| case.rb:96:3:98:5 | After case ... | case.rb:96:3:98:5 | After case ... | +| case.rb:97:8:97:8 | After x [match] | case.rb:97:8:97:8 | After x [match] | +| case.rb:97:8:97:8 | After x [match] | case.rb:97:13:97:18 | After ... == ... [false] | +| case.rb:97:8:97:8 | After x [match] | case.rb:97:13:97:18 | After ... == ... [true] | +| case.rb:97:8:97:8 | After x [no-match] | case.rb:97:8:97:8 | After x [no-match] | +| case.rb:97:13:97:18 | After ... == ... [false] | case.rb:97:13:97:18 | After ... == ... [false] | +| case.rb:97:13:97:18 | After ... == ... [true] | case.rb:97:13:97:18 | After ... == ... [true] | +| cfg.html.erb:5:16:31:12 | Entry | cfg.html.erb:5:16:31:12 | Entry | +| cfg.html.erb:5:16:31:12 | Entry | cfg.html.erb:18:14:22:16 | After if ... | +| cfg.html.erb:5:16:31:12 | Entry | cfg.html.erb:18:17:18:22 | After call to admin? [false] | +| cfg.html.erb:5:16:31:12 | Entry | cfg.html.erb:18:17:18:22 | After call to admin? [true] | +| cfg.html.erb:18:14:22:16 | After if ... | cfg.html.erb:18:14:22:16 | After if ... | +| cfg.html.erb:18:17:18:22 | After call to admin? [false] | cfg.html.erb:18:17:18:22 | After call to admin? [false] | +| cfg.html.erb:18:17:18:22 | After call to admin? [true] | cfg.html.erb:18:17:18:22 | After call to admin? [true] | +| cfg.html.erb:29:24:31:10 | Entry | cfg.html.erb:29:24:31:10 | Entry | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:1:1:221:1 | Exceptional Exit | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:1:1:221:1 | Exit | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:1:1:221:1 | Exceptional Exit | cfg.rb:1:1:221:1 | Exceptional Exit | +| cfg.rb:1:1:221:1 | Exit | cfg.rb:1:1:221:1 | Exit | +| cfg.rb:25:9:25:22 | Entry | cfg.rb:25:9:25:22 | Entry | +| cfg.rb:29:10:29:24 | Entry | cfg.rb:29:10:29:24 | Entry | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:1:1:221:1 | Exceptional Exit | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:1:1:221:1 | Exit | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:42:8:42:8 | After 1 [match] | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:43:3:43:31 | After when ... [match] | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:43:8:43:8 | After 2 [match] | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:43:8:43:8 | After 2 [no-match] | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:43:8:43:8 | After 2 [no-match] | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:43:8:43:8 | After 2 [no-match] | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:43:8:43:8 | After 2 [no-match] | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:43:8:43:8 | After 2 [no-match] | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:43:11:43:11 | After 3 [match] | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:43:11:43:11 | After 3 [no-match] | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:43:11:43:11 | After 3 [no-match] | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:43:11:43:11 | After 3 [no-match] | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:43:14:43:14 | After 4 [match] | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:43:14:43:14 | After 4 [no-match] | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:1:1:221:1 | Exceptional Exit | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:1:1:221:1 | Exit | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:48:8:48:13 | After ... == ... [match] | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:48:8:48:13 | After ... == ... [no-match] | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:48:8:48:13 | After ... == ... [no-match] | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:48:8:48:13 | After ... == ... [no-match] | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:48:8:48:13 | After ... == ... [no-match] | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:48:8:48:13 | After ... == ... [no-match] | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:48:8:48:13 | After ... == ... [no-match] | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:49:3:49:37 | After when ... [match] | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:49:8:49:13 | After ... == ... [match] | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:49:8:49:13 | After ... == ... [no-match] | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:49:8:49:13 | After ... == ... [no-match] | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:49:8:49:13 | After ... == ... [no-match] | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:49:16:49:20 | After ... > ... [match] | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:49:16:49:20 | After ... > ... [no-match] | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:60:17:60:22 | After ... < ... [false] | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:60:17:60:22 | After ... < ... [true] | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:1:1:221:1 | Exceptional Exit | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:1:1:221:1 | Exit | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:63:3:66:5 | Entry | cfg.rb:63:3:66:5 | Entry | +| cfg.rb:69:3:71:5 | Entry | cfg.rb:69:3:71:5 | Entry | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:1:1:221:1 | Exceptional Exit | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:1:1:221:1 | Exit | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:75:4:75:8 | After ... < ... [false] | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:75:4:75:8 | After ... < ... [false] | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:75:4:75:8 | After ... < ... [false] | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:75:4:75:8 | After ... < ... [false] | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:75:4:75:8 | After ... < ... [true] | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:75:17:75:43 | After elsif ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:75:23:75:28 | After ... > ... [false] | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:75:23:75:28 | After ... > ... [true] | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:90:1:93:3 | Entry | cfg.rb:90:1:93:3 | Entry | +| cfg.rb:90:1:93:3 | Entry | cfg.rb:90:1:93:3 | Normal Exit | +| cfg.rb:90:1:93:3 | Entry | cfg.rb:91:6:91:10 | After ... > ... [false] | +| cfg.rb:90:1:93:3 | Entry | cfg.rb:91:6:91:10 | After ... > ... [true] | +| cfg.rb:90:1:93:3 | Normal Exit | cfg.rb:90:1:93:3 | Normal Exit | +| cfg.rb:90:5:90:5 | After defined? ... [false] | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:90:5:90:5 | After defined? ... [true] | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:91:6:91:10 | After ... > ... [false] | cfg.rb:91:6:91:10 | After ... > ... [false] | +| cfg.rb:91:6:91:10 | After ... > ... [true] | cfg.rb:91:6:91:10 | After ... > ... [true] | +| cfg.rb:101:1:104:3 | Entry | cfg.rb:101:1:104:3 | Entry | +| cfg.rb:101:1:104:3 | Entry | cfg.rb:101:16:101:20 | After value [match] | +| cfg.rb:101:1:104:3 | Entry | cfg.rb:101:16:101:20 | After value [no-match] | +| cfg.rb:101:1:104:3 | Entry | cfg.rb:101:28:101:30 | key | +| cfg.rb:101:16:101:20 | After value [match] | cfg.rb:101:16:101:20 | After value [match] | +| cfg.rb:101:16:101:20 | After value [no-match] | cfg.rb:101:16:101:20 | After value [no-match] | | cfg.rb:101:28:101:30 | key | cfg.rb:101:28:101:30 | key | -| cfg.rb:113:1:113:9 | self | cfg.rb:113:1:113:9 | self | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:136:12:136:29 | self | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:172:21:172:29 | self | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:172:36:172:45 | self | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:174:1:174:9 | self | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:176:17:176:17 | x | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:179:2:179:13 | self | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:188:2:188:13 | self | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:205:1:205:3 | nil | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:120:8:120:28 | enter -> { ... } | cfg.rb:120:8:120:28 | enter -> { ... } | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:172:21:172:29 | self | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:172:36:172:45 | self | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:174:1:174:9 | self | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:176:17:176:17 | x | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:179:2:179:13 | self | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:188:2:188:13 | self | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:205:1:205:3 | nil | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:136:12:136:29 | self | cfg.rb:136:12:136:29 | self | -| cfg.rb:145:3:148:5 | enter print | cfg.rb:145:3:148:5 | enter print | -| cfg.rb:152:1:154:3 | enter method | cfg.rb:152:1:154:3 | enter method | -| cfg.rb:156:1:156:28 | enter two_parameters | cfg.rb:156:1:156:28 | enter two_parameters | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:174:1:174:9 | self | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:176:17:176:17 | x | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:179:2:179:13 | self | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:188:2:188:13 | self | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:205:1:205:3 | nil | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:172:21:172:29 | self | cfg.rb:172:21:172:29 | self | -| cfg.rb:172:36:172:45 | self | cfg.rb:172:36:172:45 | self | -| cfg.rb:174:1:174:9 | self | cfg.rb:174:1:174:9 | self | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:176:17:176:17 | x | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:179:2:179:13 | self | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:188:2:188:13 | self | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:205:1:205:3 | nil | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:179:2:179:13 | self | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:188:2:188:13 | self | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:205:1:205:3 | nil | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:176:7:176:7 | x | -| cfg.rb:176:7:176:7 | x | cfg.rb:176:17:176:17 | x | -| cfg.rb:176:7:176:7 | x | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:179:2:179:13 | self | -| cfg.rb:176:7:176:7 | x | cfg.rb:179:30:179:30 | i | -| cfg.rb:176:7:176:7 | x | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:182:7:182:7 | x | -| cfg.rb:176:7:176:7 | x | cfg.rb:183:3:183:3 | x | -| cfg.rb:176:7:176:7 | x | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:184:18:184:21 | redo | -| cfg.rb:176:7:176:7 | x | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:188:2:188:13 | self | -| cfg.rb:176:7:176:7 | x | cfg.rb:188:30:188:30 | i | -| cfg.rb:176:7:176:7 | x | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:176:7:176:7 | x | cfg.rb:205:1:205:3 | nil | -| cfg.rb:176:7:176:7 | x | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:176:17:176:17 | x | cfg.rb:176:17:176:17 | x | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:188:2:188:13 | self | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:205:1:205:3 | nil | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:179:2:179:13 | self | cfg.rb:179:2:179:13 | self | -| cfg.rb:179:30:179:30 | i | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:179:2:179:13 | self | -| cfg.rb:179:30:179:30 | i | cfg.rb:179:30:179:30 | i | -| cfg.rb:179:30:179:30 | i | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:182:7:182:7 | x | -| cfg.rb:179:30:179:30 | i | cfg.rb:183:3:183:3 | x | -| cfg.rb:179:30:179:30 | i | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:184:18:184:21 | redo | -| cfg.rb:179:30:179:30 | i | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:188:2:188:13 | self | -| cfg.rb:179:30:179:30 | i | cfg.rb:188:30:188:30 | i | -| cfg.rb:179:30:179:30 | i | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:179:30:179:30 | i | cfg.rb:205:1:205:3 | nil | -| cfg.rb:179:30:179:30 | i | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:188:2:188:13 | self | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:205:1:205:3 | nil | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:182:7:182:7 | x | -| cfg.rb:182:7:182:7 | x | cfg.rb:183:3:183:3 | x | -| cfg.rb:182:7:182:7 | x | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:184:18:184:21 | redo | -| cfg.rb:182:7:182:7 | x | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:188:2:188:13 | self | -| cfg.rb:182:7:182:7 | x | cfg.rb:188:30:188:30 | i | -| cfg.rb:182:7:182:7 | x | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:182:7:182:7 | x | cfg.rb:205:1:205:3 | nil | -| cfg.rb:182:7:182:7 | x | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:183:3:183:3 | x | cfg.rb:183:3:183:3 | x | -| cfg.rb:183:3:183:3 | x | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:183:3:183:3 | x | cfg.rb:184:18:184:21 | redo | -| cfg.rb:184:3:184:25 | if ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:184:18:184:21 | redo | cfg.rb:184:18:184:21 | redo | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:205:1:205:3 | nil | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:188:2:188:13 | self | cfg.rb:188:2:188:13 | self | -| cfg.rb:188:30:188:30 | i | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:188:2:188:13 | self | -| cfg.rb:188:30:188:30 | i | cfg.rb:188:30:188:30 | i | -| cfg.rb:188:30:188:30 | i | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:188:30:188:30 | i | cfg.rb:205:1:205:3 | nil | -| cfg.rb:188:30:188:30 | i | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:190:1:192:3 | enter run_block | cfg.rb:190:1:192:3 | enter run_block | -| cfg.rb:194:11:194:23 | enter { ... } | cfg.rb:194:11:194:23 | enter { ... } | -| cfg.rb:196:1:198:3 | enter forward_param | cfg.rb:196:1:198:3 | enter forward_param | -| cfg.rb:200:9:200:32 | enter { ... } | cfg.rb:200:9:200:32 | enter { ... } | -| cfg.rb:202:9:202:35 | enter do ... end | cfg.rb:202:9:202:35 | enter do ... end | -| cfg.rb:205:1:205:3 | __synth__0__1 | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:205:1:205:3 | nil | cfg.rb:205:1:205:3 | nil | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:205:15:205:23 | enter { ... } | cfg.rb:205:15:205:23 | enter { ... } | -| cfg.rb:207:1:211:3 | enter filter_nil | cfg.rb:207:1:211:3 | enter filter_nil | -| cfg.rb:208:15:210:5 | enter do ... end | cfg.rb:208:15:210:5 | enter do ... end | -| cfg.rb:213:14:216:3 | enter do ... end | cfg.rb:213:14:216:3 | enter do ... end | -| constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | -| constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | -| constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | constant_compound_assign.rb:5:22:5:24 | 123 | -| constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | -| constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | constant_compound_assign.rb:14:18:14:20 | 123 | -| constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | -| constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | constant_compound_assign.rb:19:21:19:23 | 123 | -| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | -| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | -| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:14:18:14:20 | 123 | -| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | -| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:19:21:19:23 | 123 | -| constant_compound_assign.rb:5:22:5:24 | 123 | constant_compound_assign.rb:5:22:5:24 | 123 | -| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | -| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | -| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:19:21:19:23 | 123 | -| constant_compound_assign.rb:14:18:14:20 | 123 | constant_compound_assign.rb:14:18:14:20 | 123 | -| constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | -| constant_compound_assign.rb:19:21:19:23 | 123 | constant_compound_assign.rb:19:21:19:23 | 123 | -| desugar.rb:1:1:3:3 | enter m1 | desugar.rb:1:1:3:3 | enter m1 | -| desugar.rb:1:1:38:17 | enter desugar.rb | desugar.rb:1:1:38:17 | enter desugar.rb | -| desugar.rb:5:1:7:3 | enter m2 | desugar.rb:5:1:7:3 | enter m2 | -| desugar.rb:9:1:11:3 | enter m3 | desugar.rb:9:1:11:3 | enter m3 | -| desugar.rb:13:1:15:3 | enter m4 | desugar.rb:13:1:15:3 | enter m4 | -| desugar.rb:17:1:19:3 | enter m5 | desugar.rb:17:1:19:3 | enter m5 | -| desugar.rb:21:1:23:3 | enter m6 | desugar.rb:21:1:23:3 | enter m6 | -| desugar.rb:25:1:27:3 | enter m7 | desugar.rb:25:1:27:3 | enter m7 | -| exit.rb:1:1:6:3 | enter m1 | exit.rb:1:1:6:3 | enter m1 | -| exit.rb:1:1:6:3 | enter m1 | exit.rb:1:1:6:3 | exit m1 | -| exit.rb:1:1:6:3 | enter m1 | exit.rb:2:3:4:5 | if ... | -| exit.rb:1:1:6:3 | enter m1 | exit.rb:3:5:3:10 | self | -| exit.rb:1:1:6:3 | exit m1 | exit.rb:1:1:6:3 | exit m1 | -| exit.rb:1:1:13:4 | enter exit.rb | exit.rb:1:1:13:4 | enter exit.rb | -| exit.rb:2:3:4:5 | if ... | exit.rb:2:3:4:5 | if ... | -| exit.rb:3:5:3:10 | self | exit.rb:3:5:3:10 | self | -| exit.rb:8:1:13:3 | enter m2 | exit.rb:8:1:13:3 | enter m2 | -| exit.rb:8:1:13:3 | enter m2 | exit.rb:8:1:13:3 | exit m2 | -| exit.rb:8:1:13:3 | enter m2 | exit.rb:9:3:11:5 | if ... | -| exit.rb:8:1:13:3 | enter m2 | exit.rb:10:5:10:18 | self | -| exit.rb:8:1:13:3 | exit m2 | exit.rb:8:1:13:3 | exit m2 | -| exit.rb:9:3:11:5 | if ... | exit.rb:9:3:11:5 | if ... | -| exit.rb:10:5:10:18 | self | exit.rb:10:5:10:18 | self | -| heredoc.rb:1:1:7:3 | enter double_heredoc | heredoc.rb:1:1:7:3 | enter double_heredoc | -| heredoc.rb:1:1:7:4 | enter heredoc.rb | heredoc.rb:1:1:7:4 | enter heredoc.rb | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:1:1:9:3 | enter m1 | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:2:3:8:5 | if ... | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:3:5:3:30 | self | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:3:7:35 | elsif ... | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:9:4:9 | x | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:9:4:24 | [false] ... and ... | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:9:4:24 | [true] ... and ... | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:9:4:38 | [false] ... and ... | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:9:4:38 | [true] ... and ... | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:20:4:20 | x | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:30:4:38 | [false] ! ... | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:30:4:38 | [true] ! ... | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:31:4:38 | [false] ( ... ) | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:31:4:38 | [true] ( ... ) | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:32:4:32 | x | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:5:5:5:17 | self | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:7:5:7:35 | self | -| ifs.rb:1:1:58:4 | enter ifs.rb | ifs.rb:1:1:58:4 | enter ifs.rb | -| ifs.rb:1:1:58:4 | enter ifs.rb | ifs.rb:36:1:38:3 | conditional_method_def | -| ifs.rb:1:1:58:4 | enter ifs.rb | ifs.rb:36:1:38:17 | ... unless ... | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:2:3:8:5 | if ... | -| ifs.rb:3:5:3:30 | self | ifs.rb:3:5:3:30 | self | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:4:3:7:35 | elsif ... | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:3:7:35 | elsif ... | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:9:4:9 | x | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:9:4:24 | [false] ... and ... | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:9:4:24 | [true] ... and ... | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:9:4:38 | [false] ... and ... | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:9:4:38 | [true] ... and ... | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:20:4:20 | x | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:30:4:38 | [false] ! ... | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:30:4:38 | [true] ! ... | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:31:4:38 | [false] ( ... ) | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:31:4:38 | [true] ( ... ) | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:32:4:32 | x | -| ifs.rb:4:9:4:9 | x | ifs.rb:5:5:5:17 | self | -| ifs.rb:4:9:4:9 | x | ifs.rb:7:5:7:35 | self | -| ifs.rb:4:9:4:24 | [false] ... and ... | ifs.rb:4:9:4:24 | [false] ... and ... | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:9:4:24 | [true] ... and ... | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:9:4:38 | [true] ... and ... | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:30:4:38 | [false] ! ... | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:30:4:38 | [true] ! ... | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:31:4:38 | [false] ( ... ) | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:31:4:38 | [true] ( ... ) | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:32:4:32 | x | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:5:5:5:17 | self | -| ifs.rb:4:9:4:38 | [false] ... and ... | ifs.rb:4:9:4:38 | [false] ... and ... | -| ifs.rb:4:9:4:38 | [false] ... and ... | ifs.rb:7:5:7:35 | self | -| ifs.rb:4:9:4:38 | [true] ... and ... | ifs.rb:4:9:4:38 | [true] ... and ... | -| ifs.rb:4:9:4:38 | [true] ... and ... | ifs.rb:5:5:5:17 | self | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:9:4:24 | [true] ... and ... | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:9:4:38 | [true] ... and ... | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:20:4:20 | x | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:30:4:38 | [false] ! ... | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:30:4:38 | [true] ! ... | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:31:4:38 | [false] ( ... ) | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:31:4:38 | [true] ( ... ) | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:32:4:32 | x | -| ifs.rb:4:20:4:20 | x | ifs.rb:5:5:5:17 | self | -| ifs.rb:4:30:4:38 | [false] ! ... | ifs.rb:4:30:4:38 | [false] ! ... | -| ifs.rb:4:30:4:38 | [true] ! ... | ifs.rb:4:9:4:38 | [true] ... and ... | -| ifs.rb:4:30:4:38 | [true] ! ... | ifs.rb:4:30:4:38 | [true] ! ... | -| ifs.rb:4:30:4:38 | [true] ! ... | ifs.rb:5:5:5:17 | self | -| ifs.rb:4:31:4:38 | [false] ( ... ) | ifs.rb:4:9:4:38 | [true] ... and ... | -| ifs.rb:4:31:4:38 | [false] ( ... ) | ifs.rb:4:30:4:38 | [true] ! ... | -| ifs.rb:4:31:4:38 | [false] ( ... ) | ifs.rb:4:31:4:38 | [false] ( ... ) | -| ifs.rb:4:31:4:38 | [false] ( ... ) | ifs.rb:5:5:5:17 | self | -| ifs.rb:4:31:4:38 | [true] ( ... ) | ifs.rb:4:30:4:38 | [false] ! ... | -| ifs.rb:4:31:4:38 | [true] ( ... ) | ifs.rb:4:31:4:38 | [true] ( ... ) | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:9:4:38 | [true] ... and ... | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:30:4:38 | [false] ! ... | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:30:4:38 | [true] ! ... | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:31:4:38 | [false] ( ... ) | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:31:4:38 | [true] ( ... ) | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:32:4:32 | x | -| ifs.rb:4:32:4:32 | x | ifs.rb:5:5:5:17 | self | -| ifs.rb:5:5:5:17 | self | ifs.rb:5:5:5:17 | self | -| ifs.rb:7:5:7:35 | self | ifs.rb:7:5:7:35 | self | -| ifs.rb:11:1:16:3 | enter m2 | ifs.rb:11:1:16:3 | enter m2 | -| ifs.rb:11:1:16:3 | enter m2 | ifs.rb:11:1:16:3 | exit m2 (normal) | -| ifs.rb:11:1:16:3 | enter m2 | ifs.rb:12:3:14:5 | if ... | -| ifs.rb:11:1:16:3 | enter m2 | ifs.rb:13:12:13:12 | 0 | -| ifs.rb:11:1:16:3 | exit m2 (normal) | ifs.rb:11:1:16:3 | exit m2 (normal) | -| ifs.rb:12:3:14:5 | if ... | ifs.rb:12:3:14:5 | if ... | -| ifs.rb:13:12:13:12 | 0 | ifs.rb:13:12:13:12 | 0 | -| ifs.rb:18:1:26:3 | enter m3 | ifs.rb:18:1:26:3 | enter m3 | -| ifs.rb:18:1:26:3 | enter m3 | ifs.rb:19:3:24:5 | if ... | -| ifs.rb:18:1:26:3 | enter m3 | ifs.rb:20:5:20:5 | x | -| ifs.rb:18:1:26:3 | enter m3 | ifs.rb:21:5:23:7 | if ... | -| ifs.rb:18:1:26:3 | enter m3 | ifs.rb:22:7:22:7 | x | -| ifs.rb:19:3:24:5 | if ... | ifs.rb:19:3:24:5 | if ... | -| ifs.rb:20:5:20:5 | x | ifs.rb:20:5:20:5 | x | -| ifs.rb:20:5:20:5 | x | ifs.rb:21:5:23:7 | if ... | -| ifs.rb:20:5:20:5 | x | ifs.rb:22:7:22:7 | x | -| ifs.rb:21:5:23:7 | if ... | ifs.rb:21:5:23:7 | if ... | -| ifs.rb:22:7:22:7 | x | ifs.rb:22:7:22:7 | x | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:28:1:30:3 | enter m4 | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:29:10:29:23 | [false] ( ... ) | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:29:10:29:23 | [true] ( ... ) | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:29:10:29:51 | ... ? ... : ... | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:29:11:29:22 | [false] ... ? ... : ... | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:29:11:29:22 | [true] ... ? ... : ... | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:29:16:29:17 | b2 | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:29:21:29:22 | b3 | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:29:28:29:35 | b2 \|\| b3 | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:29:41:29:50 | !b2 \|\| !b3 | -| ifs.rb:29:10:29:23 | [false] ( ... ) | ifs.rb:29:10:29:23 | [false] ( ... ) | -| ifs.rb:29:10:29:23 | [false] ( ... ) | ifs.rb:29:41:29:50 | !b2 \|\| !b3 | -| ifs.rb:29:10:29:23 | [true] ( ... ) | ifs.rb:29:10:29:23 | [true] ( ... ) | -| ifs.rb:29:10:29:23 | [true] ( ... ) | ifs.rb:29:28:29:35 | b2 \|\| b3 | -| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:29:10:29:51 | ... ? ... : ... | -| ifs.rb:29:11:29:22 | [false] ... ? ... : ... | ifs.rb:29:10:29:23 | [false] ( ... ) | -| ifs.rb:29:11:29:22 | [false] ... ? ... : ... | ifs.rb:29:11:29:22 | [false] ... ? ... : ... | -| ifs.rb:29:11:29:22 | [false] ... ? ... : ... | ifs.rb:29:41:29:50 | !b2 \|\| !b3 | -| ifs.rb:29:11:29:22 | [true] ... ? ... : ... | ifs.rb:29:10:29:23 | [true] ( ... ) | -| ifs.rb:29:11:29:22 | [true] ... ? ... : ... | ifs.rb:29:11:29:22 | [true] ... ? ... : ... | -| ifs.rb:29:11:29:22 | [true] ... ? ... : ... | ifs.rb:29:28:29:35 | b2 \|\| b3 | -| ifs.rb:29:16:29:17 | b2 | ifs.rb:29:16:29:17 | b2 | -| ifs.rb:29:21:29:22 | b3 | ifs.rb:29:21:29:22 | b3 | -| ifs.rb:29:28:29:35 | b2 \|\| b3 | ifs.rb:29:28:29:35 | b2 \|\| b3 | -| ifs.rb:29:41:29:50 | !b2 \|\| !b3 | ifs.rb:29:41:29:50 | !b2 \|\| !b3 | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:32:1:34:3 | enter m5 | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:3:33:100 | if ... | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:6:33:49 | [false] ( ... ) | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:6:33:49 | [true] ( ... ) | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:7:33:48 | [false] if ... | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:7:33:48 | [true] if ... | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:13:33:19 | [false] then ... | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:13:33:19 | [true] then ... | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:18:33:19 | b2 | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:21:33:44 | [false] elsif ... | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:21:33:44 | [true] elsif ... | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:27:33:28 | b3 | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:30:33:36 | [false] then ... | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:30:33:36 | [true] then ... | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:35:33:36 | b4 | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:38:33:44 | [false] else ... | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:38:33:44 | [true] else ... | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:43:33:44 | b5 | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:3:33:100 | if ... | -| ifs.rb:33:6:33:49 | [false] ( ... ) | ifs.rb:33:6:33:49 | [false] ( ... ) | -| ifs.rb:33:6:33:49 | [false] ( ... ) | ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | -| ifs.rb:33:6:33:49 | [true] ( ... ) | ifs.rb:33:6:33:49 | [true] ( ... ) | -| ifs.rb:33:6:33:49 | [true] ( ... ) | ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | -| ifs.rb:33:7:33:48 | [false] if ... | ifs.rb:33:6:33:49 | [false] ( ... ) | -| ifs.rb:33:7:33:48 | [false] if ... | ifs.rb:33:7:33:48 | [false] if ... | -| ifs.rb:33:7:33:48 | [false] if ... | ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | -| ifs.rb:33:7:33:48 | [true] if ... | ifs.rb:33:6:33:49 | [true] ( ... ) | -| ifs.rb:33:7:33:48 | [true] if ... | ifs.rb:33:7:33:48 | [true] if ... | -| ifs.rb:33:7:33:48 | [true] if ... | ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | -| ifs.rb:33:13:33:19 | [false] then ... | ifs.rb:33:13:33:19 | [false] then ... | -| ifs.rb:33:13:33:19 | [true] then ... | ifs.rb:33:13:33:19 | [true] then ... | -| ifs.rb:33:18:33:19 | b2 | ifs.rb:33:13:33:19 | [false] then ... | -| ifs.rb:33:18:33:19 | b2 | ifs.rb:33:13:33:19 | [true] then ... | -| ifs.rb:33:18:33:19 | b2 | ifs.rb:33:18:33:19 | b2 | -| ifs.rb:33:21:33:44 | [false] elsif ... | ifs.rb:33:21:33:44 | [false] elsif ... | -| ifs.rb:33:21:33:44 | [true] elsif ... | ifs.rb:33:21:33:44 | [true] elsif ... | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:21:33:44 | [false] elsif ... | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:21:33:44 | [true] elsif ... | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:27:33:28 | b3 | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:30:33:36 | [false] then ... | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:30:33:36 | [true] then ... | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:35:33:36 | b4 | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:38:33:44 | [false] else ... | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:38:33:44 | [true] else ... | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:43:33:44 | b5 | -| ifs.rb:33:30:33:36 | [false] then ... | ifs.rb:33:30:33:36 | [false] then ... | -| ifs.rb:33:30:33:36 | [true] then ... | ifs.rb:33:30:33:36 | [true] then ... | -| ifs.rb:33:35:33:36 | b4 | ifs.rb:33:30:33:36 | [false] then ... | -| ifs.rb:33:35:33:36 | b4 | ifs.rb:33:30:33:36 | [true] then ... | -| ifs.rb:33:35:33:36 | b4 | ifs.rb:33:35:33:36 | b4 | -| ifs.rb:33:38:33:44 | [false] else ... | ifs.rb:33:38:33:44 | [false] else ... | -| ifs.rb:33:38:33:44 | [true] else ... | ifs.rb:33:38:33:44 | [true] else ... | -| ifs.rb:33:43:33:44 | b5 | ifs.rb:33:38:33:44 | [false] else ... | -| ifs.rb:33:43:33:44 | b5 | ifs.rb:33:38:33:44 | [true] else ... | -| ifs.rb:33:43:33:44 | b5 | ifs.rb:33:43:33:44 | b5 | -| ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | -| ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | -| ifs.rb:36:1:38:3 | conditional_method_def | ifs.rb:36:1:38:3 | conditional_method_def | -| ifs.rb:36:1:38:3 | enter conditional_method_def | ifs.rb:36:1:38:3 | enter conditional_method_def | -| ifs.rb:36:1:38:17 | ... unless ... | ifs.rb:36:1:38:17 | ... unless ... | -| ifs.rb:40:1:44:3 | enter constant_condition | ifs.rb:40:1:44:3 | enter constant_condition | -| ifs.rb:40:1:44:3 | enter constant_condition | ifs.rb:41:3:43:5 | if ... | -| ifs.rb:40:1:44:3 | enter constant_condition | ifs.rb:41:6:41:10 | [false] ! ... | -| ifs.rb:41:3:43:5 | if ... | ifs.rb:41:3:43:5 | if ... | -| ifs.rb:41:6:41:10 | [false] ! ... | ifs.rb:41:3:43:5 | if ... | -| ifs.rb:41:6:41:10 | [false] ! ... | ifs.rb:41:6:41:10 | [false] ! ... | -| ifs.rb:46:1:52:3 | enter empty_else | ifs.rb:46:1:52:3 | enter empty_else | -| ifs.rb:46:1:52:3 | enter empty_else | ifs.rb:47:3:50:5 | if ... | -| ifs.rb:46:1:52:3 | enter empty_else | ifs.rb:48:5:48:15 | self | -| ifs.rb:46:1:52:3 | enter empty_else | ifs.rb:49:3:49:6 | else ... | -| ifs.rb:47:3:50:5 | if ... | ifs.rb:47:3:50:5 | if ... | -| ifs.rb:48:5:48:15 | self | ifs.rb:48:5:48:15 | self | -| ifs.rb:49:3:49:6 | else ... | ifs.rb:49:3:49:6 | else ... | -| ifs.rb:54:1:58:3 | enter disjunct | ifs.rb:54:1:58:3 | enter disjunct | -| ifs.rb:54:1:58:3 | enter disjunct | ifs.rb:55:3:57:5 | if ... | -| ifs.rb:54:1:58:3 | enter disjunct | ifs.rb:55:6:55:15 | [false] ( ... ) | -| ifs.rb:54:1:58:3 | enter disjunct | ifs.rb:55:6:55:15 | [true] ( ... ) | -| ifs.rb:54:1:58:3 | enter disjunct | ifs.rb:55:7:55:14 | [false] ... \|\| ... | -| ifs.rb:54:1:58:3 | enter disjunct | ifs.rb:55:7:55:14 | [true] ... \|\| ... | -| ifs.rb:54:1:58:3 | enter disjunct | ifs.rb:55:13:55:14 | b2 | -| ifs.rb:54:1:58:3 | enter disjunct | ifs.rb:56:5:56:19 | self | -| ifs.rb:55:3:57:5 | if ... | ifs.rb:55:3:57:5 | if ... | -| ifs.rb:55:6:55:15 | [false] ( ... ) | ifs.rb:55:6:55:15 | [false] ( ... ) | -| ifs.rb:55:6:55:15 | [true] ( ... ) | ifs.rb:55:6:55:15 | [true] ( ... ) | -| ifs.rb:55:6:55:15 | [true] ( ... ) | ifs.rb:56:5:56:19 | self | -| ifs.rb:55:7:55:14 | [false] ... \|\| ... | ifs.rb:55:6:55:15 | [false] ( ... ) | -| ifs.rb:55:7:55:14 | [false] ... \|\| ... | ifs.rb:55:7:55:14 | [false] ... \|\| ... | -| ifs.rb:55:7:55:14 | [true] ... \|\| ... | ifs.rb:55:6:55:15 | [true] ( ... ) | -| ifs.rb:55:7:55:14 | [true] ... \|\| ... | ifs.rb:55:7:55:14 | [true] ... \|\| ... | -| ifs.rb:55:7:55:14 | [true] ... \|\| ... | ifs.rb:56:5:56:19 | self | -| ifs.rb:55:13:55:14 | b2 | ifs.rb:55:6:55:15 | [false] ( ... ) | -| ifs.rb:55:13:55:14 | b2 | ifs.rb:55:7:55:14 | [false] ... \|\| ... | -| ifs.rb:55:13:55:14 | b2 | ifs.rb:55:13:55:14 | b2 | -| ifs.rb:56:5:56:19 | self | ifs.rb:56:5:56:19 | self | -| loops.rb:1:1:6:3 | enter m1 | loops.rb:1:1:6:3 | enter m1 | -| loops.rb:1:1:6:3 | enter m1 | loops.rb:2:3:5:5 | while ... | -| loops.rb:1:1:6:3 | enter m1 | loops.rb:2:9:2:9 | x | -| loops.rb:1:1:6:3 | enter m1 | loops.rb:3:5:3:10 | self | -| loops.rb:1:1:33:4 | enter loops.rb | loops.rb:1:1:33:4 | enter loops.rb | -| loops.rb:2:3:5:5 | while ... | loops.rb:2:3:5:5 | while ... | -| loops.rb:2:9:2:9 | x | loops.rb:2:3:5:5 | while ... | -| loops.rb:2:9:2:9 | x | loops.rb:2:9:2:9 | x | -| loops.rb:2:9:2:9 | x | loops.rb:3:5:3:10 | self | -| loops.rb:3:5:3:10 | self | loops.rb:3:5:3:10 | self | -| loops.rb:8:1:22:3 | enter m2 | loops.rb:8:1:22:3 | enter m2 | -| loops.rb:8:1:22:3 | enter m2 | loops.rb:9:3:20:5 | while ... | -| loops.rb:8:1:22:3 | enter m2 | loops.rb:9:9:9:9 | x | -| loops.rb:8:1:22:3 | enter m2 | loops.rb:10:5:10:10 | self | -| loops.rb:8:1:22:3 | enter m2 | loops.rb:13:7:13:11 | break | -| loops.rb:8:1:22:3 | enter m2 | loops.rb:14:11:14:11 | x | -| loops.rb:8:1:22:3 | enter m2 | loops.rb:15:7:15:10 | next | -| loops.rb:8:1:22:3 | enter m2 | loops.rb:16:5:17:10 | elsif ... | -| loops.rb:8:1:22:3 | enter m2 | loops.rb:16:11:16:11 | x | -| loops.rb:8:1:22:3 | enter m2 | loops.rb:17:7:17:10 | redo | -| loops.rb:9:3:20:5 | while ... | loops.rb:9:3:20:5 | while ... | -| loops.rb:9:9:9:9 | x | loops.rb:9:3:20:5 | while ... | -| loops.rb:9:9:9:9 | x | loops.rb:9:9:9:9 | x | -| loops.rb:9:9:9:9 | x | loops.rb:10:5:10:10 | self | -| loops.rb:9:9:9:9 | x | loops.rb:13:7:13:11 | break | -| loops.rb:9:9:9:9 | x | loops.rb:14:11:14:11 | x | -| loops.rb:9:9:9:9 | x | loops.rb:15:7:15:10 | next | -| loops.rb:9:9:9:9 | x | loops.rb:16:5:17:10 | elsif ... | -| loops.rb:9:9:9:9 | x | loops.rb:16:11:16:11 | x | -| loops.rb:9:9:9:9 | x | loops.rb:17:7:17:10 | redo | -| loops.rb:10:5:10:10 | self | loops.rb:10:5:10:10 | self | -| loops.rb:10:5:10:10 | self | loops.rb:13:7:13:11 | break | -| loops.rb:10:5:10:10 | self | loops.rb:14:11:14:11 | x | -| loops.rb:10:5:10:10 | self | loops.rb:15:7:15:10 | next | -| loops.rb:10:5:10:10 | self | loops.rb:16:5:17:10 | elsif ... | -| loops.rb:10:5:10:10 | self | loops.rb:16:11:16:11 | x | -| loops.rb:10:5:10:10 | self | loops.rb:17:7:17:10 | redo | -| loops.rb:13:7:13:11 | break | loops.rb:13:7:13:11 | break | -| loops.rb:14:11:14:11 | x | loops.rb:14:11:14:11 | x | -| loops.rb:14:11:14:11 | x | loops.rb:15:7:15:10 | next | -| loops.rb:14:11:14:11 | x | loops.rb:16:5:17:10 | elsif ... | -| loops.rb:14:11:14:11 | x | loops.rb:16:11:16:11 | x | -| loops.rb:14:11:14:11 | x | loops.rb:17:7:17:10 | redo | -| loops.rb:15:7:15:10 | next | loops.rb:15:7:15:10 | next | -| loops.rb:16:5:17:10 | elsif ... | loops.rb:16:5:17:10 | elsif ... | -| loops.rb:16:11:16:11 | x | loops.rb:16:5:17:10 | elsif ... | -| loops.rb:16:11:16:11 | x | loops.rb:16:11:16:11 | x | -| loops.rb:16:11:16:11 | x | loops.rb:17:7:17:10 | redo | -| loops.rb:17:7:17:10 | redo | loops.rb:17:7:17:10 | redo | -| loops.rb:24:1:28:3 | enter m3 | loops.rb:24:1:28:3 | enter m3 | -| loops.rb:25:16:27:5 | enter do ... end | loops.rb:25:16:27:5 | enter do ... end | -| loops.rb:30:1:33:3 | enter m4 | loops.rb:30:1:33:3 | enter m4 | -| loops.rb:30:1:33:3 | enter m4 | loops.rb:31:3:32:5 | while ... | -| loops.rb:30:1:33:3 | enter m4 | loops.rb:31:9:31:9 | x | -| loops.rb:30:1:33:3 | enter m4 | loops.rb:31:15:32:5 | do ... | -| loops.rb:31:3:32:5 | while ... | loops.rb:31:3:32:5 | while ... | -| loops.rb:31:9:31:9 | x | loops.rb:31:3:32:5 | while ... | -| loops.rb:31:9:31:9 | x | loops.rb:31:9:31:9 | x | -| loops.rb:31:9:31:9 | x | loops.rb:31:15:32:5 | do ... | -| loops.rb:31:15:32:5 | do ... | loops.rb:31:15:32:5 | do ... | -| raise.rb:1:1:182:4 | enter raise.rb | raise.rb:1:1:182:4 | enter raise.rb | -| raise.rb:7:1:12:3 | enter m1 | raise.rb:7:1:12:3 | enter m1 | -| raise.rb:7:1:12:3 | enter m1 | raise.rb:7:1:12:3 | exit m1 | -| raise.rb:7:1:12:3 | enter m1 | raise.rb:8:3:10:5 | if ... | -| raise.rb:7:1:12:3 | enter m1 | raise.rb:9:5:9:17 | self | -| raise.rb:7:1:12:3 | exit m1 | raise.rb:7:1:12:3 | exit m1 | -| raise.rb:8:3:10:5 | if ... | raise.rb:8:3:10:5 | if ... | -| raise.rb:9:5:9:17 | self | raise.rb:9:5:9:17 | self | -| raise.rb:14:1:23:3 | enter m2 | raise.rb:14:1:23:3 | enter m2 | -| raise.rb:14:1:23:3 | enter m2 | raise.rb:14:1:23:3 | exit m2 | -| raise.rb:14:1:23:3 | enter m2 | raise.rb:14:1:23:3 | exit m2 (abnormal) | -| raise.rb:14:1:23:3 | enter m2 | raise.rb:16:5:18:7 | if ... | -| raise.rb:14:1:23:3 | enter m2 | raise.rb:17:7:17:22 | self | -| raise.rb:14:1:23:3 | enter m2 | raise.rb:20:5:20:18 | self | -| raise.rb:14:1:23:3 | enter m2 | raise.rb:22:3:22:15 | self | -| raise.rb:14:1:23:3 | exit m2 | raise.rb:14:1:23:3 | exit m2 | -| raise.rb:14:1:23:3 | exit m2 (abnormal) | raise.rb:14:1:23:3 | exit m2 (abnormal) | -| raise.rb:16:5:18:7 | if ... | raise.rb:16:5:18:7 | if ... | -| raise.rb:17:7:17:22 | self | raise.rb:14:1:23:3 | exit m2 (abnormal) | -| raise.rb:17:7:17:22 | self | raise.rb:17:7:17:22 | self | -| raise.rb:17:7:17:22 | self | raise.rb:20:5:20:18 | self | -| raise.rb:20:5:20:18 | self | raise.rb:20:5:20:18 | self | -| raise.rb:22:3:22:15 | self | raise.rb:22:3:22:15 | self | -| raise.rb:25:1:34:3 | enter m3 | raise.rb:25:1:34:3 | enter m3 | -| raise.rb:25:1:34:3 | enter m3 | raise.rb:27:5:29:7 | if ... | -| raise.rb:25:1:34:3 | enter m3 | raise.rb:28:7:28:22 | self | -| raise.rb:25:1:34:3 | enter m3 | raise.rb:33:3:33:15 | self | -| raise.rb:27:5:29:7 | if ... | raise.rb:27:5:29:7 | if ... | -| raise.rb:28:7:28:22 | self | raise.rb:28:7:28:22 | self | -| raise.rb:33:3:33:15 | self | raise.rb:33:3:33:15 | self | -| raise.rb:36:1:45:3 | enter m4 | raise.rb:36:1:45:3 | enter m4 | -| raise.rb:36:1:45:3 | enter m4 | raise.rb:38:5:40:7 | if ... | -| raise.rb:36:1:45:3 | enter m4 | raise.rb:39:7:39:22 | self | -| raise.rb:36:1:45:3 | enter m4 | raise.rb:44:3:44:15 | self | -| raise.rb:38:5:40:7 | if ... | raise.rb:38:5:40:7 | if ... | -| raise.rb:39:7:39:22 | self | raise.rb:39:7:39:22 | self | -| raise.rb:44:3:44:15 | self | raise.rb:44:3:44:15 | self | -| raise.rb:47:1:55:3 | enter m5 | raise.rb:47:1:55:3 | enter m5 | -| raise.rb:47:1:55:3 | enter m5 | raise.rb:49:5:51:7 | if ... | -| raise.rb:47:1:55:3 | enter m5 | raise.rb:50:7:50:22 | self | -| raise.rb:47:1:55:3 | enter m5 | raise.rb:54:3:54:15 | self | -| raise.rb:49:5:51:7 | if ... | raise.rb:49:5:51:7 | if ... | -| raise.rb:50:7:50:22 | self | raise.rb:50:7:50:22 | self | -| raise.rb:54:3:54:15 | self | raise.rb:54:3:54:15 | self | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:57:1:66:3 | enter m6 | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:57:1:66:3 | exit m6 | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:57:1:66:3 | exit m6 (abnormal) | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:59:5:61:7 | if ... | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:60:7:60:22 | self | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:62:22:62:31 | ExceptionB | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:62:36:62:36 | e | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:65:3:65:15 | self | -| raise.rb:57:1:66:3 | exit m6 | raise.rb:57:1:66:3 | exit m6 | -| raise.rb:57:1:66:3 | exit m6 (abnormal) | raise.rb:57:1:66:3 | exit m6 (abnormal) | -| raise.rb:59:5:61:7 | if ... | raise.rb:59:5:61:7 | if ... | -| raise.rb:60:7:60:22 | self | raise.rb:57:1:66:3 | exit m6 (abnormal) | -| raise.rb:60:7:60:22 | self | raise.rb:60:7:60:22 | self | -| raise.rb:60:7:60:22 | self | raise.rb:62:22:62:31 | ExceptionB | -| raise.rb:60:7:60:22 | self | raise.rb:62:36:62:36 | e | -| raise.rb:62:22:62:31 | ExceptionB | raise.rb:57:1:66:3 | exit m6 (abnormal) | -| raise.rb:62:22:62:31 | ExceptionB | raise.rb:62:22:62:31 | ExceptionB | -| raise.rb:62:36:62:36 | e | raise.rb:62:36:62:36 | e | -| raise.rb:65:3:65:15 | self | raise.rb:65:3:65:15 | self | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:68:1:77:3 | enter m7 | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:68:1:77:3 | exit m7 | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:68:1:77:3 | exit m7 (normal) | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:70:5:70:17 | self | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:71:3:72:18 | elsif ... | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:71:9:71:9 | x | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:72:13:72:17 | x < 0 | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:76:3:76:15 | [ensure: exception] self | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:76:3:76:15 | self | -| raise.rb:68:1:77:3 | exit m7 | raise.rb:68:1:77:3 | exit m7 | -| raise.rb:68:1:77:3 | exit m7 (normal) | raise.rb:68:1:77:3 | exit m7 (normal) | -| raise.rb:70:5:70:17 | self | raise.rb:70:5:70:17 | self | -| raise.rb:71:3:72:18 | elsif ... | raise.rb:71:3:72:18 | elsif ... | -| raise.rb:71:3:72:18 | elsif ... | raise.rb:76:3:76:15 | self | -| raise.rb:71:9:71:9 | x | raise.rb:68:1:77:3 | exit m7 (normal) | -| raise.rb:71:9:71:9 | x | raise.rb:71:3:72:18 | elsif ... | -| raise.rb:71:9:71:9 | x | raise.rb:71:9:71:9 | x | -| raise.rb:71:9:71:9 | x | raise.rb:72:13:72:17 | x < 0 | -| raise.rb:71:9:71:9 | x | raise.rb:76:3:76:15 | self | -| raise.rb:72:13:72:17 | x < 0 | raise.rb:72:13:72:17 | x < 0 | -| raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:76:3:76:15 | [ensure: exception] self | -| raise.rb:76:3:76:15 | self | raise.rb:76:3:76:15 | self | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:79:1:92:3 | enter m8 | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:79:1:92:3 | exit m8 | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:79:1:92:3 | exit m8 (normal) | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:83:7:83:19 | self | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:84:5:85:20 | elsif ... | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:84:11:84:11 | x | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:85:15:85:19 | x < 0 | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:89:5:89:17 | [ensure: exception] self | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:89:5:89:17 | self | -| raise.rb:79:1:92:3 | exit m8 | raise.rb:79:1:92:3 | exit m8 | -| raise.rb:79:1:92:3 | exit m8 (normal) | raise.rb:79:1:92:3 | exit m8 (normal) | -| raise.rb:83:7:83:19 | self | raise.rb:83:7:83:19 | self | -| raise.rb:84:5:85:20 | elsif ... | raise.rb:84:5:85:20 | elsif ... | -| raise.rb:84:5:85:20 | elsif ... | raise.rb:89:5:89:17 | self | -| raise.rb:84:11:84:11 | x | raise.rb:79:1:92:3 | exit m8 (normal) | -| raise.rb:84:11:84:11 | x | raise.rb:84:5:85:20 | elsif ... | -| raise.rb:84:11:84:11 | x | raise.rb:84:11:84:11 | x | -| raise.rb:84:11:84:11 | x | raise.rb:85:15:85:19 | x < 0 | -| raise.rb:84:11:84:11 | x | raise.rb:89:5:89:17 | self | -| raise.rb:85:15:85:19 | x < 0 | raise.rb:85:15:85:19 | x < 0 | -| raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:89:5:89:17 | [ensure: exception] self | -| raise.rb:89:5:89:17 | self | raise.rb:89:5:89:17 | self | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:94:1:119:3 | enter m9 | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:94:1:119:3 | exit m9 | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:94:1:119:3 | exit m9 (abnormal) | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:94:1:119:3 | exit m9 (normal) | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:97:8:97:8 | x | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:98:7:98:19 | self | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:99:5:100:20 | elsif ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:99:11:99:11 | x | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:100:15:100:19 | x < 0 | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:104:5:104:23 | [ensure: exception] self | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:104:5:104:23 | self | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:106:7:108:9 | [ensure: exception] if ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:106:7:108:9 | [ensure: return] if ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:106:7:108:9 | if ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:106:10:106:11 | [ensure: exception] b1 | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:106:10:106:11 | [ensure: return] b1 | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:106:10:106:11 | b1 | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:107:9:107:26 | [ensure: exception] self | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:107:9:107:26 | [ensure: return] self | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:107:9:107:26 | self | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | [ensure: return] ensure ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:115:3:115:22 | [ensure: exception] self | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:115:3:115:22 | self | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:116:3:118:5 | [ensure: exception] if ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:116:3:118:5 | [ensure: return] if ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:116:3:118:5 | if ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:117:5:117:22 | [ensure: exception] self | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:117:5:117:22 | [ensure: return] self | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:117:5:117:22 | self | -| raise.rb:94:1:119:3 | exit m9 | raise.rb:94:1:119:3 | exit m9 | -| raise.rb:94:1:119:3 | exit m9 (abnormal) | raise.rb:94:1:119:3 | exit m9 (abnormal) | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:94:1:119:3 | exit m9 (normal) | -| raise.rb:97:8:97:8 | x | raise.rb:94:1:119:3 | exit m9 (normal) | -| raise.rb:97:8:97:8 | x | raise.rb:97:8:97:8 | x | -| raise.rb:97:8:97:8 | x | raise.rb:98:7:98:19 | self | -| raise.rb:97:8:97:8 | x | raise.rb:99:5:100:20 | elsif ... | -| raise.rb:97:8:97:8 | x | raise.rb:99:11:99:11 | x | -| raise.rb:97:8:97:8 | x | raise.rb:100:15:100:19 | x < 0 | -| raise.rb:97:8:97:8 | x | raise.rb:104:5:104:23 | [ensure: exception] self | -| raise.rb:97:8:97:8 | x | raise.rb:104:5:104:23 | self | -| raise.rb:97:8:97:8 | x | raise.rb:106:7:108:9 | [ensure: exception] if ... | -| raise.rb:97:8:97:8 | x | raise.rb:106:7:108:9 | [ensure: return] if ... | -| raise.rb:97:8:97:8 | x | raise.rb:106:7:108:9 | if ... | -| raise.rb:97:8:97:8 | x | raise.rb:106:10:106:11 | [ensure: exception] b1 | -| raise.rb:97:8:97:8 | x | raise.rb:106:10:106:11 | [ensure: return] b1 | -| raise.rb:97:8:97:8 | x | raise.rb:106:10:106:11 | b1 | -| raise.rb:97:8:97:8 | x | raise.rb:107:9:107:26 | [ensure: exception] self | -| raise.rb:97:8:97:8 | x | raise.rb:107:9:107:26 | [ensure: return] self | -| raise.rb:97:8:97:8 | x | raise.rb:107:9:107:26 | self | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: return] ensure ... | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:97:8:97:8 | x | raise.rb:115:3:115:22 | self | -| raise.rb:97:8:97:8 | x | raise.rb:116:3:118:5 | [ensure: return] if ... | -| raise.rb:97:8:97:8 | x | raise.rb:116:3:118:5 | if ... | -| raise.rb:97:8:97:8 | x | raise.rb:117:5:117:22 | [ensure: return] self | -| raise.rb:97:8:97:8 | x | raise.rb:117:5:117:22 | self | -| raise.rb:98:7:98:19 | self | raise.rb:98:7:98:19 | self | -| raise.rb:99:5:100:20 | elsif ... | raise.rb:99:5:100:20 | elsif ... | -| raise.rb:99:5:100:20 | elsif ... | raise.rb:104:5:104:23 | self | -| raise.rb:99:5:100:20 | elsif ... | raise.rb:106:7:108:9 | if ... | -| raise.rb:99:5:100:20 | elsif ... | raise.rb:106:10:106:11 | b1 | -| raise.rb:99:5:100:20 | elsif ... | raise.rb:107:9:107:26 | self | -| raise.rb:99:5:100:20 | elsif ... | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | -| raise.rb:99:5:100:20 | elsif ... | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:99:5:100:20 | elsif ... | raise.rb:115:3:115:22 | self | -| raise.rb:99:5:100:20 | elsif ... | raise.rb:116:3:118:5 | if ... | -| raise.rb:99:5:100:20 | elsif ... | raise.rb:117:5:117:22 | self | -| raise.rb:99:11:99:11 | x | raise.rb:94:1:119:3 | exit m9 (normal) | -| raise.rb:99:11:99:11 | x | raise.rb:99:5:100:20 | elsif ... | -| raise.rb:99:11:99:11 | x | raise.rb:99:11:99:11 | x | -| raise.rb:99:11:99:11 | x | raise.rb:100:15:100:19 | x < 0 | -| raise.rb:99:11:99:11 | x | raise.rb:104:5:104:23 | self | -| raise.rb:99:11:99:11 | x | raise.rb:106:7:108:9 | [ensure: return] if ... | -| raise.rb:99:11:99:11 | x | raise.rb:106:7:108:9 | if ... | -| raise.rb:99:11:99:11 | x | raise.rb:106:10:106:11 | [ensure: return] b1 | -| raise.rb:99:11:99:11 | x | raise.rb:106:10:106:11 | b1 | -| raise.rb:99:11:99:11 | x | raise.rb:107:9:107:26 | [ensure: return] self | -| raise.rb:99:11:99:11 | x | raise.rb:107:9:107:26 | self | -| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | -| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | -| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure: return] ensure ... | -| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:99:11:99:11 | x | raise.rb:115:3:115:22 | self | -| raise.rb:99:11:99:11 | x | raise.rb:116:3:118:5 | [ensure: return] if ... | -| raise.rb:99:11:99:11 | x | raise.rb:116:3:118:5 | if ... | -| raise.rb:99:11:99:11 | x | raise.rb:117:5:117:22 | [ensure: return] self | -| raise.rb:99:11:99:11 | x | raise.rb:117:5:117:22 | self | -| raise.rb:100:15:100:19 | x < 0 | raise.rb:100:15:100:19 | x < 0 | -| raise.rb:100:15:100:19 | x < 0 | raise.rb:106:7:108:9 | [ensure: return] if ... | -| raise.rb:100:15:100:19 | x < 0 | raise.rb:106:10:106:11 | [ensure: return] b1 | -| raise.rb:100:15:100:19 | x < 0 | raise.rb:107:9:107:26 | [ensure: return] self | -| raise.rb:100:15:100:19 | x < 0 | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | -| raise.rb:100:15:100:19 | x < 0 | raise.rb:109:5:110:25 | [ensure: return] ensure ... | -| raise.rb:100:15:100:19 | x < 0 | raise.rb:116:3:118:5 | [ensure: return] if ... | -| raise.rb:100:15:100:19 | x < 0 | raise.rb:117:5:117:22 | [ensure: return] self | -| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:104:5:104:23 | [ensure: exception] self | -| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:106:7:108:9 | [ensure: exception] if ... | -| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:106:10:106:11 | [ensure: exception] b1 | -| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:107:9:107:26 | [ensure: exception] self | -| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | -| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | -| raise.rb:104:5:104:23 | self | raise.rb:104:5:104:23 | self | -| raise.rb:104:5:104:23 | self | raise.rb:106:7:108:9 | if ... | -| raise.rb:104:5:104:23 | self | raise.rb:106:10:106:11 | b1 | -| raise.rb:104:5:104:23 | self | raise.rb:107:9:107:26 | self | -| raise.rb:104:5:104:23 | self | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | -| raise.rb:104:5:104:23 | self | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:104:5:104:23 | self | raise.rb:115:3:115:22 | self | -| raise.rb:104:5:104:23 | self | raise.rb:116:3:118:5 | if ... | -| raise.rb:104:5:104:23 | self | raise.rb:117:5:117:22 | self | -| raise.rb:106:7:108:9 | [ensure: exception] if ... | raise.rb:106:7:108:9 | [ensure: exception] if ... | -| raise.rb:106:7:108:9 | [ensure: exception] if ... | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | -| raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:106:7:108:9 | [ensure: return] if ... | -| raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:109:5:110:25 | [ensure: return] ensure ... | -| raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:116:3:118:5 | [ensure: return] if ... | -| raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:117:5:117:22 | [ensure: return] self | -| raise.rb:106:7:108:9 | if ... | raise.rb:106:7:108:9 | if ... | -| raise.rb:106:7:108:9 | if ... | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:106:7:108:9 | if ... | raise.rb:115:3:115:22 | self | -| raise.rb:106:7:108:9 | if ... | raise.rb:116:3:118:5 | if ... | -| raise.rb:106:7:108:9 | if ... | raise.rb:117:5:117:22 | self | -| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:106:7:108:9 | [ensure: exception] if ... | -| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:106:10:106:11 | [ensure: exception] b1 | -| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:107:9:107:26 | [ensure: exception] self | -| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | -| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:106:7:108:9 | [ensure: return] if ... | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:106:10:106:11 | [ensure: return] b1 | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:107:9:107:26 | [ensure: return] self | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:109:5:110:25 | [ensure: return] ensure ... | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:116:3:118:5 | [ensure: return] if ... | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:117:5:117:22 | [ensure: return] self | -| raise.rb:106:10:106:11 | b1 | raise.rb:106:7:108:9 | if ... | -| raise.rb:106:10:106:11 | b1 | raise.rb:106:10:106:11 | b1 | -| raise.rb:106:10:106:11 | b1 | raise.rb:107:9:107:26 | self | -| raise.rb:106:10:106:11 | b1 | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | -| raise.rb:106:10:106:11 | b1 | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:106:10:106:11 | b1 | raise.rb:115:3:115:22 | self | -| raise.rb:106:10:106:11 | b1 | raise.rb:116:3:118:5 | if ... | -| raise.rb:106:10:106:11 | b1 | raise.rb:117:5:117:22 | self | -| raise.rb:107:9:107:26 | [ensure: exception] self | raise.rb:107:9:107:26 | [ensure: exception] self | -| raise.rb:107:9:107:26 | [ensure: exception] self | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | -| raise.rb:107:9:107:26 | [ensure: return] self | raise.rb:107:9:107:26 | [ensure: return] self | -| raise.rb:107:9:107:26 | [ensure: return] self | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | -| raise.rb:107:9:107:26 | self | raise.rb:107:9:107:26 | self | -| raise.rb:107:9:107:26 | self | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | -| raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | -| raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | -| raise.rb:109:5:110:25 | [ensure: exception] ensure ... | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | -| raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | -| raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:109:5:110:25 | [ensure: return] ensure ... | -| raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:116:3:118:5 | [ensure: return] if ... | -| raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:117:5:117:22 | [ensure: return] self | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:113:14:113:19 | After ... > ... [false] | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:113:14:113:19 | After ... > ... [true] | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:120:8:120:28 | Entry | cfg.rb:120:8:120:28 | Entry | +| cfg.rb:136:1:136:3 | After ... / ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:136:12:136:29 | Before call to puts | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:145:3:148:5 | Entry | cfg.rb:145:3:148:5 | Entry | +| cfg.rb:152:1:154:3 | Entry | cfg.rb:152:1:154:3 | Entry | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:172:8:172:14 | After ... == ... [false] | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:172:8:172:14 | After ... == ... [true] | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:174:18:174:23 | After ... == ... [false] | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:174:18:174:23 | After ... == ... [true] | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:176:7:176:12 | After ... > ... [false] | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:179:30:179:36 | After ... == ... [false] | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:182:7:182:12 | After ... < ... [true] | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:182:7:182:12 | After ... < ... [true] | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:182:7:182:12 | After ... < ... [true] | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:182:7:182:12 | After ... < ... [true] | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:182:14:186:3 | do ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:182:14:186:3 | do ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:182:14:186:3 | do ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:184:6:184:11 | After ... == ... [false] | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:184:6:184:11 | After ... == ... [true] | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:188:30:188:35 | After ... != ... [true] | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:190:1:192:3 | Entry | cfg.rb:190:1:192:3 | Entry | +| cfg.rb:194:11:194:23 | Entry | cfg.rb:194:11:194:23 | Entry | +| cfg.rb:196:1:198:3 | Entry | cfg.rb:196:1:198:3 | Entry | +| cfg.rb:200:9:200:32 | Entry | cfg.rb:200:9:200:32 | Entry | +| cfg.rb:202:9:202:35 | Entry | cfg.rb:202:9:202:35 | Entry | +| cfg.rb:205:4:205:5 | After call to == [false] | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:205:4:205:5 | After call to == [true] | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:205:15:205:23 | Entry | cfg.rb:205:15:205:23 | Entry | +| cfg.rb:207:1:211:3 | Entry | cfg.rb:207:1:211:3 | Entry | +| cfg.rb:208:15:210:5 | Entry | cfg.rb:208:15:210:5 | Entry | +| cfg.rb:213:14:216:3 | Entry | cfg.rb:213:14:216:3 | Entry | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:1:1:22:4 | Entry | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [false] | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [true] | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [false] | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [true] | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [false] | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [true] | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | +| constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [false] | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [false] | +| constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [true] | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [true] | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [false] | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [true] | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [false] | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [true] | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | +| constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [false] | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [false] | +| constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [true] | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [true] | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [false] | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [true] | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | +| constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [false] | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [false] | +| constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [true] | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [true] | +| constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | +| desugar.rb:1:1:3:3 | Entry | desugar.rb:1:1:3:3 | Entry | +| desugar.rb:1:1:38:17 | Entry | desugar.rb:1:1:38:17 | Entry | +| desugar.rb:5:1:7:3 | Entry | desugar.rb:5:1:7:3 | Entry | +| desugar.rb:9:1:11:3 | Entry | desugar.rb:9:1:11:3 | Entry | +| desugar.rb:13:1:15:3 | Entry | desugar.rb:13:1:15:3 | Entry | +| desugar.rb:17:1:19:3 | Entry | desugar.rb:17:1:19:3 | Entry | +| desugar.rb:21:1:23:3 | Entry | desugar.rb:21:1:23:3 | Entry | +| desugar.rb:25:1:27:3 | Entry | desugar.rb:25:1:27:3 | Entry | +| exit.rb:1:1:6:3 | Entry | exit.rb:1:1:6:3 | Entry | +| exit.rb:1:1:6:3 | Entry | exit.rb:1:1:6:3 | Exit | +| exit.rb:1:1:6:3 | Entry | exit.rb:2:6:2:10 | After ... > ... [false] | +| exit.rb:1:1:6:3 | Entry | exit.rb:2:6:2:10 | After ... > ... [true] | +| exit.rb:1:1:6:3 | Exit | exit.rb:1:1:6:3 | Exit | +| exit.rb:1:1:13:4 | Entry | exit.rb:1:1:13:4 | Entry | +| exit.rb:2:6:2:10 | After ... > ... [false] | exit.rb:2:6:2:10 | After ... > ... [false] | +| exit.rb:2:6:2:10 | After ... > ... [true] | exit.rb:2:6:2:10 | After ... > ... [true] | +| exit.rb:8:1:13:3 | Entry | exit.rb:8:1:13:3 | Entry | +| exit.rb:8:1:13:3 | Entry | exit.rb:8:1:13:3 | Exit | +| exit.rb:8:1:13:3 | Entry | exit.rb:9:6:9:10 | After ... > ... [false] | +| exit.rb:8:1:13:3 | Entry | exit.rb:9:6:9:10 | After ... > ... [true] | +| exit.rb:8:1:13:3 | Exit | exit.rb:8:1:13:3 | Exit | +| exit.rb:9:6:9:10 | After ... > ... [false] | exit.rb:9:6:9:10 | After ... > ... [false] | +| exit.rb:9:6:9:10 | After ... > ... [true] | exit.rb:9:6:9:10 | After ... > ... [true] | +| heredoc.rb:1:1:7:3 | Entry | heredoc.rb:1:1:7:3 | Entry | +| heredoc.rb:1:1:7:4 | Entry | heredoc.rb:1:1:7:4 | Entry | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:1:1:9:3 | Entry | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:2:3:8:5 | After if ... | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:2:6:2:10 | After ... > ... [false] | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:2:6:2:10 | After ... > ... [true] | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:3:7:35 | After elsif ... | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:9:4:14 | After ... <= ... [false] | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:9:4:14 | After ... <= ... [true] | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:9:4:24 | After ... and ... [false] | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:9:4:38 | After ... and ... [false] | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:20:4:24 | After ... > ... [false] | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:20:4:24 | After ... > ... [true] | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:32:4:37 | After ... == ... [false] | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:32:4:37 | After ... == ... [true] | +| ifs.rb:1:1:58:4 | Entry | ifs.rb:1:1:58:4 | Entry | +| ifs.rb:1:1:58:4 | Entry | ifs.rb:36:1:38:17 | After ... unless ... | +| ifs.rb:1:1:58:4 | Entry | ifs.rb:38:12:38:17 | After ... == ... [false] | +| ifs.rb:1:1:58:4 | Entry | ifs.rb:38:12:38:17 | After ... == ... [true] | +| ifs.rb:2:3:8:5 | After if ... | ifs.rb:2:3:8:5 | After if ... | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:2:6:2:10 | After ... > ... [false] | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:3:7:35 | After elsif ... | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:9:4:14 | After ... <= ... [false] | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:9:4:14 | After ... <= ... [true] | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:9:4:24 | After ... and ... [false] | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:9:4:38 | After ... and ... [false] | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:20:4:24 | After ... > ... [false] | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:20:4:24 | After ... > ... [true] | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:32:4:37 | After ... == ... [false] | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:32:4:37 | After ... == ... [true] | +| ifs.rb:2:6:2:10 | After ... > ... [true] | ifs.rb:2:6:2:10 | After ... > ... [true] | +| ifs.rb:4:3:7:35 | After elsif ... | ifs.rb:4:3:7:35 | After elsif ... | +| ifs.rb:4:9:4:14 | After ... <= ... [false] | ifs.rb:4:9:4:14 | After ... <= ... [false] | +| ifs.rb:4:9:4:14 | After ... <= ... [true] | ifs.rb:4:9:4:14 | After ... <= ... [true] | +| ifs.rb:4:9:4:14 | After ... <= ... [true] | ifs.rb:4:20:4:24 | After ... > ... [false] | +| ifs.rb:4:9:4:14 | After ... <= ... [true] | ifs.rb:4:20:4:24 | After ... > ... [true] | +| ifs.rb:4:9:4:14 | After ... <= ... [true] | ifs.rb:4:32:4:37 | After ... == ... [false] | +| ifs.rb:4:9:4:14 | After ... <= ... [true] | ifs.rb:4:32:4:37 | After ... == ... [true] | +| ifs.rb:4:9:4:24 | After ... and ... [false] | ifs.rb:4:9:4:24 | After ... and ... [false] | +| ifs.rb:4:9:4:38 | After ... and ... [false] | ifs.rb:4:9:4:38 | After ... and ... [false] | +| ifs.rb:4:20:4:24 | After ... > ... [false] | ifs.rb:4:20:4:24 | After ... > ... [false] | +| ifs.rb:4:20:4:24 | After ... > ... [true] | ifs.rb:4:20:4:24 | After ... > ... [true] | +| ifs.rb:4:20:4:24 | After ... > ... [true] | ifs.rb:4:32:4:37 | After ... == ... [false] | +| ifs.rb:4:20:4:24 | After ... > ... [true] | ifs.rb:4:32:4:37 | After ... == ... [true] | +| ifs.rb:4:32:4:37 | After ... == ... [false] | ifs.rb:4:32:4:37 | After ... == ... [false] | +| ifs.rb:4:32:4:37 | After ... == ... [true] | ifs.rb:4:32:4:37 | After ... == ... [true] | +| ifs.rb:11:1:16:3 | Entry | ifs.rb:11:1:16:3 | Entry | +| ifs.rb:11:1:16:3 | Entry | ifs.rb:11:1:16:3 | Normal Exit | +| ifs.rb:11:1:16:3 | Entry | ifs.rb:12:6:12:6 | After b [false] | +| ifs.rb:11:1:16:3 | Entry | ifs.rb:12:6:12:6 | After b [true] | +| ifs.rb:11:1:16:3 | Normal Exit | ifs.rb:11:1:16:3 | Normal Exit | +| ifs.rb:12:6:12:6 | After b [false] | ifs.rb:12:6:12:6 | After b [false] | +| ifs.rb:12:6:12:6 | After b [true] | ifs.rb:12:6:12:6 | After b [true] | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:18:1:26:3 | Entry | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:19:3:24:5 | After if ... | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:19:6:19:10 | After ... < ... [false] | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:19:6:19:10 | After ... < ... [true] | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:21:5:23:7 | After if ... | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:21:8:21:13 | After ... > ... [false] | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:21:8:21:13 | After ... > ... [true] | +| ifs.rb:19:3:24:5 | After if ... | ifs.rb:19:3:24:5 | After if ... | +| ifs.rb:19:6:19:10 | After ... < ... [false] | ifs.rb:19:6:19:10 | After ... < ... [false] | +| ifs.rb:19:6:19:10 | After ... < ... [true] | ifs.rb:19:6:19:10 | After ... < ... [true] | +| ifs.rb:19:6:19:10 | After ... < ... [true] | ifs.rb:21:5:23:7 | After if ... | +| ifs.rb:19:6:19:10 | After ... < ... [true] | ifs.rb:21:8:21:13 | After ... > ... [false] | +| ifs.rb:19:6:19:10 | After ... < ... [true] | ifs.rb:21:8:21:13 | After ... > ... [true] | +| ifs.rb:21:5:23:7 | After if ... | ifs.rb:21:5:23:7 | After if ... | +| ifs.rb:21:8:21:13 | After ... > ... [false] | ifs.rb:21:8:21:13 | After ... > ... [false] | +| ifs.rb:21:8:21:13 | After ... > ... [true] | ifs.rb:21:8:21:13 | After ... > ... [true] | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:28:1:30:3 | Entry | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:10:29:51 | After ... ? ... : ... | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:11:29:12 | After b1 [false] | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:11:29:12 | After b1 [true] | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:11:29:22 | After ... ? ... : ... [false] | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:11:29:22 | After ... ? ... : ... [true] | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:16:29:17 | After b2 [false] | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:16:29:17 | After b2 [true] | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:21:29:22 | After b3 [false] | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:21:29:22 | After b3 [true] | +| ifs.rb:29:10:29:51 | After ... ? ... : ... | ifs.rb:29:10:29:51 | After ... ? ... : ... | +| ifs.rb:29:11:29:12 | After b1 [false] | ifs.rb:29:11:29:12 | After b1 [false] | +| ifs.rb:29:11:29:12 | After b1 [false] | ifs.rb:29:21:29:22 | After b3 [false] | +| ifs.rb:29:11:29:12 | After b1 [false] | ifs.rb:29:21:29:22 | After b3 [true] | +| ifs.rb:29:11:29:12 | After b1 [true] | ifs.rb:29:11:29:12 | After b1 [true] | +| ifs.rb:29:11:29:12 | After b1 [true] | ifs.rb:29:16:29:17 | After b2 [false] | +| ifs.rb:29:11:29:12 | After b1 [true] | ifs.rb:29:16:29:17 | After b2 [true] | +| ifs.rb:29:11:29:22 | After ... ? ... : ... [false] | ifs.rb:29:11:29:22 | After ... ? ... : ... [false] | +| ifs.rb:29:11:29:22 | After ... ? ... : ... [true] | ifs.rb:29:11:29:22 | After ... ? ... : ... [true] | +| ifs.rb:29:16:29:17 | After b2 [false] | ifs.rb:29:16:29:17 | After b2 [false] | +| ifs.rb:29:16:29:17 | After b2 [true] | ifs.rb:29:16:29:17 | After b2 [true] | +| ifs.rb:29:21:29:22 | After b3 [false] | ifs.rb:29:21:29:22 | After b3 [false] | +| ifs.rb:29:21:29:22 | After b3 [true] | ifs.rb:29:21:29:22 | After b3 [true] | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:32:1:34:3 | Entry | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:3:33:100 | After if ... | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:7:33:48 | After if ... [false] | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:7:33:48 | After if ... [true] | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:10:33:11 | After b1 [false] | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:10:33:11 | After b1 [true] | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:18:33:19 | After b2 [false] | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:18:33:19 | After b2 [true] | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:21:33:44 | After elsif ... [false] | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:21:33:44 | After elsif ... [true] | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:27:33:28 | After b3 [false] | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:27:33:28 | After b3 [true] | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:35:33:36 | After b4 [false] | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:35:33:36 | After b4 [true] | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:43:33:44 | After b5 [false] | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:43:33:44 | After b5 [true] | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:3:33:100 | After if ... | +| ifs.rb:33:7:33:48 | After if ... [false] | ifs.rb:33:7:33:48 | After if ... [false] | +| ifs.rb:33:7:33:48 | After if ... [true] | ifs.rb:33:7:33:48 | After if ... [true] | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:10:33:11 | After b1 [false] | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:21:33:44 | After elsif ... [false] | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:21:33:44 | After elsif ... [true] | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:27:33:28 | After b3 [false] | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:27:33:28 | After b3 [true] | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:35:33:36 | After b4 [false] | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:35:33:36 | After b4 [true] | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:43:33:44 | After b5 [false] | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:43:33:44 | After b5 [true] | +| ifs.rb:33:10:33:11 | After b1 [true] | ifs.rb:33:10:33:11 | After b1 [true] | +| ifs.rb:33:10:33:11 | After b1 [true] | ifs.rb:33:18:33:19 | After b2 [false] | +| ifs.rb:33:10:33:11 | After b1 [true] | ifs.rb:33:18:33:19 | After b2 [true] | +| ifs.rb:33:18:33:19 | After b2 [false] | ifs.rb:33:18:33:19 | After b2 [false] | +| ifs.rb:33:18:33:19 | After b2 [true] | ifs.rb:33:18:33:19 | After b2 [true] | +| ifs.rb:33:21:33:44 | After elsif ... [false] | ifs.rb:33:21:33:44 | After elsif ... [false] | +| ifs.rb:33:21:33:44 | After elsif ... [true] | ifs.rb:33:21:33:44 | After elsif ... [true] | +| ifs.rb:33:27:33:28 | After b3 [false] | ifs.rb:33:27:33:28 | After b3 [false] | +| ifs.rb:33:27:33:28 | After b3 [false] | ifs.rb:33:43:33:44 | After b5 [false] | +| ifs.rb:33:27:33:28 | After b3 [false] | ifs.rb:33:43:33:44 | After b5 [true] | +| ifs.rb:33:27:33:28 | After b3 [true] | ifs.rb:33:27:33:28 | After b3 [true] | +| ifs.rb:33:27:33:28 | After b3 [true] | ifs.rb:33:35:33:36 | After b4 [false] | +| ifs.rb:33:27:33:28 | After b3 [true] | ifs.rb:33:35:33:36 | After b4 [true] | +| ifs.rb:33:35:33:36 | After b4 [false] | ifs.rb:33:35:33:36 | After b4 [false] | +| ifs.rb:33:35:33:36 | After b4 [true] | ifs.rb:33:35:33:36 | After b4 [true] | +| ifs.rb:33:43:33:44 | After b5 [false] | ifs.rb:33:43:33:44 | After b5 [false] | +| ifs.rb:33:43:33:44 | After b5 [true] | ifs.rb:33:43:33:44 | After b5 [true] | +| ifs.rb:36:1:38:3 | Entry | ifs.rb:36:1:38:3 | Entry | +| ifs.rb:36:1:38:17 | After ... unless ... | ifs.rb:36:1:38:17 | After ... unless ... | +| ifs.rb:38:12:38:17 | After ... == ... [false] | ifs.rb:38:12:38:17 | After ... == ... [false] | +| ifs.rb:38:12:38:17 | After ... == ... [true] | ifs.rb:38:12:38:17 | After ... == ... [true] | +| ifs.rb:40:1:44:3 | Entry | ifs.rb:40:1:44:3 | Entry | +| ifs.rb:46:1:52:3 | Entry | ifs.rb:46:1:52:3 | Entry | +| ifs.rb:46:1:52:3 | Entry | ifs.rb:47:3:50:5 | After if ... | +| ifs.rb:46:1:52:3 | Entry | ifs.rb:47:6:47:6 | After b [false] | +| ifs.rb:46:1:52:3 | Entry | ifs.rb:47:6:47:6 | After b [true] | +| ifs.rb:47:3:50:5 | After if ... | ifs.rb:47:3:50:5 | After if ... | +| ifs.rb:47:6:47:6 | After b [false] | ifs.rb:47:6:47:6 | After b [false] | +| ifs.rb:47:6:47:6 | After b [true] | ifs.rb:47:6:47:6 | After b [true] | +| ifs.rb:54:1:58:3 | Entry | ifs.rb:54:1:58:3 | Entry | +| ifs.rb:54:1:58:3 | Entry | ifs.rb:55:3:57:5 | After if ... | +| ifs.rb:54:1:58:3 | Entry | ifs.rb:55:7:55:8 | After b1 [false] | +| ifs.rb:54:1:58:3 | Entry | ifs.rb:55:7:55:8 | After b1 [true] | +| ifs.rb:54:1:58:3 | Entry | ifs.rb:55:7:55:14 | After ... \|\| ... [true] | +| ifs.rb:54:1:58:3 | Entry | ifs.rb:55:13:55:14 | After b2 [false] | +| ifs.rb:54:1:58:3 | Entry | ifs.rb:55:13:55:14 | After b2 [true] | +| ifs.rb:55:3:57:5 | After if ... | ifs.rb:55:3:57:5 | After if ... | +| ifs.rb:55:7:55:8 | After b1 [false] | ifs.rb:55:7:55:8 | After b1 [false] | +| ifs.rb:55:7:55:8 | After b1 [false] | ifs.rb:55:13:55:14 | After b2 [false] | +| ifs.rb:55:7:55:8 | After b1 [false] | ifs.rb:55:13:55:14 | After b2 [true] | +| ifs.rb:55:7:55:8 | After b1 [true] | ifs.rb:55:7:55:8 | After b1 [true] | +| ifs.rb:55:7:55:14 | After ... \|\| ... [true] | ifs.rb:55:7:55:14 | After ... \|\| ... [true] | +| ifs.rb:55:13:55:14 | After b2 [false] | ifs.rb:55:13:55:14 | After b2 [false] | +| ifs.rb:55:13:55:14 | After b2 [true] | ifs.rb:55:13:55:14 | After b2 [true] | +| loops.rb:1:1:6:3 | Entry | loops.rb:1:1:6:3 | Entry | +| loops.rb:1:1:6:3 | Entry | loops.rb:2:3:5:5 | [LoopHeader] while ... | +| loops.rb:1:1:6:3 | Entry | loops.rb:2:9:2:14 | After ... >= ... [false] | +| loops.rb:1:1:6:3 | Entry | loops.rb:2:9:2:14 | After ... >= ... [true] | +| loops.rb:1:1:33:4 | Entry | loops.rb:1:1:33:4 | Entry | +| loops.rb:2:3:5:5 | [LoopHeader] while ... | loops.rb:2:3:5:5 | [LoopHeader] while ... | +| loops.rb:2:3:5:5 | [LoopHeader] while ... | loops.rb:2:9:2:14 | After ... >= ... [false] | +| loops.rb:2:3:5:5 | [LoopHeader] while ... | loops.rb:2:9:2:14 | After ... >= ... [true] | +| loops.rb:2:9:2:14 | After ... >= ... [false] | loops.rb:2:9:2:14 | After ... >= ... [false] | +| loops.rb:2:9:2:14 | After ... >= ... [true] | loops.rb:2:9:2:14 | After ... >= ... [true] | +| loops.rb:8:1:22:3 | Entry | loops.rb:8:1:22:3 | Entry | +| loops.rb:8:1:22:3 | Entry | loops.rb:9:3:20:5 | After while ... | +| loops.rb:8:1:22:3 | Entry | loops.rb:9:3:20:5 | [LoopHeader] while ... | +| loops.rb:8:1:22:3 | Entry | loops.rb:9:9:9:14 | After ... >= ... [false] | +| loops.rb:8:1:22:3 | Entry | loops.rb:9:9:9:14 | After ... >= ... [true] | +| loops.rb:8:1:22:3 | Entry | loops.rb:9:15:20:5 | do ... | +| loops.rb:8:1:22:3 | Entry | loops.rb:12:8:12:14 | After ... > ... [false] | +| loops.rb:8:1:22:3 | Entry | loops.rb:12:8:12:14 | After ... > ... [true] | +| loops.rb:8:1:22:3 | Entry | loops.rb:14:11:14:16 | After ... > ... [false] | +| loops.rb:8:1:22:3 | Entry | loops.rb:14:11:14:16 | After ... > ... [true] | +| loops.rb:8:1:22:3 | Entry | loops.rb:16:11:16:16 | After ... > ... [false] | +| loops.rb:8:1:22:3 | Entry | loops.rb:16:11:16:16 | After ... > ... [true] | +| loops.rb:9:3:20:5 | After while ... | loops.rb:9:3:20:5 | After while ... | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:9:3:20:5 | After while ... | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:9:3:20:5 | [LoopHeader] while ... | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:9:9:9:14 | After ... >= ... [false] | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:9:9:9:14 | After ... >= ... [true] | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:9:15:20:5 | do ... | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:12:8:12:14 | After ... > ... [false] | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:12:8:12:14 | After ... > ... [true] | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:14:11:14:16 | After ... > ... [false] | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:14:11:14:16 | After ... > ... [true] | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:16:11:16:16 | After ... > ... [false] | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:16:11:16:16 | After ... > ... [true] | +| loops.rb:9:9:9:14 | After ... >= ... [false] | loops.rb:9:9:9:14 | After ... >= ... [false] | +| loops.rb:9:9:9:14 | After ... >= ... [true] | loops.rb:9:9:9:14 | After ... >= ... [true] | +| loops.rb:9:9:9:14 | After ... >= ... [true] | loops.rb:9:15:20:5 | do ... | +| loops.rb:9:9:9:14 | After ... >= ... [true] | loops.rb:12:8:12:14 | After ... > ... [false] | +| loops.rb:9:9:9:14 | After ... >= ... [true] | loops.rb:12:8:12:14 | After ... > ... [true] | +| loops.rb:9:9:9:14 | After ... >= ... [true] | loops.rb:14:11:14:16 | After ... > ... [false] | +| loops.rb:9:9:9:14 | After ... >= ... [true] | loops.rb:14:11:14:16 | After ... > ... [true] | +| loops.rb:9:9:9:14 | After ... >= ... [true] | loops.rb:16:11:16:16 | After ... > ... [false] | +| loops.rb:9:9:9:14 | After ... >= ... [true] | loops.rb:16:11:16:16 | After ... > ... [true] | +| loops.rb:9:15:20:5 | do ... | loops.rb:9:15:20:5 | do ... | +| loops.rb:9:15:20:5 | do ... | loops.rb:12:8:12:14 | After ... > ... [false] | +| loops.rb:9:15:20:5 | do ... | loops.rb:12:8:12:14 | After ... > ... [true] | +| loops.rb:9:15:20:5 | do ... | loops.rb:14:11:14:16 | After ... > ... [false] | +| loops.rb:9:15:20:5 | do ... | loops.rb:14:11:14:16 | After ... > ... [true] | +| loops.rb:9:15:20:5 | do ... | loops.rb:16:11:16:16 | After ... > ... [false] | +| loops.rb:9:15:20:5 | do ... | loops.rb:16:11:16:16 | After ... > ... [true] | +| loops.rb:12:8:12:14 | After ... > ... [false] | loops.rb:12:8:12:14 | After ... > ... [false] | +| loops.rb:12:8:12:14 | After ... > ... [false] | loops.rb:14:11:14:16 | After ... > ... [false] | +| loops.rb:12:8:12:14 | After ... > ... [false] | loops.rb:14:11:14:16 | After ... > ... [true] | +| loops.rb:12:8:12:14 | After ... > ... [false] | loops.rb:16:11:16:16 | After ... > ... [false] | +| loops.rb:12:8:12:14 | After ... > ... [false] | loops.rb:16:11:16:16 | After ... > ... [true] | +| loops.rb:12:8:12:14 | After ... > ... [true] | loops.rb:12:8:12:14 | After ... > ... [true] | +| loops.rb:14:11:14:16 | After ... > ... [false] | loops.rb:14:11:14:16 | After ... > ... [false] | +| loops.rb:14:11:14:16 | After ... > ... [false] | loops.rb:16:11:16:16 | After ... > ... [false] | +| loops.rb:14:11:14:16 | After ... > ... [false] | loops.rb:16:11:16:16 | After ... > ... [true] | +| loops.rb:14:11:14:16 | After ... > ... [true] | loops.rb:14:11:14:16 | After ... > ... [true] | +| loops.rb:16:11:16:16 | After ... > ... [false] | loops.rb:16:11:16:16 | After ... > ... [false] | +| loops.rb:16:11:16:16 | After ... > ... [true] | loops.rb:16:11:16:16 | After ... > ... [true] | +| loops.rb:24:1:28:3 | Entry | loops.rb:24:1:28:3 | Entry | +| loops.rb:25:16:27:5 | Entry | loops.rb:25:16:27:5 | Entry | +| loops.rb:30:1:33:3 | Entry | loops.rb:30:1:33:3 | Entry | +| loops.rb:30:1:33:3 | Entry | loops.rb:31:3:32:5 | [LoopHeader] while ... | +| loops.rb:30:1:33:3 | Entry | loops.rb:31:9:31:13 | After ... < ... [false] | +| loops.rb:30:1:33:3 | Entry | loops.rb:31:9:31:13 | After ... < ... [true] | +| loops.rb:31:3:32:5 | [LoopHeader] while ... | loops.rb:31:3:32:5 | [LoopHeader] while ... | +| loops.rb:31:3:32:5 | [LoopHeader] while ... | loops.rb:31:9:31:13 | After ... < ... [false] | +| loops.rb:31:3:32:5 | [LoopHeader] while ... | loops.rb:31:9:31:13 | After ... < ... [true] | +| loops.rb:31:9:31:13 | After ... < ... [false] | loops.rb:31:9:31:13 | After ... < ... [false] | +| loops.rb:31:9:31:13 | After ... < ... [true] | loops.rb:31:9:31:13 | After ... < ... [true] | +| raise.rb:1:1:182:4 | Entry | raise.rb:1:1:182:4 | Entry | +| raise.rb:7:1:12:3 | Entry | raise.rb:7:1:12:3 | Entry | +| raise.rb:7:1:12:3 | Entry | raise.rb:7:1:12:3 | Exit | +| raise.rb:7:1:12:3 | Entry | raise.rb:8:6:8:10 | After ... > ... [false] | +| raise.rb:7:1:12:3 | Entry | raise.rb:8:6:8:10 | After ... > ... [true] | +| raise.rb:7:1:12:3 | Exit | raise.rb:7:1:12:3 | Exit | +| raise.rb:8:6:8:10 | After ... > ... [false] | raise.rb:8:6:8:10 | After ... > ... [false] | +| raise.rb:8:6:8:10 | After ... > ... [true] | raise.rb:8:6:8:10 | After ... > ... [true] | +| raise.rb:14:1:23:3 | Entry | raise.rb:14:1:23:3 | Entry | +| raise.rb:14:1:23:3 | Entry | raise.rb:14:1:23:3 | Exit | +| raise.rb:14:1:23:3 | Entry | raise.rb:15:3:21:5 | After begin ... | +| raise.rb:14:1:23:3 | Entry | raise.rb:16:8:16:8 | After b [false] | +| raise.rb:14:1:23:3 | Entry | raise.rb:16:8:16:8 | After b [true] | +| raise.rb:14:1:23:3 | Entry | raise.rb:19:10:19:19 | After ExceptionA [match] | +| raise.rb:14:1:23:3 | Entry | raise.rb:19:10:19:19 | After ExceptionA [no-match] | +| raise.rb:14:1:23:3 | Exit | raise.rb:14:1:23:3 | Exit | +| raise.rb:15:3:21:5 | After begin ... | raise.rb:15:3:21:5 | After begin ... | +| raise.rb:16:8:16:8 | After b [false] | raise.rb:16:8:16:8 | After b [false] | +| raise.rb:16:8:16:8 | After b [true] | raise.rb:16:8:16:8 | After b [true] | +| raise.rb:16:8:16:8 | After b [true] | raise.rb:19:10:19:19 | After ExceptionA [match] | +| raise.rb:16:8:16:8 | After b [true] | raise.rb:19:10:19:19 | After ExceptionA [no-match] | +| raise.rb:19:10:19:19 | After ExceptionA [match] | raise.rb:19:10:19:19 | After ExceptionA [match] | +| raise.rb:19:10:19:19 | After ExceptionA [no-match] | raise.rb:19:10:19:19 | After ExceptionA [no-match] | +| raise.rb:25:1:34:3 | Entry | raise.rb:25:1:34:3 | Entry | +| raise.rb:25:1:34:3 | Entry | raise.rb:26:3:32:5 | After begin ... | +| raise.rb:25:1:34:3 | Entry | raise.rb:27:8:27:8 | After b [false] | +| raise.rb:25:1:34:3 | Entry | raise.rb:27:8:27:8 | After b [true] | +| raise.rb:26:3:32:5 | After begin ... | raise.rb:26:3:32:5 | After begin ... | +| raise.rb:27:8:27:8 | After b [false] | raise.rb:27:8:27:8 | After b [false] | +| raise.rb:27:8:27:8 | After b [true] | raise.rb:27:8:27:8 | After b [true] | +| raise.rb:36:1:45:3 | Entry | raise.rb:36:1:45:3 | Entry | +| raise.rb:36:1:45:3 | Entry | raise.rb:37:3:43:5 | After begin ... | +| raise.rb:36:1:45:3 | Entry | raise.rb:38:8:38:8 | After b [false] | +| raise.rb:36:1:45:3 | Entry | raise.rb:38:8:38:8 | After b [true] | +| raise.rb:37:3:43:5 | After begin ... | raise.rb:37:3:43:5 | After begin ... | +| raise.rb:38:8:38:8 | After b [false] | raise.rb:38:8:38:8 | After b [false] | +| raise.rb:38:8:38:8 | After b [true] | raise.rb:38:8:38:8 | After b [true] | +| raise.rb:47:1:55:3 | Entry | raise.rb:47:1:55:3 | Entry | +| raise.rb:47:1:55:3 | Entry | raise.rb:48:3:53:5 | After begin ... | +| raise.rb:47:1:55:3 | Entry | raise.rb:49:8:49:8 | After b [false] | +| raise.rb:47:1:55:3 | Entry | raise.rb:49:8:49:8 | After b [true] | +| raise.rb:48:3:53:5 | After begin ... | raise.rb:48:3:53:5 | After begin ... | +| raise.rb:49:8:49:8 | After b [false] | raise.rb:49:8:49:8 | After b [false] | +| raise.rb:49:8:49:8 | After b [true] | raise.rb:49:8:49:8 | After b [true] | +| raise.rb:57:1:66:3 | Entry | raise.rb:57:1:66:3 | Entry | +| raise.rb:57:1:66:3 | Entry | raise.rb:57:1:66:3 | Exit | +| raise.rb:57:1:66:3 | Entry | raise.rb:58:3:64:5 | After begin ... | +| raise.rb:57:1:66:3 | Entry | raise.rb:59:8:59:8 | After b [false] | +| raise.rb:57:1:66:3 | Entry | raise.rb:59:8:59:8 | After b [true] | +| raise.rb:57:1:66:3 | Entry | raise.rb:62:10:62:31 | After ..., ... [match] | +| raise.rb:57:1:66:3 | Entry | raise.rb:62:10:62:31 | After ..., ... [no-match] | +| raise.rb:57:1:66:3 | Exit | raise.rb:57:1:66:3 | Exit | +| raise.rb:58:3:64:5 | After begin ... | raise.rb:58:3:64:5 | After begin ... | +| raise.rb:59:8:59:8 | After b [false] | raise.rb:59:8:59:8 | After b [false] | +| raise.rb:59:8:59:8 | After b [true] | raise.rb:59:8:59:8 | After b [true] | +| raise.rb:59:8:59:8 | After b [true] | raise.rb:62:10:62:31 | After ..., ... [match] | +| raise.rb:59:8:59:8 | After b [true] | raise.rb:62:10:62:31 | After ..., ... [no-match] | +| raise.rb:62:10:62:31 | After ..., ... [match] | raise.rb:62:10:62:31 | After ..., ... [match] | +| raise.rb:62:10:62:31 | After ..., ... [no-match] | raise.rb:62:10:62:31 | After ..., ... [no-match] | +| raise.rb:68:1:77:3 | Entry | raise.rb:68:1:77:3 | Entry | +| raise.rb:68:1:77:3 | Entry | raise.rb:68:1:77:3 | Exceptional Exit | +| raise.rb:68:1:77:3 | Entry | raise.rb:68:1:77:3 | Exit | +| raise.rb:68:1:77:3 | Entry | raise.rb:68:1:77:3 | Normal Exit | +| raise.rb:68:1:77:3 | Entry | raise.rb:69:3:76:15 | After ... | +| raise.rb:68:1:77:3 | Entry | raise.rb:69:6:69:10 | After ... > ... [false] | +| raise.rb:68:1:77:3 | Entry | raise.rb:69:6:69:10 | After ... > ... [true] | +| raise.rb:68:1:77:3 | Entry | raise.rb:71:9:71:13 | After ... < ... [false] | +| raise.rb:68:1:77:3 | Entry | raise.rb:71:9:71:13 | After ... < ... [true] | +| raise.rb:68:1:77:3 | Entry | raise.rb:74:3:74:20 | After call to puts | +| raise.rb:68:1:77:3 | Entry | raise.rb:75:1:76:15 | ensure ... | +| raise.rb:68:1:77:3 | Exceptional Exit | raise.rb:68:1:77:3 | Exceptional Exit | +| raise.rb:68:1:77:3 | Exit | raise.rb:68:1:77:3 | Exit | +| raise.rb:68:1:77:3 | Normal Exit | raise.rb:68:1:77:3 | Normal Exit | +| raise.rb:69:3:76:15 | After ... | raise.rb:69:3:76:15 | After ... | +| raise.rb:69:6:69:10 | After ... > ... [false] | raise.rb:69:6:69:10 | After ... > ... [false] | +| raise.rb:69:6:69:10 | After ... > ... [false] | raise.rb:71:9:71:13 | After ... < ... [false] | +| raise.rb:69:6:69:10 | After ... > ... [false] | raise.rb:71:9:71:13 | After ... < ... [true] | +| raise.rb:69:6:69:10 | After ... > ... [false] | raise.rb:74:3:74:20 | After call to puts | +| raise.rb:69:6:69:10 | After ... > ... [true] | raise.rb:69:6:69:10 | After ... > ... [true] | +| raise.rb:71:9:71:13 | After ... < ... [false] | raise.rb:71:9:71:13 | After ... < ... [false] | +| raise.rb:71:9:71:13 | After ... < ... [false] | raise.rb:74:3:74:20 | After call to puts | +| raise.rb:71:9:71:13 | After ... < ... [true] | raise.rb:71:9:71:13 | After ... < ... [true] | +| raise.rb:74:3:74:20 | After call to puts | raise.rb:74:3:74:20 | After call to puts | +| raise.rb:75:1:76:15 | ensure ... | raise.rb:68:1:77:3 | Exceptional Exit | +| raise.rb:75:1:76:15 | ensure ... | raise.rb:68:1:77:3 | Exit | +| raise.rb:75:1:76:15 | ensure ... | raise.rb:68:1:77:3 | Normal Exit | +| raise.rb:75:1:76:15 | ensure ... | raise.rb:69:3:76:15 | After ... | +| raise.rb:75:1:76:15 | ensure ... | raise.rb:75:1:76:15 | ensure ... | +| raise.rb:79:1:92:3 | Entry | raise.rb:79:1:92:3 | Entry | +| raise.rb:79:1:92:3 | Entry | raise.rb:79:1:92:3 | Exceptional Exit | +| raise.rb:79:1:92:3 | Entry | raise.rb:79:1:92:3 | Exit | +| raise.rb:79:1:92:3 | Entry | raise.rb:79:1:92:3 | Normal Exit | +| raise.rb:79:1:92:3 | Entry | raise.rb:81:3:90:5 | After begin ... | +| raise.rb:79:1:92:3 | Entry | raise.rb:82:8:82:12 | After ... > ... [false] | +| raise.rb:79:1:92:3 | Entry | raise.rb:82:8:82:12 | After ... > ... [true] | +| raise.rb:79:1:92:3 | Entry | raise.rb:84:11:84:15 | After ... < ... [false] | +| raise.rb:79:1:92:3 | Entry | raise.rb:84:11:84:15 | After ... < ... [true] | +| raise.rb:79:1:92:3 | Entry | raise.rb:87:5:87:22 | After call to puts | +| raise.rb:79:1:92:3 | Entry | raise.rb:88:3:89:17 | ensure ... | +| raise.rb:79:1:92:3 | Exceptional Exit | raise.rb:79:1:92:3 | Exceptional Exit | +| raise.rb:79:1:92:3 | Exit | raise.rb:79:1:92:3 | Exit | +| raise.rb:79:1:92:3 | Normal Exit | raise.rb:79:1:92:3 | Normal Exit | +| raise.rb:81:3:90:5 | After begin ... | raise.rb:81:3:90:5 | After begin ... | +| raise.rb:82:8:82:12 | After ... > ... [false] | raise.rb:82:8:82:12 | After ... > ... [false] | +| raise.rb:82:8:82:12 | After ... > ... [false] | raise.rb:84:11:84:15 | After ... < ... [false] | +| raise.rb:82:8:82:12 | After ... > ... [false] | raise.rb:84:11:84:15 | After ... < ... [true] | +| raise.rb:82:8:82:12 | After ... > ... [false] | raise.rb:87:5:87:22 | After call to puts | +| raise.rb:82:8:82:12 | After ... > ... [true] | raise.rb:82:8:82:12 | After ... > ... [true] | +| raise.rb:84:11:84:15 | After ... < ... [false] | raise.rb:84:11:84:15 | After ... < ... [false] | +| raise.rb:84:11:84:15 | After ... < ... [false] | raise.rb:87:5:87:22 | After call to puts | +| raise.rb:84:11:84:15 | After ... < ... [true] | raise.rb:84:11:84:15 | After ... < ... [true] | +| raise.rb:87:5:87:22 | After call to puts | raise.rb:87:5:87:22 | After call to puts | +| raise.rb:88:3:89:17 | ensure ... | raise.rb:79:1:92:3 | Exceptional Exit | +| raise.rb:88:3:89:17 | ensure ... | raise.rb:79:1:92:3 | Exit | +| raise.rb:88:3:89:17 | ensure ... | raise.rb:79:1:92:3 | Normal Exit | +| raise.rb:88:3:89:17 | ensure ... | raise.rb:81:3:90:5 | After begin ... | +| raise.rb:88:3:89:17 | ensure ... | raise.rb:88:3:89:17 | ensure ... | +| raise.rb:94:1:119:3 | Entry | raise.rb:94:1:119:3 | Entry | +| raise.rb:94:1:119:3 | Entry | raise.rb:94:1:119:3 | Exceptional Exit | +| raise.rb:94:1:119:3 | Entry | raise.rb:94:1:119:3 | Exit | +| raise.rb:94:1:119:3 | Entry | raise.rb:94:1:119:3 | Normal Exit | +| raise.rb:94:1:119:3 | Entry | raise.rb:95:3:95:17 | After call to puts | +| raise.rb:94:1:119:3 | Entry | raise.rb:95:3:118:5 | After ... | +| raise.rb:94:1:119:3 | Entry | raise.rb:96:3:112:5 | After begin ... | +| raise.rb:94:1:119:3 | Entry | raise.rb:97:8:97:12 | After ... > ... [false] | +| raise.rb:94:1:119:3 | Entry | raise.rb:97:8:97:12 | After ... > ... [true] | +| raise.rb:94:1:119:3 | Entry | raise.rb:99:11:99:15 | After ... < ... [false] | +| raise.rb:94:1:119:3 | Entry | raise.rb:99:11:99:15 | After ... < ... [true] | +| raise.rb:94:1:119:3 | Entry | raise.rb:102:5:102:22 | After call to puts | +| raise.rb:94:1:119:3 | Entry | raise.rb:103:3:111:7 | ensure ... | +| raise.rb:94:1:119:3 | Entry | raise.rb:104:5:104:23 | After call to puts | +| raise.rb:94:1:119:3 | Entry | raise.rb:105:5:111:7 | After begin ... | +| raise.rb:94:1:119:3 | Entry | raise.rb:106:10:106:11 | After b1 [false] | +| raise.rb:94:1:119:3 | Entry | raise.rb:106:10:106:11 | After b1 [true] | +| raise.rb:94:1:119:3 | Entry | raise.rb:109:5:110:25 | ensure ... | +| raise.rb:94:1:119:3 | Entry | raise.rb:110:7:110:25 | After call to puts | +| raise.rb:94:1:119:3 | Entry | raise.rb:113:3:113:15 | After call to puts | +| raise.rb:94:1:119:3 | Entry | raise.rb:114:1:118:5 | ensure ... | +| raise.rb:94:1:119:3 | Entry | raise.rb:116:6:116:7 | After b2 [false] | +| raise.rb:94:1:119:3 | Entry | raise.rb:116:6:116:7 | After b2 [true] | +| raise.rb:94:1:119:3 | Exceptional Exit | raise.rb:94:1:119:3 | Exceptional Exit | +| raise.rb:94:1:119:3 | Exit | raise.rb:94:1:119:3 | Exit | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:94:1:119:3 | Normal Exit | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:95:3:95:17 | After call to puts | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:96:3:112:5 | After begin ... | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:97:8:97:12 | After ... > ... [false] | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:97:8:97:12 | After ... > ... [true] | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:99:11:99:15 | After ... < ... [false] | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:99:11:99:15 | After ... < ... [true] | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:102:5:102:22 | After call to puts | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:103:3:111:7 | ensure ... | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:104:5:104:23 | After call to puts | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:105:5:111:7 | After begin ... | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:106:10:106:11 | After b1 [false] | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:106:10:106:11 | After b1 [true] | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:109:5:110:25 | ensure ... | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:110:7:110:25 | After call to puts | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:113:3:113:15 | After call to puts | +| raise.rb:95:3:118:5 | After ... | raise.rb:95:3:118:5 | After ... | +| raise.rb:96:3:112:5 | After begin ... | raise.rb:96:3:112:5 | After begin ... | +| raise.rb:96:3:112:5 | After begin ... | raise.rb:113:3:113:15 | After call to puts | +| raise.rb:97:8:97:12 | After ... > ... [false] | raise.rb:97:8:97:12 | After ... > ... [false] | +| raise.rb:97:8:97:12 | After ... > ... [false] | raise.rb:99:11:99:15 | After ... < ... [false] | +| raise.rb:97:8:97:12 | After ... > ... [false] | raise.rb:99:11:99:15 | After ... < ... [true] | +| raise.rb:97:8:97:12 | After ... > ... [false] | raise.rb:102:5:102:22 | After call to puts | +| raise.rb:97:8:97:12 | After ... > ... [true] | raise.rb:97:8:97:12 | After ... > ... [true] | +| raise.rb:99:11:99:15 | After ... < ... [false] | raise.rb:99:11:99:15 | After ... < ... [false] | +| raise.rb:99:11:99:15 | After ... < ... [false] | raise.rb:102:5:102:22 | After call to puts | +| raise.rb:99:11:99:15 | After ... < ... [true] | raise.rb:99:11:99:15 | After ... < ... [true] | +| raise.rb:102:5:102:22 | After call to puts | raise.rb:102:5:102:22 | After call to puts | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:96:3:112:5 | After begin ... | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:103:3:111:7 | ensure ... | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:104:5:104:23 | After call to puts | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:105:5:111:7 | After begin ... | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:106:10:106:11 | After b1 [false] | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:106:10:106:11 | After b1 [true] | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:109:5:110:25 | ensure ... | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:110:7:110:25 | After call to puts | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:113:3:113:15 | After call to puts | +| raise.rb:104:5:104:23 | After call to puts | raise.rb:96:3:112:5 | After begin ... | +| raise.rb:104:5:104:23 | After call to puts | raise.rb:104:5:104:23 | After call to puts | +| raise.rb:104:5:104:23 | After call to puts | raise.rb:105:5:111:7 | After begin ... | +| raise.rb:104:5:104:23 | After call to puts | raise.rb:106:10:106:11 | After b1 [false] | +| raise.rb:104:5:104:23 | After call to puts | raise.rb:106:10:106:11 | After b1 [true] | +| raise.rb:104:5:104:23 | After call to puts | raise.rb:109:5:110:25 | ensure ... | +| raise.rb:104:5:104:23 | After call to puts | raise.rb:110:7:110:25 | After call to puts | +| raise.rb:104:5:104:23 | After call to puts | raise.rb:113:3:113:15 | After call to puts | +| raise.rb:105:5:111:7 | After begin ... | raise.rb:96:3:112:5 | After begin ... | +| raise.rb:105:5:111:7 | After begin ... | raise.rb:105:5:111:7 | After begin ... | +| raise.rb:105:5:111:7 | After begin ... | raise.rb:113:3:113:15 | After call to puts | +| raise.rb:106:10:106:11 | After b1 [false] | raise.rb:106:10:106:11 | After b1 [false] | +| raise.rb:106:10:106:11 | After b1 [true] | raise.rb:106:10:106:11 | After b1 [true] | +| raise.rb:109:5:110:25 | ensure ... | raise.rb:96:3:112:5 | After begin ... | +| raise.rb:109:5:110:25 | ensure ... | raise.rb:105:5:111:7 | After begin ... | | raise.rb:109:5:110:25 | ensure ... | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:109:5:110:25 | ensure ... | raise.rb:115:3:115:22 | self | -| raise.rb:109:5:110:25 | ensure ... | raise.rb:116:3:118:5 | if ... | -| raise.rb:109:5:110:25 | ensure ... | raise.rb:117:5:117:22 | self | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:115:3:115:22 | [ensure: exception] self | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:116:3:118:5 | [ensure: exception] if ... | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:117:5:117:22 | [ensure: exception] self | -| raise.rb:115:3:115:22 | self | raise.rb:115:3:115:22 | self | -| raise.rb:115:3:115:22 | self | raise.rb:116:3:118:5 | if ... | -| raise.rb:115:3:115:22 | self | raise.rb:117:5:117:22 | self | -| raise.rb:116:3:118:5 | [ensure: exception] if ... | raise.rb:116:3:118:5 | [ensure: exception] if ... | -| raise.rb:116:3:118:5 | [ensure: return] if ... | raise.rb:116:3:118:5 | [ensure: return] if ... | -| raise.rb:116:3:118:5 | if ... | raise.rb:116:3:118:5 | if ... | -| raise.rb:117:5:117:22 | [ensure: exception] self | raise.rb:117:5:117:22 | [ensure: exception] self | -| raise.rb:117:5:117:22 | [ensure: return] self | raise.rb:117:5:117:22 | [ensure: return] self | -| raise.rb:117:5:117:22 | self | raise.rb:117:5:117:22 | self | -| raise.rb:121:1:126:3 | enter m10 | raise.rb:121:1:126:3 | enter m10 | -| raise.rb:121:1:126:3 | enter m10 | raise.rb:121:1:126:3 | exit m10 | -| raise.rb:121:1:126:3 | enter m10 | raise.rb:121:14:121:30 | self | -| raise.rb:121:1:126:3 | enter m10 | raise.rb:125:3:125:51 | self | -| raise.rb:121:1:126:3 | exit m10 | raise.rb:121:1:126:3 | exit m10 | -| raise.rb:121:14:121:30 | self | raise.rb:121:14:121:30 | self | -| raise.rb:125:3:125:51 | self | raise.rb:125:3:125:51 | self | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:128:1:140:3 | enter m11 | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:128:1:140:3 | exit m11 | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:130:5:132:7 | if ... | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:131:7:131:22 | self | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:133:3:133:19 | rescue ... | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:134:10:134:19 | ExceptionB | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:135:5:135:21 | self | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:137:5:137:17 | [ensure: exception] self | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:137:5:137:17 | self | -| raise.rb:128:1:140:3 | exit m11 | raise.rb:128:1:140:3 | exit m11 | -| raise.rb:130:5:132:7 | if ... | raise.rb:130:5:132:7 | if ... | -| raise.rb:131:7:131:22 | self | raise.rb:131:7:131:22 | self | -| raise.rb:131:7:131:22 | self | raise.rb:133:3:133:19 | rescue ... | -| raise.rb:131:7:131:22 | self | raise.rb:134:10:134:19 | ExceptionB | -| raise.rb:131:7:131:22 | self | raise.rb:135:5:135:21 | self | -| raise.rb:131:7:131:22 | self | raise.rb:137:5:137:17 | [ensure: exception] self | -| raise.rb:133:3:133:19 | rescue ... | raise.rb:133:3:133:19 | rescue ... | -| raise.rb:134:10:134:19 | ExceptionB | raise.rb:134:10:134:19 | ExceptionB | -| raise.rb:134:10:134:19 | ExceptionB | raise.rb:135:5:135:21 | self | -| raise.rb:134:10:134:19 | ExceptionB | raise.rb:137:5:137:17 | [ensure: exception] self | -| raise.rb:135:5:135:21 | self | raise.rb:135:5:135:21 | self | -| raise.rb:137:5:137:17 | [ensure: exception] self | raise.rb:137:5:137:17 | [ensure: exception] self | -| raise.rb:137:5:137:17 | self | raise.rb:137:5:137:17 | self | -| raise.rb:142:1:148:3 | enter m12 | raise.rb:142:1:148:3 | enter m12 | -| raise.rb:142:1:148:3 | enter m12 | raise.rb:142:1:148:3 | exit m12 (normal) | -| raise.rb:142:1:148:3 | enter m12 | raise.rb:143:3:145:5 | if ... | -| raise.rb:142:1:148:3 | enter m12 | raise.rb:144:5:144:12 | self | -| raise.rb:142:1:148:3 | exit m12 (normal) | raise.rb:142:1:148:3 | exit m12 (normal) | -| raise.rb:143:3:145:5 | if ... | raise.rb:143:3:145:5 | if ... | -| raise.rb:144:5:144:12 | self | raise.rb:144:5:144:12 | self | -| raise.rb:150:1:152:3 | enter m13 | raise.rb:150:1:152:3 | enter m13 | -| raise.rb:154:1:156:3 | enter m14 | raise.rb:154:1:156:3 | enter m14 | -| raise.rb:155:16:155:50 | enter { ... } | raise.rb:155:16:155:50 | enter { ... } | -| raise.rb:155:16:155:50 | enter { ... } | raise.rb:155:16:155:50 | exit { ... } | -| raise.rb:155:16:155:50 | enter { ... } | raise.rb:155:25:155:32 | self | -| raise.rb:155:16:155:50 | enter { ... } | raise.rb:155:25:155:48 | ... if ... | -| raise.rb:155:16:155:50 | exit { ... } | raise.rb:155:16:155:50 | exit { ... } | -| raise.rb:155:25:155:32 | self | raise.rb:155:25:155:32 | self | -| raise.rb:155:25:155:48 | ... if ... | raise.rb:155:25:155:48 | ... if ... | -| raise.rb:158:1:164:3 | enter m15 | raise.rb:158:1:164:3 | enter m15 | -| raise.rb:159:7:163:5 | enter do ... end | raise.rb:159:7:163:5 | enter do ... end | -| raise.rb:160:9:162:7 | enter -> { ... } | raise.rb:160:9:162:7 | enter -> { ... } | -| raise.rb:160:9:162:7 | enter -> { ... } | raise.rb:160:9:162:7 | exit -> { ... } | -| raise.rb:160:9:162:7 | enter -> { ... } | raise.rb:161:7:161:14 | self | -| raise.rb:160:9:162:7 | enter -> { ... } | raise.rb:161:7:161:23 | ... unless ... | -| raise.rb:160:9:162:7 | exit -> { ... } | raise.rb:160:9:162:7 | exit -> { ... } | -| raise.rb:161:7:161:14 | self | raise.rb:161:7:161:14 | self | -| raise.rb:161:7:161:23 | ... unless ... | raise.rb:161:7:161:23 | ... unless ... | -| raise.rb:167:3:169:5 | enter m | raise.rb:167:3:169:5 | enter m | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:172:1:182:3 | enter m16 | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:172:1:182:3 | exit m16 | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:172:1:182:3 | exit m16 (abnormal) | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:172:1:182:3 | exit m16 (normal) | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:174:8:174:23 | [false] ... \|\| ... | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:174:8:174:23 | [true] ... \|\| ... | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:174:14:174:15 | b2 | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:175:14:175:14 | 1 | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:177:14:177:14 | 2 | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:179:10:179:19 | ExceptionA | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:180:12:180:12 | 3 | -| raise.rb:172:1:182:3 | exit m16 | raise.rb:172:1:182:3 | exit m16 | -| raise.rb:172:1:182:3 | exit m16 (abnormal) | raise.rb:172:1:182:3 | exit m16 (abnormal) | -| raise.rb:172:1:182:3 | exit m16 (normal) | raise.rb:172:1:182:3 | exit m16 (normal) | -| raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:174:8:174:23 | [false] ... \|\| ... | -| raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:177:14:177:14 | 2 | -| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:174:8:174:23 | [true] ... \|\| ... | -| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:175:14:175:14 | 1 | -| raise.rb:174:14:174:15 | b2 | raise.rb:174:8:174:23 | [false] ... \|\| ... | -| raise.rb:174:14:174:15 | b2 | raise.rb:174:14:174:15 | b2 | -| raise.rb:174:14:174:15 | b2 | raise.rb:177:14:177:14 | 2 | -| raise.rb:175:14:175:14 | 1 | raise.rb:175:14:175:14 | 1 | -| raise.rb:177:14:177:14 | 2 | raise.rb:177:14:177:14 | 2 | -| raise.rb:179:10:179:19 | ExceptionA | raise.rb:172:1:182:3 | exit m16 (abnormal) | -| raise.rb:179:10:179:19 | ExceptionA | raise.rb:179:10:179:19 | ExceptionA | -| raise.rb:179:10:179:19 | ExceptionA | raise.rb:180:12:180:12 | 3 | -| raise.rb:180:12:180:12 | 3 | raise.rb:180:12:180:12 | 3 | +| raise.rb:109:5:110:25 | ensure ... | raise.rb:110:7:110:25 | After call to puts | +| raise.rb:109:5:110:25 | ensure ... | raise.rb:113:3:113:15 | After call to puts | +| raise.rb:110:7:110:25 | After call to puts | raise.rb:96:3:112:5 | After begin ... | +| raise.rb:110:7:110:25 | After call to puts | raise.rb:105:5:111:7 | After begin ... | +| raise.rb:110:7:110:25 | After call to puts | raise.rb:110:7:110:25 | After call to puts | +| raise.rb:110:7:110:25 | After call to puts | raise.rb:113:3:113:15 | After call to puts | +| raise.rb:113:3:113:15 | After call to puts | raise.rb:113:3:113:15 | After call to puts | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:94:1:119:3 | Exceptional Exit | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:94:1:119:3 | Exit | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:94:1:119:3 | Normal Exit | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:95:3:118:5 | After ... | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:114:1:118:5 | ensure ... | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:116:6:116:7 | After b2 [false] | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:116:6:116:7 | After b2 [true] | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:94:1:119:3 | Normal Exit | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:95:3:118:5 | After ... | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:116:6:116:7 | After b2 [false] | +| raise.rb:116:6:116:7 | After b2 [true] | raise.rb:116:6:116:7 | After b2 [true] | +| raise.rb:121:1:126:3 | Entry | raise.rb:121:1:126:3 | Entry | +| raise.rb:121:1:126:3 | Entry | raise.rb:121:1:126:3 | Exit | +| raise.rb:121:1:126:3 | Entry | raise.rb:121:9:121:9 | After p [match] | +| raise.rb:121:1:126:3 | Entry | raise.rb:121:9:121:9 | After p [no-match] | +| raise.rb:121:1:126:3 | Exit | raise.rb:121:1:126:3 | Exit | +| raise.rb:121:9:121:9 | After p [match] | raise.rb:121:9:121:9 | After p [match] | +| raise.rb:121:9:121:9 | After p [no-match] | raise.rb:121:9:121:9 | After p [no-match] | +| raise.rb:128:1:140:3 | Entry | raise.rb:128:1:140:3 | Entry | +| raise.rb:128:1:140:3 | Entry | raise.rb:128:1:140:3 | Exceptional Exit | +| raise.rb:128:1:140:3 | Entry | raise.rb:128:1:140:3 | Exit | +| raise.rb:128:1:140:3 | Entry | raise.rb:129:3:138:5 | After begin ... | +| raise.rb:128:1:140:3 | Entry | raise.rb:130:8:130:8 | After b [false] | +| raise.rb:128:1:140:3 | Entry | raise.rb:130:8:130:8 | After b [true] | +| raise.rb:128:1:140:3 | Entry | raise.rb:133:10:133:19 | After ExceptionA [match] | +| raise.rb:128:1:140:3 | Entry | raise.rb:133:10:133:19 | After ExceptionA [no-match] | +| raise.rb:128:1:140:3 | Entry | raise.rb:134:10:134:19 | After ExceptionB [match] | +| raise.rb:128:1:140:3 | Entry | raise.rb:134:10:134:19 | After ExceptionB [no-match] | +| raise.rb:128:1:140:3 | Entry | raise.rb:136:3:137:17 | ensure ... | +| raise.rb:128:1:140:3 | Exceptional Exit | raise.rb:128:1:140:3 | Exceptional Exit | +| raise.rb:128:1:140:3 | Exit | raise.rb:128:1:140:3 | Exit | +| raise.rb:129:3:138:5 | After begin ... | raise.rb:129:3:138:5 | After begin ... | +| raise.rb:130:8:130:8 | After b [false] | raise.rb:130:8:130:8 | After b [false] | +| raise.rb:130:8:130:8 | After b [true] | raise.rb:130:8:130:8 | After b [true] | +| raise.rb:130:8:130:8 | After b [true] | raise.rb:133:10:133:19 | After ExceptionA [match] | +| raise.rb:130:8:130:8 | After b [true] | raise.rb:133:10:133:19 | After ExceptionA [no-match] | +| raise.rb:130:8:130:8 | After b [true] | raise.rb:134:10:134:19 | After ExceptionB [match] | +| raise.rb:130:8:130:8 | After b [true] | raise.rb:134:10:134:19 | After ExceptionB [no-match] | +| raise.rb:133:10:133:19 | After ExceptionA [match] | raise.rb:133:10:133:19 | After ExceptionA [match] | +| raise.rb:133:10:133:19 | After ExceptionA [no-match] | raise.rb:133:10:133:19 | After ExceptionA [no-match] | +| raise.rb:133:10:133:19 | After ExceptionA [no-match] | raise.rb:134:10:134:19 | After ExceptionB [match] | +| raise.rb:133:10:133:19 | After ExceptionA [no-match] | raise.rb:134:10:134:19 | After ExceptionB [no-match] | +| raise.rb:134:10:134:19 | After ExceptionB [match] | raise.rb:134:10:134:19 | After ExceptionB [match] | +| raise.rb:134:10:134:19 | After ExceptionB [no-match] | raise.rb:134:10:134:19 | After ExceptionB [no-match] | +| raise.rb:136:3:137:17 | ensure ... | raise.rb:128:1:140:3 | Exceptional Exit | +| raise.rb:136:3:137:17 | ensure ... | raise.rb:128:1:140:3 | Exit | +| raise.rb:136:3:137:17 | ensure ... | raise.rb:129:3:138:5 | After begin ... | +| raise.rb:136:3:137:17 | ensure ... | raise.rb:136:3:137:17 | ensure ... | +| raise.rb:142:1:148:3 | Entry | raise.rb:142:1:148:3 | Entry | +| raise.rb:142:1:148:3 | Entry | raise.rb:143:6:143:6 | After b [false] | +| raise.rb:142:1:148:3 | Entry | raise.rb:143:6:143:6 | After b [true] | +| raise.rb:142:1:148:3 | Entry | raise.rb:146:1:147:10 | ensure ... | +| raise.rb:143:6:143:6 | After b [false] | raise.rb:143:6:143:6 | After b [false] | +| raise.rb:143:6:143:6 | After b [true] | raise.rb:143:6:143:6 | After b [true] | +| raise.rb:146:1:147:10 | ensure ... | raise.rb:146:1:147:10 | ensure ... | +| raise.rb:150:1:152:3 | Entry | raise.rb:150:1:152:3 | Entry | +| raise.rb:154:1:156:3 | Entry | raise.rb:154:1:156:3 | Entry | +| raise.rb:155:16:155:50 | Entry | raise.rb:155:16:155:50 | Entry | +| raise.rb:155:16:155:50 | Entry | raise.rb:155:16:155:50 | Exit | +| raise.rb:155:16:155:50 | Entry | raise.rb:155:37:155:48 | After call to nil? [false] | +| raise.rb:155:16:155:50 | Entry | raise.rb:155:37:155:48 | After call to nil? [true] | +| raise.rb:155:16:155:50 | Exit | raise.rb:155:16:155:50 | Exit | +| raise.rb:155:37:155:48 | After call to nil? [false] | raise.rb:155:37:155:48 | After call to nil? [false] | +| raise.rb:155:37:155:48 | After call to nil? [true] | raise.rb:155:37:155:48 | After call to nil? [true] | +| raise.rb:158:1:164:3 | Entry | raise.rb:158:1:164:3 | Entry | +| raise.rb:159:7:163:5 | Entry | raise.rb:159:7:163:5 | Entry | +| raise.rb:160:9:162:7 | Entry | raise.rb:160:9:162:7 | Entry | +| raise.rb:160:9:162:7 | Entry | raise.rb:160:9:162:7 | Exit | +| raise.rb:160:9:162:7 | Entry | raise.rb:161:23:161:23 | After x [false] | +| raise.rb:160:9:162:7 | Entry | raise.rb:161:23:161:23 | After x [true] | +| raise.rb:160:9:162:7 | Exit | raise.rb:160:9:162:7 | Exit | +| raise.rb:161:23:161:23 | After x [false] | raise.rb:161:23:161:23 | After x [false] | +| raise.rb:161:23:161:23 | After x [true] | raise.rb:161:23:161:23 | After x [true] | +| raise.rb:167:3:169:5 | Entry | raise.rb:167:3:169:5 | Entry | +| raise.rb:172:1:182:3 | Entry | raise.rb:172:1:182:3 | Entry | +| raise.rb:172:1:182:3 | Entry | raise.rb:172:1:182:3 | Exit | +| raise.rb:172:1:182:3 | Entry | raise.rb:172:1:182:3 | Normal Exit | +| raise.rb:172:1:182:3 | Entry | raise.rb:174:8:174:9 | After b1 [false] | +| raise.rb:172:1:182:3 | Entry | raise.rb:174:8:174:9 | After b1 [true] | +| raise.rb:172:1:182:3 | Entry | raise.rb:174:8:174:23 | After ... \|\| ... [true] | +| raise.rb:172:1:182:3 | Entry | raise.rb:174:14:174:23 | After ... == ... [false] | +| raise.rb:172:1:182:3 | Entry | raise.rb:174:14:174:23 | After ... == ... [true] | +| raise.rb:172:1:182:3 | Entry | raise.rb:179:3:180:12 | rescue ... | +| raise.rb:172:1:182:3 | Entry | raise.rb:179:10:179:19 | After ExceptionA [match] | +| raise.rb:172:1:182:3 | Entry | raise.rb:179:10:179:19 | After ExceptionA [no-match] | +| raise.rb:172:1:182:3 | Exit | raise.rb:172:1:182:3 | Exit | +| raise.rb:172:1:182:3 | Normal Exit | raise.rb:172:1:182:3 | Normal Exit | +| raise.rb:174:8:174:9 | After b1 [false] | raise.rb:174:8:174:9 | After b1 [false] | +| raise.rb:174:8:174:9 | After b1 [false] | raise.rb:174:14:174:23 | After ... == ... [false] | +| raise.rb:174:8:174:9 | After b1 [false] | raise.rb:174:14:174:23 | After ... == ... [true] | +| raise.rb:174:8:174:9 | After b1 [false] | raise.rb:179:3:180:12 | rescue ... | +| raise.rb:174:8:174:9 | After b1 [false] | raise.rb:179:10:179:19 | After ExceptionA [match] | +| raise.rb:174:8:174:9 | After b1 [false] | raise.rb:179:10:179:19 | After ExceptionA [no-match] | +| raise.rb:174:8:174:9 | After b1 [true] | raise.rb:174:8:174:9 | After b1 [true] | +| raise.rb:174:8:174:23 | After ... \|\| ... [true] | raise.rb:174:8:174:23 | After ... \|\| ... [true] | +| raise.rb:174:14:174:23 | After ... == ... [false] | raise.rb:174:14:174:23 | After ... == ... [false] | +| raise.rb:174:14:174:23 | After ... == ... [true] | raise.rb:174:14:174:23 | After ... == ... [true] | +| raise.rb:179:3:180:12 | rescue ... | raise.rb:179:3:180:12 | rescue ... | +| raise.rb:179:3:180:12 | rescue ... | raise.rb:179:10:179:19 | After ExceptionA [match] | +| raise.rb:179:3:180:12 | rescue ... | raise.rb:179:10:179:19 | After ExceptionA [no-match] | +| raise.rb:179:10:179:19 | After ExceptionA [match] | raise.rb:179:10:179:19 | After ExceptionA [match] | +| raise.rb:179:10:179:19 | After ExceptionA [no-match] | raise.rb:179:10:179:19 | After ExceptionA [no-match] | postDominance -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:1:1:11:3 | enter m1 | -| break_ensure.rb:1:1:11:3 | exit m1 | break_ensure.rb:1:1:11:3 | exit m1 | -| break_ensure.rb:1:1:56:4 | enter break_ensure.rb | break_ensure.rb:1:1:56:4 | enter break_ensure.rb | -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:1:1:11:3 | enter m1 | -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:2:3:6:5 | while ... | -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:2:9:2:9 | x | -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:3:5:5:7 | if ... | -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:3:8:3:8 | x | -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:4:7:4:11 | break | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:1:1:11:3 | enter m1 | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:2:9:2:9 | x | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:3:5:5:7 | if ... | -| break_ensure.rb:3:5:5:7 | if ... | break_ensure.rb:3:5:5:7 | if ... | -| break_ensure.rb:3:8:3:8 | x | break_ensure.rb:3:8:3:8 | x | -| break_ensure.rb:4:7:4:11 | break | break_ensure.rb:4:7:4:11 | break | -| break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | -| break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:1:1:11:3 | enter m1 | -| break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:2:3:6:5 | while ... | -| break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:2:9:2:9 | x | -| break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:3:5:5:7 | if ... | -| break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:3:8:3:8 | x | -| break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:4:7:4:11 | break | -| break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:8:3:10:5 | if ... | -| break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:9:5:9:23 | self | -| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:8:6:8:13 | [ensure: exception] self | -| break_ensure.rb:9:5:9:23 | [ensure: exception] self | break_ensure.rb:9:5:9:23 | [ensure: exception] self | -| break_ensure.rb:9:5:9:23 | self | break_ensure.rb:9:5:9:23 | self | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:13:1:25:3 | enter m2 | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:13:1:25:3 | enter m2 | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:14:3:24:5 | while ... | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:14:9:14:9 | x | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:16:7:18:9 | if ... | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:16:10:16:10 | x | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:17:9:17:13 | break | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:20:7:22:9 | if ... | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:20:10:20:10 | [ensure: exception] y | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:21:9:21:20 | [ensure: break] self | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:21:9:21:20 | [ensure: exception] self | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:21:9:21:20 | self | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:13:1:25:3 | enter m2 | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:14:9:14:9 | x | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:16:7:18:9 | if ... | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | if ... | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:21:9:21:20 | self | -| break_ensure.rb:16:7:18:9 | if ... | break_ensure.rb:16:7:18:9 | if ... | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:16:10:16:10 | x | -| break_ensure.rb:17:9:17:13 | break | break_ensure.rb:17:9:17:13 | break | -| break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:17:9:17:13 | break | -| break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | -| break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:21:9:21:20 | [ensure: break] self | -| break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | -| break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:20:10:20:10 | [ensure: exception] y | -| break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:21:9:21:20 | [ensure: exception] self | -| break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:16:7:18:9 | if ... | -| break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:20:7:22:9 | if ... | -| break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:21:9:21:20 | self | -| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:20:10:20:10 | [ensure: exception] y | -| break_ensure.rb:21:9:21:20 | [ensure: break] self | break_ensure.rb:21:9:21:20 | [ensure: break] self | -| break_ensure.rb:21:9:21:20 | [ensure: exception] self | break_ensure.rb:21:9:21:20 | [ensure: exception] self | -| break_ensure.rb:21:9:21:20 | self | break_ensure.rb:21:9:21:20 | self | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:27:1:42:3 | enter m3 | -| break_ensure.rb:27:1:42:3 | exit m3 | break_ensure.rb:27:1:42:3 | exit m3 | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:27:1:42:3 | enter m3 | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:27:1:42:3 | exit m3 (normal) | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:29:5:31:7 | if ... | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:30:7:30:12 | return | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:33:5:39:7 | while ... | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:33:11:33:11 | [ensure: return] y | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:33:11:33:11 | y | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:35:9:37:11 | if ... | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:35:12:35:12 | [ensure: return] x | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:35:12:35:12 | x | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:36:11:36:15 | [ensure: return] break | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:36:11:36:15 | break | -| break_ensure.rb:29:5:31:7 | if ... | break_ensure.rb:29:5:31:7 | if ... | -| break_ensure.rb:30:7:30:12 | return | break_ensure.rb:30:7:30:12 | return | -| break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | -| break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:30:7:30:12 | return | -| break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | -| break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:33:11:33:11 | [ensure: return] y | -| break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | -| break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:35:12:35:12 | [ensure: return] x | -| break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:36:11:36:15 | [ensure: return] break | -| break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:29:5:31:7 | if ... | -| break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:33:5:39:7 | while ... | -| break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:33:11:33:11 | y | -| break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:35:9:37:11 | if ... | -| break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:35:12:35:12 | x | -| break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:36:11:36:15 | break | -| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:33:11:33:11 | [ensure: exception] y | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:30:7:30:12 | return | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:33:11:33:11 | [ensure: return] y | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:29:5:31:7 | if ... | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:33:11:33:11 | y | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:35:9:37:11 | if ... | -| break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | -| break_ensure.rb:35:9:37:11 | [ensure: return] if ... | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | -| break_ensure.rb:35:9:37:11 | if ... | break_ensure.rb:35:9:37:11 | if ... | -| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:35:12:35:12 | [ensure: exception] x | -| break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:35:12:35:12 | [ensure: return] x | -| break_ensure.rb:35:12:35:12 | x | break_ensure.rb:35:12:35:12 | x | -| break_ensure.rb:36:11:36:15 | [ensure: exception] break | break_ensure.rb:36:11:36:15 | [ensure: exception] break | -| break_ensure.rb:36:11:36:15 | [ensure: return] break | break_ensure.rb:36:11:36:15 | [ensure: return] break | -| break_ensure.rb:36:11:36:15 | break | break_ensure.rb:36:11:36:15 | break | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:44:1:56:3 | enter m4 | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:44:1:56:3 | enter m4 | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:45:3:55:5 | while ... | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:45:9:45:9 | x | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:47:7:49:9 | if ... | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:47:10:47:10 | x | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:48:9:48:16 | self | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:51:7:53:9 | if ... | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:51:10:51:10 | [ensure: exception] x | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:52:15:52:16 | 10 | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:44:1:56:3 | enter m4 | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:45:9:45:9 | x | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:7:53:9 | if ... | -| break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:47:7:49:9 | if ... | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:47:10:47:10 | x | -| break_ensure.rb:48:9:48:16 | self | break_ensure.rb:48:9:48:16 | self | -| break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | -| break_ensure.rb:51:7:53:9 | if ... | break_ensure.rb:51:7:53:9 | if ... | -| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:48:9:48:16 | self | -| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:51:10:51:10 | [ensure: exception] x | -| break_ensure.rb:52:15:52:16 | 10 | break_ensure.rb:52:15:52:16 | 10 | -| break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:1:1:6:3 | enter if_in_case | -| case.rb:1:1:99:4 | enter case.rb | case.rb:1:1:99:4 | enter case.rb | -| case.rb:2:3:5:5 | case ... | case.rb:1:1:6:3 | enter if_in_case | -| case.rb:2:3:5:5 | case ... | case.rb:2:3:5:5 | case ... | -| case.rb:2:3:5:5 | case ... | case.rb:3:5:3:42 | [match] when ... | -| case.rb:2:3:5:5 | case ... | case.rb:3:5:3:42 | [no-match] when ... | -| case.rb:2:3:5:5 | case ... | case.rb:3:18:3:41 | if ... | -| case.rb:2:3:5:5 | case ... | case.rb:3:21:3:22 | self | -| case.rb:2:3:5:5 | case ... | case.rb:3:29:3:37 | self | -| case.rb:2:3:5:5 | case ... | case.rb:4:5:4:24 | [match] when ... | -| case.rb:2:3:5:5 | case ... | case.rb:4:5:4:24 | [no-match] when ... | -| case.rb:2:3:5:5 | case ... | case.rb:4:10:4:10 | 2 | -| case.rb:2:3:5:5 | case ... | case.rb:4:17:4:24 | self | -| case.rb:3:5:3:42 | [match] when ... | case.rb:3:5:3:42 | [match] when ... | -| case.rb:3:5:3:42 | [no-match] when ... | case.rb:3:5:3:42 | [no-match] when ... | -| case.rb:3:18:3:41 | if ... | case.rb:3:5:3:42 | [match] when ... | -| case.rb:3:18:3:41 | if ... | case.rb:3:18:3:41 | if ... | -| case.rb:3:18:3:41 | if ... | case.rb:3:21:3:22 | self | -| case.rb:3:18:3:41 | if ... | case.rb:3:29:3:37 | self | -| case.rb:3:21:3:22 | self | case.rb:3:5:3:42 | [match] when ... | -| case.rb:3:21:3:22 | self | case.rb:3:21:3:22 | self | -| case.rb:3:29:3:37 | self | case.rb:3:29:3:37 | self | -| case.rb:4:5:4:24 | [match] when ... | case.rb:4:5:4:24 | [match] when ... | -| case.rb:4:5:4:24 | [no-match] when ... | case.rb:4:5:4:24 | [no-match] when ... | -| case.rb:4:10:4:10 | 2 | case.rb:3:5:3:42 | [no-match] when ... | -| case.rb:4:10:4:10 | 2 | case.rb:4:10:4:10 | 2 | -| case.rb:4:17:4:24 | self | case.rb:4:5:4:24 | [match] when ... | -| case.rb:4:17:4:24 | self | case.rb:4:17:4:24 | self | -| case.rb:8:1:18:3 | enter case_match | case.rb:8:1:18:3 | enter case_match | -| case.rb:9:3:17:5 | case ... | case.rb:8:1:18:3 | enter case_match | -| case.rb:9:3:17:5 | case ... | case.rb:9:3:17:5 | case ... | -| case.rb:9:3:17:5 | case ... | case.rb:11:5:11:15 | in ... then ... | -| case.rb:9:3:17:5 | case ... | case.rb:11:15:11:15 | 3 | -| case.rb:9:3:17:5 | case ... | case.rb:12:5:13:7 | in ... then ... | -| case.rb:9:3:17:5 | case ... | case.rb:13:7:13:7 | 4 | -| case.rb:9:3:17:5 | case ... | case.rb:14:5:14:25 | in ... then ... | -| case.rb:9:3:17:5 | case ... | case.rb:14:13:14:13 | x | -| case.rb:9:3:17:5 | case ... | case.rb:14:25:14:25 | 6 | -| case.rb:9:3:17:5 | case ... | case.rb:15:5:15:28 | in ... then ... | -| case.rb:9:3:17:5 | case ... | case.rb:15:17:15:17 | x | -| case.rb:9:3:17:5 | case ... | case.rb:15:28:15:28 | 7 | -| case.rb:9:3:17:5 | case ... | case.rb:16:10:16:10 | 8 | -| case.rb:11:5:11:15 | in ... then ... | case.rb:11:5:11:15 | in ... then ... | -| case.rb:11:15:11:15 | 3 | case.rb:11:15:11:15 | 3 | -| case.rb:12:5:13:7 | in ... then ... | case.rb:12:5:13:7 | in ... then ... | -| case.rb:13:7:13:7 | 4 | case.rb:13:7:13:7 | 4 | -| case.rb:14:5:14:25 | in ... then ... | case.rb:14:5:14:25 | in ... then ... | -| case.rb:14:13:14:13 | x | case.rb:14:5:14:25 | in ... then ... | -| case.rb:14:13:14:13 | x | case.rb:14:13:14:13 | x | -| case.rb:14:25:14:25 | 6 | case.rb:14:25:14:25 | 6 | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:1:1:11:3 | Entry | +| break_ensure.rb:1:1:11:3 | Exceptional Exit | break_ensure.rb:1:1:11:3 | Exceptional Exit | +| break_ensure.rb:1:1:11:3 | Exit | break_ensure.rb:1:1:11:3 | Exit | +| break_ensure.rb:1:1:56:4 | Entry | break_ensure.rb:1:1:56:4 | Entry | +| break_ensure.rb:2:3:6:5 | After while ... | break_ensure.rb:2:3:6:5 | After while ... | +| break_ensure.rb:2:3:6:5 | After while ... | break_ensure.rb:2:9:2:13 | After ... < ... [false] | +| break_ensure.rb:2:3:6:5 | After while ... | break_ensure.rb:3:8:3:12 | After ... > ... [true] | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:1:1:11:3 | Entry | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:3:8:3:12 | After ... > ... [false] | +| break_ensure.rb:2:3:10:5 | After ... | break_ensure.rb:1:1:11:3 | Entry | +| break_ensure.rb:2:3:10:5 | After ... | break_ensure.rb:2:3:6:5 | After while ... | +| break_ensure.rb:2:3:10:5 | After ... | break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | +| break_ensure.rb:2:3:10:5 | After ... | break_ensure.rb:2:3:10:5 | After ... | +| break_ensure.rb:2:3:10:5 | After ... | break_ensure.rb:2:9:2:13 | After ... < ... [false] | +| break_ensure.rb:2:3:10:5 | After ... | break_ensure.rb:2:9:2:13 | After ... < ... [true] | +| break_ensure.rb:2:3:10:5 | After ... | break_ensure.rb:3:8:3:12 | After ... > ... [false] | +| break_ensure.rb:2:3:10:5 | After ... | break_ensure.rb:3:8:3:12 | After ... > ... [true] | +| break_ensure.rb:2:3:10:5 | After ... | break_ensure.rb:7:1:10:5 | ensure ... | +| break_ensure.rb:2:3:10:5 | After ... | break_ensure.rb:8:3:10:5 | After if ... | +| break_ensure.rb:2:3:10:5 | After ... | break_ensure.rb:8:6:8:18 | After call to nil? [false] | +| break_ensure.rb:2:3:10:5 | After ... | break_ensure.rb:8:6:8:18 | After call to nil? [true] | +| break_ensure.rb:2:9:2:13 | After ... < ... [false] | break_ensure.rb:2:9:2:13 | After ... < ... [false] | +| break_ensure.rb:2:9:2:13 | After ... < ... [true] | break_ensure.rb:2:9:2:13 | After ... < ... [true] | +| break_ensure.rb:3:8:3:12 | After ... > ... [false] | break_ensure.rb:3:8:3:12 | After ... > ... [false] | +| break_ensure.rb:3:8:3:12 | After ... > ... [true] | break_ensure.rb:3:8:3:12 | After ... > ... [true] | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:1:1:11:3 | Entry | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:2:3:6:5 | After while ... | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:2:9:2:13 | After ... < ... [false] | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:2:9:2:13 | After ... < ... [true] | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:3:8:3:12 | After ... > ... [false] | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:3:8:3:12 | After ... > ... [true] | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:7:1:10:5 | ensure ... | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:1:1:11:3 | Entry | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:2:3:6:5 | After while ... | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:2:9:2:13 | After ... < ... [false] | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:2:9:2:13 | After ... < ... [true] | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:3:8:3:12 | After ... > ... [false] | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:3:8:3:12 | After ... > ... [true] | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:7:1:10:5 | ensure ... | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:8:3:10:5 | After if ... | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:8:6:8:18 | After call to nil? [false] | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:8:6:8:18 | After call to nil? [true] | +| break_ensure.rb:8:6:8:18 | After call to nil? [false] | break_ensure.rb:8:6:8:18 | After call to nil? [false] | +| break_ensure.rb:8:6:8:18 | After call to nil? [true] | break_ensure.rb:8:6:8:18 | After call to nil? [true] | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:13:1:25:3 | Entry | +| break_ensure.rb:13:1:25:3 | Exceptional Exit | break_ensure.rb:13:1:25:3 | Exceptional Exit | +| break_ensure.rb:13:1:25:3 | Exit | break_ensure.rb:13:1:25:3 | Exit | +| break_ensure.rb:14:3:24:5 | After while ... | break_ensure.rb:13:1:25:3 | Entry | +| break_ensure.rb:14:3:24:5 | After while ... | break_ensure.rb:14:3:24:5 | After while ... | +| break_ensure.rb:14:3:24:5 | After while ... | break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | +| break_ensure.rb:14:3:24:5 | After while ... | break_ensure.rb:14:9:14:13 | After ... < ... [false] | +| break_ensure.rb:14:3:24:5 | After while ... | break_ensure.rb:14:9:14:13 | After ... < ... [true] | +| break_ensure.rb:14:3:24:5 | After while ... | break_ensure.rb:15:5:23:7 | After begin ... | +| break_ensure.rb:14:3:24:5 | After while ... | break_ensure.rb:16:10:16:14 | After ... > ... [false] | +| break_ensure.rb:14:3:24:5 | After while ... | break_ensure.rb:16:10:16:14 | After ... > ... [true] | +| break_ensure.rb:14:3:24:5 | After while ... | break_ensure.rb:19:5:22:9 | ensure ... | +| break_ensure.rb:14:3:24:5 | After while ... | break_ensure.rb:20:7:22:9 | After if ... | +| break_ensure.rb:14:3:24:5 | After while ... | break_ensure.rb:20:10:20:15 | After call to nil? [false] | +| break_ensure.rb:14:3:24:5 | After while ... | break_ensure.rb:20:10:20:15 | After call to nil? [true] | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:13:1:25:3 | Entry | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:15:5:23:7 | After begin ... | +| break_ensure.rb:14:9:14:13 | After ... < ... [false] | break_ensure.rb:14:9:14:13 | After ... < ... [false] | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:14:9:14:13 | After ... < ... [true] | +| break_ensure.rb:15:5:23:7 | After begin ... | break_ensure.rb:15:5:23:7 | After begin ... | +| break_ensure.rb:16:10:16:14 | After ... > ... [false] | break_ensure.rb:16:10:16:14 | After ... > ... [false] | +| break_ensure.rb:16:10:16:14 | After ... > ... [true] | break_ensure.rb:16:10:16:14 | After ... > ... [true] | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:14:9:14:13 | After ... < ... [true] | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:16:10:16:14 | After ... > ... [false] | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:16:10:16:14 | After ... > ... [true] | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:19:5:22:9 | ensure ... | +| break_ensure.rb:20:7:22:9 | After if ... | break_ensure.rb:14:9:14:13 | After ... < ... [true] | +| break_ensure.rb:20:7:22:9 | After if ... | break_ensure.rb:16:10:16:14 | After ... > ... [false] | +| break_ensure.rb:20:7:22:9 | After if ... | break_ensure.rb:16:10:16:14 | After ... > ... [true] | +| break_ensure.rb:20:7:22:9 | After if ... | break_ensure.rb:19:5:22:9 | ensure ... | +| break_ensure.rb:20:7:22:9 | After if ... | break_ensure.rb:20:7:22:9 | After if ... | +| break_ensure.rb:20:7:22:9 | After if ... | break_ensure.rb:20:10:20:15 | After call to nil? [false] | +| break_ensure.rb:20:7:22:9 | After if ... | break_ensure.rb:20:10:20:15 | After call to nil? [true] | +| break_ensure.rb:20:10:20:15 | After call to nil? [false] | break_ensure.rb:20:10:20:15 | After call to nil? [false] | +| break_ensure.rb:20:10:20:15 | After call to nil? [true] | break_ensure.rb:20:10:20:15 | After call to nil? [true] | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:27:1:42:3 | Entry | +| break_ensure.rb:27:1:42:3 | Exceptional Exit | break_ensure.rb:27:1:42:3 | Exceptional Exit | +| break_ensure.rb:27:1:42:3 | Exit | break_ensure.rb:27:1:42:3 | Exit | +| break_ensure.rb:27:1:42:3 | Normal Exit | break_ensure.rb:27:1:42:3 | Entry | +| break_ensure.rb:27:1:42:3 | Normal Exit | break_ensure.rb:27:1:42:3 | Normal Exit | +| break_ensure.rb:27:1:42:3 | Normal Exit | break_ensure.rb:28:3:40:5 | After begin ... | +| break_ensure.rb:27:1:42:3 | Normal Exit | break_ensure.rb:29:8:29:13 | After call to nil? [false] | +| break_ensure.rb:27:1:42:3 | Normal Exit | break_ensure.rb:29:8:29:13 | After call to nil? [true] | +| break_ensure.rb:27:1:42:3 | Normal Exit | break_ensure.rb:32:3:39:7 | ensure ... | +| break_ensure.rb:27:1:42:3 | Normal Exit | break_ensure.rb:33:5:39:7 | After while ... | +| break_ensure.rb:27:1:42:3 | Normal Exit | break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | +| break_ensure.rb:27:1:42:3 | Normal Exit | break_ensure.rb:33:11:33:15 | After ... < ... [false] | +| break_ensure.rb:27:1:42:3 | Normal Exit | break_ensure.rb:33:11:33:15 | After ... < ... [true] | +| break_ensure.rb:27:1:42:3 | Normal Exit | break_ensure.rb:35:12:35:16 | After ... > ... [false] | +| break_ensure.rb:27:1:42:3 | Normal Exit | break_ensure.rb:35:12:35:16 | After ... > ... [true] | +| break_ensure.rb:28:3:40:5 | After begin ... | break_ensure.rb:28:3:40:5 | After begin ... | +| break_ensure.rb:29:8:29:13 | After call to nil? [false] | break_ensure.rb:29:8:29:13 | After call to nil? [false] | +| break_ensure.rb:29:8:29:13 | After call to nil? [true] | break_ensure.rb:29:8:29:13 | After call to nil? [true] | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:27:1:42:3 | Entry | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:29:8:29:13 | After call to nil? [false] | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:29:8:29:13 | After call to nil? [true] | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:32:3:39:7 | ensure ... | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:27:1:42:3 | Entry | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:29:8:29:13 | After call to nil? [false] | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:29:8:29:13 | After call to nil? [true] | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:32:3:39:7 | ensure ... | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:33:5:39:7 | After while ... | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:33:11:33:15 | After ... < ... [false] | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:33:11:33:15 | After ... < ... [true] | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:35:12:35:16 | After ... > ... [false] | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:35:12:35:16 | After ... > ... [true] | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:27:1:42:3 | Entry | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:29:8:29:13 | After call to nil? [false] | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:29:8:29:13 | After call to nil? [true] | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:32:3:39:7 | ensure ... | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:35:12:35:16 | After ... > ... [false] | +| break_ensure.rb:33:11:33:15 | After ... < ... [false] | break_ensure.rb:33:11:33:15 | After ... < ... [false] | +| break_ensure.rb:33:11:33:15 | After ... < ... [true] | break_ensure.rb:33:11:33:15 | After ... < ... [true] | +| break_ensure.rb:35:12:35:16 | After ... > ... [false] | break_ensure.rb:35:12:35:16 | After ... > ... [false] | +| break_ensure.rb:35:12:35:16 | After ... > ... [true] | break_ensure.rb:35:12:35:16 | After ... > ... [true] | +| break_ensure.rb:44:1:56:3 | Entry | break_ensure.rb:44:1:56:3 | Entry | +| break_ensure.rb:44:1:56:3 | Exceptional Exit | break_ensure.rb:44:1:56:3 | Exceptional Exit | +| break_ensure.rb:44:1:56:3 | Exit | break_ensure.rb:44:1:56:3 | Exit | +| break_ensure.rb:45:3:55:5 | After while ... | break_ensure.rb:44:1:56:3 | Entry | +| break_ensure.rb:45:3:55:5 | After while ... | break_ensure.rb:45:3:55:5 | After while ... | +| break_ensure.rb:45:3:55:5 | After while ... | break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | +| break_ensure.rb:45:3:55:5 | After while ... | break_ensure.rb:45:9:45:13 | After ... < ... [false] | +| break_ensure.rb:45:3:55:5 | After while ... | break_ensure.rb:45:9:45:13 | After ... < ... [true] | +| break_ensure.rb:45:3:55:5 | After while ... | break_ensure.rb:46:5:54:7 | After begin ... | +| break_ensure.rb:45:3:55:5 | After while ... | break_ensure.rb:47:10:47:14 | After ... > ... [false] | +| break_ensure.rb:45:3:55:5 | After while ... | break_ensure.rb:47:10:47:14 | After ... > ... [true] | +| break_ensure.rb:45:3:55:5 | After while ... | break_ensure.rb:50:5:53:9 | ensure ... | +| break_ensure.rb:45:3:55:5 | After while ... | break_ensure.rb:51:10:51:14 | After ... > ... [false] | +| break_ensure.rb:45:3:55:5 | After while ... | break_ensure.rb:51:10:51:14 | After ... > ... [true] | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:44:1:56:3 | Entry | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:46:5:54:7 | After begin ... | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:51:10:51:14 | After ... > ... [false] | +| break_ensure.rb:45:9:45:13 | After ... < ... [false] | break_ensure.rb:45:9:45:13 | After ... < ... [false] | +| break_ensure.rb:45:9:45:13 | After ... < ... [true] | break_ensure.rb:45:9:45:13 | After ... < ... [true] | +| break_ensure.rb:46:5:54:7 | After begin ... | break_ensure.rb:46:5:54:7 | After begin ... | +| break_ensure.rb:46:5:54:7 | After begin ... | break_ensure.rb:51:10:51:14 | After ... > ... [false] | +| break_ensure.rb:47:10:47:14 | After ... > ... [false] | break_ensure.rb:47:10:47:14 | After ... > ... [false] | +| break_ensure.rb:47:10:47:14 | After ... > ... [true] | break_ensure.rb:47:10:47:14 | After ... > ... [true] | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:45:9:45:13 | After ... < ... [true] | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:47:10:47:14 | After ... > ... [false] | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:47:10:47:14 | After ... > ... [true] | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:50:5:53:9 | ensure ... | +| break_ensure.rb:51:10:51:14 | After ... > ... [false] | break_ensure.rb:51:10:51:14 | After ... > ... [false] | +| break_ensure.rb:51:10:51:14 | After ... > ... [true] | break_ensure.rb:51:10:51:14 | After ... > ... [true] | +| case.rb:1:1:6:3 | Entry | case.rb:1:1:6:3 | Entry | +| case.rb:1:1:99:4 | Entry | case.rb:1:1:99:4 | Entry | +| case.rb:2:3:5:5 | After case ... | case.rb:1:1:6:3 | Entry | +| case.rb:2:3:5:5 | After case ... | case.rb:2:3:5:5 | After case ... | +| case.rb:2:3:5:5 | After case ... | case.rb:3:10:3:10 | After 1 [match] | +| case.rb:2:3:5:5 | After case ... | case.rb:3:10:3:10 | After 1 [no-match] | +| case.rb:2:3:5:5 | After case ... | case.rb:3:18:3:41 | After if ... | +| case.rb:2:3:5:5 | After case ... | case.rb:3:21:3:22 | After call to x2 [false] | +| case.rb:2:3:5:5 | After case ... | case.rb:3:21:3:22 | After call to x2 [true] | +| case.rb:2:3:5:5 | After case ... | case.rb:4:10:4:10 | After 2 [match] | +| case.rb:2:3:5:5 | After case ... | case.rb:4:10:4:10 | After 2 [no-match] | +| case.rb:3:10:3:10 | After 1 [match] | case.rb:3:10:3:10 | After 1 [match] | +| case.rb:3:10:3:10 | After 1 [no-match] | case.rb:3:10:3:10 | After 1 [no-match] | +| case.rb:3:18:3:41 | After if ... | case.rb:3:10:3:10 | After 1 [match] | +| case.rb:3:18:3:41 | After if ... | case.rb:3:18:3:41 | After if ... | +| case.rb:3:18:3:41 | After if ... | case.rb:3:21:3:22 | After call to x2 [false] | +| case.rb:3:18:3:41 | After if ... | case.rb:3:21:3:22 | After call to x2 [true] | +| case.rb:3:21:3:22 | After call to x2 [false] | case.rb:3:21:3:22 | After call to x2 [false] | +| case.rb:3:21:3:22 | After call to x2 [true] | case.rb:3:21:3:22 | After call to x2 [true] | +| case.rb:4:10:4:10 | After 2 [match] | case.rb:4:10:4:10 | After 2 [match] | +| case.rb:4:10:4:10 | After 2 [no-match] | case.rb:4:10:4:10 | After 2 [no-match] | +| case.rb:8:1:18:3 | Entry | case.rb:8:1:18:3 | Entry | +| case.rb:9:3:17:5 | After case ... | case.rb:8:1:18:3 | Entry | +| case.rb:9:3:17:5 | After case ... | case.rb:9:3:17:5 | After case ... | +| case.rb:9:3:17:5 | After case ... | case.rb:10:8:10:8 | After 0 [match] | +| case.rb:9:3:17:5 | After case ... | case.rb:10:8:10:8 | After 0 [no-match] | +| case.rb:9:3:17:5 | After case ... | case.rb:11:8:11:8 | After 1 [match] | +| case.rb:9:3:17:5 | After case ... | case.rb:11:8:11:8 | After 1 [no-match] | +| case.rb:9:3:17:5 | After case ... | case.rb:12:8:12:8 | After 2 [match] | +| case.rb:9:3:17:5 | After case ... | case.rb:12:8:12:8 | After 2 [no-match] | +| case.rb:9:3:17:5 | After case ... | case.rb:14:8:14:8 | After x [match] | +| case.rb:9:3:17:5 | After case ... | case.rb:14:8:14:8 | After x [no-match] | +| case.rb:9:3:17:5 | After case ... | case.rb:14:13:14:18 | After ... == ... [false] | +| case.rb:9:3:17:5 | After case ... | case.rb:14:13:14:18 | After ... == ... [true] | +| case.rb:9:3:17:5 | After case ... | case.rb:15:5:15:28 | in ... then ... | +| case.rb:9:3:17:5 | After case ... | case.rb:15:8:15:8 | After x [match] | +| case.rb:9:3:17:5 | After case ... | case.rb:15:8:15:8 | After x [no-match] | +| case.rb:9:3:17:5 | After case ... | case.rb:15:17:15:21 | After ... < ... [false] | +| case.rb:9:3:17:5 | After case ... | case.rb:15:17:15:21 | After ... < ... [true] | +| case.rb:9:3:17:5 | After case ... | case.rb:16:5:16:10 | else ... | +| case.rb:10:8:10:8 | After 0 [match] | case.rb:10:8:10:8 | After 0 [match] | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:10:8:10:8 | After 0 [no-match] | +| case.rb:11:8:11:8 | After 1 [match] | case.rb:11:8:11:8 | After 1 [match] | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:11:8:11:8 | After 1 [no-match] | +| case.rb:12:8:12:8 | After 2 [match] | case.rb:12:8:12:8 | After 2 [match] | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:12:8:12:8 | After 2 [no-match] | +| case.rb:14:8:14:8 | After x [match] | case.rb:14:8:14:8 | After x [match] | +| case.rb:14:8:14:8 | After x [no-match] | case.rb:14:8:14:8 | After x [no-match] | +| case.rb:14:13:14:18 | After ... == ... [false] | case.rb:14:13:14:18 | After ... == ... [false] | +| case.rb:14:13:14:18 | After ... == ... [true] | case.rb:14:13:14:18 | After ... == ... [true] | +| case.rb:15:5:15:28 | in ... then ... | case.rb:14:8:14:8 | After x [no-match] | +| case.rb:15:5:15:28 | in ... then ... | case.rb:14:13:14:18 | After ... == ... [false] | | case.rb:15:5:15:28 | in ... then ... | case.rb:15:5:15:28 | in ... then ... | -| case.rb:15:17:15:17 | x | case.rb:15:5:15:28 | in ... then ... | -| case.rb:15:17:15:17 | x | case.rb:15:17:15:17 | x | -| case.rb:15:28:15:28 | 7 | case.rb:15:28:15:28 | 7 | -| case.rb:16:10:16:10 | 8 | case.rb:16:10:16:10 | 8 | -| case.rb:20:1:24:3 | enter case_match_no_match | case.rb:20:1:24:3 | enter case_match_no_match | -| case.rb:20:1:24:3 | exit case_match_no_match | case.rb:20:1:24:3 | exit case_match_no_match | -| case.rb:20:1:24:3 | exit case_match_no_match (abnormal) | case.rb:20:1:24:3 | exit case_match_no_match (abnormal) | -| case.rb:21:3:23:5 | case ... | case.rb:20:1:24:3 | enter case_match_no_match | -| case.rb:21:3:23:5 | case ... | case.rb:21:3:23:5 | case ... | -| case.rb:26:1:30:3 | enter case_match_raise | case.rb:26:1:30:3 | enter case_match_raise | -| case.rb:26:1:30:3 | exit case_match_raise | case.rb:26:1:30:3 | exit case_match_raise | -| case.rb:26:1:30:3 | exit case_match_raise (abnormal) | case.rb:26:1:30:3 | exit case_match_raise (abnormal) | -| case.rb:27:3:29:5 | case ... | case.rb:26:1:30:3 | enter case_match_raise | -| case.rb:27:3:29:5 | case ... | case.rb:27:3:29:5 | case ... | -| case.rb:28:7:28:28 | enter -> { ... } | case.rb:28:7:28:28 | enter -> { ... } | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:32:1:39:3 | enter case_match_array | -| case.rb:32:1:39:3 | exit case_match_array | case.rb:32:1:39:3 | exit case_match_array | -| case.rb:32:1:39:3 | exit case_match_array (abnormal) | case.rb:32:1:39:3 | exit case_match_array (abnormal) | -| case.rb:33:3:38:5 | case ... | case.rb:32:1:39:3 | enter case_match_array | -| case.rb:33:3:38:5 | case ... | case.rb:33:3:38:5 | case ... | -| case.rb:33:3:38:5 | case ... | case.rb:35:5:35:11 | in ... then ... | -| case.rb:33:3:38:5 | case ... | case.rb:35:9:35:9 | x | -| case.rb:33:3:38:5 | case ... | case.rb:36:5:36:13 | in ... then ... | -| case.rb:33:3:38:5 | case ... | case.rb:36:9:36:9 | x | -| case.rb:33:3:38:5 | case ... | case.rb:37:5:37:27 | in ... then ... | -| case.rb:33:3:38:5 | case ... | case.rb:37:8:37:26 | [ ..., * ] | -| case.rb:33:3:38:5 | case ... | case.rb:37:12:37:12 | a | -| case.rb:33:3:38:5 | case ... | case.rb:37:15:37:15 | b | -| case.rb:33:3:38:5 | case ... | case.rb:37:19:37:19 | c | -| case.rb:33:3:38:5 | case ... | case.rb:37:25:37:25 | e | -| case.rb:35:5:35:11 | in ... then ... | case.rb:35:5:35:11 | in ... then ... | -| case.rb:35:9:35:9 | x | case.rb:35:9:35:9 | x | -| case.rb:36:5:36:13 | in ... then ... | case.rb:36:5:36:13 | in ... then ... | -| case.rb:36:9:36:9 | x | case.rb:36:9:36:9 | x | -| case.rb:37:5:37:27 | in ... then ... | case.rb:37:5:37:27 | in ... then ... | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:5:37:27 | in ... then ... | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:8:37:26 | [ ..., * ] | -| case.rb:37:12:37:12 | a | case.rb:37:5:37:27 | in ... then ... | -| case.rb:37:12:37:12 | a | case.rb:37:8:37:26 | [ ..., * ] | -| case.rb:37:12:37:12 | a | case.rb:37:12:37:12 | a | -| case.rb:37:15:37:15 | b | case.rb:37:5:37:27 | in ... then ... | -| case.rb:37:15:37:15 | b | case.rb:37:8:37:26 | [ ..., * ] | -| case.rb:37:15:37:15 | b | case.rb:37:12:37:12 | a | -| case.rb:37:15:37:15 | b | case.rb:37:15:37:15 | b | -| case.rb:37:19:37:19 | c | case.rb:37:5:37:27 | in ... then ... | -| case.rb:37:19:37:19 | c | case.rb:37:8:37:26 | [ ..., * ] | -| case.rb:37:19:37:19 | c | case.rb:37:12:37:12 | a | -| case.rb:37:19:37:19 | c | case.rb:37:15:37:15 | b | -| case.rb:37:19:37:19 | c | case.rb:37:19:37:19 | c | -| case.rb:37:25:37:25 | e | case.rb:37:5:37:27 | in ... then ... | -| case.rb:37:25:37:25 | e | case.rb:37:8:37:26 | [ ..., * ] | -| case.rb:37:25:37:25 | e | case.rb:37:12:37:12 | a | -| case.rb:37:25:37:25 | e | case.rb:37:15:37:15 | b | -| case.rb:37:25:37:25 | e | case.rb:37:19:37:19 | c | -| case.rb:37:25:37:25 | e | case.rb:37:25:37:25 | e | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:41:1:45:3 | enter case_match_find | -| case.rb:41:1:45:3 | exit case_match_find | case.rb:41:1:45:3 | exit case_match_find | -| case.rb:41:1:45:3 | exit case_match_find (abnormal) | case.rb:41:1:45:3 | exit case_match_find (abnormal) | -| case.rb:43:10:43:10 | x | case.rb:41:1:45:3 | enter case_match_find | -| case.rb:43:10:43:10 | x | case.rb:43:10:43:10 | x | -| case.rb:43:16:43:16 | 2 | case.rb:41:1:45:3 | enter case_match_find | -| case.rb:43:16:43:16 | 2 | case.rb:43:10:43:10 | x | -| case.rb:43:16:43:16 | 2 | case.rb:43:16:43:16 | 2 | -| case.rb:43:20:43:20 | y | case.rb:41:1:45:3 | enter case_match_find | -| case.rb:43:20:43:20 | y | case.rb:43:10:43:10 | x | -| case.rb:43:20:43:20 | y | case.rb:43:16:43:16 | 2 | -| case.rb:43:20:43:20 | y | case.rb:43:20:43:20 | y | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:47:1:53:3 | enter case_match_hash | -| case.rb:47:1:53:3 | exit case_match_hash | case.rb:47:1:53:3 | exit case_match_hash | -| case.rb:47:1:53:3 | exit case_match_hash (abnormal) | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | -| case.rb:48:3:52:5 | case ... | case.rb:47:1:53:3 | enter case_match_hash | -| case.rb:48:3:52:5 | case ... | case.rb:48:3:52:5 | case ... | -| case.rb:48:3:52:5 | case ... | case.rb:49:8:49:34 | { ..., ** } | -| case.rb:48:3:52:5 | case ... | case.rb:49:20:49:20 | 1 | -| case.rb:48:3:52:5 | case ... | case.rb:49:23:49:23 | a | -| case.rb:48:3:52:5 | case ... | case.rb:49:29:49:32 | rest | -| case.rb:48:3:52:5 | case ... | case.rb:50:5:50:25 | in ... then ... | -| case.rb:48:3:52:5 | case ... | case.rb:50:8:50:24 | { ..., ** } | -| case.rb:48:3:52:5 | case ... | case.rb:50:16:50:16 | 1 | -| case.rb:48:3:52:5 | case ... | case.rb:51:5:51:17 | in ... then ... | -| case.rb:48:3:52:5 | case ... | case.rb:51:8:51:16 | { ..., ** } | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:8:49:34 | { ..., ** } | -| case.rb:49:20:49:20 | 1 | case.rb:49:20:49:20 | 1 | -| case.rb:49:23:49:23 | a | case.rb:49:23:49:23 | a | -| case.rb:49:29:49:32 | rest | case.rb:49:23:49:23 | a | -| case.rb:49:29:49:32 | rest | case.rb:49:29:49:32 | rest | -| case.rb:50:5:50:25 | in ... then ... | case.rb:50:5:50:25 | in ... then ... | -| case.rb:50:8:50:24 | { ..., ** } | case.rb:50:8:50:24 | { ..., ** } | -| case.rb:50:16:50:16 | 1 | case.rb:50:16:50:16 | 1 | -| case.rb:51:5:51:17 | in ... then ... | case.rb:51:5:51:17 | in ... then ... | -| case.rb:51:8:51:16 | { ..., ** } | case.rb:51:5:51:17 | in ... then ... | -| case.rb:51:8:51:16 | { ..., ** } | case.rb:51:8:51:16 | { ..., ** } | -| case.rb:55:1:61:3 | enter case_match_variable | case.rb:55:1:61:3 | enter case_match_variable | -| case.rb:56:3:60:5 | case ... | case.rb:55:1:61:3 | enter case_match_variable | -| case.rb:56:3:60:5 | case ... | case.rb:56:3:60:5 | case ... | -| case.rb:56:3:60:5 | case ... | case.rb:58:5:58:10 | in ... then ... | -| case.rb:58:5:58:10 | in ... then ... | case.rb:58:5:58:10 | in ... then ... | -| case.rb:63:1:67:3 | enter case_match_underscore | case.rb:63:1:67:3 | enter case_match_underscore | -| case.rb:64:3:66:5 | case ... | case.rb:63:1:67:3 | enter case_match_underscore | -| case.rb:64:3:66:5 | case ... | case.rb:64:3:66:5 | case ... | -| case.rb:64:3:66:5 | case ... | case.rb:65:12:65:12 | _ | -| case.rb:65:12:65:12 | _ | case.rb:65:12:65:12 | _ | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:69:1:93:3 | enter case_match_various | -| case.rb:69:1:93:3 | exit case_match_various | case.rb:69:1:93:3 | exit case_match_various | -| case.rb:69:1:93:3 | exit case_match_various (abnormal) | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:72:3:92:5 | case ... | case.rb:69:1:93:3 | enter case_match_various | -| case.rb:72:3:92:5 | case ... | case.rb:72:3:92:5 | case ... | -| case.rb:72:3:92:5 | case ... | case.rb:74:5:74:11 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:75:5:75:15 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:76:5:76:18 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:77:5:77:18 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:78:5:78:19 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:79:5:79:14 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:80:5:80:12 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:81:5:81:11 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:82:5:82:20 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:82:13:82:13 | x | -| case.rb:72:3:92:5 | case ... | case.rb:82:20:82:20 | 1 | -| case.rb:72:3:92:5 | case ... | case.rb:83:5:83:26 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:83:12:83:15 | ^... | -| case.rb:72:3:92:5 | case ... | case.rb:83:20:83:25 | string | -| case.rb:72:3:92:5 | case ... | case.rb:84:5:84:17 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:88:14:88:15 | 10 | -| case.rb:72:3:92:5 | case ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:89:14:89:17 | self | -| case.rb:72:3:92:5 | case ... | case.rb:89:21:89:24 | true | -| case.rb:72:3:92:5 | case ... | case.rb:89:28:89:32 | false | -| case.rb:72:3:92:5 | case ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:72:3:92:5 | case ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:72:3:92:5 | case ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:72:3:92:5 | case ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:91:13:91:14 | "" | -| case.rb:72:3:92:5 | case ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:72:3:92:5 | case ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:74:5:74:11 | in ... then ... | case.rb:74:5:74:11 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:75:5:75:15 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:76:5:76:18 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:77:5:77:18 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:78:5:78:19 | in ... then ... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:79:5:79:14 | in ... then ... | -| case.rb:80:5:80:12 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | -| case.rb:81:5:81:11 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | -| case.rb:82:5:82:20 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | -| case.rb:82:13:82:13 | x | case.rb:82:13:82:13 | x | -| case.rb:82:20:82:20 | 1 | case.rb:82:13:82:13 | x | -| case.rb:82:20:82:20 | 1 | case.rb:82:20:82:20 | 1 | -| case.rb:83:5:83:26 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | -| case.rb:83:12:83:15 | ^... | case.rb:83:12:83:15 | ^... | -| case.rb:83:20:83:25 | string | case.rb:83:20:83:25 | string | -| case.rb:84:5:84:17 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | -| case.rb:85:5:85:23 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:85:8:85:23 | enter -> { ... } | case.rb:85:8:85:23 | enter -> { ... } | -| case.rb:86:5:86:11 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:87:5:87:17 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:88:5:88:15 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:88:14:88:15 | 10 | case.rb:88:14:88:15 | 10 | -| case.rb:89:5:89:69 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:89:14:89:17 | self | case.rb:89:14:89:17 | self | -| case.rb:89:21:89:24 | true | case.rb:89:21:89:24 | true | -| case.rb:89:28:89:32 | false | case.rb:89:28:89:32 | false | -| case.rb:89:36:89:43 | __LINE__ | case.rb:89:36:89:43 | __LINE__ | -| case.rb:89:47:89:54 | __FILE__ | case.rb:89:47:89:54 | __FILE__ | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:90:5:90:13 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:91:5:91:25 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:91:13:91:14 | "" | case.rb:91:13:91:14 | "" | -| case.rb:91:18:91:19 | [ ..., * ] | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:91:23:91:24 | { ..., ** } | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:95:1:99:3 | enter case_match_guard_no_else | case.rb:95:1:99:3 | enter case_match_guard_no_else | -| case.rb:95:1:99:3 | exit case_match_guard_no_else | case.rb:95:1:99:3 | exit case_match_guard_no_else | -| case.rb:95:1:99:3 | exit case_match_guard_no_else (abnormal) | case.rb:95:1:99:3 | exit case_match_guard_no_else (abnormal) | -| case.rb:97:13:97:13 | x | case.rb:95:1:99:3 | enter case_match_guard_no_else | -| case.rb:97:13:97:13 | x | case.rb:97:13:97:13 | x | -| case.rb:97:25:97:25 | 6 | case.rb:95:1:99:3 | enter case_match_guard_no_else | -| case.rb:97:25:97:25 | 6 | case.rb:97:13:97:13 | x | -| case.rb:97:25:97:25 | 6 | case.rb:97:25:97:25 | 6 | -| cfg.html.erb:5:16:31:12 | enter cfg.html.erb | cfg.html.erb:5:16:31:12 | enter cfg.html.erb | -| cfg.html.erb:18:14:22:16 | if ... | cfg.html.erb:5:16:31:12 | enter cfg.html.erb | -| cfg.html.erb:18:14:22:16 | if ... | cfg.html.erb:18:14:22:16 | if ... | -| cfg.html.erb:18:14:22:16 | if ... | cfg.html.erb:19:19:19:32 | self | -| cfg.html.erb:18:14:22:16 | if ... | cfg.html.erb:21:19:21:32 | self | -| cfg.html.erb:19:19:19:32 | self | cfg.html.erb:19:19:19:32 | self | -| cfg.html.erb:21:19:21:32 | self | cfg.html.erb:21:19:21:32 | self | -| cfg.html.erb:29:24:31:10 | enter do ... end | cfg.html.erb:29:24:31:10 | enter do ... end | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:25:9:25:22 | enter { ... } | cfg.rb:25:9:25:22 | enter { ... } | -| cfg.rb:29:10:29:24 | enter { ... } | cfg.rb:29:10:29:24 | enter { ... } | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:42:3:42:24 | [match] when ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:42:15:42:24 | self | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:42:15:42:24 | self | cfg.rb:42:15:42:24 | self | -| cfg.rb:43:3:43:31 | [match] when ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:43:3:43:31 | [no-match] when ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:43:11:43:11 | 3 | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:43:14:43:14 | 4 | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:43:21:43:31 | self | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:43:21:43:31 | self | cfg.rb:43:21:43:31 | self | -| cfg.rb:44:8:44:18 | self | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:44:8:44:18 | self | cfg.rb:44:8:44:18 | self | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:48:3:48:29 | [match] when ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:48:3:48:29 | [no-match] when ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:48:20:48:29 | self | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:48:20:48:29 | self | cfg.rb:48:20:48:29 | self | -| cfg.rb:49:3:49:37 | [match] when ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:49:3:49:37 | [no-match] when ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:49:8:49:8 | b | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:49:8:49:8 | b | cfg.rb:49:8:49:8 | b | -| cfg.rb:49:16:49:16 | b | cfg.rb:49:16:49:16 | b | -| cfg.rb:49:27:49:37 | self | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:49:27:49:37 | self | cfg.rb:49:27:49:37 | self | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:60:27:60:31 | hello | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:60:37:60:39 | bye | -| cfg.rb:60:27:60:31 | hello | cfg.rb:60:27:60:31 | hello | -| cfg.rb:60:37:60:39 | bye | cfg.rb:60:37:60:39 | bye | -| cfg.rb:63:3:66:5 | enter pattern | cfg.rb:63:3:66:5 | enter pattern | -| cfg.rb:69:3:71:5 | enter print | cfg.rb:69:3:71:5 | enter print | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:60:27:60:31 | hello | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:60:37:60:39 | bye | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:75:15:75:15 | 0 | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:75:17:75:43 | elsif ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:75:17:75:43 | elsif ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:75:17:75:43 | elsif ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:75:17:75:43 | elsif ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:75:23:75:23 | x | cfg.rb:75:23:75:23 | x | -| cfg.rb:75:35:75:36 | 10 | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:75:43:75:43 | x | cfg.rb:75:43:75:43 | x | -| cfg.rb:90:1:93:3 | enter { ... } | cfg.rb:90:1:93:3 | enter { ... } | -| cfg.rb:90:1:93:3 | exit { ... } (normal) | cfg.rb:90:1:93:3 | enter { ... } | -| cfg.rb:90:1:93:3 | exit { ... } (normal) | cfg.rb:90:1:93:3 | exit { ... } (normal) | -| cfg.rb:90:1:93:3 | exit { ... } (normal) | cfg.rb:91:3:91:24 | if ... | -| cfg.rb:90:1:93:3 | exit { ... } (normal) | cfg.rb:91:17:91:20 | next | -| cfg.rb:90:5:90:5 | [false] ! ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:90:5:90:5 | [true] ! ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:60:27:60:31 | hello | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:60:37:60:39 | bye | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:90:5:90:5 | x | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:90:5:90:5 | x | cfg.rb:90:5:90:5 | x | -| cfg.rb:91:3:91:24 | if ... | cfg.rb:91:3:91:24 | if ... | -| cfg.rb:91:17:91:20 | next | cfg.rb:91:17:91:20 | next | -| cfg.rb:101:1:104:3 | enter parameters | cfg.rb:101:1:104:3 | enter parameters | -| cfg.rb:101:24:101:25 | 42 | cfg.rb:101:24:101:25 | 42 | -| cfg.rb:101:28:101:30 | key | cfg.rb:101:1:104:3 | enter parameters | -| cfg.rb:101:28:101:30 | key | cfg.rb:101:24:101:25 | 42 | +| case.rb:15:8:15:8 | After x [match] | case.rb:15:8:15:8 | After x [match] | +| case.rb:15:8:15:8 | After x [no-match] | case.rb:15:8:15:8 | After x [no-match] | +| case.rb:15:17:15:21 | After ... < ... [false] | case.rb:15:17:15:21 | After ... < ... [false] | +| case.rb:15:17:15:21 | After ... < ... [true] | case.rb:15:17:15:21 | After ... < ... [true] | +| case.rb:16:5:16:10 | else ... | case.rb:15:8:15:8 | After x [no-match] | +| case.rb:16:5:16:10 | else ... | case.rb:15:17:15:21 | After ... < ... [false] | +| case.rb:16:5:16:10 | else ... | case.rb:16:5:16:10 | else ... | +| case.rb:20:1:24:3 | Entry | case.rb:20:1:24:3 | Entry | +| case.rb:21:3:23:5 | After case ... | case.rb:20:1:24:3 | Entry | +| case.rb:21:3:23:5 | After case ... | case.rb:21:3:23:5 | After case ... | +| case.rb:21:3:23:5 | After case ... | case.rb:22:8:22:8 | After 1 [match] | +| case.rb:21:3:23:5 | After case ... | case.rb:22:8:22:8 | After 1 [no-match] | +| case.rb:22:8:22:8 | After 1 [match] | case.rb:22:8:22:8 | After 1 [match] | +| case.rb:22:8:22:8 | After 1 [no-match] | case.rb:22:8:22:8 | After 1 [no-match] | +| case.rb:26:1:30:3 | Entry | case.rb:26:1:30:3 | Entry | +| case.rb:27:3:29:5 | After case ... | case.rb:26:1:30:3 | Entry | +| case.rb:27:3:29:5 | After case ... | case.rb:27:3:29:5 | After case ... | +| case.rb:27:3:29:5 | After case ... | case.rb:28:7:28:28 | After -> { ... } [match] | +| case.rb:27:3:29:5 | After case ... | case.rb:28:7:28:28 | After -> { ... } [no-match] | +| case.rb:28:7:28:28 | After -> { ... } [match] | case.rb:28:7:28:28 | After -> { ... } [match] | +| case.rb:28:7:28:28 | After -> { ... } [no-match] | case.rb:28:7:28:28 | After -> { ... } [no-match] | +| case.rb:28:7:28:28 | Entry | case.rb:28:7:28:28 | Entry | +| case.rb:32:1:39:3 | Entry | case.rb:32:1:39:3 | Entry | +| case.rb:33:3:38:5 | After case ... | case.rb:32:1:39:3 | Entry | +| case.rb:33:3:38:5 | After case ... | case.rb:33:3:38:5 | After case ... | +| case.rb:33:3:38:5 | After case ... | case.rb:34:8:34:9 | After [ ..., * ] [match] | +| case.rb:33:3:38:5 | After case ... | case.rb:34:8:34:9 | After [ ..., * ] [no-match] | +| case.rb:33:3:38:5 | After case ... | case.rb:35:8:35:10 | After [ ..., * ] [match] | +| case.rb:33:3:38:5 | After case ... | case.rb:35:8:35:10 | After [ ..., * ] [no-match] | +| case.rb:33:3:38:5 | After case ... | case.rb:36:8:36:12 | After [ ..., * ] [match] | +| case.rb:33:3:38:5 | After case ... | case.rb:36:8:36:12 | After [ ..., * ] [no-match] | +| case.rb:33:3:38:5 | After case ... | case.rb:37:8:37:26 | After [ ..., * ] [match] | +| case.rb:33:3:38:5 | After case ... | case.rb:37:8:37:26 | After [ ..., * ] [no-match] | +| case.rb:34:8:34:9 | After [ ..., * ] [match] | case.rb:34:8:34:9 | After [ ..., * ] [match] | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:34:8:34:9 | After [ ..., * ] [no-match] | +| case.rb:35:8:35:10 | After [ ..., * ] [match] | case.rb:35:8:35:10 | After [ ..., * ] [match] | +| case.rb:35:8:35:10 | After [ ..., * ] [no-match] | case.rb:35:8:35:10 | After [ ..., * ] [no-match] | +| case.rb:36:8:36:12 | After [ ..., * ] [match] | case.rb:36:8:36:12 | After [ ..., * ] [match] | +| case.rb:36:8:36:12 | After [ ..., * ] [no-match] | case.rb:36:8:36:12 | After [ ..., * ] [no-match] | +| case.rb:37:8:37:26 | After [ ..., * ] [match] | case.rb:37:8:37:26 | After [ ..., * ] [match] | +| case.rb:37:8:37:26 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [no-match] | +| case.rb:41:1:45:3 | Entry | case.rb:41:1:45:3 | Entry | +| case.rb:42:3:44:5 | After case ... | case.rb:41:1:45:3 | Entry | +| case.rb:42:3:44:5 | After case ... | case.rb:42:3:44:5 | After case ... | +| case.rb:42:3:44:5 | After case ... | case.rb:43:8:43:21 | After [ *,...,* ] [match] | +| case.rb:42:3:44:5 | After case ... | case.rb:43:8:43:21 | After [ *,...,* ] [no-match] | +| case.rb:43:8:43:21 | After [ *,...,* ] [match] | case.rb:43:8:43:21 | After [ *,...,* ] [match] | +| case.rb:43:8:43:21 | After [ *,...,* ] [no-match] | case.rb:43:8:43:21 | After [ *,...,* ] [no-match] | +| case.rb:47:1:53:3 | Entry | case.rb:47:1:53:3 | Entry | +| case.rb:48:3:52:5 | After case ... | case.rb:47:1:53:3 | Entry | +| case.rb:48:3:52:5 | After case ... | case.rb:48:3:52:5 | After case ... | +| case.rb:48:3:52:5 | After case ... | case.rb:49:8:49:34 | After { ..., ** } [match] | +| case.rb:48:3:52:5 | After case ... | case.rb:49:8:49:34 | After { ..., ** } [no-match] | +| case.rb:48:3:52:5 | After case ... | case.rb:50:8:50:24 | After { ..., ** } [match] | +| case.rb:48:3:52:5 | After case ... | case.rb:50:8:50:24 | After { ..., ** } [no-match] | +| case.rb:48:3:52:5 | After case ... | case.rb:51:8:51:16 | After { ..., ** } [match] | +| case.rb:48:3:52:5 | After case ... | case.rb:51:8:51:16 | After { ..., ** } [no-match] | +| case.rb:49:8:49:34 | After { ..., ** } [match] | case.rb:49:8:49:34 | After { ..., ** } [match] | +| case.rb:49:8:49:34 | After { ..., ** } [no-match] | case.rb:49:8:49:34 | After { ..., ** } [no-match] | +| case.rb:50:8:50:24 | After { ..., ** } [match] | case.rb:50:8:50:24 | After { ..., ** } [match] | +| case.rb:50:8:50:24 | After { ..., ** } [no-match] | case.rb:50:8:50:24 | After { ..., ** } [no-match] | +| case.rb:51:8:51:16 | After { ..., ** } [match] | case.rb:51:8:51:16 | After { ..., ** } [match] | +| case.rb:51:8:51:16 | After { ..., ** } [no-match] | case.rb:51:8:51:16 | After { ..., ** } [no-match] | +| case.rb:55:1:61:3 | Entry | case.rb:55:1:61:3 | Entry | +| case.rb:56:3:60:5 | After case ... | case.rb:55:1:61:3 | Entry | +| case.rb:56:3:60:5 | After case ... | case.rb:56:3:60:5 | After case ... | +| case.rb:56:3:60:5 | After case ... | case.rb:57:8:57:8 | After 5 [match] | +| case.rb:56:3:60:5 | After case ... | case.rb:57:8:57:8 | After 5 [no-match] | +| case.rb:56:3:60:5 | After case ... | case.rb:58:8:58:10 | After var [match] | +| case.rb:56:3:60:5 | After case ... | case.rb:58:8:58:10 | After var [no-match] | +| case.rb:56:3:60:5 | After case ... | case.rb:59:8:59:20 | After "unreachable" [match] | +| case.rb:56:3:60:5 | After case ... | case.rb:59:8:59:20 | After "unreachable" [no-match] | +| case.rb:57:8:57:8 | After 5 [match] | case.rb:57:8:57:8 | After 5 [match] | +| case.rb:57:8:57:8 | After 5 [no-match] | case.rb:57:8:57:8 | After 5 [no-match] | +| case.rb:58:8:58:10 | After var [match] | case.rb:58:8:58:10 | After var [match] | +| case.rb:58:8:58:10 | After var [no-match] | case.rb:58:8:58:10 | After var [no-match] | +| case.rb:59:8:59:20 | After "unreachable" [match] | case.rb:59:8:59:20 | After "unreachable" [match] | +| case.rb:59:8:59:20 | After "unreachable" [no-match] | case.rb:59:8:59:20 | After "unreachable" [no-match] | +| case.rb:63:1:67:3 | Entry | case.rb:63:1:67:3 | Entry | +| case.rb:64:3:66:5 | After case ... | case.rb:63:1:67:3 | Entry | +| case.rb:64:3:66:5 | After case ... | case.rb:64:3:66:5 | After case ... | +| case.rb:64:3:66:5 | After case ... | case.rb:65:8:65:28 | After ... \| ... [match] | +| case.rb:64:3:66:5 | After case ... | case.rb:65:8:65:28 | After ... \| ... [no-match] | +| case.rb:65:8:65:28 | After ... \| ... [match] | case.rb:65:8:65:28 | After ... \| ... [match] | +| case.rb:65:8:65:28 | After ... \| ... [no-match] | case.rb:65:8:65:28 | After ... \| ... [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:69:1:93:3 | Entry | +| case.rb:72:3:92:5 | After case ... | case.rb:69:1:93:3 | Entry | +| case.rb:72:3:92:5 | After case ... | case.rb:72:3:92:5 | After case ... | +| case.rb:72:3:92:5 | After case ... | case.rb:73:8:73:8 | After 5 [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:73:8:73:8 | After 5 [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:74:8:74:11 | After ^... [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:74:8:74:11 | After ^... [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:75:8:75:15 | After "string" [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:75:8:75:15 | After "string" [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:76:8:76:18 | After call to [] [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:76:8:76:18 | After call to [] [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:77:8:77:18 | After call to [] [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:77:8:77:18 | After call to [] [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:79:8:79:14 | After _ .. _ [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:79:8:79:14 | After _ .. _ [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:80:8:80:12 | After _ .. _ [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:80:8:80:12 | After _ .. _ [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:81:8:81:11 | After _ .. _ [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:81:8:81:11 | After _ .. _ [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:82:8:82:13 | After ... => ... [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:82:8:82:13 | After ... => ... [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:83:8:83:26 | After ... \| ... [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:84:8:84:17 | After Bar [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:73:8:73:8 | After 5 [match] | case.rb:73:8:73:8 | After 5 [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:73:8:73:8 | After 5 [no-match] | +| case.rb:74:8:74:11 | After ^... [match] | case.rb:74:8:74:11 | After ^... [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:74:8:74:11 | After ^... [no-match] | +| case.rb:75:8:75:15 | After "string" [match] | case.rb:75:8:75:15 | After "string" [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:75:8:75:15 | After "string" [no-match] | +| case.rb:76:8:76:18 | After call to [] [match] | case.rb:76:8:76:18 | After call to [] [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:76:8:76:18 | After call to [] [no-match] | +| case.rb:77:8:77:18 | After call to [] [match] | case.rb:77:8:77:18 | After call to [] [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:77:8:77:18 | After call to [] [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [match] | case.rb:79:8:79:14 | After _ .. _ [match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | +| case.rb:80:8:80:12 | After _ .. _ [match] | case.rb:80:8:80:12 | After _ .. _ [match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | +| case.rb:81:8:81:11 | After _ .. _ [match] | case.rb:81:8:81:11 | After _ .. _ [match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | +| case.rb:82:8:82:13 | After ... => ... [match] | case.rb:82:8:82:13 | After ... => ... [match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | +| case.rb:83:8:83:26 | After ... \| ... [match] | case.rb:83:8:83:26 | After ... \| ... [match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:84:8:84:17 | After Bar [match] | case.rb:84:8:84:17 | After Bar [match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:85:8:85:23 | After -> { ... } [match] | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:85:8:85:23 | Entry | case.rb:85:8:85:23 | Entry | +| case.rb:86:8:86:11 | After :foo [match] | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:87:8:87:17 | After :"foo bar" [match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:88:8:88:15 | After ... \| ... [match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:89:8:89:69 | After ... \| ... [match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:89:8:89:69 | After ... \| ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:90:8:90:13 | After ( ... ) [match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:90:8:90:13 | After ( ... ) [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:91:8:91:25 | After ( ... ) [match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:91:8:91:25 | After ( ... ) [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:95:1:99:3 | Entry | case.rb:95:1:99:3 | Entry | +| case.rb:96:3:98:5 | After case ... | case.rb:95:1:99:3 | Entry | +| case.rb:96:3:98:5 | After case ... | case.rb:96:3:98:5 | After case ... | +| case.rb:96:3:98:5 | After case ... | case.rb:97:8:97:8 | After x [match] | +| case.rb:96:3:98:5 | After case ... | case.rb:97:8:97:8 | After x [no-match] | +| case.rb:96:3:98:5 | After case ... | case.rb:97:13:97:18 | After ... == ... [false] | +| case.rb:96:3:98:5 | After case ... | case.rb:97:13:97:18 | After ... == ... [true] | +| case.rb:97:8:97:8 | After x [match] | case.rb:97:8:97:8 | After x [match] | +| case.rb:97:8:97:8 | After x [no-match] | case.rb:97:8:97:8 | After x [no-match] | +| case.rb:97:13:97:18 | After ... == ... [false] | case.rb:97:13:97:18 | After ... == ... [false] | +| case.rb:97:13:97:18 | After ... == ... [true] | case.rb:97:13:97:18 | After ... == ... [true] | +| cfg.html.erb:5:16:31:12 | Entry | cfg.html.erb:5:16:31:12 | Entry | +| cfg.html.erb:18:14:22:16 | After if ... | cfg.html.erb:5:16:31:12 | Entry | +| cfg.html.erb:18:14:22:16 | After if ... | cfg.html.erb:18:14:22:16 | After if ... | +| cfg.html.erb:18:14:22:16 | After if ... | cfg.html.erb:18:17:18:22 | After call to admin? [false] | +| cfg.html.erb:18:14:22:16 | After if ... | cfg.html.erb:18:17:18:22 | After call to admin? [true] | +| cfg.html.erb:18:17:18:22 | After call to admin? [false] | cfg.html.erb:18:17:18:22 | After call to admin? [false] | +| cfg.html.erb:18:17:18:22 | After call to admin? [true] | cfg.html.erb:18:17:18:22 | After call to admin? [true] | +| cfg.html.erb:29:24:31:10 | Entry | cfg.html.erb:29:24:31:10 | Entry | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:1:1:221:1 | Exceptional Exit | cfg.rb:1:1:221:1 | Exceptional Exit | +| cfg.rb:1:1:221:1 | Exit | cfg.rb:1:1:221:1 | Exit | +| cfg.rb:25:9:25:22 | Entry | cfg.rb:25:9:25:22 | Entry | +| cfg.rb:29:10:29:24 | Entry | cfg.rb:29:10:29:24 | Entry | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:42:8:42:8 | After 1 [match] | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:43:3:43:31 | After when ... [match] | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:43:3:43:31 | After when ... [match] | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:43:3:43:31 | After when ... [match] | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:43:3:43:31 | After when ... [match] | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:43:8:43:8 | After 2 [match] | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:43:8:43:8 | After 2 [no-match] | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:43:11:43:11 | After 3 [match] | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:43:11:43:11 | After 3 [no-match] | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:43:14:43:14 | After 4 [match] | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:43:14:43:14 | After 4 [no-match] | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:48:8:48:13 | After ... == ... [match] | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:48:8:48:13 | After ... == ... [no-match] | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:49:3:49:37 | After when ... [match] | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:49:3:49:37 | After when ... [match] | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:49:3:49:37 | After when ... [match] | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:49:8:49:13 | After ... == ... [match] | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:49:8:49:13 | After ... == ... [no-match] | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:49:16:49:20 | After ... > ... [match] | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:49:16:49:20 | After ... > ... [no-match] | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:60:17:60:22 | After ... < ... [false] | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:60:17:60:22 | After ... < ... [true] | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:63:3:66:5 | Entry | cfg.rb:63:3:66:5 | Entry | +| cfg.rb:69:3:71:5 | Entry | cfg.rb:69:3:71:5 | Entry | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:75:4:75:8 | After ... < ... [false] | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:75:4:75:8 | After ... < ... [true] | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:75:17:75:43 | After elsif ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:75:17:75:43 | After elsif ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:75:17:75:43 | After elsif ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:75:17:75:43 | After elsif ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:75:23:75:28 | After ... > ... [false] | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:75:23:75:28 | After ... > ... [true] | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:90:1:93:3 | Entry | cfg.rb:90:1:93:3 | Entry | +| cfg.rb:90:1:93:3 | Normal Exit | cfg.rb:90:1:93:3 | Entry | +| cfg.rb:90:1:93:3 | Normal Exit | cfg.rb:90:1:93:3 | Normal Exit | +| cfg.rb:90:1:93:3 | Normal Exit | cfg.rb:91:6:91:10 | After ... > ... [false] | +| cfg.rb:90:1:93:3 | Normal Exit | cfg.rb:91:6:91:10 | After ... > ... [true] | +| cfg.rb:90:5:90:5 | After defined? ... [false] | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:90:5:90:5 | After defined? ... [true] | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:91:6:91:10 | After ... > ... [false] | cfg.rb:91:6:91:10 | After ... > ... [false] | +| cfg.rb:91:6:91:10 | After ... > ... [true] | cfg.rb:91:6:91:10 | After ... > ... [true] | +| cfg.rb:101:1:104:3 | Entry | cfg.rb:101:1:104:3 | Entry | +| cfg.rb:101:16:101:20 | After value [match] | cfg.rb:101:16:101:20 | After value [match] | +| cfg.rb:101:16:101:20 | After value [no-match] | cfg.rb:101:16:101:20 | After value [no-match] | +| cfg.rb:101:28:101:30 | key | cfg.rb:101:1:104:3 | Entry | +| cfg.rb:101:28:101:30 | key | cfg.rb:101:16:101:20 | After value [match] | +| cfg.rb:101:28:101:30 | key | cfg.rb:101:16:101:20 | After value [no-match] | | cfg.rb:101:28:101:30 | key | cfg.rb:101:28:101:30 | key | -| cfg.rb:113:1:113:9 | self | cfg.rb:113:1:113:9 | self | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:60:27:60:31 | hello | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:60:37:60:39 | bye | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:113:1:113:9 | self | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:120:8:120:28 | enter -> { ... } | cfg.rb:120:8:120:28 | enter -> { ... } | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:60:27:60:31 | hello | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:60:37:60:39 | bye | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:113:1:113:9 | self | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:136:12:136:29 | self | -| cfg.rb:136:12:136:29 | self | cfg.rb:136:12:136:29 | self | -| cfg.rb:145:3:148:5 | enter print | cfg.rb:145:3:148:5 | enter print | -| cfg.rb:152:1:154:3 | enter method | cfg.rb:152:1:154:3 | enter method | -| cfg.rb:156:1:156:28 | enter two_parameters | cfg.rb:156:1:156:28 | enter two_parameters | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:60:27:60:31 | hello | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:60:37:60:39 | bye | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:113:1:113:9 | self | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:136:12:136:29 | self | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:172:21:172:29 | self | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:172:36:172:45 | self | -| cfg.rb:172:21:172:29 | self | cfg.rb:172:21:172:29 | self | -| cfg.rb:172:36:172:45 | self | cfg.rb:172:36:172:45 | self | -| cfg.rb:174:1:174:9 | self | cfg.rb:174:1:174:9 | self | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:60:27:60:31 | hello | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:60:37:60:39 | bye | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:113:1:113:9 | self | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:136:12:136:29 | self | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:172:21:172:29 | self | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:172:36:172:45 | self | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:174:1:174:9 | self | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:60:27:60:31 | hello | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:60:37:60:39 | bye | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:113:1:113:9 | self | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:136:12:136:29 | self | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:172:21:172:29 | self | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:172:36:172:45 | self | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:174:1:174:9 | self | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:176:17:176:17 | x | -| cfg.rb:176:7:176:7 | x | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:176:7:176:7 | x | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:176:7:176:7 | x | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:42:15:42:24 | self | -| cfg.rb:176:7:176:7 | x | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:176:7:176:7 | x | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:176:7:176:7 | x | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:176:7:176:7 | x | cfg.rb:43:21:43:31 | self | -| cfg.rb:176:7:176:7 | x | cfg.rb:44:8:44:18 | self | -| cfg.rb:176:7:176:7 | x | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:48:20:48:29 | self | -| cfg.rb:176:7:176:7 | x | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:49:8:49:8 | b | -| cfg.rb:176:7:176:7 | x | cfg.rb:49:16:49:16 | b | -| cfg.rb:176:7:176:7 | x | cfg.rb:49:27:49:37 | self | -| cfg.rb:176:7:176:7 | x | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:60:27:60:31 | hello | -| cfg.rb:176:7:176:7 | x | cfg.rb:60:37:60:39 | bye | -| cfg.rb:176:7:176:7 | x | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:176:7:176:7 | x | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:75:23:75:23 | x | -| cfg.rb:176:7:176:7 | x | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:176:7:176:7 | x | cfg.rb:75:43:75:43 | x | -| cfg.rb:176:7:176:7 | x | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:90:5:90:5 | x | -| cfg.rb:176:7:176:7 | x | cfg.rb:113:1:113:9 | self | -| cfg.rb:176:7:176:7 | x | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:136:12:136:29 | self | -| cfg.rb:176:7:176:7 | x | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:172:21:172:29 | self | -| cfg.rb:176:7:176:7 | x | cfg.rb:172:36:172:45 | self | -| cfg.rb:176:7:176:7 | x | cfg.rb:174:1:174:9 | self | -| cfg.rb:176:7:176:7 | x | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:176:7:176:7 | x | -| cfg.rb:176:7:176:7 | x | cfg.rb:176:17:176:17 | x | -| cfg.rb:176:17:176:17 | x | cfg.rb:176:17:176:17 | x | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:60:27:60:31 | hello | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:60:37:60:39 | bye | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:113:1:113:9 | self | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:136:12:136:29 | self | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:172:21:172:29 | self | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:172:36:172:45 | self | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:174:1:174:9 | self | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:176:17:176:17 | x | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:179:2:179:13 | self | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:179:2:179:13 | self | cfg.rb:179:2:179:13 | self | -| cfg.rb:179:30:179:30 | i | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:179:30:179:30 | i | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:179:30:179:30 | i | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:42:15:42:24 | self | -| cfg.rb:179:30:179:30 | i | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:179:30:179:30 | i | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:179:30:179:30 | i | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:179:30:179:30 | i | cfg.rb:43:21:43:31 | self | -| cfg.rb:179:30:179:30 | i | cfg.rb:44:8:44:18 | self | -| cfg.rb:179:30:179:30 | i | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:48:20:48:29 | self | -| cfg.rb:179:30:179:30 | i | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:49:8:49:8 | b | -| cfg.rb:179:30:179:30 | i | cfg.rb:49:16:49:16 | b | -| cfg.rb:179:30:179:30 | i | cfg.rb:49:27:49:37 | self | -| cfg.rb:179:30:179:30 | i | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:60:27:60:31 | hello | -| cfg.rb:179:30:179:30 | i | cfg.rb:60:37:60:39 | bye | -| cfg.rb:179:30:179:30 | i | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:179:30:179:30 | i | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:75:23:75:23 | x | -| cfg.rb:179:30:179:30 | i | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:179:30:179:30 | i | cfg.rb:75:43:75:43 | x | -| cfg.rb:179:30:179:30 | i | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:90:5:90:5 | x | -| cfg.rb:179:30:179:30 | i | cfg.rb:113:1:113:9 | self | -| cfg.rb:179:30:179:30 | i | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:136:12:136:29 | self | -| cfg.rb:179:30:179:30 | i | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:172:21:172:29 | self | -| cfg.rb:179:30:179:30 | i | cfg.rb:172:36:172:45 | self | -| cfg.rb:179:30:179:30 | i | cfg.rb:174:1:174:9 | self | -| cfg.rb:179:30:179:30 | i | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:176:7:176:7 | x | -| cfg.rb:179:30:179:30 | i | cfg.rb:176:17:176:17 | x | -| cfg.rb:179:30:179:30 | i | cfg.rb:179:2:179:13 | self | -| cfg.rb:179:30:179:30 | i | cfg.rb:179:30:179:30 | i | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:60:27:60:31 | hello | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:60:37:60:39 | bye | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:113:1:113:9 | self | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:136:12:136:29 | self | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:172:21:172:29 | self | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:172:36:172:45 | self | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:174:1:174:9 | self | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:176:17:176:17 | x | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:179:2:179:13 | self | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:182:7:182:7 | x | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:182:7:182:7 | x | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:182:7:182:7 | x | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:42:15:42:24 | self | -| cfg.rb:182:7:182:7 | x | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:182:7:182:7 | x | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:182:7:182:7 | x | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:182:7:182:7 | x | cfg.rb:43:21:43:31 | self | -| cfg.rb:182:7:182:7 | x | cfg.rb:44:8:44:18 | self | -| cfg.rb:182:7:182:7 | x | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:48:20:48:29 | self | -| cfg.rb:182:7:182:7 | x | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:49:8:49:8 | b | -| cfg.rb:182:7:182:7 | x | cfg.rb:49:16:49:16 | b | -| cfg.rb:182:7:182:7 | x | cfg.rb:49:27:49:37 | self | -| cfg.rb:182:7:182:7 | x | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:60:27:60:31 | hello | -| cfg.rb:182:7:182:7 | x | cfg.rb:60:37:60:39 | bye | -| cfg.rb:182:7:182:7 | x | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:182:7:182:7 | x | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:75:23:75:23 | x | -| cfg.rb:182:7:182:7 | x | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:182:7:182:7 | x | cfg.rb:75:43:75:43 | x | -| cfg.rb:182:7:182:7 | x | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:90:5:90:5 | x | -| cfg.rb:182:7:182:7 | x | cfg.rb:113:1:113:9 | self | -| cfg.rb:182:7:182:7 | x | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:136:12:136:29 | self | -| cfg.rb:182:7:182:7 | x | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:172:21:172:29 | self | -| cfg.rb:182:7:182:7 | x | cfg.rb:172:36:172:45 | self | -| cfg.rb:182:7:182:7 | x | cfg.rb:174:1:174:9 | self | -| cfg.rb:182:7:182:7 | x | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:176:7:176:7 | x | -| cfg.rb:182:7:182:7 | x | cfg.rb:176:17:176:17 | x | -| cfg.rb:182:7:182:7 | x | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:179:2:179:13 | self | -| cfg.rb:182:7:182:7 | x | cfg.rb:179:30:179:30 | i | -| cfg.rb:182:7:182:7 | x | cfg.rb:182:7:182:7 | x | -| cfg.rb:182:7:182:7 | x | cfg.rb:183:3:183:3 | x | -| cfg.rb:182:7:182:7 | x | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:184:18:184:21 | redo | -| cfg.rb:183:3:183:3 | x | cfg.rb:183:3:183:3 | x | -| cfg.rb:183:3:183:3 | x | cfg.rb:184:18:184:21 | redo | -| cfg.rb:184:3:184:25 | if ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:184:3:184:25 | if ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:184:3:184:25 | if ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:184:18:184:21 | redo | cfg.rb:184:18:184:21 | redo | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:60:27:60:31 | hello | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:60:37:60:39 | bye | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:113:1:113:9 | self | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:136:12:136:29 | self | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:172:21:172:29 | self | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:172:36:172:45 | self | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:174:1:174:9 | self | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:176:17:176:17 | x | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:179:2:179:13 | self | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:188:2:188:13 | self | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:188:2:188:13 | self | cfg.rb:188:2:188:13 | self | -| cfg.rb:188:30:188:30 | i | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:188:30:188:30 | i | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:188:30:188:30 | i | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:42:15:42:24 | self | -| cfg.rb:188:30:188:30 | i | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:188:30:188:30 | i | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:188:30:188:30 | i | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:188:30:188:30 | i | cfg.rb:43:21:43:31 | self | -| cfg.rb:188:30:188:30 | i | cfg.rb:44:8:44:18 | self | -| cfg.rb:188:30:188:30 | i | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:48:20:48:29 | self | -| cfg.rb:188:30:188:30 | i | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:49:8:49:8 | b | -| cfg.rb:188:30:188:30 | i | cfg.rb:49:16:49:16 | b | -| cfg.rb:188:30:188:30 | i | cfg.rb:49:27:49:37 | self | -| cfg.rb:188:30:188:30 | i | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:60:27:60:31 | hello | -| cfg.rb:188:30:188:30 | i | cfg.rb:60:37:60:39 | bye | -| cfg.rb:188:30:188:30 | i | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:188:30:188:30 | i | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:75:23:75:23 | x | -| cfg.rb:188:30:188:30 | i | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:188:30:188:30 | i | cfg.rb:75:43:75:43 | x | -| cfg.rb:188:30:188:30 | i | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:90:5:90:5 | x | -| cfg.rb:188:30:188:30 | i | cfg.rb:113:1:113:9 | self | -| cfg.rb:188:30:188:30 | i | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:136:12:136:29 | self | -| cfg.rb:188:30:188:30 | i | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:172:21:172:29 | self | -| cfg.rb:188:30:188:30 | i | cfg.rb:172:36:172:45 | self | -| cfg.rb:188:30:188:30 | i | cfg.rb:174:1:174:9 | self | -| cfg.rb:188:30:188:30 | i | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:176:7:176:7 | x | -| cfg.rb:188:30:188:30 | i | cfg.rb:176:17:176:17 | x | -| cfg.rb:188:30:188:30 | i | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:179:2:179:13 | self | -| cfg.rb:188:30:188:30 | i | cfg.rb:179:30:179:30 | i | -| cfg.rb:188:30:188:30 | i | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:182:7:182:7 | x | -| cfg.rb:188:30:188:30 | i | cfg.rb:183:3:183:3 | x | -| cfg.rb:188:30:188:30 | i | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:184:18:184:21 | redo | -| cfg.rb:188:30:188:30 | i | cfg.rb:188:2:188:13 | self | -| cfg.rb:188:30:188:30 | i | cfg.rb:188:30:188:30 | i | -| cfg.rb:190:1:192:3 | enter run_block | cfg.rb:190:1:192:3 | enter run_block | -| cfg.rb:194:11:194:23 | enter { ... } | cfg.rb:194:11:194:23 | enter { ... } | -| cfg.rb:196:1:198:3 | enter forward_param | cfg.rb:196:1:198:3 | enter forward_param | -| cfg.rb:200:9:200:32 | enter { ... } | cfg.rb:200:9:200:32 | enter { ... } | -| cfg.rb:202:9:202:35 | enter do ... end | cfg.rb:202:9:202:35 | enter do ... end | -| cfg.rb:205:1:205:3 | __synth__0__1 | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:205:1:205:3 | nil | cfg.rb:205:1:205:3 | nil | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:60:27:60:31 | hello | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:60:37:60:39 | bye | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:113:1:113:9 | self | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:136:12:136:29 | self | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:172:21:172:29 | self | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:172:36:172:45 | self | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:174:1:174:9 | self | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:176:17:176:17 | x | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:179:2:179:13 | self | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:188:2:188:13 | self | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:205:1:205:3 | nil | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:205:15:205:23 | enter { ... } | cfg.rb:205:15:205:23 | enter { ... } | -| cfg.rb:207:1:211:3 | enter filter_nil | cfg.rb:207:1:211:3 | enter filter_nil | -| cfg.rb:208:15:210:5 | enter do ... end | cfg.rb:208:15:210:5 | enter do ... end | -| cfg.rb:213:14:216:3 | enter do ... end | cfg.rb:213:14:216:3 | enter do ... end | -| constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | -| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | -| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | -| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:5:22:5:24 | 123 | -| constant_compound_assign.rb:5:22:5:24 | 123 | constant_compound_assign.rb:5:22:5:24 | 123 | -| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | -| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | -| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:5:22:5:24 | 123 | -| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | -| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:14:18:14:20 | 123 | -| constant_compound_assign.rb:14:18:14:20 | 123 | constant_compound_assign.rb:14:18:14:20 | 123 | -| constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | -| constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | -| constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | constant_compound_assign.rb:5:22:5:24 | 123 | -| constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | -| constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | constant_compound_assign.rb:14:18:14:20 | 123 | -| constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | -| constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | constant_compound_assign.rb:19:21:19:23 | 123 | -| constant_compound_assign.rb:19:21:19:23 | 123 | constant_compound_assign.rb:19:21:19:23 | 123 | -| desugar.rb:1:1:3:3 | enter m1 | desugar.rb:1:1:3:3 | enter m1 | -| desugar.rb:1:1:38:17 | enter desugar.rb | desugar.rb:1:1:38:17 | enter desugar.rb | -| desugar.rb:5:1:7:3 | enter m2 | desugar.rb:5:1:7:3 | enter m2 | -| desugar.rb:9:1:11:3 | enter m3 | desugar.rb:9:1:11:3 | enter m3 | -| desugar.rb:13:1:15:3 | enter m4 | desugar.rb:13:1:15:3 | enter m4 | -| desugar.rb:17:1:19:3 | enter m5 | desugar.rb:17:1:19:3 | enter m5 | -| desugar.rb:21:1:23:3 | enter m6 | desugar.rb:21:1:23:3 | enter m6 | -| desugar.rb:25:1:27:3 | enter m7 | desugar.rb:25:1:27:3 | enter m7 | -| exit.rb:1:1:6:3 | enter m1 | exit.rb:1:1:6:3 | enter m1 | -| exit.rb:1:1:6:3 | exit m1 | exit.rb:1:1:6:3 | exit m1 | -| exit.rb:1:1:13:4 | enter exit.rb | exit.rb:1:1:13:4 | enter exit.rb | -| exit.rb:2:3:4:5 | if ... | exit.rb:1:1:6:3 | enter m1 | -| exit.rb:2:3:4:5 | if ... | exit.rb:2:3:4:5 | if ... | -| exit.rb:3:5:3:10 | self | exit.rb:3:5:3:10 | self | -| exit.rb:8:1:13:3 | enter m2 | exit.rb:8:1:13:3 | enter m2 | -| exit.rb:8:1:13:3 | exit m2 | exit.rb:8:1:13:3 | exit m2 | -| exit.rb:9:3:11:5 | if ... | exit.rb:8:1:13:3 | enter m2 | -| exit.rb:9:3:11:5 | if ... | exit.rb:9:3:11:5 | if ... | -| exit.rb:10:5:10:18 | self | exit.rb:10:5:10:18 | self | -| heredoc.rb:1:1:7:3 | enter double_heredoc | heredoc.rb:1:1:7:3 | enter double_heredoc | -| heredoc.rb:1:1:7:4 | enter heredoc.rb | heredoc.rb:1:1:7:4 | enter heredoc.rb | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:1:1:9:3 | enter m1 | -| ifs.rb:1:1:58:4 | enter ifs.rb | ifs.rb:1:1:58:4 | enter ifs.rb | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:1:1:9:3 | enter m1 | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:2:3:8:5 | if ... | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:3:5:3:30 | self | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:4:3:7:35 | elsif ... | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:4:9:4:9 | x | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:4:9:4:24 | [false] ... and ... | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:4:9:4:24 | [true] ... and ... | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:4:9:4:38 | [false] ... and ... | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:4:9:4:38 | [true] ... and ... | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:4:20:4:20 | x | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:4:30:4:38 | [false] ! ... | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:4:30:4:38 | [true] ! ... | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:4:31:4:38 | [false] ( ... ) | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:4:31:4:38 | [true] ( ... ) | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:4:32:4:32 | x | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:5:5:5:17 | self | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:7:5:7:35 | self | -| ifs.rb:3:5:3:30 | self | ifs.rb:3:5:3:30 | self | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:4:3:7:35 | elsif ... | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:4:9:4:9 | x | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:4:9:4:24 | [false] ... and ... | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:4:9:4:24 | [true] ... and ... | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:4:9:4:38 | [false] ... and ... | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:4:9:4:38 | [true] ... and ... | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:4:20:4:20 | x | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:4:30:4:38 | [false] ! ... | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:4:30:4:38 | [true] ! ... | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:4:31:4:38 | [false] ( ... ) | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:4:31:4:38 | [true] ( ... ) | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:4:32:4:32 | x | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:5:5:5:17 | self | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:7:5:7:35 | self | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:9:4:9 | x | -| ifs.rb:4:9:4:24 | [false] ... and ... | ifs.rb:4:9:4:24 | [false] ... and ... | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:9:4:24 | [true] ... and ... | -| ifs.rb:4:9:4:38 | [false] ... and ... | ifs.rb:4:9:4:24 | [false] ... and ... | -| ifs.rb:4:9:4:38 | [false] ... and ... | ifs.rb:4:9:4:38 | [false] ... and ... | -| ifs.rb:4:9:4:38 | [false] ... and ... | ifs.rb:4:30:4:38 | [false] ! ... | -| ifs.rb:4:9:4:38 | [false] ... and ... | ifs.rb:4:31:4:38 | [true] ( ... ) | -| ifs.rb:4:9:4:38 | [true] ... and ... | ifs.rb:4:9:4:38 | [true] ... and ... | -| ifs.rb:4:9:4:38 | [true] ... and ... | ifs.rb:4:30:4:38 | [true] ! ... | -| ifs.rb:4:9:4:38 | [true] ... and ... | ifs.rb:4:31:4:38 | [false] ( ... ) | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:20:4:20 | x | -| ifs.rb:4:30:4:38 | [false] ! ... | ifs.rb:4:30:4:38 | [false] ! ... | -| ifs.rb:4:30:4:38 | [false] ! ... | ifs.rb:4:31:4:38 | [true] ( ... ) | -| ifs.rb:4:30:4:38 | [true] ! ... | ifs.rb:4:30:4:38 | [true] ! ... | -| ifs.rb:4:30:4:38 | [true] ! ... | ifs.rb:4:31:4:38 | [false] ( ... ) | -| ifs.rb:4:31:4:38 | [false] ( ... ) | ifs.rb:4:31:4:38 | [false] ( ... ) | -| ifs.rb:4:31:4:38 | [true] ( ... ) | ifs.rb:4:31:4:38 | [true] ( ... ) | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:9:4:24 | [true] ... and ... | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:32:4:32 | x | -| ifs.rb:5:5:5:17 | self | ifs.rb:4:9:4:38 | [true] ... and ... | -| ifs.rb:5:5:5:17 | self | ifs.rb:4:30:4:38 | [true] ! ... | -| ifs.rb:5:5:5:17 | self | ifs.rb:4:31:4:38 | [false] ( ... ) | -| ifs.rb:5:5:5:17 | self | ifs.rb:5:5:5:17 | self | -| ifs.rb:7:5:7:35 | self | ifs.rb:4:9:4:24 | [false] ... and ... | -| ifs.rb:7:5:7:35 | self | ifs.rb:4:9:4:38 | [false] ... and ... | -| ifs.rb:7:5:7:35 | self | ifs.rb:4:30:4:38 | [false] ! ... | -| ifs.rb:7:5:7:35 | self | ifs.rb:4:31:4:38 | [true] ( ... ) | -| ifs.rb:7:5:7:35 | self | ifs.rb:7:5:7:35 | self | -| ifs.rb:11:1:16:3 | enter m2 | ifs.rb:11:1:16:3 | enter m2 | -| ifs.rb:11:1:16:3 | exit m2 (normal) | ifs.rb:11:1:16:3 | enter m2 | -| ifs.rb:11:1:16:3 | exit m2 (normal) | ifs.rb:11:1:16:3 | exit m2 (normal) | -| ifs.rb:11:1:16:3 | exit m2 (normal) | ifs.rb:12:3:14:5 | if ... | -| ifs.rb:11:1:16:3 | exit m2 (normal) | ifs.rb:13:12:13:12 | 0 | -| ifs.rb:12:3:14:5 | if ... | ifs.rb:12:3:14:5 | if ... | -| ifs.rb:13:12:13:12 | 0 | ifs.rb:13:12:13:12 | 0 | -| ifs.rb:18:1:26:3 | enter m3 | ifs.rb:18:1:26:3 | enter m3 | -| ifs.rb:19:3:24:5 | if ... | ifs.rb:18:1:26:3 | enter m3 | -| ifs.rb:19:3:24:5 | if ... | ifs.rb:19:3:24:5 | if ... | -| ifs.rb:19:3:24:5 | if ... | ifs.rb:20:5:20:5 | x | -| ifs.rb:19:3:24:5 | if ... | ifs.rb:21:5:23:7 | if ... | -| ifs.rb:19:3:24:5 | if ... | ifs.rb:22:7:22:7 | x | -| ifs.rb:20:5:20:5 | x | ifs.rb:20:5:20:5 | x | -| ifs.rb:21:5:23:7 | if ... | ifs.rb:20:5:20:5 | x | -| ifs.rb:21:5:23:7 | if ... | ifs.rb:21:5:23:7 | if ... | -| ifs.rb:21:5:23:7 | if ... | ifs.rb:22:7:22:7 | x | -| ifs.rb:22:7:22:7 | x | ifs.rb:22:7:22:7 | x | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:28:1:30:3 | enter m4 | -| ifs.rb:29:10:29:23 | [false] ( ... ) | ifs.rb:29:10:29:23 | [false] ( ... ) | -| ifs.rb:29:10:29:23 | [false] ( ... ) | ifs.rb:29:11:29:22 | [false] ... ? ... : ... | -| ifs.rb:29:10:29:23 | [true] ( ... ) | ifs.rb:29:10:29:23 | [true] ( ... ) | -| ifs.rb:29:10:29:23 | [true] ( ... ) | ifs.rb:29:11:29:22 | [true] ... ? ... : ... | -| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:28:1:30:3 | enter m4 | -| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:29:10:29:23 | [false] ( ... ) | -| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:29:10:29:23 | [true] ( ... ) | -| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:29:10:29:51 | ... ? ... : ... | -| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:29:11:29:22 | [false] ... ? ... : ... | -| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:29:11:29:22 | [true] ... ? ... : ... | -| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:29:16:29:17 | b2 | -| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:29:21:29:22 | b3 | -| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:29:28:29:35 | b2 \|\| b3 | -| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:29:41:29:50 | !b2 \|\| !b3 | -| ifs.rb:29:11:29:22 | [false] ... ? ... : ... | ifs.rb:29:11:29:22 | [false] ... ? ... : ... | -| ifs.rb:29:11:29:22 | [true] ... ? ... : ... | ifs.rb:29:11:29:22 | [true] ... ? ... : ... | -| ifs.rb:29:16:29:17 | b2 | ifs.rb:29:16:29:17 | b2 | -| ifs.rb:29:21:29:22 | b3 | ifs.rb:29:21:29:22 | b3 | -| ifs.rb:29:28:29:35 | b2 \|\| b3 | ifs.rb:29:10:29:23 | [true] ( ... ) | -| ifs.rb:29:28:29:35 | b2 \|\| b3 | ifs.rb:29:11:29:22 | [true] ... ? ... : ... | -| ifs.rb:29:28:29:35 | b2 \|\| b3 | ifs.rb:29:28:29:35 | b2 \|\| b3 | -| ifs.rb:29:41:29:50 | !b2 \|\| !b3 | ifs.rb:29:10:29:23 | [false] ( ... ) | -| ifs.rb:29:41:29:50 | !b2 \|\| !b3 | ifs.rb:29:11:29:22 | [false] ... ? ... : ... | -| ifs.rb:29:41:29:50 | !b2 \|\| !b3 | ifs.rb:29:41:29:50 | !b2 \|\| !b3 | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:32:1:34:3 | enter m5 | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:32:1:34:3 | enter m5 | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:3:33:100 | if ... | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:6:33:49 | [false] ( ... ) | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:6:33:49 | [true] ( ... ) | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:7:33:48 | [false] if ... | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:7:33:48 | [true] if ... | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:13:33:19 | [false] then ... | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:13:33:19 | [true] then ... | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:18:33:19 | b2 | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:21:33:44 | [false] elsif ... | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:21:33:44 | [true] elsif ... | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:27:33:28 | b3 | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:30:33:36 | [false] then ... | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:30:33:36 | [true] then ... | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:35:33:36 | b4 | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:38:33:44 | [false] else ... | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:38:33:44 | [true] else ... | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:43:33:44 | b5 | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | -| ifs.rb:33:6:33:49 | [false] ( ... ) | ifs.rb:33:6:33:49 | [false] ( ... ) | -| ifs.rb:33:6:33:49 | [false] ( ... ) | ifs.rb:33:7:33:48 | [false] if ... | -| ifs.rb:33:6:33:49 | [false] ( ... ) | ifs.rb:33:13:33:19 | [false] then ... | -| ifs.rb:33:6:33:49 | [false] ( ... ) | ifs.rb:33:21:33:44 | [false] elsif ... | -| ifs.rb:33:6:33:49 | [false] ( ... ) | ifs.rb:33:30:33:36 | [false] then ... | -| ifs.rb:33:6:33:49 | [false] ( ... ) | ifs.rb:33:38:33:44 | [false] else ... | -| ifs.rb:33:6:33:49 | [true] ( ... ) | ifs.rb:33:6:33:49 | [true] ( ... ) | -| ifs.rb:33:6:33:49 | [true] ( ... ) | ifs.rb:33:7:33:48 | [true] if ... | -| ifs.rb:33:6:33:49 | [true] ( ... ) | ifs.rb:33:13:33:19 | [true] then ... | -| ifs.rb:33:6:33:49 | [true] ( ... ) | ifs.rb:33:21:33:44 | [true] elsif ... | -| ifs.rb:33:6:33:49 | [true] ( ... ) | ifs.rb:33:30:33:36 | [true] then ... | -| ifs.rb:33:6:33:49 | [true] ( ... ) | ifs.rb:33:38:33:44 | [true] else ... | -| ifs.rb:33:7:33:48 | [false] if ... | ifs.rb:33:7:33:48 | [false] if ... | -| ifs.rb:33:7:33:48 | [false] if ... | ifs.rb:33:13:33:19 | [false] then ... | -| ifs.rb:33:7:33:48 | [false] if ... | ifs.rb:33:21:33:44 | [false] elsif ... | -| ifs.rb:33:7:33:48 | [false] if ... | ifs.rb:33:30:33:36 | [false] then ... | -| ifs.rb:33:7:33:48 | [false] if ... | ifs.rb:33:38:33:44 | [false] else ... | -| ifs.rb:33:7:33:48 | [true] if ... | ifs.rb:33:7:33:48 | [true] if ... | -| ifs.rb:33:7:33:48 | [true] if ... | ifs.rb:33:13:33:19 | [true] then ... | -| ifs.rb:33:7:33:48 | [true] if ... | ifs.rb:33:21:33:44 | [true] elsif ... | -| ifs.rb:33:7:33:48 | [true] if ... | ifs.rb:33:30:33:36 | [true] then ... | -| ifs.rb:33:7:33:48 | [true] if ... | ifs.rb:33:38:33:44 | [true] else ... | -| ifs.rb:33:13:33:19 | [false] then ... | ifs.rb:33:13:33:19 | [false] then ... | -| ifs.rb:33:13:33:19 | [true] then ... | ifs.rb:33:13:33:19 | [true] then ... | -| ifs.rb:33:18:33:19 | b2 | ifs.rb:33:18:33:19 | b2 | -| ifs.rb:33:21:33:44 | [false] elsif ... | ifs.rb:33:21:33:44 | [false] elsif ... | -| ifs.rb:33:21:33:44 | [false] elsif ... | ifs.rb:33:30:33:36 | [false] then ... | -| ifs.rb:33:21:33:44 | [false] elsif ... | ifs.rb:33:38:33:44 | [false] else ... | -| ifs.rb:33:21:33:44 | [true] elsif ... | ifs.rb:33:21:33:44 | [true] elsif ... | -| ifs.rb:33:21:33:44 | [true] elsif ... | ifs.rb:33:30:33:36 | [true] then ... | -| ifs.rb:33:21:33:44 | [true] elsif ... | ifs.rb:33:38:33:44 | [true] else ... | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:27:33:28 | b3 | -| ifs.rb:33:30:33:36 | [false] then ... | ifs.rb:33:30:33:36 | [false] then ... | -| ifs.rb:33:30:33:36 | [true] then ... | ifs.rb:33:30:33:36 | [true] then ... | -| ifs.rb:33:35:33:36 | b4 | ifs.rb:33:35:33:36 | b4 | -| ifs.rb:33:38:33:44 | [false] else ... | ifs.rb:33:38:33:44 | [false] else ... | -| ifs.rb:33:38:33:44 | [true] else ... | ifs.rb:33:38:33:44 | [true] else ... | -| ifs.rb:33:43:33:44 | b5 | ifs.rb:33:43:33:44 | b5 | -| ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | ifs.rb:33:6:33:49 | [true] ( ... ) | -| ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | ifs.rb:33:7:33:48 | [true] if ... | -| ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | ifs.rb:33:13:33:19 | [true] then ... | -| ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | ifs.rb:33:21:33:44 | [true] elsif ... | -| ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | ifs.rb:33:30:33:36 | [true] then ... | -| ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | ifs.rb:33:38:33:44 | [true] else ... | -| ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | -| ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | ifs.rb:33:6:33:49 | [false] ( ... ) | -| ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | ifs.rb:33:7:33:48 | [false] if ... | -| ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | ifs.rb:33:13:33:19 | [false] then ... | -| ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | ifs.rb:33:21:33:44 | [false] elsif ... | -| ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | ifs.rb:33:30:33:36 | [false] then ... | -| ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | ifs.rb:33:38:33:44 | [false] else ... | -| ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | -| ifs.rb:36:1:38:3 | conditional_method_def | ifs.rb:36:1:38:3 | conditional_method_def | -| ifs.rb:36:1:38:3 | enter conditional_method_def | ifs.rb:36:1:38:3 | enter conditional_method_def | -| ifs.rb:36:1:38:17 | ... unless ... | ifs.rb:1:1:58:4 | enter ifs.rb | -| ifs.rb:36:1:38:17 | ... unless ... | ifs.rb:36:1:38:3 | conditional_method_def | -| ifs.rb:36:1:38:17 | ... unless ... | ifs.rb:36:1:38:17 | ... unless ... | -| ifs.rb:40:1:44:3 | enter constant_condition | ifs.rb:40:1:44:3 | enter constant_condition | -| ifs.rb:41:3:43:5 | if ... | ifs.rb:40:1:44:3 | enter constant_condition | -| ifs.rb:41:3:43:5 | if ... | ifs.rb:41:3:43:5 | if ... | -| ifs.rb:41:3:43:5 | if ... | ifs.rb:41:6:41:10 | [false] ! ... | -| ifs.rb:41:6:41:10 | [false] ! ... | ifs.rb:40:1:44:3 | enter constant_condition | -| ifs.rb:41:6:41:10 | [false] ! ... | ifs.rb:41:6:41:10 | [false] ! ... | -| ifs.rb:46:1:52:3 | enter empty_else | ifs.rb:46:1:52:3 | enter empty_else | -| ifs.rb:47:3:50:5 | if ... | ifs.rb:46:1:52:3 | enter empty_else | -| ifs.rb:47:3:50:5 | if ... | ifs.rb:47:3:50:5 | if ... | -| ifs.rb:47:3:50:5 | if ... | ifs.rb:48:5:48:15 | self | -| ifs.rb:47:3:50:5 | if ... | ifs.rb:49:3:49:6 | else ... | -| ifs.rb:48:5:48:15 | self | ifs.rb:48:5:48:15 | self | -| ifs.rb:49:3:49:6 | else ... | ifs.rb:49:3:49:6 | else ... | -| ifs.rb:54:1:58:3 | enter disjunct | ifs.rb:54:1:58:3 | enter disjunct | -| ifs.rb:55:3:57:5 | if ... | ifs.rb:54:1:58:3 | enter disjunct | -| ifs.rb:55:3:57:5 | if ... | ifs.rb:55:3:57:5 | if ... | -| ifs.rb:55:3:57:5 | if ... | ifs.rb:55:6:55:15 | [false] ( ... ) | -| ifs.rb:55:3:57:5 | if ... | ifs.rb:55:6:55:15 | [true] ( ... ) | -| ifs.rb:55:3:57:5 | if ... | ifs.rb:55:7:55:14 | [false] ... \|\| ... | -| ifs.rb:55:3:57:5 | if ... | ifs.rb:55:7:55:14 | [true] ... \|\| ... | -| ifs.rb:55:3:57:5 | if ... | ifs.rb:55:13:55:14 | b2 | -| ifs.rb:55:3:57:5 | if ... | ifs.rb:56:5:56:19 | self | -| ifs.rb:55:6:55:15 | [false] ( ... ) | ifs.rb:55:6:55:15 | [false] ( ... ) | -| ifs.rb:55:6:55:15 | [false] ( ... ) | ifs.rb:55:7:55:14 | [false] ... \|\| ... | -| ifs.rb:55:6:55:15 | [true] ( ... ) | ifs.rb:55:6:55:15 | [true] ( ... ) | -| ifs.rb:55:6:55:15 | [true] ( ... ) | ifs.rb:55:7:55:14 | [true] ... \|\| ... | -| ifs.rb:55:7:55:14 | [false] ... \|\| ... | ifs.rb:55:7:55:14 | [false] ... \|\| ... | -| ifs.rb:55:7:55:14 | [true] ... \|\| ... | ifs.rb:55:7:55:14 | [true] ... \|\| ... | -| ifs.rb:55:13:55:14 | b2 | ifs.rb:55:13:55:14 | b2 | -| ifs.rb:56:5:56:19 | self | ifs.rb:55:6:55:15 | [true] ( ... ) | -| ifs.rb:56:5:56:19 | self | ifs.rb:55:7:55:14 | [true] ... \|\| ... | -| ifs.rb:56:5:56:19 | self | ifs.rb:56:5:56:19 | self | -| loops.rb:1:1:6:3 | enter m1 | loops.rb:1:1:6:3 | enter m1 | -| loops.rb:1:1:33:4 | enter loops.rb | loops.rb:1:1:33:4 | enter loops.rb | -| loops.rb:2:3:5:5 | while ... | loops.rb:1:1:6:3 | enter m1 | -| loops.rb:2:3:5:5 | while ... | loops.rb:2:3:5:5 | while ... | -| loops.rb:2:3:5:5 | while ... | loops.rb:2:9:2:9 | x | -| loops.rb:2:3:5:5 | while ... | loops.rb:3:5:3:10 | self | -| loops.rb:2:9:2:9 | x | loops.rb:1:1:6:3 | enter m1 | -| loops.rb:2:9:2:9 | x | loops.rb:2:9:2:9 | x | -| loops.rb:2:9:2:9 | x | loops.rb:3:5:3:10 | self | -| loops.rb:3:5:3:10 | self | loops.rb:3:5:3:10 | self | -| loops.rb:8:1:22:3 | enter m2 | loops.rb:8:1:22:3 | enter m2 | -| loops.rb:9:3:20:5 | while ... | loops.rb:8:1:22:3 | enter m2 | -| loops.rb:9:3:20:5 | while ... | loops.rb:9:3:20:5 | while ... | -| loops.rb:9:3:20:5 | while ... | loops.rb:9:9:9:9 | x | -| loops.rb:9:3:20:5 | while ... | loops.rb:10:5:10:10 | self | -| loops.rb:9:3:20:5 | while ... | loops.rb:13:7:13:11 | break | -| loops.rb:9:3:20:5 | while ... | loops.rb:14:11:14:11 | x | -| loops.rb:9:3:20:5 | while ... | loops.rb:15:7:15:10 | next | -| loops.rb:9:3:20:5 | while ... | loops.rb:16:5:17:10 | elsif ... | -| loops.rb:9:3:20:5 | while ... | loops.rb:16:11:16:11 | x | -| loops.rb:9:3:20:5 | while ... | loops.rb:17:7:17:10 | redo | -| loops.rb:9:9:9:9 | x | loops.rb:8:1:22:3 | enter m2 | -| loops.rb:9:9:9:9 | x | loops.rb:9:9:9:9 | x | -| loops.rb:9:9:9:9 | x | loops.rb:15:7:15:10 | next | -| loops.rb:9:9:9:9 | x | loops.rb:16:5:17:10 | elsif ... | -| loops.rb:10:5:10:10 | self | loops.rb:10:5:10:10 | self | -| loops.rb:10:5:10:10 | self | loops.rb:17:7:17:10 | redo | -| loops.rb:13:7:13:11 | break | loops.rb:13:7:13:11 | break | -| loops.rb:14:11:14:11 | x | loops.rb:14:11:14:11 | x | -| loops.rb:15:7:15:10 | next | loops.rb:15:7:15:10 | next | -| loops.rb:16:5:17:10 | elsif ... | loops.rb:16:5:17:10 | elsif ... | -| loops.rb:16:11:16:11 | x | loops.rb:16:11:16:11 | x | -| loops.rb:17:7:17:10 | redo | loops.rb:17:7:17:10 | redo | -| loops.rb:24:1:28:3 | enter m3 | loops.rb:24:1:28:3 | enter m3 | -| loops.rb:25:16:27:5 | enter do ... end | loops.rb:25:16:27:5 | enter do ... end | -| loops.rb:30:1:33:3 | enter m4 | loops.rb:30:1:33:3 | enter m4 | -| loops.rb:31:3:32:5 | while ... | loops.rb:30:1:33:3 | enter m4 | -| loops.rb:31:3:32:5 | while ... | loops.rb:31:3:32:5 | while ... | -| loops.rb:31:3:32:5 | while ... | loops.rb:31:9:31:9 | x | -| loops.rb:31:3:32:5 | while ... | loops.rb:31:15:32:5 | do ... | -| loops.rb:31:9:31:9 | x | loops.rb:30:1:33:3 | enter m4 | -| loops.rb:31:9:31:9 | x | loops.rb:31:9:31:9 | x | -| loops.rb:31:9:31:9 | x | loops.rb:31:15:32:5 | do ... | -| loops.rb:31:15:32:5 | do ... | loops.rb:31:15:32:5 | do ... | -| raise.rb:1:1:182:4 | enter raise.rb | raise.rb:1:1:182:4 | enter raise.rb | -| raise.rb:7:1:12:3 | enter m1 | raise.rb:7:1:12:3 | enter m1 | -| raise.rb:7:1:12:3 | exit m1 | raise.rb:7:1:12:3 | exit m1 | -| raise.rb:8:3:10:5 | if ... | raise.rb:7:1:12:3 | enter m1 | -| raise.rb:8:3:10:5 | if ... | raise.rb:8:3:10:5 | if ... | -| raise.rb:9:5:9:17 | self | raise.rb:9:5:9:17 | self | -| raise.rb:14:1:23:3 | enter m2 | raise.rb:14:1:23:3 | enter m2 | -| raise.rb:14:1:23:3 | exit m2 | raise.rb:14:1:23:3 | exit m2 | -| raise.rb:14:1:23:3 | exit m2 (abnormal) | raise.rb:14:1:23:3 | exit m2 (abnormal) | -| raise.rb:16:5:18:7 | if ... | raise.rb:16:5:18:7 | if ... | -| raise.rb:17:7:17:22 | self | raise.rb:17:7:17:22 | self | -| raise.rb:20:5:20:18 | self | raise.rb:17:7:17:22 | self | -| raise.rb:20:5:20:18 | self | raise.rb:20:5:20:18 | self | -| raise.rb:22:3:22:15 | self | raise.rb:14:1:23:3 | enter m2 | -| raise.rb:22:3:22:15 | self | raise.rb:16:5:18:7 | if ... | -| raise.rb:22:3:22:15 | self | raise.rb:17:7:17:22 | self | -| raise.rb:22:3:22:15 | self | raise.rb:20:5:20:18 | self | -| raise.rb:22:3:22:15 | self | raise.rb:22:3:22:15 | self | -| raise.rb:25:1:34:3 | enter m3 | raise.rb:25:1:34:3 | enter m3 | -| raise.rb:27:5:29:7 | if ... | raise.rb:27:5:29:7 | if ... | -| raise.rb:28:7:28:22 | self | raise.rb:28:7:28:22 | self | -| raise.rb:33:3:33:15 | self | raise.rb:25:1:34:3 | enter m3 | -| raise.rb:33:3:33:15 | self | raise.rb:27:5:29:7 | if ... | -| raise.rb:33:3:33:15 | self | raise.rb:28:7:28:22 | self | -| raise.rb:33:3:33:15 | self | raise.rb:33:3:33:15 | self | -| raise.rb:36:1:45:3 | enter m4 | raise.rb:36:1:45:3 | enter m4 | -| raise.rb:38:5:40:7 | if ... | raise.rb:38:5:40:7 | if ... | -| raise.rb:39:7:39:22 | self | raise.rb:39:7:39:22 | self | -| raise.rb:44:3:44:15 | self | raise.rb:36:1:45:3 | enter m4 | -| raise.rb:44:3:44:15 | self | raise.rb:38:5:40:7 | if ... | -| raise.rb:44:3:44:15 | self | raise.rb:39:7:39:22 | self | -| raise.rb:44:3:44:15 | self | raise.rb:44:3:44:15 | self | -| raise.rb:47:1:55:3 | enter m5 | raise.rb:47:1:55:3 | enter m5 | -| raise.rb:49:5:51:7 | if ... | raise.rb:49:5:51:7 | if ... | -| raise.rb:50:7:50:22 | self | raise.rb:50:7:50:22 | self | -| raise.rb:54:3:54:15 | self | raise.rb:47:1:55:3 | enter m5 | -| raise.rb:54:3:54:15 | self | raise.rb:49:5:51:7 | if ... | -| raise.rb:54:3:54:15 | self | raise.rb:50:7:50:22 | self | -| raise.rb:54:3:54:15 | self | raise.rb:54:3:54:15 | self | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:57:1:66:3 | enter m6 | -| raise.rb:57:1:66:3 | exit m6 | raise.rb:57:1:66:3 | exit m6 | -| raise.rb:57:1:66:3 | exit m6 (abnormal) | raise.rb:57:1:66:3 | exit m6 (abnormal) | -| raise.rb:59:5:61:7 | if ... | raise.rb:59:5:61:7 | if ... | -| raise.rb:60:7:60:22 | self | raise.rb:60:7:60:22 | self | -| raise.rb:62:22:62:31 | ExceptionB | raise.rb:62:22:62:31 | ExceptionB | -| raise.rb:62:36:62:36 | e | raise.rb:60:7:60:22 | self | -| raise.rb:62:36:62:36 | e | raise.rb:62:22:62:31 | ExceptionB | -| raise.rb:62:36:62:36 | e | raise.rb:62:36:62:36 | e | -| raise.rb:65:3:65:15 | self | raise.rb:57:1:66:3 | enter m6 | -| raise.rb:65:3:65:15 | self | raise.rb:59:5:61:7 | if ... | -| raise.rb:65:3:65:15 | self | raise.rb:60:7:60:22 | self | -| raise.rb:65:3:65:15 | self | raise.rb:62:22:62:31 | ExceptionB | -| raise.rb:65:3:65:15 | self | raise.rb:62:36:62:36 | e | -| raise.rb:65:3:65:15 | self | raise.rb:65:3:65:15 | self | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:68:1:77:3 | enter m7 | -| raise.rb:68:1:77:3 | exit m7 | raise.rb:68:1:77:3 | exit m7 | -| raise.rb:68:1:77:3 | exit m7 (normal) | raise.rb:68:1:77:3 | enter m7 | -| raise.rb:68:1:77:3 | exit m7 (normal) | raise.rb:68:1:77:3 | exit m7 (normal) | -| raise.rb:68:1:77:3 | exit m7 (normal) | raise.rb:71:3:72:18 | elsif ... | -| raise.rb:68:1:77:3 | exit m7 (normal) | raise.rb:71:9:71:9 | x | -| raise.rb:68:1:77:3 | exit m7 (normal) | raise.rb:72:13:72:17 | x < 0 | -| raise.rb:68:1:77:3 | exit m7 (normal) | raise.rb:76:3:76:15 | self | -| raise.rb:70:5:70:17 | self | raise.rb:70:5:70:17 | self | -| raise.rb:71:3:72:18 | elsif ... | raise.rb:71:3:72:18 | elsif ... | -| raise.rb:71:9:71:9 | x | raise.rb:68:1:77:3 | enter m7 | -| raise.rb:71:9:71:9 | x | raise.rb:71:9:71:9 | x | -| raise.rb:72:13:72:17 | x < 0 | raise.rb:72:13:72:17 | x < 0 | -| raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:76:3:76:15 | [ensure: exception] self | -| raise.rb:76:3:76:15 | self | raise.rb:71:3:72:18 | elsif ... | -| raise.rb:76:3:76:15 | self | raise.rb:76:3:76:15 | self | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:79:1:92:3 | enter m8 | -| raise.rb:79:1:92:3 | exit m8 | raise.rb:79:1:92:3 | exit m8 | -| raise.rb:79:1:92:3 | exit m8 (normal) | raise.rb:79:1:92:3 | enter m8 | -| raise.rb:79:1:92:3 | exit m8 (normal) | raise.rb:79:1:92:3 | exit m8 (normal) | -| raise.rb:79:1:92:3 | exit m8 (normal) | raise.rb:84:5:85:20 | elsif ... | -| raise.rb:79:1:92:3 | exit m8 (normal) | raise.rb:84:11:84:11 | x | -| raise.rb:79:1:92:3 | exit m8 (normal) | raise.rb:85:15:85:19 | x < 0 | -| raise.rb:79:1:92:3 | exit m8 (normal) | raise.rb:89:5:89:17 | self | -| raise.rb:83:7:83:19 | self | raise.rb:83:7:83:19 | self | -| raise.rb:84:5:85:20 | elsif ... | raise.rb:84:5:85:20 | elsif ... | -| raise.rb:84:11:84:11 | x | raise.rb:79:1:92:3 | enter m8 | -| raise.rb:84:11:84:11 | x | raise.rb:84:11:84:11 | x | -| raise.rb:85:15:85:19 | x < 0 | raise.rb:85:15:85:19 | x < 0 | -| raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:89:5:89:17 | [ensure: exception] self | -| raise.rb:89:5:89:17 | self | raise.rb:84:5:85:20 | elsif ... | -| raise.rb:89:5:89:17 | self | raise.rb:89:5:89:17 | self | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:94:1:119:3 | enter m9 | -| raise.rb:94:1:119:3 | exit m9 | raise.rb:94:1:119:3 | exit m9 | -| raise.rb:94:1:119:3 | exit m9 (abnormal) | raise.rb:94:1:119:3 | exit m9 (abnormal) | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:94:1:119:3 | enter m9 | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:94:1:119:3 | exit m9 (normal) | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:97:8:97:8 | x | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:99:5:100:20 | elsif ... | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:99:11:99:11 | x | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:100:15:100:19 | x < 0 | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:104:5:104:23 | self | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:106:7:108:9 | [ensure: return] if ... | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:106:7:108:9 | if ... | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:106:10:106:11 | [ensure: return] b1 | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:106:10:106:11 | b1 | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:109:5:110:25 | [ensure: return] ensure ... | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:115:3:115:22 | self | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:116:3:118:5 | [ensure: return] if ... | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:116:3:118:5 | if ... | -| raise.rb:97:8:97:8 | x | raise.rb:94:1:119:3 | enter m9 | -| raise.rb:97:8:97:8 | x | raise.rb:97:8:97:8 | x | -| raise.rb:98:7:98:19 | self | raise.rb:98:7:98:19 | self | -| raise.rb:99:5:100:20 | elsif ... | raise.rb:99:5:100:20 | elsif ... | -| raise.rb:99:11:99:11 | x | raise.rb:94:1:119:3 | enter m9 | -| raise.rb:99:11:99:11 | x | raise.rb:97:8:97:8 | x | -| raise.rb:99:11:99:11 | x | raise.rb:99:11:99:11 | x | -| raise.rb:100:15:100:19 | x < 0 | raise.rb:100:15:100:19 | x < 0 | -| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:104:5:104:23 | [ensure: exception] self | -| raise.rb:104:5:104:23 | self | raise.rb:99:5:100:20 | elsif ... | -| raise.rb:104:5:104:23 | self | raise.rb:104:5:104:23 | self | -| raise.rb:106:7:108:9 | [ensure: exception] if ... | raise.rb:106:7:108:9 | [ensure: exception] if ... | -| raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:100:15:100:19 | x < 0 | -| raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:106:7:108:9 | [ensure: return] if ... | -| raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:106:10:106:11 | [ensure: return] b1 | -| raise.rb:106:7:108:9 | if ... | raise.rb:99:5:100:20 | elsif ... | -| raise.rb:106:7:108:9 | if ... | raise.rb:104:5:104:23 | self | -| raise.rb:106:7:108:9 | if ... | raise.rb:106:7:108:9 | if ... | -| raise.rb:106:7:108:9 | if ... | raise.rb:106:10:106:11 | b1 | -| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:106:10:106:11 | [ensure: exception] b1 | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:100:15:100:19 | x < 0 | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:106:10:106:11 | [ensure: return] b1 | -| raise.rb:106:10:106:11 | b1 | raise.rb:99:5:100:20 | elsif ... | -| raise.rb:106:10:106:11 | b1 | raise.rb:104:5:104:23 | self | -| raise.rb:106:10:106:11 | b1 | raise.rb:106:10:106:11 | b1 | -| raise.rb:107:9:107:26 | [ensure: exception] self | raise.rb:107:9:107:26 | [ensure: exception] self | -| raise.rb:107:9:107:26 | [ensure: return] self | raise.rb:107:9:107:26 | [ensure: return] self | -| raise.rb:107:9:107:26 | self | raise.rb:107:9:107:26 | self | -| raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | -| raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | -| raise.rb:109:5:110:25 | [ensure: exception] ensure ... | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | -| raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | -| raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:100:15:100:19 | x < 0 | -| raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:106:7:108:9 | [ensure: return] if ... | -| raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:106:10:106:11 | [ensure: return] b1 | -| raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:109:5:110:25 | [ensure: return] ensure ... | -| raise.rb:109:5:110:25 | ensure ... | raise.rb:99:5:100:20 | elsif ... | -| raise.rb:109:5:110:25 | ensure ... | raise.rb:104:5:104:23 | self | -| raise.rb:109:5:110:25 | ensure ... | raise.rb:106:7:108:9 | if ... | -| raise.rb:109:5:110:25 | ensure ... | raise.rb:106:10:106:11 | b1 | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:113:14:113:19 | After ... > ... [false] | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:113:14:113:19 | After ... > ... [true] | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:120:8:120:28 | Entry | cfg.rb:120:8:120:28 | Entry | +| cfg.rb:136:1:136:3 | After ... / ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:136:12:136:29 | Before call to puts | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:145:3:148:5 | Entry | cfg.rb:145:3:148:5 | Entry | +| cfg.rb:152:1:154:3 | Entry | cfg.rb:152:1:154:3 | Entry | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:172:8:172:14 | After ... == ... [false] | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:172:8:172:14 | After ... == ... [true] | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:174:18:174:23 | After ... == ... [false] | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:174:18:174:23 | After ... == ... [true] | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:176:7:176:12 | After ... > ... [false] | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:179:30:179:36 | After ... == ... [false] | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:182:7:182:12 | After ... < ... [true] | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:182:14:186:3 | do ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:182:14:186:3 | do ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:182:14:186:3 | do ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:184:6:184:11 | After ... == ... [false] | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:184:6:184:11 | After ... == ... [false] | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:184:6:184:11 | After ... == ... [false] | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:184:6:184:11 | After ... == ... [false] | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:184:6:184:11 | After ... == ... [true] | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:188:30:188:35 | After ... != ... [true] | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:190:1:192:3 | Entry | cfg.rb:190:1:192:3 | Entry | +| cfg.rb:194:11:194:23 | Entry | cfg.rb:194:11:194:23 | Entry | +| cfg.rb:196:1:198:3 | Entry | cfg.rb:196:1:198:3 | Entry | +| cfg.rb:200:9:200:32 | Entry | cfg.rb:200:9:200:32 | Entry | +| cfg.rb:202:9:202:35 | Entry | cfg.rb:202:9:202:35 | Entry | +| cfg.rb:205:4:205:5 | After call to == [false] | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:205:4:205:5 | After call to == [true] | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:205:15:205:23 | Entry | cfg.rb:205:15:205:23 | Entry | +| cfg.rb:207:1:211:3 | Entry | cfg.rb:207:1:211:3 | Entry | +| cfg.rb:208:15:210:5 | Entry | cfg.rb:208:15:210:5 | Entry | +| cfg.rb:213:14:216:3 | Entry | cfg.rb:213:14:216:3 | Entry | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:1:1:22:4 | Entry | +| constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [false] | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [false] | +| constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [true] | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [true] | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:1:1:22:4 | Entry | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [false] | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [true] | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | +| constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [false] | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [false] | +| constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [true] | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [true] | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:1:1:22:4 | Entry | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [false] | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [true] | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [false] | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [true] | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | +| constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [false] | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [false] | +| constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [true] | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [true] | +| constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | constant_compound_assign.rb:1:1:22:4 | Entry | +| constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [false] | +| constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [true] | +| constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | +| constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [false] | +| constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [true] | +| constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | +| constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [false] | +| constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [true] | +| constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | +| desugar.rb:1:1:3:3 | Entry | desugar.rb:1:1:3:3 | Entry | +| desugar.rb:1:1:38:17 | Entry | desugar.rb:1:1:38:17 | Entry | +| desugar.rb:5:1:7:3 | Entry | desugar.rb:5:1:7:3 | Entry | +| desugar.rb:9:1:11:3 | Entry | desugar.rb:9:1:11:3 | Entry | +| desugar.rb:13:1:15:3 | Entry | desugar.rb:13:1:15:3 | Entry | +| desugar.rb:17:1:19:3 | Entry | desugar.rb:17:1:19:3 | Entry | +| desugar.rb:21:1:23:3 | Entry | desugar.rb:21:1:23:3 | Entry | +| desugar.rb:25:1:27:3 | Entry | desugar.rb:25:1:27:3 | Entry | +| exit.rb:1:1:6:3 | Entry | exit.rb:1:1:6:3 | Entry | +| exit.rb:1:1:6:3 | Exit | exit.rb:1:1:6:3 | Exit | +| exit.rb:1:1:13:4 | Entry | exit.rb:1:1:13:4 | Entry | +| exit.rb:2:6:2:10 | After ... > ... [false] | exit.rb:1:1:6:3 | Entry | +| exit.rb:2:6:2:10 | After ... > ... [false] | exit.rb:2:6:2:10 | After ... > ... [false] | +| exit.rb:2:6:2:10 | After ... > ... [true] | exit.rb:2:6:2:10 | After ... > ... [true] | +| exit.rb:8:1:13:3 | Entry | exit.rb:8:1:13:3 | Entry | +| exit.rb:8:1:13:3 | Exit | exit.rb:8:1:13:3 | Exit | +| exit.rb:9:6:9:10 | After ... > ... [false] | exit.rb:8:1:13:3 | Entry | +| exit.rb:9:6:9:10 | After ... > ... [false] | exit.rb:9:6:9:10 | After ... > ... [false] | +| exit.rb:9:6:9:10 | After ... > ... [true] | exit.rb:9:6:9:10 | After ... > ... [true] | +| heredoc.rb:1:1:7:3 | Entry | heredoc.rb:1:1:7:3 | Entry | +| heredoc.rb:1:1:7:4 | Entry | heredoc.rb:1:1:7:4 | Entry | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:1:1:9:3 | Entry | +| ifs.rb:1:1:58:4 | Entry | ifs.rb:1:1:58:4 | Entry | +| ifs.rb:2:3:8:5 | After if ... | ifs.rb:1:1:9:3 | Entry | +| ifs.rb:2:3:8:5 | After if ... | ifs.rb:2:3:8:5 | After if ... | +| ifs.rb:2:3:8:5 | After if ... | ifs.rb:2:6:2:10 | After ... > ... [false] | +| ifs.rb:2:3:8:5 | After if ... | ifs.rb:2:6:2:10 | After ... > ... [true] | +| ifs.rb:2:3:8:5 | After if ... | ifs.rb:4:3:7:35 | After elsif ... | +| ifs.rb:2:3:8:5 | After if ... | ifs.rb:4:9:4:14 | After ... <= ... [false] | +| ifs.rb:2:3:8:5 | After if ... | ifs.rb:4:9:4:14 | After ... <= ... [true] | +| ifs.rb:2:3:8:5 | After if ... | ifs.rb:4:9:4:24 | After ... and ... [false] | +| ifs.rb:2:3:8:5 | After if ... | ifs.rb:4:9:4:38 | After ... and ... [false] | +| ifs.rb:2:3:8:5 | After if ... | ifs.rb:4:20:4:24 | After ... > ... [false] | +| ifs.rb:2:3:8:5 | After if ... | ifs.rb:4:20:4:24 | After ... > ... [true] | +| ifs.rb:2:3:8:5 | After if ... | ifs.rb:4:32:4:37 | After ... == ... [false] | +| ifs.rb:2:3:8:5 | After if ... | ifs.rb:4:32:4:37 | After ... == ... [true] | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:2:6:2:10 | After ... > ... [false] | +| ifs.rb:2:6:2:10 | After ... > ... [true] | ifs.rb:2:6:2:10 | After ... > ... [true] | +| ifs.rb:4:3:7:35 | After elsif ... | ifs.rb:2:6:2:10 | After ... > ... [false] | +| ifs.rb:4:3:7:35 | After elsif ... | ifs.rb:4:3:7:35 | After elsif ... | +| ifs.rb:4:3:7:35 | After elsif ... | ifs.rb:4:9:4:14 | After ... <= ... [false] | +| ifs.rb:4:3:7:35 | After elsif ... | ifs.rb:4:9:4:14 | After ... <= ... [true] | +| ifs.rb:4:3:7:35 | After elsif ... | ifs.rb:4:9:4:24 | After ... and ... [false] | +| ifs.rb:4:3:7:35 | After elsif ... | ifs.rb:4:9:4:38 | After ... and ... [false] | +| ifs.rb:4:3:7:35 | After elsif ... | ifs.rb:4:20:4:24 | After ... > ... [false] | +| ifs.rb:4:3:7:35 | After elsif ... | ifs.rb:4:20:4:24 | After ... > ... [true] | +| ifs.rb:4:3:7:35 | After elsif ... | ifs.rb:4:32:4:37 | After ... == ... [false] | +| ifs.rb:4:3:7:35 | After elsif ... | ifs.rb:4:32:4:37 | After ... == ... [true] | +| ifs.rb:4:9:4:14 | After ... <= ... [false] | ifs.rb:4:9:4:14 | After ... <= ... [false] | +| ifs.rb:4:9:4:14 | After ... <= ... [true] | ifs.rb:4:9:4:14 | After ... <= ... [true] | +| ifs.rb:4:9:4:24 | After ... and ... [false] | ifs.rb:4:9:4:14 | After ... <= ... [false] | +| ifs.rb:4:9:4:24 | After ... and ... [false] | ifs.rb:4:9:4:24 | After ... and ... [false] | +| ifs.rb:4:9:4:24 | After ... and ... [false] | ifs.rb:4:20:4:24 | After ... > ... [false] | +| ifs.rb:4:9:4:38 | After ... and ... [false] | ifs.rb:4:9:4:14 | After ... <= ... [false] | +| ifs.rb:4:9:4:38 | After ... and ... [false] | ifs.rb:4:9:4:24 | After ... and ... [false] | +| ifs.rb:4:9:4:38 | After ... and ... [false] | ifs.rb:4:9:4:38 | After ... and ... [false] | +| ifs.rb:4:9:4:38 | After ... and ... [false] | ifs.rb:4:20:4:24 | After ... > ... [false] | +| ifs.rb:4:9:4:38 | After ... and ... [false] | ifs.rb:4:32:4:37 | After ... == ... [true] | +| ifs.rb:4:20:4:24 | After ... > ... [false] | ifs.rb:4:20:4:24 | After ... > ... [false] | +| ifs.rb:4:20:4:24 | After ... > ... [true] | ifs.rb:4:20:4:24 | After ... > ... [true] | +| ifs.rb:4:32:4:37 | After ... == ... [false] | ifs.rb:4:32:4:37 | After ... == ... [false] | +| ifs.rb:4:32:4:37 | After ... == ... [true] | ifs.rb:4:32:4:37 | After ... == ... [true] | +| ifs.rb:11:1:16:3 | Entry | ifs.rb:11:1:16:3 | Entry | +| ifs.rb:11:1:16:3 | Normal Exit | ifs.rb:11:1:16:3 | Entry | +| ifs.rb:11:1:16:3 | Normal Exit | ifs.rb:11:1:16:3 | Normal Exit | +| ifs.rb:11:1:16:3 | Normal Exit | ifs.rb:12:6:12:6 | After b [false] | +| ifs.rb:11:1:16:3 | Normal Exit | ifs.rb:12:6:12:6 | After b [true] | +| ifs.rb:12:6:12:6 | After b [false] | ifs.rb:12:6:12:6 | After b [false] | +| ifs.rb:12:6:12:6 | After b [true] | ifs.rb:12:6:12:6 | After b [true] | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:18:1:26:3 | Entry | +| ifs.rb:19:3:24:5 | After if ... | ifs.rb:18:1:26:3 | Entry | +| ifs.rb:19:3:24:5 | After if ... | ifs.rb:19:3:24:5 | After if ... | +| ifs.rb:19:3:24:5 | After if ... | ifs.rb:19:6:19:10 | After ... < ... [false] | +| ifs.rb:19:3:24:5 | After if ... | ifs.rb:19:6:19:10 | After ... < ... [true] | +| ifs.rb:19:3:24:5 | After if ... | ifs.rb:21:5:23:7 | After if ... | +| ifs.rb:19:3:24:5 | After if ... | ifs.rb:21:8:21:13 | After ... > ... [false] | +| ifs.rb:19:3:24:5 | After if ... | ifs.rb:21:8:21:13 | After ... > ... [true] | +| ifs.rb:19:6:19:10 | After ... < ... [false] | ifs.rb:19:6:19:10 | After ... < ... [false] | +| ifs.rb:19:6:19:10 | After ... < ... [true] | ifs.rb:19:6:19:10 | After ... < ... [true] | +| ifs.rb:21:5:23:7 | After if ... | ifs.rb:19:6:19:10 | After ... < ... [true] | +| ifs.rb:21:5:23:7 | After if ... | ifs.rb:21:5:23:7 | After if ... | +| ifs.rb:21:5:23:7 | After if ... | ifs.rb:21:8:21:13 | After ... > ... [false] | +| ifs.rb:21:5:23:7 | After if ... | ifs.rb:21:8:21:13 | After ... > ... [true] | +| ifs.rb:21:8:21:13 | After ... > ... [false] | ifs.rb:21:8:21:13 | After ... > ... [false] | +| ifs.rb:21:8:21:13 | After ... > ... [true] | ifs.rb:21:8:21:13 | After ... > ... [true] | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:28:1:30:3 | Entry | +| ifs.rb:29:10:29:51 | After ... ? ... : ... | ifs.rb:28:1:30:3 | Entry | +| ifs.rb:29:10:29:51 | After ... ? ... : ... | ifs.rb:29:10:29:51 | After ... ? ... : ... | +| ifs.rb:29:10:29:51 | After ... ? ... : ... | ifs.rb:29:11:29:12 | After b1 [false] | +| ifs.rb:29:10:29:51 | After ... ? ... : ... | ifs.rb:29:11:29:12 | After b1 [true] | +| ifs.rb:29:10:29:51 | After ... ? ... : ... | ifs.rb:29:11:29:22 | After ... ? ... : ... [false] | +| ifs.rb:29:10:29:51 | After ... ? ... : ... | ifs.rb:29:11:29:22 | After ... ? ... : ... [true] | +| ifs.rb:29:10:29:51 | After ... ? ... : ... | ifs.rb:29:16:29:17 | After b2 [false] | +| ifs.rb:29:10:29:51 | After ... ? ... : ... | ifs.rb:29:16:29:17 | After b2 [true] | +| ifs.rb:29:10:29:51 | After ... ? ... : ... | ifs.rb:29:21:29:22 | After b3 [false] | +| ifs.rb:29:10:29:51 | After ... ? ... : ... | ifs.rb:29:21:29:22 | After b3 [true] | +| ifs.rb:29:11:29:12 | After b1 [false] | ifs.rb:29:11:29:12 | After b1 [false] | +| ifs.rb:29:11:29:12 | After b1 [true] | ifs.rb:29:11:29:12 | After b1 [true] | +| ifs.rb:29:11:29:22 | After ... ? ... : ... [false] | ifs.rb:29:11:29:22 | After ... ? ... : ... [false] | +| ifs.rb:29:11:29:22 | After ... ? ... : ... [false] | ifs.rb:29:16:29:17 | After b2 [false] | +| ifs.rb:29:11:29:22 | After ... ? ... : ... [false] | ifs.rb:29:21:29:22 | After b3 [false] | +| ifs.rb:29:11:29:22 | After ... ? ... : ... [true] | ifs.rb:29:11:29:22 | After ... ? ... : ... [true] | +| ifs.rb:29:11:29:22 | After ... ? ... : ... [true] | ifs.rb:29:16:29:17 | After b2 [true] | +| ifs.rb:29:11:29:22 | After ... ? ... : ... [true] | ifs.rb:29:21:29:22 | After b3 [true] | +| ifs.rb:29:16:29:17 | After b2 [false] | ifs.rb:29:16:29:17 | After b2 [false] | +| ifs.rb:29:16:29:17 | After b2 [true] | ifs.rb:29:16:29:17 | After b2 [true] | +| ifs.rb:29:21:29:22 | After b3 [false] | ifs.rb:29:21:29:22 | After b3 [false] | +| ifs.rb:29:21:29:22 | After b3 [true] | ifs.rb:29:21:29:22 | After b3 [true] | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:32:1:34:3 | Entry | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:32:1:34:3 | Entry | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:3:33:100 | After if ... | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:7:33:48 | After if ... [false] | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:7:33:48 | After if ... [true] | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:10:33:11 | After b1 [false] | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:10:33:11 | After b1 [true] | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:18:33:19 | After b2 [false] | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:18:33:19 | After b2 [true] | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:21:33:44 | After elsif ... [false] | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:21:33:44 | After elsif ... [true] | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:27:33:28 | After b3 [false] | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:27:33:28 | After b3 [true] | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:35:33:36 | After b4 [false] | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:35:33:36 | After b4 [true] | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:43:33:44 | After b5 [false] | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:43:33:44 | After b5 [true] | +| ifs.rb:33:7:33:48 | After if ... [false] | ifs.rb:33:7:33:48 | After if ... [false] | +| ifs.rb:33:7:33:48 | After if ... [false] | ifs.rb:33:18:33:19 | After b2 [false] | +| ifs.rb:33:7:33:48 | After if ... [false] | ifs.rb:33:21:33:44 | After elsif ... [false] | +| ifs.rb:33:7:33:48 | After if ... [false] | ifs.rb:33:35:33:36 | After b4 [false] | +| ifs.rb:33:7:33:48 | After if ... [false] | ifs.rb:33:43:33:44 | After b5 [false] | +| ifs.rb:33:7:33:48 | After if ... [true] | ifs.rb:33:7:33:48 | After if ... [true] | +| ifs.rb:33:7:33:48 | After if ... [true] | ifs.rb:33:18:33:19 | After b2 [true] | +| ifs.rb:33:7:33:48 | After if ... [true] | ifs.rb:33:21:33:44 | After elsif ... [true] | +| ifs.rb:33:7:33:48 | After if ... [true] | ifs.rb:33:35:33:36 | After b4 [true] | +| ifs.rb:33:7:33:48 | After if ... [true] | ifs.rb:33:43:33:44 | After b5 [true] | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:10:33:11 | After b1 [false] | +| ifs.rb:33:10:33:11 | After b1 [true] | ifs.rb:33:10:33:11 | After b1 [true] | +| ifs.rb:33:18:33:19 | After b2 [false] | ifs.rb:33:18:33:19 | After b2 [false] | +| ifs.rb:33:18:33:19 | After b2 [true] | ifs.rb:33:18:33:19 | After b2 [true] | +| ifs.rb:33:21:33:44 | After elsif ... [false] | ifs.rb:33:21:33:44 | After elsif ... [false] | +| ifs.rb:33:21:33:44 | After elsif ... [false] | ifs.rb:33:35:33:36 | After b4 [false] | +| ifs.rb:33:21:33:44 | After elsif ... [false] | ifs.rb:33:43:33:44 | After b5 [false] | +| ifs.rb:33:21:33:44 | After elsif ... [true] | ifs.rb:33:21:33:44 | After elsif ... [true] | +| ifs.rb:33:21:33:44 | After elsif ... [true] | ifs.rb:33:35:33:36 | After b4 [true] | +| ifs.rb:33:21:33:44 | After elsif ... [true] | ifs.rb:33:43:33:44 | After b5 [true] | +| ifs.rb:33:27:33:28 | After b3 [false] | ifs.rb:33:27:33:28 | After b3 [false] | +| ifs.rb:33:27:33:28 | After b3 [true] | ifs.rb:33:27:33:28 | After b3 [true] | +| ifs.rb:33:35:33:36 | After b4 [false] | ifs.rb:33:35:33:36 | After b4 [false] | +| ifs.rb:33:35:33:36 | After b4 [true] | ifs.rb:33:35:33:36 | After b4 [true] | +| ifs.rb:33:43:33:44 | After b5 [false] | ifs.rb:33:43:33:44 | After b5 [false] | +| ifs.rb:33:43:33:44 | After b5 [true] | ifs.rb:33:43:33:44 | After b5 [true] | +| ifs.rb:36:1:38:3 | Entry | ifs.rb:36:1:38:3 | Entry | +| ifs.rb:36:1:38:17 | After ... unless ... | ifs.rb:1:1:58:4 | Entry | +| ifs.rb:36:1:38:17 | After ... unless ... | ifs.rb:36:1:38:17 | After ... unless ... | +| ifs.rb:36:1:38:17 | After ... unless ... | ifs.rb:38:12:38:17 | After ... == ... [false] | +| ifs.rb:36:1:38:17 | After ... unless ... | ifs.rb:38:12:38:17 | After ... == ... [true] | +| ifs.rb:38:12:38:17 | After ... == ... [false] | ifs.rb:38:12:38:17 | After ... == ... [false] | +| ifs.rb:38:12:38:17 | After ... == ... [true] | ifs.rb:38:12:38:17 | After ... == ... [true] | +| ifs.rb:40:1:44:3 | Entry | ifs.rb:40:1:44:3 | Entry | +| ifs.rb:46:1:52:3 | Entry | ifs.rb:46:1:52:3 | Entry | +| ifs.rb:47:3:50:5 | After if ... | ifs.rb:46:1:52:3 | Entry | +| ifs.rb:47:3:50:5 | After if ... | ifs.rb:47:3:50:5 | After if ... | +| ifs.rb:47:3:50:5 | After if ... | ifs.rb:47:6:47:6 | After b [false] | +| ifs.rb:47:3:50:5 | After if ... | ifs.rb:47:6:47:6 | After b [true] | +| ifs.rb:47:6:47:6 | After b [false] | ifs.rb:47:6:47:6 | After b [false] | +| ifs.rb:47:6:47:6 | After b [true] | ifs.rb:47:6:47:6 | After b [true] | +| ifs.rb:54:1:58:3 | Entry | ifs.rb:54:1:58:3 | Entry | +| ifs.rb:55:3:57:5 | After if ... | ifs.rb:54:1:58:3 | Entry | +| ifs.rb:55:3:57:5 | After if ... | ifs.rb:55:3:57:5 | After if ... | +| ifs.rb:55:3:57:5 | After if ... | ifs.rb:55:7:55:8 | After b1 [false] | +| ifs.rb:55:3:57:5 | After if ... | ifs.rb:55:7:55:8 | After b1 [true] | +| ifs.rb:55:3:57:5 | After if ... | ifs.rb:55:7:55:14 | After ... \|\| ... [true] | +| ifs.rb:55:3:57:5 | After if ... | ifs.rb:55:13:55:14 | After b2 [false] | +| ifs.rb:55:3:57:5 | After if ... | ifs.rb:55:13:55:14 | After b2 [true] | +| ifs.rb:55:7:55:8 | After b1 [false] | ifs.rb:55:7:55:8 | After b1 [false] | +| ifs.rb:55:7:55:8 | After b1 [true] | ifs.rb:55:7:55:8 | After b1 [true] | +| ifs.rb:55:7:55:14 | After ... \|\| ... [true] | ifs.rb:55:7:55:8 | After b1 [true] | +| ifs.rb:55:7:55:14 | After ... \|\| ... [true] | ifs.rb:55:7:55:14 | After ... \|\| ... [true] | +| ifs.rb:55:7:55:14 | After ... \|\| ... [true] | ifs.rb:55:13:55:14 | After b2 [true] | +| ifs.rb:55:13:55:14 | After b2 [false] | ifs.rb:55:13:55:14 | After b2 [false] | +| ifs.rb:55:13:55:14 | After b2 [true] | ifs.rb:55:13:55:14 | After b2 [true] | +| loops.rb:1:1:6:3 | Entry | loops.rb:1:1:6:3 | Entry | +| loops.rb:1:1:33:4 | Entry | loops.rb:1:1:33:4 | Entry | +| loops.rb:2:3:5:5 | [LoopHeader] while ... | loops.rb:1:1:6:3 | Entry | +| loops.rb:2:3:5:5 | [LoopHeader] while ... | loops.rb:2:3:5:5 | [LoopHeader] while ... | +| loops.rb:2:3:5:5 | [LoopHeader] while ... | loops.rb:2:9:2:14 | After ... >= ... [true] | +| loops.rb:2:9:2:14 | After ... >= ... [false] | loops.rb:1:1:6:3 | Entry | +| loops.rb:2:9:2:14 | After ... >= ... [false] | loops.rb:2:3:5:5 | [LoopHeader] while ... | +| loops.rb:2:9:2:14 | After ... >= ... [false] | loops.rb:2:9:2:14 | After ... >= ... [false] | +| loops.rb:2:9:2:14 | After ... >= ... [false] | loops.rb:2:9:2:14 | After ... >= ... [true] | +| loops.rb:2:9:2:14 | After ... >= ... [true] | loops.rb:2:9:2:14 | After ... >= ... [true] | +| loops.rb:8:1:22:3 | Entry | loops.rb:8:1:22:3 | Entry | +| loops.rb:9:3:20:5 | After while ... | loops.rb:8:1:22:3 | Entry | +| loops.rb:9:3:20:5 | After while ... | loops.rb:9:3:20:5 | After while ... | +| loops.rb:9:3:20:5 | After while ... | loops.rb:9:3:20:5 | [LoopHeader] while ... | +| loops.rb:9:3:20:5 | After while ... | loops.rb:9:9:9:14 | After ... >= ... [false] | +| loops.rb:9:3:20:5 | After while ... | loops.rb:9:9:9:14 | After ... >= ... [true] | +| loops.rb:9:3:20:5 | After while ... | loops.rb:9:15:20:5 | do ... | +| loops.rb:9:3:20:5 | After while ... | loops.rb:12:8:12:14 | After ... > ... [false] | +| loops.rb:9:3:20:5 | After while ... | loops.rb:12:8:12:14 | After ... > ... [true] | +| loops.rb:9:3:20:5 | After while ... | loops.rb:14:11:14:16 | After ... > ... [false] | +| loops.rb:9:3:20:5 | After while ... | loops.rb:14:11:14:16 | After ... > ... [true] | +| loops.rb:9:3:20:5 | After while ... | loops.rb:16:11:16:16 | After ... > ... [false] | +| loops.rb:9:3:20:5 | After while ... | loops.rb:16:11:16:16 | After ... > ... [true] | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:8:1:22:3 | Entry | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:9:3:20:5 | [LoopHeader] while ... | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:14:11:14:16 | After ... > ... [true] | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:16:11:16:16 | After ... > ... [false] | +| loops.rb:9:9:9:14 | After ... >= ... [false] | loops.rb:9:9:9:14 | After ... >= ... [false] | +| loops.rb:9:9:9:14 | After ... >= ... [true] | loops.rb:9:9:9:14 | After ... >= ... [true] | +| loops.rb:9:15:20:5 | do ... | loops.rb:9:9:9:14 | After ... >= ... [true] | +| loops.rb:9:15:20:5 | do ... | loops.rb:9:15:20:5 | do ... | +| loops.rb:9:15:20:5 | do ... | loops.rb:16:11:16:16 | After ... > ... [true] | +| loops.rb:12:8:12:14 | After ... > ... [false] | loops.rb:12:8:12:14 | After ... > ... [false] | +| loops.rb:12:8:12:14 | After ... > ... [true] | loops.rb:12:8:12:14 | After ... > ... [true] | +| loops.rb:14:11:14:16 | After ... > ... [false] | loops.rb:14:11:14:16 | After ... > ... [false] | +| loops.rb:14:11:14:16 | After ... > ... [true] | loops.rb:14:11:14:16 | After ... > ... [true] | +| loops.rb:16:11:16:16 | After ... > ... [false] | loops.rb:16:11:16:16 | After ... > ... [false] | +| loops.rb:16:11:16:16 | After ... > ... [true] | loops.rb:16:11:16:16 | After ... > ... [true] | +| loops.rb:24:1:28:3 | Entry | loops.rb:24:1:28:3 | Entry | +| loops.rb:25:16:27:5 | Entry | loops.rb:25:16:27:5 | Entry | +| loops.rb:30:1:33:3 | Entry | loops.rb:30:1:33:3 | Entry | +| loops.rb:31:3:32:5 | [LoopHeader] while ... | loops.rb:30:1:33:3 | Entry | +| loops.rb:31:3:32:5 | [LoopHeader] while ... | loops.rb:31:3:32:5 | [LoopHeader] while ... | +| loops.rb:31:3:32:5 | [LoopHeader] while ... | loops.rb:31:9:31:13 | After ... < ... [true] | +| loops.rb:31:9:31:13 | After ... < ... [false] | loops.rb:30:1:33:3 | Entry | +| loops.rb:31:9:31:13 | After ... < ... [false] | loops.rb:31:3:32:5 | [LoopHeader] while ... | +| loops.rb:31:9:31:13 | After ... < ... [false] | loops.rb:31:9:31:13 | After ... < ... [false] | +| loops.rb:31:9:31:13 | After ... < ... [false] | loops.rb:31:9:31:13 | After ... < ... [true] | +| loops.rb:31:9:31:13 | After ... < ... [true] | loops.rb:31:9:31:13 | After ... < ... [true] | +| raise.rb:1:1:182:4 | Entry | raise.rb:1:1:182:4 | Entry | +| raise.rb:7:1:12:3 | Entry | raise.rb:7:1:12:3 | Entry | +| raise.rb:7:1:12:3 | Exit | raise.rb:7:1:12:3 | Exit | +| raise.rb:8:6:8:10 | After ... > ... [false] | raise.rb:7:1:12:3 | Entry | +| raise.rb:8:6:8:10 | After ... > ... [false] | raise.rb:8:6:8:10 | After ... > ... [false] | +| raise.rb:8:6:8:10 | After ... > ... [true] | raise.rb:8:6:8:10 | After ... > ... [true] | +| raise.rb:14:1:23:3 | Entry | raise.rb:14:1:23:3 | Entry | +| raise.rb:14:1:23:3 | Exit | raise.rb:14:1:23:3 | Exit | +| raise.rb:15:3:21:5 | After begin ... | raise.rb:14:1:23:3 | Entry | +| raise.rb:15:3:21:5 | After begin ... | raise.rb:15:3:21:5 | After begin ... | +| raise.rb:15:3:21:5 | After begin ... | raise.rb:16:8:16:8 | After b [false] | +| raise.rb:15:3:21:5 | After begin ... | raise.rb:16:8:16:8 | After b [true] | +| raise.rb:15:3:21:5 | After begin ... | raise.rb:19:10:19:19 | After ExceptionA [match] | +| raise.rb:16:8:16:8 | After b [false] | raise.rb:16:8:16:8 | After b [false] | +| raise.rb:16:8:16:8 | After b [true] | raise.rb:16:8:16:8 | After b [true] | +| raise.rb:19:10:19:19 | After ExceptionA [match] | raise.rb:16:8:16:8 | After b [true] | +| raise.rb:19:10:19:19 | After ExceptionA [match] | raise.rb:19:10:19:19 | After ExceptionA [match] | +| raise.rb:19:10:19:19 | After ExceptionA [no-match] | raise.rb:19:10:19:19 | After ExceptionA [no-match] | +| raise.rb:25:1:34:3 | Entry | raise.rb:25:1:34:3 | Entry | +| raise.rb:26:3:32:5 | After begin ... | raise.rb:25:1:34:3 | Entry | +| raise.rb:26:3:32:5 | After begin ... | raise.rb:26:3:32:5 | After begin ... | +| raise.rb:26:3:32:5 | After begin ... | raise.rb:27:8:27:8 | After b [false] | +| raise.rb:26:3:32:5 | After begin ... | raise.rb:27:8:27:8 | After b [true] | +| raise.rb:27:8:27:8 | After b [false] | raise.rb:27:8:27:8 | After b [false] | +| raise.rb:27:8:27:8 | After b [true] | raise.rb:27:8:27:8 | After b [true] | +| raise.rb:36:1:45:3 | Entry | raise.rb:36:1:45:3 | Entry | +| raise.rb:37:3:43:5 | After begin ... | raise.rb:36:1:45:3 | Entry | +| raise.rb:37:3:43:5 | After begin ... | raise.rb:37:3:43:5 | After begin ... | +| raise.rb:37:3:43:5 | After begin ... | raise.rb:38:8:38:8 | After b [false] | +| raise.rb:37:3:43:5 | After begin ... | raise.rb:38:8:38:8 | After b [true] | +| raise.rb:38:8:38:8 | After b [false] | raise.rb:38:8:38:8 | After b [false] | +| raise.rb:38:8:38:8 | After b [true] | raise.rb:38:8:38:8 | After b [true] | +| raise.rb:47:1:55:3 | Entry | raise.rb:47:1:55:3 | Entry | +| raise.rb:48:3:53:5 | After begin ... | raise.rb:47:1:55:3 | Entry | +| raise.rb:48:3:53:5 | After begin ... | raise.rb:48:3:53:5 | After begin ... | +| raise.rb:48:3:53:5 | After begin ... | raise.rb:49:8:49:8 | After b [false] | +| raise.rb:48:3:53:5 | After begin ... | raise.rb:49:8:49:8 | After b [true] | +| raise.rb:49:8:49:8 | After b [false] | raise.rb:49:8:49:8 | After b [false] | +| raise.rb:49:8:49:8 | After b [true] | raise.rb:49:8:49:8 | After b [true] | +| raise.rb:57:1:66:3 | Entry | raise.rb:57:1:66:3 | Entry | +| raise.rb:57:1:66:3 | Exit | raise.rb:57:1:66:3 | Exit | +| raise.rb:58:3:64:5 | After begin ... | raise.rb:57:1:66:3 | Entry | +| raise.rb:58:3:64:5 | After begin ... | raise.rb:58:3:64:5 | After begin ... | +| raise.rb:58:3:64:5 | After begin ... | raise.rb:59:8:59:8 | After b [false] | +| raise.rb:58:3:64:5 | After begin ... | raise.rb:59:8:59:8 | After b [true] | +| raise.rb:58:3:64:5 | After begin ... | raise.rb:62:10:62:31 | After ..., ... [match] | +| raise.rb:59:8:59:8 | After b [false] | raise.rb:59:8:59:8 | After b [false] | +| raise.rb:59:8:59:8 | After b [true] | raise.rb:59:8:59:8 | After b [true] | +| raise.rb:62:10:62:31 | After ..., ... [match] | raise.rb:59:8:59:8 | After b [true] | +| raise.rb:62:10:62:31 | After ..., ... [match] | raise.rb:62:10:62:31 | After ..., ... [match] | +| raise.rb:62:10:62:31 | After ..., ... [no-match] | raise.rb:62:10:62:31 | After ..., ... [no-match] | +| raise.rb:68:1:77:3 | Entry | raise.rb:68:1:77:3 | Entry | +| raise.rb:68:1:77:3 | Exceptional Exit | raise.rb:68:1:77:3 | Exceptional Exit | +| raise.rb:68:1:77:3 | Exit | raise.rb:68:1:77:3 | Exit | +| raise.rb:68:1:77:3 | Normal Exit | raise.rb:68:1:77:3 | Entry | +| raise.rb:68:1:77:3 | Normal Exit | raise.rb:68:1:77:3 | Normal Exit | +| raise.rb:68:1:77:3 | Normal Exit | raise.rb:69:3:76:15 | After ... | +| raise.rb:68:1:77:3 | Normal Exit | raise.rb:69:6:69:10 | After ... > ... [false] | +| raise.rb:68:1:77:3 | Normal Exit | raise.rb:69:6:69:10 | After ... > ... [true] | +| raise.rb:68:1:77:3 | Normal Exit | raise.rb:71:9:71:13 | After ... < ... [false] | +| raise.rb:68:1:77:3 | Normal Exit | raise.rb:71:9:71:13 | After ... < ... [true] | +| raise.rb:68:1:77:3 | Normal Exit | raise.rb:74:3:74:20 | After call to puts | +| raise.rb:68:1:77:3 | Normal Exit | raise.rb:75:1:76:15 | ensure ... | +| raise.rb:69:3:76:15 | After ... | raise.rb:69:3:76:15 | After ... | +| raise.rb:69:6:69:10 | After ... > ... [false] | raise.rb:69:6:69:10 | After ... > ... [false] | +| raise.rb:69:6:69:10 | After ... > ... [true] | raise.rb:69:6:69:10 | After ... > ... [true] | +| raise.rb:71:9:71:13 | After ... < ... [false] | raise.rb:71:9:71:13 | After ... < ... [false] | +| raise.rb:71:9:71:13 | After ... < ... [true] | raise.rb:71:9:71:13 | After ... < ... [true] | +| raise.rb:74:3:74:20 | After call to puts | raise.rb:74:3:74:20 | After call to puts | +| raise.rb:75:1:76:15 | ensure ... | raise.rb:68:1:77:3 | Entry | +| raise.rb:75:1:76:15 | ensure ... | raise.rb:69:6:69:10 | After ... > ... [false] | +| raise.rb:75:1:76:15 | ensure ... | raise.rb:69:6:69:10 | After ... > ... [true] | +| raise.rb:75:1:76:15 | ensure ... | raise.rb:71:9:71:13 | After ... < ... [false] | +| raise.rb:75:1:76:15 | ensure ... | raise.rb:71:9:71:13 | After ... < ... [true] | +| raise.rb:75:1:76:15 | ensure ... | raise.rb:74:3:74:20 | After call to puts | +| raise.rb:75:1:76:15 | ensure ... | raise.rb:75:1:76:15 | ensure ... | +| raise.rb:79:1:92:3 | Entry | raise.rb:79:1:92:3 | Entry | +| raise.rb:79:1:92:3 | Exceptional Exit | raise.rb:79:1:92:3 | Exceptional Exit | +| raise.rb:79:1:92:3 | Exit | raise.rb:79:1:92:3 | Exit | +| raise.rb:79:1:92:3 | Normal Exit | raise.rb:79:1:92:3 | Entry | +| raise.rb:79:1:92:3 | Normal Exit | raise.rb:79:1:92:3 | Normal Exit | +| raise.rb:79:1:92:3 | Normal Exit | raise.rb:81:3:90:5 | After begin ... | +| raise.rb:79:1:92:3 | Normal Exit | raise.rb:82:8:82:12 | After ... > ... [false] | +| raise.rb:79:1:92:3 | Normal Exit | raise.rb:82:8:82:12 | After ... > ... [true] | +| raise.rb:79:1:92:3 | Normal Exit | raise.rb:84:11:84:15 | After ... < ... [false] | +| raise.rb:79:1:92:3 | Normal Exit | raise.rb:84:11:84:15 | After ... < ... [true] | +| raise.rb:79:1:92:3 | Normal Exit | raise.rb:87:5:87:22 | After call to puts | +| raise.rb:79:1:92:3 | Normal Exit | raise.rb:88:3:89:17 | ensure ... | +| raise.rb:81:3:90:5 | After begin ... | raise.rb:81:3:90:5 | After begin ... | +| raise.rb:82:8:82:12 | After ... > ... [false] | raise.rb:82:8:82:12 | After ... > ... [false] | +| raise.rb:82:8:82:12 | After ... > ... [true] | raise.rb:82:8:82:12 | After ... > ... [true] | +| raise.rb:84:11:84:15 | After ... < ... [false] | raise.rb:84:11:84:15 | After ... < ... [false] | +| raise.rb:84:11:84:15 | After ... < ... [true] | raise.rb:84:11:84:15 | After ... < ... [true] | +| raise.rb:87:5:87:22 | After call to puts | raise.rb:87:5:87:22 | After call to puts | +| raise.rb:88:3:89:17 | ensure ... | raise.rb:79:1:92:3 | Entry | +| raise.rb:88:3:89:17 | ensure ... | raise.rb:82:8:82:12 | After ... > ... [false] | +| raise.rb:88:3:89:17 | ensure ... | raise.rb:82:8:82:12 | After ... > ... [true] | +| raise.rb:88:3:89:17 | ensure ... | raise.rb:84:11:84:15 | After ... < ... [false] | +| raise.rb:88:3:89:17 | ensure ... | raise.rb:84:11:84:15 | After ... < ... [true] | +| raise.rb:88:3:89:17 | ensure ... | raise.rb:87:5:87:22 | After call to puts | +| raise.rb:88:3:89:17 | ensure ... | raise.rb:88:3:89:17 | ensure ... | +| raise.rb:94:1:119:3 | Entry | raise.rb:94:1:119:3 | Entry | +| raise.rb:94:1:119:3 | Exceptional Exit | raise.rb:94:1:119:3 | Exceptional Exit | +| raise.rb:94:1:119:3 | Exit | raise.rb:94:1:119:3 | Exit | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:94:1:119:3 | Entry | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:94:1:119:3 | Normal Exit | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:95:3:95:17 | After call to puts | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:95:3:118:5 | After ... | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:96:3:112:5 | After begin ... | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:97:8:97:12 | After ... > ... [false] | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:97:8:97:12 | After ... > ... [true] | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:99:11:99:15 | After ... < ... [false] | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:99:11:99:15 | After ... < ... [true] | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:102:5:102:22 | After call to puts | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:103:3:111:7 | ensure ... | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:104:5:104:23 | After call to puts | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:105:5:111:7 | After begin ... | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:106:10:106:11 | After b1 [false] | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:106:10:106:11 | After b1 [true] | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:109:5:110:25 | ensure ... | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:110:7:110:25 | After call to puts | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:113:3:113:15 | After call to puts | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:114:1:118:5 | ensure ... | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:116:6:116:7 | After b2 [false] | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:95:3:95:17 | After call to puts | +| raise.rb:95:3:118:5 | After ... | raise.rb:95:3:118:5 | After ... | +| raise.rb:96:3:112:5 | After begin ... | raise.rb:96:3:112:5 | After begin ... | +| raise.rb:97:8:97:12 | After ... > ... [false] | raise.rb:97:8:97:12 | After ... > ... [false] | +| raise.rb:97:8:97:12 | After ... > ... [true] | raise.rb:97:8:97:12 | After ... > ... [true] | +| raise.rb:99:11:99:15 | After ... < ... [false] | raise.rb:99:11:99:15 | After ... < ... [false] | +| raise.rb:99:11:99:15 | After ... < ... [true] | raise.rb:99:11:99:15 | After ... < ... [true] | +| raise.rb:102:5:102:22 | After call to puts | raise.rb:102:5:102:22 | After call to puts | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:95:3:95:17 | After call to puts | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:97:8:97:12 | After ... > ... [false] | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:97:8:97:12 | After ... > ... [true] | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:99:11:99:15 | After ... < ... [false] | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:99:11:99:15 | After ... < ... [true] | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:102:5:102:22 | After call to puts | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:103:3:111:7 | ensure ... | +| raise.rb:104:5:104:23 | After call to puts | raise.rb:104:5:104:23 | After call to puts | +| raise.rb:105:5:111:7 | After begin ... | raise.rb:105:5:111:7 | After begin ... | +| raise.rb:106:10:106:11 | After b1 [false] | raise.rb:106:10:106:11 | After b1 [false] | +| raise.rb:106:10:106:11 | After b1 [true] | raise.rb:106:10:106:11 | After b1 [true] | +| raise.rb:109:5:110:25 | ensure ... | raise.rb:104:5:104:23 | After call to puts | +| raise.rb:109:5:110:25 | ensure ... | raise.rb:106:10:106:11 | After b1 [false] | +| raise.rb:109:5:110:25 | ensure ... | raise.rb:106:10:106:11 | After b1 [true] | | raise.rb:109:5:110:25 | ensure ... | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:115:3:115:22 | [ensure: exception] self | -| raise.rb:115:3:115:22 | self | raise.rb:99:5:100:20 | elsif ... | -| raise.rb:115:3:115:22 | self | raise.rb:104:5:104:23 | self | -| raise.rb:115:3:115:22 | self | raise.rb:106:7:108:9 | if ... | -| raise.rb:115:3:115:22 | self | raise.rb:106:10:106:11 | b1 | -| raise.rb:115:3:115:22 | self | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:115:3:115:22 | self | raise.rb:115:3:115:22 | self | -| raise.rb:116:3:118:5 | [ensure: exception] if ... | raise.rb:116:3:118:5 | [ensure: exception] if ... | -| raise.rb:116:3:118:5 | [ensure: return] if ... | raise.rb:100:15:100:19 | x < 0 | -| raise.rb:116:3:118:5 | [ensure: return] if ... | raise.rb:106:7:108:9 | [ensure: return] if ... | -| raise.rb:116:3:118:5 | [ensure: return] if ... | raise.rb:106:10:106:11 | [ensure: return] b1 | -| raise.rb:116:3:118:5 | [ensure: return] if ... | raise.rb:109:5:110:25 | [ensure: return] ensure ... | -| raise.rb:116:3:118:5 | [ensure: return] if ... | raise.rb:116:3:118:5 | [ensure: return] if ... | -| raise.rb:116:3:118:5 | if ... | raise.rb:99:5:100:20 | elsif ... | -| raise.rb:116:3:118:5 | if ... | raise.rb:104:5:104:23 | self | -| raise.rb:116:3:118:5 | if ... | raise.rb:106:7:108:9 | if ... | -| raise.rb:116:3:118:5 | if ... | raise.rb:106:10:106:11 | b1 | -| raise.rb:116:3:118:5 | if ... | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:116:3:118:5 | if ... | raise.rb:115:3:115:22 | self | -| raise.rb:116:3:118:5 | if ... | raise.rb:116:3:118:5 | if ... | -| raise.rb:117:5:117:22 | [ensure: exception] self | raise.rb:117:5:117:22 | [ensure: exception] self | -| raise.rb:117:5:117:22 | [ensure: return] self | raise.rb:117:5:117:22 | [ensure: return] self | -| raise.rb:117:5:117:22 | self | raise.rb:117:5:117:22 | self | -| raise.rb:121:1:126:3 | enter m10 | raise.rb:121:1:126:3 | enter m10 | -| raise.rb:121:1:126:3 | exit m10 | raise.rb:121:1:126:3 | exit m10 | -| raise.rb:121:14:121:30 | self | raise.rb:121:14:121:30 | self | -| raise.rb:125:3:125:51 | self | raise.rb:121:1:126:3 | enter m10 | -| raise.rb:125:3:125:51 | self | raise.rb:125:3:125:51 | self | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:128:1:140:3 | enter m11 | -| raise.rb:128:1:140:3 | exit m11 | raise.rb:128:1:140:3 | exit m11 | -| raise.rb:130:5:132:7 | if ... | raise.rb:130:5:132:7 | if ... | -| raise.rb:131:7:131:22 | self | raise.rb:131:7:131:22 | self | -| raise.rb:133:3:133:19 | rescue ... | raise.rb:133:3:133:19 | rescue ... | -| raise.rb:134:10:134:19 | ExceptionB | raise.rb:134:10:134:19 | ExceptionB | -| raise.rb:135:5:135:21 | self | raise.rb:134:10:134:19 | ExceptionB | -| raise.rb:135:5:135:21 | self | raise.rb:135:5:135:21 | self | -| raise.rb:137:5:137:17 | [ensure: exception] self | raise.rb:137:5:137:17 | [ensure: exception] self | -| raise.rb:137:5:137:17 | self | raise.rb:128:1:140:3 | enter m11 | -| raise.rb:137:5:137:17 | self | raise.rb:130:5:132:7 | if ... | -| raise.rb:137:5:137:17 | self | raise.rb:131:7:131:22 | self | -| raise.rb:137:5:137:17 | self | raise.rb:133:3:133:19 | rescue ... | -| raise.rb:137:5:137:17 | self | raise.rb:134:10:134:19 | ExceptionB | -| raise.rb:137:5:137:17 | self | raise.rb:135:5:135:21 | self | -| raise.rb:137:5:137:17 | self | raise.rb:137:5:137:17 | self | -| raise.rb:142:1:148:3 | enter m12 | raise.rb:142:1:148:3 | enter m12 | -| raise.rb:142:1:148:3 | exit m12 (normal) | raise.rb:142:1:148:3 | enter m12 | -| raise.rb:142:1:148:3 | exit m12 (normal) | raise.rb:142:1:148:3 | exit m12 (normal) | -| raise.rb:142:1:148:3 | exit m12 (normal) | raise.rb:143:3:145:5 | if ... | -| raise.rb:142:1:148:3 | exit m12 (normal) | raise.rb:144:5:144:12 | self | -| raise.rb:143:3:145:5 | if ... | raise.rb:143:3:145:5 | if ... | -| raise.rb:144:5:144:12 | self | raise.rb:144:5:144:12 | self | -| raise.rb:150:1:152:3 | enter m13 | raise.rb:150:1:152:3 | enter m13 | -| raise.rb:154:1:156:3 | enter m14 | raise.rb:154:1:156:3 | enter m14 | -| raise.rb:155:16:155:50 | enter { ... } | raise.rb:155:16:155:50 | enter { ... } | -| raise.rb:155:16:155:50 | exit { ... } | raise.rb:155:16:155:50 | exit { ... } | -| raise.rb:155:25:155:32 | self | raise.rb:155:25:155:32 | self | -| raise.rb:155:25:155:48 | ... if ... | raise.rb:155:16:155:50 | enter { ... } | -| raise.rb:155:25:155:48 | ... if ... | raise.rb:155:25:155:48 | ... if ... | -| raise.rb:158:1:164:3 | enter m15 | raise.rb:158:1:164:3 | enter m15 | -| raise.rb:159:7:163:5 | enter do ... end | raise.rb:159:7:163:5 | enter do ... end | -| raise.rb:160:9:162:7 | enter -> { ... } | raise.rb:160:9:162:7 | enter -> { ... } | -| raise.rb:160:9:162:7 | exit -> { ... } | raise.rb:160:9:162:7 | exit -> { ... } | -| raise.rb:161:7:161:14 | self | raise.rb:161:7:161:14 | self | -| raise.rb:161:7:161:23 | ... unless ... | raise.rb:160:9:162:7 | enter -> { ... } | -| raise.rb:161:7:161:23 | ... unless ... | raise.rb:161:7:161:23 | ... unless ... | -| raise.rb:167:3:169:5 | enter m | raise.rb:167:3:169:5 | enter m | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:172:1:182:3 | enter m16 | -| raise.rb:172:1:182:3 | exit m16 | raise.rb:172:1:182:3 | exit m16 | -| raise.rb:172:1:182:3 | exit m16 (abnormal) | raise.rb:172:1:182:3 | exit m16 (abnormal) | -| raise.rb:172:1:182:3 | exit m16 (normal) | raise.rb:172:1:182:3 | enter m16 | -| raise.rb:172:1:182:3 | exit m16 (normal) | raise.rb:172:1:182:3 | exit m16 (normal) | -| raise.rb:172:1:182:3 | exit m16 (normal) | raise.rb:174:8:174:23 | [false] ... \|\| ... | -| raise.rb:172:1:182:3 | exit m16 (normal) | raise.rb:174:8:174:23 | [true] ... \|\| ... | -| raise.rb:172:1:182:3 | exit m16 (normal) | raise.rb:174:14:174:15 | b2 | -| raise.rb:172:1:182:3 | exit m16 (normal) | raise.rb:175:14:175:14 | 1 | -| raise.rb:172:1:182:3 | exit m16 (normal) | raise.rb:177:14:177:14 | 2 | -| raise.rb:172:1:182:3 | exit m16 (normal) | raise.rb:179:10:179:19 | ExceptionA | -| raise.rb:172:1:182:3 | exit m16 (normal) | raise.rb:180:12:180:12 | 3 | -| raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:174:8:174:23 | [false] ... \|\| ... | -| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:174:8:174:23 | [true] ... \|\| ... | -| raise.rb:174:14:174:15 | b2 | raise.rb:174:14:174:15 | b2 | -| raise.rb:175:14:175:14 | 1 | raise.rb:175:14:175:14 | 1 | -| raise.rb:177:14:177:14 | 2 | raise.rb:177:14:177:14 | 2 | -| raise.rb:179:10:179:19 | ExceptionA | raise.rb:179:10:179:19 | ExceptionA | -| raise.rb:180:12:180:12 | 3 | raise.rb:179:10:179:19 | ExceptionA | -| raise.rb:180:12:180:12 | 3 | raise.rb:180:12:180:12 | 3 | +| raise.rb:110:7:110:25 | After call to puts | raise.rb:110:7:110:25 | After call to puts | +| raise.rb:113:3:113:15 | After call to puts | raise.rb:113:3:113:15 | After call to puts | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:94:1:119:3 | Entry | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:95:3:95:17 | After call to puts | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:96:3:112:5 | After begin ... | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:97:8:97:12 | After ... > ... [false] | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:97:8:97:12 | After ... > ... [true] | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:99:11:99:15 | After ... < ... [false] | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:99:11:99:15 | After ... < ... [true] | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:102:5:102:22 | After call to puts | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:103:3:111:7 | ensure ... | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:104:5:104:23 | After call to puts | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:105:5:111:7 | After begin ... | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:106:10:106:11 | After b1 [false] | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:106:10:106:11 | After b1 [true] | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:109:5:110:25 | ensure ... | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:110:7:110:25 | After call to puts | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:113:3:113:15 | After call to puts | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:114:1:118:5 | ensure ... | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:94:1:119:3 | Entry | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:95:3:95:17 | After call to puts | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:96:3:112:5 | After begin ... | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:97:8:97:12 | After ... > ... [false] | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:97:8:97:12 | After ... > ... [true] | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:99:11:99:15 | After ... < ... [false] | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:99:11:99:15 | After ... < ... [true] | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:102:5:102:22 | After call to puts | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:103:3:111:7 | ensure ... | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:104:5:104:23 | After call to puts | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:105:5:111:7 | After begin ... | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:106:10:106:11 | After b1 [false] | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:106:10:106:11 | After b1 [true] | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:109:5:110:25 | ensure ... | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:110:7:110:25 | After call to puts | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:113:3:113:15 | After call to puts | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:114:1:118:5 | ensure ... | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:116:6:116:7 | After b2 [false] | +| raise.rb:116:6:116:7 | After b2 [true] | raise.rb:116:6:116:7 | After b2 [true] | +| raise.rb:121:1:126:3 | Entry | raise.rb:121:1:126:3 | Entry | +| raise.rb:121:1:126:3 | Exit | raise.rb:121:1:126:3 | Exit | +| raise.rb:121:9:121:9 | After p [match] | raise.rb:121:1:126:3 | Entry | +| raise.rb:121:9:121:9 | After p [match] | raise.rb:121:9:121:9 | After p [match] | +| raise.rb:121:9:121:9 | After p [no-match] | raise.rb:121:9:121:9 | After p [no-match] | +| raise.rb:128:1:140:3 | Entry | raise.rb:128:1:140:3 | Entry | +| raise.rb:128:1:140:3 | Exceptional Exit | raise.rb:128:1:140:3 | Exceptional Exit | +| raise.rb:128:1:140:3 | Exit | raise.rb:128:1:140:3 | Exit | +| raise.rb:129:3:138:5 | After begin ... | raise.rb:128:1:140:3 | Entry | +| raise.rb:129:3:138:5 | After begin ... | raise.rb:129:3:138:5 | After begin ... | +| raise.rb:129:3:138:5 | After begin ... | raise.rb:130:8:130:8 | After b [false] | +| raise.rb:129:3:138:5 | After begin ... | raise.rb:130:8:130:8 | After b [true] | +| raise.rb:129:3:138:5 | After begin ... | raise.rb:133:10:133:19 | After ExceptionA [match] | +| raise.rb:129:3:138:5 | After begin ... | raise.rb:133:10:133:19 | After ExceptionA [no-match] | +| raise.rb:129:3:138:5 | After begin ... | raise.rb:134:10:134:19 | After ExceptionB [match] | +| raise.rb:129:3:138:5 | After begin ... | raise.rb:134:10:134:19 | After ExceptionB [no-match] | +| raise.rb:129:3:138:5 | After begin ... | raise.rb:136:3:137:17 | ensure ... | +| raise.rb:130:8:130:8 | After b [false] | raise.rb:130:8:130:8 | After b [false] | +| raise.rb:130:8:130:8 | After b [true] | raise.rb:130:8:130:8 | After b [true] | +| raise.rb:133:10:133:19 | After ExceptionA [match] | raise.rb:133:10:133:19 | After ExceptionA [match] | +| raise.rb:133:10:133:19 | After ExceptionA [no-match] | raise.rb:133:10:133:19 | After ExceptionA [no-match] | +| raise.rb:134:10:134:19 | After ExceptionB [match] | raise.rb:134:10:134:19 | After ExceptionB [match] | +| raise.rb:134:10:134:19 | After ExceptionB [no-match] | raise.rb:134:10:134:19 | After ExceptionB [no-match] | +| raise.rb:136:3:137:17 | ensure ... | raise.rb:128:1:140:3 | Entry | +| raise.rb:136:3:137:17 | ensure ... | raise.rb:130:8:130:8 | After b [false] | +| raise.rb:136:3:137:17 | ensure ... | raise.rb:130:8:130:8 | After b [true] | +| raise.rb:136:3:137:17 | ensure ... | raise.rb:133:10:133:19 | After ExceptionA [match] | +| raise.rb:136:3:137:17 | ensure ... | raise.rb:133:10:133:19 | After ExceptionA [no-match] | +| raise.rb:136:3:137:17 | ensure ... | raise.rb:134:10:134:19 | After ExceptionB [match] | +| raise.rb:136:3:137:17 | ensure ... | raise.rb:134:10:134:19 | After ExceptionB [no-match] | +| raise.rb:136:3:137:17 | ensure ... | raise.rb:136:3:137:17 | ensure ... | +| raise.rb:142:1:148:3 | Entry | raise.rb:142:1:148:3 | Entry | +| raise.rb:143:6:143:6 | After b [false] | raise.rb:143:6:143:6 | After b [false] | +| raise.rb:143:6:143:6 | After b [true] | raise.rb:143:6:143:6 | After b [true] | +| raise.rb:146:1:147:10 | ensure ... | raise.rb:142:1:148:3 | Entry | +| raise.rb:146:1:147:10 | ensure ... | raise.rb:143:6:143:6 | After b [false] | +| raise.rb:146:1:147:10 | ensure ... | raise.rb:143:6:143:6 | After b [true] | +| raise.rb:146:1:147:10 | ensure ... | raise.rb:146:1:147:10 | ensure ... | +| raise.rb:150:1:152:3 | Entry | raise.rb:150:1:152:3 | Entry | +| raise.rb:154:1:156:3 | Entry | raise.rb:154:1:156:3 | Entry | +| raise.rb:155:16:155:50 | Entry | raise.rb:155:16:155:50 | Entry | +| raise.rb:155:16:155:50 | Exit | raise.rb:155:16:155:50 | Exit | +| raise.rb:155:37:155:48 | After call to nil? [false] | raise.rb:155:16:155:50 | Entry | +| raise.rb:155:37:155:48 | After call to nil? [false] | raise.rb:155:37:155:48 | After call to nil? [false] | +| raise.rb:155:37:155:48 | After call to nil? [true] | raise.rb:155:37:155:48 | After call to nil? [true] | +| raise.rb:158:1:164:3 | Entry | raise.rb:158:1:164:3 | Entry | +| raise.rb:159:7:163:5 | Entry | raise.rb:159:7:163:5 | Entry | +| raise.rb:160:9:162:7 | Entry | raise.rb:160:9:162:7 | Entry | +| raise.rb:160:9:162:7 | Exit | raise.rb:160:9:162:7 | Exit | +| raise.rb:161:23:161:23 | After x [false] | raise.rb:161:23:161:23 | After x [false] | +| raise.rb:161:23:161:23 | After x [true] | raise.rb:160:9:162:7 | Entry | +| raise.rb:161:23:161:23 | After x [true] | raise.rb:161:23:161:23 | After x [true] | +| raise.rb:167:3:169:5 | Entry | raise.rb:167:3:169:5 | Entry | +| raise.rb:172:1:182:3 | Entry | raise.rb:172:1:182:3 | Entry | +| raise.rb:172:1:182:3 | Exit | raise.rb:172:1:182:3 | Exit | +| raise.rb:172:1:182:3 | Normal Exit | raise.rb:172:1:182:3 | Entry | +| raise.rb:172:1:182:3 | Normal Exit | raise.rb:172:1:182:3 | Normal Exit | +| raise.rb:172:1:182:3 | Normal Exit | raise.rb:174:8:174:9 | After b1 [false] | +| raise.rb:172:1:182:3 | Normal Exit | raise.rb:174:8:174:9 | After b1 [true] | +| raise.rb:172:1:182:3 | Normal Exit | raise.rb:174:8:174:23 | After ... \|\| ... [true] | +| raise.rb:172:1:182:3 | Normal Exit | raise.rb:174:14:174:23 | After ... == ... [false] | +| raise.rb:172:1:182:3 | Normal Exit | raise.rb:174:14:174:23 | After ... == ... [true] | +| raise.rb:172:1:182:3 | Normal Exit | raise.rb:179:3:180:12 | rescue ... | +| raise.rb:172:1:182:3 | Normal Exit | raise.rb:179:10:179:19 | After ExceptionA [match] | +| raise.rb:174:8:174:9 | After b1 [false] | raise.rb:174:8:174:9 | After b1 [false] | +| raise.rb:174:8:174:9 | After b1 [true] | raise.rb:174:8:174:9 | After b1 [true] | +| raise.rb:174:8:174:23 | After ... \|\| ... [true] | raise.rb:174:8:174:9 | After b1 [true] | +| raise.rb:174:8:174:23 | After ... \|\| ... [true] | raise.rb:174:8:174:23 | After ... \|\| ... [true] | +| raise.rb:174:8:174:23 | After ... \|\| ... [true] | raise.rb:174:14:174:23 | After ... == ... [true] | +| raise.rb:174:14:174:23 | After ... == ... [false] | raise.rb:174:14:174:23 | After ... == ... [false] | +| raise.rb:174:14:174:23 | After ... == ... [true] | raise.rb:174:14:174:23 | After ... == ... [true] | +| raise.rb:179:3:180:12 | rescue ... | raise.rb:179:3:180:12 | rescue ... | +| raise.rb:179:10:179:19 | After ExceptionA [match] | raise.rb:179:3:180:12 | rescue ... | +| raise.rb:179:10:179:19 | After ExceptionA [match] | raise.rb:179:10:179:19 | After ExceptionA [match] | +| raise.rb:179:10:179:19 | After ExceptionA [no-match] | raise.rb:179:10:179:19 | After ExceptionA [no-match] | immediateDominator -| break_ensure.rb:1:1:11:3 | exit m1 | break_ensure.rb:2:9:2:9 | x | -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:2:9:2:9 | x | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:1:1:11:3 | enter m1 | -| break_ensure.rb:3:5:5:7 | if ... | break_ensure.rb:3:8:3:8 | x | -| break_ensure.rb:3:8:3:8 | x | break_ensure.rb:2:9:2:9 | x | -| break_ensure.rb:4:7:4:11 | break | break_ensure.rb:3:8:3:8 | x | -| break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | break_ensure.rb:8:6:8:13 | [ensure: exception] self | -| break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:2:3:6:5 | while ... | -| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:2:9:2:9 | x | -| break_ensure.rb:9:5:9:23 | [ensure: exception] self | break_ensure.rb:8:6:8:13 | [ensure: exception] self | -| break_ensure.rb:9:5:9:23 | self | break_ensure.rb:2:3:6:5 | while ... | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:14:9:14:9 | x | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:13:1:25:3 | enter m2 | -| break_ensure.rb:16:7:18:9 | if ... | break_ensure.rb:16:10:16:10 | x | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:14:9:14:9 | x | -| break_ensure.rb:17:9:17:13 | break | break_ensure.rb:16:10:16:10 | x | -| break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:17:9:17:13 | break | -| break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:20:10:20:10 | [ensure: exception] y | -| break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:16:7:18:9 | if ... | -| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:16:10:16:10 | x | -| break_ensure.rb:21:9:21:20 | [ensure: break] self | break_ensure.rb:17:9:17:13 | break | -| break_ensure.rb:21:9:21:20 | [ensure: exception] self | break_ensure.rb:20:10:20:10 | [ensure: exception] y | -| break_ensure.rb:21:9:21:20 | self | break_ensure.rb:16:7:18:9 | if ... | -| break_ensure.rb:27:1:42:3 | exit m3 | break_ensure.rb:27:1:42:3 | enter m3 | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:27:1:42:3 | enter m3 | -| break_ensure.rb:29:5:31:7 | if ... | break_ensure.rb:27:1:42:3 | enter m3 | -| break_ensure.rb:30:7:30:12 | return | break_ensure.rb:27:1:42:3 | enter m3 | -| break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | break_ensure.rb:33:11:33:11 | [ensure: exception] y | -| break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:33:11:33:11 | [ensure: return] y | -| break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:33:11:33:11 | y | -| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:27:1:42:3 | enter m3 | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:30:7:30:12 | return | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:29:5:31:7 | if ... | -| break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | break_ensure.rb:35:12:35:12 | [ensure: exception] x | -| break_ensure.rb:35:9:37:11 | [ensure: return] if ... | break_ensure.rb:35:12:35:12 | [ensure: return] x | -| break_ensure.rb:35:9:37:11 | if ... | break_ensure.rb:35:12:35:12 | x | -| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:33:11:33:11 | [ensure: exception] y | -| break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:33:11:33:11 | [ensure: return] y | -| break_ensure.rb:35:12:35:12 | x | break_ensure.rb:33:11:33:11 | y | -| break_ensure.rb:36:11:36:15 | [ensure: exception] break | break_ensure.rb:35:12:35:12 | [ensure: exception] x | -| break_ensure.rb:36:11:36:15 | [ensure: return] break | break_ensure.rb:35:12:35:12 | [ensure: return] x | -| break_ensure.rb:36:11:36:15 | break | break_ensure.rb:35:12:35:12 | x | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:45:9:45:9 | x | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:44:1:56:3 | enter m4 | -| break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:47:10:47:10 | x | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:45:9:45:9 | x | -| break_ensure.rb:48:9:48:16 | self | break_ensure.rb:47:10:47:10 | x | -| break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | break_ensure.rb:51:10:51:10 | [ensure: exception] x | -| break_ensure.rb:51:7:53:9 | if ... | break_ensure.rb:47:7:49:9 | if ... | -| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:47:10:47:10 | x | -| break_ensure.rb:52:15:52:16 | 10 | break_ensure.rb:47:7:49:9 | if ... | -| break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | break_ensure.rb:51:10:51:10 | [ensure: exception] x | -| case.rb:2:3:5:5 | case ... | case.rb:1:1:6:3 | enter if_in_case | -| case.rb:3:5:3:42 | [match] when ... | case.rb:1:1:6:3 | enter if_in_case | -| case.rb:3:5:3:42 | [no-match] when ... | case.rb:1:1:6:3 | enter if_in_case | -| case.rb:3:18:3:41 | if ... | case.rb:3:21:3:22 | self | -| case.rb:3:21:3:22 | self | case.rb:3:5:3:42 | [match] when ... | -| case.rb:3:29:3:37 | self | case.rb:3:21:3:22 | self | -| case.rb:4:5:4:24 | [match] when ... | case.rb:4:10:4:10 | 2 | -| case.rb:4:5:4:24 | [no-match] when ... | case.rb:4:10:4:10 | 2 | -| case.rb:4:10:4:10 | 2 | case.rb:3:5:3:42 | [no-match] when ... | -| case.rb:4:17:4:24 | self | case.rb:4:5:4:24 | [match] when ... | -| case.rb:9:3:17:5 | case ... | case.rb:8:1:18:3 | enter case_match | -| case.rb:11:5:11:15 | in ... then ... | case.rb:8:1:18:3 | enter case_match | -| case.rb:11:15:11:15 | 3 | case.rb:11:5:11:15 | in ... then ... | -| case.rb:12:5:13:7 | in ... then ... | case.rb:11:5:11:15 | in ... then ... | -| case.rb:13:7:13:7 | 4 | case.rb:12:5:13:7 | in ... then ... | -| case.rb:14:5:14:25 | in ... then ... | case.rb:12:5:13:7 | in ... then ... | -| case.rb:14:13:14:13 | x | case.rb:14:5:14:25 | in ... then ... | -| case.rb:14:25:14:25 | 6 | case.rb:14:13:14:13 | x | -| case.rb:15:5:15:28 | in ... then ... | case.rb:14:13:14:13 | x | -| case.rb:15:17:15:17 | x | case.rb:15:5:15:28 | in ... then ... | -| case.rb:15:28:15:28 | 7 | case.rb:15:17:15:17 | x | -| case.rb:16:10:16:10 | 8 | case.rb:15:17:15:17 | x | -| case.rb:20:1:24:3 | exit case_match_no_match | case.rb:20:1:24:3 | enter case_match_no_match | -| case.rb:20:1:24:3 | exit case_match_no_match (abnormal) | case.rb:20:1:24:3 | enter case_match_no_match | -| case.rb:21:3:23:5 | case ... | case.rb:20:1:24:3 | enter case_match_no_match | -| case.rb:26:1:30:3 | exit case_match_raise | case.rb:26:1:30:3 | enter case_match_raise | -| case.rb:26:1:30:3 | exit case_match_raise (abnormal) | case.rb:26:1:30:3 | enter case_match_raise | -| case.rb:27:3:29:5 | case ... | case.rb:26:1:30:3 | enter case_match_raise | -| case.rb:32:1:39:3 | exit case_match_array | case.rb:32:1:39:3 | enter case_match_array | -| case.rb:32:1:39:3 | exit case_match_array (abnormal) | case.rb:37:5:37:27 | in ... then ... | -| case.rb:33:3:38:5 | case ... | case.rb:32:1:39:3 | enter case_match_array | -| case.rb:35:5:35:11 | in ... then ... | case.rb:32:1:39:3 | enter case_match_array | -| case.rb:35:9:35:9 | x | case.rb:35:5:35:11 | in ... then ... | -| case.rb:36:5:36:13 | in ... then ... | case.rb:35:5:35:11 | in ... then ... | -| case.rb:36:9:36:9 | x | case.rb:36:5:36:13 | in ... then ... | -| case.rb:37:5:37:27 | in ... then ... | case.rb:36:5:36:13 | in ... then ... | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:5:37:27 | in ... then ... | -| case.rb:37:12:37:12 | a | case.rb:37:8:37:26 | [ ..., * ] | -| case.rb:37:15:37:15 | b | case.rb:37:12:37:12 | a | -| case.rb:37:19:37:19 | c | case.rb:37:15:37:15 | b | -| case.rb:37:25:37:25 | e | case.rb:37:19:37:19 | c | -| case.rb:41:1:45:3 | exit case_match_find | case.rb:41:1:45:3 | enter case_match_find | -| case.rb:41:1:45:3 | exit case_match_find (abnormal) | case.rb:41:1:45:3 | enter case_match_find | -| case.rb:43:10:43:10 | x | case.rb:41:1:45:3 | enter case_match_find | -| case.rb:43:16:43:16 | 2 | case.rb:43:10:43:10 | x | -| case.rb:43:20:43:20 | y | case.rb:43:16:43:16 | 2 | -| case.rb:47:1:53:3 | exit case_match_hash | case.rb:47:1:53:3 | enter case_match_hash | -| case.rb:47:1:53:3 | exit case_match_hash (abnormal) | case.rb:51:5:51:17 | in ... then ... | -| case.rb:48:3:52:5 | case ... | case.rb:47:1:53:3 | enter case_match_hash | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:47:1:53:3 | enter case_match_hash | -| case.rb:49:20:49:20 | 1 | case.rb:49:8:49:34 | { ..., ** } | -| case.rb:49:23:49:23 | a | case.rb:49:20:49:20 | 1 | -| case.rb:49:29:49:32 | rest | case.rb:49:23:49:23 | a | -| case.rb:50:5:50:25 | in ... then ... | case.rb:47:1:53:3 | enter case_match_hash | -| case.rb:50:8:50:24 | { ..., ** } | case.rb:50:5:50:25 | in ... then ... | -| case.rb:50:16:50:16 | 1 | case.rb:50:8:50:24 | { ..., ** } | -| case.rb:51:5:51:17 | in ... then ... | case.rb:50:5:50:25 | in ... then ... | -| case.rb:51:8:51:16 | { ..., ** } | case.rb:51:5:51:17 | in ... then ... | -| case.rb:56:3:60:5 | case ... | case.rb:55:1:61:3 | enter case_match_variable | -| case.rb:58:5:58:10 | in ... then ... | case.rb:55:1:61:3 | enter case_match_variable | -| case.rb:64:3:66:5 | case ... | case.rb:63:1:67:3 | enter case_match_underscore | -| case.rb:65:12:65:12 | _ | case.rb:63:1:67:3 | enter case_match_underscore | -| case.rb:69:1:93:3 | exit case_match_various | case.rb:69:1:93:3 | enter case_match_various | -| case.rb:69:1:93:3 | exit case_match_various (abnormal) | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:72:3:92:5 | case ... | case.rb:69:1:93:3 | enter case_match_various | -| case.rb:74:5:74:11 | in ... then ... | case.rb:69:1:93:3 | enter case_match_various | -| case.rb:75:5:75:15 | in ... then ... | case.rb:74:5:74:11 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:75:5:75:15 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:76:5:76:18 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:77:5:77:18 | in ... then ... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:78:5:78:19 | in ... then ... | -| case.rb:80:5:80:12 | in ... then ... | case.rb:79:5:79:14 | in ... then ... | -| case.rb:81:5:81:11 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | -| case.rb:82:5:82:20 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | -| case.rb:82:13:82:13 | x | case.rb:82:5:82:20 | in ... then ... | -| case.rb:82:20:82:20 | 1 | case.rb:82:13:82:13 | x | -| case.rb:83:5:83:26 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | -| case.rb:83:12:83:15 | ^... | case.rb:83:5:83:26 | in ... then ... | -| case.rb:83:20:83:25 | string | case.rb:83:12:83:15 | ^... | -| case.rb:84:5:84:17 | in ... then ... | case.rb:83:20:83:25 | string | -| case.rb:85:5:85:23 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | -| case.rb:86:5:86:11 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:87:5:87:17 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:88:5:88:15 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:88:14:88:15 | 10 | case.rb:88:5:88:15 | in ... then ... | -| case.rb:89:5:89:69 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:89:14:89:17 | self | case.rb:89:5:89:69 | in ... then ... | -| case.rb:89:21:89:24 | true | case.rb:89:14:89:17 | self | -| case.rb:89:28:89:32 | false | case.rb:89:21:89:24 | true | -| case.rb:89:36:89:43 | __LINE__ | case.rb:89:28:89:32 | false | -| case.rb:89:47:89:54 | __FILE__ | case.rb:89:36:89:43 | __LINE__ | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:89:47:89:54 | __FILE__ | -| case.rb:90:5:90:13 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:91:5:91:25 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:91:13:91:14 | "" | case.rb:91:5:91:25 | in ... then ... | -| case.rb:91:18:91:19 | [ ..., * ] | case.rb:91:13:91:14 | "" | -| case.rb:91:23:91:24 | { ..., ** } | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:95:1:99:3 | exit case_match_guard_no_else | case.rb:97:13:97:13 | x | -| case.rb:95:1:99:3 | exit case_match_guard_no_else (abnormal) | case.rb:97:13:97:13 | x | -| case.rb:97:13:97:13 | x | case.rb:95:1:99:3 | enter case_match_guard_no_else | -| case.rb:97:25:97:25 | 6 | case.rb:97:13:97:13 | x | -| cfg.html.erb:18:14:22:16 | if ... | cfg.html.erb:5:16:31:12 | enter cfg.html.erb | -| cfg.html.erb:19:19:19:32 | self | cfg.html.erb:5:16:31:12 | enter cfg.html.erb | -| cfg.html.erb:21:19:21:32 | self | cfg.html.erb:5:16:31:12 | enter cfg.html.erb | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:42:3:42:24 | [match] when ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:42:15:42:24 | self | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:43:3:43:31 | [match] when ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:43:3:43:31 | [no-match] when ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:43:11:43:11 | 3 | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:43:14:43:14 | 4 | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:43:21:43:31 | self | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:44:8:44:18 | self | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:48:3:48:29 | [match] when ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:48:3:48:29 | [no-match] when ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:48:20:48:29 | self | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:49:3:49:37 | [match] when ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:49:3:49:37 | [no-match] when ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:49:8:49:8 | b | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:49:16:49:16 | b | cfg.rb:49:8:49:8 | b | -| cfg.rb:49:27:49:37 | self | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:60:27:60:31 | hello | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:60:37:60:39 | bye | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:75:15:75:15 | 0 | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:75:17:75:43 | elsif ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:75:23:75:23 | x | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:75:35:75:36 | 10 | cfg.rb:75:23:75:23 | x | -| cfg.rb:75:43:75:43 | x | cfg.rb:75:23:75:23 | x | -| cfg.rb:90:1:93:3 | exit { ... } (normal) | cfg.rb:90:1:93:3 | enter { ... } | -| cfg.rb:90:5:90:5 | [false] ! ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:90:5:90:5 | [true] ! ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:90:5:90:5 | x | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:91:3:91:24 | if ... | cfg.rb:90:1:93:3 | enter { ... } | -| cfg.rb:91:17:91:20 | next | cfg.rb:90:1:93:3 | enter { ... } | -| cfg.rb:101:24:101:25 | 42 | cfg.rb:101:1:104:3 | enter parameters | -| cfg.rb:101:28:101:30 | key | cfg.rb:101:1:104:3 | enter parameters | -| cfg.rb:113:1:113:9 | self | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:136:12:136:29 | self | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:172:21:172:29 | self | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:172:36:172:45 | self | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:174:1:174:9 | self | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:176:7:176:7 | x | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:176:17:176:17 | x | cfg.rb:176:7:176:7 | x | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:179:2:179:13 | self | cfg.rb:179:30:179:30 | i | -| cfg.rb:179:30:179:30 | i | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:182:7:182:7 | x | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:183:3:183:3 | x | cfg.rb:182:7:182:7 | x | -| cfg.rb:184:3:184:25 | if ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:184:18:184:21 | redo | cfg.rb:183:3:183:3 | x | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:188:2:188:13 | self | cfg.rb:188:30:188:30 | i | -| cfg.rb:188:30:188:30 | i | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:205:1:205:3 | __synth__0__1 | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:205:1:205:3 | nil | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:188:1:188:35 | ... while ... | -| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | -| constant_compound_assign.rb:5:22:5:24 | 123 | constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | -| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | -| constant_compound_assign.rb:14:18:14:20 | 123 | constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | -| constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | -| constant_compound_assign.rb:19:21:19:23 | 123 | constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | -| exit.rb:1:1:6:3 | exit m1 | exit.rb:1:1:6:3 | enter m1 | -| exit.rb:2:3:4:5 | if ... | exit.rb:1:1:6:3 | enter m1 | -| exit.rb:3:5:3:10 | self | exit.rb:1:1:6:3 | enter m1 | -| exit.rb:8:1:13:3 | exit m2 | exit.rb:8:1:13:3 | enter m2 | -| exit.rb:9:3:11:5 | if ... | exit.rb:8:1:13:3 | enter m2 | -| exit.rb:10:5:10:18 | self | exit.rb:8:1:13:3 | enter m2 | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:1:1:9:3 | enter m1 | -| ifs.rb:3:5:3:30 | self | ifs.rb:1:1:9:3 | enter m1 | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:4:9:4:9 | x | -| ifs.rb:4:9:4:9 | x | ifs.rb:1:1:9:3 | enter m1 | -| ifs.rb:4:9:4:24 | [false] ... and ... | ifs.rb:4:9:4:9 | x | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:20:4:20 | x | -| ifs.rb:4:9:4:38 | [false] ... and ... | ifs.rb:4:9:4:9 | x | -| ifs.rb:4:9:4:38 | [true] ... and ... | ifs.rb:4:30:4:38 | [true] ! ... | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:9:4:9 | x | -| ifs.rb:4:30:4:38 | [false] ! ... | ifs.rb:4:31:4:38 | [true] ( ... ) | -| ifs.rb:4:30:4:38 | [true] ! ... | ifs.rb:4:31:4:38 | [false] ( ... ) | -| ifs.rb:4:31:4:38 | [false] ( ... ) | ifs.rb:4:32:4:32 | x | -| ifs.rb:4:31:4:38 | [true] ( ... ) | ifs.rb:4:32:4:32 | x | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:9:4:24 | [true] ... and ... | -| ifs.rb:5:5:5:17 | self | ifs.rb:4:9:4:38 | [true] ... and ... | -| ifs.rb:7:5:7:35 | self | ifs.rb:4:9:4:38 | [false] ... and ... | -| ifs.rb:11:1:16:3 | exit m2 (normal) | ifs.rb:11:1:16:3 | enter m2 | -| ifs.rb:12:3:14:5 | if ... | ifs.rb:11:1:16:3 | enter m2 | -| ifs.rb:13:12:13:12 | 0 | ifs.rb:11:1:16:3 | enter m2 | -| ifs.rb:19:3:24:5 | if ... | ifs.rb:18:1:26:3 | enter m3 | -| ifs.rb:20:5:20:5 | x | ifs.rb:18:1:26:3 | enter m3 | -| ifs.rb:21:5:23:7 | if ... | ifs.rb:20:5:20:5 | x | -| ifs.rb:22:7:22:7 | x | ifs.rb:20:5:20:5 | x | -| ifs.rb:29:10:29:23 | [false] ( ... ) | ifs.rb:29:11:29:22 | [false] ... ? ... : ... | -| ifs.rb:29:10:29:23 | [true] ( ... ) | ifs.rb:29:11:29:22 | [true] ... ? ... : ... | -| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:28:1:30:3 | enter m4 | -| ifs.rb:29:11:29:22 | [false] ... ? ... : ... | ifs.rb:28:1:30:3 | enter m4 | -| ifs.rb:29:11:29:22 | [true] ... ? ... : ... | ifs.rb:28:1:30:3 | enter m4 | -| ifs.rb:29:16:29:17 | b2 | ifs.rb:28:1:30:3 | enter m4 | -| ifs.rb:29:21:29:22 | b3 | ifs.rb:28:1:30:3 | enter m4 | -| ifs.rb:29:28:29:35 | b2 \|\| b3 | ifs.rb:29:10:29:23 | [true] ( ... ) | -| ifs.rb:29:41:29:50 | !b2 \|\| !b3 | ifs.rb:29:10:29:23 | [false] ( ... ) | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:32:1:34:3 | enter m5 | -| ifs.rb:33:6:33:49 | [false] ( ... ) | ifs.rb:33:7:33:48 | [false] if ... | -| ifs.rb:33:6:33:49 | [true] ( ... ) | ifs.rb:33:7:33:48 | [true] if ... | -| ifs.rb:33:7:33:48 | [false] if ... | ifs.rb:32:1:34:3 | enter m5 | -| ifs.rb:33:7:33:48 | [true] if ... | ifs.rb:32:1:34:3 | enter m5 | -| ifs.rb:33:13:33:19 | [false] then ... | ifs.rb:33:18:33:19 | b2 | -| ifs.rb:33:13:33:19 | [true] then ... | ifs.rb:33:18:33:19 | b2 | -| ifs.rb:33:18:33:19 | b2 | ifs.rb:32:1:34:3 | enter m5 | -| ifs.rb:33:21:33:44 | [false] elsif ... | ifs.rb:33:27:33:28 | b3 | -| ifs.rb:33:21:33:44 | [true] elsif ... | ifs.rb:33:27:33:28 | b3 | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:32:1:34:3 | enter m5 | -| ifs.rb:33:30:33:36 | [false] then ... | ifs.rb:33:35:33:36 | b4 | -| ifs.rb:33:30:33:36 | [true] then ... | ifs.rb:33:35:33:36 | b4 | -| ifs.rb:33:35:33:36 | b4 | ifs.rb:33:27:33:28 | b3 | -| ifs.rb:33:38:33:44 | [false] else ... | ifs.rb:33:43:33:44 | b5 | -| ifs.rb:33:38:33:44 | [true] else ... | ifs.rb:33:43:33:44 | b5 | -| ifs.rb:33:43:33:44 | b5 | ifs.rb:33:27:33:28 | b3 | -| ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | ifs.rb:33:6:33:49 | [true] ( ... ) | -| ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | ifs.rb:33:6:33:49 | [false] ( ... ) | -| ifs.rb:36:1:38:3 | conditional_method_def | ifs.rb:1:1:58:4 | enter ifs.rb | -| ifs.rb:36:1:38:17 | ... unless ... | ifs.rb:1:1:58:4 | enter ifs.rb | -| ifs.rb:41:3:43:5 | if ... | ifs.rb:41:6:41:10 | [false] ! ... | -| ifs.rb:41:6:41:10 | [false] ! ... | ifs.rb:40:1:44:3 | enter constant_condition | -| ifs.rb:47:3:50:5 | if ... | ifs.rb:46:1:52:3 | enter empty_else | -| ifs.rb:48:5:48:15 | self | ifs.rb:46:1:52:3 | enter empty_else | -| ifs.rb:49:3:49:6 | else ... | ifs.rb:46:1:52:3 | enter empty_else | -| ifs.rb:55:3:57:5 | if ... | ifs.rb:54:1:58:3 | enter disjunct | -| ifs.rb:55:6:55:15 | [false] ( ... ) | ifs.rb:55:7:55:14 | [false] ... \|\| ... | -| ifs.rb:55:6:55:15 | [true] ( ... ) | ifs.rb:55:7:55:14 | [true] ... \|\| ... | -| ifs.rb:55:7:55:14 | [false] ... \|\| ... | ifs.rb:55:13:55:14 | b2 | -| ifs.rb:55:7:55:14 | [true] ... \|\| ... | ifs.rb:54:1:58:3 | enter disjunct | -| ifs.rb:55:13:55:14 | b2 | ifs.rb:54:1:58:3 | enter disjunct | -| ifs.rb:56:5:56:19 | self | ifs.rb:55:6:55:15 | [true] ( ... ) | -| loops.rb:2:3:5:5 | while ... | loops.rb:2:9:2:9 | x | -| loops.rb:2:9:2:9 | x | loops.rb:1:1:6:3 | enter m1 | -| loops.rb:3:5:3:10 | self | loops.rb:2:9:2:9 | x | -| loops.rb:9:3:20:5 | while ... | loops.rb:9:9:9:9 | x | -| loops.rb:9:9:9:9 | x | loops.rb:8:1:22:3 | enter m2 | -| loops.rb:10:5:10:10 | self | loops.rb:9:9:9:9 | x | -| loops.rb:13:7:13:11 | break | loops.rb:10:5:10:10 | self | -| loops.rb:14:11:14:11 | x | loops.rb:10:5:10:10 | self | -| loops.rb:15:7:15:10 | next | loops.rb:14:11:14:11 | x | -| loops.rb:16:5:17:10 | elsif ... | loops.rb:16:11:16:11 | x | -| loops.rb:16:11:16:11 | x | loops.rb:14:11:14:11 | x | -| loops.rb:17:7:17:10 | redo | loops.rb:16:11:16:11 | x | -| loops.rb:31:3:32:5 | while ... | loops.rb:31:9:31:9 | x | -| loops.rb:31:9:31:9 | x | loops.rb:30:1:33:3 | enter m4 | -| loops.rb:31:15:32:5 | do ... | loops.rb:31:9:31:9 | x | -| raise.rb:7:1:12:3 | exit m1 | raise.rb:7:1:12:3 | enter m1 | -| raise.rb:8:3:10:5 | if ... | raise.rb:7:1:12:3 | enter m1 | -| raise.rb:9:5:9:17 | self | raise.rb:7:1:12:3 | enter m1 | -| raise.rb:14:1:23:3 | exit m2 | raise.rb:14:1:23:3 | enter m2 | -| raise.rb:14:1:23:3 | exit m2 (abnormal) | raise.rb:17:7:17:22 | self | -| raise.rb:16:5:18:7 | if ... | raise.rb:14:1:23:3 | enter m2 | -| raise.rb:17:7:17:22 | self | raise.rb:14:1:23:3 | enter m2 | -| raise.rb:20:5:20:18 | self | raise.rb:17:7:17:22 | self | -| raise.rb:22:3:22:15 | self | raise.rb:14:1:23:3 | enter m2 | -| raise.rb:27:5:29:7 | if ... | raise.rb:25:1:34:3 | enter m3 | -| raise.rb:28:7:28:22 | self | raise.rb:25:1:34:3 | enter m3 | -| raise.rb:33:3:33:15 | self | raise.rb:25:1:34:3 | enter m3 | -| raise.rb:38:5:40:7 | if ... | raise.rb:36:1:45:3 | enter m4 | -| raise.rb:39:7:39:22 | self | raise.rb:36:1:45:3 | enter m4 | -| raise.rb:44:3:44:15 | self | raise.rb:36:1:45:3 | enter m4 | -| raise.rb:49:5:51:7 | if ... | raise.rb:47:1:55:3 | enter m5 | -| raise.rb:50:7:50:22 | self | raise.rb:47:1:55:3 | enter m5 | -| raise.rb:54:3:54:15 | self | raise.rb:47:1:55:3 | enter m5 | -| raise.rb:57:1:66:3 | exit m6 | raise.rb:57:1:66:3 | enter m6 | -| raise.rb:57:1:66:3 | exit m6 (abnormal) | raise.rb:62:22:62:31 | ExceptionB | -| raise.rb:59:5:61:7 | if ... | raise.rb:57:1:66:3 | enter m6 | -| raise.rb:60:7:60:22 | self | raise.rb:57:1:66:3 | enter m6 | -| raise.rb:62:22:62:31 | ExceptionB | raise.rb:60:7:60:22 | self | -| raise.rb:62:36:62:36 | e | raise.rb:60:7:60:22 | self | -| raise.rb:65:3:65:15 | self | raise.rb:57:1:66:3 | enter m6 | -| raise.rb:68:1:77:3 | exit m7 | raise.rb:68:1:77:3 | enter m7 | -| raise.rb:68:1:77:3 | exit m7 (normal) | raise.rb:71:9:71:9 | x | -| raise.rb:70:5:70:17 | self | raise.rb:68:1:77:3 | enter m7 | -| raise.rb:71:3:72:18 | elsif ... | raise.rb:71:9:71:9 | x | -| raise.rb:71:9:71:9 | x | raise.rb:68:1:77:3 | enter m7 | -| raise.rb:72:13:72:17 | x < 0 | raise.rb:71:9:71:9 | x | -| raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:68:1:77:3 | enter m7 | -| raise.rb:76:3:76:15 | self | raise.rb:71:3:72:18 | elsif ... | -| raise.rb:79:1:92:3 | exit m8 | raise.rb:79:1:92:3 | enter m8 | -| raise.rb:79:1:92:3 | exit m8 (normal) | raise.rb:84:11:84:11 | x | -| raise.rb:83:7:83:19 | self | raise.rb:79:1:92:3 | enter m8 | -| raise.rb:84:5:85:20 | elsif ... | raise.rb:84:11:84:11 | x | -| raise.rb:84:11:84:11 | x | raise.rb:79:1:92:3 | enter m8 | -| raise.rb:85:15:85:19 | x < 0 | raise.rb:84:11:84:11 | x | -| raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:79:1:92:3 | enter m8 | -| raise.rb:89:5:89:17 | self | raise.rb:84:5:85:20 | elsif ... | -| raise.rb:94:1:119:3 | exit m9 | raise.rb:94:1:119:3 | enter m9 | -| raise.rb:94:1:119:3 | exit m9 (abnormal) | raise.rb:94:1:119:3 | enter m9 | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:99:11:99:11 | x | -| raise.rb:97:8:97:8 | x | raise.rb:94:1:119:3 | enter m9 | -| raise.rb:98:7:98:19 | self | raise.rb:97:8:97:8 | x | -| raise.rb:99:5:100:20 | elsif ... | raise.rb:99:11:99:11 | x | -| raise.rb:99:11:99:11 | x | raise.rb:97:8:97:8 | x | -| raise.rb:100:15:100:19 | x < 0 | raise.rb:99:11:99:11 | x | -| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:97:8:97:8 | x | -| raise.rb:104:5:104:23 | self | raise.rb:99:5:100:20 | elsif ... | -| raise.rb:106:7:108:9 | [ensure: exception] if ... | raise.rb:106:10:106:11 | [ensure: exception] b1 | -| raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:106:10:106:11 | [ensure: return] b1 | -| raise.rb:106:7:108:9 | if ... | raise.rb:106:10:106:11 | b1 | -| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:104:5:104:23 | [ensure: exception] self | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:100:15:100:19 | x < 0 | -| raise.rb:106:10:106:11 | b1 | raise.rb:104:5:104:23 | self | -| raise.rb:107:9:107:26 | [ensure: exception] self | raise.rb:106:10:106:11 | [ensure: exception] b1 | -| raise.rb:107:9:107:26 | [ensure: return] self | raise.rb:106:10:106:11 | [ensure: return] b1 | -| raise.rb:107:9:107:26 | self | raise.rb:106:10:106:11 | b1 | -| raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | raise.rb:107:9:107:26 | self | -| raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | raise.rb:107:9:107:26 | [ensure: exception] self | -| raise.rb:109:5:110:25 | [ensure: exception] ensure ... | raise.rb:106:7:108:9 | [ensure: exception] if ... | -| raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | raise.rb:107:9:107:26 | [ensure: return] self | -| raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:106:7:108:9 | [ensure: return] if ... | -| raise.rb:109:5:110:25 | ensure ... | raise.rb:106:7:108:9 | if ... | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:94:1:119:3 | enter m9 | -| raise.rb:115:3:115:22 | self | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:116:3:118:5 | [ensure: exception] if ... | raise.rb:115:3:115:22 | [ensure: exception] self | -| raise.rb:116:3:118:5 | [ensure: return] if ... | raise.rb:109:5:110:25 | [ensure: return] ensure ... | -| raise.rb:116:3:118:5 | if ... | raise.rb:115:3:115:22 | self | -| raise.rb:117:5:117:22 | [ensure: exception] self | raise.rb:115:3:115:22 | [ensure: exception] self | -| raise.rb:117:5:117:22 | [ensure: return] self | raise.rb:109:5:110:25 | [ensure: return] ensure ... | -| raise.rb:117:5:117:22 | self | raise.rb:115:3:115:22 | self | -| raise.rb:121:1:126:3 | exit m10 | raise.rb:121:1:126:3 | enter m10 | -| raise.rb:121:14:121:30 | self | raise.rb:121:1:126:3 | enter m10 | -| raise.rb:125:3:125:51 | self | raise.rb:121:1:126:3 | enter m10 | -| raise.rb:128:1:140:3 | exit m11 | raise.rb:128:1:140:3 | enter m11 | -| raise.rb:130:5:132:7 | if ... | raise.rb:128:1:140:3 | enter m11 | -| raise.rb:131:7:131:22 | self | raise.rb:128:1:140:3 | enter m11 | -| raise.rb:133:3:133:19 | rescue ... | raise.rb:131:7:131:22 | self | -| raise.rb:134:10:134:19 | ExceptionB | raise.rb:131:7:131:22 | self | -| raise.rb:135:5:135:21 | self | raise.rb:134:10:134:19 | ExceptionB | -| raise.rb:137:5:137:17 | [ensure: exception] self | raise.rb:134:10:134:19 | ExceptionB | -| raise.rb:137:5:137:17 | self | raise.rb:128:1:140:3 | enter m11 | -| raise.rb:142:1:148:3 | exit m12 (normal) | raise.rb:142:1:148:3 | enter m12 | -| raise.rb:143:3:145:5 | if ... | raise.rb:142:1:148:3 | enter m12 | -| raise.rb:144:5:144:12 | self | raise.rb:142:1:148:3 | enter m12 | -| raise.rb:155:16:155:50 | exit { ... } | raise.rb:155:16:155:50 | enter { ... } | -| raise.rb:155:25:155:32 | self | raise.rb:155:16:155:50 | enter { ... } | -| raise.rb:155:25:155:48 | ... if ... | raise.rb:155:16:155:50 | enter { ... } | -| raise.rb:160:9:162:7 | exit -> { ... } | raise.rb:160:9:162:7 | enter -> { ... } | -| raise.rb:161:7:161:14 | self | raise.rb:160:9:162:7 | enter -> { ... } | -| raise.rb:161:7:161:23 | ... unless ... | raise.rb:160:9:162:7 | enter -> { ... } | -| raise.rb:172:1:182:3 | exit m16 | raise.rb:172:1:182:3 | enter m16 | -| raise.rb:172:1:182:3 | exit m16 (abnormal) | raise.rb:179:10:179:19 | ExceptionA | -| raise.rb:172:1:182:3 | exit m16 (normal) | raise.rb:172:1:182:3 | enter m16 | -| raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:174:14:174:15 | b2 | -| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:172:1:182:3 | enter m16 | -| raise.rb:174:14:174:15 | b2 | raise.rb:172:1:182:3 | enter m16 | -| raise.rb:175:14:175:14 | 1 | raise.rb:174:8:174:23 | [true] ... \|\| ... | -| raise.rb:177:14:177:14 | 2 | raise.rb:174:8:174:23 | [false] ... \|\| ... | -| raise.rb:179:10:179:19 | ExceptionA | raise.rb:172:1:182:3 | enter m16 | -| raise.rb:180:12:180:12 | 3 | raise.rb:179:10:179:19 | ExceptionA | +| break_ensure.rb:1:1:11:3 | Exceptional Exit | break_ensure.rb:8:3:10:5 | After if ... | +| break_ensure.rb:1:1:11:3 | Exit | break_ensure.rb:8:3:10:5 | After if ... | +| break_ensure.rb:2:3:6:5 | After while ... | break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:1:1:11:3 | Entry | +| break_ensure.rb:2:3:10:5 | After ... | break_ensure.rb:8:3:10:5 | After if ... | +| break_ensure.rb:2:9:2:13 | After ... < ... [false] | break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | +| break_ensure.rb:2:9:2:13 | After ... < ... [true] | break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | +| break_ensure.rb:3:8:3:12 | After ... > ... [false] | break_ensure.rb:2:9:2:13 | After ... < ... [true] | +| break_ensure.rb:3:8:3:12 | After ... > ... [true] | break_ensure.rb:2:9:2:13 | After ... < ... [true] | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:7:1:10:5 | ensure ... | +| break_ensure.rb:8:6:8:18 | After call to nil? [false] | break_ensure.rb:7:1:10:5 | ensure ... | +| break_ensure.rb:8:6:8:18 | After call to nil? [true] | break_ensure.rb:7:1:10:5 | ensure ... | +| break_ensure.rb:13:1:25:3 | Exceptional Exit | break_ensure.rb:20:7:22:9 | After if ... | +| break_ensure.rb:13:1:25:3 | Exit | break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | +| break_ensure.rb:14:3:24:5 | After while ... | break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:13:1:25:3 | Entry | +| break_ensure.rb:14:9:14:13 | After ... < ... [false] | break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | +| break_ensure.rb:15:5:23:7 | After begin ... | break_ensure.rb:20:7:22:9 | After if ... | +| break_ensure.rb:16:10:16:14 | After ... > ... [false] | break_ensure.rb:14:9:14:13 | After ... < ... [true] | +| break_ensure.rb:16:10:16:14 | After ... > ... [true] | break_ensure.rb:14:9:14:13 | After ... < ... [true] | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:14:9:14:13 | After ... < ... [true] | +| break_ensure.rb:20:7:22:9 | After if ... | break_ensure.rb:19:5:22:9 | ensure ... | +| break_ensure.rb:20:10:20:15 | After call to nil? [false] | break_ensure.rb:19:5:22:9 | ensure ... | +| break_ensure.rb:20:10:20:15 | After call to nil? [true] | break_ensure.rb:19:5:22:9 | ensure ... | +| break_ensure.rb:27:1:42:3 | Exceptional Exit | break_ensure.rb:33:5:39:7 | After while ... | +| break_ensure.rb:27:1:42:3 | Exit | break_ensure.rb:33:5:39:7 | After while ... | +| break_ensure.rb:27:1:42:3 | Normal Exit | break_ensure.rb:33:5:39:7 | After while ... | +| break_ensure.rb:28:3:40:5 | After begin ... | break_ensure.rb:33:5:39:7 | After while ... | +| break_ensure.rb:29:8:29:13 | After call to nil? [false] | break_ensure.rb:27:1:42:3 | Entry | +| break_ensure.rb:29:8:29:13 | After call to nil? [true] | break_ensure.rb:27:1:42:3 | Entry | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:27:1:42:3 | Entry | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:32:3:39:7 | ensure ... | +| break_ensure.rb:33:11:33:15 | After ... < ... [false] | break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | +| break_ensure.rb:33:11:33:15 | After ... < ... [true] | break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | +| break_ensure.rb:35:12:35:16 | After ... > ... [false] | break_ensure.rb:33:11:33:15 | After ... < ... [true] | +| break_ensure.rb:35:12:35:16 | After ... > ... [true] | break_ensure.rb:33:11:33:15 | After ... < ... [true] | +| break_ensure.rb:44:1:56:3 | Exceptional Exit | break_ensure.rb:51:10:51:14 | After ... > ... [false] | +| break_ensure.rb:44:1:56:3 | Exit | break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | +| break_ensure.rb:45:3:55:5 | After while ... | break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:44:1:56:3 | Entry | +| break_ensure.rb:45:9:45:13 | After ... < ... [false] | break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | +| break_ensure.rb:45:9:45:13 | After ... < ... [true] | break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | +| break_ensure.rb:46:5:54:7 | After begin ... | break_ensure.rb:51:10:51:14 | After ... > ... [false] | +| break_ensure.rb:47:10:47:14 | After ... > ... [false] | break_ensure.rb:45:9:45:13 | After ... < ... [true] | +| break_ensure.rb:47:10:47:14 | After ... > ... [true] | break_ensure.rb:45:9:45:13 | After ... < ... [true] | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:45:9:45:13 | After ... < ... [true] | +| break_ensure.rb:51:10:51:14 | After ... > ... [false] | break_ensure.rb:50:5:53:9 | ensure ... | +| break_ensure.rb:51:10:51:14 | After ... > ... [true] | break_ensure.rb:50:5:53:9 | ensure ... | +| case.rb:2:3:5:5 | After case ... | case.rb:1:1:6:3 | Entry | +| case.rb:3:10:3:10 | After 1 [match] | case.rb:1:1:6:3 | Entry | +| case.rb:3:10:3:10 | After 1 [no-match] | case.rb:1:1:6:3 | Entry | +| case.rb:3:18:3:41 | After if ... | case.rb:3:10:3:10 | After 1 [match] | +| case.rb:3:21:3:22 | After call to x2 [false] | case.rb:3:10:3:10 | After 1 [match] | +| case.rb:3:21:3:22 | After call to x2 [true] | case.rb:3:10:3:10 | After 1 [match] | +| case.rb:4:10:4:10 | After 2 [match] | case.rb:3:10:3:10 | After 1 [no-match] | +| case.rb:4:10:4:10 | After 2 [no-match] | case.rb:3:10:3:10 | After 1 [no-match] | +| case.rb:9:3:17:5 | After case ... | case.rb:8:1:18:3 | Entry | +| case.rb:10:8:10:8 | After 0 [match] | case.rb:8:1:18:3 | Entry | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:8:1:18:3 | Entry | +| case.rb:11:8:11:8 | After 1 [match] | case.rb:10:8:10:8 | After 0 [no-match] | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:10:8:10:8 | After 0 [no-match] | +| case.rb:12:8:12:8 | After 2 [match] | case.rb:11:8:11:8 | After 1 [no-match] | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:11:8:11:8 | After 1 [no-match] | +| case.rb:14:8:14:8 | After x [match] | case.rb:12:8:12:8 | After 2 [no-match] | +| case.rb:14:8:14:8 | After x [no-match] | case.rb:12:8:12:8 | After 2 [no-match] | +| case.rb:14:13:14:18 | After ... == ... [false] | case.rb:14:8:14:8 | After x [match] | +| case.rb:14:13:14:18 | After ... == ... [true] | case.rb:14:8:14:8 | After x [match] | +| case.rb:15:5:15:28 | in ... then ... | case.rb:12:8:12:8 | After 2 [no-match] | +| case.rb:15:8:15:8 | After x [match] | case.rb:15:5:15:28 | in ... then ... | +| case.rb:15:8:15:8 | After x [no-match] | case.rb:15:5:15:28 | in ... then ... | +| case.rb:15:17:15:21 | After ... < ... [false] | case.rb:15:8:15:8 | After x [match] | +| case.rb:15:17:15:21 | After ... < ... [true] | case.rb:15:8:15:8 | After x [match] | +| case.rb:16:5:16:10 | else ... | case.rb:15:5:15:28 | in ... then ... | +| case.rb:21:3:23:5 | After case ... | case.rb:20:1:24:3 | Entry | +| case.rb:22:8:22:8 | After 1 [match] | case.rb:20:1:24:3 | Entry | +| case.rb:22:8:22:8 | After 1 [no-match] | case.rb:20:1:24:3 | Entry | +| case.rb:27:3:29:5 | After case ... | case.rb:26:1:30:3 | Entry | +| case.rb:28:7:28:28 | After -> { ... } [match] | case.rb:26:1:30:3 | Entry | +| case.rb:28:7:28:28 | After -> { ... } [no-match] | case.rb:26:1:30:3 | Entry | +| case.rb:33:3:38:5 | After case ... | case.rb:32:1:39:3 | Entry | +| case.rb:34:8:34:9 | After [ ..., * ] [match] | case.rb:32:1:39:3 | Entry | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:32:1:39:3 | Entry | +| case.rb:35:8:35:10 | After [ ..., * ] [match] | case.rb:34:8:34:9 | After [ ..., * ] [no-match] | +| case.rb:35:8:35:10 | After [ ..., * ] [no-match] | case.rb:34:8:34:9 | After [ ..., * ] [no-match] | +| case.rb:36:8:36:12 | After [ ..., * ] [match] | case.rb:35:8:35:10 | After [ ..., * ] [no-match] | +| case.rb:36:8:36:12 | After [ ..., * ] [no-match] | case.rb:35:8:35:10 | After [ ..., * ] [no-match] | +| case.rb:37:8:37:26 | After [ ..., * ] [match] | case.rb:36:8:36:12 | After [ ..., * ] [no-match] | +| case.rb:37:8:37:26 | After [ ..., * ] [no-match] | case.rb:36:8:36:12 | After [ ..., * ] [no-match] | +| case.rb:42:3:44:5 | After case ... | case.rb:41:1:45:3 | Entry | +| case.rb:43:8:43:21 | After [ *,...,* ] [match] | case.rb:41:1:45:3 | Entry | +| case.rb:43:8:43:21 | After [ *,...,* ] [no-match] | case.rb:41:1:45:3 | Entry | +| case.rb:48:3:52:5 | After case ... | case.rb:47:1:53:3 | Entry | +| case.rb:49:8:49:34 | After { ..., ** } [match] | case.rb:47:1:53:3 | Entry | +| case.rb:49:8:49:34 | After { ..., ** } [no-match] | case.rb:47:1:53:3 | Entry | +| case.rb:50:8:50:24 | After { ..., ** } [match] | case.rb:49:8:49:34 | After { ..., ** } [no-match] | +| case.rb:50:8:50:24 | After { ..., ** } [no-match] | case.rb:49:8:49:34 | After { ..., ** } [no-match] | +| case.rb:51:8:51:16 | After { ..., ** } [match] | case.rb:50:8:50:24 | After { ..., ** } [no-match] | +| case.rb:51:8:51:16 | After { ..., ** } [no-match] | case.rb:50:8:50:24 | After { ..., ** } [no-match] | +| case.rb:56:3:60:5 | After case ... | case.rb:55:1:61:3 | Entry | +| case.rb:57:8:57:8 | After 5 [match] | case.rb:55:1:61:3 | Entry | +| case.rb:57:8:57:8 | After 5 [no-match] | case.rb:55:1:61:3 | Entry | +| case.rb:58:8:58:10 | After var [match] | case.rb:57:8:57:8 | After 5 [no-match] | +| case.rb:58:8:58:10 | After var [no-match] | case.rb:57:8:57:8 | After 5 [no-match] | +| case.rb:59:8:59:20 | After "unreachable" [match] | case.rb:58:8:58:10 | After var [no-match] | +| case.rb:59:8:59:20 | After "unreachable" [no-match] | case.rb:58:8:58:10 | After var [no-match] | +| case.rb:64:3:66:5 | After case ... | case.rb:63:1:67:3 | Entry | +| case.rb:65:8:65:28 | After ... \| ... [match] | case.rb:63:1:67:3 | Entry | +| case.rb:65:8:65:28 | After ... \| ... [no-match] | case.rb:63:1:67:3 | Entry | +| case.rb:72:3:92:5 | After case ... | case.rb:69:1:93:3 | Entry | +| case.rb:73:8:73:8 | After 5 [match] | case.rb:69:1:93:3 | Entry | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:69:1:93:3 | Entry | +| case.rb:74:8:74:11 | After ^... [match] | case.rb:73:8:73:8 | After 5 [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:73:8:73:8 | After 5 [no-match] | +| case.rb:75:8:75:15 | After "string" [match] | case.rb:74:8:74:11 | After ^... [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:74:8:74:11 | After ^... [no-match] | +| case.rb:76:8:76:18 | After call to [] [match] | case.rb:75:8:75:15 | After "string" [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:75:8:75:15 | After "string" [no-match] | +| case.rb:77:8:77:18 | After call to [] [match] | case.rb:76:8:76:18 | After call to [] [no-match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:76:8:76:18 | After call to [] [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | case.rb:77:8:77:18 | After call to [] [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:77:8:77:18 | After call to [] [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | +| case.rb:80:8:80:12 | After _ .. _ [match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | +| case.rb:81:8:81:11 | After _ .. _ [match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | +| case.rb:82:8:82:13 | After ... => ... [match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | +| case.rb:83:8:83:26 | After ... \| ... [match] | case.rb:82:8:82:13 | After ... => ... [no-match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | +| case.rb:84:8:84:17 | After Bar [match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:85:8:85:23 | After -> { ... } [match] | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:86:8:86:11 | After :foo [match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:87:8:87:17 | After :"foo bar" [match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:88:8:88:15 | After ... \| ... [match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:89:8:89:69 | After ... \| ... [match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:89:8:89:69 | After ... \| ... [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:90:8:90:13 | After ( ... ) [match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:90:8:90:13 | After ( ... ) [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:91:8:91:25 | After ( ... ) [match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:91:8:91:25 | After ( ... ) [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:96:3:98:5 | After case ... | case.rb:95:1:99:3 | Entry | +| case.rb:97:8:97:8 | After x [match] | case.rb:95:1:99:3 | Entry | +| case.rb:97:8:97:8 | After x [no-match] | case.rb:95:1:99:3 | Entry | +| case.rb:97:13:97:18 | After ... == ... [false] | case.rb:97:8:97:8 | After x [match] | +| case.rb:97:13:97:18 | After ... == ... [true] | case.rb:97:8:97:8 | After x [match] | +| cfg.html.erb:18:14:22:16 | After if ... | cfg.html.erb:5:16:31:12 | Entry | +| cfg.html.erb:18:17:18:22 | After call to admin? [false] | cfg.html.erb:5:16:31:12 | Entry | +| cfg.html.erb:18:17:18:22 | After call to admin? [true] | cfg.html.erb:5:16:31:12 | Entry | +| cfg.rb:1:1:221:1 | Exceptional Exit | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:1:1:221:1 | Exit | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:42:8:42:8 | After 1 [match] | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:43:3:43:31 | After when ... [match] | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:43:8:43:8 | After 2 [match] | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:43:8:43:8 | After 2 [no-match] | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:43:11:43:11 | After 3 [match] | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:43:11:43:11 | After 3 [no-match] | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:43:14:43:14 | After 4 [match] | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:43:14:43:14 | After 4 [no-match] | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:48:8:48:13 | After ... == ... [match] | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:48:8:48:13 | After ... == ... [no-match] | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:49:3:49:37 | After when ... [match] | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:49:8:49:13 | After ... == ... [match] | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:49:8:49:13 | After ... == ... [no-match] | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:49:16:49:20 | After ... > ... [match] | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:49:16:49:20 | After ... > ... [no-match] | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:60:17:60:22 | After ... < ... [false] | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:60:17:60:22 | After ... < ... [true] | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:75:4:75:8 | After ... < ... [false] | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:75:4:75:8 | After ... < ... [true] | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:75:17:75:43 | After elsif ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:75:23:75:28 | After ... > ... [false] | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:75:23:75:28 | After ... > ... [true] | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:90:1:93:3 | Normal Exit | cfg.rb:90:1:93:3 | Entry | +| cfg.rb:90:5:90:5 | After defined? ... [false] | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:90:5:90:5 | After defined? ... [true] | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:91:6:91:10 | After ... > ... [false] | cfg.rb:90:1:93:3 | Entry | +| cfg.rb:91:6:91:10 | After ... > ... [true] | cfg.rb:90:1:93:3 | Entry | +| cfg.rb:101:16:101:20 | After value [match] | cfg.rb:101:1:104:3 | Entry | +| cfg.rb:101:16:101:20 | After value [no-match] | cfg.rb:101:1:104:3 | Entry | +| cfg.rb:101:28:101:30 | key | cfg.rb:101:1:104:3 | Entry | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:113:14:113:19 | After ... > ... [false] | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:113:14:113:19 | After ... > ... [true] | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:136:1:136:3 | After ... / ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:136:12:136:29 | Before call to puts | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:172:8:172:14 | After ... == ... [false] | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:172:8:172:14 | After ... == ... [true] | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:174:18:174:23 | After ... == ... [false] | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:174:18:174:23 | After ... == ... [true] | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:176:7:176:12 | After ... > ... [false] | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:179:30:179:36 | After ... == ... [false] | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:182:7:182:12 | After ... < ... [true] | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:182:14:186:3 | do ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:184:6:184:11 | After ... == ... [false] | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:184:6:184:11 | After ... == ... [true] | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:188:30:188:35 | After ... != ... [true] | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:205:4:205:5 | After call to == [false] | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:205:4:205:5 | After call to == [true] | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [false] | constant_compound_assign.rb:1:1:22:4 | Entry | +| constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [true] | constant_compound_assign.rb:1:1:22:4 | Entry | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:1:1:22:4 | Entry | +| constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [false] | constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | +| constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [true] | constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | +| constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [false] | constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | +| constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [true] | constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | +| constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | +| exit.rb:1:1:6:3 | Exit | exit.rb:1:1:6:3 | Entry | +| exit.rb:2:6:2:10 | After ... > ... [false] | exit.rb:1:1:6:3 | Entry | +| exit.rb:2:6:2:10 | After ... > ... [true] | exit.rb:1:1:6:3 | Entry | +| exit.rb:8:1:13:3 | Exit | exit.rb:8:1:13:3 | Entry | +| exit.rb:9:6:9:10 | After ... > ... [false] | exit.rb:8:1:13:3 | Entry | +| exit.rb:9:6:9:10 | After ... > ... [true] | exit.rb:8:1:13:3 | Entry | +| ifs.rb:2:3:8:5 | After if ... | ifs.rb:1:1:9:3 | Entry | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:1:1:9:3 | Entry | +| ifs.rb:2:6:2:10 | After ... > ... [true] | ifs.rb:1:1:9:3 | Entry | +| ifs.rb:4:3:7:35 | After elsif ... | ifs.rb:2:6:2:10 | After ... > ... [false] | +| ifs.rb:4:9:4:14 | After ... <= ... [false] | ifs.rb:2:6:2:10 | After ... > ... [false] | +| ifs.rb:4:9:4:14 | After ... <= ... [true] | ifs.rb:2:6:2:10 | After ... > ... [false] | +| ifs.rb:4:9:4:24 | After ... and ... [false] | ifs.rb:2:6:2:10 | After ... > ... [false] | +| ifs.rb:4:9:4:38 | After ... and ... [false] | ifs.rb:2:6:2:10 | After ... > ... [false] | +| ifs.rb:4:20:4:24 | After ... > ... [false] | ifs.rb:4:9:4:14 | After ... <= ... [true] | +| ifs.rb:4:20:4:24 | After ... > ... [true] | ifs.rb:4:9:4:14 | After ... <= ... [true] | +| ifs.rb:4:32:4:37 | After ... == ... [false] | ifs.rb:4:20:4:24 | After ... > ... [true] | +| ifs.rb:4:32:4:37 | After ... == ... [true] | ifs.rb:4:20:4:24 | After ... > ... [true] | +| ifs.rb:11:1:16:3 | Normal Exit | ifs.rb:11:1:16:3 | Entry | +| ifs.rb:12:6:12:6 | After b [false] | ifs.rb:11:1:16:3 | Entry | +| ifs.rb:12:6:12:6 | After b [true] | ifs.rb:11:1:16:3 | Entry | +| ifs.rb:19:3:24:5 | After if ... | ifs.rb:18:1:26:3 | Entry | +| ifs.rb:19:6:19:10 | After ... < ... [false] | ifs.rb:18:1:26:3 | Entry | +| ifs.rb:19:6:19:10 | After ... < ... [true] | ifs.rb:18:1:26:3 | Entry | +| ifs.rb:21:5:23:7 | After if ... | ifs.rb:19:6:19:10 | After ... < ... [true] | +| ifs.rb:21:8:21:13 | After ... > ... [false] | ifs.rb:19:6:19:10 | After ... < ... [true] | +| ifs.rb:21:8:21:13 | After ... > ... [true] | ifs.rb:19:6:19:10 | After ... < ... [true] | +| ifs.rb:29:10:29:51 | After ... ? ... : ... | ifs.rb:28:1:30:3 | Entry | +| ifs.rb:29:11:29:12 | After b1 [false] | ifs.rb:28:1:30:3 | Entry | +| ifs.rb:29:11:29:12 | After b1 [true] | ifs.rb:28:1:30:3 | Entry | +| ifs.rb:29:11:29:22 | After ... ? ... : ... [false] | ifs.rb:28:1:30:3 | Entry | +| ifs.rb:29:11:29:22 | After ... ? ... : ... [true] | ifs.rb:28:1:30:3 | Entry | +| ifs.rb:29:16:29:17 | After b2 [false] | ifs.rb:29:11:29:12 | After b1 [true] | +| ifs.rb:29:16:29:17 | After b2 [true] | ifs.rb:29:11:29:12 | After b1 [true] | +| ifs.rb:29:21:29:22 | After b3 [false] | ifs.rb:29:11:29:12 | After b1 [false] | +| ifs.rb:29:21:29:22 | After b3 [true] | ifs.rb:29:11:29:12 | After b1 [false] | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:32:1:34:3 | Entry | +| ifs.rb:33:7:33:48 | After if ... [false] | ifs.rb:32:1:34:3 | Entry | +| ifs.rb:33:7:33:48 | After if ... [true] | ifs.rb:32:1:34:3 | Entry | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:32:1:34:3 | Entry | +| ifs.rb:33:10:33:11 | After b1 [true] | ifs.rb:32:1:34:3 | Entry | +| ifs.rb:33:18:33:19 | After b2 [false] | ifs.rb:33:10:33:11 | After b1 [true] | +| ifs.rb:33:18:33:19 | After b2 [true] | ifs.rb:33:10:33:11 | After b1 [true] | +| ifs.rb:33:21:33:44 | After elsif ... [false] | ifs.rb:33:10:33:11 | After b1 [false] | +| ifs.rb:33:21:33:44 | After elsif ... [true] | ifs.rb:33:10:33:11 | After b1 [false] | +| ifs.rb:33:27:33:28 | After b3 [false] | ifs.rb:33:10:33:11 | After b1 [false] | +| ifs.rb:33:27:33:28 | After b3 [true] | ifs.rb:33:10:33:11 | After b1 [false] | +| ifs.rb:33:35:33:36 | After b4 [false] | ifs.rb:33:27:33:28 | After b3 [true] | +| ifs.rb:33:35:33:36 | After b4 [true] | ifs.rb:33:27:33:28 | After b3 [true] | +| ifs.rb:33:43:33:44 | After b5 [false] | ifs.rb:33:27:33:28 | After b3 [false] | +| ifs.rb:33:43:33:44 | After b5 [true] | ifs.rb:33:27:33:28 | After b3 [false] | +| ifs.rb:36:1:38:17 | After ... unless ... | ifs.rb:1:1:58:4 | Entry | +| ifs.rb:38:12:38:17 | After ... == ... [false] | ifs.rb:1:1:58:4 | Entry | +| ifs.rb:38:12:38:17 | After ... == ... [true] | ifs.rb:1:1:58:4 | Entry | +| ifs.rb:47:3:50:5 | After if ... | ifs.rb:46:1:52:3 | Entry | +| ifs.rb:47:6:47:6 | After b [false] | ifs.rb:46:1:52:3 | Entry | +| ifs.rb:47:6:47:6 | After b [true] | ifs.rb:46:1:52:3 | Entry | +| ifs.rb:55:3:57:5 | After if ... | ifs.rb:54:1:58:3 | Entry | +| ifs.rb:55:7:55:8 | After b1 [false] | ifs.rb:54:1:58:3 | Entry | +| ifs.rb:55:7:55:8 | After b1 [true] | ifs.rb:54:1:58:3 | Entry | +| ifs.rb:55:7:55:14 | After ... \|\| ... [true] | ifs.rb:54:1:58:3 | Entry | +| ifs.rb:55:13:55:14 | After b2 [false] | ifs.rb:55:7:55:8 | After b1 [false] | +| ifs.rb:55:13:55:14 | After b2 [true] | ifs.rb:55:7:55:8 | After b1 [false] | +| loops.rb:2:3:5:5 | [LoopHeader] while ... | loops.rb:1:1:6:3 | Entry | +| loops.rb:2:9:2:14 | After ... >= ... [false] | loops.rb:2:3:5:5 | [LoopHeader] while ... | +| loops.rb:2:9:2:14 | After ... >= ... [true] | loops.rb:2:3:5:5 | [LoopHeader] while ... | +| loops.rb:9:3:20:5 | After while ... | loops.rb:9:3:20:5 | [LoopHeader] while ... | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:8:1:22:3 | Entry | +| loops.rb:9:9:9:14 | After ... >= ... [false] | loops.rb:9:3:20:5 | [LoopHeader] while ... | +| loops.rb:9:9:9:14 | After ... >= ... [true] | loops.rb:9:3:20:5 | [LoopHeader] while ... | +| loops.rb:9:15:20:5 | do ... | loops.rb:9:9:9:14 | After ... >= ... [true] | +| loops.rb:12:8:12:14 | After ... > ... [false] | loops.rb:9:15:20:5 | do ... | +| loops.rb:12:8:12:14 | After ... > ... [true] | loops.rb:9:15:20:5 | do ... | +| loops.rb:14:11:14:16 | After ... > ... [false] | loops.rb:12:8:12:14 | After ... > ... [false] | +| loops.rb:14:11:14:16 | After ... > ... [true] | loops.rb:12:8:12:14 | After ... > ... [false] | +| loops.rb:16:11:16:16 | After ... > ... [false] | loops.rb:14:11:14:16 | After ... > ... [false] | +| loops.rb:16:11:16:16 | After ... > ... [true] | loops.rb:14:11:14:16 | After ... > ... [false] | +| loops.rb:31:3:32:5 | [LoopHeader] while ... | loops.rb:30:1:33:3 | Entry | +| loops.rb:31:9:31:13 | After ... < ... [false] | loops.rb:31:3:32:5 | [LoopHeader] while ... | +| loops.rb:31:9:31:13 | After ... < ... [true] | loops.rb:31:3:32:5 | [LoopHeader] while ... | +| raise.rb:7:1:12:3 | Exit | raise.rb:7:1:12:3 | Entry | +| raise.rb:8:6:8:10 | After ... > ... [false] | raise.rb:7:1:12:3 | Entry | +| raise.rb:8:6:8:10 | After ... > ... [true] | raise.rb:7:1:12:3 | Entry | +| raise.rb:14:1:23:3 | Exit | raise.rb:14:1:23:3 | Entry | +| raise.rb:15:3:21:5 | After begin ... | raise.rb:14:1:23:3 | Entry | +| raise.rb:16:8:16:8 | After b [false] | raise.rb:14:1:23:3 | Entry | +| raise.rb:16:8:16:8 | After b [true] | raise.rb:14:1:23:3 | Entry | +| raise.rb:19:10:19:19 | After ExceptionA [match] | raise.rb:16:8:16:8 | After b [true] | +| raise.rb:19:10:19:19 | After ExceptionA [no-match] | raise.rb:16:8:16:8 | After b [true] | +| raise.rb:26:3:32:5 | After begin ... | raise.rb:25:1:34:3 | Entry | +| raise.rb:27:8:27:8 | After b [false] | raise.rb:25:1:34:3 | Entry | +| raise.rb:27:8:27:8 | After b [true] | raise.rb:25:1:34:3 | Entry | +| raise.rb:37:3:43:5 | After begin ... | raise.rb:36:1:45:3 | Entry | +| raise.rb:38:8:38:8 | After b [false] | raise.rb:36:1:45:3 | Entry | +| raise.rb:38:8:38:8 | After b [true] | raise.rb:36:1:45:3 | Entry | +| raise.rb:48:3:53:5 | After begin ... | raise.rb:47:1:55:3 | Entry | +| raise.rb:49:8:49:8 | After b [false] | raise.rb:47:1:55:3 | Entry | +| raise.rb:49:8:49:8 | After b [true] | raise.rb:47:1:55:3 | Entry | +| raise.rb:57:1:66:3 | Exit | raise.rb:57:1:66:3 | Entry | +| raise.rb:58:3:64:5 | After begin ... | raise.rb:57:1:66:3 | Entry | +| raise.rb:59:8:59:8 | After b [false] | raise.rb:57:1:66:3 | Entry | +| raise.rb:59:8:59:8 | After b [true] | raise.rb:57:1:66:3 | Entry | +| raise.rb:62:10:62:31 | After ..., ... [match] | raise.rb:59:8:59:8 | After b [true] | +| raise.rb:62:10:62:31 | After ..., ... [no-match] | raise.rb:59:8:59:8 | After b [true] | +| raise.rb:68:1:77:3 | Exceptional Exit | raise.rb:75:1:76:15 | ensure ... | +| raise.rb:68:1:77:3 | Exit | raise.rb:75:1:76:15 | ensure ... | +| raise.rb:68:1:77:3 | Normal Exit | raise.rb:75:1:76:15 | ensure ... | +| raise.rb:69:3:76:15 | After ... | raise.rb:75:1:76:15 | ensure ... | +| raise.rb:69:6:69:10 | After ... > ... [false] | raise.rb:68:1:77:3 | Entry | +| raise.rb:69:6:69:10 | After ... > ... [true] | raise.rb:68:1:77:3 | Entry | +| raise.rb:71:9:71:13 | After ... < ... [false] | raise.rb:69:6:69:10 | After ... > ... [false] | +| raise.rb:71:9:71:13 | After ... < ... [true] | raise.rb:69:6:69:10 | After ... > ... [false] | +| raise.rb:74:3:74:20 | After call to puts | raise.rb:71:9:71:13 | After ... < ... [false] | +| raise.rb:75:1:76:15 | ensure ... | raise.rb:68:1:77:3 | Entry | +| raise.rb:79:1:92:3 | Exceptional Exit | raise.rb:88:3:89:17 | ensure ... | +| raise.rb:79:1:92:3 | Exit | raise.rb:88:3:89:17 | ensure ... | +| raise.rb:79:1:92:3 | Normal Exit | raise.rb:88:3:89:17 | ensure ... | +| raise.rb:81:3:90:5 | After begin ... | raise.rb:88:3:89:17 | ensure ... | +| raise.rb:82:8:82:12 | After ... > ... [false] | raise.rb:79:1:92:3 | Entry | +| raise.rb:82:8:82:12 | After ... > ... [true] | raise.rb:79:1:92:3 | Entry | +| raise.rb:84:11:84:15 | After ... < ... [false] | raise.rb:82:8:82:12 | After ... > ... [false] | +| raise.rb:84:11:84:15 | After ... < ... [true] | raise.rb:82:8:82:12 | After ... > ... [false] | +| raise.rb:87:5:87:22 | After call to puts | raise.rb:84:11:84:15 | After ... < ... [false] | +| raise.rb:88:3:89:17 | ensure ... | raise.rb:79:1:92:3 | Entry | +| raise.rb:94:1:119:3 | Exceptional Exit | raise.rb:114:1:118:5 | ensure ... | +| raise.rb:94:1:119:3 | Exit | raise.rb:114:1:118:5 | ensure ... | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:116:6:116:7 | After b2 [false] | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:94:1:119:3 | Entry | +| raise.rb:95:3:118:5 | After ... | raise.rb:116:6:116:7 | After b2 [false] | +| raise.rb:96:3:112:5 | After begin ... | raise.rb:105:5:111:7 | After begin ... | +| raise.rb:97:8:97:12 | After ... > ... [false] | raise.rb:95:3:95:17 | After call to puts | +| raise.rb:97:8:97:12 | After ... > ... [true] | raise.rb:95:3:95:17 | After call to puts | +| raise.rb:99:11:99:15 | After ... < ... [false] | raise.rb:97:8:97:12 | After ... > ... [false] | +| raise.rb:99:11:99:15 | After ... < ... [true] | raise.rb:97:8:97:12 | After ... > ... [false] | +| raise.rb:102:5:102:22 | After call to puts | raise.rb:99:11:99:15 | After ... < ... [false] | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:95:3:95:17 | After call to puts | +| raise.rb:104:5:104:23 | After call to puts | raise.rb:103:3:111:7 | ensure ... | +| raise.rb:105:5:111:7 | After begin ... | raise.rb:110:7:110:25 | After call to puts | +| raise.rb:106:10:106:11 | After b1 [false] | raise.rb:104:5:104:23 | After call to puts | +| raise.rb:106:10:106:11 | After b1 [true] | raise.rb:104:5:104:23 | After call to puts | +| raise.rb:109:5:110:25 | ensure ... | raise.rb:104:5:104:23 | After call to puts | +| raise.rb:110:7:110:25 | After call to puts | raise.rb:109:5:110:25 | ensure ... | +| raise.rb:113:3:113:15 | After call to puts | raise.rb:96:3:112:5 | After begin ... | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:94:1:119:3 | Entry | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:114:1:118:5 | ensure ... | +| raise.rb:116:6:116:7 | After b2 [true] | raise.rb:114:1:118:5 | ensure ... | +| raise.rb:121:1:126:3 | Exit | raise.rb:121:1:126:3 | Entry | +| raise.rb:121:9:121:9 | After p [match] | raise.rb:121:1:126:3 | Entry | +| raise.rb:121:9:121:9 | After p [no-match] | raise.rb:121:1:126:3 | Entry | +| raise.rb:128:1:140:3 | Exceptional Exit | raise.rb:136:3:137:17 | ensure ... | +| raise.rb:128:1:140:3 | Exit | raise.rb:136:3:137:17 | ensure ... | +| raise.rb:129:3:138:5 | After begin ... | raise.rb:136:3:137:17 | ensure ... | +| raise.rb:130:8:130:8 | After b [false] | raise.rb:128:1:140:3 | Entry | +| raise.rb:130:8:130:8 | After b [true] | raise.rb:128:1:140:3 | Entry | +| raise.rb:133:10:133:19 | After ExceptionA [match] | raise.rb:130:8:130:8 | After b [true] | +| raise.rb:133:10:133:19 | After ExceptionA [no-match] | raise.rb:130:8:130:8 | After b [true] | +| raise.rb:134:10:134:19 | After ExceptionB [match] | raise.rb:133:10:133:19 | After ExceptionA [no-match] | +| raise.rb:134:10:134:19 | After ExceptionB [no-match] | raise.rb:133:10:133:19 | After ExceptionA [no-match] | +| raise.rb:136:3:137:17 | ensure ... | raise.rb:128:1:140:3 | Entry | +| raise.rb:143:6:143:6 | After b [false] | raise.rb:142:1:148:3 | Entry | +| raise.rb:143:6:143:6 | After b [true] | raise.rb:142:1:148:3 | Entry | +| raise.rb:146:1:147:10 | ensure ... | raise.rb:142:1:148:3 | Entry | +| raise.rb:155:16:155:50 | Exit | raise.rb:155:16:155:50 | Entry | +| raise.rb:155:37:155:48 | After call to nil? [false] | raise.rb:155:16:155:50 | Entry | +| raise.rb:155:37:155:48 | After call to nil? [true] | raise.rb:155:16:155:50 | Entry | +| raise.rb:160:9:162:7 | Exit | raise.rb:160:9:162:7 | Entry | +| raise.rb:161:23:161:23 | After x [false] | raise.rb:160:9:162:7 | Entry | +| raise.rb:161:23:161:23 | After x [true] | raise.rb:160:9:162:7 | Entry | +| raise.rb:172:1:182:3 | Exit | raise.rb:172:1:182:3 | Entry | +| raise.rb:172:1:182:3 | Normal Exit | raise.rb:172:1:182:3 | Entry | +| raise.rb:174:8:174:9 | After b1 [false] | raise.rb:172:1:182:3 | Entry | +| raise.rb:174:8:174:9 | After b1 [true] | raise.rb:172:1:182:3 | Entry | +| raise.rb:174:8:174:23 | After ... \|\| ... [true] | raise.rb:172:1:182:3 | Entry | +| raise.rb:174:14:174:23 | After ... == ... [false] | raise.rb:174:8:174:9 | After b1 [false] | +| raise.rb:174:14:174:23 | After ... == ... [true] | raise.rb:174:8:174:9 | After b1 [false] | +| raise.rb:179:3:180:12 | rescue ... | raise.rb:174:8:174:9 | After b1 [false] | +| raise.rb:179:10:179:19 | After ExceptionA [match] | raise.rb:179:3:180:12 | rescue ... | +| raise.rb:179:10:179:19 | After ExceptionA [no-match] | raise.rb:179:3:180:12 | rescue ... | controls -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:9:5:9:23 | self | true | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:3:5:5:7 | if ... | true | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:3:8:3:8 | x | true | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:4:7:4:11 | break | true | -| break_ensure.rb:3:8:3:8 | x | break_ensure.rb:3:5:5:7 | if ... | false | -| break_ensure.rb:3:8:3:8 | x | break_ensure.rb:4:7:4:11 | break | true | -| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:9:5:9:23 | [ensure: exception] self | true | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:16:7:18:9 | if ... | true | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:16:10:16:10 | x | true | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:17:9:17:13 | break | true | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | true | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | true | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | if ... | true | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:10:20:10 | [ensure: exception] y | true | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:21:9:21:20 | [ensure: break] self | true | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:21:9:21:20 | [ensure: exception] self | true | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:21:9:21:20 | self | true | -| break_ensure.rb:16:7:18:9 | if ... | break_ensure.rb:21:9:21:20 | self | true | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:16:7:18:9 | if ... | false | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:17:9:17:13 | break | true | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | true | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:20:7:22:9 | if ... | false | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:21:9:21:20 | [ensure: break] self | true | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:21:9:21:20 | self | false | -| break_ensure.rb:17:9:17:13 | break | break_ensure.rb:21:9:21:20 | [ensure: break] self | true | -| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:21:9:21:20 | [ensure: exception] self | true | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:29:5:31:7 | if ... | false | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:30:7:30:12 | return | true | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | true | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:5:39:7 | while ... | false | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:11:33:11 | [ensure: return] y | true | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:11:33:11 | y | false | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | true | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:9:37:11 | if ... | false | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:12:35:12 | [ensure: return] x | true | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:12:35:12 | x | false | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:36:11:36:15 | [ensure: return] break | true | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:36:11:36:15 | break | false | -| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | true | -| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:35:12:35:12 | [ensure: exception] x | true | -| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:36:11:36:15 | [ensure: exception] break | true | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | true | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:35:12:35:12 | [ensure: return] x | true | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:36:11:36:15 | [ensure: return] break | true | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:35:9:37:11 | if ... | true | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:35:12:35:12 | x | true | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:36:11:36:15 | break | true | -| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | false | -| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:36:11:36:15 | [ensure: exception] break | true | -| break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | false | -| break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:36:11:36:15 | [ensure: return] break | true | -| break_ensure.rb:35:12:35:12 | x | break_ensure.rb:35:9:37:11 | if ... | false | -| break_ensure.rb:35:12:35:12 | x | break_ensure.rb:36:11:36:15 | break | true | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:47:7:49:9 | if ... | true | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:47:10:47:10 | x | true | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:48:9:48:16 | self | true | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | true | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:7:53:9 | if ... | true | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:10:51:10 | [ensure: exception] x | true | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:52:15:52:16 | 10 | true | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | true | -| break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:51:7:53:9 | if ... | false | -| break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:52:15:52:16 | 10 | true | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:47:7:49:9 | if ... | false | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:48:9:48:16 | self | true | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:51:7:53:9 | if ... | false | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:52:15:52:16 | 10 | false | -| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | false | -| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | true | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:3:5:3:42 | [match] when ... | match | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:3:5:3:42 | [no-match] when ... | no-match | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:3:18:3:41 | if ... | match | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:3:21:3:22 | self | match | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:3:29:3:37 | self | match | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:4:5:4:24 | [match] when ... | no-match | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:4:5:4:24 | [no-match] when ... | no-match | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:4:10:4:10 | 2 | no-match | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:4:17:4:24 | self | no-match | -| case.rb:3:5:3:42 | [match] when ... | case.rb:3:18:3:41 | if ... | match | -| case.rb:3:5:3:42 | [match] when ... | case.rb:3:21:3:22 | self | match | -| case.rb:3:5:3:42 | [match] when ... | case.rb:3:29:3:37 | self | match | -| case.rb:3:5:3:42 | [no-match] when ... | case.rb:4:5:4:24 | [match] when ... | no-match | -| case.rb:3:5:3:42 | [no-match] when ... | case.rb:4:5:4:24 | [no-match] when ... | no-match | -| case.rb:3:5:3:42 | [no-match] when ... | case.rb:4:10:4:10 | 2 | no-match | -| case.rb:3:5:3:42 | [no-match] when ... | case.rb:4:17:4:24 | self | no-match | -| case.rb:3:21:3:22 | self | case.rb:3:29:3:37 | self | true | -| case.rb:4:5:4:24 | [match] when ... | case.rb:4:17:4:24 | self | match | -| case.rb:4:10:4:10 | 2 | case.rb:4:5:4:24 | [match] when ... | match | -| case.rb:4:10:4:10 | 2 | case.rb:4:5:4:24 | [no-match] when ... | no-match | -| case.rb:4:10:4:10 | 2 | case.rb:4:17:4:24 | self | match | -| case.rb:8:1:18:3 | enter case_match | case.rb:11:5:11:15 | in ... then ... | no-match | -| case.rb:8:1:18:3 | enter case_match | case.rb:11:15:11:15 | 3 | no-match | -| case.rb:8:1:18:3 | enter case_match | case.rb:12:5:13:7 | in ... then ... | no-match | -| case.rb:8:1:18:3 | enter case_match | case.rb:13:7:13:7 | 4 | no-match | -| case.rb:8:1:18:3 | enter case_match | case.rb:14:5:14:25 | in ... then ... | no-match | -| case.rb:8:1:18:3 | enter case_match | case.rb:14:13:14:13 | x | no-match | -| case.rb:8:1:18:3 | enter case_match | case.rb:14:25:14:25 | 6 | no-match | -| case.rb:8:1:18:3 | enter case_match | case.rb:15:5:15:28 | in ... then ... | no-match | -| case.rb:8:1:18:3 | enter case_match | case.rb:15:17:15:17 | x | no-match | -| case.rb:8:1:18:3 | enter case_match | case.rb:15:28:15:28 | 7 | no-match | -| case.rb:8:1:18:3 | enter case_match | case.rb:16:10:16:10 | 8 | no-match | -| case.rb:11:5:11:15 | in ... then ... | case.rb:11:15:11:15 | 3 | match | -| case.rb:11:5:11:15 | in ... then ... | case.rb:12:5:13:7 | in ... then ... | no-match | -| case.rb:11:5:11:15 | in ... then ... | case.rb:13:7:13:7 | 4 | no-match | -| case.rb:11:5:11:15 | in ... then ... | case.rb:14:5:14:25 | in ... then ... | no-match | -| case.rb:11:5:11:15 | in ... then ... | case.rb:14:13:14:13 | x | no-match | -| case.rb:11:5:11:15 | in ... then ... | case.rb:14:25:14:25 | 6 | no-match | -| case.rb:11:5:11:15 | in ... then ... | case.rb:15:5:15:28 | in ... then ... | no-match | -| case.rb:11:5:11:15 | in ... then ... | case.rb:15:17:15:17 | x | no-match | -| case.rb:11:5:11:15 | in ... then ... | case.rb:15:28:15:28 | 7 | no-match | -| case.rb:11:5:11:15 | in ... then ... | case.rb:16:10:16:10 | 8 | no-match | -| case.rb:12:5:13:7 | in ... then ... | case.rb:13:7:13:7 | 4 | match | -| case.rb:12:5:13:7 | in ... then ... | case.rb:14:5:14:25 | in ... then ... | no-match | -| case.rb:12:5:13:7 | in ... then ... | case.rb:14:13:14:13 | x | no-match | -| case.rb:12:5:13:7 | in ... then ... | case.rb:14:25:14:25 | 6 | no-match | -| case.rb:12:5:13:7 | in ... then ... | case.rb:15:5:15:28 | in ... then ... | no-match | -| case.rb:12:5:13:7 | in ... then ... | case.rb:15:17:15:17 | x | no-match | -| case.rb:12:5:13:7 | in ... then ... | case.rb:15:28:15:28 | 7 | no-match | -| case.rb:12:5:13:7 | in ... then ... | case.rb:16:10:16:10 | 8 | no-match | -| case.rb:14:5:14:25 | in ... then ... | case.rb:14:13:14:13 | x | match | -| case.rb:14:5:14:25 | in ... then ... | case.rb:14:25:14:25 | 6 | match | -| case.rb:14:5:14:25 | in ... then ... | case.rb:15:5:15:28 | in ... then ... | match | -| case.rb:14:5:14:25 | in ... then ... | case.rb:15:17:15:17 | x | match | -| case.rb:14:5:14:25 | in ... then ... | case.rb:15:28:15:28 | 7 | match | -| case.rb:14:5:14:25 | in ... then ... | case.rb:16:10:16:10 | 8 | match | -| case.rb:14:13:14:13 | x | case.rb:14:25:14:25 | 6 | true | -| case.rb:14:13:14:13 | x | case.rb:15:5:15:28 | in ... then ... | false | -| case.rb:14:13:14:13 | x | case.rb:15:17:15:17 | x | false | -| case.rb:14:13:14:13 | x | case.rb:15:28:15:28 | 7 | false | -| case.rb:14:13:14:13 | x | case.rb:16:10:16:10 | 8 | false | -| case.rb:15:5:15:28 | in ... then ... | case.rb:15:17:15:17 | x | match | -| case.rb:15:5:15:28 | in ... then ... | case.rb:15:28:15:28 | 7 | match | -| case.rb:15:5:15:28 | in ... then ... | case.rb:16:10:16:10 | 8 | match | -| case.rb:15:17:15:17 | x | case.rb:15:28:15:28 | 7 | false | -| case.rb:15:17:15:17 | x | case.rb:16:10:16:10 | 8 | true | -| case.rb:20:1:24:3 | enter case_match_no_match | case.rb:21:3:23:5 | case ... | match | -| case.rb:26:1:30:3 | enter case_match_raise | case.rb:27:3:29:5 | case ... | match | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:32:1:39:3 | exit case_match_array (abnormal) | no-match | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:35:5:35:11 | in ... then ... | no-match | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:35:9:35:9 | x | no-match | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:36:5:36:13 | in ... then ... | no-match | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:36:9:36:9 | x | no-match | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:37:5:37:27 | in ... then ... | no-match | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:37:8:37:26 | [ ..., * ] | no-match | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:37:12:37:12 | a | no-match | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:37:15:37:15 | b | no-match | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:37:19:37:19 | c | no-match | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:37:25:37:25 | e | no-match | -| case.rb:35:5:35:11 | in ... then ... | case.rb:32:1:39:3 | exit case_match_array (abnormal) | no-match | -| case.rb:35:5:35:11 | in ... then ... | case.rb:35:9:35:9 | x | false | -| case.rb:35:5:35:11 | in ... then ... | case.rb:35:9:35:9 | x | match | -| case.rb:35:5:35:11 | in ... then ... | case.rb:35:9:35:9 | x | true | -| case.rb:35:5:35:11 | in ... then ... | case.rb:36:5:36:13 | in ... then ... | no-match | -| case.rb:35:5:35:11 | in ... then ... | case.rb:36:9:36:9 | x | no-match | -| case.rb:35:5:35:11 | in ... then ... | case.rb:37:5:37:27 | in ... then ... | no-match | -| case.rb:35:5:35:11 | in ... then ... | case.rb:37:8:37:26 | [ ..., * ] | no-match | -| case.rb:35:5:35:11 | in ... then ... | case.rb:37:12:37:12 | a | no-match | -| case.rb:35:5:35:11 | in ... then ... | case.rb:37:15:37:15 | b | no-match | -| case.rb:35:5:35:11 | in ... then ... | case.rb:37:19:37:19 | c | no-match | -| case.rb:35:5:35:11 | in ... then ... | case.rb:37:25:37:25 | e | no-match | -| case.rb:36:5:36:13 | in ... then ... | case.rb:32:1:39:3 | exit case_match_array (abnormal) | no-match | -| case.rb:36:5:36:13 | in ... then ... | case.rb:36:9:36:9 | x | false | -| case.rb:36:5:36:13 | in ... then ... | case.rb:36:9:36:9 | x | match | -| case.rb:36:5:36:13 | in ... then ... | case.rb:36:9:36:9 | x | true | -| case.rb:36:5:36:13 | in ... then ... | case.rb:37:5:37:27 | in ... then ... | no-match | -| case.rb:36:5:36:13 | in ... then ... | case.rb:37:8:37:26 | [ ..., * ] | no-match | -| case.rb:36:5:36:13 | in ... then ... | case.rb:37:12:37:12 | a | no-match | -| case.rb:36:5:36:13 | in ... then ... | case.rb:37:15:37:15 | b | no-match | -| case.rb:36:5:36:13 | in ... then ... | case.rb:37:19:37:19 | c | no-match | -| case.rb:36:5:36:13 | in ... then ... | case.rb:37:25:37:25 | e | no-match | -| case.rb:37:5:37:27 | in ... then ... | case.rb:37:8:37:26 | [ ..., * ] | match | -| case.rb:37:5:37:27 | in ... then ... | case.rb:37:12:37:12 | a | match | -| case.rb:37:5:37:27 | in ... then ... | case.rb:37:15:37:15 | b | match | -| case.rb:37:5:37:27 | in ... then ... | case.rb:37:19:37:19 | c | match | -| case.rb:37:5:37:27 | in ... then ... | case.rb:37:25:37:25 | e | match | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:12:37:12 | a | false | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:12:37:12 | a | match | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:12:37:12 | a | true | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:15:37:15 | b | false | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:15:37:15 | b | match | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:15:37:15 | b | true | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:19:37:19 | c | false | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:19:37:19 | c | match | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:19:37:19 | c | true | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:25:37:25 | e | false | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:25:37:25 | e | match | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:25:37:25 | e | true | -| case.rb:37:12:37:12 | a | case.rb:37:15:37:15 | b | match | -| case.rb:37:12:37:12 | a | case.rb:37:19:37:19 | c | match | -| case.rb:37:12:37:12 | a | case.rb:37:25:37:25 | e | match | -| case.rb:37:15:37:15 | b | case.rb:37:19:37:19 | c | match | -| case.rb:37:15:37:15 | b | case.rb:37:25:37:25 | e | match | -| case.rb:37:19:37:19 | c | case.rb:37:25:37:25 | e | match | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:43:10:43:10 | x | false | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:43:10:43:10 | x | match | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:43:10:43:10 | x | true | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:43:16:43:16 | 2 | false | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:43:16:43:16 | 2 | match | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:43:16:43:16 | 2 | true | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:43:20:43:20 | y | false | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:43:20:43:20 | y | match | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:43:20:43:20 | y | true | -| case.rb:43:10:43:10 | x | case.rb:43:16:43:16 | 2 | match | -| case.rb:43:10:43:10 | x | case.rb:43:20:43:20 | y | match | -| case.rb:43:16:43:16 | 2 | case.rb:43:20:43:20 | y | match | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:49:8:49:34 | { ..., ** } | match | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:49:20:49:20 | 1 | match | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:49:23:49:23 | a | match | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:49:29:49:32 | rest | match | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:20:49:20 | 1 | false | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:20:49:20 | 1 | match | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:20:49:20 | 1 | true | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:23:49:23 | a | false | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:23:49:23 | a | match | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:23:49:23 | a | true | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:29:49:32 | rest | false | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:29:49:32 | rest | match | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:29:49:32 | rest | true | -| case.rb:49:20:49:20 | 1 | case.rb:49:23:49:23 | a | match | -| case.rb:49:20:49:20 | 1 | case.rb:49:29:49:32 | rest | match | -| case.rb:49:23:49:23 | a | case.rb:49:29:49:32 | rest | match | -| case.rb:50:5:50:25 | in ... then ... | case.rb:50:8:50:24 | { ..., ** } | match | -| case.rb:50:5:50:25 | in ... then ... | case.rb:50:16:50:16 | 1 | match | -| case.rb:50:8:50:24 | { ..., ** } | case.rb:50:16:50:16 | 1 | false | -| case.rb:50:8:50:24 | { ..., ** } | case.rb:50:16:50:16 | 1 | match | -| case.rb:50:8:50:24 | { ..., ** } | case.rb:50:16:50:16 | 1 | true | -| case.rb:51:5:51:17 | in ... then ... | case.rb:51:8:51:16 | { ..., ** } | match | -| case.rb:55:1:61:3 | enter case_match_variable | case.rb:58:5:58:10 | in ... then ... | no-match | -| case.rb:63:1:67:3 | enter case_match_underscore | case.rb:65:12:65:12 | _ | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:74:5:74:11 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:75:5:75:15 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:76:5:76:18 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:77:5:77:18 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:78:5:78:19 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:79:5:79:14 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:80:5:80:12 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:81:5:81:11 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:82:5:82:20 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:82:13:82:13 | x | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:82:20:82:20 | 1 | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:83:5:83:26 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:83:12:83:15 | ^... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:83:20:83:25 | string | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:84:5:84:17 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:85:5:85:23 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:89:14:89:17 | self | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:89:21:89:24 | true | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:89:28:89:32 | false | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:91:13:91:14 | "" | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:75:5:75:15 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:76:5:76:18 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:77:5:77:18 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:78:5:78:19 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:79:5:79:14 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:82:13:82:13 | x | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:82:20:82:20 | 1 | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:83:12:83:15 | ^... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:83:20:83:25 | string | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:76:5:76:18 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:77:5:77:18 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:78:5:78:19 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:79:5:79:14 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:82:13:82:13 | x | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:82:20:82:20 | 1 | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:83:12:83:15 | ^... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:83:20:83:25 | string | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:77:5:77:18 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:78:5:78:19 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:79:5:79:14 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:82:13:82:13 | x | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:82:20:82:20 | 1 | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:83:12:83:15 | ^... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:83:20:83:25 | string | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:78:5:78:19 | in ... then ... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:79:5:79:14 | in ... then ... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:82:13:82:13 | x | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:82:20:82:20 | 1 | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:83:12:83:15 | ^... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:83:20:83:25 | string | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:79:5:79:14 | in ... then ... | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:82:13:82:13 | x | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:82:20:82:20 | 1 | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:83:12:83:15 | ^... | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:83:20:83:25 | string | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:82:13:82:13 | x | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:82:20:82:20 | 1 | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:83:12:83:15 | ^... | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:83:20:83:25 | string | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:82:13:82:13 | x | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:82:20:82:20 | 1 | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:83:12:83:15 | ^... | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:83:20:83:25 | string | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:82:13:82:13 | x | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:82:20:82:20 | 1 | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:83:12:83:15 | ^... | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:83:20:83:25 | string | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:82:13:82:13 | x | match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:82:20:82:20 | 1 | match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:83:12:83:15 | ^... | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:83:20:83:25 | string | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:82:13:82:13 | x | case.rb:82:20:82:20 | 1 | match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:83:12:83:15 | ^... | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:83:20:83:25 | string | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:83:20:83:25 | string | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:84:5:84:17 | in ... then ... | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:85:5:85:23 | in ... then ... | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:89:14:89:17 | self | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:89:21:89:24 | true | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:89:28:89:32 | false | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:83:20:83:25 | string | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:83:20:83:25 | string | case.rb:84:5:84:17 | in ... then ... | no-match | -| case.rb:83:20:83:25 | string | case.rb:85:5:85:23 | in ... then ... | no-match | -| case.rb:83:20:83:25 | string | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:83:20:83:25 | string | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:83:20:83:25 | string | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:83:20:83:25 | string | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:83:20:83:25 | string | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:83:20:83:25 | string | case.rb:89:14:89:17 | self | no-match | -| case.rb:83:20:83:25 | string | case.rb:89:21:89:24 | true | no-match | -| case.rb:83:20:83:25 | string | case.rb:89:28:89:32 | false | no-match | -| case.rb:83:20:83:25 | string | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:83:20:83:25 | string | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:83:20:83:25 | string | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:83:20:83:25 | string | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:83:20:83:25 | string | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:83:20:83:25 | string | case.rb:91:13:91:14 | "" | no-match | -| case.rb:83:20:83:25 | string | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:83:20:83:25 | string | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:88:14:88:15 | 10 | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:88:14:88:15 | 10 | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:88:14:88:15 | 10 | case.rb:89:14:89:17 | self | no-match | -| case.rb:88:14:88:15 | 10 | case.rb:89:21:89:24 | true | no-match | -| case.rb:88:14:88:15 | 10 | case.rb:89:28:89:32 | false | no-match | -| case.rb:88:14:88:15 | 10 | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:88:14:88:15 | 10 | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:88:14:88:15 | 10 | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:88:14:88:15 | 10 | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:88:14:88:15 | 10 | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:88:14:88:15 | 10 | case.rb:91:13:91:14 | "" | no-match | -| case.rb:88:14:88:15 | 10 | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:88:14:88:15 | 10 | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:89:5:89:69 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:89:5:89:69 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:89:5:89:69 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:89:5:89:69 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:89:5:89:69 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:89:5:89:69 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:89:5:89:69 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:89:5:89:69 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:89:5:89:69 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:89:5:89:69 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:89:5:89:69 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:89:5:89:69 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:89:14:89:17 | self | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:89:14:89:17 | self | case.rb:89:21:89:24 | true | no-match | -| case.rb:89:14:89:17 | self | case.rb:89:28:89:32 | false | no-match | -| case.rb:89:14:89:17 | self | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:89:14:89:17 | self | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:89:14:89:17 | self | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:89:14:89:17 | self | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:89:14:89:17 | self | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:89:14:89:17 | self | case.rb:91:13:91:14 | "" | no-match | -| case.rb:89:14:89:17 | self | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:89:14:89:17 | self | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:89:21:89:24 | true | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:89:21:89:24 | true | case.rb:89:28:89:32 | false | no-match | -| case.rb:89:21:89:24 | true | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:89:21:89:24 | true | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:89:21:89:24 | true | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:89:21:89:24 | true | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:89:21:89:24 | true | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:89:21:89:24 | true | case.rb:91:13:91:14 | "" | no-match | -| case.rb:89:21:89:24 | true | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:89:21:89:24 | true | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:89:28:89:32 | false | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:89:28:89:32 | false | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:89:28:89:32 | false | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:89:28:89:32 | false | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:89:28:89:32 | false | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:89:28:89:32 | false | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:89:28:89:32 | false | case.rb:91:13:91:14 | "" | no-match | -| case.rb:89:28:89:32 | false | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:89:28:89:32 | false | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:89:36:89:43 | __LINE__ | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:89:36:89:43 | __LINE__ | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:89:36:89:43 | __LINE__ | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:89:36:89:43 | __LINE__ | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:89:36:89:43 | __LINE__ | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:89:36:89:43 | __LINE__ | case.rb:91:13:91:14 | "" | no-match | -| case.rb:89:36:89:43 | __LINE__ | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:89:36:89:43 | __LINE__ | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:89:47:89:54 | __FILE__ | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:89:47:89:54 | __FILE__ | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:89:47:89:54 | __FILE__ | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:89:47:89:54 | __FILE__ | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:89:47:89:54 | __FILE__ | case.rb:91:13:91:14 | "" | no-match | -| case.rb:89:47:89:54 | __FILE__ | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:89:47:89:54 | __FILE__ | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:91:13:91:14 | "" | no-match | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:90:5:90:13 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:90:5:90:13 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:90:5:90:13 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:90:5:90:13 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:90:5:90:13 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:91:5:91:25 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:91:5:91:25 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:91:5:91:25 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:91:5:91:25 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:91:13:91:14 | "" | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:91:13:91:14 | "" | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:91:13:91:14 | "" | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:91:18:91:19 | [ ..., * ] | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:91:18:91:19 | [ ..., * ] | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:95:1:99:3 | enter case_match_guard_no_else | case.rb:95:1:99:3 | exit case_match_guard_no_else | match | -| case.rb:95:1:99:3 | enter case_match_guard_no_else | case.rb:95:1:99:3 | exit case_match_guard_no_else (abnormal) | match | -| case.rb:95:1:99:3 | enter case_match_guard_no_else | case.rb:97:13:97:13 | x | match | -| case.rb:95:1:99:3 | enter case_match_guard_no_else | case.rb:97:25:97:25 | 6 | match | -| case.rb:97:13:97:13 | x | case.rb:97:25:97:25 | 6 | true | -| cfg.html.erb:5:16:31:12 | enter cfg.html.erb | cfg.html.erb:19:19:19:32 | self | true | -| cfg.html.erb:5:16:31:12 | enter cfg.html.erb | cfg.html.erb:21:19:21:32 | self | false | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:32:9:32:9 | 1 | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:35:1:37:3 | if ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:41:1:45:3 | case ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:42:3:42:24 | [match] when ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:42:3:42:24 | [no-match] when ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:42:15:42:24 | self | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:43:3:43:31 | [match] when ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:43:3:43:31 | [no-match] when ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:43:8:43:8 | 2 | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:43:11:43:11 | 3 | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:43:14:43:14 | 4 | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:43:21:43:31 | self | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:44:8:44:18 | self | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:47:1:50:3 | case ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:48:3:48:29 | [match] when ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:48:3:48:29 | [no-match] when ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:48:20:48:29 | self | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:49:3:49:37 | [match] when ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:49:3:49:37 | [no-match] when ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:49:8:49:8 | b | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:49:16:49:16 | b | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:49:27:49:37 | self | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:60:17:60:40 | ... ? ... : ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:60:27:60:31 | hello | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:60:37:60:39 | bye | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:75:1:75:47 | if ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:75:15:75:15 | 0 | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:75:17:75:43 | elsif ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:75:23:75:23 | x | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:75:35:75:36 | 10 | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:75:43:75:43 | x | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:90:5:90:5 | [false] ! ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:90:5:90:5 | [true] ! ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:90:5:90:5 | if ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:90:5:90:5 | x | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:113:1:113:9 | self | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:113:1:113:19 | ... if ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:136:1:136:29 | ... rescue ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:136:12:136:29 | self | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:172:1:172:49 | unless ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:172:21:172:29 | self | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:172:36:172:45 | self | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:174:1:174:9 | self | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:174:1:174:23 | ... unless ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:176:1:176:41 | until ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:176:7:176:7 | x | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:176:17:176:17 | x | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:179:1:179:36 | ... until ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:179:2:179:13 | self | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:179:30:179:30 | i | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:182:1:186:3 | while ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:182:7:182:7 | x | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:183:3:183:3 | x | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:184:3:184:25 | if ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:184:18:184:21 | redo | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:188:1:188:35 | ... while ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:188:2:188:13 | self | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:188:30:188:30 | i | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:205:1:205:3 | __synth__0__1 | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:205:1:205:3 | nil | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:205:4:205:5 | if ... | true | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:35:1:37:3 | if ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:41:1:45:3 | case ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:42:3:42:24 | [match] when ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:42:3:42:24 | [no-match] when ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:42:15:42:24 | self | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:43:3:43:31 | [match] when ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:43:3:43:31 | [no-match] when ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:43:8:43:8 | 2 | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:43:11:43:11 | 3 | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:43:14:43:14 | 4 | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:43:21:43:31 | self | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:44:8:44:18 | self | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:47:1:50:3 | case ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:48:3:48:29 | [match] when ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:48:3:48:29 | [no-match] when ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:48:20:48:29 | self | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:49:3:49:37 | [match] when ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:49:3:49:37 | [no-match] when ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:49:8:49:8 | b | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:49:16:49:16 | b | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:49:27:49:37 | self | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:60:17:60:40 | ... ? ... : ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:60:27:60:31 | hello | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:60:37:60:39 | bye | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:75:1:75:47 | if ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:75:15:75:15 | 0 | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:75:17:75:43 | elsif ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:75:23:75:23 | x | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:75:35:75:36 | 10 | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:75:43:75:43 | x | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:90:5:90:5 | [false] ! ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:90:5:90:5 | [true] ! ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:90:5:90:5 | if ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:90:5:90:5 | x | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:113:1:113:9 | self | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:113:1:113:19 | ... if ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:136:1:136:29 | ... rescue ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:136:12:136:29 | self | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:172:1:172:49 | unless ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:172:21:172:29 | self | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:172:36:172:45 | self | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:174:1:174:9 | self | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:174:1:174:23 | ... unless ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:176:1:176:41 | until ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:176:7:176:7 | x | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:176:17:176:17 | x | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:179:1:179:36 | ... until ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:179:2:179:13 | self | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:179:30:179:30 | i | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:182:1:186:3 | while ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:182:7:182:7 | x | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:183:3:183:3 | x | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:184:3:184:25 | if ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:184:18:184:21 | redo | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:188:1:188:35 | ... while ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:188:2:188:13 | self | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:188:30:188:30 | i | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:205:1:205:3 | __synth__0__1 | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:205:1:205:3 | nil | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:205:4:205:5 | if ... | false | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:42:3:42:24 | [match] when ... | match | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:42:3:42:24 | [no-match] when ... | no-match | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:42:15:42:24 | self | match | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:43:3:43:31 | [match] when ... | no-match | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:43:3:43:31 | [no-match] when ... | no-match | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:43:8:43:8 | 2 | no-match | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:43:11:43:11 | 3 | no-match | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:43:14:43:14 | 4 | no-match | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:43:21:43:31 | self | no-match | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:44:8:44:18 | self | no-match | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:48:3:48:29 | [match] when ... | match | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:48:3:48:29 | [no-match] when ... | no-match | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:48:20:48:29 | self | match | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:49:3:49:37 | [match] when ... | no-match | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:49:3:49:37 | [no-match] when ... | no-match | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:49:8:49:8 | b | no-match | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:49:16:49:16 | b | no-match | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:49:27:49:37 | self | no-match | -| cfg.rb:42:3:42:24 | [match] when ... | cfg.rb:42:15:42:24 | self | match | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:43:3:43:31 | [match] when ... | no-match | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:43:3:43:31 | [no-match] when ... | no-match | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:43:8:43:8 | 2 | no-match | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:43:11:43:11 | 3 | no-match | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:43:14:43:14 | 4 | no-match | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:43:21:43:31 | self | no-match | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:44:8:44:18 | self | no-match | -| cfg.rb:43:3:43:31 | [match] when ... | cfg.rb:43:21:43:31 | self | match | -| cfg.rb:43:3:43:31 | [no-match] when ... | cfg.rb:44:8:44:18 | self | no-match | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:3:43:31 | [no-match] when ... | no-match | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:11:43:11 | 3 | no-match | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:14:43:14 | 4 | no-match | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:44:8:44:18 | self | no-match | -| cfg.rb:43:11:43:11 | 3 | cfg.rb:43:3:43:31 | [no-match] when ... | no-match | -| cfg.rb:43:11:43:11 | 3 | cfg.rb:43:14:43:14 | 4 | no-match | -| cfg.rb:43:11:43:11 | 3 | cfg.rb:44:8:44:18 | self | no-match | -| cfg.rb:43:14:43:14 | 4 | cfg.rb:43:3:43:31 | [no-match] when ... | no-match | -| cfg.rb:43:14:43:14 | 4 | cfg.rb:44:8:44:18 | self | no-match | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:60:27:60:31 | hello | true | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:60:37:60:39 | bye | false | -| cfg.rb:48:3:48:29 | [match] when ... | cfg.rb:48:20:48:29 | self | match | -| cfg.rb:48:3:48:29 | [no-match] when ... | cfg.rb:49:3:49:37 | [match] when ... | no-match | -| cfg.rb:48:3:48:29 | [no-match] when ... | cfg.rb:49:3:49:37 | [no-match] when ... | no-match | -| cfg.rb:48:3:48:29 | [no-match] when ... | cfg.rb:49:8:49:8 | b | no-match | -| cfg.rb:48:3:48:29 | [no-match] when ... | cfg.rb:49:16:49:16 | b | no-match | -| cfg.rb:48:3:48:29 | [no-match] when ... | cfg.rb:49:27:49:37 | self | no-match | -| cfg.rb:49:3:49:37 | [match] when ... | cfg.rb:49:27:49:37 | self | match | -| cfg.rb:49:8:49:8 | b | cfg.rb:49:3:49:37 | [no-match] when ... | no-match | -| cfg.rb:49:8:49:8 | b | cfg.rb:49:16:49:16 | b | no-match | -| cfg.rb:49:16:49:16 | b | cfg.rb:49:3:49:37 | [no-match] when ... | no-match | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:75:15:75:15 | 0 | true | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:75:17:75:43 | elsif ... | false | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:75:23:75:23 | x | false | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:75:35:75:36 | 10 | false | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:75:43:75:43 | x | false | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:90:5:90:5 | [false] ! ... | true | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:90:5:90:5 | [true] ! ... | false | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:90:5:90:5 | x | false | -| cfg.rb:75:23:75:23 | x | cfg.rb:75:35:75:36 | 10 | true | -| cfg.rb:75:23:75:23 | x | cfg.rb:75:43:75:43 | x | false | -| cfg.rb:90:1:93:3 | enter { ... } | cfg.rb:91:3:91:24 | if ... | false | -| cfg.rb:90:1:93:3 | enter { ... } | cfg.rb:91:17:91:20 | next | true | -| cfg.rb:90:5:90:5 | [true] ! ... | cfg.rb:90:5:90:5 | x | true | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:113:1:113:9 | self | true | -| cfg.rb:101:1:104:3 | enter parameters | cfg.rb:101:24:101:25 | 42 | false | -| cfg.rb:101:1:104:3 | enter parameters | cfg.rb:101:24:101:25 | 42 | no-match | -| cfg.rb:101:1:104:3 | enter parameters | cfg.rb:101:24:101:25 | 42 | true | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:172:21:172:29 | self | false | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:172:36:172:45 | self | true | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:174:1:174:9 | self | false | -| cfg.rb:176:7:176:7 | x | cfg.rb:176:1:176:41 | until ... | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:176:17:176:17 | x | false | -| cfg.rb:176:7:176:7 | x | cfg.rb:179:1:179:36 | ... until ... | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:179:2:179:13 | self | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:179:30:179:30 | i | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:182:1:186:3 | while ... | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:182:7:182:7 | x | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:183:3:183:3 | x | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:184:3:184:25 | if ... | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:184:18:184:21 | redo | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:188:1:188:35 | ... while ... | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:188:2:188:13 | self | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:188:30:188:30 | i | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:205:1:205:3 | __synth__0__1 | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:205:1:205:3 | nil | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:205:4:205:5 | if ... | true | -| cfg.rb:179:30:179:30 | i | cfg.rb:179:1:179:36 | ... until ... | true | -| cfg.rb:179:30:179:30 | i | cfg.rb:179:2:179:13 | self | false | -| cfg.rb:179:30:179:30 | i | cfg.rb:182:1:186:3 | while ... | true | -| cfg.rb:179:30:179:30 | i | cfg.rb:182:7:182:7 | x | true | -| cfg.rb:179:30:179:30 | i | cfg.rb:183:3:183:3 | x | true | -| cfg.rb:179:30:179:30 | i | cfg.rb:184:3:184:25 | if ... | true | -| cfg.rb:179:30:179:30 | i | cfg.rb:184:18:184:21 | redo | true | -| cfg.rb:179:30:179:30 | i | cfg.rb:188:1:188:35 | ... while ... | true | -| cfg.rb:179:30:179:30 | i | cfg.rb:188:2:188:13 | self | true | -| cfg.rb:179:30:179:30 | i | cfg.rb:188:30:188:30 | i | true | -| cfg.rb:179:30:179:30 | i | cfg.rb:205:1:205:3 | __synth__0__1 | true | -| cfg.rb:179:30:179:30 | i | cfg.rb:205:1:205:3 | nil | true | -| cfg.rb:179:30:179:30 | i | cfg.rb:205:4:205:5 | if ... | true | -| cfg.rb:182:7:182:7 | x | cfg.rb:182:1:186:3 | while ... | false | -| cfg.rb:182:7:182:7 | x | cfg.rb:183:3:183:3 | x | true | -| cfg.rb:182:7:182:7 | x | cfg.rb:184:3:184:25 | if ... | true | -| cfg.rb:182:7:182:7 | x | cfg.rb:184:18:184:21 | redo | true | -| cfg.rb:182:7:182:7 | x | cfg.rb:188:1:188:35 | ... while ... | false | -| cfg.rb:182:7:182:7 | x | cfg.rb:188:2:188:13 | self | false | -| cfg.rb:182:7:182:7 | x | cfg.rb:188:30:188:30 | i | false | -| cfg.rb:182:7:182:7 | x | cfg.rb:205:1:205:3 | __synth__0__1 | false | -| cfg.rb:182:7:182:7 | x | cfg.rb:205:1:205:3 | nil | false | -| cfg.rb:182:7:182:7 | x | cfg.rb:205:4:205:5 | if ... | false | -| cfg.rb:183:3:183:3 | x | cfg.rb:184:3:184:25 | if ... | false | -| cfg.rb:183:3:183:3 | x | cfg.rb:184:18:184:21 | redo | true | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:205:1:205:3 | __synth__0__1 | false | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:205:1:205:3 | nil | true | -| cfg.rb:188:30:188:30 | i | cfg.rb:188:1:188:35 | ... while ... | false | -| cfg.rb:188:30:188:30 | i | cfg.rb:188:2:188:13 | self | true | -| cfg.rb:188:30:188:30 | i | cfg.rb:205:1:205:3 | __synth__0__1 | false | -| cfg.rb:188:30:188:30 | i | cfg.rb:205:1:205:3 | nil | false | -| cfg.rb:188:30:188:30 | i | cfg.rb:205:4:205:5 | if ... | false | -| constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | constant_compound_assign.rb:5:22:5:24 | 123 | false | -| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:14:18:14:20 | 123 | false | -| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:19:21:19:23 | 123 | false | -| exit.rb:1:1:6:3 | enter m1 | exit.rb:2:3:4:5 | if ... | false | -| exit.rb:1:1:6:3 | enter m1 | exit.rb:3:5:3:10 | self | true | -| exit.rb:8:1:13:3 | enter m2 | exit.rb:9:3:11:5 | if ... | false | -| exit.rb:8:1:13:3 | enter m2 | exit.rb:10:5:10:18 | self | true | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:3:5:3:30 | self | true | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:3:7:35 | elsif ... | false | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:9:4:9 | x | false | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:9:4:24 | [false] ... and ... | false | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:9:4:24 | [true] ... and ... | false | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:9:4:38 | [false] ... and ... | false | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:9:4:38 | [true] ... and ... | false | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:20:4:20 | x | false | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:30:4:38 | [false] ! ... | false | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:30:4:38 | [true] ! ... | false | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:31:4:38 | [false] ( ... ) | false | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:31:4:38 | [true] ( ... ) | false | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:32:4:32 | x | false | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:5:5:5:17 | self | false | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:7:5:7:35 | self | false | -| ifs.rb:1:1:58:4 | enter ifs.rb | ifs.rb:36:1:38:3 | conditional_method_def | false | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:9:4:24 | [true] ... and ... | true | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:9:4:38 | [true] ... and ... | true | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:20:4:20 | x | true | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:30:4:38 | [false] ! ... | true | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:30:4:38 | [true] ! ... | true | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:31:4:38 | [false] ( ... ) | true | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:31:4:38 | [true] ( ... ) | true | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:32:4:32 | x | true | -| ifs.rb:4:9:4:9 | x | ifs.rb:5:5:5:17 | self | true | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:9:4:38 | [true] ... and ... | true | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:30:4:38 | [false] ! ... | true | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:30:4:38 | [true] ! ... | true | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:31:4:38 | [false] ( ... ) | true | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:31:4:38 | [true] ( ... ) | true | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:32:4:32 | x | true | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:5:5:5:17 | self | true | -| ifs.rb:4:9:4:38 | [false] ... and ... | ifs.rb:7:5:7:35 | self | false | -| ifs.rb:4:9:4:38 | [true] ... and ... | ifs.rb:5:5:5:17 | self | true | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:9:4:24 | [true] ... and ... | true | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:9:4:38 | [true] ... and ... | true | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:30:4:38 | [false] ! ... | true | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:30:4:38 | [true] ! ... | true | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:31:4:38 | [false] ( ... ) | true | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:31:4:38 | [true] ( ... ) | true | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:32:4:32 | x | true | -| ifs.rb:4:20:4:20 | x | ifs.rb:5:5:5:17 | self | true | -| ifs.rb:4:30:4:38 | [true] ! ... | ifs.rb:4:9:4:38 | [true] ... and ... | true | -| ifs.rb:4:30:4:38 | [true] ! ... | ifs.rb:5:5:5:17 | self | true | -| ifs.rb:4:31:4:38 | [false] ( ... ) | ifs.rb:4:9:4:38 | [true] ... and ... | false | -| ifs.rb:4:31:4:38 | [false] ( ... ) | ifs.rb:4:30:4:38 | [true] ! ... | false | -| ifs.rb:4:31:4:38 | [false] ( ... ) | ifs.rb:5:5:5:17 | self | false | -| ifs.rb:4:31:4:38 | [true] ( ... ) | ifs.rb:4:30:4:38 | [false] ! ... | true | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:9:4:38 | [true] ... and ... | false | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:30:4:38 | [false] ! ... | true | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:30:4:38 | [true] ! ... | false | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:31:4:38 | [false] ( ... ) | false | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:31:4:38 | [true] ( ... ) | true | -| ifs.rb:4:32:4:32 | x | ifs.rb:5:5:5:17 | self | false | -| ifs.rb:11:1:16:3 | enter m2 | ifs.rb:12:3:14:5 | if ... | false | -| ifs.rb:11:1:16:3 | enter m2 | ifs.rb:13:12:13:12 | 0 | true | -| ifs.rb:18:1:26:3 | enter m3 | ifs.rb:20:5:20:5 | x | true | -| ifs.rb:18:1:26:3 | enter m3 | ifs.rb:21:5:23:7 | if ... | true | -| ifs.rb:18:1:26:3 | enter m3 | ifs.rb:22:7:22:7 | x | true | -| ifs.rb:20:5:20:5 | x | ifs.rb:22:7:22:7 | x | true | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:29:16:29:17 | b2 | true | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:29:21:29:22 | b3 | false | -| ifs.rb:29:10:29:23 | [false] ( ... ) | ifs.rb:29:41:29:50 | !b2 \|\| !b3 | false | -| ifs.rb:29:10:29:23 | [true] ( ... ) | ifs.rb:29:28:29:35 | b2 \|\| b3 | true | -| ifs.rb:29:11:29:22 | [false] ... ? ... : ... | ifs.rb:29:10:29:23 | [false] ( ... ) | false | -| ifs.rb:29:11:29:22 | [false] ... ? ... : ... | ifs.rb:29:41:29:50 | !b2 \|\| !b3 | false | -| ifs.rb:29:11:29:22 | [true] ... ? ... : ... | ifs.rb:29:10:29:23 | [true] ( ... ) | true | -| ifs.rb:29:11:29:22 | [true] ... ? ... : ... | ifs.rb:29:28:29:35 | b2 \|\| b3 | true | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:13:33:19 | [false] then ... | true | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:13:33:19 | [true] then ... | true | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:18:33:19 | b2 | true | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:21:33:44 | [false] elsif ... | false | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:21:33:44 | [true] elsif ... | false | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:27:33:28 | b3 | false | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:30:33:36 | [false] then ... | false | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:30:33:36 | [true] then ... | false | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:35:33:36 | b4 | false | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:38:33:44 | [false] else ... | false | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:38:33:44 | [true] else ... | false | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:43:33:44 | b5 | false | -| ifs.rb:33:6:33:49 | [false] ( ... ) | ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | false | -| ifs.rb:33:6:33:49 | [true] ( ... ) | ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | true | -| ifs.rb:33:7:33:48 | [false] if ... | ifs.rb:33:6:33:49 | [false] ( ... ) | false | -| ifs.rb:33:7:33:48 | [false] if ... | ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | false | -| ifs.rb:33:7:33:48 | [true] if ... | ifs.rb:33:6:33:49 | [true] ( ... ) | true | -| ifs.rb:33:7:33:48 | [true] if ... | ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | true | -| ifs.rb:33:18:33:19 | b2 | ifs.rb:33:13:33:19 | [false] then ... | false | -| ifs.rb:33:18:33:19 | b2 | ifs.rb:33:13:33:19 | [true] then ... | true | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:30:33:36 | [false] then ... | true | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:30:33:36 | [true] then ... | true | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:35:33:36 | b4 | true | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:38:33:44 | [false] else ... | false | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:38:33:44 | [true] else ... | false | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:43:33:44 | b5 | false | -| ifs.rb:33:35:33:36 | b4 | ifs.rb:33:30:33:36 | [false] then ... | false | -| ifs.rb:33:35:33:36 | b4 | ifs.rb:33:30:33:36 | [true] then ... | true | -| ifs.rb:33:43:33:44 | b5 | ifs.rb:33:38:33:44 | [false] else ... | false | -| ifs.rb:33:43:33:44 | b5 | ifs.rb:33:38:33:44 | [true] else ... | true | -| ifs.rb:40:1:44:3 | enter constant_condition | ifs.rb:41:3:43:5 | if ... | true | -| ifs.rb:40:1:44:3 | enter constant_condition | ifs.rb:41:6:41:10 | [false] ! ... | true | -| ifs.rb:41:6:41:10 | [false] ! ... | ifs.rb:41:3:43:5 | if ... | false | -| ifs.rb:46:1:52:3 | enter empty_else | ifs.rb:48:5:48:15 | self | true | -| ifs.rb:46:1:52:3 | enter empty_else | ifs.rb:49:3:49:6 | else ... | false | -| ifs.rb:54:1:58:3 | enter disjunct | ifs.rb:55:6:55:15 | [false] ( ... ) | false | -| ifs.rb:54:1:58:3 | enter disjunct | ifs.rb:55:7:55:14 | [false] ... \|\| ... | false | -| ifs.rb:54:1:58:3 | enter disjunct | ifs.rb:55:13:55:14 | b2 | false | -| ifs.rb:55:6:55:15 | [true] ( ... ) | ifs.rb:56:5:56:19 | self | true | -| ifs.rb:55:7:55:14 | [false] ... \|\| ... | ifs.rb:55:6:55:15 | [false] ( ... ) | false | -| ifs.rb:55:7:55:14 | [true] ... \|\| ... | ifs.rb:55:6:55:15 | [true] ( ... ) | true | -| ifs.rb:55:7:55:14 | [true] ... \|\| ... | ifs.rb:56:5:56:19 | self | true | -| ifs.rb:55:13:55:14 | b2 | ifs.rb:55:6:55:15 | [false] ( ... ) | false | -| ifs.rb:55:13:55:14 | b2 | ifs.rb:55:7:55:14 | [false] ... \|\| ... | false | -| loops.rb:2:9:2:9 | x | loops.rb:2:3:5:5 | while ... | false | -| loops.rb:2:9:2:9 | x | loops.rb:3:5:3:10 | self | true | -| loops.rb:9:9:9:9 | x | loops.rb:10:5:10:10 | self | true | -| loops.rb:9:9:9:9 | x | loops.rb:13:7:13:11 | break | true | -| loops.rb:9:9:9:9 | x | loops.rb:14:11:14:11 | x | true | -| loops.rb:9:9:9:9 | x | loops.rb:15:7:15:10 | next | true | -| loops.rb:9:9:9:9 | x | loops.rb:16:5:17:10 | elsif ... | true | -| loops.rb:9:9:9:9 | x | loops.rb:16:11:16:11 | x | true | -| loops.rb:9:9:9:9 | x | loops.rb:17:7:17:10 | redo | true | -| loops.rb:10:5:10:10 | self | loops.rb:13:7:13:11 | break | true | -| loops.rb:10:5:10:10 | self | loops.rb:14:11:14:11 | x | false | -| loops.rb:10:5:10:10 | self | loops.rb:15:7:15:10 | next | false | -| loops.rb:10:5:10:10 | self | loops.rb:16:5:17:10 | elsif ... | false | -| loops.rb:10:5:10:10 | self | loops.rb:16:11:16:11 | x | false | -| loops.rb:10:5:10:10 | self | loops.rb:17:7:17:10 | redo | false | -| loops.rb:14:11:14:11 | x | loops.rb:15:7:15:10 | next | true | -| loops.rb:14:11:14:11 | x | loops.rb:16:5:17:10 | elsif ... | false | -| loops.rb:14:11:14:11 | x | loops.rb:16:11:16:11 | x | false | -| loops.rb:14:11:14:11 | x | loops.rb:17:7:17:10 | redo | false | -| loops.rb:16:11:16:11 | x | loops.rb:16:5:17:10 | elsif ... | false | -| loops.rb:16:11:16:11 | x | loops.rb:17:7:17:10 | redo | true | -| loops.rb:31:9:31:9 | x | loops.rb:31:3:32:5 | while ... | false | -| loops.rb:31:9:31:9 | x | loops.rb:31:15:32:5 | do ... | true | -| raise.rb:7:1:12:3 | enter m1 | raise.rb:8:3:10:5 | if ... | false | -| raise.rb:7:1:12:3 | enter m1 | raise.rb:9:5:9:17 | self | true | -| raise.rb:14:1:23:3 | enter m2 | raise.rb:14:1:23:3 | exit m2 (abnormal) | true | -| raise.rb:14:1:23:3 | enter m2 | raise.rb:16:5:18:7 | if ... | false | -| raise.rb:14:1:23:3 | enter m2 | raise.rb:17:7:17:22 | self | true | -| raise.rb:14:1:23:3 | enter m2 | raise.rb:20:5:20:18 | self | true | -| raise.rb:17:7:17:22 | self | raise.rb:20:5:20:18 | self | match | -| raise.rb:25:1:34:3 | enter m3 | raise.rb:27:5:29:7 | if ... | false | -| raise.rb:25:1:34:3 | enter m3 | raise.rb:28:7:28:22 | self | true | -| raise.rb:36:1:45:3 | enter m4 | raise.rb:38:5:40:7 | if ... | false | -| raise.rb:36:1:45:3 | enter m4 | raise.rb:39:7:39:22 | self | true | -| raise.rb:47:1:55:3 | enter m5 | raise.rb:49:5:51:7 | if ... | false | -| raise.rb:47:1:55:3 | enter m5 | raise.rb:50:7:50:22 | self | true | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:57:1:66:3 | exit m6 (abnormal) | true | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:59:5:61:7 | if ... | false | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:60:7:60:22 | self | true | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:62:22:62:31 | ExceptionB | true | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:62:36:62:36 | e | true | -| raise.rb:60:7:60:22 | self | raise.rb:57:1:66:3 | exit m6 (abnormal) | no-match | -| raise.rb:60:7:60:22 | self | raise.rb:62:22:62:31 | ExceptionB | no-match | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:68:1:77:3 | exit m7 (normal) | false | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:70:5:70:17 | self | true | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:71:3:72:18 | elsif ... | false | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:71:9:71:9 | x | false | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:72:13:72:17 | x < 0 | false | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:76:3:76:15 | self | false | -| raise.rb:71:9:71:9 | x | raise.rb:71:3:72:18 | elsif ... | false | -| raise.rb:71:9:71:9 | x | raise.rb:72:13:72:17 | x < 0 | true | -| raise.rb:71:9:71:9 | x | raise.rb:76:3:76:15 | self | false | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:79:1:92:3 | exit m8 (normal) | false | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:83:7:83:19 | self | true | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:84:5:85:20 | elsif ... | false | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:84:11:84:11 | x | false | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:85:15:85:19 | x < 0 | false | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:89:5:89:17 | self | false | -| raise.rb:84:11:84:11 | x | raise.rb:84:5:85:20 | elsif ... | false | -| raise.rb:84:11:84:11 | x | raise.rb:85:15:85:19 | x < 0 | true | -| raise.rb:84:11:84:11 | x | raise.rb:89:5:89:17 | self | false | -| raise.rb:97:8:97:8 | x | raise.rb:94:1:119:3 | exit m9 (normal) | false | -| raise.rb:97:8:97:8 | x | raise.rb:98:7:98:19 | self | true | -| raise.rb:97:8:97:8 | x | raise.rb:99:5:100:20 | elsif ... | false | -| raise.rb:97:8:97:8 | x | raise.rb:99:11:99:11 | x | false | -| raise.rb:97:8:97:8 | x | raise.rb:100:15:100:19 | x < 0 | false | -| raise.rb:97:8:97:8 | x | raise.rb:104:5:104:23 | self | false | -| raise.rb:97:8:97:8 | x | raise.rb:106:7:108:9 | [ensure: return] if ... | false | -| raise.rb:97:8:97:8 | x | raise.rb:106:7:108:9 | if ... | false | -| raise.rb:97:8:97:8 | x | raise.rb:106:10:106:11 | [ensure: return] b1 | false | -| raise.rb:97:8:97:8 | x | raise.rb:106:10:106:11 | b1 | false | -| raise.rb:97:8:97:8 | x | raise.rb:107:9:107:26 | [ensure: return] self | false | -| raise.rb:97:8:97:8 | x | raise.rb:107:9:107:26 | self | false | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | false | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | false | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: return] ensure ... | false | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | ensure ... | false | -| raise.rb:97:8:97:8 | x | raise.rb:115:3:115:22 | self | false | -| raise.rb:97:8:97:8 | x | raise.rb:116:3:118:5 | [ensure: return] if ... | false | -| raise.rb:97:8:97:8 | x | raise.rb:116:3:118:5 | if ... | false | -| raise.rb:97:8:97:8 | x | raise.rb:117:5:117:22 | [ensure: return] self | false | -| raise.rb:97:8:97:8 | x | raise.rb:117:5:117:22 | self | false | -| raise.rb:99:11:99:11 | x | raise.rb:99:5:100:20 | elsif ... | false | -| raise.rb:99:11:99:11 | x | raise.rb:100:15:100:19 | x < 0 | true | -| raise.rb:99:11:99:11 | x | raise.rb:104:5:104:23 | self | false | -| raise.rb:99:11:99:11 | x | raise.rb:106:7:108:9 | [ensure: return] if ... | true | -| raise.rb:99:11:99:11 | x | raise.rb:106:7:108:9 | if ... | false | -| raise.rb:99:11:99:11 | x | raise.rb:106:10:106:11 | [ensure: return] b1 | true | -| raise.rb:99:11:99:11 | x | raise.rb:106:10:106:11 | b1 | false | -| raise.rb:99:11:99:11 | x | raise.rb:107:9:107:26 | [ensure: return] self | true | -| raise.rb:99:11:99:11 | x | raise.rb:107:9:107:26 | self | false | -| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | false | -| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | true | -| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure: return] ensure ... | true | -| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | ensure ... | false | -| raise.rb:99:11:99:11 | x | raise.rb:115:3:115:22 | self | false | -| raise.rb:99:11:99:11 | x | raise.rb:116:3:118:5 | [ensure: return] if ... | true | -| raise.rb:99:11:99:11 | x | raise.rb:116:3:118:5 | if ... | false | -| raise.rb:99:11:99:11 | x | raise.rb:117:5:117:22 | [ensure: return] self | true | -| raise.rb:99:11:99:11 | x | raise.rb:117:5:117:22 | self | false | -| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:106:7:108:9 | [ensure: exception] if ... | false | -| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:107:9:107:26 | [ensure: exception] self | true | -| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | true | -| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | false | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:106:7:108:9 | [ensure: return] if ... | false | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:107:9:107:26 | [ensure: return] self | true | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | true | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:109:5:110:25 | [ensure: return] ensure ... | false | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:116:3:118:5 | [ensure: return] if ... | false | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:117:5:117:22 | [ensure: return] self | false | -| raise.rb:106:10:106:11 | b1 | raise.rb:106:7:108:9 | if ... | false | -| raise.rb:106:10:106:11 | b1 | raise.rb:107:9:107:26 | self | true | -| raise.rb:106:10:106:11 | b1 | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | true | -| raise.rb:106:10:106:11 | b1 | raise.rb:109:5:110:25 | ensure ... | false | -| raise.rb:106:10:106:11 | b1 | raise.rb:115:3:115:22 | self | false | -| raise.rb:106:10:106:11 | b1 | raise.rb:116:3:118:5 | if ... | false | -| raise.rb:106:10:106:11 | b1 | raise.rb:117:5:117:22 | self | false | -| raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:116:3:118:5 | [ensure: return] if ... | false | -| raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:117:5:117:22 | [ensure: return] self | true | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:116:3:118:5 | [ensure: exception] if ... | false | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:117:5:117:22 | [ensure: exception] self | true | -| raise.rb:115:3:115:22 | self | raise.rb:116:3:118:5 | if ... | false | -| raise.rb:115:3:115:22 | self | raise.rb:117:5:117:22 | self | true | -| raise.rb:121:1:126:3 | enter m10 | raise.rb:121:14:121:30 | self | false | -| raise.rb:121:1:126:3 | enter m10 | raise.rb:121:14:121:30 | self | no-match | -| raise.rb:121:1:126:3 | enter m10 | raise.rb:121:14:121:30 | self | true | -| raise.rb:121:1:126:3 | enter m10 | raise.rb:125:3:125:51 | self | match | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:130:5:132:7 | if ... | false | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:131:7:131:22 | self | true | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:133:3:133:19 | rescue ... | true | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:134:10:134:19 | ExceptionB | true | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:135:5:135:21 | self | true | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:137:5:137:17 | [ensure: exception] self | true | -| raise.rb:131:7:131:22 | self | raise.rb:133:3:133:19 | rescue ... | match | -| raise.rb:131:7:131:22 | self | raise.rb:134:10:134:19 | ExceptionB | no-match | -| raise.rb:131:7:131:22 | self | raise.rb:135:5:135:21 | self | no-match | -| raise.rb:131:7:131:22 | self | raise.rb:137:5:137:17 | [ensure: exception] self | no-match | -| raise.rb:134:10:134:19 | ExceptionB | raise.rb:135:5:135:21 | self | match | -| raise.rb:142:1:148:3 | enter m12 | raise.rb:143:3:145:5 | if ... | false | -| raise.rb:142:1:148:3 | enter m12 | raise.rb:144:5:144:12 | self | true | -| raise.rb:155:16:155:50 | enter { ... } | raise.rb:155:25:155:32 | self | true | -| raise.rb:155:16:155:50 | enter { ... } | raise.rb:155:25:155:48 | ... if ... | false | -| raise.rb:160:9:162:7 | enter -> { ... } | raise.rb:161:7:161:14 | self | false | -| raise.rb:160:9:162:7 | enter -> { ... } | raise.rb:161:7:161:23 | ... unless ... | true | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:174:8:174:23 | [false] ... \|\| ... | false | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:174:14:174:15 | b2 | false | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:177:14:177:14 | 2 | false | -| raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:177:14:177:14 | 2 | false | -| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:175:14:175:14 | 1 | true | -| raise.rb:174:14:174:15 | b2 | raise.rb:174:8:174:23 | [false] ... \|\| ... | false | -| raise.rb:174:14:174:15 | b2 | raise.rb:177:14:177:14 | 2 | false | -| raise.rb:179:10:179:19 | ExceptionA | raise.rb:180:12:180:12 | 3 | match | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:2:9:2:13 | After ... < ... [false] | false | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:2:9:2:13 | After ... < ... [true] | true | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:3:8:3:12 | After ... > ... [false] | true | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:3:8:3:12 | After ... > ... [true] | true | +| break_ensure.rb:2:9:2:13 | After ... < ... [true] | break_ensure.rb:3:8:3:12 | After ... > ... [false] | false | +| break_ensure.rb:2:9:2:13 | After ... < ... [true] | break_ensure.rb:3:8:3:12 | After ... > ... [true] | true | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:8:6:8:18 | After call to nil? [false] | false | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:8:6:8:18 | After call to nil? [true] | true | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:13:1:25:3 | Exceptional Exit | true | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:14:9:14:13 | After ... < ... [false] | false | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:14:9:14:13 | After ... < ... [true] | true | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:15:5:23:7 | After begin ... | true | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:16:10:16:14 | After ... > ... [false] | true | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:16:10:16:14 | After ... > ... [true] | true | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:19:5:22:9 | ensure ... | true | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:20:7:22:9 | After if ... | true | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:20:10:20:15 | After call to nil? [false] | true | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:20:10:20:15 | After call to nil? [true] | true | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:16:10:16:14 | After ... > ... [false] | false | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:16:10:16:14 | After ... > ... [true] | true | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:20:10:20:15 | After call to nil? [false] | false | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:20:10:20:15 | After call to nil? [true] | true | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:29:8:29:13 | After call to nil? [false] | false | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:29:8:29:13 | After call to nil? [true] | true | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:33:11:33:15 | After ... < ... [false] | false | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:33:11:33:15 | After ... < ... [true] | true | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:35:12:35:16 | After ... > ... [false] | true | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:35:12:35:16 | After ... > ... [true] | true | +| break_ensure.rb:33:11:33:15 | After ... < ... [true] | break_ensure.rb:35:12:35:16 | After ... > ... [false] | false | +| break_ensure.rb:33:11:33:15 | After ... < ... [true] | break_ensure.rb:35:12:35:16 | After ... > ... [true] | true | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:44:1:56:3 | Exceptional Exit | true | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:45:9:45:13 | After ... < ... [false] | false | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:45:9:45:13 | After ... < ... [true] | true | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:46:5:54:7 | After begin ... | true | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:47:10:47:14 | After ... > ... [false] | true | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:47:10:47:14 | After ... > ... [true] | true | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:50:5:53:9 | ensure ... | true | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:51:10:51:14 | After ... > ... [false] | true | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:51:10:51:14 | After ... > ... [true] | true | +| break_ensure.rb:45:9:45:13 | After ... < ... [true] | break_ensure.rb:47:10:47:14 | After ... > ... [false] | false | +| break_ensure.rb:45:9:45:13 | After ... < ... [true] | break_ensure.rb:47:10:47:14 | After ... > ... [true] | true | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:44:1:56:3 | Exceptional Exit | false | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:46:5:54:7 | After begin ... | false | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:51:10:51:14 | After ... > ... [false] | false | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:51:10:51:14 | After ... > ... [true] | true | +| case.rb:1:1:6:3 | Entry | case.rb:3:10:3:10 | After 1 [match] | match | +| case.rb:1:1:6:3 | Entry | case.rb:3:10:3:10 | After 1 [no-match] | no-match | +| case.rb:1:1:6:3 | Entry | case.rb:3:18:3:41 | After if ... | match | +| case.rb:1:1:6:3 | Entry | case.rb:3:21:3:22 | After call to x2 [false] | match | +| case.rb:1:1:6:3 | Entry | case.rb:3:21:3:22 | After call to x2 [true] | match | +| case.rb:1:1:6:3 | Entry | case.rb:4:10:4:10 | After 2 [match] | no-match | +| case.rb:1:1:6:3 | Entry | case.rb:4:10:4:10 | After 2 [no-match] | no-match | +| case.rb:3:10:3:10 | After 1 [match] | case.rb:3:21:3:22 | After call to x2 [false] | false | +| case.rb:3:10:3:10 | After 1 [match] | case.rb:3:21:3:22 | After call to x2 [true] | true | +| case.rb:3:10:3:10 | After 1 [no-match] | case.rb:4:10:4:10 | After 2 [match] | match | +| case.rb:3:10:3:10 | After 1 [no-match] | case.rb:4:10:4:10 | After 2 [no-match] | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:10:8:10:8 | After 0 [match] | match | +| case.rb:8:1:18:3 | Entry | case.rb:10:8:10:8 | After 0 [no-match] | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:11:8:11:8 | After 1 [match] | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:11:8:11:8 | After 1 [no-match] | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:12:8:12:8 | After 2 [match] | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:12:8:12:8 | After 2 [no-match] | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:14:8:14:8 | After x [match] | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:14:8:14:8 | After x [no-match] | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:14:13:14:18 | After ... == ... [false] | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:14:13:14:18 | After ... == ... [true] | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:15:5:15:28 | in ... then ... | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:15:8:15:8 | After x [match] | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:15:8:15:8 | After x [no-match] | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:15:17:15:21 | After ... < ... [false] | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:15:17:15:21 | After ... < ... [true] | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:16:5:16:10 | else ... | no-match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:11:8:11:8 | After 1 [match] | match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:11:8:11:8 | After 1 [no-match] | no-match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:12:8:12:8 | After 2 [match] | no-match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:12:8:12:8 | After 2 [no-match] | no-match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:14:8:14:8 | After x [match] | no-match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:14:8:14:8 | After x [no-match] | no-match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:14:13:14:18 | After ... == ... [false] | no-match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:14:13:14:18 | After ... == ... [true] | no-match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:15:5:15:28 | in ... then ... | no-match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:15:8:15:8 | After x [match] | no-match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:15:8:15:8 | After x [no-match] | no-match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:15:17:15:21 | After ... < ... [false] | no-match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:15:17:15:21 | After ... < ... [true] | no-match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:16:5:16:10 | else ... | no-match | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:12:8:12:8 | After 2 [match] | match | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:12:8:12:8 | After 2 [no-match] | no-match | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:14:8:14:8 | After x [match] | no-match | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:14:8:14:8 | After x [no-match] | no-match | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:14:13:14:18 | After ... == ... [false] | no-match | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:14:13:14:18 | After ... == ... [true] | no-match | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:15:5:15:28 | in ... then ... | no-match | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:15:8:15:8 | After x [match] | no-match | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:15:8:15:8 | After x [no-match] | no-match | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:15:17:15:21 | After ... < ... [false] | no-match | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:15:17:15:21 | After ... < ... [true] | no-match | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:16:5:16:10 | else ... | no-match | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:14:8:14:8 | After x [match] | match | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:14:8:14:8 | After x [no-match] | no-match | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:14:13:14:18 | After ... == ... [false] | match | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:14:13:14:18 | After ... == ... [true] | match | +| case.rb:14:8:14:8 | After x [match] | case.rb:14:13:14:18 | After ... == ... [false] | false | +| case.rb:14:8:14:8 | After x [match] | case.rb:14:13:14:18 | After ... == ... [true] | true | +| case.rb:15:5:15:28 | in ... then ... | case.rb:15:8:15:8 | After x [match] | match | +| case.rb:15:5:15:28 | in ... then ... | case.rb:15:8:15:8 | After x [no-match] | no-match | +| case.rb:15:5:15:28 | in ... then ... | case.rb:15:17:15:21 | After ... < ... [false] | match | +| case.rb:15:5:15:28 | in ... then ... | case.rb:15:17:15:21 | After ... < ... [true] | match | +| case.rb:15:8:15:8 | After x [match] | case.rb:15:17:15:21 | After ... < ... [false] | false | +| case.rb:15:8:15:8 | After x [match] | case.rb:15:17:15:21 | After ... < ... [true] | true | +| case.rb:20:1:24:3 | Entry | case.rb:22:8:22:8 | After 1 [match] | match | +| case.rb:20:1:24:3 | Entry | case.rb:22:8:22:8 | After 1 [no-match] | no-match | +| case.rb:26:1:30:3 | Entry | case.rb:28:7:28:28 | After -> { ... } [match] | match | +| case.rb:26:1:30:3 | Entry | case.rb:28:7:28:28 | After -> { ... } [no-match] | no-match | +| case.rb:32:1:39:3 | Entry | case.rb:34:8:34:9 | After [ ..., * ] [match] | match | +| case.rb:32:1:39:3 | Entry | case.rb:34:8:34:9 | After [ ..., * ] [no-match] | no-match | +| case.rb:32:1:39:3 | Entry | case.rb:35:8:35:10 | After [ ..., * ] [match] | no-match | +| case.rb:32:1:39:3 | Entry | case.rb:35:8:35:10 | After [ ..., * ] [no-match] | no-match | +| case.rb:32:1:39:3 | Entry | case.rb:36:8:36:12 | After [ ..., * ] [match] | no-match | +| case.rb:32:1:39:3 | Entry | case.rb:36:8:36:12 | After [ ..., * ] [no-match] | no-match | +| case.rb:32:1:39:3 | Entry | case.rb:37:8:37:26 | After [ ..., * ] [match] | no-match | +| case.rb:32:1:39:3 | Entry | case.rb:37:8:37:26 | After [ ..., * ] [no-match] | no-match | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:35:8:35:10 | After [ ..., * ] [match] | match | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:35:8:35:10 | After [ ..., * ] [no-match] | no-match | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:36:8:36:12 | After [ ..., * ] [match] | no-match | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:36:8:36:12 | After [ ..., * ] [no-match] | no-match | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [match] | no-match | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [no-match] | no-match | +| case.rb:35:8:35:10 | After [ ..., * ] [no-match] | case.rb:36:8:36:12 | After [ ..., * ] [match] | match | +| case.rb:35:8:35:10 | After [ ..., * ] [no-match] | case.rb:36:8:36:12 | After [ ..., * ] [no-match] | no-match | +| case.rb:35:8:35:10 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [match] | no-match | +| case.rb:35:8:35:10 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [no-match] | no-match | +| case.rb:36:8:36:12 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [match] | match | +| case.rb:36:8:36:12 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [no-match] | no-match | +| case.rb:41:1:45:3 | Entry | case.rb:43:8:43:21 | After [ *,...,* ] [match] | match | +| case.rb:41:1:45:3 | Entry | case.rb:43:8:43:21 | After [ *,...,* ] [no-match] | no-match | +| case.rb:47:1:53:3 | Entry | case.rb:49:8:49:34 | After { ..., ** } [match] | match | +| case.rb:47:1:53:3 | Entry | case.rb:49:8:49:34 | After { ..., ** } [no-match] | no-match | +| case.rb:47:1:53:3 | Entry | case.rb:50:8:50:24 | After { ..., ** } [match] | no-match | +| case.rb:47:1:53:3 | Entry | case.rb:50:8:50:24 | After { ..., ** } [no-match] | no-match | +| case.rb:47:1:53:3 | Entry | case.rb:51:8:51:16 | After { ..., ** } [match] | no-match | +| case.rb:47:1:53:3 | Entry | case.rb:51:8:51:16 | After { ..., ** } [no-match] | no-match | +| case.rb:49:8:49:34 | After { ..., ** } [no-match] | case.rb:50:8:50:24 | After { ..., ** } [match] | match | +| case.rb:49:8:49:34 | After { ..., ** } [no-match] | case.rb:50:8:50:24 | After { ..., ** } [no-match] | no-match | +| case.rb:49:8:49:34 | After { ..., ** } [no-match] | case.rb:51:8:51:16 | After { ..., ** } [match] | no-match | +| case.rb:49:8:49:34 | After { ..., ** } [no-match] | case.rb:51:8:51:16 | After { ..., ** } [no-match] | no-match | +| case.rb:50:8:50:24 | After { ..., ** } [no-match] | case.rb:51:8:51:16 | After { ..., ** } [match] | match | +| case.rb:50:8:50:24 | After { ..., ** } [no-match] | case.rb:51:8:51:16 | After { ..., ** } [no-match] | no-match | +| case.rb:55:1:61:3 | Entry | case.rb:57:8:57:8 | After 5 [match] | match | +| case.rb:55:1:61:3 | Entry | case.rb:57:8:57:8 | After 5 [no-match] | no-match | +| case.rb:55:1:61:3 | Entry | case.rb:58:8:58:10 | After var [match] | no-match | +| case.rb:55:1:61:3 | Entry | case.rb:58:8:58:10 | After var [no-match] | no-match | +| case.rb:55:1:61:3 | Entry | case.rb:59:8:59:20 | After "unreachable" [match] | no-match | +| case.rb:55:1:61:3 | Entry | case.rb:59:8:59:20 | After "unreachable" [no-match] | no-match | +| case.rb:57:8:57:8 | After 5 [no-match] | case.rb:58:8:58:10 | After var [match] | match | +| case.rb:57:8:57:8 | After 5 [no-match] | case.rb:58:8:58:10 | After var [no-match] | no-match | +| case.rb:57:8:57:8 | After 5 [no-match] | case.rb:59:8:59:20 | After "unreachable" [match] | no-match | +| case.rb:57:8:57:8 | After 5 [no-match] | case.rb:59:8:59:20 | After "unreachable" [no-match] | no-match | +| case.rb:58:8:58:10 | After var [no-match] | case.rb:59:8:59:20 | After "unreachable" [match] | match | +| case.rb:58:8:58:10 | After var [no-match] | case.rb:59:8:59:20 | After "unreachable" [no-match] | no-match | +| case.rb:63:1:67:3 | Entry | case.rb:65:8:65:28 | After ... \| ... [match] | match | +| case.rb:63:1:67:3 | Entry | case.rb:65:8:65:28 | After ... \| ... [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:73:8:73:8 | After 5 [match] | match | +| case.rb:69:1:93:3 | Entry | case.rb:73:8:73:8 | After 5 [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:74:8:74:11 | After ^... [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:74:8:74:11 | After ^... [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:75:8:75:15 | After "string" [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:75:8:75:15 | After "string" [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:76:8:76:18 | After call to [] [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:76:8:76:18 | After call to [] [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:77:8:77:18 | After call to [] [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:77:8:77:18 | After call to [] [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:79:8:79:14 | After _ .. _ [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:79:8:79:14 | After _ .. _ [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:80:8:80:12 | After _ .. _ [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:80:8:80:12 | After _ .. _ [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:81:8:81:11 | After _ .. _ [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:81:8:81:11 | After _ .. _ [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:82:8:82:13 | After ... => ... [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:82:8:82:13 | After ... => ... [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:83:8:83:26 | After ... \| ... [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:83:8:83:26 | After ... \| ... [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:84:8:84:17 | After Bar [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:84:8:84:17 | After Bar [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:85:8:85:23 | After -> { ... } [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:85:8:85:23 | After -> { ... } [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:86:8:86:11 | After :foo [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:87:8:87:17 | After :"foo bar" [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:88:8:88:15 | After ... \| ... [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:74:8:74:11 | After ^... [match] | match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:74:8:74:11 | After ^... [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:75:8:75:15 | After "string" [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:75:8:75:15 | After "string" [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:76:8:76:18 | After call to [] [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:76:8:76:18 | After call to [] [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:77:8:77:18 | After call to [] [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:77:8:77:18 | After call to [] [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:79:8:79:14 | After _ .. _ [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:80:8:80:12 | After _ .. _ [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:84:8:84:17 | After Bar [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:86:8:86:11 | After :foo [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:75:8:75:15 | After "string" [match] | match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:75:8:75:15 | After "string" [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:76:8:76:18 | After call to [] [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:76:8:76:18 | After call to [] [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:77:8:77:18 | After call to [] [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:77:8:77:18 | After call to [] [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:79:8:79:14 | After _ .. _ [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:80:8:80:12 | After _ .. _ [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:84:8:84:17 | After Bar [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:86:8:86:11 | After :foo [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:76:8:76:18 | After call to [] [match] | match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:76:8:76:18 | After call to [] [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:77:8:77:18 | After call to [] [match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:77:8:77:18 | After call to [] [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:79:8:79:14 | After _ .. _ [match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:80:8:80:12 | After _ .. _ [match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:84:8:84:17 | After Bar [match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:86:8:86:11 | After :foo [match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:77:8:77:18 | After call to [] [match] | match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:77:8:77:18 | After call to [] [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:79:8:79:14 | After _ .. _ [match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:80:8:80:12 | After _ .. _ [match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:84:8:84:17 | After Bar [match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:86:8:86:11 | After :foo [match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:79:8:79:14 | After _ .. _ [match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:80:8:80:12 | After _ .. _ [match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:84:8:84:17 | After Bar [match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:86:8:86:11 | After :foo [match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:79:8:79:14 | After _ .. _ [match] | match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:80:8:80:12 | After _ .. _ [match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:84:8:84:17 | After Bar [match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:86:8:86:11 | After :foo [match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:80:8:80:12 | After _ .. _ [match] | match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:84:8:84:17 | After Bar [match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:86:8:86:11 | After :foo [match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:84:8:84:17 | After Bar [match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:86:8:86:11 | After :foo [match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:84:8:84:17 | After Bar [match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:86:8:86:11 | After :foo [match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:84:8:84:17 | After Bar [match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:86:8:86:11 | After :foo [match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:84:8:84:17 | After Bar [match] | match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:86:8:86:11 | After :foo [match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | no-match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:86:8:86:11 | After :foo [match] | no-match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | no-match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | no-match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:86:8:86:11 | After :foo [match] | match | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | no-match | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | no-match | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | match | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | no-match | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | match | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | match | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:89:8:89:69 | After ... \| ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | match | +| case.rb:89:8:89:69 | After ... \| ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:89:8:89:69 | After ... \| ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:89:8:89:69 | After ... \| ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:90:8:90:13 | After ( ... ) [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | match | +| case.rb:90:8:90:13 | After ( ... ) [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:95:1:99:3 | Entry | case.rb:97:8:97:8 | After x [match] | match | +| case.rb:95:1:99:3 | Entry | case.rb:97:8:97:8 | After x [no-match] | no-match | +| case.rb:95:1:99:3 | Entry | case.rb:97:13:97:18 | After ... == ... [false] | match | +| case.rb:95:1:99:3 | Entry | case.rb:97:13:97:18 | After ... == ... [true] | match | +| case.rb:97:8:97:8 | After x [match] | case.rb:97:13:97:18 | After ... == ... [false] | false | +| case.rb:97:8:97:8 | After x [match] | case.rb:97:13:97:18 | After ... == ... [true] | true | +| cfg.html.erb:5:16:31:12 | Entry | cfg.html.erb:18:17:18:22 | After call to admin? [false] | false | +| cfg.html.erb:5:16:31:12 | Entry | cfg.html.erb:18:17:18:22 | After call to admin? [true] | true | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:42:8:42:8 | After 1 [match] | match | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:42:8:42:8 | After 1 [no-match] | no-match | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:43:3:43:31 | After when ... [match] | no-match | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:43:8:43:8 | After 2 [match] | no-match | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:43:8:43:8 | After 2 [no-match] | no-match | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:43:11:43:11 | After 3 [match] | no-match | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:43:11:43:11 | After 3 [no-match] | no-match | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:43:14:43:14 | After 4 [match] | no-match | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:43:14:43:14 | After 4 [no-match] | no-match | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:48:8:48:13 | After ... == ... [match] | match | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | no-match | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:49:3:49:37 | After when ... [match] | no-match | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:49:8:49:13 | After ... == ... [match] | no-match | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | no-match | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:49:16:49:20 | After ... > ... [match] | no-match | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | no-match | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:43:8:43:8 | After 2 [match] | match | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:43:8:43:8 | After 2 [no-match] | no-match | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:43:11:43:11 | After 3 [match] | no-match | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:43:11:43:11 | After 3 [no-match] | no-match | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:43:14:43:14 | After 4 [match] | no-match | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:43:14:43:14 | After 4 [no-match] | no-match | +| cfg.rb:43:8:43:8 | After 2 [no-match] | cfg.rb:43:11:43:11 | After 3 [match] | match | +| cfg.rb:43:8:43:8 | After 2 [no-match] | cfg.rb:43:11:43:11 | After 3 [no-match] | no-match | +| cfg.rb:43:8:43:8 | After 2 [no-match] | cfg.rb:43:14:43:14 | After 4 [match] | no-match | +| cfg.rb:43:8:43:8 | After 2 [no-match] | cfg.rb:43:14:43:14 | After 4 [no-match] | no-match | +| cfg.rb:43:11:43:11 | After 3 [no-match] | cfg.rb:43:14:43:14 | After 4 [match] | match | +| cfg.rb:43:11:43:11 | After 3 [no-match] | cfg.rb:43:14:43:14 | After 4 [no-match] | no-match | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:60:17:60:22 | After ... < ... [false] | false | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:60:17:60:22 | After ... < ... [true] | true | +| cfg.rb:48:8:48:13 | After ... == ... [no-match] | cfg.rb:49:8:49:13 | After ... == ... [match] | match | +| cfg.rb:48:8:48:13 | After ... == ... [no-match] | cfg.rb:49:8:49:13 | After ... == ... [no-match] | no-match | +| cfg.rb:48:8:48:13 | After ... == ... [no-match] | cfg.rb:49:16:49:20 | After ... > ... [match] | no-match | +| cfg.rb:48:8:48:13 | After ... == ... [no-match] | cfg.rb:49:16:49:20 | After ... > ... [no-match] | no-match | +| cfg.rb:49:8:49:13 | After ... == ... [no-match] | cfg.rb:49:16:49:20 | After ... > ... [match] | match | +| cfg.rb:49:8:49:13 | After ... == ... [no-match] | cfg.rb:49:16:49:20 | After ... > ... [no-match] | no-match | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:75:4:75:8 | After ... < ... [false] | false | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:75:4:75:8 | After ... < ... [true] | true | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:75:17:75:43 | After elsif ... | false | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:75:23:75:28 | After ... > ... [false] | false | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:75:23:75:28 | After ... > ... [true] | false | +| cfg.rb:75:4:75:8 | After ... < ... [false] | cfg.rb:75:23:75:28 | After ... > ... [false] | false | +| cfg.rb:75:4:75:8 | After ... < ... [false] | cfg.rb:75:23:75:28 | After ... > ... [true] | true | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:90:5:90:5 | After defined? ... [false] | false | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:90:5:90:5 | After defined? ... [true] | true | +| cfg.rb:90:1:93:3 | Entry | cfg.rb:91:6:91:10 | After ... > ... [false] | false | +| cfg.rb:90:1:93:3 | Entry | cfg.rb:91:6:91:10 | After ... > ... [true] | true | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:113:14:113:19 | After ... > ... [false] | false | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:113:14:113:19 | After ... > ... [true] | true | +| cfg.rb:101:1:104:3 | Entry | cfg.rb:101:16:101:20 | After value [match] | match | +| cfg.rb:101:1:104:3 | Entry | cfg.rb:101:16:101:20 | After value [no-match] | no-match | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:172:8:172:14 | After ... == ... [false] | false | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:172:8:172:14 | After ... == ... [true] | true | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:174:18:174:23 | After ... == ... [false] | false | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:174:18:174:23 | After ... == ... [true] | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:176:7:176:12 | After ... > ... [false] | false | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:176:7:176:12 | After ... > ... [true] | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:179:30:179:36 | After ... == ... [false] | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:179:30:179:36 | After ... == ... [true] | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:182:7:182:12 | After ... < ... [false] | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:182:7:182:12 | After ... < ... [true] | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:182:14:186:3 | do ... | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:184:6:184:11 | After ... == ... [false] | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:184:6:184:11 | After ... == ... [true] | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:188:30:188:35 | After ... != ... [false] | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:188:30:188:35 | After ... != ... [true] | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:205:4:205:5 | After call to == [false] | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:205:4:205:5 | After call to == [true] | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:205:4:205:5 | After if ... | true | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:179:30:179:36 | After ... == ... [false] | false | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:179:30:179:36 | After ... == ... [true] | true | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | true | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:182:7:182:12 | After ... < ... [false] | true | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:182:7:182:12 | After ... < ... [true] | true | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:182:14:186:3 | do ... | true | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:184:6:184:11 | After ... == ... [false] | true | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:184:6:184:11 | After ... == ... [true] | true | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | true | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:188:30:188:35 | After ... != ... [false] | true | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:188:30:188:35 | After ... != ... [true] | true | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:205:4:205:5 | After call to == [false] | true | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:205:4:205:5 | After call to == [true] | true | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:205:4:205:5 | After if ... | true | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:182:7:182:12 | After ... < ... [false] | false | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:182:7:182:12 | After ... < ... [true] | true | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:182:14:186:3 | do ... | true | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:184:6:184:11 | After ... == ... [false] | true | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:184:6:184:11 | After ... == ... [true] | true | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | false | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:188:30:188:35 | After ... != ... [false] | false | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:188:30:188:35 | After ... != ... [true] | false | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:205:4:205:5 | After call to == [false] | false | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:205:4:205:5 | After call to == [true] | false | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:205:4:205:5 | After if ... | false | +| cfg.rb:182:14:186:3 | do ... | cfg.rb:184:6:184:11 | After ... == ... [false] | false | +| cfg.rb:182:14:186:3 | do ... | cfg.rb:184:6:184:11 | After ... == ... [true] | true | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:188:30:188:35 | After ... != ... [false] | false | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:188:30:188:35 | After ... != ... [true] | true | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:205:4:205:5 | After call to == [false] | false | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:205:4:205:5 | After call to == [true] | false | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:205:4:205:5 | After if ... | false | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:205:4:205:5 | After call to == [false] | false | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:205:4:205:5 | After call to == [true] | true | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [false] | false | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [true] | true | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [false] | false | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [true] | true | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [false] | false | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [true] | true | +| exit.rb:1:1:6:3 | Entry | exit.rb:2:6:2:10 | After ... > ... [false] | false | +| exit.rb:1:1:6:3 | Entry | exit.rb:2:6:2:10 | After ... > ... [true] | true | +| exit.rb:8:1:13:3 | Entry | exit.rb:9:6:9:10 | After ... > ... [false] | false | +| exit.rb:8:1:13:3 | Entry | exit.rb:9:6:9:10 | After ... > ... [true] | true | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:2:6:2:10 | After ... > ... [false] | false | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:2:6:2:10 | After ... > ... [true] | true | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:3:7:35 | After elsif ... | false | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:9:4:14 | After ... <= ... [false] | false | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:9:4:14 | After ... <= ... [true] | false | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:9:4:24 | After ... and ... [false] | false | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:9:4:38 | After ... and ... [false] | false | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:20:4:24 | After ... > ... [false] | false | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:20:4:24 | After ... > ... [true] | false | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:32:4:37 | After ... == ... [false] | false | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:32:4:37 | After ... == ... [true] | false | +| ifs.rb:1:1:58:4 | Entry | ifs.rb:38:12:38:17 | After ... == ... [false] | false | +| ifs.rb:1:1:58:4 | Entry | ifs.rb:38:12:38:17 | After ... == ... [true] | true | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:9:4:14 | After ... <= ... [false] | false | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:9:4:14 | After ... <= ... [true] | true | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:20:4:24 | After ... > ... [false] | true | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:20:4:24 | After ... > ... [true] | true | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:32:4:37 | After ... == ... [false] | true | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:32:4:37 | After ... == ... [true] | true | +| ifs.rb:4:9:4:14 | After ... <= ... [true] | ifs.rb:4:20:4:24 | After ... > ... [false] | false | +| ifs.rb:4:9:4:14 | After ... <= ... [true] | ifs.rb:4:20:4:24 | After ... > ... [true] | true | +| ifs.rb:4:9:4:14 | After ... <= ... [true] | ifs.rb:4:32:4:37 | After ... == ... [false] | true | +| ifs.rb:4:9:4:14 | After ... <= ... [true] | ifs.rb:4:32:4:37 | After ... == ... [true] | true | +| ifs.rb:4:20:4:24 | After ... > ... [true] | ifs.rb:4:32:4:37 | After ... == ... [false] | false | +| ifs.rb:4:20:4:24 | After ... > ... [true] | ifs.rb:4:32:4:37 | After ... == ... [true] | true | +| ifs.rb:11:1:16:3 | Entry | ifs.rb:12:6:12:6 | After b [false] | false | +| ifs.rb:11:1:16:3 | Entry | ifs.rb:12:6:12:6 | After b [true] | true | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:19:6:19:10 | After ... < ... [false] | false | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:19:6:19:10 | After ... < ... [true] | true | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:21:5:23:7 | After if ... | true | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:21:8:21:13 | After ... > ... [false] | true | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:21:8:21:13 | After ... > ... [true] | true | +| ifs.rb:19:6:19:10 | After ... < ... [true] | ifs.rb:21:8:21:13 | After ... > ... [false] | false | +| ifs.rb:19:6:19:10 | After ... < ... [true] | ifs.rb:21:8:21:13 | After ... > ... [true] | true | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:11:29:12 | After b1 [false] | false | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:11:29:12 | After b1 [true] | true | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:16:29:17 | After b2 [false] | true | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:16:29:17 | After b2 [true] | true | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:21:29:22 | After b3 [false] | false | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:21:29:22 | After b3 [true] | false | +| ifs.rb:29:11:29:12 | After b1 [false] | ifs.rb:29:21:29:22 | After b3 [false] | false | +| ifs.rb:29:11:29:12 | After b1 [false] | ifs.rb:29:21:29:22 | After b3 [true] | true | +| ifs.rb:29:11:29:12 | After b1 [true] | ifs.rb:29:16:29:17 | After b2 [false] | false | +| ifs.rb:29:11:29:12 | After b1 [true] | ifs.rb:29:16:29:17 | After b2 [true] | true | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:10:33:11 | After b1 [false] | false | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:10:33:11 | After b1 [true] | true | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:18:33:19 | After b2 [false] | true | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:18:33:19 | After b2 [true] | true | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:21:33:44 | After elsif ... [false] | false | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:21:33:44 | After elsif ... [true] | false | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:27:33:28 | After b3 [false] | false | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:27:33:28 | After b3 [true] | false | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:35:33:36 | After b4 [false] | false | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:35:33:36 | After b4 [true] | false | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:43:33:44 | After b5 [false] | false | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:43:33:44 | After b5 [true] | false | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:27:33:28 | After b3 [false] | false | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:27:33:28 | After b3 [true] | true | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:35:33:36 | After b4 [false] | true | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:35:33:36 | After b4 [true] | true | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:43:33:44 | After b5 [false] | false | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:43:33:44 | After b5 [true] | false | +| ifs.rb:33:10:33:11 | After b1 [true] | ifs.rb:33:18:33:19 | After b2 [false] | false | +| ifs.rb:33:10:33:11 | After b1 [true] | ifs.rb:33:18:33:19 | After b2 [true] | true | +| ifs.rb:33:27:33:28 | After b3 [false] | ifs.rb:33:43:33:44 | After b5 [false] | false | +| ifs.rb:33:27:33:28 | After b3 [false] | ifs.rb:33:43:33:44 | After b5 [true] | true | +| ifs.rb:33:27:33:28 | After b3 [true] | ifs.rb:33:35:33:36 | After b4 [false] | false | +| ifs.rb:33:27:33:28 | After b3 [true] | ifs.rb:33:35:33:36 | After b4 [true] | true | +| ifs.rb:46:1:52:3 | Entry | ifs.rb:47:6:47:6 | After b [false] | false | +| ifs.rb:46:1:52:3 | Entry | ifs.rb:47:6:47:6 | After b [true] | true | +| ifs.rb:54:1:58:3 | Entry | ifs.rb:55:7:55:8 | After b1 [false] | false | +| ifs.rb:54:1:58:3 | Entry | ifs.rb:55:7:55:8 | After b1 [true] | true | +| ifs.rb:54:1:58:3 | Entry | ifs.rb:55:13:55:14 | After b2 [false] | false | +| ifs.rb:54:1:58:3 | Entry | ifs.rb:55:13:55:14 | After b2 [true] | false | +| ifs.rb:55:7:55:8 | After b1 [false] | ifs.rb:55:13:55:14 | After b2 [false] | false | +| ifs.rb:55:7:55:8 | After b1 [false] | ifs.rb:55:13:55:14 | After b2 [true] | true | +| loops.rb:2:3:5:5 | [LoopHeader] while ... | loops.rb:2:9:2:14 | After ... >= ... [false] | false | +| loops.rb:2:3:5:5 | [LoopHeader] while ... | loops.rb:2:9:2:14 | After ... >= ... [true] | true | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:9:9:9:14 | After ... >= ... [false] | false | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:9:9:9:14 | After ... >= ... [true] | true | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:9:15:20:5 | do ... | true | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:12:8:12:14 | After ... > ... [false] | true | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:12:8:12:14 | After ... > ... [true] | true | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:14:11:14:16 | After ... > ... [false] | true | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:14:11:14:16 | After ... > ... [true] | true | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:16:11:16:16 | After ... > ... [false] | true | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:16:11:16:16 | After ... > ... [true] | true | +| loops.rb:9:15:20:5 | do ... | loops.rb:12:8:12:14 | After ... > ... [false] | false | +| loops.rb:9:15:20:5 | do ... | loops.rb:12:8:12:14 | After ... > ... [true] | true | +| loops.rb:9:15:20:5 | do ... | loops.rb:14:11:14:16 | After ... > ... [false] | false | +| loops.rb:9:15:20:5 | do ... | loops.rb:14:11:14:16 | After ... > ... [true] | false | +| loops.rb:9:15:20:5 | do ... | loops.rb:16:11:16:16 | After ... > ... [false] | false | +| loops.rb:9:15:20:5 | do ... | loops.rb:16:11:16:16 | After ... > ... [true] | false | +| loops.rb:12:8:12:14 | After ... > ... [false] | loops.rb:14:11:14:16 | After ... > ... [false] | false | +| loops.rb:12:8:12:14 | After ... > ... [false] | loops.rb:14:11:14:16 | After ... > ... [true] | true | +| loops.rb:12:8:12:14 | After ... > ... [false] | loops.rb:16:11:16:16 | After ... > ... [false] | false | +| loops.rb:12:8:12:14 | After ... > ... [false] | loops.rb:16:11:16:16 | After ... > ... [true] | false | +| loops.rb:14:11:14:16 | After ... > ... [false] | loops.rb:16:11:16:16 | After ... > ... [false] | false | +| loops.rb:14:11:14:16 | After ... > ... [false] | loops.rb:16:11:16:16 | After ... > ... [true] | true | +| loops.rb:31:3:32:5 | [LoopHeader] while ... | loops.rb:31:9:31:13 | After ... < ... [false] | false | +| loops.rb:31:3:32:5 | [LoopHeader] while ... | loops.rb:31:9:31:13 | After ... < ... [true] | true | +| raise.rb:7:1:12:3 | Entry | raise.rb:8:6:8:10 | After ... > ... [false] | false | +| raise.rb:7:1:12:3 | Entry | raise.rb:8:6:8:10 | After ... > ... [true] | true | +| raise.rb:14:1:23:3 | Entry | raise.rb:16:8:16:8 | After b [false] | false | +| raise.rb:14:1:23:3 | Entry | raise.rb:16:8:16:8 | After b [true] | true | +| raise.rb:14:1:23:3 | Entry | raise.rb:19:10:19:19 | After ExceptionA [match] | true | +| raise.rb:14:1:23:3 | Entry | raise.rb:19:10:19:19 | After ExceptionA [no-match] | true | +| raise.rb:16:8:16:8 | After b [true] | raise.rb:19:10:19:19 | After ExceptionA [match] | match | +| raise.rb:16:8:16:8 | After b [true] | raise.rb:19:10:19:19 | After ExceptionA [no-match] | no-match | +| raise.rb:25:1:34:3 | Entry | raise.rb:27:8:27:8 | After b [false] | false | +| raise.rb:25:1:34:3 | Entry | raise.rb:27:8:27:8 | After b [true] | true | +| raise.rb:36:1:45:3 | Entry | raise.rb:38:8:38:8 | After b [false] | false | +| raise.rb:36:1:45:3 | Entry | raise.rb:38:8:38:8 | After b [true] | true | +| raise.rb:47:1:55:3 | Entry | raise.rb:49:8:49:8 | After b [false] | false | +| raise.rb:47:1:55:3 | Entry | raise.rb:49:8:49:8 | After b [true] | true | +| raise.rb:57:1:66:3 | Entry | raise.rb:59:8:59:8 | After b [false] | false | +| raise.rb:57:1:66:3 | Entry | raise.rb:59:8:59:8 | After b [true] | true | +| raise.rb:57:1:66:3 | Entry | raise.rb:62:10:62:31 | After ..., ... [match] | true | +| raise.rb:57:1:66:3 | Entry | raise.rb:62:10:62:31 | After ..., ... [no-match] | true | +| raise.rb:59:8:59:8 | After b [true] | raise.rb:62:10:62:31 | After ..., ... [match] | match | +| raise.rb:59:8:59:8 | After b [true] | raise.rb:62:10:62:31 | After ..., ... [no-match] | no-match | +| raise.rb:68:1:77:3 | Entry | raise.rb:69:6:69:10 | After ... > ... [false] | false | +| raise.rb:68:1:77:3 | Entry | raise.rb:69:6:69:10 | After ... > ... [true] | true | +| raise.rb:68:1:77:3 | Entry | raise.rb:71:9:71:13 | After ... < ... [false] | false | +| raise.rb:68:1:77:3 | Entry | raise.rb:71:9:71:13 | After ... < ... [true] | false | +| raise.rb:68:1:77:3 | Entry | raise.rb:74:3:74:20 | After call to puts | false | +| raise.rb:69:6:69:10 | After ... > ... [false] | raise.rb:71:9:71:13 | After ... < ... [false] | false | +| raise.rb:69:6:69:10 | After ... > ... [false] | raise.rb:71:9:71:13 | After ... < ... [true] | true | +| raise.rb:69:6:69:10 | After ... > ... [false] | raise.rb:74:3:74:20 | After call to puts | false | +| raise.rb:79:1:92:3 | Entry | raise.rb:82:8:82:12 | After ... > ... [false] | false | +| raise.rb:79:1:92:3 | Entry | raise.rb:82:8:82:12 | After ... > ... [true] | true | +| raise.rb:79:1:92:3 | Entry | raise.rb:84:11:84:15 | After ... < ... [false] | false | +| raise.rb:79:1:92:3 | Entry | raise.rb:84:11:84:15 | After ... < ... [true] | false | +| raise.rb:79:1:92:3 | Entry | raise.rb:87:5:87:22 | After call to puts | false | +| raise.rb:82:8:82:12 | After ... > ... [false] | raise.rb:84:11:84:15 | After ... < ... [false] | false | +| raise.rb:82:8:82:12 | After ... > ... [false] | raise.rb:84:11:84:15 | After ... < ... [true] | true | +| raise.rb:82:8:82:12 | After ... > ... [false] | raise.rb:87:5:87:22 | After call to puts | false | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:97:8:97:12 | After ... > ... [false] | false | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:97:8:97:12 | After ... > ... [true] | true | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:99:11:99:15 | After ... < ... [false] | false | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:99:11:99:15 | After ... < ... [true] | false | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:102:5:102:22 | After call to puts | false | +| raise.rb:97:8:97:12 | After ... > ... [false] | raise.rb:99:11:99:15 | After ... < ... [false] | false | +| raise.rb:97:8:97:12 | After ... > ... [false] | raise.rb:99:11:99:15 | After ... < ... [true] | true | +| raise.rb:97:8:97:12 | After ... > ... [false] | raise.rb:102:5:102:22 | After call to puts | false | +| raise.rb:104:5:104:23 | After call to puts | raise.rb:106:10:106:11 | After b1 [false] | false | +| raise.rb:104:5:104:23 | After call to puts | raise.rb:106:10:106:11 | After b1 [true] | true | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:94:1:119:3 | Normal Exit | false | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:95:3:118:5 | After ... | false | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:116:6:116:7 | After b2 [false] | false | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:116:6:116:7 | After b2 [true] | true | +| raise.rb:121:1:126:3 | Entry | raise.rb:121:9:121:9 | After p [match] | match | +| raise.rb:121:1:126:3 | Entry | raise.rb:121:9:121:9 | After p [no-match] | no-match | +| raise.rb:128:1:140:3 | Entry | raise.rb:130:8:130:8 | After b [false] | false | +| raise.rb:128:1:140:3 | Entry | raise.rb:130:8:130:8 | After b [true] | true | +| raise.rb:128:1:140:3 | Entry | raise.rb:133:10:133:19 | After ExceptionA [match] | true | +| raise.rb:128:1:140:3 | Entry | raise.rb:133:10:133:19 | After ExceptionA [no-match] | true | +| raise.rb:128:1:140:3 | Entry | raise.rb:134:10:134:19 | After ExceptionB [match] | true | +| raise.rb:128:1:140:3 | Entry | raise.rb:134:10:134:19 | After ExceptionB [no-match] | true | +| raise.rb:130:8:130:8 | After b [true] | raise.rb:133:10:133:19 | After ExceptionA [match] | match | +| raise.rb:130:8:130:8 | After b [true] | raise.rb:133:10:133:19 | After ExceptionA [no-match] | no-match | +| raise.rb:130:8:130:8 | After b [true] | raise.rb:134:10:134:19 | After ExceptionB [match] | no-match | +| raise.rb:130:8:130:8 | After b [true] | raise.rb:134:10:134:19 | After ExceptionB [no-match] | no-match | +| raise.rb:133:10:133:19 | After ExceptionA [no-match] | raise.rb:134:10:134:19 | After ExceptionB [match] | match | +| raise.rb:133:10:133:19 | After ExceptionA [no-match] | raise.rb:134:10:134:19 | After ExceptionB [no-match] | no-match | +| raise.rb:142:1:148:3 | Entry | raise.rb:143:6:143:6 | After b [false] | false | +| raise.rb:142:1:148:3 | Entry | raise.rb:143:6:143:6 | After b [true] | true | +| raise.rb:155:16:155:50 | Entry | raise.rb:155:37:155:48 | After call to nil? [false] | false | +| raise.rb:155:16:155:50 | Entry | raise.rb:155:37:155:48 | After call to nil? [true] | true | +| raise.rb:160:9:162:7 | Entry | raise.rb:161:23:161:23 | After x [false] | false | +| raise.rb:160:9:162:7 | Entry | raise.rb:161:23:161:23 | After x [true] | true | +| raise.rb:172:1:182:3 | Entry | raise.rb:174:8:174:9 | After b1 [false] | false | +| raise.rb:172:1:182:3 | Entry | raise.rb:174:8:174:9 | After b1 [true] | true | +| raise.rb:172:1:182:3 | Entry | raise.rb:174:14:174:23 | After ... == ... [false] | false | +| raise.rb:172:1:182:3 | Entry | raise.rb:174:14:174:23 | After ... == ... [true] | false | +| raise.rb:172:1:182:3 | Entry | raise.rb:179:3:180:12 | rescue ... | false | +| raise.rb:172:1:182:3 | Entry | raise.rb:179:10:179:19 | After ExceptionA [match] | false | +| raise.rb:172:1:182:3 | Entry | raise.rb:179:10:179:19 | After ExceptionA [no-match] | false | +| raise.rb:174:8:174:9 | After b1 [false] | raise.rb:174:14:174:23 | After ... == ... [false] | false | +| raise.rb:174:8:174:9 | After b1 [false] | raise.rb:174:14:174:23 | After ... == ... [true] | true | +| raise.rb:179:3:180:12 | rescue ... | raise.rb:179:10:179:19 | After ExceptionA [match] | match | +| raise.rb:179:3:180:12 | rescue ... | raise.rb:179:10:179:19 | After ExceptionA [no-match] | no-match | successor -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:8:3:10:5 | if ... | false | -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:9:5:9:23 | self | true | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:2:3:6:5 | while ... | false | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:3:8:3:8 | x | true | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:8:6:8:13 | [ensure: exception] self | exception | -| break_ensure.rb:3:8:3:8 | x | break_ensure.rb:2:3:6:5 | while ... | exception | -| break_ensure.rb:3:8:3:8 | x | break_ensure.rb:3:5:5:7 | if ... | false | -| break_ensure.rb:3:8:3:8 | x | break_ensure.rb:4:7:4:11 | break | true | -| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | false | -| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:9:5:9:23 | [ensure: exception] self | true | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:14:3:24:5 | while ... | false | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:16:10:16:10 | x | true | -| break_ensure.rb:16:7:18:9 | if ... | break_ensure.rb:20:7:22:9 | if ... | false | -| break_ensure.rb:16:7:18:9 | if ... | break_ensure.rb:21:9:21:20 | self | true | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:16:7:18:9 | if ... | false | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:17:9:17:13 | break | true | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:20:10:20:10 | [ensure: exception] y | exception | -| break_ensure.rb:17:9:17:13 | break | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | false | -| break_ensure.rb:17:9:17:13 | break | break_ensure.rb:21:9:21:20 | [ensure: break] self | true | -| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | false | -| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:21:9:21:20 | [ensure: exception] self | true | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:29:5:31:7 | if ... | false | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:30:7:30:12 | return | true | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:11:33:11 | [ensure: exception] y | exception | -| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | false | -| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:35:12:35:12 | [ensure: exception] x | true | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | false | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:35:12:35:12 | [ensure: return] x | true | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:33:5:39:7 | while ... | false | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:35:12:35:12 | x | true | -| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | false | -| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:36:11:36:15 | [ensure: exception] break | true | -| break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | false | -| break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:36:11:36:15 | [ensure: return] break | true | -| break_ensure.rb:35:12:35:12 | x | break_ensure.rb:35:9:37:11 | if ... | false | -| break_ensure.rb:35:12:35:12 | x | break_ensure.rb:36:11:36:15 | break | true | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:45:3:55:5 | while ... | false | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:47:10:47:10 | x | true | -| break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:51:7:53:9 | if ... | false | -| break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:52:15:52:16 | 10 | true | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:47:7:49:9 | if ... | false | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:48:9:48:16 | self | true | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:51:10:51:10 | [ensure: exception] x | exception | -| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | false | -| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | true | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:3:5:3:42 | [match] when ... | match | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:3:5:3:42 | [no-match] when ... | no-match | -| case.rb:3:5:3:42 | [match] when ... | case.rb:3:21:3:22 | self | match | -| case.rb:3:5:3:42 | [no-match] when ... | case.rb:4:10:4:10 | 2 | no-match | -| case.rb:3:21:3:22 | self | case.rb:3:18:3:41 | if ... | false | -| case.rb:3:21:3:22 | self | case.rb:3:29:3:37 | self | true | -| case.rb:4:5:4:24 | [match] when ... | case.rb:4:17:4:24 | self | match | -| case.rb:4:5:4:24 | [no-match] when ... | case.rb:2:3:5:5 | case ... | no-match | -| case.rb:4:10:4:10 | 2 | case.rb:4:5:4:24 | [match] when ... | match | -| case.rb:4:10:4:10 | 2 | case.rb:4:5:4:24 | [no-match] when ... | no-match | -| case.rb:8:1:18:3 | enter case_match | case.rb:9:3:17:5 | case ... | match | -| case.rb:8:1:18:3 | enter case_match | case.rb:11:5:11:15 | in ... then ... | no-match | -| case.rb:11:5:11:15 | in ... then ... | case.rb:11:15:11:15 | 3 | match | -| case.rb:11:5:11:15 | in ... then ... | case.rb:12:5:13:7 | in ... then ... | no-match | -| case.rb:12:5:13:7 | in ... then ... | case.rb:13:7:13:7 | 4 | match | -| case.rb:12:5:13:7 | in ... then ... | case.rb:14:5:14:25 | in ... then ... | no-match | -| case.rb:14:5:14:25 | in ... then ... | case.rb:14:13:14:13 | x | match | -| case.rb:14:13:14:13 | x | case.rb:14:25:14:25 | 6 | true | -| case.rb:14:13:14:13 | x | case.rb:15:5:15:28 | in ... then ... | false | -| case.rb:15:5:15:28 | in ... then ... | case.rb:15:17:15:17 | x | match | -| case.rb:15:17:15:17 | x | case.rb:15:28:15:28 | 7 | false | -| case.rb:15:17:15:17 | x | case.rb:16:10:16:10 | 8 | true | -| case.rb:20:1:24:3 | enter case_match_no_match | case.rb:20:1:24:3 | exit case_match_no_match (abnormal) | exception | -| case.rb:20:1:24:3 | enter case_match_no_match | case.rb:21:3:23:5 | case ... | match | -| case.rb:26:1:30:3 | enter case_match_raise | case.rb:26:1:30:3 | exit case_match_raise (abnormal) | exception | -| case.rb:26:1:30:3 | enter case_match_raise | case.rb:27:3:29:5 | case ... | match | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:33:3:38:5 | case ... | match | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:35:5:35:11 | in ... then ... | no-match | -| case.rb:35:5:35:11 | in ... then ... | case.rb:35:9:35:9 | x | false | -| case.rb:35:5:35:11 | in ... then ... | case.rb:35:9:35:9 | x | match | -| case.rb:35:5:35:11 | in ... then ... | case.rb:35:9:35:9 | x | true | -| case.rb:35:5:35:11 | in ... then ... | case.rb:36:5:36:13 | in ... then ... | no-match | -| case.rb:35:9:35:9 | x | case.rb:33:3:38:5 | case ... | match | -| case.rb:36:5:36:13 | in ... then ... | case.rb:36:9:36:9 | x | false | -| case.rb:36:5:36:13 | in ... then ... | case.rb:36:9:36:9 | x | match | -| case.rb:36:5:36:13 | in ... then ... | case.rb:36:9:36:9 | x | true | -| case.rb:36:5:36:13 | in ... then ... | case.rb:37:5:37:27 | in ... then ... | no-match | -| case.rb:36:9:36:9 | x | case.rb:33:3:38:5 | case ... | match | -| case.rb:37:5:37:27 | in ... then ... | case.rb:32:1:39:3 | exit case_match_array (abnormal) | exception | -| case.rb:37:5:37:27 | in ... then ... | case.rb:37:8:37:26 | [ ..., * ] | match | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:32:1:39:3 | exit case_match_array (abnormal) | exception | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:12:37:12 | a | false | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:12:37:12 | a | match | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:12:37:12 | a | true | -| case.rb:37:12:37:12 | a | case.rb:37:15:37:15 | b | match | -| case.rb:37:15:37:15 | b | case.rb:37:19:37:19 | c | match | -| case.rb:37:19:37:19 | c | case.rb:37:25:37:25 | e | match | -| case.rb:37:25:37:25 | e | case.rb:33:3:38:5 | case ... | match | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:41:1:45:3 | exit case_match_find (abnormal) | exception | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:43:10:43:10 | x | false | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:43:10:43:10 | x | match | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:43:10:43:10 | x | true | -| case.rb:43:10:43:10 | x | case.rb:41:1:45:3 | exit case_match_find (abnormal) | exception | -| case.rb:43:10:43:10 | x | case.rb:43:16:43:16 | 2 | match | -| case.rb:43:16:43:16 | 2 | case.rb:41:1:45:3 | exit case_match_find (abnormal) | exception | -| case.rb:43:16:43:16 | 2 | case.rb:43:20:43:20 | y | match | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:49:8:49:34 | { ..., ** } | match | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:50:5:50:25 | in ... then ... | no-match | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:20:49:20 | 1 | false | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:20:49:20 | 1 | match | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:20:49:20 | 1 | true | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:50:5:50:25 | in ... then ... | no-match | -| case.rb:49:20:49:20 | 1 | case.rb:49:23:49:23 | a | match | -| case.rb:49:20:49:20 | 1 | case.rb:50:5:50:25 | in ... then ... | no-match | -| case.rb:49:23:49:23 | a | case.rb:49:29:49:32 | rest | match | -| case.rb:50:5:50:25 | in ... then ... | case.rb:50:8:50:24 | { ..., ** } | match | -| case.rb:50:5:50:25 | in ... then ... | case.rb:51:5:51:17 | in ... then ... | no-match | -| case.rb:50:8:50:24 | { ..., ** } | case.rb:50:16:50:16 | 1 | false | -| case.rb:50:8:50:24 | { ..., ** } | case.rb:50:16:50:16 | 1 | match | -| case.rb:50:8:50:24 | { ..., ** } | case.rb:50:16:50:16 | 1 | true | -| case.rb:50:8:50:24 | { ..., ** } | case.rb:51:5:51:17 | in ... then ... | no-match | -| case.rb:50:16:50:16 | 1 | case.rb:48:3:52:5 | case ... | match | -| case.rb:50:16:50:16 | 1 | case.rb:51:5:51:17 | in ... then ... | no-match | -| case.rb:51:5:51:17 | in ... then ... | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | exception | -| case.rb:51:5:51:17 | in ... then ... | case.rb:51:8:51:16 | { ..., ** } | match | -| case.rb:51:8:51:16 | { ..., ** } | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | exception | -| case.rb:51:8:51:16 | { ..., ** } | case.rb:48:3:52:5 | case ... | false | -| case.rb:51:8:51:16 | { ..., ** } | case.rb:48:3:52:5 | case ... | match | -| case.rb:51:8:51:16 | { ..., ** } | case.rb:48:3:52:5 | case ... | true | -| case.rb:55:1:61:3 | enter case_match_variable | case.rb:56:3:60:5 | case ... | match | -| case.rb:55:1:61:3 | enter case_match_variable | case.rb:58:5:58:10 | in ... then ... | no-match | -| case.rb:58:5:58:10 | in ... then ... | case.rb:56:3:60:5 | case ... | match | -| case.rb:63:1:67:3 | enter case_match_underscore | case.rb:64:3:66:5 | case ... | match | -| case.rb:63:1:67:3 | enter case_match_underscore | case.rb:65:12:65:12 | _ | no-match | -| case.rb:65:12:65:12 | _ | case.rb:64:3:66:5 | case ... | match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:72:3:92:5 | case ... | match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:74:5:74:11 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:75:5:75:15 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:76:5:76:18 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:77:5:77:18 | in ... then ... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:78:5:78:19 | in ... then ... | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:79:5:79:14 | in ... then ... | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:82:13:82:13 | x | match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | no-match | -| case.rb:82:13:82:13 | x | case.rb:82:20:82:20 | 1 | match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:83:12:83:15 | ^... | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:72:3:92:5 | case ... | match | -| case.rb:83:12:83:15 | ^... | case.rb:83:20:83:25 | string | no-match | -| case.rb:83:20:83:25 | string | case.rb:72:3:92:5 | case ... | match | -| case.rb:83:20:83:25 | string | case.rb:84:5:84:17 | in ... then ... | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:88:14:88:15 | 10 | case.rb:72:3:92:5 | case ... | match | -| case.rb:88:14:88:15 | 10 | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:89:5:89:69 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:89:5:89:69 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:89:14:89:17 | self | case.rb:72:3:92:5 | case ... | match | -| case.rb:89:14:89:17 | self | case.rb:89:21:89:24 | true | no-match | -| case.rb:89:21:89:24 | true | case.rb:72:3:92:5 | case ... | match | -| case.rb:89:21:89:24 | true | case.rb:89:28:89:32 | false | no-match | -| case.rb:89:28:89:32 | false | case.rb:72:3:92:5 | case ... | match | -| case.rb:89:28:89:32 | false | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:89:36:89:43 | __LINE__ | case.rb:72:3:92:5 | case ... | match | -| case.rb:89:36:89:43 | __LINE__ | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:89:47:89:54 | __FILE__ | case.rb:72:3:92:5 | case ... | match | -| case.rb:89:47:89:54 | __FILE__ | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:72:3:92:5 | case ... | match | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:90:5:90:13 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:90:5:90:13 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:91:5:91:25 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:91:5:91:25 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:91:13:91:14 | "" | case.rb:72:3:92:5 | case ... | match | -| case.rb:91:13:91:14 | "" | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:91:18:91:19 | [ ..., * ] | case.rb:72:3:92:5 | case ... | match | -| case.rb:91:18:91:19 | [ ..., * ] | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:91:23:91:24 | { ..., ** } | case.rb:69:1:93:3 | exit case_match_various (abnormal) | exception | -| case.rb:91:23:91:24 | { ..., ** } | case.rb:72:3:92:5 | case ... | false | -| case.rb:91:23:91:24 | { ..., ** } | case.rb:72:3:92:5 | case ... | match | -| case.rb:91:23:91:24 | { ..., ** } | case.rb:72:3:92:5 | case ... | true | -| case.rb:95:1:99:3 | enter case_match_guard_no_else | case.rb:97:13:97:13 | x | match | -| case.rb:97:13:97:13 | x | case.rb:95:1:99:3 | exit case_match_guard_no_else (abnormal) | exception | -| case.rb:97:13:97:13 | x | case.rb:97:25:97:25 | 6 | true | -| cfg.html.erb:5:16:31:12 | enter cfg.html.erb | cfg.html.erb:19:19:19:32 | self | true | -| cfg.html.erb:5:16:31:12 | enter cfg.html.erb | cfg.html.erb:21:19:21:32 | self | false | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:32:9:32:9 | 1 | true | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:35:1:37:3 | if ... | false | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:42:3:42:24 | [match] when ... | match | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:42:3:42:24 | [no-match] when ... | no-match | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:48:3:48:29 | [match] when ... | match | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:48:3:48:29 | [no-match] when ... | no-match | -| cfg.rb:42:3:42:24 | [match] when ... | cfg.rb:42:15:42:24 | self | match | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:43:8:43:8 | 2 | no-match | -| cfg.rb:43:3:43:31 | [match] when ... | cfg.rb:43:21:43:31 | self | match | -| cfg.rb:43:3:43:31 | [no-match] when ... | cfg.rb:44:8:44:18 | self | no-match | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:3:43:31 | [match] when ... | match | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:11:43:11 | 3 | no-match | -| cfg.rb:43:11:43:11 | 3 | cfg.rb:43:3:43:31 | [match] when ... | match | -| cfg.rb:43:11:43:11 | 3 | cfg.rb:43:14:43:14 | 4 | no-match | -| cfg.rb:43:14:43:14 | 4 | cfg.rb:43:3:43:31 | [match] when ... | match | -| cfg.rb:43:14:43:14 | 4 | cfg.rb:43:3:43:31 | [no-match] when ... | no-match | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:60:27:60:31 | hello | true | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:60:37:60:39 | bye | false | -| cfg.rb:48:3:48:29 | [match] when ... | cfg.rb:48:20:48:29 | self | match | -| cfg.rb:48:3:48:29 | [no-match] when ... | cfg.rb:49:8:49:8 | b | no-match | -| cfg.rb:49:3:49:37 | [match] when ... | cfg.rb:49:27:49:37 | self | match | -| cfg.rb:49:3:49:37 | [no-match] when ... | cfg.rb:47:1:50:3 | case ... | no-match | -| cfg.rb:49:8:49:8 | b | cfg.rb:49:3:49:37 | [match] when ... | match | -| cfg.rb:49:8:49:8 | b | cfg.rb:49:16:49:16 | b | no-match | -| cfg.rb:49:16:49:16 | b | cfg.rb:49:3:49:37 | [match] when ... | match | -| cfg.rb:49:16:49:16 | b | cfg.rb:49:3:49:37 | [no-match] when ... | no-match | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:75:15:75:15 | 0 | true | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:75:23:75:23 | x | false | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:90:5:90:5 | [false] ! ... | true | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:90:5:90:5 | [true] ! ... | false | -| cfg.rb:75:23:75:23 | x | cfg.rb:75:35:75:36 | 10 | true | -| cfg.rb:75:23:75:23 | x | cfg.rb:75:43:75:43 | x | false | -| cfg.rb:90:1:93:3 | enter { ... } | cfg.rb:91:3:91:24 | if ... | false | -| cfg.rb:90:1:93:3 | enter { ... } | cfg.rb:91:17:91:20 | next | true | -| cfg.rb:90:5:90:5 | [false] ! ... | cfg.rb:90:5:90:5 | if ... | false | -| cfg.rb:90:5:90:5 | [true] ! ... | cfg.rb:90:5:90:5 | x | true | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:113:1:113:9 | self | true | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:113:1:113:19 | ... if ... | false | -| cfg.rb:101:1:104:3 | enter parameters | cfg.rb:101:24:101:25 | 42 | false | -| cfg.rb:101:1:104:3 | enter parameters | cfg.rb:101:24:101:25 | 42 | no-match | -| cfg.rb:101:1:104:3 | enter parameters | cfg.rb:101:24:101:25 | 42 | true | -| cfg.rb:101:1:104:3 | enter parameters | cfg.rb:101:28:101:30 | key | match | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:172:21:172:29 | self | false | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:172:36:172:45 | self | true | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:174:1:174:9 | self | false | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:174:1:174:23 | ... unless ... | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:176:1:176:41 | until ... | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:176:17:176:17 | x | false | -| cfg.rb:179:30:179:30 | i | cfg.rb:179:1:179:36 | ... until ... | true | -| cfg.rb:179:30:179:30 | i | cfg.rb:179:2:179:13 | self | false | -| cfg.rb:182:7:182:7 | x | cfg.rb:182:1:186:3 | while ... | false | -| cfg.rb:182:7:182:7 | x | cfg.rb:183:3:183:3 | x | true | -| cfg.rb:183:3:183:3 | x | cfg.rb:184:3:184:25 | if ... | false | -| cfg.rb:183:3:183:3 | x | cfg.rb:184:18:184:21 | redo | true | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:205:1:205:3 | __synth__0__1 | false | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:205:1:205:3 | nil | true | -| cfg.rb:188:30:188:30 | i | cfg.rb:188:1:188:35 | ... while ... | false | -| cfg.rb:188:30:188:30 | i | cfg.rb:188:2:188:13 | self | true | -| constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | true | -| constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | constant_compound_assign.rb:5:22:5:24 | 123 | false | -| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | true | -| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:14:18:14:20 | 123 | false | -| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | true | -| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:19:21:19:23 | 123 | false | -| exit.rb:1:1:6:3 | enter m1 | exit.rb:2:3:4:5 | if ... | false | -| exit.rb:1:1:6:3 | enter m1 | exit.rb:3:5:3:10 | self | true | -| exit.rb:8:1:13:3 | enter m2 | exit.rb:9:3:11:5 | if ... | false | -| exit.rb:8:1:13:3 | enter m2 | exit.rb:10:5:10:18 | self | true | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:3:5:3:30 | self | true | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:9:4:9 | x | false | -| ifs.rb:1:1:58:4 | enter ifs.rb | ifs.rb:36:1:38:3 | conditional_method_def | false | -| ifs.rb:1:1:58:4 | enter ifs.rb | ifs.rb:36:1:38:17 | ... unless ... | true | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:9:4:24 | [false] ... and ... | false | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:20:4:20 | x | true | -| ifs.rb:4:9:4:24 | [false] ... and ... | ifs.rb:4:9:4:38 | [false] ... and ... | false | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:32:4:32 | x | true | -| ifs.rb:4:9:4:38 | [false] ... and ... | ifs.rb:7:5:7:35 | self | false | -| ifs.rb:4:9:4:38 | [true] ... and ... | ifs.rb:5:5:5:17 | self | true | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:9:4:24 | [false] ... and ... | false | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:9:4:24 | [true] ... and ... | true | -| ifs.rb:4:30:4:38 | [false] ! ... | ifs.rb:4:9:4:38 | [false] ... and ... | false | -| ifs.rb:4:30:4:38 | [true] ! ... | ifs.rb:4:9:4:38 | [true] ... and ... | true | -| ifs.rb:4:31:4:38 | [false] ( ... ) | ifs.rb:4:30:4:38 | [true] ! ... | false | -| ifs.rb:4:31:4:38 | [true] ( ... ) | ifs.rb:4:30:4:38 | [false] ! ... | true | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:31:4:38 | [false] ( ... ) | false | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:31:4:38 | [true] ( ... ) | true | -| ifs.rb:11:1:16:3 | enter m2 | ifs.rb:12:3:14:5 | if ... | false | -| ifs.rb:11:1:16:3 | enter m2 | ifs.rb:13:12:13:12 | 0 | true | -| ifs.rb:18:1:26:3 | enter m3 | ifs.rb:19:3:24:5 | if ... | false | -| ifs.rb:18:1:26:3 | enter m3 | ifs.rb:20:5:20:5 | x | true | -| ifs.rb:20:5:20:5 | x | ifs.rb:21:5:23:7 | if ... | false | -| ifs.rb:20:5:20:5 | x | ifs.rb:22:7:22:7 | x | true | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:29:16:29:17 | b2 | true | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:29:21:29:22 | b3 | false | -| ifs.rb:29:10:29:23 | [false] ( ... ) | ifs.rb:29:41:29:50 | !b2 \|\| !b3 | false | -| ifs.rb:29:10:29:23 | [true] ( ... ) | ifs.rb:29:28:29:35 | b2 \|\| b3 | true | -| ifs.rb:29:11:29:22 | [false] ... ? ... : ... | ifs.rb:29:10:29:23 | [false] ( ... ) | false | -| ifs.rb:29:11:29:22 | [true] ... ? ... : ... | ifs.rb:29:10:29:23 | [true] ( ... ) | true | -| ifs.rb:29:16:29:17 | b2 | ifs.rb:29:11:29:22 | [false] ... ? ... : ... | false | -| ifs.rb:29:16:29:17 | b2 | ifs.rb:29:11:29:22 | [true] ... ? ... : ... | true | -| ifs.rb:29:21:29:22 | b3 | ifs.rb:29:11:29:22 | [false] ... ? ... : ... | false | -| ifs.rb:29:21:29:22 | b3 | ifs.rb:29:11:29:22 | [true] ... ? ... : ... | true | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:18:33:19 | b2 | true | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:27:33:28 | b3 | false | -| ifs.rb:33:6:33:49 | [false] ( ... ) | ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | false | -| ifs.rb:33:6:33:49 | [true] ( ... ) | ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | true | -| ifs.rb:33:7:33:48 | [false] if ... | ifs.rb:33:6:33:49 | [false] ( ... ) | false | -| ifs.rb:33:7:33:48 | [true] if ... | ifs.rb:33:6:33:49 | [true] ( ... ) | true | -| ifs.rb:33:13:33:19 | [false] then ... | ifs.rb:33:7:33:48 | [false] if ... | false | -| ifs.rb:33:13:33:19 | [true] then ... | ifs.rb:33:7:33:48 | [true] if ... | true | -| ifs.rb:33:18:33:19 | b2 | ifs.rb:33:13:33:19 | [false] then ... | false | -| ifs.rb:33:18:33:19 | b2 | ifs.rb:33:13:33:19 | [true] then ... | true | -| ifs.rb:33:21:33:44 | [false] elsif ... | ifs.rb:33:7:33:48 | [false] if ... | false | -| ifs.rb:33:21:33:44 | [true] elsif ... | ifs.rb:33:7:33:48 | [true] if ... | true | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:35:33:36 | b4 | true | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:43:33:44 | b5 | false | -| ifs.rb:33:30:33:36 | [false] then ... | ifs.rb:33:21:33:44 | [false] elsif ... | false | -| ifs.rb:33:30:33:36 | [true] then ... | ifs.rb:33:21:33:44 | [true] elsif ... | true | -| ifs.rb:33:35:33:36 | b4 | ifs.rb:33:30:33:36 | [false] then ... | false | -| ifs.rb:33:35:33:36 | b4 | ifs.rb:33:30:33:36 | [true] then ... | true | -| ifs.rb:33:38:33:44 | [false] else ... | ifs.rb:33:21:33:44 | [false] elsif ... | false | -| ifs.rb:33:38:33:44 | [true] else ... | ifs.rb:33:21:33:44 | [true] elsif ... | true | -| ifs.rb:33:43:33:44 | b5 | ifs.rb:33:38:33:44 | [false] else ... | false | -| ifs.rb:33:43:33:44 | b5 | ifs.rb:33:38:33:44 | [true] else ... | true | -| ifs.rb:40:1:44:3 | enter constant_condition | ifs.rb:41:6:41:10 | [false] ! ... | true | -| ifs.rb:41:6:41:10 | [false] ! ... | ifs.rb:41:3:43:5 | if ... | false | -| ifs.rb:46:1:52:3 | enter empty_else | ifs.rb:48:5:48:15 | self | true | -| ifs.rb:46:1:52:3 | enter empty_else | ifs.rb:49:3:49:6 | else ... | false | -| ifs.rb:54:1:58:3 | enter disjunct | ifs.rb:55:7:55:14 | [true] ... \|\| ... | true | -| ifs.rb:54:1:58:3 | enter disjunct | ifs.rb:55:13:55:14 | b2 | false | -| ifs.rb:55:6:55:15 | [false] ( ... ) | ifs.rb:55:3:57:5 | if ... | false | -| ifs.rb:55:6:55:15 | [true] ( ... ) | ifs.rb:56:5:56:19 | self | true | -| ifs.rb:55:7:55:14 | [false] ... \|\| ... | ifs.rb:55:6:55:15 | [false] ( ... ) | false | -| ifs.rb:55:7:55:14 | [true] ... \|\| ... | ifs.rb:55:6:55:15 | [true] ( ... ) | true | -| ifs.rb:55:13:55:14 | b2 | ifs.rb:55:7:55:14 | [false] ... \|\| ... | false | -| ifs.rb:55:13:55:14 | b2 | ifs.rb:55:7:55:14 | [true] ... \|\| ... | true | -| loops.rb:2:9:2:9 | x | loops.rb:2:3:5:5 | while ... | false | -| loops.rb:2:9:2:9 | x | loops.rb:3:5:3:10 | self | true | -| loops.rb:9:9:9:9 | x | loops.rb:9:3:20:5 | while ... | false | -| loops.rb:9:9:9:9 | x | loops.rb:10:5:10:10 | self | true | -| loops.rb:10:5:10:10 | self | loops.rb:13:7:13:11 | break | true | -| loops.rb:10:5:10:10 | self | loops.rb:14:11:14:11 | x | false | -| loops.rb:14:11:14:11 | x | loops.rb:15:7:15:10 | next | true | -| loops.rb:14:11:14:11 | x | loops.rb:16:11:16:11 | x | false | -| loops.rb:16:11:16:11 | x | loops.rb:16:5:17:10 | elsif ... | false | -| loops.rb:16:11:16:11 | x | loops.rb:17:7:17:10 | redo | true | -| loops.rb:31:9:31:9 | x | loops.rb:31:3:32:5 | while ... | false | -| loops.rb:31:9:31:9 | x | loops.rb:31:15:32:5 | do ... | true | -| raise.rb:7:1:12:3 | enter m1 | raise.rb:8:3:10:5 | if ... | false | -| raise.rb:7:1:12:3 | enter m1 | raise.rb:9:5:9:17 | self | true | -| raise.rb:14:1:23:3 | enter m2 | raise.rb:16:5:18:7 | if ... | false | -| raise.rb:14:1:23:3 | enter m2 | raise.rb:17:7:17:22 | self | true | -| raise.rb:17:7:17:22 | self | raise.rb:14:1:23:3 | exit m2 (abnormal) | exception | -| raise.rb:17:7:17:22 | self | raise.rb:20:5:20:18 | self | match | -| raise.rb:25:1:34:3 | enter m3 | raise.rb:27:5:29:7 | if ... | false | -| raise.rb:25:1:34:3 | enter m3 | raise.rb:28:7:28:22 | self | true | -| raise.rb:36:1:45:3 | enter m4 | raise.rb:38:5:40:7 | if ... | false | -| raise.rb:36:1:45:3 | enter m4 | raise.rb:39:7:39:22 | self | true | -| raise.rb:47:1:55:3 | enter m5 | raise.rb:49:5:51:7 | if ... | false | -| raise.rb:47:1:55:3 | enter m5 | raise.rb:50:7:50:22 | self | true | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:59:5:61:7 | if ... | false | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:60:7:60:22 | self | true | -| raise.rb:60:7:60:22 | self | raise.rb:62:22:62:31 | ExceptionB | no-match | -| raise.rb:60:7:60:22 | self | raise.rb:62:36:62:36 | e | match | -| raise.rb:62:22:62:31 | ExceptionB | raise.rb:57:1:66:3 | exit m6 (abnormal) | exception | -| raise.rb:62:22:62:31 | ExceptionB | raise.rb:62:36:62:36 | e | match | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:70:5:70:17 | self | true | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:71:9:71:9 | x | false | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:76:3:76:15 | [ensure: exception] self | exception | -| raise.rb:71:9:71:9 | x | raise.rb:71:3:72:18 | elsif ... | false | -| raise.rb:71:9:71:9 | x | raise.rb:72:13:72:17 | x < 0 | true | -| raise.rb:71:9:71:9 | x | raise.rb:76:3:76:15 | [ensure: exception] self | exception | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:83:7:83:19 | self | true | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:84:11:84:11 | x | false | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:89:5:89:17 | [ensure: exception] self | exception | -| raise.rb:84:11:84:11 | x | raise.rb:84:5:85:20 | elsif ... | false | -| raise.rb:84:11:84:11 | x | raise.rb:85:15:85:19 | x < 0 | true | -| raise.rb:84:11:84:11 | x | raise.rb:89:5:89:17 | [ensure: exception] self | exception | -| raise.rb:97:8:97:8 | x | raise.rb:98:7:98:19 | self | true | -| raise.rb:97:8:97:8 | x | raise.rb:99:11:99:11 | x | false | -| raise.rb:97:8:97:8 | x | raise.rb:104:5:104:23 | [ensure: exception] self | exception | -| raise.rb:99:11:99:11 | x | raise.rb:99:5:100:20 | elsif ... | false | -| raise.rb:99:11:99:11 | x | raise.rb:100:15:100:19 | x < 0 | true | -| raise.rb:99:11:99:11 | x | raise.rb:104:5:104:23 | [ensure: exception] self | exception | -| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:106:7:108:9 | [ensure: exception] if ... | false | -| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:107:9:107:26 | [ensure: exception] self | true | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:106:7:108:9 | [ensure: return] if ... | false | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:107:9:107:26 | [ensure: return] self | true | -| raise.rb:106:10:106:11 | b1 | raise.rb:106:7:108:9 | if ... | false | -| raise.rb:106:10:106:11 | b1 | raise.rb:107:9:107:26 | self | true | -| raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:116:3:118:5 | [ensure: return] if ... | false | -| raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:117:5:117:22 | [ensure: return] self | true | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:116:3:118:5 | [ensure: exception] if ... | false | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:117:5:117:22 | [ensure: exception] self | true | -| raise.rb:115:3:115:22 | self | raise.rb:116:3:118:5 | if ... | false | -| raise.rb:115:3:115:22 | self | raise.rb:117:5:117:22 | self | true | -| raise.rb:121:1:126:3 | enter m10 | raise.rb:121:14:121:30 | self | false | -| raise.rb:121:1:126:3 | enter m10 | raise.rb:121:14:121:30 | self | no-match | -| raise.rb:121:1:126:3 | enter m10 | raise.rb:121:14:121:30 | self | true | -| raise.rb:121:1:126:3 | enter m10 | raise.rb:125:3:125:51 | self | match | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:130:5:132:7 | if ... | false | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:131:7:131:22 | self | true | -| raise.rb:131:7:131:22 | self | raise.rb:133:3:133:19 | rescue ... | match | -| raise.rb:131:7:131:22 | self | raise.rb:134:10:134:19 | ExceptionB | no-match | -| raise.rb:134:10:134:19 | ExceptionB | raise.rb:135:5:135:21 | self | match | -| raise.rb:134:10:134:19 | ExceptionB | raise.rb:137:5:137:17 | [ensure: exception] self | exception | -| raise.rb:142:1:148:3 | enter m12 | raise.rb:143:3:145:5 | if ... | false | -| raise.rb:142:1:148:3 | enter m12 | raise.rb:144:5:144:12 | self | true | -| raise.rb:155:16:155:50 | enter { ... } | raise.rb:155:25:155:32 | self | true | -| raise.rb:155:16:155:50 | enter { ... } | raise.rb:155:25:155:48 | ... if ... | false | -| raise.rb:160:9:162:7 | enter -> { ... } | raise.rb:161:7:161:14 | self | false | -| raise.rb:160:9:162:7 | enter -> { ... } | raise.rb:161:7:161:23 | ... unless ... | true | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:174:8:174:23 | [true] ... \|\| ... | true | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:174:14:174:15 | b2 | false | -| raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:177:14:177:14 | 2 | false | -| raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:179:10:179:19 | ExceptionA | exception | -| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:175:14:175:14 | 1 | true | -| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:179:10:179:19 | ExceptionA | exception | -| raise.rb:174:14:174:15 | b2 | raise.rb:174:8:174:23 | [false] ... \|\| ... | false | -| raise.rb:174:14:174:15 | b2 | raise.rb:174:8:174:23 | [true] ... \|\| ... | true | -| raise.rb:174:14:174:15 | b2 | raise.rb:179:10:179:19 | ExceptionA | exception | -| raise.rb:179:10:179:19 | ExceptionA | raise.rb:172:1:182:3 | exit m16 (abnormal) | exception | -| raise.rb:179:10:179:19 | ExceptionA | raise.rb:180:12:180:12 | 3 | match | -joinBlockPredecessor -| break_ensure.rb:1:1:11:3 | exit m1 | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | 1 | -| break_ensure.rb:1:1:11:3 | exit m1 | break_ensure.rb:8:3:10:5 | if ... | 0 | -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:2:9:2:9 | x | 0 | -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:3:8:3:8 | x | 1 | -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:4:7:4:11 | break | 2 | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:1:1:11:3 | enter m1 | 0 | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:3:5:5:7 | if ... | 1 | -| break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | break_ensure.rb:8:6:8:13 | [ensure: exception] self | 0 | -| break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | break_ensure.rb:9:5:9:23 | [ensure: exception] self | 1 | -| break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:2:3:6:5 | while ... | 0 | -| break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:9:5:9:23 | self | 1 | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:14:9:14:9 | x | 0 | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | 1 | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | 2 | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:13:1:25:3 | enter m2 | 0 | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | if ... | 1 | -| break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:17:9:17:13 | break | 0 | -| break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:21:9:21:20 | [ensure: break] self | 1 | -| break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:20:10:20:10 | [ensure: exception] y | 0 | -| break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:21:9:21:20 | [ensure: exception] self | 1 | -| break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:16:7:18:9 | if ... | 0 | -| break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:21:9:21:20 | self | 1 | -| break_ensure.rb:27:1:42:3 | exit m3 | break_ensure.rb:27:1:42:3 | exit m3 (normal) | 0 | -| break_ensure.rb:27:1:42:3 | exit m3 | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | 1 | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | 1 | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:33:5:39:7 | while ... | 0 | -| break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | break_ensure.rb:33:11:33:11 | [ensure: exception] y | 0 | -| break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | break_ensure.rb:36:11:36:15 | [ensure: exception] break | 1 | -| break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:33:11:33:11 | [ensure: return] y | 0 | -| break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:36:11:36:15 | [ensure: return] break | 1 | -| break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:33:11:33:11 | y | 0 | -| break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:36:11:36:15 | break | 1 | -| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:27:1:42:3 | enter m3 | 0 | -| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | 1 | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:30:7:30:12 | return | 0 | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | 1 | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:29:5:31:7 | if ... | 0 | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:35:9:37:11 | if ... | 1 | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:45:9:45:9 | x | 0 | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | 1 | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:52:15:52:16 | 10 | 2 | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | 3 | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:44:1:56:3 | enter m4 | 0 | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:7:53:9 | if ... | 1 | -| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:47:10:47:10 | x | 0 | -| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:48:9:48:16 | self | 1 | -| case.rb:2:3:5:5 | case ... | case.rb:3:18:3:41 | if ... | 0 | -| case.rb:2:3:5:5 | case ... | case.rb:4:5:4:24 | [no-match] when ... | 1 | -| case.rb:2:3:5:5 | case ... | case.rb:4:17:4:24 | self | 2 | -| case.rb:3:18:3:41 | if ... | case.rb:3:21:3:22 | self | 0 | -| case.rb:3:18:3:41 | if ... | case.rb:3:29:3:37 | self | 1 | -| case.rb:9:3:17:5 | case ... | case.rb:8:1:18:3 | enter case_match | 0 | -| case.rb:9:3:17:5 | case ... | case.rb:11:15:11:15 | 3 | 1 | -| case.rb:9:3:17:5 | case ... | case.rb:13:7:13:7 | 4 | 2 | -| case.rb:9:3:17:5 | case ... | case.rb:14:25:14:25 | 6 | 3 | -| case.rb:9:3:17:5 | case ... | case.rb:15:28:15:28 | 7 | 4 | -| case.rb:9:3:17:5 | case ... | case.rb:16:10:16:10 | 8 | 5 | -| case.rb:20:1:24:3 | exit case_match_no_match | case.rb:20:1:24:3 | exit case_match_no_match (abnormal) | 0 | -| case.rb:20:1:24:3 | exit case_match_no_match | case.rb:21:3:23:5 | case ... | 1 | -| case.rb:26:1:30:3 | exit case_match_raise | case.rb:26:1:30:3 | exit case_match_raise (abnormal) | 0 | -| case.rb:26:1:30:3 | exit case_match_raise | case.rb:27:3:29:5 | case ... | 1 | -| case.rb:32:1:39:3 | exit case_match_array | case.rb:32:1:39:3 | exit case_match_array (abnormal) | 0 | -| case.rb:32:1:39:3 | exit case_match_array | case.rb:33:3:38:5 | case ... | 1 | -| case.rb:32:1:39:3 | exit case_match_array (abnormal) | case.rb:37:5:37:27 | in ... then ... | 0 | -| case.rb:32:1:39:3 | exit case_match_array (abnormal) | case.rb:37:8:37:26 | [ ..., * ] | 1 | -| case.rb:33:3:38:5 | case ... | case.rb:32:1:39:3 | enter case_match_array | 0 | -| case.rb:33:3:38:5 | case ... | case.rb:35:9:35:9 | x | 1 | -| case.rb:33:3:38:5 | case ... | case.rb:36:9:36:9 | x | 2 | -| case.rb:33:3:38:5 | case ... | case.rb:37:25:37:25 | e | 3 | -| case.rb:41:1:45:3 | exit case_match_find | case.rb:41:1:45:3 | exit case_match_find (abnormal) | 0 | -| case.rb:41:1:45:3 | exit case_match_find | case.rb:43:20:43:20 | y | 1 | -| case.rb:41:1:45:3 | exit case_match_find (abnormal) | case.rb:41:1:45:3 | enter case_match_find | 0 | -| case.rb:41:1:45:3 | exit case_match_find (abnormal) | case.rb:43:10:43:10 | x | 1 | -| case.rb:41:1:45:3 | exit case_match_find (abnormal) | case.rb:43:16:43:16 | 2 | 2 | -| case.rb:47:1:53:3 | exit case_match_hash | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | 0 | -| case.rb:47:1:53:3 | exit case_match_hash | case.rb:48:3:52:5 | case ... | 1 | -| case.rb:47:1:53:3 | exit case_match_hash (abnormal) | case.rb:51:5:51:17 | in ... then ... | 0 | -| case.rb:47:1:53:3 | exit case_match_hash (abnormal) | case.rb:51:8:51:16 | { ..., ** } | 1 | -| case.rb:48:3:52:5 | case ... | case.rb:49:29:49:32 | rest | 0 | -| case.rb:48:3:52:5 | case ... | case.rb:50:16:50:16 | 1 | 1 | -| case.rb:48:3:52:5 | case ... | case.rb:51:8:51:16 | { ..., ** } | 2 | -| case.rb:50:5:50:25 | in ... then ... | case.rb:47:1:53:3 | enter case_match_hash | 0 | -| case.rb:50:5:50:25 | in ... then ... | case.rb:49:8:49:34 | { ..., ** } | 1 | -| case.rb:50:5:50:25 | in ... then ... | case.rb:49:20:49:20 | 1 | 2 | -| case.rb:51:5:51:17 | in ... then ... | case.rb:50:5:50:25 | in ... then ... | 0 | -| case.rb:51:5:51:17 | in ... then ... | case.rb:50:8:50:24 | { ..., ** } | 1 | -| case.rb:51:5:51:17 | in ... then ... | case.rb:50:16:50:16 | 1 | 2 | -| case.rb:56:3:60:5 | case ... | case.rb:55:1:61:3 | enter case_match_variable | 0 | -| case.rb:56:3:60:5 | case ... | case.rb:58:5:58:10 | in ... then ... | 1 | -| case.rb:64:3:66:5 | case ... | case.rb:63:1:67:3 | enter case_match_underscore | 0 | -| case.rb:64:3:66:5 | case ... | case.rb:65:12:65:12 | _ | 1 | -| case.rb:69:1:93:3 | exit case_match_various | case.rb:69:1:93:3 | exit case_match_various (abnormal) | 0 | -| case.rb:69:1:93:3 | exit case_match_various | case.rb:72:3:92:5 | case ... | 1 | -| case.rb:72:3:92:5 | case ... | case.rb:69:1:93:3 | enter case_match_various | 0 | -| case.rb:72:3:92:5 | case ... | case.rb:74:5:74:11 | in ... then ... | 1 | -| case.rb:72:3:92:5 | case ... | case.rb:75:5:75:15 | in ... then ... | 2 | -| case.rb:72:3:92:5 | case ... | case.rb:76:5:76:18 | in ... then ... | 3 | -| case.rb:72:3:92:5 | case ... | case.rb:77:5:77:18 | in ... then ... | 4 | -| case.rb:72:3:92:5 | case ... | case.rb:78:5:78:19 | in ... then ... | 5 | -| case.rb:72:3:92:5 | case ... | case.rb:79:5:79:14 | in ... then ... | 6 | -| case.rb:72:3:92:5 | case ... | case.rb:80:5:80:12 | in ... then ... | 7 | -| case.rb:72:3:92:5 | case ... | case.rb:81:5:81:11 | in ... then ... | 8 | -| case.rb:72:3:92:5 | case ... | case.rb:82:20:82:20 | 1 | 9 | -| case.rb:72:3:92:5 | case ... | case.rb:83:5:83:26 | in ... then ... | 10 | -| case.rb:72:3:92:5 | case ... | case.rb:83:12:83:15 | ^... | 11 | -| case.rb:72:3:92:5 | case ... | case.rb:83:20:83:25 | string | 12 | -| case.rb:72:3:92:5 | case ... | case.rb:84:5:84:17 | in ... then ... | 13 | -| case.rb:72:3:92:5 | case ... | case.rb:85:5:85:23 | in ... then ... | 14 | -| case.rb:72:3:92:5 | case ... | case.rb:86:5:86:11 | in ... then ... | 15 | -| case.rb:72:3:92:5 | case ... | case.rb:87:5:87:17 | in ... then ... | 16 | -| case.rb:72:3:92:5 | case ... | case.rb:88:5:88:15 | in ... then ... | 17 | -| case.rb:72:3:92:5 | case ... | case.rb:88:14:88:15 | 10 | 18 | -| case.rb:72:3:92:5 | case ... | case.rb:89:5:89:69 | in ... then ... | 19 | -| case.rb:72:3:92:5 | case ... | case.rb:89:14:89:17 | self | 20 | -| case.rb:72:3:92:5 | case ... | case.rb:89:21:89:24 | true | 21 | -| case.rb:72:3:92:5 | case ... | case.rb:89:28:89:32 | false | 22 | -| case.rb:72:3:92:5 | case ... | case.rb:89:36:89:43 | __LINE__ | 23 | -| case.rb:72:3:92:5 | case ... | case.rb:89:47:89:54 | __FILE__ | 24 | -| case.rb:72:3:92:5 | case ... | case.rb:89:58:89:69 | __ENCODING__ | 25 | -| case.rb:72:3:92:5 | case ... | case.rb:90:5:90:13 | in ... then ... | 26 | -| case.rb:72:3:92:5 | case ... | case.rb:91:5:91:25 | in ... then ... | 27 | -| case.rb:72:3:92:5 | case ... | case.rb:91:13:91:14 | "" | 28 | -| case.rb:72:3:92:5 | case ... | case.rb:91:18:91:19 | [ ..., * ] | 29 | -| case.rb:72:3:92:5 | case ... | case.rb:91:23:91:24 | { ..., ** } | 30 | -| case.rb:95:1:99:3 | exit case_match_guard_no_else | case.rb:95:1:99:3 | exit case_match_guard_no_else (abnormal) | 0 | -| case.rb:95:1:99:3 | exit case_match_guard_no_else | case.rb:97:25:97:25 | 6 | 1 | -| cfg.html.erb:18:14:22:16 | if ... | cfg.html.erb:19:19:19:32 | self | 0 | -| cfg.html.erb:18:14:22:16 | if ... | cfg.html.erb:21:19:21:32 | self | 1 | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:42:15:42:24 | self | 0 | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:43:21:43:31 | self | 1 | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:44:8:44:18 | self | 2 | -| cfg.rb:43:3:43:31 | [match] when ... | cfg.rb:43:8:43:8 | 2 | 0 | -| cfg.rb:43:3:43:31 | [match] when ... | cfg.rb:43:11:43:11 | 3 | 1 | -| cfg.rb:43:3:43:31 | [match] when ... | cfg.rb:43:14:43:14 | 4 | 2 | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:48:20:48:29 | self | 0 | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:49:3:49:37 | [no-match] when ... | 1 | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:49:27:49:37 | self | 2 | -| cfg.rb:49:3:49:37 | [match] when ... | cfg.rb:49:8:49:8 | b | 0 | -| cfg.rb:49:3:49:37 | [match] when ... | cfg.rb:49:16:49:16 | b | 1 | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:60:27:60:31 | hello | 0 | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:60:37:60:39 | bye | 1 | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:75:15:75:15 | 0 | 0 | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:75:17:75:43 | elsif ... | 1 | -| cfg.rb:75:17:75:43 | elsif ... | cfg.rb:75:35:75:36 | 10 | 0 | -| cfg.rb:75:17:75:43 | elsif ... | cfg.rb:75:43:75:43 | x | 1 | -| cfg.rb:90:1:93:3 | exit { ... } (normal) | cfg.rb:91:3:91:24 | if ... | 0 | -| cfg.rb:90:1:93:3 | exit { ... } (normal) | cfg.rb:91:17:91:20 | next | 1 | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:90:5:90:5 | [false] ! ... | 1 | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:90:5:90:5 | x | 0 | -| cfg.rb:101:28:101:30 | key | cfg.rb:101:1:104:3 | enter parameters | 0 | -| cfg.rb:101:28:101:30 | key | cfg.rb:101:24:101:25 | 42 | 1 | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:90:5:90:5 | if ... | 0 | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:113:1:113:9 | self | 1 | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:113:1:113:19 | ... if ... | 0 | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:136:12:136:29 | self | 1 | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:172:21:172:29 | self | 0 | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:172:36:172:45 | self | 1 | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:172:1:172:49 | unless ... | 0 | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:174:1:174:9 | self | 1 | -| cfg.rb:176:7:176:7 | x | cfg.rb:174:1:174:23 | ... unless ... | 0 | -| cfg.rb:176:7:176:7 | x | cfg.rb:176:17:176:17 | x | 1 | -| cfg.rb:179:30:179:30 | i | cfg.rb:176:1:176:41 | until ... | 0 | -| cfg.rb:179:30:179:30 | i | cfg.rb:179:2:179:13 | self | 1 | -| cfg.rb:182:7:182:7 | x | cfg.rb:179:1:179:36 | ... until ... | 0 | -| cfg.rb:182:7:182:7 | x | cfg.rb:184:3:184:25 | if ... | 1 | -| cfg.rb:183:3:183:3 | x | cfg.rb:182:7:182:7 | x | 0 | -| cfg.rb:183:3:183:3 | x | cfg.rb:184:18:184:21 | redo | 1 | -| cfg.rb:188:30:188:30 | i | cfg.rb:182:1:186:3 | while ... | 0 | -| cfg.rb:188:30:188:30 | i | cfg.rb:188:2:188:13 | self | 1 | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:205:1:205:3 | __synth__0__1 | 0 | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:205:1:205:3 | nil | 0 | -| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | 0 | -| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:5:22:5:24 | 123 | 1 | -| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | 0 | -| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:14:18:14:20 | 123 | 1 | -| constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | 0 | -| constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | constant_compound_assign.rb:19:21:19:23 | 123 | 1 | -| exit.rb:1:1:6:3 | exit m1 | exit.rb:2:3:4:5 | if ... | 0 | -| exit.rb:1:1:6:3 | exit m1 | exit.rb:3:5:3:10 | self | 1 | -| exit.rb:8:1:13:3 | exit m2 | exit.rb:9:3:11:5 | if ... | 0 | -| exit.rb:8:1:13:3 | exit m2 | exit.rb:10:5:10:18 | self | 1 | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:3:5:3:30 | self | 0 | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:4:3:7:35 | elsif ... | 1 | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:5:5:5:17 | self | 0 | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:7:5:7:35 | self | 1 | -| ifs.rb:4:9:4:24 | [false] ... and ... | ifs.rb:4:9:4:9 | x | 0 | -| ifs.rb:4:9:4:24 | [false] ... and ... | ifs.rb:4:20:4:20 | x | 1 | -| ifs.rb:4:9:4:38 | [false] ... and ... | ifs.rb:4:9:4:24 | [false] ... and ... | 0 | -| ifs.rb:4:9:4:38 | [false] ... and ... | ifs.rb:4:30:4:38 | [false] ! ... | 1 | -| ifs.rb:11:1:16:3 | exit m2 (normal) | ifs.rb:12:3:14:5 | if ... | 0 | -| ifs.rb:11:1:16:3 | exit m2 (normal) | ifs.rb:13:12:13:12 | 0 | 1 | -| ifs.rb:19:3:24:5 | if ... | ifs.rb:18:1:26:3 | enter m3 | 0 | -| ifs.rb:19:3:24:5 | if ... | ifs.rb:21:5:23:7 | if ... | 1 | -| ifs.rb:21:5:23:7 | if ... | ifs.rb:20:5:20:5 | x | 0 | -| ifs.rb:21:5:23:7 | if ... | ifs.rb:22:7:22:7 | x | 1 | -| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:29:28:29:35 | b2 \|\| b3 | 0 | -| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:29:41:29:50 | !b2 \|\| !b3 | 1 | -| ifs.rb:29:11:29:22 | [false] ... ? ... : ... | ifs.rb:29:16:29:17 | b2 | 0 | -| ifs.rb:29:11:29:22 | [false] ... ? ... : ... | ifs.rb:29:21:29:22 | b3 | 1 | -| ifs.rb:29:11:29:22 | [true] ... ? ... : ... | ifs.rb:29:16:29:17 | b2 | 0 | -| ifs.rb:29:11:29:22 | [true] ... ? ... : ... | ifs.rb:29:21:29:22 | b3 | 1 | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | 0 | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | 1 | -| ifs.rb:33:7:33:48 | [false] if ... | ifs.rb:33:13:33:19 | [false] then ... | 0 | -| ifs.rb:33:7:33:48 | [false] if ... | ifs.rb:33:21:33:44 | [false] elsif ... | 1 | -| ifs.rb:33:7:33:48 | [true] if ... | ifs.rb:33:13:33:19 | [true] then ... | 0 | -| ifs.rb:33:7:33:48 | [true] if ... | ifs.rb:33:21:33:44 | [true] elsif ... | 1 | -| ifs.rb:33:21:33:44 | [false] elsif ... | ifs.rb:33:30:33:36 | [false] then ... | 0 | -| ifs.rb:33:21:33:44 | [false] elsif ... | ifs.rb:33:38:33:44 | [false] else ... | 1 | -| ifs.rb:33:21:33:44 | [true] elsif ... | ifs.rb:33:30:33:36 | [true] then ... | 0 | -| ifs.rb:33:21:33:44 | [true] elsif ... | ifs.rb:33:38:33:44 | [true] else ... | 1 | -| ifs.rb:36:1:38:17 | ... unless ... | ifs.rb:1:1:58:4 | enter ifs.rb | 0 | -| ifs.rb:36:1:38:17 | ... unless ... | ifs.rb:36:1:38:3 | conditional_method_def | 1 | -| ifs.rb:47:3:50:5 | if ... | ifs.rb:48:5:48:15 | self | 0 | -| ifs.rb:47:3:50:5 | if ... | ifs.rb:49:3:49:6 | else ... | 1 | -| ifs.rb:55:3:57:5 | if ... | ifs.rb:55:6:55:15 | [false] ( ... ) | 0 | -| ifs.rb:55:3:57:5 | if ... | ifs.rb:56:5:56:19 | self | 1 | -| ifs.rb:55:7:55:14 | [true] ... \|\| ... | ifs.rb:54:1:58:3 | enter disjunct | 0 | -| ifs.rb:55:7:55:14 | [true] ... \|\| ... | ifs.rb:55:13:55:14 | b2 | 1 | -| loops.rb:2:9:2:9 | x | loops.rb:1:1:6:3 | enter m1 | 0 | -| loops.rb:2:9:2:9 | x | loops.rb:3:5:3:10 | self | 1 | -| loops.rb:9:3:20:5 | while ... | loops.rb:9:9:9:9 | x | 0 | -| loops.rb:9:3:20:5 | while ... | loops.rb:13:7:13:11 | break | 1 | -| loops.rb:9:9:9:9 | x | loops.rb:8:1:22:3 | enter m2 | 0 | -| loops.rb:9:9:9:9 | x | loops.rb:15:7:15:10 | next | 1 | -| loops.rb:9:9:9:9 | x | loops.rb:16:5:17:10 | elsif ... | 2 | -| loops.rb:10:5:10:10 | self | loops.rb:9:9:9:9 | x | 0 | -| loops.rb:10:5:10:10 | self | loops.rb:17:7:17:10 | redo | 1 | -| loops.rb:31:9:31:9 | x | loops.rb:30:1:33:3 | enter m4 | 0 | -| loops.rb:31:9:31:9 | x | loops.rb:31:15:32:5 | do ... | 1 | -| raise.rb:7:1:12:3 | exit m1 | raise.rb:8:3:10:5 | if ... | 0 | -| raise.rb:7:1:12:3 | exit m1 | raise.rb:9:5:9:17 | self | 1 | -| raise.rb:14:1:23:3 | exit m2 | raise.rb:14:1:23:3 | exit m2 (abnormal) | 0 | -| raise.rb:14:1:23:3 | exit m2 | raise.rb:22:3:22:15 | self | 1 | -| raise.rb:22:3:22:15 | self | raise.rb:16:5:18:7 | if ... | 0 | -| raise.rb:22:3:22:15 | self | raise.rb:20:5:20:18 | self | 1 | -| raise.rb:33:3:33:15 | self | raise.rb:27:5:29:7 | if ... | 0 | -| raise.rb:33:3:33:15 | self | raise.rb:28:7:28:22 | self | 1 | -| raise.rb:44:3:44:15 | self | raise.rb:38:5:40:7 | if ... | 0 | -| raise.rb:44:3:44:15 | self | raise.rb:39:7:39:22 | self | 1 | -| raise.rb:54:3:54:15 | self | raise.rb:49:5:51:7 | if ... | 0 | -| raise.rb:54:3:54:15 | self | raise.rb:50:7:50:22 | self | 1 | -| raise.rb:57:1:66:3 | exit m6 | raise.rb:57:1:66:3 | exit m6 (abnormal) | 0 | -| raise.rb:57:1:66:3 | exit m6 | raise.rb:65:3:65:15 | self | 1 | -| raise.rb:62:36:62:36 | e | raise.rb:60:7:60:22 | self | 0 | -| raise.rb:62:36:62:36 | e | raise.rb:62:22:62:31 | ExceptionB | 1 | -| raise.rb:65:3:65:15 | self | raise.rb:59:5:61:7 | if ... | 0 | -| raise.rb:65:3:65:15 | self | raise.rb:62:36:62:36 | e | 1 | -| raise.rb:68:1:77:3 | exit m7 | raise.rb:68:1:77:3 | exit m7 (normal) | 0 | -| raise.rb:68:1:77:3 | exit m7 | raise.rb:76:3:76:15 | [ensure: exception] self | 1 | -| raise.rb:68:1:77:3 | exit m7 (normal) | raise.rb:72:13:72:17 | x < 0 | 0 | -| raise.rb:68:1:77:3 | exit m7 (normal) | raise.rb:76:3:76:15 | self | 1 | -| raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:68:1:77:3 | enter m7 | 0 | -| raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:70:5:70:17 | self | 1 | -| raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:71:3:72:18 | elsif ... | 2 | -| raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:71:9:71:9 | x | 3 | -| raise.rb:79:1:92:3 | exit m8 | raise.rb:79:1:92:3 | exit m8 (normal) | 0 | -| raise.rb:79:1:92:3 | exit m8 | raise.rb:89:5:89:17 | [ensure: exception] self | 1 | -| raise.rb:79:1:92:3 | exit m8 (normal) | raise.rb:85:15:85:19 | x < 0 | 0 | -| raise.rb:79:1:92:3 | exit m8 (normal) | raise.rb:89:5:89:17 | self | 1 | -| raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:79:1:92:3 | enter m8 | 0 | -| raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:83:7:83:19 | self | 1 | -| raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:84:5:85:20 | elsif ... | 2 | -| raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:84:11:84:11 | x | 3 | -| raise.rb:94:1:119:3 | exit m9 | raise.rb:94:1:119:3 | exit m9 (abnormal) | 1 | -| raise.rb:94:1:119:3 | exit m9 | raise.rb:94:1:119:3 | exit m9 (normal) | 0 | -| raise.rb:94:1:119:3 | exit m9 (abnormal) | raise.rb:116:3:118:5 | [ensure: exception] if ... | 0 | -| raise.rb:94:1:119:3 | exit m9 (abnormal) | raise.rb:117:5:117:22 | [ensure: exception] self | 2 | -| raise.rb:94:1:119:3 | exit m9 (abnormal) | raise.rb:117:5:117:22 | [ensure: return] self | 3 | -| raise.rb:94:1:119:3 | exit m9 (abnormal) | raise.rb:117:5:117:22 | self | 1 | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:116:3:118:5 | [ensure: return] if ... | 1 | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:116:3:118:5 | if ... | 0 | -| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:97:8:97:8 | x | 0 | -| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:98:7:98:19 | self | 1 | -| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:99:5:100:20 | elsif ... | 2 | -| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:99:11:99:11 | x | 3 | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:94:1:119:3 | enter m9 | 0 | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:100:15:100:19 | x < 0 | 1 | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:104:5:104:23 | [ensure: exception] self | 3 | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:104:5:104:23 | self | 2 | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:106:7:108:9 | [ensure: exception] if ... | 5 | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:106:7:108:9 | [ensure: return] if ... | 6 | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:106:7:108:9 | if ... | 4 | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:107:9:107:26 | [ensure: exception] self | 8 | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:107:9:107:26 | [ensure: return] self | 9 | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:107:9:107:26 | self | 7 | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | 11 | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | 13 | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | 12 | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | 14 | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:109:5:110:25 | ensure ... | 10 | -| raise.rb:121:1:126:3 | exit m10 | raise.rb:121:14:121:30 | self | 0 | -| raise.rb:121:1:126:3 | exit m10 | raise.rb:125:3:125:51 | self | 1 | -| raise.rb:128:1:140:3 | exit m11 | raise.rb:137:5:137:17 | [ensure: exception] self | 1 | -| raise.rb:128:1:140:3 | exit m11 | raise.rb:137:5:137:17 | self | 0 | -| raise.rb:137:5:137:17 | self | raise.rb:130:5:132:7 | if ... | 0 | -| raise.rb:137:5:137:17 | self | raise.rb:133:3:133:19 | rescue ... | 1 | -| raise.rb:137:5:137:17 | self | raise.rb:135:5:135:21 | self | 2 | -| raise.rb:142:1:148:3 | exit m12 (normal) | raise.rb:143:3:145:5 | if ... | 0 | -| raise.rb:142:1:148:3 | exit m12 (normal) | raise.rb:144:5:144:12 | self | 1 | -| raise.rb:155:16:155:50 | exit { ... } | raise.rb:155:25:155:32 | self | 1 | -| raise.rb:155:16:155:50 | exit { ... } | raise.rb:155:25:155:48 | ... if ... | 0 | -| raise.rb:160:9:162:7 | exit -> { ... } | raise.rb:161:7:161:14 | self | 1 | -| raise.rb:160:9:162:7 | exit -> { ... } | raise.rb:161:7:161:23 | ... unless ... | 0 | -| raise.rb:172:1:182:3 | exit m16 | raise.rb:172:1:182:3 | exit m16 (abnormal) | 1 | -| raise.rb:172:1:182:3 | exit m16 | raise.rb:172:1:182:3 | exit m16 (normal) | 0 | -| raise.rb:172:1:182:3 | exit m16 (normal) | raise.rb:175:14:175:14 | 1 | 0 | -| raise.rb:172:1:182:3 | exit m16 (normal) | raise.rb:177:14:177:14 | 2 | 1 | -| raise.rb:172:1:182:3 | exit m16 (normal) | raise.rb:180:12:180:12 | 3 | 2 | -| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:172:1:182:3 | enter m16 | 0 | -| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:174:14:174:15 | b2 | 1 | -| raise.rb:179:10:179:19 | ExceptionA | raise.rb:174:8:174:23 | [false] ... \|\| ... | 0 | -| raise.rb:179:10:179:19 | ExceptionA | raise.rb:174:8:174:23 | [true] ... \|\| ... | 1 | -| raise.rb:179:10:179:19 | ExceptionA | raise.rb:174:14:174:15 | b2 | 2 | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:2:9:2:13 | After ... < ... [false] | false | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:2:9:2:13 | After ... < ... [true] | true | +| break_ensure.rb:2:9:2:13 | After ... < ... [true] | break_ensure.rb:3:8:3:12 | After ... > ... [false] | false | +| break_ensure.rb:2:9:2:13 | After ... < ... [true] | break_ensure.rb:3:8:3:12 | After ... > ... [true] | true | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:8:6:8:18 | After call to nil? [false] | false | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:8:6:8:18 | After call to nil? [true] | true | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:14:9:14:13 | After ... < ... [false] | false | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:14:9:14:13 | After ... < ... [true] | true | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:16:10:16:14 | After ... > ... [false] | false | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:16:10:16:14 | After ... > ... [true] | true | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:20:10:20:15 | After call to nil? [false] | false | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:20:10:20:15 | After call to nil? [true] | true | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:29:8:29:13 | After call to nil? [false] | false | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:29:8:29:13 | After call to nil? [true] | true | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:33:11:33:15 | After ... < ... [false] | false | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:33:11:33:15 | After ... < ... [true] | true | +| break_ensure.rb:33:11:33:15 | After ... < ... [true] | break_ensure.rb:35:12:35:16 | After ... > ... [false] | false | +| break_ensure.rb:33:11:33:15 | After ... < ... [true] | break_ensure.rb:35:12:35:16 | After ... > ... [true] | true | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:45:9:45:13 | After ... < ... [false] | false | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:45:9:45:13 | After ... < ... [true] | true | +| break_ensure.rb:45:9:45:13 | After ... < ... [true] | break_ensure.rb:47:10:47:14 | After ... > ... [false] | false | +| break_ensure.rb:45:9:45:13 | After ... < ... [true] | break_ensure.rb:47:10:47:14 | After ... > ... [true] | true | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:51:10:51:14 | After ... > ... [false] | false | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:51:10:51:14 | After ... > ... [true] | true | +| case.rb:1:1:6:3 | Entry | case.rb:3:10:3:10 | After 1 [match] | match | +| case.rb:1:1:6:3 | Entry | case.rb:3:10:3:10 | After 1 [no-match] | no-match | +| case.rb:3:10:3:10 | After 1 [match] | case.rb:3:21:3:22 | After call to x2 [false] | false | +| case.rb:3:10:3:10 | After 1 [match] | case.rb:3:21:3:22 | After call to x2 [true] | true | +| case.rb:3:10:3:10 | After 1 [no-match] | case.rb:4:10:4:10 | After 2 [match] | match | +| case.rb:3:10:3:10 | After 1 [no-match] | case.rb:4:10:4:10 | After 2 [no-match] | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:10:8:10:8 | After 0 [match] | match | +| case.rb:8:1:18:3 | Entry | case.rb:10:8:10:8 | After 0 [no-match] | no-match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:11:8:11:8 | After 1 [match] | match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:11:8:11:8 | After 1 [no-match] | no-match | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:12:8:12:8 | After 2 [match] | match | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:12:8:12:8 | After 2 [no-match] | no-match | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:14:8:14:8 | After x [match] | match | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:14:8:14:8 | After x [no-match] | no-match | +| case.rb:14:8:14:8 | After x [match] | case.rb:14:13:14:18 | After ... == ... [false] | false | +| case.rb:14:8:14:8 | After x [match] | case.rb:14:13:14:18 | After ... == ... [true] | true | +| case.rb:15:5:15:28 | in ... then ... | case.rb:15:8:15:8 | After x [match] | match | +| case.rb:15:5:15:28 | in ... then ... | case.rb:15:8:15:8 | After x [no-match] | no-match | +| case.rb:15:8:15:8 | After x [match] | case.rb:15:17:15:21 | After ... < ... [false] | false | +| case.rb:15:8:15:8 | After x [match] | case.rb:15:17:15:21 | After ... < ... [true] | true | +| case.rb:20:1:24:3 | Entry | case.rb:22:8:22:8 | After 1 [match] | match | +| case.rb:20:1:24:3 | Entry | case.rb:22:8:22:8 | After 1 [no-match] | no-match | +| case.rb:26:1:30:3 | Entry | case.rb:28:7:28:28 | After -> { ... } [match] | match | +| case.rb:26:1:30:3 | Entry | case.rb:28:7:28:28 | After -> { ... } [no-match] | no-match | +| case.rb:32:1:39:3 | Entry | case.rb:34:8:34:9 | After [ ..., * ] [match] | match | +| case.rb:32:1:39:3 | Entry | case.rb:34:8:34:9 | After [ ..., * ] [no-match] | no-match | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:35:8:35:10 | After [ ..., * ] [match] | match | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:35:8:35:10 | After [ ..., * ] [no-match] | no-match | +| case.rb:35:8:35:10 | After [ ..., * ] [no-match] | case.rb:36:8:36:12 | After [ ..., * ] [match] | match | +| case.rb:35:8:35:10 | After [ ..., * ] [no-match] | case.rb:36:8:36:12 | After [ ..., * ] [no-match] | no-match | +| case.rb:36:8:36:12 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [match] | match | +| case.rb:36:8:36:12 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [no-match] | no-match | +| case.rb:41:1:45:3 | Entry | case.rb:43:8:43:21 | After [ *,...,* ] [match] | match | +| case.rb:41:1:45:3 | Entry | case.rb:43:8:43:21 | After [ *,...,* ] [no-match] | no-match | +| case.rb:47:1:53:3 | Entry | case.rb:49:8:49:34 | After { ..., ** } [match] | match | +| case.rb:47:1:53:3 | Entry | case.rb:49:8:49:34 | After { ..., ** } [no-match] | no-match | +| case.rb:49:8:49:34 | After { ..., ** } [no-match] | case.rb:50:8:50:24 | After { ..., ** } [match] | match | +| case.rb:49:8:49:34 | After { ..., ** } [no-match] | case.rb:50:8:50:24 | After { ..., ** } [no-match] | no-match | +| case.rb:50:8:50:24 | After { ..., ** } [no-match] | case.rb:51:8:51:16 | After { ..., ** } [match] | match | +| case.rb:50:8:50:24 | After { ..., ** } [no-match] | case.rb:51:8:51:16 | After { ..., ** } [no-match] | no-match | +| case.rb:55:1:61:3 | Entry | case.rb:57:8:57:8 | After 5 [match] | match | +| case.rb:55:1:61:3 | Entry | case.rb:57:8:57:8 | After 5 [no-match] | no-match | +| case.rb:57:8:57:8 | After 5 [no-match] | case.rb:58:8:58:10 | After var [match] | match | +| case.rb:57:8:57:8 | After 5 [no-match] | case.rb:58:8:58:10 | After var [no-match] | no-match | +| case.rb:58:8:58:10 | After var [no-match] | case.rb:59:8:59:20 | After "unreachable" [match] | match | +| case.rb:58:8:58:10 | After var [no-match] | case.rb:59:8:59:20 | After "unreachable" [no-match] | no-match | +| case.rb:63:1:67:3 | Entry | case.rb:65:8:65:28 | After ... \| ... [match] | match | +| case.rb:63:1:67:3 | Entry | case.rb:65:8:65:28 | After ... \| ... [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:73:8:73:8 | After 5 [match] | match | +| case.rb:69:1:93:3 | Entry | case.rb:73:8:73:8 | After 5 [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:74:8:74:11 | After ^... [match] | match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:74:8:74:11 | After ^... [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:75:8:75:15 | After "string" [match] | match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:75:8:75:15 | After "string" [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:76:8:76:18 | After call to [] [match] | match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:76:8:76:18 | After call to [] [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:77:8:77:18 | After call to [] [match] | match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:77:8:77:18 | After call to [] [no-match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:79:8:79:14 | After _ .. _ [match] | match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:80:8:80:12 | After _ .. _ [match] | match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:84:8:84:17 | After Bar [match] | match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | no-match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | no-match | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:86:8:86:11 | After :foo [match] | match | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | match | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | match | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | match | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:89:8:89:69 | After ... \| ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | match | +| case.rb:89:8:89:69 | After ... \| ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:90:8:90:13 | After ( ... ) [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | match | +| case.rb:90:8:90:13 | After ( ... ) [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:95:1:99:3 | Entry | case.rb:97:8:97:8 | After x [match] | match | +| case.rb:95:1:99:3 | Entry | case.rb:97:8:97:8 | After x [no-match] | no-match | +| case.rb:97:8:97:8 | After x [match] | case.rb:97:13:97:18 | After ... == ... [false] | false | +| case.rb:97:8:97:8 | After x [match] | case.rb:97:13:97:18 | After ... == ... [true] | true | +| cfg.html.erb:5:16:31:12 | Entry | cfg.html.erb:18:17:18:22 | After call to admin? [false] | false | +| cfg.html.erb:5:16:31:12 | Entry | cfg.html.erb:18:17:18:22 | After call to admin? [true] | true | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:42:8:42:8 | After 1 [match] | match | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:42:8:42:8 | After 1 [no-match] | no-match | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:48:8:48:13 | After ... == ... [match] | match | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | no-match | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:43:8:43:8 | After 2 [match] | match | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:43:8:43:8 | After 2 [no-match] | no-match | +| cfg.rb:43:8:43:8 | After 2 [match] | cfg.rb:43:3:43:31 | After when ... [match] | match | +| cfg.rb:43:8:43:8 | After 2 [no-match] | cfg.rb:43:11:43:11 | After 3 [match] | match | +| cfg.rb:43:8:43:8 | After 2 [no-match] | cfg.rb:43:11:43:11 | After 3 [no-match] | no-match | +| cfg.rb:43:11:43:11 | After 3 [match] | cfg.rb:43:3:43:31 | After when ... [match] | match | +| cfg.rb:43:11:43:11 | After 3 [no-match] | cfg.rb:43:14:43:14 | After 4 [match] | match | +| cfg.rb:43:11:43:11 | After 3 [no-match] | cfg.rb:43:14:43:14 | After 4 [no-match] | no-match | +| cfg.rb:43:14:43:14 | After 4 [match] | cfg.rb:43:3:43:31 | After when ... [match] | match | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:60:17:60:22 | After ... < ... [false] | false | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:60:17:60:22 | After ... < ... [true] | true | +| cfg.rb:48:8:48:13 | After ... == ... [no-match] | cfg.rb:49:8:49:13 | After ... == ... [match] | match | +| cfg.rb:48:8:48:13 | After ... == ... [no-match] | cfg.rb:49:8:49:13 | After ... == ... [no-match] | no-match | +| cfg.rb:49:8:49:13 | After ... == ... [match] | cfg.rb:49:3:49:37 | After when ... [match] | match | +| cfg.rb:49:8:49:13 | After ... == ... [no-match] | cfg.rb:49:16:49:20 | After ... > ... [match] | match | +| cfg.rb:49:8:49:13 | After ... == ... [no-match] | cfg.rb:49:16:49:20 | After ... > ... [no-match] | no-match | +| cfg.rb:49:16:49:20 | After ... > ... [match] | cfg.rb:49:3:49:37 | After when ... [match] | match | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:75:4:75:8 | After ... < ... [false] | false | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:75:4:75:8 | After ... < ... [true] | true | +| cfg.rb:75:4:75:8 | After ... < ... [false] | cfg.rb:75:23:75:28 | After ... > ... [false] | false | +| cfg.rb:75:4:75:8 | After ... < ... [false] | cfg.rb:75:23:75:28 | After ... > ... [true] | true | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:90:5:90:5 | After defined? ... [false] | false | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:90:5:90:5 | After defined? ... [true] | true | +| cfg.rb:90:1:93:3 | Entry | cfg.rb:91:6:91:10 | After ... > ... [false] | false | +| cfg.rb:90:1:93:3 | Entry | cfg.rb:91:6:91:10 | After ... > ... [true] | true | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:113:14:113:19 | After ... > ... [false] | false | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:113:14:113:19 | After ... > ... [true] | true | +| cfg.rb:101:1:104:3 | Entry | cfg.rb:101:16:101:20 | After value [match] | match | +| cfg.rb:101:1:104:3 | Entry | cfg.rb:101:16:101:20 | After value [no-match] | no-match | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:172:8:172:14 | After ... == ... [false] | false | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:172:8:172:14 | After ... == ... [true] | true | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:174:18:174:23 | After ... == ... [false] | false | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:174:18:174:23 | After ... == ... [true] | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:176:7:176:12 | After ... > ... [false] | false | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:176:7:176:12 | After ... > ... [true] | true | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:179:30:179:36 | After ... == ... [false] | false | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:179:30:179:36 | After ... == ... [true] | true | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:182:7:182:12 | After ... < ... [false] | false | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:182:7:182:12 | After ... < ... [true] | true | +| cfg.rb:182:14:186:3 | do ... | cfg.rb:184:6:184:11 | After ... == ... [false] | false | +| cfg.rb:182:14:186:3 | do ... | cfg.rb:184:6:184:11 | After ... == ... [true] | true | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:188:30:188:35 | After ... != ... [false] | false | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:188:30:188:35 | After ... != ... [true] | true | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:205:4:205:5 | After call to == [false] | false | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:205:4:205:5 | After call to == [true] | true | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [false] | false | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [true] | true | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [false] | false | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [true] | true | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [false] | false | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [true] | true | +| exit.rb:1:1:6:3 | Entry | exit.rb:2:6:2:10 | After ... > ... [false] | false | +| exit.rb:1:1:6:3 | Entry | exit.rb:2:6:2:10 | After ... > ... [true] | true | +| exit.rb:8:1:13:3 | Entry | exit.rb:9:6:9:10 | After ... > ... [false] | false | +| exit.rb:8:1:13:3 | Entry | exit.rb:9:6:9:10 | After ... > ... [true] | true | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:2:6:2:10 | After ... > ... [false] | false | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:2:6:2:10 | After ... > ... [true] | true | +| ifs.rb:1:1:58:4 | Entry | ifs.rb:38:12:38:17 | After ... == ... [false] | false | +| ifs.rb:1:1:58:4 | Entry | ifs.rb:38:12:38:17 | After ... == ... [true] | true | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:9:4:14 | After ... <= ... [false] | false | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:9:4:14 | After ... <= ... [true] | true | +| ifs.rb:4:9:4:14 | After ... <= ... [false] | ifs.rb:4:9:4:24 | After ... and ... [false] | false | +| ifs.rb:4:9:4:14 | After ... <= ... [true] | ifs.rb:4:20:4:24 | After ... > ... [false] | false | +| ifs.rb:4:9:4:14 | After ... <= ... [true] | ifs.rb:4:20:4:24 | After ... > ... [true] | true | +| ifs.rb:4:9:4:24 | After ... and ... [false] | ifs.rb:4:9:4:38 | After ... and ... [false] | false | +| ifs.rb:4:20:4:24 | After ... > ... [false] | ifs.rb:4:9:4:24 | After ... and ... [false] | false | +| ifs.rb:4:20:4:24 | After ... > ... [true] | ifs.rb:4:32:4:37 | After ... == ... [false] | false | +| ifs.rb:4:20:4:24 | After ... > ... [true] | ifs.rb:4:32:4:37 | After ... == ... [true] | true | +| ifs.rb:4:32:4:37 | After ... == ... [true] | ifs.rb:4:9:4:38 | After ... and ... [false] | false | +| ifs.rb:11:1:16:3 | Entry | ifs.rb:12:6:12:6 | After b [false] | false | +| ifs.rb:11:1:16:3 | Entry | ifs.rb:12:6:12:6 | After b [true] | true | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:19:6:19:10 | After ... < ... [false] | false | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:19:6:19:10 | After ... < ... [true] | true | +| ifs.rb:19:6:19:10 | After ... < ... [true] | ifs.rb:21:8:21:13 | After ... > ... [false] | false | +| ifs.rb:19:6:19:10 | After ... < ... [true] | ifs.rb:21:8:21:13 | After ... > ... [true] | true | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:11:29:12 | After b1 [false] | false | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:11:29:12 | After b1 [true] | true | +| ifs.rb:29:11:29:12 | After b1 [false] | ifs.rb:29:21:29:22 | After b3 [false] | false | +| ifs.rb:29:11:29:12 | After b1 [false] | ifs.rb:29:21:29:22 | After b3 [true] | true | +| ifs.rb:29:11:29:12 | After b1 [true] | ifs.rb:29:16:29:17 | After b2 [false] | false | +| ifs.rb:29:11:29:12 | After b1 [true] | ifs.rb:29:16:29:17 | After b2 [true] | true | +| ifs.rb:29:16:29:17 | After b2 [false] | ifs.rb:29:11:29:22 | After ... ? ... : ... [false] | false | +| ifs.rb:29:16:29:17 | After b2 [true] | ifs.rb:29:11:29:22 | After ... ? ... : ... [true] | true | +| ifs.rb:29:21:29:22 | After b3 [false] | ifs.rb:29:11:29:22 | After ... ? ... : ... [false] | false | +| ifs.rb:29:21:29:22 | After b3 [true] | ifs.rb:29:11:29:22 | After ... ? ... : ... [true] | true | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:10:33:11 | After b1 [false] | false | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:10:33:11 | After b1 [true] | true | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:27:33:28 | After b3 [false] | false | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:27:33:28 | After b3 [true] | true | +| ifs.rb:33:10:33:11 | After b1 [true] | ifs.rb:33:18:33:19 | After b2 [false] | false | +| ifs.rb:33:10:33:11 | After b1 [true] | ifs.rb:33:18:33:19 | After b2 [true] | true | +| ifs.rb:33:18:33:19 | After b2 [false] | ifs.rb:33:7:33:48 | After if ... [false] | false | +| ifs.rb:33:18:33:19 | After b2 [true] | ifs.rb:33:7:33:48 | After if ... [true] | true | +| ifs.rb:33:21:33:44 | After elsif ... [false] | ifs.rb:33:7:33:48 | After if ... [false] | false | +| ifs.rb:33:21:33:44 | After elsif ... [true] | ifs.rb:33:7:33:48 | After if ... [true] | true | +| ifs.rb:33:27:33:28 | After b3 [false] | ifs.rb:33:43:33:44 | After b5 [false] | false | +| ifs.rb:33:27:33:28 | After b3 [false] | ifs.rb:33:43:33:44 | After b5 [true] | true | +| ifs.rb:33:27:33:28 | After b3 [true] | ifs.rb:33:35:33:36 | After b4 [false] | false | +| ifs.rb:33:27:33:28 | After b3 [true] | ifs.rb:33:35:33:36 | After b4 [true] | true | +| ifs.rb:33:35:33:36 | After b4 [false] | ifs.rb:33:21:33:44 | After elsif ... [false] | false | +| ifs.rb:33:35:33:36 | After b4 [true] | ifs.rb:33:21:33:44 | After elsif ... [true] | true | +| ifs.rb:33:43:33:44 | After b5 [false] | ifs.rb:33:21:33:44 | After elsif ... [false] | false | +| ifs.rb:33:43:33:44 | After b5 [true] | ifs.rb:33:21:33:44 | After elsif ... [true] | true | +| ifs.rb:46:1:52:3 | Entry | ifs.rb:47:6:47:6 | After b [false] | false | +| ifs.rb:46:1:52:3 | Entry | ifs.rb:47:6:47:6 | After b [true] | true | +| ifs.rb:54:1:58:3 | Entry | ifs.rb:55:7:55:8 | After b1 [false] | false | +| ifs.rb:54:1:58:3 | Entry | ifs.rb:55:7:55:8 | After b1 [true] | true | +| ifs.rb:55:7:55:8 | After b1 [false] | ifs.rb:55:13:55:14 | After b2 [false] | false | +| ifs.rb:55:7:55:8 | After b1 [false] | ifs.rb:55:13:55:14 | After b2 [true] | true | +| ifs.rb:55:7:55:8 | After b1 [true] | ifs.rb:55:7:55:14 | After ... \|\| ... [true] | true | +| ifs.rb:55:13:55:14 | After b2 [true] | ifs.rb:55:7:55:14 | After ... \|\| ... [true] | true | +| loops.rb:2:3:5:5 | [LoopHeader] while ... | loops.rb:2:9:2:14 | After ... >= ... [false] | false | +| loops.rb:2:3:5:5 | [LoopHeader] while ... | loops.rb:2:9:2:14 | After ... >= ... [true] | true | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:9:9:9:14 | After ... >= ... [false] | false | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:9:9:9:14 | After ... >= ... [true] | true | +| loops.rb:9:15:20:5 | do ... | loops.rb:12:8:12:14 | After ... > ... [false] | false | +| loops.rb:9:15:20:5 | do ... | loops.rb:12:8:12:14 | After ... > ... [true] | true | +| loops.rb:12:8:12:14 | After ... > ... [false] | loops.rb:14:11:14:16 | After ... > ... [false] | false | +| loops.rb:12:8:12:14 | After ... > ... [false] | loops.rb:14:11:14:16 | After ... > ... [true] | true | +| loops.rb:14:11:14:16 | After ... > ... [false] | loops.rb:16:11:16:16 | After ... > ... [false] | false | +| loops.rb:14:11:14:16 | After ... > ... [false] | loops.rb:16:11:16:16 | After ... > ... [true] | true | +| loops.rb:31:3:32:5 | [LoopHeader] while ... | loops.rb:31:9:31:13 | After ... < ... [false] | false | +| loops.rb:31:3:32:5 | [LoopHeader] while ... | loops.rb:31:9:31:13 | After ... < ... [true] | true | +| raise.rb:7:1:12:3 | Entry | raise.rb:8:6:8:10 | After ... > ... [false] | false | +| raise.rb:7:1:12:3 | Entry | raise.rb:8:6:8:10 | After ... > ... [true] | true | +| raise.rb:14:1:23:3 | Entry | raise.rb:16:8:16:8 | After b [false] | false | +| raise.rb:14:1:23:3 | Entry | raise.rb:16:8:16:8 | After b [true] | true | +| raise.rb:16:8:16:8 | After b [true] | raise.rb:19:10:19:19 | After ExceptionA [match] | match | +| raise.rb:16:8:16:8 | After b [true] | raise.rb:19:10:19:19 | After ExceptionA [no-match] | no-match | +| raise.rb:25:1:34:3 | Entry | raise.rb:27:8:27:8 | After b [false] | false | +| raise.rb:25:1:34:3 | Entry | raise.rb:27:8:27:8 | After b [true] | true | +| raise.rb:36:1:45:3 | Entry | raise.rb:38:8:38:8 | After b [false] | false | +| raise.rb:36:1:45:3 | Entry | raise.rb:38:8:38:8 | After b [true] | true | +| raise.rb:47:1:55:3 | Entry | raise.rb:49:8:49:8 | After b [false] | false | +| raise.rb:47:1:55:3 | Entry | raise.rb:49:8:49:8 | After b [true] | true | +| raise.rb:57:1:66:3 | Entry | raise.rb:59:8:59:8 | After b [false] | false | +| raise.rb:57:1:66:3 | Entry | raise.rb:59:8:59:8 | After b [true] | true | +| raise.rb:59:8:59:8 | After b [true] | raise.rb:62:10:62:31 | After ..., ... [match] | match | +| raise.rb:59:8:59:8 | After b [true] | raise.rb:62:10:62:31 | After ..., ... [no-match] | no-match | +| raise.rb:68:1:77:3 | Entry | raise.rb:69:6:69:10 | After ... > ... [false] | false | +| raise.rb:68:1:77:3 | Entry | raise.rb:69:6:69:10 | After ... > ... [true] | true | +| raise.rb:69:6:69:10 | After ... > ... [false] | raise.rb:71:9:71:13 | After ... < ... [false] | false | +| raise.rb:69:6:69:10 | After ... > ... [false] | raise.rb:71:9:71:13 | After ... < ... [true] | true | +| raise.rb:79:1:92:3 | Entry | raise.rb:82:8:82:12 | After ... > ... [false] | false | +| raise.rb:79:1:92:3 | Entry | raise.rb:82:8:82:12 | After ... > ... [true] | true | +| raise.rb:82:8:82:12 | After ... > ... [false] | raise.rb:84:11:84:15 | After ... < ... [false] | false | +| raise.rb:82:8:82:12 | After ... > ... [false] | raise.rb:84:11:84:15 | After ... < ... [true] | true | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:97:8:97:12 | After ... > ... [false] | false | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:97:8:97:12 | After ... > ... [true] | true | +| raise.rb:97:8:97:12 | After ... > ... [false] | raise.rb:99:11:99:15 | After ... < ... [false] | false | +| raise.rb:97:8:97:12 | After ... > ... [false] | raise.rb:99:11:99:15 | After ... < ... [true] | true | +| raise.rb:104:5:104:23 | After call to puts | raise.rb:106:10:106:11 | After b1 [false] | false | +| raise.rb:104:5:104:23 | After call to puts | raise.rb:106:10:106:11 | After b1 [true] | true | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:116:6:116:7 | After b2 [false] | false | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:116:6:116:7 | After b2 [true] | true | +| raise.rb:121:1:126:3 | Entry | raise.rb:121:9:121:9 | After p [match] | match | +| raise.rb:121:1:126:3 | Entry | raise.rb:121:9:121:9 | After p [no-match] | no-match | +| raise.rb:128:1:140:3 | Entry | raise.rb:130:8:130:8 | After b [false] | false | +| raise.rb:128:1:140:3 | Entry | raise.rb:130:8:130:8 | After b [true] | true | +| raise.rb:130:8:130:8 | After b [true] | raise.rb:133:10:133:19 | After ExceptionA [match] | match | +| raise.rb:130:8:130:8 | After b [true] | raise.rb:133:10:133:19 | After ExceptionA [no-match] | no-match | +| raise.rb:133:10:133:19 | After ExceptionA [no-match] | raise.rb:134:10:134:19 | After ExceptionB [match] | match | +| raise.rb:133:10:133:19 | After ExceptionA [no-match] | raise.rb:134:10:134:19 | After ExceptionB [no-match] | no-match | +| raise.rb:142:1:148:3 | Entry | raise.rb:143:6:143:6 | After b [false] | false | +| raise.rb:142:1:148:3 | Entry | raise.rb:143:6:143:6 | After b [true] | true | +| raise.rb:155:16:155:50 | Entry | raise.rb:155:37:155:48 | After call to nil? [false] | false | +| raise.rb:155:16:155:50 | Entry | raise.rb:155:37:155:48 | After call to nil? [true] | true | +| raise.rb:160:9:162:7 | Entry | raise.rb:161:23:161:23 | After x [false] | false | +| raise.rb:160:9:162:7 | Entry | raise.rb:161:23:161:23 | After x [true] | true | +| raise.rb:172:1:182:3 | Entry | raise.rb:174:8:174:9 | After b1 [false] | false | +| raise.rb:172:1:182:3 | Entry | raise.rb:174:8:174:9 | After b1 [true] | true | +| raise.rb:174:8:174:9 | After b1 [false] | raise.rb:174:14:174:23 | After ... == ... [false] | false | +| raise.rb:174:8:174:9 | After b1 [false] | raise.rb:174:14:174:23 | After ... == ... [true] | true | +| raise.rb:174:8:174:9 | After b1 [true] | raise.rb:174:8:174:23 | After ... \|\| ... [true] | true | +| raise.rb:174:14:174:23 | After ... == ... [true] | raise.rb:174:8:174:23 | After ... \|\| ... [true] | true | +| raise.rb:179:3:180:12 | rescue ... | raise.rb:179:10:179:19 | After ExceptionA [match] | match | +| raise.rb:179:3:180:12 | rescue ... | raise.rb:179:10:179:19 | After ExceptionA [no-match] | no-match | diff --git a/ruby/ql/test/library-tests/controlflow/graph/Cfg.expected b/ruby/ql/test/library-tests/controlflow/graph/Cfg.expected index e7ce708b63bf..a4fb2ef860f6 100644 --- a/ruby/ql/test/library-tests/controlflow/graph/Cfg.expected +++ b/ruby/ql/test/library-tests/controlflow/graph/Cfg.expected @@ -1,2392 +1,4018 @@ -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:1:8:1:8 | x | | -| break_ensure.rb:1:1:11:3 | exit m1 (abnormal) | break_ensure.rb:1:1:11:3 | exit m1 | | -| break_ensure.rb:1:1:11:3 | exit m1 (normal) | break_ensure.rb:1:1:11:3 | exit m1 | | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:1:8:1:8 | x | | +| break_ensure.rb:1:1:11:3 | Exceptional Exit | break_ensure.rb:1:1:11:3 | Exit | | +| break_ensure.rb:1:1:11:3 | Normal Exit | break_ensure.rb:1:1:11:3 | Exit | | | break_ensure.rb:1:1:11:3 | m1 | break_ensure.rb:13:1:25:3 | m2 | | -| break_ensure.rb:1:1:56:4 | enter break_ensure.rb | break_ensure.rb:1:1:11:3 | m1 | | -| break_ensure.rb:1:1:56:4 | exit break_ensure.rb (normal) | break_ensure.rb:1:1:56:4 | exit break_ensure.rb | | -| break_ensure.rb:1:8:1:8 | x | break_ensure.rb:2:9:2:9 | x | | -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:8:6:8:13 | self | | +| break_ensure.rb:1:1:56:4 | Entry | break_ensure.rb:1:1:11:3 | m1 | | +| break_ensure.rb:1:1:56:4 | Normal Exit | break_ensure.rb:1:1:56:4 | Exit | | +| break_ensure.rb:1:8:1:8 | x | break_ensure.rb:2:3:10:5 | ... | | +| break_ensure.rb:2:3:6:5 | After while ... | break_ensure.rb:7:1:10:5 | ensure ... | | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:2:9:2:13 | Before ... < ... | | +| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | | +| break_ensure.rb:2:3:10:5 | ... | break_ensure.rb:2:3:6:5 | while ... | | +| break_ensure.rb:2:3:10:5 | After ... | break_ensure.rb:1:1:11:3 | Normal Exit | | | break_ensure.rb:2:9:2:9 | x | break_ensure.rb:2:13:2:13 | 0 | | -| break_ensure.rb:2:9:2:13 | ... < ... | break_ensure.rb:2:3:6:5 | while ... | false | -| break_ensure.rb:2:9:2:13 | ... < ... | break_ensure.rb:3:8:3:8 | x | true | -| break_ensure.rb:2:9:2:13 | ... < ... | break_ensure.rb:8:6:8:13 | [ensure: exception] self | exception | +| break_ensure.rb:2:9:2:13 | ... < ... | break_ensure.rb:2:9:2:13 | After ... < ... [false] | false | +| break_ensure.rb:2:9:2:13 | ... < ... | break_ensure.rb:2:9:2:13 | After ... < ... [true] | true | +| break_ensure.rb:2:9:2:13 | ... < ... | break_ensure.rb:7:1:10:5 | ensure ... | exception | +| break_ensure.rb:2:9:2:13 | After ... < ... [false] | break_ensure.rb:2:3:6:5 | After while ... | | +| break_ensure.rb:2:9:2:13 | After ... < ... [true] | break_ensure.rb:2:14:6:5 | do ... | | +| break_ensure.rb:2:9:2:13 | Before ... < ... | break_ensure.rb:2:9:2:9 | x | | | break_ensure.rb:2:13:2:13 | 0 | break_ensure.rb:2:9:2:13 | ... < ... | | -| break_ensure.rb:2:14:6:5 | do ... | break_ensure.rb:2:9:2:9 | x | | -| break_ensure.rb:3:5:5:7 | if ... | break_ensure.rb:2:14:6:5 | do ... | | +| break_ensure.rb:2:14:6:5 | After do ... | break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | | +| break_ensure.rb:2:14:6:5 | do ... | break_ensure.rb:3:5:5:7 | if ... | | +| break_ensure.rb:3:5:5:7 | After if ... | break_ensure.rb:2:14:6:5 | After do ... | | +| break_ensure.rb:3:5:5:7 | if ... | break_ensure.rb:3:8:3:12 | Before ... > ... | | | break_ensure.rb:3:8:3:8 | x | break_ensure.rb:3:12:3:12 | 0 | | -| break_ensure.rb:3:8:3:12 | ... > ... | break_ensure.rb:2:3:6:5 | while ... | exception | -| break_ensure.rb:3:8:3:12 | ... > ... | break_ensure.rb:3:5:5:7 | if ... | false | -| break_ensure.rb:3:8:3:12 | ... > ... | break_ensure.rb:4:7:4:11 | break | true | +| break_ensure.rb:3:8:3:12 | ... > ... | break_ensure.rb:3:8:3:12 | After ... > ... [false] | false | +| break_ensure.rb:3:8:3:12 | ... > ... | break_ensure.rb:3:8:3:12 | After ... > ... [true] | true | +| break_ensure.rb:3:8:3:12 | ... > ... | break_ensure.rb:7:1:10:5 | ensure ... | exception | +| break_ensure.rb:3:8:3:12 | After ... > ... [false] | break_ensure.rb:3:5:5:7 | After if ... | | +| break_ensure.rb:3:8:3:12 | After ... > ... [true] | break_ensure.rb:3:14:4:11 | then ... | | +| break_ensure.rb:3:8:3:12 | Before ... > ... | break_ensure.rb:3:8:3:8 | x | | | break_ensure.rb:3:12:3:12 | 0 | break_ensure.rb:3:8:3:12 | ... > ... | | -| break_ensure.rb:4:7:4:11 | break | break_ensure.rb:2:3:6:5 | while ... | break | -| break_ensure.rb:7:1:10:5 | [ensure: exception] ensure ... | break_ensure.rb:1:1:11:3 | exit m1 (abnormal) | exception | -| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:1:1:11:3 | exit m1 (normal) | | -| break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | break_ensure.rb:7:1:10:5 | [ensure: exception] ensure ... | | -| break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:7:1:10:5 | ensure ... | | -| break_ensure.rb:8:6:8:13 | [ensure: exception] call to elements | break_ensure.rb:8:6:8:18 | [ensure: exception] call to nil? | | -| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:8:6:8:13 | [ensure: exception] call to elements | | -| break_ensure.rb:8:6:8:13 | call to elements | break_ensure.rb:8:6:8:18 | call to nil? | | +| break_ensure.rb:3:14:4:11 | then ... | break_ensure.rb:4:7:4:11 | Before break | | +| break_ensure.rb:4:7:4:11 | Before break | break_ensure.rb:4:7:4:11 | break | | +| break_ensure.rb:4:7:4:11 | break | break_ensure.rb:2:3:6:5 | After while ... | break | +| break_ensure.rb:7:1:10:5 | After ensure ... | break_ensure.rb:1:1:11:3 | Exceptional Exit | exception | +| break_ensure.rb:7:1:10:5 | After ensure ... | break_ensure.rb:2:3:10:5 | After ... | | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:8:3:10:5 | if ... | | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:7:1:10:5 | After ensure ... | | +| break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:8:6:8:18 | Before call to nil? | | +| break_ensure.rb:8:6:8:13 | After call to elements | break_ensure.rb:8:6:8:18 | call to nil? | | +| break_ensure.rb:8:6:8:13 | Before call to elements | break_ensure.rb:8:6:8:13 | self | | +| break_ensure.rb:8:6:8:13 | call to elements | break_ensure.rb:8:6:8:13 | After call to elements | | | break_ensure.rb:8:6:8:13 | self | break_ensure.rb:8:6:8:13 | call to elements | | -| break_ensure.rb:8:6:8:18 | [ensure: exception] call to nil? | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | false | -| break_ensure.rb:8:6:8:18 | [ensure: exception] call to nil? | break_ensure.rb:9:5:9:23 | [ensure: exception] self | true | -| break_ensure.rb:8:6:8:18 | call to nil? | break_ensure.rb:8:3:10:5 | if ... | false | -| break_ensure.rb:8:6:8:18 | call to nil? | break_ensure.rb:9:5:9:23 | self | true | -| break_ensure.rb:8:20:9:23 | [ensure: exception] then ... | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | | -| break_ensure.rb:8:20:9:23 | then ... | break_ensure.rb:8:3:10:5 | if ... | | -| break_ensure.rb:9:5:9:23 | [ensure: exception] call to puts | break_ensure.rb:8:20:9:23 | [ensure: exception] then ... | | -| break_ensure.rb:9:5:9:23 | [ensure: exception] self | break_ensure.rb:9:11:9:22 | [ensure: exception] elements nil | | -| break_ensure.rb:9:5:9:23 | call to puts | break_ensure.rb:8:20:9:23 | then ... | | -| break_ensure.rb:9:5:9:23 | self | break_ensure.rb:9:11:9:22 | elements nil | | -| break_ensure.rb:9:10:9:23 | "elements nil" | break_ensure.rb:9:5:9:23 | call to puts | | -| break_ensure.rb:9:10:9:23 | [ensure: exception] "elements nil" | break_ensure.rb:9:5:9:23 | [ensure: exception] call to puts | | -| break_ensure.rb:9:11:9:22 | [ensure: exception] elements nil | break_ensure.rb:9:10:9:23 | [ensure: exception] "elements nil" | | +| break_ensure.rb:8:6:8:18 | After call to nil? [false] | break_ensure.rb:8:3:10:5 | After if ... | | +| break_ensure.rb:8:6:8:18 | After call to nil? [true] | break_ensure.rb:8:20:9:23 | then ... | | +| break_ensure.rb:8:6:8:18 | Before call to nil? | break_ensure.rb:8:6:8:13 | Before call to elements | | +| break_ensure.rb:8:6:8:18 | call to nil? | break_ensure.rb:8:6:8:18 | After call to nil? [false] | false | +| break_ensure.rb:8:6:8:18 | call to nil? | break_ensure.rb:8:6:8:18 | After call to nil? [true] | true | +| break_ensure.rb:8:20:9:23 | After then ... | break_ensure.rb:8:3:10:5 | After if ... | | +| break_ensure.rb:8:20:9:23 | then ... | break_ensure.rb:9:5:9:23 | Before call to puts | | +| break_ensure.rb:9:5:9:23 | After call to puts | break_ensure.rb:8:20:9:23 | After then ... | | +| break_ensure.rb:9:5:9:23 | Before call to puts | break_ensure.rb:9:5:9:23 | self | | +| break_ensure.rb:9:5:9:23 | call to puts | break_ensure.rb:9:5:9:23 | After call to puts | | +| break_ensure.rb:9:5:9:23 | self | break_ensure.rb:9:10:9:23 | Before "elements nil" | | +| break_ensure.rb:9:10:9:23 | "elements nil" | break_ensure.rb:9:10:9:23 | After "elements nil" | | +| break_ensure.rb:9:10:9:23 | After "elements nil" | break_ensure.rb:9:5:9:23 | call to puts | | +| break_ensure.rb:9:10:9:23 | Before "elements nil" | break_ensure.rb:9:11:9:22 | elements nil | | | break_ensure.rb:9:11:9:22 | elements nil | break_ensure.rb:9:10:9:23 | "elements nil" | | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:13:8:13:8 | x | | -| break_ensure.rb:13:1:25:3 | exit m2 (normal) | break_ensure.rb:13:1:25:3 | exit m2 | | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:13:8:13:8 | x | | +| break_ensure.rb:13:1:25:3 | Exceptional Exit | break_ensure.rb:13:1:25:3 | Exit | | +| break_ensure.rb:13:1:25:3 | Normal Exit | break_ensure.rb:13:1:25:3 | Exit | | | break_ensure.rb:13:1:25:3 | m2 | break_ensure.rb:27:1:42:3 | m3 | | | break_ensure.rb:13:8:13:8 | x | break_ensure.rb:13:11:13:11 | y | | -| break_ensure.rb:13:11:13:11 | y | break_ensure.rb:14:9:14:9 | x | | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:13:1:25:3 | exit m2 (normal) | | +| break_ensure.rb:13:11:13:11 | y | break_ensure.rb:14:3:24:5 | ... | | +| break_ensure.rb:14:3:24:5 | ... | break_ensure.rb:14:3:24:5 | while ... | | +| break_ensure.rb:14:3:24:5 | After ... | break_ensure.rb:13:1:25:3 | Normal Exit | | +| break_ensure.rb:14:3:24:5 | After while ... | break_ensure.rb:14:3:24:5 | After ... | | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:14:9:14:13 | Before ... < ... | | +| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:14:13:14:13 | 0 | | -| break_ensure.rb:14:9:14:13 | ... < ... | break_ensure.rb:14:3:24:5 | while ... | false | -| break_ensure.rb:14:9:14:13 | ... < ... | break_ensure.rb:16:10:16:10 | x | true | +| break_ensure.rb:14:9:14:13 | ... < ... | break_ensure.rb:14:9:14:13 | After ... < ... [false] | false | +| break_ensure.rb:14:9:14:13 | ... < ... | break_ensure.rb:14:9:14:13 | After ... < ... [true] | true | +| break_ensure.rb:14:9:14:13 | After ... < ... [false] | break_ensure.rb:14:3:24:5 | After while ... | | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:14:14:24:5 | do ... | | +| break_ensure.rb:14:9:14:13 | Before ... < ... | break_ensure.rb:14:9:14:9 | x | | | break_ensure.rb:14:13:14:13 | 0 | break_ensure.rb:14:9:14:13 | ... < ... | | -| break_ensure.rb:14:14:24:5 | do ... | break_ensure.rb:14:9:14:9 | x | | -| break_ensure.rb:16:7:18:9 | if ... | break_ensure.rb:20:10:20:10 | y | | +| break_ensure.rb:14:14:24:5 | After do ... | break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | | +| break_ensure.rb:14:14:24:5 | do ... | break_ensure.rb:15:5:23:7 | begin ... | | +| break_ensure.rb:15:5:23:7 | After begin ... | break_ensure.rb:14:14:24:5 | After do ... | | +| break_ensure.rb:15:5:23:7 | begin ... | break_ensure.rb:16:7:18:9 | if ... | | +| break_ensure.rb:16:7:18:9 | After if ... | break_ensure.rb:19:5:22:9 | ensure ... | | +| break_ensure.rb:16:7:18:9 | if ... | break_ensure.rb:16:10:16:14 | Before ... > ... | | | break_ensure.rb:16:10:16:10 | x | break_ensure.rb:16:14:16:14 | 0 | | -| break_ensure.rb:16:10:16:14 | ... > ... | break_ensure.rb:16:7:18:9 | if ... | false | -| break_ensure.rb:16:10:16:14 | ... > ... | break_ensure.rb:17:9:17:13 | break | true | -| break_ensure.rb:16:10:16:14 | ... > ... | break_ensure.rb:20:10:20:10 | [ensure: exception] y | exception | +| break_ensure.rb:16:10:16:14 | ... > ... | break_ensure.rb:16:10:16:14 | After ... > ... [false] | false | +| break_ensure.rb:16:10:16:14 | ... > ... | break_ensure.rb:16:10:16:14 | After ... > ... [true] | true | +| break_ensure.rb:16:10:16:14 | ... > ... | break_ensure.rb:19:5:22:9 | ensure ... | exception | +| break_ensure.rb:16:10:16:14 | After ... > ... [false] | break_ensure.rb:16:7:18:9 | After if ... | | +| break_ensure.rb:16:10:16:14 | After ... > ... [true] | break_ensure.rb:16:16:17:13 | then ... | | +| break_ensure.rb:16:10:16:14 | Before ... > ... | break_ensure.rb:16:10:16:10 | x | | | break_ensure.rb:16:14:16:14 | 0 | break_ensure.rb:16:10:16:14 | ... > ... | | -| break_ensure.rb:17:9:17:13 | break | break_ensure.rb:20:10:20:10 | [ensure: break] y | break | -| break_ensure.rb:19:5:22:9 | [ensure: break] ensure ... | break_ensure.rb:14:3:24:5 | while ... | break | -| break_ensure.rb:19:5:22:9 | [ensure: exception] ensure ... | break_ensure.rb:14:3:24:5 | while ... | exception | -| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:14:14:24:5 | do ... | | -| break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:19:5:22:9 | [ensure: break] ensure ... | | -| break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:19:5:22:9 | [ensure: exception] ensure ... | | -| break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:19:5:22:9 | ensure ... | | -| break_ensure.rb:20:10:20:10 | [ensure: break] y | break_ensure.rb:20:10:20:15 | [ensure: break] call to nil? | | -| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:20:10:20:15 | [ensure: exception] call to nil? | | +| break_ensure.rb:16:16:17:13 | then ... | break_ensure.rb:17:9:17:13 | Before break | | +| break_ensure.rb:17:9:17:13 | Before break | break_ensure.rb:17:9:17:13 | break | | +| break_ensure.rb:17:9:17:13 | break | break_ensure.rb:19:5:22:9 | ensure ... | break | +| break_ensure.rb:19:5:22:9 | After ensure ... | break_ensure.rb:13:1:25:3 | Exceptional Exit | exception | +| break_ensure.rb:19:5:22:9 | After ensure ... | break_ensure.rb:14:3:24:5 | After while ... | break | +| break_ensure.rb:19:5:22:9 | After ensure ... | break_ensure.rb:15:5:23:7 | After begin ... | | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:20:7:22:9 | if ... | | +| break_ensure.rb:20:7:22:9 | After if ... | break_ensure.rb:19:5:22:9 | After ensure ... | | +| break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:20:10:20:15 | Before call to nil? | | | break_ensure.rb:20:10:20:10 | y | break_ensure.rb:20:10:20:15 | call to nil? | | -| break_ensure.rb:20:10:20:15 | [ensure: break] call to nil? | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | false | -| break_ensure.rb:20:10:20:15 | [ensure: break] call to nil? | break_ensure.rb:21:9:21:20 | [ensure: break] self | true | -| break_ensure.rb:20:10:20:15 | [ensure: exception] call to nil? | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | false | -| break_ensure.rb:20:10:20:15 | [ensure: exception] call to nil? | break_ensure.rb:21:9:21:20 | [ensure: exception] self | true | -| break_ensure.rb:20:10:20:15 | call to nil? | break_ensure.rb:20:7:22:9 | if ... | false | -| break_ensure.rb:20:10:20:15 | call to nil? | break_ensure.rb:21:9:21:20 | self | true | -| break_ensure.rb:20:17:21:20 | [ensure: break] then ... | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | | -| break_ensure.rb:20:17:21:20 | [ensure: exception] then ... | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | | -| break_ensure.rb:20:17:21:20 | then ... | break_ensure.rb:20:7:22:9 | if ... | | -| break_ensure.rb:21:9:21:20 | [ensure: break] call to puts | break_ensure.rb:20:17:21:20 | [ensure: break] then ... | | -| break_ensure.rb:21:9:21:20 | [ensure: break] self | break_ensure.rb:21:15:21:19 | [ensure: break] y nil | | -| break_ensure.rb:21:9:21:20 | [ensure: exception] call to puts | break_ensure.rb:20:17:21:20 | [ensure: exception] then ... | | -| break_ensure.rb:21:9:21:20 | [ensure: exception] self | break_ensure.rb:21:15:21:19 | [ensure: exception] y nil | | -| break_ensure.rb:21:9:21:20 | call to puts | break_ensure.rb:20:17:21:20 | then ... | | -| break_ensure.rb:21:9:21:20 | self | break_ensure.rb:21:15:21:19 | y nil | | -| break_ensure.rb:21:14:21:20 | "y nil" | break_ensure.rb:21:9:21:20 | call to puts | | -| break_ensure.rb:21:14:21:20 | [ensure: break] "y nil" | break_ensure.rb:21:9:21:20 | [ensure: break] call to puts | | -| break_ensure.rb:21:14:21:20 | [ensure: exception] "y nil" | break_ensure.rb:21:9:21:20 | [ensure: exception] call to puts | | -| break_ensure.rb:21:15:21:19 | [ensure: break] y nil | break_ensure.rb:21:14:21:20 | [ensure: break] "y nil" | | -| break_ensure.rb:21:15:21:19 | [ensure: exception] y nil | break_ensure.rb:21:14:21:20 | [ensure: exception] "y nil" | | +| break_ensure.rb:20:10:20:15 | After call to nil? [false] | break_ensure.rb:20:7:22:9 | After if ... | | +| break_ensure.rb:20:10:20:15 | After call to nil? [true] | break_ensure.rb:20:17:21:20 | then ... | | +| break_ensure.rb:20:10:20:15 | Before call to nil? | break_ensure.rb:20:10:20:10 | y | | +| break_ensure.rb:20:10:20:15 | call to nil? | break_ensure.rb:20:10:20:15 | After call to nil? [false] | false | +| break_ensure.rb:20:10:20:15 | call to nil? | break_ensure.rb:20:10:20:15 | After call to nil? [true] | true | +| break_ensure.rb:20:17:21:20 | After then ... | break_ensure.rb:20:7:22:9 | After if ... | | +| break_ensure.rb:20:17:21:20 | then ... | break_ensure.rb:21:9:21:20 | Before call to puts | | +| break_ensure.rb:21:9:21:20 | After call to puts | break_ensure.rb:20:17:21:20 | After then ... | | +| break_ensure.rb:21:9:21:20 | Before call to puts | break_ensure.rb:21:9:21:20 | self | | +| break_ensure.rb:21:9:21:20 | call to puts | break_ensure.rb:21:9:21:20 | After call to puts | | +| break_ensure.rb:21:9:21:20 | self | break_ensure.rb:21:14:21:20 | Before "y nil" | | +| break_ensure.rb:21:14:21:20 | "y nil" | break_ensure.rb:21:14:21:20 | After "y nil" | | +| break_ensure.rb:21:14:21:20 | After "y nil" | break_ensure.rb:21:9:21:20 | call to puts | | +| break_ensure.rb:21:14:21:20 | Before "y nil" | break_ensure.rb:21:15:21:19 | y nil | | | break_ensure.rb:21:15:21:19 | y nil | break_ensure.rb:21:14:21:20 | "y nil" | | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:27:8:27:8 | x | | -| break_ensure.rb:27:1:42:3 | exit m3 (abnormal) | break_ensure.rb:27:1:42:3 | exit m3 | | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:27:1:42:3 | exit m3 | | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:27:8:27:8 | x | | +| break_ensure.rb:27:1:42:3 | Exceptional Exit | break_ensure.rb:27:1:42:3 | Exit | | +| break_ensure.rb:27:1:42:3 | Normal Exit | break_ensure.rb:27:1:42:3 | Exit | | | break_ensure.rb:27:1:42:3 | m3 | break_ensure.rb:44:1:56:3 | m4 | | | break_ensure.rb:27:8:27:8 | x | break_ensure.rb:27:10:27:10 | y | | -| break_ensure.rb:27:10:27:10 | y | break_ensure.rb:29:8:29:8 | x | | -| break_ensure.rb:29:5:31:7 | if ... | break_ensure.rb:33:11:33:11 | y | | +| break_ensure.rb:27:10:27:10 | y | break_ensure.rb:28:3:41:13 | ... | | +| break_ensure.rb:28:3:40:5 | After begin ... | break_ensure.rb:41:3:41:13 | Before call to puts | | +| break_ensure.rb:28:3:40:5 | begin ... | break_ensure.rb:29:5:31:7 | if ... | | +| break_ensure.rb:28:3:41:13 | ... | break_ensure.rb:28:3:40:5 | begin ... | | +| break_ensure.rb:28:3:41:13 | After ... | break_ensure.rb:27:1:42:3 | Normal Exit | | +| break_ensure.rb:29:5:31:7 | After if ... | break_ensure.rb:32:3:39:7 | ensure ... | | +| break_ensure.rb:29:5:31:7 | if ... | break_ensure.rb:29:8:29:13 | Before call to nil? | | | break_ensure.rb:29:8:29:8 | x | break_ensure.rb:29:8:29:13 | call to nil? | | -| break_ensure.rb:29:8:29:13 | call to nil? | break_ensure.rb:29:5:31:7 | if ... | false | -| break_ensure.rb:29:8:29:13 | call to nil? | break_ensure.rb:30:7:30:12 | return | true | -| break_ensure.rb:29:8:29:13 | call to nil? | break_ensure.rb:33:11:33:11 | [ensure: exception] y | exception | -| break_ensure.rb:30:7:30:12 | return | break_ensure.rb:33:11:33:11 | [ensure: return] y | return | -| break_ensure.rb:32:3:39:7 | [ensure: exception] ensure ... | break_ensure.rb:27:1:42:3 | exit m3 (abnormal) | exception | -| break_ensure.rb:32:3:39:7 | [ensure: return] ensure ... | break_ensure.rb:27:1:42:3 | exit m3 (normal) | return | -| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:41:3:41:13 | self | | -| break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | break_ensure.rb:32:3:39:7 | [ensure: exception] ensure ... | | -| break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:32:3:39:7 | [ensure: return] ensure ... | | -| break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:32:3:39:7 | ensure ... | | -| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:33:15:33:15 | [ensure: exception] 0 | | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:33:15:33:15 | [ensure: return] 0 | | +| break_ensure.rb:29:8:29:13 | After call to nil? [false] | break_ensure.rb:29:5:31:7 | After if ... | | +| break_ensure.rb:29:8:29:13 | After call to nil? [true] | break_ensure.rb:29:15:30:12 | then ... | | +| break_ensure.rb:29:8:29:13 | Before call to nil? | break_ensure.rb:29:8:29:8 | x | | +| break_ensure.rb:29:8:29:13 | call to nil? | break_ensure.rb:29:8:29:13 | After call to nil? [false] | false | +| break_ensure.rb:29:8:29:13 | call to nil? | break_ensure.rb:29:8:29:13 | After call to nil? [true] | true | +| break_ensure.rb:29:8:29:13 | call to nil? | break_ensure.rb:32:3:39:7 | ensure ... | exception | +| break_ensure.rb:29:15:30:12 | then ... | break_ensure.rb:30:7:30:12 | Before return | | +| break_ensure.rb:30:7:30:12 | Before return | break_ensure.rb:30:7:30:12 | return | | +| break_ensure.rb:30:7:30:12 | return | break_ensure.rb:32:3:39:7 | ensure ... | return | +| break_ensure.rb:32:3:39:7 | After ensure ... | break_ensure.rb:27:1:42:3 | Exceptional Exit | exception | +| break_ensure.rb:32:3:39:7 | After ensure ... | break_ensure.rb:27:1:42:3 | Normal Exit | return | +| break_ensure.rb:32:3:39:7 | After ensure ... | break_ensure.rb:28:3:40:5 | After begin ... | | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:33:5:39:7 | while ... | | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:32:3:39:7 | After ensure ... | | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:33:11:33:15 | Before ... < ... | | +| break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | | | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:33:15:33:15 | 0 | | -| break_ensure.rb:33:11:33:15 | ... < ... | break_ensure.rb:33:5:39:7 | while ... | false | -| break_ensure.rb:33:11:33:15 | ... < ... | break_ensure.rb:35:12:35:12 | x | true | -| break_ensure.rb:33:11:33:15 | [ensure: exception] ... < ... | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | false | -| break_ensure.rb:33:11:33:15 | [ensure: exception] ... < ... | break_ensure.rb:35:12:35:12 | [ensure: exception] x | true | -| break_ensure.rb:33:11:33:15 | [ensure: return] ... < ... | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | false | -| break_ensure.rb:33:11:33:15 | [ensure: return] ... < ... | break_ensure.rb:35:12:35:12 | [ensure: return] x | true | +| break_ensure.rb:33:11:33:15 | ... < ... | break_ensure.rb:33:11:33:15 | After ... < ... [false] | false | +| break_ensure.rb:33:11:33:15 | ... < ... | break_ensure.rb:33:11:33:15 | After ... < ... [true] | true | +| break_ensure.rb:33:11:33:15 | After ... < ... [false] | break_ensure.rb:33:5:39:7 | After while ... | | +| break_ensure.rb:33:11:33:15 | After ... < ... [true] | break_ensure.rb:33:16:39:7 | do ... | | +| break_ensure.rb:33:11:33:15 | Before ... < ... | break_ensure.rb:33:11:33:11 | y | | | break_ensure.rb:33:15:33:15 | 0 | break_ensure.rb:33:11:33:15 | ... < ... | | -| break_ensure.rb:33:15:33:15 | [ensure: exception] 0 | break_ensure.rb:33:11:33:15 | [ensure: exception] ... < ... | | -| break_ensure.rb:33:15:33:15 | [ensure: return] 0 | break_ensure.rb:33:11:33:15 | [ensure: return] ... < ... | | -| break_ensure.rb:33:16:39:7 | [ensure: exception] do ... | break_ensure.rb:33:11:33:11 | [ensure: exception] y | | -| break_ensure.rb:33:16:39:7 | [ensure: return] do ... | break_ensure.rb:33:11:33:11 | [ensure: return] y | | -| break_ensure.rb:33:16:39:7 | do ... | break_ensure.rb:33:11:33:11 | y | | -| break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | break_ensure.rb:33:16:39:7 | [ensure: exception] do ... | | -| break_ensure.rb:35:9:37:11 | [ensure: return] if ... | break_ensure.rb:33:16:39:7 | [ensure: return] do ... | | -| break_ensure.rb:35:9:37:11 | if ... | break_ensure.rb:33:16:39:7 | do ... | | -| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:35:16:35:16 | [ensure: exception] 0 | | -| break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:35:16:35:16 | [ensure: return] 0 | | +| break_ensure.rb:33:16:39:7 | After do ... | break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | | +| break_ensure.rb:33:16:39:7 | do ... | break_ensure.rb:34:7:38:9 | begin ... | | +| break_ensure.rb:34:7:38:9 | After begin ... | break_ensure.rb:33:16:39:7 | After do ... | | +| break_ensure.rb:34:7:38:9 | begin ... | break_ensure.rb:35:9:37:11 | if ... | | +| break_ensure.rb:35:9:37:11 | After if ... | break_ensure.rb:34:7:38:9 | After begin ... | | +| break_ensure.rb:35:9:37:11 | if ... | break_ensure.rb:35:12:35:16 | Before ... > ... | | | break_ensure.rb:35:12:35:12 | x | break_ensure.rb:35:16:35:16 | 0 | | -| break_ensure.rb:35:12:35:16 | ... > ... | break_ensure.rb:35:9:37:11 | if ... | false | -| break_ensure.rb:35:12:35:16 | ... > ... | break_ensure.rb:36:11:36:15 | break | true | -| break_ensure.rb:35:12:35:16 | [ensure: exception] ... > ... | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | false | -| break_ensure.rb:35:12:35:16 | [ensure: exception] ... > ... | break_ensure.rb:36:11:36:15 | [ensure: exception] break | true | -| break_ensure.rb:35:12:35:16 | [ensure: return] ... > ... | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | false | -| break_ensure.rb:35:12:35:16 | [ensure: return] ... > ... | break_ensure.rb:36:11:36:15 | [ensure: return] break | true | +| break_ensure.rb:35:12:35:16 | ... > ... | break_ensure.rb:35:12:35:16 | After ... > ... [false] | false | +| break_ensure.rb:35:12:35:16 | ... > ... | break_ensure.rb:35:12:35:16 | After ... > ... [true] | true | +| break_ensure.rb:35:12:35:16 | After ... > ... [false] | break_ensure.rb:35:9:37:11 | After if ... | | +| break_ensure.rb:35:12:35:16 | After ... > ... [true] | break_ensure.rb:35:18:36:15 | then ... | | +| break_ensure.rb:35:12:35:16 | Before ... > ... | break_ensure.rb:35:12:35:12 | x | | | break_ensure.rb:35:16:35:16 | 0 | break_ensure.rb:35:12:35:16 | ... > ... | | -| break_ensure.rb:35:16:35:16 | [ensure: exception] 0 | break_ensure.rb:35:12:35:16 | [ensure: exception] ... > ... | | -| break_ensure.rb:35:16:35:16 | [ensure: return] 0 | break_ensure.rb:35:12:35:16 | [ensure: return] ... > ... | | -| break_ensure.rb:36:11:36:15 | [ensure: exception] break | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | break | -| break_ensure.rb:36:11:36:15 | [ensure: return] break | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break | -| break_ensure.rb:36:11:36:15 | break | break_ensure.rb:33:5:39:7 | while ... | break | -| break_ensure.rb:41:3:41:13 | call to puts | break_ensure.rb:27:1:42:3 | exit m3 (normal) | | -| break_ensure.rb:41:3:41:13 | self | break_ensure.rb:41:9:41:12 | Done | | -| break_ensure.rb:41:8:41:13 | "Done" | break_ensure.rb:41:3:41:13 | call to puts | | +| break_ensure.rb:35:18:36:15 | then ... | break_ensure.rb:36:11:36:15 | Before break | | +| break_ensure.rb:36:11:36:15 | Before break | break_ensure.rb:36:11:36:15 | break | | +| break_ensure.rb:36:11:36:15 | break | break_ensure.rb:33:5:39:7 | After while ... | break | +| break_ensure.rb:41:3:41:13 | After call to puts | break_ensure.rb:28:3:41:13 | After ... | | +| break_ensure.rb:41:3:41:13 | Before call to puts | break_ensure.rb:41:3:41:13 | self | | +| break_ensure.rb:41:3:41:13 | call to puts | break_ensure.rb:41:3:41:13 | After call to puts | | +| break_ensure.rb:41:3:41:13 | self | break_ensure.rb:41:8:41:13 | Before "Done" | | +| break_ensure.rb:41:8:41:13 | "Done" | break_ensure.rb:41:8:41:13 | After "Done" | | +| break_ensure.rb:41:8:41:13 | After "Done" | break_ensure.rb:41:3:41:13 | call to puts | | +| break_ensure.rb:41:8:41:13 | Before "Done" | break_ensure.rb:41:9:41:12 | Done | | | break_ensure.rb:41:9:41:12 | Done | break_ensure.rb:41:8:41:13 | "Done" | | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:44:8:44:8 | x | | -| break_ensure.rb:44:1:56:3 | exit m4 (normal) | break_ensure.rb:44:1:56:3 | exit m4 | | -| break_ensure.rb:44:1:56:3 | m4 | break_ensure.rb:1:1:56:4 | exit break_ensure.rb (normal) | | -| break_ensure.rb:44:8:44:8 | x | break_ensure.rb:45:9:45:9 | x | | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:44:1:56:3 | exit m4 (normal) | | +| break_ensure.rb:44:1:56:3 | Entry | break_ensure.rb:44:8:44:8 | x | | +| break_ensure.rb:44:1:56:3 | Exceptional Exit | break_ensure.rb:44:1:56:3 | Exit | | +| break_ensure.rb:44:1:56:3 | Normal Exit | break_ensure.rb:44:1:56:3 | Exit | | +| break_ensure.rb:44:1:56:3 | m4 | break_ensure.rb:1:1:56:4 | Normal Exit | | +| break_ensure.rb:44:8:44:8 | x | break_ensure.rb:45:3:55:5 | ... | | +| break_ensure.rb:45:3:55:5 | ... | break_ensure.rb:45:3:55:5 | while ... | | +| break_ensure.rb:45:3:55:5 | After ... | break_ensure.rb:44:1:56:3 | Normal Exit | | +| break_ensure.rb:45:3:55:5 | After while ... | break_ensure.rb:45:3:55:5 | After ... | | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:45:9:45:13 | Before ... < ... | | +| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:45:13:45:13 | 0 | | -| break_ensure.rb:45:9:45:13 | ... < ... | break_ensure.rb:45:3:55:5 | while ... | false | -| break_ensure.rb:45:9:45:13 | ... < ... | break_ensure.rb:47:10:47:10 | x | true | +| break_ensure.rb:45:9:45:13 | ... < ... | break_ensure.rb:45:9:45:13 | After ... < ... [false] | false | +| break_ensure.rb:45:9:45:13 | ... < ... | break_ensure.rb:45:9:45:13 | After ... < ... [true] | true | +| break_ensure.rb:45:9:45:13 | After ... < ... [false] | break_ensure.rb:45:3:55:5 | After while ... | | +| break_ensure.rb:45:9:45:13 | After ... < ... [true] | break_ensure.rb:45:14:55:5 | do ... | | +| break_ensure.rb:45:9:45:13 | Before ... < ... | break_ensure.rb:45:9:45:9 | x | | | break_ensure.rb:45:13:45:13 | 0 | break_ensure.rb:45:9:45:13 | ... < ... | | -| break_ensure.rb:45:14:55:5 | do ... | break_ensure.rb:45:9:45:9 | x | | -| break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:51:10:51:10 | x | | +| break_ensure.rb:45:14:55:5 | After do ... | break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | | +| break_ensure.rb:45:14:55:5 | do ... | break_ensure.rb:46:5:54:7 | begin ... | | +| break_ensure.rb:46:5:54:7 | After begin ... | break_ensure.rb:45:14:55:5 | After do ... | | +| break_ensure.rb:46:5:54:7 | begin ... | break_ensure.rb:47:7:49:9 | if ... | | +| break_ensure.rb:47:7:49:9 | After if ... | break_ensure.rb:50:5:53:9 | ensure ... | | +| break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:47:10:47:14 | Before ... > ... | | | break_ensure.rb:47:10:47:10 | x | break_ensure.rb:47:14:47:14 | 1 | | -| break_ensure.rb:47:10:47:14 | ... > ... | break_ensure.rb:47:7:49:9 | if ... | false | -| break_ensure.rb:47:10:47:14 | ... > ... | break_ensure.rb:48:9:48:16 | self | true | -| break_ensure.rb:47:10:47:14 | ... > ... | break_ensure.rb:51:10:51:10 | [ensure: exception] x | exception | +| break_ensure.rb:47:10:47:14 | ... > ... | break_ensure.rb:47:10:47:14 | After ... > ... [false] | false | +| break_ensure.rb:47:10:47:14 | ... > ... | break_ensure.rb:47:10:47:14 | After ... > ... [true] | true | +| break_ensure.rb:47:10:47:14 | ... > ... | break_ensure.rb:50:5:53:9 | ensure ... | exception | +| break_ensure.rb:47:10:47:14 | After ... > ... [false] | break_ensure.rb:47:7:49:9 | After if ... | | +| break_ensure.rb:47:10:47:14 | After ... > ... [true] | break_ensure.rb:47:16:48:16 | then ... | | +| break_ensure.rb:47:10:47:14 | Before ... > ... | break_ensure.rb:47:10:47:10 | x | | | break_ensure.rb:47:14:47:14 | 1 | break_ensure.rb:47:10:47:14 | ... > ... | | -| break_ensure.rb:48:9:48:16 | call to raise | break_ensure.rb:51:10:51:10 | [ensure: exception] x | exception | +| break_ensure.rb:47:16:48:16 | then ... | break_ensure.rb:48:9:48:16 | Before call to raise | | +| break_ensure.rb:48:9:48:16 | Before call to raise | break_ensure.rb:48:9:48:16 | self | | +| break_ensure.rb:48:9:48:16 | call to raise | break_ensure.rb:50:5:53:9 | ensure ... | exception | | break_ensure.rb:48:9:48:16 | self | break_ensure.rb:48:15:48:16 | "" | | | break_ensure.rb:48:15:48:16 | "" | break_ensure.rb:48:9:48:16 | call to raise | | -| break_ensure.rb:50:5:53:9 | [ensure: exception] ensure ... | break_ensure.rb:45:3:55:5 | while ... | exception | -| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:45:14:55:5 | do ... | | -| break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | break_ensure.rb:50:5:53:9 | [ensure: exception] ensure ... | | -| break_ensure.rb:51:7:53:9 | if ... | break_ensure.rb:50:5:53:9 | ensure ... | | -| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:51:14:51:14 | [ensure: exception] 0 | | +| break_ensure.rb:50:5:53:9 | After ensure ... | break_ensure.rb:44:1:56:3 | Exceptional Exit | exception | +| break_ensure.rb:50:5:53:9 | After ensure ... | break_ensure.rb:46:5:54:7 | After begin ... | | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:51:7:53:9 | if ... | | +| break_ensure.rb:51:7:53:9 | After if ... | break_ensure.rb:50:5:53:9 | After ensure ... | | +| break_ensure.rb:51:7:53:9 | if ... | break_ensure.rb:51:10:51:14 | Before ... > ... | | | break_ensure.rb:51:10:51:10 | x | break_ensure.rb:51:14:51:14 | 0 | | -| break_ensure.rb:51:10:51:14 | ... > ... | break_ensure.rb:51:7:53:9 | if ... | false | -| break_ensure.rb:51:10:51:14 | ... > ... | break_ensure.rb:52:15:52:16 | 10 | true | -| break_ensure.rb:51:10:51:14 | [ensure: exception] ... > ... | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | false | -| break_ensure.rb:51:10:51:14 | [ensure: exception] ... > ... | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | true | +| break_ensure.rb:51:10:51:14 | ... > ... | break_ensure.rb:51:10:51:14 | After ... > ... [false] | false | +| break_ensure.rb:51:10:51:14 | ... > ... | break_ensure.rb:51:10:51:14 | After ... > ... [true] | true | +| break_ensure.rb:51:10:51:14 | After ... > ... [false] | break_ensure.rb:51:7:53:9 | After if ... | | +| break_ensure.rb:51:10:51:14 | After ... > ... [true] | break_ensure.rb:51:16:52:17 | then ... | | +| break_ensure.rb:51:10:51:14 | Before ... > ... | break_ensure.rb:51:10:51:10 | x | | | break_ensure.rb:51:14:51:14 | 0 | break_ensure.rb:51:10:51:14 | ... > ... | | -| break_ensure.rb:51:14:51:14 | [ensure: exception] 0 | break_ensure.rb:51:10:51:14 | [ensure: exception] ... > ... | | -| break_ensure.rb:52:9:52:16 | [ensure: exception] break | break_ensure.rb:45:3:55:5 | while ... | break | -| break_ensure.rb:52:9:52:16 | break | break_ensure.rb:45:3:55:5 | while ... | break | +| break_ensure.rb:51:16:52:17 | then ... | break_ensure.rb:52:9:52:16 | Before break | | +| break_ensure.rb:52:9:52:16 | Before break | break_ensure.rb:52:15:52:16 | 10 | | +| break_ensure.rb:52:9:52:16 | break | break_ensure.rb:45:3:55:5 | After while ... | break | | break_ensure.rb:52:15:52:16 | 10 | break_ensure.rb:52:9:52:16 | break | | -| break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | break_ensure.rb:52:9:52:16 | [ensure: exception] break | | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:2:8:2:9 | self | | -| case.rb:1:1:6:3 | exit if_in_case (normal) | case.rb:1:1:6:3 | exit if_in_case | | +| case.rb:1:1:6:3 | Entry | case.rb:2:3:5:5 | ... | | +| case.rb:1:1:6:3 | Normal Exit | case.rb:1:1:6:3 | Exit | | | case.rb:1:1:6:3 | if_in_case | case.rb:8:1:18:3 | case_match | | -| case.rb:1:1:99:4 | enter case.rb | case.rb:1:1:6:3 | if_in_case | | -| case.rb:1:1:99:4 | exit case.rb (normal) | case.rb:1:1:99:4 | exit case.rb | | -| case.rb:2:3:5:5 | case ... | case.rb:1:1:6:3 | exit if_in_case (normal) | | -| case.rb:2:8:2:9 | call to x1 | case.rb:3:10:3:10 | 1 | | +| case.rb:1:1:99:4 | Entry | case.rb:1:1:6:3 | if_in_case | | +| case.rb:1:1:99:4 | Normal Exit | case.rb:1:1:99:4 | Exit | | +| case.rb:2:3:5:5 | ... | case.rb:2:3:5:5 | case ... | | +| case.rb:2:3:5:5 | After ... | case.rb:1:1:6:3 | Normal Exit | | +| case.rb:2:3:5:5 | After case ... | case.rb:2:3:5:5 | After ... | | +| case.rb:2:3:5:5 | case ... | case.rb:2:8:2:9 | Before call to x1 | | +| case.rb:2:8:2:9 | After call to x1 | case.rb:3:5:3:42 | when ... | | +| case.rb:2:8:2:9 | Before call to x1 | case.rb:2:8:2:9 | self | | +| case.rb:2:8:2:9 | call to x1 | case.rb:2:8:2:9 | After call to x1 | | | case.rb:2:8:2:9 | self | case.rb:2:8:2:9 | call to x1 | | -| case.rb:3:5:3:42 | [match] when ... | case.rb:3:21:3:22 | self | match | -| case.rb:3:5:3:42 | [no-match] when ... | case.rb:4:10:4:10 | 2 | no-match | -| case.rb:3:10:3:10 | 1 | case.rb:3:5:3:42 | [match] when ... | match | -| case.rb:3:10:3:10 | 1 | case.rb:3:5:3:42 | [no-match] when ... | no-match | -| case.rb:3:12:3:42 | then ... | case.rb:2:3:5:5 | case ... | | -| case.rb:3:17:3:42 | ( ... ) | case.rb:3:12:3:42 | then ... | | -| case.rb:3:18:3:41 | if ... | case.rb:3:17:3:42 | ( ... ) | | -| case.rb:3:21:3:22 | call to x2 | case.rb:3:18:3:41 | if ... | false | -| case.rb:3:21:3:22 | call to x2 | case.rb:3:29:3:37 | self | true | +| case.rb:3:5:3:42 | After when ... [match] | case.rb:3:12:3:42 | then ... | | +| case.rb:3:5:3:42 | After when ... [no-match] | case.rb:4:5:4:24 | when ... | | +| case.rb:3:5:3:42 | when ... | case.rb:3:10:3:10 | 1 | | +| case.rb:3:10:3:10 | 1 | case.rb:3:10:3:10 | After 1 [match] | match | +| case.rb:3:10:3:10 | 1 | case.rb:3:10:3:10 | After 1 [no-match] | no-match | +| case.rb:3:10:3:10 | After 1 [match] | case.rb:3:5:3:42 | After when ... [match] | match | +| case.rb:3:10:3:10 | After 1 [no-match] | case.rb:3:5:3:42 | After when ... [no-match] | no-match | +| case.rb:3:12:3:42 | After then ... | case.rb:2:3:5:5 | After case ... | | +| case.rb:3:12:3:42 | then ... | case.rb:3:17:3:42 | ( ... ) | | +| case.rb:3:17:3:42 | ( ... ) | case.rb:3:18:3:41 | if ... | | +| case.rb:3:17:3:42 | After ( ... ) | case.rb:3:12:3:42 | After then ... | | +| case.rb:3:18:3:41 | After if ... | case.rb:3:17:3:42 | After ( ... ) | | +| case.rb:3:18:3:41 | if ... | case.rb:3:21:3:22 | Before call to x2 | | +| case.rb:3:21:3:22 | After call to x2 [false] | case.rb:3:18:3:41 | After if ... | | +| case.rb:3:21:3:22 | After call to x2 [true] | case.rb:3:24:3:37 | then ... | | +| case.rb:3:21:3:22 | Before call to x2 | case.rb:3:21:3:22 | self | | +| case.rb:3:21:3:22 | call to x2 | case.rb:3:21:3:22 | After call to x2 [false] | false | +| case.rb:3:21:3:22 | call to x2 | case.rb:3:21:3:22 | After call to x2 [true] | true | | case.rb:3:21:3:22 | self | case.rb:3:21:3:22 | call to x2 | | -| case.rb:3:24:3:37 | then ... | case.rb:3:18:3:41 | if ... | | -| case.rb:3:29:3:37 | call to puts | case.rb:3:24:3:37 | then ... | | -| case.rb:3:29:3:37 | self | case.rb:3:35:3:36 | x2 | | -| case.rb:3:34:3:37 | "x2" | case.rb:3:29:3:37 | call to puts | | +| case.rb:3:24:3:37 | After then ... | case.rb:3:18:3:41 | After if ... | | +| case.rb:3:24:3:37 | then ... | case.rb:3:29:3:37 | Before call to puts | | +| case.rb:3:29:3:37 | After call to puts | case.rb:3:24:3:37 | After then ... | | +| case.rb:3:29:3:37 | Before call to puts | case.rb:3:29:3:37 | self | | +| case.rb:3:29:3:37 | call to puts | case.rb:3:29:3:37 | After call to puts | | +| case.rb:3:29:3:37 | self | case.rb:3:34:3:37 | Before "x2" | | +| case.rb:3:34:3:37 | "x2" | case.rb:3:34:3:37 | After "x2" | | +| case.rb:3:34:3:37 | After "x2" | case.rb:3:29:3:37 | call to puts | | +| case.rb:3:34:3:37 | Before "x2" | case.rb:3:35:3:36 | x2 | | | case.rb:3:35:3:36 | x2 | case.rb:3:34:3:37 | "x2" | | -| case.rb:4:5:4:24 | [match] when ... | case.rb:4:17:4:24 | self | match | -| case.rb:4:5:4:24 | [no-match] when ... | case.rb:2:3:5:5 | case ... | no-match | -| case.rb:4:10:4:10 | 2 | case.rb:4:5:4:24 | [match] when ... | match | -| case.rb:4:10:4:10 | 2 | case.rb:4:5:4:24 | [no-match] when ... | no-match | -| case.rb:4:12:4:24 | then ... | case.rb:2:3:5:5 | case ... | | -| case.rb:4:17:4:24 | call to puts | case.rb:4:12:4:24 | then ... | | -| case.rb:4:17:4:24 | self | case.rb:4:23:4:23 | 2 | | -| case.rb:4:22:4:24 | "2" | case.rb:4:17:4:24 | call to puts | | +| case.rb:4:5:4:24 | After when ... [match] | case.rb:4:12:4:24 | then ... | | +| case.rb:4:5:4:24 | After when ... [no-match] | case.rb:2:3:5:5 | After case ... | | +| case.rb:4:5:4:24 | when ... | case.rb:4:10:4:10 | 2 | | +| case.rb:4:10:4:10 | 2 | case.rb:4:10:4:10 | After 2 [match] | match | +| case.rb:4:10:4:10 | 2 | case.rb:4:10:4:10 | After 2 [no-match] | no-match | +| case.rb:4:10:4:10 | After 2 [match] | case.rb:4:5:4:24 | After when ... [match] | match | +| case.rb:4:10:4:10 | After 2 [no-match] | case.rb:4:5:4:24 | After when ... [no-match] | no-match | +| case.rb:4:12:4:24 | After then ... | case.rb:2:3:5:5 | After case ... | | +| case.rb:4:12:4:24 | then ... | case.rb:4:17:4:24 | Before call to puts | | +| case.rb:4:17:4:24 | After call to puts | case.rb:4:12:4:24 | After then ... | | +| case.rb:4:17:4:24 | Before call to puts | case.rb:4:17:4:24 | self | | +| case.rb:4:17:4:24 | call to puts | case.rb:4:17:4:24 | After call to puts | | +| case.rb:4:17:4:24 | self | case.rb:4:22:4:24 | Before "2" | | +| case.rb:4:22:4:24 | "2" | case.rb:4:22:4:24 | After "2" | | +| case.rb:4:22:4:24 | After "2" | case.rb:4:17:4:24 | call to puts | | +| case.rb:4:22:4:24 | Before "2" | case.rb:4:23:4:23 | 2 | | | case.rb:4:23:4:23 | 2 | case.rb:4:22:4:24 | "2" | | +| case.rb:8:1:18:3 | Entry | case.rb:8:16:8:20 | value | | +| case.rb:8:1:18:3 | Normal Exit | case.rb:8:1:18:3 | Exit | | | case.rb:8:1:18:3 | case_match | case.rb:20:1:24:3 | case_match_no_match | | -| case.rb:8:1:18:3 | enter case_match | case.rb:8:16:8:20 | value | | -| case.rb:8:1:18:3 | exit case_match (normal) | case.rb:8:1:18:3 | exit case_match | | -| case.rb:8:16:8:20 | value | case.rb:9:8:9:12 | value | | -| case.rb:9:3:17:5 | case ... | case.rb:8:1:18:3 | exit case_match (normal) | | +| case.rb:8:16:8:20 | value | case.rb:9:3:17:5 | ... | | +| case.rb:9:3:17:5 | ... | case.rb:9:3:17:5 | case ... | | +| case.rb:9:3:17:5 | After ... | case.rb:8:1:18:3 | Normal Exit | | +| case.rb:9:3:17:5 | After case ... | case.rb:9:3:17:5 | After ... | | +| case.rb:9:3:17:5 | case ... | case.rb:9:8:9:12 | value | | | case.rb:9:8:9:12 | value | case.rb:10:5:10:9 | in ... then ... | | +| case.rb:10:5:10:9 | After in ... then ... [match] | case.rb:9:3:17:5 | After case ... | | +| case.rb:10:5:10:9 | After in ... then ... [no-match] | case.rb:11:5:11:15 | in ... then ... | | | case.rb:10:5:10:9 | in ... then ... | case.rb:10:8:10:8 | 0 | | -| case.rb:10:8:10:8 | 0 | case.rb:9:3:17:5 | case ... | match | -| case.rb:10:8:10:8 | 0 | case.rb:11:5:11:15 | in ... then ... | no-match | +| case.rb:10:8:10:8 | 0 | case.rb:10:8:10:8 | After 0 [match] | match | +| case.rb:10:8:10:8 | 0 | case.rb:10:8:10:8 | After 0 [no-match] | no-match | +| case.rb:10:8:10:8 | After 0 [match] | case.rb:10:5:10:9 | After in ... then ... [match] | match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:10:5:10:9 | After in ... then ... [no-match] | no-match | +| case.rb:11:5:11:15 | After in ... then ... [match] | case.rb:11:10:11:15 | then ... | | +| case.rb:11:5:11:15 | After in ... then ... [no-match] | case.rb:12:5:13:7 | in ... then ... | | | case.rb:11:5:11:15 | in ... then ... | case.rb:11:8:11:8 | 1 | | -| case.rb:11:8:11:8 | 1 | case.rb:11:15:11:15 | 3 | match | -| case.rb:11:8:11:8 | 1 | case.rb:12:5:13:7 | in ... then ... | no-match | -| case.rb:11:10:11:15 | then ... | case.rb:9:3:17:5 | case ... | | -| case.rb:11:15:11:15 | 3 | case.rb:11:10:11:15 | then ... | | +| case.rb:11:8:11:8 | 1 | case.rb:11:8:11:8 | After 1 [match] | match | +| case.rb:11:8:11:8 | 1 | case.rb:11:8:11:8 | After 1 [no-match] | no-match | +| case.rb:11:8:11:8 | After 1 [match] | case.rb:11:5:11:15 | After in ... then ... [match] | match | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:11:5:11:15 | After in ... then ... [no-match] | no-match | +| case.rb:11:10:11:15 | After then ... | case.rb:9:3:17:5 | After case ... | | +| case.rb:11:10:11:15 | then ... | case.rb:11:15:11:15 | 3 | | +| case.rb:11:15:11:15 | 3 | case.rb:11:10:11:15 | After then ... | | +| case.rb:12:5:13:7 | After in ... then ... [match] | case.rb:12:9:13:7 | then ... | | +| case.rb:12:5:13:7 | After in ... then ... [no-match] | case.rb:14:5:14:25 | in ... then ... | | | case.rb:12:5:13:7 | in ... then ... | case.rb:12:8:12:8 | 2 | | -| case.rb:12:8:12:8 | 2 | case.rb:13:7:13:7 | 4 | match | -| case.rb:12:8:12:8 | 2 | case.rb:14:5:14:25 | in ... then ... | no-match | -| case.rb:12:9:13:7 | then ... | case.rb:9:3:17:5 | case ... | | -| case.rb:13:7:13:7 | 4 | case.rb:12:9:13:7 | then ... | | +| case.rb:12:8:12:8 | 2 | case.rb:12:8:12:8 | After 2 [match] | match | +| case.rb:12:8:12:8 | 2 | case.rb:12:8:12:8 | After 2 [no-match] | no-match | +| case.rb:12:8:12:8 | After 2 [match] | case.rb:12:5:13:7 | After in ... then ... [match] | match | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:12:5:13:7 | After in ... then ... [no-match] | no-match | +| case.rb:12:9:13:7 | After then ... | case.rb:9:3:17:5 | After case ... | | +| case.rb:12:9:13:7 | then ... | case.rb:13:7:13:7 | 4 | | +| case.rb:13:7:13:7 | 4 | case.rb:12:9:13:7 | After then ... | | +| case.rb:14:5:14:25 | After in ... then ... [match] | case.rb:14:13:14:18 | Before ... == ... | | +| case.rb:14:5:14:25 | After in ... then ... [no-match] | case.rb:15:5:15:28 | in ... then ... | | | case.rb:14:5:14:25 | in ... then ... | case.rb:14:8:14:8 | x | | -| case.rb:14:8:14:8 | x | case.rb:14:13:14:13 | x | match | +| case.rb:14:8:14:8 | After x [match] | case.rb:14:5:14:25 | After in ... then ... [match] | match | +| case.rb:14:8:14:8 | After x [no-match] | case.rb:14:5:14:25 | After in ... then ... [no-match] | no-match | +| case.rb:14:8:14:8 | x | case.rb:14:8:14:8 | After x [match] | match | +| case.rb:14:8:14:8 | x | case.rb:14:8:14:8 | After x [no-match] | no-match | | case.rb:14:13:14:13 | x | case.rb:14:18:14:18 | 5 | | -| case.rb:14:13:14:18 | ... == ... | case.rb:14:25:14:25 | 6 | true | -| case.rb:14:13:14:18 | ... == ... | case.rb:15:5:15:28 | in ... then ... | false | +| case.rb:14:13:14:18 | ... == ... | case.rb:14:13:14:18 | After ... == ... [false] | false | +| case.rb:14:13:14:18 | ... == ... | case.rb:14:13:14:18 | After ... == ... [true] | true | +| case.rb:14:13:14:18 | After ... == ... [false] | case.rb:15:5:15:28 | in ... then ... | | +| case.rb:14:13:14:18 | After ... == ... [true] | case.rb:14:20:14:25 | then ... | | +| case.rb:14:13:14:18 | Before ... == ... | case.rb:14:13:14:13 | x | | | case.rb:14:18:14:18 | 5 | case.rb:14:13:14:18 | ... == ... | | -| case.rb:14:20:14:25 | then ... | case.rb:9:3:17:5 | case ... | | -| case.rb:14:25:14:25 | 6 | case.rb:14:20:14:25 | then ... | | +| case.rb:14:20:14:25 | After then ... | case.rb:9:3:17:5 | After case ... | | +| case.rb:14:20:14:25 | then ... | case.rb:14:25:14:25 | 6 | | +| case.rb:14:25:14:25 | 6 | case.rb:14:20:14:25 | After then ... | | +| case.rb:15:5:15:28 | After in ... then ... [match] | case.rb:15:17:15:21 | Before ... < ... | | +| case.rb:15:5:15:28 | After in ... then ... [no-match] | case.rb:16:5:16:10 | else ... | | | case.rb:15:5:15:28 | in ... then ... | case.rb:15:8:15:8 | x | | -| case.rb:15:8:15:8 | x | case.rb:15:17:15:17 | x | match | +| case.rb:15:8:15:8 | After x [match] | case.rb:15:5:15:28 | After in ... then ... [match] | match | +| case.rb:15:8:15:8 | After x [no-match] | case.rb:15:5:15:28 | After in ... then ... [no-match] | no-match | +| case.rb:15:8:15:8 | x | case.rb:15:8:15:8 | After x [match] | match | +| case.rb:15:8:15:8 | x | case.rb:15:8:15:8 | After x [no-match] | no-match | | case.rb:15:17:15:17 | x | case.rb:15:21:15:21 | 0 | | -| case.rb:15:17:15:21 | ... < ... | case.rb:15:28:15:28 | 7 | false | -| case.rb:15:17:15:21 | ... < ... | case.rb:16:10:16:10 | 8 | true | +| case.rb:15:17:15:21 | ... < ... | case.rb:15:17:15:21 | After ... < ... [false] | false | +| case.rb:15:17:15:21 | ... < ... | case.rb:15:17:15:21 | After ... < ... [true] | true | +| case.rb:15:17:15:21 | After ... < ... [false] | case.rb:16:5:16:10 | else ... | | +| case.rb:15:17:15:21 | After ... < ... [true] | case.rb:15:23:15:28 | then ... | | +| case.rb:15:17:15:21 | Before ... < ... | case.rb:15:17:15:17 | x | | | case.rb:15:21:15:21 | 0 | case.rb:15:17:15:21 | ... < ... | | -| case.rb:15:23:15:28 | then ... | case.rb:9:3:17:5 | case ... | | -| case.rb:15:28:15:28 | 7 | case.rb:15:23:15:28 | then ... | | -| case.rb:16:5:16:10 | else ... | case.rb:9:3:17:5 | case ... | | -| case.rb:16:10:16:10 | 8 | case.rb:16:5:16:10 | else ... | | +| case.rb:15:23:15:28 | After then ... | case.rb:9:3:17:5 | After case ... | | +| case.rb:15:23:15:28 | then ... | case.rb:15:28:15:28 | 7 | | +| case.rb:15:28:15:28 | 7 | case.rb:15:23:15:28 | After then ... | | +| case.rb:16:5:16:10 | After else ... | case.rb:9:3:17:5 | After case ... | | +| case.rb:16:5:16:10 | After else ... [match] | case.rb:16:5:16:10 | else ... | | +| case.rb:16:5:16:10 | else ... | case.rb:16:5:16:10 | After else ... [match] | match | +| case.rb:16:5:16:10 | else ... | case.rb:16:10:16:10 | 8 | | +| case.rb:16:10:16:10 | 8 | case.rb:16:5:16:10 | After else ... | | +| case.rb:20:1:24:3 | Entry | case.rb:20:25:20:29 | value | | +| case.rb:20:1:24:3 | Normal Exit | case.rb:20:1:24:3 | Exit | | | case.rb:20:1:24:3 | case_match_no_match | case.rb:26:1:30:3 | case_match_raise | | -| case.rb:20:1:24:3 | enter case_match_no_match | case.rb:20:25:20:29 | value | | -| case.rb:20:1:24:3 | exit case_match_no_match (abnormal) | case.rb:20:1:24:3 | exit case_match_no_match | | -| case.rb:20:1:24:3 | exit case_match_no_match (normal) | case.rb:20:1:24:3 | exit case_match_no_match | | -| case.rb:20:25:20:29 | value | case.rb:21:8:21:12 | value | | -| case.rb:21:3:23:5 | case ... | case.rb:20:1:24:3 | exit case_match_no_match (normal) | | +| case.rb:20:25:20:29 | value | case.rb:21:3:23:5 | ... | | +| case.rb:21:3:23:5 | ... | case.rb:21:3:23:5 | case ... | | +| case.rb:21:3:23:5 | After ... | case.rb:20:1:24:3 | Normal Exit | | +| case.rb:21:3:23:5 | After case ... | case.rb:21:3:23:5 | After ... | | +| case.rb:21:3:23:5 | case ... | case.rb:21:8:21:12 | value | | | case.rb:21:8:21:12 | value | case.rb:22:5:22:8 | in ... then ... | | +| case.rb:22:5:22:8 | After in ... then ... [match] | case.rb:21:3:23:5 | After case ... | | +| case.rb:22:5:22:8 | After in ... then ... [no-match] | case.rb:21:3:23:5 | After case ... | | | case.rb:22:5:22:8 | in ... then ... | case.rb:22:8:22:8 | 1 | | -| case.rb:22:8:22:8 | 1 | case.rb:20:1:24:3 | exit case_match_no_match (abnormal) | exception | -| case.rb:22:8:22:8 | 1 | case.rb:21:3:23:5 | case ... | match | +| case.rb:22:8:22:8 | 1 | case.rb:22:8:22:8 | After 1 [match] | match | +| case.rb:22:8:22:8 | 1 | case.rb:22:8:22:8 | After 1 [no-match] | no-match | +| case.rb:22:8:22:8 | After 1 [match] | case.rb:22:5:22:8 | After in ... then ... [match] | match | +| case.rb:22:8:22:8 | After 1 [no-match] | case.rb:22:5:22:8 | After in ... then ... [no-match] | no-match | +| case.rb:26:1:30:3 | Entry | case.rb:26:22:26:26 | value | | +| case.rb:26:1:30:3 | Normal Exit | case.rb:26:1:30:3 | Exit | | | case.rb:26:1:30:3 | case_match_raise | case.rb:32:1:39:3 | case_match_array | | -| case.rb:26:1:30:3 | enter case_match_raise | case.rb:26:22:26:26 | value | | -| case.rb:26:1:30:3 | exit case_match_raise (abnormal) | case.rb:26:1:30:3 | exit case_match_raise | | -| case.rb:26:1:30:3 | exit case_match_raise (normal) | case.rb:26:1:30:3 | exit case_match_raise | | -| case.rb:26:22:26:26 | value | case.rb:27:8:27:12 | value | | -| case.rb:27:3:29:5 | case ... | case.rb:26:1:30:3 | exit case_match_raise (normal) | | +| case.rb:26:22:26:26 | value | case.rb:27:3:29:5 | ... | | +| case.rb:27:3:29:5 | ... | case.rb:27:3:29:5 | case ... | | +| case.rb:27:3:29:5 | After ... | case.rb:26:1:30:3 | Normal Exit | | +| case.rb:27:3:29:5 | After case ... | case.rb:27:3:29:5 | After ... | | +| case.rb:27:3:29:5 | case ... | case.rb:27:8:27:12 | value | | | case.rb:27:8:27:12 | value | case.rb:28:4:28:28 | in ... then ... | | +| case.rb:28:4:28:28 | After in ... then ... [match] | case.rb:27:3:29:5 | After case ... | | +| case.rb:28:4:28:28 | After in ... then ... [no-match] | case.rb:27:3:29:5 | After case ... | | | case.rb:28:4:28:28 | in ... then ... | case.rb:28:7:28:28 | -> { ... } | | -| case.rb:28:7:28:28 | -> { ... } | case.rb:26:1:30:3 | exit case_match_raise (abnormal) | exception | -| case.rb:28:7:28:28 | -> { ... } | case.rb:27:3:29:5 | case ... | match | -| case.rb:28:7:28:28 | enter -> { ... } | case.rb:28:10:28:10 | x | | -| case.rb:28:7:28:28 | exit -> { ... } (abnormal) | case.rb:28:7:28:28 | exit -> { ... } | | -| case.rb:28:10:28:10 | x | case.rb:28:14:28:25 | self | | -| case.rb:28:14:28:25 | call to raise | case.rb:28:7:28:28 | exit -> { ... } (abnormal) | exception | -| case.rb:28:14:28:25 | self | case.rb:28:21:28:24 | oops | | -| case.rb:28:20:28:25 | "oops" | case.rb:28:14:28:25 | call to raise | | +| case.rb:28:7:28:28 | -> { ... } | case.rb:28:7:28:28 | After -> { ... } [match] | match | +| case.rb:28:7:28:28 | -> { ... } | case.rb:28:7:28:28 | After -> { ... } [no-match] | no-match | +| case.rb:28:7:28:28 | After -> { ... } [match] | case.rb:28:4:28:28 | After in ... then ... [match] | match | +| case.rb:28:7:28:28 | After -> { ... } [no-match] | case.rb:28:4:28:28 | After in ... then ... [no-match] | no-match | +| case.rb:28:7:28:28 | Entry | case.rb:28:10:28:10 | x | | +| case.rb:28:7:28:28 | Exceptional Exit | case.rb:28:7:28:28 | Exit | | +| case.rb:28:10:28:10 | x | case.rb:28:14:28:25 | ... | | +| case.rb:28:14:28:25 | ... | case.rb:28:14:28:25 | Before call to raise | | +| case.rb:28:14:28:25 | Before call to raise | case.rb:28:14:28:25 | self | | +| case.rb:28:14:28:25 | call to raise | case.rb:28:7:28:28 | Exceptional Exit | exception | +| case.rb:28:14:28:25 | self | case.rb:28:20:28:25 | Before "oops" | | +| case.rb:28:20:28:25 | "oops" | case.rb:28:20:28:25 | After "oops" | | +| case.rb:28:20:28:25 | After "oops" | case.rb:28:14:28:25 | call to raise | | +| case.rb:28:20:28:25 | Before "oops" | case.rb:28:21:28:24 | oops | | | case.rb:28:21:28:24 | oops | case.rb:28:20:28:25 | "oops" | | +| case.rb:32:1:39:3 | Entry | case.rb:32:22:32:26 | value | | +| case.rb:32:1:39:3 | Normal Exit | case.rb:32:1:39:3 | Exit | | | case.rb:32:1:39:3 | case_match_array | case.rb:41:1:45:3 | case_match_find | | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:32:22:32:26 | value | | -| case.rb:32:1:39:3 | exit case_match_array (abnormal) | case.rb:32:1:39:3 | exit case_match_array | | -| case.rb:32:1:39:3 | exit case_match_array (normal) | case.rb:32:1:39:3 | exit case_match_array | | -| case.rb:32:22:32:26 | value | case.rb:33:8:33:12 | value | | -| case.rb:33:3:38:5 | case ... | case.rb:32:1:39:3 | exit case_match_array (normal) | | +| case.rb:32:22:32:26 | value | case.rb:33:3:38:5 | ... | | +| case.rb:33:3:38:5 | ... | case.rb:33:3:38:5 | case ... | | +| case.rb:33:3:38:5 | After ... | case.rb:32:1:39:3 | Normal Exit | | +| case.rb:33:3:38:5 | After case ... | case.rb:33:3:38:5 | After ... | | +| case.rb:33:3:38:5 | case ... | case.rb:33:8:33:12 | value | | | case.rb:33:8:33:12 | value | case.rb:34:5:34:10 | in ... then ... | | +| case.rb:34:5:34:10 | After in ... then ... [match] | case.rb:33:3:38:5 | After case ... | | +| case.rb:34:5:34:10 | After in ... then ... [no-match] | case.rb:35:5:35:11 | in ... then ... | | | case.rb:34:5:34:10 | in ... then ... | case.rb:34:8:34:9 | [ ..., * ] | | -| case.rb:34:8:34:9 | [ ..., * ] | case.rb:33:3:38:5 | case ... | match | -| case.rb:34:8:34:9 | [ ..., * ] | case.rb:35:5:35:11 | in ... then ... | no-match | +| case.rb:34:8:34:9 | After [ ..., * ] [match] | case.rb:34:5:34:10 | After in ... then ... [match] | match | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:34:5:34:10 | After in ... then ... [no-match] | no-match | +| case.rb:34:8:34:9 | [ ..., * ] | case.rb:34:8:34:9 | After [ ..., * ] [match] | match | +| case.rb:34:8:34:9 | [ ..., * ] | case.rb:34:8:34:9 | After [ ..., * ] [no-match] | no-match | +| case.rb:35:5:35:11 | After in ... then ... [match] | case.rb:33:3:38:5 | After case ... | | +| case.rb:35:5:35:11 | After in ... then ... [no-match] | case.rb:36:5:36:13 | in ... then ... | | | case.rb:35:5:35:11 | in ... then ... | case.rb:35:8:35:10 | [ ..., * ] | | -| case.rb:35:8:35:10 | [ ..., * ] | case.rb:35:9:35:9 | x | false, match, true | -| case.rb:35:8:35:10 | [ ..., * ] | case.rb:36:5:36:13 | in ... then ... | no-match | -| case.rb:35:9:35:9 | x | case.rb:33:3:38:5 | case ... | match | +| case.rb:35:8:35:10 | After [ ..., * ] [match] | case.rb:35:5:35:11 | After in ... then ... [match] | match | +| case.rb:35:8:35:10 | After [ ..., * ] [no-match] | case.rb:35:5:35:11 | After in ... then ... [no-match] | no-match | +| case.rb:35:8:35:10 | [ ..., * ] | case.rb:35:9:35:9 | x | | +| case.rb:35:9:35:9 | x | case.rb:35:8:35:10 | After [ ..., * ] [match] | match | +| case.rb:35:9:35:9 | x | case.rb:35:8:35:10 | After [ ..., * ] [no-match] | no-match | +| case.rb:36:5:36:13 | After in ... then ... [match] | case.rb:33:3:38:5 | After case ... | | +| case.rb:36:5:36:13 | After in ... then ... [no-match] | case.rb:37:5:37:27 | in ... then ... | | | case.rb:36:5:36:13 | in ... then ... | case.rb:36:8:36:12 | [ ..., * ] | | -| case.rb:36:8:36:12 | [ ..., * ] | case.rb:36:9:36:9 | x | false, match, true | -| case.rb:36:8:36:12 | [ ..., * ] | case.rb:37:5:37:27 | in ... then ... | no-match | -| case.rb:36:9:36:9 | x | case.rb:33:3:38:5 | case ... | match | -| case.rb:37:5:37:27 | in ... then ... | case.rb:37:8:37:10 | Bar | | -| case.rb:37:8:37:10 | Bar | case.rb:32:1:39:3 | exit case_match_array (abnormal) | exception | -| case.rb:37:8:37:10 | Bar | case.rb:37:8:37:26 | [ ..., * ] | match | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:32:1:39:3 | exit case_match_array (abnormal) | exception | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:12:37:12 | a | false, match, true | -| case.rb:37:12:37:12 | a | case.rb:37:15:37:15 | b | match | -| case.rb:37:15:37:15 | b | case.rb:37:19:37:19 | c | match | +| case.rb:36:8:36:12 | After [ ..., * ] [match] | case.rb:36:5:36:13 | After in ... then ... [match] | match | +| case.rb:36:8:36:12 | After [ ..., * ] [no-match] | case.rb:36:5:36:13 | After in ... then ... [no-match] | no-match | +| case.rb:36:8:36:12 | [ ..., * ] | case.rb:36:9:36:9 | x | | +| case.rb:36:9:36:9 | x | case.rb:36:8:36:12 | After [ ..., * ] [match] | match | +| case.rb:36:9:36:9 | x | case.rb:36:8:36:12 | After [ ..., * ] [no-match] | no-match | +| case.rb:37:5:37:27 | After in ... then ... [match] | case.rb:33:3:38:5 | After case ... | | +| case.rb:37:5:37:27 | After in ... then ... [no-match] | case.rb:33:3:38:5 | After case ... | | +| case.rb:37:5:37:27 | in ... then ... | case.rb:37:8:37:26 | [ ..., * ] | | +| case.rb:37:8:37:10 | Bar | case.rb:37:12:37:12 | a | | +| case.rb:37:8:37:26 | After [ ..., * ] [match] | case.rb:37:5:37:27 | After in ... then ... [match] | match | +| case.rb:37:8:37:26 | After [ ..., * ] [no-match] | case.rb:37:5:37:27 | After in ... then ... [no-match] | no-match | +| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:8:37:10 | Bar | | +| case.rb:37:12:37:12 | a | case.rb:37:15:37:15 | b | | +| case.rb:37:15:37:15 | b | case.rb:37:19:37:19 | c | | | case.rb:37:19:37:19 | c | case.rb:37:22:37:22 | d | | -| case.rb:37:22:37:22 | d | case.rb:37:25:37:25 | e | match | -| case.rb:37:25:37:25 | e | case.rb:33:3:38:5 | case ... | match | +| case.rb:37:22:37:22 | d | case.rb:37:25:37:25 | e | | +| case.rb:37:25:37:25 | e | case.rb:37:8:37:26 | After [ ..., * ] [match] | match | +| case.rb:37:25:37:25 | e | case.rb:37:8:37:26 | After [ ..., * ] [no-match] | no-match | +| case.rb:41:1:45:3 | Entry | case.rb:41:21:41:25 | value | | +| case.rb:41:1:45:3 | Normal Exit | case.rb:41:1:45:3 | Exit | | | case.rb:41:1:45:3 | case_match_find | case.rb:47:1:53:3 | case_match_hash | | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:41:21:41:25 | value | | -| case.rb:41:1:45:3 | exit case_match_find (abnormal) | case.rb:41:1:45:3 | exit case_match_find | | -| case.rb:41:1:45:3 | exit case_match_find (normal) | case.rb:41:1:45:3 | exit case_match_find | | -| case.rb:41:21:41:25 | value | case.rb:42:8:42:12 | value | | -| case.rb:42:3:44:5 | case ... | case.rb:41:1:45:3 | exit case_match_find (normal) | | +| case.rb:41:21:41:25 | value | case.rb:42:3:44:5 | ... | | +| case.rb:42:3:44:5 | ... | case.rb:42:3:44:5 | case ... | | +| case.rb:42:3:44:5 | After ... | case.rb:41:1:45:3 | Normal Exit | | +| case.rb:42:3:44:5 | After case ... | case.rb:42:3:44:5 | After ... | | +| case.rb:42:3:44:5 | case ... | case.rb:42:8:42:12 | value | | | case.rb:42:8:42:12 | value | case.rb:43:5:43:22 | in ... then ... | | +| case.rb:43:5:43:22 | After in ... then ... [match] | case.rb:42:3:44:5 | After case ... | | +| case.rb:43:5:43:22 | After in ... then ... [no-match] | case.rb:42:3:44:5 | After case ... | | | case.rb:43:5:43:22 | in ... then ... | case.rb:43:8:43:21 | [ *,...,* ] | | -| case.rb:43:8:43:21 | [ *,...,* ] | case.rb:41:1:45:3 | exit case_match_find (abnormal) | exception | -| case.rb:43:8:43:21 | [ *,...,* ] | case.rb:43:10:43:10 | x | false, match, true | +| case.rb:43:8:43:21 | After [ *,...,* ] [match] | case.rb:43:5:43:22 | After in ... then ... [match] | match | +| case.rb:43:8:43:21 | After [ *,...,* ] [no-match] | case.rb:43:5:43:22 | After in ... then ... [no-match] | no-match | +| case.rb:43:8:43:21 | [ *,...,* ] | case.rb:43:10:43:10 | x | | | case.rb:43:10:43:10 | x | case.rb:43:13:43:13 | 1 | | -| case.rb:43:13:43:13 | 1 | case.rb:41:1:45:3 | exit case_match_find (abnormal) | exception | -| case.rb:43:13:43:13 | 1 | case.rb:43:16:43:16 | 2 | match | -| case.rb:43:16:43:16 | 2 | case.rb:41:1:45:3 | exit case_match_find (abnormal) | exception | -| case.rb:43:16:43:16 | 2 | case.rb:43:20:43:20 | y | match | -| case.rb:43:20:43:20 | y | case.rb:42:3:44:5 | case ... | | +| case.rb:43:13:43:13 | 1 | case.rb:43:16:43:16 | 2 | | +| case.rb:43:16:43:16 | 2 | case.rb:43:20:43:20 | y | | +| case.rb:43:20:43:20 | y | case.rb:43:8:43:21 | After [ *,...,* ] [match] | match | +| case.rb:43:20:43:20 | y | case.rb:43:8:43:21 | After [ *,...,* ] [no-match] | no-match | +| case.rb:47:1:53:3 | Entry | case.rb:47:21:47:25 | value | | +| case.rb:47:1:53:3 | Normal Exit | case.rb:47:1:53:3 | Exit | | | case.rb:47:1:53:3 | case_match_hash | case.rb:55:1:61:3 | case_match_variable | | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:47:21:47:25 | value | | -| case.rb:47:1:53:3 | exit case_match_hash (abnormal) | case.rb:47:1:53:3 | exit case_match_hash | | -| case.rb:47:1:53:3 | exit case_match_hash (normal) | case.rb:47:1:53:3 | exit case_match_hash | | -| case.rb:47:21:47:25 | value | case.rb:48:8:48:12 | value | | -| case.rb:48:3:52:5 | case ... | case.rb:47:1:53:3 | exit case_match_hash (normal) | | +| case.rb:47:21:47:25 | value | case.rb:48:3:52:5 | ... | | +| case.rb:48:3:52:5 | ... | case.rb:48:3:52:5 | case ... | | +| case.rb:48:3:52:5 | After ... | case.rb:47:1:53:3 | Normal Exit | | +| case.rb:48:3:52:5 | After case ... | case.rb:48:3:52:5 | After ... | | +| case.rb:48:3:52:5 | case ... | case.rb:48:8:48:12 | value | | | case.rb:48:8:48:12 | value | case.rb:49:5:49:35 | in ... then ... | | -| case.rb:49:5:49:35 | in ... then ... | case.rb:49:8:49:10 | Foo | | +| case.rb:49:5:49:35 | After in ... then ... [match] | case.rb:48:3:52:5 | After case ... | | +| case.rb:49:5:49:35 | After in ... then ... [no-match] | case.rb:50:5:50:25 | in ... then ... | | +| case.rb:49:5:49:35 | in ... then ... | case.rb:49:8:49:34 | { ..., ** } | | | case.rb:49:8:49:10 | Foo | case.rb:49:8:49:15 | Bar | | -| case.rb:49:8:49:15 | Bar | case.rb:49:8:49:34 | { ..., ** } | match | -| case.rb:49:8:49:15 | Bar | case.rb:50:5:50:25 | in ... then ... | no-match | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:20:49:20 | 1 | false, match, true | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:50:5:50:25 | in ... then ... | no-match | -| case.rb:49:20:49:20 | 1 | case.rb:49:23:49:23 | a | match | -| case.rb:49:20:49:20 | 1 | case.rb:50:5:50:25 | in ... then ... | no-match | -| case.rb:49:23:49:23 | a | case.rb:49:29:49:32 | rest | match | -| case.rb:49:29:49:32 | rest | case.rb:48:3:52:5 | case ... | | -| case.rb:50:5:50:25 | in ... then ... | case.rb:50:8:50:10 | Bar | | -| case.rb:50:8:50:10 | Bar | case.rb:50:8:50:24 | { ..., ** } | match | -| case.rb:50:8:50:10 | Bar | case.rb:51:5:51:17 | in ... then ... | no-match | -| case.rb:50:8:50:24 | { ..., ** } | case.rb:50:16:50:16 | 1 | false, match, true | -| case.rb:50:8:50:24 | { ..., ** } | case.rb:51:5:51:17 | in ... then ... | no-match | -| case.rb:50:16:50:16 | 1 | case.rb:48:3:52:5 | case ... | match | -| case.rb:50:16:50:16 | 1 | case.rb:51:5:51:17 | in ... then ... | no-match | -| case.rb:51:5:51:17 | in ... then ... | case.rb:51:8:51:10 | Bar | | -| case.rb:51:8:51:10 | Bar | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | exception | -| case.rb:51:8:51:10 | Bar | case.rb:51:8:51:16 | { ..., ** } | match | -| case.rb:51:8:51:16 | { ..., ** } | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | exception | -| case.rb:51:8:51:16 | { ..., ** } | case.rb:48:3:52:5 | case ... | false, match, true | +| case.rb:49:8:49:15 | After Bar | case.rb:49:18:49:18 | Before :x | | +| case.rb:49:8:49:15 | Bar | case.rb:49:8:49:15 | After Bar | | +| case.rb:49:8:49:15 | Before Bar | case.rb:49:8:49:10 | Foo | | +| case.rb:49:8:49:34 | After { ..., ** } [match] | case.rb:49:5:49:35 | After in ... then ... [match] | match | +| case.rb:49:8:49:34 | After { ..., ** } [no-match] | case.rb:49:5:49:35 | After in ... then ... [no-match] | no-match | +| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:8:49:15 | Before Bar | | +| case.rb:49:18:49:18 | :x | case.rb:49:18:49:18 | After :x | | +| case.rb:49:18:49:18 | After :x | case.rb:49:20:49:20 | 1 | | +| case.rb:49:18:49:18 | Before :x | case.rb:49:18:49:18 | x | | +| case.rb:49:18:49:18 | x | case.rb:49:18:49:18 | :x | | +| case.rb:49:20:49:20 | 1 | case.rb:49:23:49:23 | Before :a | | +| case.rb:49:23:49:23 | :a | case.rb:49:23:49:23 | After :a | | +| case.rb:49:23:49:23 | After :a | case.rb:49:23:49:23 | a | | +| case.rb:49:23:49:23 | Before :a | case.rb:49:23:49:23 | a | | +| case.rb:49:23:49:23 | a | case.rb:49:23:49:23 | :a | | +| case.rb:49:23:49:23 | a | case.rb:49:29:49:32 | rest | | +| case.rb:49:29:49:32 | rest | case.rb:49:8:49:34 | After { ..., ** } [match] | match | +| case.rb:49:29:49:32 | rest | case.rb:49:8:49:34 | After { ..., ** } [no-match] | no-match | +| case.rb:50:5:50:25 | After in ... then ... [match] | case.rb:48:3:52:5 | After case ... | | +| case.rb:50:5:50:25 | After in ... then ... [no-match] | case.rb:51:5:51:17 | in ... then ... | | +| case.rb:50:5:50:25 | in ... then ... | case.rb:50:8:50:24 | { ..., ** } | | +| case.rb:50:8:50:10 | Bar | case.rb:50:13:50:13 | Before :a | | +| case.rb:50:8:50:24 | After { ..., ** } [match] | case.rb:50:5:50:25 | After in ... then ... [match] | match | +| case.rb:50:8:50:24 | After { ..., ** } [no-match] | case.rb:50:5:50:25 | After in ... then ... [no-match] | no-match | +| case.rb:50:8:50:24 | { ..., ** } | case.rb:50:8:50:10 | Bar | | +| case.rb:50:13:50:13 | :a | case.rb:50:13:50:13 | After :a | | +| case.rb:50:13:50:13 | After :a | case.rb:50:16:50:16 | 1 | | +| case.rb:50:13:50:13 | Before :a | case.rb:50:13:50:13 | a | | +| case.rb:50:13:50:13 | a | case.rb:50:13:50:13 | :a | | +| case.rb:50:16:50:16 | 1 | case.rb:50:8:50:24 | After { ..., ** } [match] | match | +| case.rb:50:16:50:16 | 1 | case.rb:50:8:50:24 | After { ..., ** } [no-match] | no-match | +| case.rb:51:5:51:17 | After in ... then ... [match] | case.rb:48:3:52:5 | After case ... | | +| case.rb:51:5:51:17 | After in ... then ... [no-match] | case.rb:48:3:52:5 | After case ... | | +| case.rb:51:5:51:17 | in ... then ... | case.rb:51:8:51:16 | { ..., ** } | | +| case.rb:51:8:51:10 | Bar | case.rb:51:8:51:16 | After { ..., ** } [match] | match | +| case.rb:51:8:51:10 | Bar | case.rb:51:8:51:16 | After { ..., ** } [no-match] | no-match | +| case.rb:51:8:51:16 | After { ..., ** } [match] | case.rb:51:5:51:17 | After in ... then ... [match] | match | +| case.rb:51:8:51:16 | After { ..., ** } [no-match] | case.rb:51:5:51:17 | After in ... then ... [no-match] | no-match | +| case.rb:51:8:51:16 | { ..., ** } | case.rb:51:8:51:10 | Bar | | +| case.rb:55:1:61:3 | Entry | case.rb:55:25:55:29 | value | | +| case.rb:55:1:61:3 | Normal Exit | case.rb:55:1:61:3 | Exit | | | case.rb:55:1:61:3 | case_match_variable | case.rb:63:1:67:3 | case_match_underscore | | -| case.rb:55:1:61:3 | enter case_match_variable | case.rb:55:25:55:29 | value | | -| case.rb:55:1:61:3 | exit case_match_variable (normal) | case.rb:55:1:61:3 | exit case_match_variable | | -| case.rb:55:25:55:29 | value | case.rb:56:8:56:12 | value | | -| case.rb:56:3:60:5 | case ... | case.rb:55:1:61:3 | exit case_match_variable (normal) | | +| case.rb:55:25:55:29 | value | case.rb:56:3:60:5 | ... | | +| case.rb:56:3:60:5 | ... | case.rb:56:3:60:5 | case ... | | +| case.rb:56:3:60:5 | After ... | case.rb:55:1:61:3 | Normal Exit | | +| case.rb:56:3:60:5 | After case ... | case.rb:56:3:60:5 | After ... | | +| case.rb:56:3:60:5 | case ... | case.rb:56:8:56:12 | value | | | case.rb:56:8:56:12 | value | case.rb:57:5:57:8 | in ... then ... | | +| case.rb:57:5:57:8 | After in ... then ... [match] | case.rb:56:3:60:5 | After case ... | | +| case.rb:57:5:57:8 | After in ... then ... [no-match] | case.rb:58:5:58:10 | in ... then ... | | | case.rb:57:5:57:8 | in ... then ... | case.rb:57:8:57:8 | 5 | | -| case.rb:57:8:57:8 | 5 | case.rb:56:3:60:5 | case ... | match | -| case.rb:57:8:57:8 | 5 | case.rb:58:5:58:10 | in ... then ... | no-match | +| case.rb:57:8:57:8 | 5 | case.rb:57:8:57:8 | After 5 [match] | match | +| case.rb:57:8:57:8 | 5 | case.rb:57:8:57:8 | After 5 [no-match] | no-match | +| case.rb:57:8:57:8 | After 5 [match] | case.rb:57:5:57:8 | After in ... then ... [match] | match | +| case.rb:57:8:57:8 | After 5 [no-match] | case.rb:57:5:57:8 | After in ... then ... [no-match] | no-match | +| case.rb:58:5:58:10 | After in ... then ... [match] | case.rb:56:3:60:5 | After case ... | | +| case.rb:58:5:58:10 | After in ... then ... [no-match] | case.rb:59:5:59:20 | in ... then ... | | | case.rb:58:5:58:10 | in ... then ... | case.rb:58:8:58:10 | var | | -| case.rb:58:8:58:10 | var | case.rb:56:3:60:5 | case ... | match | +| case.rb:58:8:58:10 | After var [match] | case.rb:58:5:58:10 | After in ... then ... [match] | match | +| case.rb:58:8:58:10 | After var [no-match] | case.rb:58:5:58:10 | After in ... then ... [no-match] | no-match | +| case.rb:58:8:58:10 | var | case.rb:58:8:58:10 | After var [match] | match | +| case.rb:58:8:58:10 | var | case.rb:58:8:58:10 | After var [no-match] | no-match | +| case.rb:59:5:59:20 | After in ... then ... [match] | case.rb:56:3:60:5 | After case ... | | +| case.rb:59:5:59:20 | After in ... then ... [no-match] | case.rb:56:3:60:5 | After case ... | | +| case.rb:59:5:59:20 | in ... then ... | case.rb:59:8:59:20 | Before "unreachable" | | +| case.rb:59:8:59:20 | "unreachable" | case.rb:59:8:59:20 | After "unreachable" [match] | match | +| case.rb:59:8:59:20 | "unreachable" | case.rb:59:8:59:20 | After "unreachable" [no-match] | no-match | +| case.rb:59:8:59:20 | After "unreachable" [match] | case.rb:59:5:59:20 | After in ... then ... [match] | match | +| case.rb:59:8:59:20 | After "unreachable" [no-match] | case.rb:59:5:59:20 | After in ... then ... [no-match] | no-match | +| case.rb:59:8:59:20 | Before "unreachable" | case.rb:59:9:59:19 | unreachable | | +| case.rb:59:9:59:19 | unreachable | case.rb:59:8:59:20 | "unreachable" | | +| case.rb:63:1:67:3 | Entry | case.rb:63:27:63:31 | value | | +| case.rb:63:1:67:3 | Normal Exit | case.rb:63:1:67:3 | Exit | | | case.rb:63:1:67:3 | case_match_underscore | case.rb:69:1:93:3 | case_match_various | | -| case.rb:63:1:67:3 | enter case_match_underscore | case.rb:63:27:63:31 | value | | -| case.rb:63:1:67:3 | exit case_match_underscore (normal) | case.rb:63:1:67:3 | exit case_match_underscore | | -| case.rb:63:27:63:31 | value | case.rb:64:8:64:12 | value | | -| case.rb:64:3:66:5 | case ... | case.rb:63:1:67:3 | exit case_match_underscore (normal) | | +| case.rb:63:27:63:31 | value | case.rb:64:3:66:5 | ... | | +| case.rb:64:3:66:5 | ... | case.rb:64:3:66:5 | case ... | | +| case.rb:64:3:66:5 | After ... | case.rb:63:1:67:3 | Normal Exit | | +| case.rb:64:3:66:5 | After case ... | case.rb:64:3:66:5 | After ... | | +| case.rb:64:3:66:5 | case ... | case.rb:64:8:64:12 | value | | | case.rb:64:8:64:12 | value | case.rb:65:5:65:28 | in ... then ... | | +| case.rb:65:5:65:28 | After in ... then ... [match] | case.rb:64:3:66:5 | After case ... | | +| case.rb:65:5:65:28 | After in ... then ... [no-match] | case.rb:64:3:66:5 | After case ... | | | case.rb:65:5:65:28 | in ... then ... | case.rb:65:8:65:28 | ... \| ... | | -| case.rb:65:8:65:8 | 5 | case.rb:64:3:66:5 | case ... | match | -| case.rb:65:8:65:8 | 5 | case.rb:65:12:65:12 | _ | no-match | +| case.rb:65:8:65:8 | 5 | case.rb:65:12:65:12 | _ | | | case.rb:65:8:65:28 | ... \| ... | case.rb:65:8:65:8 | 5 | | -| case.rb:65:12:65:12 | _ | case.rb:64:3:66:5 | case ... | match | +| case.rb:65:8:65:28 | After ... \| ... [match] | case.rb:65:5:65:28 | After in ... then ... [match] | match | +| case.rb:65:8:65:28 | After ... \| ... [no-match] | case.rb:65:5:65:28 | After in ... then ... [no-match] | no-match | +| case.rb:65:12:65:12 | _ | case.rb:65:16:65:28 | Before "unreachable" | | +| case.rb:65:16:65:28 | "unreachable" | case.rb:65:16:65:28 | After "unreachable" | | +| case.rb:65:16:65:28 | After "unreachable" | case.rb:65:8:65:28 | After ... \| ... [match] | match | +| case.rb:65:16:65:28 | After "unreachable" | case.rb:65:8:65:28 | After ... \| ... [no-match] | no-match | +| case.rb:65:16:65:28 | Before "unreachable" | case.rb:65:17:65:27 | unreachable | | +| case.rb:65:17:65:27 | unreachable | case.rb:65:16:65:28 | "unreachable" | | +| case.rb:69:1:93:3 | Entry | case.rb:69:24:69:28 | value | | +| case.rb:69:1:93:3 | Normal Exit | case.rb:69:1:93:3 | Exit | | | case.rb:69:1:93:3 | case_match_various | case.rb:95:1:99:3 | case_match_guard_no_else | | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:69:24:69:28 | value | | -| case.rb:69:1:93:3 | exit case_match_various (abnormal) | case.rb:69:1:93:3 | exit case_match_various | | -| case.rb:69:1:93:3 | exit case_match_various (normal) | case.rb:69:1:93:3 | exit case_match_various | | -| case.rb:69:24:69:28 | value | case.rb:70:3:70:5 | foo | | +| case.rb:69:24:69:28 | value | case.rb:70:3:92:5 | ... | | | case.rb:70:3:70:5 | foo | case.rb:70:9:70:10 | 42 | | -| case.rb:70:3:70:10 | ... = ... | case.rb:72:8:72:12 | value | | +| case.rb:70:3:70:10 | ... = ... | case.rb:70:3:70:10 | After ... = ... | | +| case.rb:70:3:70:10 | After ... = ... | case.rb:72:3:92:5 | case ... | | +| case.rb:70:3:70:10 | Before ... = ... | case.rb:70:3:70:5 | foo | | +| case.rb:70:3:92:5 | ... | case.rb:70:3:70:10 | Before ... = ... | | +| case.rb:70:3:92:5 | After ... | case.rb:69:1:93:3 | Normal Exit | | | case.rb:70:9:70:10 | 42 | case.rb:70:3:70:10 | ... = ... | | -| case.rb:72:3:92:5 | case ... | case.rb:69:1:93:3 | exit case_match_various (normal) | | +| case.rb:72:3:92:5 | After case ... | case.rb:70:3:92:5 | After ... | | +| case.rb:72:3:92:5 | case ... | case.rb:72:8:72:12 | value | | | case.rb:72:8:72:12 | value | case.rb:73:5:73:8 | in ... then ... | | +| case.rb:73:5:73:8 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:73:5:73:8 | After in ... then ... [no-match] | case.rb:74:5:74:11 | in ... then ... | | | case.rb:73:5:73:8 | in ... then ... | case.rb:73:8:73:8 | 5 | | -| case.rb:73:8:73:8 | 5 | case.rb:72:3:92:5 | case ... | match | -| case.rb:73:8:73:8 | 5 | case.rb:74:5:74:11 | in ... then ... | no-match | +| case.rb:73:8:73:8 | 5 | case.rb:73:8:73:8 | After 5 [match] | match | +| case.rb:73:8:73:8 | 5 | case.rb:73:8:73:8 | After 5 [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [match] | case.rb:73:5:73:8 | After in ... then ... [match] | match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:73:5:73:8 | After in ... then ... [no-match] | no-match | +| case.rb:74:5:74:11 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:74:5:74:11 | After in ... then ... [no-match] | case.rb:75:5:75:15 | in ... then ... | | | case.rb:74:5:74:11 | in ... then ... | case.rb:74:8:74:11 | ^... | | +| case.rb:74:8:74:11 | After ^... [match] | case.rb:74:5:74:11 | After in ... then ... [match] | match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:74:5:74:11 | After in ... then ... [no-match] | no-match | | case.rb:74:8:74:11 | ^... | case.rb:74:9:74:11 | foo | | -| case.rb:74:9:74:11 | foo | case.rb:72:3:92:5 | case ... | match | -| case.rb:74:9:74:11 | foo | case.rb:75:5:75:15 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:75:9:75:14 | string | | -| case.rb:75:8:75:15 | "string" | case.rb:72:3:92:5 | case ... | match | -| case.rb:75:8:75:15 | "string" | case.rb:76:5:76:18 | in ... then ... | no-match | +| case.rb:74:9:74:11 | foo | case.rb:74:8:74:11 | After ^... [match] | match | +| case.rb:74:9:74:11 | foo | case.rb:74:8:74:11 | After ^... [no-match] | no-match | +| case.rb:75:5:75:15 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:75:5:75:15 | After in ... then ... [no-match] | case.rb:76:5:76:18 | in ... then ... | | +| case.rb:75:5:75:15 | in ... then ... | case.rb:75:8:75:15 | Before "string" | | +| case.rb:75:8:75:15 | "string" | case.rb:75:8:75:15 | After "string" [match] | match | +| case.rb:75:8:75:15 | "string" | case.rb:75:8:75:15 | After "string" [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [match] | case.rb:75:5:75:15 | After in ... then ... [match] | match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:75:5:75:15 | After in ... then ... [no-match] | no-match | +| case.rb:75:8:75:15 | Before "string" | case.rb:75:9:75:14 | string | | | case.rb:75:9:75:14 | string | case.rb:75:8:75:15 | "string" | | -| case.rb:76:5:76:18 | in ... then ... | case.rb:76:8:76:18 | Array | | -| case.rb:76:8:76:18 | Array | case.rb:76:11:76:13 | foo | | -| case.rb:76:8:76:18 | call to [] | case.rb:72:3:92:5 | case ... | match | -| case.rb:76:8:76:18 | call to [] | case.rb:77:5:77:18 | in ... then ... | no-match | -| case.rb:76:11:76:13 | "foo" | case.rb:76:15:76:17 | bar | | +| case.rb:76:5:76:18 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:76:5:76:18 | After in ... then ... [no-match] | case.rb:77:5:77:18 | in ... then ... | | +| case.rb:76:5:76:18 | in ... then ... | case.rb:76:8:76:18 | Before call to [] | | +| case.rb:76:8:76:18 | After call to [] [match] | case.rb:76:5:76:18 | After in ... then ... [match] | match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:76:5:76:18 | After in ... then ... [no-match] | no-match | +| case.rb:76:8:76:18 | Array | case.rb:76:11:76:13 | Before "foo" | | +| case.rb:76:8:76:18 | Before call to [] | case.rb:76:8:76:18 | Array | | +| case.rb:76:8:76:18 | call to [] | case.rb:76:8:76:18 | After call to [] [match] | match | +| case.rb:76:8:76:18 | call to [] | case.rb:76:8:76:18 | After call to [] [no-match] | no-match | +| case.rb:76:11:76:13 | "foo" | case.rb:76:11:76:13 | After "foo" | | +| case.rb:76:11:76:13 | After "foo" | case.rb:76:15:76:17 | Before "bar" | | +| case.rb:76:11:76:13 | Before "foo" | case.rb:76:11:76:13 | foo | | | case.rb:76:11:76:13 | foo | case.rb:76:11:76:13 | "foo" | | -| case.rb:76:15:76:17 | "bar" | case.rb:76:8:76:18 | call to [] | | +| case.rb:76:15:76:17 | "bar" | case.rb:76:15:76:17 | After "bar" | | +| case.rb:76:15:76:17 | After "bar" | case.rb:76:8:76:18 | call to [] | | +| case.rb:76:15:76:17 | Before "bar" | case.rb:76:15:76:17 | bar | | | case.rb:76:15:76:17 | bar | case.rb:76:15:76:17 | "bar" | | -| case.rb:77:5:77:18 | in ... then ... | case.rb:77:8:77:18 | Array | | -| case.rb:77:8:77:18 | Array | case.rb:77:11:77:13 | foo | | -| case.rb:77:8:77:18 | call to [] | case.rb:72:3:92:5 | case ... | match | -| case.rb:77:8:77:18 | call to [] | case.rb:78:5:78:19 | in ... then ... | no-match | -| case.rb:77:11:77:13 | :"foo" | case.rb:77:15:77:17 | bar | | +| case.rb:77:5:77:18 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:77:5:77:18 | After in ... then ... [no-match] | case.rb:78:5:78:19 | in ... then ... | | +| case.rb:77:5:77:18 | in ... then ... | case.rb:77:8:77:18 | Before call to [] | | +| case.rb:77:8:77:18 | After call to [] [match] | case.rb:77:5:77:18 | After in ... then ... [match] | match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:77:5:77:18 | After in ... then ... [no-match] | no-match | +| case.rb:77:8:77:18 | Array | case.rb:77:11:77:13 | Before :"foo" | | +| case.rb:77:8:77:18 | Before call to [] | case.rb:77:8:77:18 | Array | | +| case.rb:77:8:77:18 | call to [] | case.rb:77:8:77:18 | After call to [] [match] | match | +| case.rb:77:8:77:18 | call to [] | case.rb:77:8:77:18 | After call to [] [no-match] | no-match | +| case.rb:77:11:77:13 | :"foo" | case.rb:77:11:77:13 | After :"foo" | | +| case.rb:77:11:77:13 | After :"foo" | case.rb:77:15:77:17 | Before :"bar" | | +| case.rb:77:11:77:13 | Before :"foo" | case.rb:77:11:77:13 | foo | | | case.rb:77:11:77:13 | foo | case.rb:77:11:77:13 | :"foo" | | -| case.rb:77:15:77:17 | :"bar" | case.rb:77:8:77:18 | call to [] | | +| case.rb:77:15:77:17 | :"bar" | case.rb:77:15:77:17 | After :"bar" | | +| case.rb:77:15:77:17 | After :"bar" | case.rb:77:8:77:18 | call to [] | | +| case.rb:77:15:77:17 | Before :"bar" | case.rb:77:15:77:17 | bar | | | case.rb:77:15:77:17 | bar | case.rb:77:15:77:17 | :"bar" | | -| case.rb:78:5:78:19 | in ... then ... | case.rb:78:9:78:18 | .*abc[0-9] | | -| case.rb:78:8:78:19 | /.*abc[0-9]/ | case.rb:72:3:92:5 | case ... | match | -| case.rb:78:8:78:19 | /.*abc[0-9]/ | case.rb:79:5:79:14 | in ... then ... | no-match | +| case.rb:78:5:78:19 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:78:5:78:19 | After in ... then ... [no-match] | case.rb:79:5:79:14 | in ... then ... | | +| case.rb:78:5:78:19 | in ... then ... | case.rb:78:8:78:19 | Before /.*abc[0-9]/ | | +| case.rb:78:8:78:19 | /.*abc[0-9]/ | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | match | +| case.rb:78:8:78:19 | /.*abc[0-9]/ | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | case.rb:78:5:78:19 | After in ... then ... [match] | match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:78:5:78:19 | After in ... then ... [no-match] | no-match | +| case.rb:78:8:78:19 | Before /.*abc[0-9]/ | case.rb:78:9:78:18 | .*abc[0-9] | | | case.rb:78:9:78:18 | .*abc[0-9] | case.rb:78:8:78:19 | /.*abc[0-9]/ | | -| case.rb:79:5:79:14 | in ... then ... | case.rb:79:8:79:8 | 5 | | +| case.rb:79:5:79:14 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:79:5:79:14 | After in ... then ... [no-match] | case.rb:80:5:80:12 | in ... then ... | | +| case.rb:79:5:79:14 | in ... then ... | case.rb:79:8:79:14 | Before _ .. _ | | | case.rb:79:8:79:8 | 5 | case.rb:79:13:79:14 | 10 | | -| case.rb:79:8:79:14 | _ .. _ | case.rb:72:3:92:5 | case ... | match | -| case.rb:79:8:79:14 | _ .. _ | case.rb:80:5:80:12 | in ... then ... | no-match | +| case.rb:79:8:79:14 | After _ .. _ [match] | case.rb:79:5:79:14 | After in ... then ... [match] | match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:79:5:79:14 | After in ... then ... [no-match] | no-match | +| case.rb:79:8:79:14 | Before _ .. _ | case.rb:79:8:79:8 | 5 | | +| case.rb:79:8:79:14 | _ .. _ | case.rb:79:8:79:14 | After _ .. _ [match] | match | +| case.rb:79:8:79:14 | _ .. _ | case.rb:79:8:79:14 | After _ .. _ [no-match] | no-match | | case.rb:79:13:79:14 | 10 | case.rb:79:8:79:14 | _ .. _ | | -| case.rb:80:5:80:12 | in ... then ... | case.rb:80:11:80:12 | 10 | | -| case.rb:80:8:80:12 | _ .. _ | case.rb:72:3:92:5 | case ... | match | -| case.rb:80:8:80:12 | _ .. _ | case.rb:81:5:81:11 | in ... then ... | no-match | +| case.rb:80:5:80:12 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:80:5:80:12 | After in ... then ... [no-match] | case.rb:81:5:81:11 | in ... then ... | | +| case.rb:80:5:80:12 | in ... then ... | case.rb:80:8:80:12 | Before _ .. _ | | +| case.rb:80:8:80:12 | After _ .. _ [match] | case.rb:80:5:80:12 | After in ... then ... [match] | match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:80:5:80:12 | After in ... then ... [no-match] | no-match | +| case.rb:80:8:80:12 | Before _ .. _ | case.rb:80:11:80:12 | 10 | | +| case.rb:80:8:80:12 | _ .. _ | case.rb:80:8:80:12 | After _ .. _ [match] | match | +| case.rb:80:8:80:12 | _ .. _ | case.rb:80:8:80:12 | After _ .. _ [no-match] | no-match | | case.rb:80:11:80:12 | 10 | case.rb:80:8:80:12 | _ .. _ | | -| case.rb:81:5:81:11 | in ... then ... | case.rb:81:8:81:8 | 5 | | +| case.rb:81:5:81:11 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:81:5:81:11 | After in ... then ... [no-match] | case.rb:82:5:82:20 | in ... then ... | | +| case.rb:81:5:81:11 | in ... then ... | case.rb:81:8:81:11 | Before _ .. _ | | | case.rb:81:8:81:8 | 5 | case.rb:81:8:81:11 | _ .. _ | | -| case.rb:81:8:81:11 | _ .. _ | case.rb:72:3:92:5 | case ... | match | -| case.rb:81:8:81:11 | _ .. _ | case.rb:82:5:82:20 | in ... then ... | no-match | +| case.rb:81:8:81:11 | After _ .. _ [match] | case.rb:81:5:81:11 | After in ... then ... [match] | match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:81:5:81:11 | After in ... then ... [no-match] | no-match | +| case.rb:81:8:81:11 | Before _ .. _ | case.rb:81:8:81:8 | 5 | | +| case.rb:81:8:81:11 | _ .. _ | case.rb:81:8:81:11 | After _ .. _ [match] | match | +| case.rb:81:8:81:11 | _ .. _ | case.rb:81:8:81:11 | After _ .. _ [no-match] | no-match | +| case.rb:82:5:82:20 | After in ... then ... [match] | case.rb:82:15:82:20 | then ... | | +| case.rb:82:5:82:20 | After in ... then ... [no-match] | case.rb:83:5:83:26 | in ... then ... | | | case.rb:82:5:82:20 | in ... then ... | case.rb:82:8:82:13 | ... => ... | | -| case.rb:82:8:82:8 | 5 | case.rb:82:13:82:13 | x | match | -| case.rb:82:8:82:8 | 5 | case.rb:83:5:83:26 | in ... then ... | no-match | +| case.rb:82:8:82:8 | 5 | case.rb:82:13:82:13 | x | | | case.rb:82:8:82:13 | ... => ... | case.rb:82:8:82:8 | 5 | | -| case.rb:82:13:82:13 | x | case.rb:82:20:82:20 | 1 | match | -| case.rb:82:15:82:20 | then ... | case.rb:72:3:92:5 | case ... | | -| case.rb:82:20:82:20 | 1 | case.rb:82:15:82:20 | then ... | | +| case.rb:82:8:82:13 | After ... => ... [match] | case.rb:82:5:82:20 | After in ... then ... [match] | match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:82:5:82:20 | After in ... then ... [no-match] | no-match | +| case.rb:82:13:82:13 | x | case.rb:82:8:82:13 | After ... => ... [match] | match | +| case.rb:82:13:82:13 | x | case.rb:82:8:82:13 | After ... => ... [no-match] | no-match | +| case.rb:82:15:82:20 | After then ... | case.rb:72:3:92:5 | After case ... | | +| case.rb:82:15:82:20 | then ... | case.rb:82:20:82:20 | 1 | | +| case.rb:82:20:82:20 | 1 | case.rb:82:15:82:20 | After then ... | | +| case.rb:83:5:83:26 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:83:5:83:26 | After in ... then ... [no-match] | case.rb:84:5:84:17 | in ... then ... | | | case.rb:83:5:83:26 | in ... then ... | case.rb:83:8:83:26 | ... \| ... | | -| case.rb:83:8:83:8 | 5 | case.rb:72:3:92:5 | case ... | match | -| case.rb:83:8:83:8 | 5 | case.rb:83:12:83:15 | ^... | no-match | +| case.rb:83:8:83:8 | 5 | case.rb:83:12:83:15 | ^... | | | case.rb:83:8:83:26 | ... \| ... | case.rb:83:8:83:8 | 5 | | +| case.rb:83:8:83:26 | After ... \| ... [match] | case.rb:83:5:83:26 | After in ... then ... [match] | match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:83:5:83:26 | After in ... then ... [no-match] | no-match | +| case.rb:83:12:83:15 | After ^... | case.rb:83:19:83:26 | Before "string" | | | case.rb:83:12:83:15 | ^... | case.rb:83:13:83:15 | foo | | -| case.rb:83:13:83:15 | foo | case.rb:72:3:92:5 | case ... | match | -| case.rb:83:13:83:15 | foo | case.rb:83:20:83:25 | string | no-match | -| case.rb:83:19:83:26 | "string" | case.rb:72:3:92:5 | case ... | match | -| case.rb:83:19:83:26 | "string" | case.rb:84:5:84:17 | in ... then ... | no-match | +| case.rb:83:13:83:15 | foo | case.rb:83:12:83:15 | After ^... | | +| case.rb:83:19:83:26 | "string" | case.rb:83:19:83:26 | After "string" | | +| case.rb:83:19:83:26 | After "string" | case.rb:83:8:83:26 | After ... \| ... [match] | match | +| case.rb:83:19:83:26 | After "string" | case.rb:83:8:83:26 | After ... \| ... [no-match] | no-match | +| case.rb:83:19:83:26 | Before "string" | case.rb:83:20:83:25 | string | | | case.rb:83:20:83:25 | string | case.rb:83:19:83:26 | "string" | | -| case.rb:84:5:84:17 | in ... then ... | case.rb:84:8:84:12 | Foo | | +| case.rb:84:5:84:17 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:84:5:84:17 | After in ... then ... [no-match] | case.rb:85:5:85:23 | in ... then ... | | +| case.rb:84:5:84:17 | in ... then ... | case.rb:84:8:84:17 | Before Bar | | | case.rb:84:8:84:12 | Foo | case.rb:84:8:84:17 | Bar | | -| case.rb:84:8:84:17 | Bar | case.rb:72:3:92:5 | case ... | match | -| case.rb:84:8:84:17 | Bar | case.rb:85:5:85:23 | in ... then ... | no-match | +| case.rb:84:8:84:17 | After Bar [match] | case.rb:84:5:84:17 | After in ... then ... [match] | match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:84:5:84:17 | After in ... then ... [no-match] | no-match | +| case.rb:84:8:84:17 | Bar | case.rb:84:8:84:17 | After Bar [match] | match | +| case.rb:84:8:84:17 | Bar | case.rb:84:8:84:17 | After Bar [no-match] | no-match | +| case.rb:84:8:84:17 | Before Bar | case.rb:84:8:84:12 | Foo | | +| case.rb:85:5:85:23 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:85:5:85:23 | After in ... then ... [no-match] | case.rb:86:5:86:11 | in ... then ... | | | case.rb:85:5:85:23 | in ... then ... | case.rb:85:8:85:23 | -> { ... } | | -| case.rb:85:8:85:23 | -> { ... } | case.rb:72:3:92:5 | case ... | match | -| case.rb:85:8:85:23 | -> { ... } | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:85:8:85:23 | enter -> { ... } | case.rb:85:11:85:11 | x | | -| case.rb:85:8:85:23 | exit -> { ... } (normal) | case.rb:85:8:85:23 | exit -> { ... } | | -| case.rb:85:11:85:11 | x | case.rb:85:15:85:15 | x | | +| case.rb:85:8:85:23 | -> { ... } | case.rb:85:8:85:23 | After -> { ... } [match] | match | +| case.rb:85:8:85:23 | -> { ... } | case.rb:85:8:85:23 | After -> { ... } [no-match] | no-match | +| case.rb:85:8:85:23 | After -> { ... } [match] | case.rb:85:5:85:23 | After in ... then ... [match] | match | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:85:5:85:23 | After in ... then ... [no-match] | no-match | +| case.rb:85:8:85:23 | Entry | case.rb:85:11:85:11 | x | | +| case.rb:85:8:85:23 | Normal Exit | case.rb:85:8:85:23 | Exit | | +| case.rb:85:11:85:11 | x | case.rb:85:15:85:21 | ... | | | case.rb:85:15:85:15 | x | case.rb:85:20:85:21 | 10 | | -| case.rb:85:15:85:21 | ... == ... | case.rb:85:8:85:23 | exit -> { ... } (normal) | | +| case.rb:85:15:85:21 | ... | case.rb:85:15:85:21 | Before ... == ... | | +| case.rb:85:15:85:21 | ... == ... | case.rb:85:15:85:21 | After ... == ... | | +| case.rb:85:15:85:21 | After ... | case.rb:85:8:85:23 | Normal Exit | | +| case.rb:85:15:85:21 | After ... == ... | case.rb:85:15:85:21 | After ... | | +| case.rb:85:15:85:21 | Before ... == ... | case.rb:85:15:85:15 | x | | | case.rb:85:20:85:21 | 10 | case.rb:85:15:85:21 | ... == ... | | -| case.rb:86:5:86:11 | in ... then ... | case.rb:86:8:86:11 | foo | | -| case.rb:86:8:86:11 | :foo | case.rb:72:3:92:5 | case ... | match | -| case.rb:86:8:86:11 | :foo | case.rb:87:5:87:17 | in ... then ... | no-match | +| case.rb:86:5:86:11 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:86:5:86:11 | After in ... then ... [no-match] | case.rb:87:5:87:17 | in ... then ... | | +| case.rb:86:5:86:11 | in ... then ... | case.rb:86:8:86:11 | Before :foo | | +| case.rb:86:8:86:11 | :foo | case.rb:86:8:86:11 | After :foo [match] | match | +| case.rb:86:8:86:11 | :foo | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:86:8:86:11 | After :foo [match] | case.rb:86:5:86:11 | After in ... then ... [match] | match | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:86:5:86:11 | After in ... then ... [no-match] | no-match | +| case.rb:86:8:86:11 | Before :foo | case.rb:86:8:86:11 | foo | | | case.rb:86:8:86:11 | foo | case.rb:86:8:86:11 | :foo | | -| case.rb:87:5:87:17 | in ... then ... | case.rb:87:10:87:16 | foo bar | | -| case.rb:87:8:87:17 | :"foo bar" | case.rb:72:3:92:5 | case ... | match | -| case.rb:87:8:87:17 | :"foo bar" | case.rb:88:5:88:15 | in ... then ... | no-match | +| case.rb:87:5:87:17 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:87:5:87:17 | After in ... then ... [no-match] | case.rb:88:5:88:15 | in ... then ... | | +| case.rb:87:5:87:17 | in ... then ... | case.rb:87:8:87:17 | Before :"foo bar" | | +| case.rb:87:8:87:17 | :"foo bar" | case.rb:87:8:87:17 | After :"foo bar" [match] | match | +| case.rb:87:8:87:17 | :"foo bar" | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:87:8:87:17 | After :"foo bar" [match] | case.rb:87:5:87:17 | After in ... then ... [match] | match | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:87:5:87:17 | After in ... then ... [no-match] | no-match | +| case.rb:87:8:87:17 | Before :"foo bar" | case.rb:87:10:87:16 | foo bar | | | case.rb:87:10:87:16 | foo bar | case.rb:87:8:87:17 | :"foo bar" | | +| case.rb:88:5:88:15 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:88:5:88:15 | After in ... then ... [no-match] | case.rb:89:5:89:69 | in ... then ... | | | case.rb:88:5:88:15 | in ... then ... | case.rb:88:8:88:15 | ... \| ... | | -| case.rb:88:8:88:9 | - ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:88:8:88:9 | - ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:88:8:88:15 | ... \| ... | case.rb:88:9:88:9 | 5 | | +| case.rb:88:8:88:9 | - ... | case.rb:88:8:88:9 | After - ... | | +| case.rb:88:8:88:9 | After - ... | case.rb:88:13:88:15 | Before + ... | | +| case.rb:88:8:88:9 | Before - ... | case.rb:88:9:88:9 | 5 | | +| case.rb:88:8:88:15 | ... \| ... | case.rb:88:8:88:9 | Before - ... | | +| case.rb:88:8:88:15 | After ... \| ... [match] | case.rb:88:5:88:15 | After in ... then ... [match] | match | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:88:5:88:15 | After in ... then ... [no-match] | no-match | | case.rb:88:9:88:9 | 5 | case.rb:88:8:88:9 | - ... | | -| case.rb:88:13:88:15 | + ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:88:13:88:15 | + ... | case.rb:89:5:89:69 | in ... then ... | no-match | +| case.rb:88:13:88:15 | + ... | case.rb:88:13:88:15 | After + ... | | +| case.rb:88:13:88:15 | After + ... | case.rb:88:8:88:15 | After ... \| ... [match] | match | +| case.rb:88:13:88:15 | After + ... | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:88:13:88:15 | Before + ... | case.rb:88:14:88:15 | 10 | | | case.rb:88:14:88:15 | 10 | case.rb:88:13:88:15 | + ... | | +| case.rb:89:5:89:69 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:89:5:89:69 | After in ... then ... [no-match] | case.rb:90:5:90:13 | in ... then ... | | | case.rb:89:5:89:69 | in ... then ... | case.rb:89:8:89:69 | ... \| ... | | -| case.rb:89:8:89:10 | nil | case.rb:72:3:92:5 | case ... | match | -| case.rb:89:8:89:10 | nil | case.rb:89:14:89:17 | self | no-match | +| case.rb:89:8:89:10 | nil | case.rb:89:14:89:17 | self | | | case.rb:89:8:89:69 | ... \| ... | case.rb:89:8:89:10 | nil | | -| case.rb:89:14:89:17 | self | case.rb:72:3:92:5 | case ... | match | -| case.rb:89:14:89:17 | self | case.rb:89:21:89:24 | true | no-match | -| case.rb:89:21:89:24 | true | case.rb:72:3:92:5 | case ... | match | -| case.rb:89:21:89:24 | true | case.rb:89:28:89:32 | false | no-match | -| case.rb:89:28:89:32 | false | case.rb:72:3:92:5 | case ... | match | -| case.rb:89:28:89:32 | false | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:89:36:89:43 | __LINE__ | case.rb:72:3:92:5 | case ... | match | -| case.rb:89:36:89:43 | __LINE__ | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:89:47:89:54 | __FILE__ | case.rb:72:3:92:5 | case ... | match | -| case.rb:89:47:89:54 | __FILE__ | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:72:3:92:5 | case ... | match | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:90:5:90:13 | in ... then ... | no-match | +| case.rb:89:8:89:69 | After ... \| ... [match] | case.rb:89:5:89:69 | After in ... then ... [match] | match | +| case.rb:89:8:89:69 | After ... \| ... [no-match] | case.rb:89:5:89:69 | After in ... then ... [no-match] | no-match | +| case.rb:89:14:89:17 | self | case.rb:89:21:89:24 | true | | +| case.rb:89:21:89:24 | true | case.rb:89:28:89:32 | false | | +| case.rb:89:28:89:32 | false | case.rb:89:36:89:43 | __LINE__ | | +| case.rb:89:36:89:43 | __LINE__ | case.rb:89:47:89:54 | __FILE__ | | +| case.rb:89:47:89:54 | __FILE__ | case.rb:89:58:89:69 | __ENCODING__ | | +| case.rb:89:58:89:69 | __ENCODING__ | case.rb:89:8:89:69 | After ... \| ... [match] | match | +| case.rb:89:58:89:69 | __ENCODING__ | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:90:5:90:13 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:90:5:90:13 | After in ... then ... [no-match] | case.rb:91:5:91:25 | in ... then ... | | | case.rb:90:5:90:13 | in ... then ... | case.rb:90:8:90:13 | ( ... ) | | -| case.rb:90:8:90:13 | ( ... ) | case.rb:90:9:90:9 | 1 | | +| case.rb:90:8:90:13 | ( ... ) | case.rb:90:9:90:12 | Before _ .. _ | | +| case.rb:90:8:90:13 | After ( ... ) [match] | case.rb:90:5:90:13 | After in ... then ... [match] | match | +| case.rb:90:8:90:13 | After ( ... ) [no-match] | case.rb:90:5:90:13 | After in ... then ... [no-match] | no-match | | case.rb:90:9:90:9 | 1 | case.rb:90:9:90:12 | _ .. _ | | -| case.rb:90:9:90:12 | _ .. _ | case.rb:72:3:92:5 | case ... | match | -| case.rb:90:9:90:12 | _ .. _ | case.rb:91:5:91:25 | in ... then ... | no-match | +| case.rb:90:9:90:12 | After _ .. _ | case.rb:90:8:90:13 | After ( ... ) [match] | match | +| case.rb:90:9:90:12 | After _ .. _ | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:90:9:90:12 | Before _ .. _ | case.rb:90:9:90:9 | 1 | | +| case.rb:90:9:90:12 | _ .. _ | case.rb:90:9:90:12 | After _ .. _ | | +| case.rb:91:5:91:25 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:91:5:91:25 | After in ... then ... [no-match] | case.rb:72:3:92:5 | After case ... | | | case.rb:91:5:91:25 | in ... then ... | case.rb:91:8:91:25 | ( ... ) | | | case.rb:91:8:91:25 | ( ... ) | case.rb:91:9:91:24 | ... \| ... | | -| case.rb:91:9:91:9 | 0 | case.rb:72:3:92:5 | case ... | match | -| case.rb:91:9:91:9 | 0 | case.rb:91:13:91:14 | "" | no-match | +| case.rb:91:8:91:25 | After ( ... ) [match] | case.rb:91:5:91:25 | After in ... then ... [match] | match | +| case.rb:91:8:91:25 | After ( ... ) [no-match] | case.rb:91:5:91:25 | After in ... then ... [no-match] | no-match | +| case.rb:91:9:91:9 | 0 | case.rb:91:13:91:14 | "" | | | case.rb:91:9:91:24 | ... \| ... | case.rb:91:9:91:9 | 0 | | -| case.rb:91:13:91:14 | "" | case.rb:72:3:92:5 | case ... | match | -| case.rb:91:13:91:14 | "" | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:91:18:91:19 | [ ..., * ] | case.rb:72:3:92:5 | case ... | match | -| case.rb:91:18:91:19 | [ ..., * ] | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:91:23:91:24 | { ..., ** } | case.rb:69:1:93:3 | exit case_match_various (abnormal) | exception | -| case.rb:91:23:91:24 | { ..., ** } | case.rb:72:3:92:5 | case ... | false, match, true | -| case.rb:95:1:99:3 | case_match_guard_no_else | case.rb:1:1:99:4 | exit case.rb (normal) | | -| case.rb:95:1:99:3 | enter case_match_guard_no_else | case.rb:95:30:95:34 | value | | -| case.rb:95:1:99:3 | exit case_match_guard_no_else (abnormal) | case.rb:95:1:99:3 | exit case_match_guard_no_else | | -| case.rb:95:1:99:3 | exit case_match_guard_no_else (normal) | case.rb:95:1:99:3 | exit case_match_guard_no_else | | -| case.rb:95:30:95:34 | value | case.rb:96:8:96:12 | value | | -| case.rb:96:3:98:5 | case ... | case.rb:95:1:99:3 | exit case_match_guard_no_else (normal) | | +| case.rb:91:9:91:24 | After ... \| ... | case.rb:91:8:91:25 | After ( ... ) [match] | match | +| case.rb:91:9:91:24 | After ... \| ... | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:91:13:91:14 | "" | case.rb:91:18:91:19 | [ ..., * ] | | +| case.rb:91:18:91:19 | [ ..., * ] | case.rb:91:23:91:24 | { ..., ** } | | +| case.rb:91:23:91:24 | { ..., ** } | case.rb:91:9:91:24 | After ... \| ... | | +| case.rb:95:1:99:3 | Entry | case.rb:95:30:95:34 | value | | +| case.rb:95:1:99:3 | Normal Exit | case.rb:95:1:99:3 | Exit | | +| case.rb:95:1:99:3 | case_match_guard_no_else | case.rb:1:1:99:4 | Normal Exit | | +| case.rb:95:30:95:34 | value | case.rb:96:3:98:5 | ... | | +| case.rb:96:3:98:5 | ... | case.rb:96:3:98:5 | case ... | | +| case.rb:96:3:98:5 | After ... | case.rb:95:1:99:3 | Normal Exit | | +| case.rb:96:3:98:5 | After case ... | case.rb:96:3:98:5 | After ... | | +| case.rb:96:3:98:5 | case ... | case.rb:96:8:96:12 | value | | | case.rb:96:8:96:12 | value | case.rb:97:5:97:25 | in ... then ... | | +| case.rb:97:5:97:25 | After in ... then ... [match] | case.rb:97:13:97:18 | Before ... == ... | | +| case.rb:97:5:97:25 | After in ... then ... [no-match] | case.rb:96:3:98:5 | After case ... | | | case.rb:97:5:97:25 | in ... then ... | case.rb:97:8:97:8 | x | | -| case.rb:97:8:97:8 | x | case.rb:97:13:97:13 | x | match | +| case.rb:97:8:97:8 | After x [match] | case.rb:97:5:97:25 | After in ... then ... [match] | match | +| case.rb:97:8:97:8 | After x [no-match] | case.rb:97:5:97:25 | After in ... then ... [no-match] | no-match | +| case.rb:97:8:97:8 | x | case.rb:97:8:97:8 | After x [match] | match | +| case.rb:97:8:97:8 | x | case.rb:97:8:97:8 | After x [no-match] | no-match | | case.rb:97:13:97:13 | x | case.rb:97:18:97:18 | 5 | | -| case.rb:97:13:97:18 | ... == ... | case.rb:95:1:99:3 | exit case_match_guard_no_else (abnormal) | exception | -| case.rb:97:13:97:18 | ... == ... | case.rb:97:25:97:25 | 6 | true | +| case.rb:97:13:97:18 | ... == ... | case.rb:97:13:97:18 | After ... == ... [false] | false | +| case.rb:97:13:97:18 | ... == ... | case.rb:97:13:97:18 | After ... == ... [true] | true | +| case.rb:97:13:97:18 | After ... == ... [false] | case.rb:96:3:98:5 | After case ... | | +| case.rb:97:13:97:18 | After ... == ... [true] | case.rb:97:20:97:25 | then ... | | +| case.rb:97:13:97:18 | Before ... == ... | case.rb:97:13:97:13 | x | | | case.rb:97:18:97:18 | 5 | case.rb:97:13:97:18 | ... == ... | | -| case.rb:97:20:97:25 | then ... | case.rb:96:3:98:5 | case ... | | -| case.rb:97:25:97:25 | 6 | case.rb:97:20:97:25 | then ... | | -| cfg.html.erb:5:16:5:21 | @title | cfg.html.erb:6:9:6:58 | self | | +| case.rb:97:20:97:25 | After then ... | case.rb:96:3:98:5 | After case ... | | +| case.rb:97:20:97:25 | then ... | case.rb:97:25:97:25 | 6 | | +| case.rb:97:25:97:25 | 6 | case.rb:97:20:97:25 | After then ... | | +| cfg.html.erb:5:16:5:21 | @title | cfg.html.erb:5:16:5:21 | After @title | | +| cfg.html.erb:5:16:5:21 | After @title | cfg.html.erb:6:9:6:58 | Before call to stylesheet_link_tag | | +| cfg.html.erb:5:16:5:21 | Before @title | cfg.html.erb:5:16:5:21 | self | | | cfg.html.erb:5:16:5:21 | self | cfg.html.erb:5:16:5:21 | @title | | -| cfg.html.erb:5:16:31:12 | enter cfg.html.erb | cfg.html.erb:5:16:5:21 | self | | -| cfg.html.erb:5:16:31:12 | exit cfg.html.erb (normal) | cfg.html.erb:5:16:31:12 | exit cfg.html.erb | | -| cfg.html.erb:6:9:6:58 | call to stylesheet_link_tag | cfg.html.erb:12:11:12:33 | self | | -| cfg.html.erb:6:9:6:58 | self | cfg.html.erb:6:30:6:40 | application | | -| cfg.html.erb:6:29:6:41 | "application" | cfg.html.erb:6:44:6:49 | media | | +| cfg.html.erb:5:16:31:12 | Entry | cfg.html.erb:5:16:5:21 | Before @title | | +| cfg.html.erb:5:16:31:12 | Normal Exit | cfg.html.erb:5:16:31:12 | Exit | | +| cfg.html.erb:6:9:6:58 | After call to stylesheet_link_tag | cfg.html.erb:12:11:12:33 | Before call to link_to | | +| cfg.html.erb:6:9:6:58 | Before call to stylesheet_link_tag | cfg.html.erb:6:9:6:58 | self | | +| cfg.html.erb:6:9:6:58 | call to stylesheet_link_tag | cfg.html.erb:6:9:6:58 | After call to stylesheet_link_tag | | +| cfg.html.erb:6:9:6:58 | self | cfg.html.erb:6:29:6:41 | Before "application" | | +| cfg.html.erb:6:29:6:41 | "application" | cfg.html.erb:6:29:6:41 | After "application" | | +| cfg.html.erb:6:29:6:41 | After "application" | cfg.html.erb:6:44:6:58 | Before Pair | | +| cfg.html.erb:6:29:6:41 | Before "application" | cfg.html.erb:6:30:6:40 | application | | | cfg.html.erb:6:30:6:40 | application | cfg.html.erb:6:29:6:41 | "application" | | -| cfg.html.erb:6:44:6:49 | :media | cfg.html.erb:6:55:6:57 | all | | +| cfg.html.erb:6:44:6:49 | :media | cfg.html.erb:6:44:6:49 | After :media | | +| cfg.html.erb:6:44:6:49 | After :media | cfg.html.erb:6:54:6:58 | Before "all" | | +| cfg.html.erb:6:44:6:49 | Before :media | cfg.html.erb:6:44:6:49 | media | | | cfg.html.erb:6:44:6:49 | media | cfg.html.erb:6:44:6:49 | :media | | -| cfg.html.erb:6:44:6:58 | Pair | cfg.html.erb:6:9:6:58 | call to stylesheet_link_tag | | -| cfg.html.erb:6:54:6:58 | "all" | cfg.html.erb:6:44:6:58 | Pair | | +| cfg.html.erb:6:44:6:58 | After Pair | cfg.html.erb:6:9:6:58 | call to stylesheet_link_tag | | +| cfg.html.erb:6:44:6:58 | Before Pair | cfg.html.erb:6:44:6:49 | Before :media | | +| cfg.html.erb:6:44:6:58 | Pair | cfg.html.erb:6:44:6:58 | After Pair | | +| cfg.html.erb:6:54:6:58 | "all" | cfg.html.erb:6:54:6:58 | After "all" | | +| cfg.html.erb:6:54:6:58 | After "all" | cfg.html.erb:6:44:6:58 | Pair | | +| cfg.html.erb:6:54:6:58 | Before "all" | cfg.html.erb:6:55:6:57 | all | | | cfg.html.erb:6:55:6:57 | all | cfg.html.erb:6:54:6:58 | "all" | | -| cfg.html.erb:12:11:12:33 | call to link_to | cfg.html.erb:15:19:15:32 | self | | -| cfg.html.erb:12:11:12:33 | self | cfg.html.erb:12:20:12:20 | A | | -| cfg.html.erb:12:19:12:21 | "A" | cfg.html.erb:12:24:12:24 | self | | +| cfg.html.erb:12:11:12:33 | After call to link_to | cfg.html.erb:15:19:15:32 | Before call to link_to | | +| cfg.html.erb:12:11:12:33 | Before call to link_to | cfg.html.erb:12:11:12:33 | self | | +| cfg.html.erb:12:11:12:33 | call to link_to | cfg.html.erb:12:11:12:33 | After call to link_to | | +| cfg.html.erb:12:11:12:33 | self | cfg.html.erb:12:19:12:21 | Before "A" | | +| cfg.html.erb:12:19:12:21 | "A" | cfg.html.erb:12:19:12:21 | After "A" | | +| cfg.html.erb:12:19:12:21 | After "A" | cfg.html.erb:12:24:12:24 | Before call to a | | +| cfg.html.erb:12:19:12:21 | Before "A" | cfg.html.erb:12:20:12:20 | A | | | cfg.html.erb:12:20:12:20 | A | cfg.html.erb:12:19:12:21 | "A" | | -| cfg.html.erb:12:24:12:24 | call to a | cfg.html.erb:12:27:12:28 | id | | +| cfg.html.erb:12:24:12:24 | After call to a | cfg.html.erb:12:27:12:33 | Before Pair | | +| cfg.html.erb:12:24:12:24 | Before call to a | cfg.html.erb:12:24:12:24 | self | | +| cfg.html.erb:12:24:12:24 | call to a | cfg.html.erb:12:24:12:24 | After call to a | | | cfg.html.erb:12:24:12:24 | self | cfg.html.erb:12:24:12:24 | call to a | | -| cfg.html.erb:12:27:12:28 | :id | cfg.html.erb:12:32:12:32 | a | | +| cfg.html.erb:12:27:12:28 | :id | cfg.html.erb:12:27:12:28 | After :id | | +| cfg.html.erb:12:27:12:28 | After :id | cfg.html.erb:12:31:12:33 | Before "a" | | +| cfg.html.erb:12:27:12:28 | Before :id | cfg.html.erb:12:27:12:28 | id | | | cfg.html.erb:12:27:12:28 | id | cfg.html.erb:12:27:12:28 | :id | | -| cfg.html.erb:12:27:12:33 | Pair | cfg.html.erb:12:11:12:33 | call to link_to | | -| cfg.html.erb:12:31:12:33 | "a" | cfg.html.erb:12:27:12:33 | Pair | | +| cfg.html.erb:12:27:12:33 | After Pair | cfg.html.erb:12:11:12:33 | call to link_to | | +| cfg.html.erb:12:27:12:33 | Before Pair | cfg.html.erb:12:27:12:28 | Before :id | | +| cfg.html.erb:12:27:12:33 | Pair | cfg.html.erb:12:27:12:33 | After Pair | | +| cfg.html.erb:12:31:12:33 | "a" | cfg.html.erb:12:31:12:33 | After "a" | | +| cfg.html.erb:12:31:12:33 | After "a" | cfg.html.erb:12:27:12:33 | Pair | | +| cfg.html.erb:12:31:12:33 | Before "a" | cfg.html.erb:12:32:12:32 | a | | | cfg.html.erb:12:32:12:32 | a | cfg.html.erb:12:31:12:33 | "a" | | -| cfg.html.erb:15:19:15:32 | call to link_to | cfg.html.erb:16:19:16:32 | self | | -| cfg.html.erb:15:19:15:32 | self | cfg.html.erb:15:28:15:28 | B | | -| cfg.html.erb:15:27:15:29 | "B" | cfg.html.erb:15:32:15:32 | self | | +| cfg.html.erb:15:19:15:32 | After call to link_to | cfg.html.erb:16:19:16:32 | Before call to link_to | | +| cfg.html.erb:15:19:15:32 | Before call to link_to | cfg.html.erb:15:19:15:32 | self | | +| cfg.html.erb:15:19:15:32 | call to link_to | cfg.html.erb:15:19:15:32 | After call to link_to | | +| cfg.html.erb:15:19:15:32 | self | cfg.html.erb:15:27:15:29 | Before "B" | | +| cfg.html.erb:15:27:15:29 | "B" | cfg.html.erb:15:27:15:29 | After "B" | | +| cfg.html.erb:15:27:15:29 | After "B" | cfg.html.erb:15:32:15:32 | Before call to a | | +| cfg.html.erb:15:27:15:29 | Before "B" | cfg.html.erb:15:28:15:28 | B | | | cfg.html.erb:15:28:15:28 | B | cfg.html.erb:15:27:15:29 | "B" | | -| cfg.html.erb:15:32:15:32 | call to a | cfg.html.erb:15:19:15:32 | call to link_to | | +| cfg.html.erb:15:32:15:32 | After call to a | cfg.html.erb:15:19:15:32 | call to link_to | | +| cfg.html.erb:15:32:15:32 | Before call to a | cfg.html.erb:15:32:15:32 | self | | +| cfg.html.erb:15:32:15:32 | call to a | cfg.html.erb:15:32:15:32 | After call to a | | | cfg.html.erb:15:32:15:32 | self | cfg.html.erb:15:32:15:32 | call to a | | -| cfg.html.erb:16:19:16:32 | call to link_to | cfg.html.erb:18:17:18:22 | self | | -| cfg.html.erb:16:19:16:32 | self | cfg.html.erb:16:28:16:28 | C | | -| cfg.html.erb:16:27:16:29 | "C" | cfg.html.erb:16:32:16:32 | self | | +| cfg.html.erb:16:19:16:32 | After call to link_to | cfg.html.erb:18:14:22:16 | if ... | | +| cfg.html.erb:16:19:16:32 | Before call to link_to | cfg.html.erb:16:19:16:32 | self | | +| cfg.html.erb:16:19:16:32 | call to link_to | cfg.html.erb:16:19:16:32 | After call to link_to | | +| cfg.html.erb:16:19:16:32 | self | cfg.html.erb:16:27:16:29 | Before "C" | | +| cfg.html.erb:16:27:16:29 | "C" | cfg.html.erb:16:27:16:29 | After "C" | | +| cfg.html.erb:16:27:16:29 | After "C" | cfg.html.erb:16:32:16:32 | Before call to b | | +| cfg.html.erb:16:27:16:29 | Before "C" | cfg.html.erb:16:28:16:28 | C | | | cfg.html.erb:16:28:16:28 | C | cfg.html.erb:16:27:16:29 | "C" | | -| cfg.html.erb:16:32:16:32 | call to b | cfg.html.erb:16:19:16:32 | call to link_to | | +| cfg.html.erb:16:32:16:32 | After call to b | cfg.html.erb:16:19:16:32 | call to link_to | | +| cfg.html.erb:16:32:16:32 | Before call to b | cfg.html.erb:16:32:16:32 | self | | +| cfg.html.erb:16:32:16:32 | call to b | cfg.html.erb:16:32:16:32 | After call to b | | | cfg.html.erb:16:32:16:32 | self | cfg.html.erb:16:32:16:32 | call to b | | -| cfg.html.erb:18:14:22:16 | if ... | cfg.html.erb:29:8:29:17 | self | | -| cfg.html.erb:18:17:18:22 | call to admin? | cfg.html.erb:19:19:19:32 | self | true | -| cfg.html.erb:18:17:18:22 | call to admin? | cfg.html.erb:21:19:21:32 | self | false | +| cfg.html.erb:18:14:22:16 | After if ... | cfg.html.erb:29:8:31:10 | Before call to each | | +| cfg.html.erb:18:14:22:16 | if ... | cfg.html.erb:18:17:18:22 | Before call to admin? | | +| cfg.html.erb:18:17:18:22 | After call to admin? [false] | cfg.html.erb:20:14:21:34 | else ... | | +| cfg.html.erb:18:17:18:22 | After call to admin? [true] | cfg.html.erb:18:24:19:34 | then ... | | +| cfg.html.erb:18:17:18:22 | Before call to admin? | cfg.html.erb:18:17:18:22 | self | | +| cfg.html.erb:18:17:18:22 | call to admin? | cfg.html.erb:18:17:18:22 | After call to admin? [false] | false | +| cfg.html.erb:18:17:18:22 | call to admin? | cfg.html.erb:18:17:18:22 | After call to admin? [true] | true | | cfg.html.erb:18:17:18:22 | self | cfg.html.erb:18:17:18:22 | call to admin? | | -| cfg.html.erb:18:24:19:34 | then ... | cfg.html.erb:18:14:22:16 | if ... | | -| cfg.html.erb:19:19:19:32 | call to link_to | cfg.html.erb:18:24:19:34 | then ... | | -| cfg.html.erb:19:19:19:32 | self | cfg.html.erb:19:28:19:28 | D | | -| cfg.html.erb:19:27:19:29 | "D" | cfg.html.erb:19:32:19:32 | self | | +| cfg.html.erb:18:24:19:34 | After then ... | cfg.html.erb:18:14:22:16 | After if ... | | +| cfg.html.erb:18:24:19:34 | then ... | cfg.html.erb:19:19:19:32 | Before call to link_to | | +| cfg.html.erb:19:19:19:32 | After call to link_to | cfg.html.erb:18:24:19:34 | After then ... | | +| cfg.html.erb:19:19:19:32 | Before call to link_to | cfg.html.erb:19:19:19:32 | self | | +| cfg.html.erb:19:19:19:32 | call to link_to | cfg.html.erb:19:19:19:32 | After call to link_to | | +| cfg.html.erb:19:19:19:32 | self | cfg.html.erb:19:27:19:29 | Before "D" | | +| cfg.html.erb:19:27:19:29 | "D" | cfg.html.erb:19:27:19:29 | After "D" | | +| cfg.html.erb:19:27:19:29 | After "D" | cfg.html.erb:19:32:19:32 | Before call to d | | +| cfg.html.erb:19:27:19:29 | Before "D" | cfg.html.erb:19:28:19:28 | D | | | cfg.html.erb:19:28:19:28 | D | cfg.html.erb:19:27:19:29 | "D" | | -| cfg.html.erb:19:32:19:32 | call to d | cfg.html.erb:19:19:19:32 | call to link_to | | +| cfg.html.erb:19:32:19:32 | After call to d | cfg.html.erb:19:19:19:32 | call to link_to | | +| cfg.html.erb:19:32:19:32 | Before call to d | cfg.html.erb:19:32:19:32 | self | | +| cfg.html.erb:19:32:19:32 | call to d | cfg.html.erb:19:32:19:32 | After call to d | | | cfg.html.erb:19:32:19:32 | self | cfg.html.erb:19:32:19:32 | call to d | | -| cfg.html.erb:20:14:21:34 | else ... | cfg.html.erb:18:14:22:16 | if ... | | -| cfg.html.erb:21:19:21:32 | call to link_to | cfg.html.erb:20:14:21:34 | else ... | | -| cfg.html.erb:21:19:21:32 | self | cfg.html.erb:21:28:21:28 | E | | -| cfg.html.erb:21:27:21:29 | "E" | cfg.html.erb:21:32:21:32 | self | | +| cfg.html.erb:20:14:21:34 | After else ... | cfg.html.erb:18:14:22:16 | After if ... | | +| cfg.html.erb:20:14:21:34 | else ... | cfg.html.erb:21:19:21:32 | Before call to link_to | | +| cfg.html.erb:21:19:21:32 | After call to link_to | cfg.html.erb:20:14:21:34 | After else ... | | +| cfg.html.erb:21:19:21:32 | Before call to link_to | cfg.html.erb:21:19:21:32 | self | | +| cfg.html.erb:21:19:21:32 | call to link_to | cfg.html.erb:21:19:21:32 | After call to link_to | | +| cfg.html.erb:21:19:21:32 | self | cfg.html.erb:21:27:21:29 | Before "E" | | +| cfg.html.erb:21:27:21:29 | "E" | cfg.html.erb:21:27:21:29 | After "E" | | +| cfg.html.erb:21:27:21:29 | After "E" | cfg.html.erb:21:32:21:32 | Before call to e | | +| cfg.html.erb:21:27:21:29 | Before "E" | cfg.html.erb:21:28:21:28 | E | | | cfg.html.erb:21:28:21:28 | E | cfg.html.erb:21:27:21:29 | "E" | | -| cfg.html.erb:21:32:21:32 | call to e | cfg.html.erb:21:19:21:32 | call to link_to | | +| cfg.html.erb:21:32:21:32 | After call to e | cfg.html.erb:21:19:21:32 | call to link_to | | +| cfg.html.erb:21:32:21:32 | Before call to e | cfg.html.erb:21:32:21:32 | self | | +| cfg.html.erb:21:32:21:32 | call to e | cfg.html.erb:21:32:21:32 | After call to e | | | cfg.html.erb:21:32:21:32 | self | cfg.html.erb:21:32:21:32 | call to e | | -| cfg.html.erb:29:8:29:17 | call to collection | cfg.html.erb:29:24:31:10 | do ... end | | +| cfg.html.erb:29:8:29:17 | After call to collection | cfg.html.erb:29:24:31:10 | do ... end | | +| cfg.html.erb:29:8:29:17 | Before call to collection | cfg.html.erb:29:8:29:17 | self | | +| cfg.html.erb:29:8:29:17 | call to collection | cfg.html.erb:29:8:29:17 | After call to collection | | | cfg.html.erb:29:8:29:17 | self | cfg.html.erb:29:8:29:17 | call to collection | | -| cfg.html.erb:29:8:31:10 | call to each | cfg.html.erb:5:16:31:12 | exit cfg.html.erb (normal) | | +| cfg.html.erb:29:8:31:10 | After call to each | cfg.html.erb:5:16:31:12 | Normal Exit | | +| cfg.html.erb:29:8:31:10 | Before call to each | cfg.html.erb:29:8:29:17 | Before call to collection | | +| cfg.html.erb:29:8:31:10 | call to each | cfg.html.erb:29:8:31:10 | After call to each | | +| cfg.html.erb:29:24:31:10 | Entry | cfg.html.erb:29:28:29:30 | key | | +| cfg.html.erb:29:24:31:10 | Normal Exit | cfg.html.erb:29:24:31:10 | Exit | | | cfg.html.erb:29:24:31:10 | do ... end | cfg.html.erb:29:8:31:10 | call to each | | -| cfg.html.erb:29:24:31:10 | enter do ... end | cfg.html.erb:29:28:29:30 | key | | -| cfg.html.erb:29:24:31:10 | exit do ... end (normal) | cfg.html.erb:29:24:31:10 | exit do ... end | | | cfg.html.erb:29:28:29:30 | key | cfg.html.erb:29:33:29:37 | value | | -| cfg.html.erb:29:33:29:37 | value | cfg.html.erb:30:23:30:25 | key | | +| cfg.html.erb:29:33:29:37 | value | cfg.html.erb:30:23:30:41 | ... | | | cfg.html.erb:30:23:30:25 | key | cfg.html.erb:30:35:30:39 | value | | -| cfg.html.erb:30:35:30:39 | value | cfg.html.erb:29:24:31:10 | exit do ... end (normal) | | -| cfg.rb:1:1:1:12 | bar | cfg.rb:3:1:3:13 | alias ... | | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:16:3:16:14 | self | | -| cfg.rb:1:1:221:1 | exit cfg.rb (normal) | cfg.rb:1:1:221:1 | exit cfg.rb | | -| cfg.rb:3:1:3:13 | alias ... | cfg.rb:3:7:3:9 | foo | | +| cfg.html.erb:30:23:30:41 | ... | cfg.html.erb:30:23:30:25 | key | | +| cfg.html.erb:30:23:30:41 | After ... | cfg.html.erb:29:24:31:10 | Normal Exit | | +| cfg.html.erb:30:35:30:39 | value | cfg.html.erb:30:23:30:41 | After ... | | +| cfg.rb:1:1:1:12 | bar | cfg.rb:3:1:3:13 | Before alias ... | | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:15:1:17:1 | BEGIN { ... } | | +| cfg.rb:1:1:221:1 | Exceptional Exit | cfg.rb:1:1:221:1 | Exit | | +| cfg.rb:1:1:221:1 | Normal Exit | cfg.rb:1:1:221:1 | Exit | | +| cfg.rb:3:1:3:13 | After alias ... | cfg.rb:5:1:5:6 | Before ... = ... | | +| cfg.rb:3:1:3:13 | Before alias ... | cfg.rb:3:7:3:9 | foo | | +| cfg.rb:3:1:3:13 | alias ... | cfg.rb:3:1:3:13 | After alias ... | | | cfg.rb:3:7:3:9 | foo | cfg.rb:3:11:3:13 | bar | | -| cfg.rb:3:11:3:13 | bar | cfg.rb:5:1:5:1 | b | | +| cfg.rb:3:11:3:13 | bar | cfg.rb:3:1:3:13 | alias ... | | | cfg.rb:5:1:5:1 | b | cfg.rb:5:5:5:6 | 42 | | -| cfg.rb:5:1:5:6 | ... = ... | cfg.rb:7:1:7:21 | Array | | +| cfg.rb:5:1:5:6 | ... = ... | cfg.rb:5:1:5:6 | After ... = ... | | +| cfg.rb:5:1:5:6 | After ... = ... | cfg.rb:7:1:7:21 | Before call to [] | | +| cfg.rb:5:1:5:6 | Before ... = ... | cfg.rb:5:1:5:1 | b | | | cfg.rb:5:5:5:6 | 42 | cfg.rb:5:1:5:6 | ... = ... | | -| cfg.rb:7:1:7:21 | Array | cfg.rb:7:4:7:6 | one | | -| cfg.rb:7:1:7:21 | call to [] | cfg.rb:9:1:9:21 | Array | | -| cfg.rb:7:4:7:6 | one | cfg.rb:7:10:7:10 | b | | -| cfg.rb:7:4:7:12 | :"one#{...}" | cfg.rb:7:14:7:20 | another | | -| cfg.rb:7:7:7:12 | #{...} | cfg.rb:7:4:7:12 | :"one#{...}" | | -| cfg.rb:7:10:7:10 | b | cfg.rb:7:7:7:12 | #{...} | | -| cfg.rb:7:14:7:20 | :"another" | cfg.rb:7:1:7:21 | call to [] | | +| cfg.rb:7:1:7:21 | After call to [] | cfg.rb:9:1:9:21 | Before call to [] | | +| cfg.rb:7:1:7:21 | Array | cfg.rb:7:4:7:12 | Before :"one#{...}" | | +| cfg.rb:7:1:7:21 | Before call to [] | cfg.rb:7:1:7:21 | Array | | +| cfg.rb:7:1:7:21 | call to [] | cfg.rb:7:1:7:21 | After call to [] | | +| cfg.rb:7:4:7:6 | one | cfg.rb:7:7:7:12 | #{...} | | +| cfg.rb:7:4:7:12 | :"one#{...}" | cfg.rb:7:4:7:12 | After :"one#{...}" | | +| cfg.rb:7:4:7:12 | After :"one#{...}" | cfg.rb:7:14:7:20 | Before :"another" | | +| cfg.rb:7:4:7:12 | Before :"one#{...}" | cfg.rb:7:4:7:6 | one | | +| cfg.rb:7:7:7:12 | #{...} | cfg.rb:7:10:7:10 | b | | +| cfg.rb:7:7:7:12 | After #{...} | cfg.rb:7:4:7:12 | :"one#{...}" | | +| cfg.rb:7:10:7:10 | b | cfg.rb:7:7:7:12 | After #{...} | | +| cfg.rb:7:14:7:20 | :"another" | cfg.rb:7:14:7:20 | After :"another" | | +| cfg.rb:7:14:7:20 | After :"another" | cfg.rb:7:1:7:21 | call to [] | | +| cfg.rb:7:14:7:20 | Before :"another" | cfg.rb:7:14:7:20 | another | | | cfg.rb:7:14:7:20 | another | cfg.rb:7:14:7:20 | :"another" | | -| cfg.rb:9:1:9:21 | Array | cfg.rb:9:4:9:6 | one | | -| cfg.rb:9:1:9:21 | call to [] | cfg.rb:12:3:12:8 | self | | -| cfg.rb:9:4:9:6 | one | cfg.rb:9:10:9:10 | b | | -| cfg.rb:9:4:9:12 | "one#{...}" | cfg.rb:9:14:9:20 | another | | -| cfg.rb:9:7:9:12 | #{...} | cfg.rb:9:4:9:12 | "one#{...}" | | -| cfg.rb:9:10:9:10 | b | cfg.rb:9:7:9:12 | #{...} | | -| cfg.rb:9:14:9:20 | "another" | cfg.rb:9:1:9:21 | call to [] | | +| cfg.rb:9:1:9:21 | After call to [] | cfg.rb:11:1:13:3 | begin ... | | +| cfg.rb:9:1:9:21 | Array | cfg.rb:9:4:9:12 | Before "one#{...}" | | +| cfg.rb:9:1:9:21 | Before call to [] | cfg.rb:9:1:9:21 | Array | | +| cfg.rb:9:1:9:21 | call to [] | cfg.rb:9:1:9:21 | After call to [] | | +| cfg.rb:9:4:9:6 | one | cfg.rb:9:7:9:12 | #{...} | | +| cfg.rb:9:4:9:12 | "one#{...}" | cfg.rb:9:4:9:12 | After "one#{...}" | | +| cfg.rb:9:4:9:12 | After "one#{...}" | cfg.rb:9:14:9:20 | Before "another" | | +| cfg.rb:9:4:9:12 | Before "one#{...}" | cfg.rb:9:4:9:6 | one | | +| cfg.rb:9:7:9:12 | #{...} | cfg.rb:9:10:9:10 | b | | +| cfg.rb:9:7:9:12 | After #{...} | cfg.rb:9:4:9:12 | "one#{...}" | | +| cfg.rb:9:10:9:10 | b | cfg.rb:9:7:9:12 | After #{...} | | +| cfg.rb:9:14:9:20 | "another" | cfg.rb:9:14:9:20 | After "another" | | +| cfg.rb:9:14:9:20 | After "another" | cfg.rb:9:1:9:21 | call to [] | | +| cfg.rb:9:14:9:20 | Before "another" | cfg.rb:9:14:9:20 | another | | | cfg.rb:9:14:9:20 | another | cfg.rb:9:14:9:20 | "another" | | -| cfg.rb:12:3:12:8 | call to puts | cfg.rb:19:1:21:1 | END { ... } | | +| cfg.rb:11:1:13:3 | After begin ... | cfg.rb:19:1:21:1 | END { ... } | | +| cfg.rb:11:1:13:3 | begin ... | cfg.rb:12:3:12:8 | Before call to puts | | +| cfg.rb:12:3:12:8 | After call to puts | cfg.rb:11:1:13:3 | After begin ... | | +| cfg.rb:12:3:12:8 | Before call to puts | cfg.rb:12:3:12:8 | self | | +| cfg.rb:12:3:12:8 | call to puts | cfg.rb:12:3:12:8 | After call to puts | | | cfg.rb:12:3:12:8 | self | cfg.rb:12:8:12:8 | 4 | | | cfg.rb:12:8:12:8 | 4 | cfg.rb:12:3:12:8 | call to puts | | -| cfg.rb:15:1:17:1 | BEGIN { ... } | cfg.rb:1:1:1:12 | bar | | -| cfg.rb:16:3:16:14 | call to puts | cfg.rb:15:1:17:1 | BEGIN { ... } | | -| cfg.rb:16:3:16:14 | self | cfg.rb:16:9:16:13 | hello | | -| cfg.rb:16:8:16:14 | "hello" | cfg.rb:16:3:16:14 | call to puts | | +| cfg.rb:15:1:17:1 | After BEGIN { ... } | cfg.rb:1:1:1:12 | bar | | +| cfg.rb:15:1:17:1 | BEGIN { ... } | cfg.rb:16:3:16:14 | Before call to puts | | +| cfg.rb:16:3:16:14 | After call to puts | cfg.rb:15:1:17:1 | After BEGIN { ... } | | +| cfg.rb:16:3:16:14 | Before call to puts | cfg.rb:16:3:16:14 | self | | +| cfg.rb:16:3:16:14 | call to puts | cfg.rb:16:3:16:14 | After call to puts | | +| cfg.rb:16:3:16:14 | self | cfg.rb:16:8:16:14 | Before "hello" | | +| cfg.rb:16:8:16:14 | "hello" | cfg.rb:16:8:16:14 | After "hello" | | +| cfg.rb:16:8:16:14 | After "hello" | cfg.rb:16:3:16:14 | call to puts | | +| cfg.rb:16:8:16:14 | Before "hello" | cfg.rb:16:9:16:13 | hello | | | cfg.rb:16:9:16:13 | hello | cfg.rb:16:8:16:14 | "hello" | | -| cfg.rb:19:1:21:1 | END { ... } | cfg.rb:23:1:23:2 | 41 | | +| cfg.rb:19:1:21:1 | After END { ... } | cfg.rb:23:1:23:6 | Before ... + ... | | +| cfg.rb:19:1:21:1 | END { ... } | cfg.rb:20:3:20:14 | Before call to puts | | +| cfg.rb:20:3:20:14 | After call to puts | cfg.rb:19:1:21:1 | After END { ... } | | +| cfg.rb:20:3:20:14 | Before call to puts | cfg.rb:20:3:20:14 | self | | +| cfg.rb:20:3:20:14 | call to puts | cfg.rb:20:3:20:14 | After call to puts | | +| cfg.rb:20:3:20:14 | self | cfg.rb:20:8:20:14 | Before "world" | | +| cfg.rb:20:8:20:14 | "world" | cfg.rb:20:8:20:14 | After "world" | | +| cfg.rb:20:8:20:14 | After "world" | cfg.rb:20:3:20:14 | call to puts | | +| cfg.rb:20:8:20:14 | Before "world" | cfg.rb:20:9:20:13 | world | | +| cfg.rb:20:9:20:13 | world | cfg.rb:20:8:20:14 | "world" | | | cfg.rb:23:1:23:2 | 41 | cfg.rb:23:6:23:6 | 1 | | -| cfg.rb:23:1:23:6 | ... + ... | cfg.rb:25:1:25:1 | 2 | | +| cfg.rb:23:1:23:6 | ... + ... | cfg.rb:23:1:23:6 | After ... + ... | | +| cfg.rb:23:1:23:6 | After ... + ... | cfg.rb:25:1:25:22 | Before call to times | | +| cfg.rb:23:1:23:6 | Before ... + ... | cfg.rb:23:1:23:2 | 41 | | | cfg.rb:23:6:23:6 | 1 | cfg.rb:23:1:23:6 | ... + ... | | | cfg.rb:25:1:25:1 | 2 | cfg.rb:25:9:25:22 | { ... } | | -| cfg.rb:25:1:25:22 | call to times | cfg.rb:27:1:27:11 | self | | -| cfg.rb:25:9:25:22 | enter { ... } | cfg.rb:25:12:25:12 | x | | -| cfg.rb:25:9:25:22 | exit { ... } (normal) | cfg.rb:25:9:25:22 | exit { ... } | | +| cfg.rb:25:1:25:22 | After call to times | cfg.rb:27:1:27:11 | Before call to puts | | +| cfg.rb:25:1:25:22 | Before call to times | cfg.rb:25:1:25:1 | 2 | | +| cfg.rb:25:1:25:22 | call to times | cfg.rb:25:1:25:22 | After call to times | | +| cfg.rb:25:9:25:22 | Entry | cfg.rb:25:12:25:12 | x | | +| cfg.rb:25:9:25:22 | Normal Exit | cfg.rb:25:9:25:22 | Exit | | | cfg.rb:25:9:25:22 | { ... } | cfg.rb:25:1:25:22 | call to times | | -| cfg.rb:25:12:25:12 | x | cfg.rb:25:15:25:20 | self | | -| cfg.rb:25:15:25:20 | call to puts | cfg.rb:25:9:25:22 | exit { ... } (normal) | | +| cfg.rb:25:12:25:12 | x | cfg.rb:25:15:25:20 | ... | | +| cfg.rb:25:15:25:20 | ... | cfg.rb:25:15:25:20 | Before call to puts | | +| cfg.rb:25:15:25:20 | After ... | cfg.rb:25:9:25:22 | Normal Exit | | +| cfg.rb:25:15:25:20 | After call to puts | cfg.rb:25:15:25:20 | After ... | | +| cfg.rb:25:15:25:20 | Before call to puts | cfg.rb:25:15:25:20 | self | | +| cfg.rb:25:15:25:20 | call to puts | cfg.rb:25:15:25:20 | After call to puts | | | cfg.rb:25:15:25:20 | self | cfg.rb:25:20:25:20 | x | | | cfg.rb:25:20:25:20 | x | cfg.rb:25:15:25:20 | call to puts | | -| cfg.rb:27:1:27:11 | call to puts | cfg.rb:29:1:29:4 | Proc | | -| cfg.rb:27:1:27:11 | self | cfg.rb:27:7:27:11 | puts | | -| cfg.rb:27:6:27:11 | &... | cfg.rb:27:1:27:11 | call to puts | | -| cfg.rb:27:7:27:11 | :puts | cfg.rb:27:6:27:11 | &... | | +| cfg.rb:27:1:27:11 | After call to puts | cfg.rb:29:1:29:24 | Before call to new | | +| cfg.rb:27:1:27:11 | Before call to puts | cfg.rb:27:1:27:11 | self | | +| cfg.rb:27:1:27:11 | call to puts | cfg.rb:27:1:27:11 | After call to puts | | +| cfg.rb:27:1:27:11 | self | cfg.rb:27:6:27:11 | Before &... | | +| cfg.rb:27:6:27:11 | &... | cfg.rb:27:6:27:11 | After &... | | +| cfg.rb:27:6:27:11 | After &... | cfg.rb:27:1:27:11 | call to puts | | +| cfg.rb:27:6:27:11 | Before &... | cfg.rb:27:7:27:11 | Before :puts | | +| cfg.rb:27:7:27:11 | :puts | cfg.rb:27:7:27:11 | After :puts | | +| cfg.rb:27:7:27:11 | After :puts | cfg.rb:27:6:27:11 | &... | | +| cfg.rb:27:7:27:11 | Before :puts | cfg.rb:27:7:27:11 | puts | | | cfg.rb:27:7:27:11 | puts | cfg.rb:27:7:27:11 | :puts | | | cfg.rb:29:1:29:4 | Proc | cfg.rb:29:10:29:24 | { ... } | | -| cfg.rb:29:1:29:24 | call to new | cfg.rb:31:7:31:10 | true | | -| cfg.rb:29:10:29:24 | enter { ... } | cfg.rb:29:14:29:14 | x | | -| cfg.rb:29:10:29:24 | exit { ... } (normal) | cfg.rb:29:10:29:24 | exit { ... } | | +| cfg.rb:29:1:29:24 | After call to new | cfg.rb:31:1:33:3 | while ... | | +| cfg.rb:29:1:29:24 | Before call to new | cfg.rb:29:1:29:4 | Proc | | +| cfg.rb:29:1:29:24 | call to new | cfg.rb:29:1:29:24 | After call to new | | +| cfg.rb:29:10:29:24 | Entry | cfg.rb:29:14:29:14 | x | | +| cfg.rb:29:10:29:24 | Normal Exit | cfg.rb:29:10:29:24 | Exit | | | cfg.rb:29:10:29:24 | { ... } | cfg.rb:29:1:29:24 | call to new | | -| cfg.rb:29:14:29:14 | x | cfg.rb:29:17:29:17 | x | | +| cfg.rb:29:14:29:14 | x | cfg.rb:29:17:29:22 | ... | | | cfg.rb:29:17:29:17 | x | cfg.rb:29:17:29:22 | call to call | | -| cfg.rb:29:17:29:22 | call to call | cfg.rb:29:10:29:24 | exit { ... } (normal) | | -| cfg.rb:31:1:33:3 | while ... | cfg.rb:35:4:35:8 | false | | -| cfg.rb:31:7:31:10 | true | cfg.rb:32:9:32:9 | 1 | true | -| cfg.rb:32:3:32:9 | break | cfg.rb:31:1:33:3 | while ... | break | +| cfg.rb:29:17:29:22 | ... | cfg.rb:29:17:29:22 | Before call to call | | +| cfg.rb:29:17:29:22 | After ... | cfg.rb:29:10:29:24 | Normal Exit | | +| cfg.rb:29:17:29:22 | After call to call | cfg.rb:29:17:29:22 | After ... | | +| cfg.rb:29:17:29:22 | Before call to call | cfg.rb:29:17:29:17 | x | | +| cfg.rb:29:17:29:22 | call to call | cfg.rb:29:17:29:22 | After call to call | | +| cfg.rb:31:1:33:3 | After while ... | cfg.rb:35:1:37:3 | if ... | | +| cfg.rb:31:1:33:3 | [LoopHeader] while ... | cfg.rb:31:7:31:10 | true | | +| cfg.rb:31:1:33:3 | while ... | cfg.rb:31:1:33:3 | [LoopHeader] while ... | | +| cfg.rb:31:7:31:10 | After true [true] | cfg.rb:31:11:33:3 | do ... | | +| cfg.rb:31:7:31:10 | true | cfg.rb:31:7:31:10 | After true [true] | true | +| cfg.rb:31:11:33:3 | do ... | cfg.rb:32:3:32:9 | Before break | | +| cfg.rb:32:3:32:9 | Before break | cfg.rb:32:9:32:9 | 1 | | +| cfg.rb:32:3:32:9 | break | cfg.rb:31:1:33:3 | After while ... | break | | cfg.rb:32:9:32:9 | 1 | cfg.rb:32:3:32:9 | break | | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:39:1:39:4 | self | | -| cfg.rb:35:4:35:8 | false | cfg.rb:35:1:37:3 | if ... | false | +| cfg.rb:35:1:37:3 | After if ... | cfg.rb:39:1:39:12 | Before call to puts | | +| cfg.rb:35:1:37:3 | if ... | cfg.rb:35:4:35:8 | false | | +| cfg.rb:35:4:35:8 | After false [false] | cfg.rb:35:1:37:3 | After if ... | | +| cfg.rb:35:4:35:8 | false | cfg.rb:35:4:35:8 | After false [false] | false | | cfg.rb:39:1:39:4 | self | cfg.rb:39:11:39:12 | 42 | | -| cfg.rb:39:1:39:12 | call to puts | cfg.rb:41:6:41:7 | 10 | | +| cfg.rb:39:1:39:12 | After call to puts | cfg.rb:41:1:45:3 | case ... | | +| cfg.rb:39:1:39:12 | Before call to puts | cfg.rb:39:1:39:4 | self | | +| cfg.rb:39:1:39:12 | call to puts | cfg.rb:39:1:39:12 | After call to puts | | | cfg.rb:39:11:39:12 | 42 | cfg.rb:39:1:39:12 | call to puts | | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:47:1:50:3 | true | | -| cfg.rb:41:6:41:7 | 10 | cfg.rb:42:8:42:8 | 1 | | -| cfg.rb:42:3:42:24 | [match] when ... | cfg.rb:42:15:42:24 | self | match | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:43:8:43:8 | 2 | no-match | -| cfg.rb:42:8:42:8 | 1 | cfg.rb:42:3:42:24 | [match] when ... | match | -| cfg.rb:42:8:42:8 | 1 | cfg.rb:42:3:42:24 | [no-match] when ... | no-match | -| cfg.rb:42:10:42:24 | then ... | cfg.rb:41:1:45:3 | case ... | | -| cfg.rb:42:15:42:24 | call to puts | cfg.rb:42:10:42:24 | then ... | | -| cfg.rb:42:15:42:24 | self | cfg.rb:42:21:42:23 | one | | -| cfg.rb:42:20:42:24 | "one" | cfg.rb:42:15:42:24 | call to puts | | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:47:1:50:3 | case ... | | +| cfg.rb:41:1:45:3 | case ... | cfg.rb:41:6:41:7 | 10 | | +| cfg.rb:41:6:41:7 | 10 | cfg.rb:42:3:42:24 | when ... | | +| cfg.rb:42:3:42:24 | After when ... [match] | cfg.rb:42:10:42:24 | then ... | | +| cfg.rb:42:3:42:24 | After when ... [no-match] | cfg.rb:43:3:43:31 | when ... | | +| cfg.rb:42:3:42:24 | when ... | cfg.rb:42:8:42:8 | 1 | | +| cfg.rb:42:8:42:8 | 1 | cfg.rb:42:8:42:8 | After 1 [match] | match | +| cfg.rb:42:8:42:8 | 1 | cfg.rb:42:8:42:8 | After 1 [no-match] | no-match | +| cfg.rb:42:8:42:8 | After 1 [match] | cfg.rb:42:3:42:24 | After when ... [match] | match | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:42:3:42:24 | After when ... [no-match] | no-match | +| cfg.rb:42:10:42:24 | After then ... | cfg.rb:41:1:45:3 | After case ... | | +| cfg.rb:42:10:42:24 | then ... | cfg.rb:42:15:42:24 | Before call to puts | | +| cfg.rb:42:15:42:24 | After call to puts | cfg.rb:42:10:42:24 | After then ... | | +| cfg.rb:42:15:42:24 | Before call to puts | cfg.rb:42:15:42:24 | self | | +| cfg.rb:42:15:42:24 | call to puts | cfg.rb:42:15:42:24 | After call to puts | | +| cfg.rb:42:15:42:24 | self | cfg.rb:42:20:42:24 | Before "one" | | +| cfg.rb:42:20:42:24 | "one" | cfg.rb:42:20:42:24 | After "one" | | +| cfg.rb:42:20:42:24 | After "one" | cfg.rb:42:15:42:24 | call to puts | | +| cfg.rb:42:20:42:24 | Before "one" | cfg.rb:42:21:42:23 | one | | | cfg.rb:42:21:42:23 | one | cfg.rb:42:20:42:24 | "one" | | -| cfg.rb:43:3:43:31 | [match] when ... | cfg.rb:43:21:43:31 | self | match | -| cfg.rb:43:3:43:31 | [no-match] when ... | cfg.rb:44:8:44:18 | self | no-match | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:3:43:31 | [match] when ... | match | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:11:43:11 | 3 | no-match | -| cfg.rb:43:11:43:11 | 3 | cfg.rb:43:3:43:31 | [match] when ... | match | -| cfg.rb:43:11:43:11 | 3 | cfg.rb:43:14:43:14 | 4 | no-match | -| cfg.rb:43:14:43:14 | 4 | cfg.rb:43:3:43:31 | [match] when ... | match | -| cfg.rb:43:14:43:14 | 4 | cfg.rb:43:3:43:31 | [no-match] when ... | no-match | -| cfg.rb:43:16:43:31 | then ... | cfg.rb:41:1:45:3 | case ... | | -| cfg.rb:43:21:43:31 | call to puts | cfg.rb:43:16:43:31 | then ... | | -| cfg.rb:43:21:43:31 | self | cfg.rb:43:27:43:30 | some | | -| cfg.rb:43:26:43:31 | "some" | cfg.rb:43:21:43:31 | call to puts | | +| cfg.rb:43:3:43:31 | After when ... [match] | cfg.rb:43:16:43:31 | then ... | | +| cfg.rb:43:3:43:31 | After when ... [no-match] | cfg.rb:44:3:44:18 | else ... | | +| cfg.rb:43:3:43:31 | when ... | cfg.rb:43:8:43:8 | 2 | | +| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:8:43:8 | After 2 [match] | match | +| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:8:43:8 | After 2 [no-match] | no-match | +| cfg.rb:43:8:43:8 | After 2 [match] | cfg.rb:43:3:43:31 | After when ... [match] | match | +| cfg.rb:43:8:43:8 | After 2 [no-match] | cfg.rb:43:11:43:11 | 3 | | +| cfg.rb:43:11:43:11 | 3 | cfg.rb:43:11:43:11 | After 3 [match] | match | +| cfg.rb:43:11:43:11 | 3 | cfg.rb:43:11:43:11 | After 3 [no-match] | no-match | +| cfg.rb:43:11:43:11 | After 3 [match] | cfg.rb:43:3:43:31 | After when ... [match] | match | +| cfg.rb:43:11:43:11 | After 3 [no-match] | cfg.rb:43:14:43:14 | 4 | | +| cfg.rb:43:14:43:14 | 4 | cfg.rb:43:14:43:14 | After 4 [match] | match | +| cfg.rb:43:14:43:14 | 4 | cfg.rb:43:14:43:14 | After 4 [no-match] | no-match | +| cfg.rb:43:14:43:14 | After 4 [match] | cfg.rb:43:3:43:31 | After when ... [match] | match | +| cfg.rb:43:14:43:14 | After 4 [no-match] | cfg.rb:43:3:43:31 | After when ... [no-match] | no-match | +| cfg.rb:43:16:43:31 | After then ... | cfg.rb:41:1:45:3 | After case ... | | +| cfg.rb:43:16:43:31 | then ... | cfg.rb:43:21:43:31 | Before call to puts | | +| cfg.rb:43:21:43:31 | After call to puts | cfg.rb:43:16:43:31 | After then ... | | +| cfg.rb:43:21:43:31 | Before call to puts | cfg.rb:43:21:43:31 | self | | +| cfg.rb:43:21:43:31 | call to puts | cfg.rb:43:21:43:31 | After call to puts | | +| cfg.rb:43:21:43:31 | self | cfg.rb:43:26:43:31 | Before "some" | | +| cfg.rb:43:26:43:31 | "some" | cfg.rb:43:26:43:31 | After "some" | | +| cfg.rb:43:26:43:31 | After "some" | cfg.rb:43:21:43:31 | call to puts | | +| cfg.rb:43:26:43:31 | Before "some" | cfg.rb:43:27:43:30 | some | | | cfg.rb:43:27:43:30 | some | cfg.rb:43:26:43:31 | "some" | | -| cfg.rb:44:3:44:18 | else ... | cfg.rb:41:1:45:3 | case ... | | -| cfg.rb:44:8:44:18 | call to puts | cfg.rb:44:3:44:18 | else ... | | -| cfg.rb:44:8:44:18 | self | cfg.rb:44:14:44:17 | many | | -| cfg.rb:44:13:44:18 | "many" | cfg.rb:44:8:44:18 | call to puts | | +| cfg.rb:44:3:44:18 | After else ... | cfg.rb:41:1:45:3 | After case ... | | +| cfg.rb:44:3:44:18 | After else ... [match] | cfg.rb:44:3:44:18 | else ... | | +| cfg.rb:44:3:44:18 | else ... | cfg.rb:44:3:44:18 | After else ... [match] | match | +| cfg.rb:44:3:44:18 | else ... | cfg.rb:44:8:44:18 | Before call to puts | | +| cfg.rb:44:8:44:18 | After call to puts | cfg.rb:44:3:44:18 | After else ... | | +| cfg.rb:44:8:44:18 | Before call to puts | cfg.rb:44:8:44:18 | self | | +| cfg.rb:44:8:44:18 | call to puts | cfg.rb:44:8:44:18 | After call to puts | | +| cfg.rb:44:8:44:18 | self | cfg.rb:44:13:44:18 | Before "many" | | +| cfg.rb:44:13:44:18 | "many" | cfg.rb:44:13:44:18 | After "many" | | +| cfg.rb:44:13:44:18 | After "many" | cfg.rb:44:8:44:18 | call to puts | | +| cfg.rb:44:13:44:18 | Before "many" | cfg.rb:44:14:44:17 | many | | | cfg.rb:44:14:44:17 | many | cfg.rb:44:13:44:18 | "many" | | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:52:1:52:7 | chained | | -| cfg.rb:47:1:50:3 | true | cfg.rb:48:8:48:8 | b | | -| cfg.rb:48:3:48:29 | [match] when ... | cfg.rb:48:20:48:29 | self | match | -| cfg.rb:48:3:48:29 | [no-match] when ... | cfg.rb:49:8:49:8 | b | no-match | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:52:1:52:35 | Before ... = ... | | +| cfg.rb:47:1:50:3 | case ... | cfg.rb:47:1:50:3 | true | | +| cfg.rb:47:1:50:3 | true | cfg.rb:48:3:48:29 | when ... | | +| cfg.rb:48:3:48:29 | After when ... [match] | cfg.rb:48:15:48:29 | then ... | | +| cfg.rb:48:3:48:29 | After when ... [no-match] | cfg.rb:49:3:49:37 | when ... | | +| cfg.rb:48:3:48:29 | when ... | cfg.rb:48:8:48:13 | Before ... == ... | | | cfg.rb:48:8:48:8 | b | cfg.rb:48:13:48:13 | 1 | | -| cfg.rb:48:8:48:13 | ... == ... | cfg.rb:48:3:48:29 | [match] when ... | match | -| cfg.rb:48:8:48:13 | ... == ... | cfg.rb:48:3:48:29 | [no-match] when ... | no-match | +| cfg.rb:48:8:48:13 | ... == ... | cfg.rb:48:8:48:13 | After ... == ... [match] | match | +| cfg.rb:48:8:48:13 | ... == ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | no-match | +| cfg.rb:48:8:48:13 | After ... == ... [match] | cfg.rb:48:3:48:29 | After when ... [match] | match | +| cfg.rb:48:8:48:13 | After ... == ... [no-match] | cfg.rb:48:3:48:29 | After when ... [no-match] | no-match | +| cfg.rb:48:8:48:13 | Before ... == ... | cfg.rb:48:8:48:8 | b | | | cfg.rb:48:13:48:13 | 1 | cfg.rb:48:8:48:13 | ... == ... | | -| cfg.rb:48:15:48:29 | then ... | cfg.rb:47:1:50:3 | case ... | | -| cfg.rb:48:20:48:29 | call to puts | cfg.rb:48:15:48:29 | then ... | | -| cfg.rb:48:20:48:29 | self | cfg.rb:48:26:48:28 | one | | -| cfg.rb:48:25:48:29 | "one" | cfg.rb:48:20:48:29 | call to puts | | +| cfg.rb:48:15:48:29 | After then ... | cfg.rb:47:1:50:3 | After case ... | | +| cfg.rb:48:15:48:29 | then ... | cfg.rb:48:20:48:29 | Before call to puts | | +| cfg.rb:48:20:48:29 | After call to puts | cfg.rb:48:15:48:29 | After then ... | | +| cfg.rb:48:20:48:29 | Before call to puts | cfg.rb:48:20:48:29 | self | | +| cfg.rb:48:20:48:29 | call to puts | cfg.rb:48:20:48:29 | After call to puts | | +| cfg.rb:48:20:48:29 | self | cfg.rb:48:25:48:29 | Before "one" | | +| cfg.rb:48:25:48:29 | "one" | cfg.rb:48:25:48:29 | After "one" | | +| cfg.rb:48:25:48:29 | After "one" | cfg.rb:48:20:48:29 | call to puts | | +| cfg.rb:48:25:48:29 | Before "one" | cfg.rb:48:26:48:28 | one | | | cfg.rb:48:26:48:28 | one | cfg.rb:48:25:48:29 | "one" | | -| cfg.rb:49:3:49:37 | [match] when ... | cfg.rb:49:27:49:37 | self | match | -| cfg.rb:49:3:49:37 | [no-match] when ... | cfg.rb:47:1:50:3 | case ... | no-match | +| cfg.rb:49:3:49:37 | After when ... [match] | cfg.rb:49:22:49:37 | then ... | | +| cfg.rb:49:3:49:37 | After when ... [no-match] | cfg.rb:47:1:50:3 | After case ... | | +| cfg.rb:49:3:49:37 | when ... | cfg.rb:49:8:49:13 | Before ... == ... | | | cfg.rb:49:8:49:8 | b | cfg.rb:49:13:49:13 | 0 | | -| cfg.rb:49:8:49:13 | ... == ... | cfg.rb:49:3:49:37 | [match] when ... | match | -| cfg.rb:49:8:49:13 | ... == ... | cfg.rb:49:16:49:16 | b | no-match | +| cfg.rb:49:8:49:13 | ... == ... | cfg.rb:49:8:49:13 | After ... == ... [match] | match | +| cfg.rb:49:8:49:13 | ... == ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | no-match | +| cfg.rb:49:8:49:13 | After ... == ... [match] | cfg.rb:49:3:49:37 | After when ... [match] | match | +| cfg.rb:49:8:49:13 | After ... == ... [no-match] | cfg.rb:49:16:49:20 | Before ... > ... | | +| cfg.rb:49:8:49:13 | Before ... == ... | cfg.rb:49:8:49:8 | b | | | cfg.rb:49:13:49:13 | 0 | cfg.rb:49:8:49:13 | ... == ... | | | cfg.rb:49:16:49:16 | b | cfg.rb:49:20:49:20 | 1 | | -| cfg.rb:49:16:49:20 | ... > ... | cfg.rb:49:3:49:37 | [match] when ... | match | -| cfg.rb:49:16:49:20 | ... > ... | cfg.rb:49:3:49:37 | [no-match] when ... | no-match | +| cfg.rb:49:16:49:20 | ... > ... | cfg.rb:49:16:49:20 | After ... > ... [match] | match | +| cfg.rb:49:16:49:20 | ... > ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | no-match | +| cfg.rb:49:16:49:20 | After ... > ... [match] | cfg.rb:49:3:49:37 | After when ... [match] | match | +| cfg.rb:49:16:49:20 | After ... > ... [no-match] | cfg.rb:49:3:49:37 | After when ... [no-match] | no-match | +| cfg.rb:49:16:49:20 | Before ... > ... | cfg.rb:49:16:49:16 | b | | | cfg.rb:49:20:49:20 | 1 | cfg.rb:49:16:49:20 | ... > ... | | -| cfg.rb:49:22:49:37 | then ... | cfg.rb:47:1:50:3 | case ... | | -| cfg.rb:49:27:49:37 | call to puts | cfg.rb:49:22:49:37 | then ... | | -| cfg.rb:49:27:49:37 | self | cfg.rb:49:33:49:36 | some | | -| cfg.rb:49:32:49:37 | "some" | cfg.rb:49:27:49:37 | call to puts | | +| cfg.rb:49:22:49:37 | After then ... | cfg.rb:47:1:50:3 | After case ... | | +| cfg.rb:49:22:49:37 | then ... | cfg.rb:49:27:49:37 | Before call to puts | | +| cfg.rb:49:27:49:37 | After call to puts | cfg.rb:49:22:49:37 | After then ... | | +| cfg.rb:49:27:49:37 | Before call to puts | cfg.rb:49:27:49:37 | self | | +| cfg.rb:49:27:49:37 | call to puts | cfg.rb:49:27:49:37 | After call to puts | | +| cfg.rb:49:27:49:37 | self | cfg.rb:49:32:49:37 | Before "some" | | +| cfg.rb:49:32:49:37 | "some" | cfg.rb:49:32:49:37 | After "some" | | +| cfg.rb:49:32:49:37 | After "some" | cfg.rb:49:27:49:37 | call to puts | | +| cfg.rb:49:32:49:37 | Before "some" | cfg.rb:49:33:49:36 | some | | | cfg.rb:49:33:49:36 | some | cfg.rb:49:32:49:37 | "some" | | -| cfg.rb:52:1:52:7 | chained | cfg.rb:52:12:52:12 | a | | -| cfg.rb:52:1:52:35 | ... = ... | cfg.rb:54:1:54:9 | character | | -| cfg.rb:52:11:52:13 | "a" | cfg.rb:52:18:52:24 | chained | | -| cfg.rb:52:11:52:35 | "..." "..." | cfg.rb:52:1:52:35 | ... = ... | | +| cfg.rb:52:1:52:7 | chained | cfg.rb:52:11:52:35 | Before "..." "..." | | +| cfg.rb:52:1:52:35 | ... = ... | cfg.rb:52:1:52:35 | After ... = ... | | +| cfg.rb:52:1:52:35 | After ... = ... | cfg.rb:54:1:54:17 | Before ... = ... | | +| cfg.rb:52:1:52:35 | Before ... = ... | cfg.rb:52:1:52:7 | chained | | +| cfg.rb:52:11:52:13 | "a" | cfg.rb:52:11:52:13 | After "a" | | +| cfg.rb:52:11:52:13 | After "a" | cfg.rb:52:15:52:26 | Before "#{...}" | | +| cfg.rb:52:11:52:13 | Before "a" | cfg.rb:52:12:52:12 | a | | +| cfg.rb:52:11:52:35 | "..." "..." | cfg.rb:52:11:52:35 | After "..." "..." | | +| cfg.rb:52:11:52:35 | After "..." "..." | cfg.rb:52:1:52:35 | ... = ... | | +| cfg.rb:52:11:52:35 | Before "..." "..." | cfg.rb:52:11:52:13 | Before "a" | | | cfg.rb:52:12:52:12 | a | cfg.rb:52:11:52:13 | "a" | | -| cfg.rb:52:15:52:26 | "#{...}" | cfg.rb:52:29:52:34 | string | | -| cfg.rb:52:16:52:25 | #{...} | cfg.rb:52:15:52:26 | "#{...}" | | -| cfg.rb:52:18:52:24 | chained | cfg.rb:52:16:52:25 | #{...} | | -| cfg.rb:52:28:52:35 | "string" | cfg.rb:52:11:52:35 | "..." "..." | | +| cfg.rb:52:15:52:26 | "#{...}" | cfg.rb:52:15:52:26 | After "#{...}" | | +| cfg.rb:52:15:52:26 | After "#{...}" | cfg.rb:52:28:52:35 | Before "string" | | +| cfg.rb:52:15:52:26 | Before "#{...}" | cfg.rb:52:16:52:25 | #{...} | | +| cfg.rb:52:16:52:25 | #{...} | cfg.rb:52:18:52:24 | chained | | +| cfg.rb:52:16:52:25 | After #{...} | cfg.rb:52:15:52:26 | "#{...}" | | +| cfg.rb:52:18:52:24 | chained | cfg.rb:52:16:52:25 | After #{...} | | +| cfg.rb:52:28:52:35 | "string" | cfg.rb:52:28:52:35 | After "string" | | +| cfg.rb:52:28:52:35 | After "string" | cfg.rb:52:11:52:35 | "..." "..." | | +| cfg.rb:52:28:52:35 | Before "string" | cfg.rb:52:29:52:34 | string | | | cfg.rb:52:29:52:34 | string | cfg.rb:52:28:52:35 | "string" | | | cfg.rb:54:1:54:9 | character | cfg.rb:54:13:54:17 | ?\\x40 | | -| cfg.rb:54:1:54:17 | ... = ... | cfg.rb:58:1:72:3 | Silly | | +| cfg.rb:54:1:54:17 | ... = ... | cfg.rb:54:1:54:17 | After ... = ... | | +| cfg.rb:54:1:54:17 | After ... = ... | cfg.rb:58:1:72:3 | Silly | | +| cfg.rb:54:1:54:17 | Before ... = ... | cfg.rb:54:1:54:9 | character | | | cfg.rb:54:13:54:17 | ?\\x40 | cfg.rb:54:1:54:17 | ... = ... | | +| cfg.rb:58:1:72:3 | After Silly | cfg.rb:74:1:74:6 | Before ... = ... | | | cfg.rb:58:1:72:3 | Silly | cfg.rb:58:15:58:20 | Object | | -| cfg.rb:58:15:58:20 | Object | cfg.rb:59:3:59:9 | complex | | -| cfg.rb:59:3:59:9 | complex | cfg.rb:59:13:59:14 | 10 | | -| cfg.rb:59:3:59:17 | ... = ... | cfg.rb:60:3:60:13 | conditional | | +| cfg.rb:58:15:58:20 | Object | cfg.rb:59:3:59:17 | Before ... = ... | | +| cfg.rb:59:3:59:9 | complex | cfg.rb:59:13:59:17 | Before ... - ... | | +| cfg.rb:59:3:59:17 | ... = ... | cfg.rb:59:3:59:17 | After ... = ... | | +| cfg.rb:59:3:59:17 | After ... = ... | cfg.rb:60:3:60:40 | Before ... = ... | | +| cfg.rb:59:3:59:17 | Before ... = ... | cfg.rb:59:3:59:9 | complex | | | cfg.rb:59:13:59:14 | 10 | cfg.rb:59:16:59:17 | 2i | | -| cfg.rb:59:13:59:17 | ... - ... | cfg.rb:59:3:59:17 | ... = ... | | +| cfg.rb:59:13:59:17 | ... - ... | cfg.rb:59:13:59:17 | After ... - ... | | +| cfg.rb:59:13:59:17 | After ... - ... | cfg.rb:59:3:59:17 | ... = ... | | +| cfg.rb:59:13:59:17 | Before ... - ... | cfg.rb:59:13:59:14 | 10 | | | cfg.rb:59:16:59:17 | 2i | cfg.rb:59:13:59:17 | ... - ... | | -| cfg.rb:60:3:60:13 | conditional | cfg.rb:60:17:60:17 | self | | -| cfg.rb:60:3:60:40 | ... = ... | cfg.rb:61:3:61:3 | C | | -| cfg.rb:60:17:60:17 | call to b | cfg.rb:60:21:60:22 | 10 | | +| cfg.rb:60:3:60:13 | conditional | cfg.rb:60:17:60:40 | ... ? ... : ... | | +| cfg.rb:60:3:60:40 | ... = ... | cfg.rb:60:3:60:40 | After ... = ... | | +| cfg.rb:60:3:60:40 | After ... = ... | cfg.rb:61:3:61:16 | Before ... = ... | | +| cfg.rb:60:3:60:40 | Before ... = ... | cfg.rb:60:3:60:13 | conditional | | +| cfg.rb:60:17:60:17 | After call to b | cfg.rb:60:21:60:22 | 10 | | +| cfg.rb:60:17:60:17 | Before call to b | cfg.rb:60:17:60:17 | self | | +| cfg.rb:60:17:60:17 | call to b | cfg.rb:60:17:60:17 | After call to b | | | cfg.rb:60:17:60:17 | self | cfg.rb:60:17:60:17 | call to b | | -| cfg.rb:60:17:60:22 | ... < ... | cfg.rb:60:27:60:31 | hello | true | -| cfg.rb:60:17:60:22 | ... < ... | cfg.rb:60:37:60:39 | bye | false | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:60:3:60:40 | ... = ... | | +| cfg.rb:60:17:60:22 | ... < ... | cfg.rb:60:17:60:22 | After ... < ... [false] | false | +| cfg.rb:60:17:60:22 | ... < ... | cfg.rb:60:17:60:22 | After ... < ... [true] | true | +| cfg.rb:60:17:60:22 | After ... < ... [false] | cfg.rb:60:36:60:40 | Before "bye" | | +| cfg.rb:60:17:60:22 | After ... < ... [true] | cfg.rb:60:26:60:32 | Before "hello" | | +| cfg.rb:60:17:60:22 | Before ... < ... | cfg.rb:60:17:60:17 | Before call to b | | +| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:60:17:60:22 | Before ... < ... | | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:60:3:60:40 | ... = ... | | | cfg.rb:60:21:60:22 | 10 | cfg.rb:60:17:60:22 | ... < ... | | -| cfg.rb:60:26:60:32 | "hello" | cfg.rb:60:17:60:40 | ... ? ... : ... | | +| cfg.rb:60:26:60:32 | "hello" | cfg.rb:60:26:60:32 | After "hello" | | +| cfg.rb:60:26:60:32 | After "hello" | cfg.rb:60:17:60:40 | After ... ? ... : ... | | +| cfg.rb:60:26:60:32 | Before "hello" | cfg.rb:60:27:60:31 | hello | | | cfg.rb:60:27:60:31 | hello | cfg.rb:60:26:60:32 | "hello" | | -| cfg.rb:60:36:60:40 | "bye" | cfg.rb:60:17:60:40 | ... ? ... : ... | | +| cfg.rb:60:36:60:40 | "bye" | cfg.rb:60:36:60:40 | After "bye" | | +| cfg.rb:60:36:60:40 | After "bye" | cfg.rb:60:17:60:40 | After ... ? ... : ... | | +| cfg.rb:60:36:60:40 | Before "bye" | cfg.rb:60:37:60:39 | bye | | | cfg.rb:60:37:60:39 | bye | cfg.rb:60:36:60:40 | "bye" | | -| cfg.rb:61:3:61:3 | C | cfg.rb:61:8:61:15 | constant | | -| cfg.rb:61:3:61:16 | ... = ... | cfg.rb:62:17:62:27 | __synth__2 | | -| cfg.rb:61:7:61:16 | "constant" | cfg.rb:61:3:61:16 | ... = ... | | +| cfg.rb:61:3:61:3 | C | cfg.rb:61:7:61:16 | Before "constant" | | +| cfg.rb:61:3:61:16 | ... = ... | cfg.rb:61:3:61:16 | After ... = ... | | +| cfg.rb:61:3:61:16 | After ... = ... | cfg.rb:62:3:62:27 | ... | | +| cfg.rb:61:3:61:16 | Before ... = ... | cfg.rb:61:3:61:3 | C | | +| cfg.rb:61:7:61:16 | "constant" | cfg.rb:61:7:61:16 | After "constant" | | +| cfg.rb:61:7:61:16 | After "constant" | cfg.rb:61:3:61:16 | ... = ... | | +| cfg.rb:61:7:61:16 | Before "constant" | cfg.rb:61:8:61:15 | constant | | | cfg.rb:61:8:61:15 | constant | cfg.rb:61:7:61:16 | "constant" | | -| cfg.rb:62:3:62:27 | ... | cfg.rb:63:3:66:5 | pattern | | +| cfg.rb:62:3:62:27 | ... | cfg.rb:62:17:62:27 | Before ... = ... | | +| cfg.rb:62:3:62:27 | After ... | cfg.rb:63:3:66:5 | pattern | | | cfg.rb:62:4:62:4 | 0 | cfg.rb:62:4:62:4 | call to [] | | -| cfg.rb:62:4:62:4 | ... = ... | cfg.rb:62:7:62:12 | __synth__2__1 | | +| cfg.rb:62:4:62:4 | ... = ... | cfg.rb:62:4:62:4 | After ... = ... | | +| cfg.rb:62:4:62:4 | After ... = ... | cfg.rb:62:7:62:12 | ... | | +| cfg.rb:62:4:62:4 | After call to [] | cfg.rb:62:4:62:4 | ... = ... | | +| cfg.rb:62:4:62:4 | Before ... = ... | cfg.rb:62:4:62:4 | x | | +| cfg.rb:62:4:62:4 | Before call to [] | cfg.rb:62:4:62:4 | __synth__2 | | | cfg.rb:62:4:62:4 | __synth__2 | cfg.rb:62:4:62:4 | 0 | | -| cfg.rb:62:4:62:4 | call to [] | cfg.rb:62:4:62:4 | ... = ... | | -| cfg.rb:62:4:62:4 | x | cfg.rb:62:4:62:4 | __synth__2 | | +| cfg.rb:62:4:62:4 | call to [] | cfg.rb:62:4:62:4 | After call to [] | | +| cfg.rb:62:4:62:4 | x | cfg.rb:62:4:62:4 | Before call to [] | | | cfg.rb:62:7:62:12 | 1 | cfg.rb:62:7:62:12 | call to [] | | -| cfg.rb:62:7:62:12 | * ... | cfg.rb:62:7:62:12 | ... = ... | | -| cfg.rb:62:7:62:12 | ... | cfg.rb:62:3:62:27 | ... | | -| cfg.rb:62:7:62:12 | ... = ... | cfg.rb:62:8:62:8 | y | | +| cfg.rb:62:7:62:12 | * ... | cfg.rb:62:7:62:12 | After * ... | | +| cfg.rb:62:7:62:12 | ... | cfg.rb:62:7:62:12 | Before ... = ... | | +| cfg.rb:62:7:62:12 | ... = ... | cfg.rb:62:7:62:12 | After ... = ... | | +| cfg.rb:62:7:62:12 | After * ... | cfg.rb:62:7:62:12 | ... = ... | | +| cfg.rb:62:7:62:12 | After ... | cfg.rb:62:3:62:27 | After ... | | +| cfg.rb:62:7:62:12 | After ... = ... | cfg.rb:62:8:62:8 | Before ... = ... | | +| cfg.rb:62:7:62:12 | After call to [] | cfg.rb:62:7:62:12 | * ... | | +| cfg.rb:62:7:62:12 | Before * ... | cfg.rb:62:7:62:12 | Before call to [] | | +| cfg.rb:62:7:62:12 | Before ... = ... | cfg.rb:62:7:62:12 | __synth__2__1 | | +| cfg.rb:62:7:62:12 | Before call to [] | cfg.rb:62:7:62:12 | __synth__2 | | | cfg.rb:62:7:62:12 | __synth__2 | cfg.rb:62:7:62:12 | 1 | | -| cfg.rb:62:7:62:12 | __synth__2__1 | cfg.rb:62:7:62:12 | __synth__2 | | -| cfg.rb:62:7:62:12 | call to [] | cfg.rb:62:7:62:12 | * ... | | +| cfg.rb:62:7:62:12 | __synth__2__1 | cfg.rb:62:7:62:12 | Before * ... | | +| cfg.rb:62:7:62:12 | call to [] | cfg.rb:62:7:62:12 | After call to [] | | | cfg.rb:62:8:62:8 | 0 | cfg.rb:62:8:62:8 | call to [] | | -| cfg.rb:62:8:62:8 | ... = ... | cfg.rb:62:11:62:11 | z | | +| cfg.rb:62:8:62:8 | ... = ... | cfg.rb:62:8:62:8 | After ... = ... | | +| cfg.rb:62:8:62:8 | After ... = ... | cfg.rb:62:11:62:11 | Before ... = ... | | +| cfg.rb:62:8:62:8 | After call to [] | cfg.rb:62:8:62:8 | ... = ... | | +| cfg.rb:62:8:62:8 | Before ... = ... | cfg.rb:62:8:62:8 | y | | +| cfg.rb:62:8:62:8 | Before call to [] | cfg.rb:62:8:62:8 | __synth__2__1 | | | cfg.rb:62:8:62:8 | __synth__2__1 | cfg.rb:62:8:62:8 | 0 | | -| cfg.rb:62:8:62:8 | call to [] | cfg.rb:62:8:62:8 | ... = ... | | -| cfg.rb:62:8:62:8 | y | cfg.rb:62:8:62:8 | __synth__2__1 | | +| cfg.rb:62:8:62:8 | call to [] | cfg.rb:62:8:62:8 | After call to [] | | +| cfg.rb:62:8:62:8 | y | cfg.rb:62:8:62:8 | Before call to [] | | | cfg.rb:62:11:62:11 | 1 | cfg.rb:62:11:62:11 | call to [] | | -| cfg.rb:62:11:62:11 | ... = ... | cfg.rb:62:7:62:12 | ... | | +| cfg.rb:62:11:62:11 | ... = ... | cfg.rb:62:11:62:11 | After ... = ... | | +| cfg.rb:62:11:62:11 | After ... = ... | cfg.rb:62:7:62:12 | After ... | | +| cfg.rb:62:11:62:11 | After call to [] | cfg.rb:62:11:62:11 | ... = ... | | +| cfg.rb:62:11:62:11 | Before ... = ... | cfg.rb:62:11:62:11 | z | | +| cfg.rb:62:11:62:11 | Before call to [] | cfg.rb:62:11:62:11 | __synth__2__1 | | | cfg.rb:62:11:62:11 | __synth__2__1 | cfg.rb:62:11:62:11 | 1 | | -| cfg.rb:62:11:62:11 | call to [] | cfg.rb:62:11:62:11 | ... = ... | | -| cfg.rb:62:11:62:11 | z | cfg.rb:62:11:62:11 | __synth__2__1 | | -| cfg.rb:62:17:62:27 | * ... | cfg.rb:62:17:62:27 | ... = ... | | -| cfg.rb:62:17:62:27 | ... = ... | cfg.rb:62:4:62:4 | x | | +| cfg.rb:62:11:62:11 | call to [] | cfg.rb:62:11:62:11 | After call to [] | | +| cfg.rb:62:11:62:11 | z | cfg.rb:62:11:62:11 | Before call to [] | | +| cfg.rb:62:17:62:27 | * ... | cfg.rb:62:17:62:27 | After * ... | | +| cfg.rb:62:17:62:27 | ... = ... | cfg.rb:62:17:62:27 | After ... = ... | | +| cfg.rb:62:17:62:27 | After * ... | cfg.rb:62:17:62:27 | ... = ... | | +| cfg.rb:62:17:62:27 | After ... = ... | cfg.rb:62:4:62:4 | Before ... = ... | | +| cfg.rb:62:17:62:27 | After call to [] | cfg.rb:62:17:62:27 | * ... | | | cfg.rb:62:17:62:27 | Array | cfg.rb:62:18:62:18 | 1 | | -| cfg.rb:62:17:62:27 | __synth__2 | cfg.rb:62:17:62:27 | Array | | -| cfg.rb:62:17:62:27 | call to [] | cfg.rb:62:17:62:27 | * ... | | -| cfg.rb:62:18:62:18 | 1 | cfg.rb:62:21:62:26 | Array | | +| cfg.rb:62:17:62:27 | Before * ... | cfg.rb:62:17:62:27 | Before call to [] | | +| cfg.rb:62:17:62:27 | Before ... = ... | cfg.rb:62:17:62:27 | __synth__2 | | +| cfg.rb:62:17:62:27 | Before call to [] | cfg.rb:62:17:62:27 | Array | | +| cfg.rb:62:17:62:27 | __synth__2 | cfg.rb:62:17:62:27 | Before * ... | | +| cfg.rb:62:17:62:27 | call to [] | cfg.rb:62:17:62:27 | After call to [] | | +| cfg.rb:62:18:62:18 | 1 | cfg.rb:62:21:62:26 | Before call to [] | | +| cfg.rb:62:21:62:26 | After call to [] | cfg.rb:62:17:62:27 | call to [] | | | cfg.rb:62:21:62:26 | Array | cfg.rb:62:22:62:22 | 2 | | -| cfg.rb:62:21:62:26 | call to [] | cfg.rb:62:17:62:27 | call to [] | | +| cfg.rb:62:21:62:26 | Before call to [] | cfg.rb:62:21:62:26 | Array | | +| cfg.rb:62:21:62:26 | call to [] | cfg.rb:62:21:62:26 | After call to [] | | | cfg.rb:62:22:62:22 | 2 | cfg.rb:62:25:62:25 | 3 | | | cfg.rb:62:25:62:25 | 3 | cfg.rb:62:21:62:26 | call to [] | | -| cfg.rb:63:3:66:5 | enter pattern | cfg.rb:63:17:63:17 | a | | -| cfg.rb:63:3:66:5 | exit pattern (normal) | cfg.rb:63:3:66:5 | exit pattern | | -| cfg.rb:63:3:66:5 | pattern | cfg.rb:67:3:67:7 | items | | -| cfg.rb:63:16:63:20 | (..., ...) | cfg.rb:64:5:64:10 | self | | +| cfg.rb:63:3:66:5 | Entry | cfg.rb:63:16:63:20 | (..., ...) | | +| cfg.rb:63:3:66:5 | Normal Exit | cfg.rb:63:3:66:5 | Exit | | +| cfg.rb:63:3:66:5 | pattern | cfg.rb:67:3:67:19 | Before ... = ... | | +| cfg.rb:63:16:63:20 | (..., ...) | cfg.rb:63:17:63:17 | a | | +| cfg.rb:63:16:63:20 | After (..., ...) | cfg.rb:64:5:65:10 | ... | | | cfg.rb:63:17:63:17 | a | cfg.rb:63:19:63:19 | b | | -| cfg.rb:63:19:63:19 | b | cfg.rb:63:16:63:20 | (..., ...) | | -| cfg.rb:64:5:64:10 | call to puts | cfg.rb:65:5:65:10 | self | | +| cfg.rb:63:19:63:19 | b | cfg.rb:63:16:63:20 | After (..., ...) | | +| cfg.rb:64:5:64:10 | After call to puts | cfg.rb:65:5:65:10 | Before call to puts | | +| cfg.rb:64:5:64:10 | Before call to puts | cfg.rb:64:5:64:10 | self | | +| cfg.rb:64:5:64:10 | call to puts | cfg.rb:64:5:64:10 | After call to puts | | | cfg.rb:64:5:64:10 | self | cfg.rb:64:10:64:10 | a | | +| cfg.rb:64:5:65:10 | ... | cfg.rb:64:5:64:10 | Before call to puts | | +| cfg.rb:64:5:65:10 | After ... | cfg.rb:63:3:66:5 | Normal Exit | | | cfg.rb:64:10:64:10 | a | cfg.rb:64:5:64:10 | call to puts | | -| cfg.rb:65:5:65:10 | call to puts | cfg.rb:63:3:66:5 | exit pattern (normal) | | +| cfg.rb:65:5:65:10 | After call to puts | cfg.rb:64:5:65:10 | After ... | | +| cfg.rb:65:5:65:10 | Before call to puts | cfg.rb:65:5:65:10 | self | | +| cfg.rb:65:5:65:10 | call to puts | cfg.rb:65:5:65:10 | After call to puts | | | cfg.rb:65:5:65:10 | self | cfg.rb:65:10:65:10 | b | | | cfg.rb:65:10:65:10 | b | cfg.rb:65:5:65:10 | call to puts | | -| cfg.rb:67:3:67:7 | items | cfg.rb:67:11:67:19 | Array | | -| cfg.rb:67:3:67:19 | ... = ... | cfg.rb:68:3:68:15 | self | | +| cfg.rb:67:3:67:7 | items | cfg.rb:67:11:67:19 | Before call to [] | | +| cfg.rb:67:3:67:19 | ... = ... | cfg.rb:67:3:67:19 | After ... = ... | | +| cfg.rb:67:3:67:19 | After ... = ... | cfg.rb:68:3:68:15 | Before call to puts | | +| cfg.rb:67:3:67:19 | Before ... = ... | cfg.rb:67:3:67:7 | items | | +| cfg.rb:67:11:67:19 | After call to [] | cfg.rb:67:3:67:19 | ... = ... | | | cfg.rb:67:11:67:19 | Array | cfg.rb:67:12:67:12 | 1 | | -| cfg.rb:67:11:67:19 | call to [] | cfg.rb:67:3:67:19 | ... = ... | | +| cfg.rb:67:11:67:19 | Before call to [] | cfg.rb:67:11:67:19 | Array | | +| cfg.rb:67:11:67:19 | call to [] | cfg.rb:67:11:67:19 | After call to [] | | | cfg.rb:67:12:67:12 | 1 | cfg.rb:67:15:67:15 | 2 | | | cfg.rb:67:15:67:15 | 2 | cfg.rb:67:18:67:18 | 3 | | | cfg.rb:67:18:67:18 | 3 | cfg.rb:67:11:67:19 | call to [] | | -| cfg.rb:68:3:68:15 | call to puts | cfg.rb:69:3:71:5 | print | | -| cfg.rb:68:3:68:15 | self | cfg.rb:68:8:68:12 | items | | +| cfg.rb:68:3:68:15 | After call to puts | cfg.rb:69:3:71:5 | print | | +| cfg.rb:68:3:68:15 | Before call to puts | cfg.rb:68:3:68:15 | self | | +| cfg.rb:68:3:68:15 | call to puts | cfg.rb:68:3:68:15 | After call to puts | | +| cfg.rb:68:3:68:15 | self | cfg.rb:68:8:68:15 | Before ...[...] | | | cfg.rb:68:8:68:12 | items | cfg.rb:68:14:68:14 | 2 | | -| cfg.rb:68:8:68:15 | ...[...] | cfg.rb:68:3:68:15 | call to puts | | +| cfg.rb:68:8:68:15 | ...[...] | cfg.rb:68:8:68:15 | After ...[...] | | +| cfg.rb:68:8:68:15 | After ...[...] | cfg.rb:68:3:68:15 | call to puts | | +| cfg.rb:68:8:68:15 | Before ...[...] | cfg.rb:68:8:68:12 | items | | | cfg.rb:68:14:68:14 | 2 | cfg.rb:68:8:68:15 | ...[...] | | -| cfg.rb:69:3:71:5 | enter print | cfg.rb:70:5:70:16 | self | | -| cfg.rb:69:3:71:5 | exit print (normal) | cfg.rb:69:3:71:5 | exit print | | -| cfg.rb:69:3:71:5 | print | cfg.rb:74:1:74:1 | x | | -| cfg.rb:70:5:70:16 | call to puts | cfg.rb:69:3:71:5 | exit print (normal) | | -| cfg.rb:70:5:70:16 | self | cfg.rb:70:11:70:15 | silly | | -| cfg.rb:70:10:70:16 | "silly" | cfg.rb:70:5:70:16 | call to puts | | +| cfg.rb:69:3:71:5 | Entry | cfg.rb:70:5:70:16 | ... | | +| cfg.rb:69:3:71:5 | Normal Exit | cfg.rb:69:3:71:5 | Exit | | +| cfg.rb:69:3:71:5 | print | cfg.rb:58:1:72:3 | After Silly | | +| cfg.rb:70:5:70:16 | ... | cfg.rb:70:5:70:16 | Before call to puts | | +| cfg.rb:70:5:70:16 | After ... | cfg.rb:69:3:71:5 | Normal Exit | | +| cfg.rb:70:5:70:16 | After call to puts | cfg.rb:70:5:70:16 | After ... | | +| cfg.rb:70:5:70:16 | Before call to puts | cfg.rb:70:5:70:16 | self | | +| cfg.rb:70:5:70:16 | call to puts | cfg.rb:70:5:70:16 | After call to puts | | +| cfg.rb:70:5:70:16 | self | cfg.rb:70:10:70:16 | Before "silly" | | +| cfg.rb:70:10:70:16 | "silly" | cfg.rb:70:10:70:16 | After "silly" | | +| cfg.rb:70:10:70:16 | After "silly" | cfg.rb:70:5:70:16 | call to puts | | +| cfg.rb:70:10:70:16 | Before "silly" | cfg.rb:70:11:70:15 | silly | | | cfg.rb:70:11:70:15 | silly | cfg.rb:70:10:70:16 | "silly" | | | cfg.rb:74:1:74:1 | x | cfg.rb:74:5:74:6 | 42 | | -| cfg.rb:74:1:74:6 | ... = ... | cfg.rb:75:4:75:4 | x | | +| cfg.rb:74:1:74:6 | ... = ... | cfg.rb:74:1:74:6 | After ... = ... | | +| cfg.rb:74:1:74:6 | After ... = ... | cfg.rb:75:1:75:47 | if ... | | +| cfg.rb:74:1:74:6 | Before ... = ... | cfg.rb:74:1:74:1 | x | | | cfg.rb:74:5:74:6 | 42 | cfg.rb:74:1:74:6 | ... = ... | | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:78:3:78:3 | ; | | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:77:1:86:3 | begin ... | | +| cfg.rb:75:1:75:47 | if ... | cfg.rb:75:4:75:8 | Before ... < ... | | | cfg.rb:75:4:75:4 | x | cfg.rb:75:8:75:8 | 0 | | -| cfg.rb:75:4:75:8 | ... < ... | cfg.rb:75:15:75:15 | 0 | true | -| cfg.rb:75:4:75:8 | ... < ... | cfg.rb:75:23:75:23 | x | false | +| cfg.rb:75:4:75:8 | ... < ... | cfg.rb:75:4:75:8 | After ... < ... [false] | false | +| cfg.rb:75:4:75:8 | ... < ... | cfg.rb:75:4:75:8 | After ... < ... [true] | true | +| cfg.rb:75:4:75:8 | After ... < ... [false] | cfg.rb:75:17:75:43 | elsif ... | | +| cfg.rb:75:4:75:8 | After ... < ... [true] | cfg.rb:75:10:75:15 | then ... | | +| cfg.rb:75:4:75:8 | Before ... < ... | cfg.rb:75:4:75:4 | x | | | cfg.rb:75:8:75:8 | 0 | cfg.rb:75:4:75:8 | ... < ... | | -| cfg.rb:75:10:75:15 | then ... | cfg.rb:75:1:75:47 | if ... | | -| cfg.rb:75:15:75:15 | 0 | cfg.rb:75:10:75:15 | then ... | | -| cfg.rb:75:17:75:43 | elsif ... | cfg.rb:75:1:75:47 | if ... | | +| cfg.rb:75:10:75:15 | After then ... | cfg.rb:75:1:75:47 | After if ... | | +| cfg.rb:75:10:75:15 | then ... | cfg.rb:75:15:75:15 | 0 | | +| cfg.rb:75:15:75:15 | 0 | cfg.rb:75:10:75:15 | After then ... | | +| cfg.rb:75:17:75:43 | After elsif ... | cfg.rb:75:1:75:47 | After if ... | | +| cfg.rb:75:17:75:43 | elsif ... | cfg.rb:75:23:75:28 | Before ... > ... | | | cfg.rb:75:23:75:23 | x | cfg.rb:75:27:75:28 | 10 | | -| cfg.rb:75:23:75:28 | ... > ... | cfg.rb:75:35:75:36 | 10 | true | -| cfg.rb:75:23:75:28 | ... > ... | cfg.rb:75:43:75:43 | x | false | +| cfg.rb:75:23:75:28 | ... > ... | cfg.rb:75:23:75:28 | After ... > ... [false] | false | +| cfg.rb:75:23:75:28 | ... > ... | cfg.rb:75:23:75:28 | After ... > ... [true] | true | +| cfg.rb:75:23:75:28 | After ... > ... [false] | cfg.rb:75:38:75:43 | else ... | | +| cfg.rb:75:23:75:28 | After ... > ... [true] | cfg.rb:75:30:75:36 | then ... | | +| cfg.rb:75:23:75:28 | Before ... > ... | cfg.rb:75:23:75:23 | x | | | cfg.rb:75:27:75:28 | 10 | cfg.rb:75:23:75:28 | ... > ... | | -| cfg.rb:75:30:75:36 | then ... | cfg.rb:75:17:75:43 | elsif ... | | -| cfg.rb:75:35:75:36 | 10 | cfg.rb:75:30:75:36 | then ... | | -| cfg.rb:75:38:75:43 | else ... | cfg.rb:75:17:75:43 | elsif ... | | -| cfg.rb:75:43:75:43 | x | cfg.rb:75:38:75:43 | else ... | | -| cfg.rb:78:3:78:3 | ; | cfg.rb:83:3:83:11 | self | | -| cfg.rb:82:1:83:11 | else ... | cfg.rb:85:3:85:12 | self | | -| cfg.rb:83:3:83:11 | call to puts | cfg.rb:82:1:83:11 | else ... | | -| cfg.rb:83:3:83:11 | self | cfg.rb:83:9:83:10 | ok | | -| cfg.rb:83:8:83:11 | "ok" | cfg.rb:83:3:83:11 | call to puts | | +| cfg.rb:75:30:75:36 | After then ... | cfg.rb:75:17:75:43 | After elsif ... | | +| cfg.rb:75:30:75:36 | then ... | cfg.rb:75:35:75:36 | 10 | | +| cfg.rb:75:35:75:36 | 10 | cfg.rb:75:30:75:36 | After then ... | | +| cfg.rb:75:38:75:43 | After else ... | cfg.rb:75:17:75:43 | After elsif ... | | +| cfg.rb:75:38:75:43 | else ... | cfg.rb:75:43:75:43 | x | | +| cfg.rb:75:43:75:43 | x | cfg.rb:75:38:75:43 | After else ... | | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:88:1:88:23 | Before ... = ... | | +| cfg.rb:77:1:86:3 | begin ... | cfg.rb:78:3:78:3 | ; | | +| cfg.rb:78:3:78:3 | ; | cfg.rb:82:1:83:11 | else ... | | +| cfg.rb:82:1:83:11 | After else ... | cfg.rb:84:1:85:12 | ensure ... | | +| cfg.rb:82:1:83:11 | else ... | cfg.rb:83:3:83:11 | Before call to puts | | +| cfg.rb:83:3:83:11 | After call to puts | cfg.rb:82:1:83:11 | After else ... | | +| cfg.rb:83:3:83:11 | Before call to puts | cfg.rb:83:3:83:11 | self | | +| cfg.rb:83:3:83:11 | call to puts | cfg.rb:83:3:83:11 | After call to puts | | +| cfg.rb:83:3:83:11 | self | cfg.rb:83:8:83:11 | Before "ok" | | +| cfg.rb:83:8:83:11 | "ok" | cfg.rb:83:8:83:11 | After "ok" | | +| cfg.rb:83:8:83:11 | After "ok" | cfg.rb:83:3:83:11 | call to puts | | +| cfg.rb:83:8:83:11 | Before "ok" | cfg.rb:83:9:83:10 | ok | | | cfg.rb:83:9:83:10 | ok | cfg.rb:83:8:83:11 | "ok" | | -| cfg.rb:84:1:85:12 | ensure ... | cfg.rb:88:1:88:6 | escape | | -| cfg.rb:85:3:85:12 | call to puts | cfg.rb:84:1:85:12 | ensure ... | | -| cfg.rb:85:3:85:12 | self | cfg.rb:85:9:85:11 | end | | -| cfg.rb:85:8:85:12 | "end" | cfg.rb:85:3:85:12 | call to puts | | +| cfg.rb:84:1:85:12 | After ensure ... | cfg.rb:1:1:221:1 | Exceptional Exit | exception | +| cfg.rb:84:1:85:12 | After ensure ... | cfg.rb:77:1:86:3 | After begin ... | | +| cfg.rb:84:1:85:12 | ensure ... | cfg.rb:85:3:85:12 | Before call to puts | | +| cfg.rb:85:3:85:12 | After call to puts | cfg.rb:84:1:85:12 | After ensure ... | | +| cfg.rb:85:3:85:12 | Before call to puts | cfg.rb:85:3:85:12 | self | | +| cfg.rb:85:3:85:12 | call to puts | cfg.rb:85:3:85:12 | After call to puts | | +| cfg.rb:85:3:85:12 | self | cfg.rb:85:8:85:12 | Before "end" | | +| cfg.rb:85:8:85:12 | "end" | cfg.rb:85:8:85:12 | After "end" | | +| cfg.rb:85:8:85:12 | After "end" | cfg.rb:85:3:85:12 | call to puts | | +| cfg.rb:85:8:85:12 | Before "end" | cfg.rb:85:9:85:11 | end | | | cfg.rb:85:9:85:11 | end | cfg.rb:85:8:85:12 | "end" | | -| cfg.rb:88:1:88:6 | escape | cfg.rb:88:11:88:16 | \\u1234 | | -| cfg.rb:88:1:88:23 | ... = ... | cfg.rb:90:5:90:5 | x | | -| cfg.rb:88:10:88:23 | "\\u1234#{...}\\n" | cfg.rb:88:1:88:23 | ... = ... | | -| cfg.rb:88:11:88:16 | \\u1234 | cfg.rb:88:19:88:19 | x | | -| cfg.rb:88:17:88:20 | #{...} | cfg.rb:88:21:88:22 | \\n | | -| cfg.rb:88:19:88:19 | x | cfg.rb:88:17:88:20 | #{...} | | +| cfg.rb:88:1:88:6 | escape | cfg.rb:88:10:88:23 | Before "\\u1234#{...}\\n" | | +| cfg.rb:88:1:88:23 | ... = ... | cfg.rb:88:1:88:23 | After ... = ... | | +| cfg.rb:88:1:88:23 | After ... = ... | cfg.rb:90:1:93:3 | ... | | +| cfg.rb:88:1:88:23 | Before ... = ... | cfg.rb:88:1:88:6 | escape | | +| cfg.rb:88:10:88:23 | "\\u1234#{...}\\n" | cfg.rb:88:10:88:23 | After "\\u1234#{...}\\n" | | +| cfg.rb:88:10:88:23 | After "\\u1234#{...}\\n" | cfg.rb:88:1:88:23 | ... = ... | | +| cfg.rb:88:10:88:23 | Before "\\u1234#{...}\\n" | cfg.rb:88:11:88:16 | \\u1234 | | +| cfg.rb:88:11:88:16 | \\u1234 | cfg.rb:88:17:88:20 | #{...} | | +| cfg.rb:88:17:88:20 | #{...} | cfg.rb:88:19:88:19 | x | | +| cfg.rb:88:17:88:20 | After #{...} | cfg.rb:88:21:88:22 | \\n | | +| cfg.rb:88:19:88:19 | x | cfg.rb:88:17:88:20 | After #{...} | | | cfg.rb:88:21:88:22 | \\n | cfg.rb:88:10:88:23 | "\\u1234#{...}\\n" | | -| cfg.rb:90:1:93:3 | ... | cfg.rb:95:1:95:7 | $global | | -| cfg.rb:90:1:93:3 | ... = ... | cfg.rb:91:6:91:6 | x | | +| cfg.rb:90:1:93:3 | ... | cfg.rb:90:1:93:3 | Before ... = ... | | +| cfg.rb:90:1:93:3 | ... | cfg.rb:90:5:90:5 | if ... | | +| cfg.rb:90:1:93:3 | ... = ... | cfg.rb:90:1:93:3 | After ... = ... | | +| cfg.rb:90:1:93:3 | After ... | cfg.rb:90:1:93:3 | Normal Exit | | +| cfg.rb:90:1:93:3 | After ... | cfg.rb:95:1:95:12 | Before ... = ... | | +| cfg.rb:90:1:93:3 | After ... = ... | cfg.rb:91:3:91:24 | if ... | | +| cfg.rb:90:1:93:3 | After call to each | cfg.rb:90:1:93:3 | After ... | | +| cfg.rb:90:1:93:3 | Before ... = ... | cfg.rb:90:5:90:5 | x | | +| cfg.rb:90:1:93:3 | Before call to each | cfg.rb:90:10:90:26 | Before call to [] | | +| cfg.rb:90:1:93:3 | Entry | cfg.rb:90:1:93:3 | __synth__0__1 | | +| cfg.rb:90:1:93:3 | Normal Exit | cfg.rb:90:1:93:3 | Exit | | +| cfg.rb:90:1:93:3 | __synth__0__1 | cfg.rb:90:1:93:3 | ... | | | cfg.rb:90:1:93:3 | __synth__0__1 | cfg.rb:90:1:93:3 | ... = ... | | -| cfg.rb:90:1:93:3 | __synth__0__1 | cfg.rb:90:5:90:5 | x | | -| cfg.rb:90:1:93:3 | call to each | cfg.rb:90:1:93:3 | ... | | -| cfg.rb:90:1:93:3 | enter { ... } | cfg.rb:90:1:93:3 | __synth__0__1 | | -| cfg.rb:90:1:93:3 | exit { ... } (normal) | cfg.rb:90:1:93:3 | exit { ... } | | +| cfg.rb:90:1:93:3 | call to each | cfg.rb:90:1:93:3 | After call to each | | | cfg.rb:90:1:93:3 | { ... } | cfg.rb:90:1:93:3 | call to each | | -| cfg.rb:90:5:90:5 | ... = ... | cfg.rb:90:5:90:5 | if ... | | -| cfg.rb:90:5:90:5 | [false] ! ... | cfg.rb:90:5:90:5 | if ... | false | -| cfg.rb:90:5:90:5 | [true] ! ... | cfg.rb:90:5:90:5 | x | true | -| cfg.rb:90:5:90:5 | defined? ... | cfg.rb:90:5:90:5 | [false] ! ... | true | -| cfg.rb:90:5:90:5 | defined? ... | cfg.rb:90:5:90:5 | [true] ! ... | false | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:90:10:90:26 | Array | | +| cfg.rb:90:5:90:5 | ! ... | cfg.rb:90:5:90:5 | Before defined? ... | | +| cfg.rb:90:5:90:5 | ... = ... | cfg.rb:90:5:90:5 | After ... = ... | | +| cfg.rb:90:5:90:5 | After ! ... [false] | cfg.rb:90:5:90:5 | After if ... | | +| cfg.rb:90:5:90:5 | After ! ... [true] | cfg.rb:90:5:90:5 | Before ... = ... | | +| cfg.rb:90:5:90:5 | After ... = ... | cfg.rb:90:5:90:5 | After if ... | | +| cfg.rb:90:5:90:5 | After defined? ... [false] | cfg.rb:90:5:90:5 | After ! ... [true] | true | +| cfg.rb:90:5:90:5 | After defined? ... [true] | cfg.rb:90:5:90:5 | After ! ... [false] | false | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:90:1:93:3 | Before call to each | | +| cfg.rb:90:5:90:5 | Before ... = ... | cfg.rb:90:5:90:5 | x | | +| cfg.rb:90:5:90:5 | Before defined? ... | cfg.rb:90:5:90:5 | x | | +| cfg.rb:90:5:90:5 | defined? ... | cfg.rb:90:5:90:5 | After defined? ... [false] | false | +| cfg.rb:90:5:90:5 | defined? ... | cfg.rb:90:5:90:5 | After defined? ... [true] | true | +| cfg.rb:90:5:90:5 | if ... | cfg.rb:90:5:90:5 | ! ... | | | cfg.rb:90:5:90:5 | nil | cfg.rb:90:5:90:5 | ... = ... | | | cfg.rb:90:5:90:5 | x | cfg.rb:90:1:93:3 | __synth__0__1 | | | cfg.rb:90:5:90:5 | x | cfg.rb:90:5:90:5 | defined? ... | | | cfg.rb:90:5:90:5 | x | cfg.rb:90:5:90:5 | nil | | +| cfg.rb:90:10:90:26 | After call to [] | cfg.rb:90:1:93:3 | { ... } | | | cfg.rb:90:10:90:26 | Array | cfg.rb:90:11:90:13 | 1.4 | | -| cfg.rb:90:10:90:26 | call to [] | cfg.rb:90:1:93:3 | { ... } | | +| cfg.rb:90:10:90:26 | Before call to [] | cfg.rb:90:10:90:26 | Array | | +| cfg.rb:90:10:90:26 | call to [] | cfg.rb:90:10:90:26 | After call to [] | | | cfg.rb:90:11:90:13 | 1.4 | cfg.rb:90:16:90:18 | 2.5 | | | cfg.rb:90:16:90:18 | 2.5 | cfg.rb:90:21:90:25 | 3.4e5 | | | cfg.rb:90:21:90:25 | 3.4e5 | cfg.rb:90:10:90:26 | call to [] | | -| cfg.rb:91:3:91:24 | if ... | cfg.rb:92:3:92:8 | self | | +| cfg.rb:91:3:91:24 | After if ... | cfg.rb:92:3:92:8 | Before call to puts | | +| cfg.rb:91:3:91:24 | if ... | cfg.rb:91:6:91:10 | Before ... > ... | | | cfg.rb:91:6:91:6 | x | cfg.rb:91:10:91:10 | 3 | | -| cfg.rb:91:6:91:10 | ... > ... | cfg.rb:91:3:91:24 | if ... | false | -| cfg.rb:91:6:91:10 | ... > ... | cfg.rb:91:17:91:20 | next | true | +| cfg.rb:91:6:91:10 | ... > ... | cfg.rb:91:6:91:10 | After ... > ... [false] | false | +| cfg.rb:91:6:91:10 | ... > ... | cfg.rb:91:6:91:10 | After ... > ... [true] | true | +| cfg.rb:91:6:91:10 | After ... > ... [false] | cfg.rb:91:3:91:24 | After if ... | | +| cfg.rb:91:6:91:10 | After ... > ... [true] | cfg.rb:91:12:91:20 | then ... | | +| cfg.rb:91:6:91:10 | Before ... > ... | cfg.rb:91:6:91:6 | x | | | cfg.rb:91:10:91:10 | 3 | cfg.rb:91:6:91:10 | ... > ... | | -| cfg.rb:91:17:91:20 | next | cfg.rb:90:1:93:3 | exit { ... } (normal) | continue | -| cfg.rb:92:3:92:8 | call to puts | cfg.rb:90:1:93:3 | exit { ... } (normal) | | +| cfg.rb:91:12:91:20 | then ... | cfg.rb:91:17:91:20 | Before next | | +| cfg.rb:91:17:91:20 | Before next | cfg.rb:91:17:91:20 | next | | +| cfg.rb:91:17:91:20 | next | cfg.rb:90:1:93:3 | Normal Exit | continue | +| cfg.rb:92:3:92:8 | After call to puts | cfg.rb:90:1:93:3 | After ... | | +| cfg.rb:92:3:92:8 | Before call to puts | cfg.rb:92:3:92:8 | self | | +| cfg.rb:92:3:92:8 | call to puts | cfg.rb:92:3:92:8 | After call to puts | | | cfg.rb:92:3:92:8 | self | cfg.rb:92:8:92:8 | x | | | cfg.rb:92:8:92:8 | x | cfg.rb:92:3:92:8 | call to puts | | | cfg.rb:95:1:95:7 | $global | cfg.rb:95:11:95:12 | 42 | | -| cfg.rb:95:1:95:12 | ... = ... | cfg.rb:97:1:97:4 | map1 | | +| cfg.rb:95:1:95:12 | ... = ... | cfg.rb:95:1:95:12 | After ... = ... | | +| cfg.rb:95:1:95:12 | After ... = ... | cfg.rb:97:1:97:39 | Before ... = ... | | +| cfg.rb:95:1:95:12 | Before ... = ... | cfg.rb:95:1:95:7 | $global | | | cfg.rb:95:11:95:12 | 42 | cfg.rb:95:1:95:12 | ... = ... | | -| cfg.rb:97:1:97:4 | map1 | cfg.rb:97:8:97:39 | Hash | | -| cfg.rb:97:1:97:39 | ... = ... | cfg.rb:98:1:98:4 | map2 | | -| cfg.rb:97:8:97:39 | Hash | cfg.rb:97:11:97:11 | a | | -| cfg.rb:97:8:97:39 | call to [] | cfg.rb:97:1:97:39 | ... = ... | | -| cfg.rb:97:10:97:12 | "a" | cfg.rb:97:18:97:18 | b | | -| cfg.rb:97:10:97:19 | Pair | cfg.rb:97:23:97:23 | c | | +| cfg.rb:97:1:97:4 | map1 | cfg.rb:97:8:97:39 | Before call to [] | | +| cfg.rb:97:1:97:39 | ... = ... | cfg.rb:97:1:97:39 | After ... = ... | | +| cfg.rb:97:1:97:39 | After ... = ... | cfg.rb:98:1:98:36 | Before ... = ... | | +| cfg.rb:97:1:97:39 | Before ... = ... | cfg.rb:97:1:97:4 | map1 | | +| cfg.rb:97:8:97:39 | After call to [] | cfg.rb:97:1:97:39 | ... = ... | | +| cfg.rb:97:8:97:39 | Before call to [] | cfg.rb:97:8:97:39 | Hash | | +| cfg.rb:97:8:97:39 | Hash | cfg.rb:97:10:97:19 | Before Pair | | +| cfg.rb:97:8:97:39 | call to [] | cfg.rb:97:8:97:39 | After call to [] | | +| cfg.rb:97:10:97:12 | "a" | cfg.rb:97:10:97:12 | After "a" | | +| cfg.rb:97:10:97:12 | After "a" | cfg.rb:97:17:97:19 | Before "b" | | +| cfg.rb:97:10:97:12 | Before "a" | cfg.rb:97:11:97:11 | a | | +| cfg.rb:97:10:97:19 | After Pair | cfg.rb:97:22:97:29 | Before Pair | | +| cfg.rb:97:10:97:19 | Before Pair | cfg.rb:97:10:97:12 | Before "a" | | +| cfg.rb:97:10:97:19 | Pair | cfg.rb:97:10:97:19 | After Pair | | | cfg.rb:97:11:97:11 | a | cfg.rb:97:10:97:12 | "a" | | -| cfg.rb:97:17:97:19 | "b" | cfg.rb:97:10:97:19 | Pair | | +| cfg.rb:97:17:97:19 | "b" | cfg.rb:97:17:97:19 | After "b" | | +| cfg.rb:97:17:97:19 | After "b" | cfg.rb:97:10:97:19 | Pair | | +| cfg.rb:97:17:97:19 | Before "b" | cfg.rb:97:18:97:18 | b | | | cfg.rb:97:18:97:18 | b | cfg.rb:97:17:97:19 | "b" | | -| cfg.rb:97:22:97:24 | "c" | cfg.rb:97:28:97:28 | d | | -| cfg.rb:97:22:97:29 | Pair | cfg.rb:97:32:97:32 | e | | +| cfg.rb:97:22:97:24 | "c" | cfg.rb:97:22:97:24 | After "c" | | +| cfg.rb:97:22:97:24 | After "c" | cfg.rb:97:27:97:29 | Before "d" | | +| cfg.rb:97:22:97:24 | Before "c" | cfg.rb:97:23:97:23 | c | | +| cfg.rb:97:22:97:29 | After Pair | cfg.rb:97:32:97:37 | Before Pair | | +| cfg.rb:97:22:97:29 | Before Pair | cfg.rb:97:22:97:24 | Before "c" | | +| cfg.rb:97:22:97:29 | Pair | cfg.rb:97:22:97:29 | After Pair | | | cfg.rb:97:23:97:23 | c | cfg.rb:97:22:97:24 | "c" | | -| cfg.rb:97:27:97:29 | "d" | cfg.rb:97:22:97:29 | Pair | | +| cfg.rb:97:27:97:29 | "d" | cfg.rb:97:27:97:29 | After "d" | | +| cfg.rb:97:27:97:29 | After "d" | cfg.rb:97:22:97:29 | Pair | | +| cfg.rb:97:27:97:29 | Before "d" | cfg.rb:97:28:97:28 | d | | | cfg.rb:97:28:97:28 | d | cfg.rb:97:27:97:29 | "d" | | -| cfg.rb:97:32:97:32 | :e | cfg.rb:97:36:97:36 | f | | +| cfg.rb:97:32:97:32 | :e | cfg.rb:97:32:97:32 | After :e | | +| cfg.rb:97:32:97:32 | After :e | cfg.rb:97:35:97:37 | Before "f" | | +| cfg.rb:97:32:97:32 | Before :e | cfg.rb:97:32:97:32 | e | | | cfg.rb:97:32:97:32 | e | cfg.rb:97:32:97:32 | :e | | -| cfg.rb:97:32:97:37 | Pair | cfg.rb:97:8:97:39 | call to [] | | -| cfg.rb:97:35:97:37 | "f" | cfg.rb:97:32:97:37 | Pair | | +| cfg.rb:97:32:97:37 | After Pair | cfg.rb:97:8:97:39 | call to [] | | +| cfg.rb:97:32:97:37 | Before Pair | cfg.rb:97:32:97:32 | Before :e | | +| cfg.rb:97:32:97:37 | Pair | cfg.rb:97:32:97:37 | After Pair | | +| cfg.rb:97:35:97:37 | "f" | cfg.rb:97:35:97:37 | After "f" | | +| cfg.rb:97:35:97:37 | After "f" | cfg.rb:97:32:97:37 | Pair | | +| cfg.rb:97:35:97:37 | Before "f" | cfg.rb:97:36:97:36 | f | | | cfg.rb:97:36:97:36 | f | cfg.rb:97:35:97:37 | "f" | | -| cfg.rb:98:1:98:4 | map2 | cfg.rb:98:8:98:36 | Hash | | -| cfg.rb:98:1:98:36 | ... = ... | cfg.rb:101:1:104:3 | parameters | | -| cfg.rb:98:8:98:36 | Hash | cfg.rb:98:12:98:15 | map1 | | -| cfg.rb:98:8:98:36 | call to [] | cfg.rb:98:1:98:36 | ... = ... | | -| cfg.rb:98:10:98:15 | ** ... | cfg.rb:98:19:98:19 | x | | +| cfg.rb:98:1:98:4 | map2 | cfg.rb:98:8:98:36 | Before call to [] | | +| cfg.rb:98:1:98:36 | ... = ... | cfg.rb:98:1:98:36 | After ... = ... | | +| cfg.rb:98:1:98:36 | After ... = ... | cfg.rb:101:1:104:3 | parameters | | +| cfg.rb:98:1:98:36 | Before ... = ... | cfg.rb:98:1:98:4 | map2 | | +| cfg.rb:98:8:98:36 | After call to [] | cfg.rb:98:1:98:36 | ... = ... | | +| cfg.rb:98:8:98:36 | Before call to [] | cfg.rb:98:8:98:36 | Hash | | +| cfg.rb:98:8:98:36 | Hash | cfg.rb:98:10:98:15 | Before ** ... | | +| cfg.rb:98:8:98:36 | call to [] | cfg.rb:98:8:98:36 | After call to [] | | +| cfg.rb:98:10:98:15 | ** ... | cfg.rb:98:10:98:15 | After ** ... | | +| cfg.rb:98:10:98:15 | After ** ... | cfg.rb:98:18:98:27 | Before Pair | | +| cfg.rb:98:10:98:15 | Before ** ... | cfg.rb:98:12:98:15 | map1 | | | cfg.rb:98:12:98:15 | map1 | cfg.rb:98:10:98:15 | ** ... | | -| cfg.rb:98:18:98:20 | "x" | cfg.rb:98:26:98:26 | y | | -| cfg.rb:98:18:98:27 | Pair | cfg.rb:98:32:98:35 | map1 | | +| cfg.rb:98:18:98:20 | "x" | cfg.rb:98:18:98:20 | After "x" | | +| cfg.rb:98:18:98:20 | After "x" | cfg.rb:98:25:98:27 | Before "y" | | +| cfg.rb:98:18:98:20 | Before "x" | cfg.rb:98:19:98:19 | x | | +| cfg.rb:98:18:98:27 | After Pair | cfg.rb:98:30:98:35 | Before ** ... | | +| cfg.rb:98:18:98:27 | Before Pair | cfg.rb:98:18:98:20 | Before "x" | | +| cfg.rb:98:18:98:27 | Pair | cfg.rb:98:18:98:27 | After Pair | | | cfg.rb:98:19:98:19 | x | cfg.rb:98:18:98:20 | "x" | | -| cfg.rb:98:25:98:27 | "y" | cfg.rb:98:18:98:27 | Pair | | +| cfg.rb:98:25:98:27 | "y" | cfg.rb:98:25:98:27 | After "y" | | +| cfg.rb:98:25:98:27 | After "y" | cfg.rb:98:18:98:27 | Pair | | +| cfg.rb:98:25:98:27 | Before "y" | cfg.rb:98:26:98:26 | y | | | cfg.rb:98:26:98:26 | y | cfg.rb:98:25:98:27 | "y" | | -| cfg.rb:98:30:98:35 | ** ... | cfg.rb:98:8:98:36 | call to [] | | +| cfg.rb:98:30:98:35 | ** ... | cfg.rb:98:30:98:35 | After ** ... | | +| cfg.rb:98:30:98:35 | After ** ... | cfg.rb:98:8:98:36 | call to [] | | +| cfg.rb:98:30:98:35 | Before ** ... | cfg.rb:98:32:98:35 | map1 | | | cfg.rb:98:32:98:35 | map1 | cfg.rb:98:30:98:35 | ** ... | | -| cfg.rb:101:1:104:3 | enter parameters | cfg.rb:101:16:101:20 | value | | -| cfg.rb:101:1:104:3 | exit parameters (normal) | cfg.rb:101:1:104:3 | exit parameters | | -| cfg.rb:101:1:104:3 | parameters | cfg.rb:106:1:106:4 | type | | -| cfg.rb:101:16:101:20 | value | cfg.rb:101:24:101:25 | 42 | false, no-match, true | -| cfg.rb:101:16:101:20 | value | cfg.rb:101:28:101:30 | key | match | +| cfg.rb:101:1:104:3 | Entry | cfg.rb:101:16:101:20 | value | | +| cfg.rb:101:1:104:3 | Normal Exit | cfg.rb:101:1:104:3 | Exit | | +| cfg.rb:101:1:104:3 | parameters | cfg.rb:106:1:106:17 | Before ... = ... | | +| cfg.rb:101:16:101:20 | After value [match] | cfg.rb:101:28:101:30 | key | | +| cfg.rb:101:16:101:20 | After value [no-match] | cfg.rb:101:24:101:25 | 42 | | +| cfg.rb:101:16:101:20 | value | cfg.rb:101:16:101:20 | After value [match] | match | +| cfg.rb:101:16:101:20 | value | cfg.rb:101:16:101:20 | After value [no-match] | no-match | | cfg.rb:101:24:101:25 | 42 | cfg.rb:101:28:101:30 | key | | | cfg.rb:101:28:101:30 | key | cfg.rb:101:36:101:41 | kwargs | | -| cfg.rb:101:36:101:41 | kwargs | cfg.rb:102:3:102:12 | self | | -| cfg.rb:102:3:102:12 | call to puts | cfg.rb:103:10:103:15 | kwargs | | +| cfg.rb:101:36:101:41 | kwargs | cfg.rb:102:3:103:20 | ... | | +| cfg.rb:102:3:102:12 | After call to puts | cfg.rb:103:3:103:20 | Before return | | +| cfg.rb:102:3:102:12 | Before call to puts | cfg.rb:102:3:102:12 | self | | +| cfg.rb:102:3:102:12 | call to puts | cfg.rb:102:3:102:12 | After call to puts | | | cfg.rb:102:3:102:12 | self | cfg.rb:102:8:102:12 | value | | +| cfg.rb:102:3:103:20 | ... | cfg.rb:102:3:102:12 | Before call to puts | | | cfg.rb:102:8:102:12 | value | cfg.rb:102:3:102:12 | call to puts | | -| cfg.rb:103:3:103:20 | return | cfg.rb:101:1:104:3 | exit parameters (normal) | return | +| cfg.rb:103:3:103:20 | Before return | cfg.rb:103:10:103:20 | Before ...[...] | | +| cfg.rb:103:3:103:20 | return | cfg.rb:101:1:104:3 | Normal Exit | return | | cfg.rb:103:10:103:15 | kwargs | cfg.rb:103:17:103:19 | key | | -| cfg.rb:103:10:103:20 | ...[...] | cfg.rb:103:3:103:20 | return | | +| cfg.rb:103:10:103:20 | ...[...] | cfg.rb:103:10:103:20 | After ...[...] | | +| cfg.rb:103:10:103:20 | After ...[...] | cfg.rb:103:3:103:20 | return | | +| cfg.rb:103:10:103:20 | Before ...[...] | cfg.rb:103:10:103:15 | kwargs | | | cfg.rb:103:17:103:19 | key | cfg.rb:103:10:103:20 | ...[...] | | -| cfg.rb:106:1:106:4 | type | cfg.rb:106:10:106:16 | healthy | | -| cfg.rb:106:1:106:17 | ... = ... | cfg.rb:107:1:107:5 | table | | -| cfg.rb:106:9:106:17 | "healthy" | cfg.rb:106:1:106:17 | ... = ... | | +| cfg.rb:106:1:106:4 | type | cfg.rb:106:9:106:17 | Before "healthy" | | +| cfg.rb:106:1:106:17 | ... = ... | cfg.rb:106:1:106:17 | After ... = ... | | +| cfg.rb:106:1:106:17 | After ... = ... | cfg.rb:107:1:107:14 | Before ... = ... | | +| cfg.rb:106:1:106:17 | Before ... = ... | cfg.rb:106:1:106:4 | type | | +| cfg.rb:106:9:106:17 | "healthy" | cfg.rb:106:9:106:17 | After "healthy" | | +| cfg.rb:106:9:106:17 | After "healthy" | cfg.rb:106:1:106:17 | ... = ... | | +| cfg.rb:106:9:106:17 | Before "healthy" | cfg.rb:106:10:106:16 | healthy | | | cfg.rb:106:10:106:16 | healthy | cfg.rb:106:9:106:17 | "healthy" | | -| cfg.rb:107:1:107:5 | table | cfg.rb:107:10:107:13 | food | | -| cfg.rb:107:1:107:14 | ... = ... | cfg.rb:108:1:108:12 | self | | -| cfg.rb:107:9:107:14 | "food" | cfg.rb:107:1:107:14 | ... = ... | | +| cfg.rb:107:1:107:5 | table | cfg.rb:107:9:107:14 | Before "food" | | +| cfg.rb:107:1:107:14 | ... = ... | cfg.rb:107:1:107:14 | After ... = ... | | +| cfg.rb:107:1:107:14 | After ... = ... | cfg.rb:108:1:108:12 | Before call to puts | | +| cfg.rb:107:1:107:14 | Before ... = ... | cfg.rb:107:1:107:5 | table | | +| cfg.rb:107:9:107:14 | "food" | cfg.rb:107:9:107:14 | After "food" | | +| cfg.rb:107:9:107:14 | After "food" | cfg.rb:107:1:107:14 | ... = ... | | +| cfg.rb:107:9:107:14 | Before "food" | cfg.rb:107:10:107:13 | food | | | cfg.rb:107:10:107:13 | food | cfg.rb:107:9:107:14 | "food" | | -| cfg.rb:108:1:108:12 | call to puts | cfg.rb:113:14:113:14 | b | | -| cfg.rb:108:1:108:12 | self | cfg.rb:108:13:109:14 | \nSELECT * FROM | | -| cfg.rb:108:6:108:12 | ( ... ) | cfg.rb:108:1:108:12 | call to puts | | -| cfg.rb:108:7:108:11 | < ... | | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:115:1:118:3 | C | | +| cfg.rb:113:6:113:9 | "hi" | cfg.rb:113:6:113:9 | After "hi" | | +| cfg.rb:113:6:113:9 | After "hi" | cfg.rb:113:1:113:9 | call to puts | | +| cfg.rb:113:6:113:9 | Before "hi" | cfg.rb:113:7:113:8 | hi | | | cfg.rb:113:7:113:8 | hi | cfg.rb:113:6:113:9 | "hi" | | | cfg.rb:113:14:113:14 | b | cfg.rb:113:18:113:19 | 10 | | -| cfg.rb:113:14:113:19 | ... > ... | cfg.rb:113:1:113:9 | self | true | -| cfg.rb:113:14:113:19 | ... > ... | cfg.rb:113:1:113:19 | ... if ... | false | +| cfg.rb:113:14:113:19 | ... > ... | cfg.rb:113:14:113:19 | After ... > ... [false] | false | +| cfg.rb:113:14:113:19 | ... > ... | cfg.rb:113:14:113:19 | After ... > ... [true] | true | +| cfg.rb:113:14:113:19 | After ... > ... [false] | cfg.rb:113:1:113:19 | After ... if ... | | +| cfg.rb:113:14:113:19 | After ... > ... [true] | cfg.rb:113:1:113:9 | Before call to puts | | +| cfg.rb:113:14:113:19 | Before ... > ... | cfg.rb:113:14:113:14 | b | | | cfg.rb:113:18:113:19 | 10 | cfg.rb:113:14:113:19 | ... > ... | | -| cfg.rb:115:1:118:3 | C | cfg.rb:116:3:116:8 | self | | -| cfg.rb:116:3:116:8 | @field | cfg.rb:116:12:116:13 | 42 | | +| cfg.rb:115:1:118:3 | After C | cfg.rb:120:1:120:28 | Before ... = ... | | +| cfg.rb:115:1:118:3 | C | cfg.rb:116:3:116:13 | Before ... = ... | | +| cfg.rb:116:3:116:8 | @field | cfg.rb:116:3:116:8 | After @field | | +| cfg.rb:116:3:116:8 | After @field | cfg.rb:116:12:116:13 | 42 | | +| cfg.rb:116:3:116:8 | Before @field | cfg.rb:116:3:116:8 | self | | | cfg.rb:116:3:116:8 | self | cfg.rb:116:3:116:8 | @field | | -| cfg.rb:116:3:116:13 | ... = ... | cfg.rb:117:3:117:16 | @@static_field | | +| cfg.rb:116:3:116:13 | ... = ... | cfg.rb:116:3:116:13 | After ... = ... | | +| cfg.rb:116:3:116:13 | After ... = ... | cfg.rb:117:3:117:21 | Before ... = ... | | +| cfg.rb:116:3:116:13 | Before ... = ... | cfg.rb:116:3:116:8 | Before @field | | | cfg.rb:116:12:116:13 | 42 | cfg.rb:116:3:116:13 | ... = ... | | | cfg.rb:117:3:117:16 | @@static_field | cfg.rb:117:20:117:21 | 10 | | -| cfg.rb:117:3:117:21 | ... = ... | cfg.rb:120:1:120:4 | swap | | +| cfg.rb:117:3:117:21 | ... = ... | cfg.rb:117:3:117:21 | After ... = ... | | +| cfg.rb:117:3:117:21 | After ... = ... | cfg.rb:115:1:118:3 | After C | | +| cfg.rb:117:3:117:21 | Before ... = ... | cfg.rb:117:3:117:16 | @@static_field | | | cfg.rb:117:20:117:21 | 10 | cfg.rb:117:3:117:21 | ... = ... | | | cfg.rb:120:1:120:4 | swap | cfg.rb:120:8:120:28 | -> { ... } | | -| cfg.rb:120:1:120:28 | ... = ... | cfg.rb:122:1:131:3 | M | | +| cfg.rb:120:1:120:28 | ... = ... | cfg.rb:120:1:120:28 | After ... = ... | | +| cfg.rb:120:1:120:28 | After ... = ... | cfg.rb:122:1:131:3 | M | | +| cfg.rb:120:1:120:28 | Before ... = ... | cfg.rb:120:1:120:4 | swap | | | cfg.rb:120:8:120:28 | -> { ... } | cfg.rb:120:1:120:28 | ... = ... | | -| cfg.rb:120:8:120:28 | enter -> { ... } | cfg.rb:120:12:120:12 | x | | -| cfg.rb:120:8:120:28 | exit -> { ... } (normal) | cfg.rb:120:8:120:28 | exit -> { ... } | | -| cfg.rb:120:11:120:16 | (..., ...) | cfg.rb:120:21:120:26 | Array | | +| cfg.rb:120:8:120:28 | Entry | cfg.rb:120:11:120:16 | (..., ...) | | +| cfg.rb:120:8:120:28 | Normal Exit | cfg.rb:120:8:120:28 | Exit | | +| cfg.rb:120:11:120:16 | (..., ...) | cfg.rb:120:12:120:12 | x | | +| cfg.rb:120:11:120:16 | After (..., ...) | cfg.rb:120:21:120:26 | ... | | | cfg.rb:120:12:120:12 | x | cfg.rb:120:15:120:15 | y | | -| cfg.rb:120:15:120:15 | y | cfg.rb:120:11:120:16 | (..., ...) | | +| cfg.rb:120:15:120:15 | y | cfg.rb:120:11:120:16 | After (..., ...) | | +| cfg.rb:120:21:120:26 | ... | cfg.rb:120:21:120:26 | Before call to [] | | +| cfg.rb:120:21:120:26 | After ... | cfg.rb:120:8:120:28 | Normal Exit | | +| cfg.rb:120:21:120:26 | After call to [] | cfg.rb:120:21:120:26 | After ... | | | cfg.rb:120:21:120:26 | Array | cfg.rb:120:22:120:22 | y | | -| cfg.rb:120:21:120:26 | call to [] | cfg.rb:120:8:120:28 | exit -> { ... } (normal) | | +| cfg.rb:120:21:120:26 | Before call to [] | cfg.rb:120:21:120:26 | Array | | +| cfg.rb:120:21:120:26 | call to [] | cfg.rb:120:21:120:26 | After call to [] | | | cfg.rb:120:22:120:22 | y | cfg.rb:120:25:120:25 | x | | | cfg.rb:120:25:120:25 | x | cfg.rb:120:21:120:26 | call to [] | | -| cfg.rb:122:1:131:3 | M | cfg.rb:123:2:123:8 | nothing | | +| cfg.rb:122:1:131:3 | After M | cfg.rb:133:1:133:21 | EmptyClass | | +| cfg.rb:122:1:131:3 | M | cfg.rb:123:2:123:14 | Before ... = ... | | | cfg.rb:123:2:123:8 | nothing | cfg.rb:123:12:123:14 | nil | | -| cfg.rb:123:2:123:14 | ... = ... | cfg.rb:124:2:124:5 | some | | +| cfg.rb:123:2:123:14 | ... = ... | cfg.rb:123:2:123:14 | After ... = ... | | +| cfg.rb:123:2:123:14 | After ... = ... | cfg.rb:124:2:124:9 | Before ... = ... | | +| cfg.rb:123:2:123:14 | Before ... = ... | cfg.rb:123:2:123:8 | nothing | | | cfg.rb:123:12:123:14 | nil | cfg.rb:123:2:123:14 | ... = ... | | | cfg.rb:124:2:124:5 | some | cfg.rb:124:9:124:9 | 2 | | -| cfg.rb:124:2:124:9 | ... = ... | cfg.rb:125:2:125:5 | some | | +| cfg.rb:124:2:124:9 | ... = ... | cfg.rb:124:2:124:9 | After ... = ... | | +| cfg.rb:124:2:124:9 | After ... = ... | cfg.rb:125:2:125:11 | Before ... = ... | | +| cfg.rb:124:2:124:9 | Before ... = ... | cfg.rb:124:2:124:5 | some | | | cfg.rb:124:9:124:9 | 2 | cfg.rb:124:2:124:9 | ... = ... | | -| cfg.rb:125:2:125:5 | some | cfg.rb:125:2:125:5 | some | | +| cfg.rb:125:2:125:5 | some | cfg.rb:125:7:125:8 | Before ... + ... | | | cfg.rb:125:2:125:5 | some | cfg.rb:125:10:125:11 | 10 | | -| cfg.rb:125:2:125:11 | ... = ... | cfg.rb:126:2:126:5 | last | | -| cfg.rb:125:7:125:8 | ... + ... | cfg.rb:125:2:125:11 | ... = ... | | +| cfg.rb:125:2:125:11 | ... = ... | cfg.rb:125:2:125:11 | After ... = ... | | +| cfg.rb:125:2:125:11 | After ... = ... | cfg.rb:126:2:126:17 | Before ... = ... | | +| cfg.rb:125:2:125:11 | Before ... = ... | cfg.rb:125:2:125:5 | some | | +| cfg.rb:125:7:125:8 | ... + ... | cfg.rb:125:7:125:8 | After ... + ... | | +| cfg.rb:125:7:125:8 | After ... + ... | cfg.rb:125:2:125:11 | ... = ... | | +| cfg.rb:125:7:125:8 | Before ... + ... | cfg.rb:125:2:125:5 | some | | | cfg.rb:125:10:125:11 | 10 | cfg.rb:125:7:125:8 | ... + ... | | -| cfg.rb:126:2:126:5 | last | cfg.rb:126:10:126:10 | 2 | | -| cfg.rb:126:2:126:17 | ... = ... | cfg.rb:127:2:127:6 | range | | -| cfg.rb:126:9:126:17 | ( ... ) | cfg.rb:126:2:126:17 | ... = ... | | +| cfg.rb:126:2:126:5 | last | cfg.rb:126:9:126:17 | ( ... ) | | +| cfg.rb:126:2:126:17 | ... = ... | cfg.rb:126:2:126:17 | After ... = ... | | +| cfg.rb:126:2:126:17 | After ... = ... | cfg.rb:127:2:127:13 | Before ... = ... | | +| cfg.rb:126:2:126:17 | Before ... = ... | cfg.rb:126:2:126:5 | last | | +| cfg.rb:126:9:126:17 | ( ... ) | cfg.rb:126:10:126:10 | 2 | | +| cfg.rb:126:9:126:17 | After ( ... ) | cfg.rb:126:2:126:17 | ... = ... | | | cfg.rb:126:10:126:10 | 2 | cfg.rb:126:13:126:13 | 4 | | | cfg.rb:126:13:126:13 | 4 | cfg.rb:126:16:126:16 | 7 | | -| cfg.rb:126:16:126:16 | 7 | cfg.rb:126:9:126:17 | ( ... ) | | -| cfg.rb:127:2:127:6 | range | cfg.rb:127:10:127:10 | 0 | | -| cfg.rb:127:2:127:13 | ... = ... | cfg.rb:128:2:128:5 | half | | +| cfg.rb:126:16:126:16 | 7 | cfg.rb:126:9:126:17 | After ( ... ) | | +| cfg.rb:127:2:127:6 | range | cfg.rb:127:10:127:13 | Before _ .. _ | | +| cfg.rb:127:2:127:13 | ... = ... | cfg.rb:127:2:127:13 | After ... = ... | | +| cfg.rb:127:2:127:13 | After ... = ... | cfg.rb:128:2:128:19 | Before ... = ... | | +| cfg.rb:127:2:127:13 | Before ... = ... | cfg.rb:127:2:127:6 | range | | | cfg.rb:127:10:127:10 | 0 | cfg.rb:127:13:127:13 | 9 | | -| cfg.rb:127:10:127:13 | _ .. _ | cfg.rb:127:2:127:13 | ... = ... | | +| cfg.rb:127:10:127:13 | After _ .. _ | cfg.rb:127:2:127:13 | ... = ... | | +| cfg.rb:127:10:127:13 | Before _ .. _ | cfg.rb:127:10:127:10 | 0 | | +| cfg.rb:127:10:127:13 | _ .. _ | cfg.rb:127:10:127:13 | After _ .. _ | | | cfg.rb:127:13:127:13 | 9 | cfg.rb:127:10:127:13 | _ .. _ | | -| cfg.rb:128:2:128:5 | half | cfg.rb:128:9:128:9 | 1 | | -| cfg.rb:128:2:128:19 | ... = ... | cfg.rb:129:2:129:6 | regex | | +| cfg.rb:128:2:128:5 | half | cfg.rb:128:9:128:19 | Before ... + ... | | +| cfg.rb:128:2:128:19 | ... = ... | cfg.rb:128:2:128:19 | After ... = ... | | +| cfg.rb:128:2:128:19 | After ... = ... | cfg.rb:129:2:129:29 | Before ... = ... | | +| cfg.rb:128:2:128:19 | Before ... = ... | cfg.rb:128:2:128:5 | half | | | cfg.rb:128:9:128:9 | 1 | cfg.rb:128:11:128:12 | 3r | | -| cfg.rb:128:9:128:12 | ... / ... | cfg.rb:128:16:128:16 | 1 | | -| cfg.rb:128:9:128:19 | ... + ... | cfg.rb:128:2:128:19 | ... = ... | | +| cfg.rb:128:9:128:12 | ... / ... | cfg.rb:128:9:128:12 | After ... / ... | | +| cfg.rb:128:9:128:12 | After ... / ... | cfg.rb:128:16:128:19 | Before ... / ... | | +| cfg.rb:128:9:128:12 | Before ... / ... | cfg.rb:128:9:128:9 | 1 | | +| cfg.rb:128:9:128:19 | ... + ... | cfg.rb:128:9:128:19 | After ... + ... | | +| cfg.rb:128:9:128:19 | After ... + ... | cfg.rb:128:2:128:19 | ... = ... | | +| cfg.rb:128:9:128:19 | Before ... + ... | cfg.rb:128:9:128:12 | Before ... / ... | | | cfg.rb:128:11:128:12 | 3r | cfg.rb:128:9:128:12 | ... / ... | | | cfg.rb:128:16:128:16 | 1 | cfg.rb:128:18:128:19 | 6r | | -| cfg.rb:128:16:128:19 | ... / ... | cfg.rb:128:9:128:19 | ... + ... | | +| cfg.rb:128:16:128:19 | ... / ... | cfg.rb:128:16:128:19 | After ... / ... | | +| cfg.rb:128:16:128:19 | After ... / ... | cfg.rb:128:9:128:19 | ... + ... | | +| cfg.rb:128:16:128:19 | Before ... / ... | cfg.rb:128:16:128:16 | 1 | | | cfg.rb:128:18:128:19 | 6r | cfg.rb:128:16:128:19 | ... / ... | | -| cfg.rb:129:2:129:6 | regex | cfg.rb:129:11:129:15 | hello | | -| cfg.rb:129:2:129:29 | ... = ... | cfg.rb:130:2:130:9 | Constant | | -| cfg.rb:129:10:129:29 | /hello\\s+[#{...}]/ | cfg.rb:129:2:129:29 | ... = ... | | +| cfg.rb:129:2:129:6 | regex | cfg.rb:129:10:129:29 | Before /hello\\s+[#{...}]/ | | +| cfg.rb:129:2:129:29 | ... = ... | cfg.rb:129:2:129:29 | After ... = ... | | +| cfg.rb:129:2:129:29 | After ... = ... | cfg.rb:130:2:130:13 | Before ... = ... | | +| cfg.rb:129:2:129:29 | Before ... = ... | cfg.rb:129:2:129:6 | regex | | +| cfg.rb:129:10:129:29 | /hello\\s+[#{...}]/ | cfg.rb:129:10:129:29 | After /hello\\s+[#{...}]/ | | +| cfg.rb:129:10:129:29 | After /hello\\s+[#{...}]/ | cfg.rb:129:2:129:29 | ... = ... | | +| cfg.rb:129:10:129:29 | Before /hello\\s+[#{...}]/ | cfg.rb:129:11:129:15 | hello | | | cfg.rb:129:11:129:15 | hello | cfg.rb:129:16:129:17 | \\s | | | cfg.rb:129:16:129:17 | \\s | cfg.rb:129:18:129:19 | +[ | | -| cfg.rb:129:18:129:19 | +[ | cfg.rb:129:22:129:26 | range | | -| cfg.rb:129:20:129:27 | #{...} | cfg.rb:129:28:129:28 | ] | | -| cfg.rb:129:22:129:26 | range | cfg.rb:129:20:129:27 | #{...} | | +| cfg.rb:129:18:129:19 | +[ | cfg.rb:129:20:129:27 | #{...} | | +| cfg.rb:129:20:129:27 | #{...} | cfg.rb:129:22:129:26 | range | | +| cfg.rb:129:20:129:27 | After #{...} | cfg.rb:129:28:129:28 | ] | | +| cfg.rb:129:22:129:26 | range | cfg.rb:129:20:129:27 | After #{...} | | | cfg.rb:129:28:129:28 | ] | cfg.rb:129:10:129:29 | /hello\\s+[#{...}]/ | | | cfg.rb:130:2:130:9 | Constant | cfg.rb:130:13:130:13 | 5 | | -| cfg.rb:130:2:130:13 | ... = ... | cfg.rb:133:1:133:21 | EmptyClass | | +| cfg.rb:130:2:130:13 | ... = ... | cfg.rb:130:2:130:13 | After ... = ... | | +| cfg.rb:130:2:130:13 | After ... = ... | cfg.rb:122:1:131:3 | After M | | +| cfg.rb:130:2:130:13 | Before ... = ... | cfg.rb:130:2:130:9 | Constant | | | cfg.rb:130:13:130:13 | 5 | cfg.rb:130:2:130:13 | ... = ... | | | cfg.rb:133:1:133:21 | EmptyClass | cfg.rb:134:1:134:23 | EmptyModule | | -| cfg.rb:134:1:134:23 | EmptyModule | cfg.rb:136:1:136:1 | 1 | | +| cfg.rb:134:1:134:23 | EmptyModule | cfg.rb:136:1:136:29 | ... rescue ... | | | cfg.rb:136:1:136:1 | 1 | cfg.rb:136:3:136:3 | 0 | | -| cfg.rb:136:1:136:3 | ... / ... | cfg.rb:136:1:136:29 | ... rescue ... | | -| cfg.rb:136:1:136:3 | ... / ... | cfg.rb:136:12:136:29 | self | exception | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:138:17:138:23 | __synth__2 | | +| cfg.rb:136:1:136:3 | ... / ... | cfg.rb:136:1:136:3 | After ... / ... | | +| cfg.rb:136:1:136:3 | ... / ... | cfg.rb:136:12:136:29 | Before call to puts | exception | +| cfg.rb:136:1:136:3 | After ... / ... | cfg.rb:136:1:136:29 | After ... rescue ... | | +| cfg.rb:136:1:136:3 | Before ... / ... | cfg.rb:136:1:136:1 | 1 | | +| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:136:1:136:3 | Before ... / ... | | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:138:1:138:23 | ... | | | cfg.rb:136:3:136:3 | 0 | cfg.rb:136:1:136:3 | ... / ... | | -| cfg.rb:136:12:136:29 | call to puts | cfg.rb:136:1:136:29 | ... rescue ... | | -| cfg.rb:136:12:136:29 | self | cfg.rb:136:18:136:28 | div by zero | | -| cfg.rb:136:17:136:29 | "div by zero" | cfg.rb:136:12:136:29 | call to puts | | +| cfg.rb:136:12:136:29 | After call to puts | cfg.rb:136:1:136:29 | After ... rescue ... | | +| cfg.rb:136:12:136:29 | Before call to puts | cfg.rb:136:12:136:29 | self | | +| cfg.rb:136:12:136:29 | call to puts | cfg.rb:136:12:136:29 | After call to puts | | +| cfg.rb:136:12:136:29 | self | cfg.rb:136:17:136:29 | Before "div by zero" | | +| cfg.rb:136:17:136:29 | "div by zero" | cfg.rb:136:17:136:29 | After "div by zero" | | +| cfg.rb:136:17:136:29 | After "div by zero" | cfg.rb:136:12:136:29 | call to puts | | +| cfg.rb:136:17:136:29 | Before "div by zero" | cfg.rb:136:18:136:28 | div by zero | | | cfg.rb:136:18:136:28 | div by zero | cfg.rb:136:17:136:29 | "div by zero" | | -| cfg.rb:138:1:138:23 | ... | cfg.rb:140:1:140:1 | M | | +| cfg.rb:138:1:138:23 | ... | cfg.rb:138:17:138:23 | Before ... = ... | | +| cfg.rb:138:1:138:23 | After ... | cfg.rb:140:1:140:11 | Before Constant | | | cfg.rb:138:3:138:6 | 0 | cfg.rb:138:3:138:6 | -2 | | | cfg.rb:138:3:138:6 | -2 | cfg.rb:138:3:138:6 | _ .. _ | | -| cfg.rb:138:3:138:6 | ... = ... | cfg.rb:138:9:138:12 | last | | -| cfg.rb:138:3:138:6 | _ .. _ | cfg.rb:138:3:138:6 | call to [] | | -| cfg.rb:138:3:138:6 | __synth__2 | cfg.rb:138:3:138:6 | 0 | | -| cfg.rb:138:3:138:6 | call to [] | cfg.rb:138:3:138:6 | ... = ... | | -| cfg.rb:138:3:138:6 | init | cfg.rb:138:3:138:6 | __synth__2 | | +| cfg.rb:138:3:138:6 | ... = ... | cfg.rb:138:3:138:6 | After ... = ... | | +| cfg.rb:138:3:138:6 | After ... = ... | cfg.rb:138:9:138:12 | Before ... = ... | | +| cfg.rb:138:3:138:6 | After _ .. _ | cfg.rb:138:3:138:6 | call to [] | | +| cfg.rb:138:3:138:6 | After call to [] | cfg.rb:138:3:138:6 | ... = ... | | +| cfg.rb:138:3:138:6 | Before ... = ... | cfg.rb:138:3:138:6 | init | | +| cfg.rb:138:3:138:6 | Before _ .. _ | cfg.rb:138:3:138:6 | 0 | | +| cfg.rb:138:3:138:6 | Before call to [] | cfg.rb:138:3:138:6 | __synth__2 | | +| cfg.rb:138:3:138:6 | _ .. _ | cfg.rb:138:3:138:6 | After _ .. _ | | +| cfg.rb:138:3:138:6 | __synth__2 | cfg.rb:138:3:138:6 | Before _ .. _ | | +| cfg.rb:138:3:138:6 | call to [] | cfg.rb:138:3:138:6 | After call to [] | | +| cfg.rb:138:3:138:6 | init | cfg.rb:138:3:138:6 | Before call to [] | | | cfg.rb:138:9:138:12 | -1 | cfg.rb:138:9:138:12 | call to [] | | -| cfg.rb:138:9:138:12 | ... = ... | cfg.rb:138:1:138:23 | ... | | +| cfg.rb:138:9:138:12 | ... = ... | cfg.rb:138:9:138:12 | After ... = ... | | +| cfg.rb:138:9:138:12 | After ... = ... | cfg.rb:138:1:138:23 | After ... | | +| cfg.rb:138:9:138:12 | After call to [] | cfg.rb:138:9:138:12 | ... = ... | | +| cfg.rb:138:9:138:12 | Before ... = ... | cfg.rb:138:9:138:12 | last | | +| cfg.rb:138:9:138:12 | Before call to [] | cfg.rb:138:9:138:12 | __synth__2 | | | cfg.rb:138:9:138:12 | __synth__2 | cfg.rb:138:9:138:12 | -1 | | -| cfg.rb:138:9:138:12 | call to [] | cfg.rb:138:9:138:12 | ... = ... | | -| cfg.rb:138:9:138:12 | last | cfg.rb:138:9:138:12 | __synth__2 | | +| cfg.rb:138:9:138:12 | call to [] | cfg.rb:138:9:138:12 | After call to [] | | +| cfg.rb:138:9:138:12 | last | cfg.rb:138:9:138:12 | Before call to [] | | | cfg.rb:138:17:138:17 | 1 | cfg.rb:138:20:138:20 | 2 | | -| cfg.rb:138:17:138:23 | * ... | cfg.rb:138:17:138:23 | ... = ... | | -| cfg.rb:138:17:138:23 | ... = ... | cfg.rb:138:3:138:6 | init | | -| cfg.rb:138:17:138:23 | ..., ... | cfg.rb:138:17:138:23 | * ... | | -| cfg.rb:138:17:138:23 | __synth__2 | cfg.rb:138:17:138:17 | 1 | | +| cfg.rb:138:17:138:23 | * ... | cfg.rb:138:17:138:23 | After * ... | | +| cfg.rb:138:17:138:23 | ... = ... | cfg.rb:138:17:138:23 | After ... = ... | | +| cfg.rb:138:17:138:23 | ..., ... | cfg.rb:138:17:138:23 | After ..., ... | | +| cfg.rb:138:17:138:23 | After * ... | cfg.rb:138:17:138:23 | ... = ... | | +| cfg.rb:138:17:138:23 | After ... = ... | cfg.rb:138:3:138:6 | Before ... = ... | | +| cfg.rb:138:17:138:23 | After ..., ... | cfg.rb:138:17:138:23 | * ... | | +| cfg.rb:138:17:138:23 | Before * ... | cfg.rb:138:17:138:23 | Before ..., ... | | +| cfg.rb:138:17:138:23 | Before ... = ... | cfg.rb:138:17:138:23 | __synth__2 | | +| cfg.rb:138:17:138:23 | Before ..., ... | cfg.rb:138:17:138:17 | 1 | | +| cfg.rb:138:17:138:23 | __synth__2 | cfg.rb:138:17:138:23 | Before * ... | | | cfg.rb:138:20:138:20 | 2 | cfg.rb:138:23:138:23 | 3 | | | cfg.rb:138:23:138:23 | 3 | cfg.rb:138:17:138:23 | ..., ... | | | cfg.rb:140:1:140:1 | M | cfg.rb:140:1:140:11 | Constant | | -| cfg.rb:140:1:140:11 | Constant | cfg.rb:141:1:141:1 | M | | +| cfg.rb:140:1:140:11 | After Constant | cfg.rb:141:1:141:18 | Before Constant | | +| cfg.rb:140:1:140:11 | Before Constant | cfg.rb:140:1:140:1 | M | | +| cfg.rb:140:1:140:11 | Constant | cfg.rb:140:1:140:11 | After Constant | | | cfg.rb:141:1:141:1 | M | cfg.rb:141:1:141:8 | call to itself | | -| cfg.rb:141:1:141:8 | call to itself | cfg.rb:141:1:141:18 | Constant | | -| cfg.rb:141:1:141:18 | Constant | cfg.rb:143:10:143:14 | Silly | | -| cfg.rb:143:1:149:3 | class << ... | cfg.rb:151:1:151:5 | silly | | +| cfg.rb:141:1:141:8 | After call to itself | cfg.rb:141:1:141:18 | Constant | | +| cfg.rb:141:1:141:8 | Before call to itself | cfg.rb:141:1:141:1 | M | | +| cfg.rb:141:1:141:8 | call to itself | cfg.rb:141:1:141:8 | After call to itself | | +| cfg.rb:141:1:141:18 | After Constant | cfg.rb:143:1:149:3 | class << ... | | +| cfg.rb:141:1:141:18 | Before Constant | cfg.rb:141:1:141:8 | Before call to itself | | +| cfg.rb:141:1:141:18 | Constant | cfg.rb:141:1:141:18 | After Constant | | +| cfg.rb:143:1:149:3 | After class << ... | cfg.rb:151:1:151:17 | Before ... = ... | | +| cfg.rb:143:1:149:3 | class << ... | cfg.rb:143:10:143:21 | Before call to itself | | | cfg.rb:143:10:143:14 | Silly | cfg.rb:143:10:143:21 | call to itself | | -| cfg.rb:143:10:143:21 | call to itself | cfg.rb:144:3:144:19 | setter= | | +| cfg.rb:143:10:143:21 | After call to itself | cfg.rb:144:3:144:19 | setter= | | +| cfg.rb:143:10:143:21 | Before call to itself | cfg.rb:143:10:143:14 | Silly | | +| cfg.rb:143:10:143:21 | call to itself | cfg.rb:143:10:143:21 | After call to itself | | | cfg.rb:144:3:144:19 | setter= | cfg.rb:145:3:148:5 | print | | -| cfg.rb:145:3:148:5 | enter print | cfg.rb:146:5:146:20 | self | | -| cfg.rb:145:3:148:5 | exit print (normal) | cfg.rb:145:3:148:5 | exit print | | -| cfg.rb:145:3:148:5 | print | cfg.rb:143:1:149:3 | class << ... | | -| cfg.rb:146:5:146:20 | call to puts | cfg.rb:147:5:147:22 | self | | -| cfg.rb:146:5:146:20 | self | cfg.rb:146:11:146:19 | singleton | | -| cfg.rb:146:10:146:20 | "singleton" | cfg.rb:146:5:146:20 | call to puts | | +| cfg.rb:145:3:148:5 | Entry | cfg.rb:146:5:147:22 | ... | | +| cfg.rb:145:3:148:5 | Normal Exit | cfg.rb:145:3:148:5 | Exit | | +| cfg.rb:145:3:148:5 | print | cfg.rb:143:1:149:3 | After class << ... | | +| cfg.rb:146:5:146:20 | After call to puts | cfg.rb:147:5:147:22 | Before call to puts | | +| cfg.rb:146:5:146:20 | Before call to puts | cfg.rb:146:5:146:20 | self | | +| cfg.rb:146:5:146:20 | call to puts | cfg.rb:146:5:146:20 | After call to puts | | +| cfg.rb:146:5:146:20 | self | cfg.rb:146:10:146:20 | Before "singleton" | | +| cfg.rb:146:5:147:22 | ... | cfg.rb:146:5:146:20 | Before call to puts | | +| cfg.rb:146:5:147:22 | After ... | cfg.rb:145:3:148:5 | Normal Exit | | +| cfg.rb:146:10:146:20 | "singleton" | cfg.rb:146:10:146:20 | After "singleton" | | +| cfg.rb:146:10:146:20 | After "singleton" | cfg.rb:146:5:146:20 | call to puts | | +| cfg.rb:146:10:146:20 | Before "singleton" | cfg.rb:146:11:146:19 | singleton | | | cfg.rb:146:11:146:19 | singleton | cfg.rb:146:10:146:20 | "singleton" | | -| cfg.rb:147:5:147:22 | call to puts | cfg.rb:145:3:148:5 | exit print (normal) | | -| cfg.rb:147:5:147:22 | self | cfg.rb:147:10:147:14 | super call to print | | -| cfg.rb:147:10:147:14 | super call to print | cfg.rb:147:10:147:22 | call to print | | -| cfg.rb:147:10:147:22 | call to print | cfg.rb:147:5:147:22 | call to puts | | -| cfg.rb:151:1:151:5 | silly | cfg.rb:151:9:151:13 | Silly | | -| cfg.rb:151:1:151:17 | ... = ... | cfg.rb:152:5:152:9 | silly | | +| cfg.rb:147:5:147:22 | After call to puts | cfg.rb:146:5:147:22 | After ... | | +| cfg.rb:147:5:147:22 | Before call to puts | cfg.rb:147:5:147:22 | self | | +| cfg.rb:147:5:147:22 | call to puts | cfg.rb:147:5:147:22 | After call to puts | | +| cfg.rb:147:5:147:22 | self | cfg.rb:147:10:147:22 | Before call to print | | +| cfg.rb:147:10:147:14 | After super call to print | cfg.rb:147:10:147:22 | call to print | | +| cfg.rb:147:10:147:14 | Before super call to print | cfg.rb:147:10:147:14 | super call to print | | +| cfg.rb:147:10:147:14 | super call to print | cfg.rb:147:10:147:14 | After super call to print | | +| cfg.rb:147:10:147:22 | After call to print | cfg.rb:147:5:147:22 | call to puts | | +| cfg.rb:147:10:147:22 | Before call to print | cfg.rb:147:10:147:14 | Before super call to print | | +| cfg.rb:147:10:147:22 | call to print | cfg.rb:147:10:147:22 | After call to print | | +| cfg.rb:151:1:151:5 | silly | cfg.rb:151:9:151:17 | Before call to new | | +| cfg.rb:151:1:151:17 | ... = ... | cfg.rb:151:1:151:17 | After ... = ... | | +| cfg.rb:151:1:151:17 | After ... = ... | cfg.rb:152:1:154:3 | Before method | | +| cfg.rb:151:1:151:17 | Before ... = ... | cfg.rb:151:1:151:5 | silly | | | cfg.rb:151:9:151:13 | Silly | cfg.rb:151:9:151:17 | call to new | | -| cfg.rb:151:9:151:17 | call to new | cfg.rb:151:1:151:17 | ... = ... | | -| cfg.rb:152:1:154:3 | enter method | cfg.rb:152:19:152:19 | x | | -| cfg.rb:152:1:154:3 | exit method (normal) | cfg.rb:152:1:154:3 | exit method | | -| cfg.rb:152:1:154:3 | method | cfg.rb:156:1:156:28 | two_parameters | | +| cfg.rb:151:9:151:17 | After call to new | cfg.rb:151:1:151:17 | ... = ... | | +| cfg.rb:151:9:151:17 | Before call to new | cfg.rb:151:9:151:13 | Silly | | +| cfg.rb:151:9:151:17 | call to new | cfg.rb:151:9:151:17 | After call to new | | +| cfg.rb:152:1:154:3 | After method | cfg.rb:156:1:156:28 | two_parameters | | +| cfg.rb:152:1:154:3 | Before method | cfg.rb:152:5:152:9 | silly | | +| cfg.rb:152:1:154:3 | Entry | cfg.rb:152:19:152:19 | x | | +| cfg.rb:152:1:154:3 | Normal Exit | cfg.rb:152:1:154:3 | Exit | | +| cfg.rb:152:1:154:3 | method | cfg.rb:152:1:154:3 | After method | | | cfg.rb:152:5:152:9 | silly | cfg.rb:152:1:154:3 | method | | -| cfg.rb:152:19:152:19 | x | cfg.rb:153:3:153:8 | self | | -| cfg.rb:153:3:153:8 | call to puts | cfg.rb:152:1:154:3 | exit method (normal) | | +| cfg.rb:152:19:152:19 | x | cfg.rb:153:3:153:8 | ... | | +| cfg.rb:153:3:153:8 | ... | cfg.rb:153:3:153:8 | Before call to puts | | +| cfg.rb:153:3:153:8 | After ... | cfg.rb:152:1:154:3 | Normal Exit | | +| cfg.rb:153:3:153:8 | After call to puts | cfg.rb:153:3:153:8 | After ... | | +| cfg.rb:153:3:153:8 | Before call to puts | cfg.rb:153:3:153:8 | self | | +| cfg.rb:153:3:153:8 | call to puts | cfg.rb:153:3:153:8 | After call to puts | | | cfg.rb:153:3:153:8 | self | cfg.rb:153:8:153:8 | x | | | cfg.rb:153:8:153:8 | x | cfg.rb:153:3:153:8 | call to puts | | -| cfg.rb:156:1:156:28 | enter two_parameters | cfg.rb:156:21:156:21 | a | | -| cfg.rb:156:1:156:28 | exit two_parameters (normal) | cfg.rb:156:1:156:28 | exit two_parameters | | -| cfg.rb:156:1:156:28 | two_parameters | cfg.rb:158:1:158:22 | self | | -| cfg.rb:156:21:156:21 | a | cfg.rb:156:23:156:23 | b | | -| cfg.rb:156:23:156:23 | b | cfg.rb:156:1:156:28 | exit two_parameters (normal) | | -| cfg.rb:158:1:158:22 | call to two_parameters | cfg.rb:160:1:160:10 | scriptfile | | -| cfg.rb:158:1:158:22 | self | cfg.rb:158:17:158:21 | Array | | -| cfg.rb:158:16:158:21 | * ... | cfg.rb:158:1:158:22 | call to two_parameters | | +| cfg.rb:156:1:156:28 | two_parameters | cfg.rb:158:1:158:22 | Before call to two_parameters | | +| cfg.rb:158:1:158:22 | After call to two_parameters | cfg.rb:160:1:160:32 | Before ... = ... | | +| cfg.rb:158:1:158:22 | Before call to two_parameters | cfg.rb:158:1:158:22 | self | | +| cfg.rb:158:1:158:22 | call to two_parameters | cfg.rb:158:1:158:22 | After call to two_parameters | | +| cfg.rb:158:1:158:22 | self | cfg.rb:158:16:158:21 | Before * ... | | +| cfg.rb:158:16:158:21 | * ... | cfg.rb:158:16:158:21 | After * ... | | +| cfg.rb:158:16:158:21 | After * ... | cfg.rb:158:1:158:22 | call to two_parameters | | +| cfg.rb:158:16:158:21 | Before * ... | cfg.rb:158:17:158:21 | Before call to [] | | +| cfg.rb:158:17:158:21 | After call to [] | cfg.rb:158:16:158:21 | * ... | | | cfg.rb:158:17:158:21 | Array | cfg.rb:158:18:158:18 | 1 | | -| cfg.rb:158:17:158:21 | call to [] | cfg.rb:158:16:158:21 | * ... | | +| cfg.rb:158:17:158:21 | Before call to [] | cfg.rb:158:17:158:21 | Array | | +| cfg.rb:158:17:158:21 | call to [] | cfg.rb:158:17:158:21 | After call to [] | | | cfg.rb:158:18:158:18 | 1 | cfg.rb:158:20:158:20 | 2 | | | cfg.rb:158:20:158:20 | 2 | cfg.rb:158:17:158:21 | call to [] | | -| cfg.rb:160:1:160:10 | scriptfile | cfg.rb:160:15:160:19 | cat " | | -| cfg.rb:160:1:160:32 | ... = ... | cfg.rb:162:1:162:6 | symbol | | -| cfg.rb:160:14:160:32 | `cat "#{...}"` | cfg.rb:160:1:160:32 | ... = ... | | -| cfg.rb:160:15:160:19 | cat " | cfg.rb:160:22:160:29 | self | | -| cfg.rb:160:20:160:30 | #{...} | cfg.rb:160:31:160:31 | " | | -| cfg.rb:160:22:160:29 | call to __FILE__ | cfg.rb:160:20:160:30 | #{...} | | +| cfg.rb:160:1:160:10 | scriptfile | cfg.rb:160:14:160:32 | Before `cat "#{...}"` | | +| cfg.rb:160:1:160:32 | ... = ... | cfg.rb:160:1:160:32 | After ... = ... | | +| cfg.rb:160:1:160:32 | After ... = ... | cfg.rb:162:1:162:15 | Before ... = ... | | +| cfg.rb:160:1:160:32 | Before ... = ... | cfg.rb:160:1:160:10 | scriptfile | | +| cfg.rb:160:14:160:32 | After `cat "#{...}"` | cfg.rb:160:1:160:32 | ... = ... | | +| cfg.rb:160:14:160:32 | Before `cat "#{...}"` | cfg.rb:160:15:160:19 | cat " | | +| cfg.rb:160:14:160:32 | `cat "#{...}"` | cfg.rb:160:14:160:32 | After `cat "#{...}"` | | +| cfg.rb:160:15:160:19 | cat " | cfg.rb:160:20:160:30 | #{...} | | +| cfg.rb:160:20:160:30 | #{...} | cfg.rb:160:22:160:29 | Before call to __FILE__ | | +| cfg.rb:160:20:160:30 | After #{...} | cfg.rb:160:31:160:31 | " | | +| cfg.rb:160:22:160:29 | After call to __FILE__ | cfg.rb:160:20:160:30 | After #{...} | | +| cfg.rb:160:22:160:29 | Before call to __FILE__ | cfg.rb:160:22:160:29 | self | | +| cfg.rb:160:22:160:29 | call to __FILE__ | cfg.rb:160:22:160:29 | After call to __FILE__ | | | cfg.rb:160:22:160:29 | self | cfg.rb:160:22:160:29 | call to __FILE__ | | | cfg.rb:160:31:160:31 | " | cfg.rb:160:14:160:32 | `cat "#{...}"` | | -| cfg.rb:162:1:162:6 | symbol | cfg.rb:162:10:162:15 | hello | | -| cfg.rb:162:1:162:15 | ... = ... | cfg.rb:164:1:164:16 | delimited_symbol | | -| cfg.rb:162:10:162:15 | :hello | cfg.rb:162:1:162:15 | ... = ... | | +| cfg.rb:162:1:162:6 | symbol | cfg.rb:162:10:162:15 | Before :hello | | +| cfg.rb:162:1:162:15 | ... = ... | cfg.rb:162:1:162:15 | After ... = ... | | +| cfg.rb:162:1:162:15 | After ... = ... | cfg.rb:164:1:164:42 | Before ... = ... | | +| cfg.rb:162:1:162:15 | Before ... = ... | cfg.rb:162:1:162:6 | symbol | | +| cfg.rb:162:10:162:15 | :hello | cfg.rb:162:10:162:15 | After :hello | | +| cfg.rb:162:10:162:15 | After :hello | cfg.rb:162:1:162:15 | ... = ... | | +| cfg.rb:162:10:162:15 | Before :hello | cfg.rb:162:10:162:15 | hello | | | cfg.rb:162:10:162:15 | hello | cfg.rb:162:10:162:15 | :hello | | -| cfg.rb:164:1:164:16 | delimited_symbol | cfg.rb:164:22:164:29 | goodbye- | | -| cfg.rb:164:1:164:42 | ... = ... | cfg.rb:166:1:166:1 | x | | -| cfg.rb:164:20:164:42 | :"goodbye-#{...}" | cfg.rb:164:1:164:42 | ... = ... | | -| cfg.rb:164:22:164:29 | goodbye- | cfg.rb:164:33:164:34 | 12 | | -| cfg.rb:164:30:164:41 | #{...} | cfg.rb:164:20:164:42 | :"goodbye-#{...}" | | +| cfg.rb:164:1:164:16 | delimited_symbol | cfg.rb:164:20:164:42 | Before :"goodbye-#{...}" | | +| cfg.rb:164:1:164:42 | ... = ... | cfg.rb:164:1:164:42 | After ... = ... | | +| cfg.rb:164:1:164:42 | After ... = ... | cfg.rb:166:1:166:8 | Before ... = ... | | +| cfg.rb:164:1:164:42 | Before ... = ... | cfg.rb:164:1:164:16 | delimited_symbol | | +| cfg.rb:164:20:164:42 | :"goodbye-#{...}" | cfg.rb:164:20:164:42 | After :"goodbye-#{...}" | | +| cfg.rb:164:20:164:42 | After :"goodbye-#{...}" | cfg.rb:164:1:164:42 | ... = ... | | +| cfg.rb:164:20:164:42 | Before :"goodbye-#{...}" | cfg.rb:164:22:164:29 | goodbye- | | +| cfg.rb:164:22:164:29 | goodbye- | cfg.rb:164:30:164:41 | #{...} | | +| cfg.rb:164:30:164:41 | #{...} | cfg.rb:164:33:164:39 | Before ... + ... | | +| cfg.rb:164:30:164:41 | After #{...} | cfg.rb:164:20:164:42 | :"goodbye-#{...}" | | | cfg.rb:164:33:164:34 | 12 | cfg.rb:164:38:164:39 | 13 | | -| cfg.rb:164:33:164:39 | ... + ... | cfg.rb:164:30:164:41 | #{...} | | +| cfg.rb:164:33:164:39 | ... + ... | cfg.rb:164:33:164:39 | After ... + ... | | +| cfg.rb:164:33:164:39 | After ... + ... | cfg.rb:164:30:164:41 | After #{...} | | +| cfg.rb:164:33:164:39 | Before ... + ... | cfg.rb:164:33:164:34 | 12 | | | cfg.rb:164:38:164:39 | 13 | cfg.rb:164:33:164:39 | ... + ... | | | cfg.rb:166:1:166:1 | x | cfg.rb:166:5:166:8 | true | | -| cfg.rb:166:1:166:8 | ... = ... | cfg.rb:167:1:167:1 | x | | +| cfg.rb:166:1:166:8 | ... = ... | cfg.rb:166:1:166:8 | After ... = ... | | +| cfg.rb:166:1:166:8 | After ... = ... | cfg.rb:167:1:167:10 | Before ... = ... | | +| cfg.rb:166:1:166:8 | Before ... = ... | cfg.rb:166:1:166:1 | x | | | cfg.rb:166:5:166:8 | true | cfg.rb:166:1:166:8 | ... = ... | | -| cfg.rb:167:1:167:1 | x | cfg.rb:167:7:167:10 | true | | -| cfg.rb:167:1:167:10 | ... = ... | cfg.rb:168:1:168:1 | x | | -| cfg.rb:167:5:167:10 | ! ... | cfg.rb:167:1:167:10 | ... = ... | | -| cfg.rb:167:7:167:10 | true | cfg.rb:167:5:167:10 | ! ... | | -| cfg.rb:168:1:168:1 | x | cfg.rb:168:7:168:8 | 42 | | -| cfg.rb:168:1:168:8 | ... = ... | cfg.rb:170:1:170:20 | undef ... | | -| cfg.rb:168:5:168:8 | - ... | cfg.rb:168:1:168:8 | ... = ... | | +| cfg.rb:167:1:167:1 | x | cfg.rb:167:5:167:10 | ! ... | | +| cfg.rb:167:1:167:10 | ... = ... | cfg.rb:167:1:167:10 | After ... = ... | | +| cfg.rb:167:1:167:10 | After ... = ... | cfg.rb:168:1:168:8 | Before ... = ... | | +| cfg.rb:167:1:167:10 | Before ... = ... | cfg.rb:167:1:167:1 | x | | +| cfg.rb:167:5:167:10 | ! ... | cfg.rb:167:7:167:10 | true | | +| cfg.rb:167:5:167:10 | After ! ... | cfg.rb:167:1:167:10 | ... = ... | | +| cfg.rb:167:7:167:10 | true | cfg.rb:167:5:167:10 | After ! ... | | +| cfg.rb:168:1:168:1 | x | cfg.rb:168:5:168:8 | Before - ... | | +| cfg.rb:168:1:168:8 | ... = ... | cfg.rb:168:1:168:8 | After ... = ... | | +| cfg.rb:168:1:168:8 | After ... = ... | cfg.rb:170:1:170:20 | Before undef ... | | +| cfg.rb:168:1:168:8 | Before ... = ... | cfg.rb:168:1:168:1 | x | | +| cfg.rb:168:5:168:8 | - ... | cfg.rb:168:5:168:8 | After - ... | | +| cfg.rb:168:5:168:8 | After - ... | cfg.rb:168:1:168:8 | ... = ... | | +| cfg.rb:168:5:168:8 | Before - ... | cfg.rb:168:7:168:8 | 42 | | | cfg.rb:168:7:168:8 | 42 | cfg.rb:168:5:168:8 | - ... | | -| cfg.rb:170:1:170:20 | undef ... | cfg.rb:170:7:170:20 | two_parameters | | -| cfg.rb:170:7:170:20 | two_parameters | cfg.rb:172:8:172:8 | x | | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:174:18:174:18 | x | | +| cfg.rb:170:1:170:20 | After undef ... | cfg.rb:172:1:172:49 | unless ... | | +| cfg.rb:170:1:170:20 | Before undef ... | cfg.rb:170:7:170:20 | two_parameters | | +| cfg.rb:170:1:170:20 | undef ... | cfg.rb:170:1:170:20 | After undef ... | | +| cfg.rb:170:7:170:20 | two_parameters | cfg.rb:170:1:170:20 | undef ... | | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:174:1:174:23 | ... unless ... | | +| cfg.rb:172:1:172:49 | unless ... | cfg.rb:172:8:172:14 | Before ... == ... | | | cfg.rb:172:8:172:8 | x | cfg.rb:172:13:172:14 | 10 | | -| cfg.rb:172:8:172:14 | ... == ... | cfg.rb:172:21:172:29 | self | false | -| cfg.rb:172:8:172:14 | ... == ... | cfg.rb:172:36:172:45 | self | true | +| cfg.rb:172:8:172:14 | ... == ... | cfg.rb:172:8:172:14 | After ... == ... [false] | false | +| cfg.rb:172:8:172:14 | ... == ... | cfg.rb:172:8:172:14 | After ... == ... [true] | true | +| cfg.rb:172:8:172:14 | After ... == ... [false] | cfg.rb:172:16:172:29 | then ... | | +| cfg.rb:172:8:172:14 | After ... == ... [true] | cfg.rb:172:31:172:45 | else ... | | +| cfg.rb:172:8:172:14 | Before ... == ... | cfg.rb:172:8:172:8 | x | | | cfg.rb:172:13:172:14 | 10 | cfg.rb:172:8:172:14 | ... == ... | | -| cfg.rb:172:16:172:29 | then ... | cfg.rb:172:1:172:49 | unless ... | | -| cfg.rb:172:21:172:29 | call to puts | cfg.rb:172:16:172:29 | then ... | | -| cfg.rb:172:21:172:29 | self | cfg.rb:172:27:172:28 | hi | | -| cfg.rb:172:26:172:29 | "hi" | cfg.rb:172:21:172:29 | call to puts | | +| cfg.rb:172:16:172:29 | After then ... | cfg.rb:172:1:172:49 | After unless ... | | +| cfg.rb:172:16:172:29 | then ... | cfg.rb:172:21:172:29 | Before call to puts | | +| cfg.rb:172:21:172:29 | After call to puts | cfg.rb:172:16:172:29 | After then ... | | +| cfg.rb:172:21:172:29 | Before call to puts | cfg.rb:172:21:172:29 | self | | +| cfg.rb:172:21:172:29 | call to puts | cfg.rb:172:21:172:29 | After call to puts | | +| cfg.rb:172:21:172:29 | self | cfg.rb:172:26:172:29 | Before "hi" | | +| cfg.rb:172:26:172:29 | "hi" | cfg.rb:172:26:172:29 | After "hi" | | +| cfg.rb:172:26:172:29 | After "hi" | cfg.rb:172:21:172:29 | call to puts | | +| cfg.rb:172:26:172:29 | Before "hi" | cfg.rb:172:27:172:28 | hi | | | cfg.rb:172:27:172:28 | hi | cfg.rb:172:26:172:29 | "hi" | | -| cfg.rb:172:31:172:45 | else ... | cfg.rb:172:1:172:49 | unless ... | | -| cfg.rb:172:36:172:45 | call to puts | cfg.rb:172:31:172:45 | else ... | | -| cfg.rb:172:36:172:45 | self | cfg.rb:172:42:172:44 | bye | | -| cfg.rb:172:41:172:45 | "bye" | cfg.rb:172:36:172:45 | call to puts | | +| cfg.rb:172:31:172:45 | After else ... | cfg.rb:172:1:172:49 | After unless ... | | +| cfg.rb:172:31:172:45 | else ... | cfg.rb:172:36:172:45 | Before call to puts | | +| cfg.rb:172:36:172:45 | After call to puts | cfg.rb:172:31:172:45 | After else ... | | +| cfg.rb:172:36:172:45 | Before call to puts | cfg.rb:172:36:172:45 | self | | +| cfg.rb:172:36:172:45 | call to puts | cfg.rb:172:36:172:45 | After call to puts | | +| cfg.rb:172:36:172:45 | self | cfg.rb:172:41:172:45 | Before "bye" | | +| cfg.rb:172:41:172:45 | "bye" | cfg.rb:172:41:172:45 | After "bye" | | +| cfg.rb:172:41:172:45 | After "bye" | cfg.rb:172:36:172:45 | call to puts | | +| cfg.rb:172:41:172:45 | Before "bye" | cfg.rb:172:42:172:44 | bye | | | cfg.rb:172:42:172:44 | bye | cfg.rb:172:41:172:45 | "bye" | | -| cfg.rb:174:1:174:9 | call to puts | cfg.rb:174:1:174:23 | ... unless ... | | -| cfg.rb:174:1:174:9 | self | cfg.rb:174:7:174:8 | hi | | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:176:7:176:7 | x | | -| cfg.rb:174:6:174:9 | "hi" | cfg.rb:174:1:174:9 | call to puts | | +| cfg.rb:174:1:174:9 | After call to puts | cfg.rb:174:1:174:23 | After ... unless ... | | +| cfg.rb:174:1:174:9 | Before call to puts | cfg.rb:174:1:174:9 | self | | +| cfg.rb:174:1:174:9 | call to puts | cfg.rb:174:1:174:9 | After call to puts | | +| cfg.rb:174:1:174:9 | self | cfg.rb:174:6:174:9 | Before "hi" | | +| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:174:18:174:23 | Before ... == ... | | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:176:1:176:41 | until ... | | +| cfg.rb:174:6:174:9 | "hi" | cfg.rb:174:6:174:9 | After "hi" | | +| cfg.rb:174:6:174:9 | After "hi" | cfg.rb:174:1:174:9 | call to puts | | +| cfg.rb:174:6:174:9 | Before "hi" | cfg.rb:174:7:174:8 | hi | | | cfg.rb:174:7:174:8 | hi | cfg.rb:174:6:174:9 | "hi" | | | cfg.rb:174:18:174:18 | x | cfg.rb:174:23:174:23 | 0 | | -| cfg.rb:174:18:174:23 | ... == ... | cfg.rb:174:1:174:9 | self | false | -| cfg.rb:174:18:174:23 | ... == ... | cfg.rb:174:1:174:23 | ... unless ... | true | +| cfg.rb:174:18:174:23 | ... == ... | cfg.rb:174:18:174:23 | After ... == ... [false] | false | +| cfg.rb:174:18:174:23 | ... == ... | cfg.rb:174:18:174:23 | After ... == ... [true] | true | +| cfg.rb:174:18:174:23 | After ... == ... [false] | cfg.rb:174:1:174:9 | Before call to puts | | +| cfg.rb:174:18:174:23 | After ... == ... [true] | cfg.rb:174:1:174:23 | After ... unless ... | | +| cfg.rb:174:18:174:23 | Before ... == ... | cfg.rb:174:18:174:18 | x | | | cfg.rb:174:23:174:23 | 0 | cfg.rb:174:18:174:23 | ... == ... | | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:178:1:178:1 | i | | +| cfg.rb:176:1:176:41 | After until ... | cfg.rb:178:1:178:5 | Before ... = ... | | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:176:7:176:12 | Before ... > ... | | +| cfg.rb:176:1:176:41 | until ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | | | cfg.rb:176:7:176:7 | x | cfg.rb:176:11:176:12 | 10 | | -| cfg.rb:176:7:176:12 | ... > ... | cfg.rb:176:1:176:41 | until ... | true | -| cfg.rb:176:7:176:12 | ... > ... | cfg.rb:176:17:176:17 | x | false | +| cfg.rb:176:7:176:12 | ... > ... | cfg.rb:176:7:176:12 | After ... > ... [false] | false | +| cfg.rb:176:7:176:12 | ... > ... | cfg.rb:176:7:176:12 | After ... > ... [true] | true | +| cfg.rb:176:7:176:12 | After ... > ... [false] | cfg.rb:176:14:176:41 | do ... | | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:176:1:176:41 | After until ... | | +| cfg.rb:176:7:176:12 | Before ... > ... | cfg.rb:176:7:176:7 | x | | | cfg.rb:176:11:176:12 | 10 | cfg.rb:176:7:176:12 | ... > ... | | -| cfg.rb:176:14:176:41 | do ... | cfg.rb:176:7:176:7 | x | | -| cfg.rb:176:17:176:17 | x | cfg.rb:176:17:176:17 | x | | +| cfg.rb:176:14:176:41 | After do ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | | +| cfg.rb:176:14:176:41 | do ... | cfg.rb:176:17:176:23 | Before ... = ... | | +| cfg.rb:176:17:176:17 | x | cfg.rb:176:19:176:20 | Before ... + ... | | | cfg.rb:176:17:176:17 | x | cfg.rb:176:22:176:23 | 10 | | -| cfg.rb:176:17:176:23 | ... = ... | cfg.rb:176:26:176:37 | self | | -| cfg.rb:176:19:176:20 | ... + ... | cfg.rb:176:17:176:23 | ... = ... | | +| cfg.rb:176:17:176:23 | ... = ... | cfg.rb:176:17:176:23 | After ... = ... | | +| cfg.rb:176:17:176:23 | After ... = ... | cfg.rb:176:26:176:37 | Before call to puts | | +| cfg.rb:176:17:176:23 | Before ... = ... | cfg.rb:176:17:176:17 | x | | +| cfg.rb:176:19:176:20 | ... + ... | cfg.rb:176:19:176:20 | After ... + ... | | +| cfg.rb:176:19:176:20 | After ... + ... | cfg.rb:176:17:176:23 | ... = ... | | +| cfg.rb:176:19:176:20 | Before ... + ... | cfg.rb:176:17:176:17 | x | | | cfg.rb:176:22:176:23 | 10 | cfg.rb:176:19:176:20 | ... + ... | | -| cfg.rb:176:26:176:37 | call to puts | cfg.rb:176:14:176:41 | do ... | | -| cfg.rb:176:26:176:37 | self | cfg.rb:176:32:176:36 | hello | | -| cfg.rb:176:31:176:37 | "hello" | cfg.rb:176:26:176:37 | call to puts | | +| cfg.rb:176:26:176:37 | After call to puts | cfg.rb:176:14:176:41 | After do ... | | +| cfg.rb:176:26:176:37 | Before call to puts | cfg.rb:176:26:176:37 | self | | +| cfg.rb:176:26:176:37 | call to puts | cfg.rb:176:26:176:37 | After call to puts | | +| cfg.rb:176:26:176:37 | self | cfg.rb:176:31:176:37 | Before "hello" | | +| cfg.rb:176:31:176:37 | "hello" | cfg.rb:176:31:176:37 | After "hello" | | +| cfg.rb:176:31:176:37 | After "hello" | cfg.rb:176:26:176:37 | call to puts | | +| cfg.rb:176:31:176:37 | Before "hello" | cfg.rb:176:32:176:36 | hello | | | cfg.rb:176:32:176:36 | hello | cfg.rb:176:31:176:37 | "hello" | | | cfg.rb:178:1:178:1 | i | cfg.rb:178:5:178:5 | 0 | | -| cfg.rb:178:1:178:5 | ... = ... | cfg.rb:179:30:179:30 | i | | +| cfg.rb:178:1:178:5 | ... = ... | cfg.rb:178:1:178:5 | After ... = ... | | +| cfg.rb:178:1:178:5 | After ... = ... | cfg.rb:179:1:179:36 | ... until ... | | +| cfg.rb:178:1:178:5 | Before ... = ... | cfg.rb:178:1:178:1 | i | | | cfg.rb:178:5:178:5 | 0 | cfg.rb:178:1:178:5 | ... = ... | | -| cfg.rb:179:1:179:22 | ( ... ) | cfg.rb:179:30:179:30 | i | | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:181:1:181:1 | x | | -| cfg.rb:179:2:179:13 | call to puts | cfg.rb:179:16:179:16 | i | | -| cfg.rb:179:2:179:13 | self | cfg.rb:179:8:179:12 | hello | | -| cfg.rb:179:7:179:13 | "hello" | cfg.rb:179:2:179:13 | call to puts | | +| cfg.rb:179:1:179:22 | ( ... ) | cfg.rb:179:2:179:13 | Before call to puts | | +| cfg.rb:179:1:179:22 | After ( ... ) | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | | +| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | | +| cfg.rb:179:1:179:36 | After ... until ... | cfg.rb:181:1:181:5 | Before ... = ... | | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:179:30:179:36 | Before ... == ... | | +| cfg.rb:179:2:179:13 | After call to puts | cfg.rb:179:16:179:21 | Before ... = ... | | +| cfg.rb:179:2:179:13 | Before call to puts | cfg.rb:179:2:179:13 | self | | +| cfg.rb:179:2:179:13 | call to puts | cfg.rb:179:2:179:13 | After call to puts | | +| cfg.rb:179:2:179:13 | self | cfg.rb:179:7:179:13 | Before "hello" | | +| cfg.rb:179:7:179:13 | "hello" | cfg.rb:179:7:179:13 | After "hello" | | +| cfg.rb:179:7:179:13 | After "hello" | cfg.rb:179:2:179:13 | call to puts | | +| cfg.rb:179:7:179:13 | Before "hello" | cfg.rb:179:8:179:12 | hello | | | cfg.rb:179:8:179:12 | hello | cfg.rb:179:7:179:13 | "hello" | | -| cfg.rb:179:16:179:16 | i | cfg.rb:179:16:179:16 | i | | +| cfg.rb:179:16:179:16 | i | cfg.rb:179:18:179:19 | Before ... + ... | | | cfg.rb:179:16:179:16 | i | cfg.rb:179:21:179:21 | 1 | | -| cfg.rb:179:16:179:21 | ... = ... | cfg.rb:179:1:179:22 | ( ... ) | | -| cfg.rb:179:18:179:19 | ... + ... | cfg.rb:179:16:179:21 | ... = ... | | +| cfg.rb:179:16:179:21 | ... = ... | cfg.rb:179:16:179:21 | After ... = ... | | +| cfg.rb:179:16:179:21 | After ... = ... | cfg.rb:179:1:179:22 | After ( ... ) | | +| cfg.rb:179:16:179:21 | Before ... = ... | cfg.rb:179:16:179:16 | i | | +| cfg.rb:179:18:179:19 | ... + ... | cfg.rb:179:18:179:19 | After ... + ... | | +| cfg.rb:179:18:179:19 | After ... + ... | cfg.rb:179:16:179:21 | ... = ... | | +| cfg.rb:179:18:179:19 | Before ... + ... | cfg.rb:179:16:179:16 | i | | | cfg.rb:179:21:179:21 | 1 | cfg.rb:179:18:179:19 | ... + ... | | | cfg.rb:179:30:179:30 | i | cfg.rb:179:35:179:36 | 10 | | -| cfg.rb:179:30:179:36 | ... == ... | cfg.rb:179:1:179:36 | ... until ... | true | -| cfg.rb:179:30:179:36 | ... == ... | cfg.rb:179:2:179:13 | self | false | +| cfg.rb:179:30:179:36 | ... == ... | cfg.rb:179:30:179:36 | After ... == ... [false] | false | +| cfg.rb:179:30:179:36 | ... == ... | cfg.rb:179:30:179:36 | After ... == ... [true] | true | +| cfg.rb:179:30:179:36 | After ... == ... [false] | cfg.rb:179:1:179:22 | ( ... ) | | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:179:1:179:36 | After ... until ... | | +| cfg.rb:179:30:179:36 | Before ... == ... | cfg.rb:179:30:179:30 | i | | | cfg.rb:179:35:179:36 | 10 | cfg.rb:179:30:179:36 | ... == ... | | | cfg.rb:181:1:181:1 | x | cfg.rb:181:5:181:5 | 0 | | -| cfg.rb:181:1:181:5 | ... = ... | cfg.rb:182:7:182:7 | x | | +| cfg.rb:181:1:181:5 | ... = ... | cfg.rb:181:1:181:5 | After ... = ... | | +| cfg.rb:181:1:181:5 | After ... = ... | cfg.rb:182:1:186:3 | while ... | | +| cfg.rb:181:1:181:5 | Before ... = ... | cfg.rb:181:1:181:1 | x | | | cfg.rb:181:5:181:5 | 0 | cfg.rb:181:1:181:5 | ... = ... | | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:188:30:188:30 | i | | +| cfg.rb:182:1:186:3 | After while ... | cfg.rb:188:1:188:35 | ... while ... | | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:182:7:182:12 | Before ... < ... | | +| cfg.rb:182:1:186:3 | while ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | | | cfg.rb:182:7:182:7 | x | cfg.rb:182:11:182:12 | 10 | | -| cfg.rb:182:7:182:12 | ... < ... | cfg.rb:182:1:186:3 | while ... | false | -| cfg.rb:182:7:182:12 | ... < ... | cfg.rb:183:3:183:3 | x | true | +| cfg.rb:182:7:182:12 | ... < ... | cfg.rb:182:7:182:12 | After ... < ... [false] | false | +| cfg.rb:182:7:182:12 | ... < ... | cfg.rb:182:7:182:12 | After ... < ... [true] | true | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:182:1:186:3 | After while ... | | +| cfg.rb:182:7:182:12 | After ... < ... [true] | cfg.rb:182:14:186:3 | do ... | | +| cfg.rb:182:7:182:12 | Before ... < ... | cfg.rb:182:7:182:7 | x | | | cfg.rb:182:11:182:12 | 10 | cfg.rb:182:7:182:12 | ... < ... | | -| cfg.rb:182:14:186:3 | do ... | cfg.rb:182:7:182:7 | x | | -| cfg.rb:183:3:183:3 | x | cfg.rb:183:3:183:3 | x | | +| cfg.rb:182:14:186:3 | After do ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | | +| cfg.rb:182:14:186:3 | do ... | cfg.rb:183:3:183:8 | Before ... = ... | | +| cfg.rb:183:3:183:3 | x | cfg.rb:183:5:183:6 | Before ... + ... | | | cfg.rb:183:3:183:3 | x | cfg.rb:183:8:183:8 | 1 | | -| cfg.rb:183:3:183:8 | ... = ... | cfg.rb:184:6:184:6 | x | | -| cfg.rb:183:5:183:6 | ... + ... | cfg.rb:183:3:183:8 | ... = ... | | +| cfg.rb:183:3:183:8 | ... = ... | cfg.rb:183:3:183:8 | After ... = ... | | +| cfg.rb:183:3:183:8 | After ... = ... | cfg.rb:184:3:184:25 | if ... | | +| cfg.rb:183:3:183:8 | Before ... = ... | cfg.rb:183:3:183:3 | x | | +| cfg.rb:183:5:183:6 | ... + ... | cfg.rb:183:5:183:6 | After ... + ... | | +| cfg.rb:183:5:183:6 | After ... + ... | cfg.rb:183:3:183:8 | ... = ... | | +| cfg.rb:183:5:183:6 | Before ... + ... | cfg.rb:183:3:183:3 | x | | | cfg.rb:183:8:183:8 | 1 | cfg.rb:183:5:183:6 | ... + ... | | -| cfg.rb:184:3:184:25 | if ... | cfg.rb:185:3:185:8 | self | | +| cfg.rb:184:3:184:25 | After if ... | cfg.rb:185:3:185:8 | Before call to puts | | +| cfg.rb:184:3:184:25 | if ... | cfg.rb:184:6:184:11 | Before ... == ... | | | cfg.rb:184:6:184:6 | x | cfg.rb:184:11:184:11 | 5 | | -| cfg.rb:184:6:184:11 | ... == ... | cfg.rb:184:3:184:25 | if ... | false | -| cfg.rb:184:6:184:11 | ... == ... | cfg.rb:184:18:184:21 | redo | true | +| cfg.rb:184:6:184:11 | ... == ... | cfg.rb:184:6:184:11 | After ... == ... [false] | false | +| cfg.rb:184:6:184:11 | ... == ... | cfg.rb:184:6:184:11 | After ... == ... [true] | true | +| cfg.rb:184:6:184:11 | After ... == ... [false] | cfg.rb:184:3:184:25 | After if ... | | +| cfg.rb:184:6:184:11 | After ... == ... [true] | cfg.rb:184:13:184:21 | then ... | | +| cfg.rb:184:6:184:11 | Before ... == ... | cfg.rb:184:6:184:6 | x | | | cfg.rb:184:11:184:11 | 5 | cfg.rb:184:6:184:11 | ... == ... | | -| cfg.rb:184:18:184:21 | redo | cfg.rb:183:3:183:3 | x | redo | -| cfg.rb:185:3:185:8 | call to puts | cfg.rb:182:14:186:3 | do ... | | +| cfg.rb:184:13:184:21 | then ... | cfg.rb:184:18:184:21 | Before redo | | +| cfg.rb:184:18:184:21 | Before redo | cfg.rb:184:18:184:21 | redo | | +| cfg.rb:184:18:184:21 | redo | cfg.rb:182:14:186:3 | do ... | redo | +| cfg.rb:185:3:185:8 | After call to puts | cfg.rb:182:14:186:3 | After do ... | | +| cfg.rb:185:3:185:8 | Before call to puts | cfg.rb:185:3:185:8 | self | | +| cfg.rb:185:3:185:8 | call to puts | cfg.rb:185:3:185:8 | After call to puts | | | cfg.rb:185:3:185:8 | self | cfg.rb:185:8:185:8 | x | | | cfg.rb:185:8:185:8 | x | cfg.rb:185:3:185:8 | call to puts | | -| cfg.rb:188:1:188:22 | ( ... ) | cfg.rb:188:30:188:30 | i | | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:190:1:192:3 | run_block | | -| cfg.rb:188:2:188:13 | call to puts | cfg.rb:188:16:188:16 | i | | -| cfg.rb:188:2:188:13 | self | cfg.rb:188:8:188:12 | hello | | -| cfg.rb:188:7:188:13 | "hello" | cfg.rb:188:2:188:13 | call to puts | | +| cfg.rb:188:1:188:22 | ( ... ) | cfg.rb:188:2:188:13 | Before call to puts | | +| cfg.rb:188:1:188:22 | After ( ... ) | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | | +| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | | +| cfg.rb:188:1:188:35 | After ... while ... | cfg.rb:190:1:192:3 | run_block | | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:188:30:188:35 | Before ... != ... | | +| cfg.rb:188:2:188:13 | After call to puts | cfg.rb:188:16:188:21 | Before ... = ... | | +| cfg.rb:188:2:188:13 | Before call to puts | cfg.rb:188:2:188:13 | self | | +| cfg.rb:188:2:188:13 | call to puts | cfg.rb:188:2:188:13 | After call to puts | | +| cfg.rb:188:2:188:13 | self | cfg.rb:188:7:188:13 | Before "hello" | | +| cfg.rb:188:7:188:13 | "hello" | cfg.rb:188:7:188:13 | After "hello" | | +| cfg.rb:188:7:188:13 | After "hello" | cfg.rb:188:2:188:13 | call to puts | | +| cfg.rb:188:7:188:13 | Before "hello" | cfg.rb:188:8:188:12 | hello | | | cfg.rb:188:8:188:12 | hello | cfg.rb:188:7:188:13 | "hello" | | -| cfg.rb:188:16:188:16 | i | cfg.rb:188:16:188:16 | i | | +| cfg.rb:188:16:188:16 | i | cfg.rb:188:18:188:19 | Before ... - ... | | | cfg.rb:188:16:188:16 | i | cfg.rb:188:21:188:21 | 1 | | -| cfg.rb:188:16:188:21 | ... = ... | cfg.rb:188:1:188:22 | ( ... ) | | -| cfg.rb:188:18:188:19 | ... - ... | cfg.rb:188:16:188:21 | ... = ... | | +| cfg.rb:188:16:188:21 | ... = ... | cfg.rb:188:16:188:21 | After ... = ... | | +| cfg.rb:188:16:188:21 | After ... = ... | cfg.rb:188:1:188:22 | After ( ... ) | | +| cfg.rb:188:16:188:21 | Before ... = ... | cfg.rb:188:16:188:16 | i | | +| cfg.rb:188:18:188:19 | ... - ... | cfg.rb:188:18:188:19 | After ... - ... | | +| cfg.rb:188:18:188:19 | After ... - ... | cfg.rb:188:16:188:21 | ... = ... | | +| cfg.rb:188:18:188:19 | Before ... - ... | cfg.rb:188:16:188:16 | i | | | cfg.rb:188:21:188:21 | 1 | cfg.rb:188:18:188:19 | ... - ... | | | cfg.rb:188:30:188:30 | i | cfg.rb:188:35:188:35 | 0 | | -| cfg.rb:188:30:188:35 | ... != ... | cfg.rb:188:1:188:35 | ... while ... | false | -| cfg.rb:188:30:188:35 | ... != ... | cfg.rb:188:2:188:13 | self | true | +| cfg.rb:188:30:188:35 | ... != ... | cfg.rb:188:30:188:35 | After ... != ... [false] | false | +| cfg.rb:188:30:188:35 | ... != ... | cfg.rb:188:30:188:35 | After ... != ... [true] | true | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:188:1:188:35 | After ... while ... | | +| cfg.rb:188:30:188:35 | After ... != ... [true] | cfg.rb:188:1:188:22 | ( ... ) | | +| cfg.rb:188:30:188:35 | Before ... != ... | cfg.rb:188:30:188:30 | i | | | cfg.rb:188:35:188:35 | 0 | cfg.rb:188:30:188:35 | ... != ... | | -| cfg.rb:190:1:192:3 | enter run_block | cfg.rb:191:9:191:10 | 42 | | -| cfg.rb:190:1:192:3 | exit run_block (normal) | cfg.rb:190:1:192:3 | exit run_block | | -| cfg.rb:190:1:192:3 | run_block | cfg.rb:194:1:194:23 | self | | -| cfg.rb:191:3:191:10 | yield ... | cfg.rb:190:1:192:3 | exit run_block (normal) | | +| cfg.rb:190:1:192:3 | Entry | cfg.rb:191:3:191:10 | ... | | +| cfg.rb:190:1:192:3 | Normal Exit | cfg.rb:190:1:192:3 | Exit | | +| cfg.rb:190:1:192:3 | run_block | cfg.rb:194:1:194:23 | Before call to run_block | | +| cfg.rb:191:3:191:10 | ... | cfg.rb:191:3:191:10 | Before yield ... | | +| cfg.rb:191:3:191:10 | After ... | cfg.rb:190:1:192:3 | Normal Exit | | +| cfg.rb:191:3:191:10 | After yield ... | cfg.rb:191:3:191:10 | After ... | | +| cfg.rb:191:3:191:10 | Before yield ... | cfg.rb:191:9:191:10 | 42 | | +| cfg.rb:191:3:191:10 | yield ... | cfg.rb:191:3:191:10 | After yield ... | | | cfg.rb:191:9:191:10 | 42 | cfg.rb:191:3:191:10 | yield ... | | -| cfg.rb:194:1:194:23 | call to run_block | cfg.rb:196:1:198:3 | forward_param | | +| cfg.rb:194:1:194:23 | After call to run_block | cfg.rb:196:1:198:3 | forward_param | | +| cfg.rb:194:1:194:23 | Before call to run_block | cfg.rb:194:1:194:23 | self | | +| cfg.rb:194:1:194:23 | call to run_block | cfg.rb:194:1:194:23 | After call to run_block | | | cfg.rb:194:1:194:23 | self | cfg.rb:194:11:194:23 | { ... } | | -| cfg.rb:194:11:194:23 | enter { ... } | cfg.rb:194:14:194:14 | x | | -| cfg.rb:194:11:194:23 | exit { ... } (normal) | cfg.rb:194:11:194:23 | exit { ... } | | +| cfg.rb:194:11:194:23 | Entry | cfg.rb:194:14:194:14 | x | | +| cfg.rb:194:11:194:23 | Normal Exit | cfg.rb:194:11:194:23 | Exit | | | cfg.rb:194:11:194:23 | { ... } | cfg.rb:194:1:194:23 | call to run_block | | -| cfg.rb:194:14:194:14 | x | cfg.rb:194:16:194:21 | self | | -| cfg.rb:194:16:194:21 | call to puts | cfg.rb:194:11:194:23 | exit { ... } (normal) | | +| cfg.rb:194:14:194:14 | x | cfg.rb:194:16:194:21 | ... | | +| cfg.rb:194:16:194:21 | ... | cfg.rb:194:16:194:21 | Before call to puts | | +| cfg.rb:194:16:194:21 | After ... | cfg.rb:194:11:194:23 | Normal Exit | | +| cfg.rb:194:16:194:21 | After call to puts | cfg.rb:194:16:194:21 | After ... | | +| cfg.rb:194:16:194:21 | Before call to puts | cfg.rb:194:16:194:21 | self | | +| cfg.rb:194:16:194:21 | call to puts | cfg.rb:194:16:194:21 | After call to puts | | | cfg.rb:194:16:194:21 | self | cfg.rb:194:21:194:21 | x | | | cfg.rb:194:21:194:21 | x | cfg.rb:194:16:194:21 | call to puts | | -| cfg.rb:196:1:198:3 | enter forward_param | cfg.rb:196:19:196:19 | a | | -| cfg.rb:196:1:198:3 | exit forward_param (normal) | cfg.rb:196:1:198:3 | exit forward_param | | -| cfg.rb:196:1:198:3 | forward_param | cfg.rb:200:1:200:1 | 1 | | +| cfg.rb:196:1:198:3 | Entry | cfg.rb:196:19:196:19 | a | | +| cfg.rb:196:1:198:3 | Normal Exit | cfg.rb:196:1:198:3 | Exit | | +| cfg.rb:196:1:198:3 | forward_param | cfg.rb:200:1:200:32 | Before call to times | | | cfg.rb:196:19:196:19 | a | cfg.rb:196:22:196:22 | b | | | cfg.rb:196:22:196:22 | b | cfg.rb:196:25:196:27 | ... | | -| cfg.rb:196:25:196:27 | ... | cfg.rb:197:3:197:13 | self | | -| cfg.rb:197:3:197:13 | call to bar | cfg.rb:196:1:198:3 | exit forward_param (normal) | | +| cfg.rb:196:25:196:27 | ... | cfg.rb:197:3:197:13 | ... | | +| cfg.rb:197:3:197:13 | ... | cfg.rb:197:3:197:13 | Before call to bar | | +| cfg.rb:197:3:197:13 | After ... | cfg.rb:196:1:198:3 | Normal Exit | | +| cfg.rb:197:3:197:13 | After call to bar | cfg.rb:197:3:197:13 | After ... | | +| cfg.rb:197:3:197:13 | Before call to bar | cfg.rb:197:3:197:13 | self | | +| cfg.rb:197:3:197:13 | call to bar | cfg.rb:197:3:197:13 | After call to bar | | | cfg.rb:197:3:197:13 | self | cfg.rb:197:7:197:7 | b | | | cfg.rb:197:7:197:7 | b | cfg.rb:197:10:197:12 | ... | | | cfg.rb:197:10:197:12 | ... | cfg.rb:197:3:197:13 | call to bar | | | cfg.rb:200:1:200:1 | 1 | cfg.rb:200:9:200:32 | { ... } | | -| cfg.rb:200:1:200:32 | call to times | cfg.rb:202:1:202:1 | 2 | | -| cfg.rb:200:9:200:32 | enter { ... } | cfg.rb:200:12:200:12 | a | | -| cfg.rb:200:9:200:32 | exit { ... } (normal) | cfg.rb:200:9:200:32 | exit { ... } | | +| cfg.rb:200:1:200:32 | After call to times | cfg.rb:202:1:202:35 | Before call to times | | +| cfg.rb:200:1:200:32 | Before call to times | cfg.rb:200:1:200:1 | 1 | | +| cfg.rb:200:1:200:32 | call to times | cfg.rb:200:1:200:32 | After call to times | | +| cfg.rb:200:9:200:32 | Entry | cfg.rb:200:12:200:12 | a | | +| cfg.rb:200:9:200:32 | Normal Exit | cfg.rb:200:9:200:32 | Exit | | | cfg.rb:200:9:200:32 | { ... } | cfg.rb:200:1:200:32 | call to times | | -| cfg.rb:200:12:200:12 | a | cfg.rb:200:15:200:15 | b | | -| cfg.rb:200:15:200:15 | b | cfg.rb:200:18:200:23 | Kernel | | +| cfg.rb:200:12:200:12 | a | cfg.rb:200:18:200:30 | ... | | | cfg.rb:200:18:200:23 | Kernel | cfg.rb:200:30:200:30 | a | | -| cfg.rb:200:18:200:30 | call to puts | cfg.rb:200:9:200:32 | exit { ... } (normal) | | +| cfg.rb:200:18:200:30 | ... | cfg.rb:200:18:200:30 | Before call to puts | | +| cfg.rb:200:18:200:30 | After ... | cfg.rb:200:9:200:32 | Normal Exit | | +| cfg.rb:200:18:200:30 | After call to puts | cfg.rb:200:18:200:30 | After ... | | +| cfg.rb:200:18:200:30 | Before call to puts | cfg.rb:200:18:200:23 | Kernel | | +| cfg.rb:200:18:200:30 | call to puts | cfg.rb:200:18:200:30 | After call to puts | | | cfg.rb:200:30:200:30 | a | cfg.rb:200:18:200:30 | call to puts | | | cfg.rb:202:1:202:1 | 2 | cfg.rb:202:9:202:35 | do ... end | | -| cfg.rb:202:1:202:35 | call to times | cfg.rb:205:1:205:3 | __synth__0__1 | | +| cfg.rb:202:1:202:35 | After call to times | cfg.rb:205:1:205:23 | ... | | +| cfg.rb:202:1:202:35 | Before call to times | cfg.rb:202:1:202:1 | 2 | | +| cfg.rb:202:1:202:35 | call to times | cfg.rb:202:1:202:35 | After call to times | | +| cfg.rb:202:9:202:35 | Entry | cfg.rb:202:13:202:13 | c | | +| cfg.rb:202:9:202:35 | Normal Exit | cfg.rb:202:9:202:35 | Exit | | | cfg.rb:202:9:202:35 | do ... end | cfg.rb:202:1:202:35 | call to times | | -| cfg.rb:202:9:202:35 | enter do ... end | cfg.rb:202:13:202:13 | c | | -| cfg.rb:202:9:202:35 | exit do ... end (normal) | cfg.rb:202:9:202:35 | exit do ... end | | -| cfg.rb:202:13:202:13 | c | cfg.rb:202:16:202:16 | d | | -| cfg.rb:202:16:202:16 | d | cfg.rb:202:19:202:24 | Kernel | | +| cfg.rb:202:13:202:13 | c | cfg.rb:202:19:202:31 | ... | | | cfg.rb:202:19:202:24 | Kernel | cfg.rb:202:31:202:31 | c | | -| cfg.rb:202:19:202:31 | call to puts | cfg.rb:202:9:202:35 | exit do ... end (normal) | | +| cfg.rb:202:19:202:31 | ... | cfg.rb:202:19:202:31 | Before call to puts | | +| cfg.rb:202:19:202:31 | After ... | cfg.rb:202:9:202:35 | Normal Exit | | +| cfg.rb:202:19:202:31 | After call to puts | cfg.rb:202:19:202:31 | After ... | | +| cfg.rb:202:19:202:31 | Before call to puts | cfg.rb:202:19:202:24 | Kernel | | +| cfg.rb:202:19:202:31 | call to puts | cfg.rb:202:19:202:31 | After call to puts | | | cfg.rb:202:31:202:31 | c | cfg.rb:202:19:202:31 | call to puts | | -| cfg.rb:205:1:205:3 | ... = ... | cfg.rb:205:4:205:5 | nil | | -| cfg.rb:205:1:205:3 | __synth__0__1 | cfg.rb:205:1:205:3 | self | | +| cfg.rb:205:1:205:3 | ... = ... | cfg.rb:205:1:205:3 | After ... = ... | | +| cfg.rb:205:1:205:3 | After ... = ... | cfg.rb:205:4:205:5 | if ... | | +| cfg.rb:205:1:205:3 | After call to foo | cfg.rb:205:1:205:3 | ... = ... | | +| cfg.rb:205:1:205:3 | Before ... = ... | cfg.rb:205:1:205:3 | __synth__0__1 | | +| cfg.rb:205:1:205:3 | Before call to foo | cfg.rb:205:1:205:3 | self | | +| cfg.rb:205:1:205:3 | __synth__0__1 | cfg.rb:205:1:205:3 | Before call to foo | | | cfg.rb:205:1:205:3 | __synth__0__1 | cfg.rb:205:4:205:5 | call to == | | | cfg.rb:205:1:205:3 | __synth__0__1 | cfg.rb:205:10:205:10 | 1 | | -| cfg.rb:205:1:205:3 | call to foo | cfg.rb:205:1:205:3 | ... = ... | | -| cfg.rb:205:1:205:3 | nil | cfg.rb:205:4:205:5 | if ... | | +| cfg.rb:205:1:205:3 | call to foo | cfg.rb:205:1:205:3 | After call to foo | | +| cfg.rb:205:1:205:3 | nil | cfg.rb:205:4:205:5 | After if ... | | | cfg.rb:205:1:205:3 | self | cfg.rb:205:1:205:3 | call to foo | | -| cfg.rb:205:1:205:23 | ... | cfg.rb:207:1:211:3 | filter_nil | | -| cfg.rb:205:1:205:23 | call to bar | cfg.rb:205:4:205:5 | if ... | | -| cfg.rb:205:4:205:5 | call to == | cfg.rb:205:1:205:3 | __synth__0__1 | false | -| cfg.rb:205:4:205:5 | call to == | cfg.rb:205:1:205:3 | nil | true | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:205:1:205:23 | ... | | +| cfg.rb:205:1:205:23 | ... | cfg.rb:205:1:205:3 | Before ... = ... | | +| cfg.rb:205:1:205:23 | After ... | cfg.rb:207:1:211:3 | filter_nil | | +| cfg.rb:205:1:205:23 | After call to bar | cfg.rb:205:4:205:5 | After if ... | | +| cfg.rb:205:1:205:23 | Before call to bar | cfg.rb:205:1:205:3 | __synth__0__1 | | +| cfg.rb:205:1:205:23 | call to bar | cfg.rb:205:1:205:23 | After call to bar | | +| cfg.rb:205:4:205:5 | After call to == [false] | cfg.rb:205:1:205:23 | Before call to bar | | +| cfg.rb:205:4:205:5 | After call to == [true] | cfg.rb:205:1:205:3 | nil | | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:205:1:205:23 | After ... | | +| cfg.rb:205:4:205:5 | Before call to == | cfg.rb:205:4:205:5 | nil | | +| cfg.rb:205:4:205:5 | call to == | cfg.rb:205:4:205:5 | After call to == [false] | false | +| cfg.rb:205:4:205:5 | call to == | cfg.rb:205:4:205:5 | After call to == [true] | true | +| cfg.rb:205:4:205:5 | if ... | cfg.rb:205:4:205:5 | Before call to == | | | cfg.rb:205:4:205:5 | nil | cfg.rb:205:1:205:3 | __synth__0__1 | | | cfg.rb:205:10:205:10 | 1 | cfg.rb:205:12:205:12 | 2 | | | cfg.rb:205:12:205:12 | 2 | cfg.rb:205:15:205:23 | { ... } | | -| cfg.rb:205:15:205:23 | enter { ... } | cfg.rb:205:18:205:18 | x | | -| cfg.rb:205:15:205:23 | exit { ... } (normal) | cfg.rb:205:15:205:23 | exit { ... } | | +| cfg.rb:205:15:205:23 | Entry | cfg.rb:205:18:205:18 | x | | +| cfg.rb:205:15:205:23 | Normal Exit | cfg.rb:205:15:205:23 | Exit | | | cfg.rb:205:15:205:23 | { ... } | cfg.rb:205:1:205:23 | call to bar | | -| cfg.rb:205:18:205:18 | x | cfg.rb:205:21:205:21 | x | | -| cfg.rb:205:21:205:21 | x | cfg.rb:205:15:205:23 | exit { ... } (normal) | | -| cfg.rb:207:1:211:3 | enter filter_nil | cfg.rb:207:16:207:19 | list | | -| cfg.rb:207:1:211:3 | exit filter_nil (normal) | cfg.rb:207:1:211:3 | exit filter_nil | | -| cfg.rb:207:1:211:3 | filter_nil | cfg.rb:213:1:216:3 | self | | -| cfg.rb:207:16:207:19 | list | cfg.rb:208:3:208:6 | list | | +| cfg.rb:205:18:205:18 | x | cfg.rb:205:21:205:21 | ... | | +| cfg.rb:205:21:205:21 | ... | cfg.rb:205:21:205:21 | x | | +| cfg.rb:205:21:205:21 | After ... | cfg.rb:205:15:205:23 | Normal Exit | | +| cfg.rb:205:21:205:21 | x | cfg.rb:205:21:205:21 | After ... | | +| cfg.rb:207:1:211:3 | Entry | cfg.rb:207:16:207:19 | list | | +| cfg.rb:207:1:211:3 | Normal Exit | cfg.rb:207:1:211:3 | Exit | | +| cfg.rb:207:1:211:3 | filter_nil | cfg.rb:213:1:216:3 | Before call to do_something | | +| cfg.rb:207:16:207:19 | list | cfg.rb:208:3:210:5 | ... | | | cfg.rb:208:3:208:6 | list | cfg.rb:208:15:210:5 | do ... end | | -| cfg.rb:208:3:210:5 | call to reject | cfg.rb:207:1:211:3 | exit filter_nil (normal) | | +| cfg.rb:208:3:210:5 | ... | cfg.rb:208:3:210:5 | Before call to reject | | +| cfg.rb:208:3:210:5 | After ... | cfg.rb:207:1:211:3 | Normal Exit | | +| cfg.rb:208:3:210:5 | After call to reject | cfg.rb:208:3:210:5 | After ... | | +| cfg.rb:208:3:210:5 | Before call to reject | cfg.rb:208:3:208:6 | list | | +| cfg.rb:208:3:210:5 | call to reject | cfg.rb:208:3:210:5 | After call to reject | | +| cfg.rb:208:15:210:5 | Entry | cfg.rb:208:19:208:22 | elem | | +| cfg.rb:208:15:210:5 | Normal Exit | cfg.rb:208:15:210:5 | Exit | | | cfg.rb:208:15:210:5 | do ... end | cfg.rb:208:3:210:5 | call to reject | | -| cfg.rb:208:15:210:5 | enter do ... end | cfg.rb:208:19:208:22 | elem | | -| cfg.rb:208:15:210:5 | exit do ... end (normal) | cfg.rb:208:15:210:5 | exit do ... end | | | cfg.rb:208:19:208:22 | elem | cfg.rb:208:25:208:25 | __synth__0 | | | cfg.rb:208:25:208:25 | __synth__0 | cfg.rb:208:28:208:29 | __synth__0 | | -| cfg.rb:208:28:208:29 | __synth__0 | cfg.rb:209:5:209:8 | elem | | +| cfg.rb:208:28:208:29 | __synth__0 | cfg.rb:209:5:209:13 | ... | | | cfg.rb:209:5:209:8 | elem | cfg.rb:209:5:209:13 | call to nil? | | -| cfg.rb:209:5:209:13 | call to nil? | cfg.rb:208:15:210:5 | exit do ... end (normal) | | -| cfg.rb:213:1:216:3 | call to do_something | cfg.rb:1:1:221:1 | exit cfg.rb (normal) | | +| cfg.rb:209:5:209:13 | ... | cfg.rb:209:5:209:13 | Before call to nil? | | +| cfg.rb:209:5:209:13 | After ... | cfg.rb:208:15:210:5 | Normal Exit | | +| cfg.rb:209:5:209:13 | After call to nil? | cfg.rb:209:5:209:13 | After ... | | +| cfg.rb:209:5:209:13 | Before call to nil? | cfg.rb:209:5:209:8 | elem | | +| cfg.rb:209:5:209:13 | call to nil? | cfg.rb:209:5:209:13 | After call to nil? | | +| cfg.rb:213:1:216:3 | After call to do_something | cfg.rb:1:1:221:1 | Normal Exit | | +| cfg.rb:213:1:216:3 | Before call to do_something | cfg.rb:213:1:216:3 | self | | +| cfg.rb:213:1:216:3 | call to do_something | cfg.rb:213:1:216:3 | After call to do_something | | | cfg.rb:213:1:216:3 | self | cfg.rb:213:14:216:3 | do ... end | | +| cfg.rb:213:14:216:3 | Entry | cfg.rb:214:3:215:16 | ... | | +| cfg.rb:213:14:216:3 | Normal Exit | cfg.rb:213:14:216:3 | Exit | | | cfg.rb:213:14:216:3 | do ... end | cfg.rb:213:1:216:3 | call to do_something | | -| cfg.rb:213:14:216:3 | enter do ... end | cfg.rb:214:3:214:6 | self | | -| cfg.rb:213:14:216:3 | exit do ... end (normal) | cfg.rb:213:14:216:3 | exit do ... end | | | cfg.rb:214:3:214:6 | self | cfg.rb:214:3:214:16 | call to something | | -| cfg.rb:214:3:214:16 | call to something | cfg.rb:215:3:215:16 | self | | -| cfg.rb:215:3:215:16 | call to something_else | cfg.rb:213:14:216:3 | exit do ... end (normal) | | +| cfg.rb:214:3:214:16 | After call to something | cfg.rb:215:3:215:16 | Before call to something_else | | +| cfg.rb:214:3:214:16 | Before call to something | cfg.rb:214:3:214:6 | self | | +| cfg.rb:214:3:214:16 | call to something | cfg.rb:214:3:214:16 | After call to something | | +| cfg.rb:214:3:215:16 | ... | cfg.rb:214:3:214:16 | Before call to something | | +| cfg.rb:214:3:215:16 | After ... | cfg.rb:213:14:216:3 | Normal Exit | | +| cfg.rb:215:3:215:16 | After call to something_else | cfg.rb:214:3:215:16 | After ... | | +| cfg.rb:215:3:215:16 | Before call to something_else | cfg.rb:215:3:215:16 | self | | +| cfg.rb:215:3:215:16 | call to something_else | cfg.rb:215:3:215:16 | After call to something_else | | | cfg.rb:215:3:215:16 | self | cfg.rb:215:3:215:16 | call to something_else | | +| constant_compound_assign.rb:1:1:9:3 | After Foo | constant_compound_assign.rb:11:1:12:3 | top_before | | | constant_compound_assign.rb:1:1:9:3 | Foo | constant_compound_assign.rb:2:5:3:7 | foo_before | | -| constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | constant_compound_assign.rb:1:1:9:3 | Foo | | -| constant_compound_assign.rb:1:1:22:4 | exit constant_compound_assign.rb (normal) | constant_compound_assign.rb:1:1:22:4 | exit constant_compound_assign.rb | | -| constant_compound_assign.rb:2:5:3:7 | foo_before | constant_compound_assign.rb:5:5:5:16 | FOO_CONSTANT | | -| constant_compound_assign.rb:5:5:5:16 | FOO_CONSTANT | constant_compound_assign.rb:5:5:5:16 | FOO_CONSTANT | | -| constant_compound_assign.rb:5:5:5:16 | FOO_CONSTANT | constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | true | -| constant_compound_assign.rb:5:5:5:16 | FOO_CONSTANT | constant_compound_assign.rb:5:22:5:24 | 123 | false | -| constant_compound_assign.rb:5:5:5:24 | ... = ... | constant_compound_assign.rb:7:5:8:7 | foo_after | | -| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:5:5:5:24 | ... = ... | | -| constant_compound_assign.rb:5:22:5:24 | 123 | constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | | -| constant_compound_assign.rb:7:5:8:7 | foo_after | constant_compound_assign.rb:11:1:12:3 | top_before | | -| constant_compound_assign.rb:11:1:12:3 | top_before | constant_compound_assign.rb:14:1:14:12 | TOP_CONSTANT | | -| constant_compound_assign.rb:14:1:14:12 | TOP_CONSTANT | constant_compound_assign.rb:14:1:14:12 | TOP_CONSTANT | | -| constant_compound_assign.rb:14:1:14:12 | TOP_CONSTANT | constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | true | -| constant_compound_assign.rb:14:1:14:12 | TOP_CONSTANT | constant_compound_assign.rb:14:18:14:20 | 123 | false | -| constant_compound_assign.rb:14:1:14:20 | ... = ... | constant_compound_assign.rb:16:1:17:3 | top_after | | -| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:14:1:14:20 | ... = ... | | -| constant_compound_assign.rb:14:18:14:20 | 123 | constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | | -| constant_compound_assign.rb:16:1:17:3 | top_after | constant_compound_assign.rb:19:1:19:15 | TOP_CONSTANT2 | | -| constant_compound_assign.rb:19:1:19:15 | TOP_CONSTANT2 | constant_compound_assign.rb:19:1:19:15 | TOP_CONSTANT2 | | -| constant_compound_assign.rb:19:1:19:15 | TOP_CONSTANT2 | constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | true | -| constant_compound_assign.rb:19:1:19:15 | TOP_CONSTANT2 | constant_compound_assign.rb:19:21:19:23 | 123 | false | -| constant_compound_assign.rb:19:1:19:23 | ... = ... | constant_compound_assign.rb:21:1:22:3 | top_after2 | | -| constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | constant_compound_assign.rb:19:1:19:23 | ... = ... | | -| constant_compound_assign.rb:19:21:19:23 | 123 | constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | | -| constant_compound_assign.rb:21:1:22:3 | top_after2 | constant_compound_assign.rb:1:1:22:4 | exit constant_compound_assign.rb (normal) | | -| desugar.rb:1:1:3:3 | enter m1 | desugar.rb:1:8:1:8 | x | | -| desugar.rb:1:1:3:3 | exit m1 (normal) | desugar.rb:1:1:3:3 | exit m1 | | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:1:1:9:3 | Foo | | +| constant_compound_assign.rb:1:1:22:4 | Normal Exit | constant_compound_assign.rb:1:1:22:4 | Exit | | +| constant_compound_assign.rb:2:5:3:7 | foo_before | constant_compound_assign.rb:5:5:5:24 | Before ... = ... | | +| constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [false] | constant_compound_assign.rb:5:22:5:24 | 123 | | +| constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [true] | constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | | +| constant_compound_assign.rb:5:5:5:16 | FOO_CONSTANT | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [false] | false | +| constant_compound_assign.rb:5:5:5:16 | FOO_CONSTANT | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [true] | true | +| constant_compound_assign.rb:5:5:5:16 | FOO_CONSTANT | constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | | +| constant_compound_assign.rb:5:5:5:24 | ... = ... | constant_compound_assign.rb:5:5:5:24 | After ... = ... | | +| constant_compound_assign.rb:5:5:5:24 | After ... = ... | constant_compound_assign.rb:7:5:8:7 | foo_after | | +| constant_compound_assign.rb:5:5:5:24 | Before ... = ... | constant_compound_assign.rb:5:5:5:16 | FOO_CONSTANT | | +| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:5:5:5:16 | FOO_CONSTANT | | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:5:5:5:24 | ... = ... | | +| constant_compound_assign.rb:5:22:5:24 | 123 | constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | | +| constant_compound_assign.rb:7:5:8:7 | foo_after | constant_compound_assign.rb:1:1:9:3 | After Foo | | +| constant_compound_assign.rb:11:1:12:3 | top_before | constant_compound_assign.rb:14:1:14:20 | Before ... = ... | | +| constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [false] | constant_compound_assign.rb:14:18:14:20 | 123 | | +| constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [true] | constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | | +| constant_compound_assign.rb:14:1:14:12 | TOP_CONSTANT | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [false] | false | +| constant_compound_assign.rb:14:1:14:12 | TOP_CONSTANT | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [true] | true | +| constant_compound_assign.rb:14:1:14:12 | TOP_CONSTANT | constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | | +| constant_compound_assign.rb:14:1:14:20 | ... = ... | constant_compound_assign.rb:14:1:14:20 | After ... = ... | | +| constant_compound_assign.rb:14:1:14:20 | After ... = ... | constant_compound_assign.rb:16:1:17:3 | top_after | | +| constant_compound_assign.rb:14:1:14:20 | Before ... = ... | constant_compound_assign.rb:14:1:14:12 | TOP_CONSTANT | | +| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:14:1:14:12 | TOP_CONSTANT | | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:14:1:14:20 | ... = ... | | +| constant_compound_assign.rb:14:18:14:20 | 123 | constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | | +| constant_compound_assign.rb:16:1:17:3 | top_after | constant_compound_assign.rb:19:1:19:23 | Before ... = ... | | +| constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [false] | constant_compound_assign.rb:19:21:19:23 | 123 | | +| constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [true] | constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | | +| constant_compound_assign.rb:19:1:19:15 | TOP_CONSTANT2 | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [false] | false | +| constant_compound_assign.rb:19:1:19:15 | TOP_CONSTANT2 | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [true] | true | +| constant_compound_assign.rb:19:1:19:15 | TOP_CONSTANT2 | constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | | +| constant_compound_assign.rb:19:1:19:23 | ... = ... | constant_compound_assign.rb:19:1:19:23 | After ... = ... | | +| constant_compound_assign.rb:19:1:19:23 | After ... = ... | constant_compound_assign.rb:21:1:22:3 | top_after2 | | +| constant_compound_assign.rb:19:1:19:23 | Before ... = ... | constant_compound_assign.rb:19:1:19:15 | TOP_CONSTANT2 | | +| constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | constant_compound_assign.rb:19:1:19:15 | TOP_CONSTANT2 | | +| constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | constant_compound_assign.rb:19:1:19:23 | ... = ... | | +| constant_compound_assign.rb:19:21:19:23 | 123 | constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | | +| constant_compound_assign.rb:21:1:22:3 | top_after2 | constant_compound_assign.rb:1:1:22:4 | Normal Exit | | +| desugar.rb:1:1:3:3 | Entry | desugar.rb:1:8:1:8 | x | | +| desugar.rb:1:1:3:3 | Normal Exit | desugar.rb:1:1:3:3 | Exit | | | desugar.rb:1:1:3:3 | m1 | desugar.rb:5:1:7:3 | m2 | | -| desugar.rb:1:1:38:17 | enter desugar.rb | desugar.rb:1:1:3:3 | m1 | | -| desugar.rb:1:1:38:17 | exit desugar.rb (normal) | desugar.rb:1:1:38:17 | exit desugar.rb | | -| desugar.rb:1:8:1:8 | x | desugar.rb:2:3:2:3 | x | | -| desugar.rb:2:3:2:3 | x | desugar.rb:2:3:2:3 | x | | +| desugar.rb:1:1:38:17 | Entry | desugar.rb:1:1:3:3 | m1 | | +| desugar.rb:1:1:38:17 | Normal Exit | desugar.rb:1:1:38:17 | Exit | | +| desugar.rb:1:8:1:8 | x | desugar.rb:2:3:2:8 | ... | | +| desugar.rb:2:3:2:3 | x | desugar.rb:2:5:2:6 | Before ... + ... | | | desugar.rb:2:3:2:3 | x | desugar.rb:2:8:2:8 | 1 | | -| desugar.rb:2:3:2:8 | ... = ... | desugar.rb:1:1:3:3 | exit m1 (normal) | | -| desugar.rb:2:5:2:6 | ... + ... | desugar.rb:2:3:2:8 | ... = ... | | +| desugar.rb:2:3:2:8 | ... | desugar.rb:2:3:2:8 | Before ... = ... | | +| desugar.rb:2:3:2:8 | ... = ... | desugar.rb:2:3:2:8 | After ... = ... | | +| desugar.rb:2:3:2:8 | After ... | desugar.rb:1:1:3:3 | Normal Exit | | +| desugar.rb:2:3:2:8 | After ... = ... | desugar.rb:2:3:2:8 | After ... | | +| desugar.rb:2:3:2:8 | Before ... = ... | desugar.rb:2:3:2:3 | x | | +| desugar.rb:2:5:2:6 | ... + ... | desugar.rb:2:5:2:6 | After ... + ... | | +| desugar.rb:2:5:2:6 | After ... + ... | desugar.rb:2:3:2:8 | ... = ... | | +| desugar.rb:2:5:2:6 | Before ... + ... | desugar.rb:2:3:2:3 | x | | | desugar.rb:2:8:2:8 | 1 | desugar.rb:2:5:2:6 | ... + ... | | -| desugar.rb:5:1:7:3 | enter m2 | desugar.rb:5:8:5:8 | x | | -| desugar.rb:5:1:7:3 | exit m2 (normal) | desugar.rb:5:1:7:3 | exit m2 | | +| desugar.rb:5:1:7:3 | Entry | desugar.rb:5:8:5:8 | x | | +| desugar.rb:5:1:7:3 | Normal Exit | desugar.rb:5:1:7:3 | Exit | | | desugar.rb:5:1:7:3 | m2 | desugar.rb:9:1:11:3 | m3 | | -| desugar.rb:5:8:5:8 | x | desugar.rb:6:3:6:3 | x | | +| desugar.rb:5:8:5:8 | x | desugar.rb:6:3:6:17 | ... | | | desugar.rb:6:3:6:3 | x | desugar.rb:6:3:6:7 | call to foo | | -| desugar.rb:6:3:6:7 | call to foo | desugar.rb:6:17:6:17 | __synth__0 | | -| desugar.rb:6:3:6:13 | __synth__0 | desugar.rb:6:3:6:17 | ... | | -| desugar.rb:6:3:6:13 | call to count= | desugar.rb:6:3:6:13 | __synth__0 | | -| desugar.rb:6:3:6:17 | ... | desugar.rb:5:1:7:3 | exit m2 (normal) | | +| desugar.rb:6:3:6:7 | After call to foo | desugar.rb:6:17:6:17 | Before ... = ... | | +| desugar.rb:6:3:6:7 | Before call to foo | desugar.rb:6:3:6:3 | x | | +| desugar.rb:6:3:6:7 | call to foo | desugar.rb:6:3:6:7 | After call to foo | | +| desugar.rb:6:3:6:13 | After call to count= | desugar.rb:6:3:6:13 | __synth__0 | | +| desugar.rb:6:3:6:13 | Before call to count= | desugar.rb:6:3:6:7 | Before call to foo | | +| desugar.rb:6:3:6:13 | __synth__0 | desugar.rb:6:3:6:17 | After ... | | +| desugar.rb:6:3:6:13 | call to count= | desugar.rb:6:3:6:13 | After call to count= | | +| desugar.rb:6:3:6:17 | ... | desugar.rb:6:3:6:13 | Before call to count= | | +| desugar.rb:6:3:6:17 | ... | desugar.rb:6:3:6:17 | ... | | +| desugar.rb:6:3:6:17 | After ... | desugar.rb:5:1:7:3 | Normal Exit | | +| desugar.rb:6:3:6:17 | After ... | desugar.rb:6:3:6:17 | After ... | | | desugar.rb:6:17:6:17 | 1 | desugar.rb:6:17:6:17 | ... = ... | | -| desugar.rb:6:17:6:17 | ... = ... | desugar.rb:6:3:6:13 | call to count= | | +| desugar.rb:6:17:6:17 | ... = ... | desugar.rb:6:17:6:17 | After ... = ... | | +| desugar.rb:6:17:6:17 | After ... = ... | desugar.rb:6:3:6:13 | call to count= | | +| desugar.rb:6:17:6:17 | Before ... = ... | desugar.rb:6:17:6:17 | __synth__0 | | | desugar.rb:6:17:6:17 | __synth__0 | desugar.rb:6:17:6:17 | 1 | | -| desugar.rb:9:1:11:3 | enter m3 | desugar.rb:9:8:9:8 | x | | -| desugar.rb:9:1:11:3 | exit m3 (normal) | desugar.rb:9:1:11:3 | exit m3 | | +| desugar.rb:9:1:11:3 | Entry | desugar.rb:9:8:9:8 | x | | +| desugar.rb:9:1:11:3 | Normal Exit | desugar.rb:9:1:11:3 | Exit | | | desugar.rb:9:1:11:3 | m3 | desugar.rb:13:1:15:3 | m4 | | -| desugar.rb:9:8:9:8 | x | desugar.rb:10:3:10:3 | x | | +| desugar.rb:9:8:9:8 | x | desugar.rb:10:3:10:14 | ... | | | desugar.rb:10:3:10:3 | x | desugar.rb:10:3:10:7 | call to foo | | -| desugar.rb:10:3:10:7 | call to foo | desugar.rb:10:9:10:9 | 0 | | -| desugar.rb:10:3:10:10 | __synth__0 | desugar.rb:10:3:10:14 | ... | | -| desugar.rb:10:3:10:10 | call to []= | desugar.rb:10:3:10:10 | __synth__0 | | -| desugar.rb:10:3:10:14 | ... | desugar.rb:9:1:11:3 | exit m3 (normal) | | -| desugar.rb:10:9:10:9 | 0 | desugar.rb:10:14:10:14 | __synth__0 | | +| desugar.rb:10:3:10:7 | After call to foo | desugar.rb:10:9:10:9 | 0 | | +| desugar.rb:10:3:10:7 | Before call to foo | desugar.rb:10:3:10:3 | x | | +| desugar.rb:10:3:10:7 | call to foo | desugar.rb:10:3:10:7 | After call to foo | | +| desugar.rb:10:3:10:10 | After call to []= | desugar.rb:10:3:10:10 | __synth__0 | | +| desugar.rb:10:3:10:10 | Before call to []= | desugar.rb:10:3:10:7 | Before call to foo | | +| desugar.rb:10:3:10:10 | __synth__0 | desugar.rb:10:3:10:14 | After ... | | +| desugar.rb:10:3:10:10 | call to []= | desugar.rb:10:3:10:10 | After call to []= | | +| desugar.rb:10:3:10:14 | ... | desugar.rb:10:3:10:10 | Before call to []= | | +| desugar.rb:10:3:10:14 | ... | desugar.rb:10:3:10:14 | ... | | +| desugar.rb:10:3:10:14 | After ... | desugar.rb:9:1:11:3 | Normal Exit | | +| desugar.rb:10:3:10:14 | After ... | desugar.rb:10:3:10:14 | After ... | | +| desugar.rb:10:9:10:9 | 0 | desugar.rb:10:14:10:14 | Before ... = ... | | | desugar.rb:10:14:10:14 | 1 | desugar.rb:10:14:10:14 | ... = ... | | -| desugar.rb:10:14:10:14 | ... = ... | desugar.rb:10:3:10:10 | call to []= | | +| desugar.rb:10:14:10:14 | ... = ... | desugar.rb:10:14:10:14 | After ... = ... | | +| desugar.rb:10:14:10:14 | After ... = ... | desugar.rb:10:3:10:10 | call to []= | | +| desugar.rb:10:14:10:14 | Before ... = ... | desugar.rb:10:14:10:14 | __synth__0 | | | desugar.rb:10:14:10:14 | __synth__0 | desugar.rb:10:14:10:14 | 1 | | -| desugar.rb:13:1:15:3 | enter m4 | desugar.rb:13:8:13:8 | x | | -| desugar.rb:13:1:15:3 | exit m4 (normal) | desugar.rb:13:1:15:3 | exit m4 | | +| desugar.rb:13:1:15:3 | Entry | desugar.rb:13:8:13:8 | x | | +| desugar.rb:13:1:15:3 | Normal Exit | desugar.rb:13:1:15:3 | Exit | | | desugar.rb:13:1:15:3 | m4 | desugar.rb:17:1:19:3 | m5 | | -| desugar.rb:13:8:13:8 | x | desugar.rb:14:3:14:7 | __synth__0 | | +| desugar.rb:13:8:13:8 | x | desugar.rb:14:3:14:18 | ... | | | desugar.rb:14:3:14:3 | x | desugar.rb:14:3:14:7 | call to foo | | -| desugar.rb:14:3:14:7 | ... = ... | desugar.rb:14:15:14:16 | __synth__1 | | -| desugar.rb:14:3:14:7 | __synth__0 | desugar.rb:14:3:14:3 | x | | +| desugar.rb:14:3:14:7 | ... = ... | desugar.rb:14:3:14:7 | After ... = ... | | +| desugar.rb:14:3:14:7 | After ... = ... | desugar.rb:14:15:14:16 | Before ... = ... | | +| desugar.rb:14:3:14:7 | After call to foo | desugar.rb:14:3:14:7 | ... = ... | | +| desugar.rb:14:3:14:7 | Before ... = ... | desugar.rb:14:3:14:7 | __synth__0 | | +| desugar.rb:14:3:14:7 | Before call to foo | desugar.rb:14:3:14:3 | x | | +| desugar.rb:14:3:14:7 | __synth__0 | desugar.rb:14:3:14:7 | Before call to foo | | | desugar.rb:14:3:14:7 | __synth__0 | desugar.rb:14:3:14:13 | __synth__1 | | | desugar.rb:14:3:14:7 | __synth__0 | desugar.rb:14:3:14:13 | call to count | | -| desugar.rb:14:3:14:7 | call to foo | desugar.rb:14:3:14:7 | ... = ... | | +| desugar.rb:14:3:14:7 | call to foo | desugar.rb:14:3:14:7 | After call to foo | | +| desugar.rb:14:3:14:13 | After call to count | desugar.rb:14:18:14:18 | 1 | | +| desugar.rb:14:3:14:13 | After call to count= | desugar.rb:14:15:14:16 | __synth__1 | | +| desugar.rb:14:3:14:13 | Before call to count | desugar.rb:14:3:14:7 | __synth__0 | | +| desugar.rb:14:3:14:13 | Before call to count= | desugar.rb:14:3:14:7 | __synth__0 | | | desugar.rb:14:3:14:13 | __synth__1 | desugar.rb:14:3:14:13 | call to count= | | -| desugar.rb:14:3:14:13 | call to count | desugar.rb:14:18:14:18 | 1 | | -| desugar.rb:14:3:14:13 | call to count= | desugar.rb:14:15:14:16 | __synth__1 | | -| desugar.rb:14:3:14:18 | ... | desugar.rb:13:1:15:3 | exit m4 (normal) | | -| desugar.rb:14:15:14:16 | ... + ... | desugar.rb:14:15:14:16 | ... = ... | | -| desugar.rb:14:15:14:16 | ... = ... | desugar.rb:14:3:14:7 | __synth__0 | | -| desugar.rb:14:15:14:16 | __synth__1 | desugar.rb:14:3:14:7 | __synth__0 | | -| desugar.rb:14:15:14:16 | __synth__1 | desugar.rb:14:3:14:18 | ... | | +| desugar.rb:14:3:14:13 | call to count | desugar.rb:14:3:14:13 | After call to count | | +| desugar.rb:14:3:14:13 | call to count= | desugar.rb:14:3:14:13 | After call to count= | | +| desugar.rb:14:3:14:18 | ... | desugar.rb:14:3:14:7 | Before ... = ... | | +| desugar.rb:14:3:14:18 | ... | desugar.rb:14:3:14:18 | ... | | +| desugar.rb:14:3:14:18 | After ... | desugar.rb:13:1:15:3 | Normal Exit | | +| desugar.rb:14:3:14:18 | After ... | desugar.rb:14:3:14:18 | After ... | | +| desugar.rb:14:15:14:16 | ... + ... | desugar.rb:14:15:14:16 | After ... + ... | | +| desugar.rb:14:15:14:16 | ... = ... | desugar.rb:14:15:14:16 | After ... = ... | | +| desugar.rb:14:15:14:16 | After ... + ... | desugar.rb:14:15:14:16 | ... = ... | | +| desugar.rb:14:15:14:16 | After ... = ... | desugar.rb:14:3:14:13 | Before call to count= | | +| desugar.rb:14:15:14:16 | Before ... + ... | desugar.rb:14:3:14:13 | Before call to count | | +| desugar.rb:14:15:14:16 | Before ... = ... | desugar.rb:14:15:14:16 | __synth__1 | | +| desugar.rb:14:15:14:16 | __synth__1 | desugar.rb:14:3:14:18 | After ... | | +| desugar.rb:14:15:14:16 | __synth__1 | desugar.rb:14:15:14:16 | Before ... + ... | | | desugar.rb:14:18:14:18 | 1 | desugar.rb:14:15:14:16 | ... + ... | | -| desugar.rb:17:1:19:3 | enter m5 | desugar.rb:17:8:17:8 | x | | -| desugar.rb:17:1:19:3 | exit m5 (normal) | desugar.rb:17:1:19:3 | exit m5 | | +| desugar.rb:17:1:19:3 | Entry | desugar.rb:17:8:17:8 | x | | +| desugar.rb:17:1:19:3 | Normal Exit | desugar.rb:17:1:19:3 | Exit | | | desugar.rb:17:1:19:3 | m5 | desugar.rb:21:1:23:3 | m6 | | | desugar.rb:17:8:17:8 | x | desugar.rb:17:11:17:11 | y | | -| desugar.rb:17:11:17:11 | y | desugar.rb:18:3:18:7 | __synth__0 | | +| desugar.rb:17:11:17:11 | y | desugar.rb:18:3:18:33 | ... | | | desugar.rb:18:3:18:3 | x | desugar.rb:18:3:18:7 | call to foo | | -| desugar.rb:18:3:18:7 | ... = ... | desugar.rb:18:9:18:9 | __synth__1 | | -| desugar.rb:18:3:18:7 | __synth__0 | desugar.rb:18:3:18:3 | x | | +| desugar.rb:18:3:18:7 | ... = ... | desugar.rb:18:3:18:7 | After ... = ... | | +| desugar.rb:18:3:18:7 | After ... = ... | desugar.rb:18:9:18:9 | Before ... = ... | | +| desugar.rb:18:3:18:7 | After call to foo | desugar.rb:18:3:18:7 | ... = ... | | +| desugar.rb:18:3:18:7 | Before ... = ... | desugar.rb:18:3:18:7 | __synth__0 | | +| desugar.rb:18:3:18:7 | Before call to foo | desugar.rb:18:3:18:3 | x | | +| desugar.rb:18:3:18:7 | __synth__0 | desugar.rb:18:3:18:7 | Before call to foo | | | desugar.rb:18:3:18:7 | __synth__0 | desugar.rb:18:9:18:9 | __synth__1 | | | desugar.rb:18:3:18:7 | __synth__0 | desugar.rb:18:9:18:9 | __synth__1 | | -| desugar.rb:18:3:18:7 | call to foo | desugar.rb:18:3:18:7 | ... = ... | | +| desugar.rb:18:3:18:7 | call to foo | desugar.rb:18:3:18:7 | After call to foo | | +| desugar.rb:18:3:18:28 | After call to [] | desugar.rb:18:33:18:33 | 1 | | +| desugar.rb:18:3:18:28 | After call to []= | desugar.rb:18:30:18:31 | __synth__4 | | +| desugar.rb:18:3:18:28 | Before call to [] | desugar.rb:18:3:18:7 | __synth__0 | | +| desugar.rb:18:3:18:28 | Before call to []= | desugar.rb:18:3:18:7 | __synth__0 | | | desugar.rb:18:3:18:28 | __synth__4 | desugar.rb:18:3:18:28 | call to []= | | -| desugar.rb:18:3:18:28 | call to [] | desugar.rb:18:33:18:33 | 1 | | -| desugar.rb:18:3:18:28 | call to []= | desugar.rb:18:30:18:31 | __synth__4 | | -| desugar.rb:18:3:18:33 | ... | desugar.rb:17:1:19:3 | exit m5 (normal) | | +| desugar.rb:18:3:18:28 | call to [] | desugar.rb:18:3:18:28 | After call to [] | | +| desugar.rb:18:3:18:28 | call to []= | desugar.rb:18:3:18:28 | After call to []= | | +| desugar.rb:18:3:18:33 | ... | desugar.rb:18:3:18:7 | Before ... = ... | | +| desugar.rb:18:3:18:33 | ... | desugar.rb:18:3:18:33 | ... | | +| desugar.rb:18:3:18:33 | After ... | desugar.rb:17:1:19:3 | Normal Exit | | +| desugar.rb:18:3:18:33 | After ... | desugar.rb:18:3:18:33 | After ... | | | desugar.rb:18:9:18:9 | 0 | desugar.rb:18:9:18:9 | ... = ... | | -| desugar.rb:18:9:18:9 | ... = ... | desugar.rb:18:12:18:16 | __synth__2 | | +| desugar.rb:18:9:18:9 | ... = ... | desugar.rb:18:9:18:9 | After ... = ... | | +| desugar.rb:18:9:18:9 | After ... = ... | desugar.rb:18:12:18:16 | Before ... = ... | | +| desugar.rb:18:9:18:9 | Before ... = ... | desugar.rb:18:9:18:9 | __synth__1 | | | desugar.rb:18:9:18:9 | __synth__1 | desugar.rb:18:9:18:9 | 0 | | | desugar.rb:18:9:18:9 | __synth__1 | desugar.rb:18:12:18:16 | __synth__2 | | | desugar.rb:18:9:18:9 | __synth__1 | desugar.rb:18:12:18:16 | __synth__2 | | | desugar.rb:18:12:18:12 | y | desugar.rb:18:12:18:16 | call to bar | | -| desugar.rb:18:12:18:16 | ... = ... | desugar.rb:18:19:18:27 | __synth__3 | | -| desugar.rb:18:12:18:16 | __synth__2 | desugar.rb:18:12:18:12 | y | | +| desugar.rb:18:12:18:16 | ... = ... | desugar.rb:18:12:18:16 | After ... = ... | | +| desugar.rb:18:12:18:16 | After ... = ... | desugar.rb:18:19:18:27 | Before ... = ... | | +| desugar.rb:18:12:18:16 | After call to bar | desugar.rb:18:12:18:16 | ... = ... | | +| desugar.rb:18:12:18:16 | Before ... = ... | desugar.rb:18:12:18:16 | __synth__2 | | +| desugar.rb:18:12:18:16 | Before call to bar | desugar.rb:18:12:18:12 | y | | +| desugar.rb:18:12:18:16 | __synth__2 | desugar.rb:18:12:18:16 | Before call to bar | | | desugar.rb:18:12:18:16 | __synth__2 | desugar.rb:18:19:18:27 | __synth__3 | | | desugar.rb:18:12:18:16 | __synth__2 | desugar.rb:18:19:18:27 | __synth__3 | | -| desugar.rb:18:12:18:16 | call to bar | desugar.rb:18:12:18:16 | ... = ... | | +| desugar.rb:18:12:18:16 | call to bar | desugar.rb:18:12:18:16 | After call to bar | | | desugar.rb:18:19:18:19 | x | desugar.rb:18:19:18:23 | call to baz | | -| desugar.rb:18:19:18:23 | call to baz | desugar.rb:18:27:18:27 | 3 | | -| desugar.rb:18:19:18:27 | ... + ... | desugar.rb:18:19:18:27 | ... = ... | | -| desugar.rb:18:19:18:27 | ... = ... | desugar.rb:18:30:18:31 | __synth__4 | | +| desugar.rb:18:19:18:23 | After call to baz | desugar.rb:18:27:18:27 | 3 | | +| desugar.rb:18:19:18:23 | Before call to baz | desugar.rb:18:19:18:19 | x | | +| desugar.rb:18:19:18:23 | call to baz | desugar.rb:18:19:18:23 | After call to baz | | +| desugar.rb:18:19:18:27 | ... + ... | desugar.rb:18:19:18:27 | After ... + ... | | +| desugar.rb:18:19:18:27 | ... = ... | desugar.rb:18:19:18:27 | After ... = ... | | +| desugar.rb:18:19:18:27 | After ... + ... | desugar.rb:18:19:18:27 | ... = ... | | +| desugar.rb:18:19:18:27 | After ... = ... | desugar.rb:18:30:18:31 | Before ... = ... | | +| desugar.rb:18:19:18:27 | Before ... + ... | desugar.rb:18:19:18:23 | Before call to baz | | +| desugar.rb:18:19:18:27 | Before ... = ... | desugar.rb:18:19:18:27 | __synth__3 | | | desugar.rb:18:19:18:27 | __synth__3 | desugar.rb:18:3:18:28 | __synth__4 | | | desugar.rb:18:19:18:27 | __synth__3 | desugar.rb:18:3:18:28 | call to [] | | -| desugar.rb:18:19:18:27 | __synth__3 | desugar.rb:18:19:18:19 | x | | +| desugar.rb:18:19:18:27 | __synth__3 | desugar.rb:18:19:18:27 | Before ... + ... | | | desugar.rb:18:27:18:27 | 3 | desugar.rb:18:19:18:27 | ... + ... | | -| desugar.rb:18:30:18:31 | ... + ... | desugar.rb:18:30:18:31 | ... = ... | | -| desugar.rb:18:30:18:31 | ... = ... | desugar.rb:18:3:18:7 | __synth__0 | | -| desugar.rb:18:30:18:31 | __synth__4 | desugar.rb:18:3:18:7 | __synth__0 | | -| desugar.rb:18:30:18:31 | __synth__4 | desugar.rb:18:3:18:33 | ... | | +| desugar.rb:18:30:18:31 | ... + ... | desugar.rb:18:30:18:31 | After ... + ... | | +| desugar.rb:18:30:18:31 | ... = ... | desugar.rb:18:30:18:31 | After ... = ... | | +| desugar.rb:18:30:18:31 | After ... + ... | desugar.rb:18:30:18:31 | ... = ... | | +| desugar.rb:18:30:18:31 | After ... = ... | desugar.rb:18:3:18:28 | Before call to []= | | +| desugar.rb:18:30:18:31 | Before ... + ... | desugar.rb:18:3:18:28 | Before call to [] | | +| desugar.rb:18:30:18:31 | Before ... = ... | desugar.rb:18:30:18:31 | __synth__4 | | +| desugar.rb:18:30:18:31 | __synth__4 | desugar.rb:18:3:18:33 | After ... | | +| desugar.rb:18:30:18:31 | __synth__4 | desugar.rb:18:30:18:31 | Before ... + ... | | | desugar.rb:18:33:18:33 | 1 | desugar.rb:18:30:18:31 | ... + ... | | -| desugar.rb:21:1:23:3 | enter m6 | desugar.rb:22:10:22:10 | __synth__2 | | -| desugar.rb:21:1:23:3 | exit m6 (normal) | desugar.rb:21:1:23:3 | exit m6 | | +| desugar.rb:21:1:23:3 | Entry | desugar.rb:22:3:22:29 | ... | | +| desugar.rb:21:1:23:3 | Normal Exit | desugar.rb:21:1:23:3 | Exit | | | desugar.rb:21:1:23:3 | m6 | desugar.rb:25:1:27:3 | m7 | | | desugar.rb:22:3:22:3 | 0 | desugar.rb:22:3:22:3 | call to [] | | -| desugar.rb:22:3:22:3 | ... = ... | desugar.rb:22:7:22:7 | y | | +| desugar.rb:22:3:22:3 | ... = ... | desugar.rb:22:3:22:3 | After ... = ... | | +| desugar.rb:22:3:22:3 | After ... = ... | desugar.rb:22:7:22:7 | Before ... = ... | | +| desugar.rb:22:3:22:3 | After call to [] | desugar.rb:22:3:22:3 | ... = ... | | +| desugar.rb:22:3:22:3 | Before ... = ... | desugar.rb:22:3:22:3 | x | | +| desugar.rb:22:3:22:3 | Before call to [] | desugar.rb:22:3:22:3 | __synth__3 | | | desugar.rb:22:3:22:3 | __synth__3 | desugar.rb:22:3:22:3 | 0 | | -| desugar.rb:22:3:22:3 | call to [] | desugar.rb:22:3:22:3 | ... = ... | | -| desugar.rb:22:3:22:3 | x | desugar.rb:22:3:22:3 | __synth__3 | | -| desugar.rb:22:3:22:29 | ... | desugar.rb:21:1:23:3 | exit m6 (normal) | | +| desugar.rb:22:3:22:3 | call to [] | desugar.rb:22:3:22:3 | After call to [] | | +| desugar.rb:22:3:22:3 | x | desugar.rb:22:3:22:3 | Before call to [] | | +| desugar.rb:22:3:22:29 | ... | desugar.rb:22:3:22:29 | ... | | +| desugar.rb:22:3:22:29 | ... | desugar.rb:22:10:22:10 | Before ... = ... | | +| desugar.rb:22:3:22:29 | After ... | desugar.rb:21:1:23:3 | Normal Exit | | +| desugar.rb:22:3:22:29 | After ... | desugar.rb:22:3:22:29 | After ... | | | desugar.rb:22:7:22:7 | 1 | desugar.rb:22:7:22:7 | -2 | | | desugar.rb:22:7:22:7 | -2 | desugar.rb:22:7:22:7 | _ .. _ | | -| desugar.rb:22:7:22:7 | ... = ... | desugar.rb:22:10:22:14 | __synth__2 | | -| desugar.rb:22:7:22:7 | _ .. _ | desugar.rb:22:7:22:7 | call to [] | | -| desugar.rb:22:7:22:7 | __synth__3 | desugar.rb:22:7:22:7 | 1 | | -| desugar.rb:22:7:22:7 | call to [] | desugar.rb:22:7:22:7 | ... = ... | | -| desugar.rb:22:7:22:7 | y | desugar.rb:22:7:22:7 | __synth__3 | | -| desugar.rb:22:10:22:10 | ... = ... | desugar.rb:22:18:22:29 | __synth__3 | | -| desugar.rb:22:10:22:10 | __synth__2 | desugar.rb:22:10:22:10 | self | | -| desugar.rb:22:10:22:10 | call to z | desugar.rb:22:10:22:10 | ... = ... | | +| desugar.rb:22:7:22:7 | ... = ... | desugar.rb:22:7:22:7 | After ... = ... | | +| desugar.rb:22:7:22:7 | After ... = ... | desugar.rb:22:10:22:14 | ... | | +| desugar.rb:22:7:22:7 | After _ .. _ | desugar.rb:22:7:22:7 | call to [] | | +| desugar.rb:22:7:22:7 | After call to [] | desugar.rb:22:7:22:7 | ... = ... | | +| desugar.rb:22:7:22:7 | Before ... = ... | desugar.rb:22:7:22:7 | y | | +| desugar.rb:22:7:22:7 | Before _ .. _ | desugar.rb:22:7:22:7 | 1 | | +| desugar.rb:22:7:22:7 | Before call to [] | desugar.rb:22:7:22:7 | __synth__3 | | +| desugar.rb:22:7:22:7 | _ .. _ | desugar.rb:22:7:22:7 | After _ .. _ | | +| desugar.rb:22:7:22:7 | __synth__3 | desugar.rb:22:7:22:7 | Before _ .. _ | | +| desugar.rb:22:7:22:7 | call to [] | desugar.rb:22:7:22:7 | After call to [] | | +| desugar.rb:22:7:22:7 | y | desugar.rb:22:7:22:7 | Before call to [] | | +| desugar.rb:22:10:22:10 | ... = ... | desugar.rb:22:10:22:10 | After ... = ... | | +| desugar.rb:22:10:22:10 | After ... = ... | desugar.rb:22:18:22:29 | Before ... = ... | | +| desugar.rb:22:10:22:10 | After call to z | desugar.rb:22:10:22:10 | ... = ... | | +| desugar.rb:22:10:22:10 | Before ... = ... | desugar.rb:22:10:22:10 | __synth__2 | | +| desugar.rb:22:10:22:10 | Before call to z | desugar.rb:22:10:22:10 | self | | +| desugar.rb:22:10:22:10 | __synth__2 | desugar.rb:22:10:22:10 | Before call to z | | +| desugar.rb:22:10:22:10 | call to z | desugar.rb:22:10:22:10 | After call to z | | | desugar.rb:22:10:22:10 | self | desugar.rb:22:10:22:10 | call to z | | | desugar.rb:22:10:22:14 | -1 | desugar.rb:22:10:22:14 | call to [] | | -| desugar.rb:22:10:22:14 | ... | desugar.rb:22:3:22:29 | ... | | -| desugar.rb:22:10:22:14 | ... = ... | desugar.rb:22:10:22:14 | call to bar= | | -| desugar.rb:22:10:22:14 | __synth__0__1 | desugar.rb:22:10:22:14 | ... | | -| desugar.rb:22:10:22:14 | __synth__0__1 | desugar.rb:22:10:22:14 | __synth__3 | | -| desugar.rb:22:10:22:14 | __synth__2 | desugar.rb:22:10:22:14 | __synth__0__1 | | +| desugar.rb:22:10:22:14 | ... | desugar.rb:22:10:22:14 | Before call to bar= | | +| desugar.rb:22:10:22:14 | ... = ... | desugar.rb:22:10:22:14 | After ... = ... | | +| desugar.rb:22:10:22:14 | After ... | desugar.rb:22:3:22:29 | After ... | | +| desugar.rb:22:10:22:14 | After ... = ... | desugar.rb:22:10:22:14 | call to bar= | | +| desugar.rb:22:10:22:14 | After call to [] | desugar.rb:22:10:22:14 | ... = ... | | +| desugar.rb:22:10:22:14 | After call to bar= | desugar.rb:22:10:22:14 | __synth__0__1 | | +| desugar.rb:22:10:22:14 | Before ... = ... | desugar.rb:22:10:22:14 | __synth__0__1 | | +| desugar.rb:22:10:22:14 | Before call to [] | desugar.rb:22:10:22:14 | __synth__3 | | +| desugar.rb:22:10:22:14 | Before call to bar= | desugar.rb:22:10:22:14 | __synth__2 | | +| desugar.rb:22:10:22:14 | __synth__0__1 | desugar.rb:22:10:22:14 | After ... | | +| desugar.rb:22:10:22:14 | __synth__0__1 | desugar.rb:22:10:22:14 | Before call to [] | | +| desugar.rb:22:10:22:14 | __synth__2 | desugar.rb:22:10:22:14 | Before ... = ... | | | desugar.rb:22:10:22:14 | __synth__3 | desugar.rb:22:10:22:14 | -1 | | -| desugar.rb:22:10:22:14 | call to [] | desugar.rb:22:10:22:14 | ... = ... | | -| desugar.rb:22:10:22:14 | call to bar= | desugar.rb:22:10:22:14 | __synth__0__1 | | -| desugar.rb:22:18:22:29 | * ... | desugar.rb:22:18:22:29 | ... = ... | | -| desugar.rb:22:18:22:29 | ... = ... | desugar.rb:22:3:22:3 | x | | +| desugar.rb:22:10:22:14 | call to [] | desugar.rb:22:10:22:14 | After call to [] | | +| desugar.rb:22:10:22:14 | call to bar= | desugar.rb:22:10:22:14 | After call to bar= | | +| desugar.rb:22:18:22:29 | * ... | desugar.rb:22:18:22:29 | After * ... | | +| desugar.rb:22:18:22:29 | ... = ... | desugar.rb:22:18:22:29 | After ... = ... | | +| desugar.rb:22:18:22:29 | After * ... | desugar.rb:22:18:22:29 | ... = ... | | +| desugar.rb:22:18:22:29 | After ... = ... | desugar.rb:22:3:22:3 | Before ... = ... | | +| desugar.rb:22:18:22:29 | After call to [] | desugar.rb:22:18:22:29 | * ... | | | desugar.rb:22:18:22:29 | Array | desugar.rb:22:19:22:19 | 1 | | -| desugar.rb:22:18:22:29 | __synth__3 | desugar.rb:22:18:22:29 | Array | | -| desugar.rb:22:18:22:29 | call to [] | desugar.rb:22:18:22:29 | * ... | | +| desugar.rb:22:18:22:29 | Before * ... | desugar.rb:22:18:22:29 | Before call to [] | | +| desugar.rb:22:18:22:29 | Before ... = ... | desugar.rb:22:18:22:29 | __synth__3 | | +| desugar.rb:22:18:22:29 | Before call to [] | desugar.rb:22:18:22:29 | Array | | +| desugar.rb:22:18:22:29 | __synth__3 | desugar.rb:22:18:22:29 | Before * ... | | +| desugar.rb:22:18:22:29 | call to [] | desugar.rb:22:18:22:29 | After call to [] | | | desugar.rb:22:19:22:19 | 1 | desugar.rb:22:22:22:22 | 2 | | | desugar.rb:22:22:22:22 | 2 | desugar.rb:22:25:22:25 | 3 | | | desugar.rb:22:25:22:25 | 3 | desugar.rb:22:28:22:28 | 4 | | | desugar.rb:22:28:22:28 | 4 | desugar.rb:22:18:22:29 | call to [] | | -| desugar.rb:25:1:27:3 | enter m7 | desugar.rb:26:15:26:25 | __synth__2 | | -| desugar.rb:25:1:27:3 | exit m7 (normal) | desugar.rb:25:1:27:3 | exit m7 | | +| desugar.rb:25:1:27:3 | Entry | desugar.rb:26:3:26:25 | ... | | +| desugar.rb:25:1:27:3 | Normal Exit | desugar.rb:25:1:27:3 | Exit | | | desugar.rb:25:1:27:3 | m7 | desugar.rb:29:1:35:3 | X | | | desugar.rb:26:3:26:3 | 0 | desugar.rb:26:3:26:3 | call to [] | | -| desugar.rb:26:3:26:3 | ... = ... | desugar.rb:26:6:26:11 | __synth__2__1 | | +| desugar.rb:26:3:26:3 | ... = ... | desugar.rb:26:3:26:3 | After ... = ... | | +| desugar.rb:26:3:26:3 | After ... = ... | desugar.rb:26:6:26:11 | ... | | +| desugar.rb:26:3:26:3 | After call to [] | desugar.rb:26:3:26:3 | ... = ... | | +| desugar.rb:26:3:26:3 | Before ... = ... | desugar.rb:26:3:26:3 | x | | +| desugar.rb:26:3:26:3 | Before call to [] | desugar.rb:26:3:26:3 | __synth__2 | | | desugar.rb:26:3:26:3 | __synth__2 | desugar.rb:26:3:26:3 | 0 | | -| desugar.rb:26:3:26:3 | call to [] | desugar.rb:26:3:26:3 | ... = ... | | -| desugar.rb:26:3:26:3 | x | desugar.rb:26:3:26:3 | __synth__2 | | -| desugar.rb:26:3:26:25 | ... | desugar.rb:25:1:27:3 | exit m7 (normal) | | +| desugar.rb:26:3:26:3 | call to [] | desugar.rb:26:3:26:3 | After call to [] | | +| desugar.rb:26:3:26:3 | x | desugar.rb:26:3:26:3 | Before call to [] | | +| desugar.rb:26:3:26:25 | ... | desugar.rb:26:3:26:25 | ... | | +| desugar.rb:26:3:26:25 | ... | desugar.rb:26:15:26:25 | Before ... = ... | | +| desugar.rb:26:3:26:25 | After ... | desugar.rb:25:1:27:3 | Normal Exit | | +| desugar.rb:26:3:26:25 | After ... | desugar.rb:26:3:26:25 | After ... | | | desugar.rb:26:6:26:11 | 1 | desugar.rb:26:6:26:11 | call to [] | | -| desugar.rb:26:6:26:11 | * ... | desugar.rb:26:6:26:11 | ... = ... | | -| desugar.rb:26:6:26:11 | ... | desugar.rb:26:3:26:25 | ... | | -| desugar.rb:26:6:26:11 | ... = ... | desugar.rb:26:7:26:7 | y | | +| desugar.rb:26:6:26:11 | * ... | desugar.rb:26:6:26:11 | After * ... | | +| desugar.rb:26:6:26:11 | ... | desugar.rb:26:6:26:11 | Before ... = ... | | +| desugar.rb:26:6:26:11 | ... = ... | desugar.rb:26:6:26:11 | After ... = ... | | +| desugar.rb:26:6:26:11 | After * ... | desugar.rb:26:6:26:11 | ... = ... | | +| desugar.rb:26:6:26:11 | After ... | desugar.rb:26:3:26:25 | After ... | | +| desugar.rb:26:6:26:11 | After ... = ... | desugar.rb:26:7:26:7 | Before ... = ... | | +| desugar.rb:26:6:26:11 | After call to [] | desugar.rb:26:6:26:11 | * ... | | +| desugar.rb:26:6:26:11 | Before * ... | desugar.rb:26:6:26:11 | Before call to [] | | +| desugar.rb:26:6:26:11 | Before ... = ... | desugar.rb:26:6:26:11 | __synth__2__1 | | +| desugar.rb:26:6:26:11 | Before call to [] | desugar.rb:26:6:26:11 | __synth__2 | | | desugar.rb:26:6:26:11 | __synth__2 | desugar.rb:26:6:26:11 | 1 | | -| desugar.rb:26:6:26:11 | __synth__2__1 | desugar.rb:26:6:26:11 | __synth__2 | | -| desugar.rb:26:6:26:11 | call to [] | desugar.rb:26:6:26:11 | * ... | | +| desugar.rb:26:6:26:11 | __synth__2__1 | desugar.rb:26:6:26:11 | Before * ... | | +| desugar.rb:26:6:26:11 | call to [] | desugar.rb:26:6:26:11 | After call to [] | | | desugar.rb:26:7:26:7 | 0 | desugar.rb:26:7:26:7 | call to [] | | -| desugar.rb:26:7:26:7 | ... = ... | desugar.rb:26:10:26:10 | z | | +| desugar.rb:26:7:26:7 | ... = ... | desugar.rb:26:7:26:7 | After ... = ... | | +| desugar.rb:26:7:26:7 | After ... = ... | desugar.rb:26:10:26:10 | Before ... = ... | | +| desugar.rb:26:7:26:7 | After call to [] | desugar.rb:26:7:26:7 | ... = ... | | +| desugar.rb:26:7:26:7 | Before ... = ... | desugar.rb:26:7:26:7 | y | | +| desugar.rb:26:7:26:7 | Before call to [] | desugar.rb:26:7:26:7 | __synth__2__1 | | | desugar.rb:26:7:26:7 | __synth__2__1 | desugar.rb:26:7:26:7 | 0 | | -| desugar.rb:26:7:26:7 | call to [] | desugar.rb:26:7:26:7 | ... = ... | | -| desugar.rb:26:7:26:7 | y | desugar.rb:26:7:26:7 | __synth__2__1 | | +| desugar.rb:26:7:26:7 | call to [] | desugar.rb:26:7:26:7 | After call to [] | | +| desugar.rb:26:7:26:7 | y | desugar.rb:26:7:26:7 | Before call to [] | | | desugar.rb:26:10:26:10 | 1 | desugar.rb:26:10:26:10 | call to [] | | -| desugar.rb:26:10:26:10 | ... = ... | desugar.rb:26:6:26:11 | ... | | +| desugar.rb:26:10:26:10 | ... = ... | desugar.rb:26:10:26:10 | After ... = ... | | +| desugar.rb:26:10:26:10 | After ... = ... | desugar.rb:26:6:26:11 | After ... | | +| desugar.rb:26:10:26:10 | After call to [] | desugar.rb:26:10:26:10 | ... = ... | | +| desugar.rb:26:10:26:10 | Before ... = ... | desugar.rb:26:10:26:10 | z | | +| desugar.rb:26:10:26:10 | Before call to [] | desugar.rb:26:10:26:10 | __synth__2__1 | | | desugar.rb:26:10:26:10 | __synth__2__1 | desugar.rb:26:10:26:10 | 1 | | -| desugar.rb:26:10:26:10 | call to [] | desugar.rb:26:10:26:10 | ... = ... | | -| desugar.rb:26:10:26:10 | z | desugar.rb:26:10:26:10 | __synth__2__1 | | -| desugar.rb:26:15:26:25 | * ... | desugar.rb:26:15:26:25 | ... = ... | | -| desugar.rb:26:15:26:25 | ... = ... | desugar.rb:26:3:26:3 | x | | +| desugar.rb:26:10:26:10 | call to [] | desugar.rb:26:10:26:10 | After call to [] | | +| desugar.rb:26:10:26:10 | z | desugar.rb:26:10:26:10 | Before call to [] | | +| desugar.rb:26:15:26:25 | * ... | desugar.rb:26:15:26:25 | After * ... | | +| desugar.rb:26:15:26:25 | ... = ... | desugar.rb:26:15:26:25 | After ... = ... | | +| desugar.rb:26:15:26:25 | After * ... | desugar.rb:26:15:26:25 | ... = ... | | +| desugar.rb:26:15:26:25 | After ... = ... | desugar.rb:26:3:26:3 | Before ... = ... | | +| desugar.rb:26:15:26:25 | After call to [] | desugar.rb:26:15:26:25 | * ... | | | desugar.rb:26:15:26:25 | Array | desugar.rb:26:16:26:16 | 1 | | -| desugar.rb:26:15:26:25 | __synth__2 | desugar.rb:26:15:26:25 | Array | | -| desugar.rb:26:15:26:25 | call to [] | desugar.rb:26:15:26:25 | * ... | | -| desugar.rb:26:16:26:16 | 1 | desugar.rb:26:19:26:24 | Array | | +| desugar.rb:26:15:26:25 | Before * ... | desugar.rb:26:15:26:25 | Before call to [] | | +| desugar.rb:26:15:26:25 | Before ... = ... | desugar.rb:26:15:26:25 | __synth__2 | | +| desugar.rb:26:15:26:25 | Before call to [] | desugar.rb:26:15:26:25 | Array | | +| desugar.rb:26:15:26:25 | __synth__2 | desugar.rb:26:15:26:25 | Before * ... | | +| desugar.rb:26:15:26:25 | call to [] | desugar.rb:26:15:26:25 | After call to [] | | +| desugar.rb:26:16:26:16 | 1 | desugar.rb:26:19:26:24 | Before call to [] | | +| desugar.rb:26:19:26:24 | After call to [] | desugar.rb:26:15:26:25 | call to [] | | | desugar.rb:26:19:26:24 | Array | desugar.rb:26:20:26:20 | 2 | | -| desugar.rb:26:19:26:24 | call to [] | desugar.rb:26:15:26:25 | call to [] | | +| desugar.rb:26:19:26:24 | Before call to [] | desugar.rb:26:19:26:24 | Array | | +| desugar.rb:26:19:26:24 | call to [] | desugar.rb:26:19:26:24 | After call to [] | | | desugar.rb:26:20:26:20 | 2 | desugar.rb:26:23:26:23 | 3 | | | desugar.rb:26:23:26:23 | 3 | desugar.rb:26:19:26:24 | call to [] | | -| desugar.rb:29:1:35:3 | X | desugar.rb:30:3:30:4 | self | | -| desugar.rb:30:3:30:4 | @x | desugar.rb:30:8:30:8 | 1 | | +| desugar.rb:29:1:35:3 | After X | desugar.rb:37:1:37:15 | Before ... = ... | | +| desugar.rb:29:1:35:3 | X | desugar.rb:30:3:30:8 | Before ... = ... | | +| desugar.rb:30:3:30:4 | @x | desugar.rb:30:3:30:4 | After @x | | +| desugar.rb:30:3:30:4 | After @x | desugar.rb:30:8:30:8 | 1 | | +| desugar.rb:30:3:30:4 | Before @x | desugar.rb:30:3:30:4 | self | | | desugar.rb:30:3:30:4 | self | desugar.rb:30:3:30:4 | @x | | -| desugar.rb:30:3:30:8 | ... = ... | desugar.rb:31:3:31:4 | self | | +| desugar.rb:30:3:30:8 | ... = ... | desugar.rb:30:3:30:8 | After ... = ... | | +| desugar.rb:30:3:30:8 | After ... = ... | desugar.rb:31:3:31:9 | Before ... = ... | | +| desugar.rb:30:3:30:8 | Before ... = ... | desugar.rb:30:3:30:4 | Before @x | | | desugar.rb:30:8:30:8 | 1 | desugar.rb:30:3:30:8 | ... = ... | | -| desugar.rb:31:3:31:4 | @x | desugar.rb:31:3:31:4 | self | | -| desugar.rb:31:3:31:4 | @x | desugar.rb:31:9:31:9 | 2 | | +| desugar.rb:31:3:31:4 | @x | desugar.rb:31:3:31:4 | After @x | | +| desugar.rb:31:3:31:4 | @x | desugar.rb:31:3:31:4 | After @x | | +| desugar.rb:31:3:31:4 | After @x | desugar.rb:31:6:31:7 | Before ... + ... | | +| desugar.rb:31:3:31:4 | After @x | desugar.rb:31:9:31:9 | 2 | | +| desugar.rb:31:3:31:4 | Before @x | desugar.rb:31:3:31:4 | self | | +| desugar.rb:31:3:31:4 | Before @x | desugar.rb:31:3:31:4 | self | | | desugar.rb:31:3:31:4 | self | desugar.rb:31:3:31:4 | @x | | | desugar.rb:31:3:31:4 | self | desugar.rb:31:3:31:4 | @x | | -| desugar.rb:31:3:31:9 | ... = ... | desugar.rb:33:3:33:5 | @@y | | -| desugar.rb:31:6:31:7 | ... + ... | desugar.rb:31:3:31:9 | ... = ... | | +| desugar.rb:31:3:31:9 | ... = ... | desugar.rb:31:3:31:9 | After ... = ... | | +| desugar.rb:31:3:31:9 | After ... = ... | desugar.rb:33:3:33:9 | Before ... = ... | | +| desugar.rb:31:3:31:9 | Before ... = ... | desugar.rb:31:3:31:4 | Before @x | | +| desugar.rb:31:6:31:7 | ... + ... | desugar.rb:31:6:31:7 | After ... + ... | | +| desugar.rb:31:6:31:7 | After ... + ... | desugar.rb:31:3:31:9 | ... = ... | | +| desugar.rb:31:6:31:7 | Before ... + ... | desugar.rb:31:3:31:4 | Before @x | | | desugar.rb:31:9:31:9 | 2 | desugar.rb:31:6:31:7 | ... + ... | | | desugar.rb:33:3:33:5 | @@y | desugar.rb:33:9:33:9 | 3 | | -| desugar.rb:33:3:33:9 | ... = ... | desugar.rb:34:3:34:5 | @@y | | +| desugar.rb:33:3:33:9 | ... = ... | desugar.rb:33:3:33:9 | After ... = ... | | +| desugar.rb:33:3:33:9 | After ... = ... | desugar.rb:34:3:34:10 | Before ... = ... | | +| desugar.rb:33:3:33:9 | Before ... = ... | desugar.rb:33:3:33:5 | @@y | | | desugar.rb:33:9:33:9 | 3 | desugar.rb:33:3:33:9 | ... = ... | | -| desugar.rb:34:3:34:5 | @@y | desugar.rb:34:3:34:5 | @@y | | +| desugar.rb:34:3:34:5 | @@y | desugar.rb:34:7:34:8 | Before ... / ... | | | desugar.rb:34:3:34:5 | @@y | desugar.rb:34:10:34:10 | 4 | | -| desugar.rb:34:3:34:10 | ... = ... | desugar.rb:37:1:37:11 | $global_var | | -| desugar.rb:34:7:34:8 | ... / ... | desugar.rb:34:3:34:10 | ... = ... | | +| desugar.rb:34:3:34:10 | ... = ... | desugar.rb:34:3:34:10 | After ... = ... | | +| desugar.rb:34:3:34:10 | After ... = ... | desugar.rb:29:1:35:3 | After X | | +| desugar.rb:34:3:34:10 | Before ... = ... | desugar.rb:34:3:34:5 | @@y | | +| desugar.rb:34:7:34:8 | ... / ... | desugar.rb:34:7:34:8 | After ... / ... | | +| desugar.rb:34:7:34:8 | After ... / ... | desugar.rb:34:3:34:10 | ... = ... | | +| desugar.rb:34:7:34:8 | Before ... / ... | desugar.rb:34:3:34:5 | @@y | | | desugar.rb:34:10:34:10 | 4 | desugar.rb:34:7:34:8 | ... / ... | | | desugar.rb:37:1:37:11 | $global_var | desugar.rb:37:15:37:15 | 5 | | -| desugar.rb:37:1:37:15 | ... = ... | desugar.rb:38:1:38:11 | $global_var | | +| desugar.rb:37:1:37:15 | ... = ... | desugar.rb:37:1:37:15 | After ... = ... | | +| desugar.rb:37:1:37:15 | After ... = ... | desugar.rb:38:1:38:16 | Before ... = ... | | +| desugar.rb:37:1:37:15 | Before ... = ... | desugar.rb:37:1:37:11 | $global_var | | | desugar.rb:37:15:37:15 | 5 | desugar.rb:37:1:37:15 | ... = ... | | -| desugar.rb:38:1:38:11 | $global_var | desugar.rb:38:1:38:11 | $global_var | | +| desugar.rb:38:1:38:11 | $global_var | desugar.rb:38:13:38:14 | Before ... * ... | | | desugar.rb:38:1:38:11 | $global_var | desugar.rb:38:16:38:16 | 6 | | -| desugar.rb:38:1:38:16 | ... = ... | desugar.rb:1:1:38:17 | exit desugar.rb (normal) | | -| desugar.rb:38:13:38:14 | ... * ... | desugar.rb:38:1:38:16 | ... = ... | | +| desugar.rb:38:1:38:16 | ... = ... | desugar.rb:38:1:38:16 | After ... = ... | | +| desugar.rb:38:1:38:16 | After ... = ... | desugar.rb:1:1:38:17 | Normal Exit | | +| desugar.rb:38:1:38:16 | Before ... = ... | desugar.rb:38:1:38:11 | $global_var | | +| desugar.rb:38:13:38:14 | ... * ... | desugar.rb:38:13:38:14 | After ... * ... | | +| desugar.rb:38:13:38:14 | After ... * ... | desugar.rb:38:1:38:16 | ... = ... | | +| desugar.rb:38:13:38:14 | Before ... * ... | desugar.rb:38:1:38:11 | $global_var | | | desugar.rb:38:16:38:16 | 6 | desugar.rb:38:13:38:14 | ... * ... | | -| exit.rb:1:1:6:3 | enter m1 | exit.rb:1:8:1:8 | x | | -| exit.rb:1:1:6:3 | exit m1 (abnormal) | exit.rb:1:1:6:3 | exit m1 | | -| exit.rb:1:1:6:3 | exit m1 (normal) | exit.rb:1:1:6:3 | exit m1 | | +| exit.rb:1:1:6:3 | Entry | exit.rb:1:8:1:8 | x | | +| exit.rb:1:1:6:3 | Exceptional Exit | exit.rb:1:1:6:3 | Exit | | +| exit.rb:1:1:6:3 | Normal Exit | exit.rb:1:1:6:3 | Exit | | | exit.rb:1:1:6:3 | m1 | exit.rb:8:1:13:3 | m2 | | -| exit.rb:1:1:13:4 | enter exit.rb | exit.rb:1:1:6:3 | m1 | | -| exit.rb:1:1:13:4 | exit exit.rb (normal) | exit.rb:1:1:13:4 | exit exit.rb | | -| exit.rb:1:8:1:8 | x | exit.rb:2:6:2:6 | x | | -| exit.rb:2:3:4:5 | if ... | exit.rb:5:3:5:15 | self | | +| exit.rb:1:1:13:4 | Entry | exit.rb:1:1:6:3 | m1 | | +| exit.rb:1:1:13:4 | Normal Exit | exit.rb:1:1:13:4 | Exit | | +| exit.rb:1:8:1:8 | x | exit.rb:2:3:5:15 | ... | | +| exit.rb:2:3:4:5 | After if ... | exit.rb:5:3:5:15 | Before call to puts | | +| exit.rb:2:3:4:5 | if ... | exit.rb:2:6:2:10 | Before ... > ... | | +| exit.rb:2:3:5:15 | ... | exit.rb:2:3:4:5 | if ... | | +| exit.rb:2:3:5:15 | After ... | exit.rb:1:1:6:3 | Normal Exit | | | exit.rb:2:6:2:6 | x | exit.rb:2:10:2:10 | 2 | | -| exit.rb:2:6:2:10 | ... > ... | exit.rb:2:3:4:5 | if ... | false | -| exit.rb:2:6:2:10 | ... > ... | exit.rb:3:5:3:10 | self | true | +| exit.rb:2:6:2:10 | ... > ... | exit.rb:2:6:2:10 | After ... > ... [false] | false | +| exit.rb:2:6:2:10 | ... > ... | exit.rb:2:6:2:10 | After ... > ... [true] | true | +| exit.rb:2:6:2:10 | After ... > ... [false] | exit.rb:2:3:4:5 | After if ... | | +| exit.rb:2:6:2:10 | After ... > ... [true] | exit.rb:2:11:3:10 | then ... | | +| exit.rb:2:6:2:10 | Before ... > ... | exit.rb:2:6:2:6 | x | | | exit.rb:2:10:2:10 | 2 | exit.rb:2:6:2:10 | ... > ... | | -| exit.rb:3:5:3:10 | call to exit | exit.rb:1:1:6:3 | exit m1 (abnormal) | exit | +| exit.rb:2:11:3:10 | then ... | exit.rb:3:5:3:10 | Before call to exit | | +| exit.rb:3:5:3:10 | Before call to exit | exit.rb:3:5:3:10 | self | | +| exit.rb:3:5:3:10 | call to exit | exit.rb:1:1:6:3 | Exceptional Exit | exit | | exit.rb:3:5:3:10 | self | exit.rb:3:10:3:10 | 1 | | | exit.rb:3:10:3:10 | 1 | exit.rb:3:5:3:10 | call to exit | | -| exit.rb:5:3:5:15 | call to puts | exit.rb:1:1:6:3 | exit m1 (normal) | | -| exit.rb:5:3:5:15 | self | exit.rb:5:9:5:14 | x <= 2 | | -| exit.rb:5:8:5:15 | "x <= 2" | exit.rb:5:3:5:15 | call to puts | | +| exit.rb:5:3:5:15 | After call to puts | exit.rb:2:3:5:15 | After ... | | +| exit.rb:5:3:5:15 | Before call to puts | exit.rb:5:3:5:15 | self | | +| exit.rb:5:3:5:15 | call to puts | exit.rb:5:3:5:15 | After call to puts | | +| exit.rb:5:3:5:15 | self | exit.rb:5:8:5:15 | Before "x <= 2" | | +| exit.rb:5:8:5:15 | "x <= 2" | exit.rb:5:8:5:15 | After "x <= 2" | | +| exit.rb:5:8:5:15 | After "x <= 2" | exit.rb:5:3:5:15 | call to puts | | +| exit.rb:5:8:5:15 | Before "x <= 2" | exit.rb:5:9:5:14 | x <= 2 | | | exit.rb:5:9:5:14 | x <= 2 | exit.rb:5:8:5:15 | "x <= 2" | | -| exit.rb:8:1:13:3 | enter m2 | exit.rb:8:8:8:8 | x | | -| exit.rb:8:1:13:3 | exit m2 (abnormal) | exit.rb:8:1:13:3 | exit m2 | | -| exit.rb:8:1:13:3 | exit m2 (normal) | exit.rb:8:1:13:3 | exit m2 | | -| exit.rb:8:1:13:3 | m2 | exit.rb:1:1:13:4 | exit exit.rb (normal) | | -| exit.rb:8:8:8:8 | x | exit.rb:9:6:9:6 | x | | -| exit.rb:9:3:11:5 | if ... | exit.rb:12:3:12:15 | self | | +| exit.rb:8:1:13:3 | Entry | exit.rb:8:8:8:8 | x | | +| exit.rb:8:1:13:3 | Exceptional Exit | exit.rb:8:1:13:3 | Exit | | +| exit.rb:8:1:13:3 | Normal Exit | exit.rb:8:1:13:3 | Exit | | +| exit.rb:8:1:13:3 | m2 | exit.rb:1:1:13:4 | Normal Exit | | +| exit.rb:8:8:8:8 | x | exit.rb:9:3:12:15 | ... | | +| exit.rb:9:3:11:5 | After if ... | exit.rb:12:3:12:15 | Before call to puts | | +| exit.rb:9:3:11:5 | if ... | exit.rb:9:6:9:10 | Before ... > ... | | +| exit.rb:9:3:12:15 | ... | exit.rb:9:3:11:5 | if ... | | +| exit.rb:9:3:12:15 | After ... | exit.rb:8:1:13:3 | Normal Exit | | | exit.rb:9:6:9:6 | x | exit.rb:9:10:9:10 | 2 | | -| exit.rb:9:6:9:10 | ... > ... | exit.rb:9:3:11:5 | if ... | false | -| exit.rb:9:6:9:10 | ... > ... | exit.rb:10:5:10:18 | self | true | +| exit.rb:9:6:9:10 | ... > ... | exit.rb:9:6:9:10 | After ... > ... [false] | false | +| exit.rb:9:6:9:10 | ... > ... | exit.rb:9:6:9:10 | After ... > ... [true] | true | +| exit.rb:9:6:9:10 | After ... > ... [false] | exit.rb:9:3:11:5 | After if ... | | +| exit.rb:9:6:9:10 | After ... > ... [true] | exit.rb:9:11:10:18 | then ... | | +| exit.rb:9:6:9:10 | Before ... > ... | exit.rb:9:6:9:6 | x | | | exit.rb:9:10:9:10 | 2 | exit.rb:9:6:9:10 | ... > ... | | -| exit.rb:10:5:10:18 | call to abort | exit.rb:8:1:13:3 | exit m2 (abnormal) | exit | -| exit.rb:10:5:10:18 | self | exit.rb:10:12:10:17 | abort! | | -| exit.rb:10:11:10:18 | "abort!" | exit.rb:10:5:10:18 | call to abort | | +| exit.rb:9:11:10:18 | then ... | exit.rb:10:5:10:18 | Before call to abort | | +| exit.rb:10:5:10:18 | Before call to abort | exit.rb:10:5:10:18 | self | | +| exit.rb:10:5:10:18 | call to abort | exit.rb:8:1:13:3 | Exceptional Exit | exit | +| exit.rb:10:5:10:18 | self | exit.rb:10:11:10:18 | Before "abort!" | | +| exit.rb:10:11:10:18 | "abort!" | exit.rb:10:11:10:18 | After "abort!" | | +| exit.rb:10:11:10:18 | After "abort!" | exit.rb:10:5:10:18 | call to abort | | +| exit.rb:10:11:10:18 | Before "abort!" | exit.rb:10:12:10:17 | abort! | | | exit.rb:10:12:10:17 | abort! | exit.rb:10:11:10:18 | "abort!" | | -| exit.rb:12:3:12:15 | call to puts | exit.rb:8:1:13:3 | exit m2 (normal) | | -| exit.rb:12:3:12:15 | self | exit.rb:12:9:12:14 | x <= 2 | | -| exit.rb:12:8:12:15 | "x <= 2" | exit.rb:12:3:12:15 | call to puts | | +| exit.rb:12:3:12:15 | After call to puts | exit.rb:9:3:12:15 | After ... | | +| exit.rb:12:3:12:15 | Before call to puts | exit.rb:12:3:12:15 | self | | +| exit.rb:12:3:12:15 | call to puts | exit.rb:12:3:12:15 | After call to puts | | +| exit.rb:12:3:12:15 | self | exit.rb:12:8:12:15 | Before "x <= 2" | | +| exit.rb:12:8:12:15 | "x <= 2" | exit.rb:12:8:12:15 | After "x <= 2" | | +| exit.rb:12:8:12:15 | After "x <= 2" | exit.rb:12:3:12:15 | call to puts | | +| exit.rb:12:8:12:15 | Before "x <= 2" | exit.rb:12:9:12:14 | x <= 2 | | | exit.rb:12:9:12:14 | x <= 2 | exit.rb:12:8:12:15 | "x <= 2" | | -| heredoc.rb:1:1:7:3 | double_heredoc | heredoc.rb:1:1:7:4 | exit heredoc.rb (normal) | | -| heredoc.rb:1:1:7:3 | enter double_heredoc | heredoc.rb:2:3:2:16 | self | | -| heredoc.rb:1:1:7:3 | exit double_heredoc (normal) | heredoc.rb:1:1:7:3 | exit double_heredoc | | -| heredoc.rb:1:1:7:4 | enter heredoc.rb | heredoc.rb:1:1:7:3 | double_heredoc | | -| heredoc.rb:1:1:7:4 | exit heredoc.rb (normal) | heredoc.rb:1:1:7:4 | exit heredoc.rb | | -| heredoc.rb:2:3:2:16 | call to puts | heredoc.rb:1:1:7:3 | exit double_heredoc (normal) | | -| heredoc.rb:2:3:2:16 | self | heredoc.rb:2:17:3:10 | \n hello\n | | -| heredoc.rb:2:8:2:10 | < ... | | | ifs.rb:2:6:2:6 | x | ifs.rb:2:10:2:10 | 2 | | -| ifs.rb:2:6:2:10 | ... > ... | ifs.rb:3:5:3:30 | self | true | -| ifs.rb:2:6:2:10 | ... > ... | ifs.rb:4:9:4:9 | x | false | +| ifs.rb:2:6:2:10 | ... > ... | ifs.rb:2:6:2:10 | After ... > ... [false] | false | +| ifs.rb:2:6:2:10 | ... > ... | ifs.rb:2:6:2:10 | After ... > ... [true] | true | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:3:7:35 | elsif ... | | +| ifs.rb:2:6:2:10 | After ... > ... [true] | ifs.rb:2:11:3:30 | then ... | | +| ifs.rb:2:6:2:10 | Before ... > ... | ifs.rb:2:6:2:6 | x | | | ifs.rb:2:10:2:10 | 2 | ifs.rb:2:6:2:10 | ... > ... | | -| ifs.rb:2:11:3:30 | then ... | ifs.rb:2:3:8:5 | if ... | | -| ifs.rb:3:5:3:30 | call to puts | ifs.rb:2:11:3:30 | then ... | | -| ifs.rb:3:5:3:30 | self | ifs.rb:3:11:3:29 | x is greater than 2 | | -| ifs.rb:3:10:3:30 | "x is greater than 2" | ifs.rb:3:5:3:30 | call to puts | | +| ifs.rb:2:11:3:30 | After then ... | ifs.rb:2:3:8:5 | After if ... | | +| ifs.rb:2:11:3:30 | then ... | ifs.rb:3:5:3:30 | Before call to puts | | +| ifs.rb:3:5:3:30 | After call to puts | ifs.rb:2:11:3:30 | After then ... | | +| ifs.rb:3:5:3:30 | Before call to puts | ifs.rb:3:5:3:30 | self | | +| ifs.rb:3:5:3:30 | call to puts | ifs.rb:3:5:3:30 | After call to puts | | +| ifs.rb:3:5:3:30 | self | ifs.rb:3:10:3:30 | Before "x is greater than 2" | | +| ifs.rb:3:10:3:30 | "x is greater than 2" | ifs.rb:3:10:3:30 | After "x is greater than 2" | | +| ifs.rb:3:10:3:30 | After "x is greater than 2" | ifs.rb:3:5:3:30 | call to puts | | +| ifs.rb:3:10:3:30 | Before "x is greater than 2" | ifs.rb:3:11:3:29 | x is greater than 2 | | | ifs.rb:3:11:3:29 | x is greater than 2 | ifs.rb:3:10:3:30 | "x is greater than 2" | | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:2:3:8:5 | if ... | | +| ifs.rb:4:3:7:35 | After elsif ... | ifs.rb:2:3:8:5 | After if ... | | +| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:4:9:4:38 | ... and ... | | | ifs.rb:4:9:4:9 | x | ifs.rb:4:14:4:14 | 2 | | -| ifs.rb:4:9:4:14 | ... <= ... | ifs.rb:4:9:4:24 | [false] ... and ... | false | -| ifs.rb:4:9:4:14 | ... <= ... | ifs.rb:4:20:4:20 | x | true | -| ifs.rb:4:9:4:24 | [false] ... and ... | ifs.rb:4:9:4:38 | [false] ... and ... | false | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:32:4:32 | x | true | -| ifs.rb:4:9:4:38 | [false] ... and ... | ifs.rb:7:5:7:35 | self | false | -| ifs.rb:4:9:4:38 | [true] ... and ... | ifs.rb:5:5:5:17 | self | true | +| ifs.rb:4:9:4:14 | ... <= ... | ifs.rb:4:9:4:14 | After ... <= ... [false] | false | +| ifs.rb:4:9:4:14 | ... <= ... | ifs.rb:4:9:4:14 | After ... <= ... [true] | true | +| ifs.rb:4:9:4:14 | After ... <= ... [false] | ifs.rb:4:9:4:24 | After ... and ... [false] | false | +| ifs.rb:4:9:4:14 | After ... <= ... [true] | ifs.rb:4:20:4:24 | Before ... > ... | | +| ifs.rb:4:9:4:14 | Before ... <= ... | ifs.rb:4:9:4:9 | x | | +| ifs.rb:4:9:4:24 | ... and ... | ifs.rb:4:9:4:14 | Before ... <= ... | | +| ifs.rb:4:9:4:24 | After ... and ... [false] | ifs.rb:4:9:4:38 | After ... and ... [false] | false | +| ifs.rb:4:9:4:24 | After ... and ... [true] | ifs.rb:4:30:4:38 | ! ... | | +| ifs.rb:4:9:4:38 | ... and ... | ifs.rb:4:9:4:24 | ... and ... | | +| ifs.rb:4:9:4:38 | After ... and ... [false] | ifs.rb:6:3:7:35 | else ... | | +| ifs.rb:4:9:4:38 | After ... and ... [true] | ifs.rb:4:39:5:17 | then ... | | | ifs.rb:4:14:4:14 | 2 | ifs.rb:4:9:4:14 | ... <= ... | | | ifs.rb:4:20:4:20 | x | ifs.rb:4:24:4:24 | 0 | | -| ifs.rb:4:20:4:24 | ... > ... | ifs.rb:4:9:4:24 | [false] ... and ... | false | -| ifs.rb:4:20:4:24 | ... > ... | ifs.rb:4:9:4:24 | [true] ... and ... | true | +| ifs.rb:4:20:4:24 | ... > ... | ifs.rb:4:20:4:24 | After ... > ... [false] | false | +| ifs.rb:4:20:4:24 | ... > ... | ifs.rb:4:20:4:24 | After ... > ... [true] | true | +| ifs.rb:4:20:4:24 | After ... > ... [false] | ifs.rb:4:9:4:24 | After ... and ... [false] | false | +| ifs.rb:4:20:4:24 | After ... > ... [true] | ifs.rb:4:9:4:24 | After ... and ... [true] | true | +| ifs.rb:4:20:4:24 | Before ... > ... | ifs.rb:4:20:4:20 | x | | | ifs.rb:4:24:4:24 | 0 | ifs.rb:4:20:4:24 | ... > ... | | -| ifs.rb:4:30:4:38 | [false] ! ... | ifs.rb:4:9:4:38 | [false] ... and ... | false | -| ifs.rb:4:30:4:38 | [true] ! ... | ifs.rb:4:9:4:38 | [true] ... and ... | true | -| ifs.rb:4:31:4:38 | [false] ( ... ) | ifs.rb:4:30:4:38 | [true] ! ... | false | -| ifs.rb:4:31:4:38 | [true] ( ... ) | ifs.rb:4:30:4:38 | [false] ! ... | true | +| ifs.rb:4:30:4:38 | ! ... | ifs.rb:4:31:4:38 | ( ... ) | | +| ifs.rb:4:30:4:38 | After ! ... [false] | ifs.rb:4:9:4:38 | After ... and ... [false] | false | +| ifs.rb:4:30:4:38 | After ! ... [true] | ifs.rb:4:9:4:38 | After ... and ... [true] | true | +| ifs.rb:4:31:4:38 | ( ... ) | ifs.rb:4:32:4:37 | Before ... == ... | | +| ifs.rb:4:31:4:38 | After ( ... ) [false] | ifs.rb:4:30:4:38 | After ! ... [true] | true | +| ifs.rb:4:31:4:38 | After ( ... ) [true] | ifs.rb:4:30:4:38 | After ! ... [false] | false | | ifs.rb:4:32:4:32 | x | ifs.rb:4:37:4:37 | 5 | | -| ifs.rb:4:32:4:37 | ... == ... | ifs.rb:4:31:4:38 | [false] ( ... ) | false | -| ifs.rb:4:32:4:37 | ... == ... | ifs.rb:4:31:4:38 | [true] ( ... ) | true | +| ifs.rb:4:32:4:37 | ... == ... | ifs.rb:4:32:4:37 | After ... == ... [false] | false | +| ifs.rb:4:32:4:37 | ... == ... | ifs.rb:4:32:4:37 | After ... == ... [true] | true | +| ifs.rb:4:32:4:37 | After ... == ... [false] | ifs.rb:4:31:4:38 | After ( ... ) [false] | false | +| ifs.rb:4:32:4:37 | After ... == ... [true] | ifs.rb:4:31:4:38 | After ( ... ) [true] | true | +| ifs.rb:4:32:4:37 | Before ... == ... | ifs.rb:4:32:4:32 | x | | | ifs.rb:4:37:4:37 | 5 | ifs.rb:4:32:4:37 | ... == ... | | -| ifs.rb:4:39:5:17 | then ... | ifs.rb:4:3:7:35 | elsif ... | | -| ifs.rb:5:5:5:17 | call to puts | ifs.rb:4:39:5:17 | then ... | | -| ifs.rb:5:5:5:17 | self | ifs.rb:5:11:5:16 | x is 1 | | -| ifs.rb:5:10:5:17 | "x is 1" | ifs.rb:5:5:5:17 | call to puts | | +| ifs.rb:4:39:5:17 | After then ... | ifs.rb:4:3:7:35 | After elsif ... | | +| ifs.rb:4:39:5:17 | then ... | ifs.rb:5:5:5:17 | Before call to puts | | +| ifs.rb:5:5:5:17 | After call to puts | ifs.rb:4:39:5:17 | After then ... | | +| ifs.rb:5:5:5:17 | Before call to puts | ifs.rb:5:5:5:17 | self | | +| ifs.rb:5:5:5:17 | call to puts | ifs.rb:5:5:5:17 | After call to puts | | +| ifs.rb:5:5:5:17 | self | ifs.rb:5:10:5:17 | Before "x is 1" | | +| ifs.rb:5:10:5:17 | "x is 1" | ifs.rb:5:10:5:17 | After "x is 1" | | +| ifs.rb:5:10:5:17 | After "x is 1" | ifs.rb:5:5:5:17 | call to puts | | +| ifs.rb:5:10:5:17 | Before "x is 1" | ifs.rb:5:11:5:16 | x is 1 | | | ifs.rb:5:11:5:16 | x is 1 | ifs.rb:5:10:5:17 | "x is 1" | | -| ifs.rb:6:3:7:35 | else ... | ifs.rb:4:3:7:35 | elsif ... | | -| ifs.rb:7:5:7:35 | call to puts | ifs.rb:6:3:7:35 | else ... | | -| ifs.rb:7:5:7:35 | self | ifs.rb:7:11:7:34 | I can't guess the number | | -| ifs.rb:7:10:7:35 | "I can't guess the number" | ifs.rb:7:5:7:35 | call to puts | | +| ifs.rb:6:3:7:35 | After else ... | ifs.rb:4:3:7:35 | After elsif ... | | +| ifs.rb:6:3:7:35 | else ... | ifs.rb:7:5:7:35 | Before call to puts | | +| ifs.rb:7:5:7:35 | After call to puts | ifs.rb:6:3:7:35 | After else ... | | +| ifs.rb:7:5:7:35 | Before call to puts | ifs.rb:7:5:7:35 | self | | +| ifs.rb:7:5:7:35 | call to puts | ifs.rb:7:5:7:35 | After call to puts | | +| ifs.rb:7:5:7:35 | self | ifs.rb:7:10:7:35 | Before "I can't guess the number" | | +| ifs.rb:7:10:7:35 | "I can't guess the number" | ifs.rb:7:10:7:35 | After "I can't guess the number" | | +| ifs.rb:7:10:7:35 | After "I can't guess the number" | ifs.rb:7:5:7:35 | call to puts | | +| ifs.rb:7:10:7:35 | Before "I can't guess the number" | ifs.rb:7:11:7:34 | I can't guess the number | | | ifs.rb:7:11:7:34 | I can't guess the number | ifs.rb:7:10:7:35 | "I can't guess the number" | | -| ifs.rb:11:1:16:3 | enter m2 | ifs.rb:11:8:11:8 | b | | -| ifs.rb:11:1:16:3 | exit m2 (normal) | ifs.rb:11:1:16:3 | exit m2 | | +| ifs.rb:11:1:16:3 | Entry | ifs.rb:11:8:11:8 | b | | +| ifs.rb:11:1:16:3 | Normal Exit | ifs.rb:11:1:16:3 | Exit | | | ifs.rb:11:1:16:3 | m2 | ifs.rb:18:1:26:3 | m3 | | -| ifs.rb:11:8:11:8 | b | ifs.rb:12:6:12:6 | b | | -| ifs.rb:12:3:14:5 | if ... | ifs.rb:15:10:15:10 | 1 | | -| ifs.rb:12:6:12:6 | b | ifs.rb:12:3:14:5 | if ... | false | -| ifs.rb:12:6:12:6 | b | ifs.rb:13:12:13:12 | 0 | true | -| ifs.rb:13:5:13:12 | return | ifs.rb:11:1:16:3 | exit m2 (normal) | return | +| ifs.rb:11:8:11:8 | b | ifs.rb:12:3:15:10 | ... | | +| ifs.rb:12:3:14:5 | After if ... | ifs.rb:15:3:15:10 | Before return | | +| ifs.rb:12:3:14:5 | if ... | ifs.rb:12:6:12:6 | b | | +| ifs.rb:12:3:15:10 | ... | ifs.rb:12:3:14:5 | if ... | | +| ifs.rb:12:6:12:6 | After b [false] | ifs.rb:12:3:14:5 | After if ... | | +| ifs.rb:12:6:12:6 | After b [true] | ifs.rb:12:7:13:12 | then ... | | +| ifs.rb:12:6:12:6 | b | ifs.rb:12:6:12:6 | After b [false] | false | +| ifs.rb:12:6:12:6 | b | ifs.rb:12:6:12:6 | After b [true] | true | +| ifs.rb:12:7:13:12 | then ... | ifs.rb:13:5:13:12 | Before return | | +| ifs.rb:13:5:13:12 | Before return | ifs.rb:13:12:13:12 | 0 | | +| ifs.rb:13:5:13:12 | return | ifs.rb:11:1:16:3 | Normal Exit | return | | ifs.rb:13:12:13:12 | 0 | ifs.rb:13:5:13:12 | return | | -| ifs.rb:15:3:15:10 | return | ifs.rb:11:1:16:3 | exit m2 (normal) | return | +| ifs.rb:15:3:15:10 | Before return | ifs.rb:15:10:15:10 | 1 | | +| ifs.rb:15:3:15:10 | return | ifs.rb:11:1:16:3 | Normal Exit | return | | ifs.rb:15:10:15:10 | 1 | ifs.rb:15:3:15:10 | return | | -| ifs.rb:18:1:26:3 | enter m3 | ifs.rb:18:8:18:8 | x | | -| ifs.rb:18:1:26:3 | exit m3 (normal) | ifs.rb:18:1:26:3 | exit m3 | | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:18:8:18:8 | x | | +| ifs.rb:18:1:26:3 | Normal Exit | ifs.rb:18:1:26:3 | Exit | | | ifs.rb:18:1:26:3 | m3 | ifs.rb:28:1:30:3 | m4 | | -| ifs.rb:18:8:18:8 | x | ifs.rb:19:6:19:6 | x | | -| ifs.rb:19:3:24:5 | if ... | ifs.rb:25:3:25:8 | self | | +| ifs.rb:18:8:18:8 | x | ifs.rb:19:3:25:8 | ... | | +| ifs.rb:19:3:24:5 | After if ... | ifs.rb:25:3:25:8 | Before call to puts | | +| ifs.rb:19:3:24:5 | if ... | ifs.rb:19:6:19:10 | Before ... < ... | | +| ifs.rb:19:3:25:8 | ... | ifs.rb:19:3:24:5 | if ... | | +| ifs.rb:19:3:25:8 | After ... | ifs.rb:18:1:26:3 | Normal Exit | | | ifs.rb:19:6:19:6 | x | ifs.rb:19:10:19:10 | 0 | | -| ifs.rb:19:6:19:10 | ... < ... | ifs.rb:19:3:24:5 | if ... | false | -| ifs.rb:19:6:19:10 | ... < ... | ifs.rb:20:5:20:5 | x | true | +| ifs.rb:19:6:19:10 | ... < ... | ifs.rb:19:6:19:10 | After ... < ... [false] | false | +| ifs.rb:19:6:19:10 | ... < ... | ifs.rb:19:6:19:10 | After ... < ... [true] | true | +| ifs.rb:19:6:19:10 | After ... < ... [false] | ifs.rb:19:3:24:5 | After if ... | | +| ifs.rb:19:6:19:10 | After ... < ... [true] | ifs.rb:19:11:23:7 | then ... | | +| ifs.rb:19:6:19:10 | Before ... < ... | ifs.rb:19:6:19:6 | x | | | ifs.rb:19:10:19:10 | 0 | ifs.rb:19:6:19:10 | ... < ... | | -| ifs.rb:19:11:23:7 | then ... | ifs.rb:19:3:24:5 | if ... | | -| ifs.rb:20:5:20:5 | x | ifs.rb:20:10:20:10 | x | | -| ifs.rb:20:5:20:10 | ... = ... | ifs.rb:21:8:21:8 | x | | -| ifs.rb:20:9:20:10 | - ... | ifs.rb:20:5:20:10 | ... = ... | | +| ifs.rb:19:11:23:7 | After then ... | ifs.rb:19:3:24:5 | After if ... | | +| ifs.rb:19:11:23:7 | then ... | ifs.rb:20:5:20:10 | Before ... = ... | | +| ifs.rb:20:5:20:5 | x | ifs.rb:20:9:20:10 | Before - ... | | +| ifs.rb:20:5:20:10 | ... = ... | ifs.rb:20:5:20:10 | After ... = ... | | +| ifs.rb:20:5:20:10 | After ... = ... | ifs.rb:21:5:23:7 | if ... | | +| ifs.rb:20:5:20:10 | Before ... = ... | ifs.rb:20:5:20:5 | x | | +| ifs.rb:20:9:20:10 | - ... | ifs.rb:20:9:20:10 | After - ... | | +| ifs.rb:20:9:20:10 | After - ... | ifs.rb:20:5:20:10 | ... = ... | | +| ifs.rb:20:9:20:10 | Before - ... | ifs.rb:20:10:20:10 | x | | | ifs.rb:20:10:20:10 | x | ifs.rb:20:9:20:10 | - ... | | -| ifs.rb:21:5:23:7 | if ... | ifs.rb:19:11:23:7 | then ... | | +| ifs.rb:21:5:23:7 | After if ... | ifs.rb:19:11:23:7 | After then ... | | +| ifs.rb:21:5:23:7 | if ... | ifs.rb:21:8:21:13 | Before ... > ... | | | ifs.rb:21:8:21:8 | x | ifs.rb:21:12:21:13 | 10 | | -| ifs.rb:21:8:21:13 | ... > ... | ifs.rb:21:5:23:7 | if ... | false | -| ifs.rb:21:8:21:13 | ... > ... | ifs.rb:22:7:22:7 | x | true | +| ifs.rb:21:8:21:13 | ... > ... | ifs.rb:21:8:21:13 | After ... > ... [false] | false | +| ifs.rb:21:8:21:13 | ... > ... | ifs.rb:21:8:21:13 | After ... > ... [true] | true | +| ifs.rb:21:8:21:13 | After ... > ... [false] | ifs.rb:21:5:23:7 | After if ... | | +| ifs.rb:21:8:21:13 | After ... > ... [true] | ifs.rb:21:14:22:15 | then ... | | +| ifs.rb:21:8:21:13 | Before ... > ... | ifs.rb:21:8:21:8 | x | | | ifs.rb:21:12:21:13 | 10 | ifs.rb:21:8:21:13 | ... > ... | | -| ifs.rb:21:14:22:15 | then ... | ifs.rb:21:5:23:7 | if ... | | -| ifs.rb:22:7:22:7 | x | ifs.rb:22:11:22:11 | x | | -| ifs.rb:22:7:22:15 | ... = ... | ifs.rb:21:14:22:15 | then ... | | +| ifs.rb:21:14:22:15 | After then ... | ifs.rb:21:5:23:7 | After if ... | | +| ifs.rb:21:14:22:15 | then ... | ifs.rb:22:7:22:15 | Before ... = ... | | +| ifs.rb:22:7:22:7 | x | ifs.rb:22:11:22:15 | Before ... - ... | | +| ifs.rb:22:7:22:15 | ... = ... | ifs.rb:22:7:22:15 | After ... = ... | | +| ifs.rb:22:7:22:15 | After ... = ... | ifs.rb:21:14:22:15 | After then ... | | +| ifs.rb:22:7:22:15 | Before ... = ... | ifs.rb:22:7:22:7 | x | | | ifs.rb:22:11:22:11 | x | ifs.rb:22:15:22:15 | 1 | | -| ifs.rb:22:11:22:15 | ... - ... | ifs.rb:22:7:22:15 | ... = ... | | +| ifs.rb:22:11:22:15 | ... - ... | ifs.rb:22:11:22:15 | After ... - ... | | +| ifs.rb:22:11:22:15 | After ... - ... | ifs.rb:22:7:22:15 | ... = ... | | +| ifs.rb:22:11:22:15 | Before ... - ... | ifs.rb:22:11:22:11 | x | | | ifs.rb:22:15:22:15 | 1 | ifs.rb:22:11:22:15 | ... - ... | | -| ifs.rb:25:3:25:8 | call to puts | ifs.rb:18:1:26:3 | exit m3 (normal) | | +| ifs.rb:25:3:25:8 | After call to puts | ifs.rb:19:3:25:8 | After ... | | +| ifs.rb:25:3:25:8 | Before call to puts | ifs.rb:25:3:25:8 | self | | +| ifs.rb:25:3:25:8 | call to puts | ifs.rb:25:3:25:8 | After call to puts | | | ifs.rb:25:3:25:8 | self | ifs.rb:25:8:25:8 | x | | | ifs.rb:25:8:25:8 | x | ifs.rb:25:3:25:8 | call to puts | | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:28:9:28:10 | b1 | | -| ifs.rb:28:1:30:3 | exit m4 (normal) | ifs.rb:28:1:30:3 | exit m4 | | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:28:9:28:10 | b1 | | +| ifs.rb:28:1:30:3 | Normal Exit | ifs.rb:28:1:30:3 | Exit | | | ifs.rb:28:1:30:3 | m4 | ifs.rb:32:1:34:3 | m5 | | | ifs.rb:28:9:28:10 | b1 | ifs.rb:28:13:28:14 | b2 | | | ifs.rb:28:13:28:14 | b2 | ifs.rb:28:17:28:18 | b3 | | -| ifs.rb:28:17:28:18 | b3 | ifs.rb:29:11:29:12 | b1 | | -| ifs.rb:29:3:29:51 | return | ifs.rb:28:1:30:3 | exit m4 (normal) | return | -| ifs.rb:29:10:29:23 | [false] ( ... ) | ifs.rb:29:41:29:50 | !b2 \|\| !b3 | false | -| ifs.rb:29:10:29:23 | [true] ( ... ) | ifs.rb:29:28:29:35 | b2 \|\| b3 | true | -| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:29:3:29:51 | return | | -| ifs.rb:29:11:29:12 | b1 | ifs.rb:29:16:29:17 | b2 | true | -| ifs.rb:29:11:29:12 | b1 | ifs.rb:29:21:29:22 | b3 | false | -| ifs.rb:29:11:29:22 | [false] ... ? ... : ... | ifs.rb:29:10:29:23 | [false] ( ... ) | false | -| ifs.rb:29:11:29:22 | [true] ... ? ... : ... | ifs.rb:29:10:29:23 | [true] ( ... ) | true | -| ifs.rb:29:16:29:17 | b2 | ifs.rb:29:11:29:22 | [false] ... ? ... : ... | false | -| ifs.rb:29:16:29:17 | b2 | ifs.rb:29:11:29:22 | [true] ... ? ... : ... | true | -| ifs.rb:29:21:29:22 | b3 | ifs.rb:29:11:29:22 | [false] ... ? ... : ... | false | -| ifs.rb:29:21:29:22 | b3 | ifs.rb:29:11:29:22 | [true] ... ? ... : ... | true | -| ifs.rb:29:27:29:36 | "b2 \|\| b3" | ifs.rb:29:10:29:51 | ... ? ... : ... | | +| ifs.rb:28:17:28:18 | b3 | ifs.rb:29:3:29:51 | ... | | +| ifs.rb:29:3:29:51 | ... | ifs.rb:29:3:29:51 | Before return | | +| ifs.rb:29:3:29:51 | Before return | ifs.rb:29:10:29:51 | ... ? ... : ... | | +| ifs.rb:29:3:29:51 | return | ifs.rb:28:1:30:3 | Normal Exit | return | +| ifs.rb:29:10:29:23 | ( ... ) | ifs.rb:29:11:29:22 | ... ? ... : ... | | +| ifs.rb:29:10:29:23 | After ( ... ) [false] | ifs.rb:29:40:29:51 | Before "!b2 \|\| !b3" | | +| ifs.rb:29:10:29:23 | After ( ... ) [true] | ifs.rb:29:27:29:36 | Before "b2 \|\| b3" | | +| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:29:10:29:23 | ( ... ) | | +| ifs.rb:29:10:29:51 | After ... ? ... : ... | ifs.rb:29:3:29:51 | return | | +| ifs.rb:29:11:29:12 | After b1 [false] | ifs.rb:29:21:29:22 | b3 | | +| ifs.rb:29:11:29:12 | After b1 [true] | ifs.rb:29:16:29:17 | b2 | | +| ifs.rb:29:11:29:12 | b1 | ifs.rb:29:11:29:12 | After b1 [false] | false | +| ifs.rb:29:11:29:12 | b1 | ifs.rb:29:11:29:12 | After b1 [true] | true | +| ifs.rb:29:11:29:22 | ... ? ... : ... | ifs.rb:29:11:29:12 | b1 | | +| ifs.rb:29:11:29:22 | After ... ? ... : ... [false] | ifs.rb:29:10:29:23 | After ( ... ) [false] | false | +| ifs.rb:29:11:29:22 | After ... ? ... : ... [true] | ifs.rb:29:10:29:23 | After ( ... ) [true] | true | +| ifs.rb:29:16:29:17 | After b2 [false] | ifs.rb:29:11:29:22 | After ... ? ... : ... [false] | false | +| ifs.rb:29:16:29:17 | After b2 [true] | ifs.rb:29:11:29:22 | After ... ? ... : ... [true] | true | +| ifs.rb:29:16:29:17 | b2 | ifs.rb:29:16:29:17 | After b2 [false] | false | +| ifs.rb:29:16:29:17 | b2 | ifs.rb:29:16:29:17 | After b2 [true] | true | +| ifs.rb:29:21:29:22 | After b3 [false] | ifs.rb:29:11:29:22 | After ... ? ... : ... [false] | false | +| ifs.rb:29:21:29:22 | After b3 [true] | ifs.rb:29:11:29:22 | After ... ? ... : ... [true] | true | +| ifs.rb:29:21:29:22 | b3 | ifs.rb:29:21:29:22 | After b3 [false] | false | +| ifs.rb:29:21:29:22 | b3 | ifs.rb:29:21:29:22 | After b3 [true] | true | +| ifs.rb:29:27:29:36 | "b2 \|\| b3" | ifs.rb:29:27:29:36 | After "b2 \|\| b3" | | +| ifs.rb:29:27:29:36 | After "b2 \|\| b3" | ifs.rb:29:10:29:51 | After ... ? ... : ... | | +| ifs.rb:29:27:29:36 | Before "b2 \|\| b3" | ifs.rb:29:28:29:35 | b2 \|\| b3 | | | ifs.rb:29:28:29:35 | b2 \|\| b3 | ifs.rb:29:27:29:36 | "b2 \|\| b3" | | -| ifs.rb:29:40:29:51 | "!b2 \|\| !b3" | ifs.rb:29:10:29:51 | ... ? ... : ... | | +| ifs.rb:29:40:29:51 | "!b2 \|\| !b3" | ifs.rb:29:40:29:51 | After "!b2 \|\| !b3" | | +| ifs.rb:29:40:29:51 | After "!b2 \|\| !b3" | ifs.rb:29:10:29:51 | After ... ? ... : ... | | +| ifs.rb:29:40:29:51 | Before "!b2 \|\| !b3" | ifs.rb:29:41:29:50 | !b2 \|\| !b3 | | | ifs.rb:29:41:29:50 | !b2 \|\| !b3 | ifs.rb:29:40:29:51 | "!b2 \|\| !b3" | | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:32:9:32:10 | b1 | | -| ifs.rb:32:1:34:3 | exit m5 (normal) | ifs.rb:32:1:34:3 | exit m5 | | -| ifs.rb:32:1:34:3 | m5 | ifs.rb:38:12:38:12 | 1 | | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:32:9:32:10 | b1 | | +| ifs.rb:32:1:34:3 | Normal Exit | ifs.rb:32:1:34:3 | Exit | | +| ifs.rb:32:1:34:3 | m5 | ifs.rb:36:1:38:17 | ... unless ... | | | ifs.rb:32:9:32:10 | b1 | ifs.rb:32:13:32:14 | b2 | | | ifs.rb:32:13:32:14 | b2 | ifs.rb:32:17:32:18 | b3 | | | ifs.rb:32:17:32:18 | b3 | ifs.rb:32:21:32:22 | b4 | | | ifs.rb:32:21:32:22 | b4 | ifs.rb:32:25:32:26 | b5 | | -| ifs.rb:32:25:32:26 | b5 | ifs.rb:33:10:33:11 | b1 | | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:32:1:34:3 | exit m5 (normal) | | -| ifs.rb:33:6:33:49 | [false] ( ... ) | ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | false | -| ifs.rb:33:6:33:49 | [true] ( ... ) | ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | true | -| ifs.rb:33:7:33:48 | [false] if ... | ifs.rb:33:6:33:49 | [false] ( ... ) | false | -| ifs.rb:33:7:33:48 | [true] if ... | ifs.rb:33:6:33:49 | [true] ( ... ) | true | -| ifs.rb:33:10:33:11 | b1 | ifs.rb:33:18:33:19 | b2 | true | -| ifs.rb:33:10:33:11 | b1 | ifs.rb:33:27:33:28 | b3 | false | -| ifs.rb:33:13:33:19 | [false] then ... | ifs.rb:33:7:33:48 | [false] if ... | false | -| ifs.rb:33:13:33:19 | [true] then ... | ifs.rb:33:7:33:48 | [true] if ... | true | -| ifs.rb:33:18:33:19 | b2 | ifs.rb:33:13:33:19 | [false] then ... | false | -| ifs.rb:33:18:33:19 | b2 | ifs.rb:33:13:33:19 | [true] then ... | true | -| ifs.rb:33:21:33:44 | [false] elsif ... | ifs.rb:33:7:33:48 | [false] if ... | false | -| ifs.rb:33:21:33:44 | [true] elsif ... | ifs.rb:33:7:33:48 | [true] if ... | true | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:35:33:36 | b4 | true | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:43:33:44 | b5 | false | -| ifs.rb:33:30:33:36 | [false] then ... | ifs.rb:33:21:33:44 | [false] elsif ... | false | -| ifs.rb:33:30:33:36 | [true] then ... | ifs.rb:33:21:33:44 | [true] elsif ... | true | -| ifs.rb:33:35:33:36 | b4 | ifs.rb:33:30:33:36 | [false] then ... | false | -| ifs.rb:33:35:33:36 | b4 | ifs.rb:33:30:33:36 | [true] then ... | true | -| ifs.rb:33:38:33:44 | [false] else ... | ifs.rb:33:21:33:44 | [false] elsif ... | false | -| ifs.rb:33:38:33:44 | [true] else ... | ifs.rb:33:21:33:44 | [true] elsif ... | true | -| ifs.rb:33:43:33:44 | b5 | ifs.rb:33:38:33:44 | [false] else ... | false | -| ifs.rb:33:43:33:44 | b5 | ifs.rb:33:38:33:44 | [true] else ... | true | -| ifs.rb:33:51:33:71 | then ... | ifs.rb:33:3:33:100 | if ... | | -| ifs.rb:33:56:33:71 | "b2 \|\| b4 \|\| b5" | ifs.rb:33:51:33:71 | then ... | | +| ifs.rb:32:25:32:26 | b5 | ifs.rb:33:3:33:100 | ... | | +| ifs.rb:33:3:33:100 | ... | ifs.rb:33:3:33:100 | if ... | | +| ifs.rb:33:3:33:100 | After ... | ifs.rb:32:1:34:3 | Normal Exit | | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:3:33:100 | After ... | | +| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:6:33:49 | ( ... ) | | +| ifs.rb:33:6:33:49 | ( ... ) | ifs.rb:33:7:33:48 | if ... | | +| ifs.rb:33:6:33:49 | After ( ... ) [false] | ifs.rb:33:73:33:96 | else ... | | +| ifs.rb:33:6:33:49 | After ( ... ) [true] | ifs.rb:33:51:33:71 | then ... | | +| ifs.rb:33:7:33:48 | After if ... [false] | ifs.rb:33:6:33:49 | After ( ... ) [false] | false | +| ifs.rb:33:7:33:48 | After if ... [true] | ifs.rb:33:6:33:49 | After ( ... ) [true] | true | +| ifs.rb:33:7:33:48 | if ... | ifs.rb:33:10:33:11 | b1 | | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:21:33:44 | elsif ... | | +| ifs.rb:33:10:33:11 | After b1 [true] | ifs.rb:33:13:33:19 | then ... | | +| ifs.rb:33:10:33:11 | b1 | ifs.rb:33:10:33:11 | After b1 [false] | false | +| ifs.rb:33:10:33:11 | b1 | ifs.rb:33:10:33:11 | After b1 [true] | true | +| ifs.rb:33:13:33:19 | After then ... [false] | ifs.rb:33:7:33:48 | After if ... [false] | false | +| ifs.rb:33:13:33:19 | After then ... [true] | ifs.rb:33:7:33:48 | After if ... [true] | true | +| ifs.rb:33:13:33:19 | then ... | ifs.rb:33:18:33:19 | b2 | | +| ifs.rb:33:18:33:19 | After b2 [false] | ifs.rb:33:13:33:19 | After then ... [false] | false | +| ifs.rb:33:18:33:19 | After b2 [true] | ifs.rb:33:13:33:19 | After then ... [true] | true | +| ifs.rb:33:18:33:19 | b2 | ifs.rb:33:18:33:19 | After b2 [false] | false | +| ifs.rb:33:18:33:19 | b2 | ifs.rb:33:18:33:19 | After b2 [true] | true | +| ifs.rb:33:21:33:44 | After elsif ... [false] | ifs.rb:33:7:33:48 | After if ... [false] | false | +| ifs.rb:33:21:33:44 | After elsif ... [true] | ifs.rb:33:7:33:48 | After if ... [true] | true | +| ifs.rb:33:21:33:44 | elsif ... | ifs.rb:33:27:33:28 | b3 | | +| ifs.rb:33:27:33:28 | After b3 [false] | ifs.rb:33:38:33:44 | else ... | | +| ifs.rb:33:27:33:28 | After b3 [true] | ifs.rb:33:30:33:36 | then ... | | +| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:27:33:28 | After b3 [false] | false | +| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:27:33:28 | After b3 [true] | true | +| ifs.rb:33:30:33:36 | After then ... [false] | ifs.rb:33:21:33:44 | After elsif ... [false] | false | +| ifs.rb:33:30:33:36 | After then ... [true] | ifs.rb:33:21:33:44 | After elsif ... [true] | true | +| ifs.rb:33:30:33:36 | then ... | ifs.rb:33:35:33:36 | b4 | | +| ifs.rb:33:35:33:36 | After b4 [false] | ifs.rb:33:30:33:36 | After then ... [false] | false | +| ifs.rb:33:35:33:36 | After b4 [true] | ifs.rb:33:30:33:36 | After then ... [true] | true | +| ifs.rb:33:35:33:36 | b4 | ifs.rb:33:35:33:36 | After b4 [false] | false | +| ifs.rb:33:35:33:36 | b4 | ifs.rb:33:35:33:36 | After b4 [true] | true | +| ifs.rb:33:38:33:44 | After else ... [false] | ifs.rb:33:21:33:44 | After elsif ... [false] | false | +| ifs.rb:33:38:33:44 | After else ... [true] | ifs.rb:33:21:33:44 | After elsif ... [true] | true | +| ifs.rb:33:38:33:44 | else ... | ifs.rb:33:43:33:44 | b5 | | +| ifs.rb:33:43:33:44 | After b5 [false] | ifs.rb:33:38:33:44 | After else ... [false] | false | +| ifs.rb:33:43:33:44 | After b5 [true] | ifs.rb:33:38:33:44 | After else ... [true] | true | +| ifs.rb:33:43:33:44 | b5 | ifs.rb:33:43:33:44 | After b5 [false] | false | +| ifs.rb:33:43:33:44 | b5 | ifs.rb:33:43:33:44 | After b5 [true] | true | +| ifs.rb:33:51:33:71 | After then ... | ifs.rb:33:3:33:100 | After if ... | | +| ifs.rb:33:51:33:71 | then ... | ifs.rb:33:56:33:71 | Before "b2 \|\| b4 \|\| b5" | | +| ifs.rb:33:56:33:71 | "b2 \|\| b4 \|\| b5" | ifs.rb:33:56:33:71 | After "b2 \|\| b4 \|\| b5" | | +| ifs.rb:33:56:33:71 | After "b2 \|\| b4 \|\| b5" | ifs.rb:33:51:33:71 | After then ... | | +| ifs.rb:33:56:33:71 | Before "b2 \|\| b4 \|\| b5" | ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | | | ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | ifs.rb:33:56:33:71 | "b2 \|\| b4 \|\| b5" | | -| ifs.rb:33:73:33:96 | else ... | ifs.rb:33:3:33:100 | if ... | | -| ifs.rb:33:78:33:96 | "!b2 \|\| !b4 \|\| !b5" | ifs.rb:33:73:33:96 | else ... | | +| ifs.rb:33:73:33:96 | After else ... | ifs.rb:33:3:33:100 | After if ... | | +| ifs.rb:33:73:33:96 | else ... | ifs.rb:33:78:33:96 | Before "!b2 \|\| !b4 \|\| !b5" | | +| ifs.rb:33:78:33:96 | "!b2 \|\| !b4 \|\| !b5" | ifs.rb:33:78:33:96 | After "!b2 \|\| !b4 \|\| !b5" | | +| ifs.rb:33:78:33:96 | After "!b2 \|\| !b4 \|\| !b5" | ifs.rb:33:73:33:96 | After else ... | | +| ifs.rb:33:78:33:96 | Before "!b2 \|\| !b4 \|\| !b5" | ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | | | ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | ifs.rb:33:78:33:96 | "!b2 \|\| !b4 \|\| !b5" | | -| ifs.rb:36:1:38:3 | conditional_method_def | ifs.rb:36:1:38:17 | ... unless ... | | -| ifs.rb:36:1:38:3 | enter conditional_method_def | ifs.rb:37:3:37:12 | self | | -| ifs.rb:36:1:38:3 | exit conditional_method_def (normal) | ifs.rb:36:1:38:3 | exit conditional_method_def | | -| ifs.rb:36:1:38:17 | ... unless ... | ifs.rb:40:1:44:3 | constant_condition | | -| ifs.rb:37:3:37:12 | call to puts | ifs.rb:36:1:38:3 | exit conditional_method_def (normal) | | -| ifs.rb:37:3:37:12 | self | ifs.rb:37:9:37:11 | bla | | -| ifs.rb:37:8:37:12 | "bla" | ifs.rb:37:3:37:12 | call to puts | | +| ifs.rb:36:1:38:3 | Entry | ifs.rb:37:3:37:12 | ... | | +| ifs.rb:36:1:38:3 | Normal Exit | ifs.rb:36:1:38:3 | Exit | | +| ifs.rb:36:1:38:3 | conditional_method_def | ifs.rb:36:1:38:17 | After ... unless ... | | +| ifs.rb:36:1:38:17 | ... unless ... | ifs.rb:38:12:38:17 | Before ... == ... | | +| ifs.rb:36:1:38:17 | After ... unless ... | ifs.rb:40:1:44:3 | constant_condition | | +| ifs.rb:37:3:37:12 | ... | ifs.rb:37:3:37:12 | Before call to puts | | +| ifs.rb:37:3:37:12 | After ... | ifs.rb:36:1:38:3 | Normal Exit | | +| ifs.rb:37:3:37:12 | After call to puts | ifs.rb:37:3:37:12 | After ... | | +| ifs.rb:37:3:37:12 | Before call to puts | ifs.rb:37:3:37:12 | self | | +| ifs.rb:37:3:37:12 | call to puts | ifs.rb:37:3:37:12 | After call to puts | | +| ifs.rb:37:3:37:12 | self | ifs.rb:37:8:37:12 | Before "bla" | | +| ifs.rb:37:8:37:12 | "bla" | ifs.rb:37:8:37:12 | After "bla" | | +| ifs.rb:37:8:37:12 | After "bla" | ifs.rb:37:3:37:12 | call to puts | | +| ifs.rb:37:8:37:12 | Before "bla" | ifs.rb:37:9:37:11 | bla | | | ifs.rb:37:9:37:11 | bla | ifs.rb:37:8:37:12 | "bla" | | | ifs.rb:38:12:38:12 | 1 | ifs.rb:38:17:38:17 | 2 | | -| ifs.rb:38:12:38:17 | ... == ... | ifs.rb:36:1:38:3 | conditional_method_def | false | -| ifs.rb:38:12:38:17 | ... == ... | ifs.rb:36:1:38:17 | ... unless ... | true | +| ifs.rb:38:12:38:17 | ... == ... | ifs.rb:38:12:38:17 | After ... == ... [false] | false | +| ifs.rb:38:12:38:17 | ... == ... | ifs.rb:38:12:38:17 | After ... == ... [true] | true | +| ifs.rb:38:12:38:17 | After ... == ... [false] | ifs.rb:36:1:38:3 | conditional_method_def | | +| ifs.rb:38:12:38:17 | After ... == ... [true] | ifs.rb:36:1:38:17 | After ... unless ... | | +| ifs.rb:38:12:38:17 | Before ... == ... | ifs.rb:38:12:38:12 | 1 | | | ifs.rb:38:17:38:17 | 2 | ifs.rb:38:12:38:17 | ... == ... | | +| ifs.rb:40:1:44:3 | Entry | ifs.rb:41:3:43:5 | ... | | +| ifs.rb:40:1:44:3 | Normal Exit | ifs.rb:40:1:44:3 | Exit | | | ifs.rb:40:1:44:3 | constant_condition | ifs.rb:46:1:52:3 | empty_else | | -| ifs.rb:40:1:44:3 | enter constant_condition | ifs.rb:41:7:41:10 | true | | -| ifs.rb:40:1:44:3 | exit constant_condition (normal) | ifs.rb:40:1:44:3 | exit constant_condition | | -| ifs.rb:41:3:43:5 | if ... | ifs.rb:40:1:44:3 | exit constant_condition (normal) | | -| ifs.rb:41:6:41:10 | [false] ! ... | ifs.rb:41:3:43:5 | if ... | false | -| ifs.rb:41:7:41:10 | true | ifs.rb:41:6:41:10 | [false] ! ... | true | +| ifs.rb:41:3:43:5 | ... | ifs.rb:41:3:43:5 | if ... | | +| ifs.rb:41:3:43:5 | After ... | ifs.rb:40:1:44:3 | Normal Exit | | +| ifs.rb:41:3:43:5 | After if ... | ifs.rb:41:3:43:5 | After ... | | +| ifs.rb:41:3:43:5 | if ... | ifs.rb:41:6:41:10 | ! ... | | +| ifs.rb:41:6:41:10 | ! ... | ifs.rb:41:7:41:10 | true | | +| ifs.rb:41:6:41:10 | After ! ... [false] | ifs.rb:41:3:43:5 | After if ... | | +| ifs.rb:41:7:41:10 | After true [true] | ifs.rb:41:6:41:10 | After ! ... [false] | false | +| ifs.rb:41:7:41:10 | true | ifs.rb:41:7:41:10 | After true [true] | true | +| ifs.rb:46:1:52:3 | Entry | ifs.rb:46:16:46:16 | b | | +| ifs.rb:46:1:52:3 | Normal Exit | ifs.rb:46:1:52:3 | Exit | | | ifs.rb:46:1:52:3 | empty_else | ifs.rb:54:1:58:3 | disjunct | | -| ifs.rb:46:1:52:3 | enter empty_else | ifs.rb:46:16:46:16 | b | | -| ifs.rb:46:1:52:3 | exit empty_else (normal) | ifs.rb:46:1:52:3 | exit empty_else | | -| ifs.rb:46:16:46:16 | b | ifs.rb:47:6:47:6 | b | | -| ifs.rb:47:3:50:5 | if ... | ifs.rb:51:3:51:13 | self | | -| ifs.rb:47:6:47:6 | b | ifs.rb:48:5:48:15 | self | true | -| ifs.rb:47:6:47:6 | b | ifs.rb:49:3:49:6 | else ... | false | -| ifs.rb:47:8:48:15 | then ... | ifs.rb:47:3:50:5 | if ... | | -| ifs.rb:48:5:48:15 | call to puts | ifs.rb:47:8:48:15 | then ... | | -| ifs.rb:48:5:48:15 | self | ifs.rb:48:11:48:14 | true | | -| ifs.rb:48:10:48:15 | "true" | ifs.rb:48:5:48:15 | call to puts | | +| ifs.rb:46:16:46:16 | b | ifs.rb:47:3:51:13 | ... | | +| ifs.rb:47:3:50:5 | After if ... | ifs.rb:51:3:51:13 | Before call to puts | | +| ifs.rb:47:3:50:5 | if ... | ifs.rb:47:6:47:6 | b | | +| ifs.rb:47:3:51:13 | ... | ifs.rb:47:3:50:5 | if ... | | +| ifs.rb:47:3:51:13 | After ... | ifs.rb:46:1:52:3 | Normal Exit | | +| ifs.rb:47:6:47:6 | After b [false] | ifs.rb:49:3:49:6 | else ... | | +| ifs.rb:47:6:47:6 | After b [true] | ifs.rb:47:8:48:15 | then ... | | +| ifs.rb:47:6:47:6 | b | ifs.rb:47:6:47:6 | After b [false] | false | +| ifs.rb:47:6:47:6 | b | ifs.rb:47:6:47:6 | After b [true] | true | +| ifs.rb:47:8:48:15 | After then ... | ifs.rb:47:3:50:5 | After if ... | | +| ifs.rb:47:8:48:15 | then ... | ifs.rb:48:5:48:15 | Before call to puts | | +| ifs.rb:48:5:48:15 | After call to puts | ifs.rb:47:8:48:15 | After then ... | | +| ifs.rb:48:5:48:15 | Before call to puts | ifs.rb:48:5:48:15 | self | | +| ifs.rb:48:5:48:15 | call to puts | ifs.rb:48:5:48:15 | After call to puts | | +| ifs.rb:48:5:48:15 | self | ifs.rb:48:10:48:15 | Before "true" | | +| ifs.rb:48:10:48:15 | "true" | ifs.rb:48:10:48:15 | After "true" | | +| ifs.rb:48:10:48:15 | After "true" | ifs.rb:48:5:48:15 | call to puts | | +| ifs.rb:48:10:48:15 | Before "true" | ifs.rb:48:11:48:14 | true | | | ifs.rb:48:11:48:14 | true | ifs.rb:48:10:48:15 | "true" | | -| ifs.rb:49:3:49:6 | else ... | ifs.rb:47:3:50:5 | if ... | | -| ifs.rb:51:3:51:13 | call to puts | ifs.rb:46:1:52:3 | exit empty_else (normal) | | -| ifs.rb:51:3:51:13 | self | ifs.rb:51:9:51:12 | done | | -| ifs.rb:51:8:51:13 | "done" | ifs.rb:51:3:51:13 | call to puts | | +| ifs.rb:49:3:49:6 | else ... | ifs.rb:47:3:50:5 | After if ... | | +| ifs.rb:51:3:51:13 | After call to puts | ifs.rb:47:3:51:13 | After ... | | +| ifs.rb:51:3:51:13 | Before call to puts | ifs.rb:51:3:51:13 | self | | +| ifs.rb:51:3:51:13 | call to puts | ifs.rb:51:3:51:13 | After call to puts | | +| ifs.rb:51:3:51:13 | self | ifs.rb:51:8:51:13 | Before "done" | | +| ifs.rb:51:8:51:13 | "done" | ifs.rb:51:8:51:13 | After "done" | | +| ifs.rb:51:8:51:13 | After "done" | ifs.rb:51:3:51:13 | call to puts | | +| ifs.rb:51:8:51:13 | Before "done" | ifs.rb:51:9:51:12 | done | | | ifs.rb:51:9:51:12 | done | ifs.rb:51:8:51:13 | "done" | | -| ifs.rb:54:1:58:3 | disjunct | ifs.rb:1:1:58:4 | exit ifs.rb (normal) | | -| ifs.rb:54:1:58:3 | enter disjunct | ifs.rb:54:15:54:16 | b1 | | -| ifs.rb:54:1:58:3 | exit disjunct (normal) | ifs.rb:54:1:58:3 | exit disjunct | | +| ifs.rb:54:1:58:3 | Entry | ifs.rb:54:15:54:16 | b1 | | +| ifs.rb:54:1:58:3 | Normal Exit | ifs.rb:54:1:58:3 | Exit | | +| ifs.rb:54:1:58:3 | disjunct | ifs.rb:1:1:58:4 | Normal Exit | | | ifs.rb:54:15:54:16 | b1 | ifs.rb:54:19:54:20 | b2 | | -| ifs.rb:54:19:54:20 | b2 | ifs.rb:55:7:55:8 | b1 | | -| ifs.rb:55:3:57:5 | if ... | ifs.rb:54:1:58:3 | exit disjunct (normal) | | -| ifs.rb:55:6:55:15 | [false] ( ... ) | ifs.rb:55:3:57:5 | if ... | false | -| ifs.rb:55:6:55:15 | [true] ( ... ) | ifs.rb:56:5:56:19 | self | true | -| ifs.rb:55:7:55:8 | b1 | ifs.rb:55:7:55:14 | [true] ... \|\| ... | true | -| ifs.rb:55:7:55:8 | b1 | ifs.rb:55:13:55:14 | b2 | false | -| ifs.rb:55:7:55:14 | [false] ... \|\| ... | ifs.rb:55:6:55:15 | [false] ( ... ) | false | -| ifs.rb:55:7:55:14 | [true] ... \|\| ... | ifs.rb:55:6:55:15 | [true] ( ... ) | true | -| ifs.rb:55:13:55:14 | b2 | ifs.rb:55:7:55:14 | [false] ... \|\| ... | false | -| ifs.rb:55:13:55:14 | b2 | ifs.rb:55:7:55:14 | [true] ... \|\| ... | true | -| ifs.rb:55:17:56:19 | then ... | ifs.rb:55:3:57:5 | if ... | | -| ifs.rb:56:5:56:19 | call to puts | ifs.rb:55:17:56:19 | then ... | | -| ifs.rb:56:5:56:19 | self | ifs.rb:56:11:56:18 | b1 or b2 | | -| ifs.rb:56:10:56:19 | "b1 or b2" | ifs.rb:56:5:56:19 | call to puts | | +| ifs.rb:54:19:54:20 | b2 | ifs.rb:55:3:57:5 | ... | | +| ifs.rb:55:3:57:5 | ... | ifs.rb:55:3:57:5 | if ... | | +| ifs.rb:55:3:57:5 | After ... | ifs.rb:54:1:58:3 | Normal Exit | | +| ifs.rb:55:3:57:5 | After if ... | ifs.rb:55:3:57:5 | After ... | | +| ifs.rb:55:3:57:5 | if ... | ifs.rb:55:6:55:15 | ( ... ) | | +| ifs.rb:55:6:55:15 | ( ... ) | ifs.rb:55:7:55:14 | ... \|\| ... | | +| ifs.rb:55:6:55:15 | After ( ... ) [false] | ifs.rb:55:3:57:5 | After if ... | | +| ifs.rb:55:6:55:15 | After ( ... ) [true] | ifs.rb:55:17:56:19 | then ... | | +| ifs.rb:55:7:55:8 | After b1 [false] | ifs.rb:55:13:55:14 | b2 | | +| ifs.rb:55:7:55:8 | After b1 [true] | ifs.rb:55:7:55:14 | After ... \|\| ... [true] | true | +| ifs.rb:55:7:55:8 | b1 | ifs.rb:55:7:55:8 | After b1 [false] | false | +| ifs.rb:55:7:55:8 | b1 | ifs.rb:55:7:55:8 | After b1 [true] | true | +| ifs.rb:55:7:55:14 | ... \|\| ... | ifs.rb:55:7:55:8 | b1 | | +| ifs.rb:55:7:55:14 | After ... \|\| ... [false] | ifs.rb:55:6:55:15 | After ( ... ) [false] | false | +| ifs.rb:55:7:55:14 | After ... \|\| ... [true] | ifs.rb:55:6:55:15 | After ( ... ) [true] | true | +| ifs.rb:55:13:55:14 | After b2 [false] | ifs.rb:55:7:55:14 | After ... \|\| ... [false] | false | +| ifs.rb:55:13:55:14 | After b2 [true] | ifs.rb:55:7:55:14 | After ... \|\| ... [true] | true | +| ifs.rb:55:13:55:14 | b2 | ifs.rb:55:13:55:14 | After b2 [false] | false | +| ifs.rb:55:13:55:14 | b2 | ifs.rb:55:13:55:14 | After b2 [true] | true | +| ifs.rb:55:17:56:19 | After then ... | ifs.rb:55:3:57:5 | After if ... | | +| ifs.rb:55:17:56:19 | then ... | ifs.rb:56:5:56:19 | Before call to puts | | +| ifs.rb:56:5:56:19 | After call to puts | ifs.rb:55:17:56:19 | After then ... | | +| ifs.rb:56:5:56:19 | Before call to puts | ifs.rb:56:5:56:19 | self | | +| ifs.rb:56:5:56:19 | call to puts | ifs.rb:56:5:56:19 | After call to puts | | +| ifs.rb:56:5:56:19 | self | ifs.rb:56:10:56:19 | Before "b1 or b2" | | +| ifs.rb:56:10:56:19 | "b1 or b2" | ifs.rb:56:10:56:19 | After "b1 or b2" | | +| ifs.rb:56:10:56:19 | After "b1 or b2" | ifs.rb:56:5:56:19 | call to puts | | +| ifs.rb:56:10:56:19 | Before "b1 or b2" | ifs.rb:56:11:56:18 | b1 or b2 | | | ifs.rb:56:11:56:18 | b1 or b2 | ifs.rb:56:10:56:19 | "b1 or b2" | | -| loops.rb:1:1:6:3 | enter m1 | loops.rb:1:8:1:8 | x | | -| loops.rb:1:1:6:3 | exit m1 (normal) | loops.rb:1:1:6:3 | exit m1 | | +| loops.rb:1:1:6:3 | Entry | loops.rb:1:8:1:8 | x | | +| loops.rb:1:1:6:3 | Normal Exit | loops.rb:1:1:6:3 | Exit | | | loops.rb:1:1:6:3 | m1 | loops.rb:8:1:22:3 | m2 | | -| loops.rb:1:1:33:4 | enter loops.rb | loops.rb:1:1:6:3 | m1 | | -| loops.rb:1:1:33:4 | exit loops.rb (normal) | loops.rb:1:1:33:4 | exit loops.rb | | -| loops.rb:1:8:1:8 | x | loops.rb:2:9:2:9 | x | | -| loops.rb:2:3:5:5 | while ... | loops.rb:1:1:6:3 | exit m1 (normal) | | +| loops.rb:1:1:33:4 | Entry | loops.rb:1:1:6:3 | m1 | | +| loops.rb:1:1:33:4 | Normal Exit | loops.rb:1:1:33:4 | Exit | | +| loops.rb:1:8:1:8 | x | loops.rb:2:3:5:5 | ... | | +| loops.rb:2:3:5:5 | ... | loops.rb:2:3:5:5 | while ... | | +| loops.rb:2:3:5:5 | After ... | loops.rb:1:1:6:3 | Normal Exit | | +| loops.rb:2:3:5:5 | After while ... | loops.rb:2:3:5:5 | After ... | | +| loops.rb:2:3:5:5 | [LoopHeader] while ... | loops.rb:2:9:2:14 | Before ... >= ... | | +| loops.rb:2:3:5:5 | while ... | loops.rb:2:3:5:5 | [LoopHeader] while ... | | | loops.rb:2:9:2:9 | x | loops.rb:2:14:2:14 | 0 | | -| loops.rb:2:9:2:14 | ... >= ... | loops.rb:2:3:5:5 | while ... | false | -| loops.rb:2:9:2:14 | ... >= ... | loops.rb:3:5:3:10 | self | true | +| loops.rb:2:9:2:14 | ... >= ... | loops.rb:2:9:2:14 | After ... >= ... [false] | false | +| loops.rb:2:9:2:14 | ... >= ... | loops.rb:2:9:2:14 | After ... >= ... [true] | true | +| loops.rb:2:9:2:14 | After ... >= ... [false] | loops.rb:2:3:5:5 | After while ... | | +| loops.rb:2:9:2:14 | After ... >= ... [true] | loops.rb:2:15:5:5 | do ... | | +| loops.rb:2:9:2:14 | Before ... >= ... | loops.rb:2:9:2:9 | x | | | loops.rb:2:14:2:14 | 0 | loops.rb:2:9:2:14 | ... >= ... | | -| loops.rb:2:15:5:5 | do ... | loops.rb:2:9:2:9 | x | | -| loops.rb:3:5:3:10 | call to puts | loops.rb:4:5:4:5 | x | | +| loops.rb:2:15:5:5 | After do ... | loops.rb:2:3:5:5 | [LoopHeader] while ... | | +| loops.rb:2:15:5:5 | do ... | loops.rb:3:5:3:10 | Before call to puts | | +| loops.rb:3:5:3:10 | After call to puts | loops.rb:4:5:4:10 | Before ... = ... | | +| loops.rb:3:5:3:10 | Before call to puts | loops.rb:3:5:3:10 | self | | +| loops.rb:3:5:3:10 | call to puts | loops.rb:3:5:3:10 | After call to puts | | | loops.rb:3:5:3:10 | self | loops.rb:3:10:3:10 | x | | | loops.rb:3:10:3:10 | x | loops.rb:3:5:3:10 | call to puts | | -| loops.rb:4:5:4:5 | x | loops.rb:4:5:4:5 | x | | +| loops.rb:4:5:4:5 | x | loops.rb:4:7:4:8 | Before ... - ... | | | loops.rb:4:5:4:5 | x | loops.rb:4:10:4:10 | 1 | | -| loops.rb:4:5:4:10 | ... = ... | loops.rb:2:15:5:5 | do ... | | -| loops.rb:4:7:4:8 | ... - ... | loops.rb:4:5:4:10 | ... = ... | | +| loops.rb:4:5:4:10 | ... = ... | loops.rb:4:5:4:10 | After ... = ... | | +| loops.rb:4:5:4:10 | After ... = ... | loops.rb:2:15:5:5 | After do ... | | +| loops.rb:4:5:4:10 | Before ... = ... | loops.rb:4:5:4:5 | x | | +| loops.rb:4:7:4:8 | ... - ... | loops.rb:4:7:4:8 | After ... - ... | | +| loops.rb:4:7:4:8 | After ... - ... | loops.rb:4:5:4:10 | ... = ... | | +| loops.rb:4:7:4:8 | Before ... - ... | loops.rb:4:5:4:5 | x | | | loops.rb:4:10:4:10 | 1 | loops.rb:4:7:4:8 | ... - ... | | -| loops.rb:8:1:22:3 | enter m2 | loops.rb:8:8:8:8 | x | | -| loops.rb:8:1:22:3 | exit m2 (normal) | loops.rb:8:1:22:3 | exit m2 | | +| loops.rb:8:1:22:3 | Entry | loops.rb:8:8:8:8 | x | | +| loops.rb:8:1:22:3 | Normal Exit | loops.rb:8:1:22:3 | Exit | | | loops.rb:8:1:22:3 | m2 | loops.rb:24:1:28:3 | m3 | | -| loops.rb:8:8:8:8 | x | loops.rb:9:9:9:9 | x | | -| loops.rb:9:3:20:5 | while ... | loops.rb:21:3:21:13 | self | | +| loops.rb:8:8:8:8 | x | loops.rb:9:3:21:13 | ... | | +| loops.rb:9:3:20:5 | After while ... | loops.rb:21:3:21:13 | Before call to puts | | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:9:9:9:14 | Before ... >= ... | | +| loops.rb:9:3:20:5 | while ... | loops.rb:9:3:20:5 | [LoopHeader] while ... | | +| loops.rb:9:3:21:13 | ... | loops.rb:9:3:20:5 | while ... | | +| loops.rb:9:3:21:13 | After ... | loops.rb:8:1:22:3 | Normal Exit | | | loops.rb:9:9:9:9 | x | loops.rb:9:14:9:14 | 0 | | -| loops.rb:9:9:9:14 | ... >= ... | loops.rb:9:3:20:5 | while ... | false | -| loops.rb:9:9:9:14 | ... >= ... | loops.rb:10:5:10:10 | self | true | +| loops.rb:9:9:9:14 | ... >= ... | loops.rb:9:9:9:14 | After ... >= ... [false] | false | +| loops.rb:9:9:9:14 | ... >= ... | loops.rb:9:9:9:14 | After ... >= ... [true] | true | +| loops.rb:9:9:9:14 | After ... >= ... [false] | loops.rb:9:3:20:5 | After while ... | | +| loops.rb:9:9:9:14 | After ... >= ... [true] | loops.rb:9:15:20:5 | do ... | | +| loops.rb:9:9:9:14 | Before ... >= ... | loops.rb:9:9:9:9 | x | | | loops.rb:9:14:9:14 | 0 | loops.rb:9:9:9:14 | ... >= ... | | -| loops.rb:9:15:20:5 | do ... | loops.rb:9:9:9:9 | x | | -| loops.rb:10:5:10:10 | call to puts | loops.rb:11:5:11:5 | x | | +| loops.rb:9:15:20:5 | After do ... | loops.rb:9:3:20:5 | [LoopHeader] while ... | | +| loops.rb:9:15:20:5 | do ... | loops.rb:10:5:10:10 | Before call to puts | | +| loops.rb:10:5:10:10 | After call to puts | loops.rb:11:5:11:10 | Before ... = ... | | +| loops.rb:10:5:10:10 | Before call to puts | loops.rb:10:5:10:10 | self | | +| loops.rb:10:5:10:10 | call to puts | loops.rb:10:5:10:10 | After call to puts | | | loops.rb:10:5:10:10 | self | loops.rb:10:10:10:10 | x | | | loops.rb:10:10:10:10 | x | loops.rb:10:5:10:10 | call to puts | | -| loops.rb:11:5:11:5 | x | loops.rb:11:5:11:5 | x | | +| loops.rb:11:5:11:5 | x | loops.rb:11:7:11:8 | Before ... - ... | | | loops.rb:11:5:11:5 | x | loops.rb:11:10:11:10 | 1 | | -| loops.rb:11:5:11:10 | ... = ... | loops.rb:12:8:12:8 | x | | -| loops.rb:11:7:11:8 | ... - ... | loops.rb:11:5:11:10 | ... = ... | | +| loops.rb:11:5:11:10 | ... = ... | loops.rb:11:5:11:10 | After ... = ... | | +| loops.rb:11:5:11:10 | After ... = ... | loops.rb:12:5:18:7 | if ... | | +| loops.rb:11:5:11:10 | Before ... = ... | loops.rb:11:5:11:5 | x | | +| loops.rb:11:7:11:8 | ... - ... | loops.rb:11:7:11:8 | After ... - ... | | +| loops.rb:11:7:11:8 | After ... - ... | loops.rb:11:5:11:10 | ... = ... | | +| loops.rb:11:7:11:8 | Before ... - ... | loops.rb:11:5:11:5 | x | | | loops.rb:11:10:11:10 | 1 | loops.rb:11:7:11:8 | ... - ... | | -| loops.rb:12:5:18:7 | if ... | loops.rb:19:5:19:15 | self | | +| loops.rb:12:5:18:7 | After if ... | loops.rb:19:5:19:15 | Before call to puts | | +| loops.rb:12:5:18:7 | if ... | loops.rb:12:8:12:14 | Before ... > ... | | | loops.rb:12:8:12:8 | x | loops.rb:12:12:12:14 | 100 | | -| loops.rb:12:8:12:14 | ... > ... | loops.rb:13:7:13:11 | break | true | -| loops.rb:12:8:12:14 | ... > ... | loops.rb:14:11:14:11 | x | false | +| loops.rb:12:8:12:14 | ... > ... | loops.rb:12:8:12:14 | After ... > ... [false] | false | +| loops.rb:12:8:12:14 | ... > ... | loops.rb:12:8:12:14 | After ... > ... [true] | true | +| loops.rb:12:8:12:14 | After ... > ... [false] | loops.rb:14:5:17:10 | elsif ... | | +| loops.rb:12:8:12:14 | After ... > ... [true] | loops.rb:12:15:13:11 | then ... | | +| loops.rb:12:8:12:14 | Before ... > ... | loops.rb:12:8:12:8 | x | | | loops.rb:12:12:12:14 | 100 | loops.rb:12:8:12:14 | ... > ... | | -| loops.rb:13:7:13:11 | break | loops.rb:9:3:20:5 | while ... | break | -| loops.rb:14:5:17:10 | elsif ... | loops.rb:12:5:18:7 | if ... | | +| loops.rb:12:15:13:11 | then ... | loops.rb:13:7:13:11 | Before break | | +| loops.rb:13:7:13:11 | Before break | loops.rb:13:7:13:11 | break | | +| loops.rb:13:7:13:11 | break | loops.rb:9:3:20:5 | After while ... | break | +| loops.rb:14:5:17:10 | After elsif ... | loops.rb:12:5:18:7 | After if ... | | +| loops.rb:14:5:17:10 | elsif ... | loops.rb:14:11:14:16 | Before ... > ... | | | loops.rb:14:11:14:11 | x | loops.rb:14:15:14:16 | 50 | | -| loops.rb:14:11:14:16 | ... > ... | loops.rb:15:7:15:10 | next | true | -| loops.rb:14:11:14:16 | ... > ... | loops.rb:16:11:16:11 | x | false | +| loops.rb:14:11:14:16 | ... > ... | loops.rb:14:11:14:16 | After ... > ... [false] | false | +| loops.rb:14:11:14:16 | ... > ... | loops.rb:14:11:14:16 | After ... > ... [true] | true | +| loops.rb:14:11:14:16 | After ... > ... [false] | loops.rb:16:5:17:10 | elsif ... | | +| loops.rb:14:11:14:16 | After ... > ... [true] | loops.rb:14:17:15:10 | then ... | | +| loops.rb:14:11:14:16 | Before ... > ... | loops.rb:14:11:14:11 | x | | | loops.rb:14:15:14:16 | 50 | loops.rb:14:11:14:16 | ... > ... | | -| loops.rb:15:7:15:10 | next | loops.rb:9:9:9:9 | x | continue | -| loops.rb:16:5:17:10 | elsif ... | loops.rb:14:5:17:10 | elsif ... | | +| loops.rb:14:17:15:10 | then ... | loops.rb:15:7:15:10 | Before next | | +| loops.rb:15:7:15:10 | Before next | loops.rb:15:7:15:10 | next | | +| loops.rb:15:7:15:10 | next | loops.rb:9:3:20:5 | [LoopHeader] while ... | continue | +| loops.rb:16:5:17:10 | After elsif ... | loops.rb:14:5:17:10 | After elsif ... | | +| loops.rb:16:5:17:10 | elsif ... | loops.rb:16:11:16:16 | Before ... > ... | | | loops.rb:16:11:16:11 | x | loops.rb:16:15:16:16 | 10 | | -| loops.rb:16:11:16:16 | ... > ... | loops.rb:16:5:17:10 | elsif ... | false | -| loops.rb:16:11:16:16 | ... > ... | loops.rb:17:7:17:10 | redo | true | +| loops.rb:16:11:16:16 | ... > ... | loops.rb:16:11:16:16 | After ... > ... [false] | false | +| loops.rb:16:11:16:16 | ... > ... | loops.rb:16:11:16:16 | After ... > ... [true] | true | +| loops.rb:16:11:16:16 | After ... > ... [false] | loops.rb:16:5:17:10 | After elsif ... | | +| loops.rb:16:11:16:16 | After ... > ... [true] | loops.rb:16:17:17:10 | then ... | | +| loops.rb:16:11:16:16 | Before ... > ... | loops.rb:16:11:16:11 | x | | | loops.rb:16:15:16:16 | 10 | loops.rb:16:11:16:16 | ... > ... | | -| loops.rb:17:7:17:10 | redo | loops.rb:10:5:10:10 | self | redo | -| loops.rb:19:5:19:15 | call to puts | loops.rb:9:15:20:5 | do ... | | -| loops.rb:19:5:19:15 | self | loops.rb:19:11:19:14 | Iter | | -| loops.rb:19:10:19:15 | "Iter" | loops.rb:19:5:19:15 | call to puts | | +| loops.rb:16:17:17:10 | then ... | loops.rb:17:7:17:10 | Before redo | | +| loops.rb:17:7:17:10 | Before redo | loops.rb:17:7:17:10 | redo | | +| loops.rb:17:7:17:10 | redo | loops.rb:9:15:20:5 | do ... | redo | +| loops.rb:19:5:19:15 | After call to puts | loops.rb:9:15:20:5 | After do ... | | +| loops.rb:19:5:19:15 | Before call to puts | loops.rb:19:5:19:15 | self | | +| loops.rb:19:5:19:15 | call to puts | loops.rb:19:5:19:15 | After call to puts | | +| loops.rb:19:5:19:15 | self | loops.rb:19:10:19:15 | Before "Iter" | | +| loops.rb:19:10:19:15 | "Iter" | loops.rb:19:10:19:15 | After "Iter" | | +| loops.rb:19:10:19:15 | After "Iter" | loops.rb:19:5:19:15 | call to puts | | +| loops.rb:19:10:19:15 | Before "Iter" | loops.rb:19:11:19:14 | Iter | | | loops.rb:19:11:19:14 | Iter | loops.rb:19:10:19:15 | "Iter" | | -| loops.rb:21:3:21:13 | call to puts | loops.rb:8:1:22:3 | exit m2 (normal) | | -| loops.rb:21:3:21:13 | self | loops.rb:21:9:21:12 | Done | | -| loops.rb:21:8:21:13 | "Done" | loops.rb:21:3:21:13 | call to puts | | +| loops.rb:21:3:21:13 | After call to puts | loops.rb:9:3:21:13 | After ... | | +| loops.rb:21:3:21:13 | Before call to puts | loops.rb:21:3:21:13 | self | | +| loops.rb:21:3:21:13 | call to puts | loops.rb:21:3:21:13 | After call to puts | | +| loops.rb:21:3:21:13 | self | loops.rb:21:8:21:13 | Before "Done" | | +| loops.rb:21:8:21:13 | "Done" | loops.rb:21:8:21:13 | After "Done" | | +| loops.rb:21:8:21:13 | After "Done" | loops.rb:21:3:21:13 | call to puts | | +| loops.rb:21:8:21:13 | Before "Done" | loops.rb:21:9:21:12 | Done | | | loops.rb:21:9:21:12 | Done | loops.rb:21:8:21:13 | "Done" | | -| loops.rb:24:1:28:3 | enter m3 | loops.rb:25:3:25:9 | Array | | -| loops.rb:24:1:28:3 | exit m3 (normal) | loops.rb:24:1:28:3 | exit m3 | | +| loops.rb:24:1:28:3 | Entry | loops.rb:25:3:27:5 | ... | | +| loops.rb:24:1:28:3 | Normal Exit | loops.rb:24:1:28:3 | Exit | | | loops.rb:24:1:28:3 | m3 | loops.rb:30:1:33:3 | m4 | | +| loops.rb:25:3:25:9 | After call to [] | loops.rb:25:16:27:5 | do ... end | | | loops.rb:25:3:25:9 | Array | loops.rb:25:4:25:4 | 1 | | -| loops.rb:25:3:25:9 | call to [] | loops.rb:25:16:27:5 | do ... end | | -| loops.rb:25:3:27:5 | call to each | loops.rb:24:1:28:3 | exit m3 (normal) | | +| loops.rb:25:3:25:9 | Before call to [] | loops.rb:25:3:25:9 | Array | | +| loops.rb:25:3:25:9 | call to [] | loops.rb:25:3:25:9 | After call to [] | | +| loops.rb:25:3:27:5 | ... | loops.rb:25:3:27:5 | Before call to each | | +| loops.rb:25:3:27:5 | After ... | loops.rb:24:1:28:3 | Normal Exit | | +| loops.rb:25:3:27:5 | After call to each | loops.rb:25:3:27:5 | After ... | | +| loops.rb:25:3:27:5 | Before call to each | loops.rb:25:3:25:9 | Before call to [] | | +| loops.rb:25:3:27:5 | call to each | loops.rb:25:3:27:5 | After call to each | | | loops.rb:25:4:25:4 | 1 | loops.rb:25:6:25:6 | 2 | | | loops.rb:25:6:25:6 | 2 | loops.rb:25:8:25:8 | 3 | | | loops.rb:25:8:25:8 | 3 | loops.rb:25:3:25:9 | call to [] | | +| loops.rb:25:16:27:5 | Entry | loops.rb:25:20:25:20 | x | | +| loops.rb:25:16:27:5 | Normal Exit | loops.rb:25:16:27:5 | Exit | | | loops.rb:25:16:27:5 | do ... end | loops.rb:25:3:27:5 | call to each | | -| loops.rb:25:16:27:5 | enter do ... end | loops.rb:25:20:25:20 | x | | -| loops.rb:25:16:27:5 | exit do ... end (normal) | loops.rb:25:16:27:5 | exit do ... end | | -| loops.rb:25:20:25:20 | x | loops.rb:26:5:26:10 | self | | -| loops.rb:26:5:26:10 | call to puts | loops.rb:25:16:27:5 | exit do ... end (normal) | | +| loops.rb:25:20:25:20 | x | loops.rb:26:5:26:10 | ... | | +| loops.rb:26:5:26:10 | ... | loops.rb:26:5:26:10 | Before call to puts | | +| loops.rb:26:5:26:10 | After ... | loops.rb:25:16:27:5 | Normal Exit | | +| loops.rb:26:5:26:10 | After call to puts | loops.rb:26:5:26:10 | After ... | | +| loops.rb:26:5:26:10 | Before call to puts | loops.rb:26:5:26:10 | self | | +| loops.rb:26:5:26:10 | call to puts | loops.rb:26:5:26:10 | After call to puts | | | loops.rb:26:5:26:10 | self | loops.rb:26:10:26:10 | x | | | loops.rb:26:10:26:10 | x | loops.rb:26:5:26:10 | call to puts | | -| loops.rb:30:1:33:3 | enter m4 | loops.rb:30:8:30:8 | x | | -| loops.rb:30:1:33:3 | exit m4 (normal) | loops.rb:30:1:33:3 | exit m4 | | -| loops.rb:30:1:33:3 | m4 | loops.rb:1:1:33:4 | exit loops.rb (normal) | | +| loops.rb:30:1:33:3 | Entry | loops.rb:30:8:30:8 | x | | +| loops.rb:30:1:33:3 | Normal Exit | loops.rb:30:1:33:3 | Exit | | +| loops.rb:30:1:33:3 | m4 | loops.rb:1:1:33:4 | Normal Exit | | | loops.rb:30:8:30:8 | x | loops.rb:30:11:30:11 | y | | -| loops.rb:30:11:30:11 | y | loops.rb:31:9:31:9 | x | | -| loops.rb:31:3:32:5 | while ... | loops.rb:30:1:33:3 | exit m4 (normal) | | +| loops.rb:30:11:30:11 | y | loops.rb:31:3:32:5 | ... | | +| loops.rb:31:3:32:5 | ... | loops.rb:31:3:32:5 | while ... | | +| loops.rb:31:3:32:5 | After ... | loops.rb:30:1:33:3 | Normal Exit | | +| loops.rb:31:3:32:5 | After while ... | loops.rb:31:3:32:5 | After ... | | +| loops.rb:31:3:32:5 | [LoopHeader] while ... | loops.rb:31:9:31:13 | Before ... < ... | | +| loops.rb:31:3:32:5 | while ... | loops.rb:31:3:32:5 | [LoopHeader] while ... | | | loops.rb:31:9:31:9 | x | loops.rb:31:13:31:13 | y | | -| loops.rb:31:9:31:13 | ... < ... | loops.rb:31:3:32:5 | while ... | false | -| loops.rb:31:9:31:13 | ... < ... | loops.rb:31:15:32:5 | do ... | true | +| loops.rb:31:9:31:13 | ... < ... | loops.rb:31:9:31:13 | After ... < ... [false] | false | +| loops.rb:31:9:31:13 | ... < ... | loops.rb:31:9:31:13 | After ... < ... [true] | true | +| loops.rb:31:9:31:13 | After ... < ... [false] | loops.rb:31:3:32:5 | After while ... | | +| loops.rb:31:9:31:13 | After ... < ... [true] | loops.rb:31:15:32:5 | do ... | | +| loops.rb:31:9:31:13 | Before ... < ... | loops.rb:31:9:31:9 | x | | | loops.rb:31:13:31:13 | y | loops.rb:31:9:31:13 | ... < ... | | -| loops.rb:31:15:32:5 | do ... | loops.rb:31:9:31:9 | x | | +| loops.rb:31:15:32:5 | do ... | loops.rb:31:3:32:5 | [LoopHeader] while ... | | +| raise.rb:1:1:2:3 | After ExceptionA | raise.rb:4:1:5:3 | ExceptionB | | | raise.rb:1:1:2:3 | ExceptionA | raise.rb:1:20:1:28 | Exception | | -| raise.rb:1:1:182:4 | enter raise.rb | raise.rb:1:1:2:3 | ExceptionA | | -| raise.rb:1:1:182:4 | exit raise.rb (normal) | raise.rb:1:1:182:4 | exit raise.rb | | -| raise.rb:1:20:1:28 | Exception | raise.rb:4:1:5:3 | ExceptionB | | +| raise.rb:1:1:182:4 | Entry | raise.rb:1:1:2:3 | ExceptionA | | +| raise.rb:1:1:182:4 | Normal Exit | raise.rb:1:1:182:4 | Exit | | +| raise.rb:1:20:1:28 | Exception | raise.rb:1:1:2:3 | After ExceptionA | | +| raise.rb:4:1:5:3 | After ExceptionB | raise.rb:7:1:12:3 | m1 | | | raise.rb:4:1:5:3 | ExceptionB | raise.rb:4:20:4:28 | Exception | | -| raise.rb:4:20:4:28 | Exception | raise.rb:7:1:12:3 | m1 | | -| raise.rb:7:1:12:3 | enter m1 | raise.rb:7:8:7:8 | x | | -| raise.rb:7:1:12:3 | exit m1 (abnormal) | raise.rb:7:1:12:3 | exit m1 | | -| raise.rb:7:1:12:3 | exit m1 (normal) | raise.rb:7:1:12:3 | exit m1 | | +| raise.rb:4:20:4:28 | Exception | raise.rb:4:1:5:3 | After ExceptionB | | +| raise.rb:7:1:12:3 | Entry | raise.rb:7:8:7:8 | x | | +| raise.rb:7:1:12:3 | Exceptional Exit | raise.rb:7:1:12:3 | Exit | | +| raise.rb:7:1:12:3 | Normal Exit | raise.rb:7:1:12:3 | Exit | | | raise.rb:7:1:12:3 | m1 | raise.rb:14:1:23:3 | m2 | | -| raise.rb:7:8:7:8 | x | raise.rb:8:6:8:6 | x | | -| raise.rb:8:3:10:5 | if ... | raise.rb:11:3:11:15 | self | | +| raise.rb:7:8:7:8 | x | raise.rb:8:3:11:15 | ... | | +| raise.rb:8:3:10:5 | After if ... | raise.rb:11:3:11:15 | Before call to puts | | +| raise.rb:8:3:10:5 | if ... | raise.rb:8:6:8:10 | Before ... > ... | | +| raise.rb:8:3:11:15 | ... | raise.rb:8:3:10:5 | if ... | | +| raise.rb:8:3:11:15 | After ... | raise.rb:7:1:12:3 | Normal Exit | | | raise.rb:8:6:8:6 | x | raise.rb:8:10:8:10 | 2 | | -| raise.rb:8:6:8:10 | ... > ... | raise.rb:8:3:10:5 | if ... | false | -| raise.rb:8:6:8:10 | ... > ... | raise.rb:9:5:9:17 | self | true | +| raise.rb:8:6:8:10 | ... > ... | raise.rb:8:6:8:10 | After ... > ... [false] | false | +| raise.rb:8:6:8:10 | ... > ... | raise.rb:8:6:8:10 | After ... > ... [true] | true | +| raise.rb:8:6:8:10 | After ... > ... [false] | raise.rb:8:3:10:5 | After if ... | | +| raise.rb:8:6:8:10 | After ... > ... [true] | raise.rb:8:11:9:17 | then ... | | +| raise.rb:8:6:8:10 | Before ... > ... | raise.rb:8:6:8:6 | x | | | raise.rb:8:10:8:10 | 2 | raise.rb:8:6:8:10 | ... > ... | | -| raise.rb:9:5:9:17 | call to raise | raise.rb:7:1:12:3 | exit m1 (abnormal) | exception | -| raise.rb:9:5:9:17 | self | raise.rb:9:12:9:16 | x > 2 | | -| raise.rb:9:11:9:17 | "x > 2" | raise.rb:9:5:9:17 | call to raise | | +| raise.rb:8:11:9:17 | then ... | raise.rb:9:5:9:17 | Before call to raise | | +| raise.rb:9:5:9:17 | Before call to raise | raise.rb:9:5:9:17 | self | | +| raise.rb:9:5:9:17 | call to raise | raise.rb:7:1:12:3 | Exceptional Exit | exception | +| raise.rb:9:5:9:17 | self | raise.rb:9:11:9:17 | Before "x > 2" | | +| raise.rb:9:11:9:17 | "x > 2" | raise.rb:9:11:9:17 | After "x > 2" | | +| raise.rb:9:11:9:17 | After "x > 2" | raise.rb:9:5:9:17 | call to raise | | +| raise.rb:9:11:9:17 | Before "x > 2" | raise.rb:9:12:9:16 | x > 2 | | | raise.rb:9:12:9:16 | x > 2 | raise.rb:9:11:9:17 | "x > 2" | | -| raise.rb:11:3:11:15 | call to puts | raise.rb:7:1:12:3 | exit m1 (normal) | | -| raise.rb:11:3:11:15 | self | raise.rb:11:9:11:14 | x <= 2 | | -| raise.rb:11:8:11:15 | "x <= 2" | raise.rb:11:3:11:15 | call to puts | | +| raise.rb:11:3:11:15 | After call to puts | raise.rb:8:3:11:15 | After ... | | +| raise.rb:11:3:11:15 | Before call to puts | raise.rb:11:3:11:15 | self | | +| raise.rb:11:3:11:15 | call to puts | raise.rb:11:3:11:15 | After call to puts | | +| raise.rb:11:3:11:15 | self | raise.rb:11:8:11:15 | Before "x <= 2" | | +| raise.rb:11:8:11:15 | "x <= 2" | raise.rb:11:8:11:15 | After "x <= 2" | | +| raise.rb:11:8:11:15 | After "x <= 2" | raise.rb:11:3:11:15 | call to puts | | +| raise.rb:11:8:11:15 | Before "x <= 2" | raise.rb:11:9:11:14 | x <= 2 | | | raise.rb:11:9:11:14 | x <= 2 | raise.rb:11:8:11:15 | "x <= 2" | | -| raise.rb:14:1:23:3 | enter m2 | raise.rb:14:8:14:8 | b | | -| raise.rb:14:1:23:3 | exit m2 (abnormal) | raise.rb:14:1:23:3 | exit m2 | | -| raise.rb:14:1:23:3 | exit m2 (normal) | raise.rb:14:1:23:3 | exit m2 | | +| raise.rb:14:1:23:3 | Entry | raise.rb:14:8:14:8 | b | | +| raise.rb:14:1:23:3 | Exceptional Exit | raise.rb:14:1:23:3 | Exit | | +| raise.rb:14:1:23:3 | Normal Exit | raise.rb:14:1:23:3 | Exit | | | raise.rb:14:1:23:3 | m2 | raise.rb:25:1:34:3 | m3 | | -| raise.rb:14:8:14:8 | b | raise.rb:16:8:16:8 | b | | -| raise.rb:16:5:18:7 | if ... | raise.rb:22:3:22:15 | self | | -| raise.rb:16:8:16:8 | b | raise.rb:16:5:18:7 | if ... | false | -| raise.rb:16:8:16:8 | b | raise.rb:17:7:17:22 | self | true | -| raise.rb:17:7:17:22 | call to raise | raise.rb:19:10:19:19 | ExceptionA | exception | +| raise.rb:14:8:14:8 | b | raise.rb:15:3:22:15 | ... | | +| raise.rb:15:3:21:5 | After begin ... | raise.rb:22:3:22:15 | Before call to puts | | +| raise.rb:15:3:21:5 | begin ... | raise.rb:16:5:18:7 | if ... | | +| raise.rb:15:3:22:15 | ... | raise.rb:15:3:21:5 | begin ... | | +| raise.rb:15:3:22:15 | After ... | raise.rb:14:1:23:3 | Normal Exit | | +| raise.rb:16:5:18:7 | After if ... | raise.rb:15:3:21:5 | After begin ... | | +| raise.rb:16:5:18:7 | if ... | raise.rb:16:8:16:8 | b | | +| raise.rb:16:8:16:8 | After b [false] | raise.rb:16:5:18:7 | After if ... | | +| raise.rb:16:8:16:8 | After b [true] | raise.rb:16:9:17:22 | then ... | | +| raise.rb:16:8:16:8 | b | raise.rb:16:8:16:8 | After b [false] | false | +| raise.rb:16:8:16:8 | b | raise.rb:16:8:16:8 | After b [true] | true | +| raise.rb:16:9:17:22 | then ... | raise.rb:17:7:17:22 | Before call to raise | | +| raise.rb:17:7:17:22 | Before call to raise | raise.rb:17:7:17:22 | self | | +| raise.rb:17:7:17:22 | call to raise | raise.rb:19:3:20:18 | rescue ... | exception | | raise.rb:17:7:17:22 | self | raise.rb:17:13:17:22 | ExceptionA | | | raise.rb:17:13:17:22 | ExceptionA | raise.rb:17:7:17:22 | call to raise | | -| raise.rb:19:3:20:18 | rescue ... | raise.rb:22:3:22:15 | self | | -| raise.rb:19:10:19:19 | ExceptionA | raise.rb:14:1:23:3 | exit m2 (abnormal) | exception | -| raise.rb:19:10:19:19 | ExceptionA | raise.rb:20:5:20:18 | self | match | -| raise.rb:19:20:20:18 | then ... | raise.rb:19:3:20:18 | rescue ... | | -| raise.rb:20:5:20:18 | call to puts | raise.rb:19:20:20:18 | then ... | | -| raise.rb:20:5:20:18 | self | raise.rb:20:11:20:17 | Rescued | | -| raise.rb:20:10:20:18 | "Rescued" | raise.rb:20:5:20:18 | call to puts | | +| raise.rb:19:3:20:18 | After rescue ... [no-match] | raise.rb:14:1:23:3 | Exceptional Exit | exception | +| raise.rb:19:3:20:18 | rescue ... | raise.rb:19:10:19:19 | ExceptionA | | +| raise.rb:19:10:19:19 | After ExceptionA [match] | raise.rb:19:20:20:18 | then ... | | +| raise.rb:19:10:19:19 | After ExceptionA [no-match] | raise.rb:19:3:20:18 | After rescue ... [no-match] | no-match | +| raise.rb:19:10:19:19 | ExceptionA | raise.rb:19:10:19:19 | After ExceptionA [match] | match | +| raise.rb:19:10:19:19 | ExceptionA | raise.rb:19:10:19:19 | After ExceptionA [no-match] | no-match | +| raise.rb:19:20:20:18 | After then ... | raise.rb:15:3:21:5 | After begin ... | | +| raise.rb:19:20:20:18 | then ... | raise.rb:20:5:20:18 | Before call to puts | | +| raise.rb:20:5:20:18 | After call to puts | raise.rb:19:20:20:18 | After then ... | | +| raise.rb:20:5:20:18 | Before call to puts | raise.rb:20:5:20:18 | self | | +| raise.rb:20:5:20:18 | call to puts | raise.rb:20:5:20:18 | After call to puts | | +| raise.rb:20:5:20:18 | self | raise.rb:20:10:20:18 | Before "Rescued" | | +| raise.rb:20:10:20:18 | "Rescued" | raise.rb:20:10:20:18 | After "Rescued" | | +| raise.rb:20:10:20:18 | After "Rescued" | raise.rb:20:5:20:18 | call to puts | | +| raise.rb:20:10:20:18 | Before "Rescued" | raise.rb:20:11:20:17 | Rescued | | | raise.rb:20:11:20:17 | Rescued | raise.rb:20:10:20:18 | "Rescued" | | -| raise.rb:22:3:22:15 | call to puts | raise.rb:14:1:23:3 | exit m2 (normal) | | -| raise.rb:22:3:22:15 | self | raise.rb:22:9:22:14 | End m2 | | -| raise.rb:22:8:22:15 | "End m2" | raise.rb:22:3:22:15 | call to puts | | +| raise.rb:22:3:22:15 | After call to puts | raise.rb:15:3:22:15 | After ... | | +| raise.rb:22:3:22:15 | Before call to puts | raise.rb:22:3:22:15 | self | | +| raise.rb:22:3:22:15 | call to puts | raise.rb:22:3:22:15 | After call to puts | | +| raise.rb:22:3:22:15 | self | raise.rb:22:8:22:15 | Before "End m2" | | +| raise.rb:22:8:22:15 | "End m2" | raise.rb:22:8:22:15 | After "End m2" | | +| raise.rb:22:8:22:15 | After "End m2" | raise.rb:22:3:22:15 | call to puts | | +| raise.rb:22:8:22:15 | Before "End m2" | raise.rb:22:9:22:14 | End m2 | | | raise.rb:22:9:22:14 | End m2 | raise.rb:22:8:22:15 | "End m2" | | -| raise.rb:25:1:34:3 | enter m3 | raise.rb:25:8:25:8 | b | | -| raise.rb:25:1:34:3 | exit m3 (normal) | raise.rb:25:1:34:3 | exit m3 | | +| raise.rb:25:1:34:3 | Entry | raise.rb:25:8:25:8 | b | | +| raise.rb:25:1:34:3 | Normal Exit | raise.rb:25:1:34:3 | Exit | | | raise.rb:25:1:34:3 | m3 | raise.rb:36:1:45:3 | m4 | | -| raise.rb:25:8:25:8 | b | raise.rb:27:8:27:8 | b | | -| raise.rb:27:5:29:7 | if ... | raise.rb:33:3:33:15 | self | | -| raise.rb:27:8:27:8 | b | raise.rb:27:5:29:7 | if ... | false | -| raise.rb:27:8:27:8 | b | raise.rb:28:7:28:22 | self | true | -| raise.rb:28:7:28:22 | call to raise | raise.rb:31:5:31:18 | self | exception | +| raise.rb:25:8:25:8 | b | raise.rb:26:3:33:15 | ... | | +| raise.rb:26:3:32:5 | After begin ... | raise.rb:33:3:33:15 | Before call to puts | | +| raise.rb:26:3:32:5 | begin ... | raise.rb:27:5:29:7 | if ... | | +| raise.rb:26:3:33:15 | ... | raise.rb:26:3:32:5 | begin ... | | +| raise.rb:26:3:33:15 | After ... | raise.rb:25:1:34:3 | Normal Exit | | +| raise.rb:27:5:29:7 | After if ... | raise.rb:26:3:32:5 | After begin ... | | +| raise.rb:27:5:29:7 | if ... | raise.rb:27:8:27:8 | b | | +| raise.rb:27:8:27:8 | After b [false] | raise.rb:27:5:29:7 | After if ... | | +| raise.rb:27:8:27:8 | After b [true] | raise.rb:27:9:28:22 | then ... | | +| raise.rb:27:8:27:8 | b | raise.rb:27:8:27:8 | After b [false] | false | +| raise.rb:27:8:27:8 | b | raise.rb:27:8:27:8 | After b [true] | true | +| raise.rb:27:9:28:22 | then ... | raise.rb:28:7:28:22 | Before call to raise | | +| raise.rb:28:7:28:22 | Before call to raise | raise.rb:28:7:28:22 | self | | +| raise.rb:28:7:28:22 | call to raise | raise.rb:30:3:31:18 | rescue ... | exception | | raise.rb:28:7:28:22 | self | raise.rb:28:13:28:22 | ExceptionA | | | raise.rb:28:13:28:22 | ExceptionA | raise.rb:28:7:28:22 | call to raise | | -| raise.rb:30:3:31:18 | rescue ... | raise.rb:33:3:33:15 | self | | -| raise.rb:30:9:31:18 | then ... | raise.rb:30:3:31:18 | rescue ... | | -| raise.rb:31:5:31:18 | call to puts | raise.rb:30:9:31:18 | then ... | | -| raise.rb:31:5:31:18 | self | raise.rb:31:11:31:17 | Rescued | | -| raise.rb:31:10:31:18 | "Rescued" | raise.rb:31:5:31:18 | call to puts | | +| raise.rb:30:3:31:18 | rescue ... | raise.rb:30:9:31:18 | then ... | | +| raise.rb:30:9:31:18 | After then ... | raise.rb:26:3:32:5 | After begin ... | | +| raise.rb:30:9:31:18 | then ... | raise.rb:31:5:31:18 | Before call to puts | | +| raise.rb:31:5:31:18 | After call to puts | raise.rb:30:9:31:18 | After then ... | | +| raise.rb:31:5:31:18 | Before call to puts | raise.rb:31:5:31:18 | self | | +| raise.rb:31:5:31:18 | call to puts | raise.rb:31:5:31:18 | After call to puts | | +| raise.rb:31:5:31:18 | self | raise.rb:31:10:31:18 | Before "Rescued" | | +| raise.rb:31:10:31:18 | "Rescued" | raise.rb:31:10:31:18 | After "Rescued" | | +| raise.rb:31:10:31:18 | After "Rescued" | raise.rb:31:5:31:18 | call to puts | | +| raise.rb:31:10:31:18 | Before "Rescued" | raise.rb:31:11:31:17 | Rescued | | | raise.rb:31:11:31:17 | Rescued | raise.rb:31:10:31:18 | "Rescued" | | -| raise.rb:33:3:33:15 | call to puts | raise.rb:25:1:34:3 | exit m3 (normal) | | -| raise.rb:33:3:33:15 | self | raise.rb:33:9:33:14 | End m3 | | -| raise.rb:33:8:33:15 | "End m3" | raise.rb:33:3:33:15 | call to puts | | +| raise.rb:33:3:33:15 | After call to puts | raise.rb:26:3:33:15 | After ... | | +| raise.rb:33:3:33:15 | Before call to puts | raise.rb:33:3:33:15 | self | | +| raise.rb:33:3:33:15 | call to puts | raise.rb:33:3:33:15 | After call to puts | | +| raise.rb:33:3:33:15 | self | raise.rb:33:8:33:15 | Before "End m3" | | +| raise.rb:33:8:33:15 | "End m3" | raise.rb:33:8:33:15 | After "End m3" | | +| raise.rb:33:8:33:15 | After "End m3" | raise.rb:33:3:33:15 | call to puts | | +| raise.rb:33:8:33:15 | Before "End m3" | raise.rb:33:9:33:14 | End m3 | | | raise.rb:33:9:33:14 | End m3 | raise.rb:33:8:33:15 | "End m3" | | -| raise.rb:36:1:45:3 | enter m4 | raise.rb:36:8:36:8 | b | | -| raise.rb:36:1:45:3 | exit m4 (normal) | raise.rb:36:1:45:3 | exit m4 | | +| raise.rb:36:1:45:3 | Entry | raise.rb:36:8:36:8 | b | | +| raise.rb:36:1:45:3 | Normal Exit | raise.rb:36:1:45:3 | Exit | | | raise.rb:36:1:45:3 | m4 | raise.rb:47:1:55:3 | m5 | | -| raise.rb:36:8:36:8 | b | raise.rb:38:8:38:8 | b | | -| raise.rb:38:5:40:7 | if ... | raise.rb:44:3:44:15 | self | | -| raise.rb:38:8:38:8 | b | raise.rb:38:5:40:7 | if ... | false | -| raise.rb:38:8:38:8 | b | raise.rb:39:7:39:22 | self | true | -| raise.rb:39:7:39:22 | call to raise | raise.rb:41:13:41:13 | e | exception | +| raise.rb:36:8:36:8 | b | raise.rb:37:3:44:15 | ... | | +| raise.rb:37:3:43:5 | After begin ... | raise.rb:44:3:44:15 | Before call to puts | | +| raise.rb:37:3:43:5 | begin ... | raise.rb:38:5:40:7 | if ... | | +| raise.rb:37:3:44:15 | ... | raise.rb:37:3:43:5 | begin ... | | +| raise.rb:37:3:44:15 | After ... | raise.rb:36:1:45:3 | Normal Exit | | +| raise.rb:38:5:40:7 | After if ... | raise.rb:37:3:43:5 | After begin ... | | +| raise.rb:38:5:40:7 | if ... | raise.rb:38:8:38:8 | b | | +| raise.rb:38:8:38:8 | After b [false] | raise.rb:38:5:40:7 | After if ... | | +| raise.rb:38:8:38:8 | After b [true] | raise.rb:38:9:39:22 | then ... | | +| raise.rb:38:8:38:8 | b | raise.rb:38:8:38:8 | After b [false] | false | +| raise.rb:38:8:38:8 | b | raise.rb:38:8:38:8 | After b [true] | true | +| raise.rb:38:9:39:22 | then ... | raise.rb:39:7:39:22 | Before call to raise | | +| raise.rb:39:7:39:22 | Before call to raise | raise.rb:39:7:39:22 | self | | +| raise.rb:39:7:39:22 | call to raise | raise.rb:41:3:42:22 | rescue ... | exception | | raise.rb:39:7:39:22 | self | raise.rb:39:13:39:22 | ExceptionA | | | raise.rb:39:13:39:22 | ExceptionA | raise.rb:39:7:39:22 | call to raise | | -| raise.rb:41:3:42:22 | rescue ... | raise.rb:44:3:44:15 | self | | -| raise.rb:41:13:41:13 | e | raise.rb:42:5:42:22 | self | | -| raise.rb:41:14:42:22 | then ... | raise.rb:41:3:42:22 | rescue ... | | -| raise.rb:42:5:42:22 | call to puts | raise.rb:41:14:42:22 | then ... | | -| raise.rb:42:5:42:22 | self | raise.rb:42:11:42:21 | Rescued {e} | | -| raise.rb:42:10:42:22 | "Rescued {e}" | raise.rb:42:5:42:22 | call to puts | | +| raise.rb:41:3:42:22 | rescue ... | raise.rb:41:13:41:13 | e | | +| raise.rb:41:13:41:13 | e | raise.rb:41:14:42:22 | then ... | | +| raise.rb:41:14:42:22 | After then ... | raise.rb:37:3:43:5 | After begin ... | | +| raise.rb:41:14:42:22 | then ... | raise.rb:42:5:42:22 | Before call to puts | | +| raise.rb:42:5:42:22 | After call to puts | raise.rb:41:14:42:22 | After then ... | | +| raise.rb:42:5:42:22 | Before call to puts | raise.rb:42:5:42:22 | self | | +| raise.rb:42:5:42:22 | call to puts | raise.rb:42:5:42:22 | After call to puts | | +| raise.rb:42:5:42:22 | self | raise.rb:42:10:42:22 | Before "Rescued {e}" | | +| raise.rb:42:10:42:22 | "Rescued {e}" | raise.rb:42:10:42:22 | After "Rescued {e}" | | +| raise.rb:42:10:42:22 | After "Rescued {e}" | raise.rb:42:5:42:22 | call to puts | | +| raise.rb:42:10:42:22 | Before "Rescued {e}" | raise.rb:42:11:42:21 | Rescued {e} | | | raise.rb:42:11:42:21 | Rescued {e} | raise.rb:42:10:42:22 | "Rescued {e}" | | -| raise.rb:44:3:44:15 | call to puts | raise.rb:36:1:45:3 | exit m4 (normal) | | -| raise.rb:44:3:44:15 | self | raise.rb:44:9:44:14 | End m4 | | -| raise.rb:44:8:44:15 | "End m4" | raise.rb:44:3:44:15 | call to puts | | +| raise.rb:44:3:44:15 | After call to puts | raise.rb:37:3:44:15 | After ... | | +| raise.rb:44:3:44:15 | Before call to puts | raise.rb:44:3:44:15 | self | | +| raise.rb:44:3:44:15 | call to puts | raise.rb:44:3:44:15 | After call to puts | | +| raise.rb:44:3:44:15 | self | raise.rb:44:8:44:15 | Before "End m4" | | +| raise.rb:44:8:44:15 | "End m4" | raise.rb:44:8:44:15 | After "End m4" | | +| raise.rb:44:8:44:15 | After "End m4" | raise.rb:44:3:44:15 | call to puts | | +| raise.rb:44:8:44:15 | Before "End m4" | raise.rb:44:9:44:14 | End m4 | | | raise.rb:44:9:44:14 | End m4 | raise.rb:44:8:44:15 | "End m4" | | -| raise.rb:47:1:55:3 | enter m5 | raise.rb:47:8:47:8 | b | | -| raise.rb:47:1:55:3 | exit m5 (normal) | raise.rb:47:1:55:3 | exit m5 | | +| raise.rb:47:1:55:3 | Entry | raise.rb:47:8:47:8 | b | | +| raise.rb:47:1:55:3 | Normal Exit | raise.rb:47:1:55:3 | Exit | | | raise.rb:47:1:55:3 | m5 | raise.rb:57:1:66:3 | m6 | | -| raise.rb:47:8:47:8 | b | raise.rb:49:8:49:8 | b | | -| raise.rb:49:5:51:7 | if ... | raise.rb:54:3:54:15 | self | | -| raise.rb:49:8:49:8 | b | raise.rb:49:5:51:7 | if ... | false | -| raise.rb:49:8:49:8 | b | raise.rb:50:7:50:22 | self | true | -| raise.rb:50:7:50:22 | call to raise | raise.rb:52:13:52:13 | e | exception | +| raise.rb:47:8:47:8 | b | raise.rb:48:3:54:15 | ... | | +| raise.rb:48:3:53:5 | After begin ... | raise.rb:54:3:54:15 | Before call to puts | | +| raise.rb:48:3:53:5 | begin ... | raise.rb:49:5:51:7 | if ... | | +| raise.rb:48:3:54:15 | ... | raise.rb:48:3:53:5 | begin ... | | +| raise.rb:48:3:54:15 | After ... | raise.rb:47:1:55:3 | Normal Exit | | +| raise.rb:49:5:51:7 | After if ... | raise.rb:48:3:53:5 | After begin ... | | +| raise.rb:49:5:51:7 | if ... | raise.rb:49:8:49:8 | b | | +| raise.rb:49:8:49:8 | After b [false] | raise.rb:49:5:51:7 | After if ... | | +| raise.rb:49:8:49:8 | After b [true] | raise.rb:49:9:50:22 | then ... | | +| raise.rb:49:8:49:8 | b | raise.rb:49:8:49:8 | After b [false] | false | +| raise.rb:49:8:49:8 | b | raise.rb:49:8:49:8 | After b [true] | true | +| raise.rb:49:9:50:22 | then ... | raise.rb:50:7:50:22 | Before call to raise | | +| raise.rb:50:7:50:22 | Before call to raise | raise.rb:50:7:50:22 | self | | +| raise.rb:50:7:50:22 | call to raise | raise.rb:52:3:52:13 | rescue ... | exception | | raise.rb:50:7:50:22 | self | raise.rb:50:13:50:22 | ExceptionA | | | raise.rb:50:13:50:22 | ExceptionA | raise.rb:50:7:50:22 | call to raise | | -| raise.rb:52:3:52:13 | rescue ... | raise.rb:54:3:54:15 | self | | -| raise.rb:52:13:52:13 | e | raise.rb:52:3:52:13 | rescue ... | | -| raise.rb:54:3:54:15 | call to puts | raise.rb:47:1:55:3 | exit m5 (normal) | | -| raise.rb:54:3:54:15 | self | raise.rb:54:9:54:14 | End m5 | | -| raise.rb:54:8:54:15 | "End m5" | raise.rb:54:3:54:15 | call to puts | | +| raise.rb:52:3:52:13 | [CatchClauseEmptyBody] rescue ... | raise.rb:48:3:53:5 | After begin ... | | +| raise.rb:52:3:52:13 | rescue ... | raise.rb:52:13:52:13 | e | | +| raise.rb:52:13:52:13 | e | raise.rb:52:3:52:13 | [CatchClauseEmptyBody] rescue ... | | +| raise.rb:54:3:54:15 | After call to puts | raise.rb:48:3:54:15 | After ... | | +| raise.rb:54:3:54:15 | Before call to puts | raise.rb:54:3:54:15 | self | | +| raise.rb:54:3:54:15 | call to puts | raise.rb:54:3:54:15 | After call to puts | | +| raise.rb:54:3:54:15 | self | raise.rb:54:8:54:15 | Before "End m5" | | +| raise.rb:54:8:54:15 | "End m5" | raise.rb:54:8:54:15 | After "End m5" | | +| raise.rb:54:8:54:15 | After "End m5" | raise.rb:54:3:54:15 | call to puts | | +| raise.rb:54:8:54:15 | Before "End m5" | raise.rb:54:9:54:14 | End m5 | | | raise.rb:54:9:54:14 | End m5 | raise.rb:54:8:54:15 | "End m5" | | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:57:8:57:8 | b | | -| raise.rb:57:1:66:3 | exit m6 (abnormal) | raise.rb:57:1:66:3 | exit m6 | | -| raise.rb:57:1:66:3 | exit m6 (normal) | raise.rb:57:1:66:3 | exit m6 | | +| raise.rb:57:1:66:3 | Entry | raise.rb:57:8:57:8 | b | | +| raise.rb:57:1:66:3 | Exceptional Exit | raise.rb:57:1:66:3 | Exit | | +| raise.rb:57:1:66:3 | Normal Exit | raise.rb:57:1:66:3 | Exit | | | raise.rb:57:1:66:3 | m6 | raise.rb:68:1:77:3 | m7 | | -| raise.rb:57:8:57:8 | b | raise.rb:59:8:59:8 | b | | -| raise.rb:59:5:61:7 | if ... | raise.rb:65:3:65:15 | self | | -| raise.rb:59:8:59:8 | b | raise.rb:59:5:61:7 | if ... | false | -| raise.rb:59:8:59:8 | b | raise.rb:60:7:60:22 | self | true | -| raise.rb:60:7:60:22 | call to raise | raise.rb:62:10:62:19 | ExceptionA | exception | +| raise.rb:57:8:57:8 | b | raise.rb:58:3:65:15 | ... | | +| raise.rb:58:3:64:5 | After begin ... | raise.rb:65:3:65:15 | Before call to puts | | +| raise.rb:58:3:64:5 | begin ... | raise.rb:59:5:61:7 | if ... | | +| raise.rb:58:3:65:15 | ... | raise.rb:58:3:64:5 | begin ... | | +| raise.rb:58:3:65:15 | After ... | raise.rb:57:1:66:3 | Normal Exit | | +| raise.rb:59:5:61:7 | After if ... | raise.rb:58:3:64:5 | After begin ... | | +| raise.rb:59:5:61:7 | if ... | raise.rb:59:8:59:8 | b | | +| raise.rb:59:8:59:8 | After b [false] | raise.rb:59:5:61:7 | After if ... | | +| raise.rb:59:8:59:8 | After b [true] | raise.rb:59:9:60:22 | then ... | | +| raise.rb:59:8:59:8 | b | raise.rb:59:8:59:8 | After b [false] | false | +| raise.rb:59:8:59:8 | b | raise.rb:59:8:59:8 | After b [true] | true | +| raise.rb:59:9:60:22 | then ... | raise.rb:60:7:60:22 | Before call to raise | | +| raise.rb:60:7:60:22 | Before call to raise | raise.rb:60:7:60:22 | self | | +| raise.rb:60:7:60:22 | call to raise | raise.rb:62:3:63:22 | rescue ... | exception | | raise.rb:60:7:60:22 | self | raise.rb:60:13:60:22 | ExceptionA | | | raise.rb:60:13:60:22 | ExceptionA | raise.rb:60:7:60:22 | call to raise | | -| raise.rb:62:3:63:22 | rescue ... | raise.rb:65:3:65:15 | self | | -| raise.rb:62:10:62:19 | ExceptionA | raise.rb:62:22:62:31 | ExceptionB | no-match | -| raise.rb:62:10:62:19 | ExceptionA | raise.rb:62:36:62:36 | e | match | -| raise.rb:62:22:62:31 | ExceptionB | raise.rb:57:1:66:3 | exit m6 (abnormal) | exception | -| raise.rb:62:22:62:31 | ExceptionB | raise.rb:62:36:62:36 | e | match | -| raise.rb:62:36:62:36 | e | raise.rb:63:5:63:22 | self | | -| raise.rb:62:37:63:22 | then ... | raise.rb:62:3:63:22 | rescue ... | | -| raise.rb:63:5:63:22 | call to puts | raise.rb:62:37:63:22 | then ... | | -| raise.rb:63:5:63:22 | self | raise.rb:63:11:63:21 | Rescued {e} | | -| raise.rb:63:10:63:22 | "Rescued {e}" | raise.rb:63:5:63:22 | call to puts | | +| raise.rb:62:3:63:22 | After rescue ... [no-match] | raise.rb:57:1:66:3 | Exceptional Exit | exception | +| raise.rb:62:3:63:22 | rescue ... | raise.rb:62:10:62:31 | Before ..., ... | | +| raise.rb:62:10:62:19 | ExceptionA | raise.rb:62:22:62:31 | ExceptionB | | +| raise.rb:62:10:62:31 | ..., ... | raise.rb:62:10:62:31 | After ..., ... [match] | match | +| raise.rb:62:10:62:31 | ..., ... | raise.rb:62:10:62:31 | After ..., ... [no-match] | no-match | +| raise.rb:62:10:62:31 | After ..., ... [match] | raise.rb:62:36:62:36 | e | | +| raise.rb:62:10:62:31 | After ..., ... [no-match] | raise.rb:62:3:63:22 | After rescue ... [no-match] | no-match | +| raise.rb:62:10:62:31 | Before ..., ... | raise.rb:62:10:62:19 | ExceptionA | | +| raise.rb:62:22:62:31 | ExceptionB | raise.rb:62:10:62:31 | ..., ... | | +| raise.rb:62:36:62:36 | e | raise.rb:62:37:63:22 | then ... | | +| raise.rb:62:37:63:22 | After then ... | raise.rb:58:3:64:5 | After begin ... | | +| raise.rb:62:37:63:22 | then ... | raise.rb:63:5:63:22 | Before call to puts | | +| raise.rb:63:5:63:22 | After call to puts | raise.rb:62:37:63:22 | After then ... | | +| raise.rb:63:5:63:22 | Before call to puts | raise.rb:63:5:63:22 | self | | +| raise.rb:63:5:63:22 | call to puts | raise.rb:63:5:63:22 | After call to puts | | +| raise.rb:63:5:63:22 | self | raise.rb:63:10:63:22 | Before "Rescued {e}" | | +| raise.rb:63:10:63:22 | "Rescued {e}" | raise.rb:63:10:63:22 | After "Rescued {e}" | | +| raise.rb:63:10:63:22 | After "Rescued {e}" | raise.rb:63:5:63:22 | call to puts | | +| raise.rb:63:10:63:22 | Before "Rescued {e}" | raise.rb:63:11:63:21 | Rescued {e} | | | raise.rb:63:11:63:21 | Rescued {e} | raise.rb:63:10:63:22 | "Rescued {e}" | | -| raise.rb:65:3:65:15 | call to puts | raise.rb:57:1:66:3 | exit m6 (normal) | | -| raise.rb:65:3:65:15 | self | raise.rb:65:9:65:14 | End m6 | | -| raise.rb:65:8:65:15 | "End m6" | raise.rb:65:3:65:15 | call to puts | | +| raise.rb:65:3:65:15 | After call to puts | raise.rb:58:3:65:15 | After ... | | +| raise.rb:65:3:65:15 | Before call to puts | raise.rb:65:3:65:15 | self | | +| raise.rb:65:3:65:15 | call to puts | raise.rb:65:3:65:15 | After call to puts | | +| raise.rb:65:3:65:15 | self | raise.rb:65:8:65:15 | Before "End m6" | | +| raise.rb:65:8:65:15 | "End m6" | raise.rb:65:8:65:15 | After "End m6" | | +| raise.rb:65:8:65:15 | After "End m6" | raise.rb:65:3:65:15 | call to puts | | +| raise.rb:65:8:65:15 | Before "End m6" | raise.rb:65:9:65:14 | End m6 | | | raise.rb:65:9:65:14 | End m6 | raise.rb:65:8:65:15 | "End m6" | | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:68:8:68:8 | x | | -| raise.rb:68:1:77:3 | exit m7 (abnormal) | raise.rb:68:1:77:3 | exit m7 | | -| raise.rb:68:1:77:3 | exit m7 (normal) | raise.rb:68:1:77:3 | exit m7 | | +| raise.rb:68:1:77:3 | Entry | raise.rb:68:8:68:8 | x | | +| raise.rb:68:1:77:3 | Exceptional Exit | raise.rb:68:1:77:3 | Exit | | +| raise.rb:68:1:77:3 | Normal Exit | raise.rb:68:1:77:3 | Exit | | | raise.rb:68:1:77:3 | m7 | raise.rb:79:1:92:3 | m8 | | -| raise.rb:68:8:68:8 | x | raise.rb:69:6:69:6 | x | | -| raise.rb:69:3:73:5 | if ... | raise.rb:74:3:74:20 | self | | +| raise.rb:68:8:68:8 | x | raise.rb:69:3:76:15 | ... | | +| raise.rb:69:3:73:5 | After if ... | raise.rb:74:3:74:20 | Before call to puts | | +| raise.rb:69:3:73:5 | if ... | raise.rb:69:6:69:10 | Before ... > ... | | +| raise.rb:69:3:76:15 | ... | raise.rb:69:3:73:5 | if ... | | +| raise.rb:69:3:76:15 | After ... | raise.rb:68:1:77:3 | Normal Exit | | | raise.rb:69:6:69:6 | x | raise.rb:69:10:69:10 | 2 | | -| raise.rb:69:6:69:10 | ... > ... | raise.rb:70:5:70:17 | self | true | -| raise.rb:69:6:69:10 | ... > ... | raise.rb:71:9:71:9 | x | false | -| raise.rb:69:6:69:10 | ... > ... | raise.rb:76:3:76:15 | [ensure: exception] self | exception | +| raise.rb:69:6:69:10 | ... > ... | raise.rb:69:6:69:10 | After ... > ... [false] | false | +| raise.rb:69:6:69:10 | ... > ... | raise.rb:69:6:69:10 | After ... > ... [true] | true | +| raise.rb:69:6:69:10 | ... > ... | raise.rb:75:1:76:15 | ensure ... | exception | +| raise.rb:69:6:69:10 | After ... > ... [false] | raise.rb:71:3:72:18 | elsif ... | | +| raise.rb:69:6:69:10 | After ... > ... [true] | raise.rb:69:11:70:17 | then ... | | +| raise.rb:69:6:69:10 | Before ... > ... | raise.rb:69:6:69:6 | x | | | raise.rb:69:10:69:10 | 2 | raise.rb:69:6:69:10 | ... > ... | | -| raise.rb:70:5:70:17 | call to raise | raise.rb:76:3:76:15 | [ensure: exception] self | exception | -| raise.rb:70:5:70:17 | self | raise.rb:70:12:70:16 | x > 2 | | -| raise.rb:70:11:70:17 | "x > 2" | raise.rb:70:5:70:17 | call to raise | | +| raise.rb:69:11:70:17 | then ... | raise.rb:70:5:70:17 | Before call to raise | | +| raise.rb:70:5:70:17 | Before call to raise | raise.rb:70:5:70:17 | self | | +| raise.rb:70:5:70:17 | call to raise | raise.rb:75:1:76:15 | ensure ... | exception | +| raise.rb:70:5:70:17 | self | raise.rb:70:11:70:17 | Before "x > 2" | | +| raise.rb:70:11:70:17 | "x > 2" | raise.rb:70:11:70:17 | After "x > 2" | | +| raise.rb:70:11:70:17 | After "x > 2" | raise.rb:70:5:70:17 | call to raise | | +| raise.rb:70:11:70:17 | Before "x > 2" | raise.rb:70:12:70:16 | x > 2 | | | raise.rb:70:12:70:16 | x > 2 | raise.rb:70:11:70:17 | "x > 2" | | -| raise.rb:71:3:72:18 | elsif ... | raise.rb:69:3:73:5 | if ... | | +| raise.rb:71:3:72:18 | After elsif ... | raise.rb:69:3:73:5 | After if ... | | +| raise.rb:71:3:72:18 | elsif ... | raise.rb:71:9:71:13 | Before ... < ... | | | raise.rb:71:9:71:9 | x | raise.rb:71:13:71:13 | 0 | | -| raise.rb:71:9:71:13 | ... < ... | raise.rb:71:3:72:18 | elsif ... | false | -| raise.rb:71:9:71:13 | ... < ... | raise.rb:72:13:72:17 | x < 0 | true | -| raise.rb:71:9:71:13 | ... < ... | raise.rb:76:3:76:15 | [ensure: exception] self | exception | +| raise.rb:71:9:71:13 | ... < ... | raise.rb:71:9:71:13 | After ... < ... [false] | false | +| raise.rb:71:9:71:13 | ... < ... | raise.rb:71:9:71:13 | After ... < ... [true] | true | +| raise.rb:71:9:71:13 | ... < ... | raise.rb:75:1:76:15 | ensure ... | exception | +| raise.rb:71:9:71:13 | After ... < ... [false] | raise.rb:71:3:72:18 | After elsif ... | | +| raise.rb:71:9:71:13 | After ... < ... [true] | raise.rb:71:14:72:18 | then ... | | +| raise.rb:71:9:71:13 | Before ... < ... | raise.rb:71:9:71:9 | x | | | raise.rb:71:13:71:13 | 0 | raise.rb:71:9:71:13 | ... < ... | | -| raise.rb:72:5:72:18 | return | raise.rb:76:3:76:15 | [ensure: return] self | return | -| raise.rb:72:12:72:18 | "x < 0" | raise.rb:72:5:72:18 | return | | +| raise.rb:71:14:72:18 | then ... | raise.rb:72:5:72:18 | Before return | | +| raise.rb:72:5:72:18 | Before return | raise.rb:72:12:72:18 | Before "x < 0" | | +| raise.rb:72:5:72:18 | return | raise.rb:75:1:76:15 | ensure ... | return | +| raise.rb:72:12:72:18 | "x < 0" | raise.rb:72:12:72:18 | After "x < 0" | | +| raise.rb:72:12:72:18 | After "x < 0" | raise.rb:72:5:72:18 | return | | +| raise.rb:72:12:72:18 | Before "x < 0" | raise.rb:72:13:72:17 | x < 0 | | | raise.rb:72:13:72:17 | x < 0 | raise.rb:72:12:72:18 | "x < 0" | | -| raise.rb:74:3:74:20 | call to puts | raise.rb:76:3:76:15 | [ensure: exception] self | exception | -| raise.rb:74:3:74:20 | call to puts | raise.rb:76:3:76:15 | self | | -| raise.rb:74:3:74:20 | self | raise.rb:74:9:74:19 | 0 <= x <= 2 | | -| raise.rb:74:8:74:20 | "0 <= x <= 2" | raise.rb:74:3:74:20 | call to puts | | +| raise.rb:74:3:74:20 | After call to puts | raise.rb:75:1:76:15 | ensure ... | | +| raise.rb:74:3:74:20 | Before call to puts | raise.rb:74:3:74:20 | self | | +| raise.rb:74:3:74:20 | call to puts | raise.rb:74:3:74:20 | After call to puts | | +| raise.rb:74:3:74:20 | call to puts | raise.rb:75:1:76:15 | ensure ... | exception | +| raise.rb:74:3:74:20 | self | raise.rb:74:8:74:20 | Before "0 <= x <= 2" | | +| raise.rb:74:8:74:20 | "0 <= x <= 2" | raise.rb:74:8:74:20 | After "0 <= x <= 2" | | +| raise.rb:74:8:74:20 | After "0 <= x <= 2" | raise.rb:74:3:74:20 | call to puts | | +| raise.rb:74:8:74:20 | Before "0 <= x <= 2" | raise.rb:74:9:74:19 | 0 <= x <= 2 | | | raise.rb:74:9:74:19 | 0 <= x <= 2 | raise.rb:74:8:74:20 | "0 <= x <= 2" | | -| raise.rb:75:1:76:15 | [ensure: exception] ensure ... | raise.rb:68:1:77:3 | exit m7 (abnormal) | exception | -| raise.rb:75:1:76:15 | [ensure: return] ensure ... | raise.rb:68:1:77:3 | exit m7 (normal) | return | -| raise.rb:75:1:76:15 | ensure ... | raise.rb:68:1:77:3 | exit m7 (normal) | | -| raise.rb:76:3:76:15 | [ensure: exception] call to puts | raise.rb:75:1:76:15 | [ensure: exception] ensure ... | | -| raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:76:9:76:14 | [ensure: exception] ensure | | -| raise.rb:76:3:76:15 | [ensure: return] call to puts | raise.rb:75:1:76:15 | [ensure: return] ensure ... | | -| raise.rb:76:3:76:15 | [ensure: return] self | raise.rb:76:9:76:14 | [ensure: return] ensure | | -| raise.rb:76:3:76:15 | call to puts | raise.rb:75:1:76:15 | ensure ... | | -| raise.rb:76:3:76:15 | self | raise.rb:76:9:76:14 | ensure | | -| raise.rb:76:8:76:15 | "ensure" | raise.rb:76:3:76:15 | call to puts | | -| raise.rb:76:8:76:15 | [ensure: exception] "ensure" | raise.rb:76:3:76:15 | [ensure: exception] call to puts | | -| raise.rb:76:8:76:15 | [ensure: return] "ensure" | raise.rb:76:3:76:15 | [ensure: return] call to puts | | -| raise.rb:76:9:76:14 | [ensure: exception] ensure | raise.rb:76:8:76:15 | [ensure: exception] "ensure" | | -| raise.rb:76:9:76:14 | [ensure: return] ensure | raise.rb:76:8:76:15 | [ensure: return] "ensure" | | +| raise.rb:75:1:76:15 | After ensure ... | raise.rb:68:1:77:3 | Exceptional Exit | exception | +| raise.rb:75:1:76:15 | After ensure ... | raise.rb:68:1:77:3 | Normal Exit | return | +| raise.rb:75:1:76:15 | After ensure ... | raise.rb:69:3:76:15 | After ... | | +| raise.rb:75:1:76:15 | ensure ... | raise.rb:76:3:76:15 | Before call to puts | | +| raise.rb:76:3:76:15 | After call to puts | raise.rb:75:1:76:15 | After ensure ... | | +| raise.rb:76:3:76:15 | Before call to puts | raise.rb:76:3:76:15 | self | | +| raise.rb:76:3:76:15 | call to puts | raise.rb:76:3:76:15 | After call to puts | | +| raise.rb:76:3:76:15 | self | raise.rb:76:8:76:15 | Before "ensure" | | +| raise.rb:76:8:76:15 | "ensure" | raise.rb:76:8:76:15 | After "ensure" | | +| raise.rb:76:8:76:15 | After "ensure" | raise.rb:76:3:76:15 | call to puts | | +| raise.rb:76:8:76:15 | Before "ensure" | raise.rb:76:9:76:14 | ensure | | | raise.rb:76:9:76:14 | ensure | raise.rb:76:8:76:15 | "ensure" | | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:79:8:79:8 | x | | -| raise.rb:79:1:92:3 | exit m8 (abnormal) | raise.rb:79:1:92:3 | exit m8 | | -| raise.rb:79:1:92:3 | exit m8 (normal) | raise.rb:79:1:92:3 | exit m8 | | +| raise.rb:79:1:92:3 | Entry | raise.rb:79:8:79:8 | x | | +| raise.rb:79:1:92:3 | Exceptional Exit | raise.rb:79:1:92:3 | Exit | | +| raise.rb:79:1:92:3 | Normal Exit | raise.rb:79:1:92:3 | Exit | | | raise.rb:79:1:92:3 | m8 | raise.rb:94:1:119:3 | m9 | | -| raise.rb:79:8:79:8 | x | raise.rb:80:3:80:17 | self | | -| raise.rb:80:3:80:17 | call to puts | raise.rb:82:8:82:8 | x | | -| raise.rb:80:3:80:17 | self | raise.rb:80:9:80:16 | Begin m8 | | -| raise.rb:80:8:80:17 | "Begin m8" | raise.rb:80:3:80:17 | call to puts | | +| raise.rb:79:8:79:8 | x | raise.rb:80:3:91:15 | ... | | +| raise.rb:80:3:80:17 | After call to puts | raise.rb:81:3:90:5 | begin ... | | +| raise.rb:80:3:80:17 | Before call to puts | raise.rb:80:3:80:17 | self | | +| raise.rb:80:3:80:17 | call to puts | raise.rb:80:3:80:17 | After call to puts | | +| raise.rb:80:3:80:17 | self | raise.rb:80:8:80:17 | Before "Begin m8" | | +| raise.rb:80:3:91:15 | ... | raise.rb:80:3:80:17 | Before call to puts | | +| raise.rb:80:3:91:15 | After ... | raise.rb:79:1:92:3 | Normal Exit | | +| raise.rb:80:8:80:17 | "Begin m8" | raise.rb:80:8:80:17 | After "Begin m8" | | +| raise.rb:80:8:80:17 | After "Begin m8" | raise.rb:80:3:80:17 | call to puts | | +| raise.rb:80:8:80:17 | Before "Begin m8" | raise.rb:80:9:80:16 | Begin m8 | | | raise.rb:80:9:80:16 | Begin m8 | raise.rb:80:8:80:17 | "Begin m8" | | -| raise.rb:82:5:86:7 | if ... | raise.rb:87:5:87:22 | self | | +| raise.rb:81:3:90:5 | After begin ... | raise.rb:91:3:91:15 | Before call to puts | | +| raise.rb:81:3:90:5 | begin ... | raise.rb:82:5:86:7 | if ... | | +| raise.rb:82:5:86:7 | After if ... | raise.rb:87:5:87:22 | Before call to puts | | +| raise.rb:82:5:86:7 | if ... | raise.rb:82:8:82:12 | Before ... > ... | | | raise.rb:82:8:82:8 | x | raise.rb:82:12:82:12 | 2 | | -| raise.rb:82:8:82:12 | ... > ... | raise.rb:83:7:83:19 | self | true | -| raise.rb:82:8:82:12 | ... > ... | raise.rb:84:11:84:11 | x | false | -| raise.rb:82:8:82:12 | ... > ... | raise.rb:89:5:89:17 | [ensure: exception] self | exception | +| raise.rb:82:8:82:12 | ... > ... | raise.rb:82:8:82:12 | After ... > ... [false] | false | +| raise.rb:82:8:82:12 | ... > ... | raise.rb:82:8:82:12 | After ... > ... [true] | true | +| raise.rb:82:8:82:12 | ... > ... | raise.rb:88:3:89:17 | ensure ... | exception | +| raise.rb:82:8:82:12 | After ... > ... [false] | raise.rb:84:5:85:20 | elsif ... | | +| raise.rb:82:8:82:12 | After ... > ... [true] | raise.rb:82:13:83:19 | then ... | | +| raise.rb:82:8:82:12 | Before ... > ... | raise.rb:82:8:82:8 | x | | | raise.rb:82:12:82:12 | 2 | raise.rb:82:8:82:12 | ... > ... | | -| raise.rb:83:7:83:19 | call to raise | raise.rb:89:5:89:17 | [ensure: exception] self | exception | -| raise.rb:83:7:83:19 | self | raise.rb:83:14:83:18 | x > 2 | | -| raise.rb:83:13:83:19 | "x > 2" | raise.rb:83:7:83:19 | call to raise | | +| raise.rb:82:13:83:19 | then ... | raise.rb:83:7:83:19 | Before call to raise | | +| raise.rb:83:7:83:19 | Before call to raise | raise.rb:83:7:83:19 | self | | +| raise.rb:83:7:83:19 | call to raise | raise.rb:88:3:89:17 | ensure ... | exception | +| raise.rb:83:7:83:19 | self | raise.rb:83:13:83:19 | Before "x > 2" | | +| raise.rb:83:13:83:19 | "x > 2" | raise.rb:83:13:83:19 | After "x > 2" | | +| raise.rb:83:13:83:19 | After "x > 2" | raise.rb:83:7:83:19 | call to raise | | +| raise.rb:83:13:83:19 | Before "x > 2" | raise.rb:83:14:83:18 | x > 2 | | | raise.rb:83:14:83:18 | x > 2 | raise.rb:83:13:83:19 | "x > 2" | | -| raise.rb:84:5:85:20 | elsif ... | raise.rb:82:5:86:7 | if ... | | +| raise.rb:84:5:85:20 | After elsif ... | raise.rb:82:5:86:7 | After if ... | | +| raise.rb:84:5:85:20 | elsif ... | raise.rb:84:11:84:15 | Before ... < ... | | | raise.rb:84:11:84:11 | x | raise.rb:84:15:84:15 | 0 | | -| raise.rb:84:11:84:15 | ... < ... | raise.rb:84:5:85:20 | elsif ... | false | -| raise.rb:84:11:84:15 | ... < ... | raise.rb:85:15:85:19 | x < 0 | true | -| raise.rb:84:11:84:15 | ... < ... | raise.rb:89:5:89:17 | [ensure: exception] self | exception | +| raise.rb:84:11:84:15 | ... < ... | raise.rb:84:11:84:15 | After ... < ... [false] | false | +| raise.rb:84:11:84:15 | ... < ... | raise.rb:84:11:84:15 | After ... < ... [true] | true | +| raise.rb:84:11:84:15 | ... < ... | raise.rb:88:3:89:17 | ensure ... | exception | +| raise.rb:84:11:84:15 | After ... < ... [false] | raise.rb:84:5:85:20 | After elsif ... | | +| raise.rb:84:11:84:15 | After ... < ... [true] | raise.rb:84:16:85:20 | then ... | | +| raise.rb:84:11:84:15 | Before ... < ... | raise.rb:84:11:84:11 | x | | | raise.rb:84:15:84:15 | 0 | raise.rb:84:11:84:15 | ... < ... | | -| raise.rb:85:7:85:20 | return | raise.rb:89:5:89:17 | [ensure: return] self | return | -| raise.rb:85:14:85:20 | "x < 0" | raise.rb:85:7:85:20 | return | | +| raise.rb:84:16:85:20 | then ... | raise.rb:85:7:85:20 | Before return | | +| raise.rb:85:7:85:20 | Before return | raise.rb:85:14:85:20 | Before "x < 0" | | +| raise.rb:85:7:85:20 | return | raise.rb:88:3:89:17 | ensure ... | return | +| raise.rb:85:14:85:20 | "x < 0" | raise.rb:85:14:85:20 | After "x < 0" | | +| raise.rb:85:14:85:20 | After "x < 0" | raise.rb:85:7:85:20 | return | | +| raise.rb:85:14:85:20 | Before "x < 0" | raise.rb:85:15:85:19 | x < 0 | | | raise.rb:85:15:85:19 | x < 0 | raise.rb:85:14:85:20 | "x < 0" | | -| raise.rb:87:5:87:22 | call to puts | raise.rb:89:5:89:17 | [ensure: exception] self | exception | -| raise.rb:87:5:87:22 | call to puts | raise.rb:89:5:89:17 | self | | -| raise.rb:87:5:87:22 | self | raise.rb:87:11:87:21 | 0 <= x <= 2 | | -| raise.rb:87:10:87:22 | "0 <= x <= 2" | raise.rb:87:5:87:22 | call to puts | | +| raise.rb:87:5:87:22 | After call to puts | raise.rb:88:3:89:17 | ensure ... | | +| raise.rb:87:5:87:22 | Before call to puts | raise.rb:87:5:87:22 | self | | +| raise.rb:87:5:87:22 | call to puts | raise.rb:87:5:87:22 | After call to puts | | +| raise.rb:87:5:87:22 | call to puts | raise.rb:88:3:89:17 | ensure ... | exception | +| raise.rb:87:5:87:22 | self | raise.rb:87:10:87:22 | Before "0 <= x <= 2" | | +| raise.rb:87:10:87:22 | "0 <= x <= 2" | raise.rb:87:10:87:22 | After "0 <= x <= 2" | | +| raise.rb:87:10:87:22 | After "0 <= x <= 2" | raise.rb:87:5:87:22 | call to puts | | +| raise.rb:87:10:87:22 | Before "0 <= x <= 2" | raise.rb:87:11:87:21 | 0 <= x <= 2 | | | raise.rb:87:11:87:21 | 0 <= x <= 2 | raise.rb:87:10:87:22 | "0 <= x <= 2" | | -| raise.rb:88:3:89:17 | [ensure: exception] ensure ... | raise.rb:79:1:92:3 | exit m8 (abnormal) | exception | -| raise.rb:88:3:89:17 | [ensure: return] ensure ... | raise.rb:79:1:92:3 | exit m8 (normal) | return | -| raise.rb:88:3:89:17 | ensure ... | raise.rb:91:3:91:15 | self | | -| raise.rb:89:5:89:17 | [ensure: exception] call to puts | raise.rb:88:3:89:17 | [ensure: exception] ensure ... | | -| raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:89:11:89:16 | [ensure: exception] ensure | | -| raise.rb:89:5:89:17 | [ensure: return] call to puts | raise.rb:88:3:89:17 | [ensure: return] ensure ... | | -| raise.rb:89:5:89:17 | [ensure: return] self | raise.rb:89:11:89:16 | [ensure: return] ensure | | -| raise.rb:89:5:89:17 | call to puts | raise.rb:88:3:89:17 | ensure ... | | -| raise.rb:89:5:89:17 | self | raise.rb:89:11:89:16 | ensure | | -| raise.rb:89:10:89:17 | "ensure" | raise.rb:89:5:89:17 | call to puts | | -| raise.rb:89:10:89:17 | [ensure: exception] "ensure" | raise.rb:89:5:89:17 | [ensure: exception] call to puts | | -| raise.rb:89:10:89:17 | [ensure: return] "ensure" | raise.rb:89:5:89:17 | [ensure: return] call to puts | | -| raise.rb:89:11:89:16 | [ensure: exception] ensure | raise.rb:89:10:89:17 | [ensure: exception] "ensure" | | -| raise.rb:89:11:89:16 | [ensure: return] ensure | raise.rb:89:10:89:17 | [ensure: return] "ensure" | | +| raise.rb:88:3:89:17 | After ensure ... | raise.rb:79:1:92:3 | Exceptional Exit | exception | +| raise.rb:88:3:89:17 | After ensure ... | raise.rb:79:1:92:3 | Normal Exit | return | +| raise.rb:88:3:89:17 | After ensure ... | raise.rb:81:3:90:5 | After begin ... | | +| raise.rb:88:3:89:17 | ensure ... | raise.rb:89:5:89:17 | Before call to puts | | +| raise.rb:89:5:89:17 | After call to puts | raise.rb:88:3:89:17 | After ensure ... | | +| raise.rb:89:5:89:17 | Before call to puts | raise.rb:89:5:89:17 | self | | +| raise.rb:89:5:89:17 | call to puts | raise.rb:89:5:89:17 | After call to puts | | +| raise.rb:89:5:89:17 | self | raise.rb:89:10:89:17 | Before "ensure" | | +| raise.rb:89:10:89:17 | "ensure" | raise.rb:89:10:89:17 | After "ensure" | | +| raise.rb:89:10:89:17 | After "ensure" | raise.rb:89:5:89:17 | call to puts | | +| raise.rb:89:10:89:17 | Before "ensure" | raise.rb:89:11:89:16 | ensure | | | raise.rb:89:11:89:16 | ensure | raise.rb:89:10:89:17 | "ensure" | | -| raise.rb:91:3:91:15 | call to puts | raise.rb:79:1:92:3 | exit m8 (normal) | | -| raise.rb:91:3:91:15 | self | raise.rb:91:9:91:14 | End m8 | | -| raise.rb:91:8:91:15 | "End m8" | raise.rb:91:3:91:15 | call to puts | | +| raise.rb:91:3:91:15 | After call to puts | raise.rb:80:3:91:15 | After ... | | +| raise.rb:91:3:91:15 | Before call to puts | raise.rb:91:3:91:15 | self | | +| raise.rb:91:3:91:15 | call to puts | raise.rb:91:3:91:15 | After call to puts | | +| raise.rb:91:3:91:15 | self | raise.rb:91:8:91:15 | Before "End m8" | | +| raise.rb:91:8:91:15 | "End m8" | raise.rb:91:8:91:15 | After "End m8" | | +| raise.rb:91:8:91:15 | After "End m8" | raise.rb:91:3:91:15 | call to puts | | +| raise.rb:91:8:91:15 | Before "End m8" | raise.rb:91:9:91:14 | End m8 | | | raise.rb:91:9:91:14 | End m8 | raise.rb:91:8:91:15 | "End m8" | | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:94:8:94:8 | x | | -| raise.rb:94:1:119:3 | exit m9 (abnormal) | raise.rb:94:1:119:3 | exit m9 | | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:94:1:119:3 | exit m9 | | +| raise.rb:94:1:119:3 | Entry | raise.rb:94:8:94:8 | x | | +| raise.rb:94:1:119:3 | Exceptional Exit | raise.rb:94:1:119:3 | Exit | | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:94:1:119:3 | Exit | | | raise.rb:94:1:119:3 | m9 | raise.rb:121:1:126:3 | m10 | | | raise.rb:94:8:94:8 | x | raise.rb:94:11:94:12 | b1 | | | raise.rb:94:11:94:12 | b1 | raise.rb:94:15:94:16 | b2 | | -| raise.rb:94:15:94:16 | b2 | raise.rb:95:3:95:17 | self | | -| raise.rb:95:3:95:17 | call to puts | raise.rb:97:8:97:8 | x | | -| raise.rb:95:3:95:17 | call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | -| raise.rb:95:3:95:17 | self | raise.rb:95:9:95:16 | Begin m9 | | -| raise.rb:95:8:95:17 | "Begin m9" | raise.rb:95:3:95:17 | call to puts | | +| raise.rb:94:15:94:16 | b2 | raise.rb:95:3:118:5 | ... | | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:96:3:112:5 | begin ... | | +| raise.rb:95:3:95:17 | Before call to puts | raise.rb:95:3:95:17 | self | | +| raise.rb:95:3:95:17 | call to puts | raise.rb:95:3:95:17 | After call to puts | | +| raise.rb:95:3:95:17 | call to puts | raise.rb:114:1:118:5 | ensure ... | exception | +| raise.rb:95:3:95:17 | self | raise.rb:95:8:95:17 | Before "Begin m9" | | +| raise.rb:95:3:118:5 | ... | raise.rb:95:3:95:17 | Before call to puts | | +| raise.rb:95:3:118:5 | After ... | raise.rb:94:1:119:3 | Normal Exit | | +| raise.rb:95:8:95:17 | "Begin m9" | raise.rb:95:8:95:17 | After "Begin m9" | | +| raise.rb:95:8:95:17 | After "Begin m9" | raise.rb:95:3:95:17 | call to puts | | +| raise.rb:95:8:95:17 | Before "Begin m9" | raise.rb:95:9:95:16 | Begin m9 | | | raise.rb:95:9:95:16 | Begin m9 | raise.rb:95:8:95:17 | "Begin m9" | | -| raise.rb:97:5:101:7 | if ... | raise.rb:102:5:102:22 | self | | +| raise.rb:96:3:112:5 | After begin ... | raise.rb:113:3:113:15 | Before call to puts | | +| raise.rb:96:3:112:5 | begin ... | raise.rb:97:5:101:7 | if ... | | +| raise.rb:97:5:101:7 | After if ... | raise.rb:102:5:102:22 | Before call to puts | | +| raise.rb:97:5:101:7 | if ... | raise.rb:97:8:97:12 | Before ... > ... | | | raise.rb:97:8:97:8 | x | raise.rb:97:12:97:12 | 2 | | -| raise.rb:97:8:97:12 | ... > ... | raise.rb:98:7:98:19 | self | true | -| raise.rb:97:8:97:12 | ... > ... | raise.rb:99:11:99:11 | x | false | -| raise.rb:97:8:97:12 | ... > ... | raise.rb:104:5:104:23 | [ensure: exception] self | exception | +| raise.rb:97:8:97:12 | ... > ... | raise.rb:97:8:97:12 | After ... > ... [false] | false | +| raise.rb:97:8:97:12 | ... > ... | raise.rb:97:8:97:12 | After ... > ... [true] | true | +| raise.rb:97:8:97:12 | ... > ... | raise.rb:103:3:111:7 | ensure ... | exception | +| raise.rb:97:8:97:12 | After ... > ... [false] | raise.rb:99:5:100:20 | elsif ... | | +| raise.rb:97:8:97:12 | After ... > ... [true] | raise.rb:97:13:98:19 | then ... | | +| raise.rb:97:8:97:12 | Before ... > ... | raise.rb:97:8:97:8 | x | | | raise.rb:97:12:97:12 | 2 | raise.rb:97:8:97:12 | ... > ... | | -| raise.rb:98:7:98:19 | call to raise | raise.rb:104:5:104:23 | [ensure: exception] self | exception | -| raise.rb:98:7:98:19 | self | raise.rb:98:14:98:18 | x > 2 | | -| raise.rb:98:13:98:19 | "x > 2" | raise.rb:98:7:98:19 | call to raise | | +| raise.rb:97:13:98:19 | then ... | raise.rb:98:7:98:19 | Before call to raise | | +| raise.rb:98:7:98:19 | Before call to raise | raise.rb:98:7:98:19 | self | | +| raise.rb:98:7:98:19 | call to raise | raise.rb:103:3:111:7 | ensure ... | exception | +| raise.rb:98:7:98:19 | self | raise.rb:98:13:98:19 | Before "x > 2" | | +| raise.rb:98:13:98:19 | "x > 2" | raise.rb:98:13:98:19 | After "x > 2" | | +| raise.rb:98:13:98:19 | After "x > 2" | raise.rb:98:7:98:19 | call to raise | | +| raise.rb:98:13:98:19 | Before "x > 2" | raise.rb:98:14:98:18 | x > 2 | | | raise.rb:98:14:98:18 | x > 2 | raise.rb:98:13:98:19 | "x > 2" | | -| raise.rb:99:5:100:20 | elsif ... | raise.rb:97:5:101:7 | if ... | | +| raise.rb:99:5:100:20 | After elsif ... | raise.rb:97:5:101:7 | After if ... | | +| raise.rb:99:5:100:20 | elsif ... | raise.rb:99:11:99:15 | Before ... < ... | | | raise.rb:99:11:99:11 | x | raise.rb:99:15:99:15 | 0 | | -| raise.rb:99:11:99:15 | ... < ... | raise.rb:99:5:100:20 | elsif ... | false | -| raise.rb:99:11:99:15 | ... < ... | raise.rb:100:15:100:19 | x < 0 | true | -| raise.rb:99:11:99:15 | ... < ... | raise.rb:104:5:104:23 | [ensure: exception] self | exception | +| raise.rb:99:11:99:15 | ... < ... | raise.rb:99:11:99:15 | After ... < ... [false] | false | +| raise.rb:99:11:99:15 | ... < ... | raise.rb:99:11:99:15 | After ... < ... [true] | true | +| raise.rb:99:11:99:15 | ... < ... | raise.rb:103:3:111:7 | ensure ... | exception | +| raise.rb:99:11:99:15 | After ... < ... [false] | raise.rb:99:5:100:20 | After elsif ... | | +| raise.rb:99:11:99:15 | After ... < ... [true] | raise.rb:99:16:100:20 | then ... | | +| raise.rb:99:11:99:15 | Before ... < ... | raise.rb:99:11:99:11 | x | | | raise.rb:99:15:99:15 | 0 | raise.rb:99:11:99:15 | ... < ... | | -| raise.rb:100:7:100:20 | return | raise.rb:104:5:104:23 | [ensure: return] self | return | -| raise.rb:100:14:100:20 | "x < 0" | raise.rb:100:7:100:20 | return | | +| raise.rb:99:16:100:20 | then ... | raise.rb:100:7:100:20 | Before return | | +| raise.rb:100:7:100:20 | Before return | raise.rb:100:14:100:20 | Before "x < 0" | | +| raise.rb:100:7:100:20 | return | raise.rb:103:3:111:7 | ensure ... | return | +| raise.rb:100:14:100:20 | "x < 0" | raise.rb:100:14:100:20 | After "x < 0" | | +| raise.rb:100:14:100:20 | After "x < 0" | raise.rb:100:7:100:20 | return | | +| raise.rb:100:14:100:20 | Before "x < 0" | raise.rb:100:15:100:19 | x < 0 | | | raise.rb:100:15:100:19 | x < 0 | raise.rb:100:14:100:20 | "x < 0" | | -| raise.rb:102:5:102:22 | call to puts | raise.rb:104:5:104:23 | [ensure: exception] self | exception | -| raise.rb:102:5:102:22 | call to puts | raise.rb:104:5:104:23 | self | | -| raise.rb:102:5:102:22 | self | raise.rb:102:11:102:21 | 0 <= x <= 2 | | -| raise.rb:102:10:102:22 | "0 <= x <= 2" | raise.rb:102:5:102:22 | call to puts | | +| raise.rb:102:5:102:22 | After call to puts | raise.rb:103:3:111:7 | ensure ... | | +| raise.rb:102:5:102:22 | Before call to puts | raise.rb:102:5:102:22 | self | | +| raise.rb:102:5:102:22 | call to puts | raise.rb:102:5:102:22 | After call to puts | | +| raise.rb:102:5:102:22 | call to puts | raise.rb:103:3:111:7 | ensure ... | exception | +| raise.rb:102:5:102:22 | self | raise.rb:102:10:102:22 | Before "0 <= x <= 2" | | +| raise.rb:102:10:102:22 | "0 <= x <= 2" | raise.rb:102:10:102:22 | After "0 <= x <= 2" | | +| raise.rb:102:10:102:22 | After "0 <= x <= 2" | raise.rb:102:5:102:22 | call to puts | | +| raise.rb:102:10:102:22 | Before "0 <= x <= 2" | raise.rb:102:11:102:21 | 0 <= x <= 2 | | | raise.rb:102:11:102:21 | 0 <= x <= 2 | raise.rb:102:10:102:22 | "0 <= x <= 2" | | -| raise.rb:103:3:111:7 | [ensure: exception] ensure ... | raise.rb:115:3:115:22 | [ensure: exception] self | exception | -| raise.rb:103:3:111:7 | [ensure: return] ensure ... | raise.rb:115:3:115:22 | [ensure: return] self | return | -| raise.rb:103:3:111:7 | ensure ... | raise.rb:113:3:113:15 | self | | -| raise.rb:104:5:104:23 | [ensure: exception] call to puts | raise.rb:106:10:106:11 | [ensure: exception] b1 | | -| raise.rb:104:5:104:23 | [ensure: exception] call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | -| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:104:11:104:22 | [ensure: exception] outer ensure | | -| raise.rb:104:5:104:23 | [ensure: return] call to puts | raise.rb:106:10:106:11 | [ensure: return] b1 | | -| raise.rb:104:5:104:23 | [ensure: return] call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | -| raise.rb:104:5:104:23 | [ensure: return] self | raise.rb:104:11:104:22 | [ensure: return] outer ensure | | -| raise.rb:104:5:104:23 | call to puts | raise.rb:106:10:106:11 | b1 | | -| raise.rb:104:5:104:23 | call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | -| raise.rb:104:5:104:23 | self | raise.rb:104:11:104:22 | outer ensure | | -| raise.rb:104:10:104:23 | "outer ensure" | raise.rb:104:5:104:23 | call to puts | | -| raise.rb:104:10:104:23 | [ensure: exception] "outer ensure" | raise.rb:104:5:104:23 | [ensure: exception] call to puts | | -| raise.rb:104:10:104:23 | [ensure: return] "outer ensure" | raise.rb:104:5:104:23 | [ensure: return] call to puts | | -| raise.rb:104:11:104:22 | [ensure: exception] outer ensure | raise.rb:104:10:104:23 | [ensure: exception] "outer ensure" | | -| raise.rb:104:11:104:22 | [ensure: return] outer ensure | raise.rb:104:10:104:23 | [ensure: return] "outer ensure" | | +| raise.rb:103:3:111:7 | After ensure ... | raise.rb:96:3:112:5 | After begin ... | | +| raise.rb:103:3:111:7 | After ensure ... | raise.rb:114:1:118:5 | ensure ... | exception, return | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:104:5:104:23 | Before call to puts | | +| raise.rb:104:5:104:23 | After call to puts | raise.rb:105:5:111:7 | begin ... | | +| raise.rb:104:5:104:23 | Before call to puts | raise.rb:104:5:104:23 | self | | +| raise.rb:104:5:104:23 | call to puts | raise.rb:104:5:104:23 | After call to puts | | +| raise.rb:104:5:104:23 | call to puts | raise.rb:114:1:118:5 | ensure ... | exception | +| raise.rb:104:5:104:23 | self | raise.rb:104:10:104:23 | Before "outer ensure" | | +| raise.rb:104:10:104:23 | "outer ensure" | raise.rb:104:10:104:23 | After "outer ensure" | | +| raise.rb:104:10:104:23 | After "outer ensure" | raise.rb:104:5:104:23 | call to puts | | +| raise.rb:104:10:104:23 | Before "outer ensure" | raise.rb:104:11:104:22 | outer ensure | | | raise.rb:104:11:104:22 | outer ensure | raise.rb:104:10:104:23 | "outer ensure" | | -| raise.rb:106:7:108:9 | [ensure: exception] if ... | raise.rb:110:7:110:25 | [ensure: exception] self | | -| raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:110:7:110:25 | [ensure: return] self | | -| raise.rb:106:7:108:9 | if ... | raise.rb:110:7:110:25 | self | | -| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:106:7:108:9 | [ensure: exception] if ... | false | -| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:107:9:107:26 | [ensure: exception] self | true | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:106:7:108:9 | [ensure: return] if ... | false | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:107:9:107:26 | [ensure: return] self | true | -| raise.rb:106:10:106:11 | b1 | raise.rb:106:7:108:9 | if ... | false | -| raise.rb:106:10:106:11 | b1 | raise.rb:107:9:107:26 | self | true | -| raise.rb:107:9:107:26 | [ensure: exception] call to raise | raise.rb:110:7:110:25 | [ensure: exception, ensure(1): exception] self | exception | -| raise.rb:107:9:107:26 | [ensure: exception] self | raise.rb:107:16:107:25 | [ensure: exception] b1 is true | | -| raise.rb:107:9:107:26 | [ensure: return] call to raise | raise.rb:110:7:110:25 | [ensure: return, ensure(1): exception] self | exception | -| raise.rb:107:9:107:26 | [ensure: return] self | raise.rb:107:16:107:25 | [ensure: return] b1 is true | | -| raise.rb:107:9:107:26 | call to raise | raise.rb:110:7:110:25 | [ensure(1): exception] self | exception | -| raise.rb:107:9:107:26 | self | raise.rb:107:16:107:25 | b1 is true | | -| raise.rb:107:15:107:26 | "b1 is true" | raise.rb:107:9:107:26 | call to raise | | -| raise.rb:107:15:107:26 | [ensure: exception] "b1 is true" | raise.rb:107:9:107:26 | [ensure: exception] call to raise | | -| raise.rb:107:15:107:26 | [ensure: return] "b1 is true" | raise.rb:107:9:107:26 | [ensure: return] call to raise | | -| raise.rb:107:16:107:25 | [ensure: exception] b1 is true | raise.rb:107:15:107:26 | [ensure: exception] "b1 is true" | | -| raise.rb:107:16:107:25 | [ensure: return] b1 is true | raise.rb:107:15:107:26 | [ensure: return] "b1 is true" | | +| raise.rb:105:5:111:7 | After begin ... | raise.rb:103:3:111:7 | After ensure ... | | +| raise.rb:105:5:111:7 | begin ... | raise.rb:106:7:108:9 | if ... | | +| raise.rb:106:7:108:9 | After if ... | raise.rb:109:5:110:25 | ensure ... | | +| raise.rb:106:7:108:9 | if ... | raise.rb:106:10:106:11 | b1 | | +| raise.rb:106:10:106:11 | After b1 [false] | raise.rb:106:7:108:9 | After if ... | | +| raise.rb:106:10:106:11 | After b1 [true] | raise.rb:106:12:107:26 | then ... | | +| raise.rb:106:10:106:11 | b1 | raise.rb:106:10:106:11 | After b1 [false] | false | +| raise.rb:106:10:106:11 | b1 | raise.rb:106:10:106:11 | After b1 [true] | true | +| raise.rb:106:12:107:26 | then ... | raise.rb:107:9:107:26 | Before call to raise | | +| raise.rb:107:9:107:26 | Before call to raise | raise.rb:107:9:107:26 | self | | +| raise.rb:107:9:107:26 | call to raise | raise.rb:109:5:110:25 | ensure ... | exception | +| raise.rb:107:9:107:26 | self | raise.rb:107:15:107:26 | Before "b1 is true" | | +| raise.rb:107:15:107:26 | "b1 is true" | raise.rb:107:15:107:26 | After "b1 is true" | | +| raise.rb:107:15:107:26 | After "b1 is true" | raise.rb:107:9:107:26 | call to raise | | +| raise.rb:107:15:107:26 | Before "b1 is true" | raise.rb:107:16:107:25 | b1 is true | | | raise.rb:107:16:107:25 | b1 is true | raise.rb:107:15:107:26 | "b1 is true" | | -| raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | raise.rb:115:3:115:22 | [ensure: exception] self | exception | -| raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | raise.rb:115:3:115:22 | [ensure: exception] self | exception | -| raise.rb:109:5:110:25 | [ensure: exception] ensure ... | raise.rb:103:3:111:7 | [ensure: exception] ensure ... | | -| raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | raise.rb:115:3:115:22 | [ensure: exception] self | exception | -| raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:103:3:111:7 | [ensure: return] ensure ... | | -| raise.rb:109:5:110:25 | ensure ... | raise.rb:103:3:111:7 | ensure ... | | -| raise.rb:110:7:110:25 | [ensure(1): exception] call to puts | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | | -| raise.rb:110:7:110:25 | [ensure(1): exception] call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | -| raise.rb:110:7:110:25 | [ensure(1): exception] self | raise.rb:110:13:110:24 | [ensure(1): exception] inner ensure | | -| raise.rb:110:7:110:25 | [ensure: exception, ensure(1): exception] call to puts | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | | -| raise.rb:110:7:110:25 | [ensure: exception, ensure(1): exception] call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | -| raise.rb:110:7:110:25 | [ensure: exception, ensure(1): exception] self | raise.rb:110:13:110:24 | [ensure: exception, ensure(1): exception] inner ensure | | -| raise.rb:110:7:110:25 | [ensure: exception] call to puts | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | | -| raise.rb:110:7:110:25 | [ensure: exception] call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | -| raise.rb:110:7:110:25 | [ensure: exception] self | raise.rb:110:13:110:24 | [ensure: exception] inner ensure | | -| raise.rb:110:7:110:25 | [ensure: return, ensure(1): exception] call to puts | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | | -| raise.rb:110:7:110:25 | [ensure: return, ensure(1): exception] call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | -| raise.rb:110:7:110:25 | [ensure: return, ensure(1): exception] self | raise.rb:110:13:110:24 | [ensure: return, ensure(1): exception] inner ensure | | -| raise.rb:110:7:110:25 | [ensure: return] call to puts | raise.rb:109:5:110:25 | [ensure: return] ensure ... | | -| raise.rb:110:7:110:25 | [ensure: return] call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | -| raise.rb:110:7:110:25 | [ensure: return] self | raise.rb:110:13:110:24 | [ensure: return] inner ensure | | -| raise.rb:110:7:110:25 | call to puts | raise.rb:109:5:110:25 | ensure ... | | -| raise.rb:110:7:110:25 | call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | -| raise.rb:110:7:110:25 | self | raise.rb:110:13:110:24 | inner ensure | | -| raise.rb:110:12:110:25 | "inner ensure" | raise.rb:110:7:110:25 | call to puts | | -| raise.rb:110:12:110:25 | [ensure(1): exception] "inner ensure" | raise.rb:110:7:110:25 | [ensure(1): exception] call to puts | | -| raise.rb:110:12:110:25 | [ensure: exception, ensure(1): exception] "inner ensure" | raise.rb:110:7:110:25 | [ensure: exception, ensure(1): exception] call to puts | | -| raise.rb:110:12:110:25 | [ensure: exception] "inner ensure" | raise.rb:110:7:110:25 | [ensure: exception] call to puts | | -| raise.rb:110:12:110:25 | [ensure: return, ensure(1): exception] "inner ensure" | raise.rb:110:7:110:25 | [ensure: return, ensure(1): exception] call to puts | | -| raise.rb:110:12:110:25 | [ensure: return] "inner ensure" | raise.rb:110:7:110:25 | [ensure: return] call to puts | | -| raise.rb:110:13:110:24 | [ensure(1): exception] inner ensure | raise.rb:110:12:110:25 | [ensure(1): exception] "inner ensure" | | -| raise.rb:110:13:110:24 | [ensure: exception, ensure(1): exception] inner ensure | raise.rb:110:12:110:25 | [ensure: exception, ensure(1): exception] "inner ensure" | | -| raise.rb:110:13:110:24 | [ensure: exception] inner ensure | raise.rb:110:12:110:25 | [ensure: exception] "inner ensure" | | -| raise.rb:110:13:110:24 | [ensure: return, ensure(1): exception] inner ensure | raise.rb:110:12:110:25 | [ensure: return, ensure(1): exception] "inner ensure" | | -| raise.rb:110:13:110:24 | [ensure: return] inner ensure | raise.rb:110:12:110:25 | [ensure: return] "inner ensure" | | +| raise.rb:109:5:110:25 | After ensure ... | raise.rb:105:5:111:7 | After begin ... | | +| raise.rb:109:5:110:25 | After ensure ... | raise.rb:114:1:118:5 | ensure ... | exception | +| raise.rb:109:5:110:25 | ensure ... | raise.rb:110:7:110:25 | Before call to puts | | +| raise.rb:110:7:110:25 | After call to puts | raise.rb:109:5:110:25 | After ensure ... | | +| raise.rb:110:7:110:25 | Before call to puts | raise.rb:110:7:110:25 | self | | +| raise.rb:110:7:110:25 | call to puts | raise.rb:110:7:110:25 | After call to puts | | +| raise.rb:110:7:110:25 | call to puts | raise.rb:114:1:118:5 | ensure ... | exception | +| raise.rb:110:7:110:25 | self | raise.rb:110:12:110:25 | Before "inner ensure" | | +| raise.rb:110:12:110:25 | "inner ensure" | raise.rb:110:12:110:25 | After "inner ensure" | | +| raise.rb:110:12:110:25 | After "inner ensure" | raise.rb:110:7:110:25 | call to puts | | +| raise.rb:110:12:110:25 | Before "inner ensure" | raise.rb:110:13:110:24 | inner ensure | | | raise.rb:110:13:110:24 | inner ensure | raise.rb:110:12:110:25 | "inner ensure" | | -| raise.rb:113:3:113:15 | call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | -| raise.rb:113:3:113:15 | call to puts | raise.rb:115:3:115:22 | self | | -| raise.rb:113:3:113:15 | self | raise.rb:113:9:113:14 | End m9 | | -| raise.rb:113:8:113:15 | "End m9" | raise.rb:113:3:113:15 | call to puts | | +| raise.rb:113:3:113:15 | After call to puts | raise.rb:114:1:118:5 | ensure ... | | +| raise.rb:113:3:113:15 | Before call to puts | raise.rb:113:3:113:15 | self | | +| raise.rb:113:3:113:15 | call to puts | raise.rb:113:3:113:15 | After call to puts | | +| raise.rb:113:3:113:15 | call to puts | raise.rb:114:1:118:5 | ensure ... | exception | +| raise.rb:113:3:113:15 | self | raise.rb:113:8:113:15 | Before "End m9" | | +| raise.rb:113:8:113:15 | "End m9" | raise.rb:113:8:113:15 | After "End m9" | | +| raise.rb:113:8:113:15 | After "End m9" | raise.rb:113:3:113:15 | call to puts | | +| raise.rb:113:8:113:15 | Before "End m9" | raise.rb:113:9:113:14 | End m9 | | | raise.rb:113:9:113:14 | End m9 | raise.rb:113:8:113:15 | "End m9" | | -| raise.rb:114:1:118:5 | [ensure: exception] ensure ... | raise.rb:94:1:119:3 | exit m9 (abnormal) | exception | -| raise.rb:114:1:118:5 | [ensure: return] ensure ... | raise.rb:94:1:119:3 | exit m9 (normal) | return | -| raise.rb:114:1:118:5 | ensure ... | raise.rb:94:1:119:3 | exit m9 (normal) | | -| raise.rb:115:3:115:22 | [ensure: exception] call to puts | raise.rb:116:6:116:7 | [ensure: exception] b2 | | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:115:9:115:21 | [ensure: exception] method ensure | | -| raise.rb:115:3:115:22 | [ensure: return] call to puts | raise.rb:116:6:116:7 | [ensure: return] b2 | | -| raise.rb:115:3:115:22 | [ensure: return] self | raise.rb:115:9:115:21 | [ensure: return] method ensure | | -| raise.rb:115:3:115:22 | call to puts | raise.rb:116:6:116:7 | b2 | | -| raise.rb:115:3:115:22 | self | raise.rb:115:9:115:21 | method ensure | | -| raise.rb:115:8:115:22 | "method ensure" | raise.rb:115:3:115:22 | call to puts | | -| raise.rb:115:8:115:22 | [ensure: exception] "method ensure" | raise.rb:115:3:115:22 | [ensure: exception] call to puts | | -| raise.rb:115:8:115:22 | [ensure: return] "method ensure" | raise.rb:115:3:115:22 | [ensure: return] call to puts | | -| raise.rb:115:9:115:21 | [ensure: exception] method ensure | raise.rb:115:8:115:22 | [ensure: exception] "method ensure" | | -| raise.rb:115:9:115:21 | [ensure: return] method ensure | raise.rb:115:8:115:22 | [ensure: return] "method ensure" | | +| raise.rb:114:1:118:5 | After ensure ... | raise.rb:94:1:119:3 | Exceptional Exit | exception | +| raise.rb:114:1:118:5 | After ensure ... | raise.rb:94:1:119:3 | Normal Exit | return | +| raise.rb:114:1:118:5 | After ensure ... | raise.rb:95:3:118:5 | After ... | | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:115:3:115:22 | Before call to puts | | +| raise.rb:115:3:115:22 | After call to puts | raise.rb:116:3:118:5 | if ... | | +| raise.rb:115:3:115:22 | Before call to puts | raise.rb:115:3:115:22 | self | | +| raise.rb:115:3:115:22 | call to puts | raise.rb:115:3:115:22 | After call to puts | | +| raise.rb:115:3:115:22 | self | raise.rb:115:8:115:22 | Before "method ensure" | | +| raise.rb:115:8:115:22 | "method ensure" | raise.rb:115:8:115:22 | After "method ensure" | | +| raise.rb:115:8:115:22 | After "method ensure" | raise.rb:115:3:115:22 | call to puts | | +| raise.rb:115:8:115:22 | Before "method ensure" | raise.rb:115:9:115:21 | method ensure | | | raise.rb:115:9:115:21 | method ensure | raise.rb:115:8:115:22 | "method ensure" | | -| raise.rb:116:3:118:5 | [ensure: exception] if ... | raise.rb:114:1:118:5 | [ensure: exception] ensure ... | | -| raise.rb:116:3:118:5 | [ensure: return] if ... | raise.rb:114:1:118:5 | [ensure: return] ensure ... | | -| raise.rb:116:3:118:5 | if ... | raise.rb:114:1:118:5 | ensure ... | | -| raise.rb:116:6:116:7 | [ensure: exception] b2 | raise.rb:116:3:118:5 | [ensure: exception] if ... | false | -| raise.rb:116:6:116:7 | [ensure: exception] b2 | raise.rb:117:5:117:22 | [ensure: exception] self | true | -| raise.rb:116:6:116:7 | [ensure: return] b2 | raise.rb:116:3:118:5 | [ensure: return] if ... | false | -| raise.rb:116:6:116:7 | [ensure: return] b2 | raise.rb:117:5:117:22 | [ensure: return] self | true | -| raise.rb:116:6:116:7 | b2 | raise.rb:116:3:118:5 | if ... | false | -| raise.rb:116:6:116:7 | b2 | raise.rb:117:5:117:22 | self | true | -| raise.rb:117:5:117:22 | [ensure: exception] call to raise | raise.rb:94:1:119:3 | exit m9 (abnormal) | exception | -| raise.rb:117:5:117:22 | [ensure: exception] self | raise.rb:117:12:117:21 | [ensure: exception] b2 is true | | -| raise.rb:117:5:117:22 | [ensure: return] call to raise | raise.rb:94:1:119:3 | exit m9 (abnormal) | exception | -| raise.rb:117:5:117:22 | [ensure: return] self | raise.rb:117:12:117:21 | [ensure: return] b2 is true | | -| raise.rb:117:5:117:22 | call to raise | raise.rb:94:1:119:3 | exit m9 (abnormal) | exception | -| raise.rb:117:5:117:22 | self | raise.rb:117:12:117:21 | b2 is true | | -| raise.rb:117:11:117:22 | "b2 is true" | raise.rb:117:5:117:22 | call to raise | | -| raise.rb:117:11:117:22 | [ensure: exception] "b2 is true" | raise.rb:117:5:117:22 | [ensure: exception] call to raise | | -| raise.rb:117:11:117:22 | [ensure: return] "b2 is true" | raise.rb:117:5:117:22 | [ensure: return] call to raise | | -| raise.rb:117:12:117:21 | [ensure: exception] b2 is true | raise.rb:117:11:117:22 | [ensure: exception] "b2 is true" | | -| raise.rb:117:12:117:21 | [ensure: return] b2 is true | raise.rb:117:11:117:22 | [ensure: return] "b2 is true" | | +| raise.rb:116:3:118:5 | After if ... | raise.rb:114:1:118:5 | After ensure ... | | +| raise.rb:116:3:118:5 | if ... | raise.rb:116:6:116:7 | b2 | | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:116:3:118:5 | After if ... | | +| raise.rb:116:6:116:7 | After b2 [true] | raise.rb:116:8:117:22 | then ... | | +| raise.rb:116:6:116:7 | b2 | raise.rb:116:6:116:7 | After b2 [false] | false | +| raise.rb:116:6:116:7 | b2 | raise.rb:116:6:116:7 | After b2 [true] | true | +| raise.rb:116:8:117:22 | then ... | raise.rb:117:5:117:22 | Before call to raise | | +| raise.rb:117:5:117:22 | Before call to raise | raise.rb:117:5:117:22 | self | | +| raise.rb:117:5:117:22 | call to raise | raise.rb:94:1:119:3 | Exceptional Exit | exception | +| raise.rb:117:5:117:22 | self | raise.rb:117:11:117:22 | Before "b2 is true" | | +| raise.rb:117:11:117:22 | "b2 is true" | raise.rb:117:11:117:22 | After "b2 is true" | | +| raise.rb:117:11:117:22 | After "b2 is true" | raise.rb:117:5:117:22 | call to raise | | +| raise.rb:117:11:117:22 | Before "b2 is true" | raise.rb:117:12:117:21 | b2 is true | | | raise.rb:117:12:117:21 | b2 is true | raise.rb:117:11:117:22 | "b2 is true" | | -| raise.rb:121:1:126:3 | enter m10 | raise.rb:121:9:121:9 | p | | -| raise.rb:121:1:126:3 | exit m10 (abnormal) | raise.rb:121:1:126:3 | exit m10 | | -| raise.rb:121:1:126:3 | exit m10 (normal) | raise.rb:121:1:126:3 | exit m10 | | +| raise.rb:121:1:126:3 | Entry | raise.rb:121:9:121:9 | p | | +| raise.rb:121:1:126:3 | Exceptional Exit | raise.rb:121:1:126:3 | Exit | | +| raise.rb:121:1:126:3 | Normal Exit | raise.rb:121:1:126:3 | Exit | | | raise.rb:121:1:126:3 | m10 | raise.rb:128:1:140:3 | m11 | | -| raise.rb:121:9:121:9 | p | raise.rb:121:14:121:30 | self | false, no-match, true | -| raise.rb:121:9:121:9 | p | raise.rb:125:3:125:51 | self | match | -| raise.rb:121:14:121:30 | call to raise | raise.rb:121:1:126:3 | exit m10 (abnormal) | exception | -| raise.rb:121:14:121:30 | self | raise.rb:121:21:121:29 | Exception | | -| raise.rb:121:20:121:30 | "Exception" | raise.rb:121:14:121:30 | call to raise | | +| raise.rb:121:9:121:9 | After p [match] | raise.rb:122:1:125:51 | ... | | +| raise.rb:121:9:121:9 | After p [no-match] | raise.rb:121:13:121:31 | ( ... ) | | +| raise.rb:121:9:121:9 | p | raise.rb:121:9:121:9 | After p [match] | match | +| raise.rb:121:9:121:9 | p | raise.rb:121:9:121:9 | After p [no-match] | no-match | +| raise.rb:121:13:121:31 | ( ... ) | raise.rb:121:14:121:30 | Before call to raise | | +| raise.rb:121:14:121:30 | Before call to raise | raise.rb:121:14:121:30 | self | | +| raise.rb:121:14:121:30 | call to raise | raise.rb:121:1:126:3 | Exceptional Exit | exception | +| raise.rb:121:14:121:30 | self | raise.rb:121:20:121:30 | Before "Exception" | | +| raise.rb:121:20:121:30 | "Exception" | raise.rb:121:20:121:30 | After "Exception" | | +| raise.rb:121:20:121:30 | After "Exception" | raise.rb:121:14:121:30 | call to raise | | +| raise.rb:121:20:121:30 | Before "Exception" | raise.rb:121:21:121:29 | Exception | | | raise.rb:121:21:121:29 | Exception | raise.rb:121:20:121:30 | "Exception" | | -| raise.rb:124:1:125:51 | ensure ... | raise.rb:121:1:126:3 | exit m10 (normal) | | -| raise.rb:125:3:125:51 | call to puts | raise.rb:124:1:125:51 | ensure ... | | -| raise.rb:125:3:125:51 | self | raise.rb:125:9:125:50 | Will not get executed if p is not supplied | | -| raise.rb:125:8:125:51 | "Will not get executed if p is..." | raise.rb:125:3:125:51 | call to puts | | +| raise.rb:122:1:125:51 | ... | raise.rb:124:1:125:51 | ensure ... | | +| raise.rb:122:1:125:51 | After ... | raise.rb:121:1:126:3 | Normal Exit | | +| raise.rb:124:1:125:51 | After ensure ... | raise.rb:122:1:125:51 | After ... | | +| raise.rb:124:1:125:51 | ensure ... | raise.rb:125:3:125:51 | Before call to puts | | +| raise.rb:125:3:125:51 | After call to puts | raise.rb:124:1:125:51 | After ensure ... | | +| raise.rb:125:3:125:51 | Before call to puts | raise.rb:125:3:125:51 | self | | +| raise.rb:125:3:125:51 | call to puts | raise.rb:125:3:125:51 | After call to puts | | +| raise.rb:125:3:125:51 | self | raise.rb:125:8:125:51 | Before "Will not get executed if p is..." | | +| raise.rb:125:8:125:51 | "Will not get executed if p is..." | raise.rb:125:8:125:51 | After "Will not get executed if p is..." | | +| raise.rb:125:8:125:51 | After "Will not get executed if p is..." | raise.rb:125:3:125:51 | call to puts | | +| raise.rb:125:8:125:51 | Before "Will not get executed if p is..." | raise.rb:125:9:125:50 | Will not get executed if p is not supplied | | | raise.rb:125:9:125:50 | Will not get executed if p is not supplied | raise.rb:125:8:125:51 | "Will not get executed if p is..." | | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:128:9:128:9 | b | | -| raise.rb:128:1:140:3 | exit m11 (abnormal) | raise.rb:128:1:140:3 | exit m11 | | -| raise.rb:128:1:140:3 | exit m11 (normal) | raise.rb:128:1:140:3 | exit m11 | | +| raise.rb:128:1:140:3 | Entry | raise.rb:128:9:128:9 | b | | +| raise.rb:128:1:140:3 | Exceptional Exit | raise.rb:128:1:140:3 | Exit | | +| raise.rb:128:1:140:3 | Normal Exit | raise.rb:128:1:140:3 | Exit | | | raise.rb:128:1:140:3 | m11 | raise.rb:142:1:148:3 | m12 | | -| raise.rb:128:9:128:9 | b | raise.rb:130:8:130:8 | b | | -| raise.rb:130:5:132:7 | if ... | raise.rb:137:5:137:17 | self | | -| raise.rb:130:8:130:8 | b | raise.rb:130:5:132:7 | if ... | false | -| raise.rb:130:8:130:8 | b | raise.rb:131:7:131:22 | self | true | -| raise.rb:131:7:131:22 | call to raise | raise.rb:133:10:133:19 | ExceptionA | exception | +| raise.rb:128:9:128:9 | b | raise.rb:129:3:139:16 | ... | | +| raise.rb:129:3:138:5 | After begin ... | raise.rb:139:3:139:16 | Before call to puts | | +| raise.rb:129:3:138:5 | begin ... | raise.rb:130:5:132:7 | if ... | | +| raise.rb:129:3:139:16 | ... | raise.rb:129:3:138:5 | begin ... | | +| raise.rb:129:3:139:16 | After ... | raise.rb:128:1:140:3 | Normal Exit | | +| raise.rb:130:5:132:7 | After if ... | raise.rb:136:3:137:17 | ensure ... | | +| raise.rb:130:5:132:7 | if ... | raise.rb:130:8:130:8 | b | | +| raise.rb:130:8:130:8 | After b [false] | raise.rb:130:5:132:7 | After if ... | | +| raise.rb:130:8:130:8 | After b [true] | raise.rb:130:9:131:22 | then ... | | +| raise.rb:130:8:130:8 | b | raise.rb:130:8:130:8 | After b [false] | false | +| raise.rb:130:8:130:8 | b | raise.rb:130:8:130:8 | After b [true] | true | +| raise.rb:130:9:131:22 | then ... | raise.rb:131:7:131:22 | Before call to raise | | +| raise.rb:131:7:131:22 | Before call to raise | raise.rb:131:7:131:22 | self | | +| raise.rb:131:7:131:22 | call to raise | raise.rb:133:3:133:19 | rescue ... | exception | | raise.rb:131:7:131:22 | self | raise.rb:131:13:131:22 | ExceptionA | | | raise.rb:131:13:131:22 | ExceptionA | raise.rb:131:7:131:22 | call to raise | | -| raise.rb:133:3:133:19 | rescue ... | raise.rb:137:5:137:17 | self | | -| raise.rb:133:10:133:19 | ExceptionA | raise.rb:133:3:133:19 | rescue ... | match | -| raise.rb:133:10:133:19 | ExceptionA | raise.rb:134:10:134:19 | ExceptionB | no-match | -| raise.rb:134:3:135:21 | rescue ... | raise.rb:137:5:137:17 | self | | -| raise.rb:134:10:134:19 | ExceptionB | raise.rb:135:5:135:21 | self | match | -| raise.rb:134:10:134:19 | ExceptionB | raise.rb:137:5:137:17 | [ensure: exception] self | exception | -| raise.rb:134:20:135:21 | then ... | raise.rb:134:3:135:21 | rescue ... | | -| raise.rb:135:5:135:21 | call to puts | raise.rb:134:20:135:21 | then ... | | -| raise.rb:135:5:135:21 | self | raise.rb:135:11:135:20 | ExceptionB | | -| raise.rb:135:10:135:21 | "ExceptionB" | raise.rb:135:5:135:21 | call to puts | | +| raise.rb:133:3:133:19 | After rescue ... [no-match] | raise.rb:134:3:135:21 | rescue ... | | +| raise.rb:133:3:133:19 | [CatchClauseEmptyBody] rescue ... | raise.rb:136:3:137:17 | ensure ... | | +| raise.rb:133:3:133:19 | rescue ... | raise.rb:133:10:133:19 | ExceptionA | | +| raise.rb:133:10:133:19 | After ExceptionA [match] | raise.rb:133:3:133:19 | [CatchClauseEmptyBody] rescue ... | | +| raise.rb:133:10:133:19 | After ExceptionA [no-match] | raise.rb:133:3:133:19 | After rescue ... [no-match] | no-match | +| raise.rb:133:10:133:19 | ExceptionA | raise.rb:133:10:133:19 | After ExceptionA [match] | match | +| raise.rb:133:10:133:19 | ExceptionA | raise.rb:133:10:133:19 | After ExceptionA [no-match] | no-match | +| raise.rb:134:3:135:21 | After rescue ... [no-match] | raise.rb:136:3:137:17 | ensure ... | exception | +| raise.rb:134:3:135:21 | rescue ... | raise.rb:134:10:134:19 | ExceptionB | | +| raise.rb:134:10:134:19 | After ExceptionB [match] | raise.rb:134:20:135:21 | then ... | | +| raise.rb:134:10:134:19 | After ExceptionB [no-match] | raise.rb:134:3:135:21 | After rescue ... [no-match] | no-match | +| raise.rb:134:10:134:19 | ExceptionB | raise.rb:134:10:134:19 | After ExceptionB [match] | match | +| raise.rb:134:10:134:19 | ExceptionB | raise.rb:134:10:134:19 | After ExceptionB [no-match] | no-match | +| raise.rb:134:20:135:21 | After then ... | raise.rb:136:3:137:17 | ensure ... | | +| raise.rb:134:20:135:21 | then ... | raise.rb:135:5:135:21 | Before call to puts | | +| raise.rb:135:5:135:21 | After call to puts | raise.rb:134:20:135:21 | After then ... | | +| raise.rb:135:5:135:21 | Before call to puts | raise.rb:135:5:135:21 | self | | +| raise.rb:135:5:135:21 | call to puts | raise.rb:135:5:135:21 | After call to puts | | +| raise.rb:135:5:135:21 | self | raise.rb:135:10:135:21 | Before "ExceptionB" | | +| raise.rb:135:10:135:21 | "ExceptionB" | raise.rb:135:10:135:21 | After "ExceptionB" | | +| raise.rb:135:10:135:21 | After "ExceptionB" | raise.rb:135:5:135:21 | call to puts | | +| raise.rb:135:10:135:21 | Before "ExceptionB" | raise.rb:135:11:135:20 | ExceptionB | | | raise.rb:135:11:135:20 | ExceptionB | raise.rb:135:10:135:21 | "ExceptionB" | | -| raise.rb:136:3:137:17 | [ensure: exception] ensure ... | raise.rb:128:1:140:3 | exit m11 (abnormal) | exception | -| raise.rb:136:3:137:17 | ensure ... | raise.rb:139:3:139:16 | self | | -| raise.rb:137:5:137:17 | [ensure: exception] call to puts | raise.rb:136:3:137:17 | [ensure: exception] ensure ... | | -| raise.rb:137:5:137:17 | [ensure: exception] self | raise.rb:137:11:137:16 | [ensure: exception] Ensure | | -| raise.rb:137:5:137:17 | call to puts | raise.rb:136:3:137:17 | ensure ... | | -| raise.rb:137:5:137:17 | self | raise.rb:137:11:137:16 | Ensure | | -| raise.rb:137:10:137:17 | "Ensure" | raise.rb:137:5:137:17 | call to puts | | -| raise.rb:137:10:137:17 | [ensure: exception] "Ensure" | raise.rb:137:5:137:17 | [ensure: exception] call to puts | | +| raise.rb:136:3:137:17 | After ensure ... | raise.rb:128:1:140:3 | Exceptional Exit | exception | +| raise.rb:136:3:137:17 | After ensure ... | raise.rb:129:3:138:5 | After begin ... | | +| raise.rb:136:3:137:17 | ensure ... | raise.rb:137:5:137:17 | Before call to puts | | +| raise.rb:137:5:137:17 | After call to puts | raise.rb:136:3:137:17 | After ensure ... | | +| raise.rb:137:5:137:17 | Before call to puts | raise.rb:137:5:137:17 | self | | +| raise.rb:137:5:137:17 | call to puts | raise.rb:137:5:137:17 | After call to puts | | +| raise.rb:137:5:137:17 | self | raise.rb:137:10:137:17 | Before "Ensure" | | +| raise.rb:137:10:137:17 | "Ensure" | raise.rb:137:10:137:17 | After "Ensure" | | +| raise.rb:137:10:137:17 | After "Ensure" | raise.rb:137:5:137:17 | call to puts | | +| raise.rb:137:10:137:17 | Before "Ensure" | raise.rb:137:11:137:16 | Ensure | | | raise.rb:137:11:137:16 | Ensure | raise.rb:137:10:137:17 | "Ensure" | | -| raise.rb:137:11:137:16 | [ensure: exception] Ensure | raise.rb:137:10:137:17 | [ensure: exception] "Ensure" | | -| raise.rb:139:3:139:16 | call to puts | raise.rb:128:1:140:3 | exit m11 (normal) | | -| raise.rb:139:3:139:16 | self | raise.rb:139:9:139:15 | End m11 | | -| raise.rb:139:8:139:16 | "End m11" | raise.rb:139:3:139:16 | call to puts | | +| raise.rb:139:3:139:16 | After call to puts | raise.rb:129:3:139:16 | After ... | | +| raise.rb:139:3:139:16 | Before call to puts | raise.rb:139:3:139:16 | self | | +| raise.rb:139:3:139:16 | call to puts | raise.rb:139:3:139:16 | After call to puts | | +| raise.rb:139:3:139:16 | self | raise.rb:139:8:139:16 | Before "End m11" | | +| raise.rb:139:8:139:16 | "End m11" | raise.rb:139:8:139:16 | After "End m11" | | +| raise.rb:139:8:139:16 | After "End m11" | raise.rb:139:3:139:16 | call to puts | | +| raise.rb:139:8:139:16 | Before "End m11" | raise.rb:139:9:139:15 | End m11 | | | raise.rb:139:9:139:15 | End m11 | raise.rb:139:8:139:16 | "End m11" | | -| raise.rb:142:1:148:3 | enter m12 | raise.rb:142:9:142:9 | b | | -| raise.rb:142:1:148:3 | exit m12 (normal) | raise.rb:142:1:148:3 | exit m12 | | +| raise.rb:142:1:148:3 | Entry | raise.rb:142:9:142:9 | b | | +| raise.rb:142:1:148:3 | Normal Exit | raise.rb:142:1:148:3 | Exit | | | raise.rb:142:1:148:3 | m12 | raise.rb:150:1:152:3 | m13 | | -| raise.rb:142:9:142:9 | b | raise.rb:143:6:143:6 | b | | -| raise.rb:143:3:145:5 | if ... | raise.rb:147:10:147:10 | 3 | | -| raise.rb:143:6:143:6 | b | raise.rb:143:3:145:5 | if ... | false | -| raise.rb:143:6:143:6 | b | raise.rb:144:5:144:12 | self | true | -| raise.rb:144:5:144:12 | call to raise | raise.rb:147:10:147:10 | [ensure: exception] 3 | exception | +| raise.rb:142:9:142:9 | b | raise.rb:143:3:147:10 | ... | | +| raise.rb:143:3:145:5 | After if ... | raise.rb:146:1:147:10 | ensure ... | | +| raise.rb:143:3:145:5 | if ... | raise.rb:143:6:143:6 | b | | +| raise.rb:143:3:147:10 | ... | raise.rb:143:3:145:5 | if ... | | +| raise.rb:143:6:143:6 | After b [false] | raise.rb:143:3:145:5 | After if ... | | +| raise.rb:143:6:143:6 | After b [true] | raise.rb:143:7:144:12 | then ... | | +| raise.rb:143:6:143:6 | b | raise.rb:143:6:143:6 | After b [false] | false | +| raise.rb:143:6:143:6 | b | raise.rb:143:6:143:6 | After b [true] | true | +| raise.rb:143:7:144:12 | then ... | raise.rb:144:5:144:12 | Before call to raise | | +| raise.rb:144:5:144:12 | Before call to raise | raise.rb:144:5:144:12 | self | | +| raise.rb:144:5:144:12 | call to raise | raise.rb:146:1:147:10 | ensure ... | exception | | raise.rb:144:5:144:12 | self | raise.rb:144:11:144:12 | "" | | | raise.rb:144:11:144:12 | "" | raise.rb:144:5:144:12 | call to raise | | -| raise.rb:147:3:147:10 | [ensure: exception] return | raise.rb:142:1:148:3 | exit m12 (normal) | return | -| raise.rb:147:3:147:10 | return | raise.rb:142:1:148:3 | exit m12 (normal) | return | +| raise.rb:146:1:147:10 | ensure ... | raise.rb:147:3:147:10 | Before return | | +| raise.rb:147:3:147:10 | Before return | raise.rb:147:10:147:10 | 3 | | +| raise.rb:147:3:147:10 | return | raise.rb:142:1:148:3 | Normal Exit | return | | raise.rb:147:10:147:10 | 3 | raise.rb:147:3:147:10 | return | | -| raise.rb:147:10:147:10 | [ensure: exception] 3 | raise.rb:147:3:147:10 | [ensure: exception] return | | -| raise.rb:150:1:152:3 | enter m13 | raise.rb:151:1:151:6 | ensure ... | | -| raise.rb:150:1:152:3 | exit m13 (normal) | raise.rb:150:1:152:3 | exit m13 | | +| raise.rb:150:1:152:3 | Entry | raise.rb:151:1:151:6 | ... | | +| raise.rb:150:1:152:3 | Normal Exit | raise.rb:150:1:152:3 | Exit | | | raise.rb:150:1:152:3 | m13 | raise.rb:154:1:156:3 | m14 | | -| raise.rb:151:1:151:6 | ensure ... | raise.rb:150:1:152:3 | exit m13 (normal) | | -| raise.rb:154:1:156:3 | enter m14 | raise.rb:154:9:154:15 | element | | -| raise.rb:154:1:156:3 | exit m14 (normal) | raise.rb:154:1:156:3 | exit m14 | | +| raise.rb:151:1:151:6 | ... | raise.rb:151:1:151:6 | ensure ... | | +| raise.rb:151:1:151:6 | After ... | raise.rb:150:1:152:3 | Normal Exit | | +| raise.rb:151:1:151:6 | ensure ... | raise.rb:151:1:151:6 | After ... | | +| raise.rb:154:1:156:3 | Entry | raise.rb:154:9:154:15 | element | | +| raise.rb:154:1:156:3 | Normal Exit | raise.rb:154:1:156:3 | Exit | | | raise.rb:154:1:156:3 | m14 | raise.rb:158:1:164:3 | m15 | | -| raise.rb:154:9:154:15 | element | raise.rb:155:3:155:9 | element | | +| raise.rb:154:9:154:15 | element | raise.rb:155:3:155:50 | ... | | | raise.rb:155:3:155:9 | element | raise.rb:155:16:155:50 | { ... } | | -| raise.rb:155:3:155:50 | call to each | raise.rb:154:1:156:3 | exit m14 (normal) | | -| raise.rb:155:16:155:50 | enter { ... } | raise.rb:155:19:155:22 | elem | | -| raise.rb:155:16:155:50 | exit { ... } (abnormal) | raise.rb:155:16:155:50 | exit { ... } | | -| raise.rb:155:16:155:50 | exit { ... } (normal) | raise.rb:155:16:155:50 | exit { ... } | | +| raise.rb:155:3:155:50 | ... | raise.rb:155:3:155:50 | Before call to each | | +| raise.rb:155:3:155:50 | After ... | raise.rb:154:1:156:3 | Normal Exit | | +| raise.rb:155:3:155:50 | After call to each | raise.rb:155:3:155:50 | After ... | | +| raise.rb:155:3:155:50 | Before call to each | raise.rb:155:3:155:9 | element | | +| raise.rb:155:3:155:50 | call to each | raise.rb:155:3:155:50 | After call to each | | +| raise.rb:155:16:155:50 | Entry | raise.rb:155:19:155:22 | elem | | +| raise.rb:155:16:155:50 | Exceptional Exit | raise.rb:155:16:155:50 | Exit | | +| raise.rb:155:16:155:50 | Normal Exit | raise.rb:155:16:155:50 | Exit | | | raise.rb:155:16:155:50 | { ... } | raise.rb:155:3:155:50 | call to each | | -| raise.rb:155:19:155:22 | elem | raise.rb:155:37:155:43 | element | | -| raise.rb:155:25:155:32 | call to raise | raise.rb:155:16:155:50 | exit { ... } (abnormal) | exception | +| raise.rb:155:19:155:22 | elem | raise.rb:155:25:155:48 | ... | | +| raise.rb:155:25:155:32 | Before call to raise | raise.rb:155:25:155:32 | self | | +| raise.rb:155:25:155:32 | call to raise | raise.rb:155:16:155:50 | Exceptional Exit | exception | | raise.rb:155:25:155:32 | self | raise.rb:155:31:155:32 | "" | | -| raise.rb:155:25:155:48 | ... if ... | raise.rb:155:16:155:50 | exit { ... } (normal) | | +| raise.rb:155:25:155:48 | ... | raise.rb:155:25:155:48 | ... if ... | | +| raise.rb:155:25:155:48 | ... if ... | raise.rb:155:37:155:48 | Before call to nil? | | +| raise.rb:155:25:155:48 | After ... | raise.rb:155:16:155:50 | Normal Exit | | +| raise.rb:155:25:155:48 | After ... if ... | raise.rb:155:25:155:48 | After ... | | | raise.rb:155:31:155:32 | "" | raise.rb:155:25:155:32 | call to raise | | | raise.rb:155:37:155:43 | element | raise.rb:155:37:155:48 | call to nil? | | -| raise.rb:155:37:155:48 | call to nil? | raise.rb:155:25:155:32 | self | true | -| raise.rb:155:37:155:48 | call to nil? | raise.rb:155:25:155:48 | ... if ... | false | -| raise.rb:158:1:164:3 | enter m15 | raise.rb:159:3:163:5 | self | | -| raise.rb:158:1:164:3 | exit m15 (normal) | raise.rb:158:1:164:3 | exit m15 | | +| raise.rb:155:37:155:48 | After call to nil? [false] | raise.rb:155:25:155:48 | After ... if ... | | +| raise.rb:155:37:155:48 | After call to nil? [true] | raise.rb:155:25:155:32 | Before call to raise | | +| raise.rb:155:37:155:48 | Before call to nil? | raise.rb:155:37:155:43 | element | | +| raise.rb:155:37:155:48 | call to nil? | raise.rb:155:37:155:48 | After call to nil? [false] | false | +| raise.rb:155:37:155:48 | call to nil? | raise.rb:155:37:155:48 | After call to nil? [true] | true | +| raise.rb:158:1:164:3 | Entry | raise.rb:159:3:163:5 | ... | | +| raise.rb:158:1:164:3 | Normal Exit | raise.rb:158:1:164:3 | Exit | | | raise.rb:158:1:164:3 | m15 | raise.rb:166:1:170:3 | C | | -| raise.rb:159:3:163:5 | call to foo | raise.rb:158:1:164:3 | exit m15 (normal) | | +| raise.rb:159:3:163:5 | ... | raise.rb:159:3:163:5 | Before call to foo | | +| raise.rb:159:3:163:5 | After ... | raise.rb:158:1:164:3 | Normal Exit | | +| raise.rb:159:3:163:5 | After call to foo | raise.rb:159:3:163:5 | After ... | | +| raise.rb:159:3:163:5 | Before call to foo | raise.rb:159:3:163:5 | self | | +| raise.rb:159:3:163:5 | call to foo | raise.rb:159:3:163:5 | After call to foo | | | raise.rb:159:3:163:5 | self | raise.rb:159:7:163:5 | do ... end | | +| raise.rb:159:7:163:5 | Entry | raise.rb:160:5:162:7 | ... | | +| raise.rb:159:7:163:5 | Normal Exit | raise.rb:159:7:163:5 | Exit | | | raise.rb:159:7:163:5 | do ... end | raise.rb:159:3:163:5 | call to foo | | -| raise.rb:159:7:163:5 | enter do ... end | raise.rb:160:5:162:7 | self | | -| raise.rb:159:7:163:5 | exit do ... end (normal) | raise.rb:159:7:163:5 | exit do ... end | | -| raise.rb:160:5:162:7 | call to bar | raise.rb:159:7:163:5 | exit do ... end (normal) | | +| raise.rb:160:5:162:7 | ... | raise.rb:160:5:162:7 | Before call to bar | | +| raise.rb:160:5:162:7 | After ... | raise.rb:159:7:163:5 | Normal Exit | | +| raise.rb:160:5:162:7 | After call to bar | raise.rb:160:5:162:7 | After ... | | +| raise.rb:160:5:162:7 | Before call to bar | raise.rb:160:5:162:7 | self | | +| raise.rb:160:5:162:7 | call to bar | raise.rb:160:5:162:7 | After call to bar | | | raise.rb:160:5:162:7 | self | raise.rb:160:9:162:7 | -> { ... } | | | raise.rb:160:9:162:7 | -> { ... } | raise.rb:160:5:162:7 | call to bar | | -| raise.rb:160:9:162:7 | enter -> { ... } | raise.rb:160:12:160:12 | x | | -| raise.rb:160:9:162:7 | exit -> { ... } (abnormal) | raise.rb:160:9:162:7 | exit -> { ... } | | -| raise.rb:160:9:162:7 | exit -> { ... } (normal) | raise.rb:160:9:162:7 | exit -> { ... } | | -| raise.rb:160:12:160:12 | x | raise.rb:161:23:161:23 | x | | -| raise.rb:161:7:161:14 | call to raise | raise.rb:160:9:162:7 | exit -> { ... } (abnormal) | exception | +| raise.rb:160:9:162:7 | Entry | raise.rb:160:12:160:12 | x | | +| raise.rb:160:9:162:7 | Exceptional Exit | raise.rb:160:9:162:7 | Exit | | +| raise.rb:160:9:162:7 | Normal Exit | raise.rb:160:9:162:7 | Exit | | +| raise.rb:160:12:160:12 | x | raise.rb:161:7:161:23 | ... | | +| raise.rb:161:7:161:14 | Before call to raise | raise.rb:161:7:161:14 | self | | +| raise.rb:161:7:161:14 | call to raise | raise.rb:160:9:162:7 | Exceptional Exit | exception | | raise.rb:161:7:161:14 | self | raise.rb:161:13:161:14 | "" | | -| raise.rb:161:7:161:23 | ... unless ... | raise.rb:160:9:162:7 | exit -> { ... } (normal) | | +| raise.rb:161:7:161:23 | ... | raise.rb:161:7:161:23 | ... unless ... | | +| raise.rb:161:7:161:23 | ... unless ... | raise.rb:161:23:161:23 | x | | +| raise.rb:161:7:161:23 | After ... | raise.rb:160:9:162:7 | Normal Exit | | +| raise.rb:161:7:161:23 | After ... unless ... | raise.rb:161:7:161:23 | After ... | | | raise.rb:161:13:161:14 | "" | raise.rb:161:7:161:14 | call to raise | | -| raise.rb:161:23:161:23 | x | raise.rb:161:7:161:14 | self | false | -| raise.rb:161:23:161:23 | x | raise.rb:161:7:161:23 | ... unless ... | true | -| raise.rb:166:1:170:3 | C | raise.rb:167:7:167:10 | self | | -| raise.rb:167:3:169:5 | enter m | raise.rb:168:5:168:12 | self | | -| raise.rb:167:3:169:5 | exit m (abnormal) | raise.rb:167:3:169:5 | exit m | | -| raise.rb:167:3:169:5 | m | raise.rb:172:1:182:3 | m16 | | +| raise.rb:161:23:161:23 | After x [false] | raise.rb:161:7:161:14 | Before call to raise | | +| raise.rb:161:23:161:23 | After x [true] | raise.rb:161:7:161:23 | After ... unless ... | | +| raise.rb:161:23:161:23 | x | raise.rb:161:23:161:23 | After x [false] | false | +| raise.rb:161:23:161:23 | x | raise.rb:161:23:161:23 | After x [true] | true | +| raise.rb:166:1:170:3 | After C | raise.rb:172:1:182:3 | m16 | | +| raise.rb:166:1:170:3 | C | raise.rb:167:3:169:5 | Before m | | +| raise.rb:167:3:169:5 | After m | raise.rb:166:1:170:3 | After C | | +| raise.rb:167:3:169:5 | Before m | raise.rb:167:7:167:10 | self | | +| raise.rb:167:3:169:5 | Entry | raise.rb:168:5:168:12 | ... | | +| raise.rb:167:3:169:5 | Exceptional Exit | raise.rb:167:3:169:5 | Exit | | +| raise.rb:167:3:169:5 | m | raise.rb:167:3:169:5 | After m | | | raise.rb:167:7:167:10 | self | raise.rb:167:3:169:5 | m | | -| raise.rb:168:5:168:12 | call to raise | raise.rb:167:3:169:5 | exit m (abnormal) | exception | +| raise.rb:168:5:168:12 | ... | raise.rb:168:5:168:12 | Before call to raise | | +| raise.rb:168:5:168:12 | Before call to raise | raise.rb:168:5:168:12 | self | | +| raise.rb:168:5:168:12 | call to raise | raise.rb:167:3:169:5 | Exceptional Exit | exception | | raise.rb:168:5:168:12 | self | raise.rb:168:11:168:12 | "" | | | raise.rb:168:11:168:12 | "" | raise.rb:168:5:168:12 | call to raise | | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:172:9:172:10 | b1 | | -| raise.rb:172:1:182:3 | exit m16 (abnormal) | raise.rb:172:1:182:3 | exit m16 | | -| raise.rb:172:1:182:3 | exit m16 (normal) | raise.rb:172:1:182:3 | exit m16 | | -| raise.rb:172:1:182:3 | m16 | raise.rb:1:1:182:4 | exit raise.rb (normal) | | +| raise.rb:172:1:182:3 | Entry | raise.rb:172:9:172:10 | b1 | | +| raise.rb:172:1:182:3 | Exceptional Exit | raise.rb:172:1:182:3 | Exit | | +| raise.rb:172:1:182:3 | Normal Exit | raise.rb:172:1:182:3 | Exit | | +| raise.rb:172:1:182:3 | m16 | raise.rb:1:1:182:4 | Normal Exit | | | raise.rb:172:9:172:10 | b1 | raise.rb:172:13:172:14 | b2 | | -| raise.rb:172:13:172:14 | b2 | raise.rb:174:8:174:9 | b1 | | -| raise.rb:174:8:174:9 | b1 | raise.rb:174:8:174:23 | [true] ... \|\| ... | true | -| raise.rb:174:8:174:9 | b1 | raise.rb:174:14:174:15 | b2 | false | -| raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:177:14:177:14 | 2 | false | -| raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:179:10:179:19 | ExceptionA | exception | -| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:175:14:175:14 | 1 | true | -| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:179:10:179:19 | ExceptionA | exception | +| raise.rb:172:13:172:14 | b2 | raise.rb:173:3:181:5 | ... | | +| raise.rb:173:3:181:5 | ... | raise.rb:173:3:181:5 | begin ... | | +| raise.rb:173:3:181:5 | begin ... | raise.rb:174:5:178:7 | if ... | | +| raise.rb:174:5:178:7 | if ... | raise.rb:174:8:174:23 | ... \|\| ... | | +| raise.rb:174:8:174:9 | After b1 [false] | raise.rb:174:14:174:23 | Before ... == ... | | +| raise.rb:174:8:174:9 | After b1 [true] | raise.rb:174:8:174:23 | After ... \|\| ... [true] | true | +| raise.rb:174:8:174:9 | b1 | raise.rb:174:8:174:9 | After b1 [false] | false | +| raise.rb:174:8:174:9 | b1 | raise.rb:174:8:174:9 | After b1 [true] | true | +| raise.rb:174:8:174:23 | ... \|\| ... | raise.rb:174:8:174:9 | b1 | | +| raise.rb:174:8:174:23 | After ... \|\| ... [false] | raise.rb:176:5:177:14 | else ... | | +| raise.rb:174:8:174:23 | After ... \|\| ... [true] | raise.rb:174:24:175:14 | then ... | | | raise.rb:174:14:174:15 | b2 | raise.rb:174:20:174:23 | true | | -| raise.rb:174:14:174:23 | ... == ... | raise.rb:174:8:174:23 | [false] ... \|\| ... | false | -| raise.rb:174:14:174:23 | ... == ... | raise.rb:174:8:174:23 | [true] ... \|\| ... | true | -| raise.rb:174:14:174:23 | ... == ... | raise.rb:179:10:179:19 | ExceptionA | exception | +| raise.rb:174:14:174:23 | ... == ... | raise.rb:174:14:174:23 | After ... == ... [false] | false | +| raise.rb:174:14:174:23 | ... == ... | raise.rb:174:14:174:23 | After ... == ... [true] | true | +| raise.rb:174:14:174:23 | ... == ... | raise.rb:179:3:180:12 | rescue ... | exception | +| raise.rb:174:14:174:23 | After ... == ... [false] | raise.rb:174:8:174:23 | After ... \|\| ... [false] | false | +| raise.rb:174:14:174:23 | After ... == ... [true] | raise.rb:174:8:174:23 | After ... \|\| ... [true] | true | +| raise.rb:174:14:174:23 | Before ... == ... | raise.rb:174:14:174:15 | b2 | | | raise.rb:174:20:174:23 | true | raise.rb:174:14:174:23 | ... == ... | | -| raise.rb:175:7:175:14 | return | raise.rb:172:1:182:3 | exit m16 (normal) | return | +| raise.rb:174:24:175:14 | then ... | raise.rb:175:7:175:14 | Before return | | +| raise.rb:175:7:175:14 | Before return | raise.rb:175:14:175:14 | 1 | | +| raise.rb:175:7:175:14 | return | raise.rb:172:1:182:3 | Normal Exit | return | | raise.rb:175:14:175:14 | 1 | raise.rb:175:7:175:14 | return | | -| raise.rb:177:7:177:14 | return | raise.rb:172:1:182:3 | exit m16 (normal) | return | +| raise.rb:176:5:177:14 | else ... | raise.rb:177:7:177:14 | Before return | | +| raise.rb:177:7:177:14 | Before return | raise.rb:177:14:177:14 | 2 | | +| raise.rb:177:7:177:14 | return | raise.rb:172:1:182:3 | Normal Exit | return | | raise.rb:177:14:177:14 | 2 | raise.rb:177:7:177:14 | return | | -| raise.rb:179:10:179:19 | ExceptionA | raise.rb:172:1:182:3 | exit m16 (abnormal) | exception | -| raise.rb:179:10:179:19 | ExceptionA | raise.rb:180:12:180:12 | 3 | match | -| raise.rb:180:5:180:12 | return | raise.rb:172:1:182:3 | exit m16 (normal) | return | +| raise.rb:179:3:180:12 | After rescue ... [no-match] | raise.rb:172:1:182:3 | Exceptional Exit | exception | +| raise.rb:179:3:180:12 | rescue ... | raise.rb:179:10:179:19 | ExceptionA | | +| raise.rb:179:10:179:19 | After ExceptionA [match] | raise.rb:179:20:180:12 | then ... | | +| raise.rb:179:10:179:19 | After ExceptionA [no-match] | raise.rb:179:3:180:12 | After rescue ... [no-match] | no-match | +| raise.rb:179:10:179:19 | ExceptionA | raise.rb:179:10:179:19 | After ExceptionA [match] | match | +| raise.rb:179:10:179:19 | ExceptionA | raise.rb:179:10:179:19 | After ExceptionA [no-match] | no-match | +| raise.rb:179:20:180:12 | then ... | raise.rb:180:5:180:12 | Before return | | +| raise.rb:180:5:180:12 | Before return | raise.rb:180:12:180:12 | 3 | | +| raise.rb:180:5:180:12 | return | raise.rb:172:1:182:3 | Normal Exit | return | | raise.rb:180:12:180:12 | 3 | raise.rb:180:5:180:12 | return | | diff --git a/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.expected b/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.expected index 1a70b535dc81..ff46e1293822 100644 --- a/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.expected +++ b/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.expected @@ -23,12 +23,10 @@ newStyleBarrierGuards | barrier-guards.rb:191:20:191:31 | [input] SSA phi read(foo) | | barrier-guards.rb:192:5:192:7 | foo | | barrier-guards.rb:195:4:195:15 | [input] SSA phi read(foo) | -| barrier-guards.rb:195:4:195:31 | [input] SSA phi read(foo) | | barrier-guards.rb:195:20:195:31 | [input] SSA phi read(foo) | | barrier-guards.rb:195:36:195:47 | [input] SSA phi read(foo) | | barrier-guards.rb:196:5:196:7 | foo | | barrier-guards.rb:199:4:199:15 | [input] SSA phi read(foo) | -| barrier-guards.rb:199:4:199:31 | [input] SSA phi read(foo) | | barrier-guards.rb:199:20:199:31 | [input] SSA phi read(foo) | | barrier-guards.rb:203:36:203:47 | [input] SSA phi read(foo) | | barrier-guards.rb:208:5:208:7 | foo | @@ -55,323 +53,255 @@ newStyleBarrierGuards | barrier_flow.rb:68:10:71:11 | [input] SSA phi read(x) | | barrier_flow.rb:72:5:75:11 | [input] SSA phi read(x) | controls -| barrier-guards.rb:3:4:3:15 | ... == ... | barrier-guards.rb:4:5:4:7 | foo | true | -| barrier-guards.rb:3:4:3:15 | ... == ... | barrier-guards.rb:6:5:6:7 | foo | false | -| barrier-guards.rb:9:4:9:24 | call to include? | barrier-guards.rb:10:5:10:7 | foo | true | -| barrier-guards.rb:9:4:9:24 | call to include? | barrier-guards.rb:12:5:12:7 | foo | false | -| barrier-guards.rb:15:4:15:15 | ... != ... | barrier-guards.rb:16:5:16:7 | foo | true | -| barrier-guards.rb:15:4:15:15 | ... != ... | barrier-guards.rb:18:5:18:7 | foo | false | -| barrier-guards.rb:21:8:21:19 | ... == ... | barrier-guards.rb:22:5:22:7 | foo | false | -| barrier-guards.rb:21:8:21:19 | ... == ... | barrier-guards.rb:24:5:24:7 | foo | true | -| barrier-guards.rb:27:8:27:19 | ... != ... | barrier-guards.rb:28:5:28:7 | foo | false | -| barrier-guards.rb:27:8:27:19 | ... != ... | barrier-guards.rb:30:5:30:7 | foo | true | -| barrier-guards.rb:37:4:37:20 | call to include? | barrier-guards.rb:38:5:38:7 | foo | true | -| barrier-guards.rb:37:4:37:20 | call to include? | barrier-guards.rb:40:5:40:7 | foo | false | -| barrier-guards.rb:43:4:43:15 | ... == ... | barrier-guards.rb:44:5:46:5 | self | true | -| barrier-guards.rb:49:4:49:15 | ... == ... | barrier-guards.rb:50:5:53:5 | self | true | -| barrier-guards.rb:56:4:56:15 | ... == ... | barrier-guards.rb:57:5:57:13 | my_lambda | true | -| barrier-guards.rb:70:4:70:21 | call to include? | barrier-guards.rb:71:5:71:7 | foo | true | -| barrier-guards.rb:70:4:70:21 | call to include? | barrier-guards.rb:73:5:73:7 | foo | false | -| barrier-guards.rb:76:4:76:21 | call to include? | barrier-guards.rb:77:5:77:7 | foo | true | -| barrier-guards.rb:76:4:76:21 | call to include? | barrier-guards.rb:79:5:79:7 | foo | false | -| barrier-guards.rb:82:4:82:25 | ... != ... | barrier-guards.rb:83:5:83:7 | foo | true | -| barrier-guards.rb:82:4:82:25 | ... != ... | barrier-guards.rb:85:5:85:7 | foo | false | -| barrier-guards.rb:88:4:88:25 | ... == ... | barrier-guards.rb:89:5:89:7 | foo | true | -| barrier-guards.rb:88:4:88:25 | ... == ... | barrier-guards.rb:91:5:91:7 | foo | false | -| barrier-guards.rb:96:4:96:12 | call to condition | barrier-guards.rb:97:5:97:8 | bars | true | -| barrier-guards.rb:100:4:100:21 | call to include? | barrier-guards.rb:101:5:101:7 | foo | true | -| barrier-guards.rb:100:4:100:21 | call to include? | barrier-guards.rb:103:5:103:7 | foo | false | -| barrier-guards.rb:106:4:106:4 | call to x | barrier-guards.rb:106:4:106:9 | [false] ... or ... | false | -| barrier-guards.rb:106:4:106:4 | call to x | barrier-guards.rb:106:9:106:9 | self | false | -| barrier-guards.rb:106:4:106:4 | call to x | barrier-guards.rb:109:5:109:8 | bars | false | -| barrier-guards.rb:106:4:106:9 | [false] ... or ... | barrier-guards.rb:109:5:109:8 | bars | false | -| barrier-guards.rb:106:4:106:9 | [true] ... or ... | barrier-guards.rb:107:5:107:7 | foo | true | -| barrier-guards.rb:106:9:106:9 | call to y | barrier-guards.rb:106:4:106:9 | [false] ... or ... | false | -| barrier-guards.rb:106:9:106:9 | call to y | barrier-guards.rb:109:5:109:8 | bars | false | -| barrier-guards.rb:112:4:112:4 | call to x | barrier-guards.rb:112:4:112:10 | [true] ... and ... | true | -| barrier-guards.rb:112:4:112:4 | call to x | barrier-guards.rb:112:10:112:10 | self | true | -| barrier-guards.rb:112:4:112:4 | call to x | barrier-guards.rb:113:5:113:7 | foo | true | -| barrier-guards.rb:112:4:112:10 | [false] ... and ... | barrier-guards.rb:115:5:115:8 | bars | false | -| barrier-guards.rb:112:4:112:10 | [true] ... and ... | barrier-guards.rb:113:5:113:7 | foo | true | -| barrier-guards.rb:112:10:112:10 | call to y | barrier-guards.rb:112:4:112:10 | [true] ... and ... | true | -| barrier-guards.rb:112:10:112:10 | call to y | barrier-guards.rb:113:5:113:7 | foo | true | -| barrier-guards.rb:118:4:118:8 | [false] not ... | barrier-guards.rb:121:5:121:8 | bars | false | -| barrier-guards.rb:118:4:118:8 | [true] not ... | barrier-guards.rb:119:5:119:7 | foo | true | -| barrier-guards.rb:118:8:118:8 | call to x | barrier-guards.rb:118:4:118:8 | [false] not ... | true | -| barrier-guards.rb:118:8:118:8 | call to x | barrier-guards.rb:118:4:118:8 | [true] not ... | false | -| barrier-guards.rb:118:8:118:8 | call to x | barrier-guards.rb:119:5:119:7 | foo | false | -| barrier-guards.rb:118:8:118:8 | call to x | barrier-guards.rb:121:5:121:8 | bars | true | -| barrier-guards.rb:125:1:126:19 | [match] when ... | barrier-guards.rb:126:5:126:7 | foo | match | -| barrier-guards.rb:125:1:126:19 | [no-match] when ... | barrier-guards.rb:128:5:128:7 | foo | no-match | -| barrier-guards.rb:125:6:125:10 | "foo" | barrier-guards.rb:125:1:126:19 | [match] when ... | match | -| barrier-guards.rb:125:6:125:10 | "foo" | barrier-guards.rb:125:1:126:19 | [no-match] when ... | no-match | -| barrier-guards.rb:125:6:125:10 | "foo" | barrier-guards.rb:126:5:126:7 | foo | match | -| barrier-guards.rb:125:6:125:10 | "foo" | barrier-guards.rb:128:5:128:7 | foo | no-match | -| barrier-guards.rb:132:1:133:19 | [match] when ... | barrier-guards.rb:133:5:133:7 | foo | match | -| barrier-guards.rb:132:1:133:19 | [no-match] when ... | barrier-guards.rb:134:1:135:19 | [match] when ... | no-match | -| barrier-guards.rb:132:1:133:19 | [no-match] when ... | barrier-guards.rb:134:1:135:19 | [no-match] when ... | no-match | -| barrier-guards.rb:132:1:133:19 | [no-match] when ... | barrier-guards.rb:134:7:134:9 | bar | no-match | -| barrier-guards.rb:132:1:133:19 | [no-match] when ... | barrier-guards.rb:135:5:135:7 | foo | no-match | -| barrier-guards.rb:132:6:132:10 | "foo" | barrier-guards.rb:132:1:133:19 | [match] when ... | match | -| barrier-guards.rb:132:6:132:10 | "foo" | barrier-guards.rb:132:1:133:19 | [no-match] when ... | no-match | -| barrier-guards.rb:132:6:132:10 | "foo" | barrier-guards.rb:133:5:133:7 | foo | match | -| barrier-guards.rb:132:6:132:10 | "foo" | barrier-guards.rb:134:1:135:19 | [match] when ... | no-match | -| barrier-guards.rb:132:6:132:10 | "foo" | barrier-guards.rb:134:1:135:19 | [no-match] when ... | no-match | -| barrier-guards.rb:132:6:132:10 | "foo" | barrier-guards.rb:134:7:134:9 | bar | no-match | -| barrier-guards.rb:132:6:132:10 | "foo" | barrier-guards.rb:135:5:135:7 | foo | no-match | -| barrier-guards.rb:134:1:135:19 | [match] when ... | barrier-guards.rb:135:5:135:7 | foo | match | -| barrier-guards.rb:134:6:134:10 | "bar" | barrier-guards.rb:134:1:135:19 | [match] when ... | match | -| barrier-guards.rb:134:6:134:10 | "bar" | barrier-guards.rb:134:1:135:19 | [no-match] when ... | no-match | -| barrier-guards.rb:134:6:134:10 | "bar" | barrier-guards.rb:135:5:135:7 | foo | match | -| barrier-guards.rb:139:1:140:19 | [match] when ... | barrier-guards.rb:140:5:140:7 | foo | match | -| barrier-guards.rb:139:1:140:19 | [no-match] when ... | barrier-guards.rb:141:1:142:19 | [match] when ... | no-match | -| barrier-guards.rb:139:1:140:19 | [no-match] when ... | barrier-guards.rb:141:1:142:19 | [no-match] when ... | no-match | -| barrier-guards.rb:139:1:140:19 | [no-match] when ... | barrier-guards.rb:141:7:141:9 | baz | no-match | -| barrier-guards.rb:139:1:140:19 | [no-match] when ... | barrier-guards.rb:141:14:141:17 | quux | no-match | -| barrier-guards.rb:139:1:140:19 | [no-match] when ... | barrier-guards.rb:142:5:142:7 | foo | no-match | -| barrier-guards.rb:139:1:140:19 | [no-match] when ... | barrier-guards.rb:144:5:144:7 | foo | no-match | -| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:139:1:140:19 | [no-match] when ... | no-match | -| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:139:14:139:16 | bar | no-match | -| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:141:1:142:19 | [match] when ... | no-match | -| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:141:1:142:19 | [no-match] when ... | no-match | -| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:141:7:141:9 | baz | no-match | -| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:141:14:141:17 | quux | no-match | -| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:142:5:142:7 | foo | no-match | -| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:144:5:144:7 | foo | no-match | -| barrier-guards.rb:139:13:139:17 | "bar" | barrier-guards.rb:139:1:140:19 | [no-match] when ... | no-match | -| barrier-guards.rb:139:13:139:17 | "bar" | barrier-guards.rb:141:1:142:19 | [match] when ... | no-match | -| barrier-guards.rb:139:13:139:17 | "bar" | barrier-guards.rb:141:1:142:19 | [no-match] when ... | no-match | -| barrier-guards.rb:139:13:139:17 | "bar" | barrier-guards.rb:141:7:141:9 | baz | no-match | -| barrier-guards.rb:139:13:139:17 | "bar" | barrier-guards.rb:141:14:141:17 | quux | no-match | -| barrier-guards.rb:139:13:139:17 | "bar" | barrier-guards.rb:142:5:142:7 | foo | no-match | -| barrier-guards.rb:139:13:139:17 | "bar" | barrier-guards.rb:144:5:144:7 | foo | no-match | -| barrier-guards.rb:141:1:142:19 | [match] when ... | barrier-guards.rb:142:5:142:7 | foo | match | -| barrier-guards.rb:141:1:142:19 | [no-match] when ... | barrier-guards.rb:144:5:144:7 | foo | no-match | -| barrier-guards.rb:141:6:141:10 | "baz" | barrier-guards.rb:141:1:142:19 | [no-match] when ... | no-match | -| barrier-guards.rb:141:6:141:10 | "baz" | barrier-guards.rb:141:14:141:17 | quux | no-match | -| barrier-guards.rb:141:6:141:10 | "baz" | barrier-guards.rb:144:5:144:7 | foo | no-match | -| barrier-guards.rb:141:13:141:18 | "quux" | barrier-guards.rb:141:1:142:19 | [no-match] when ... | no-match | -| barrier-guards.rb:141:13:141:18 | "quux" | barrier-guards.rb:144:5:144:7 | foo | no-match | -| barrier-guards.rb:148:1:149:19 | [match] when ... | barrier-guards.rb:149:5:149:7 | foo | match | -| barrier-guards.rb:148:6:148:20 | * ... | barrier-guards.rb:148:1:149:19 | [match] when ... | match | -| barrier-guards.rb:148:6:148:20 | * ... | barrier-guards.rb:148:1:149:19 | [no-match] when ... | no-match | -| barrier-guards.rb:148:6:148:20 | * ... | barrier-guards.rb:149:5:149:7 | foo | match | -| barrier-guards.rb:153:1:154:19 | [match] when ... | barrier-guards.rb:154:5:154:7 | foo | match | -| barrier-guards.rb:153:6:153:17 | * ... | barrier-guards.rb:153:1:154:19 | [match] when ... | match | -| barrier-guards.rb:153:6:153:17 | * ... | barrier-guards.rb:153:1:154:19 | [no-match] when ... | no-match | -| barrier-guards.rb:153:6:153:17 | * ... | barrier-guards.rb:154:5:154:7 | foo | match | -| barrier-guards.rb:158:1:159:19 | [match] when ... | barrier-guards.rb:159:5:159:7 | foo | match | -| barrier-guards.rb:158:6:158:9 | * ... | barrier-guards.rb:158:1:159:19 | [match] when ... | match | -| barrier-guards.rb:158:6:158:9 | * ... | barrier-guards.rb:158:1:159:19 | [no-match] when ... | no-match | -| barrier-guards.rb:158:6:158:9 | * ... | barrier-guards.rb:159:5:159:7 | foo | match | -| barrier-guards.rb:163:1:164:19 | [match] when ... | barrier-guards.rb:164:5:164:7 | foo | match | -| barrier-guards.rb:163:6:163:10 | * ... | barrier-guards.rb:163:1:164:19 | [match] when ... | match | -| barrier-guards.rb:163:6:163:10 | * ... | barrier-guards.rb:163:1:164:19 | [no-match] when ... | no-match | -| barrier-guards.rb:163:6:163:10 | * ... | barrier-guards.rb:164:5:164:7 | foo | match | -| barrier-guards.rb:168:1:169:7 | [match] when ... | barrier-guards.rb:169:5:169:7 | foo | match | -| barrier-guards.rb:168:6:168:16 | * ... | barrier-guards.rb:168:1:169:7 | [match] when ... | match | -| barrier-guards.rb:168:6:168:16 | * ... | barrier-guards.rb:168:1:169:7 | [no-match] when ... | no-match | -| barrier-guards.rb:168:6:168:16 | * ... | barrier-guards.rb:169:5:169:7 | foo | match | -| barrier-guards.rb:173:1:174:7 | [match] when ... | barrier-guards.rb:174:5:174:7 | foo | match | -| barrier-guards.rb:173:6:173:10 | "foo" | barrier-guards.rb:173:1:174:7 | [no-match] when ... | no-match | -| barrier-guards.rb:173:6:173:10 | "foo" | barrier-guards.rb:173:13:173:13 | self | no-match | -| barrier-guards.rb:173:13:173:13 | call to x | barrier-guards.rb:173:1:174:7 | [no-match] when ... | no-match | -| barrier-guards.rb:180:1:181:7 | [match] when ... | barrier-guards.rb:181:5:181:7 | foo | match | -| barrier-guards.rb:180:6:180:15 | * ... | barrier-guards.rb:180:1:181:7 | [match] when ... | match | -| barrier-guards.rb:180:6:180:15 | * ... | barrier-guards.rb:180:1:181:7 | [no-match] when ... | no-match | -| barrier-guards.rb:180:6:180:15 | * ... | barrier-guards.rb:181:5:181:7 | foo | match | -| barrier-guards.rb:187:1:188:7 | [match] when ... | barrier-guards.rb:188:5:188:7 | foo | match | -| barrier-guards.rb:187:6:187:15 | * ... | barrier-guards.rb:187:1:188:7 | [match] when ... | match | -| barrier-guards.rb:187:6:187:15 | * ... | barrier-guards.rb:187:1:188:7 | [no-match] when ... | no-match | -| barrier-guards.rb:187:6:187:15 | * ... | barrier-guards.rb:188:5:188:7 | foo | match | -| barrier-guards.rb:191:4:191:15 | ... == ... | barrier-guards.rb:191:4:191:31 | [false] ... or ... | false | -| barrier-guards.rb:191:4:191:15 | ... == ... | barrier-guards.rb:191:20:191:22 | foo | false | -| barrier-guards.rb:191:4:191:31 | [true] ... or ... | barrier-guards.rb:192:5:192:7 | foo | true | -| barrier-guards.rb:191:20:191:31 | ... == ... | barrier-guards.rb:191:4:191:31 | [false] ... or ... | false | -| barrier-guards.rb:195:4:195:15 | ... == ... | barrier-guards.rb:195:4:195:31 | [false] ... or ... | false | -| barrier-guards.rb:195:4:195:15 | ... == ... | barrier-guards.rb:195:4:195:47 | [false] ... or ... | false | -| barrier-guards.rb:195:4:195:15 | ... == ... | barrier-guards.rb:195:20:195:22 | foo | false | -| barrier-guards.rb:195:4:195:15 | ... == ... | barrier-guards.rb:195:36:195:38 | foo | false | -| barrier-guards.rb:195:4:195:31 | [false] ... or ... | barrier-guards.rb:195:4:195:47 | [false] ... or ... | false | -| barrier-guards.rb:195:4:195:31 | [false] ... or ... | barrier-guards.rb:195:36:195:38 | foo | false | -| barrier-guards.rb:195:4:195:47 | [true] ... or ... | barrier-guards.rb:196:5:196:7 | foo | true | -| barrier-guards.rb:195:20:195:31 | ... == ... | barrier-guards.rb:195:4:195:31 | [false] ... or ... | false | -| barrier-guards.rb:195:20:195:31 | ... == ... | barrier-guards.rb:195:4:195:47 | [false] ... or ... | false | -| barrier-guards.rb:195:20:195:31 | ... == ... | barrier-guards.rb:195:36:195:38 | foo | false | -| barrier-guards.rb:195:36:195:47 | ... == ... | barrier-guards.rb:195:4:195:47 | [false] ... or ... | false | -| barrier-guards.rb:199:4:199:15 | ... == ... | barrier-guards.rb:199:4:199:31 | [false] ... or ... | false | -| barrier-guards.rb:199:4:199:15 | ... == ... | barrier-guards.rb:199:4:199:43 | [false] ... or ... | false | -| barrier-guards.rb:199:4:199:15 | ... == ... | barrier-guards.rb:199:20:199:22 | foo | false | -| barrier-guards.rb:199:4:199:15 | ... == ... | barrier-guards.rb:199:36:199:38 | foo | false | -| barrier-guards.rb:199:4:199:31 | [false] ... or ... | barrier-guards.rb:199:4:199:43 | [false] ... or ... | false | -| barrier-guards.rb:199:4:199:31 | [false] ... or ... | barrier-guards.rb:199:36:199:38 | foo | false | -| barrier-guards.rb:199:4:199:43 | [true] ... or ... | barrier-guards.rb:200:5:200:7 | foo | true | -| barrier-guards.rb:199:20:199:31 | ... == ... | barrier-guards.rb:199:4:199:31 | [false] ... or ... | false | -| barrier-guards.rb:199:20:199:31 | ... == ... | barrier-guards.rb:199:4:199:43 | [false] ... or ... | false | -| barrier-guards.rb:199:20:199:31 | ... == ... | barrier-guards.rb:199:36:199:38 | foo | false | -| barrier-guards.rb:199:36:199:43 | ... == ... | barrier-guards.rb:199:4:199:43 | [false] ... or ... | false | -| barrier-guards.rb:203:4:203:15 | ... == ... | barrier-guards.rb:203:4:203:31 | [false] ... or ... | false | -| barrier-guards.rb:203:4:203:15 | ... == ... | barrier-guards.rb:203:4:203:47 | [false] ... or ... | false | -| barrier-guards.rb:203:4:203:15 | ... == ... | barrier-guards.rb:203:20:203:22 | self | false | -| barrier-guards.rb:203:4:203:15 | ... == ... | barrier-guards.rb:203:36:203:38 | foo | false | -| barrier-guards.rb:203:4:203:31 | [false] ... or ... | barrier-guards.rb:203:4:203:47 | [false] ... or ... | false | -| barrier-guards.rb:203:4:203:31 | [false] ... or ... | barrier-guards.rb:203:36:203:38 | foo | false | -| barrier-guards.rb:203:4:203:47 | [true] ... or ... | barrier-guards.rb:204:5:204:7 | foo | true | -| barrier-guards.rb:203:20:203:31 | ... == ... | barrier-guards.rb:203:4:203:31 | [false] ... or ... | false | -| barrier-guards.rb:203:20:203:31 | ... == ... | barrier-guards.rb:203:4:203:47 | [false] ... or ... | false | -| barrier-guards.rb:203:20:203:31 | ... == ... | barrier-guards.rb:203:36:203:38 | foo | false | -| barrier-guards.rb:203:36:203:47 | ... == ... | barrier-guards.rb:203:4:203:47 | [false] ... or ... | false | -| barrier-guards.rb:207:4:207:15 | ... == ... | barrier-guards.rb:207:4:207:21 | [true] ... and ... | true | -| barrier-guards.rb:207:4:207:15 | ... == ... | barrier-guards.rb:207:21:207:21 | self | true | -| barrier-guards.rb:207:4:207:15 | ... == ... | barrier-guards.rb:208:5:208:7 | foo | true | -| barrier-guards.rb:207:4:207:21 | [true] ... and ... | barrier-guards.rb:208:5:208:7 | foo | true | -| barrier-guards.rb:207:21:207:21 | call to x | barrier-guards.rb:207:4:207:21 | [true] ... and ... | true | -| barrier-guards.rb:207:21:207:21 | call to x | barrier-guards.rb:208:5:208:7 | foo | true | -| barrier-guards.rb:211:4:211:4 | call to x | barrier-guards.rb:211:4:211:21 | [true] ... and ... | true | -| barrier-guards.rb:211:4:211:4 | call to x | barrier-guards.rb:211:10:211:12 | foo | true | -| barrier-guards.rb:211:4:211:4 | call to x | barrier-guards.rb:212:5:212:7 | foo | true | -| barrier-guards.rb:211:4:211:21 | [true] ... and ... | barrier-guards.rb:212:5:212:7 | foo | true | -| barrier-guards.rb:211:10:211:21 | ... == ... | barrier-guards.rb:211:4:211:21 | [true] ... and ... | true | -| barrier-guards.rb:211:10:211:21 | ... == ... | barrier-guards.rb:212:5:212:7 | foo | true | -| barrier-guards.rb:215:4:215:4 | call to x | barrier-guards.rb:215:4:215:10 | [true] ... and ... | true | -| barrier-guards.rb:215:4:215:4 | call to x | barrier-guards.rb:215:4:215:27 | [true] ... and ... | true | -| barrier-guards.rb:215:4:215:4 | call to x | barrier-guards.rb:215:10:215:10 | self | true | -| barrier-guards.rb:215:4:215:4 | call to x | barrier-guards.rb:215:16:215:18 | foo | true | -| barrier-guards.rb:215:4:215:4 | call to x | barrier-guards.rb:216:5:216:7 | foo | true | -| barrier-guards.rb:215:4:215:10 | [true] ... and ... | barrier-guards.rb:215:4:215:27 | [true] ... and ... | true | -| barrier-guards.rb:215:4:215:10 | [true] ... and ... | barrier-guards.rb:215:16:215:18 | foo | true | -| barrier-guards.rb:215:4:215:10 | [true] ... and ... | barrier-guards.rb:216:5:216:7 | foo | true | -| barrier-guards.rb:215:4:215:27 | [true] ... and ... | barrier-guards.rb:216:5:216:7 | foo | true | -| barrier-guards.rb:215:10:215:10 | call to y | barrier-guards.rb:215:4:215:10 | [true] ... and ... | true | -| barrier-guards.rb:215:10:215:10 | call to y | barrier-guards.rb:215:4:215:27 | [true] ... and ... | true | -| barrier-guards.rb:215:10:215:10 | call to y | barrier-guards.rb:215:16:215:18 | foo | true | -| barrier-guards.rb:215:10:215:10 | call to y | barrier-guards.rb:216:5:216:7 | foo | true | -| barrier-guards.rb:215:16:215:27 | ... == ... | barrier-guards.rb:215:4:215:27 | [true] ... and ... | true | -| barrier-guards.rb:215:16:215:27 | ... == ... | barrier-guards.rb:216:5:216:7 | foo | true | -| barrier-guards.rb:219:4:219:15 | ... == ... | barrier-guards.rb:219:4:219:32 | [true] ... and ... | true | -| barrier-guards.rb:219:4:219:15 | ... == ... | barrier-guards.rb:219:21:219:23 | foo | true | -| barrier-guards.rb:219:4:219:15 | ... == ... | barrier-guards.rb:220:5:220:7 | foo | true | -| barrier-guards.rb:219:4:219:32 | [true] ... and ... | barrier-guards.rb:220:5:220:7 | foo | true | -| barrier-guards.rb:219:21:219:32 | ... == ... | barrier-guards.rb:219:4:219:32 | [true] ... and ... | true | -| barrier-guards.rb:219:21:219:32 | ... == ... | barrier-guards.rb:220:5:220:7 | foo | true | -| barrier-guards.rb:223:4:223:4 | call to x | barrier-guards.rb:223:4:223:10 | [true] ... and ... | true | -| barrier-guards.rb:223:4:223:4 | call to x | barrier-guards.rb:223:10:223:10 | self | true | -| barrier-guards.rb:223:4:223:4 | call to x | barrier-guards.rb:224:5:224:7 | foo | true | -| barrier-guards.rb:223:4:223:10 | [true] ... and ... | barrier-guards.rb:224:5:224:7 | foo | true | -| barrier-guards.rb:223:10:223:10 | call to y | barrier-guards.rb:223:4:223:10 | [true] ... and ... | true | -| barrier-guards.rb:223:10:223:10 | call to y | barrier-guards.rb:224:5:224:7 | foo | true | -| barrier-guards.rb:227:4:227:15 | ... == ... | barrier-guards.rb:227:4:227:21 | [true] ... and ... | true | -| barrier-guards.rb:227:4:227:15 | ... == ... | barrier-guards.rb:227:21:227:21 | self | true | -| barrier-guards.rb:227:4:227:15 | ... == ... | barrier-guards.rb:228:5:228:7 | self | true | -| barrier-guards.rb:227:4:227:21 | [true] ... and ... | barrier-guards.rb:228:5:228:7 | self | true | -| barrier-guards.rb:227:21:227:21 | call to y | barrier-guards.rb:227:4:227:21 | [true] ... and ... | true | -| barrier-guards.rb:227:21:227:21 | call to y | barrier-guards.rb:228:5:228:7 | self | true | -| barrier-guards.rb:232:1:233:19 | [match] when ... | barrier-guards.rb:233:5:233:7 | foo | match | -| barrier-guards.rb:232:6:232:17 | ... == ... | barrier-guards.rb:232:1:233:19 | [match] when ... | match | -| barrier-guards.rb:232:6:232:17 | ... == ... | barrier-guards.rb:232:1:233:19 | [no-match] when ... | no-match | -| barrier-guards.rb:232:6:232:17 | ... == ... | barrier-guards.rb:233:5:233:7 | foo | match | -| barrier-guards.rb:237:1:237:38 | [match] when ... | barrier-guards.rb:237:24:237:26 | foo | match | -| barrier-guards.rb:237:1:237:38 | [no-match] when ... | barrier-guards.rb:238:1:238:26 | [match] when ... | no-match | -| barrier-guards.rb:237:1:237:38 | [no-match] when ... | barrier-guards.rb:238:1:238:26 | [no-match] when ... | no-match | -| barrier-guards.rb:237:1:237:38 | [no-match] when ... | barrier-guards.rb:238:6:238:8 | self | no-match | -| barrier-guards.rb:237:1:237:38 | [no-match] when ... | barrier-guards.rb:238:24:238:26 | foo | no-match | -| barrier-guards.rb:237:1:237:38 | [no-match] when ... | barrier-guards.rb:239:1:239:22 | [match] when ... | no-match | -| barrier-guards.rb:237:1:237:38 | [no-match] when ... | barrier-guards.rb:239:1:239:22 | [no-match] when ... | no-match | -| barrier-guards.rb:237:1:237:38 | [no-match] when ... | barrier-guards.rb:239:6:239:8 | foo | no-match | -| barrier-guards.rb:237:1:237:38 | [no-match] when ... | barrier-guards.rb:239:20:239:22 | foo | no-match | -| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:237:1:237:38 | [match] when ... | match | -| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:237:1:237:38 | [no-match] when ... | no-match | -| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:237:24:237:26 | foo | match | -| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:238:1:238:26 | [match] when ... | no-match | -| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:238:1:238:26 | [no-match] when ... | no-match | -| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:238:6:238:8 | self | no-match | -| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:238:24:238:26 | foo | no-match | -| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:239:1:239:22 | [match] when ... | no-match | -| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:239:1:239:22 | [no-match] when ... | no-match | -| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:239:6:239:8 | foo | no-match | -| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:239:20:239:22 | foo | no-match | -| barrier-guards.rb:238:1:238:26 | [match] when ... | barrier-guards.rb:238:24:238:26 | foo | match | -| barrier-guards.rb:238:1:238:26 | [no-match] when ... | barrier-guards.rb:239:1:239:22 | [match] when ... | no-match | -| barrier-guards.rb:238:1:238:26 | [no-match] when ... | barrier-guards.rb:239:1:239:22 | [no-match] when ... | no-match | -| barrier-guards.rb:238:1:238:26 | [no-match] when ... | barrier-guards.rb:239:6:239:8 | foo | no-match | -| barrier-guards.rb:238:1:238:26 | [no-match] when ... | barrier-guards.rb:239:20:239:22 | foo | no-match | -| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:238:1:238:26 | [match] when ... | match | -| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:238:1:238:26 | [no-match] when ... | no-match | -| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:238:24:238:26 | foo | match | -| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:239:1:239:22 | [match] when ... | no-match | -| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:239:1:239:22 | [no-match] when ... | no-match | -| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:239:6:239:8 | foo | no-match | -| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:239:20:239:22 | foo | no-match | -| barrier-guards.rb:239:1:239:22 | [match] when ... | barrier-guards.rb:239:20:239:22 | foo | match | -| barrier-guards.rb:239:6:239:13 | ... == ... | barrier-guards.rb:239:1:239:22 | [match] when ... | match | -| barrier-guards.rb:239:6:239:13 | ... == ... | barrier-guards.rb:239:1:239:22 | [no-match] when ... | no-match | -| barrier-guards.rb:239:6:239:13 | ... == ... | barrier-guards.rb:239:20:239:22 | foo | match | -| barrier-guards.rb:243:4:243:8 | "foo" | barrier-guards.rb:244:5:244:7 | foo | match | -| barrier-guards.rb:243:4:243:8 | "foo" | barrier-guards.rb:245:1:246:7 | in ... then ... | no-match | -| barrier-guards.rb:243:4:243:8 | "foo" | barrier-guards.rb:246:5:246:7 | foo | no-match | -| barrier-guards.rb:245:4:245:4 | x | barrier-guards.rb:246:5:246:7 | foo | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:251:5:251:7 | foo | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:254:1:256:3 | if ... | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:255:5:255:7 | foo | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:259:1:261:3 | if ... | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:260:5:260:7 | foo | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:264:1:266:3 | if ... | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:265:5:265:7 | foo | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:268:1:270:3 | if ... | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:269:5:269:7 | foo | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:272:1:272:19 | ... && ... | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:272:17:272:19 | foo | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:273:1:273:19 | ... && ... | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:273:8:273:10 | foo | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:275:1:277:3 | if ... | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:276:5:276:7 | foo | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:281:1:283:3 | if ... | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:282:5:282:7 | foo | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:286:1:288:3 | if ... | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:287:5:287:7 | foo | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:290:1:295:3 | case ... | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:291:1:292:19 | [match] when ... | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:291:1:292:19 | [no-match] when ... | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:292:5:292:7 | foo | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:294:5:294:7 | foo | match | -| barrier-guards.rb:254:4:254:28 | ... == ... | barrier-guards.rb:255:5:255:7 | foo | true | -| barrier-guards.rb:259:4:259:16 | ... == ... | barrier-guards.rb:260:5:260:7 | foo | true | -| barrier-guards.rb:264:4:264:16 | ... == ... | barrier-guards.rb:265:5:265:7 | foo | true | -| barrier-guards.rb:268:4:268:30 | ... == ... | barrier-guards.rb:269:5:269:7 | foo | true | -| barrier-guards.rb:272:1:272:12 | ... == ... | barrier-guards.rb:272:17:272:19 | foo | true | -| barrier-guards.rb:273:1:273:3 | foo | barrier-guards.rb:273:8:273:10 | foo | true | -| barrier-guards.rb:275:4:275:19 | call to include? | barrier-guards.rb:276:5:276:7 | foo | true | -| barrier-guards.rb:281:4:281:20 | call to include? | barrier-guards.rb:282:5:282:7 | foo | true | -| barrier-guards.rb:286:4:286:20 | call to include? | barrier-guards.rb:287:5:287:7 | foo | true | -| barrier-guards.rb:291:1:292:19 | [match] when ... | barrier-guards.rb:292:5:292:7 | foo | match | -| barrier-guards.rb:291:1:292:19 | [no-match] when ... | barrier-guards.rb:294:5:294:7 | foo | no-match | -| barrier-guards.rb:291:6:291:6 | g | barrier-guards.rb:291:1:292:19 | [match] when ... | match | -| barrier-guards.rb:291:6:291:6 | g | barrier-guards.rb:291:1:292:19 | [no-match] when ... | no-match | -| barrier-guards.rb:291:6:291:6 | g | barrier-guards.rb:292:5:292:7 | foo | match | -| barrier-guards.rb:291:6:291:6 | g | barrier-guards.rb:294:5:294:7 | foo | no-match | -| barrier_flow.rb:10:8:10:18 | ... != ... | barrier_flow.rb:11:9:11:14 | self | true | -| barrier_flow.rb:18:8:18:18 | ... == ... | barrier_flow.rb:19:9:19:14 | self | true | -| barrier_flow.rb:26:19:26:29 | ... == ... | barrier_flow.rb:26:5:26:10 | self | false | -| barrier_flow.rb:32:19:32:29 | ... != ... | barrier_flow.rb:32:5:32:10 | self | false | -| barrier_flow.rb:38:8:38:18 | ... != ... | barrier_flow.rb:39:9:39:9 | x | true | -| barrier_flow.rb:48:23:48:33 | ... == ... | barrier_flow.rb:48:5:48:5 | x | false | -| barrier_flow.rb:56:8:56:8 | b | barrier_flow.rb:57:9:57:14 | return | true | -| barrier_flow.rb:56:8:56:8 | b | barrier_flow.rb:57:9:57:34 | ... unless ... | true | -| barrier_flow.rb:56:8:56:8 | b | barrier_flow.rb:57:23:57:23 | x | true | -| barrier_flow.rb:56:8:56:8 | b | barrier_flow.rb:59:9:59:14 | return | false | -| barrier_flow.rb:56:8:56:8 | b | barrier_flow.rb:59:9:59:34 | ... unless ... | false | -| barrier_flow.rb:56:8:56:8 | b | barrier_flow.rb:59:23:59:23 | x | false | -| barrier_flow.rb:57:23:57:34 | ... == ... | barrier_flow.rb:57:9:57:14 | return | false | -| barrier_flow.rb:57:23:57:34 | ... == ... | barrier_flow.rb:57:9:57:34 | ... unless ... | true | -| barrier_flow.rb:59:23:59:34 | ... == ... | barrier_flow.rb:59:9:59:14 | return | false | -| barrier_flow.rb:59:23:59:34 | ... == ... | barrier_flow.rb:59:9:59:34 | ... unless ... | true | -| barrier_flow.rb:68:8:68:8 | b | barrier_flow.rb:69:9:71:11 | if ... | true | -| barrier_flow.rb:68:8:68:8 | b | barrier_flow.rb:69:12:69:12 | x | true | -| barrier_flow.rb:68:8:68:8 | b | barrier_flow.rb:70:13:70:18 | return | true | -| barrier_flow.rb:68:8:68:8 | b | barrier_flow.rb:73:9:75:11 | if ... | false | -| barrier_flow.rb:68:8:68:8 | b | barrier_flow.rb:73:12:73:12 | x | false | -| barrier_flow.rb:68:8:68:8 | b | barrier_flow.rb:74:13:74:18 | return | false | -| barrier_flow.rb:69:12:69:23 | ... != ... | barrier_flow.rb:69:9:71:11 | if ... | false | -| barrier_flow.rb:69:12:69:23 | ... != ... | barrier_flow.rb:70:13:70:18 | return | true | -| barrier_flow.rb:73:12:73:23 | ... != ... | barrier_flow.rb:73:9:75:11 | if ... | false | -| barrier_flow.rb:73:12:73:23 | ... != ... | barrier_flow.rb:74:13:74:18 | return | true | +| barrier-guards.rb:3:4:3:15 | ... == ... | barrier-guards.rb:3:4:3:15 | After ... == ... [false] | false | +| barrier-guards.rb:3:4:3:15 | ... == ... | barrier-guards.rb:3:4:3:15 | After ... == ... [true] | true | +| barrier-guards.rb:9:4:9:24 | call to include? | barrier-guards.rb:9:4:9:24 | After call to include? [false] | false | +| barrier-guards.rb:9:4:9:24 | call to include? | barrier-guards.rb:9:4:9:24 | After call to include? [true] | true | +| barrier-guards.rb:15:4:15:15 | ... != ... | barrier-guards.rb:15:4:15:15 | After ... != ... [false] | false | +| barrier-guards.rb:15:4:15:15 | ... != ... | barrier-guards.rb:15:4:15:15 | After ... != ... [true] | true | +| barrier-guards.rb:21:8:21:19 | ... == ... | barrier-guards.rb:21:8:21:19 | After ... == ... [false] | false | +| barrier-guards.rb:21:8:21:19 | ... == ... | barrier-guards.rb:21:8:21:19 | After ... == ... [true] | true | +| barrier-guards.rb:27:8:27:19 | ... != ... | barrier-guards.rb:27:8:27:19 | After ... != ... [false] | false | +| barrier-guards.rb:27:8:27:19 | ... != ... | barrier-guards.rb:27:8:27:19 | After ... != ... [true] | true | +| barrier-guards.rb:37:4:37:20 | call to include? | barrier-guards.rb:37:4:37:20 | After call to include? [false] | false | +| barrier-guards.rb:37:4:37:20 | call to include? | barrier-guards.rb:37:4:37:20 | After call to include? [true] | true | +| barrier-guards.rb:43:4:43:15 | ... == ... | barrier-guards.rb:43:4:43:15 | After ... == ... [false] | false | +| barrier-guards.rb:43:4:43:15 | ... == ... | barrier-guards.rb:43:4:43:15 | After ... == ... [true] | true | +| barrier-guards.rb:49:4:49:15 | ... == ... | barrier-guards.rb:49:4:49:15 | After ... == ... [false] | false | +| barrier-guards.rb:49:4:49:15 | ... == ... | barrier-guards.rb:49:4:49:15 | After ... == ... [true] | true | +| barrier-guards.rb:56:4:56:15 | ... == ... | barrier-guards.rb:56:4:56:15 | After ... == ... [false] | false | +| barrier-guards.rb:56:4:56:15 | ... == ... | barrier-guards.rb:56:4:56:15 | After ... == ... [true] | true | +| barrier-guards.rb:70:4:70:21 | call to include? | barrier-guards.rb:70:4:70:21 | After call to include? [false] | false | +| barrier-guards.rb:70:4:70:21 | call to include? | barrier-guards.rb:70:4:70:21 | After call to include? [true] | true | +| barrier-guards.rb:76:4:76:21 | call to include? | barrier-guards.rb:76:4:76:21 | After call to include? [false] | false | +| barrier-guards.rb:76:4:76:21 | call to include? | barrier-guards.rb:76:4:76:21 | After call to include? [true] | true | +| barrier-guards.rb:82:4:82:25 | ... != ... | barrier-guards.rb:82:4:82:25 | After ... != ... [false] | false | +| barrier-guards.rb:82:4:82:25 | ... != ... | barrier-guards.rb:82:4:82:25 | After ... != ... [true] | true | +| barrier-guards.rb:88:4:88:25 | ... == ... | barrier-guards.rb:88:4:88:25 | After ... == ... [false] | false | +| barrier-guards.rb:88:4:88:25 | ... == ... | barrier-guards.rb:88:4:88:25 | After ... == ... [true] | true | +| barrier-guards.rb:96:4:96:12 | call to condition | barrier-guards.rb:96:4:96:12 | After call to condition [false] | false | +| barrier-guards.rb:96:4:96:12 | call to condition | barrier-guards.rb:96:4:96:12 | After call to condition [true] | true | +| barrier-guards.rb:100:4:100:21 | call to include? | barrier-guards.rb:100:4:100:21 | After call to include? [false] | false | +| barrier-guards.rb:100:4:100:21 | call to include? | barrier-guards.rb:100:4:100:21 | After call to include? [true] | true | +| barrier-guards.rb:106:4:106:4 | call to x | barrier-guards.rb:106:4:106:4 | After call to x [false] | false | +| barrier-guards.rb:106:4:106:4 | call to x | barrier-guards.rb:106:4:106:4 | After call to x [true] | true | +| barrier-guards.rb:106:4:106:4 | call to x | barrier-guards.rb:106:9:106:9 | After call to y [false] | false | +| barrier-guards.rb:106:4:106:4 | call to x | barrier-guards.rb:106:9:106:9 | After call to y [true] | false | +| barrier-guards.rb:106:9:106:9 | call to y | barrier-guards.rb:106:9:106:9 | After call to y [false] | false | +| barrier-guards.rb:106:9:106:9 | call to y | barrier-guards.rb:106:9:106:9 | After call to y [true] | true | +| barrier-guards.rb:112:4:112:4 | call to x | barrier-guards.rb:112:4:112:4 | After call to x [false] | false | +| barrier-guards.rb:112:4:112:4 | call to x | barrier-guards.rb:112:4:112:4 | After call to x [true] | true | +| barrier-guards.rb:112:4:112:4 | call to x | barrier-guards.rb:112:10:112:10 | After call to y [false] | true | +| barrier-guards.rb:112:4:112:4 | call to x | barrier-guards.rb:112:10:112:10 | After call to y [true] | true | +| barrier-guards.rb:112:10:112:10 | call to y | barrier-guards.rb:112:10:112:10 | After call to y [false] | false | +| barrier-guards.rb:112:10:112:10 | call to y | barrier-guards.rb:112:10:112:10 | After call to y [true] | true | +| barrier-guards.rb:118:8:118:8 | call to x | barrier-guards.rb:118:8:118:8 | After call to x [false] | false | +| barrier-guards.rb:118:8:118:8 | call to x | barrier-guards.rb:118:8:118:8 | After call to x [true] | true | +| barrier-guards.rb:125:6:125:10 | "foo" | barrier-guards.rb:125:6:125:10 | After "foo" [match] | match | +| barrier-guards.rb:125:6:125:10 | "foo" | barrier-guards.rb:125:6:125:10 | After "foo" [no-match] | no-match | +| barrier-guards.rb:132:6:132:10 | "foo" | barrier-guards.rb:132:6:132:10 | After "foo" [match] | match | +| barrier-guards.rb:132:6:132:10 | "foo" | barrier-guards.rb:132:6:132:10 | After "foo" [no-match] | no-match | +| barrier-guards.rb:132:6:132:10 | "foo" | barrier-guards.rb:134:6:134:10 | After "bar" [match] | no-match | +| barrier-guards.rb:132:6:132:10 | "foo" | barrier-guards.rb:134:6:134:10 | After "bar" [no-match] | no-match | +| barrier-guards.rb:134:6:134:10 | "bar" | barrier-guards.rb:134:6:134:10 | After "bar" [match] | match | +| barrier-guards.rb:134:6:134:10 | "bar" | barrier-guards.rb:134:6:134:10 | After "bar" [no-match] | no-match | +| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:139:6:139:10 | After "foo" [match] | match | +| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:139:6:139:10 | After "foo" [no-match] | no-match | +| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:139:13:139:17 | After "bar" [match] | no-match | +| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:139:13:139:17 | After "bar" [no-match] | no-match | +| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:141:1:142:19 | After when ... [match] | no-match | +| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:141:6:141:10 | After "baz" [match] | no-match | +| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:141:6:141:10 | After "baz" [no-match] | no-match | +| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:141:13:141:18 | After "quux" [match] | no-match | +| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:141:13:141:18 | After "quux" [no-match] | no-match | +| barrier-guards.rb:139:13:139:17 | "bar" | barrier-guards.rb:139:13:139:17 | After "bar" [match] | match | +| barrier-guards.rb:139:13:139:17 | "bar" | barrier-guards.rb:139:13:139:17 | After "bar" [no-match] | no-match | +| barrier-guards.rb:139:13:139:17 | "bar" | barrier-guards.rb:141:1:142:19 | After when ... [match] | no-match | +| barrier-guards.rb:139:13:139:17 | "bar" | barrier-guards.rb:141:6:141:10 | After "baz" [match] | no-match | +| barrier-guards.rb:139:13:139:17 | "bar" | barrier-guards.rb:141:6:141:10 | After "baz" [no-match] | no-match | +| barrier-guards.rb:139:13:139:17 | "bar" | barrier-guards.rb:141:13:141:18 | After "quux" [match] | no-match | +| barrier-guards.rb:139:13:139:17 | "bar" | barrier-guards.rb:141:13:141:18 | After "quux" [no-match] | no-match | +| barrier-guards.rb:141:6:141:10 | "baz" | barrier-guards.rb:141:6:141:10 | After "baz" [match] | match | +| barrier-guards.rb:141:6:141:10 | "baz" | barrier-guards.rb:141:6:141:10 | After "baz" [no-match] | no-match | +| barrier-guards.rb:141:6:141:10 | "baz" | barrier-guards.rb:141:13:141:18 | After "quux" [match] | no-match | +| barrier-guards.rb:141:6:141:10 | "baz" | barrier-guards.rb:141:13:141:18 | After "quux" [no-match] | no-match | +| barrier-guards.rb:141:13:141:18 | "quux" | barrier-guards.rb:141:13:141:18 | After "quux" [match] | match | +| barrier-guards.rb:141:13:141:18 | "quux" | barrier-guards.rb:141:13:141:18 | After "quux" [no-match] | no-match | +| barrier-guards.rb:148:6:148:20 | * ... | barrier-guards.rb:148:6:148:20 | After * ... [match] | match | +| barrier-guards.rb:148:6:148:20 | * ... | barrier-guards.rb:148:6:148:20 | After * ... [no-match] | no-match | +| barrier-guards.rb:153:6:153:17 | * ... | barrier-guards.rb:153:6:153:17 | After * ... [match] | match | +| barrier-guards.rb:153:6:153:17 | * ... | barrier-guards.rb:153:6:153:17 | After * ... [no-match] | no-match | +| barrier-guards.rb:158:6:158:9 | * ... | barrier-guards.rb:158:6:158:9 | After * ... [match] | match | +| barrier-guards.rb:158:6:158:9 | * ... | barrier-guards.rb:158:6:158:9 | After * ... [no-match] | no-match | +| barrier-guards.rb:163:6:163:10 | * ... | barrier-guards.rb:163:6:163:10 | After * ... [match] | match | +| barrier-guards.rb:163:6:163:10 | * ... | barrier-guards.rb:163:6:163:10 | After * ... [no-match] | no-match | +| barrier-guards.rb:168:6:168:16 | * ... | barrier-guards.rb:168:6:168:16 | After * ... [match] | match | +| barrier-guards.rb:168:6:168:16 | * ... | barrier-guards.rb:168:6:168:16 | After * ... [no-match] | no-match | +| barrier-guards.rb:173:6:173:10 | "foo" | barrier-guards.rb:173:6:173:10 | After "foo" [match] | match | +| barrier-guards.rb:173:6:173:10 | "foo" | barrier-guards.rb:173:6:173:10 | After "foo" [no-match] | no-match | +| barrier-guards.rb:173:6:173:10 | "foo" | barrier-guards.rb:173:13:173:13 | After call to x [match] | no-match | +| barrier-guards.rb:173:6:173:10 | "foo" | barrier-guards.rb:173:13:173:13 | After call to x [no-match] | no-match | +| barrier-guards.rb:173:13:173:13 | call to x | barrier-guards.rb:173:13:173:13 | After call to x [match] | match | +| barrier-guards.rb:173:13:173:13 | call to x | barrier-guards.rb:173:13:173:13 | After call to x [no-match] | no-match | +| barrier-guards.rb:180:6:180:15 | * ... | barrier-guards.rb:180:6:180:15 | After * ... [match] | match | +| barrier-guards.rb:180:6:180:15 | * ... | barrier-guards.rb:180:6:180:15 | After * ... [no-match] | no-match | +| barrier-guards.rb:187:6:187:15 | * ... | barrier-guards.rb:187:6:187:15 | After * ... [match] | match | +| barrier-guards.rb:187:6:187:15 | * ... | barrier-guards.rb:187:6:187:15 | After * ... [no-match] | no-match | +| barrier-guards.rb:191:4:191:15 | ... == ... | barrier-guards.rb:191:4:191:15 | After ... == ... [false] | false | +| barrier-guards.rb:191:4:191:15 | ... == ... | barrier-guards.rb:191:4:191:15 | After ... == ... [true] | true | +| barrier-guards.rb:191:4:191:15 | ... == ... | barrier-guards.rb:191:20:191:31 | After ... == ... [false] | false | +| barrier-guards.rb:191:4:191:15 | ... == ... | barrier-guards.rb:191:20:191:31 | After ... == ... [true] | false | +| barrier-guards.rb:191:20:191:31 | ... == ... | barrier-guards.rb:191:20:191:31 | After ... == ... [false] | false | +| barrier-guards.rb:191:20:191:31 | ... == ... | barrier-guards.rb:191:20:191:31 | After ... == ... [true] | true | +| barrier-guards.rb:195:4:195:15 | ... == ... | barrier-guards.rb:195:4:195:15 | After ... == ... [false] | false | +| barrier-guards.rb:195:4:195:15 | ... == ... | barrier-guards.rb:195:4:195:15 | After ... == ... [true] | true | +| barrier-guards.rb:195:4:195:15 | ... == ... | barrier-guards.rb:195:20:195:31 | After ... == ... [false] | false | +| barrier-guards.rb:195:4:195:15 | ... == ... | barrier-guards.rb:195:20:195:31 | After ... == ... [true] | false | +| barrier-guards.rb:195:4:195:15 | ... == ... | barrier-guards.rb:195:36:195:47 | After ... == ... [false] | false | +| barrier-guards.rb:195:4:195:15 | ... == ... | barrier-guards.rb:195:36:195:47 | After ... == ... [true] | false | +| barrier-guards.rb:195:20:195:31 | ... == ... | barrier-guards.rb:195:20:195:31 | After ... == ... [false] | false | +| barrier-guards.rb:195:20:195:31 | ... == ... | barrier-guards.rb:195:20:195:31 | After ... == ... [true] | true | +| barrier-guards.rb:195:20:195:31 | ... == ... | barrier-guards.rb:195:36:195:47 | After ... == ... [false] | false | +| barrier-guards.rb:195:20:195:31 | ... == ... | barrier-guards.rb:195:36:195:47 | After ... == ... [true] | false | +| barrier-guards.rb:195:36:195:47 | ... == ... | barrier-guards.rb:195:36:195:47 | After ... == ... [false] | false | +| barrier-guards.rb:195:36:195:47 | ... == ... | barrier-guards.rb:195:36:195:47 | After ... == ... [true] | true | +| barrier-guards.rb:199:4:199:15 | ... == ... | barrier-guards.rb:199:4:199:15 | After ... == ... [false] | false | +| barrier-guards.rb:199:4:199:15 | ... == ... | barrier-guards.rb:199:4:199:15 | After ... == ... [true] | true | +| barrier-guards.rb:199:4:199:15 | ... == ... | barrier-guards.rb:199:20:199:31 | After ... == ... [false] | false | +| barrier-guards.rb:199:4:199:15 | ... == ... | barrier-guards.rb:199:20:199:31 | After ... == ... [true] | false | +| barrier-guards.rb:199:4:199:15 | ... == ... | barrier-guards.rb:199:36:199:43 | After ... == ... [false] | false | +| barrier-guards.rb:199:4:199:15 | ... == ... | barrier-guards.rb:199:36:199:43 | After ... == ... [true] | false | +| barrier-guards.rb:199:20:199:31 | ... == ... | barrier-guards.rb:199:20:199:31 | After ... == ... [false] | false | +| barrier-guards.rb:199:20:199:31 | ... == ... | barrier-guards.rb:199:20:199:31 | After ... == ... [true] | true | +| barrier-guards.rb:199:20:199:31 | ... == ... | barrier-guards.rb:199:36:199:43 | After ... == ... [false] | false | +| barrier-guards.rb:199:20:199:31 | ... == ... | barrier-guards.rb:199:36:199:43 | After ... == ... [true] | false | +| barrier-guards.rb:199:36:199:43 | ... == ... | barrier-guards.rb:199:36:199:43 | After ... == ... [false] | false | +| barrier-guards.rb:199:36:199:43 | ... == ... | barrier-guards.rb:199:36:199:43 | After ... == ... [true] | true | +| barrier-guards.rb:203:4:203:15 | ... == ... | barrier-guards.rb:203:4:203:15 | After ... == ... [false] | false | +| barrier-guards.rb:203:4:203:15 | ... == ... | barrier-guards.rb:203:4:203:15 | After ... == ... [true] | true | +| barrier-guards.rb:203:4:203:15 | ... == ... | barrier-guards.rb:203:20:203:31 | After ... == ... [false] | false | +| barrier-guards.rb:203:4:203:15 | ... == ... | barrier-guards.rb:203:20:203:31 | After ... == ... [true] | false | +| barrier-guards.rb:203:4:203:15 | ... == ... | barrier-guards.rb:203:36:203:47 | After ... == ... [false] | false | +| barrier-guards.rb:203:4:203:15 | ... == ... | barrier-guards.rb:203:36:203:47 | After ... == ... [true] | false | +| barrier-guards.rb:203:20:203:31 | ... == ... | barrier-guards.rb:203:20:203:31 | After ... == ... [false] | false | +| barrier-guards.rb:203:20:203:31 | ... == ... | barrier-guards.rb:203:20:203:31 | After ... == ... [true] | true | +| barrier-guards.rb:203:20:203:31 | ... == ... | barrier-guards.rb:203:36:203:47 | After ... == ... [false] | false | +| barrier-guards.rb:203:20:203:31 | ... == ... | barrier-guards.rb:203:36:203:47 | After ... == ... [true] | false | +| barrier-guards.rb:203:36:203:47 | ... == ... | barrier-guards.rb:203:36:203:47 | After ... == ... [false] | false | +| barrier-guards.rb:203:36:203:47 | ... == ... | barrier-guards.rb:203:36:203:47 | After ... == ... [true] | true | +| barrier-guards.rb:207:4:207:15 | ... == ... | barrier-guards.rb:207:4:207:15 | After ... == ... [false] | false | +| barrier-guards.rb:207:4:207:15 | ... == ... | barrier-guards.rb:207:4:207:15 | After ... == ... [true] | true | +| barrier-guards.rb:207:4:207:15 | ... == ... | barrier-guards.rb:207:21:207:21 | After call to x [false] | true | +| barrier-guards.rb:207:4:207:15 | ... == ... | barrier-guards.rb:207:21:207:21 | After call to x [true] | true | +| barrier-guards.rb:207:21:207:21 | call to x | barrier-guards.rb:207:21:207:21 | After call to x [false] | false | +| barrier-guards.rb:207:21:207:21 | call to x | barrier-guards.rb:207:21:207:21 | After call to x [true] | true | +| barrier-guards.rb:211:4:211:4 | call to x | barrier-guards.rb:211:4:211:4 | After call to x [false] | false | +| barrier-guards.rb:211:4:211:4 | call to x | barrier-guards.rb:211:4:211:4 | After call to x [true] | true | +| barrier-guards.rb:211:4:211:4 | call to x | barrier-guards.rb:211:10:211:21 | After ... == ... [false] | true | +| barrier-guards.rb:211:4:211:4 | call to x | barrier-guards.rb:211:10:211:21 | After ... == ... [true] | true | +| barrier-guards.rb:211:10:211:21 | ... == ... | barrier-guards.rb:211:10:211:21 | After ... == ... [false] | false | +| barrier-guards.rb:211:10:211:21 | ... == ... | barrier-guards.rb:211:10:211:21 | After ... == ... [true] | true | +| barrier-guards.rb:215:4:215:4 | call to x | barrier-guards.rb:215:4:215:4 | After call to x [false] | false | +| barrier-guards.rb:215:4:215:4 | call to x | barrier-guards.rb:215:4:215:4 | After call to x [true] | true | +| barrier-guards.rb:215:4:215:4 | call to x | barrier-guards.rb:215:10:215:10 | After call to y [false] | true | +| barrier-guards.rb:215:4:215:4 | call to x | barrier-guards.rb:215:10:215:10 | After call to y [true] | true | +| barrier-guards.rb:215:4:215:4 | call to x | barrier-guards.rb:215:16:215:27 | After ... == ... [false] | true | +| barrier-guards.rb:215:4:215:4 | call to x | barrier-guards.rb:215:16:215:27 | After ... == ... [true] | true | +| barrier-guards.rb:215:10:215:10 | call to y | barrier-guards.rb:215:10:215:10 | After call to y [false] | false | +| barrier-guards.rb:215:10:215:10 | call to y | barrier-guards.rb:215:10:215:10 | After call to y [true] | true | +| barrier-guards.rb:215:10:215:10 | call to y | barrier-guards.rb:215:16:215:27 | After ... == ... [false] | true | +| barrier-guards.rb:215:10:215:10 | call to y | barrier-guards.rb:215:16:215:27 | After ... == ... [true] | true | +| barrier-guards.rb:215:16:215:27 | ... == ... | barrier-guards.rb:215:16:215:27 | After ... == ... [false] | false | +| barrier-guards.rb:215:16:215:27 | ... == ... | barrier-guards.rb:215:16:215:27 | After ... == ... [true] | true | +| barrier-guards.rb:219:4:219:15 | ... == ... | barrier-guards.rb:219:4:219:15 | After ... == ... [false] | false | +| barrier-guards.rb:219:4:219:15 | ... == ... | barrier-guards.rb:219:4:219:15 | After ... == ... [true] | true | +| barrier-guards.rb:219:4:219:15 | ... == ... | barrier-guards.rb:219:21:219:32 | After ... == ... [false] | true | +| barrier-guards.rb:219:4:219:15 | ... == ... | barrier-guards.rb:219:21:219:32 | After ... == ... [true] | true | +| barrier-guards.rb:219:21:219:32 | ... == ... | barrier-guards.rb:219:21:219:32 | After ... == ... [false] | false | +| barrier-guards.rb:219:21:219:32 | ... == ... | barrier-guards.rb:219:21:219:32 | After ... == ... [true] | true | +| barrier-guards.rb:223:4:223:4 | call to x | barrier-guards.rb:223:4:223:4 | After call to x [false] | false | +| barrier-guards.rb:223:4:223:4 | call to x | barrier-guards.rb:223:4:223:4 | After call to x [true] | true | +| barrier-guards.rb:223:4:223:4 | call to x | barrier-guards.rb:223:10:223:10 | After call to y [false] | true | +| barrier-guards.rb:223:4:223:4 | call to x | barrier-guards.rb:223:10:223:10 | After call to y [true] | true | +| barrier-guards.rb:223:10:223:10 | call to y | barrier-guards.rb:223:10:223:10 | After call to y [false] | false | +| barrier-guards.rb:223:10:223:10 | call to y | barrier-guards.rb:223:10:223:10 | After call to y [true] | true | +| barrier-guards.rb:227:4:227:15 | ... == ... | barrier-guards.rb:227:4:227:15 | After ... == ... [false] | false | +| barrier-guards.rb:227:4:227:15 | ... == ... | barrier-guards.rb:227:4:227:15 | After ... == ... [true] | true | +| barrier-guards.rb:227:4:227:15 | ... == ... | barrier-guards.rb:227:21:227:21 | After call to y [false] | true | +| barrier-guards.rb:227:4:227:15 | ... == ... | barrier-guards.rb:227:21:227:21 | After call to y [true] | true | +| barrier-guards.rb:227:21:227:21 | call to y | barrier-guards.rb:227:21:227:21 | After call to y [false] | false | +| barrier-guards.rb:227:21:227:21 | call to y | barrier-guards.rb:227:21:227:21 | After call to y [true] | true | +| barrier-guards.rb:232:6:232:17 | ... == ... | barrier-guards.rb:232:6:232:17 | After ... == ... [match] | match | +| barrier-guards.rb:232:6:232:17 | ... == ... | barrier-guards.rb:232:6:232:17 | After ... == ... [no-match] | no-match | +| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:237:6:237:17 | After ... == ... [match] | match | +| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:237:6:237:17 | After ... == ... [no-match] | no-match | +| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:238:6:238:17 | After ... == ... [match] | no-match | +| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:238:6:238:17 | After ... == ... [no-match] | no-match | +| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:239:6:239:13 | After ... == ... [match] | no-match | +| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:239:6:239:13 | After ... == ... [no-match] | no-match | +| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:238:6:238:17 | After ... == ... [match] | match | +| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:238:6:238:17 | After ... == ... [no-match] | no-match | +| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:239:6:239:13 | After ... == ... [match] | no-match | +| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:239:6:239:13 | After ... == ... [no-match] | no-match | +| barrier-guards.rb:239:6:239:13 | ... == ... | barrier-guards.rb:239:6:239:13 | After ... == ... [match] | match | +| barrier-guards.rb:239:6:239:13 | ... == ... | barrier-guards.rb:239:6:239:13 | After ... == ... [no-match] | no-match | +| barrier-guards.rb:243:4:243:8 | "foo" | barrier-guards.rb:243:4:243:8 | After "foo" [match] | match | +| barrier-guards.rb:243:4:243:8 | "foo" | barrier-guards.rb:243:4:243:8 | After "foo" [no-match] | no-match | +| barrier-guards.rb:243:4:243:8 | "foo" | barrier-guards.rb:245:4:245:4 | After x [match] | no-match | +| barrier-guards.rb:243:4:243:8 | "foo" | barrier-guards.rb:245:4:245:4 | After x [no-match] | no-match | +| barrier-guards.rb:245:4:245:4 | x | barrier-guards.rb:245:4:245:4 | After x [match] | match | +| barrier-guards.rb:245:4:245:4 | x | barrier-guards.rb:245:4:245:4 | After x [no-match] | no-match | +| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:250:4:250:8 | After "foo" [match] | match | +| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:250:4:250:8 | After "foo" [no-match] | no-match | +| barrier-guards.rb:254:4:254:28 | ... == ... | barrier-guards.rb:254:4:254:28 | After ... == ... [false] | false | +| barrier-guards.rb:254:4:254:28 | ... == ... | barrier-guards.rb:254:4:254:28 | After ... == ... [true] | true | +| barrier-guards.rb:259:4:259:16 | ... == ... | barrier-guards.rb:259:4:259:16 | After ... == ... [false] | false | +| barrier-guards.rb:259:4:259:16 | ... == ... | barrier-guards.rb:259:4:259:16 | After ... == ... [true] | true | +| barrier-guards.rb:264:4:264:16 | ... == ... | barrier-guards.rb:264:4:264:16 | After ... == ... [false] | false | +| barrier-guards.rb:264:4:264:16 | ... == ... | barrier-guards.rb:264:4:264:16 | After ... == ... [true] | true | +| barrier-guards.rb:268:4:268:30 | ... == ... | barrier-guards.rb:268:4:268:30 | After ... == ... [false] | false | +| barrier-guards.rb:268:4:268:30 | ... == ... | barrier-guards.rb:268:4:268:30 | After ... == ... [true] | true | +| barrier-guards.rb:272:1:272:12 | ... == ... | barrier-guards.rb:272:1:272:12 | After ... == ... [false] | false | +| barrier-guards.rb:272:1:272:12 | ... == ... | barrier-guards.rb:272:1:272:12 | After ... == ... [true] | true | +| barrier-guards.rb:273:1:273:3 | foo | barrier-guards.rb:273:1:273:3 | After foo [false] | false | +| barrier-guards.rb:273:1:273:3 | foo | barrier-guards.rb:273:1:273:3 | After foo [true] | true | +| barrier-guards.rb:275:4:275:19 | call to include? | barrier-guards.rb:275:4:275:19 | After call to include? [false] | false | +| barrier-guards.rb:275:4:275:19 | call to include? | barrier-guards.rb:275:4:275:19 | After call to include? [true] | true | +| barrier-guards.rb:281:4:281:20 | call to include? | barrier-guards.rb:281:4:281:20 | After call to include? [false] | false | +| barrier-guards.rb:281:4:281:20 | call to include? | barrier-guards.rb:281:4:281:20 | After call to include? [true] | true | +| barrier-guards.rb:286:4:286:20 | call to include? | barrier-guards.rb:286:4:286:20 | After call to include? [false] | false | +| barrier-guards.rb:286:4:286:20 | call to include? | barrier-guards.rb:286:4:286:20 | After call to include? [true] | true | +| barrier-guards.rb:291:6:291:6 | g | barrier-guards.rb:291:6:291:6 | After g [match] | match | +| barrier-guards.rb:291:6:291:6 | g | barrier-guards.rb:291:6:291:6 | After g [no-match] | no-match | +| barrier_flow.rb:10:8:10:18 | ... != ... | barrier_flow.rb:10:8:10:18 | After ... != ... [false] | false | +| barrier_flow.rb:10:8:10:18 | ... != ... | barrier_flow.rb:10:8:10:18 | After ... != ... [true] | true | +| barrier_flow.rb:18:8:18:18 | ... == ... | barrier_flow.rb:18:8:18:18 | After ... == ... [false] | false | +| barrier_flow.rb:18:8:18:18 | ... == ... | barrier_flow.rb:18:8:18:18 | After ... == ... [true] | true | +| barrier_flow.rb:26:19:26:29 | ... == ... | barrier_flow.rb:26:19:26:29 | After ... == ... [false] | false | +| barrier_flow.rb:26:19:26:29 | ... == ... | barrier_flow.rb:26:19:26:29 | After ... == ... [true] | true | +| barrier_flow.rb:32:19:32:29 | ... != ... | barrier_flow.rb:32:19:32:29 | After ... != ... [false] | false | +| barrier_flow.rb:32:19:32:29 | ... != ... | barrier_flow.rb:32:19:32:29 | After ... != ... [true] | true | +| barrier_flow.rb:38:8:38:18 | ... != ... | barrier_flow.rb:38:8:38:18 | After ... != ... [false] | false | +| barrier_flow.rb:38:8:38:18 | ... != ... | barrier_flow.rb:38:8:38:18 | After ... != ... [true] | true | +| barrier_flow.rb:48:23:48:33 | ... == ... | barrier_flow.rb:48:23:48:33 | After ... == ... [false] | false | +| barrier_flow.rb:48:23:48:33 | ... == ... | barrier_flow.rb:48:23:48:33 | After ... == ... [true] | true | +| barrier_flow.rb:56:8:56:8 | b | barrier_flow.rb:56:8:56:8 | After b [false] | false | +| barrier_flow.rb:56:8:56:8 | b | barrier_flow.rb:56:8:56:8 | After b [true] | true | +| barrier_flow.rb:56:8:56:8 | b | barrier_flow.rb:57:23:57:34 | After ... == ... [false] | true | +| barrier_flow.rb:56:8:56:8 | b | barrier_flow.rb:57:23:57:34 | After ... == ... [true] | true | +| barrier_flow.rb:56:8:56:8 | b | barrier_flow.rb:59:23:59:34 | After ... == ... [false] | false | +| barrier_flow.rb:56:8:56:8 | b | barrier_flow.rb:59:23:59:34 | After ... == ... [true] | false | +| barrier_flow.rb:57:23:57:34 | ... == ... | barrier_flow.rb:57:23:57:34 | After ... == ... [false] | false | +| barrier_flow.rb:57:23:57:34 | ... == ... | barrier_flow.rb:57:23:57:34 | After ... == ... [true] | true | +| barrier_flow.rb:59:23:59:34 | ... == ... | barrier_flow.rb:59:23:59:34 | After ... == ... [false] | false | +| barrier_flow.rb:59:23:59:34 | ... == ... | barrier_flow.rb:59:23:59:34 | After ... == ... [true] | true | +| barrier_flow.rb:68:8:68:8 | b | barrier_flow.rb:68:8:68:8 | After b [false] | false | +| barrier_flow.rb:68:8:68:8 | b | barrier_flow.rb:68:8:68:8 | After b [true] | true | +| barrier_flow.rb:68:8:68:8 | b | barrier_flow.rb:69:12:69:23 | After ... != ... [false] | true | +| barrier_flow.rb:68:8:68:8 | b | barrier_flow.rb:69:12:69:23 | After ... != ... [true] | true | +| barrier_flow.rb:68:8:68:8 | b | barrier_flow.rb:73:12:73:23 | After ... != ... [false] | false | +| barrier_flow.rb:68:8:68:8 | b | barrier_flow.rb:73:12:73:23 | After ... != ... [true] | false | +| barrier_flow.rb:69:12:69:23 | ... != ... | barrier_flow.rb:69:12:69:23 | After ... != ... [false] | false | +| barrier_flow.rb:69:12:69:23 | ... != ... | barrier_flow.rb:69:12:69:23 | After ... != ... [true] | true | +| barrier_flow.rb:73:12:73:23 | ... != ... | barrier_flow.rb:73:12:73:23 | After ... != ... [false] | false | +| barrier_flow.rb:73:12:73:23 | ... != ... | barrier_flow.rb:73:12:73:23 | After ... != ... [true] | true | diff --git a/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected b/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected index da64eaf3949c..f3b2972cc2ce 100644 --- a/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected +++ b/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected @@ -2384,6 +2384,8 @@ | local_dataflow.rb:19:5:19:5 | x | local_dataflow.rb:19:5:19:5 | [input] phi | | local_dataflow.rb:19:5:19:5 | x | local_dataflow.rb:19:5:19:5 | phi | | local_dataflow.rb:19:5:19:5 | x | local_dataflow.rb:20:6:20:6 | x | +| local_dataflow.rb:20:3:20:25 | if ... | local_dataflow.rb:19:1:21:3 | ... | +| local_dataflow.rb:20:12:20:21 | then ... | local_dataflow.rb:20:3:20:25 | if ... | | local_dataflow.rb:24:2:24:8 | break | local_dataflow.rb:23:1:25:3 | while ... | | local_dataflow.rb:24:8:24:8 | 5 | local_dataflow.rb:24:2:24:8 | break | | local_dataflow.rb:28:5:28:26 | M | local_dataflow.rb:28:1:28:26 | ... = ... | @@ -2395,10 +2397,12 @@ | local_dataflow.rb:32:14:32:21 | "method" | local_dataflow.rb:32:14:32:21 | ... | | local_dataflow.rb:34:7:34:7 | x | local_dataflow.rb:34:7:34:7 | x | | local_dataflow.rb:34:7:34:7 | x | local_dataflow.rb:35:6:35:6 | x | +| local_dataflow.rb:35:12:36:13 | then ... | local_dataflow.rb:35:3:37:5 | if ... | | local_dataflow.rb:36:13:36:13 | 7 | local_dataflow.rb:36:6:36:13 | return | | local_dataflow.rb:38:3:38:13 | "reachable" | local_dataflow.rb:35:3:38:13 | ... | | local_dataflow.rb:41:7:41:7 | x | local_dataflow.rb:41:7:41:7 | x | | local_dataflow.rb:41:7:41:7 | x | local_dataflow.rb:42:6:42:6 | x | +| local_dataflow.rb:42:12:43:13 | then ... | local_dataflow.rb:42:3:44:5 | if ... | | local_dataflow.rb:43:13:43:13 | 7 | local_dataflow.rb:43:6:43:13 | return | | local_dataflow.rb:45:10:45:10 | 6 | local_dataflow.rb:45:3:45:10 | return | | local_dataflow.rb:49:1:53:3 | [post] self | local_dataflow.rb:55:1:55:14 | self | @@ -2451,6 +2455,7 @@ | local_dataflow.rb:78:12:78:20 | [post] self | local_dataflow.rb:82:7:82:13 | self | | local_dataflow.rb:78:12:78:20 | [post] self | local_dataflow.rb:85:22:85:28 | self | | local_dataflow.rb:78:12:78:20 | [post] self | local_dataflow.rb:86:28:86:34 | self | +| local_dataflow.rb:78:12:78:20 | [post] self | local_dataflow.rb:87:5:87:48 | [input] SSA phi read(self) | | local_dataflow.rb:78:12:78:20 | [post] self | local_dataflow.rb:87:20:87:26 | self | | local_dataflow.rb:78:12:78:20 | call to source | local_dataflow.rb:79:13:79:13 | b | | local_dataflow.rb:78:12:78:20 | call to source | local_dataflow.rb:80:8:80:8 | a | @@ -2459,6 +2464,7 @@ | local_dataflow.rb:78:12:78:20 | self | local_dataflow.rb:82:7:82:13 | self | | local_dataflow.rb:78:12:78:20 | self | local_dataflow.rb:85:22:85:28 | self | | local_dataflow.rb:78:12:78:20 | self | local_dataflow.rb:86:28:86:34 | self | +| local_dataflow.rb:78:12:78:20 | self | local_dataflow.rb:87:5:87:48 | [input] SSA phi read(self) | | local_dataflow.rb:78:12:78:20 | self | local_dataflow.rb:87:20:87:26 | self | | local_dataflow.rb:79:13:79:13 | b | local_dataflow.rb:79:25:79:25 | b | | local_dataflow.rb:79:15:79:45 | then ... | local_dataflow.rb:78:7:88:5 | case ... | @@ -2494,6 +2500,7 @@ | local_dataflow.rb:86:28:86:34 | [post] self | local_dataflow.rb:89:3:89:9 | self | | local_dataflow.rb:86:28:86:34 | call to sink | local_dataflow.rb:86:23:86:53 | then ... | | local_dataflow.rb:86:28:86:34 | self | local_dataflow.rb:89:3:89:9 | self | +| local_dataflow.rb:87:5:87:48 | [input] SSA phi read(self) | local_dataflow.rb:89:3:89:9 | self | | local_dataflow.rb:87:10:87:10 | x | local_dataflow.rb:87:25:87:25 | x | | local_dataflow.rb:87:15:87:48 | then ... | local_dataflow.rb:78:7:88:5 | case ... | | local_dataflow.rb:87:20:87:26 | [post] self | local_dataflow.rb:89:3:89:9 | self | @@ -2681,23 +2688,21 @@ | local_dataflow.rb:136:11:136:11 | [post] x | local_dataflow.rb:137:14:137:14 | x | | local_dataflow.rb:136:11:136:11 | x | local_dataflow.rb:137:14:137:14 | x | | local_dataflow.rb:137:7:138:9 | if ... | local_dataflow.rb:135:5:138:9 | else ... | -| local_dataflow.rb:137:10:137:15 | [input] SSA phi read(self) | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | -| local_dataflow.rb:137:10:137:15 | [input] SSA phi read(x) | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | +| local_dataflow.rb:137:10:137:15 | [input] SSA phi read(self) | local_dataflow.rb:141:9:141:14 | self | +| local_dataflow.rb:137:10:137:15 | [input] SSA phi read(x) | local_dataflow.rb:141:13:141:13 | x | | local_dataflow.rb:137:10:137:15 | [post] self | local_dataflow.rb:137:10:137:15 | [input] SSA phi read(self) | | local_dataflow.rb:137:10:137:15 | [post] self | local_dataflow.rb:137:21:137:26 | self | | local_dataflow.rb:137:10:137:15 | self | local_dataflow.rb:137:10:137:15 | [input] SSA phi read(self) | | local_dataflow.rb:137:10:137:15 | self | local_dataflow.rb:137:21:137:26 | self | | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | local_dataflow.rb:141:9:141:14 | self | -| local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | local_dataflow.rb:141:9:141:14 | self | -| local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | local_dataflow.rb:141:13:141:13 | x | | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | local_dataflow.rb:141:13:141:13 | x | | local_dataflow.rb:137:14:137:14 | [post] x | local_dataflow.rb:137:10:137:15 | [input] SSA phi read(x) | | local_dataflow.rb:137:14:137:14 | [post] x | local_dataflow.rb:137:25:137:25 | x | | local_dataflow.rb:137:14:137:14 | x | local_dataflow.rb:137:10:137:15 | [input] SSA phi read(x) | | local_dataflow.rb:137:14:137:14 | x | local_dataflow.rb:137:25:137:25 | x | | local_dataflow.rb:137:20:137:26 | ! ... | local_dataflow.rb:137:10:137:26 | ... && ... | -| local_dataflow.rb:137:20:137:26 | [input] SSA phi read(self) | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | -| local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | +| local_dataflow.rb:137:20:137:26 | [input] SSA phi read(self) | local_dataflow.rb:141:9:141:14 | self | +| local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | local_dataflow.rb:141:13:141:13 | x | | local_dataflow.rb:137:21:137:26 | [post] self | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:21:137:26 | [post] self | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:21:137:26 | self | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | @@ -2707,8 +2712,8 @@ | local_dataflow.rb:137:25:137:25 | x | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | | local_dataflow.rb:137:25:137:25 | x | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | | local_dataflow.rb:141:8:141:14 | ! ... | local_dataflow.rb:141:8:141:37 | ... \|\| ... | -| local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(self) | -| local_dataflow.rb:141:8:141:14 | [input] SSA phi read(x) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(x) | +| local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | local_dataflow.rb:147:5:147:10 | self | +| local_dataflow.rb:141:8:141:14 | [input] SSA phi read(x) | local_dataflow.rb:147:9:147:9 | x | | local_dataflow.rb:141:9:141:14 | [post] self | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | | local_dataflow.rb:141:9:141:14 | [post] self | local_dataflow.rb:141:20:141:25 | self | | local_dataflow.rb:141:9:141:14 | self | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | @@ -2718,8 +2723,8 @@ | local_dataflow.rb:141:13:141:13 | x | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(x) | | local_dataflow.rb:141:13:141:13 | x | local_dataflow.rb:141:24:141:24 | x | | local_dataflow.rb:141:19:141:37 | ( ... ) | local_dataflow.rb:141:8:141:37 | ... \|\| ... | -| local_dataflow.rb:141:19:141:37 | [input] SSA phi read(self) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(self) | -| local_dataflow.rb:141:19:141:37 | [input] SSA phi read(x) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(x) | +| local_dataflow.rb:141:19:141:37 | [input] SSA phi read(self) | local_dataflow.rb:147:5:147:10 | self | +| local_dataflow.rb:141:19:141:37 | [input] SSA phi read(x) | local_dataflow.rb:147:9:147:9 | x | | local_dataflow.rb:141:19:141:37 | [post] ( ... ) | local_dataflow.rb:141:20:141:36 | [post] ... && ... | | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(self) | local_dataflow.rb:143:11:143:16 | self | | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(x) | local_dataflow.rb:143:15:143:15 | x | @@ -2743,8 +2748,6 @@ | local_dataflow.rb:141:35:141:35 | [post] x | local_dataflow.rb:141:30:141:36 | [input] SSA phi read(x) | | local_dataflow.rb:141:35:141:35 | x | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(x) | | local_dataflow.rb:141:35:141:35 | x | local_dataflow.rb:141:30:141:36 | [input] SSA phi read(x) | -| local_dataflow.rb:141:38:142:9 | [input] SSA phi read(self) | local_dataflow.rb:147:5:147:10 | self | -| local_dataflow.rb:141:38:142:9 | [input] SSA phi read(x) | local_dataflow.rb:147:9:147:9 | x | | local_dataflow.rb:141:38:142:9 | then ... | local_dataflow.rb:141:5:145:7 | if ... | | local_dataflow.rb:142:7:142:9 | nil | local_dataflow.rb:141:38:142:9 | then ... | | local_dataflow.rb:143:5:144:16 | elsif ... | local_dataflow.rb:141:5:145:7 | if ... | diff --git a/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected index 4eaaa96538b2..8825ac720029 100644 --- a/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected +++ b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected @@ -2846,6 +2846,7 @@ | local_dataflow.rb:20:3:20:25 | if ... | local_dataflow.rb:19:1:21:3 | ... | | local_dataflow.rb:20:6:20:6 | x | local_dataflow.rb:20:6:20:10 | ... > ... | | local_dataflow.rb:20:10:20:10 | 1 | local_dataflow.rb:20:6:20:10 | ... > ... | +| local_dataflow.rb:20:12:20:21 | then ... | local_dataflow.rb:20:3:20:25 | if ... | | local_dataflow.rb:24:2:24:8 | break | local_dataflow.rb:23:1:25:3 | while ... | | local_dataflow.rb:24:8:24:8 | 5 | local_dataflow.rb:24:2:24:8 | break | | local_dataflow.rb:28:5:28:26 | M | local_dataflow.rb:28:1:28:26 | ... = ... | @@ -2860,6 +2861,7 @@ | local_dataflow.rb:34:7:34:7 | x | local_dataflow.rb:35:6:35:6 | x | | local_dataflow.rb:35:6:35:6 | x | local_dataflow.rb:35:6:35:11 | ... == ... | | local_dataflow.rb:35:11:35:11 | 4 | local_dataflow.rb:35:6:35:11 | ... == ... | +| local_dataflow.rb:35:12:36:13 | then ... | local_dataflow.rb:35:3:37:5 | if ... | | local_dataflow.rb:36:13:36:13 | 7 | local_dataflow.rb:36:6:36:13 | return | | local_dataflow.rb:38:3:38:13 | "reachable" | local_dataflow.rb:35:3:38:13 | ... | | local_dataflow.rb:41:1:47:3 | synthetic splat parameter | local_dataflow.rb:41:7:41:7 | x | @@ -2867,6 +2869,7 @@ | local_dataflow.rb:41:7:41:7 | x | local_dataflow.rb:42:6:42:6 | x | | local_dataflow.rb:42:6:42:6 | x | local_dataflow.rb:42:6:42:11 | ... == ... | | local_dataflow.rb:42:11:42:11 | 4 | local_dataflow.rb:42:6:42:11 | ... == ... | +| local_dataflow.rb:42:12:43:13 | then ... | local_dataflow.rb:42:3:44:5 | if ... | | local_dataflow.rb:43:13:43:13 | 7 | local_dataflow.rb:43:6:43:13 | return | | local_dataflow.rb:45:10:45:10 | 6 | local_dataflow.rb:45:3:45:10 | return | | local_dataflow.rb:49:1:53:3 | [post] self | local_dataflow.rb:55:1:55:14 | self | @@ -2926,6 +2929,7 @@ | local_dataflow.rb:78:12:78:20 | [post] self | local_dataflow.rb:82:7:82:13 | self | | local_dataflow.rb:78:12:78:20 | [post] self | local_dataflow.rb:85:22:85:28 | self | | local_dataflow.rb:78:12:78:20 | [post] self | local_dataflow.rb:86:28:86:34 | self | +| local_dataflow.rb:78:12:78:20 | [post] self | local_dataflow.rb:87:5:87:48 | [input] SSA phi read(self) | | local_dataflow.rb:78:12:78:20 | [post] self | local_dataflow.rb:87:20:87:26 | self | | local_dataflow.rb:78:12:78:20 | call to source | local_dataflow.rb:79:13:79:13 | b | | local_dataflow.rb:78:12:78:20 | call to source | local_dataflow.rb:80:8:80:8 | a | @@ -2940,6 +2944,7 @@ | local_dataflow.rb:78:12:78:20 | self | local_dataflow.rb:82:7:82:13 | self | | local_dataflow.rb:78:12:78:20 | self | local_dataflow.rb:85:22:85:28 | self | | local_dataflow.rb:78:12:78:20 | self | local_dataflow.rb:86:28:86:34 | self | +| local_dataflow.rb:78:12:78:20 | self | local_dataflow.rb:87:5:87:48 | [input] SSA phi read(self) | | local_dataflow.rb:78:12:78:20 | self | local_dataflow.rb:87:20:87:26 | self | | local_dataflow.rb:79:13:79:13 | b | local_dataflow.rb:79:25:79:25 | b | | local_dataflow.rb:79:15:79:45 | then ... | local_dataflow.rb:78:7:88:5 | case ... | @@ -2978,6 +2983,7 @@ | local_dataflow.rb:86:28:86:34 | [post] self | local_dataflow.rb:89:3:89:9 | self | | local_dataflow.rb:86:28:86:34 | call to sink | local_dataflow.rb:86:23:86:53 | then ... | | local_dataflow.rb:86:28:86:34 | self | local_dataflow.rb:89:3:89:9 | self | +| local_dataflow.rb:87:5:87:48 | [input] SSA phi read(self) | local_dataflow.rb:89:3:89:9 | self | | local_dataflow.rb:87:10:87:10 | x | local_dataflow.rb:87:25:87:25 | x | | local_dataflow.rb:87:15:87:48 | then ... | local_dataflow.rb:78:7:88:5 | case ... | | local_dataflow.rb:87:20:87:26 | [post] self | local_dataflow.rb:89:3:89:9 | self | @@ -3168,23 +3174,21 @@ | local_dataflow.rb:136:11:136:11 | [post] x | local_dataflow.rb:137:14:137:14 | x | | local_dataflow.rb:136:11:136:11 | x | local_dataflow.rb:137:14:137:14 | x | | local_dataflow.rb:137:7:138:9 | if ... | local_dataflow.rb:135:5:138:9 | else ... | -| local_dataflow.rb:137:10:137:15 | [input] SSA phi read(self) | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | -| local_dataflow.rb:137:10:137:15 | [input] SSA phi read(x) | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | +| local_dataflow.rb:137:10:137:15 | [input] SSA phi read(self) | local_dataflow.rb:141:9:141:14 | self | +| local_dataflow.rb:137:10:137:15 | [input] SSA phi read(x) | local_dataflow.rb:141:13:141:13 | x | | local_dataflow.rb:137:10:137:15 | [post] self | local_dataflow.rb:137:10:137:15 | [input] SSA phi read(self) | | local_dataflow.rb:137:10:137:15 | [post] self | local_dataflow.rb:137:21:137:26 | self | | local_dataflow.rb:137:10:137:15 | self | local_dataflow.rb:137:10:137:15 | [input] SSA phi read(self) | | local_dataflow.rb:137:10:137:15 | self | local_dataflow.rb:137:21:137:26 | self | | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | local_dataflow.rb:141:9:141:14 | self | -| local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | local_dataflow.rb:141:9:141:14 | self | -| local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | local_dataflow.rb:141:13:141:13 | x | | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | local_dataflow.rb:141:13:141:13 | x | | local_dataflow.rb:137:14:137:14 | [post] x | local_dataflow.rb:137:10:137:15 | [input] SSA phi read(x) | | local_dataflow.rb:137:14:137:14 | [post] x | local_dataflow.rb:137:25:137:25 | x | | local_dataflow.rb:137:14:137:14 | x | local_dataflow.rb:137:10:137:15 | [input] SSA phi read(x) | | local_dataflow.rb:137:14:137:14 | x | local_dataflow.rb:137:25:137:25 | x | | local_dataflow.rb:137:20:137:26 | ! ... | local_dataflow.rb:137:10:137:26 | ... && ... | -| local_dataflow.rb:137:20:137:26 | [input] SSA phi read(self) | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | -| local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | +| local_dataflow.rb:137:20:137:26 | [input] SSA phi read(self) | local_dataflow.rb:141:9:141:14 | self | +| local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | local_dataflow.rb:141:13:141:13 | x | | local_dataflow.rb:137:21:137:26 | [post] self | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:21:137:26 | [post] self | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:21:137:26 | call to use | local_dataflow.rb:137:20:137:26 | ! ... | @@ -3195,8 +3199,8 @@ | local_dataflow.rb:137:25:137:25 | x | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | | local_dataflow.rb:137:25:137:25 | x | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | | local_dataflow.rb:141:8:141:14 | ! ... | local_dataflow.rb:141:8:141:37 | ... \|\| ... | -| local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(self) | -| local_dataflow.rb:141:8:141:14 | [input] SSA phi read(x) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(x) | +| local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | local_dataflow.rb:147:5:147:10 | self | +| local_dataflow.rb:141:8:141:14 | [input] SSA phi read(x) | local_dataflow.rb:147:9:147:9 | x | | local_dataflow.rb:141:9:141:14 | [post] self | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | | local_dataflow.rb:141:9:141:14 | [post] self | local_dataflow.rb:141:20:141:25 | self | | local_dataflow.rb:141:9:141:14 | call to use | local_dataflow.rb:141:8:141:14 | ! ... | @@ -3207,8 +3211,8 @@ | local_dataflow.rb:141:13:141:13 | x | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(x) | | local_dataflow.rb:141:13:141:13 | x | local_dataflow.rb:141:24:141:24 | x | | local_dataflow.rb:141:19:141:37 | ( ... ) | local_dataflow.rb:141:8:141:37 | ... \|\| ... | -| local_dataflow.rb:141:19:141:37 | [input] SSA phi read(self) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(self) | -| local_dataflow.rb:141:19:141:37 | [input] SSA phi read(x) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(x) | +| local_dataflow.rb:141:19:141:37 | [input] SSA phi read(self) | local_dataflow.rb:147:5:147:10 | self | +| local_dataflow.rb:141:19:141:37 | [input] SSA phi read(x) | local_dataflow.rb:147:9:147:9 | x | | local_dataflow.rb:141:19:141:37 | [post] ( ... ) | local_dataflow.rb:141:20:141:36 | [post] ... && ... | | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(self) | local_dataflow.rb:143:11:143:16 | self | | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(x) | local_dataflow.rb:143:15:143:15 | x | @@ -3233,8 +3237,6 @@ | local_dataflow.rb:141:35:141:35 | [post] x | local_dataflow.rb:141:30:141:36 | [input] SSA phi read(x) | | local_dataflow.rb:141:35:141:35 | x | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(x) | | local_dataflow.rb:141:35:141:35 | x | local_dataflow.rb:141:30:141:36 | [input] SSA phi read(x) | -| local_dataflow.rb:141:38:142:9 | [input] SSA phi read(self) | local_dataflow.rb:147:5:147:10 | self | -| local_dataflow.rb:141:38:142:9 | [input] SSA phi read(x) | local_dataflow.rb:147:9:147:9 | x | | local_dataflow.rb:141:38:142:9 | then ... | local_dataflow.rb:141:5:145:7 | if ... | | local_dataflow.rb:142:7:142:9 | nil | local_dataflow.rb:141:38:142:9 | then ... | | local_dataflow.rb:143:5:144:16 | elsif ... | local_dataflow.rb:141:5:145:7 | if ... | diff --git a/ruby/ql/test/library-tests/variables/ssa.expected b/ruby/ql/test/library-tests/variables/ssa.expected index dfea893b9490..7fb3c27be81c 100644 --- a/ruby/ql/test/library-tests/variables/ssa.expected +++ b/ruby/ql/test/library-tests/variables/ssa.expected @@ -99,11 +99,15 @@ definition | scopes.rb:13:11:13:11 | c | scopes.rb:13:11:13:11 | c | | scopes.rb:13:14:13:14 | d | scopes.rb:13:14:13:14 | d | | scopes.rb:13:19:13:32 | __synth__3 | scopes.rb:13:4:13:32 | __synth__3 | +| scopes.rb:26:1:26:12 | self (A) | scopes.rb:26:1:26:12 | self | | scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | +| scopes.rb:28:1:30:3 | self (B) | scopes.rb:28:1:30:3 | self | +| scopes.rb:34:1:36:3 | self (C) | scopes.rb:34:1:36:3 | self | | scopes.rb:41:1:49:3 | self (M) | scopes.rb:41:1:49:3 | self | | scopes.rb:42:2:42:4 | var | scopes.rb:42:2:42:4 | var | | scopes.rb:46:5:46:8 | var2 | scopes.rb:46:5:46:8 | var2 | | scopes.rb:51:1:64:3 | self (ExceptionVariable) | scopes.rb:51:1:64:3 | self | +| scopes.rb:52:3:53:5 | self (MyException) | scopes.rb:52:3:53:5 | self | | scopes.rb:55:3:55:3 | x | scopes.rb:55:3:55:3 | x | | scopes.rb:60:25:60:25 | x | scopes.rb:55:3:55:3 | x | | scopes.rb:66:1:73:3 | self (ParameterShadowing) | scopes.rb:66:1:73:3 | self | From 0ffc606e605784c7d543f82da9bdf7033f0e17cb Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Wed, 12 Aug 2026 14:14:29 +0200 Subject: [PATCH 0435/2098] Ruby: Fix joinorder. --- .../lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll index 3d3e8a4d0d04..184efdc31b3e 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll @@ -692,6 +692,9 @@ private CfgScope getTargetInstance(DataFlowCall call, string method) { ) } +pragma[nomagic] +private File callGetFile(DataFlowCall call) { result = call.asCall().getLocation().getFile() } + bindingset[call, result] pragma[inline_late] private CfgScope privateFilter(DataFlowCall call) { @@ -700,7 +703,7 @@ private CfgScope privateFilter(DataFlowCall call) { // This may remove some plausible targets, but also removes a lot of // implausible targets ( - isToplevelMethodInFile(result, call.asCall().getLocation().getFile()) or + isToplevelMethodInFile(result, callGetFile(call)) or not isToplevelMethodInFile(result, _) ) } From 496f9e66421a1864022cf75b09bc07aa807a67f9 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 20 Aug 2026 13:24:24 +0200 Subject: [PATCH 0436/2098] Ruby: Reintroduce lack of BeginExpr nodes. --- ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll b/ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll index 72806211f3f7..8439c1a22621 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll @@ -424,6 +424,13 @@ module ExprNodes { /** A control-flow node that wraps a `StmtSequence` AST expression. */ class StmtSequenceCfgNode extends ExprCfgNode { + // TODO: This charpred represents a bug and should be removed when the + // resulting additional data flow does not break performance. + // The old CFG did not include `BeginExpr` nodes in the CFG, but the + // current CFG does. This charpred thus keeps a small subset of the old + // behavior in order to avoid regressions. + StmtSequenceCfgNode() { not super.getExpr() instanceof BeginExpr } + override string getAPrimaryQlClass() { result = "StmtSequenceCfgNode" } override StmtSequence e; From 879280ae466b803b4c0ee2fc85ac97ef848bb956 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 20 Aug 2026 15:08:01 +0200 Subject: [PATCH 0437/2098] Ruby: Accept qltest changes from BeginExpr test. --- .../library-tests/dataflow/local/DataflowStep.expected | 7 +++++++ .../test/library-tests/dataflow/local/TaintStep.expected | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected b/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected index f3b2972cc2ce..edc95fe8a7df 100644 --- a/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected +++ b/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected @@ -2792,7 +2792,10 @@ | local_dataflow.rb:152:16:152:16 | r | local_dataflow.rb:152:16:152:16 | r | | local_dataflow.rb:152:16:152:16 | r | local_dataflow.rb:154:26:154:26 | r | | local_dataflow.rb:153:3:153:3 | x | local_dataflow.rb:161:8:161:8 | x | +| local_dataflow.rb:153:7:160:9 | begin ... | local_dataflow.rb:153:3:153:3 | x | +| local_dataflow.rb:153:7:160:9 | begin ... | local_dataflow.rb:153:3:160:9 | ... = ... | | local_dataflow.rb:154:9:154:21 | [post] self | local_dataflow.rb:157:9:157:17 | self | +| local_dataflow.rb:154:9:154:21 | call to raise | local_dataflow.rb:154:9:154:26 | ... if ... | | local_dataflow.rb:154:9:154:21 | self | local_dataflow.rb:157:9:157:17 | self | | local_dataflow.rb:154:26:154:26 | r | local_dataflow.rb:164:26:164:26 | r | | local_dataflow.rb:155:9:155:17 | [post] self | local_dataflow.rb:157:9:157:17 | self | @@ -2810,7 +2813,10 @@ | local_dataflow.rb:161:3:161:9 | self | local_dataflow.rb:164:9:164:21 | self | | local_dataflow.rb:161:3:161:9 | self | local_dataflow.rb:165:9:165:17 | self | | local_dataflow.rb:163:3:163:3 | y | local_dataflow.rb:173:8:173:8 | y | +| local_dataflow.rb:163:7:172:9 | begin ... | local_dataflow.rb:163:3:163:3 | y | +| local_dataflow.rb:163:7:172:9 | begin ... | local_dataflow.rb:163:3:172:9 | ... = ... | | local_dataflow.rb:164:9:164:21 | [post] self | local_dataflow.rb:167:9:167:17 | self | +| local_dataflow.rb:164:9:164:21 | call to raise | local_dataflow.rb:164:9:164:26 | ... if ... | | local_dataflow.rb:164:9:164:21 | self | local_dataflow.rb:167:9:167:17 | self | | local_dataflow.rb:165:9:165:17 | [post] self | local_dataflow.rb:167:9:167:17 | self | | local_dataflow.rb:165:9:165:17 | [post] self | local_dataflow.rb:169:9:169:17 | self | @@ -2825,3 +2831,4 @@ | local_dataflow.rb:171:9:171:17 | [post] self | local_dataflow.rb:173:3:173:9 | self | | local_dataflow.rb:171:9:171:17 | call to source | local_dataflow.rb:170:7:171:17 | ensure ... | | local_dataflow.rb:171:9:171:17 | self | local_dataflow.rb:173:3:173:9 | self | +| local_dataflow.rb:173:3:173:9 | call to sink | local_dataflow.rb:153:3:173:52 | ... | diff --git a/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected index 8825ac720029..22c75e5eb970 100644 --- a/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected +++ b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected @@ -3282,7 +3282,10 @@ | local_dataflow.rb:152:16:152:16 | r | local_dataflow.rb:152:16:152:16 | r | | local_dataflow.rb:152:16:152:16 | r | local_dataflow.rb:154:26:154:26 | r | | local_dataflow.rb:153:3:153:3 | x | local_dataflow.rb:161:8:161:8 | x | +| local_dataflow.rb:153:7:160:9 | begin ... | local_dataflow.rb:153:3:153:3 | x | +| local_dataflow.rb:153:7:160:9 | begin ... | local_dataflow.rb:153:3:160:9 | ... = ... | | local_dataflow.rb:154:9:154:21 | [post] self | local_dataflow.rb:157:9:157:17 | self | +| local_dataflow.rb:154:9:154:21 | call to raise | local_dataflow.rb:154:9:154:26 | ... if ... | | local_dataflow.rb:154:9:154:21 | self | local_dataflow.rb:157:9:157:17 | self | | local_dataflow.rb:154:26:154:26 | r | local_dataflow.rb:164:26:164:26 | r | | local_dataflow.rb:155:9:155:17 | [post] self | local_dataflow.rb:157:9:157:17 | self | @@ -3300,7 +3303,10 @@ | local_dataflow.rb:161:3:161:9 | self | local_dataflow.rb:164:9:164:21 | self | | local_dataflow.rb:161:3:161:9 | self | local_dataflow.rb:165:9:165:17 | self | | local_dataflow.rb:163:3:163:3 | y | local_dataflow.rb:173:8:173:8 | y | +| local_dataflow.rb:163:7:172:9 | begin ... | local_dataflow.rb:163:3:163:3 | y | +| local_dataflow.rb:163:7:172:9 | begin ... | local_dataflow.rb:163:3:172:9 | ... = ... | | local_dataflow.rb:164:9:164:21 | [post] self | local_dataflow.rb:167:9:167:17 | self | +| local_dataflow.rb:164:9:164:21 | call to raise | local_dataflow.rb:164:9:164:26 | ... if ... | | local_dataflow.rb:164:9:164:21 | self | local_dataflow.rb:167:9:167:17 | self | | local_dataflow.rb:165:9:165:17 | [post] self | local_dataflow.rb:167:9:167:17 | self | | local_dataflow.rb:165:9:165:17 | [post] self | local_dataflow.rb:169:9:169:17 | self | @@ -3315,3 +3321,4 @@ | local_dataflow.rb:171:9:171:17 | [post] self | local_dataflow.rb:173:3:173:9 | self | | local_dataflow.rb:171:9:171:17 | call to source | local_dataflow.rb:170:7:171:17 | ensure ... | | local_dataflow.rb:171:9:171:17 | self | local_dataflow.rb:173:3:173:9 | self | +| local_dataflow.rb:173:3:173:9 | call to sink | local_dataflow.rb:153:3:173:52 | ... | From 2bbab1b4a6a658aafa735c4e5e49235e12630573 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 20 Aug 2026 14:13:33 +0000 Subject: [PATCH 0438/2098] Release preparation for version 2.26.4 --- actions/ql/lib/CHANGELOG.md | 11 ++++++++++ ...6-07-22-environment-check-sanitizer-mad.md | 4 ---- ...026-08-17-actor-if-check-event-validity.md | 4 ---- .../2026-08-18-split-event-actor-if-check.md | 4 ---- actions/ql/lib/change-notes/released/0.6.0.md | 10 +++++++++ actions/ql/lib/codeql-pack.release.yml | 2 +- actions/ql/lib/qlpack.yml | 2 +- actions/ql/src/CHANGELOG.md | 6 ++++++ .../0.6.34.md} | 7 ++++--- actions/ql/src/codeql-pack.release.yml | 2 +- actions/ql/src/qlpack.yml | 2 +- cpp/ql/lib/CHANGELOG.md | 4 ++++ cpp/ql/lib/change-notes/released/12.0.3.md | 3 +++ cpp/ql/lib/codeql-pack.release.yml | 2 +- cpp/ql/lib/qlpack.yml | 2 +- cpp/ql/src/CHANGELOG.md | 4 ++++ cpp/ql/src/change-notes/released/1.8.2.md | 3 +++ cpp/ql/src/codeql-pack.release.yml | 2 +- cpp/ql/src/qlpack.yml | 2 +- .../ql/campaigns/Solorigate/lib/CHANGELOG.md | 4 ++++ .../lib/change-notes/released/1.7.73.md | 3 +++ .../Solorigate/lib/codeql-pack.release.yml | 2 +- csharp/ql/campaigns/Solorigate/lib/qlpack.yml | 2 +- .../ql/campaigns/Solorigate/src/CHANGELOG.md | 4 ++++ .../src/change-notes/released/1.7.73.md | 3 +++ .../Solorigate/src/codeql-pack.release.yml | 2 +- csharp/ql/campaigns/Solorigate/src/qlpack.yml | 2 +- csharp/ql/lib/CHANGELOG.md | 10 +++++++++ .../2026-08-15-additional-taint-step.md | 4 ---- .../7.2.0.md} | 11 +++++++--- csharp/ql/lib/codeql-pack.release.yml | 2 +- csharp/ql/lib/qlpack.yml | 2 +- csharp/ql/src/CHANGELOG.md | 13 ++++++++++++ ...-07-15-static-member-enclosing-callable.md | 4 ---- .../2026-07-16-virtual-call-in-constructor.md | 4 ---- .../2026-08-09-require-antiforgery-token.md | 4 ---- ...6-08-13-simplifiable-operator-recursion.md | 4 ---- .../2026-08-20-harden-useless-cast-to-self.md | 4 ---- csharp/ql/src/change-notes/released/1.9.2.md | 12 +++++++++++ csharp/ql/src/codeql-pack.release.yml | 2 +- csharp/ql/src/qlpack.yml | 2 +- go/ql/consistency-queries/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.56.md | 3 +++ .../codeql-pack.release.yml | 2 +- go/ql/consistency-queries/qlpack.yml | 2 +- go/ql/lib/CHANGELOG.md | 6 ++++++ go/ql/lib/change-notes/2026-06-25-go-1.27.md | 4 ---- go/ql/lib/change-notes/released/7.3.0.md | 5 +++++ go/ql/lib/codeql-pack.release.yml | 2 +- go/ql/lib/qlpack.yml | 2 +- go/ql/src/CHANGELOG.md | 4 ++++ go/ql/src/change-notes/released/1.6.9.md | 3 +++ go/ql/src/codeql-pack.release.yml | 2 +- go/ql/src/qlpack.yml | 2 +- java/ql/lib/CHANGELOG.md | 7 +++++++ .../2026-08-04-spring-r2dbc-sql-injection.md | 4 ---- .../9.2.4.md} | 8 ++++--- java/ql/lib/codeql-pack.release.yml | 2 +- java/ql/lib/qlpack.yml | 2 +- java/ql/src/CHANGELOG.md | 4 ++++ java/ql/src/change-notes/released/1.11.9.md | 3 +++ java/ql/src/codeql-pack.release.yml | 2 +- java/ql/src/qlpack.yml | 2 +- javascript/ql/lib/CHANGELOG.md | 14 +++++++++++-- .../change-notes/2026-08-10-d-regex-flag.md | 4 ---- .../2026-08-10-worklet-directive.md | 5 ----- .../ql/lib/change-notes/released/2.10.0.md | 9 ++++++++ javascript/ql/lib/codeql-pack.release.yml | 2 +- javascript/ql/lib/qlpack.yml | 2 +- javascript/ql/src/CHANGELOG.md | 6 ++++++ .../2.4.4.md} | 7 ++++--- javascript/ql/src/codeql-pack.release.yml | 2 +- javascript/ql/src/qlpack.yml | 2 +- misc/suite-helpers/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.56.md | 3 +++ misc/suite-helpers/codeql-pack.release.yml | 2 +- misc/suite-helpers/qlpack.yml | 2 +- python/ql/lib/CHANGELOG.md | 6 ++++++ .../7.2.4.md} | 7 ++++--- python/ql/lib/codeql-pack.release.yml | 2 +- python/ql/lib/qlpack.yml | 2 +- python/ql/src/CHANGELOG.md | 4 ++++ python/ql/src/change-notes/released/1.8.9.md | 3 +++ python/ql/src/codeql-pack.release.yml | 2 +- python/ql/src/qlpack.yml | 2 +- ruby/ql/lib/CHANGELOG.md | 8 ++++++- .../6.0.4.md} | 7 ++++--- ruby/ql/lib/codeql-pack.release.yml | 2 +- ruby/ql/lib/qlpack.yml | 2 +- ruby/ql/src/CHANGELOG.md | 4 ++++ ruby/ql/src/change-notes/released/1.6.9.md | 3 +++ ruby/ql/src/codeql-pack.release.yml | 2 +- ruby/ql/src/qlpack.yml | 2 +- rust/ql/lib/CHANGELOG.md | 21 +++++++++++++++++++ .../2026-08-03-rust-analyzer-0.0.328.md | 4 ---- .../2026-08-05-data-flow-alert-locations.md | 12 ----------- .../2026-08-19-trait-canonical-paths.md | 6 ------ rust/ql/lib/change-notes/released/0.2.20.md | 20 ++++++++++++++++++ rust/ql/lib/codeql-pack.release.yml | 2 +- rust/ql/lib/qlpack.yml | 2 +- rust/ql/src/CHANGELOG.md | 4 ++++ rust/ql/src/change-notes/released/0.1.41.md | 3 +++ rust/ql/src/codeql-pack.release.yml | 2 +- rust/ql/src/qlpack.yml | 2 +- shared/concepts/CHANGELOG.md | 4 ++++ .../concepts/change-notes/released/0.0.30.md | 3 +++ shared/concepts/codeql-pack.release.yml | 2 +- shared/concepts/qlpack.yml | 2 +- shared/controlflow/CHANGELOG.md | 4 ++++ .../change-notes/released/2.0.40.md | 3 +++ shared/controlflow/codeql-pack.release.yml | 2 +- shared/controlflow/qlpack.yml | 2 +- shared/dataflow/CHANGELOG.md | 4 ++++ .../dataflow/change-notes/released/2.1.12.md | 3 +++ shared/dataflow/codeql-pack.release.yml | 2 +- shared/dataflow/qlpack.yml | 2 +- shared/mad/CHANGELOG.md | 4 ++++ shared/mad/change-notes/released/1.0.56.md | 3 +++ shared/mad/codeql-pack.release.yml | 2 +- shared/mad/qlpack.yml | 2 +- shared/namebinding/CHANGELOG.md | 4 ++++ .../change-notes/released/0.0.5.md | 3 +++ shared/namebinding/codeql-pack.release.yml | 2 +- shared/namebinding/qlpack.yml | 2 +- shared/quantum/CHANGELOG.md | 4 ++++ .../quantum/change-notes/released/0.0.34.md | 3 +++ shared/quantum/codeql-pack.release.yml | 2 +- shared/quantum/qlpack.yml | 2 +- shared/rangeanalysis/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.56.md | 3 +++ shared/rangeanalysis/codeql-pack.release.yml | 2 +- shared/rangeanalysis/qlpack.yml | 2 +- shared/regex/CHANGELOG.md | 4 ++++ shared/regex/change-notes/released/1.0.56.md | 3 +++ shared/regex/codeql-pack.release.yml | 2 +- shared/regex/qlpack.yml | 2 +- shared/ssa/CHANGELOG.md | 4 ++++ shared/ssa/change-notes/released/2.0.32.md | 3 +++ shared/ssa/codeql-pack.release.yml | 2 +- shared/ssa/qlpack.yml | 2 +- shared/threat-models/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.56.md | 3 +++ shared/threat-models/codeql-pack.release.yml | 2 +- shared/threat-models/qlpack.yml | 2 +- shared/tutorial/CHANGELOG.md | 4 ++++ .../tutorial/change-notes/released/1.0.56.md | 3 +++ shared/tutorial/codeql-pack.release.yml | 2 +- shared/tutorial/qlpack.yml | 2 +- shared/typeflow/CHANGELOG.md | 4 ++++ .../typeflow/change-notes/released/1.0.56.md | 3 +++ shared/typeflow/codeql-pack.release.yml | 2 +- shared/typeflow/qlpack.yml | 2 +- shared/typeinference/CHANGELOG.md | 4 ++++ .../change-notes/released/0.0.37.md | 3 +++ shared/typeinference/codeql-pack.release.yml | 2 +- shared/typeinference/qlpack.yml | 2 +- shared/typetracking/CHANGELOG.md | 4 ++++ .../change-notes/released/2.0.40.md | 3 +++ shared/typetracking/codeql-pack.release.yml | 2 +- shared/typetracking/qlpack.yml | 2 +- shared/typos/CHANGELOG.md | 4 ++++ shared/typos/change-notes/released/1.0.56.md | 3 +++ shared/typos/codeql-pack.release.yml | 2 +- shared/typos/qlpack.yml | 2 +- shared/util/CHANGELOG.md | 4 ++++ shared/util/change-notes/released/2.0.43.md | 3 +++ shared/util/codeql-pack.release.yml | 2 +- shared/util/qlpack.yml | 2 +- shared/xml/CHANGELOG.md | 4 ++++ shared/xml/change-notes/released/1.0.56.md | 3 +++ shared/xml/codeql-pack.release.yml | 2 +- shared/xml/qlpack.yml | 2 +- shared/yaml/CHANGELOG.md | 4 ++++ shared/yaml/change-notes/released/1.0.56.md | 3 +++ shared/yaml/codeql-pack.release.yml | 2 +- shared/yaml/qlpack.yml | 2 +- swift/ql/lib/CHANGELOG.md | 4 ++++ swift/ql/lib/change-notes/released/6.8.2.md | 3 +++ swift/ql/lib/codeql-pack.release.yml | 2 +- swift/ql/lib/qlpack.yml | 2 +- swift/ql/src/CHANGELOG.md | 4 ++++ swift/ql/src/change-notes/released/1.3.9.md | 3 +++ swift/ql/src/codeql-pack.release.yml | 2 +- swift/ql/src/qlpack.yml | 2 +- 184 files changed, 491 insertions(+), 180 deletions(-) delete mode 100644 actions/ql/lib/change-notes/2026-07-22-environment-check-sanitizer-mad.md delete mode 100644 actions/ql/lib/change-notes/2026-08-17-actor-if-check-event-validity.md delete mode 100644 actions/ql/lib/change-notes/2026-08-18-split-event-actor-if-check.md create mode 100644 actions/ql/lib/change-notes/released/0.6.0.md rename actions/ql/src/change-notes/{2026-08-05-unpinned-reusable-workflows.md => released/0.6.34.md} (66%) create mode 100644 cpp/ql/lib/change-notes/released/12.0.3.md create mode 100644 cpp/ql/src/change-notes/released/1.8.2.md create mode 100644 csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.73.md create mode 100644 csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.73.md delete mode 100644 csharp/ql/lib/change-notes/2026-08-15-additional-taint-step.md rename csharp/ql/lib/change-notes/{2026-07-17-nuget-package-restore.md => released/7.2.0.md} (63%) delete mode 100644 csharp/ql/src/change-notes/2026-07-15-static-member-enclosing-callable.md delete mode 100644 csharp/ql/src/change-notes/2026-07-16-virtual-call-in-constructor.md delete mode 100644 csharp/ql/src/change-notes/2026-08-09-require-antiforgery-token.md delete mode 100644 csharp/ql/src/change-notes/2026-08-13-simplifiable-operator-recursion.md delete mode 100644 csharp/ql/src/change-notes/2026-08-20-harden-useless-cast-to-self.md create mode 100644 csharp/ql/src/change-notes/released/1.9.2.md create mode 100644 go/ql/consistency-queries/change-notes/released/1.0.56.md delete mode 100644 go/ql/lib/change-notes/2026-06-25-go-1.27.md create mode 100644 go/ql/lib/change-notes/released/7.3.0.md create mode 100644 go/ql/src/change-notes/released/1.6.9.md delete mode 100644 java/ql/lib/change-notes/2026-08-04-spring-r2dbc-sql-injection.md rename java/ql/lib/change-notes/{2026-08-11-string-valueof-charsequence.md => released/9.2.4.md} (65%) create mode 100644 java/ql/src/change-notes/released/1.11.9.md delete mode 100644 javascript/ql/lib/change-notes/2026-08-10-d-regex-flag.md delete mode 100644 javascript/ql/lib/change-notes/2026-08-10-worklet-directive.md create mode 100644 javascript/ql/lib/change-notes/released/2.10.0.md rename javascript/ql/src/change-notes/{2026-08-14-transformstream-constructor-arity.md => released/2.4.4.md} (74%) create mode 100644 misc/suite-helpers/change-notes/released/1.0.56.md rename python/ql/lib/change-notes/{2026-08-10-list-extend-insert-taint.md => released/7.2.4.md} (72%) create mode 100644 python/ql/src/change-notes/released/1.8.9.md rename ruby/ql/lib/change-notes/{2026-08-11-regex-tracking.md => released/6.0.4.md} (76%) create mode 100644 ruby/ql/src/change-notes/released/1.6.9.md delete mode 100644 rust/ql/lib/change-notes/2026-08-03-rust-analyzer-0.0.328.md delete mode 100644 rust/ql/lib/change-notes/2026-08-05-data-flow-alert-locations.md delete mode 100644 rust/ql/lib/change-notes/2026-08-19-trait-canonical-paths.md create mode 100644 rust/ql/lib/change-notes/released/0.2.20.md create mode 100644 rust/ql/src/change-notes/released/0.1.41.md create mode 100644 shared/concepts/change-notes/released/0.0.30.md create mode 100644 shared/controlflow/change-notes/released/2.0.40.md create mode 100644 shared/dataflow/change-notes/released/2.1.12.md create mode 100644 shared/mad/change-notes/released/1.0.56.md create mode 100644 shared/namebinding/change-notes/released/0.0.5.md create mode 100644 shared/quantum/change-notes/released/0.0.34.md create mode 100644 shared/rangeanalysis/change-notes/released/1.0.56.md create mode 100644 shared/regex/change-notes/released/1.0.56.md create mode 100644 shared/ssa/change-notes/released/2.0.32.md create mode 100644 shared/threat-models/change-notes/released/1.0.56.md create mode 100644 shared/tutorial/change-notes/released/1.0.56.md create mode 100644 shared/typeflow/change-notes/released/1.0.56.md create mode 100644 shared/typeinference/change-notes/released/0.0.37.md create mode 100644 shared/typetracking/change-notes/released/2.0.40.md create mode 100644 shared/typos/change-notes/released/1.0.56.md create mode 100644 shared/util/change-notes/released/2.0.43.md create mode 100644 shared/xml/change-notes/released/1.0.56.md create mode 100644 shared/yaml/change-notes/released/1.0.56.md create mode 100644 swift/ql/lib/change-notes/released/6.8.2.md create mode 100644 swift/ql/src/change-notes/released/1.3.9.md diff --git a/actions/ql/lib/CHANGELOG.md b/actions/ql/lib/CHANGELOG.md index ea32d9c07193..e686c4d596f4 100644 --- a/actions/ql/lib/CHANGELOG.md +++ b/actions/ql/lib/CHANGELOG.md @@ -1,3 +1,14 @@ +## 0.6.0 + +### Breaking Changes + +* Checks on actor fields read from the event payload (e.g. `github.event.pull_request.user.login`) were split out of `ActorIfCheck` into a new class `EventActorIfCheck`. The `ActorIfCheck` class now only covers `github.actor` and `github.triggering_actor`. + +### Minor Analysis Improvements + +* Checks on actor fields read from the event payload (e.g. `github.event.pull_request.user.login`) now only count as protection for events whose payload actually populates that field. Previously, a condition such as `github.event.pull_request.user.login != 'name'` on a workflow triggered by `issues` events was treated as a protective check even though `github.event.pull_request` is not populated for `issues` events, which makes the condition vacuous. This change may result in more alerts for queries using the `ControlCheck` class. +* Added an option to `EnvironmentCheck` to become specified by a MaD model, otherwise it will continue as the default it previously was. Without adding models to `actions/ql/lib/ext/config/deployment_environment.yml` the behavior of every query will be unchanged. When models are added queries using `ControlCheck` may find more results in cases where an environment is no longer a sufficient sanitizer. + ## 0.5.0 ### Breaking Changes diff --git a/actions/ql/lib/change-notes/2026-07-22-environment-check-sanitizer-mad.md b/actions/ql/lib/change-notes/2026-07-22-environment-check-sanitizer-mad.md deleted file mode 100644 index 0af62ba426de..000000000000 --- a/actions/ql/lib/change-notes/2026-07-22-environment-check-sanitizer-mad.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added an option to `EnvironmentCheck` to become specified by a MaD model, otherwise it will continue as the default it previously was. Without adding models to `actions/ql/lib/ext/config/deployment_environment.yml` the behavior of every query will be unchanged. When models are added queries using `ControlCheck` may find more results in cases where an environment is no longer a sufficient sanitizer. \ No newline at end of file diff --git a/actions/ql/lib/change-notes/2026-08-17-actor-if-check-event-validity.md b/actions/ql/lib/change-notes/2026-08-17-actor-if-check-event-validity.md deleted file mode 100644 index 72f3c3fd4ece..000000000000 --- a/actions/ql/lib/change-notes/2026-08-17-actor-if-check-event-validity.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Checks on actor fields read from the event payload (e.g. `github.event.pull_request.user.login`) now only count as protection for events whose payload actually populates that field. Previously, a condition such as `github.event.pull_request.user.login != 'name'` on a workflow triggered by `issues` events was treated as a protective check even though `github.event.pull_request` is not populated for `issues` events, which makes the condition vacuous. This change may result in more alerts for queries using the `ControlCheck` class. diff --git a/actions/ql/lib/change-notes/2026-08-18-split-event-actor-if-check.md b/actions/ql/lib/change-notes/2026-08-18-split-event-actor-if-check.md deleted file mode 100644 index 6b6d94df337c..000000000000 --- a/actions/ql/lib/change-notes/2026-08-18-split-event-actor-if-check.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: breaking ---- -* Checks on actor fields read from the event payload (e.g. `github.event.pull_request.user.login`) were split out of `ActorIfCheck` into a new class `EventActorIfCheck`. The `ActorIfCheck` class now only covers `github.actor` and `github.triggering_actor`. diff --git a/actions/ql/lib/change-notes/released/0.6.0.md b/actions/ql/lib/change-notes/released/0.6.0.md new file mode 100644 index 000000000000..3fd465a31cf3 --- /dev/null +++ b/actions/ql/lib/change-notes/released/0.6.0.md @@ -0,0 +1,10 @@ +## 0.6.0 + +### Breaking Changes + +* Checks on actor fields read from the event payload (e.g. `github.event.pull_request.user.login`) were split out of `ActorIfCheck` into a new class `EventActorIfCheck`. The `ActorIfCheck` class now only covers `github.actor` and `github.triggering_actor`. + +### Minor Analysis Improvements + +* Checks on actor fields read from the event payload (e.g. `github.event.pull_request.user.login`) now only count as protection for events whose payload actually populates that field. Previously, a condition such as `github.event.pull_request.user.login != 'name'` on a workflow triggered by `issues` events was treated as a protective check even though `github.event.pull_request` is not populated for `issues` events, which makes the condition vacuous. This change may result in more alerts for queries using the `ControlCheck` class. +* Added an option to `EnvironmentCheck` to become specified by a MaD model, otherwise it will continue as the default it previously was. Without adding models to `actions/ql/lib/ext/config/deployment_environment.yml` the behavior of every query will be unchanged. When models are added queries using `ControlCheck` may find more results in cases where an environment is no longer a sufficient sanitizer. diff --git a/actions/ql/lib/codeql-pack.release.yml b/actions/ql/lib/codeql-pack.release.yml index 30e271c5361c..a3f820f884d3 100644 --- a/actions/ql/lib/codeql-pack.release.yml +++ b/actions/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.5.0 +lastReleaseVersion: 0.6.0 diff --git a/actions/ql/lib/qlpack.yml b/actions/ql/lib/qlpack.yml index d34e010773d5..f4e4fbd9c564 100644 --- a/actions/ql/lib/qlpack.yml +++ b/actions/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-all -version: 0.5.1-dev +version: 0.6.0 library: true warnOnImplicitThis: true dependencies: diff --git a/actions/ql/src/CHANGELOG.md b/actions/ql/src/CHANGELOG.md index 84f8321799d8..6a4f17d872be 100644 --- a/actions/ql/src/CHANGELOG.md +++ b/actions/ql/src/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.6.34 + +### Minor Analysis Improvements + +* The `actions/unpinned-tag` query now detects mutable references to reusable workflows. + ## 0.6.33 ### Query Metadata Changes diff --git a/actions/ql/src/change-notes/2026-08-05-unpinned-reusable-workflows.md b/actions/ql/src/change-notes/released/0.6.34.md similarity index 66% rename from actions/ql/src/change-notes/2026-08-05-unpinned-reusable-workflows.md rename to actions/ql/src/change-notes/released/0.6.34.md index 6269fdec14e6..cfb871641149 100644 --- a/actions/ql/src/change-notes/2026-08-05-unpinned-reusable-workflows.md +++ b/actions/ql/src/change-notes/released/0.6.34.md @@ -1,4 +1,5 @@ ---- -category: minorAnalysis ---- +## 0.6.34 + +### Minor Analysis Improvements + * The `actions/unpinned-tag` query now detects mutable references to reusable workflows. diff --git a/actions/ql/src/codeql-pack.release.yml b/actions/ql/src/codeql-pack.release.yml index ce257a8193e6..fe5075b50fbd 100644 --- a/actions/ql/src/codeql-pack.release.yml +++ b/actions/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.6.33 +lastReleaseVersion: 0.6.34 diff --git a/actions/ql/src/qlpack.yml b/actions/ql/src/qlpack.yml index 7fd1cb7e8d76..4377b8b8bf64 100644 --- a/actions/ql/src/qlpack.yml +++ b/actions/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-queries -version: 0.6.34-dev +version: 0.6.34 library: false warnOnImplicitThis: true groups: [actions, queries] diff --git a/cpp/ql/lib/CHANGELOG.md b/cpp/ql/lib/CHANGELOG.md index 04ad4bba646b..eb81fb24c603 100644 --- a/cpp/ql/lib/CHANGELOG.md +++ b/cpp/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 12.0.3 + +No user-facing changes. + ## 12.0.2 ### Minor Analysis Improvements diff --git a/cpp/ql/lib/change-notes/released/12.0.3.md b/cpp/ql/lib/change-notes/released/12.0.3.md new file mode 100644 index 000000000000..b86eecea8b6d --- /dev/null +++ b/cpp/ql/lib/change-notes/released/12.0.3.md @@ -0,0 +1,3 @@ +## 12.0.3 + +No user-facing changes. diff --git a/cpp/ql/lib/codeql-pack.release.yml b/cpp/ql/lib/codeql-pack.release.yml index 500fb3b8051e..9901aa9768db 100644 --- a/cpp/ql/lib/codeql-pack.release.yml +++ b/cpp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 12.0.2 +lastReleaseVersion: 12.0.3 diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index 0d952a0c1bf9..c8c6e352aa4b 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-all -version: 12.0.3-dev +version: 12.0.3 groups: cpp dbscheme: semmlecode.cpp.dbscheme extractor: cpp diff --git a/cpp/ql/src/CHANGELOG.md b/cpp/ql/src/CHANGELOG.md index bc3adffadcdc..9a8c1243217c 100644 --- a/cpp/ql/src/CHANGELOG.md +++ b/cpp/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.8.2 + +No user-facing changes. + ## 1.8.1 No user-facing changes. diff --git a/cpp/ql/src/change-notes/released/1.8.2.md b/cpp/ql/src/change-notes/released/1.8.2.md new file mode 100644 index 000000000000..12e641fd7205 --- /dev/null +++ b/cpp/ql/src/change-notes/released/1.8.2.md @@ -0,0 +1,3 @@ +## 1.8.2 + +No user-facing changes. diff --git a/cpp/ql/src/codeql-pack.release.yml b/cpp/ql/src/codeql-pack.release.yml index 28a7c123ae84..559af8348bb0 100644 --- a/cpp/ql/src/codeql-pack.release.yml +++ b/cpp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.8.1 +lastReleaseVersion: 1.8.2 diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml index 278570c799c1..cdd6197c5aa2 100644 --- a/cpp/ql/src/qlpack.yml +++ b/cpp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-queries -version: 1.8.2-dev +version: 1.8.2 groups: - cpp - queries diff --git a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md index f1ee51f9d945..1897f105e373 100644 --- a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.7.73 + +No user-facing changes. + ## 1.7.72 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.73.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.73.md new file mode 100644 index 000000000000..9670f3f83e28 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.73.md @@ -0,0 +1,3 @@ +## 1.7.73 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml index 33d595a3ea10..95fecc284bee 100644 --- a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.72 +lastReleaseVersion: 1.7.73 diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml index 0cfb3ff63b60..c08e66efd527 100644 --- a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-all -version: 1.7.73-dev +version: 1.7.73 groups: - csharp - solorigate diff --git a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md index f1ee51f9d945..1897f105e373 100644 --- a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.7.73 + +No user-facing changes. + ## 1.7.72 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.73.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.73.md new file mode 100644 index 000000000000..9670f3f83e28 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.73.md @@ -0,0 +1,3 @@ +## 1.7.73 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml index 33d595a3ea10..95fecc284bee 100644 --- a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.72 +lastReleaseVersion: 1.7.73 diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml index 6b8fec930b4c..76d08def9d2a 100644 --- a/csharp/ql/campaigns/Solorigate/src/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-queries -version: 1.7.73-dev +version: 1.7.73 groups: - csharp - solorigate diff --git a/csharp/ql/lib/CHANGELOG.md b/csharp/ql/lib/CHANGELOG.md index ccfde0f7f8fb..4df4b3da22fa 100644 --- a/csharp/ql/lib/CHANGELOG.md +++ b/csharp/ql/lib/CHANGELOG.md @@ -1,3 +1,13 @@ +## 7.2.0 + +### New Features + +* Added the `AdditionalTaintStep` extension point (`semmle.code.csharp.dataflow.FlowSteps`). Extend this class to add additional taint steps that apply to all taint-tracking configurations. + +### Major Analysis Improvements + +* Simplified and streamlined the use of NuGet sources when downloading dependencies. In fallback scenarios and specialized package downloads, NuGet sources are now passed directly to `dotnet restore` via the CLI. Furthermore, no `nuget.config` files are created for fallback scenarios, and private registries are used when attempting to download missing packages that were not restored as part of the normal `dotnet restore` process. + ## 7.1.2 No user-facing changes. diff --git a/csharp/ql/lib/change-notes/2026-08-15-additional-taint-step.md b/csharp/ql/lib/change-notes/2026-08-15-additional-taint-step.md deleted file mode 100644 index 6b87eef63b3a..000000000000 --- a/csharp/ql/lib/change-notes/2026-08-15-additional-taint-step.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: feature ---- -* Added the `AdditionalTaintStep` extension point (`semmle.code.csharp.dataflow.FlowSteps`). Extend this class to add additional taint steps that apply to all taint-tracking configurations. diff --git a/csharp/ql/lib/change-notes/2026-07-17-nuget-package-restore.md b/csharp/ql/lib/change-notes/released/7.2.0.md similarity index 63% rename from csharp/ql/lib/change-notes/2026-07-17-nuget-package-restore.md rename to csharp/ql/lib/change-notes/released/7.2.0.md index 5dd7388d04fe..871f5519ab31 100644 --- a/csharp/ql/lib/change-notes/2026-07-17-nuget-package-restore.md +++ b/csharp/ql/lib/change-notes/released/7.2.0.md @@ -1,4 +1,9 @@ ---- -category: majorAnalysis ---- +## 7.2.0 + +### New Features + +* Added the `AdditionalTaintStep` extension point (`semmle.code.csharp.dataflow.FlowSteps`). Extend this class to add additional taint steps that apply to all taint-tracking configurations. + +### Major Analysis Improvements + * Simplified and streamlined the use of NuGet sources when downloading dependencies. In fallback scenarios and specialized package downloads, NuGet sources are now passed directly to `dotnet restore` via the CLI. Furthermore, no `nuget.config` files are created for fallback scenarios, and private registries are used when attempting to download missing packages that were not restored as part of the normal `dotnet restore` process. diff --git a/csharp/ql/lib/codeql-pack.release.yml b/csharp/ql/lib/codeql-pack.release.yml index 547681cc4408..fda9ea165fc5 100644 --- a/csharp/ql/lib/codeql-pack.release.yml +++ b/csharp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 7.1.2 +lastReleaseVersion: 7.2.0 diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index 508cf13c8ff8..d0517a91e4d3 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-all -version: 7.1.3-dev +version: 7.2.0 groups: csharp dbscheme: semmlecode.csharp.dbscheme extractor: csharp diff --git a/csharp/ql/src/CHANGELOG.md b/csharp/ql/src/CHANGELOG.md index 6fab89a5cac1..2e430f88a6ed 100644 --- a/csharp/ql/src/CHANGELOG.md +++ b/csharp/ql/src/CHANGELOG.md @@ -1,3 +1,16 @@ +## 1.9.2 + +### Minor Analysis Improvements + +* The `cs/simplifiable-boolean-expression` query no longer suggests replacing a negated comparison when the replacement could recursively call an enclosing user-defined operator in `build-mode: none` databases. +* The `cs/web/missing-token-validation` query now recognizes enabled ASP.NET Core `RequireAntiforgeryToken` attributes when antiforgery middleware is used. +* The query `cs/virtual-call-in-constructor` has been improved. Uses of virtual members in `nameof` expressions are no longer reported, since they are not calls. +* Static constructors are now used as the enclosing callable for static member initializer expressions. This improves the precision of a range of queries, including `cs/useless-assignment-to-local` and `cs/dereferenced-value-may-be-null`. + +### Bug Fixes + +* The query `cs/useless-cast-to-self` no longer reports casts when both the expression type and the cast target type are unknown, which can occur in `build-mode: none` databases. + ## 1.9.1 No user-facing changes. diff --git a/csharp/ql/src/change-notes/2026-07-15-static-member-enclosing-callable.md b/csharp/ql/src/change-notes/2026-07-15-static-member-enclosing-callable.md deleted file mode 100644 index 267f212a991e..000000000000 --- a/csharp/ql/src/change-notes/2026-07-15-static-member-enclosing-callable.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Static constructors are now used as the enclosing callable for static member initializer expressions. This improves the precision of a range of queries, including `cs/useless-assignment-to-local` and `cs/dereferenced-value-may-be-null`. diff --git a/csharp/ql/src/change-notes/2026-07-16-virtual-call-in-constructor.md b/csharp/ql/src/change-notes/2026-07-16-virtual-call-in-constructor.md deleted file mode 100644 index bd1f5f99a4f5..000000000000 --- a/csharp/ql/src/change-notes/2026-07-16-virtual-call-in-constructor.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The query `cs/virtual-call-in-constructor` has been improved. Uses of virtual members in `nameof` expressions are no longer reported, since they are not calls. diff --git a/csharp/ql/src/change-notes/2026-08-09-require-antiforgery-token.md b/csharp/ql/src/change-notes/2026-08-09-require-antiforgery-token.md deleted file mode 100644 index ce1b6e9418fe..000000000000 --- a/csharp/ql/src/change-notes/2026-08-09-require-antiforgery-token.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The `cs/web/missing-token-validation` query now recognizes enabled ASP.NET Core `RequireAntiforgeryToken` attributes when antiforgery middleware is used. diff --git a/csharp/ql/src/change-notes/2026-08-13-simplifiable-operator-recursion.md b/csharp/ql/src/change-notes/2026-08-13-simplifiable-operator-recursion.md deleted file mode 100644 index 177df03a1b55..000000000000 --- a/csharp/ql/src/change-notes/2026-08-13-simplifiable-operator-recursion.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The `cs/simplifiable-boolean-expression` query no longer suggests replacing a negated comparison when the replacement could recursively call an enclosing user-defined operator in `build-mode: none` databases. diff --git a/csharp/ql/src/change-notes/2026-08-20-harden-useless-cast-to-self.md b/csharp/ql/src/change-notes/2026-08-20-harden-useless-cast-to-self.md deleted file mode 100644 index bb5bb85b86e7..000000000000 --- a/csharp/ql/src/change-notes/2026-08-20-harden-useless-cast-to-self.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: fix ---- -* The query `cs/useless-cast-to-self` no longer reports casts when both the expression type and the cast target type are unknown, which can occur in `build-mode: none` databases. diff --git a/csharp/ql/src/change-notes/released/1.9.2.md b/csharp/ql/src/change-notes/released/1.9.2.md new file mode 100644 index 000000000000..1beedc8ed107 --- /dev/null +++ b/csharp/ql/src/change-notes/released/1.9.2.md @@ -0,0 +1,12 @@ +## 1.9.2 + +### Minor Analysis Improvements + +* The `cs/simplifiable-boolean-expression` query no longer suggests replacing a negated comparison when the replacement could recursively call an enclosing user-defined operator in `build-mode: none` databases. +* The `cs/web/missing-token-validation` query now recognizes enabled ASP.NET Core `RequireAntiforgeryToken` attributes when antiforgery middleware is used. +* The query `cs/virtual-call-in-constructor` has been improved. Uses of virtual members in `nameof` expressions are no longer reported, since they are not calls. +* Static constructors are now used as the enclosing callable for static member initializer expressions. This improves the precision of a range of queries, including `cs/useless-assignment-to-local` and `cs/dereferenced-value-may-be-null`. + +### Bug Fixes + +* The query `cs/useless-cast-to-self` no longer reports casts when both the expression type and the cast target type are unknown, which can occur in `build-mode: none` databases. diff --git a/csharp/ql/src/codeql-pack.release.yml b/csharp/ql/src/codeql-pack.release.yml index 29c886b15136..842136056d89 100644 --- a/csharp/ql/src/codeql-pack.release.yml +++ b/csharp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.9.1 +lastReleaseVersion: 1.9.2 diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml index 4ef09838698b..3f173d3d0ec2 100644 --- a/csharp/ql/src/qlpack.yml +++ b/csharp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-queries -version: 1.9.2-dev +version: 1.9.2 groups: - csharp - queries diff --git a/go/ql/consistency-queries/CHANGELOG.md b/go/ql/consistency-queries/CHANGELOG.md index 3a3948e7bf27..7a0754e81b29 100644 --- a/go/ql/consistency-queries/CHANGELOG.md +++ b/go/ql/consistency-queries/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.56 + +No user-facing changes. + ## 1.0.55 No user-facing changes. diff --git a/go/ql/consistency-queries/change-notes/released/1.0.56.md b/go/ql/consistency-queries/change-notes/released/1.0.56.md new file mode 100644 index 000000000000..3b784cb7d975 --- /dev/null +++ b/go/ql/consistency-queries/change-notes/released/1.0.56.md @@ -0,0 +1,3 @@ +## 1.0.56 + +No user-facing changes. diff --git a/go/ql/consistency-queries/codeql-pack.release.yml b/go/ql/consistency-queries/codeql-pack.release.yml index 3c942a6b4ea3..9bb27b4fdb71 100644 --- a/go/ql/consistency-queries/codeql-pack.release.yml +++ b/go/ql/consistency-queries/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.55 +lastReleaseVersion: 1.0.56 diff --git a/go/ql/consistency-queries/qlpack.yml b/go/ql/consistency-queries/qlpack.yml index 60858d6a6abe..595bb1de039b 100644 --- a/go/ql/consistency-queries/qlpack.yml +++ b/go/ql/consistency-queries/qlpack.yml @@ -1,5 +1,5 @@ name: codeql-go-consistency-queries -version: 1.0.56-dev +version: 1.0.56 groups: - go - queries diff --git a/go/ql/lib/CHANGELOG.md b/go/ql/lib/CHANGELOG.md index 14c075851e29..7ccc01fbd4c4 100644 --- a/go/ql/lib/CHANGELOG.md +++ b/go/ql/lib/CHANGELOG.md @@ -1,3 +1,9 @@ +## 7.3.0 + +### Major Analysis Improvements + +* Go 1.27 is now supported. + ## 7.2.3 No user-facing changes. diff --git a/go/ql/lib/change-notes/2026-06-25-go-1.27.md b/go/ql/lib/change-notes/2026-06-25-go-1.27.md deleted file mode 100644 index b1998aee7f54..000000000000 --- a/go/ql/lib/change-notes/2026-06-25-go-1.27.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: majorAnalysis ---- -* Go 1.27 is now supported. diff --git a/go/ql/lib/change-notes/released/7.3.0.md b/go/ql/lib/change-notes/released/7.3.0.md new file mode 100644 index 000000000000..0088cfeb9f50 --- /dev/null +++ b/go/ql/lib/change-notes/released/7.3.0.md @@ -0,0 +1,5 @@ +## 7.3.0 + +### Major Analysis Improvements + +* Go 1.27 is now supported. diff --git a/go/ql/lib/codeql-pack.release.yml b/go/ql/lib/codeql-pack.release.yml index 7d0dee6395ee..2b9b871fffa7 100644 --- a/go/ql/lib/codeql-pack.release.yml +++ b/go/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 7.2.3 +lastReleaseVersion: 7.3.0 diff --git a/go/ql/lib/qlpack.yml b/go/ql/lib/qlpack.yml index f9e43b1c5c5f..95356585661f 100644 --- a/go/ql/lib/qlpack.yml +++ b/go/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-all -version: 7.2.4-dev +version: 7.3.0 groups: go dbscheme: go.dbscheme extractor: go diff --git a/go/ql/src/CHANGELOG.md b/go/ql/src/CHANGELOG.md index 9dfd046bec53..8b7e75f28b40 100644 --- a/go/ql/src/CHANGELOG.md +++ b/go/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.6.9 + +No user-facing changes. + ## 1.6.8 No user-facing changes. diff --git a/go/ql/src/change-notes/released/1.6.9.md b/go/ql/src/change-notes/released/1.6.9.md new file mode 100644 index 000000000000..65abde2f749b --- /dev/null +++ b/go/ql/src/change-notes/released/1.6.9.md @@ -0,0 +1,3 @@ +## 1.6.9 + +No user-facing changes. diff --git a/go/ql/src/codeql-pack.release.yml b/go/ql/src/codeql-pack.release.yml index fbc11aa62b75..018779df35eb 100644 --- a/go/ql/src/codeql-pack.release.yml +++ b/go/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.6.8 +lastReleaseVersion: 1.6.9 diff --git a/go/ql/src/qlpack.yml b/go/ql/src/qlpack.yml index 85593d15c062..d5cb9084dcfd 100644 --- a/go/ql/src/qlpack.yml +++ b/go/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-queries -version: 1.6.9-dev +version: 1.6.9 groups: - go - queries diff --git a/java/ql/lib/CHANGELOG.md b/java/ql/lib/CHANGELOG.md index 2fd58088dab6..4d0a6c8c20fd 100644 --- a/java/ql/lib/CHANGELOG.md +++ b/java/ql/lib/CHANGELOG.md @@ -1,3 +1,10 @@ +## 9.2.4 + +### Minor Analysis Improvements + +* Removed the summary model for `String.valueOf(CharSequence)`, which does not exist. Instead, taint is now propagated through calls to `String.valueOf(Object)` when the argument is a `CharSequence`, for example a `String` or a `StringBuilder`. +* Added SQL injection sink models for Spring R2DBC `DatabaseClient` and the R2DBC SPI. + ## 9.2.3 No user-facing changes. diff --git a/java/ql/lib/change-notes/2026-08-04-spring-r2dbc-sql-injection.md b/java/ql/lib/change-notes/2026-08-04-spring-r2dbc-sql-injection.md deleted file mode 100644 index a8d4de85e4cb..000000000000 --- a/java/ql/lib/change-notes/2026-08-04-spring-r2dbc-sql-injection.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added SQL injection sink models for Spring R2DBC `DatabaseClient` and the R2DBC SPI. diff --git a/java/ql/lib/change-notes/2026-08-11-string-valueof-charsequence.md b/java/ql/lib/change-notes/released/9.2.4.md similarity index 65% rename from java/ql/lib/change-notes/2026-08-11-string-valueof-charsequence.md rename to java/ql/lib/change-notes/released/9.2.4.md index 51331eb08372..8b1f87145a79 100644 --- a/java/ql/lib/change-notes/2026-08-11-string-valueof-charsequence.md +++ b/java/ql/lib/change-notes/released/9.2.4.md @@ -1,4 +1,6 @@ ---- -category: minorAnalysis ---- +## 9.2.4 + +### Minor Analysis Improvements + * Removed the summary model for `String.valueOf(CharSequence)`, which does not exist. Instead, taint is now propagated through calls to `String.valueOf(Object)` when the argument is a `CharSequence`, for example a `String` or a `StringBuilder`. +* Added SQL injection sink models for Spring R2DBC `DatabaseClient` and the R2DBC SPI. diff --git a/java/ql/lib/codeql-pack.release.yml b/java/ql/lib/codeql-pack.release.yml index 39a6208d44d2..19834a650c92 100644 --- a/java/ql/lib/codeql-pack.release.yml +++ b/java/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 9.2.3 +lastReleaseVersion: 9.2.4 diff --git a/java/ql/lib/qlpack.yml b/java/ql/lib/qlpack.yml index 1dd82feca5c3..700cccd95b4d 100644 --- a/java/ql/lib/qlpack.yml +++ b/java/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-all -version: 9.2.4-dev +version: 9.2.4 groups: java dbscheme: config/semmlecode.dbscheme extractor: java diff --git a/java/ql/src/CHANGELOG.md b/java/ql/src/CHANGELOG.md index b31db924d53d..2ff710125824 100644 --- a/java/ql/src/CHANGELOG.md +++ b/java/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.11.9 + +No user-facing changes. + ## 1.11.8 No user-facing changes. diff --git a/java/ql/src/change-notes/released/1.11.9.md b/java/ql/src/change-notes/released/1.11.9.md new file mode 100644 index 000000000000..d502923c39f5 --- /dev/null +++ b/java/ql/src/change-notes/released/1.11.9.md @@ -0,0 +1,3 @@ +## 1.11.9 + +No user-facing changes. diff --git a/java/ql/src/codeql-pack.release.yml b/java/ql/src/codeql-pack.release.yml index 1235b98cb049..ea2e740768c2 100644 --- a/java/ql/src/codeql-pack.release.yml +++ b/java/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.11.8 +lastReleaseVersion: 1.11.9 diff --git a/java/ql/src/qlpack.yml b/java/ql/src/qlpack.yml index 058109d0e15f..bf1cbbd7119e 100644 --- a/java/ql/src/qlpack.yml +++ b/java/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-queries -version: 1.11.9-dev +version: 1.11.9 groups: - java - queries diff --git a/javascript/ql/lib/CHANGELOG.md b/javascript/ql/lib/CHANGELOG.md index 6ac06fe87b99..f83e33346d66 100644 --- a/javascript/ql/lib/CHANGELOG.md +++ b/javascript/ql/lib/CHANGELOG.md @@ -1,15 +1,25 @@ +## 2.10.0 + +### New Features + +- Added support for recognizing the React Native Worklets `"worklet"` directive as a known directive. + +### Minor Analysis Improvements + +* Added support for regular expressions using the `d` flag. + ## 2.9.0 ### Major Analysis Improvements -* It is now possible for custom models to refer to specific files in the codebase, using a package name of the form `file:`. The model should describe the public exports +* It is now possible for custom models to refer to specific files in the codebase, using a package name of form `file:`. The model should describe the public exports of that file. This can be used to derive sources and sinks in code that imports the file, but note that sources and sinks will not generally be placed within the file itself. For example, a source model `['file:lib/service.js', 'Member[getData].ReturnValue', 'remote']` could identify `require('../lib/service').getData()` as a source. ### Minor Analysis Improvements * JavaScript security queries using the `response` threat model now track promise-wrapped client response data into promise fulfillment values. This may improve results for queries such as `js/xss` when response data is consumed through `.then(...)` chains. -* The route object returned by Vue Router's `useRoute()` Composition API is now recognized as a client-side remote flow source, covering its `query`, `params`, `path`, `fullPath`, and `hash` members. These members are additionally reported under the `browser-url-query`, `browser-url-path`, and `browser-url-fragment` threat models. +* The route object returned by Vue Router's `useRoute()` Composition API is now recognized as a client-side remote flow source, covering its `query`, `params`, `path`, `fullPath`, and `hash` members. These members are additionally reported under the corresponding `browser-url-query`, `browser-url-path`, and `browser-url-fragment` threat models. * Added flow models for Vue's `ref`, `shallowRef`, `toRef`, `reactive`, and `computed` Composition API helpers. * Added support for treating declared `inputs` properties in Sails Action2 controller files as remote flow sources. This may improve results for security queries such as `js/path-injection`. diff --git a/javascript/ql/lib/change-notes/2026-08-10-d-regex-flag.md b/javascript/ql/lib/change-notes/2026-08-10-d-regex-flag.md deleted file mode 100644 index 8552c7bf7925..000000000000 --- a/javascript/ql/lib/change-notes/2026-08-10-d-regex-flag.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added support for regular expressions using the `d` flag. diff --git a/javascript/ql/lib/change-notes/2026-08-10-worklet-directive.md b/javascript/ql/lib/change-notes/2026-08-10-worklet-directive.md deleted file mode 100644 index c596f14e9abe..000000000000 --- a/javascript/ql/lib/change-notes/2026-08-10-worklet-directive.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: feature ---- - -- Added support for recognizing the React Native Worklets `"worklet"` directive as a known directive. diff --git a/javascript/ql/lib/change-notes/released/2.10.0.md b/javascript/ql/lib/change-notes/released/2.10.0.md new file mode 100644 index 000000000000..341f9813e3fb --- /dev/null +++ b/javascript/ql/lib/change-notes/released/2.10.0.md @@ -0,0 +1,9 @@ +## 2.10.0 + +### New Features + +- Added support for recognizing the React Native Worklets `"worklet"` directive as a known directive. + +### Minor Analysis Improvements + +* Added support for regular expressions using the `d` flag. diff --git a/javascript/ql/lib/codeql-pack.release.yml b/javascript/ql/lib/codeql-pack.release.yml index d6329a574932..ffff75a8d4c2 100644 --- a/javascript/ql/lib/codeql-pack.release.yml +++ b/javascript/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.9.0 +lastReleaseVersion: 2.10.0 diff --git a/javascript/ql/lib/qlpack.yml b/javascript/ql/lib/qlpack.yml index ede19f219f4a..64be77a515d3 100644 --- a/javascript/ql/lib/qlpack.yml +++ b/javascript/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-all -version: 2.9.1-dev +version: 2.10.0 groups: javascript dbscheme: semmlecode.javascript.dbscheme extractor: javascript diff --git a/javascript/ql/src/CHANGELOG.md b/javascript/ql/src/CHANGELOG.md index 87b01cbc4afa..9a958424d795 100644 --- a/javascript/ql/src/CHANGELOG.md +++ b/javascript/ql/src/CHANGELOG.md @@ -1,3 +1,9 @@ +## 2.4.4 + +### Minor Analysis Improvements + +* The `js/superfluous-trailing-arguments` query no longer reports valid arguments passed to the `TransformStream` constructor. + ## 2.4.3 ### Minor Analysis Improvements diff --git a/javascript/ql/src/change-notes/2026-08-14-transformstream-constructor-arity.md b/javascript/ql/src/change-notes/released/2.4.4.md similarity index 74% rename from javascript/ql/src/change-notes/2026-08-14-transformstream-constructor-arity.md rename to javascript/ql/src/change-notes/released/2.4.4.md index a8b66c4c612b..3d5e2f6a593e 100644 --- a/javascript/ql/src/change-notes/2026-08-14-transformstream-constructor-arity.md +++ b/javascript/ql/src/change-notes/released/2.4.4.md @@ -1,4 +1,5 @@ ---- -category: minorAnalysis ---- +## 2.4.4 + +### Minor Analysis Improvements + * The `js/superfluous-trailing-arguments` query no longer reports valid arguments passed to the `TransformStream` constructor. diff --git a/javascript/ql/src/codeql-pack.release.yml b/javascript/ql/src/codeql-pack.release.yml index 2520785bcc40..2facd66a43f4 100644 --- a/javascript/ql/src/codeql-pack.release.yml +++ b/javascript/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.4.3 +lastReleaseVersion: 2.4.4 diff --git a/javascript/ql/src/qlpack.yml b/javascript/ql/src/qlpack.yml index 0637027f116e..3b788bff539b 100644 --- a/javascript/ql/src/qlpack.yml +++ b/javascript/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-queries -version: 2.4.4-dev +version: 2.4.4 groups: - javascript - queries diff --git a/misc/suite-helpers/CHANGELOG.md b/misc/suite-helpers/CHANGELOG.md index dd22444f54fe..097e573de503 100644 --- a/misc/suite-helpers/CHANGELOG.md +++ b/misc/suite-helpers/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.56 + +No user-facing changes. + ## 1.0.55 No user-facing changes. diff --git a/misc/suite-helpers/change-notes/released/1.0.56.md b/misc/suite-helpers/change-notes/released/1.0.56.md new file mode 100644 index 000000000000..3b784cb7d975 --- /dev/null +++ b/misc/suite-helpers/change-notes/released/1.0.56.md @@ -0,0 +1,3 @@ +## 1.0.56 + +No user-facing changes. diff --git a/misc/suite-helpers/codeql-pack.release.yml b/misc/suite-helpers/codeql-pack.release.yml index 3c942a6b4ea3..9bb27b4fdb71 100644 --- a/misc/suite-helpers/codeql-pack.release.yml +++ b/misc/suite-helpers/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.55 +lastReleaseVersion: 1.0.56 diff --git a/misc/suite-helpers/qlpack.yml b/misc/suite-helpers/qlpack.yml index 7ced46ab5f70..e5f770404f0d 100644 --- a/misc/suite-helpers/qlpack.yml +++ b/misc/suite-helpers/qlpack.yml @@ -1,4 +1,4 @@ name: codeql/suite-helpers -version: 1.0.56-dev +version: 1.0.56 groups: shared warnOnImplicitThis: true diff --git a/python/ql/lib/CHANGELOG.md b/python/ql/lib/CHANGELOG.md index 2a6de92ecbce..51d7011de576 100644 --- a/python/ql/lib/CHANGELOG.md +++ b/python/ql/lib/CHANGELOG.md @@ -1,3 +1,9 @@ +## 7.2.4 + +### Minor Analysis Improvements + +* Added taint flow through `list.extend` and `list.insert`, matching the existing taint flow through `list.append`. + ## 7.2.3 No user-facing changes. diff --git a/python/ql/lib/change-notes/2026-08-10-list-extend-insert-taint.md b/python/ql/lib/change-notes/released/7.2.4.md similarity index 72% rename from python/ql/lib/change-notes/2026-08-10-list-extend-insert-taint.md rename to python/ql/lib/change-notes/released/7.2.4.md index db362bde20f6..564a01ee27cc 100644 --- a/python/ql/lib/change-notes/2026-08-10-list-extend-insert-taint.md +++ b/python/ql/lib/change-notes/released/7.2.4.md @@ -1,4 +1,5 @@ ---- -category: minorAnalysis ---- +## 7.2.4 + +### Minor Analysis Improvements + * Added taint flow through `list.extend` and `list.insert`, matching the existing taint flow through `list.append`. diff --git a/python/ql/lib/codeql-pack.release.yml b/python/ql/lib/codeql-pack.release.yml index 7d0dee6395ee..330556d11a76 100644 --- a/python/ql/lib/codeql-pack.release.yml +++ b/python/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 7.2.3 +lastReleaseVersion: 7.2.4 diff --git a/python/ql/lib/qlpack.yml b/python/ql/lib/qlpack.yml index 03adb1ffdb0d..c9c33d75b8c4 100644 --- a/python/ql/lib/qlpack.yml +++ b/python/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-all -version: 7.2.4-dev +version: 7.2.4 groups: python dbscheme: semmlecode.python.dbscheme extractor: python diff --git a/python/ql/src/CHANGELOG.md b/python/ql/src/CHANGELOG.md index 97904c1bd7af..da09ff7f9d50 100644 --- a/python/ql/src/CHANGELOG.md +++ b/python/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.8.9 + +No user-facing changes. + ## 1.8.8 No user-facing changes. diff --git a/python/ql/src/change-notes/released/1.8.9.md b/python/ql/src/change-notes/released/1.8.9.md new file mode 100644 index 000000000000..2d48c5ca3da0 --- /dev/null +++ b/python/ql/src/change-notes/released/1.8.9.md @@ -0,0 +1,3 @@ +## 1.8.9 + +No user-facing changes. diff --git a/python/ql/src/codeql-pack.release.yml b/python/ql/src/codeql-pack.release.yml index d224b6ac3595..2fed7501f873 100644 --- a/python/ql/src/codeql-pack.release.yml +++ b/python/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.8.8 +lastReleaseVersion: 1.8.9 diff --git a/python/ql/src/qlpack.yml b/python/ql/src/qlpack.yml index fbc81c7cc67f..83959eb2f06a 100644 --- a/python/ql/src/qlpack.yml +++ b/python/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-queries -version: 1.8.9-dev +version: 1.8.9 groups: - python - queries diff --git a/ruby/ql/lib/CHANGELOG.md b/ruby/ql/lib/CHANGELOG.md index 55c64cb527cb..f9916662c642 100644 --- a/ruby/ql/lib/CHANGELOG.md +++ b/ruby/ql/lib/CHANGELOG.md @@ -1,8 +1,14 @@ +## 6.0.4 + +### Minor Analysis Improvements + +* The algorithm for tracking regexes has been replaced. This can cause result changes in related queries, for example, `rb/polynomial-redos`. + ## 6.0.3 ### Minor Analysis Improvements -* Parameters of methods exported by vendored gems are no longer treated as flow sources, since such methods are only called from within the codebase. This should reduce false positives for `rb/polynomial-redos`, `rb/regex/badly-anchored-regexp`, `rb/unsafe-code-construction`, `rb/html-constructed-from-input`, and `rb/shell-command-constructed-from-input` in codebases that vendor their dependencies. +* Removed library input to vendored gems from the set of taint sources. This should reduce false positives for `rb/polynomial-redos`, `rb/regex/badly-anchored-regexp`, `rb/unsafe-code-construction`, `rb/html-constructed-from-input`, and `rb/shell-command-constructed-from-input` whenever vendoring is used. ## 6.0.2 diff --git a/ruby/ql/lib/change-notes/2026-08-11-regex-tracking.md b/ruby/ql/lib/change-notes/released/6.0.4.md similarity index 76% rename from ruby/ql/lib/change-notes/2026-08-11-regex-tracking.md rename to ruby/ql/lib/change-notes/released/6.0.4.md index f0310bdf3775..abc6e2ae08f1 100644 --- a/ruby/ql/lib/change-notes/2026-08-11-regex-tracking.md +++ b/ruby/ql/lib/change-notes/released/6.0.4.md @@ -1,4 +1,5 @@ ---- -category: minorAnalysis ---- +## 6.0.4 + +### Minor Analysis Improvements + * The algorithm for tracking regexes has been replaced. This can cause result changes in related queries, for example, `rb/polynomial-redos`. diff --git a/ruby/ql/lib/codeql-pack.release.yml b/ruby/ql/lib/codeql-pack.release.yml index 304c17ad4092..ae1f15cd344a 100644 --- a/ruby/ql/lib/codeql-pack.release.yml +++ b/ruby/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 6.0.3 +lastReleaseVersion: 6.0.4 diff --git a/ruby/ql/lib/qlpack.yml b/ruby/ql/lib/qlpack.yml index 06d3ec94a09b..d69ea587cc09 100644 --- a/ruby/ql/lib/qlpack.yml +++ b/ruby/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-all -version: 6.0.4-dev +version: 6.0.4 groups: ruby extractor: ruby dbscheme: ruby.dbscheme diff --git a/ruby/ql/src/CHANGELOG.md b/ruby/ql/src/CHANGELOG.md index a8502538032b..312e56c3716e 100644 --- a/ruby/ql/src/CHANGELOG.md +++ b/ruby/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.6.9 + +No user-facing changes. + ## 1.6.8 No user-facing changes. diff --git a/ruby/ql/src/change-notes/released/1.6.9.md b/ruby/ql/src/change-notes/released/1.6.9.md new file mode 100644 index 000000000000..65abde2f749b --- /dev/null +++ b/ruby/ql/src/change-notes/released/1.6.9.md @@ -0,0 +1,3 @@ +## 1.6.9 + +No user-facing changes. diff --git a/ruby/ql/src/codeql-pack.release.yml b/ruby/ql/src/codeql-pack.release.yml index fbc11aa62b75..018779df35eb 100644 --- a/ruby/ql/src/codeql-pack.release.yml +++ b/ruby/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.6.8 +lastReleaseVersion: 1.6.9 diff --git a/ruby/ql/src/qlpack.yml b/ruby/ql/src/qlpack.yml index 5254397baeea..011ae8a48e37 100644 --- a/ruby/ql/src/qlpack.yml +++ b/ruby/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-queries -version: 1.6.9-dev +version: 1.6.9 groups: - ruby - queries diff --git a/rust/ql/lib/CHANGELOG.md b/rust/ql/lib/CHANGELOG.md index 6e7ca1f1f10a..4ec33279ba1b 100644 --- a/rust/ql/lib/CHANGELOG.md +++ b/rust/ql/lib/CHANGELOG.md @@ -1,3 +1,24 @@ +## 0.2.20 + +### Major Analysis Improvements + +* The alert locations for data flow queries have been improved. The new locations are more precise and are based on the actual source and sink nodes. Example: +```rust +let _ = conn.query( +// ^^^^ old alert location + unsafe_query.as_str(), +// ^^^^^^^^^^^^^^^^^^^^^ new alert location +)?; +``` +This means that some alerts will have their locations changed, and hence appear as new alerts (while the old alerts will disappear). + +### Minor Analysis Improvements + +* Canonical paths for Rust trait items now use the format `crate::Trait::item` instead of + `<_ as crate::Trait>::item`. Custom data extension models that reference trait items + must be updated to use the new format. +* The Rust extractor has been upgraded to use `rust-analyzer` version 0.0.328. As a result, the AST exposed by the Rust libraries has changed: the `TraitAlias` class has been removed, `cfg` attributes are now modeled by the new `CfgMeta`, `CfgAtom`, `CfgComposite`, `CfgPredicate`, and `CfgAttrMeta` classes, and the `Meta` class has been refined into the `KeyValueMeta`, `PathMeta`, `TokenTreeMeta`, and `UnsafeMeta` subclasses. New `TryBlockModifier` and `FormatArgsArgName` classes have also been added. + ## 0.2.19 No user-facing changes. diff --git a/rust/ql/lib/change-notes/2026-08-03-rust-analyzer-0.0.328.md b/rust/ql/lib/change-notes/2026-08-03-rust-analyzer-0.0.328.md deleted file mode 100644 index d9403a8b62aa..000000000000 --- a/rust/ql/lib/change-notes/2026-08-03-rust-analyzer-0.0.328.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The Rust extractor has been upgraded to use `rust-analyzer` version 0.0.328. As a result, the AST exposed by the Rust libraries has changed: the `TraitAlias` class has been removed, `cfg` attributes are now modeled by the new `CfgMeta`, `CfgAtom`, `CfgComposite`, `CfgPredicate`, and `CfgAttrMeta` classes, and the `Meta` class has been refined into the `KeyValueMeta`, `PathMeta`, `TokenTreeMeta`, and `UnsafeMeta` subclasses. New `TryBlockModifier` and `FormatArgsArgName` classes have also been added. diff --git a/rust/ql/lib/change-notes/2026-08-05-data-flow-alert-locations.md b/rust/ql/lib/change-notes/2026-08-05-data-flow-alert-locations.md deleted file mode 100644 index d5691b49750b..000000000000 --- a/rust/ql/lib/change-notes/2026-08-05-data-flow-alert-locations.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -category: majorAnalysis ---- -* The alert locations for data flow queries have been improved. The new locations are more precise and are based on the actual source and sink nodes. Example: -```rust -let _ = conn.query( -// ^^^^ old alert location - unsafe_query.as_str(), -// ^^^^^^^^^^^^^^^^^^^^^ new alert location -)?; -``` -This means that some alerts will have their locations changed, and hence appear as new alerts (while the old alerts will disappear). \ No newline at end of file diff --git a/rust/ql/lib/change-notes/2026-08-19-trait-canonical-paths.md b/rust/ql/lib/change-notes/2026-08-19-trait-canonical-paths.md deleted file mode 100644 index 9398a7c187fe..000000000000 --- a/rust/ql/lib/change-notes/2026-08-19-trait-canonical-paths.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -category: minorAnalysis ---- -* Canonical paths for Rust trait items now use the format `crate::Trait::item` instead of - `<_ as crate::Trait>::item`. Custom data extension models that reference trait items - must be updated to use the new format. \ No newline at end of file diff --git a/rust/ql/lib/change-notes/released/0.2.20.md b/rust/ql/lib/change-notes/released/0.2.20.md new file mode 100644 index 000000000000..e165ed9153e8 --- /dev/null +++ b/rust/ql/lib/change-notes/released/0.2.20.md @@ -0,0 +1,20 @@ +## 0.2.20 + +### Major Analysis Improvements + +* The alert locations for data flow queries have been improved. The new locations are more precise and are based on the actual source and sink nodes. Example: +```rust +let _ = conn.query( +// ^^^^ old alert location + unsafe_query.as_str(), +// ^^^^^^^^^^^^^^^^^^^^^ new alert location +)?; +``` +This means that some alerts will have their locations changed, and hence appear as new alerts (while the old alerts will disappear). + +### Minor Analysis Improvements + +* Canonical paths for Rust trait items now use the format `crate::Trait::item` instead of + `<_ as crate::Trait>::item`. Custom data extension models that reference trait items + must be updated to use the new format. +* The Rust extractor has been upgraded to use `rust-analyzer` version 0.0.328. As a result, the AST exposed by the Rust libraries has changed: the `TraitAlias` class has been removed, `cfg` attributes are now modeled by the new `CfgMeta`, `CfgAtom`, `CfgComposite`, `CfgPredicate`, and `CfgAttrMeta` classes, and the `Meta` class has been refined into the `KeyValueMeta`, `PathMeta`, `TokenTreeMeta`, and `UnsafeMeta` subclasses. New `TryBlockModifier` and `FormatArgsArgName` classes have also been added. diff --git a/rust/ql/lib/codeql-pack.release.yml b/rust/ql/lib/codeql-pack.release.yml index b37d10786472..7c91e0e29ffa 100644 --- a/rust/ql/lib/codeql-pack.release.yml +++ b/rust/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.2.19 +lastReleaseVersion: 0.2.20 diff --git a/rust/ql/lib/qlpack.yml b/rust/ql/lib/qlpack.yml index 540d610d6973..d6bb6e2c8355 100644 --- a/rust/ql/lib/qlpack.yml +++ b/rust/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rust-all -version: 0.2.20-dev +version: 0.2.20 groups: rust extractor: rust dbscheme: rust.dbscheme diff --git a/rust/ql/src/CHANGELOG.md b/rust/ql/src/CHANGELOG.md index e6a2f67fac00..5a8f3ea1b9a5 100644 --- a/rust/ql/src/CHANGELOG.md +++ b/rust/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.41 + +No user-facing changes. + ## 0.1.40 No user-facing changes. diff --git a/rust/ql/src/change-notes/released/0.1.41.md b/rust/ql/src/change-notes/released/0.1.41.md new file mode 100644 index 000000000000..023c4889f070 --- /dev/null +++ b/rust/ql/src/change-notes/released/0.1.41.md @@ -0,0 +1,3 @@ +## 0.1.41 + +No user-facing changes. diff --git a/rust/ql/src/codeql-pack.release.yml b/rust/ql/src/codeql-pack.release.yml index 676d88550b91..38f91b8ed622 100644 --- a/rust/ql/src/codeql-pack.release.yml +++ b/rust/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.1.40 +lastReleaseVersion: 0.1.41 diff --git a/rust/ql/src/qlpack.yml b/rust/ql/src/qlpack.yml index 81689b84b84c..8d861959d1dc 100644 --- a/rust/ql/src/qlpack.yml +++ b/rust/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rust-queries -version: 0.1.41-dev +version: 0.1.41 groups: - rust - queries diff --git a/shared/concepts/CHANGELOG.md b/shared/concepts/CHANGELOG.md index 9acabbed4e46..6a88efccf19f 100644 --- a/shared/concepts/CHANGELOG.md +++ b/shared/concepts/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.30 + +No user-facing changes. + ## 0.0.29 No user-facing changes. diff --git a/shared/concepts/change-notes/released/0.0.30.md b/shared/concepts/change-notes/released/0.0.30.md new file mode 100644 index 000000000000..10c7a0c5c131 --- /dev/null +++ b/shared/concepts/change-notes/released/0.0.30.md @@ -0,0 +1,3 @@ +## 0.0.30 + +No user-facing changes. diff --git a/shared/concepts/codeql-pack.release.yml b/shared/concepts/codeql-pack.release.yml index c81f18131208..0c61b463bab3 100644 --- a/shared/concepts/codeql-pack.release.yml +++ b/shared/concepts/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.29 +lastReleaseVersion: 0.0.30 diff --git a/shared/concepts/qlpack.yml b/shared/concepts/qlpack.yml index 396702b47ac7..46af3e5a6093 100644 --- a/shared/concepts/qlpack.yml +++ b/shared/concepts/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/concepts -version: 0.0.30-dev +version: 0.0.30 groups: shared library: true dependencies: diff --git a/shared/controlflow/CHANGELOG.md b/shared/controlflow/CHANGELOG.md index 9abcc742814f..76ba233c908f 100644 --- a/shared/controlflow/CHANGELOG.md +++ b/shared/controlflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.40 + +No user-facing changes. + ## 2.0.39 No user-facing changes. diff --git a/shared/controlflow/change-notes/released/2.0.40.md b/shared/controlflow/change-notes/released/2.0.40.md new file mode 100644 index 000000000000..889c7f385592 --- /dev/null +++ b/shared/controlflow/change-notes/released/2.0.40.md @@ -0,0 +1,3 @@ +## 2.0.40 + +No user-facing changes. diff --git a/shared/controlflow/codeql-pack.release.yml b/shared/controlflow/codeql-pack.release.yml index 063a268e5f9f..df31666e556c 100644 --- a/shared/controlflow/codeql-pack.release.yml +++ b/shared/controlflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.39 +lastReleaseVersion: 2.0.40 diff --git a/shared/controlflow/qlpack.yml b/shared/controlflow/qlpack.yml index d8cef947cef8..e4c5c10696b2 100644 --- a/shared/controlflow/qlpack.yml +++ b/shared/controlflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/controlflow -version: 2.0.40-dev +version: 2.0.40 groups: shared library: true dependencies: diff --git a/shared/dataflow/CHANGELOG.md b/shared/dataflow/CHANGELOG.md index 8b981f92142e..17b7451f2d4d 100644 --- a/shared/dataflow/CHANGELOG.md +++ b/shared/dataflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.1.12 + +No user-facing changes. + ## 2.1.11 No user-facing changes. diff --git a/shared/dataflow/change-notes/released/2.1.12.md b/shared/dataflow/change-notes/released/2.1.12.md new file mode 100644 index 000000000000..f3a0960a2f39 --- /dev/null +++ b/shared/dataflow/change-notes/released/2.1.12.md @@ -0,0 +1,3 @@ +## 2.1.12 + +No user-facing changes. diff --git a/shared/dataflow/codeql-pack.release.yml b/shared/dataflow/codeql-pack.release.yml index 768e745f3b43..64ef0f5a22c1 100644 --- a/shared/dataflow/codeql-pack.release.yml +++ b/shared/dataflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.1.11 +lastReleaseVersion: 2.1.12 diff --git a/shared/dataflow/qlpack.yml b/shared/dataflow/qlpack.yml index 3d006f14f1e9..f53be1543ad7 100644 --- a/shared/dataflow/qlpack.yml +++ b/shared/dataflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/dataflow -version: 2.1.12-dev +version: 2.1.12 groups: shared library: true dependencies: diff --git a/shared/mad/CHANGELOG.md b/shared/mad/CHANGELOG.md index 3a981e317c75..1f510be02756 100644 --- a/shared/mad/CHANGELOG.md +++ b/shared/mad/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.56 + +No user-facing changes. + ## 1.0.55 No user-facing changes. diff --git a/shared/mad/change-notes/released/1.0.56.md b/shared/mad/change-notes/released/1.0.56.md new file mode 100644 index 000000000000..3b784cb7d975 --- /dev/null +++ b/shared/mad/change-notes/released/1.0.56.md @@ -0,0 +1,3 @@ +## 1.0.56 + +No user-facing changes. diff --git a/shared/mad/codeql-pack.release.yml b/shared/mad/codeql-pack.release.yml index 3c942a6b4ea3..9bb27b4fdb71 100644 --- a/shared/mad/codeql-pack.release.yml +++ b/shared/mad/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.55 +lastReleaseVersion: 1.0.56 diff --git a/shared/mad/qlpack.yml b/shared/mad/qlpack.yml index 512f38311c1c..8a938b2288a9 100644 --- a/shared/mad/qlpack.yml +++ b/shared/mad/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/mad -version: 1.0.56-dev +version: 1.0.56 groups: shared library: true dependencies: diff --git a/shared/namebinding/CHANGELOG.md b/shared/namebinding/CHANGELOG.md index 4ffbff1e0c4e..9b269441c000 100644 --- a/shared/namebinding/CHANGELOG.md +++ b/shared/namebinding/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.5 + +No user-facing changes. + ## 0.0.4 No user-facing changes. diff --git a/shared/namebinding/change-notes/released/0.0.5.md b/shared/namebinding/change-notes/released/0.0.5.md new file mode 100644 index 000000000000..766ec2723b56 --- /dev/null +++ b/shared/namebinding/change-notes/released/0.0.5.md @@ -0,0 +1,3 @@ +## 0.0.5 + +No user-facing changes. diff --git a/shared/namebinding/codeql-pack.release.yml b/shared/namebinding/codeql-pack.release.yml index ec411a674bcd..bb45a1ab0182 100644 --- a/shared/namebinding/codeql-pack.release.yml +++ b/shared/namebinding/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.4 +lastReleaseVersion: 0.0.5 diff --git a/shared/namebinding/qlpack.yml b/shared/namebinding/qlpack.yml index f7148fda4b99..c646e249377e 100644 --- a/shared/namebinding/qlpack.yml +++ b/shared/namebinding/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/namebinding -version: 0.0.5-dev +version: 0.0.5 groups: shared library: true dependencies: diff --git a/shared/quantum/CHANGELOG.md b/shared/quantum/CHANGELOG.md index 66b8fa3444bb..fd3064b1a947 100644 --- a/shared/quantum/CHANGELOG.md +++ b/shared/quantum/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.34 + +No user-facing changes. + ## 0.0.33 No user-facing changes. diff --git a/shared/quantum/change-notes/released/0.0.34.md b/shared/quantum/change-notes/released/0.0.34.md new file mode 100644 index 000000000000..d58affae3891 --- /dev/null +++ b/shared/quantum/change-notes/released/0.0.34.md @@ -0,0 +1,3 @@ +## 0.0.34 + +No user-facing changes. diff --git a/shared/quantum/codeql-pack.release.yml b/shared/quantum/codeql-pack.release.yml index dff9e7f6ea97..6fb3b6253bb9 100644 --- a/shared/quantum/codeql-pack.release.yml +++ b/shared/quantum/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.33 +lastReleaseVersion: 0.0.34 diff --git a/shared/quantum/qlpack.yml b/shared/quantum/qlpack.yml index e6d49cdd37fb..c346366c887b 100644 --- a/shared/quantum/qlpack.yml +++ b/shared/quantum/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/quantum -version: 0.0.34-dev +version: 0.0.34 groups: shared library: true dependencies: diff --git a/shared/rangeanalysis/CHANGELOG.md b/shared/rangeanalysis/CHANGELOG.md index 3a874c765ab7..d3e4d9e87c60 100644 --- a/shared/rangeanalysis/CHANGELOG.md +++ b/shared/rangeanalysis/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.56 + +No user-facing changes. + ## 1.0.55 No user-facing changes. diff --git a/shared/rangeanalysis/change-notes/released/1.0.56.md b/shared/rangeanalysis/change-notes/released/1.0.56.md new file mode 100644 index 000000000000..3b784cb7d975 --- /dev/null +++ b/shared/rangeanalysis/change-notes/released/1.0.56.md @@ -0,0 +1,3 @@ +## 1.0.56 + +No user-facing changes. diff --git a/shared/rangeanalysis/codeql-pack.release.yml b/shared/rangeanalysis/codeql-pack.release.yml index 3c942a6b4ea3..9bb27b4fdb71 100644 --- a/shared/rangeanalysis/codeql-pack.release.yml +++ b/shared/rangeanalysis/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.55 +lastReleaseVersion: 1.0.56 diff --git a/shared/rangeanalysis/qlpack.yml b/shared/rangeanalysis/qlpack.yml index 1a2c8789b3c0..f0fc39d7d022 100644 --- a/shared/rangeanalysis/qlpack.yml +++ b/shared/rangeanalysis/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rangeanalysis -version: 1.0.56-dev +version: 1.0.56 groups: shared library: true dependencies: diff --git a/shared/regex/CHANGELOG.md b/shared/regex/CHANGELOG.md index bbfe25191a71..327845009d11 100644 --- a/shared/regex/CHANGELOG.md +++ b/shared/regex/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.56 + +No user-facing changes. + ## 1.0.55 No user-facing changes. diff --git a/shared/regex/change-notes/released/1.0.56.md b/shared/regex/change-notes/released/1.0.56.md new file mode 100644 index 000000000000..3b784cb7d975 --- /dev/null +++ b/shared/regex/change-notes/released/1.0.56.md @@ -0,0 +1,3 @@ +## 1.0.56 + +No user-facing changes. diff --git a/shared/regex/codeql-pack.release.yml b/shared/regex/codeql-pack.release.yml index 3c942a6b4ea3..9bb27b4fdb71 100644 --- a/shared/regex/codeql-pack.release.yml +++ b/shared/regex/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.55 +lastReleaseVersion: 1.0.56 diff --git a/shared/regex/qlpack.yml b/shared/regex/qlpack.yml index 93d5bd2a5b9e..cb9a5810d8ae 100644 --- a/shared/regex/qlpack.yml +++ b/shared/regex/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/regex -version: 1.0.56-dev +version: 1.0.56 groups: shared library: true dependencies: diff --git a/shared/ssa/CHANGELOG.md b/shared/ssa/CHANGELOG.md index b742fb0a2601..1cc5dec08b82 100644 --- a/shared/ssa/CHANGELOG.md +++ b/shared/ssa/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.32 + +No user-facing changes. + ## 2.0.31 No user-facing changes. diff --git a/shared/ssa/change-notes/released/2.0.32.md b/shared/ssa/change-notes/released/2.0.32.md new file mode 100644 index 000000000000..0930bb07f8c4 --- /dev/null +++ b/shared/ssa/change-notes/released/2.0.32.md @@ -0,0 +1,3 @@ +## 2.0.32 + +No user-facing changes. diff --git a/shared/ssa/codeql-pack.release.yml b/shared/ssa/codeql-pack.release.yml index 783d47207cda..483a0d5db8ec 100644 --- a/shared/ssa/codeql-pack.release.yml +++ b/shared/ssa/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.31 +lastReleaseVersion: 2.0.32 diff --git a/shared/ssa/qlpack.yml b/shared/ssa/qlpack.yml index fae71bc1f950..e7a083427e9e 100644 --- a/shared/ssa/qlpack.yml +++ b/shared/ssa/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ssa -version: 2.0.32-dev +version: 2.0.32 groups: shared library: true dependencies: diff --git a/shared/threat-models/CHANGELOG.md b/shared/threat-models/CHANGELOG.md index 3a3948e7bf27..7a0754e81b29 100644 --- a/shared/threat-models/CHANGELOG.md +++ b/shared/threat-models/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.56 + +No user-facing changes. + ## 1.0.55 No user-facing changes. diff --git a/shared/threat-models/change-notes/released/1.0.56.md b/shared/threat-models/change-notes/released/1.0.56.md new file mode 100644 index 000000000000..3b784cb7d975 --- /dev/null +++ b/shared/threat-models/change-notes/released/1.0.56.md @@ -0,0 +1,3 @@ +## 1.0.56 + +No user-facing changes. diff --git a/shared/threat-models/codeql-pack.release.yml b/shared/threat-models/codeql-pack.release.yml index 3c942a6b4ea3..9bb27b4fdb71 100644 --- a/shared/threat-models/codeql-pack.release.yml +++ b/shared/threat-models/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.55 +lastReleaseVersion: 1.0.56 diff --git a/shared/threat-models/qlpack.yml b/shared/threat-models/qlpack.yml index 6717a88aa990..3a2e3a691ab9 100644 --- a/shared/threat-models/qlpack.yml +++ b/shared/threat-models/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/threat-models -version: 1.0.56-dev +version: 1.0.56 library: true groups: shared dataExtensions: diff --git a/shared/tutorial/CHANGELOG.md b/shared/tutorial/CHANGELOG.md index 267dbfeb562f..df769dd96aec 100644 --- a/shared/tutorial/CHANGELOG.md +++ b/shared/tutorial/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.56 + +No user-facing changes. + ## 1.0.55 No user-facing changes. diff --git a/shared/tutorial/change-notes/released/1.0.56.md b/shared/tutorial/change-notes/released/1.0.56.md new file mode 100644 index 000000000000..3b784cb7d975 --- /dev/null +++ b/shared/tutorial/change-notes/released/1.0.56.md @@ -0,0 +1,3 @@ +## 1.0.56 + +No user-facing changes. diff --git a/shared/tutorial/codeql-pack.release.yml b/shared/tutorial/codeql-pack.release.yml index 3c942a6b4ea3..9bb27b4fdb71 100644 --- a/shared/tutorial/codeql-pack.release.yml +++ b/shared/tutorial/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.55 +lastReleaseVersion: 1.0.56 diff --git a/shared/tutorial/qlpack.yml b/shared/tutorial/qlpack.yml index 2f41f25c2f2a..7fb4e02cc66f 100644 --- a/shared/tutorial/qlpack.yml +++ b/shared/tutorial/qlpack.yml @@ -1,7 +1,7 @@ name: codeql/tutorial description: Library for the CodeQL detective tutorials, helping new users learn to write CodeQL queries. -version: 1.0.56-dev +version: 1.0.56 groups: shared library: true warnOnImplicitThis: true diff --git a/shared/typeflow/CHANGELOG.md b/shared/typeflow/CHANGELOG.md index 90dc2603d772..28d0101ccf54 100644 --- a/shared/typeflow/CHANGELOG.md +++ b/shared/typeflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.56 + +No user-facing changes. + ## 1.0.55 No user-facing changes. diff --git a/shared/typeflow/change-notes/released/1.0.56.md b/shared/typeflow/change-notes/released/1.0.56.md new file mode 100644 index 000000000000..3b784cb7d975 --- /dev/null +++ b/shared/typeflow/change-notes/released/1.0.56.md @@ -0,0 +1,3 @@ +## 1.0.56 + +No user-facing changes. diff --git a/shared/typeflow/codeql-pack.release.yml b/shared/typeflow/codeql-pack.release.yml index 3c942a6b4ea3..9bb27b4fdb71 100644 --- a/shared/typeflow/codeql-pack.release.yml +++ b/shared/typeflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.55 +lastReleaseVersion: 1.0.56 diff --git a/shared/typeflow/qlpack.yml b/shared/typeflow/qlpack.yml index 2f25d00ba810..535fdba52cba 100644 --- a/shared/typeflow/qlpack.yml +++ b/shared/typeflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeflow -version: 1.0.56-dev +version: 1.0.56 groups: shared library: true dependencies: diff --git a/shared/typeinference/CHANGELOG.md b/shared/typeinference/CHANGELOG.md index cd72576290a7..e34fb7c21ba1 100644 --- a/shared/typeinference/CHANGELOG.md +++ b/shared/typeinference/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.37 + +No user-facing changes. + ## 0.0.36 No user-facing changes. diff --git a/shared/typeinference/change-notes/released/0.0.37.md b/shared/typeinference/change-notes/released/0.0.37.md new file mode 100644 index 000000000000..322aa16628ff --- /dev/null +++ b/shared/typeinference/change-notes/released/0.0.37.md @@ -0,0 +1,3 @@ +## 0.0.37 + +No user-facing changes. diff --git a/shared/typeinference/codeql-pack.release.yml b/shared/typeinference/codeql-pack.release.yml index b6df3a024ee6..7982dda40f4c 100644 --- a/shared/typeinference/codeql-pack.release.yml +++ b/shared/typeinference/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.36 +lastReleaseVersion: 0.0.37 diff --git a/shared/typeinference/qlpack.yml b/shared/typeinference/qlpack.yml index 8f5e25ee40f5..1fadc262b89b 100644 --- a/shared/typeinference/qlpack.yml +++ b/shared/typeinference/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeinference -version: 0.0.37-dev +version: 0.0.37 groups: shared library: true dependencies: diff --git a/shared/typetracking/CHANGELOG.md b/shared/typetracking/CHANGELOG.md index 8226f0232aff..60257ae7e1e0 100644 --- a/shared/typetracking/CHANGELOG.md +++ b/shared/typetracking/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.40 + +No user-facing changes. + ## 2.0.39 No user-facing changes. diff --git a/shared/typetracking/change-notes/released/2.0.40.md b/shared/typetracking/change-notes/released/2.0.40.md new file mode 100644 index 000000000000..889c7f385592 --- /dev/null +++ b/shared/typetracking/change-notes/released/2.0.40.md @@ -0,0 +1,3 @@ +## 2.0.40 + +No user-facing changes. diff --git a/shared/typetracking/codeql-pack.release.yml b/shared/typetracking/codeql-pack.release.yml index 063a268e5f9f..df31666e556c 100644 --- a/shared/typetracking/codeql-pack.release.yml +++ b/shared/typetracking/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.39 +lastReleaseVersion: 2.0.40 diff --git a/shared/typetracking/qlpack.yml b/shared/typetracking/qlpack.yml index 546ade1b9009..4279f61fc3f0 100644 --- a/shared/typetracking/qlpack.yml +++ b/shared/typetracking/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typetracking -version: 2.0.40-dev +version: 2.0.40 groups: shared library: true dependencies: diff --git a/shared/typos/CHANGELOG.md b/shared/typos/CHANGELOG.md index 2cad9992afb8..a43daa8503c9 100644 --- a/shared/typos/CHANGELOG.md +++ b/shared/typos/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.56 + +No user-facing changes. + ## 1.0.55 No user-facing changes. diff --git a/shared/typos/change-notes/released/1.0.56.md b/shared/typos/change-notes/released/1.0.56.md new file mode 100644 index 000000000000..3b784cb7d975 --- /dev/null +++ b/shared/typos/change-notes/released/1.0.56.md @@ -0,0 +1,3 @@ +## 1.0.56 + +No user-facing changes. diff --git a/shared/typos/codeql-pack.release.yml b/shared/typos/codeql-pack.release.yml index 3c942a6b4ea3..9bb27b4fdb71 100644 --- a/shared/typos/codeql-pack.release.yml +++ b/shared/typos/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.55 +lastReleaseVersion: 1.0.56 diff --git a/shared/typos/qlpack.yml b/shared/typos/qlpack.yml index 8ab53a9e282c..84bea4384531 100644 --- a/shared/typos/qlpack.yml +++ b/shared/typos/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typos -version: 1.0.56-dev +version: 1.0.56 groups: shared library: true warnOnImplicitThis: true diff --git a/shared/util/CHANGELOG.md b/shared/util/CHANGELOG.md index 55fa9e7730b5..194ea712d2ad 100644 --- a/shared/util/CHANGELOG.md +++ b/shared/util/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.43 + +No user-facing changes. + ## 2.0.42 No user-facing changes. diff --git a/shared/util/change-notes/released/2.0.43.md b/shared/util/change-notes/released/2.0.43.md new file mode 100644 index 000000000000..69732e6e3060 --- /dev/null +++ b/shared/util/change-notes/released/2.0.43.md @@ -0,0 +1,3 @@ +## 2.0.43 + +No user-facing changes. diff --git a/shared/util/codeql-pack.release.yml b/shared/util/codeql-pack.release.yml index 000a2d0de2d1..26126cee2c6b 100644 --- a/shared/util/codeql-pack.release.yml +++ b/shared/util/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.42 +lastReleaseVersion: 2.0.43 diff --git a/shared/util/qlpack.yml b/shared/util/qlpack.yml index f24d0b264364..38fabfcb99a0 100644 --- a/shared/util/qlpack.yml +++ b/shared/util/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/util -version: 2.0.43-dev +version: 2.0.43 groups: shared library: true dependencies: null diff --git a/shared/xml/CHANGELOG.md b/shared/xml/CHANGELOG.md index 0901e77ebb22..8d1557082db1 100644 --- a/shared/xml/CHANGELOG.md +++ b/shared/xml/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.56 + +No user-facing changes. + ## 1.0.55 No user-facing changes. diff --git a/shared/xml/change-notes/released/1.0.56.md b/shared/xml/change-notes/released/1.0.56.md new file mode 100644 index 000000000000..3b784cb7d975 --- /dev/null +++ b/shared/xml/change-notes/released/1.0.56.md @@ -0,0 +1,3 @@ +## 1.0.56 + +No user-facing changes. diff --git a/shared/xml/codeql-pack.release.yml b/shared/xml/codeql-pack.release.yml index 3c942a6b4ea3..9bb27b4fdb71 100644 --- a/shared/xml/codeql-pack.release.yml +++ b/shared/xml/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.55 +lastReleaseVersion: 1.0.56 diff --git a/shared/xml/qlpack.yml b/shared/xml/qlpack.yml index 99d7e6f74a93..af73bb69888c 100644 --- a/shared/xml/qlpack.yml +++ b/shared/xml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/xml -version: 1.0.56-dev +version: 1.0.56 groups: shared library: true dependencies: diff --git a/shared/yaml/CHANGELOG.md b/shared/yaml/CHANGELOG.md index 9ff01d7f1b17..5a2e1a8833b0 100644 --- a/shared/yaml/CHANGELOG.md +++ b/shared/yaml/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.56 + +No user-facing changes. + ## 1.0.55 No user-facing changes. diff --git a/shared/yaml/change-notes/released/1.0.56.md b/shared/yaml/change-notes/released/1.0.56.md new file mode 100644 index 000000000000..3b784cb7d975 --- /dev/null +++ b/shared/yaml/change-notes/released/1.0.56.md @@ -0,0 +1,3 @@ +## 1.0.56 + +No user-facing changes. diff --git a/shared/yaml/codeql-pack.release.yml b/shared/yaml/codeql-pack.release.yml index 3c942a6b4ea3..9bb27b4fdb71 100644 --- a/shared/yaml/codeql-pack.release.yml +++ b/shared/yaml/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.55 +lastReleaseVersion: 1.0.56 diff --git a/shared/yaml/qlpack.yml b/shared/yaml/qlpack.yml index 530e0c8452e1..2e0644f8c71a 100644 --- a/shared/yaml/qlpack.yml +++ b/shared/yaml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/yaml -version: 1.0.56-dev +version: 1.0.56 groups: shared library: true warnOnImplicitThis: true diff --git a/swift/ql/lib/CHANGELOG.md b/swift/ql/lib/CHANGELOG.md index ffad5ee2398a..e71c0491bc0a 100644 --- a/swift/ql/lib/CHANGELOG.md +++ b/swift/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 6.8.2 + +No user-facing changes. + ## 6.8.1 No user-facing changes. diff --git a/swift/ql/lib/change-notes/released/6.8.2.md b/swift/ql/lib/change-notes/released/6.8.2.md new file mode 100644 index 000000000000..89c48d9b6048 --- /dev/null +++ b/swift/ql/lib/change-notes/released/6.8.2.md @@ -0,0 +1,3 @@ +## 6.8.2 + +No user-facing changes. diff --git a/swift/ql/lib/codeql-pack.release.yml b/swift/ql/lib/codeql-pack.release.yml index 49874c2924ed..42fdf5962a78 100644 --- a/swift/ql/lib/codeql-pack.release.yml +++ b/swift/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 6.8.1 +lastReleaseVersion: 6.8.2 diff --git a/swift/ql/lib/qlpack.yml b/swift/ql/lib/qlpack.yml index 78f6f1947d9f..fa4ba95e4dda 100644 --- a/swift/ql/lib/qlpack.yml +++ b/swift/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-all -version: 6.8.2-dev +version: 6.8.2 groups: swift extractor: swift dbscheme: swift.dbscheme diff --git a/swift/ql/src/CHANGELOG.md b/swift/ql/src/CHANGELOG.md index 826ee7e9d4e9..25dde1dc3ab1 100644 --- a/swift/ql/src/CHANGELOG.md +++ b/swift/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.3.9 + +No user-facing changes. + ## 1.3.8 No user-facing changes. diff --git a/swift/ql/src/change-notes/released/1.3.9.md b/swift/ql/src/change-notes/released/1.3.9.md new file mode 100644 index 000000000000..7c49d60db954 --- /dev/null +++ b/swift/ql/src/change-notes/released/1.3.9.md @@ -0,0 +1,3 @@ +## 1.3.9 + +No user-facing changes. diff --git a/swift/ql/src/codeql-pack.release.yml b/swift/ql/src/codeql-pack.release.yml index 898725a6deb4..5ce113f4464d 100644 --- a/swift/ql/src/codeql-pack.release.yml +++ b/swift/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.3.8 +lastReleaseVersion: 1.3.9 diff --git a/swift/ql/src/qlpack.yml b/swift/ql/src/qlpack.yml index 26e142611198..e4ab0b8a074a 100644 --- a/swift/ql/src/qlpack.yml +++ b/swift/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-queries -version: 1.3.9-dev +version: 1.3.9 groups: - swift - queries From ea70e5cce7cedf3f73209c270764b649ffee0fc7 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 20 Aug 2026 16:03:11 +0100 Subject: [PATCH 0439/2098] C++: Add tests with missing flow sources and sinks. --- .../dataflow/external-models/flow.expected | 212 +++++++++--------- .../dataflow/external-models/flow.ext.yml | 7 + .../dataflow/external-models/sinks.expected | 6 + .../dataflow/external-models/sources.expected | 2 + .../dataflow/external-models/test.cpp | 45 +++- 5 files changed, 167 insertions(+), 105 deletions(-) diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index 2532476fd1a0..b61607089097 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -37,98 +37,99 @@ models | 36 | Source: ; ; false; source_from_callback_template; ; ; Argument[0].Parameter[*0].Field[SourceWrapper::value]; local; manual | | 37 | Source: ; ; false; ymlFieldSource; ; ; ReturnValue.Field[SourceWrapper::value]; local; manual | | 38 | Source: ; ; false; ymlSource; ; ; ReturnValue; local; manual | -| 39 | Source: Azure::Core::Http; RawResponse; true; ExtractBodyStream; ; ; ReturnValue[*]; remote; manual | -| 40 | Source: Azure::Core::Http; RawResponse; true; GetBody; ; ; ReturnValue[*]; remote; manual | -| 41 | Source: Azure::Core::Http; RawResponse; true; GetHeaders; ; ; ReturnValue[*]; remote; manual | -| 42 | Source: Azure::Core::Http; Request; true; GetBodyStream; ; ; ReturnValue[*]; remote; manual | -| 43 | Source: Azure::Core::Http; Request; true; GetHeader; ; ; ReturnValue; remote; manual | -| 44 | Source: Azure::Core::Http; Request; true; GetHeaders; ; ; ReturnValue; remote; manual | -| 45 | Source: boost::asio; ; false; read_until; ; ; Argument[*1]; remote; manual | -| 46 | Summary: ; ; false; CLSIDFromProgID; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 47 | Summary: ; ; false; CLSIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 48 | Summary: ; ; false; CommandLineToArgvA; ; ; Argument[*0]; ReturnValue[**]; taint; manual | -| 49 | Summary: ; ; false; CreateRemoteThread; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | -| 50 | Summary: ; ; false; CreateRemoteThreadEx; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | -| 51 | Summary: ; ; false; CreateThread; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | -| 52 | Summary: ; ; false; GUIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 53 | Summary: ; ; false; IIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 54 | Summary: ; ; false; ProgIDFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | -| 55 | Summary: ; ; false; ReadFileEx; ; ; Argument[*3].Field[@hEvent]; Argument[4].Parameter[*2].Field[@hEvent]; value; manual | -| 56 | Summary: ; ; false; RtlCopyDeviceMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 57 | Summary: ; ; false; RtlCopyMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 58 | Summary: ; ; false; RtlCopyMemoryNonTemporal; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 59 | Summary: ; ; false; RtlCopyUnicodeString; ; ; Argument[*1].Field[*Buffer]; Argument[*0].Field[*Buffer]; value; manual | -| 60 | Summary: ; ; false; RtlCopyVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 61 | Summary: ; ; false; RtlInitUnicodeString; ; ; Argument[*1]; Argument[*0].Field[*Buffer]; value; manual | -| 62 | Summary: ; ; false; RtlMoveMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 63 | Summary: ; ; false; RtlMoveVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 64 | Summary: ; ; false; StringFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | -| 65 | Summary: ; ; false; StringFromGUID2; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 66 | Summary: ; ; false; StringFromIID; ; ; Argument[*0]; Argument[**1]; taint; manual | -| 67 | Summary: ; ; false; WinHttpCrackUrl; ; ; Argument[*0]; Argument[*3]; taint; manual | -| 68 | Summary: ; ; false; callWithArgument; ; ; Argument[1]; Argument[0].Parameter[0]; value; manual | -| 69 | Summary: ; ; false; callWithNonTypeTemplate; (const T &); ; Argument[*0]; ReturnValue; value; manual | -| 70 | Summary: ; ; false; pthread_create; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | -| 71 | Summary: ; ; false; read_field_from_struct; ; ; Argument[*0].Field[MyNamespace::MyStructInNamespace::myField]; ReturnValue; value; manual | -| 72 | Summary: ; ; false; read_field_from_struct_2; ; ; Argument[*0].Field[MyGlobalStruct::myField]; ReturnValue; value; manual | -| 73 | Summary: ; ; false; ymlStepGenerated; ; ; Argument[0]; ReturnValue; taint; df-generated | -| 74 | Summary: ; ; false; ymlStepManual; ; ; Argument[0]; ReturnValue; taint; manual | -| 75 | Summary: ; ; false; ymlStepManual_with_body; ; ; Argument[0]; ReturnValue; taint; manual | -| 76 | Summary: ; MyString; true; operator[]; ; ; Argument[-1]; ReturnValue[*]; taint; manual | -| 77 | Summary: ; MyString; true; operator[]; ; ; ReturnValue[*]; Argument[-1]; taint; manual | -| 78 | Summary: ; ReverseFlow; true; get_ptr; ; ; ReturnValue[*]; Argument[-1].Field[ReverseFlow::value]; value; manual | -| 79 | Summary: ; TemplateClass1; true; templateFunction2; (U,V); ; Argument[1]; ReturnValue; value; manual | -| 80 | Summary: ; TemplateClass1; false; templateFunction; (T,U); ; Argument[0]; ReturnValue; value; manual | -| 81 | Summary: ; TemplateClass2; true; function; (U,T); ; Argument[1]; ReturnValue; value; manual | -| 82 | Summary: Azure::Core::IO; BodyStream; true; Read; ; ; Argument[-1]; Argument[*0]; taint; manual | -| 83 | Summary: Azure::Core::IO; BodyStream; true; ReadToCount; ; ; Argument[-1]; Argument[*0]; taint; manual | -| 84 | Summary: Azure::Core::IO; BodyStream; true; ReadToEnd; ; ; Argument[-1]; ReturnValue.Element; taint; manual | -| 85 | Summary: Azure; Nullable; true; Value; ; ; Argument[-1]; ReturnValue[*]; taint; manual | -| 86 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | +| 39 | Source: ; ; false; ymlSourcePtr; ; ; ReturnValue[*]; local; manual | +| 40 | Source: Azure::Core::Http; RawResponse; true; ExtractBodyStream; ; ; ReturnValue[*]; remote; manual | +| 41 | Source: Azure::Core::Http; RawResponse; true; GetBody; ; ; ReturnValue[*]; remote; manual | +| 42 | Source: Azure::Core::Http; RawResponse; true; GetHeaders; ; ; ReturnValue[*]; remote; manual | +| 43 | Source: Azure::Core::Http; Request; true; GetBodyStream; ; ; ReturnValue[*]; remote; manual | +| 44 | Source: Azure::Core::Http; Request; true; GetHeader; ; ; ReturnValue; remote; manual | +| 45 | Source: Azure::Core::Http; Request; true; GetHeaders; ; ; ReturnValue; remote; manual | +| 46 | Source: boost::asio; ; false; read_until; ; ; Argument[*1]; remote; manual | +| 47 | Summary: ; ; false; CLSIDFromProgID; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 48 | Summary: ; ; false; CLSIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 49 | Summary: ; ; false; CommandLineToArgvA; ; ; Argument[*0]; ReturnValue[**]; taint; manual | +| 50 | Summary: ; ; false; CreateRemoteThread; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | +| 51 | Summary: ; ; false; CreateRemoteThreadEx; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | +| 52 | Summary: ; ; false; CreateThread; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | +| 53 | Summary: ; ; false; GUIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 54 | Summary: ; ; false; IIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 55 | Summary: ; ; false; ProgIDFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | +| 56 | Summary: ; ; false; ReadFileEx; ; ; Argument[*3].Field[@hEvent]; Argument[4].Parameter[*2].Field[@hEvent]; value; manual | +| 57 | Summary: ; ; false; RtlCopyDeviceMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 58 | Summary: ; ; false; RtlCopyMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 59 | Summary: ; ; false; RtlCopyMemoryNonTemporal; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 60 | Summary: ; ; false; RtlCopyUnicodeString; ; ; Argument[*1].Field[*Buffer]; Argument[*0].Field[*Buffer]; value; manual | +| 61 | Summary: ; ; false; RtlCopyVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 62 | Summary: ; ; false; RtlInitUnicodeString; ; ; Argument[*1]; Argument[*0].Field[*Buffer]; value; manual | +| 63 | Summary: ; ; false; RtlMoveMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 64 | Summary: ; ; false; RtlMoveVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 65 | Summary: ; ; false; StringFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | +| 66 | Summary: ; ; false; StringFromGUID2; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 67 | Summary: ; ; false; StringFromIID; ; ; Argument[*0]; Argument[**1]; taint; manual | +| 68 | Summary: ; ; false; WinHttpCrackUrl; ; ; Argument[*0]; Argument[*3]; taint; manual | +| 69 | Summary: ; ; false; callWithArgument; ; ; Argument[1]; Argument[0].Parameter[0]; value; manual | +| 70 | Summary: ; ; false; callWithNonTypeTemplate; (const T &); ; Argument[*0]; ReturnValue; value; manual | +| 71 | Summary: ; ; false; pthread_create; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | +| 72 | Summary: ; ; false; read_field_from_struct; ; ; Argument[*0].Field[MyNamespace::MyStructInNamespace::myField]; ReturnValue; value; manual | +| 73 | Summary: ; ; false; read_field_from_struct_2; ; ; Argument[*0].Field[MyGlobalStruct::myField]; ReturnValue; value; manual | +| 74 | Summary: ; ; false; ymlStepGenerated; ; ; Argument[0]; ReturnValue; taint; df-generated | +| 75 | Summary: ; ; false; ymlStepManual; ; ; Argument[0]; ReturnValue; taint; manual | +| 76 | Summary: ; ; false; ymlStepManual_with_body; ; ; Argument[0]; ReturnValue; taint; manual | +| 77 | Summary: ; MyString; true; operator[]; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 78 | Summary: ; MyString; true; operator[]; ; ; ReturnValue[*]; Argument[-1]; taint; manual | +| 79 | Summary: ; ReverseFlow; true; get_ptr; ; ; ReturnValue[*]; Argument[-1].Field[ReverseFlow::value]; value; manual | +| 80 | Summary: ; TemplateClass1; true; templateFunction2; (U,V); ; Argument[1]; ReturnValue; value; manual | +| 81 | Summary: ; TemplateClass1; false; templateFunction; (T,U); ; Argument[0]; ReturnValue; value; manual | +| 82 | Summary: ; TemplateClass2; true; function; (U,T); ; Argument[1]; ReturnValue; value; manual | +| 83 | Summary: Azure::Core::IO; BodyStream; true; Read; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 84 | Summary: Azure::Core::IO; BodyStream; true; ReadToCount; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 85 | Summary: Azure::Core::IO; BodyStream; true; ReadToEnd; ; ; Argument[-1]; ReturnValue.Element; taint; manual | +| 86 | Summary: Azure; Nullable; true; Value; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 87 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | edges -| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:91:7:91:17 | recv_buffer | provenance | Src:MaD:45 | -| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:93:29:93:39 | recv_buffer | provenance | Src:MaD:45 Sink:MaD:2 | +| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:91:7:91:17 | recv_buffer | provenance | Src:MaD:46 | +| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:93:29:93:39 | recv_buffer | provenance | Src:MaD:46 Sink:MaD:2 | | asio_streams.cpp:97:37:97:44 | call to source | asio_streams.cpp:98:7:98:14 | send_str | provenance | TaintFunction | | asio_streams.cpp:97:37:97:44 | call to source | asio_streams.cpp:100:64:100:71 | *send_str | provenance | TaintFunction | | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | | | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:101:7:101:17 | send_buffer | provenance | | | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:103:29:103:39 | send_buffer | provenance | Sink:MaD:2 | -| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:86 | +| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:87 | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:257:5:257:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:262:5:262:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:266:38:266:41 | *resp | provenance | | -| azure.cpp:253:48:253:60 | call to GetBodyStream | azure.cpp:253:48:253:60 | *call to GetBodyStream | provenance | Src:MaD:42 | -| azure.cpp:257:5:257:8 | *resp | azure.cpp:257:16:257:21 | Read output argument | provenance | MaD:82 | +| azure.cpp:253:48:253:60 | call to GetBodyStream | azure.cpp:253:48:253:60 | *call to GetBodyStream | provenance | Src:MaD:43 | +| azure.cpp:257:5:257:8 | *resp | azure.cpp:257:16:257:21 | Read output argument | provenance | MaD:83 | | azure.cpp:257:16:257:21 | Read output argument | azure.cpp:258:10:258:16 | * ... | provenance | | -| azure.cpp:262:5:262:8 | *resp | azure.cpp:262:23:262:28 | ReadToCount output argument | provenance | MaD:83 | +| azure.cpp:262:5:262:8 | *resp | azure.cpp:262:23:262:28 | ReadToCount output argument | provenance | MaD:84 | | azure.cpp:262:23:262:28 | ReadToCount output argument | azure.cpp:263:10:263:16 | * ... | provenance | | -| azure.cpp:266:38:266:41 | *resp | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | provenance | MaD:84 | +| azure.cpp:266:38:266:41 | *resp | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | provenance | MaD:85 | | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | provenance | | | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | azure.cpp:267:10:267:12 | vec [element] | provenance | | | azure.cpp:267:10:267:12 | vec [element] | azure.cpp:267:10:267:12 | vec | provenance | | -| azure.cpp:273:52:273:61 | call to GetHeaders | azure.cpp:273:62:273:64 | call to GetHeaders | provenance | Src:MaD:41 | +| azure.cpp:273:52:273:61 | call to GetHeaders | azure.cpp:273:62:273:64 | call to GetHeaders | provenance | Src:MaD:42 | | azure.cpp:273:62:273:64 | call to GetHeaders | azure.cpp:274:14:274:29 | call to operator[] | provenance | TaintFunction | | azure.cpp:273:62:273:64 | call to GetHeaders | azure.cpp:274:14:274:29 | call to operator[] | provenance | TaintFunction | | azure.cpp:273:62:273:64 | call to GetHeaders | azure.cpp:274:14:274:29 | call to operator[] | provenance | TaintFunction | | azure.cpp:274:14:274:29 | call to operator[] | azure.cpp:274:10:274:29 | call to operator[] | provenance | | | azure.cpp:274:14:274:29 | call to operator[] | azure.cpp:274:14:274:29 | call to operator[] | provenance | | -| azure.cpp:277:38:277:44 | call to GetBody | azure.cpp:277:45:277:47 | call to GetBody | provenance | Src:MaD:40 | +| azure.cpp:277:38:277:44 | call to GetBody | azure.cpp:277:45:277:47 | call to GetBody | provenance | Src:MaD:41 | | azure.cpp:277:45:277:47 | call to GetBody | azure.cpp:278:10:278:13 | body | provenance | | | azure.cpp:277:45:277:47 | call to GetBody | azure.cpp:278:10:278:13 | body | provenance | | | azure.cpp:278:10:278:13 | body | azure.cpp:278:10:278:13 | body | provenance | | | azure.cpp:281:68:281:84 | *call to ExtractBodyStream | azure.cpp:282:21:282:23 | *call to get | provenance | | -| azure.cpp:281:68:281:84 | call to ExtractBodyStream | azure.cpp:281:68:281:84 | *call to ExtractBodyStream | provenance | Src:MaD:39 | -| azure.cpp:282:21:282:23 | *call to get | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | MaD:84 | +| azure.cpp:281:68:281:84 | call to ExtractBodyStream | azure.cpp:281:68:281:84 | *call to ExtractBodyStream | provenance | Src:MaD:40 | +| azure.cpp:282:21:282:23 | *call to get | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | MaD:85 | | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | azure.cpp:282:10:282:38 | call to ReadToEnd | provenance | | | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | | -| azure.cpp:289:24:289:56 | call to GetHeader | azure.cpp:289:63:289:65 | call to Value | provenance | MaD:85 | +| azure.cpp:289:24:289:56 | call to GetHeader | azure.cpp:289:63:289:65 | call to Value | provenance | MaD:86 | | azure.cpp:289:32:289:40 | call to GetHeader | azure.cpp:289:24:289:56 | call to GetHeader | provenance | | -| azure.cpp:289:32:289:40 | call to GetHeader | azure.cpp:289:32:289:40 | call to GetHeader | provenance | Src:MaD:43 | +| azure.cpp:289:32:289:40 | call to GetHeader | azure.cpp:289:32:289:40 | call to GetHeader | provenance | Src:MaD:44 | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:289:63:289:65 | call to Value | provenance | | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:290:10:290:20 | headerValue | provenance | | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:290:10:290:20 | headerValue | provenance | | | azure.cpp:290:10:290:20 | headerValue | azure.cpp:290:10:290:20 | headerValue | provenance | | -| azure.cpp:293:58:293:67 | call to GetHeaders | azure.cpp:293:58:293:67 | call to GetHeaders | provenance | Src:MaD:44 | +| azure.cpp:293:58:293:67 | call to GetHeaders | azure.cpp:293:58:293:67 | call to GetHeaders | provenance | Src:MaD:45 | | azure.cpp:293:58:293:67 | call to GetHeaders | azure.cpp:294:38:294:53 | call to operator[] | provenance | TaintFunction | | azure.cpp:294:38:294:53 | call to operator[] | azure.cpp:295:10:295:20 | contentType | provenance | | | azure.cpp:294:38:294:53 | call to operator[] | azure.cpp:295:10:295:20 | contentType | provenance | | @@ -143,13 +144,13 @@ edges | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:32:41:32:41 | x | provenance | | | test.cpp:17:10:17:22 | call to ymlStepManual | test.cpp:17:10:17:22 | call to ymlStepManual | provenance | | | test.cpp:17:10:17:22 | call to ymlStepManual | test.cpp:18:10:18:10 | y | provenance | Sink:MaD:1 | -| test.cpp:17:24:17:24 | x | test.cpp:17:10:17:22 | call to ymlStepManual | provenance | MaD:74 | +| test.cpp:17:24:17:24 | x | test.cpp:17:10:17:22 | call to ymlStepManual | provenance | MaD:75 | | test.cpp:21:10:21:25 | call to ymlStepGenerated | test.cpp:21:10:21:25 | call to ymlStepGenerated | provenance | | | test.cpp:21:10:21:25 | call to ymlStepGenerated | test.cpp:22:10:22:10 | z | provenance | Sink:MaD:1 | -| test.cpp:21:27:21:27 | x | test.cpp:21:10:21:25 | call to ymlStepGenerated | provenance | MaD:73 | +| test.cpp:21:27:21:27 | x | test.cpp:21:10:21:25 | call to ymlStepGenerated | provenance | MaD:74 | | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | provenance | | | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | test.cpp:26:10:26:11 | y2 | provenance | Sink:MaD:1 | -| test.cpp:25:35:25:35 | x | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | provenance | MaD:75 | +| test.cpp:25:35:25:35 | x | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | provenance | MaD:76 | | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | provenance | | | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | test.cpp:33:10:33:11 | z2 | provenance | Sink:MaD:1 | | test.cpp:32:41:32:41 | x | test.cpp:7:47:7:52 | value2 | provenance | | @@ -161,7 +162,7 @@ edges | test.cpp:56:2:56:2 | *s [post update] [x] | test.cpp:59:55:59:64 | *& ... [x] | provenance | | | test.cpp:56:2:56:18 | ... = ... | test.cpp:56:2:56:2 | *s [post update] [x] | provenance | | | test.cpp:56:8:56:16 | call to ymlSource | test.cpp:56:2:56:18 | ... = ... | provenance | Src:MaD:38 | -| test.cpp:59:55:59:64 | *& ... [x] | test.cpp:46:30:46:32 | *arg [x] | provenance | MaD:70 | +| test.cpp:59:55:59:64 | *& ... [x] | test.cpp:46:30:46:32 | *arg [x] | provenance | MaD:71 | | test.cpp:68:22:68:22 | y | test.cpp:69:11:69:11 | y | provenance | Sink:MaD:1 | | test.cpp:74:22:74:22 | y | test.cpp:75:11:75:11 | y | provenance | Sink:MaD:1 | | test.cpp:82:22:82:22 | y | test.cpp:83:11:83:11 | y | provenance | Sink:MaD:1 | @@ -171,62 +172,62 @@ edges | test.cpp:94:10:94:18 | call to ymlSource | test.cpp:101:26:101:26 | x | provenance | | | test.cpp:94:10:94:18 | call to ymlSource | test.cpp:103:63:103:63 | x | provenance | | | test.cpp:94:10:94:18 | call to ymlSource | test.cpp:104:62:104:62 | x | provenance | | -| test.cpp:97:26:97:26 | x | test.cpp:68:22:68:22 | y | provenance | MaD:68 | -| test.cpp:101:26:101:26 | x | test.cpp:74:22:74:22 | y | provenance | MaD:68 | -| test.cpp:103:63:103:63 | x | test.cpp:82:22:82:22 | y | provenance | MaD:68 | -| test.cpp:104:62:104:62 | x | test.cpp:88:22:88:22 | y | provenance | MaD:68 | +| test.cpp:97:26:97:26 | x | test.cpp:68:22:68:22 | y | provenance | MaD:69 | +| test.cpp:101:26:101:26 | x | test.cpp:74:22:74:22 | y | provenance | MaD:69 | +| test.cpp:103:63:103:63 | x | test.cpp:82:22:82:22 | y | provenance | MaD:69 | +| test.cpp:104:62:104:62 | x | test.cpp:88:22:88:22 | y | provenance | MaD:69 | | test.cpp:114:10:114:18 | call to ymlSource | test.cpp:114:10:114:18 | call to ymlSource | provenance | Src:MaD:38 | | test.cpp:114:10:114:18 | call to ymlSource | test.cpp:118:44:118:44 | *x | provenance | | | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | provenance | | | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | test.cpp:119:10:119:11 | y2 | provenance | Sink:MaD:1 | -| test.cpp:118:44:118:44 | *x | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | provenance | MaD:69 | +| test.cpp:118:44:118:44 | *x | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | provenance | MaD:70 | | test.cpp:133:10:133:18 | call to ymlSource | test.cpp:133:10:133:18 | call to ymlSource | provenance | Src:MaD:38 | | test.cpp:133:10:133:18 | call to ymlSource | test.cpp:134:45:134:45 | x | provenance | | | test.cpp:134:13:134:43 | call to templateFunction | test.cpp:134:13:134:43 | call to templateFunction | provenance | | | test.cpp:134:13:134:43 | call to templateFunction | test.cpp:135:10:135:10 | y | provenance | Sink:MaD:1 | -| test.cpp:134:45:134:45 | x | test.cpp:134:13:134:43 | call to templateFunction | provenance | MaD:80 | +| test.cpp:134:45:134:45 | x | test.cpp:134:13:134:43 | call to templateFunction | provenance | MaD:81 | | test.cpp:146:10:146:18 | call to ymlSource | test.cpp:146:10:146:18 | call to ymlSource | provenance | Src:MaD:38 | | test.cpp:146:10:146:18 | call to ymlSource | test.cpp:148:26:148:26 | x | provenance | | | test.cpp:148:10:148:27 | call to function | test.cpp:148:10:148:27 | call to function | provenance | | | test.cpp:148:10:148:27 | call to function | test.cpp:149:10:149:10 | z | provenance | Sink:MaD:1 | -| test.cpp:148:26:148:26 | x | test.cpp:148:10:148:27 | call to function | provenance | MaD:81 | +| test.cpp:148:26:148:26 | x | test.cpp:148:10:148:27 | call to function | provenance | MaD:82 | | test.cpp:155:10:155:18 | call to ymlSource | test.cpp:155:10:155:18 | call to ymlSource | provenance | Src:MaD:38 | | test.cpp:155:10:155:18 | call to ymlSource | test.cpp:157:26:157:26 | x | provenance | | | test.cpp:157:13:157:20 | call to function | test.cpp:157:13:157:20 | call to function | provenance | | | test.cpp:157:13:157:20 | call to function | test.cpp:158:10:158:10 | z | provenance | Sink:MaD:1 | -| test.cpp:157:26:157:26 | x | test.cpp:157:13:157:20 | call to function | provenance | MaD:81 | +| test.cpp:157:26:157:26 | x | test.cpp:157:13:157:20 | call to function | provenance | MaD:82 | | test.cpp:164:34:164:34 | x | test.cpp:165:69:165:69 | x | provenance | | | test.cpp:165:12:165:64 | call to templateFunction2 | test.cpp:164:7:164:7 | *templateFunction3 | provenance | | | test.cpp:165:12:165:64 | call to templateFunction2 | test.cpp:165:12:165:64 | call to templateFunction2 | provenance | | -| test.cpp:165:69:165:69 | x | test.cpp:165:12:165:64 | call to templateFunction2 | provenance | MaD:79 | +| test.cpp:165:69:165:69 | x | test.cpp:165:12:165:64 | call to templateFunction2 | provenance | MaD:80 | | test.cpp:170:10:170:18 | call to ymlSource | test.cpp:170:10:170:18 | call to ymlSource | provenance | Src:MaD:38 | | test.cpp:170:10:170:18 | call to ymlSource | test.cpp:172:51:172:51 | x | provenance | | | test.cpp:172:13:172:44 | call to templateFunction3 | test.cpp:172:13:172:44 | call to templateFunction3 | provenance | | | test.cpp:172:13:172:44 | call to templateFunction3 | test.cpp:173:10:173:10 | y | provenance | Sink:MaD:1 | | test.cpp:172:51:172:51 | x | test.cpp:164:34:164:34 | x | provenance | | -| test.cpp:172:51:172:51 | x | test.cpp:172:13:172:44 | call to templateFunction3 | provenance | MaD:79 | +| test.cpp:172:51:172:51 | x | test.cpp:172:13:172:44 | call to templateFunction3 | provenance | MaD:80 | | test.cpp:186:2:186:2 | *s [post update] [myField] | test.cpp:187:33:187:34 | *& ... [myField] | provenance | | | test.cpp:186:2:186:24 | ... = ... | test.cpp:186:2:186:2 | *s [post update] [myField] | provenance | | | test.cpp:186:14:186:22 | call to ymlSource | test.cpp:186:2:186:24 | ... = ... | provenance | Src:MaD:38 | | test.cpp:187:10:187:31 | call to read_field_from_struct | test.cpp:187:10:187:31 | call to read_field_from_struct | provenance | | | test.cpp:187:10:187:31 | call to read_field_from_struct | test.cpp:188:10:188:10 | x | provenance | Sink:MaD:1 | -| test.cpp:187:33:187:34 | *& ... [myField] | test.cpp:187:10:187:31 | call to read_field_from_struct | provenance | MaD:71 | +| test.cpp:187:33:187:34 | *& ... [myField] | test.cpp:187:10:187:31 | call to read_field_from_struct | provenance | MaD:72 | | test.cpp:199:2:199:2 | *s [post update] [myField] | test.cpp:200:35:200:36 | *& ... [myField] | provenance | | | test.cpp:199:2:199:24 | ... = ... | test.cpp:199:2:199:2 | *s [post update] [myField] | provenance | | | test.cpp:199:14:199:22 | call to ymlSource | test.cpp:199:2:199:24 | ... = ... | provenance | Src:MaD:38 | | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | provenance | | | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | test.cpp:201:10:201:10 | x | provenance | Sink:MaD:1 | -| test.cpp:200:35:200:36 | *& ... [myField] | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | provenance | MaD:72 | +| test.cpp:200:35:200:36 | *& ... [myField] | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | provenance | MaD:73 | | test.cpp:216:3:216:4 | get_ptr output argument [value] | test.cpp:217:11:217:12 | *rf [value] | provenance | | -| test.cpp:216:3:216:28 | ... = ... | test.cpp:216:3:216:4 | get_ptr output argument [value] | provenance | MaD:78 | +| test.cpp:216:3:216:28 | ... = ... | test.cpp:216:3:216:4 | get_ptr output argument [value] | provenance | MaD:79 | | test.cpp:216:18:216:26 | call to ymlSource | test.cpp:216:3:216:28 | ... = ... | provenance | Src:MaD:38 | | test.cpp:217:11:217:12 | *rf [value] | test.cpp:217:14:217:18 | value | provenance | | | test.cpp:217:14:217:18 | value | test.cpp:217:14:217:18 | value | provenance | | | test.cpp:217:14:217:18 | value | test.cpp:218:11:218:11 | x | provenance | Sink:MaD:1 | | test.cpp:222:3:222:3 | operator[] output argument | test.cpp:223:12:223:12 | *s | provenance | | -| test.cpp:222:3:222:20 | ... = ... | test.cpp:222:3:222:3 | operator[] output argument | provenance | MaD:77 | +| test.cpp:222:3:222:20 | ... = ... | test.cpp:222:3:222:3 | operator[] output argument | provenance | MaD:78 | | test.cpp:222:10:222:18 | call to ymlSource | test.cpp:222:3:222:20 | ... = ... | provenance | Src:MaD:38 | -| test.cpp:223:12:223:12 | *s | test.cpp:223:13:223:15 | call to operator[] | provenance | MaD:76 | +| test.cpp:223:12:223:12 | *s | test.cpp:223:13:223:15 | call to operator[] | provenance | MaD:77 | | test.cpp:223:13:223:15 | call to operator[] | test.cpp:223:13:223:15 | call to operator[] | provenance | | | test.cpp:223:13:223:15 | call to operator[] | test.cpp:224:11:224:11 | c | provenance | Sink:MaD:1 | | test.cpp:243:10:243:10 | *s [value] | test.cpp:243:13:243:17 | value | provenance | | @@ -251,12 +252,13 @@ edges | test.cpp:263:15:263:19 | value | test.cpp:263:15:263:19 | value | provenance | Sink:MaD:1 | | test.cpp:267:32:267:34 | source_from_callback_template output argument | test.cpp:267:32:267:34 | source_from_callback_template output argument [value] | provenance | Src:MaD:36 | | test.cpp:267:32:267:34 | source_from_callback_template output argument [value] | test.cpp:263:12:263:12 | *s [value] | provenance | | +| test.cpp:293:11:293:22 | call to ymlSourcePtr | test.cpp:293:10:293:24 | * ... | provenance | Src:MaD:39 Sink:MaD:1 | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:24:8:24:11 | * ... | provenance | | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:27:36:27:38 | *cmd | provenance | | | windows.cpp:22:15:22:29 | call to GetCommandLineA | windows.cpp:22:15:22:29 | *call to GetCommandLineA | provenance | Src:MaD:3 | | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | provenance | | | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | windows.cpp:30:8:30:15 | * ... | provenance | | -| windows.cpp:27:36:27:38 | *cmd | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | provenance | MaD:48 | +| windows.cpp:27:36:27:38 | *cmd | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | provenance | MaD:49 | | windows.cpp:34:17:34:38 | *call to GetEnvironmentStringsA | windows.cpp:36:10:36:13 | * ... | provenance | | | windows.cpp:34:17:34:38 | call to GetEnvironmentStringsA | windows.cpp:34:17:34:38 | *call to GetEnvironmentStringsA | provenance | Src:MaD:4 | | windows.cpp:39:36:39:38 | GetEnvironmentVariableA output argument | windows.cpp:41:10:41:13 | * ... | provenance | Src:MaD:5 | @@ -276,11 +278,11 @@ edges | windows.cpp:189:21:189:26 | ReadFile output argument | windows.cpp:190:5:190:56 | *... = ... | provenance | Src:MaD:17 | | windows.cpp:190:5:190:14 | *overlapped [post update] [*hEvent] | windows.cpp:192:53:192:63 | *& ... [*hEvent] | provenance | | | windows.cpp:190:5:190:56 | *... = ... | windows.cpp:190:5:190:14 | *overlapped [post update] [*hEvent] | provenance | | -| windows.cpp:192:53:192:63 | *& ... [*hEvent] | windows.cpp:147:16:147:27 | *lpOverlapped [*hEvent] | provenance | MaD:55 | +| windows.cpp:192:53:192:63 | *& ... [*hEvent] | windows.cpp:147:16:147:27 | *lpOverlapped [*hEvent] | provenance | MaD:56 | | windows.cpp:198:21:198:26 | ReadFile output argument | windows.cpp:199:5:199:57 | ... = ... | provenance | Src:MaD:17 | | windows.cpp:199:5:199:14 | *overlapped [post update] [hEvent] | windows.cpp:201:53:201:63 | *& ... [hEvent] | provenance | | | windows.cpp:199:5:199:57 | ... = ... | windows.cpp:199:5:199:14 | *overlapped [post update] [hEvent] | provenance | | -| windows.cpp:201:53:201:63 | *& ... [hEvent] | windows.cpp:157:16:157:27 | *lpOverlapped [hEvent] | provenance | MaD:55 | +| windows.cpp:201:53:201:63 | *& ... [hEvent] | windows.cpp:157:16:157:27 | *lpOverlapped [hEvent] | provenance | MaD:56 | | windows.cpp:209:84:209:89 | NtReadFile output argument | windows.cpp:211:10:211:16 | * ... | provenance | Src:MaD:16 | | windows.cpp:286:23:286:35 | *call to MapViewOfFile | windows.cpp:287:20:287:52 | *pMapView | provenance | | | windows.cpp:286:23:286:35 | call to MapViewOfFile | windows.cpp:286:23:286:35 | *call to MapViewOfFile | provenance | Src:MaD:12 | @@ -317,9 +319,9 @@ edges | windows.cpp:431:3:431:3 | *s [post update] [x] | windows.cpp:464:7:464:8 | *& ... [x] | provenance | | | windows.cpp:431:3:431:16 | ... = ... | windows.cpp:431:3:431:3 | *s [post update] [x] | provenance | | | windows.cpp:431:9:431:14 | call to source | windows.cpp:431:3:431:16 | ... = ... | provenance | | -| windows.cpp:439:7:439:8 | *& ... [x] | windows.cpp:403:26:403:36 | *lpParameter [x] | provenance | MaD:51 | -| windows.cpp:451:7:451:8 | *& ... [x] | windows.cpp:410:26:410:36 | *lpParameter [x] | provenance | MaD:49 | -| windows.cpp:464:7:464:8 | *& ... [x] | windows.cpp:417:26:417:36 | *lpParameter [x] | provenance | MaD:50 | +| windows.cpp:439:7:439:8 | *& ... [x] | windows.cpp:403:26:403:36 | *lpParameter [x] | provenance | MaD:52 | +| windows.cpp:451:7:451:8 | *& ... [x] | windows.cpp:410:26:410:36 | *lpParameter [x] | provenance | MaD:50 | +| windows.cpp:464:7:464:8 | *& ... [x] | windows.cpp:417:26:417:36 | *lpParameter [x] | provenance | MaD:51 | | windows.cpp:533:11:533:16 | call to source | windows.cpp:533:11:533:16 | call to source | provenance | | | windows.cpp:533:11:533:16 | call to source | windows.cpp:537:40:537:41 | *& ... | provenance | | | windows.cpp:533:11:533:16 | call to source | windows.cpp:542:38:542:39 | *& ... | provenance | | @@ -328,30 +330,30 @@ edges | windows.cpp:533:11:533:16 | call to source | windows.cpp:568:32:568:33 | *& ... | provenance | | | windows.cpp:533:11:533:16 | call to source | windows.cpp:573:40:573:41 | *& ... | provenance | | | windows.cpp:537:27:537:37 | RtlCopyVolatileMemory output argument | windows.cpp:538:10:538:23 | access to array | provenance | | -| windows.cpp:537:40:537:41 | *& ... | windows.cpp:537:27:537:37 | RtlCopyVolatileMemory output argument | provenance | MaD:60 | +| windows.cpp:537:40:537:41 | *& ... | windows.cpp:537:27:537:37 | RtlCopyVolatileMemory output argument | provenance | MaD:61 | | windows.cpp:542:25:542:35 | RtlCopyDeviceMemory output argument | windows.cpp:543:10:543:23 | access to array | provenance | | -| windows.cpp:542:38:542:39 | *& ... | windows.cpp:542:25:542:35 | RtlCopyDeviceMemory output argument | provenance | MaD:56 | +| windows.cpp:542:38:542:39 | *& ... | windows.cpp:542:25:542:35 | RtlCopyDeviceMemory output argument | provenance | MaD:57 | | windows.cpp:547:19:547:29 | RtlCopyMemory output argument | windows.cpp:548:10:548:23 | access to array | provenance | | -| windows.cpp:547:32:547:33 | *& ... | windows.cpp:547:19:547:29 | RtlCopyMemory output argument | provenance | MaD:57 | +| windows.cpp:547:32:547:33 | *& ... | windows.cpp:547:19:547:29 | RtlCopyMemory output argument | provenance | MaD:58 | | windows.cpp:552:30:552:40 | RtlCopyMemoryNonTemporal output argument | windows.cpp:553:10:553:23 | access to array | provenance | | -| windows.cpp:552:43:552:44 | *& ... | windows.cpp:552:30:552:40 | RtlCopyMemoryNonTemporal output argument | provenance | MaD:58 | +| windows.cpp:552:43:552:44 | *& ... | windows.cpp:552:30:552:40 | RtlCopyMemoryNonTemporal output argument | provenance | MaD:59 | | windows.cpp:559:5:559:24 | ... = ... | windows.cpp:561:39:561:44 | *buffer | provenance | | | windows.cpp:559:17:559:24 | call to source | windows.cpp:559:5:559:24 | ... = ... | provenance | | | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | windows.cpp:562:10:562:19 | *src_string [*Buffer] | provenance | | | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | windows.cpp:563:40:563:50 | *& ... [*Buffer] | provenance | | -| windows.cpp:561:39:561:44 | *buffer | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | provenance | MaD:61 | +| windows.cpp:561:39:561:44 | *buffer | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | provenance | MaD:62 | | windows.cpp:562:10:562:19 | *src_string [*Buffer] | windows.cpp:562:10:562:29 | access to array | provenance | | | windows.cpp:562:10:562:19 | *src_string [*Buffer] | windows.cpp:562:21:562:26 | *Buffer | provenance | | | windows.cpp:562:21:562:26 | *Buffer | windows.cpp:562:10:562:29 | access to array | provenance | | | windows.cpp:563:26:563:37 | RtlCopyUnicodeString output argument [*Buffer] | windows.cpp:564:10:564:20 | *dest_string [*Buffer] | provenance | | -| windows.cpp:563:40:563:50 | *& ... [*Buffer] | windows.cpp:563:26:563:37 | RtlCopyUnicodeString output argument [*Buffer] | provenance | MaD:59 | +| windows.cpp:563:40:563:50 | *& ... [*Buffer] | windows.cpp:563:26:563:37 | RtlCopyUnicodeString output argument [*Buffer] | provenance | MaD:60 | | windows.cpp:564:10:564:20 | *dest_string [*Buffer] | windows.cpp:564:10:564:30 | access to array | provenance | | | windows.cpp:564:10:564:20 | *dest_string [*Buffer] | windows.cpp:564:22:564:27 | *Buffer | provenance | | | windows.cpp:564:22:564:27 | *Buffer | windows.cpp:564:10:564:30 | access to array | provenance | | | windows.cpp:568:19:568:29 | RtlMoveMemory output argument | windows.cpp:569:10:569:23 | access to array | provenance | | -| windows.cpp:568:32:568:33 | *& ... | windows.cpp:568:19:568:29 | RtlMoveMemory output argument | provenance | MaD:62 | +| windows.cpp:568:32:568:33 | *& ... | windows.cpp:568:19:568:29 | RtlMoveMemory output argument | provenance | MaD:63 | | windows.cpp:573:27:573:37 | RtlMoveVolatileMemory output argument | windows.cpp:574:10:574:23 | access to array | provenance | | -| windows.cpp:573:40:573:41 | *& ... | windows.cpp:573:27:573:37 | RtlMoveVolatileMemory output argument | provenance | MaD:63 | +| windows.cpp:573:40:573:41 | *& ... | windows.cpp:573:27:573:37 | RtlMoveVolatileMemory output argument | provenance | MaD:64 | | windows.cpp:645:45:645:50 | WinHttpReadData output argument | windows.cpp:647:10:647:16 | * ... | provenance | Src:MaD:33 | | windows.cpp:652:48:652:53 | WinHttpReadDataEx output argument | windows.cpp:654:10:654:16 | * ... | provenance | Src:MaD:34 | | windows.cpp:659:47:659:52 | WinHttpQueryHeaders output argument | windows.cpp:661:10:661:16 | * ... | provenance | Src:MaD:29 | @@ -360,7 +362,7 @@ edges | windows.cpp:669:105:669:112 | WinHttpQueryHeadersEx output argument | windows.cpp:675:10:675:27 | * ... | provenance | Src:MaD:30 | | windows.cpp:728:5:728:28 | ... = ... | windows.cpp:729:35:729:35 | *x | provenance | | | windows.cpp:728:12:728:28 | call to source | windows.cpp:728:5:728:28 | ... = ... | provenance | | -| windows.cpp:729:35:729:35 | *x | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | provenance | MaD:67 | +| windows.cpp:729:35:729:35 | *x | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | provenance | MaD:68 | | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | windows.cpp:731:10:731:36 | * ... | provenance | | | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | windows.cpp:733:10:733:35 | * ... | provenance | | | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | windows.cpp:735:10:735:37 | * ... | provenance | | @@ -395,35 +397,35 @@ edges | windows.cpp:1087:71:1087:74 | RegEnumValueW output argument | windows.cpp:1089:10:1089:14 | * ... | provenance | Src:MaD:20 | | windows.cpp:1122:5:1122:27 | ... = ... | windows.cpp:1124:19:1124:21 | *str | provenance | | | windows.cpp:1122:14:1122:27 | call to source | windows.cpp:1122:5:1122:27 | ... = ... | provenance | | -| windows.cpp:1124:19:1124:21 | *str | windows.cpp:1124:24:1124:27 | IIDFromString output argument | provenance | MaD:53 | +| windows.cpp:1124:19:1124:21 | *str | windows.cpp:1124:24:1124:27 | IIDFromString output argument | provenance | MaD:54 | | windows.cpp:1124:24:1124:27 | IIDFromString output argument | windows.cpp:1125:10:1125:12 | iid | provenance | | | windows.cpp:1128:15:1128:20 | call to source | windows.cpp:1128:15:1128:20 | call to source | provenance | | | windows.cpp:1128:15:1128:20 | call to source | windows.cpp:1130:19:1130:21 | *iid | provenance | | -| windows.cpp:1130:19:1130:21 | *iid | windows.cpp:1130:24:1130:27 | StringFromIID output argument | provenance | MaD:66 | +| windows.cpp:1130:19:1130:21 | *iid | windows.cpp:1130:24:1130:27 | StringFromIID output argument | provenance | MaD:67 | | windows.cpp:1130:24:1130:27 | StringFromIID output argument | windows.cpp:1132:10:1132:13 | * ... | provenance | | | windows.cpp:1135:19:1135:24 | call to source | windows.cpp:1135:19:1135:24 | call to source | provenance | | | windows.cpp:1135:19:1135:24 | call to source | windows.cpp:1137:21:1137:25 | *clsid | provenance | | -| windows.cpp:1137:21:1137:25 | *clsid | windows.cpp:1137:28:1137:31 | ProgIDFromCLSID output argument | provenance | MaD:54 | +| windows.cpp:1137:21:1137:25 | *clsid | windows.cpp:1137:28:1137:31 | ProgIDFromCLSID output argument | provenance | MaD:55 | | windows.cpp:1137:28:1137:31 | ProgIDFromCLSID output argument | windows.cpp:1139:10:1139:13 | * ... | provenance | | | windows.cpp:1143:5:1143:30 | ... = ... | windows.cpp:1145:21:1145:26 | *progID | provenance | | | windows.cpp:1143:17:1143:30 | call to source | windows.cpp:1143:5:1143:30 | ... = ... | provenance | | -| windows.cpp:1145:21:1145:26 | *progID | windows.cpp:1145:29:1145:34 | CLSIDFromProgID output argument | provenance | MaD:46 | +| windows.cpp:1145:21:1145:26 | *progID | windows.cpp:1145:29:1145:34 | CLSIDFromProgID output argument | provenance | MaD:47 | | windows.cpp:1145:29:1145:34 | CLSIDFromProgID output argument | windows.cpp:1146:10:1146:14 | clsid | provenance | | | windows.cpp:1150:5:1150:27 | ... = ... | windows.cpp:1152:21:1152:23 | *str | provenance | | | windows.cpp:1150:14:1150:27 | call to source | windows.cpp:1150:5:1150:27 | ... = ... | provenance | | -| windows.cpp:1152:21:1152:23 | *str | windows.cpp:1152:26:1152:31 | CLSIDFromString output argument | provenance | MaD:47 | +| windows.cpp:1152:21:1152:23 | *str | windows.cpp:1152:26:1152:31 | CLSIDFromString output argument | provenance | MaD:48 | | windows.cpp:1152:26:1152:31 | CLSIDFromString output argument | windows.cpp:1153:10:1153:14 | clsid | provenance | | | windows.cpp:1156:19:1156:24 | call to source | windows.cpp:1156:19:1156:24 | call to source | provenance | | | windows.cpp:1156:19:1156:24 | call to source | windows.cpp:1158:21:1158:25 | *clsid | provenance | | -| windows.cpp:1158:21:1158:25 | *clsid | windows.cpp:1158:28:1158:31 | StringFromCLSID output argument | provenance | MaD:64 | +| windows.cpp:1158:21:1158:25 | *clsid | windows.cpp:1158:28:1158:31 | StringFromCLSID output argument | provenance | MaD:65 | | windows.cpp:1158:28:1158:31 | StringFromCLSID output argument | windows.cpp:1160:10:1160:13 | * ... | provenance | | | windows.cpp:1164:5:1164:27 | ... = ... | windows.cpp:1166:20:1166:22 | *str | provenance | | | windows.cpp:1164:14:1164:27 | call to source | windows.cpp:1164:5:1164:27 | ... = ... | provenance | | -| windows.cpp:1166:20:1166:22 | *str | windows.cpp:1166:25:1166:29 | GUIDFromString output argument | provenance | MaD:52 | +| windows.cpp:1166:20:1166:22 | *str | windows.cpp:1166:25:1166:29 | GUIDFromString output argument | provenance | MaD:53 | | windows.cpp:1166:25:1166:29 | GUIDFromString output argument | windows.cpp:1167:10:1167:13 | guid | provenance | | | windows.cpp:1170:17:1170:22 | call to source | windows.cpp:1170:17:1170:22 | call to source | provenance | | | windows.cpp:1170:17:1170:22 | call to source | windows.cpp:1172:21:1172:24 | *guid | provenance | | -| windows.cpp:1172:21:1172:24 | *guid | windows.cpp:1172:27:1172:29 | StringFromGUID2 output argument | provenance | MaD:65 | +| windows.cpp:1172:21:1172:24 | *guid | windows.cpp:1172:27:1172:29 | StringFromGUID2 output argument | provenance | MaD:66 | | windows.cpp:1172:27:1172:29 | StringFromGUID2 output argument | windows.cpp:1174:10:1174:13 | * ... | provenance | | nodes | asio_streams.cpp:87:34:87:44 | read_until output argument | semmle.label | read_until output argument | @@ -615,6 +617,8 @@ nodes | test.cpp:263:15:263:19 | value | semmle.label | value | | test.cpp:267:32:267:34 | source_from_callback_template output argument | semmle.label | source_from_callback_template output argument | | test.cpp:267:32:267:34 | source_from_callback_template output argument [value] | semmle.label | source_from_callback_template output argument [value] | +| test.cpp:293:10:293:24 | * ... | semmle.label | * ... | +| test.cpp:293:11:293:22 | call to ymlSourcePtr | semmle.label | call to ymlSourcePtr | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | semmle.label | *call to GetCommandLineA | | windows.cpp:22:15:22:29 | call to GetCommandLineA | semmle.label | call to GetCommandLineA | | windows.cpp:24:8:24:11 | * ... | semmle.label | * ... | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml b/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml index 87756c451f3a..134aeb018822 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml @@ -4,14 +4,21 @@ extensions: extensible: sourceModel data: # namespace, type, subtypes, name, signature, ext, output, kind, provenance - ["", "", False, "ymlSource", "", "", "ReturnValue", "local", "manual"] + - ["", "", False, "ymlSourcePtr", "", "", "ReturnValue[*]", "local", "manual"] - ["", "", False, "ymlFieldSource", "", "", "ReturnValue.Field[SourceWrapper::value]", "local", "manual"] - ["", "", False, "source_from_callback_template", "", "", "Argument[0].Parameter[*0].Field[SourceWrapper::value]", "local", "manual"] - ["", "", False, "source_from_callback_ptr", "", "", "Argument[0].Parameter[*0].Field[SourceWrapper::value]", "local", "manual"] + - ["", "", False, "source_from_callback_return_template", "", "", "Argument[0].ReturnValue", "local", "manual"] + - ["", "", False, "source_from_callback_return_ptr", "", "", "Argument[0].ReturnValue", "local", "manual"] + - ["", "", False, "source_ptr_from_callback_return_ptr", "", "", "Argument[0].ReturnValue[*]", "local", "manual"] - addsTo: pack: codeql/cpp-all extensible: sinkModel data: # namespace, type, subtypes, name, signature, ext, input, kind, provenance - ["", "", False, "ymlSink", "", "", "Argument[0]", "test-sink", "manual"] + - ["", "", False, "sink_from_callback_return_template", "", "", "Argument[0].ReturnValue", "test-sink", "manual"] + - ["", "", False, "sink_from_callback_return_ptr", "", "", "Argument[0].ReturnValue", "test-sink", "manual"] + - ["", "", False, "sink_ptr_from_callback_return_ptr", "", "", "Argument[0].ReturnValue[*]", "test-sink", "manual"] - addsTo: pack: codeql/cpp-all extensible: summaryModel diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected index 32f130cd165d..158f3a2a71f8 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected @@ -28,3 +28,9 @@ | test.cpp:254:14:254:18 | value | test-sink | | test.cpp:258:14:258:18 | value | test-sink | | test.cpp:263:15:263:19 | value | test-sink | +| test.cpp:292:15:292:26 | call to ymlSourcePtr | test-sink | +| test.cpp:293:10:293:24 | * ... | test-sink | +| test.cpp:296:10:296:31 | call to callback_returning_int | test-sink | +| test.cpp:299:10:299:33 | call to callback_returning_int_2 | test-sink | +| test.cpp:303:15:303:17 | ptr | test-sink | +| test.cpp:304:10:304:13 | * ... | test-sink | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected index 9c04945642e9..5ca05449bc4f 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected @@ -17,6 +17,8 @@ | test.cpp:199:14:199:22 | call to ymlSource | local | | test.cpp:216:18:216:26 | call to ymlSource | local | | test.cpp:222:10:222:18 | call to ymlSource | local | +| test.cpp:286:33:286:41 | call to ymlSource | local | +| test.cpp:306:51:306:59 | call to ymlSource | local | | windows.cpp:22:15:22:29 | call to GetCommandLineA | local | | windows.cpp:34:17:34:38 | call to GetEnvironmentStringsA | local | | windows.cpp:39:36:39:38 | GetEnvironmentVariableA output argument | local | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp index bfdf213fc3c1..52c57f3a881e 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp @@ -1,5 +1,5 @@ -int ymlSource(); +int ymlSource(); int* ymlSourcePtr(); void ymlSink(int value); int ymlStepManual(int value); int ymlStepGenerated(int value); @@ -265,4 +265,47 @@ void test_source_access_path() { }; source_from_callback_template(S()); +} + +template void source_from_callback_return_template(F); +template void sink_from_callback_return_template(F); + +using IntCallback = int(*)(void); +using IntPtrCallback = int*(*)(void); + +void source_from_callback_return_ptr(IntCallback); +void sink_from_callback_return_ptr(IntCallback); + +void source_ptr_from_callback_return_ptr(IntPtrCallback); +void sink_ptr_from_callback_return_ptr(IntPtrCallback); + +int callback_returning_int() { return 0; } +int callback_returning_int_2() { return 0; } +int* callback_returning_ptr_int() { return nullptr; } + +int return_ymlSource() { return ymlSource(); } + +int* return_ptr_to_ymlSource() { return ymlSourcePtr(); } + +void test_callback_return_access_paths() { + + ymlSink((int)ymlSourcePtr()); // clean + ymlSink(*ymlSourcePtr()); // $ ir + + source_from_callback_return_template(callback_returning_int); + ymlSink(callback_returning_int()); // $ MISSING: ir + + source_from_callback_return_ptr(callback_returning_int_2); + ymlSink(callback_returning_int_2()); // $ MISSING: ir + + source_ptr_from_callback_return_ptr(callback_returning_ptr_int); + int *ptr = callback_returning_ptr_int(); + ymlSink((int)ptr); // clean + ymlSink(*ptr); // $ MISSING: ir + + sink_from_callback_return_template([]() { return ymlSource(); }); // $ MISSING: ir + sink_from_callback_return_template(return_ymlSource); // $ MISSING: ir + + sink_ptr_from_callback_return_ptr([]() { return ymlSourcePtr(); }); // $ MISSING: ir + sink_ptr_from_callback_return_ptr(return_ptr_to_ymlSource); // $ MISSING: ir } \ No newline at end of file From bbff992ee161a21c59c26d6b2747a741763b715f Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 20 Aug 2026 17:18:42 +0200 Subject: [PATCH 0440/2098] Add change note --- .../2026-08-20-unused-variables-in-incomplete-functions.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 rust/ql/src/change-notes/2026-08-20-unused-variables-in-incomplete-functions.md diff --git a/rust/ql/src/change-notes/2026-08-20-unused-variables-in-incomplete-functions.md b/rust/ql/src/change-notes/2026-08-20-unused-variables-in-incomplete-functions.md new file mode 100644 index 000000000000..882c91178175 --- /dev/null +++ b/rust/ql/src/change-notes/2026-08-20-unused-variables-in-incomplete-functions.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `rust/unused-variable` query no longer reports variables in functions containing the standard `todo!()` or `unimplemented!()` macros. \ No newline at end of file From 1dd500d4551acf2c7b417dffce95d7543083fa6f Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 20 Aug 2026 16:05:47 +0100 Subject: [PATCH 0441/2098] C++: Support 'ReturnValue' in both sources and sinks. --- .../cpp/dataflow/internal/FlowSummaryImpl.qll | 65 +++++++++++++++++-- 1 file changed, 60 insertions(+), 5 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll index 7a43fe19492e..d45db30dc1c0 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll @@ -139,6 +139,28 @@ private class ConversionCall extends Call { private module Input2 implements Impl::Private::InputSig2 { private import codeql.util.Void + pragma[nomagic] + private predicate hasFunctionAndIndirectionIndex( + Function f, int indirectionIndex, Ssa::ExplicitDefinition def + ) { + def.getFunction() = f and + def.getSourceVariable().getIRVariable() instanceof IRReturnVariable and + def.getIndirectionIndex() = indirectionIndex + } + + /** Holds if `def` defines `e` as a returned value with return kind `rk`. */ + bindingset[rk, e] + private predicate isReturnExpr(Function f, ReturnKind rk, Expr e) { + exists(Ssa::ExplicitDefinition def | + hasFunctionAndIndirectionIndex(f, rk.getIndirectionIndex(), def) and + e = + def.getAssignedInstruction() + .(StoreInstruction) + .getSourceValue() + .getUnconvertedResultExpression() + ) + } + class SourceSinkReportingElement extends Element { SourceSinkReportingElement() { this instanceof Expr or this instanceof Parameter } @@ -159,13 +181,25 @@ private module Input2 implements Impl::Private::InputSig2 { result = this.(ConversionCall).getQualifier().(LambdaExpression).getLambdaFunction() } + /** Gets the function invoked when this element is used as a callback. */ + private Function getCallbackFunction() { + // Taking the address of a function + result = this.(FunctionAccess).getTarget() + or + // Passing an object with an overloaded `operator()` + result = this.getOperatorCallFunction() + } + SourceSinkReportingElement getASuccessor(Impl::Private::SummaryComponent sc) { - exists(ParameterPosition pos | sc = Impl::Private::SummaryComponent::parameter(pos) | - // Taking the address of a function - result = pos.getParameter(this.(FunctionAccess).getTarget()) + exists(Function f | f = this.getCallbackFunction() | + exists(ParameterPosition pos | sc = Impl::Private::SummaryComponent::parameter(pos) | + result = pos.getParameter(f) + ) or - // Passing an object with an overloaded `operator()` - result = pos.getParameter(this.getOperatorCallFunction()) + exists(ReturnKind rk | + sc = Impl::Private::SummaryComponent::return(rk) and + isReturnExpr(f, rk, result) + ) ) } } @@ -197,6 +231,12 @@ private module Input2 implements Impl::Private::InputSig2 { pragma[only_bind_out](rk.getIndirectionIndex()) } + pragma[nomagic] + private predicate hasKindAndEnclosingFunction(Function f, ReturnKind rk, ReturnNode r) { + r.getEnclosingCallable().asSourceCallable() = f and + r.getKind() = rk + } + bindingset[e, sc] Node getSourceDataFlowNode(SourceSinkReportingElement e, Impl::Private::SummaryComponent sc) { exists(DataFlowCall call | @@ -212,6 +252,7 @@ private module Input2 implements Impl::Private::InputSig2 { or exists(ReturnKind rk | sc = Impl::Private::SummaryComponent::return(rk) and + // When `e` is a call the node becomes an `OutNode`. e = call.asCallInstruction().getUnconvertedResultExpression() | rk.getIndirectionIndex() = 0 and @@ -226,6 +267,14 @@ private module Input2 implements Impl::Private::InputSig2 { p.isParameterOf(e.getEnclosingCallable(), pos) and result = p ) + or + exists(Function f, ReturnKind rk | + sc = Impl::Private::SummaryComponent::return(rk) and + // When `e` is the returned expression from a function the node is + // the `ReturnNode`. + isReturnExpr(f, rk, e) and + hasKindAndEnclosingFunction(f, rk, result) + ) } bindingset[sink, sc] @@ -246,6 +295,12 @@ private module Input2 implements Impl::Private::InputSig2 { pos.getArgument(call.getUnconvertedResultExpression()) = e and result.(ArgumentNode).sourceArgumentOf(call, pos) ) + or + exists(Function f, ReturnKind rk | + sc = Impl::Private::SummaryComponent::return(rk) and + isReturnExpr(f, rk, e) and + hasKindAndEnclosingFunction(f, rk, result) + ) } } From f0a4145c9cf0395365cd56006c71623ce13a6336 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 20 Aug 2026 16:06:54 +0100 Subject: [PATCH 0442/2098] C++: Accept test changes. --- .../dataflow/external-models/flow.expected | 522 ++++++++++-------- .../dataflow/external-models/test.cpp | 14 +- 2 files changed, 294 insertions(+), 242 deletions(-) diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index b61607089097..0ee182649a08 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -1,267 +1,294 @@ models -| 1 | Sink: ; ; false; ymlSink; ; ; Argument[0]; test-sink; manual | -| 2 | Sink: boost::asio; ; false; write; ; ; Argument[*1]; remote-sink; manual | -| 3 | Source: ; ; false; GetCommandLineA; ; ; ReturnValue[*]; local; manual | -| 4 | Source: ; ; false; GetEnvironmentStringsA; ; ; ReturnValue[*]; local; manual | -| 5 | Source: ; ; false; GetEnvironmentVariableA; ; ; Argument[*1]; local; manual | -| 6 | Source: ; ; false; HttpReceiveClientCertificate; ; ; Argument[*3]; remote; manual | -| 7 | Source: ; ; false; HttpReceiveHttpRequest; ; ; Argument[*3]; remote; manual | -| 8 | Source: ; ; false; HttpReceiveRequestEntityBody; ; ; Argument[*3]; remote; manual | -| 9 | Source: ; ; false; MapViewOfFile2; ; ; ReturnValue[*]; local; manual | -| 10 | Source: ; ; false; MapViewOfFile3; ; ; ReturnValue[*]; local; manual | -| 11 | Source: ; ; false; MapViewOfFile3FromApp; ; ; ReturnValue[*]; local; manual | -| 12 | Source: ; ; false; MapViewOfFile; ; ; ReturnValue[*]; local; manual | -| 13 | Source: ; ; false; MapViewOfFileEx; ; ; ReturnValue[*]; local; manual | -| 14 | Source: ; ; false; MapViewOfFileFromApp; ; ; ReturnValue[*]; local; manual | -| 15 | Source: ; ; false; MapViewOfFileNuma2; ; ; ReturnValue[*]; local; manual | -| 16 | Source: ; ; false; NtReadFile; ; ; Argument[*5]; local; manual | -| 17 | Source: ; ; false; ReadFile; ; ; Argument[*1]; local; manual | -| 18 | Source: ; ; false; ReadFileEx; ; ; Argument[*1]; local; manual | -| 19 | Source: ; ; false; RegEnumValueA; ; ; Argument[*2,*6]; windows-registry; manual | -| 20 | Source: ; ; false; RegEnumValueW; ; ; Argument[*2,*6]; windows-registry; manual | -| 21 | Source: ; ; false; RegGetValueA; ; ; Argument[*5]; windows-registry; manual | -| 22 | Source: ; ; false; RegGetValueW; ; ; Argument[*5]; windows-registry; manual | -| 23 | Source: ; ; false; RegQueryMultipleValuesA; ; ; Argument[*3]; windows-registry; manual | -| 24 | Source: ; ; false; RegQueryMultipleValuesW; ; ; Argument[*3]; windows-registry; manual | -| 25 | Source: ; ; false; RegQueryValueA; ; ; Argument[*2]; windows-registry; manual | -| 26 | Source: ; ; false; RegQueryValueExA; ; ; Argument[*4]; windows-registry; manual | -| 27 | Source: ; ; false; RegQueryValueExW; ; ; Argument[*4]; windows-registry; manual | -| 28 | Source: ; ; false; RegQueryValueW; ; ; Argument[*2]; windows-registry; manual | -| 29 | Source: ; ; false; WinHttpQueryHeaders; ; ; Argument[*3]; remote; manual | -| 30 | Source: ; ; false; WinHttpQueryHeadersEx; ; ; Argument[**8]; remote; manual | -| 31 | Source: ; ; false; WinHttpQueryHeadersEx; ; ; Argument[*5]; remote; manual | -| 32 | Source: ; ; false; WinHttpQueryHeadersEx; ; ; Argument[*6]; remote; manual | -| 33 | Source: ; ; false; WinHttpReadData; ; ; Argument[*1]; remote; manual | -| 34 | Source: ; ; false; WinHttpReadDataEx; ; ; Argument[*1]; remote; manual | -| 35 | Source: ; ; false; source_from_callback_ptr; ; ; Argument[0].Parameter[*0].Field[SourceWrapper::value]; local; manual | -| 36 | Source: ; ; false; source_from_callback_template; ; ; Argument[0].Parameter[*0].Field[SourceWrapper::value]; local; manual | -| 37 | Source: ; ; false; ymlFieldSource; ; ; ReturnValue.Field[SourceWrapper::value]; local; manual | -| 38 | Source: ; ; false; ymlSource; ; ; ReturnValue; local; manual | -| 39 | Source: ; ; false; ymlSourcePtr; ; ; ReturnValue[*]; local; manual | -| 40 | Source: Azure::Core::Http; RawResponse; true; ExtractBodyStream; ; ; ReturnValue[*]; remote; manual | -| 41 | Source: Azure::Core::Http; RawResponse; true; GetBody; ; ; ReturnValue[*]; remote; manual | -| 42 | Source: Azure::Core::Http; RawResponse; true; GetHeaders; ; ; ReturnValue[*]; remote; manual | -| 43 | Source: Azure::Core::Http; Request; true; GetBodyStream; ; ; ReturnValue[*]; remote; manual | -| 44 | Source: Azure::Core::Http; Request; true; GetHeader; ; ; ReturnValue; remote; manual | -| 45 | Source: Azure::Core::Http; Request; true; GetHeaders; ; ; ReturnValue; remote; manual | -| 46 | Source: boost::asio; ; false; read_until; ; ; Argument[*1]; remote; manual | -| 47 | Summary: ; ; false; CLSIDFromProgID; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 48 | Summary: ; ; false; CLSIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 49 | Summary: ; ; false; CommandLineToArgvA; ; ; Argument[*0]; ReturnValue[**]; taint; manual | -| 50 | Summary: ; ; false; CreateRemoteThread; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | -| 51 | Summary: ; ; false; CreateRemoteThreadEx; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | -| 52 | Summary: ; ; false; CreateThread; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | -| 53 | Summary: ; ; false; GUIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 54 | Summary: ; ; false; IIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 55 | Summary: ; ; false; ProgIDFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | -| 56 | Summary: ; ; false; ReadFileEx; ; ; Argument[*3].Field[@hEvent]; Argument[4].Parameter[*2].Field[@hEvent]; value; manual | -| 57 | Summary: ; ; false; RtlCopyDeviceMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 58 | Summary: ; ; false; RtlCopyMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 59 | Summary: ; ; false; RtlCopyMemoryNonTemporal; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 60 | Summary: ; ; false; RtlCopyUnicodeString; ; ; Argument[*1].Field[*Buffer]; Argument[*0].Field[*Buffer]; value; manual | -| 61 | Summary: ; ; false; RtlCopyVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 62 | Summary: ; ; false; RtlInitUnicodeString; ; ; Argument[*1]; Argument[*0].Field[*Buffer]; value; manual | -| 63 | Summary: ; ; false; RtlMoveMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 64 | Summary: ; ; false; RtlMoveVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 65 | Summary: ; ; false; StringFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | -| 66 | Summary: ; ; false; StringFromGUID2; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 67 | Summary: ; ; false; StringFromIID; ; ; Argument[*0]; Argument[**1]; taint; manual | -| 68 | Summary: ; ; false; WinHttpCrackUrl; ; ; Argument[*0]; Argument[*3]; taint; manual | -| 69 | Summary: ; ; false; callWithArgument; ; ; Argument[1]; Argument[0].Parameter[0]; value; manual | -| 70 | Summary: ; ; false; callWithNonTypeTemplate; (const T &); ; Argument[*0]; ReturnValue; value; manual | -| 71 | Summary: ; ; false; pthread_create; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | -| 72 | Summary: ; ; false; read_field_from_struct; ; ; Argument[*0].Field[MyNamespace::MyStructInNamespace::myField]; ReturnValue; value; manual | -| 73 | Summary: ; ; false; read_field_from_struct_2; ; ; Argument[*0].Field[MyGlobalStruct::myField]; ReturnValue; value; manual | -| 74 | Summary: ; ; false; ymlStepGenerated; ; ; Argument[0]; ReturnValue; taint; df-generated | -| 75 | Summary: ; ; false; ymlStepManual; ; ; Argument[0]; ReturnValue; taint; manual | -| 76 | Summary: ; ; false; ymlStepManual_with_body; ; ; Argument[0]; ReturnValue; taint; manual | -| 77 | Summary: ; MyString; true; operator[]; ; ; Argument[-1]; ReturnValue[*]; taint; manual | -| 78 | Summary: ; MyString; true; operator[]; ; ; ReturnValue[*]; Argument[-1]; taint; manual | -| 79 | Summary: ; ReverseFlow; true; get_ptr; ; ; ReturnValue[*]; Argument[-1].Field[ReverseFlow::value]; value; manual | -| 80 | Summary: ; TemplateClass1; true; templateFunction2; (U,V); ; Argument[1]; ReturnValue; value; manual | -| 81 | Summary: ; TemplateClass1; false; templateFunction; (T,U); ; Argument[0]; ReturnValue; value; manual | -| 82 | Summary: ; TemplateClass2; true; function; (U,T); ; Argument[1]; ReturnValue; value; manual | -| 83 | Summary: Azure::Core::IO; BodyStream; true; Read; ; ; Argument[-1]; Argument[*0]; taint; manual | -| 84 | Summary: Azure::Core::IO; BodyStream; true; ReadToCount; ; ; Argument[-1]; Argument[*0]; taint; manual | -| 85 | Summary: Azure::Core::IO; BodyStream; true; ReadToEnd; ; ; Argument[-1]; ReturnValue.Element; taint; manual | -| 86 | Summary: Azure; Nullable; true; Value; ; ; Argument[-1]; ReturnValue[*]; taint; manual | -| 87 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | +| 1 | Sink: ; ; false; sink_from_callback_return_template; ; ; Argument[0].ReturnValue; test-sink; manual | +| 2 | Sink: ; ; false; sink_ptr_from_callback_return_ptr; ; ; Argument[0].ReturnValue[*]; test-sink; manual | +| 3 | Sink: ; ; false; ymlSink; ; ; Argument[0]; test-sink; manual | +| 4 | Sink: boost::asio; ; false; write; ; ; Argument[*1]; remote-sink; manual | +| 5 | Source: ; ; false; GetCommandLineA; ; ; ReturnValue[*]; local; manual | +| 6 | Source: ; ; false; GetEnvironmentStringsA; ; ; ReturnValue[*]; local; manual | +| 7 | Source: ; ; false; GetEnvironmentVariableA; ; ; Argument[*1]; local; manual | +| 8 | Source: ; ; false; HttpReceiveClientCertificate; ; ; Argument[*3]; remote; manual | +| 9 | Source: ; ; false; HttpReceiveHttpRequest; ; ; Argument[*3]; remote; manual | +| 10 | Source: ; ; false; HttpReceiveRequestEntityBody; ; ; Argument[*3]; remote; manual | +| 11 | Source: ; ; false; MapViewOfFile2; ; ; ReturnValue[*]; local; manual | +| 12 | Source: ; ; false; MapViewOfFile3; ; ; ReturnValue[*]; local; manual | +| 13 | Source: ; ; false; MapViewOfFile3FromApp; ; ; ReturnValue[*]; local; manual | +| 14 | Source: ; ; false; MapViewOfFile; ; ; ReturnValue[*]; local; manual | +| 15 | Source: ; ; false; MapViewOfFileEx; ; ; ReturnValue[*]; local; manual | +| 16 | Source: ; ; false; MapViewOfFileFromApp; ; ; ReturnValue[*]; local; manual | +| 17 | Source: ; ; false; MapViewOfFileNuma2; ; ; ReturnValue[*]; local; manual | +| 18 | Source: ; ; false; NtReadFile; ; ; Argument[*5]; local; manual | +| 19 | Source: ; ; false; ReadFile; ; ; Argument[*1]; local; manual | +| 20 | Source: ; ; false; ReadFileEx; ; ; Argument[*1]; local; manual | +| 21 | Source: ; ; false; RegEnumValueA; ; ; Argument[*2,*6]; windows-registry; manual | +| 22 | Source: ; ; false; RegEnumValueW; ; ; Argument[*2,*6]; windows-registry; manual | +| 23 | Source: ; ; false; RegGetValueA; ; ; Argument[*5]; windows-registry; manual | +| 24 | Source: ; ; false; RegGetValueW; ; ; Argument[*5]; windows-registry; manual | +| 25 | Source: ; ; false; RegQueryMultipleValuesA; ; ; Argument[*3]; windows-registry; manual | +| 26 | Source: ; ; false; RegQueryMultipleValuesW; ; ; Argument[*3]; windows-registry; manual | +| 27 | Source: ; ; false; RegQueryValueA; ; ; Argument[*2]; windows-registry; manual | +| 28 | Source: ; ; false; RegQueryValueExA; ; ; Argument[*4]; windows-registry; manual | +| 29 | Source: ; ; false; RegQueryValueExW; ; ; Argument[*4]; windows-registry; manual | +| 30 | Source: ; ; false; RegQueryValueW; ; ; Argument[*2]; windows-registry; manual | +| 31 | Source: ; ; false; WinHttpQueryHeaders; ; ; Argument[*3]; remote; manual | +| 32 | Source: ; ; false; WinHttpQueryHeadersEx; ; ; Argument[**8]; remote; manual | +| 33 | Source: ; ; false; WinHttpQueryHeadersEx; ; ; Argument[*5]; remote; manual | +| 34 | Source: ; ; false; WinHttpQueryHeadersEx; ; ; Argument[*6]; remote; manual | +| 35 | Source: ; ; false; WinHttpReadData; ; ; Argument[*1]; remote; manual | +| 36 | Source: ; ; false; WinHttpReadDataEx; ; ; Argument[*1]; remote; manual | +| 37 | Source: ; ; false; source_from_callback_ptr; ; ; Argument[0].Parameter[*0].Field[SourceWrapper::value]; local; manual | +| 38 | Source: ; ; false; source_from_callback_return_ptr; ; ; Argument[0].ReturnValue; local; manual | +| 39 | Source: ; ; false; source_from_callback_return_template; ; ; Argument[0].ReturnValue; local; manual | +| 40 | Source: ; ; false; source_from_callback_template; ; ; Argument[0].Parameter[*0].Field[SourceWrapper::value]; local; manual | +| 41 | Source: ; ; false; source_ptr_from_callback_return_ptr; ; ; Argument[0].ReturnValue[*]; local; manual | +| 42 | Source: ; ; false; ymlFieldSource; ; ; ReturnValue.Field[SourceWrapper::value]; local; manual | +| 43 | Source: ; ; false; ymlSource; ; ; ReturnValue; local; manual | +| 44 | Source: ; ; false; ymlSourcePtr; ; ; ReturnValue[*]; local; manual | +| 45 | Source: Azure::Core::Http; RawResponse; true; ExtractBodyStream; ; ; ReturnValue[*]; remote; manual | +| 46 | Source: Azure::Core::Http; RawResponse; true; GetBody; ; ; ReturnValue[*]; remote; manual | +| 47 | Source: Azure::Core::Http; RawResponse; true; GetHeaders; ; ; ReturnValue[*]; remote; manual | +| 48 | Source: Azure::Core::Http; Request; true; GetBodyStream; ; ; ReturnValue[*]; remote; manual | +| 49 | Source: Azure::Core::Http; Request; true; GetHeader; ; ; ReturnValue; remote; manual | +| 50 | Source: Azure::Core::Http; Request; true; GetHeaders; ; ; ReturnValue; remote; manual | +| 51 | Source: boost::asio; ; false; read_until; ; ; Argument[*1]; remote; manual | +| 52 | Summary: ; ; false; CLSIDFromProgID; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 53 | Summary: ; ; false; CLSIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 54 | Summary: ; ; false; CommandLineToArgvA; ; ; Argument[*0]; ReturnValue[**]; taint; manual | +| 55 | Summary: ; ; false; CreateRemoteThread; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | +| 56 | Summary: ; ; false; CreateRemoteThreadEx; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | +| 57 | Summary: ; ; false; CreateThread; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | +| 58 | Summary: ; ; false; GUIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 59 | Summary: ; ; false; IIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 60 | Summary: ; ; false; ProgIDFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | +| 61 | Summary: ; ; false; ReadFileEx; ; ; Argument[*3].Field[@hEvent]; Argument[4].Parameter[*2].Field[@hEvent]; value; manual | +| 62 | Summary: ; ; false; RtlCopyDeviceMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 63 | Summary: ; ; false; RtlCopyMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 64 | Summary: ; ; false; RtlCopyMemoryNonTemporal; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 65 | Summary: ; ; false; RtlCopyUnicodeString; ; ; Argument[*1].Field[*Buffer]; Argument[*0].Field[*Buffer]; value; manual | +| 66 | Summary: ; ; false; RtlCopyVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 67 | Summary: ; ; false; RtlInitUnicodeString; ; ; Argument[*1]; Argument[*0].Field[*Buffer]; value; manual | +| 68 | Summary: ; ; false; RtlMoveMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 69 | Summary: ; ; false; RtlMoveVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 70 | Summary: ; ; false; StringFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | +| 71 | Summary: ; ; false; StringFromGUID2; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 72 | Summary: ; ; false; StringFromIID; ; ; Argument[*0]; Argument[**1]; taint; manual | +| 73 | Summary: ; ; false; WinHttpCrackUrl; ; ; Argument[*0]; Argument[*3]; taint; manual | +| 74 | Summary: ; ; false; callWithArgument; ; ; Argument[1]; Argument[0].Parameter[0]; value; manual | +| 75 | Summary: ; ; false; callWithNonTypeTemplate; (const T &); ; Argument[*0]; ReturnValue; value; manual | +| 76 | Summary: ; ; false; pthread_create; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | +| 77 | Summary: ; ; false; read_field_from_struct; ; ; Argument[*0].Field[MyNamespace::MyStructInNamespace::myField]; ReturnValue; value; manual | +| 78 | Summary: ; ; false; read_field_from_struct_2; ; ; Argument[*0].Field[MyGlobalStruct::myField]; ReturnValue; value; manual | +| 79 | Summary: ; ; false; ymlStepGenerated; ; ; Argument[0]; ReturnValue; taint; df-generated | +| 80 | Summary: ; ; false; ymlStepManual; ; ; Argument[0]; ReturnValue; taint; manual | +| 81 | Summary: ; ; false; ymlStepManual_with_body; ; ; Argument[0]; ReturnValue; taint; manual | +| 82 | Summary: ; MyString; true; operator[]; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 83 | Summary: ; MyString; true; operator[]; ; ; ReturnValue[*]; Argument[-1]; taint; manual | +| 84 | Summary: ; ReverseFlow; true; get_ptr; ; ; ReturnValue[*]; Argument[-1].Field[ReverseFlow::value]; value; manual | +| 85 | Summary: ; TemplateClass1; true; templateFunction2; (U,V); ; Argument[1]; ReturnValue; value; manual | +| 86 | Summary: ; TemplateClass1; false; templateFunction; (T,U); ; Argument[0]; ReturnValue; value; manual | +| 87 | Summary: ; TemplateClass2; true; function; (U,T); ; Argument[1]; ReturnValue; value; manual | +| 88 | Summary: Azure::Core::IO; BodyStream; true; Read; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 89 | Summary: Azure::Core::IO; BodyStream; true; ReadToCount; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 90 | Summary: Azure::Core::IO; BodyStream; true; ReadToEnd; ; ; Argument[-1]; ReturnValue.Element; taint; manual | +| 91 | Summary: Azure; Nullable; true; Value; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 92 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | edges -| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:91:7:91:17 | recv_buffer | provenance | Src:MaD:46 | -| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:93:29:93:39 | recv_buffer | provenance | Src:MaD:46 Sink:MaD:2 | +| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:91:7:91:17 | recv_buffer | provenance | Src:MaD:51 | +| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:93:29:93:39 | recv_buffer | provenance | Src:MaD:51 Sink:MaD:4 | | asio_streams.cpp:97:37:97:44 | call to source | asio_streams.cpp:98:7:98:14 | send_str | provenance | TaintFunction | | asio_streams.cpp:97:37:97:44 | call to source | asio_streams.cpp:100:64:100:71 | *send_str | provenance | TaintFunction | | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | | | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:101:7:101:17 | send_buffer | provenance | | -| asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:103:29:103:39 | send_buffer | provenance | Sink:MaD:2 | -| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:87 | +| asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:103:29:103:39 | send_buffer | provenance | Sink:MaD:4 | +| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:92 | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:257:5:257:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:262:5:262:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:266:38:266:41 | *resp | provenance | | -| azure.cpp:253:48:253:60 | call to GetBodyStream | azure.cpp:253:48:253:60 | *call to GetBodyStream | provenance | Src:MaD:43 | -| azure.cpp:257:5:257:8 | *resp | azure.cpp:257:16:257:21 | Read output argument | provenance | MaD:83 | +| azure.cpp:253:48:253:60 | call to GetBodyStream | azure.cpp:253:48:253:60 | *call to GetBodyStream | provenance | Src:MaD:48 | +| azure.cpp:257:5:257:8 | *resp | azure.cpp:257:16:257:21 | Read output argument | provenance | MaD:88 | | azure.cpp:257:16:257:21 | Read output argument | azure.cpp:258:10:258:16 | * ... | provenance | | -| azure.cpp:262:5:262:8 | *resp | azure.cpp:262:23:262:28 | ReadToCount output argument | provenance | MaD:84 | +| azure.cpp:262:5:262:8 | *resp | azure.cpp:262:23:262:28 | ReadToCount output argument | provenance | MaD:89 | | azure.cpp:262:23:262:28 | ReadToCount output argument | azure.cpp:263:10:263:16 | * ... | provenance | | -| azure.cpp:266:38:266:41 | *resp | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | provenance | MaD:85 | +| azure.cpp:266:38:266:41 | *resp | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | provenance | MaD:90 | | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | provenance | | | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | azure.cpp:267:10:267:12 | vec [element] | provenance | | | azure.cpp:267:10:267:12 | vec [element] | azure.cpp:267:10:267:12 | vec | provenance | | -| azure.cpp:273:52:273:61 | call to GetHeaders | azure.cpp:273:62:273:64 | call to GetHeaders | provenance | Src:MaD:42 | +| azure.cpp:273:52:273:61 | call to GetHeaders | azure.cpp:273:62:273:64 | call to GetHeaders | provenance | Src:MaD:47 | | azure.cpp:273:62:273:64 | call to GetHeaders | azure.cpp:274:14:274:29 | call to operator[] | provenance | TaintFunction | | azure.cpp:273:62:273:64 | call to GetHeaders | azure.cpp:274:14:274:29 | call to operator[] | provenance | TaintFunction | | azure.cpp:273:62:273:64 | call to GetHeaders | azure.cpp:274:14:274:29 | call to operator[] | provenance | TaintFunction | | azure.cpp:274:14:274:29 | call to operator[] | azure.cpp:274:10:274:29 | call to operator[] | provenance | | | azure.cpp:274:14:274:29 | call to operator[] | azure.cpp:274:14:274:29 | call to operator[] | provenance | | -| azure.cpp:277:38:277:44 | call to GetBody | azure.cpp:277:45:277:47 | call to GetBody | provenance | Src:MaD:41 | +| azure.cpp:277:38:277:44 | call to GetBody | azure.cpp:277:45:277:47 | call to GetBody | provenance | Src:MaD:46 | | azure.cpp:277:45:277:47 | call to GetBody | azure.cpp:278:10:278:13 | body | provenance | | | azure.cpp:277:45:277:47 | call to GetBody | azure.cpp:278:10:278:13 | body | provenance | | | azure.cpp:278:10:278:13 | body | azure.cpp:278:10:278:13 | body | provenance | | | azure.cpp:281:68:281:84 | *call to ExtractBodyStream | azure.cpp:282:21:282:23 | *call to get | provenance | | -| azure.cpp:281:68:281:84 | call to ExtractBodyStream | azure.cpp:281:68:281:84 | *call to ExtractBodyStream | provenance | Src:MaD:40 | -| azure.cpp:282:21:282:23 | *call to get | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | MaD:85 | +| azure.cpp:281:68:281:84 | call to ExtractBodyStream | azure.cpp:281:68:281:84 | *call to ExtractBodyStream | provenance | Src:MaD:45 | +| azure.cpp:282:21:282:23 | *call to get | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | MaD:90 | | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | azure.cpp:282:10:282:38 | call to ReadToEnd | provenance | | | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | | -| azure.cpp:289:24:289:56 | call to GetHeader | azure.cpp:289:63:289:65 | call to Value | provenance | MaD:86 | +| azure.cpp:289:24:289:56 | call to GetHeader | azure.cpp:289:63:289:65 | call to Value | provenance | MaD:91 | | azure.cpp:289:32:289:40 | call to GetHeader | azure.cpp:289:24:289:56 | call to GetHeader | provenance | | -| azure.cpp:289:32:289:40 | call to GetHeader | azure.cpp:289:32:289:40 | call to GetHeader | provenance | Src:MaD:44 | +| azure.cpp:289:32:289:40 | call to GetHeader | azure.cpp:289:32:289:40 | call to GetHeader | provenance | Src:MaD:49 | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:289:63:289:65 | call to Value | provenance | | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:290:10:290:20 | headerValue | provenance | | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:290:10:290:20 | headerValue | provenance | | | azure.cpp:290:10:290:20 | headerValue | azure.cpp:290:10:290:20 | headerValue | provenance | | -| azure.cpp:293:58:293:67 | call to GetHeaders | azure.cpp:293:58:293:67 | call to GetHeaders | provenance | Src:MaD:45 | +| azure.cpp:293:58:293:67 | call to GetHeaders | azure.cpp:293:58:293:67 | call to GetHeaders | provenance | Src:MaD:50 | | azure.cpp:293:58:293:67 | call to GetHeaders | azure.cpp:294:38:294:53 | call to operator[] | provenance | TaintFunction | | azure.cpp:294:38:294:53 | call to operator[] | azure.cpp:295:10:295:20 | contentType | provenance | | | azure.cpp:294:38:294:53 | call to operator[] | azure.cpp:295:10:295:20 | contentType | provenance | | | azure.cpp:295:10:295:20 | contentType | azure.cpp:295:10:295:20 | contentType | provenance | | | test.cpp:7:47:7:52 | value2 | test.cpp:7:64:7:69 | value2 | provenance | | | test.cpp:7:64:7:69 | value2 | test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | provenance | | -| test.cpp:10:10:10:18 | call to ymlSource | test.cpp:10:10:10:18 | call to ymlSource | provenance | Src:MaD:38 | -| test.cpp:10:10:10:18 | call to ymlSource | test.cpp:14:10:14:10 | x | provenance | Sink:MaD:1 | +| test.cpp:10:10:10:18 | call to ymlSource | test.cpp:10:10:10:18 | call to ymlSource | provenance | Src:MaD:43 | +| test.cpp:10:10:10:18 | call to ymlSource | test.cpp:14:10:14:10 | x | provenance | Sink:MaD:3 | | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:17:24:17:24 | x | provenance | | | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:21:27:21:27 | x | provenance | | | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:25:35:25:35 | x | provenance | | | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:32:41:32:41 | x | provenance | | | test.cpp:17:10:17:22 | call to ymlStepManual | test.cpp:17:10:17:22 | call to ymlStepManual | provenance | | -| test.cpp:17:10:17:22 | call to ymlStepManual | test.cpp:18:10:18:10 | y | provenance | Sink:MaD:1 | -| test.cpp:17:24:17:24 | x | test.cpp:17:10:17:22 | call to ymlStepManual | provenance | MaD:75 | +| test.cpp:17:10:17:22 | call to ymlStepManual | test.cpp:18:10:18:10 | y | provenance | Sink:MaD:3 | +| test.cpp:17:24:17:24 | x | test.cpp:17:10:17:22 | call to ymlStepManual | provenance | MaD:80 | | test.cpp:21:10:21:25 | call to ymlStepGenerated | test.cpp:21:10:21:25 | call to ymlStepGenerated | provenance | | -| test.cpp:21:10:21:25 | call to ymlStepGenerated | test.cpp:22:10:22:10 | z | provenance | Sink:MaD:1 | -| test.cpp:21:27:21:27 | x | test.cpp:21:10:21:25 | call to ymlStepGenerated | provenance | MaD:74 | +| test.cpp:21:10:21:25 | call to ymlStepGenerated | test.cpp:22:10:22:10 | z | provenance | Sink:MaD:3 | +| test.cpp:21:27:21:27 | x | test.cpp:21:10:21:25 | call to ymlStepGenerated | provenance | MaD:79 | | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | provenance | | -| test.cpp:25:11:25:33 | call to ymlStepManual_with_body | test.cpp:26:10:26:11 | y2 | provenance | Sink:MaD:1 | -| test.cpp:25:35:25:35 | x | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | provenance | MaD:76 | +| test.cpp:25:11:25:33 | call to ymlStepManual_with_body | test.cpp:26:10:26:11 | y2 | provenance | Sink:MaD:3 | +| test.cpp:25:35:25:35 | x | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | provenance | MaD:81 | | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | provenance | | -| test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | test.cpp:33:10:33:11 | z2 | provenance | Sink:MaD:1 | +| test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | test.cpp:33:10:33:11 | z2 | provenance | Sink:MaD:3 | | test.cpp:32:41:32:41 | x | test.cpp:7:47:7:52 | value2 | provenance | | | test.cpp:32:41:32:41 | x | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | provenance | | | test.cpp:46:30:46:32 | *arg [x] | test.cpp:47:12:47:19 | *arg [x] | provenance | | | test.cpp:47:12:47:19 | *arg [x] | test.cpp:48:13:48:13 | *s [x] | provenance | | | test.cpp:48:13:48:13 | *s [x] | test.cpp:48:16:48:16 | x | provenance | | -| test.cpp:48:16:48:16 | x | test.cpp:48:16:48:16 | x | provenance | Sink:MaD:1 | +| test.cpp:48:16:48:16 | x | test.cpp:48:16:48:16 | x | provenance | Sink:MaD:3 | | test.cpp:56:2:56:2 | *s [post update] [x] | test.cpp:59:55:59:64 | *& ... [x] | provenance | | | test.cpp:56:2:56:18 | ... = ... | test.cpp:56:2:56:2 | *s [post update] [x] | provenance | | -| test.cpp:56:8:56:16 | call to ymlSource | test.cpp:56:2:56:18 | ... = ... | provenance | Src:MaD:38 | -| test.cpp:59:55:59:64 | *& ... [x] | test.cpp:46:30:46:32 | *arg [x] | provenance | MaD:71 | -| test.cpp:68:22:68:22 | y | test.cpp:69:11:69:11 | y | provenance | Sink:MaD:1 | -| test.cpp:74:22:74:22 | y | test.cpp:75:11:75:11 | y | provenance | Sink:MaD:1 | -| test.cpp:82:22:82:22 | y | test.cpp:83:11:83:11 | y | provenance | Sink:MaD:1 | -| test.cpp:88:22:88:22 | y | test.cpp:89:11:89:11 | y | provenance | Sink:MaD:1 | -| test.cpp:94:10:94:18 | call to ymlSource | test.cpp:94:10:94:18 | call to ymlSource | provenance | Src:MaD:38 | +| test.cpp:56:8:56:16 | call to ymlSource | test.cpp:56:2:56:18 | ... = ... | provenance | Src:MaD:43 | +| test.cpp:59:55:59:64 | *& ... [x] | test.cpp:46:30:46:32 | *arg [x] | provenance | MaD:76 | +| test.cpp:68:22:68:22 | y | test.cpp:69:11:69:11 | y | provenance | Sink:MaD:3 | +| test.cpp:74:22:74:22 | y | test.cpp:75:11:75:11 | y | provenance | Sink:MaD:3 | +| test.cpp:82:22:82:22 | y | test.cpp:83:11:83:11 | y | provenance | Sink:MaD:3 | +| test.cpp:88:22:88:22 | y | test.cpp:89:11:89:11 | y | provenance | Sink:MaD:3 | +| test.cpp:94:10:94:18 | call to ymlSource | test.cpp:94:10:94:18 | call to ymlSource | provenance | Src:MaD:43 | | test.cpp:94:10:94:18 | call to ymlSource | test.cpp:97:26:97:26 | x | provenance | | | test.cpp:94:10:94:18 | call to ymlSource | test.cpp:101:26:101:26 | x | provenance | | | test.cpp:94:10:94:18 | call to ymlSource | test.cpp:103:63:103:63 | x | provenance | | | test.cpp:94:10:94:18 | call to ymlSource | test.cpp:104:62:104:62 | x | provenance | | -| test.cpp:97:26:97:26 | x | test.cpp:68:22:68:22 | y | provenance | MaD:69 | -| test.cpp:101:26:101:26 | x | test.cpp:74:22:74:22 | y | provenance | MaD:69 | -| test.cpp:103:63:103:63 | x | test.cpp:82:22:82:22 | y | provenance | MaD:69 | -| test.cpp:104:62:104:62 | x | test.cpp:88:22:88:22 | y | provenance | MaD:69 | -| test.cpp:114:10:114:18 | call to ymlSource | test.cpp:114:10:114:18 | call to ymlSource | provenance | Src:MaD:38 | +| test.cpp:97:26:97:26 | x | test.cpp:68:22:68:22 | y | provenance | MaD:74 | +| test.cpp:101:26:101:26 | x | test.cpp:74:22:74:22 | y | provenance | MaD:74 | +| test.cpp:103:63:103:63 | x | test.cpp:82:22:82:22 | y | provenance | MaD:74 | +| test.cpp:104:62:104:62 | x | test.cpp:88:22:88:22 | y | provenance | MaD:74 | +| test.cpp:114:10:114:18 | call to ymlSource | test.cpp:114:10:114:18 | call to ymlSource | provenance | Src:MaD:43 | | test.cpp:114:10:114:18 | call to ymlSource | test.cpp:118:44:118:44 | *x | provenance | | | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | provenance | | -| test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | test.cpp:119:10:119:11 | y2 | provenance | Sink:MaD:1 | -| test.cpp:118:44:118:44 | *x | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | provenance | MaD:70 | -| test.cpp:133:10:133:18 | call to ymlSource | test.cpp:133:10:133:18 | call to ymlSource | provenance | Src:MaD:38 | +| test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | test.cpp:119:10:119:11 | y2 | provenance | Sink:MaD:3 | +| test.cpp:118:44:118:44 | *x | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | provenance | MaD:75 | +| test.cpp:133:10:133:18 | call to ymlSource | test.cpp:133:10:133:18 | call to ymlSource | provenance | Src:MaD:43 | | test.cpp:133:10:133:18 | call to ymlSource | test.cpp:134:45:134:45 | x | provenance | | | test.cpp:134:13:134:43 | call to templateFunction | test.cpp:134:13:134:43 | call to templateFunction | provenance | | -| test.cpp:134:13:134:43 | call to templateFunction | test.cpp:135:10:135:10 | y | provenance | Sink:MaD:1 | -| test.cpp:134:45:134:45 | x | test.cpp:134:13:134:43 | call to templateFunction | provenance | MaD:81 | -| test.cpp:146:10:146:18 | call to ymlSource | test.cpp:146:10:146:18 | call to ymlSource | provenance | Src:MaD:38 | +| test.cpp:134:13:134:43 | call to templateFunction | test.cpp:135:10:135:10 | y | provenance | Sink:MaD:3 | +| test.cpp:134:45:134:45 | x | test.cpp:134:13:134:43 | call to templateFunction | provenance | MaD:86 | +| test.cpp:146:10:146:18 | call to ymlSource | test.cpp:146:10:146:18 | call to ymlSource | provenance | Src:MaD:43 | | test.cpp:146:10:146:18 | call to ymlSource | test.cpp:148:26:148:26 | x | provenance | | | test.cpp:148:10:148:27 | call to function | test.cpp:148:10:148:27 | call to function | provenance | | -| test.cpp:148:10:148:27 | call to function | test.cpp:149:10:149:10 | z | provenance | Sink:MaD:1 | -| test.cpp:148:26:148:26 | x | test.cpp:148:10:148:27 | call to function | provenance | MaD:82 | -| test.cpp:155:10:155:18 | call to ymlSource | test.cpp:155:10:155:18 | call to ymlSource | provenance | Src:MaD:38 | +| test.cpp:148:10:148:27 | call to function | test.cpp:149:10:149:10 | z | provenance | Sink:MaD:3 | +| test.cpp:148:26:148:26 | x | test.cpp:148:10:148:27 | call to function | provenance | MaD:87 | +| test.cpp:155:10:155:18 | call to ymlSource | test.cpp:155:10:155:18 | call to ymlSource | provenance | Src:MaD:43 | | test.cpp:155:10:155:18 | call to ymlSource | test.cpp:157:26:157:26 | x | provenance | | | test.cpp:157:13:157:20 | call to function | test.cpp:157:13:157:20 | call to function | provenance | | -| test.cpp:157:13:157:20 | call to function | test.cpp:158:10:158:10 | z | provenance | Sink:MaD:1 | -| test.cpp:157:26:157:26 | x | test.cpp:157:13:157:20 | call to function | provenance | MaD:82 | +| test.cpp:157:13:157:20 | call to function | test.cpp:158:10:158:10 | z | provenance | Sink:MaD:3 | +| test.cpp:157:26:157:26 | x | test.cpp:157:13:157:20 | call to function | provenance | MaD:87 | | test.cpp:164:34:164:34 | x | test.cpp:165:69:165:69 | x | provenance | | | test.cpp:165:12:165:64 | call to templateFunction2 | test.cpp:164:7:164:7 | *templateFunction3 | provenance | | | test.cpp:165:12:165:64 | call to templateFunction2 | test.cpp:165:12:165:64 | call to templateFunction2 | provenance | | -| test.cpp:165:69:165:69 | x | test.cpp:165:12:165:64 | call to templateFunction2 | provenance | MaD:80 | -| test.cpp:170:10:170:18 | call to ymlSource | test.cpp:170:10:170:18 | call to ymlSource | provenance | Src:MaD:38 | +| test.cpp:165:69:165:69 | x | test.cpp:165:12:165:64 | call to templateFunction2 | provenance | MaD:85 | +| test.cpp:170:10:170:18 | call to ymlSource | test.cpp:170:10:170:18 | call to ymlSource | provenance | Src:MaD:43 | | test.cpp:170:10:170:18 | call to ymlSource | test.cpp:172:51:172:51 | x | provenance | | | test.cpp:172:13:172:44 | call to templateFunction3 | test.cpp:172:13:172:44 | call to templateFunction3 | provenance | | -| test.cpp:172:13:172:44 | call to templateFunction3 | test.cpp:173:10:173:10 | y | provenance | Sink:MaD:1 | +| test.cpp:172:13:172:44 | call to templateFunction3 | test.cpp:173:10:173:10 | y | provenance | Sink:MaD:3 | | test.cpp:172:51:172:51 | x | test.cpp:164:34:164:34 | x | provenance | | -| test.cpp:172:51:172:51 | x | test.cpp:172:13:172:44 | call to templateFunction3 | provenance | MaD:80 | +| test.cpp:172:51:172:51 | x | test.cpp:172:13:172:44 | call to templateFunction3 | provenance | MaD:85 | | test.cpp:186:2:186:2 | *s [post update] [myField] | test.cpp:187:33:187:34 | *& ... [myField] | provenance | | | test.cpp:186:2:186:24 | ... = ... | test.cpp:186:2:186:2 | *s [post update] [myField] | provenance | | -| test.cpp:186:14:186:22 | call to ymlSource | test.cpp:186:2:186:24 | ... = ... | provenance | Src:MaD:38 | +| test.cpp:186:14:186:22 | call to ymlSource | test.cpp:186:2:186:24 | ... = ... | provenance | Src:MaD:43 | | test.cpp:187:10:187:31 | call to read_field_from_struct | test.cpp:187:10:187:31 | call to read_field_from_struct | provenance | | -| test.cpp:187:10:187:31 | call to read_field_from_struct | test.cpp:188:10:188:10 | x | provenance | Sink:MaD:1 | -| test.cpp:187:33:187:34 | *& ... [myField] | test.cpp:187:10:187:31 | call to read_field_from_struct | provenance | MaD:72 | +| test.cpp:187:10:187:31 | call to read_field_from_struct | test.cpp:188:10:188:10 | x | provenance | Sink:MaD:3 | +| test.cpp:187:33:187:34 | *& ... [myField] | test.cpp:187:10:187:31 | call to read_field_from_struct | provenance | MaD:77 | | test.cpp:199:2:199:2 | *s [post update] [myField] | test.cpp:200:35:200:36 | *& ... [myField] | provenance | | | test.cpp:199:2:199:24 | ... = ... | test.cpp:199:2:199:2 | *s [post update] [myField] | provenance | | -| test.cpp:199:14:199:22 | call to ymlSource | test.cpp:199:2:199:24 | ... = ... | provenance | Src:MaD:38 | +| test.cpp:199:14:199:22 | call to ymlSource | test.cpp:199:2:199:24 | ... = ... | provenance | Src:MaD:43 | | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | provenance | | -| test.cpp:200:10:200:33 | call to read_field_from_struct_2 | test.cpp:201:10:201:10 | x | provenance | Sink:MaD:1 | -| test.cpp:200:35:200:36 | *& ... [myField] | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | provenance | MaD:73 | +| test.cpp:200:10:200:33 | call to read_field_from_struct_2 | test.cpp:201:10:201:10 | x | provenance | Sink:MaD:3 | +| test.cpp:200:35:200:36 | *& ... [myField] | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | provenance | MaD:78 | | test.cpp:216:3:216:4 | get_ptr output argument [value] | test.cpp:217:11:217:12 | *rf [value] | provenance | | -| test.cpp:216:3:216:28 | ... = ... | test.cpp:216:3:216:4 | get_ptr output argument [value] | provenance | MaD:79 | -| test.cpp:216:18:216:26 | call to ymlSource | test.cpp:216:3:216:28 | ... = ... | provenance | Src:MaD:38 | +| test.cpp:216:3:216:28 | ... = ... | test.cpp:216:3:216:4 | get_ptr output argument [value] | provenance | MaD:84 | +| test.cpp:216:18:216:26 | call to ymlSource | test.cpp:216:3:216:28 | ... = ... | provenance | Src:MaD:43 | | test.cpp:217:11:217:12 | *rf [value] | test.cpp:217:14:217:18 | value | provenance | | | test.cpp:217:14:217:18 | value | test.cpp:217:14:217:18 | value | provenance | | -| test.cpp:217:14:217:18 | value | test.cpp:218:11:218:11 | x | provenance | Sink:MaD:1 | +| test.cpp:217:14:217:18 | value | test.cpp:218:11:218:11 | x | provenance | Sink:MaD:3 | | test.cpp:222:3:222:3 | operator[] output argument | test.cpp:223:12:223:12 | *s | provenance | | -| test.cpp:222:3:222:20 | ... = ... | test.cpp:222:3:222:3 | operator[] output argument | provenance | MaD:78 | -| test.cpp:222:10:222:18 | call to ymlSource | test.cpp:222:3:222:20 | ... = ... | provenance | Src:MaD:38 | -| test.cpp:223:12:223:12 | *s | test.cpp:223:13:223:15 | call to operator[] | provenance | MaD:77 | +| test.cpp:222:3:222:20 | ... = ... | test.cpp:222:3:222:3 | operator[] output argument | provenance | MaD:83 | +| test.cpp:222:10:222:18 | call to ymlSource | test.cpp:222:3:222:20 | ... = ... | provenance | Src:MaD:43 | +| test.cpp:223:12:223:12 | *s | test.cpp:223:13:223:15 | call to operator[] | provenance | MaD:82 | | test.cpp:223:13:223:15 | call to operator[] | test.cpp:223:13:223:15 | call to operator[] | provenance | | -| test.cpp:223:13:223:15 | call to operator[] | test.cpp:224:11:224:11 | c | provenance | Sink:MaD:1 | +| test.cpp:223:13:223:15 | call to operator[] | test.cpp:224:11:224:11 | c | provenance | Sink:MaD:3 | | test.cpp:243:10:243:10 | *s [value] | test.cpp:243:13:243:17 | value | provenance | | -| test.cpp:243:13:243:17 | value | test.cpp:243:13:243:17 | value | provenance | Sink:MaD:1 | -| test.cpp:247:26:247:39 | call to ymlFieldSource | test.cpp:247:26:247:39 | call to ymlFieldSource [value] | provenance | Src:MaD:37 | +| test.cpp:243:13:243:17 | value | test.cpp:243:13:243:17 | value | provenance | Sink:MaD:3 | +| test.cpp:247:26:247:39 | call to ymlFieldSource | test.cpp:247:26:247:39 | call to ymlFieldSource [value] | provenance | Src:MaD:42 | | test.cpp:247:26:247:39 | call to ymlFieldSource [value] | test.cpp:248:10:248:16 | *wrapper [value] | provenance | | | test.cpp:248:10:248:16 | *wrapper [value] | test.cpp:248:18:248:22 | value | provenance | | -| test.cpp:248:18:248:22 | value | test.cpp:248:18:248:22 | value | provenance | Sink:MaD:1 | -| test.cpp:250:32:250:32 | source_from_callback_template output argument | test.cpp:250:32:250:32 | source_from_callback_template output argument [value] | provenance | Src:MaD:36 | +| test.cpp:248:18:248:22 | value | test.cpp:248:18:248:22 | value | provenance | Sink:MaD:3 | +| test.cpp:250:32:250:32 | source_from_callback_template output argument | test.cpp:250:32:250:32 | source_from_callback_template output argument [value] | provenance | Src:MaD:40 | | test.cpp:250:32:250:32 | source_from_callback_template output argument [value] | test.cpp:243:10:243:10 | *s [value] | provenance | | -| test.cpp:251:27:251:27 | source_from_callback_ptr output argument | test.cpp:251:27:251:27 | source_from_callback_ptr output argument [value] | provenance | Src:MaD:35 | +| test.cpp:251:27:251:27 | source_from_callback_ptr output argument | test.cpp:251:27:251:27 | source_from_callback_ptr output argument [value] | provenance | Src:MaD:37 | | test.cpp:251:27:251:27 | source_from_callback_ptr output argument [value] | test.cpp:243:10:243:10 | *s [value] | provenance | | -| test.cpp:253:32:255:2 | source_from_callback_template output argument | test.cpp:253:32:255:2 | source_from_callback_template output argument [value] | provenance | Src:MaD:36 | +| test.cpp:253:32:255:2 | source_from_callback_template output argument | test.cpp:253:32:255:2 | source_from_callback_template output argument [value] | provenance | Src:MaD:40 | | test.cpp:253:32:255:2 | source_from_callback_template output argument [value] | test.cpp:254:11:254:11 | *s [value] | provenance | | | test.cpp:254:11:254:11 | *s [value] | test.cpp:254:14:254:18 | value | provenance | | -| test.cpp:254:14:254:18 | value | test.cpp:254:14:254:18 | value | provenance | Sink:MaD:1 | -| test.cpp:257:27:257:27 | source_from_callback_ptr output argument | test.cpp:257:27:257:27 | source_from_callback_ptr output argument [value] | provenance | Src:MaD:35 | +| test.cpp:254:14:254:18 | value | test.cpp:254:14:254:18 | value | provenance | Sink:MaD:3 | +| test.cpp:257:27:257:27 | source_from_callback_ptr output argument | test.cpp:257:27:257:27 | source_from_callback_ptr output argument [value] | provenance | Src:MaD:37 | | test.cpp:257:27:257:27 | source_from_callback_ptr output argument [value] | test.cpp:258:11:258:11 | *s [value] | provenance | | | test.cpp:258:11:258:11 | *s [value] | test.cpp:258:14:258:18 | value | provenance | | -| test.cpp:258:14:258:18 | value | test.cpp:258:14:258:18 | value | provenance | Sink:MaD:1 | +| test.cpp:258:14:258:18 | value | test.cpp:258:14:258:18 | value | provenance | Sink:MaD:3 | | test.cpp:263:12:263:12 | *s [value] | test.cpp:263:15:263:19 | value | provenance | | -| test.cpp:263:15:263:19 | value | test.cpp:263:15:263:19 | value | provenance | Sink:MaD:1 | -| test.cpp:267:32:267:34 | source_from_callback_template output argument | test.cpp:267:32:267:34 | source_from_callback_template output argument [value] | provenance | Src:MaD:36 | +| test.cpp:263:15:263:19 | value | test.cpp:263:15:263:19 | value | provenance | Sink:MaD:3 | +| test.cpp:267:32:267:34 | source_from_callback_template output argument | test.cpp:267:32:267:34 | source_from_callback_template output argument [value] | provenance | Src:MaD:40 | | test.cpp:267:32:267:34 | source_from_callback_template output argument [value] | test.cpp:263:12:263:12 | *s [value] | provenance | | -| test.cpp:293:11:293:22 | call to ymlSourcePtr | test.cpp:293:10:293:24 | * ... | provenance | Src:MaD:39 Sink:MaD:1 | +| test.cpp:282:5:282:26 | *callback_returning_int | test.cpp:296:10:296:31 | call to callback_returning_int | provenance | | +| test.cpp:283:5:283:28 | *callback_returning_int_2 | test.cpp:299:10:299:33 | call to callback_returning_int_2 | provenance | | +| test.cpp:284:6:284:31 | **callback_returning_ptr_int | test.cpp:302:13:302:38 | *call to callback_returning_ptr_int | provenance | | +| test.cpp:286:33:286:41 | call to ymlSource | test.cpp:286:33:286:41 | call to ymlSource | provenance | Src:MaD:43 | +| test.cpp:286:33:286:41 | call to ymlSource | test.cpp:307:37:307:52 | return_ymlSource | provenance | Sink:MaD:1 | +| test.cpp:286:33:286:41 | call to ymlSource | test.cpp:307:37:307:52 | return_ymlSource | provenance | Src:MaD:43 Sink:MaD:1 | +| test.cpp:288:41:288:52 | *call to ymlSourcePtr | test.cpp:310:36:310:58 | return_ptr_to_ymlSource | provenance | Sink:MaD:2 | +| test.cpp:288:41:288:52 | call to ymlSourcePtr | test.cpp:288:41:288:52 | *call to ymlSourcePtr | provenance | Src:MaD:44 | +| test.cpp:288:41:288:52 | call to ymlSourcePtr | test.cpp:310:36:310:58 | return_ptr_to_ymlSource | provenance | Src:MaD:44 Sink:MaD:2 | +| test.cpp:293:11:293:22 | call to ymlSourcePtr | test.cpp:293:10:293:24 | * ... | provenance | Src:MaD:44 Sink:MaD:3 | +| test.cpp:295:39:295:60 | source_from_callback_return_template output argument | test.cpp:282:5:282:26 | *callback_returning_int | provenance | Src:MaD:39 | +| test.cpp:296:10:296:31 | call to callback_returning_int | test.cpp:296:10:296:31 | call to callback_returning_int | provenance | Sink:MaD:3 | +| test.cpp:298:34:298:57 | source_from_callback_return_ptr output argument | test.cpp:283:5:283:28 | *callback_returning_int_2 | provenance | Src:MaD:38 | +| test.cpp:299:10:299:33 | call to callback_returning_int_2 | test.cpp:299:10:299:33 | call to callback_returning_int_2 | provenance | Sink:MaD:3 | +| test.cpp:301:38:301:63 | source_ptr_from_callback_return_ptr output argument | test.cpp:284:6:284:31 | **callback_returning_ptr_int | provenance | Src:MaD:41 | +| test.cpp:302:13:302:38 | *call to callback_returning_ptr_int | test.cpp:302:13:302:38 | *call to callback_returning_ptr_int | provenance | | +| test.cpp:302:13:302:38 | *call to callback_returning_ptr_int | test.cpp:304:10:304:13 | * ... | provenance | Sink:MaD:3 | +| test.cpp:306:51:306:59 | call to ymlSource | test.cpp:306:37:306:64 | [...](...){...} | provenance | Sink:MaD:1 | +| test.cpp:306:51:306:59 | call to ymlSource | test.cpp:306:37:306:64 | [...](...){...} | provenance | Src:MaD:43 Sink:MaD:1 | +| test.cpp:306:51:306:59 | call to ymlSource | test.cpp:306:51:306:59 | call to ymlSource | provenance | Src:MaD:43 | +| test.cpp:309:50:309:61 | *call to ymlSourcePtr | test.cpp:309:36:309:36 | call to operator int *(*)() | provenance | Sink:MaD:2 | +| test.cpp:309:50:309:61 | call to ymlSourcePtr | test.cpp:309:36:309:36 | call to operator int *(*)() | provenance | Src:MaD:44 Sink:MaD:2 | +| test.cpp:309:50:309:61 | call to ymlSourcePtr | test.cpp:309:50:309:61 | *call to ymlSourcePtr | provenance | Src:MaD:44 | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:24:8:24:11 | * ... | provenance | | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:27:36:27:38 | *cmd | provenance | | -| windows.cpp:22:15:22:29 | call to GetCommandLineA | windows.cpp:22:15:22:29 | *call to GetCommandLineA | provenance | Src:MaD:3 | +| windows.cpp:22:15:22:29 | call to GetCommandLineA | windows.cpp:22:15:22:29 | *call to GetCommandLineA | provenance | Src:MaD:5 | | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | provenance | | | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | windows.cpp:30:8:30:15 | * ... | provenance | | -| windows.cpp:27:36:27:38 | *cmd | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | provenance | MaD:49 | +| windows.cpp:27:36:27:38 | *cmd | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | provenance | MaD:54 | | windows.cpp:34:17:34:38 | *call to GetEnvironmentStringsA | windows.cpp:36:10:36:13 | * ... | provenance | | -| windows.cpp:34:17:34:38 | call to GetEnvironmentStringsA | windows.cpp:34:17:34:38 | *call to GetEnvironmentStringsA | provenance | Src:MaD:4 | -| windows.cpp:39:36:39:38 | GetEnvironmentVariableA output argument | windows.cpp:41:10:41:13 | * ... | provenance | Src:MaD:5 | +| windows.cpp:34:17:34:38 | call to GetEnvironmentStringsA | windows.cpp:34:17:34:38 | *call to GetEnvironmentStringsA | provenance | Src:MaD:6 | +| windows.cpp:39:36:39:38 | GetEnvironmentVariableA output argument | windows.cpp:41:10:41:13 | * ... | provenance | Src:MaD:7 | | windows.cpp:147:16:147:27 | *lpOverlapped [*hEvent] | windows.cpp:149:42:149:53 | *lpOverlapped [*hEvent] | provenance | | | windows.cpp:149:18:149:62 | *hEvent | windows.cpp:149:18:149:62 | *hEvent | provenance | | | windows.cpp:149:18:149:62 | *hEvent | windows.cpp:151:8:151:14 | * ... | provenance | | @@ -273,37 +300,37 @@ edges | windows.cpp:159:12:159:55 | hEvent | windows.cpp:160:8:160:8 | c | provenance | | | windows.cpp:159:35:159:46 | *lpOverlapped [hEvent] | windows.cpp:159:12:159:55 | hEvent | provenance | | | windows.cpp:159:35:159:46 | *lpOverlapped [hEvent] | windows.cpp:159:12:159:55 | hEvent | provenance | | -| windows.cpp:168:35:168:40 | ReadFile output argument | windows.cpp:170:10:170:16 | * ... | provenance | Src:MaD:17 | -| windows.cpp:177:23:177:28 | ReadFileEx output argument | windows.cpp:179:10:179:16 | * ... | provenance | Src:MaD:18 | -| windows.cpp:189:21:189:26 | ReadFile output argument | windows.cpp:190:5:190:56 | *... = ... | provenance | Src:MaD:17 | +| windows.cpp:168:35:168:40 | ReadFile output argument | windows.cpp:170:10:170:16 | * ... | provenance | Src:MaD:19 | +| windows.cpp:177:23:177:28 | ReadFileEx output argument | windows.cpp:179:10:179:16 | * ... | provenance | Src:MaD:20 | +| windows.cpp:189:21:189:26 | ReadFile output argument | windows.cpp:190:5:190:56 | *... = ... | provenance | Src:MaD:19 | | windows.cpp:190:5:190:14 | *overlapped [post update] [*hEvent] | windows.cpp:192:53:192:63 | *& ... [*hEvent] | provenance | | | windows.cpp:190:5:190:56 | *... = ... | windows.cpp:190:5:190:14 | *overlapped [post update] [*hEvent] | provenance | | -| windows.cpp:192:53:192:63 | *& ... [*hEvent] | windows.cpp:147:16:147:27 | *lpOverlapped [*hEvent] | provenance | MaD:56 | -| windows.cpp:198:21:198:26 | ReadFile output argument | windows.cpp:199:5:199:57 | ... = ... | provenance | Src:MaD:17 | +| windows.cpp:192:53:192:63 | *& ... [*hEvent] | windows.cpp:147:16:147:27 | *lpOverlapped [*hEvent] | provenance | MaD:61 | +| windows.cpp:198:21:198:26 | ReadFile output argument | windows.cpp:199:5:199:57 | ... = ... | provenance | Src:MaD:19 | | windows.cpp:199:5:199:14 | *overlapped [post update] [hEvent] | windows.cpp:201:53:201:63 | *& ... [hEvent] | provenance | | | windows.cpp:199:5:199:57 | ... = ... | windows.cpp:199:5:199:14 | *overlapped [post update] [hEvent] | provenance | | -| windows.cpp:201:53:201:63 | *& ... [hEvent] | windows.cpp:157:16:157:27 | *lpOverlapped [hEvent] | provenance | MaD:56 | -| windows.cpp:209:84:209:89 | NtReadFile output argument | windows.cpp:211:10:211:16 | * ... | provenance | Src:MaD:16 | +| windows.cpp:201:53:201:63 | *& ... [hEvent] | windows.cpp:157:16:157:27 | *lpOverlapped [hEvent] | provenance | MaD:61 | +| windows.cpp:209:84:209:89 | NtReadFile output argument | windows.cpp:211:10:211:16 | * ... | provenance | Src:MaD:18 | | windows.cpp:286:23:286:35 | *call to MapViewOfFile | windows.cpp:287:20:287:52 | *pMapView | provenance | | -| windows.cpp:286:23:286:35 | call to MapViewOfFile | windows.cpp:286:23:286:35 | *call to MapViewOfFile | provenance | Src:MaD:12 | +| windows.cpp:286:23:286:35 | call to MapViewOfFile | windows.cpp:286:23:286:35 | *call to MapViewOfFile | provenance | Src:MaD:14 | | windows.cpp:287:20:287:52 | *pMapView | windows.cpp:289:10:289:16 | * ... | provenance | | | windows.cpp:293:23:293:36 | *call to MapViewOfFile2 | windows.cpp:294:20:294:52 | *pMapView | provenance | | -| windows.cpp:293:23:293:36 | call to MapViewOfFile2 | windows.cpp:293:23:293:36 | *call to MapViewOfFile2 | provenance | Src:MaD:9 | +| windows.cpp:293:23:293:36 | call to MapViewOfFile2 | windows.cpp:293:23:293:36 | *call to MapViewOfFile2 | provenance | Src:MaD:11 | | windows.cpp:294:20:294:52 | *pMapView | windows.cpp:296:10:296:16 | * ... | provenance | | | windows.cpp:302:23:302:36 | *call to MapViewOfFile3 | windows.cpp:303:20:303:52 | *pMapView | provenance | | -| windows.cpp:302:23:302:36 | call to MapViewOfFile3 | windows.cpp:302:23:302:36 | *call to MapViewOfFile3 | provenance | Src:MaD:10 | +| windows.cpp:302:23:302:36 | call to MapViewOfFile3 | windows.cpp:302:23:302:36 | *call to MapViewOfFile3 | provenance | Src:MaD:12 | | windows.cpp:303:20:303:52 | *pMapView | windows.cpp:305:10:305:16 | * ... | provenance | | | windows.cpp:311:23:311:43 | *call to MapViewOfFile3FromApp | windows.cpp:312:20:312:52 | *pMapView | provenance | | -| windows.cpp:311:23:311:43 | call to MapViewOfFile3FromApp | windows.cpp:311:23:311:43 | *call to MapViewOfFile3FromApp | provenance | Src:MaD:11 | +| windows.cpp:311:23:311:43 | call to MapViewOfFile3FromApp | windows.cpp:311:23:311:43 | *call to MapViewOfFile3FromApp | provenance | Src:MaD:13 | | windows.cpp:312:20:312:52 | *pMapView | windows.cpp:314:10:314:16 | * ... | provenance | | | windows.cpp:318:23:318:37 | *call to MapViewOfFileEx | windows.cpp:319:20:319:52 | *pMapView | provenance | | -| windows.cpp:318:23:318:37 | call to MapViewOfFileEx | windows.cpp:318:23:318:37 | *call to MapViewOfFileEx | provenance | Src:MaD:13 | +| windows.cpp:318:23:318:37 | call to MapViewOfFileEx | windows.cpp:318:23:318:37 | *call to MapViewOfFileEx | provenance | Src:MaD:15 | | windows.cpp:319:20:319:52 | *pMapView | windows.cpp:321:10:321:16 | * ... | provenance | | | windows.cpp:325:23:325:42 | *call to MapViewOfFileFromApp | windows.cpp:326:20:326:52 | *pMapView | provenance | | -| windows.cpp:325:23:325:42 | call to MapViewOfFileFromApp | windows.cpp:325:23:325:42 | *call to MapViewOfFileFromApp | provenance | Src:MaD:14 | +| windows.cpp:325:23:325:42 | call to MapViewOfFileFromApp | windows.cpp:325:23:325:42 | *call to MapViewOfFileFromApp | provenance | Src:MaD:16 | | windows.cpp:326:20:326:52 | *pMapView | windows.cpp:328:10:328:16 | * ... | provenance | | | windows.cpp:332:23:332:40 | *call to MapViewOfFileNuma2 | windows.cpp:333:20:333:52 | *pMapView | provenance | | -| windows.cpp:332:23:332:40 | call to MapViewOfFileNuma2 | windows.cpp:332:23:332:40 | *call to MapViewOfFileNuma2 | provenance | Src:MaD:15 | +| windows.cpp:332:23:332:40 | call to MapViewOfFileNuma2 | windows.cpp:332:23:332:40 | *call to MapViewOfFileNuma2 | provenance | Src:MaD:17 | | windows.cpp:333:20:333:52 | *pMapView | windows.cpp:335:10:335:16 | * ... | provenance | | | windows.cpp:403:26:403:36 | *lpParameter [x] | windows.cpp:405:10:405:25 | *lpParameter [x] | provenance | | | windows.cpp:405:10:405:25 | *lpParameter [x] | windows.cpp:406:8:406:8 | *s [x] | provenance | | @@ -319,9 +346,9 @@ edges | windows.cpp:431:3:431:3 | *s [post update] [x] | windows.cpp:464:7:464:8 | *& ... [x] | provenance | | | windows.cpp:431:3:431:16 | ... = ... | windows.cpp:431:3:431:3 | *s [post update] [x] | provenance | | | windows.cpp:431:9:431:14 | call to source | windows.cpp:431:3:431:16 | ... = ... | provenance | | -| windows.cpp:439:7:439:8 | *& ... [x] | windows.cpp:403:26:403:36 | *lpParameter [x] | provenance | MaD:52 | -| windows.cpp:451:7:451:8 | *& ... [x] | windows.cpp:410:26:410:36 | *lpParameter [x] | provenance | MaD:50 | -| windows.cpp:464:7:464:8 | *& ... [x] | windows.cpp:417:26:417:36 | *lpParameter [x] | provenance | MaD:51 | +| windows.cpp:439:7:439:8 | *& ... [x] | windows.cpp:403:26:403:36 | *lpParameter [x] | provenance | MaD:57 | +| windows.cpp:451:7:451:8 | *& ... [x] | windows.cpp:410:26:410:36 | *lpParameter [x] | provenance | MaD:55 | +| windows.cpp:464:7:464:8 | *& ... [x] | windows.cpp:417:26:417:36 | *lpParameter [x] | provenance | MaD:56 | | windows.cpp:533:11:533:16 | call to source | windows.cpp:533:11:533:16 | call to source | provenance | | | windows.cpp:533:11:533:16 | call to source | windows.cpp:537:40:537:41 | *& ... | provenance | | | windows.cpp:533:11:533:16 | call to source | windows.cpp:542:38:542:39 | *& ... | provenance | | @@ -330,102 +357,102 @@ edges | windows.cpp:533:11:533:16 | call to source | windows.cpp:568:32:568:33 | *& ... | provenance | | | windows.cpp:533:11:533:16 | call to source | windows.cpp:573:40:573:41 | *& ... | provenance | | | windows.cpp:537:27:537:37 | RtlCopyVolatileMemory output argument | windows.cpp:538:10:538:23 | access to array | provenance | | -| windows.cpp:537:40:537:41 | *& ... | windows.cpp:537:27:537:37 | RtlCopyVolatileMemory output argument | provenance | MaD:61 | +| windows.cpp:537:40:537:41 | *& ... | windows.cpp:537:27:537:37 | RtlCopyVolatileMemory output argument | provenance | MaD:66 | | windows.cpp:542:25:542:35 | RtlCopyDeviceMemory output argument | windows.cpp:543:10:543:23 | access to array | provenance | | -| windows.cpp:542:38:542:39 | *& ... | windows.cpp:542:25:542:35 | RtlCopyDeviceMemory output argument | provenance | MaD:57 | +| windows.cpp:542:38:542:39 | *& ... | windows.cpp:542:25:542:35 | RtlCopyDeviceMemory output argument | provenance | MaD:62 | | windows.cpp:547:19:547:29 | RtlCopyMemory output argument | windows.cpp:548:10:548:23 | access to array | provenance | | -| windows.cpp:547:32:547:33 | *& ... | windows.cpp:547:19:547:29 | RtlCopyMemory output argument | provenance | MaD:58 | +| windows.cpp:547:32:547:33 | *& ... | windows.cpp:547:19:547:29 | RtlCopyMemory output argument | provenance | MaD:63 | | windows.cpp:552:30:552:40 | RtlCopyMemoryNonTemporal output argument | windows.cpp:553:10:553:23 | access to array | provenance | | -| windows.cpp:552:43:552:44 | *& ... | windows.cpp:552:30:552:40 | RtlCopyMemoryNonTemporal output argument | provenance | MaD:59 | +| windows.cpp:552:43:552:44 | *& ... | windows.cpp:552:30:552:40 | RtlCopyMemoryNonTemporal output argument | provenance | MaD:64 | | windows.cpp:559:5:559:24 | ... = ... | windows.cpp:561:39:561:44 | *buffer | provenance | | | windows.cpp:559:17:559:24 | call to source | windows.cpp:559:5:559:24 | ... = ... | provenance | | | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | windows.cpp:562:10:562:19 | *src_string [*Buffer] | provenance | | | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | windows.cpp:563:40:563:50 | *& ... [*Buffer] | provenance | | -| windows.cpp:561:39:561:44 | *buffer | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | provenance | MaD:62 | +| windows.cpp:561:39:561:44 | *buffer | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | provenance | MaD:67 | | windows.cpp:562:10:562:19 | *src_string [*Buffer] | windows.cpp:562:10:562:29 | access to array | provenance | | | windows.cpp:562:10:562:19 | *src_string [*Buffer] | windows.cpp:562:21:562:26 | *Buffer | provenance | | | windows.cpp:562:21:562:26 | *Buffer | windows.cpp:562:10:562:29 | access to array | provenance | | | windows.cpp:563:26:563:37 | RtlCopyUnicodeString output argument [*Buffer] | windows.cpp:564:10:564:20 | *dest_string [*Buffer] | provenance | | -| windows.cpp:563:40:563:50 | *& ... [*Buffer] | windows.cpp:563:26:563:37 | RtlCopyUnicodeString output argument [*Buffer] | provenance | MaD:60 | +| windows.cpp:563:40:563:50 | *& ... [*Buffer] | windows.cpp:563:26:563:37 | RtlCopyUnicodeString output argument [*Buffer] | provenance | MaD:65 | | windows.cpp:564:10:564:20 | *dest_string [*Buffer] | windows.cpp:564:10:564:30 | access to array | provenance | | | windows.cpp:564:10:564:20 | *dest_string [*Buffer] | windows.cpp:564:22:564:27 | *Buffer | provenance | | | windows.cpp:564:22:564:27 | *Buffer | windows.cpp:564:10:564:30 | access to array | provenance | | | windows.cpp:568:19:568:29 | RtlMoveMemory output argument | windows.cpp:569:10:569:23 | access to array | provenance | | -| windows.cpp:568:32:568:33 | *& ... | windows.cpp:568:19:568:29 | RtlMoveMemory output argument | provenance | MaD:63 | +| windows.cpp:568:32:568:33 | *& ... | windows.cpp:568:19:568:29 | RtlMoveMemory output argument | provenance | MaD:68 | | windows.cpp:573:27:573:37 | RtlMoveVolatileMemory output argument | windows.cpp:574:10:574:23 | access to array | provenance | | -| windows.cpp:573:40:573:41 | *& ... | windows.cpp:573:27:573:37 | RtlMoveVolatileMemory output argument | provenance | MaD:64 | -| windows.cpp:645:45:645:50 | WinHttpReadData output argument | windows.cpp:647:10:647:16 | * ... | provenance | Src:MaD:33 | -| windows.cpp:652:48:652:53 | WinHttpReadDataEx output argument | windows.cpp:654:10:654:16 | * ... | provenance | Src:MaD:34 | -| windows.cpp:659:47:659:52 | WinHttpQueryHeaders output argument | windows.cpp:661:10:661:16 | * ... | provenance | Src:MaD:29 | -| windows.cpp:669:70:669:79 | WinHttpQueryHeadersEx output argument | windows.cpp:673:10:673:29 | * ... | provenance | Src:MaD:31 | -| windows.cpp:669:82:669:87 | WinHttpQueryHeadersEx output argument | windows.cpp:671:10:671:16 | * ... | provenance | Src:MaD:32 | -| windows.cpp:669:105:669:112 | WinHttpQueryHeadersEx output argument | windows.cpp:675:10:675:27 | * ... | provenance | Src:MaD:30 | +| windows.cpp:573:40:573:41 | *& ... | windows.cpp:573:27:573:37 | RtlMoveVolatileMemory output argument | provenance | MaD:69 | +| windows.cpp:645:45:645:50 | WinHttpReadData output argument | windows.cpp:647:10:647:16 | * ... | provenance | Src:MaD:35 | +| windows.cpp:652:48:652:53 | WinHttpReadDataEx output argument | windows.cpp:654:10:654:16 | * ... | provenance | Src:MaD:36 | +| windows.cpp:659:47:659:52 | WinHttpQueryHeaders output argument | windows.cpp:661:10:661:16 | * ... | provenance | Src:MaD:31 | +| windows.cpp:669:70:669:79 | WinHttpQueryHeadersEx output argument | windows.cpp:673:10:673:29 | * ... | provenance | Src:MaD:33 | +| windows.cpp:669:82:669:87 | WinHttpQueryHeadersEx output argument | windows.cpp:671:10:671:16 | * ... | provenance | Src:MaD:34 | +| windows.cpp:669:105:669:112 | WinHttpQueryHeadersEx output argument | windows.cpp:675:10:675:27 | * ... | provenance | Src:MaD:32 | | windows.cpp:728:5:728:28 | ... = ... | windows.cpp:729:35:729:35 | *x | provenance | | | windows.cpp:728:12:728:28 | call to source | windows.cpp:728:5:728:28 | ... = ... | provenance | | -| windows.cpp:729:35:729:35 | *x | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | provenance | MaD:68 | +| windows.cpp:729:35:729:35 | *x | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | provenance | MaD:73 | | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | windows.cpp:731:10:731:36 | * ... | provenance | | | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | windows.cpp:733:10:733:35 | * ... | provenance | | | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | windows.cpp:735:10:735:37 | * ... | provenance | | -| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:901:15:901:53 | *& ... | provenance | Src:MaD:7 | -| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:905:10:905:31 | * ... | provenance | Src:MaD:7 | -| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:907:10:907:42 | * ... | provenance | Src:MaD:7 | -| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:909:10:909:57 | * ... | provenance | Src:MaD:7 | -| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:911:10:911:60 | * ... | provenance | Src:MaD:7 | -| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:912:54:912:63 | FileHandle | provenance | Src:MaD:7 | -| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:914:10:914:70 | * ... | provenance | Src:MaD:7 | -| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:916:10:916:72 | * ... | provenance | Src:MaD:7 | -| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:918:10:918:64 | * ... | provenance | Src:MaD:7 | -| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:920:10:920:51 | * ... | provenance | Src:MaD:7 | -| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:922:10:922:52 | * ... | provenance | Src:MaD:7 | -| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:924:10:924:63 | * ... | provenance | Src:MaD:7 | +| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:901:15:901:53 | *& ... | provenance | Src:MaD:9 | +| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:905:10:905:31 | * ... | provenance | Src:MaD:9 | +| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:907:10:907:42 | * ... | provenance | Src:MaD:9 | +| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:909:10:909:57 | * ... | provenance | Src:MaD:9 | +| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:911:10:911:60 | * ... | provenance | Src:MaD:9 | +| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:912:54:912:63 | FileHandle | provenance | Src:MaD:9 | +| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:914:10:914:70 | * ... | provenance | Src:MaD:9 | +| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:916:10:916:72 | * ... | provenance | Src:MaD:9 | +| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:918:10:918:64 | * ... | provenance | Src:MaD:9 | +| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:920:10:920:51 | * ... | provenance | Src:MaD:9 | +| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:922:10:922:52 | * ... | provenance | Src:MaD:9 | +| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:924:10:924:63 | * ... | provenance | Src:MaD:9 | | windows.cpp:901:15:901:53 | *& ... | windows.cpp:903:10:903:11 | * ... | provenance | | -| windows.cpp:929:70:929:75 | HttpReceiveRequestEntityBody output argument | windows.cpp:931:10:931:16 | * ... | provenance | Src:MaD:8 | -| windows.cpp:936:70:936:78 | HttpReceiveClientCertificate output argument | windows.cpp:937:15:937:48 | *& ... | provenance | Src:MaD:6 | -| windows.cpp:936:70:936:78 | HttpReceiveClientCertificate output argument | windows.cpp:941:10:941:31 | * ... | provenance | Src:MaD:6 | +| windows.cpp:929:70:929:75 | HttpReceiveRequestEntityBody output argument | windows.cpp:931:10:931:16 | * ... | provenance | Src:MaD:10 | +| windows.cpp:936:70:936:78 | HttpReceiveClientCertificate output argument | windows.cpp:937:15:937:48 | *& ... | provenance | Src:MaD:8 | +| windows.cpp:936:70:936:78 | HttpReceiveClientCertificate output argument | windows.cpp:941:10:941:31 | * ... | provenance | Src:MaD:8 | | windows.cpp:937:15:937:48 | *& ... | windows.cpp:939:10:939:11 | * ... | provenance | | -| windows.cpp:1009:35:1009:38 | RegQueryValueA output argument | windows.cpp:1011:10:1011:14 | * ... | provenance | Src:MaD:25 | -| windows.cpp:1016:36:1016:39 | RegQueryValueW output argument | windows.cpp:1018:10:1018:14 | * ... | provenance | Src:MaD:28 | -| windows.cpp:1024:53:1024:56 | RegQueryValueExA output argument | windows.cpp:1026:10:1026:14 | * ... | provenance | Src:MaD:26 | -| windows.cpp:1032:54:1032:57 | RegQueryValueExW output argument | windows.cpp:1034:10:1034:14 | * ... | provenance | Src:MaD:27 | -| windows.cpp:1040:46:1040:49 | RegQueryMultipleValuesA output argument | windows.cpp:1042:10:1042:14 | * ... | provenance | Src:MaD:23 | -| windows.cpp:1048:46:1048:49 | RegQueryMultipleValuesW output argument | windows.cpp:1050:10:1050:14 | * ... | provenance | Src:MaD:24 | -| windows.cpp:1056:53:1056:56 | RegGetValueA output argument | windows.cpp:1058:10:1058:14 | * ... | provenance | Src:MaD:21 | -| windows.cpp:1065:55:1065:58 | RegGetValueW output argument | windows.cpp:1067:10:1067:14 | * ... | provenance | Src:MaD:22 | -| windows.cpp:1075:28:1075:36 | RegEnumValueA output argument | windows.cpp:1079:10:1079:19 | * ... | provenance | Src:MaD:19 | -| windows.cpp:1075:71:1075:74 | RegEnumValueA output argument | windows.cpp:1077:10:1077:14 | * ... | provenance | Src:MaD:19 | -| windows.cpp:1087:28:1087:36 | RegEnumValueW output argument | windows.cpp:1091:10:1091:19 | * ... | provenance | Src:MaD:20 | -| windows.cpp:1087:71:1087:74 | RegEnumValueW output argument | windows.cpp:1089:10:1089:14 | * ... | provenance | Src:MaD:20 | +| windows.cpp:1009:35:1009:38 | RegQueryValueA output argument | windows.cpp:1011:10:1011:14 | * ... | provenance | Src:MaD:27 | +| windows.cpp:1016:36:1016:39 | RegQueryValueW output argument | windows.cpp:1018:10:1018:14 | * ... | provenance | Src:MaD:30 | +| windows.cpp:1024:53:1024:56 | RegQueryValueExA output argument | windows.cpp:1026:10:1026:14 | * ... | provenance | Src:MaD:28 | +| windows.cpp:1032:54:1032:57 | RegQueryValueExW output argument | windows.cpp:1034:10:1034:14 | * ... | provenance | Src:MaD:29 | +| windows.cpp:1040:46:1040:49 | RegQueryMultipleValuesA output argument | windows.cpp:1042:10:1042:14 | * ... | provenance | Src:MaD:25 | +| windows.cpp:1048:46:1048:49 | RegQueryMultipleValuesW output argument | windows.cpp:1050:10:1050:14 | * ... | provenance | Src:MaD:26 | +| windows.cpp:1056:53:1056:56 | RegGetValueA output argument | windows.cpp:1058:10:1058:14 | * ... | provenance | Src:MaD:23 | +| windows.cpp:1065:55:1065:58 | RegGetValueW output argument | windows.cpp:1067:10:1067:14 | * ... | provenance | Src:MaD:24 | +| windows.cpp:1075:28:1075:36 | RegEnumValueA output argument | windows.cpp:1079:10:1079:19 | * ... | provenance | Src:MaD:21 | +| windows.cpp:1075:71:1075:74 | RegEnumValueA output argument | windows.cpp:1077:10:1077:14 | * ... | provenance | Src:MaD:21 | +| windows.cpp:1087:28:1087:36 | RegEnumValueW output argument | windows.cpp:1091:10:1091:19 | * ... | provenance | Src:MaD:22 | +| windows.cpp:1087:71:1087:74 | RegEnumValueW output argument | windows.cpp:1089:10:1089:14 | * ... | provenance | Src:MaD:22 | | windows.cpp:1122:5:1122:27 | ... = ... | windows.cpp:1124:19:1124:21 | *str | provenance | | | windows.cpp:1122:14:1122:27 | call to source | windows.cpp:1122:5:1122:27 | ... = ... | provenance | | -| windows.cpp:1124:19:1124:21 | *str | windows.cpp:1124:24:1124:27 | IIDFromString output argument | provenance | MaD:54 | +| windows.cpp:1124:19:1124:21 | *str | windows.cpp:1124:24:1124:27 | IIDFromString output argument | provenance | MaD:59 | | windows.cpp:1124:24:1124:27 | IIDFromString output argument | windows.cpp:1125:10:1125:12 | iid | provenance | | | windows.cpp:1128:15:1128:20 | call to source | windows.cpp:1128:15:1128:20 | call to source | provenance | | | windows.cpp:1128:15:1128:20 | call to source | windows.cpp:1130:19:1130:21 | *iid | provenance | | -| windows.cpp:1130:19:1130:21 | *iid | windows.cpp:1130:24:1130:27 | StringFromIID output argument | provenance | MaD:67 | +| windows.cpp:1130:19:1130:21 | *iid | windows.cpp:1130:24:1130:27 | StringFromIID output argument | provenance | MaD:72 | | windows.cpp:1130:24:1130:27 | StringFromIID output argument | windows.cpp:1132:10:1132:13 | * ... | provenance | | | windows.cpp:1135:19:1135:24 | call to source | windows.cpp:1135:19:1135:24 | call to source | provenance | | | windows.cpp:1135:19:1135:24 | call to source | windows.cpp:1137:21:1137:25 | *clsid | provenance | | -| windows.cpp:1137:21:1137:25 | *clsid | windows.cpp:1137:28:1137:31 | ProgIDFromCLSID output argument | provenance | MaD:55 | +| windows.cpp:1137:21:1137:25 | *clsid | windows.cpp:1137:28:1137:31 | ProgIDFromCLSID output argument | provenance | MaD:60 | | windows.cpp:1137:28:1137:31 | ProgIDFromCLSID output argument | windows.cpp:1139:10:1139:13 | * ... | provenance | | | windows.cpp:1143:5:1143:30 | ... = ... | windows.cpp:1145:21:1145:26 | *progID | provenance | | | windows.cpp:1143:17:1143:30 | call to source | windows.cpp:1143:5:1143:30 | ... = ... | provenance | | -| windows.cpp:1145:21:1145:26 | *progID | windows.cpp:1145:29:1145:34 | CLSIDFromProgID output argument | provenance | MaD:47 | +| windows.cpp:1145:21:1145:26 | *progID | windows.cpp:1145:29:1145:34 | CLSIDFromProgID output argument | provenance | MaD:52 | | windows.cpp:1145:29:1145:34 | CLSIDFromProgID output argument | windows.cpp:1146:10:1146:14 | clsid | provenance | | | windows.cpp:1150:5:1150:27 | ... = ... | windows.cpp:1152:21:1152:23 | *str | provenance | | | windows.cpp:1150:14:1150:27 | call to source | windows.cpp:1150:5:1150:27 | ... = ... | provenance | | -| windows.cpp:1152:21:1152:23 | *str | windows.cpp:1152:26:1152:31 | CLSIDFromString output argument | provenance | MaD:48 | +| windows.cpp:1152:21:1152:23 | *str | windows.cpp:1152:26:1152:31 | CLSIDFromString output argument | provenance | MaD:53 | | windows.cpp:1152:26:1152:31 | CLSIDFromString output argument | windows.cpp:1153:10:1153:14 | clsid | provenance | | | windows.cpp:1156:19:1156:24 | call to source | windows.cpp:1156:19:1156:24 | call to source | provenance | | | windows.cpp:1156:19:1156:24 | call to source | windows.cpp:1158:21:1158:25 | *clsid | provenance | | -| windows.cpp:1158:21:1158:25 | *clsid | windows.cpp:1158:28:1158:31 | StringFromCLSID output argument | provenance | MaD:65 | +| windows.cpp:1158:21:1158:25 | *clsid | windows.cpp:1158:28:1158:31 | StringFromCLSID output argument | provenance | MaD:70 | | windows.cpp:1158:28:1158:31 | StringFromCLSID output argument | windows.cpp:1160:10:1160:13 | * ... | provenance | | | windows.cpp:1164:5:1164:27 | ... = ... | windows.cpp:1166:20:1166:22 | *str | provenance | | | windows.cpp:1164:14:1164:27 | call to source | windows.cpp:1164:5:1164:27 | ... = ... | provenance | | -| windows.cpp:1166:20:1166:22 | *str | windows.cpp:1166:25:1166:29 | GUIDFromString output argument | provenance | MaD:53 | +| windows.cpp:1166:20:1166:22 | *str | windows.cpp:1166:25:1166:29 | GUIDFromString output argument | provenance | MaD:58 | | windows.cpp:1166:25:1166:29 | GUIDFromString output argument | windows.cpp:1167:10:1167:13 | guid | provenance | | | windows.cpp:1170:17:1170:22 | call to source | windows.cpp:1170:17:1170:22 | call to source | provenance | | | windows.cpp:1170:17:1170:22 | call to source | windows.cpp:1172:21:1172:24 | *guid | provenance | | -| windows.cpp:1172:21:1172:24 | *guid | windows.cpp:1172:27:1172:29 | StringFromGUID2 output argument | provenance | MaD:66 | +| windows.cpp:1172:21:1172:24 | *guid | windows.cpp:1172:27:1172:29 | StringFromGUID2 output argument | provenance | MaD:71 | | windows.cpp:1172:27:1172:29 | StringFromGUID2 output argument | windows.cpp:1174:10:1174:13 | * ... | provenance | | nodes | asio_streams.cpp:87:34:87:44 | read_until output argument | semmle.label | read_until output argument | @@ -617,8 +644,33 @@ nodes | test.cpp:263:15:263:19 | value | semmle.label | value | | test.cpp:267:32:267:34 | source_from_callback_template output argument | semmle.label | source_from_callback_template output argument | | test.cpp:267:32:267:34 | source_from_callback_template output argument [value] | semmle.label | source_from_callback_template output argument [value] | +| test.cpp:282:5:282:26 | *callback_returning_int | semmle.label | *callback_returning_int | +| test.cpp:283:5:283:28 | *callback_returning_int_2 | semmle.label | *callback_returning_int_2 | +| test.cpp:284:6:284:31 | **callback_returning_ptr_int | semmle.label | **callback_returning_ptr_int | +| test.cpp:286:33:286:41 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:286:33:286:41 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:288:41:288:52 | *call to ymlSourcePtr | semmle.label | *call to ymlSourcePtr | +| test.cpp:288:41:288:52 | call to ymlSourcePtr | semmle.label | call to ymlSourcePtr | | test.cpp:293:10:293:24 | * ... | semmle.label | * ... | | test.cpp:293:11:293:22 | call to ymlSourcePtr | semmle.label | call to ymlSourcePtr | +| test.cpp:295:39:295:60 | source_from_callback_return_template output argument | semmle.label | source_from_callback_return_template output argument | +| test.cpp:296:10:296:31 | call to callback_returning_int | semmle.label | call to callback_returning_int | +| test.cpp:296:10:296:31 | call to callback_returning_int | semmle.label | call to callback_returning_int | +| test.cpp:298:34:298:57 | source_from_callback_return_ptr output argument | semmle.label | source_from_callback_return_ptr output argument | +| test.cpp:299:10:299:33 | call to callback_returning_int_2 | semmle.label | call to callback_returning_int_2 | +| test.cpp:299:10:299:33 | call to callback_returning_int_2 | semmle.label | call to callback_returning_int_2 | +| test.cpp:301:38:301:63 | source_ptr_from_callback_return_ptr output argument | semmle.label | source_ptr_from_callback_return_ptr output argument | +| test.cpp:302:13:302:38 | *call to callback_returning_ptr_int | semmle.label | *call to callback_returning_ptr_int | +| test.cpp:302:13:302:38 | *call to callback_returning_ptr_int | semmle.label | *call to callback_returning_ptr_int | +| test.cpp:304:10:304:13 | * ... | semmle.label | * ... | +| test.cpp:306:37:306:64 | [...](...){...} | semmle.label | [...](...){...} | +| test.cpp:306:51:306:59 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:306:51:306:59 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:307:37:307:52 | return_ymlSource | semmle.label | return_ymlSource | +| test.cpp:309:36:309:36 | call to operator int *(*)() | semmle.label | call to operator int *(*)() | +| test.cpp:309:50:309:61 | *call to ymlSourcePtr | semmle.label | *call to ymlSourcePtr | +| test.cpp:309:50:309:61 | call to ymlSourcePtr | semmle.label | call to ymlSourcePtr | +| test.cpp:310:36:310:58 | return_ptr_to_ymlSource | semmle.label | return_ptr_to_ymlSource | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | semmle.label | *call to GetCommandLineA | | windows.cpp:22:15:22:29 | call to GetCommandLineA | semmle.label | call to GetCommandLineA | | windows.cpp:24:8:24:11 | * ... | semmle.label | * ... | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp index 52c57f3a881e..ad042915def1 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp @@ -293,19 +293,19 @@ void test_callback_return_access_paths() { ymlSink(*ymlSourcePtr()); // $ ir source_from_callback_return_template(callback_returning_int); - ymlSink(callback_returning_int()); // $ MISSING: ir + ymlSink(callback_returning_int()); // $ ir source_from_callback_return_ptr(callback_returning_int_2); - ymlSink(callback_returning_int_2()); // $ MISSING: ir + ymlSink(callback_returning_int_2()); // $ ir source_ptr_from_callback_return_ptr(callback_returning_ptr_int); int *ptr = callback_returning_ptr_int(); ymlSink((int)ptr); // clean - ymlSink(*ptr); // $ MISSING: ir + ymlSink(*ptr); // $ ir - sink_from_callback_return_template([]() { return ymlSource(); }); // $ MISSING: ir - sink_from_callback_return_template(return_ymlSource); // $ MISSING: ir + sink_from_callback_return_template([]() { return ymlSource(); }); // $ ir + sink_from_callback_return_template(return_ymlSource); // $ ir - sink_ptr_from_callback_return_ptr([]() { return ymlSourcePtr(); }); // $ MISSING: ir - sink_ptr_from_callback_return_ptr(return_ptr_to_ymlSource); // $ MISSING: ir + sink_ptr_from_callback_return_ptr([]() { return ymlSourcePtr(); }); // $ ir + sink_ptr_from_callback_return_ptr(return_ptr_to_ymlSource); // $ ir } \ No newline at end of file From 16e9b22b333cdc4cef4244baa8d162da55fc22eb Mon Sep 17 00:00:00 2001 From: Nicolas Will Date: Thu, 20 Aug 2026 19:07:28 +0200 Subject: [PATCH 0443/2098] Refine Micronaut data flow models --- .../ext/io.micronaut.core.convert.value.model.yml | 13 +++++++++++++ .../ql/lib/ext/io.micronaut.http.cookie.model.yml | 12 ++++++++++++ java/ql/lib/ext/io.micronaut.http.model.yml | 15 --------------- 3 files changed, 25 insertions(+), 15 deletions(-) create mode 100644 java/ql/lib/ext/io.micronaut.core.convert.value.model.yml create mode 100644 java/ql/lib/ext/io.micronaut.http.cookie.model.yml diff --git a/java/ql/lib/ext/io.micronaut.core.convert.value.model.yml b/java/ql/lib/ext/io.micronaut.core.convert.value.model.yml new file mode 100644 index 000000000000..f5400d2384d6 --- /dev/null +++ b/java/ql/lib/ext/io.micronaut.core.convert.value.model.yml @@ -0,0 +1,13 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: summaryModel + data: + - ["io.micronaut.core.convert.value", "ConvertibleMultiValues", True, "get", "", "", "Argument[this].MapValue", "ReturnValue", "taint", "manual"] + - ["io.micronaut.core.convert.value", "ConvertibleMultiValues", True, "getAll", "", "", "Argument[this].MapValue", "ReturnValue.Element", "value", "manual"] + - ["io.micronaut.core.convert.value", "ConvertibleMultiValues", True, "getFirst", "", "", "Argument[this].MapValue", "ReturnValue.Element", "taint", "manual"] + - ["io.micronaut.core.convert.value", "ConvertibleValues", True, "asMap", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.core.convert.value", "ConvertibleValues", True, "asProperties", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.core.convert.value", "ConvertibleValues", True, "getValue", "", "", "Argument[this].MapValue", "ReturnValue", "taint", "manual"] + - ["io.micronaut.core.convert.value", "ConvertibleValues", True, "subMap", "", "", "Argument[this].MapValue", "ReturnValue.MapValue", "taint", "manual"] + - ["io.micronaut.core.convert.value", "ConvertibleValues", True, "values", "", "", "Argument[this].MapValue", "ReturnValue.Element", "taint", "manual"] diff --git a/java/ql/lib/ext/io.micronaut.http.cookie.model.yml b/java/ql/lib/ext/io.micronaut.http.cookie.model.yml new file mode 100644 index 000000000000..4db713a8f90c --- /dev/null +++ b/java/ql/lib/ext/io.micronaut.http.cookie.model.yml @@ -0,0 +1,12 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: summaryModel + data: + - ["io.micronaut.http.cookie", "Cookie", True, "getDomain", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http.cookie", "Cookie", True, "getName", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http.cookie", "Cookie", True, "getPath", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http.cookie", "Cookie", True, "getValue", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http.cookie", "Cookies", True, "findCookie", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http.cookie", "Cookies", True, "get", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["io.micronaut.http.cookie", "Cookies", True, "getAll", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] diff --git a/java/ql/lib/ext/io.micronaut.http.model.yml b/java/ql/lib/ext/io.micronaut.http.model.yml index 6e6d30ff2681..d4ad7697ec41 100644 --- a/java/ql/lib/ext/io.micronaut.http.model.yml +++ b/java/ql/lib/ext/io.micronaut.http.model.yml @@ -16,14 +16,6 @@ extensions: pack: codeql/java-all extensible: summaryModel data: - - ["io.micronaut.core.convert.value", "ConvertibleMultiValues", True, "get", "", "", "Argument[this].Element.MapValue", "ReturnValue", "taint", "manual"] - - ["io.micronaut.core.convert.value", "ConvertibleMultiValues", True, "getAll", "", "", "Argument[this].Element.MapValue", "ReturnValue", "value", "manual"] - - ["io.micronaut.core.convert.value", "ConvertibleMultiValues", True, "getFirst", "", "", "Argument[this].Element.MapValue", "ReturnValue", "taint", "manual"] - - ["io.micronaut.core.convert.value", "ConvertibleValues", True, "asMap", "", "", "Argument[this].Element.MapValue", "ReturnValue.MapValue", "taint", "manual"] - - ["io.micronaut.core.convert.value", "ConvertibleValues", True, "asProperties", "", "", "Argument[this].Element.MapValue", "ReturnValue.MapValue", "taint", "manual"] - - ["io.micronaut.core.convert.value", "ConvertibleValues", True, "getValue", "", "", "Argument[this].Element.MapValue", "ReturnValue", "taint", "manual"] - - ["io.micronaut.core.convert.value", "ConvertibleValues", True, "subMap", "", "", "Argument[this].Element.MapValue", "ReturnValue.MapValue", "taint", "manual"] - - ["io.micronaut.core.convert.value", "ConvertibleValues", True, "values", "", "", "Argument[this].Element.MapValue", "ReturnValue.Element", "taint", "manual"] - ["io.micronaut.http", "HttpRequest", True, "DELETE", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["io.micronaut.http", "HttpRequest", True, "DELETE", "(String,Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["io.micronaut.http", "HttpRequest", True, "DELETE", "(URI)", "", "Argument[0]", "ReturnValue", "taint", "manual"] @@ -40,13 +32,6 @@ extensions: - ["io.micronaut.http", "HttpRequest", True, "POST", "(URI,Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["io.micronaut.http", "HttpRequest", True, "PUT", "(String,Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["io.micronaut.http", "HttpRequest", True, "PUT", "(URI,Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["io.micronaut.http.cookie", "Cookie", True, "getDomain", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - - ["io.micronaut.http.cookie", "Cookie", True, "getName", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - - ["io.micronaut.http.cookie", "Cookie", True, "getPath", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - - ["io.micronaut.http.cookie", "Cookie", True, "getValue", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - - ["io.micronaut.http.cookie", "Cookies", True, "findCookie", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - - ["io.micronaut.http.cookie", "Cookies", True, "get", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - - ["io.micronaut.http.cookie", "Cookies", True, "getAll", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - addsTo: pack: codeql/java-all extensible: sinkModel From 8f0ea6147a4de49bebdc6062857486871a881d5b Mon Sep 17 00:00:00 2001 From: Keshav Malik Date: Thu, 13 Aug 2026 16:16:36 +0530 Subject: [PATCH 0444/2098] C/C++: Detect ambiguous assignment of comparison results Original-patch-by: Richard Yao --- .../cpp-code-quality-extended.qls.expected | 2 +- .../query-suite/cpp-code-quality.qls.expected | 2 +- .../cpp-security-and-quality.qls.expected | 1 + .../AmbiguousAssignmentOfComparison.cpp | 12 + .../AmbiguousAssignmentOfComparison.qhelp | 31 ++ .../AmbiguousAssignmentOfComparison.ql | 56 ++++ ...8-13-ambiguous-assignment-of-comparison.md | 5 + .../AmbiguousAssignmentOfComparison.expected | 24 ++ .../AmbiguousAssignmentOfComparison.qlref | 2 + .../AmbiguousAssignmentOfComparison/test.c | 91 ++++++ .../AmbiguousAssignmentOfComparison/test.cpp | 300 ++++++++++++++++++ 11 files changed, 524 insertions(+), 2 deletions(-) create mode 100644 cpp/ql/src/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison.cpp create mode 100644 cpp/ql/src/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison.qhelp create mode 100644 cpp/ql/src/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison.ql create mode 100644 cpp/ql/src/change-notes/2026-08-13-ambiguous-assignment-of-comparison.md create mode 100644 cpp/ql/test/query-tests/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison/AmbiguousAssignmentOfComparison.expected create mode 100644 cpp/ql/test/query-tests/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison/AmbiguousAssignmentOfComparison.qlref create mode 100644 cpp/ql/test/query-tests/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison/test.c create mode 100644 cpp/ql/test/query-tests/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison/test.cpp diff --git a/cpp/ql/integration-tests/query-suite/cpp-code-quality-extended.qls.expected b/cpp/ql/integration-tests/query-suite/cpp-code-quality-extended.qls.expected index 8b137891791f..85790a23a836 100644 --- a/cpp/ql/integration-tests/query-suite/cpp-code-quality-extended.qls.expected +++ b/cpp/ql/integration-tests/query-suite/cpp-code-quality-extended.qls.expected @@ -1 +1 @@ - +ql/cpp/ql/src/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison.ql diff --git a/cpp/ql/integration-tests/query-suite/cpp-code-quality.qls.expected b/cpp/ql/integration-tests/query-suite/cpp-code-quality.qls.expected index 8b137891791f..85790a23a836 100644 --- a/cpp/ql/integration-tests/query-suite/cpp-code-quality.qls.expected +++ b/cpp/ql/integration-tests/query-suite/cpp-code-quality.qls.expected @@ -1 +1 @@ - +ql/cpp/ql/src/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison.ql diff --git a/cpp/ql/integration-tests/query-suite/cpp-security-and-quality.qls.expected b/cpp/ql/integration-tests/query-suite/cpp-security-and-quality.qls.expected index cb4e5f7b305a..17ebac8ee50c 100644 --- a/cpp/ql/integration-tests/query-suite/cpp-security-and-quality.qls.expected +++ b/cpp/ql/integration-tests/query-suite/cpp-security-and-quality.qls.expected @@ -65,6 +65,7 @@ ql/cpp/ql/src/Likely Bugs/InconsistentCheckReturnNull.ql ql/cpp/ql/src/Likely Bugs/Leap Year/Adding365DaysPerYear.ql ql/cpp/ql/src/Likely Bugs/Leap Year/UncheckedLeapYearAfterYearModification.ql ql/cpp/ql/src/Likely Bugs/Leap Year/UncheckedReturnValueForTimeFunctions.ql +ql/cpp/ql/src/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison.ql ql/cpp/ql/src/Likely Bugs/Likely Typos/AssignWhereCompareMeant.ql ql/cpp/ql/src/Likely Bugs/Likely Typos/CompareWhereAssignMeant.ql ql/cpp/ql/src/Likely Bugs/Likely Typos/DubiousNullCheck.ql diff --git a/cpp/ql/src/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison.cpp b/cpp/ql/src/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison.cpp new file mode 100644 index 000000000000..c99ee284346c --- /dev/null +++ b/cpp/ql/src/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison.cpp @@ -0,0 +1,12 @@ +int read_status(); + +int check_status() { + int status; + if (status = read_status() < 0) // BAD: assigns the comparison result. + return status; + + if ((status = read_status()) < 0) // GOOD: assigns first, then compares. + return status; + + return 0; +} diff --git a/cpp/ql/src/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison.qhelp b/cpp/ql/src/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison.qhelp new file mode 100644 index 000000000000..53c001212001 --- /dev/null +++ b/cpp/ql/src/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison.qhelp @@ -0,0 +1,31 @@ + + + + +

    Assignment operators have lower precedence than comparison operators. For example, +status = read_status() < 0 assigns the comparison result (zero or one) to +status. This can be unintended when the programmer meant to assign the return value +first and then compare it with zero.

    +
    + + +

    Use parentheses to make the intended operation order explicit. To assign first and compare the +assigned value, parenthesize the assignment. To intentionally assign the comparison result, +parenthesize the comparison. An explicit cast around the comparison also makes that order clear.

    +
    + + +

    In the first condition, status receives either zero or one instead of the value +returned by read_status. The second condition explicitly performs the assignment +before the comparison.

    + +
    + + +
    +
  • C++ reference: Operator precedence.
  • + + + diff --git a/cpp/ql/src/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison.ql b/cpp/ql/src/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison.ql new file mode 100644 index 000000000000..be3007ffa038 --- /dev/null +++ b/cpp/ql/src/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison.ql @@ -0,0 +1,56 @@ +/** + * @name Ambiguous assignment of comparison in condition + * @description Assigning the result of an unparenthesized comparison in a condition may indicate + * that the assignment and comparison are grouped incorrectly. + * @kind problem + * @problem.severity warning + * @precision high + * @id cpp/ambiguous-assignment-of-comparison + * @tags quality + * reliability + * correctness + * external/cwe/cwe-783 + */ + +import cpp + +/** Gets a condition that controls branching. */ +private Expr getACondition() { + result = any(IfStmt s).getCondition() + or + result = any(Loop s).getCondition() + or + result = any(ConditionalExpr e).getCondition() +} + +/** + * Holds if `assignment` occurs within a condition that controls branching. + * + * This includes nested expressions, such as function arguments and either operand of a comma + * expression, because the ambiguous syntax still occurs within the condition. + */ +private predicate occursInCondition(Assignment assignment) { + assignment.getParent*() = getACondition() +} + +/** + * Holds if `comparison` is explicitly grouped using parentheses or an explicit cast. + */ +private predicate isExplicitlyGrouped(ComparisonOperation comparison) { + comparison.isParenthesised() + or + exists(Cast cast | cast = comparison.getConversion+() and not cast.isImplicit()) +} + +from Assignment assignment, ComparisonOperation comparison +where + assignment.getRValue() = comparison and + not isExplicitlyGrouped(comparison) and + occursInCondition(assignment) and + // Assigning a comparison result to a Boolean is normally intentional. + not assignment.getLValue().getUnspecifiedType() instanceof BoolType and + not assignment.isUnevaluated() and + not assignment.isFromUninstantiatedTemplate(_) +select assignment, + "The '" + assignment.getOperator() + + "' operation assigns the result of an unparenthesized comparison used in a condition." diff --git a/cpp/ql/src/change-notes/2026-08-13-ambiguous-assignment-of-comparison.md b/cpp/ql/src/change-notes/2026-08-13-ambiguous-assignment-of-comparison.md new file mode 100644 index 000000000000..ae9e2c5d3823 --- /dev/null +++ b/cpp/ql/src/change-notes/2026-08-13-ambiguous-assignment-of-comparison.md @@ -0,0 +1,5 @@ +--- +category: newQuery +--- +* Added a new query, `cpp/ambiguous-assignment-of-comparison`, to detect assignments of + unparenthesized comparison results in conditions. diff --git a/cpp/ql/test/query-tests/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison/AmbiguousAssignmentOfComparison.expected b/cpp/ql/test/query-tests/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison/AmbiguousAssignmentOfComparison.expected new file mode 100644 index 000000000000..9075768e9f98 --- /dev/null +++ b/cpp/ql/test/query-tests/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison/AmbiguousAssignmentOfComparison.expected @@ -0,0 +1,24 @@ +| test.c:6:8:6:31 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | +| test.c:13:30:13:54 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | +| test.c:20:8:20:33 | ... /= ... | The '/=' operation assigns the result of an unparenthesized comparison used in a condition. | +| test.c:27:8:27:33 | ... %= ... | The '%=' operation assigns the result of an unparenthesized comparison used in a condition. | +| test.c:34:8:34:32 | ... \|= ... | The '\|=' operation assigns the result of an unparenthesized comparison used in a condition. | +| test.c:41:8:41:33 | ... >>= ... | The '>>=' operation assigns the result of an unparenthesized comparison used in a condition. | +| test.c:51:3:51:26 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | +| test.cpp:8:8:8:30 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | +| test.cpp:15:11:15:34 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | +| test.cpp:22:7:22:29 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | +| test.cpp:29:11:29:40 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | +| test.cpp:36:8:36:30 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | +| test.cpp:43:11:43:33 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | +| test.cpp:48:8:48:33 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | +| test.cpp:55:8:55:32 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | +| test.cpp:64:13:64:35 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | +| test.cpp:70:29:70:51 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | +| test.cpp:77:8:77:30 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | +| test.cpp:84:8:84:38 | ... <<= ... | The '<<=' operation assigns the result of an unparenthesized comparison used in a condition. | +| test.cpp:91:9:91:31 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | +| test.cpp:101:3:101:20 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | +| test.cpp:253:8:253:24 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | +| test.cpp:280:16:280:38 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | +| test.cpp:287:8:287:30 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | diff --git a/cpp/ql/test/query-tests/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison/AmbiguousAssignmentOfComparison.qlref b/cpp/ql/test/query-tests/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison/AmbiguousAssignmentOfComparison.qlref new file mode 100644 index 000000000000..ffa4d7fb05d8 --- /dev/null +++ b/cpp/ql/test/query-tests/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison/AmbiguousAssignmentOfComparison.qlref @@ -0,0 +1,2 @@ +query: Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison.ql +postprocess: utils/test/InlineExpectationsTestQuery.ql diff --git a/cpp/ql/test/query-tests/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison/test.c b/cpp/ql/test/query-tests/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison/test.c new file mode 100644 index 000000000000..ee78980b3672 --- /dev/null +++ b/cpp/ql/test/query-tests/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison/test.c @@ -0,0 +1,91 @@ +int read_value(void); +int read_other_value(void); + +int c_direct_condition(void) { + int value; + if ((value = read_value() < 0)) // $ Alert // BAD + return value; + return 0; +} + +int c_logical_condition(void) { + int value; + if (read_other_value() && (value = read_value() >= 0)) // $ Alert // BAD + return value; + return 0; +} + +int c_compound_divide(void) { + int value = 8; + if ((value /= read_value() != 0)) // $ Alert // BAD + return value; + return 0; +} + +int c_compound_remainder(void) { + int value = 8; + if ((value %= read_value() != 0)) // $ Alert // BAD + return value; + return 0; +} + +int c_compound_bitwise_or(void) { + int value = 0; + if ((value |= read_value() > 0)) // $ Alert // BAD + return value; + return 0; +} + +int c_compound_right_shift(void) { + int value = 8; + if ((value >>= read_value() > 0)) // $ Alert // BAD + return value; + return 0; +} + +#define C_AMBIGUOUS_CHECK(VALUE) \ + if (((VALUE) = read_value() < 0)) return (VALUE) + +int c_macro_condition(void) { + int value; + C_AMBIGUOUS_CHECK(value); // $ Alert // BAD + return 0; +} + +int c_explicit_assign_then_compare(void) { + int value; + if ((value = read_value()) < 0) // GOOD + return value; + return 0; +} + +int c_explicit_compare_then_assign(void) { + int value; + if ((value = (read_value() < 0))) // GOOD + return value; + return 0; +} + +int c_explicit_cast_of_comparison(void) { + int value; + if ((value = (int)(read_value() < 0))) // GOOD: The cast explicitly groups the comparison. + return value; + return 0; +} + +int c_boolean_result_assignment(void) { + _Bool negative; + if ((negative = read_value() < 0)) // GOOD: Assigning a comparison result to a Boolean is natural. + return negative; + return 0; +} + +int c_switch_expression(void) { + int value; + switch (value = read_value() < 0) { // GOOD: This query only covers branching conditions. + case 0: + return value; + default: + return 0; + } +} diff --git a/cpp/ql/test/query-tests/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison/test.cpp b/cpp/ql/test/query-tests/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison/test.cpp new file mode 100644 index 000000000000..8082c7925f92 --- /dev/null +++ b/cpp/ql/test/query-tests/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison/test.cpp @@ -0,0 +1,300 @@ +int get_value(); +int get_other_value(); +void *get_pointer(); +bool identity(bool value); + +int direct_if() { + int value; + if ((value = get_value() < 0)) // $ Alert // BAD + return value; + return 0; +} + +int direct_while() { + int value; + while ((value = get_value() != 0)) // $ Alert // BAD + return value; + return 0; +} + +int without_outer_parentheses() { + int value; + if (value = get_value() < 0) // $ Alert // BAD + return value; + return 0; +} + +int for_condition() { + int value; + for (; (value = get_other_value() <= 0);) // $ Alert // BAD + return value; + return 0; +} + +int logical_and() { + int value; + if ((value = get_value() < 0) && get_other_value()) // $ Alert // BAD + return value; + return 0; +} + +int ternary_condition() { + int value; + return (value = get_value() > 0) ? value : 0; // $ Alert // BAD +} + +int pointer_comparison() { + int value; + if ((value = get_pointer() == 0)) // $ Alert // BAD + return value; + return 0; +} + +int parenthesized_operand_only() { + int value; + if ((value = (get_value()) < 0)) // $ Alert // BAD + return value; + return 0; +} + +int do_while_condition() { + int value = 0; + do { + value++; + } while ((value = get_value() < 0)); // $ Alert // BAD + return value; +} + +int logical_or() { + int value; + if (get_other_value() || (value = get_value() > 0)) // $ Alert // BAD + return value; + return 0; +} + +int nested_comparison() { + int value; + if ((value = get_value() < 0) == 1) // $ Alert // BAD + return value; + return 0; +} + +int compound_shift() { + int value = 1; + if ((value <<= get_other_value() > 0)) // $ Alert // BAD + return value; + return 0; +} + +int under_logical_not() { + int value; + if (!(value = get_value() < 0)) // $ Alert // BAD + return value; + return 0; +} + +#define CHECK_VALUE(VALUE) \ + if (((VALUE) = get_value() < 0)) return (VALUE) + +int macro_condition() { + int value; + CHECK_VALUE(value); // $ Alert // BAD + return 0; +} + +int explicit_assign_then_compare() { + int value; + if ((value = get_value()) < 0) // GOOD + return value; + return 0; +} + +int explicit_compare_then_assign() { + int value; + if ((value = (get_value() < 0))) // GOOD + return value; + return 0; +} + +int parenthesized_simple_assignment() { + int value; + if ((value = get_value())) // GOOD + return value; + return 0; +} + +int assignment_outside_condition() { + int value; + value = get_value() < 0; // GOOD: The assignment is not part of a condition. + return value; +} + +int plain_comparison() { + int value = get_value(); + if (value < 0) // GOOD + return value; + return 0; +} + +int explicit_compare_then_assign_without_outer_parentheses() { + int value; + if (value = (get_value() < 0)) // GOOD + return value; + return 0; +} + +int explicit_assign_then_compare_in_for() { + int value; + for (; (value = get_other_value()) >= 0;) // GOOD + return value; + return 0; +} + +int two_explicit_assignments() { + int left, right; + if ((left = get_value()) < 0 && (right = get_other_value()) < 0) // GOOD + return left + right; + return 0; +} + +int explicit_comparison_then_compound_assign() { + int value = 0; + if ((value += (get_value() < 0))) // GOOD + return value; + return 0; +} + +int compound_assignment_without_comparison() { + int value = ~0; + if ((value &= get_value())) // GOOD + return value; + return 0; +} + +int switch_expression() { + int value; + switch (value = get_value() < 0) { // GOOD: This query only covers branching conditions. + case 0: + return value; + default: + return 0; + } +} + +#define EXPLICIT_CHECK(VALUE) \ + if (((VALUE) = get_value()) < 0) return (VALUE) + +int explicit_macro_condition() { + int value; + EXPLICIT_CHECK(value); // GOOD + return 0; +} + +template +int never_instantiated_template(T input) { + int value; + if ((value = input < 0)) // GOOD: Uninstantiated template code is excluded. + return value; + return 0; +} + +int unevaluated_assignment() { + int value; + if (sizeof(value = get_value() < 0)) // GOOD: The assignment is unevaluated. + return value; + return 0; +} + +int constant_assignment() { + int value; + if ((value = 0)) // GOOD: The right-hand side is not a comparison. + return value; + return 0; +} + +int explicit_compound_shift_then_compare() { + int value = 1; + if ((value <<= get_other_value()) > 0) // GOOD + return value; + return 0; +} + +int boolean_result_assignment() { + bool negative; + if ((negative = get_value() < 0)) // GOOD: Assigning a comparison result to a Boolean is natural. + return negative; + return 0; +} + +int boolean_result_compound_assignment() { + bool seen = false; + if ((seen |= get_value() < 0)) // GOOD: Accumulating a comparison result in a Boolean is natural. + return seen; + return 0; +} + +int explicit_static_cast_of_comparison() { + int value; + if ((value = static_cast(get_value() < 0))) // GOOD: The cast explicitly groups the comparison. + return value; + return 0; +} + +int explicit_functional_cast_of_comparison() { + int value; + if ((value = int(get_value() < 0))) // GOOD: The cast explicitly groups the comparison. + return value; + return 0; +} + +template +int instantiated_template_body(T input) { + int value; + if ((value = input < 0)) // $ Alert // BAD + return value; + return 0; +} + +int instantiate_template() { + return instantiated_template_body(get_value()); +} + +struct Comparable { + int value; +}; + +bool operator<(Comparable left, int right) { + return left.value < right; +} + +int overloaded_comparison() { + Comparable input = {get_value()}; + int value; + if ((value = input < 0)) // $ MISSING: Alert // BAD [NOT DETECTED]: overloaded operators are outside this query's scope. + return value; + return 0; +} + +int assignment_as_call_argument() { + int value; + if (identity(value = get_value() < 0)) // $ Alert // BAD: The ambiguous syntax is still in a condition. + return value; + return 0; +} + +int discarded_assignment_in_comma_expression() { + int value; + if ((value = get_value() < 0, get_other_value())) // $ Alert // BAD: Still ambiguous syntax in a condition. + return value; + return 0; +} + +int assignment_in_lambda_body() { + int value; + if ([&]() { + value = get_value() < 0; // GOOD: The lambda body is not the surrounding condition. + return true; + }()) + return value; + return 0; +} From 6a37610714a8aab8d275de0dfca0045f625be5ca Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 20 Aug 2026 20:29:11 +0100 Subject: [PATCH 0445/2098] JS: Add 'merge-descriptors' test. --- .../library-tests/Extend/ExtendCalls.expected | 23 ++++++++++--------- .../ql/test/library-tests/Extend/package.json | 1 + .../ql/test/library-tests/Extend/tst.js | 1 + 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/javascript/ql/test/library-tests/Extend/ExtendCalls.expected b/javascript/ql/test/library-tests/Extend/ExtendCalls.expected index a4c66634f7cb..1b4648c9f83c 100644 --- a/javascript/ql/test/library-tests/Extend/ExtendCalls.expected +++ b/javascript/ql/test/library-tests/Extend/ExtendCalls.expected @@ -29,17 +29,18 @@ | tst.js:64:1:64:48 | checkSh ... arg())) | OK | | tst.js:65:1:65:54 | checkSh ... arg())) | OK | | tst.js:66:1:66:45 | checkSh ... arg())) | OK | -| tst.js:67:1:67:52 | checkSh ... arg())) | OK | -| tst.js:68:1:68:53 | checkSh ... arg())) | OK | +| tst.js:67:1:67:57 | checkSh ... arg())) | Not an extend call | +| tst.js:68:1:68:52 | checkSh ... arg())) | OK | | tst.js:69:1:69:53 | checkSh ... arg())) | OK | -| tst.js:70:1:70:55 | checkSh ... arg())) | OK | -| tst.js:71:1:71:52 | checkSh ... arg())) | OK | -| tst.js:72:1:72:51 | checkSh ... arg())) | OK | +| tst.js:70:1:70:53 | checkSh ... arg())) | OK | +| tst.js:71:1:71:55 | checkSh ... arg())) | OK | +| tst.js:72:1:72:52 | checkSh ... arg())) | OK | | tst.js:73:1:73:51 | checkSh ... arg())) | OK | -| tst.js:74:1:74:53 | checkSh ... arg())) | OK | +| tst.js:74:1:74:51 | checkSh ... arg())) | OK | | tst.js:75:1:75:53 | checkSh ... arg())) | OK | -| tst.js:79:1:79:45 | checkSh ... arg())) | OK | -| tst.js:80:1:80:55 | checkSh ... arg())) | OK | -| tst.js:81:1:81:51 | checkSh ... arg())) | OK | -| tst.js:85:1:85:44 | checkDe ... arg())) | OK | -| tst.js:86:1:86:61 | checkDe ... arg())) | OK | +| tst.js:76:1:76:53 | checkSh ... arg())) | OK | +| tst.js:80:1:80:45 | checkSh ... arg())) | OK | +| tst.js:81:1:81:55 | checkSh ... arg())) | OK | +| tst.js:82:1:82:51 | checkSh ... arg())) | OK | +| tst.js:86:1:86:44 | checkDe ... arg())) | OK | +| tst.js:87:1:87:61 | checkDe ... arg())) | OK | diff --git a/javascript/ql/test/library-tests/Extend/package.json b/javascript/ql/test/library-tests/Extend/package.json index dd73e8e0a5ec..c18a62e2c71e 100644 --- a/javascript/ql/test/library-tests/Extend/package.json +++ b/javascript/ql/test/library-tests/Extend/package.json @@ -17,6 +17,7 @@ "lodash.mergewith": "^4.6.1", "merge": "^1.2.0", "merge-deep": "^3.0.2", + "merge-descriptors": "^1.0.3", "merge-options": "^1.0.1", "mixin-deep": "^2.0.0", "mixin-object": "^3.0.0", diff --git a/javascript/ql/test/library-tests/Extend/tst.js b/javascript/ql/test/library-tests/Extend/tst.js index 500178e3e5d3..dc92a2564efc 100644 --- a/javascript/ql/test/library-tests/Extend/tst.js +++ b/javascript/ql/test/library-tests/Extend/tst.js @@ -64,6 +64,7 @@ checkShallow(Object.assign(base(), arg())); checkShallow(require("defaults")(base(), arg())); checkShallow(require("extend-shallow")(base(), arg())); checkShallow(require("merge")(base(), arg())); +checkShallow(require("merge-descriptors")(base(), arg())); checkShallow(require("mixin-object")(base(), arg())); checkShallow(require("object-assign")(base(), arg())); checkShallow(require("object.assign")(base(), arg())); From 77877e047e35cd16e350fea0b6fcd84007c25c3c Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 20 Aug 2026 20:31:28 +0100 Subject: [PATCH 0446/2098] JS: Model 'merge-descriptors' as a shallow extender and accept test changes. --- javascript/ql/lib/semmle/javascript/Extend.qll | 13 +++++++++++++ .../test/library-tests/Extend/ExtendCalls.expected | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/javascript/ql/lib/semmle/javascript/Extend.qll b/javascript/ql/lib/semmle/javascript/Extend.qll index b871a74a03b7..436d961aab57 100644 --- a/javascript/ql/lib/semmle/javascript/Extend.qll +++ b/javascript/ql/lib/semmle/javascript/Extend.qll @@ -146,6 +146,19 @@ private class ExtendCallShallow extends ExtendCall { override predicate isDeep() { none() } } +/** A shallow extend call of form `mergeDescriptors(dst, src)`. */ +private class MergeDescriptorsCall extends ExtendCall { + MergeDescriptorsCall() { + this = DataFlow::moduleImport("merge-descriptors").getACall() + } + + override DataFlow::Node getASourceOperand() { result = this.getArgument(1) } + + override DataFlow::Node getDestinationOperand() { result = this.getArgument(0) } + + override predicate isDeep() { none() } +} + /** * A shallow extend call of form `extend(src1, src2, ...)`. */ diff --git a/javascript/ql/test/library-tests/Extend/ExtendCalls.expected b/javascript/ql/test/library-tests/Extend/ExtendCalls.expected index 1b4648c9f83c..f77739770720 100644 --- a/javascript/ql/test/library-tests/Extend/ExtendCalls.expected +++ b/javascript/ql/test/library-tests/Extend/ExtendCalls.expected @@ -29,7 +29,7 @@ | tst.js:64:1:64:48 | checkSh ... arg())) | OK | | tst.js:65:1:65:54 | checkSh ... arg())) | OK | | tst.js:66:1:66:45 | checkSh ... arg())) | OK | -| tst.js:67:1:67:57 | checkSh ... arg())) | Not an extend call | +| tst.js:67:1:67:57 | checkSh ... arg())) | OK | | tst.js:68:1:68:52 | checkSh ... arg())) | OK | | tst.js:69:1:69:53 | checkSh ... arg())) | OK | | tst.js:70:1:70:53 | checkSh ... arg())) | OK | From 0d8e9516c2b702c33cdb5bccbccede3066b4d752 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Wed, 19 Aug 2026 15:25:36 +0200 Subject: [PATCH 0447/2098] Data flow: Track access path lengths in stages 3 and 4 --- .../codeql/dataflow/internal/DataFlowImpl.qll | 95 +++++++++++-------- .../dataflow/internal/DataFlowImplCommon.qll | 39 +++++--- 2 files changed, 79 insertions(+), 55 deletions(-) diff --git a/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll b/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll index c6bdcc206b45..6cdad2d8cfbb 100644 --- a/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll +++ b/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll @@ -370,6 +370,9 @@ module MakeImpl Lang> { } class Ap { + /** Gets the tracked length of this access path, if any. */ + int length(); + string toString(); } @@ -563,10 +566,10 @@ module MakeImpl Lang> { pragma[nomagic] private int getAnApLengthLowerBound(Ap ap) { - accessPathLimit() > 1 and // `accessPathLimit() <= 1` is already checked in stages 1 and 2 - ap instanceof ApNil and - result = 0 + accessPathLimit() != 0 and // `accessPathLimit() = 0` is already checked in `useFieldFlow` + result = ap.length() or + not exists(ap.length()) and exists(Ap tail | fwdFlowConsCand(_, ap, _, _, tail) and ap != tail and // no need to report a longer length @@ -609,9 +612,7 @@ module MakeImpl Lang> { fwdFlowStore(_, _, ap0, _, c, t, stored, node, cc, summaryCtx) and ap = apCons(c, ap0) and apa = getApprox(ap) and - if accessPathLimit() > 1 - then getAnApLengthLowerBound(ap0) < accessPathLimit() - else any() + getAnApLengthLowerBound(ap0) < accessPathLimit() ) or // read @@ -1339,10 +1340,10 @@ module MakeImpl Lang> { pragma[nomagic] private int getAnApLengthLowerBoundRev(Ap ap) { - accessPathLimit() > 1 and // `accessPathLimit() <= 1` is already checked in stages 1 and 2 - ap instanceof ApNil and - result = 0 + accessPathLimit() != 0 and // `accessPathLimit() = 0` is already checked in `useFieldFlow` + result = ap.length() or + not exists(ap.length()) and exists(Ap tail | revFlowConsCand(ap, _, tail) and ap != tail and // no need to report a longer length @@ -1388,9 +1389,7 @@ module MakeImpl Lang> { exists(Nd mid, Ap ap0 | revFlow(mid, returnCtx, returnAp, ap0) and readStepFwd(node, ap, _, mid, ap0) and - if accessPathLimit() > 1 - then getAnApLengthLowerBoundRev(ap0) < accessPathLimit() - else any() + getAnApLengthLowerBoundRev(ap0) < accessPathLimit() ) or // flow into a callable @@ -2770,7 +2769,9 @@ module MakeImpl Lang> { class Typ = Unit; - class Ap = Boolean; + class Ap extends Boolean { + int length() { this = false and result = 0 } + } class ApNil extends Ap { ApNil() { this = false } @@ -2859,12 +2860,19 @@ module MakeImpl Lang> { Typ getTyp(Type t) { any() } bindingset[c, tail] - Ap apCons(Content c, Ap tail) { result.getAHead() = c and exists(tail) } + Ap apCons(Content c, Ap tail) { + exists(int length | result.getAHead(length) = c | + length = 1 and + tail instanceof ApNil + or + tail = TApproxFrontHead(_, length - 1) + ) + } class ApHeadContent = ContentApprox; pragma[noinline] - ApHeadContent getHeadContent(Ap ap) { result = ap.getHead() } + ApHeadContent getHeadContent(Ap ap) { result = ap.getHead(_) } predicate projectToHeadContent = getContentApproxCached/1; @@ -2910,7 +2918,7 @@ module MakeImpl Lang> { PrevStage::revFlow(node) and PrevStage::readStepCand(_, c, _) and Stage1::expectsContentEx(node, c) and - c = ap.getAHead() + c = ap.getAHead(_) ) } @@ -2961,12 +2969,19 @@ module MakeImpl Lang> { Typ getTyp(Type t) { any() } bindingset[c, tail] - Ap apCons(Content c, Ap tail) { result.getHead() = c and exists(tail) } + Ap apCons(Content c, Ap tail) { + exists(int length | result.getHead(length) = c | + length = 1 and + tail instanceof ApNil + or + tail = TFrontHead(_, length - 1) + ) + } class ApHeadContent = Content; pragma[noinline] - ApHeadContent getHeadContent(Ap ap) { result = ap.getHead() } + ApHeadContent getHeadContent(Ap ap) { result = ap.getHead(_) } ApHeadContent projectToHeadContent(Content c) { result = c } @@ -3012,11 +3027,11 @@ module MakeImpl Lang> { // When `node` is the target of a store, we interpret `clearsContent` as // only pertaining to _earlier_ store steps. In this case, we need to postpone // checking `clearsContent` to the step creation. - clearContent(node, ap.getHead(), false) + clearContent(node, ap.getHead(_), false) } pragma[nomagic] - private predicate clearExceptStore(Nd node, Ap ap) { clearContent(node, ap.getHead(), true) } + private predicate clearExceptStore(Nd node, Ap ap) { clearContent(node, ap.getHead(_), true) } pragma[nomagic] private predicate expectsContentCand(Nd node, Ap ap) { @@ -3024,7 +3039,7 @@ module MakeImpl Lang> { PrevStage::revFlow(node) and PrevStage::readStepCand(_, c, _) and Stage1::expectsContentEx(node, c) and - c = ap.getHead() + c = ap.getHead(_) ) } @@ -3059,9 +3074,9 @@ module MakeImpl Lang> { tails = strictcount(AccessPathFront apf | Stage4::consCand(c, apf)) and nodes = strictcount(Nd n | - Stage4::revFlow(n, any(AccessPathFrontHead apf | apf.getHead() = c)) + Stage4::revFlow(n, any(AccessPathFrontHead apf | apf.getHead(_) = c)) or - Stage4::nodeMayUseSummary(n, any(AccessPathFrontHead apf | apf.getHead() = c)) + Stage4::nodeMayUseSummary(n, any(AccessPathFrontHead apf | apf.getHead(_) = c)) ) and accessPathApproxCostLimits(apLimit, tupleLimit) and apLimit < tails and @@ -3077,7 +3092,7 @@ module MakeImpl Lang> { not expensiveLen2unfolding(c) } or TConsCons(Content c1, Content c2, int len) { - Stage4::consCand(c1, TFrontHead(c2)) and + Stage4::consCand(c1, TFrontHead(c2, _)) and len in [2 .. Config::accessPathLimit()] and not expensiveLen2unfolding(c1) } or @@ -3098,7 +3113,7 @@ module MakeImpl Lang> { abstract Content getHead(); - abstract int len(); + abstract int length(); abstract AccessPathFront getFront(); @@ -3111,7 +3126,7 @@ module MakeImpl Lang> { override Content getHead() { none() } - override int len() { result = 0 } + override int length() { result = 0 } override AccessPathFront getFront() { result = TFrontNil() } @@ -3129,9 +3144,9 @@ module MakeImpl Lang> { override Content getHead() { result = c } - override int len() { result = 1 } + override int length() { result = 1 } - override AccessPathFront getFront() { result = TFrontHead(c) } + override AccessPathFront getFront() { result = TFrontHead(c, 1) } override predicate isCons(Content head, AccessPathApprox tail) { head = c and tail = TNil() } } @@ -3151,9 +3166,9 @@ module MakeImpl Lang> { override Content getHead() { result = c1 } - override int len() { result = len } + override int length() { result = len } - override AccessPathFront getFront() { result = TFrontHead(c1) } + override AccessPathFront getFront() { result = TFrontHead(c1, len) } override predicate isCons(Content head, AccessPathApprox tail) { head = c1 and @@ -3182,14 +3197,14 @@ module MakeImpl Lang> { override Content getHead() { result = c } - override int len() { result = len } + override int length() { result = len } - override AccessPathFront getFront() { result = TFrontHead(c) } + override AccessPathFront getFront() { result = TFrontHead(c, len) } override predicate isCons(Content head, AccessPathApprox tail) { head = c and ( - exists(Content c2 | Stage4::consCand(c, TFrontHead(c2)) | + exists(Content c2 | Stage4::consCand(c, TFrontHead(c2, len - 1)) | tail = TConsCons(c2, _, len - 1) or len = 2 and @@ -3288,7 +3303,7 @@ module MakeImpl Lang> { pragma[nomagic] private predicate stage5ConsCand(Content c, AccessPathFront apf, int len) { - Stage5::consCand(c, any(AccessPathApprox ap | ap.getFront() = apf and ap.len() = len - 1)) + Stage5::consCand(c, any(AccessPathApprox ap | ap.getFront() = apf and ap.length() = len - 1)) } /** @@ -3297,7 +3312,7 @@ module MakeImpl Lang> { private int count1to2unfold(AccessPathApproxCons1 apa) { exists(Content c, int len | c = apa.getHead() and - len = apa.len() and + len = apa.length() and result = strictcount(AccessPathFront apf | stage5ConsCand(c, apf, len)) ) } @@ -3392,7 +3407,7 @@ module MakeImpl Lang> { exists(AccessPathApproxCons apa, AccessPathApprox tail | evalUnfold(apa, false) and not expensiveLen1to2unfolding(apa) and - apa.len() = len and + apa.length() = len and hasTail(apa, tail) and head1 = apa.getHead() and head2 = tail.getHead() @@ -3402,7 +3417,7 @@ module MakeImpl Lang> { exists(AccessPathApproxCons apa | evalUnfold(apa, false) and expensiveLen1to2unfolding(apa) and - apa.len() = len and + apa.length() = len and head = apa.getHead() ) } @@ -3531,7 +3546,7 @@ module MakeImpl Lang> { override predicate isCons(Content head, AccessPath tail) { head = head_ and tail = tail_ } - override AccessPathFrontHead getFront() { result = TFrontHead(head_) } + override AccessPathFrontHead getFront() { result = TFrontHead(head_, this.length()) } override AccessPathApproxCons getApprox() { result = TConsNil(head_) and tail_ = TAccessPathNil() @@ -3586,7 +3601,7 @@ module MakeImpl Lang> { tail.length() = len - 1 } - override AccessPathFrontHead getFront() { result = TFrontHead(head1) } + override AccessPathFrontHead getFront() { result = TFrontHead(head1, len) } override AccessPathApproxCons getApprox() { result = TConsCons(head1, head2, len) or @@ -3618,7 +3633,7 @@ module MakeImpl Lang> { tail.length() = len - 1 } - override AccessPathFrontHead getFront() { result = TFrontHead(head_) } + override AccessPathFrontHead getFront() { result = TFrontHead(head_, len) } override AccessPathApproxCons getApprox() { result = TCons1(head_, len) } diff --git a/shared/dataflow/codeql/dataflow/internal/DataFlowImplCommon.qll b/shared/dataflow/codeql/dataflow/internal/DataFlowImplCommon.qll index c64f0edb8468..8d77198e5721 100644 --- a/shared/dataflow/codeql/dataflow/internal/DataFlowImplCommon.qll +++ b/shared/dataflow/codeql/dataflow/internal/DataFlowImplCommon.qll @@ -1797,12 +1797,12 @@ module MakeImplCommon Lang> { cached newtype TAccessPathFront = TFrontNil() or - TFrontHead(Content c) + TFrontHead(Content c, int length) { length in [1 .. accessPathLimit()] } cached newtype TApproxAccessPathFront = TApproxFrontNil() or - TApproxFrontHead(ContentApprox c) + TApproxFrontHead(ContentApprox c, int length) { length in [1 .. accessPathLimit()] } cached newtype TAccessPathFrontOption = @@ -2505,31 +2505,33 @@ module MakeImplCommon Lang> { abstract boolean toBoolNonEmpty(); - ContentApprox getHead() { this = TApproxFrontHead(result) } + abstract int length(); + + ContentApprox getHead(int length) { this = TApproxFrontHead(result, length) } pragma[nomagic] - Content getAHead() { - exists(ContentApprox cont | - this = TApproxFrontHead(cont) and - cont = getContentApproxCached(result) - ) - } + Content getAHead(int length) { this.getHead(length) = getContentApproxCached(result) } } class ApproxAccessPathFrontNil extends ApproxAccessPathFront, TApproxFrontNil { override string toString() { result = "nil" } override boolean toBoolNonEmpty() { result = false } + + override int length() { result = 0 } } class ApproxAccessPathFrontHead extends ApproxAccessPathFront, TApproxFrontHead { private ContentApprox c; + private int length; - ApproxAccessPathFrontHead() { this = TApproxFrontHead(c) } + ApproxAccessPathFrontHead() { this = TApproxFrontHead(c, length) } - override string toString() { result = c.toString() } + override string toString() { result = c + " (length: " + length + ")" } override boolean toBoolNonEmpty() { result = true } + + override int length() { result = length } } /** An optional approximated access path front. */ @@ -2549,23 +2551,30 @@ module MakeImplCommon Lang> { abstract ApproxAccessPathFront toApprox(); - Content getHead() { this = TFrontHead(result) } + abstract int length(); + + Content getHead(int length) { this = TFrontHead(result, length) } } class AccessPathFrontNil extends AccessPathFront, TFrontNil { override string toString() { result = "nil" } override ApproxAccessPathFront toApprox() { result = TApproxFrontNil() } + + override int length() { result = 0 } } class AccessPathFrontHead extends AccessPathFront, TFrontHead { private Content c; + private int length; + + AccessPathFrontHead() { this = TFrontHead(c, length) } - AccessPathFrontHead() { this = TFrontHead(c) } + override string toString() { result = c + " (length: " + length + ")" } - override string toString() { result = c.toString() } + override ApproxAccessPathFront toApprox() { result.getAHead(length) = c } - override ApproxAccessPathFront toApprox() { result.getAHead() = c } + override int length() { result = length } } /** An optional access path front. */ From 22ad8c7dc130d7dbde025590985cd17aa315cb1f Mon Sep 17 00:00:00 2001 From: hugo-syn Date: Fri, 21 Aug 2026 09:51:56 +0200 Subject: [PATCH 0448/2098] C#: model Delta.GetInstance() as a MaD summary instead of QL Per review feedback on #22384, replace the hand-written DeltaGetInstanceMethod/DeltaGetInstanceTaintStep taint step with a Models-as-Data summaryModel row for both the Microsoft.AspNet.OData and Microsoft.AspNetCore.OData.Deltas variants of Delta.GetInstance(). --- .../lib/ext/Microsoft.AspNet.OData.model.yml | 7 +++++++ .../semmle/code/csharp/frameworks/OData.qll | 19 ------------------- 2 files changed, 7 insertions(+), 19 deletions(-) create mode 100644 csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml diff --git a/csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml b/csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml new file mode 100644 index 000000000000..ede706dd194a --- /dev/null +++ b/csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml @@ -0,0 +1,7 @@ +extensions: + - addsTo: + pack: codeql/csharp-all + extensible: summaryModel + data: + - ["Microsoft.AspNet.OData", "Delta", True, "GetInstance", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "GetInstance", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll index 80917322f441..4a366c12ce64 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll @@ -86,14 +86,6 @@ class DeltaMutatingMethod extends Method { } } -/** The `GetInstance` method on `Delta`. */ -class DeltaGetInstanceMethod extends Method { - DeltaGetInstanceMethod() { - this.getDeclaringType() instanceof DeltaClass and - this.hasName("GetInstance") - } -} - private class CandidateODataMember extends Member { CandidateODataMember() { this.isPublic() and @@ -147,14 +139,3 @@ private class DeltaMutatingCallTaintStep extends AdditionalTaintStep { ) } } - -/** `Delta.GetInstance()` returns the tracked entity, carrying the same taint as the `Delta` itself. */ -private class DeltaGetInstanceTaintStep extends AdditionalTaintStep { - override predicate step(DataFlow::Node node1, DataFlow::Node node2) { - exists(MethodCall mc | - mc.getTarget().getUnboundDeclaration() instanceof DeltaGetInstanceMethod and - node1.asExpr() = mc.getQualifier() and - node2.asExpr() = mc - ) - } -} From a44bfec092d2c71bedea0851567bd89a25f9b822 Mon Sep 17 00:00:00 2001 From: hugo-syn Date: Fri, 21 Aug 2026 09:53:09 +0200 Subject: [PATCH 0449/2098] C#: reuse CandidateMemberToTaint from Remote.qll in OData.qll Per review feedback on #22384, OData.qll's CandidateODataMember was an exact copy of CandidateMemberToTaint from Remote.qll. Make that class public and import it instead of duplicating it. --- .../semmle/code/csharp/frameworks/OData.qll | 20 ++----------------- .../security/dataflow/flowsources/Remote.qll | 3 ++- 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll index 4a366c12ce64..3065b7127cc5 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll @@ -21,6 +21,7 @@ import csharp private import semmle.code.csharp.commons.Collections private import semmle.code.csharp.dataflow.FlowSteps private import semmle.code.csharp.dataflow.internal.DataFlowPrivate +private import semmle.code.csharp.security.dataflow.flowsources.Remote /** The `ODataActionParameters` dictionary type, across OData library versions. */ class ODataActionParametersClass extends Class { @@ -86,23 +87,6 @@ class DeltaMutatingMethod extends Method { } } -private class CandidateODataMember extends Member { - CandidateODataMember() { - this.isPublic() and - not this.isStatic() and - ( - this = - any(Property p | - p.isAutoImplemented() and - p.getGetter().isPublic() and - p.getSetter().isPublic() - ) - or - this = any(Field f | f.isPublic()) - ) - } -} - /** * Taint members (transitively) on types used in * 1. Casts, `as`-conversions, or type tests applied to `ODataActionParameters` values. @@ -112,7 +96,7 @@ private class CandidateODataMember extends Member { * trade-off `AspNetRemoteFlowSourceMember` (`Remote.qll`) makes for ASP.NET * action-method parameters. */ -private class ODataBoundMember extends TaintTracking::TaintedMember, CandidateODataMember { +private class ODataBoundMember extends TaintTracking::TaintedMember, CandidateMemberToTaint { ODataBoundMember() { exists(Type t, Type t0 | t = this.getDeclaringType() | (t = t0 or t = t0.(CollectionType).getElementType()) and diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Remote.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Remote.qll index 68c06a1828de..3eac08b1bd93 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Remote.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Remote.qll @@ -117,7 +117,8 @@ class AspNetServiceRemoteFlowSource extends AspNetRemoteFlowSource, DataFlow::Pa override string getSourceType() { result = "ASP.NET web service input" } } -private class CandidateMemberToTaint extends Member { +/** A public, non-static, auto-implemented property or field, candidate for taint-tracking. */ +class CandidateMemberToTaint extends Member { CandidateMemberToTaint() { this.isPublic() and not this.isStatic() and From 2c17dd2149fe884c18a08f82ebc136431c7016dc Mon Sep 17 00:00:00 2001 From: hugo-syn Date: Fri, 21 Aug 2026 09:53:28 +0200 Subject: [PATCH 0450/2098] C#: move OData test types into test/resources/stubs Per review feedback on #22384, keep the ODataActionParameters/Delta stub implementations out of the test .cs file and store them in test/resources/stubs instead, following the pattern used by other frameworks (e.g. JsonNET, Aws). The test now loads the stub project via an options file and relies on no .dll files. --- .../library-tests/frameworks/OData/OData.cs | 26 ------------------- .../frameworks/OData/OData.expected | 18 ++++++------- .../library-tests/frameworks/OData/options | 2 ++ .../7.7.5/Microsoft.AspNet.OData.cs | 19 ++++++++++++++ .../7.7.5/Microsoft.AspNet.OData.csproj | 12 +++++++++ 5 files changed, 42 insertions(+), 35 deletions(-) create mode 100644 csharp/ql/test/library-tests/frameworks/OData/options create mode 100644 csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.cs create mode 100644 csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.csproj diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.cs b/csharp/ql/test/library-tests/frameworks/OData/OData.cs index 71a5c2218b68..ab06179ab79a 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.cs +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.cs @@ -1,29 +1,3 @@ -using System.Collections.Generic; - -namespace Microsoft.AspNet.OData -{ - public class ODataActionParameters : Dictionary - { - } - - public class Delta where TStructuralType : class - { - private TStructuralType instance; - - public Delta() { instance = default(TStructuralType); } - - public TStructuralType GetInstance() => instance; - - public void Patch(TStructuralType original) { } - - public void Put(TStructuralType original) { } - - public void CopyChangedValues(TStructuralType original) { } - - public void CopyUnchangedValues(TStructuralType original) { } - } -} - namespace Test { using Microsoft.AspNet.OData; diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.expected b/csharp/ql/test/library-tests/frameworks/OData/OData.expected index a9a2796c0ca5..fad59d4a9a9b 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.expected +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.expected @@ -1,9 +1,9 @@ -| OData.cs:72:55:72:64 | parameters | OData.cs:75:18:75:23 | access to local variable entity | -| OData.cs:72:55:72:64 | parameters | OData.cs:76:18:76:28 | access to property Name | -| OData.cs:72:55:72:64 | parameters | OData.cs:77:18:77:31 | access to property Content | -| OData.cs:72:55:72:64 | parameters | OData.cs:78:18:78:38 | access to property Owner | -| OData.cs:72:55:72:64 | parameters | OData.cs:81:22:81:28 | access to property Owner | -| OData.cs:85:55:85:64 | parameters | OData.cs:91:26:91:35 | access to property Label | -| OData.cs:85:55:85:64 | parameters | OData.cs:98:22:98:34 | access to property Category | -| OData.cs:102:39:102:43 | delta | OData.cs:105:18:105:30 | access to property Name | -| OData.cs:108:45:108:49 | delta | OData.cs:111:18:111:23 | access to property Name | +| OData.cs:46:55:46:64 | parameters | OData.cs:49:18:49:23 | access to local variable entity | +| OData.cs:46:55:46:64 | parameters | OData.cs:50:18:50:28 | access to property Name | +| OData.cs:46:55:46:64 | parameters | OData.cs:51:18:51:31 | access to property Content | +| OData.cs:46:55:46:64 | parameters | OData.cs:52:18:52:38 | access to property Owner | +| OData.cs:46:55:46:64 | parameters | OData.cs:55:22:55:28 | access to property Owner | +| OData.cs:59:55:59:64 | parameters | OData.cs:65:26:65:35 | access to property Label | +| OData.cs:59:55:59:64 | parameters | OData.cs:72:22:72:34 | access to property Category | +| OData.cs:76:39:76:43 | delta | OData.cs:79:18:79:30 | access to property Name | +| OData.cs:82:45:82:49 | delta | OData.cs:85:18:85:23 | access to property Name | diff --git a/csharp/ql/test/library-tests/frameworks/OData/options b/csharp/ql/test/library-tests/frameworks/OData/options new file mode 100644 index 000000000000..357763232dbe --- /dev/null +++ b/csharp/ql/test/library-tests/frameworks/OData/options @@ -0,0 +1,2 @@ +semmle-extractor-options: /nostdlib /noconfig +semmle-extractor-options: --load-sources-from-project:${testdir}/../../../resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.csproj diff --git a/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.cs b/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.cs new file mode 100644 index 000000000000..2f6673628748 --- /dev/null +++ b/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.cs @@ -0,0 +1,19 @@ +// This file contains auto-generated code. +// Generated from `Microsoft.AspNet.OData, Version=7.7.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35`. +namespace Microsoft.AspNet.OData +{ + public class ODataActionParameters : System.Collections.Generic.Dictionary + { + public ODataActionParameters() => throw null; + } + + public class Delta where TStructuralType : class + { + public Delta() => throw null; + public TStructuralType GetInstance() => throw null; + public void Patch(TStructuralType original) => throw null; + public void Put(TStructuralType original) => throw null; + public void CopyChangedValues(TStructuralType original) => throw null; + public void CopyUnchangedValues(TStructuralType original) => throw null; + } +} diff --git a/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.csproj b/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.csproj new file mode 100644 index 000000000000..2be6995cd169 --- /dev/null +++ b/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.csproj @@ -0,0 +1,12 @@ + + + net10.0 + true + bin\ + false + + + + + + From 9c3a9b48187dc8e12f517464372ff9ed5d5423d4 Mon Sep 17 00:00:00 2001 From: hugo-syn Date: Fri, 21 Aug 2026 09:53:39 +0200 Subject: [PATCH 0451/2098] C#: fix DeltaClass doc comment to not name a specific type parameter Per review feedback on #22384, the doc comment named the type parameter TStructuralType, but the AspNetCore variant of Delta names it T. Refer to the unbound generic as \`Delta\`1\`\` instead. --- csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll index 3065b7127cc5..936a50d6cf30 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll @@ -42,7 +42,7 @@ private predicate isODataParameterValue(Expr e) { TaintTracking::localExprTaint(any(ODataActionParameterRead r), e) } -/** The generic `Delta` change-tracking class, across OData library versions. */ +/** The generic ``Delta`1`` change-tracking class, across OData library versions. */ class DeltaClass extends UnboundGenericClass { DeltaClass() { this.getNumberOfTypeParameters() = 1 and From 6a9e2d514f6c20b0fa0eeb91145b1fc236afacb1 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Thu, 20 Aug 2026 15:07:23 +0200 Subject: [PATCH 0452/2098] Go: Only output origin constraints for methods Also mutex protect the two global maps. Go `map`s are not are not thread safe in the case of write/writes and read/writes. --- go/extractor/extractor.go | 114 ++++++++++++++---- .../semmle/go/Function/TypeParamType.expected | 2 - 2 files changed, 90 insertions(+), 26 deletions(-) diff --git a/go/extractor/extractor.go b/go/extractor/extractor.go index 5d33576e03e9..fe798bc9f406 100644 --- a/go/extractor/extractor.go +++ b/go/extractor/extractor.go @@ -38,8 +38,16 @@ type typeParamParentEntry struct { isFromReceiver bool } +// typeParamMutex protects typeParamParent. +var typeParamParentMutex sync.RWMutex + var typeParamParent map[*types.TypeParam]typeParamParentEntry = make(map[*types.TypeParam]typeParamParentEntry) +// typeParamMutex protects typeParamOrigin. +var typeParamOriginMutex sync.RWMutex + +var typeParamOrigin map[*types.TypeParam]*types.TypeParam = make(map[*types.TypeParam]*types.TypeParam) + func init() { // this sets the number of threads that the Go runtime will spawn; this is separate // from the number of goroutines that the program spawns, which are scheduled into @@ -1658,29 +1666,7 @@ func extractType(tw *trap.Writer, tp types.Type) trap.Label { for i := 0; i < origintp.NumMethods(); i++ { meth := origintp.Method(i).Origin() extractMethod(tw, meth) - - // Consider a generic struct and a generic method: - // - // type S[P any] struct{} - // func (*S[P]) m[Q any](x Q) {} - // - // If we have a variable 's' of type 'S[int]' and the expression - // 's.m[string]("")', then the type of the selector expression 's.m' - // is ' func(Q)'. The method 'm' here is an instantiation of the - // declaration, which has its own type with type parameter 'Q'. - // As we do not extract method instantiations, 'populateTypeParamParents' - // does not automatically get called for the type parameter 'Q' - // from the instantiation of 'm'. To compensate, we add the type - // parameters here. - // - // As a parent we use the origin method. This suffices, as the name - // and index of the type parameter in the instantiation will be - // identical to those of the uninstantiated method, and as only - // these two properties will be extracted for a type parameter. - if tp.Method(i) != meth { - signature := tp.Method(i).Type().(*types.Signature) - populateTypeParamParents(signature.TypeParams(), meth, false) - } + populateTypeParamParentsAndOrigins(tp.Method(i), meth) } underlyingInterface, underlyingIsInterface := underlying.(*types.Interface) @@ -1704,7 +1690,8 @@ func extractType(tw *trap.Writer, tp types.Type) trap.Label { case *types.TypeParam: kind = dbscheme.TypeParamType.Index() parentlbl, isReceiverChild := getTypeParamParentLabel(tw, tp) - constraintLabel := extractType(tw, tp.Constraint()) + constraint := getTypeParamOrigin(tp).Constraint() + constraintLabel := extractType(tw, constraint) dbscheme.TypeParamTable.Emit(tw, lbl, tp.Obj().Name(), constraintLabel, parentlbl, tp.Index(), isReceiverChild) case *types.Union: kind = dbscheme.TypeSetLiteral.Index() @@ -2062,7 +2049,10 @@ func getObjectBeingUsed(tw *trap.Writer, ident *ast.Ident) types.Object { } func getTypeParamParentLabel(tw *trap.Writer, tp *types.TypeParam) (trap.Label, bool) { + typeParamParentMutex.RLock() entry, exists := typeParamParent[tp] + typeParamParentMutex.RUnlock() + if !exists { log.Fatalf("Parent of type parameter does not exist: %s %s", tp.String(), tp.Constraint().String()) } @@ -2074,6 +2064,9 @@ func getTypeParamParentLabel(tw *trap.Writer, tp *types.TypeParam) (trap.Label, } func setTypeParamParent(tp *types.TypeParam, parent types.Object, isFromReceiver bool) { + typeParamParentMutex.Lock() + defer typeParamParentMutex.Unlock() + entry, exists := typeParamParent[tp] newEntry := typeParamParentEntry{parent, isFromReceiver} if !exists { @@ -2121,3 +2114,76 @@ func checkObjectNotSpecialized(obj types.Object) { } } } + +// getTypeParamOrigin returns the origin type parameter for a type parameter +// from an instantiated method. +func getTypeParamOrigin(tp *types.TypeParam) *types.TypeParam { + typeParamOriginMutex.RLock() + origin, exists := typeParamOrigin[tp] + typeParamOriginMutex.RUnlock() + + if exists { + return origin + } else { + return tp + } +} + +// populateTypeParamParentsAndOrigins records for each type parameter of a method +// the origin parent and type parameter. +// +// Consider a generic struct and a generic method: +// +// type S[P any] struct{} +// func (*S[P]) m[Q ~P](x Q) {} +// +// If we have a variable 's' of type 'S[int]' and the expression 's.m[int](42)', +// then the type of the selector expression 's.m' is 'func[Q ~int](Q)'. The +// method 'm' here is an instantiation of the declaration, which has its own +// type with type parameter 'Q' with constraint 'interface { ~int }'. As we +// do not extract method instantiations, but only their origins, we want to +// match this behavior for the constraints of instantiated type parameter, and +// record their origin. Moreover, not extracting instantiations also means that +// 'populateTypeParamParents' does not automatically get called on their type +// parameters. To compensate, we add the type params here by calling +// `setTypeParamParent`. +// +// As the parent of a type parameter use the origin method. This suffices, as +// the name and index of the type parameter in the instantiation will be +// identical to those of the uninstantiated method, and as only a constraint and +// these two properties will be extracted for a type parameter. +func populateTypeParamParentsAndOrigins(meth *types.Func, originmeth *types.Func) { + if meth == originmeth { + return + } + + typeparams := meth.Type().(*types.Signature).TypeParams() + populateTypeParamParents(typeparams, originmeth, false) + + origintypeparams := originmeth.Type().(*types.Signature).TypeParams() + populateTypeParamOrigins(meth, typeparams, origintypeparams) +} + +func populateTypeParamOrigins(meth *types.Func, typeparams *types.TypeParamList, origintypeparams *types.TypeParamList) { + if typeparams.Len() != origintypeparams.Len() { + log.Fatalf("Method instantiation %s has %d type parameters, origin has %d", + meth, typeparams.Len(), origintypeparams.Len()) + } + + for j := 0; j < typeparams.Len(); j++ { + setTypeParamOrigin(typeparams.At(j), origintypeparams.At(j)) + } +} + +func setTypeParamOrigin(typeparam *types.TypeParam, origintypeparam *types.TypeParam) { + typeParamOriginMutex.Lock() + defer typeParamOriginMutex.Unlock() + + entry, exists := typeParamOrigin[typeparam] + if !exists { + typeParamOrigin[typeparam] = origintypeparam + } else if entry != origintypeparam { + log.Fatalf("Origin of type parameter '%s %s' being set to a different value: '%s' vs '%s'", + typeparam.String(), typeparam.Constraint().String(), entry.String(), origintypeparam.String()) + } +} diff --git a/go/ql/test/library-tests/semmle/go/Function/TypeParamType.expected b/go/ql/test/library-tests/semmle/go/Function/TypeParamType.expected index bf4a67b8d096..6a3d9e0091db 100644 --- a/go/ql/test/library-tests/semmle/go/Function/TypeParamType.expected +++ b/go/ql/test/library-tests/semmle/go/Function/TypeParamType.expected @@ -55,8 +55,6 @@ numberOfTypeParameters | codeql-go-tests/function.StructForGenericMethod2.GenericMethod2 | 0 | from receiver | P3 | interface { } | | codeql-go-tests/function.StructWithDependentBound | 0 | | P5 | interface { } | | codeql-go-tests/function.StructWithDependentBound.GenericMethodWithDependentBound | 0 | | P7 | interface { ~[]P6 } | -| codeql-go-tests/function.StructWithDependentBound.GenericMethodWithDependentBound | 0 | | P7 | interface { ~[]int } | -| codeql-go-tests/function.StructWithDependentBound.GenericMethodWithDependentBound | 0 | | P7 | interface { ~[]string } | | codeql-go-tests/function.StructWithDependentBound.GenericMethodWithDependentBound | 0 | from receiver | P6 | interface { } | | codeql-go-tests/function.multipleAnonymousTypeParamsFunc | 0 | | _ | interface { } | | codeql-go-tests/function.multipleAnonymousTypeParamsFunc | 1 | | _ | interface { string } | From fd39a427d87b2726e0a0fe2174b602c63774fc3c Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 21 Aug 2026 11:34:28 +0200 Subject: [PATCH 0453/2098] unified: Fix grammar --- unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index a1334ff0cd1f..33c158537077 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -436,7 +436,7 @@ private module FolderHeuristic { } /** - * Holds if `file` has a one of the definitions of the given ambiguous name. + * Holds if `file` has one of the definitions of the given ambiguous name. * * A name is considered "ambiguous" if there is more than one file exporting it. */ From 58c6e802bc8cb120655eec2fd1779fe9e99de069 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 21 Aug 2026 10:35:36 +0100 Subject: [PATCH 0454/2098] JS: Autoformat. --- javascript/ql/lib/semmle/javascript/Extend.qll | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/javascript/ql/lib/semmle/javascript/Extend.qll b/javascript/ql/lib/semmle/javascript/Extend.qll index 436d961aab57..d592929dc0ec 100644 --- a/javascript/ql/lib/semmle/javascript/Extend.qll +++ b/javascript/ql/lib/semmle/javascript/Extend.qll @@ -148,9 +148,7 @@ private class ExtendCallShallow extends ExtendCall { /** A shallow extend call of form `mergeDescriptors(dst, src)`. */ private class MergeDescriptorsCall extends ExtendCall { - MergeDescriptorsCall() { - this = DataFlow::moduleImport("merge-descriptors").getACall() - } + MergeDescriptorsCall() { this = DataFlow::moduleImport("merge-descriptors").getACall() } override DataFlow::Node getASourceOperand() { result = this.getArgument(1) } From 4e7613a30a2064eadf7570f5886a34f50d447856 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 21 Aug 2026 11:48:42 +0200 Subject: [PATCH 0455/2098] unified: Remove some unnecessary checks --- unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll | 2 -- 1 file changed, 2 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 33c158537077..dcb97b4fbae8 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -457,7 +457,6 @@ private module FolderHeuristic { * Holds if `folder` has two or more subfolders containing a definition of `name`. */ private predicate hasConflictingDefs(Folder folder, string name) { - containsDef(folder, name) and // Check for "two or more" using `exists(X) and not exists(unique(X))` containsDef(folder.getAFolder(), name) and not exists(unique(Folder child | child = folder.getAFolder() and containsDef(child, name))) @@ -482,7 +481,6 @@ private module FolderHeuristic { result = folder or result = getOutermostNonConflictingScope(folder.getParentContainer(), name) and - not isOutermostNonConflictingScope(folder, name) and containsDef(folder, name) // Prune to the subfolder actually containing the definition } From dbb692111458cb1f6ddbad9465ba49873cff9871 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 21 Aug 2026 10:38:23 +0000 Subject: [PATCH 0456/2098] Post-release preparation for codeql-cli-2.26.4 --- actions/ql/lib/qlpack.yml | 2 +- actions/ql/src/qlpack.yml | 2 +- cpp/ql/lib/qlpack.yml | 2 +- cpp/ql/src/qlpack.yml | 2 +- csharp/ql/campaigns/Solorigate/lib/qlpack.yml | 2 +- csharp/ql/campaigns/Solorigate/src/qlpack.yml | 2 +- csharp/ql/lib/qlpack.yml | 2 +- csharp/ql/src/qlpack.yml | 2 +- go/ql/consistency-queries/qlpack.yml | 2 +- go/ql/lib/qlpack.yml | 2 +- go/ql/src/qlpack.yml | 2 +- java/ql/lib/qlpack.yml | 2 +- java/ql/src/qlpack.yml | 2 +- javascript/ql/lib/qlpack.yml | 2 +- javascript/ql/src/qlpack.yml | 2 +- misc/suite-helpers/qlpack.yml | 2 +- python/ql/lib/qlpack.yml | 2 +- python/ql/src/qlpack.yml | 2 +- ruby/ql/lib/qlpack.yml | 2 +- ruby/ql/src/qlpack.yml | 2 +- rust/ql/lib/qlpack.yml | 2 +- rust/ql/src/qlpack.yml | 2 +- shared/concepts/qlpack.yml | 2 +- shared/controlflow/qlpack.yml | 2 +- shared/dataflow/qlpack.yml | 2 +- shared/mad/qlpack.yml | 2 +- shared/namebinding/qlpack.yml | 2 +- shared/quantum/qlpack.yml | 2 +- shared/rangeanalysis/qlpack.yml | 2 +- shared/regex/qlpack.yml | 2 +- shared/ssa/qlpack.yml | 2 +- shared/threat-models/qlpack.yml | 2 +- shared/tutorial/qlpack.yml | 2 +- shared/typeflow/qlpack.yml | 2 +- shared/typeinference/qlpack.yml | 2 +- shared/typetracking/qlpack.yml | 2 +- shared/typos/qlpack.yml | 2 +- shared/util/qlpack.yml | 2 +- shared/xml/qlpack.yml | 2 +- shared/yaml/qlpack.yml | 2 +- swift/ql/lib/qlpack.yml | 2 +- swift/ql/src/qlpack.yml | 2 +- 42 files changed, 42 insertions(+), 42 deletions(-) diff --git a/actions/ql/lib/qlpack.yml b/actions/ql/lib/qlpack.yml index f4e4fbd9c564..b86df498d3dd 100644 --- a/actions/ql/lib/qlpack.yml +++ b/actions/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-all -version: 0.6.0 +version: 0.6.1-dev library: true warnOnImplicitThis: true dependencies: diff --git a/actions/ql/src/qlpack.yml b/actions/ql/src/qlpack.yml index 4377b8b8bf64..f4323defe6e8 100644 --- a/actions/ql/src/qlpack.yml +++ b/actions/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-queries -version: 0.6.34 +version: 0.6.35-dev library: false warnOnImplicitThis: true groups: [actions, queries] diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index c8c6e352aa4b..b676012be506 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-all -version: 12.0.3 +version: 12.0.4-dev groups: cpp dbscheme: semmlecode.cpp.dbscheme extractor: cpp diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml index cdd6197c5aa2..b365b8a398c3 100644 --- a/cpp/ql/src/qlpack.yml +++ b/cpp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-queries -version: 1.8.2 +version: 1.8.3-dev groups: - cpp - queries diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml index c08e66efd527..d045c1c7224b 100644 --- a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-all -version: 1.7.73 +version: 1.7.74-dev groups: - csharp - solorigate diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml index 76d08def9d2a..3b5e1b3341e3 100644 --- a/csharp/ql/campaigns/Solorigate/src/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-queries -version: 1.7.73 +version: 1.7.74-dev groups: - csharp - solorigate diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index d0517a91e4d3..c011a9a20d0b 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-all -version: 7.2.0 +version: 7.2.1-dev groups: csharp dbscheme: semmlecode.csharp.dbscheme extractor: csharp diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml index 3f173d3d0ec2..84048f55bc43 100644 --- a/csharp/ql/src/qlpack.yml +++ b/csharp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-queries -version: 1.9.2 +version: 1.9.3-dev groups: - csharp - queries diff --git a/go/ql/consistency-queries/qlpack.yml b/go/ql/consistency-queries/qlpack.yml index 595bb1de039b..bebfec169a09 100644 --- a/go/ql/consistency-queries/qlpack.yml +++ b/go/ql/consistency-queries/qlpack.yml @@ -1,5 +1,5 @@ name: codeql-go-consistency-queries -version: 1.0.56 +version: 1.0.57-dev groups: - go - queries diff --git a/go/ql/lib/qlpack.yml b/go/ql/lib/qlpack.yml index 95356585661f..12e9a5f97982 100644 --- a/go/ql/lib/qlpack.yml +++ b/go/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-all -version: 7.3.0 +version: 7.3.1-dev groups: go dbscheme: go.dbscheme extractor: go diff --git a/go/ql/src/qlpack.yml b/go/ql/src/qlpack.yml index d5cb9084dcfd..64813b045694 100644 --- a/go/ql/src/qlpack.yml +++ b/go/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-queries -version: 1.6.9 +version: 1.6.10-dev groups: - go - queries diff --git a/java/ql/lib/qlpack.yml b/java/ql/lib/qlpack.yml index 700cccd95b4d..0beb3b3caa70 100644 --- a/java/ql/lib/qlpack.yml +++ b/java/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-all -version: 9.2.4 +version: 9.2.5-dev groups: java dbscheme: config/semmlecode.dbscheme extractor: java diff --git a/java/ql/src/qlpack.yml b/java/ql/src/qlpack.yml index bf1cbbd7119e..6b312fc5dc44 100644 --- a/java/ql/src/qlpack.yml +++ b/java/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-queries -version: 1.11.9 +version: 1.11.10-dev groups: - java - queries diff --git a/javascript/ql/lib/qlpack.yml b/javascript/ql/lib/qlpack.yml index 64be77a515d3..0a74e2c419ac 100644 --- a/javascript/ql/lib/qlpack.yml +++ b/javascript/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-all -version: 2.10.0 +version: 2.10.1-dev groups: javascript dbscheme: semmlecode.javascript.dbscheme extractor: javascript diff --git a/javascript/ql/src/qlpack.yml b/javascript/ql/src/qlpack.yml index 3b788bff539b..bdefbdee61f7 100644 --- a/javascript/ql/src/qlpack.yml +++ b/javascript/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-queries -version: 2.4.4 +version: 2.4.5-dev groups: - javascript - queries diff --git a/misc/suite-helpers/qlpack.yml b/misc/suite-helpers/qlpack.yml index e5f770404f0d..be95f2ac4322 100644 --- a/misc/suite-helpers/qlpack.yml +++ b/misc/suite-helpers/qlpack.yml @@ -1,4 +1,4 @@ name: codeql/suite-helpers -version: 1.0.56 +version: 1.0.57-dev groups: shared warnOnImplicitThis: true diff --git a/python/ql/lib/qlpack.yml b/python/ql/lib/qlpack.yml index c9c33d75b8c4..46c4b9e2e00e 100644 --- a/python/ql/lib/qlpack.yml +++ b/python/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-all -version: 7.2.4 +version: 7.2.5-dev groups: python dbscheme: semmlecode.python.dbscheme extractor: python diff --git a/python/ql/src/qlpack.yml b/python/ql/src/qlpack.yml index 83959eb2f06a..9778815a4631 100644 --- a/python/ql/src/qlpack.yml +++ b/python/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-queries -version: 1.8.9 +version: 1.8.10-dev groups: - python - queries diff --git a/ruby/ql/lib/qlpack.yml b/ruby/ql/lib/qlpack.yml index d69ea587cc09..8071a411828b 100644 --- a/ruby/ql/lib/qlpack.yml +++ b/ruby/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-all -version: 6.0.4 +version: 6.0.5-dev groups: ruby extractor: ruby dbscheme: ruby.dbscheme diff --git a/ruby/ql/src/qlpack.yml b/ruby/ql/src/qlpack.yml index 011ae8a48e37..872cf18c8e03 100644 --- a/ruby/ql/src/qlpack.yml +++ b/ruby/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-queries -version: 1.6.9 +version: 1.6.10-dev groups: - ruby - queries diff --git a/rust/ql/lib/qlpack.yml b/rust/ql/lib/qlpack.yml index d6bb6e2c8355..59a2c38c8a2b 100644 --- a/rust/ql/lib/qlpack.yml +++ b/rust/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rust-all -version: 0.2.20 +version: 0.2.21-dev groups: rust extractor: rust dbscheme: rust.dbscheme diff --git a/rust/ql/src/qlpack.yml b/rust/ql/src/qlpack.yml index 8d861959d1dc..b4048003f9cf 100644 --- a/rust/ql/src/qlpack.yml +++ b/rust/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rust-queries -version: 0.1.41 +version: 0.1.42-dev groups: - rust - queries diff --git a/shared/concepts/qlpack.yml b/shared/concepts/qlpack.yml index 46af3e5a6093..6a1db5dc8858 100644 --- a/shared/concepts/qlpack.yml +++ b/shared/concepts/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/concepts -version: 0.0.30 +version: 0.0.31-dev groups: shared library: true dependencies: diff --git a/shared/controlflow/qlpack.yml b/shared/controlflow/qlpack.yml index e4c5c10696b2..9c7448a0c159 100644 --- a/shared/controlflow/qlpack.yml +++ b/shared/controlflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/controlflow -version: 2.0.40 +version: 2.0.41-dev groups: shared library: true dependencies: diff --git a/shared/dataflow/qlpack.yml b/shared/dataflow/qlpack.yml index f53be1543ad7..133b33e834d8 100644 --- a/shared/dataflow/qlpack.yml +++ b/shared/dataflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/dataflow -version: 2.1.12 +version: 2.1.13-dev groups: shared library: true dependencies: diff --git a/shared/mad/qlpack.yml b/shared/mad/qlpack.yml index 8a938b2288a9..28a84ca5aa86 100644 --- a/shared/mad/qlpack.yml +++ b/shared/mad/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/mad -version: 1.0.56 +version: 1.0.57-dev groups: shared library: true dependencies: diff --git a/shared/namebinding/qlpack.yml b/shared/namebinding/qlpack.yml index c646e249377e..6ab033915b70 100644 --- a/shared/namebinding/qlpack.yml +++ b/shared/namebinding/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/namebinding -version: 0.0.5 +version: 0.0.6-dev groups: shared library: true dependencies: diff --git a/shared/quantum/qlpack.yml b/shared/quantum/qlpack.yml index c346366c887b..73a8ef49ee5c 100644 --- a/shared/quantum/qlpack.yml +++ b/shared/quantum/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/quantum -version: 0.0.34 +version: 0.0.35-dev groups: shared library: true dependencies: diff --git a/shared/rangeanalysis/qlpack.yml b/shared/rangeanalysis/qlpack.yml index f0fc39d7d022..c7a74dae7c26 100644 --- a/shared/rangeanalysis/qlpack.yml +++ b/shared/rangeanalysis/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rangeanalysis -version: 1.0.56 +version: 1.0.57-dev groups: shared library: true dependencies: diff --git a/shared/regex/qlpack.yml b/shared/regex/qlpack.yml index cb9a5810d8ae..2afdc58e3d11 100644 --- a/shared/regex/qlpack.yml +++ b/shared/regex/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/regex -version: 1.0.56 +version: 1.0.57-dev groups: shared library: true dependencies: diff --git a/shared/ssa/qlpack.yml b/shared/ssa/qlpack.yml index e7a083427e9e..c5c7755b1755 100644 --- a/shared/ssa/qlpack.yml +++ b/shared/ssa/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ssa -version: 2.0.32 +version: 2.0.33-dev groups: shared library: true dependencies: diff --git a/shared/threat-models/qlpack.yml b/shared/threat-models/qlpack.yml index 3a2e3a691ab9..a29a2c7dc6a0 100644 --- a/shared/threat-models/qlpack.yml +++ b/shared/threat-models/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/threat-models -version: 1.0.56 +version: 1.0.57-dev library: true groups: shared dataExtensions: diff --git a/shared/tutorial/qlpack.yml b/shared/tutorial/qlpack.yml index 7fb4e02cc66f..b94e0b81dadc 100644 --- a/shared/tutorial/qlpack.yml +++ b/shared/tutorial/qlpack.yml @@ -1,7 +1,7 @@ name: codeql/tutorial description: Library for the CodeQL detective tutorials, helping new users learn to write CodeQL queries. -version: 1.0.56 +version: 1.0.57-dev groups: shared library: true warnOnImplicitThis: true diff --git a/shared/typeflow/qlpack.yml b/shared/typeflow/qlpack.yml index 535fdba52cba..0475b6bf7325 100644 --- a/shared/typeflow/qlpack.yml +++ b/shared/typeflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeflow -version: 1.0.56 +version: 1.0.57-dev groups: shared library: true dependencies: diff --git a/shared/typeinference/qlpack.yml b/shared/typeinference/qlpack.yml index 1fadc262b89b..3cd87a73bdc2 100644 --- a/shared/typeinference/qlpack.yml +++ b/shared/typeinference/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeinference -version: 0.0.37 +version: 0.0.38-dev groups: shared library: true dependencies: diff --git a/shared/typetracking/qlpack.yml b/shared/typetracking/qlpack.yml index 4279f61fc3f0..eff084212ba2 100644 --- a/shared/typetracking/qlpack.yml +++ b/shared/typetracking/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typetracking -version: 2.0.40 +version: 2.0.41-dev groups: shared library: true dependencies: diff --git a/shared/typos/qlpack.yml b/shared/typos/qlpack.yml index 84bea4384531..5933bd6862a1 100644 --- a/shared/typos/qlpack.yml +++ b/shared/typos/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typos -version: 1.0.56 +version: 1.0.57-dev groups: shared library: true warnOnImplicitThis: true diff --git a/shared/util/qlpack.yml b/shared/util/qlpack.yml index 38fabfcb99a0..c8f2c7a57343 100644 --- a/shared/util/qlpack.yml +++ b/shared/util/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/util -version: 2.0.43 +version: 2.0.44-dev groups: shared library: true dependencies: null diff --git a/shared/xml/qlpack.yml b/shared/xml/qlpack.yml index af73bb69888c..71a98a37b522 100644 --- a/shared/xml/qlpack.yml +++ b/shared/xml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/xml -version: 1.0.56 +version: 1.0.57-dev groups: shared library: true dependencies: diff --git a/shared/yaml/qlpack.yml b/shared/yaml/qlpack.yml index 2e0644f8c71a..83ede2e7653b 100644 --- a/shared/yaml/qlpack.yml +++ b/shared/yaml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/yaml -version: 1.0.56 +version: 1.0.57-dev groups: shared library: true warnOnImplicitThis: true diff --git a/swift/ql/lib/qlpack.yml b/swift/ql/lib/qlpack.yml index fa4ba95e4dda..f539a679b130 100644 --- a/swift/ql/lib/qlpack.yml +++ b/swift/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-all -version: 6.8.2 +version: 6.8.3-dev groups: swift extractor: swift dbscheme: swift.dbscheme diff --git a/swift/ql/src/qlpack.yml b/swift/ql/src/qlpack.yml index e4ab0b8a074a..ca8bf05e942d 100644 --- a/swift/ql/src/qlpack.yml +++ b/swift/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-queries -version: 1.3.9 +version: 1.3.10-dev groups: - swift - queries From dfe567a99f9f8b636b402084c72e7d98a700b237 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Fri, 21 Aug 2026 13:19:41 +0200 Subject: [PATCH 0457/2098] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll b/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll index 6cdad2d8cfbb..e467e6caa708 100644 --- a/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll +++ b/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll @@ -3092,7 +3092,7 @@ module MakeImpl Lang> { not expensiveLen2unfolding(c) } or TConsCons(Content c1, Content c2, int len) { - Stage4::consCand(c1, TFrontHead(c2, _)) and + Stage4::consCand(c1, TFrontHead(c2, len - 1)) and len in [2 .. Config::accessPathLimit()] and not expensiveLen2unfolding(c1) } or From 74807b0a113f92fd207058c8a67a8d40d57be325 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 21 Aug 2026 12:33:30 +0100 Subject: [PATCH 0458/2098] C++: Fix QLDoc. --- .../semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll index d09b10aa632b..6b79671ce638 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll @@ -617,7 +617,7 @@ abstract class Position extends TPosition { abstract int getIndirectionIndex(); /** - * Gets the parameter associated with this position, if any. + * Gets the parameter of `f` associated with this position, if any. * * Since a `Position` is defined by both an argument index and an * indirection multiple `Position`s can be associated with the @@ -629,7 +629,7 @@ abstract class Position extends TPosition { } /** - * Gets the argument (or qualifier) associated with this position, if any. + * Gets the argument (or qualifier) of `call` associated with this position, if any. * * Since a `Position` is defined by both an argument index and an * indirection multiple `Position`s can be associated with the From 36497842e1deb731a0df212a4ab22371aac38d8a Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 21 Aug 2026 14:36:56 +0100 Subject: [PATCH 0459/2098] C++: Add tests with missing flow sources. --- .../dataflow/external-models/flow.expected | 154 +++++++++--------- .../dataflow/external-models/sinks.expected | 19 ++- .../dataflow/external-models/sources.expected | 4 +- .../dataflow/external-models/test.cpp | 15 +- 4 files changed, 102 insertions(+), 90 deletions(-) diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index 0ee182649a08..1e875ffd9d88 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -245,41 +245,41 @@ edges | test.cpp:250:32:250:32 | source_from_callback_template output argument [value] | test.cpp:243:10:243:10 | *s [value] | provenance | | | test.cpp:251:27:251:27 | source_from_callback_ptr output argument | test.cpp:251:27:251:27 | source_from_callback_ptr output argument [value] | provenance | Src:MaD:37 | | test.cpp:251:27:251:27 | source_from_callback_ptr output argument [value] | test.cpp:243:10:243:10 | *s [value] | provenance | | -| test.cpp:253:32:255:2 | source_from_callback_template output argument | test.cpp:253:32:255:2 | source_from_callback_template output argument [value] | provenance | Src:MaD:40 | -| test.cpp:253:32:255:2 | source_from_callback_template output argument [value] | test.cpp:254:11:254:11 | *s [value] | provenance | | -| test.cpp:254:11:254:11 | *s [value] | test.cpp:254:14:254:18 | value | provenance | | -| test.cpp:254:14:254:18 | value | test.cpp:254:14:254:18 | value | provenance | Sink:MaD:3 | -| test.cpp:257:27:257:27 | source_from_callback_ptr output argument | test.cpp:257:27:257:27 | source_from_callback_ptr output argument [value] | provenance | Src:MaD:37 | -| test.cpp:257:27:257:27 | source_from_callback_ptr output argument [value] | test.cpp:258:11:258:11 | *s [value] | provenance | | -| test.cpp:258:11:258:11 | *s [value] | test.cpp:258:14:258:18 | value | provenance | | -| test.cpp:258:14:258:18 | value | test.cpp:258:14:258:18 | value | provenance | Sink:MaD:3 | -| test.cpp:263:12:263:12 | *s [value] | test.cpp:263:15:263:19 | value | provenance | | -| test.cpp:263:15:263:19 | value | test.cpp:263:15:263:19 | value | provenance | Sink:MaD:3 | -| test.cpp:267:32:267:34 | source_from_callback_template output argument | test.cpp:267:32:267:34 | source_from_callback_template output argument [value] | provenance | Src:MaD:40 | -| test.cpp:267:32:267:34 | source_from_callback_template output argument [value] | test.cpp:263:12:263:12 | *s [value] | provenance | | -| test.cpp:282:5:282:26 | *callback_returning_int | test.cpp:296:10:296:31 | call to callback_returning_int | provenance | | -| test.cpp:283:5:283:28 | *callback_returning_int_2 | test.cpp:299:10:299:33 | call to callback_returning_int_2 | provenance | | -| test.cpp:284:6:284:31 | **callback_returning_ptr_int | test.cpp:302:13:302:38 | *call to callback_returning_ptr_int | provenance | | -| test.cpp:286:33:286:41 | call to ymlSource | test.cpp:286:33:286:41 | call to ymlSource | provenance | Src:MaD:43 | -| test.cpp:286:33:286:41 | call to ymlSource | test.cpp:307:37:307:52 | return_ymlSource | provenance | Sink:MaD:1 | -| test.cpp:286:33:286:41 | call to ymlSource | test.cpp:307:37:307:52 | return_ymlSource | provenance | Src:MaD:43 Sink:MaD:1 | -| test.cpp:288:41:288:52 | *call to ymlSourcePtr | test.cpp:310:36:310:58 | return_ptr_to_ymlSource | provenance | Sink:MaD:2 | -| test.cpp:288:41:288:52 | call to ymlSourcePtr | test.cpp:288:41:288:52 | *call to ymlSourcePtr | provenance | Src:MaD:44 | -| test.cpp:288:41:288:52 | call to ymlSourcePtr | test.cpp:310:36:310:58 | return_ptr_to_ymlSource | provenance | Src:MaD:44 Sink:MaD:2 | -| test.cpp:293:11:293:22 | call to ymlSourcePtr | test.cpp:293:10:293:24 | * ... | provenance | Src:MaD:44 Sink:MaD:3 | -| test.cpp:295:39:295:60 | source_from_callback_return_template output argument | test.cpp:282:5:282:26 | *callback_returning_int | provenance | Src:MaD:39 | -| test.cpp:296:10:296:31 | call to callback_returning_int | test.cpp:296:10:296:31 | call to callback_returning_int | provenance | Sink:MaD:3 | -| test.cpp:298:34:298:57 | source_from_callback_return_ptr output argument | test.cpp:283:5:283:28 | *callback_returning_int_2 | provenance | Src:MaD:38 | -| test.cpp:299:10:299:33 | call to callback_returning_int_2 | test.cpp:299:10:299:33 | call to callback_returning_int_2 | provenance | Sink:MaD:3 | -| test.cpp:301:38:301:63 | source_ptr_from_callback_return_ptr output argument | test.cpp:284:6:284:31 | **callback_returning_ptr_int | provenance | Src:MaD:41 | -| test.cpp:302:13:302:38 | *call to callback_returning_ptr_int | test.cpp:302:13:302:38 | *call to callback_returning_ptr_int | provenance | | -| test.cpp:302:13:302:38 | *call to callback_returning_ptr_int | test.cpp:304:10:304:13 | * ... | provenance | Sink:MaD:3 | -| test.cpp:306:51:306:59 | call to ymlSource | test.cpp:306:37:306:64 | [...](...){...} | provenance | Sink:MaD:1 | -| test.cpp:306:51:306:59 | call to ymlSource | test.cpp:306:37:306:64 | [...](...){...} | provenance | Src:MaD:43 Sink:MaD:1 | -| test.cpp:306:51:306:59 | call to ymlSource | test.cpp:306:51:306:59 | call to ymlSource | provenance | Src:MaD:43 | -| test.cpp:309:50:309:61 | *call to ymlSourcePtr | test.cpp:309:36:309:36 | call to operator int *(*)() | provenance | Sink:MaD:2 | -| test.cpp:309:50:309:61 | call to ymlSourcePtr | test.cpp:309:36:309:36 | call to operator int *(*)() | provenance | Src:MaD:44 Sink:MaD:2 | -| test.cpp:309:50:309:61 | call to ymlSourcePtr | test.cpp:309:50:309:61 | *call to ymlSourcePtr | provenance | Src:MaD:44 | +| test.cpp:264:32:266:2 | source_from_callback_template output argument | test.cpp:264:32:266:2 | source_from_callback_template output argument [value] | provenance | Src:MaD:40 | +| test.cpp:264:32:266:2 | source_from_callback_template output argument [value] | test.cpp:265:11:265:11 | *s [value] | provenance | | +| test.cpp:265:11:265:11 | *s [value] | test.cpp:265:14:265:18 | value | provenance | | +| test.cpp:265:14:265:18 | value | test.cpp:265:14:265:18 | value | provenance | Sink:MaD:3 | +| test.cpp:268:27:268:27 | source_from_callback_ptr output argument | test.cpp:268:27:268:27 | source_from_callback_ptr output argument [value] | provenance | Src:MaD:37 | +| test.cpp:268:27:268:27 | source_from_callback_ptr output argument [value] | test.cpp:269:11:269:11 | *s [value] | provenance | | +| test.cpp:269:11:269:11 | *s [value] | test.cpp:269:14:269:18 | value | provenance | | +| test.cpp:269:14:269:18 | value | test.cpp:269:14:269:18 | value | provenance | Sink:MaD:3 | +| test.cpp:274:12:274:12 | *s [value] | test.cpp:274:15:274:19 | value | provenance | | +| test.cpp:274:15:274:19 | value | test.cpp:274:15:274:19 | value | provenance | Sink:MaD:3 | +| test.cpp:278:32:278:34 | source_from_callback_template output argument | test.cpp:278:32:278:34 | source_from_callback_template output argument [value] | provenance | Src:MaD:40 | +| test.cpp:278:32:278:34 | source_from_callback_template output argument [value] | test.cpp:274:12:274:12 | *s [value] | provenance | | +| test.cpp:293:5:293:26 | *callback_returning_int | test.cpp:307:10:307:31 | call to callback_returning_int | provenance | | +| test.cpp:294:5:294:28 | *callback_returning_int_2 | test.cpp:310:10:310:33 | call to callback_returning_int_2 | provenance | | +| test.cpp:295:6:295:31 | **callback_returning_ptr_int | test.cpp:313:13:313:38 | *call to callback_returning_ptr_int | provenance | | +| test.cpp:297:33:297:41 | call to ymlSource | test.cpp:297:33:297:41 | call to ymlSource | provenance | Src:MaD:43 | +| test.cpp:297:33:297:41 | call to ymlSource | test.cpp:318:37:318:52 | return_ymlSource | provenance | Sink:MaD:1 | +| test.cpp:297:33:297:41 | call to ymlSource | test.cpp:318:37:318:52 | return_ymlSource | provenance | Src:MaD:43 Sink:MaD:1 | +| test.cpp:299:41:299:52 | *call to ymlSourcePtr | test.cpp:321:36:321:58 | return_ptr_to_ymlSource | provenance | Sink:MaD:2 | +| test.cpp:299:41:299:52 | call to ymlSourcePtr | test.cpp:299:41:299:52 | *call to ymlSourcePtr | provenance | Src:MaD:44 | +| test.cpp:299:41:299:52 | call to ymlSourcePtr | test.cpp:321:36:321:58 | return_ptr_to_ymlSource | provenance | Src:MaD:44 Sink:MaD:2 | +| test.cpp:304:11:304:22 | call to ymlSourcePtr | test.cpp:304:10:304:24 | * ... | provenance | Src:MaD:44 Sink:MaD:3 | +| test.cpp:306:39:306:60 | source_from_callback_return_template output argument | test.cpp:293:5:293:26 | *callback_returning_int | provenance | Src:MaD:39 | +| test.cpp:307:10:307:31 | call to callback_returning_int | test.cpp:307:10:307:31 | call to callback_returning_int | provenance | Sink:MaD:3 | +| test.cpp:309:34:309:57 | source_from_callback_return_ptr output argument | test.cpp:294:5:294:28 | *callback_returning_int_2 | provenance | Src:MaD:38 | +| test.cpp:310:10:310:33 | call to callback_returning_int_2 | test.cpp:310:10:310:33 | call to callback_returning_int_2 | provenance | Sink:MaD:3 | +| test.cpp:312:38:312:63 | source_ptr_from_callback_return_ptr output argument | test.cpp:295:6:295:31 | **callback_returning_ptr_int | provenance | Src:MaD:41 | +| test.cpp:313:13:313:38 | *call to callback_returning_ptr_int | test.cpp:313:13:313:38 | *call to callback_returning_ptr_int | provenance | | +| test.cpp:313:13:313:38 | *call to callback_returning_ptr_int | test.cpp:315:10:315:13 | * ... | provenance | Sink:MaD:3 | +| test.cpp:317:51:317:59 | call to ymlSource | test.cpp:317:37:317:64 | [...](...){...} | provenance | Sink:MaD:1 | +| test.cpp:317:51:317:59 | call to ymlSource | test.cpp:317:37:317:64 | [...](...){...} | provenance | Src:MaD:43 Sink:MaD:1 | +| test.cpp:317:51:317:59 | call to ymlSource | test.cpp:317:51:317:59 | call to ymlSource | provenance | Src:MaD:43 | +| test.cpp:320:50:320:61 | *call to ymlSourcePtr | test.cpp:320:36:320:36 | call to operator int *(*)() | provenance | Sink:MaD:2 | +| test.cpp:320:50:320:61 | call to ymlSourcePtr | test.cpp:320:36:320:36 | call to operator int *(*)() | provenance | Src:MaD:44 Sink:MaD:2 | +| test.cpp:320:50:320:61 | call to ymlSourcePtr | test.cpp:320:50:320:61 | *call to ymlSourcePtr | provenance | Src:MaD:44 | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:24:8:24:11 | * ... | provenance | | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:27:36:27:38 | *cmd | provenance | | | windows.cpp:22:15:22:29 | call to GetCommandLineA | windows.cpp:22:15:22:29 | *call to GetCommandLineA | provenance | Src:MaD:5 | @@ -629,48 +629,48 @@ nodes | test.cpp:250:32:250:32 | source_from_callback_template output argument [value] | semmle.label | source_from_callback_template output argument [value] | | test.cpp:251:27:251:27 | source_from_callback_ptr output argument | semmle.label | source_from_callback_ptr output argument | | test.cpp:251:27:251:27 | source_from_callback_ptr output argument [value] | semmle.label | source_from_callback_ptr output argument [value] | -| test.cpp:253:32:255:2 | source_from_callback_template output argument | semmle.label | source_from_callback_template output argument | -| test.cpp:253:32:255:2 | source_from_callback_template output argument [value] | semmle.label | source_from_callback_template output argument [value] | -| test.cpp:254:11:254:11 | *s [value] | semmle.label | *s [value] | -| test.cpp:254:14:254:18 | value | semmle.label | value | -| test.cpp:254:14:254:18 | value | semmle.label | value | -| test.cpp:257:27:257:27 | source_from_callback_ptr output argument | semmle.label | source_from_callback_ptr output argument | -| test.cpp:257:27:257:27 | source_from_callback_ptr output argument [value] | semmle.label | source_from_callback_ptr output argument [value] | -| test.cpp:258:11:258:11 | *s [value] | semmle.label | *s [value] | -| test.cpp:258:14:258:18 | value | semmle.label | value | -| test.cpp:258:14:258:18 | value | semmle.label | value | -| test.cpp:263:12:263:12 | *s [value] | semmle.label | *s [value] | -| test.cpp:263:15:263:19 | value | semmle.label | value | -| test.cpp:263:15:263:19 | value | semmle.label | value | -| test.cpp:267:32:267:34 | source_from_callback_template output argument | semmle.label | source_from_callback_template output argument | -| test.cpp:267:32:267:34 | source_from_callback_template output argument [value] | semmle.label | source_from_callback_template output argument [value] | -| test.cpp:282:5:282:26 | *callback_returning_int | semmle.label | *callback_returning_int | -| test.cpp:283:5:283:28 | *callback_returning_int_2 | semmle.label | *callback_returning_int_2 | -| test.cpp:284:6:284:31 | **callback_returning_ptr_int | semmle.label | **callback_returning_ptr_int | -| test.cpp:286:33:286:41 | call to ymlSource | semmle.label | call to ymlSource | -| test.cpp:286:33:286:41 | call to ymlSource | semmle.label | call to ymlSource | -| test.cpp:288:41:288:52 | *call to ymlSourcePtr | semmle.label | *call to ymlSourcePtr | -| test.cpp:288:41:288:52 | call to ymlSourcePtr | semmle.label | call to ymlSourcePtr | -| test.cpp:293:10:293:24 | * ... | semmle.label | * ... | -| test.cpp:293:11:293:22 | call to ymlSourcePtr | semmle.label | call to ymlSourcePtr | -| test.cpp:295:39:295:60 | source_from_callback_return_template output argument | semmle.label | source_from_callback_return_template output argument | -| test.cpp:296:10:296:31 | call to callback_returning_int | semmle.label | call to callback_returning_int | -| test.cpp:296:10:296:31 | call to callback_returning_int | semmle.label | call to callback_returning_int | -| test.cpp:298:34:298:57 | source_from_callback_return_ptr output argument | semmle.label | source_from_callback_return_ptr output argument | -| test.cpp:299:10:299:33 | call to callback_returning_int_2 | semmle.label | call to callback_returning_int_2 | -| test.cpp:299:10:299:33 | call to callback_returning_int_2 | semmle.label | call to callback_returning_int_2 | -| test.cpp:301:38:301:63 | source_ptr_from_callback_return_ptr output argument | semmle.label | source_ptr_from_callback_return_ptr output argument | -| test.cpp:302:13:302:38 | *call to callback_returning_ptr_int | semmle.label | *call to callback_returning_ptr_int | -| test.cpp:302:13:302:38 | *call to callback_returning_ptr_int | semmle.label | *call to callback_returning_ptr_int | -| test.cpp:304:10:304:13 | * ... | semmle.label | * ... | -| test.cpp:306:37:306:64 | [...](...){...} | semmle.label | [...](...){...} | -| test.cpp:306:51:306:59 | call to ymlSource | semmle.label | call to ymlSource | -| test.cpp:306:51:306:59 | call to ymlSource | semmle.label | call to ymlSource | -| test.cpp:307:37:307:52 | return_ymlSource | semmle.label | return_ymlSource | -| test.cpp:309:36:309:36 | call to operator int *(*)() | semmle.label | call to operator int *(*)() | -| test.cpp:309:50:309:61 | *call to ymlSourcePtr | semmle.label | *call to ymlSourcePtr | -| test.cpp:309:50:309:61 | call to ymlSourcePtr | semmle.label | call to ymlSourcePtr | -| test.cpp:310:36:310:58 | return_ptr_to_ymlSource | semmle.label | return_ptr_to_ymlSource | +| test.cpp:264:32:266:2 | source_from_callback_template output argument | semmle.label | source_from_callback_template output argument | +| test.cpp:264:32:266:2 | source_from_callback_template output argument [value] | semmle.label | source_from_callback_template output argument [value] | +| test.cpp:265:11:265:11 | *s [value] | semmle.label | *s [value] | +| test.cpp:265:14:265:18 | value | semmle.label | value | +| test.cpp:265:14:265:18 | value | semmle.label | value | +| test.cpp:268:27:268:27 | source_from_callback_ptr output argument | semmle.label | source_from_callback_ptr output argument | +| test.cpp:268:27:268:27 | source_from_callback_ptr output argument [value] | semmle.label | source_from_callback_ptr output argument [value] | +| test.cpp:269:11:269:11 | *s [value] | semmle.label | *s [value] | +| test.cpp:269:14:269:18 | value | semmle.label | value | +| test.cpp:269:14:269:18 | value | semmle.label | value | +| test.cpp:274:12:274:12 | *s [value] | semmle.label | *s [value] | +| test.cpp:274:15:274:19 | value | semmle.label | value | +| test.cpp:274:15:274:19 | value | semmle.label | value | +| test.cpp:278:32:278:34 | source_from_callback_template output argument | semmle.label | source_from_callback_template output argument | +| test.cpp:278:32:278:34 | source_from_callback_template output argument [value] | semmle.label | source_from_callback_template output argument [value] | +| test.cpp:293:5:293:26 | *callback_returning_int | semmle.label | *callback_returning_int | +| test.cpp:294:5:294:28 | *callback_returning_int_2 | semmle.label | *callback_returning_int_2 | +| test.cpp:295:6:295:31 | **callback_returning_ptr_int | semmle.label | **callback_returning_ptr_int | +| test.cpp:297:33:297:41 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:297:33:297:41 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:299:41:299:52 | *call to ymlSourcePtr | semmle.label | *call to ymlSourcePtr | +| test.cpp:299:41:299:52 | call to ymlSourcePtr | semmle.label | call to ymlSourcePtr | +| test.cpp:304:10:304:24 | * ... | semmle.label | * ... | +| test.cpp:304:11:304:22 | call to ymlSourcePtr | semmle.label | call to ymlSourcePtr | +| test.cpp:306:39:306:60 | source_from_callback_return_template output argument | semmle.label | source_from_callback_return_template output argument | +| test.cpp:307:10:307:31 | call to callback_returning_int | semmle.label | call to callback_returning_int | +| test.cpp:307:10:307:31 | call to callback_returning_int | semmle.label | call to callback_returning_int | +| test.cpp:309:34:309:57 | source_from_callback_return_ptr output argument | semmle.label | source_from_callback_return_ptr output argument | +| test.cpp:310:10:310:33 | call to callback_returning_int_2 | semmle.label | call to callback_returning_int_2 | +| test.cpp:310:10:310:33 | call to callback_returning_int_2 | semmle.label | call to callback_returning_int_2 | +| test.cpp:312:38:312:63 | source_ptr_from_callback_return_ptr output argument | semmle.label | source_ptr_from_callback_return_ptr output argument | +| test.cpp:313:13:313:38 | *call to callback_returning_ptr_int | semmle.label | *call to callback_returning_ptr_int | +| test.cpp:313:13:313:38 | *call to callback_returning_ptr_int | semmle.label | *call to callback_returning_ptr_int | +| test.cpp:315:10:315:13 | * ... | semmle.label | * ... | +| test.cpp:317:37:317:64 | [...](...){...} | semmle.label | [...](...){...} | +| test.cpp:317:51:317:59 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:317:51:317:59 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:318:37:318:52 | return_ymlSource | semmle.label | return_ymlSource | +| test.cpp:320:36:320:36 | call to operator int *(*)() | semmle.label | call to operator int *(*)() | +| test.cpp:320:50:320:61 | *call to ymlSourcePtr | semmle.label | *call to ymlSourcePtr | +| test.cpp:320:50:320:61 | call to ymlSourcePtr | semmle.label | call to ymlSourcePtr | +| test.cpp:321:36:321:58 | return_ptr_to_ymlSource | semmle.label | return_ptr_to_ymlSource | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | semmle.label | *call to GetCommandLineA | | windows.cpp:22:15:22:29 | call to GetCommandLineA | semmle.label | call to GetCommandLineA | | windows.cpp:24:8:24:11 | * ... | semmle.label | * ... | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected index 158f3a2a71f8..ed6a05517497 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected @@ -25,12 +25,13 @@ | test.cpp:224:11:224:11 | c | test-sink | | test.cpp:243:13:243:17 | value | test-sink | | test.cpp:248:18:248:22 | value | test-sink | -| test.cpp:254:14:254:18 | value | test-sink | -| test.cpp:258:14:258:18 | value | test-sink | -| test.cpp:263:15:263:19 | value | test-sink | -| test.cpp:292:15:292:26 | call to ymlSourcePtr | test-sink | -| test.cpp:293:10:293:24 | * ... | test-sink | -| test.cpp:296:10:296:31 | call to callback_returning_int | test-sink | -| test.cpp:299:10:299:33 | call to callback_returning_int_2 | test-sink | -| test.cpp:303:15:303:17 | ptr | test-sink | -| test.cpp:304:10:304:13 | * ... | test-sink | +| test.cpp:258:15:258:19 | value | test-sink | +| test.cpp:265:14:265:18 | value | test-sink | +| test.cpp:269:14:269:18 | value | test-sink | +| test.cpp:274:15:274:19 | value | test-sink | +| test.cpp:303:15:303:26 | call to ymlSourcePtr | test-sink | +| test.cpp:304:10:304:24 | * ... | test-sink | +| test.cpp:307:10:307:31 | call to callback_returning_int | test-sink | +| test.cpp:310:10:310:33 | call to callback_returning_int_2 | test-sink | +| test.cpp:314:15:314:17 | ptr | test-sink | +| test.cpp:315:10:315:13 | * ... | test-sink | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected index 5ca05449bc4f..b30f1e88b99a 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected @@ -17,8 +17,8 @@ | test.cpp:199:14:199:22 | call to ymlSource | local | | test.cpp:216:18:216:26 | call to ymlSource | local | | test.cpp:222:10:222:18 | call to ymlSource | local | -| test.cpp:286:33:286:41 | call to ymlSource | local | -| test.cpp:306:51:306:59 | call to ymlSource | local | +| test.cpp:297:33:297:41 | call to ymlSource | local | +| test.cpp:317:51:317:59 | call to ymlSource | local | | windows.cpp:22:15:22:29 | call to GetCommandLineA | local | | windows.cpp:34:17:34:38 | call to GetEnvironmentStringsA | local | | windows.cpp:39:36:39:38 | GetEnvironmentVariableA output argument | local | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp index ad042915def1..e5e974a32b8f 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp @@ -240,16 +240,27 @@ using Callback = void(*)(const SourceWrapper*); void source_from_callback_ptr(Callback); void f(const SourceWrapper* s) { - ymlSink(s->value); // $ ir=250:32 ir=251:27 + ymlSink(s->value); // $ ir=250:32 ir=251:27 MISSING: ir=262:27 } -void test_source_access_path() { +void test_source_access_path(bool b) { SourceWrapper wrapper = ymlFieldSource(); ymlSink(wrapper.value); // $ ir source_from_callback_template(f); source_from_callback_ptr(f); + Callback f_var; + if(b) { + f_var = f; + } else { + f_var = [](const SourceWrapper* s) { + ymlSink(s->value); // $ MISSING: ir + }; + } + + source_from_callback_ptr(f_var); + source_from_callback_template([](const SourceWrapper* s) { ymlSink(s->value); // $ ir }); From 150d0a78ca7e802f7f5826d500b58d72c2f607bf Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 21 Aug 2026 14:49:15 +0100 Subject: [PATCH 0460/2098] C++: Track function pointers using local dataflow and accept test changes. --- .../cpp/dataflow/internal/FlowSummaryImpl.qll | 46 +++++++++++-------- .../dataflow/external-models/flow.expected | 10 ++++ .../dataflow/external-models/test.cpp | 4 +- 3 files changed, 40 insertions(+), 20 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll index d45db30dc1c0..fc3e7172c6fc 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll @@ -161,6 +161,16 @@ private module Input2 implements Impl::Private::InputSig2 { ) } + private MemberFunction getFunctionFromType(Expr e) { + result.getClassAndName("operator()").getADerivedClass*() = e.getUnspecifiedType() + } + + private Function getFunctionFromExpr(Expr e) { + result = e.(FunctionAccess).getTarget() + or + result = e.(ConversionCall).getQualifier().(LambdaExpression).getLambdaFunction() + } + class SourceSinkReportingElement extends Element { SourceSinkReportingElement() { this instanceof Expr or this instanceof Parameter } @@ -169,29 +179,29 @@ private module Input2 implements Impl::Private::InputSig2 { [this.(Expr).getEnclosingFunction(), this.(Parameter).getFunction()] } - /** - * Gets the member function corresponding to an overloaded `operator()` when this element is - * invoked. - */ - private MemberFunction getOperatorCallFunction() { - // An `operator()` on a struct - result.getClassAndName("operator()").getADerivedClass*() = this.(Expr).getUnspecifiedType() - or - // A lambda that has undergone "lambda to function-pointer conversion" - result = this.(ConversionCall).getQualifier().(LambdaExpression).getLambdaFunction() - } - /** Gets the function invoked when this element is used as a callback. */ - private Function getCallbackFunction() { - // Taking the address of a function - result = this.(FunctionAccess).getTarget() + private Function getCallable() { + // The expression is a struct which implements `operator()`. + result = getFunctionFromType(this) or - // Passing an object with an overloaded `operator()` - result = this.getOperatorCallFunction() + // The expression is a function pointer + result = getFunctionFromExpr(this) + or + // The expression is an SSA read of an assignment of a callable + exists(Ssa::Definition def | + def.getAUse().getDef().getUnconvertedResultExpression() = this and + result = + getFunctionFromExpr(def.getAnUltimateDefinition() + .(Ssa::DirectExplicitDefinition) + .getAssignedInstruction() + .(StoreInstruction) + .getSourceValue() + .getUnconvertedResultExpression()) + ) } SourceSinkReportingElement getASuccessor(Impl::Private::SummaryComponent sc) { - exists(Function f | f = this.getCallbackFunction() | + exists(Function f | f = this.getCallable() | exists(ParameterPosition pos | sc = Impl::Private::SummaryComponent::parameter(pos) | result = pos.getParameter(f) ) diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index 1e875ffd9d88..1494ef1264fb 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -245,6 +245,11 @@ edges | test.cpp:250:32:250:32 | source_from_callback_template output argument [value] | test.cpp:243:10:243:10 | *s [value] | provenance | | | test.cpp:251:27:251:27 | source_from_callback_ptr output argument | test.cpp:251:27:251:27 | source_from_callback_ptr output argument [value] | provenance | Src:MaD:37 | | test.cpp:251:27:251:27 | source_from_callback_ptr output argument [value] | test.cpp:243:10:243:10 | *s [value] | provenance | | +| test.cpp:258:12:258:12 | *s [value] | test.cpp:258:15:258:19 | value | provenance | | +| test.cpp:258:15:258:19 | value | test.cpp:258:15:258:19 | value | provenance | Sink:MaD:3 | +| test.cpp:262:27:262:31 | source_from_callback_ptr output argument | test.cpp:262:27:262:31 | source_from_callback_ptr output argument [value] | provenance | Src:MaD:37 | +| test.cpp:262:27:262:31 | source_from_callback_ptr output argument [value] | test.cpp:243:10:243:10 | *s [value] | provenance | | +| test.cpp:262:27:262:31 | source_from_callback_ptr output argument [value] | test.cpp:258:12:258:12 | *s [value] | provenance | | | test.cpp:264:32:266:2 | source_from_callback_template output argument | test.cpp:264:32:266:2 | source_from_callback_template output argument [value] | provenance | Src:MaD:40 | | test.cpp:264:32:266:2 | source_from_callback_template output argument [value] | test.cpp:265:11:265:11 | *s [value] | provenance | | | test.cpp:265:11:265:11 | *s [value] | test.cpp:265:14:265:18 | value | provenance | | @@ -629,6 +634,11 @@ nodes | test.cpp:250:32:250:32 | source_from_callback_template output argument [value] | semmle.label | source_from_callback_template output argument [value] | | test.cpp:251:27:251:27 | source_from_callback_ptr output argument | semmle.label | source_from_callback_ptr output argument | | test.cpp:251:27:251:27 | source_from_callback_ptr output argument [value] | semmle.label | source_from_callback_ptr output argument [value] | +| test.cpp:258:12:258:12 | *s [value] | semmle.label | *s [value] | +| test.cpp:258:15:258:19 | value | semmle.label | value | +| test.cpp:258:15:258:19 | value | semmle.label | value | +| test.cpp:262:27:262:31 | source_from_callback_ptr output argument | semmle.label | source_from_callback_ptr output argument | +| test.cpp:262:27:262:31 | source_from_callback_ptr output argument [value] | semmle.label | source_from_callback_ptr output argument [value] | | test.cpp:264:32:266:2 | source_from_callback_template output argument | semmle.label | source_from_callback_template output argument | | test.cpp:264:32:266:2 | source_from_callback_template output argument [value] | semmle.label | source_from_callback_template output argument [value] | | test.cpp:265:11:265:11 | *s [value] | semmle.label | *s [value] | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp index e5e974a32b8f..ba189200b193 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp @@ -240,7 +240,7 @@ using Callback = void(*)(const SourceWrapper*); void source_from_callback_ptr(Callback); void f(const SourceWrapper* s) { - ymlSink(s->value); // $ ir=250:32 ir=251:27 MISSING: ir=262:27 + ymlSink(s->value); // $ ir=250:32 ir=251:27 ir=262:27 } void test_source_access_path(bool b) { @@ -255,7 +255,7 @@ void test_source_access_path(bool b) { f_var = f; } else { f_var = [](const SourceWrapper* s) { - ymlSink(s->value); // $ MISSING: ir + ymlSink(s->value); // $ ir }; } From 3de9880e259e13545055b7b781278e925a7decfc Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Wed, 19 Aug 2026 12:58:58 +0200 Subject: [PATCH 0461/2098] C++: Update expected test results --- .../library-tests/syntax-zoo/dataflow-consistency.expected | 6 ------ 1 file changed, 6 deletions(-) diff --git a/cpp/ql/test/library-tests/syntax-zoo/dataflow-consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/dataflow-consistency.expected index 76adedb8f054..2b41bcfe0cb4 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/dataflow-consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/dataflow-consistency.expected @@ -1,10 +1,4 @@ uniqueEnclosingCallable -| builtin.c:14:3:14:16 | ... * ... | Node should have one enclosing callable but has 0. | -| builtin.c:14:3:14:16 | sizeof(int) | Node should have one enclosing callable but has 0. | -| builtin.c:14:10:14:10 | 4 | Node should have one enclosing callable but has 0. | -| builtin.c:15:3:15:16 | ... * ... | Node should have one enclosing callable but has 0. | -| builtin.c:15:3:15:16 | sizeof(int) | Node should have one enclosing callable but has 0. | -| builtin.c:15:10:15:10 | 4 | Node should have one enclosing callable but has 0. | | enum.c:2:6:2:6 | 1 | Node should have one enclosing callable but has 0. | | enum.c:2:6:2:10 | ... + ... | Node should have one enclosing callable but has 0. | | enum.c:2:10:2:10 | 1 | Node should have one enclosing callable but has 0. | From c2c53510e61450b3ae273b06988a568b6caf5234 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 21 Aug 2026 14:59:26 +0100 Subject: [PATCH 0462/2098] C++: Mark initializers (and their expressions) of compiler-generated variables as compiler-generated. --- cpp/ql/lib/semmle/code/cpp/Initializer.qll | 3 +++ cpp/ql/lib/semmle/code/cpp/exprs/Expr.qll | 3 ++- .../compiler_generated/compilerGenerated.expected | 5 +++++ .../library-tests/compiler_generated/compilerGenerated.ql | 2 ++ cpp/ql/test/library-tests/compiler_generated/cpp.cpp | 3 +++ 5 files changed, 15 insertions(+), 1 deletion(-) diff --git a/cpp/ql/lib/semmle/code/cpp/Initializer.qll b/cpp/ql/lib/semmle/code/cpp/Initializer.qll index 5748ab505e7c..6a5ad2c2a61c 100644 --- a/cpp/ql/lib/semmle/code/cpp/Initializer.qll +++ b/cpp/ql/lib/semmle/code/cpp/Initializer.qll @@ -54,4 +54,7 @@ class Initializer extends ControlFlowNode, @initialiser { /** Holds if the initializer used the C++ braced initializer notation. */ predicate isBraced() { braced_initialisers(underlyingElement(this)) } + + /** Holds if this initializer is generated by the compiler. */ + predicate isCompilerGenerated() { this.getDeclaration().(Variable).isCompilerGenerated() } } diff --git a/cpp/ql/lib/semmle/code/cpp/exprs/Expr.qll b/cpp/ql/lib/semmle/code/cpp/exprs/Expr.qll index 851d987b1fd6..82824445ccf2 100644 --- a/cpp/ql/lib/semmle/code/cpp/exprs/Expr.qll +++ b/cpp/ql/lib/semmle/code/cpp/exprs/Expr.qll @@ -108,7 +108,8 @@ class Expr extends StmtParent, @expr { /** Holds if this is an auxiliary expression generated by the compiler. */ predicate isCompilerGenerated() { compgenerated(underlyingElement(this)) or - this.getParent().(ConstructorFieldInit).isCompilerGenerated() + this.getParent().(ConstructorFieldInit).isCompilerGenerated() or + this.getParent().(Initializer).isCompilerGenerated() } /** diff --git a/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected b/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected index b61085ff7c69..7d5b6957d7be 100644 --- a/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected +++ b/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected @@ -16,5 +16,10 @@ | cpp.cpp:15:5:15:12 | call to ~MyClass | Expr | | cpp.cpp:15:12:15:12 | reuse of m | Expr | | cpp.cpp:16:1:16:1 | return ... | Stmt | +| cpp.cpp:19:26:19:44 | __PRETTY_FUNCTION__ | Variable | +| cpp.cpp:19:26:19:44 | array to pointer conversion | Expr | +| cpp.cpp:19:26:19:44 | initializer for __PRETTY_FUNCTION__ | Initializer | +| cpp.cpp:19:26:19:44 | void uses_pretty_function() | Expr | +| cpp.cpp:20:1:20:1 | return ... | Stmt | | file://:0:0:0:0 | operator delete | Function | | file://:0:0:0:0 | operator new | Function | diff --git a/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.ql b/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.ql index 0eb620f0c792..1ed4a9395e19 100644 --- a/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.ql +++ b/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.ql @@ -9,4 +9,6 @@ where e.(Variable).isCompilerGenerated() and type = "Variable" or e.(Stmt).isCompilerGenerated() and type = "Stmt" + or + e.(Initializer).isCompilerGenerated() and type = "Initializer" select e, type diff --git a/cpp/ql/test/library-tests/compiler_generated/cpp.cpp b/cpp/ql/test/library-tests/compiler_generated/cpp.cpp index 058bba7ba411..c751fd32ab35 100644 --- a/cpp/ql/test/library-tests/compiler_generated/cpp.cpp +++ b/cpp/ql/test/library-tests/compiler_generated/cpp.cpp @@ -15,3 +15,6 @@ void g1(void) { delete m; } +void uses_pretty_function() { + const char* pretty = __PRETTY_FUNCTION__; +} \ No newline at end of file From b711b3249329f2d0e6fda47b48a07b2aa6bd6ccd Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 21 Aug 2026 15:05:32 +0100 Subject: [PATCH 0463/2098] C++: Add change note. --- cpp/ql/lib/change-notes/2026-08-21-compiler-generated.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 cpp/ql/lib/change-notes/2026-08-21-compiler-generated.md diff --git a/cpp/ql/lib/change-notes/2026-08-21-compiler-generated.md b/cpp/ql/lib/change-notes/2026-08-21-compiler-generated.md new file mode 100644 index 000000000000..eed0d6c8c389 --- /dev/null +++ b/cpp/ql/lib/change-notes/2026-08-21-compiler-generated.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Initializers of compiler-generated variables are now recognized as compiler-generated. A new predicate `isCompilerGenerated` on `Initializer` has been added to reflect this. \ No newline at end of file From 3d1a64d7f16ed970b7ce652286efe28ca2d557f5 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 21 Aug 2026 15:09:18 +0100 Subject: [PATCH 0464/2098] C++: Add a test for the static local compiler-generated variable that's generated by the frontend on empty parameter packs. --- .../compiler_generated/compilerGenerated.expected | 4 ++++ cpp/ql/test/library-tests/compiler_generated/cpp.cpp | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected b/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected index 7d5b6957d7be..145ad526a14a 100644 --- a/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected +++ b/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected @@ -21,5 +21,9 @@ | cpp.cpp:19:26:19:44 | initializer for __PRETTY_FUNCTION__ | Initializer | | cpp.cpp:19:26:19:44 | void uses_pretty_function() | Expr | | cpp.cpp:20:1:20:1 | return ... | Stmt | +| cpp.cpp:23:29:23:32 | args | Variable | +| cpp.cpp:23:37:23:37 | return ... | Stmt | +| cpp.cpp:23:37:23:37 | return ... | Stmt | +| cpp.cpp:27:1:27:1 | return ... | Stmt | | file://:0:0:0:0 | operator delete | Function | | file://:0:0:0:0 | operator new | Function | diff --git a/cpp/ql/test/library-tests/compiler_generated/cpp.cpp b/cpp/ql/test/library-tests/compiler_generated/cpp.cpp index c751fd32ab35..6cbf15751edd 100644 --- a/cpp/ql/test/library-tests/compiler_generated/cpp.cpp +++ b/cpp/ql/test/library-tests/compiler_generated/cpp.cpp @@ -17,4 +17,11 @@ void g1(void) { void uses_pretty_function() { const char* pretty = __PRETTY_FUNCTION__; +} + +template +void parameter_pack(Args... args) { } + +void test_parameter_pack() { + parameter_pack(); } \ No newline at end of file From e0ac3d507f65ff51e208e9964911b5b75510b0e1 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 21 Aug 2026 15:13:36 +0100 Subject: [PATCH 0465/2098] C++: Add a test with compiler-generated initializers from C++11 ranged for loops. --- .../compilerGenerated.expected | 23 +++++++++++++++++++ .../library-tests/compiler_generated/cpp.cpp | 7 ++++++ 2 files changed, 30 insertions(+) diff --git a/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected b/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected index 145ad526a14a..ae78a8adb29a 100644 --- a/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected +++ b/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected @@ -25,5 +25,28 @@ | cpp.cpp:23:37:23:37 | return ... | Stmt | | cpp.cpp:23:37:23:37 | return ... | Stmt | | cpp.cpp:27:1:27:1 | return ... | Stmt | +| cpp.cpp:31:5:31:5 | (__begin) | Variable | +| cpp.cpp:31:5:31:5 | (__end) | Variable | +| cpp.cpp:31:5:31:5 | (__range) | Variable | +| cpp.cpp:31:5:33:5 | declaration | Stmt | +| cpp.cpp:31:5:33:5 | declaration | Stmt | +| cpp.cpp:31:5:33:5 | declaration | Stmt | +| cpp.cpp:31:17:31:18 | (reference to) | Expr | +| cpp.cpp:31:17:31:18 | vs | Expr | +| cpp.cpp:34:1:34:1 | return ... | Stmt | +| file://:0:0:0:0 | (__begin) | Expr | +| file://:0:0:0:0 | (__begin) | Expr | +| file://:0:0:0:0 | (__begin) | Expr | +| file://:0:0:0:0 | (__end) | Expr | +| file://:0:0:0:0 | (__range) | Expr | +| file://:0:0:0:0 | (reference dereference) | Expr | +| file://:0:0:0:0 | (reference dereference) | Expr | +| file://:0:0:0:0 | * ... | Expr | +| file://:0:0:0:0 | ... + ... | Expr | +| file://:0:0:0:0 | array to pointer conversion | Expr | +| file://:0:0:0:0 | array to pointer conversion | Expr | +| file://:0:0:0:0 | initializer for (__begin) | Initializer | +| file://:0:0:0:0 | initializer for (__end) | Initializer | +| file://:0:0:0:0 | initializer for (__range) | Initializer | | file://:0:0:0:0 | operator delete | Function | | file://:0:0:0:0 | operator new | Function | diff --git a/cpp/ql/test/library-tests/compiler_generated/cpp.cpp b/cpp/ql/test/library-tests/compiler_generated/cpp.cpp index 6cbf15751edd..7525be8d40e8 100644 --- a/cpp/ql/test/library-tests/compiler_generated/cpp.cpp +++ b/cpp/ql/test/library-tests/compiler_generated/cpp.cpp @@ -24,4 +24,11 @@ void parameter_pack(Args... args) { } void test_parameter_pack() { parameter_pack(); +} + +void ranged_for() { + int vs[] = {1, 2, 3}; + for(int i : vs) { + + } } \ No newline at end of file From 6b87a58950da1d1b80c03265f7e17f16c31b3425 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 21 Aug 2026 15:20:29 +0100 Subject: [PATCH 0466/2098] C++: Require orphaned variables when computing compiler-generated initializers. --- cpp/ql/lib/semmle/code/cpp/Initializer.qll | 10 +++++++++- .../compiler_generated/compilerGenerated.expected | 6 ------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/Initializer.qll b/cpp/ql/lib/semmle/code/cpp/Initializer.qll index 6a5ad2c2a61c..6f03ec84116b 100644 --- a/cpp/ql/lib/semmle/code/cpp/Initializer.qll +++ b/cpp/ql/lib/semmle/code/cpp/Initializer.qll @@ -56,5 +56,13 @@ class Initializer extends ControlFlowNode, @initialiser { predicate isBraced() { braced_initialisers(underlyingElement(this)) } /** Holds if this initializer is generated by the compiler. */ - predicate isCompilerGenerated() { this.getDeclaration().(Variable).isCompilerGenerated() } + predicate isCompilerGenerated() { + exists(Variable v | + v = this.getDeclaration() and + // We require the variable to be an orphan to not mark the initializer + // from a desugared ranged for loop as compiler generated. + orphaned_variables(unresolveElement(v), _) and + v.isCompilerGenerated() + ) + } } diff --git a/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected b/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected index ae78a8adb29a..c78e4af1d6a4 100644 --- a/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected +++ b/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected @@ -32,21 +32,15 @@ | cpp.cpp:31:5:33:5 | declaration | Stmt | | cpp.cpp:31:5:33:5 | declaration | Stmt | | cpp.cpp:31:17:31:18 | (reference to) | Expr | -| cpp.cpp:31:17:31:18 | vs | Expr | | cpp.cpp:34:1:34:1 | return ... | Stmt | | file://:0:0:0:0 | (__begin) | Expr | | file://:0:0:0:0 | (__begin) | Expr | | file://:0:0:0:0 | (__begin) | Expr | | file://:0:0:0:0 | (__end) | Expr | -| file://:0:0:0:0 | (__range) | Expr | | file://:0:0:0:0 | (reference dereference) | Expr | | file://:0:0:0:0 | (reference dereference) | Expr | | file://:0:0:0:0 | * ... | Expr | -| file://:0:0:0:0 | ... + ... | Expr | | file://:0:0:0:0 | array to pointer conversion | Expr | | file://:0:0:0:0 | array to pointer conversion | Expr | -| file://:0:0:0:0 | initializer for (__begin) | Initializer | -| file://:0:0:0:0 | initializer for (__end) | Initializer | -| file://:0:0:0:0 | initializer for (__range) | Initializer | | file://:0:0:0:0 | operator delete | Function | | file://:0:0:0:0 | operator new | Function | From ba5654f74c7c95441f392a46ee7a737d053ca27e Mon Sep 17 00:00:00 2001 From: Arun Krishnamurthy Date: Fri, 21 Aug 2026 14:27:09 -0500 Subject: [PATCH 0467/2098] Swift: avoid module scan for lazy body emission Signed-off-by: Arun Krishnamurthy --- swift/extractor/infra/SwiftBodyEmissionStrategy.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/swift/extractor/infra/SwiftBodyEmissionStrategy.h b/swift/extractor/infra/SwiftBodyEmissionStrategy.h index b97600cc63c8..52c8efcf0d19 100644 --- a/swift/extractor/infra/SwiftBodyEmissionStrategy.h +++ b/swift/extractor/infra/SwiftBodyEmissionStrategy.h @@ -13,9 +13,11 @@ class SwiftBodyEmissionStrategy { : currentModule(currentModule), currentPrimarySourceFile(currentPrimarySourceFile), currentLazyDeclaration(currentLazyDeclaration) { - llvm::SmallVector decls; - currentModule.getTopLevelDecls(decls); - currentTopLevelDecls.insert(decls.begin(), decls.end()); + if (!currentLazyDeclaration) { + llvm::SmallVector decls; + currentModule.getTopLevelDecls(decls); + currentTopLevelDecls.insert(decls.begin(), decls.end()); + } } bool shouldEmitDeclBody(const swift::Decl& decl); From c8afb1da392b507a364c28d9b58a431b9fbd3782 Mon Sep 17 00:00:00 2001 From: Mia Miu Date: Sat, 22 Aug 2026 17:27:34 +1200 Subject: [PATCH 0468/2098] Use HTTPS for Wikimedia query-help links --- cpp/ql/src/Best Practices/Exceptions/CatchingByValue.qhelp | 2 +- cpp/ql/src/Best Practices/Exceptions/ThrowingPointers.qhelp | 2 +- .../Likely Errors/OffsetUseBeforeRangeCheck.qhelp | 2 +- cpp/ql/src/Best Practices/Likely Errors/Slicing.qhelp | 2 +- .../Magic Constants/MagicConstantsNumbers.qhelp | 2 +- .../Best Practices/Magic Constants/MagicConstantsString.qhelp | 2 +- cpp/ql/src/Best Practices/RuleOfThree.qhelp | 2 +- cpp/ql/src/Best Practices/RuleOfTwo.qhelp | 2 +- cpp/ql/src/Documentation/DocumentApi.qhelp | 4 ++-- cpp/ql/src/Documentation/FixmeComments.qhelp | 2 +- cpp/ql/src/Documentation/TodoComments.qhelp | 2 +- cpp/ql/src/Documentation/UncommentedFunction.qhelp | 4 ++-- cpp/ql/src/Header Cleanup/Cleanup-DuplicateIncludeGuard.qhelp | 2 +- cpp/ql/src/Likely Bugs/Arithmetic/BadCheckOdd.qhelp | 2 +- .../Likely Bugs/Likely Typos/AssignWhereCompareMeant.qhelp | 2 +- .../Likely Bugs/Likely Typos/CompareWhereAssignMeant.qhelp | 2 +- .../src/Likely Bugs/OO/IncorrectConstructorDelegation.qhelp | 2 +- cpp/ql/src/Metrics/Files/FCommentRatio.qhelp | 4 ++-- cpp/ql/src/Metrics/Files/FCyclomaticComplexity.qhelp | 4 ++-- cpp/ql/src/Metrics/Files/FLinesOfCode.qhelp | 2 +- cpp/ql/src/Metrics/Files/FLinesOfComments.qhelp | 4 ++-- cpp/ql/src/Metrics/Files/FTodoComments.qhelp | 2 +- cpp/ql/src/Metrics/Functions/FunLinesOfComments.qhelp | 4 ++-- cpp/ql/src/Metrics/Functions/FunPercentageOfComments.qhelp | 4 ++-- cpp/ql/src/Security/CWE/CWE-079/CgiXss.qhelp | 2 +- .../src/Security/CWE/CWE-676/DangerousFunctionOverflow.qhelp | 2 +- cpp/ql/src/jsf/4.10 Classes/AV Rule 79.qhelp | 2 +- csharp/ql/src/Bad Practices/CallsUnmanagedCode.qhelp | 2 +- csharp/ql/src/Bad Practices/Comments/TodoComments.qhelp | 2 +- csharp/ql/src/Bad Practices/Declarations/EmptyInterface.qhelp | 2 +- csharp/ql/src/Bad Practices/UnmanagedCodeCheck.qhelp | 2 +- csharp/ql/src/Dead Code/DeadStoreOfLocal.qhelp | 2 +- csharp/ql/src/Likely Bugs/BadCheckOdd.qhelp | 2 +- csharp/ql/src/Metrics/Callables/CCyclomaticComplexity.qhelp | 4 ++-- csharp/ql/src/Metrics/Files/FCyclomaticComplexity.qhelp | 4 ++-- csharp/ql/src/Metrics/Files/FSelfContainedness.qhelp | 2 +- csharp/ql/src/Metrics/RefTypes/TUnmanagedCode.qhelp | 2 +- csharp/ql/src/Security Features/CWE-079/XSS.qhelp | 2 +- csharp/ql/src/Security Features/InadequateRSAPadding.qhelp | 2 +- csharp/ql/src/Security Features/InsecureRandomness.qhelp | 2 +- csharp/ql/src/Security Features/InsufficientKeySize.qhelp | 2 +- csharp/ql/src/Security Features/WeakEncryption.qhelp | 4 ++-- go/ql/src/RedundantCode/DeadStoreOfLocal.qhelp | 2 +- go/ql/src/RedundantCode/UnreachableStatement.qhelp | 2 +- go/ql/src/Security/CWE-079/ReflectedXss.qhelp | 2 +- go/ql/src/Security/CWE-079/StoredXss.qhelp | 2 +- go/ql/src/Security/CWE-338/InsecureRandomness.qhelp | 2 +- java/ql/src/Likely Bugs/Concurrency/LazyInitStaticField.qhelp | 2 +- java/ql/src/Metrics/Callables/CCyclomaticComplexity.qhelp | 2 +- java/ql/src/Metrics/Files/FCyclomaticComplexity.qhelp | 4 ++-- .../src/Metrics/Files/FLinesOfDuplicatedCodeCommon.inc.qhelp | 2 +- java/ql/src/Metrics/Files/FLinesOfSimilarCode.qhelp | 2 +- java/ql/src/Metrics/Files/FSelfContainedness.qhelp | 2 +- java/ql/src/Metrics/RefTypes/TSelfContainedness.qhelp | 2 +- java/ql/src/Security/CWE/CWE-079/XSS.qhelp | 2 +- java/ql/src/Security/CWE/CWE-113/ResponseSplitting.qhelp | 2 +- java/ql/src/Security/CWE/CWE-326/InsufficientKeySize.qhelp | 2 +- java/ql/src/Security/CWE/CWE-330/InsecureRandomness.qhelp | 2 +- java/ql/src/Security/CWE/CWE-501/TrustBoundaryViolation.qhelp | 2 +- .../Violations of Best Practice/Comments/TodoComments.qhelp | 4 ++-- .../Violations of Best Practice/Dead Code/DeadRefTypes.qhelp | 2 +- javascript/ql/src/Comments/TodoComments.qhelp | 2 +- javascript/ql/src/Declarations/DeadStore.inc.qhelp | 2 +- javascript/ql/src/LanguageFeatures/Eval.qhelp | 2 +- javascript/ql/src/Metrics/FCyclomaticComplexity.qhelp | 4 ++-- .../ql/src/Metrics/FLinesOfDuplicatedCodeCommon.inc.qhelp | 2 +- javascript/ql/src/Metrics/FLinesOfSimilarCodeCommon.inc.qhelp | 2 +- javascript/ql/src/Metrics/FunCyclomaticComplexity.qhelp | 2 +- javascript/ql/src/Security/CWE-079/ExceptionXss.qhelp | 2 +- javascript/ql/src/Security/CWE-079/ReflectedXss.qhelp | 2 +- javascript/ql/src/Security/CWE-079/StoredXss.qhelp | 2 +- .../ql/src/Security/CWE-079/UnsafeHtmlConstruction.qhelp | 2 +- javascript/ql/src/Security/CWE-079/UnsafeJQueryPlugin.qhelp | 2 +- javascript/ql/src/Security/CWE-079/Xss.inc.qhelp | 2 +- javascript/ql/src/Security/CWE-079/XssThroughDom.qhelp | 2 +- .../CWE-116/IncompleteHtmlAttributeSanitization.qhelp | 2 +- javascript/ql/src/Security/CWE-116/UnsafeHtmlExpansion.qhelp | 2 +- javascript/ql/src/Security/CWE-338/InsecureRandomness.qhelp | 2 +- javascript/ql/src/Statements/DanglingElse.qhelp | 2 +- javascript/ql/src/Statements/UnreachableStatement.qhelp | 2 +- .../experimental/insecure-randomness/InsecureRandomness.qhelp | 2 +- ruby/ql/src/queries/security/cwe-079/ReflectedXSS.qhelp | 2 +- ruby/ql/src/queries/security/cwe-079/StoredXSS.qhelp | 2 +- .../src/queries/security/cwe-079/UnsafeHtmlConstruction.qhelp | 2 +- ruby/ql/src/queries/variables/DeadStoreOfLocal.qhelp | 2 +- 85 files changed, 98 insertions(+), 98 deletions(-) diff --git a/cpp/ql/src/Best Practices/Exceptions/CatchingByValue.qhelp b/cpp/ql/src/Best Practices/Exceptions/CatchingByValue.qhelp index 3c60845c4a54..82bed0bc088e 100644 --- a/cpp/ql/src/Best Practices/Exceptions/CatchingByValue.qhelp +++ b/cpp/ql/src/Best Practices/Exceptions/CatchingByValue.qhelp @@ -43,7 +43,7 @@ void good() {
  • C++ FAQ: What should I throw?, What should I catch?.
  • -
  • Wikibooks: +
  • Wikibooks: Throwing objects.
  • diff --git a/cpp/ql/src/Best Practices/Exceptions/ThrowingPointers.qhelp b/cpp/ql/src/Best Practices/Exceptions/ThrowingPointers.qhelp index a05903bd350e..cbbe423c647d 100644 --- a/cpp/ql/src/Best Practices/Exceptions/ThrowingPointers.qhelp +++ b/cpp/ql/src/Best Practices/Exceptions/ThrowingPointers.qhelp @@ -36,7 +36,7 @@ void good() {
  • C++ FAQ: What should I throw?, What should I catch?.
  • -
  • Wikibooks: +
  • Wikibooks: Throwing objects.
  • diff --git a/cpp/ql/src/Best Practices/Likely Errors/OffsetUseBeforeRangeCheck.qhelp b/cpp/ql/src/Best Practices/Likely Errors/OffsetUseBeforeRangeCheck.qhelp index 6ffb30be5840..d12e1821b2d7 100644 --- a/cpp/ql/src/Best Practices/Likely Errors/OffsetUseBeforeRangeCheck.qhelp +++ b/cpp/ql/src/Best Practices/Likely Errors/OffsetUseBeforeRangeCheck.qhelp @@ -21,7 +21,7 @@
  • cplusplus.com: C++: array.
  • -
  • Wikipedia: +
  • Wikipedia: Bounds checking.
  • diff --git a/cpp/ql/src/Best Practices/Likely Errors/Slicing.qhelp b/cpp/ql/src/Best Practices/Likely Errors/Slicing.qhelp index 576d77c8839c..282f592e0f61 100644 --- a/cpp/ql/src/Best Practices/Likely Errors/Slicing.qhelp +++ b/cpp/ql/src/Best Practices/Likely Errors/Slicing.qhelp @@ -20,7 +20,7 @@ These assignments slice off all the fields added by the derived type, and can ca
  • - Wikipedia: Object slicing. + Wikipedia: Object slicing.
  • DevX.com: Slicing in C++. diff --git a/cpp/ql/src/Best Practices/Magic Constants/MagicConstantsNumbers.qhelp b/cpp/ql/src/Best Practices/Magic Constants/MagicConstantsNumbers.qhelp index aa97965996f2..4a5e0cff636e 100644 --- a/cpp/ql/src/Best Practices/Magic Constants/MagicConstantsNumbers.qhelp +++ b/cpp/ql/src/Best Practices/Magic Constants/MagicConstantsNumbers.qhelp @@ -35,7 +35,7 @@ then replace all the relevant occurrences in the code.

  • -Magic number (Wikipedia) +Magic number (Wikipedia)
  • Mats Henricson and Erik Nyquist, Industrial Strength C++, published by Prentice Hall PTR (1997). diff --git a/cpp/ql/src/Best Practices/Magic Constants/MagicConstantsString.qhelp b/cpp/ql/src/Best Practices/Magic Constants/MagicConstantsString.qhelp index 19182fe5b19d..c1ccb94f59ea 100644 --- a/cpp/ql/src/Best Practices/Magic Constants/MagicConstantsString.qhelp +++ b/cpp/ql/src/Best Practices/Magic Constants/MagicConstantsString.qhelp @@ -34,7 +34,7 @@ constant.

  • -Magic string (Wikipedia) +Magic string (Wikipedia)
  • Mats Henricson and Erik Nyquist, Industrial Strength C++, published by Prentice Hall PTR (1997). diff --git a/cpp/ql/src/Best Practices/RuleOfThree.qhelp b/cpp/ql/src/Best Practices/RuleOfThree.qhelp index f9ac2b396b9b..1c8eace82f76 100644 --- a/cpp/ql/src/Best Practices/RuleOfThree.qhelp +++ b/cpp/ql/src/Best Practices/RuleOfThree.qhelp @@ -15,6 +15,6 @@ -
  • Wikipedia: Rule of three (C++ programming)
  • +
  • Wikipedia: Rule of three (C++ programming)
  • diff --git a/cpp/ql/src/Best Practices/RuleOfTwo.qhelp b/cpp/ql/src/Best Practices/RuleOfTwo.qhelp index b8d4e13d283e..167740b03d97 100644 --- a/cpp/ql/src/Best Practices/RuleOfTwo.qhelp +++ b/cpp/ql/src/Best Practices/RuleOfTwo.qhelp @@ -38,7 +38,7 @@ should never be called.
  • - Rule of Three [Wikipedia] + Rule of Three [Wikipedia]
  • The Law of The Big Two diff --git a/cpp/ql/src/Documentation/DocumentApi.qhelp b/cpp/ql/src/Documentation/DocumentApi.qhelp index 4154e5cebc4e..80225102cc9b 100644 --- a/cpp/ql/src/Documentation/DocumentApi.qhelp +++ b/cpp/ql/src/Documentation/DocumentApi.qhelp @@ -22,10 +22,10 @@ Add comments to document the purpose of the function. In particular, ensure that
  • - C++ Programming Wikibook: Comments + C++ Programming Wikibook: Comments
  • - Wikipedia: Need for comments + Wikipedia: Need for comments
  • diff --git a/cpp/ql/src/Documentation/FixmeComments.qhelp b/cpp/ql/src/Documentation/FixmeComments.qhelp index a4a0b9966a15..a884aee2bc8b 100644 --- a/cpp/ql/src/Documentation/FixmeComments.qhelp +++ b/cpp/ql/src/Documentation/FixmeComments.qhelp @@ -25,7 +25,7 @@ Fix the functionality indicated by the comment. If the comment no longer applies
  • - Wikipedia: Comment tags + Wikipedia: Comment tags
  • The case against TODO (and FIXME) diff --git a/cpp/ql/src/Documentation/TodoComments.qhelp b/cpp/ql/src/Documentation/TodoComments.qhelp index ad246ebf358f..30eb359cd972 100644 --- a/cpp/ql/src/Documentation/TodoComments.qhelp +++ b/cpp/ql/src/Documentation/TodoComments.qhelp @@ -25,7 +25,7 @@ Implement the functionality indicated by the comment. If the comment no longer a
  • - Wikipedia: Comment tags + Wikipedia: Comment tags
  • TODO or not TODO diff --git a/cpp/ql/src/Documentation/UncommentedFunction.qhelp b/cpp/ql/src/Documentation/UncommentedFunction.qhelp index 7fe5c61d9da3..1604ca496de3 100644 --- a/cpp/ql/src/Documentation/UncommentedFunction.qhelp +++ b/cpp/ql/src/Documentation/UncommentedFunction.qhelp @@ -23,10 +23,10 @@ cohesive functions.
  • - C++ Programming, Coding style conventions + C++ Programming, Coding style conventions
  • - Wikipedia: Need for comments + Wikipedia: Need for comments
  • diff --git a/cpp/ql/src/Header Cleanup/Cleanup-DuplicateIncludeGuard.qhelp b/cpp/ql/src/Header Cleanup/Cleanup-DuplicateIncludeGuard.qhelp index 20cb7ebe94fc..43e11ff20e8c 100644 --- a/cpp/ql/src/Header Cleanup/Cleanup-DuplicateIncludeGuard.qhelp +++ b/cpp/ql/src/Header Cleanup/Cleanup-DuplicateIncludeGuard.qhelp @@ -44,7 +44,7 @@ the second file, for example to ANOTHER_HEADER_FILE_H.

  • - Wikipedia: Include guard + Wikipedia: Include guard
  • diff --git a/cpp/ql/src/Likely Bugs/Arithmetic/BadCheckOdd.qhelp b/cpp/ql/src/Likely Bugs/Arithmetic/BadCheckOdd.qhelp index 13df1938bc3a..6d36cc6230f2 100644 --- a/cpp/ql/src/Likely Bugs/Arithmetic/BadCheckOdd.qhelp +++ b/cpp/ql/src/Likely Bugs/Arithmetic/BadCheckOdd.qhelp @@ -26,7 +26,7 @@ As a result, this check incorrectly considers all negative numbers as even. MSDN Library: Multiplicative Operators and the Modulus Operator.
  • - Wikipedia: Modulo Operation - Common pitfalls. + Wikipedia: Modulo Operation - Common pitfalls.
  • diff --git a/cpp/ql/src/Likely Bugs/Likely Typos/AssignWhereCompareMeant.qhelp b/cpp/ql/src/Likely Bugs/Likely Typos/AssignWhereCompareMeant.qhelp index 91ae1ce665b1..bef47aecc51c 100644 --- a/cpp/ql/src/Likely Bugs/Likely Typos/AssignWhereCompareMeant.qhelp +++ b/cpp/ql/src/Likely Bugs/Likely Typos/AssignWhereCompareMeant.qhelp @@ -30,7 +30,7 @@ An assignment is only flagged if its right hand side is a compile-time constant. Tutorialspoint - The C++ Programming Language: Operators in C++
  • - Wikipedia: Operators in C and C++ + Wikipedia: Operators in C and C++
  • diff --git a/cpp/ql/src/Likely Bugs/Likely Typos/CompareWhereAssignMeant.qhelp b/cpp/ql/src/Likely Bugs/Likely Typos/CompareWhereAssignMeant.qhelp index 6c1921cda991..437db4cb05c1 100644 --- a/cpp/ql/src/Likely Bugs/Likely Typos/CompareWhereAssignMeant.qhelp +++ b/cpp/ql/src/Likely Bugs/Likely Typos/CompareWhereAssignMeant.qhelp @@ -28,7 +28,7 @@ The rule flags every occurrence of an equality operator in a position where its Tutorialspoint - The C++ Programming Language: Operators in C++
  • - Wikipedia: Operators in C and C++ + Wikipedia: Operators in C and C++
  • diff --git a/cpp/ql/src/Likely Bugs/OO/IncorrectConstructorDelegation.qhelp b/cpp/ql/src/Likely Bugs/OO/IncorrectConstructorDelegation.qhelp index 88af1203ef9e..3c3c615cd1d6 100644 --- a/cpp/ql/src/Likely Bugs/OO/IncorrectConstructorDelegation.qhelp +++ b/cpp/ql/src/Likely Bugs/OO/IncorrectConstructorDelegation.qhelp @@ -60,7 +60,7 @@ public:
  • Dr Dobb's Journal: Delegating constructors?
  • -
  • Wikipedia: +
  • Wikipedia: Object construction improvement in C++11.
  • diff --git a/cpp/ql/src/Metrics/Files/FCommentRatio.qhelp b/cpp/ql/src/Metrics/Files/FCommentRatio.qhelp index 4a5c928f5cd4..33829320b3e1 100644 --- a/cpp/ql/src/Metrics/Files/FCommentRatio.qhelp +++ b/cpp/ql/src/Metrics/Files/FCommentRatio.qhelp @@ -18,10 +18,10 @@ documenting the public functions first.

  • - C++ Programming, Coding style conventions + C++ Programming, Coding style conventions
  • - Wikipedia: Need for comments + Wikipedia: Need for comments
  • diff --git a/cpp/ql/src/Metrics/Files/FCyclomaticComplexity.qhelp b/cpp/ql/src/Metrics/Files/FCyclomaticComplexity.qhelp index be463857db9a..6bd6e7b47183 100644 --- a/cpp/ql/src/Metrics/Files/FCyclomaticComplexity.qhelp +++ b/cpp/ql/src/Metrics/Files/FCyclomaticComplexity.qhelp @@ -67,10 +67,10 @@ T. J. McCabe, A Complexity Measure. IEEE Transactions on Software Engin Dave Thomas, Refactoring as Meta Programming?, in Journal of Object Technology, vol. 4, no. 1, January-February 2005, pp. 7-11.
  • -Wikipedia: Cyclomatic complexity +Wikipedia: Cyclomatic complexity
  • -Wikipedia: Code refactoring +Wikipedia: Code refactoring
  • diff --git a/cpp/ql/src/Metrics/Files/FLinesOfCode.qhelp b/cpp/ql/src/Metrics/Files/FLinesOfCode.qhelp index 4eb6c1c5b009..b8dfc4e70f24 100644 --- a/cpp/ql/src/Metrics/Files/FLinesOfCode.qhelp +++ b/cpp/ql/src/Metrics/Files/FLinesOfCode.qhelp @@ -19,7 +19,7 @@ M. Fowler. Refactoring. Addison-Wesley, 1999.
  • - Wikipedia: Code refactoring + Wikipedia: Code refactoring
  • Refactoring as Meta Programming? diff --git a/cpp/ql/src/Metrics/Files/FLinesOfComments.qhelp b/cpp/ql/src/Metrics/Files/FLinesOfComments.qhelp index d1b1d9849181..ed7aabe9971c 100644 --- a/cpp/ql/src/Metrics/Files/FLinesOfComments.qhelp +++ b/cpp/ql/src/Metrics/Files/FLinesOfComments.qhelp @@ -18,10 +18,10 @@ should be given to long files.

  • - C++ Programming, Coding style conventions + C++ Programming, Coding style conventions
  • - Wikipedia: Need for comments + Wikipedia: Need for comments
  • diff --git a/cpp/ql/src/Metrics/Files/FTodoComments.qhelp b/cpp/ql/src/Metrics/Files/FTodoComments.qhelp index a0906beb799e..7eb47a72c156 100644 --- a/cpp/ql/src/Metrics/Files/FTodoComments.qhelp +++ b/cpp/ql/src/Metrics/Files/FTodoComments.qhelp @@ -21,7 +21,7 @@ for fixing them.

  • - Wikipedia: Comment tags + Wikipedia: Comment tags
  • TODO or not TODO diff --git a/cpp/ql/src/Metrics/Functions/FunLinesOfComments.qhelp b/cpp/ql/src/Metrics/Functions/FunLinesOfComments.qhelp index 6232b6bd4418..05728eb3ad33 100644 --- a/cpp/ql/src/Metrics/Functions/FunLinesOfComments.qhelp +++ b/cpp/ql/src/Metrics/Functions/FunLinesOfComments.qhelp @@ -18,10 +18,10 @@ should be given to long, complex functions.

  • - C++ Programming, Coding style conventions + C++ Programming, Coding style conventions
  • - Wikipedia: Need for comments + Wikipedia: Need for comments
  • diff --git a/cpp/ql/src/Metrics/Functions/FunPercentageOfComments.qhelp b/cpp/ql/src/Metrics/Functions/FunPercentageOfComments.qhelp index 5f998e3e476d..92bb1dc7e41f 100644 --- a/cpp/ql/src/Metrics/Functions/FunPercentageOfComments.qhelp +++ b/cpp/ql/src/Metrics/Functions/FunPercentageOfComments.qhelp @@ -17,10 +17,10 @@ documentation.

  • - C++ Programming, Coding style conventions + C++ Programming, Coding style conventions
  • - Wikipedia: Need for comments + Wikipedia: Need for comments
  • diff --git a/cpp/ql/src/Security/CWE/CWE-079/CgiXss.qhelp b/cpp/ql/src/Security/CWE/CWE-079/CgiXss.qhelp index 4ad7a40fed60..bfbc7c32746b 100644 --- a/cpp/ql/src/Security/CWE/CWE-079/CgiXss.qhelp +++ b/cpp/ql/src/Security/CWE/CWE-079/CgiXss.qhelp @@ -38,7 +38,7 @@ OWASP: (Cross Site Scripting) Prevention Cheat Sheet.
  • -Wikipedia: Cross-site scripting. +Wikipedia: Cross-site scripting.
  • IETF Tools: The Common Gateway Specification (CGI).
  • diff --git a/cpp/ql/src/Security/CWE/CWE-676/DangerousFunctionOverflow.qhelp b/cpp/ql/src/Security/CWE/CWE-676/DangerousFunctionOverflow.qhelp index 17b34f1f37e7..72a559d43e2b 100644 --- a/cpp/ql/src/Security/CWE/CWE-676/DangerousFunctionOverflow.qhelp +++ b/cpp/ql/src/Security/CWE/CWE-676/DangerousFunctionOverflow.qhelp @@ -36,7 +36,7 @@ rules for the following CWEs:

    -
  • Wikipedia: Morris worm.
  • +
  • Wikipedia: Morris worm.
  • E. Spafford. The Internet Worm Program: An Analysis. Purdue Technical Report CSD-TR-823, (online), 1988.
  • diff --git a/cpp/ql/src/jsf/4.10 Classes/AV Rule 79.qhelp b/cpp/ql/src/jsf/4.10 Classes/AV Rule 79.qhelp index a5b94460d43b..aa58cc17cbc7 100644 --- a/cpp/ql/src/jsf/4.10 Classes/AV Rule 79.qhelp +++ b/cpp/ql/src/jsf/4.10 Classes/AV Rule 79.qhelp @@ -87,7 +87,7 @@ to a straightforward RAII pattern. This can be achieved in several steps:

    S. Meyers. Effective C++ 3d ed. pp 61-66. Addison-Wesley Professional, 2005.
  • - Resource Acquisition Is Initialization + Resource Acquisition Is Initialization
  • diff --git a/csharp/ql/src/Bad Practices/CallsUnmanagedCode.qhelp b/csharp/ql/src/Bad Practices/CallsUnmanagedCode.qhelp index d1ceae7b2f36..4d5d99186d7d 100644 --- a/csharp/ql/src/Bad Practices/CallsUnmanagedCode.qhelp +++ b/csharp/ql/src/Bad Practices/CallsUnmanagedCode.qhelp @@ -28,7 +28,7 @@ the User32.dll library.

  • MSDN, C# Reference extern.
  • -
  • Wikipedia, Managed code.
  • +
  • Wikipedia, Managed code.
  • diff --git a/csharp/ql/src/Bad Practices/Comments/TodoComments.qhelp b/csharp/ql/src/Bad Practices/Comments/TodoComments.qhelp index d8a4359750f3..f65d6809b4a7 100644 --- a/csharp/ql/src/Bad Practices/Comments/TodoComments.qhelp +++ b/csharp/ql/src/Bad Practices/Comments/TodoComments.qhelp @@ -44,7 +44,7 @@ Approxion:
  • Wikipedia: -Comment tags. +Comment tags.
  • diff --git a/csharp/ql/src/Bad Practices/Declarations/EmptyInterface.qhelp b/csharp/ql/src/Bad Practices/Declarations/EmptyInterface.qhelp index b92bf3533b4d..68c9437b84f0 100644 --- a/csharp/ql/src/Bad Practices/Declarations/EmptyInterface.qhelp +++ b/csharp/ql/src/Bad Practices/Declarations/EmptyInterface.qhelp @@ -24,7 +24,7 @@ being used as a marker.

    -
  • Wikipedia: Marker interface pattern
  • +
  • Wikipedia: Marker interface pattern
  • Microsoft: Using Attributes in C#
  • diff --git a/csharp/ql/src/Bad Practices/UnmanagedCodeCheck.qhelp b/csharp/ql/src/Bad Practices/UnmanagedCodeCheck.qhelp index 7c0f24517255..ac13c5bc118b 100644 --- a/csharp/ql/src/Bad Practices/UnmanagedCodeCheck.qhelp +++ b/csharp/ql/src/Bad Practices/UnmanagedCodeCheck.qhelp @@ -23,7 +23,7 @@ same function being performed by managed code is shown after.

  • MSDN, C# Reference extern.
  • -
  • Wikipedia, Managed code.
  • +
  • Wikipedia, Managed code.
  • diff --git a/csharp/ql/src/Dead Code/DeadStoreOfLocal.qhelp b/csharp/ql/src/Dead Code/DeadStoreOfLocal.qhelp index 6e4ca17ec6a7..628e683f2ca5 100644 --- a/csharp/ql/src/Dead Code/DeadStoreOfLocal.qhelp +++ b/csharp/ql/src/Dead Code/DeadStoreOfLocal.qhelp @@ -64,7 +64,7 @@ The revised example eliminates the unread assignments.

    -
  • Wikipedia: Dead store.
  • +
  • Wikipedia: Dead store.
  • MSDN, Code Analysis for Managed Code, CA1804: Remove unused locals.
  • Microsoft: What's new in C# 7 - Discards.
  • diff --git a/csharp/ql/src/Likely Bugs/BadCheckOdd.qhelp b/csharp/ql/src/Likely Bugs/BadCheckOdd.qhelp index e0fc5d6d1ac4..4a87583b0bbe 100644 --- a/csharp/ql/src/Likely Bugs/BadCheckOdd.qhelp +++ b/csharp/ql/src/Likely Bugs/BadCheckOdd.qhelp @@ -36,7 +36,7 @@ Consider using x % 2 != 0 to check for odd and x % 2 == 0% Operator (C# Reference).
  • - Wikipedia: Modulo Operation - Common pitfalls. + Wikipedia: Modulo Operation - Common pitfalls.
  • diff --git a/csharp/ql/src/Metrics/Callables/CCyclomaticComplexity.qhelp b/csharp/ql/src/Metrics/Callables/CCyclomaticComplexity.qhelp index 56419eca6e2f..7bd1be9c8160 100644 --- a/csharp/ql/src/Metrics/Callables/CCyclomaticComplexity.qhelp +++ b/csharp/ql/src/Metrics/Callables/CCyclomaticComplexity.qhelp @@ -32,8 +32,8 @@ testing easier because each helper method can be tested individually.

    -
  • Wikipedia. Cyclomatic complexity.
  • -
  • Wikipedia. Control flow diagram.
  • +
  • Wikipedia. Cyclomatic complexity.
  • +
  • Wikipedia. Control flow diagram.
  • Wolfram MathWorld. Linearly Independent.
  • diff --git a/csharp/ql/src/Metrics/Files/FCyclomaticComplexity.qhelp b/csharp/ql/src/Metrics/Files/FCyclomaticComplexity.qhelp index d9959a9066ec..3859330a1b00 100644 --- a/csharp/ql/src/Metrics/Files/FCyclomaticComplexity.qhelp +++ b/csharp/ql/src/Metrics/Files/FCyclomaticComplexity.qhelp @@ -67,10 +67,10 @@ T. J. McCabe, A Complexity Measure. IEEE Transactions on Software Engin Dave Thomas, Refactoring as Meta Programming?, in Journal of Object Technology, vol. 4, no. 1, January-February 2005, pp. 7-11.
  • -Wikipedia: Cyclomatic complexity +Wikipedia: Cyclomatic complexity
  • -Wikipedia: Code refactoring +Wikipedia: Code refactoring
  • diff --git a/csharp/ql/src/Metrics/Files/FSelfContainedness.qhelp b/csharp/ql/src/Metrics/Files/FSelfContainedness.qhelp index d8142ffa8ecd..213ea1cfd3fe 100644 --- a/csharp/ql/src/Metrics/Files/FSelfContainedness.qhelp +++ b/csharp/ql/src/Metrics/Files/FSelfContainedness.qhelp @@ -19,7 +19,7 @@ should also try to use libraries with source code available.

    -
  • Wikipedia. Software Portability.
  • +
  • Wikipedia. Software Portability.
  • diff --git a/csharp/ql/src/Metrics/RefTypes/TUnmanagedCode.qhelp b/csharp/ql/src/Metrics/RefTypes/TUnmanagedCode.qhelp index 8106b90d7b40..0a4b3a4c5fd4 100644 --- a/csharp/ql/src/Metrics/RefTypes/TUnmanagedCode.qhelp +++ b/csharp/ql/src/Metrics/RefTypes/TUnmanagedCode.qhelp @@ -28,7 +28,7 @@ unmanaged code from the User32.dll library.

  • MSDN, C# Reference. extern.
  • -
  • Wikipedia. Managed code.
  • +
  • Wikipedia. Managed code.
  • diff --git a/csharp/ql/src/Security Features/CWE-079/XSS.qhelp b/csharp/ql/src/Security Features/CWE-079/XSS.qhelp index a6183e13c8ed..e766ef6726eb 100644 --- a/csharp/ql/src/Security Features/CWE-079/XSS.qhelp +++ b/csharp/ql/src/Security Features/CWE-079/XSS.qhelp @@ -40,7 +40,7 @@ OWASP: (Cross Site Scripting) Prevention Cheat Sheet.
  • -Wikipedia: Cross-site scripting. +Wikipedia: Cross-site scripting.
  • diff --git a/csharp/ql/src/Security Features/InadequateRSAPadding.qhelp b/csharp/ql/src/Security Features/InadequateRSAPadding.qhelp index cee74515198c..22bad62ea611 100644 --- a/csharp/ql/src/Security Features/InadequateRSAPadding.qhelp +++ b/csharp/ql/src/Security Features/InadequateRSAPadding.qhelp @@ -12,7 +12,7 @@ -
  • Wikipedia. RSA. Padding Schemes.
  • +
  • Wikipedia. RSA. Padding Schemes.
  • diff --git a/csharp/ql/src/Security Features/InsecureRandomness.qhelp b/csharp/ql/src/Security Features/InsecureRandomness.qhelp index 6f9634643ec3..3cecacab77e4 100644 --- a/csharp/ql/src/Security Features/InsecureRandomness.qhelp +++ b/csharp/ql/src/Security Features/InsecureRandomness.qhelp @@ -57,7 +57,7 @@ library method, which generates a password with a bias, therefore should be avoi -
  • Wikipedia. Pseudo-random number generator.
  • +
  • Wikipedia. Pseudo-random number generator.
  • MSDN. RandomNumberGenerator.
  • MSDN. Membership.GeneratePassword.
  • diff --git a/csharp/ql/src/Security Features/InsufficientKeySize.qhelp b/csharp/ql/src/Security Features/InsufficientKeySize.qhelp index 906881cf0c25..da61b8a3200c 100644 --- a/csharp/ql/src/Security Features/InsufficientKeySize.qhelp +++ b/csharp/ql/src/Security Features/InsufficientKeySize.qhelp @@ -14,7 +14,7 @@ symmetric encryption.

    -
  • Wikipedia. Key size.
  • +
  • Wikipedia. Key size.
  • diff --git a/csharp/ql/src/Security Features/WeakEncryption.qhelp b/csharp/ql/src/Security Features/WeakEncryption.qhelp index 1749144ae8b9..17ddee743501 100644 --- a/csharp/ql/src/Security Features/WeakEncryption.qhelp +++ b/csharp/ql/src/Security Features/WeakEncryption.qhelp @@ -17,8 +17,8 @@ -
  • Wikipedia: Key Size
  • -
  • Wikipedia: DES
  • +
  • Wikipedia: Key Size
  • +
  • Wikipedia: DES
  • diff --git a/go/ql/src/RedundantCode/DeadStoreOfLocal.qhelp b/go/ql/src/RedundantCode/DeadStoreOfLocal.qhelp index fd8d49d6bcd2..9e9aa12da8a1 100644 --- a/go/ql/src/RedundantCode/DeadStoreOfLocal.qhelp +++ b/go/ql/src/RedundantCode/DeadStoreOfLocal.qhelp @@ -39,7 +39,7 @@ use _. -
  • Wikipedia: Dead store.
  • +
  • Wikipedia: Dead store.
  • The Go Programming Language Specification: Blank identifier.
  • diff --git a/go/ql/src/RedundantCode/UnreachableStatement.qhelp b/go/ql/src/RedundantCode/UnreachableStatement.qhelp index ae3feadf2402..153bb7f20be1 100644 --- a/go/ql/src/RedundantCode/UnreachableStatement.qhelp +++ b/go/ql/src/RedundantCode/UnreachableStatement.qhelp @@ -31,6 +31,6 @@ statement: -
  • Wikipedia: Unreachable code.
  • +
  • Wikipedia: Unreachable code.
  • diff --git a/go/ql/src/Security/CWE-079/ReflectedXss.qhelp b/go/ql/src/Security/CWE-079/ReflectedXss.qhelp index 038c7646d0fa..6dded43ac116 100644 --- a/go/ql/src/Security/CWE-079/ReflectedXss.qhelp +++ b/go/ql/src/Security/CWE-079/ReflectedXss.qhelp @@ -46,7 +46,7 @@ OWASP Scripting.
  • -Wikipedia: Cross-site scripting. +Wikipedia: Cross-site scripting.
  • diff --git a/go/ql/src/Security/CWE-079/StoredXss.qhelp b/go/ql/src/Security/CWE-079/StoredXss.qhelp index 3cb059cc6f02..a5aab38c92f5 100644 --- a/go/ql/src/Security/CWE-079/StoredXss.qhelp +++ b/go/ql/src/Security/CWE-079/StoredXss.qhelp @@ -57,7 +57,7 @@ Scripting.
  • - Wikipedia: Cross-site scripting. + Wikipedia: Cross-site scripting.
  • diff --git a/go/ql/src/Security/CWE-338/InsecureRandomness.qhelp b/go/ql/src/Security/CWE-338/InsecureRandomness.qhelp index fb61773a6dfc..0b9899657c36 100644 --- a/go/ql/src/Security/CWE-338/InsecureRandomness.qhelp +++ b/go/ql/src/Security/CWE-338/InsecureRandomness.qhelp @@ -42,7 +42,7 @@ Instead, use crypto/rand: -
  • Wikipedia. Pseudo-random number generator.
  • +
  • Wikipedia. Pseudo-random number generator.
  • OWASP: Insecure Randomness.
  • OWASP: Secure Random Number Generation.
  • diff --git a/java/ql/src/Likely Bugs/Concurrency/LazyInitStaticField.qhelp b/java/ql/src/Likely Bugs/Concurrency/LazyInitStaticField.qhelp index 8ea8b951924e..14d0c749fb2f 100644 --- a/java/ql/src/Likely Bugs/Concurrency/LazyInitStaticField.qhelp +++ b/java/ql/src/Likely Bugs/Concurrency/LazyInitStaticField.qhelp @@ -43,7 +43,7 @@ approach of using a static initializer to initialize resource.

    diff --git a/java/ql/src/Metrics/Callables/CCyclomaticComplexity.qhelp b/java/ql/src/Metrics/Callables/CCyclomaticComplexity.qhelp index ea496155fbbf..80909522e4ba 100644 --- a/java/ql/src/Metrics/Callables/CCyclomaticComplexity.qhelp +++ b/java/ql/src/Metrics/Callables/CCyclomaticComplexity.qhelp @@ -51,7 +51,7 @@ M. Fowler, Refactoring. Addison-Wesley, 1999. T. J. McCabe, A Complexity Measure. IEEE Transactions on Software Engineering, SE-2(4), December 1976.
  • -Wikipedia: Cyclomatic complexity. +Wikipedia: Cyclomatic complexity.
  • diff --git a/java/ql/src/Metrics/Files/FCyclomaticComplexity.qhelp b/java/ql/src/Metrics/Files/FCyclomaticComplexity.qhelp index 2009e77d66fb..e9469d2df7ca 100644 --- a/java/ql/src/Metrics/Files/FCyclomaticComplexity.qhelp +++ b/java/ql/src/Metrics/Files/FCyclomaticComplexity.qhelp @@ -67,10 +67,10 @@ T. J. McCabe, A Complexity Measure. IEEE Transactions on Software Engin Dave Thomas, Refactoring as Meta Programming?, in Journal of Object Technology, vol. 4, no. 1, January-February 2005, pp. 7-11.
  • -Wikipedia: Cyclomatic complexity +Wikipedia: Cyclomatic complexity
  • -Wikipedia: Code refactoring +Wikipedia: Code refactoring
  • diff --git a/java/ql/src/Metrics/Files/FLinesOfDuplicatedCodeCommon.inc.qhelp b/java/ql/src/Metrics/Files/FLinesOfDuplicatedCodeCommon.inc.qhelp index 6fc36156c110..47e4c871dbe0 100644 --- a/java/ql/src/Metrics/Files/FLinesOfDuplicatedCodeCommon.inc.qhelp +++ b/java/ql/src/Metrics/Files/FLinesOfDuplicatedCodeCommon.inc.qhelp @@ -27,7 +27,7 @@ a shared library or module. -
  • Wikipedia: Duplicate code.
  • +
  • Wikipedia: Duplicate code.
  • M. Fowler, Refactoring. Addison-Wesley, 1999.
  • diff --git a/java/ql/src/Metrics/Files/FLinesOfSimilarCode.qhelp b/java/ql/src/Metrics/Files/FLinesOfSimilarCode.qhelp index bddda6b1b37d..319f801e3634 100644 --- a/java/ql/src/Metrics/Files/FLinesOfSimilarCode.qhelp +++ b/java/ql/src/Metrics/Files/FLinesOfSimilarCode.qhelp @@ -23,7 +23,7 @@ that can be reused across classes. -
  • Wikipedia: Duplicate code.
  • +
  • Wikipedia: Duplicate code.
  • M. Fowler, Refactoring. Addison-Wesley, 1999.
  • diff --git a/java/ql/src/Metrics/Files/FSelfContainedness.qhelp b/java/ql/src/Metrics/Files/FSelfContainedness.qhelp index 3a254ca64132..3da981e106f1 100644 --- a/java/ql/src/Metrics/Files/FSelfContainedness.qhelp +++ b/java/ql/src/Metrics/Files/FSelfContainedness.qhelp @@ -55,7 +55,7 @@ external libraries.
  • -Wikipedia: Software portability +Wikipedia: Software portability
  • Oracle Technology Network: Java SE 6 Compatibility diff --git a/java/ql/src/Metrics/RefTypes/TSelfContainedness.qhelp b/java/ql/src/Metrics/RefTypes/TSelfContainedness.qhelp index cafeb813b27c..d0c6e41c05ec 100644 --- a/java/ql/src/Metrics/RefTypes/TSelfContainedness.qhelp +++ b/java/ql/src/Metrics/RefTypes/TSelfContainedness.qhelp @@ -55,7 +55,7 @@ external libraries.
  • -Wikipedia. Software portability. Published online. +Wikipedia. Software portability. Published online.
  • Oracle Technology Network: Java SE 6 Compatibility diff --git a/java/ql/src/Security/CWE/CWE-079/XSS.qhelp b/java/ql/src/Security/CWE/CWE-079/XSS.qhelp index 05b0f2680022..8434212390be 100644 --- a/java/ql/src/Security/CWE/CWE-079/XSS.qhelp +++ b/java/ql/src/Security/CWE/CWE-079/XSS.qhelp @@ -33,7 +33,7 @@ OWASP: (Cross Site Scripting) Prevention Cheat Sheet.
  • -Wikipedia: Cross-site scripting. +Wikipedia: Cross-site scripting.
  • diff --git a/java/ql/src/Security/CWE/CWE-113/ResponseSplitting.qhelp b/java/ql/src/Security/CWE/CWE-113/ResponseSplitting.qhelp index c4c2032af7dc..d0b6faefdb86 100644 --- a/java/ql/src/Security/CWE/CWE-113/ResponseSplitting.qhelp +++ b/java/ql/src/Security/CWE/CWE-113/ResponseSplitting.qhelp @@ -57,7 +57,7 @@ OWASP: HTTP Response Splitting.
  • -Wikipedia: HTTP response splitting. +Wikipedia: HTTP response splitting.
  • CAPEC: CAPEC-105: HTTP Request Splitting diff --git a/java/ql/src/Security/CWE/CWE-326/InsufficientKeySize.qhelp b/java/ql/src/Security/CWE/CWE-326/InsufficientKeySize.qhelp index 3a0b74bebd49..f786c865b8a2 100644 --- a/java/ql/src/Security/CWE/CWE-326/InsufficientKeySize.qhelp +++ b/java/ql/src/Security/CWE/CWE-326/InsufficientKeySize.qhelp @@ -33,7 +33,7 @@
  • Wikipedia: - Key size. + Key size.
  • Wikipedia: Strong cryptography. diff --git a/java/ql/src/Security/CWE/CWE-330/InsecureRandomness.qhelp b/java/ql/src/Security/CWE/CWE-330/InsecureRandomness.qhelp index 414e32520577..a0d056132b9e 100644 --- a/java/ql/src/Security/CWE/CWE-330/InsecureRandomness.qhelp +++ b/java/ql/src/Security/CWE/CWE-330/InsecureRandomness.qhelp @@ -53,7 +53,7 @@ -
  • Wikipedia: Pseudo-random number generator.
  • +
  • Wikipedia: Pseudo-random number generator.
  • Java Docs: Random.
  • diff --git a/java/ql/src/Security/CWE/CWE-501/TrustBoundaryViolation.qhelp b/java/ql/src/Security/CWE/CWE-501/TrustBoundaryViolation.qhelp index f0eb5de2f7fd..cd069a4c4f38 100644 --- a/java/ql/src/Security/CWE/CWE-501/TrustBoundaryViolation.qhelp +++ b/java/ql/src/Security/CWE/CWE-501/TrustBoundaryViolation.qhelp @@ -41,7 +41,7 @@
  • - Wikipedia: Trust boundary. + Wikipedia: Trust boundary.
  • diff --git a/java/ql/src/Violations of Best Practice/Comments/TodoComments.qhelp b/java/ql/src/Violations of Best Practice/Comments/TodoComments.qhelp index b1a01ba71631..c915fa833f93 100644 --- a/java/ql/src/Violations of Best Practice/Comments/TodoComments.qhelp +++ b/java/ql/src/Violations of Best Practice/Comments/TodoComments.qhelp @@ -44,8 +44,8 @@ Approxion:
  • Wikipedia: -Comment tags, -Issue tracking system. +Comment tags, +Issue tracking system.
  • diff --git a/java/ql/src/Violations of Best Practice/Dead Code/DeadRefTypes.qhelp b/java/ql/src/Violations of Best Practice/Dead Code/DeadRefTypes.qhelp index c367fcaead78..cf6b21896deb 100644 --- a/java/ql/src/Violations of Best Practice/Dead Code/DeadRefTypes.qhelp +++ b/java/ql/src/Violations of Best Practice/Dead Code/DeadRefTypes.qhelp @@ -19,7 +19,7 @@ in the program may cause a programmer to waste time and effort maintaining and d
  • Wikipedia: - Unreachable code. + Unreachable code.
  • diff --git a/javascript/ql/src/Comments/TodoComments.qhelp b/javascript/ql/src/Comments/TodoComments.qhelp index 1b6650493108..eb7db3b7bbb4 100644 --- a/javascript/ql/src/Comments/TodoComments.qhelp +++ b/javascript/ql/src/Comments/TodoComments.qhelp @@ -44,7 +44,7 @@ Approxion:
  • Wikipedia: -Comment tags. +Comment tags.
  • diff --git a/javascript/ql/src/Declarations/DeadStore.inc.qhelp b/javascript/ql/src/Declarations/DeadStore.inc.qhelp index 4f6591a657f8..6d35e1833c60 100644 --- a/javascript/ql/src/Declarations/DeadStore.inc.qhelp +++ b/javascript/ql/src/Declarations/DeadStore.inc.qhelp @@ -41,7 +41,7 @@ succeeded or not, the value of result should be checked, perhaps li -
  • Wikipedia: Dead store.
  • +
  • Wikipedia: Dead store.
  • diff --git a/javascript/ql/src/LanguageFeatures/Eval.qhelp b/javascript/ql/src/LanguageFeatures/Eval.qhelp index 16fdcbee6301..c49594445d7d 100644 --- a/javascript/ql/src/LanguageFeatures/Eval.qhelp +++ b/javascript/ql/src/LanguageFeatures/Eval.qhelp @@ -18,7 +18,7 @@ In many cases, better alternatives are available and should be used instead. There are few genuine uses of eval and Function. If you are trying to assign to a property whose name is not known until runtime, use a computed property access. If you are trying to evaluate a string to a JSON object, use JSON.parse. In other cases, -you may be able to use the Interpreter +you may be able to use the Interpreter pattern.

    diff --git a/javascript/ql/src/Metrics/FCyclomaticComplexity.qhelp b/javascript/ql/src/Metrics/FCyclomaticComplexity.qhelp index 329557ec67e7..6f94b7f9de30 100644 --- a/javascript/ql/src/Metrics/FCyclomaticComplexity.qhelp +++ b/javascript/ql/src/Metrics/FCyclomaticComplexity.qhelp @@ -67,10 +67,10 @@ T. J. McCabe, A Complexity Measure. IEEE Transactions on Software Engin Dave Thomas, Refactoring as Meta Programming?, in Journal of Object Technology, vol. 4, no. 1, January-February 2005, pp. 7-11.
  • -Wikipedia: Cyclomatic complexity +Wikipedia: Cyclomatic complexity
  • -Wikipedia: Code refactoring +Wikipedia: Code refactoring
  • diff --git a/javascript/ql/src/Metrics/FLinesOfDuplicatedCodeCommon.inc.qhelp b/javascript/ql/src/Metrics/FLinesOfDuplicatedCodeCommon.inc.qhelp index 6fc36156c110..47e4c871dbe0 100644 --- a/javascript/ql/src/Metrics/FLinesOfDuplicatedCodeCommon.inc.qhelp +++ b/javascript/ql/src/Metrics/FLinesOfDuplicatedCodeCommon.inc.qhelp @@ -27,7 +27,7 @@ a shared library or module. -
  • Wikipedia: Duplicate code.
  • +
  • Wikipedia: Duplicate code.
  • M. Fowler, Refactoring. Addison-Wesley, 1999.
  • diff --git a/javascript/ql/src/Metrics/FLinesOfSimilarCodeCommon.inc.qhelp b/javascript/ql/src/Metrics/FLinesOfSimilarCodeCommon.inc.qhelp index 07cae328b237..80cb9ace858b 100644 --- a/javascript/ql/src/Metrics/FLinesOfSimilarCodeCommon.inc.qhelp +++ b/javascript/ql/src/Metrics/FLinesOfSimilarCodeCommon.inc.qhelp @@ -28,7 +28,7 @@ that can be reused across modules. -
  • Wikipedia: Duplicate code.
  • +
  • Wikipedia: Duplicate code.
  • M. Fowler, Refactoring. Addison-Wesley, 1999.
  • diff --git a/javascript/ql/src/Metrics/FunCyclomaticComplexity.qhelp b/javascript/ql/src/Metrics/FunCyclomaticComplexity.qhelp index ab4594d76905..ac18aa8cf5a6 100644 --- a/javascript/ql/src/Metrics/FunCyclomaticComplexity.qhelp +++ b/javascript/ql/src/Metrics/FunCyclomaticComplexity.qhelp @@ -34,7 +34,7 @@ M. Fowler. Refactoring. Addison-Wesley, 1999. T. J. McCabe. A Complexity Measure. IEEE Transactions on Software Engineering, SE-2(4), December 1976.
  • -Wikipedia: Cyclomatic complexity. +Wikipedia: Cyclomatic complexity.
  • diff --git a/javascript/ql/src/Security/CWE-079/ExceptionXss.qhelp b/javascript/ql/src/Security/CWE-079/ExceptionXss.qhelp index 7ab1038b067e..6b0c8d98fe1f 100644 --- a/javascript/ql/src/Security/CWE-079/ExceptionXss.qhelp +++ b/javascript/ql/src/Security/CWE-079/ExceptionXss.qhelp @@ -61,7 +61,7 @@ OWASP Scripting.
  • -Wikipedia: Cross-site scripting. +Wikipedia: Cross-site scripting.
  • diff --git a/javascript/ql/src/Security/CWE-079/ReflectedXss.qhelp b/javascript/ql/src/Security/CWE-079/ReflectedXss.qhelp index dcbf0ba6f071..f7925eb0bbef 100644 --- a/javascript/ql/src/Security/CWE-079/ReflectedXss.qhelp +++ b/javascript/ql/src/Security/CWE-079/ReflectedXss.qhelp @@ -46,7 +46,7 @@ OWASP Scripting.
  • -Wikipedia: Cross-site scripting. +Wikipedia: Cross-site scripting.
  • diff --git a/javascript/ql/src/Security/CWE-079/StoredXss.qhelp b/javascript/ql/src/Security/CWE-079/StoredXss.qhelp index 0e6ed6456c97..2cefb7eefe62 100644 --- a/javascript/ql/src/Security/CWE-079/StoredXss.qhelp +++ b/javascript/ql/src/Security/CWE-079/StoredXss.qhelp @@ -57,7 +57,7 @@ Scripting.
  • - Wikipedia: Cross-site scripting. + Wikipedia: Cross-site scripting.
  • diff --git a/javascript/ql/src/Security/CWE-079/UnsafeHtmlConstruction.qhelp b/javascript/ql/src/Security/CWE-079/UnsafeHtmlConstruction.qhelp index 4ab53d1964fd..715a0a0776a3 100644 --- a/javascript/ql/src/Security/CWE-079/UnsafeHtmlConstruction.qhelp +++ b/javascript/ql/src/Security/CWE-079/UnsafeHtmlConstruction.qhelp @@ -71,7 +71,7 @@ Scripting.
  • - Wikipedia: Cross-site scripting. + Wikipedia: Cross-site scripting.
  • diff --git a/javascript/ql/src/Security/CWE-079/UnsafeJQueryPlugin.qhelp b/javascript/ql/src/Security/CWE-079/UnsafeJQueryPlugin.qhelp index ea3fa3be486f..835a8ddc420e 100644 --- a/javascript/ql/src/Security/CWE-079/UnsafeJQueryPlugin.qhelp +++ b/javascript/ql/src/Security/CWE-079/UnsafeJQueryPlugin.qhelp @@ -89,7 +89,7 @@ Scripting.
  • - Wikipedia: Cross-site scripting. + Wikipedia: Cross-site scripting.
  • jQuery: Plugin creation. diff --git a/javascript/ql/src/Security/CWE-079/Xss.inc.qhelp b/javascript/ql/src/Security/CWE-079/Xss.inc.qhelp index c974c87b1882..448b21b4dc41 100644 --- a/javascript/ql/src/Security/CWE-079/Xss.inc.qhelp +++ b/javascript/ql/src/Security/CWE-079/Xss.inc.qhelp @@ -51,7 +51,7 @@ OWASP Scripting.
  • -Wikipedia: Cross-site scripting. +Wikipedia: Cross-site scripting.
  • diff --git a/javascript/ql/src/Security/CWE-079/XssThroughDom.qhelp b/javascript/ql/src/Security/CWE-079/XssThroughDom.qhelp index f3c6d27c5de6..eab572a60983 100644 --- a/javascript/ql/src/Security/CWE-079/XssThroughDom.qhelp +++ b/javascript/ql/src/Security/CWE-079/XssThroughDom.qhelp @@ -64,7 +64,7 @@ OWASP Scripting.
  • -Wikipedia: Cross-site scripting. +Wikipedia: Cross-site scripting.
  • diff --git a/javascript/ql/src/Security/CWE-116/IncompleteHtmlAttributeSanitization.qhelp b/javascript/ql/src/Security/CWE-116/IncompleteHtmlAttributeSanitization.qhelp index 7abe4844dfd1..666f982c9092 100644 --- a/javascript/ql/src/Security/CWE-116/IncompleteHtmlAttributeSanitization.qhelp +++ b/javascript/ql/src/Security/CWE-116/IncompleteHtmlAttributeSanitization.qhelp @@ -91,7 +91,7 @@ Types of Cross-Site.
  • - Wikipedia: Cross-site scripting. + Wikipedia: Cross-site scripting.
  • diff --git a/javascript/ql/src/Security/CWE-116/UnsafeHtmlExpansion.qhelp b/javascript/ql/src/Security/CWE-116/UnsafeHtmlExpansion.qhelp index 3a70e87933cb..284377b9f3db 100644 --- a/javascript/ql/src/Security/CWE-116/UnsafeHtmlExpansion.qhelp +++ b/javascript/ql/src/Security/CWE-116/UnsafeHtmlExpansion.qhelp @@ -101,7 +101,7 @@ Types of Cross-Site.
  • - Wikipedia: Cross-site scripting. + Wikipedia: Cross-site scripting.
  • diff --git a/javascript/ql/src/Security/CWE-338/InsecureRandomness.qhelp b/javascript/ql/src/Security/CWE-338/InsecureRandomness.qhelp index 83786a014a0b..2005452f4fbb 100644 --- a/javascript/ql/src/Security/CWE-338/InsecureRandomness.qhelp +++ b/javascript/ql/src/Security/CWE-338/InsecureRandomness.qhelp @@ -68,7 +68,7 @@ -
  • Wikipedia: Pseudo-random number generator.
  • +
  • Wikipedia: Pseudo-random number generator.
  • Mozilla Developer Network: Crypto: getRandomValues().
  • NodeJS: crypto.randomBytes
  • diff --git a/javascript/ql/src/Statements/DanglingElse.qhelp b/javascript/ql/src/Statements/DanglingElse.qhelp index 23ca8fd03f38..8c6004a7f122 100644 --- a/javascript/ql/src/Statements/DanglingElse.qhelp +++ b/javascript/ql/src/Statements/DanglingElse.qhelp @@ -52,7 +52,7 @@ curly braces: -
  • Wikipedia: Dangling else.
  • +
  • Wikipedia: Dangling else.
  • diff --git a/javascript/ql/src/Statements/UnreachableStatement.qhelp b/javascript/ql/src/Statements/UnreachableStatement.qhelp index 71997740b0bb..122a9ebd3baa 100644 --- a/javascript/ql/src/Statements/UnreachableStatement.qhelp +++ b/javascript/ql/src/Statements/UnreachableStatement.qhelp @@ -37,7 +37,7 @@ To correct this issue, remove the spurious semicolon: -
  • Wikipedia: Unreachable code.
  • +
  • Wikipedia: Unreachable code.
  • diff --git a/ruby/ql/src/experimental/insecure-randomness/InsecureRandomness.qhelp b/ruby/ql/src/experimental/insecure-randomness/InsecureRandomness.qhelp index 6c99c189a5d7..188ddccdab9c 100644 --- a/ruby/ql/src/experimental/insecure-randomness/InsecureRandomness.qhelp +++ b/ruby/ql/src/experimental/insecure-randomness/InsecureRandomness.qhelp @@ -48,7 +48,7 @@ cryptographically secure method.

    -
  • Wikipedia: Pseudo-random number generator.
  • +
  • Wikipedia: Pseudo-random number generator.
  • Common Weakness Enumeration: CWE-338.
  • Ruby-doc: Random.
  • diff --git a/ruby/ql/src/queries/security/cwe-079/ReflectedXSS.qhelp b/ruby/ql/src/queries/security/cwe-079/ReflectedXSS.qhelp index 85bd15cabcd5..25a3ef52613d 100644 --- a/ruby/ql/src/queries/security/cwe-079/ReflectedXSS.qhelp +++ b/ruby/ql/src/queries/security/cwe-079/ReflectedXSS.qhelp @@ -49,7 +49,7 @@ Ruby on Rails Cheatsheet.
  • - Wikipedia: Cross-site scripting. + Wikipedia: Cross-site scripting.
  • diff --git a/ruby/ql/src/queries/security/cwe-079/StoredXSS.qhelp b/ruby/ql/src/queries/security/cwe-079/StoredXSS.qhelp index 71b9f2aa3ef2..61777e3eaec2 100644 --- a/ruby/ql/src/queries/security/cwe-079/StoredXSS.qhelp +++ b/ruby/ql/src/queries/security/cwe-079/StoredXSS.qhelp @@ -65,7 +65,7 @@ Ruby on Rails Cheatsheet.
  • - Wikipedia: Cross-site scripting. + Wikipedia: Cross-site scripting.
  • diff --git a/ruby/ql/src/queries/security/cwe-079/UnsafeHtmlConstruction.qhelp b/ruby/ql/src/queries/security/cwe-079/UnsafeHtmlConstruction.qhelp index 7a513a3ece02..dfee208f29af 100644 --- a/ruby/ql/src/queries/security/cwe-079/UnsafeHtmlConstruction.qhelp +++ b/ruby/ql/src/queries/security/cwe-079/UnsafeHtmlConstruction.qhelp @@ -67,7 +67,7 @@ Scripting.
  • - Wikipedia: Cross-site scripting. + Wikipedia: Cross-site scripting.
  • diff --git a/ruby/ql/src/queries/variables/DeadStoreOfLocal.qhelp b/ruby/ql/src/queries/variables/DeadStoreOfLocal.qhelp index b4e32eb1708f..08bc96ae1f83 100644 --- a/ruby/ql/src/queries/variables/DeadStoreOfLocal.qhelp +++ b/ruby/ql/src/queries/variables/DeadStoreOfLocal.qhelp @@ -41,7 +41,7 @@ succeeded or not, the value of result should be checked, perhaps li -
  • Wikipedia: Dead store.
  • +
  • Wikipedia: Dead store.
  • From 06d874f10f630eb8f41c7f9ca3e0e611471ba5af Mon Sep 17 00:00:00 2001 From: JarLob Date: Sat, 22 Aug 2026 12:17:25 +0300 Subject: [PATCH 0469/2098] Improve performance --- .../frameworks/microsoft/AspNetCore.qll | 19 +++++++++++++++++-- .../frameworks/microsoft/AspNetCore.cs | 5 +++++ .../frameworks/microsoft/AspNetCore.expected | 1 + .../microsoft/AspNetCoreActions.expected | 1 + 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll index d3c4c0bf6aba..50af007a971e 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll @@ -388,6 +388,21 @@ private predicate isDefaultMicrosoftAspNetCoreMvcController(Class controller) { MicrosoftAspNetCoreMvcNonControllerAttribute } +private predicate isMicrosoftAspNetCoreMvcIDisposableMethod(Method method) { + exists(Method baseMethod | + baseMethod = method.getOverridee*() and + not exists(baseMethod.getOverridee()) and + ( + baseMethod.getExplicitlyImplementedInterface() instanceof SystemIDisposableInterface + or + baseMethod.getUndecoratedName() = "Dispose" and + baseMethod.getNumberOfParameters() = 0 and + baseMethod.getReturnType() instanceof VoidType and + baseMethod.getDeclaringType().getABaseInterface*() instanceof SystemIDisposableInterface + ) + ) +} + /** A class treated as an owner of ASP.NET Core MVC controller helper methods. */ class MicrosoftAspNetCoreMvcControllerHelperClass extends Class { MicrosoftAspNetCoreMvcControllerHelperClass() { @@ -424,10 +439,10 @@ class MicrosoftAspNetCoreMvcController extends Class { result.isPublic() and not result.isStatic() and not result.isAbstract() and - not result.getUnboundDeclaration() instanceof UnboundGenericMethod and + not result instanceof Generic and not result.getOverridee*().getAnAttribute() instanceof MicrosoftAspNetCoreMvcNonActionAttribute and not result.getOverridee*().getDeclaringType() instanceof ObjectType and - not result instanceof DisposeMethod + not isMicrosoftAspNetCoreMvcIDisposableMethod(result) } /** Gets a `Redirect*`, `Accepted*`, or `Created*` method. */ diff --git a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs index 7e0c880a766e..7808bd841f27 100644 --- a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs +++ b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs @@ -196,3 +196,8 @@ internal void InternalAction(string input) { } private void PrivateAction(string input) { } } + +public class NewDisposeController : Controller +{ + public new void Dispose() { } +} diff --git a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected index 444058a4add4..428c772add9a 100644 --- a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected +++ b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected @@ -10,3 +10,4 @@ | AspNetCore.cs:155:14:155:36 | ClosedGenericController | | AspNetCore.cs:171:14:171:35 | ConcreteActionEndpoint | | AspNetCore.cs:178:14:178:34 | ActionCasesController | +| AspNetCore.cs:200:14:200:33 | NewDisposeController | diff --git a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected index c3222a0cbf4d..3ee137abc849 100644 --- a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected +++ b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected @@ -13,3 +13,4 @@ | AspNetCore.cs:171:14:171:35 | ConcreteActionEndpoint | AspNetCore.cs:165:17:165:31 | InheritedAction | | AspNetCore.cs:171:14:171:35 | ConcreteActionEndpoint | AspNetCore.cs:173:26:173:39 | AbstractAction | | AspNetCore.cs:178:14:178:34 | ActionCasesController | AspNetCore.cs:180:17:180:28 | PublicAction | +| AspNetCore.cs:200:14:200:33 | NewDisposeController | AspNetCore.cs:202:21:202:27 | Dispose | From c52545f3db044d6f42d329734c0579a5b1701839 Mon Sep 17 00:00:00 2001 From: JarLob Date: Sat, 22 Aug 2026 13:11:20 +0300 Subject: [PATCH 0470/2098] Extracted isMicrosoftAspNetCoreMvcApplication to predicate --- .../frameworks/microsoft/AspNetCore.qll | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll index 50af007a971e..ee1af08d420d 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll @@ -249,30 +249,32 @@ private predicate isMicrosoftAspNetCoreMvcAddApplicationPart(MethodCall call) { } private predicate isMicrosoftAspNetCoreMvcApplicationPart(Compilation application, Assembly part) { - part = application.getOutputAssembly() - or - exists(AssemblyAttribute attr, StringLiteral assemblyName | - application.getAFileCompiled() = attr.getFile() and - attr.getType() - .hasFullyQualifiedName("Microsoft.AspNetCore.Mvc.ApplicationParts", - "ApplicationPartAttribute") and - assemblyName = attr.getArgument(0) and - assemblyName.getValue() = part.getName() - ) - or - exists(MethodCall addPart, PropertyAccess assemblyAccess, TypeofExpr typeOf, Type partType | - application.getAFileCompiled() = addPart.getFile() and - isMicrosoftAspNetCoreMvcAddApplicationPart(addPart) and - assemblyAccess = addPart.getArgumentForName("assembly") and - assemblyAccess.getTarget().hasName("Assembly") and - assemblyAccess.getQualifier() = typeOf and - partType = typeOf.getTypeAccess().getTarget() and - part = getAnAssemblyFor(partType) + isMicrosoftAspNetCoreMvcApplication(application) and + ( + part = application.getOutputAssembly() + or + exists(AssemblyAttribute attr, StringLiteral assemblyName | + application.getAFileCompiled() = attr.getFile() and + attr.getType() + .hasFullyQualifiedName("Microsoft.AspNetCore.Mvc.ApplicationParts", + "ApplicationPartAttribute") and + assemblyName = attr.getArgument(0) and + assemblyName.getValue() = part.getName() + ) + or + exists(MethodCall addPart, PropertyAccess assemblyAccess, TypeofExpr typeOf, Type partType | + application.getAFileCompiled() = addPart.getFile() and + isMicrosoftAspNetCoreMvcAddApplicationPart(addPart) and + assemblyAccess = addPart.getArgumentForName("assembly") and + assemblyAccess.getTarget().hasName("Assembly") and + assemblyAccess.getQualifier() = typeOf and + partType = typeOf.getTypeAccess().getTarget() and + part = getAnAssemblyFor(partType) + ) ) } private predicate isInMicrosoftAspNetCoreMvcApplication(Class controller, Compilation application) { - isMicrosoftAspNetCoreMvcApplication(application) and isMicrosoftAspNetCoreMvcApplicationPart(application, getAnAssemblyFor(controller)) } From d0c3738603d59b3f3ea8845d4bb3dcbf68acd062 Mon Sep 17 00:00:00 2001 From: JarLob Date: Sat, 22 Aug 2026 13:22:43 +0300 Subject: [PATCH 0471/2098] Implement code review suggestion --- .../semmle/code/csharp/frameworks/microsoft/AspNetCore.qll | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll index ee1af08d420d..a7f7c4f3e1d0 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll @@ -262,13 +262,12 @@ private predicate isMicrosoftAspNetCoreMvcApplicationPart(Compilation applicatio assemblyName.getValue() = part.getName() ) or - exists(MethodCall addPart, PropertyAccess assemblyAccess, TypeofExpr typeOf, Type partType | + exists(MethodCall addPart, PropertyAccess assemblyAccess, Type partType | application.getAFileCompiled() = addPart.getFile() and isMicrosoftAspNetCoreMvcAddApplicationPart(addPart) and assemblyAccess = addPart.getArgumentForName("assembly") and assemblyAccess.getTarget().hasName("Assembly") and - assemblyAccess.getQualifier() = typeOf and - partType = typeOf.getTypeAccess().getTarget() and + assemblyAccess.getQualifier().(TypeofExpr).getTypeAccess().getTarget() = partType and part = getAnAssemblyFor(partType) ) ) From 35ccfb1e373b106db28c99029cd3c21d50abe450 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 18 Aug 2026 16:54:36 +0100 Subject: [PATCH 0472/2098] Rust: Accept changes to test .expected file, result of upgrades on main. --- .../CWE-078/CommandInjection.expected | 76 +++++++++---------- 1 file changed, 36 insertions(+), 40 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected index 71be73855bbd..396f31314dac 100644 --- a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected @@ -1,36 +1,36 @@ #select -| main.rs:27:5:27:16 | ...::new | main.rs:4:22:4:35 | ...::args | main.rs:27:5:27:16 | ...::new | This command line depends on a $@. | main.rs:4:22:4:35 | ...::args | user-provided value | -| main.rs:34:10:34:12 | arg | main.rs:5:25:5:46 | ...::get | main.rs:34:10:34:12 | arg | This command line depends on a $@. | main.rs:5:25:5:46 | ...::get | user-provided value | -| main.rs:40:10:40:12 | arg | main.rs:4:22:4:35 | ...::args | main.rs:40:10:40:12 | arg | This command line depends on a $@. | main.rs:4:22:4:35 | ...::args | user-provided value | -| main.rs:47:10:47:13 | args | main.rs:5:25:5:46 | ...::get | main.rs:47:10:47:13 | args | This command line depends on a $@. | main.rs:5:25:5:46 | ...::get | user-provided value | -| main.rs:53:5:53:16 | ...::new | main.rs:5:25:5:46 | ...::get | main.rs:53:5:53:16 | ...::new | This command line depends on a $@. | main.rs:5:25:5:46 | ...::get | user-provided value | -| main.rs:65:19:65:46 | ...::new | main.rs:59:25:59:46 | ...::get | main.rs:65:19:65:46 | ...::new | This command line depends on a $@. | main.rs:59:25:59:46 | ...::get | user-provided value | -| main.rs:73:10:73:12 | arg | main.rs:59:25:59:46 | ...::get | main.rs:73:10:73:12 | arg | This command line depends on a $@. | main.rs:59:25:59:46 | ...::get | user-provided value | -| main.rs:86:14:86:16 | arg | main.rs:108:22:108:35 | ...::args | main.rs:86:14:86:16 | arg | This command line depends on a $@. | main.rs:108:22:108:35 | ...::args | user-provided value | -| main.rs:100:18:100:20 | arg | main.rs:108:22:108:35 | ...::args | main.rs:100:18:100:20 | arg | This command line depends on a $@. | main.rs:108:22:108:35 | ...::args | user-provided value | +| main.rs:27:18:27:36 | arg_string.as_str() | main.rs:4:22:4:37 | ...::args(...) | main.rs:27:18:27:36 | arg_string.as_str() | This command line depends on a $@. | main.rs:4:22:4:37 | ...::args(...) | user-provided value | +| main.rs:34:14:34:35 | remote_string.as_str() | main.rs:5:25:5:69 | ...::get(...) | main.rs:34:14:34:35 | remote_string.as_str() | This command line depends on a $@. | main.rs:5:25:5:69 | ...::get(...) | user-provided value | +| main.rs:40:14:40:32 | arg_string.as_str() | main.rs:4:22:4:37 | ...::args(...) | main.rs:40:14:40:32 | arg_string.as_str() | This command line depends on a $@. | main.rs:4:22:4:37 | ...::args(...) | user-provided value | +| main.rs:47:15:47:45 | &... | main.rs:5:25:5:69 | ...::get(...) | main.rs:47:15:47:45 | &... | This command line depends on a $@. | main.rs:5:25:5:69 | ...::get(...) | user-provided value | +| main.rs:53:18:53:46 | concatenated_command.as_str() | main.rs:5:25:5:69 | ...::get(...) | main.rs:53:18:53:46 | concatenated_command.as_str() | This command line depends on a $@. | main.rs:5:25:5:69 | ...::get(...) | user-provided value | +| main.rs:65:48:65:69 | remote_string.as_str() | main.rs:59:25:59:69 | ...::get(...) | main.rs:65:48:65:69 | remote_string.as_str() | This command line depends on a $@. | main.rs:59:25:59:69 | ...::get(...) | user-provided value | +| main.rs:73:14:73:35 | remote_string.as_str() | main.rs:59:25:59:69 | ...::get(...) | main.rs:73:14:73:35 | remote_string.as_str() | This command line depends on a $@. | main.rs:59:25:59:69 | ...::get(...) | user-provided value | +| main.rs:86:18:86:27 | user_input | main.rs:108:22:108:37 | ...::args(...) | main.rs:86:18:86:27 | user_input | This command line depends on a $@. | main.rs:108:22:108:37 | ...::args(...) | user-provided value | +| main.rs:100:22:100:29 | filename | main.rs:108:22:108:37 | ...::args(...) | main.rs:100:22:100:29 | filename | This command line depends on a $@. | main.rs:108:22:108:37 | ...::args(...) | user-provided value | edges | main.rs:4:9:4:18 | arg_string | main.rs:27:18:27:27 | arg_string | provenance | | | main.rs:4:9:4:18 | arg_string | main.rs:40:14:40:23 | arg_string | provenance | | -| main.rs:4:22:4:35 | ...::args | main.rs:4:22:4:37 | ...::args(...) [element] | provenance | Src:MaD:7 | +| main.rs:4:22:4:37 | ...::args(...) | main.rs:4:22:4:37 | ...::args(...) [element] | provenance | Src:MaD:7 | | main.rs:4:22:4:37 | ...::args(...) [element] | main.rs:4:22:4:44 | ... .nth(...) [Some] | provenance | MaD:8 | | main.rs:4:22:4:44 | ... .nth(...) [Some] | main.rs:4:22:4:74 | ... .unwrap_or(...) | provenance | MaD:10 | | main.rs:4:22:4:74 | ... .unwrap_or(...) | main.rs:4:9:4:18 | arg_string | provenance | | | main.rs:5:9:5:21 | remote_string | main.rs:34:14:34:26 | remote_string | provenance | | | main.rs:5:9:5:21 | remote_string | main.rs:47:23:47:35 | remote_string | provenance | | | main.rs:5:9:5:21 | remote_string | main.rs:52:40:52:69 | MacroExpr | provenance | | -| main.rs:5:25:5:46 | ...::get | main.rs:5:25:5:69 | ...::get(...) [Ok] | provenance | Src:MaD:6 | +| main.rs:5:25:5:69 | ...::get(...) | main.rs:5:25:5:69 | ...::get(...) [Ok] | provenance | Src:MaD:6 | | main.rs:5:25:5:69 | ...::get(...) [Ok] | main.rs:5:25:6:17 | ... .unwrap() | provenance | MaD:11 | | main.rs:5:25:6:17 | ... .unwrap() | main.rs:5:25:7:15 | ... .text() [Ok] | provenance | MaD:13 | | main.rs:5:25:7:15 | ... .text() [Ok] | main.rs:5:25:8:38 | ... .unwrap_or(...) | provenance | MaD:12 | | main.rs:5:25:8:38 | ... .unwrap_or(...) | main.rs:5:9:5:21 | remote_string | provenance | | | main.rs:27:18:27:27 | arg_string | main.rs:27:18:27:36 | arg_string.as_str() [&ref] | provenance | MaD:9 | -| main.rs:27:18:27:36 | arg_string.as_str() [&ref] | main.rs:27:5:27:16 | ...::new | provenance | MaD:3 Sink:MaD:3 | +| main.rs:27:18:27:36 | arg_string.as_str() [&ref] | main.rs:27:18:27:36 | arg_string.as_str() | provenance | Sink:MaD:3 | | main.rs:34:14:34:26 | remote_string | main.rs:34:14:34:35 | remote_string.as_str() [&ref] | provenance | MaD:9 | -| main.rs:34:14:34:35 | remote_string.as_str() [&ref] | main.rs:34:10:34:12 | arg | provenance | MaD:1 Sink:MaD:1 | +| main.rs:34:14:34:35 | remote_string.as_str() [&ref] | main.rs:34:14:34:35 | remote_string.as_str() | provenance | Sink:MaD:1 | | main.rs:40:14:40:23 | arg_string | main.rs:40:14:40:32 | arg_string.as_str() [&ref] | provenance | MaD:9 | -| main.rs:40:14:40:32 | arg_string.as_str() [&ref] | main.rs:40:10:40:12 | arg | provenance | MaD:1 Sink:MaD:1 | -| main.rs:47:15:47:45 | &... [&ref, element, &ref] | main.rs:47:10:47:13 | args | provenance | MaD:2 Sink:MaD:2 Sink:MaD:2 | -| main.rs:47:15:47:45 | &... [&ref, element, &ref] | main.rs:47:10:47:13 | args | provenance | MaD:2 Sink:MaD:2 Sink:MaD:2 Sink:MaD:2 | +| main.rs:40:14:40:32 | arg_string.as_str() [&ref] | main.rs:40:14:40:32 | arg_string.as_str() | provenance | Sink:MaD:1 | +| main.rs:47:15:47:45 | &... [&ref, element, &ref] | main.rs:47:15:47:45 | &... | provenance | Sink:MaD:2 Sink:MaD:2 | +| main.rs:47:15:47:45 | &... [&ref, element, &ref] | main.rs:47:15:47:45 | &... | provenance | Sink:MaD:2 Sink:MaD:2 Sink:MaD:2 | | main.rs:47:16:47:45 | [...] [element, &ref] | main.rs:47:15:47:45 | &... [&ref, element, &ref] | provenance | | | main.rs:47:23:47:35 | remote_string | main.rs:47:23:47:44 | remote_string.as_str() [&ref] | provenance | MaD:9 | | main.rs:47:23:47:44 | remote_string.as_str() [&ref] | main.rs:47:16:47:45 | [...] [element, &ref] | provenance | | @@ -40,25 +40,23 @@ edges | main.rs:52:40:52:69 | MacroExpr | main.rs:52:40:52:69 | ...::format(...) | provenance | MaD:14 | | main.rs:52:40:52:69 | { ... } | main.rs:52:40:52:69 | ...::must_use(...) | provenance | MaD:15 | | main.rs:53:18:53:37 | concatenated_command | main.rs:53:18:53:46 | concatenated_command.as_str() [&ref] | provenance | MaD:9 | -| main.rs:53:18:53:46 | concatenated_command.as_str() [&ref] | main.rs:53:5:53:16 | ...::new | provenance | MaD:3 Sink:MaD:3 | +| main.rs:53:18:53:46 | concatenated_command.as_str() [&ref] | main.rs:53:18:53:46 | concatenated_command.as_str() | provenance | Sink:MaD:3 | | main.rs:59:9:59:21 | remote_string | main.rs:65:48:65:60 | remote_string | provenance | | | main.rs:59:9:59:21 | remote_string | main.rs:73:14:73:26 | remote_string | provenance | | -| main.rs:59:25:59:46 | ...::get | main.rs:59:25:59:69 | ...::get(...) [Ok] | provenance | Src:MaD:6 | +| main.rs:59:25:59:69 | ...::get(...) | main.rs:59:25:59:69 | ...::get(...) [Ok] | provenance | Src:MaD:6 | | main.rs:59:25:59:69 | ...::get(...) [Ok] | main.rs:59:25:60:17 | ... .unwrap() | provenance | MaD:11 | | main.rs:59:25:60:17 | ... .unwrap() | main.rs:59:25:61:15 | ... .text() [Ok] | provenance | MaD:13 | | main.rs:59:25:61:15 | ... .text() [Ok] | main.rs:59:25:62:38 | ... .unwrap_or(...) | provenance | MaD:12 | | main.rs:59:25:62:38 | ... .unwrap_or(...) | main.rs:59:9:59:21 | remote_string | provenance | | | main.rs:65:48:65:60 | remote_string | main.rs:65:48:65:69 | remote_string.as_str() [&ref] | provenance | MaD:9 | -| main.rs:65:48:65:69 | remote_string.as_str() [&ref] | main.rs:65:19:65:46 | ...::new | provenance | MaD:5 Sink:MaD:5 | +| main.rs:65:48:65:69 | remote_string.as_str() [&ref] | main.rs:65:48:65:69 | remote_string.as_str() | provenance | Sink:MaD:5 | | main.rs:73:14:73:26 | remote_string | main.rs:73:14:73:35 | remote_string.as_str() [&ref] | provenance | MaD:9 | -| main.rs:73:14:73:35 | remote_string.as_str() [&ref] | main.rs:73:10:73:12 | arg | provenance | MaD:4 Sink:MaD:4 | -| main.rs:82:27:82:42 | ...: ... [&ref] | main.rs:86:18:86:27 | user_input [&ref] | provenance | | -| main.rs:86:18:86:27 | user_input [&ref] | main.rs:86:14:86:16 | arg | provenance | MaD:1 Sink:MaD:1 | -| main.rs:95:27:95:40 | ...: ... [&ref] | main.rs:100:22:100:29 | filename [&ref] | provenance | | -| main.rs:100:22:100:29 | filename [&ref] | main.rs:100:18:100:20 | arg | provenance | MaD:1 Sink:MaD:1 | +| main.rs:73:14:73:35 | remote_string.as_str() [&ref] | main.rs:73:14:73:35 | remote_string.as_str() | provenance | Sink:MaD:4 | +| main.rs:82:27:82:42 | ...: ... [&ref] | main.rs:86:18:86:27 | user_input | provenance | Sink:MaD:1 | +| main.rs:95:27:95:40 | ...: ... [&ref] | main.rs:100:22:100:29 | filename | provenance | Sink:MaD:1 | | main.rs:108:9:108:18 | arg_string | main.rs:112:39:112:48 | arg_string | provenance | | | main.rs:108:9:108:18 | arg_string | main.rs:113:40:113:49 | arg_string | provenance | | -| main.rs:108:22:108:35 | ...::args | main.rs:108:22:108:37 | ...::args(...) [element] | provenance | Src:MaD:7 | +| main.rs:108:22:108:37 | ...::args(...) | main.rs:108:22:108:37 | ...::args(...) [element] | provenance | Src:MaD:7 | | main.rs:108:22:108:37 | ...::args(...) [element] | main.rs:108:22:108:44 | ... .nth(...) [Some] | provenance | MaD:8 | | main.rs:108:22:108:44 | ... .nth(...) [Some] | main.rs:108:22:108:74 | ... .unwrap_or(...) | provenance | MaD:10 | | main.rs:108:22:108:74 | ... .unwrap_or(...) | main.rs:108:9:108:18 | arg_string | provenance | | @@ -84,26 +82,26 @@ models | 15 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes | main.rs:4:9:4:18 | arg_string | semmle.label | arg_string | -| main.rs:4:22:4:35 | ...::args | semmle.label | ...::args | +| main.rs:4:22:4:37 | ...::args(...) | semmle.label | ...::args(...) | | main.rs:4:22:4:37 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | | main.rs:4:22:4:44 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | | main.rs:4:22:4:74 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | | main.rs:5:9:5:21 | remote_string | semmle.label | remote_string | -| main.rs:5:25:5:46 | ...::get | semmle.label | ...::get | +| main.rs:5:25:5:69 | ...::get(...) | semmle.label | ...::get(...) | | main.rs:5:25:5:69 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | | main.rs:5:25:6:17 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:5:25:7:15 | ... .text() [Ok] | semmle.label | ... .text() [Ok] | | main.rs:5:25:8:38 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | -| main.rs:27:5:27:16 | ...::new | semmle.label | ...::new | | main.rs:27:18:27:27 | arg_string | semmle.label | arg_string | +| main.rs:27:18:27:36 | arg_string.as_str() | semmle.label | arg_string.as_str() | | main.rs:27:18:27:36 | arg_string.as_str() [&ref] | semmle.label | arg_string.as_str() [&ref] | -| main.rs:34:10:34:12 | arg | semmle.label | arg | | main.rs:34:14:34:26 | remote_string | semmle.label | remote_string | +| main.rs:34:14:34:35 | remote_string.as_str() | semmle.label | remote_string.as_str() | | main.rs:34:14:34:35 | remote_string.as_str() [&ref] | semmle.label | remote_string.as_str() [&ref] | -| main.rs:40:10:40:12 | arg | semmle.label | arg | | main.rs:40:14:40:23 | arg_string | semmle.label | arg_string | +| main.rs:40:14:40:32 | arg_string.as_str() | semmle.label | arg_string.as_str() | | main.rs:40:14:40:32 | arg_string.as_str() [&ref] | semmle.label | arg_string.as_str() [&ref] | -| main.rs:47:10:47:13 | args | semmle.label | args | +| main.rs:47:15:47:45 | &... | semmle.label | &... | | main.rs:47:15:47:45 | &... [&ref, element, &ref] | semmle.label | &... [&ref, element, &ref] | | main.rs:47:16:47:45 | [...] [element, &ref] | semmle.label | [...] [element, &ref] | | main.rs:47:23:47:35 | remote_string | semmle.label | remote_string | @@ -113,29 +111,27 @@ nodes | main.rs:52:40:52:69 | ...::must_use(...) | semmle.label | ...::must_use(...) | | main.rs:52:40:52:69 | MacroExpr | semmle.label | MacroExpr | | main.rs:52:40:52:69 | { ... } | semmle.label | { ... } | -| main.rs:53:5:53:16 | ...::new | semmle.label | ...::new | | main.rs:53:18:53:37 | concatenated_command | semmle.label | concatenated_command | +| main.rs:53:18:53:46 | concatenated_command.as_str() | semmle.label | concatenated_command.as_str() | | main.rs:53:18:53:46 | concatenated_command.as_str() [&ref] | semmle.label | concatenated_command.as_str() [&ref] | | main.rs:59:9:59:21 | remote_string | semmle.label | remote_string | -| main.rs:59:25:59:46 | ...::get | semmle.label | ...::get | +| main.rs:59:25:59:69 | ...::get(...) | semmle.label | ...::get(...) | | main.rs:59:25:59:69 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | | main.rs:59:25:60:17 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:59:25:61:15 | ... .text() [Ok] | semmle.label | ... .text() [Ok] | | main.rs:59:25:62:38 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | -| main.rs:65:19:65:46 | ...::new | semmle.label | ...::new | | main.rs:65:48:65:60 | remote_string | semmle.label | remote_string | +| main.rs:65:48:65:69 | remote_string.as_str() | semmle.label | remote_string.as_str() | | main.rs:65:48:65:69 | remote_string.as_str() [&ref] | semmle.label | remote_string.as_str() [&ref] | -| main.rs:73:10:73:12 | arg | semmle.label | arg | | main.rs:73:14:73:26 | remote_string | semmle.label | remote_string | +| main.rs:73:14:73:35 | remote_string.as_str() | semmle.label | remote_string.as_str() | | main.rs:73:14:73:35 | remote_string.as_str() [&ref] | semmle.label | remote_string.as_str() [&ref] | | main.rs:82:27:82:42 | ...: ... [&ref] | semmle.label | ...: ... [&ref] | -| main.rs:86:14:86:16 | arg | semmle.label | arg | -| main.rs:86:18:86:27 | user_input [&ref] | semmle.label | user_input [&ref] | +| main.rs:86:18:86:27 | user_input | semmle.label | user_input | | main.rs:95:27:95:40 | ...: ... [&ref] | semmle.label | ...: ... [&ref] | -| main.rs:100:18:100:20 | arg | semmle.label | arg | -| main.rs:100:22:100:29 | filename [&ref] | semmle.label | filename [&ref] | +| main.rs:100:22:100:29 | filename | semmle.label | filename | | main.rs:108:9:108:18 | arg_string | semmle.label | arg_string | -| main.rs:108:22:108:35 | ...::args | semmle.label | ...::args | +| main.rs:108:22:108:37 | ...::args(...) | semmle.label | ...::args(...) | | main.rs:108:22:108:37 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | | main.rs:108:22:108:44 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | | main.rs:108:22:108:74 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | From 1b3c87087b10444859c02221bab2441d60d8a76c Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 18 Aug 2026 11:22:33 +0100 Subject: [PATCH 0473/2098] Rust: Add more test cases for barrier guards. --- .../CWE-078/CommandInjection.expected | 72 +++++++++++++------ .../test/query-tests/security/CWE-078/main.rs | 31 ++++++++ 2 files changed, 82 insertions(+), 21 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected index 396f31314dac..b618fbeeccee 100644 --- a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected @@ -6,8 +6,16 @@ | main.rs:53:18:53:46 | concatenated_command.as_str() | main.rs:5:25:5:69 | ...::get(...) | main.rs:53:18:53:46 | concatenated_command.as_str() | This command line depends on a $@. | main.rs:5:25:5:69 | ...::get(...) | user-provided value | | main.rs:65:48:65:69 | remote_string.as_str() | main.rs:59:25:59:69 | ...::get(...) | main.rs:65:48:65:69 | remote_string.as_str() | This command line depends on a $@. | main.rs:59:25:59:69 | ...::get(...) | user-provided value | | main.rs:73:14:73:35 | remote_string.as_str() | main.rs:59:25:59:69 | ...::get(...) | main.rs:73:14:73:35 | remote_string.as_str() | This command line depends on a $@. | main.rs:59:25:59:69 | ...::get(...) | user-provided value | -| main.rs:86:18:86:27 | user_input | main.rs:108:22:108:37 | ...::args(...) | main.rs:86:18:86:27 | user_input | This command line depends on a $@. | main.rs:108:22:108:37 | ...::args(...) | user-provided value | -| main.rs:100:22:100:29 | filename | main.rs:108:22:108:37 | ...::args(...) | main.rs:100:22:100:29 | filename | This command line depends on a $@. | main.rs:108:22:108:37 | ...::args(...) | user-provided value | +| main.rs:86:18:86:27 | user_input | main.rs:138:22:138:37 | ...::args(...) | main.rs:86:18:86:27 | user_input | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | +| main.rs:100:22:100:29 | filename | main.rs:138:22:138:37 | ...::args(...) | main.rs:100:22:100:29 | filename | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | +| main.rs:111:22:111:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:111:22:111:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | +| main.rs:113:22:113:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:113:22:113:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | +| main.rs:119:22:119:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:119:22:119:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | +| main.rs:121:22:121:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:121:22:121:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | +| main.rs:125:22:125:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:125:22:125:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | +| main.rs:127:22:127:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:127:22:127:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | +| main.rs:131:22:131:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:131:22:131:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | +| main.rs:133:22:133:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:133:22:133:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | edges | main.rs:4:9:4:18 | arg_string | main.rs:27:18:27:27 | arg_string | provenance | | | main.rs:4:9:4:18 | arg_string | main.rs:40:14:40:23 | arg_string | provenance | | @@ -54,16 +62,27 @@ edges | main.rs:73:14:73:35 | remote_string.as_str() [&ref] | main.rs:73:14:73:35 | remote_string.as_str() | provenance | Sink:MaD:4 | | main.rs:82:27:82:42 | ...: ... [&ref] | main.rs:86:18:86:27 | user_input | provenance | Sink:MaD:1 | | main.rs:95:27:95:40 | ...: ... [&ref] | main.rs:100:22:100:29 | filename | provenance | Sink:MaD:1 | -| main.rs:108:9:108:18 | arg_string | main.rs:112:39:112:48 | arg_string | provenance | | -| main.rs:108:9:108:18 | arg_string | main.rs:113:40:113:49 | arg_string | provenance | | -| main.rs:108:22:108:37 | ...::args(...) | main.rs:108:22:108:37 | ...::args(...) [element] | provenance | Src:MaD:7 | -| main.rs:108:22:108:37 | ...::args(...) [element] | main.rs:108:22:108:44 | ... .nth(...) [Some] | provenance | MaD:8 | -| main.rs:108:22:108:44 | ... .nth(...) [Some] | main.rs:108:22:108:74 | ... .unwrap_or(...) | provenance | MaD:10 | -| main.rs:108:22:108:74 | ... .unwrap_or(...) | main.rs:108:9:108:18 | arg_string | provenance | | -| main.rs:112:39:112:48 | arg_string | main.rs:112:39:112:57 | arg_string.as_str() [&ref] | provenance | MaD:9 | -| main.rs:112:39:112:57 | arg_string.as_str() [&ref] | main.rs:82:27:82:42 | ...: ... [&ref] | provenance | | -| main.rs:113:40:113:49 | arg_string | main.rs:113:40:113:58 | arg_string.as_str() [&ref] | provenance | MaD:9 | -| main.rs:113:40:113:58 | arg_string.as_str() [&ref] | main.rs:95:27:95:40 | ...: ... [&ref] | provenance | | +| main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:111:22:111:28 | command | provenance | Sink:MaD:3 | +| main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:113:22:113:28 | command | provenance | Sink:MaD:3 | +| main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:119:22:119:28 | command | provenance | Sink:MaD:3 | +| main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:121:22:121:28 | command | provenance | Sink:MaD:3 | +| main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:125:22:125:28 | command | provenance | Sink:MaD:3 | +| main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:127:22:127:28 | command | provenance | Sink:MaD:3 | +| main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:131:22:131:28 | command | provenance | Sink:MaD:3 | +| main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:133:22:133:28 | command | provenance | Sink:MaD:3 | +| main.rs:138:9:138:18 | arg_string | main.rs:142:39:142:48 | arg_string | provenance | | +| main.rs:138:9:138:18 | arg_string | main.rs:143:40:143:49 | arg_string | provenance | | +| main.rs:138:9:138:18 | arg_string | main.rs:144:31:144:40 | arg_string | provenance | | +| main.rs:138:22:138:37 | ...::args(...) | main.rs:138:22:138:37 | ...::args(...) [element] | provenance | Src:MaD:7 | +| main.rs:138:22:138:37 | ...::args(...) [element] | main.rs:138:22:138:44 | ... .nth(...) [Some] | provenance | MaD:8 | +| main.rs:138:22:138:44 | ... .nth(...) [Some] | main.rs:138:22:138:74 | ... .unwrap_or(...) | provenance | MaD:10 | +| main.rs:138:22:138:74 | ... .unwrap_or(...) | main.rs:138:9:138:18 | arg_string | provenance | | +| main.rs:142:39:142:48 | arg_string | main.rs:142:39:142:57 | arg_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:142:39:142:57 | arg_string.as_str() [&ref] | main.rs:82:27:82:42 | ...: ... [&ref] | provenance | | +| main.rs:143:40:143:49 | arg_string | main.rs:143:40:143:58 | arg_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:143:40:143:58 | arg_string.as_str() [&ref] | main.rs:95:27:95:40 | ...: ... [&ref] | provenance | | +| main.rs:144:31:144:40 | arg_string | main.rs:144:31:144:49 | arg_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:144:31:144:49 | arg_string.as_str() [&ref] | main.rs:107:30:107:42 | ...: ... [&ref] | provenance | | models | 1 | Sink: ::arg; Argument[0]; command-injection | | 2 | Sink: ::args; Argument[0]; command-injection | @@ -130,13 +149,24 @@ nodes | main.rs:86:18:86:27 | user_input | semmle.label | user_input | | main.rs:95:27:95:40 | ...: ... [&ref] | semmle.label | ...: ... [&ref] | | main.rs:100:22:100:29 | filename | semmle.label | filename | -| main.rs:108:9:108:18 | arg_string | semmle.label | arg_string | -| main.rs:108:22:108:37 | ...::args(...) | semmle.label | ...::args(...) | -| main.rs:108:22:108:37 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | -| main.rs:108:22:108:44 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | -| main.rs:108:22:108:74 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | -| main.rs:112:39:112:48 | arg_string | semmle.label | arg_string | -| main.rs:112:39:112:57 | arg_string.as_str() [&ref] | semmle.label | arg_string.as_str() [&ref] | -| main.rs:113:40:113:49 | arg_string | semmle.label | arg_string | -| main.rs:113:40:113:58 | arg_string.as_str() [&ref] | semmle.label | arg_string.as_str() [&ref] | +| main.rs:107:30:107:42 | ...: ... [&ref] | semmle.label | ...: ... [&ref] | +| main.rs:111:22:111:28 | command | semmle.label | command | +| main.rs:113:22:113:28 | command | semmle.label | command | +| main.rs:119:22:119:28 | command | semmle.label | command | +| main.rs:121:22:121:28 | command | semmle.label | command | +| main.rs:125:22:125:28 | command | semmle.label | command | +| main.rs:127:22:127:28 | command | semmle.label | command | +| main.rs:131:22:131:28 | command | semmle.label | command | +| main.rs:133:22:133:28 | command | semmle.label | command | +| main.rs:138:9:138:18 | arg_string | semmle.label | arg_string | +| main.rs:138:22:138:37 | ...::args(...) | semmle.label | ...::args(...) | +| main.rs:138:22:138:37 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | +| main.rs:138:22:138:44 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | +| main.rs:138:22:138:74 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | +| main.rs:142:39:142:48 | arg_string | semmle.label | arg_string | +| main.rs:142:39:142:57 | arg_string.as_str() [&ref] | semmle.label | arg_string.as_str() [&ref] | +| main.rs:143:40:143:49 | arg_string | semmle.label | arg_string | +| main.rs:143:40:143:58 | arg_string.as_str() [&ref] | semmle.label | arg_string.as_str() [&ref] | +| main.rs:144:31:144:40 | arg_string | semmle.label | arg_string | +| main.rs:144:31:144:49 | arg_string.as_str() [&ref] | semmle.label | arg_string.as_str() [&ref] | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-078/main.rs b/rust/ql/test/query-tests/security/CWE-078/main.rs index 6fc29ceb2104..7a422af26d38 100644 --- a/rust/ql/test/query-tests/security/CWE-078/main.rs +++ b/rust/ql/test/query-tests/security/CWE-078/main.rs @@ -104,6 +104,36 @@ mod qhelp_example_good { } } +fn test_allowlist_sanitizers(command: &str) { + let allowed_commands_array = ["cat", "git", "ls"]; + + if allowed_commands_array.contains(&command) { + Command::new(command).output().expect("failed"); // $ SPURIOUS: Alert[rust/command-line-injection]=args2 + } else { + Command::new(command).output().expect("failed"); // $ Alert[rust/command-line-injection]=args2 + } + + let allowed_commands_vec = vec!["cat", "git", "ls"]; + + if allowed_commands_vec.contains(&command) { + Command::new(command).output().expect("failed"); // $ SPURIOUS: Alert[rust/command-line-injection]=args2 + } else { + Command::new(command).output().expect("failed"); // $ Alert[rust/command-line-injection]=args2 + } + + if command == "ls" { + Command::new(command).output().expect("failed"); // $ SPURIOUS: Alert[rust/command-line-injection]=args2 + } else { + Command::new(command).output().expect("failed"); // $ Alert[rust/command-line-injection]=args2 + } + + if command != "ls" { + Command::new(command).output().expect("failed"); // $ Alert[rust/command-line-injection]=args2 + } else { + Command::new(command).output().expect("failed"); // $ SPURIOUS: Alert[rust/command-line-injection]=args2 + } +} + fn main() { let arg_string = std::env::args().nth(1).unwrap_or(String::from("ls")); // $ Source=args2 @@ -111,4 +141,5 @@ fn main() { test_tokio_command_injection(); qhelp_example_bad::handle_request(arg_string.as_str()); qhelp_example_good::handle_request(arg_string.as_str()); + test_allowlist_sanitizers(arg_string.as_str()); } From 1a8b5b5ea8d7862d7cab4766033addc3a0f630ea Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 18 Aug 2026 11:26:56 +0100 Subject: [PATCH 0474/2098] Rust: Add barrier guards to the query. --- .../security/CommandInjectionExtensions.qll | 58 +++++++++++++++++++ .../CWE-078/CommandInjection.expected | 9 --- .../test/query-tests/security/CWE-078/main.rs | 6 +- 3 files changed, 61 insertions(+), 12 deletions(-) diff --git a/rust/ql/lib/codeql/rust/security/CommandInjectionExtensions.qll b/rust/ql/lib/codeql/rust/security/CommandInjectionExtensions.qll index 7e0150d53f66..2abcec6eb6f9 100644 --- a/rust/ql/lib/codeql/rust/security/CommandInjectionExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/CommandInjectionExtensions.qll @@ -61,4 +61,62 @@ module CommandInjection { private class FieldlessEnumTypeBarrier extends Barrier instanceof Barriers::FieldlessEnumTypeBarrier { } + + /** + * A sanitizer guard for command injection vulnerabilities. + */ + class SanitizerGuard extends Barrier { + SanitizerGuard() { this = DataFlow::BarrierGuard::getABarrierNode() } + } +} + +private predicate sanitizerGuard(AstNode g, Expr e, boolean branch) { + g.(SanitizerGuard::Range).checks(e, branch) +} + +/** + * Provides a class for modeling new command injection safety checks. + */ +module SanitizerGuard { + /** + * A data-flow node that checks whether a command is safe. + */ + abstract class Range extends AstNode { + /** + * Holds if this guard validates `e` upon evaluating to `branch`. + */ + abstract predicate checks(Expr e, boolean branch); + } +} + +/** + * A successful membership check against a (presumed) command allowlist. For example: + * ``` + * if allowlist.contains(&commmand) { ... } + * ``` + */ +private class AllowlistContainsCheck extends SanitizerGuard::Range, MethodCall { + AllowlistContainsCheck() { this.getStaticTarget().getName().getText() = "contains" } + + override predicate checks(Expr e, boolean branch) { + e.getParentNode*() = this.getPositionalArgument(0) and + branch = true + } +} + +/** + * An equality check against a (presumed) allowed command value. For example: + * ``` + * if command == "ls" { ... } + * ``` + */ +private class AllowlistEqualityCheck extends SanitizerGuard::Range, EqualityOperation { + override predicate checks(Expr e, boolean branch) { + e = this.getAnOperand() and + ( + this instanceof EqualsOperation and branch = true + or + this instanceof NotEqualsOperation and branch = false + ) + } } diff --git a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected index b618fbeeccee..be6128cef5d0 100644 --- a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected @@ -10,12 +10,9 @@ | main.rs:100:22:100:29 | filename | main.rs:138:22:138:37 | ...::args(...) | main.rs:100:22:100:29 | filename | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | | main.rs:111:22:111:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:111:22:111:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | | main.rs:113:22:113:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:113:22:113:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | -| main.rs:119:22:119:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:119:22:119:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | | main.rs:121:22:121:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:121:22:121:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | -| main.rs:125:22:125:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:125:22:125:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | | main.rs:127:22:127:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:127:22:127:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | | main.rs:131:22:131:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:131:22:131:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | -| main.rs:133:22:133:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:133:22:133:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | edges | main.rs:4:9:4:18 | arg_string | main.rs:27:18:27:27 | arg_string | provenance | | | main.rs:4:9:4:18 | arg_string | main.rs:40:14:40:23 | arg_string | provenance | | @@ -64,12 +61,9 @@ edges | main.rs:95:27:95:40 | ...: ... [&ref] | main.rs:100:22:100:29 | filename | provenance | Sink:MaD:1 | | main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:111:22:111:28 | command | provenance | Sink:MaD:3 | | main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:113:22:113:28 | command | provenance | Sink:MaD:3 | -| main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:119:22:119:28 | command | provenance | Sink:MaD:3 | | main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:121:22:121:28 | command | provenance | Sink:MaD:3 | -| main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:125:22:125:28 | command | provenance | Sink:MaD:3 | | main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:127:22:127:28 | command | provenance | Sink:MaD:3 | | main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:131:22:131:28 | command | provenance | Sink:MaD:3 | -| main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:133:22:133:28 | command | provenance | Sink:MaD:3 | | main.rs:138:9:138:18 | arg_string | main.rs:142:39:142:48 | arg_string | provenance | | | main.rs:138:9:138:18 | arg_string | main.rs:143:40:143:49 | arg_string | provenance | | | main.rs:138:9:138:18 | arg_string | main.rs:144:31:144:40 | arg_string | provenance | | @@ -152,12 +146,9 @@ nodes | main.rs:107:30:107:42 | ...: ... [&ref] | semmle.label | ...: ... [&ref] | | main.rs:111:22:111:28 | command | semmle.label | command | | main.rs:113:22:113:28 | command | semmle.label | command | -| main.rs:119:22:119:28 | command | semmle.label | command | | main.rs:121:22:121:28 | command | semmle.label | command | -| main.rs:125:22:125:28 | command | semmle.label | command | | main.rs:127:22:127:28 | command | semmle.label | command | | main.rs:131:22:131:28 | command | semmle.label | command | -| main.rs:133:22:133:28 | command | semmle.label | command | | main.rs:138:9:138:18 | arg_string | semmle.label | arg_string | | main.rs:138:22:138:37 | ...::args(...) | semmle.label | ...::args(...) | | main.rs:138:22:138:37 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | diff --git a/rust/ql/test/query-tests/security/CWE-078/main.rs b/rust/ql/test/query-tests/security/CWE-078/main.rs index 7a422af26d38..f2d8ac4ee994 100644 --- a/rust/ql/test/query-tests/security/CWE-078/main.rs +++ b/rust/ql/test/query-tests/security/CWE-078/main.rs @@ -116,13 +116,13 @@ fn test_allowlist_sanitizers(command: &str) { let allowed_commands_vec = vec!["cat", "git", "ls"]; if allowed_commands_vec.contains(&command) { - Command::new(command).output().expect("failed"); // $ SPURIOUS: Alert[rust/command-line-injection]=args2 + Command::new(command).output().expect("failed"); } else { Command::new(command).output().expect("failed"); // $ Alert[rust/command-line-injection]=args2 } if command == "ls" { - Command::new(command).output().expect("failed"); // $ SPURIOUS: Alert[rust/command-line-injection]=args2 + Command::new(command).output().expect("failed"); } else { Command::new(command).output().expect("failed"); // $ Alert[rust/command-line-injection]=args2 } @@ -130,7 +130,7 @@ fn test_allowlist_sanitizers(command: &str) { if command != "ls" { Command::new(command).output().expect("failed"); // $ Alert[rust/command-line-injection]=args2 } else { - Command::new(command).output().expect("failed"); // $ SPURIOUS: Alert[rust/command-line-injection]=args2 + Command::new(command).output().expect("failed"); } } From 9fc84bfc329771ecfbc8e63dc19c78d7c8489dbf Mon Sep 17 00:00:00 2001 From: Chaitanya Mangalagiri Date: Sat, 22 Aug 2026 15:30:19 -0700 Subject: [PATCH 0475/2098] Rust: Clarify comment in CommandInjectionGood.rs example per review suggestion --- rust/ql/src/queries/security/CWE-078/CommandInjectionGood.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rust/ql/src/queries/security/CWE-078/CommandInjectionGood.rs b/rust/ql/src/queries/security/CWE-078/CommandInjectionGood.rs index bb720d39d03e..9892c47fda21 100644 --- a/rust/ql/src/queries/security/CWE-078/CommandInjectionGood.rs +++ b/rust/ql/src/queries/security/CWE-078/CommandInjectionGood.rs @@ -1,8 +1,7 @@ use std::process::Command; fn handle_request(filename: &str) { - // GOOD: use a fixed command with the user input as a separate argument, - // avoiding shell interpretation + // GOOD: user input is checked against an allowlist before passing into a shell command let allowed_names = ["report.pdf", "summary.txt", "data.csv"]; if allowed_names.contains(&filename) { Command::new("cat") From 3715b86fc4e7a0b42b695840bf08165024120793 Mon Sep 17 00:00:00 2001 From: Keshav Malik Date: Sun, 23 Aug 2026 14:16:10 +0530 Subject: [PATCH 0476/2098] Refine truth-value detection --- .../AmbiguousAssignmentOfComparison.ql | 50 +++++++---- ...8-13-ambiguous-assignment-of-comparison.md | 2 +- .../AmbiguousAssignmentOfComparison.expected | 60 ++++++++------ .../AmbiguousAssignmentOfComparison/test.c | 47 ++++++++++- .../AmbiguousAssignmentOfComparison/test.cpp | 83 +++++++++++++++++-- 5 files changed, 194 insertions(+), 48 deletions(-) diff --git a/cpp/ql/src/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison.ql b/cpp/ql/src/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison.ql index be3007ffa038..c767fecac9a8 100644 --- a/cpp/ql/src/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison.ql +++ b/cpp/ql/src/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison.ql @@ -1,7 +1,8 @@ /** - * @name Ambiguous assignment of comparison in condition - * @description Assigning the result of an unparenthesized comparison in a condition may indicate - * that the assignment and comparison are grouped incorrectly. + * @name Ambiguous assignment of comparison used as truth value + * @description Assigning the result of an unparenthesized comparison when the assignment is used + * as a truth value may indicate that the assignment and comparison are grouped + * incorrectly. * @kind problem * @problem.severity warning * @precision high @@ -14,23 +15,36 @@ import cpp -/** Gets a condition that controls branching. */ -private Expr getACondition() { - result = any(IfStmt s).getCondition() +/** Holds if the value of `expression` is directly used as a truth value. */ +private predicate isDirectlyUsedAsTruthValue(Expr expression) { + expression.isCondition() or - result = any(Loop s).getCondition() + expression = any(UnaryLogicalOperation operation).getAnOperand() or - result = any(ConditionalExpr e).getCondition() + expression = any(BinaryLogicalOperation operation).getAnOperand() } /** - * Holds if `assignment` occurs within a condition that controls branching. - * - * This includes nested expressions, such as function arguments and either operand of a comma - * expression, because the ambiguous syntax still occurs within the condition. + * Holds if the value of `expression` is used as a truth value, possibly after contributing to a + * comma, conditional, or comparison expression. */ -private predicate occursInCondition(Assignment assignment) { - assignment.getParent*() = getACondition() +private predicate isUsedAsTruthValue(Expr expression) { + isDirectlyUsedAsTruthValue(expression) + or + exists(CommaExpr comma | + expression = comma.getRightOperand() and + isUsedAsTruthValue(comma) + ) + or + exists(ConditionalExpr conditional | + expression = [conditional.getThen(), conditional.getElse()] and + isUsedAsTruthValue(conditional) + ) + or + exists(ComparisonOperation comparison | + expression = comparison.getAnOperand() and + isUsedAsTruthValue(comparison) + ) } /** @@ -46,11 +60,13 @@ from Assignment assignment, ComparisonOperation comparison where assignment.getRValue() = comparison and not isExplicitlyGrouped(comparison) and - occursInCondition(assignment) and - // Assigning a comparison result to a Boolean is normally intentional. + isUsedAsTruthValue(assignment) and + // A Boolean lvalue makes assigning the comparison result type-appropriate and normally + // intentional. not assignment.getLValue().getUnspecifiedType() instanceof BoolType and not assignment.isUnevaluated() and not assignment.isFromUninstantiatedTemplate(_) select assignment, "The '" + assignment.getOperator() + - "' operation assigns the result of an unparenthesized comparison used in a condition." + "' operation assigns the result of an unparenthesized comparison, and its result is used as " + + "a truth value." diff --git a/cpp/ql/src/change-notes/2026-08-13-ambiguous-assignment-of-comparison.md b/cpp/ql/src/change-notes/2026-08-13-ambiguous-assignment-of-comparison.md index ae9e2c5d3823..91e83979b524 100644 --- a/cpp/ql/src/change-notes/2026-08-13-ambiguous-assignment-of-comparison.md +++ b/cpp/ql/src/change-notes/2026-08-13-ambiguous-assignment-of-comparison.md @@ -2,4 +2,4 @@ category: newQuery --- * Added a new query, `cpp/ambiguous-assignment-of-comparison`, to detect assignments of - unparenthesized comparison results in conditions. + unparenthesized comparison results when the assignment is used as a truth value. diff --git a/cpp/ql/test/query-tests/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison/AmbiguousAssignmentOfComparison.expected b/cpp/ql/test/query-tests/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison/AmbiguousAssignmentOfComparison.expected index 9075768e9f98..8b905f48bba2 100644 --- a/cpp/ql/test/query-tests/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison/AmbiguousAssignmentOfComparison.expected +++ b/cpp/ql/test/query-tests/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison/AmbiguousAssignmentOfComparison.expected @@ -1,24 +1,36 @@ -| test.c:6:8:6:31 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | -| test.c:13:30:13:54 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | -| test.c:20:8:20:33 | ... /= ... | The '/=' operation assigns the result of an unparenthesized comparison used in a condition. | -| test.c:27:8:27:33 | ... %= ... | The '%=' operation assigns the result of an unparenthesized comparison used in a condition. | -| test.c:34:8:34:32 | ... \|= ... | The '\|=' operation assigns the result of an unparenthesized comparison used in a condition. | -| test.c:41:8:41:33 | ... >>= ... | The '>>=' operation assigns the result of an unparenthesized comparison used in a condition. | -| test.c:51:3:51:26 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | -| test.cpp:8:8:8:30 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | -| test.cpp:15:11:15:34 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | -| test.cpp:22:7:22:29 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | -| test.cpp:29:11:29:40 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | -| test.cpp:36:8:36:30 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | -| test.cpp:43:11:43:33 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | -| test.cpp:48:8:48:33 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | -| test.cpp:55:8:55:32 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | -| test.cpp:64:13:64:35 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | -| test.cpp:70:29:70:51 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | -| test.cpp:77:8:77:30 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | -| test.cpp:84:8:84:38 | ... <<= ... | The '<<=' operation assigns the result of an unparenthesized comparison used in a condition. | -| test.cpp:91:9:91:31 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | -| test.cpp:101:3:101:20 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | -| test.cpp:253:8:253:24 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | -| test.cpp:280:16:280:38 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | -| test.cpp:287:8:287:30 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison used in a condition. | +| test.c:6:8:6:31 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.c:13:30:13:54 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.c:20:8:20:33 | ... /= ... | The '/=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.c:27:8:27:33 | ... %= ... | The '%=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.c:34:8:34:32 | ... \|= ... | The '\|=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.c:41:8:41:33 | ... >>= ... | The '>>=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.c:51:3:51:26 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.c:102:28:102:51 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.c:109:15:109:38 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.c:116:49:116:72 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.c:130:11:130:34 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.cpp:8:8:8:30 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.cpp:15:11:15:34 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.cpp:22:7:22:29 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.cpp:29:11:29:40 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.cpp:36:8:36:30 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.cpp:43:11:43:33 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.cpp:48:8:48:33 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.cpp:55:8:55:32 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.cpp:64:13:64:35 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.cpp:70:29:70:51 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.cpp:77:8:77:30 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.cpp:84:8:84:38 | ... <<= ... | The '<<=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.cpp:91:9:91:31 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.cpp:101:3:101:20 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.cpp:253:8:253:24 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.cpp:294:27:294:49 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.cpp:301:27:301:49 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.cpp:308:9:308:31 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.cpp:315:15:315:37 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.cpp:322:23:322:45 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.cpp:329:47:329:69 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.cpp:343:47:343:69 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.cpp:350:11:350:33 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.cpp:355:12:355:34 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | +| test.cpp:360:14:360:36 | ... = ... | The '=' operation assigns the result of an unparenthesized comparison, and its result is used as a truth value. | diff --git a/cpp/ql/test/query-tests/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison/test.c b/cpp/ql/test/query-tests/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison/test.c index ee78980b3672..18e7675e40ad 100644 --- a/cpp/ql/test/query-tests/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison/test.c +++ b/cpp/ql/test/query-tests/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison/test.c @@ -82,10 +82,55 @@ int c_boolean_result_assignment(void) { int c_switch_expression(void) { int value; - switch (value = read_value() < 0) { // GOOD: This query only covers branching conditions. + switch (value = read_value() < 0) { // GOOD: The switch operand is not used as a truth value. case 0: return value; default: return 0; } } + +int c_discarded_assignment_in_comma_expression(void) { + int value; + if ((value = read_value() < 0, read_other_value())) // GOOD: The assignment result is discarded. + return value; + return 0; +} + +int c_truth_valued_assignment_in_comma_expression(void) { + int value; + if ((read_other_value(), value = read_value() < 0)) // $ Alert // BAD + return value; + return 0; +} + +int c_truth_valued_conditional_then_arm(int flag) { + int value; + if (flag ? (value = read_value() < 0) : 0) // $ Alert // BAD + return value; + return 0; +} + +int c_nested_truth_valued_comma_expression(void) { + int value; + if ((read_other_value(), (read_other_value(), value = read_value() < 0))) // $ Alert // BAD + return value; + return 0; +} + +int c_nested_discarded_comma_expression(void) { + int value; + if (((read_other_value(), value = read_value() < 0), read_other_value())) // GOOD: Discarded. + return value; + return 0; +} + +int c_logical_value_outside_branch(void) { + int value; + return (value = read_value() < 0) && read_other_value(); // $ Alert // BAD +} + +int c_returned_assignment(void) { + int value; + return value = read_value() < 0; // GOOD: The assignment result is not used as a truth value. +} diff --git a/cpp/ql/test/query-tests/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison/test.cpp b/cpp/ql/test/query-tests/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison/test.cpp index 8082c7925f92..ac20faf01958 100644 --- a/cpp/ql/test/query-tests/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison/test.cpp +++ b/cpp/ql/test/query-tests/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison/test.cpp @@ -1,7 +1,7 @@ int get_value(); int get_other_value(); void *get_pointer(); -bool identity(bool value); +bool check(int value); int direct_if() { int value; @@ -74,7 +74,7 @@ int logical_or() { int nested_comparison() { int value; - if ((value = get_value() < 0) == 1) // $ Alert // BAD + if ((value = get_value() < 0) == false) // $ Alert // BAD return value; return 0; } @@ -173,7 +173,7 @@ int compound_assignment_without_comparison() { int switch_expression() { int value; - switch (value = get_value() < 0) { // GOOD: This query only covers branching conditions. + switch (value = get_value() < 0) { // GOOD: The switch operand is not used as a truth value. case 0: return value; default: @@ -277,14 +277,87 @@ int overloaded_comparison() { int assignment_as_call_argument() { int value; - if (identity(value = get_value() < 0)) // $ Alert // BAD: The ambiguous syntax is still in a condition. + if (check(value = get_value() < 0)) // GOOD: The assignment only computes an integer argument. return value; return 0; } int discarded_assignment_in_comma_expression() { int value; - if ((value = get_value() < 0, get_other_value())) // $ Alert // BAD: Still ambiguous syntax in a condition. + if ((value = get_value() < 0, get_other_value())) // GOOD: The assignment result is discarded. + return value; + return 0; +} + +int truth_valued_assignment_in_comma_expression() { + int value; + if ((get_other_value(), value = get_value() < 0)) // $ Alert // BAD + return value; + return 0; +} + +int comma_assignment_under_comparison() { + int value; + if ((get_other_value(), value = get_value() < 0) == false) // $ Alert // BAD + return value; + return 0; +} + +int nested_truth_valued_comparisons() { + int value; + if (((value = get_value() < 0) == false) == false) // $ Alert // BAD + return value; + return 0; +} + +int truth_valued_conditional_then_arm(bool flag) { + int value; + if (flag ? (value = get_value() < 0) : false) // $ Alert // BAD + return value; + return 0; +} + +int truth_valued_conditional_else_arm(bool flag) { + int value; + if (flag ? false : (value = get_value() < 0)) // $ Alert // BAD + return value; + return 0; +} + +int nested_truth_valued_comma_expression() { + int value; + if ((get_other_value(), (get_other_value(), value = get_value() < 0))) // $ Alert // BAD + return value; + return 0; +} + +int nested_discarded_comma_expression() { + int value; + if (((get_other_value(), value = get_value() < 0), get_other_value())) // GOOD: Discarded. + return value; + return 0; +} + +int nested_comma_assignment_under_comparison() { + int value; + if ((get_other_value(), (get_other_value(), value = get_value() < 0)) == false) // $ Alert // BAD + return value; + return 0; +} + +bool logical_value_outside_branch() { + int value; + return (value = get_value() < 0) && get_other_value(); // $ Alert // BAD +} + +bool logical_not_outside_branch() { + int value; + return !(value = get_value() < 0); // $ Alert // BAD +} + +int truth_valued_assignment_inside_call_argument() { + int value; + if (check((value = get_value() < 0) && get_other_value())) // $ Alert // BAD return value; return 0; } From 6d26e22190d5f65a250cb205932247700751fd38 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 24 Aug 2026 10:04:59 +0200 Subject: [PATCH 0477/2098] Rust: Add MaD tests for blanket implementations --- .../dataflow/models/external_file.rs | 12 +- .../library-tests/dataflow/models/main.rs | 45 +- .../dataflow/models/models.expected | 613 +++++++++--------- .../dataflow/models/models.ext.yml | 2 + 4 files changed, 359 insertions(+), 313 deletions(-) diff --git a/rust/ql/test/library-tests/dataflow/models/external_file.rs b/rust/ql/test/library-tests/dataflow/models/external_file.rs index 0e351a475d38..044150eb8ee2 100644 --- a/rust/ql/test/library-tests/dataflow/models/external_file.rs +++ b/rust/ql/test/library-tests/dataflow/models/external_file.rs @@ -1,4 +1,3 @@ - pub fn generated_source(i: i64) -> i64 { 0 } @@ -28,3 +27,14 @@ pub fn neutral_generated_summary(i: i64) -> i64 { pub fn neutral_manual_summary(i: i64) -> i64 { 0 } + +pub trait MyTrait2 { + fn flow_through2(i: i64) -> i64; +} + +impl MyTrait2 for T { + // inherits model from the trait function + fn flow_through2(i: i64) -> i64 { + 0 + } +} diff --git a/rust/ql/test/library-tests/dataflow/models/main.rs b/rust/ql/test/library-tests/dataflow/models/main.rs index d06ed3069b53..77db4621e711 100644 --- a/rust/ql/test/library-tests/dataflow/models/main.rs +++ b/rust/ql/test/library-tests/dataflow/models/main.rs @@ -102,7 +102,7 @@ fn test_set_var_field() { match e1 { MyFieldEnum::C { field_c: i } => sink(i), MyFieldEnum::D { field_d: i } => sink(i), // $ hasValueFlow=5 - MyFieldEnum::E { field_e: o } => () + MyFieldEnum::E { field_e: o } => (), } } @@ -258,18 +258,17 @@ fn test_enum_source() { match s { MyFieldEnum::C { field_c: i } => sink(i), MyFieldEnum::D { field_d: i } => sink(i), // $ hasValueFlow=12 - MyFieldEnum::E { field_e: o } => () + MyFieldEnum::E { field_e: o } => (), } let s = enum_source_nested(13); match s { MyFieldEnum::C { field_c: i } => sink(i), MyFieldEnum::D { field_d: i } => sink(i), - MyFieldEnum::E { field_e: o } => - { + MyFieldEnum::E { field_e: o } => { match o { Some(i) => sink(i), // $ hasValueFlow=13 - None => () + None => (), } } } @@ -281,13 +280,13 @@ fn test_enum_method_source() { match s { MyFieldEnum::C { field_c: i } => sink(i), // $ hasValueFlow=13 MyFieldEnum::D { field_d: i } => sink(i), - MyFieldEnum::E { field_e: o } => () + MyFieldEnum::E { field_e: o } => (), } } mod source_into_function { - use crate::MyFieldEnum; use super::sink; + use crate::MyFieldEnum; // has a source model fn pass_source(_i: i64, f: impl FnOnce(i64) -> A) -> A { @@ -320,11 +319,10 @@ mod source_into_function { match e { MyFieldEnum::C { field_c: i } => sink(i), MyFieldEnum::D { field_d: i } => sink(i), - MyFieldEnum::E { field_e: o } => - { + MyFieldEnum::E { field_e: o } => { match o { Some(i) => sink(i), // $ hasValueFlow=5 - None => () + None => (), } } } @@ -333,14 +331,14 @@ mod source_into_function { } mod sink_out_of_function { - use crate::MyFieldEnum; use super::source; + use crate::MyFieldEnum; // has a sink model - fn pass_sink(f: impl FnOnce(()) -> i64) { } + fn pass_sink(f: impl FnOnce(()) -> i64) {} // has a sink model - fn pass_sink_nested(f: impl FnOnce(()) -> MyFieldEnum) { } + fn pass_sink_nested(f: impl FnOnce(()) -> MyFieldEnum) {} fn test_sink_out_of_function() { let a = |a| source(1); @@ -348,7 +346,9 @@ mod sink_out_of_function { let b = |_a| { let s = source(2); - MyFieldEnum::E { field_e: Option::Some(s) } + MyFieldEnum::E { + field_e: Option::Some(s), + } }; pass_sink_nested(b); // $ hasValueFlow=2 } @@ -460,6 +460,17 @@ impl Ord for MyStruct2 { } } +trait MyTrait3 { + fn flow_through3(i: i64) -> i64; +} + +impl MyTrait3 for T { + // has an explicit model + fn flow_through3(i: i64) -> i64 { + 0 + } +} + fn test_trait_model(x: T) { let x1 = source(20).max(0); sink(x1); // $ hasValueFlow=20 @@ -488,6 +499,12 @@ fn test_trait_model(x: T) { let x7 = (source(28) as i32) < 1; sink(x7); + + let x8 = <()>::flow_through2(source(29)); + sink(x8); // $ hasValueFlow=29 + + let x9 = <()>::flow_through3(source(30)); + sink(x9); // $ MISSING: hasValueFlow=30 } mod external_file; diff --git a/rust/ql/test/library-tests/dataflow/models/models.expected b/rust/ql/test/library-tests/dataflow/models/models.expected index 81add2ae3f6b..9fec16cfafa2 100644 --- a/rust/ql/test/library-tests/dataflow/models/models.expected +++ b/rust/ql/test/library-tests/dataflow/models/models.expected @@ -23,20 +23,21 @@ models | 22 | Summary: main::apply; Argument[0]; Argument[1].Parameter[0]; value | | 23 | Summary: main::apply; Argument[1].ReturnValue; ReturnValue; value | | 24 | Summary: main::coerce; Argument[0]; ReturnValue; taint | -| 25 | Summary: main::external_file::generated_summary; Argument[0]; ReturnValue; value | -| 26 | Summary: main::external_file::neutral_manual_summary; Argument[0]; ReturnValue; value | -| 27 | Summary: main::get_array_element; Argument[0].Element; ReturnValue; value | -| 28 | Summary: main::get_async_number; Argument[0]; ReturnValue.Future; value | -| 29 | Summary: main::get_struct_field; Argument[0].Field[main::MyStruct::field1]; ReturnValue; value | -| 30 | Summary: main::get_tuple_element; Argument[0].Field[0]; ReturnValue; value | -| 31 | Summary: main::get_var_field; Argument[0].Field[main::MyFieldEnum::C::field_c]; ReturnValue; value | -| 32 | Summary: main::get_var_pos; Argument[0].Field[main::MyPosEnum::A(0)]; ReturnValue; value | -| 33 | Summary: main::set_array_element; Argument[0]; ReturnValue.Element; value | -| 34 | Summary: main::set_struct_field; Argument[0]; ReturnValue.Field[main::MyStruct::field2]; value | -| 35 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value | -| 36 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value | -| 37 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value | -| 38 | Summary: main::snd; Argument[1]; ReturnValue; value | +| 25 | Summary: main::external_file::MyTrait2::flow_through2; Argument[0]; ReturnValue; value | +| 26 | Summary: main::external_file::generated_summary; Argument[0]; ReturnValue; value | +| 27 | Summary: main::external_file::neutral_manual_summary; Argument[0]; ReturnValue; value | +| 28 | Summary: main::get_array_element; Argument[0].Element; ReturnValue; value | +| 29 | Summary: main::get_async_number; Argument[0]; ReturnValue.Future; value | +| 30 | Summary: main::get_struct_field; Argument[0].Field[main::MyStruct::field1]; ReturnValue; value | +| 31 | Summary: main::get_tuple_element; Argument[0].Field[0]; ReturnValue; value | +| 32 | Summary: main::get_var_field; Argument[0].Field[main::MyFieldEnum::C::field_c]; ReturnValue; value | +| 33 | Summary: main::get_var_pos; Argument[0].Field[main::MyPosEnum::A(0)]; ReturnValue; value | +| 34 | Summary: main::set_array_element; Argument[0]; ReturnValue.Element; value | +| 35 | Summary: main::set_struct_field; Argument[0]; ReturnValue.Field[main::MyStruct::field2]; value | +| 36 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value | +| 37 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value | +| 38 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value | +| 39 | Summary: main::snd; Argument[1]; ReturnValue; value | edges | main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | | | main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | | @@ -51,8 +52,8 @@ edges | main.rs:41:9:41:10 | s1 | main.rs:42:17:42:18 | s1 | provenance | | | main.rs:41:14:41:23 | source(...) | main.rs:41:9:41:10 | s1 | provenance | | | main.rs:41:14:41:23 | source(...) | main.rs:41:9:41:10 | s1 | provenance | | -| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:38 | -| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:38 | +| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:39 | +| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:39 | | main.rs:54:9:54:9 | s | main.rs:55:27:55:27 | s | provenance | | | main.rs:54:9:54:9 | s | main.rs:55:27:55:27 | s | provenance | | | main.rs:54:13:54:21 | source(...) | main.rs:54:9:54:9 | s | provenance | | @@ -63,8 +64,8 @@ edges | main.rs:55:14:55:28 | ...::A(...) [A] | main.rs:55:9:55:10 | e1 [A] | provenance | | | main.rs:55:27:55:27 | s | main.rs:55:14:55:28 | ...::A(...) [A] | provenance | | | main.rs:55:27:55:27 | s | main.rs:55:14:55:28 | ...::A(...) [A] | provenance | | -| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:32 | -| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:32 | +| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:33 | +| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:33 | | main.rs:67:9:67:9 | s | main.rs:68:26:68:26 | s | provenance | | | main.rs:67:9:67:9 | s | main.rs:68:26:68:26 | s | provenance | | | main.rs:67:13:67:21 | source(...) | main.rs:67:9:67:9 | s | provenance | | @@ -73,8 +74,8 @@ edges | main.rs:68:9:68:10 | e1 [B] | main.rs:69:11:69:12 | e1 [B] | provenance | | | main.rs:68:14:68:27 | set_var_pos(...) [B] | main.rs:68:9:68:10 | e1 [B] | provenance | | | main.rs:68:14:68:27 | set_var_pos(...) [B] | main.rs:68:9:68:10 | e1 [B] | provenance | | -| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:37 | -| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:37 | +| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:38 | +| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:38 | | main.rs:69:11:69:12 | e1 [B] | main.rs:71:9:71:23 | ...::B(...) [B] | provenance | | | main.rs:69:11:69:12 | e1 [B] | main.rs:71:9:71:23 | ...::B(...) [B] | provenance | | | main.rs:71:9:71:23 | ...::B(...) [B] | main.rs:71:22:71:22 | i | provenance | | @@ -91,8 +92,8 @@ edges | main.rs:88:14:88:42 | ...::C {...} [C] | main.rs:88:9:88:10 | e1 [C] | provenance | | | main.rs:88:40:88:40 | s | main.rs:88:14:88:42 | ...::C {...} [C] | provenance | | | main.rs:88:40:88:40 | s | main.rs:88:14:88:42 | ...::C {...} [C] | provenance | | -| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:31 | -| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:31 | +| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:32 | +| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:32 | | main.rs:100:9:100:9 | s | main.rs:101:28:101:28 | s | provenance | | | main.rs:100:9:100:9 | s | main.rs:101:28:101:28 | s | provenance | | | main.rs:100:13:100:21 | source(...) | main.rs:100:9:100:9 | s | provenance | | @@ -101,8 +102,8 @@ edges | main.rs:101:9:101:10 | e1 [D] | main.rs:102:11:102:12 | e1 [D] | provenance | | | main.rs:101:14:101:29 | set_var_field(...) [D] | main.rs:101:9:101:10 | e1 [D] | provenance | | | main.rs:101:14:101:29 | set_var_field(...) [D] | main.rs:101:9:101:10 | e1 [D] | provenance | | -| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:36 | -| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:36 | +| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:37 | +| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:37 | | main.rs:102:11:102:12 | e1 [D] | main.rs:104:9:104:37 | ...::D {...} [D] | provenance | | | main.rs:102:11:102:12 | e1 [D] | main.rs:104:9:104:37 | ...::D {...} [D] | provenance | | | main.rs:104:9:104:37 | ...::D {...} [D] | main.rs:104:35:104:35 | i | provenance | | @@ -119,8 +120,8 @@ edges | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | main.rs:121:9:121:17 | my_struct [MyStruct.field1] | provenance | | | main.rs:122:17:122:17 | s | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | provenance | | | main.rs:122:17:122:17 | s | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | provenance | | -| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:29 | -| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:29 | +| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:30 | +| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:30 | | main.rs:142:9:142:9 | s | main.rs:143:38:143:38 | s | provenance | | | main.rs:142:9:142:9 | s | main.rs:143:38:143:38 | s | provenance | | | main.rs:142:13:142:21 | source(...) | main.rs:142:9:142:9 | s | provenance | | @@ -129,16 +130,16 @@ edges | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | provenance | | | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | provenance | | | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | provenance | | -| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:34 | -| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:34 | +| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:35 | +| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:35 | | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | main.rs:145:10:145:25 | my_struct.field2 | provenance | | | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | main.rs:145:10:145:25 | my_struct.field2 | provenance | | | main.rs:154:9:154:9 | s | main.rs:155:29:155:29 | s | provenance | | | main.rs:154:9:154:9 | s | main.rs:155:29:155:29 | s | provenance | | | main.rs:154:13:154:21 | source(...) | main.rs:154:9:154:9 | s | provenance | | | main.rs:154:13:154:21 | source(...) | main.rs:154:9:154:9 | s | provenance | | -| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:27 | -| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:27 | +| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:28 | +| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:28 | | main.rs:155:29:155:29 | s | main.rs:155:28:155:30 | [...] [element] | provenance | | | main.rs:155:29:155:29 | s | main.rs:155:28:155:30 | [...] [element] | provenance | | | main.rs:164:9:164:9 | s | main.rs:165:33:165:33 | s | provenance | | @@ -149,8 +150,8 @@ edges | main.rs:165:9:165:11 | arr [element] | main.rs:166:10:166:12 | arr [element] | provenance | | | main.rs:165:15:165:34 | set_array_element(...) [element] | main.rs:165:9:165:11 | arr [element] | provenance | | | main.rs:165:15:165:34 | set_array_element(...) [element] | main.rs:165:9:165:11 | arr [element] | provenance | | -| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:33 | -| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:33 | +| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:34 | +| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:34 | | main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:21 | | main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:21 | | main.rs:175:9:175:9 | s | main.rs:176:14:176:14 | s | provenance | | @@ -163,8 +164,8 @@ edges | main.rs:176:13:176:18 | TupleExpr [tuple.0] | main.rs:176:9:176:9 | t [tuple.0] | provenance | | | main.rs:176:14:176:14 | s | main.rs:176:13:176:18 | TupleExpr [tuple.0] | provenance | | | main.rs:176:14:176:14 | s | main.rs:176:13:176:18 | TupleExpr [tuple.0] | provenance | | -| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:30 | -| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:30 | +| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:31 | +| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:31 | | main.rs:188:9:188:9 | s | main.rs:189:31:189:31 | s | provenance | | | main.rs:188:9:188:9 | s | main.rs:189:31:189:31 | s | provenance | | | main.rs:188:13:188:22 | source(...) | main.rs:188:9:188:9 | s | provenance | | @@ -173,8 +174,8 @@ edges | main.rs:189:9:189:9 | t [tuple.1] | main.rs:191:10:191:10 | t [tuple.1] | provenance | | | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | main.rs:189:9:189:9 | t [tuple.1] | provenance | | | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | main.rs:189:9:189:9 | t [tuple.1] | provenance | | -| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:35 | -| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:35 | +| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:36 | +| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:36 | | main.rs:191:10:191:10 | t [tuple.1] | main.rs:191:10:191:12 | t.1 | provenance | | | main.rs:191:10:191:10 | t [tuple.1] | main.rs:191:10:191:12 | t.1 | provenance | | | main.rs:203:9:203:9 | s | main.rs:208:11:208:11 | s | provenance | | @@ -225,8 +226,8 @@ edges | main.rs:232:13:232:31 | get_async_number(...) [future] | main.rs:232:13:232:37 | await ... | provenance | | | main.rs:232:13:232:37 | await ... | main.rs:232:9:232:9 | t | provenance | | | main.rs:232:13:232:37 | await ... | main.rs:232:9:232:9 | t | provenance | | -| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:28 | -| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:28 | +| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:29 | +| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:29 | | main.rs:257:9:257:9 | s [D] | main.rs:258:11:258:11 | s [D] | provenance | | | main.rs:257:9:257:9 | s [D] | main.rs:258:11:258:11 | s [D] | provenance | | | main.rs:257:13:257:27 | enum_source(...) | main.rs:257:9:257:9 | s [D] | provenance | Src:MaD:12 | @@ -245,60 +246,60 @@ edges | main.rs:265:11:265:11 | s [E, Some] | main.rs:268:9:268:37 | ...::E {...} [E, Some] | provenance | | | main.rs:268:9:268:37 | ...::E {...} [E, Some] | main.rs:268:35:268:35 | o [Some] | provenance | | | main.rs:268:9:268:37 | ...::E {...} [E, Some] | main.rs:268:35:268:35 | o [Some] | provenance | | -| main.rs:268:35:268:35 | o [Some] | main.rs:270:19:270:19 | o [Some] | provenance | | -| main.rs:268:35:268:35 | o [Some] | main.rs:270:19:270:19 | o [Some] | provenance | | -| main.rs:270:19:270:19 | o [Some] | main.rs:271:17:271:23 | Some(...) [Some] | provenance | | -| main.rs:270:19:270:19 | o [Some] | main.rs:271:17:271:23 | Some(...) [Some] | provenance | | -| main.rs:271:17:271:23 | Some(...) [Some] | main.rs:271:22:271:22 | i | provenance | | -| main.rs:271:17:271:23 | Some(...) [Some] | main.rs:271:22:271:22 | i | provenance | | -| main.rs:271:22:271:22 | i | main.rs:271:33:271:33 | i | provenance | | -| main.rs:271:22:271:22 | i | main.rs:271:33:271:33 | i | provenance | | -| main.rs:280:9:280:9 | s [C] | main.rs:281:11:281:11 | s [C] | provenance | | -| main.rs:280:9:280:9 | s [C] | main.rs:281:11:281:11 | s [C] | provenance | | -| main.rs:280:13:280:24 | e.source(...) | main.rs:280:9:280:9 | s [C] | provenance | Src:MaD:9 | -| main.rs:280:13:280:24 | e.source(...) | main.rs:280:9:280:9 | s [C] | provenance | Src:MaD:9 | -| main.rs:281:11:281:11 | s [C] | main.rs:282:9:282:37 | ...::C {...} [C] | provenance | | -| main.rs:281:11:281:11 | s [C] | main.rs:282:9:282:37 | ...::C {...} [C] | provenance | | -| main.rs:282:9:282:37 | ...::C {...} [C] | main.rs:282:35:282:35 | i | provenance | | -| main.rs:282:9:282:37 | ...::C {...} [C] | main.rs:282:35:282:35 | i | provenance | | -| main.rs:282:35:282:35 | i | main.rs:282:47:282:47 | i | provenance | | -| main.rs:282:35:282:35 | i | main.rs:282:47:282:47 | i | provenance | | -| main.rs:304:24:304:24 | a | main.rs:303:26:303:26 | a | provenance | Src:MaD:17 | -| main.rs:304:24:304:24 | a | main.rs:303:26:303:26 | a | provenance | Src:MaD:17 | -| main.rs:306:24:308:9 | \|...\| ... | main.rs:307:18:307:18 | a | provenance | Src:MaD:17 | -| main.rs:306:24:308:9 | \|...\| ... | main.rs:307:18:307:18 | a | provenance | Src:MaD:17 | -| main.rs:313:24:313:24 | f | main.rs:311:18:311:18 | a | provenance | Src:MaD:17 | -| main.rs:313:24:313:24 | f | main.rs:311:18:311:18 | a | provenance | Src:MaD:17 | -| main.rs:315:24:317:9 | \|...\| ... | main.rs:316:18:316:18 | a | provenance | Src:MaD:17 | -| main.rs:315:24:317:9 | \|...\| ... | main.rs:316:18:316:18 | a | provenance | Src:MaD:17 | -| main.rs:319:31:331:9 | \|...\| ... | main.rs:319:31:331:9 | \|...\| ... [E, Some] | provenance | Src:MaD:18 | -| main.rs:319:31:331:9 | \|...\| ... | main.rs:319:31:331:9 | \|...\| ... [E, Some] | provenance | Src:MaD:18 | -| main.rs:319:31:331:9 | \|...\| ... [E, Some] | main.rs:320:19:320:19 | e [E, Some] | provenance | | -| main.rs:319:31:331:9 | \|...\| ... [E, Some] | main.rs:320:19:320:19 | e [E, Some] | provenance | | -| main.rs:320:19:320:19 | e [E, Some] | main.rs:323:17:323:45 | ...::E {...} [E, Some] | provenance | | -| main.rs:320:19:320:19 | e [E, Some] | main.rs:323:17:323:45 | ...::E {...} [E, Some] | provenance | | -| main.rs:323:17:323:45 | ...::E {...} [E, Some] | main.rs:323:43:323:43 | o [Some] | provenance | | -| main.rs:323:17:323:45 | ...::E {...} [E, Some] | main.rs:323:43:323:43 | o [Some] | provenance | | -| main.rs:323:43:323:43 | o [Some] | main.rs:325:27:325:27 | o [Some] | provenance | | -| main.rs:323:43:323:43 | o [Some] | main.rs:325:27:325:27 | o [Some] | provenance | | -| main.rs:325:27:325:27 | o [Some] | main.rs:326:25:326:31 | Some(...) [Some] | provenance | | -| main.rs:325:27:325:27 | o [Some] | main.rs:326:25:326:31 | Some(...) [Some] | provenance | | -| main.rs:326:25:326:31 | Some(...) [Some] | main.rs:326:30:326:30 | i | provenance | | -| main.rs:326:25:326:31 | Some(...) [Some] | main.rs:326:30:326:30 | i | provenance | | -| main.rs:326:30:326:30 | i | main.rs:326:41:326:41 | i | provenance | | -| main.rs:326:30:326:30 | i | main.rs:326:41:326:41 | i | provenance | | -| main.rs:346:21:346:29 | source(...) | main.rs:347:19:347:19 | a | provenance | Sink:MaD:7 | -| main.rs:346:21:346:29 | source(...) | main.rs:347:19:347:19 | a | provenance | Sink:MaD:7 | -| main.rs:350:17:350:17 | s | main.rs:351:52:351:52 | s | provenance | | -| main.rs:350:17:350:17 | s | main.rs:351:52:351:52 | s | provenance | | -| main.rs:350:21:350:29 | source(...) | main.rs:350:17:350:17 | s | provenance | | -| main.rs:350:21:350:29 | source(...) | main.rs:350:17:350:17 | s | provenance | | -| main.rs:351:13:351:55 | ...::E {...} [E, Some] | main.rs:353:26:353:26 | b [E, Some] | provenance | | -| main.rs:351:13:351:55 | ...::E {...} [E, Some] | main.rs:353:26:353:26 | b [E, Some] | provenance | | -| main.rs:351:39:351:53 | ...::Some(...) [Some] | main.rs:351:13:351:55 | ...::E {...} [E, Some] | provenance | | -| main.rs:351:39:351:53 | ...::Some(...) [Some] | main.rs:351:13:351:55 | ...::E {...} [E, Some] | provenance | | -| main.rs:351:52:351:52 | s | main.rs:351:39:351:53 | ...::Some(...) [Some] | provenance | | -| main.rs:351:52:351:52 | s | main.rs:351:39:351:53 | ...::Some(...) [Some] | provenance | | +| main.rs:268:35:268:35 | o [Some] | main.rs:269:19:269:19 | o [Some] | provenance | | +| main.rs:268:35:268:35 | o [Some] | main.rs:269:19:269:19 | o [Some] | provenance | | +| main.rs:269:19:269:19 | o [Some] | main.rs:270:17:270:23 | Some(...) [Some] | provenance | | +| main.rs:269:19:269:19 | o [Some] | main.rs:270:17:270:23 | Some(...) [Some] | provenance | | +| main.rs:270:17:270:23 | Some(...) [Some] | main.rs:270:22:270:22 | i | provenance | | +| main.rs:270:17:270:23 | Some(...) [Some] | main.rs:270:22:270:22 | i | provenance | | +| main.rs:270:22:270:22 | i | main.rs:270:33:270:33 | i | provenance | | +| main.rs:270:22:270:22 | i | main.rs:270:33:270:33 | i | provenance | | +| main.rs:279:9:279:9 | s [C] | main.rs:280:11:280:11 | s [C] | provenance | | +| main.rs:279:9:279:9 | s [C] | main.rs:280:11:280:11 | s [C] | provenance | | +| main.rs:279:13:279:24 | e.source(...) | main.rs:279:9:279:9 | s [C] | provenance | Src:MaD:9 | +| main.rs:279:13:279:24 | e.source(...) | main.rs:279:9:279:9 | s [C] | provenance | Src:MaD:9 | +| main.rs:280:11:280:11 | s [C] | main.rs:281:9:281:37 | ...::C {...} [C] | provenance | | +| main.rs:280:11:280:11 | s [C] | main.rs:281:9:281:37 | ...::C {...} [C] | provenance | | +| main.rs:281:9:281:37 | ...::C {...} [C] | main.rs:281:35:281:35 | i | provenance | | +| main.rs:281:9:281:37 | ...::C {...} [C] | main.rs:281:35:281:35 | i | provenance | | +| main.rs:281:35:281:35 | i | main.rs:281:47:281:47 | i | provenance | | +| main.rs:281:35:281:35 | i | main.rs:281:47:281:47 | i | provenance | | +| main.rs:303:24:303:24 | a | main.rs:302:26:302:26 | a | provenance | Src:MaD:17 | +| main.rs:303:24:303:24 | a | main.rs:302:26:302:26 | a | provenance | Src:MaD:17 | +| main.rs:305:24:307:9 | \|...\| ... | main.rs:306:18:306:18 | a | provenance | Src:MaD:17 | +| main.rs:305:24:307:9 | \|...\| ... | main.rs:306:18:306:18 | a | provenance | Src:MaD:17 | +| main.rs:312:24:312:24 | f | main.rs:310:18:310:18 | a | provenance | Src:MaD:17 | +| main.rs:312:24:312:24 | f | main.rs:310:18:310:18 | a | provenance | Src:MaD:17 | +| main.rs:314:24:316:9 | \|...\| ... | main.rs:315:18:315:18 | a | provenance | Src:MaD:17 | +| main.rs:314:24:316:9 | \|...\| ... | main.rs:315:18:315:18 | a | provenance | Src:MaD:17 | +| main.rs:318:31:329:9 | \|...\| ... | main.rs:318:31:329:9 | \|...\| ... [E, Some] | provenance | Src:MaD:18 | +| main.rs:318:31:329:9 | \|...\| ... | main.rs:318:31:329:9 | \|...\| ... [E, Some] | provenance | Src:MaD:18 | +| main.rs:318:31:329:9 | \|...\| ... [E, Some] | main.rs:319:19:319:19 | e [E, Some] | provenance | | +| main.rs:318:31:329:9 | \|...\| ... [E, Some] | main.rs:319:19:319:19 | e [E, Some] | provenance | | +| main.rs:319:19:319:19 | e [E, Some] | main.rs:322:17:322:45 | ...::E {...} [E, Some] | provenance | | +| main.rs:319:19:319:19 | e [E, Some] | main.rs:322:17:322:45 | ...::E {...} [E, Some] | provenance | | +| main.rs:322:17:322:45 | ...::E {...} [E, Some] | main.rs:322:43:322:43 | o [Some] | provenance | | +| main.rs:322:17:322:45 | ...::E {...} [E, Some] | main.rs:322:43:322:43 | o [Some] | provenance | | +| main.rs:322:43:322:43 | o [Some] | main.rs:323:27:323:27 | o [Some] | provenance | | +| main.rs:322:43:322:43 | o [Some] | main.rs:323:27:323:27 | o [Some] | provenance | | +| main.rs:323:27:323:27 | o [Some] | main.rs:324:25:324:31 | Some(...) [Some] | provenance | | +| main.rs:323:27:323:27 | o [Some] | main.rs:324:25:324:31 | Some(...) [Some] | provenance | | +| main.rs:324:25:324:31 | Some(...) [Some] | main.rs:324:30:324:30 | i | provenance | | +| main.rs:324:25:324:31 | Some(...) [Some] | main.rs:324:30:324:30 | i | provenance | | +| main.rs:324:30:324:30 | i | main.rs:324:41:324:41 | i | provenance | | +| main.rs:324:30:324:30 | i | main.rs:324:41:324:41 | i | provenance | | +| main.rs:344:21:344:29 | source(...) | main.rs:345:19:345:19 | a | provenance | Sink:MaD:7 | +| main.rs:344:21:344:29 | source(...) | main.rs:345:19:345:19 | a | provenance | Sink:MaD:7 | +| main.rs:348:17:348:17 | s | main.rs:350:39:350:39 | s | provenance | | +| main.rs:348:17:348:17 | s | main.rs:350:39:350:39 | s | provenance | | +| main.rs:348:21:348:29 | source(...) | main.rs:348:17:348:17 | s | provenance | | +| main.rs:348:21:348:29 | source(...) | main.rs:348:17:348:17 | s | provenance | | +| main.rs:349:13:351:13 | ...::E {...} [E, Some] | main.rs:353:26:353:26 | b [E, Some] | provenance | | +| main.rs:349:13:351:13 | ...::E {...} [E, Some] | main.rs:353:26:353:26 | b [E, Some] | provenance | | +| main.rs:350:26:350:40 | ...::Some(...) [Some] | main.rs:349:13:351:13 | ...::E {...} [E, Some] | provenance | | +| main.rs:350:26:350:40 | ...::Some(...) [Some] | main.rs:349:13:351:13 | ...::E {...} [E, Some] | provenance | | +| main.rs:350:39:350:39 | s | main.rs:350:26:350:40 | ...::Some(...) [Some] | provenance | | +| main.rs:350:39:350:39 | s | main.rs:350:26:350:40 | ...::Some(...) [Some] | provenance | | | main.rs:353:26:353:26 | b [E, Some] | main.rs:353:26:353:26 | b | provenance | Sink:MaD:8 | | main.rs:353:26:353:26 | b [E, Some] | main.rs:353:26:353:26 | b | provenance | Sink:MaD:8 | | main.rs:364:9:364:9 | s | main.rs:365:41:365:41 | s | provenance | | @@ -339,46 +340,52 @@ edges | main.rs:400:16:400:16 | i | main.rs:401:10:401:10 | i | provenance | Src:MaD:11 | | main.rs:410:26:410:31 | ...: i64 | main.rs:411:14:411:14 | i | provenance | Src:MaD:10 | | main.rs:410:26:410:31 | ...: i64 | main.rs:411:14:411:14 | i | provenance | Src:MaD:10 | -| main.rs:464:9:464:10 | x1 | main.rs:465:10:465:11 | x1 | provenance | | -| main.rs:464:9:464:10 | x1 | main.rs:465:10:465:11 | x1 | provenance | | -| main.rs:464:14:464:23 | source(...) | main.rs:464:14:464:30 | ... .max(...) | provenance | MaD:19 | -| main.rs:464:14:464:23 | source(...) | main.rs:464:14:464:30 | ... .max(...) | provenance | MaD:19 | -| main.rs:464:14:464:30 | ... .max(...) | main.rs:464:9:464:10 | x1 | provenance | | -| main.rs:464:14:464:30 | ... .max(...) | main.rs:464:9:464:10 | x1 | provenance | | -| main.rs:467:9:467:10 | x2 [MyStruct.field1] | main.rs:475:10:475:11 | x2 [MyStruct.field1] | provenance | | -| main.rs:467:9:467:10 | x2 [MyStruct.field1] | main.rs:475:10:475:11 | x2 [MyStruct.field1] | provenance | | -| main.rs:467:14:474:6 | ... .max(...) [MyStruct.field1] | main.rs:467:9:467:10 | x2 [MyStruct.field1] | provenance | | -| main.rs:467:14:474:6 | ... .max(...) [MyStruct.field1] | main.rs:467:9:467:10 | x2 [MyStruct.field1] | provenance | | -| main.rs:467:15:470:5 | MyStruct {...} [MyStruct.field1] | main.rs:467:14:474:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:19 | -| main.rs:467:15:470:5 | MyStruct {...} [MyStruct.field1] | main.rs:467:14:474:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:19 | -| main.rs:468:17:468:26 | source(...) | main.rs:467:15:470:5 | MyStruct {...} [MyStruct.field1] | provenance | | -| main.rs:468:17:468:26 | source(...) | main.rs:467:15:470:5 | MyStruct {...} [MyStruct.field1] | provenance | | -| main.rs:475:10:475:11 | x2 [MyStruct.field1] | main.rs:475:10:475:18 | x2.field1 | provenance | | -| main.rs:475:10:475:11 | x2 [MyStruct.field1] | main.rs:475:10:475:18 | x2.field1 | provenance | | -| main.rs:480:9:480:10 | x4 | main.rs:481:10:481:11 | x4 | provenance | | -| main.rs:480:9:480:10 | x4 | main.rs:481:10:481:11 | x4 | provenance | | -| main.rs:480:14:480:23 | source(...) | main.rs:480:14:480:30 | ... .max(...) | provenance | MaD:19 | -| main.rs:480:14:480:23 | source(...) | main.rs:480:14:480:30 | ... .max(...) | provenance | MaD:19 | -| main.rs:480:14:480:30 | ... .max(...) | main.rs:480:9:480:10 | x4 | provenance | | -| main.rs:480:14:480:30 | ... .max(...) | main.rs:480:9:480:10 | x4 | provenance | | -| main.rs:483:9:483:10 | x5 | main.rs:484:10:484:11 | x5 | provenance | | -| main.rs:483:14:483:23 | source(...) | main.rs:483:14:483:30 | ... .lt(...) | provenance | MaD:20 | -| main.rs:483:14:483:30 | ... .lt(...) | main.rs:483:9:483:10 | x5 | provenance | | -| main.rs:486:9:486:10 | x6 | main.rs:487:10:487:11 | x6 | provenance | | -| main.rs:486:14:486:23 | source(...) | main.rs:486:14:486:27 | ... < ... | provenance | MaD:20 | -| main.rs:486:14:486:27 | ... < ... | main.rs:486:9:486:10 | x6 | provenance | | -| main.rs:502:10:502:28 | generated_source(...) | main.rs:502:10:502:28 | generated_source(...) | provenance | Src:MaD:14 | -| main.rs:502:10:502:28 | generated_source(...) | main.rs:502:10:502:28 | generated_source(...) | provenance | Src:MaD:14 | -| main.rs:504:10:504:33 | neutral_manual_source(...) | main.rs:504:10:504:33 | neutral_manual_source(...) | provenance | Src:MaD:15 | -| main.rs:504:10:504:33 | neutral_manual_source(...) | main.rs:504:10:504:33 | neutral_manual_source(...) | provenance | Src:MaD:15 | -| main.rs:505:20:505:28 | source(...) | main.rs:505:20:505:28 | source(...) | provenance | Sink:MaD:4 | -| main.rs:505:20:505:28 | source(...) | main.rs:505:20:505:28 | source(...) | provenance | Sink:MaD:4 | -| main.rs:507:25:507:33 | source(...) | main.rs:507:25:507:33 | source(...) | provenance | Sink:MaD:5 | -| main.rs:507:25:507:33 | source(...) | main.rs:507:25:507:33 | source(...) | provenance | Sink:MaD:5 | -| main.rs:508:28:508:36 | source(...) | main.rs:508:10:508:37 | generated_summary(...) | provenance | MaD:25 | -| main.rs:508:28:508:36 | source(...) | main.rs:508:10:508:37 | generated_summary(...) | provenance | MaD:25 | -| main.rs:510:33:510:41 | source(...) | main.rs:510:10:510:42 | neutral_manual_summary(...) | provenance | MaD:26 | -| main.rs:510:33:510:41 | source(...) | main.rs:510:10:510:42 | neutral_manual_summary(...) | provenance | MaD:26 | +| main.rs:475:9:475:10 | x1 | main.rs:476:10:476:11 | x1 | provenance | | +| main.rs:475:9:475:10 | x1 | main.rs:476:10:476:11 | x1 | provenance | | +| main.rs:475:14:475:23 | source(...) | main.rs:475:14:475:30 | ... .max(...) | provenance | MaD:19 | +| main.rs:475:14:475:23 | source(...) | main.rs:475:14:475:30 | ... .max(...) | provenance | MaD:19 | +| main.rs:475:14:475:30 | ... .max(...) | main.rs:475:9:475:10 | x1 | provenance | | +| main.rs:475:14:475:30 | ... .max(...) | main.rs:475:9:475:10 | x1 | provenance | | +| main.rs:478:9:478:10 | x2 [MyStruct.field1] | main.rs:486:10:486:11 | x2 [MyStruct.field1] | provenance | | +| main.rs:478:9:478:10 | x2 [MyStruct.field1] | main.rs:486:10:486:11 | x2 [MyStruct.field1] | provenance | | +| main.rs:478:14:485:6 | ... .max(...) [MyStruct.field1] | main.rs:478:9:478:10 | x2 [MyStruct.field1] | provenance | | +| main.rs:478:14:485:6 | ... .max(...) [MyStruct.field1] | main.rs:478:9:478:10 | x2 [MyStruct.field1] | provenance | | +| main.rs:478:15:481:5 | MyStruct {...} [MyStruct.field1] | main.rs:478:14:485:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:19 | +| main.rs:478:15:481:5 | MyStruct {...} [MyStruct.field1] | main.rs:478:14:485:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:19 | +| main.rs:479:17:479:26 | source(...) | main.rs:478:15:481:5 | MyStruct {...} [MyStruct.field1] | provenance | | +| main.rs:479:17:479:26 | source(...) | main.rs:478:15:481:5 | MyStruct {...} [MyStruct.field1] | provenance | | +| main.rs:486:10:486:11 | x2 [MyStruct.field1] | main.rs:486:10:486:18 | x2.field1 | provenance | | +| main.rs:486:10:486:11 | x2 [MyStruct.field1] | main.rs:486:10:486:18 | x2.field1 | provenance | | +| main.rs:491:9:491:10 | x4 | main.rs:492:10:492:11 | x4 | provenance | | +| main.rs:491:9:491:10 | x4 | main.rs:492:10:492:11 | x4 | provenance | | +| main.rs:491:14:491:23 | source(...) | main.rs:491:14:491:30 | ... .max(...) | provenance | MaD:19 | +| main.rs:491:14:491:23 | source(...) | main.rs:491:14:491:30 | ... .max(...) | provenance | MaD:19 | +| main.rs:491:14:491:30 | ... .max(...) | main.rs:491:9:491:10 | x4 | provenance | | +| main.rs:491:14:491:30 | ... .max(...) | main.rs:491:9:491:10 | x4 | provenance | | +| main.rs:494:9:494:10 | x5 | main.rs:495:10:495:11 | x5 | provenance | | +| main.rs:494:14:494:23 | source(...) | main.rs:494:14:494:30 | ... .lt(...) | provenance | MaD:20 | +| main.rs:494:14:494:30 | ... .lt(...) | main.rs:494:9:494:10 | x5 | provenance | | +| main.rs:497:9:497:10 | x6 | main.rs:498:10:498:11 | x6 | provenance | | +| main.rs:497:14:497:23 | source(...) | main.rs:497:14:497:27 | ... < ... | provenance | MaD:20 | +| main.rs:497:14:497:27 | ... < ... | main.rs:497:9:497:10 | x6 | provenance | | +| main.rs:503:9:503:10 | x8 | main.rs:504:10:504:11 | x8 | provenance | | +| main.rs:503:9:503:10 | x8 | main.rs:504:10:504:11 | x8 | provenance | | +| main.rs:503:14:503:44 | ...::flow_through2(...) | main.rs:503:9:503:10 | x8 | provenance | | +| main.rs:503:14:503:44 | ...::flow_through2(...) | main.rs:503:9:503:10 | x8 | provenance | | +| main.rs:503:34:503:43 | source(...) | main.rs:503:14:503:44 | ...::flow_through2(...) | provenance | MaD:25 | +| main.rs:503:34:503:43 | source(...) | main.rs:503:14:503:44 | ...::flow_through2(...) | provenance | MaD:25 | +| main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | provenance | Src:MaD:14 | +| main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | provenance | Src:MaD:14 | +| main.rs:521:10:521:33 | neutral_manual_source(...) | main.rs:521:10:521:33 | neutral_manual_source(...) | provenance | Src:MaD:15 | +| main.rs:521:10:521:33 | neutral_manual_source(...) | main.rs:521:10:521:33 | neutral_manual_source(...) | provenance | Src:MaD:15 | +| main.rs:522:20:522:28 | source(...) | main.rs:522:20:522:28 | source(...) | provenance | Sink:MaD:4 | +| main.rs:522:20:522:28 | source(...) | main.rs:522:20:522:28 | source(...) | provenance | Sink:MaD:4 | +| main.rs:524:25:524:33 | source(...) | main.rs:524:25:524:33 | source(...) | provenance | Sink:MaD:5 | +| main.rs:524:25:524:33 | source(...) | main.rs:524:25:524:33 | source(...) | provenance | Sink:MaD:5 | +| main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | provenance | MaD:26 | +| main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | provenance | MaD:26 | +| main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | provenance | MaD:27 | +| main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | provenance | MaD:27 | nodes | main.rs:15:9:15:9 | s | semmle.label | s | | main.rs:15:9:15:9 | s | semmle.label | s | @@ -620,74 +627,74 @@ nodes | main.rs:268:9:268:37 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | | main.rs:268:35:268:35 | o [Some] | semmle.label | o [Some] | | main.rs:268:35:268:35 | o [Some] | semmle.label | o [Some] | -| main.rs:270:19:270:19 | o [Some] | semmle.label | o [Some] | -| main.rs:270:19:270:19 | o [Some] | semmle.label | o [Some] | -| main.rs:271:17:271:23 | Some(...) [Some] | semmle.label | Some(...) [Some] | -| main.rs:271:17:271:23 | Some(...) [Some] | semmle.label | Some(...) [Some] | -| main.rs:271:22:271:22 | i | semmle.label | i | -| main.rs:271:22:271:22 | i | semmle.label | i | -| main.rs:271:33:271:33 | i | semmle.label | i | -| main.rs:271:33:271:33 | i | semmle.label | i | -| main.rs:280:9:280:9 | s [C] | semmle.label | s [C] | -| main.rs:280:9:280:9 | s [C] | semmle.label | s [C] | -| main.rs:280:13:280:24 | e.source(...) | semmle.label | e.source(...) | -| main.rs:280:13:280:24 | e.source(...) | semmle.label | e.source(...) | -| main.rs:281:11:281:11 | s [C] | semmle.label | s [C] | -| main.rs:281:11:281:11 | s [C] | semmle.label | s [C] | -| main.rs:282:9:282:37 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | -| main.rs:282:9:282:37 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | -| main.rs:282:35:282:35 | i | semmle.label | i | -| main.rs:282:35:282:35 | i | semmle.label | i | -| main.rs:282:47:282:47 | i | semmle.label | i | -| main.rs:282:47:282:47 | i | semmle.label | i | -| main.rs:303:26:303:26 | a | semmle.label | a | -| main.rs:303:26:303:26 | a | semmle.label | a | -| main.rs:304:24:304:24 | a | semmle.label | a | -| main.rs:304:24:304:24 | a | semmle.label | a | -| main.rs:306:24:308:9 | \|...\| ... | semmle.label | \|...\| ... | -| main.rs:306:24:308:9 | \|...\| ... | semmle.label | \|...\| ... | -| main.rs:307:18:307:18 | a | semmle.label | a | -| main.rs:307:18:307:18 | a | semmle.label | a | -| main.rs:311:18:311:18 | a | semmle.label | a | -| main.rs:311:18:311:18 | a | semmle.label | a | -| main.rs:313:24:313:24 | f | semmle.label | f | -| main.rs:313:24:313:24 | f | semmle.label | f | -| main.rs:315:24:317:9 | \|...\| ... | semmle.label | \|...\| ... | -| main.rs:315:24:317:9 | \|...\| ... | semmle.label | \|...\| ... | -| main.rs:316:18:316:18 | a | semmle.label | a | -| main.rs:316:18:316:18 | a | semmle.label | a | -| main.rs:319:31:331:9 | \|...\| ... | semmle.label | \|...\| ... | -| main.rs:319:31:331:9 | \|...\| ... | semmle.label | \|...\| ... | -| main.rs:319:31:331:9 | \|...\| ... [E, Some] | semmle.label | \|...\| ... [E, Some] | -| main.rs:319:31:331:9 | \|...\| ... [E, Some] | semmle.label | \|...\| ... [E, Some] | -| main.rs:320:19:320:19 | e [E, Some] | semmle.label | e [E, Some] | -| main.rs:320:19:320:19 | e [E, Some] | semmle.label | e [E, Some] | -| main.rs:323:17:323:45 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | -| main.rs:323:17:323:45 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | -| main.rs:323:43:323:43 | o [Some] | semmle.label | o [Some] | -| main.rs:323:43:323:43 | o [Some] | semmle.label | o [Some] | -| main.rs:325:27:325:27 | o [Some] | semmle.label | o [Some] | -| main.rs:325:27:325:27 | o [Some] | semmle.label | o [Some] | -| main.rs:326:25:326:31 | Some(...) [Some] | semmle.label | Some(...) [Some] | -| main.rs:326:25:326:31 | Some(...) [Some] | semmle.label | Some(...) [Some] | -| main.rs:326:30:326:30 | i | semmle.label | i | -| main.rs:326:30:326:30 | i | semmle.label | i | -| main.rs:326:41:326:41 | i | semmle.label | i | -| main.rs:326:41:326:41 | i | semmle.label | i | -| main.rs:346:21:346:29 | source(...) | semmle.label | source(...) | -| main.rs:346:21:346:29 | source(...) | semmle.label | source(...) | -| main.rs:347:19:347:19 | a | semmle.label | a | -| main.rs:347:19:347:19 | a | semmle.label | a | -| main.rs:350:17:350:17 | s | semmle.label | s | -| main.rs:350:17:350:17 | s | semmle.label | s | -| main.rs:350:21:350:29 | source(...) | semmle.label | source(...) | -| main.rs:350:21:350:29 | source(...) | semmle.label | source(...) | -| main.rs:351:13:351:55 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | -| main.rs:351:13:351:55 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | -| main.rs:351:39:351:53 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | -| main.rs:351:39:351:53 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | -| main.rs:351:52:351:52 | s | semmle.label | s | -| main.rs:351:52:351:52 | s | semmle.label | s | +| main.rs:269:19:269:19 | o [Some] | semmle.label | o [Some] | +| main.rs:269:19:269:19 | o [Some] | semmle.label | o [Some] | +| main.rs:270:17:270:23 | Some(...) [Some] | semmle.label | Some(...) [Some] | +| main.rs:270:17:270:23 | Some(...) [Some] | semmle.label | Some(...) [Some] | +| main.rs:270:22:270:22 | i | semmle.label | i | +| main.rs:270:22:270:22 | i | semmle.label | i | +| main.rs:270:33:270:33 | i | semmle.label | i | +| main.rs:270:33:270:33 | i | semmle.label | i | +| main.rs:279:9:279:9 | s [C] | semmle.label | s [C] | +| main.rs:279:9:279:9 | s [C] | semmle.label | s [C] | +| main.rs:279:13:279:24 | e.source(...) | semmle.label | e.source(...) | +| main.rs:279:13:279:24 | e.source(...) | semmle.label | e.source(...) | +| main.rs:280:11:280:11 | s [C] | semmle.label | s [C] | +| main.rs:280:11:280:11 | s [C] | semmle.label | s [C] | +| main.rs:281:9:281:37 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | +| main.rs:281:9:281:37 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | +| main.rs:281:35:281:35 | i | semmle.label | i | +| main.rs:281:35:281:35 | i | semmle.label | i | +| main.rs:281:47:281:47 | i | semmle.label | i | +| main.rs:281:47:281:47 | i | semmle.label | i | +| main.rs:302:26:302:26 | a | semmle.label | a | +| main.rs:302:26:302:26 | a | semmle.label | a | +| main.rs:303:24:303:24 | a | semmle.label | a | +| main.rs:303:24:303:24 | a | semmle.label | a | +| main.rs:305:24:307:9 | \|...\| ... | semmle.label | \|...\| ... | +| main.rs:305:24:307:9 | \|...\| ... | semmle.label | \|...\| ... | +| main.rs:306:18:306:18 | a | semmle.label | a | +| main.rs:306:18:306:18 | a | semmle.label | a | +| main.rs:310:18:310:18 | a | semmle.label | a | +| main.rs:310:18:310:18 | a | semmle.label | a | +| main.rs:312:24:312:24 | f | semmle.label | f | +| main.rs:312:24:312:24 | f | semmle.label | f | +| main.rs:314:24:316:9 | \|...\| ... | semmle.label | \|...\| ... | +| main.rs:314:24:316:9 | \|...\| ... | semmle.label | \|...\| ... | +| main.rs:315:18:315:18 | a | semmle.label | a | +| main.rs:315:18:315:18 | a | semmle.label | a | +| main.rs:318:31:329:9 | \|...\| ... | semmle.label | \|...\| ... | +| main.rs:318:31:329:9 | \|...\| ... | semmle.label | \|...\| ... | +| main.rs:318:31:329:9 | \|...\| ... [E, Some] | semmle.label | \|...\| ... [E, Some] | +| main.rs:318:31:329:9 | \|...\| ... [E, Some] | semmle.label | \|...\| ... [E, Some] | +| main.rs:319:19:319:19 | e [E, Some] | semmle.label | e [E, Some] | +| main.rs:319:19:319:19 | e [E, Some] | semmle.label | e [E, Some] | +| main.rs:322:17:322:45 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | +| main.rs:322:17:322:45 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | +| main.rs:322:43:322:43 | o [Some] | semmle.label | o [Some] | +| main.rs:322:43:322:43 | o [Some] | semmle.label | o [Some] | +| main.rs:323:27:323:27 | o [Some] | semmle.label | o [Some] | +| main.rs:323:27:323:27 | o [Some] | semmle.label | o [Some] | +| main.rs:324:25:324:31 | Some(...) [Some] | semmle.label | Some(...) [Some] | +| main.rs:324:25:324:31 | Some(...) [Some] | semmle.label | Some(...) [Some] | +| main.rs:324:30:324:30 | i | semmle.label | i | +| main.rs:324:30:324:30 | i | semmle.label | i | +| main.rs:324:41:324:41 | i | semmle.label | i | +| main.rs:324:41:324:41 | i | semmle.label | i | +| main.rs:344:21:344:29 | source(...) | semmle.label | source(...) | +| main.rs:344:21:344:29 | source(...) | semmle.label | source(...) | +| main.rs:345:19:345:19 | a | semmle.label | a | +| main.rs:345:19:345:19 | a | semmle.label | a | +| main.rs:348:17:348:17 | s | semmle.label | s | +| main.rs:348:17:348:17 | s | semmle.label | s | +| main.rs:348:21:348:29 | source(...) | semmle.label | source(...) | +| main.rs:348:21:348:29 | source(...) | semmle.label | source(...) | +| main.rs:349:13:351:13 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | +| main.rs:349:13:351:13 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | +| main.rs:350:26:350:40 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | +| main.rs:350:26:350:40 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | +| main.rs:350:39:350:39 | s | semmle.label | s | +| main.rs:350:39:350:39 | s | semmle.label | s | | main.rs:353:26:353:26 | b | semmle.label | b | | main.rs:353:26:353:26 | b | semmle.label | b | | main.rs:353:26:353:26 | b [E, Some] | semmle.label | b [E, Some] | @@ -742,66 +749,74 @@ nodes | main.rs:410:26:410:31 | ...: i64 | semmle.label | ...: i64 | | main.rs:411:14:411:14 | i | semmle.label | i | | main.rs:411:14:411:14 | i | semmle.label | i | -| main.rs:464:9:464:10 | x1 | semmle.label | x1 | -| main.rs:464:9:464:10 | x1 | semmle.label | x1 | -| main.rs:464:14:464:23 | source(...) | semmle.label | source(...) | -| main.rs:464:14:464:23 | source(...) | semmle.label | source(...) | -| main.rs:464:14:464:30 | ... .max(...) | semmle.label | ... .max(...) | -| main.rs:464:14:464:30 | ... .max(...) | semmle.label | ... .max(...) | -| main.rs:465:10:465:11 | x1 | semmle.label | x1 | -| main.rs:465:10:465:11 | x1 | semmle.label | x1 | -| main.rs:467:9:467:10 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | -| main.rs:467:9:467:10 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | -| main.rs:467:14:474:6 | ... .max(...) [MyStruct.field1] | semmle.label | ... .max(...) [MyStruct.field1] | -| main.rs:467:14:474:6 | ... .max(...) [MyStruct.field1] | semmle.label | ... .max(...) [MyStruct.field1] | -| main.rs:467:15:470:5 | MyStruct {...} [MyStruct.field1] | semmle.label | MyStruct {...} [MyStruct.field1] | -| main.rs:467:15:470:5 | MyStruct {...} [MyStruct.field1] | semmle.label | MyStruct {...} [MyStruct.field1] | -| main.rs:468:17:468:26 | source(...) | semmle.label | source(...) | -| main.rs:468:17:468:26 | source(...) | semmle.label | source(...) | -| main.rs:475:10:475:11 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | -| main.rs:475:10:475:11 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | -| main.rs:475:10:475:18 | x2.field1 | semmle.label | x2.field1 | -| main.rs:475:10:475:18 | x2.field1 | semmle.label | x2.field1 | -| main.rs:480:9:480:10 | x4 | semmle.label | x4 | -| main.rs:480:9:480:10 | x4 | semmle.label | x4 | -| main.rs:480:14:480:23 | source(...) | semmle.label | source(...) | -| main.rs:480:14:480:23 | source(...) | semmle.label | source(...) | -| main.rs:480:14:480:30 | ... .max(...) | semmle.label | ... .max(...) | -| main.rs:480:14:480:30 | ... .max(...) | semmle.label | ... .max(...) | -| main.rs:481:10:481:11 | x4 | semmle.label | x4 | -| main.rs:481:10:481:11 | x4 | semmle.label | x4 | -| main.rs:483:9:483:10 | x5 | semmle.label | x5 | -| main.rs:483:14:483:23 | source(...) | semmle.label | source(...) | -| main.rs:483:14:483:30 | ... .lt(...) | semmle.label | ... .lt(...) | -| main.rs:484:10:484:11 | x5 | semmle.label | x5 | -| main.rs:486:9:486:10 | x6 | semmle.label | x6 | -| main.rs:486:14:486:23 | source(...) | semmle.label | source(...) | -| main.rs:486:14:486:27 | ... < ... | semmle.label | ... < ... | -| main.rs:487:10:487:11 | x6 | semmle.label | x6 | -| main.rs:502:10:502:28 | generated_source(...) | semmle.label | generated_source(...) | -| main.rs:502:10:502:28 | generated_source(...) | semmle.label | generated_source(...) | -| main.rs:502:10:502:28 | generated_source(...) | semmle.label | generated_source(...) | -| main.rs:502:10:502:28 | generated_source(...) | semmle.label | generated_source(...) | -| main.rs:504:10:504:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | -| main.rs:504:10:504:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | -| main.rs:504:10:504:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | -| main.rs:504:10:504:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | -| main.rs:505:20:505:28 | source(...) | semmle.label | source(...) | -| main.rs:505:20:505:28 | source(...) | semmle.label | source(...) | -| main.rs:505:20:505:28 | source(...) | semmle.label | source(...) | -| main.rs:505:20:505:28 | source(...) | semmle.label | source(...) | -| main.rs:507:25:507:33 | source(...) | semmle.label | source(...) | -| main.rs:507:25:507:33 | source(...) | semmle.label | source(...) | -| main.rs:507:25:507:33 | source(...) | semmle.label | source(...) | -| main.rs:507:25:507:33 | source(...) | semmle.label | source(...) | -| main.rs:508:10:508:37 | generated_summary(...) | semmle.label | generated_summary(...) | -| main.rs:508:10:508:37 | generated_summary(...) | semmle.label | generated_summary(...) | -| main.rs:508:28:508:36 | source(...) | semmle.label | source(...) | -| main.rs:508:28:508:36 | source(...) | semmle.label | source(...) | -| main.rs:510:10:510:42 | neutral_manual_summary(...) | semmle.label | neutral_manual_summary(...) | -| main.rs:510:10:510:42 | neutral_manual_summary(...) | semmle.label | neutral_manual_summary(...) | -| main.rs:510:33:510:41 | source(...) | semmle.label | source(...) | -| main.rs:510:33:510:41 | source(...) | semmle.label | source(...) | +| main.rs:475:9:475:10 | x1 | semmle.label | x1 | +| main.rs:475:9:475:10 | x1 | semmle.label | x1 | +| main.rs:475:14:475:23 | source(...) | semmle.label | source(...) | +| main.rs:475:14:475:23 | source(...) | semmle.label | source(...) | +| main.rs:475:14:475:30 | ... .max(...) | semmle.label | ... .max(...) | +| main.rs:475:14:475:30 | ... .max(...) | semmle.label | ... .max(...) | +| main.rs:476:10:476:11 | x1 | semmle.label | x1 | +| main.rs:476:10:476:11 | x1 | semmle.label | x1 | +| main.rs:478:9:478:10 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | +| main.rs:478:9:478:10 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | +| main.rs:478:14:485:6 | ... .max(...) [MyStruct.field1] | semmle.label | ... .max(...) [MyStruct.field1] | +| main.rs:478:14:485:6 | ... .max(...) [MyStruct.field1] | semmle.label | ... .max(...) [MyStruct.field1] | +| main.rs:478:15:481:5 | MyStruct {...} [MyStruct.field1] | semmle.label | MyStruct {...} [MyStruct.field1] | +| main.rs:478:15:481:5 | MyStruct {...} [MyStruct.field1] | semmle.label | MyStruct {...} [MyStruct.field1] | +| main.rs:479:17:479:26 | source(...) | semmle.label | source(...) | +| main.rs:479:17:479:26 | source(...) | semmle.label | source(...) | +| main.rs:486:10:486:11 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | +| main.rs:486:10:486:11 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | +| main.rs:486:10:486:18 | x2.field1 | semmle.label | x2.field1 | +| main.rs:486:10:486:18 | x2.field1 | semmle.label | x2.field1 | +| main.rs:491:9:491:10 | x4 | semmle.label | x4 | +| main.rs:491:9:491:10 | x4 | semmle.label | x4 | +| main.rs:491:14:491:23 | source(...) | semmle.label | source(...) | +| main.rs:491:14:491:23 | source(...) | semmle.label | source(...) | +| main.rs:491:14:491:30 | ... .max(...) | semmle.label | ... .max(...) | +| main.rs:491:14:491:30 | ... .max(...) | semmle.label | ... .max(...) | +| main.rs:492:10:492:11 | x4 | semmle.label | x4 | +| main.rs:492:10:492:11 | x4 | semmle.label | x4 | +| main.rs:494:9:494:10 | x5 | semmle.label | x5 | +| main.rs:494:14:494:23 | source(...) | semmle.label | source(...) | +| main.rs:494:14:494:30 | ... .lt(...) | semmle.label | ... .lt(...) | +| main.rs:495:10:495:11 | x5 | semmle.label | x5 | +| main.rs:497:9:497:10 | x6 | semmle.label | x6 | +| main.rs:497:14:497:23 | source(...) | semmle.label | source(...) | +| main.rs:497:14:497:27 | ... < ... | semmle.label | ... < ... | +| main.rs:498:10:498:11 | x6 | semmle.label | x6 | +| main.rs:503:9:503:10 | x8 | semmle.label | x8 | +| main.rs:503:9:503:10 | x8 | semmle.label | x8 | +| main.rs:503:14:503:44 | ...::flow_through2(...) | semmle.label | ...::flow_through2(...) | +| main.rs:503:14:503:44 | ...::flow_through2(...) | semmle.label | ...::flow_through2(...) | +| main.rs:503:34:503:43 | source(...) | semmle.label | source(...) | +| main.rs:503:34:503:43 | source(...) | semmle.label | source(...) | +| main.rs:504:10:504:11 | x8 | semmle.label | x8 | +| main.rs:504:10:504:11 | x8 | semmle.label | x8 | +| main.rs:519:10:519:28 | generated_source(...) | semmle.label | generated_source(...) | +| main.rs:519:10:519:28 | generated_source(...) | semmle.label | generated_source(...) | +| main.rs:519:10:519:28 | generated_source(...) | semmle.label | generated_source(...) | +| main.rs:519:10:519:28 | generated_source(...) | semmle.label | generated_source(...) | +| main.rs:521:10:521:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | +| main.rs:521:10:521:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | +| main.rs:521:10:521:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | +| main.rs:521:10:521:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | +| main.rs:522:20:522:28 | source(...) | semmle.label | source(...) | +| main.rs:522:20:522:28 | source(...) | semmle.label | source(...) | +| main.rs:522:20:522:28 | source(...) | semmle.label | source(...) | +| main.rs:522:20:522:28 | source(...) | semmle.label | source(...) | +| main.rs:524:25:524:33 | source(...) | semmle.label | source(...) | +| main.rs:524:25:524:33 | source(...) | semmle.label | source(...) | +| main.rs:524:25:524:33 | source(...) | semmle.label | source(...) | +| main.rs:524:25:524:33 | source(...) | semmle.label | source(...) | +| main.rs:525:10:525:37 | generated_summary(...) | semmle.label | generated_summary(...) | +| main.rs:525:10:525:37 | generated_summary(...) | semmle.label | generated_summary(...) | +| main.rs:525:28:525:36 | source(...) | semmle.label | source(...) | +| main.rs:525:28:525:36 | source(...) | semmle.label | source(...) | +| main.rs:527:10:527:42 | neutral_manual_summary(...) | semmle.label | neutral_manual_summary(...) | +| main.rs:527:10:527:42 | neutral_manual_summary(...) | semmle.label | neutral_manual_summary(...) | +| main.rs:527:33:527:41 | source(...) | semmle.label | source(...) | +| main.rs:527:33:527:41 | source(...) | semmle.label | source(...) | subpaths | main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | main.rs:213:17:213:42 | if ... {...} else {...} | main.rs:214:13:214:24 | apply(...) | | main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | main.rs:213:17:213:42 | if ... {...} else {...} | main.rs:214:13:214:24 | apply(...) | @@ -845,24 +860,24 @@ invalidSpecComponent | main.rs:233:10:233:10 | t | main.rs:231:13:231:22 | source(...) | main.rs:233:10:233:10 | t | $@ | main.rs:231:13:231:22 | source(...) | source(...) | | main.rs:260:47:260:47 | i | main.rs:257:13:257:27 | enum_source(...) | main.rs:260:47:260:47 | i | $@ | main.rs:257:13:257:27 | enum_source(...) | enum_source(...) | | main.rs:260:47:260:47 | i | main.rs:257:13:257:27 | enum_source(...) | main.rs:260:47:260:47 | i | $@ | main.rs:257:13:257:27 | enum_source(...) | enum_source(...) | -| main.rs:271:33:271:33 | i | main.rs:264:13:264:34 | enum_source_nested(...) | main.rs:271:33:271:33 | i | $@ | main.rs:264:13:264:34 | enum_source_nested(...) | enum_source_nested(...) | -| main.rs:271:33:271:33 | i | main.rs:264:13:264:34 | enum_source_nested(...) | main.rs:271:33:271:33 | i | $@ | main.rs:264:13:264:34 | enum_source_nested(...) | enum_source_nested(...) | -| main.rs:282:47:282:47 | i | main.rs:280:13:280:24 | e.source(...) | main.rs:282:47:282:47 | i | $@ | main.rs:280:13:280:24 | e.source(...) | e.source(...) | -| main.rs:282:47:282:47 | i | main.rs:280:13:280:24 | e.source(...) | main.rs:282:47:282:47 | i | $@ | main.rs:280:13:280:24 | e.source(...) | e.source(...) | -| main.rs:303:26:303:26 | a | main.rs:304:24:304:24 | a | main.rs:303:26:303:26 | a | $@ | main.rs:304:24:304:24 | a | a | -| main.rs:303:26:303:26 | a | main.rs:304:24:304:24 | a | main.rs:303:26:303:26 | a | $@ | main.rs:304:24:304:24 | a | a | -| main.rs:307:18:307:18 | a | main.rs:306:24:308:9 | \|...\| ... | main.rs:307:18:307:18 | a | $@ | main.rs:306:24:308:9 | \|...\| ... | \|...\| ... | -| main.rs:307:18:307:18 | a | main.rs:306:24:308:9 | \|...\| ... | main.rs:307:18:307:18 | a | $@ | main.rs:306:24:308:9 | \|...\| ... | \|...\| ... | -| main.rs:311:18:311:18 | a | main.rs:313:24:313:24 | f | main.rs:311:18:311:18 | a | $@ | main.rs:313:24:313:24 | f | f | -| main.rs:311:18:311:18 | a | main.rs:313:24:313:24 | f | main.rs:311:18:311:18 | a | $@ | main.rs:313:24:313:24 | f | f | -| main.rs:316:18:316:18 | a | main.rs:315:24:317:9 | \|...\| ... | main.rs:316:18:316:18 | a | $@ | main.rs:315:24:317:9 | \|...\| ... | \|...\| ... | -| main.rs:316:18:316:18 | a | main.rs:315:24:317:9 | \|...\| ... | main.rs:316:18:316:18 | a | $@ | main.rs:315:24:317:9 | \|...\| ... | \|...\| ... | -| main.rs:326:41:326:41 | i | main.rs:319:31:331:9 | \|...\| ... | main.rs:326:41:326:41 | i | $@ | main.rs:319:31:331:9 | \|...\| ... | \|...\| ... | -| main.rs:326:41:326:41 | i | main.rs:319:31:331:9 | \|...\| ... | main.rs:326:41:326:41 | i | $@ | main.rs:319:31:331:9 | \|...\| ... | \|...\| ... | -| main.rs:347:19:347:19 | a | main.rs:346:21:346:29 | source(...) | main.rs:347:19:347:19 | a | $@ | main.rs:346:21:346:29 | source(...) | source(...) | -| main.rs:347:19:347:19 | a | main.rs:346:21:346:29 | source(...) | main.rs:347:19:347:19 | a | $@ | main.rs:346:21:346:29 | source(...) | source(...) | -| main.rs:353:26:353:26 | b | main.rs:350:21:350:29 | source(...) | main.rs:353:26:353:26 | b | $@ | main.rs:350:21:350:29 | source(...) | source(...) | -| main.rs:353:26:353:26 | b | main.rs:350:21:350:29 | source(...) | main.rs:353:26:353:26 | b | $@ | main.rs:350:21:350:29 | source(...) | source(...) | +| main.rs:270:33:270:33 | i | main.rs:264:13:264:34 | enum_source_nested(...) | main.rs:270:33:270:33 | i | $@ | main.rs:264:13:264:34 | enum_source_nested(...) | enum_source_nested(...) | +| main.rs:270:33:270:33 | i | main.rs:264:13:264:34 | enum_source_nested(...) | main.rs:270:33:270:33 | i | $@ | main.rs:264:13:264:34 | enum_source_nested(...) | enum_source_nested(...) | +| main.rs:281:47:281:47 | i | main.rs:279:13:279:24 | e.source(...) | main.rs:281:47:281:47 | i | $@ | main.rs:279:13:279:24 | e.source(...) | e.source(...) | +| main.rs:281:47:281:47 | i | main.rs:279:13:279:24 | e.source(...) | main.rs:281:47:281:47 | i | $@ | main.rs:279:13:279:24 | e.source(...) | e.source(...) | +| main.rs:302:26:302:26 | a | main.rs:303:24:303:24 | a | main.rs:302:26:302:26 | a | $@ | main.rs:303:24:303:24 | a | a | +| main.rs:302:26:302:26 | a | main.rs:303:24:303:24 | a | main.rs:302:26:302:26 | a | $@ | main.rs:303:24:303:24 | a | a | +| main.rs:306:18:306:18 | a | main.rs:305:24:307:9 | \|...\| ... | main.rs:306:18:306:18 | a | $@ | main.rs:305:24:307:9 | \|...\| ... | \|...\| ... | +| main.rs:306:18:306:18 | a | main.rs:305:24:307:9 | \|...\| ... | main.rs:306:18:306:18 | a | $@ | main.rs:305:24:307:9 | \|...\| ... | \|...\| ... | +| main.rs:310:18:310:18 | a | main.rs:312:24:312:24 | f | main.rs:310:18:310:18 | a | $@ | main.rs:312:24:312:24 | f | f | +| main.rs:310:18:310:18 | a | main.rs:312:24:312:24 | f | main.rs:310:18:310:18 | a | $@ | main.rs:312:24:312:24 | f | f | +| main.rs:315:18:315:18 | a | main.rs:314:24:316:9 | \|...\| ... | main.rs:315:18:315:18 | a | $@ | main.rs:314:24:316:9 | \|...\| ... | \|...\| ... | +| main.rs:315:18:315:18 | a | main.rs:314:24:316:9 | \|...\| ... | main.rs:315:18:315:18 | a | $@ | main.rs:314:24:316:9 | \|...\| ... | \|...\| ... | +| main.rs:324:41:324:41 | i | main.rs:318:31:329:9 | \|...\| ... | main.rs:324:41:324:41 | i | $@ | main.rs:318:31:329:9 | \|...\| ... | \|...\| ... | +| main.rs:324:41:324:41 | i | main.rs:318:31:329:9 | \|...\| ... | main.rs:324:41:324:41 | i | $@ | main.rs:318:31:329:9 | \|...\| ... | \|...\| ... | +| main.rs:345:19:345:19 | a | main.rs:344:21:344:29 | source(...) | main.rs:345:19:345:19 | a | $@ | main.rs:344:21:344:29 | source(...) | source(...) | +| main.rs:345:19:345:19 | a | main.rs:344:21:344:29 | source(...) | main.rs:345:19:345:19 | a | $@ | main.rs:344:21:344:29 | source(...) | source(...) | +| main.rs:353:26:353:26 | b | main.rs:348:21:348:29 | source(...) | main.rs:353:26:353:26 | b | $@ | main.rs:348:21:348:29 | source(...) | source(...) | +| main.rs:353:26:353:26 | b | main.rs:348:21:348:29 | source(...) | main.rs:353:26:353:26 | b | $@ | main.rs:348:21:348:29 | source(...) | source(...) | | main.rs:365:15:365:43 | ...::C {...} | main.rs:364:13:364:22 | source(...) | main.rs:365:15:365:43 | ...::C {...} | $@ | main.rs:364:13:364:22 | source(...) | source(...) | | main.rs:365:15:365:43 | ...::C {...} | main.rs:364:13:364:22 | source(...) | main.rs:365:15:365:43 | ...::C {...} | $@ | main.rs:364:13:364:22 | source(...) | source(...) | | main.rs:368:22:368:56 | ...::E {...} | main.rs:364:13:364:22 | source(...) | main.rs:368:22:368:56 | ...::E {...} | $@ | main.rs:364:13:364:22 | source(...) | source(...) | @@ -877,23 +892,25 @@ invalidSpecComponent | main.rs:401:10:401:10 | i | main.rs:400:16:400:16 | i | main.rs:401:10:401:10 | i | $@ | main.rs:400:16:400:16 | i | i | | main.rs:411:14:411:14 | i | main.rs:410:26:410:31 | ...: i64 | main.rs:411:14:411:14 | i | $@ | main.rs:410:26:410:31 | ...: i64 | ...: i64 | | main.rs:411:14:411:14 | i | main.rs:410:26:410:31 | ...: i64 | main.rs:411:14:411:14 | i | $@ | main.rs:410:26:410:31 | ...: i64 | ...: i64 | -| main.rs:465:10:465:11 | x1 | main.rs:464:14:464:23 | source(...) | main.rs:465:10:465:11 | x1 | $@ | main.rs:464:14:464:23 | source(...) | source(...) | -| main.rs:465:10:465:11 | x1 | main.rs:464:14:464:23 | source(...) | main.rs:465:10:465:11 | x1 | $@ | main.rs:464:14:464:23 | source(...) | source(...) | -| main.rs:475:10:475:18 | x2.field1 | main.rs:468:17:468:26 | source(...) | main.rs:475:10:475:18 | x2.field1 | $@ | main.rs:468:17:468:26 | source(...) | source(...) | -| main.rs:475:10:475:18 | x2.field1 | main.rs:468:17:468:26 | source(...) | main.rs:475:10:475:18 | x2.field1 | $@ | main.rs:468:17:468:26 | source(...) | source(...) | -| main.rs:481:10:481:11 | x4 | main.rs:480:14:480:23 | source(...) | main.rs:481:10:481:11 | x4 | $@ | main.rs:480:14:480:23 | source(...) | source(...) | -| main.rs:481:10:481:11 | x4 | main.rs:480:14:480:23 | source(...) | main.rs:481:10:481:11 | x4 | $@ | main.rs:480:14:480:23 | source(...) | source(...) | -| main.rs:484:10:484:11 | x5 | main.rs:483:14:483:23 | source(...) | main.rs:484:10:484:11 | x5 | $@ | main.rs:483:14:483:23 | source(...) | source(...) | -| main.rs:487:10:487:11 | x6 | main.rs:486:14:486:23 | source(...) | main.rs:487:10:487:11 | x6 | $@ | main.rs:486:14:486:23 | source(...) | source(...) | -| main.rs:502:10:502:28 | generated_source(...) | main.rs:502:10:502:28 | generated_source(...) | main.rs:502:10:502:28 | generated_source(...) | $@ | main.rs:502:10:502:28 | generated_source(...) | generated_source(...) | -| main.rs:502:10:502:28 | generated_source(...) | main.rs:502:10:502:28 | generated_source(...) | main.rs:502:10:502:28 | generated_source(...) | $@ | main.rs:502:10:502:28 | generated_source(...) | generated_source(...) | -| main.rs:504:10:504:33 | neutral_manual_source(...) | main.rs:504:10:504:33 | neutral_manual_source(...) | main.rs:504:10:504:33 | neutral_manual_source(...) | $@ | main.rs:504:10:504:33 | neutral_manual_source(...) | neutral_manual_source(...) | -| main.rs:504:10:504:33 | neutral_manual_source(...) | main.rs:504:10:504:33 | neutral_manual_source(...) | main.rs:504:10:504:33 | neutral_manual_source(...) | $@ | main.rs:504:10:504:33 | neutral_manual_source(...) | neutral_manual_source(...) | -| main.rs:505:20:505:28 | source(...) | main.rs:505:20:505:28 | source(...) | main.rs:505:20:505:28 | source(...) | $@ | main.rs:505:20:505:28 | source(...) | source(...) | -| main.rs:505:20:505:28 | source(...) | main.rs:505:20:505:28 | source(...) | main.rs:505:20:505:28 | source(...) | $@ | main.rs:505:20:505:28 | source(...) | source(...) | -| main.rs:507:25:507:33 | source(...) | main.rs:507:25:507:33 | source(...) | main.rs:507:25:507:33 | source(...) | $@ | main.rs:507:25:507:33 | source(...) | source(...) | -| main.rs:507:25:507:33 | source(...) | main.rs:507:25:507:33 | source(...) | main.rs:507:25:507:33 | source(...) | $@ | main.rs:507:25:507:33 | source(...) | source(...) | -| main.rs:508:10:508:37 | generated_summary(...) | main.rs:508:28:508:36 | source(...) | main.rs:508:10:508:37 | generated_summary(...) | $@ | main.rs:508:28:508:36 | source(...) | source(...) | -| main.rs:508:10:508:37 | generated_summary(...) | main.rs:508:28:508:36 | source(...) | main.rs:508:10:508:37 | generated_summary(...) | $@ | main.rs:508:28:508:36 | source(...) | source(...) | -| main.rs:510:10:510:42 | neutral_manual_summary(...) | main.rs:510:33:510:41 | source(...) | main.rs:510:10:510:42 | neutral_manual_summary(...) | $@ | main.rs:510:33:510:41 | source(...) | source(...) | -| main.rs:510:10:510:42 | neutral_manual_summary(...) | main.rs:510:33:510:41 | source(...) | main.rs:510:10:510:42 | neutral_manual_summary(...) | $@ | main.rs:510:33:510:41 | source(...) | source(...) | +| main.rs:476:10:476:11 | x1 | main.rs:475:14:475:23 | source(...) | main.rs:476:10:476:11 | x1 | $@ | main.rs:475:14:475:23 | source(...) | source(...) | +| main.rs:476:10:476:11 | x1 | main.rs:475:14:475:23 | source(...) | main.rs:476:10:476:11 | x1 | $@ | main.rs:475:14:475:23 | source(...) | source(...) | +| main.rs:486:10:486:18 | x2.field1 | main.rs:479:17:479:26 | source(...) | main.rs:486:10:486:18 | x2.field1 | $@ | main.rs:479:17:479:26 | source(...) | source(...) | +| main.rs:486:10:486:18 | x2.field1 | main.rs:479:17:479:26 | source(...) | main.rs:486:10:486:18 | x2.field1 | $@ | main.rs:479:17:479:26 | source(...) | source(...) | +| main.rs:492:10:492:11 | x4 | main.rs:491:14:491:23 | source(...) | main.rs:492:10:492:11 | x4 | $@ | main.rs:491:14:491:23 | source(...) | source(...) | +| main.rs:492:10:492:11 | x4 | main.rs:491:14:491:23 | source(...) | main.rs:492:10:492:11 | x4 | $@ | main.rs:491:14:491:23 | source(...) | source(...) | +| main.rs:495:10:495:11 | x5 | main.rs:494:14:494:23 | source(...) | main.rs:495:10:495:11 | x5 | $@ | main.rs:494:14:494:23 | source(...) | source(...) | +| main.rs:498:10:498:11 | x6 | main.rs:497:14:497:23 | source(...) | main.rs:498:10:498:11 | x6 | $@ | main.rs:497:14:497:23 | source(...) | source(...) | +| main.rs:504:10:504:11 | x8 | main.rs:503:34:503:43 | source(...) | main.rs:504:10:504:11 | x8 | $@ | main.rs:503:34:503:43 | source(...) | source(...) | +| main.rs:504:10:504:11 | x8 | main.rs:503:34:503:43 | source(...) | main.rs:504:10:504:11 | x8 | $@ | main.rs:503:34:503:43 | source(...) | source(...) | +| main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | $@ | main.rs:519:10:519:28 | generated_source(...) | generated_source(...) | +| main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | $@ | main.rs:519:10:519:28 | generated_source(...) | generated_source(...) | +| main.rs:521:10:521:33 | neutral_manual_source(...) | main.rs:521:10:521:33 | neutral_manual_source(...) | main.rs:521:10:521:33 | neutral_manual_source(...) | $@ | main.rs:521:10:521:33 | neutral_manual_source(...) | neutral_manual_source(...) | +| main.rs:521:10:521:33 | neutral_manual_source(...) | main.rs:521:10:521:33 | neutral_manual_source(...) | main.rs:521:10:521:33 | neutral_manual_source(...) | $@ | main.rs:521:10:521:33 | neutral_manual_source(...) | neutral_manual_source(...) | +| main.rs:522:20:522:28 | source(...) | main.rs:522:20:522:28 | source(...) | main.rs:522:20:522:28 | source(...) | $@ | main.rs:522:20:522:28 | source(...) | source(...) | +| main.rs:522:20:522:28 | source(...) | main.rs:522:20:522:28 | source(...) | main.rs:522:20:522:28 | source(...) | $@ | main.rs:522:20:522:28 | source(...) | source(...) | +| main.rs:524:25:524:33 | source(...) | main.rs:524:25:524:33 | source(...) | main.rs:524:25:524:33 | source(...) | $@ | main.rs:524:25:524:33 | source(...) | source(...) | +| main.rs:524:25:524:33 | source(...) | main.rs:524:25:524:33 | source(...) | main.rs:524:25:524:33 | source(...) | $@ | main.rs:524:25:524:33 | source(...) | source(...) | +| main.rs:525:10:525:37 | generated_summary(...) | main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | $@ | main.rs:525:28:525:36 | source(...) | source(...) | +| main.rs:525:10:525:37 | generated_summary(...) | main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | $@ | main.rs:525:28:525:36 | source(...) | source(...) | +| main.rs:527:10:527:42 | neutral_manual_summary(...) | main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | $@ | main.rs:527:33:527:41 | source(...) | source(...) | +| main.rs:527:10:527:42 | neutral_manual_summary(...) | main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | $@ | main.rs:527:33:527:41 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/models/models.ext.yml b/rust/ql/test/library-tests/dataflow/models/models.ext.yml index 38624e1fc198..1d5b0a506b7a 100644 --- a/rust/ql/test/library-tests/dataflow/models/models.ext.yml +++ b/rust/ql/test/library-tests/dataflow/models/models.ext.yml @@ -54,6 +54,8 @@ extensions: - ["main::external_file::generated_summary", "Argument[0]", "ReturnValue", "value", "dfc-generated"] - ["main::external_file::neutral_generated_summary", "Argument[0]", "ReturnValue", "value", "dfc-generated"] - ["main::external_file::neutral_manual_summary", "Argument[0]", "ReturnValue", "value", "manual"] + - ["main::external_file::MyTrait2::flow_through2", "Argument[0]", "ReturnValue", "value", "manual"] + - ["<_ as main::MyTrait3>::flow_through3", "Argument[0]", "ReturnValue", "value", "manual"] - addsTo: pack: codeql/rust-all extensible: neutralModel From b12b1d0867a56e7b2b2ad043635311582ba3c426 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 24 Aug 2026 09:54:38 +0200 Subject: [PATCH 0478/2098] Rust: Canonical paths for blanket implementations --- .../codeql/rust/internal/PathResolution.qll | 14 +- .../canonical_path/canonical_paths.expected | 2 + .../library-tests/dataflow/models/main.rs | 2 +- .../dataflow/models/models.expected | 161 ++++++++++-------- 4 files changed, 104 insertions(+), 75 deletions(-) diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index dc061eab4e30..9af7f6abad45 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -874,7 +874,12 @@ final class ImplItemNode extends ImplOrTraitItemNode instanceof Impl { */ predicate isBlanketImplementation() { exists(this.getBlanketImplementationTypeParam()) } - override predicate hasCanonicalPath(Crate c) { this.resolveSelfTy().hasCanonicalPathPrefix(c) } + override predicate hasCanonicalPath(Crate c) { + this.resolveSelfTy().hasCanonicalPathPrefix(c) + or + this.isBlanketImplementation() and + c.getASourceFile().getFile() = this.getFile() + } /** * Holds if `(c1, c2)` forms a pair of crates for the type and trait @@ -920,7 +925,12 @@ final class ImplItemNode extends ImplOrTraitItemNode instanceof Impl { result = "<" or i = 1 and - result = this.getSelfCanonicalPath(c) + ( + result = this.getSelfCanonicalPath(c) + or + this.isBlanketImplementation() and + result = "_" + ) or if exists(this.getTraitPath()) then diff --git a/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected b/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected index 7077a475647b..b93f75b3ad70 100644 --- a/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected +++ b/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected @@ -15,6 +15,8 @@ | regular.rs:13:5:13:18 | fn g | ::g | | regular.rs:16:1:18:1 | trait TraitWithBlanketImpl | test::regular::TraitWithBlanketImpl | | regular.rs:17:5:17:16 | fn h | test::regular::TraitWithBlanketImpl::h | +| regular.rs:20:1:22:1 | impl TraitWithBlanketImpl for T { ... } | <_ as test::regular::TraitWithBlanketImpl> | +| regular.rs:21:5:21:18 | fn h | <_ as test::regular::TraitWithBlanketImpl>::h | | regular.rs:24:1:24:12 | fn free | test::regular::free | | regular.rs:26:1:32:1 | fn usage | test::regular::usage | | regular.rs:34:1:38:1 | enum MyEnum | test::regular::MyEnum | diff --git a/rust/ql/test/library-tests/dataflow/models/main.rs b/rust/ql/test/library-tests/dataflow/models/main.rs index 77db4621e711..d7ca16d2b1f5 100644 --- a/rust/ql/test/library-tests/dataflow/models/main.rs +++ b/rust/ql/test/library-tests/dataflow/models/main.rs @@ -504,7 +504,7 @@ fn test_trait_model(x: T) { sink(x8); // $ hasValueFlow=29 let x9 = <()>::flow_through3(source(30)); - sink(x9); // $ MISSING: hasValueFlow=30 + sink(x9); // $ hasValueFlow=30 } mod external_file; diff --git a/rust/ql/test/library-tests/dataflow/models/models.expected b/rust/ql/test/library-tests/dataflow/models/models.expected index 9fec16cfafa2..e33d40856ce5 100644 --- a/rust/ql/test/library-tests/dataflow/models/models.expected +++ b/rust/ql/test/library-tests/dataflow/models/models.expected @@ -17,27 +17,28 @@ models | 16 | Source: main::simple_source; ReturnValue; test-source | | 17 | Source: main::source_into_function::pass_source; Argument[1].Parameter[0]; test-source | | 18 | Source: main::source_into_function::pass_source_nested; Argument[1].Parameter[0].Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-source | -| 19 | Summary: core::cmp::Ord::max; Argument[self,0]; ReturnValue; value | -| 20 | Summary: core::cmp::PartialOrd::lt; Argument[self].Reference; ReturnValue; taint | -| 21 | Summary: core::ops::index::Index::index; Argument[self].Reference.Element; ReturnValue.Reference; value | -| 22 | Summary: main::apply; Argument[0]; Argument[1].Parameter[0]; value | -| 23 | Summary: main::apply; Argument[1].ReturnValue; ReturnValue; value | -| 24 | Summary: main::coerce; Argument[0]; ReturnValue; taint | -| 25 | Summary: main::external_file::MyTrait2::flow_through2; Argument[0]; ReturnValue; value | -| 26 | Summary: main::external_file::generated_summary; Argument[0]; ReturnValue; value | -| 27 | Summary: main::external_file::neutral_manual_summary; Argument[0]; ReturnValue; value | -| 28 | Summary: main::get_array_element; Argument[0].Element; ReturnValue; value | -| 29 | Summary: main::get_async_number; Argument[0]; ReturnValue.Future; value | -| 30 | Summary: main::get_struct_field; Argument[0].Field[main::MyStruct::field1]; ReturnValue; value | -| 31 | Summary: main::get_tuple_element; Argument[0].Field[0]; ReturnValue; value | -| 32 | Summary: main::get_var_field; Argument[0].Field[main::MyFieldEnum::C::field_c]; ReturnValue; value | -| 33 | Summary: main::get_var_pos; Argument[0].Field[main::MyPosEnum::A(0)]; ReturnValue; value | -| 34 | Summary: main::set_array_element; Argument[0]; ReturnValue.Element; value | -| 35 | Summary: main::set_struct_field; Argument[0]; ReturnValue.Field[main::MyStruct::field2]; value | -| 36 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value | -| 37 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value | -| 38 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value | -| 39 | Summary: main::snd; Argument[1]; ReturnValue; value | +| 19 | Summary: <_ as main::MyTrait3>::flow_through3; Argument[0]; ReturnValue; value | +| 20 | Summary: core::cmp::Ord::max; Argument[self,0]; ReturnValue; value | +| 21 | Summary: core::cmp::PartialOrd::lt; Argument[self].Reference; ReturnValue; taint | +| 22 | Summary: core::ops::index::Index::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 23 | Summary: main::apply; Argument[0]; Argument[1].Parameter[0]; value | +| 24 | Summary: main::apply; Argument[1].ReturnValue; ReturnValue; value | +| 25 | Summary: main::coerce; Argument[0]; ReturnValue; taint | +| 26 | Summary: main::external_file::MyTrait2::flow_through2; Argument[0]; ReturnValue; value | +| 27 | Summary: main::external_file::generated_summary; Argument[0]; ReturnValue; value | +| 28 | Summary: main::external_file::neutral_manual_summary; Argument[0]; ReturnValue; value | +| 29 | Summary: main::get_array_element; Argument[0].Element; ReturnValue; value | +| 30 | Summary: main::get_async_number; Argument[0]; ReturnValue.Future; value | +| 31 | Summary: main::get_struct_field; Argument[0].Field[main::MyStruct::field1]; ReturnValue; value | +| 32 | Summary: main::get_tuple_element; Argument[0].Field[0]; ReturnValue; value | +| 33 | Summary: main::get_var_field; Argument[0].Field[main::MyFieldEnum::C::field_c]; ReturnValue; value | +| 34 | Summary: main::get_var_pos; Argument[0].Field[main::MyPosEnum::A(0)]; ReturnValue; value | +| 35 | Summary: main::set_array_element; Argument[0]; ReturnValue.Element; value | +| 36 | Summary: main::set_struct_field; Argument[0]; ReturnValue.Field[main::MyStruct::field2]; value | +| 37 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value | +| 38 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value | +| 39 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value | +| 40 | Summary: main::snd; Argument[1]; ReturnValue; value | edges | main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | | | main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | | @@ -47,13 +48,13 @@ edges | main.rs:16:19:16:19 | s | main.rs:16:10:16:20 | identity(...) | provenance | QL | | main.rs:25:9:25:9 | s | main.rs:26:17:26:17 | s | provenance | | | main.rs:25:13:25:22 | source(...) | main.rs:25:9:25:9 | s | provenance | | -| main.rs:26:17:26:17 | s | main.rs:26:10:26:18 | coerce(...) | provenance | MaD:24 | +| main.rs:26:17:26:17 | s | main.rs:26:10:26:18 | coerce(...) | provenance | MaD:25 | | main.rs:41:9:41:10 | s1 | main.rs:42:17:42:18 | s1 | provenance | | | main.rs:41:9:41:10 | s1 | main.rs:42:17:42:18 | s1 | provenance | | | main.rs:41:14:41:23 | source(...) | main.rs:41:9:41:10 | s1 | provenance | | | main.rs:41:14:41:23 | source(...) | main.rs:41:9:41:10 | s1 | provenance | | -| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:39 | -| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:39 | +| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:40 | +| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:40 | | main.rs:54:9:54:9 | s | main.rs:55:27:55:27 | s | provenance | | | main.rs:54:9:54:9 | s | main.rs:55:27:55:27 | s | provenance | | | main.rs:54:13:54:21 | source(...) | main.rs:54:9:54:9 | s | provenance | | @@ -64,8 +65,8 @@ edges | main.rs:55:14:55:28 | ...::A(...) [A] | main.rs:55:9:55:10 | e1 [A] | provenance | | | main.rs:55:27:55:27 | s | main.rs:55:14:55:28 | ...::A(...) [A] | provenance | | | main.rs:55:27:55:27 | s | main.rs:55:14:55:28 | ...::A(...) [A] | provenance | | -| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:33 | -| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:33 | +| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:34 | +| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:34 | | main.rs:67:9:67:9 | s | main.rs:68:26:68:26 | s | provenance | | | main.rs:67:9:67:9 | s | main.rs:68:26:68:26 | s | provenance | | | main.rs:67:13:67:21 | source(...) | main.rs:67:9:67:9 | s | provenance | | @@ -74,8 +75,8 @@ edges | main.rs:68:9:68:10 | e1 [B] | main.rs:69:11:69:12 | e1 [B] | provenance | | | main.rs:68:14:68:27 | set_var_pos(...) [B] | main.rs:68:9:68:10 | e1 [B] | provenance | | | main.rs:68:14:68:27 | set_var_pos(...) [B] | main.rs:68:9:68:10 | e1 [B] | provenance | | -| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:38 | -| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:38 | +| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:39 | +| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:39 | | main.rs:69:11:69:12 | e1 [B] | main.rs:71:9:71:23 | ...::B(...) [B] | provenance | | | main.rs:69:11:69:12 | e1 [B] | main.rs:71:9:71:23 | ...::B(...) [B] | provenance | | | main.rs:71:9:71:23 | ...::B(...) [B] | main.rs:71:22:71:22 | i | provenance | | @@ -92,8 +93,8 @@ edges | main.rs:88:14:88:42 | ...::C {...} [C] | main.rs:88:9:88:10 | e1 [C] | provenance | | | main.rs:88:40:88:40 | s | main.rs:88:14:88:42 | ...::C {...} [C] | provenance | | | main.rs:88:40:88:40 | s | main.rs:88:14:88:42 | ...::C {...} [C] | provenance | | -| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:32 | -| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:32 | +| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:33 | +| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:33 | | main.rs:100:9:100:9 | s | main.rs:101:28:101:28 | s | provenance | | | main.rs:100:9:100:9 | s | main.rs:101:28:101:28 | s | provenance | | | main.rs:100:13:100:21 | source(...) | main.rs:100:9:100:9 | s | provenance | | @@ -102,8 +103,8 @@ edges | main.rs:101:9:101:10 | e1 [D] | main.rs:102:11:102:12 | e1 [D] | provenance | | | main.rs:101:14:101:29 | set_var_field(...) [D] | main.rs:101:9:101:10 | e1 [D] | provenance | | | main.rs:101:14:101:29 | set_var_field(...) [D] | main.rs:101:9:101:10 | e1 [D] | provenance | | -| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:37 | -| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:37 | +| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:38 | +| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:38 | | main.rs:102:11:102:12 | e1 [D] | main.rs:104:9:104:37 | ...::D {...} [D] | provenance | | | main.rs:102:11:102:12 | e1 [D] | main.rs:104:9:104:37 | ...::D {...} [D] | provenance | | | main.rs:104:9:104:37 | ...::D {...} [D] | main.rs:104:35:104:35 | i | provenance | | @@ -120,8 +121,8 @@ edges | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | main.rs:121:9:121:17 | my_struct [MyStruct.field1] | provenance | | | main.rs:122:17:122:17 | s | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | provenance | | | main.rs:122:17:122:17 | s | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | provenance | | -| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:30 | -| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:30 | +| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:31 | +| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:31 | | main.rs:142:9:142:9 | s | main.rs:143:38:143:38 | s | provenance | | | main.rs:142:9:142:9 | s | main.rs:143:38:143:38 | s | provenance | | | main.rs:142:13:142:21 | source(...) | main.rs:142:9:142:9 | s | provenance | | @@ -130,16 +131,16 @@ edges | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | provenance | | | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | provenance | | | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | provenance | | -| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:35 | -| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:35 | +| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:36 | +| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:36 | | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | main.rs:145:10:145:25 | my_struct.field2 | provenance | | | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | main.rs:145:10:145:25 | my_struct.field2 | provenance | | | main.rs:154:9:154:9 | s | main.rs:155:29:155:29 | s | provenance | | | main.rs:154:9:154:9 | s | main.rs:155:29:155:29 | s | provenance | | | main.rs:154:13:154:21 | source(...) | main.rs:154:9:154:9 | s | provenance | | | main.rs:154:13:154:21 | source(...) | main.rs:154:9:154:9 | s | provenance | | -| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:28 | -| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:28 | +| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:29 | +| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:29 | | main.rs:155:29:155:29 | s | main.rs:155:28:155:30 | [...] [element] | provenance | | | main.rs:155:29:155:29 | s | main.rs:155:28:155:30 | [...] [element] | provenance | | | main.rs:164:9:164:9 | s | main.rs:165:33:165:33 | s | provenance | | @@ -150,10 +151,10 @@ edges | main.rs:165:9:165:11 | arr [element] | main.rs:166:10:166:12 | arr [element] | provenance | | | main.rs:165:15:165:34 | set_array_element(...) [element] | main.rs:165:9:165:11 | arr [element] | provenance | | | main.rs:165:15:165:34 | set_array_element(...) [element] | main.rs:165:9:165:11 | arr [element] | provenance | | -| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:34 | -| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:34 | -| main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:21 | -| main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:21 | +| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:35 | +| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:35 | +| main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:22 | +| main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:22 | | main.rs:175:9:175:9 | s | main.rs:176:14:176:14 | s | provenance | | | main.rs:175:9:175:9 | s | main.rs:176:14:176:14 | s | provenance | | | main.rs:175:13:175:22 | source(...) | main.rs:175:9:175:9 | s | provenance | | @@ -164,8 +165,8 @@ edges | main.rs:176:13:176:18 | TupleExpr [tuple.0] | main.rs:176:9:176:9 | t [tuple.0] | provenance | | | main.rs:176:14:176:14 | s | main.rs:176:13:176:18 | TupleExpr [tuple.0] | provenance | | | main.rs:176:14:176:14 | s | main.rs:176:13:176:18 | TupleExpr [tuple.0] | provenance | | -| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:31 | -| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:31 | +| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:32 | +| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:32 | | main.rs:188:9:188:9 | s | main.rs:189:31:189:31 | s | provenance | | | main.rs:188:9:188:9 | s | main.rs:189:31:189:31 | s | provenance | | | main.rs:188:13:188:22 | source(...) | main.rs:188:9:188:9 | s | provenance | | @@ -174,8 +175,8 @@ edges | main.rs:189:9:189:9 | t [tuple.1] | main.rs:191:10:191:10 | t [tuple.1] | provenance | | | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | main.rs:189:9:189:9 | t [tuple.1] | provenance | | | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | main.rs:189:9:189:9 | t [tuple.1] | provenance | | -| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:36 | -| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:36 | +| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:37 | +| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:37 | | main.rs:191:10:191:10 | t [tuple.1] | main.rs:191:10:191:12 | t.1 | provenance | | | main.rs:191:10:191:10 | t [tuple.1] | main.rs:191:10:191:12 | t.1 | provenance | | | main.rs:203:9:203:9 | s | main.rs:208:11:208:11 | s | provenance | | @@ -184,8 +185,8 @@ edges | main.rs:203:13:203:22 | source(...) | main.rs:203:9:203:9 | s | provenance | | | main.rs:204:14:204:14 | ... | main.rs:205:14:205:14 | n | provenance | | | main.rs:204:14:204:14 | ... | main.rs:205:14:205:14 | n | provenance | | -| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:22 | -| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:22 | +| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:23 | +| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:23 | | main.rs:212:13:212:22 | source(...) | main.rs:214:23:214:23 | f [captured s] | provenance | | | main.rs:212:13:212:22 | source(...) | main.rs:214:23:214:23 | f [captured s] | provenance | | | main.rs:213:40:213:40 | s | main.rs:213:17:213:42 | if ... {...} else {...} | provenance | | @@ -194,14 +195,14 @@ edges | main.rs:214:9:214:9 | t | main.rs:215:10:215:10 | t | provenance | | | main.rs:214:13:214:24 | apply(...) | main.rs:214:9:214:9 | t | provenance | | | main.rs:214:13:214:24 | apply(...) | main.rs:214:9:214:9 | t | provenance | | -| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:22 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:22 | | main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:23 | | main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:23 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:22 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:22 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:24 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:24 | | main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:23 | | main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:23 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:24 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:24 | | main.rs:219:9:219:9 | s | main.rs:221:19:221:19 | s | provenance | | | main.rs:219:9:219:9 | s | main.rs:221:19:221:19 | s | provenance | | | main.rs:219:13:219:22 | source(...) | main.rs:219:9:219:9 | s | provenance | | @@ -212,10 +213,10 @@ edges | main.rs:221:9:221:9 | t | main.rs:222:10:222:10 | t | provenance | | | main.rs:221:13:221:23 | apply(...) | main.rs:221:9:221:9 | t | provenance | | | main.rs:221:13:221:23 | apply(...) | main.rs:221:9:221:9 | t | provenance | | -| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | provenance | MaD:22 | -| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | provenance | MaD:22 | -| main.rs:221:19:221:19 | s | main.rs:221:13:221:23 | apply(...) | provenance | MaD:22 | -| main.rs:221:19:221:19 | s | main.rs:221:13:221:23 | apply(...) | provenance | MaD:22 | +| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | provenance | MaD:23 | +| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | provenance | MaD:23 | +| main.rs:221:19:221:19 | s | main.rs:221:13:221:23 | apply(...) | provenance | MaD:23 | +| main.rs:221:19:221:19 | s | main.rs:221:13:221:23 | apply(...) | provenance | MaD:23 | | main.rs:231:9:231:9 | s | main.rs:232:30:232:30 | s | provenance | | | main.rs:231:9:231:9 | s | main.rs:232:30:232:30 | s | provenance | | | main.rs:231:13:231:22 | source(...) | main.rs:231:9:231:9 | s | provenance | | @@ -226,8 +227,8 @@ edges | main.rs:232:13:232:31 | get_async_number(...) [future] | main.rs:232:13:232:37 | await ... | provenance | | | main.rs:232:13:232:37 | await ... | main.rs:232:9:232:9 | t | provenance | | | main.rs:232:13:232:37 | await ... | main.rs:232:9:232:9 | t | provenance | | -| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:29 | -| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:29 | +| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:30 | +| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:30 | | main.rs:257:9:257:9 | s [D] | main.rs:258:11:258:11 | s [D] | provenance | | | main.rs:257:9:257:9 | s [D] | main.rs:258:11:258:11 | s [D] | provenance | | | main.rs:257:13:257:27 | enum_source(...) | main.rs:257:9:257:9 | s [D] | provenance | Src:MaD:12 | @@ -342,38 +343,44 @@ edges | main.rs:410:26:410:31 | ...: i64 | main.rs:411:14:411:14 | i | provenance | Src:MaD:10 | | main.rs:475:9:475:10 | x1 | main.rs:476:10:476:11 | x1 | provenance | | | main.rs:475:9:475:10 | x1 | main.rs:476:10:476:11 | x1 | provenance | | -| main.rs:475:14:475:23 | source(...) | main.rs:475:14:475:30 | ... .max(...) | provenance | MaD:19 | -| main.rs:475:14:475:23 | source(...) | main.rs:475:14:475:30 | ... .max(...) | provenance | MaD:19 | +| main.rs:475:14:475:23 | source(...) | main.rs:475:14:475:30 | ... .max(...) | provenance | MaD:20 | +| main.rs:475:14:475:23 | source(...) | main.rs:475:14:475:30 | ... .max(...) | provenance | MaD:20 | | main.rs:475:14:475:30 | ... .max(...) | main.rs:475:9:475:10 | x1 | provenance | | | main.rs:475:14:475:30 | ... .max(...) | main.rs:475:9:475:10 | x1 | provenance | | | main.rs:478:9:478:10 | x2 [MyStruct.field1] | main.rs:486:10:486:11 | x2 [MyStruct.field1] | provenance | | | main.rs:478:9:478:10 | x2 [MyStruct.field1] | main.rs:486:10:486:11 | x2 [MyStruct.field1] | provenance | | | main.rs:478:14:485:6 | ... .max(...) [MyStruct.field1] | main.rs:478:9:478:10 | x2 [MyStruct.field1] | provenance | | | main.rs:478:14:485:6 | ... .max(...) [MyStruct.field1] | main.rs:478:9:478:10 | x2 [MyStruct.field1] | provenance | | -| main.rs:478:15:481:5 | MyStruct {...} [MyStruct.field1] | main.rs:478:14:485:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:19 | -| main.rs:478:15:481:5 | MyStruct {...} [MyStruct.field1] | main.rs:478:14:485:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:19 | +| main.rs:478:15:481:5 | MyStruct {...} [MyStruct.field1] | main.rs:478:14:485:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:20 | +| main.rs:478:15:481:5 | MyStruct {...} [MyStruct.field1] | main.rs:478:14:485:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:20 | | main.rs:479:17:479:26 | source(...) | main.rs:478:15:481:5 | MyStruct {...} [MyStruct.field1] | provenance | | | main.rs:479:17:479:26 | source(...) | main.rs:478:15:481:5 | MyStruct {...} [MyStruct.field1] | provenance | | | main.rs:486:10:486:11 | x2 [MyStruct.field1] | main.rs:486:10:486:18 | x2.field1 | provenance | | | main.rs:486:10:486:11 | x2 [MyStruct.field1] | main.rs:486:10:486:18 | x2.field1 | provenance | | | main.rs:491:9:491:10 | x4 | main.rs:492:10:492:11 | x4 | provenance | | | main.rs:491:9:491:10 | x4 | main.rs:492:10:492:11 | x4 | provenance | | -| main.rs:491:14:491:23 | source(...) | main.rs:491:14:491:30 | ... .max(...) | provenance | MaD:19 | -| main.rs:491:14:491:23 | source(...) | main.rs:491:14:491:30 | ... .max(...) | provenance | MaD:19 | +| main.rs:491:14:491:23 | source(...) | main.rs:491:14:491:30 | ... .max(...) | provenance | MaD:20 | +| main.rs:491:14:491:23 | source(...) | main.rs:491:14:491:30 | ... .max(...) | provenance | MaD:20 | | main.rs:491:14:491:30 | ... .max(...) | main.rs:491:9:491:10 | x4 | provenance | | | main.rs:491:14:491:30 | ... .max(...) | main.rs:491:9:491:10 | x4 | provenance | | | main.rs:494:9:494:10 | x5 | main.rs:495:10:495:11 | x5 | provenance | | -| main.rs:494:14:494:23 | source(...) | main.rs:494:14:494:30 | ... .lt(...) | provenance | MaD:20 | +| main.rs:494:14:494:23 | source(...) | main.rs:494:14:494:30 | ... .lt(...) | provenance | MaD:21 | | main.rs:494:14:494:30 | ... .lt(...) | main.rs:494:9:494:10 | x5 | provenance | | | main.rs:497:9:497:10 | x6 | main.rs:498:10:498:11 | x6 | provenance | | -| main.rs:497:14:497:23 | source(...) | main.rs:497:14:497:27 | ... < ... | provenance | MaD:20 | +| main.rs:497:14:497:23 | source(...) | main.rs:497:14:497:27 | ... < ... | provenance | MaD:21 | | main.rs:497:14:497:27 | ... < ... | main.rs:497:9:497:10 | x6 | provenance | | | main.rs:503:9:503:10 | x8 | main.rs:504:10:504:11 | x8 | provenance | | | main.rs:503:9:503:10 | x8 | main.rs:504:10:504:11 | x8 | provenance | | | main.rs:503:14:503:44 | ...::flow_through2(...) | main.rs:503:9:503:10 | x8 | provenance | | | main.rs:503:14:503:44 | ...::flow_through2(...) | main.rs:503:9:503:10 | x8 | provenance | | -| main.rs:503:34:503:43 | source(...) | main.rs:503:14:503:44 | ...::flow_through2(...) | provenance | MaD:25 | -| main.rs:503:34:503:43 | source(...) | main.rs:503:14:503:44 | ...::flow_through2(...) | provenance | MaD:25 | +| main.rs:503:34:503:43 | source(...) | main.rs:503:14:503:44 | ...::flow_through2(...) | provenance | MaD:26 | +| main.rs:503:34:503:43 | source(...) | main.rs:503:14:503:44 | ...::flow_through2(...) | provenance | MaD:26 | +| main.rs:506:9:506:10 | x9 | main.rs:507:10:507:11 | x9 | provenance | | +| main.rs:506:9:506:10 | x9 | main.rs:507:10:507:11 | x9 | provenance | | +| main.rs:506:14:506:44 | ...::flow_through3(...) | main.rs:506:9:506:10 | x9 | provenance | | +| main.rs:506:14:506:44 | ...::flow_through3(...) | main.rs:506:9:506:10 | x9 | provenance | | +| main.rs:506:34:506:43 | source(...) | main.rs:506:14:506:44 | ...::flow_through3(...) | provenance | MaD:19 | +| main.rs:506:34:506:43 | source(...) | main.rs:506:14:506:44 | ...::flow_through3(...) | provenance | MaD:19 | | main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | provenance | Src:MaD:14 | | main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | provenance | Src:MaD:14 | | main.rs:521:10:521:33 | neutral_manual_source(...) | main.rs:521:10:521:33 | neutral_manual_source(...) | provenance | Src:MaD:15 | @@ -382,10 +389,10 @@ edges | main.rs:522:20:522:28 | source(...) | main.rs:522:20:522:28 | source(...) | provenance | Sink:MaD:4 | | main.rs:524:25:524:33 | source(...) | main.rs:524:25:524:33 | source(...) | provenance | Sink:MaD:5 | | main.rs:524:25:524:33 | source(...) | main.rs:524:25:524:33 | source(...) | provenance | Sink:MaD:5 | -| main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | provenance | MaD:26 | -| main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | provenance | MaD:26 | -| main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | provenance | MaD:27 | -| main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | provenance | MaD:27 | +| main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | provenance | MaD:27 | +| main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | provenance | MaD:27 | +| main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | provenance | MaD:28 | +| main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | provenance | MaD:28 | nodes | main.rs:15:9:15:9 | s | semmle.label | s | | main.rs:15:9:15:9 | s | semmle.label | s | @@ -793,6 +800,14 @@ nodes | main.rs:503:34:503:43 | source(...) | semmle.label | source(...) | | main.rs:504:10:504:11 | x8 | semmle.label | x8 | | main.rs:504:10:504:11 | x8 | semmle.label | x8 | +| main.rs:506:9:506:10 | x9 | semmle.label | x9 | +| main.rs:506:9:506:10 | x9 | semmle.label | x9 | +| main.rs:506:14:506:44 | ...::flow_through3(...) | semmle.label | ...::flow_through3(...) | +| main.rs:506:14:506:44 | ...::flow_through3(...) | semmle.label | ...::flow_through3(...) | +| main.rs:506:34:506:43 | source(...) | semmle.label | source(...) | +| main.rs:506:34:506:43 | source(...) | semmle.label | source(...) | +| main.rs:507:10:507:11 | x9 | semmle.label | x9 | +| main.rs:507:10:507:11 | x9 | semmle.label | x9 | | main.rs:519:10:519:28 | generated_source(...) | semmle.label | generated_source(...) | | main.rs:519:10:519:28 | generated_source(...) | semmle.label | generated_source(...) | | main.rs:519:10:519:28 | generated_source(...) | semmle.label | generated_source(...) | @@ -902,6 +917,8 @@ invalidSpecComponent | main.rs:498:10:498:11 | x6 | main.rs:497:14:497:23 | source(...) | main.rs:498:10:498:11 | x6 | $@ | main.rs:497:14:497:23 | source(...) | source(...) | | main.rs:504:10:504:11 | x8 | main.rs:503:34:503:43 | source(...) | main.rs:504:10:504:11 | x8 | $@ | main.rs:503:34:503:43 | source(...) | source(...) | | main.rs:504:10:504:11 | x8 | main.rs:503:34:503:43 | source(...) | main.rs:504:10:504:11 | x8 | $@ | main.rs:503:34:503:43 | source(...) | source(...) | +| main.rs:507:10:507:11 | x9 | main.rs:506:34:506:43 | source(...) | main.rs:507:10:507:11 | x9 | $@ | main.rs:506:34:506:43 | source(...) | source(...) | +| main.rs:507:10:507:11 | x9 | main.rs:506:34:506:43 | source(...) | main.rs:507:10:507:11 | x9 | $@ | main.rs:506:34:506:43 | source(...) | source(...) | | main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | $@ | main.rs:519:10:519:28 | generated_source(...) | generated_source(...) | | main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | $@ | main.rs:519:10:519:28 | generated_source(...) | generated_source(...) | | main.rs:521:10:521:33 | neutral_manual_source(...) | main.rs:521:10:521:33 | neutral_manual_source(...) | main.rs:521:10:521:33 | neutral_manual_source(...) | $@ | main.rs:521:10:521:33 | neutral_manual_source(...) | neutral_manual_source(...) | From 736b1100608c93f4d11492a14984cf20b390f2ea Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Mon, 24 Aug 2026 10:17:03 +0200 Subject: [PATCH 0479/2098] Ruby: Add change note. --- ruby/ql/lib/change-notes/2026-08-24-cfg-swap.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 ruby/ql/lib/change-notes/2026-08-24-cfg-swap.md diff --git a/ruby/ql/lib/change-notes/2026-08-24-cfg-swap.md b/ruby/ql/lib/change-notes/2026-08-24-cfg-swap.md new file mode 100644 index 000000000000..a428124f0a77 --- /dev/null +++ b/ruby/ql/lib/change-notes/2026-08-24-cfg-swap.md @@ -0,0 +1,14 @@ +--- +category: breaking +--- +* The Ruby control flow graph implementation has been completely replaced. This + affects a number of queries slightly. The CFG now includes additional nodes + to more accurately represent certain constructs. This also means that any + existing code that implicitly relies on very specific details about the CFG + may need to be updated. The CFG no longer uses splitting, which means that + AST nodes now have a unique CFG node representation. In particular, + `ControlFlowNode.getAstNode` has changed its meaning. The AST-to-CFG mapping + remains one-to-many, but now for a different reason. It used to be because of + splitting, but now it's because of additional "helper" CFG nodes. To get the + (now canonical) CFG node for a given AST node, use + `Stmt.getControlFlowNode()` instead. From ea600a97d0e414f901666733dd40009b5d0e21de Mon Sep 17 00:00:00 2001 From: Asger F Date: Mon, 24 Aug 2026 10:46:54 +0200 Subject: [PATCH 0480/2098] unified: Add test for enums I thought there was a bug here, but it turns out this works as intended. Makes sense to keep the test though. --- .../test/library-tests/static-name-binding/test.swift | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/unified/ql/test/library-tests/static-name-binding/test.swift b/unified/ql/test/library-tests/static-name-binding/test.swift index 27453ec34351..64a385ef29b4 100644 --- a/unified/ql/test/library-tests/static-name-binding/test.swift +++ b/unified/ql/test/library-tests/static-name-binding/test.swift @@ -51,3 +51,14 @@ class H { let x2: G.B = nil; // $ access=G access=A.B let x3: G.B.C = nil; // $ access=G access=A.B access=A.B.C } + +enum I { + case one=1, two=2 + case three=3 +} + +func useI() { + I.one // $ access=I access=I.one + I.two // $ access=I access=I.two + I.three // $ access=I access=I.three +} From 6d91ebe43fbd3c6b7b8d5bbe0ded5dd28eb88896 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Mon, 24 Aug 2026 12:26:42 +0100 Subject: [PATCH 0481/2098] C++: Simplify 'getSourceDataFlowNode' for parameters. --- .../cpp/dataflow/internal/FlowSummaryImpl.qll | 13 +- .../dataflow/external-models/flow.expected | 294 ++++++++++-------- .../dataflow/external-models/flow.ext.yml | 5 + .../dataflow/external-models/sinks.expected | 8 + .../dataflow/external-models/test.cpp | 15 +- 5 files changed, 202 insertions(+), 133 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll index fc3e7172c6fc..0eba3d5fc181 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll @@ -247,6 +247,14 @@ private module Input2 implements Impl::Private::InputSig2 { r.getKind() = rk } + pragma[nomagic] + private predicate hasParameterAndIndirectionIndex( + Parameter p, int indirectionIndex, ParameterNode n + ) { + n.getParameter() = p and + n.getIndirectionIndex() = indirectionIndex + } + bindingset[e, sc] Node getSourceDataFlowNode(SourceSinkReportingElement e, Impl::Private::SummaryComponent sc) { exists(DataFlowCall call | @@ -272,10 +280,9 @@ private module Input2 implements Impl::Private::InputSig2 { ) ) or - exists(ParameterPosition pos, ParameterNode p | + exists(ParameterPosition pos | sc = Impl::Private::SummaryComponent::parameter(pos) and - p.isParameterOf(e.getEnclosingCallable(), pos) and - result = p + hasParameterAndIndirectionIndex(e, pos.getIndirectionIndex(), result) ) or exists(Function f, ReturnKind rk | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index 1494ef1264fb..b6f5f4a4452f 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -40,108 +40,113 @@ models | 39 | Source: ; ; false; source_from_callback_return_template; ; ; Argument[0].ReturnValue; local; manual | | 40 | Source: ; ; false; source_from_callback_template; ; ; Argument[0].Parameter[*0].Field[SourceWrapper::value]; local; manual | | 41 | Source: ; ; false; source_ptr_from_callback_return_ptr; ; ; Argument[0].ReturnValue[*]; local; manual | -| 42 | Source: ; ; false; ymlFieldSource; ; ; ReturnValue.Field[SourceWrapper::value]; local; manual | -| 43 | Source: ; ; false; ymlSource; ; ; ReturnValue; local; manual | -| 44 | Source: ; ; false; ymlSourcePtr; ; ; ReturnValue[*]; local; manual | -| 45 | Source: Azure::Core::Http; RawResponse; true; ExtractBodyStream; ; ; ReturnValue[*]; remote; manual | -| 46 | Source: Azure::Core::Http; RawResponse; true; GetBody; ; ; ReturnValue[*]; remote; manual | -| 47 | Source: Azure::Core::Http; RawResponse; true; GetHeaders; ; ; ReturnValue[*]; remote; manual | -| 48 | Source: Azure::Core::Http; Request; true; GetBodyStream; ; ; ReturnValue[*]; remote; manual | -| 49 | Source: Azure::Core::Http; Request; true; GetHeader; ; ; ReturnValue; remote; manual | -| 50 | Source: Azure::Core::Http; Request; true; GetHeaders; ; ; ReturnValue; remote; manual | -| 51 | Source: boost::asio; ; false; read_until; ; ; Argument[*1]; remote; manual | -| 52 | Summary: ; ; false; CLSIDFromProgID; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 53 | Summary: ; ; false; CLSIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 54 | Summary: ; ; false; CommandLineToArgvA; ; ; Argument[*0]; ReturnValue[**]; taint; manual | -| 55 | Summary: ; ; false; CreateRemoteThread; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | -| 56 | Summary: ; ; false; CreateRemoteThreadEx; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | -| 57 | Summary: ; ; false; CreateThread; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | -| 58 | Summary: ; ; false; GUIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 59 | Summary: ; ; false; IIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 60 | Summary: ; ; false; ProgIDFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | -| 61 | Summary: ; ; false; ReadFileEx; ; ; Argument[*3].Field[@hEvent]; Argument[4].Parameter[*2].Field[@hEvent]; value; manual | -| 62 | Summary: ; ; false; RtlCopyDeviceMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 63 | Summary: ; ; false; RtlCopyMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 64 | Summary: ; ; false; RtlCopyMemoryNonTemporal; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 65 | Summary: ; ; false; RtlCopyUnicodeString; ; ; Argument[*1].Field[*Buffer]; Argument[*0].Field[*Buffer]; value; manual | -| 66 | Summary: ; ; false; RtlCopyVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 67 | Summary: ; ; false; RtlInitUnicodeString; ; ; Argument[*1]; Argument[*0].Field[*Buffer]; value; manual | -| 68 | Summary: ; ; false; RtlMoveMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 69 | Summary: ; ; false; RtlMoveVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 70 | Summary: ; ; false; StringFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | -| 71 | Summary: ; ; false; StringFromGUID2; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 72 | Summary: ; ; false; StringFromIID; ; ; Argument[*0]; Argument[**1]; taint; manual | -| 73 | Summary: ; ; false; WinHttpCrackUrl; ; ; Argument[*0]; Argument[*3]; taint; manual | -| 74 | Summary: ; ; false; callWithArgument; ; ; Argument[1]; Argument[0].Parameter[0]; value; manual | -| 75 | Summary: ; ; false; callWithNonTypeTemplate; (const T &); ; Argument[*0]; ReturnValue; value; manual | -| 76 | Summary: ; ; false; pthread_create; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | -| 77 | Summary: ; ; false; read_field_from_struct; ; ; Argument[*0].Field[MyNamespace::MyStructInNamespace::myField]; ReturnValue; value; manual | -| 78 | Summary: ; ; false; read_field_from_struct_2; ; ; Argument[*0].Field[MyGlobalStruct::myField]; ReturnValue; value; manual | -| 79 | Summary: ; ; false; ymlStepGenerated; ; ; Argument[0]; ReturnValue; taint; df-generated | -| 80 | Summary: ; ; false; ymlStepManual; ; ; Argument[0]; ReturnValue; taint; manual | -| 81 | Summary: ; ; false; ymlStepManual_with_body; ; ; Argument[0]; ReturnValue; taint; manual | -| 82 | Summary: ; MyString; true; operator[]; ; ; Argument[-1]; ReturnValue[*]; taint; manual | -| 83 | Summary: ; MyString; true; operator[]; ; ; ReturnValue[*]; Argument[-1]; taint; manual | -| 84 | Summary: ; ReverseFlow; true; get_ptr; ; ; ReturnValue[*]; Argument[-1].Field[ReverseFlow::value]; value; manual | -| 85 | Summary: ; TemplateClass1; true; templateFunction2; (U,V); ; Argument[1]; ReturnValue; value; manual | -| 86 | Summary: ; TemplateClass1; false; templateFunction; (T,U); ; Argument[0]; ReturnValue; value; manual | -| 87 | Summary: ; TemplateClass2; true; function; (U,T); ; Argument[1]; ReturnValue; value; manual | -| 88 | Summary: Azure::Core::IO; BodyStream; true; Read; ; ; Argument[-1]; Argument[*0]; taint; manual | -| 89 | Summary: Azure::Core::IO; BodyStream; true; ReadToCount; ; ; Argument[-1]; Argument[*0]; taint; manual | -| 90 | Summary: Azure::Core::IO; BodyStream; true; ReadToEnd; ; ; Argument[-1]; ReturnValue.Element; taint; manual | -| 91 | Summary: Azure; Nullable; true; Value; ; ; Argument[-1]; ReturnValue[*]; taint; manual | -| 92 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | +| 42 | Source: ; ; false; test_parameter; ; ; Parameter[*0].Field[*SourceWrapper::pointer]; local; manual | +| 43 | Source: ; ; false; test_parameter; ; ; Parameter[*0].Field[SourceWrapper::value]; local; manual | +| 44 | Source: ; ; false; test_parameter; ; ; Parameter[*2]; local; manual | +| 45 | Source: ; ; false; test_parameter; ; ; Parameter[1].Field[*SourceWrapper::pointer]; local; manual | +| 46 | Source: ; ; false; test_parameter; ; ; Parameter[1].Field[SourceWrapper::value]; local; manual | +| 47 | Source: ; ; false; ymlFieldSource; ; ; ReturnValue.Field[SourceWrapper::value]; local; manual | +| 48 | Source: ; ; false; ymlSource; ; ; ReturnValue; local; manual | +| 49 | Source: ; ; false; ymlSourcePtr; ; ; ReturnValue[*]; local; manual | +| 50 | Source: Azure::Core::Http; RawResponse; true; ExtractBodyStream; ; ; ReturnValue[*]; remote; manual | +| 51 | Source: Azure::Core::Http; RawResponse; true; GetBody; ; ; ReturnValue[*]; remote; manual | +| 52 | Source: Azure::Core::Http; RawResponse; true; GetHeaders; ; ; ReturnValue[*]; remote; manual | +| 53 | Source: Azure::Core::Http; Request; true; GetBodyStream; ; ; ReturnValue[*]; remote; manual | +| 54 | Source: Azure::Core::Http; Request; true; GetHeader; ; ; ReturnValue; remote; manual | +| 55 | Source: Azure::Core::Http; Request; true; GetHeaders; ; ; ReturnValue; remote; manual | +| 56 | Source: boost::asio; ; false; read_until; ; ; Argument[*1]; remote; manual | +| 57 | Summary: ; ; false; CLSIDFromProgID; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 58 | Summary: ; ; false; CLSIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 59 | Summary: ; ; false; CommandLineToArgvA; ; ; Argument[*0]; ReturnValue[**]; taint; manual | +| 60 | Summary: ; ; false; CreateRemoteThread; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | +| 61 | Summary: ; ; false; CreateRemoteThreadEx; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | +| 62 | Summary: ; ; false; CreateThread; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | +| 63 | Summary: ; ; false; GUIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 64 | Summary: ; ; false; IIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 65 | Summary: ; ; false; ProgIDFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | +| 66 | Summary: ; ; false; ReadFileEx; ; ; Argument[*3].Field[@hEvent]; Argument[4].Parameter[*2].Field[@hEvent]; value; manual | +| 67 | Summary: ; ; false; RtlCopyDeviceMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 68 | Summary: ; ; false; RtlCopyMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 69 | Summary: ; ; false; RtlCopyMemoryNonTemporal; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 70 | Summary: ; ; false; RtlCopyUnicodeString; ; ; Argument[*1].Field[*Buffer]; Argument[*0].Field[*Buffer]; value; manual | +| 71 | Summary: ; ; false; RtlCopyVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 72 | Summary: ; ; false; RtlInitUnicodeString; ; ; Argument[*1]; Argument[*0].Field[*Buffer]; value; manual | +| 73 | Summary: ; ; false; RtlMoveMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 74 | Summary: ; ; false; RtlMoveVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 75 | Summary: ; ; false; StringFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | +| 76 | Summary: ; ; false; StringFromGUID2; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 77 | Summary: ; ; false; StringFromIID; ; ; Argument[*0]; Argument[**1]; taint; manual | +| 78 | Summary: ; ; false; WinHttpCrackUrl; ; ; Argument[*0]; Argument[*3]; taint; manual | +| 79 | Summary: ; ; false; callWithArgument; ; ; Argument[1]; Argument[0].Parameter[0]; value; manual | +| 80 | Summary: ; ; false; callWithNonTypeTemplate; (const T &); ; Argument[*0]; ReturnValue; value; manual | +| 81 | Summary: ; ; false; pthread_create; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | +| 82 | Summary: ; ; false; read_field_from_struct; ; ; Argument[*0].Field[MyNamespace::MyStructInNamespace::myField]; ReturnValue; value; manual | +| 83 | Summary: ; ; false; read_field_from_struct_2; ; ; Argument[*0].Field[MyGlobalStruct::myField]; ReturnValue; value; manual | +| 84 | Summary: ; ; false; ymlStepGenerated; ; ; Argument[0]; ReturnValue; taint; df-generated | +| 85 | Summary: ; ; false; ymlStepManual; ; ; Argument[0]; ReturnValue; taint; manual | +| 86 | Summary: ; ; false; ymlStepManual_with_body; ; ; Argument[0]; ReturnValue; taint; manual | +| 87 | Summary: ; MyString; true; operator[]; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 88 | Summary: ; MyString; true; operator[]; ; ; ReturnValue[*]; Argument[-1]; taint; manual | +| 89 | Summary: ; ReverseFlow; true; get_ptr; ; ; ReturnValue[*]; Argument[-1].Field[ReverseFlow::value]; value; manual | +| 90 | Summary: ; TemplateClass1; true; templateFunction2; (U,V); ; Argument[1]; ReturnValue; value; manual | +| 91 | Summary: ; TemplateClass1; false; templateFunction; (T,U); ; Argument[0]; ReturnValue; value; manual | +| 92 | Summary: ; TemplateClass2; true; function; (U,T); ; Argument[1]; ReturnValue; value; manual | +| 93 | Summary: Azure::Core::IO; BodyStream; true; Read; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 94 | Summary: Azure::Core::IO; BodyStream; true; ReadToCount; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 95 | Summary: Azure::Core::IO; BodyStream; true; ReadToEnd; ; ; Argument[-1]; ReturnValue.Element; taint; manual | +| 96 | Summary: Azure; Nullable; true; Value; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 97 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | edges -| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:91:7:91:17 | recv_buffer | provenance | Src:MaD:51 | -| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:93:29:93:39 | recv_buffer | provenance | Src:MaD:51 Sink:MaD:4 | +| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:91:7:91:17 | recv_buffer | provenance | Src:MaD:56 | +| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:93:29:93:39 | recv_buffer | provenance | Src:MaD:56 Sink:MaD:4 | | asio_streams.cpp:97:37:97:44 | call to source | asio_streams.cpp:98:7:98:14 | send_str | provenance | TaintFunction | | asio_streams.cpp:97:37:97:44 | call to source | asio_streams.cpp:100:64:100:71 | *send_str | provenance | TaintFunction | | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | | | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:101:7:101:17 | send_buffer | provenance | | | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:103:29:103:39 | send_buffer | provenance | Sink:MaD:4 | -| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:92 | +| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:97 | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:257:5:257:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:262:5:262:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:266:38:266:41 | *resp | provenance | | -| azure.cpp:253:48:253:60 | call to GetBodyStream | azure.cpp:253:48:253:60 | *call to GetBodyStream | provenance | Src:MaD:48 | -| azure.cpp:257:5:257:8 | *resp | azure.cpp:257:16:257:21 | Read output argument | provenance | MaD:88 | +| azure.cpp:253:48:253:60 | call to GetBodyStream | azure.cpp:253:48:253:60 | *call to GetBodyStream | provenance | Src:MaD:53 | +| azure.cpp:257:5:257:8 | *resp | azure.cpp:257:16:257:21 | Read output argument | provenance | MaD:93 | | azure.cpp:257:16:257:21 | Read output argument | azure.cpp:258:10:258:16 | * ... | provenance | | -| azure.cpp:262:5:262:8 | *resp | azure.cpp:262:23:262:28 | ReadToCount output argument | provenance | MaD:89 | +| azure.cpp:262:5:262:8 | *resp | azure.cpp:262:23:262:28 | ReadToCount output argument | provenance | MaD:94 | | azure.cpp:262:23:262:28 | ReadToCount output argument | azure.cpp:263:10:263:16 | * ... | provenance | | -| azure.cpp:266:38:266:41 | *resp | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | provenance | MaD:90 | +| azure.cpp:266:38:266:41 | *resp | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | provenance | MaD:95 | | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | provenance | | | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | azure.cpp:267:10:267:12 | vec [element] | provenance | | | azure.cpp:267:10:267:12 | vec [element] | azure.cpp:267:10:267:12 | vec | provenance | | -| azure.cpp:273:52:273:61 | call to GetHeaders | azure.cpp:273:62:273:64 | call to GetHeaders | provenance | Src:MaD:47 | +| azure.cpp:273:52:273:61 | call to GetHeaders | azure.cpp:273:62:273:64 | call to GetHeaders | provenance | Src:MaD:52 | | azure.cpp:273:62:273:64 | call to GetHeaders | azure.cpp:274:14:274:29 | call to operator[] | provenance | TaintFunction | | azure.cpp:273:62:273:64 | call to GetHeaders | azure.cpp:274:14:274:29 | call to operator[] | provenance | TaintFunction | | azure.cpp:273:62:273:64 | call to GetHeaders | azure.cpp:274:14:274:29 | call to operator[] | provenance | TaintFunction | | azure.cpp:274:14:274:29 | call to operator[] | azure.cpp:274:10:274:29 | call to operator[] | provenance | | | azure.cpp:274:14:274:29 | call to operator[] | azure.cpp:274:14:274:29 | call to operator[] | provenance | | -| azure.cpp:277:38:277:44 | call to GetBody | azure.cpp:277:45:277:47 | call to GetBody | provenance | Src:MaD:46 | +| azure.cpp:277:38:277:44 | call to GetBody | azure.cpp:277:45:277:47 | call to GetBody | provenance | Src:MaD:51 | | azure.cpp:277:45:277:47 | call to GetBody | azure.cpp:278:10:278:13 | body | provenance | | | azure.cpp:277:45:277:47 | call to GetBody | azure.cpp:278:10:278:13 | body | provenance | | | azure.cpp:278:10:278:13 | body | azure.cpp:278:10:278:13 | body | provenance | | | azure.cpp:281:68:281:84 | *call to ExtractBodyStream | azure.cpp:282:21:282:23 | *call to get | provenance | | -| azure.cpp:281:68:281:84 | call to ExtractBodyStream | azure.cpp:281:68:281:84 | *call to ExtractBodyStream | provenance | Src:MaD:45 | -| azure.cpp:282:21:282:23 | *call to get | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | MaD:90 | +| azure.cpp:281:68:281:84 | call to ExtractBodyStream | azure.cpp:281:68:281:84 | *call to ExtractBodyStream | provenance | Src:MaD:50 | +| azure.cpp:282:21:282:23 | *call to get | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | MaD:95 | | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | azure.cpp:282:10:282:38 | call to ReadToEnd | provenance | | | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | | -| azure.cpp:289:24:289:56 | call to GetHeader | azure.cpp:289:63:289:65 | call to Value | provenance | MaD:91 | +| azure.cpp:289:24:289:56 | call to GetHeader | azure.cpp:289:63:289:65 | call to Value | provenance | MaD:96 | | azure.cpp:289:32:289:40 | call to GetHeader | azure.cpp:289:24:289:56 | call to GetHeader | provenance | | -| azure.cpp:289:32:289:40 | call to GetHeader | azure.cpp:289:32:289:40 | call to GetHeader | provenance | Src:MaD:49 | +| azure.cpp:289:32:289:40 | call to GetHeader | azure.cpp:289:32:289:40 | call to GetHeader | provenance | Src:MaD:54 | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:289:63:289:65 | call to Value | provenance | | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:290:10:290:20 | headerValue | provenance | | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:290:10:290:20 | headerValue | provenance | | | azure.cpp:290:10:290:20 | headerValue | azure.cpp:290:10:290:20 | headerValue | provenance | | -| azure.cpp:293:58:293:67 | call to GetHeaders | azure.cpp:293:58:293:67 | call to GetHeaders | provenance | Src:MaD:50 | +| azure.cpp:293:58:293:67 | call to GetHeaders | azure.cpp:293:58:293:67 | call to GetHeaders | provenance | Src:MaD:55 | | azure.cpp:293:58:293:67 | call to GetHeaders | azure.cpp:294:38:294:53 | call to operator[] | provenance | TaintFunction | | azure.cpp:294:38:294:53 | call to operator[] | azure.cpp:295:10:295:20 | contentType | provenance | | | azure.cpp:294:38:294:53 | call to operator[] | azure.cpp:295:10:295:20 | contentType | provenance | | | azure.cpp:295:10:295:20 | contentType | azure.cpp:295:10:295:20 | contentType | provenance | | | test.cpp:7:47:7:52 | value2 | test.cpp:7:64:7:69 | value2 | provenance | | | test.cpp:7:64:7:69 | value2 | test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | provenance | | -| test.cpp:10:10:10:18 | call to ymlSource | test.cpp:10:10:10:18 | call to ymlSource | provenance | Src:MaD:43 | +| test.cpp:10:10:10:18 | call to ymlSource | test.cpp:10:10:10:18 | call to ymlSource | provenance | Src:MaD:48 | | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:14:10:14:10 | x | provenance | Sink:MaD:3 | | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:17:24:17:24 | x | provenance | | | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:21:27:21:27 | x | provenance | | @@ -149,13 +154,13 @@ edges | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:32:41:32:41 | x | provenance | | | test.cpp:17:10:17:22 | call to ymlStepManual | test.cpp:17:10:17:22 | call to ymlStepManual | provenance | | | test.cpp:17:10:17:22 | call to ymlStepManual | test.cpp:18:10:18:10 | y | provenance | Sink:MaD:3 | -| test.cpp:17:24:17:24 | x | test.cpp:17:10:17:22 | call to ymlStepManual | provenance | MaD:80 | +| test.cpp:17:24:17:24 | x | test.cpp:17:10:17:22 | call to ymlStepManual | provenance | MaD:85 | | test.cpp:21:10:21:25 | call to ymlStepGenerated | test.cpp:21:10:21:25 | call to ymlStepGenerated | provenance | | | test.cpp:21:10:21:25 | call to ymlStepGenerated | test.cpp:22:10:22:10 | z | provenance | Sink:MaD:3 | -| test.cpp:21:27:21:27 | x | test.cpp:21:10:21:25 | call to ymlStepGenerated | provenance | MaD:79 | +| test.cpp:21:27:21:27 | x | test.cpp:21:10:21:25 | call to ymlStepGenerated | provenance | MaD:84 | | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | provenance | | | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | test.cpp:26:10:26:11 | y2 | provenance | Sink:MaD:3 | -| test.cpp:25:35:25:35 | x | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | provenance | MaD:81 | +| test.cpp:25:35:25:35 | x | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | provenance | MaD:86 | | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | provenance | | | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | test.cpp:33:10:33:11 | z2 | provenance | Sink:MaD:3 | | test.cpp:32:41:32:41 | x | test.cpp:7:47:7:52 | value2 | provenance | | @@ -166,78 +171,78 @@ edges | test.cpp:48:16:48:16 | x | test.cpp:48:16:48:16 | x | provenance | Sink:MaD:3 | | test.cpp:56:2:56:2 | *s [post update] [x] | test.cpp:59:55:59:64 | *& ... [x] | provenance | | | test.cpp:56:2:56:18 | ... = ... | test.cpp:56:2:56:2 | *s [post update] [x] | provenance | | -| test.cpp:56:8:56:16 | call to ymlSource | test.cpp:56:2:56:18 | ... = ... | provenance | Src:MaD:43 | -| test.cpp:59:55:59:64 | *& ... [x] | test.cpp:46:30:46:32 | *arg [x] | provenance | MaD:76 | +| test.cpp:56:8:56:16 | call to ymlSource | test.cpp:56:2:56:18 | ... = ... | provenance | Src:MaD:48 | +| test.cpp:59:55:59:64 | *& ... [x] | test.cpp:46:30:46:32 | *arg [x] | provenance | MaD:81 | | test.cpp:68:22:68:22 | y | test.cpp:69:11:69:11 | y | provenance | Sink:MaD:3 | | test.cpp:74:22:74:22 | y | test.cpp:75:11:75:11 | y | provenance | Sink:MaD:3 | | test.cpp:82:22:82:22 | y | test.cpp:83:11:83:11 | y | provenance | Sink:MaD:3 | | test.cpp:88:22:88:22 | y | test.cpp:89:11:89:11 | y | provenance | Sink:MaD:3 | -| test.cpp:94:10:94:18 | call to ymlSource | test.cpp:94:10:94:18 | call to ymlSource | provenance | Src:MaD:43 | +| test.cpp:94:10:94:18 | call to ymlSource | test.cpp:94:10:94:18 | call to ymlSource | provenance | Src:MaD:48 | | test.cpp:94:10:94:18 | call to ymlSource | test.cpp:97:26:97:26 | x | provenance | | | test.cpp:94:10:94:18 | call to ymlSource | test.cpp:101:26:101:26 | x | provenance | | | test.cpp:94:10:94:18 | call to ymlSource | test.cpp:103:63:103:63 | x | provenance | | | test.cpp:94:10:94:18 | call to ymlSource | test.cpp:104:62:104:62 | x | provenance | | -| test.cpp:97:26:97:26 | x | test.cpp:68:22:68:22 | y | provenance | MaD:74 | -| test.cpp:101:26:101:26 | x | test.cpp:74:22:74:22 | y | provenance | MaD:74 | -| test.cpp:103:63:103:63 | x | test.cpp:82:22:82:22 | y | provenance | MaD:74 | -| test.cpp:104:62:104:62 | x | test.cpp:88:22:88:22 | y | provenance | MaD:74 | -| test.cpp:114:10:114:18 | call to ymlSource | test.cpp:114:10:114:18 | call to ymlSource | provenance | Src:MaD:43 | +| test.cpp:97:26:97:26 | x | test.cpp:68:22:68:22 | y | provenance | MaD:79 | +| test.cpp:101:26:101:26 | x | test.cpp:74:22:74:22 | y | provenance | MaD:79 | +| test.cpp:103:63:103:63 | x | test.cpp:82:22:82:22 | y | provenance | MaD:79 | +| test.cpp:104:62:104:62 | x | test.cpp:88:22:88:22 | y | provenance | MaD:79 | +| test.cpp:114:10:114:18 | call to ymlSource | test.cpp:114:10:114:18 | call to ymlSource | provenance | Src:MaD:48 | | test.cpp:114:10:114:18 | call to ymlSource | test.cpp:118:44:118:44 | *x | provenance | | | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | provenance | | | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | test.cpp:119:10:119:11 | y2 | provenance | Sink:MaD:3 | -| test.cpp:118:44:118:44 | *x | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | provenance | MaD:75 | -| test.cpp:133:10:133:18 | call to ymlSource | test.cpp:133:10:133:18 | call to ymlSource | provenance | Src:MaD:43 | +| test.cpp:118:44:118:44 | *x | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | provenance | MaD:80 | +| test.cpp:133:10:133:18 | call to ymlSource | test.cpp:133:10:133:18 | call to ymlSource | provenance | Src:MaD:48 | | test.cpp:133:10:133:18 | call to ymlSource | test.cpp:134:45:134:45 | x | provenance | | | test.cpp:134:13:134:43 | call to templateFunction | test.cpp:134:13:134:43 | call to templateFunction | provenance | | | test.cpp:134:13:134:43 | call to templateFunction | test.cpp:135:10:135:10 | y | provenance | Sink:MaD:3 | -| test.cpp:134:45:134:45 | x | test.cpp:134:13:134:43 | call to templateFunction | provenance | MaD:86 | -| test.cpp:146:10:146:18 | call to ymlSource | test.cpp:146:10:146:18 | call to ymlSource | provenance | Src:MaD:43 | +| test.cpp:134:45:134:45 | x | test.cpp:134:13:134:43 | call to templateFunction | provenance | MaD:91 | +| test.cpp:146:10:146:18 | call to ymlSource | test.cpp:146:10:146:18 | call to ymlSource | provenance | Src:MaD:48 | | test.cpp:146:10:146:18 | call to ymlSource | test.cpp:148:26:148:26 | x | provenance | | | test.cpp:148:10:148:27 | call to function | test.cpp:148:10:148:27 | call to function | provenance | | | test.cpp:148:10:148:27 | call to function | test.cpp:149:10:149:10 | z | provenance | Sink:MaD:3 | -| test.cpp:148:26:148:26 | x | test.cpp:148:10:148:27 | call to function | provenance | MaD:87 | -| test.cpp:155:10:155:18 | call to ymlSource | test.cpp:155:10:155:18 | call to ymlSource | provenance | Src:MaD:43 | +| test.cpp:148:26:148:26 | x | test.cpp:148:10:148:27 | call to function | provenance | MaD:92 | +| test.cpp:155:10:155:18 | call to ymlSource | test.cpp:155:10:155:18 | call to ymlSource | provenance | Src:MaD:48 | | test.cpp:155:10:155:18 | call to ymlSource | test.cpp:157:26:157:26 | x | provenance | | | test.cpp:157:13:157:20 | call to function | test.cpp:157:13:157:20 | call to function | provenance | | | test.cpp:157:13:157:20 | call to function | test.cpp:158:10:158:10 | z | provenance | Sink:MaD:3 | -| test.cpp:157:26:157:26 | x | test.cpp:157:13:157:20 | call to function | provenance | MaD:87 | +| test.cpp:157:26:157:26 | x | test.cpp:157:13:157:20 | call to function | provenance | MaD:92 | | test.cpp:164:34:164:34 | x | test.cpp:165:69:165:69 | x | provenance | | | test.cpp:165:12:165:64 | call to templateFunction2 | test.cpp:164:7:164:7 | *templateFunction3 | provenance | | | test.cpp:165:12:165:64 | call to templateFunction2 | test.cpp:165:12:165:64 | call to templateFunction2 | provenance | | -| test.cpp:165:69:165:69 | x | test.cpp:165:12:165:64 | call to templateFunction2 | provenance | MaD:85 | -| test.cpp:170:10:170:18 | call to ymlSource | test.cpp:170:10:170:18 | call to ymlSource | provenance | Src:MaD:43 | +| test.cpp:165:69:165:69 | x | test.cpp:165:12:165:64 | call to templateFunction2 | provenance | MaD:90 | +| test.cpp:170:10:170:18 | call to ymlSource | test.cpp:170:10:170:18 | call to ymlSource | provenance | Src:MaD:48 | | test.cpp:170:10:170:18 | call to ymlSource | test.cpp:172:51:172:51 | x | provenance | | | test.cpp:172:13:172:44 | call to templateFunction3 | test.cpp:172:13:172:44 | call to templateFunction3 | provenance | | | test.cpp:172:13:172:44 | call to templateFunction3 | test.cpp:173:10:173:10 | y | provenance | Sink:MaD:3 | | test.cpp:172:51:172:51 | x | test.cpp:164:34:164:34 | x | provenance | | -| test.cpp:172:51:172:51 | x | test.cpp:172:13:172:44 | call to templateFunction3 | provenance | MaD:85 | +| test.cpp:172:51:172:51 | x | test.cpp:172:13:172:44 | call to templateFunction3 | provenance | MaD:90 | | test.cpp:186:2:186:2 | *s [post update] [myField] | test.cpp:187:33:187:34 | *& ... [myField] | provenance | | | test.cpp:186:2:186:24 | ... = ... | test.cpp:186:2:186:2 | *s [post update] [myField] | provenance | | -| test.cpp:186:14:186:22 | call to ymlSource | test.cpp:186:2:186:24 | ... = ... | provenance | Src:MaD:43 | +| test.cpp:186:14:186:22 | call to ymlSource | test.cpp:186:2:186:24 | ... = ... | provenance | Src:MaD:48 | | test.cpp:187:10:187:31 | call to read_field_from_struct | test.cpp:187:10:187:31 | call to read_field_from_struct | provenance | | | test.cpp:187:10:187:31 | call to read_field_from_struct | test.cpp:188:10:188:10 | x | provenance | Sink:MaD:3 | -| test.cpp:187:33:187:34 | *& ... [myField] | test.cpp:187:10:187:31 | call to read_field_from_struct | provenance | MaD:77 | +| test.cpp:187:33:187:34 | *& ... [myField] | test.cpp:187:10:187:31 | call to read_field_from_struct | provenance | MaD:82 | | test.cpp:199:2:199:2 | *s [post update] [myField] | test.cpp:200:35:200:36 | *& ... [myField] | provenance | | | test.cpp:199:2:199:24 | ... = ... | test.cpp:199:2:199:2 | *s [post update] [myField] | provenance | | -| test.cpp:199:14:199:22 | call to ymlSource | test.cpp:199:2:199:24 | ... = ... | provenance | Src:MaD:43 | +| test.cpp:199:14:199:22 | call to ymlSource | test.cpp:199:2:199:24 | ... = ... | provenance | Src:MaD:48 | | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | provenance | | | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | test.cpp:201:10:201:10 | x | provenance | Sink:MaD:3 | -| test.cpp:200:35:200:36 | *& ... [myField] | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | provenance | MaD:78 | +| test.cpp:200:35:200:36 | *& ... [myField] | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | provenance | MaD:83 | | test.cpp:216:3:216:4 | get_ptr output argument [value] | test.cpp:217:11:217:12 | *rf [value] | provenance | | -| test.cpp:216:3:216:28 | ... = ... | test.cpp:216:3:216:4 | get_ptr output argument [value] | provenance | MaD:84 | -| test.cpp:216:18:216:26 | call to ymlSource | test.cpp:216:3:216:28 | ... = ... | provenance | Src:MaD:43 | +| test.cpp:216:3:216:28 | ... = ... | test.cpp:216:3:216:4 | get_ptr output argument [value] | provenance | MaD:89 | +| test.cpp:216:18:216:26 | call to ymlSource | test.cpp:216:3:216:28 | ... = ... | provenance | Src:MaD:48 | | test.cpp:217:11:217:12 | *rf [value] | test.cpp:217:14:217:18 | value | provenance | | | test.cpp:217:14:217:18 | value | test.cpp:217:14:217:18 | value | provenance | | | test.cpp:217:14:217:18 | value | test.cpp:218:11:218:11 | x | provenance | Sink:MaD:3 | | test.cpp:222:3:222:3 | operator[] output argument | test.cpp:223:12:223:12 | *s | provenance | | -| test.cpp:222:3:222:20 | ... = ... | test.cpp:222:3:222:3 | operator[] output argument | provenance | MaD:83 | -| test.cpp:222:10:222:18 | call to ymlSource | test.cpp:222:3:222:20 | ... = ... | provenance | Src:MaD:43 | -| test.cpp:223:12:223:12 | *s | test.cpp:223:13:223:15 | call to operator[] | provenance | MaD:82 | +| test.cpp:222:3:222:20 | ... = ... | test.cpp:222:3:222:3 | operator[] output argument | provenance | MaD:88 | +| test.cpp:222:10:222:18 | call to ymlSource | test.cpp:222:3:222:20 | ... = ... | provenance | Src:MaD:48 | +| test.cpp:223:12:223:12 | *s | test.cpp:223:13:223:15 | call to operator[] | provenance | MaD:87 | | test.cpp:223:13:223:15 | call to operator[] | test.cpp:223:13:223:15 | call to operator[] | provenance | | | test.cpp:223:13:223:15 | call to operator[] | test.cpp:224:11:224:11 | c | provenance | Sink:MaD:3 | | test.cpp:243:10:243:10 | *s [value] | test.cpp:243:13:243:17 | value | provenance | | | test.cpp:243:13:243:17 | value | test.cpp:243:13:243:17 | value | provenance | Sink:MaD:3 | -| test.cpp:247:26:247:39 | call to ymlFieldSource | test.cpp:247:26:247:39 | call to ymlFieldSource [value] | provenance | Src:MaD:42 | +| test.cpp:247:26:247:39 | call to ymlFieldSource | test.cpp:247:26:247:39 | call to ymlFieldSource [value] | provenance | Src:MaD:47 | | test.cpp:247:26:247:39 | call to ymlFieldSource [value] | test.cpp:248:10:248:16 | *wrapper [value] | provenance | | | test.cpp:248:10:248:16 | *wrapper [value] | test.cpp:248:18:248:22 | value | provenance | | | test.cpp:248:18:248:22 | value | test.cpp:248:18:248:22 | value | provenance | Sink:MaD:3 | @@ -265,13 +270,13 @@ edges | test.cpp:293:5:293:26 | *callback_returning_int | test.cpp:307:10:307:31 | call to callback_returning_int | provenance | | | test.cpp:294:5:294:28 | *callback_returning_int_2 | test.cpp:310:10:310:33 | call to callback_returning_int_2 | provenance | | | test.cpp:295:6:295:31 | **callback_returning_ptr_int | test.cpp:313:13:313:38 | *call to callback_returning_ptr_int | provenance | | -| test.cpp:297:33:297:41 | call to ymlSource | test.cpp:297:33:297:41 | call to ymlSource | provenance | Src:MaD:43 | +| test.cpp:297:33:297:41 | call to ymlSource | test.cpp:297:33:297:41 | call to ymlSource | provenance | Src:MaD:48 | | test.cpp:297:33:297:41 | call to ymlSource | test.cpp:318:37:318:52 | return_ymlSource | provenance | Sink:MaD:1 | -| test.cpp:297:33:297:41 | call to ymlSource | test.cpp:318:37:318:52 | return_ymlSource | provenance | Src:MaD:43 Sink:MaD:1 | +| test.cpp:297:33:297:41 | call to ymlSource | test.cpp:318:37:318:52 | return_ymlSource | provenance | Src:MaD:48 Sink:MaD:1 | | test.cpp:299:41:299:52 | *call to ymlSourcePtr | test.cpp:321:36:321:58 | return_ptr_to_ymlSource | provenance | Sink:MaD:2 | -| test.cpp:299:41:299:52 | call to ymlSourcePtr | test.cpp:299:41:299:52 | *call to ymlSourcePtr | provenance | Src:MaD:44 | -| test.cpp:299:41:299:52 | call to ymlSourcePtr | test.cpp:321:36:321:58 | return_ptr_to_ymlSource | provenance | Src:MaD:44 Sink:MaD:2 | -| test.cpp:304:11:304:22 | call to ymlSourcePtr | test.cpp:304:10:304:24 | * ... | provenance | Src:MaD:44 Sink:MaD:3 | +| test.cpp:299:41:299:52 | call to ymlSourcePtr | test.cpp:299:41:299:52 | *call to ymlSourcePtr | provenance | Src:MaD:49 | +| test.cpp:299:41:299:52 | call to ymlSourcePtr | test.cpp:321:36:321:58 | return_ptr_to_ymlSource | provenance | Src:MaD:49 Sink:MaD:2 | +| test.cpp:304:11:304:22 | call to ymlSourcePtr | test.cpp:304:10:304:24 | * ... | provenance | Src:MaD:49 Sink:MaD:3 | | test.cpp:306:39:306:60 | source_from_callback_return_template output argument | test.cpp:293:5:293:26 | *callback_returning_int | provenance | Src:MaD:39 | | test.cpp:307:10:307:31 | call to callback_returning_int | test.cpp:307:10:307:31 | call to callback_returning_int | provenance | Sink:MaD:3 | | test.cpp:309:34:309:57 | source_from_callback_return_ptr output argument | test.cpp:294:5:294:28 | *callback_returning_int_2 | provenance | Src:MaD:38 | @@ -280,17 +285,30 @@ edges | test.cpp:313:13:313:38 | *call to callback_returning_ptr_int | test.cpp:313:13:313:38 | *call to callback_returning_ptr_int | provenance | | | test.cpp:313:13:313:38 | *call to callback_returning_ptr_int | test.cpp:315:10:315:13 | * ... | provenance | Sink:MaD:3 | | test.cpp:317:51:317:59 | call to ymlSource | test.cpp:317:37:317:64 | [...](...){...} | provenance | Sink:MaD:1 | -| test.cpp:317:51:317:59 | call to ymlSource | test.cpp:317:37:317:64 | [...](...){...} | provenance | Src:MaD:43 Sink:MaD:1 | -| test.cpp:317:51:317:59 | call to ymlSource | test.cpp:317:51:317:59 | call to ymlSource | provenance | Src:MaD:43 | +| test.cpp:317:51:317:59 | call to ymlSource | test.cpp:317:37:317:64 | [...](...){...} | provenance | Src:MaD:48 Sink:MaD:1 | +| test.cpp:317:51:317:59 | call to ymlSource | test.cpp:317:51:317:59 | call to ymlSource | provenance | Src:MaD:48 | | test.cpp:320:50:320:61 | *call to ymlSourcePtr | test.cpp:320:36:320:36 | call to operator int *(*)() | provenance | Sink:MaD:2 | -| test.cpp:320:50:320:61 | call to ymlSourcePtr | test.cpp:320:36:320:36 | call to operator int *(*)() | provenance | Src:MaD:44 Sink:MaD:2 | -| test.cpp:320:50:320:61 | call to ymlSourcePtr | test.cpp:320:50:320:61 | *call to ymlSourcePtr | provenance | Src:MaD:44 | +| test.cpp:320:50:320:61 | call to ymlSourcePtr | test.cpp:320:36:320:36 | call to operator int *(*)() | provenance | Src:MaD:49 Sink:MaD:2 | +| test.cpp:320:50:320:61 | call to ymlSourcePtr | test.cpp:320:50:320:61 | *call to ymlSourcePtr | provenance | Src:MaD:49 | +| test.cpp:324:36:324:36 | p | test.cpp:325:10:325:10 | *p [value] | provenance | Src:MaD:43 | +| test.cpp:324:36:324:36 | p | test.cpp:327:11:327:11 | *p [*pointer] | provenance | Src:MaD:42 | +| test.cpp:324:53:324:53 | s | test.cpp:329:10:329:10 | *s [value] | provenance | Src:MaD:46 | +| test.cpp:324:53:324:53 | s | test.cpp:331:11:331:11 | *s [*pointer] | provenance | Src:MaD:45 | +| test.cpp:324:61:324:66 | source | test.cpp:334:10:334:16 | * ... | provenance | Src:MaD:44 Sink:MaD:3 | +| test.cpp:325:10:325:10 | *p [value] | test.cpp:325:13:325:17 | value | provenance | | +| test.cpp:325:13:325:17 | value | test.cpp:325:13:325:17 | value | provenance | Sink:MaD:3 | +| test.cpp:327:10:327:20 | * ... | test.cpp:327:10:327:20 | * ... | provenance | Sink:MaD:3 | +| test.cpp:327:11:327:11 | *p [*pointer] | test.cpp:327:10:327:20 | * ... | provenance | | +| test.cpp:329:10:329:10 | *s [value] | test.cpp:329:12:329:16 | value | provenance | | +| test.cpp:329:12:329:16 | value | test.cpp:329:12:329:16 | value | provenance | Sink:MaD:3 | +| test.cpp:331:10:331:19 | * ... | test.cpp:331:10:331:19 | * ... | provenance | Sink:MaD:3 | +| test.cpp:331:11:331:11 | *s [*pointer] | test.cpp:331:10:331:19 | * ... | provenance | | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:24:8:24:11 | * ... | provenance | | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:27:36:27:38 | *cmd | provenance | | | windows.cpp:22:15:22:29 | call to GetCommandLineA | windows.cpp:22:15:22:29 | *call to GetCommandLineA | provenance | Src:MaD:5 | | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | provenance | | | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | windows.cpp:30:8:30:15 | * ... | provenance | | -| windows.cpp:27:36:27:38 | *cmd | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | provenance | MaD:54 | +| windows.cpp:27:36:27:38 | *cmd | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | provenance | MaD:59 | | windows.cpp:34:17:34:38 | *call to GetEnvironmentStringsA | windows.cpp:36:10:36:13 | * ... | provenance | | | windows.cpp:34:17:34:38 | call to GetEnvironmentStringsA | windows.cpp:34:17:34:38 | *call to GetEnvironmentStringsA | provenance | Src:MaD:6 | | windows.cpp:39:36:39:38 | GetEnvironmentVariableA output argument | windows.cpp:41:10:41:13 | * ... | provenance | Src:MaD:7 | @@ -310,11 +328,11 @@ edges | windows.cpp:189:21:189:26 | ReadFile output argument | windows.cpp:190:5:190:56 | *... = ... | provenance | Src:MaD:19 | | windows.cpp:190:5:190:14 | *overlapped [post update] [*hEvent] | windows.cpp:192:53:192:63 | *& ... [*hEvent] | provenance | | | windows.cpp:190:5:190:56 | *... = ... | windows.cpp:190:5:190:14 | *overlapped [post update] [*hEvent] | provenance | | -| windows.cpp:192:53:192:63 | *& ... [*hEvent] | windows.cpp:147:16:147:27 | *lpOverlapped [*hEvent] | provenance | MaD:61 | +| windows.cpp:192:53:192:63 | *& ... [*hEvent] | windows.cpp:147:16:147:27 | *lpOverlapped [*hEvent] | provenance | MaD:66 | | windows.cpp:198:21:198:26 | ReadFile output argument | windows.cpp:199:5:199:57 | ... = ... | provenance | Src:MaD:19 | | windows.cpp:199:5:199:14 | *overlapped [post update] [hEvent] | windows.cpp:201:53:201:63 | *& ... [hEvent] | provenance | | | windows.cpp:199:5:199:57 | ... = ... | windows.cpp:199:5:199:14 | *overlapped [post update] [hEvent] | provenance | | -| windows.cpp:201:53:201:63 | *& ... [hEvent] | windows.cpp:157:16:157:27 | *lpOverlapped [hEvent] | provenance | MaD:61 | +| windows.cpp:201:53:201:63 | *& ... [hEvent] | windows.cpp:157:16:157:27 | *lpOverlapped [hEvent] | provenance | MaD:66 | | windows.cpp:209:84:209:89 | NtReadFile output argument | windows.cpp:211:10:211:16 | * ... | provenance | Src:MaD:18 | | windows.cpp:286:23:286:35 | *call to MapViewOfFile | windows.cpp:287:20:287:52 | *pMapView | provenance | | | windows.cpp:286:23:286:35 | call to MapViewOfFile | windows.cpp:286:23:286:35 | *call to MapViewOfFile | provenance | Src:MaD:14 | @@ -351,9 +369,9 @@ edges | windows.cpp:431:3:431:3 | *s [post update] [x] | windows.cpp:464:7:464:8 | *& ... [x] | provenance | | | windows.cpp:431:3:431:16 | ... = ... | windows.cpp:431:3:431:3 | *s [post update] [x] | provenance | | | windows.cpp:431:9:431:14 | call to source | windows.cpp:431:3:431:16 | ... = ... | provenance | | -| windows.cpp:439:7:439:8 | *& ... [x] | windows.cpp:403:26:403:36 | *lpParameter [x] | provenance | MaD:57 | -| windows.cpp:451:7:451:8 | *& ... [x] | windows.cpp:410:26:410:36 | *lpParameter [x] | provenance | MaD:55 | -| windows.cpp:464:7:464:8 | *& ... [x] | windows.cpp:417:26:417:36 | *lpParameter [x] | provenance | MaD:56 | +| windows.cpp:439:7:439:8 | *& ... [x] | windows.cpp:403:26:403:36 | *lpParameter [x] | provenance | MaD:62 | +| windows.cpp:451:7:451:8 | *& ... [x] | windows.cpp:410:26:410:36 | *lpParameter [x] | provenance | MaD:60 | +| windows.cpp:464:7:464:8 | *& ... [x] | windows.cpp:417:26:417:36 | *lpParameter [x] | provenance | MaD:61 | | windows.cpp:533:11:533:16 | call to source | windows.cpp:533:11:533:16 | call to source | provenance | | | windows.cpp:533:11:533:16 | call to source | windows.cpp:537:40:537:41 | *& ... | provenance | | | windows.cpp:533:11:533:16 | call to source | windows.cpp:542:38:542:39 | *& ... | provenance | | @@ -362,30 +380,30 @@ edges | windows.cpp:533:11:533:16 | call to source | windows.cpp:568:32:568:33 | *& ... | provenance | | | windows.cpp:533:11:533:16 | call to source | windows.cpp:573:40:573:41 | *& ... | provenance | | | windows.cpp:537:27:537:37 | RtlCopyVolatileMemory output argument | windows.cpp:538:10:538:23 | access to array | provenance | | -| windows.cpp:537:40:537:41 | *& ... | windows.cpp:537:27:537:37 | RtlCopyVolatileMemory output argument | provenance | MaD:66 | +| windows.cpp:537:40:537:41 | *& ... | windows.cpp:537:27:537:37 | RtlCopyVolatileMemory output argument | provenance | MaD:71 | | windows.cpp:542:25:542:35 | RtlCopyDeviceMemory output argument | windows.cpp:543:10:543:23 | access to array | provenance | | -| windows.cpp:542:38:542:39 | *& ... | windows.cpp:542:25:542:35 | RtlCopyDeviceMemory output argument | provenance | MaD:62 | +| windows.cpp:542:38:542:39 | *& ... | windows.cpp:542:25:542:35 | RtlCopyDeviceMemory output argument | provenance | MaD:67 | | windows.cpp:547:19:547:29 | RtlCopyMemory output argument | windows.cpp:548:10:548:23 | access to array | provenance | | -| windows.cpp:547:32:547:33 | *& ... | windows.cpp:547:19:547:29 | RtlCopyMemory output argument | provenance | MaD:63 | +| windows.cpp:547:32:547:33 | *& ... | windows.cpp:547:19:547:29 | RtlCopyMemory output argument | provenance | MaD:68 | | windows.cpp:552:30:552:40 | RtlCopyMemoryNonTemporal output argument | windows.cpp:553:10:553:23 | access to array | provenance | | -| windows.cpp:552:43:552:44 | *& ... | windows.cpp:552:30:552:40 | RtlCopyMemoryNonTemporal output argument | provenance | MaD:64 | +| windows.cpp:552:43:552:44 | *& ... | windows.cpp:552:30:552:40 | RtlCopyMemoryNonTemporal output argument | provenance | MaD:69 | | windows.cpp:559:5:559:24 | ... = ... | windows.cpp:561:39:561:44 | *buffer | provenance | | | windows.cpp:559:17:559:24 | call to source | windows.cpp:559:5:559:24 | ... = ... | provenance | | | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | windows.cpp:562:10:562:19 | *src_string [*Buffer] | provenance | | | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | windows.cpp:563:40:563:50 | *& ... [*Buffer] | provenance | | -| windows.cpp:561:39:561:44 | *buffer | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | provenance | MaD:67 | +| windows.cpp:561:39:561:44 | *buffer | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | provenance | MaD:72 | | windows.cpp:562:10:562:19 | *src_string [*Buffer] | windows.cpp:562:10:562:29 | access to array | provenance | | | windows.cpp:562:10:562:19 | *src_string [*Buffer] | windows.cpp:562:21:562:26 | *Buffer | provenance | | | windows.cpp:562:21:562:26 | *Buffer | windows.cpp:562:10:562:29 | access to array | provenance | | | windows.cpp:563:26:563:37 | RtlCopyUnicodeString output argument [*Buffer] | windows.cpp:564:10:564:20 | *dest_string [*Buffer] | provenance | | -| windows.cpp:563:40:563:50 | *& ... [*Buffer] | windows.cpp:563:26:563:37 | RtlCopyUnicodeString output argument [*Buffer] | provenance | MaD:65 | +| windows.cpp:563:40:563:50 | *& ... [*Buffer] | windows.cpp:563:26:563:37 | RtlCopyUnicodeString output argument [*Buffer] | provenance | MaD:70 | | windows.cpp:564:10:564:20 | *dest_string [*Buffer] | windows.cpp:564:10:564:30 | access to array | provenance | | | windows.cpp:564:10:564:20 | *dest_string [*Buffer] | windows.cpp:564:22:564:27 | *Buffer | provenance | | | windows.cpp:564:22:564:27 | *Buffer | windows.cpp:564:10:564:30 | access to array | provenance | | | windows.cpp:568:19:568:29 | RtlMoveMemory output argument | windows.cpp:569:10:569:23 | access to array | provenance | | -| windows.cpp:568:32:568:33 | *& ... | windows.cpp:568:19:568:29 | RtlMoveMemory output argument | provenance | MaD:68 | +| windows.cpp:568:32:568:33 | *& ... | windows.cpp:568:19:568:29 | RtlMoveMemory output argument | provenance | MaD:73 | | windows.cpp:573:27:573:37 | RtlMoveVolatileMemory output argument | windows.cpp:574:10:574:23 | access to array | provenance | | -| windows.cpp:573:40:573:41 | *& ... | windows.cpp:573:27:573:37 | RtlMoveVolatileMemory output argument | provenance | MaD:69 | +| windows.cpp:573:40:573:41 | *& ... | windows.cpp:573:27:573:37 | RtlMoveVolatileMemory output argument | provenance | MaD:74 | | windows.cpp:645:45:645:50 | WinHttpReadData output argument | windows.cpp:647:10:647:16 | * ... | provenance | Src:MaD:35 | | windows.cpp:652:48:652:53 | WinHttpReadDataEx output argument | windows.cpp:654:10:654:16 | * ... | provenance | Src:MaD:36 | | windows.cpp:659:47:659:52 | WinHttpQueryHeaders output argument | windows.cpp:661:10:661:16 | * ... | provenance | Src:MaD:31 | @@ -394,7 +412,7 @@ edges | windows.cpp:669:105:669:112 | WinHttpQueryHeadersEx output argument | windows.cpp:675:10:675:27 | * ... | provenance | Src:MaD:32 | | windows.cpp:728:5:728:28 | ... = ... | windows.cpp:729:35:729:35 | *x | provenance | | | windows.cpp:728:12:728:28 | call to source | windows.cpp:728:5:728:28 | ... = ... | provenance | | -| windows.cpp:729:35:729:35 | *x | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | provenance | MaD:73 | +| windows.cpp:729:35:729:35 | *x | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | provenance | MaD:78 | | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | windows.cpp:731:10:731:36 | * ... | provenance | | | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | windows.cpp:733:10:733:35 | * ... | provenance | | | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | windows.cpp:735:10:735:37 | * ... | provenance | | @@ -429,35 +447,35 @@ edges | windows.cpp:1087:71:1087:74 | RegEnumValueW output argument | windows.cpp:1089:10:1089:14 | * ... | provenance | Src:MaD:22 | | windows.cpp:1122:5:1122:27 | ... = ... | windows.cpp:1124:19:1124:21 | *str | provenance | | | windows.cpp:1122:14:1122:27 | call to source | windows.cpp:1122:5:1122:27 | ... = ... | provenance | | -| windows.cpp:1124:19:1124:21 | *str | windows.cpp:1124:24:1124:27 | IIDFromString output argument | provenance | MaD:59 | +| windows.cpp:1124:19:1124:21 | *str | windows.cpp:1124:24:1124:27 | IIDFromString output argument | provenance | MaD:64 | | windows.cpp:1124:24:1124:27 | IIDFromString output argument | windows.cpp:1125:10:1125:12 | iid | provenance | | | windows.cpp:1128:15:1128:20 | call to source | windows.cpp:1128:15:1128:20 | call to source | provenance | | | windows.cpp:1128:15:1128:20 | call to source | windows.cpp:1130:19:1130:21 | *iid | provenance | | -| windows.cpp:1130:19:1130:21 | *iid | windows.cpp:1130:24:1130:27 | StringFromIID output argument | provenance | MaD:72 | +| windows.cpp:1130:19:1130:21 | *iid | windows.cpp:1130:24:1130:27 | StringFromIID output argument | provenance | MaD:77 | | windows.cpp:1130:24:1130:27 | StringFromIID output argument | windows.cpp:1132:10:1132:13 | * ... | provenance | | | windows.cpp:1135:19:1135:24 | call to source | windows.cpp:1135:19:1135:24 | call to source | provenance | | | windows.cpp:1135:19:1135:24 | call to source | windows.cpp:1137:21:1137:25 | *clsid | provenance | | -| windows.cpp:1137:21:1137:25 | *clsid | windows.cpp:1137:28:1137:31 | ProgIDFromCLSID output argument | provenance | MaD:60 | +| windows.cpp:1137:21:1137:25 | *clsid | windows.cpp:1137:28:1137:31 | ProgIDFromCLSID output argument | provenance | MaD:65 | | windows.cpp:1137:28:1137:31 | ProgIDFromCLSID output argument | windows.cpp:1139:10:1139:13 | * ... | provenance | | | windows.cpp:1143:5:1143:30 | ... = ... | windows.cpp:1145:21:1145:26 | *progID | provenance | | | windows.cpp:1143:17:1143:30 | call to source | windows.cpp:1143:5:1143:30 | ... = ... | provenance | | -| windows.cpp:1145:21:1145:26 | *progID | windows.cpp:1145:29:1145:34 | CLSIDFromProgID output argument | provenance | MaD:52 | +| windows.cpp:1145:21:1145:26 | *progID | windows.cpp:1145:29:1145:34 | CLSIDFromProgID output argument | provenance | MaD:57 | | windows.cpp:1145:29:1145:34 | CLSIDFromProgID output argument | windows.cpp:1146:10:1146:14 | clsid | provenance | | | windows.cpp:1150:5:1150:27 | ... = ... | windows.cpp:1152:21:1152:23 | *str | provenance | | | windows.cpp:1150:14:1150:27 | call to source | windows.cpp:1150:5:1150:27 | ... = ... | provenance | | -| windows.cpp:1152:21:1152:23 | *str | windows.cpp:1152:26:1152:31 | CLSIDFromString output argument | provenance | MaD:53 | +| windows.cpp:1152:21:1152:23 | *str | windows.cpp:1152:26:1152:31 | CLSIDFromString output argument | provenance | MaD:58 | | windows.cpp:1152:26:1152:31 | CLSIDFromString output argument | windows.cpp:1153:10:1153:14 | clsid | provenance | | | windows.cpp:1156:19:1156:24 | call to source | windows.cpp:1156:19:1156:24 | call to source | provenance | | | windows.cpp:1156:19:1156:24 | call to source | windows.cpp:1158:21:1158:25 | *clsid | provenance | | -| windows.cpp:1158:21:1158:25 | *clsid | windows.cpp:1158:28:1158:31 | StringFromCLSID output argument | provenance | MaD:70 | +| windows.cpp:1158:21:1158:25 | *clsid | windows.cpp:1158:28:1158:31 | StringFromCLSID output argument | provenance | MaD:75 | | windows.cpp:1158:28:1158:31 | StringFromCLSID output argument | windows.cpp:1160:10:1160:13 | * ... | provenance | | | windows.cpp:1164:5:1164:27 | ... = ... | windows.cpp:1166:20:1166:22 | *str | provenance | | | windows.cpp:1164:14:1164:27 | call to source | windows.cpp:1164:5:1164:27 | ... = ... | provenance | | -| windows.cpp:1166:20:1166:22 | *str | windows.cpp:1166:25:1166:29 | GUIDFromString output argument | provenance | MaD:58 | +| windows.cpp:1166:20:1166:22 | *str | windows.cpp:1166:25:1166:29 | GUIDFromString output argument | provenance | MaD:63 | | windows.cpp:1166:25:1166:29 | GUIDFromString output argument | windows.cpp:1167:10:1167:13 | guid | provenance | | | windows.cpp:1170:17:1170:22 | call to source | windows.cpp:1170:17:1170:22 | call to source | provenance | | | windows.cpp:1170:17:1170:22 | call to source | windows.cpp:1172:21:1172:24 | *guid | provenance | | -| windows.cpp:1172:21:1172:24 | *guid | windows.cpp:1172:27:1172:29 | StringFromGUID2 output argument | provenance | MaD:71 | +| windows.cpp:1172:21:1172:24 | *guid | windows.cpp:1172:27:1172:29 | StringFromGUID2 output argument | provenance | MaD:76 | | windows.cpp:1172:27:1172:29 | StringFromGUID2 output argument | windows.cpp:1174:10:1174:13 | * ... | provenance | | nodes | asio_streams.cpp:87:34:87:44 | read_until output argument | semmle.label | read_until output argument | @@ -681,6 +699,24 @@ nodes | test.cpp:320:50:320:61 | *call to ymlSourcePtr | semmle.label | *call to ymlSourcePtr | | test.cpp:320:50:320:61 | call to ymlSourcePtr | semmle.label | call to ymlSourcePtr | | test.cpp:321:36:321:58 | return_ptr_to_ymlSource | semmle.label | return_ptr_to_ymlSource | +| test.cpp:324:36:324:36 | p | semmle.label | p | +| test.cpp:324:36:324:36 | p | semmle.label | p | +| test.cpp:324:53:324:53 | s | semmle.label | s | +| test.cpp:324:53:324:53 | s | semmle.label | s | +| test.cpp:324:61:324:66 | source | semmle.label | source | +| test.cpp:325:10:325:10 | *p [value] | semmle.label | *p [value] | +| test.cpp:325:13:325:17 | value | semmle.label | value | +| test.cpp:325:13:325:17 | value | semmle.label | value | +| test.cpp:327:10:327:20 | * ... | semmle.label | * ... | +| test.cpp:327:10:327:20 | * ... | semmle.label | * ... | +| test.cpp:327:11:327:11 | *p [*pointer] | semmle.label | *p [*pointer] | +| test.cpp:329:10:329:10 | *s [value] | semmle.label | *s [value] | +| test.cpp:329:12:329:16 | value | semmle.label | value | +| test.cpp:329:12:329:16 | value | semmle.label | value | +| test.cpp:331:10:331:19 | * ... | semmle.label | * ... | +| test.cpp:331:10:331:19 | * ... | semmle.label | * ... | +| test.cpp:331:11:331:11 | *s [*pointer] | semmle.label | *s [*pointer] | +| test.cpp:334:10:334:16 | * ... | semmle.label | * ... | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | semmle.label | *call to GetCommandLineA | | windows.cpp:22:15:22:29 | call to GetCommandLineA | semmle.label | call to GetCommandLineA | | windows.cpp:24:8:24:11 | * ... | semmle.label | * ... | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml b/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml index 134aeb018822..0db87b5da615 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml @@ -11,6 +11,11 @@ extensions: - ["", "", False, "source_from_callback_return_template", "", "", "Argument[0].ReturnValue", "local", "manual"] - ["", "", False, "source_from_callback_return_ptr", "", "", "Argument[0].ReturnValue", "local", "manual"] - ["", "", False, "source_ptr_from_callback_return_ptr", "", "", "Argument[0].ReturnValue[*]", "local", "manual"] + - ["", "", False, "test_parameter", "", "", "Parameter[*0].Field[SourceWrapper::value]", "local", "manual"] + - ["", "", False, "test_parameter", "", "", "Parameter[*0].Field[*SourceWrapper::pointer]", "local", "manual"] + - ["", "", False, "test_parameter", "", "", "Parameter[1].Field[*SourceWrapper::pointer]", "local", "manual"] + - ["", "", False, "test_parameter", "", "", "Parameter[1].Field[SourceWrapper::value]", "local", "manual"] + - ["", "", False, "test_parameter", "", "", "Parameter[*2]", "local", "manual"] - addsTo: pack: codeql/cpp-all extensible: sinkModel diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected index ed6a05517497..5851e825013d 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected @@ -35,3 +35,11 @@ | test.cpp:310:10:310:33 | call to callback_returning_int_2 | test-sink | | test.cpp:314:15:314:17 | ptr | test-sink | | test.cpp:315:10:315:13 | * ... | test-sink | +| test.cpp:325:13:325:17 | value | test-sink | +| test.cpp:326:18:326:24 | pointer | test-sink | +| test.cpp:327:10:327:20 | * ... | test-sink | +| test.cpp:329:12:329:16 | value | test-sink | +| test.cpp:330:17:330:23 | pointer | test-sink | +| test.cpp:331:10:331:19 | * ... | test-sink | +| test.cpp:333:15:333:20 | source | test-sink | +| test.cpp:334:10:334:16 | * ... | test-sink | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp index ba189200b193..739c36bc67d3 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp @@ -227,7 +227,7 @@ void test_reverse_flow(unsigned i, unsigned j) { struct SourceWrapper { - int value; + int value; int* pointer; }; SourceWrapper ymlFieldSource(); @@ -319,4 +319,17 @@ void test_callback_return_access_paths() { sink_ptr_from_callback_return_ptr([]() { return ymlSourcePtr(); }); // $ ir sink_ptr_from_callback_return_ptr(return_ptr_to_ymlSource); // $ ir +} + +void test_parameter(SourceWrapper* p, SourceWrapper s, int* source) { + ymlSink(p->value); // $ ir + ymlSink((int)p->pointer); // clean + ymlSink(*p->pointer); // $ ir + + ymlSink(s.value); // $ ir + ymlSink((int)s.pointer); // clean + ymlSink(*s.pointer); // $ ir + + ymlSink((int)source); // clean + ymlSink(*source); // $ ir } \ No newline at end of file From 0f1fd7f33894812296d3e531ae0f0db953c564ba Mon Sep 17 00:00:00 2001 From: Jeroen Ketema <93738568+jketema@users.noreply.github.com> Date: Tue, 11 Aug 2026 15:40:13 +0000 Subject: [PATCH 0482/2098] Unified: Make Linux build hermetic --- BUILD.bazel | 8 + MODULE.bazel | 3 +- .../patches/external_static_runtime.patch | 242 ++++++++++++++++++ .../4.0.0-rc5-codeql.1/source.json | 3 +- unified/BUILD.bazel | 5 +- unified/extractor/BUILD.bazel | 10 +- unified/swift-syntax-rs/BUILD.bazel | 83 +++--- unified/swift-syntax-rs/swift_runtime.bzl | 19 -- .../swift-syntax-rs/swift_runtime_linking.bzl | 11 - 9 files changed, 308 insertions(+), 76 deletions(-) create mode 100644 misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/patches/external_static_runtime.patch delete mode 100644 unified/swift-syntax-rs/swift_runtime.bzl delete mode 100644 unified/swift-syntax-rs/swift_runtime_linking.bzl diff --git a/BUILD.bazel b/BUILD.bazel index b2e4ea806785..07027f4ad9a7 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -3,3 +3,11 @@ exports_files([ "Cargo.lock", "Cargo.toml", ]) + +constraint_setting(name = "swift_runtime_linkage") + +constraint_value( + name = "static_swift_runtime", + constraint_setting = ":swift_runtime_linkage", + visibility = ["//visibility:public"], +) diff --git a/MODULE.bazel b/MODULE.bazel index 91c871445eb4..6184b8c49cac 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -228,7 +228,7 @@ use_repo( # `unified/swift-syntax-rs` package is not loadable in that context. Keep this # in sync with `unified/swift-syntax-rs/.swift-version` (used by the `cargo` # build) and the `swift-syntax` release in `swift/Package.swift`. -swift = use_extension("@rules_swift//swift:extensions.bzl", "swift") +swift = use_extension("@rules_swift//swift:extensions.bzl", "swift", dev_dependency = True) swift.toolchain( name = "swift_toolchain", swift_version = "6.3.3", @@ -243,6 +243,7 @@ use_repo( register_toolchains( "@swift_toolchain//:swift_toolchain_exec_ubuntu22.04", "@swift_toolchain//:swift_toolchain_exec_xcode", + dev_dependency = True, ) node = use_extension("@rules_nodejs//nodejs:extensions.bzl", "node") diff --git a/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/patches/external_static_runtime.patch b/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/patches/external_static_runtime.patch new file mode 100644 index 000000000000..11f32aacd257 --- /dev/null +++ b/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/patches/external_static_runtime.patch @@ -0,0 +1,242 @@ +diff --git a/swift/extensions.bzl b/swift/extensions.bzl +index b77f636..1255ba7 100644 +--- a/swift/extensions.bzl ++++ b/swift/extensions.bzl +@@ -191,6 +191,7 @@ def _standalone_toolchain_impl(module_ctx): + name = repository_name, + sha256 = sha256, + platform = platform, ++ static_runtime = toolchain.static_runtime if platform != "xcode" else None, + swift_version = swift_version, + ) + toolchains_build_file_content += toolchains_for_platform( +@@ -266,6 +267,9 @@ their hashes. For instance: + `bazel run @rules_swift//tools/swift-releases -- list 6.2.4` + """, + ), ++ "static_runtime": attr.label( ++ doc = "External static runtime package to attach to the generated execution toolchains.", ++ ), + "swift_version": attr.string(doc = "Version of the swift toolchain to be installed. Cannot be used concurrently with `swift_version_file`"), + "swift_version_file": attr.label(doc = "A label to the .swift_version file to use. Cannot be used concurrently with `swift_version`"), + }) +diff --git a/swift/internal/extensions/standalone_toolchain.bzl b/swift/internal/extensions/standalone_toolchain.bzl +index a1e09ea..1fcf56d 100644 +--- a/swift/internal/extensions/standalone_toolchain.bzl ++++ b/swift/internal/extensions/standalone_toolchain.bzl +@@ -105,6 +105,9 @@ def _standalone_toolchain_impl(repository_ctx): + "BUILD.bazel", + repository_ctx.attr._build_template, + substitutions = { ++ "{external_static_runtime}": ( ++ ' external_static_runtime = "{}",'.format(repository_ctx.attr.static_runtime) if repository_ctx.attr.static_runtime else "" ++ ), + "{macos_sdkroot}": macos_sdkroot, + "{swift_version}": repository_ctx.attr.swift_version, + }, +@@ -121,6 +124,9 @@ _STANDALONE_TOOLCHAIN_ATTRS = { + "sha256": attr.string( + doc = "The expected SHA-256 of the file downloaded. This must match the SHA-256 of the file downloaded.", + ), ++ "static_runtime": attr.label( ++ doc = "External static runtime package used by this execution toolchain.", ++ ), + "swift_version": attr.string( + doc = "Version of the swift toolchain to be installed.", + mandatory = True, +diff --git a/swift/internal/extensions/toolchain.BUILD b/swift/internal/extensions/toolchain.BUILD +index 1304dc2..ee77866 100644 +--- a/swift/internal/extensions/toolchain.BUILD ++++ b/swift/internal/extensions/toolchain.BUILD +@@ -364,6 +364,7 @@ swift_toolchain( + ), + "//conditions:default": [], + }), ++{external_static_runtime} + swift_tools = "tools", + version_file = ".swift-version", + ) +diff --git a/swift/toolchains/BUILD b/swift/toolchains/BUILD +index 1a8db31..fff0879 100644 +--- a/swift/toolchains/BUILD ++++ b/swift/toolchains/BUILD +@@ -155,6 +155,7 @@ bzl_library( + "//swift/internal:features", + "//swift/internal:providers", + "//swift/internal:target_triples", ++ "//swift/internal:toolchain_utils", + "//swift/internal:utils", + "//swift/internal:wmo", + "//swift/toolchains/config:action_config", +diff --git a/swift/toolchains/swift_toolchain.bzl b/swift/toolchains/swift_toolchain.bzl +index 9fc2a49..6f10573 100644 +--- a/swift/toolchains/swift_toolchain.bzl ++++ b/swift/toolchains/swift_toolchain.bzl +@@ -69,6 +69,11 @@ load( + "SwiftModuleAliasesInfo", + ) + load("//swift/internal:target_triples.bzl", "target_triples") ++load( ++ "//swift/internal:toolchain_utils.bzl", ++ "get_swift_toolchain", ++ "use_swift_toolchain", ++) + load( + "//swift/internal:utils.bzl", + "collect_cross_import_overlays", +@@ -101,6 +106,64 @@ load( + ) + load("//swift/toolchains/config:tool_config.bzl", "ToolConfigInfo") +- ++ ++SwiftStaticRuntimeInfo = provider( ++ fields = { ++ "copts": "Compiler options required to use the runtime.", ++ "files": "Runtime and SDK files required by compile and link actions.", ++ "linkopts": "Linker options required to link the runtime.", ++ "root": "Execution-root-relative path to the runtime SDK.", ++ }, ++) ++ ++def _swift_static_runtime_impl(ctx): ++ root = ctx.label.workspace_root ++ files = depset(ctx.files.files) ++ ++ def expand_root(options): ++ return [option.replace("{root}", root) for option in options] ++ ++ return [ ++ DefaultInfo(files = files), ++ SwiftStaticRuntimeInfo( ++ copts = expand_root(ctx.attr.copts), ++ files = files, ++ linkopts = expand_root(ctx.attr.linkopts), ++ root = root, ++ ), ++ ] ++ ++swift_static_runtime = rule( ++ implementation = _swift_static_runtime_impl, ++ attrs = { ++ "copts": attr.string_list(), ++ "files": attr.label_list(allow_files = True, mandatory = True), ++ "linkopts": attr.string_list(), ++ }, ++) ++ ++def _swift_runtime_impl(ctx): ++ runtime_cc_info = get_swift_toolchain(ctx).dynamic_runtime_cc_info ++ files = [] ++ if runtime_cc_info: ++ for linker_input in runtime_cc_info.linking_context.linker_inputs.to_list(): ++ for library in linker_input.libraries: ++ dynamic_library = getattr(library, "dynamic_library", None) ++ if dynamic_library: ++ files.append(dynamic_library) ++ runtime = depset(files) ++ providers = [DefaultInfo( ++ files = runtime, ++ runfiles = ctx.runfiles(transitive_files = runtime), ++ )] ++ if runtime_cc_info: ++ providers.append(runtime_cc_info) ++ return providers ++ ++swift_runtime = rule( ++ implementation = _swift_runtime_impl, ++ toolchains = use_swift_toolchain(), ++) ++ + def _swift_compile_resource_set(_os, inputs_size): + # The `os` argument is unused, but the Starlark API requires both + # positional arguments. +@@ -662,6 +725,7 @@ def _resolve_sdkroot(ctx, cc_toolchain): +- ++ + def _swift_toolchain_impl(ctx): + toolchain_root = ctx.attr.root ++ external_static_runtime = ctx.attr.external_static_runtime[SwiftStaticRuntimeInfo] if ctx.attr.external_static_runtime else None + cc_toolchain = find_cc_toolchain(ctx) + target_system_name = _parse_target_system_name( + arch = ctx.attr.arch, +@@ -684,7 +748,7 @@ def _swift_toolchain_impl(ctx): + "before invoking Bazel, or configure a Bazel LLVM CC toolchain. " + + "The current CC toolchain is configured to use '{}'.".format(cc_toolchain.compiler)) +- ++ +- sdkroot = _resolve_sdkroot(ctx, cc_toolchain) ++ sdkroot = external_static_runtime.root if external_static_runtime else _resolve_sdkroot(ctx, cc_toolchain) +- ++ + if ctx.attr.swift_tools: + if ctx.attr.swift_executable: +@@ -740,6 +804,18 @@ def _swift_toolchain_impl(ctx): + ctx.attr.linkopts, + ctx.files.linker_inputs, + ) ++ elif external_static_runtime: ++ swift_linkopts_cc_info = CcInfo( ++ linking_context = cc_common.create_linking_context( ++ linker_inputs = depset([ ++ cc_common.create_linker_input( ++ owner = ctx.label, ++ user_link_flags = depset(external_static_runtime.linkopts), ++ additional_inputs = external_static_runtime.files, ++ ), ++ ]), ++ ), ++ ) + else: + ( + swift_linkopts_cc_info, +@@ -763,6 +839,8 @@ def _swift_toolchain_impl(ctx): + swiftcopts.extend(ctx.attr._exec_copts[BuildSettingInfo].value) + else: + swiftcopts.extend(ctx.attr._copts[BuildSettingInfo].value) ++ if external_static_runtime: ++ swiftcopts.extend(external_static_runtime.copts) +- ++ + # Combine build mode features, autoconfigured features, and required + # features. +@@ -774,7 +852,7 @@ def _swift_toolchain_impl(ctx): + target_triple = target_triple, + )) +- ++ +- if apple_common.dotted_version(ctx.attr.parsed_version) >= apple_common.dotted_version("6.3"): ++ if not external_static_runtime and apple_common.dotted_version(ctx.attr.parsed_version) >= apple_common.dotted_version("6.3"): + requested_features.append(SWIFT_FEATURE__SUPPORTS_HERMETIC_SWIFTMODULE) +- ++ + requested_features.extend(ctx.features) +@@ -787,6 +865,8 @@ def _swift_toolchain_impl(ctx): + additional_tools = [ctx.file.version_file] + if ctx.attr.swift_tools: + additional_tools += ctx.attr.swift_tools[SwiftToolsInfo].additional_inputs ++ if external_static_runtime: ++ additional_tools += external_static_runtime.files.to_list() +- ++ + all_tool_configs = _all_tool_configs( + env = ctx.attr.env, +@@ -873,7 +953,7 @@ def _swift_toolchain_impl(ctx): + system_modules = collect_implicit_deps_providers([]), + implicit_system_modules = collect_implicit_deps_providers([]), + swift_worker = ctx.attr._worker[DefaultInfo].files_to_run, +- const_protocols_to_gather = ctx.file.const_protocols_to_gather, ++ const_protocols_to_gather = None if external_static_runtime else ctx.file.const_protocols_to_gather, + test_configuration = struct( + binary_name = "{name}", + env = env, +@@ -952,6 +1032,10 @@ context. + """, + allow_files = True, + ), ++ "external_static_runtime": attr.label( ++ doc = "External static Swift runtime and SDK to use instead of the compiler's runtimes.", ++ providers = [[SwiftStaticRuntimeInfo]], ++ ), + "static_runtime": attr.label_list( + doc = """\ + Static Swift runtime archives and supporting linker files that are passed to diff --git a/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/source.json b/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/source.json index 4f98e32f3d62..8467cad623bc 100644 --- a/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/source.json +++ b/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/source.json @@ -2,7 +2,8 @@ "integrity": "sha256-Ly2lS4AlZJMiyqAxKHyCB+2pGeP5aYkQ6zv8QheeSTI=", "url": "https://github.com/bazelbuild/rules_swift/releases/download/4.0.0-rc5/rules_swift.4.0.0-rc5.tar.gz", "patches": { - "register_downloaded_macos_toolchain.patch": "sha256-249WJ4YEH2HmxlvGftl4eD53792joKJx9Dh0j5eHAgo=" + "register_downloaded_macos_toolchain.patch": "sha256-249WJ4YEH2HmxlvGftl4eD53792joKJx9Dh0j5eHAgo=", + "external_static_runtime.patch": "sha256-VY8UPZjCdlLjDB4taEpRfENRlkw4pGNYD2MAgNFITC4=" }, "patch_strip": 1 } diff --git a/unified/BUILD.bazel b/unified/BUILD.bazel index 738a95b31552..d17a7c505669 100644 --- a/unified/BUILD.bazel +++ b/unified/BUILD.bazel @@ -42,10 +42,7 @@ codeql_pkg_files( codeql_pkg_files( name = "extractor-arch", exes = codeql_platform_select( - linux64 = [ - "//unified/extractor", - "//unified/swift-syntax-rs:swift_runtime_libs", - ], + linux64 = ["//unified/extractor"], linux_arm64 = ["//unified/extractor-unsupported-os:extractor"], osx64 = ["//unified/extractor"], win64 = ["//unified/extractor-unsupported-os:extractor"], diff --git a/unified/extractor/BUILD.bazel b/unified/extractor/BUILD.bazel index 7959ffe384ad..f8814c4572a1 100644 --- a/unified/extractor/BUILD.bazel +++ b/unified/extractor/BUILD.bazel @@ -13,10 +13,7 @@ codeql_rust_binary( "ast_types.yml", "swift_node_types.yml", ], - data = select({ - "@platforms//os:linux": ["//unified/swift-syntax-rs:swift_runtime_libs"], - "//conditions:default": [], - }), + data = ["//unified/swift-syntax-rs:swift_runtime"], proc_macro_deps = all_crate_deps( proc_macro = True, ), @@ -56,10 +53,7 @@ _TESTS = { "swift_node_types.yml", ] + spec["compile_data"], crate_root = "tests/%s.rs" % test_name, - data = spec["data"] + select({ - "@platforms//os:linux": ["//unified/swift-syntax-rs:swift_runtime_libs"], - "//conditions:default": [], - }), + data = spec["data"] + ["//unified/swift-syntax-rs:swift_runtime"], edition = "2024", proc_macro_deps = all_crate_deps( proc_macro = True, diff --git a/unified/swift-syntax-rs/BUILD.bazel b/unified/swift-syntax-rs/BUILD.bazel index 91a28dc40505..374d0d784f3a 100644 --- a/unified/swift-syntax-rs/BUILD.bazel +++ b/unified/swift-syntax-rs/BUILD.bazel @@ -1,38 +1,52 @@ load("@rules_cc//cc:defs.bzl", "cc_library") load("@rules_rust//rust:defs.bzl", "rust_binary", "rust_library", "rust_test") load("@rules_swift//swift:swift.bzl", "swift_library") +load("@rules_swift//swift/toolchains:swift_toolchain.bzl", "swift_runtime") load("//unified:platforms.bzl", "UNIFIED_SUPPORTED_PLATFORMS") -load(":swift_runtime.bzl", "swift_runtime_libs") -load(":swift_runtime_linking.bzl", "swift_runtime_linking") package(default_visibility = ["//visibility:public"]) -swift_runtime_libs( - name = "swift_runtime_libs", - toolchain = "@swift_toolchain_ubuntu22.04//:files", +config_setting( + name = "static_linux_runtime", + constraint_values = [ + "@platforms//os:linux", + "//:static_swift_runtime", + ], ) -swift_runtime_linking( - name = "_swift_runtime_cc_info", - target_compatible_with = ["@platforms//os:linux"], - visibility = ["//visibility:private"], +swift_runtime( + name = "_swift_runtime", ) -# On Linux, provide the downloaded Swift runtime at link time and look beside -# the executable for the copies bundled with the extractor at runtime. -cc_library( - name = "swift_runtime_linking", - linkopts = select({ - "@platforms//os:linux": ["-Wl,-rpath,$$ORIGIN"], - "//conditions:default": [], - }), - target_compatible_with = UNIFIED_SUPPORTED_PLATFORMS, - deps = select({ - "@platforms//os:linux": [":_swift_runtime_cc_info"], +filegroup( + name = "swift_runtime", + srcs = select({ + ":static_linux_runtime": [], + "@platforms//os:linux": [":_swift_runtime"], "//conditions:default": [], }), ) +cc_library( + name = "static_runtime_group_start", + linkopts = ["-Wl,--start-group"], + target_compatible_with = ["@platforms//os:linux"], +) + +cc_library( + name = "static_runtime_group_end", + linkopts = [ + "-lc", + "-ldl", + "-lm", + "-lpthread", + "-lrt", + "-lutil", + "-Wl,--end-group", + ], + target_compatible_with = ["@platforms//os:linux"], +) + # Swift FFI shim: wraps swift-syntax and exposes a small C ABI. swift_library( name = "swift_syntax_ffi", @@ -56,10 +70,21 @@ rust_library( ), edition = "2024", target_compatible_with = UNIFIED_SUPPORTED_PLATFORMS, - deps = [ - ":swift_runtime_linking", - ":swift_syntax_ffi", - ], + deps = select({ + ":static_linux_runtime": [ + # Keep these in linker order; sorting them produces an invalid group. + ":static_runtime_group_start", + ":swift_syntax_ffi", + ":static_runtime_group_end", + ], + "@platforms//os:linux": [ + ":_swift_runtime", + ":swift_syntax_ffi", + ], + "//conditions:default": [ + ":swift_syntax_ffi", + ], + }), ) # A debugging aid, for looking at the raw swift-syntax JSON for some input: @@ -68,10 +93,7 @@ rust_library( rust_binary( name = "swift-syntax-parse", srcs = ["src/main.rs"], - data = select({ - "@platforms//os:linux": [":swift_runtime_libs"], - "//conditions:default": [], - }), + data = [":swift_runtime"], edition = "2024", target_compatible_with = UNIFIED_SUPPORTED_PLATFORMS, deps = [":swift_syntax_rs"], @@ -81,10 +103,7 @@ rust_test( name = "swift_syntax_rs_test", size = "small", crate = ":swift_syntax_rs", - data = select({ - "@platforms//os:linux": [":swift_runtime_libs"], - "//conditions:default": [], - }), + data = [":swift_runtime"], edition = "2024", target_compatible_with = UNIFIED_SUPPORTED_PLATFORMS, ) diff --git a/unified/swift-syntax-rs/swift_runtime.bzl b/unified/swift-syntax-rs/swift_runtime.bzl deleted file mode 100644 index 899d97d71162..000000000000 --- a/unified/swift-syntax-rs/swift_runtime.bzl +++ /dev/null @@ -1,19 +0,0 @@ -"""Filter the Swift toolchain down to just its Linux runtime shared objects. - -The standalone toolchain's `:files` bundles the compiler, host libraries, clang -runtime, plugins, etc. For running a Swift-linked binary we only need the -runtime shared objects in `usr/lib/swift/linux/`. -""" - -def _swift_runtime_libs_impl(ctx): - libs = [ - f - for f in ctx.files.toolchain - if "/usr/lib/swift/linux/" in f.path and f.path.endswith(".so") - ] - return [DefaultInfo(files = depset(libs))] - -swift_runtime_libs = rule( - implementation = _swift_runtime_libs_impl, - attrs = {"toolchain": attr.label(allow_files = True)}, -) diff --git a/unified/swift-syntax-rs/swift_runtime_linking.bzl b/unified/swift-syntax-rs/swift_runtime_linking.bzl deleted file mode 100644 index ec2577d2e3df..000000000000 --- a/unified/swift-syntax-rs/swift_runtime_linking.bzl +++ /dev/null @@ -1,11 +0,0 @@ -"""Expose the selected Swift toolchain's dynamic runtime to native dependents.""" - -load("@rules_swift//swift:swift.bzl", "swift_common") - -def _swift_runtime_linking_impl(ctx): - return [swift_common.get_toolchain(ctx).dynamic_runtime_cc_info] - -swift_runtime_linking = rule( - implementation = _swift_runtime_linking_impl, - toolchains = swift_common.use_toolchain(), -) From 8b153a100ad3e51c76d6c14690eaa06db94c21bd Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 24 Aug 2026 14:48:54 +0100 Subject: [PATCH 0483/2098] Rust: Update format of the new MaD models. --- rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml index e53e0cc579cc..ca7f6d0f3ae5 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml @@ -130,9 +130,9 @@ extensions: - ["::trim", "Argument[self].Reference", "ReturnValue.Reference", "taint", "manual"] - ["::to_string", "Argument[self].Reference", "ReturnValue", "taint", "manual"] # Fmt - - ["<_ as core::fmt::Write>::write_fmt", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - - ["<_ as core::fmt::Write>::write_str", "Argument[0].Reference", "Argument[self].Reference", "taint", "manual"] - - ["<_ as core::fmt::Write>::write_char", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["core::fmt::Write::write_fmt", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["core::fmt::Write::write_str", "Argument[0].Reference", "Argument[self].Reference", "taint", "manual"] + - ["core::fmt::Write::write_char", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - ["core::fmt::write", "Argument[1]", "Argument[0].Reference", "taint", "manual"] # Ord - ["core::cmp::Ord::min", "Argument[self,0]", "ReturnValue", "value", "manual"] From 0195e2e10e36b53f6ccf8b7ee79d99341b189a24 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 24 Aug 2026 15:02:01 +0100 Subject: [PATCH 0484/2098] Rust: Accept changes to .expected from previous commit and merge. --- .../format-macros-legacy/FormatArgs.expected | 18 ++--- .../LogInjection.expected | 24 +++---- .../inline-taint-flow.expected | 71 +++++++++++-------- .../CWE-312/CleartextLogging.expected | 23 +++--- 4 files changed, 75 insertions(+), 61 deletions(-) diff --git a/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.expected b/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.expected index 56bf946de0e7..d8373ec3f9e3 100644 --- a/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.expected +++ b/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.expected @@ -1,12 +1,12 @@ -| main.rs:13:10:13:25 | FormatArgsExpr | 1 | -| main.rs:16:10:16:23 | FormatArgsExpr | 0 | -| main.rs:19:13:19:36 | FormatArgsExpr | 1 | +| main.rs:13:18:13:24 | FormatArgsExpr | 1 | +| main.rs:16:18:16:22 | FormatArgsExpr | 0 | +| main.rs:19:21:19:35 | FormatArgsExpr | 1 | | main.rs:27:25:27:33 | FormatArgsExpr | 1 | | main.rs:38:40:38:46 | FormatArgsExpr | 0 | | main.rs:43:52:43:58 | FormatArgsExpr | 0 | -| main.rs:49:13:49:33 | FormatArgsExpr | 1 | -| main.rs:54:13:54:33 | FormatArgsExpr | 0 | -| main.rs:64:5:64:27 | FormatArgsExpr | 1 | -| main.rs:65:5:65:26 | FormatArgsExpr | 0 | -| main.rs:66:5:66:25 | FormatArgsExpr | 1 | -| main.rs:67:5:67:24 | FormatArgsExpr | 0 | +| main.rs:49:26:49:32 | FormatArgsExpr | 1 | +| main.rs:54:28:54:32 | FormatArgsExpr | 0 | +| main.rs:64:14:64:26 | FormatArgsExpr | 1 | +| main.rs:65:15:65:25 | FormatArgsExpr | 0 | +| main.rs:66:12:66:24 | FormatArgsExpr | 1 | +| main.rs:67:13:67:23 | FormatArgsExpr | 0 | diff --git a/rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected b/rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected index 853f6f401549..b294b89e83fb 100644 --- a/rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected +++ b/rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected @@ -1,13 +1,13 @@ #select -| main.rs:64:5:64:27 | FormatArgsExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:64:5:64:27 | FormatArgsExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | -| main.rs:65:5:65:26 | FormatArgsExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:65:5:65:26 | FormatArgsExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | -| main.rs:66:5:66:25 | FormatArgsExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:66:5:66:25 | FormatArgsExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | -| main.rs:67:5:67:24 | FormatArgsExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:67:5:67:24 | FormatArgsExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | +| main.rs:64:14:64:26 | MacroExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:64:14:64:26 | MacroExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | +| main.rs:65:15:65:25 | MacroExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:65:15:65:25 | MacroExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | +| main.rs:66:12:66:24 | MacroExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:66:12:66:24 | MacroExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | +| main.rs:67:13:67:23 | MacroExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:67:13:67:23 | MacroExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | edges -| main.rs:62:9:62:15 | tainted | main.rs:64:5:64:27 | FormatArgsExpr | provenance | Sink:MaD:2 | -| main.rs:62:9:62:15 | tainted | main.rs:65:5:65:26 | FormatArgsExpr | provenance | Sink:MaD:1 | -| main.rs:62:9:62:15 | tainted | main.rs:66:5:66:25 | FormatArgsExpr | provenance | Sink:MaD:2 | -| main.rs:62:9:62:15 | tainted | main.rs:67:5:67:24 | FormatArgsExpr | provenance | Sink:MaD:1 | +| main.rs:62:9:62:15 | tainted | main.rs:64:14:64:26 | MacroExpr | provenance | Sink:MaD:2 | +| main.rs:62:9:62:15 | tainted | main.rs:65:15:65:25 | MacroExpr | provenance | Sink:MaD:1 | +| main.rs:62:9:62:15 | tainted | main.rs:66:12:66:24 | MacroExpr | provenance | Sink:MaD:2 | +| main.rs:62:9:62:15 | tainted | main.rs:67:13:67:23 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:62:19:62:45 | ...::var(...) | main.rs:62:19:62:45 | ...::var(...) [Ok] | provenance | Src:MaD:3 | | main.rs:62:19:62:45 | ...::var(...) [Ok] | main.rs:62:19:62:65 | ... .unwrap_or_default() | provenance | MaD:4 | | main.rs:62:19:62:65 | ... .unwrap_or_default() | main.rs:62:9:62:15 | tainted | provenance | | @@ -21,8 +21,8 @@ nodes | main.rs:62:19:62:45 | ...::var(...) | semmle.label | ...::var(...) | | main.rs:62:19:62:45 | ...::var(...) [Ok] | semmle.label | ...::var(...) [Ok] | | main.rs:62:19:62:65 | ... .unwrap_or_default() | semmle.label | ... .unwrap_or_default() | -| main.rs:64:5:64:27 | FormatArgsExpr | semmle.label | FormatArgsExpr | -| main.rs:65:5:65:26 | FormatArgsExpr | semmle.label | FormatArgsExpr | -| main.rs:66:5:66:25 | FormatArgsExpr | semmle.label | FormatArgsExpr | -| main.rs:67:5:67:24 | FormatArgsExpr | semmle.label | FormatArgsExpr | +| main.rs:64:14:64:26 | MacroExpr | semmle.label | MacroExpr | +| main.rs:65:15:65:25 | MacroExpr | semmle.label | MacroExpr | +| main.rs:66:12:66:24 | MacroExpr | semmle.label | MacroExpr | +| main.rs:67:13:67:23 | MacroExpr | semmle.label | MacroExpr | subpaths diff --git a/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected b/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected index 7123164d2bfb..b296895ca1ac 100644 --- a/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected +++ b/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected @@ -1,67 +1,80 @@ models -| 1 | Summary: <_ as core::fmt::Write>::write_fmt; Argument[0]; Argument[self].Reference; taint | -| 2 | Summary: <_ as core::fmt::Write>::write_str; Argument[0].Reference; Argument[self].Reference; taint | -| 3 | Summary: ::as_str; Argument[self].Reference; ReturnValue.Reference; taint | -| 4 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 1 | Summary: ::as_str; Argument[self].Reference; ReturnValue.Reference; taint | +| 2 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 3 | Summary: core::fmt::Write::write_fmt; Argument[0]; Argument[self].Reference; taint | +| 4 | Summary: core::fmt::Write::write_str; Argument[0].Reference; Argument[self].Reference; taint | | 5 | Summary: core::fmt::write; Argument[1]; Argument[0].Reference; taint | +| 6 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | edges -| main.rs:12:9:12:9 | a | main.rs:13:10:13:25 | FormatArgsExpr | provenance | | +| main.rs:12:9:12:9 | a | main.rs:13:18:13:24 | MacroExpr | provenance | | | main.rs:12:13:12:21 | source(...) | main.rs:12:9:12:9 | a | provenance | | -| main.rs:13:10:13:25 | ...::format(...) | main.rs:13:10:13:25 | MacroExpr | provenance | | -| main.rs:13:10:13:25 | FormatArgsExpr | main.rs:13:10:13:25 | ...::format(...) | provenance | MaD:4 | -| main.rs:15:9:15:9 | b | main.rs:16:10:16:23 | FormatArgsExpr | provenance | | +| main.rs:13:18:13:24 | ...::format(...) | main.rs:13:18:13:24 | { ... } | provenance | | +| main.rs:13:18:13:24 | ...::must_use(...) | main.rs:13:10:13:25 | MacroExpr | provenance | | +| main.rs:13:18:13:24 | MacroExpr | main.rs:13:18:13:24 | ...::format(...) | provenance | MaD:2 | +| main.rs:13:18:13:24 | { ... } | main.rs:13:18:13:24 | ...::must_use(...) | provenance | MaD:6 | +| main.rs:15:9:15:9 | b | main.rs:16:18:16:22 | MacroExpr | provenance | | | main.rs:15:13:15:21 | source(...) | main.rs:15:9:15:9 | b | provenance | | -| main.rs:16:10:16:23 | ...::format(...) | main.rs:16:10:16:23 | MacroExpr | provenance | | -| main.rs:16:10:16:23 | FormatArgsExpr | main.rs:16:10:16:23 | ...::format(...) | provenance | MaD:4 | -| main.rs:18:9:18:9 | c | main.rs:19:13:19:36 | FormatArgsExpr | provenance | | +| main.rs:16:18:16:22 | ...::format(...) | main.rs:16:18:16:22 | { ... } | provenance | | +| main.rs:16:18:16:22 | ...::must_use(...) | main.rs:16:10:16:23 | MacroExpr | provenance | | +| main.rs:16:18:16:22 | MacroExpr | main.rs:16:18:16:22 | ...::format(...) | provenance | MaD:2 | +| main.rs:16:18:16:22 | { ... } | main.rs:16:18:16:22 | ...::must_use(...) | provenance | MaD:6 | +| main.rs:18:9:18:9 | c | main.rs:19:21:19:35 | MacroExpr | provenance | | | main.rs:18:13:18:21 | source(...) | main.rs:18:9:18:9 | c | provenance | | | main.rs:19:9:19:9 | s | main.rs:20:10:20:10 | s | provenance | | -| main.rs:19:13:19:36 | ...::format(...) | main.rs:19:9:19:9 | s | provenance | | -| main.rs:19:13:19:36 | FormatArgsExpr | main.rs:19:13:19:36 | ...::format(...) | provenance | MaD:4 | +| main.rs:19:21:19:35 | ...::format(...) | main.rs:19:21:19:35 | { ... } | provenance | | +| main.rs:19:21:19:35 | ...::must_use(...) | main.rs:19:9:19:9 | s | provenance | | +| main.rs:19:21:19:35 | MacroExpr | main.rs:19:21:19:35 | ...::format(...) | provenance | MaD:2 | +| main.rs:19:21:19:35 | { ... } | main.rs:19:21:19:35 | ...::must_use(...) | provenance | MaD:6 | | main.rs:26:9:26:9 | a | main.rs:27:9:27:9 | b | provenance | | | main.rs:26:13:26:21 | source(...) | main.rs:26:9:26:9 | a | provenance | | | main.rs:27:9:27:9 | b | main.rs:28:30:28:30 | b | provenance | | | main.rs:28:9:28:9 | c | main.rs:29:10:29:10 | c | provenance | | | main.rs:28:13:28:31 | ...::format(...) | main.rs:28:9:28:9 | c | provenance | | -| main.rs:28:30:28:30 | b | main.rs:28:13:28:31 | ...::format(...) | provenance | MaD:4 | +| main.rs:28:30:28:30 | b | main.rs:28:13:28:31 | ...::format(...) | provenance | MaD:2 | | main.rs:32:9:32:9 | d | main.rs:33:28:33:28 | d | provenance | | | main.rs:32:13:32:21 | source(...) | main.rs:32:9:32:9 | d | provenance | | | main.rs:33:13:33:16 | [post] buf1 | main.rs:34:10:34:13 | buf1 | provenance | | -| main.rs:33:28:33:28 | d | main.rs:33:28:33:37 | d.as_str() [&ref] | provenance | MaD:3 | -| main.rs:33:28:33:37 | d.as_str() [&ref] | main.rs:33:13:33:16 | [post] buf1 | provenance | MaD:2 | +| main.rs:33:28:33:28 | d | main.rs:33:28:33:37 | d.as_str() [&ref] | provenance | MaD:1 | +| main.rs:33:28:33:37 | d.as_str() [&ref] | main.rs:33:13:33:16 | [post] buf1 | provenance | MaD:4 | | main.rs:37:9:37:9 | e | main.rs:38:28:38:46 | MacroExpr | provenance | | | main.rs:37:13:37:21 | source(...) | main.rs:37:9:37:9 | e | provenance | | | main.rs:38:13:38:16 | [post] buf2 | main.rs:39:10:39:13 | buf2 | provenance | | -| main.rs:38:28:38:46 | MacroExpr | main.rs:38:13:38:16 | [post] buf2 | provenance | MaD:1 | +| main.rs:38:28:38:46 | MacroExpr | main.rs:38:13:38:16 | [post] buf2 | provenance | MaD:3 | | main.rs:42:9:42:9 | f | main.rs:43:40:43:58 | MacroExpr | provenance | | | main.rs:42:13:42:21 | source(...) | main.rs:42:9:42:9 | f | provenance | | | main.rs:43:29:43:37 | [post] &mut buf3 [&ref] | main.rs:43:34:43:37 | [post] buf3 | provenance | | | main.rs:43:34:43:37 | [post] buf3 | main.rs:44:10:44:13 | buf3 | provenance | | | main.rs:43:40:43:58 | MacroExpr | main.rs:43:29:43:37 | [post] &mut buf3 [&ref] | provenance | MaD:5 | -| main.rs:48:9:48:9 | g | main.rs:49:13:49:33 | FormatArgsExpr | provenance | | +| main.rs:48:9:48:9 | g | main.rs:49:26:49:32 | MacroExpr | provenance | | | main.rs:48:13:48:21 | source(...) | main.rs:48:9:48:9 | g | provenance | | -| main.rs:49:13:49:33 | FormatArgsExpr | main.rs:49:20:49:23 | [post] buf4 | provenance | MaD:1 | | main.rs:49:20:49:23 | [post] buf4 | main.rs:50:10:50:13 | buf4 | provenance | | -| main.rs:53:9:53:9 | h | main.rs:54:13:54:33 | FormatArgsExpr | provenance | | +| main.rs:49:26:49:32 | MacroExpr | main.rs:49:20:49:23 | [post] buf4 | provenance | MaD:3 | +| main.rs:53:9:53:9 | h | main.rs:54:28:54:32 | MacroExpr | provenance | | | main.rs:53:13:53:21 | source(...) | main.rs:53:9:53:9 | h | provenance | | -| main.rs:54:13:54:33 | FormatArgsExpr | main.rs:54:22:54:25 | [post] buf5 | provenance | MaD:1 | | main.rs:54:22:54:25 | [post] buf5 | main.rs:55:10:55:13 | buf5 | provenance | | +| main.rs:54:28:54:32 | MacroExpr | main.rs:54:22:54:25 | [post] buf5 | provenance | MaD:3 | nodes | main.rs:12:9:12:9 | a | semmle.label | a | | main.rs:12:13:12:21 | source(...) | semmle.label | source(...) | -| main.rs:13:10:13:25 | ...::format(...) | semmle.label | ...::format(...) | -| main.rs:13:10:13:25 | FormatArgsExpr | semmle.label | FormatArgsExpr | | main.rs:13:10:13:25 | MacroExpr | semmle.label | MacroExpr | +| main.rs:13:18:13:24 | ...::format(...) | semmle.label | ...::format(...) | +| main.rs:13:18:13:24 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| main.rs:13:18:13:24 | MacroExpr | semmle.label | MacroExpr | +| main.rs:13:18:13:24 | { ... } | semmle.label | { ... } | | main.rs:15:9:15:9 | b | semmle.label | b | | main.rs:15:13:15:21 | source(...) | semmle.label | source(...) | -| main.rs:16:10:16:23 | ...::format(...) | semmle.label | ...::format(...) | -| main.rs:16:10:16:23 | FormatArgsExpr | semmle.label | FormatArgsExpr | | main.rs:16:10:16:23 | MacroExpr | semmle.label | MacroExpr | +| main.rs:16:18:16:22 | ...::format(...) | semmle.label | ...::format(...) | +| main.rs:16:18:16:22 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| main.rs:16:18:16:22 | MacroExpr | semmle.label | MacroExpr | +| main.rs:16:18:16:22 | { ... } | semmle.label | { ... } | | main.rs:18:9:18:9 | c | semmle.label | c | | main.rs:18:13:18:21 | source(...) | semmle.label | source(...) | | main.rs:19:9:19:9 | s | semmle.label | s | -| main.rs:19:13:19:36 | ...::format(...) | semmle.label | ...::format(...) | -| main.rs:19:13:19:36 | FormatArgsExpr | semmle.label | FormatArgsExpr | +| main.rs:19:21:19:35 | ...::format(...) | semmle.label | ...::format(...) | +| main.rs:19:21:19:35 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| main.rs:19:21:19:35 | MacroExpr | semmle.label | MacroExpr | +| main.rs:19:21:19:35 | { ... } | semmle.label | { ... } | | main.rs:20:10:20:10 | s | semmle.label | s | | main.rs:26:9:26:9 | a | semmle.label | a | | main.rs:26:13:26:21 | source(...) | semmle.label | source(...) | @@ -89,13 +102,13 @@ nodes | main.rs:44:10:44:13 | buf3 | semmle.label | buf3 | | main.rs:48:9:48:9 | g | semmle.label | g | | main.rs:48:13:48:21 | source(...) | semmle.label | source(...) | -| main.rs:49:13:49:33 | FormatArgsExpr | semmle.label | FormatArgsExpr | | main.rs:49:20:49:23 | [post] buf4 | semmle.label | [post] buf4 | +| main.rs:49:26:49:32 | MacroExpr | semmle.label | MacroExpr | | main.rs:50:10:50:13 | buf4 | semmle.label | buf4 | | main.rs:53:9:53:9 | h | semmle.label | h | | main.rs:53:13:53:21 | source(...) | semmle.label | source(...) | -| main.rs:54:13:54:33 | FormatArgsExpr | semmle.label | FormatArgsExpr | | main.rs:54:22:54:25 | [post] buf5 | semmle.label | [post] buf5 | +| main.rs:54:28:54:32 | MacroExpr | semmle.label | MacroExpr | | main.rs:55:10:55:13 | buf5 | semmle.label | buf5 | subpaths testFailures diff --git a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected index 421ae0740b0e..92a3f53248ac 100644 --- a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected +++ b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected @@ -125,15 +125,15 @@ edges | test_logging.rs:99:22:99:45 | ...::format(...) | test_logging.rs:99:22:99:45 | { ... } | provenance | | | test_logging.rs:99:22:99:45 | ...::must_use(...) | test_logging.rs:99:9:99:10 | m3 | provenance | | | test_logging.rs:99:22:99:45 | MacroExpr | test_logging.rs:99:22:99:45 | ...::format(...) | provenance | MaD:18 | -| test_logging.rs:99:22:99:45 | { ... } | test_logging.rs:99:22:99:45 | ...::must_use(...) | provenance | MaD:20 | +| test_logging.rs:99:22:99:45 | { ... } | test_logging.rs:99:22:99:45 | ...::must_use(...) | provenance | MaD:21 | | test_logging.rs:99:38:99:45 | password | test_logging.rs:99:22:99:45 | MacroExpr | provenance | | | test_logging.rs:103:12:103:18 | [post] &mut m4 [&ref] | test_logging.rs:103:17:103:18 | [post] m4 | provenance | | | test_logging.rs:103:17:103:18 | [post] m4 | test_logging.rs:104:11:104:18 | MacroExpr | provenance | Sink:MaD:11 | -| test_logging.rs:103:21:103:44 | MacroExpr | test_logging.rs:103:12:103:18 | [post] &mut m4 [&ref] | provenance | MaD:16 | +| test_logging.rs:103:21:103:44 | MacroExpr | test_logging.rs:103:12:103:18 | [post] &mut m4 [&ref] | provenance | MaD:20 | | test_logging.rs:103:37:103:44 | password | test_logging.rs:103:21:103:44 | MacroExpr | provenance | | | test_logging.rs:107:14:107:20 | [post] &mut m5 [&ref] | test_logging.rs:107:19:107:20 | [post] m5 | provenance | | | test_logging.rs:107:19:107:20 | [post] m5 | test_logging.rs:108:11:108:18 | MacroExpr | provenance | Sink:MaD:11 | -| test_logging.rs:107:23:107:46 | MacroExpr | test_logging.rs:107:14:107:20 | [post] &mut m5 [&ref] | provenance | MaD:16 | +| test_logging.rs:107:23:107:46 | MacroExpr | test_logging.rs:107:14:107:20 | [post] &mut m5 [&ref] | provenance | MaD:20 | | test_logging.rs:107:39:107:46 | password | test_logging.rs:107:23:107:46 | MacroExpr | provenance | | | test_logging.rs:118:28:118:41 | get_password(...) | test_logging.rs:118:12:118:41 | MacroExpr | provenance | Sink:MaD:11 | | test_logging.rs:129:9:129:10 | t1 [tuple.1] | test_logging.rs:131:28:131:29 | t1 [tuple.1] | provenance | | @@ -150,7 +150,7 @@ edges | test_logging.rs:176:42:176:78 | ...::format(...) | test_logging.rs:176:42:176:78 | { ... } | provenance | | | test_logging.rs:176:42:176:78 | ...::must_use(...) | test_logging.rs:176:34:176:79 | MacroExpr | provenance | | | test_logging.rs:176:42:176:78 | MacroExpr | test_logging.rs:176:42:176:78 | ...::format(...) | provenance | MaD:18 | -| test_logging.rs:176:42:176:78 | { ... } | test_logging.rs:176:42:176:78 | ...::must_use(...) | provenance | MaD:20 | +| test_logging.rs:176:42:176:78 | { ... } | test_logging.rs:176:42:176:78 | ...::must_use(...) | provenance | MaD:21 | | test_logging.rs:176:70:176:78 | password2 | test_logging.rs:176:42:176:78 | MacroExpr | provenance | | | test_logging.rs:180:35:180:81 | &... | test_logging.rs:180:35:180:81 | &... | provenance | Sink:MaD:3 | | test_logging.rs:180:35:180:81 | &... [&ref] | test_logging.rs:180:35:180:81 | &... | provenance | Sink:MaD:3 | @@ -159,7 +159,7 @@ edges | test_logging.rs:180:44:180:80 | ...::format(...) | test_logging.rs:180:44:180:80 | { ... } | provenance | | | test_logging.rs:180:44:180:80 | ...::must_use(...) | test_logging.rs:180:36:180:81 | MacroExpr | provenance | | | test_logging.rs:180:44:180:80 | MacroExpr | test_logging.rs:180:44:180:80 | ...::format(...) | provenance | MaD:18 | -| test_logging.rs:180:44:180:80 | { ... } | test_logging.rs:180:44:180:80 | ...::must_use(...) | provenance | MaD:20 | +| test_logging.rs:180:44:180:80 | { ... } | test_logging.rs:180:44:180:80 | ...::must_use(...) | provenance | MaD:21 | | test_logging.rs:180:72:180:80 | password2 | test_logging.rs:180:44:180:80 | MacroExpr | provenance | | | test_logging.rs:183:9:183:19 | err_result2 [Err] | test_logging.rs:184:13:184:23 | err_result2 | provenance | Sink:MaD:4 | | test_logging.rs:183:47:183:68 | Err(...) [Err] | test_logging.rs:183:9:183:19 | err_result2 [Err] | provenance | | @@ -195,35 +195,35 @@ edges | test_logging.rs:229:38:229:61 | ...::format(...) | test_logging.rs:229:38:229:61 | { ... } | provenance | | | test_logging.rs:229:38:229:61 | ...::must_use(...) | test_logging.rs:229:30:229:62 | MacroExpr | provenance | | | test_logging.rs:229:38:229:61 | MacroExpr | test_logging.rs:229:38:229:61 | ...::format(...) | provenance | MaD:18 | -| test_logging.rs:229:38:229:61 | { ... } | test_logging.rs:229:38:229:61 | ...::must_use(...) | provenance | MaD:20 | +| test_logging.rs:229:38:229:61 | { ... } | test_logging.rs:229:38:229:61 | ...::must_use(...) | provenance | MaD:21 | | test_logging.rs:229:54:229:61 | password | test_logging.rs:229:38:229:61 | MacroExpr | provenance | | | test_logging.rs:242:16:242:50 | MacroExpr | test_logging.rs:242:16:242:61 | ... .as_bytes() [&ref, element] | provenance | MaD:16 | | test_logging.rs:242:16:242:61 | ... .as_bytes() [&ref, element] | test_logging.rs:242:16:242:61 | ... .as_bytes() | provenance | Sink:MaD:7 Sink:MaD:7 | | test_logging.rs:242:24:242:49 | ...::format(...) | test_logging.rs:242:24:242:49 | { ... } | provenance | | | test_logging.rs:242:24:242:49 | ...::must_use(...) | test_logging.rs:242:16:242:50 | MacroExpr | provenance | | | test_logging.rs:242:24:242:49 | MacroExpr | test_logging.rs:242:24:242:49 | ...::format(...) | provenance | MaD:18 | -| test_logging.rs:242:24:242:49 | { ... } | test_logging.rs:242:24:242:49 | ...::must_use(...) | provenance | MaD:20 | +| test_logging.rs:242:24:242:49 | { ... } | test_logging.rs:242:24:242:49 | ...::must_use(...) | provenance | MaD:21 | | test_logging.rs:242:42:242:49 | password | test_logging.rs:242:24:242:49 | MacroExpr | provenance | | | test_logging.rs:245:20:245:54 | MacroExpr | test_logging.rs:245:20:245:65 | ... .as_bytes() [&ref, element] | provenance | MaD:16 | | test_logging.rs:245:20:245:65 | ... .as_bytes() [&ref, element] | test_logging.rs:245:20:245:65 | ... .as_bytes() | provenance | Sink:MaD:8 Sink:MaD:8 | | test_logging.rs:245:28:245:53 | ...::format(...) | test_logging.rs:245:28:245:53 | { ... } | provenance | | | test_logging.rs:245:28:245:53 | ...::must_use(...) | test_logging.rs:245:20:245:54 | MacroExpr | provenance | | | test_logging.rs:245:28:245:53 | MacroExpr | test_logging.rs:245:28:245:53 | ...::format(...) | provenance | MaD:18 | -| test_logging.rs:245:28:245:53 | { ... } | test_logging.rs:245:28:245:53 | ...::must_use(...) | provenance | MaD:20 | +| test_logging.rs:245:28:245:53 | { ... } | test_logging.rs:245:28:245:53 | ...::must_use(...) | provenance | MaD:21 | | test_logging.rs:245:46:245:53 | password | test_logging.rs:245:28:245:53 | MacroExpr | provenance | | | test_logging.rs:248:15:248:49 | MacroExpr | test_logging.rs:248:15:248:60 | ... .as_bytes() [&ref, element] | provenance | MaD:16 | | test_logging.rs:248:15:248:60 | ... .as_bytes() [&ref, element] | test_logging.rs:248:15:248:60 | ... .as_bytes() | provenance | Sink:MaD:7 Sink:MaD:7 | | test_logging.rs:248:23:248:48 | ...::format(...) | test_logging.rs:248:23:248:48 | { ... } | provenance | | | test_logging.rs:248:23:248:48 | ...::must_use(...) | test_logging.rs:248:15:248:49 | MacroExpr | provenance | | | test_logging.rs:248:23:248:48 | MacroExpr | test_logging.rs:248:23:248:48 | ...::format(...) | provenance | MaD:18 | -| test_logging.rs:248:23:248:48 | { ... } | test_logging.rs:248:23:248:48 | ...::must_use(...) | provenance | MaD:20 | +| test_logging.rs:248:23:248:48 | { ... } | test_logging.rs:248:23:248:48 | ...::must_use(...) | provenance | MaD:21 | | test_logging.rs:248:41:248:48 | password | test_logging.rs:248:23:248:48 | MacroExpr | provenance | | | test_logging.rs:251:15:251:49 | MacroExpr | test_logging.rs:251:15:251:60 | ... .as_bytes() [&ref, element] | provenance | MaD:16 | | test_logging.rs:251:15:251:60 | ... .as_bytes() [&ref, element] | test_logging.rs:251:15:251:60 | ... .as_bytes() | provenance | Sink:MaD:6 Sink:MaD:6 | | test_logging.rs:251:23:251:48 | ...::format(...) | test_logging.rs:251:23:251:48 | { ... } | provenance | | | test_logging.rs:251:23:251:48 | ...::must_use(...) | test_logging.rs:251:15:251:49 | MacroExpr | provenance | | | test_logging.rs:251:23:251:48 | MacroExpr | test_logging.rs:251:23:251:48 | ...::format(...) | provenance | MaD:18 | -| test_logging.rs:251:23:251:48 | { ... } | test_logging.rs:251:23:251:48 | ...::must_use(...) | provenance | MaD:20 | +| test_logging.rs:251:23:251:48 | { ... } | test_logging.rs:251:23:251:48 | ...::must_use(...) | provenance | MaD:21 | | test_logging.rs:251:41:251:48 | password | test_logging.rs:251:23:251:48 | MacroExpr | provenance | | models | 1 | Sink: ::log_expect; Argument[0]; log-injection | @@ -245,7 +245,8 @@ models | 17 | Summary: ::as_str; Argument[self].Reference; ReturnValue.Reference; taint | | 18 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | | 19 | Summary: core::clone::Clone::clone; Argument[self].Reference; ReturnValue; value | -| 20 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | +| 20 | Summary: core::fmt::Write::write_fmt; Argument[0]; Argument[self].Reference; taint | +| 21 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes | test_logging.rs:42:12:42:35 | MacroExpr | semmle.label | MacroExpr | | test_logging.rs:42:28:42:35 | password | semmle.label | password | From bdf87109cc5f586c00645f9c1ff606baa9411e75 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Mon, 24 Aug 2026 16:05:48 +0200 Subject: [PATCH 0485/2098] Support distrusting Actions owners via `!owner` entries Lets `trustedActionsOwnerDataModel` remove an owner (including the first-party `actions`, `github` and `advanced-security`) with a `!`-prefixed entry, so unpinned tags for those Actions are reported by `actions/unpinned-tag`. Unambiguous because owner names can never start with `!`. Closes #22409 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../2026-08-24-untrusted-actions-owner.md | 4 ++++ .../ql/lib/codeql/actions/config/Config.qll | 9 ++++++++- .../workflows/unpinned_first_party.yml | 13 +++++++++++++ .../UnpinnedActionsTag.expected | 2 ++ .../UnpinnedActionsTag.ext.yml | 8 ++++++++ .../UnpinnedActionsTag.qlref | 1 + ...customizing-library-models-for-actions.rst | 19 +++++++++++++++++++ 7 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 actions/ql/lib/change-notes/2026-08-24-untrusted-actions-owner.md create mode 100644 actions/ql/test/query-tests/Security/CWE-829-untrusted-owner/.github/workflows/unpinned_first_party.yml create mode 100644 actions/ql/test/query-tests/Security/CWE-829-untrusted-owner/UnpinnedActionsTag.expected create mode 100644 actions/ql/test/query-tests/Security/CWE-829-untrusted-owner/UnpinnedActionsTag.ext.yml create mode 100644 actions/ql/test/query-tests/Security/CWE-829-untrusted-owner/UnpinnedActionsTag.qlref diff --git a/actions/ql/lib/change-notes/2026-08-24-untrusted-actions-owner.md b/actions/ql/lib/change-notes/2026-08-24-untrusted-actions-owner.md new file mode 100644 index 000000000000..b244b67bef36 --- /dev/null +++ b/actions/ql/lib/change-notes/2026-08-24-untrusted-actions-owner.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `trustedActionsOwnerDataModel` extensible predicate, used by the `actions/unpinned-tag` query, now supports removing an owner from the trusted set by adding an entry prefixed with `!` (for example, `!github`). This makes it possible to distrust first-party owners (`actions`, `github`, `advanced-security`) so that unpinned tags for their Actions are reported. diff --git a/actions/ql/lib/codeql/actions/config/Config.qll b/actions/ql/lib/codeql/actions/config/Config.qll index 27e24514c091..f6b8d0c979f3 100644 --- a/actions/ql/lib/codeql/actions/config/Config.qll +++ b/actions/ql/lib/codeql/actions/config/Config.qll @@ -130,9 +130,16 @@ predicate immutableActionsDataModel(string action) { Extensions::immutableAction * MaD models for trusted actions owners * Fields: * - owner: owner name + * + * An entry may be prefixed with `!` to remove an owner from the trusted set, + * overriding any plain entry for the same owner (for example, `!github` distrusts + * the first-party `github` owner). This is unambiguous because GitHub owner names + * can never start with `!`. */ predicate trustedActionsOwnerDataModel(string owner) { - Extensions::trustedActionsOwnerDataModel(owner) + Extensions::trustedActionsOwnerDataModel(owner) and + not owner.matches("!%") and + not Extensions::trustedActionsOwnerDataModel("!" + owner) } /** diff --git a/actions/ql/test/query-tests/Security/CWE-829-untrusted-owner/.github/workflows/unpinned_first_party.yml b/actions/ql/test/query-tests/Security/CWE-829-untrusted-owner/.github/workflows/unpinned_first_party.yml new file mode 100644 index 000000000000..3161809fd0bf --- /dev/null +++ b/actions/ql/test/query-tests/Security/CWE-829-untrusted-owner/.github/workflows/unpinned_first_party.yml @@ -0,0 +1,13 @@ +name: Unpinned first-party actions +on: push +jobs: + build: + runs-on: ubuntu-latest + steps: + # `actions` is distrusted via `!actions`, and this action is not immutable, + # so this unpinned tag is reported. + - uses: actions/first-interaction@v1 + # `github` remains trusted, so this unpinned tag is not reported. + - uses: github/issue-labeler@v3.0 + # Third-party owner is always reported. + - uses: foo/bar@v1 diff --git a/actions/ql/test/query-tests/Security/CWE-829-untrusted-owner/UnpinnedActionsTag.expected b/actions/ql/test/query-tests/Security/CWE-829-untrusted-owner/UnpinnedActionsTag.expected new file mode 100644 index 000000000000..9b358e29773d --- /dev/null +++ b/actions/ql/test/query-tests/Security/CWE-829-untrusted-owner/UnpinnedActionsTag.expected @@ -0,0 +1,2 @@ +| .github/workflows/unpinned_first_party.yml:9:15:9:42 | actions/first-interaction@v1 | Unpinned 3rd party Action 'Unpinned first-party actions' step $@ uses 'actions/first-interaction' with ref 'v1', not a pinned commit hash | .github/workflows/unpinned_first_party.yml:9:9:11:6 | Uses Step | Uses Step | +| .github/workflows/unpinned_first_party.yml:13:15:13:24 | foo/bar@v1 | Unpinned 3rd party Action 'Unpinned first-party actions' step $@ uses 'foo/bar' with ref 'v1', not a pinned commit hash | .github/workflows/unpinned_first_party.yml:13:9:13:25 | Uses Step | Uses Step | diff --git a/actions/ql/test/query-tests/Security/CWE-829-untrusted-owner/UnpinnedActionsTag.ext.yml b/actions/ql/test/query-tests/Security/CWE-829-untrusted-owner/UnpinnedActionsTag.ext.yml new file mode 100644 index 000000000000..45aea89e7186 --- /dev/null +++ b/actions/ql/test/query-tests/Security/CWE-829-untrusted-owner/UnpinnedActionsTag.ext.yml @@ -0,0 +1,8 @@ +extensions: + - addsTo: + pack: codeql/actions-all + extensible: trustedActionsOwnerDataModel + data: + # Distrust the first-party `actions` owner so unpinned tags for its + # Actions are reported. `github` is intentionally left trusted. + - ["!actions"] diff --git a/actions/ql/test/query-tests/Security/CWE-829-untrusted-owner/UnpinnedActionsTag.qlref b/actions/ql/test/query-tests/Security/CWE-829-untrusted-owner/UnpinnedActionsTag.qlref new file mode 100644 index 000000000000..8c9db66bf6bb --- /dev/null +++ b/actions/ql/test/query-tests/Security/CWE-829-untrusted-owner/UnpinnedActionsTag.qlref @@ -0,0 +1 @@ +Security/CWE-829/UnpinnedActionsTag.ql diff --git a/docs/codeql/codeql-language-guides/customizing-library-models-for-actions.rst b/docs/codeql/codeql-language-guides/customizing-library-models-for-actions.rst index 0b78b37359f4..3f37d728dbf2 100644 --- a/docs/codeql/codeql-language-guides/customizing-library-models-for-actions.rst +++ b/docs/codeql/codeql-language-guides/customizing-library-models-for-actions.rst @@ -83,3 +83,22 @@ To allow any Action from the publisher ``octodemo``, such as ``octodemo/3rd-part 3. Ensure that the model pack is included in your CodeQL analysis. By following these steps, you will add ``octodemo`` to the list of trusted Action publishers, and the query will no longer generate security alerts for unpinned tags from this publisher. For more information, see `Extending CodeQL coverage with CodeQL model packs in default setup `_ and `Creating and working with CodeQL packs `_. + +Example: Remove a trusted Actions publisher for the ``actions/unpinned-tag`` query +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +GitHub's own organizations (``actions``, ``github`` and ``advanced-security``) are trusted by default. If you want unpinned tags for these first-party Actions to be reported as well, you can remove an owner from the trusted list by adding an entry prefixed with ``!``. A ``!`` entry always takes precedence over a plain entry for the same owner. + +To distrust the first-party ``github`` owner, add a data extension file with the following content: + +.. code-block:: yaml + + extensions: + - addsTo: + pack: codeql/actions-all + extensible: trustedActionsOwnerDataModel + data: + - ["!github"] + +With this in place, the query will once again report unpinned tags for Actions published by ``github``. + From c4ac327c554e278184e4338e9b98a14c0ec02a63 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema <93738568+jketema@users.noreply.github.com> Date: Mon, 24 Aug 2026 14:07:12 +0000 Subject: [PATCH 0486/2098] Publish patched rules_swift as codeql.2 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 7b8af11e-692d-4c94-87be-8cdaaf908e7c --- MODULE.bazel | 2 +- .../{4.0.0-rc5-codeql.1 => 4.0.0-rc5-codeql.2}/MODULE.bazel | 2 +- .../patches/external_static_runtime.patch | 0 .../patches/register_downloaded_macos_toolchain.patch | 0 .../{4.0.0-rc5-codeql.1 => 4.0.0-rc5-codeql.2}/source.json | 0 misc/bazel/registry/modules/rules_swift/metadata.json | 2 +- 6 files changed, 3 insertions(+), 3 deletions(-) rename misc/bazel/registry/modules/rules_swift/{4.0.0-rc5-codeql.1 => 4.0.0-rc5-codeql.2}/MODULE.bazel (98%) rename misc/bazel/registry/modules/rules_swift/{4.0.0-rc5-codeql.1 => 4.0.0-rc5-codeql.2}/patches/external_static_runtime.patch (100%) rename misc/bazel/registry/modules/rules_swift/{4.0.0-rc5-codeql.1 => 4.0.0-rc5-codeql.2}/patches/register_downloaded_macos_toolchain.patch (100%) rename misc/bazel/registry/modules/rules_swift/{4.0.0-rc5-codeql.1 => 4.0.0-rc5-codeql.2}/source.json (100%) diff --git a/MODULE.bazel b/MODULE.bazel index 6184b8c49cac..17a6936f892c 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -31,7 +31,7 @@ bazel_dep(name = "gazelle", version = "0.50.0") bazel_dep(name = "rules_dotnet", version = "0.21.5-codeql.1") bazel_dep(name = "googletest", version = "1.17.0.bcr.2") bazel_dep(name = "rules_rust", version = "0.69.0") -bazel_dep(name = "rules_swift", version = "4.0.0-rc5-codeql.1") +bazel_dep(name = "rules_swift", version = "4.0.0-rc5-codeql.2") bazel_dep(name = "swift-syntax", version = "603.0.2") bazel_dep(name = "zstd", version = "1.5.7.bcr.1") diff --git a/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/MODULE.bazel b/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.2/MODULE.bazel similarity index 98% rename from misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/MODULE.bazel rename to misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.2/MODULE.bazel index f83ac395da02..a6b75782dc5c 100644 --- a/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/MODULE.bazel +++ b/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.2/MODULE.bazel @@ -2,7 +2,7 @@ module( name = "rules_swift", - version = "4.0.0-rc5-codeql.1", + version = "4.0.0-rc5-codeql.2", bazel_compatibility = [">=8.0.0"], compatibility_level = 3, ) diff --git a/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/patches/external_static_runtime.patch b/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.2/patches/external_static_runtime.patch similarity index 100% rename from misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/patches/external_static_runtime.patch rename to misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.2/patches/external_static_runtime.patch diff --git a/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/patches/register_downloaded_macos_toolchain.patch b/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.2/patches/register_downloaded_macos_toolchain.patch similarity index 100% rename from misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/patches/register_downloaded_macos_toolchain.patch rename to misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.2/patches/register_downloaded_macos_toolchain.patch diff --git a/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/source.json b/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.2/source.json similarity index 100% rename from misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/source.json rename to misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.2/source.json diff --git a/misc/bazel/registry/modules/rules_swift/metadata.json b/misc/bazel/registry/modules/rules_swift/metadata.json index 188799c9dbf9..b07a19493505 100644 --- a/misc/bazel/registry/modules/rules_swift/metadata.json +++ b/misc/bazel/registry/modules/rules_swift/metadata.json @@ -5,7 +5,7 @@ "github:bazelbuild/rules_swift" ], "versions": [ - "4.0.0-rc5-codeql.1" + "4.0.0-rc5-codeql.2" ], "yanked_versions": {} } From 217cf521a4003167f9e78e3994857ada0d781434 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Mon, 24 Aug 2026 17:13:04 +0200 Subject: [PATCH 0487/2098] Rust: address extractor review comments - Own `Translator`'s path as `String`, dropping the `'a` lifetime - Route `reconstruct_format_args_expansion` bailouts through an `Option` helper using `?` - Reword `format_args` doc comments to state the AST-parity goal - Use `PartialEq` `if` instead of `let else` in `split_arguments` - Drop stale duplicate/toolchain-version comments --- rust/extractor/src/translate/base.rs | 101 +++++++----------- rust/extractor/src/translate/format_args.rs | 18 ++-- rust/extractor/src/translate/generated.rs | 2 +- .../format-macros-legacy/rust-toolchain.toml | 2 +- 4 files changed, 49 insertions(+), 74 deletions(-) diff --git a/rust/extractor/src/translate/base.rs b/rust/extractor/src/translate/base.rs index 63b394f89c32..8a46badd9829 100644 --- a/rust/extractor/src/translate/base.rs +++ b/rust/extractor/src/translate/base.rs @@ -22,7 +22,7 @@ use ra_ap_syntax_bridge::{ DocCommentDesugarMode, syntax_node_to_token_tree, token_tree_to_syntax_node, }; -impl Emission for Translator<'_, '_> { +impl Emission for Translator<'_> { fn pre_emit(&mut self, node: &ast::Item) -> Option> { self.item_pre_emit(node).map(Into::into) } @@ -32,7 +32,7 @@ impl Emission for Translator<'_, '_> { } } -impl Emission for Translator<'_, '_> { +impl Emission for Translator<'_> { fn pre_emit(&mut self, node: &ast::AssocItem) -> Option> { self.item_pre_emit(&node.clone().into()).map(Into::into) } @@ -42,7 +42,7 @@ impl Emission for Translator<'_, '_> { } } -impl Emission for Translator<'_, '_> { +impl Emission for Translator<'_> { fn pre_emit(&mut self, node: &ast::ExternItem) -> Option> { self.item_pre_emit(&node.clone().into()).map(Into::into) } @@ -52,7 +52,7 @@ impl Emission for Translator<'_, '_> { } } -impl Emission for Translator<'_, '_> { +impl Emission for Translator<'_> { fn pre_emit(&mut self, _node: &ast::Meta) -> Option> { self.macro_context_depth += 1; None @@ -63,43 +63,43 @@ impl Emission for Translator<'_, '_> { } } -impl Emission for Translator<'_, '_> { +impl Emission for Translator<'_> { fn post_emit(&mut self, node: &ast::Fn, label: Label) { self.emit_function_has_implementation(node, label); } } -impl Emission for Translator<'_, '_> { +impl Emission for Translator<'_> { fn post_emit(&mut self, node: &ast::Struct, label: Label) { self.emit_derive_expansion(node, label); } } -impl Emission for Translator<'_, '_> { +impl Emission for Translator<'_> { fn post_emit(&mut self, node: &ast::Enum, label: Label) { self.emit_derive_expansion(node, label); } } -impl Emission for Translator<'_, '_> { +impl Emission for Translator<'_> { fn post_emit(&mut self, node: &ast::Union, label: Label) { self.emit_derive_expansion(node, label); } } -impl Emission for Translator<'_, '_> { +impl Emission for Translator<'_> { fn post_emit(&mut self, node: &ast::PathSegment, label: Label) { self.extract_types_from_path_segment(node, label); } } -impl Emission for Translator<'_, '_> { +impl Emission for Translator<'_> { fn post_emit(&mut self, node: &ast::Const, label: Label) { self.emit_const_has_implementation(node, label); } } -impl Emission for Translator<'_, '_> { +impl Emission for Translator<'_> { fn post_emit(&mut self, node: &ast::MacroCall, label: Label) { self.extract_macro_call_expanded(node, label); } @@ -123,12 +123,9 @@ pub enum SourceKind { Library, } -// `'a` is the (short) lifetime of the borrowed `path`, `'db` the lifetime of the borrowed -// `Semantics`/database. They must stay separate: `Semantics<'db>` is invariant over `'db`, so -// coupling it to the shorter `'a` fails to type-check. -pub struct Translator<'a, 'db> { +pub struct Translator<'db> { pub trap: TrapFile, - path: &'a str, + path: String, label: Label, line_index: LineIndex, file_id: Option, @@ -147,18 +144,18 @@ const UNKNOWN_LOCATION: (LineCol, LineCol) = const DIAGNOSTIC_LIMIT_PER_FILE: usize = 100; -impl<'a, 'db> Translator<'a, 'db> { +impl<'db> Translator<'db> { pub fn new( trap: TrapFile, - path: &'a str, + path: &str, label: Label, line_index: LineIndex, semantic_info: Option<&FileSemanticInformation<'db>>, source_kind: SourceKind, - ) -> Translator<'a, 'db> { + ) -> Translator<'db> { Translator { trap, - path, + path: path.to_owned(), label, line_index, file_id: semantic_info.map(|i| i.file_id), @@ -464,9 +461,6 @@ impl<'a, 'db> Translator<'a, 'db> { } } else if self.semantics.is_some() { if self.reconstruct_format_args_expansion(mcall, label) { - // `rustc <1.94` sysroots no longer expand the format-family macros; we - // reconstruct their real expansion (a `FormatArgsExpr`, wrapped in the - // callee that carries flow and the sink models) so both are preserved. return; } // let's not spam warnings if we don't have semantics, we already emitted one @@ -806,23 +800,20 @@ impl<'a, 'db> Translator<'a, 'db> { mcall: &ast::MacroCall, label: Label, ) -> bool { - let Some(name) = mcall - .path() - .and_then(|p| p.segment()) - .and_then(|s| s.name_ref()) - .map(|n| n.text().to_string()) - else { - return false; - }; - let Some(wrap) = format_args::Wrap::for_macro(&name) else { - return false; - }; - let Some(tt_node) = mcall.token_tree() else { - return false; - }; - let Some(semantics) = self.semantics else { - return false; - }; + self.try_reconstruct_format_args_expansion(mcall, label) + .is_some() + } + + /// Attempts to reconstruct and emit a format-family macro expansion. + fn try_reconstruct_format_args_expansion( + &mut self, + mcall: &ast::MacroCall, + label: Label, + ) -> Option<()> { + let name = mcall.path()?.segment()?.name_ref()?.text().to_string(); + let wrap = format_args::Wrap::for_macro(&name)?; + let tt_node = mcall.token_tree()?; + let semantics = self.semantics?; let db = semantics.db; let file_id = semantics.hir_file_for(mcall.syntax()); let span_map = file_id.span_map(db); @@ -833,39 +824,25 @@ impl<'a, 'db> Translator<'a, 'db> { call_site, DocCommentDesugarMode::ProcMacro, ); - let Some(output) = format_args::reconstruct(wrap, &input, call_site) else { - return false; - }; + let output = format_args::reconstruct(wrap, &input, call_site)?; - let Some(edition) = self.file_id.map(|f| f.edition(db)) else { - return false; - }; + let edition = self.file_id.map(|f| f.edition(db))?; let (parsed, output_span_map) = token_tree_to_syntax_node(&output, TopEntryPoint::Expr, &mut |_| edition); let root = parsed.syntax_node(); - let Some(expr) = - ast::Expr::cast(root.clone()).or_else(|| root.descendants().find_map(ast::Expr::cast)) - else { - return false; - }; + let expr = + ast::Expr::cast(root.clone()).or_else(|| root.descendants().find_map(ast::Expr::cast))?; // Sanity check: the parsed expression must contain the reconstructed // `FormatArgsExpr` (either directly, or wrapped in the callee above). - if expr - .syntax() + expr.syntax() .descendants() - .find_map(ast::FormatArgsExpr::cast) - .is_none() - { - return false; - } + .find_map(ast::FormatArgsExpr::cast)?; let previous = self.builtin_derive_span_map.replace(output_span_map); let emitted = self.emit_expr(&expr); self.builtin_derive_span_map = previous; - let Some(value) = emitted else { - return false; - }; + let value = emitted?; generated::MacroCall::emit_macro_call_expansion(label, value.into(), &mut self.trap.writer); - true + Some(()) } pub(crate) fn emit_derive_expansion( diff --git a/rust/extractor/src/translate/format_args.rs b/rust/extractor/src/translate/format_args.rs index 9e0895cf3cb2..3fe0c048b208 100644 --- a/rust/extractor/src/translate/format_args.rs +++ b/rust/extractor/src/translate/format_args.rs @@ -2,11 +2,10 @@ //! //! On `rustc <1.94` sysroots the format-family macros (`format!`, `println!`, //! `write!`, `panic!`, ...) no longer resolve, so `expand_macro_call` returns `None` -//! and we get a bare unexpanded `MacroCall` with no flow through it (flow is modeled -//! on the `FormatArgsExpr` node, and the security sinks are keyed on the wrapping -//! callee). The syntactic lowering of these macros is a pure, sysroot-independent -//! transform, so we rebuild the same token tree the real (>=1.94) expansion has and -//! parse it ourselves. +//! and we get a bare unexpanded `MacroCall`. The syntactic lowering of these macros +//! is a pure, sysroot-independent transform, so we rebuild the same token tree the +//! real (>=1.94) expansion produces and parse it ourselves, giving pre-1.94 +//! toolchains the same AST as newer ones. //! //! This module owns the pure token-tree construction; [`super::base::Translator`] //! handles parsing the result and emitting it as the macro expansion. @@ -16,9 +15,8 @@ use ra_ap_hir_expand::tt; use ra_ap_span::Span; /// How a format-family macro wraps its `format_args!`. We rebuild the same shape the -/// real (>=1.94) expansion has, so that both dataflow and the sink models keyed on -/// the wrapping callee keep working on older toolchains. -#[derive(Clone, Copy)] +/// real (>=1.94) expansion has, so older toolchains get the same AST. +#[derive(Clone, Copy, PartialEq, Eq)] pub(crate) enum Wrap { /// `format_args!` and friends are themselves the `FormatArgsExpr`. Bare, @@ -87,9 +85,9 @@ fn split_arguments<'a>( wrap: Wrap, input: &'a tt::TopSubtree, ) -> Option<(Option>, tt::TokenTreesView<'a>)> { - let Wrap::WriteMethod = wrap else { + if wrap != Wrap::WriteMethod { return Some((None, input.view().token_trees())); - }; + } let mut iter = input.view().iter(); let start = iter.savepoint(); let mut found_comma = false; diff --git a/rust/extractor/src/translate/generated.rs b/rust/extractor/src/translate/generated.rs index b84cb0cfc8d9..f620af0e7cde 100644 --- a/rust/extractor/src/translate/generated.rs +++ b/rust/extractor/src/translate/generated.rs @@ -9,7 +9,7 @@ use ra_ap_syntax::ast::{ }; #[rustfmt::skip] use ra_ap_syntax::{AstNode, ast}; -impl Translator<'_, '_> { +impl Translator<'_> { pub(crate) fn emit_asm_operand( &mut self, node: &ast::AsmOperand, diff --git a/rust/ql/test/library-tests/format-macros-legacy/rust-toolchain.toml b/rust/ql/test/library-tests/format-macros-legacy/rust-toolchain.toml index d0d0ba2bb4b2..da4efb0b5b53 100644 --- a/rust/ql/test/library-tests/format-macros-legacy/rust-toolchain.toml +++ b/rust/ql/test/library-tests/format-macros-legacy/rust-toolchain.toml @@ -4,7 +4,7 @@ # a std that carries the new lowering (roughly >= 1.94). On older toolchains the # format-family macros (`format!`, `println!`, `write!`, ...) fail to expand, so # the extractor reconstructs the `FormatArgsExpr` itself. This test exercises that -# reconstruction path, which the default 1.95 test toolchain never hits. +# reconstruction path, which the default test toolchain never hits. # # Any toolchain named here must also be pre-installed in `../setup.sh`, otherwise # the parallel QL tests race on `rustup` auto-install. From c1f539f00cb98156e5895c4cb9a8dbdcb8588eaf Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Mon, 24 Aug 2026 17:15:32 +0200 Subject: [PATCH 0488/2098] Rust: rustfmt the reconstruction helper --- rust/extractor/src/translate/base.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rust/extractor/src/translate/base.rs b/rust/extractor/src/translate/base.rs index 8a46badd9829..800e693176e5 100644 --- a/rust/extractor/src/translate/base.rs +++ b/rust/extractor/src/translate/base.rs @@ -830,8 +830,8 @@ impl<'db> Translator<'db> { let (parsed, output_span_map) = token_tree_to_syntax_node(&output, TopEntryPoint::Expr, &mut |_| edition); let root = parsed.syntax_node(); - let expr = - ast::Expr::cast(root.clone()).or_else(|| root.descendants().find_map(ast::Expr::cast))?; + let expr = ast::Expr::cast(root.clone()) + .or_else(|| root.descendants().find_map(ast::Expr::cast))?; // Sanity check: the parsed expression must contain the reconstructed // `FormatArgsExpr` (either directly, or wrapped in the callee above). expr.syntax() From 575ff1532797cd9e43ba8a6fc17a812bf0d63d4b Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Mon, 24 Aug 2026 17:35:57 +0200 Subject: [PATCH 0489/2098] Rust: drop stale lifetime from codegen template Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 890cb55d-0437-4bd7-9268-87b8897ada01 --- rust/ast-generator/templates/extractor.mustache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust/ast-generator/templates/extractor.mustache b/rust/ast-generator/templates/extractor.mustache index 2f3f5f2015c7..03269c26ae3f 100644 --- a/rust/ast-generator/templates/extractor.mustache +++ b/rust/ast-generator/templates/extractor.mustache @@ -11,7 +11,7 @@ use ra_ap_syntax::ast::{ #[rustfmt::skip] use ra_ap_syntax::{AstNode, ast}; -impl Translator<'_, '_> { +impl Translator<'_> { {{#enums}} pub(crate) fn emit_{{snake_case_name}}(&mut self, node: &ast::{{ast_name}}) -> Option> { From fe3eaa8c72796a14dcacac1739e939ef50ec1886 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Mon, 24 Aug 2026 18:57:52 +0200 Subject: [PATCH 0490/2098] Use inline expectations for Actions test Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../test/InlineExpectationsTestQuery.ql | 23 +++++++++++++++++++ .../internal/InlineExpectationsTestImpl.qll | 13 +++++++++++ .../workflows/unpinned_first_party.yml | 4 ++-- .../UnpinnedActionsTag.expected | 2 +- .../UnpinnedActionsTag.qlref | 3 ++- 5 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 actions/ql/lib/codeql/actions/test/InlineExpectationsTestQuery.ql create mode 100644 actions/ql/lib/codeql/actions/test/internal/InlineExpectationsTestImpl.qll diff --git a/actions/ql/lib/codeql/actions/test/InlineExpectationsTestQuery.ql b/actions/ql/lib/codeql/actions/test/InlineExpectationsTestQuery.ql new file mode 100644 index 000000000000..43fcd031637a --- /dev/null +++ b/actions/ql/lib/codeql/actions/test/InlineExpectationsTestQuery.ql @@ -0,0 +1,23 @@ +/** + * @kind test-postprocess + */ + +private import actions +private import codeql.Locations +private import codeql.files.FileSystem +private import codeql.util.test.InlineExpectationsTest as T +private import codeql.actions.test.internal.InlineExpectationsTestImpl +import T::TestPostProcessing +import T::TestPostProcessing::Make + +private module Input implements T::TestPostProcessing::InputSig { + string getRelativeUrl(Location location) { + exists(File f, int startline, int startcolumn, int endline, int endcolumn | + location.hasLocationInfo(_, startline, startcolumn, endline, endcolumn) and + f = location.getFile() + | + result = + f.getRelativePath() + ":" + startline + ":" + startcolumn + ":" + endline + ":" + endcolumn + ) + } +} diff --git a/actions/ql/lib/codeql/actions/test/internal/InlineExpectationsTestImpl.qll b/actions/ql/lib/codeql/actions/test/internal/InlineExpectationsTestImpl.qll new file mode 100644 index 000000000000..5498ff795eb5 --- /dev/null +++ b/actions/ql/lib/codeql/actions/test/internal/InlineExpectationsTestImpl.qll @@ -0,0 +1,13 @@ +private import codeql.Locations as L +private import codeql.actions.ast.internal.Yaml +private import codeql.util.test.InlineExpectationsTest + +module Impl implements InlineExpectationsTestSig { + class ExpectationComment extends YamlNode { + ExpectationComment() { this.toString().matches("%$ %") } + + string getContents() { result = "$ " + this.toString().regexpCapture(".*\\$ (.*)", 1) } + } + + class Location = L::Location; +} diff --git a/actions/ql/test/query-tests/Security/CWE-829-untrusted-owner/.github/workflows/unpinned_first_party.yml b/actions/ql/test/query-tests/Security/CWE-829-untrusted-owner/.github/workflows/unpinned_first_party.yml index 3161809fd0bf..6617f509693d 100644 --- a/actions/ql/test/query-tests/Security/CWE-829-untrusted-owner/.github/workflows/unpinned_first_party.yml +++ b/actions/ql/test/query-tests/Security/CWE-829-untrusted-owner/.github/workflows/unpinned_first_party.yml @@ -6,8 +6,8 @@ jobs: steps: # `actions` is distrusted via `!actions`, and this action is not immutable, # so this unpinned tag is reported. - - uses: actions/first-interaction@v1 + - uses: actions/first-interaction@v1 # $ Alert # `github` remains trusted, so this unpinned tag is not reported. - uses: github/issue-labeler@v3.0 # Third-party owner is always reported. - - uses: foo/bar@v1 + - uses: foo/bar@v1 # $ Alert diff --git a/actions/ql/test/query-tests/Security/CWE-829-untrusted-owner/UnpinnedActionsTag.expected b/actions/ql/test/query-tests/Security/CWE-829-untrusted-owner/UnpinnedActionsTag.expected index 9b358e29773d..a047196d85fa 100644 --- a/actions/ql/test/query-tests/Security/CWE-829-untrusted-owner/UnpinnedActionsTag.expected +++ b/actions/ql/test/query-tests/Security/CWE-829-untrusted-owner/UnpinnedActionsTag.expected @@ -1,2 +1,2 @@ | .github/workflows/unpinned_first_party.yml:9:15:9:42 | actions/first-interaction@v1 | Unpinned 3rd party Action 'Unpinned first-party actions' step $@ uses 'actions/first-interaction' with ref 'v1', not a pinned commit hash | .github/workflows/unpinned_first_party.yml:9:9:11:6 | Uses Step | Uses Step | -| .github/workflows/unpinned_first_party.yml:13:15:13:24 | foo/bar@v1 | Unpinned 3rd party Action 'Unpinned first-party actions' step $@ uses 'foo/bar' with ref 'v1', not a pinned commit hash | .github/workflows/unpinned_first_party.yml:13:9:13:25 | Uses Step | Uses Step | +| .github/workflows/unpinned_first_party.yml:13:15:13:24 | foo/bar@v1 | Unpinned 3rd party Action 'Unpinned first-party actions' step $@ uses 'foo/bar' with ref 'v1', not a pinned commit hash | .github/workflows/unpinned_first_party.yml:13:9:13:35 | Uses Step | Uses Step | diff --git a/actions/ql/test/query-tests/Security/CWE-829-untrusted-owner/UnpinnedActionsTag.qlref b/actions/ql/test/query-tests/Security/CWE-829-untrusted-owner/UnpinnedActionsTag.qlref index 8c9db66bf6bb..9d46bb88b264 100644 --- a/actions/ql/test/query-tests/Security/CWE-829-untrusted-owner/UnpinnedActionsTag.qlref +++ b/actions/ql/test/query-tests/Security/CWE-829-untrusted-owner/UnpinnedActionsTag.qlref @@ -1 +1,2 @@ -Security/CWE-829/UnpinnedActionsTag.ql +query: Security/CWE-829/UnpinnedActionsTag.ql +postprocess: codeql/actions/test/InlineExpectationsTestQuery.ql From 13a73b5cca15ff67cad8ac731c9053e085cf6780 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Mon, 24 Aug 2026 19:08:32 +0200 Subject: [PATCH 0491/2098] Drop redundant `codeql.files.FileSystem` import `codeql.Locations` already re-exports it. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../ql/lib/codeql/actions/test/InlineExpectationsTestQuery.ql | 1 - 1 file changed, 1 deletion(-) diff --git a/actions/ql/lib/codeql/actions/test/InlineExpectationsTestQuery.ql b/actions/ql/lib/codeql/actions/test/InlineExpectationsTestQuery.ql index 43fcd031637a..4fb223e63092 100644 --- a/actions/ql/lib/codeql/actions/test/InlineExpectationsTestQuery.ql +++ b/actions/ql/lib/codeql/actions/test/InlineExpectationsTestQuery.ql @@ -4,7 +4,6 @@ private import actions private import codeql.Locations -private import codeql.files.FileSystem private import codeql.util.test.InlineExpectationsTest as T private import codeql.actions.test.internal.InlineExpectationsTestImpl import T::TestPostProcessing From 5871b87fe676394bccd11db563d5ac319afb1497 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Mon, 24 Aug 2026 20:08:48 +0100 Subject: [PATCH 0492/2098] JS: Add a test for an unusual import syntax which is not support in any modern JS implementations, but may be supported by transpilers. --- .../extractor/tests/es2015/input/import8.js | 1 + .../tests/es2015/output/trap/import8.js.trap | 28 +++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 javascript/extractor/tests/es2015/input/import8.js create mode 100644 javascript/extractor/tests/es2015/output/trap/import8.js.trap diff --git a/javascript/extractor/tests/es2015/input/import8.js b/javascript/extractor/tests/es2015/input/import8.js new file mode 100644 index 000000000000..90b02b5fc001 --- /dev/null +++ b/javascript/extractor/tests/es2015/input/import8.js @@ -0,0 +1 @@ +module Utils from "./utils"; \ No newline at end of file diff --git a/javascript/extractor/tests/es2015/output/trap/import8.js.trap b/javascript/extractor/tests/es2015/output/trap/import8.js.trap new file mode 100644 index 000000000000..3dc96cd68731 --- /dev/null +++ b/javascript/extractor/tests/es2015/output/trap/import8.js.trap @@ -0,0 +1,28 @@ +#10000=@"/import8.js;sourcefile" +files(#10000,"/import8.js") +#10001=@"/;folder" +folders(#10001,"/") +containerparent(#10001,#10000) +#10002=@"loc,{#10000},0,0,0,0" +locations_default(#10002,#10000,0,0,0,0) +hasLocation(#10000,#10002) +#20000=@"global_scope" +scopes(#20000,0) +#20001=@"script;{#10000},1,1" +toplevels(#20001,0) +#20002=@"loc,{#10000},1,1,1,1" +locations_default(#20002,#10000,1,1,1,1) +hasLocation(#20001,#20002) +#20003=* +js_parse_errors(#20003,#20001,"Error: Unexpected token","module Utils from ""./utils"";") +#20004=@"loc,{#10000},1,8,1,8" +locations_default(#20004,#10000,1,8,1,8) +hasLocation(#20003,#20004) +#20005=* +lines(#20005,#20001,"module Utils from ""./utils"";","") +#20006=@"loc,{#10000},1,1,1,28" +locations_default(#20006,#10000,1,1,1,28) +hasLocation(#20005,#20006) +numlines(#20001,1,0,0) +numlines(#10000,1,0,0) +filetype(#10000,"javascript") From df35070d0892a3466d45d230df4b2061d9e38275 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Mon, 24 Aug 2026 20:10:52 +0100 Subject: [PATCH 0493/2098] JS: Support an alternative syntax for imports and accept test changes. --- .../src/com/semmle/jcorn/Parser.java | 42 +++++++ .../tests/es2015/output/trap/import8.js.trap | 117 +++++++++++++++--- 2 files changed, 144 insertions(+), 15 deletions(-) diff --git a/javascript/extractor/src/com/semmle/jcorn/Parser.java b/javascript/extractor/src/com/semmle/jcorn/Parser.java index 3ae1491af10e..a248a82dd140 100644 --- a/javascript/extractor/src/com/semmle/jcorn/Parser.java +++ b/javascript/extractor/src/com/semmle/jcorn/Parser.java @@ -118,6 +118,9 @@ * 4.0.3, but does not support plugins, and always tracks full source locations. */ public class Parser { + private static final Pattern LEGACY_MODULE_IMPORT_TAIL = + Pattern.compile("\\s+[A-Za-z_$][A-Za-z0-9_$]*\\s+from\\s*['\"]"); + protected final Options options; protected final Set keywords; private final Set reservedWords, reservedWordsStrict, reservedWordsStrictBind; @@ -2718,6 +2721,18 @@ boolean isUsingDecl() { && Identifiers.isIdentifierChar(this.input.codePointAt(next), false); } + /** + * Checks for the abandoned ES6 draft namespace-import syntax: + * {@code module namespace from "module-name";}. + */ + boolean isLegacyModuleImport() { + if (this.type != TokenType.name || !this.value.equals("module")) return false; + + Matcher matcher = LEGACY_MODULE_IMPORT_TAIL.matcher(this.input); + matcher.region(this.pos, this.input.length()); + return matcher.lookingAt(); + } + /** * Parse a single statement. * @@ -2780,6 +2795,10 @@ protected Statement parseStatement(boolean declaration, boolean topLevel, Set specifiers = new ArrayList(); + specifiers.add(this.finishNode(new ImportNamespaceSpecifier(specifierLoc, local))); + return this.finishNode( + new ImportDeclaration( + loc, specifiers, source, null, ImportPhaseModifier.NONE)); + } + protected Expression parseImportOrExportAttributesAndSemicolon() { Expression result = null; if (!this.eagerlyTrySemicolon()) { diff --git a/javascript/extractor/tests/es2015/output/trap/import8.js.trap b/javascript/extractor/tests/es2015/output/trap/import8.js.trap index 3dc96cd68731..f794ba427c7e 100644 --- a/javascript/extractor/tests/es2015/output/trap/import8.js.trap +++ b/javascript/extractor/tests/es2015/output/trap/import8.js.trap @@ -9,20 +9,107 @@ hasLocation(#10000,#10002) #20000=@"global_scope" scopes(#20000,0) #20001=@"script;{#10000},1,1" +#20002=* +lines(#20002,#20001,"module Utils from ""./utils"";","") +#20003=@"loc,{#10000},1,1,1,28" +locations_default(#20003,#10000,1,1,1,28) +hasLocation(#20002,#20003) +numlines(#20001,1,1,0) +#20004=* +tokeninfo(#20004,6,#20001,0,"module") +#20005=@"loc,{#10000},1,1,1,6" +locations_default(#20005,#10000,1,1,1,6) +hasLocation(#20004,#20005) +#20006=* +tokeninfo(#20006,6,#20001,1,"Utils") +#20007=@"loc,{#10000},1,8,1,12" +locations_default(#20007,#10000,1,8,1,12) +hasLocation(#20006,#20007) +#20008=* +tokeninfo(#20008,6,#20001,2,"from") +#20009=@"loc,{#10000},1,14,1,17" +locations_default(#20009,#10000,1,14,1,17) +hasLocation(#20008,#20009) +#20010=* +tokeninfo(#20010,4,#20001,3,"""./utils""") +#20011=@"loc,{#10000},1,19,1,27" +locations_default(#20011,#10000,1,19,1,27) +hasLocation(#20010,#20011) +#20012=* +tokeninfo(#20012,8,#20001,4,";") +#20013=@"loc,{#10000},1,28,1,28" +locations_default(#20013,#10000,1,28,1,28) +hasLocation(#20012,#20013) +#20014=* +tokeninfo(#20014,0,#20001,5,"") +#20015=@"loc,{#10000},1,29,1,28" +locations_default(#20015,#10000,1,29,1,28) +hasLocation(#20014,#20015) toplevels(#20001,0) -#20002=@"loc,{#10000},1,1,1,1" -locations_default(#20002,#10000,1,1,1,1) -hasLocation(#20001,#20002) -#20003=* -js_parse_errors(#20003,#20001,"Error: Unexpected token","module Utils from ""./utils"";") -#20004=@"loc,{#10000},1,8,1,8" -locations_default(#20004,#10000,1,8,1,8) -hasLocation(#20003,#20004) -#20005=* -lines(#20005,#20001,"module Utils from ""./utils"";","") -#20006=@"loc,{#10000},1,1,1,28" -locations_default(#20006,#10000,1,1,1,28) -hasLocation(#20005,#20006) -numlines(#20001,1,0,0) -numlines(#10000,1,0,0) +hasLocation(#20001,#20003) +#20016=@"var;{Utils};{#20000}" +variables(#20016,"Utils",#20000) +#20017=@"local_type_name;{Utils};{#20000}" +local_type_names(#20017,"Utils",#20000) +#20018=@"local_namespace_name;{Utils};{#20000}" +local_namespace_names(#20018,"Utils",#20000) +variables(#20016,"Utils",#20000) +local_type_names(#20017,"Utils",#20000) +local_namespace_names(#20018,"Utils",#20000) +#20019=@"var;{this};{#20000}" +variables(#20019,"this",#20000) +#20020=* +stmts(#20020,27,#20001,0,"module ... utils"";") +hasLocation(#20020,#20003) +stmt_containers(#20020,#20001) +#20021=* +exprs(#20021,4,#20020,-1,"""./utils""") +hasLocation(#20021,#20011) +enclosing_stmt(#20021,#20020) +expr_containers(#20021,#20001) +literals("./utils","""./utils""",#20021) +#20022=* +regexpterm(#20022,1,#20021,0,"./utils") +#20023=@"loc,{#10000},1,20,1,26" +locations_default(#20023,#10000,1,20,1,26) +hasLocation(#20022,#20023) +#20024=* +regexpterm(#20024,12,#20022,0,".") +#20025=@"loc,{#10000},1,20,1,20" +locations_default(#20025,#10000,1,20,1,20) +hasLocation(#20024,#20025) +#20026=* +regexpterm(#20026,14,#20022,1,"/utils") +#20027=@"loc,{#10000},1,21,1,26" +locations_default(#20027,#10000,1,21,1,26) +hasLocation(#20026,#20027) +regexp_const_value(#20026,"/utils") +#20028=* +exprs(#20028,85,#20020,0,"Utils f ... utils"";") +#20029=@"loc,{#10000},1,8,1,28" +locations_default(#20029,#10000,1,8,1,28) +hasLocation(#20028,#20029) +enclosing_stmt(#20028,#20020) +expr_containers(#20028,#20001) +#20030=* +exprs(#20030,78,#20028,1,"Utils") +hasLocation(#20030,#20007) +enclosing_stmt(#20030,#20020) +expr_containers(#20030,#20001) +literals("Utils","Utils",#20030) +decl(#20030,#20016) +typedecl(#20030,#20017) +namespacedecl(#20030,#20018) +#20031=* +entry_cfg_node(#20031,#20001) +#20032=@"loc,{#10000},1,1,1,0" +locations_default(#20032,#10000,1,1,1,0) +hasLocation(#20031,#20032) +#20033=* +exit_cfg_node(#20033,#20001) +hasLocation(#20033,#20015) +successor(#20020,#20033) +successor(#20028,#20020) +successor(#20031,#20028) +numlines(#10000,1,1,0) filetype(#10000,"javascript") From 61ec80f678dca05da116b3d8db15ebb3081efcd3 Mon Sep 17 00:00:00 2001 From: JarLob Date: Mon, 24 Aug 2026 22:17:34 +0300 Subject: [PATCH 0494/2098] Improve performance --- .../semmle/code/csharp/frameworks/microsoft/AspNetCore.qll | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll index a7f7c4f3e1d0..abdd81646828 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll @@ -220,6 +220,8 @@ private predicate isPotentialMicrosoftAspNetCoreMvcController(Class controller) ) } +bindingset[element] +pragma[inline_late] private Compilation getACompilationFor(Element element) { result.getAFileCompiled() = element.getFile() } @@ -351,7 +353,7 @@ private predicate isMicrosoftAspNetCoreMvcFallbackEndpointMapping(MethodCall cal private predicate hasMicrosoftAspNetCoreMvcEndpointMapping(Compilation application, Class controller) { isInMicrosoftAspNetCoreMvcApplication(controller, application) and exists(MethodCall mapping | - application.getAFileCompiled() = mapping.getFile() and + application = getACompilationFor(mapping) and ( isMicrosoftAspNetCoreMvcConventionalEndpointMapping(mapping) or From ff5a248b98103243f88c9d764763dbd4b19a8986 Mon Sep 17 00:00:00 2001 From: John Zabroski Date: Mon, 24 Aug 2026 18:34:12 -0400 Subject: [PATCH 0495/2098] Correct 'enable' to 'enabled' in ASP.NET example --- .../CWE-548/ASPNetDirectoryListing.qhelp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/csharp/ql/src/Security Features/CWE-548/ASPNetDirectoryListing.qhelp b/csharp/ql/src/Security Features/CWE-548/ASPNetDirectoryListing.qhelp index f078ff574058..e03cf21a96f0 100644 --- a/csharp/ql/src/Security Features/CWE-548/ASPNetDirectoryListing.qhelp +++ b/csharp/ql/src/Security Features/CWE-548/ASPNetDirectoryListing.qhelp @@ -21,13 +21,13 @@ If this configuration may be used in production, remove the directoryBrows

    -The following example shows the directoryBrowse enable attribute set to true in a Web.config file for ASP.NET: +The following example shows the directoryBrowse enabled attribute set to true in a Web.config file for ASP.NET:

    -To fix this problem, the enable attribute should be set to false, or the directoryBrowse element should be removed completely: +To fix this problem, the enabled attribute should be set to false, or the directoryBrowse element should be removed completely:

    @@ -36,8 +36,8 @@ To fix this problem, the enable attribute should be set to fa
  • -MSDN: -directoryBrowse element. +Microsoft Learn: +directoryBrowse element.
  • From c23b3a9e03c5ddbbd90e168225f99facb996fe6f Mon Sep 17 00:00:00 2001 From: John Zabroski Date: Mon, 24 Aug 2026 18:37:25 -0400 Subject: [PATCH 0496/2098] Fix typo in directoryBrowse attribute --- csharp/ql/src/Security Features/CWE-548/Web.config.bad | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/csharp/ql/src/Security Features/CWE-548/Web.config.bad b/csharp/ql/src/Security Features/CWE-548/Web.config.bad index 24f547103f82..172f4c9aa656 100644 --- a/csharp/ql/src/Security Features/CWE-548/Web.config.bad +++ b/csharp/ql/src/Security Features/CWE-548/Web.config.bad @@ -1,7 +1,7 @@ - + ... - \ No newline at end of file + From ada881e5460a777fb15a321efd640f16c1796a7b Mon Sep 17 00:00:00 2001 From: John Zabroski Date: Mon, 24 Aug 2026 18:37:38 -0400 Subject: [PATCH 0497/2098] Fix directoryBrowse attribute from 'enable' to 'enabled' --- csharp/ql/src/Security Features/CWE-548/Web.config.good | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/csharp/ql/src/Security Features/CWE-548/Web.config.good b/csharp/ql/src/Security Features/CWE-548/Web.config.good index 5c0566153c64..76ba2eb597d7 100644 --- a/csharp/ql/src/Security Features/CWE-548/Web.config.good +++ b/csharp/ql/src/Security Features/CWE-548/Web.config.good @@ -1,7 +1,7 @@ - + ... - \ No newline at end of file + From 7f4324512a4f92281368c4114e4e271009460b4f Mon Sep 17 00:00:00 2001 From: John Zabroski Date: Mon, 24 Aug 2026 19:09:01 -0400 Subject: [PATCH 0498/2098] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- csharp/ql/src/Security Features/CWE-548/Web.config.good | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csharp/ql/src/Security Features/CWE-548/Web.config.good b/csharp/ql/src/Security Features/CWE-548/Web.config.good index 76ba2eb597d7..b2d3258c5d05 100644 --- a/csharp/ql/src/Security Features/CWE-548/Web.config.good +++ b/csharp/ql/src/Security Features/CWE-548/Web.config.good @@ -3,5 +3,5 @@ ... - + From 748fbc7a11830dab9b9c9ca0700949c59ee5f634 Mon Sep 17 00:00:00 2001 From: John Zabroski Date: Mon, 24 Aug 2026 19:11:19 -0400 Subject: [PATCH 0499/2098] Fix closing tag --- csharp/ql/src/Security Features/CWE-548/Web.config.bad | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csharp/ql/src/Security Features/CWE-548/Web.config.bad b/csharp/ql/src/Security Features/CWE-548/Web.config.bad index 172f4c9aa656..0d579a8d9a06 100644 --- a/csharp/ql/src/Security Features/CWE-548/Web.config.bad +++ b/csharp/ql/src/Security Features/CWE-548/Web.config.bad @@ -3,5 +3,5 @@ ... - + From 3cf499f3d439088c6d42c84653a5ca0ddb2bcd23 Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 25 Aug 2026 09:12:31 +0200 Subject: [PATCH 0500/2098] unified: Rename TExportedNamespace -> TStaticMemberNamespace Originally this node was intended to cover TopLevels as well, but things evolved differently, and this name works better since it's only for classes. --- .../unified/internal/StaticNameBinding.qll | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index dcb97b4fbae8..38430dce1a01 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -10,7 +10,7 @@ private newtype TNameBindingNode = TIdentifier(Identifier n) or TBulkImport(BulkImportingPattern p) or TLocalName(LocalName local) or - TExportedNamespace(ClassLikeDeclaration cls) or + TStaticMemberNamespace(ClassLikeDeclaration cls) or TLocalNamespace(AstNode n) { n = any(TopLevel t).getBody() or // Imported names come in scope here n instanceof ClassLikeDeclaration @@ -31,8 +31,8 @@ class NameBindingNode extends TNameBindingNode { predicate isLocalName(LocalName local) { this = TLocalName(local) } - /** Holds if this represents the set of static members available in the given namespace. */ - predicate isExportedNamespace(ClassLikeDeclaration cls) { this = TExportedNamespace(cls) } + /** Holds if this represents the set of static members available in the given class. */ + predicate isStaticMemberNamespace(ClassLikeDeclaration cls) { this = TStaticMemberNamespace(cls) } /** Holds if this represents the set of members that can be accessed unqualified within the given scope. */ predicate isLocalNamespace(AstNode n) { this = TLocalNamespace(n) } @@ -56,7 +56,7 @@ class NameBindingNode extends TNameBindingNode { or this.isBulkImport(result) or - this.isExportedNamespace(result) + this.isStaticMemberNamespace(result) or this.isLocalNamespace(result) or @@ -71,7 +71,7 @@ class NameBindingNode extends TNameBindingNode { exists(LocalName local | this.isLocalName(local) and result = "LocalName(" + local + ")") or exists(ClassLikeDeclaration cls | - this.isExportedNamespace(cls) and result = "ExportedNamespace(" + cls + ")" + this.isStaticMemberNamespace(cls) and result = "StaticMemberNamespace(" + cls + ")" ) or exists(AstNode n | this.isLocalNamespace(n) and result = "LocalNamespace(" + n + ")") @@ -92,7 +92,9 @@ class NameBindingNode extends TNameBindingNode { or exists(LocalName local | this.isLocalName(local) and result = local.getLocation()) or - exists(ClassLikeDeclaration cls | this.isExportedNamespace(cls) and result = cls.getLocation()) + exists(ClassLikeDeclaration cls | + this.isStaticMemberNamespace(cls) and result = cls.getLocation() + ) or exists(AstNode n | this.isLocalNamespace(n) and result = n.getLocation()) or @@ -162,7 +164,7 @@ predicate storeStep(NameBindingNode node1, string name, NameBindingNode node2) { nameDecl.getDeclaration() = member and node1.isIdentifier(nameDecl) and name = nameDecl.getName() and - node2.isExportedNamespace(cls) + node2.isStaticMemberNamespace(cls) ) or exists(TopLevel top, Stmt stmt, NameDeclaration nameDecl | @@ -195,12 +197,12 @@ predicate valueStep(NameBindingNode node1, NameBindingNode node2) { ) or exists(ClassLikeDeclaration cls | - node1.isExportedNamespace(cls) and + node1.isStaticMemberNamespace(cls) and node2.isIdentifier(cls.getName()) ) or exists(ClassLikeDeclaration cls | - node1.isExportedNamespace(cls) and + node1.isStaticMemberNamespace(cls) and node2.isLocalNamespace(cls) ) or @@ -249,7 +251,7 @@ predicate inheritanceStep(NameBindingNode supertype, NameBindingNode subtype) { exists(ClassLikeDeclaration cls, BaseType base | base = cls.getABaseType() and supertype = getNodeFromRef(base.getType()) and - subtype.isExportedNamespace(cls) + subtype.isStaticMemberNamespace(cls) ) } From cd0afb9380d84da5f36658460e7de552474b8764 Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 25 Aug 2026 09:13:33 +0200 Subject: [PATCH 0501/2098] unified: Add TInstanceMemberNamespace --- .../codeql/unified/internal/StaticNameBinding.qll | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 38430dce1a01..e5664ab53866 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -11,6 +11,7 @@ private newtype TNameBindingNode = TBulkImport(BulkImportingPattern p) or TLocalName(LocalName local) or TStaticMemberNamespace(ClassLikeDeclaration cls) or + TInstanceMemberNamespace(ClassLikeDeclaration cls) or TLocalNamespace(AstNode n) { n = any(TopLevel t).getBody() or // Imported names come in scope here n instanceof ClassLikeDeclaration @@ -34,6 +35,11 @@ class NameBindingNode extends TNameBindingNode { /** Holds if this represents the set of static members available in the given class. */ predicate isStaticMemberNamespace(ClassLikeDeclaration cls) { this = TStaticMemberNamespace(cls) } + /** Holds if this represents the set of instance members available in the given class. */ + predicate isInstanceMemberNamespace(ClassLikeDeclaration cls) { + this = TInstanceMemberNamespace(cls) + } + /** Holds if this represents the set of members that can be accessed unqualified within the given scope. */ predicate isLocalNamespace(AstNode n) { this = TLocalNamespace(n) } @@ -74,6 +80,10 @@ class NameBindingNode extends TNameBindingNode { this.isStaticMemberNamespace(cls) and result = "StaticMemberNamespace(" + cls + ")" ) or + exists(ClassLikeDeclaration cls | + this.isInstanceMemberNamespace(cls) and result = "InstanceMemberNamespace(" + cls + ")" + ) + or exists(AstNode n | this.isLocalNamespace(n) and result = "LocalNamespace(" + n + ")") or exists(ModuleScopeRepr repr | @@ -96,6 +106,10 @@ class NameBindingNode extends TNameBindingNode { this.isStaticMemberNamespace(cls) and result = cls.getLocation() ) or + exists(ClassLikeDeclaration cls | + this.isInstanceMemberNamespace(cls) and result = cls.getLocation() + ) + or exists(AstNode n | this.isLocalNamespace(n) and result = n.getLocation()) or exists(ModuleScopeRepr repr | this.isModuleScopeNode(repr) and result = repr.getLocation()) From 40a029191400cd61203686f98b39e5a1ad43b261 Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 25 Aug 2026 09:13:52 +0200 Subject: [PATCH 0502/2098] unified: Store instance members in the new node --- .../ql/lib/codeql/unified/internal/StaticNameBinding.qll | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index e5664ab53866..12f463c89b35 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -173,12 +173,15 @@ predicate readStep(NameBindingNode node1, string name, NameBindingNode node2) { predicate storeStep(NameBindingNode node1, string name, NameBindingNode node2) { exists(ClassLikeDeclaration cls, Member member, NameDeclaration nameDecl | member = cls.getAMember() and - not isInstanceMember(member) and not isPrivateToLocalScope(nameDecl) and nameDecl.getDeclaration() = member and node1.isIdentifier(nameDecl) and name = nameDecl.getName() and - node2.isStaticMemberNamespace(cls) + ( + if isInstanceMember(member) + then node2.isInstanceMemberNamespace(cls) + else node2.isStaticMemberNamespace(cls) + ) ) or exists(TopLevel top, Stmt stmt, NameDeclaration nameDecl | From 2bc839d6d5f65df6be396c41f9c107a7c1e8c48a Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 25 Aug 2026 09:18:09 +0200 Subject: [PATCH 0503/2098] unified: Add inheritance between instance namespaces --- .../unified/internal/StaticNameBinding.qll | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 12f463c89b35..84451f23e179 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -327,8 +327,27 @@ class NamespaceNode extends NameBindingNode { /** Holds if this namespace has an own-member of the given name */ predicate hasOwnMember(string name) { exists(this.getOwnMember(name)) } + /** If this is the static namespace for a class, gets the corresponding instance namespace. */ + NamespaceNode toInstanceNamespace() { + exists(ClassLikeDeclaration cls | + this.isStaticMemberNamespace(cls) and + result.isInstanceMemberNamespace(cls) + ) + } + + /** If this is the instance namespace for a class, gets the corresponding static namespace. */ + NamespaceNode toStaticNamespace() { result.toInstanceNamespace() = this } + + private NamespaceNode getAnInheritanceParent1() { inheritanceStep(result.ref(), this) } + /** Gets a namespace from which this namespace inherits directly. */ - NamespaceNode getAnInheritanceParent() { inheritanceStep(result.ref(), this) } + NamespaceNode getAnInheritanceParent() { + result = this.getAnInheritanceParent1() + or + // `inheritanceStep` connects the static namespaces of classes. + // Add the corresponding inheritance relation between the instance namespaces. + result = this.toStaticNamespace().getAnInheritanceParent1().toInstanceNamespace() + } /** Gets a namespace that directly inherits from this one. */ NamespaceNode getAnInheritanceChild() { result.getAnInheritanceParent() = this } From 5b31814c8e787ffc8c98e772332ca8be224bf55b Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 25 Aug 2026 09:20:16 +0200 Subject: [PATCH 0504/2098] unified: Ensure member-namespaces are always NamespaceNodes Avoids surprising edges cases when a class has no instance/static members --- .../ql/lib/codeql/unified/internal/StaticNameBinding.qll | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 84451f23e179..f1253fbb92a3 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -316,7 +316,12 @@ private predicate derivedStoreReadStep(NameBindingNode node1, NameBindingNode no /** A name-binding node that has members. */ class NamespaceNode extends NameBindingNode { - NamespaceNode() { storeStep(_, _, this) or inheritanceStep(_, this) } + NamespaceNode() { + storeStep(_, _, this) or + inheritanceStep(_, this) or + this.isInstanceMemberNamespace(_) or + this.isStaticMemberNamespace(_) + } /** Gets a name-binding node that may refer to this namespace. */ NameBindingNode ref() { result = TrackNamespace::track(this) } From 981fc4d9bd4be8886d070b3f868b3b4e80c827e6 Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 25 Aug 2026 09:21:27 +0200 Subject: [PATCH 0505/2098] unified: Add language hook for inheritance restriction --- .../unified/internal/NameBindingPlugin.qll | 27 +++++++++++++++++++ .../internal/NameBindingPluginSwift.qll | 6 +++++ .../unified/internal/StaticNameBinding.qll | 12 ++++++++- 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll b/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll index a0a7028dfe92..a3b4ce6f7ff8 100644 --- a/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll +++ b/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll @@ -25,6 +25,15 @@ class NameBindingPlugin extends Unit { */ bindingset[member, binding] predicate isPrivateToLocalScope(Stmt member, AstNode binding) { none() } + + /** + * Holds if `member` can be inherited by subclasses of `cls`. + * + * The caller has already restricted `member` to be a member of `cls`, and + * ensured that `member` is a `VariableDeclaration` or `FunctionDeclaration`. + */ + bindingset[cls, member] + predicate isInheritableMember(ClassLikeDeclaration cls, Member member) { none() } } /** Holds if `member` is an instance member. */ @@ -35,6 +44,24 @@ predicate isInstanceMember(Member member) { ) } +/** + * Holds if `member` is a non-instance member declared in the context of a class or top-level. + */ +predicate isStaticMember(Member member) { + exists(ClassLikeDeclaration cls | cls.getAMember() = member | + not any(NameBindingPlugin p).isInstanceMember(cls, member) + ) + or + member = any(TopLevel t).getBody().getAStmt() +} + +/** Holds if `member` is an inheritable member. */ +predicate isInheritableMember(Member member) { + exists(ClassLikeDeclaration cls | cls.getAMember() = member | + any(NameBindingPlugin p).isInheritableMember(cls, member) + ) +} + /** Holds if `binding` is only visible in its local scope. */ pragma[nomagic] predicate isPrivateToLocalScope(AstNode binding) { diff --git a/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll b/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll index eaa8f46c65f4..329246f4474d 100644 --- a/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll +++ b/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll @@ -29,6 +29,12 @@ class NameBindingPluginSwift extends NameBindingPlugin { // Note: Private class members can be seen within type-extensions in the same file, // so we can't declare those private to their local scope. } + + bindingset[cls, member] + override predicate isInheritableMember(ClassLikeDeclaration cls, Member member) { + exists(cls) and + not member.hasModifier("private") + } } private predicate predefinedSourceFolders(string folder, int ordering) { diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index f1253fbb92a3..b4ad8a02f8f4 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -314,6 +314,15 @@ private predicate derivedStoreReadStep(NameBindingNode node1, NameBindingNode no ) } +/** Holds if the member represented by `node` cannot be inherited. */ +pragma[nomagic] +private predicate isInheritableMemberNode(NameBindingNode node) { + exists(NameDeclaration decl | + node.isIdentifier(decl) and + isInheritableMember(decl.getDeclaration()) + ) +} + /** A name-binding node that has members. */ class NamespaceNode extends NameBindingNode { NamespaceNode() { @@ -363,7 +372,8 @@ class NamespaceNode extends NameBindingNode { result = this.getOwnMember(name) or not this.hasOwnMember(name) and - result = this.getAnInheritanceParent().getMember(name) + result = this.getAnInheritanceParent().getMember(name) and + isInheritableMemberNode(result) } } From 2b28f759d04375e5035477565dfcdc555c43f88c Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 25 Aug 2026 09:26:01 +0200 Subject: [PATCH 0506/2098] unified: Expose handling of unqualified member accesses UnqualifiedMemberAccess might go into Public one day --- .../lib/codeql/unified/internal/FacadeAst.qll | 7 ++ .../unified/internal/StaticNameBinding.qll | 81 +++++++++++++++++++ 2 files changed, 88 insertions(+) diff --git a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll index cb00bae7eeca..44adef76e425 100644 --- a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll +++ b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll @@ -30,6 +30,13 @@ module Unified { not this instanceof ClassLikeDeclaration and result = this.getParent().getEnclosingClass() } + + /** Gets the depth of this node in the AST. The root node has a depth of 0. */ + int getDepth() { + not exists(this.getParent()) and result = 0 + or + result = this.getParent().getDepth() + 1 + } } /** An expression */ diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index b4ad8a02f8f4..ea331b1e8a35 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -559,3 +559,84 @@ private module FolderHeuristic { ) } } + +/** + * Holds if `access` may resolve to `target` through the enclosing `accessingClass`. + * + * `instanceAccess` indicates if this this member should be accessed as an instance of `accessingClass` + * or as a static member. + */ +private predicate unqualifiedMemberAccessCand( + PotentialLocalNameAccess access, boolean instanceAccess, NameDeclaration target, + ClassLikeDeclaration accessingClass +) { + not access instanceof NameDeclaration and + ( + // Resolved by local scoping + exists(LocalName local | + target.getLocalName() = local and + access.getLocalName() = local and + target.getDeclaration() = accessingClass.getAMember() + | + instanceAccess = true and + isInstanceMember(target.getDeclaration()) + or + instanceAccess = false and + isStaticMember(target.getDeclaration()) + ) + or + // Resolved in an uncertain scope + exists(NamespaceNode namespace, string name | + name = access.getName() and + accessingClass = LocalNameBindingOutput::getAnUncertainScope(access, name) + | + instanceAccess = true and + namespace.isInstanceMemberNamespace(accessingClass) and + namespace.getMember(name).isIdentifier(target) + or + instanceAccess = false and + namespace.isStaticMemberNamespace(accessingClass) and + namespace.getMember(name).isIdentifier(target) + ) + ) +} + +private int unqualifiedMemberAccessDepth(PotentialLocalNameAccess access) { + result = max(AstNode scope | unqualifiedMemberAccessCand(access, _, _, scope) | scope.getDepth()) +} + +/** + * Holds if `access` is an unqualified access to `target`. + * + * `accessingClass` is the enclosing class in which the member was found, and + * `instanceAccess` indicates if it is an instance member or static member. + */ +predicate unqualifiedMemberAccess( + PotentialLocalNameAccess access, boolean instanceAccess, NameDeclaration target, + ClassLikeDeclaration accessingClass +) { + unqualifiedMemberAccessCand(access, instanceAccess, target, accessingClass) and + accessingClass.getDepth() = unqualifiedMemberAccessDepth(access) +} + +/** + * An identifier appearing in a unqualified position, referring to a member of an enclosing class. + */ +class UnqualifiedMemberAccess extends Identifier { + private boolean instanceAccess; + private NameDeclaration target; + private ClassLikeDeclaration accessingClass; + + UnqualifiedMemberAccess() { + unqualifiedMemberAccess(this, instanceAccess, target, accessingClass) + } + + /** Gets the name declaration of the member being accessed. */ + NameDeclaration getTarget() { result = target } + + /** Gets the enclosing class whose (possibly inherited) member is being accessed. */ + ClassLikeDeclaration getAccessingClass() { result = accessingClass } + + /** Holds if this is an instance access on the accessing class. */ + predicate isInstanceAccess() { instanceAccess = true } +} From b1ca110785038713cc394a750596baa260efd34c Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 25 Aug 2026 09:26:37 +0200 Subject: [PATCH 0507/2098] unified: Add getStaticBindingTarget --- unified/ql/lib/codeql/Definitions.qll | 2 +- .../codeql/unified/internal/StaticNameBinding.qll | 10 ++++++++++ .../implicit-instance-field-access.swift | 13 +++++++++++++ .../test/library-tests/static-name-binding/test.ql | 2 +- .../static-name-binding/unqualified-access.swift | 2 +- 5 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 unified/ql/test/library-tests/static-name-binding/implicit-instance-field-access.swift diff --git a/unified/ql/lib/codeql/Definitions.qll b/unified/ql/lib/codeql/Definitions.qll index 927119530401..3eb6ddcef102 100644 --- a/unified/ql/lib/codeql/Definitions.qll +++ b/unified/ql/lib/codeql/Definitions.qll @@ -10,7 +10,7 @@ private import codeql.unified.internal.StaticNameBinding */ cached predicate definitionOf(Identifier reference, NameDeclaration definition, string kind) { - reference = trackNameDeclaration(definition).asIdentifier() and + definition = getStaticBindingTarget(reference) and not reference instanceof NameDeclaration and kind = "name" } diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index ea331b1e8a35..b38d405b165d 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -640,3 +640,13 @@ class UnqualifiedMemberAccess extends Identifier { /** Holds if this is an instance access on the accessing class. */ predicate isInstanceAccess() { instanceAccess = true } } + +/** Gets the declaration being accessed by `access`, as determined by static name binding. */ +NameDeclaration getStaticBindingTarget(Identifier access) { + // For unqualified accesses, use the shadowing-aware lookup + result = access.(UnqualifiedMemberAccess).getTarget() + or + // For others, just follow the name binding graph + not access instanceof UnqualifiedMemberAccess and + trackNameDeclaration(result).asIdentifier() = access +} diff --git a/unified/ql/test/library-tests/static-name-binding/implicit-instance-field-access.swift b/unified/ql/test/library-tests/static-name-binding/implicit-instance-field-access.swift new file mode 100644 index 000000000000..6bdf2c0669aa --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/implicit-instance-field-access.swift @@ -0,0 +1,13 @@ +private class A { + let x = 123 // name=A.instance.x + + func getX() { + return x // $ access=A.instance.x + } +} + +private class B : A { // $ access=A + func getX2() { + return x // $ access=A.instance.x + } +} diff --git a/unified/ql/test/library-tests/static-name-binding/test.ql b/unified/ql/test/library-tests/static-name-binding/test.ql index a1e49ce0609c..e6dd7e64f6b3 100644 --- a/unified/ql/test/library-tests/static-name-binding/test.ql +++ b/unified/ql/test/library-tests/static-name-binding/test.ql @@ -8,7 +8,7 @@ module StaticDeclAccess implements TestSig { predicate hasActualResult(Location location, string element, string tag, string value) { exists(NameDeclaration decl, Identifier access | - access = trackNameDeclaration(decl).asIdentifier() and + decl = getStaticBindingTarget(access) and not access instanceof NameDeclaration and location = access.getLocation() and element = access.toString() and diff --git a/unified/ql/test/library-tests/static-name-binding/unqualified-access.swift b/unified/ql/test/library-tests/static-name-binding/unqualified-access.swift index 86cadc0b7a1f..434dd0dc8ac1 100644 --- a/unified/ql/test/library-tests/static-name-binding/unqualified-access.swift +++ b/unified/ql/test/library-tests/static-name-binding/unqualified-access.swift @@ -10,7 +10,7 @@ class ASub : A { // $ access=A class BSub : B { // $ access=A.B let x3: B = nil; // $ access=A.B - let x4: C = nil; // $ access=A.B.C SPURIOUS: access=Target3.C // spurious result from folder-based heuristic + let x4: C = nil; // $ access=A.B.C // spurious result from folder-based heuristic } class BSub2 : B { // $ access=A.B From fa36a114ae33aa01114a40f34094912ea2c2c7d1 Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 25 Aug 2026 09:43:33 +0200 Subject: [PATCH 0508/2098] unified: Sharpen set of candidates when measuring static name binding --- .../unified/internal/AnalysisQuality.qll | 39 +++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll index a10257ed8326..f2a7acabf41f 100644 --- a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll +++ b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll @@ -6,12 +6,45 @@ private import codeql.unified.internal.NameBindingPlugin /** Stats about identifiers that static name binding could resolve. */ module StaticNameResolutionStats implements EntityStatsSig { + /** + * Holds if `name` has been positively identified as something that refer to a value, and static name binding + * is thus not expected to resolve its members. + */ + private predicate resolvesToValue(Identifier name) { + exists(AstNode decl | + decl = getStaticBindingTarget(name).getDeclaration() and + not decl instanceof ClassLikeDeclaration and + not decl instanceof TypeAliasDeclaration and + not decl instanceof TypeParameter and + not decl instanceof AssociatedTypeDeclaration + ) + } + + /** + * Holds if name-binding for `expr` depends on type inference, and is thus not subject to static name binding. + * + * Usually this holds for qualified instance member accesses (`foo().x`) and leading-dot expressions (`.x`). + */ + private predicate memberAccessDependsOnTypeInference(MemberAccessExpr expr) { + exists(Expr base | base = expr.getBase() | + // Base expression resolves to a value, e.g. a field, variable, or function (for languages where functions are values). + resolvesToValue(getIdentifierFromRef(base)) + or + // Base expression is of a kind that is not subject to static name resolution, e.g. `foo().x` + not exists(getIdentifierFromRef(base)) + or + // Base expression is a confirmed to depend on type inference + memberAccessDependsOnTypeInference(base) + ) + } + class Candidate extends Identifier { Candidate() { - this = getIdentifierFromRef(_) and + exists(AstNode ref | + this = getIdentifierFromRef(ref) and + not memberAccessDependsOnTypeInference(ref) + ) and not this instanceof NameDeclaration - // TODO: exclude names we know are not static references, e.g. unqualified instance-field access, - // currently blocked on getting static name binding to report this information. } NameBindingNode getTarget() { From 4641bdc13e7bee6390bb73c5ac6e0b1a49f9884d Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Tue, 25 Aug 2026 13:06:42 +0200 Subject: [PATCH 0509/2098] Ruby: Deprecate getAControlFlowNode. --- ruby/ql/lib/codeql/ruby/ast/Call.qll | 2 +- ruby/ql/lib/codeql/ruby/ast/Statement.qll | 8 ++++++-- .../lib/codeql/ruby/ast/internal/Constant.qll | 20 +++++++++---------- .../lib/codeql/ruby/dataflow/FlowSummary.qll | 4 ++-- ruby/ql/src/queries/analysis/Definitions.ql | 2 +- .../src/queries/variables/DeadStoreOfLocal.ql | 2 +- .../queries/variables/UninitializedLocal.ql | 2 +- 7 files changed, 22 insertions(+), 18 deletions(-) diff --git a/ruby/ql/lib/codeql/ruby/ast/Call.qll b/ruby/ql/lib/codeql/ruby/ast/Call.qll index 10b23b22d55c..1a3b9c757c61 100644 --- a/ruby/ql/lib/codeql/ruby/ast/Call.qll +++ b/ruby/ql/lib/codeql/ruby/ast/Call.qll @@ -63,7 +63,7 @@ class Call extends Expr instanceof CallImpl { TCfgScope(result) = viableCallableLambda(c, _) ) or - result = getTarget(TNormalCall(this.getAControlFlowNode())) + result = getTarget(TNormalCall(this.getControlFlowNode())) } override AstNode getAChild(string pred) { diff --git a/ruby/ql/lib/codeql/ruby/ast/Statement.qll b/ruby/ql/lib/codeql/ruby/ast/Statement.qll index 0081fd5d593e..4174f45d1282 100644 --- a/ruby/ql/lib/codeql/ruby/ast/Statement.qll +++ b/ruby/ql/lib/codeql/ruby/ast/Statement.qll @@ -16,8 +16,12 @@ class Stmt extends AstNode, TStmt { /** Gets the control-flow node for this statement, if any. */ ControlFlowNode getControlFlowNode() { result.injects(this) } - /** Gets a control-flow node for this statement, if any. */ - CfgNodes::AstCfgNode getAControlFlowNode() { result.getAstNode() = this } + /** + * DEPRECATED: Use `getControlFlowNode()` instead. + * + * Gets a control-flow node for this statement, if any. + */ + deprecated CfgNodes::AstCfgNode getAControlFlowNode() { result.getAstNode() = this } /** Gets the control-flow scope of this statement, if any. */ CfgScope getCfgScope() { result = getEnclosingCallable(this) } diff --git a/ruby/ql/lib/codeql/ruby/ast/internal/Constant.qll b/ruby/ql/lib/codeql/ruby/ast/internal/Constant.qll index 6fdcdc894182..7c935391ace2 100644 --- a/ruby/ql/lib/codeql/ruby/ast/internal/Constant.qll +++ b/ruby/ql/lib/codeql/ruby/ast/internal/Constant.qll @@ -95,7 +95,7 @@ private module Propagation { or isIntExpr(e.(ConstantReadAccess).getValue(), i) or - forex(ExprCfgNode n | n = e.getAControlFlowNode() | isInt(n, i)) + isInt(e.getControlFlowNode(), i) } predicate isFloat(ExprCfgNode e, float f) { @@ -153,7 +153,7 @@ private module Propagation { or isFloatExpr(e.(ConstantReadAccess).getValue(), f) or - forex(ExprCfgNode n | n = e.getAControlFlowNode() | isFloat(n, f)) + isFloat(e.getControlFlowNode(), f) } predicate isRational(ExprCfgNode e, int numerator, int denominator) { @@ -175,7 +175,7 @@ private module Propagation { or isRationalExpr(e.(ConstantReadAccess).getValue(), numerator, denominator) or - forex(ExprCfgNode n | n = e.getAControlFlowNode() | isRational(n, numerator, denominator)) + isRational(e.getControlFlowNode(), numerator, denominator) } predicate isComplex(ExprCfgNode e, float real, float imaginary) { @@ -197,7 +197,7 @@ private module Propagation { or isComplexExpr(e.(ConstantReadAccess).getValue(), real, imaginary) or - forex(ExprCfgNode n | n = e.getAControlFlowNode() | isComplex(n, real, imaginary)) + isComplex(e.getControlFlowNode(), real, imaginary) } overlay[local] @@ -309,7 +309,7 @@ private module Propagation { or isStringExpr(e.(ConstantReadAccess).getValue(), s) or - forex(ExprCfgNode n | n = e.getAControlFlowNode() | isString(n, s)) + isString(e.getControlFlowNode(), s) } predicate isSymbol(ExprCfgNode e, string s) { @@ -334,7 +334,7 @@ private module Propagation { or isSymbolExpr(e.(ConstantReadAccess).getValue(), s) or - forex(ExprCfgNode n | n = e.getAControlFlowNode() | isSymbol(n, s)) + isSymbol(e.getControlFlowNode(), s) } predicate isRegExp(ExprCfgNode e, string s, string flags) { @@ -359,7 +359,7 @@ private module Propagation { or isRegExpExpr(e.(ConstantReadAccess).getValue(), s, flags) or - forex(ExprCfgNode n | n = e.getAControlFlowNode() | isRegExp(n, s, flags)) + isRegExp(e.getControlFlowNode(), s, flags) } predicate isBoolean(ExprCfgNode e, boolean b) { @@ -381,7 +381,7 @@ private module Propagation { or isBooleanExpr(e.(ConstantReadAccess).getValue(), b) or - forex(ExprCfgNode n | n = e.getAControlFlowNode() | isBoolean(n, b)) + isBoolean(e.getControlFlowNode(), b) } predicate isNil(ExprCfgNode e) { @@ -403,7 +403,7 @@ private module Propagation { or isNilExpr(e.(ConstantReadAccess).getValue()) or - forex(ExprCfgNode n | n = e.getAControlFlowNode() | isNil(n)) + isNil(e.getControlFlowNode()) } } @@ -566,7 +566,7 @@ private predicate isArrayExpr(Expr e, ArrayLiteralCfgNode arr) { // control flow paths. // Note(hmac): I don't think this is necessary, as `getSource` will not return // results if the source is a phi node. - forex(ExprCfgNode n | n = e.getAControlFlowNode() | isArrayConstant(n, arr)) + isArrayConstant(e.getControlFlowNode(), arr) or // if `e` is an array, then `e.freeze` is also an array e.(MethodCall).getMethodName() = "freeze" and diff --git a/ruby/ql/lib/codeql/ruby/dataflow/FlowSummary.qll b/ruby/ql/lib/codeql/ruby/dataflow/FlowSummary.qll index 3ec9a9d87dc5..2a24b9edad0b 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/FlowSummary.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/FlowSummary.qll @@ -106,10 +106,10 @@ private module LibraryCallbackSummaries { LibraryLambdaMethod() { this = "" } final override MethodCall getACall() { - libraryCall(result.getAControlFlowNode()) and + libraryCall(result.getControlFlowNode()) and result.hasBlock() or - libraryCallHasLambdaArg(result.getAControlFlowNode(), _) + libraryCallHasLambdaArg(result.getControlFlowNode(), _) } override predicate propagatesFlow( diff --git a/ruby/ql/src/queries/analysis/Definitions.ql b/ruby/ql/src/queries/analysis/Definitions.ql index a1a0d6b258b3..6adabe79fc58 100644 --- a/ruby/ql/src/queries/analysis/Definitions.ql +++ b/ruby/ql/src/queries/analysis/Definitions.ql @@ -43,7 +43,7 @@ newtype DefLoc = meth = call.getATarget() or // include implicit `initialize` calls - meth = getInitializeTarget(call.getAControlFlowNode()) + meth = getInitializeTarget(call.getControlFlowNode()) } or /** A local variable. */ LocalVariableLoc(VariableReadAccess read, VariableWriteAccess write) { diff --git a/ruby/ql/src/queries/variables/DeadStoreOfLocal.ql b/ruby/ql/src/queries/variables/DeadStoreOfLocal.ql index 70d3191b8a72..428e83ca9061 100644 --- a/ruby/ql/src/queries/variables/DeadStoreOfLocal.ql +++ b/ruby/ql/src/queries/variables/DeadStoreOfLocal.ql @@ -44,6 +44,6 @@ class RelevantLocalVariableWriteAccess extends LocalVariableWriteAccess { from RelevantLocalVariableWriteAccess write, LocalVariable v where v = write.getVariable() and - exists(write.getAControlFlowNode()) and + exists(write.getControlFlowNode()) and not exists(Ssa::WriteDefinition def | def.getWriteAccess().getAstNode() = write) select write, "This assignment to $@ is useless, since its value is never read.", v, v.getName() diff --git a/ruby/ql/src/queries/variables/UninitializedLocal.ql b/ruby/ql/src/queries/variables/UninitializedLocal.ql index 2f5a4b875aa1..bb602d4a9686 100644 --- a/ruby/ql/src/queries/variables/UninitializedLocal.ql +++ b/ruby/ql/src/queries/variables/UninitializedLocal.ql @@ -49,7 +49,7 @@ private predicate isInBooleanContext(AstNode n) { private predicate isGuarded(LocalVariableReadAccess read) { exists(AstCfgNode guard, boolean branch | - Guards::guardControlsBlock(guard, read.getAControlFlowNode().getBasicBlock(), branch) + Guards::guardControlsBlock(guard, read.getControlFlowNode().getBasicBlock(), branch) | // guard is `var` guard.getAstNode() = read.getVariable().getAnAccess() and From ac0438f48a37c45ac3ffd5ecf1b425a12b3be9ce Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Tue, 25 Aug 2026 13:19:46 +0200 Subject: [PATCH 0510/2098] Ruby: Address review comments. --- .../ruby/controlflow/ControlFlowGraph.qll | 25 +++++++------------ .../codeql/controlflow/ControlFlowGraph.qll | 8 ++++++ 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll b/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll index 06ca1ef1e7e7..4ad4c3d6a41b 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll @@ -150,7 +150,7 @@ private module Ast implements AstSig { or findpattern.getElement(index) = result or - index = 1 + max(int i | exists(findpattern.getElement(i))) and + index = count(findpattern.getElement(_)) and findpattern.getSuffixVariableAccess() = result ) or @@ -198,9 +198,13 @@ private module Ast implements AstSig { Callable() { this instanceof R::Ast::Toplevel or this instanceof R::Ast::Callable } } + additional AstNode toplevelBody(R::Ast::Toplevel t, int index) { + result = t.getBeginBlock(index) or + result = desugar(t.getStmt(index - count(t.getABeginBlock()))) + } + AstNode callableGetBody(Callable c) { - result = c.(R::Ast::Toplevel).getABeginBlock() or - result = c.(R::Ast::Toplevel).getAStmt() or + result = toplevelBody(c, _) or result = c.(R::Ast::Callable).getBody() } @@ -482,13 +486,8 @@ private module Input implements InputSig1, InputSig2 { class CallableContext = Unit; Ast::AstNode callableGetBodyPart(Ast::Callable c, CallableContext ctx, int index) { - exists(R::Ast::Toplevel t | - c = t and - exists(ctx) - | - result = t.getBeginBlock(index) or - result = desugar(t.getStmt(index - count(t.getABeginBlock()))) - ) + result = Ast::toplevelBody(c, index) and + exists(ctx) } predicate catchAll(Ast::CatchClause catch) { @@ -546,12 +545,6 @@ private module Input implements InputSig1, InputSig2 { } predicate step(PreControlFlowNode n1, PreControlFlowNode n2) { - exists(Ast::ConditionalExpr ce | - n1.isAfterTrue(ce.getCondition()) and not exists(ce.getThen()) and n2.isAfter(ce) - or - n1.isAfterFalse(ce.getCondition()) and not exists(ce.getElse()) and n2.isAfter(ce) - ) - or exists(R::Ast::RescueModifierExpr rescueModifier | n1.isBefore(rescueModifier) and n2.isBefore(desugar(rescueModifier.getBody())) diff --git a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll index 042aa29fc421..d230990ce45d 100644 --- a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll +++ b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll @@ -1549,8 +1549,16 @@ module Make0 Ast> { n1.isAfterTrue(condexpr.getCondition()) and n2.isBefore(condexpr.getThen()) or + n1.isAfterTrue(condexpr.getCondition()) and + not exists(condexpr.getThen()) and + n2.isAfter(condexpr) + or n1.isAfterFalse(condexpr.getCondition()) and n2.isBefore(condexpr.getElse()) + or + n1.isAfterFalse(condexpr.getCondition()) and + not exists(condexpr.getElse()) and + n2.isAfter(condexpr) ) or exists(PatternMatchExpr pme | From 3fe4382b1f7606556850a0003f0e064665f73b1e Mon Sep 17 00:00:00 2001 From: yoff Date: Tue, 25 Aug 2026 14:29:30 +0200 Subject: [PATCH 0511/2098] Shared CFG: check abrupt completion origins Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../InvalidAbruptCompletionOrigin.expected | 17 +++++++++++++++++ .../graph/InvalidAbruptCompletionOrigin.ql | 6 ++++++ .../InvalidAbruptCompletionOrigin.expected | 17 +++++++++++++++++ .../basic/InvalidAbruptCompletionOrigin.ql | 6 ++++++ .../InvalidAbruptCompletionOrigin.expected | 17 +++++++++++++++++ .../successors/InvalidAbruptCompletionOrigin.ql | 6 ++++++ .../codeql/controlflow/ControlFlowGraph.qll | 16 ++++++++++++++++ 7 files changed, 85 insertions(+) create mode 100644 csharp/ql/test/library-tests/controlflow/graph/InvalidAbruptCompletionOrigin.expected create mode 100644 csharp/ql/test/library-tests/controlflow/graph/InvalidAbruptCompletionOrigin.ql create mode 100644 java/ql/test/library-tests/controlflow/basic/InvalidAbruptCompletionOrigin.expected create mode 100644 java/ql/test/library-tests/controlflow/basic/InvalidAbruptCompletionOrigin.ql create mode 100644 python/ql/test/library-tests/ControlFlow/successors/InvalidAbruptCompletionOrigin.expected create mode 100644 python/ql/test/library-tests/ControlFlow/successors/InvalidAbruptCompletionOrigin.ql diff --git a/csharp/ql/test/library-tests/controlflow/graph/InvalidAbruptCompletionOrigin.expected b/csharp/ql/test/library-tests/controlflow/graph/InvalidAbruptCompletionOrigin.expected new file mode 100644 index 000000000000..5834c35bd638 --- /dev/null +++ b/csharp/ql/test/library-tests/controlflow/graph/InvalidAbruptCompletionOrigin.expected @@ -0,0 +1,17 @@ +consistencyOverview +siblingsWithSameIndexInDefaultCfg +deadEnd +nonUniqueEnclosingCallable +nonUniqueInConditionalContext +nonLocalStep +ambiguousAdditionalNode +invalidAbruptCompletionOrigin +missingInNodeForPostOrInOrder +multipleSuccessors +multipleConditionalSuccessorKinds +directAndConditionalSuccessors +selfLoop +bodyPartNonOverlap +parameterNonOverlap +parameterEnclosingCallable +#select diff --git a/csharp/ql/test/library-tests/controlflow/graph/InvalidAbruptCompletionOrigin.ql b/csharp/ql/test/library-tests/controlflow/graph/InvalidAbruptCompletionOrigin.ql new file mode 100644 index 000000000000..91c6a93e025a --- /dev/null +++ b/csharp/ql/test/library-tests/controlflow/graph/InvalidAbruptCompletionOrigin.ql @@ -0,0 +1,6 @@ +import csharp +import ControlFlow::Consistency + +from int results +where consistencyOverview("invalidAbruptCompletionOrigin", results) +select results diff --git a/java/ql/test/library-tests/controlflow/basic/InvalidAbruptCompletionOrigin.expected b/java/ql/test/library-tests/controlflow/basic/InvalidAbruptCompletionOrigin.expected new file mode 100644 index 000000000000..5834c35bd638 --- /dev/null +++ b/java/ql/test/library-tests/controlflow/basic/InvalidAbruptCompletionOrigin.expected @@ -0,0 +1,17 @@ +consistencyOverview +siblingsWithSameIndexInDefaultCfg +deadEnd +nonUniqueEnclosingCallable +nonUniqueInConditionalContext +nonLocalStep +ambiguousAdditionalNode +invalidAbruptCompletionOrigin +missingInNodeForPostOrInOrder +multipleSuccessors +multipleConditionalSuccessorKinds +directAndConditionalSuccessors +selfLoop +bodyPartNonOverlap +parameterNonOverlap +parameterEnclosingCallable +#select diff --git a/java/ql/test/library-tests/controlflow/basic/InvalidAbruptCompletionOrigin.ql b/java/ql/test/library-tests/controlflow/basic/InvalidAbruptCompletionOrigin.ql new file mode 100644 index 000000000000..0e4aa51f72f0 --- /dev/null +++ b/java/ql/test/library-tests/controlflow/basic/InvalidAbruptCompletionOrigin.ql @@ -0,0 +1,6 @@ +import java +import ControlFlow::Consistency + +from int results +where consistencyOverview("invalidAbruptCompletionOrigin", results) +select results diff --git a/python/ql/test/library-tests/ControlFlow/successors/InvalidAbruptCompletionOrigin.expected b/python/ql/test/library-tests/ControlFlow/successors/InvalidAbruptCompletionOrigin.expected new file mode 100644 index 000000000000..5834c35bd638 --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/successors/InvalidAbruptCompletionOrigin.expected @@ -0,0 +1,17 @@ +consistencyOverview +siblingsWithSameIndexInDefaultCfg +deadEnd +nonUniqueEnclosingCallable +nonUniqueInConditionalContext +nonLocalStep +ambiguousAdditionalNode +invalidAbruptCompletionOrigin +missingInNodeForPostOrInOrder +multipleSuccessors +multipleConditionalSuccessorKinds +directAndConditionalSuccessors +selfLoop +bodyPartNonOverlap +parameterNonOverlap +parameterEnclosingCallable +#select diff --git a/python/ql/test/library-tests/ControlFlow/successors/InvalidAbruptCompletionOrigin.ql b/python/ql/test/library-tests/ControlFlow/successors/InvalidAbruptCompletionOrigin.ql new file mode 100644 index 000000000000..2d3cf71dffe9 --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/successors/InvalidAbruptCompletionOrigin.ql @@ -0,0 +1,6 @@ +import semmle.python.controlflow.internal.AstNodeImpl +import ControlFlow::Consistency + +from int results +where consistencyOverview("invalidAbruptCompletionOrigin", results) +select results diff --git a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll index 042aa29fc421..ccf093cfa76d 100644 --- a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll +++ b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll @@ -2257,6 +2257,12 @@ module Make0 Ast> { query = "missingInNodeForPostOrInOrder" and results = strictcount(AstNode ast | missingInNodeForPostOrInOrder(ast)) or + query = "invalidAbruptCompletionOrigin" and + results = + strictcount(AstNode ast, PreControlFlowNode node | + invalidAbruptCompletionOrigin(ast, node) + ) + or query = "multipleSuccessors" and results = strictcount(ControlFlowNode node, SuccessorType t, ControlFlowNode successor | @@ -2341,6 +2347,16 @@ module Make0 Ast> { 1 < strictcount(NormalSuccessor t | additionalNode(n, tag, t)) } + /** + * Holds if the language-specific CFG input supplies an abrupt completion for `ast` whose + * origin `node` does not belong to `ast`. + */ + query predicate invalidAbruptCompletionOrigin(AstNode ast, PreControlFlowNode node) { + Input2::beginAbruptCompletion(ast, node, _, _) and + not node.isIn(ast) and + not node.isAdditional(ast, _) + } + /** * Holds if the "in" node is unreachable for a post-or-in-order AST node. * From fc90700870ebbbcfe3598457d0e7ce7e24de9d1d Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 17 Aug 2026 15:43:35 +0200 Subject: [PATCH 0512/2098] C#: Add tool status page information and compilation info for unreachable explicit feeds. --- .../NugetPackageRestorer.cs | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs index 38924e2f876e..109d050f8786 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs @@ -127,8 +127,8 @@ public HashSet Restore() compilationInfoContainer.CompilationInfos.Add(("Inherited NuGet feed count", inheritedFeeds.Count.ToString())); } - var allExplicitReachable = explicitFeeds.Count == feedManager.ReachableExplicitFeeds.Count; - EmitUnreachableFeedsDiagnostics(allExplicitReachable); + var unreachableExplicitFeeds = explicitFeeds.Except(feedManager.ReachableExplicitFeeds).ToImmutableHashSet(); + EmitFeedReachabilityDiagnostics(unreachableExplicitFeeds); } try @@ -536,25 +536,31 @@ private void TryChangeProjectFile(DirectoryInfo projectDir, Regex pattern, strin } /// - /// If is `false`, logs this and emits a diagnostic. + /// If is not empty, logs this and emits a diagnostic. /// Adds a `CompilationInfos` entry either way. /// - /// Whether all feeds were reachable or not. - private void EmitUnreachableFeedsDiagnostics(bool allFeedsReachable) + /// The feeds that were not reachable. + private void EmitFeedReachabilityDiagnostics(ImmutableHashSet unreachableFeeds) { - if (!allFeedsReachable) + if (unreachableFeeds.Count > 0) { - logger.LogWarning("Found unreachable NuGet feed in C# analysis with build-mode 'none'. This may cause missing dependencies in the analysis."); + var orderedUnreachableFeeds = unreachableFeeds.OrderBy(feed => feed).ToList(); + var unreachableFeedList = string.Join(", ", orderedUnreachableFeeds); + logger.LogWarning($"Found unreachable NuGet feeds in C# analysis with build-mode 'none': {unreachableFeedList}. This may cause missing dependencies in the analysis."); + compilationInfoContainer.CompilationInfos.Add(("Unreachable NuGet feeds", unreachableFeedList)); diagnosticsWriter.AddEntry(new DiagnosticMessage( Language.CSharp, "buildless/unreachable-feed", - "Found unreachable NuGet feed in C# analysis with build-mode 'none'", + "Found unreachable NuGet feeds in C# analysis with build-mode 'none'", visibility: new DiagnosticMessage.TspVisibility(statusPage: true, cliSummaryTable: true, telemetry: true), - markdownMessage: "Found unreachable NuGet feed in C# analysis with build-mode 'none'. This may cause missing dependencies in the analysis.", + markdownMessage: string.Format( + "Found unreachable NuGet feeds in C# analysis with build-mode 'none':\n\n{0}\n\nThis may cause missing dependencies in the analysis.", + string.Join("\n", orderedUnreachableFeeds.Select(feed => $"- `{feed}`")) + ), severity: DiagnosticMessage.TspSeverity.Note )); } - compilationInfoContainer.CompilationInfos.Add(("All NuGet feeds reachable", allFeedsReachable ? "1" : "0")); + compilationInfoContainer.CompilationInfos.Add(("All NuGet feeds reachable", unreachableFeeds.Count == 0 ? "1" : "0")); } private void EmitNugetConfigDiagnostics() From cd64d686401a99682e3acddade0ea817aca8d2f2 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 17 Aug 2026 16:16:56 +0200 Subject: [PATCH 0513/2098] C#: Update integration test expected output. --- .../standalone_resx/CompilationInfo.expected | 42 ++++++++-------- .../standalone_resx/CompilationInfo.ql | 11 +---- .../standalone_slnx/CompilationInfo.expected | 42 ++++++++-------- .../standalone_slnx/CompilationInfo.ql | 11 +---- .../CompilationInfo.expected | 42 ++++++++-------- .../standalone_winforms/CompilationInfo.ql | 11 +---- .../CompilationInfo.expected | 44 ++++++++--------- .../CompilationInfo.ql | 11 +---- .../CompilationInfo.expected | 49 ++++++++++--------- .../CompilationInfo.ql | 11 +---- .../CompilationInfo.expected | 49 ++++++++++--------- .../CompilationInfo.ql | 11 +---- .../diagnostics.expected | 4 +- .../CompilationInfo.expected | 49 ++++++++++--------- .../CompilationInfo.ql | 11 +---- .../diagnostics.expected | 4 +- 16 files changed, 178 insertions(+), 224 deletions(-) diff --git a/csharp/ql/integration-tests/all-platforms/standalone_resx/CompilationInfo.expected b/csharp/ql/integration-tests/all-platforms/standalone_resx/CompilationInfo.expected index 6d91b2700226..d0b09f83622c 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_resx/CompilationInfo.expected +++ b/csharp/ql/integration-tests/all-platforms/standalone_resx/CompilationInfo.expected @@ -1,21 +1,21 @@ -| All NuGet feeds reachable | 1.0 | -| Failed project restore with missing package error | 0.0 | -| Failed project restore with package source error | 0.0 | -| Failed solution restore with missing package error | 0.0 | -| Failed solution restore with package source error | 0.0 | -| Inherited NuGet feed count | 1.0 | -| NuGet feed responsiveness checked | 1.0 | -| Project files on filesystem | 1.0 | -| Reachable fallback NuGet feed count | 1.0 | -| Resource extraction enabled | 1.0 | -| Restored .NET framework variants | 1.0 | -| Restored projects through solution files | 0.0 | -| Solution files on filesystem | 0.0 | -| Source files generated | 2.0 | -| Source files on filesystem | 1.0 | -| Successfully restored project files | 1.0 | -| Successfully restored solution files | 0.0 | -| Unresolved references | 0.0 | -| UseWPF set | 0.0 | -| UseWindowsForms set | 0.0 | -| WebView extraction enabled | 1.0 | +| All NuGet feeds reachable | 1 | +| Failed project restore with missing package error | 0 | +| Failed project restore with package source error | 0 | +| Failed solution restore with missing package error | 0 | +| Failed solution restore with package source error | 0 | +| Inherited NuGet feed count | 1 | +| NuGet feed responsiveness checked | 1 | +| Project files on filesystem | 1 | +| Reachable fallback NuGet feed count | 1 | +| Resource extraction enabled | 1 | +| Restored .NET framework variants | 1 | +| Restored projects through solution files | 0 | +| Solution files on filesystem | 0 | +| Source files generated | 2 | +| Source files on filesystem | 1 | +| Successfully restored project files | 1 | +| Successfully restored solution files | 0 | +| Unresolved references | 0 | +| UseWPF set | 0 | +| UseWindowsForms set | 0 | +| WebView extraction enabled | 1 | diff --git a/csharp/ql/integration-tests/all-platforms/standalone_resx/CompilationInfo.ql b/csharp/ql/integration-tests/all-platforms/standalone_resx/CompilationInfo.ql index a96c2fd99a69..28898f02fd24 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_resx/CompilationInfo.ql +++ b/csharp/ql/integration-tests/all-platforms/standalone_resx/CompilationInfo.ql @@ -1,16 +1,9 @@ import csharp import semmle.code.csharp.commons.Diagnostics -query predicate compilationInfo(string key, float value) { +query predicate compilationInfo(string key, string value) { key != "Resolved references" and key != "Resolved assembly conflicts" and not key.matches("Compiler diagnostic count for%") and - exists(Compilation c, string infoKey, string infoValue | infoValue = c.getInfo(infoKey) | - key = infoKey and - value = infoValue.toFloat() - or - not exists(infoValue.toFloat()) and - key = infoKey + ": " + infoValue and - value = 1 - ) + value = any(Compilation c).getInfo(key) } diff --git a/csharp/ql/integration-tests/all-platforms/standalone_slnx/CompilationInfo.expected b/csharp/ql/integration-tests/all-platforms/standalone_slnx/CompilationInfo.expected index 82cf0509d345..94716c3255ae 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_slnx/CompilationInfo.expected +++ b/csharp/ql/integration-tests/all-platforms/standalone_slnx/CompilationInfo.expected @@ -1,21 +1,21 @@ -| All NuGet feeds reachable | 1.0 | -| Failed project restore with missing package error | 0.0 | -| Failed project restore with package source error | 0.0 | -| Failed solution restore with missing package error | 0.0 | -| Failed solution restore with package source error | 0.0 | -| Inherited NuGet feed count | 1.0 | -| NuGet feed responsiveness checked | 1.0 | -| Project files on filesystem | 2.0 | -| Reachable fallback NuGet feed count | 1.0 | -| Resource extraction enabled | 0.0 | -| Restored .NET framework variants | 1.0 | -| Restored projects through solution files | 2.0 | -| Solution files on filesystem | 1.0 | -| Source files generated | 1.0 | -| Source files on filesystem | 2.0 | -| Successfully restored project files | 0.0 | -| Successfully restored solution files | 1.0 | -| Unresolved references | 0.0 | -| UseWPF set | 0.0 | -| UseWindowsForms set | 0.0 | -| WebView extraction enabled | 1.0 | +| All NuGet feeds reachable | 1 | +| Failed project restore with missing package error | 0 | +| Failed project restore with package source error | 0 | +| Failed solution restore with missing package error | 0 | +| Failed solution restore with package source error | 0 | +| Inherited NuGet feed count | 1 | +| NuGet feed responsiveness checked | 1 | +| Project files on filesystem | 2 | +| Reachable fallback NuGet feed count | 1 | +| Resource extraction enabled | 0 | +| Restored .NET framework variants | 1 | +| Restored projects through solution files | 2 | +| Solution files on filesystem | 1 | +| Source files generated | 1 | +| Source files on filesystem | 2 | +| Successfully restored project files | 0 | +| Successfully restored solution files | 1 | +| Unresolved references | 0 | +| UseWPF set | 0 | +| UseWindowsForms set | 0 | +| WebView extraction enabled | 1 | diff --git a/csharp/ql/integration-tests/all-platforms/standalone_slnx/CompilationInfo.ql b/csharp/ql/integration-tests/all-platforms/standalone_slnx/CompilationInfo.ql index 078e352be4d9..e6dc52674f37 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_slnx/CompilationInfo.ql +++ b/csharp/ql/integration-tests/all-platforms/standalone_slnx/CompilationInfo.ql @@ -1,16 +1,9 @@ import csharp import semmle.code.csharp.commons.Diagnostics -query predicate compilationInfo(string key, float value) { +query predicate compilationInfo(string key, string value) { key != "Resolved references" and key != "Resolved assembly conflicts" and not key.matches(["Compiler diagnostic count for%", "Extractor message count for group%"]) and - exists(Compilation c, string infoKey, string infoValue | infoValue = c.getInfo(infoKey) | - key = infoKey and - value = infoValue.toFloat() - or - not exists(infoValue.toFloat()) and - key = infoKey + ": " + infoValue and - value = 1 - ) + value = any(Compilation c).getInfo(key) } diff --git a/csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.expected b/csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.expected index 63ddd4903f3e..ee79179d4fae 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.expected +++ b/csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.expected @@ -1,21 +1,21 @@ -| All NuGet feeds reachable | 1.0 | -| Failed project restore with missing package error | 0.0 | -| Failed project restore with package source error | 0.0 | -| Failed solution restore with missing package error | 0.0 | -| Failed solution restore with package source error | 0.0 | -| Inherited NuGet feed count | 1.0 | -| NuGet feed responsiveness checked | 1.0 | -| Project files on filesystem | 1.0 | -| Reachable fallback NuGet feed count | 1.0 | -| Resource extraction enabled | 0.0 | -| Restored .NET framework variants | 1.0 | -| Restored projects through solution files | 0.0 | -| Solution files on filesystem | 0.0 | -| Source files generated | 1.0 | -| Source files on filesystem | 3.0 | -| Successfully restored project files | 1.0 | -| Successfully restored solution files | 0.0 | -| Unresolved references | 0.0 | -| UseWPF set | 0.0 | -| UseWindowsForms set | 1.0 | -| WebView extraction enabled | 1.0 | +| All NuGet feeds reachable | 1 | +| Failed project restore with missing package error | 0 | +| Failed project restore with package source error | 0 | +| Failed solution restore with missing package error | 0 | +| Failed solution restore with package source error | 0 | +| Inherited NuGet feed count | 1 | +| NuGet feed responsiveness checked | 1 | +| Project files on filesystem | 1 | +| Reachable fallback NuGet feed count | 1 | +| Resource extraction enabled | 0 | +| Restored .NET framework variants | 1 | +| Restored projects through solution files | 0 | +| Solution files on filesystem | 0 | +| Source files generated | 1 | +| Source files on filesystem | 3 | +| Successfully restored project files | 1 | +| Successfully restored solution files | 0 | +| Unresolved references | 0 | +| UseWPF set | 0 | +| UseWindowsForms set | 1 | +| WebView extraction enabled | 1 | diff --git a/csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.ql b/csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.ql index 078e352be4d9..e6dc52674f37 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.ql +++ b/csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.ql @@ -1,16 +1,9 @@ import csharp import semmle.code.csharp.commons.Diagnostics -query predicate compilationInfo(string key, float value) { +query predicate compilationInfo(string key, string value) { key != "Resolved references" and key != "Resolved assembly conflicts" and not key.matches(["Compiler diagnostic count for%", "Extractor message count for group%"]) and - exists(Compilation c, string infoKey, string infoValue | infoValue = c.getInfo(infoKey) | - key = infoKey and - value = infoValue.toFloat() - or - not exists(infoValue.toFloat()) and - key = infoKey + ": " + infoValue and - value = 1 - ) + value = any(Compilation c).getInfo(key) } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_clear/CompilationInfo.expected b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_clear/CompilationInfo.expected index ff0b29da33fa..e8a0b5897082 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_clear/CompilationInfo.expected +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_clear/CompilationInfo.expected @@ -1,22 +1,22 @@ -| All NuGet feeds reachable | 1.0 | -| Failed project restore with missing package error | 0.0 | -| Failed project restore with package source error | 0.0 | -| Failed solution restore with missing package error | 0.0 | -| Failed solution restore with package source error | 0.0 | -| Inherited NuGet feed count | 1.0 | -| NuGet feed responsiveness checked | 1.0 | -| Project files on filesystem | 1.0 | -| Reachable fallback NuGet feed count | 1.0 | -| Resolved assembly conflicts | 0.0 | -| Resource extraction enabled | 0.0 | -| Restored .NET framework variants | 1.0 | -| Restored projects through solution files | 0.0 | -| Solution files on filesystem | 0.0 | -| Source files generated | 0.0 | -| Source files on filesystem | 1.0 | -| Successfully restored project files | 1.0 | -| Successfully restored solution files | 0.0 | -| Unresolved references | 0.0 | -| UseWPF set | 0.0 | -| UseWindowsForms set | 0.0 | -| WebView extraction enabled | 1.0 | +| All NuGet feeds reachable | 1 | +| Failed project restore with missing package error | 0 | +| Failed project restore with package source error | 0 | +| Failed solution restore with missing package error | 0 | +| Failed solution restore with package source error | 0 | +| Inherited NuGet feed count | 1 | +| NuGet feed responsiveness checked | 1 | +| Project files on filesystem | 1 | +| Reachable fallback NuGet feed count | 1 | +| Resolved assembly conflicts | 0 | +| Resource extraction enabled | 0 | +| Restored .NET framework variants | 1 | +| Restored projects through solution files | 0 | +| Solution files on filesystem | 0 | +| Source files generated | 0 | +| Source files on filesystem | 1 | +| Successfully restored project files | 1 | +| Successfully restored solution files | 0 | +| Unresolved references | 0 | +| UseWPF set | 0 | +| UseWindowsForms set | 0 | +| WebView extraction enabled | 1 | diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_clear/CompilationInfo.ql b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_clear/CompilationInfo.ql index 073ffe3b224d..ae7505a8b0be 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_clear/CompilationInfo.ql +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_clear/CompilationInfo.ql @@ -1,15 +1,8 @@ import csharp import semmle.code.csharp.commons.Diagnostics -query predicate compilationInfo(string key, float value) { +query predicate compilationInfo(string key, string value) { key != "Resolved references" and not key.matches("Compiler diagnostic count for%") and - exists(Compilation c, string infoKey, string infoValue | infoValue = c.getInfo(infoKey) | - key = infoKey and - value = infoValue.toFloat() - or - not exists(infoValue.toFloat()) and - key = infoKey + ": " + infoValue and - value = 1 - ) + value = any(Compilation c).getInfo(key) } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/CompilationInfo.expected b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/CompilationInfo.expected index 4acd4f54e8a6..c5cb911d3731 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/CompilationInfo.expected +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/CompilationInfo.expected @@ -1,24 +1,25 @@ -| All NuGet feeds reachable | 0.0 | -| Failed project restore with missing package error | 1.0 | -| Failed project restore with package source error | 0.0 | -| Failed solution restore with missing package error | 0.0 | -| Failed solution restore with package source error | 0.0 | -| Fallback nuget restore | 1.0 | -| Inherited NuGet feed count | 1.0 | -| NuGet feed responsiveness checked | 1.0 | -| Project files on filesystem | 1.0 | -| Reachable fallback NuGet feed count | 1.0 | -| Resolved assembly conflicts | 7.0 | -| Resource extraction enabled | 0.0 | -| Restored .NET framework variants | 0.0 | -| Restored projects through solution files | 0.0 | -| Solution files on filesystem | 1.0 | -| Source files generated | 0.0 | -| Source files on filesystem | 1.0 | -| Successfully ran fallback nuget restore | 1.0 | -| Successfully restored project files | 0.0 | -| Successfully restored solution files | 1.0 | -| Unresolved references | 0.0 | -| UseWPF set | 0.0 | -| UseWindowsForms set | 0.0 | -| WebView extraction enabled | 1.0 | +| All NuGet feeds reachable | 0 | +| Failed project restore with missing package error | 1 | +| Failed project restore with package source error | 0 | +| Failed solution restore with missing package error | 0 | +| Failed solution restore with package source error | 0 | +| Fallback nuget restore | 1 | +| Inherited NuGet feed count | 1 | +| NuGet feed responsiveness checked | 1 | +| Project files on filesystem | 1 | +| Reachable fallback NuGet feed count | 1 | +| Resolved assembly conflicts | 7 | +| Resource extraction enabled | 0 | +| Restored .NET framework variants | 0 | +| Restored projects through solution files | 0 | +| Solution files on filesystem | 1 | +| Source files generated | 0 | +| Source files on filesystem | 1 | +| Successfully ran fallback nuget restore | 1 | +| Successfully restored project files | 0 | +| Successfully restored solution files | 1 | +| Unreachable NuGet feeds | https://abc.abc/packages/ | +| Unresolved references | 0 | +| UseWPF set | 0 | +| UseWindowsForms set | 0 | +| WebView extraction enabled | 1 | diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/CompilationInfo.ql b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/CompilationInfo.ql index 073ffe3b224d..ae7505a8b0be 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/CompilationInfo.ql +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/CompilationInfo.ql @@ -1,15 +1,8 @@ import csharp import semmle.code.csharp.commons.Diagnostics -query predicate compilationInfo(string key, float value) { +query predicate compilationInfo(string key, string value) { key != "Resolved references" and not key.matches("Compiler diagnostic count for%") and - exists(Compilation c, string infoKey, string infoValue | infoValue = c.getInfo(infoKey) | - key = infoKey and - value = infoValue.toFloat() - or - not exists(infoValue.toFloat()) and - key = infoKey + ": " + infoValue and - value = 1 - ) + value = any(Compilation c).getInfo(key) } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/CompilationInfo.expected b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/CompilationInfo.expected index 4acd4f54e8a6..680a7960a06c 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/CompilationInfo.expected +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/CompilationInfo.expected @@ -1,24 +1,25 @@ -| All NuGet feeds reachable | 0.0 | -| Failed project restore with missing package error | 1.0 | -| Failed project restore with package source error | 0.0 | -| Failed solution restore with missing package error | 0.0 | -| Failed solution restore with package source error | 0.0 | -| Fallback nuget restore | 1.0 | -| Inherited NuGet feed count | 1.0 | -| NuGet feed responsiveness checked | 1.0 | -| Project files on filesystem | 1.0 | -| Reachable fallback NuGet feed count | 1.0 | -| Resolved assembly conflicts | 7.0 | -| Resource extraction enabled | 0.0 | -| Restored .NET framework variants | 0.0 | -| Restored projects through solution files | 0.0 | -| Solution files on filesystem | 1.0 | -| Source files generated | 0.0 | -| Source files on filesystem | 1.0 | -| Successfully ran fallback nuget restore | 1.0 | -| Successfully restored project files | 0.0 | -| Successfully restored solution files | 1.0 | -| Unresolved references | 0.0 | -| UseWPF set | 0.0 | -| UseWindowsForms set | 0.0 | -| WebView extraction enabled | 1.0 | +| All NuGet feeds reachable | 0 | +| Failed project restore with missing package error | 1 | +| Failed project restore with package source error | 0 | +| Failed solution restore with missing package error | 0 | +| Failed solution restore with package source error | 0 | +| Fallback nuget restore | 1 | +| Inherited NuGet feed count | 1 | +| NuGet feed responsiveness checked | 1 | +| Project files on filesystem | 1 | +| Reachable fallback NuGet feed count | 1 | +| Resolved assembly conflicts | 7 | +| Resource extraction enabled | 0 | +| Restored .NET framework variants | 0 | +| Restored projects through solution files | 0 | +| Solution files on filesystem | 1 | +| Source files generated | 0 | +| Source files on filesystem | 1 | +| Successfully ran fallback nuget restore | 1 | +| Successfully restored project files | 0 | +| Successfully restored solution files | 1 | +| Unreachable NuGet feeds | https://localhost:53/packages/, https://localhost:80/packages/ | +| Unresolved references | 0 | +| UseWPF set | 0 | +| UseWindowsForms set | 0 | +| WebView extraction enabled | 1 | diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/CompilationInfo.ql b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/CompilationInfo.ql index 073ffe3b224d..ae7505a8b0be 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/CompilationInfo.ql +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/CompilationInfo.ql @@ -1,15 +1,8 @@ import csharp import semmle.code.csharp.commons.Diagnostics -query predicate compilationInfo(string key, float value) { +query predicate compilationInfo(string key, string value) { key != "Resolved references" and not key.matches("Compiler diagnostic count for%") and - exists(Compilation c, string infoKey, string infoValue | infoValue = c.getInfo(infoKey) | - key = infoKey and - value = infoValue.toFloat() - or - not exists(infoValue.toFloat()) and - key = infoKey + ": " + infoValue and - value = 1 - ) + value = any(Compilation c).getInfo(key) } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/diagnostics.expected b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/diagnostics.expected index bbd2081f4554..074e4bd48ae9 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/diagnostics.expected +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/diagnostics.expected @@ -27,12 +27,12 @@ } } { - "markdownMessage": "Found unreachable NuGet feed in C# analysis with build-mode 'none'. This may cause missing dependencies in the analysis.", + "markdownMessage": "Found unreachable NuGet feeds in C# analysis with build-mode 'none':\n\n- `https://localhost:53/packages/`\n- `https://localhost:80/packages/`\n\nThis may cause missing dependencies in the analysis.", "severity": "note", "source": { "extractorName": "csharp", "id": "csharp/autobuilder/buildless/unreachable-feed", - "name": "Found unreachable NuGet feed in C# analysis with build-mode 'none'" + "name": "Found unreachable NuGet feeds in C# analysis with build-mode 'none'" }, "visibility": { "cliSummaryTable": true, diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/CompilationInfo.expected b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/CompilationInfo.expected index d421cfc42e1a..384d64a59855 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/CompilationInfo.expected +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/CompilationInfo.expected @@ -1,24 +1,25 @@ -| All NuGet feeds reachable | 0.0 | -| Failed project restore with missing package error | 1.0 | -| Failed project restore with package source error | 0.0 | -| Failed solution restore with missing package error | 0.0 | -| Failed solution restore with package source error | 0.0 | -| Fallback nuget restore | 1.0 | -| Inherited NuGet feed count | 1.0 | -| NuGet feed responsiveness checked | 1.0 | -| Project files on filesystem | 1.0 | -| Reachable fallback NuGet feed count | 2.0 | -| Resolved assembly conflicts | 7.0 | -| Resource extraction enabled | 0.0 | -| Restored .NET framework variants | 0.0 | -| Restored projects through solution files | 0.0 | -| Solution files on filesystem | 1.0 | -| Source files generated | 0.0 | -| Source files on filesystem | 1.0 | -| Successfully ran fallback nuget restore | 1.0 | -| Successfully restored project files | 0.0 | -| Successfully restored solution files | 1.0 | -| Unresolved references | 0.0 | -| UseWPF set | 0.0 | -| UseWindowsForms set | 0.0 | -| WebView extraction enabled | 1.0 | +| All NuGet feeds reachable | 0 | +| Failed project restore with missing package error | 1 | +| Failed project restore with package source error | 0 | +| Failed solution restore with missing package error | 0 | +| Failed solution restore with package source error | 0 | +| Fallback nuget restore | 1 | +| Inherited NuGet feed count | 1 | +| NuGet feed responsiveness checked | 1 | +| Project files on filesystem | 1 | +| Reachable fallback NuGet feed count | 2 | +| Resolved assembly conflicts | 7 | +| Resource extraction enabled | 0 | +| Restored .NET framework variants | 0 | +| Restored projects through solution files | 0 | +| Solution files on filesystem | 1 | +| Source files generated | 0 | +| Source files on filesystem | 1 | +| Successfully ran fallback nuget restore | 1 | +| Successfully restored project files | 0 | +| Successfully restored solution files | 1 | +| Unreachable NuGet feeds | https://www.nuget.org/api/v2/ | +| Unresolved references | 0 | +| UseWPF set | 0 | +| UseWindowsForms set | 0 | +| WebView extraction enabled | 1 | diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/CompilationInfo.ql b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/CompilationInfo.ql index 073ffe3b224d..ae7505a8b0be 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/CompilationInfo.ql +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/CompilationInfo.ql @@ -1,15 +1,8 @@ import csharp import semmle.code.csharp.commons.Diagnostics -query predicate compilationInfo(string key, float value) { +query predicate compilationInfo(string key, string value) { key != "Resolved references" and not key.matches("Compiler diagnostic count for%") and - exists(Compilation c, string infoKey, string infoValue | infoValue = c.getInfo(infoKey) | - key = infoKey and - value = infoValue.toFloat() - or - not exists(infoValue.toFloat()) and - key = infoKey + ": " + infoValue and - value = 1 - ) + value = any(Compilation c).getInfo(key) } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/diagnostics.expected b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/diagnostics.expected index bbd2081f4554..66867fd38eeb 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/diagnostics.expected +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/diagnostics.expected @@ -27,12 +27,12 @@ } } { - "markdownMessage": "Found unreachable NuGet feed in C# analysis with build-mode 'none'. This may cause missing dependencies in the analysis.", + "markdownMessage": "Found unreachable NuGet feeds in C# analysis with build-mode 'none':\n\n- `https://www.nuget.org/api/v2/`\n\nThis may cause missing dependencies in the analysis.", "severity": "note", "source": { "extractorName": "csharp", "id": "csharp/autobuilder/buildless/unreachable-feed", - "name": "Found unreachable NuGet feed in C# analysis with build-mode 'none'" + "name": "Found unreachable NuGet feeds in C# analysis with build-mode 'none'" }, "visibility": { "cliSummaryTable": true, From bb6def05a87bff29042deab7be9accb375d42c14 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Tue, 18 Aug 2026 08:28:47 +0200 Subject: [PATCH 0514/2098] C#: Add change-note. --- .../change-notes/2026-08-18-tsp-nuget-feed-reachability.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 csharp/ql/lib/change-notes/2026-08-18-tsp-nuget-feed-reachability.md diff --git a/csharp/ql/lib/change-notes/2026-08-18-tsp-nuget-feed-reachability.md b/csharp/ql/lib/change-notes/2026-08-18-tsp-nuget-feed-reachability.md new file mode 100644 index 000000000000..fc391ad6f804 --- /dev/null +++ b/csharp/ql/lib/change-notes/2026-08-18-tsp-nuget-feed-reachability.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* C# analysis with build mode `none` now lists unreachable explicitly configured NuGet feeds in both the extraction warning and the tool status page note. This makes it easier to identify feeds that may cause dependencies to be missing from the analysis. From 94463949850fd3192bd1a36c092c420d2ae5887a Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 24 Aug 2026 16:13:47 +0200 Subject: [PATCH 0515/2098] C#: Avoid logging sensitive information like username and password (if hardcoded in the nuget.config feed URL). --- .../NugetPackageRestorer.cs | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs index 109d050f8786..f0772491072a 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs @@ -535,6 +535,22 @@ private void TryChangeProjectFile(DirectoryInfo projectDir, Regex pattern, strin } } + private string SanitizeFeedForLogging(string feed) + { + + try + { + // If the feed is a URL, log only the scheme, host, port, and absolute path to avoid logging sensitive information such as credentials or tokens. + var uri = new Uri(feed); + var port = uri.IsDefaultPort ? string.Empty : $":{uri.Port}"; + return $"{uri.Scheme}://{uri.Host}{port}{uri.AbsolutePath}"; + } + catch + { + return feed; + } + } + /// /// If is not empty, logs this and emits a diagnostic. /// Adds a `CompilationInfos` entry either way. @@ -544,7 +560,10 @@ private void EmitFeedReachabilityDiagnostics(ImmutableHashSet unreachabl { if (unreachableFeeds.Count > 0) { - var orderedUnreachableFeeds = unreachableFeeds.OrderBy(feed => feed).ToList(); + var orderedUnreachableFeeds = unreachableFeeds + .Select(SanitizeFeedForLogging) + .OrderBy(feed => feed) + .ToList(); var unreachableFeedList = string.Join(", ", orderedUnreachableFeeds); logger.LogWarning($"Found unreachable NuGet feeds in C# analysis with build-mode 'none': {unreachableFeedList}. This may cause missing dependencies in the analysis."); compilationInfoContainer.CompilationInfos.Add(("Unreachable NuGet feeds", unreachableFeedList)); From 746b8067f15f8f9380fa1978acea6acbe79ce331 Mon Sep 17 00:00:00 2001 From: hugo-syn <61210734+hugo-syn@users.noreply.github.com> Date: Tue, 25 Aug 2026 15:04:40 +0200 Subject: [PATCH 0516/2098] Update csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml Co-authored-by: Michael Nebel --- csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml b/csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml index ede706dd194a..a2da2bee2dfe 100644 --- a/csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml +++ b/csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml @@ -4,4 +4,12 @@ extensions: extensible: summaryModel data: - ["Microsoft.AspNet.OData", "Delta", True, "GetInstance", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["Microsoft.AspNet.OData", "Delta", True, "Patch", "(TStructuralType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] + - ["Microsoft.AspNet.OData", "Delta", True, "Put", "(TStructuralType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] + - ["Microsoft.AspNet.OData", "Delta", True, "CopyChangedValues", "(TStructuralType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] + - ["Microsoft.AspNet.OData", "Delta", True, "CopyUnchangedValues", "(TStructuralType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "GetInstance", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "Patch", "(T)", "", "Argument[this]", "Argument[0]", "taint", "manual"] + - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "Put", "(T)", "", "Argument[this]", "Argument[0]", "taint", "manual"] + - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "CopyChangedValues", "(T)", "", "Argument[this]", "Argument[0]", "taint", "manual"] + - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "CopyUnchangedValues", "(T)", "", "Argument[this]", "Argument[0]", "taint", "manual"] From 131b6be091722116ab832e0e72ea54c00911a0ea Mon Sep 17 00:00:00 2001 From: hugo-syn <61210734+hugo-syn@users.noreply.github.com> Date: Tue, 25 Aug 2026 15:04:52 +0200 Subject: [PATCH 0517/2098] Update csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll Co-authored-by: Michael Nebel --- csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll | 8 -------- 1 file changed, 8 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll index 936a50d6cf30..9989583fd6ae 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll @@ -79,14 +79,6 @@ class ODataBoundType extends ValueOrRefType { } } -/** The `Patch`, `Put`, `CopyChangedValues`, and `CopyUnchangedValues` methods on `Delta`. */ -class DeltaMutatingMethod extends Method { - DeltaMutatingMethod() { - this.getDeclaringType() instanceof DeltaClass and - this.hasName(["Patch", "Put", "CopyChangedValues", "CopyUnchangedValues"]) - } -} - /** * Taint members (transitively) on types used in * 1. Casts, `as`-conversions, or type tests applied to `ODataActionParameters` values. From de9eae2324310170a0218ac49435f91103439261 Mon Sep 17 00:00:00 2001 From: hugo-syn <61210734+hugo-syn@users.noreply.github.com> Date: Tue, 25 Aug 2026 15:05:04 +0200 Subject: [PATCH 0518/2098] Update csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll Co-authored-by: Michael Nebel --- .../lib/semmle/code/csharp/frameworks/OData.qll | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll index 9989583fd6ae..e5ca56a60e99 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll @@ -100,18 +100,3 @@ private class ODataBoundMember extends TaintTracking::TaintedMember, CandidateMe ) } } - -/** - * A call to `Delta.Patch`/`Put`/`CopyChangedValues`/`CopyUnchangedValues` - * copies the changes tracked by the `Delta` receiver onto its `original` - * entity argument. - */ -private class DeltaMutatingCallTaintStep extends AdditionalTaintStep { - override predicate step(DataFlow::Node node1, DataFlow::Node node2) { - exists(MethodCall mc | - mc.getTarget().getUnboundDeclaration() instanceof DeltaMutatingMethod and - node1.asExpr() = mc.getQualifier() and - node2.(PostUpdateNode).getPreUpdateNode().asExpr() = mc.getArgument(0) - ) - } -} From 393512f0d02e65148b3a21f10c7e48b1171550b7 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 25 Aug 2026 14:05:35 +0100 Subject: [PATCH 0519/2098] C++: Implement a pruning version of 'getAnUltimateDefinition'. --- .../cpp/ir/dataflow/internal/DataFlowUtil.qll | 2 + .../code/cpp/ir/dataflow/internal/SsaImpl.qll | 84 +++++++++++++++++-- 2 files changed, 79 insertions(+), 7 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll index 13d16375f236..17c3438f098a 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll @@ -1018,4 +1018,6 @@ module Ssa { class IndirectExplicitDefinition = SsaImpl::IndirectExplicitDefinition; class PhiNode = SsaImpl::PhiNode; + + import SsaImpl::Public } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll index 432261dfe278..402925117c56 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll @@ -1405,14 +1405,80 @@ private class PhiCycle extends PhiCycleEquivalence::EquivalenceClass { } } -/** An static single assignment (SSA) definition. */ -class Definition extends SsaImpl::Definition { - private Definition getAPhiInputOrPriorDefinition() { - result = this.(PhiNode).getAnInput() - or - uncertainWriteDefinitionInput(this, result) +private Definition getAPhiInputOrPriorDefinition(Definition def) { + result = def.(PhiNode).getAnInput() + or + uncertainWriteDefinitionInput(def, result) +} + +module Public { + /** + * A module signature to define relevant ultimate definitions for an + * optimized version of `Definition.getAnUltimateDefinition`. + */ + signature module GetAnUltimateDefinitionSig { + /** + * Holds if `def` is a relevant definition. This defines the set + * of `Definition`s which may be returned by + * `GetAnUltimateDefinition::getAnUltimateDefinition`. + */ + predicate isRelevantUltimateDefinition(Definition def); + } + + /** + * A module which constructs an optimized version of + * ``` + * Definition.getAnUltimateDefinition + * ``` + * by restricting the set of possible ultimate definitions. + * + * Use this module by defining a module `M` which implements + * `GetAnUltimateDefinitionSig` and then call: + * ``` + * GetAnUltimateDefinition::getAnUltimateDefinition + * ``` + */ + module GetAnUltimateDefinition { + private import Sig + + private predicate relevantUltimateDefinition(Definition def) { + isRelevantUltimateDefinition(def) and + not def instanceof PhiNode + } + + private predicate fwd(Definition def) { + relevantUltimateDefinition(def) + or + exists(Definition def0 | + fwd(def0) and + def0 = getAPhiInputOrPriorDefinition(def) + ) + } + + private predicate step(Definition def1, Definition def2) { + fwd(def1) and + fwd(def2) and + def1 = getAPhiInputOrPriorDefinition(def2) + } + + /** + * Gets a definition that ultimately defines this SSA definition and is + * not itself a phi node. + * + * This predicate is restricted to ultimate definitions which + * satisfy `isRelevantUltimateDefinition`. + */ + Definition getAnUltimateDefinition(Definition def) { + step*(result, def) and + relevantUltimateDefinition(result) + } } +} +import Public + +/** An static single assignment (SSA) definition. */ +class Definition extends SsaImpl::Definition { /** * Holds if this SSA definition is live at the end of basic block `bb`. * That is, this definition reaches the end of basic block `bb`, at which @@ -1424,9 +1490,13 @@ class Definition extends SsaImpl::Definition { /** * Gets a definition that ultimately defines this SSA definition and is * not itself a phi node. + * + * Note: A more efficient implementation of this predicate exists. See the + * `GetAnUltimateDefinition` module for a description of how to access + * the more efficient implementation. */ final Definition getAnUltimateDefinition() { - result = this.getAPhiInputOrPriorDefinition*() and + result = getAPhiInputOrPriorDefinition*(this) and not result instanceof PhiNode } From 59170eeb0a18e3cf609b2cecede76a3faa6ef339 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 25 Aug 2026 14:08:28 +0100 Subject: [PATCH 0520/2098] C++: Use the optimized version of getAnUltimateDefinition in FlowSummaryImpl.qll. --- .../cpp/dataflow/internal/FlowSummaryImpl.qll | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll index 0eba3d5fc181..ecb60ba720ae 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll @@ -171,6 +171,23 @@ private module Input2 implements Impl::Private::InputSig2 { result = e.(ConversionCall).getQualifier().(LambdaExpression).getLambdaFunction() } + private module GetAnUltimateDefinitionInput implements Ssa::GetAnUltimateDefinitionSig { + predicate isRelevantUltimateDefinition(Ssa::Definition def) { + exists( + getFunctionFromExpr(def.(Ssa::DirectExplicitDefinition) + .getAssignedInstruction() + .(StoreInstruction) + .getSourceValue() + .getUnconvertedResultExpression()) + ) + } + } + + private Ssa::Definition getAnUltimateDefinition(Ssa::Definition def) { + result = + Ssa::GetAnUltimateDefinition::getAnUltimateDefinition(def) + } + class SourceSinkReportingElement extends Element { SourceSinkReportingElement() { this instanceof Expr or this instanceof Parameter } @@ -191,7 +208,7 @@ private module Input2 implements Impl::Private::InputSig2 { exists(Ssa::Definition def | def.getAUse().getDef().getUnconvertedResultExpression() = this and result = - getFunctionFromExpr(def.getAnUltimateDefinition() + getFunctionFromExpr(getAnUltimateDefinition(def) .(Ssa::DirectExplicitDefinition) .getAssignedInstruction() .(StoreInstruction) From 6214cd1bd8cbaf3b1cae680d772d696ab3f09e42 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 25 Aug 2026 14:15:58 +0100 Subject: [PATCH 0521/2098] C++: Cleanup. --- .../cpp/dataflow/internal/FlowSummaryImpl.qll | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll index ecb60ba720ae..efe18e0945ed 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll @@ -171,21 +171,26 @@ private module Input2 implements Impl::Private::InputSig2 { result = e.(ConversionCall).getQualifier().(LambdaExpression).getLambdaFunction() } + private predicate isRelevantUltimateDefinition(Ssa::DirectExplicitDefinition def, Function f) { + f = + getFunctionFromExpr(def.getAssignedInstruction() + .(StoreInstruction) + .getSourceValue() + .getUnconvertedResultExpression()) + } + private module GetAnUltimateDefinitionInput implements Ssa::GetAnUltimateDefinitionSig { predicate isRelevantUltimateDefinition(Ssa::Definition def) { - exists( - getFunctionFromExpr(def.(Ssa::DirectExplicitDefinition) - .getAssignedInstruction() - .(StoreInstruction) - .getSourceValue() - .getUnconvertedResultExpression()) - ) + isRelevantUltimateDefinition(def, _) } } - private Ssa::Definition getAnUltimateDefinition(Ssa::Definition def) { - result = - Ssa::GetAnUltimateDefinition::getAnUltimateDefinition(def) + private predicate hasAnUltimateFunctionAccessDefinition(Ssa::Definition def, Function f) { + exists(Ssa::Definition ultimate | + ultimate = + Ssa::GetAnUltimateDefinition::getAnUltimateDefinition(def) and + isRelevantUltimateDefinition(ultimate, f) + ) } class SourceSinkReportingElement extends Element { @@ -207,13 +212,7 @@ private module Input2 implements Impl::Private::InputSig2 { // The expression is an SSA read of an assignment of a callable exists(Ssa::Definition def | def.getAUse().getDef().getUnconvertedResultExpression() = this and - result = - getFunctionFromExpr(getAnUltimateDefinition(def) - .(Ssa::DirectExplicitDefinition) - .getAssignedInstruction() - .(StoreInstruction) - .getSourceValue() - .getUnconvertedResultExpression()) + hasAnUltimateFunctionAccessDefinition(def, result) ) } From 891f2e1a4f9d160161548bfdc05e56965f41d4cc Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 25 Aug 2026 14:18:01 +0100 Subject: [PATCH 0522/2098] C++: Use the optimized version of getAnUltimateDefinition for iterator flow. --- .../ir/dataflow/internal/DataFlowPrivate.qll | 66 ++++++++++++------- 1 file changed, 41 insertions(+), 25 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll index 6b79671ce638..3a1b42645642 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll @@ -1977,13 +1977,23 @@ module IteratorFlow { } /** - * Gets an ultimate definition of `def`. - * - * Note: Unlike `def.getAnUltimateDefinition()` this predicate also - * traverses back through iterator increment and decrement operations. + * Holds if `write` is an instruction that writes to address `address` */ - private Ssa::Definition getAnUltimateDefinition(Ssa::Definition def) { - result = def.getAnUltimateDefinition() + private predicate isIteratorWrite(Instruction write, Operand address) { + exists(Ssa::DefImpl writeDef, IRBlock bb, int i | + writeDef.hasIndexInBlock(_, bb, i) and + bb.getInstruction(i) = write and + address = writeDef.getAddressOperand() + ) + } + + private module GetAnUltimateDefinitionInput implements Ssa::GetAnUltimateDefinitionSig { + predicate isRelevantUltimateDefinition(Ssa::Definition def) { fwd(_, def) } + } + + private Ssa::Definition getAnUltimateDefinitionStep(Ssa::Definition def) { + result = + Ssa::GetAnUltimateDefinition::getAnUltimateDefinition(def) or exists(IRBlock bb, int i, IteratorCrementCall crementCall, Ssa::SourceVariable sv | crementCall = def.getValue().asInstruction().(StoreInstruction).getSourceValue() and @@ -1993,14 +2003,28 @@ module IteratorFlow { ) } - /** - * Holds if `write` is an instruction that writes to address `address` - */ - private predicate isIteratorWrite(Instruction write, Operand address) { - exists(Ssa::DefImpl writeDef, IRBlock bb, int i | - writeDef.hasIndexInBlock(_, bb, i) and - bb.getInstruction(i) = write and - address = writeDef.getAddressOperand() + private predicate isSource(GetsIteratorCall beginCall, Ssa::Definition def) { + exists(StoreInstruction beginStore | + beginStore = def.getValue().asInstruction() and + operandForFullyConvertedCall(beginStore.getSourceValueOperand(), beginCall) + ) + } + + private predicate isSink(Instruction writeToDeref, Ssa::Definition def) { + exists(IteratorPointerDereferenceCall starCall, Operand address, IRBlock bbStar, int iStar | + isIteratorWrite(writeToDeref, address) and + operandForFullyConvertedCall(address, starCall) and + bbStar.getInstruction(iStar) = starCall and + Ssa::ssaDefReachesRead(_, def, bbStar, iStar) + ) + } + + private predicate fwd(GetsIteratorCall beginCall, Ssa::Definition def) { + isSource(beginCall, def) + or + exists(Ssa::Definition def0 | + fwd(beginCall, def0) and + def0 = getAnUltimateDefinitionStep(def) ) } @@ -2016,17 +2040,9 @@ module IteratorFlow { private predicate isIteratorStoreInstruction( GetsIteratorCall beginCall, Instruction writeToDeref ) { - exists( - StoreInstruction beginStore, IRBlock bbStar, int iStar, Ssa::Definition def, - IteratorPointerDereferenceCall starCall, Ssa::Definition ultimate, Operand address - | - isIteratorWrite(writeToDeref, address) and - operandForFullyConvertedCall(address, starCall) and - bbStar.getInstruction(iStar) = starCall and - Ssa::ssaDefReachesRead(_, def, bbStar, iStar) and - ultimate = getAnUltimateDefinition*(def) and - beginStore = ultimate.getValue().asInstruction() and - operandForFullyConvertedCall(beginStore.getSourceValueOperand(), beginCall) + exists(Ssa::Definition def | + fwd(beginCall, def) and + isSink(writeToDeref, def) ) } From 117fc6b310d87714c5cbc3dace0aa72490cec279 Mon Sep 17 00:00:00 2001 From: Alex Ausch Date: Tue, 25 Aug 2026 15:52:57 +0200 Subject: [PATCH 0523/2098] Python: keep the Python 2 reading of `except A, e:` The previous commit read a comma-separated fourth child as a tuple of exception types unconditionally. That is right for Python 3, but the default parser is version-agnostic and also runs when extracting Python 2 (`CODEQL_EXTRACTOR_PYTHON_ANALYSIS_VERSION=2`, `--lang=2`), where `except Exception, e:` really is the alias binding and the canonical idiom. In that mode the change flipped `e` from a `Store` to a `Load` of an undefined name and dropped the binding altogether. So the separator token alone is not enough to decide: `as` binds an alias in every version, a comma binds an alias under Python 2 and builds a tuple otherwise. Chains of three or more are unaffected either way -- they are not valid Python 2, and the default grammar rejects them, so `Module.py_ast` falls back to tree-sitter. The file-driven parser tests cannot express this; they run at the default analysis version and there is no per-fixture way to change it. So `tests/test_except_clause.py` drives `parser.parse` directly with the version flipped, and pins all four combinations -- comma and `as`, Python 2 and 3, plus the parenthesized form that must bind no alias in either. Removing the version gate fails the Python 2 case. Co-Authored-By: Claude Opus 5 (1M context) --- python/extractor/semmle/python/parser/ast.py | 15 ++-- python/extractor/tests/test_except_clause.py | 71 +++++++++++++++++++ ...2026-08-19-legacy-parser-relaxed-except.md | 2 +- 3 files changed, 82 insertions(+), 6 deletions(-) create mode 100644 python/extractor/tests/test_except_clause.py diff --git a/python/extractor/semmle/python/parser/ast.py b/python/extractor/semmle/python/parser/ast.py index 0712bf08ae45..9a1cea1ae62e 100644 --- a/python/extractor/semmle/python/parser/ast.py +++ b/python/extractor/semmle/python/parser/ast.py @@ -1,6 +1,7 @@ from blib2to3.pgen2 import token from ast import literal_eval from semmle.python import ast +from semmle.util import get_analysis_major_version from blib2to3.pgen2.parse import ParseError import sys @@ -981,13 +982,17 @@ def visit_except_clause(self, node): if len(node.children) > 1: type = self.visit(node.children[1], LOAD) if len(node.children) > 3: - if is_token(node.children[2], "as"): + # The grammar rule `'except' [test [(',' | 'as') test]]` is shared + # between two incompatible readings of a fourth child, so the + # separator token and the analysis version together decide: + # `except A as e:` binds an alias, in every version; + # `except A, e:` binds an alias when extracting Python 2, where + # that is the canonical idiom; + # `except A, B:` is an unparenthesized tuple of exception types + # otherwise -- PEP 758, Python 3.14+. + if is_token(node.children[2], "as") or get_analysis_major_version() == 2: name = self.visit(node.children[3], STORE) else: - # PEP 758 (Python 3.14+): `except A, B:` is an unparenthesized - # tuple of exception types, not a Python 2 alias binding. The - # grammar rule `'except' [test [(',' | 'as') test]]` is shared - # between both readings, so the separator token decides. elts = [type, self.visit(node.children[3], LOAD)] type = ast.Tuple(elts, LOAD) set_location(type, node.children[1].start, node.children[3].end) diff --git a/python/extractor/tests/test_except_clause.py b/python/extractor/tests/test_except_clause.py new file mode 100644 index 000000000000..d09ae382b9dd --- /dev/null +++ b/python/extractor/tests/test_except_clause.py @@ -0,0 +1,71 @@ +import unittest +from contextlib import contextmanager + +from semmle import util +from semmle.python import ast +from semmle.python import parser +from semmle.python.parser.dump_ast import StdoutLogger +from semmle.python.parser.tokenizer import Tokenizer + + +@contextmanager +def analysis_version(version): + 'Extract as if `CODEQL_EXTRACTOR_PYTHON_ANALYSIS_VERSION` were `version`.' + previous = util.get_analysis_version() + util.update_analysis_version(version) + try: + yield + finally: + util.update_analysis_version(previous) + + +class ExceptClauseTest(unittest.TestCase): + '''`except_clause: 'except' [test [(',' | 'as') test]]` is one grammar rule + covering two incompatible readings of `except A, B:` -- a Python 2 alias + binding and a PEP 758 tuple of exception types. Which one the default parser + picks depends on the version being extracted, so these tests pin both. + ''' + + def handler(self, source): + 'The first `except` handler of the first statement of `source`.' + with StdoutLogger() as logger: + module = parser.parse(Tokenizer(source).tokens(), logger) + return module.body[0].handlers[0] + + def test_comma_is_a_tuple_of_types_in_python_3(self): + with analysis_version("3.11"): + handler = self.handler("try:\n a\nexcept b, c:\n d\n") + self.assertIsNone(handler.name) + self.assertIsInstance(handler.type, ast.Tuple) + self.assertIsInstance(handler.type.ctx, ast.Load) + self.assertEqual(["b", "c"], [elt.id for elt in handler.type.elts]) + for elt in handler.type.elts: + self.assertIsInstance(elt.ctx, ast.Load) + + def test_comma_is_an_alias_binding_in_python_2(self): + with analysis_version("2.7.18"): + handler = self.handler("try:\n a\nexcept b, c:\n d\n") + self.assertIsInstance(handler.type, ast.Name) + self.assertEqual("b", handler.type.id) + self.assertIsInstance(handler.type.ctx, ast.Load) + self.assertIsInstance(handler.name, ast.Name) + self.assertEqual("c", handler.name.id) + self.assertIsInstance(handler.name.ctx, ast.Store) + + def test_as_is_an_alias_binding_in_both_versions(self): + for version in ("3.11", "2.7.18"): + with analysis_version(version): + handler = self.handler("try:\n a\nexcept b as c:\n d\n") + self.assertIsInstance(handler.type, ast.Name, version) + self.assertEqual("b", handler.type.id, version) + self.assertIsInstance(handler.name, ast.Name, version) + self.assertEqual("c", handler.name.id, version) + self.assertIsInstance(handler.name.ctx, ast.Store, version) + + def test_parenthesised_types_bind_no_alias_in_either_version(self): + for version in ("3.11", "2.7.18"): + with analysis_version(version): + handler = self.handler("try:\n a\nexcept (b, c):\n d\n") + self.assertIsNone(handler.name, version) + self.assertIsInstance(handler.type, ast.Tuple, version) + self.assertEqual(["b", "c"], [elt.id for elt in handler.type.elts], version) diff --git a/python/ql/lib/change-notes/2026-08-19-legacy-parser-relaxed-except.md b/python/ql/lib/change-notes/2026-08-19-legacy-parser-relaxed-except.md index bd4bd599f568..5e7681b2436f 100644 --- a/python/ql/lib/change-notes/2026-08-19-legacy-parser-relaxed-except.md +++ b/python/ql/lib/change-notes/2026-08-19-legacy-parser-relaxed-except.md @@ -1,4 +1,4 @@ --- category: fix --- -* Fixed the extraction of PEP 758 `except A, B:` clauses by the default (non-tree-sitter) Python parser. Previously the second exception type was extracted as a Python 2 style alias binding, so it was recorded as a `Store` rather than a use. This caused false positives from queries that reason about whether a name is used, such as `py/unused-import`. +* Fixed the extraction of PEP 758 `except A, B:` clauses by the default (non-tree-sitter) Python parser. Previously the second exception type was extracted as a Python 2 style alias binding, so it was recorded as a `Store` rather than a use. This caused false positives from queries that reason about whether a name is used, such as `py/unused-import`. When extracting Python 2 (`--lang=2`), `except A, e:` continues to bind `e` as an alias, since that is what the syntax means in that version. From 93baa405ecae6ce83d0b90b877828e584f2bb4b4 Mon Sep 17 00:00:00 2001 From: hugo-syn Date: Tue, 25 Aug 2026 16:03:30 +0200 Subject: [PATCH 0524/2098] fix: add fix from review --- .../lib/ext/Microsoft.AspNet.OData.model.yml | 8 ++++ .../semmle/code/csharp/frameworks/OData.qll | 44 ++++++++++++++++--- .../library-tests/frameworks/OData/OData.cs | 40 +++++++++++++++++ .../frameworks/OData/OData.expected | 10 ++++- .../library-tests/frameworks/OData/OData.ql | 2 + .../library-tests/frameworks/OData/options | 1 + .../7.7.5/Microsoft.AspNet.OData.cs | 6 +-- .../resources/stubs/System.Web.Http.OData.cs | 15 +++++++ 8 files changed, 113 insertions(+), 13 deletions(-) create mode 100644 csharp/ql/test/resources/stubs/System.Web.Http.OData.cs diff --git a/csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml b/csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml index a2da2bee2dfe..e27c4ccfe529 100644 --- a/csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml +++ b/csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml @@ -5,11 +5,19 @@ extensions: data: - ["Microsoft.AspNet.OData", "Delta", True, "GetInstance", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["Microsoft.AspNet.OData", "Delta", True, "Patch", "(TStructuralType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] + - ["Microsoft.AspNet.OData", "Delta", True, "Patch", "(TStructuralType)", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["Microsoft.AspNet.OData", "Delta", True, "Put", "(TStructuralType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] - ["Microsoft.AspNet.OData", "Delta", True, "CopyChangedValues", "(TStructuralType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] + - ["Microsoft.AspNet.OData", "Delta", True, "CopyChangedValues", "(TStructuralType)", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["Microsoft.AspNet.OData", "Delta", True, "CopyUnchangedValues", "(TStructuralType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "GetInstance", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "Patch", "(T)", "", "Argument[this]", "Argument[0]", "taint", "manual"] + - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "Patch", "(T)", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "Put", "(T)", "", "Argument[this]", "Argument[0]", "taint", "manual"] - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "CopyChangedValues", "(T)", "", "Argument[this]", "Argument[0]", "taint", "manual"] - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "CopyUnchangedValues", "(T)", "", "Argument[this]", "Argument[0]", "taint", "manual"] + - ["System.Web.Http.OData", "Delta", True, "GetEntity", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["System.Web.Http.OData", "Delta", True, "Patch", "(TEntityType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] + - ["System.Web.Http.OData", "Delta", True, "Put", "(TEntityType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] + - ["System.Web.Http.OData", "Delta", True, "CopyChangedValues", "(TEntityType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] + - ["System.Web.Http.OData", "Delta", True, "CopyUnchangedValues", "(TEntityType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll index e5ca56a60e99..9571268c6b30 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll @@ -9,8 +9,9 @@ * values are cast, `as`-converted, or type-tested to arbitrary model types * by the action method body. * - `Delta`, a change-tracking wrapper for PATCH/PUT requests, whose - * tracked property values are exposed via `GetInstance()` or copied onto an - * existing entity via `Patch`/`Put`/`CopyChangedValues`/`CopyUnchangedValues`. + * tracked property values are exposed via `GetInstance()` (`GetEntity()` in + * the older `System.Web.Http.OData`) or copied onto an existing entity via + * `Patch`/`Put`/`CopyChangedValues`/`CopyUnchangedValues`. * * In both cases the type that ends up holding the client-controlled data has * no static relationship to the action method's parameter types, so its @@ -20,7 +21,6 @@ import csharp private import semmle.code.csharp.commons.Collections private import semmle.code.csharp.dataflow.FlowSteps -private import semmle.code.csharp.dataflow.internal.DataFlowPrivate private import semmle.code.csharp.security.dataflow.flowsources.Remote /** The `ODataActionParameters` dictionary type, across OData library versions. */ @@ -32,14 +32,43 @@ class ODataActionParametersClass extends Class { } } -/** An indexer read on an `ODataActionParameters` dictionary, e.g. `parameters["Foo"]`. */ +/** + * Holds if `e` is (or, via local flow -- e.g. an upcast to `IDictionary` + * -- may hold the value of) an `ODataActionParameters` dictionary. + */ +private predicate isODataActionParametersValue(Expr e) { + e.getType() instanceof ODataActionParametersClass + or + DataFlow::localExprFlow(any(Expr e0 | isODataActionParametersValue(e0)), e) +} + +/** + * An indexer read on an `ODataActionParameters` dictionary, e.g. `parameters["Foo"]` + * (including through an upcast to a base dictionary type/interface). + */ class ODataActionParameterRead extends ElementAccess { - ODataActionParameterRead() { this.getQualifier().getType() instanceof ODataActionParametersClass } + ODataActionParameterRead() { isODataActionParametersValue(this.getQualifier()) } +} + +/** + * A call to `TryGetValue` on an `ODataActionParameters` dictionary copies the value + * of the looked-up entry into the `out` argument. + */ +private class ODataActionParametersTryGetValueTaintStep extends AdditionalTaintStep { + override predicate step(DataFlow::Node node1, DataFlow::Node node2) { + exists(MethodCall mc, AssignableDefinitions::OutRefDefinition def | + mc.getTarget().hasName("TryGetValue") and + isODataActionParametersValue(mc.getQualifier()) and + node1.asExpr() = mc.getQualifier() and + def.getTargetAccess() = mc.getArgumentForName("value") and + node2 = DataFlow::assignableDefinitionNode(def) + ) + } } /** Holds if `e` may (locally) hold the value of an `ODataActionParameters` entry. */ private predicate isODataParameterValue(Expr e) { - TaintTracking::localExprTaint(any(ODataActionParameterRead r), e) + DataFlow::localExprFlow(any(ODataActionParameterRead r), e) } /** The generic ``Delta`1`` change-tracking class, across OData library versions. */ @@ -48,7 +77,8 @@ class DeltaClass extends UnboundGenericClass { this.getNumberOfTypeParameters() = 1 and ( this.hasFullyQualifiedName("Microsoft.AspNet.OData", "Delta`1") or - this.hasFullyQualifiedName("Microsoft.AspNetCore.OData.Deltas", "Delta`1") + this.hasFullyQualifiedName("Microsoft.AspNetCore.OData.Deltas", "Delta`1") or + this.hasFullyQualifiedName("System.Web.Http.OData", "Delta`1") ) } } diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.cs b/csharp/ql/test/library-tests/frameworks/OData/OData.cs index ab06179ab79a..bbce96d56fc9 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.cs +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.cs @@ -73,6 +73,22 @@ void IsAsFromDictionary(ODataActionParameters parameters) } } + void TryGetValueFromDictionary(ODataActionParameters parameters) + { + if (parameters.TryGetValue("Entity", out var value)) + { + var entity = (BoundEntity)value; + Sink(entity.Name); + } + } + + void UpcastThenIndex(ODataActionParameters parameters) + { + IDictionary dict = parameters; + var entity = (BoundEntity)dict["Entity"]; + Sink(entity.Name); + } + void DeltaPatch(Delta delta, Widget original) { delta.Patch(original); @@ -85,6 +101,30 @@ void DeltaGetInstance(Delta delta) Sink(w.Name); } + void DeltaPatchReturnValue(Delta delta, Widget original) + { + var updated = delta.Patch(original); + Sink(updated.Name); + } + + void DeltaCopyChangedValuesReturnValue(Delta delta, Widget original) + { + var updated = delta.CopyChangedValues(original); + Sink(updated.Name); + } + + void LegacyDeltaPatch(System.Web.Http.OData.Delta delta, Widget original) + { + delta.Patch(original); + Sink(original.Name); + } + + void LegacyDeltaGetEntity(System.Web.Http.OData.Delta delta) + { + var w = delta.GetEntity(); + Sink(w.Name); + } + void Untainted() { var w = new Widget(); diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.expected b/csharp/ql/test/library-tests/frameworks/OData/OData.expected index fad59d4a9a9b..290236df722e 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.expected +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.expected @@ -5,5 +5,11 @@ | OData.cs:46:55:46:64 | parameters | OData.cs:55:22:55:28 | access to property Owner | | OData.cs:59:55:59:64 | parameters | OData.cs:65:26:65:35 | access to property Label | | OData.cs:59:55:59:64 | parameters | OData.cs:72:22:72:34 | access to property Category | -| OData.cs:76:39:76:43 | delta | OData.cs:79:18:79:30 | access to property Name | -| OData.cs:82:45:82:49 | delta | OData.cs:85:18:85:23 | access to property Name | +| OData.cs:76:62:76:71 | parameters | OData.cs:81:22:81:32 | access to property Name | +| OData.cs:85:52:85:61 | parameters | OData.cs:89:18:89:28 | access to property Name | +| OData.cs:92:39:92:43 | delta | OData.cs:95:18:95:30 | access to property Name | +| OData.cs:98:45:98:49 | delta | OData.cs:101:18:101:23 | access to property Name | +| OData.cs:104:50:104:54 | delta | OData.cs:107:18:107:29 | access to property Name | +| OData.cs:110:62:110:66 | delta | OData.cs:113:18:113:29 | access to property Name | +| OData.cs:116:67:116:71 | delta | OData.cs:119:18:119:30 | access to property Name | +| OData.cs:122:71:122:75 | delta | OData.cs:125:18:125:23 | access to property Name | diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.ql b/csharp/ql/test/library-tests/frameworks/OData/OData.ql index 80d0f1d04dec..ed70740699e3 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.ql +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.ql @@ -6,6 +6,8 @@ module TaintConfig implements DataFlow::ConfigSig { p.getType().hasFullyQualifiedName("Microsoft.AspNet.OData", "ODataActionParameters") or p.getType().getUnboundDeclaration().hasFullyQualifiedName("Microsoft.AspNet.OData", "Delta`1") + or + p.getType().getUnboundDeclaration().hasFullyQualifiedName("System.Web.Http.OData", "Delta`1") ) } diff --git a/csharp/ql/test/library-tests/frameworks/OData/options b/csharp/ql/test/library-tests/frameworks/OData/options index 357763232dbe..e9ba768d29a7 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/options +++ b/csharp/ql/test/library-tests/frameworks/OData/options @@ -1,2 +1,3 @@ semmle-extractor-options: /nostdlib /noconfig semmle-extractor-options: --load-sources-from-project:${testdir}/../../../resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.csproj +semmle-extractor-options: ${testdir}/../../../resources/stubs/System.Web.Http.OData.cs diff --git a/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.cs b/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.cs index 2f6673628748..da46281cf2d1 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.cs +++ b/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.cs @@ -1,5 +1,3 @@ -// This file contains auto-generated code. -// Generated from `Microsoft.AspNet.OData, Version=7.7.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35`. namespace Microsoft.AspNet.OData { public class ODataActionParameters : System.Collections.Generic.Dictionary @@ -11,9 +9,9 @@ public class Delta where TStructuralType : class { public Delta() => throw null; public TStructuralType GetInstance() => throw null; - public void Patch(TStructuralType original) => throw null; + public TStructuralType Patch(TStructuralType original) => throw null; public void Put(TStructuralType original) => throw null; - public void CopyChangedValues(TStructuralType original) => throw null; + public TStructuralType CopyChangedValues(TStructuralType original) => throw null; public void CopyUnchangedValues(TStructuralType original) => throw null; } } diff --git a/csharp/ql/test/resources/stubs/System.Web.Http.OData.cs b/csharp/ql/test/resources/stubs/System.Web.Http.OData.cs new file mode 100644 index 000000000000..e4b9775379c7 --- /dev/null +++ b/csharp/ql/test/resources/stubs/System.Web.Http.OData.cs @@ -0,0 +1,15 @@ +namespace System.Web.Http.OData +{ + public class ODataActionParameters : System.Collections.Generic.Dictionary + { + } + + public class Delta where TEntityType : class + { + public TEntityType GetEntity() => throw null; + public void Patch(TEntityType original) { } + public void Put(TEntityType original) { } + public void CopyChangedValues(TEntityType original) { } + public void CopyUnchangedValues(TEntityType original) { } + } +} From 7d9ae21aae92a8e47ad78f3db878f4ae5464a279 Mon Sep 17 00:00:00 2001 From: Alex Ausch Date: Tue, 25 Aug 2026 16:32:01 +0200 Subject: [PATCH 0525/2098] Python: test the Python 2 except reading through extraction, not a unit test Replaces `tests/test_except_clause.py` with an extractor test, as suggested in review. `python/ql/test/2/extractor-tests/relaxed_except` extracts a Python 2 file with `--lang=2` and pins, per handler, the types and whether the bound name is a definition -- so it asserts the consequence a query sees, not the shape of the AST. Removing the version gate from `visit_except_clause` makes it fail. Doing it that way needed one extractor fix first. `populator.main` honours `--lang` by calling `update_analysis_version`, but that only rebinds a global in the process that parses the options; the extraction itself runs in an `ExtractorPool`, and on macOS those workers are spawned rather than forked, so they re-read `CODEQL_EXTRACTOR_PYTHON_ANALYSIS_VERSION` from the environment and saw the default of 3. `--lang=2` therefore meant Python 2 on Linux and Python 3 on macOS. Setting the variable as well as the global makes the flag mean the same thing on both, which is what lets the new test pin the Python 2 reading anywhere. Real Python 2 extraction was never affected: the CodeQL action sets that variable itself, and children inherit it. Bumps the extractor version, which the fix in the first commit should have done. Verified with codeql 2.26.3 and this branch's extractor patched into it: `python/ql/test/2/extractor-tests` 10 passed (`hidden` fails identically on the unpatched extractor, so it is not from this branch), and the py3 side is unchanged -- `python/ql/test/query-tests/Imports` all 17 passed, which also confirms the `relaxed_except*.py` query tests added earlier. Co-Authored-By: Claude Opus 5 (1M context) --- python/extractor/semmle/populator.py | 5 ++ python/extractor/semmle/util.py | 2 +- python/extractor/tests/test_except_clause.py | 71 ------------------- .../2/extractor-tests/relaxed_except/options | 1 + .../relaxed_except/relaxed_except.expected | 3 + .../relaxed_except/relaxed_except.ql | 26 +++++++ .../2/extractor-tests/relaxed_except/test.py | 19 +++++ 7 files changed, 55 insertions(+), 72 deletions(-) delete mode 100644 python/extractor/tests/test_except_clause.py create mode 100644 python/ql/test/2/extractor-tests/relaxed_except/options create mode 100644 python/ql/test/2/extractor-tests/relaxed_except/relaxed_except.expected create mode 100644 python/ql/test/2/extractor-tests/relaxed_except/relaxed_except.ql create mode 100644 python/ql/test/2/extractor-tests/relaxed_except/test.py diff --git a/python/extractor/semmle/populator.py b/python/extractor/semmle/populator.py index a1be196ffaf6..603a7e2ddaca 100644 --- a/python/extractor/semmle/populator.py +++ b/python/extractor/semmle/populator.py @@ -65,6 +65,11 @@ def main(sys_path = sys.path[:]): if options.language_version: last_version = options.language_version[-1] update_analysis_version(last_version) + # Worker processes are spawned rather than forked on macOS, so they do + # not inherit the value set above; they re-read it from the environment + # as this module did on import. Set it there too, or `--lang` would take + # effect in this process only, and on one platform only. + os.environ["CODEQL_EXTRACTOR_PYTHON_ANALYSIS_VERSION"] = last_version found_py2 = False if get_analysis_major_version() == 2 and options.extract_stdlib: diff --git a/python/extractor/semmle/util.py b/python/extractor/semmle/util.py index 00651ace8314..977d47c69dca 100644 --- a/python/extractor/semmle/util.py +++ b/python/extractor/semmle/util.py @@ -10,7 +10,7 @@ #Semantic version of extractor. #Update this if any changes are made -VERSION = "7.1.8" +VERSION = "7.1.9" PY_EXTENSIONS = ".py", ".pyw" diff --git a/python/extractor/tests/test_except_clause.py b/python/extractor/tests/test_except_clause.py deleted file mode 100644 index d09ae382b9dd..000000000000 --- a/python/extractor/tests/test_except_clause.py +++ /dev/null @@ -1,71 +0,0 @@ -import unittest -from contextlib import contextmanager - -from semmle import util -from semmle.python import ast -from semmle.python import parser -from semmle.python.parser.dump_ast import StdoutLogger -from semmle.python.parser.tokenizer import Tokenizer - - -@contextmanager -def analysis_version(version): - 'Extract as if `CODEQL_EXTRACTOR_PYTHON_ANALYSIS_VERSION` were `version`.' - previous = util.get_analysis_version() - util.update_analysis_version(version) - try: - yield - finally: - util.update_analysis_version(previous) - - -class ExceptClauseTest(unittest.TestCase): - '''`except_clause: 'except' [test [(',' | 'as') test]]` is one grammar rule - covering two incompatible readings of `except A, B:` -- a Python 2 alias - binding and a PEP 758 tuple of exception types. Which one the default parser - picks depends on the version being extracted, so these tests pin both. - ''' - - def handler(self, source): - 'The first `except` handler of the first statement of `source`.' - with StdoutLogger() as logger: - module = parser.parse(Tokenizer(source).tokens(), logger) - return module.body[0].handlers[0] - - def test_comma_is_a_tuple_of_types_in_python_3(self): - with analysis_version("3.11"): - handler = self.handler("try:\n a\nexcept b, c:\n d\n") - self.assertIsNone(handler.name) - self.assertIsInstance(handler.type, ast.Tuple) - self.assertIsInstance(handler.type.ctx, ast.Load) - self.assertEqual(["b", "c"], [elt.id for elt in handler.type.elts]) - for elt in handler.type.elts: - self.assertIsInstance(elt.ctx, ast.Load) - - def test_comma_is_an_alias_binding_in_python_2(self): - with analysis_version("2.7.18"): - handler = self.handler("try:\n a\nexcept b, c:\n d\n") - self.assertIsInstance(handler.type, ast.Name) - self.assertEqual("b", handler.type.id) - self.assertIsInstance(handler.type.ctx, ast.Load) - self.assertIsInstance(handler.name, ast.Name) - self.assertEqual("c", handler.name.id) - self.assertIsInstance(handler.name.ctx, ast.Store) - - def test_as_is_an_alias_binding_in_both_versions(self): - for version in ("3.11", "2.7.18"): - with analysis_version(version): - handler = self.handler("try:\n a\nexcept b as c:\n d\n") - self.assertIsInstance(handler.type, ast.Name, version) - self.assertEqual("b", handler.type.id, version) - self.assertIsInstance(handler.name, ast.Name, version) - self.assertEqual("c", handler.name.id, version) - self.assertIsInstance(handler.name.ctx, ast.Store, version) - - def test_parenthesised_types_bind_no_alias_in_either_version(self): - for version in ("3.11", "2.7.18"): - with analysis_version(version): - handler = self.handler("try:\n a\nexcept (b, c):\n d\n") - self.assertIsNone(handler.name, version) - self.assertIsInstance(handler.type, ast.Tuple, version) - self.assertEqual(["b", "c"], [elt.id for elt in handler.type.elts], version) diff --git a/python/ql/test/2/extractor-tests/relaxed_except/options b/python/ql/test/2/extractor-tests/relaxed_except/options new file mode 100644 index 000000000000..b61a8c65a925 --- /dev/null +++ b/python/ql/test/2/extractor-tests/relaxed_except/options @@ -0,0 +1 @@ +semmle-extractor-options: --lang=2 diff --git a/python/ql/test/2/extractor-tests/relaxed_except/relaxed_except.expected b/python/ql/test/2/extractor-tests/relaxed_except/relaxed_except.expected new file mode 100644 index 000000000000..06aeec986903 --- /dev/null +++ b/python/ql/test/2/extractor-tests/relaxed_except/relaxed_except.expected @@ -0,0 +1,3 @@ +| 6 | ValueError | err (definition) | +| 12 | ValueError | other (definition) | +| 18 | ValueError, TypeError | none | diff --git a/python/ql/test/2/extractor-tests/relaxed_except/relaxed_except.ql b/python/ql/test/2/extractor-tests/relaxed_except/relaxed_except.ql new file mode 100644 index 000000000000..55369e89f836 --- /dev/null +++ b/python/ql/test/2/extractor-tests/relaxed_except/relaxed_except.ql @@ -0,0 +1,26 @@ +/** + * The types of each `except` clause, and the name it binds. In Python 2 the + * comma form binds a name and has a single type; reading it as a PEP 758 tuple + * instead would give two types and no name. + */ + +import python + +from ExceptStmt handler, string types, string name +where + types = + concat(Expr type | + type = handler.getType() + | + type.toString(), ", " order by type.getLocation().getStartColumn() + ) and + ( + exists(Name bound | bound = handler.getName() | + bound.isDefinition() and name = bound.getId() + " (definition)" + or + not bound.isDefinition() and name = bound.getId() + " (use)" + ) + or + not exists(handler.getName()) and name = "none" + ) +select handler.getLocation().getStartLine(), types, name diff --git a/python/ql/test/2/extractor-tests/relaxed_except/test.py b/python/ql/test/2/extractor-tests/relaxed_except/test.py new file mode 100644 index 000000000000..f1fbade32f99 --- /dev/null +++ b/python/ql/test/2/extractor-tests/relaxed_except/test.py @@ -0,0 +1,19 @@ +# When extracting Python 2, `except A, e:` binds `e`. It is not a PEP 758 +# unparenthesized tuple of exception types, which is what the same syntax means +# from Python 3.14 on. +try: + unlikely() +except ValueError, err: + print err + +# `as` means the same thing in every version. +try: + unlikely() +except ValueError as other: + print other + +# A parenthesized tuple is several types, and binds nothing. +try: + unlikely() +except (ValueError, TypeError): + pass From e9ab160bfb49dd22b3812dce265df67fcf8eccbb Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 25 Aug 2026 16:21:41 +0100 Subject: [PATCH 0526/2098] Rust: Add a test case for rust/hard-coded-cryptographic-value. --- .../HardcodedCryptographicValue.expected | 73 ++++++++++++------- .../security/CWE-798/test_cookie.rs | 10 ++- 2 files changed, 54 insertions(+), 29 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index 3290d7bca875..5440e3f565a4 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -8,8 +8,11 @@ | test_cipher.rs:73:19:73:26 | [0u8; 32] | test_cipher.rs:73:19:73:26 | [0u8; 32] | test_cipher.rs:74:46:74:51 | const2 | This hard-coded value is used as $@. | test_cipher.rs:74:46:74:51 | const2 | a key | | test_cookie.rs:17:28:17:34 | [0; 64] | test_cookie.rs:17:28:17:34 | [0; 64] | test_cookie.rs:18:26:18:32 | &array1 | This hard-coded value is used as $@. | test_cookie.rs:18:26:18:32 | &array1 | a key | | test_cookie.rs:21:28:21:34 | [0; 64] | test_cookie.rs:21:28:21:34 | [0; 64] | test_cookie.rs:22:26:22:32 | &array2 | This hard-coded value is used as $@. | test_cookie.rs:22:26:22:32 | &array2 | a key | -| test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:42:34:42:39 | array2 | This hard-coded value is used as $@. | test_cookie.rs:42:34:42:39 | array2 | a key | -| test_cookie.rs:49:23:49:25 | 0u8 | test_cookie.rs:49:23:49:25 | 0u8 | test_cookie.rs:53:34:53:39 | array3 | This hard-coded value is used as $@. | test_cookie.rs:53:34:53:39 | array3 | a key | +| test_cookie.rs:26:14:26:18 | "one" | test_cookie.rs:26:14:26:18 | "one" | test_cookie.rs:30:26:30:40 | str3.as_bytes() | This hard-coded value is used as $@. | test_cookie.rs:30:26:30:40 | str3.as_bytes() | a key | +| test_cookie.rs:27:14:27:18 | "two" | test_cookie.rs:27:14:27:18 | "two" | test_cookie.rs:30:26:30:40 | str3.as_bytes() | This hard-coded value is used as $@. | test_cookie.rs:30:26:30:40 | str3.as_bytes() | a key | +| test_cookie.rs:28:14:28:19 | "many" | test_cookie.rs:28:14:28:19 | "many" | test_cookie.rs:30:26:30:40 | str3.as_bytes() | This hard-coded value is used as $@. | test_cookie.rs:30:26:30:40 | str3.as_bytes() | a key | +| test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:50:34:50:39 | array2 | This hard-coded value is used as $@. | test_cookie.rs:50:34:50:39 | array2 | a key | +| test_cookie.rs:57:23:57:25 | 0u8 | test_cookie.rs:57:23:57:25 | 0u8 | test_cookie.rs:61:34:61:39 | array3 | This hard-coded value is used as $@. | test_cookie.rs:61:34:61:39 | array3 | a key | | test_heuristic.rs:38:25:38:30 | 0xFFFF | test_heuristic.rs:38:25:38:30 | 0xFFFF | test_heuristic.rs:81:22:81:31 | MY_CONST_1 | This hard-coded value is used as $@. | test_heuristic.rs:81:22:81:31 | MY_CONST_1 | a salt | | test_heuristic.rs:39:25:39:59 | ... as u64 | test_heuristic.rs:39:25:39:59 | ... as u64 | test_heuristic.rs:82:22:82:31 | MY_CONST_2 | This hard-coded value is used as $@. | test_heuristic.rs:82:22:82:31 | MY_CONST_2 | a salt | | test_heuristic.rs:40:27:40:32 | 0xFFFF | test_heuristic.rs:40:27:40:32 | 0xFFFF | test_heuristic.rs:83:22:83:32 | MY_STATIC_3 | This hard-coded value is used as $@. | test_heuristic.rs:83:22:83:32 | MY_STATIC_3 | a salt | @@ -28,31 +31,31 @@ edges | test_cipher.rs:18:28:18:36 | &... [&ref] | test_cipher.rs:18:9:18:14 | const1 [&ref] | provenance | | | test_cipher.rs:18:29:18:36 | [0u8; 16] | test_cipher.rs:18:28:18:36 | &... [&ref] | provenance | | | test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref] | test_cipher.rs:19:49:19:79 | ...::from_slice(...) | provenance | Sink:MaD:2 | -| test_cipher.rs:19:73:19:78 | const1 [&ref] | test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref] | provenance | MaD:13 | +| test_cipher.rs:19:73:19:78 | const1 [&ref] | test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref] | provenance | MaD:14 | | test_cipher.rs:25:9:25:14 | const4 [&ref] | test_cipher.rs:26:66:26:71 | const4 [&ref] | provenance | | | test_cipher.rs:25:28:25:36 | &... [&ref] | test_cipher.rs:25:9:25:14 | const4 [&ref] | provenance | | | test_cipher.rs:25:29:25:36 | [0u8; 16] | test_cipher.rs:25:28:25:36 | &... [&ref] | provenance | | | test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref] | test_cipher.rs:26:42:26:72 | ...::from_slice(...) | provenance | Sink:MaD:3 | -| test_cipher.rs:26:66:26:71 | const4 [&ref] | test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref] | provenance | MaD:13 | +| test_cipher.rs:26:66:26:71 | const4 [&ref] | test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref] | provenance | MaD:14 | | test_cipher.rs:29:9:29:14 | const5 [&ref] | test_cipher.rs:30:95:30:100 | const5 [&ref] | provenance | | | test_cipher.rs:29:28:29:36 | &... [&ref] | test_cipher.rs:29:9:29:14 | const5 [&ref] | provenance | | | test_cipher.rs:29:29:29:36 | [0u8; 16] | test_cipher.rs:29:28:29:36 | &... [&ref] | provenance | | | test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref] | test_cipher.rs:30:72:30:101 | ...::from_slice(...) | provenance | Sink:MaD:4 | -| test_cipher.rs:30:95:30:100 | const5 [&ref] | test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref] | provenance | MaD:13 | +| test_cipher.rs:30:95:30:100 | const5 [&ref] | test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref] | provenance | MaD:14 | | test_cipher.rs:37:9:37:14 | const7 | test_cipher.rs:38:74:38:79 | const7 | provenance | | | test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:37:9:37:14 | const7 | provenance | | | test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) | provenance | Sink:MaD:2 | -| test_cipher.rs:38:73:38:79 | &const7 [&ref] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | provenance | MaD:13 | +| test_cipher.rs:38:73:38:79 | &const7 [&ref] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | provenance | MaD:14 | | test_cipher.rs:38:74:38:79 | const7 | test_cipher.rs:38:73:38:79 | &const7 [&ref] | provenance | | | test_cipher.rs:41:9:41:14 | const8 [&ref] | test_cipher.rs:42:73:42:78 | const8 [&ref] | provenance | | | test_cipher.rs:41:28:41:76 | &... [&ref] | test_cipher.rs:41:9:41:14 | const8 [&ref] | provenance | | | test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:41:28:41:76 | &... [&ref] | provenance | | | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) | provenance | Sink:MaD:2 | -| test_cipher.rs:42:73:42:78 | const8 [&ref] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | provenance | MaD:13 | +| test_cipher.rs:42:73:42:78 | const8 [&ref] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | provenance | MaD:14 | | test_cipher.rs:50:9:50:15 | const10 [element] | test_cipher.rs:51:75:51:81 | const10 [element] | provenance | | | test_cipher.rs:50:37:50:54 | ...::zeroed(...) | test_cipher.rs:50:9:50:15 | const10 [element] | provenance | Src:MaD:7 | | test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | test_cipher.rs:51:50:51:82 | ...::from_slice(...) | provenance | Sink:MaD:2 Sink:MaD:2 | -| test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | provenance | MaD:13 | +| test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | provenance | MaD:14 | | test_cipher.rs:51:75:51:81 | const10 [element] | test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | provenance | | | test_cipher.rs:73:9:73:14 | const2 [&ref] | test_cipher.rs:74:46:74:51 | const2 | provenance | Sink:MaD:6 | | test_cipher.rs:73:18:73:26 | &... [&ref] | test_cipher.rs:73:9:73:14 | const2 [&ref] | provenance | | @@ -65,16 +68,22 @@ edges | test_cookie.rs:21:28:21:34 | [0; 64] | test_cookie.rs:21:9:21:14 | array2 | provenance | | | test_cookie.rs:22:26:22:32 | &array2 [&ref] | test_cookie.rs:22:26:22:32 | &array2 | provenance | Sink:MaD:5 | | test_cookie.rs:22:27:22:32 | array2 | test_cookie.rs:22:26:22:32 | &array2 [&ref] | provenance | | -| test_cookie.rs:38:9:38:14 | array2 | test_cookie.rs:42:34:42:39 | array2 | provenance | Sink:MaD:1 | -| test_cookie.rs:38:18:38:37 | ...::from(...) | test_cookie.rs:38:9:38:14 | array2 | provenance | | -| test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:38:18:38:37 | ...::from(...) | provenance | MaD:8 | -| test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:38:18:38:37 | ...::from(...) | provenance | MaD:9 | -| test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:38:18:38:37 | ...::from(...) | provenance | MaD:10 | -| test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:38:18:38:37 | ...::from(...) | provenance | MaD:11 | -| test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:38:18:38:37 | ...::from(...) | provenance | MaD:12 | -| test_cookie.rs:49:9:49:14 | array3 [element] | test_cookie.rs:53:34:53:39 | array3 | provenance | Sink:MaD:1 | -| test_cookie.rs:49:23:49:25 | 0u8 | test_cookie.rs:49:23:49:29 | ...::from_elem(...) [element] | provenance | MaD:14 | -| test_cookie.rs:49:23:49:29 | ...::from_elem(...) [element] | test_cookie.rs:49:9:49:14 | array3 [element] | provenance | | +| test_cookie.rs:25:9:25:12 | str3 | test_cookie.rs:30:26:30:29 | str3 | provenance | | +| test_cookie.rs:26:14:26:18 | "one" | test_cookie.rs:25:9:25:12 | str3 | provenance | | +| test_cookie.rs:27:14:27:18 | "two" | test_cookie.rs:25:9:25:12 | str3 | provenance | | +| test_cookie.rs:28:14:28:19 | "many" | test_cookie.rs:25:9:25:12 | str3 | provenance | | +| test_cookie.rs:30:26:30:29 | str3 | test_cookie.rs:30:26:30:40 | str3.as_bytes() [&ref] | provenance | MaD:13 | +| test_cookie.rs:30:26:30:40 | str3.as_bytes() [&ref] | test_cookie.rs:30:26:30:40 | str3.as_bytes() | provenance | Sink:MaD:5 | +| test_cookie.rs:46:9:46:14 | array2 | test_cookie.rs:50:34:50:39 | array2 | provenance | Sink:MaD:1 | +| test_cookie.rs:46:18:46:37 | ...::from(...) | test_cookie.rs:46:9:46:14 | array2 | provenance | | +| test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:46:18:46:37 | ...::from(...) | provenance | MaD:8 | +| test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:46:18:46:37 | ...::from(...) | provenance | MaD:9 | +| test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:46:18:46:37 | ...::from(...) | provenance | MaD:10 | +| test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:46:18:46:37 | ...::from(...) | provenance | MaD:11 | +| test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:46:18:46:37 | ...::from(...) | provenance | MaD:12 | +| test_cookie.rs:57:9:57:14 | array3 [element] | test_cookie.rs:61:34:61:39 | array3 | provenance | Sink:MaD:1 | +| test_cookie.rs:57:23:57:25 | 0u8 | test_cookie.rs:57:23:57:29 | ...::from_elem(...) [element] | provenance | MaD:15 | +| test_cookie.rs:57:23:57:29 | ...::from_elem(...) [element] | test_cookie.rs:57:9:57:14 | array3 [element] | provenance | | | test_heuristic.rs:38:25:38:30 | 0xFFFF | test_heuristic.rs:81:22:81:31 | MY_CONST_1 | provenance | | | test_heuristic.rs:39:25:39:59 | ... as u64 | test_heuristic.rs:82:22:82:31 | MY_CONST_2 | provenance | | | test_heuristic.rs:39:62:40:33 | static MY_STATIC_3 | test_heuristic.rs:83:22:83:32 | MY_STATIC_3 | provenance | | @@ -99,8 +108,9 @@ models | 10 | Summary: ::from; Argument[0].Field[alloc::collections::binary_heap::BinaryHeap::data]; ReturnValue; value | | 11 | Summary: ::from; Argument[0].Field[alloc::string::String::vec]; ReturnValue; value | | 12 | Summary: ::from; Argument[0]; ReturnValue; taint | -| 13 | Summary: ::from_slice; Argument[0].Reference; ReturnValue.Reference; value | -| 14 | Summary: alloc::vec::from_elem; Argument[0]; ReturnValue.Element; value | +| 13 | Summary: ::as_bytes; Argument[self].Reference; ReturnValue.Reference; taint | +| 14 | Summary: ::from_slice; Argument[0].Reference; ReturnValue.Reference; value | +| 15 | Summary: alloc::vec::from_elem; Argument[0]; ReturnValue.Element; value | nodes | test_cipher.rs:18:9:18:14 | const1 [&ref] | semmle.label | const1 [&ref] | | test_cipher.rs:18:28:18:36 | &... [&ref] | semmle.label | &... [&ref] | @@ -152,14 +162,21 @@ nodes | test_cookie.rs:22:26:22:32 | &array2 | semmle.label | &array2 | | test_cookie.rs:22:26:22:32 | &array2 [&ref] | semmle.label | &array2 [&ref] | | test_cookie.rs:22:27:22:32 | array2 | semmle.label | array2 | -| test_cookie.rs:38:9:38:14 | array2 | semmle.label | array2 | -| test_cookie.rs:38:18:38:37 | ...::from(...) | semmle.label | ...::from(...) | -| test_cookie.rs:38:28:38:36 | [0u8; 64] | semmle.label | [0u8; 64] | -| test_cookie.rs:42:34:42:39 | array2 | semmle.label | array2 | -| test_cookie.rs:49:9:49:14 | array3 [element] | semmle.label | array3 [element] | -| test_cookie.rs:49:23:49:25 | 0u8 | semmle.label | 0u8 | -| test_cookie.rs:49:23:49:29 | ...::from_elem(...) [element] | semmle.label | ...::from_elem(...) [element] | -| test_cookie.rs:53:34:53:39 | array3 | semmle.label | array3 | +| test_cookie.rs:25:9:25:12 | str3 | semmle.label | str3 | +| test_cookie.rs:26:14:26:18 | "one" | semmle.label | "one" | +| test_cookie.rs:27:14:27:18 | "two" | semmle.label | "two" | +| test_cookie.rs:28:14:28:19 | "many" | semmle.label | "many" | +| test_cookie.rs:30:26:30:29 | str3 | semmle.label | str3 | +| test_cookie.rs:30:26:30:40 | str3.as_bytes() | semmle.label | str3.as_bytes() | +| test_cookie.rs:30:26:30:40 | str3.as_bytes() [&ref] | semmle.label | str3.as_bytes() [&ref] | +| test_cookie.rs:46:9:46:14 | array2 | semmle.label | array2 | +| test_cookie.rs:46:18:46:37 | ...::from(...) | semmle.label | ...::from(...) | +| test_cookie.rs:46:28:46:36 | [0u8; 64] | semmle.label | [0u8; 64] | +| test_cookie.rs:50:34:50:39 | array2 | semmle.label | array2 | +| test_cookie.rs:57:9:57:14 | array3 [element] | semmle.label | array3 [element] | +| test_cookie.rs:57:23:57:25 | 0u8 | semmle.label | 0u8 | +| test_cookie.rs:57:23:57:29 | ...::from_elem(...) [element] | semmle.label | ...::from_elem(...) [element] | +| test_cookie.rs:61:34:61:39 | array3 | semmle.label | array3 | | test_heuristic.rs:38:25:38:30 | 0xFFFF | semmle.label | 0xFFFF | | test_heuristic.rs:39:25:39:59 | ... as u64 | semmle.label | ... as u64 | | test_heuristic.rs:39:62:40:33 | static MY_STATIC_3 | semmle.label | static MY_STATIC_3 | diff --git a/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs b/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs index 10852583c678..5eeb8da8b5df 100644 --- a/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs +++ b/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs @@ -3,7 +3,7 @@ use cookie::{CookieJar, SignedJar, PrivateJar, Key}; // --- tests --- -fn test_cookie_jar(array_var: &[u8]) { +fn test_cookie_jar(array_var: &[u8], val: u64) { let mut jar = CookieJar::new(); let key_generate = Key::generate(); // good @@ -21,6 +21,14 @@ fn test_cookie_jar(array_var: &[u8]) { let array2: [u8; 64] = [0; 64]; // $ Alert[rust/hard-coded-cryptographic-value] let key2 = Key::from(&array2); // $ Sink _ = jar.private_mut(&key2); + + let str3 = match(val) { + 0 => "one", // $ Alert[rust/hard-coded-cryptographic-value] + 1 => "two", // $ Alert[rust/hard-coded-cryptographic-value] + _ => "many" // $ Alert[rust/hard-coded-cryptographic-value] + }; + let key3 = Key::from(str3.as_bytes()); // $ Sink + _ = jar.signed_mut(&key3); } fn test_biscotti_crypto(array_var: &[u8]) { From 73c442755c832e741986081067f5a5775c6dff85 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 25 Aug 2026 16:09:03 +0100 Subject: [PATCH 0527/2098] Rust: Fix near duplicate results. --- .../HardcodedCryptographicValueExtensions.qll | 5 +++++ .../CWE-798/HardcodedCryptographicValue.expected | 12 +++--------- .../test/query-tests/security/CWE-798/test_cookie.rs | 8 ++++---- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll index ea57d9427338..768f684cea5b 100644 --- a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll @@ -71,6 +71,11 @@ module HardcodedCryptographicValue { or isConstant(e.(ArrayRepeatExpr).getRepeatOperand()) // e.g. `[0; 10]` or + // a match expression with one or more constant arms; taint would reach here + // anyway, but we make it a source to avoid reporting many similar results + // on each match arm. + isConstant(e.(MatchExpr).getMatchArmList().getAnArm().getExpr()) + or // e.g. `const MY_CONST: u64 = ...` // the constant initializer / body is the preferred source location for flow paths, when available. e = any(Const c).getBody() diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index 5440e3f565a4..d77634d1fd9e 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -8,9 +8,7 @@ | test_cipher.rs:73:19:73:26 | [0u8; 32] | test_cipher.rs:73:19:73:26 | [0u8; 32] | test_cipher.rs:74:46:74:51 | const2 | This hard-coded value is used as $@. | test_cipher.rs:74:46:74:51 | const2 | a key | | test_cookie.rs:17:28:17:34 | [0; 64] | test_cookie.rs:17:28:17:34 | [0; 64] | test_cookie.rs:18:26:18:32 | &array1 | This hard-coded value is used as $@. | test_cookie.rs:18:26:18:32 | &array1 | a key | | test_cookie.rs:21:28:21:34 | [0; 64] | test_cookie.rs:21:28:21:34 | [0; 64] | test_cookie.rs:22:26:22:32 | &array2 | This hard-coded value is used as $@. | test_cookie.rs:22:26:22:32 | &array2 | a key | -| test_cookie.rs:26:14:26:18 | "one" | test_cookie.rs:26:14:26:18 | "one" | test_cookie.rs:30:26:30:40 | str3.as_bytes() | This hard-coded value is used as $@. | test_cookie.rs:30:26:30:40 | str3.as_bytes() | a key | -| test_cookie.rs:27:14:27:18 | "two" | test_cookie.rs:27:14:27:18 | "two" | test_cookie.rs:30:26:30:40 | str3.as_bytes() | This hard-coded value is used as $@. | test_cookie.rs:30:26:30:40 | str3.as_bytes() | a key | -| test_cookie.rs:28:14:28:19 | "many" | test_cookie.rs:28:14:28:19 | "many" | test_cookie.rs:30:26:30:40 | str3.as_bytes() | This hard-coded value is used as $@. | test_cookie.rs:30:26:30:40 | str3.as_bytes() | a key | +| test_cookie.rs:25:16:29:5 | match ... { ... } | test_cookie.rs:25:16:29:5 | match ... { ... } | test_cookie.rs:30:26:30:40 | str3.as_bytes() | This hard-coded value is used as $@. | test_cookie.rs:30:26:30:40 | str3.as_bytes() | a key | | test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:50:34:50:39 | array2 | This hard-coded value is used as $@. | test_cookie.rs:50:34:50:39 | array2 | a key | | test_cookie.rs:57:23:57:25 | 0u8 | test_cookie.rs:57:23:57:25 | 0u8 | test_cookie.rs:61:34:61:39 | array3 | This hard-coded value is used as $@. | test_cookie.rs:61:34:61:39 | array3 | a key | | test_heuristic.rs:38:25:38:30 | 0xFFFF | test_heuristic.rs:38:25:38:30 | 0xFFFF | test_heuristic.rs:81:22:81:31 | MY_CONST_1 | This hard-coded value is used as $@. | test_heuristic.rs:81:22:81:31 | MY_CONST_1 | a salt | @@ -69,9 +67,7 @@ edges | test_cookie.rs:22:26:22:32 | &array2 [&ref] | test_cookie.rs:22:26:22:32 | &array2 | provenance | Sink:MaD:5 | | test_cookie.rs:22:27:22:32 | array2 | test_cookie.rs:22:26:22:32 | &array2 [&ref] | provenance | | | test_cookie.rs:25:9:25:12 | str3 | test_cookie.rs:30:26:30:29 | str3 | provenance | | -| test_cookie.rs:26:14:26:18 | "one" | test_cookie.rs:25:9:25:12 | str3 | provenance | | -| test_cookie.rs:27:14:27:18 | "two" | test_cookie.rs:25:9:25:12 | str3 | provenance | | -| test_cookie.rs:28:14:28:19 | "many" | test_cookie.rs:25:9:25:12 | str3 | provenance | | +| test_cookie.rs:25:16:29:5 | match ... { ... } | test_cookie.rs:25:9:25:12 | str3 | provenance | | | test_cookie.rs:30:26:30:29 | str3 | test_cookie.rs:30:26:30:40 | str3.as_bytes() [&ref] | provenance | MaD:13 | | test_cookie.rs:30:26:30:40 | str3.as_bytes() [&ref] | test_cookie.rs:30:26:30:40 | str3.as_bytes() | provenance | Sink:MaD:5 | | test_cookie.rs:46:9:46:14 | array2 | test_cookie.rs:50:34:50:39 | array2 | provenance | Sink:MaD:1 | @@ -163,9 +159,7 @@ nodes | test_cookie.rs:22:26:22:32 | &array2 [&ref] | semmle.label | &array2 [&ref] | | test_cookie.rs:22:27:22:32 | array2 | semmle.label | array2 | | test_cookie.rs:25:9:25:12 | str3 | semmle.label | str3 | -| test_cookie.rs:26:14:26:18 | "one" | semmle.label | "one" | -| test_cookie.rs:27:14:27:18 | "two" | semmle.label | "two" | -| test_cookie.rs:28:14:28:19 | "many" | semmle.label | "many" | +| test_cookie.rs:25:16:29:5 | match ... { ... } | semmle.label | match ... { ... } | | test_cookie.rs:30:26:30:29 | str3 | semmle.label | str3 | | test_cookie.rs:30:26:30:40 | str3.as_bytes() | semmle.label | str3.as_bytes() | | test_cookie.rs:30:26:30:40 | str3.as_bytes() [&ref] | semmle.label | str3.as_bytes() [&ref] | diff --git a/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs b/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs index 5eeb8da8b5df..410ddf1b8aaa 100644 --- a/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs +++ b/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs @@ -23,10 +23,10 @@ fn test_cookie_jar(array_var: &[u8], val: u64) { _ = jar.private_mut(&key2); let str3 = match(val) { - 0 => "one", // $ Alert[rust/hard-coded-cryptographic-value] - 1 => "two", // $ Alert[rust/hard-coded-cryptographic-value] - _ => "many" // $ Alert[rust/hard-coded-cryptographic-value] - }; + 0 => "one", + 1 => "two", + _ => "many" + }; // $ Alert[rust/hard-coded-cryptographic-value] let key3 = Key::from(str3.as_bytes()); // $ Sink _ = jar.signed_mut(&key3); } From d15895c952d18b14f96e06503d881e38593e1d59 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 25 Aug 2026 17:27:21 +0100 Subject: [PATCH 0528/2098] Rust: Change note. --- .../2026-08-25-hardcoded-cryptographic-match-expressions.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 rust/ql/src/change-notes/2026-08-25-hardcoded-cryptographic-match-expressions.md diff --git a/rust/ql/src/change-notes/2026-08-25-hardcoded-cryptographic-match-expressions.md b/rust/ql/src/change-notes/2026-08-25-hardcoded-cryptographic-match-expressions.md new file mode 100644 index 000000000000..b2c71664f87a --- /dev/null +++ b/rust/ql/src/change-notes/2026-08-25-hardcoded-cryptographic-match-expressions.md @@ -0,0 +1,5 @@ +--- +category: minorAnalysis +--- +* The `rust/hard-coded-cryptographic-value` query has been adjusted to produce +fewer results in certain situations where many results were being produced with very similar source locations. From ff0f892a3d0b53aa5cc36c6a0d0c1472557f20f4 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 25 Aug 2026 17:48:58 +0100 Subject: [PATCH 0529/2098] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll index 402925117c56..e42e09b5d7c6 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll @@ -1477,7 +1477,7 @@ module Public { import Public -/** An static single assignment (SSA) definition. */ +/** A static single assignment (SSA) definition. */ class Definition extends SsaImpl::Definition { /** * Holds if this SSA definition is live at the end of basic block `bb`. From 8156dc2a2300e27c8f5d91d597f308ff92147e02 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Wed, 26 Aug 2026 09:58:36 +0200 Subject: [PATCH 0530/2098] CWE-770: correct GlobalAlloc sink MISSING comment The prior comment claimed the blanket impl methods have no canonical path. They now do (`<_ as ..::GlobalAlloc>::alloc`); the accurate reason is the type-parameter `Self`, so the path-keyed sink model misses them. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 890cb55d-0437-4bd7-9268-87b8897ada01 --- rust/ql/test/query-tests/security/CWE-770/main.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-770/main.rs b/rust/ql/test/query-tests/security/CWE-770/main.rs index df773adac6d0..bb3ba37860cc 100644 --- a/rust/ql/test/query-tests/security/CWE-770/main.rs +++ b/rust/ql/test/query-tests/security/CWE-770/main.rs @@ -190,8 +190,8 @@ unsafe fn test_system_alloc(v: usize) { let _ = std::alloc::Global.allocate_zeroed(l1).unwrap(); let l2 = std::alloc::Layout::array::(v).unwrap(); - // `GlobalAlloc` is a legacy trait, blanket-implemented for `GlobalAllocator` types, so these - // resolve to the blanket impl whose methods have no canonical path; the sink models miss them. + // These resolve to the blanket `impl GlobalAlloc for A` in `core`, so the target's canonical + // path has a type-parameter `Self` (`<_ as ..::GlobalAlloc>::alloc`); the sink model misses it. let _ = std::alloc::System.alloc(l2); // $ MISSING: Alert[rust/uncontrolled-allocation-size]=arg1 let _ = std::alloc::System.alloc_zeroed(l2); // $ MISSING: Alert[rust/uncontrolled-allocation-size]=arg1 let _ = std::alloc::System.allocate(l2).unwrap(); // $ Alert[rust/uncontrolled-allocation-size]=arg1 @@ -201,7 +201,7 @@ unsafe fn test_system_alloc(v: usize) { let l3 = std::alloc::Layout::array::(10).unwrap(); let m3 = std::alloc::System.alloc(l3); - // `System.realloc` resolves to that same `GlobalAlloc` blanket impl (see above); MISSING. + // `System.realloc` resolves to that same blanket `GlobalAlloc` impl (see above); MISSING. let _ = std::alloc::System.realloc(m3, l3, v); // $ MISSING: Alert[rust/uncontrolled-allocation-size]=arg1 let l4 = std::alloc::Layout::array::(10).unwrap(); From 94165df4f066ec428ec33d3e14a81c2532b26cfe Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 26 Aug 2026 12:29:40 +0200 Subject: [PATCH 0531/2098] Apply batched suggestions from code review Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll | 4 ++-- .../ql/lib/codeql/unified/internal/NameBindingPlugin.qll | 3 +-- .../ql/lib/codeql/unified/internal/StaticNameBinding.qll | 6 ++++-- .../static-name-binding/unqualified-access.swift | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll index f2a7acabf41f..60168bd98304 100644 --- a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll +++ b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll @@ -7,8 +7,8 @@ private import codeql.unified.internal.NameBindingPlugin /** Stats about identifiers that static name binding could resolve. */ module StaticNameResolutionStats implements EntityStatsSig { /** - * Holds if `name` has been positively identified as something that refer to a value, and static name binding - * is thus not expected to resolve its members. + * Holds if `name` has been positively identified as referring to a value, so static name binding + * is not expected to resolve its members. */ private predicate resolvesToValue(Identifier name) { exists(AstNode decl | diff --git a/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll b/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll index a3b4ce6f7ff8..4c8aa3e49e6c 100644 --- a/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll +++ b/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll @@ -29,8 +29,7 @@ class NameBindingPlugin extends Unit { /** * Holds if `member` can be inherited by subclasses of `cls`. * - * The caller has already restricted `member` to be a member of `cls`, and - * ensured that `member` is a `VariableDeclaration` or `FunctionDeclaration`. + * The caller has already restricted `member` to be a member of `cls`. */ bindingset[cls, member] predicate isInheritableMember(ClassLikeDeclaration cls, Member member) { none() } diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index b38d405b165d..e570b2ea4e55 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -64,6 +64,8 @@ class NameBindingNode extends TNameBindingNode { or this.isStaticMemberNamespace(result) or + this.isInstanceMemberNamespace(result) + or this.isLocalNamespace(result) or this.isModuleScopeNode(result) @@ -314,7 +316,7 @@ private predicate derivedStoreReadStep(NameBindingNode node1, NameBindingNode no ) } -/** Holds if the member represented by `node` cannot be inherited. */ +/** Holds if the member represented by `node` can be inherited. */ pragma[nomagic] private predicate isInheritableMemberNode(NameBindingNode node) { exists(NameDeclaration decl | @@ -563,7 +565,7 @@ private module FolderHeuristic { /** * Holds if `access` may resolve to `target` through the enclosing `accessingClass`. * - * `instanceAccess` indicates if this this member should be accessed as an instance of `accessingClass` + * `instanceAccess` indicates whether this member should be accessed as an instance of `accessingClass` * or as a static member. */ private predicate unqualifiedMemberAccessCand( diff --git a/unified/ql/test/library-tests/static-name-binding/unqualified-access.swift b/unified/ql/test/library-tests/static-name-binding/unqualified-access.swift index 434dd0dc8ac1..732e65563b3b 100644 --- a/unified/ql/test/library-tests/static-name-binding/unqualified-access.swift +++ b/unified/ql/test/library-tests/static-name-binding/unqualified-access.swift @@ -10,7 +10,7 @@ class ASub : A { // $ access=A class BSub : B { // $ access=A.B let x3: B = nil; // $ access=A.B - let x4: C = nil; // $ access=A.B.C // spurious result from folder-based heuristic + let x4: C = nil; // $ access=A.B.C } class BSub2 : B { // $ access=A.B From 7190c8c26fd2c8286094a3e2d5346389f7ab125e Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 26 Aug 2026 12:27:47 +0200 Subject: [PATCH 0532/2098] unified: Use getStaticBindingTarget in Candidate.getTarget --- unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll index 60168bd98304..d894e02e2c7e 100644 --- a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll +++ b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll @@ -49,10 +49,7 @@ module StaticNameResolutionStats implements EntityStatsSig { NameBindingNode getTarget() { ( - exists(NameDeclaration decl | - result.isIdentifier(decl) and - trackNameDeclaration(decl).isIdentifier(this) - ) + result.asIdentifier() = getStaticBindingTarget(this) or result.isModuleScopeNode(_) and result.(NamespaceNode).ref().isIdentifier(this) From 49600c17b752590c2bff7e01c8ee46afe8381c37 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Wed, 26 Aug 2026 12:54:41 +0100 Subject: [PATCH 0533/2098] C++: Add comments. --- .../code/cpp/ir/dataflow/internal/SsaImpl.qll | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll index e42e09b5d7c6..38fbf87a403b 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll @@ -1446,15 +1446,31 @@ module Public { not def instanceof PhiNode } + /** + * The `getAnUltimateDefinition` predicate uses an optimized step relation + * which is pruned to only those uncertain steps which lead back to a + * definition which satisfies `relevantUltimateDefinition`. This predicate + * computes the subset of `Definition`s which can lead back to definitions + * which satisfy `relevantUltimateDefinition`. + */ private predicate fwd(Definition def) { + // Base case: This definition is a relevant definition relevantUltimateDefinition(def) or exists(Definition def0 | + // Recursive case: `def0` is a relevant definition, and + // `def` is an uncertain step which takes us back to `def0`. fwd(def0) and def0 = getAPhiInputOrPriorDefinition(def) ) } + /** + * Holds if `def1 = getAPhiInputOrPriorDefinition(def2)`, and + * both `def1` and `def2` are part of a sequence of uncertain + * steps which lead back to a `Definition` which + * satisfies `relevantUltimateDefinition`. + */ private predicate step(Definition def1, Definition def2) { fwd(def1) and fwd(def2) and From 08f0b1652c2dfd133ac23f5e9f1fba59f2cfa87d Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 24 Aug 2026 14:19:07 +0200 Subject: [PATCH 0534/2098] C#: Use ProcessStartInfo.ArgumentList instead of Arguments to automatically handled escaping and quoting. --- .../DotNet.cs | 39 ++++++------- .../DotNetCliInvoker.cs | 19 +++--- .../FeedManager.cs | 24 +++----- .../IDotNet.cs | 4 +- .../IDotNetCliInvoker.cs | 8 +-- .../NugetPackageRestorer.cs | 16 ++--- .../PackagesConfigRestorer.cs | 12 ++-- .../DotnetSourceGeneratorWrapper.cs | 2 +- .../Semmle.Extraction.Tests/DotNet.cs | 58 +++++++++---------- .../Semmle.Extraction.Tests/Runtime.cs | 2 +- 10 files changed, 88 insertions(+), 96 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs index e02d157dc620..9fd3749ae340 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs @@ -49,7 +49,7 @@ private void Info() // Allow up to four attempts (with up to three retries) to run `dotnet --info`, to mitigate transient issues for (int attempt = 0; attempt < 4; attempt++) { - var exitCode = dotnetCliInvoker.RunCommandExitCode("--info", silent: false); + var exitCode = dotnetCliInvoker.RunCommandExitCode(["--info"], silent: false); switch (exitCode) { case 0: @@ -63,9 +63,9 @@ private void Info() } } - private string GetRestoreArgs(RestoreSettings restoreSettings) + private List GetRestoreArgs(RestoreSettings restoreSettings) { - var args = $"restore --no-dependencies \"{restoreSettings.File}\" --packages \"{restoreSettings.PackageDirectory}\" /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal"; + List args = ["restore", "--no-dependencies", restoreSettings.File, "--packages", restoreSettings.PackageDirectory, "/p:DisableImplicitNuGetFallbackFolder=true", "--verbosity", "normal"]; if (restoreSettings.ForceDotnetRefAssemblyFetching) { @@ -77,23 +77,20 @@ private string GetRestoreArgs(RestoreSettings restoreSettings) Directory.CreateDirectory(path); } - args += $" /p:TargetFrameworkRootPath=\"{path}\" /p:NetCoreTargetingPackRoot=\"{path}\" /p:AllowMissingPrunePackageData=true"; + args.AddRange([$"/p:TargetFrameworkRootPath={path}", $"/p:NetCoreTargetingPackRoot={path}", "/p:AllowMissingPrunePackageData=true"]); } if (restoreSettings.ForceReevaluation) { - args += " --force"; + args.Add("--force"); } if (restoreSettings.TargetWindows) { - args += " /p:EnableWindowsTargeting=true"; + args.Add("/p:EnableWindowsTargeting=true"); } - if (restoreSettings.NugetSources is not null) - { - args += $" {restoreSettings.NugetSources}"; - } + args.AddRange(restoreSettings.NugetSources); return args; } @@ -107,48 +104,48 @@ public RestoreResult Restore(RestoreSettings restoreSettings) public bool New(string folder) { - var args = $"new console --no-restore --output \"{folder}\""; + List args = ["new", "console", "--no-restore", "--output", folder]; return dotnetCliInvoker.RunCommand(args); } public bool AddPackage(string folder, string package) { - var args = $"add \"{folder}\" package \"{package}\" --no-restore"; + List args = ["add", folder, "package", package, "--no-restore"]; return dotnetCliInvoker.RunCommand(args); } - public IList GetListedRuntimes() => GetResultList("--list-runtimes"); + public IList GetListedRuntimes() => GetResultList(["--list-runtimes"]); - public IList GetListedSdks() => GetResultList("--list-sdks"); + public IList GetListedSdks() => GetResultList(["--list-sdks"]); - private IList GetResultList(string args, string? workingDirectory = null, bool silent = true) + private IList GetResultList(List args, string? workingDirectory = null, bool silent = true) { if (dotnetCliInvoker.RunCommand(args, workingDirectory, out var results, silent)) { return results; } - logger.LogWarning($"Running 'dotnet {args}' failed."); + logger.LogWarning($"Running 'dotnet {string.Join(" ", args)}' failed."); return []; } - public bool Exec(string execArgs) + public bool Exec(List execArgs) { - var args = $"exec {execArgs}"; + List args = ["exec", .. execArgs]; return dotnetCliInvoker.RunCommand(args); } - private const string nugetListSourceCommand = "nuget list source --format Short"; + private static readonly IReadOnlyList nugetListSourceCommandArgs = ["nuget", "list", "source", "--format", "Short"]; public IList GetNugetFeeds(string nugetConfig) { logger.LogInfo($"Getting NuGet feeds from '{nugetConfig}'..."); - return GetResultList($"{nugetListSourceCommand} --configfile \"{nugetConfig}\""); + return GetResultList([.. nugetListSourceCommandArgs, "--configfile", nugetConfig]); } public IList GetNugetFeedsFromFolder(string folderPath) { logger.LogInfo($"Getting NuGet feeds in folder '{folderPath}'..."); - return GetResultList(nugetListSourceCommand, folderPath); + return GetResultList(nugetListSourceCommandArgs.ToList(), folderPath); } // The version number should be kept in sync with the version .NET version used for building the application. diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNetCliInvoker.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNetCliInvoker.cs index 4c4e789973ca..b982cac65477 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNetCliInvoker.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNetCliInvoker.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Collections.ObjectModel; using System.Diagnostics; using Semmle.Util; using Semmle.Util.Logging; @@ -25,7 +24,7 @@ public DotNetCliInvoker(ILogger logger, string exec, DependabotProxy? dependabot logger.LogInfo($"Using .NET CLI executable: '{Exec}'"); } - private ProcessStartInfo MakeDotnetStartInfo(string args, string? workingDirectory) + private ProcessStartInfo MakeDotnetStartInfo(List args, string? workingDirectory) { var startInfo = new ProcessStartInfo(Exec, args) { @@ -57,39 +56,39 @@ private ProcessStartInfo MakeDotnetStartInfo(string args, string? workingDirecto return startInfo; } - private int RunCommandExitCodeAux(string args, string? workingDirectory, out IList output, out string dirLog, bool silent) + private int RunCommandExitCodeAux(List args, string? workingDirectory, out IList output, out string dirLog, bool silent) { dirLog = string.IsNullOrWhiteSpace(workingDirectory) ? "" : $" in {workingDirectory}"; var pi = MakeDotnetStartInfo(args, workingDirectory); var threadId = Environment.CurrentManagedThreadId; void onOut(string s) => logger.Log(silent ? Severity.Debug : Severity.Info, s, threadId); void onError(string s) => logger.LogError(s, threadId); - logger.LogInfo($"Running '{Exec} {args}'{dirLog}"); + logger.LogInfo($"Running '{Exec} {string.Join(" ", args)}'{dirLog}"); var exitCode = pi.ReadOutput(out output, onOut, onError); return exitCode; } - private bool RunCommandAux(string args, string? workingDirectory, out IList output, bool silent) + private bool RunCommandAux(List args, string? workingDirectory, out IList output, bool silent) { var exitCode = RunCommandExitCodeAux(args, workingDirectory, out output, out var dirLog, silent); if (exitCode != 0) { - logger.LogError($"Command '{Exec} {args}'{dirLog} failed with exit code {exitCode}"); + logger.LogError($"Command '{Exec} {string.Join(" ", args)}'{dirLog} failed with exit code {exitCode}"); return false; } return true; } - public bool RunCommand(string args, bool silent = true) => + public bool RunCommand(List args, bool silent = true) => RunCommandAux(args, null, out _, silent); - public int RunCommandExitCode(string args, bool silent = true) => + public int RunCommandExitCode(List args, bool silent = true) => RunCommandExitCodeAux(args, null, out _, out _, silent); - public bool RunCommand(string args, out IList output, bool silent = true) => + public bool RunCommand(List args, out IList output, bool silent = true) => RunCommandAux(args, null, out output, silent); - public bool RunCommand(string args, string? workingDirectory, out IList output, bool silent = true) => + public bool RunCommand(List args, string? workingDirectory, out IList output, bool silent = true) => RunCommandAux(args, workingDirectory, out output, silent); } } diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs index 0cbf106df38a..581d4c15e9dd 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs @@ -158,24 +158,18 @@ private IEnumerable GetFeedsFromNugetConfig(string nugetConfigPath) => /// /// The list of feeds to use for the restore command. /// The prefix to use for each source argument (e.g., "-s"). - /// The constructed NuGet sources argument for the restore command. - public string FeedsToRestoreArgument(IEnumerable feeds, string sourceArgumentPrefix) + /// The list of NuGet sources arguments for the restore command. + public List FeedsToRestoreArgument(IEnumerable feeds, string sourceArgumentPrefix) { // If there are no feeds, we want to override any default feeds that `restore` would use by passing a dummy source argument. if (!feeds.Any()) { - return $" {sourceArgumentPrefix} \"{emptyPackageDirectory.DirInfo.FullName}\""; + return [sourceArgumentPrefix, emptyPackageDirectory.DirInfo.FullName]; } // Add package sources. If any are present, they override all sources specified in // the configuration file(s). - var feedArgs = new StringBuilder(); - foreach (var feed in feeds) - { - feedArgs.Append($" {sourceArgumentPrefix} \"{feed}\""); - } - - return feedArgs.ToString(); + return feeds.SelectMany(feed => [sourceArgumentPrefix, feed]).ToList(); } private IEnumerable FeedsToUseAux(HashSet feedsToConsider) @@ -212,8 +206,8 @@ public IEnumerable FeedsToUse(string path) /// Constructs the NuGet sources argument for the `dotnet restore` command based on the given feeds. /// /// The list of NuGet feeds to use for the restore command. - /// A string representing the NuGet sources argument for the `dotnet restore` command. - public string FeedsToDotnetRestoreArgument(IEnumerable feeds) + /// A list representing the NuGet sources arguments for the `dotnet restore` command. + public List FeedsToDotnetRestoreArgument(IEnumerable feeds) { return FeedsToRestoreArgument(feeds, "-s"); } @@ -224,13 +218,13 @@ public string FeedsToDotnetRestoreArgument(IEnumerable feeds) /// (2) Use private registries, if they are configured /// /// Path to project/solution - /// A string representing the NuGet sources argument for the `dotnet restore` command. - public string? MakeDotnetRestoreSourcesArgument(string path) + /// A list representing the NuGet sources arguments for the `dotnet restore` command. + public List MakeDotnetRestoreSourcesArguments(string path) { // Do not construct a set of explicit NuGet sources to use for restore. if (!CheckNugetFeedResponsiveness && !HasPrivateRegistryFeeds) { - return null; + return []; } var feedsToUse = FeedsToUse(path); diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNet.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNet.cs index 394a05e9e596..0e93fa92813a 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNet.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNet.cs @@ -12,12 +12,12 @@ public interface IDotNet bool AddPackage(string folder, string package); IList GetListedRuntimes(); IList GetListedSdks(); - bool Exec(string execArgs); + bool Exec(List execArgs); IList GetNugetFeeds(string nugetConfig); IList GetNugetFeedsFromFolder(string folderPath); } - public record class RestoreSettings(string File, string PackageDirectory, bool ForceDotnetRefAssemblyFetching, string? NugetSources = null, bool ForceReevaluation = false, bool TargetWindows = false); + public record class RestoreSettings(string File, string PackageDirectory, bool ForceDotnetRefAssemblyFetching, List NugetSources, bool ForceReevaluation = false, bool TargetWindows = false); public partial record class RestoreResult(bool Success, IList Output) { diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNetCliInvoker.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNetCliInvoker.cs index ef5bcd4753bb..b5400ec63319 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNetCliInvoker.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNetCliInvoker.cs @@ -30,26 +30,26 @@ internal interface IDotNetCliInvoker /// Execute `dotnet ` and return true if the command succeeded, otherwise false. /// If `silent` is true the output of the command is logged as `debug` otherwise as `info`. /// - bool RunCommand(string args, bool silent = true); + bool RunCommand(List args, bool silent = true); /// /// Execute `dotnet ` and return the exit code. /// If `silent` is true the output of the command is logged as `debug` otherwise as `info`. /// - int RunCommandExitCode(string args, bool silent = true); + int RunCommandExitCode(List args, bool silent = true); /// /// Execute `dotnet ` and return true if the command succeeded, otherwise false. /// The output of the command is returned in `output`. /// If `silent` is true the output of the command is logged as `debug` otherwise as `info`. /// - bool RunCommand(string args, out IList output, bool silent = true); + bool RunCommand(List args, out IList output, bool silent = true); /// /// Execute `dotnet ` in `` and return true if the command succeeded, otherwise false. /// The output of the command is returned in `output`. /// If `silent` is true the output of the command is logged as `debug` otherwise as `info`. /// - bool RunCommand(string args, string? workingDirectory, out IList output, bool silent = true); + bool RunCommand(List args, string? workingDirectory, out IList output, bool silent = true); } } diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs index 38924e2f876e..264524be0620 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs @@ -216,7 +216,7 @@ private IEnumerable RestoreSolutions(out DependencyContainer dependencie var projects = fileProvider.Solutions.SelectMany(solution => { logger.LogInfo($"Restoring solution {solution}..."); - var nugetSources = feedManager.MakeDotnetRestoreSourcesArgument(solution); + var nugetSources = feedManager.MakeDotnetRestoreSourcesArguments(solution); var res = dotnet.Restore(new(solution, PackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: true, NugetSources: nugetSources, TargetWindows: isWindows)); if (res.Success) { @@ -264,7 +264,7 @@ private void RestoreProjects(IEnumerable projects, out ConcurrentBag GetRestoredPackageDirectoryNames(DirectoryInf .Select(d => Path.GetFileName(d).ToLowerInvariant()); } - private bool TryRestorePackageManually(string package, string? nugetSources, PackageReferenceSource packageReferenceSource = PackageReferenceSource.SdkCsProj, bool tryPrereleaseVersion = true) + private bool TryRestorePackageManually(string package, List nugetSources, PackageReferenceSource packageReferenceSource = PackageReferenceSource.SdkCsProj, bool tryPrereleaseVersion = true) { logger.LogInfo($"Restoring package {package}..."); using var tempDir = new TemporaryDirectory( @@ -460,11 +460,11 @@ private bool TryRestorePackageManually(string package, string? nugetSources, Pac return true; } - if (!feedManager.CheckNugetFeedResponsiveness && res.HasNugetPackageSourceError && nugetSources is not null) + if (!feedManager.CheckNugetFeedResponsiveness && res.HasNugetPackageSourceError && nugetSources.Count > 0) { logger.LogDebug($"Trying to restore '{package}' without explicitly providing NuGet sources."); // Restore could not be completed because the listed source is unavailable. Try without an explicit restore source argument. - res = TryRestorePackageManually(package, nugetSources: null, tempDir, tryPrereleaseVersion); + res = TryRestorePackageManually(package, [], tempDir, tryPrereleaseVersion); if (res.Success) { return true; @@ -475,16 +475,16 @@ private bool TryRestorePackageManually(string package, string? nugetSources, Pac return false; } - private RestoreResult TryRestorePackageManually(string package, string? nugetSources, TemporaryDirectory tempDir, bool tryPrereleaseVersion) + private RestoreResult TryRestorePackageManually(string package, List nugetSources, TemporaryDirectory tempDir, bool tryPrereleaseVersion) { - var res = dotnet.Restore(new(tempDir.DirInfo.FullName, missingPackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: false, NugetSources: nugetSources, ForceReevaluation: true)); + var res = dotnet.Restore(new(tempDir.DirInfo.FullName, missingPackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: false, nugetSources, ForceReevaluation: true)); if (!res.Success && tryPrereleaseVersion && res.HasNugetNoStablePackageVersionError) { logger.LogDebug($"Failed to restore nuget package {package} because no stable version was found."); TryChangePackageVersion(tempDir.DirInfo, "*-*"); - res = dotnet.Restore(new(tempDir.DirInfo.FullName, missingPackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: false, NugetSources: nugetSources, ForceReevaluation: true)); + res = dotnet.Restore(new(tempDir.DirInfo.FullName, missingPackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: false, nugetSources, ForceReevaluation: true)); if (!res.Success) { TryChangePackageVersion(tempDir.DirInfo, "*"); diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/PackagesConfigRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/PackagesConfigRestorer.cs index 05c10cfb2bf3..e5a9365a08e3 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/PackagesConfigRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/PackagesConfigRestorer.cs @@ -168,7 +168,7 @@ private bool TryRestoreNugetPackage(string packagesConfig) { logger.LogInfo($"Restoring file \"{packagesConfig}\"..."); - var sourcesArgument = ""; + List sourcesArgument = []; var feedsToUse = feedManager.FeedsToUse(packagesConfig).ToList(); var useDefaultFeed = feedsToUse.Count == 0 && IsDefaultFeedReachable; @@ -189,16 +189,18 @@ private bool TryRestoreNugetPackage(string packagesConfig) * really unwieldy and this solution works for now. */ - string exe, args; + string exe; + List args; + if (RunWithMono) { exe = "mono"; - args = $"\"{nugetExe}\" install -OutputDirectory \"{packageDirectory}\" {sourcesArgument} \"{packagesConfig}\""; + args = [nugetExe!, "install", "-OutputDirectory", packageDirectory.ToString(), .. sourcesArgument, packagesConfig]; } else { exe = nugetExe!; - args = $"install -OutputDirectory \"{packageDirectory}\" {sourcesArgument} \"{packagesConfig}\""; + args = ["install", "-OutputDirectory", packageDirectory.ToString(), .. sourcesArgument, packagesConfig]; } var pi = new ProcessStartInfo(exe, args) @@ -214,7 +216,7 @@ private bool TryRestoreNugetPackage(string packagesConfig) var exitCode = pi.ReadOutput(out _, onOut, onError); if (exitCode != 0) { - logger.LogError($"Command {pi.FileName} {pi.Arguments} failed with exit code {exitCode}"); + logger.LogError($"Command {pi.FileName} {string.Join(" ", pi.ArgumentList)} failed with exit code {exitCode}"); return false; } else diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/SourceGenerators/DotnetSourceGeneratorWrapper/DotnetSourceGeneratorWrapper.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/SourceGenerators/DotnetSourceGeneratorWrapper/DotnetSourceGeneratorWrapper.cs index 9518afac4008..8ecf13d53a6a 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/SourceGenerators/DotnetSourceGeneratorWrapper/DotnetSourceGeneratorWrapper.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/SourceGenerators/DotnetSourceGeneratorWrapper/DotnetSourceGeneratorWrapper.cs @@ -79,7 +79,7 @@ public IEnumerable RunSourceGenerator(IEnumerable additionalFile sw.Write(argsString); } - dotnet.Exec($"\"{cscPath}\" /noconfig @\"{cscArgsPath}\""); + dotnet.Exec([cscPath, "/noconfig", $"@{cscArgsPath}"]); var files = Directory.GetFiles(outputFolder, "*.*", new EnumerationOptions { RecurseSubdirectories = true }); diff --git a/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs b/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs index 74939b61af5e..260eae10bd1b 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs @@ -8,45 +8,45 @@ namespace Semmle.Extraction.Tests { internal class DotNetCliInvokerStub : IDotNetCliInvoker { - private readonly IList output; - private string lastArgs = ""; + private readonly IList returnOutput; + private List lastArgs = []; public string WorkingDirectory { get; private set; } = ""; public bool Success { get; set; } = true; public int ExitCode { get; set; } = 0; - public DotNetCliInvokerStub(IList output) + public DotNetCliInvokerStub(IList returnOutput) { - this.output = output; + this.returnOutput = returnOutput; } public string Exec => "dotnet"; - public bool RunCommand(string args, bool silent) + public bool RunCommand(List args, bool silent) { lastArgs = args; return Success; } - public int RunCommandExitCode(string args, bool silent) + public int RunCommandExitCode(List args, bool silent) { lastArgs = args; return ExitCode; } - public bool RunCommand(string args, out IList output, bool silent) + public bool RunCommand(List args, out IList output, bool silent) { lastArgs = args; - output = this.output; + output = this.returnOutput; return Success; } - public bool RunCommand(string args, string? workingDirectory, out IList output, bool silent) + public bool RunCommand(List args, string? workingDirectory, out IList output, bool silent) { WorkingDirectory = workingDirectory ?? ""; return RunCommand(args, out output, silent); } - public string GetLastArgs() => lastArgs; + public List GetLastArgs() => lastArgs; } public class DotNetTests @@ -83,7 +83,7 @@ public void TestDotnetInfo() // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); - Assert.Equal("--info", lastArgs); + Assert.Equal(["--info"], lastArgs); } [Fact] @@ -115,11 +115,11 @@ public void TestDotnetRestoreProjectToDirectory1() var dotnet = MakeDotnet(dotnetCliInvoker); // Execute - dotnet.Restore(new("myproject.csproj", "mypackages", false)); + dotnet.Restore(new("myproject.csproj", "mypackages", false, [])); // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); - Assert.Equal("restore --no-dependencies \"myproject.csproj\" --packages \"mypackages\" /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal", lastArgs); + Assert.Equal(["restore", "--no-dependencies", "myproject.csproj", "--packages", "mypackages", "/p:DisableImplicitNuGetFallbackFolder=true", "--verbosity", "normal"], lastArgs); } [Fact] @@ -130,11 +130,11 @@ public void TestDotnetRestoreProjectToDirectory2() var dotnet = MakeDotnet(dotnetCliInvoker); // Execute - var res = dotnet.Restore(new("myproject.csproj", "mypackages", false, null)); + var res = dotnet.Restore(new("myproject.csproj", "mypackages", false, [])); // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); - Assert.Equal("restore --no-dependencies \"myproject.csproj\" --packages \"mypackages\" /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal", lastArgs); + Assert.Equal(["restore", "--no-dependencies", "myproject.csproj", "--packages", "mypackages", "/p:DisableImplicitNuGetFallbackFolder=true", "--verbosity", "normal"], lastArgs); Assert.Equal(2, res.AssetsFilePaths.Count()); Assert.Contains("/path/to/project.assets.json", res.AssetsFilePaths); Assert.Contains("/path/to/project2.assets.json", res.AssetsFilePaths); @@ -148,11 +148,11 @@ public void TestDotnetRestoreProjectToDirectory3() var dotnet = MakeDotnet(dotnetCliInvoker); // Execute - var res = dotnet.Restore(new("myproject.csproj", "mypackages", false, null, true)); + var res = dotnet.Restore(new("myproject.csproj", "mypackages", false, [], true)); // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); - Assert.Equal("restore --no-dependencies \"myproject.csproj\" --packages \"mypackages\" /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --force", lastArgs); + Assert.Equal(["restore", "--no-dependencies", "myproject.csproj", "--packages", "mypackages", "/p:DisableImplicitNuGetFallbackFolder=true", "--verbosity", "normal", "--force"], lastArgs); Assert.Equal(2, res.AssetsFilePaths.Count()); Assert.Contains("/path/to/project.assets.json", res.AssetsFilePaths); Assert.Contains("/path/to/project2.assets.json", res.AssetsFilePaths); @@ -166,11 +166,11 @@ public void TestDotnetRestoreSolutionToDirectory1() var dotnet = MakeDotnet(dotnetCliInvoker); // Execute - var res = dotnet.Restore(new("mysolution.sln", "mypackages", false)); + var res = dotnet.Restore(new("mysolution.sln", "mypackages", false, [])); // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); - Assert.Equal("restore --no-dependencies \"mysolution.sln\" --packages \"mypackages\" /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal", lastArgs); + Assert.Equal(["restore", "--no-dependencies", "mysolution.sln", "--packages", "mypackages", "/p:DisableImplicitNuGetFallbackFolder=true", "--verbosity", "normal"], lastArgs); Assert.Equal(2, res.RestoredProjects.Count()); Assert.Contains("/path/to/project.csproj", res.RestoredProjects); Assert.Contains("/path/to/project2.csproj", res.RestoredProjects); @@ -188,11 +188,11 @@ public void TestDotnetRestoreSolutionToDirectory2() dotnetCliInvoker.Success = false; // Execute - var res = dotnet.Restore(new("mysolution.sln", "mypackages", false)); + var res = dotnet.Restore(new("mysolution.sln", "mypackages", false, [])); // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); - Assert.Equal("restore --no-dependencies \"mysolution.sln\" --packages \"mypackages\" /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal", lastArgs); + Assert.Equal(["restore", "--no-dependencies", "mysolution.sln", "--packages", "mypackages", "/p:DisableImplicitNuGetFallbackFolder=true", "--verbosity", "normal"], lastArgs); Assert.Empty(res.RestoredProjects); Assert.Empty(res.AssetsFilePaths); } @@ -209,7 +209,7 @@ public void TestDotnetNew() // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); - Assert.Equal("new console --no-restore --output \"myfolder\"", lastArgs); + Assert.Equal(["new", "console", "--no-restore", "--output", "myfolder"], lastArgs); } [Fact] @@ -224,7 +224,7 @@ public void TestDotnetAddPackage() // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); - Assert.Equal("add \"myfolder\" package \"mypackage\" --no-restore", lastArgs); + Assert.Equal(["add", "myfolder", "package", "mypackage", "--no-restore"], lastArgs); } [Fact] @@ -239,7 +239,7 @@ public void TestDotnetGetListedRuntimes1() // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); - Assert.Equal("--list-runtimes", lastArgs); + Assert.Equal(["--list-runtimes"], lastArgs); Assert.Equal(2, runtimes.Count); Assert.Contains("Microsoft.AspNetCore.App 7.0.2 [/path/dotnet/shared/Microsoft.AspNetCore.App]", runtimes); Assert.Contains("Microsoft.NETCore.App 7.0.2 [/path/dotnet/shared/Microsoft.NETCore.App]", runtimes); @@ -258,7 +258,7 @@ public void TestDotnetGetListedRuntimes2() // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); - Assert.Equal("--list-runtimes", lastArgs); + Assert.Equal(["--list-runtimes"], lastArgs); Assert.Empty(runtimes); } @@ -270,11 +270,11 @@ public void TestDotnetExec() var dotnet = MakeDotnet(dotnetCliInvoker); // Execute - dotnet.Exec("myarg1 myarg2"); + dotnet.Exec(["myarg1", "myarg2"]); // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); - Assert.Equal("exec myarg1 myarg2", lastArgs); + Assert.Equal(["exec", "myarg1", "myarg2"], lastArgs); } [Fact] @@ -289,7 +289,7 @@ public void TestNugetFeeds() // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); - Assert.Equal("nuget list source --format Short --configfile \"abc\"", lastArgs); + Assert.Equal(["nuget", "list", "source", "--format", "Short", "--configfile", "abc"], lastArgs); } [Fact] @@ -304,7 +304,7 @@ public void TestNugetFeedsFromFolder() // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); - Assert.Equal("nuget list source --format Short", lastArgs); + Assert.Equal(["nuget", "list", "source", "--format", "Short"], lastArgs); Assert.Equal("abc", dotnetCliInvoker.WorkingDirectory); } } diff --git a/csharp/extractor/Semmle.Extraction.Tests/Runtime.cs b/csharp/extractor/Semmle.Extraction.Tests/Runtime.cs index 38101420fab2..348cadae2fd0 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/Runtime.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/Runtime.cs @@ -25,7 +25,7 @@ public DotNetStub(IList runtimes, IList sdks) public IList GetListedSdks() => sdks; - public bool Exec(string execArgs) => true; + public bool Exec(List execArgs) => true; public IList GetNugetFeeds(string nugetConfig) => []; From b4e561a931e51f3ae7a03389992de90cd727a15e Mon Sep 17 00:00:00 2001 From: Taus Date: Wed, 26 Aug 2026 12:21:31 +0000 Subject: [PATCH 0535/2098] Python: Split up `except Alpha, Beta:` case across language versions This is the case where the difference in semantics actually changes the output of the query, so we have to maintain language-specific tests for this. The remaining tests stay in the shared directory, as they have the same behaviour on both versions of Python. I've also added a comment pointing this out, in case future readers get confused as to why `except Alpha, Beta: ...` is missing. --- .../Imports/unused/UnusedImport.expected | 1 + .../Imports/unused/UnusedImport.qlref | 1 + .../Imports/unused/relaxed_except.py | 9 +++++++ .../Imports/unused/relaxed_except_defs.py | 6 +++++ .../Imports/unused/UnusedImport.expected | 0 .../Imports/unused/UnusedImport.qlref | 1 + .../Imports/unused/relaxed_except.py | 9 +++++++ .../Imports/unused/relaxed_except_defs.py | 6 +++++ .../Imports/unused/UnusedImport.expected | 2 +- .../Imports/unused/relaxed_except.py | 26 ++++++------------- .../Imports/unused/relaxed_except_defs.py | 8 ------ 11 files changed, 42 insertions(+), 27 deletions(-) create mode 100644 python/ql/test/2/query-tests/Imports/unused/UnusedImport.expected create mode 100644 python/ql/test/2/query-tests/Imports/unused/UnusedImport.qlref create mode 100644 python/ql/test/2/query-tests/Imports/unused/relaxed_except.py create mode 100644 python/ql/test/2/query-tests/Imports/unused/relaxed_except_defs.py create mode 100644 python/ql/test/3/query-tests/Imports/unused/UnusedImport.expected create mode 100644 python/ql/test/3/query-tests/Imports/unused/UnusedImport.qlref create mode 100644 python/ql/test/3/query-tests/Imports/unused/relaxed_except.py create mode 100644 python/ql/test/3/query-tests/Imports/unused/relaxed_except_defs.py diff --git a/python/ql/test/2/query-tests/Imports/unused/UnusedImport.expected b/python/ql/test/2/query-tests/Imports/unused/UnusedImport.expected new file mode 100644 index 000000000000..9480aa15d1b0 --- /dev/null +++ b/python/ql/test/2/query-tests/Imports/unused/UnusedImport.expected @@ -0,0 +1 @@ +| relaxed_except.py:2:1:2:43 | Import | Import of 'Beta' is not used. | diff --git a/python/ql/test/2/query-tests/Imports/unused/UnusedImport.qlref b/python/ql/test/2/query-tests/Imports/unused/UnusedImport.qlref new file mode 100644 index 000000000000..e6bb7ab44cb0 --- /dev/null +++ b/python/ql/test/2/query-tests/Imports/unused/UnusedImport.qlref @@ -0,0 +1 @@ +Imports/UnusedImport.ql diff --git a/python/ql/test/2/query-tests/Imports/unused/relaxed_except.py b/python/ql/test/2/query-tests/Imports/unused/relaxed_except.py new file mode 100644 index 000000000000..f5b1cb036261 --- /dev/null +++ b/python/ql/test/2/query-tests/Imports/unused/relaxed_except.py @@ -0,0 +1,9 @@ +# In Python 2, Beta is an alias binding; in Python 3, it is an exception type. +from relaxed_except_defs import Alpha, Beta + + +def unparenthesized(): + try: + pass + except Alpha, Beta: + raise diff --git a/python/ql/test/2/query-tests/Imports/unused/relaxed_except_defs.py b/python/ql/test/2/query-tests/Imports/unused/relaxed_except_defs.py new file mode 100644 index 000000000000..12a167adf2c9 --- /dev/null +++ b/python/ql/test/2/query-tests/Imports/unused/relaxed_except_defs.py @@ -0,0 +1,6 @@ +class Alpha(Exception): + pass + + +class Beta(Exception): + pass diff --git a/python/ql/test/3/query-tests/Imports/unused/UnusedImport.expected b/python/ql/test/3/query-tests/Imports/unused/UnusedImport.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/ql/test/3/query-tests/Imports/unused/UnusedImport.qlref b/python/ql/test/3/query-tests/Imports/unused/UnusedImport.qlref new file mode 100644 index 000000000000..e6bb7ab44cb0 --- /dev/null +++ b/python/ql/test/3/query-tests/Imports/unused/UnusedImport.qlref @@ -0,0 +1 @@ +Imports/UnusedImport.ql diff --git a/python/ql/test/3/query-tests/Imports/unused/relaxed_except.py b/python/ql/test/3/query-tests/Imports/unused/relaxed_except.py new file mode 100644 index 000000000000..f5b1cb036261 --- /dev/null +++ b/python/ql/test/3/query-tests/Imports/unused/relaxed_except.py @@ -0,0 +1,9 @@ +# In Python 2, Beta is an alias binding; in Python 3, it is an exception type. +from relaxed_except_defs import Alpha, Beta + + +def unparenthesized(): + try: + pass + except Alpha, Beta: + raise diff --git a/python/ql/test/3/query-tests/Imports/unused/relaxed_except_defs.py b/python/ql/test/3/query-tests/Imports/unused/relaxed_except_defs.py new file mode 100644 index 000000000000..12a167adf2c9 --- /dev/null +++ b/python/ql/test/3/query-tests/Imports/unused/relaxed_except_defs.py @@ -0,0 +1,6 @@ +class Alpha(Exception): + pass + + +class Beta(Exception): + pass diff --git a/python/ql/test/query-tests/Imports/unused/UnusedImport.expected b/python/ql/test/query-tests/Imports/unused/UnusedImport.expected index 801305defafd..46f9c1a55e56 100644 --- a/python/ql/test/query-tests/Imports/unused/UnusedImport.expected +++ b/python/ql/test/query-tests/Imports/unused/UnusedImport.expected @@ -6,4 +6,4 @@ | imports_test.py:27:1:27:25 | Import | Import of 'func2' is not used. | | imports_test.py:34:1:34:14 | Import | Import of 'module2' is not used. | | imports_test.py:116:1:116:41 | Import | Import of 'not_a_fixture' is not used. | -| relaxed_except.py:12:1:12:68 | Import | Import of 'NeverUsed' is not used. | +| relaxed_except.py:3:1:3:55 | Import | Import of 'NeverUsed' is not used. | diff --git a/python/ql/test/query-tests/Imports/unused/relaxed_except.py b/python/ql/test/query-tests/Imports/unused/relaxed_except.py index 0f1f29d71ceb..a2a9861aefbe 100644 --- a/python/ql/test/query-tests/Imports/unused/relaxed_except.py +++ b/python/ql/test/query-tests/Imports/unused/relaxed_except.py @@ -1,24 +1,14 @@ # PEP 758 allows unparenthesized exception types when there is no `as` clause. -# Every name below is used as an exception type, so no import here is unused. -# `NeverUsed` is imported and never used, and is the one expected result. -# -# Each name appears in exactly one clause on purpose: a name that also appeared -# in a parenthesized clause would be a use regardless, and would mask the -# behaviour under test. -# -# This file deliberately contains no `except A, B, C:` clause. Three or more -# unparenthesized types fail the default parser, which sends the whole file to -# the tree-sitter parser and would likewise mask it. -from relaxed_except_defs import Alpha, Beta, Delta, Gamma, NeverUsed - - -def unparenthesized(): - try: - pass - except Alpha, Beta: - raise +# Every import below except `NeverUsed` is used, leaving one expected result. +from relaxed_except_defs import Delta, Gamma, NeverUsed +# The `except Alpha, Beta:` case is covered separately in the Python 2 and +# Python 3 test directories because its semantics differ between versions. +# +# The version-specific files deliberately contain no `except A, B, C:` clause. +# Three or more unparenthesized types fail the default parser, which sends the +# whole file to the tree-sitter parser and would mask the behavior under test. def parenthesized(): try: pass diff --git a/python/ql/test/query-tests/Imports/unused/relaxed_except_defs.py b/python/ql/test/query-tests/Imports/unused/relaxed_except_defs.py index 1c6e63828666..3c6313b3abf9 100644 --- a/python/ql/test/query-tests/Imports/unused/relaxed_except_defs.py +++ b/python/ql/test/query-tests/Imports/unused/relaxed_except_defs.py @@ -1,11 +1,3 @@ -class Alpha(Exception): - pass - - -class Beta(Exception): - pass - - class Gamma(Exception): pass From 9500a4ec0641ce285c09a4428b87a045d41071ca Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 26 Aug 2026 12:57:52 +0000 Subject: [PATCH 0536/2098] update codeql documentation --- .../codeql-changelog/codeql-cli-2.26.4.rst | 154 ++++++++++++++++++ .../codeql-changelog/index.rst | 1 + 2 files changed, 155 insertions(+) create mode 100644 docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.26.4.rst diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.26.4.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.26.4.rst new file mode 100644 index 000000000000..eb01082cee26 --- /dev/null +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.26.4.rst @@ -0,0 +1,154 @@ +.. _codeql-cli-2.26.4: + +========================== +CodeQL 2.26.4 (2026-08-26) +========================== + +.. contents:: Contents + :depth: 2 + :local: + :backlinks: none + +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. + +Security Coverage +----------------- + +CodeQL 2.26.4 runs a total of 497 security queries when configured with the Default suite (covering 170 CWE). The Extended suite enables an additional 131 queries (covering 32 more CWE). + +CodeQL CLI +---------- + +Bug Fixes +~~~~~~~~~ + +* The Java Autobuilder now expands project properties, such as + :code:`${maven.version}`, when determining Maven version requirements specified by the Maven Enforcer Plugin. The Java Autobuilder now also supports Maven versions through 3.9.16. + +New Features +~~~~~~~~~~~~ + +* :code:`codeql test run` now supports the :code:`--reuse-dataset` option, which reuses an existing test database from a previous run when available, + skipping database extraction. This can speed up repeated test runs when only the query under test has changed. The option implies + :code:`--keep-databases`. + +Query Packs +----------- + +Bug Fixes +~~~~~~~~~ + +C# +"" + +* The query :code:`cs/useless-cast-to-self` no longer reports casts when both the expression type and the cast target type are unknown, which can occur in :code:`build-mode: none` databases. + +Minor Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +C# +"" + +* The :code:`cs/simplifiable-boolean-expression` query no longer suggests replacing a negated comparison when the replacement could recursively call an enclosing user-defined operator in :code:`build-mode: none` databases. +* The :code:`cs/web/missing-token-validation` query now recognizes enabled ASP.NET Core :code:`RequireAntiforgeryToken` attributes when antiforgery middleware is used. +* The query :code:`cs/virtual-call-in-constructor` has been improved. Uses of virtual members in :code:`nameof` expressions are no longer reported, since they are not calls. +* Static constructors are now used as the enclosing callable for static member initializer expressions. This improves the precision of a range of queries, including :code:`cs/useless-assignment-to-local` and :code:`cs/dereferenced-value-may-be-null`. + +JavaScript/TypeScript +""""""""""""""""""""" + +* The :code:`js/superfluous-trailing-arguments` query no longer reports valid arguments passed to the :code:`TransformStream` constructor. + +GitHub Actions +"""""""""""""" + +* The :code:`actions/unpinned-tag` query now detects mutable references to reusable workflows. + +Language Libraries +------------------ + +Breaking Changes +~~~~~~~~~~~~~~~~ + +GitHub Actions +"""""""""""""" + +* Checks on actor fields read from the event payload (e.g. :code:`github.event.pull_request.user.login`) were split out of :code:`ActorIfCheck` into a new class :code:`EventActorIfCheck`. The :code:`ActorIfCheck` class now only covers :code:`github.actor` and :code:`github.triggering_actor`. + +Major Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +C# +"" + +* Simplified and streamlined the use of NuGet sources when downloading dependencies. In fallback scenarios and specialized package downloads, NuGet sources are now passed directly to :code:`dotnet restore` via the CLI. Furthermore, no :code:`nuget.config` files are created for fallback scenarios, and private registries are used when attempting to download missing packages that were not restored as part of the normal :code:`dotnet restore` process. + +Golang +"""""" + +* Go 1.27 is now supported. + +Rust +"""" + +* The alert locations for data flow queries have been improved. The new locations are more precise and are based on the actual source and sink nodes. Example: + + .. code-block:: rust + + let _ = conn.query( + // ^^^^ old alert location + unsafe_query.as_str(), + // ^^^^^^^^^^^^^^^^^^^^^ new alert location + )?; + + This means that some alerts will have their locations changed, and hence appear as new alerts (while the old alerts will disappear). + +Minor Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Java/Kotlin +""""""""""" + +* Removed the summary model for :code:`String.valueOf(CharSequence)`, which does not exist. Instead, taint is now propagated through calls to :code:`String.valueOf(Object)` when the argument is a :code:`CharSequence`, for example a :code:`String` or a :code:`StringBuilder`. +* Added SQL injection sink models for Spring R2DBC :code:`DatabaseClient` and the R2DBC SPI. + +JavaScript/TypeScript +""""""""""""""""""""" + +* Added support for regular expressions using the :code:`d` flag. + +Python +"""""" + +* Added taint flow through :code:`list.extend` and :code:`list.insert`, matching the existing taint flow through :code:`list.append`. + +Ruby +"""" + +* The algorithm for tracking regexes has been replaced. This can cause result changes in related queries, for example, :code:`rb/polynomial-redos`. + +GitHub Actions +"""""""""""""" + +* Checks on actor fields read from the event payload (e.g. :code:`github.event.pull_request.user.login`) now only count as protection for events whose payload actually populates that field. Previously, a condition such as :code:`github.event.pull_request.user.login != 'name'` on a workflow triggered by :code:`issues` events was treated as a protective check even though :code:`github.event.pull_request` is not populated for :code:`issues` events, which makes the condition vacuous. This change may result in more alerts for queries using the :code:`ControlCheck` class. +* Added an option to :code:`EnvironmentCheck` to become specified by a MaD model, otherwise it will continue as the default it previously was. Without adding models to :code:`actions/ql/lib/ext/config/deployment_environment.yml` the behavior of every query will be unchanged. When models are added queries using :code:`ControlCheck` may find more results in cases where an environment is no longer a sufficient sanitizer. + +Rust +"""" + +* Canonical paths for Rust trait items now use the format :code:`crate::Trait::item` instead of + :code:`<_ as crate::Trait>::item`. Custom data extension models that reference trait items must be updated to use the new format. +* The Rust extractor has been upgraded to use :code:`rust-analyzer` version 0.0.328. As a result, the AST exposed by the Rust libraries has changed: the :code:`TraitAlias` class has been removed, :code:`cfg` attributes are now modeled by the new :code:`CfgMeta`, :code:`CfgAtom`, :code:`CfgComposite`, :code:`CfgPredicate`, and :code:`CfgAttrMeta` classes, and the :code:`Meta` class has been refined into the :code:`KeyValueMeta`, :code:`PathMeta`, :code:`TokenTreeMeta`, and :code:`UnsafeMeta` subclasses. New :code:`TryBlockModifier` and :code:`FormatArgsArgName` classes have also been added. + +New Features +~~~~~~~~~~~~ + +C# +"" + +* Added the :code:`AdditionalTaintStep` extension point (:code:`semmle.code.csharp.dataflow.FlowSteps`). Extend this class to add additional taint steps that apply to all taint-tracking configurations. + +JavaScript/TypeScript +""""""""""""""""""""" + +* Added support for recognizing the React Native Worklets :code:`"worklet"` directive as a known directive. diff --git a/docs/codeql/codeql-overview/codeql-changelog/index.rst b/docs/codeql/codeql-overview/codeql-changelog/index.rst index 6562d3482c54..0267c6ef8ef5 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/index.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/index.rst @@ -11,6 +11,7 @@ A list of queries for each suite and language `is available here Date: Wed, 26 Aug 2026 16:35:00 +0200 Subject: [PATCH 0537/2098] C#: address further OData review comments - Revert Patch/CopyChangedValues to void-only per michaelnebel (defer to maintainer over docs citation despite conflicting reflection evidence). - Move Microsoft.AspNet.OData.cs stub to a flat file, drop its wrapper project. - Drop the TryGetValue AdditionalTaintStep: it only added a taint step and didn't make cast targets recognized as ODataBoundType, so it doesn't fully address the underlying gap; left for a follow-up PR. - Convert OData.ql to a path-problem query for clearer test output. Co-Authored-By: Claude Sonnet 5 --- .../lib/ext/Microsoft.AspNet.OData.model.yml | 3 - .../semmle/code/csharp/frameworks/OData.qll | 17 ---- .../library-tests/frameworks/OData/OData.cs | 21 ---- .../frameworks/OData/OData.expected | 96 ++++++++++++++++--- .../library-tests/frameworks/OData/OData.ql | 11 ++- .../library-tests/frameworks/OData/options | 3 +- .../7.7.5 => }/Microsoft.AspNet.OData.cs | 4 +- .../7.7.5/Microsoft.AspNet.OData.csproj | 12 --- 8 files changed, 93 insertions(+), 74 deletions(-) rename csharp/ql/test/resources/stubs/{Microsoft.AspNet.OData/7.7.5 => }/Microsoft.AspNet.OData.cs (75%) delete mode 100644 csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.csproj diff --git a/csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml b/csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml index e27c4ccfe529..86065b1ca2ea 100644 --- a/csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml +++ b/csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml @@ -5,14 +5,11 @@ extensions: data: - ["Microsoft.AspNet.OData", "Delta", True, "GetInstance", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["Microsoft.AspNet.OData", "Delta", True, "Patch", "(TStructuralType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] - - ["Microsoft.AspNet.OData", "Delta", True, "Patch", "(TStructuralType)", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["Microsoft.AspNet.OData", "Delta", True, "Put", "(TStructuralType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] - ["Microsoft.AspNet.OData", "Delta", True, "CopyChangedValues", "(TStructuralType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] - - ["Microsoft.AspNet.OData", "Delta", True, "CopyChangedValues", "(TStructuralType)", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["Microsoft.AspNet.OData", "Delta", True, "CopyUnchangedValues", "(TStructuralType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "GetInstance", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "Patch", "(T)", "", "Argument[this]", "Argument[0]", "taint", "manual"] - - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "Patch", "(T)", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "Put", "(T)", "", "Argument[this]", "Argument[0]", "taint", "manual"] - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "CopyChangedValues", "(T)", "", "Argument[this]", "Argument[0]", "taint", "manual"] - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "CopyUnchangedValues", "(T)", "", "Argument[this]", "Argument[0]", "taint", "manual"] diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll index 9571268c6b30..16422fda1d8c 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll @@ -20,7 +20,6 @@ import csharp private import semmle.code.csharp.commons.Collections -private import semmle.code.csharp.dataflow.FlowSteps private import semmle.code.csharp.security.dataflow.flowsources.Remote /** The `ODataActionParameters` dictionary type, across OData library versions. */ @@ -50,22 +49,6 @@ class ODataActionParameterRead extends ElementAccess { ODataActionParameterRead() { isODataActionParametersValue(this.getQualifier()) } } -/** - * A call to `TryGetValue` on an `ODataActionParameters` dictionary copies the value - * of the looked-up entry into the `out` argument. - */ -private class ODataActionParametersTryGetValueTaintStep extends AdditionalTaintStep { - override predicate step(DataFlow::Node node1, DataFlow::Node node2) { - exists(MethodCall mc, AssignableDefinitions::OutRefDefinition def | - mc.getTarget().hasName("TryGetValue") and - isODataActionParametersValue(mc.getQualifier()) and - node1.asExpr() = mc.getQualifier() and - def.getTargetAccess() = mc.getArgumentForName("value") and - node2 = DataFlow::assignableDefinitionNode(def) - ) - } -} - /** Holds if `e` may (locally) hold the value of an `ODataActionParameters` entry. */ private predicate isODataParameterValue(Expr e) { DataFlow::localExprFlow(any(ODataActionParameterRead r), e) diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.cs b/csharp/ql/test/library-tests/frameworks/OData/OData.cs index bbce96d56fc9..a16a821da070 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.cs +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.cs @@ -73,15 +73,6 @@ void IsAsFromDictionary(ODataActionParameters parameters) } } - void TryGetValueFromDictionary(ODataActionParameters parameters) - { - if (parameters.TryGetValue("Entity", out var value)) - { - var entity = (BoundEntity)value; - Sink(entity.Name); - } - } - void UpcastThenIndex(ODataActionParameters parameters) { IDictionary dict = parameters; @@ -101,18 +92,6 @@ void DeltaGetInstance(Delta delta) Sink(w.Name); } - void DeltaPatchReturnValue(Delta delta, Widget original) - { - var updated = delta.Patch(original); - Sink(updated.Name); - } - - void DeltaCopyChangedValuesReturnValue(Delta delta, Widget original) - { - var updated = delta.CopyChangedValues(original); - Sink(updated.Name); - } - void LegacyDeltaPatch(System.Web.Http.OData.Delta delta, Widget original) { delta.Patch(original); diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.expected b/csharp/ql/test/library-tests/frameworks/OData/OData.expected index 290236df722e..a2e0614a51ec 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.expected +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.expected @@ -1,15 +1,81 @@ -| OData.cs:46:55:46:64 | parameters | OData.cs:49:18:49:23 | access to local variable entity | -| OData.cs:46:55:46:64 | parameters | OData.cs:50:18:50:28 | access to property Name | -| OData.cs:46:55:46:64 | parameters | OData.cs:51:18:51:31 | access to property Content | -| OData.cs:46:55:46:64 | parameters | OData.cs:52:18:52:38 | access to property Owner | -| OData.cs:46:55:46:64 | parameters | OData.cs:55:22:55:28 | access to property Owner | -| OData.cs:59:55:59:64 | parameters | OData.cs:65:26:65:35 | access to property Label | -| OData.cs:59:55:59:64 | parameters | OData.cs:72:22:72:34 | access to property Category | -| OData.cs:76:62:76:71 | parameters | OData.cs:81:22:81:32 | access to property Name | -| OData.cs:85:52:85:61 | parameters | OData.cs:89:18:89:28 | access to property Name | -| OData.cs:92:39:92:43 | delta | OData.cs:95:18:95:30 | access to property Name | -| OData.cs:98:45:98:49 | delta | OData.cs:101:18:101:23 | access to property Name | -| OData.cs:104:50:104:54 | delta | OData.cs:107:18:107:29 | access to property Name | -| OData.cs:110:62:110:66 | delta | OData.cs:113:18:113:29 | access to property Name | -| OData.cs:116:67:116:71 | delta | OData.cs:119:18:119:30 | access to property Name | -| OData.cs:122:71:122:75 | delta | OData.cs:125:18:125:23 | access to property Name | +edges +| OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:48:26:48:58 | (...) ... : BoundEntity | provenance | | +| OData.cs:48:17:48:22 | access to local variable entity : BoundEntity | OData.cs:49:18:49:23 | access to local variable entity | provenance | | +| OData.cs:48:17:48:22 | access to local variable entity : BoundEntity | OData.cs:50:18:50:28 | access to property Name | provenance | | +| OData.cs:48:17:48:22 | access to local variable entity : BoundEntity | OData.cs:51:18:51:31 | access to property Content | provenance | | +| OData.cs:48:17:48:22 | access to local variable entity : BoundEntity | OData.cs:52:18:52:38 | access to property Owner | provenance | | +| OData.cs:48:17:48:22 | access to local variable entity : BoundEntity | OData.cs:55:22:55:28 | access to property Owner | provenance | | +| OData.cs:48:26:48:58 | (...) ... : BoundEntity | OData.cs:48:17:48:22 | access to local variable entity : BoundEntity | provenance | | +| OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:65:26:65:35 | access to property Label | provenance | | +| OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:69:26:69:72 | ... as ... : IEnumerable | provenance | | +| OData.cs:69:17:69:22 | access to local variable items2 : IEnumerable | OData.cs:72:22:72:34 | access to property Category | provenance | | +| OData.cs:69:26:69:72 | ... as ... : IEnumerable | OData.cs:69:17:69:22 | access to local variable items2 : IEnumerable | provenance | | +| OData.cs:76:52:76:61 | parameters : ODataActionParameters | OData.cs:78:41:78:44 | access to local variable dict : ODataActionParameters | provenance | | +| OData.cs:78:41:78:44 | access to local variable dict : ODataActionParameters | OData.cs:79:26:79:52 | (...) ... : BoundEntity | provenance | | +| OData.cs:79:17:79:22 | access to local variable entity : BoundEntity | OData.cs:80:18:80:28 | access to property Name | provenance | | +| OData.cs:79:26:79:52 | (...) ... : BoundEntity | OData.cs:79:17:79:22 | access to local variable entity : BoundEntity | provenance | | +| OData.cs:83:39:83:43 | delta : Delta | OData.cs:85:13:85:17 | access to parameter delta : Delta | provenance | | +| OData.cs:85:13:85:17 | access to parameter delta : Delta | OData.cs:85:25:85:32 | [post] access to parameter original : Widget | provenance | MaD:143 | +| OData.cs:85:25:85:32 | [post] access to parameter original : Widget | OData.cs:86:18:86:30 | access to property Name | provenance | | +| OData.cs:89:45:89:49 | delta : Delta | OData.cs:91:21:91:25 | access to parameter delta : Delta | provenance | | +| OData.cs:91:17:91:17 | access to local variable w : Widget | OData.cs:92:18:92:23 | access to property Name | provenance | | +| OData.cs:91:21:91:25 | access to parameter delta : Delta | OData.cs:91:21:91:39 | call to method GetInstance : Widget | provenance | MaD:142 | +| OData.cs:91:21:91:39 | call to method GetInstance : Widget | OData.cs:91:17:91:17 | access to local variable w : Widget | provenance | | +| OData.cs:95:67:95:71 | delta : Delta | OData.cs:97:13:97:17 | access to parameter delta : Delta | provenance | | +| OData.cs:97:13:97:17 | access to parameter delta : Delta | OData.cs:97:25:97:32 | [post] access to parameter original : Widget | provenance | MaD:153 | +| OData.cs:97:25:97:32 | [post] access to parameter original : Widget | OData.cs:98:18:98:30 | access to property Name | provenance | | +| OData.cs:101:71:101:75 | delta : Delta | OData.cs:103:21:103:25 | access to parameter delta : Delta | provenance | | +| OData.cs:103:17:103:17 | access to local variable w : Widget | OData.cs:104:18:104:23 | access to property Name | provenance | | +| OData.cs:103:21:103:25 | access to parameter delta : Delta | OData.cs:103:21:103:37 | call to method GetEntity : Widget | provenance | MaD:152 | +| OData.cs:103:21:103:37 | call to method GetEntity : Widget | OData.cs:103:17:103:17 | access to local variable w : Widget | provenance | | +nodes +| OData.cs:46:55:46:64 | parameters : ODataActionParameters | semmle.label | parameters : ODataActionParameters | +| OData.cs:48:17:48:22 | access to local variable entity : BoundEntity | semmle.label | access to local variable entity : BoundEntity | +| OData.cs:48:26:48:58 | (...) ... : BoundEntity | semmle.label | (...) ... : BoundEntity | +| OData.cs:49:18:49:23 | access to local variable entity | semmle.label | access to local variable entity | +| OData.cs:50:18:50:28 | access to property Name | semmle.label | access to property Name | +| OData.cs:51:18:51:31 | access to property Content | semmle.label | access to property Content | +| OData.cs:52:18:52:38 | access to property Owner | semmle.label | access to property Owner | +| OData.cs:55:22:55:28 | access to property Owner | semmle.label | access to property Owner | +| OData.cs:59:55:59:64 | parameters : ODataActionParameters | semmle.label | parameters : ODataActionParameters | +| OData.cs:65:26:65:35 | access to property Label | semmle.label | access to property Label | +| OData.cs:69:17:69:22 | access to local variable items2 : IEnumerable | semmle.label | access to local variable items2 : IEnumerable | +| OData.cs:69:26:69:72 | ... as ... : IEnumerable | semmle.label | ... as ... : IEnumerable | +| OData.cs:72:22:72:34 | access to property Category | semmle.label | access to property Category | +| OData.cs:76:52:76:61 | parameters : ODataActionParameters | semmle.label | parameters : ODataActionParameters | +| OData.cs:78:41:78:44 | access to local variable dict : ODataActionParameters | semmle.label | access to local variable dict : ODataActionParameters | +| OData.cs:79:17:79:22 | access to local variable entity : BoundEntity | semmle.label | access to local variable entity : BoundEntity | +| OData.cs:79:26:79:52 | (...) ... : BoundEntity | semmle.label | (...) ... : BoundEntity | +| OData.cs:80:18:80:28 | access to property Name | semmle.label | access to property Name | +| OData.cs:83:39:83:43 | delta : Delta | semmle.label | delta : Delta | +| OData.cs:85:13:85:17 | access to parameter delta : Delta | semmle.label | access to parameter delta : Delta | +| OData.cs:85:25:85:32 | [post] access to parameter original : Widget | semmle.label | [post] access to parameter original : Widget | +| OData.cs:86:18:86:30 | access to property Name | semmle.label | access to property Name | +| OData.cs:89:45:89:49 | delta : Delta | semmle.label | delta : Delta | +| OData.cs:91:17:91:17 | access to local variable w : Widget | semmle.label | access to local variable w : Widget | +| OData.cs:91:21:91:25 | access to parameter delta : Delta | semmle.label | access to parameter delta : Delta | +| OData.cs:91:21:91:39 | call to method GetInstance : Widget | semmle.label | call to method GetInstance : Widget | +| OData.cs:92:18:92:23 | access to property Name | semmle.label | access to property Name | +| OData.cs:95:67:95:71 | delta : Delta | semmle.label | delta : Delta | +| OData.cs:97:13:97:17 | access to parameter delta : Delta | semmle.label | access to parameter delta : Delta | +| OData.cs:97:25:97:32 | [post] access to parameter original : Widget | semmle.label | [post] access to parameter original : Widget | +| OData.cs:98:18:98:30 | access to property Name | semmle.label | access to property Name | +| OData.cs:101:71:101:75 | delta : Delta | semmle.label | delta : Delta | +| OData.cs:103:17:103:17 | access to local variable w : Widget | semmle.label | access to local variable w : Widget | +| OData.cs:103:21:103:25 | access to parameter delta : Delta | semmle.label | access to parameter delta : Delta | +| OData.cs:103:21:103:37 | call to method GetEntity : Widget | semmle.label | call to method GetEntity : Widget | +| OData.cs:104:18:104:23 | access to property Name | semmle.label | access to property Name | +subpaths +#select +| OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:49:18:49:23 | access to local variable entity | $@ | OData.cs:49:18:49:23 | access to local variable entity | access to local variable entity | +| OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:50:18:50:28 | access to property Name | $@ | OData.cs:50:18:50:28 | access to property Name | access to property Name | +| OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:51:18:51:31 | access to property Content | $@ | OData.cs:51:18:51:31 | access to property Content | access to property Content | +| OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:52:18:52:38 | access to property Owner | $@ | OData.cs:52:18:52:38 | access to property Owner | access to property Owner | +| OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:55:22:55:28 | access to property Owner | $@ | OData.cs:55:22:55:28 | access to property Owner | access to property Owner | +| OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:65:26:65:35 | access to property Label | $@ | OData.cs:65:26:65:35 | access to property Label | access to property Label | +| OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:72:22:72:34 | access to property Category | $@ | OData.cs:72:22:72:34 | access to property Category | access to property Category | +| OData.cs:76:52:76:61 | parameters : ODataActionParameters | OData.cs:76:52:76:61 | parameters : ODataActionParameters | OData.cs:80:18:80:28 | access to property Name | $@ | OData.cs:80:18:80:28 | access to property Name | access to property Name | +| OData.cs:83:39:83:43 | delta : Delta | OData.cs:83:39:83:43 | delta : Delta | OData.cs:86:18:86:30 | access to property Name | $@ | OData.cs:86:18:86:30 | access to property Name | access to property Name | +| OData.cs:89:45:89:49 | delta : Delta | OData.cs:89:45:89:49 | delta : Delta | OData.cs:92:18:92:23 | access to property Name | $@ | OData.cs:92:18:92:23 | access to property Name | access to property Name | +| OData.cs:95:67:95:71 | delta : Delta | OData.cs:95:67:95:71 | delta : Delta | OData.cs:98:18:98:30 | access to property Name | $@ | OData.cs:98:18:98:30 | access to property Name | access to property Name | +| OData.cs:101:71:101:75 | delta : Delta | OData.cs:101:71:101:75 | delta : Delta | OData.cs:104:18:104:23 | access to property Name | $@ | OData.cs:104:18:104:23 | access to property Name | access to property Name | diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.ql b/csharp/ql/test/library-tests/frameworks/OData/OData.ql index ed70740699e3..b25ef30bc470 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.ql +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.ql @@ -1,4 +1,9 @@ +/** + * @kind path-problem + */ + import csharp +import Taint::PathGraph module TaintConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node n) { @@ -18,6 +23,6 @@ module TaintConfig implements DataFlow::ConfigSig { module Taint = TaintTracking::Global; -from DataFlow::Node source, DataFlow::Node sink -where Taint::flow(source, sink) -select source, sink +from Taint::PathNode source, Taint::PathNode sink +where Taint::flowPath(source, sink) +select source, source, sink, "$@", sink, sink.toString() diff --git a/csharp/ql/test/library-tests/frameworks/OData/options b/csharp/ql/test/library-tests/frameworks/OData/options index e9ba768d29a7..64d98a3ae94f 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/options +++ b/csharp/ql/test/library-tests/frameworks/OData/options @@ -1,3 +1,4 @@ semmle-extractor-options: /nostdlib /noconfig -semmle-extractor-options: --load-sources-from-project:${testdir}/../../../resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.csproj +semmle-extractor-options: --load-sources-from-project:${testdir}/../../../resources/stubs/_frameworks/Microsoft.NETCore.App/Microsoft.NETCore.App.csproj +semmle-extractor-options: ${testdir}/../../../resources/stubs/Microsoft.AspNet.OData.cs semmle-extractor-options: ${testdir}/../../../resources/stubs/System.Web.Http.OData.cs diff --git a/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.cs b/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData.cs similarity index 75% rename from csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.cs rename to csharp/ql/test/resources/stubs/Microsoft.AspNet.OData.cs index da46281cf2d1..2ff03ab13994 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.cs +++ b/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData.cs @@ -9,9 +9,9 @@ public class Delta where TStructuralType : class { public Delta() => throw null; public TStructuralType GetInstance() => throw null; - public TStructuralType Patch(TStructuralType original) => throw null; + public void Patch(TStructuralType original) => throw null; public void Put(TStructuralType original) => throw null; - public TStructuralType CopyChangedValues(TStructuralType original) => throw null; + public void CopyChangedValues(TStructuralType original) => throw null; public void CopyUnchangedValues(TStructuralType original) => throw null; } } diff --git a/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.csproj b/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.csproj deleted file mode 100644 index 2be6995cd169..000000000000 --- a/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.csproj +++ /dev/null @@ -1,12 +0,0 @@ - - - net10.0 - true - bin\ - false - - - - - - From f6efc3468ed326f3a32d4542c486343b56e85416 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema <93738568+jketema@users.noreply.github.com> Date: Wed, 26 Aug 2026 14:41:33 +0000 Subject: [PATCH 0538/2098] Unified: Hand-roll the mashalling of the JSON This avoids depending on `Foundation` (and indirectly ICU), and reduces the extractor size from 85 MiB to 31 MiB. --- unified/swift-syntax-rs/BUILD.bazel | 2 + unified/swift-syntax-rs/src/lib.rs | 21 ++++ .../SwiftSyntaxFFI/SwiftSyntaxFFI.swift | 99 +++++++++++++++++-- 3 files changed, 116 insertions(+), 6 deletions(-) diff --git a/unified/swift-syntax-rs/BUILD.bazel b/unified/swift-syntax-rs/BUILD.bazel index 374d0d784f3a..553226143cbb 100644 --- a/unified/swift-syntax-rs/BUILD.bazel +++ b/unified/swift-syntax-rs/BUILD.bazel @@ -36,7 +36,9 @@ cc_library( cc_library( name = "static_runtime_group_end", linkopts = [ + "-lBlocksRuntime", "-lc", + "-ldispatch", "-ldl", "-lm", "-lpthread", diff --git a/unified/swift-syntax-rs/src/lib.rs b/unified/swift-syntax-rs/src/lib.rs index 5f558d942fc8..a87c817a8935 100644 --- a/unified/swift-syntax-rs/src/lib.rs +++ b/unified/swift-syntax-rs/src/lib.rs @@ -120,6 +120,27 @@ mod tests { json.contains("\"kind\":\"sourceFile\""), "unexpected tree: {json}" ); + assert!( + json.contains("\"statements\":[]"), + "empty collections should be serialized as JSON arrays: {json}" + ); + } + + #[test] + fn serializes_json_strings_and_keys_deterministically() { + let source = "/* quote \" slash / backslash \\ tab \t newline\n emoji 😀 combining e\u{301} control \u{1} */\nlet x = 1"; + let json = parse_to_json(source).expect("parsing should succeed"); + + assert!( + json.contains( + r#""text":"\/* quote \" slash \/ backslash \\ tab \t newline\n emoji 😀 combining é control \u0001 *\/""# + ), + "JSON string was not escaped correctly: {json}" + ); + assert!( + json.contains(r#""start":{"column":1,"line":1,"offset":0}"#), + "JSON object keys were not sorted: {json}" + ); } #[test] diff --git a/unified/swift-syntax-rs/swift/Sources/SwiftSyntaxFFI/SwiftSyntaxFFI.swift b/unified/swift-syntax-rs/swift/Sources/SwiftSyntaxFFI/SwiftSyntaxFFI.swift index 9471c2ea143d..e423e75cf33f 100644 --- a/unified/swift-syntax-rs/swift/Sources/SwiftSyntaxFFI/SwiftSyntaxFFI.swift +++ b/unified/swift-syntax-rs/swift/Sources/SwiftSyntaxFFI/SwiftSyntaxFFI.swift @@ -1,4 +1,3 @@ -import Foundation import SwiftOperators import SwiftParser @@ -214,6 +213,93 @@ private final class PerSequenceFolder: SyntaxRewriter { } } +/// Write directly to stderr without Foundation, whose output APIs would pull ICU into static builds. +private func writeToStandardError(_ message: String) { + message.withCString { start in + var pointer = UnsafeRawPointer(start) + let end = pointer.advanced(by: strlen(start)) + while pointer != end { + let written = write(STDERR_FILENO, pointer, end - pointer) + if written <= 0 { + return + } + pointer = pointer.advanced(by: written) + } + } +} + +private struct JSONEncodingError: Error, CustomStringConvertible { + let type: Any.Type + + var description: String { + "unsupported JSON value of type \(String(reflecting: type))" + } +} + +private let hexDigits = Array("0123456789abcdef".utf8) + +private func appendJSONString(_ string: String, to output: inout [UInt8]) { + output.append(UInt8(ascii: "\"")) + for scalar in string.unicodeScalars { + switch scalar.value { + case 0x08: + output.append(contentsOf: "\\b".utf8) + case 0x09: + output.append(contentsOf: "\\t".utf8) + case 0x0a: + output.append(contentsOf: "\\n".utf8) + case 0x0c: + output.append(contentsOf: "\\f".utf8) + case 0x0d: + output.append(contentsOf: "\\r".utf8) + case 0x22: + output.append(contentsOf: "\\\"".utf8) + case 0x2f: + output.append(contentsOf: "\\/".utf8) + case 0x5c: + output.append(contentsOf: "\\\\".utf8) + case 0x00...0x1f: + output.append(contentsOf: "\\u00".utf8) + output.append(hexDigits[Int(scalar.value >> 4)]) + output.append(hexDigits[Int(scalar.value & 0x0f)]) + default: + output.append(contentsOf: String(scalar).utf8) + } + } + output.append(UInt8(ascii: "\"")) +} + +private func appendJSON(_ value: Any, to output: inout [UInt8]) throws { + switch value { + case let string as String: + appendJSONString(string, to: &output) + case let integer as Int: + output.append(contentsOf: String(integer).utf8) + case let array as [Any]: + output.append(UInt8(ascii: "[")) + for (index, element) in array.enumerated() { + if index != 0 { + output.append(UInt8(ascii: ",")) + } + try appendJSON(element, to: &output) + } + output.append(UInt8(ascii: "]")) + case let object as [String: Any]: + output.append(UInt8(ascii: "{")) + for (index, key) in object.keys.sorted().enumerated() { + if index != 0 { + output.append(UInt8(ascii: ",")) + } + appendJSONString(key, to: &output) + output.append(UInt8(ascii: ":")) + try appendJSON(object[key]!, to: &output) + } + output.append(UInt8(ascii: "}")) + default: + throw JSONEncodingError(type: type(of: value)) + } +} + /// Parse the given NUL-terminated Swift source string and return a /// heap-allocated, NUL-terminated JSON representation of the syntax tree. /// @@ -231,13 +317,14 @@ public func ssr_parse_json(_ source: UnsafePointer?) -> UnsafeMutablePoin let converter = SourceLocationConverter(fileName: "", tree: tree) let json = serialize(folded, converter) - guard - let data = try? JSONSerialization.data( - withJSONObject: json, options: [.sortedKeys]), - let string = String(data: data, encoding: .utf8) - else { + var bytes: [UInt8] = [] + do { + try appendJSON(json, to: &bytes) + } catch { + writeToStandardError("SwiftSyntaxFFI: JSON serialization failed: \(error)\n") return nil } + let string = String(decoding: bytes, as: UTF8.self) return strdup(string) } From fcdb89cdd9eafabf1466995ed4eb441f058c4021 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 26 Aug 2026 19:22:02 +0100 Subject: [PATCH 0539/2098] Rust: Rename isConstant -> hasConstant. --- .../HardcodedCryptographicValueExtensions.qll | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll index 768f684cea5b..b1a27e7b2882 100644 --- a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll @@ -62,19 +62,19 @@ module HardcodedCryptographicValue { abstract class Barrier extends DataFlow::Node { } /** - * Holds if `e` is a literal or a combination of literals that is constant. + * Holds if `e` is a literal or a combination of literals that may be a constant. */ - private predicate isConstant(Expr e) { + private predicate hasConstant(Expr e) { e instanceof LiteralExpr // e.g. `0` or - forex(Expr elem | elem = e.(ArrayListExpr).getExpr(_) | isConstant(elem)) // e.g. `[0, 0, 0, 0]` + forex(Expr elem | elem = e.(ArrayListExpr).getExpr(_) | hasConstant(elem)) // e.g. `[0, 0, 0, 0]` or - isConstant(e.(ArrayRepeatExpr).getRepeatOperand()) // e.g. `[0; 10]` + hasConstant(e.(ArrayRepeatExpr).getRepeatOperand()) // e.g. `[0; 10]` or // a match expression with one or more constant arms; taint would reach here // anyway, but we make it a source to avoid reporting many similar results // on each match arm. - isConstant(e.(MatchExpr).getMatchArmList().getAnArm().getExpr()) + hasConstant(e.(MatchExpr).getMatchArmList().getAnArm().getExpr()) or // e.g. `const MY_CONST: u64 = ...` // the constant initializer / body is the preferred source location for flow paths, when available. @@ -86,15 +86,15 @@ module HardcodedCryptographicValue { not exists(e.(ConstAccess).getConst().getBody()) or // e.g. `1 << 4` - isConstant(e.(BinaryExpr).getLhs()) and - isConstant(e.(BinaryExpr).getRhs()) + hasConstant(e.(BinaryExpr).getLhs()) and + hasConstant(e.(BinaryExpr).getRhs()) } /** * A constant, considered as a flow source. */ private class ConstantSource extends Source { - ConstantSource() { isConstant(this.asExpr()) } + ConstantSource() { hasConstant(this.asExpr()) } } /** From c0baa61dd9eab1ed0eec28c3ed13ca6675022afa Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 26 Aug 2026 19:39:51 +0100 Subject: [PATCH 0540/2098] Rust: Additional test case for arrays. --- .../HardcodedCryptographicValue.expected | 55 ++++++++++++------- .../security/CWE-798/test_cookie.rs | 8 +++ 2 files changed, 43 insertions(+), 20 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index d77634d1fd9e..8e1f1ba135a1 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -9,8 +9,10 @@ | test_cookie.rs:17:28:17:34 | [0; 64] | test_cookie.rs:17:28:17:34 | [0; 64] | test_cookie.rs:18:26:18:32 | &array1 | This hard-coded value is used as $@. | test_cookie.rs:18:26:18:32 | &array1 | a key | | test_cookie.rs:21:28:21:34 | [0; 64] | test_cookie.rs:21:28:21:34 | [0; 64] | test_cookie.rs:22:26:22:32 | &array2 | This hard-coded value is used as $@. | test_cookie.rs:22:26:22:32 | &array2 | a key | | test_cookie.rs:25:16:29:5 | match ... { ... } | test_cookie.rs:25:16:29:5 | match ... { ... } | test_cookie.rs:30:26:30:40 | str3.as_bytes() | This hard-coded value is used as $@. | test_cookie.rs:30:26:30:40 | str3.as_bytes() | a key | -| test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:50:34:50:39 | array2 | This hard-coded value is used as $@. | test_cookie.rs:50:34:50:39 | array2 | a key | -| test_cookie.rs:57:23:57:25 | 0u8 | test_cookie.rs:57:23:57:25 | 0u8 | test_cookie.rs:61:34:61:39 | array3 | This hard-coded value is used as $@. | test_cookie.rs:61:34:61:39 | array3 | a key | +| test_cookie.rs:34:9:34:9 | 1 | test_cookie.rs:34:9:34:9 | 1 | test_cookie.rs:38:26:38:32 | &array4 | This hard-coded value is used as $@. | test_cookie.rs:38:26:38:32 | &array4 | a key | +| test_cookie.rs:35:9:35:9 | 2 | test_cookie.rs:35:9:35:9 | 2 | test_cookie.rs:38:26:38:32 | &array4 | This hard-coded value is used as $@. | test_cookie.rs:38:26:38:32 | &array4 | a key | +| test_cookie.rs:54:28:54:36 | [0u8; 64] | test_cookie.rs:54:28:54:36 | [0u8; 64] | test_cookie.rs:58:34:58:39 | array2 | This hard-coded value is used as $@. | test_cookie.rs:58:34:58:39 | array2 | a key | +| test_cookie.rs:65:23:65:25 | 0u8 | test_cookie.rs:65:23:65:25 | 0u8 | test_cookie.rs:69:34:69:39 | array3 | This hard-coded value is used as $@. | test_cookie.rs:69:34:69:39 | array3 | a key | | test_heuristic.rs:38:25:38:30 | 0xFFFF | test_heuristic.rs:38:25:38:30 | 0xFFFF | test_heuristic.rs:81:22:81:31 | MY_CONST_1 | This hard-coded value is used as $@. | test_heuristic.rs:81:22:81:31 | MY_CONST_1 | a salt | | test_heuristic.rs:39:25:39:59 | ... as u64 | test_heuristic.rs:39:25:39:59 | ... as u64 | test_heuristic.rs:82:22:82:31 | MY_CONST_2 | This hard-coded value is used as $@. | test_heuristic.rs:82:22:82:31 | MY_CONST_2 | a salt | | test_heuristic.rs:40:27:40:32 | 0xFFFF | test_heuristic.rs:40:27:40:32 | 0xFFFF | test_heuristic.rs:83:22:83:32 | MY_STATIC_3 | This hard-coded value is used as $@. | test_heuristic.rs:83:22:83:32 | MY_STATIC_3 | a salt | @@ -70,16 +72,22 @@ edges | test_cookie.rs:25:16:29:5 | match ... { ... } | test_cookie.rs:25:9:25:12 | str3 | provenance | | | test_cookie.rs:30:26:30:29 | str3 | test_cookie.rs:30:26:30:40 | str3.as_bytes() [&ref] | provenance | MaD:13 | | test_cookie.rs:30:26:30:40 | str3.as_bytes() [&ref] | test_cookie.rs:30:26:30:40 | str3.as_bytes() | provenance | Sink:MaD:5 | -| test_cookie.rs:46:9:46:14 | array2 | test_cookie.rs:50:34:50:39 | array2 | provenance | Sink:MaD:1 | -| test_cookie.rs:46:18:46:37 | ...::from(...) | test_cookie.rs:46:9:46:14 | array2 | provenance | | -| test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:46:18:46:37 | ...::from(...) | provenance | MaD:8 | -| test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:46:18:46:37 | ...::from(...) | provenance | MaD:9 | -| test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:46:18:46:37 | ...::from(...) | provenance | MaD:10 | -| test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:46:18:46:37 | ...::from(...) | provenance | MaD:11 | -| test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:46:18:46:37 | ...::from(...) | provenance | MaD:12 | -| test_cookie.rs:57:9:57:14 | array3 [element] | test_cookie.rs:61:34:61:39 | array3 | provenance | Sink:MaD:1 | -| test_cookie.rs:57:23:57:25 | 0u8 | test_cookie.rs:57:23:57:29 | ...::from_elem(...) [element] | provenance | MaD:15 | -| test_cookie.rs:57:23:57:29 | ...::from_elem(...) [element] | test_cookie.rs:57:9:57:14 | array3 [element] | provenance | | +| test_cookie.rs:33:9:33:14 | array4 [element] | test_cookie.rs:38:27:38:32 | array4 [element] | provenance | | +| test_cookie.rs:33:27:37:5 | [...] [element] | test_cookie.rs:33:9:33:14 | array4 [element] | provenance | | +| test_cookie.rs:34:9:34:9 | 1 | test_cookie.rs:33:27:37:5 | [...] [element] | provenance | | +| test_cookie.rs:35:9:35:9 | 2 | test_cookie.rs:33:27:37:5 | [...] [element] | provenance | | +| test_cookie.rs:38:26:38:32 | &array4 [&ref, element] | test_cookie.rs:38:26:38:32 | &array4 | provenance | Sink:MaD:5 | +| test_cookie.rs:38:27:38:32 | array4 [element] | test_cookie.rs:38:26:38:32 | &array4 [&ref, element] | provenance | | +| test_cookie.rs:54:9:54:14 | array2 | test_cookie.rs:58:34:58:39 | array2 | provenance | Sink:MaD:1 | +| test_cookie.rs:54:18:54:37 | ...::from(...) | test_cookie.rs:54:9:54:14 | array2 | provenance | | +| test_cookie.rs:54:28:54:36 | [0u8; 64] | test_cookie.rs:54:18:54:37 | ...::from(...) | provenance | MaD:8 | +| test_cookie.rs:54:28:54:36 | [0u8; 64] | test_cookie.rs:54:18:54:37 | ...::from(...) | provenance | MaD:9 | +| test_cookie.rs:54:28:54:36 | [0u8; 64] | test_cookie.rs:54:18:54:37 | ...::from(...) | provenance | MaD:10 | +| test_cookie.rs:54:28:54:36 | [0u8; 64] | test_cookie.rs:54:18:54:37 | ...::from(...) | provenance | MaD:11 | +| test_cookie.rs:54:28:54:36 | [0u8; 64] | test_cookie.rs:54:18:54:37 | ...::from(...) | provenance | MaD:12 | +| test_cookie.rs:65:9:65:14 | array3 [element] | test_cookie.rs:69:34:69:39 | array3 | provenance | Sink:MaD:1 | +| test_cookie.rs:65:23:65:25 | 0u8 | test_cookie.rs:65:23:65:29 | ...::from_elem(...) [element] | provenance | MaD:15 | +| test_cookie.rs:65:23:65:29 | ...::from_elem(...) [element] | test_cookie.rs:65:9:65:14 | array3 [element] | provenance | | | test_heuristic.rs:38:25:38:30 | 0xFFFF | test_heuristic.rs:81:22:81:31 | MY_CONST_1 | provenance | | | test_heuristic.rs:39:25:39:59 | ... as u64 | test_heuristic.rs:82:22:82:31 | MY_CONST_2 | provenance | | | test_heuristic.rs:39:62:40:33 | static MY_STATIC_3 | test_heuristic.rs:83:22:83:32 | MY_STATIC_3 | provenance | | @@ -163,14 +171,21 @@ nodes | test_cookie.rs:30:26:30:29 | str3 | semmle.label | str3 | | test_cookie.rs:30:26:30:40 | str3.as_bytes() | semmle.label | str3.as_bytes() | | test_cookie.rs:30:26:30:40 | str3.as_bytes() [&ref] | semmle.label | str3.as_bytes() [&ref] | -| test_cookie.rs:46:9:46:14 | array2 | semmle.label | array2 | -| test_cookie.rs:46:18:46:37 | ...::from(...) | semmle.label | ...::from(...) | -| test_cookie.rs:46:28:46:36 | [0u8; 64] | semmle.label | [0u8; 64] | -| test_cookie.rs:50:34:50:39 | array2 | semmle.label | array2 | -| test_cookie.rs:57:9:57:14 | array3 [element] | semmle.label | array3 [element] | -| test_cookie.rs:57:23:57:25 | 0u8 | semmle.label | 0u8 | -| test_cookie.rs:57:23:57:29 | ...::from_elem(...) [element] | semmle.label | ...::from_elem(...) [element] | -| test_cookie.rs:61:34:61:39 | array3 | semmle.label | array3 | +| test_cookie.rs:33:9:33:14 | array4 [element] | semmle.label | array4 [element] | +| test_cookie.rs:33:27:37:5 | [...] [element] | semmle.label | [...] [element] | +| test_cookie.rs:34:9:34:9 | 1 | semmle.label | 1 | +| test_cookie.rs:35:9:35:9 | 2 | semmle.label | 2 | +| test_cookie.rs:38:26:38:32 | &array4 | semmle.label | &array4 | +| test_cookie.rs:38:26:38:32 | &array4 [&ref, element] | semmle.label | &array4 [&ref, element] | +| test_cookie.rs:38:27:38:32 | array4 [element] | semmle.label | array4 [element] | +| test_cookie.rs:54:9:54:14 | array2 | semmle.label | array2 | +| test_cookie.rs:54:18:54:37 | ...::from(...) | semmle.label | ...::from(...) | +| test_cookie.rs:54:28:54:36 | [0u8; 64] | semmle.label | [0u8; 64] | +| test_cookie.rs:58:34:58:39 | array2 | semmle.label | array2 | +| test_cookie.rs:65:9:65:14 | array3 [element] | semmle.label | array3 [element] | +| test_cookie.rs:65:23:65:25 | 0u8 | semmle.label | 0u8 | +| test_cookie.rs:65:23:65:29 | ...::from_elem(...) [element] | semmle.label | ...::from_elem(...) [element] | +| test_cookie.rs:69:34:69:39 | array3 | semmle.label | array3 | | test_heuristic.rs:38:25:38:30 | 0xFFFF | semmle.label | 0xFFFF | | test_heuristic.rs:39:25:39:59 | ... as u64 | semmle.label | ... as u64 | | test_heuristic.rs:39:62:40:33 | static MY_STATIC_3 | semmle.label | static MY_STATIC_3 | diff --git a/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs b/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs index 410ddf1b8aaa..cc051bb658aa 100644 --- a/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs +++ b/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs @@ -29,6 +29,14 @@ fn test_cookie_jar(array_var: &[u8], val: u64) { }; // $ Alert[rust/hard-coded-cryptographic-value] let key3 = Key::from(str3.as_bytes()); // $ Sink _ = jar.signed_mut(&key3); + + let array4: [u8; 3] = [ + 1, // $ Alert[rust/hard-coded-cryptographic-value] + 2, // $ Alert[rust/hard-coded-cryptographic-value] + val as u8 + ]; + let key4 = Key::from(&array4); // $ Sink + _ = jar.signed_mut(&key4); } fn test_biscotti_crypto(array_var: &[u8]) { From 02d670aa513cfd8277718a8f0efc603fe74d41b3 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 26 Aug 2026 19:29:05 +0100 Subject: [PATCH 0541/2098] Rust: Make hasConstant behaviour on arrays consistent. --- .../HardcodedCryptographicValueExtensions.qll | 7 ++++-- .../HardcodedCryptographicValue.expected | 23 ++++++++----------- .../security/CWE-798/test_cookie.rs | 6 ++--- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll index b1a27e7b2882..71f2f4cdbe31 100644 --- a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll @@ -62,12 +62,15 @@ module HardcodedCryptographicValue { abstract class Barrier extends DataFlow::Node { } /** - * Holds if `e` is a literal or a combination of literals that may be a constant. + * Holds if `e` is a literal or an expression that contains a constant. For example: + * ``` + * ["hello", "world", s] + * ``` */ private predicate hasConstant(Expr e) { e instanceof LiteralExpr // e.g. `0` or - forex(Expr elem | elem = e.(ArrayListExpr).getExpr(_) | hasConstant(elem)) // e.g. `[0, 0, 0, 0]` + exists(Expr elem | elem = e.(ArrayListExpr).getExpr(_) | hasConstant(elem)) // e.g. `[0, 0, 0, 0]` or hasConstant(e.(ArrayRepeatExpr).getRepeatOperand()) // e.g. `[0; 10]` or diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index 8e1f1ba135a1..039891ffb4d6 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -9,8 +9,7 @@ | test_cookie.rs:17:28:17:34 | [0; 64] | test_cookie.rs:17:28:17:34 | [0; 64] | test_cookie.rs:18:26:18:32 | &array1 | This hard-coded value is used as $@. | test_cookie.rs:18:26:18:32 | &array1 | a key | | test_cookie.rs:21:28:21:34 | [0; 64] | test_cookie.rs:21:28:21:34 | [0; 64] | test_cookie.rs:22:26:22:32 | &array2 | This hard-coded value is used as $@. | test_cookie.rs:22:26:22:32 | &array2 | a key | | test_cookie.rs:25:16:29:5 | match ... { ... } | test_cookie.rs:25:16:29:5 | match ... { ... } | test_cookie.rs:30:26:30:40 | str3.as_bytes() | This hard-coded value is used as $@. | test_cookie.rs:30:26:30:40 | str3.as_bytes() | a key | -| test_cookie.rs:34:9:34:9 | 1 | test_cookie.rs:34:9:34:9 | 1 | test_cookie.rs:38:26:38:32 | &array4 | This hard-coded value is used as $@. | test_cookie.rs:38:26:38:32 | &array4 | a key | -| test_cookie.rs:35:9:35:9 | 2 | test_cookie.rs:35:9:35:9 | 2 | test_cookie.rs:38:26:38:32 | &array4 | This hard-coded value is used as $@. | test_cookie.rs:38:26:38:32 | &array4 | a key | +| test_cookie.rs:33:27:37:5 | [...] | test_cookie.rs:33:27:37:5 | [...] | test_cookie.rs:38:26:38:32 | &array4 | This hard-coded value is used as $@. | test_cookie.rs:38:26:38:32 | &array4 | a key | | test_cookie.rs:54:28:54:36 | [0u8; 64] | test_cookie.rs:54:28:54:36 | [0u8; 64] | test_cookie.rs:58:34:58:39 | array2 | This hard-coded value is used as $@. | test_cookie.rs:58:34:58:39 | array2 | a key | | test_cookie.rs:65:23:65:25 | 0u8 | test_cookie.rs:65:23:65:25 | 0u8 | test_cookie.rs:69:34:69:39 | array3 | This hard-coded value is used as $@. | test_cookie.rs:69:34:69:39 | array3 | a key | | test_heuristic.rs:38:25:38:30 | 0xFFFF | test_heuristic.rs:38:25:38:30 | 0xFFFF | test_heuristic.rs:81:22:81:31 | MY_CONST_1 | This hard-coded value is used as $@. | test_heuristic.rs:81:22:81:31 | MY_CONST_1 | a salt | @@ -72,12 +71,10 @@ edges | test_cookie.rs:25:16:29:5 | match ... { ... } | test_cookie.rs:25:9:25:12 | str3 | provenance | | | test_cookie.rs:30:26:30:29 | str3 | test_cookie.rs:30:26:30:40 | str3.as_bytes() [&ref] | provenance | MaD:13 | | test_cookie.rs:30:26:30:40 | str3.as_bytes() [&ref] | test_cookie.rs:30:26:30:40 | str3.as_bytes() | provenance | Sink:MaD:5 | -| test_cookie.rs:33:9:33:14 | array4 [element] | test_cookie.rs:38:27:38:32 | array4 [element] | provenance | | -| test_cookie.rs:33:27:37:5 | [...] [element] | test_cookie.rs:33:9:33:14 | array4 [element] | provenance | | -| test_cookie.rs:34:9:34:9 | 1 | test_cookie.rs:33:27:37:5 | [...] [element] | provenance | | -| test_cookie.rs:35:9:35:9 | 2 | test_cookie.rs:33:27:37:5 | [...] [element] | provenance | | -| test_cookie.rs:38:26:38:32 | &array4 [&ref, element] | test_cookie.rs:38:26:38:32 | &array4 | provenance | Sink:MaD:5 | -| test_cookie.rs:38:27:38:32 | array4 [element] | test_cookie.rs:38:26:38:32 | &array4 [&ref, element] | provenance | | +| test_cookie.rs:33:9:33:14 | array4 | test_cookie.rs:38:27:38:32 | array4 | provenance | | +| test_cookie.rs:33:27:37:5 | [...] | test_cookie.rs:33:9:33:14 | array4 | provenance | | +| test_cookie.rs:38:26:38:32 | &array4 [&ref] | test_cookie.rs:38:26:38:32 | &array4 | provenance | Sink:MaD:5 | +| test_cookie.rs:38:27:38:32 | array4 | test_cookie.rs:38:26:38:32 | &array4 [&ref] | provenance | | | test_cookie.rs:54:9:54:14 | array2 | test_cookie.rs:58:34:58:39 | array2 | provenance | Sink:MaD:1 | | test_cookie.rs:54:18:54:37 | ...::from(...) | test_cookie.rs:54:9:54:14 | array2 | provenance | | | test_cookie.rs:54:28:54:36 | [0u8; 64] | test_cookie.rs:54:18:54:37 | ...::from(...) | provenance | MaD:8 | @@ -171,13 +168,11 @@ nodes | test_cookie.rs:30:26:30:29 | str3 | semmle.label | str3 | | test_cookie.rs:30:26:30:40 | str3.as_bytes() | semmle.label | str3.as_bytes() | | test_cookie.rs:30:26:30:40 | str3.as_bytes() [&ref] | semmle.label | str3.as_bytes() [&ref] | -| test_cookie.rs:33:9:33:14 | array4 [element] | semmle.label | array4 [element] | -| test_cookie.rs:33:27:37:5 | [...] [element] | semmle.label | [...] [element] | -| test_cookie.rs:34:9:34:9 | 1 | semmle.label | 1 | -| test_cookie.rs:35:9:35:9 | 2 | semmle.label | 2 | +| test_cookie.rs:33:9:33:14 | array4 | semmle.label | array4 | +| test_cookie.rs:33:27:37:5 | [...] | semmle.label | [...] | | test_cookie.rs:38:26:38:32 | &array4 | semmle.label | &array4 | -| test_cookie.rs:38:26:38:32 | &array4 [&ref, element] | semmle.label | &array4 [&ref, element] | -| test_cookie.rs:38:27:38:32 | array4 [element] | semmle.label | array4 [element] | +| test_cookie.rs:38:26:38:32 | &array4 [&ref] | semmle.label | &array4 [&ref] | +| test_cookie.rs:38:27:38:32 | array4 | semmle.label | array4 | | test_cookie.rs:54:9:54:14 | array2 | semmle.label | array2 | | test_cookie.rs:54:18:54:37 | ...::from(...) | semmle.label | ...::from(...) | | test_cookie.rs:54:28:54:36 | [0u8; 64] | semmle.label | [0u8; 64] | diff --git a/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs b/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs index cc051bb658aa..f28491c713ee 100644 --- a/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs +++ b/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs @@ -31,10 +31,10 @@ fn test_cookie_jar(array_var: &[u8], val: u64) { _ = jar.signed_mut(&key3); let array4: [u8; 3] = [ - 1, // $ Alert[rust/hard-coded-cryptographic-value] - 2, // $ Alert[rust/hard-coded-cryptographic-value] + 1, + 2, val as u8 - ]; + ]; // $ Alert[rust/hard-coded-cryptographic-value] let key4 = Key::from(&array4); // $ Sink _ = jar.signed_mut(&key4); } From 5bcbb8f2137b304ba32d9cb7c76ce3908d0d87a2 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 26 Aug 2026 22:24:45 +0100 Subject: [PATCH 0542/2098] Rust: Accept changes to .expected files following merge. --- .../format-macros-legacy/FormatArgs.expected | 18 +++--- .../LogInjection.expected | 24 ++++---- .../inline-taint-flow.expected | 55 +++++++------------ 3 files changed, 42 insertions(+), 55 deletions(-) diff --git a/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.expected b/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.expected index d8373ec3f9e3..56bf946de0e7 100644 --- a/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.expected +++ b/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.expected @@ -1,12 +1,12 @@ -| main.rs:13:18:13:24 | FormatArgsExpr | 1 | -| main.rs:16:18:16:22 | FormatArgsExpr | 0 | -| main.rs:19:21:19:35 | FormatArgsExpr | 1 | +| main.rs:13:10:13:25 | FormatArgsExpr | 1 | +| main.rs:16:10:16:23 | FormatArgsExpr | 0 | +| main.rs:19:13:19:36 | FormatArgsExpr | 1 | | main.rs:27:25:27:33 | FormatArgsExpr | 1 | | main.rs:38:40:38:46 | FormatArgsExpr | 0 | | main.rs:43:52:43:58 | FormatArgsExpr | 0 | -| main.rs:49:26:49:32 | FormatArgsExpr | 1 | -| main.rs:54:28:54:32 | FormatArgsExpr | 0 | -| main.rs:64:14:64:26 | FormatArgsExpr | 1 | -| main.rs:65:15:65:25 | FormatArgsExpr | 0 | -| main.rs:66:12:66:24 | FormatArgsExpr | 1 | -| main.rs:67:13:67:23 | FormatArgsExpr | 0 | +| main.rs:49:13:49:33 | FormatArgsExpr | 1 | +| main.rs:54:13:54:33 | FormatArgsExpr | 0 | +| main.rs:64:5:64:27 | FormatArgsExpr | 1 | +| main.rs:65:5:65:26 | FormatArgsExpr | 0 | +| main.rs:66:5:66:25 | FormatArgsExpr | 1 | +| main.rs:67:5:67:24 | FormatArgsExpr | 0 | diff --git a/rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected b/rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected index b294b89e83fb..853f6f401549 100644 --- a/rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected +++ b/rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected @@ -1,13 +1,13 @@ #select -| main.rs:64:14:64:26 | MacroExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:64:14:64:26 | MacroExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | -| main.rs:65:15:65:25 | MacroExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:65:15:65:25 | MacroExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | -| main.rs:66:12:66:24 | MacroExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:66:12:66:24 | MacroExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | -| main.rs:67:13:67:23 | MacroExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:67:13:67:23 | MacroExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | +| main.rs:64:5:64:27 | FormatArgsExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:64:5:64:27 | FormatArgsExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | +| main.rs:65:5:65:26 | FormatArgsExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:65:5:65:26 | FormatArgsExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | +| main.rs:66:5:66:25 | FormatArgsExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:66:5:66:25 | FormatArgsExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | +| main.rs:67:5:67:24 | FormatArgsExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:67:5:67:24 | FormatArgsExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | edges -| main.rs:62:9:62:15 | tainted | main.rs:64:14:64:26 | MacroExpr | provenance | Sink:MaD:2 | -| main.rs:62:9:62:15 | tainted | main.rs:65:15:65:25 | MacroExpr | provenance | Sink:MaD:1 | -| main.rs:62:9:62:15 | tainted | main.rs:66:12:66:24 | MacroExpr | provenance | Sink:MaD:2 | -| main.rs:62:9:62:15 | tainted | main.rs:67:13:67:23 | MacroExpr | provenance | Sink:MaD:1 | +| main.rs:62:9:62:15 | tainted | main.rs:64:5:64:27 | FormatArgsExpr | provenance | Sink:MaD:2 | +| main.rs:62:9:62:15 | tainted | main.rs:65:5:65:26 | FormatArgsExpr | provenance | Sink:MaD:1 | +| main.rs:62:9:62:15 | tainted | main.rs:66:5:66:25 | FormatArgsExpr | provenance | Sink:MaD:2 | +| main.rs:62:9:62:15 | tainted | main.rs:67:5:67:24 | FormatArgsExpr | provenance | Sink:MaD:1 | | main.rs:62:19:62:45 | ...::var(...) | main.rs:62:19:62:45 | ...::var(...) [Ok] | provenance | Src:MaD:3 | | main.rs:62:19:62:45 | ...::var(...) [Ok] | main.rs:62:19:62:65 | ... .unwrap_or_default() | provenance | MaD:4 | | main.rs:62:19:62:65 | ... .unwrap_or_default() | main.rs:62:9:62:15 | tainted | provenance | | @@ -21,8 +21,8 @@ nodes | main.rs:62:19:62:45 | ...::var(...) | semmle.label | ...::var(...) | | main.rs:62:19:62:45 | ...::var(...) [Ok] | semmle.label | ...::var(...) [Ok] | | main.rs:62:19:62:65 | ... .unwrap_or_default() | semmle.label | ... .unwrap_or_default() | -| main.rs:64:14:64:26 | MacroExpr | semmle.label | MacroExpr | -| main.rs:65:15:65:25 | MacroExpr | semmle.label | MacroExpr | -| main.rs:66:12:66:24 | MacroExpr | semmle.label | MacroExpr | -| main.rs:67:13:67:23 | MacroExpr | semmle.label | MacroExpr | +| main.rs:64:5:64:27 | FormatArgsExpr | semmle.label | FormatArgsExpr | +| main.rs:65:5:65:26 | FormatArgsExpr | semmle.label | FormatArgsExpr | +| main.rs:66:5:66:25 | FormatArgsExpr | semmle.label | FormatArgsExpr | +| main.rs:67:5:67:24 | FormatArgsExpr | semmle.label | FormatArgsExpr | subpaths diff --git a/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected b/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected index b296895ca1ac..5e0b16c93af7 100644 --- a/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected +++ b/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected @@ -4,27 +4,20 @@ models | 3 | Summary: core::fmt::Write::write_fmt; Argument[0]; Argument[self].Reference; taint | | 4 | Summary: core::fmt::Write::write_str; Argument[0].Reference; Argument[self].Reference; taint | | 5 | Summary: core::fmt::write; Argument[1]; Argument[0].Reference; taint | -| 6 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | edges -| main.rs:12:9:12:9 | a | main.rs:13:18:13:24 | MacroExpr | provenance | | +| main.rs:12:9:12:9 | a | main.rs:13:10:13:25 | FormatArgsExpr | provenance | | | main.rs:12:13:12:21 | source(...) | main.rs:12:9:12:9 | a | provenance | | -| main.rs:13:18:13:24 | ...::format(...) | main.rs:13:18:13:24 | { ... } | provenance | | -| main.rs:13:18:13:24 | ...::must_use(...) | main.rs:13:10:13:25 | MacroExpr | provenance | | -| main.rs:13:18:13:24 | MacroExpr | main.rs:13:18:13:24 | ...::format(...) | provenance | MaD:2 | -| main.rs:13:18:13:24 | { ... } | main.rs:13:18:13:24 | ...::must_use(...) | provenance | MaD:6 | -| main.rs:15:9:15:9 | b | main.rs:16:18:16:22 | MacroExpr | provenance | | +| main.rs:13:10:13:25 | ...::format(...) | main.rs:13:10:13:25 | MacroExpr | provenance | | +| main.rs:13:10:13:25 | FormatArgsExpr | main.rs:13:10:13:25 | ...::format(...) | provenance | MaD:2 | +| main.rs:15:9:15:9 | b | main.rs:16:10:16:23 | FormatArgsExpr | provenance | | | main.rs:15:13:15:21 | source(...) | main.rs:15:9:15:9 | b | provenance | | -| main.rs:16:18:16:22 | ...::format(...) | main.rs:16:18:16:22 | { ... } | provenance | | -| main.rs:16:18:16:22 | ...::must_use(...) | main.rs:16:10:16:23 | MacroExpr | provenance | | -| main.rs:16:18:16:22 | MacroExpr | main.rs:16:18:16:22 | ...::format(...) | provenance | MaD:2 | -| main.rs:16:18:16:22 | { ... } | main.rs:16:18:16:22 | ...::must_use(...) | provenance | MaD:6 | -| main.rs:18:9:18:9 | c | main.rs:19:21:19:35 | MacroExpr | provenance | | +| main.rs:16:10:16:23 | ...::format(...) | main.rs:16:10:16:23 | MacroExpr | provenance | | +| main.rs:16:10:16:23 | FormatArgsExpr | main.rs:16:10:16:23 | ...::format(...) | provenance | MaD:2 | +| main.rs:18:9:18:9 | c | main.rs:19:13:19:36 | FormatArgsExpr | provenance | | | main.rs:18:13:18:21 | source(...) | main.rs:18:9:18:9 | c | provenance | | | main.rs:19:9:19:9 | s | main.rs:20:10:20:10 | s | provenance | | -| main.rs:19:21:19:35 | ...::format(...) | main.rs:19:21:19:35 | { ... } | provenance | | -| main.rs:19:21:19:35 | ...::must_use(...) | main.rs:19:9:19:9 | s | provenance | | -| main.rs:19:21:19:35 | MacroExpr | main.rs:19:21:19:35 | ...::format(...) | provenance | MaD:2 | -| main.rs:19:21:19:35 | { ... } | main.rs:19:21:19:35 | ...::must_use(...) | provenance | MaD:6 | +| main.rs:19:13:19:36 | ...::format(...) | main.rs:19:9:19:9 | s | provenance | | +| main.rs:19:13:19:36 | FormatArgsExpr | main.rs:19:13:19:36 | ...::format(...) | provenance | MaD:2 | | main.rs:26:9:26:9 | a | main.rs:27:9:27:9 | b | provenance | | | main.rs:26:13:26:21 | source(...) | main.rs:26:9:26:9 | a | provenance | | | main.rs:27:9:27:9 | b | main.rs:28:30:28:30 | b | provenance | | @@ -45,36 +38,30 @@ edges | main.rs:43:29:43:37 | [post] &mut buf3 [&ref] | main.rs:43:34:43:37 | [post] buf3 | provenance | | | main.rs:43:34:43:37 | [post] buf3 | main.rs:44:10:44:13 | buf3 | provenance | | | main.rs:43:40:43:58 | MacroExpr | main.rs:43:29:43:37 | [post] &mut buf3 [&ref] | provenance | MaD:5 | -| main.rs:48:9:48:9 | g | main.rs:49:26:49:32 | MacroExpr | provenance | | +| main.rs:48:9:48:9 | g | main.rs:49:13:49:33 | FormatArgsExpr | provenance | | | main.rs:48:13:48:21 | source(...) | main.rs:48:9:48:9 | g | provenance | | +| main.rs:49:13:49:33 | FormatArgsExpr | main.rs:49:20:49:23 | [post] buf4 | provenance | MaD:3 | | main.rs:49:20:49:23 | [post] buf4 | main.rs:50:10:50:13 | buf4 | provenance | | -| main.rs:49:26:49:32 | MacroExpr | main.rs:49:20:49:23 | [post] buf4 | provenance | MaD:3 | -| main.rs:53:9:53:9 | h | main.rs:54:28:54:32 | MacroExpr | provenance | | +| main.rs:53:9:53:9 | h | main.rs:54:13:54:33 | FormatArgsExpr | provenance | | | main.rs:53:13:53:21 | source(...) | main.rs:53:9:53:9 | h | provenance | | +| main.rs:54:13:54:33 | FormatArgsExpr | main.rs:54:22:54:25 | [post] buf5 | provenance | MaD:3 | | main.rs:54:22:54:25 | [post] buf5 | main.rs:55:10:55:13 | buf5 | provenance | | -| main.rs:54:28:54:32 | MacroExpr | main.rs:54:22:54:25 | [post] buf5 | provenance | MaD:3 | nodes | main.rs:12:9:12:9 | a | semmle.label | a | | main.rs:12:13:12:21 | source(...) | semmle.label | source(...) | +| main.rs:13:10:13:25 | ...::format(...) | semmle.label | ...::format(...) | +| main.rs:13:10:13:25 | FormatArgsExpr | semmle.label | FormatArgsExpr | | main.rs:13:10:13:25 | MacroExpr | semmle.label | MacroExpr | -| main.rs:13:18:13:24 | ...::format(...) | semmle.label | ...::format(...) | -| main.rs:13:18:13:24 | ...::must_use(...) | semmle.label | ...::must_use(...) | -| main.rs:13:18:13:24 | MacroExpr | semmle.label | MacroExpr | -| main.rs:13:18:13:24 | { ... } | semmle.label | { ... } | | main.rs:15:9:15:9 | b | semmle.label | b | | main.rs:15:13:15:21 | source(...) | semmle.label | source(...) | +| main.rs:16:10:16:23 | ...::format(...) | semmle.label | ...::format(...) | +| main.rs:16:10:16:23 | FormatArgsExpr | semmle.label | FormatArgsExpr | | main.rs:16:10:16:23 | MacroExpr | semmle.label | MacroExpr | -| main.rs:16:18:16:22 | ...::format(...) | semmle.label | ...::format(...) | -| main.rs:16:18:16:22 | ...::must_use(...) | semmle.label | ...::must_use(...) | -| main.rs:16:18:16:22 | MacroExpr | semmle.label | MacroExpr | -| main.rs:16:18:16:22 | { ... } | semmle.label | { ... } | | main.rs:18:9:18:9 | c | semmle.label | c | | main.rs:18:13:18:21 | source(...) | semmle.label | source(...) | | main.rs:19:9:19:9 | s | semmle.label | s | -| main.rs:19:21:19:35 | ...::format(...) | semmle.label | ...::format(...) | -| main.rs:19:21:19:35 | ...::must_use(...) | semmle.label | ...::must_use(...) | -| main.rs:19:21:19:35 | MacroExpr | semmle.label | MacroExpr | -| main.rs:19:21:19:35 | { ... } | semmle.label | { ... } | +| main.rs:19:13:19:36 | ...::format(...) | semmle.label | ...::format(...) | +| main.rs:19:13:19:36 | FormatArgsExpr | semmle.label | FormatArgsExpr | | main.rs:20:10:20:10 | s | semmle.label | s | | main.rs:26:9:26:9 | a | semmle.label | a | | main.rs:26:13:26:21 | source(...) | semmle.label | source(...) | @@ -102,13 +89,13 @@ nodes | main.rs:44:10:44:13 | buf3 | semmle.label | buf3 | | main.rs:48:9:48:9 | g | semmle.label | g | | main.rs:48:13:48:21 | source(...) | semmle.label | source(...) | +| main.rs:49:13:49:33 | FormatArgsExpr | semmle.label | FormatArgsExpr | | main.rs:49:20:49:23 | [post] buf4 | semmle.label | [post] buf4 | -| main.rs:49:26:49:32 | MacroExpr | semmle.label | MacroExpr | | main.rs:50:10:50:13 | buf4 | semmle.label | buf4 | | main.rs:53:9:53:9 | h | semmle.label | h | | main.rs:53:13:53:21 | source(...) | semmle.label | source(...) | +| main.rs:54:13:54:33 | FormatArgsExpr | semmle.label | FormatArgsExpr | | main.rs:54:22:54:25 | [post] buf5 | semmle.label | [post] buf5 | -| main.rs:54:28:54:32 | MacroExpr | semmle.label | MacroExpr | | main.rs:55:10:55:13 | buf5 | semmle.label | buf5 | subpaths testFailures From f2505dff21e3f4fb886fe447a0665d706afb16e2 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Thu, 27 Aug 2026 08:49:18 +0200 Subject: [PATCH 0543/2098] Rust: Refactor `reconstruct` and `split_arguments` `split_argument` didn't do much for `wrap`s that where not `Wrap::WriteMethod`. We refactor `reconstruct` to only apply when `split_argument` for `Wrap::WriteMethod`. This simplifies `split_arguments` and avoids the `expect` call in `reconstruct`. --- rust/extractor/src/translate/format_args.rs | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/rust/extractor/src/translate/format_args.rs b/rust/extractor/src/translate/format_args.rs index 3fe0c048b208..c6ac1b9b8d0d 100644 --- a/rust/extractor/src/translate/format_args.rs +++ b/rust/extractor/src/translate/format_args.rs @@ -56,7 +56,6 @@ pub(crate) fn reconstruct( input: &tt::TopSubtree, call_site: Span, ) -> Option { - let (writer, content) = split_arguments(wrap, input)?; let emitter = Emitter { call_site, format_args_parens: input.view().top_subtree().delimiter, @@ -64,13 +63,14 @@ pub(crate) fn reconstruct( let mut builder = tt::TopSubtreeBuilder::new(tt::Delimiter::invisible_spanned(call_site)); match wrap { - Wrap::Bare => emitter.push_format_args(&mut builder, content), + Wrap::Bare => emitter.push_format_args(&mut builder, input.view().token_trees()), Wrap::Call(path) => { emitter.push_path(&mut builder, path); - emitter.push_parenthesized_format_args(&mut builder, content); + emitter.push_parenthesized_format_args(&mut builder, input.view().token_trees()); } Wrap::WriteMethod => { - builder.extend_with_tt(writer.expect("write! split always yields a writer")); + let (writer, content) = split_arguments(input)?; + builder.extend_with_tt(writer); builder.push(emitter.punct('.', tt::Spacing::Alone)); builder.push(emitter.ident("write_fmt")); emitter.push_parenthesized_format_args(&mut builder, content); @@ -82,12 +82,8 @@ pub(crate) fn reconstruct( /// Splits the macro argument list into the leading writer (for `write!`/`writeln!`, /// everything up to the first top-level comma) and the format arguments. fn split_arguments<'a>( - wrap: Wrap, input: &'a tt::TopSubtree, -) -> Option<(Option>, tt::TokenTreesView<'a>)> { - if wrap != Wrap::WriteMethod { - return Some((None, input.view().token_trees())); - } +) -> Option<(tt::TokenTreesView<'a>, tt::TokenTreesView<'a>)> { let mut iter = input.view().iter(); let start = iter.savepoint(); let mut found_comma = false; @@ -105,7 +101,7 @@ fn split_arguments<'a>( } let writer = iter.from_savepoint(start); iter.next(); // consume the comma - Some((Some(writer), iter.remaining())) + Some((writer, iter.remaining())) } /// Emits the synthesized tokens, tagging them with the macro call site span. From aa4875c749a9027270b2a246a8b215c2fe3598fd Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Thu, 27 Aug 2026 08:53:04 +0200 Subject: [PATCH 0544/2098] Rust: Make the `path` in `Translator` a `PathBuf` --- rust/extractor/src/main.rs | 5 ++--- rust/extractor/src/translate/base.rs | 9 +++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/rust/extractor/src/main.rs b/rust/extractor/src/main.rs index 145abee4505d..7a335f916614 100644 --- a/rust/extractor/src/main.rs +++ b/rust/extractor/src/main.rs @@ -64,12 +64,11 @@ impl<'a> Extractor<'a> { let before_extract = Instant::now(); let line_index = LineIndex::new(text.as_ref()); - let display_path = file.to_string_lossy(); let mut trap = self.traps.create("source", file); let label = trap.emit_file(file); let mut translator = translate::Translator::new( trap, - display_path.as_ref(), + file, label, line_index, semantics_info.as_ref().ok(), @@ -98,7 +97,7 @@ impl<'a> Extractor<'a> { translator.trap.commit().unwrap_or_else(|err| { error!( "Failed to write trap file for: {}: {}", - display_path, + file.display(), err.to_string() ) }); diff --git a/rust/extractor/src/translate/base.rs b/rust/extractor/src/translate/base.rs index 800e693176e5..d25ca31e6de3 100644 --- a/rust/extractor/src/translate/base.rs +++ b/rust/extractor/src/translate/base.rs @@ -21,6 +21,7 @@ use ra_ap_syntax::{ use ra_ap_syntax_bridge::{ DocCommentDesugarMode, syntax_node_to_token_tree, token_tree_to_syntax_node, }; +use std::path::{Path, PathBuf}; impl Emission for Translator<'_> { fn pre_emit(&mut self, node: &ast::Item) -> Option> { @@ -125,7 +126,7 @@ pub enum SourceKind { pub struct Translator<'db> { pub trap: TrapFile, - path: String, + path: PathBuf, label: Label, line_index: LineIndex, file_id: Option, @@ -147,7 +148,7 @@ const DIAGNOSTIC_LIMIT_PER_FILE: usize = 100; impl<'db> Translator<'db> { pub fn new( trap: TrapFile, - path: &str, + path: &Path, label: Label, line_index: LineIndex, semantic_info: Option<&FileSemanticInformation<'db>>, @@ -155,7 +156,7 @@ impl<'db> Translator<'db> { ) -> Translator<'db> { Translator { trap, - path: path.to_owned(), + path: path.to_path_buf(), label, line_index, file_id: semantic_info.map(|i| i.file_id), @@ -293,7 +294,7 @@ impl<'db> Translator<'db> { dispatch_to_tracing!( severity, "{}:{}:{}: {}", - self.path, + self.path.display(), start.line + 1, start.col + 1, &full_message, From fd0b81334f32f474aee5ea36aa18933d6b57eb47 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Wed, 26 Aug 2026 16:52:25 +0200 Subject: [PATCH 0545/2098] Docs: add linux-arm64 to supported platforms Add arm64 to the Linux row of the customer-facing supported-platforms table, following the existing macOS Apple Silicon precedent. Marked as beta via a new footnote. Part of native Linux Arm64 support. Release-gated: must land together with the actual arm release. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- docs/codeql/reusables/supported-platforms.rst | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/codeql/reusables/supported-platforms.rst b/docs/codeql/reusables/supported-platforms.rst index 5e679da12fa2..4205eef267d6 100644 --- a/docs/codeql/reusables/supported-platforms.rst +++ b/docs/codeql/reusables/supported-platforms.rst @@ -6,7 +6,7 @@ Operating system,Supported versions,Supported CPU architectures Linux,"Ubuntu 22.04 - Ubuntu 24.04","x86-64" + Ubuntu 24.04","x86-64, arm64 [1]_" Windows,"Windows 10 / Windows Server 2019 Windows 11 / Windows Server 2022/2025","x86-64" @@ -14,8 +14,10 @@ macOS 15 Sequoia - macOS 26 Tahoe","x86-64, arm64 (Apple Silicon) [1]_" + macOS 26 Tahoe","x86-64, arm64 (Apple Silicon) [2]_" .. container:: footnote-group - .. [1] Support for Apple Silicon is currently in beta. + .. [1] Support for Linux on arm64 is currently in beta. + + .. [2] Support for Apple Silicon is currently in beta. From abf5a0dd07276c62b8eaad5f6d0513465ef35053 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Thu, 27 Aug 2026 11:39:38 +0200 Subject: [PATCH 0546/2098] Python: translate Rust escapes in `tsg-python` output `tsg-python` serialises strings with Rust's `Debug` formatting, which `literal_eval` on the Python side disagrees with in two ways: - characters Rust considers non-printable, including grapheme-extending ones such as U+FE0F, U+200D and combining accents, come out as `\u{...}`, which Python does not accept at all; - NUL comes out as `\0`, which Python reads as the start of an *octal* escape, so `"\0" + "1"` silently decodes to U+0001. Everything else Rust emits round-trips, verified exhaustively over every Unicode scalar value paired with every printable ASCII neighbour. Also stop `Logger.log` from applying `%`-formatting when there are no arguments, which turned the resulting warning into a `TypeError` and dropped the whole file from the analysis when the offending literal happened to contain a `%` directive. Along the way, settle on `warning` as the logger method name, matching `Logger` and the standard library. `Logger.warn` never existed, so the two remaining `logger.warn` calls would have raised `AttributeError`. Fixes #22435 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- python/extractor/semmle/logging.py | 10 +- python/extractor/semmle/python/imports.py | 2 +- .../semmle/python/parser/dump_ast.py | 4 +- .../semmle/python/parser/tsg_parser.py | 31 ++++ python/extractor/semmle/python/passes/flow.py | 4 +- python/extractor/semmle/worker.py | 2 +- .../tests/parser/unicode_escapes_new.expected | 150 ++++++++++++++++++ .../tests/parser/unicode_escapes_new.py | 28 ++++ python/extractor/tests/test_tsg_parser.py | 77 +++++++++ python/extractor/tsg-python/src/main.rs | 3 + .../2026-08-27-tsg-parser-unicode-escapes.md | 4 + 11 files changed, 308 insertions(+), 7 deletions(-) create mode 100644 python/extractor/tests/parser/unicode_escapes_new.expected create mode 100644 python/extractor/tests/parser/unicode_escapes_new.py create mode 100644 python/extractor/tests/test_tsg_parser.py create mode 100644 python/ql/lib/change-notes/2026-08-27-tsg-parser-unicode-escapes.md diff --git a/python/extractor/semmle/logging.py b/python/extractor/semmle/logging.py index 31805040bf6d..64037163e697 100644 --- a/python/extractor/semmle/logging.py +++ b/python/extractor/semmle/logging.py @@ -65,6 +65,14 @@ def write_message_with_proc(level, proc_id, text): _logging_process = None +def format_message(fmt, args): + '''Applies `%`-formatting to `fmt`, but only when there are arguments to interpolate. + + This mirrors the standard library's `logging` behaviour, and means that a message that has + already been formatted -- and may therefore contain arbitrary `%` directives coming from the + code being analysed -- is passed through unharmed.''' + return fmt % args if args else fmt + def stop(): _logging_process.join() @@ -105,7 +113,7 @@ def log(self, level, fmt, *args): '''Log a message in a process safe fashion. Message will be of the form [level] fmt%args.''' if level <= self.level: - txt = fmt % args + txt = format_message(fmt, args) try: self.queue.put((self.color | level, self.proc_id, txt), False) except Exception: diff --git a/python/extractor/semmle/python/imports.py b/python/extractor/semmle/python/imports.py index 8da7df474480..98b848d3a688 100644 --- a/python/extractor/semmle/python/imports.py +++ b/python/extractor/semmle/python/imports.py @@ -252,6 +252,6 @@ def importer_from_options(options, finder, logger): importer = CachingModuleImporter(options.trap_cache, finder, logger) except Exception as ex: if options.trap_cache is not None: - logger.warn("Failed to create caching importer: %s", ex) + logger.warning("Failed to create caching importer: %s", ex) importer = ModuleImporter(finder, logger) return importer diff --git a/python/extractor/semmle/python/parser/dump_ast.py b/python/extractor/semmle/python/parser/dump_ast.py index 802bed8fac24..3a7db5ab0713 100644 --- a/python/extractor/semmle/python/parser/dump_ast.py +++ b/python/extractor/semmle/python/parser/dump_ast.py @@ -99,12 +99,12 @@ def visit(self, node, level=0, visited=None): class StdoutLogger(logging.Logger): error_count = 0 def log(self, level, fmt, *args): - sys.stdout.write(fmt % args + "\n") + sys.stdout.write(logging.format_message(fmt, args) + "\n") def info(self, fmt, *args): self.log(logging.INFO, fmt, *args) - def warn(self, fmt, *args): + def warning(self, fmt, *args): self.log(logging.WARN, fmt, *args) self.error_count += 1 diff --git a/python/extractor/semmle/python/parser/tsg_parser.py b/python/extractor/semmle/python/parser/tsg_parser.py index 356faf249ed3..2ce1ec0cd18b 100644 --- a/python/extractor/semmle/python/parser/tsg_parser.py +++ b/python/extractor/semmle/python/parser/tsg_parser.py @@ -3,6 +3,7 @@ # Functions and classes used for parsing Python files using `tree-sitter-graph` from ast import literal_eval +import re import sys import os import semmle.python.parser @@ -144,6 +145,7 @@ def read_tsg_python_output(path, logger): elif value == "#null": # e.g. `exc: #null` value = None else: # literal values, e.g. `name: "k1.k2"` or `level: 5` + value = rust_to_python_escapes(value) try: if key =="s" and value[0] == '"': # e.g. `s: "k1.k2"` value = evaluate_string(value) @@ -171,6 +173,35 @@ def read_tsg_python_output(path, logger): logger.debug("Read {} nodes and {} edges from TSG output".format(len(node_attr), len(edge_attr))) return node_attr, edge_attr +# `tsg-python` serialises string values using Rust's `Debug` formatting, which diverges from what +# Python's `literal_eval` accepts in two ways: +# - characters Rust considers non-printable -- including grapheme-extending ones such as the U+FE0F +# variation selector, U+200D zero width joiner and combining accents -- are rendered as `\u{...}`, +# a syntax Python does not know at all; +# - NUL is rendered as `\0`, which Python reads as the start of an *octal* escape, silently +# swallowing up to two more digits (`"\0" + "1"` would decode to `\x01`). +# Everything else Rust emits (`\t`, `\r`, `\n`, `\\`, `\"`, and unescaped characters) is read back +# identically by `literal_eval`, as verified exhaustively over every Unicode scalar value. +_RUST_ESCAPE = re.compile(r"\\(?:u\{([0-9a-fA-F]{1,6})\}|.)", re.DOTALL) + +def rust_to_python_escapes(text): + """Rewrites Rust escapes in `text` that Python would reject or misread into their equivalents. + + Matching every escape sequence (rather than only the offending ones) keeps the scan in step with + the backslashes, so an escaped backslash -- how a literal `\\u{fe0f}` in the source is + serialised -- is left alone.""" + if "\\u{" not in text and "\\0" not in text: + return text + def replace(match): + code_point = match.group(1) + if code_point is None: + return "\\x00" if match.group(0) == "\\0" else match.group(0) + code_point = int(code_point, 16) + if code_point > 0xFFFF: + return "\\U{:08x}".format(code_point) + return "\\u{:04x}".format(code_point) + return _RUST_ESCAPE.sub(replace, text) + def evaluate_string(s): s = literal_eval(s) prefix, quotes, content = split_string(s, None) diff --git a/python/extractor/semmle/python/passes/flow.py b/python/extractor/semmle/python/passes/flow.py index 9f434fe0c4c8..6ea5405a8540 100755 --- a/python/extractor/semmle/python/passes/flow.py +++ b/python/extractor/semmle/python/passes/flow.py @@ -12,7 +12,7 @@ from semmle.python.passes import unroller from semmle.python import modules import semmle.graph as graph -from semmle.logging import Logger +from semmle.logging import Logger, format_message __all__ = [ 'FlowPass' ] @@ -1924,7 +1924,7 @@ def write_ssa_phi(out, phi, arg): class FakeLogger(object): def debug(self, fmt, *args): - print(fmt % args) + print(format_message(fmt, args)) def traceback(self): print(traceback.format_exc()) diff --git a/python/extractor/semmle/worker.py b/python/extractor/semmle/worker.py index 96761a01c77e..ac8231390742 100644 --- a/python/extractor/semmle/worker.py +++ b/python/extractor/semmle/worker.py @@ -39,7 +39,7 @@ def __init__(self, max_depth, logger: Logger): changed_paths = data.get('changes', []) self.overlay_changes = { os.path.abspath(p) for p in changed_paths } except (IOError, ValueError) as e: - logger.warn("Failed to read overlay changes from '%s' (falling back to full extraction): %s", overlay_changes_file, e) + logger.warning("Failed to read overlay changes from '%s' (falling back to full extraction): %s", overlay_changes_file, e) self.overlay_changes = None def add_root(self, mod): diff --git a/python/extractor/tests/parser/unicode_escapes_new.expected b/python/extractor/tests/parser/unicode_escapes_new.expected new file mode 100644 index 000000000000..ed1ba2237543 --- /dev/null +++ b/python/extractor/tests/parser/unicode_escapes_new.expected @@ -0,0 +1,150 @@ +Module: [6, 0] - [29, 0] + body: [ + TypeAlias: [6, 0] - [6, 12] + name: + Name: [6, 5] - [6, 6] + variable: Variable('X', None) + ctx: Store + type_parameters: [] + value: + Name: [6, 9] - [6, 12] + variable: Variable('int', None) + ctx: Load + Assign: [9, 0] - [9, 37] + targets: [ + Name: [9, 0] - [9, 4] + variable: Variable('warn', None) + ctx: Store + ] + value: + Str: [9, 7] - [9, 37] + s: '⚠️ problem %s: %s' + prefix: '"' + implicitly_concatenated_parts: None + Assign: [10, 0] - [10, 35] + targets: [ + Name: [10, 0] - [10, 8] + variable: Variable('warn_raw', None) + ctx: Store + ] + value: + Str: [10, 11] - [10, 35] + s: '⚠️ problem %s: %s' + prefix: '"' + implicitly_concatenated_parts: None + Assign: [13, 0] - [13, 19] + targets: [ + Name: [13, 0] - [13, 3] + variable: Variable('zwj', None) + ctx: Store + ] + value: + Str: [13, 6] - [13, 19] + s: '👨\u200d💻' + prefix: '"' + implicitly_concatenated_parts: None + Assign: [16, 0] - [16, 14] + targets: [ + Name: [16, 0] - [16, 3] + variable: Variable('nfd', None) + ctx: Store + ] + value: + Str: [16, 6] - [16, 14] + s: 'café' + prefix: '"' + implicitly_concatenated_parts: None + Assign: [17, 0] - [17, 28] + targets: [ + Name: [17, 0] - [17, 11] + variable: Variable('soft_hyphen', None) + ctx: Store + ] + value: + Str: [17, 14] - [17, 28] + s: 'soft\xadhyphen' + prefix: '"' + implicitly_concatenated_parts: None + Assign: [20, 0] - [20, 12] + targets: [ + Name: [20, 0] - [20, 6] + variable: Variable('café', None) + ctx: Store + ] + value: + Name: [20, 9] - [20, 12] + variable: Variable('nfd', None) + ctx: Load + Assign: [23, 0] - [23, 23] + targets: [ + Name: [23, 0] - [23, 3] + variable: Variable('raw', None) + ctx: Store + ] + value: + Str: [23, 6] - [23, 23] + s: '⚠️\\u{fe0f}' + prefix: 'r"' + implicitly_concatenated_parts: None + Assign: [24, 0] - [24, 23] + targets: [ + Name: [24, 0] - [24, 6] + variable: Variable('joined', None) + ctx: Store + ] + value: + JoinedStr: [24, 9] - [24, 23] + values: [ + Str: [24, 9] - [24, 12] + s: '' + prefix: 'f"' + implicitly_concatenated_parts: None + Name: [24, 12] - [24, 15] + variable: Variable('zwj', None) + ctx: Load + Str: [24, 15] - [24, 23] + s: '⚠️' + prefix: 'f"' + implicitly_concatenated_parts: None + ] + Assign: [25, 0] - [25, 37] + targets: [ + Name: [25, 0] - [25, 12] + variable: Variable('concatenated', None) + ctx: Store + ] + value: + Str: [25, 15] - [25, 37] + s: '⚠️👨\u200d💻' + prefix: '"' + implicitly_concatenated_parts: [ + StringPart: [25, 15] - [25, 23] + prefix: '"' + text: '"⚠️"' + s: '⚠️' + StringPart: [25, 24] - [25, 37] + prefix: '"' + text: '"👨\u200d💻"' + s: '👨\u200d💻' + ] + Assign: [28, 0] - [28, 17] + targets: [ + Name: [28, 0] - [28, 1] + variable: Variable('d', None) + ctx: Store + ] + value: + Dict: [28, 4] - [28, 17] + items: [ + KeyValuePair: [28, 5] - [28, 16] + key: + Str: [28, 5] - [28, 13] + s: '⚠️' + prefix: '"' + implicitly_concatenated_parts: None + value: + Num: [28, 15] - [28, 16] + n: 1 + text: '1' + ] + ] diff --git a/python/extractor/tests/parser/unicode_escapes_new.py b/python/extractor/tests/parser/unicode_escapes_new.py new file mode 100644 index 000000000000..72cc435be7ef --- /dev/null +++ b/python/extractor/tests/parser/unicode_escapes_new.py @@ -0,0 +1,28 @@ +# Characters that Rust's `Debug` formatting escapes as `\u{...}` when `tsg-python` serialises the +# source text. See https://github.com/github/codeql/issues/22435. + +# PEP 695 syntax is what makes the old parser bail out and hand the file to `tsg-python` in the +# first place, so keep the reported reproducer intact. +type X = int + +# U+FE0F variation selector, next to a `%` directive. +warn = "\u26a0\ufe0f problem %s: %s" +warn_raw = "⚠️ problem %s: %s" + +# U+200D zero width joiner. +zwj = "👨‍💻" + +# Combining acute accent (NFD), and a soft hyphen. +nfd = "café" +soft_hyphen = "soft­hyphen" + +# Combining marks are valid in identifiers too. +café = nfd + +# In f-strings, raw strings and implicit concatenations too. +raw = r"⚠️\u{fe0f}" +joined = f"{zwj}⚠️" +concatenated = "⚠️" "👨‍💻" + +# ... and outside of string literals. +d = {"⚠️": 1} # comment with ⚠️ and 👨‍💻 diff --git a/python/extractor/tests/test_tsg_parser.py b/python/extractor/tests/test_tsg_parser.py new file mode 100644 index 000000000000..40249fb1eb4c --- /dev/null +++ b/python/extractor/tests/test_tsg_parser.py @@ -0,0 +1,77 @@ +import unittest + +from ast import literal_eval + +from semmle.logging import format_message +from semmle.python.parser.tsg_parser import evaluate_string, rust_to_python_escapes + + +class RustEscapeTest(unittest.TestCase): + """`tsg-python` serialises strings with Rust's `Debug` formatting, which escapes characters such + as U+FE0F as `\\u{...}` -- a syntax Python's `literal_eval` does not accept -- and NUL as `\\0`, + which Python reads as an octal escape.""" + + def test_untouched_without_escapes(self): + text = '"caf\u00e9 \u2713 \U0001f4be"' + self.assertEqual(rust_to_python_escapes(text), text) + + def test_basic_multilingual_plane(self): + self.assertEqual(rust_to_python_escapes(r'"\u{fe0f}"'), r'"\ufe0f"') + self.assertEqual(rust_to_python_escapes(r'"\u{200d}"'), r'"\u200d"') + + def test_short_and_astral_code_points(self): + self.assertEqual(rust_to_python_escapes(r'"\u{0}"'), r'"\u0000"') + self.assertEqual(rust_to_python_escapes(r'"\u{1f4a9}"'), r'"\U0001f4a9"') + + def test_other_escapes_are_preserved(self): + self.assertEqual(rust_to_python_escapes(r'"a\nb\"c\u{ad}"'), r'"a\nb\"c\u00ad"') + + def test_escaped_backslash_is_not_an_escape_introducer(self): + # How a raw string `r"\u{fe0f}"` in the analysed source gets serialised: the `\u{fe0f}` is + # literal text, not an escape, and must survive unchanged. + self.assertEqual(rust_to_python_escapes(r'"\\u{fe0f}"'), r'"\\u{fe0f}"') + + def test_nul_is_not_left_as_an_octal_escape(self): + # Rust renders NUL as `\0`; Python would read that as the start of an octal escape and + # swallow the digits that follow, decoding `"\01"` to U+0001 instead of NUL then `1`. + self.assertEqual(rust_to_python_escapes(r'"\01"'), r'"\x001"') + + def test_every_escape_shape_round_trips(self): + # Rust's `Debug for str` only ever emits these shapes. Checked exhaustively against every + # Unicode scalar value, each also paired with every printable ASCII neighbour. + for rendered, expected in [ + (r'"\0"', "\x00"), + (r'"\t"', "\t"), + (r'"\n"', "\n"), + (r'"\r"', "\r"), + (r'"\\"', "\\"), + (r'"\""', '"'), + (r'"\u{1}"', "\u0001"), + (r'"\u{1f}"', "\u001f"), + (r'"\u{300}"', "\u0300"), + (r'"\u{fe0f}"', "\ufe0f"), + (r'"\u{e0100}"', "\U000e0100"), + (r'"\u{10fffe}"', "\U0010fffe"), + ]: + for neighbour in ["", "0", "7", "9", "f", "u", "{"]: + with self.subTest(rendered=rendered, neighbour=neighbour): + text = rendered[:-1] + neighbour + '"' + self.assertEqual(literal_eval(rust_to_python_escapes(text)), expected + neighbour) + + def test_evaluate_string_on_reported_value(self): + # The exact value from https://github.com/github/codeql/issues/22435 that used to raise + # `truncated \uXXXX escape`. + value = rust_to_python_escapes('"\\"\u26a0\\u{fe0f} problem %s: %s\\""') + self.assertEqual(evaluate_string(value), "\u26a0\ufe0f problem %s: %s") + + +class FormatMessageTest(unittest.TestCase): + """A pre-formatted log message may contain `%` directives coming from the analysed source, and + must not be `%`-formatted again.""" + + def test_no_arguments(self): + message = "Error while parsing value '%s: %s'" + self.assertEqual(format_message(message, ()), message) + + def test_with_arguments(self): + self.assertEqual(format_message("%s and %s", ("a", "b")), "a and b") diff --git a/python/extractor/tsg-python/src/main.rs b/python/extractor/tsg-python/src/main.rs index 6e07a8cd86e7..19b2f6dcfece 100644 --- a/python/extractor/tsg-python/src/main.rs +++ b/python/extractor/tsg-python/src/main.rs @@ -710,6 +710,9 @@ fn main() -> Result<()> { add_syntax_error_nodes(&mut graph, &syntax_errors); } + // `pretty_print` renders string values with Rust's `Debug` formatting, so non-printable and + // grapheme-extending characters come out as `\u{...}`. The reader on the other side + // (`semmle/python/parser/tsg_parser.py`) translates those into Python escapes. print!("{}", graph.pretty_print()); Ok(()) } diff --git a/python/ql/lib/change-notes/2026-08-27-tsg-parser-unicode-escapes.md b/python/ql/lib/change-notes/2026-08-27-tsg-parser-unicode-escapes.md new file mode 100644 index 000000000000..56b70081d529 --- /dev/null +++ b/python/ql/lib/change-notes/2026-08-27-tsg-parser-unicode-escapes.md @@ -0,0 +1,4 @@ +--- +category: fix +--- +* Fixed a bug where a Python file could be silently dropped from the analysis (with a spurious "A parse error occurred" diagnostic) when it contained a string literal, comment, or identifier with a character such as the U+FE0F emoji variation selector, a U+200D zero width joiner, or a combining accent. From e464c999564c2bc8f757372f0084626ef2e8f30a Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Thu, 27 Aug 2026 11:25:38 +0200 Subject: [PATCH 0547/2098] Docs: note Rosetta 2 requirement for Apple Silicon Replace the Apple Silicon supported-platforms footnote with guidance on when Rosetta 2 is needed: building your code during analysis requires Rosetta 2, while analyzing an interpreted language or using build mode none runs natively. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- docs/codeql/reusables/supported-platforms.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/codeql/reusables/supported-platforms.rst b/docs/codeql/reusables/supported-platforms.rst index 4205eef267d6..8a7f31849b4f 100644 --- a/docs/codeql/reusables/supported-platforms.rst +++ b/docs/codeql/reusables/supported-platforms.rst @@ -20,4 +20,4 @@ .. [1] Support for Linux on arm64 is currently in beta. - .. [2] Support for Apple Silicon is currently in beta. + .. [2] On Apple Silicon, building your code during analysis requires Rosetta 2; analyzing an interpreted language or using build mode ``none`` runs natively. From 3e88b36a406d52d4aa44bd23f1aef3dc431e396f Mon Sep 17 00:00:00 2001 From: Taus Date: Wed, 26 Aug 2026 22:05:42 +0000 Subject: [PATCH 0548/2098] yeast: Support optional guards in rules Permits the use of guards of the form `where expr` (with `expr` being any Rust expression that evaluates to a boolean) inside of rules. The guard should come after the query itself, and before the `=>` that separates the query from the body, like so: ``` (foo bar: _? @bar) where bar.is_some() => (baz bar: {bar}) ``` If the guard is absent, it behaves as if it were `where true`. Inside of the guard body, all captures are treated as if they are raw. Translation of non-raw captures only happens if the guard succeeds. The guard can also access the user-defined context. This context is shared with the body if the guard succeeds, and discarded if the guard fails (just as it is currently discarded after running a rule body). (I think it's unlikely that we'll ever want to mutate the context from inside the guard, but you never know...) --- shared/yeast-macros/src/lib.rs | 18 +++ shared/yeast-macros/src/parse.rs | 141 +++++++++++++++------- shared/yeast/doc/yeast.md | 48 ++++++++ shared/yeast/src/lib.rs | 166 ++++++++++++++----------- shared/yeast/tests/test.rs | 201 +++++++++++++++++++++++++++++++ 5 files changed, 459 insertions(+), 115 deletions(-) diff --git a/shared/yeast-macros/src/lib.rs b/shared/yeast-macros/src/lib.rs index 82b0e3e7b408..e9f7b46d0570 100644 --- a/shared/yeast-macros/src/lib.rs +++ b/shared/yeast-macros/src/lib.rs @@ -122,6 +122,15 @@ pub fn trees(input: TokenStream) -> TokenStream { /// (output_template field: {name} {repeated}) /// ) /// +/// // A guard filters a successful query match. Every capture is raw in the +/// // guard because guards run before capture translation. +/// rule!( +/// (query_pattern field: _? @value) +/// where value.is_none() +/// => +/// (output_template) +/// ) +/// /// // Shorthand: captures become fields on the output node /// rule!((query ...) => output_kind) /// ``` @@ -131,6 +140,15 @@ pub fn trees(input: TokenStream) -> TokenStream { /// - `@name` (after `*`/`+`) → `name: Vec` /// - `@name` (after `?`) → `name: Option` /// +/// A guard is an optional Rust condition between the query and `=>`. It is +/// evaluated after the query matches and before any `@` captures are +/// translated. Returning false makes the driver try the next rule. All +/// captures are therefore raw in the guard; `@` versus `@@` controls only +/// whether the capture is translated for the transform. `ctx` provides +/// mutable user-context access, and `ast` provides read-only AST access. +/// Mutations to `ctx` are visible to the transform when the guard succeeds. +/// Omitting the guard is equivalent to writing `where true`. +/// /// `tree!` and `trees!` can be used without explicit context inside `{...}`. #[proc_macro] pub fn rule(input: TokenStream) -> TokenStream { diff --git a/shared/yeast-macros/src/parse.rs b/shared/yeast-macros/src/parse.rs index 34e859c912e9..87fb5435bcd1 100644 --- a/shared/yeast-macros/src/parse.rs +++ b/shared/yeast-macros/src/parse.rs @@ -645,6 +645,32 @@ enum CaptureMultiplicity { Repeated, } +fn capture_bindings<'a>(captures: impl Iterator) -> Vec { + captures + .map(|cap| { + let name = Ident::new(&cap.name, Span::call_site()); + let name_str = &cap.name; + match cap.multiplicity { + CaptureMultiplicity::Repeated => { + quote! { + let #name: Vec = __captures.get_all(#name_str); + } + } + CaptureMultiplicity::Optional => { + quote! { + let #name: Option = __captures.get_opt(#name_str); + } + } + CaptureMultiplicity::Single => { + quote! { + let #name: yeast::Id = __captures.get_var(#name_str).unwrap(); + } + } + } + }) + .collect() +} + /// Walk a token stream and extract all `@name` captures, noting whether /// they appear after `*` or `+` (repeated) or not. fn extract_captures(stream: &TokenStream) -> Vec { @@ -806,7 +832,7 @@ fn try_consume_return_annotation(tokens: &mut Tokens) -> Result Result { let mut tokens = input.into_iter().peekable(); - // Collect query tokens up to `=>` + // Collect query and optional `where` guard tokens up to `=>`. let mut query_tokens = Vec::new(); loop { match tokens.peek() { @@ -830,7 +856,7 @@ pub fn parse_rule_top(input: TokenStream) -> Result { } } - let query_stream: TokenStream = query_tokens.into_iter().collect(); + let (query_stream, guard) = split_rule_guard(query_tokens)?; // Extract captures from query let captures = extract_captures(&query_stream); @@ -838,40 +864,22 @@ pub fn parse_rule_top(input: TokenStream) -> Result { // Parse query let query_code = parse_query_top(query_stream.clone())?; + let (raw_captures, translated_captures): (Vec<_>, Vec<_>) = + captures.iter().partition(|capture| capture.raw); + // Capture names marked `@@name` (raw) — passed to the auto-translate // prefix as a skip list so those captures keep their input-schema ids. - let raw_capture_names: Vec<&str> = captures + let raw_capture_names: Vec<&str> = raw_captures .iter() - .filter(|c| c.raw) - .map(|c| c.name.as_str()) + .map(|capture| capture.name.as_str()) .collect(); - // Generate capture bindings + // Both capture sets are bound raw in the guard, which runs before + // auto-translation. In the transform, raw captures remain unchanged + // while translated captures are bound after auto-translation. let ctx_ident = Ident::new(IMPLICIT_CTX, Span::call_site()); - let bindings: Vec = captures - .iter() - .map(|cap| { - let name = Ident::new(&cap.name, Span::call_site()); - let name_str = &cap.name; - match cap.multiplicity { - CaptureMultiplicity::Repeated => { - quote! { - let #name: Vec = __captures.get_all(#name_str); - } - } - CaptureMultiplicity::Optional => { - quote! { - let #name: Option = __captures.get_opt(#name_str); - } - } - CaptureMultiplicity::Single => { - quote! { - let #name: yeast::Id = __captures.get_var(#name_str).unwrap(); - } - } - } - }) - .collect(); + let raw_bindings = capture_bindings(raw_captures.into_iter()); + let translated_bindings = capture_bindings(translated_captures.into_iter()); // Parse transform: the token(s) after `=>` fall into one of three // shapes, dispatched in order: @@ -1015,24 +1023,36 @@ pub fn parse_rule_top(input: TokenStream) -> Result { } }; + let guard = guard.unwrap_or_else(|| syn::parse_quote!(true)); Ok(quote! { { let __query = #query_code; - yeast::Rule::new(__query, Box::new(|__ast: &mut yeast::Ast, mut __captures: yeast::captures::Captures, __fresh: &yeast::tree_builder::FreshScope, __source_range: Option, __user_ctx: &mut _, __translator: yeast::TranslatorHandle<'_, _>| { - // Auto-translation prefix: recursively translate every - // captured node before invoking the user's transform body, - // except for `@@name` captures listed in `__skip` which the - // body consumes raw. - // For OneShot rules this preserves the legacy behaviour - // (input-schema captures translated to output-schema - // nodes); for Repeating rules it is a no-op. - let __skip: &[&str] = &[#(#raw_capture_names),*]; - __translator.auto_translate_captures(&mut __captures, __ast, __user_ctx, __skip)?; - #(#bindings)* - let mut #ctx_ident = yeast::build::BuildCtx::with_translator(__ast, &__captures, __fresh, __source_range, __user_ctx, __translator); - let __result: Vec = { #transform_body }; - Ok(__result) - })) + yeast::Rule::guarded( + __query, + Box::new(|__ast: &yeast::Ast, __captures: &yeast::captures::Captures, __user_ctx: &mut _| { + #(#raw_bindings)* + #(#translated_bindings)* + let ast = __ast; + let #ctx_ident = __user_ctx; + Ok(#guard) + }), + Box::new(|__ast: &mut yeast::Ast, mut __captures: yeast::captures::Captures, __fresh: &yeast::tree_builder::FreshScope, __source_range: Option, __user_ctx: &mut _, __translator: yeast::TranslatorHandle<'_, _>| { + // Auto-translation prefix: recursively translate every + // captured node before invoking the user's transform body, + // except for `@@name` captures listed in `__skip` which the + // body consumes raw. + // For OneShot rules this preserves the legacy behaviour + // (input-schema captures translated to output-schema + // nodes); for Repeating rules it is a no-op. + let __skip: &[&str] = &[#(#raw_capture_names),*]; + __translator.auto_translate_captures(&mut __captures, __ast, __user_ctx, __skip)?; + #(#raw_bindings)* + #(#translated_bindings)* + let mut #ctx_ident = yeast::build::BuildCtx::with_translator(__ast, &__captures, __fresh, __source_range, __user_ctx, __translator); + let __result: Vec = { #transform_body }; + Ok(__result) + }), + ) } }) } @@ -1041,6 +1061,37 @@ pub fn parse_rule_top(input: TokenStream) -> Result { // Token utilities // --------------------------------------------------------------------------- +/// Split the tokens before a rule's `=>` into its query and optional +/// top-level `where guard`. Groups are opaque `TokenTree`s, so a `where` +/// inside the query or guard expression is not mistaken for the separator. +fn split_rule_guard(tokens: Vec) -> Result<(TokenStream, Option)> { + let guard_index = tokens + .iter() + .position(|tok| matches!(tok, TokenTree::Ident(ident) if ident == "where")); + + let Some(guard_index) = guard_index else { + return Ok((tokens.into_iter().collect(), None)); + }; + + let query: TokenStream = tokens[..guard_index].iter().cloned().collect(); + if query.is_empty() { + return Err(syn::Error::new( + Span::call_site(), + "expected query before rule guard", + )); + } + + let guard_tokens: TokenStream = tokens[guard_index + 1..].iter().cloned().collect(); + if guard_tokens.is_empty() { + return Err(syn::Error::new_spanned( + tokens[guard_index].clone(), + "expected expression after rule guard `where`", + )); + } + let guard = syn::parse2::(guard_tokens)?; + Ok((query, Some(guard))) +} + fn peek_is_at(tokens: &mut Tokens) -> bool { matches!(tokens.peek(), Some(TokenTree::Punct(p)) if p.as_char() == '@') } diff --git a/shared/yeast/doc/yeast.md b/shared/yeast/doc/yeast.md index be3bc913c700..3e3e1cd3610f 100644 --- a/shared/yeast/doc/yeast.md +++ b/shared/yeast/doc/yeast.md @@ -458,6 +458,54 @@ yeast::rule!( The shorthand `=> kind` form auto-generates the template, mapping each capture name to a field of the same name on the output node. +### Guards + +A rule may include a Rust guard between its query and `=>`. The guard runs +after the query matches but before any captures are translated. If it returns +`false`, the rule is treated as a non-match and the driver tries the next rule. +Omitting the guard is equivalent to writing `where true`: + +```rust +rule!( + (tupleExpr + elements: (labeledExpr + label: _? @label + expression: @inner) + elements: _* @rest) + where label.is_none() && rest.is_empty() + => + expr { inner } +) +``` + +Every capture is a raw input-schema id in the guard, regardless of whether it +uses `@` or `@@`, because the guard runs before translation. The marker controls +the transform binding only: `@inner` is translated after the guard accepts the +rule, while a capture marked `@@` would remain raw in the transform as well. +In this example `label` and `rest` are empty whenever the guard succeeds, so +there is nothing to translate for those captures. + +Guards receive the mutable user context as `ctx` and the raw AST as `ast`. +The framework clones the user context before evaluating each guard. If the +guard succeeds, its context mutations are visible to the rule transform and +recursive translation; if it fails, the clone is discarded before the next +rule is tried: + +```rust +rule!( + (tupleExpr elements: _* @elements) + where { + ctx.in_pattern = true; + elements + .first() + .and_then(|element| ast.get_node(*element)) + .is_some() + } + => + (tuple_pattern element: {elements}) +) +``` + ### Annotation form Rules that need imperative logic — mutating [`BuildCtx`] state per diff --git a/shared/yeast/src/lib.rs b/shared/yeast/src/lib.rs index c290246541f5..94f75faa4763 100644 --- a/shared/yeast/src/lib.rs +++ b/shared/yeast/src/lib.rs @@ -1014,8 +1014,16 @@ pub type Transform = Box< + Sync, >; +/// Predicate evaluated after a rule's query matches and before its transform +/// runs. Returning `false` makes the rule behave as if its query did not +/// match, so the driver continues to the next rule. The user context is a +/// private clone for this rule attempt; mutations are retained for the +/// transform when the guard succeeds and discarded when it fails. +pub type Guard = Box Result + Send + Sync>; + pub struct Rule { query: QueryNode, + guard: Option>, transform: Transform, /// If true, after this rule fires on a node the engine will try to /// re-apply this same rule on the result root. Defaults to false: @@ -1025,9 +1033,22 @@ pub struct Rule { } impl Rule { + /// Construct an unguarded rule from its query and transform. pub fn new(query: QueryNode, transform: Transform) -> Self { Self { query, + guard: None, + transform, + repeated: false, + } + } + + /// Construct a guarded rule. The guard sees raw captures and shares its + /// private user-context clone with the transform when it succeeds. + pub fn guarded(query: QueryNode, guard: Guard, transform: Transform) -> Self { + Self { + query, + guard: Some(guard), transform, repeated: false, } @@ -1042,30 +1063,29 @@ impl Rule { self } - fn try_rule( - &self, - ast: &mut Ast, - node: Id, - fresh: &tree_builder::FreshScope, - user_ctx: &mut C, - translator: TranslatorHandle<'_, C>, - ) -> Result>, String> { - match self.try_match(ast, node)? { - Some(captures) => Ok(Some( - self.run_transform(ast, captures, node, fresh, user_ctx, translator)?, - )), - None => Ok(None), + /// Attempt to match this rule's query against `node`, returning the raw + /// captures on success. Does not evaluate the guard or invoke the + /// transform. + fn match_query(&self, ast: &Ast, node: Id) -> Result, String> { + let mut captures = Captures::new(); + if !self.query.do_match(ast, node, &mut captures)? { + return Ok(None); } + Ok(Some(captures)) } - /// Attempt to match this rule's query against `node`, returning the - /// resulting captures on success. Does not invoke the transform. - fn try_match(&self, ast: &Ast, node: Id) -> Result, String> { - let mut captures = Captures::new(); - if self.query.do_match(ast, node, &mut captures)? { - Ok(Some(captures)) + /// Evaluate this rule's guard against a successful query match. An + /// unguarded rule always succeeds. + fn guard_matches( + &self, + ast: &Ast, + captures: &Captures, + user_ctx: &mut C, + ) -> Result { + if let Some(guard) = &self.guard { + guard(ast, captures, user_ctx) } else { - Ok(None) + Ok(true) } } @@ -1154,13 +1174,19 @@ fn apply_repeating_rules_inner( if Some(rule_ptr) == skip_rule { continue; } - // Give each rule attempt a private clone of the user context. - // Any mutations the rule makes are visible to its transform and - // to the recursive translation of its result, but never leak - // back to the parent — the clone is simply dropped when we - // return. This is also `?`-safe: an error return drops `local` - // without touching the caller's `user_ctx`. + let Some(captures) = rule.match_query(ast, id)? else { + continue; + }; + + // Give each structurally-matching rule a private clone of the user + // context before its guard runs. Guard mutations are visible to the + // transform and recursive translation when the guard succeeds, but a + // failed guard drops the clone before trying the next rule. let mut local = user_ctx.clone(); + if !rule.guard_matches(ast, &captures, &mut local)? { + continue; + } + // Repeating rules don't need a real translator: their captures // aren't auto-translated (Repeating preserves the input schema), // and `ctx.translate(id)` errors if invoked from a Repeating @@ -1168,29 +1194,25 @@ fn apply_repeating_rules_inner( let translator = TranslatorHandle { inner: TranslatorImpl::Repeating, }; - let try_result = rule.try_rule(ast, id, fresh, &mut local, translator)?; - if let Some(result_node) = try_result { - // For non-repeated rules, suppress further application of *this* - // rule on the result root, so a rule whose output matches its own - // query doesn't loop. Other rules and child traversal are - // unaffected. - let next_skip = if rule.repeated { None } else { Some(rule_ptr) }; - let mut results = Vec::new(); - for node in result_node { - results.extend(apply_repeating_rules_inner( - index, - ast, - &mut local, - node, - fresh, - rewrite_depth + 1, - next_skip, - )?); - } - return Ok(results); + let result_nodes = rule.run_transform(ast, captures, id, fresh, &mut local, translator)?; + + // For non-repeated rules, suppress further application of *this* + // rule on the result root, so a rule whose output matches its own + // query doesn't loop. Other rules and child traversal are unaffected. + let next_skip = if rule.repeated { None } else { Some(rule_ptr) }; + let mut results = Vec::new(); + for node in result_nodes { + results.extend(apply_repeating_rules_inner( + index, + ast, + &mut local, + node, + fresh, + rewrite_depth + 1, + next_skip, + )?); } - // Rule didn't match; `local` is dropped as we loop to the next - // rule. + return Ok(results); } // Take the parent's fields by ownership: the recursion will rewrite @@ -1271,29 +1293,33 @@ fn apply_one_shot_rules_inner( let node_kind = ast.get_node(id).map(|n| n.kind_name()).unwrap_or(""); for rule in index.rules_for_kind(node_kind) { - if let Some(captures) = rule.try_match(ast, id)? { - // Give the rule a private clone of the user context. Any - // mutations the rule (or its transitively-translated - // captures) make are visible during this rule's transform, - // but never leak back — the clone is dropped when we - // return. `?`-safe: an error return drops `local` without - // touching the caller's `user_ctx`. - let mut local = user_ctx.clone(); - // Build the translator handle the transform will use to - // recursively translate captures (or, for macro-generated - // rules, the auto-translate prefix uses it to translate every - // capture up front, preserving the legacy behavior). - let translator = TranslatorHandle { - inner: TranslatorImpl::OneShot { - index, - fresh, - rewrite_depth, - matched_root: id, - }, - }; - let result = rule.run_transform(ast, captures, id, fresh, &mut local, translator)?; - return Ok(result); + let Some(captures) = rule.match_query(ast, id)? else { + continue; + }; + + // Clone only after the query matches, but before the guard runs. + // Guard mutations are visible to the transform and transitively- + // translated captures when the guard succeeds; a failed guard drops + // the clone before trying the next rule. + let mut local = user_ctx.clone(); + if !rule.guard_matches(ast, &captures, &mut local)? { + continue; } + + // Build the translator handle the transform will use to recursively + // translate captures (or, for macro-generated rules, the + // auto-translate prefix uses it to translate every capture up front, + // preserving the legacy behavior). + let translator = TranslatorHandle { + inner: TranslatorImpl::OneShot { + index, + fresh, + rewrite_depth, + matched_root: id, + }, + }; + let result = rule.run_transform(ast, captures, id, fresh, &mut local, translator)?; + return Ok(result); } Err(format!( diff --git a/shared/yeast/tests/test.rs b/shared/yeast/tests/test.rs index bdc17c7593dc..60ed8afe84dd 100644 --- a/shared/yeast/tests/test.rs +++ b/shared/yeast/tests/test.rs @@ -918,6 +918,104 @@ fn test_shorthand_rule() { ); } +#[derive(Clone, Default)] +struct GuardTestContext { + enabled: bool, + selected: bool, +} + +fn guarded_integer_rules() -> Vec> { + vec![ + yeast::rule!( + (integer) @@raw + where { + ctx.selected = ctx.enabled && ast.source_text(raw) == "1"; + ctx.selected + } + => + identifier { + assert!(ctx.selected); + tree!((identifier "guarded")) + } + ), + yeast::rule!((integer) => (identifier "fallback")), + ] +} + +#[test] +fn test_rule_guard_reads_raw_capture_and_user_context() { + fn run(input: &str, enabled: bool) -> String { + let lang: tree_sitter::Language = tree_sitter_ruby::LANGUAGE.into(); + let schema = + yeast::node_types_yaml::schema_from_yaml_with_language(OUTPUT_SCHEMA_YAML, &lang) + .unwrap(); + let phases = vec![Phase::new( + "test", + PhaseKind::Repeating, + guarded_integer_rules(), + )]; + let runner = Runner::with_schema(lang, &schema, &phases); + let mut user_ctx = GuardTestContext { + enabled, + selected: false, + }; + let ast = runner.run_with_ctx(input, &mut user_ctx).unwrap(); + dump_ast(&ast, ast.get_root(), input) + } + + assert_dump_eq( + &run("1", true), + r#" + program + identifier "guarded" + "#, + ); + assert_dump_eq( + &run("2", true), + r#" + program + identifier "fallback" + "#, + ); + assert_dump_eq( + &run("1", false), + r#" + program + identifier "fallback" + "#, + ); +} + +#[test] +fn test_rule_guard_binds_optional_and_repeated_raw_captures() { + fn rules() -> Vec { + vec![ + yeast::rule!( + (array (_)? @@first (_)* @@rest) + where first.is_some() && rest.is_empty() + => + (identifier "single") + ), + yeast::rule!((array) => (identifier "multiple")), + ] + } + + assert_dump_eq( + &run_and_dump("[1]", rules()), + r#" + program + identifier "single" + "#, + ); + assert_dump_eq( + &run_and_dump("[1, 2]", rules()), + r#" + program + identifier "multiple" + "#, + ); +} + #[test] fn test_chained_rules_output_only_kind() { // Exercise rule chaining where an intermediate kind exists only in the @@ -1134,6 +1232,84 @@ fn test_one_shot_phase_errors_when_no_rule_matches() { ); } +#[test] +fn test_one_shot_guard_runs_before_capture_translation() { + let lang: tree_sitter::Language = tree_sitter_ruby::LANGUAGE.into(); + let schema = + yeast::node_types_yaml::schema_from_yaml_with_language(OUTPUT_SCHEMA_YAML, &lang).unwrap(); + let rules: Vec = vec![ + yeast::rule!( + (program (_)* @stmts) + => + (program stmt: {stmts}) + ), + // There is deliberately no OneShot rule for `identifier`. If this + // rule translated `@left` before binding it raw in the guard, the run + // would fail instead of evaluating the guard and falling through to + // the next assignment rule. + yeast::rule!( + (assignment left: (_) @left) + where ast.source_text(left) == "not-x" + => + (first_node left: {left}) + ), + yeast::rule!((assignment) => (identifier "fallback")), + ]; + let phases = vec![Phase::new("translate", PhaseKind::OneShot, rules)]; + let runner: Runner = Runner::with_schema(lang, &schema, &phases); + + let input = "x = 1"; + let ast = runner.run(input).unwrap(); + let dump = dump_ast(&ast, ast.get_root(), input); + assert_dump_eq( + &dump, + r#" + program + stmt: identifier "fallback" + "#, + ); +} + +#[test] +fn test_one_shot_guard_context_mutation_is_visible_to_transform() { + let lang: tree_sitter::Language = tree_sitter_ruby::LANGUAGE.into(); + let schema = + yeast::node_types_yaml::schema_from_yaml_with_language(OUTPUT_SCHEMA_YAML, &lang).unwrap(); + let rules: Vec> = vec![ + yeast::rule!( + (program (_)* @stmts) + => + (program stmt: {stmts}) + ), + yeast::rule!( + (integer) + where { + ctx.selected = true; + true + } + => + identifier { + assert!(ctx.selected); + tree!((identifier "guarded")) + } + ), + ]; + let phases = vec![Phase::new("translate", PhaseKind::OneShot, rules)]; + let runner = Runner::with_schema(lang, &schema, &phases); + let mut user_ctx = GuardTestContext::default(); + + let input = "1"; + let ast = runner.run_with_ctx(input, &mut user_ctx).unwrap(); + let dump = dump_ast(&ast, ast.get_root(), input); + assert_dump_eq( + &dump, + r#" + program + stmt: identifier "guarded" + "#, + ); +} + /// OneShot recursion must apply rules to *captured* nodes, even if the rule /// returns a captured child verbatim. A buggy implementation that only /// recurses into the children of the rule's output (rather than into the @@ -1549,6 +1725,31 @@ fn test_rules_macro_accepts_bare_shorthand_form() { ); } +#[test] +fn test_rules_macro_accepts_bare_guarded_rule() { + let rules: Vec = yeast::rules! { + input: "tests/input-types.yml", + output: "tests/node-types.yml", + [ + (integer) @@raw + where ast.source_text(raw) == "1" + => + (identifier "guarded"), + + (integer) => (identifier "fallback"), + ] + }; + + let dump = run_and_dump("1", rules); + assert_dump_eq( + &dump, + r#" + program + identifier "guarded" + "#, + ); +} + /// Backwards-compat: explicit `rule!(...)` invocations inside `rules!` /// should still type-check and behave the same as the bare form. #[test] From 51a107eaac1676cceecb3990da365c9b4163b21d Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 27 Aug 2026 09:39:12 +0200 Subject: [PATCH 0549/2098] C#: Convert the OData test to use the Sink for the alert location and update test expected output. --- .../frameworks/OData/OData.expected | 24 +++++++++---------- .../library-tests/frameworks/OData/OData.ql | 3 ++- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.expected b/csharp/ql/test/library-tests/frameworks/OData/OData.expected index a2e0614a51ec..7cef6368a276 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.expected +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.expected @@ -67,15 +67,15 @@ nodes | OData.cs:104:18:104:23 | access to property Name | semmle.label | access to property Name | subpaths #select -| OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:49:18:49:23 | access to local variable entity | $@ | OData.cs:49:18:49:23 | access to local variable entity | access to local variable entity | -| OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:50:18:50:28 | access to property Name | $@ | OData.cs:50:18:50:28 | access to property Name | access to property Name | -| OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:51:18:51:31 | access to property Content | $@ | OData.cs:51:18:51:31 | access to property Content | access to property Content | -| OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:52:18:52:38 | access to property Owner | $@ | OData.cs:52:18:52:38 | access to property Owner | access to property Owner | -| OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:55:22:55:28 | access to property Owner | $@ | OData.cs:55:22:55:28 | access to property Owner | access to property Owner | -| OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:65:26:65:35 | access to property Label | $@ | OData.cs:65:26:65:35 | access to property Label | access to property Label | -| OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:72:22:72:34 | access to property Category | $@ | OData.cs:72:22:72:34 | access to property Category | access to property Category | -| OData.cs:76:52:76:61 | parameters : ODataActionParameters | OData.cs:76:52:76:61 | parameters : ODataActionParameters | OData.cs:80:18:80:28 | access to property Name | $@ | OData.cs:80:18:80:28 | access to property Name | access to property Name | -| OData.cs:83:39:83:43 | delta : Delta | OData.cs:83:39:83:43 | delta : Delta | OData.cs:86:18:86:30 | access to property Name | $@ | OData.cs:86:18:86:30 | access to property Name | access to property Name | -| OData.cs:89:45:89:49 | delta : Delta | OData.cs:89:45:89:49 | delta : Delta | OData.cs:92:18:92:23 | access to property Name | $@ | OData.cs:92:18:92:23 | access to property Name | access to property Name | -| OData.cs:95:67:95:71 | delta : Delta | OData.cs:95:67:95:71 | delta : Delta | OData.cs:98:18:98:30 | access to property Name | $@ | OData.cs:98:18:98:30 | access to property Name | access to property Name | -| OData.cs:101:71:101:75 | delta : Delta | OData.cs:101:71:101:75 | delta : Delta | OData.cs:104:18:104:23 | access to property Name | $@ | OData.cs:104:18:104:23 | access to property Name | access to property Name | +| OData.cs:49:18:49:23 | access to local variable entity | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:49:18:49:23 | access to local variable entity | This path depends on an $@. | OData.cs:46:55:46:64 | parameters | ODataParameters value | +| OData.cs:50:18:50:28 | access to property Name | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:50:18:50:28 | access to property Name | This path depends on an $@. | OData.cs:46:55:46:64 | parameters | ODataParameters value | +| OData.cs:51:18:51:31 | access to property Content | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:51:18:51:31 | access to property Content | This path depends on an $@. | OData.cs:46:55:46:64 | parameters | ODataParameters value | +| OData.cs:52:18:52:38 | access to property Owner | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:52:18:52:38 | access to property Owner | This path depends on an $@. | OData.cs:46:55:46:64 | parameters | ODataParameters value | +| OData.cs:55:22:55:28 | access to property Owner | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:55:22:55:28 | access to property Owner | This path depends on an $@. | OData.cs:46:55:46:64 | parameters | ODataParameters value | +| OData.cs:65:26:65:35 | access to property Label | OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:65:26:65:35 | access to property Label | This path depends on an $@. | OData.cs:59:55:59:64 | parameters | ODataParameters value | +| OData.cs:72:22:72:34 | access to property Category | OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:72:22:72:34 | access to property Category | This path depends on an $@. | OData.cs:59:55:59:64 | parameters | ODataParameters value | +| OData.cs:80:18:80:28 | access to property Name | OData.cs:76:52:76:61 | parameters : ODataActionParameters | OData.cs:80:18:80:28 | access to property Name | This path depends on an $@. | OData.cs:76:52:76:61 | parameters | ODataParameters value | +| OData.cs:86:18:86:30 | access to property Name | OData.cs:83:39:83:43 | delta : Delta | OData.cs:86:18:86:30 | access to property Name | This path depends on an $@. | OData.cs:83:39:83:43 | delta | ODataParameters value | +| OData.cs:92:18:92:23 | access to property Name | OData.cs:89:45:89:49 | delta : Delta | OData.cs:92:18:92:23 | access to property Name | This path depends on an $@. | OData.cs:89:45:89:49 | delta | ODataParameters value | +| OData.cs:98:18:98:30 | access to property Name | OData.cs:95:67:95:71 | delta : Delta | OData.cs:98:18:98:30 | access to property Name | This path depends on an $@. | OData.cs:95:67:95:71 | delta | ODataParameters value | +| OData.cs:104:18:104:23 | access to property Name | OData.cs:101:71:101:75 | delta : Delta | OData.cs:104:18:104:23 | access to property Name | This path depends on an $@. | OData.cs:101:71:101:75 | delta | ODataParameters value | diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.ql b/csharp/ql/test/library-tests/frameworks/OData/OData.ql index b25ef30bc470..f0636d555b51 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.ql +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.ql @@ -25,4 +25,5 @@ module Taint = TaintTracking::Global; from Taint::PathNode source, Taint::PathNode sink where Taint::flowPath(source, sink) -select source, source, sink, "$@", sink, sink.toString() +select sink.getNode(), source, sink, "This path depends on an $@.", source.getNode(), + "ODataParameters value" From 538d51f3f95aba0332c84b9869d50560a44ff416 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 27 Aug 2026 10:05:34 +0200 Subject: [PATCH 0550/2098] C#: Convert the test to use inline expectations and update expected test output. --- .../library-tests/frameworks/OData/OData.cs | 24 +++++++++---------- .../frameworks/OData/OData.expected | 14 +++++++---- .../library-tests/frameworks/OData/OData.ql | 9 +++---- 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.cs b/csharp/ql/test/library-tests/frameworks/OData/OData.cs index a16a821da070..91d0440c3288 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.cs +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.cs @@ -46,13 +46,13 @@ void Sink(object o) { } void CastFromDictionary(ODataActionParameters parameters) { var entity = (BoundEntity)parameters["Entity"]; - Sink(entity); - Sink(entity.Name); - Sink(entity.Content); - Sink(entity.Metadata.Owner); + Sink(entity); // $ hasTaintFlow=line:46 + Sink(entity.Name); // $ hasTaintFlow=line:46 + Sink(entity.Content); // $ hasTaintFlow=line:46 + Sink(entity.Metadata.Owner); // $ hasTaintFlow=line:46 foreach (var m in entity.Revisions) { - Sink(m.Owner); + Sink(m.Owner); // $ hasTaintFlow=line:46 } } @@ -62,14 +62,14 @@ void IsAsFromDictionary(ODataActionParameters parameters) { foreach (var item in items1) { - Sink(item.Label); + Sink(item.Label); // $ hasTaintFlow=line:59 } } var items2 = parameters["Items"] as IEnumerable; foreach (var item in items2) { - Sink(item.Category); + Sink(item.Category); // $ hasTaintFlow=line:59 } } @@ -77,31 +77,31 @@ void UpcastThenIndex(ODataActionParameters parameters) { IDictionary dict = parameters; var entity = (BoundEntity)dict["Entity"]; - Sink(entity.Name); + Sink(entity.Name); // $ hasTaintFlow=line:76 } void DeltaPatch(Delta delta, Widget original) { delta.Patch(original); - Sink(original.Name); + Sink(original.Name); // $ hasTaintFlow=line:83 } void DeltaGetInstance(Delta delta) { var w = delta.GetInstance(); - Sink(w.Name); + Sink(w.Name); // $ hasTaintFlow=line:89 } void LegacyDeltaPatch(System.Web.Http.OData.Delta delta, Widget original) { delta.Patch(original); - Sink(original.Name); + Sink(original.Name); // $ hasTaintFlow=line:95 } void LegacyDeltaGetEntity(System.Web.Http.OData.Delta delta) { var w = delta.GetEntity(); - Sink(w.Name); + Sink(w.Name); // $ hasTaintFlow=line:101 } void Untainted() diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.expected b/csharp/ql/test/library-tests/frameworks/OData/OData.expected index 7cef6368a276..86f12b08f3c2 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.expected +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.expected @@ -1,3 +1,8 @@ +models +| 1 | Summary: Microsoft.AspNet.OData; Delta; true; GetInstance; (); ; Argument[this]; ReturnValue; taint; manual | +| 2 | Summary: Microsoft.AspNet.OData; Delta; true; Patch; (TStructuralType); ; Argument[this]; Argument[0]; taint; manual | +| 3 | Summary: System.Web.Http.OData; Delta; true; GetEntity; (); ; Argument[this]; ReturnValue; taint; manual | +| 4 | Summary: System.Web.Http.OData; Delta; true; Patch; (TEntityType); ; Argument[this]; Argument[0]; taint; manual | edges | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:48:26:48:58 | (...) ... : BoundEntity | provenance | | | OData.cs:48:17:48:22 | access to local variable entity : BoundEntity | OData.cs:49:18:49:23 | access to local variable entity | provenance | | @@ -15,18 +20,18 @@ edges | OData.cs:79:17:79:22 | access to local variable entity : BoundEntity | OData.cs:80:18:80:28 | access to property Name | provenance | | | OData.cs:79:26:79:52 | (...) ... : BoundEntity | OData.cs:79:17:79:22 | access to local variable entity : BoundEntity | provenance | | | OData.cs:83:39:83:43 | delta : Delta | OData.cs:85:13:85:17 | access to parameter delta : Delta | provenance | | -| OData.cs:85:13:85:17 | access to parameter delta : Delta | OData.cs:85:25:85:32 | [post] access to parameter original : Widget | provenance | MaD:143 | +| OData.cs:85:13:85:17 | access to parameter delta : Delta | OData.cs:85:25:85:32 | [post] access to parameter original : Widget | provenance | MaD:2 | | OData.cs:85:25:85:32 | [post] access to parameter original : Widget | OData.cs:86:18:86:30 | access to property Name | provenance | | | OData.cs:89:45:89:49 | delta : Delta | OData.cs:91:21:91:25 | access to parameter delta : Delta | provenance | | | OData.cs:91:17:91:17 | access to local variable w : Widget | OData.cs:92:18:92:23 | access to property Name | provenance | | -| OData.cs:91:21:91:25 | access to parameter delta : Delta | OData.cs:91:21:91:39 | call to method GetInstance : Widget | provenance | MaD:142 | +| OData.cs:91:21:91:25 | access to parameter delta : Delta | OData.cs:91:21:91:39 | call to method GetInstance : Widget | provenance | MaD:1 | | OData.cs:91:21:91:39 | call to method GetInstance : Widget | OData.cs:91:17:91:17 | access to local variable w : Widget | provenance | | | OData.cs:95:67:95:71 | delta : Delta | OData.cs:97:13:97:17 | access to parameter delta : Delta | provenance | | -| OData.cs:97:13:97:17 | access to parameter delta : Delta | OData.cs:97:25:97:32 | [post] access to parameter original : Widget | provenance | MaD:153 | +| OData.cs:97:13:97:17 | access to parameter delta : Delta | OData.cs:97:25:97:32 | [post] access to parameter original : Widget | provenance | MaD:4 | | OData.cs:97:25:97:32 | [post] access to parameter original : Widget | OData.cs:98:18:98:30 | access to property Name | provenance | | | OData.cs:101:71:101:75 | delta : Delta | OData.cs:103:21:103:25 | access to parameter delta : Delta | provenance | | | OData.cs:103:17:103:17 | access to local variable w : Widget | OData.cs:104:18:104:23 | access to property Name | provenance | | -| OData.cs:103:21:103:25 | access to parameter delta : Delta | OData.cs:103:21:103:37 | call to method GetEntity : Widget | provenance | MaD:152 | +| OData.cs:103:21:103:25 | access to parameter delta : Delta | OData.cs:103:21:103:37 | call to method GetEntity : Widget | provenance | MaD:3 | | OData.cs:103:21:103:37 | call to method GetEntity : Widget | OData.cs:103:17:103:17 | access to local variable w : Widget | provenance | | nodes | OData.cs:46:55:46:64 | parameters : ODataActionParameters | semmle.label | parameters : ODataActionParameters | @@ -66,6 +71,7 @@ nodes | OData.cs:103:21:103:37 | call to method GetEntity : Widget | semmle.label | call to method GetEntity : Widget | | OData.cs:104:18:104:23 | access to property Name | semmle.label | access to property Name | subpaths +testFailures #select | OData.cs:49:18:49:23 | access to local variable entity | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:49:18:49:23 | access to local variable entity | This path depends on an $@. | OData.cs:46:55:46:64 | parameters | ODataParameters value | | OData.cs:50:18:50:28 | access to property Name | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:50:18:50:28 | access to property Name | This path depends on an $@. | OData.cs:46:55:46:64 | parameters | ODataParameters value | diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.ql b/csharp/ql/test/library-tests/frameworks/OData/OData.ql index f0636d555b51..df79cc58cdb4 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.ql +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.ql @@ -3,7 +3,8 @@ */ import csharp -import Taint::PathGraph +import utils.test.InlineFlowTest +import PathGraph module TaintConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node n) { @@ -21,9 +22,9 @@ module TaintConfig implements DataFlow::ConfigSig { } } -module Taint = TaintTracking::Global; +import TaintFlowTest -from Taint::PathNode source, Taint::PathNode sink -where Taint::flowPath(source, sink) +from PathNode source, PathNode sink +where flowPath(source, sink) select sink.getNode(), source, sink, "This path depends on an $@.", source.getNode(), "ODataParameters value" From 5b2568d4ea3c10aac18258378fb46658ecae3c16 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 27 Aug 2026 10:23:04 +0200 Subject: [PATCH 0551/2098] C#: Use unique types pr test case (otherwise they will interfere with each other in relation to identifying which members will be tainted). --- .../library-tests/frameworks/OData/OData.cs | 37 +++-- .../frameworks/OData/OData.expected | 156 +++++++++--------- 2 files changed, 100 insertions(+), 93 deletions(-) diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.cs b/csharp/ql/test/library-tests/frameworks/OData/OData.cs index 91d0440c3288..8e63a2dec7d4 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.cs +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.cs @@ -8,7 +8,7 @@ public class EntityMetadata public string Owner { get; set; } } - public class BoundEntity + public class BoundEntity1 { public string Name { get; set; } @@ -19,6 +19,11 @@ public class BoundEntity public List Revisions { get; set; } } + public class BoundEntity2 + { + public string Name { get; set; } + } + public class RelatedItem { public string Label { get; set; } @@ -45,14 +50,14 @@ void Sink(object o) { } void CastFromDictionary(ODataActionParameters parameters) { - var entity = (BoundEntity)parameters["Entity"]; - Sink(entity); // $ hasTaintFlow=line:46 - Sink(entity.Name); // $ hasTaintFlow=line:46 - Sink(entity.Content); // $ hasTaintFlow=line:46 - Sink(entity.Metadata.Owner); // $ hasTaintFlow=line:46 + var entity = (BoundEntity1)parameters["Entity"]; + Sink(entity); // $ hasTaintFlow=line:51 + Sink(entity.Name); // $ hasTaintFlow=line:51 + Sink(entity.Content); // $ hasTaintFlow=line:51 + Sink(entity.Metadata.Owner); // $ hasTaintFlow=line:51 foreach (var m in entity.Revisions) { - Sink(m.Owner); // $ hasTaintFlow=line:46 + Sink(m.Owner); // $ hasTaintFlow=line:51 } } @@ -62,46 +67,46 @@ void IsAsFromDictionary(ODataActionParameters parameters) { foreach (var item in items1) { - Sink(item.Label); // $ hasTaintFlow=line:59 + Sink(item.Label); // $ hasTaintFlow=line:64 } } var items2 = parameters["Items"] as IEnumerable; foreach (var item in items2) { - Sink(item.Category); // $ hasTaintFlow=line:59 + Sink(item.Category); // $ hasTaintFlow=line:64 } } void UpcastThenIndex(ODataActionParameters parameters) { - IDictionary dict = parameters; - var entity = (BoundEntity)dict["Entity"]; - Sink(entity.Name); // $ hasTaintFlow=line:76 + var dict = (IDictionary)parameters; + var entity = (BoundEntity2)dict["Entity"]; + Sink(entity.Name); // $ hasTaintFlow=line:81 } void DeltaPatch(Delta delta, Widget original) { delta.Patch(original); - Sink(original.Name); // $ hasTaintFlow=line:83 + Sink(original.Name); // $ hasTaintFlow=line:88 } void DeltaGetInstance(Delta delta) { var w = delta.GetInstance(); - Sink(w.Name); // $ hasTaintFlow=line:89 + Sink(w.Name); // $ hasTaintFlow=line:94 } void LegacyDeltaPatch(System.Web.Http.OData.Delta delta, Widget original) { delta.Patch(original); - Sink(original.Name); // $ hasTaintFlow=line:95 + Sink(original.Name); // $ hasTaintFlow=line:100 } void LegacyDeltaGetEntity(System.Web.Http.OData.Delta delta) { var w = delta.GetEntity(); - Sink(w.Name); // $ hasTaintFlow=line:101 + Sink(w.Name); // $ hasTaintFlow=line:106 } void Untainted() diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.expected b/csharp/ql/test/library-tests/frameworks/OData/OData.expected index 86f12b08f3c2..1c69969e8756 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.expected +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.expected @@ -4,84 +4,86 @@ models | 3 | Summary: System.Web.Http.OData; Delta; true; GetEntity; (); ; Argument[this]; ReturnValue; taint; manual | | 4 | Summary: System.Web.Http.OData; Delta; true; Patch; (TEntityType); ; Argument[this]; Argument[0]; taint; manual | edges -| OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:48:26:48:58 | (...) ... : BoundEntity | provenance | | -| OData.cs:48:17:48:22 | access to local variable entity : BoundEntity | OData.cs:49:18:49:23 | access to local variable entity | provenance | | -| OData.cs:48:17:48:22 | access to local variable entity : BoundEntity | OData.cs:50:18:50:28 | access to property Name | provenance | | -| OData.cs:48:17:48:22 | access to local variable entity : BoundEntity | OData.cs:51:18:51:31 | access to property Content | provenance | | -| OData.cs:48:17:48:22 | access to local variable entity : BoundEntity | OData.cs:52:18:52:38 | access to property Owner | provenance | | -| OData.cs:48:17:48:22 | access to local variable entity : BoundEntity | OData.cs:55:22:55:28 | access to property Owner | provenance | | -| OData.cs:48:26:48:58 | (...) ... : BoundEntity | OData.cs:48:17:48:22 | access to local variable entity : BoundEntity | provenance | | -| OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:65:26:65:35 | access to property Label | provenance | | -| OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:69:26:69:72 | ... as ... : IEnumerable | provenance | | -| OData.cs:69:17:69:22 | access to local variable items2 : IEnumerable | OData.cs:72:22:72:34 | access to property Category | provenance | | -| OData.cs:69:26:69:72 | ... as ... : IEnumerable | OData.cs:69:17:69:22 | access to local variable items2 : IEnumerable | provenance | | -| OData.cs:76:52:76:61 | parameters : ODataActionParameters | OData.cs:78:41:78:44 | access to local variable dict : ODataActionParameters | provenance | | -| OData.cs:78:41:78:44 | access to local variable dict : ODataActionParameters | OData.cs:79:26:79:52 | (...) ... : BoundEntity | provenance | | -| OData.cs:79:17:79:22 | access to local variable entity : BoundEntity | OData.cs:80:18:80:28 | access to property Name | provenance | | -| OData.cs:79:26:79:52 | (...) ... : BoundEntity | OData.cs:79:17:79:22 | access to local variable entity : BoundEntity | provenance | | -| OData.cs:83:39:83:43 | delta : Delta | OData.cs:85:13:85:17 | access to parameter delta : Delta | provenance | | -| OData.cs:85:13:85:17 | access to parameter delta : Delta | OData.cs:85:25:85:32 | [post] access to parameter original : Widget | provenance | MaD:2 | -| OData.cs:85:25:85:32 | [post] access to parameter original : Widget | OData.cs:86:18:86:30 | access to property Name | provenance | | -| OData.cs:89:45:89:49 | delta : Delta | OData.cs:91:21:91:25 | access to parameter delta : Delta | provenance | | -| OData.cs:91:17:91:17 | access to local variable w : Widget | OData.cs:92:18:92:23 | access to property Name | provenance | | -| OData.cs:91:21:91:25 | access to parameter delta : Delta | OData.cs:91:21:91:39 | call to method GetInstance : Widget | provenance | MaD:1 | -| OData.cs:91:21:91:39 | call to method GetInstance : Widget | OData.cs:91:17:91:17 | access to local variable w : Widget | provenance | | -| OData.cs:95:67:95:71 | delta : Delta | OData.cs:97:13:97:17 | access to parameter delta : Delta | provenance | | -| OData.cs:97:13:97:17 | access to parameter delta : Delta | OData.cs:97:25:97:32 | [post] access to parameter original : Widget | provenance | MaD:4 | -| OData.cs:97:25:97:32 | [post] access to parameter original : Widget | OData.cs:98:18:98:30 | access to property Name | provenance | | -| OData.cs:101:71:101:75 | delta : Delta | OData.cs:103:21:103:25 | access to parameter delta : Delta | provenance | | -| OData.cs:103:17:103:17 | access to local variable w : Widget | OData.cs:104:18:104:23 | access to property Name | provenance | | -| OData.cs:103:21:103:25 | access to parameter delta : Delta | OData.cs:103:21:103:37 | call to method GetEntity : Widget | provenance | MaD:3 | -| OData.cs:103:21:103:37 | call to method GetEntity : Widget | OData.cs:103:17:103:17 | access to local variable w : Widget | provenance | | +| OData.cs:51:55:51:64 | parameters : ODataActionParameters | OData.cs:53:26:53:59 | (...) ... : BoundEntity1 | provenance | | +| OData.cs:53:17:53:22 | access to local variable entity : BoundEntity1 | OData.cs:54:18:54:23 | access to local variable entity | provenance | | +| OData.cs:53:17:53:22 | access to local variable entity : BoundEntity1 | OData.cs:55:18:55:28 | access to property Name | provenance | | +| OData.cs:53:17:53:22 | access to local variable entity : BoundEntity1 | OData.cs:56:18:56:31 | access to property Content | provenance | | +| OData.cs:53:17:53:22 | access to local variable entity : BoundEntity1 | OData.cs:57:18:57:38 | access to property Owner | provenance | | +| OData.cs:53:17:53:22 | access to local variable entity : BoundEntity1 | OData.cs:60:22:60:28 | access to property Owner | provenance | | +| OData.cs:53:26:53:59 | (...) ... : BoundEntity1 | OData.cs:53:17:53:22 | access to local variable entity : BoundEntity1 | provenance | | +| OData.cs:64:55:64:64 | parameters : ODataActionParameters | OData.cs:70:26:70:35 | access to property Label | provenance | | +| OData.cs:64:55:64:64 | parameters : ODataActionParameters | OData.cs:74:26:74:72 | ... as ... : IEnumerable | provenance | | +| OData.cs:74:17:74:22 | access to local variable items2 : IEnumerable | OData.cs:77:22:77:34 | access to property Category | provenance | | +| OData.cs:74:26:74:72 | ... as ... : IEnumerable | OData.cs:74:17:74:22 | access to local variable items2 : IEnumerable | provenance | | +| OData.cs:81:52:81:61 | parameters : ODataActionParameters | OData.cs:83:24:83:62 | (...) ... : ODataActionParameters | provenance | | +| OData.cs:83:17:83:20 | access to local variable dict : ODataActionParameters | OData.cs:84:26:84:53 | (...) ... : BoundEntity2 | provenance | | +| OData.cs:83:24:83:62 | (...) ... : ODataActionParameters | OData.cs:83:17:83:20 | access to local variable dict : ODataActionParameters | provenance | | +| OData.cs:84:17:84:22 | access to local variable entity : BoundEntity2 | OData.cs:85:18:85:28 | access to property Name | provenance | | +| OData.cs:84:26:84:53 | (...) ... : BoundEntity2 | OData.cs:84:17:84:22 | access to local variable entity : BoundEntity2 | provenance | | +| OData.cs:88:39:88:43 | delta : Delta | OData.cs:90:13:90:17 | access to parameter delta : Delta | provenance | | +| OData.cs:90:13:90:17 | access to parameter delta : Delta | OData.cs:90:25:90:32 | [post] access to parameter original : Widget | provenance | MaD:2 | +| OData.cs:90:25:90:32 | [post] access to parameter original : Widget | OData.cs:91:18:91:30 | access to property Name | provenance | | +| OData.cs:94:45:94:49 | delta : Delta | OData.cs:96:21:96:25 | access to parameter delta : Delta | provenance | | +| OData.cs:96:17:96:17 | access to local variable w : Widget | OData.cs:97:18:97:23 | access to property Name | provenance | | +| OData.cs:96:21:96:25 | access to parameter delta : Delta | OData.cs:96:21:96:39 | call to method GetInstance : Widget | provenance | MaD:1 | +| OData.cs:96:21:96:39 | call to method GetInstance : Widget | OData.cs:96:17:96:17 | access to local variable w : Widget | provenance | | +| OData.cs:100:67:100:71 | delta : Delta | OData.cs:102:13:102:17 | access to parameter delta : Delta | provenance | | +| OData.cs:102:13:102:17 | access to parameter delta : Delta | OData.cs:102:25:102:32 | [post] access to parameter original : Widget | provenance | MaD:4 | +| OData.cs:102:25:102:32 | [post] access to parameter original : Widget | OData.cs:103:18:103:30 | access to property Name | provenance | | +| OData.cs:106:71:106:75 | delta : Delta | OData.cs:108:21:108:25 | access to parameter delta : Delta | provenance | | +| OData.cs:108:17:108:17 | access to local variable w : Widget | OData.cs:109:18:109:23 | access to property Name | provenance | | +| OData.cs:108:21:108:25 | access to parameter delta : Delta | OData.cs:108:21:108:37 | call to method GetEntity : Widget | provenance | MaD:3 | +| OData.cs:108:21:108:37 | call to method GetEntity : Widget | OData.cs:108:17:108:17 | access to local variable w : Widget | provenance | | nodes -| OData.cs:46:55:46:64 | parameters : ODataActionParameters | semmle.label | parameters : ODataActionParameters | -| OData.cs:48:17:48:22 | access to local variable entity : BoundEntity | semmle.label | access to local variable entity : BoundEntity | -| OData.cs:48:26:48:58 | (...) ... : BoundEntity | semmle.label | (...) ... : BoundEntity | -| OData.cs:49:18:49:23 | access to local variable entity | semmle.label | access to local variable entity | -| OData.cs:50:18:50:28 | access to property Name | semmle.label | access to property Name | -| OData.cs:51:18:51:31 | access to property Content | semmle.label | access to property Content | -| OData.cs:52:18:52:38 | access to property Owner | semmle.label | access to property Owner | -| OData.cs:55:22:55:28 | access to property Owner | semmle.label | access to property Owner | -| OData.cs:59:55:59:64 | parameters : ODataActionParameters | semmle.label | parameters : ODataActionParameters | -| OData.cs:65:26:65:35 | access to property Label | semmle.label | access to property Label | -| OData.cs:69:17:69:22 | access to local variable items2 : IEnumerable | semmle.label | access to local variable items2 : IEnumerable | -| OData.cs:69:26:69:72 | ... as ... : IEnumerable | semmle.label | ... as ... : IEnumerable | -| OData.cs:72:22:72:34 | access to property Category | semmle.label | access to property Category | -| OData.cs:76:52:76:61 | parameters : ODataActionParameters | semmle.label | parameters : ODataActionParameters | -| OData.cs:78:41:78:44 | access to local variable dict : ODataActionParameters | semmle.label | access to local variable dict : ODataActionParameters | -| OData.cs:79:17:79:22 | access to local variable entity : BoundEntity | semmle.label | access to local variable entity : BoundEntity | -| OData.cs:79:26:79:52 | (...) ... : BoundEntity | semmle.label | (...) ... : BoundEntity | -| OData.cs:80:18:80:28 | access to property Name | semmle.label | access to property Name | -| OData.cs:83:39:83:43 | delta : Delta | semmle.label | delta : Delta | -| OData.cs:85:13:85:17 | access to parameter delta : Delta | semmle.label | access to parameter delta : Delta | -| OData.cs:85:25:85:32 | [post] access to parameter original : Widget | semmle.label | [post] access to parameter original : Widget | -| OData.cs:86:18:86:30 | access to property Name | semmle.label | access to property Name | -| OData.cs:89:45:89:49 | delta : Delta | semmle.label | delta : Delta | -| OData.cs:91:17:91:17 | access to local variable w : Widget | semmle.label | access to local variable w : Widget | -| OData.cs:91:21:91:25 | access to parameter delta : Delta | semmle.label | access to parameter delta : Delta | -| OData.cs:91:21:91:39 | call to method GetInstance : Widget | semmle.label | call to method GetInstance : Widget | -| OData.cs:92:18:92:23 | access to property Name | semmle.label | access to property Name | -| OData.cs:95:67:95:71 | delta : Delta | semmle.label | delta : Delta | -| OData.cs:97:13:97:17 | access to parameter delta : Delta | semmle.label | access to parameter delta : Delta | -| OData.cs:97:25:97:32 | [post] access to parameter original : Widget | semmle.label | [post] access to parameter original : Widget | -| OData.cs:98:18:98:30 | access to property Name | semmle.label | access to property Name | -| OData.cs:101:71:101:75 | delta : Delta | semmle.label | delta : Delta | -| OData.cs:103:17:103:17 | access to local variable w : Widget | semmle.label | access to local variable w : Widget | -| OData.cs:103:21:103:25 | access to parameter delta : Delta | semmle.label | access to parameter delta : Delta | -| OData.cs:103:21:103:37 | call to method GetEntity : Widget | semmle.label | call to method GetEntity : Widget | -| OData.cs:104:18:104:23 | access to property Name | semmle.label | access to property Name | +| OData.cs:51:55:51:64 | parameters : ODataActionParameters | semmle.label | parameters : ODataActionParameters | +| OData.cs:53:17:53:22 | access to local variable entity : BoundEntity1 | semmle.label | access to local variable entity : BoundEntity1 | +| OData.cs:53:26:53:59 | (...) ... : BoundEntity1 | semmle.label | (...) ... : BoundEntity1 | +| OData.cs:54:18:54:23 | access to local variable entity | semmle.label | access to local variable entity | +| OData.cs:55:18:55:28 | access to property Name | semmle.label | access to property Name | +| OData.cs:56:18:56:31 | access to property Content | semmle.label | access to property Content | +| OData.cs:57:18:57:38 | access to property Owner | semmle.label | access to property Owner | +| OData.cs:60:22:60:28 | access to property Owner | semmle.label | access to property Owner | +| OData.cs:64:55:64:64 | parameters : ODataActionParameters | semmle.label | parameters : ODataActionParameters | +| OData.cs:70:26:70:35 | access to property Label | semmle.label | access to property Label | +| OData.cs:74:17:74:22 | access to local variable items2 : IEnumerable | semmle.label | access to local variable items2 : IEnumerable | +| OData.cs:74:26:74:72 | ... as ... : IEnumerable | semmle.label | ... as ... : IEnumerable | +| OData.cs:77:22:77:34 | access to property Category | semmle.label | access to property Category | +| OData.cs:81:52:81:61 | parameters : ODataActionParameters | semmle.label | parameters : ODataActionParameters | +| OData.cs:83:17:83:20 | access to local variable dict : ODataActionParameters | semmle.label | access to local variable dict : ODataActionParameters | +| OData.cs:83:24:83:62 | (...) ... : ODataActionParameters | semmle.label | (...) ... : ODataActionParameters | +| OData.cs:84:17:84:22 | access to local variable entity : BoundEntity2 | semmle.label | access to local variable entity : BoundEntity2 | +| OData.cs:84:26:84:53 | (...) ... : BoundEntity2 | semmle.label | (...) ... : BoundEntity2 | +| OData.cs:85:18:85:28 | access to property Name | semmle.label | access to property Name | +| OData.cs:88:39:88:43 | delta : Delta | semmle.label | delta : Delta | +| OData.cs:90:13:90:17 | access to parameter delta : Delta | semmle.label | access to parameter delta : Delta | +| OData.cs:90:25:90:32 | [post] access to parameter original : Widget | semmle.label | [post] access to parameter original : Widget | +| OData.cs:91:18:91:30 | access to property Name | semmle.label | access to property Name | +| OData.cs:94:45:94:49 | delta : Delta | semmle.label | delta : Delta | +| OData.cs:96:17:96:17 | access to local variable w : Widget | semmle.label | access to local variable w : Widget | +| OData.cs:96:21:96:25 | access to parameter delta : Delta | semmle.label | access to parameter delta : Delta | +| OData.cs:96:21:96:39 | call to method GetInstance : Widget | semmle.label | call to method GetInstance : Widget | +| OData.cs:97:18:97:23 | access to property Name | semmle.label | access to property Name | +| OData.cs:100:67:100:71 | delta : Delta | semmle.label | delta : Delta | +| OData.cs:102:13:102:17 | access to parameter delta : Delta | semmle.label | access to parameter delta : Delta | +| OData.cs:102:25:102:32 | [post] access to parameter original : Widget | semmle.label | [post] access to parameter original : Widget | +| OData.cs:103:18:103:30 | access to property Name | semmle.label | access to property Name | +| OData.cs:106:71:106:75 | delta : Delta | semmle.label | delta : Delta | +| OData.cs:108:17:108:17 | access to local variable w : Widget | semmle.label | access to local variable w : Widget | +| OData.cs:108:21:108:25 | access to parameter delta : Delta | semmle.label | access to parameter delta : Delta | +| OData.cs:108:21:108:37 | call to method GetEntity : Widget | semmle.label | call to method GetEntity : Widget | +| OData.cs:109:18:109:23 | access to property Name | semmle.label | access to property Name | subpaths testFailures #select -| OData.cs:49:18:49:23 | access to local variable entity | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:49:18:49:23 | access to local variable entity | This path depends on an $@. | OData.cs:46:55:46:64 | parameters | ODataParameters value | -| OData.cs:50:18:50:28 | access to property Name | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:50:18:50:28 | access to property Name | This path depends on an $@. | OData.cs:46:55:46:64 | parameters | ODataParameters value | -| OData.cs:51:18:51:31 | access to property Content | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:51:18:51:31 | access to property Content | This path depends on an $@. | OData.cs:46:55:46:64 | parameters | ODataParameters value | -| OData.cs:52:18:52:38 | access to property Owner | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:52:18:52:38 | access to property Owner | This path depends on an $@. | OData.cs:46:55:46:64 | parameters | ODataParameters value | -| OData.cs:55:22:55:28 | access to property Owner | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:55:22:55:28 | access to property Owner | This path depends on an $@. | OData.cs:46:55:46:64 | parameters | ODataParameters value | -| OData.cs:65:26:65:35 | access to property Label | OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:65:26:65:35 | access to property Label | This path depends on an $@. | OData.cs:59:55:59:64 | parameters | ODataParameters value | -| OData.cs:72:22:72:34 | access to property Category | OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:72:22:72:34 | access to property Category | This path depends on an $@. | OData.cs:59:55:59:64 | parameters | ODataParameters value | -| OData.cs:80:18:80:28 | access to property Name | OData.cs:76:52:76:61 | parameters : ODataActionParameters | OData.cs:80:18:80:28 | access to property Name | This path depends on an $@. | OData.cs:76:52:76:61 | parameters | ODataParameters value | -| OData.cs:86:18:86:30 | access to property Name | OData.cs:83:39:83:43 | delta : Delta | OData.cs:86:18:86:30 | access to property Name | This path depends on an $@. | OData.cs:83:39:83:43 | delta | ODataParameters value | -| OData.cs:92:18:92:23 | access to property Name | OData.cs:89:45:89:49 | delta : Delta | OData.cs:92:18:92:23 | access to property Name | This path depends on an $@. | OData.cs:89:45:89:49 | delta | ODataParameters value | -| OData.cs:98:18:98:30 | access to property Name | OData.cs:95:67:95:71 | delta : Delta | OData.cs:98:18:98:30 | access to property Name | This path depends on an $@. | OData.cs:95:67:95:71 | delta | ODataParameters value | -| OData.cs:104:18:104:23 | access to property Name | OData.cs:101:71:101:75 | delta : Delta | OData.cs:104:18:104:23 | access to property Name | This path depends on an $@. | OData.cs:101:71:101:75 | delta | ODataParameters value | +| OData.cs:54:18:54:23 | access to local variable entity | OData.cs:51:55:51:64 | parameters : ODataActionParameters | OData.cs:54:18:54:23 | access to local variable entity | This path depends on an $@. | OData.cs:51:55:51:64 | parameters | ODataParameters value | +| OData.cs:55:18:55:28 | access to property Name | OData.cs:51:55:51:64 | parameters : ODataActionParameters | OData.cs:55:18:55:28 | access to property Name | This path depends on an $@. | OData.cs:51:55:51:64 | parameters | ODataParameters value | +| OData.cs:56:18:56:31 | access to property Content | OData.cs:51:55:51:64 | parameters : ODataActionParameters | OData.cs:56:18:56:31 | access to property Content | This path depends on an $@. | OData.cs:51:55:51:64 | parameters | ODataParameters value | +| OData.cs:57:18:57:38 | access to property Owner | OData.cs:51:55:51:64 | parameters : ODataActionParameters | OData.cs:57:18:57:38 | access to property Owner | This path depends on an $@. | OData.cs:51:55:51:64 | parameters | ODataParameters value | +| OData.cs:60:22:60:28 | access to property Owner | OData.cs:51:55:51:64 | parameters : ODataActionParameters | OData.cs:60:22:60:28 | access to property Owner | This path depends on an $@. | OData.cs:51:55:51:64 | parameters | ODataParameters value | +| OData.cs:70:26:70:35 | access to property Label | OData.cs:64:55:64:64 | parameters : ODataActionParameters | OData.cs:70:26:70:35 | access to property Label | This path depends on an $@. | OData.cs:64:55:64:64 | parameters | ODataParameters value | +| OData.cs:77:22:77:34 | access to property Category | OData.cs:64:55:64:64 | parameters : ODataActionParameters | OData.cs:77:22:77:34 | access to property Category | This path depends on an $@. | OData.cs:64:55:64:64 | parameters | ODataParameters value | +| OData.cs:85:18:85:28 | access to property Name | OData.cs:81:52:81:61 | parameters : ODataActionParameters | OData.cs:85:18:85:28 | access to property Name | This path depends on an $@. | OData.cs:81:52:81:61 | parameters | ODataParameters value | +| OData.cs:91:18:91:30 | access to property Name | OData.cs:88:39:88:43 | delta : Delta | OData.cs:91:18:91:30 | access to property Name | This path depends on an $@. | OData.cs:88:39:88:43 | delta | ODataParameters value | +| OData.cs:97:18:97:23 | access to property Name | OData.cs:94:45:94:49 | delta : Delta | OData.cs:97:18:97:23 | access to property Name | This path depends on an $@. | OData.cs:94:45:94:49 | delta | ODataParameters value | +| OData.cs:103:18:103:30 | access to property Name | OData.cs:100:67:100:71 | delta : Delta | OData.cs:103:18:103:30 | access to property Name | This path depends on an $@. | OData.cs:100:67:100:71 | delta | ODataParameters value | +| OData.cs:109:18:109:23 | access to property Name | OData.cs:106:71:106:75 | delta : Delta | OData.cs:109:18:109:23 | access to property Name | This path depends on an $@. | OData.cs:106:71:106:75 | delta | ODataParameters value | From 8519b913eed24e2022a3f79407320f60c61e00af Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 27 Aug 2026 11:25:03 +0200 Subject: [PATCH 0552/2098] C#: Remove recursion. --- csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll index 16422fda1d8c..bc0cbb431e3f 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll @@ -36,9 +36,9 @@ class ODataActionParametersClass extends Class { * -- may hold the value of) an `ODataActionParameters` dictionary. */ private predicate isODataActionParametersValue(Expr e) { - e.getType() instanceof ODataActionParametersClass - or - DataFlow::localExprFlow(any(Expr e0 | isODataActionParametersValue(e0)), e) + exists(ParameterAccess e0 | e0.getType() instanceof ODataActionParametersClass | + e0 = e or DataFlow::localExprFlow(e0, e) + ) } /** From caac5d81219efb6dea33754618aead7c7edd5fdb Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Thu, 27 Aug 2026 14:31:57 +0200 Subject: [PATCH 0553/2098] Widen escape round-trip test to all printable ASCII neighbours The test claimed exhaustive coverage but checked seven suffix characters and no prefix at all. Cover every printable ASCII neighbour on both sides of each escape shape, rendering `"` and `\` as Rust would. 2280 cases, 24ms. Also state the NUL case as the single literal `"\01"`, since the `+` notation read as concatenation of two separate literals. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../semmle/python/parser/tsg_parser.py | 3 +- python/extractor/tests/test_tsg_parser.py | 46 +++++++++++-------- 2 files changed, 29 insertions(+), 20 deletions(-) diff --git a/python/extractor/semmle/python/parser/tsg_parser.py b/python/extractor/semmle/python/parser/tsg_parser.py index 2ce1ec0cd18b..83dc853b525e 100644 --- a/python/extractor/semmle/python/parser/tsg_parser.py +++ b/python/extractor/semmle/python/parser/tsg_parser.py @@ -179,7 +179,8 @@ def read_tsg_python_output(path, logger): # variation selector, U+200D zero width joiner and combining accents -- are rendered as `\u{...}`, # a syntax Python does not know at all; # - NUL is rendered as `\0`, which Python reads as the start of an *octal* escape, silently -# swallowing up to two more digits (`"\0" + "1"` would decode to `\x01`). +# swallowing up to two more digits (NUL followed by `1` is emitted as `"\01"`, which decodes +# to `\x01`). # Everything else Rust emits (`\t`, `\r`, `\n`, `\\`, `\"`, and unescaped characters) is read back # identically by `literal_eval`, as verified exhaustively over every Unicode scalar value. _RUST_ESCAPE = re.compile(r"\\(?:u\{([0-9a-fA-F]{1,6})\}|.)", re.DOTALL) diff --git a/python/extractor/tests/test_tsg_parser.py b/python/extractor/tests/test_tsg_parser.py index 40249fb1eb4c..b4df0007e905 100644 --- a/python/extractor/tests/test_tsg_parser.py +++ b/python/extractor/tests/test_tsg_parser.py @@ -37,26 +37,34 @@ def test_nul_is_not_left_as_an_octal_escape(self): self.assertEqual(rust_to_python_escapes(r'"\01"'), r'"\x001"') def test_every_escape_shape_round_trips(self): - # Rust's `Debug for str` only ever emits these shapes. Checked exhaustively against every - # Unicode scalar value, each also paired with every printable ASCII neighbour. - for rendered, expected in [ - (r'"\0"', "\x00"), - (r'"\t"', "\t"), - (r'"\n"', "\n"), - (r'"\r"', "\r"), - (r'"\\"', "\\"), - (r'"\""', '"'), - (r'"\u{1}"', "\u0001"), - (r'"\u{1f}"', "\u001f"), - (r'"\u{300}"', "\u0300"), - (r'"\u{fe0f}"', "\ufe0f"), - (r'"\u{e0100}"', "\U000e0100"), - (r'"\u{10fffe}"', "\U0010fffe"), + # Rust's `Debug for str` only ever emits these escape shapes. Check that each round-trips + # with every printable ASCII neighbour before and after it. + for escape_shape, expected in [ + (r'\0', "\x00"), + (r'\t', "\t"), + (r'\n', "\n"), + (r'\r', "\r"), + (r'\\', "\\"), + (r'\"', '"'), + (r'\u{1}', "\u0001"), + (r'\u{1f}', "\u001f"), + (r'\u{300}', "\u0300"), + (r'\u{fe0f}', "\ufe0f"), + (r'\u{e0100}', "\U000e0100"), + (r'\u{10fffe}', "\U0010fffe"), ]: - for neighbour in ["", "0", "7", "9", "f", "u", "{"]: - with self.subTest(rendered=rendered, neighbour=neighbour): - text = rendered[:-1] + neighbour + '"' - self.assertEqual(literal_eval(rust_to_python_escapes(text)), expected + neighbour) + for neighbour in map(chr, range(0x20, 0x7F)): + rendered_neighbour = {"\\": r"\\", '"': r'\"'}.get(neighbour, neighbour) + for position, text, expected_value in [ + ("before", '"' + rendered_neighbour + escape_shape + '"', neighbour + expected), + ("after", '"' + escape_shape + rendered_neighbour + '"', expected + neighbour), + ]: + with self.subTest( + escape_shape=escape_shape, + neighbour=neighbour, + position=position, + ): + self.assertEqual(literal_eval(rust_to_python_escapes(text)), expected_value) def test_evaluate_string_on_reported_value(self): # The exact value from https://github.com/github/codeql/issues/22435 that used to raise From 3d4cd3773b2ea2c717572bbd11f1c28bdd94d8ff Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 26 Aug 2026 22:35:34 +0100 Subject: [PATCH 0554/2098] Rust: Accept changes to .expected files. --- .../rust-code-scanning.qls.expected | 1 + .../rust-security-and-quality.qls.expected | 1 + .../rust-security-extended.qls.expected | 1 + .../CWE-078/CommandInjection.expected | 60 +++++++++---------- 4 files changed, 33 insertions(+), 30 deletions(-) diff --git a/rust/ql/integration-tests/query-suite/rust-code-scanning.qls.expected b/rust/ql/integration-tests/query-suite/rust-code-scanning.qls.expected index 9b10079767ba..d7611c2993b8 100644 --- a/rust/ql/integration-tests/query-suite/rust-code-scanning.qls.expected +++ b/rust/ql/integration-tests/query-suite/rust-code-scanning.qls.expected @@ -10,6 +10,7 @@ ql/rust/ql/src/queries/diagnostics/UnextractedElements.ql ql/rust/ql/src/queries/diagnostics/UnresolvedMacroCalls.ql ql/rust/ql/src/queries/security/CWE-020/RegexInjection.ql ql/rust/ql/src/queries/security/CWE-022/TaintedPath.ql +ql/rust/ql/src/queries/security/CWE-078/CommandInjection.ql ql/rust/ql/src/queries/security/CWE-079/XSS.ql ql/rust/ql/src/queries/security/CWE-089/SqlInjection.ql ql/rust/ql/src/queries/security/CWE-295/DisabledCertificateCheck.ql diff --git a/rust/ql/integration-tests/query-suite/rust-security-and-quality.qls.expected b/rust/ql/integration-tests/query-suite/rust-security-and-quality.qls.expected index 4059cb40ab61..6c8d1fe5897f 100644 --- a/rust/ql/integration-tests/query-suite/rust-security-and-quality.qls.expected +++ b/rust/ql/integration-tests/query-suite/rust-security-and-quality.qls.expected @@ -10,6 +10,7 @@ ql/rust/ql/src/queries/diagnostics/UnextractedElements.ql ql/rust/ql/src/queries/diagnostics/UnresolvedMacroCalls.ql ql/rust/ql/src/queries/security/CWE-020/RegexInjection.ql ql/rust/ql/src/queries/security/CWE-022/TaintedPath.ql +ql/rust/ql/src/queries/security/CWE-078/CommandInjection.ql ql/rust/ql/src/queries/security/CWE-079/XSS.ql ql/rust/ql/src/queries/security/CWE-089/SqlInjection.ql ql/rust/ql/src/queries/security/CWE-117/LogInjection.ql diff --git a/rust/ql/integration-tests/query-suite/rust-security-extended.qls.expected b/rust/ql/integration-tests/query-suite/rust-security-extended.qls.expected index 2d660d4f3a3e..f41a12fae037 100644 --- a/rust/ql/integration-tests/query-suite/rust-security-extended.qls.expected +++ b/rust/ql/integration-tests/query-suite/rust-security-extended.qls.expected @@ -10,6 +10,7 @@ ql/rust/ql/src/queries/diagnostics/UnextractedElements.ql ql/rust/ql/src/queries/diagnostics/UnresolvedMacroCalls.ql ql/rust/ql/src/queries/security/CWE-020/RegexInjection.ql ql/rust/ql/src/queries/security/CWE-022/TaintedPath.ql +ql/rust/ql/src/queries/security/CWE-078/CommandInjection.ql ql/rust/ql/src/queries/security/CWE-079/XSS.ql ql/rust/ql/src/queries/security/CWE-089/SqlInjection.ql ql/rust/ql/src/queries/security/CWE-117/LogInjection.ql diff --git a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected index be6128cef5d0..3b9da31661a4 100644 --- a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected @@ -17,45 +17,45 @@ edges | main.rs:4:9:4:18 | arg_string | main.rs:27:18:27:27 | arg_string | provenance | | | main.rs:4:9:4:18 | arg_string | main.rs:40:14:40:23 | arg_string | provenance | | | main.rs:4:22:4:37 | ...::args(...) | main.rs:4:22:4:37 | ...::args(...) [element] | provenance | Src:MaD:7 | -| main.rs:4:22:4:37 | ...::args(...) [element] | main.rs:4:22:4:44 | ... .nth(...) [Some] | provenance | MaD:8 | -| main.rs:4:22:4:44 | ... .nth(...) [Some] | main.rs:4:22:4:74 | ... .unwrap_or(...) | provenance | MaD:10 | +| main.rs:4:22:4:37 | ...::args(...) [element] | main.rs:4:22:4:44 | ... .nth(...) [Some] | provenance | MaD:15 | +| main.rs:4:22:4:44 | ... .nth(...) [Some] | main.rs:4:22:4:74 | ... .unwrap_or(...) | provenance | MaD:9 | | main.rs:4:22:4:74 | ... .unwrap_or(...) | main.rs:4:9:4:18 | arg_string | provenance | | | main.rs:5:9:5:21 | remote_string | main.rs:34:14:34:26 | remote_string | provenance | | | main.rs:5:9:5:21 | remote_string | main.rs:47:23:47:35 | remote_string | provenance | | | main.rs:5:9:5:21 | remote_string | main.rs:52:40:52:69 | MacroExpr | provenance | | | main.rs:5:25:5:69 | ...::get(...) | main.rs:5:25:5:69 | ...::get(...) [Ok] | provenance | Src:MaD:6 | -| main.rs:5:25:5:69 | ...::get(...) [Ok] | main.rs:5:25:6:17 | ... .unwrap() | provenance | MaD:11 | -| main.rs:5:25:6:17 | ... .unwrap() | main.rs:5:25:7:15 | ... .text() [Ok] | provenance | MaD:13 | -| main.rs:5:25:7:15 | ... .text() [Ok] | main.rs:5:25:8:38 | ... .unwrap_or(...) | provenance | MaD:12 | +| main.rs:5:25:5:69 | ...::get(...) [Ok] | main.rs:5:25:6:17 | ... .unwrap() | provenance | MaD:10 | +| main.rs:5:25:6:17 | ... .unwrap() | main.rs:5:25:7:15 | ... .text() [Ok] | provenance | MaD:12 | +| main.rs:5:25:7:15 | ... .text() [Ok] | main.rs:5:25:8:38 | ... .unwrap_or(...) | provenance | MaD:11 | | main.rs:5:25:8:38 | ... .unwrap_or(...) | main.rs:5:9:5:21 | remote_string | provenance | | -| main.rs:27:18:27:27 | arg_string | main.rs:27:18:27:36 | arg_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:27:18:27:27 | arg_string | main.rs:27:18:27:36 | arg_string.as_str() [&ref] | provenance | MaD:8 | | main.rs:27:18:27:36 | arg_string.as_str() [&ref] | main.rs:27:18:27:36 | arg_string.as_str() | provenance | Sink:MaD:3 | -| main.rs:34:14:34:26 | remote_string | main.rs:34:14:34:35 | remote_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:34:14:34:26 | remote_string | main.rs:34:14:34:35 | remote_string.as_str() [&ref] | provenance | MaD:8 | | main.rs:34:14:34:35 | remote_string.as_str() [&ref] | main.rs:34:14:34:35 | remote_string.as_str() | provenance | Sink:MaD:1 | -| main.rs:40:14:40:23 | arg_string | main.rs:40:14:40:32 | arg_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:40:14:40:23 | arg_string | main.rs:40:14:40:32 | arg_string.as_str() [&ref] | provenance | MaD:8 | | main.rs:40:14:40:32 | arg_string.as_str() [&ref] | main.rs:40:14:40:32 | arg_string.as_str() | provenance | Sink:MaD:1 | | main.rs:47:15:47:45 | &... [&ref, element, &ref] | main.rs:47:15:47:45 | &... | provenance | Sink:MaD:2 Sink:MaD:2 | | main.rs:47:15:47:45 | &... [&ref, element, &ref] | main.rs:47:15:47:45 | &... | provenance | Sink:MaD:2 Sink:MaD:2 Sink:MaD:2 | | main.rs:47:16:47:45 | [...] [element, &ref] | main.rs:47:15:47:45 | &... [&ref, element, &ref] | provenance | | -| main.rs:47:23:47:35 | remote_string | main.rs:47:23:47:44 | remote_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:47:23:47:35 | remote_string | main.rs:47:23:47:44 | remote_string.as_str() [&ref] | provenance | MaD:8 | | main.rs:47:23:47:44 | remote_string.as_str() [&ref] | main.rs:47:16:47:45 | [...] [element, &ref] | provenance | | | main.rs:52:9:52:28 | concatenated_command | main.rs:53:18:53:37 | concatenated_command | provenance | | | main.rs:52:40:52:69 | ...::format(...) | main.rs:52:40:52:69 | { ... } | provenance | | | main.rs:52:40:52:69 | ...::must_use(...) | main.rs:52:9:52:28 | concatenated_command | provenance | | -| main.rs:52:40:52:69 | MacroExpr | main.rs:52:40:52:69 | ...::format(...) | provenance | MaD:14 | -| main.rs:52:40:52:69 | { ... } | main.rs:52:40:52:69 | ...::must_use(...) | provenance | MaD:15 | -| main.rs:53:18:53:37 | concatenated_command | main.rs:53:18:53:46 | concatenated_command.as_str() [&ref] | provenance | MaD:9 | +| main.rs:52:40:52:69 | MacroExpr | main.rs:52:40:52:69 | ...::format(...) | provenance | MaD:13 | +| main.rs:52:40:52:69 | { ... } | main.rs:52:40:52:69 | ...::must_use(...) | provenance | MaD:14 | +| main.rs:53:18:53:37 | concatenated_command | main.rs:53:18:53:46 | concatenated_command.as_str() [&ref] | provenance | MaD:8 | | main.rs:53:18:53:46 | concatenated_command.as_str() [&ref] | main.rs:53:18:53:46 | concatenated_command.as_str() | provenance | Sink:MaD:3 | | main.rs:59:9:59:21 | remote_string | main.rs:65:48:65:60 | remote_string | provenance | | | main.rs:59:9:59:21 | remote_string | main.rs:73:14:73:26 | remote_string | provenance | | | main.rs:59:25:59:69 | ...::get(...) | main.rs:59:25:59:69 | ...::get(...) [Ok] | provenance | Src:MaD:6 | -| main.rs:59:25:59:69 | ...::get(...) [Ok] | main.rs:59:25:60:17 | ... .unwrap() | provenance | MaD:11 | -| main.rs:59:25:60:17 | ... .unwrap() | main.rs:59:25:61:15 | ... .text() [Ok] | provenance | MaD:13 | -| main.rs:59:25:61:15 | ... .text() [Ok] | main.rs:59:25:62:38 | ... .unwrap_or(...) | provenance | MaD:12 | +| main.rs:59:25:59:69 | ...::get(...) [Ok] | main.rs:59:25:60:17 | ... .unwrap() | provenance | MaD:10 | +| main.rs:59:25:60:17 | ... .unwrap() | main.rs:59:25:61:15 | ... .text() [Ok] | provenance | MaD:12 | +| main.rs:59:25:61:15 | ... .text() [Ok] | main.rs:59:25:62:38 | ... .unwrap_or(...) | provenance | MaD:11 | | main.rs:59:25:62:38 | ... .unwrap_or(...) | main.rs:59:9:59:21 | remote_string | provenance | | -| main.rs:65:48:65:60 | remote_string | main.rs:65:48:65:69 | remote_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:65:48:65:60 | remote_string | main.rs:65:48:65:69 | remote_string.as_str() [&ref] | provenance | MaD:8 | | main.rs:65:48:65:69 | remote_string.as_str() [&ref] | main.rs:65:48:65:69 | remote_string.as_str() | provenance | Sink:MaD:5 | -| main.rs:73:14:73:26 | remote_string | main.rs:73:14:73:35 | remote_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:73:14:73:26 | remote_string | main.rs:73:14:73:35 | remote_string.as_str() [&ref] | provenance | MaD:8 | | main.rs:73:14:73:35 | remote_string.as_str() [&ref] | main.rs:73:14:73:35 | remote_string.as_str() | provenance | Sink:MaD:4 | | main.rs:82:27:82:42 | ...: ... [&ref] | main.rs:86:18:86:27 | user_input | provenance | Sink:MaD:1 | | main.rs:95:27:95:40 | ...: ... [&ref] | main.rs:100:22:100:29 | filename | provenance | Sink:MaD:1 | @@ -68,14 +68,14 @@ edges | main.rs:138:9:138:18 | arg_string | main.rs:143:40:143:49 | arg_string | provenance | | | main.rs:138:9:138:18 | arg_string | main.rs:144:31:144:40 | arg_string | provenance | | | main.rs:138:22:138:37 | ...::args(...) | main.rs:138:22:138:37 | ...::args(...) [element] | provenance | Src:MaD:7 | -| main.rs:138:22:138:37 | ...::args(...) [element] | main.rs:138:22:138:44 | ... .nth(...) [Some] | provenance | MaD:8 | -| main.rs:138:22:138:44 | ... .nth(...) [Some] | main.rs:138:22:138:74 | ... .unwrap_or(...) | provenance | MaD:10 | +| main.rs:138:22:138:37 | ...::args(...) [element] | main.rs:138:22:138:44 | ... .nth(...) [Some] | provenance | MaD:15 | +| main.rs:138:22:138:44 | ... .nth(...) [Some] | main.rs:138:22:138:74 | ... .unwrap_or(...) | provenance | MaD:9 | | main.rs:138:22:138:74 | ... .unwrap_or(...) | main.rs:138:9:138:18 | arg_string | provenance | | -| main.rs:142:39:142:48 | arg_string | main.rs:142:39:142:57 | arg_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:142:39:142:48 | arg_string | main.rs:142:39:142:57 | arg_string.as_str() [&ref] | provenance | MaD:8 | | main.rs:142:39:142:57 | arg_string.as_str() [&ref] | main.rs:82:27:82:42 | ...: ... [&ref] | provenance | | -| main.rs:143:40:143:49 | arg_string | main.rs:143:40:143:58 | arg_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:143:40:143:49 | arg_string | main.rs:143:40:143:58 | arg_string.as_str() [&ref] | provenance | MaD:8 | | main.rs:143:40:143:58 | arg_string.as_str() [&ref] | main.rs:95:27:95:40 | ...: ... [&ref] | provenance | | -| main.rs:144:31:144:40 | arg_string | main.rs:144:31:144:49 | arg_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:144:31:144:40 | arg_string | main.rs:144:31:144:49 | arg_string.as_str() [&ref] | provenance | MaD:8 | | main.rs:144:31:144:49 | arg_string.as_str() [&ref] | main.rs:107:30:107:42 | ...: ... [&ref] | provenance | | models | 1 | Sink: ::arg; Argument[0]; command-injection | @@ -85,14 +85,14 @@ models | 5 | Sink: ::new; Argument[0]; command-injection | | 6 | Source: reqwest::blocking::get; ReturnValue.Field[core::result::Result::Ok(0)]; remote | | 7 | Source: std::env::args; ReturnValue.Element; commandargs | -| 8 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 9 | Summary: ::as_str; Argument[self].Reference; ReturnValue.Reference; taint | -| 10 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 11 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 12 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 13 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 14 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | -| 15 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | +| 8 | Summary: ::as_str; Argument[self].Reference; ReturnValue.Reference; taint | +| 9 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 10 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 11 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 12 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 13 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 14 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | +| 15 | Summary: core::iter::traits::iterator::Iterator::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | nodes | main.rs:4:9:4:18 | arg_string | semmle.label | arg_string | | main.rs:4:22:4:37 | ...::args(...) | semmle.label | ...::args(...) | From 4623819f24396eed618750bac4bac1ac81d7e3ba Mon Sep 17 00:00:00 2001 From: AkshayK Date: Thu, 27 Aug 2026 11:42:17 -0400 Subject: [PATCH 0555/2098] cpp: model libpq query functions as SQL-injection sinks Add the PostgreSQL libpq query-execution functions as sql-injection sinks so cpp/sql-injection flags tainted data reaching their SQL text: - PQexec / PQsendQuery: query at argument 1 - PQexecParams / PQsendQueryParams: command at argument 1 - PQprepare / PQsendPrepare: query at argument 2 The *Prepared forms take a prepared-statement name rather than SQL text and are not modeled. Follows the existing Oracle.oci sink convention. --- .../2026-08-27-libpq-sql-sinks.md | 4 ++ cpp/ql/lib/ext/Postgres.model.yml | 16 ++++++++ .../CWE-089/SqlTainted/SqlTainted.expected | 25 ++++++++++++ .../CWE/CWE-089/SqlTainted/test_libpq.c | 38 +++++++++++++++++++ 4 files changed, 83 insertions(+) create mode 100644 cpp/ql/lib/change-notes/2026-08-27-libpq-sql-sinks.md create mode 100644 cpp/ql/lib/ext/Postgres.model.yml create mode 100644 cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/test_libpq.c diff --git a/cpp/ql/lib/change-notes/2026-08-27-libpq-sql-sinks.md b/cpp/ql/lib/change-notes/2026-08-27-libpq-sql-sinks.md new file mode 100644 index 000000000000..94899fdafafa --- /dev/null +++ b/cpp/ql/lib/change-notes/2026-08-27-libpq-sql-sinks.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added the PostgreSQL libpq query-execution functions (`PQexec`, `PQexecParams`, `PQprepare`, and their asynchronous `PQsendQuery`/`PQsendQueryParams`/`PQsendPrepare` counterparts) as `sql-injection` sinks, so the "Uncontrolled data used in SQL query" query flags tainted data reaching their command/query arguments. diff --git a/cpp/ql/lib/ext/Postgres.model.yml b/cpp/ql/lib/ext/Postgres.model.yml new file mode 100644 index 000000000000..958522e09cbe --- /dev/null +++ b/cpp/ql/lib/ext/Postgres.model.yml @@ -0,0 +1,16 @@ +# partial model of the PostgreSQL libpq C API +extensions: + - addsTo: + pack: codeql/cpp-all + extensible: sinkModel + data: # namespace, type, subtypes, name, signature, ext, input, kind, provenance + # Functions that take a raw SQL command string. The `*Params`/`*Prepare` forms still + # interpret their command/query text as SQL, so injection into that text is a sink even + # though the parameter *values* are passed separately. The `*Prepared` forms take a + # prepared-statement name rather than SQL text and are therefore not modeled here. + - ["", "", False, "PQexec", "", "", "Argument[*1]", "sql-injection", "manual"] + - ["", "", False, "PQexecParams", "", "", "Argument[*1]", "sql-injection", "manual"] + - ["", "", False, "PQprepare", "", "", "Argument[*2]", "sql-injection", "manual"] + - ["", "", False, "PQsendQuery", "", "", "Argument[*1]", "sql-injection", "manual"] + - ["", "", False, "PQsendQueryParams", "", "", "Argument[*1]", "sql-injection", "manual"] + - ["", "", False, "PQsendPrepare", "", "", "Argument[*2]", "sql-injection", "manual"] diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected index 2e00cb866749..5dedd13a12bd 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected @@ -6,6 +6,12 @@ | test.c:106:24:106:29 | query1 | test.c:101:8:101:16 | gets output argument | test.c:106:24:106:29 | query1 | This argument to a SQL query function is derived from $@. | test.c:101:8:101:16 | gets output argument | user input (string read by gets) | | test.c:107:28:107:33 | query1 | test.c:101:8:101:16 | gets output argument | test.c:107:28:107:33 | query1 | This argument to a SQL query function is derived from $@. | test.c:101:8:101:16 | gets output argument | user input (string read by gets) | | test.cpp:43:27:43:33 | *access to array | test.cpp:39:27:39:30 | **argv | test.cpp:43:27:43:33 | *access to array | This argument to a SQL query function is derived from $@ and then passed to pqxx::work::exec1((unnamed parameter 0)). | test.cpp:39:27:39:30 | **argv | user input (a command-line argument) | +| test_libpq.c:29:16:29:24 | userInput | test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:29:16:29:24 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:26:8:26:16 | gets output argument | user input (string read by gets) | +| test_libpq.c:30:22:30:30 | userInput | test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:30:22:30:30 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:26:8:26:16 | gets output argument | user input (string read by gets) | +| test_libpq.c:31:27:31:35 | userInput | test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:31:27:31:35 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:26:8:26:16 | gets output argument | user input (string read by gets) | +| test_libpq.c:32:21:32:29 | userInput | test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:32:21:32:29 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:26:8:26:16 | gets output argument | user input (string read by gets) | +| test_libpq.c:33:27:33:35 | userInput | test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:33:27:33:35 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:26:8:26:16 | gets output argument | user input (string read by gets) | +| test_libpq.c:34:31:34:39 | userInput | test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:34:31:34:39 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:26:8:26:16 | gets output argument | user input (string read by gets) | edges | test.c:14:27:14:30 | **argv | test.c:15:20:15:26 | *access to array | provenance | | | test.c:15:20:15:26 | *access to array | test.c:21:18:21:23 | *query1 | provenance | TaintFunction | @@ -20,9 +26,21 @@ edges | test.c:101:8:101:16 | gets output argument | test.c:106:24:106:29 | query1 | provenance | TaintFunction Sink:MaD:2 | | test.c:101:8:101:16 | gets output argument | test.c:107:28:107:33 | query1 | provenance | TaintFunction Sink:MaD:1 | | test.cpp:39:27:39:30 | **argv | test.cpp:43:27:43:33 | *access to array | provenance | | +| test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:29:16:29:24 | userInput | provenance | Sink:MaD:3 | +| test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:30:22:30:30 | userInput | provenance | Sink:MaD:4 | +| test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:31:27:31:35 | userInput | provenance | Sink:MaD:5 | +| test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:32:21:32:29 | userInput | provenance | Sink:MaD:7 | +| test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:33:27:33:35 | userInput | provenance | Sink:MaD:8 | +| test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:34:31:34:39 | userInput | provenance | Sink:MaD:6 | models | 1 | Sink: ; ; false; OCIStmtPrepare2; ; ; Argument[*3]; sql-injection; manual | | 2 | Sink: ; ; false; OCIStmtPrepare; ; ; Argument[*2]; sql-injection; manual | +| 3 | Sink: ; ; false; PQexec; ; ; Argument[*1]; sql-injection; manual | +| 4 | Sink: ; ; false; PQexecParams; ; ; Argument[*1]; sql-injection; manual | +| 5 | Sink: ; ; false; PQprepare; ; ; Argument[*2]; sql-injection; manual | +| 6 | Sink: ; ; false; PQsendPrepare; ; ; Argument[*2]; sql-injection; manual | +| 7 | Sink: ; ; false; PQsendQuery; ; ; Argument[*1]; sql-injection; manual | +| 8 | Sink: ; ; false; PQsendQueryParams; ; ; Argument[*1]; sql-injection; manual | nodes | test.c:14:27:14:30 | **argv | semmle.label | **argv | | test.c:15:20:15:26 | *access to array | semmle.label | *access to array | @@ -41,4 +59,11 @@ nodes | test.c:107:28:107:33 | query1 | semmle.label | query1 | | test.cpp:39:27:39:30 | **argv | semmle.label | **argv | | test.cpp:43:27:43:33 | *access to array | semmle.label | *access to array | +| test_libpq.c:26:8:26:16 | gets output argument | semmle.label | gets output argument | +| test_libpq.c:29:16:29:24 | userInput | semmle.label | userInput | +| test_libpq.c:30:22:30:30 | userInput | semmle.label | userInput | +| test_libpq.c:31:27:31:35 | userInput | semmle.label | userInput | +| test_libpq.c:32:21:32:29 | userInput | semmle.label | userInput | +| test_libpq.c:33:27:33:35 | userInput | semmle.label | userInput | +| test_libpq.c:34:31:34:39 | userInput | semmle.label | userInput | subpaths diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/test_libpq.c b/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/test_libpq.c new file mode 100644 index 000000000000..4fc26907b136 --- /dev/null +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/test_libpq.c @@ -0,0 +1,38 @@ +// Test case for the PostgreSQL libpq SQL-injection sinks modeled in Postgres.model.yml. +// Associated with CWE-089: SQL injection. + +typedef unsigned long size_t; +typedef unsigned int Oid; +typedef struct pg_conn PGconn; +typedef struct pg_result PGresult; + +PGresult *PQexec(PGconn *conn, const char *query); +PGresult *PQexecParams(PGconn *conn, const char *command, int nParams, + const Oid *paramTypes, const char *const *paramValues, + const int *paramLengths, const int *paramFormats, int resultFormat); +PGresult *PQprepare(PGconn *conn, const char *stmtName, const char *query, int nParams, + const Oid *paramTypes); +int PQsendQuery(PGconn *conn, const char *query); +int PQsendQueryParams(PGconn *conn, const char *command, int nParams, const Oid *paramTypes, + const char *const *paramValues, const int *paramLengths, + const int *paramFormats, int resultFormat); +int PQsendPrepare(PGconn *conn, const char *stmtName, const char *query, int nParams, + const Oid *paramTypes); + +char *gets(char *s); + +void libpqTests(PGconn *conn) { + char userInput[1000]; + gets(userInput); // $ Source + + // A user-controlled string is interpreted as SQL. + PQexec(conn, userInput); // $ Alert + PQexecParams(conn, userInput, 0, 0, 0, 0, 0, 0); // $ Alert + PQprepare(conn, "stmt", userInput, 0, 0); // $ Alert + PQsendQuery(conn, userInput); // $ Alert + PQsendQueryParams(conn, userInput, 0, 0, 0, 0, 0, 0); // $ Alert + PQsendPrepare(conn, "stmt", userInput, 0, 0); // $ Alert + + // A constant query is safe. + PQexec(conn, "SELECT 1"); // GOOD +} From 94afbf91a48eedd57fb47dde08e885e3abcb721d Mon Sep 17 00:00:00 2001 From: Henry Mercer Date: Thu, 27 Aug 2026 17:43:42 +0100 Subject: [PATCH 0556/2098] Swift: Test the thinned macOS resource dir Point at the staging artifact built with the x86_64-only thinning from semmle-code. Must be reverted before merging. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 03df685d-b0f4-4920-8c7c-8e70c6c868bf --- swift/third_party/load.bzl | 1 + 1 file changed, 1 insertion(+) diff --git a/swift/third_party/load.bzl b/swift/third_party/load.bzl index 676c5f0ce847..05cac9509e11 100644 --- a/swift/third_party/load.bzl +++ b/swift/third_party/load.bzl @@ -6,6 +6,7 @@ load("//misc/bazel:lfs.bzl", "lfs_archive", "lfs_files") _override = { # these are used to test new artifacts. Must be empty before merging to main + "resource-dir-macOS-swift-6.3.3-RELEASE-228.zip": "7c4d3307c8986fb2118bb46d36637fcf82385b8a19153f3656fe5065058fbccb", } _staging_url = "https://github.com/dsp-testing/codeql-swift-artifacts/releases/download/staging-{}/{}" From 03237320d9feafbbe815e29ac1ac341c764f4c87 Mon Sep 17 00:00:00 2001 From: Kristen Newbury Date: Thu, 27 Aug 2026 12:54:40 -0400 Subject: [PATCH 0557/2098] Improve documentation on actions/security/ControlChecks.qll EnvironmentCheck --- .../ql/lib/codeql/actions/security/ControlChecks.qll | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/actions/ql/lib/codeql/actions/security/ControlChecks.qll b/actions/ql/lib/codeql/actions/security/ControlChecks.qll index aea57fdc4b71..f9a472f4abff 100644 --- a/actions/ql/lib/codeql/actions/security/ControlChecks.qll +++ b/actions/ql/lib/codeql/actions/security/ControlChecks.qll @@ -276,9 +276,19 @@ abstract class LabelCheck extends ControlCheck { } } +/** + * This type represents deployment environments that may serve as sanitizers for + * various vunlerabilities. + * + * It is possible to customize which deployment environments apply. The default behavior + * of this model is for any environment to be considered a sanitizer. + * If values are (currently manually/externally) provided in `actions/ql/lib/ext/config/deployment_environment.yml` + * then those names will be used to define the valid sanitizer set. + * To create a default of "no default saniziter environment" one can add an + * empty string to the data array in `deployment_environment.yml`. + */ class EnvironmentCheck extends ControlCheck instanceof Environment { EnvironmentCheck() { - // if there are any custom tuples use those if enabledDeploymentEnvironmentDataModel(_) then enabledDeploymentEnvironmentDataModel(this.(Environment).getName()) else this instanceof Environment From 03edcb9bb1436b0e10a4d04dc4d4ba8ab32eecf0 Mon Sep 17 00:00:00 2001 From: Kristen Newbury Date: Thu, 27 Aug 2026 15:15:58 -0400 Subject: [PATCH 0558/2098] Fix spelling mistake --- actions/ql/lib/codeql/actions/security/ControlChecks.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actions/ql/lib/codeql/actions/security/ControlChecks.qll b/actions/ql/lib/codeql/actions/security/ControlChecks.qll index f9a472f4abff..20dea013a503 100644 --- a/actions/ql/lib/codeql/actions/security/ControlChecks.qll +++ b/actions/ql/lib/codeql/actions/security/ControlChecks.qll @@ -278,7 +278,7 @@ abstract class LabelCheck extends ControlCheck { /** * This type represents deployment environments that may serve as sanitizers for - * various vunlerabilities. + * various vulnerabilities. * * It is possible to customize which deployment environments apply. The default behavior * of this model is for any environment to be considered a sanitizer. From 3e6e3be090cadbde0162da510c962c18cf37b3e7 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 28 Aug 2026 08:34:30 +0200 Subject: [PATCH 0559/2098] unified: Update qldoc --- unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index e570b2ea4e55..8a62162f5b23 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -325,7 +325,7 @@ private predicate isInheritableMemberNode(NameBindingNode node) { ) } -/** A name-binding node that has members. */ +/** A name-binding node that can have members. */ class NamespaceNode extends NameBindingNode { NamespaceNode() { storeStep(_, _, this) or From 4185f7543b763fcf007f35245023bbd729d10f3b Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 28 Aug 2026 09:04:57 +0200 Subject: [PATCH 0560/2098] unified: Remove superfluous parens --- .../ql/lib/codeql/unified/internal/StaticNameBinding.qll | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 8a62162f5b23..989ffc59357d 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -179,11 +179,9 @@ predicate storeStep(NameBindingNode node1, string name, NameBindingNode node2) { nameDecl.getDeclaration() = member and node1.isIdentifier(nameDecl) and name = nameDecl.getName() and - ( - if isInstanceMember(member) - then node2.isInstanceMemberNamespace(cls) - else node2.isStaticMemberNamespace(cls) - ) + if isInstanceMember(member) + then node2.isInstanceMemberNamespace(cls) + else node2.isStaticMemberNamespace(cls) ) or exists(TopLevel top, Stmt stmt, NameDeclaration nameDecl | From b304770cb1b05964a8e77e84ab54416001a6f437 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Fri, 28 Aug 2026 09:30:24 +0200 Subject: [PATCH 0561/2098] Unified: Implement simple LOC counting --- unified/ql/lib/codeql/files/FileSystem.qll | 20 +++++++++++++ .../ql/src/diagnostic/ExtractorInformation.ql | 28 +++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/unified/ql/lib/codeql/files/FileSystem.qll b/unified/ql/lib/codeql/files/FileSystem.qll index a50c1cd3432a..897a855612be 100644 --- a/unified/ql/lib/codeql/files/FileSystem.qll +++ b/unified/ql/lib/codeql/files/FileSystem.qll @@ -2,6 +2,7 @@ overlay[local] module; +private import unified private import codeql.Locations private import codeql.util.FileSystem @@ -37,4 +38,23 @@ module Folder = Impl::Folder; class File extends Container, Impl::File { /** Holds if this file was extracted from ordinary source code. */ predicate fromSource() { any() } + + /** + * Gets the number of lines containing code in this file. This value + * is approximate. + */ + overlay[local?] + int getNumberOfLinesOfCode() { + result = + count(int line | + exists(AstNode node, Location loc | + not node instanceof Comment and + not node instanceof TopLevel and + loc = node.getLocation() and + this = loc.getFile() and + line = loc.getStartLine() and + not loc instanceof EmptyLocation + ) + ) + } } diff --git a/unified/ql/src/diagnostic/ExtractorInformation.ql b/unified/ql/src/diagnostic/ExtractorInformation.ql index 37469504b617..6e52b4fa0887 100644 --- a/unified/ql/src/diagnostic/ExtractorInformation.ql +++ b/unified/ql/src/diagnostic/ExtractorInformation.ql @@ -9,9 +9,37 @@ private import unified private import codeql.unified.internal.AnalysisQuality +predicate fileCount(string key, int value) { + key = "Number of files" and + value = strictcount(File f) +} + +predicate fileCountByExtension(string key, int value) { + exists(string extension | + key = "Number of files with extension " + extension and + value = strictcount(File f | f.getExtension() = extension) + ) +} + +predicate numberOfLinesOfCode(string key, int value) { + key = "Number of lines of code" and + value = strictsum(File f | any() | f.getNumberOfLinesOfCode()) +} + +predicate numberOfLinesOfCodeByExtension(string key, int value) { + exists(string extension | + key = "Number of lines of code with extension " + extension and + value = strictsum(File f | f.getExtension() = extension | f.getNumberOfLinesOfCode()) + ) +} + from string key, float value where ( + fileCount(key, value) or + fileCountByExtension(key, value) or + numberOfLinesOfCode(key, value) or + numberOfLinesOfCodeByExtension(key, value) or StaticNameResolutionStatsReport::keyValuePair(key, value) or FilesCoveredByModuleManifestStatsReport::keyValuePair(key, value) ) and From 1649fafe3b65b0fad8dc3691f0ca76eac9123b41 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Fri, 28 Aug 2026 10:38:48 +0200 Subject: [PATCH 0562/2098] Rust: Use angle brackets for trait item canonical paths Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 4e7f3f7f-82b3-403c-93fa-984f56c89a70 --- .../customizing-library-models-for-rust.rst | 6 +- ...-28-angle-bracket-trait-canonical-paths.md | 6 + .../rust/dataflow/internal/DataFlowImpl.qll | 2 +- .../rust/frameworks/asyncstd/io.model.yml | 4 +- .../codeql/rust/frameworks/futures.model.yml | 16 +- .../rust/frameworks/mysql-async.model.yml | 40 ++-- .../codeql/rust/frameworks/mysql.model.yml | 74 +++--- .../rustcrypto/rustcrypto.model.yml | 26 +-- .../lib/codeql/rust/frameworks/sqlx.model.yml | 2 +- .../rust/frameworks/stdlib/alloc.model.yml | 18 +- .../rust/frameworks/stdlib/core.model.yml | 164 +++++++------- .../rust/frameworks/stdlib/io.model.yml | 26 +-- .../codeql/rust/frameworks/tokio/io.model.yml | 68 +++--- .../lib/codeql/rust/frameworks/warp.model.yml | 6 +- .../codeql/rust/internal/PathResolution.qll | 8 +- .../canonical_path/canonical_paths.expected | 6 +- .../dataflow/collections/inline-flow.expected | 4 +- .../dataflow/global/inline-flow.expected | 2 +- .../dataflow/local/inline-flow.expected | 80 +++---- .../dataflow/modeled/inline-flow.expected | 102 ++++----- .../dataflow/models/models.expected | 110 ++++----- .../dataflow/models/models.ext.yml | 4 +- .../sources/database/InlineFlow.expected | 122 +++++----- .../dataflow/sources/env/InlineFlow.expected | 44 ++-- .../dataflow/sources/file/InlineFlow.expected | 152 ++++++------- .../dataflow/sources/net/InlineFlow.expected | 210 +++++++++--------- .../sources/stdin/InlineFlow.expected | 194 ++++++++-------- .../web_frameworks/InlineFlow.expected | 36 +-- .../strings/inline-taint-flow.expected | 30 +-- .../dataflow/taint/inline-taint-flow.expected | 66 +++--- .../security/CWE-022/TaintedPath.expected | 68 +++--- .../security/CWE-079/warp/XSS.expected | 2 +- .../security/CWE-089/SqlInjection.expected | 112 +++++----- .../security/CWE-117/LogInjection.expected | 64 +++--- .../CWE-312/CleartextLogging.expected | 22 +- .../security/CWE-614/InsecureCookie.expected | 84 +++---- .../UncontrolledAllocationSize.expected | 86 +++---- .../HardcodedCryptographicValue.expected | 2 +- .../security/CWE-918/RequestForgery.expected | 2 +- 39 files changed, 1033 insertions(+), 1037 deletions(-) create mode 100644 rust/ql/lib/change-notes/2026-08-28-angle-bracket-trait-canonical-paths.md diff --git a/docs/codeql/codeql-language-guides/customizing-library-models-for-rust.rst b/docs/codeql/codeql-language-guides/customizing-library-models-for-rust.rst index 16e0307421b4..45983f4e62c5 100644 --- a/docs/codeql/codeql-language-guides/customizing-library-models-for-rust.rst +++ b/docs/codeql/codeql-language-guides/customizing-library-models-for-rust.rst @@ -74,7 +74,7 @@ Canonical paths take the following forms: - **Free functions**: ``crate::module::function``, for example ``std::env::var`` or ``std::fs::read_to_string``. - **Inherent methods**: ``::method``, for example ``::open``. - **Trait methods with a concrete type**: ``::method``, for example ``::read_to_end``. -- **Trait methods**: ``Trait::method``, for example ``core::clone::Clone::clone``. This form matches any type that implements the trait and is useful for modeling broadly applicable trait methods. For a type that has a specific model (``::method``), that model will take precedence over the trait model. +- **Trait methods**: ``::method``, for example ``::clone``. This form matches any type that implements the trait and is useful for modeling broadly applicable trait methods. For a type that has a specific model (``::method``), that model will take precedence over the trait model. Examples of custom model definitions ------------------------------------- @@ -270,10 +270,10 @@ We need to add tuples to the ``summaryModel(path, input, output, kind, provenanc pack: codeql/rust-all extensible: summaryModel data: - - ["core::iter::traits::iterator::Iterator::map", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"] + - ["::map", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"] -- The first value ``core::iter::traits::iterator::Iterator::map`` is the canonical path. The ``Trait::method`` form matches any type that implements the ``Iterator`` trait. +- The first value ``::map`` is the canonical path. The ``::method`` form matches any type that implements the ``Iterator`` trait. - The second value ``Argument[self].Element`` is the access path to the input — the elements of the iterator (the receiver). - The third value ``Argument[0].Parameter[0]`` is the access path to the output: diff --git a/rust/ql/lib/change-notes/2026-08-28-angle-bracket-trait-canonical-paths.md b/rust/ql/lib/change-notes/2026-08-28-angle-bracket-trait-canonical-paths.md new file mode 100644 index 000000000000..280f78d5555b --- /dev/null +++ b/rust/ql/lib/change-notes/2026-08-28-angle-bracket-trait-canonical-paths.md @@ -0,0 +1,6 @@ +--- +category: minorAnalysis +--- +* Canonical paths for Rust trait items now use the format `::item` instead of + `crate::Trait::item`. Custom data extension models that reference trait items must be + updated to use the new format. diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll index c038312f84dc..bf6076e09055 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll @@ -357,7 +357,7 @@ private module Aliases { * * However, this would require support for [generalized reverse flow][1], which * is not yet implemented, so instead we simulate reverse flow where it would - * have applied via the model for `core::ops::index::IndexMut::index_mut`. + * have applied via the model for `::index_mut`. * * The same is the case for compound assignments like `a[i] += rhs`, which are * treated as `(*a.index_mut(i)).add_assign(rhs)`. diff --git a/rust/ql/lib/codeql/rust/frameworks/asyncstd/io.model.yml b/rust/ql/lib/codeql/rust/frameworks/asyncstd/io.model.yml index 10c5b112a336..dfc63f6f846f 100644 --- a/rust/ql/lib/codeql/rust/frameworks/asyncstd/io.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/asyncstd/io.model.yml @@ -3,5 +3,5 @@ extensions: pack: codeql/rust-all extensible: summaryModel data: - - ["async_std::io::read::ReadExt::read", "Argument[self]", "Argument[0].Reference", "taint", "manual"] - - ["async_std::io::read::ReadExt::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::read", "Argument[self]", "Argument[0].Reference", "taint", "manual"] + - ["::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/futures.model.yml b/rust/ql/lib/codeql/rust/frameworks/futures.model.yml index ccd7aebb6309..7b1aaab494fd 100644 --- a/rust/ql/lib/codeql/rust/frameworks/futures.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/futures.model.yml @@ -5,11 +5,11 @@ extensions: data: - ["futures_executor::local_pool::block_on", "Argument[0]", "ReturnValue", "value", "manual"] - ["::new", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["futures_util::io::AsyncReadExt::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["futures_util::io::AsyncReadExt::read_to_end", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["futures_util::io::AsyncBufReadExt::read_line", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["futures_util::io::AsyncBufReadExt::read_until", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"] - - ["futures_util::io::AsyncBufReadExt::fill_buf", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["futures_util::io::AsyncBufReadExt::lines", "Argument[self]", "ReturnValue", "taint", "manual"] - - ["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", "manual"] - - ["futures_io::if_std::AsyncRead::poll_read", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"] + - ["::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::read_to_end", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::read_line", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::read_until", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"] + - ["::fill_buf", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::lines", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["::poll_fill_buf", "Argument[self].Reference", "ReturnValue.Field[core::task::poll::Poll::Ready(0)].Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::poll_read", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/mysql-async.model.yml b/rust/ql/lib/codeql/rust/frameworks/mysql-async.model.yml index 9925945ecd69..d0c1a5acf2b3 100644 --- a/rust/ql/lib/codeql/rust/frameworks/mysql-async.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/mysql-async.model.yml @@ -3,28 +3,28 @@ extensions: pack: codeql/rust-all extensible: sinkModel data: - - ["mysql_async::queryable::Queryable::query", "Argument[0]", "sql-injection", "manual"] - - ["mysql_async::queryable::Queryable::query_drop", "Argument[0]", "sql-injection", "manual"] - - ["mysql_async::queryable::Queryable::query_first", "Argument[0]", "sql-injection", "manual"] - - ["mysql_async::queryable::Queryable::query_fold", "Argument[0]", "sql-injection", "manual"] - - ["mysql_async::queryable::Queryable::query_stream", "Argument[0]", "sql-injection", "manual"] - - ["mysql_async::queryable::Queryable::query_map", "Argument[0]", "sql-injection", "manual"] + - ["::query", "Argument[0]", "sql-injection", "manual"] + - ["::query_drop", "Argument[0]", "sql-injection", "manual"] + - ["::query_first", "Argument[0]", "sql-injection", "manual"] + - ["::query_fold", "Argument[0]", "sql-injection", "manual"] + - ["::query_stream", "Argument[0]", "sql-injection", "manual"] + - ["::query_map", "Argument[0]", "sql-injection", "manual"] - ["::query_iter", "Argument[0]", "sql-injection", "manual"] - ["::prep", "Argument[0]", "sql-injection", "manual"] - addsTo: pack: codeql/rust-all extensible: sourceModel data: - - ["mysql_async::queryable::Queryable::query", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "database", "manual"] - - ["mysql_async::queryable::Queryable::exec", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "database", "manual"] - - ["mysql_async::queryable::Queryable::query_first", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "database", "manual"] - - ["mysql_async::queryable::Queryable::exec_first", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "database", "manual"] - - ["mysql_async::queryable::Queryable::query_fold", "Argument[2].Parameter[1]", "database", "manual"] - - ["mysql_async::queryable::Queryable::exec_fold", "Argument[3].Parameter[1]", "database", "manual"] + - ["::query", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "database", "manual"] + - ["::exec", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "database", "manual"] + - ["::query_first", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "database", "manual"] + - ["::exec_first", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "database", "manual"] + - ["::query_fold", "Argument[2].Parameter[1]", "database", "manual"] + - ["::exec_fold", "Argument[3].Parameter[1]", "database", "manual"] - ["::query_iter", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "database", "manual"] - ["::exec_iter", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "database", "manual"] - - ["mysql_async::queryable::Queryable::query_map", "Argument[1].Parameter[0]", "database", "manual"] - - ["mysql_async::queryable::Queryable::exec_map", "Argument[2].Parameter[0]", "database", "manual"] + - ["::query_map", "Argument[1].Parameter[0]", "database", "manual"] + - ["::exec_map", "Argument[2].Parameter[0]", "database", "manual"] - ["::get", "ReturnValue.Field[core::option::Option::Some(0)]", "database", "manual"] - ["::get_opt", "ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]", "database", "manual"] - ["::take", "ReturnValue.Field[core::option::Option::Some(0)]", "database", "manual"] @@ -35,9 +35,9 @@ extensions: pack: codeql/rust-all extensible: summaryModel data: - - ["mysql_async::queryable::Queryable::query_fold", "Argument[1]", "Argument[2].Parameter[0]", "value", "manual"] - - ["mysql_async::queryable::Queryable::query_fold", "Argument[2].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "value", "manual"] - - ["mysql_async::queryable::Queryable::exec_fold", "Argument[2]", "Argument[3].Parameter[0]", "value", "manual"] - - ["mysql_async::queryable::Queryable::exec_fold", "Argument[3].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "value", "manual"] - - ["mysql_async::queryable::Queryable::query_map", "Argument[1].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "value", "manual"] - - ["mysql_async::queryable::Queryable::query_map", "Argument[2].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "value", "manual"] + - ["::query_fold", "Argument[1]", "Argument[2].Parameter[0]", "value", "manual"] + - ["::query_fold", "Argument[2].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "value", "manual"] + - ["::exec_fold", "Argument[2]", "Argument[3].Parameter[0]", "value", "manual"] + - ["::exec_fold", "Argument[3].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "value", "manual"] + - ["::query_map", "Argument[1].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "value", "manual"] + - ["::query_map", "Argument[2].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "value", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/mysql.model.yml b/rust/ql/lib/codeql/rust/frameworks/mysql.model.yml index b1f43db0db14..819d4c65b8b4 100644 --- a/rust/ql/lib/codeql/rust/frameworks/mysql.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/mysql.model.yml @@ -3,52 +3,52 @@ extensions: pack: codeql/rust-all extensible: sinkModel data: - - ["mysql::conn::queryable::Queryable::query", "Argument[0]", "sql-injection", "manual"] - - ["mysql::conn::queryable::Queryable::query_opt", "Argument[0]", "sql-injection", "manual"] - - ["mysql::conn::queryable::Queryable::query_drop", "Argument[0]", "sql-injection", "manual"] - - ["mysql::conn::queryable::Queryable::query_first", "Argument[0]", "sql-injection", "manual"] - - ["mysql::conn::queryable::Queryable::query_first_opt", "Argument[0]", "sql-injection", "manual"] - - ["mysql::conn::queryable::Queryable::query_fold", "Argument[0]", "sql-injection", "manual"] - - ["mysql::conn::queryable::Queryable::query_fold_opt", "Argument[0]", "sql-injection", "manual"] + - ["::query", "Argument[0]", "sql-injection", "manual"] + - ["::query_opt", "Argument[0]", "sql-injection", "manual"] + - ["::query_drop", "Argument[0]", "sql-injection", "manual"] + - ["::query_first", "Argument[0]", "sql-injection", "manual"] + - ["::query_first_opt", "Argument[0]", "sql-injection", "manual"] + - ["::query_fold", "Argument[0]", "sql-injection", "manual"] + - ["::query_fold_opt", "Argument[0]", "sql-injection", "manual"] - ["::query_iter", "Argument[0]", "sql-injection", "manual"] - - ["mysql::conn::queryable::Queryable::query_map", "Argument[0]", "sql-injection", "manual"] - - ["mysql::conn::queryable::Queryable::query_map_opt", "Argument[0]", "sql-injection", "manual"] + - ["::query_map", "Argument[0]", "sql-injection", "manual"] + - ["::query_map_opt", "Argument[0]", "sql-injection", "manual"] - ["::prep", "Argument[0]", "sql-injection", "manual"] - addsTo: pack: codeql/rust-all extensible: sourceModel data: - - ["mysql::conn::queryable::Queryable::query", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "database", "manual"] - - ["mysql::conn::queryable::Queryable::exec", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "database", "manual"] - - ["mysql::conn::queryable::Queryable::query_opt", "ReturnValue.Field[core::result::Result::Ok(0)].Element.Field[core::result::Result::Ok(0)]", "database", "manual"] - - ["mysql::conn::queryable::Queryable::exec_opt", "ReturnValue.Field[core::result::Result::Ok(0)].Element.Field[core::result::Result::Ok(0)]", "database", "manual"] - - ["mysql::conn::queryable::Queryable::query_first", "ReturnValue.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "database", "manual"] - - ["mysql::conn::queryable::Queryable::exec_first", "ReturnValue.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "database", "manual"] - - ["mysql::conn::queryable::Queryable::query_first_opt", "ReturnValue.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]", "database", "manual"] - - ["mysql::conn::queryable::Queryable::exec_first_opt", "ReturnValue.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]", "database", "manual"] - - ["mysql::conn::queryable::Queryable::query_fold", "Argument[2].Parameter[1]", "database", "manual"] - - ["mysql::conn::queryable::Queryable::exec_fold", "Argument[3].Parameter[1]", "database", "manual"] - - ["mysql::conn::queryable::Queryable::query_fold_opt", "Argument[2].Parameter[1].Field[core::result::Result::Ok(0)]", "database", "manual"] - - ["mysql::conn::queryable::Queryable::exec_fold_opt", "Argument[3].Parameter[1].Field[core::result::Result::Ok(0)]", "database", "manual"] + - ["::query", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "database", "manual"] + - ["::exec", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "database", "manual"] + - ["::query_opt", "ReturnValue.Field[core::result::Result::Ok(0)].Element.Field[core::result::Result::Ok(0)]", "database", "manual"] + - ["::exec_opt", "ReturnValue.Field[core::result::Result::Ok(0)].Element.Field[core::result::Result::Ok(0)]", "database", "manual"] + - ["::query_first", "ReturnValue.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "database", "manual"] + - ["::exec_first", "ReturnValue.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "database", "manual"] + - ["::query_first_opt", "ReturnValue.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]", "database", "manual"] + - ["::exec_first_opt", "ReturnValue.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]", "database", "manual"] + - ["::query_fold", "Argument[2].Parameter[1]", "database", "manual"] + - ["::exec_fold", "Argument[3].Parameter[1]", "database", "manual"] + - ["::query_fold_opt", "Argument[2].Parameter[1].Field[core::result::Result::Ok(0)]", "database", "manual"] + - ["::exec_fold_opt", "Argument[3].Parameter[1].Field[core::result::Result::Ok(0)]", "database", "manual"] - ["::query_iter", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "database", "manual"] - ["::exec_iter", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "database", "manual"] - - ["mysql::conn::queryable::Queryable::query_map", "Argument[1].Parameter[0]", "database", "manual"] - - ["mysql::conn::queryable::Queryable::query_map_opt", "Argument[1].Parameter[0].Field[core::result::Result::Ok(0)]", "database", "manual"] - - ["mysql::conn::queryable::Queryable::exec_map", "Argument[2].Parameter[0]", "database", "manual"] - - ["mysql::conn::queryable::Queryable::exec_map_opt", "Argument[2].Parameter[0].Field[core::result::Result::Ok(0)]", "database", "manual"] + - ["::query_map", "Argument[1].Parameter[0]", "database", "manual"] + - ["::query_map_opt", "Argument[1].Parameter[0].Field[core::result::Result::Ok(0)]", "database", "manual"] + - ["::exec_map", "Argument[2].Parameter[0]", "database", "manual"] + - ["::exec_map_opt", "Argument[2].Parameter[0].Field[core::result::Result::Ok(0)]", "database", "manual"] - addsTo: pack: codeql/rust-all extensible: summaryModel data: - - ["mysql::conn::queryable::Queryable::query_fold", "Argument[1]", "Argument[2].Parameter[0]", "value", "manual"] - - ["mysql::conn::queryable::Queryable::query_fold", "Argument[2].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)]", "value", "manual"] - - ["mysql::conn::queryable::Queryable::exec_fold", "Argument[2]", "Argument[3].Parameter[0]", "value", "manual"] - - ["mysql::conn::queryable::Queryable::exec_fold", "Argument[3].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)]", "value", "manual"] - - ["mysql::conn::queryable::Queryable::query_fold_opt", "Argument[1]", "Argument[2].Parameter[0]", "value", "manual"] - - ["mysql::conn::queryable::Queryable::query_fold_opt", "Argument[2].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)]", "value", "manual"] - - ["mysql::conn::queryable::Queryable::exec_fold_opt", "Argument[2]", "Argument[3].Parameter[0]", "value", "manual"] - - ["mysql::conn::queryable::Queryable::exec_fold_opt", "Argument[3].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)]", "value", "manual"] - - ["mysql::conn::queryable::Queryable::query_map", "Argument[1].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "value", "manual"] - - ["mysql::conn::queryable::Queryable::query_map_opt", "Argument[1].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "value", "manual"] - - ["mysql::conn::queryable::Queryable::exec_map", "Argument[2].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "value", "manual"] - - ["mysql::conn::queryable::Queryable::exec_map_opt", "Argument[2].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "value", "manual"] + - ["::query_fold", "Argument[1]", "Argument[2].Parameter[0]", "value", "manual"] + - ["::query_fold", "Argument[2].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)]", "value", "manual"] + - ["::exec_fold", "Argument[2]", "Argument[3].Parameter[0]", "value", "manual"] + - ["::exec_fold", "Argument[3].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)]", "value", "manual"] + - ["::query_fold_opt", "Argument[1]", "Argument[2].Parameter[0]", "value", "manual"] + - ["::query_fold_opt", "Argument[2].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)]", "value", "manual"] + - ["::exec_fold_opt", "Argument[2]", "Argument[3].Parameter[0]", "value", "manual"] + - ["::exec_fold_opt", "Argument[3].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)]", "value", "manual"] + - ["::query_map", "Argument[1].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "value", "manual"] + - ["::query_map_opt", "Argument[1].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "value", "manual"] + - ["::exec_map", "Argument[2].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "value", "manual"] + - ["::exec_map_opt", "Argument[2].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "value", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml b/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml index f4bcb94ba206..e745e0caf9af 100644 --- a/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml @@ -3,19 +3,19 @@ extensions: pack: codeql/rust-all extensible: sinkModel data: - - ["digest::digest::Digest::new_with_prefix", "Argument[0]", "hasher-input", "manual"] - - ["digest::digest::Digest::update", "Argument[0]", "hasher-input", "manual"] - - ["digest::digest::Digest::chain_update", "Argument[0]", "hasher-input", "manual"] - - ["digest::digest::Digest::digest", "Argument[0]", "hasher-input", "manual"] + - ["::new_with_prefix", "Argument[0]", "hasher-input", "manual"] + - ["::update", "Argument[0]", "hasher-input", "manual"] + - ["::chain_update", "Argument[0]", "hasher-input", "manual"] + - ["::digest", "Argument[0]", "hasher-input", "manual"] - ["md5::compute", "Argument[0]", "hasher-input", "manual"] - - ["crypto_common::KeyInit::new", "Argument[0]", "credentials-key", "manual"] - - ["crypto_common::KeyInit::new", "Argument[1]", "credentials-iv", "manual"] - - ["crypto_common::KeyInit::new_from_slice", "Argument[0]", "credentials-key", "manual"] - - ["crypto_common::KeyInit::new_from_slice", "Argument[1]", "credentials-iv", "manual"] - - ["crypto_common::KeyIvInit::new", "Argument[0]", "credentials-key", "manual"] - - ["crypto_common::KeyIvInit::new", "Argument[1]", "credentials-iv", "manual"] - - ["crypto_common::KeyIvInit::new_from_slice", "Argument[0]", "credentials-key", "manual"] - - ["crypto_common::KeyIvInit::new_from_slice", "Argument[1]", "credentials-iv", "manual"] + - ["::new", "Argument[0]", "credentials-key", "manual"] + - ["::new", "Argument[1]", "credentials-iv", "manual"] + - ["::new_from_slice", "Argument[0]", "credentials-key", "manual"] + - ["::new_from_slice", "Argument[1]", "credentials-iv", "manual"] + - ["::new", "Argument[0]", "credentials-key", "manual"] + - ["::new", "Argument[1]", "credentials-iv", "manual"] + - ["::new_from_slice", "Argument[0]", "credentials-key", "manual"] + - ["::new_from_slice", "Argument[1]", "credentials-iv", "manual"] - ["::new", "Argument[0]", "credentials-key", "manual"] - ["::new", "Argument[1]", "credentials-iv", "manual"] - ["::new_from_slice", "Argument[0]", "credentials-key", "manual"] @@ -32,4 +32,4 @@ extensions: - ["::new", "Argument[1]", "credentials-iv", "manual"] - ["::new_from_slice", "Argument[0]", "credentials-key", "manual"] - ["::new_from_slice", "Argument[1]", "credentials-iv", "manual"] - - ["aead::Aead::encrypt", "Argument[0]", "credentials-nonce", "manual"] + - ["::encrypt", "Argument[0]", "credentials-nonce", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/sqlx.model.yml b/rust/ql/lib/codeql/rust/frameworks/sqlx.model.yml index 57db37bd9eb5..4f6c2369b4d0 100644 --- a/rust/ql/lib/codeql/rust/frameworks/sqlx.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/sqlx.model.yml @@ -10,7 +10,7 @@ extensions: - ["sqlx_core::query_scalar::query_scalar", "Argument[0]", "sql-injection", "manual"] - ["sqlx_core::query_scalar_with::query_scalar_with", "Argument[0]", "sql-injection", "manual"] - ["sqlx_core::raw_sql::raw_sql", "Argument[0]", "sql-injection", "manual"] - - ["sqlx_core::executor::Executor::execute", "Argument[0]", "sql-injection", "manual"] + - ["::execute", "Argument[0]", "sql-injection", "manual"] - addsTo: pack: codeql/rust-all extensible: sourceModel diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml index 7b97fdb1c4c9..738c2c2072aa 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml @@ -13,12 +13,12 @@ extensions: - ["alloc::alloc::alloc", "Argument[0]", "alloc-layout", "manual"] - ["alloc::alloc::alloc_zeroed", "Argument[0]", "alloc-layout", "manual"] - ["alloc::alloc::realloc", "Argument[2]", "alloc-size", "manual"] - - ["core::alloc::global::GlobalAlloc::alloc", "Argument[0]", "alloc-layout", "manual"] - - ["core::alloc::global::GlobalAlloc::alloc_zeroed", "Argument[0]", "alloc-layout", "manual"] - - ["core::alloc::Allocator::allocate", "Argument[0]", "alloc-layout", "manual"] - - ["core::alloc::Allocator::allocate_zeroed", "Argument[0]", "alloc-layout", "manual"] - - ["core::alloc::Allocator::grow", "Argument[2]", "alloc-layout", "manual"] - - ["core::alloc::Allocator::grow_zeroed", "Argument[2]", "alloc-layout", "manual"] + - ["::alloc", "Argument[0]", "alloc-layout", "manual"] + - ["::alloc_zeroed", "Argument[0]", "alloc-layout", "manual"] + - ["::allocate", "Argument[0]", "alloc-layout", "manual"] + - ["::allocate_zeroed", "Argument[0]", "alloc-layout", "manual"] + - ["::grow", "Argument[2]", "alloc-layout", "manual"] + - ["::grow_zeroed", "Argument[2]", "alloc-layout", "manual"] - addsTo: pack: codeql/rust-all extensible: summaryModel @@ -49,7 +49,7 @@ extensions: # String - ["::as_str", "Argument[self].Reference", "ReturnValue.Reference", "taint", "manual"] - ["::as_bytes", "Argument[self].Reference", "ReturnValue.Reference.Element", "taint", "manual"] - - ["alloc::string::ToString::to_string", "Argument[self].Reference", "ReturnValue", "taint", "manual"] + - ["::to_string", "Argument[self].Reference", "ReturnValue", "taint", "manual"] # Overwrite generated model - ["::add", "Argument[self]", "ReturnValue", "taint", "manual"] - ["::add", "Argument[0].Reference", "ReturnValue", "taint", "manual"] @@ -57,8 +57,8 @@ extensions: - ["alloc::vec::from_elem", "Argument[0]", "ReturnValue.Element", "value", "manual"] - ["::deref", "Argument[self].Reference.Element", "ReturnValue.Reference.Element", "value", "manual"] # ToOwned - - ["alloc::borrow::ToOwned::to_owned", "Argument[self].Reference", "ReturnValue", "taint", "manual"] - - ["alloc::borrow::ToOwned::clone_into", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::to_owned", "Argument[self].Reference", "ReturnValue", "taint", "manual"] + - ["::clone_into", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - addsTo: pack: codeql/rust-all extensible: neutralModel diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml index 69887cea50a4..cc59fe4082e7 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml @@ -6,102 +6,102 @@ extensions: # Builtin deref - ["<& as core::ops::deref::Deref>::deref", "Argument[self].Reference", "ReturnValue", "value", "manual"] - ["<&mut as core::ops::deref::Deref>::deref", "Argument[self].Reference", "ReturnValue", "value", "manual"] - - ["core::ops::deref::Deref::deref", "Argument[self].Reference", "ReturnValue.Reference", "taint", "manual"] + - ["::deref", "Argument[self].Reference", "ReturnValue.Reference", "taint", "manual"] # Index - - ["core::ops::index::Index::index", "Argument[self].Reference.Element", "ReturnValue.Reference", "value", "manual"] - - ["core::ops::index::IndexMut::index_mut", "Argument[self].Reference.Element", "ReturnValue.Reference", "value", "manual"] + - ["::index", "Argument[self].Reference.Element", "ReturnValue.Reference", "value", "manual"] + - ["::index_mut", "Argument[self].Reference.Element", "ReturnValue.Reference", "value", "manual"] # Unary operators - - ["core::ops::arith::Neg::neg", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["::neg", "Argument[self]", "ReturnValue", "taint", "manual"] - ["::neg", "Argument[self].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::bit::Not::not", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["::not", "Argument[self]", "ReturnValue", "taint", "manual"] - ["::not", "Argument[self].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] # Arithmetic operators - - ["core::ops::arith::Add::add", "Argument[self,0]", "ReturnValue", "taint", "manual"] - - ["core::ops::arith::Add::add", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::arith::Sub::sub", "Argument[self,0]", "ReturnValue", "taint", "manual"] - - ["core::ops::arith::Sub::sub", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::arith::Mul::mul", "Argument[self,0]", "ReturnValue", "taint", "manual"] - - ["core::ops::arith::Mul::mul", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::arith::Div::div", "Argument[self,0]", "ReturnValue", "taint", "manual"] - - ["core::ops::arith::Div::div", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::arith::Rem::rem", "Argument[self,0]", "ReturnValue", "taint", "manual"] - - ["core::ops::arith::Rem::rem", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::add", "Argument[self,0]", "ReturnValue", "taint", "manual"] + - ["::add", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::sub", "Argument[self,0]", "ReturnValue", "taint", "manual"] + - ["::sub", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::mul", "Argument[self,0]", "ReturnValue", "taint", "manual"] + - ["::mul", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::div", "Argument[self,0]", "ReturnValue", "taint", "manual"] + - ["::div", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::rem", "Argument[self,0]", "ReturnValue", "taint", "manual"] + - ["::rem", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] # Arithmetic assignment expressions - - ["core::ops::arith::AddAssign::add_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::arith::AddAssign::add_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::arith::AddAssign::add_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::arith::AddAssign::add_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::arith::SubAssign::sub_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::arith::SubAssign::sub_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::arith::SubAssign::sub_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::arith::SubAssign::sub_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::arith::MulAssign::mul_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::arith::MulAssign::mul_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::arith::MulAssign::mul_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::arith::MulAssign::mul_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::arith::DivAssign::div_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::arith::DivAssign::div_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::arith::DivAssign::div_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::arith::DivAssign::div_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::arith::RemAssign::rem_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::arith::RemAssign::rem_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::arith::RemAssign::rem_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::arith::RemAssign::rem_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::add_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["::add_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["::add_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::add_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::sub_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["::sub_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["::sub_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::sub_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::mul_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["::mul_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["::mul_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::mul_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::div_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["::div_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["::div_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::div_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::rem_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["::rem_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["::rem_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::rem_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] # Bitwise operators - - ["core::ops::bit::BitAnd::bitand", "Argument[self,0]", "ReturnValue", "taint", "manual"] - - ["core::ops::bit::BitAnd::bitand", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::bit::BitOr::bitor", "Argument[self,0]", "ReturnValue", "taint", "manual"] - - ["core::ops::bit::BitOr::bitor", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::bit::BitXor::bitxor", "Argument[self,0]", "ReturnValue", "taint", "manual"] - - ["core::ops::bit::BitXor::bitxor", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::bitand", "Argument[self,0]", "ReturnValue", "taint", "manual"] + - ["::bitand", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::bitor", "Argument[self,0]", "ReturnValue", "taint", "manual"] + - ["::bitor", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::bitxor", "Argument[self,0]", "ReturnValue", "taint", "manual"] + - ["::bitxor", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] # Bitwise assignment operators - - ["core::ops::bit::BitAndAssign::bitand_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::bit::BitAndAssign::bitand_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::bit::BitAndAssign::bitand_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::bit::BitAndAssign::bitand_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::bit::BitOrAssign::bitor_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::bit::BitOrAssign::bitor_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::bit::BitOrAssign::bitor_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::bit::BitOrAssign::bitor_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::bit::BitXorAssign::bitxor_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::bit::BitXorAssign::bitxor_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::bit::BitXorAssign::bitxor_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::bit::BitXorAssign::bitxor_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::bitand_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["::bitand_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["::bitand_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::bitand_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::bitor_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["::bitor_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["::bitor_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::bitor_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::bitxor_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["::bitxor_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["::bitxor_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::bitxor_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] # Shift operators - - ["core::ops::bit::Shl::shl", "Argument[self,0]", "ReturnValue", "taint", "manual"] - - ["core::ops::bit::Shl::shl", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::bit::Shr::shr", "Argument[self,0]", "ReturnValue", "taint", "manual"] - - ["core::ops::bit::Shr::shr", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::shl", "Argument[self,0]", "ReturnValue", "taint", "manual"] + - ["::shl", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::shr", "Argument[self,0]", "ReturnValue", "taint", "manual"] + - ["::shr", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] # Shift assignment operators - - ["core::ops::bit::ShlAssign::shl_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::bit::ShlAssign::shl_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::bit::ShlAssign::shl_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::bit::ShlAssign::shl_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::bit::ShrAssign::shr_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::bit::ShrAssign::shr_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::bit::ShrAssign::shr_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::bit::ShrAssign::shr_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::shl_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["::shl_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["::shl_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::shl_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::shr_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["::shr_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["::shr_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::shr_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] # Clone - - ["core::clone::Clone::clone", "Argument[self].Reference", "ReturnValue", "value", "manual"] + - ["::clone", "Argument[self].Reference", "ReturnValue", "value", "manual"] # Conversions - - ["core::convert::Into::into", "Argument[self].Element", "ReturnValue.Element", "taint", "manual"] - - ["core::convert::Into::into", "Argument[self].Reference.Element", "ReturnValue.Element", "taint", "manual"] + - ["::into", "Argument[self].Element", "ReturnValue.Element", "taint", "manual"] + - ["::into", "Argument[self].Reference.Element", "ReturnValue.Element", "taint", "manual"] # From - - ["core::convert::From::from", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["::from", "Argument[0]", "ReturnValue", "taint", "manual"] # Iterator - ["::iter", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] - - ["value_trait::array::Array::iter", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] + - ["::iter", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] - ["::iter_mut", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] - ["::into_iter", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] - - ["core::iter::traits::iterator::Iterator::for_each", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"] - - ["core::iter::traits::iterator::Iterator::nth", "Argument[self].Reference.Element", "ReturnValue.Field[core::option::Option::Some(0)]", "value", "manual"] - - ["core::iter::traits::iterator::Iterator::next", "Argument[self].Reference.Element", "ReturnValue.Field[core::option::Option::Some(0)]", "value", "manual"] - - ["core::iter::traits::iterator::Iterator::collect", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] - - ["core::iter::traits::iterator::Iterator::map", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"] - - ["core::iter::traits::iterator::Iterator::for_each", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"] - - ["core::iter::traits::iterator::Iterator::chain", "Argument[self]", "ReturnValue", "taint", "manual"] - - ["core::iter::traits::iterator::Iterator::chain", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["core::iter::traits::iterator::Iterator::take", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["::for_each", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"] + - ["::nth", "Argument[self].Reference.Element", "ReturnValue.Field[core::option::Option::Some(0)]", "value", "manual"] + - ["::next", "Argument[self].Reference.Element", "ReturnValue.Field[core::option::Option::Some(0)]", "value", "manual"] + - ["::collect", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] + - ["::map", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"] + - ["::for_each", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"] + - ["::chain", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["::chain", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["::take", "Argument[self]", "ReturnValue", "taint", "manual"] # Option - ["::map", "Argument[self].Field[core::option::Option::Some(0)]", "Argument[0].Parameter[0]", "value", "manual"] - ["::map", "Argument[0].ReturnValue", "ReturnValue.Field[core::option::Option::Some(0)]", "value", "manual"] @@ -130,9 +130,9 @@ extensions: - ["::trim", "Argument[self].Reference", "ReturnValue.Reference", "taint", "manual"] - ["::to_string", "Argument[self].Reference", "ReturnValue", "taint", "manual"] # Ord - - ["core::cmp::Ord::min", "Argument[self,0]", "ReturnValue", "value", "manual"] - - ["core::cmp::Ord::max", "Argument[self,0]", "ReturnValue", "value", "manual"] - - ["core::cmp::Ord::clamp", "Argument[self,0,1]", "ReturnValue", "value", "manual"] + - ["::min", "Argument[self,0]", "ReturnValue", "value", "manual"] + - ["::max", "Argument[self,0]", "ReturnValue", "value", "manual"] + - ["::clamp", "Argument[self,0,1]", "ReturnValue", "value", "manual"] # Slice - ["<[]>::get", "Argument[self].Reference.Element", "ReturnValue.Field[core::option::Option::Some(0)].Reference", "value", "manual"] - addsTo: diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/io.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/io.model.yml index f6527ae912b7..fb7ff0da28e5 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/io.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/io.model.yml @@ -9,20 +9,20 @@ extensions: extensible: summaryModel data: - ["::new", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["std::io::BufRead::fill_buf", "Argument[self].Reference", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::fill_buf", "Argument[self].Reference", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] - ["::buffer", "Argument[self].Reference", "ReturnValue.Reference", "taint", "manual"] - - ["std::io::Read::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["std::io::Read::read_to_string", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["std::io::Read::read_to_end", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["std::io::Read::read_exact", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["std::io::BufRead::read_line", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["std::io::BufRead::read_until", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"] - - ["std::io::BufRead::split", "Argument[self]", "ReturnValue", "taint", "manual"] - - ["std::io::BufRead::lines", "Argument[self]", "ReturnValue", "taint", "manual"] - - ["std::io::Read::bytes", "Argument[self]", "ReturnValue", "taint", "manual"] - - ["std::io::Read::chain", "Argument[self]", "ReturnValue", "taint", "manual"] - - ["std::io::Read::chain", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["std::io::Read::take", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::read_to_string", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::read_to_end", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::read_exact", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::read_line", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::read_until", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"] + - ["::split", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["::lines", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["::bytes", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["::chain", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["::chain", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["::take", "Argument[self]", "ReturnValue", "taint", "manual"] - ["::lock", "Argument[self].Reference", "ReturnValue", "taint", "manual"] - ["::read_line", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - ["::next", "Argument[self].Reference.Element", "ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]", "value", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/tokio/io.model.yml b/rust/ql/lib/codeql/rust/frameworks/tokio/io.model.yml index ceb3e8372d3a..9e3a3f2ac8b8 100644 --- a/rust/ql/lib/codeql/rust/frameworks/tokio/io.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/tokio/io.model.yml @@ -9,40 +9,40 @@ extensions: extensible: summaryModel data: - ["::new", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["tokio::io::util::async_buf_read_ext::AsyncBufReadExt::fill_buf", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::fill_buf", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - ["::buffer", "Argument[self].Reference", "ReturnValue.Reference", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_to_string", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_to_end", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_exact", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["tokio::io::util::async_buf_read_ext::AsyncBufReadExt::read_line", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["tokio::io::util::async_buf_read_ext::AsyncBufReadExt::read_until", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"] - - ["tokio::io::util::async_buf_read_ext::AsyncBufReadExt::split", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::read_to_string", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::read_to_end", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::read_exact", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::read_line", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::read_until", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"] + - ["::split", "Argument[self]", "ReturnValue", "taint", "manual"] - ["::next_segment", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "taint", "manual"] - - ["tokio::io::util::async_buf_read_ext::AsyncBufReadExt::lines", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["::lines", "Argument[self]", "ReturnValue", "taint", "manual"] - ["::next_line", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_buf", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_u8", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_u8_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_u16", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_u16_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_u32", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_u32_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_u64", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_u64_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_u128", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_u128_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i8", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i8_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i16", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i16_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i32", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i32_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i64", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i64_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i128", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i128_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_f32", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_f32_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_f64", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_f64_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_buf", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::read_u8", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_u8_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_u16", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_u16_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_u32", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_u32_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_u64", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_u64_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_u128", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_u128_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_i8", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_i8_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_i16", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_i16_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_i32", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_i32_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_i64", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_i64_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_i128", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_i128_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_f32", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_f32_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_f64", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_f64_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/warp.model.yml b/rust/ql/lib/codeql/rust/frameworks/warp.model.yml index 32ba4f1f0a84..916b506fc9e4 100644 --- a/rust/ql/lib/codeql/rust/frameworks/warp.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/warp.model.yml @@ -3,9 +3,9 @@ extensions: pack: codeql/rust-all extensible: sourceModel data: - - ["warp::filter::Filter::then", "Argument[0].Parameter[0..7]", "remote", "manual"] - - ["warp::filter::Filter::map", "Argument[0].Parameter[0..7]", "remote", "manual"] - - ["warp::filter::Filter::and_then", "Argument[0].Parameter[0..7]", "remote", "manual"] + - ["::then", "Argument[0].Parameter[0..7]", "remote", "manual"] + - ["::map", "Argument[0].Parameter[0..7]", "remote", "manual"] + - ["::and_then", "Argument[0].Parameter[0..7]", "remote", "manual"] - addsTo: pack: codeql/rust-all extensible: sinkModel diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index 9af7f6abad45..707aad9cddd2 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -1104,6 +1104,9 @@ final class TraitItemNode extends ImplOrTraitItemNode, NamedItemNode, TypeItemNo bindingset[c] private string getCanonicalPathPart(Crate c, int i) { + i = -1 and + result = "<" + or i = 0 and result = this.getCanonicalPathPrefix(c) or @@ -1112,6 +1115,9 @@ final class TraitItemNode extends ImplOrTraitItemNode, NamedItemNode, TypeItemNo or i = 2 and result = this.getName() + or + i = 3 and + result = ">" } language[monotonicAggregates] @@ -1123,7 +1129,7 @@ final class TraitItemNode extends ImplOrTraitItemNode, NamedItemNode, TypeItemNo language[monotonicAggregates] override string getCanonicalPathPrefixFor(Crate c, ItemNode child) { this.providesCanonicalPathPrefixFor(c, child) and - result = this.getCanonicalPath(c) + result = strictconcat(int i | i in [-1 .. 3] | this.getCanonicalPathPart(c, i) order by i) } } diff --git a/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected b/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected index b93f75b3ad70..4950c4652e51 100644 --- a/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected +++ b/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected @@ -8,13 +8,13 @@ | regular.rs:1:1:2:18 | impl ...::PartialEq for Struct::<...> { ... } | | | regular.rs:1:1:2:18 | struct Struct | test::regular::Struct | | regular.rs:4:1:6:1 | trait Trait | test::regular::Trait | -| regular.rs:5:5:5:16 | fn f | test::regular::Trait::f | +| regular.rs:5:5:5:16 | fn f | ::f | | regular.rs:8:1:10:1 | impl Trait for Struct { ... } | | | regular.rs:9:5:9:18 | fn f | ::f | | regular.rs:12:1:14:1 | impl Struct { ... } | | | regular.rs:13:5:13:18 | fn g | ::g | | regular.rs:16:1:18:1 | trait TraitWithBlanketImpl | test::regular::TraitWithBlanketImpl | -| regular.rs:17:5:17:16 | fn h | test::regular::TraitWithBlanketImpl::h | +| regular.rs:17:5:17:16 | fn h | ::h | | regular.rs:20:1:22:1 | impl TraitWithBlanketImpl for T { ... } | <_ as test::regular::TraitWithBlanketImpl> | | regular.rs:21:5:21:18 | fn h | <_ as test::regular::TraitWithBlanketImpl>::h | | regular.rs:24:1:24:12 | fn free | test::regular::free | @@ -29,6 +29,6 @@ | regular.rs:66:5:66:40 | fn is_alphanum | test::regular::is_alphanum | | regular.rs:69:1:71:1 | fn is_number_or_letter | test::regular::is_number_or_letter | | regular.rs:73:1:75:1 | trait Abs | test::regular::Abs | -| regular.rs:74:5:74:25 | fn abs | test::regular::Abs::abs | +| regular.rs:74:5:74:25 | fn abs | ::abs | | regular.rs:77:1:85:1 | impl Abs for i32 { ... } | | | regular.rs:78:5:84:5 | fn abs | ::abs | diff --git a/rust/ql/test/library-tests/dataflow/collections/inline-flow.expected b/rust/ql/test/library-tests/dataflow/collections/inline-flow.expected index e4d20768e1e4..b8bc4fd7d7f3 100644 --- a/rust/ql/test/library-tests/dataflow/collections/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/collections/inline-flow.expected @@ -1,7 +1,7 @@ models | 1 | Summary: <& as core::ops::deref::Deref>::deref; Argument[self].Reference; ReturnValue; value | -| 2 | Summary: core::ops::arith::AddAssign::add_assign; Argument[0]; Argument[self].Reference; taint | -| 3 | Summary: core::ops::index::Index::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 2 | Summary: ::add_assign; Argument[0]; Argument[self].Reference; taint | +| 3 | Summary: ::index; Argument[self].Reference.Element; ReturnValue.Reference; value | edges | main.rs:15:13:15:13 | s | main.rs:16:20:16:20 | s | provenance | | | main.rs:15:17:15:25 | source(...) | main.rs:15:13:15:13 | s | provenance | | diff --git a/rust/ql/test/library-tests/dataflow/global/inline-flow.expected b/rust/ql/test/library-tests/dataflow/global/inline-flow.expected index 299fd896ad68..e13411a7ab03 100644 --- a/rust/ql/test/library-tests/dataflow/global/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/global/inline-flow.expected @@ -1,6 +1,6 @@ models | 1 | Summary: <& as core::ops::deref::Deref>::deref; Argument[self].Reference; ReturnValue; value | -| 2 | Summary: core::ops::arith::Mul::mul; Argument[self,0]; ReturnValue; taint | +| 2 | Summary: ::mul; Argument[self,0]; ReturnValue; taint | | 3 | Summary: futures_executor::local_pool::block_on; Argument[0]; ReturnValue; value | edges | main.rs:12:28:14:1 | { ... } | main.rs:17:13:17:23 | get_data(...) | provenance | | 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 e9c603a97eb3..3dbfa8da04d9 100644 --- a/rust/ql/test/library-tests/dataflow/local/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/local/inline-flow.expected @@ -3,21 +3,21 @@ models | 2 | Summary: ::deref; Argument[self].Reference.Field[alloc::boxed::Box(0)]; ReturnValue.Reference; value | | 3 | Summary: ::new; Argument[0]; ReturnValue.Field[alloc::boxed::Box(0)]; value | | 4 | Summary: ::deref; Argument[self]; ReturnValue; value | -| 5 | Summary: ::from; Argument[0]; ReturnValue; taint | -| 6 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 7 | Summary: ::unwrap_or; Argument[0]; ReturnValue; value | -| 8 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 9 | Summary: ::unwrap_or_else; Argument[0].ReturnValue; ReturnValue; value | -| 10 | Summary: ::unwrap_or_else; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 11 | Summary: ::err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 12 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 13 | Summary: ::expect_err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue; value | -| 14 | Summary: ::ok; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 15 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 16 | Summary: alloc::string::ToString::to_string; Argument[self].Reference; ReturnValue; taint | -| 17 | Summary: core::convert::Into::into; Argument[self].Element; ReturnValue.Element; taint | -| 18 | Summary: core::convert::Into::into; Argument[self].Reference.Element; ReturnValue.Element; taint | -| 19 | Summary: core::ops::index::Index::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 5 | Summary: ::to_string; Argument[self].Reference; ReturnValue; taint | +| 6 | Summary: ::into; Argument[self].Element; ReturnValue.Element; taint | +| 7 | Summary: ::into; Argument[self].Reference.Element; ReturnValue.Element; taint | +| 8 | Summary: ::from; Argument[0]; ReturnValue; taint | +| 9 | Summary: ::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 10 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 11 | Summary: ::unwrap_or; Argument[0]; ReturnValue; value | +| 12 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 13 | Summary: ::unwrap_or_else; Argument[0].ReturnValue; ReturnValue; value | +| 14 | Summary: ::unwrap_or_else; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 15 | Summary: ::err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 16 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 17 | Summary: ::expect_err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue; value | +| 18 | Summary: ::ok; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 19 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | edges | main.rs:23:9:23:9 | s | main.rs:24:10:24:10 | s | provenance | | | main.rs:23:9:23:9 | s | main.rs:26:12:26:12 | x | provenance | | @@ -129,17 +129,17 @@ edges | main.rs:278:9:278:10 | s1 [Some] | main.rs:279:10:279:11 | s1 [Some] | provenance | | | main.rs:278:14:278:29 | Some(...) [Some] | main.rs:278:9:278:10 | s1 [Some] | provenance | | | main.rs:278:19:278:28 | source(...) | main.rs:278:14:278:29 | Some(...) [Some] | provenance | | -| main.rs:279:10:279:11 | s1 [Some] | main.rs:279:10:279:20 | s1.unwrap() | provenance | MaD:6 | +| main.rs:279:10:279:11 | s1 [Some] | main.rs:279:10:279:20 | s1.unwrap() | provenance | MaD:10 | | main.rs:283:9:283:10 | s1 [Some] | main.rs:284:10:284:11 | s1 [Some] | provenance | | | main.rs:283:14:283:29 | Some(...) [Some] | main.rs:283:9:283:10 | s1 [Some] | provenance | | | main.rs:283:19:283:28 | source(...) | main.rs:283:14:283:29 | Some(...) [Some] | provenance | | -| main.rs:284:10:284:11 | s1 [Some] | main.rs:284:10:284:24 | s1.unwrap_or(...) | provenance | MaD:8 | -| main.rs:287:23:287:32 | source(...) | main.rs:287:10:287:33 | s2.unwrap_or(...) | provenance | MaD:7 | +| main.rs:284:10:284:11 | s1 [Some] | main.rs:284:10:284:24 | s1.unwrap_or(...) | provenance | MaD:12 | +| main.rs:287:23:287:32 | source(...) | main.rs:287:10:287:33 | s2.unwrap_or(...) | provenance | MaD:11 | | main.rs:291:9:291:10 | s1 [Some] | main.rs:292:10:292:11 | s1 [Some] | provenance | | | main.rs:291:14:291:29 | Some(...) [Some] | main.rs:291:9:291:10 | s1 [Some] | provenance | | | main.rs:291:19:291:28 | source(...) | main.rs:291:14:291:29 | Some(...) [Some] | provenance | | -| main.rs:292:10:292:11 | s1 [Some] | main.rs:292:10:292:32 | s1.unwrap_or_else(...) | provenance | MaD:10 | -| main.rs:295:31:295:40 | source(...) | main.rs:295:10:295:41 | s2.unwrap_or_else(...) | provenance | MaD:9 | +| main.rs:292:10:292:11 | s1 [Some] | main.rs:292:10:292:32 | s1.unwrap_or_else(...) | provenance | MaD:14 | +| main.rs:295:31:295:40 | source(...) | main.rs:295:10:295:41 | s2.unwrap_or_else(...) | provenance | MaD:13 | | main.rs:299:9:299:10 | s1 [Some] | main.rs:301:14:301:15 | s1 [Some] | provenance | | | main.rs:299:14:299:29 | Some(...) [Some] | main.rs:299:9:299:10 | s1 [Some] | provenance | | | main.rs:299:19:299:28 | source(...) | main.rs:299:14:299:29 | Some(...) [Some] | provenance | | @@ -150,16 +150,16 @@ edges | main.rs:308:32:308:45 | Ok(...) [Ok] | main.rs:308:9:308:10 | r1 [Ok] | provenance | | | main.rs:308:35:308:44 | source(...) | main.rs:308:32:308:45 | Ok(...) [Ok] | provenance | | | main.rs:309:9:309:11 | o1a [Some] | main.rs:311:10:311:12 | o1a [Some] | provenance | | -| main.rs:309:28:309:29 | r1 [Ok] | main.rs:309:28:309:34 | r1.ok() [Some] | provenance | MaD:14 | +| main.rs:309:28:309:29 | r1 [Ok] | main.rs:309:28:309:34 | r1.ok() [Some] | provenance | MaD:18 | | main.rs:309:28:309:34 | r1.ok() [Some] | main.rs:309:9:309:11 | o1a [Some] | provenance | | -| main.rs:311:10:311:12 | o1a [Some] | main.rs:311:10:311:21 | o1a.unwrap() | provenance | MaD:6 | +| main.rs:311:10:311:12 | o1a [Some] | main.rs:311:10:311:21 | o1a.unwrap() | provenance | MaD:10 | | main.rs:314:9:314:10 | r2 [Err] | main.rs:316:28:316:29 | r2 [Err] | provenance | | | main.rs:314:32:314:46 | Err(...) [Err] | main.rs:314:9:314:10 | r2 [Err] | provenance | | | main.rs:314:36:314:45 | source(...) | main.rs:314:32:314:46 | Err(...) [Err] | provenance | | | main.rs:316:9:316:11 | o2b [Some] | main.rs:318:10:318:12 | o2b [Some] | provenance | | -| main.rs:316:28:316:29 | r2 [Err] | main.rs:316:28:316:35 | r2.err() [Some] | provenance | MaD:11 | +| main.rs:316:28:316:29 | r2 [Err] | main.rs:316:28:316:35 | r2.err() [Some] | provenance | MaD:15 | | main.rs:316:28:316:35 | r2.err() [Some] | main.rs:316:9:316:11 | o2b [Some] | provenance | | -| main.rs:318:10:318:12 | o2b [Some] | main.rs:318:10:318:21 | o2b.unwrap() | provenance | MaD:6 | +| main.rs:318:10:318:12 | o2b [Some] | main.rs:318:10:318:21 | o2b.unwrap() | provenance | MaD:10 | | main.rs:322:9:322:10 | s1 [Ok] | main.rs:325:14:325:15 | s1 [Ok] | provenance | | | main.rs:322:32:322:45 | Ok(...) [Ok] | main.rs:322:9:322:10 | s1 [Ok] | provenance | | | main.rs:322:35:322:44 | source(...) | main.rs:322:32:322:45 | Ok(...) [Ok] | provenance | | @@ -169,11 +169,11 @@ edges | main.rs:335:9:335:10 | s1 [Ok] | main.rs:336:10:336:11 | s1 [Ok] | provenance | | | main.rs:335:32:335:45 | Ok(...) [Ok] | main.rs:335:9:335:10 | s1 [Ok] | provenance | | | main.rs:335:35:335:44 | source(...) | main.rs:335:32:335:45 | Ok(...) [Ok] | provenance | | -| main.rs:336:10:336:11 | s1 [Ok] | main.rs:336:10:336:22 | s1.expect(...) | provenance | MaD:12 | +| main.rs:336:10:336:11 | s1 [Ok] | main.rs:336:10:336:22 | s1.expect(...) | provenance | MaD:16 | | main.rs:339:9:339:10 | s2 [Err] | main.rs:341:10:341:11 | s2 [Err] | provenance | | | main.rs:339:32:339:46 | Err(...) [Err] | main.rs:339:9:339:10 | s2 [Err] | provenance | | | main.rs:339:36:339:45 | source(...) | main.rs:339:32:339:46 | Err(...) [Err] | provenance | | -| main.rs:341:10:341:11 | s2 [Err] | main.rs:341:10:341:26 | s2.expect_err(...) | provenance | MaD:13 | +| main.rs:341:10:341:11 | s2 [Err] | main.rs:341:10:341:26 | s2.expect_err(...) | provenance | MaD:17 | | main.rs:350:9:350:10 | s1 [A] | main.rs:352:11:352:12 | s1 [A] | provenance | | | main.rs:350:14:350:39 | ...::A(...) [A] | main.rs:350:9:350:10 | s1 [A] | provenance | | | main.rs:350:29:350:38 | source(...) | main.rs:350:14:350:39 | ...::A(...) [A] | provenance | | @@ -222,13 +222,13 @@ edges | main.rs:430:16:430:33 | [...] [element] | main.rs:430:9:430:12 | arr1 [element] | provenance | | | main.rs:430:23:430:32 | source(...) | main.rs:430:16:430:33 | [...] [element] | provenance | | | main.rs:431:9:431:10 | n1 | main.rs:432:10:432:11 | n1 | provenance | | -| main.rs:431:14:431:17 | arr1 [element] | main.rs:431:14:431:20 | arr1[2] | provenance | MaD:19 | +| main.rs:431:14:431:17 | arr1 [element] | main.rs:431:14:431:20 | arr1[2] | provenance | MaD:9 | | main.rs:431:14:431:20 | arr1[2] | main.rs:431:9:431:10 | n1 | provenance | | | main.rs:434:9:434:12 | arr2 [element] | main.rs:435:14:435:17 | arr2 [element] | provenance | | | main.rs:434:16:434:31 | [...; 10] [element] | main.rs:434:9:434:12 | arr2 [element] | provenance | | | main.rs:434:17:434:26 | source(...) | main.rs:434:16:434:31 | [...; 10] [element] | provenance | | | main.rs:435:9:435:10 | n2 | main.rs:436:10:436:11 | n2 | provenance | | -| main.rs:435:14:435:17 | arr2 [element] | main.rs:435:14:435:20 | arr2[4] | provenance | MaD:19 | +| main.rs:435:14:435:17 | arr2 [element] | main.rs:435:14:435:20 | arr2[4] | provenance | MaD:9 | | main.rs:435:14:435:20 | arr2[4] | main.rs:435:9:435:10 | n2 | provenance | | | main.rs:444:9:444:12 | arr1 [element] | main.rs:445:15:445:18 | arr1 [element] | provenance | | | main.rs:444:16:444:33 | [...] [element] | main.rs:444:9:444:12 | arr1 [element] | provenance | | @@ -249,9 +249,9 @@ edges | main.rs:470:5:470:11 | [post] mut_arr [element] | main.rs:473:10:473:16 | mut_arr [element] | provenance | | | main.rs:470:18:470:27 | source(...) | main.rs:470:5:470:11 | [post] mut_arr [element] | provenance | | | main.rs:471:9:471:9 | d | main.rs:472:10:472:10 | d | provenance | | -| main.rs:471:13:471:19 | mut_arr [element] | main.rs:471:13:471:22 | mut_arr[1] | provenance | MaD:19 | +| main.rs:471:13:471:19 | mut_arr [element] | main.rs:471:13:471:22 | mut_arr[1] | provenance | MaD:9 | | main.rs:471:13:471:22 | mut_arr[1] | main.rs:471:9:471:9 | d | provenance | | -| main.rs:473:10:473:16 | mut_arr [element] | main.rs:473:10:473:19 | mut_arr[0] | provenance | MaD:19 | +| main.rs:473:10:473:16 | mut_arr [element] | main.rs:473:10:473:19 | mut_arr[0] | provenance | MaD:9 | | main.rs:496:9:496:9 | s | main.rs:497:10:497:10 | s | provenance | | | main.rs:496:25:496:26 | source(...) | main.rs:496:9:496:9 | s | provenance | | | main.rs:505:9:505:9 | a | main.rs:506:13:506:13 | a | provenance | | @@ -260,27 +260,27 @@ edges | main.rs:506:9:506:9 | b | main.rs:507:13:507:13 | b | provenance | | | main.rs:506:9:506:9 | b | main.rs:508:18:508:18 | b | provenance | | | main.rs:506:9:506:9 | b | main.rs:511:17:511:17 | b | provenance | | -| main.rs:506:13:506:13 | a | main.rs:506:13:506:25 | a.to_string() | provenance | MaD:16 | +| main.rs:506:13:506:13 | a | main.rs:506:13:506:25 | a.to_string() | provenance | MaD:5 | | main.rs:506:13:506:25 | a.to_string() | main.rs:506:9:506:9 | b | provenance | | | main.rs:507:9:507:9 | c | main.rs:512:10:512:10 | c | provenance | | | main.rs:507:13:507:13 | b | main.rs:507:13:507:28 | b.parse() [Ok] | provenance | MaD:4 | -| main.rs:507:13:507:28 | b.parse() [Ok] | main.rs:507:13:507:37 | ... .unwrap() | provenance | MaD:15 | +| main.rs:507:13:507:28 | b.parse() [Ok] | main.rs:507:13:507:37 | ... .unwrap() | provenance | MaD:19 | | main.rs:507:13:507:37 | ... .unwrap() | main.rs:507:9:507:9 | c | provenance | | | main.rs:508:9:508:9 | d | main.rs:513:10:513:10 | d | provenance | | | main.rs:508:18:508:18 | b | main.rs:508:18:508:26 | b.parse() [Ok] | provenance | MaD:4 | -| main.rs:508:18:508:26 | b.parse() [Ok] | main.rs:508:18:508:35 | ... .unwrap() | provenance | MaD:15 | +| main.rs:508:18:508:26 | b.parse() [Ok] | main.rs:508:18:508:35 | ... .unwrap() | provenance | MaD:19 | | main.rs:508:18:508:35 | ... .unwrap() | main.rs:508:9:508:9 | d | provenance | | | main.rs:517:9:517:10 | vs [element] | main.rs:519:10:519:11 | vs [element] | provenance | | | main.rs:517:9:517:10 | vs [element] | main.rs:523:14:523:15 | vs [element] | provenance | | | main.rs:517:14:517:34 | [...] [element] | main.rs:517:9:517:10 | vs [element] | provenance | | | main.rs:517:15:517:24 | source(...) | main.rs:517:14:517:34 | [...] [element] | provenance | | -| main.rs:519:10:519:11 | vs [element] | main.rs:519:10:519:14 | vs[0] | provenance | MaD:19 | +| main.rs:519:10:519:11 | vs [element] | main.rs:519:10:519:14 | vs[0] | provenance | MaD:9 | | main.rs:523:9:523:9 | v | main.rs:524:14:524:14 | v | provenance | | | main.rs:523:14:523:15 | vs [element] | main.rs:523:9:523:9 | v | provenance | | | main.rs:542:9:542:18 | mut vs_mut [element] | main.rs:544:10:544:15 | vs_mut [element] | provenance | | | main.rs:542:22:542:42 | [...] [element] | main.rs:542:9:542:18 | mut vs_mut [element] | provenance | | | main.rs:542:23:542:32 | source(...) | main.rs:542:22:542:42 | [...] [element] | provenance | | -| main.rs:544:10:544:15 | vs_mut [element] | main.rs:544:10:544:18 | vs_mut[0] | provenance | MaD:19 | +| main.rs:544:10:544:15 | vs_mut [element] | main.rs:544:10:544:18 | vs_mut[0] | provenance | MaD:9 | | main.rs:554:9:554:9 | a | main.rs:559:10:559:10 | a | provenance | | | main.rs:554:13:554:22 | source(...) | main.rs:554:9:554:9 | a | provenance | | | main.rs:555:9:555:9 | b | main.rs:560:15:560:15 | b | provenance | | @@ -297,16 +297,16 @@ edges | main.rs:566:9:566:9 | a | main.rs:569:10:569:10 | a | provenance | | | main.rs:566:9:566:9 | a | main.rs:570:20:570:20 | a | provenance | | | main.rs:566:18:566:27 | source(...) | main.rs:566:9:566:9 | a | provenance | | -| main.rs:569:10:569:10 | a | main.rs:569:10:569:17 | a.into() | provenance | MaD:17 | -| main.rs:569:10:569:10 | a | main.rs:569:10:569:17 | a.into() | provenance | MaD:18 | +| main.rs:569:10:569:10 | a | main.rs:569:10:569:17 | a.into() | provenance | MaD:6 | +| main.rs:569:10:569:10 | a | main.rs:569:10:569:17 | a.into() | provenance | MaD:7 | | main.rs:570:20:570:20 | a | main.rs:570:10:570:21 | ...::from(...) | provenance | ReflexiveFrom | | main.rs:572:9:572:9 | b | main.rs:574:10:574:17 | b as i64 | provenance | | | main.rs:572:9:572:9 | b | main.rs:575:10:575:10 | b | provenance | | | main.rs:572:9:572:9 | b | main.rs:576:20:576:20 | b | provenance | | | main.rs:572:18:572:27 | source(...) | main.rs:572:9:572:9 | b | provenance | | -| main.rs:575:10:575:10 | b | main.rs:575:10:575:17 | b.into() | provenance | MaD:17 | -| main.rs:575:10:575:10 | b | main.rs:575:10:575:17 | b.into() | provenance | MaD:18 | -| main.rs:576:20:576:20 | b | main.rs:576:10:576:21 | ...::from(...) | provenance | MaD:5 | +| main.rs:575:10:575:10 | b | main.rs:575:10:575:17 | b.into() | provenance | MaD:6 | +| main.rs:575:10:575:10 | b | main.rs:575:10:575:17 | b.into() | provenance | MaD:7 | +| main.rs:576:20:576:20 | b | main.rs:576:10:576:21 | ...::from(...) | provenance | MaD:8 | nodes | main.rs:19:10:19:18 | source(...) | semmle.label | source(...) | | main.rs:23:9:23:9 | s | semmle.label | s | diff --git a/rust/ql/test/library-tests/dataflow/modeled/inline-flow.expected b/rust/ql/test/library-tests/dataflow/modeled/inline-flow.expected index cbab732aef78..22ec0b630b32 100644 --- a/rust/ql/test/library-tests/dataflow/modeled/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/modeled/inline-flow.expected @@ -3,24 +3,24 @@ models | 2 | Summary: ::into_pin; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer]; value | | 3 | Summary: ::new; Argument[0]; ReturnValue.Field[alloc::boxed::Box(0)]; value | | 4 | Summary: ::pin; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer].Field[alloc::boxed::Box(0)]; value | -| 5 | Summary: ::clone; Argument[self].Reference; ReturnValue; value | -| 6 | Summary: ::clone; Argument[self]; ReturnValue; value | -| 7 | Summary: ::map_or; Argument[1].ReturnValue; ReturnValue; value | -| 8 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 9 | Summary: ::zip; Argument[0].Field[core::option::Option::Some(0)]; ReturnValue.Field[core::option::Option::Some(0)].Field[1]; value | -| 10 | Summary: ::deref; Argument[self].Reference.Field[core::pin::Pin::pointer].Field[alloc::boxed::Box(0)]; ReturnValue.Reference; value | -| 11 | Summary: ::deref; Argument[self].Reference.Field[core::pin::Pin::pointer].Reference; ReturnValue.Reference; value | -| 12 | Summary: ::into_inner; Argument[0].Field[core::pin::Pin::pointer]; ReturnValue; value | -| 13 | Summary: ::into_inner_unchecked; Argument[0].Field[core::pin::Pin::pointer]; ReturnValue; value | -| 14 | Summary: ::new; Argument[0].Reference; ReturnValue; value | -| 15 | Summary: ::new; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer]; value | -| 16 | Summary: ::new_unchecked; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer]; value | -| 17 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 18 | Summary: core::clone::Clone::clone; Argument[self].Reference; ReturnValue; value | -| 19 | Summary: core::cmp::Ord::clamp; Argument[self,0,1]; ReturnValue; value | -| 20 | Summary: core::cmp::Ord::max; Argument[self,0]; ReturnValue; value | -| 21 | Summary: core::cmp::Ord::min; Argument[self,0]; ReturnValue; value | -| 22 | Summary: core::ops::arith::Add::add; Argument[self,0]; ReturnValue; taint | +| 5 | Summary: ::clone; Argument[self].Reference; ReturnValue; value | +| 6 | Summary: ::clamp; Argument[self,0,1]; ReturnValue; value | +| 7 | Summary: ::max; Argument[self,0]; ReturnValue; value | +| 8 | Summary: ::min; Argument[self,0]; ReturnValue; value | +| 9 | Summary: ::clone; Argument[self].Reference; ReturnValue; value | +| 10 | Summary: ::clone; Argument[self]; ReturnValue; value | +| 11 | Summary: ::add; Argument[self,0]; ReturnValue; taint | +| 12 | Summary: ::map_or; Argument[1].ReturnValue; ReturnValue; value | +| 13 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 14 | Summary: ::zip; Argument[0].Field[core::option::Option::Some(0)]; ReturnValue.Field[core::option::Option::Some(0)].Field[1]; value | +| 15 | Summary: ::deref; Argument[self].Reference.Field[core::pin::Pin::pointer].Field[alloc::boxed::Box(0)]; ReturnValue.Reference; value | +| 16 | Summary: ::deref; Argument[self].Reference.Field[core::pin::Pin::pointer].Reference; ReturnValue.Reference; value | +| 17 | Summary: ::into_inner; Argument[0].Field[core::pin::Pin::pointer]; ReturnValue; value | +| 18 | Summary: ::into_inner_unchecked; Argument[0].Field[core::pin::Pin::pointer]; ReturnValue; value | +| 19 | Summary: ::new; Argument[0].Reference; ReturnValue; value | +| 20 | Summary: ::new; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer]; value | +| 21 | Summary: ::new_unchecked; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer]; value | +| 22 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | | 23 | Summary: core::ptr::read; Argument[0].Reference; ReturnValue; value | | 24 | Summary: core::ptr::write; Argument[1]; Argument[0].Reference; value | edges @@ -28,27 +28,27 @@ edges | main.rs:12:9:12:9 | a [Some] | main.rs:14:13:14:13 | a [Some] | provenance | | | main.rs:12:13:12:28 | Some(...) [Some] | main.rs:12:9:12:9 | a [Some] | provenance | | | main.rs:12:18:12:27 | source(...) | main.rs:12:13:12:28 | Some(...) [Some] | provenance | | -| main.rs:13:10:13:10 | a [Some] | main.rs:13:10:13:19 | a.unwrap() | provenance | MaD:8 | +| main.rs:13:10:13:10 | a [Some] | main.rs:13:10:13:19 | a.unwrap() | provenance | MaD:13 | | main.rs:14:9:14:9 | b [Some] | main.rs:15:10:15:10 | b [Some] | provenance | | -| main.rs:14:13:14:13 | a [Some] | main.rs:14:13:14:21 | a.clone() [Some] | provenance | MaD:18 | +| main.rs:14:13:14:13 | a [Some] | main.rs:14:13:14:21 | a.clone() [Some] | provenance | MaD:5 | | main.rs:14:13:14:21 | a.clone() [Some] | main.rs:14:9:14:9 | b [Some] | provenance | | -| main.rs:15:10:15:10 | b [Some] | main.rs:15:10:15:19 | b.unwrap() | provenance | MaD:8 | +| main.rs:15:10:15:10 | b [Some] | main.rs:15:10:15:19 | b.unwrap() | provenance | MaD:13 | | main.rs:19:9:19:9 | a [Ok] | main.rs:20:10:20:10 | a [Ok] | provenance | | | main.rs:19:9:19:9 | a [Ok] | main.rs:21:13:21:13 | a [Ok] | provenance | | | main.rs:19:31:19:44 | Ok(...) [Ok] | main.rs:19:9:19:9 | a [Ok] | provenance | | | main.rs:19:34:19:43 | source(...) | main.rs:19:31:19:44 | Ok(...) [Ok] | provenance | | -| main.rs:20:10:20:10 | a [Ok] | main.rs:20:10:20:19 | a.unwrap() | provenance | MaD:17 | +| main.rs:20:10:20:10 | a [Ok] | main.rs:20:10:20:19 | a.unwrap() | provenance | MaD:22 | | main.rs:21:9:21:9 | b [Ok] | main.rs:22:10:22:10 | b [Ok] | provenance | | -| main.rs:21:13:21:13 | a [Ok] | main.rs:21:13:21:21 | a.clone() [Ok] | provenance | MaD:18 | +| main.rs:21:13:21:13 | a [Ok] | main.rs:21:13:21:21 | a.clone() [Ok] | provenance | MaD:5 | | main.rs:21:13:21:21 | a.clone() [Ok] | main.rs:21:9:21:9 | b [Ok] | provenance | | -| main.rs:22:10:22:10 | b [Ok] | main.rs:22:10:22:19 | b.unwrap() | provenance | MaD:17 | +| main.rs:22:10:22:10 | b [Ok] | main.rs:22:10:22:19 | b.unwrap() | provenance | MaD:22 | | main.rs:26:9:26:9 | a | main.rs:27:10:27:10 | a | provenance | | | main.rs:26:9:26:9 | a | main.rs:28:13:28:13 | a | provenance | | | main.rs:26:13:26:22 | source(...) | main.rs:26:9:26:9 | a | provenance | | | main.rs:28:9:28:9 | b | main.rs:29:10:29:10 | b | provenance | | | main.rs:28:9:28:9 | b [&ref] | main.rs:29:10:29:10 | b | provenance | | -| main.rs:28:13:28:13 | a | main.rs:28:13:28:21 | a.clone() | provenance | MaD:5 | -| main.rs:28:13:28:13 | a | main.rs:28:13:28:21 | a.clone() [&ref] | provenance | MaD:6 | +| main.rs:28:13:28:13 | a | main.rs:28:13:28:21 | a.clone() | provenance | MaD:9 | +| main.rs:28:13:28:13 | a | main.rs:28:13:28:21 | a.clone() [&ref] | provenance | MaD:10 | | main.rs:28:13:28:21 | a.clone() | main.rs:28:9:28:9 | b | provenance | | | main.rs:28:13:28:21 | a.clone() [&ref] | main.rs:28:9:28:9 | b [&ref] | provenance | | | main.rs:43:18:43:22 | SelfParam [&ref, Wrapper] | main.rs:44:26:44:31 | self.n | provenance | | @@ -73,15 +73,15 @@ edges | main.rs:66:22:66:31 | source(...) | main.rs:66:17:66:32 | Some(...) [Some] | provenance | | | main.rs:67:13:67:13 | z [Some, tuple.1] | main.rs:68:15:68:15 | z [Some, tuple.1] | provenance | | | main.rs:67:17:67:24 | a.zip(...) [Some, tuple.1] | main.rs:67:13:67:13 | z [Some, tuple.1] | provenance | | -| main.rs:67:23:67:23 | b [Some] | main.rs:67:17:67:24 | a.zip(...) [Some, tuple.1] | provenance | MaD:9 | +| main.rs:67:23:67:23 | b [Some] | main.rs:67:17:67:24 | a.zip(...) [Some, tuple.1] | provenance | MaD:14 | | main.rs:68:15:68:15 | z [Some, tuple.1] | main.rs:69:13:69:24 | Some(...) [Some, tuple.1] | provenance | | | main.rs:69:13:69:24 | Some(...) [Some, tuple.1] | main.rs:69:18:69:23 | TuplePat [tuple.1] | provenance | | | main.rs:69:18:69:23 | TuplePat [tuple.1] | main.rs:69:22:69:22 | m | provenance | | | main.rs:69:22:69:22 | m | main.rs:71:22:71:22 | m | provenance | | | main.rs:79:13:79:13 | b | main.rs:80:14:80:14 | b | provenance | | | main.rs:79:17:79:47 | a.map_or(...) | main.rs:79:13:79:13 | b | provenance | | -| main.rs:79:33:79:46 | ... + ... | main.rs:79:17:79:47 | a.map_or(...) | provenance | MaD:7 | -| main.rs:79:37:79:46 | source(...) | main.rs:79:33:79:46 | ... + ... | provenance | MaD:22 | +| main.rs:79:33:79:46 | ... + ... | main.rs:79:17:79:47 | a.map_or(...) | provenance | MaD:12 | +| main.rs:79:37:79:46 | source(...) | main.rs:79:33:79:46 | ... + ... | provenance | MaD:11 | | main.rs:92:29:92:29 | [post] y [&ref] | main.rs:93:33:93:33 | y [&ref] | provenance | | | main.rs:92:32:92:41 | source(...) | main.rs:92:29:92:29 | [post] y [&ref] | provenance | MaD:24 | | main.rs:93:33:93:33 | y [&ref] | main.rs:93:18:93:34 | ...::read(...) | provenance | MaD:23 | @@ -97,8 +97,8 @@ edges | main.rs:109:13:109:20 | mut pin1 [Pin, &ref] | main.rs:115:31:115:34 | pin1 [Pin, &ref] | provenance | | | main.rs:109:24:109:35 | ...::new(...) | main.rs:109:13:109:20 | mut pin1 | provenance | | | main.rs:109:24:109:35 | ...::new(...) [Pin, &ref] | main.rs:109:13:109:20 | mut pin1 [Pin, &ref] | provenance | | -| main.rs:109:33:109:34 | &i [&ref] | main.rs:109:24:109:35 | ...::new(...) | provenance | MaD:14 | -| main.rs:109:33:109:34 | &i [&ref] | main.rs:109:24:109:35 | ...::new(...) [Pin, &ref] | provenance | MaD:15 | +| main.rs:109:33:109:34 | &i [&ref] | main.rs:109:24:109:35 | ...::new(...) | provenance | MaD:19 | +| main.rs:109:33:109:34 | &i [&ref] | main.rs:109:24:109:35 | ...::new(...) [Pin, &ref] | provenance | MaD:20 | | main.rs:109:34:109:34 | i | main.rs:109:33:109:34 | &i [&ref] | provenance | | | main.rs:110:13:110:20 | mut pin2 [Pin, Box(0)] | main.rs:116:15:116:18 | pin2 [Pin, Box(0)] | provenance | | | main.rs:110:24:110:34 | ...::pin(...) [Pin, Box(0)] | main.rs:110:13:110:20 | mut pin2 [Pin, Box(0)] | provenance | | @@ -108,56 +108,56 @@ edges | main.rs:111:38:111:48 | ...::new(...) [Box(0)] | main.rs:111:24:111:49 | ...::into_pin(...) [Pin, Box(0)] | provenance | MaD:2 | | main.rs:111:47:111:47 | i | main.rs:111:38:111:48 | ...::new(...) [Box(0)] | provenance | MaD:3 | | main.rs:112:13:112:20 | mut pin4 [Pin, &ref] | main.rs:118:15:118:18 | pin4 [Pin, &ref] | provenance | | -| main.rs:112:24:112:27 | &mut pinned [&ref] | main.rs:112:24:112:27 | ...::new_unchecked(...) [Pin, &ref] | provenance | MaD:16 | +| main.rs:112:24:112:27 | &mut pinned [&ref] | main.rs:112:24:112:27 | ...::new_unchecked(...) [Pin, &ref] | provenance | MaD:21 | | main.rs:112:24:112:27 | ...::new_unchecked(...) [Pin, &ref] | main.rs:112:13:112:20 | mut pin4 [Pin, &ref] | provenance | | | main.rs:112:24:112:27 | mut pinned | main.rs:112:24:112:27 | pinned | provenance | | | main.rs:112:24:112:27 | pinned | main.rs:112:24:112:27 | &mut pinned [&ref] | provenance | | -| main.rs:114:15:114:18 | pin1 | main.rs:114:14:114:18 | * ... | provenance | MaD:10 | -| main.rs:114:15:114:18 | pin1 | main.rs:114:14:114:18 | * ... | provenance | MaD:11 | -| main.rs:114:15:114:18 | pin1 [Pin, &ref] | main.rs:114:14:114:18 | * ... | provenance | MaD:11 | +| main.rs:114:15:114:18 | pin1 | main.rs:114:14:114:18 | * ... | provenance | MaD:15 | +| main.rs:114:15:114:18 | pin1 | main.rs:114:14:114:18 | * ... | provenance | MaD:16 | +| main.rs:114:15:114:18 | pin1 [Pin, &ref] | main.rs:114:14:114:18 | * ... | provenance | MaD:16 | | main.rs:115:15:115:35 | ...::into_inner(...) | main.rs:115:14:115:35 | * ... | provenance | MaD:1 | | main.rs:115:15:115:35 | ...::into_inner(...) [&ref] | main.rs:115:14:115:35 | * ... | provenance | MaD:1 | -| main.rs:115:31:115:34 | pin1 | main.rs:115:15:115:35 | ...::into_inner(...) | provenance | MaD:12 | -| main.rs:115:31:115:34 | pin1 [Pin, &ref] | main.rs:115:15:115:35 | ...::into_inner(...) [&ref] | provenance | MaD:12 | -| main.rs:116:15:116:18 | pin2 [Pin, Box(0)] | main.rs:116:14:116:18 | * ... | provenance | MaD:10 | -| main.rs:117:15:117:18 | pin3 [Pin, Box(0)] | main.rs:117:14:117:18 | * ... | provenance | MaD:10 | -| main.rs:118:15:118:18 | pin4 [Pin, &ref] | main.rs:118:14:118:18 | * ... | provenance | MaD:11 | +| main.rs:115:31:115:34 | pin1 | main.rs:115:15:115:35 | ...::into_inner(...) | provenance | MaD:17 | +| main.rs:115:31:115:34 | pin1 [Pin, &ref] | main.rs:115:15:115:35 | ...::into_inner(...) [&ref] | provenance | MaD:17 | +| main.rs:116:15:116:18 | pin2 [Pin, Box(0)] | main.rs:116:14:116:18 | * ... | provenance | MaD:15 | +| main.rs:117:15:117:18 | pin3 [Pin, Box(0)] | main.rs:117:14:117:18 | * ... | provenance | MaD:15 | +| main.rs:118:15:118:18 | pin4 [Pin, &ref] | main.rs:118:14:118:18 | * ... | provenance | MaD:16 | | main.rs:122:13:122:18 | mut ms [MyStruct] | main.rs:123:34:123:35 | ms [MyStruct] | provenance | | | main.rs:122:13:122:18 | mut ms [MyStruct] | main.rs:127:14:127:15 | ms [MyStruct] | provenance | | | main.rs:122:22:122:49 | MyStruct {...} [MyStruct] | main.rs:122:13:122:18 | mut ms [MyStruct] | provenance | | | main.rs:122:38:122:47 | source(...) | main.rs:122:22:122:49 | MyStruct {...} [MyStruct] | provenance | | | main.rs:123:13:123:20 | mut pin1 [Pin, &ref, MyStruct] | main.rs:129:30:129:33 | pin1 [Pin, &ref, MyStruct] | provenance | | | main.rs:123:24:123:36 | ...::new(...) [Pin, &ref, MyStruct] | main.rs:123:13:123:20 | mut pin1 [Pin, &ref, MyStruct] | provenance | | -| main.rs:123:33:123:35 | &ms [&ref, MyStruct] | main.rs:123:24:123:36 | ...::new(...) [Pin, &ref, MyStruct] | provenance | MaD:15 | +| main.rs:123:33:123:35 | &ms [&ref, MyStruct] | main.rs:123:24:123:36 | ...::new(...) [Pin, &ref, MyStruct] | provenance | MaD:20 | | main.rs:123:34:123:35 | ms [MyStruct] | main.rs:123:33:123:35 | &ms [&ref, MyStruct] | provenance | | | main.rs:127:14:127:15 | ms [MyStruct] | main.rs:127:14:127:19 | ms.val | provenance | | | main.rs:129:14:129:34 | ...::into_inner(...) [&ref, MyStruct] | main.rs:129:14:129:38 | ... .val | provenance | | -| main.rs:129:30:129:33 | pin1 [Pin, &ref, MyStruct] | main.rs:129:14:129:34 | ...::into_inner(...) [&ref, MyStruct] | provenance | MaD:12 | +| main.rs:129:30:129:33 | pin1 [Pin, &ref, MyStruct] | main.rs:129:14:129:34 | ...::into_inner(...) [&ref, MyStruct] | provenance | MaD:17 | | main.rs:136:13:136:18 | mut ms [MyStruct] | main.rs:137:44:137:45 | ms [MyStruct] | provenance | | | main.rs:136:22:136:49 | MyStruct {...} [MyStruct] | main.rs:136:13:136:18 | mut ms [MyStruct] | provenance | | | main.rs:136:38:136:47 | source(...) | main.rs:136:22:136:49 | MyStruct {...} [MyStruct] | provenance | | | main.rs:137:13:137:20 | mut pin5 [Pin, &ref, MyStruct] | main.rs:139:40:139:43 | pin5 [Pin, &ref, MyStruct] | provenance | | | main.rs:137:24:137:46 | ...::new_unchecked(...) [Pin, &ref, MyStruct] | main.rs:137:13:137:20 | mut pin5 [Pin, &ref, MyStruct] | provenance | | -| main.rs:137:43:137:45 | &ms [&ref, MyStruct] | main.rs:137:24:137:46 | ...::new_unchecked(...) [Pin, &ref, MyStruct] | provenance | MaD:16 | +| main.rs:137:43:137:45 | &ms [&ref, MyStruct] | main.rs:137:24:137:46 | ...::new_unchecked(...) [Pin, &ref, MyStruct] | provenance | MaD:21 | | main.rs:137:44:137:45 | ms [MyStruct] | main.rs:137:43:137:45 | &ms [&ref, MyStruct] | provenance | | | main.rs:139:14:139:44 | ...::into_inner_unchecked(...) [&ref, MyStruct] | main.rs:139:14:139:48 | ... .val | provenance | | -| main.rs:139:40:139:43 | pin5 [Pin, &ref, MyStruct] | main.rs:139:14:139:44 | ...::into_inner_unchecked(...) [&ref, MyStruct] | provenance | MaD:13 | +| main.rs:139:40:139:43 | pin5 [Pin, &ref, MyStruct] | main.rs:139:14:139:44 | ...::into_inner_unchecked(...) [&ref, MyStruct] | provenance | MaD:18 | | main.rs:153:9:153:9 | a | main.rs:155:13:155:13 | a | provenance | | | main.rs:153:13:153:22 | source(...) | main.rs:153:9:153:9 | a | provenance | | | main.rs:154:9:154:9 | b | main.rs:155:19:155:19 | b | provenance | | | main.rs:154:13:154:22 | source(...) | main.rs:154:9:154:9 | b | provenance | | | main.rs:155:9:155:9 | c | main.rs:156:10:156:10 | c | provenance | | -| main.rs:155:13:155:13 | a | main.rs:155:13:155:20 | a.min(...) | provenance | MaD:21 | +| main.rs:155:13:155:13 | a | main.rs:155:13:155:20 | a.min(...) | provenance | MaD:8 | | main.rs:155:13:155:20 | a.min(...) | main.rs:155:9:155:9 | c | provenance | | -| main.rs:155:19:155:19 | b | main.rs:155:13:155:20 | a.min(...) | provenance | MaD:21 | +| main.rs:155:19:155:19 | b | main.rs:155:13:155:20 | a.min(...) | provenance | MaD:8 | | main.rs:158:9:158:9 | d | main.rs:160:13:160:13 | d | provenance | | | main.rs:158:13:158:22 | source(...) | main.rs:158:9:158:9 | d | provenance | | | main.rs:159:9:159:9 | e | main.rs:160:19:160:19 | e | provenance | | | main.rs:159:13:159:22 | source(...) | main.rs:159:9:159:9 | e | provenance | | | main.rs:160:9:160:9 | f | main.rs:161:10:161:10 | f | provenance | | -| main.rs:160:13:160:13 | d | main.rs:160:13:160:20 | d.max(...) | provenance | MaD:20 | +| main.rs:160:13:160:13 | d | main.rs:160:13:160:20 | d.max(...) | provenance | MaD:7 | | main.rs:160:13:160:20 | d.max(...) | main.rs:160:9:160:9 | f | provenance | | -| main.rs:160:19:160:19 | e | main.rs:160:13:160:20 | d.max(...) | provenance | MaD:20 | +| main.rs:160:19:160:19 | e | main.rs:160:13:160:20 | d.max(...) | provenance | MaD:7 | | main.rs:163:9:163:9 | g | main.rs:166:13:166:13 | g | provenance | | | main.rs:163:13:163:22 | source(...) | main.rs:163:9:163:9 | g | provenance | | | main.rs:164:9:164:9 | h | main.rs:166:21:166:21 | h | provenance | | @@ -165,10 +165,10 @@ edges | main.rs:165:9:165:9 | i | main.rs:166:24:166:24 | i | provenance | | | main.rs:165:13:165:22 | source(...) | main.rs:165:9:165:9 | i | provenance | | | main.rs:166:9:166:9 | j | main.rs:167:10:167:10 | j | provenance | | -| main.rs:166:13:166:13 | g | main.rs:166:13:166:25 | g.clamp(...) | provenance | MaD:19 | +| main.rs:166:13:166:13 | g | main.rs:166:13:166:25 | g.clamp(...) | provenance | MaD:6 | | main.rs:166:13:166:25 | g.clamp(...) | main.rs:166:9:166:9 | j | provenance | | -| main.rs:166:21:166:21 | h | main.rs:166:13:166:25 | g.clamp(...) | provenance | MaD:19 | -| main.rs:166:24:166:24 | i | main.rs:166:13:166:25 | g.clamp(...) | provenance | MaD:19 | +| main.rs:166:21:166:21 | h | main.rs:166:13:166:25 | g.clamp(...) | provenance | MaD:6 | +| main.rs:166:24:166:24 | i | main.rs:166:13:166:25 | g.clamp(...) | provenance | MaD:6 | nodes | main.rs:12:9:12:9 | a [Some] | semmle.label | a [Some] | | main.rs:12:13:12:28 | Some(...) [Some] | semmle.label | Some(...) [Some] | diff --git a/rust/ql/test/library-tests/dataflow/models/models.expected b/rust/ql/test/library-tests/dataflow/models/models.expected index e33d40856ce5..15e5d5f268d0 100644 --- a/rust/ql/test/library-tests/dataflow/models/models.expected +++ b/rust/ql/test/library-tests/dataflow/models/models.expected @@ -8,7 +8,7 @@ models | 7 | Sink: main::sink_out_of_function::pass_sink; Argument[0].ReturnValue; test-sink | | 8 | Sink: main::sink_out_of_function::pass_sink_nested; Argument[0].ReturnValue.Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-sink | | 9 | Source: ::source; ReturnValue.Field[main::MyFieldEnum::C::field_c]; test-source | -| 10 | Source: main::MyTrait::test_param_source; Parameter[0]; test-source | +| 10 | Source: ::test_param_source; Parameter[0]; test-source | | 11 | Source: main::arg_source; Argument[0]; test-source | | 12 | Source: main::enum_source; ReturnValue.Field[main::MyFieldEnum::D::field_d]; test-source | | 13 | Source: main::enum_source_nested; ReturnValue.Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-source | @@ -18,27 +18,26 @@ models | 17 | Source: main::source_into_function::pass_source; Argument[1].Parameter[0]; test-source | | 18 | Source: main::source_into_function::pass_source_nested; Argument[1].Parameter[0].Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-source | | 19 | Summary: <_ as main::MyTrait3>::flow_through3; Argument[0]; ReturnValue; value | -| 20 | Summary: core::cmp::Ord::max; Argument[self,0]; ReturnValue; value | -| 21 | Summary: core::cmp::PartialOrd::lt; Argument[self].Reference; ReturnValue; taint | -| 22 | Summary: core::ops::index::Index::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 20 | Summary: ::max; Argument[self,0]; ReturnValue; value | +| 21 | Summary: ::lt; Argument[self].Reference; ReturnValue; taint | +| 22 | Summary: ::index; Argument[self].Reference.Element; ReturnValue.Reference; value | | 23 | Summary: main::apply; Argument[0]; Argument[1].Parameter[0]; value | | 24 | Summary: main::apply; Argument[1].ReturnValue; ReturnValue; value | | 25 | Summary: main::coerce; Argument[0]; ReturnValue; taint | -| 26 | Summary: main::external_file::MyTrait2::flow_through2; Argument[0]; ReturnValue; value | -| 27 | Summary: main::external_file::generated_summary; Argument[0]; ReturnValue; value | -| 28 | Summary: main::external_file::neutral_manual_summary; Argument[0]; ReturnValue; value | -| 29 | Summary: main::get_array_element; Argument[0].Element; ReturnValue; value | -| 30 | Summary: main::get_async_number; Argument[0]; ReturnValue.Future; value | -| 31 | Summary: main::get_struct_field; Argument[0].Field[main::MyStruct::field1]; ReturnValue; value | -| 32 | Summary: main::get_tuple_element; Argument[0].Field[0]; ReturnValue; value | -| 33 | Summary: main::get_var_field; Argument[0].Field[main::MyFieldEnum::C::field_c]; ReturnValue; value | -| 34 | Summary: main::get_var_pos; Argument[0].Field[main::MyPosEnum::A(0)]; ReturnValue; value | -| 35 | Summary: main::set_array_element; Argument[0]; ReturnValue.Element; value | -| 36 | Summary: main::set_struct_field; Argument[0]; ReturnValue.Field[main::MyStruct::field2]; value | -| 37 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value | -| 38 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value | -| 39 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value | -| 40 | Summary: main::snd; Argument[1]; ReturnValue; value | +| 26 | Summary: main::external_file::generated_summary; Argument[0]; ReturnValue; value | +| 27 | Summary: main::external_file::neutral_manual_summary; Argument[0]; ReturnValue; value | +| 28 | Summary: main::get_array_element; Argument[0].Element; ReturnValue; value | +| 29 | Summary: main::get_async_number; Argument[0]; ReturnValue.Future; value | +| 30 | Summary: main::get_struct_field; Argument[0].Field[main::MyStruct::field1]; ReturnValue; value | +| 31 | Summary: main::get_tuple_element; Argument[0].Field[0]; ReturnValue; value | +| 32 | Summary: main::get_var_field; Argument[0].Field[main::MyFieldEnum::C::field_c]; ReturnValue; value | +| 33 | Summary: main::get_var_pos; Argument[0].Field[main::MyPosEnum::A(0)]; ReturnValue; value | +| 34 | Summary: main::set_array_element; Argument[0]; ReturnValue.Element; value | +| 35 | Summary: main::set_struct_field; Argument[0]; ReturnValue.Field[main::MyStruct::field2]; value | +| 36 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value | +| 37 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value | +| 38 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value | +| 39 | Summary: main::snd; Argument[1]; ReturnValue; value | edges | main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | | | main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | | @@ -53,8 +52,8 @@ edges | main.rs:41:9:41:10 | s1 | main.rs:42:17:42:18 | s1 | provenance | | | main.rs:41:14:41:23 | source(...) | main.rs:41:9:41:10 | s1 | provenance | | | main.rs:41:14:41:23 | source(...) | main.rs:41:9:41:10 | s1 | provenance | | -| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:40 | -| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:40 | +| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:39 | +| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:39 | | main.rs:54:9:54:9 | s | main.rs:55:27:55:27 | s | provenance | | | main.rs:54:9:54:9 | s | main.rs:55:27:55:27 | s | provenance | | | main.rs:54:13:54:21 | source(...) | main.rs:54:9:54:9 | s | provenance | | @@ -65,8 +64,8 @@ edges | main.rs:55:14:55:28 | ...::A(...) [A] | main.rs:55:9:55:10 | e1 [A] | provenance | | | main.rs:55:27:55:27 | s | main.rs:55:14:55:28 | ...::A(...) [A] | provenance | | | main.rs:55:27:55:27 | s | main.rs:55:14:55:28 | ...::A(...) [A] | provenance | | -| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:34 | -| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:34 | +| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:33 | +| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:33 | | main.rs:67:9:67:9 | s | main.rs:68:26:68:26 | s | provenance | | | main.rs:67:9:67:9 | s | main.rs:68:26:68:26 | s | provenance | | | main.rs:67:13:67:21 | source(...) | main.rs:67:9:67:9 | s | provenance | | @@ -75,8 +74,8 @@ edges | main.rs:68:9:68:10 | e1 [B] | main.rs:69:11:69:12 | e1 [B] | provenance | | | main.rs:68:14:68:27 | set_var_pos(...) [B] | main.rs:68:9:68:10 | e1 [B] | provenance | | | main.rs:68:14:68:27 | set_var_pos(...) [B] | main.rs:68:9:68:10 | e1 [B] | provenance | | -| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:39 | -| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:39 | +| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:38 | +| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:38 | | main.rs:69:11:69:12 | e1 [B] | main.rs:71:9:71:23 | ...::B(...) [B] | provenance | | | main.rs:69:11:69:12 | e1 [B] | main.rs:71:9:71:23 | ...::B(...) [B] | provenance | | | main.rs:71:9:71:23 | ...::B(...) [B] | main.rs:71:22:71:22 | i | provenance | | @@ -93,8 +92,8 @@ edges | main.rs:88:14:88:42 | ...::C {...} [C] | main.rs:88:9:88:10 | e1 [C] | provenance | | | main.rs:88:40:88:40 | s | main.rs:88:14:88:42 | ...::C {...} [C] | provenance | | | main.rs:88:40:88:40 | s | main.rs:88:14:88:42 | ...::C {...} [C] | provenance | | -| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:33 | -| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:33 | +| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:32 | +| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:32 | | main.rs:100:9:100:9 | s | main.rs:101:28:101:28 | s | provenance | | | main.rs:100:9:100:9 | s | main.rs:101:28:101:28 | s | provenance | | | main.rs:100:13:100:21 | source(...) | main.rs:100:9:100:9 | s | provenance | | @@ -103,8 +102,8 @@ edges | main.rs:101:9:101:10 | e1 [D] | main.rs:102:11:102:12 | e1 [D] | provenance | | | main.rs:101:14:101:29 | set_var_field(...) [D] | main.rs:101:9:101:10 | e1 [D] | provenance | | | main.rs:101:14:101:29 | set_var_field(...) [D] | main.rs:101:9:101:10 | e1 [D] | provenance | | -| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:38 | -| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:38 | +| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:37 | +| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:37 | | main.rs:102:11:102:12 | e1 [D] | main.rs:104:9:104:37 | ...::D {...} [D] | provenance | | | main.rs:102:11:102:12 | e1 [D] | main.rs:104:9:104:37 | ...::D {...} [D] | provenance | | | main.rs:104:9:104:37 | ...::D {...} [D] | main.rs:104:35:104:35 | i | provenance | | @@ -121,8 +120,8 @@ edges | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | main.rs:121:9:121:17 | my_struct [MyStruct.field1] | provenance | | | main.rs:122:17:122:17 | s | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | provenance | | | main.rs:122:17:122:17 | s | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | provenance | | -| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:31 | -| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:31 | +| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:30 | +| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:30 | | main.rs:142:9:142:9 | s | main.rs:143:38:143:38 | s | provenance | | | main.rs:142:9:142:9 | s | main.rs:143:38:143:38 | s | provenance | | | main.rs:142:13:142:21 | source(...) | main.rs:142:9:142:9 | s | provenance | | @@ -131,16 +130,16 @@ edges | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | provenance | | | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | provenance | | | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | provenance | | -| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:36 | -| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:36 | +| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:35 | +| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:35 | | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | main.rs:145:10:145:25 | my_struct.field2 | provenance | | | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | main.rs:145:10:145:25 | my_struct.field2 | provenance | | | main.rs:154:9:154:9 | s | main.rs:155:29:155:29 | s | provenance | | | main.rs:154:9:154:9 | s | main.rs:155:29:155:29 | s | provenance | | | main.rs:154:13:154:21 | source(...) | main.rs:154:9:154:9 | s | provenance | | | main.rs:154:13:154:21 | source(...) | main.rs:154:9:154:9 | s | provenance | | -| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:29 | -| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:29 | +| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:28 | +| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:28 | | main.rs:155:29:155:29 | s | main.rs:155:28:155:30 | [...] [element] | provenance | | | main.rs:155:29:155:29 | s | main.rs:155:28:155:30 | [...] [element] | provenance | | | main.rs:164:9:164:9 | s | main.rs:165:33:165:33 | s | provenance | | @@ -151,8 +150,8 @@ edges | main.rs:165:9:165:11 | arr [element] | main.rs:166:10:166:12 | arr [element] | provenance | | | main.rs:165:15:165:34 | set_array_element(...) [element] | main.rs:165:9:165:11 | arr [element] | provenance | | | main.rs:165:15:165:34 | set_array_element(...) [element] | main.rs:165:9:165:11 | arr [element] | provenance | | -| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:35 | -| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:35 | +| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:34 | +| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:34 | | main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:22 | | main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:22 | | main.rs:175:9:175:9 | s | main.rs:176:14:176:14 | s | provenance | | @@ -165,8 +164,8 @@ edges | main.rs:176:13:176:18 | TupleExpr [tuple.0] | main.rs:176:9:176:9 | t [tuple.0] | provenance | | | main.rs:176:14:176:14 | s | main.rs:176:13:176:18 | TupleExpr [tuple.0] | provenance | | | main.rs:176:14:176:14 | s | main.rs:176:13:176:18 | TupleExpr [tuple.0] | provenance | | -| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:32 | -| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:32 | +| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:31 | +| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:31 | | main.rs:188:9:188:9 | s | main.rs:189:31:189:31 | s | provenance | | | main.rs:188:9:188:9 | s | main.rs:189:31:189:31 | s | provenance | | | main.rs:188:13:188:22 | source(...) | main.rs:188:9:188:9 | s | provenance | | @@ -175,8 +174,8 @@ edges | main.rs:189:9:189:9 | t [tuple.1] | main.rs:191:10:191:10 | t [tuple.1] | provenance | | | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | main.rs:189:9:189:9 | t [tuple.1] | provenance | | | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | main.rs:189:9:189:9 | t [tuple.1] | provenance | | -| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:37 | -| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:37 | +| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:36 | +| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:36 | | main.rs:191:10:191:10 | t [tuple.1] | main.rs:191:10:191:12 | t.1 | provenance | | | main.rs:191:10:191:10 | t [tuple.1] | main.rs:191:10:191:12 | t.1 | provenance | | | main.rs:203:9:203:9 | s | main.rs:208:11:208:11 | s | provenance | | @@ -227,8 +226,8 @@ edges | main.rs:232:13:232:31 | get_async_number(...) [future] | main.rs:232:13:232:37 | await ... | provenance | | | main.rs:232:13:232:37 | await ... | main.rs:232:9:232:9 | t | provenance | | | main.rs:232:13:232:37 | await ... | main.rs:232:9:232:9 | t | provenance | | -| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:30 | -| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:30 | +| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:29 | +| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:29 | | main.rs:257:9:257:9 | s [D] | main.rs:258:11:258:11 | s [D] | provenance | | | main.rs:257:9:257:9 | s [D] | main.rs:258:11:258:11 | s [D] | provenance | | | main.rs:257:13:257:27 | enum_source(...) | main.rs:257:9:257:9 | s [D] | provenance | Src:MaD:12 | @@ -369,12 +368,6 @@ edges | main.rs:497:9:497:10 | x6 | main.rs:498:10:498:11 | x6 | provenance | | | main.rs:497:14:497:23 | source(...) | main.rs:497:14:497:27 | ... < ... | provenance | MaD:21 | | main.rs:497:14:497:27 | ... < ... | main.rs:497:9:497:10 | x6 | provenance | | -| main.rs:503:9:503:10 | x8 | main.rs:504:10:504:11 | x8 | provenance | | -| main.rs:503:9:503:10 | x8 | main.rs:504:10:504:11 | x8 | provenance | | -| main.rs:503:14:503:44 | ...::flow_through2(...) | main.rs:503:9:503:10 | x8 | provenance | | -| main.rs:503:14:503:44 | ...::flow_through2(...) | main.rs:503:9:503:10 | x8 | provenance | | -| main.rs:503:34:503:43 | source(...) | main.rs:503:14:503:44 | ...::flow_through2(...) | provenance | MaD:26 | -| main.rs:503:34:503:43 | source(...) | main.rs:503:14:503:44 | ...::flow_through2(...) | provenance | MaD:26 | | main.rs:506:9:506:10 | x9 | main.rs:507:10:507:11 | x9 | provenance | | | main.rs:506:9:506:10 | x9 | main.rs:507:10:507:11 | x9 | provenance | | | main.rs:506:14:506:44 | ...::flow_through3(...) | main.rs:506:9:506:10 | x9 | provenance | | @@ -389,10 +382,10 @@ edges | main.rs:522:20:522:28 | source(...) | main.rs:522:20:522:28 | source(...) | provenance | Sink:MaD:4 | | main.rs:524:25:524:33 | source(...) | main.rs:524:25:524:33 | source(...) | provenance | Sink:MaD:5 | | main.rs:524:25:524:33 | source(...) | main.rs:524:25:524:33 | source(...) | provenance | Sink:MaD:5 | -| main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | provenance | MaD:27 | -| main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | provenance | MaD:27 | -| main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | provenance | MaD:28 | -| main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | provenance | MaD:28 | +| main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | provenance | MaD:26 | +| main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | provenance | MaD:26 | +| main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | provenance | MaD:27 | +| main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | provenance | MaD:27 | nodes | main.rs:15:9:15:9 | s | semmle.label | s | | main.rs:15:9:15:9 | s | semmle.label | s | @@ -792,14 +785,6 @@ nodes | main.rs:497:14:497:23 | source(...) | semmle.label | source(...) | | main.rs:497:14:497:27 | ... < ... | semmle.label | ... < ... | | main.rs:498:10:498:11 | x6 | semmle.label | x6 | -| main.rs:503:9:503:10 | x8 | semmle.label | x8 | -| main.rs:503:9:503:10 | x8 | semmle.label | x8 | -| main.rs:503:14:503:44 | ...::flow_through2(...) | semmle.label | ...::flow_through2(...) | -| main.rs:503:14:503:44 | ...::flow_through2(...) | semmle.label | ...::flow_through2(...) | -| main.rs:503:34:503:43 | source(...) | semmle.label | source(...) | -| main.rs:503:34:503:43 | source(...) | semmle.label | source(...) | -| main.rs:504:10:504:11 | x8 | semmle.label | x8 | -| main.rs:504:10:504:11 | x8 | semmle.label | x8 | | main.rs:506:9:506:10 | x9 | semmle.label | x9 | | main.rs:506:9:506:10 | x9 | semmle.label | x9 | | main.rs:506:14:506:44 | ...::flow_through3(...) | semmle.label | ...::flow_through3(...) | @@ -838,6 +823,7 @@ subpaths | main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | main.rs:220:17:220:42 | if ... {...} else {...} | main.rs:221:13:221:23 | apply(...) | | main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | main.rs:220:17:220:42 | if ... {...} else {...} | main.rs:221:13:221:23 | apply(...) | testFailures +| main.rs:504:15:504:34 | //... | Missing result: hasValueFlow=29 | invalidSpecComponent #select | main.rs:16:10:16:20 | identity(...) | main.rs:15:13:15:21 | source(...) | main.rs:16:10:16:20 | identity(...) | $@ | main.rs:15:13:15:21 | source(...) | source(...) | @@ -915,8 +901,6 @@ invalidSpecComponent | main.rs:492:10:492:11 | x4 | main.rs:491:14:491:23 | source(...) | main.rs:492:10:492:11 | x4 | $@ | main.rs:491:14:491:23 | source(...) | source(...) | | main.rs:495:10:495:11 | x5 | main.rs:494:14:494:23 | source(...) | main.rs:495:10:495:11 | x5 | $@ | main.rs:494:14:494:23 | source(...) | source(...) | | main.rs:498:10:498:11 | x6 | main.rs:497:14:497:23 | source(...) | main.rs:498:10:498:11 | x6 | $@ | main.rs:497:14:497:23 | source(...) | source(...) | -| main.rs:504:10:504:11 | x8 | main.rs:503:34:503:43 | source(...) | main.rs:504:10:504:11 | x8 | $@ | main.rs:503:34:503:43 | source(...) | source(...) | -| main.rs:504:10:504:11 | x8 | main.rs:503:34:503:43 | source(...) | main.rs:504:10:504:11 | x8 | $@ | main.rs:503:34:503:43 | source(...) | source(...) | | main.rs:507:10:507:11 | x9 | main.rs:506:34:506:43 | source(...) | main.rs:507:10:507:11 | x9 | $@ | main.rs:506:34:506:43 | source(...) | source(...) | | main.rs:507:10:507:11 | x9 | main.rs:506:34:506:43 | source(...) | main.rs:507:10:507:11 | x9 | $@ | main.rs:506:34:506:43 | source(...) | source(...) | | main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | $@ | main.rs:519:10:519:28 | generated_source(...) | generated_source(...) | diff --git a/rust/ql/test/library-tests/dataflow/models/models.ext.yml b/rust/ql/test/library-tests/dataflow/models/models.ext.yml index 1d5b0a506b7a..e4623b191643 100644 --- a/rust/ql/test/library-tests/dataflow/models/models.ext.yml +++ b/rust/ql/test/library-tests/dataflow/models/models.ext.yml @@ -8,7 +8,7 @@ extensions: - ["main::enum_source_nested", "ReturnValue.Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]", "test-source", "manual"] - ["::source", "ReturnValue.Field[main::MyFieldEnum::C::field_c]", "test-source", "manual"] - ["main::arg_source", "Argument[0]", "test-source", "manual"] - - ["main::MyTrait::test_param_source", "Parameter[0]", "test-source", "manual"] + - ["::test_param_source", "Parameter[0]", "test-source", "manual"] - ["main::source_into_function::pass_source", "Argument[1].Parameter[0]", "test-source", "manual"] - ["main::source_into_function::pass_source_nested", "Argument[1].Parameter[0].Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]", "test-source", "manual"] - ["main::external_file::generated_source", "ReturnValue", "test-source", "dfc-generated"] # not actually generated, but we want to test behaviour of generated models here. @@ -48,7 +48,7 @@ extensions: - ["main::apply", "Argument[0]", "Argument[1].Parameter[0]", "value", "manual"] - ["main::apply", "Argument[1].ReturnValue", "ReturnValue", "value", "manual"] - ["main::get_async_number", "Argument[0]", "ReturnValue.Future", "value", "manual"] - - ["core::cmp::PartialOrd::lt", "Argument[self].Reference", "ReturnValue", "taint", "manual"] + - ["::lt", "Argument[self].Reference", "ReturnValue", "taint", "manual"] # Overwrites the generic trait model for i32 - ["::lt", "Argument[0]", "ReturnValue", "taint", "manual"] - ["main::external_file::generated_summary", "Argument[0]", "ReturnValue", "value", "dfc-generated"] diff --git a/rust/ql/test/library-tests/dataflow/sources/database/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/database/InlineFlow.expected index e59f8893b52e..a59260cd2694 100644 --- a/rust/ql/test/library-tests/dataflow/sources/database/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/database/InlineFlow.expected @@ -1,98 +1,98 @@ models | 1 | Source: ::exec_iter; ReturnValue.Field[core::result::Result::Ok(0)].Element; database | -| 2 | Source: ::get; ReturnValue.Field[core::option::Option::Some(0)]; database | -| 3 | Source: ::get_opt; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; database | -| 4 | Source: ::take; ReturnValue.Field[core::option::Option::Some(0)]; database | -| 5 | Source: ::take_opt; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; database | -| 6 | Source: mysql::conn::queryable::Queryable::query_first; ReturnValue.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; database | -| 7 | Source: mysql::conn::queryable::Queryable::query_fold; Argument[2].Parameter[1]; database | -| 8 | Source: mysql::conn::queryable::Queryable::query_map; Argument[1].Parameter[0]; database | -| 9 | Source: mysql_async::queryable::Queryable::query_fold; Argument[2].Parameter[1]; database | -| 10 | Source: mysql_async::queryable::Queryable::query_map; Argument[1].Parameter[0]; database | -| 11 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 12 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 13 | Summary: core::ops::arith::Add::add; Argument[self,0].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | -| 14 | Summary: core::ops::arith::Add::add; Argument[self,0]; ReturnValue; taint | -| 15 | Summary: mysql::conn::queryable::Queryable::query_fold; Argument[2].ReturnValue; ReturnValue.Field[core::result::Result::Ok(0)]; value | -| 16 | Summary: mysql_async::queryable::Queryable::query_fold; Argument[2].ReturnValue; ReturnValue.Future.Field[core::result::Result::Ok(0)]; value | +| 2 | Source: ::query_first; ReturnValue.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; database | +| 3 | Source: ::query_fold; Argument[2].Parameter[1]; database | +| 4 | Source: ::query_map; Argument[1].Parameter[0]; database | +| 5 | Source: ::query_fold; Argument[2].Parameter[1]; database | +| 6 | Source: ::query_map; Argument[1].Parameter[0]; database | +| 7 | Source: ::get; ReturnValue.Field[core::option::Option::Some(0)]; database | +| 8 | Source: ::get_opt; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; database | +| 9 | Source: ::take; ReturnValue.Field[core::option::Option::Some(0)]; database | +| 10 | Source: ::take_opt; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; database | +| 11 | Summary: ::add; Argument[self,0].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | +| 12 | Summary: ::add; Argument[self,0]; ReturnValue; taint | +| 13 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 14 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 15 | Summary: ::query_fold; Argument[2].ReturnValue; ReturnValue.Field[core::result::Result::Ok(0)]; value | +| 16 | Summary: ::query_fold; Argument[2].ReturnValue; ReturnValue.Future.Field[core::result::Result::Ok(0)]; value | edges | test.rs:18:13:18:14 | v1 | test.rs:19:14:19:15 | v1 | provenance | | -| test.rs:18:24:18:33 | row.get(...) | test.rs:18:24:18:33 | row.get(...) [Some] | provenance | Src:MaD:2 | -| test.rs:18:24:18:33 | row.get(...) [Some] | test.rs:18:24:18:42 | ... .unwrap() | provenance | MaD:11 | +| test.rs:18:24:18:33 | row.get(...) | test.rs:18:24:18:33 | row.get(...) [Some] | provenance | Src:MaD:7 | +| test.rs:18:24:18:33 | row.get(...) [Some] | test.rs:18:24:18:42 | ... .unwrap() | provenance | MaD:13 | | test.rs:18:24:18:42 | ... .unwrap() | test.rs:18:13:18:14 | v1 | provenance | | | test.rs:21:13:21:14 | v2 | test.rs:22:14:22:15 | v2 | provenance | | -| test.rs:21:24:21:37 | row.get_opt(...) | test.rs:21:24:21:37 | row.get_opt(...) [Some, Ok] | provenance | Src:MaD:3 | -| test.rs:21:24:21:37 | row.get_opt(...) [Some, Ok] | test.rs:21:24:21:46 | ... .unwrap() [Ok] | provenance | MaD:11 | -| test.rs:21:24:21:46 | ... .unwrap() [Ok] | test.rs:21:24:21:55 | ... .unwrap() | provenance | MaD:12 | +| test.rs:21:24:21:37 | row.get_opt(...) | test.rs:21:24:21:37 | row.get_opt(...) [Some, Ok] | provenance | Src:MaD:8 | +| test.rs:21:24:21:37 | row.get_opt(...) [Some, Ok] | test.rs:21:24:21:46 | ... .unwrap() [Ok] | provenance | MaD:13 | +| test.rs:21:24:21:46 | ... .unwrap() [Ok] | test.rs:21:24:21:55 | ... .unwrap() | provenance | MaD:14 | | test.rs:21:24:21:55 | ... .unwrap() | test.rs:21:13:21:14 | v2 | provenance | | | test.rs:24:13:24:14 | v3 | test.rs:25:14:25:15 | v3 | provenance | | -| test.rs:24:24:24:34 | row.take(...) | test.rs:24:24:24:34 | row.take(...) [Some] | provenance | Src:MaD:4 | -| test.rs:24:24:24:34 | row.take(...) [Some] | test.rs:24:24:24:43 | ... .unwrap() | provenance | MaD:11 | +| test.rs:24:24:24:34 | row.take(...) | test.rs:24:24:24:34 | row.take(...) [Some] | provenance | Src:MaD:9 | +| test.rs:24:24:24:34 | row.take(...) [Some] | test.rs:24:24:24:43 | ... .unwrap() | provenance | MaD:13 | | test.rs:24:24:24:43 | ... .unwrap() | test.rs:24:13:24:14 | v3 | provenance | | | test.rs:27:13:27:14 | v4 | test.rs:28:14:28:15 | v4 | provenance | | -| test.rs:27:24:27:38 | row.take_opt(...) | test.rs:27:24:27:38 | row.take_opt(...) [Some, Ok] | provenance | Src:MaD:5 | -| test.rs:27:24:27:38 | row.take_opt(...) [Some, Ok] | test.rs:27:24:27:47 | ... .unwrap() [Ok] | provenance | MaD:11 | -| test.rs:27:24:27:47 | ... .unwrap() [Ok] | test.rs:27:24:27:56 | ... .unwrap() | provenance | MaD:12 | +| test.rs:27:24:27:38 | row.take_opt(...) | test.rs:27:24:27:38 | row.take_opt(...) [Some, Ok] | provenance | Src:MaD:10 | +| test.rs:27:24:27:38 | row.take_opt(...) [Some, Ok] | test.rs:27:24:27:47 | ... .unwrap() [Ok] | provenance | MaD:13 | +| test.rs:27:24:27:47 | ... .unwrap() [Ok] | test.rs:27:24:27:56 | ... .unwrap() | provenance | MaD:14 | | test.rs:27:24:27:56 | ... .unwrap() | test.rs:27:13:27:14 | v4 | provenance | | | test.rs:37:13:37:14 | v6 | test.rs:38:14:38:15 | v6 | provenance | | -| test.rs:37:23:37:63 | conn.query_first(...) | test.rs:37:23:37:63 | conn.query_first(...) [Ok, Some] | provenance | Src:MaD:6 | +| test.rs:37:23:37:63 | conn.query_first(...) | test.rs:37:23:37:63 | conn.query_first(...) [Ok, Some] | provenance | Src:MaD:2 | | test.rs:37:23:37:63 | conn.query_first(...) [Ok, Some] | test.rs:37:23:37:64 | TryExpr [Some] | provenance | | -| test.rs:37:23:37:64 | TryExpr [Some] | test.rs:37:23:37:73 | ... .unwrap() | provenance | MaD:11 | +| test.rs:37:23:37:64 | TryExpr [Some] | test.rs:37:23:37:73 | ... .unwrap() | provenance | MaD:13 | | test.rs:37:23:37:73 | ... .unwrap() | test.rs:37:13:37:14 | v6 | provenance | | | test.rs:40:13:40:18 | mut t1 [element] | test.rs:42:20:42:21 | t1 [element] | provenance | | | test.rs:40:22:40:71 | conn.exec_iter(...) | test.rs:40:22:40:71 | conn.exec_iter(...) [Ok, element] | provenance | Src:MaD:1 | | test.rs:40:22:40:71 | conn.exec_iter(...) [Ok, element] | test.rs:40:22:40:72 | TryExpr [element] | provenance | | | test.rs:40:22:40:72 | TryExpr [element] | test.rs:40:13:40:18 | mut t1 [element] | provenance | | -| test.rs:41:14:41:61 | ... .get(...) | test.rs:41:14:41:61 | ... .get(...) [Some] | provenance | Src:MaD:2 | -| test.rs:41:14:41:61 | ... .get(...) [Some] | test.rs:41:14:41:70 | ... .unwrap() | provenance | MaD:11 | +| test.rs:41:14:41:61 | ... .get(...) | test.rs:41:14:41:61 | ... .get(...) [Some] | provenance | Src:MaD:7 | +| test.rs:41:14:41:61 | ... .get(...) [Some] | test.rs:41:14:41:70 | ... .unwrap() | provenance | MaD:13 | | test.rs:42:13:42:15 | row | test.rs:44:22:44:22 | v | provenance | | | test.rs:42:20:42:21 | t1 [element] | test.rs:42:13:42:15 | row | provenance | | -| test.rs:50:13:52:13 | \|...\| ... | test.rs:51:22:51:27 | values | provenance | Src:MaD:8 | -| test.rs:57:13:61:13 | \|...\| ... | test.rs:58:22:58:29 | values.0 | provenance | Src:MaD:8 | -| test.rs:57:13:61:13 | \|...\| ... | test.rs:59:22:59:29 | values.1 | provenance | Src:MaD:8 | -| test.rs:57:13:61:13 | \|...\| ... | test.rs:60:22:60:29 | values.2 | provenance | Src:MaD:8 | +| test.rs:50:13:52:13 | \|...\| ... | test.rs:51:22:51:27 | values | provenance | Src:MaD:4 | +| test.rs:57:13:61:13 | \|...\| ... | test.rs:58:22:58:29 | values.0 | provenance | Src:MaD:4 | +| test.rs:57:13:61:13 | \|...\| ... | test.rs:59:22:59:29 | values.1 | provenance | Src:MaD:4 | +| test.rs:57:13:61:13 | \|...\| ... | test.rs:60:22:60:29 | values.2 | provenance | Src:MaD:4 | | test.rs:64:13:64:17 | total | test.rs:68:14:68:18 | total | provenance | | | test.rs:64:13:64:17 | total [Wrapping] | test.rs:68:14:68:18 | total | provenance | | | test.rs:64:21:67:10 | conn.query_fold(...) [Ok, Wrapping] | test.rs:64:21:67:11 | TryExpr [Wrapping] | provenance | | | test.rs:64:21:67:10 | conn.query_fold(...) [Ok] | test.rs:64:21:67:11 | TryExpr | provenance | | | test.rs:64:21:67:11 | TryExpr | test.rs:64:13:64:17 | total | provenance | | | test.rs:64:21:67:11 | TryExpr [Wrapping] | test.rs:64:13:64:17 | total [Wrapping] | provenance | | -| test.rs:64:65:67:9 | \|...\| ... | test.rs:65:18:65:20 | row | provenance | Src:MaD:7 | -| test.rs:64:65:67:9 | \|...\| ... | test.rs:66:19:66:21 | row | provenance | Src:MaD:7 | +| test.rs:64:65:67:9 | \|...\| ... | test.rs:65:18:65:20 | row | provenance | Src:MaD:3 | +| test.rs:64:65:67:9 | \|...\| ... | test.rs:66:19:66:21 | row | provenance | Src:MaD:3 | | test.rs:64:86:67:9 | { ... } | test.rs:64:21:67:10 | conn.query_fold(...) [Ok] | provenance | MaD:15 | | test.rs:64:86:67:9 | { ... } [Wrapping] | test.rs:64:21:67:10 | conn.query_fold(...) [Ok, Wrapping] | provenance | MaD:15 | | test.rs:66:13:66:21 | ... + ... | test.rs:64:86:67:9 | { ... } | provenance | | | test.rs:66:13:66:21 | ... + ... [Wrapping] | test.rs:64:86:67:9 | { ... } [Wrapping] | provenance | | -| test.rs:66:19:66:21 | row | test.rs:66:13:66:21 | ... + ... | provenance | MaD:14 | -| test.rs:66:19:66:21 | row | test.rs:66:13:66:21 | ... + ... [Wrapping] | provenance | MaD:13 | -| test.rs:70:72:78:9 | \|...\| ... | test.rs:71:17:71:18 | id | provenance | Src:MaD:7 | -| test.rs:70:72:78:9 | \|...\| ... | test.rs:72:17:72:20 | name | provenance | Src:MaD:7 | -| test.rs:70:72:78:9 | \|...\| ... | test.rs:73:17:73:19 | age | provenance | Src:MaD:7 | +| test.rs:66:19:66:21 | row | test.rs:66:13:66:21 | ... + ... | provenance | MaD:12 | +| test.rs:66:19:66:21 | row | test.rs:66:13:66:21 | ... + ... [Wrapping] | provenance | MaD:11 | +| test.rs:70:72:78:9 | \|...\| ... | test.rs:71:17:71:18 | id | provenance | Src:MaD:3 | +| test.rs:70:72:78:9 | \|...\| ... | test.rs:72:17:72:20 | name | provenance | Src:MaD:3 | +| test.rs:70:72:78:9 | \|...\| ... | test.rs:73:17:73:19 | age | provenance | Src:MaD:3 | | test.rs:71:17:71:18 | id | test.rs:74:18:74:19 | id | provenance | | | test.rs:72:17:72:20 | name | test.rs:75:18:75:21 | name | provenance | | | test.rs:73:17:73:19 | age | test.rs:76:18:76:20 | age | provenance | | | test.rs:105:13:105:14 | v1 | test.rs:106:14:106:15 | v1 | provenance | | -| test.rs:105:24:105:33 | row.get(...) | test.rs:105:24:105:33 | row.get(...) [Some] | provenance | Src:MaD:2 | -| test.rs:105:24:105:33 | row.get(...) [Some] | test.rs:105:24:105:42 | ... .unwrap() | provenance | MaD:11 | +| test.rs:105:24:105:33 | row.get(...) | test.rs:105:24:105:33 | row.get(...) [Some] | provenance | Src:MaD:7 | +| test.rs:105:24:105:33 | row.get(...) [Some] | test.rs:105:24:105:42 | ... .unwrap() | provenance | MaD:13 | | test.rs:105:24:105:42 | ... .unwrap() | test.rs:105:13:105:14 | v1 | provenance | | | test.rs:108:13:108:14 | v2 | test.rs:109:14:109:15 | v2 | provenance | | -| test.rs:108:24:108:37 | row.get_opt(...) | test.rs:108:24:108:37 | row.get_opt(...) [Some, Ok] | provenance | Src:MaD:3 | -| test.rs:108:24:108:37 | row.get_opt(...) [Some, Ok] | test.rs:108:24:108:46 | ... .unwrap() [Ok] | provenance | MaD:11 | -| test.rs:108:24:108:46 | ... .unwrap() [Ok] | test.rs:108:24:108:55 | ... .unwrap() | provenance | MaD:12 | +| test.rs:108:24:108:37 | row.get_opt(...) | test.rs:108:24:108:37 | row.get_opt(...) [Some, Ok] | provenance | Src:MaD:8 | +| test.rs:108:24:108:37 | row.get_opt(...) [Some, Ok] | test.rs:108:24:108:46 | ... .unwrap() [Ok] | provenance | MaD:13 | +| test.rs:108:24:108:46 | ... .unwrap() [Ok] | test.rs:108:24:108:55 | ... .unwrap() | provenance | MaD:14 | | test.rs:108:24:108:55 | ... .unwrap() | test.rs:108:13:108:14 | v2 | provenance | | | test.rs:111:13:111:14 | v3 | test.rs:112:14:112:15 | v3 | provenance | | -| test.rs:111:24:111:34 | row.take(...) | test.rs:111:24:111:34 | row.take(...) [Some] | provenance | Src:MaD:4 | -| test.rs:111:24:111:34 | row.take(...) [Some] | test.rs:111:24:111:43 | ... .unwrap() | provenance | MaD:11 | +| test.rs:111:24:111:34 | row.take(...) | test.rs:111:24:111:34 | row.take(...) [Some] | provenance | Src:MaD:9 | +| test.rs:111:24:111:34 | row.take(...) [Some] | test.rs:111:24:111:43 | ... .unwrap() | provenance | MaD:13 | | test.rs:111:24:111:43 | ... .unwrap() | test.rs:111:13:111:14 | v3 | provenance | | | test.rs:114:13:114:14 | v4 | test.rs:115:14:115:15 | v4 | provenance | | -| test.rs:114:24:114:38 | row.take_opt(...) | test.rs:114:24:114:38 | row.take_opt(...) [Some, Ok] | provenance | Src:MaD:5 | -| test.rs:114:24:114:38 | row.take_opt(...) [Some, Ok] | test.rs:114:24:114:47 | ... .unwrap() [Ok] | provenance | MaD:11 | -| test.rs:114:24:114:47 | ... .unwrap() [Ok] | test.rs:114:24:114:56 | ... .unwrap() | provenance | MaD:12 | +| test.rs:114:24:114:38 | row.take_opt(...) | test.rs:114:24:114:38 | row.take_opt(...) [Some, Ok] | provenance | Src:MaD:10 | +| test.rs:114:24:114:38 | row.take_opt(...) [Some, Ok] | test.rs:114:24:114:47 | ... .unwrap() [Ok] | provenance | MaD:13 | +| test.rs:114:24:114:47 | ... .unwrap() [Ok] | test.rs:114:24:114:56 | ... .unwrap() | provenance | MaD:14 | | test.rs:114:24:114:56 | ... .unwrap() | test.rs:114:13:114:14 | v4 | provenance | | -| test.rs:137:13:139:13 | \|...\| ... | test.rs:138:22:138:27 | values | provenance | Src:MaD:10 | -| test.rs:144:13:148:13 | \|...\| ... | test.rs:145:22:145:29 | values.0 | provenance | Src:MaD:10 | -| test.rs:144:13:148:13 | \|...\| ... | test.rs:146:22:146:29 | values.1 | provenance | Src:MaD:10 | -| test.rs:144:13:148:13 | \|...\| ... | test.rs:147:22:147:29 | values.2 | provenance | Src:MaD:10 | +| test.rs:137:13:139:13 | \|...\| ... | test.rs:138:22:138:27 | values | provenance | Src:MaD:6 | +| test.rs:144:13:148:13 | \|...\| ... | test.rs:145:22:145:29 | values.0 | provenance | Src:MaD:6 | +| test.rs:144:13:148:13 | \|...\| ... | test.rs:146:22:146:29 | values.1 | provenance | Src:MaD:6 | +| test.rs:144:13:148:13 | \|...\| ... | test.rs:147:22:147:29 | values.2 | provenance | Src:MaD:6 | | test.rs:151:13:151:17 | total | test.rs:155:14:155:18 | total | provenance | | | test.rs:151:13:151:17 | total [Wrapping] | test.rs:155:14:155:18 | total | provenance | | | test.rs:151:21:154:10 | conn.query_fold(...) [future, Ok, Wrapping] | test.rs:151:21:154:16 | await ... [Ok, Wrapping] | provenance | | @@ -101,17 +101,17 @@ edges | test.rs:151:21:154:16 | await ... [Ok] | test.rs:151:21:154:17 | TryExpr | provenance | | | test.rs:151:21:154:17 | TryExpr | test.rs:151:13:151:17 | total | provenance | | | test.rs:151:21:154:17 | TryExpr [Wrapping] | test.rs:151:13:151:17 | total [Wrapping] | provenance | | -| test.rs:151:65:154:9 | \|...\| ... | test.rs:152:18:152:20 | row | provenance | Src:MaD:9 | -| test.rs:151:65:154:9 | \|...\| ... | test.rs:153:19:153:21 | row | provenance | Src:MaD:9 | +| test.rs:151:65:154:9 | \|...\| ... | test.rs:152:18:152:20 | row | provenance | Src:MaD:5 | +| test.rs:151:65:154:9 | \|...\| ... | test.rs:153:19:153:21 | row | provenance | Src:MaD:5 | | test.rs:151:86:154:9 | { ... } | test.rs:151:21:154:10 | conn.query_fold(...) [future, Ok] | provenance | MaD:16 | | test.rs:151:86:154:9 | { ... } [Wrapping] | test.rs:151:21:154:10 | conn.query_fold(...) [future, Ok, Wrapping] | provenance | MaD:16 | | test.rs:153:13:153:21 | ... + ... | test.rs:151:86:154:9 | { ... } | provenance | | | test.rs:153:13:153:21 | ... + ... [Wrapping] | test.rs:151:86:154:9 | { ... } [Wrapping] | provenance | | -| test.rs:153:19:153:21 | row | test.rs:153:13:153:21 | ... + ... | provenance | MaD:14 | -| test.rs:153:19:153:21 | row | test.rs:153:13:153:21 | ... + ... [Wrapping] | provenance | MaD:13 | -| test.rs:157:72:165:9 | \|...\| ... | test.rs:158:17:158:18 | id | provenance | Src:MaD:9 | -| test.rs:157:72:165:9 | \|...\| ... | test.rs:159:17:159:20 | name | provenance | Src:MaD:9 | -| test.rs:157:72:165:9 | \|...\| ... | test.rs:160:17:160:19 | age | provenance | Src:MaD:9 | +| test.rs:153:19:153:21 | row | test.rs:153:13:153:21 | ... + ... | provenance | MaD:12 | +| test.rs:153:19:153:21 | row | test.rs:153:13:153:21 | ... + ... [Wrapping] | provenance | MaD:11 | +| test.rs:157:72:165:9 | \|...\| ... | test.rs:158:17:158:18 | id | provenance | Src:MaD:5 | +| test.rs:157:72:165:9 | \|...\| ... | test.rs:159:17:159:20 | name | provenance | Src:MaD:5 | +| test.rs:157:72:165:9 | \|...\| ... | test.rs:160:17:160:19 | age | provenance | Src:MaD:5 | | test.rs:158:17:158:18 | id | test.rs:161:18:161:19 | id | provenance | | | test.rs:159:17:159:20 | name | test.rs:162:18:162:21 | name | provenance | | | test.rs:160:17:160:19 | age | test.rs:163:18:163:20 | age | provenance | | diff --git a/rust/ql/test/library-tests/dataflow/sources/env/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/env/InlineFlow.expected index 5f09299d8536..1cfff2c68405 100644 --- a/rust/ql/test/library-tests/dataflow/sources/env/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/env/InlineFlow.expected @@ -9,23 +9,23 @@ models | 8 | Source: std::env::vars; ReturnValue.Element; environment | | 9 | Source: std::env::vars_os; ReturnValue.Element; environment | | 10 | Summary: ::deref; Argument[self]; ReturnValue; value | -| 11 | Summary: ::expect; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 12 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 13 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 14 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 15 | Summary: core::iter::traits::iterator::Iterator::collect; Argument[self].Element; ReturnValue.Element; value | -| 16 | Summary: core::iter::traits::iterator::Iterator::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 17 | Summary: core::ops::index::Index::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 11 | Summary: ::collect; Argument[self].Element; ReturnValue.Element; value | +| 12 | Summary: ::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 13 | Summary: ::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 14 | Summary: ::expect; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 15 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 16 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 17 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | edges | test.rs:6:10:6:30 | ...::var(...) | test.rs:6:10:6:30 | ...::var(...) | provenance | Src:MaD:6 | | test.rs:7:10:7:33 | ...::var_os(...) | test.rs:7:10:7:33 | ...::var_os(...) | provenance | Src:MaD:7 | | test.rs:9:9:9:12 | var1 | test.rs:12:10:12:13 | var1 | provenance | | | test.rs:9:16:9:36 | ...::var(...) | test.rs:9:16:9:36 | ...::var(...) [Ok] | provenance | Src:MaD:6 | -| test.rs:9:16:9:36 | ...::var(...) [Ok] | test.rs:9:16:9:59 | ... .expect(...) | provenance | MaD:13 | +| test.rs:9:16:9:36 | ...::var(...) [Ok] | test.rs:9:16:9:59 | ... .expect(...) | provenance | MaD:16 | | test.rs:9:16:9:59 | ... .expect(...) | test.rs:9:9:9:12 | var1 | provenance | | | test.rs:10:9:10:12 | var2 | test.rs:13:10:13:13 | var2 | provenance | | | test.rs:10:16:10:39 | ...::var_os(...) | test.rs:10:16:10:39 | ...::var_os(...) [Some] | provenance | Src:MaD:7 | -| test.rs:10:16:10:39 | ...::var_os(...) [Some] | test.rs:10:16:10:48 | ... .unwrap() | provenance | MaD:12 | +| test.rs:10:16:10:39 | ...::var_os(...) [Some] | test.rs:10:16:10:48 | ... .unwrap() | provenance | MaD:15 | | test.rs:10:16:10:48 | ... .unwrap() | test.rs:10:9:10:12 | var2 | provenance | | | test.rs:15:9:15:20 | TuplePat | test.rs:16:14:16:16 | key | provenance | | | test.rs:15:9:15:20 | TuplePat | test.rs:17:14:17:18 | value | provenance | | @@ -38,32 +38,32 @@ edges | test.rs:27:9:27:12 | args [element] | test.rs:28:20:28:23 | args [element] | provenance | | | test.rs:27:9:27:12 | args [element] | test.rs:29:17:29:20 | args [element] | provenance | | | test.rs:27:29:27:44 | ...::args(...) | test.rs:27:29:27:44 | ...::args(...) [element] | provenance | Src:MaD:1 | -| test.rs:27:29:27:44 | ...::args(...) [element] | test.rs:27:29:27:54 | ... .collect() [element] | provenance | MaD:15 | +| test.rs:27:29:27:44 | ...::args(...) [element] | test.rs:27:29:27:54 | ... .collect() [element] | provenance | MaD:11 | | test.rs:27:29:27:54 | ... .collect() [element] | test.rs:27:9:27:12 | args [element] | provenance | | | test.rs:28:9:28:15 | my_path [&ref] | test.rs:34:10:34:16 | my_path | provenance | | | test.rs:28:19:28:26 | &... [&ref] | test.rs:28:9:28:15 | my_path [&ref] | provenance | | -| test.rs:28:20:28:23 | args [element] | test.rs:28:20:28:26 | args[0] | provenance | MaD:17 | +| test.rs:28:20:28:23 | args [element] | test.rs:28:20:28:26 | args[0] | provenance | MaD:13 | | test.rs:28:20:28:26 | args[0] | test.rs:28:19:28:26 | &... [&ref] | provenance | | | test.rs:29:9:29:12 | arg1 [&ref] | test.rs:35:10:35:13 | arg1 | provenance | | | test.rs:29:16:29:23 | &... [&ref] | test.rs:29:9:29:12 | arg1 [&ref] | provenance | | -| test.rs:29:17:29:20 | args [element] | test.rs:29:17:29:23 | args[1] | provenance | MaD:17 | +| test.rs:29:17:29:20 | args [element] | test.rs:29:17:29:23 | args[1] | provenance | MaD:13 | | test.rs:29:17:29:23 | args[1] | test.rs:29:16:29:23 | &... [&ref] | provenance | | | test.rs:30:9:30:12 | arg2 | test.rs:36:10:36:13 | arg2 | provenance | | | test.rs:30:16:30:31 | ...::args(...) | test.rs:30:16:30:31 | ...::args(...) [element] | provenance | Src:MaD:1 | -| test.rs:30:16:30:31 | ...::args(...) [element] | test.rs:30:16:30:38 | ... .nth(...) [Some] | provenance | MaD:16 | -| test.rs:30:16:30:38 | ... .nth(...) [Some] | test.rs:30:16:30:47 | ... .unwrap() | provenance | MaD:12 | +| test.rs:30:16:30:31 | ...::args(...) [element] | test.rs:30:16:30:38 | ... .nth(...) [Some] | provenance | MaD:12 | +| test.rs:30:16:30:38 | ... .nth(...) [Some] | test.rs:30:16:30:47 | ... .unwrap() | provenance | MaD:15 | | test.rs:30:16:30:47 | ... .unwrap() | test.rs:30:9:30:12 | arg2 | provenance | | | test.rs:31:9:31:12 | arg3 | test.rs:37:10:37:13 | arg3 | provenance | | | test.rs:31:16:31:34 | ...::args_os(...) | test.rs:31:16:31:34 | ...::args_os(...) [element] | provenance | Src:MaD:2 | -| test.rs:31:16:31:34 | ...::args_os(...) [element] | test.rs:31:16:31:41 | ... .nth(...) [Some] | provenance | MaD:16 | -| test.rs:31:16:31:41 | ... .nth(...) [Some] | test.rs:31:16:31:50 | ... .unwrap() | provenance | MaD:12 | +| test.rs:31:16:31:34 | ...::args_os(...) [element] | test.rs:31:16:31:41 | ... .nth(...) [Some] | provenance | MaD:12 | +| test.rs:31:16:31:41 | ... .nth(...) [Some] | test.rs:31:16:31:50 | ... .unwrap() | provenance | MaD:15 | | test.rs:31:16:31:50 | ... .unwrap() | test.rs:31:9:31:12 | arg3 | provenance | | | test.rs:32:9:32:12 | arg4 | test.rs:38:10:38:13 | arg4 | provenance | | | test.rs:32:16:32:31 | ...::args(...) | test.rs:32:16:32:31 | ...::args(...) [element] | provenance | Src:MaD:1 | -| test.rs:32:16:32:31 | ...::args(...) [element] | test.rs:32:16:32:38 | ... .nth(...) [Some] | provenance | MaD:16 | -| test.rs:32:16:32:38 | ... .nth(...) [Some] | test.rs:32:16:32:47 | ... .unwrap() | provenance | MaD:12 | +| test.rs:32:16:32:31 | ...::args(...) [element] | test.rs:32:16:32:38 | ... .nth(...) [Some] | provenance | MaD:12 | +| test.rs:32:16:32:38 | ... .nth(...) [Some] | test.rs:32:16:32:47 | ... .unwrap() | provenance | MaD:15 | | test.rs:32:16:32:47 | ... .unwrap() | test.rs:32:16:32:64 | ... .parse() [Ok] | provenance | MaD:10 | -| test.rs:32:16:32:64 | ... .parse() [Ok] | test.rs:32:16:32:73 | ... .unwrap() | provenance | MaD:14 | +| test.rs:32:16:32:64 | ... .parse() [Ok] | test.rs:32:16:32:73 | ... .unwrap() | provenance | MaD:17 | | test.rs:32:16:32:73 | ... .unwrap() | test.rs:32:9:32:12 | arg4 | provenance | | | test.rs:40:9:40:11 | arg | test.rs:41:14:41:16 | arg | provenance | | | test.rs:40:16:40:31 | ...::args(...) | test.rs:40:16:40:31 | ...::args(...) [element] | provenance | Src:MaD:1 | @@ -73,15 +73,15 @@ edges | test.rs:44:16:44:34 | ...::args_os(...) [element] | test.rs:44:9:44:11 | arg | provenance | | | test.rs:50:9:50:11 | dir | test.rs:54:10:54:12 | dir | provenance | | | test.rs:50:15:50:37 | ...::current_dir(...) | test.rs:50:15:50:37 | ...::current_dir(...) [Ok] | provenance | Src:MaD:3 | -| test.rs:50:15:50:37 | ...::current_dir(...) [Ok] | test.rs:50:15:50:54 | ... .expect(...) | provenance | MaD:13 | +| test.rs:50:15:50:37 | ...::current_dir(...) [Ok] | test.rs:50:15:50:54 | ... .expect(...) | provenance | MaD:16 | | test.rs:50:15:50:54 | ... .expect(...) | test.rs:50:9:50:11 | dir | provenance | | | test.rs:51:9:51:11 | exe | test.rs:55:10:55:12 | exe | provenance | | | test.rs:51:15:51:37 | ...::current_exe(...) | test.rs:51:15:51:37 | ...::current_exe(...) [Ok] | provenance | Src:MaD:4 | -| test.rs:51:15:51:37 | ...::current_exe(...) [Ok] | test.rs:51:15:51:54 | ... .expect(...) | provenance | MaD:13 | +| test.rs:51:15:51:37 | ...::current_exe(...) [Ok] | test.rs:51:15:51:54 | ... .expect(...) | provenance | MaD:16 | | test.rs:51:15:51:54 | ... .expect(...) | test.rs:51:9:51:11 | exe | provenance | | | test.rs:52:9:52:12 | home | test.rs:56:10:56:13 | home | provenance | | | test.rs:52:16:52:35 | ...::home_dir(...) | test.rs:52:16:52:35 | ...::home_dir(...) [Some] | provenance | Src:MaD:5 | -| test.rs:52:16:52:35 | ...::home_dir(...) [Some] | test.rs:52:16:52:52 | ... .expect(...) | provenance | MaD:11 | +| test.rs:52:16:52:35 | ...::home_dir(...) [Some] | test.rs:52:16:52:52 | ... .expect(...) | provenance | MaD:14 | | test.rs:52:16:52:52 | ... .expect(...) | test.rs:52:9:52:12 | home | provenance | | nodes | test.rs:6:10:6:30 | ...::var(...) | semmle.label | ...::var(...) | diff --git a/rust/ql/test/library-tests/dataflow/sources/file/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/file/InlineFlow.expected index 77cebe65dd52..03e1db8d327c 100644 --- a/rust/ql/test/library-tests/dataflow/sources/file/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/file/InlineFlow.expected @@ -16,35 +16,35 @@ models | 15 | Source: tokio::fs::read_link::read_link; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | | 16 | Source: tokio::fs::read_to_string::read_to_string; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | | 17 | Summary: ::to_mut; Argument[self].Reference.Field[alloc::borrow::Cow::Owned(0)]; ReturnValue.Reference; value | -| 18 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 19 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 20 | Summary: ::deref; Argument[self].Reference; ReturnValue.Reference; taint | -| 21 | Summary: ::into_string; Argument[self].Field[std::ffi::os_str::OsString::inner].Field[std::sys::os_str::bytes::Buf::inner]; ReturnValue.Field[core::result::Result::Ok(0)].Field[alloc::string::String::vec]; value | -| 22 | Summary: ::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | -| 23 | Summary: ::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | -| 24 | Summary: ::from; Argument[0]; ReturnValue.Field[std::path::PathBuf::inner]; value | -| 25 | Summary: ::deref; Argument[self].Reference.Field[std::path::PathBuf::inner]; ReturnValue.Reference; value | -| 26 | Summary: ::as_path; Argument[self].Reference; ReturnValue.Reference; value | -| 27 | Summary: ::into_boxed_path; Argument[self]; ReturnValue.Field[alloc::boxed::Box(0)]; taint | -| 28 | Summary: ::into_os_string; Argument[self].Field[std::path::PathBuf::inner]; ReturnValue; value | -| 29 | Summary: async_std::io::read::ReadExt::read; Argument[self].Reference; Argument[0].Reference; taint | -| 30 | Summary: core::clone::Clone::clone; Argument[self].Reference; ReturnValue; value | -| 31 | Summary: std::io::Read::bytes; Argument[self]; ReturnValue; taint | -| 32 | Summary: std::io::Read::chain; Argument[0]; ReturnValue; taint | -| 33 | Summary: std::io::Read::chain; Argument[self]; ReturnValue; taint | -| 34 | Summary: std::io::Read::read; Argument[self].Reference; Argument[0].Reference; taint | -| 35 | Summary: std::io::Read::read_exact; Argument[self].Reference; Argument[0].Reference; taint | -| 36 | Summary: std::io::Read::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | -| 37 | Summary: std::io::Read::take; Argument[self]; ReturnValue; taint | -| 38 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read; Argument[self].Reference; Argument[0].Reference; taint | -| 39 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_buf; Argument[self].Reference; Argument[0].Reference; taint | -| 40 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_exact; Argument[self].Reference; Argument[0].Reference; taint | -| 41 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_f32; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 42 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_i16; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 43 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_i64_le; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 44 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | -| 45 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | -| 46 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_u8; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 18 | Summary: ::read; Argument[self].Reference; Argument[0].Reference; taint | +| 19 | Summary: ::clone; Argument[self].Reference; ReturnValue; value | +| 20 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 21 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 22 | Summary: ::deref; Argument[self].Reference; ReturnValue.Reference; taint | +| 23 | Summary: ::into_string; Argument[self].Field[std::ffi::os_str::OsString::inner].Field[std::sys::os_str::bytes::Buf::inner]; ReturnValue.Field[core::result::Result::Ok(0)].Field[alloc::string::String::vec]; value | +| 24 | Summary: ::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | +| 25 | Summary: ::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | +| 26 | Summary: ::bytes; Argument[self]; ReturnValue; taint | +| 27 | Summary: ::chain; Argument[0]; ReturnValue; taint | +| 28 | Summary: ::chain; Argument[self]; ReturnValue; taint | +| 29 | Summary: ::read; Argument[self].Reference; Argument[0].Reference; taint | +| 30 | Summary: ::read_exact; Argument[self].Reference; Argument[0].Reference; taint | +| 31 | Summary: ::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | +| 32 | Summary: ::take; Argument[self]; ReturnValue; taint | +| 33 | Summary: ::from; Argument[0]; ReturnValue.Field[std::path::PathBuf::inner]; value | +| 34 | Summary: ::deref; Argument[self].Reference.Field[std::path::PathBuf::inner]; ReturnValue.Reference; value | +| 35 | Summary: ::as_path; Argument[self].Reference; ReturnValue.Reference; value | +| 36 | Summary: ::into_boxed_path; Argument[self]; ReturnValue.Field[alloc::boxed::Box(0)]; taint | +| 37 | Summary: ::into_os_string; Argument[self].Field[std::path::PathBuf::inner]; ReturnValue; value | +| 38 | Summary: ::read; Argument[self].Reference; Argument[0].Reference; taint | +| 39 | Summary: ::read_buf; Argument[self].Reference; Argument[0].Reference; taint | +| 40 | Summary: ::read_exact; Argument[self].Reference; Argument[0].Reference; taint | +| 41 | Summary: ::read_f32; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 42 | Summary: ::read_i16; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 43 | Summary: ::read_i64_le; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 44 | Summary: ::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | +| 45 | Summary: ::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | +| 46 | Summary: ::read_u8; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | edges | test.rs:12:13:12:18 | buffer | test.rs:13:14:13:19 | buffer | provenance | | | test.rs:12:31:12:55 | ...::read(...) | test.rs:12:31:12:55 | ...::read(...) [Ok] | provenance | Src:MaD:11 | @@ -71,26 +71,26 @@ edges | test.rs:30:13:30:16 | path | test.rs:41:14:41:17 | path | provenance | | | test.rs:30:13:30:16 | path | test.rs:42:14:42:17 | path | provenance | | | test.rs:30:20:30:27 | e.path() | test.rs:30:13:30:16 | path | provenance | Src:MaD:4 | -| test.rs:31:14:31:17 | path | test.rs:31:14:31:25 | path.clone() | provenance | MaD:30 | -| test.rs:32:14:32:17 | path | test.rs:32:14:32:25 | path.clone() | provenance | MaD:30 | -| test.rs:32:14:32:25 | path.clone() | test.rs:32:14:32:35 | ... .as_path() | provenance | MaD:26 | -| test.rs:33:14:33:17 | path | test.rs:33:14:33:25 | path.clone() | provenance | MaD:30 | -| test.rs:33:14:33:25 | path.clone() | test.rs:33:14:33:42 | ... .into_os_string() | provenance | MaD:28 | -| test.rs:34:39:34:42 | path | test.rs:34:39:34:50 | path.clone() | provenance | MaD:30 | -| test.rs:34:39:34:50 | path.clone() | test.rs:34:39:34:68 | ... .into_boxed_path() [Box(0)] | provenance | MaD:27 | -| test.rs:34:39:34:68 | ... .into_boxed_path() [Box(0)] | test.rs:34:14:34:69 | ...::from(...) | provenance | MaD:24 | -| test.rs:35:14:35:17 | path | test.rs:35:14:35:25 | path.clone() | provenance | MaD:30 | -| test.rs:35:14:35:25 | path.clone() | test.rs:35:14:35:37 | ... .as_os_str() | provenance | MaD:25 | -| test.rs:36:14:36:17 | path | test.rs:36:14:36:25 | path.clone() | provenance | MaD:30 | -| test.rs:36:14:36:25 | path.clone() | test.rs:36:14:36:41 | ... .as_mut_os_str() | provenance | MaD:25 | -| test.rs:37:14:37:17 | path | test.rs:37:14:37:26 | path.to_str() | provenance | MaD:25 | -| test.rs:38:14:38:17 | path | test.rs:38:14:38:31 | path.to_path_buf() | provenance | MaD:25 | -| test.rs:39:14:39:17 | path | test.rs:39:14:39:29 | path.file_name() [Some, &ref] | provenance | MaD:25 | -| test.rs:39:14:39:29 | path.file_name() [Some, &ref] | test.rs:39:14:39:38 | ... .unwrap() | provenance | MaD:18 | -| test.rs:40:14:40:17 | path | test.rs:40:14:40:29 | path.extension() [Some, &ref] | provenance | MaD:25 | -| test.rs:40:14:40:29 | path.extension() [Some, &ref] | test.rs:40:14:40:38 | ... .unwrap() | provenance | MaD:18 | -| test.rs:41:14:41:17 | path | test.rs:41:14:41:32 | path.canonicalize() [Ok] | provenance | MaD:25 | -| test.rs:41:14:41:32 | path.canonicalize() [Ok] | test.rs:41:14:41:41 | ... .unwrap() | provenance | MaD:19 | +| test.rs:31:14:31:17 | path | test.rs:31:14:31:25 | path.clone() | provenance | MaD:19 | +| test.rs:32:14:32:17 | path | test.rs:32:14:32:25 | path.clone() | provenance | MaD:19 | +| test.rs:32:14:32:25 | path.clone() | test.rs:32:14:32:35 | ... .as_path() | provenance | MaD:35 | +| test.rs:33:14:33:17 | path | test.rs:33:14:33:25 | path.clone() | provenance | MaD:19 | +| test.rs:33:14:33:25 | path.clone() | test.rs:33:14:33:42 | ... .into_os_string() | provenance | MaD:37 | +| test.rs:34:39:34:42 | path | test.rs:34:39:34:50 | path.clone() | provenance | MaD:19 | +| test.rs:34:39:34:50 | path.clone() | test.rs:34:39:34:68 | ... .into_boxed_path() [Box(0)] | provenance | MaD:36 | +| test.rs:34:39:34:68 | ... .into_boxed_path() [Box(0)] | test.rs:34:14:34:69 | ...::from(...) | provenance | MaD:33 | +| test.rs:35:14:35:17 | path | test.rs:35:14:35:25 | path.clone() | provenance | MaD:19 | +| test.rs:35:14:35:25 | path.clone() | test.rs:35:14:35:37 | ... .as_os_str() | provenance | MaD:34 | +| test.rs:36:14:36:17 | path | test.rs:36:14:36:25 | path.clone() | provenance | MaD:19 | +| test.rs:36:14:36:25 | path.clone() | test.rs:36:14:36:41 | ... .as_mut_os_str() | provenance | MaD:34 | +| test.rs:37:14:37:17 | path | test.rs:37:14:37:26 | path.to_str() | provenance | MaD:34 | +| test.rs:38:14:38:17 | path | test.rs:38:14:38:31 | path.to_path_buf() | provenance | MaD:34 | +| test.rs:39:14:39:17 | path | test.rs:39:14:39:29 | path.file_name() [Some, &ref] | provenance | MaD:34 | +| test.rs:39:14:39:29 | path.file_name() [Some, &ref] | test.rs:39:14:39:38 | ... .unwrap() | provenance | MaD:20 | +| test.rs:40:14:40:17 | path | test.rs:40:14:40:29 | path.extension() [Some, &ref] | provenance | MaD:34 | +| test.rs:40:14:40:29 | path.extension() [Some, &ref] | test.rs:40:14:40:38 | ... .unwrap() | provenance | MaD:20 | +| test.rs:41:14:41:17 | path | test.rs:41:14:41:32 | path.canonicalize() [Ok] | provenance | MaD:34 | +| test.rs:41:14:41:32 | path.canonicalize() [Ok] | test.rs:41:14:41:41 | ... .unwrap() | provenance | MaD:21 | | test.rs:44:13:44:21 | file_name | test.rs:45:14:45:22 | file_name | provenance | | | test.rs:44:13:44:21 | file_name | test.rs:46:14:46:22 | file_name | provenance | | | test.rs:44:13:44:21 | file_name | test.rs:47:14:47:22 | file_name | provenance | | @@ -98,16 +98,16 @@ edges | test.rs:44:13:44:21 | file_name | test.rs:49:14:49:22 | file_name | provenance | | | test.rs:44:13:44:21 | file_name | test.rs:50:14:50:22 | file_name | provenance | | | test.rs:44:25:44:37 | e.file_name() | test.rs:44:13:44:21 | file_name | provenance | Src:MaD:3 | -| test.rs:45:14:45:22 | file_name | test.rs:45:14:45:30 | file_name.clone() | provenance | MaD:30 | -| test.rs:46:14:46:22 | file_name | test.rs:46:14:46:30 | file_name.clone() | provenance | MaD:30 | -| test.rs:46:14:46:30 | file_name.clone() | test.rs:46:14:46:44 | ... .into_string() [Ok, String] | provenance | MaD:21 | -| test.rs:46:14:46:44 | ... .into_string() [Ok, String] | test.rs:46:14:46:53 | ... .unwrap() | provenance | MaD:19 | -| test.rs:47:14:47:22 | file_name | test.rs:47:14:47:31 | file_name.to_str() [Some, &ref] | provenance | MaD:20 | -| test.rs:47:14:47:31 | file_name.to_str() [Some, &ref] | test.rs:47:14:47:40 | ... .unwrap() | provenance | MaD:18 | -| test.rs:48:14:48:22 | file_name | test.rs:48:14:48:40 | file_name.to_string_lossy() [Owned] | provenance | MaD:20 | +| test.rs:45:14:45:22 | file_name | test.rs:45:14:45:30 | file_name.clone() | provenance | MaD:19 | +| test.rs:46:14:46:22 | file_name | test.rs:46:14:46:30 | file_name.clone() | provenance | MaD:19 | +| test.rs:46:14:46:30 | file_name.clone() | test.rs:46:14:46:44 | ... .into_string() [Ok, String] | provenance | MaD:23 | +| test.rs:46:14:46:44 | ... .into_string() [Ok, String] | test.rs:46:14:46:53 | ... .unwrap() | provenance | MaD:21 | +| test.rs:47:14:47:22 | file_name | test.rs:47:14:47:31 | file_name.to_str() [Some, &ref] | provenance | MaD:22 | +| test.rs:47:14:47:31 | file_name.to_str() [Some, &ref] | test.rs:47:14:47:40 | ... .unwrap() | provenance | MaD:20 | +| test.rs:48:14:48:22 | file_name | test.rs:48:14:48:40 | file_name.to_string_lossy() [Owned] | provenance | MaD:22 | | test.rs:48:14:48:40 | file_name.to_string_lossy() [Owned] | test.rs:48:14:48:49 | ... .to_mut() | provenance | MaD:17 | -| test.rs:49:14:49:22 | file_name | test.rs:49:14:49:30 | file_name.clone() | provenance | MaD:30 | -| test.rs:49:14:49:30 | file_name.clone() | test.rs:49:14:49:49 | ... .as_encoded_bytes() | provenance | MaD:20 | +| test.rs:49:14:49:22 | file_name | test.rs:49:14:49:30 | file_name.clone() | provenance | MaD:19 | +| test.rs:49:14:49:30 | file_name.clone() | test.rs:49:14:49:49 | ... .as_encoded_bytes() | provenance | MaD:22 | | test.rs:68:13:68:18 | target | test.rs:69:14:69:19 | target | provenance | | | test.rs:68:22:68:49 | ...::read_link(...) | test.rs:68:22:68:49 | ...::read_link(...) [Ok] | provenance | Src:MaD:12 | | test.rs:68:22:68:49 | ...::read_link(...) [Ok] | test.rs:68:22:68:50 | TryExpr | provenance | | @@ -144,45 +144,45 @@ edges | test.rs:110:20:110:50 | ...::open(...) | test.rs:110:20:110:50 | ...::open(...) [Ok] | provenance | Src:MaD:5 | | test.rs:110:20:110:50 | ...::open(...) [Ok] | test.rs:110:20:110:51 | TryExpr | provenance | | | test.rs:110:20:110:51 | TryExpr | test.rs:110:9:110:16 | mut file | provenance | | -| test.rs:114:22:114:25 | file | test.rs:114:32:114:42 | [post] &mut buffer [&ref] | provenance | MaD:34 | +| test.rs:114:22:114:25 | file | test.rs:114:32:114:42 | [post] &mut buffer [&ref] | provenance | MaD:29 | | test.rs:114:32:114:42 | [post] &mut buffer [&ref] | test.rs:114:37:114:42 | [post] buffer | provenance | | | test.rs:114:37:114:42 | [post] buffer | test.rs:115:15:115:20 | buffer | provenance | | | test.rs:115:15:115:20 | buffer | test.rs:115:14:115:20 | &buffer | provenance | | -| test.rs:120:22:120:25 | file | test.rs:120:39:120:49 | [post] &mut buffer [&ref] | provenance | MaD:22 | +| test.rs:120:22:120:25 | file | test.rs:120:39:120:49 | [post] &mut buffer [&ref] | provenance | MaD:24 | | test.rs:120:39:120:49 | [post] &mut buffer [&ref] | test.rs:120:44:120:49 | [post] buffer | provenance | | | test.rs:120:44:120:49 | [post] buffer | test.rs:121:15:121:20 | buffer | provenance | | | test.rs:121:15:121:20 | buffer | test.rs:121:14:121:20 | &buffer | provenance | | -| test.rs:126:22:126:25 | file | test.rs:126:42:126:52 | [post] &mut buffer [&ref] | provenance | MaD:23 | +| test.rs:126:22:126:25 | file | test.rs:126:42:126:52 | [post] &mut buffer [&ref] | provenance | MaD:25 | | test.rs:126:42:126:52 | [post] &mut buffer [&ref] | test.rs:126:47:126:52 | [post] buffer | provenance | | | test.rs:126:47:126:52 | [post] buffer | test.rs:127:15:127:20 | buffer | provenance | | | test.rs:127:15:127:20 | buffer | test.rs:127:14:127:20 | &buffer | provenance | | -| test.rs:132:9:132:12 | file | test.rs:132:25:132:35 | [post] &mut buffer [&ref] | provenance | MaD:35 | +| test.rs:132:9:132:12 | file | test.rs:132:25:132:35 | [post] &mut buffer [&ref] | provenance | MaD:30 | | test.rs:132:25:132:35 | [post] &mut buffer [&ref] | test.rs:132:30:132:35 | [post] buffer | provenance | | | test.rs:132:30:132:35 | [post] buffer | test.rs:133:15:133:20 | buffer | provenance | | | test.rs:133:15:133:20 | buffer | test.rs:133:14:133:20 | &buffer | provenance | | -| test.rs:136:17:136:20 | file | test.rs:136:17:136:28 | file.bytes() | provenance | MaD:31 | +| test.rs:136:17:136:20 | file | test.rs:136:17:136:28 | file.bytes() | provenance | MaD:26 | | test.rs:136:17:136:28 | file.bytes() | test.rs:137:14:137:17 | byte | provenance | | | test.rs:143:13:143:18 | mut f1 | test.rs:145:22:145:23 | f1 | provenance | | | test.rs:143:22:143:63 | ... .open(...) | test.rs:143:22:143:63 | ... .open(...) [Ok] | provenance | Src:MaD:6 | -| test.rs:143:22:143:63 | ... .open(...) [Ok] | test.rs:143:22:143:72 | ... .unwrap() | provenance | MaD:19 | +| test.rs:143:22:143:63 | ... .open(...) [Ok] | test.rs:143:22:143:72 | ... .unwrap() | provenance | MaD:21 | | test.rs:143:22:143:72 | ... .unwrap() | test.rs:143:13:143:18 | mut f1 | provenance | | -| test.rs:145:22:145:23 | f1 | test.rs:145:30:145:40 | [post] &mut buffer [&ref] | provenance | MaD:34 | +| test.rs:145:22:145:23 | f1 | test.rs:145:30:145:40 | [post] &mut buffer [&ref] | provenance | MaD:29 | | test.rs:145:30:145:40 | [post] &mut buffer [&ref] | test.rs:145:35:145:40 | [post] buffer | provenance | | | test.rs:145:35:145:40 | [post] buffer | test.rs:146:15:146:20 | buffer | provenance | | | test.rs:146:15:146:20 | buffer | test.rs:146:14:146:20 | &buffer | provenance | | | test.rs:150:13:150:18 | mut f2 | test.rs:155:22:155:23 | f2 | provenance | | | test.rs:150:22:152:27 | ... .open(...) | test.rs:150:22:152:27 | ... .open(...) [Ok] | provenance | Src:MaD:6 | -| test.rs:150:22:152:27 | ... .open(...) [Ok] | test.rs:150:22:153:21 | ... .unwrap() | provenance | MaD:19 | +| test.rs:150:22:152:27 | ... .open(...) [Ok] | test.rs:150:22:153:21 | ... .unwrap() | provenance | MaD:21 | | test.rs:150:22:153:21 | ... .unwrap() | test.rs:150:13:150:18 | mut f2 | provenance | | -| test.rs:155:22:155:23 | f2 | test.rs:155:30:155:40 | [post] &mut buffer [&ref] | provenance | MaD:34 | +| test.rs:155:22:155:23 | f2 | test.rs:155:30:155:40 | [post] &mut buffer [&ref] | provenance | MaD:29 | | test.rs:155:30:155:40 | [post] &mut buffer [&ref] | test.rs:155:35:155:40 | [post] buffer | provenance | | | test.rs:155:35:155:40 | [post] buffer | test.rs:156:15:156:20 | buffer | provenance | | | test.rs:156:15:156:20 | buffer | test.rs:156:14:156:20 | &buffer | provenance | | | test.rs:160:13:160:18 | mut f3 | test.rs:168:22:168:23 | f3 | provenance | | | test.rs:160:22:165:27 | ... .open(...) | test.rs:160:22:165:27 | ... .open(...) [Ok] | provenance | Src:MaD:6 | -| test.rs:160:22:165:27 | ... .open(...) [Ok] | test.rs:160:22:166:21 | ... .unwrap() | provenance | MaD:19 | +| test.rs:160:22:165:27 | ... .open(...) [Ok] | test.rs:160:22:166:21 | ... .unwrap() | provenance | MaD:21 | | test.rs:160:22:166:21 | ... .unwrap() | test.rs:160:13:160:18 | mut f3 | provenance | | -| test.rs:168:22:168:23 | f3 | test.rs:168:30:168:40 | [post] &mut buffer [&ref] | provenance | MaD:34 | +| test.rs:168:22:168:23 | f3 | test.rs:168:30:168:40 | [post] &mut buffer [&ref] | provenance | MaD:29 | | test.rs:168:30:168:40 | [post] &mut buffer [&ref] | test.rs:168:35:168:40 | [post] buffer | provenance | | | test.rs:168:35:168:40 | [post] buffer | test.rs:169:15:169:20 | buffer | provenance | | | test.rs:169:15:169:20 | buffer | test.rs:169:14:169:20 | &buffer | provenance | | @@ -195,10 +195,10 @@ edges | test.rs:177:21:177:59 | ...::open(...) [Ok] | test.rs:177:21:177:60 | TryExpr | provenance | | | test.rs:177:21:177:60 | TryExpr | test.rs:177:13:177:17 | file2 | provenance | | | test.rs:178:13:178:22 | mut reader | test.rs:179:9:179:14 | reader | provenance | | -| test.rs:178:26:178:30 | file1 | test.rs:178:26:178:43 | file1.chain(...) | provenance | MaD:33 | +| test.rs:178:26:178:30 | file1 | test.rs:178:26:178:43 | file1.chain(...) | provenance | MaD:28 | | test.rs:178:26:178:43 | file1.chain(...) | test.rs:178:13:178:22 | mut reader | provenance | | -| test.rs:178:38:178:42 | file2 | test.rs:178:26:178:43 | file1.chain(...) | provenance | MaD:32 | -| test.rs:179:9:179:14 | reader | test.rs:179:31:179:41 | [post] &mut buffer [&ref] | provenance | MaD:36 | +| test.rs:178:38:178:42 | file2 | test.rs:178:26:178:43 | file1.chain(...) | provenance | MaD:27 | +| test.rs:179:9:179:14 | reader | test.rs:179:31:179:41 | [post] &mut buffer [&ref] | provenance | MaD:31 | | test.rs:179:31:179:41 | [post] &mut buffer [&ref] | test.rs:179:36:179:41 | [post] buffer | provenance | | | test.rs:179:36:179:41 | [post] buffer | test.rs:180:15:180:20 | buffer | provenance | | | test.rs:180:15:180:20 | buffer | test.rs:180:14:180:20 | &buffer | provenance | | @@ -207,9 +207,9 @@ edges | test.rs:185:21:185:51 | ...::open(...) [Ok] | test.rs:185:21:185:52 | TryExpr | provenance | | | test.rs:185:21:185:52 | TryExpr | test.rs:185:13:185:17 | file1 | provenance | | | test.rs:186:13:186:22 | mut reader | test.rs:187:9:187:14 | reader | provenance | | -| test.rs:186:26:186:30 | file1 | test.rs:186:26:186:40 | file1.take(...) | provenance | MaD:37 | +| test.rs:186:26:186:30 | file1 | test.rs:186:26:186:40 | file1.take(...) | provenance | MaD:32 | | test.rs:186:26:186:40 | file1.take(...) | test.rs:186:13:186:22 | mut reader | provenance | | -| test.rs:187:9:187:14 | reader | test.rs:187:31:187:41 | [post] &mut buffer [&ref] | provenance | MaD:36 | +| test.rs:187:9:187:14 | reader | test.rs:187:31:187:41 | [post] &mut buffer [&ref] | provenance | MaD:31 | | test.rs:187:31:187:41 | [post] &mut buffer [&ref] | test.rs:187:36:187:41 | [post] buffer | provenance | | | test.rs:187:36:187:41 | [post] buffer | test.rs:188:15:188:20 | buffer | provenance | | | test.rs:188:15:188:20 | buffer | test.rs:188:14:188:20 | &buffer | provenance | | @@ -280,7 +280,7 @@ edges | test.rs:274:20:274:56 | ...::open(...) [future, Ok] | test.rs:274:20:274:62 | await ... [Ok] | provenance | | | test.rs:274:20:274:62 | await ... [Ok] | test.rs:274:20:274:63 | TryExpr | provenance | | | test.rs:274:20:274:63 | TryExpr | test.rs:274:9:274:16 | mut file | provenance | | -| test.rs:278:22:278:25 | file | test.rs:278:32:278:42 | [post] &mut buffer [&ref] | provenance | MaD:29 | +| test.rs:278:22:278:25 | file | test.rs:278:32:278:42 | [post] &mut buffer [&ref] | provenance | MaD:18 | | test.rs:278:32:278:42 | [post] &mut buffer [&ref] | test.rs:278:37:278:42 | [post] buffer | provenance | | | test.rs:278:37:278:42 | [post] buffer | test.rs:279:15:279:20 | buffer | provenance | | | test.rs:279:15:279:20 | buffer | test.rs:279:14:279:20 | &buffer | provenance | | @@ -289,7 +289,7 @@ edges | test.rs:285:22:285:69 | ... .open(...) [future, Ok] | test.rs:285:22:285:75 | await ... [Ok] | provenance | | | test.rs:285:22:285:75 | await ... [Ok] | test.rs:285:22:285:76 | TryExpr | provenance | | | test.rs:285:22:285:76 | TryExpr | test.rs:285:13:285:18 | mut f1 | provenance | | -| test.rs:287:22:287:23 | f1 | test.rs:287:30:287:40 | [post] &mut buffer [&ref] | provenance | MaD:29 | +| test.rs:287:22:287:23 | f1 | test.rs:287:30:287:40 | [post] &mut buffer [&ref] | provenance | MaD:18 | | test.rs:287:30:287:40 | [post] &mut buffer [&ref] | test.rs:287:35:287:40 | [post] buffer | provenance | | | test.rs:287:35:287:40 | [post] buffer | test.rs:288:15:288:20 | buffer | provenance | | | test.rs:288:15:288:20 | buffer | test.rs:288:14:288:20 | &buffer | provenance | | diff --git a/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected index cbe63e1acbdf..821dd11cda66 100644 --- a/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected @@ -7,72 +7,72 @@ models | 6 | Source: ::connect; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote | | 7 | Source: reqwest::blocking::get; ReturnValue.Field[core::result::Result::Ok(0)]; remote | | 8 | Source: reqwest::get; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote | -| 9 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 10 | Summary: ::new; Argument[0].Reference; ReturnValue; value | -| 11 | Summary: ::new; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer]; value | -| 12 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 13 | Summary: ::connect; Argument[1]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 14 | Summary: ::new; Argument[0]; ReturnValue; taint | -| 15 | Summary: ::body; Argument[self].Reference.Field[http::response::Response::body]; ReturnValue.Reference; value | -| 16 | Summary: ::body_mut; Argument[self].Reference.Field[http::response::Response::body]; ReturnValue.Reference; value | -| 17 | Summary: ::into_body; Argument[self].Field[http::response::Response::body]; ReturnValue; value | -| 18 | Summary: ::bytes; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 19 | Summary: ::chunk; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | -| 20 | Summary: ::text; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 21 | Summary: ::bytes; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 22 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 23 | Summary: ::text_with_charset; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 24 | Summary: ::new; Argument[0]; ReturnValue; taint | -| 25 | Summary: ::try_clone; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 26 | Summary: ::peek; Argument[self].Reference; Argument[0].Reference; taint | -| 27 | Summary: ::try_read; Argument[self].Reference; Argument[0].Reference; taint | -| 28 | Summary: ::try_read_buf; Argument[self].Reference; Argument[0].Reference; taint | -| 29 | Summary: core::ops::deref::Deref::deref; Argument[self].Reference; ReturnValue.Reference; taint | -| 30 | Summary: core::ops::index::Index::index; Argument[self].Reference.Element; ReturnValue.Reference; value | -| 31 | Summary: 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 | -| 32 | Summary: futures_io::if_std::AsyncRead::poll_read; Argument[self].Reference; Argument[1].Reference; taint | -| 33 | Summary: futures_util::io::AsyncBufReadExt::fill_buf; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 34 | Summary: futures_util::io::AsyncBufReadExt::read_line; Argument[self].Reference; Argument[0].Reference; taint | -| 35 | Summary: futures_util::io::AsyncBufReadExt::read_until; Argument[self].Reference; Argument[1].Reference; taint | -| 36 | Summary: futures_util::io::AsyncReadExt::read; Argument[self].Reference; Argument[0].Reference; taint | -| 37 | Summary: futures_util::io::AsyncReadExt::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | -| 38 | Summary: std::io::BufRead::lines; Argument[self]; ReturnValue; taint | -| 39 | Summary: std::io::BufRead::read_line; Argument[self].Reference; Argument[0].Reference; taint | -| 40 | Summary: std::io::Read::read; Argument[self].Reference; Argument[0].Reference; taint | -| 41 | Summary: std::io::Read::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | -| 42 | Summary: std::io::Read::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | -| 43 | Summary: std::io::Read::take; Argument[self]; ReturnValue; taint | -| 44 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read; Argument[self].Reference; Argument[0].Reference; taint | +| 9 | Summary: ::deref; Argument[self].Reference; ReturnValue.Reference; taint | +| 10 | Summary: ::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 11 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 12 | Summary: ::new; Argument[0].Reference; ReturnValue; value | +| 13 | Summary: ::new; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer]; value | +| 14 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 15 | Summary: ::poll_fill_buf; Argument[self].Reference; ReturnValue.Field[core::task::poll::Poll::Ready(0)].Field[core::result::Result::Ok(0)]; taint | +| 16 | Summary: ::poll_read; Argument[self].Reference; Argument[1].Reference; taint | +| 17 | Summary: ::connect; Argument[1]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 18 | Summary: ::fill_buf; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 19 | Summary: ::read_line; Argument[self].Reference; Argument[0].Reference; taint | +| 20 | Summary: ::read_until; Argument[self].Reference; Argument[1].Reference; taint | +| 21 | Summary: ::read; Argument[self].Reference; Argument[0].Reference; taint | +| 22 | Summary: ::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | +| 23 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 24 | Summary: ::body; Argument[self].Reference.Field[http::response::Response::body]; ReturnValue.Reference; value | +| 25 | Summary: ::body_mut; Argument[self].Reference.Field[http::response::Response::body]; ReturnValue.Reference; value | +| 26 | Summary: ::into_body; Argument[self].Field[http::response::Response::body]; ReturnValue; value | +| 27 | Summary: ::bytes; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 28 | Summary: ::chunk; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | +| 29 | Summary: ::text; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 30 | Summary: ::bytes; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 31 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 32 | Summary: ::text_with_charset; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 33 | Summary: ::lines; Argument[self]; ReturnValue; taint | +| 34 | Summary: ::read_line; Argument[self].Reference; Argument[0].Reference; taint | +| 35 | Summary: ::read; Argument[self].Reference; Argument[0].Reference; taint | +| 36 | Summary: ::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | +| 37 | Summary: ::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | +| 38 | Summary: ::take; Argument[self]; ReturnValue; taint | +| 39 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 40 | Summary: ::try_clone; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 41 | Summary: ::read; Argument[self].Reference; Argument[0].Reference; taint | +| 42 | Summary: ::peek; Argument[self].Reference; Argument[0].Reference; taint | +| 43 | Summary: ::try_read; Argument[self].Reference; Argument[0].Reference; taint | +| 44 | Summary: ::try_read_buf; Argument[self].Reference; Argument[0].Reference; taint | edges | test.rs:11:9:11:22 | remote_string1 | test.rs:12:10:12:23 | remote_string1 | provenance | | | test.rs:11:26:11:62 | ...::get(...) | test.rs:11:26:11:62 | ...::get(...) [Ok] | provenance | Src:MaD:7 | | test.rs:11:26:11:62 | ...::get(...) [Ok] | test.rs:11:26:11:63 | TryExpr | provenance | | -| test.rs:11:26:11:63 | TryExpr | test.rs:11:26:11:70 | ... .text() [Ok] | provenance | MaD:22 | +| test.rs:11:26:11:63 | TryExpr | test.rs:11:26:11:70 | ... .text() [Ok] | provenance | MaD:31 | | test.rs:11:26:11:70 | ... .text() [Ok] | test.rs:11:26:11:71 | TryExpr | provenance | | | test.rs:11:26:11:71 | TryExpr | test.rs:11:9:11:22 | remote_string1 | provenance | | | test.rs:14:9:14:22 | remote_string2 | test.rs:15:10:15:23 | remote_string2 | provenance | | | test.rs:14:26:14:62 | ...::get(...) | test.rs:14:26:14:62 | ...::get(...) [Ok] | provenance | Src:MaD:7 | -| test.rs:14:26:14:62 | ...::get(...) [Ok] | test.rs:14:26:14:71 | ... .unwrap() | provenance | MaD:12 | -| test.rs:14:26:14:71 | ... .unwrap() | test.rs:14:26:14:78 | ... .text() [Ok] | provenance | MaD:22 | -| test.rs:14:26:14:78 | ... .text() [Ok] | test.rs:14:26:14:87 | ... .unwrap() | provenance | MaD:12 | +| test.rs:14:26:14:62 | ...::get(...) [Ok] | test.rs:14:26:14:71 | ... .unwrap() | provenance | MaD:14 | +| test.rs:14:26:14:71 | ... .unwrap() | test.rs:14:26:14:78 | ... .text() [Ok] | provenance | MaD:31 | +| test.rs:14:26:14:78 | ... .text() [Ok] | test.rs:14:26:14:87 | ... .unwrap() | provenance | MaD:14 | | test.rs:14:26:14:87 | ... .unwrap() | test.rs:14:9:14:22 | remote_string2 | provenance | | | test.rs:17:9:17:22 | remote_string3 | test.rs:18:10:18:23 | remote_string3 | provenance | | | test.rs:17:26:17:62 | ...::get(...) | test.rs:17:26:17:62 | ...::get(...) [Ok] | provenance | Src:MaD:7 | -| test.rs:17:26:17:62 | ...::get(...) [Ok] | test.rs:17:26:17:71 | ... .unwrap() | provenance | MaD:12 | -| test.rs:17:26:17:71 | ... .unwrap() | test.rs:17:26:17:98 | ... .text_with_charset(...) [Ok] | provenance | MaD:23 | -| test.rs:17:26:17:98 | ... .text_with_charset(...) [Ok] | test.rs:17:26:17:107 | ... .unwrap() | provenance | MaD:12 | +| test.rs:17:26:17:62 | ...::get(...) [Ok] | test.rs:17:26:17:71 | ... .unwrap() | provenance | MaD:14 | +| test.rs:17:26:17:71 | ... .unwrap() | test.rs:17:26:17:98 | ... .text_with_charset(...) [Ok] | provenance | MaD:32 | +| test.rs:17:26:17:98 | ... .text_with_charset(...) [Ok] | test.rs:17:26:17:107 | ... .unwrap() | provenance | MaD:14 | | test.rs:17:26:17:107 | ... .unwrap() | test.rs:17:9:17:22 | remote_string3 | provenance | | | test.rs:20:9:20:22 | remote_string4 | test.rs:21:10:21:23 | remote_string4 | provenance | | | test.rs:20:26:20:62 | ...::get(...) | test.rs:20:26:20:62 | ...::get(...) [Ok] | provenance | Src:MaD:7 | -| test.rs:20:26:20:62 | ...::get(...) [Ok] | test.rs:20:26:20:71 | ... .unwrap() | provenance | MaD:12 | -| test.rs:20:26:20:71 | ... .unwrap() | test.rs:20:26:20:79 | ... .bytes() [Ok] | provenance | MaD:21 | -| test.rs:20:26:20:79 | ... .bytes() [Ok] | test.rs:20:26:20:88 | ... .unwrap() | provenance | MaD:12 | +| test.rs:20:26:20:62 | ...::get(...) [Ok] | test.rs:20:26:20:71 | ... .unwrap() | provenance | MaD:14 | +| test.rs:20:26:20:71 | ... .unwrap() | test.rs:20:26:20:79 | ... .bytes() [Ok] | provenance | MaD:30 | +| test.rs:20:26:20:79 | ... .bytes() [Ok] | test.rs:20:26:20:88 | ... .unwrap() | provenance | MaD:14 | | test.rs:20:26:20:88 | ... .unwrap() | test.rs:20:9:20:22 | remote_string4 | provenance | | | test.rs:23:9:23:22 | remote_string5 | test.rs:24:10:24:23 | remote_string5 | provenance | | | test.rs:23:26:23:52 | ...::get(...) | test.rs:23:26:23:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:8 | | test.rs:23:26:23:52 | ...::get(...) [future, Ok] | test.rs:23:26:23:58 | await ... [Ok] | provenance | | | test.rs:23:26:23:58 | await ... [Ok] | test.rs:23:26:23:59 | TryExpr | provenance | | -| test.rs:23:26:23:59 | TryExpr | test.rs:23:26:23:66 | ... .text() [future, Ok] | provenance | MaD:20 | +| test.rs:23:26:23:59 | TryExpr | test.rs:23:26:23:66 | ... .text() [future, Ok] | provenance | MaD:29 | | test.rs:23:26:23:66 | ... .text() [future, Ok] | test.rs:23:26:23:72 | await ... [Ok] | provenance | | | test.rs:23:26:23:72 | await ... [Ok] | test.rs:23:26:23:73 | TryExpr | provenance | | | test.rs:23:26:23:73 | TryExpr | test.rs:23:9:23:22 | remote_string5 | provenance | | @@ -80,7 +80,7 @@ edges | test.rs:26:26:26:52 | ...::get(...) | test.rs:26:26:26:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:8 | | test.rs:26:26:26:52 | ...::get(...) [future, Ok] | test.rs:26:26:26:58 | await ... [Ok] | provenance | | | test.rs:26:26:26:58 | await ... [Ok] | test.rs:26:26:26:59 | TryExpr | provenance | | -| test.rs:26:26:26:59 | TryExpr | test.rs:26:26:26:67 | ... .bytes() [future, Ok] | provenance | MaD:18 | +| test.rs:26:26:26:59 | TryExpr | test.rs:26:26:26:67 | ... .bytes() [future, Ok] | provenance | MaD:27 | | test.rs:26:26:26:67 | ... .bytes() [future, Ok] | test.rs:26:26:26:73 | await ... [Ok] | provenance | | | test.rs:26:26:26:73 | await ... [Ok] | test.rs:26:26:26:74 | TryExpr | provenance | | | test.rs:26:26:26:74 | TryExpr | test.rs:26:9:26:22 | remote_string6 | provenance | | @@ -90,13 +90,13 @@ edges | test.rs:29:24:29:50 | ...::get(...) [future, Ok] | test.rs:29:24:29:56 | await ... [Ok] | provenance | | | test.rs:29:24:29:56 | await ... [Ok] | test.rs:29:24:29:57 | TryExpr | provenance | | | test.rs:29:24:29:57 | TryExpr | test.rs:29:9:29:20 | mut request1 | provenance | | -| test.rs:30:10:30:17 | request1 | test.rs:30:10:30:25 | request1.chunk() [future, Ok, Some] | provenance | MaD:19 | +| test.rs:30:10:30:17 | request1 | test.rs:30:10:30:25 | request1.chunk() [future, Ok, Some] | provenance | MaD:28 | | test.rs:30:10:30:25 | request1.chunk() [future, Ok, Some] | test.rs:30:10:30:31 | await ... [Ok, Some] | provenance | | | test.rs:30:10:30:31 | await ... [Ok, Some] | test.rs:30:10:30:32 | TryExpr [Some] | provenance | | -| test.rs:30:10:30:32 | TryExpr [Some] | test.rs:30:10:30:41 | ... .unwrap() | provenance | MaD:9 | +| test.rs:30:10:30:32 | TryExpr [Some] | test.rs:30:10:30:41 | ... .unwrap() | provenance | MaD:11 | | test.rs:31:15:31:25 | Some(...) [Some] | test.rs:31:20:31:24 | chunk | provenance | | | test.rs:31:20:31:24 | chunk | test.rs:32:14:32:18 | chunk | provenance | | -| test.rs:31:29:31:36 | request1 | test.rs:31:29:31:44 | request1.chunk() [future, Ok, Some] | provenance | MaD:19 | +| test.rs:31:29:31:36 | request1 | test.rs:31:29:31:44 | request1.chunk() [future, Ok, Some] | provenance | MaD:28 | | test.rs:31:29:31:44 | request1.chunk() [future, Ok, Some] | test.rs:31:29:31:50 | await ... [Ok, Some] | provenance | | | test.rs:31:29:31:50 | await ... [Ok, Some] | test.rs:31:29:31:51 | TryExpr [Some] | provenance | | | test.rs:31:29:31:51 | TryExpr [Some] | test.rs:31:15:31:25 | Some(...) [Some] | provenance | | @@ -116,42 +116,42 @@ edges | test.rs:67:24:67:57 | await ... [Ok] | test.rs:67:24:67:58 | TryExpr | provenance | | | test.rs:67:24:67:58 | TryExpr | test.rs:67:9:67:20 | mut response | provenance | | | test.rs:68:11:68:18 | response | test.rs:68:10:68:18 | &response | provenance | | -| test.rs:76:18:76:25 | response | test.rs:76:18:76:32 | response.body() | provenance | MaD:15 | -| test.rs:77:18:77:25 | response | test.rs:77:18:77:36 | response.body_mut() | provenance | MaD:16 | +| test.rs:76:18:76:25 | response | test.rs:76:18:76:32 | response.body() | provenance | MaD:24 | +| test.rs:77:18:77:25 | response | test.rs:77:18:77:36 | response.body_mut() | provenance | MaD:25 | | test.rs:79:17:79:20 | body | test.rs:80:19:80:22 | body | provenance | | -| test.rs:79:24:79:31 | response | test.rs:79:24:79:43 | response.into_body() | provenance | MaD:17 | +| test.rs:79:24:79:31 | response | test.rs:79:24:79:43 | response.into_body() | provenance | MaD:26 | | test.rs:79:24:79:43 | response.into_body() | test.rs:79:17:79:20 | body | provenance | | | test.rs:80:19:80:22 | body | test.rs:80:18:80:22 | &body | provenance | | | test.rs:155:13:155:22 | mut stream | test.rs:162:17:162:22 | stream | provenance | | | test.rs:155:26:155:62 | ...::connect(...) | test.rs:155:26:155:62 | ...::connect(...) [Ok] | provenance | Src:MaD:4 | | test.rs:155:26:155:62 | ...::connect(...) [Ok] | test.rs:155:26:155:63 | TryExpr | provenance | | | test.rs:155:26:155:63 | TryExpr | test.rs:155:13:155:22 | mut stream | provenance | | -| test.rs:162:17:162:22 | stream | test.rs:162:29:162:39 | [post] &mut buffer [&ref] | provenance | MaD:40 | +| test.rs:162:17:162:22 | stream | test.rs:162:29:162:39 | [post] &mut buffer [&ref] | provenance | MaD:35 | | test.rs:162:29:162:39 | [post] &mut buffer [&ref] | test.rs:162:34:162:39 | [post] buffer | provenance | | | test.rs:162:34:162:39 | [post] buffer | test.rs:165:15:165:20 | buffer | provenance | | | test.rs:162:34:162:39 | [post] buffer | test.rs:166:14:166:19 | buffer | provenance | | | test.rs:165:15:165:20 | buffer | test.rs:165:14:165:20 | &buffer | provenance | | -| test.rs:166:14:166:19 | buffer | test.rs:166:14:166:22 | buffer[0] | provenance | MaD:30 | +| test.rs:166:14:166:19 | buffer | test.rs:166:14:166:22 | buffer[0] | provenance | MaD:10 | | test.rs:174:13:174:22 | mut stream | test.rs:182:58:182:63 | stream | provenance | | | test.rs:174:13:174:22 | mut stream | test.rs:203:54:203:59 | stream | provenance | | | test.rs:174:26:174:105 | ...::connect_timeout(...) | test.rs:174:26:174:105 | ...::connect_timeout(...) [Ok] | provenance | Src:MaD:5 | | test.rs:174:26:174:105 | ...::connect_timeout(...) [Ok] | test.rs:174:26:174:106 | TryExpr | provenance | | | test.rs:174:26:174:106 | TryExpr | test.rs:174:13:174:22 | mut stream | provenance | | | test.rs:182:21:182:30 | mut reader | test.rs:185:27:185:32 | reader | provenance | | -| test.rs:182:34:182:64 | ...::new(...) | test.rs:182:34:182:74 | ... .take(...) | provenance | MaD:43 | +| test.rs:182:34:182:64 | ...::new(...) | test.rs:182:34:182:74 | ... .take(...) | provenance | MaD:38 | | test.rs:182:34:182:74 | ... .take(...) | test.rs:182:21:182:30 | mut reader | provenance | | -| test.rs:182:58:182:63 | stream | test.rs:182:34:182:64 | ...::new(...) | provenance | MaD:24 | -| test.rs:185:27:185:32 | reader | test.rs:185:44:185:52 | [post] &mut line [&ref] | provenance | MaD:39 | +| test.rs:182:58:182:63 | stream | test.rs:182:34:182:64 | ...::new(...) | provenance | MaD:39 | +| test.rs:185:27:185:32 | reader | test.rs:185:44:185:52 | [post] &mut line [&ref] | provenance | MaD:34 | | test.rs:185:44:185:52 | [post] &mut line [&ref] | test.rs:185:49:185:52 | [post] line | provenance | | | test.rs:185:49:185:52 | [post] line | test.rs:192:35:192:38 | line | provenance | | | test.rs:192:35:192:38 | line | test.rs:192:34:192:38 | &line | provenance | | | test.rs:203:21:203:26 | reader | test.rs:204:29:204:34 | reader | provenance | | -| test.rs:203:30:203:73 | ...::new(...) | test.rs:203:30:203:83 | ... .take(...) | provenance | MaD:43 | +| test.rs:203:30:203:73 | ...::new(...) | test.rs:203:30:203:83 | ... .take(...) | provenance | MaD:38 | | test.rs:203:30:203:83 | ... .take(...) | test.rs:203:21:203:26 | reader | provenance | | -| test.rs:203:54:203:59 | stream | test.rs:203:54:203:71 | stream.try_clone() [Ok] | provenance | MaD:25 | +| test.rs:203:54:203:59 | stream | test.rs:203:54:203:71 | stream.try_clone() [Ok] | provenance | MaD:40 | | test.rs:203:54:203:71 | stream.try_clone() [Ok] | test.rs:203:54:203:72 | TryExpr | provenance | | -| test.rs:203:54:203:72 | TryExpr | test.rs:203:30:203:73 | ...::new(...) | provenance | MaD:24 | -| test.rs:204:29:204:34 | reader | test.rs:204:29:204:42 | reader.lines() | provenance | MaD:38 | +| test.rs:203:54:203:72 | TryExpr | test.rs:203:30:203:73 | ...::new(...) | provenance | MaD:39 | +| test.rs:204:29:204:34 | reader | test.rs:204:29:204:42 | reader.lines() | provenance | MaD:33 | | test.rs:204:29:204:42 | reader.lines() | test.rs:205:28:205:37 | Ok(...) | provenance | | | test.rs:205:28:205:37 | Ok(...) | test.rs:207:30:207:35 | string | provenance | | | test.rs:224:9:224:24 | mut tokio_stream | test.rs:232:17:232:28 | tokio_stream | provenance | | @@ -162,46 +162,46 @@ edges | test.rs:224:28:224:66 | ...::connect(...) [future, Ok] | test.rs:224:28:224:72 | await ... [Ok] | provenance | | | test.rs:224:28:224:72 | await ... [Ok] | test.rs:224:28:224:73 | TryExpr | provenance | | | test.rs:224:28:224:73 | TryExpr | test.rs:224:9:224:24 | mut tokio_stream | provenance | | -| test.rs:232:17:232:28 | tokio_stream | test.rs:232:35:232:46 | [post] &mut buffer1 [&ref] | provenance | MaD:26 | +| test.rs:232:17:232:28 | tokio_stream | test.rs:232:35:232:46 | [post] &mut buffer1 [&ref] | provenance | MaD:42 | | test.rs:232:35:232:46 | [post] &mut buffer1 [&ref] | test.rs:232:40:232:46 | [post] buffer1 | provenance | | | test.rs:232:40:232:46 | [post] buffer1 | test.rs:239:15:239:21 | buffer1 | provenance | | | test.rs:232:40:232:46 | [post] buffer1 | test.rs:240:14:240:20 | buffer1 | provenance | | -| test.rs:236:18:236:29 | tokio_stream | test.rs:236:36:236:47 | [post] &mut buffer2 [&ref] | provenance | MaD:44 | +| test.rs:236:18:236:29 | tokio_stream | test.rs:236:36:236:47 | [post] &mut buffer2 [&ref] | provenance | MaD:41 | | test.rs:236:36:236:47 | [post] &mut buffer2 [&ref] | test.rs:236:41:236:47 | [post] buffer2 | provenance | | | test.rs:236:41:236:47 | [post] buffer2 | test.rs:243:15:243:21 | buffer2 | provenance | | | test.rs:236:41:236:47 | [post] buffer2 | test.rs:244:14:244:20 | buffer2 | provenance | | | test.rs:239:15:239:21 | buffer1 | test.rs:239:14:239:21 | &buffer1 | provenance | | -| test.rs:240:14:240:20 | buffer1 | test.rs:240:14:240:23 | buffer1[0] | provenance | MaD:30 | +| test.rs:240:14:240:20 | buffer1 | test.rs:240:14:240:23 | buffer1[0] | provenance | MaD:10 | | test.rs:243:15:243:21 | buffer2 | test.rs:243:14:243:21 | &buffer2 | provenance | | -| test.rs:244:14:244:20 | buffer2 | test.rs:244:14:244:23 | buffer2[0] | provenance | MaD:30 | -| test.rs:252:19:252:30 | tokio_stream | test.rs:252:41:252:51 | [post] &mut buffer [&ref] | provenance | MaD:27 | +| test.rs:244:14:244:20 | buffer2 | test.rs:244:14:244:23 | buffer2[0] | provenance | MaD:10 | +| test.rs:252:19:252:30 | tokio_stream | test.rs:252:41:252:51 | [post] &mut buffer [&ref] | provenance | MaD:43 | | test.rs:252:41:252:51 | [post] &mut buffer [&ref] | test.rs:252:46:252:51 | [post] buffer | provenance | | | test.rs:252:46:252:51 | [post] buffer | test.rs:259:27:259:32 | buffer | provenance | | | test.rs:259:27:259:32 | buffer | test.rs:259:26:259:32 | &buffer | provenance | | -| test.rs:275:19:275:30 | tokio_stream | test.rs:275:45:275:55 | [post] &mut buffer [&ref] | provenance | MaD:28 | +| test.rs:275:19:275:30 | tokio_stream | test.rs:275:45:275:55 | [post] &mut buffer [&ref] | provenance | MaD:44 | | test.rs:275:45:275:55 | [post] &mut buffer [&ref] | test.rs:275:50:275:55 | [post] buffer | provenance | | | test.rs:275:50:275:55 | [post] buffer | test.rs:282:27:282:32 | buffer | provenance | | | test.rs:282:27:282:32 | buffer | test.rs:282:26:282:32 | &buffer | provenance | | | test.rs:332:9:332:18 | mut client | test.rs:333:22:333:27 | client | provenance | | | test.rs:332:22:332:75 | ...::new(...) | test.rs:332:22:332:75 | ...::new(...) [Ok] | provenance | Src:MaD:3 | -| test.rs:332:22:332:75 | ...::new(...) [Ok] | test.rs:332:22:332:84 | ... .unwrap() | provenance | MaD:12 | +| test.rs:332:22:332:75 | ...::new(...) [Ok] | test.rs:332:22:332:84 | ... .unwrap() | provenance | MaD:14 | | test.rs:332:22:332:84 | ... .unwrap() | test.rs:332:9:332:18 | mut client | provenance | | | test.rs:333:9:333:18 | mut reader | test.rs:334:11:334:16 | reader | provenance | | | test.rs:333:9:333:18 | mut reader | test.rs:338:22:338:27 | reader | provenance | | | test.rs:333:9:333:18 | mut reader | test.rs:344:22:344:27 | reader | provenance | | | test.rs:333:9:333:18 | mut reader | test.rs:350:22:350:27 | reader | provenance | | -| test.rs:333:22:333:27 | client | test.rs:333:22:333:36 | client.reader() | provenance | MaD:29 | +| test.rs:333:22:333:27 | client | test.rs:333:22:333:36 | client.reader() | provenance | MaD:9 | | test.rs:333:22:333:36 | client.reader() | test.rs:333:9:333:18 | mut reader | provenance | | | test.rs:334:11:334:16 | reader | test.rs:334:10:334:16 | &reader | provenance | | -| test.rs:338:22:338:27 | reader | test.rs:338:34:338:44 | [post] &mut buffer [&ref] | provenance | MaD:40 | +| test.rs:338:22:338:27 | reader | test.rs:338:34:338:44 | [post] &mut buffer [&ref] | provenance | MaD:35 | | test.rs:338:34:338:44 | [post] &mut buffer [&ref] | test.rs:338:39:338:44 | [post] buffer | provenance | | | test.rs:338:39:338:44 | [post] buffer | test.rs:339:15:339:20 | buffer | provenance | | | test.rs:339:15:339:20 | buffer | test.rs:339:14:339:20 | &buffer | provenance | | -| test.rs:344:22:344:27 | reader | test.rs:344:41:344:51 | [post] &mut buffer [&ref] | provenance | MaD:41 | +| test.rs:344:22:344:27 | reader | test.rs:344:41:344:51 | [post] &mut buffer [&ref] | provenance | MaD:36 | | test.rs:344:41:344:51 | [post] &mut buffer [&ref] | test.rs:344:46:344:51 | [post] buffer | provenance | | | test.rs:344:46:344:51 | [post] buffer | test.rs:345:15:345:20 | buffer | provenance | | | test.rs:345:15:345:20 | buffer | test.rs:345:14:345:20 | &buffer | provenance | | -| test.rs:350:22:350:27 | reader | test.rs:350:44:350:54 | [post] &mut buffer [&ref] | provenance | MaD:42 | +| test.rs:350:22:350:27 | reader | test.rs:350:44:350:54 | [post] &mut buffer [&ref] | provenance | MaD:37 | | test.rs:350:44:350:54 | [post] &mut buffer [&ref] | test.rs:350:49:350:54 | [post] buffer | provenance | | | test.rs:350:49:350:54 | [post] buffer | test.rs:351:15:351:20 | buffer | provenance | | | test.rs:351:15:351:20 | buffer | test.rs:351:14:351:20 | &buffer | provenance | | @@ -220,38 +220,38 @@ edges | test.rs:380:26:380:60 | connector.connect(...) [future, Ok] | test.rs:380:26:380:66 | await ... [Ok] | provenance | | | test.rs:380:26:380:66 | await ... [Ok] | test.rs:380:26:380:67 | TryExpr | provenance | | | test.rs:380:26:380:67 | TryExpr | test.rs:380:13:380:22 | mut reader | provenance | | -| test.rs:380:57:380:59 | tcp | test.rs:380:26:380:60 | connector.connect(...) [future, Ok] | provenance | MaD:13 | +| test.rs:380:57:380:59 | tcp | test.rs:380:26:380:60 | connector.connect(...) [future, Ok] | provenance | MaD:17 | | test.rs:381:15:381:20 | reader | test.rs:381:14:381:20 | &reader | provenance | | | test.rs:386:17:386:26 | mut pinned | test.rs:387:19:387:24 | pinned | provenance | | | test.rs:386:17:386:26 | mut pinned | test.rs:389:30:389:35 | pinned | provenance | | | test.rs:386:17:386:26 | mut pinned [Pin, &ref] | test.rs:387:19:387:24 | pinned [Pin, &ref] | provenance | | | test.rs:386:30:386:50 | ...::new(...) | test.rs:386:17:386:26 | mut pinned | provenance | | | test.rs:386:30:386:50 | ...::new(...) [Pin, &ref] | test.rs:386:17:386:26 | mut pinned [Pin, &ref] | provenance | | -| test.rs:386:39:386:49 | &mut reader [&ref] | test.rs:386:30:386:50 | ...::new(...) | provenance | MaD:10 | -| test.rs:386:39:386:49 | &mut reader [&ref] | test.rs:386:30:386:50 | ...::new(...) [Pin, &ref] | provenance | MaD:11 | +| test.rs:386:39:386:49 | &mut reader [&ref] | test.rs:386:30:386:50 | ...::new(...) | provenance | MaD:12 | +| test.rs:386:39:386:49 | &mut reader [&ref] | test.rs:386:30:386:50 | ...::new(...) [Pin, &ref] | provenance | MaD:13 | | test.rs:386:44:386:49 | reader | test.rs:386:39:386:49 | &mut reader [&ref] | provenance | | | test.rs:387:19:387:24 | pinned | test.rs:387:18:387:24 | &pinned | provenance | | | test.rs:387:19:387:24 | pinned [Pin, &ref] | test.rs:387:18:387:24 | &pinned | provenance | | -| test.rs:389:30:389:35 | pinned | test.rs:389:56:389:66 | [post] &mut buffer [&ref] | provenance | MaD:32 | +| test.rs:389:30:389:35 | pinned | test.rs:389:56:389:66 | [post] &mut buffer [&ref] | provenance | MaD:16 | | test.rs:389:56:389:66 | [post] &mut buffer [&ref] | test.rs:389:61:389:66 | [post] buffer | provenance | | | test.rs:389:61:389:66 | [post] buffer | test.rs:391:23:391:28 | buffer | provenance | | | test.rs:389:61:389:66 | [post] buffer | test.rs:392:23:392:28 | buffer | provenance | | | test.rs:389:61:389:66 | [post] buffer | test.rs:392:23:392:33 | buffer[...] | provenance | | | test.rs:391:23:391:28 | buffer | test.rs:391:22:391:28 | &buffer | provenance | | -| test.rs:392:23:392:28 | buffer | test.rs:392:23:392:33 | buffer[...] | provenance | MaD:30 | +| test.rs:392:23:392:28 | buffer | test.rs:392:23:392:33 | buffer[...] | provenance | MaD:10 | | test.rs:392:23:392:33 | buffer[...] | test.rs:392:22:392:33 | &... | provenance | | -| test.rs:399:63:399:73 | &mut reader [&ref] | test.rs:399:76:399:87 | [post] &mut buffer1 [&ref] | provenance | MaD:36 | +| test.rs:399:63:399:73 | &mut reader [&ref] | test.rs:399:76:399:87 | [post] &mut buffer1 [&ref] | provenance | MaD:21 | | test.rs:399:68:399:73 | reader | test.rs:399:63:399:73 | &mut reader [&ref] | provenance | | | test.rs:399:76:399:87 | [post] &mut buffer1 [&ref] | test.rs:399:81:399:87 | [post] buffer1 | provenance | | | test.rs:399:81:399:87 | [post] buffer1 | test.rs:400:19:400:25 | buffer1 | provenance | | | test.rs:399:81:399:87 | [post] buffer1 | test.rs:400:19:400:40 | buffer1[...] | provenance | | -| test.rs:400:19:400:25 | buffer1 | test.rs:400:19:400:40 | buffer1[...] | provenance | MaD:30 | +| test.rs:400:19:400:25 | buffer1 | test.rs:400:19:400:40 | buffer1[...] | provenance | MaD:10 | | test.rs:400:19:400:40 | buffer1[...] | test.rs:400:18:400:40 | &... | provenance | | -| test.rs:403:31:403:36 | reader | test.rs:403:43:403:54 | [post] &mut buffer2 [&ref] | provenance | MaD:36 | +| test.rs:403:31:403:36 | reader | test.rs:403:43:403:54 | [post] &mut buffer2 [&ref] | provenance | MaD:21 | | test.rs:403:43:403:54 | [post] &mut buffer2 [&ref] | test.rs:403:48:403:54 | [post] buffer2 | provenance | | | test.rs:403:48:403:54 | [post] buffer2 | test.rs:405:19:405:25 | buffer2 | provenance | | | test.rs:403:48:403:54 | [post] buffer2 | test.rs:405:19:405:40 | buffer2[...] | provenance | | -| test.rs:405:19:405:25 | buffer2 | test.rs:405:19:405:40 | buffer2[...] | provenance | MaD:30 | +| test.rs:405:19:405:25 | buffer2 | test.rs:405:19:405:40 | buffer2[...] | provenance | MaD:10 | | test.rs:405:19:405:40 | buffer2[...] | test.rs:405:18:405:40 | &... | provenance | | | test.rs:408:13:408:23 | mut reader2 | test.rs:409:15:409:21 | reader2 | provenance | | | test.rs:408:13:408:23 | mut reader2 | test.rs:413:44:413:50 | reader2 | provenance | | @@ -266,30 +266,30 @@ edges | test.rs:408:13:408:23 | mut reader2 | test.rs:493:31:493:37 | reader2 | provenance | | | test.rs:408:13:408:23 | mut reader2 | test.rs:500:31:500:37 | reader2 | provenance | | | test.rs:408:27:408:61 | ...::new(...) | test.rs:408:13:408:23 | mut reader2 | provenance | | -| test.rs:408:55:408:60 | reader | test.rs:408:27:408:61 | ...::new(...) | provenance | MaD:14 | +| test.rs:408:55:408:60 | reader | test.rs:408:27:408:61 | ...::new(...) | provenance | MaD:23 | | test.rs:409:15:409:21 | reader2 | test.rs:409:14:409:21 | &reader2 | provenance | | | test.rs:413:17:413:26 | mut pinned | test.rs:414:19:414:24 | pinned | provenance | | | test.rs:413:17:413:26 | mut pinned | test.rs:416:26:416:31 | pinned | provenance | | | test.rs:413:17:413:26 | mut pinned [Pin, &ref] | test.rs:414:19:414:24 | pinned [Pin, &ref] | provenance | | | test.rs:413:30:413:51 | ...::new(...) | test.rs:413:17:413:26 | mut pinned | provenance | | | test.rs:413:30:413:51 | ...::new(...) [Pin, &ref] | test.rs:413:17:413:26 | mut pinned [Pin, &ref] | provenance | | -| test.rs:413:39:413:50 | &mut reader2 [&ref] | test.rs:413:30:413:51 | ...::new(...) | provenance | MaD:10 | -| test.rs:413:39:413:50 | &mut reader2 [&ref] | test.rs:413:30:413:51 | ...::new(...) [Pin, &ref] | provenance | MaD:11 | +| test.rs:413:39:413:50 | &mut reader2 [&ref] | test.rs:413:30:413:51 | ...::new(...) | provenance | MaD:12 | +| test.rs:413:39:413:50 | &mut reader2 [&ref] | test.rs:413:30:413:51 | ...::new(...) [Pin, &ref] | provenance | MaD:13 | | test.rs:413:44:413:50 | reader2 | test.rs:413:39:413:50 | &mut reader2 [&ref] | provenance | | | test.rs:414:19:414:24 | pinned | test.rs:414:18:414:24 | &pinned | provenance | | | test.rs:414:19:414:24 | pinned [Pin, &ref] | test.rs:414:18:414:24 | &pinned | provenance | | | test.rs:416:17:416:22 | buffer [Ready, Ok] | test.rs:417:20:417:39 | ...::Ready(...) [Ready, Ok] | provenance | | | test.rs:416:17:416:22 | buffer [Ready, Ok] | test.rs:418:23:418:28 | buffer [Ready, Ok] | provenance | | -| test.rs:416:26:416:31 | pinned | test.rs:416:26:416:54 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:31 | +| test.rs:416:26:416:31 | pinned | test.rs:416:26:416:54 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:15 | | test.rs:416:26:416:54 | pinned.poll_fill_buf(...) [Ready, Ok] | test.rs:416:17:416:22 | buffer [Ready, Ok] | provenance | | | test.rs:417:20:417:39 | ...::Ready(...) [Ready, Ok] | test.rs:417:32:417:38 | Ok(...) [Ok] | provenance | | | test.rs:417:32:417:38 | Ok(...) [Ok] | test.rs:417:35:417:37 | buf | provenance | | | test.rs:417:35:417:37 | buf | test.rs:419:22:419:24 | buf | provenance | | | test.rs:418:23:418:28 | buffer [Ready, Ok] | test.rs:418:22:418:28 | &buffer | provenance | | | test.rs:423:17:423:23 | buffer2 [Ready, Ok] | test.rs:424:20:424:26 | buffer2 [Ready, Ok] | provenance | | -| test.rs:423:27:423:48 | ...::new(...) | test.rs:423:27:423:71 | ... .poll_fill_buf(...) [Ready, Ok] | provenance | MaD:31 | +| test.rs:423:27:423:48 | ...::new(...) | test.rs:423:27:423:71 | ... .poll_fill_buf(...) [Ready, Ok] | provenance | MaD:15 | | test.rs:423:27:423:71 | ... .poll_fill_buf(...) [Ready, Ok] | test.rs:423:17:423:23 | buffer2 [Ready, Ok] | provenance | | -| test.rs:423:36:423:47 | &mut reader2 [&ref] | test.rs:423:27:423:48 | ...::new(...) | provenance | MaD:10 | +| test.rs:423:36:423:47 | &mut reader2 [&ref] | test.rs:423:27:423:48 | ...::new(...) | provenance | MaD:12 | | test.rs:423:41:423:47 | reader2 | test.rs:423:36:423:47 | &mut reader2 [&ref] | provenance | | | test.rs:424:20:424:26 | buffer2 [Ready, Ok] | test.rs:425:17:425:36 | ...::Ready(...) [Ready, Ok] | provenance | | | test.rs:424:20:424:26 | buffer2 [Ready, Ok] | test.rs:426:27:426:33 | buffer2 [Ready, Ok] | provenance | | @@ -298,7 +298,7 @@ edges | test.rs:425:32:425:34 | buf | test.rs:427:26:427:28 | buf | provenance | | | test.rs:426:27:426:33 | buffer2 [Ready, Ok] | test.rs:426:26:426:33 | &buffer2 | provenance | | | test.rs:437:17:437:22 | buffer | test.rs:438:18:438:23 | buffer | provenance | | -| test.rs:437:26:437:32 | reader2 | test.rs:437:26:437:43 | reader2.fill_buf() [future, Ok] | provenance | MaD:33 | +| test.rs:437:26:437:32 | reader2 | test.rs:437:26:437:43 | reader2.fill_buf() [future, Ok] | provenance | MaD:18 | | test.rs:437:26:437:43 | reader2.fill_buf() [future, Ok] | test.rs:437:26:437:49 | await ... [Ok] | provenance | | | test.rs:437:26:437:49 | await ... [Ok] | test.rs:437:26:437:50 | TryExpr | provenance | | | test.rs:437:26:437:50 | TryExpr | test.rs:437:17:437:22 | buffer | provenance | | @@ -307,64 +307,64 @@ edges | test.rs:444:17:444:26 | mut pinned [Pin, &ref] | test.rs:445:19:445:24 | pinned [Pin, &ref] | provenance | | | test.rs:444:30:444:51 | ...::new(...) | test.rs:444:17:444:26 | mut pinned | provenance | | | test.rs:444:30:444:51 | ...::new(...) [Pin, &ref] | test.rs:444:17:444:26 | mut pinned [Pin, &ref] | provenance | | -| test.rs:444:39:444:50 | &mut reader2 [&ref] | test.rs:444:30:444:51 | ...::new(...) | provenance | MaD:10 | -| test.rs:444:39:444:50 | &mut reader2 [&ref] | test.rs:444:30:444:51 | ...::new(...) [Pin, &ref] | provenance | MaD:11 | +| test.rs:444:39:444:50 | &mut reader2 [&ref] | test.rs:444:30:444:51 | ...::new(...) | provenance | MaD:12 | +| test.rs:444:39:444:50 | &mut reader2 [&ref] | test.rs:444:30:444:51 | ...::new(...) [Pin, &ref] | provenance | MaD:13 | | test.rs:444:44:444:50 | reader2 | test.rs:444:39:444:50 | &mut reader2 [&ref] | provenance | | | test.rs:445:19:445:24 | pinned | test.rs:445:18:445:24 | &pinned | provenance | | | test.rs:445:19:445:24 | pinned [Pin, &ref] | test.rs:445:18:445:24 | &pinned | provenance | | -| test.rs:447:30:447:35 | pinned | test.rs:447:56:447:66 | [post] &mut buffer [&ref] | provenance | MaD:32 | +| test.rs:447:30:447:35 | pinned | test.rs:447:56:447:66 | [post] &mut buffer [&ref] | provenance | MaD:16 | | test.rs:447:56:447:66 | [post] &mut buffer [&ref] | test.rs:447:61:447:66 | [post] buffer | provenance | | | test.rs:447:61:447:66 | [post] buffer | test.rs:448:19:448:24 | buffer | provenance | | | test.rs:447:61:447:66 | [post] buffer | test.rs:450:23:450:28 | buffer | provenance | | | test.rs:447:61:447:66 | [post] buffer | test.rs:450:23:450:33 | buffer[...] | provenance | | | test.rs:448:19:448:24 | buffer | test.rs:448:18:448:24 | &buffer | provenance | | -| test.rs:450:23:450:28 | buffer | test.rs:450:23:450:33 | buffer[...] | provenance | MaD:30 | +| test.rs:450:23:450:28 | buffer | test.rs:450:23:450:33 | buffer[...] | provenance | MaD:10 | | test.rs:450:23:450:33 | buffer[...] | test.rs:450:22:450:33 | &... | provenance | | -| test.rs:457:63:457:74 | &mut reader2 [&ref] | test.rs:457:77:457:88 | [post] &mut buffer1 [&ref] | provenance | MaD:36 | +| test.rs:457:63:457:74 | &mut reader2 [&ref] | test.rs:457:77:457:88 | [post] &mut buffer1 [&ref] | provenance | MaD:21 | | test.rs:457:68:457:74 | reader2 | test.rs:457:63:457:74 | &mut reader2 [&ref] | provenance | | | test.rs:457:77:457:88 | [post] &mut buffer1 [&ref] | test.rs:457:82:457:88 | [post] buffer1 | provenance | | | test.rs:457:82:457:88 | [post] buffer1 | test.rs:458:19:458:25 | buffer1 | provenance | | | test.rs:457:82:457:88 | [post] buffer1 | test.rs:458:19:458:40 | buffer1[...] | provenance | | -| test.rs:458:19:458:25 | buffer1 | test.rs:458:19:458:40 | buffer1[...] | provenance | MaD:30 | +| test.rs:458:19:458:25 | buffer1 | test.rs:458:19:458:40 | buffer1[...] | provenance | MaD:10 | | test.rs:458:19:458:40 | buffer1[...] | test.rs:458:18:458:40 | &... | provenance | | -| test.rs:461:31:461:37 | reader2 | test.rs:461:44:461:55 | [post] &mut buffer2 [&ref] | provenance | MaD:36 | +| test.rs:461:31:461:37 | reader2 | test.rs:461:44:461:55 | [post] &mut buffer2 [&ref] | provenance | MaD:21 | | test.rs:461:44:461:55 | [post] &mut buffer2 [&ref] | test.rs:461:49:461:55 | [post] buffer2 | provenance | | | test.rs:461:49:461:55 | [post] buffer2 | test.rs:462:19:462:25 | buffer2 | provenance | | | test.rs:461:49:461:55 | [post] buffer2 | test.rs:462:19:462:40 | buffer2[...] | provenance | | -| test.rs:462:19:462:25 | buffer2 | test.rs:462:19:462:40 | buffer2[...] | provenance | MaD:30 | +| test.rs:462:19:462:25 | buffer2 | test.rs:462:19:462:40 | buffer2[...] | provenance | MaD:10 | | test.rs:462:19:462:40 | buffer2[...] | test.rs:462:18:462:40 | &... | provenance | | | test.rs:467:17:467:26 | mut pinned | test.rs:468:19:468:24 | pinned | provenance | | | test.rs:467:17:467:26 | mut pinned | test.rs:470:26:470:31 | pinned | provenance | | | test.rs:467:17:467:26 | mut pinned [Pin, &ref] | test.rs:468:19:468:24 | pinned [Pin, &ref] | provenance | | | test.rs:467:30:467:51 | ...::new(...) | test.rs:467:17:467:26 | mut pinned | provenance | | | test.rs:467:30:467:51 | ...::new(...) [Pin, &ref] | test.rs:467:17:467:26 | mut pinned [Pin, &ref] | provenance | | -| test.rs:467:39:467:50 | &mut reader2 [&ref] | test.rs:467:30:467:51 | ...::new(...) | provenance | MaD:10 | -| test.rs:467:39:467:50 | &mut reader2 [&ref] | test.rs:467:30:467:51 | ...::new(...) [Pin, &ref] | provenance | MaD:11 | +| test.rs:467:39:467:50 | &mut reader2 [&ref] | test.rs:467:30:467:51 | ...::new(...) | provenance | MaD:12 | +| test.rs:467:39:467:50 | &mut reader2 [&ref] | test.rs:467:30:467:51 | ...::new(...) [Pin, &ref] | provenance | MaD:13 | | test.rs:467:44:467:50 | reader2 | test.rs:467:39:467:50 | &mut reader2 [&ref] | provenance | | | test.rs:468:19:468:24 | pinned | test.rs:468:18:468:24 | &pinned | provenance | | | test.rs:468:19:468:24 | pinned [Pin, &ref] | test.rs:468:18:468:24 | &pinned | provenance | | | test.rs:470:17:470:22 | buffer [Ready, Ok] | test.rs:471:19:471:24 | buffer [Ready, Ok] | provenance | | | test.rs:470:17:470:22 | buffer [Ready, Ok] | test.rs:472:20:472:39 | ...::Ready(...) [Ready, Ok] | provenance | | -| test.rs:470:26:470:31 | pinned | test.rs:470:26:470:54 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:31 | +| test.rs:470:26:470:31 | pinned | test.rs:470:26:470:54 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:15 | | test.rs:470:26:470:54 | pinned.poll_fill_buf(...) [Ready, Ok] | test.rs:470:17:470:22 | buffer [Ready, Ok] | provenance | | | test.rs:471:19:471:24 | buffer [Ready, Ok] | test.rs:471:18:471:24 | &buffer | provenance | | | test.rs:472:20:472:39 | ...::Ready(...) [Ready, Ok] | test.rs:472:32:472:38 | Ok(...) [Ok] | provenance | | | test.rs:472:32:472:38 | Ok(...) [Ok] | test.rs:472:35:472:37 | buf | provenance | | | test.rs:472:35:472:37 | buf | test.rs:473:22:473:24 | buf | provenance | | | test.rs:479:17:479:22 | buffer | test.rs:480:18:480:23 | buffer | provenance | | -| test.rs:479:26:479:32 | reader2 | test.rs:479:26:479:43 | reader2.fill_buf() [future, Ok] | provenance | MaD:33 | +| test.rs:479:26:479:32 | reader2 | test.rs:479:26:479:43 | reader2.fill_buf() [future, Ok] | provenance | MaD:18 | | test.rs:479:26:479:43 | reader2.fill_buf() [future, Ok] | test.rs:479:26:479:49 | await ... [Ok] | provenance | | | test.rs:479:26:479:49 | await ... [Ok] | test.rs:479:26:479:50 | TryExpr | provenance | | | test.rs:479:26:479:50 | TryExpr | test.rs:479:17:479:22 | buffer | provenance | | -| test.rs:486:31:486:37 | reader2 | test.rs:486:57:486:65 | [post] &mut line [&ref] | provenance | MaD:35 | +| test.rs:486:31:486:37 | reader2 | test.rs:486:57:486:65 | [post] &mut line [&ref] | provenance | MaD:20 | | test.rs:486:57:486:65 | [post] &mut line [&ref] | test.rs:486:62:486:65 | [post] line | provenance | | | test.rs:486:62:486:65 | [post] line | test.rs:487:19:487:22 | line | provenance | | | test.rs:487:19:487:22 | line | test.rs:487:18:487:22 | &line | provenance | | -| test.rs:493:31:493:37 | reader2 | test.rs:493:49:493:57 | [post] &mut line [&ref] | provenance | MaD:34 | +| test.rs:493:31:493:37 | reader2 | test.rs:493:49:493:57 | [post] &mut line [&ref] | provenance | MaD:19 | | test.rs:493:49:493:57 | [post] &mut line [&ref] | test.rs:493:54:493:57 | [post] line | provenance | | | test.rs:493:54:493:57 | [post] line | test.rs:494:19:494:22 | line | provenance | | | test.rs:494:19:494:22 | line | test.rs:494:18:494:22 | &line | provenance | | -| test.rs:500:31:500:37 | reader2 | test.rs:500:51:500:61 | [post] &mut buffer [&ref] | provenance | MaD:37 | +| test.rs:500:31:500:37 | reader2 | test.rs:500:51:500:61 | [post] &mut buffer [&ref] | provenance | MaD:22 | | test.rs:500:51:500:61 | [post] &mut buffer [&ref] | test.rs:500:56:500:61 | [post] buffer | provenance | | | test.rs:500:56:500:61 | [post] buffer | test.rs:501:19:501:24 | buffer | provenance | | | test.rs:501:19:501:24 | buffer | test.rs:501:18:501:24 | &buffer | provenance | | diff --git a/rust/ql/test/library-tests/dataflow/sources/stdin/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/stdin/InlineFlow.expected index 02ca3cbc184d..ee6f7abf3bca 100644 --- a/rust/ql/test/library-tests/dataflow/sources/stdin/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/stdin/InlineFlow.expected @@ -1,161 +1,161 @@ models | 1 | Source: std::io::stdio::stdin; ReturnValue; stdin | | 2 | Source: tokio::io::stdin::stdin; ReturnValue; stdin | -| 3 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 4 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 5 | Summary: ::next; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; value | -| 6 | Summary: ::fill_buf; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 7 | Summary: ::buffer; Argument[self].Reference; ReturnValue.Reference; taint | -| 8 | Summary: ::new; Argument[0]; ReturnValue; taint | -| 9 | Summary: ::read; Argument[self].Reference; Argument[0].Reference; taint | -| 10 | Summary: ::read_exact; Argument[self].Reference; Argument[0].Reference; taint | -| 11 | Summary: ::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | -| 12 | Summary: ::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | -| 13 | Summary: ::lock; Argument[self].Reference; ReturnValue; taint | -| 14 | Summary: ::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | -| 15 | Summary: ::buffer; Argument[self].Reference; ReturnValue.Reference; taint | -| 16 | Summary: ::new; Argument[0]; ReturnValue; taint | -| 17 | Summary: ::next_line; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | -| 18 | Summary: ::next_segment; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | -| 19 | Summary: core::clone::Clone::clone; Argument[self].Reference; ReturnValue; value | -| 20 | Summary: core::iter::traits::iterator::Iterator::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 21 | Summary: core::ops::index::Index::index; Argument[self].Reference.Element; ReturnValue.Reference; value | -| 22 | Summary: std::io::BufRead::lines; Argument[self]; ReturnValue; taint | -| 23 | Summary: std::io::BufRead::read_line; Argument[self].Reference; Argument[0].Reference; taint | -| 24 | Summary: std::io::BufRead::read_until; Argument[self].Reference; Argument[1].Reference; taint | -| 25 | Summary: std::io::BufRead::split; Argument[self]; ReturnValue; taint | -| 26 | Summary: std::io::Read::bytes; Argument[self]; ReturnValue; taint | -| 27 | Summary: tokio::io::util::async_buf_read_ext::AsyncBufReadExt::fill_buf; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 28 | Summary: tokio::io::util::async_buf_read_ext::AsyncBufReadExt::lines; Argument[self]; ReturnValue; taint | -| 29 | Summary: tokio::io::util::async_buf_read_ext::AsyncBufReadExt::read_line; Argument[self].Reference; Argument[0].Reference; taint | -| 30 | Summary: tokio::io::util::async_buf_read_ext::AsyncBufReadExt::read_until; Argument[self].Reference; Argument[1].Reference; taint | -| 31 | Summary: tokio::io::util::async_buf_read_ext::AsyncBufReadExt::split; Argument[self]; ReturnValue; taint | -| 32 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read; Argument[self].Reference; Argument[0].Reference; taint | -| 33 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_buf; Argument[self].Reference; Argument[0].Reference; taint | -| 34 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_exact; Argument[self].Reference; Argument[0].Reference; taint | -| 35 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_f32; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 36 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_i16; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 37 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_i64_le; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 38 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | -| 39 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | -| 40 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_u8; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 3 | Summary: ::clone; Argument[self].Reference; ReturnValue; value | +| 4 | Summary: ::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 5 | Summary: ::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 6 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 7 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 8 | Summary: ::lines; Argument[self]; ReturnValue; taint | +| 9 | Summary: ::read_line; Argument[self].Reference; Argument[0].Reference; taint | +| 10 | Summary: ::read_until; Argument[self].Reference; Argument[1].Reference; taint | +| 11 | Summary: ::split; Argument[self]; ReturnValue; taint | +| 12 | Summary: ::bytes; Argument[self]; ReturnValue; taint | +| 13 | Summary: ::next; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; value | +| 14 | Summary: ::fill_buf; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 15 | Summary: ::buffer; Argument[self].Reference; ReturnValue.Reference; taint | +| 16 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 17 | Summary: ::read; Argument[self].Reference; Argument[0].Reference; taint | +| 18 | Summary: ::read_exact; Argument[self].Reference; Argument[0].Reference; taint | +| 19 | Summary: ::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | +| 20 | Summary: ::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | +| 21 | Summary: ::lock; Argument[self].Reference; ReturnValue; taint | +| 22 | Summary: ::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | +| 23 | Summary: ::fill_buf; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 24 | Summary: ::lines; Argument[self]; ReturnValue; taint | +| 25 | Summary: ::read_line; Argument[self].Reference; Argument[0].Reference; taint | +| 26 | Summary: ::read_until; Argument[self].Reference; Argument[1].Reference; taint | +| 27 | Summary: ::split; Argument[self]; ReturnValue; taint | +| 28 | Summary: ::read; Argument[self].Reference; Argument[0].Reference; taint | +| 29 | Summary: ::read_buf; Argument[self].Reference; Argument[0].Reference; taint | +| 30 | Summary: ::read_exact; Argument[self].Reference; Argument[0].Reference; taint | +| 31 | Summary: ::read_f32; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 32 | Summary: ::read_i16; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 33 | Summary: ::read_i64_le; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 34 | Summary: ::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | +| 35 | Summary: ::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | +| 36 | Summary: ::read_u8; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 37 | Summary: ::buffer; Argument[self].Reference; ReturnValue.Reference; taint | +| 38 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 39 | Summary: ::next_line; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | +| 40 | Summary: ::next_segment; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | edges | test.rs:13:22:13:37 | ...::stdin(...) | test.rs:13:22:13:37 | ...::stdin(...) | provenance | Src:MaD:1 | -| test.rs:13:22:13:37 | ...::stdin(...) | test.rs:13:44:13:54 | [post] &mut buffer [&ref] | provenance | MaD:9 | +| test.rs:13:22:13:37 | ...::stdin(...) | test.rs:13:44:13:54 | [post] &mut buffer [&ref] | provenance | MaD:17 | | test.rs:13:44:13:54 | [post] &mut buffer [&ref] | test.rs:13:49:13:54 | [post] buffer | provenance | | | test.rs:13:49:13:54 | [post] buffer | test.rs:14:15:14:20 | buffer | provenance | | | test.rs:14:15:14:20 | buffer | test.rs:14:14:14:20 | &buffer | provenance | | | test.rs:19:22:19:37 | ...::stdin(...) | test.rs:19:22:19:37 | ...::stdin(...) | provenance | Src:MaD:1 | -| test.rs:19:22:19:37 | ...::stdin(...) | test.rs:19:51:19:61 | [post] &mut buffer [&ref] | provenance | MaD:11 | +| test.rs:19:22:19:37 | ...::stdin(...) | test.rs:19:51:19:61 | [post] &mut buffer [&ref] | provenance | MaD:19 | | test.rs:19:51:19:61 | [post] &mut buffer [&ref] | test.rs:19:56:19:61 | [post] buffer | provenance | | | test.rs:19:56:19:61 | [post] buffer | test.rs:20:15:20:20 | buffer | provenance | | | test.rs:20:15:20:20 | buffer | test.rs:20:14:20:20 | &buffer | provenance | | | test.rs:25:22:25:37 | ...::stdin(...) | test.rs:25:22:25:37 | ...::stdin(...) | provenance | Src:MaD:1 | -| test.rs:25:22:25:37 | ...::stdin(...) | test.rs:25:54:25:64 | [post] &mut buffer [&ref] | provenance | MaD:12 | +| test.rs:25:22:25:37 | ...::stdin(...) | test.rs:25:54:25:64 | [post] &mut buffer [&ref] | provenance | MaD:20 | | test.rs:25:54:25:64 | [post] &mut buffer [&ref] | test.rs:25:59:25:64 | [post] buffer | provenance | | | test.rs:25:59:25:64 | [post] buffer | test.rs:26:15:26:20 | buffer | provenance | | | test.rs:26:15:26:20 | buffer | test.rs:26:14:26:20 | &buffer | provenance | | | test.rs:31:22:31:37 | ...::stdin(...) | test.rs:31:22:31:37 | ...::stdin(...) | provenance | Src:MaD:1 | -| test.rs:31:22:31:37 | ...::stdin(...) | test.rs:31:22:31:44 | ... .lock() | provenance | MaD:13 | -| test.rs:31:22:31:44 | ... .lock() | test.rs:31:61:31:71 | [post] &mut buffer [&ref] | provenance | MaD:14 | +| test.rs:31:22:31:37 | ...::stdin(...) | test.rs:31:22:31:44 | ... .lock() | provenance | MaD:21 | +| test.rs:31:22:31:44 | ... .lock() | test.rs:31:61:31:71 | [post] &mut buffer [&ref] | provenance | MaD:22 | | test.rs:31:61:31:71 | [post] &mut buffer [&ref] | test.rs:31:66:31:71 | [post] buffer | provenance | | | test.rs:31:66:31:71 | [post] buffer | test.rs:32:15:32:20 | buffer | provenance | | | test.rs:32:15:32:20 | buffer | test.rs:32:14:32:20 | &buffer | provenance | | | test.rs:37:9:37:24 | ...::stdin(...) | test.rs:37:9:37:24 | ...::stdin(...) | provenance | Src:MaD:1 | -| test.rs:37:9:37:24 | ...::stdin(...) | test.rs:37:37:37:47 | [post] &mut buffer [&ref] | provenance | MaD:10 | +| test.rs:37:9:37:24 | ...::stdin(...) | test.rs:37:37:37:47 | [post] &mut buffer [&ref] | provenance | MaD:18 | | test.rs:37:37:37:47 | [post] &mut buffer [&ref] | test.rs:37:42:37:47 | [post] buffer | provenance | | | test.rs:37:42:37:47 | [post] buffer | test.rs:38:15:38:20 | buffer | provenance | | | test.rs:38:15:38:20 | buffer | test.rs:38:14:38:20 | &buffer | provenance | | | test.rs:41:17:41:32 | ...::stdin(...) | test.rs:41:17:41:32 | ...::stdin(...) | provenance | Src:MaD:1 | -| test.rs:41:17:41:32 | ...::stdin(...) | test.rs:41:17:41:40 | ... .bytes() | provenance | MaD:26 | +| test.rs:41:17:41:32 | ...::stdin(...) | test.rs:41:17:41:40 | ... .bytes() | provenance | MaD:12 | | test.rs:41:17:41:40 | ... .bytes() | test.rs:42:14:42:17 | byte | provenance | | | test.rs:48:13:48:22 | mut reader | test.rs:49:20:49:25 | reader | provenance | | | test.rs:48:26:48:66 | ...::new(...) | test.rs:48:13:48:22 | mut reader | provenance | | -| test.rs:48:50:48:65 | ...::stdin(...) | test.rs:48:26:48:66 | ...::new(...) | provenance | MaD:8 | +| test.rs:48:50:48:65 | ...::stdin(...) | test.rs:48:26:48:66 | ...::new(...) | provenance | MaD:16 | | test.rs:48:50:48:65 | ...::stdin(...) | test.rs:48:50:48:65 | ...::stdin(...) | provenance | Src:MaD:1 | | test.rs:49:13:49:16 | data | test.rs:50:15:50:18 | data | provenance | | -| test.rs:49:20:49:25 | reader | test.rs:49:20:49:36 | reader.fill_buf() [Ok] | provenance | MaD:6 | +| test.rs:49:20:49:25 | reader | test.rs:49:20:49:36 | reader.fill_buf() [Ok] | provenance | MaD:14 | | test.rs:49:20:49:36 | reader.fill_buf() [Ok] | test.rs:49:20:49:37 | TryExpr | provenance | | | test.rs:49:20:49:37 | TryExpr | test.rs:49:13:49:16 | data | provenance | | | test.rs:50:15:50:18 | data | test.rs:50:14:50:18 | &data | provenance | | | test.rs:54:13:54:18 | reader | test.rs:55:20:55:25 | reader | provenance | | | test.rs:54:22:54:62 | ...::new(...) | test.rs:54:13:54:18 | reader | provenance | | -| test.rs:54:46:54:61 | ...::stdin(...) | test.rs:54:22:54:62 | ...::new(...) | provenance | MaD:8 | +| test.rs:54:46:54:61 | ...::stdin(...) | test.rs:54:22:54:62 | ...::new(...) | provenance | MaD:16 | | test.rs:54:46:54:61 | ...::stdin(...) | test.rs:54:46:54:61 | ...::stdin(...) | provenance | Src:MaD:1 | | test.rs:55:13:55:16 | data [&ref] | test.rs:56:15:56:18 | data [&ref] | provenance | | -| test.rs:55:20:55:25 | reader | test.rs:55:20:55:34 | reader.buffer() [&ref] | provenance | MaD:7 | +| test.rs:55:20:55:25 | reader | test.rs:55:20:55:34 | reader.buffer() [&ref] | provenance | MaD:15 | | test.rs:55:20:55:34 | reader.buffer() [&ref] | test.rs:55:13:55:16 | data [&ref] | provenance | | | test.rs:56:15:56:18 | data [&ref] | test.rs:56:14:56:18 | &data | provenance | | | test.rs:61:13:61:22 | mut reader | test.rs:62:9:62:14 | reader | provenance | | | test.rs:61:26:61:66 | ...::new(...) | test.rs:61:13:61:22 | mut reader | provenance | | -| test.rs:61:50:61:65 | ...::stdin(...) | test.rs:61:26:61:66 | ...::new(...) | provenance | MaD:8 | +| test.rs:61:50:61:65 | ...::stdin(...) | test.rs:61:26:61:66 | ...::new(...) | provenance | MaD:16 | | test.rs:61:50:61:65 | ...::stdin(...) | test.rs:61:50:61:65 | ...::stdin(...) | provenance | Src:MaD:1 | -| test.rs:62:9:62:14 | reader | test.rs:62:26:62:36 | [post] &mut buffer [&ref] | provenance | MaD:23 | +| test.rs:62:9:62:14 | reader | test.rs:62:26:62:36 | [post] &mut buffer [&ref] | provenance | MaD:9 | | test.rs:62:26:62:36 | [post] &mut buffer [&ref] | test.rs:62:31:62:36 | [post] buffer | provenance | | | test.rs:62:31:62:36 | [post] buffer | test.rs:63:15:63:20 | buffer | provenance | | | test.rs:63:15:63:20 | buffer | test.rs:63:14:63:20 | &buffer | provenance | | | test.rs:68:13:68:22 | mut reader | test.rs:69:9:69:14 | reader | provenance | | | test.rs:68:26:68:66 | ...::new(...) | test.rs:68:13:68:22 | mut reader | provenance | | -| test.rs:68:50:68:65 | ...::stdin(...) | test.rs:68:26:68:66 | ...::new(...) | provenance | MaD:8 | +| test.rs:68:50:68:65 | ...::stdin(...) | test.rs:68:26:68:66 | ...::new(...) | provenance | MaD:16 | | test.rs:68:50:68:65 | ...::stdin(...) | test.rs:68:50:68:65 | ...::stdin(...) | provenance | Src:MaD:1 | -| test.rs:69:9:69:14 | reader | test.rs:69:33:69:43 | [post] &mut buffer [&ref] | provenance | MaD:24 | +| test.rs:69:9:69:14 | reader | test.rs:69:33:69:43 | [post] &mut buffer [&ref] | provenance | MaD:10 | | test.rs:69:33:69:43 | [post] &mut buffer [&ref] | test.rs:69:38:69:43 | [post] buffer | provenance | | | test.rs:69:38:69:43 | [post] buffer | test.rs:70:15:70:20 | buffer | provenance | | | test.rs:69:38:69:43 | [post] buffer | test.rs:71:14:71:19 | buffer | provenance | | | test.rs:70:15:70:20 | buffer | test.rs:70:14:70:20 | &buffer | provenance | | -| test.rs:71:14:71:19 | buffer | test.rs:71:14:71:22 | buffer[0] | provenance | MaD:21 | +| test.rs:71:14:71:19 | buffer | test.rs:71:14:71:22 | buffer[0] | provenance | MaD:5 | | test.rs:75:13:75:28 | mut reader_split | test.rs:76:14:76:25 | reader_split | provenance | | | test.rs:75:13:75:28 | mut reader_split | test.rs:77:33:77:44 | reader_split | provenance | | -| test.rs:75:32:75:72 | ...::new(...) | test.rs:75:32:75:84 | ... .split(...) | provenance | MaD:25 | +| test.rs:75:32:75:72 | ...::new(...) | test.rs:75:32:75:84 | ... .split(...) | provenance | MaD:11 | | test.rs:75:32:75:84 | ... .split(...) | test.rs:75:13:75:28 | mut reader_split | provenance | | -| test.rs:75:56:75:71 | ...::stdin(...) | test.rs:75:32:75:72 | ...::new(...) | provenance | MaD:8 | +| test.rs:75:56:75:71 | ...::stdin(...) | test.rs:75:32:75:72 | ...::new(...) | provenance | MaD:16 | | test.rs:75:56:75:71 | ...::stdin(...) | test.rs:75:56:75:71 | ...::stdin(...) | provenance | Src:MaD:1 | -| test.rs:76:14:76:25 | reader_split | test.rs:76:14:76:32 | reader_split.next() [Some, Ok] | provenance | MaD:5 | -| test.rs:76:14:76:32 | reader_split.next() [Some, Ok] | test.rs:76:14:76:41 | ... .unwrap() [Ok] | provenance | MaD:3 | -| test.rs:76:14:76:41 | ... .unwrap() [Ok] | test.rs:76:14:76:50 | ... .unwrap() | provenance | MaD:4 | +| test.rs:76:14:76:25 | reader_split | test.rs:76:14:76:32 | reader_split.next() [Some, Ok] | provenance | MaD:13 | +| test.rs:76:14:76:32 | reader_split.next() [Some, Ok] | test.rs:76:14:76:41 | ... .unwrap() [Ok] | provenance | MaD:6 | +| test.rs:76:14:76:41 | ... .unwrap() [Ok] | test.rs:76:14:76:50 | ... .unwrap() | provenance | MaD:7 | | test.rs:77:19:77:29 | Some(...) [Some, Ok] | test.rs:77:24:77:28 | chunk [Ok] | provenance | | | test.rs:77:24:77:28 | chunk [Ok] | test.rs:78:18:78:22 | chunk [Ok] | provenance | | -| test.rs:77:33:77:44 | reader_split | test.rs:77:33:77:51 | reader_split.next() [Some, Ok] | provenance | MaD:5 | +| test.rs:77:33:77:44 | reader_split | test.rs:77:33:77:51 | reader_split.next() [Some, Ok] | provenance | MaD:13 | | test.rs:77:33:77:51 | reader_split.next() [Some, Ok] | test.rs:77:19:77:29 | Some(...) [Some, Ok] | provenance | | -| test.rs:78:18:78:22 | chunk [Ok] | test.rs:78:18:78:31 | chunk.unwrap() | provenance | MaD:4 | +| test.rs:78:18:78:22 | chunk [Ok] | test.rs:78:18:78:31 | chunk.unwrap() | provenance | MaD:7 | | test.rs:83:13:83:18 | reader | test.rs:84:21:84:26 | reader | provenance | | | test.rs:83:22:83:62 | ...::new(...) | test.rs:83:13:83:18 | reader | provenance | | -| test.rs:83:46:83:61 | ...::stdin(...) | test.rs:83:22:83:62 | ...::new(...) | provenance | MaD:8 | +| test.rs:83:46:83:61 | ...::stdin(...) | test.rs:83:22:83:62 | ...::new(...) | provenance | MaD:16 | | test.rs:83:46:83:61 | ...::stdin(...) | test.rs:83:46:83:61 | ...::stdin(...) | provenance | Src:MaD:1 | -| test.rs:84:21:84:26 | reader | test.rs:84:21:84:34 | reader.lines() | provenance | MaD:22 | +| test.rs:84:21:84:26 | reader | test.rs:84:21:84:34 | reader.lines() | provenance | MaD:8 | | test.rs:84:21:84:34 | reader.lines() | test.rs:85:18:85:21 | line | provenance | | | test.rs:90:13:90:18 | reader | test.rs:91:20:91:25 | reader | provenance | | | test.rs:90:22:90:62 | ...::new(...) | test.rs:90:13:90:18 | reader | provenance | | -| test.rs:90:46:90:61 | ...::stdin(...) | test.rs:90:22:90:62 | ...::new(...) | provenance | MaD:8 | +| test.rs:90:46:90:61 | ...::stdin(...) | test.rs:90:22:90:62 | ...::new(...) | provenance | MaD:16 | | test.rs:90:46:90:61 | ...::stdin(...) | test.rs:90:46:90:61 | ...::stdin(...) | provenance | Src:MaD:1 | | test.rs:91:13:91:16 | line | test.rs:92:14:92:17 | line | provenance | | -| test.rs:91:20:91:25 | reader | test.rs:91:20:91:33 | reader.lines() | provenance | MaD:22 | -| test.rs:91:20:91:33 | reader.lines() | test.rs:91:20:91:40 | ... .nth(...) [Some] | provenance | MaD:20 | -| test.rs:91:20:91:40 | ... .nth(...) [Some] | test.rs:91:20:91:49 | ... .unwrap() | provenance | MaD:3 | +| test.rs:91:20:91:25 | reader | test.rs:91:20:91:33 | reader.lines() | provenance | MaD:8 | +| test.rs:91:20:91:33 | reader.lines() | test.rs:91:20:91:40 | ... .nth(...) [Some] | provenance | MaD:4 | +| test.rs:91:20:91:40 | ... .nth(...) [Some] | test.rs:91:20:91:49 | ... .unwrap() | provenance | MaD:6 | | test.rs:91:20:91:49 | ... .unwrap() | test.rs:91:13:91:16 | line | provenance | | -| test.rs:92:14:92:17 | line | test.rs:92:14:92:26 | line.unwrap() | provenance | MaD:4 | -| test.rs:92:14:92:26 | line.unwrap() | test.rs:92:14:92:34 | ... .clone() | provenance | MaD:19 | +| test.rs:92:14:92:17 | line | test.rs:92:14:92:26 | line.unwrap() | provenance | MaD:7 | +| test.rs:92:14:92:26 | line.unwrap() | test.rs:92:14:92:34 | ... .clone() | provenance | MaD:3 | | test.rs:109:13:109:21 | mut stdin | test.rs:111:22:111:26 | stdin | provenance | | | test.rs:109:25:109:42 | ...::stdin(...) | test.rs:109:13:109:21 | mut stdin | provenance | Src:MaD:2 | -| test.rs:111:22:111:26 | stdin | test.rs:111:33:111:43 | [post] &mut buffer [&ref] | provenance | MaD:32 | +| test.rs:111:22:111:26 | stdin | test.rs:111:33:111:43 | [post] &mut buffer [&ref] | provenance | MaD:28 | | test.rs:111:33:111:43 | [post] &mut buffer [&ref] | test.rs:111:38:111:43 | [post] buffer | provenance | | | test.rs:111:38:111:43 | [post] buffer | test.rs:112:15:112:20 | buffer | provenance | | | test.rs:112:15:112:20 | buffer | test.rs:112:14:112:20 | &buffer | provenance | | | test.rs:116:13:116:21 | mut stdin | test.rs:118:22:118:26 | stdin | provenance | | | test.rs:116:25:116:42 | ...::stdin(...) | test.rs:116:13:116:21 | mut stdin | provenance | Src:MaD:2 | -| test.rs:118:22:118:26 | stdin | test.rs:118:40:118:50 | [post] &mut buffer [&ref] | provenance | MaD:38 | +| test.rs:118:22:118:26 | stdin | test.rs:118:40:118:50 | [post] &mut buffer [&ref] | provenance | MaD:34 | | test.rs:118:40:118:50 | [post] &mut buffer [&ref] | test.rs:118:45:118:50 | [post] buffer | provenance | | | test.rs:118:45:118:50 | [post] buffer | test.rs:119:15:119:20 | buffer | provenance | | | test.rs:119:15:119:20 | buffer | test.rs:119:14:119:20 | &buffer | provenance | | | test.rs:123:13:123:21 | mut stdin | test.rs:125:22:125:26 | stdin | provenance | | | test.rs:123:25:123:42 | ...::stdin(...) | test.rs:123:13:123:21 | mut stdin | provenance | Src:MaD:2 | -| test.rs:125:22:125:26 | stdin | test.rs:125:43:125:53 | [post] &mut buffer [&ref] | provenance | MaD:39 | +| test.rs:125:22:125:26 | stdin | test.rs:125:43:125:53 | [post] &mut buffer [&ref] | provenance | MaD:35 | | test.rs:125:43:125:53 | [post] &mut buffer [&ref] | test.rs:125:48:125:53 | [post] buffer | provenance | | | test.rs:125:48:125:53 | [post] buffer | test.rs:126:15:126:20 | buffer | provenance | | | test.rs:126:15:126:20 | buffer | test.rs:126:14:126:20 | &buffer | provenance | | | test.rs:130:13:130:21 | mut stdin | test.rs:132:9:132:13 | stdin | provenance | | | test.rs:130:25:130:42 | ...::stdin(...) | test.rs:130:13:130:21 | mut stdin | provenance | Src:MaD:2 | -| test.rs:132:9:132:13 | stdin | test.rs:132:26:132:36 | [post] &mut buffer [&ref] | provenance | MaD:34 | +| test.rs:132:9:132:13 | stdin | test.rs:132:26:132:36 | [post] &mut buffer [&ref] | provenance | MaD:30 | | test.rs:132:26:132:36 | [post] &mut buffer [&ref] | test.rs:132:31:132:36 | [post] buffer | provenance | | | test.rs:132:31:132:36 | [post] buffer | test.rs:133:15:133:20 | buffer | provenance | | | test.rs:133:15:133:20 | buffer | test.rs:133:14:133:20 | &buffer | provenance | | @@ -165,98 +165,98 @@ edges | test.rs:137:13:137:21 | mut stdin | test.rs:141:18:141:22 | stdin | provenance | | | test.rs:137:25:137:42 | ...::stdin(...) | test.rs:137:13:137:21 | mut stdin | provenance | Src:MaD:2 | | test.rs:138:13:138:14 | v1 | test.rs:142:14:142:15 | v1 | provenance | | -| test.rs:138:18:138:22 | stdin | test.rs:138:18:138:32 | stdin.read_u8() [future, Ok] | provenance | MaD:40 | +| test.rs:138:18:138:22 | stdin | test.rs:138:18:138:32 | stdin.read_u8() [future, Ok] | provenance | MaD:36 | | test.rs:138:18:138:32 | stdin.read_u8() [future, Ok] | test.rs:138:18:138:38 | await ... [Ok] | provenance | | | test.rs:138:18:138:38 | await ... [Ok] | test.rs:138:18:138:39 | TryExpr | provenance | | | test.rs:138:18:138:39 | TryExpr | test.rs:138:13:138:14 | v1 | provenance | | | test.rs:139:13:139:14 | v2 | test.rs:143:14:143:15 | v2 | provenance | | -| test.rs:139:18:139:22 | stdin | test.rs:139:18:139:33 | stdin.read_i16() [future, Ok] | provenance | MaD:36 | +| test.rs:139:18:139:22 | stdin | test.rs:139:18:139:33 | stdin.read_i16() [future, Ok] | provenance | MaD:32 | | test.rs:139:18:139:33 | stdin.read_i16() [future, Ok] | test.rs:139:18:139:39 | await ... [Ok] | provenance | | | test.rs:139:18:139:39 | await ... [Ok] | test.rs:139:18:139:40 | TryExpr | provenance | | | test.rs:139:18:139:40 | TryExpr | test.rs:139:13:139:14 | v2 | provenance | | | test.rs:140:13:140:14 | v3 | test.rs:144:14:144:15 | v3 | provenance | | -| test.rs:140:18:140:22 | stdin | test.rs:140:18:140:33 | stdin.read_f32() [future, Ok] | provenance | MaD:35 | +| test.rs:140:18:140:22 | stdin | test.rs:140:18:140:33 | stdin.read_f32() [future, Ok] | provenance | MaD:31 | | test.rs:140:18:140:33 | stdin.read_f32() [future, Ok] | test.rs:140:18:140:39 | await ... [Ok] | provenance | | | test.rs:140:18:140:39 | await ... [Ok] | test.rs:140:18:140:40 | TryExpr | provenance | | | test.rs:140:18:140:40 | TryExpr | test.rs:140:13:140:14 | v3 | provenance | | | test.rs:141:13:141:14 | v4 | test.rs:145:14:145:15 | v4 | provenance | | -| test.rs:141:18:141:22 | stdin | test.rs:141:18:141:36 | stdin.read_i64_le() [future, Ok] | provenance | MaD:37 | +| test.rs:141:18:141:22 | stdin | test.rs:141:18:141:36 | stdin.read_i64_le() [future, Ok] | provenance | MaD:33 | | test.rs:141:18:141:36 | stdin.read_i64_le() [future, Ok] | test.rs:141:18:141:42 | await ... [Ok] | provenance | | | test.rs:141:18:141:42 | await ... [Ok] | test.rs:141:18:141:43 | TryExpr | provenance | | | test.rs:141:18:141:43 | TryExpr | test.rs:141:13:141:14 | v4 | provenance | | | test.rs:149:13:149:21 | mut stdin | test.rs:151:9:151:13 | stdin | provenance | | | test.rs:149:25:149:42 | ...::stdin(...) | test.rs:149:13:149:21 | mut stdin | provenance | Src:MaD:2 | -| test.rs:151:9:151:13 | stdin | test.rs:151:24:151:34 | [post] &mut buffer [&ref] | provenance | MaD:33 | +| test.rs:151:9:151:13 | stdin | test.rs:151:24:151:34 | [post] &mut buffer [&ref] | provenance | MaD:29 | | test.rs:151:24:151:34 | [post] &mut buffer [&ref] | test.rs:151:29:151:34 | [post] buffer | provenance | | | test.rs:151:29:151:34 | [post] buffer | test.rs:152:15:152:20 | buffer | provenance | | | test.rs:152:15:152:20 | buffer | test.rs:152:14:152:20 | &buffer | provenance | | | test.rs:158:13:158:22 | mut reader | test.rs:159:20:159:25 | reader | provenance | | | test.rs:158:26:158:70 | ...::new(...) | test.rs:158:13:158:22 | mut reader | provenance | | -| test.rs:158:52:158:69 | ...::stdin(...) | test.rs:158:26:158:70 | ...::new(...) | provenance | MaD:16 | +| test.rs:158:52:158:69 | ...::stdin(...) | test.rs:158:26:158:70 | ...::new(...) | provenance | MaD:38 | | test.rs:158:52:158:69 | ...::stdin(...) | test.rs:158:52:158:69 | ...::stdin(...) | provenance | Src:MaD:2 | | test.rs:159:13:159:16 | data | test.rs:160:15:160:18 | data | provenance | | -| test.rs:159:20:159:25 | reader | test.rs:159:20:159:36 | reader.fill_buf() [future, Ok] | provenance | MaD:27 | +| test.rs:159:20:159:25 | reader | test.rs:159:20:159:36 | reader.fill_buf() [future, Ok] | provenance | MaD:23 | | test.rs:159:20:159:36 | reader.fill_buf() [future, Ok] | test.rs:159:20:159:42 | await ... [Ok] | provenance | | | test.rs:159:20:159:42 | await ... [Ok] | test.rs:159:20:159:43 | TryExpr | provenance | | | test.rs:159:20:159:43 | TryExpr | test.rs:159:13:159:16 | data | provenance | | | test.rs:160:15:160:18 | data | test.rs:160:14:160:18 | &data | provenance | | | test.rs:164:13:164:18 | reader | test.rs:165:20:165:25 | reader | provenance | | | test.rs:164:22:164:66 | ...::new(...) | test.rs:164:13:164:18 | reader | provenance | | -| test.rs:164:48:164:65 | ...::stdin(...) | test.rs:164:22:164:66 | ...::new(...) | provenance | MaD:16 | +| test.rs:164:48:164:65 | ...::stdin(...) | test.rs:164:22:164:66 | ...::new(...) | provenance | MaD:38 | | test.rs:164:48:164:65 | ...::stdin(...) | test.rs:164:48:164:65 | ...::stdin(...) | provenance | Src:MaD:2 | | test.rs:165:13:165:16 | data [&ref] | test.rs:166:15:166:18 | data [&ref] | provenance | | -| test.rs:165:20:165:25 | reader | test.rs:165:20:165:34 | reader.buffer() [&ref] | provenance | MaD:15 | +| test.rs:165:20:165:25 | reader | test.rs:165:20:165:34 | reader.buffer() [&ref] | provenance | MaD:37 | | test.rs:165:20:165:34 | reader.buffer() [&ref] | test.rs:165:13:165:16 | data [&ref] | provenance | | | test.rs:166:15:166:18 | data [&ref] | test.rs:166:14:166:18 | &data | provenance | | | test.rs:171:13:171:22 | mut reader | test.rs:172:9:172:14 | reader | provenance | | | test.rs:171:26:171:70 | ...::new(...) | test.rs:171:13:171:22 | mut reader | provenance | | -| test.rs:171:52:171:69 | ...::stdin(...) | test.rs:171:26:171:70 | ...::new(...) | provenance | MaD:16 | +| test.rs:171:52:171:69 | ...::stdin(...) | test.rs:171:26:171:70 | ...::new(...) | provenance | MaD:38 | | test.rs:171:52:171:69 | ...::stdin(...) | test.rs:171:52:171:69 | ...::stdin(...) | provenance | Src:MaD:2 | -| test.rs:172:9:172:14 | reader | test.rs:172:26:172:36 | [post] &mut buffer [&ref] | provenance | MaD:29 | +| test.rs:172:9:172:14 | reader | test.rs:172:26:172:36 | [post] &mut buffer [&ref] | provenance | MaD:25 | | test.rs:172:26:172:36 | [post] &mut buffer [&ref] | test.rs:172:31:172:36 | [post] buffer | provenance | | | test.rs:172:31:172:36 | [post] buffer | test.rs:173:15:173:20 | buffer | provenance | | | test.rs:173:15:173:20 | buffer | test.rs:173:14:173:20 | &buffer | provenance | | | test.rs:178:13:178:22 | mut reader | test.rs:179:9:179:14 | reader | provenance | | | test.rs:178:26:178:70 | ...::new(...) | test.rs:178:13:178:22 | mut reader | provenance | | -| test.rs:178:52:178:69 | ...::stdin(...) | test.rs:178:26:178:70 | ...::new(...) | provenance | MaD:16 | +| test.rs:178:52:178:69 | ...::stdin(...) | test.rs:178:26:178:70 | ...::new(...) | provenance | MaD:38 | | test.rs:178:52:178:69 | ...::stdin(...) | test.rs:178:52:178:69 | ...::stdin(...) | provenance | Src:MaD:2 | -| test.rs:179:9:179:14 | reader | test.rs:179:33:179:43 | [post] &mut buffer [&ref] | provenance | MaD:30 | +| test.rs:179:9:179:14 | reader | test.rs:179:33:179:43 | [post] &mut buffer [&ref] | provenance | MaD:26 | | test.rs:179:33:179:43 | [post] &mut buffer [&ref] | test.rs:179:38:179:43 | [post] buffer | provenance | | | test.rs:179:38:179:43 | [post] buffer | test.rs:180:15:180:20 | buffer | provenance | | | test.rs:179:38:179:43 | [post] buffer | test.rs:181:14:181:19 | buffer | provenance | | | test.rs:180:15:180:20 | buffer | test.rs:180:14:180:20 | &buffer | provenance | | -| test.rs:181:14:181:19 | buffer | test.rs:181:14:181:22 | buffer[0] | provenance | MaD:21 | +| test.rs:181:14:181:19 | buffer | test.rs:181:14:181:22 | buffer[0] | provenance | MaD:5 | | test.rs:185:13:185:28 | mut reader_split | test.rs:186:14:186:25 | reader_split | provenance | | | test.rs:185:13:185:28 | mut reader_split | test.rs:187:33:187:44 | reader_split | provenance | | -| test.rs:185:32:185:76 | ...::new(...) | test.rs:185:32:185:88 | ... .split(...) | provenance | MaD:31 | +| test.rs:185:32:185:76 | ...::new(...) | test.rs:185:32:185:88 | ... .split(...) | provenance | MaD:27 | | test.rs:185:32:185:88 | ... .split(...) | test.rs:185:13:185:28 | mut reader_split | provenance | | -| test.rs:185:58:185:75 | ...::stdin(...) | test.rs:185:32:185:76 | ...::new(...) | provenance | MaD:16 | +| test.rs:185:58:185:75 | ...::stdin(...) | test.rs:185:32:185:76 | ...::new(...) | provenance | MaD:38 | | test.rs:185:58:185:75 | ...::stdin(...) | test.rs:185:58:185:75 | ...::stdin(...) | provenance | Src:MaD:2 | -| test.rs:186:14:186:25 | reader_split | test.rs:186:14:186:40 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:18 | +| test.rs:186:14:186:25 | reader_split | test.rs:186:14:186:40 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:40 | | test.rs:186:14:186:40 | reader_split.next_segment() [future, Ok, Some] | test.rs:186:14:186:46 | await ... [Ok, Some] | provenance | | | test.rs:186:14:186:46 | await ... [Ok, Some] | test.rs:186:14:186:47 | TryExpr [Some] | provenance | | -| test.rs:186:14:186:47 | TryExpr [Some] | test.rs:186:14:186:56 | ... .unwrap() | provenance | MaD:3 | +| test.rs:186:14:186:47 | TryExpr [Some] | test.rs:186:14:186:56 | ... .unwrap() | provenance | MaD:6 | | test.rs:187:19:187:29 | Some(...) [Some] | test.rs:187:24:187:28 | chunk | provenance | | | test.rs:187:24:187:28 | chunk | test.rs:188:18:188:22 | chunk | provenance | | -| test.rs:187:33:187:44 | reader_split | test.rs:187:33:187:59 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:18 | +| test.rs:187:33:187:44 | reader_split | test.rs:187:33:187:59 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:40 | | test.rs:187:33:187:59 | reader_split.next_segment() [future, Ok, Some] | test.rs:187:33:187:65 | await ... [Ok, Some] | provenance | | | test.rs:187:33:187:65 | await ... [Ok, Some] | test.rs:187:33:187:66 | TryExpr [Some] | provenance | | | test.rs:187:33:187:66 | TryExpr [Some] | test.rs:187:19:187:29 | Some(...) [Some] | provenance | | | test.rs:193:13:193:18 | reader | test.rs:194:25:194:30 | reader | provenance | | | test.rs:193:22:193:66 | ...::new(...) | test.rs:193:13:193:18 | reader | provenance | | -| test.rs:193:48:193:65 | ...::stdin(...) | test.rs:193:22:193:66 | ...::new(...) | provenance | MaD:16 | +| test.rs:193:48:193:65 | ...::stdin(...) | test.rs:193:22:193:66 | ...::new(...) | provenance | MaD:38 | | test.rs:193:48:193:65 | ...::stdin(...) | test.rs:193:48:193:65 | ...::stdin(...) | provenance | Src:MaD:2 | | test.rs:194:13:194:21 | mut lines | test.rs:195:14:195:18 | lines | provenance | | | test.rs:194:13:194:21 | mut lines | test.rs:196:32:196:36 | lines | provenance | | -| test.rs:194:25:194:30 | reader | test.rs:194:25:194:38 | reader.lines() | provenance | MaD:28 | +| test.rs:194:25:194:30 | reader | test.rs:194:25:194:38 | reader.lines() | provenance | MaD:24 | | test.rs:194:25:194:38 | reader.lines() | test.rs:194:13:194:21 | mut lines | provenance | | -| test.rs:195:14:195:18 | lines | test.rs:195:14:195:30 | lines.next_line() [future, Ok, Some] | provenance | MaD:17 | +| test.rs:195:14:195:18 | lines | test.rs:195:14:195:30 | lines.next_line() [future, Ok, Some] | provenance | MaD:39 | | test.rs:195:14:195:30 | lines.next_line() [future, Ok, Some] | test.rs:195:14:195:36 | await ... [Ok, Some] | provenance | | | test.rs:195:14:195:36 | await ... [Ok, Some] | test.rs:195:14:195:37 | TryExpr [Some] | provenance | | -| test.rs:195:14:195:37 | TryExpr [Some] | test.rs:195:14:195:46 | ... .unwrap() | provenance | MaD:3 | +| test.rs:195:14:195:37 | TryExpr [Some] | test.rs:195:14:195:46 | ... .unwrap() | provenance | MaD:6 | | test.rs:196:19:196:28 | Some(...) [Some] | test.rs:196:24:196:27 | line | provenance | | | test.rs:196:24:196:27 | line | test.rs:197:18:197:21 | line | provenance | | -| test.rs:196:32:196:36 | lines | test.rs:196:32:196:48 | lines.next_line() [future, Ok, Some] | provenance | MaD:17 | +| test.rs:196:32:196:36 | lines | test.rs:196:32:196:48 | lines.next_line() [future, Ok, Some] | provenance | MaD:39 | | test.rs:196:32:196:48 | lines.next_line() [future, Ok, Some] | test.rs:196:32:196:54 | await ... [Ok, Some] | provenance | | | test.rs:196:32:196:54 | await ... [Ok, Some] | test.rs:196:32:196:55 | TryExpr [Some] | provenance | | | test.rs:196:32:196:55 | TryExpr [Some] | test.rs:196:19:196:28 | Some(...) [Some] | provenance | | diff --git a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected index 1a4b8bf8faac..c1f6cce28888 100644 --- a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected @@ -3,12 +3,12 @@ models | 2 | Source: ::to; Argument[0].Parameter[0..7]; remote | | 3 | Source: ::get; Argument[0].Parameter[0..7]; remote | | 4 | Source: ::on; Argument[1].Parameter[0..7]; remote | -| 5 | Source: axum::routing::method_routing::get; Argument[0].Parameter[0..7]; remote | -| 6 | Source: axum::routing::method_routing::post; Argument[0].Parameter[0..7]; remote | -| 7 | Source: axum::routing::method_routing::put; Argument[0].Parameter[0..7]; remote | -| 8 | Source: warp::filter::Filter::and_then; Argument[0].Parameter[0..7]; remote | -| 9 | Source: warp::filter::Filter::map; Argument[0].Parameter[0..7]; remote | -| 10 | Source: warp::filter::Filter::then; Argument[0].Parameter[0..7]; remote | +| 5 | Source: ::and_then; Argument[0].Parameter[0..7]; remote | +| 6 | Source: ::map; Argument[0].Parameter[0..7]; remote | +| 7 | Source: ::then; Argument[0].Parameter[0..7]; remote | +| 8 | Source: axum::routing::method_routing::get; Argument[0].Parameter[0..7]; remote | +| 9 | Source: axum::routing::method_routing::post; Argument[0].Parameter[0..7]; remote | +| 10 | Source: axum::routing::method_routing::put; Argument[0].Parameter[0..7]; remote | | 11 | Summary: ::into_inner; Argument[self]; ReturnValue; taint | | 12 | Summary: ::as_bytes; Argument[self].Reference; ReturnValue.Reference.Element; taint | | 13 | Summary: ::as_str; Argument[self].Reference; ReturnValue.Reference; taint | @@ -45,20 +45,20 @@ edges | test.rs:133:44:133:61 | my_actix_handler_3 | test.rs:116:14:116:14 | a | provenance | Src:MaD:2 | | test.rs:148:14:148:14 | a | test.rs:148:14:148:23 | a.as_str() | provenance | MaD:13 | | test.rs:149:14:149:14 | a | test.rs:149:14:149:25 | a.as_bytes() | provenance | MaD:12 | -| test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:148:14:148:14 | a | provenance | Src:MaD:5 | -| test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:149:14:149:14 | a | provenance | Src:MaD:5 | -| test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:150:14:150:14 | a | provenance | Src:MaD:5 | -| test.rs:201:39:201:55 | my_axum_handler_2 | test.rs:156:14:156:14 | a | provenance | Src:MaD:6 | -| test.rs:201:39:201:55 | my_axum_handler_2 | test.rs:157:14:157:14 | b | provenance | Src:MaD:6 | -| test.rs:202:33:202:49 | my_axum_handler_3 | test.rs:164:18:164:20 | key | provenance | Src:MaD:7 | -| test.rs:202:33:202:49 | my_axum_handler_3 | test.rs:165:18:165:22 | value | provenance | Src:MaD:7 | +| test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:148:14:148:14 | a | provenance | Src:MaD:8 | +| test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:149:14:149:14 | a | provenance | Src:MaD:8 | +| test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:150:14:150:14 | a | provenance | Src:MaD:8 | +| test.rs:201:39:201:55 | my_axum_handler_2 | test.rs:156:14:156:14 | a | provenance | Src:MaD:9 | +| test.rs:201:39:201:55 | my_axum_handler_2 | test.rs:157:14:157:14 | b | provenance | Src:MaD:9 | +| test.rs:202:33:202:49 | my_axum_handler_3 | test.rs:164:18:164:20 | key | provenance | Src:MaD:10 | +| test.rs:202:33:202:49 | my_axum_handler_3 | test.rs:165:18:165:22 | value | provenance | Src:MaD:10 | | test.rs:205:65:205:81 | my_axum_handler_5 | test.rs:181:14:181:20 | payload | provenance | Src:MaD:4 | -| test.rs:207:33:207:49 | my_axum_handler_6 | test.rs:187:14:187:17 | body | provenance | Src:MaD:5 | +| test.rs:207:33:207:49 | my_axum_handler_6 | test.rs:187:14:187:17 | body | provenance | Src:MaD:8 | | test.rs:207:56:207:72 | my_axum_handler_7 | test.rs:193:14:193:17 | body | provenance | Src:MaD:3 | -| test.rs:222:37:227:9 | \|...\| ... | test.rs:224:18:224:18 | a | provenance | Src:MaD:9 | -| test.rs:231:13:235:13 | \|...\| ... | test.rs:232:22:232:22 | a | provenance | Src:MaD:10 | -| test.rs:240:13:248:9 | \|...\| ... | test.rs:243:22:243:23 | id | provenance | Src:MaD:8 | -| test.rs:253:13:258:14 | \|...\| ... | test.rs:255:22:255:22 | a | provenance | Src:MaD:9 | +| test.rs:222:37:227:9 | \|...\| ... | test.rs:224:18:224:18 | a | provenance | Src:MaD:6 | +| test.rs:231:13:235:13 | \|...\| ... | test.rs:232:22:232:22 | a | provenance | Src:MaD:7 | +| test.rs:240:13:248:9 | \|...\| ... | test.rs:243:22:243:23 | id | provenance | Src:MaD:5 | +| test.rs:253:13:258:14 | \|...\| ... | test.rs:255:22:255:22 | a | provenance | Src:MaD:6 | nodes | test.rs:11:31:11:31 | a | semmle.label | a | | test.rs:13:14:13:14 | a | semmle.label | a | diff --git a/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected b/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected index 55d2b7cd679e..c02095aee9eb 100644 --- a/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected +++ b/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected @@ -3,17 +3,17 @@ models | 2 | Summary: ::add; Argument[0].Reference; ReturnValue; taint | | 3 | Summary: ::add; Argument[self]; ReturnValue; taint | | 4 | Summary: ::as_str; Argument[self].Reference; ReturnValue.Reference; taint | -| 5 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | -| 6 | Summary: alloc::string::ToString::to_string; Argument[self].Reference; ReturnValue; taint | -| 7 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | -| 8 | Summary: core::ops::index::Index::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 5 | Summary: ::to_string; Argument[self].Reference; ReturnValue; taint | +| 6 | Summary: ::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 7 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 8 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | edges | main.rs:27:9:27:9 | s | main.rs:28:19:28:19 | s | provenance | | | main.rs:27:9:27:9 | s | main.rs:28:19:28:25 | s[...] | provenance | | | main.rs:27:13:27:22 | source(...) | main.rs:27:9:27:9 | s | provenance | | | main.rs:28:9:28:14 | sliced [&ref] | main.rs:29:16:29:21 | sliced | provenance | | | main.rs:28:18:28:25 | &... [&ref] | main.rs:28:9:28:14 | sliced [&ref] | provenance | | -| main.rs:28:19:28:19 | s | main.rs:28:19:28:25 | s[...] | provenance | MaD:8 | +| main.rs:28:19:28:19 | s | main.rs:28:19:28:25 | s[...] | provenance | MaD:6 | | main.rs:28:19:28:25 | s[...] | main.rs:28:18:28:25 | &... [&ref] | provenance | | | main.rs:33:9:33:10 | s1 | main.rs:36:14:36:15 | s1 | provenance | | | main.rs:33:14:33:23 | source(...) | main.rs:33:9:33:10 | s1 | provenance | | @@ -32,7 +32,7 @@ edges | main.rs:58:9:58:10 | s1 | main.rs:59:14:59:15 | s1 | provenance | | | main.rs:58:14:58:29 | source_slice(...) | main.rs:58:9:58:10 | s1 | provenance | | | main.rs:59:9:59:10 | s2 | main.rs:60:10:60:11 | s2 | provenance | | -| main.rs:59:14:59:15 | s1 | main.rs:59:14:59:27 | s1.to_string() | provenance | MaD:6 | +| main.rs:59:14:59:15 | s1 | main.rs:59:14:59:27 | s1.to_string() | provenance | MaD:5 | | main.rs:59:14:59:27 | s1.to_string() | main.rs:59:9:59:10 | s2 | provenance | | | main.rs:64:9:64:9 | s | main.rs:65:16:65:16 | s | provenance | | | main.rs:64:13:64:22 | source(...) | main.rs:64:9:64:9 | s | provenance | | @@ -44,32 +44,32 @@ edges | main.rs:69:13:69:22 | source(...) | main.rs:69:9:69:9 | s | provenance | | | main.rs:71:9:71:18 | formatted1 | main.rs:72:10:72:19 | formatted1 | provenance | | | main.rs:71:22:71:62 | ...::format(...) | main.rs:71:9:71:18 | formatted1 | provenance | | -| main.rs:71:34:71:61 | MacroExpr | main.rs:71:22:71:62 | ...::format(...) | provenance | MaD:5 | +| main.rs:71:34:71:61 | MacroExpr | main.rs:71:22:71:62 | ...::format(...) | provenance | MaD:7 | | main.rs:74:9:74:18 | formatted2 | main.rs:75:10:75:19 | formatted2 | provenance | | | main.rs:74:22:74:60 | ...::format(...) | main.rs:74:9:74:18 | formatted2 | provenance | | -| main.rs:74:34:74:59 | MacroExpr | main.rs:74:22:74:60 | ...::format(...) | provenance | MaD:5 | +| main.rs:74:34:74:59 | MacroExpr | main.rs:74:22:74:60 | ...::format(...) | provenance | MaD:7 | | main.rs:77:9:77:13 | width | main.rs:78:34:78:74 | MacroExpr | provenance | | | main.rs:77:17:77:32 | source_usize(...) | main.rs:77:9:77:13 | width | provenance | | | main.rs:78:9:78:18 | formatted3 | main.rs:79:10:79:19 | formatted3 | provenance | | | main.rs:78:22:78:75 | ...::format(...) | main.rs:78:9:78:18 | formatted3 | provenance | | -| main.rs:78:34:78:74 | MacroExpr | main.rs:78:22:78:75 | ...::format(...) | provenance | MaD:5 | +| main.rs:78:34:78:74 | MacroExpr | main.rs:78:22:78:75 | ...::format(...) | provenance | MaD:7 | | main.rs:81:9:81:18 | formatted4 | main.rs:82:10:82:19 | formatted4 | provenance | | | main.rs:81:22:81:65 | ...::format(...) | main.rs:81:9:81:18 | formatted4 | provenance | | -| main.rs:81:39:81:64 | MacroExpr | main.rs:81:22:81:65 | ...::format(...) | provenance | MaD:5 | +| main.rs:81:39:81:64 | MacroExpr | main.rs:81:22:81:65 | ...::format(...) | provenance | MaD:7 | | main.rs:84:9:84:18 | formatted5 | main.rs:85:10:85:19 | formatted5 | provenance | | | main.rs:84:22:84:67 | ...::format(...) | main.rs:84:9:84:18 | formatted5 | provenance | | -| main.rs:84:41:84:66 | MacroExpr | main.rs:84:22:84:67 | ...::format(...) | provenance | MaD:5 | +| main.rs:84:41:84:66 | MacroExpr | main.rs:84:22:84:67 | ...::format(...) | provenance | MaD:7 | | main.rs:89:9:89:10 | s1 | main.rs:93:18:93:25 | MacroExpr | provenance | | | main.rs:89:9:89:10 | s1 | main.rs:94:18:94:32 | MacroExpr | provenance | | | main.rs:89:14:89:23 | source(...) | main.rs:89:9:89:10 | s1 | provenance | | | main.rs:93:18:93:25 | ...::format(...) | main.rs:93:18:93:25 | { ... } | provenance | | | main.rs:93:18:93:25 | ...::must_use(...) | main.rs:93:10:93:26 | MacroExpr | provenance | | -| main.rs:93:18:93:25 | MacroExpr | main.rs:93:18:93:25 | ...::format(...) | provenance | MaD:5 | -| main.rs:93:18:93:25 | { ... } | main.rs:93:18:93:25 | ...::must_use(...) | provenance | MaD:7 | +| main.rs:93:18:93:25 | MacroExpr | main.rs:93:18:93:25 | ...::format(...) | provenance | MaD:7 | +| main.rs:93:18:93:25 | { ... } | main.rs:93:18:93:25 | ...::must_use(...) | provenance | MaD:8 | | main.rs:94:18:94:32 | ...::format(...) | main.rs:94:18:94:32 | { ... } | provenance | | | main.rs:94:18:94:32 | ...::must_use(...) | main.rs:94:10:94:33 | MacroExpr | provenance | | -| main.rs:94:18:94:32 | MacroExpr | main.rs:94:18:94:32 | ...::format(...) | provenance | MaD:5 | -| main.rs:94:18:94:32 | { ... } | main.rs:94:18:94:32 | ...::must_use(...) | provenance | MaD:7 | +| main.rs:94:18:94:32 | MacroExpr | main.rs:94:18:94:32 | ...::format(...) | provenance | MaD:7 | +| main.rs:94:18:94:32 | { ... } | main.rs:94:18:94:32 | ...::must_use(...) | provenance | MaD:8 | nodes | main.rs:27:9:27:9 | s | semmle.label | s | | main.rs:27:13:27:22 | source(...) | semmle.label | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/taint/inline-taint-flow.expected b/rust/ql/test/library-tests/dataflow/taint/inline-taint-flow.expected index 360578746a53..2f3bba8677f1 100644 --- a/rust/ql/test/library-tests/dataflow/taint/inline-taint-flow.expected +++ b/rust/ql/test/library-tests/dataflow/taint/inline-taint-flow.expected @@ -1,39 +1,39 @@ models | 1 | Summary: ::neg; Argument[self].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | | 2 | Summary: ::not; Argument[self].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | -| 3 | Summary: core::ops::arith::Add::add; Argument[self,0].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | -| 4 | Summary: core::ops::arith::Add::add; Argument[self,0]; ReturnValue; taint | -| 5 | Summary: core::ops::arith::AddAssign::add_assign; Argument[0].Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | -| 6 | Summary: core::ops::arith::AddAssign::add_assign; Argument[0]; Argument[self].Reference; taint | -| 7 | Summary: core::ops::arith::AddAssign::add_assign; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | -| 8 | Summary: core::ops::arith::AddAssign::add_assign; Argument[self].Reference; Argument[self].Reference; taint | -| 9 | Summary: core::ops::arith::Mul::mul; Argument[self,0]; ReturnValue; taint | -| 10 | Summary: core::ops::arith::MulAssign::mul_assign; Argument[0]; Argument[self].Reference; taint | -| 11 | Summary: core::ops::arith::MulAssign::mul_assign; Argument[self].Reference; Argument[self].Reference; taint | -| 12 | Summary: core::ops::arith::Neg::neg; Argument[self]; ReturnValue; taint | -| 13 | Summary: core::ops::arith::Sub::sub; Argument[self,0]; ReturnValue; taint | -| 14 | Summary: core::ops::arith::SubAssign::sub_assign; Argument[0]; Argument[self].Reference; taint | -| 15 | Summary: core::ops::arith::SubAssign::sub_assign; Argument[self].Reference; Argument[self].Reference; taint | -| 16 | Summary: core::ops::bit::BitAnd::bitand; Argument[self,0].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | -| 17 | Summary: core::ops::bit::BitAndAssign::bitand_assign; Argument[0].Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | -| 18 | Summary: core::ops::bit::BitAndAssign::bitand_assign; Argument[0]; Argument[self].Reference; taint | -| 19 | Summary: core::ops::bit::BitAndAssign::bitand_assign; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | -| 20 | Summary: core::ops::bit::BitAndAssign::bitand_assign; Argument[self].Reference; Argument[self].Reference; taint | -| 21 | Summary: core::ops::bit::BitOr::bitor; Argument[self,0]; ReturnValue; taint | -| 22 | Summary: core::ops::bit::BitXor::bitxor; Argument[self,0]; ReturnValue; taint | -| 23 | Summary: core::ops::bit::BitXorAssign::bitxor_assign; Argument[0]; Argument[self].Reference; taint | -| 24 | Summary: core::ops::bit::BitXorAssign::bitxor_assign; Argument[self].Reference; Argument[self].Reference; taint | -| 25 | Summary: core::ops::bit::Not::not; Argument[self]; ReturnValue; taint | -| 26 | Summary: core::ops::bit::Shl::shl; Argument[self,0].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | -| 27 | Summary: core::ops::bit::Shl::shl; Argument[self,0]; ReturnValue; taint | -| 28 | Summary: core::ops::bit::ShlAssign::shl_assign; Argument[0].Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | -| 29 | Summary: core::ops::bit::ShlAssign::shl_assign; Argument[0]; Argument[self].Reference; taint | -| 30 | Summary: core::ops::bit::ShlAssign::shl_assign; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | -| 31 | Summary: core::ops::bit::ShlAssign::shl_assign; Argument[self].Reference; Argument[self].Reference; taint | -| 32 | Summary: core::ops::bit::Shr::shr; Argument[self,0]; ReturnValue; taint | -| 33 | Summary: core::ops::bit::ShrAssign::shr_assign; Argument[0]; Argument[self].Reference; taint | -| 34 | Summary: core::ops::bit::ShrAssign::shr_assign; Argument[self].Reference; Argument[self].Reference; taint | -| 35 | Summary: core::ops::index::Index::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 3 | Summary: ::add; Argument[self,0].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | +| 4 | Summary: ::add; Argument[self,0]; ReturnValue; taint | +| 5 | Summary: ::add_assign; Argument[0].Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | +| 6 | Summary: ::add_assign; Argument[0]; Argument[self].Reference; taint | +| 7 | Summary: ::add_assign; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | +| 8 | Summary: ::add_assign; Argument[self].Reference; Argument[self].Reference; taint | +| 9 | Summary: ::mul; Argument[self,0]; ReturnValue; taint | +| 10 | Summary: ::mul_assign; Argument[0]; Argument[self].Reference; taint | +| 11 | Summary: ::mul_assign; Argument[self].Reference; Argument[self].Reference; taint | +| 12 | Summary: ::neg; Argument[self]; ReturnValue; taint | +| 13 | Summary: ::sub; Argument[self,0]; ReturnValue; taint | +| 14 | Summary: ::sub_assign; Argument[0]; Argument[self].Reference; taint | +| 15 | Summary: ::sub_assign; Argument[self].Reference; Argument[self].Reference; taint | +| 16 | Summary: ::bitand; Argument[self,0].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | +| 17 | Summary: ::bitand_assign; Argument[0].Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | +| 18 | Summary: ::bitand_assign; Argument[0]; Argument[self].Reference; taint | +| 19 | Summary: ::bitand_assign; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | +| 20 | Summary: ::bitand_assign; Argument[self].Reference; Argument[self].Reference; taint | +| 21 | Summary: ::bitor; Argument[self,0]; ReturnValue; taint | +| 22 | Summary: ::bitxor; Argument[self,0]; ReturnValue; taint | +| 23 | Summary: ::bitxor_assign; Argument[0]; Argument[self].Reference; taint | +| 24 | Summary: ::bitxor_assign; Argument[self].Reference; Argument[self].Reference; taint | +| 25 | Summary: ::not; Argument[self]; ReturnValue; taint | +| 26 | Summary: ::shl; Argument[self,0].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | +| 27 | Summary: ::shl; Argument[self,0]; ReturnValue; taint | +| 28 | Summary: ::shl_assign; Argument[0].Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | +| 29 | Summary: ::shl_assign; Argument[0]; Argument[self].Reference; taint | +| 30 | Summary: ::shl_assign; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | +| 31 | Summary: ::shl_assign; Argument[self].Reference; Argument[self].Reference; taint | +| 32 | Summary: ::shr; Argument[self,0]; ReturnValue; taint | +| 33 | Summary: ::shr_assign; Argument[0]; Argument[self].Reference; taint | +| 34 | Summary: ::shr_assign; Argument[self].Reference; Argument[self].Reference; taint | +| 35 | Summary: ::index; Argument[self].Reference.Element; ReturnValue.Reference; value | edges | main.rs:12:9:12:9 | a | main.rs:13:10:13:10 | a | provenance | | | main.rs:12:9:12:9 | a | main.rs:14:14:14:14 | a | provenance | | diff --git a/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected b/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected index 4c263e2c9498..6151a3eabd10 100644 --- a/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected +++ b/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected @@ -19,34 +19,34 @@ edges | src/main.rs:7:11:7:19 | file_name | src/main.rs:9:35:9:43 | file_name | provenance | | | src/main.rs:9:9:9:17 | file_path | src/main.rs:11:24:11:32 | file_path | provenance | Sink:MaD:6 | | src/main.rs:9:21:9:44 | ...::from(...) | src/main.rs:9:9:9:17 | file_path | provenance | | -| src/main.rs:9:35:9:43 | file_name | src/main.rs:9:21:9:44 | ...::from(...) | provenance | MaD:12 | +| src/main.rs:9:35:9:43 | file_name | src/main.rs:9:21:9:44 | ...::from(...) | provenance | MaD:14 | | src/main.rs:38:11:38:19 | file_path | src/main.rs:41:52:41:60 | file_path | provenance | | | src/main.rs:41:9:41:17 | file_path | src/main.rs:46:24:46:32 | file_path | provenance | Sink:MaD:6 | | src/main.rs:41:21:41:62 | public_path.join(...) | src/main.rs:41:9:41:17 | file_path | provenance | | -| src/main.rs:41:38:41:61 | ...::from(...) | src/main.rs:41:21:41:62 | public_path.join(...) | provenance | MaD:10 | -| src/main.rs:41:52:41:60 | file_path | src/main.rs:41:38:41:61 | ...::from(...) | provenance | MaD:12 | +| src/main.rs:41:38:41:61 | ...::from(...) | src/main.rs:41:21:41:62 | public_path.join(...) | provenance | MaD:12 | +| src/main.rs:41:52:41:60 | file_path | src/main.rs:41:38:41:61 | ...::from(...) | provenance | MaD:14 | | src/main.rs:63:11:63:19 | file_path | src/main.rs:66:32:66:40 | file_path | provenance | | | src/main.rs:66:9:66:17 | file_path [&ref] | src/main.rs:71:24:71:32 | file_path | provenance | Sink:MaD:6 | | src/main.rs:66:21:66:41 | ...::new(...) [&ref] | src/main.rs:66:9:66:17 | file_path [&ref] | provenance | | -| src/main.rs:66:31:66:40 | &file_path [&ref] | src/main.rs:66:21:66:41 | ...::new(...) [&ref] | provenance | MaD:11 | +| src/main.rs:66:31:66:40 | &file_path [&ref] | src/main.rs:66:21:66:41 | ...::new(...) [&ref] | provenance | MaD:13 | | src/main.rs:66:32:66:40 | file_path | src/main.rs:66:31:66:40 | &file_path [&ref] | provenance | | | src/main.rs:76:11:76:19 | file_path | src/main.rs:79:52:79:60 | file_path | provenance | | | src/main.rs:79:9:79:17 | file_path | src/main.rs:80:21:80:29 | file_path | provenance | | | src/main.rs:79:21:79:62 | public_path.join(...) | src/main.rs:79:9:79:17 | file_path | provenance | | -| src/main.rs:79:38:79:61 | ...::from(...) | src/main.rs:79:21:79:62 | public_path.join(...) | provenance | MaD:10 | -| src/main.rs:79:52:79:60 | file_path | src/main.rs:79:38:79:61 | ...::from(...) | provenance | MaD:12 | +| src/main.rs:79:38:79:61 | ...::from(...) | src/main.rs:79:21:79:62 | public_path.join(...) | provenance | MaD:12 | +| src/main.rs:79:52:79:60 | file_path | src/main.rs:79:38:79:61 | ...::from(...) | provenance | MaD:14 | | src/main.rs:80:9:80:17 | file_path | src/main.rs:85:24:85:32 | file_path | provenance | Sink:MaD:6 | -| src/main.rs:80:21:80:29 | file_path | src/main.rs:80:21:80:44 | file_path.canonicalize() [Ok] | provenance | MaD:13 | -| src/main.rs:80:21:80:44 | file_path.canonicalize() [Ok] | src/main.rs:80:21:80:53 | ... .unwrap() | provenance | MaD:9 | +| src/main.rs:80:21:80:29 | file_path | src/main.rs:80:21:80:44 | file_path.canonicalize() [Ok] | provenance | MaD:15 | +| src/main.rs:80:21:80:44 | file_path.canonicalize() [Ok] | src/main.rs:80:21:80:53 | ... .unwrap() | provenance | MaD:11 | | src/main.rs:80:21:80:53 | ... .unwrap() | src/main.rs:80:9:80:17 | file_path | provenance | | | src/main.rs:90:11:90:19 | file_path | src/main.rs:93:32:93:40 | file_path | provenance | | | src/main.rs:93:9:93:17 | file_path [&ref] | src/main.rs:98:21:98:29 | file_path [&ref] | provenance | | | src/main.rs:93:21:93:41 | ...::new(...) [&ref] | src/main.rs:93:9:93:17 | file_path [&ref] | provenance | | -| src/main.rs:93:31:93:40 | &file_path [&ref] | src/main.rs:93:21:93:41 | ...::new(...) [&ref] | provenance | MaD:11 | +| src/main.rs:93:31:93:40 | &file_path [&ref] | src/main.rs:93:21:93:41 | ...::new(...) [&ref] | provenance | MaD:13 | | src/main.rs:93:32:93:40 | file_path | src/main.rs:93:31:93:40 | &file_path [&ref] | provenance | | | src/main.rs:98:9:98:17 | file_path | src/main.rs:99:24:99:32 | file_path | provenance | Sink:MaD:6 | | src/main.rs:98:21:98:29 | file_path [&ref] | src/main.rs:98:21:98:44 | file_path.canonicalize() [Ok] | provenance | Config | -| src/main.rs:98:21:98:44 | file_path.canonicalize() [Ok] | src/main.rs:98:21:98:53 | ... .unwrap() | provenance | MaD:9 | +| src/main.rs:98:21:98:44 | file_path.canonicalize() [Ok] | src/main.rs:98:21:98:53 | ... .unwrap() | provenance | MaD:11 | | src/main.rs:98:21:98:53 | ... .unwrap() | src/main.rs:98:9:98:17 | file_path | provenance | | | src/main.rs:103:9:103:13 | path1 | src/main.rs:104:33:104:37 | path1 | provenance | | | src/main.rs:103:9:103:13 | path1 | src/main.rs:106:39:106:43 | path1 | provenance | | @@ -56,51 +56,51 @@ edges | src/main.rs:103:9:103:13 | path1 | src/main.rs:122:27:122:31 | path1 | provenance | | | src/main.rs:103:9:103:13 | path1 | src/main.rs:123:37:123:41 | path1 | provenance | | | src/main.rs:103:17:103:32 | ...::args(...) | src/main.rs:103:17:103:32 | ...::args(...) [element] | provenance | Src:MaD:7 | -| src/main.rs:103:17:103:32 | ...::args(...) [element] | src/main.rs:103:17:103:39 | ... .nth(...) [Some] | provenance | MaD:15 | -| src/main.rs:103:17:103:39 | ... .nth(...) [Some] | src/main.rs:103:17:103:48 | ... .unwrap() | provenance | MaD:8 | +| src/main.rs:103:17:103:32 | ...::args(...) [element] | src/main.rs:103:17:103:39 | ... .nth(...) [Some] | provenance | MaD:9 | +| src/main.rs:103:17:103:39 | ... .nth(...) [Some] | src/main.rs:103:17:103:48 | ... .unwrap() | provenance | MaD:10 | | src/main.rs:103:17:103:48 | ... .unwrap() | src/main.rs:103:9:103:13 | path1 | provenance | | -| src/main.rs:104:33:104:37 | path1 | src/main.rs:104:33:104:45 | path1.clone() | provenance | MaD:14 | +| src/main.rs:104:33:104:37 | path1 | src/main.rs:104:33:104:45 | path1.clone() | provenance | MaD:8 | | src/main.rs:104:33:104:45 | path1.clone() | src/main.rs:104:33:104:45 | path1.clone() | provenance | Sink:MaD:2 | | src/main.rs:106:9:106:13 | path2 | src/main.rs:107:33:107:37 | path2 | provenance | Sink:MaD:2 | -| src/main.rs:106:17:106:52 | ...::canonicalize(...) [Ok] | src/main.rs:106:17:106:61 | ... .unwrap() | provenance | MaD:9 | +| src/main.rs:106:17:106:52 | ...::canonicalize(...) [Ok] | src/main.rs:106:17:106:61 | ... .unwrap() | provenance | MaD:11 | | src/main.rs:106:17:106:61 | ... .unwrap() | src/main.rs:106:9:106:13 | path2 | provenance | | -| src/main.rs:106:39:106:43 | path1 | src/main.rs:106:39:106:51 | path1.clone() | provenance | MaD:14 | +| src/main.rs:106:39:106:43 | path1 | src/main.rs:106:39:106:51 | path1.clone() | provenance | MaD:8 | | src/main.rs:106:39:106:51 | path1.clone() | src/main.rs:106:17:106:52 | ...::canonicalize(...) [Ok] | provenance | Config | | src/main.rs:109:9:109:13 | path3 | src/main.rs:110:35:110:39 | path3 | provenance | Sink:MaD:4 | | src/main.rs:109:17:109:54 | ...::canonicalize(...) [future, Ok] | src/main.rs:109:17:109:60 | await ... [Ok] | provenance | | -| src/main.rs:109:17:109:60 | await ... [Ok] | src/main.rs:109:17:109:69 | ... .unwrap() | provenance | MaD:9 | +| src/main.rs:109:17:109:60 | await ... [Ok] | src/main.rs:109:17:109:69 | ... .unwrap() | provenance | MaD:11 | | src/main.rs:109:17:109:69 | ... .unwrap() | src/main.rs:109:9:109:13 | path3 | provenance | | -| src/main.rs:109:41:109:45 | path1 | src/main.rs:109:41:109:53 | path1.clone() | provenance | MaD:14 | +| src/main.rs:109:41:109:45 | path1 | src/main.rs:109:41:109:53 | path1.clone() | provenance | MaD:8 | | src/main.rs:109:41:109:53 | path1.clone() | src/main.rs:109:17:109:54 | ...::canonicalize(...) [future, Ok] | provenance | Config | | src/main.rs:112:9:112:13 | path4 | src/main.rs:113:39:113:43 | path4 | provenance | Sink:MaD:1 | | src/main.rs:112:17:112:58 | ...::canonicalize(...) [future, Ok] | src/main.rs:112:17:112:64 | await ... [Ok] | provenance | | -| src/main.rs:112:17:112:64 | await ... [Ok] | src/main.rs:112:17:112:73 | ... .unwrap() | provenance | MaD:9 | +| src/main.rs:112:17:112:64 | await ... [Ok] | src/main.rs:112:17:112:73 | ... .unwrap() | provenance | MaD:11 | | src/main.rs:112:17:112:73 | ... .unwrap() | src/main.rs:112:9:112:13 | path4 | provenance | | -| src/main.rs:112:45:112:49 | path1 | src/main.rs:112:45:112:57 | path1.clone() | provenance | MaD:14 | +| src/main.rs:112:45:112:49 | path1 | src/main.rs:112:45:112:57 | path1.clone() | provenance | MaD:8 | | src/main.rs:112:45:112:57 | path1.clone() | src/main.rs:112:17:112:58 | ...::canonicalize(...) [future, Ok] | provenance | Config | | src/main.rs:115:9:115:13 | path5 [&ref] | src/main.rs:116:33:116:37 | path5 | provenance | Sink:MaD:2 | | src/main.rs:115:9:115:13 | path5 [&ref] | src/main.rs:118:17:118:21 | path5 [&ref] | provenance | | | src/main.rs:115:17:115:44 | ...::new(...) [&ref] | src/main.rs:115:9:115:13 | path5 [&ref] | provenance | | -| src/main.rs:115:38:115:43 | &path1 [&ref] | src/main.rs:115:17:115:44 | ...::new(...) [&ref] | provenance | MaD:11 | +| src/main.rs:115:38:115:43 | &path1 [&ref] | src/main.rs:115:17:115:44 | ...::new(...) [&ref] | provenance | MaD:13 | | src/main.rs:115:39:115:43 | path1 | src/main.rs:115:38:115:43 | &path1 [&ref] | provenance | | | src/main.rs:118:9:118:13 | path6 | src/main.rs:119:33:119:37 | path6 | provenance | Sink:MaD:2 | | src/main.rs:118:17:118:21 | path5 [&ref] | src/main.rs:118:17:118:36 | path5.canonicalize() [Ok] | provenance | Config | -| src/main.rs:118:17:118:36 | path5.canonicalize() [Ok] | src/main.rs:118:17:118:45 | ... .unwrap() | provenance | MaD:9 | +| src/main.rs:118:17:118:36 | path5.canonicalize() [Ok] | src/main.rs:118:17:118:45 | ... .unwrap() | provenance | MaD:11 | | src/main.rs:118:17:118:45 | ... .unwrap() | src/main.rs:118:9:118:13 | path6 | provenance | | -| src/main.rs:122:27:122:31 | path1 | src/main.rs:122:27:122:39 | path1.clone() | provenance | MaD:14 | +| src/main.rs:122:27:122:31 | path1 | src/main.rs:122:27:122:39 | path1.clone() | provenance | MaD:8 | | src/main.rs:122:27:122:39 | path1.clone() | src/main.rs:122:27:122:39 | path1.clone() | provenance | Sink:MaD:5 | -| src/main.rs:123:37:123:41 | path1 | src/main.rs:123:37:123:49 | path1.clone() | provenance | MaD:14 | +| src/main.rs:123:37:123:41 | path1 | src/main.rs:123:37:123:49 | path1.clone() | provenance | MaD:8 | | src/main.rs:123:37:123:49 | path1.clone() | src/main.rs:123:37:123:49 | path1.clone() | provenance | Sink:MaD:5 | | src/main.rs:170:16:170:29 | ...: ... [&ref] | src/main.rs:172:26:172:33 | path_str [&ref] | provenance | | | src/main.rs:170:16:170:29 | ...: ... [&ref] | src/main.rs:174:36:174:43 | path_str | provenance | Sink:MaD:2 | | src/main.rs:172:9:172:12 | path [&ref] | src/main.rs:173:8:173:11 | path | provenance | Sink:MaD:3 | | src/main.rs:172:9:172:12 | path [&ref] | src/main.rs:177:36:177:39 | path | provenance | Sink:MaD:2 | | src/main.rs:172:16:172:34 | ...::new(...) [&ref] | src/main.rs:172:9:172:12 | path [&ref] | provenance | | -| src/main.rs:172:26:172:33 | path_str [&ref] | src/main.rs:172:16:172:34 | ...::new(...) [&ref] | provenance | MaD:11 | +| src/main.rs:172:26:172:33 | path_str [&ref] | src/main.rs:172:16:172:34 | ...::new(...) [&ref] | provenance | MaD:13 | | src/main.rs:185:9:185:13 | path1 | src/main.rs:186:18:186:22 | path1 | provenance | | | src/main.rs:185:17:185:32 | ...::args(...) | src/main.rs:185:17:185:32 | ...::args(...) [element] | provenance | Src:MaD:7 | -| src/main.rs:185:17:185:32 | ...::args(...) [element] | src/main.rs:185:17:185:39 | ... .nth(...) [Some] | provenance | MaD:15 | -| src/main.rs:185:17:185:39 | ... .nth(...) [Some] | src/main.rs:185:17:185:48 | ... .unwrap() | provenance | MaD:8 | +| src/main.rs:185:17:185:32 | ...::args(...) [element] | src/main.rs:185:17:185:39 | ... .nth(...) [Some] | provenance | MaD:9 | +| src/main.rs:185:17:185:39 | ... .nth(...) [Some] | src/main.rs:185:17:185:48 | ... .unwrap() | provenance | MaD:10 | | src/main.rs:185:17:185:48 | ... .unwrap() | src/main.rs:185:9:185:13 | path1 | provenance | | | src/main.rs:186:17:186:22 | &path1 [&ref] | src/main.rs:170:16:170:29 | ...: ... [&ref] | provenance | | | src/main.rs:186:18:186:22 | path1 | src/main.rs:186:17:186:22 | &path1 [&ref] | provenance | | @@ -112,14 +112,14 @@ models | 5 | Sink: std::fs::copy; Argument[0,1]; path-injection | | 6 | Sink: std::fs::read_to_string; Argument[0]; path-injection | | 7 | Source: std::env::args; ReturnValue.Element; commandargs | -| 8 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 9 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 10 | Summary: ::join; Argument[0]; ReturnValue; taint | -| 11 | Summary: ::new; Argument[0].Reference; ReturnValue.Reference; value | -| 12 | Summary: ::from; Argument[0].Field[alloc::borrow::Cow::Owned(0)]; ReturnValue; value | -| 13 | Summary: ::deref; Argument[self].Reference.Field[std::path::PathBuf::inner]; ReturnValue.Reference; value | -| 14 | Summary: core::clone::Clone::clone; Argument[self].Reference; ReturnValue; value | -| 15 | Summary: core::iter::traits::iterator::Iterator::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 8 | Summary: ::clone; Argument[self].Reference; ReturnValue; value | +| 9 | Summary: ::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 10 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 11 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 12 | Summary: ::join; Argument[0]; ReturnValue; taint | +| 13 | Summary: ::new; Argument[0].Reference; ReturnValue.Reference; value | +| 14 | Summary: ::from; Argument[0].Field[alloc::borrow::Cow::Owned(0)]; ReturnValue; value | +| 15 | Summary: ::deref; Argument[self].Reference.Field[std::path::PathBuf::inner]; ReturnValue.Reference; value | nodes | src/main.rs:7:11:7:19 | file_name | semmle.label | file_name | | src/main.rs:9:9:9:17 | file_path | semmle.label | file_path | diff --git a/rust/ql/test/query-tests/security/CWE-079/warp/XSS.expected b/rust/ql/test/query-tests/security/CWE-079/warp/XSS.expected index 2190976dafc8..e6f56c8e71cb 100644 --- a/rust/ql/test/query-tests/security/CWE-079/warp/XSS.expected +++ b/rust/ql/test/query-tests/security/CWE-079/warp/XSS.expected @@ -9,7 +9,7 @@ edges | main.rs:9:32:9:56 | { ... } | main.rs:9:32:9:56 | ...::must_use(...) | provenance | MaD:4 | models | 1 | Sink: warp::reply::html; Argument[0]; html-injection | -| 2 | Source: warp::filter::Filter::map; Argument[0].Parameter[0..7]; remote | +| 2 | Source: ::map; Argument[0].Parameter[0..7]; remote | | 3 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | | 4 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes diff --git a/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected b/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected index ec9018280bc3..f01246e128df 100644 --- a/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected @@ -35,9 +35,9 @@ edges | mysql.rs:12:13:12:29 | mut remote_string | mysql.rs:18:71:18:83 | remote_string | provenance | | | mysql.rs:12:33:12:77 | ...::get(...) | mysql.rs:12:33:12:77 | ...::get(...) [Ok] | provenance | Src:MaD:23 | -| mysql.rs:12:33:12:77 | ...::get(...) [Ok] | mysql.rs:12:33:13:21 | ... .unwrap() | provenance | MaD:29 | -| mysql.rs:12:33:13:21 | ... .unwrap() | mysql.rs:12:33:14:19 | ... .text() [Ok] | provenance | MaD:31 | -| mysql.rs:12:33:14:19 | ... .text() [Ok] | mysql.rs:12:33:15:40 | ... .unwrap_or(...) | provenance | MaD:30 | +| mysql.rs:12:33:12:77 | ...::get(...) [Ok] | mysql.rs:12:33:13:21 | ... .unwrap() | provenance | MaD:30 | +| mysql.rs:12:33:13:21 | ... .unwrap() | mysql.rs:12:33:14:19 | ... .text() [Ok] | provenance | MaD:32 | +| mysql.rs:12:33:14:19 | ... .text() [Ok] | mysql.rs:12:33:15:40 | ... .unwrap_or(...) | provenance | MaD:31 | | mysql.rs:12:33:15:40 | ... .unwrap_or(...) | mysql.rs:12:13:12:29 | mut remote_string | provenance | | | mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:25:38:25:49 | unsafe_query | provenance | | | mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:26:64:26:75 | unsafe_query | provenance | | @@ -57,36 +57,36 @@ edges | mysql.rs:18:70:18:83 | &remote_string [&ref] | mysql.rs:18:13:18:83 | ... + ... | provenance | MaD:25 | | mysql.rs:18:71:18:83 | remote_string | mysql.rs:18:70:18:83 | &remote_string [&ref] | provenance | | | mysql.rs:25:38:25:49 | unsafe_query | mysql.rs:25:38:25:58 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | -| mysql.rs:25:38:25:58 | unsafe_query.as_str() [&ref] | mysql.rs:25:38:25:58 | unsafe_query.as_str() | provenance | Sink:MaD:5 | +| mysql.rs:25:38:25:58 | unsafe_query.as_str() [&ref] | mysql.rs:25:38:25:58 | unsafe_query.as_str() | provenance | Sink:MaD:3 | | mysql.rs:26:64:26:75 | unsafe_query | mysql.rs:26:64:26:84 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | -| mysql.rs:26:64:26:84 | unsafe_query.as_str() [&ref] | mysql.rs:26:64:26:84 | unsafe_query.as_str() | provenance | Sink:MaD:13 | +| mysql.rs:26:64:26:84 | unsafe_query.as_str() [&ref] | mysql.rs:26:64:26:84 | unsafe_query.as_str() | provenance | Sink:MaD:11 | | mysql.rs:27:25:27:36 | unsafe_query | mysql.rs:27:25:27:45 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | -| mysql.rs:27:25:27:45 | unsafe_query.as_str() [&ref] | mysql.rs:27:25:27:45 | unsafe_query.as_str() | provenance | Sink:MaD:6 | +| mysql.rs:27:25:27:45 | unsafe_query.as_str() [&ref] | mysql.rs:27:25:27:45 | unsafe_query.as_str() | provenance | Sink:MaD:4 | | mysql.rs:28:39:28:50 | unsafe_query | mysql.rs:28:39:28:59 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | -| mysql.rs:28:39:28:59 | unsafe_query.as_str() [&ref] | mysql.rs:28:39:28:59 | unsafe_query.as_str() | provenance | Sink:MaD:7 | +| mysql.rs:28:39:28:59 | unsafe_query.as_str() [&ref] | mysql.rs:28:39:28:59 | unsafe_query.as_str() | provenance | Sink:MaD:5 | | mysql.rs:29:65:29:76 | unsafe_query | mysql.rs:29:65:29:85 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | -| mysql.rs:29:65:29:85 | unsafe_query.as_str() [&ref] | mysql.rs:29:65:29:85 | unsafe_query.as_str() | provenance | Sink:MaD:8 | +| mysql.rs:29:65:29:85 | unsafe_query.as_str() [&ref] | mysql.rs:29:65:29:85 | unsafe_query.as_str() | provenance | Sink:MaD:6 | | mysql.rs:30:33:30:44 | unsafe_query | mysql.rs:30:33:30:53 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | -| mysql.rs:30:33:30:53 | unsafe_query.as_str() [&ref] | mysql.rs:30:33:30:53 | unsafe_query.as_str() | provenance | Sink:MaD:9 | +| mysql.rs:30:33:30:53 | unsafe_query.as_str() [&ref] | mysql.rs:30:33:30:53 | unsafe_query.as_str() | provenance | Sink:MaD:7 | | mysql.rs:32:13:32:24 | unsafe_query | mysql.rs:32:13:32:33 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | -| mysql.rs:32:13:32:33 | unsafe_query.as_str() [&ref] | mysql.rs:32:13:32:33 | unsafe_query.as_str() | provenance | Sink:MaD:10 | +| mysql.rs:32:13:32:33 | unsafe_query.as_str() [&ref] | mysql.rs:32:13:32:33 | unsafe_query.as_str() | provenance | Sink:MaD:8 | | mysql.rs:36:33:36:44 | unsafe_query | mysql.rs:36:33:36:53 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | | mysql.rs:36:33:36:53 | unsafe_query.as_str() [&ref] | mysql.rs:36:33:36:53 | unsafe_query.as_str() | provenance | Sink:MaD:2 | | mysql.rs:37:32:37:43 | unsafe_query | mysql.rs:37:32:37:52 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | -| mysql.rs:37:32:37:52 | unsafe_query.as_str() [&ref] | mysql.rs:37:32:37:52 | unsafe_query.as_str() | provenance | Sink:MaD:11 | +| mysql.rs:37:32:37:52 | unsafe_query.as_str() [&ref] | mysql.rs:37:32:37:52 | unsafe_query.as_str() | provenance | Sink:MaD:9 | | mysql.rs:39:13:39:24 | unsafe_query | mysql.rs:39:13:39:33 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | -| mysql.rs:39:13:39:33 | unsafe_query.as_str() [&ref] | mysql.rs:39:13:39:33 | unsafe_query.as_str() | provenance | Sink:MaD:12 | +| mysql.rs:39:13:39:33 | unsafe_query.as_str() [&ref] | mysql.rs:39:13:39:33 | unsafe_query.as_str() | provenance | Sink:MaD:10 | | mysql.rs:42:39:42:50 | unsafe_query | mysql.rs:42:39:42:59 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | -| mysql.rs:42:39:42:59 | unsafe_query.as_str() [&ref] | mysql.rs:42:39:42:59 | unsafe_query.as_str() | provenance | Sink:MaD:5 | +| mysql.rs:42:39:42:59 | unsafe_query.as_str() [&ref] | mysql.rs:42:39:42:59 | unsafe_query.as_str() | provenance | Sink:MaD:3 | | mysql.rs:75:31:75:42 | unsafe_query | mysql.rs:75:31:75:51 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | | mysql.rs:75:31:75:51 | unsafe_query.as_str() [&ref] | mysql.rs:75:31:75:51 | unsafe_query.as_str() | provenance | Sink:MaD:1 | | mysql.rs:80:26:80:37 | unsafe_query | mysql.rs:80:26:80:46 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | -| mysql.rs:80:26:80:46 | unsafe_query.as_str() [&ref] | mysql.rs:80:26:80:46 | unsafe_query.as_str() | provenance | Sink:MaD:6 | +| mysql.rs:80:26:80:46 | unsafe_query.as_str() [&ref] | mysql.rs:80:26:80:46 | unsafe_query.as_str() | provenance | Sink:MaD:4 | | mysql.rs:97:13:97:29 | mut remote_string | mysql.rs:103:71:103:83 | remote_string | provenance | | | mysql.rs:97:33:97:77 | ...::get(...) | mysql.rs:97:33:97:77 | ...::get(...) [Ok] | provenance | Src:MaD:23 | -| mysql.rs:97:33:97:77 | ...::get(...) [Ok] | mysql.rs:97:33:98:21 | ... .unwrap() | provenance | MaD:29 | -| mysql.rs:97:33:98:21 | ... .unwrap() | mysql.rs:97:33:99:19 | ... .text() [Ok] | provenance | MaD:31 | -| mysql.rs:97:33:99:19 | ... .text() [Ok] | mysql.rs:97:33:100:40 | ... .unwrap_or(...) | provenance | MaD:30 | +| mysql.rs:97:33:97:77 | ...::get(...) [Ok] | mysql.rs:97:33:98:21 | ... .unwrap() | provenance | MaD:30 | +| mysql.rs:97:33:98:21 | ... .unwrap() | mysql.rs:97:33:99:19 | ... .text() [Ok] | provenance | MaD:32 | +| mysql.rs:97:33:99:19 | ... .text() [Ok] | mysql.rs:97:33:100:40 | ... .unwrap_or(...) | provenance | MaD:31 | | mysql.rs:97:33:100:40 | ... .unwrap_or(...) | mysql.rs:97:13:97:29 | mut remote_string | provenance | | | mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:110:38:110:49 | unsafe_query | provenance | | | mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:111:25:111:36 | unsafe_query | provenance | | @@ -110,27 +110,27 @@ edges | mysql.rs:114:25:114:36 | unsafe_query | mysql.rs:114:25:114:45 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | | mysql.rs:114:25:114:45 | unsafe_query.as_str() [&ref] | mysql.rs:114:25:114:45 | unsafe_query.as_str() | provenance | Sink:MaD:17 | | mysql.rs:116:33:116:44 | unsafe_query | mysql.rs:116:33:116:53 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | -| mysql.rs:116:33:116:53 | unsafe_query.as_str() [&ref] | mysql.rs:116:33:116:53 | unsafe_query.as_str() | provenance | Sink:MaD:4 | +| mysql.rs:116:33:116:53 | unsafe_query.as_str() [&ref] | mysql.rs:116:33:116:53 | unsafe_query.as_str() | provenance | Sink:MaD:13 | | mysql.rs:118:40:118:51 | unsafe_query | mysql.rs:118:40:118:60 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | | mysql.rs:118:40:118:60 | unsafe_query.as_str() [&ref] | mysql.rs:118:40:118:60 | unsafe_query.as_str() | provenance | Sink:MaD:19 | | mysql.rs:121:24:121:35 | unsafe_query | mysql.rs:121:24:121:44 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | | mysql.rs:121:24:121:44 | unsafe_query.as_str() [&ref] | mysql.rs:121:24:121:44 | unsafe_query.as_str() | provenance | Sink:MaD:18 | | mysql.rs:149:31:149:42 | unsafe_query | mysql.rs:149:31:149:51 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | -| mysql.rs:149:31:149:51 | unsafe_query.as_str() [&ref] | mysql.rs:149:31:149:51 | unsafe_query.as_str() | provenance | Sink:MaD:3 | +| mysql.rs:149:31:149:51 | unsafe_query.as_str() [&ref] | mysql.rs:149:31:149:51 | unsafe_query.as_str() | provenance | Sink:MaD:12 | | mysql.rs:154:26:154:37 | unsafe_query | mysql.rs:154:26:154:46 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | | mysql.rs:154:26:154:46 | unsafe_query.as_str() [&ref] | mysql.rs:154:26:154:46 | unsafe_query.as_str() | provenance | Sink:MaD:15 | | sqlx.rs:47:9:47:18 | arg_string | sqlx.rs:53:27:53:36 | arg_string | provenance | | | sqlx.rs:47:22:47:37 | ...::args(...) | sqlx.rs:47:22:47:37 | ...::args(...) [element] | provenance | Src:MaD:24 | -| sqlx.rs:47:22:47:37 | ...::args(...) [element] | sqlx.rs:47:22:47:44 | ... .nth(...) [Some] | provenance | MaD:34 | -| sqlx.rs:47:22:47:44 | ... .nth(...) [Some] | sqlx.rs:47:22:47:77 | ... .unwrap_or(...) | provenance | MaD:28 | +| sqlx.rs:47:22:47:37 | ...::args(...) [element] | sqlx.rs:47:22:47:44 | ... .nth(...) [Some] | provenance | MaD:28 | +| sqlx.rs:47:22:47:44 | ... .nth(...) [Some] | sqlx.rs:47:22:47:77 | ... .unwrap_or(...) | provenance | MaD:29 | | sqlx.rs:47:22:47:77 | ... .unwrap_or(...) | sqlx.rs:47:9:47:18 | arg_string | provenance | | | sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:54:27:54:39 | remote_string | provenance | | | sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:55:84:55:96 | remote_string | provenance | | | sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:59:17:59:72 | MacroExpr | provenance | | | sqlx.rs:48:25:48:69 | ...::get(...) | sqlx.rs:48:25:48:69 | ...::get(...) [Ok] | provenance | Src:MaD:23 | -| sqlx.rs:48:25:48:69 | ...::get(...) [Ok] | sqlx.rs:48:25:48:78 | ... .unwrap() | provenance | MaD:29 | -| sqlx.rs:48:25:48:78 | ... .unwrap() | sqlx.rs:48:25:48:85 | ... .text() [Ok] | provenance | MaD:31 | -| sqlx.rs:48:25:48:85 | ... .text() [Ok] | sqlx.rs:48:25:48:118 | ... .unwrap_or(...) | provenance | MaD:30 | +| sqlx.rs:48:25:48:69 | ...::get(...) [Ok] | sqlx.rs:48:25:48:78 | ... .unwrap() | provenance | MaD:30 | +| sqlx.rs:48:25:48:78 | ... .unwrap() | sqlx.rs:48:25:48:85 | ... .text() [Ok] | provenance | MaD:32 | +| sqlx.rs:48:25:48:85 | ... .text() [Ok] | sqlx.rs:48:25:48:118 | ... .unwrap_or(...) | provenance | MaD:31 | | sqlx.rs:48:25:48:118 | ... .unwrap_or(...) | sqlx.rs:48:9:48:21 | remote_string | provenance | | | sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:38 | unsafe_query_1 [&ref] | provenance | | | sqlx.rs:53:26:53:36 | &arg_string [&ref] | sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | provenance | | @@ -146,8 +146,8 @@ edges | sqlx.rs:56:9:56:22 | unsafe_query_4 | sqlx.rs:82:29:82:42 | unsafe_query_4 | provenance | | | sqlx.rs:59:17:59:72 | ...::format(...) | sqlx.rs:59:17:59:72 | { ... } | provenance | | | sqlx.rs:59:17:59:72 | ...::must_use(...) | sqlx.rs:56:9:56:22 | unsafe_query_4 | provenance | | -| sqlx.rs:59:17:59:72 | MacroExpr | sqlx.rs:59:17:59:72 | ...::format(...) | provenance | MaD:32 | -| sqlx.rs:59:17:59:72 | { ... } | sqlx.rs:59:17:59:72 | ...::must_use(...) | provenance | MaD:33 | +| sqlx.rs:59:17:59:72 | MacroExpr | sqlx.rs:59:17:59:72 | ...::format(...) | provenance | MaD:33 | +| sqlx.rs:59:17:59:72 | { ... } | sqlx.rs:59:17:59:72 | ...::must_use(...) | provenance | MaD:34 | | sqlx.rs:78:25:78:38 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | provenance | MaD:27 | | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() | provenance | Sink:MaD:20 | | sqlx.rs:80:29:80:42 | unsafe_query_2 [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | provenance | MaD:27 | @@ -158,9 +158,9 @@ edges | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | provenance | Sink:MaD:20 | | sqlx.rs:100:9:100:21 | remote_string | sqlx.rs:102:84:102:96 | remote_string | provenance | | | sqlx.rs:100:25:100:69 | ...::get(...) | sqlx.rs:100:25:100:69 | ...::get(...) [Ok] | provenance | Src:MaD:23 | -| sqlx.rs:100:25:100:69 | ...::get(...) [Ok] | sqlx.rs:100:25:100:78 | ... .unwrap() | provenance | MaD:29 | -| sqlx.rs:100:25:100:78 | ... .unwrap() | sqlx.rs:100:25:100:85 | ... .text() [Ok] | provenance | MaD:31 | -| sqlx.rs:100:25:100:85 | ... .text() [Ok] | sqlx.rs:100:25:100:118 | ... .unwrap_or(...) | provenance | MaD:30 | +| sqlx.rs:100:25:100:69 | ...::get(...) [Ok] | sqlx.rs:100:25:100:78 | ... .unwrap() | provenance | MaD:30 | +| sqlx.rs:100:25:100:78 | ... .unwrap() | sqlx.rs:100:25:100:85 | ... .text() [Ok] | provenance | MaD:32 | +| sqlx.rs:100:25:100:85 | ... .text() [Ok] | sqlx.rs:100:25:100:118 | ... .unwrap_or(...) | provenance | MaD:31 | | sqlx.rs:100:25:100:118 | ... .unwrap_or(...) | sqlx.rs:100:9:100:21 | remote_string | provenance | | | sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:113:31:113:44 | unsafe_query_1 | provenance | | | sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:120:29:120:42 | unsafe_query_1 | provenance | | @@ -186,9 +186,9 @@ edges | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() | provenance | Sink:MaD:20 | | sqlx.rs:173:9:173:21 | remote_string | sqlx.rs:175:84:175:96 | remote_string | provenance | | | sqlx.rs:173:25:173:69 | ...::get(...) | sqlx.rs:173:25:173:69 | ...::get(...) [Ok] | provenance | Src:MaD:23 | -| sqlx.rs:173:25:173:69 | ...::get(...) [Ok] | sqlx.rs:173:25:173:78 | ... .unwrap() | provenance | MaD:29 | -| sqlx.rs:173:25:173:78 | ... .unwrap() | sqlx.rs:173:25:173:85 | ... .text() [Ok] | provenance | MaD:31 | -| sqlx.rs:173:25:173:85 | ... .text() [Ok] | sqlx.rs:173:25:173:118 | ... .unwrap_or(...) | provenance | MaD:30 | +| sqlx.rs:173:25:173:69 | ...::get(...) [Ok] | sqlx.rs:173:25:173:78 | ... .unwrap() | provenance | MaD:30 | +| sqlx.rs:173:25:173:78 | ... .unwrap() | sqlx.rs:173:25:173:85 | ... .text() [Ok] | provenance | MaD:32 | +| sqlx.rs:173:25:173:85 | ... .text() [Ok] | sqlx.rs:173:25:173:118 | ... .unwrap_or(...) | provenance | MaD:31 | | sqlx.rs:173:25:173:118 | ... .unwrap_or(...) | sqlx.rs:173:9:173:21 | remote_string | provenance | | | sqlx.rs:175:9:175:22 | unsafe_query_1 | sqlx.rs:188:29:188:42 | unsafe_query_1 | provenance | | | sqlx.rs:175:26:175:96 | ... + ... | sqlx.rs:175:26:175:102 | ... + ... | provenance | MaD:26 | @@ -200,23 +200,23 @@ edges models | 1 | Sink: ::prep; Argument[0]; sql-injection | | 2 | Sink: ::query_iter; Argument[0]; sql-injection | -| 3 | Sink: ::prep; Argument[0]; sql-injection | -| 4 | Sink: ::query_iter; Argument[0]; sql-injection | -| 5 | Sink: mysql::conn::queryable::Queryable::query; Argument[0]; sql-injection | -| 6 | Sink: mysql::conn::queryable::Queryable::query_drop; Argument[0]; sql-injection | -| 7 | Sink: mysql::conn::queryable::Queryable::query_first; Argument[0]; sql-injection | -| 8 | Sink: mysql::conn::queryable::Queryable::query_first_opt; Argument[0]; sql-injection | -| 9 | Sink: mysql::conn::queryable::Queryable::query_fold; Argument[0]; sql-injection | -| 10 | Sink: mysql::conn::queryable::Queryable::query_fold_opt; Argument[0]; sql-injection | -| 11 | Sink: mysql::conn::queryable::Queryable::query_map; Argument[0]; sql-injection | -| 12 | Sink: mysql::conn::queryable::Queryable::query_map_opt; Argument[0]; sql-injection | -| 13 | Sink: mysql::conn::queryable::Queryable::query_opt; Argument[0]; sql-injection | -| 14 | Sink: mysql_async::queryable::Queryable::query; Argument[0]; sql-injection | -| 15 | Sink: mysql_async::queryable::Queryable::query_drop; Argument[0]; sql-injection | -| 16 | Sink: mysql_async::queryable::Queryable::query_first; Argument[0]; sql-injection | -| 17 | Sink: mysql_async::queryable::Queryable::query_fold; Argument[0]; sql-injection | -| 18 | Sink: mysql_async::queryable::Queryable::query_map; Argument[0]; sql-injection | -| 19 | Sink: mysql_async::queryable::Queryable::query_stream; Argument[0]; sql-injection | +| 3 | Sink: ::query; Argument[0]; sql-injection | +| 4 | Sink: ::query_drop; Argument[0]; sql-injection | +| 5 | Sink: ::query_first; Argument[0]; sql-injection | +| 6 | Sink: ::query_first_opt; Argument[0]; sql-injection | +| 7 | Sink: ::query_fold; Argument[0]; sql-injection | +| 8 | Sink: ::query_fold_opt; Argument[0]; sql-injection | +| 9 | Sink: ::query_map; Argument[0]; sql-injection | +| 10 | Sink: ::query_map_opt; Argument[0]; sql-injection | +| 11 | Sink: ::query_opt; Argument[0]; sql-injection | +| 12 | Sink: ::prep; Argument[0]; sql-injection | +| 13 | Sink: ::query_iter; Argument[0]; sql-injection | +| 14 | Sink: ::query; Argument[0]; sql-injection | +| 15 | Sink: ::query_drop; Argument[0]; sql-injection | +| 16 | Sink: ::query_first; Argument[0]; sql-injection | +| 17 | Sink: ::query_fold; Argument[0]; sql-injection | +| 18 | Sink: ::query_map; Argument[0]; sql-injection | +| 19 | Sink: ::query_stream; Argument[0]; sql-injection | | 20 | Sink: sqlx_core::query::query; Argument[0]; sql-injection | | 21 | Sink: sqlx_core::query_as::query_as; Argument[0]; sql-injection | | 22 | Sink: sqlx_core::raw_sql::raw_sql; Argument[0]; sql-injection | @@ -225,13 +225,13 @@ models | 25 | Summary: ::add; Argument[0].Reference; ReturnValue; taint | | 26 | Summary: ::add; Argument[self]; ReturnValue; taint | | 27 | Summary: ::as_str; Argument[self].Reference; ReturnValue.Reference; taint | -| 28 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 29 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 30 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 31 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 32 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | -| 33 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | -| 34 | Summary: core::iter::traits::iterator::Iterator::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 28 | Summary: ::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 29 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 30 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 31 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 32 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 33 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 34 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes | mysql.rs:12:13:12:29 | mut remote_string | semmle.label | mut remote_string | | mysql.rs:12:33:12:77 | ...::get(...) | semmle.label | ...::get(...) | diff --git a/rust/ql/test/query-tests/security/CWE-117/LogInjection.expected b/rust/ql/test/query-tests/security/CWE-117/LogInjection.expected index ad2659ce297f..5b8c80bda2cc 100644 --- a/rust/ql/test/query-tests/security/CWE-117/LogInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-117/LogInjection.expected @@ -21,7 +21,7 @@ edges | main.rs:8:9:8:12 | args [element] | main.rs:9:20:9:23 | args [element] | provenance | | | main.rs:8:29:8:39 | ...::args(...) | main.rs:8:29:8:39 | ...::args(...) [element] | provenance | Src:MaD:6 | -| main.rs:8:29:8:39 | ...::args(...) [element] | main.rs:8:29:8:49 | ... .collect() [element] | provenance | MaD:22 | +| main.rs:8:29:8:39 | ...::args(...) [element] | main.rs:8:29:8:49 | ... .collect() [element] | provenance | MaD:12 | | main.rs:8:29:8:49 | ... .collect() [element] | main.rs:8:9:8:12 | args [element] | provenance | | | main.rs:9:9:9:16 | username | main.rs:15:11:15:36 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:9:9:9:16 | username | main.rs:18:12:18:37 | MacroExpr | provenance | Sink:MaD:1 | @@ -29,27 +29,27 @@ edges | main.rs:9:9:9:16 | username | main.rs:26:55:26:62 | username | provenance | | | main.rs:9:9:9:16 | username | main.rs:30:11:30:66 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:9:9:9:16 | username | main.rs:52:29:52:36 | username | provenance | | -| main.rs:9:20:9:23 | args [element] | main.rs:9:20:9:30 | args.get(...) [Some, &ref] | provenance | MaD:9 | -| main.rs:9:20:9:30 | args.get(...) [Some, &ref] | main.rs:9:20:9:64 | ... .unwrap_or(...) [&ref] | provenance | MaD:12 | -| main.rs:9:20:9:64 | ... .unwrap_or(...) [&ref] | main.rs:9:20:9:72 | ... .clone() | provenance | MaD:20 | +| main.rs:9:20:9:23 | args [element] | main.rs:9:20:9:30 | args.get(...) [Some, &ref] | provenance | MaD:10 | +| main.rs:9:20:9:30 | args.get(...) [Some, &ref] | main.rs:9:20:9:64 | ... .unwrap_or(...) [&ref] | provenance | MaD:16 | +| main.rs:9:20:9:64 | ... .unwrap_or(...) [&ref] | main.rs:9:20:9:72 | ... .clone() | provenance | MaD:11 | | main.rs:9:20:9:72 | ... .clone() | main.rs:9:9:9:16 | username | provenance | | | main.rs:10:9:10:18 | user_input | main.rs:16:11:16:44 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:10:9:10:18 | user_input | main.rs:19:12:19:39 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:10:22:10:48 | ...::var(...) | main.rs:10:22:10:48 | ...::var(...) [Ok] | provenance | Src:MaD:7 | -| main.rs:10:22:10:48 | ...::var(...) [Ok] | main.rs:10:22:10:81 | ... .unwrap_or(...) | provenance | MaD:15 | +| main.rs:10:22:10:48 | ...::var(...) [Ok] | main.rs:10:22:10:81 | ... .unwrap_or(...) | provenance | MaD:19 | | main.rs:10:22:10:81 | ... .unwrap_or(...) | main.rs:10:9:10:18 | user_input | provenance | | | main.rs:11:9:11:19 | remote_data | main.rs:17:12:17:46 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:11:9:11:19 | remote_data | main.rs:30:11:30:66 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:11:23:11:71 | ...::get(...) | main.rs:11:23:11:71 | ...::get(...) [Ok] | provenance | Src:MaD:5 | -| main.rs:11:23:11:71 | ...::get(...) [Ok] | main.rs:11:23:12:17 | ... .unwrap() | provenance | MaD:14 | -| main.rs:11:23:12:17 | ... .unwrap() | main.rs:11:23:12:24 | ... .text() [Ok] | provenance | MaD:17 | -| main.rs:11:23:12:24 | ... .text() [Ok] | main.rs:11:23:12:61 | ... .unwrap_or(...) | provenance | MaD:15 | +| main.rs:11:23:11:71 | ...::get(...) [Ok] | main.rs:11:23:12:17 | ... .unwrap() | provenance | MaD:18 | +| main.rs:11:23:12:17 | ... .unwrap() | main.rs:11:23:12:24 | ... .text() [Ok] | provenance | MaD:21 | +| main.rs:11:23:12:24 | ... .text() [Ok] | main.rs:11:23:12:61 | ... .unwrap_or(...) | provenance | MaD:19 | | main.rs:11:23:12:61 | ... .unwrap_or(...) | main.rs:11:9:11:19 | remote_data | provenance | | | main.rs:22:9:22:21 | formatted_msg | main.rs:23:11:23:29 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:22:33:22:63 | ...::format(...) | main.rs:22:33:22:63 | { ... } | provenance | | | main.rs:22:33:22:63 | ...::must_use(...) | main.rs:22:9:22:21 | formatted_msg | provenance | | -| main.rs:22:33:22:63 | MacroExpr | main.rs:22:33:22:63 | ...::format(...) | provenance | MaD:18 | -| main.rs:22:33:22:63 | { ... } | main.rs:22:33:22:63 | ...::must_use(...) | provenance | MaD:21 | +| main.rs:22:33:22:63 | MacroExpr | main.rs:22:33:22:63 | ...::format(...) | provenance | MaD:22 | +| main.rs:22:33:22:63 | { ... } | main.rs:22:33:22:63 | ...::must_use(...) | provenance | MaD:23 | | main.rs:26:9:26:18 | concat_msg | main.rs:27:11:27:26 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:26:22:26:62 | ... + ... | main.rs:26:9:26:18 | concat_msg | provenance | | | main.rs:26:54:26:62 | &username [&ref] | main.rs:26:22:26:62 | ... + ... | provenance | MaD:8 | @@ -59,7 +59,7 @@ edges | main.rs:56:27:56:40 | ...: ... [&ref] | main.rs:65:38:65:45 | username [&ref] | provenance | | | main.rs:65:9:65:17 | user_info [UserInfo] | main.rs:66:28:66:36 | user_info [UserInfo] | provenance | | | main.rs:65:21:65:59 | UserInfo {...} [UserInfo] | main.rs:65:9:65:17 | user_info [UserInfo] | provenance | | -| main.rs:65:38:65:45 | username [&ref] | main.rs:65:38:65:57 | username.to_string() | provenance | MaD:19 | +| main.rs:65:38:65:45 | username [&ref] | main.rs:65:38:65:57 | username.to_string() | provenance | MaD:9 | | main.rs:65:38:65:57 | username.to_string() | main.rs:65:21:65:59 | UserInfo {...} [UserInfo] | provenance | | | main.rs:66:28:66:36 | user_info [UserInfo] | main.rs:66:28:66:41 | user_info.name | provenance | | | main.rs:66:28:66:41 | user_info.name | main.rs:66:11:66:41 | MacroExpr | provenance | Sink:MaD:1 | @@ -70,20 +70,20 @@ edges | main.rs:109:13:109:21 | user_data | main.rs:116:16:116:37 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:109:13:109:21 | user_data | main.rs:119:15:119:75 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:109:25:109:40 | ...::args(...) | main.rs:109:25:109:40 | ...::args(...) [element] | provenance | Src:MaD:6 | -| main.rs:109:25:109:40 | ...::args(...) [element] | main.rs:109:25:109:47 | ... .nth(...) [Some] | provenance | MaD:23 | -| main.rs:109:25:109:47 | ... .nth(...) [Some] | main.rs:109:25:109:67 | ... .unwrap_or_default() | provenance | MaD:13 | +| main.rs:109:25:109:40 | ...::args(...) [element] | main.rs:109:25:109:47 | ... .nth(...) [Some] | provenance | MaD:13 | +| main.rs:109:25:109:47 | ... .nth(...) [Some] | main.rs:109:25:109:67 | ... .unwrap_or_default() | provenance | MaD:17 | | main.rs:109:25:109:67 | ... .unwrap_or_default() | main.rs:109:13:109:21 | user_data | provenance | | | main.rs:127:13:127:21 | user_data | main.rs:130:18:130:38 | MacroExpr | provenance | Sink:MaD:3 | | main.rs:127:13:127:21 | user_data | main.rs:131:19:131:49 | MacroExpr | provenance | Sink:MaD:2 | | main.rs:127:25:127:45 | ...::var(...) | main.rs:127:25:127:45 | ...::var(...) [Ok] | provenance | Src:MaD:7 | -| main.rs:127:25:127:45 | ...::var(...) [Ok] | main.rs:127:25:127:65 | ... .unwrap_or_default() | provenance | MaD:16 | +| main.rs:127:25:127:45 | ...::var(...) [Ok] | main.rs:127:25:127:65 | ... .unwrap_or_default() | provenance | MaD:20 | | main.rs:127:25:127:65 | ... .unwrap_or_default() | main.rs:127:13:127:21 | user_data | provenance | | | main.rs:141:13:141:18 | m_path [Some] | main.rs:143:26:143:31 | m_path [Some] | provenance | | -| main.rs:141:22:141:27 | o_path | main.rs:141:22:141:38 | o_path.map(...) [Some] | provenance | MaD:10 | -| main.rs:141:22:141:27 | o_path | main.rs:141:34:141:34 | ... | provenance | MaD:10 | +| main.rs:141:22:141:27 | o_path | main.rs:141:22:141:38 | o_path.map(...) [Some] | provenance | MaD:14 | +| main.rs:141:22:141:27 | o_path | main.rs:141:34:141:34 | ... | provenance | MaD:14 | | main.rs:141:22:141:38 | o_path.map(...) [Some] | main.rs:141:13:141:18 | m_path [Some] | provenance | | | main.rs:141:34:141:34 | ... | main.rs:141:37:141:37 | x | provenance | | -| main.rs:143:26:143:31 | m_path [Some] | main.rs:143:26:143:40 | m_path.unwrap() | provenance | MaD:11 | +| main.rs:143:26:143:31 | m_path [Some] | main.rs:143:26:143:40 | m_path.unwrap() | provenance | MaD:15 | | main.rs:143:26:143:40 | m_path.unwrap() | main.rs:143:18:143:40 | MacroExpr | provenance | Sink:MaD:3 | | main.rs:150:32:150:48 | my_axum_handler_1 | main.rs:141:22:141:27 | o_path | provenance | Src:MaD:4 | models @@ -95,21 +95,21 @@ models | 6 | Source: std::env::args; ReturnValue.Element; commandargs | | 7 | Source: std::env::var; ReturnValue.Field[core::result::Result::Ok(0)]; environment | | 8 | Summary: ::add; Argument[0].Reference; ReturnValue; taint | -| 9 | Summary: ::deref; Argument[self].Reference.Element; ReturnValue.Reference.Element; value | -| 10 | Summary: ::map; Argument[self].Field[core::option::Option::Some(0)]; Argument[0].Parameter[0]; value | -| 11 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 12 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 13 | Summary: ::unwrap_or_default; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 14 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 15 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 16 | Summary: ::unwrap_or_default; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 17 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 18 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | -| 19 | Summary: alloc::string::ToString::to_string; Argument[self].Reference; ReturnValue; taint | -| 20 | Summary: core::clone::Clone::clone; Argument[self].Reference; ReturnValue; value | -| 21 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | -| 22 | Summary: core::iter::traits::iterator::Iterator::collect; Argument[self].Element; ReturnValue.Element; value | -| 23 | Summary: core::iter::traits::iterator::Iterator::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 9 | Summary: ::to_string; Argument[self].Reference; ReturnValue; taint | +| 10 | Summary: ::deref; Argument[self].Reference.Element; ReturnValue.Reference.Element; value | +| 11 | Summary: ::clone; Argument[self].Reference; ReturnValue; value | +| 12 | Summary: ::collect; Argument[self].Element; ReturnValue.Element; value | +| 13 | Summary: ::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 14 | Summary: ::map; Argument[self].Field[core::option::Option::Some(0)]; Argument[0].Parameter[0]; value | +| 15 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 16 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 17 | Summary: ::unwrap_or_default; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 18 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 19 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 20 | Summary: ::unwrap_or_default; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 21 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 22 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 23 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes | main.rs:8:9:8:12 | args [element] | semmle.label | args [element] | | main.rs:8:29:8:39 | ...::args(...) | semmle.label | ...::args(...) | diff --git a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected index 702f5f48952d..6fb6fee32f28 100644 --- a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected +++ b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected @@ -122,7 +122,7 @@ edges | test_logging.rs:99:9:99:10 | m3 | test_logging.rs:100:11:100:18 | MacroExpr | provenance | Sink:MaD:11 | | test_logging.rs:99:22:99:45 | ...::format(...) | test_logging.rs:99:22:99:45 | { ... } | provenance | | | test_logging.rs:99:22:99:45 | ...::must_use(...) | test_logging.rs:99:9:99:10 | m3 | provenance | | -| test_logging.rs:99:22:99:45 | MacroExpr | test_logging.rs:99:22:99:45 | ...::format(...) | provenance | MaD:18 | +| test_logging.rs:99:22:99:45 | MacroExpr | test_logging.rs:99:22:99:45 | ...::format(...) | provenance | MaD:19 | | test_logging.rs:99:22:99:45 | { ... } | test_logging.rs:99:22:99:45 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:99:38:99:45 | password | test_logging.rs:99:22:99:45 | MacroExpr | provenance | | | test_logging.rs:118:28:118:41 | get_password(...) | test_logging.rs:118:12:118:41 | MacroExpr | provenance | Sink:MaD:11 | @@ -139,7 +139,7 @@ edges | test_logging.rs:176:34:176:79 | MacroExpr | test_logging.rs:176:33:176:79 | &... [&ref] | provenance | | | test_logging.rs:176:42:176:78 | ...::format(...) | test_logging.rs:176:42:176:78 | { ... } | provenance | | | test_logging.rs:176:42:176:78 | ...::must_use(...) | test_logging.rs:176:34:176:79 | MacroExpr | provenance | | -| test_logging.rs:176:42:176:78 | MacroExpr | test_logging.rs:176:42:176:78 | ...::format(...) | provenance | MaD:18 | +| test_logging.rs:176:42:176:78 | MacroExpr | test_logging.rs:176:42:176:78 | ...::format(...) | provenance | MaD:19 | | test_logging.rs:176:42:176:78 | { ... } | test_logging.rs:176:42:176:78 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:176:70:176:78 | password2 | test_logging.rs:176:42:176:78 | MacroExpr | provenance | | | test_logging.rs:180:35:180:81 | &... | test_logging.rs:180:35:180:81 | &... | provenance | Sink:MaD:3 | @@ -148,12 +148,12 @@ edges | test_logging.rs:180:36:180:81 | MacroExpr | test_logging.rs:180:35:180:81 | &... [&ref] | provenance | | | test_logging.rs:180:44:180:80 | ...::format(...) | test_logging.rs:180:44:180:80 | { ... } | provenance | | | test_logging.rs:180:44:180:80 | ...::must_use(...) | test_logging.rs:180:36:180:81 | MacroExpr | provenance | | -| test_logging.rs:180:44:180:80 | MacroExpr | test_logging.rs:180:44:180:80 | ...::format(...) | provenance | MaD:18 | +| test_logging.rs:180:44:180:80 | MacroExpr | test_logging.rs:180:44:180:80 | ...::format(...) | provenance | MaD:19 | | test_logging.rs:180:44:180:80 | { ... } | test_logging.rs:180:44:180:80 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:180:72:180:80 | password2 | test_logging.rs:180:44:180:80 | MacroExpr | provenance | | | test_logging.rs:183:9:183:19 | err_result2 [Err] | test_logging.rs:184:13:184:23 | err_result2 | provenance | Sink:MaD:4 | | test_logging.rs:183:47:183:68 | Err(...) [Err] | test_logging.rs:183:9:183:19 | err_result2 [Err] | provenance | | -| test_logging.rs:183:51:183:59 | password2 | test_logging.rs:183:51:183:67 | password2.clone() | provenance | MaD:19 | +| test_logging.rs:183:51:183:59 | password2 | test_logging.rs:183:51:183:67 | password2.clone() | provenance | MaD:18 | | test_logging.rs:183:51:183:67 | password2.clone() | test_logging.rs:183:47:183:68 | Err(...) [Err] | provenance | | | test_logging.rs:187:9:187:19 | err_result3 [Err] | test_logging.rs:188:13:188:23 | err_result3 | provenance | Sink:MaD:5 | | test_logging.rs:187:47:187:60 | Err(...) [Err] | test_logging.rs:187:9:187:19 | err_result3 [Err] | provenance | | @@ -184,35 +184,35 @@ edges | test_logging.rs:229:30:229:71 | ... .as_str() [&ref] | test_logging.rs:229:30:229:71 | ... .as_str() | provenance | Sink:MaD:2 | | test_logging.rs:229:38:229:61 | ...::format(...) | test_logging.rs:229:38:229:61 | { ... } | provenance | | | test_logging.rs:229:38:229:61 | ...::must_use(...) | test_logging.rs:229:30:229:62 | MacroExpr | provenance | | -| test_logging.rs:229:38:229:61 | MacroExpr | test_logging.rs:229:38:229:61 | ...::format(...) | provenance | MaD:18 | +| test_logging.rs:229:38:229:61 | MacroExpr | test_logging.rs:229:38:229:61 | ...::format(...) | provenance | MaD:19 | | test_logging.rs:229:38:229:61 | { ... } | test_logging.rs:229:38:229:61 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:229:54:229:61 | password | test_logging.rs:229:38:229:61 | MacroExpr | provenance | | | test_logging.rs:242:16:242:50 | MacroExpr | test_logging.rs:242:16:242:61 | ... .as_bytes() [&ref, element] | provenance | MaD:16 | | test_logging.rs:242:16:242:61 | ... .as_bytes() [&ref, element] | test_logging.rs:242:16:242:61 | ... .as_bytes() | provenance | Sink:MaD:7 Sink:MaD:7 | | test_logging.rs:242:24:242:49 | ...::format(...) | test_logging.rs:242:24:242:49 | { ... } | provenance | | | test_logging.rs:242:24:242:49 | ...::must_use(...) | test_logging.rs:242:16:242:50 | MacroExpr | provenance | | -| test_logging.rs:242:24:242:49 | MacroExpr | test_logging.rs:242:24:242:49 | ...::format(...) | provenance | MaD:18 | +| test_logging.rs:242:24:242:49 | MacroExpr | test_logging.rs:242:24:242:49 | ...::format(...) | provenance | MaD:19 | | test_logging.rs:242:24:242:49 | { ... } | test_logging.rs:242:24:242:49 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:242:42:242:49 | password | test_logging.rs:242:24:242:49 | MacroExpr | provenance | | | test_logging.rs:245:20:245:54 | MacroExpr | test_logging.rs:245:20:245:65 | ... .as_bytes() [&ref, element] | provenance | MaD:16 | | test_logging.rs:245:20:245:65 | ... .as_bytes() [&ref, element] | test_logging.rs:245:20:245:65 | ... .as_bytes() | provenance | Sink:MaD:8 Sink:MaD:8 | | test_logging.rs:245:28:245:53 | ...::format(...) | test_logging.rs:245:28:245:53 | { ... } | provenance | | | test_logging.rs:245:28:245:53 | ...::must_use(...) | test_logging.rs:245:20:245:54 | MacroExpr | provenance | | -| test_logging.rs:245:28:245:53 | MacroExpr | test_logging.rs:245:28:245:53 | ...::format(...) | provenance | MaD:18 | +| test_logging.rs:245:28:245:53 | MacroExpr | test_logging.rs:245:28:245:53 | ...::format(...) | provenance | MaD:19 | | test_logging.rs:245:28:245:53 | { ... } | test_logging.rs:245:28:245:53 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:245:46:245:53 | password | test_logging.rs:245:28:245:53 | MacroExpr | provenance | | | test_logging.rs:248:15:248:49 | MacroExpr | test_logging.rs:248:15:248:60 | ... .as_bytes() [&ref, element] | provenance | MaD:16 | | test_logging.rs:248:15:248:60 | ... .as_bytes() [&ref, element] | test_logging.rs:248:15:248:60 | ... .as_bytes() | provenance | Sink:MaD:7 Sink:MaD:7 | | test_logging.rs:248:23:248:48 | ...::format(...) | test_logging.rs:248:23:248:48 | { ... } | provenance | | | test_logging.rs:248:23:248:48 | ...::must_use(...) | test_logging.rs:248:15:248:49 | MacroExpr | provenance | | -| test_logging.rs:248:23:248:48 | MacroExpr | test_logging.rs:248:23:248:48 | ...::format(...) | provenance | MaD:18 | +| test_logging.rs:248:23:248:48 | MacroExpr | test_logging.rs:248:23:248:48 | ...::format(...) | provenance | MaD:19 | | test_logging.rs:248:23:248:48 | { ... } | test_logging.rs:248:23:248:48 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:248:41:248:48 | password | test_logging.rs:248:23:248:48 | MacroExpr | provenance | | | test_logging.rs:251:15:251:49 | MacroExpr | test_logging.rs:251:15:251:60 | ... .as_bytes() [&ref, element] | provenance | MaD:16 | | test_logging.rs:251:15:251:60 | ... .as_bytes() [&ref, element] | test_logging.rs:251:15:251:60 | ... .as_bytes() | provenance | Sink:MaD:6 Sink:MaD:6 | | test_logging.rs:251:23:251:48 | ...::format(...) | test_logging.rs:251:23:251:48 | { ... } | provenance | | | test_logging.rs:251:23:251:48 | ...::must_use(...) | test_logging.rs:251:15:251:49 | MacroExpr | provenance | | -| test_logging.rs:251:23:251:48 | MacroExpr | test_logging.rs:251:23:251:48 | ...::format(...) | provenance | MaD:18 | +| test_logging.rs:251:23:251:48 | MacroExpr | test_logging.rs:251:23:251:48 | ...::format(...) | provenance | MaD:19 | | test_logging.rs:251:23:251:48 | { ... } | test_logging.rs:251:23:251:48 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:251:41:251:48 | password | test_logging.rs:251:23:251:48 | MacroExpr | provenance | | models @@ -233,8 +233,8 @@ models | 15 | Summary: ::add; Argument[0].Reference; ReturnValue; taint | | 16 | Summary: ::as_bytes; Argument[self].Reference; ReturnValue.Reference.Element; taint | | 17 | Summary: ::as_str; Argument[self].Reference; ReturnValue.Reference; taint | -| 18 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | -| 19 | Summary: core::clone::Clone::clone; Argument[self].Reference; ReturnValue; value | +| 18 | Summary: ::clone; Argument[self].Reference; ReturnValue; value | +| 19 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | | 20 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes | test_logging.rs:42:12:42:35 | MacroExpr | semmle.label | MacroExpr | diff --git a/rust/ql/test/query-tests/security/CWE-614/InsecureCookie.expected b/rust/ql/test/query-tests/security/CWE-614/InsecureCookie.expected index 3719d4c9d7e2..bd1d0fe81ae2 100644 --- a/rust/ql/test/query-tests/security/CWE-614/InsecureCookie.expected +++ b/rust/ql/test/query-tests/security/CWE-614/InsecureCookie.expected @@ -126,9 +126,9 @@ edges | main.rs:58:9:58:13 | mut a | main.rs:59:13:59:13 | a | provenance | | | main.rs:58:9:58:13 | mut a | main.rs:60:22:60:22 | a | provenance | | | main.rs:58:17:58:44 | ...::new(...) | main.rs:58:9:58:13 | mut a | provenance | Src:MaD:17 | -| main.rs:59:13:59:13 | a | main.rs:59:13:59:21 | a.clone() | provenance | MaD:38 | +| main.rs:59:13:59:13 | a | main.rs:59:13:59:21 | a.clone() | provenance | MaD:35 | | main.rs:59:13:59:21 | a.clone() | main.rs:59:13:59:21 | a.clone() | provenance | Sink:MaD:4 | -| main.rs:60:22:60:22 | a | main.rs:60:22:60:30 | a.clone() | provenance | MaD:38 | +| main.rs:60:22:60:22 | a | main.rs:60:22:60:30 | a.clone() | provenance | MaD:35 | | main.rs:60:22:60:30 | a.clone() | main.rs:60:22:60:30 | a.clone() | provenance | Sink:MaD:5 | | main.rs:63:5:63:5 | [SSA] a | main.rs:64:13:64:13 | a | provenance | | | main.rs:63:5:63:5 | [SSA] a | main.rs:70:29:70:29 | a | provenance | | @@ -136,56 +136,56 @@ edges | main.rs:63:5:63:5 | a | main.rs:64:13:64:13 | a | provenance | | | main.rs:63:5:63:5 | a | main.rs:70:29:70:29 | a | provenance | | | main.rs:63:5:63:5 | a | main.rs:79:30:79:30 | a | provenance | | -| main.rs:64:13:64:13 | a | main.rs:64:13:64:21 | a.clone() | provenance | MaD:38 | +| main.rs:64:13:64:13 | a | main.rs:64:13:64:21 | a.clone() | provenance | MaD:35 | | main.rs:64:13:64:21 | a.clone() | main.rs:64:13:64:21 | a.clone() | provenance | Sink:MaD:4 | | main.rs:68:9:68:13 | mut b | main.rs:69:20:69:20 | b | provenance | | | main.rs:68:17:68:37 | ...::named(...) | main.rs:68:9:68:13 | mut b | provenance | Src:MaD:16 | -| main.rs:69:20:69:20 | b | main.rs:69:20:69:28 | b.clone() | provenance | MaD:38 | +| main.rs:69:20:69:20 | b | main.rs:69:20:69:28 | b.clone() | provenance | MaD:35 | | main.rs:69:20:69:28 | b.clone() | main.rs:69:20:69:28 | b.clone() | provenance | Sink:MaD:8 | -| main.rs:70:29:70:29 | a | main.rs:70:29:70:37 | a.clone() | provenance | MaD:38 | +| main.rs:70:29:70:29 | a | main.rs:70:29:70:37 | a.clone() | provenance | MaD:35 | | main.rs:70:29:70:37 | a.clone() | main.rs:70:29:70:37 | a.clone() | provenance | Sink:MaD:9 | | main.rs:71:5:71:5 | [SSA] b | main.rs:72:20:72:20 | b | provenance | | | main.rs:71:5:71:5 | b | main.rs:72:20:72:20 | b | provenance | | -| main.rs:72:20:72:20 | b | main.rs:72:20:72:28 | b.clone() | provenance | MaD:38 | +| main.rs:72:20:72:20 | b | main.rs:72:20:72:28 | b.clone() | provenance | MaD:35 | | main.rs:72:20:72:28 | b.clone() | main.rs:72:20:72:28 | b.clone() | provenance | Sink:MaD:8 | | main.rs:77:9:77:13 | mut c | main.rs:78:21:78:21 | c | provenance | | | main.rs:77:9:77:13 | mut c | main.rs:83:21:83:21 | c | provenance | | | main.rs:77:17:77:36 | ...::from(...) | main.rs:77:9:77:13 | mut c | provenance | Src:MaD:14 | -| main.rs:78:21:78:21 | c | main.rs:78:21:78:29 | c.clone() | provenance | MaD:38 | +| main.rs:78:21:78:21 | c | main.rs:78:21:78:29 | c.clone() | provenance | MaD:35 | | main.rs:78:21:78:29 | c.clone() | main.rs:78:21:78:29 | c.clone() | provenance | Sink:MaD:6 | -| main.rs:79:30:79:30 | a | main.rs:79:30:79:38 | a.clone() | provenance | MaD:38 | +| main.rs:79:30:79:30 | a | main.rs:79:30:79:38 | a.clone() | provenance | MaD:35 | | main.rs:79:30:79:38 | a.clone() | main.rs:79:30:79:38 | a.clone() | provenance | Sink:MaD:7 | -| main.rs:83:21:83:21 | c | main.rs:83:21:83:29 | c.clone() | provenance | MaD:38 | +| main.rs:83:21:83:21 | c | main.rs:83:21:83:29 | c.clone() | provenance | MaD:35 | | main.rs:83:21:83:29 | c.clone() | main.rs:83:21:83:29 | c.clone() | provenance | Sink:MaD:6 | | main.rs:87:9:87:13 | mut d | main.rs:88:13:88:13 | d | provenance | | | main.rs:87:9:87:13 | mut d | main.rs:94:13:94:13 | d | provenance | | | main.rs:87:17:87:36 | ...::from(...) | main.rs:87:9:87:13 | mut d | provenance | Src:MaD:14 | -| main.rs:88:13:88:13 | d | main.rs:88:13:88:21 | d.clone() | provenance | MaD:38 | +| main.rs:88:13:88:13 | d | main.rs:88:13:88:21 | d.clone() | provenance | MaD:35 | | main.rs:88:13:88:21 | d.clone() | main.rs:88:13:88:21 | d.clone() | provenance | Sink:MaD:4 | -| main.rs:94:13:94:13 | d | main.rs:94:13:94:21 | d.clone() | provenance | MaD:38 | +| main.rs:94:13:94:13 | d | main.rs:94:13:94:21 | d.clone() | provenance | MaD:35 | | main.rs:94:13:94:21 | d.clone() | main.rs:94:13:94:21 | d.clone() | provenance | Sink:MaD:4 | | main.rs:114:5:114:36 | ...::build(...) | main.rs:114:5:114:36 | ...::build(...) | provenance | Src:MaD:15 | | main.rs:114:5:114:36 | ...::build(...) | main.rs:114:5:114:54 | ... .partitioned(...) | provenance | MaD:32 | | main.rs:114:5:114:54 | ... .partitioned(...) | main.rs:114:5:114:54 | ... .partitioned(...) | provenance | Sink:MaD:2 | | main.rs:122:9:122:9 | a | main.rs:123:20:123:20 | a | provenance | | | main.rs:122:13:122:58 | ...::new(...) | main.rs:122:9:122:9 | a | provenance | Src:MaD:13 | -| main.rs:123:20:123:20 | a | main.rs:123:20:123:28 | a.clone() | provenance | MaD:38 | +| main.rs:123:20:123:20 | a | main.rs:123:20:123:28 | a.clone() | provenance | MaD:35 | | main.rs:123:20:123:28 | a.clone() | main.rs:123:20:123:28 | a.clone() | provenance | Sink:MaD:1 | | main.rs:130:9:130:9 | c | main.rs:131:20:131:20 | c | provenance | | | main.rs:130:9:130:9 | c | main.rs:134:13:134:13 | c | provenance | | | main.rs:130:13:130:13 | b | main.rs:130:13:130:31 | b.set_secure(...) | provenance | MaD:27 | | main.rs:130:13:130:31 | b.set_secure(...) | main.rs:130:9:130:9 | c | provenance | | -| main.rs:131:20:131:20 | c | main.rs:131:20:131:28 | c.clone() | provenance | MaD:38 | +| main.rs:131:20:131:20 | c | main.rs:131:20:131:28 | c.clone() | provenance | MaD:35 | | main.rs:131:20:131:28 | c.clone() | main.rs:131:20:131:28 | c.clone() | provenance | Sink:MaD:1 | | main.rs:134:9:134:9 | d | main.rs:135:20:135:20 | d | provenance | | | main.rs:134:13:134:13 | c | main.rs:134:13:134:35 | c.set_partitioned(...) | provenance | MaD:24 | | main.rs:134:13:134:35 | c.set_partitioned(...) | main.rs:134:9:134:9 | d | provenance | | -| main.rs:135:20:135:20 | d | main.rs:135:20:135:28 | d.clone() | provenance | MaD:38 | +| main.rs:135:20:135:20 | d | main.rs:135:20:135:28 | d.clone() | provenance | MaD:35 | | main.rs:135:20:135:28 | d.clone() | main.rs:135:20:135:28 | d.clone() | provenance | Sink:MaD:1 | | main.rs:146:9:146:9 | g | main.rs:147:20:147:20 | g | provenance | | | main.rs:146:13:146:13 | f | main.rs:146:13:146:31 | f.set_secure(...) | provenance | MaD:27 | | main.rs:146:13:146:31 | f.set_secure(...) | main.rs:146:9:146:9 | g | provenance | | -| main.rs:147:20:147:20 | g | main.rs:147:20:147:28 | g.clone() | provenance | MaD:38 | +| main.rs:147:20:147:20 | g | main.rs:147:20:147:28 | g.clone() | provenance | MaD:35 | | main.rs:147:20:147:28 | g.clone() | main.rs:147:20:147:28 | g.clone() | provenance | Sink:MaD:1 | | main.rs:151:9:151:9 | h | main.rs:152:20:152:20 | h | provenance | Sink:MaD:1 | | main.rs:151:13:151:61 | ...::from(...) | main.rs:151:9:151:9 | h | provenance | Src:MaD:12 | @@ -202,40 +202,40 @@ edges | main.rs:155:9:155:9 | i | main.rs:166:20:166:20 | i | provenance | | | main.rs:155:9:155:9 | i | main.rs:167:20:167:20 | i | provenance | | | main.rs:155:13:155:58 | ...::new(...) | main.rs:155:9:155:9 | i | provenance | Src:MaD:13 | -| main.rs:156:20:156:20 | i | main.rs:156:20:156:28 | i.clone() | provenance | MaD:38 | +| main.rs:156:20:156:20 | i | main.rs:156:20:156:28 | i.clone() | provenance | MaD:35 | | main.rs:156:20:156:28 | i.clone() | main.rs:156:20:156:46 | ... .set_name(...) | provenance | MaD:23 | | main.rs:156:20:156:46 | ... .set_name(...) | main.rs:156:20:156:46 | ... .set_name(...) | provenance | Sink:MaD:1 | -| main.rs:157:20:157:20 | i | main.rs:157:20:157:28 | i.clone() | provenance | MaD:38 | +| main.rs:157:20:157:20 | i | main.rs:157:20:157:28 | i.clone() | provenance | MaD:35 | | main.rs:157:20:157:28 | i.clone() | main.rs:157:20:157:48 | ... .set_value(...) | provenance | MaD:28 | | main.rs:157:20:157:48 | ... .set_value(...) | main.rs:157:20:157:48 | ... .set_value(...) | provenance | Sink:MaD:1 | -| main.rs:158:20:158:20 | i | main.rs:158:20:158:28 | i.clone() | provenance | MaD:38 | +| main.rs:158:20:158:20 | i | main.rs:158:20:158:28 | i.clone() | provenance | MaD:35 | | main.rs:158:20:158:28 | i.clone() | main.rs:158:20:158:48 | ... .set_http_only(...) | provenance | MaD:21 | | main.rs:158:20:158:48 | ... .set_http_only(...) | main.rs:158:20:158:48 | ... .set_http_only(...) | provenance | Sink:MaD:1 | -| main.rs:159:20:159:20 | i | main.rs:159:20:159:28 | i.clone() | provenance | MaD:38 | +| main.rs:159:20:159:20 | i | main.rs:159:20:159:28 | i.clone() | provenance | MaD:35 | | main.rs:159:20:159:28 | i.clone() | main.rs:159:20:159:70 | ... .set_same_site(...) | provenance | MaD:26 | | main.rs:159:20:159:70 | ... .set_same_site(...) | main.rs:159:20:159:70 | ... .set_same_site(...) | provenance | Sink:MaD:1 | -| main.rs:160:20:160:20 | i | main.rs:160:20:160:28 | i.clone() | provenance | MaD:38 | +| main.rs:160:20:160:20 | i | main.rs:160:20:160:28 | i.clone() | provenance | MaD:35 | | main.rs:160:20:160:28 | i.clone() | main.rs:160:20:160:46 | ... .set_max_age(...) | provenance | MaD:22 | | main.rs:160:20:160:46 | ... .set_max_age(...) | main.rs:160:20:160:46 | ... .set_max_age(...) | provenance | Sink:MaD:1 | -| main.rs:161:20:161:20 | i | main.rs:161:20:161:28 | i.clone() | provenance | MaD:38 | +| main.rs:161:20:161:20 | i | main.rs:161:20:161:28 | i.clone() | provenance | MaD:35 | | main.rs:161:20:161:28 | i.clone() | main.rs:161:20:161:42 | ... .set_path(...) | provenance | MaD:25 | | main.rs:161:20:161:42 | ... .set_path(...) | main.rs:161:20:161:42 | ... .set_path(...) | provenance | Sink:MaD:1 | -| main.rs:162:20:162:20 | i | main.rs:162:20:162:28 | i.clone() | provenance | MaD:38 | +| main.rs:162:20:162:20 | i | main.rs:162:20:162:28 | i.clone() | provenance | MaD:35 | | main.rs:162:20:162:28 | i.clone() | main.rs:162:20:162:41 | ... .unset_path() | provenance | MaD:31 | | main.rs:162:20:162:41 | ... .unset_path() | main.rs:162:20:162:41 | ... .unset_path() | provenance | Sink:MaD:1 | -| main.rs:163:20:163:20 | i | main.rs:163:20:163:28 | i.clone() | provenance | MaD:38 | +| main.rs:163:20:163:20 | i | main.rs:163:20:163:28 | i.clone() | provenance | MaD:35 | | main.rs:163:20:163:28 | i.clone() | main.rs:163:20:163:54 | ... .set_domain(...) | provenance | MaD:19 | | main.rs:163:20:163:54 | ... .set_domain(...) | main.rs:163:20:163:54 | ... .set_domain(...) | provenance | Sink:MaD:1 | -| main.rs:164:20:164:20 | i | main.rs:164:20:164:28 | i.clone() | provenance | MaD:38 | +| main.rs:164:20:164:20 | i | main.rs:164:20:164:28 | i.clone() | provenance | MaD:35 | | main.rs:164:20:164:28 | i.clone() | main.rs:164:20:164:43 | ... .unset_domain() | provenance | MaD:29 | | main.rs:164:20:164:43 | ... .unset_domain() | main.rs:164:20:164:43 | ... .unset_domain() | provenance | Sink:MaD:1 | -| main.rs:165:20:165:20 | i | main.rs:165:20:165:28 | i.clone() | provenance | MaD:38 | +| main.rs:165:20:165:20 | i | main.rs:165:20:165:28 | i.clone() | provenance | MaD:35 | | main.rs:165:20:165:28 | i.clone() | main.rs:165:20:165:46 | ... .set_expires(...) | provenance | MaD:20 | | main.rs:165:20:165:46 | ... .set_expires(...) | main.rs:165:20:165:46 | ... .set_expires(...) | provenance | Sink:MaD:1 | -| main.rs:166:20:166:20 | i | main.rs:166:20:166:28 | i.clone() | provenance | MaD:38 | +| main.rs:166:20:166:20 | i | main.rs:166:20:166:28 | i.clone() | provenance | MaD:35 | | main.rs:166:20:166:28 | i.clone() | main.rs:166:20:166:44 | ... .unset_expires() | provenance | MaD:30 | | main.rs:166:20:166:44 | ... .unset_expires() | main.rs:166:20:166:44 | ... .unset_expires() | provenance | Sink:MaD:1 | -| main.rs:167:20:167:20 | i | main.rs:167:20:167:28 | i.clone() | provenance | MaD:38 | +| main.rs:167:20:167:20 | i | main.rs:167:20:167:28 | i.clone() | provenance | MaD:35 | | main.rs:167:20:167:28 | i.clone() | main.rs:167:20:167:45 | ... .make_permanent() | provenance | MaD:18 | | main.rs:167:20:167:45 | ... .make_permanent() | main.rs:167:20:167:45 | ... .make_permanent() | provenance | Sink:MaD:1 | | main.rs:173:22:173:59 | ...::build(...) | main.rs:173:22:173:59 | ...::build(...) | provenance | Src:MaD:15 Sink:MaD:2 | @@ -246,28 +246,28 @@ edges | main.rs:198:5:198:63 | ... .path(...) | main.rs:198:5:198:63 | ... .path(...) | provenance | Sink:MaD:3 | | main.rs:201:5:201:11 | [SSA] cookie1 | main.rs:202:13:202:19 | cookie1 | provenance | | | main.rs:201:5:201:11 | cookie1 | main.rs:202:13:202:19 | cookie1 | provenance | | -| main.rs:202:13:202:19 | cookie1 | main.rs:202:13:202:27 | cookie1.clone() | provenance | MaD:38 | +| main.rs:202:13:202:19 | cookie1 | main.rs:202:13:202:27 | cookie1.clone() | provenance | MaD:35 | | main.rs:202:13:202:27 | cookie1.clone() | main.rs:202:13:202:27 | cookie1.clone() | provenance | Sink:MaD:4 | | main.rs:212:5:212:39 | ...::build(...) | main.rs:212:5:212:39 | ...::build(...) | provenance | Src:MaD:15 Sink:MaD:3 | | main.rs:214:9:214:15 | cookie3 | main.rs:215:13:215:19 | cookie3 | provenance | | | main.rs:214:19:214:51 | ...::new(...) | main.rs:214:9:214:15 | cookie3 | provenance | Src:MaD:17 | -| main.rs:215:13:215:19 | cookie3 | main.rs:215:13:215:27 | cookie3.clone() | provenance | MaD:38 | +| main.rs:215:13:215:19 | cookie3 | main.rs:215:13:215:27 | cookie3.clone() | provenance | MaD:35 | | main.rs:215:13:215:27 | cookie3.clone() | main.rs:215:13:215:27 | cookie3.clone() | provenance | Sink:MaD:4 | | main.rs:218:5:218:11 | [SSA] cookie2 | main.rs:219:13:219:19 | cookie2 | provenance | | | main.rs:218:5:218:11 | cookie2 | main.rs:219:13:219:19 | cookie2 | provenance | | -| main.rs:219:13:219:19 | cookie2 | main.rs:219:13:219:27 | cookie2.clone() | provenance | MaD:38 | +| main.rs:219:13:219:19 | cookie2 | main.rs:219:13:219:27 | cookie2.clone() | provenance | MaD:35 | | main.rs:219:13:219:27 | cookie2.clone() | main.rs:219:13:219:27 | cookie2.clone() | provenance | Sink:MaD:4 | | main.rs:228:5:228:11 | [SSA] cookie1 | main.rs:229:13:229:19 | cookie1 | provenance | | | main.rs:228:5:228:11 | cookie1 | main.rs:229:13:229:19 | cookie1 | provenance | | -| main.rs:229:13:229:19 | cookie1 | main.rs:229:13:229:27 | cookie1.clone() | provenance | MaD:38 | +| main.rs:229:13:229:19 | cookie1 | main.rs:229:13:229:27 | cookie1.clone() | provenance | MaD:35 | | main.rs:229:13:229:27 | cookie1.clone() | main.rs:229:13:229:27 | cookie1.clone() | provenance | Sink:MaD:11 | | main.rs:241:9:241:25 | cookie_config_bad | main.rs:242:43:242:59 | cookie_config_bad | provenance | Sink:MaD:10 | -| main.rs:241:29:241:62 | ...::new(...) | main.rs:241:29:241:76 | ... .secure(...) | provenance | MaD:37 | +| main.rs:241:29:241:62 | ...::new(...) | main.rs:241:29:241:76 | ... .secure(...) | provenance | MaD:38 | | main.rs:241:29:241:76 | ... .secure(...) | main.rs:241:9:241:25 | cookie_config_bad | provenance | | | main.rs:244:9:244:26 | cookie_config_bad2 | main.rs:245:43:245:60 | cookie_config_bad2 | provenance | Sink:MaD:10 | -| main.rs:244:30:244:63 | ...::new(...) | main.rs:244:30:244:77 | ... .secure(...) | provenance | MaD:37 | -| main.rs:244:30:244:77 | ... .secure(...) | main.rs:244:30:244:90 | ... .name(...) | provenance | MaD:35 | -| main.rs:244:30:244:90 | ... .name(...) | main.rs:244:30:244:100 | ... .path(...) | provenance | MaD:36 | +| main.rs:244:30:244:63 | ...::new(...) | main.rs:244:30:244:77 | ... .secure(...) | provenance | MaD:38 | +| main.rs:244:30:244:77 | ... .secure(...) | main.rs:244:30:244:90 | ... .name(...) | provenance | MaD:36 | +| main.rs:244:30:244:90 | ... .name(...) | main.rs:244:30:244:100 | ... .path(...) | provenance | MaD:37 | | main.rs:244:30:244:100 | ... .path(...) | main.rs:244:9:244:26 | cookie_config_bad2 | provenance | | | main.rs:259:5:259:43 | ...::build(...) | main.rs:259:5:259:57 | ... .secure(...) | provenance | MaD:34 | | main.rs:259:5:259:57 | ... .secure(...) | main.rs:259:5:259:57 | ... .secure(...) | provenance | Sink:MaD:3 | @@ -276,16 +276,16 @@ edges | main.rs:260:5:260:67 | ... .path(...) | main.rs:260:5:260:67 | ... .path(...) | provenance | Sink:MaD:3 | | main.rs:263:5:263:11 | [SSA] cookie1 | main.rs:264:13:264:19 | cookie1 | provenance | | | main.rs:263:5:263:11 | cookie1 | main.rs:264:13:264:19 | cookie1 | provenance | | -| main.rs:264:13:264:19 | cookie1 | main.rs:264:13:264:27 | cookie1.clone() | provenance | MaD:38 | +| main.rs:264:13:264:19 | cookie1 | main.rs:264:13:264:27 | cookie1.clone() | provenance | MaD:35 | | main.rs:264:13:264:27 | cookie1.clone() | main.rs:264:13:264:27 | cookie1.clone() | provenance | Sink:MaD:4 | | main.rs:274:5:274:43 | ...::build(...) | main.rs:274:5:274:43 | ...::build(...) | provenance | Src:MaD:15 Sink:MaD:3 | | main.rs:276:9:276:15 | cookie3 | main.rs:277:13:277:19 | cookie3 | provenance | | | main.rs:276:19:276:55 | ...::new(...) | main.rs:276:9:276:15 | cookie3 | provenance | Src:MaD:17 | -| main.rs:277:13:277:19 | cookie3 | main.rs:277:13:277:27 | cookie3.clone() | provenance | MaD:38 | +| main.rs:277:13:277:19 | cookie3 | main.rs:277:13:277:27 | cookie3.clone() | provenance | MaD:35 | | main.rs:277:13:277:27 | cookie3.clone() | main.rs:277:13:277:27 | cookie3.clone() | provenance | Sink:MaD:4 | | main.rs:280:5:280:11 | [SSA] cookie2 | main.rs:281:13:281:19 | cookie2 | provenance | | | main.rs:280:5:280:11 | cookie2 | main.rs:281:13:281:19 | cookie2 | provenance | | -| main.rs:281:13:281:19 | cookie2 | main.rs:281:13:281:27 | cookie2.clone() | provenance | MaD:38 | +| main.rs:281:13:281:19 | cookie2 | main.rs:281:13:281:27 | cookie2.clone() | provenance | MaD:35 | | main.rs:281:13:281:27 | cookie2.clone() | main.rs:281:13:281:27 | cookie2.clone() | provenance | Sink:MaD:4 | models | 1 | Sink: ::insert; Argument[0]; cookie-use | @@ -322,10 +322,10 @@ models | 32 | Summary: ::partitioned; Argument[self].OptionalBarrier[cookie-partitioned-arg0]; ReturnValue; taint | | 33 | Summary: ::path; Argument[self]; ReturnValue; taint | | 34 | Summary: ::secure; Argument[self].OptionalBarrier[cookie-secure-arg0]; ReturnValue; taint | -| 35 | Summary: ::name; Argument[self]; ReturnValue; taint | -| 36 | Summary: ::path; Argument[self]; ReturnValue; taint | -| 37 | Summary: ::secure; Argument[self].OptionalBarrier[cookie-secure-arg0]; ReturnValue; taint | -| 38 | Summary: core::clone::Clone::clone; Argument[self].Reference; ReturnValue; value | +| 35 | Summary: ::clone; Argument[self].Reference; ReturnValue; value | +| 36 | Summary: ::name; Argument[self]; ReturnValue; taint | +| 37 | Summary: ::path; Argument[self]; ReturnValue; taint | +| 38 | Summary: ::secure; Argument[self].OptionalBarrier[cookie-secure-arg0]; ReturnValue; taint | nodes | main.rs:8:19:8:50 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:8:19:8:64 | ... .secure(...) | semmle.label | ... .secure(...) | diff --git a/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected b/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected index 92ecb8e09d84..d90b16185cb1 100644 --- a/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected +++ b/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected @@ -62,14 +62,14 @@ edges | main.rs:20:9:20:10 | l2 | main.rs:22:31:22:32 | l2 | provenance | | | main.rs:20:9:20:10 | l2 | main.rs:23:31:23:32 | l2 | provenance | | | main.rs:20:9:20:10 | l2 | main.rs:24:38:24:39 | l2 | provenance | Sink:MaD:16 | -| main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | main.rs:20:14:20:63 | ... .unwrap() | provenance | MaD:38 | +| main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | main.rs:20:14:20:63 | ... .unwrap() | provenance | MaD:41 | | main.rs:20:14:20:63 | ... .unwrap() | main.rs:20:9:20:10 | l2 | provenance | | | main.rs:20:50:20:50 | v | main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | provenance | MaD:30 | | main.rs:22:31:22:32 | l2 | main.rs:22:31:22:44 | l2.align_to(...) [Ok] | provenance | MaD:24 | -| main.rs:22:31:22:44 | l2.align_to(...) [Ok] | main.rs:22:31:22:53 | ... .unwrap() | provenance | MaD:38 | +| main.rs:22:31:22:44 | l2.align_to(...) [Ok] | main.rs:22:31:22:53 | ... .unwrap() | provenance | MaD:41 | | main.rs:22:31:22:53 | ... .unwrap() | main.rs:22:31:22:53 | ... .unwrap() | provenance | Sink:MaD:15 | | main.rs:23:31:23:32 | l2 | main.rs:23:31:23:44 | l2.align_to(...) [Ok] | provenance | MaD:24 | -| main.rs:23:31:23:44 | l2.align_to(...) [Ok] | main.rs:23:31:23:53 | ... .unwrap() | provenance | MaD:38 | +| main.rs:23:31:23:44 | l2.align_to(...) [Ok] | main.rs:23:31:23:53 | ... .unwrap() | provenance | MaD:41 | | main.rs:23:31:23:53 | ... .unwrap() | main.rs:23:31:23:68 | ... .pad_to_align() | provenance | MaD:32 | | main.rs:23:31:23:68 | ... .pad_to_align() | main.rs:23:31:23:68 | ... .pad_to_align() | provenance | Sink:MaD:15 | | main.rs:29:9:29:10 | l4 | main.rs:30:31:30:32 | l4 | provenance | Sink:MaD:15 | @@ -77,12 +77,12 @@ edges | main.rs:29:60:29:60 | v | main.rs:29:14:29:64 | ...::from_size_align_unchecked(...) | provenance | MaD:31 | | main.rs:32:9:32:10 | l5 | main.rs:33:31:33:32 | l5 | provenance | Sink:MaD:15 | | main.rs:32:14:32:118 | ...::from_size_align_unchecked(...) | main.rs:32:9:32:10 | l5 | provenance | | -| main.rs:32:60:32:60 | v | main.rs:32:60:32:89 | ... * ... | provenance | MaD:43 | +| main.rs:32:60:32:60 | v | main.rs:32:60:32:89 | ... * ... | provenance | MaD:38 | | main.rs:32:60:32:89 | ... * ... | main.rs:32:14:32:118 | ...::from_size_align_unchecked(...) | provenance | MaD:31 | | main.rs:35:9:35:10 | s6 | main.rs:36:60:36:61 | s6 | provenance | | | main.rs:35:14:35:54 | ... + ... | main.rs:35:9:35:10 | s6 | provenance | | -| main.rs:35:15:35:49 | ... * ... | main.rs:35:14:35:54 | ... + ... | provenance | MaD:42 | -| main.rs:35:49:35:49 | v | main.rs:35:15:35:49 | ... * ... | provenance | MaD:43 | +| main.rs:35:15:35:49 | ... * ... | main.rs:35:14:35:54 | ... + ... | provenance | MaD:37 | +| main.rs:35:49:35:49 | v | main.rs:35:15:35:49 | ... * ... | provenance | MaD:38 | | main.rs:36:9:36:10 | l6 | main.rs:37:31:37:32 | l6 | provenance | Sink:MaD:15 | | main.rs:36:9:36:10 | l6 | main.rs:39:60:39:61 | l6 | provenance | | | main.rs:36:14:36:65 | ...::from_size_align_unchecked(...) | main.rs:36:9:36:10 | l6 | provenance | | @@ -97,21 +97,21 @@ edges | main.rs:43:44:43:51 | ...: usize | main.rs:54:48:54:48 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:58:34:58:34 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:67:46:67:46 | v | provenance | | -| main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | main.rs:50:31:50:51 | ... .unwrap() [tuple.0] | provenance | MaD:38 | +| main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | main.rs:50:31:50:51 | ... .unwrap() [tuple.0] | provenance | MaD:41 | | main.rs:50:31:50:51 | ... .unwrap() [tuple.0] | main.rs:50:31:50:53 | ... .0 | provenance | | | main.rs:50:31:50:53 | ... .0 | main.rs:50:31:50:53 | ... .0 | provenance | Sink:MaD:15 | | main.rs:50:41:50:41 | v | main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:33 | -| main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | main.rs:51:31:51:55 | ... .unwrap() [tuple.0] | provenance | MaD:38 | +| main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | main.rs:51:31:51:55 | ... .unwrap() [tuple.0] | provenance | MaD:41 | | main.rs:51:31:51:55 | ... .unwrap() [tuple.0] | main.rs:51:31:51:57 | ... .0 | provenance | | | main.rs:51:31:51:57 | ... .0 | main.rs:51:31:51:57 | ... .0 | provenance | Sink:MaD:15 | -| main.rs:51:41:51:41 | v | main.rs:51:41:51:45 | ... + ... | provenance | MaD:42 | +| main.rs:51:41:51:41 | v | main.rs:51:41:51:45 | ... + ... | provenance | MaD:37 | | main.rs:51:41:51:45 | ... + ... | main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:33 | -| main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | main.rs:53:31:53:58 | ... .unwrap() | provenance | MaD:38 | +| main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | main.rs:53:31:53:58 | ... .unwrap() | provenance | MaD:41 | | main.rs:53:31:53:58 | ... .unwrap() | main.rs:53:31:53:58 | ... .unwrap() | provenance | Sink:MaD:15 | | main.rs:53:48:53:48 | v | main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | provenance | MaD:34 | -| main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | main.rs:54:31:54:63 | ... .unwrap() | provenance | MaD:38 | +| main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | main.rs:54:31:54:63 | ... .unwrap() | provenance | MaD:41 | | main.rs:54:31:54:63 | ... .unwrap() | main.rs:54:31:54:63 | ... .unwrap() | provenance | Sink:MaD:15 | -| main.rs:54:48:54:48 | v | main.rs:54:48:54:53 | ... * ... | provenance | MaD:43 | +| main.rs:54:48:54:48 | v | main.rs:54:48:54:53 | ... * ... | provenance | MaD:38 | | main.rs:54:48:54:53 | ... * ... | main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | provenance | MaD:34 | | main.rs:58:9:58:20 | TuplePat [tuple.0] | main.rs:58:10:58:11 | k1 | provenance | | | main.rs:58:10:58:11 | k1 | main.rs:59:31:59:32 | k1 | provenance | Sink:MaD:15 | @@ -119,32 +119,32 @@ edges | main.rs:58:10:58:11 | k1 | main.rs:62:24:62:25 | k1 | provenance | | | main.rs:58:10:58:11 | k1 | main.rs:64:48:64:49 | k1 | provenance | | | main.rs:58:10:58:11 | k1 | main.rs:65:31:65:32 | k1 | provenance | | -| main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | main.rs:58:24:58:66 | ... .expect(...) [tuple.0] | provenance | MaD:37 | +| main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | main.rs:58:24:58:66 | ... .expect(...) [tuple.0] | provenance | MaD:40 | | main.rs:58:24:58:66 | ... .expect(...) [tuple.0] | main.rs:58:9:58:20 | TuplePat [tuple.0] | provenance | | | main.rs:58:34:58:34 | v | main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | provenance | MaD:33 | | main.rs:60:9:60:20 | TuplePat [tuple.0] | main.rs:60:10:60:11 | k2 | provenance | | | main.rs:60:10:60:11 | k2 | main.rs:61:31:61:32 | k2 | provenance | Sink:MaD:15 | -| main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | main.rs:60:24:60:45 | ... .unwrap() [tuple.0] | provenance | MaD:38 | +| main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | main.rs:60:24:60:45 | ... .unwrap() [tuple.0] | provenance | MaD:41 | | main.rs:60:24:60:45 | ... .unwrap() [tuple.0] | main.rs:60:9:60:20 | TuplePat [tuple.0] | provenance | | | main.rs:60:34:60:35 | k1 | main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | provenance | MaD:26 | | main.rs:62:9:62:20 | TuplePat [tuple.0] | main.rs:62:10:62:11 | k3 | provenance | | | main.rs:62:10:62:11 | k3 | main.rs:63:31:63:32 | k3 | provenance | Sink:MaD:15 | | main.rs:62:24:62:25 | k1 | main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | provenance | MaD:27 | -| main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | main.rs:62:24:62:45 | ... .unwrap() [tuple.0] | provenance | MaD:38 | +| main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | main.rs:62:24:62:45 | ... .unwrap() [tuple.0] | provenance | MaD:41 | | main.rs:62:24:62:45 | ... .unwrap() [tuple.0] | main.rs:62:9:62:20 | TuplePat [tuple.0] | provenance | | -| main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | main.rs:64:31:64:59 | ... .unwrap() | provenance | MaD:38 | +| main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | main.rs:64:31:64:59 | ... .unwrap() | provenance | MaD:41 | | main.rs:64:31:64:59 | ... .unwrap() | main.rs:64:31:64:59 | ... .unwrap() | provenance | Sink:MaD:15 | | main.rs:64:48:64:49 | k1 | main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | provenance | MaD:28 | | main.rs:65:31:65:32 | k1 | main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | provenance | MaD:29 | -| main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | main.rs:65:31:65:59 | ... .unwrap() | provenance | MaD:38 | +| main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | main.rs:65:31:65:59 | ... .unwrap() | provenance | MaD:41 | | main.rs:65:31:65:59 | ... .unwrap() | main.rs:65:31:65:59 | ... .unwrap() | provenance | Sink:MaD:15 | | main.rs:67:9:67:10 | l4 | main.rs:68:31:68:32 | l4 | provenance | Sink:MaD:15 | -| main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | main.rs:67:14:67:56 | ... .unwrap() | provenance | MaD:38 | +| main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | main.rs:67:14:67:56 | ... .unwrap() | provenance | MaD:41 | | main.rs:67:14:67:56 | ... .unwrap() | main.rs:67:9:67:10 | l4 | provenance | | | main.rs:67:46:67:46 | v | main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | | main.rs:86:35:86:42 | ...: usize | main.rs:87:54:87:54 | v | provenance | | | main.rs:87:9:87:14 | layout | main.rs:88:31:88:36 | layout | provenance | Sink:MaD:15 | -| main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | main.rs:87:18:87:67 | ... .unwrap() | provenance | MaD:38 | +| main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | main.rs:87:18:87:67 | ... .unwrap() | provenance | MaD:41 | | main.rs:87:18:87:67 | ... .unwrap() | main.rs:87:9:87:14 | layout | provenance | | | main.rs:87:54:87:54 | v | main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | provenance | MaD:30 | | main.rs:91:38:91:45 | ...: usize | main.rs:92:47:92:47 | v | provenance | | @@ -160,31 +160,31 @@ edges | main.rs:92:9:92:10 | l1 | main.rs:111:35:111:36 | l1 | provenance | Sink:MaD:15 | | main.rs:92:9:92:10 | l1 | main.rs:146:35:146:36 | l1 | provenance | Sink:MaD:15 | | main.rs:92:9:92:10 | l1 | main.rs:177:31:177:32 | l1 | provenance | Sink:MaD:15 | -| main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | main.rs:92:14:92:57 | ... .unwrap() | provenance | MaD:38 | +| main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | main.rs:92:14:92:57 | ... .unwrap() | provenance | MaD:41 | | main.rs:92:14:92:57 | ... .unwrap() | main.rs:92:9:92:10 | l1 | provenance | | | main.rs:92:47:92:47 | v | main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | | main.rs:101:13:101:14 | l3 | main.rs:103:35:103:36 | l3 | provenance | Sink:MaD:15 | -| main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | main.rs:101:18:101:61 | ... .unwrap() | provenance | MaD:38 | +| main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | main.rs:101:18:101:61 | ... .unwrap() | provenance | MaD:41 | | main.rs:101:18:101:61 | ... .unwrap() | main.rs:101:13:101:14 | l3 | provenance | | | main.rs:101:51:101:51 | v | main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | | main.rs:105:33:105:33 | v | main.rs:86:35:86:42 | ...: usize | provenance | | | main.rs:145:13:145:14 | l9 | main.rs:148:35:148:36 | l9 | provenance | Sink:MaD:15 | -| main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | main.rs:145:18:145:61 | ... .unwrap() | provenance | MaD:38 | +| main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | main.rs:145:18:145:61 | ... .unwrap() | provenance | MaD:41 | | main.rs:145:18:145:61 | ... .unwrap() | main.rs:145:13:145:14 | l9 | provenance | | | main.rs:145:51:145:51 | v | main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | | main.rs:151:9:151:11 | l10 | main.rs:152:31:152:33 | l10 | provenance | Sink:MaD:15 | -| main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | main.rs:151:15:151:78 | ... .unwrap() | provenance | MaD:38 | +| main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | main.rs:151:15:151:78 | ... .unwrap() | provenance | MaD:41 | | main.rs:151:15:151:78 | ... .unwrap() | main.rs:151:9:151:11 | l10 | provenance | | | main.rs:151:48:151:68 | ...::min(...) | main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | -| main.rs:151:62:151:62 | v | main.rs:151:48:151:68 | ...::min(...) | provenance | MaD:40 | +| main.rs:151:62:151:62 | v | main.rs:151:48:151:68 | ...::min(...) | provenance | MaD:43 | | main.rs:154:9:154:11 | l11 | main.rs:155:31:155:33 | l11 | provenance | Sink:MaD:15 | -| main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | main.rs:154:15:154:78 | ... .unwrap() | provenance | MaD:38 | +| main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | main.rs:154:15:154:78 | ... .unwrap() | provenance | MaD:41 | | main.rs:154:15:154:78 | ... .unwrap() | main.rs:154:9:154:11 | l11 | provenance | | | main.rs:154:48:154:68 | ...::max(...) | main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | -| main.rs:154:62:154:62 | v | main.rs:154:48:154:68 | ...::max(...) | provenance | MaD:39 | +| main.rs:154:62:154:62 | v | main.rs:154:48:154:68 | ...::max(...) | provenance | MaD:42 | | main.rs:161:13:161:15 | l13 | main.rs:162:35:162:37 | l13 | provenance | Sink:MaD:15 | | main.rs:161:13:161:15 | l13 | main.rs:169:35:169:37 | l13 | provenance | Sink:MaD:15 | -| main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | main.rs:161:19:161:68 | ... .unwrap() | provenance | MaD:38 | +| main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | main.rs:161:19:161:68 | ... .unwrap() | provenance | MaD:41 | | main.rs:161:19:161:68 | ... .unwrap() | main.rs:161:13:161:15 | l13 | provenance | | | main.rs:161:55:161:55 | v | main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | provenance | MaD:30 | | main.rs:183:29:183:36 | ...: usize | main.rs:192:46:192:46 | v | provenance | | @@ -198,7 +198,7 @@ edges | main.rs:192:9:192:10 | l2 | main.rs:208:53:208:54 | l2 | provenance | Sink:MaD:9 | | main.rs:192:9:192:10 | l2 | main.rs:210:60:210:61 | l2 | provenance | Sink:MaD:10 | | main.rs:192:9:192:10 | l2 | main.rs:213:51:213:52 | l2 | provenance | Sink:MaD:11 | -| main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | main.rs:192:14:192:56 | ... .unwrap() | provenance | MaD:38 | +| main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | main.rs:192:14:192:56 | ... .unwrap() | provenance | MaD:41 | | main.rs:192:14:192:56 | ... .unwrap() | main.rs:192:9:192:10 | l2 | provenance | | | main.rs:192:46:192:46 | v | main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | | main.rs:217:27:217:34 | ...: usize | main.rs:219:26:219:26 | v | provenance | Sink:MaD:20 | @@ -214,15 +214,15 @@ edges | main.rs:283:9:283:17 | num_bytes | main.rs:285:54:285:62 | num_bytes | provenance | | | main.rs:283:21:283:30 | user_input | main.rs:283:21:283:47 | user_input.parse() [Ok] | provenance | MaD:23 | | main.rs:283:21:283:47 | user_input.parse() [Ok] | main.rs:283:21:283:48 | TryExpr | provenance | | -| main.rs:283:21:283:48 | TryExpr | main.rs:283:21:283:77 | ... * ... | provenance | MaD:43 | +| main.rs:283:21:283:48 | TryExpr | main.rs:283:21:283:77 | ... * ... | provenance | MaD:38 | | main.rs:283:21:283:77 | ... * ... | main.rs:283:9:283:17 | num_bytes | provenance | | | main.rs:285:9:285:14 | layout | main.rs:287:40:287:45 | layout | provenance | Sink:MaD:15 | -| main.rs:285:18:285:66 | ...::from_size_align(...) [Ok] | main.rs:285:18:285:75 | ... .unwrap() | provenance | MaD:38 | +| main.rs:285:18:285:66 | ...::from_size_align(...) [Ok] | main.rs:285:18:285:75 | ... .unwrap() | provenance | MaD:41 | | main.rs:285:18:285:75 | ... .unwrap() | main.rs:285:9:285:14 | layout | provenance | | | main.rs:285:54:285:62 | num_bytes | main.rs:285:18:285:66 | ...::from_size_align(...) [Ok] | provenance | MaD:30 | | main.rs:311:25:311:40 | ...::args(...) | main.rs:311:25:311:40 | ...::args(...) [element] | provenance | Src:MaD:22 | -| main.rs:311:25:311:40 | ...::args(...) [element] | main.rs:311:25:311:47 | ... .nth(...) [Some] | provenance | MaD:41 | -| main.rs:311:25:311:47 | ... .nth(...) [Some] | main.rs:311:25:311:74 | ... .unwrap_or(...) | provenance | MaD:36 | +| main.rs:311:25:311:40 | ...::args(...) [element] | main.rs:311:25:311:47 | ... .nth(...) [Some] | provenance | MaD:36 | +| main.rs:311:25:311:47 | ... .nth(...) [Some] | main.rs:311:25:311:74 | ... .unwrap_or(...) | provenance | MaD:39 | | main.rs:311:25:311:74 | ... .unwrap_or(...) | main.rs:282:24:282:41 | ...: String | provenance | | | main.rs:317:26:317:33 | ...: usize | main.rs:331:26:331:26 | a | provenance | Sink:MaD:20 | | main.rs:339:9:339:9 | v | main.rs:342:34:342:34 | v | provenance | | @@ -233,10 +233,10 @@ edges | main.rs:339:9:339:9 | v | main.rs:347:22:347:22 | v | provenance | | | main.rs:339:9:339:9 | v | main.rs:349:24:349:24 | v | provenance | | | main.rs:339:13:339:28 | ...::args(...) | main.rs:339:13:339:28 | ...::args(...) [element] | provenance | Src:MaD:22 | -| main.rs:339:13:339:28 | ...::args(...) [element] | main.rs:339:13:339:35 | ... .nth(...) [Some] | provenance | MaD:41 | -| main.rs:339:13:339:35 | ... .nth(...) [Some] | main.rs:339:13:339:65 | ... .unwrap_or(...) | provenance | MaD:36 | +| main.rs:339:13:339:28 | ...::args(...) [element] | main.rs:339:13:339:35 | ... .nth(...) [Some] | provenance | MaD:36 | +| main.rs:339:13:339:35 | ... .nth(...) [Some] | main.rs:339:13:339:65 | ... .unwrap_or(...) | provenance | MaD:39 | | main.rs:339:13:339:65 | ... .unwrap_or(...) | main.rs:339:13:339:82 | ... .parse() [Ok] | provenance | MaD:23 | -| main.rs:339:13:339:82 | ... .parse() [Ok] | main.rs:339:13:339:91 | ... .unwrap() | provenance | MaD:38 | +| main.rs:339:13:339:82 | ... .parse() [Ok] | main.rs:339:13:339:91 | ... .unwrap() | provenance | MaD:41 | | main.rs:339:13:339:91 | ... .unwrap() | main.rs:339:9:339:9 | v | provenance | | | main.rs:342:34:342:34 | v | main.rs:12:36:12:43 | ...: usize | provenance | | | main.rs:343:42:343:42 | v | main.rs:43:44:43:51 | ...: usize | provenance | | @@ -281,14 +281,14 @@ models | 33 | Summary: ::repeat; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | | 34 | Summary: ::repeat_packed; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | | 35 | Summary: ::size; Argument[self].Reference; ReturnValue; taint | -| 36 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 37 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 38 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 39 | Summary: core::cmp::max; Argument[0]; ReturnValue; value | -| 40 | Summary: core::cmp::min; Argument[0]; ReturnValue; value | -| 41 | Summary: core::iter::traits::iterator::Iterator::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 42 | Summary: core::ops::arith::Add::add; Argument[self,0]; ReturnValue; taint | -| 43 | Summary: core::ops::arith::Mul::mul; Argument[self,0]; ReturnValue; taint | +| 36 | Summary: ::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 37 | Summary: ::add; Argument[self,0]; ReturnValue; taint | +| 38 | Summary: ::mul; Argument[self,0]; ReturnValue; taint | +| 39 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 40 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 41 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 42 | Summary: core::cmp::max; Argument[0]; ReturnValue; value | +| 43 | Summary: core::cmp::min; Argument[0]; ReturnValue; value | nodes | main.rs:12:36:12:43 | ...: usize | semmle.label | ...: usize | | main.rs:18:41:18:41 | v | semmle.label | v | diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index 039891ffb4d6..28c66266ed89 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -102,7 +102,7 @@ models | 3 | Sink: ::new; Argument[0]; credentials-key | | 4 | Sink: ::new; Argument[1]; credentials-iv | | 5 | Sink: ::from; Argument[0].Reference; credentials-key | -| 6 | Sink: crypto_common::KeyInit::new_from_slice; Argument[0]; credentials-key | +| 6 | Sink: ::new_from_slice; Argument[0]; credentials-key | | 7 | Source: core::mem::zeroed; ReturnValue.Element; constant-source | | 8 | Summary: ::from; Argument[0].Field[alloc::borrow::Cow::Owned(0)]; ReturnValue; value | | 9 | Summary: ::from; Argument[0].Field[alloc::bstr::ByteString(0)]; ReturnValue; value | diff --git a/rust/ql/test/query-tests/security/CWE-918/RequestForgery.expected b/rust/ql/test/query-tests/security/CWE-918/RequestForgery.expected index 53b03f7ed2f1..2a74d0f58387 100644 --- a/rust/ql/test/query-tests/security/CWE-918/RequestForgery.expected +++ b/rust/ql/test/query-tests/security/CWE-918/RequestForgery.expected @@ -45,7 +45,7 @@ edges | request_forgery_tests.rs:68:42:68:42 | a | request_forgery_tests.rs:68:41:68:42 | &a [&ref] | provenance | | models | 1 | Sink: reqwest::get; Argument[0]; request-url | -| 2 | Source: warp::filter::Filter::and_then; Argument[0].Parameter[0..7]; remote | +| 2 | Source: ::and_then; Argument[0].Parameter[0..7]; remote | | 3 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | | 4 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes From 516815c564baa5527f49ecf7b37ef858c0bb24f1 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Thu, 27 Aug 2026 15:21:30 +0200 Subject: [PATCH 0563/2098] Rust: Reuse Cargo target dir when running QL tests --- rust/codeql-extractor.yml | 3 ++- rust/extractor/src/config.rs | 30 ++++++++++++++++++++++------- rust/extractor/src/qltest.rs | 37 ++++++++++++++++++++++++------------ 3 files changed, 50 insertions(+), 20 deletions(-) diff --git a/rust/codeql-extractor.yml b/rust/codeql-extractor.yml index 4556e29ca9d3..819793ec26cc 100644 --- a/rust/codeql-extractor.yml +++ b/rust/codeql-extractor.yml @@ -36,7 +36,8 @@ options: This value is an optional path to use as `CARGO_TARGET_DIR` for the internal cargo commands the extractor uses. Pointing it to a persistent directory may reduce execution time of consecutive extractor runs. By default, a new scratch - directory is used for each run. + directory is used for each extraction, while qltests use the test's `target` + directory so artifacts can be reused across runs. type: string cargo_target: title: Target architecture diff --git a/rust/extractor/src/config.rs b/rust/extractor/src/config.rs index bd615c083bc2..9bf7487012df 100644 --- a/rust/extractor/src/config.rs +++ b/rust/extractor/src/config.rs @@ -76,6 +76,21 @@ pub struct Config { } impl Config { + /// Returns the directory where Cargo should place its build cache. + pub(crate) fn cargo_target_dir(&self) -> PathBuf { + self.cargo_target_dir.clone().unwrap_or_else(|| { + // When the `target` directory is not explicitly set, we default to + // the relative `target` directory (cargo's default) when running + // qltests. This directory is preserved, so subsequent builds + // benefit from the cache. + if self.qltest { + PathBuf::from("target") + } else { + self.scratch_dir.join("target") + } + }) + } + pub fn extract() -> anyhow::Result { let args = argfile::expand_args(argfile::parse_fromfile, argfile::PREFIX) .context("expanding parameter files")?; @@ -108,11 +123,17 @@ impl Config { figment.extract().context("loading configuration") } - fn get_extra_env(&self) -> FxHashMap> { + pub(crate) fn get_extra_env(&self) -> FxHashMap> { let mut extra_env = FxHashMap::default(); // RUSTUP_AUTO_INSTALL is set to 0 by rust-analyzer (https://github.com/rust-lang/rust-analyzer/issues/20719), // but we do want to allow rustup to auto-install toolchains if needed, so we set it to 1 here. extra_env.insert("RUSTUP_AUTO_INSTALL".to_owned(), Some("1".to_owned())); + if self.qltest_cargo_check { + // When running qltests we add this flag to match the `cargo check` + // invocation in the `cargo_check` function. This is necessary as + // Cargo does not re-use the cache when `RUSTFLAGS` differ. + extra_env.insert("RUSTFLAGS".to_owned(), Some("-Awarnings".to_owned())); + } extra_env.extend(self.cargo_extra_env.clone()); extra_env } @@ -182,12 +203,7 @@ impl Config { .iter() .map(|p| join_path_buf(dir, p)) .collect(), - target_dir_config: Utf8PathBuf::from_path_buf( - self.cargo_target_dir - .clone() - .unwrap_or_else(|| self.scratch_dir.join("target")), - ) - .map_or( + target_dir_config: Utf8PathBuf::from_path_buf(self.cargo_target_dir()).map_or( TargetDirectoryConfig::None, TargetDirectoryConfig::Directory, ), diff --git a/rust/extractor/src/qltest.rs b/rust/extractor/src/qltest.rs index bd9849cbb09f..afda1bc050e4 100644 --- a/rust/extractor/src/qltest.rs +++ b/rust/extractor/src/qltest.rs @@ -90,6 +90,29 @@ fn set_sources(config: &mut Config) -> anyhow::Result<()> { Ok(()) } +fn cargo_check(config: &Config) -> anyhow::Result<()> { + let mut command = Command::new("cargo"); + command.env("CARGO_TARGET_DIR", config.cargo_target_dir()); + // Pass the extra environment variables to the initial `cargo check`. + for (key, value) in config.get_extra_env() { + match value { + Some(value) => command.env(key, value), + None => command.env_remove(key), + }; + } + let status = command + .arg("check") + .arg("-q") + .status() + .context("spawning cargo check")?; + if status.success() { + info!("cargo check successful"); + Ok(()) + } else { + anyhow::bail!("requested cargo check failed"); + } +} + pub(crate) fn prepare(config: &mut Config) -> anyhow::Result<()> { dump_lib()?; set_sources(config)?; @@ -98,17 +121,7 @@ pub(crate) fn prepare(config: &mut Config) -> anyhow::Result<()> { dump_nightly_toolchain()?; } if config.qltest_cargo_check { - let status = Command::new("cargo") - .env("RUSTFLAGS", "-Awarnings") - .arg("check") - .arg("-q") - .status() - .context("spawning cargo check")?; - if status.success() { - info!("cargo check successful"); - } else { - anyhow::bail!("requested cargo check failed"); - } - }; + cargo_check(config)?; + } Ok(()) } From 048314d40306708897ee97de90211a48c95215bb Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Fri, 28 Aug 2026 13:55:54 +0200 Subject: [PATCH 0564/2098] Rust: Update command injection expected output Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../CWE-078/CommandInjection.expected | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected index 3b9da31661a4..e3d423933f7e 100644 --- a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected @@ -17,16 +17,16 @@ edges | main.rs:4:9:4:18 | arg_string | main.rs:27:18:27:27 | arg_string | provenance | | | main.rs:4:9:4:18 | arg_string | main.rs:40:14:40:23 | arg_string | provenance | | | main.rs:4:22:4:37 | ...::args(...) | main.rs:4:22:4:37 | ...::args(...) [element] | provenance | Src:MaD:7 | -| main.rs:4:22:4:37 | ...::args(...) [element] | main.rs:4:22:4:44 | ... .nth(...) [Some] | provenance | MaD:15 | -| main.rs:4:22:4:44 | ... .nth(...) [Some] | main.rs:4:22:4:74 | ... .unwrap_or(...) | provenance | MaD:9 | +| main.rs:4:22:4:37 | ...::args(...) [element] | main.rs:4:22:4:44 | ... .nth(...) [Some] | provenance | MaD:9 | +| main.rs:4:22:4:44 | ... .nth(...) [Some] | main.rs:4:22:4:74 | ... .unwrap_or(...) | provenance | MaD:10 | | main.rs:4:22:4:74 | ... .unwrap_or(...) | main.rs:4:9:4:18 | arg_string | provenance | | | main.rs:5:9:5:21 | remote_string | main.rs:34:14:34:26 | remote_string | provenance | | | main.rs:5:9:5:21 | remote_string | main.rs:47:23:47:35 | remote_string | provenance | | | main.rs:5:9:5:21 | remote_string | main.rs:52:40:52:69 | MacroExpr | provenance | | | main.rs:5:25:5:69 | ...::get(...) | main.rs:5:25:5:69 | ...::get(...) [Ok] | provenance | Src:MaD:6 | -| main.rs:5:25:5:69 | ...::get(...) [Ok] | main.rs:5:25:6:17 | ... .unwrap() | provenance | MaD:10 | -| main.rs:5:25:6:17 | ... .unwrap() | main.rs:5:25:7:15 | ... .text() [Ok] | provenance | MaD:12 | -| main.rs:5:25:7:15 | ... .text() [Ok] | main.rs:5:25:8:38 | ... .unwrap_or(...) | provenance | MaD:11 | +| main.rs:5:25:5:69 | ...::get(...) [Ok] | main.rs:5:25:6:17 | ... .unwrap() | provenance | MaD:11 | +| main.rs:5:25:6:17 | ... .unwrap() | main.rs:5:25:7:15 | ... .text() [Ok] | provenance | MaD:13 | +| main.rs:5:25:7:15 | ... .text() [Ok] | main.rs:5:25:8:38 | ... .unwrap_or(...) | provenance | MaD:12 | | main.rs:5:25:8:38 | ... .unwrap_or(...) | main.rs:5:9:5:21 | remote_string | provenance | | | main.rs:27:18:27:27 | arg_string | main.rs:27:18:27:36 | arg_string.as_str() [&ref] | provenance | MaD:8 | | main.rs:27:18:27:36 | arg_string.as_str() [&ref] | main.rs:27:18:27:36 | arg_string.as_str() | provenance | Sink:MaD:3 | @@ -42,16 +42,16 @@ edges | main.rs:52:9:52:28 | concatenated_command | main.rs:53:18:53:37 | concatenated_command | provenance | | | main.rs:52:40:52:69 | ...::format(...) | main.rs:52:40:52:69 | { ... } | provenance | | | main.rs:52:40:52:69 | ...::must_use(...) | main.rs:52:9:52:28 | concatenated_command | provenance | | -| main.rs:52:40:52:69 | MacroExpr | main.rs:52:40:52:69 | ...::format(...) | provenance | MaD:13 | -| main.rs:52:40:52:69 | { ... } | main.rs:52:40:52:69 | ...::must_use(...) | provenance | MaD:14 | +| main.rs:52:40:52:69 | MacroExpr | main.rs:52:40:52:69 | ...::format(...) | provenance | MaD:14 | +| main.rs:52:40:52:69 | { ... } | main.rs:52:40:52:69 | ...::must_use(...) | provenance | MaD:15 | | main.rs:53:18:53:37 | concatenated_command | main.rs:53:18:53:46 | concatenated_command.as_str() [&ref] | provenance | MaD:8 | | main.rs:53:18:53:46 | concatenated_command.as_str() [&ref] | main.rs:53:18:53:46 | concatenated_command.as_str() | provenance | Sink:MaD:3 | | main.rs:59:9:59:21 | remote_string | main.rs:65:48:65:60 | remote_string | provenance | | | main.rs:59:9:59:21 | remote_string | main.rs:73:14:73:26 | remote_string | provenance | | | main.rs:59:25:59:69 | ...::get(...) | main.rs:59:25:59:69 | ...::get(...) [Ok] | provenance | Src:MaD:6 | -| main.rs:59:25:59:69 | ...::get(...) [Ok] | main.rs:59:25:60:17 | ... .unwrap() | provenance | MaD:10 | -| main.rs:59:25:60:17 | ... .unwrap() | main.rs:59:25:61:15 | ... .text() [Ok] | provenance | MaD:12 | -| main.rs:59:25:61:15 | ... .text() [Ok] | main.rs:59:25:62:38 | ... .unwrap_or(...) | provenance | MaD:11 | +| main.rs:59:25:59:69 | ...::get(...) [Ok] | main.rs:59:25:60:17 | ... .unwrap() | provenance | MaD:11 | +| main.rs:59:25:60:17 | ... .unwrap() | main.rs:59:25:61:15 | ... .text() [Ok] | provenance | MaD:13 | +| main.rs:59:25:61:15 | ... .text() [Ok] | main.rs:59:25:62:38 | ... .unwrap_or(...) | provenance | MaD:12 | | main.rs:59:25:62:38 | ... .unwrap_or(...) | main.rs:59:9:59:21 | remote_string | provenance | | | main.rs:65:48:65:60 | remote_string | main.rs:65:48:65:69 | remote_string.as_str() [&ref] | provenance | MaD:8 | | main.rs:65:48:65:69 | remote_string.as_str() [&ref] | main.rs:65:48:65:69 | remote_string.as_str() | provenance | Sink:MaD:5 | @@ -68,8 +68,8 @@ edges | main.rs:138:9:138:18 | arg_string | main.rs:143:40:143:49 | arg_string | provenance | | | main.rs:138:9:138:18 | arg_string | main.rs:144:31:144:40 | arg_string | provenance | | | main.rs:138:22:138:37 | ...::args(...) | main.rs:138:22:138:37 | ...::args(...) [element] | provenance | Src:MaD:7 | -| main.rs:138:22:138:37 | ...::args(...) [element] | main.rs:138:22:138:44 | ... .nth(...) [Some] | provenance | MaD:15 | -| main.rs:138:22:138:44 | ... .nth(...) [Some] | main.rs:138:22:138:74 | ... .unwrap_or(...) | provenance | MaD:9 | +| main.rs:138:22:138:37 | ...::args(...) [element] | main.rs:138:22:138:44 | ... .nth(...) [Some] | provenance | MaD:9 | +| main.rs:138:22:138:44 | ... .nth(...) [Some] | main.rs:138:22:138:74 | ... .unwrap_or(...) | provenance | MaD:10 | | main.rs:138:22:138:74 | ... .unwrap_or(...) | main.rs:138:9:138:18 | arg_string | provenance | | | main.rs:142:39:142:48 | arg_string | main.rs:142:39:142:57 | arg_string.as_str() [&ref] | provenance | MaD:8 | | main.rs:142:39:142:57 | arg_string.as_str() [&ref] | main.rs:82:27:82:42 | ...: ... [&ref] | provenance | | @@ -86,13 +86,13 @@ models | 6 | Source: reqwest::blocking::get; ReturnValue.Field[core::result::Result::Ok(0)]; remote | | 7 | Source: std::env::args; ReturnValue.Element; commandargs | | 8 | Summary: ::as_str; Argument[self].Reference; ReturnValue.Reference; taint | -| 9 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 10 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 11 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 12 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 13 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | -| 14 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | -| 15 | Summary: core::iter::traits::iterator::Iterator::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 9 | Summary: ::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 10 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 11 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 12 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 13 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 14 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 15 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes | main.rs:4:9:4:18 | arg_string | semmle.label | arg_string | | main.rs:4:22:4:37 | ...::args(...) | semmle.label | ...::args(...) | From c6d4f8d5434d9de06c5f69a893b1c476954bb8cb Mon Sep 17 00:00:00 2001 From: Taus Date: Thu, 27 Aug 2026 15:40:09 +0000 Subject: [PATCH 0565/2098] unified: Add Swift node type schema generator Adds the SwiftSyntax-based schemagen tool and a manual wrapper for regenerating swift_node_types.yml after dependency updates. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- unified/AGENTS.md | 5 +- .../extractor/src/languages/swift/adapter.rs | 4 +- unified/extractor/swift_node_types.yml | 2 + unified/scripts/regenerate-node-types.sh | 75 ++++++++++++++ unified/swift-syntax-rs/README.md | 14 +++ unified/swift-syntax-rs/schemagen/.gitignore | 4 + .../swift-syntax-rs/schemagen/Package.swift | 41 ++++++++ unified/swift-syntax-rs/schemagen/README.md | 71 ++++++++++++++ .../schemagen/Sources/schemagen/main.swift | 97 +++++++++++++++++++ 9 files changed, 311 insertions(+), 2 deletions(-) create mode 100755 unified/scripts/regenerate-node-types.sh create mode 100644 unified/swift-syntax-rs/schemagen/.gitignore create mode 100644 unified/swift-syntax-rs/schemagen/Package.swift create mode 100644 unified/swift-syntax-rs/schemagen/README.md create mode 100644 unified/swift-syntax-rs/schemagen/Sources/schemagen/main.swift diff --git a/unified/AGENTS.md b/unified/AGENTS.md index bbd271764f45..72de05d120be 100644 --- a/unified/AGENTS.md +++ b/unified/AGENTS.md @@ -16,7 +16,10 @@ by Apple's swift-syntax rather than by tree-sitter. - `extractor/src/languages/swift/adapter.rs` converts that JSON into a yeast AST. - The raw parse tree's shape is described by `extractor/swift_node_types.yml`, - which is maintained by hand. + which is generated from swift-syntax by `swift-syntax-rs/schemagen`. Do not + edit it by hand; regenerate it with `scripts/regenerate-node-types.sh` after + changing the pinned swift-syntax version, then review the diff alongside the + mapping in `extractor/src/languages/swift/swift.rs`. ## AST Mapping - The target AST shape is described by `extractor/ast_types.yml`. diff --git a/unified/extractor/src/languages/swift/adapter.rs b/unified/extractor/src/languages/swift/adapter.rs index f34e5df3d00b..ae245eb21e80 100644 --- a/unified/extractor/src/languages/swift/adapter.rs +++ b/unified/extractor/src/languages/swift/adapter.rs @@ -261,7 +261,9 @@ fn parse_range(node: &Value) -> Option { }) } -/// The authoritative swift-syntax input node-types schema. +/// The authoritative swift-syntax input node-types schema, generated from +/// swift-syntax by `swift-syntax-rs/schemagen` (run +/// `unified/scripts/regenerate-node-types.sh` to refresh it). /// [`json_to_ast`] seeds every parse with the schema built from this, /// pre-registering every input kind and field so rule matching never references /// a name absent from a given file's tree. diff --git a/unified/extractor/swift_node_types.yml b/unified/extractor/swift_node_types.yml index c98dd1d33b23..16db4cbf0c64 100644 --- a/unified/extractor/swift_node_types.yml +++ b/unified/extractor/swift_node_types.yml @@ -1,3 +1,5 @@ +# GENERATED from swift-syntax by unified/swift-syntax-rs/schemagen. +# Do not edit; run unified/scripts/regenerate-node-types.sh instead. supertypes: decl: - accessorDecl diff --git a/unified/scripts/regenerate-node-types.sh b/unified/scripts/regenerate-node-types.sh new file mode 100755 index 000000000000..e811dd3dd632 --- /dev/null +++ b/unified/scripts/regenerate-node-types.sh @@ -0,0 +1,75 @@ +#!/bin/bash +# Regenerate `extractor/swift_node_types.yml`, the schema describing the shape +# of the trees produced by `swift_syntax_rs::parse_to_json`, from swift-syntax +# itself. +# +# Run this after changing the pinned swift-syntax version, and review the diff: +# a new or renamed node kind generally means the mapping in +# `extractor/src/languages/swift/swift.rs` needs attention too. +# +# This needs a local Swift toolchain (see `swift-syntax-rs/.swift-version` for +# the pinned version). The schema it derives from lives in `SyntaxSupport`, a +# target of swift-syntax's separate `CodeGeneration` package: it is not a +# product of swift-syntax, and Bazel's swift-syntax module does not export its +# sources, so there is no way to depend on it directly. +set -euo pipefail +IFS=$'\n\t' + +root=$(cd "$(dirname "$0")/.." && pwd) +swift_syntax_rs_dir="$root/swift-syntax-rs" +ffi_dir="$swift_syntax_rs_dir/swift" +schemagen_dir="$swift_syntax_rs_dir/schemagen" +output="$root/extractor/swift_node_types.yml" + +if ! command -v swift >/dev/null 2>&1; then + echo "error: Swift is required; install the version pinned in $swift_syntax_rs_dir/.swift-version." >&2 + exit 1 +fi + +# Codespaces sets `safe.bareRepository=explicit` through environment-based Git +# configuration, which prevents SwiftPM from using its cached bare dependency +# repositories. Relax only that injected setting, and only for Swift +# subprocesses, as `swift-syntax-rs/build.rs` does for local Cargo builds. +run_swift() { + if [[ ${GIT_CONFIG_KEY_0:-} == "safe.bareRepository" ]]; then + GIT_CONFIG_VALUE_0=all swift "$@" + else + swift "$@" + fi +} + +# `schemagen` takes swift-syntax as a path dependency on this checkout, so that +# the schema describes exactly the version the parser links. +echo "Resolving swift-syntax..." >&2 +( + cd "$ffi_dir" + run_swift package resolve >&2 +) +checkout="$ffi_dir/.build/checkouts/swift-syntax" +syntax_support="$checkout/CodeGeneration/Sources/SyntaxSupport" +if [[ ! -d $syntax_support ]]; then + echo "error: $syntax_support not found after resolving swift-syntax." >&2 + exit 1 +fi + +# Refresh rather than merge, so that sources deleted upstream do not linger. +rm -rf "$schemagen_dir/Sources/SyntaxSupport" +cp -R "$syntax_support" "$schemagen_dir/Sources/SyntaxSupport" + +echo "Generating $output..." >&2 +# Generate to a temporary file first: redirecting straight into `$output` would +# truncate the existing schema before the build has even run, leaving nothing +# behind if it fails. +tmp=$(mktemp) +trap 'rm -f "$tmp"' EXIT +( + cd "$schemagen_dir" + run_swift run schemagen +) > "$tmp" +if [[ ! -s $tmp ]]; then + echo "error: schemagen produced no output; $output left unchanged." >&2 + exit 1 +fi +mv "$tmp" "$output" +chmod 644 "$output" +echo "Regenerated $output" >&2 diff --git a/unified/swift-syntax-rs/README.md b/unified/swift-syntax-rs/README.md index 299fc40951a6..d272c551bd7c 100644 --- a/unified/swift-syntax-rs/README.md +++ b/unified/swift-syntax-rs/README.md @@ -150,6 +150,20 @@ cargo test The first build compiles `swift-syntax` and can take several minutes. +## Regenerating the extractor node types + +After updating the pinned swift-syntax version, regenerate the unified +extractor's input schema: + +```sh +../scripts/regenerate-node-types.sh +``` + +The script uses swift-syntax's authoritative `SyntaxSupport` definitions and +requires the local Swift toolchain pinned by [`.swift-version`](.swift-version). +Review the resulting `extractor/swift_node_types.yml` diff alongside the Swift +mapping rules. See [`schemagen/README.md`](schemagen/README.md) for details. + ## Building with Bazel (CI) CI builds this crate hermetically with Bazel. A Swift toolchain is downloaded diff --git a/unified/swift-syntax-rs/schemagen/.gitignore b/unified/swift-syntax-rs/schemagen/.gitignore new file mode 100644 index 000000000000..e6ee67bbf52c --- /dev/null +++ b/unified/swift-syntax-rs/schemagen/.gitignore @@ -0,0 +1,4 @@ +/.build +# Copied from swift-syntax's CodeGeneration package by +# `unified/scripts/regenerate-node-types.sh`; not ours to vendor. +/Sources/SyntaxSupport diff --git a/unified/swift-syntax-rs/schemagen/Package.swift b/unified/swift-syntax-rs/schemagen/Package.swift new file mode 100644 index 000000000000..c241713751e6 --- /dev/null +++ b/unified/swift-syntax-rs/schemagen/Package.swift @@ -0,0 +1,41 @@ +// swift-tools-version:5.9 +import PackageDescription + +// `schemagen` regenerates `unified/extractor/swift_node_types.yml`, the input +// schema describing the shape of the trees produced by +// `swift_syntax_rs::parse_to_json`. Run it through +// `unified/scripts/regenerate-node-types.sh`, which stages the sources this +// package needs; see `README.md` for the details. +// +// The tools version is deliberately older than the FFI package's: it selects +// the Swift 5 language mode, and `SyntaxSupport` (see below) is not clean under +// Swift 6 strict concurrency because its node tables are non-Sendable globals. +let package = Package( + name: "schemagen", + platforms: [ + // Matches the FFI package: swift-syntax 603 requires macOS 10.15. + .macOS(.v10_15), + ], + dependencies: [ + // Deliberately a path dependency on the checkout the neighbouring FFI + // package resolved, rather than a second URL/exact pin: the schema has + // to describe the very swift-syntax that the parser links, and a + // single pin cannot drift from itself. + .package(name: "swift-syntax", path: "../swift/.build/checkouts/swift-syntax"), + ], + targets: [ + // `SyntaxSupport` is a target of swift-syntax's separate + // `CodeGeneration` package, not a product of swift-syntax itself, so it + // cannot be depended on directly. The regeneration script copies its + // sources here (the directory is git-ignored) and this target builds + // them as if they were our own. + .target( + name: "SyntaxSupport", + dependencies: [ + .product(name: "SwiftSyntax", package: "swift-syntax"), + .product(name: "SwiftSyntaxBuilder", package: "swift-syntax"), + ] + ), + .executableTarget(name: "schemagen", dependencies: ["SyntaxSupport"]), + ] +) diff --git a/unified/swift-syntax-rs/schemagen/README.md b/unified/swift-syntax-rs/schemagen/README.md new file mode 100644 index 000000000000..9211331699ab --- /dev/null +++ b/unified/swift-syntax-rs/schemagen/README.md @@ -0,0 +1,71 @@ +# schemagen + +Generates [`unified/extractor/swift_node_types.yml`][schema], the schema that +describes the shape of the trees produced by `swift_syntax_rs::parse_to_json`. +The extractor seeds every parse with it, so rule matching never refers to a +node kind or field that swift-syntax can produce but the schema does not know. + +Run it through the script, which stages the sources described below: + +```console +$ unified/scripts/regenerate-node-types.sh +``` + +Do this after changing the pinned swift-syntax version, and read the resulting +diff: a new or renamed node kind usually means the mapping in +[`swift.rs`][mapping] needs attention too. + +This requires the local Swift toolchain pinned by +[`.swift-version`](../.swift-version). + +## Why the sources are copied in + +The schema is derived from `SyntaxSupport`, the module that describes +swift-syntax's own syntax tree. This is the same description swift-syntax +generates itself from, and is therefore authoritative in a way that observing +parser output never would be. The runtime `SwiftSyntax` module is not a +substitute: its `SyntaxNodeStructure` exposes layout as key paths, without the +field names, optionality, and base-kind relationships this schema records. + +`SyntaxSupport` is awkward to depend on, though. It is a target of +`CodeGeneration`, a package inside the swift-syntax repository that is +separate from swift-syntax itself, and it is not one of that package's +products. SwiftPM can only depend on products, and Bazel's swift-syntax module +does not export the `CodeGeneration` sources, so neither build system can +reach it directly. + +The regeneration script therefore copies those sources out of the resolved +swift-syntax checkout into `Sources/SyntaxSupport`, where this package builds +them as its own. That directory is git-ignored and refreshed on every run, so +it always matches the pinned version rather than drifting as a stale vendored +copy would. + +For the same reason this package takes swift-syntax as a path dependency on the +checkout the neighbouring FFI package resolved, rather than declaring a second +pinned dependency of its own. The schema must describe exactly the +swift-syntax version linked by `swift-syntax-rs`. + +## What is filtered out + +The schema describes the JSON the extractor's adapter receives, not +swift-syntax's tree verbatim, so `main.swift` mirrors what +[`adapter.rs`][adapter] does: + +- Abstract base kinds become `supertypes:` entries rather than node kinds. +- Collection nodes are dropped, and a collection-typed child is recorded as + its element kinds, because the adapter elides collections into JSON arrays. +- `unexpectedBeforeX` and `unexpectedBetweenXAndY` error-recovery children are + dropped; no rule matches them. This filters on the child name: + `unexpectedCodeDecl` is a real node kind and is retained. +- Token-typed children become the synthetic `_token` kind. Only the varying + token kinds whose text is not implied by the kind, listed in + `VARYING_TOKEN_KINDS` in `adapter.rs`, are emitted as kinds of their own. + Fixed tokens are anonymous and keyed by their text, so no rule can name + them. + +Setting `EMIT_SUPERTYPES=0` omits the `supertypes:` section, which can be useful +when diffing two versions for kind and field changes alone. + +[schema]: ../../extractor/swift_node_types.yml +[mapping]: ../../extractor/src/languages/swift/swift.rs +[adapter]: ../../extractor/src/languages/swift/adapter.rs diff --git a/unified/swift-syntax-rs/schemagen/Sources/schemagen/main.swift b/unified/swift-syntax-rs/schemagen/Sources/schemagen/main.swift new file mode 100644 index 000000000000..6f80a37b90c1 --- /dev/null +++ b/unified/swift-syntax-rs/schemagen/Sources/schemagen/main.swift @@ -0,0 +1,97 @@ +import Foundation +import SyntaxSupport + +// Named-leaf ("varying") token kinds, mirroring the extractor adapter's +// VARYING_TOKEN_KINDS. Fixed tokens are anonymous (keyed by text) and are not +// matched by any rule, so they are not emitted here. +let varyingTokens = [ + "identifier", "integerLiteral", "floatLiteral", "stringSegment", + "binaryOperator", "prefixOperator", "postfixOperator", "dollarIdentifier", + "regexLiteralPattern", "rawStringPoundDelimiter", "regexPoundDelimiter", + "shebang", "unknown", +] + +// The yeast type references a child maps to. A collection wrapper is elided by +// the adapter, so a collection child maps to its element kinds. +func typeRefs(_ child: Child) -> [String] { + switch child.kind { + case .node(let kind): + return [kind.rawValue] + case .nodeChoices(let choices, _): + return choices.flatMap { typeRefs($0) } + case .collection(let kind, _, _, _, _): + if let collection = SYNTAX_NODES.first(where: { $0.kind == kind })?.collectionNode { + let elements = collection.elementChoices.map { $0.rawValue } + return elements.isEmpty ? [kind.rawValue] : elements + } + return [kind.rawValue] + case .token: + return ["_token"] + } +} + +func isMultiple(_ child: Child) -> Bool { + if case .collection = child.kind { + return true + } + return false +} + +var supertypes: [String: [String]] = [:] +var named: [(String, [Child])] = [] + +for node in SYNTAX_NODES { + if node.kind.isBase { + continue + } + if node.base == .syntaxCollection { + continue + } + supertypes[node.base.rawValue, default: []].append(node.kind.rawValue) + named.append((node.kind.rawValue, node.layoutNode?.children ?? [])) +} + +var output = "" +output += "# GENERATED from swift-syntax by unified/swift-syntax-rs/schemagen.\n" +output += "# Do not edit; run unified/scripts/regenerate-node-types.sh instead.\n" +let emitSupertypes = ProcessInfo.processInfo.environment["EMIT_SUPERTYPES"] != "0" +if emitSupertypes { + output += "supertypes:\n" + for base in supertypes.keys.sorted() { + output += " \(base):\n" + for member in supertypes[base]!.sorted() { + output += " - \(member)\n" + } + } +} +output += "named:\n" +for (kind, children) in named.sorted(by: { $0.0 < $1.0 }) { + output += " \(kind):\n" + for child in children { + // swift-syntax error-recovery slots (`unexpectedBeforeX` and + // `unexpectedBetweenXAndY`) are never matched by rules. + if child.name.hasPrefix("unexpected") { + continue + } + var key = child.name + if isMultiple(child) { + key += "*" + } else if child.isOptional { + key += "?" + } + let refs = typeRefs(child) + let value = refs.count == 1 ? refs[0] : "[" + refs.joined(separator: ", ") + "]" + output += " \(key): \(value)\n" + } +} + +// Synthetic leaf for token-typed fields, plus the named ("varying") token +// kinds that are not already emitted as layout nodes (`stringSegment`, for +// example, is both a node and a token kind and must only be emitted once). +let namedKinds = Set(named.map { $0.0 }) +output += " _token:\n" +for token in varyingTokens.sorted() where !namedKinds.contains(token) { + output += " \(token):\n" +} + +print(output, terminator: "") From f0de9c3913ba381d56832ddf3f083283d7ac3695 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 28 Aug 2026 13:39:54 +0100 Subject: [PATCH 0566/2098] C++: Add a crazy false positive from a Microsoft internal issue. --- .../UnsafeArrayForDaysOfYear.expected | 1 + .../Leap Year/UnsafeArrayForDaysOfYear/test.cpp | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/UnsafeArrayForDaysOfYear.expected b/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/UnsafeArrayForDaysOfYear.expected index 37dd8b1ae7d0..b4b42dcf499d 100644 --- a/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/UnsafeArrayForDaysOfYear.expected +++ b/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/UnsafeArrayForDaysOfYear.expected @@ -1,3 +1,4 @@ | test.cpp:17:6:17:10 | items | There is an array allocation with a hard-coded set of 365 elements, which may indicate the number of days in a year without considering leap year scenarios. | | test.cpp:25:15:25:26 | new[] | There is an array allocation with a hard-coded set of 365 elements, which may indicate the number of days in a year without considering leap year scenarios. | | test.cpp:52:20:52:23 | call to vector | There is a std::vector allocation with a hard-coded set of 365 elements, which may indicate the number of days in a year without considering leap year scenarios. | +| test.cpp:78:11:78:29 | __PRETTY_FUNCTION__ | There is an array allocation with a hard-coded set of 365 elements, which may indicate the number of days in a year without considering leap year scenarios. | diff --git a/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/test.cpp b/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/test.cpp index f76167c1893b..1759215eb55f 100644 --- a/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/test.cpp +++ b/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/test.cpp @@ -68,3 +68,12 @@ void VectorOfDays_FalsePositive(int dayOfYear, int x) items[dayOfYear - 1] = x; } + +void f_______________________________________________________this_name_must_be_exactly_357_chars__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________() { + // Using this magic compiler variable results in a `const char` array being + // initialized with the function name which (including `void`, a space, + // and `()`). in this case, this adds up to exactly 364 characters. + // The initializer for `__PRETTY_FUNCTION__` thus initializes an array of + // length 365 (because the null-terminator adds another character). + auto x = __PRETTY_FUNCTION__; // $ SPURIOUS: Alert +} \ No newline at end of file From fcfdf8103b922bef213516e2f1951a6df597d2fb Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 28 Aug 2026 13:41:02 +0100 Subject: [PATCH 0567/2098] C++: Exclude compiler generated variables from a case in 'cpp/leap-year/unsafe-array-for-days-of-the-year'. --- cpp/ql/src/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear.ql | 1 + .../UnsafeArrayForDaysOfYear/UnsafeArrayForDaysOfYear.expected | 1 - .../Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/test.cpp | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cpp/ql/src/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear.ql b/cpp/ql/src/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear.ql index b27db937b577..e6b1ccaa6687 100644 --- a/cpp/ql/src/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear.ql +++ b/cpp/ql/src/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear.ql @@ -26,6 +26,7 @@ where or exists(Variable var | var = element and + not var.isCompilerGenerated() and var.getType() instanceof LeapYearUnsafeDaysOfTheYearArrayType and allocType = "an array allocation" ) diff --git a/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/UnsafeArrayForDaysOfYear.expected b/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/UnsafeArrayForDaysOfYear.expected index b4b42dcf499d..37dd8b1ae7d0 100644 --- a/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/UnsafeArrayForDaysOfYear.expected +++ b/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/UnsafeArrayForDaysOfYear.expected @@ -1,4 +1,3 @@ | test.cpp:17:6:17:10 | items | There is an array allocation with a hard-coded set of 365 elements, which may indicate the number of days in a year without considering leap year scenarios. | | test.cpp:25:15:25:26 | new[] | There is an array allocation with a hard-coded set of 365 elements, which may indicate the number of days in a year without considering leap year scenarios. | | test.cpp:52:20:52:23 | call to vector | There is a std::vector allocation with a hard-coded set of 365 elements, which may indicate the number of days in a year without considering leap year scenarios. | -| test.cpp:78:11:78:29 | __PRETTY_FUNCTION__ | There is an array allocation with a hard-coded set of 365 elements, which may indicate the number of days in a year without considering leap year scenarios. | diff --git a/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/test.cpp b/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/test.cpp index 1759215eb55f..b772c4cc3526 100644 --- a/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/test.cpp +++ b/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/test.cpp @@ -75,5 +75,5 @@ void f_______________________________________________________this_name_must_be_e // and `()`). in this case, this adds up to exactly 364 characters. // The initializer for `__PRETTY_FUNCTION__` thus initializes an array of // length 365 (because the null-terminator adds another character). - auto x = __PRETTY_FUNCTION__; // $ SPURIOUS: Alert + auto x = __PRETTY_FUNCTION__; // clean } \ No newline at end of file From 2fe9ff3a67d1bf5b9851f492ef76e739b95db7f7 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 28 Aug 2026 13:45:54 +0100 Subject: [PATCH 0568/2098] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/test.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/test.cpp b/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/test.cpp index b772c4cc3526..3994fce4ee88 100644 --- a/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/test.cpp +++ b/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/test.cpp @@ -71,8 +71,8 @@ void VectorOfDays_FalsePositive(int dayOfYear, int x) void f_______________________________________________________this_name_must_be_exactly_357_chars__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________() { // Using this magic compiler variable results in a `const char` array being - // initialized with the function name which (including `void`, a space, - // and `()`). in this case, this adds up to exactly 364 characters. + // initialized with the function signature. Including `void`, a space, and + // `()`, the signature adds up to exactly 364 characters in this case. // The initializer for `__PRETTY_FUNCTION__` thus initializes an array of // length 365 (because the null-terminator adds another character). auto x = __PRETTY_FUNCTION__; // clean From 416b3ee158e535467072b0068c1dbd50627a9615 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 28 Aug 2026 13:49:19 +0100 Subject: [PATCH 0569/2098] C++: Add an amazing change note. --- .../src/change-notes/2026-08-28-leap-year-unsafe-array-fp.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 cpp/ql/src/change-notes/2026-08-28-leap-year-unsafe-array-fp.md diff --git a/cpp/ql/src/change-notes/2026-08-28-leap-year-unsafe-array-fp.md b/cpp/ql/src/change-notes/2026-08-28-leap-year-unsafe-array-fp.md new file mode 100644 index 000000000000..4ba04f0de358 --- /dev/null +++ b/cpp/ql/src/change-notes/2026-08-28-leap-year-unsafe-array-fp.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `cpp/leap-year/unsafe-array-for-days-of-the-year` query ("Unsafe array for days of the year") no longer reports an alert on the `__PRETTY_FUNCTION__` variable (and related variables) when the enclosing function has a signature that is exactly 364 characters. \ No newline at end of file From 4809a5e8e374f5c722bdf6ba388113d6b600540e Mon Sep 17 00:00:00 2001 From: Taus Date: Fri, 28 Aug 2026 13:43:36 +0000 Subject: [PATCH 0570/2098] unified: Address review comments --- unified/swift-syntax-rs/schemagen/README.md | 14 +++++------ .../schemagen/Sources/schemagen/main.swift | 23 +++++++++++-------- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/unified/swift-syntax-rs/schemagen/README.md b/unified/swift-syntax-rs/schemagen/README.md index 9211331699ab..727f93c48b30 100644 --- a/unified/swift-syntax-rs/schemagen/README.md +++ b/unified/swift-syntax-rs/schemagen/README.md @@ -54,14 +54,14 @@ swift-syntax's tree verbatim, so `main.swift` mirrors what - Abstract base kinds become `supertypes:` entries rather than node kinds. - Collection nodes are dropped, and a collection-typed child is recorded as its element kinds, because the adapter elides collections into JSON arrays. -- `unexpectedBeforeX` and `unexpectedBetweenXAndY` error-recovery children are - dropped; no rule matches them. This filters on the child name: - `unexpectedCodeDecl` is a real node kind and is retained. +- `unexpectedBeforeX`, `unexpectedBetweenXAndY`, and `unexpectedAfterX` + error-recovery children are dropped; no rule matches them. This filters on + the child name: `unexpectedCodeDecl` is a real node kind and is retained. - Token-typed children become the synthetic `_token` kind. Only the varying - token kinds whose text is not implied by the kind, listed in - `VARYING_TOKEN_KINDS` in `adapter.rs`, are emitted as kinds of their own. - Fixed tokens are anonymous and keyed by their text, so no rule can name - them. + token kinds whose `TokenSpec` is `.other` and has no fixed text are emitted + as kinds of their own. These are derived from `Token.allCases` and should match + `VARYING_TOKEN_KINDS` in `adapter.rs`. Fixed tokens are anonymous and keyed + by their text, so no rule can name them. Setting `EMIT_SUPERTYPES=0` omits the `supertypes:` section, which can be useful when diffing two versions for kind and field changes alone. diff --git a/unified/swift-syntax-rs/schemagen/Sources/schemagen/main.swift b/unified/swift-syntax-rs/schemagen/Sources/schemagen/main.swift index 6f80a37b90c1..0fcb53035349 100644 --- a/unified/swift-syntax-rs/schemagen/Sources/schemagen/main.swift +++ b/unified/swift-syntax-rs/schemagen/Sources/schemagen/main.swift @@ -4,15 +4,17 @@ import SyntaxSupport // Named-leaf ("varying") token kinds, mirroring the extractor adapter's // VARYING_TOKEN_KINDS. Fixed tokens are anonymous (keyed by text) and are not // matched by any rule, so they are not emitted here. -let varyingTokens = [ - "identifier", "integerLiteral", "floatLiteral", "stringSegment", - "binaryOperator", "prefixOperator", "postfixOperator", "dollarIdentifier", - "regexLiteralPattern", "rawStringPoundDelimiter", "regexPoundDelimiter", - "shebang", "unknown", -] +let varyingTokens = Token.allCases.compactMap { token -> String? in + let spec = token.spec + guard spec.text == nil else { return nil } + // The generic `keyword` token has no `TokenSpec.text`, but each concrete + // keyword has a fixed spelling carried by its associated value. + guard case .other = spec.kind else { return nil } + return spec.identifier.text +} -// The yeast type references a child maps to. A collection wrapper is elided by -// the adapter, so a collection child maps to its element kinds. +// The yeast type references that a child maps to. A collection wrapper is +// elided by the adapter, so a collection child maps to its element kinds. func typeRefs(_ child: Child) -> [String] { switch child.kind { case .node(let kind): @@ -68,8 +70,9 @@ output += "named:\n" for (kind, children) in named.sorted(by: { $0.0 < $1.0 }) { output += " \(kind):\n" for child in children { - // swift-syntax error-recovery slots (`unexpectedBeforeX` and - // `unexpectedBetweenXAndY`) are never matched by rules. + // swift-syntax error-recovery slots (`unexpectedBeforeX`, + // `unexpectedBetweenXAndY`, and `unexpectedAfterX`) are never matched + // by rules. if child.name.hasPrefix("unexpected") { continue } From 029d5fb9321b7a37b5509664da0b7787f5bf5d94 Mon Sep 17 00:00:00 2001 From: Kristen Newbury Date: Fri, 28 Aug 2026 09:47:09 -0400 Subject: [PATCH 0571/2098] Fix spelling mistake --- actions/ql/lib/codeql/actions/security/ControlChecks.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actions/ql/lib/codeql/actions/security/ControlChecks.qll b/actions/ql/lib/codeql/actions/security/ControlChecks.qll index 20dea013a503..7a5e5f455683 100644 --- a/actions/ql/lib/codeql/actions/security/ControlChecks.qll +++ b/actions/ql/lib/codeql/actions/security/ControlChecks.qll @@ -284,7 +284,7 @@ abstract class LabelCheck extends ControlCheck { * of this model is for any environment to be considered a sanitizer. * If values are (currently manually/externally) provided in `actions/ql/lib/ext/config/deployment_environment.yml` * then those names will be used to define the valid sanitizer set. - * To create a default of "no default saniziter environment" one can add an + * To create a default of "no default sanitizer environment" one can add an * empty string to the data array in `deployment_environment.yml`. */ class EnvironmentCheck extends ControlCheck instanceof Environment { From d9ad582a087ffc8b21cf1e0e945f8d49c939b2d8 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 28 Aug 2026 16:01:13 +0200 Subject: [PATCH 0572/2098] C++: Update regex test comment --- cpp/ql/test/library-tests/regex/regexp.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cpp/ql/test/library-tests/regex/regexp.cpp b/cpp/ql/test/library-tests/regex/regexp.cpp index 51986dd59adf..3dbf50ff1a88 100644 --- a/cpp/ql/test/library-tests/regex/regexp.cpp +++ b/cpp/ql/test/library-tests/regex/regexp.cpp @@ -32,8 +32,8 @@ std::regex r_cc2("[a-fA-F0-9_]"); std::regex r_cc3("[\\w]+"); std::regex r_cc4("\\[\\][123]"); std::regex r_cc5("[^A-Z]"); -std::regex r_cc6("[]]"); // MRI gives a warning, but accepts this as matching ']' -std::regex r_cc7("[^]]"); // MRI gives a warning, but accepts this as matching anything except ']' +std::regex r_cc6("[]]"); // Not a valid regex +std::regex r_cc7("[^]]"); // Not a valid regex std::regex r_cc8("[^-]"); std::regex r_cc9("[|]"); std::regex r_cc10("[\\b]"); From 001729245b8d1c2ab6edd560deb3eb03d02a9935 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 28 Aug 2026 16:13:12 +0200 Subject: [PATCH 0573/2098] Docs: remove blank line between supported-platform footnotes Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- docs/codeql/reusables/supported-platforms.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/codeql/reusables/supported-platforms.rst b/docs/codeql/reusables/supported-platforms.rst index 8a7f31849b4f..2944d8e6cc0a 100644 --- a/docs/codeql/reusables/supported-platforms.rst +++ b/docs/codeql/reusables/supported-platforms.rst @@ -19,5 +19,4 @@ .. container:: footnote-group .. [1] Support for Linux on arm64 is currently in beta. - .. [2] On Apple Silicon, building your code during analysis requires Rosetta 2; analyzing an interpreted language or using build mode ``none`` runs natively. From fed331e2666ea9e7af61f647cbc29e65bdc59cb0 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 28 Aug 2026 16:21:58 +0200 Subject: [PATCH 0574/2098] C++: Add `RawStringLiteral` test --- cpp/ql/test/library-tests/regex/rawstringliteral.expected | 7 +++++++ cpp/ql/test/library-tests/regex/rawstringliteral.ql | 4 ++++ 2 files changed, 11 insertions(+) create mode 100644 cpp/ql/test/library-tests/regex/rawstringliteral.expected create mode 100644 cpp/ql/test/library-tests/regex/rawstringliteral.ql diff --git a/cpp/ql/test/library-tests/regex/rawstringliteral.expected b/cpp/ql/test/library-tests/regex/rawstringliteral.expected new file mode 100644 index 000000000000..87cae28fef0a --- /dev/null +++ b/cpp/ql/test/library-tests/regex/rawstringliteral.expected @@ -0,0 +1,7 @@ +| regexp.cpp:116:20:116:28 | a\\nc | +| regexp.cpp:117:36:117:45 | a\\nc | +| regexp.cpp:118:37:118:47 | a\\nc | +| regexp.cpp:119:37:119:46 | a\\nc | +| regexp.cpp:120:37:120:46 | a\\nc | +| regexp.cpp:121:21:121:31 | a\\nc | +| regexp.cpp:122:23:122:37 | a\\nc | diff --git a/cpp/ql/test/library-tests/regex/rawstringliteral.ql b/cpp/ql/test/library-tests/regex/rawstringliteral.ql new file mode 100644 index 000000000000..17673c29790f --- /dev/null +++ b/cpp/ql/test/library-tests/regex/rawstringliteral.ql @@ -0,0 +1,4 @@ +import cpp + +from RawStringLiteral rsl +select rsl From e6359c596dde2cef4684252778078e7c7f976b93 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 28 Aug 2026 16:27:27 +0200 Subject: [PATCH 0575/2098] C++: Fix QLDoc comment --- cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll | 2 +- cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll index 9e659f8168a6..463bc3822e49 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll @@ -1238,7 +1238,7 @@ private module Impl implements RegexTreeViewSig { } /** - * Holds if `root` has the `s` flag for multi-line matching. + * Holds if `root` has the `s` flag for dot-all matching. */ predicate isDotAll(RegExpTerm root) { root.isRootTerm() and diff --git a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll index 999536664469..c90826d95c8c 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/internal/ParseRegExp.qll @@ -14,7 +14,7 @@ private import semmle.code.cpp.exprs.Literal */ abstract class RegExp extends StringLiteral { /** - * Holds if this `RegExp` has the `s` flag for multi-line matching. + * Holds if this `RegExp` has the `s` flag for dot-all matching. */ predicate isDotAll() { none() } From bd1fc196b0768b1fe719cdc69ca29ce0ab647f36 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 28 Aug 2026 16:40:05 +0200 Subject: [PATCH 0576/2098] C++: Add `std:wregex` in regex test --- .../library-tests/regex/locations.expected | 122 ++-- .../test/library-tests/regex/parse.expected | 400 +++++------ .../regex/rawstringliteral.expected | 12 +- cpp/ql/test/library-tests/regex/regexp.cpp | 3 +- .../test/library-tests/regex/regexp.expected | 678 +++++++++--------- 5 files changed, 608 insertions(+), 607 deletions(-) diff --git a/cpp/ql/test/library-tests/regex/locations.expected b/cpp/ql/test/library-tests/regex/locations.expected index a9f12c020d79..f798d434504a 100644 --- a/cpp/ql/test/library-tests/regex/locations.expected +++ b/cpp/ql/test/library-tests/regex/locations.expected @@ -1,63 +1,63 @@ -| regexp.cpp:18:19:18:21 | abc | regexp.cpp | 18 | 19 | 18 | 21 | -| regexp.cpp:21:20:21:26 | a*b+c?d | regexp.cpp | 21 | 20 | 21 | 26 | -| regexp.cpp:22:20:22:25 | a{4,8} | regexp.cpp | 22 | 20 | 22 | 25 | -| regexp.cpp:23:20:23:24 | a{3,} | regexp.cpp | 23 | 20 | 23 | 24 | -| regexp.cpp:24:20:24:23 | a{7} | regexp.cpp | 24 | 20 | 24 | 23 | -| regexp.cpp:27:19:27:25 | foo\|bar | regexp.cpp | 27 | 19 | 27 | 25 | -| regexp.cpp:30:19:30:23 | [abc] | regexp.cpp | 30 | 19 | 30 | 23 | -| regexp.cpp:31:19:31:30 | [a-fA-F0-9_] | regexp.cpp | 31 | 19 | 31 | 30 | -| regexp.cpp:32:19:32:23 | [\\w]+ | regexp.cpp | 32 | 19 | 32 | 23 | -| regexp.cpp:33:19:33:27 | \\[\\][123] | regexp.cpp | 33 | 19 | 33 | 27 | -| regexp.cpp:34:19:34:24 | [^A-Z] | regexp.cpp | 34 | 19 | 34 | 24 | -| regexp.cpp:35:19:35:21 | []] | regexp.cpp | 35 | 19 | 35 | 21 | -| regexp.cpp:36:19:36:22 | [^]] | regexp.cpp | 36 | 19 | 36 | 22 | -| regexp.cpp:37:19:37:22 | [^-] | regexp.cpp | 37 | 19 | 37 | 22 | -| regexp.cpp:38:19:38:21 | [\|] | regexp.cpp | 38 | 19 | 38 | 21 | -| regexp.cpp:39:20:39:23 | [\\b] | regexp.cpp | 39 | 20 | 39 | 23 | -| regexp.cpp:42:22:42:31 | [[a-f]A-F] | regexp.cpp | 42 | 22 | 42 | 31 | -| regexp.cpp:45:21:45:22 | .* | regexp.cpp | 45 | 21 | 45 | 22 | -| regexp.cpp:46:21:46:25 | \\w+\\W | regexp.cpp | 46 | 21 | 46 | 25 | -| regexp.cpp:47:21:47:24 | \\s\\S | regexp.cpp | 47 | 21 | 47 | 24 | -| regexp.cpp:48:21:48:24 | \\d\\D | regexp.cpp | 48 | 21 | 48 | 24 | -| regexp.cpp:49:21:49:26 | \\n\\r\\t | regexp.cpp | 49 | 21 | 49 | 26 | -| regexp.cpp:52:20:52:25 | \\b!a\\B | regexp.cpp | 52 | 20 | 52 | 25 | -| regexp.cpp:55:20:55:28 | (foo)*bar | regexp.cpp | 55 | 20 | 55 | 28 | -| regexp.cpp:56:20:56:28 | fo(o\|b)ar | regexp.cpp | 56 | 20 | 56 | 28 | -| regexp.cpp:57:20:57:28 | (a\|b\|cd)e | regexp.cpp | 57 | 20 | 57 | 28 | -| regexp.cpp:58:20:58:27 | (?::+)\\w | regexp.cpp | 58 | 20 | 58 | 27 | -| regexp.cpp:61:21:61:28 | (a+)b+\\1 | regexp.cpp | 61 | 21 | 61 | 28 | -| regexp.cpp:64:21:64:32 | [[:alnum:]]* | regexp.cpp | 64 | 21 | 64 | 32 | -| regexp.cpp:65:21:65:32 | [[:digit:]]+ | regexp.cpp | 65 | 21 | 65 | 32 | -| regexp.cpp:66:21:66:36 | [[:alnum:]]{2,3} | regexp.cpp | 66 | 21 | 66 | 36 | -| regexp.cpp:67:21:67:35 | [a-f[:digit:]]+ | regexp.cpp | 67 | 21 | 67 | 35 | -| regexp.cpp:70:22:70:43 | [[:alpha:]][[:digit:]] | regexp.cpp | 70 | 22 | 70 | 43 | -| regexp.cpp:73:22:73:41 | [[:alpha:][:digit:]] | regexp.cpp | 73 | 22 | 73 | 41 | -| regexp.cpp:76:22:76:38 | [A-F[:digit:]a-f] | regexp.cpp | 76 | 22 | 76 | 38 | -| regexp.cpp:79:27:79:33 | [[.a.]] | regexp.cpp | 79 | 27 | 79 | 33 | -| regexp.cpp:80:27:80:39 | [A-F[.b.]a-f] | regexp.cpp | 80 | 27 | 80 | 39 | -| regexp.cpp:83:28:83:34 | [[=a=]] | regexp.cpp | 83 | 28 | 83 | 34 | -| regexp.cpp:84:28:84:40 | [A-F[=b=]a-f] | regexp.cpp | 84 | 28 | 84 | 40 | -| regexp.cpp:87:22:87:30 | [:digit:] | regexp.cpp | 87 | 22 | 87 | 30 | -| regexp.cpp:90:19:90:24 | \\u0061 | regexp.cpp | 90 | 19 | 90 | 24 | -| regexp.cpp:93:19:93:22 | \\x61 | regexp.cpp | 93 | 19 | 93 | 22 | -| regexp.cpp:96:21:96:23 | \\cA | regexp.cpp | 96 | 21 | 96 | 23 | -| regexp.cpp:97:21:97:25 | [\\cz] | regexp.cpp | 97 | 21 | 97 | 25 | -| regexp.cpp:100:20:100:21 | \\0 | regexp.cpp | 100 | 20 | 100 | 21 | -| regexp.cpp:101:20:101:23 | [\\0] | regexp.cpp | 101 | 20 | 101 | 23 | -| regexp.cpp:104:21:104:23 | a*? | regexp.cpp | 104 | 21 | 104 | 23 | -| regexp.cpp:105:21:105:23 | b+? | regexp.cpp | 105 | 21 | 105 | 23 | -| regexp.cpp:106:21:106:23 | c?? | regexp.cpp | 106 | 21 | 106 | 23 | -| regexp.cpp:107:21:107:27 | d{2,3}? | regexp.cpp | 107 | 21 | 107 | 27 | -| regexp.cpp:108:18:108:21 | \\f\\v | regexp.cpp | 108 | 18 | 108 | 21 | -| regexp.cpp:111:25:111:28 | a\\nb | regexp.cpp | 111 | 25 | 111 | 28 | -| regexp.cpp:112:37:112:40 | a\\nc | regexp.cpp | 112 | 37 | 112 | 40 | -| regexp.cpp:113:39:113:42 | a\\nc | regexp.cpp | 113 | 39 | 113 | 42 | -| regexp.cpp:114:38:114:41 | a\\nc | regexp.cpp | 114 | 38 | 114 | 41 | +| regexp.cpp:19:19:19:21 | abc | regexp.cpp | 19 | 19 | 19 | 21 | +| regexp.cpp:22:20:22:26 | a*b+c?d | regexp.cpp | 22 | 20 | 22 | 26 | +| regexp.cpp:23:20:23:25 | a{4,8} | regexp.cpp | 23 | 20 | 23 | 25 | +| regexp.cpp:24:20:24:24 | a{3,} | regexp.cpp | 24 | 20 | 24 | 24 | +| regexp.cpp:25:20:25:23 | a{7} | regexp.cpp | 25 | 20 | 25 | 23 | +| regexp.cpp:28:19:28:25 | foo\|bar | regexp.cpp | 28 | 19 | 28 | 25 | +| regexp.cpp:31:19:31:23 | [abc] | regexp.cpp | 31 | 19 | 31 | 23 | +| regexp.cpp:32:19:32:30 | [a-fA-F0-9_] | regexp.cpp | 32 | 19 | 32 | 30 | +| regexp.cpp:33:19:33:23 | [\\w]+ | regexp.cpp | 33 | 19 | 33 | 23 | +| regexp.cpp:34:19:34:27 | \\[\\][123] | regexp.cpp | 34 | 19 | 34 | 27 | +| regexp.cpp:35:19:35:24 | [^A-Z] | regexp.cpp | 35 | 19 | 35 | 24 | +| regexp.cpp:36:19:36:21 | []] | regexp.cpp | 36 | 19 | 36 | 21 | +| regexp.cpp:37:19:37:22 | [^]] | regexp.cpp | 37 | 19 | 37 | 22 | +| regexp.cpp:38:19:38:22 | [^-] | regexp.cpp | 38 | 19 | 38 | 22 | +| regexp.cpp:39:19:39:21 | [\|] | regexp.cpp | 39 | 19 | 39 | 21 | +| regexp.cpp:40:20:40:23 | [\\b] | regexp.cpp | 40 | 20 | 40 | 23 | +| regexp.cpp:43:22:43:31 | [[a-f]A-F] | regexp.cpp | 43 | 22 | 43 | 31 | +| regexp.cpp:46:21:46:22 | .* | regexp.cpp | 46 | 21 | 46 | 22 | +| regexp.cpp:47:21:47:25 | \\w+\\W | regexp.cpp | 47 | 21 | 47 | 25 | +| regexp.cpp:48:21:48:24 | \\s\\S | regexp.cpp | 48 | 21 | 48 | 24 | +| regexp.cpp:49:21:49:24 | \\d\\D | regexp.cpp | 49 | 21 | 49 | 24 | +| regexp.cpp:50:21:50:26 | \\n\\r\\t | regexp.cpp | 50 | 21 | 50 | 26 | +| regexp.cpp:53:20:53:25 | \\b!a\\B | regexp.cpp | 53 | 20 | 53 | 25 | +| regexp.cpp:56:20:56:28 | (foo)*bar | regexp.cpp | 56 | 20 | 56 | 28 | +| regexp.cpp:57:20:57:28 | fo(o\|b)ar | regexp.cpp | 57 | 20 | 57 | 28 | +| regexp.cpp:58:20:58:28 | (a\|b\|cd)e | regexp.cpp | 58 | 20 | 58 | 28 | +| regexp.cpp:59:20:59:27 | (?::+)\\w | regexp.cpp | 59 | 20 | 59 | 27 | +| regexp.cpp:62:21:62:28 | (a+)b+\\1 | regexp.cpp | 62 | 21 | 62 | 28 | +| regexp.cpp:65:21:65:32 | [[:alnum:]]* | regexp.cpp | 65 | 21 | 65 | 32 | +| regexp.cpp:66:21:66:32 | [[:digit:]]+ | regexp.cpp | 66 | 21 | 66 | 32 | +| regexp.cpp:67:21:67:36 | [[:alnum:]]{2,3} | regexp.cpp | 67 | 21 | 67 | 36 | +| regexp.cpp:68:21:68:35 | [a-f[:digit:]]+ | regexp.cpp | 68 | 21 | 68 | 35 | +| regexp.cpp:71:22:71:43 | [[:alpha:]][[:digit:]] | regexp.cpp | 71 | 22 | 71 | 43 | +| regexp.cpp:74:22:74:41 | [[:alpha:][:digit:]] | regexp.cpp | 74 | 22 | 74 | 41 | +| regexp.cpp:77:22:77:38 | [A-F[:digit:]a-f] | regexp.cpp | 77 | 22 | 77 | 38 | +| regexp.cpp:80:27:80:33 | [[.a.]] | regexp.cpp | 80 | 27 | 80 | 33 | +| regexp.cpp:81:27:81:39 | [A-F[.b.]a-f] | regexp.cpp | 81 | 27 | 81 | 39 | +| regexp.cpp:84:28:84:34 | [[=a=]] | regexp.cpp | 84 | 28 | 84 | 34 | +| regexp.cpp:85:28:85:40 | [A-F[=b=]a-f] | regexp.cpp | 85 | 28 | 85 | 40 | +| regexp.cpp:88:22:88:30 | [:digit:] | regexp.cpp | 88 | 22 | 88 | 30 | +| regexp.cpp:91:19:91:24 | \\u0061 | regexp.cpp | 91 | 19 | 91 | 24 | +| regexp.cpp:94:19:94:22 | \\x61 | regexp.cpp | 94 | 19 | 94 | 22 | +| regexp.cpp:97:21:97:23 | \\cA | regexp.cpp | 97 | 21 | 97 | 23 | +| regexp.cpp:98:21:98:25 | [\\cz] | regexp.cpp | 98 | 21 | 98 | 25 | +| regexp.cpp:101:20:101:21 | \\0 | regexp.cpp | 101 | 20 | 101 | 21 | +| regexp.cpp:102:20:102:23 | [\\0] | regexp.cpp | 102 | 20 | 102 | 23 | +| regexp.cpp:105:21:105:23 | a*? | regexp.cpp | 105 | 21 | 105 | 23 | +| regexp.cpp:106:21:106:23 | b+? | regexp.cpp | 106 | 21 | 106 | 23 | +| regexp.cpp:107:21:107:23 | c?? | regexp.cpp | 107 | 21 | 107 | 23 | +| regexp.cpp:108:21:108:27 | d{2,3}? | regexp.cpp | 108 | 21 | 108 | 27 | +| regexp.cpp:109:18:109:21 | \\f\\v | regexp.cpp | 109 | 18 | 109 | 21 | +| regexp.cpp:112:25:112:28 | a\\nb | regexp.cpp | 112 | 25 | 112 | 28 | +| regexp.cpp:113:37:113:40 | a\\nc | regexp.cpp | 113 | 37 | 113 | 40 | +| regexp.cpp:114:39:114:42 | a\\nc | regexp.cpp | 114 | 39 | 114 | 42 | | regexp.cpp:115:38:115:41 | a\\nc | regexp.cpp | 115 | 38 | 115 | 41 | -| regexp.cpp:116:23:116:26 | a\\nc | regexp.cpp | 116 | 23 | 116 | 26 | -| regexp.cpp:117:40:117:43 | a\\nc | regexp.cpp | 117 | 40 | 117 | 43 | -| regexp.cpp:118:42:118:45 | a\\nc | regexp.cpp | 118 | 42 | 118 | 45 | -| regexp.cpp:119:41:119:44 | a\\nc | regexp.cpp | 119 | 41 | 119 | 44 | +| regexp.cpp:116:38:116:41 | a\\nc | regexp.cpp | 116 | 38 | 116 | 41 | +| regexp.cpp:117:23:117:26 | a\\nc | regexp.cpp | 117 | 23 | 117 | 26 | +| regexp.cpp:118:26:118:29 | a\\nc | regexp.cpp | 118 | 26 | 118 | 29 | +| regexp.cpp:119:42:119:45 | a\\nc | regexp.cpp | 119 | 42 | 119 | 45 | | regexp.cpp:120:41:120:44 | a\\nc | regexp.cpp | 120 | 41 | 120 | 44 | -| regexp.cpp:121:25:121:28 | a\\nc | regexp.cpp | 121 | 25 | 121 | 28 | -| regexp.cpp:122:29:122:32 | a\\nc | regexp.cpp | 122 | 29 | 122 | 32 | +| regexp.cpp:121:41:121:44 | a\\nc | regexp.cpp | 121 | 41 | 121 | 44 | +| regexp.cpp:122:25:122:28 | a\\nc | regexp.cpp | 122 | 25 | 122 | 28 | +| regexp.cpp:123:29:123:32 | a\\nc | regexp.cpp | 123 | 29 | 123 | 32 | diff --git a/cpp/ql/test/library-tests/regex/parse.expected b/cpp/ql/test/library-tests/regex/parse.expected index e8d84b277514..b64030dd963f 100644 --- a/cpp/ql/test/library-tests/regex/parse.expected +++ b/cpp/ql/test/library-tests/regex/parse.expected @@ -1,532 +1,521 @@ regexp.cpp: -# 18| [RegExpConstant, RegExpNormalChar] abc +# 19| [RegExpConstant, RegExpNormalChar] abc -# 21| [RegExpConstant, RegExpNormalChar] a +# 22| [RegExpConstant, RegExpNormalChar] a -# 21| [RegExpStar] a* +# 22| [RegExpStar] a* #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 21| [RegExpSequence] a*b+c?d +# 22| [RegExpSequence] a*b+c?d #-----| 0 -> [RegExpStar] a* #-----| 1 -> [RegExpPlus] b+ #-----| 2 -> [RegExpOpt] c? #-----| 3 -> [RegExpConstant, RegExpNormalChar] d -# 21| [RegExpConstant, RegExpNormalChar] b +# 22| [RegExpConstant, RegExpNormalChar] b -# 21| [RegExpPlus] b+ +# 22| [RegExpPlus] b+ #-----| 0 -> [RegExpConstant, RegExpNormalChar] b -# 21| [RegExpConstant, RegExpNormalChar] c +# 22| [RegExpConstant, RegExpNormalChar] c -# 21| [RegExpOpt] c? +# 22| [RegExpOpt] c? #-----| 0 -> [RegExpConstant, RegExpNormalChar] c -# 21| [RegExpConstant, RegExpNormalChar] d +# 22| [RegExpConstant, RegExpNormalChar] d -# 22| [RegExpConstant, RegExpNormalChar] a +# 23| [RegExpConstant, RegExpNormalChar] a -# 22| [RegExpRange] a{4,8} +# 23| [RegExpRange] a{4,8} #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 23| [RegExpConstant, RegExpNormalChar] a +# 24| [RegExpConstant, RegExpNormalChar] a -# 23| [InfiniteRepetitionQuantifier, RegExpRange] a{3,} +# 24| [InfiniteRepetitionQuantifier, RegExpRange] a{3,} #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 24| [RegExpConstant, RegExpNormalChar] a +# 25| [RegExpConstant, RegExpNormalChar] a -# 24| [RegExpRange] a{7} +# 25| [RegExpRange] a{7} #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 27| [RegExpConstant, RegExpNormalChar] foo +# 28| [RegExpConstant, RegExpNormalChar] foo -# 27| [RegExpAlt] foo|bar +# 28| [RegExpAlt] foo|bar #-----| 0 -> [RegExpConstant, RegExpNormalChar] foo #-----| 1 -> [RegExpConstant, RegExpNormalChar] bar -# 27| [RegExpConstant, RegExpNormalChar] bar +# 28| [RegExpConstant, RegExpNormalChar] bar -# 30| [RegExpCharacterClass] [abc] +# 31| [RegExpCharacterClass] [abc] #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] b #-----| 2 -> [RegExpConstant, RegExpNormalChar] c -# 30| [RegExpConstant, RegExpNormalChar] a +# 31| [RegExpConstant, RegExpNormalChar] a -# 30| [RegExpConstant, RegExpNormalChar] b +# 31| [RegExpConstant, RegExpNormalChar] b -# 30| [RegExpConstant, RegExpNormalChar] c +# 31| [RegExpConstant, RegExpNormalChar] c -# 31| [RegExpCharacterClass] [a-fA-F0-9_] +# 32| [RegExpCharacterClass] [a-fA-F0-9_] #-----| 0 -> [RegExpCharacterRange] a-f #-----| 1 -> [RegExpCharacterRange] A-F #-----| 2 -> [RegExpCharacterRange] 0-9 #-----| 3 -> [RegExpConstant, RegExpNormalChar] _ -# 31| [RegExpConstant, RegExpNormalChar] a +# 32| [RegExpConstant, RegExpNormalChar] a -# 31| [RegExpCharacterRange] a-f +# 32| [RegExpCharacterRange] a-f #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] f -# 31| [RegExpConstant, RegExpNormalChar] f +# 32| [RegExpConstant, RegExpNormalChar] f -# 31| [RegExpConstant, RegExpNormalChar] A +# 32| [RegExpConstant, RegExpNormalChar] A -# 31| [RegExpCharacterRange] A-F +# 32| [RegExpCharacterRange] A-F #-----| 0 -> [RegExpConstant, RegExpNormalChar] A #-----| 1 -> [RegExpConstant, RegExpNormalChar] F -# 31| [RegExpConstant, RegExpNormalChar] F +# 32| [RegExpConstant, RegExpNormalChar] F -# 31| [RegExpConstant, RegExpNormalChar] 0 +# 32| [RegExpConstant, RegExpNormalChar] 0 -# 31| [RegExpCharacterRange] 0-9 +# 32| [RegExpCharacterRange] 0-9 #-----| 0 -> [RegExpConstant, RegExpNormalChar] 0 #-----| 1 -> [RegExpConstant, RegExpNormalChar] 9 -# 31| [RegExpConstant, RegExpNormalChar] 9 +# 32| [RegExpConstant, RegExpNormalChar] 9 -# 31| [RegExpConstant, RegExpNormalChar] _ +# 32| [RegExpConstant, RegExpNormalChar] _ -# 32| [RegExpCharacterClass] [\w] +# 33| [RegExpCharacterClass] [\w] #-----| 0 -> [RegExpCharacterClassEscape] \w -# 32| [RegExpPlus] [\w]+ +# 33| [RegExpPlus] [\w]+ #-----| 0 -> [RegExpCharacterClass] [\w] -# 32| [RegExpCharacterClassEscape] \w +# 33| [RegExpCharacterClassEscape] \w -# 33| [RegExpConstant, RegExpEscape] \[ +# 34| [RegExpConstant, RegExpEscape] \[ -# 33| [RegExpSequence] \[\][123] +# 34| [RegExpSequence] \[\][123] #-----| 0 -> [RegExpConstant, RegExpEscape] \[ #-----| 1 -> [RegExpConstant, RegExpEscape] \] #-----| 2 -> [RegExpCharacterClass] [123] -# 33| [RegExpConstant, RegExpEscape] \] +# 34| [RegExpConstant, RegExpEscape] \] -# 33| [RegExpCharacterClass] [123] +# 34| [RegExpCharacterClass] [123] #-----| 0 -> [RegExpConstant, RegExpNormalChar] 1 #-----| 1 -> [RegExpConstant, RegExpNormalChar] 2 #-----| 2 -> [RegExpConstant, RegExpNormalChar] 3 -# 33| [RegExpConstant, RegExpNormalChar] 1 +# 34| [RegExpConstant, RegExpNormalChar] 1 -# 33| [RegExpConstant, RegExpNormalChar] 2 +# 34| [RegExpConstant, RegExpNormalChar] 2 -# 33| [RegExpConstant, RegExpNormalChar] 3 +# 34| [RegExpConstant, RegExpNormalChar] 3 -# 34| [RegExpCharacterClass] [^A-Z] +# 35| [RegExpCharacterClass] [^A-Z] #-----| 0 -> [RegExpCharacterRange] A-Z -# 34| [RegExpConstant, RegExpNormalChar] A +# 35| [RegExpConstant, RegExpNormalChar] A -# 34| [RegExpCharacterRange] A-Z +# 35| [RegExpCharacterRange] A-Z #-----| 0 -> [RegExpConstant, RegExpNormalChar] A #-----| 1 -> [RegExpConstant, RegExpNormalChar] Z -# 34| [RegExpConstant, RegExpNormalChar] Z +# 35| [RegExpConstant, RegExpNormalChar] Z -# 35| [RegExpCharacterClass] []] +# 36| [RegExpCharacterClass] []] #-----| 0 -> [RegExpConstant, RegExpNormalChar] ] -# 35| [RegExpConstant, RegExpNormalChar] ] +# 36| [RegExpConstant, RegExpNormalChar] ] -# 36| [RegExpCharacterClass] [^]] +# 37| [RegExpCharacterClass] [^]] #-----| 0 -> [RegExpConstant, RegExpNormalChar] ] -# 36| [RegExpConstant, RegExpNormalChar] ] +# 37| [RegExpConstant, RegExpNormalChar] ] -# 37| [RegExpCharacterClass] [^-] +# 38| [RegExpCharacterClass] [^-] #-----| 0 -> [RegExpConstant, RegExpNormalChar] - -# 37| [RegExpConstant, RegExpNormalChar] - +# 38| [RegExpConstant, RegExpNormalChar] - -# 38| [RegExpCharacterClass] [|] +# 39| [RegExpCharacterClass] [|] #-----| 0 -> [RegExpConstant, RegExpNormalChar] | -# 38| [RegExpConstant, RegExpNormalChar] | +# 39| [RegExpConstant, RegExpNormalChar] | -# 39| [RegExpCharacterClass] [\b] +# 40| [RegExpCharacterClass] [\b] #-----| 0 -> [RegExpConstant, RegExpEscape] \b -# 39| [RegExpConstant, RegExpEscape] \b +# 40| [RegExpConstant, RegExpEscape] \b -# 42| [RegExpCharacterClass] [[a-f] +# 43| [RegExpCharacterClass] [[a-f] #-----| 0 -> [RegExpConstant, RegExpNormalChar] [ #-----| 1 -> [RegExpCharacterRange] a-f -# 42| [RegExpSequence] [[a-f]A-F] +# 43| [RegExpSequence] [[a-f]A-F] #-----| 0 -> [RegExpCharacterClass] [[a-f] #-----| 1 -> [RegExpConstant, RegExpNormalChar] A-F] -# 42| [RegExpConstant, RegExpNormalChar] [ +# 43| [RegExpConstant, RegExpNormalChar] [ -# 42| [RegExpConstant, RegExpNormalChar] a +# 43| [RegExpConstant, RegExpNormalChar] a -# 42| [RegExpCharacterRange] a-f +# 43| [RegExpCharacterRange] a-f #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] f -# 42| [RegExpConstant, RegExpNormalChar] f +# 43| [RegExpConstant, RegExpNormalChar] f -# 42| [RegExpConstant, RegExpNormalChar] A-F] +# 43| [RegExpConstant, RegExpNormalChar] A-F] -# 45| [RegExpDot] . +# 46| [RegExpDot] . -# 45| [RegExpStar] .* +# 46| [RegExpStar] .* #-----| 0 -> [RegExpDot] . -# 46| [RegExpCharacterClassEscape] \w +# 47| [RegExpCharacterClassEscape] \w -# 46| [RegExpPlus] \w+ +# 47| [RegExpPlus] \w+ #-----| 0 -> [RegExpCharacterClassEscape] \w -# 46| [RegExpSequence] \w+\W +# 47| [RegExpSequence] \w+\W #-----| 0 -> [RegExpPlus] \w+ #-----| 1 -> [RegExpCharacterClassEscape] \W -# 46| [RegExpCharacterClassEscape] \W +# 47| [RegExpCharacterClassEscape] \W -# 47| [RegExpCharacterClassEscape] \s +# 48| [RegExpCharacterClassEscape] \s -# 47| [RegExpSequence] \s\S +# 48| [RegExpSequence] \s\S #-----| 0 -> [RegExpCharacterClassEscape] \s #-----| 1 -> [RegExpCharacterClassEscape] \S -# 47| [RegExpCharacterClassEscape] \S +# 48| [RegExpCharacterClassEscape] \S -# 48| [RegExpCharacterClassEscape] \d +# 49| [RegExpCharacterClassEscape] \d -# 48| [RegExpSequence] \d\D +# 49| [RegExpSequence] \d\D #-----| 0 -> [RegExpCharacterClassEscape] \d #-----| 1 -> [RegExpCharacterClassEscape] \D -# 48| [RegExpCharacterClassEscape] \D +# 49| [RegExpCharacterClassEscape] \D -# 49| [RegExpConstant, RegExpEscape] \n +# 50| [RegExpConstant, RegExpEscape] \n -# 49| [RegExpSequence] \n\r\t +# 50| [RegExpSequence] \n\r\t #-----| 0 -> [RegExpConstant, RegExpEscape] \n #-----| 1 -> [RegExpConstant, RegExpEscape] \r #-----| 2 -> [RegExpConstant, RegExpEscape] \t -# 49| [RegExpConstant, RegExpEscape] \r +# 50| [RegExpConstant, RegExpEscape] \r -# 49| [RegExpConstant, RegExpEscape] \t +# 50| [RegExpConstant, RegExpEscape] \t -# 52| [RegExpSpecialChar] \b +# 53| [RegExpSpecialChar] \b -# 52| [RegExpSequence] \b!a\B +# 53| [RegExpSequence] \b!a\B #-----| 0 -> [RegExpSpecialChar] \b #-----| 1 -> [RegExpConstant, RegExpNormalChar] !a #-----| 2 -> [RegExpNonWordBoundary] \B -# 52| [RegExpConstant, RegExpNormalChar] !a +# 53| [RegExpConstant, RegExpNormalChar] !a -# 52| [RegExpNonWordBoundary] \B +# 53| [RegExpNonWordBoundary] \B -# 55| [RegExpGroup] (foo) +# 56| [RegExpGroup] (foo) #-----| 0 -> [RegExpConstant, RegExpNormalChar] foo -# 55| [RegExpStar] (foo)* +# 56| [RegExpStar] (foo)* #-----| 0 -> [RegExpGroup] (foo) -# 55| [RegExpSequence] (foo)*bar +# 56| [RegExpSequence] (foo)*bar #-----| 0 -> [RegExpStar] (foo)* #-----| 1 -> [RegExpConstant, RegExpNormalChar] bar -# 55| [RegExpConstant, RegExpNormalChar] foo +# 56| [RegExpConstant, RegExpNormalChar] foo -# 55| [RegExpConstant, RegExpNormalChar] bar +# 56| [RegExpConstant, RegExpNormalChar] bar -# 56| [RegExpConstant, RegExpNormalChar] fo +# 57| [RegExpConstant, RegExpNormalChar] fo -# 56| [RegExpSequence] fo(o|b)ar +# 57| [RegExpSequence] fo(o|b)ar #-----| 0 -> [RegExpConstant, RegExpNormalChar] fo #-----| 1 -> [RegExpGroup] (o|b) #-----| 2 -> [RegExpConstant, RegExpNormalChar] ar -# 56| [RegExpGroup] (o|b) +# 57| [RegExpGroup] (o|b) #-----| 0 -> [RegExpAlt] o|b -# 56| [RegExpConstant, RegExpNormalChar] o +# 57| [RegExpConstant, RegExpNormalChar] o -# 56| [RegExpAlt] o|b +# 57| [RegExpAlt] o|b #-----| 0 -> [RegExpConstant, RegExpNormalChar] o #-----| 1 -> [RegExpConstant, RegExpNormalChar] b -# 56| [RegExpConstant, RegExpNormalChar] b +# 57| [RegExpConstant, RegExpNormalChar] b -# 56| [RegExpConstant, RegExpNormalChar] ar +# 57| [RegExpConstant, RegExpNormalChar] ar -# 57| [RegExpGroup] (a|b|cd) +# 58| [RegExpGroup] (a|b|cd) #-----| 0 -> [RegExpAlt] a|b|cd -# 57| [RegExpSequence] (a|b|cd)e +# 58| [RegExpSequence] (a|b|cd)e #-----| 0 -> [RegExpGroup] (a|b|cd) #-----| 1 -> [RegExpConstant, RegExpNormalChar] e -# 57| [RegExpConstant, RegExpNormalChar] a +# 58| [RegExpConstant, RegExpNormalChar] a -# 57| [RegExpAlt] a|b|cd +# 58| [RegExpAlt] a|b|cd #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] b #-----| 2 -> [RegExpConstant, RegExpNormalChar] cd -# 57| [RegExpConstant, RegExpNormalChar] b +# 58| [RegExpConstant, RegExpNormalChar] b -# 57| [RegExpConstant, RegExpNormalChar] cd +# 58| [RegExpConstant, RegExpNormalChar] cd -# 57| [RegExpConstant, RegExpNormalChar] e +# 58| [RegExpConstant, RegExpNormalChar] e -# 58| [RegExpGroup] (?::+) +# 59| [RegExpGroup] (?::+) #-----| 0 -> [RegExpPlus] :+ -# 58| [RegExpSequence] (?::+)\w +# 59| [RegExpSequence] (?::+)\w #-----| 0 -> [RegExpGroup] (?::+) #-----| 1 -> [RegExpCharacterClassEscape] \w -# 58| [RegExpConstant, RegExpNormalChar] : +# 59| [RegExpConstant, RegExpNormalChar] : -# 58| [RegExpPlus] :+ +# 59| [RegExpPlus] :+ #-----| 0 -> [RegExpConstant, RegExpNormalChar] : -# 58| [RegExpCharacterClassEscape] \w +# 59| [RegExpCharacterClassEscape] \w -# 61| [RegExpGroup] (a+) +# 62| [RegExpGroup] (a+) #-----| 0 -> [RegExpPlus] a+ -# 61| [RegExpSequence] (a+)b+\1 +# 62| [RegExpSequence] (a+)b+\1 #-----| 0 -> [RegExpGroup] (a+) #-----| 1 -> [RegExpPlus] b+ #-----| 2 -> [RegExpBackRef] \1 -# 61| [RegExpConstant, RegExpNormalChar] a +# 62| [RegExpConstant, RegExpNormalChar] a -# 61| [RegExpPlus] a+ +# 62| [RegExpPlus] a+ #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 61| [RegExpConstant, RegExpNormalChar] b +# 62| [RegExpConstant, RegExpNormalChar] b -# 61| [RegExpPlus] b+ +# 62| [RegExpPlus] b+ #-----| 0 -> [RegExpConstant, RegExpNormalChar] b -# 61| [RegExpBackRef] \1 +# 62| [RegExpBackRef] \1 -# 64| [RegExpCharacterClass] [[:alnum:]] +# 65| [RegExpCharacterClass] [[:alnum:]] #-----| 0 -> [RegExpNamedCharacterProperty] [:alnum:] -# 64| [RegExpStar] [[:alnum:]]* +# 65| [RegExpStar] [[:alnum:]]* #-----| 0 -> [RegExpCharacterClass] [[:alnum:]] -# 64| [RegExpNamedCharacterProperty] [:alnum:] +# 65| [RegExpNamedCharacterProperty] [:alnum:] -# 65| [RegExpCharacterClass] [[:digit:]] +# 66| [RegExpCharacterClass] [[:digit:]] #-----| 0 -> [RegExpNamedCharacterProperty] [:digit:] -# 65| [RegExpPlus] [[:digit:]]+ +# 66| [RegExpPlus] [[:digit:]]+ #-----| 0 -> [RegExpCharacterClass] [[:digit:]] -# 65| [RegExpNamedCharacterProperty] [:digit:] +# 66| [RegExpNamedCharacterProperty] [:digit:] -# 66| [RegExpCharacterClass] [[:alnum:]] +# 67| [RegExpCharacterClass] [[:alnum:]] #-----| 0 -> [RegExpNamedCharacterProperty] [:alnum:] -# 66| [RegExpRange] [[:alnum:]]{2,3} +# 67| [RegExpRange] [[:alnum:]]{2,3} #-----| 0 -> [RegExpCharacterClass] [[:alnum:]] -# 66| [RegExpNamedCharacterProperty] [:alnum:] +# 67| [RegExpNamedCharacterProperty] [:alnum:] -# 67| [RegExpCharacterClass] [a-f[:digit:]] +# 68| [RegExpCharacterClass] [a-f[:digit:]] #-----| 0 -> [RegExpCharacterRange] a-f #-----| 1 -> [RegExpNamedCharacterProperty] [:digit:] -# 67| [RegExpPlus] [a-f[:digit:]]+ +# 68| [RegExpPlus] [a-f[:digit:]]+ #-----| 0 -> [RegExpCharacterClass] [a-f[:digit:]] -# 67| [RegExpConstant, RegExpNormalChar] a +# 68| [RegExpConstant, RegExpNormalChar] a -# 67| [RegExpCharacterRange] a-f +# 68| [RegExpCharacterRange] a-f #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] f -# 67| [RegExpConstant, RegExpNormalChar] f +# 68| [RegExpConstant, RegExpNormalChar] f -# 67| [RegExpNamedCharacterProperty] [:digit:] +# 68| [RegExpNamedCharacterProperty] [:digit:] -# 70| [RegExpCharacterClass] [[:alpha:]] +# 71| [RegExpCharacterClass] [[:alpha:]] #-----| 0 -> [RegExpNamedCharacterProperty] [:alpha:] -# 70| [RegExpSequence] [[:alpha:]][[:digit:]] +# 71| [RegExpSequence] [[:alpha:]][[:digit:]] #-----| 0 -> [RegExpCharacterClass] [[:alpha:]] #-----| 1 -> [RegExpCharacterClass] [[:digit:]] -# 70| [RegExpNamedCharacterProperty] [:alpha:] +# 71| [RegExpNamedCharacterProperty] [:alpha:] -# 70| [RegExpCharacterClass] [[:digit:]] +# 71| [RegExpCharacterClass] [[:digit:]] #-----| 0 -> [RegExpNamedCharacterProperty] [:digit:] -# 70| [RegExpNamedCharacterProperty] [:digit:] +# 71| [RegExpNamedCharacterProperty] [:digit:] -# 73| [RegExpCharacterClass] [[:alpha:][:digit:]] +# 74| [RegExpCharacterClass] [[:alpha:][:digit:]] #-----| 0 -> [RegExpNamedCharacterProperty] [:alpha:] #-----| 1 -> [RegExpNamedCharacterProperty] [:digit:] -# 73| [RegExpNamedCharacterProperty] [:alpha:] +# 74| [RegExpNamedCharacterProperty] [:alpha:] -# 73| [RegExpNamedCharacterProperty] [:digit:] +# 74| [RegExpNamedCharacterProperty] [:digit:] -# 76| [RegExpCharacterClass] [A-F[:digit:]a-f] +# 77| [RegExpCharacterClass] [A-F[:digit:]a-f] #-----| 0 -> [RegExpCharacterRange] A-F #-----| 1 -> [RegExpNamedCharacterProperty] [:digit:] #-----| 2 -> [RegExpCharacterRange] a-f -# 76| [RegExpConstant, RegExpNormalChar] A +# 77| [RegExpConstant, RegExpNormalChar] A -# 76| [RegExpCharacterRange] A-F +# 77| [RegExpCharacterRange] A-F #-----| 0 -> [RegExpConstant, RegExpNormalChar] A #-----| 1 -> [RegExpConstant, RegExpNormalChar] F -# 76| [RegExpConstant, RegExpNormalChar] F +# 77| [RegExpConstant, RegExpNormalChar] F -# 76| [RegExpNamedCharacterProperty] [:digit:] +# 77| [RegExpNamedCharacterProperty] [:digit:] -# 76| [RegExpConstant, RegExpNormalChar] a +# 77| [RegExpConstant, RegExpNormalChar] a -# 76| [RegExpCharacterRange] a-f +# 77| [RegExpCharacterRange] a-f #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] f -# 76| [RegExpConstant, RegExpNormalChar] f +# 77| [RegExpConstant, RegExpNormalChar] f -# 79| [RegExpCharacterClass] [[.a.]] +# 80| [RegExpCharacterClass] [[.a.]] #-----| 0 -> [RegExpNamedCharacterProperty] [.a.] -# 79| [RegExpNamedCharacterProperty] [.a.] +# 80| [RegExpNamedCharacterProperty] [.a.] -# 80| [RegExpCharacterClass] [A-F[.b.]a-f] +# 81| [RegExpCharacterClass] [A-F[.b.]a-f] #-----| 0 -> [RegExpCharacterRange] A-F #-----| 1 -> [RegExpNamedCharacterProperty] [.b.] #-----| 2 -> [RegExpCharacterRange] a-f -# 80| [RegExpConstant, RegExpNormalChar] A +# 81| [RegExpConstant, RegExpNormalChar] A -# 80| [RegExpCharacterRange] A-F +# 81| [RegExpCharacterRange] A-F #-----| 0 -> [RegExpConstant, RegExpNormalChar] A #-----| 1 -> [RegExpConstant, RegExpNormalChar] F -# 80| [RegExpConstant, RegExpNormalChar] F +# 81| [RegExpConstant, RegExpNormalChar] F -# 80| [RegExpNamedCharacterProperty] [.b.] +# 81| [RegExpNamedCharacterProperty] [.b.] -# 80| [RegExpConstant, RegExpNormalChar] a +# 81| [RegExpConstant, RegExpNormalChar] a -# 80| [RegExpCharacterRange] a-f +# 81| [RegExpCharacterRange] a-f #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] f -# 80| [RegExpConstant, RegExpNormalChar] f +# 81| [RegExpConstant, RegExpNormalChar] f -# 83| [RegExpCharacterClass] [[=a=]] +# 84| [RegExpCharacterClass] [[=a=]] #-----| 0 -> [RegExpNamedCharacterProperty] [=a=] -# 83| [RegExpNamedCharacterProperty] [=a=] +# 84| [RegExpNamedCharacterProperty] [=a=] -# 84| [RegExpCharacterClass] [A-F[=b=]a-f] +# 85| [RegExpCharacterClass] [A-F[=b=]a-f] #-----| 0 -> [RegExpCharacterRange] A-F #-----| 1 -> [RegExpNamedCharacterProperty] [=b=] #-----| 2 -> [RegExpCharacterRange] a-f -# 84| [RegExpConstant, RegExpNormalChar] A +# 85| [RegExpConstant, RegExpNormalChar] A -# 84| [RegExpCharacterRange] A-F +# 85| [RegExpCharacterRange] A-F #-----| 0 -> [RegExpConstant, RegExpNormalChar] A #-----| 1 -> [RegExpConstant, RegExpNormalChar] F -# 84| [RegExpConstant, RegExpNormalChar] F +# 85| [RegExpConstant, RegExpNormalChar] F -# 84| [RegExpNamedCharacterProperty] [=b=] +# 85| [RegExpNamedCharacterProperty] [=b=] -# 84| [RegExpConstant, RegExpNormalChar] a +# 85| [RegExpConstant, RegExpNormalChar] a -# 84| [RegExpCharacterRange] a-f +# 85| [RegExpCharacterRange] a-f #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] f -# 84| [RegExpConstant, RegExpNormalChar] f +# 85| [RegExpConstant, RegExpNormalChar] f -# 87| [RegExpNamedCharacterProperty] [:digit:] +# 88| [RegExpNamedCharacterProperty] [:digit:] -# 90| [RegExpConstant, RegExpEscape] \u0061 +# 91| [RegExpConstant, RegExpEscape] \u0061 -# 93| [RegExpConstant, RegExpEscape] \x61 +# 94| [RegExpConstant, RegExpEscape] \x61 -# 96| [RegExpConstant, RegExpEscape] \cA +# 97| [RegExpConstant, RegExpEscape] \cA -# 97| [RegExpCharacterClass] [\cz] +# 98| [RegExpCharacterClass] [\cz] #-----| 0 -> [RegExpConstant, RegExpEscape] \cz -# 97| [RegExpConstant, RegExpEscape] \cz +# 98| [RegExpConstant, RegExpEscape] \cz -# 100| [RegExpConstant, RegExpEscape] \0 +# 101| [RegExpConstant, RegExpEscape] \0 -# 101| [RegExpCharacterClass] [\0] +# 102| [RegExpCharacterClass] [\0] #-----| 0 -> [RegExpConstant, RegExpEscape] \0 -# 101| [RegExpConstant, RegExpEscape] \0 +# 102| [RegExpConstant, RegExpEscape] \0 -# 104| [RegExpConstant, RegExpNormalChar] a +# 105| [RegExpConstant, RegExpNormalChar] a -# 104| [RegExpStar] a*? +# 105| [RegExpStar] a*? #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 105| [RegExpConstant, RegExpNormalChar] b +# 106| [RegExpConstant, RegExpNormalChar] b -# 105| [RegExpPlus] b+? +# 106| [RegExpPlus] b+? #-----| 0 -> [RegExpConstant, RegExpNormalChar] b -# 106| [RegExpConstant, RegExpNormalChar] c +# 107| [RegExpConstant, RegExpNormalChar] c -# 106| [RegExpOpt] c?? +# 107| [RegExpOpt] c?? #-----| 0 -> [RegExpConstant, RegExpNormalChar] c -# 107| [RegExpConstant, RegExpNormalChar] d +# 108| [RegExpConstant, RegExpNormalChar] d -# 107| [RegExpQuantifier] d{2,3}? +# 108| [RegExpQuantifier] d{2,3}? #-----| 0 -> [RegExpConstant, RegExpNormalChar] d -# 108| [RegExpConstant, RegExpEscape] \f +# 109| [RegExpConstant, RegExpEscape] \f -# 108| [RegExpSequence] \f\v +# 109| [RegExpSequence] \f\v #-----| 0 -> [RegExpConstant, RegExpEscape] \f #-----| 1 -> [RegExpConstant, RegExpEscape] \v -# 108| [RegExpConstant, RegExpEscape] \v - -# 111| [RegExpConstant, RegExpNormalChar] a - -# 111| [RegExpSequence] a\nb -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] b - -# 111| [RegExpConstant, RegExpEscape] \n - -# 111| [RegExpConstant, RegExpNormalChar] b +# 109| [RegExpConstant, RegExpEscape] \v # 112| [RegExpConstant, RegExpNormalChar] a -# 112| [RegExpSequence] a\nc +# 112| [RegExpSequence] a\nb #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c +#-----| 2 -> [RegExpConstant, RegExpNormalChar] b # 112| [RegExpConstant, RegExpEscape] \n -# 112| [RegExpConstant, RegExpNormalChar] c +# 112| [RegExpConstant, RegExpNormalChar] b # 113| [RegExpConstant, RegExpNormalChar] a @@ -637,3 +626,14 @@ regexp.cpp: # 122| [RegExpConstant, RegExpEscape] \n # 122| [RegExpConstant, RegExpNormalChar] c + +# 123| [RegExpConstant, RegExpNormalChar] a + +# 123| [RegExpSequence] a\nc +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpEscape] \n +#-----| 2 -> [RegExpConstant, RegExpNormalChar] c + +# 123| [RegExpConstant, RegExpEscape] \n + +# 123| [RegExpConstant, RegExpNormalChar] c diff --git a/cpp/ql/test/library-tests/regex/rawstringliteral.expected b/cpp/ql/test/library-tests/regex/rawstringliteral.expected index 87cae28fef0a..d156030b74de 100644 --- a/cpp/ql/test/library-tests/regex/rawstringliteral.expected +++ b/cpp/ql/test/library-tests/regex/rawstringliteral.expected @@ -1,7 +1,7 @@ -| regexp.cpp:116:20:116:28 | a\\nc | -| regexp.cpp:117:36:117:45 | a\\nc | -| regexp.cpp:118:37:118:47 | a\\nc | -| regexp.cpp:119:37:119:46 | a\\nc | +| regexp.cpp:117:20:117:28 | a\\nc | +| regexp.cpp:118:22:118:31 | a\\nc | +| regexp.cpp:119:37:119:47 | a\\nc | | regexp.cpp:120:37:120:46 | a\\nc | -| regexp.cpp:121:21:121:31 | a\\nc | -| regexp.cpp:122:23:122:37 | a\\nc | +| regexp.cpp:121:37:121:46 | a\\nc | +| regexp.cpp:122:21:122:31 | a\\nc | +| regexp.cpp:123:23:123:37 | a\\nc | diff --git a/cpp/ql/test/library-tests/regex/regexp.cpp b/cpp/ql/test/library-tests/regex/regexp.cpp index 3dbf50ff1a88..3845651aa93e 100644 --- a/cpp/ql/test/library-tests/regex/regexp.cpp +++ b/cpp/ql/test/library-tests/regex/regexp.cpp @@ -9,6 +9,7 @@ namespace std { basic_regex &assign(const CharT *s) { return *this; } }; typedef basic_regex regex; + typedef basic_regex wregex; } // namespace std // Empty @@ -114,7 +115,7 @@ std::basic_regex r_loc_u8(u8"a\\nc"); std::basic_regex r_loc_u(u"a\\nc"); std::basic_regex r_loc_U(U"a\\nc"); std::regex r_loc_R(R"(a\nc)"); -std::basic_regex r_loc_LR(LR"(a\nc)"); +std::wregex r_loc_LR(LR"(a\nc)"); std::basic_regex r_loc_u8R(u8R"(a\nc)"); std::basic_regex r_loc_uR(uR"(a\nc)"); std::basic_regex r_loc_UR(UR"(a\nc)"); diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index 6e7a4cfc7204..93c27b321de4 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -1,364 +1,364 @@ groupNumber -| regexp.cpp:55:20:55:24 | (foo) | 1 | -| regexp.cpp:56:22:56:26 | (o\|b) | 1 | -| regexp.cpp:57:20:57:27 | (a\|b\|cd) | 1 | -| regexp.cpp:61:21:61:24 | (a+) | 1 | +| regexp.cpp:56:20:56:24 | (foo) | 1 | +| regexp.cpp:57:22:57:26 | (o\|b) | 1 | +| regexp.cpp:58:20:58:27 | (a\|b\|cd) | 1 | +| regexp.cpp:62:21:62:24 | (a+) | 1 | term -| regexp.cpp:18:19:18:21 | abc | RegExpConstant,RegExpNormalChar | -| regexp.cpp:21:20:21:20 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:21:20:21:21 | a* | RegExpStar | -| regexp.cpp:21:20:21:26 | a*b+c?d | RegExpSequence | -| regexp.cpp:21:22:21:22 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:21:22:21:23 | b+ | RegExpPlus | -| regexp.cpp:21:24:21:24 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:21:24:21:25 | c? | RegExpOpt | -| regexp.cpp:21:26:21:26 | d | RegExpConstant,RegExpNormalChar | +| regexp.cpp:19:19:19:21 | abc | RegExpConstant,RegExpNormalChar | | regexp.cpp:22:20:22:20 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:22:20:22:25 | a{4,8} | RegExpRange | +| regexp.cpp:22:20:22:21 | a* | RegExpStar | +| regexp.cpp:22:20:22:26 | a*b+c?d | RegExpSequence | +| regexp.cpp:22:22:22:22 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:22:22:22:23 | b+ | RegExpPlus | +| regexp.cpp:22:24:22:24 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:22:24:22:25 | c? | RegExpOpt | +| regexp.cpp:22:26:22:26 | d | RegExpConstant,RegExpNormalChar | | regexp.cpp:23:20:23:20 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:23:20:23:24 | a{3,} | InfiniteRepetitionQuantifier,RegExpRange | +| regexp.cpp:23:20:23:25 | a{4,8} | RegExpRange | | regexp.cpp:24:20:24:20 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:24:20:24:23 | a{7} | RegExpRange | -| regexp.cpp:27:19:27:21 | foo | RegExpConstant,RegExpNormalChar | -| regexp.cpp:27:19:27:25 | foo\|bar | RegExpAlt | -| regexp.cpp:27:23:27:25 | bar | RegExpConstant,RegExpNormalChar | -| regexp.cpp:30:19:30:23 | [abc] | RegExpCharacterClass | -| regexp.cpp:30:20:30:20 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:30:21:30:21 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:30:22:30:22 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:31:19:31:30 | [a-fA-F0-9_] | RegExpCharacterClass | +| regexp.cpp:24:20:24:24 | a{3,} | InfiniteRepetitionQuantifier,RegExpRange | +| regexp.cpp:25:20:25:20 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:25:20:25:23 | a{7} | RegExpRange | +| regexp.cpp:28:19:28:21 | foo | RegExpConstant,RegExpNormalChar | +| regexp.cpp:28:19:28:25 | foo\|bar | RegExpAlt | +| regexp.cpp:28:23:28:25 | bar | RegExpConstant,RegExpNormalChar | +| regexp.cpp:31:19:31:23 | [abc] | RegExpCharacterClass | | regexp.cpp:31:20:31:20 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:31:20:31:22 | a-f | RegExpCharacterRange | -| regexp.cpp:31:22:31:22 | f | RegExpConstant,RegExpNormalChar | -| regexp.cpp:31:23:31:23 | A | RegExpConstant,RegExpNormalChar | -| regexp.cpp:31:23:31:25 | A-F | RegExpCharacterRange | -| regexp.cpp:31:25:31:25 | F | RegExpConstant,RegExpNormalChar | -| regexp.cpp:31:26:31:26 | 0 | RegExpConstant,RegExpNormalChar | -| regexp.cpp:31:26:31:28 | 0-9 | RegExpCharacterRange | -| regexp.cpp:31:28:31:28 | 9 | RegExpConstant,RegExpNormalChar | -| regexp.cpp:31:29:31:29 | _ | RegExpConstant,RegExpNormalChar | -| regexp.cpp:32:19:32:22 | [\\w] | RegExpCharacterClass | -| regexp.cpp:32:19:32:23 | [\\w]+ | RegExpPlus | -| regexp.cpp:32:20:32:21 | \\w | RegExpCharacterClassEscape | -| regexp.cpp:33:19:33:20 | \\[ | RegExpConstant,RegExpEscape | -| regexp.cpp:33:19:33:27 | \\[\\][123] | RegExpSequence | -| regexp.cpp:33:21:33:22 | \\] | RegExpConstant,RegExpEscape | -| regexp.cpp:33:23:33:27 | [123] | RegExpCharacterClass | -| regexp.cpp:33:24:33:24 | 1 | RegExpConstant,RegExpNormalChar | -| regexp.cpp:33:25:33:25 | 2 | RegExpConstant,RegExpNormalChar | -| regexp.cpp:33:26:33:26 | 3 | RegExpConstant,RegExpNormalChar | -| regexp.cpp:34:19:34:24 | [^A-Z] | RegExpCharacterClass | -| regexp.cpp:34:21:34:21 | A | RegExpConstant,RegExpNormalChar | -| regexp.cpp:34:21:34:23 | A-Z | RegExpCharacterRange | -| regexp.cpp:34:23:34:23 | Z | RegExpConstant,RegExpNormalChar | -| regexp.cpp:35:19:35:21 | []] | RegExpCharacterClass | -| regexp.cpp:35:20:35:20 | ] | RegExpConstant,RegExpNormalChar | -| regexp.cpp:36:19:36:22 | [^]] | RegExpCharacterClass | -| regexp.cpp:36:21:36:21 | ] | RegExpConstant,RegExpNormalChar | -| regexp.cpp:37:19:37:22 | [^-] | RegExpCharacterClass | -| regexp.cpp:37:21:37:21 | - | RegExpConstant,RegExpNormalChar | -| regexp.cpp:38:19:38:21 | [\|] | RegExpCharacterClass | -| regexp.cpp:38:20:38:20 | \| | RegExpConstant,RegExpNormalChar | -| regexp.cpp:39:20:39:23 | [\\b] | RegExpCharacterClass | -| regexp.cpp:39:21:39:22 | \\b | RegExpConstant,RegExpEscape | -| regexp.cpp:42:22:42:27 | [[a-f] | RegExpCharacterClass | -| regexp.cpp:42:22:42:31 | [[a-f]A-F] | RegExpSequence | -| regexp.cpp:42:23:42:23 | [ | RegExpConstant,RegExpNormalChar | -| regexp.cpp:42:24:42:24 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:42:24:42:26 | a-f | RegExpCharacterRange | -| regexp.cpp:42:26:42:26 | f | RegExpConstant,RegExpNormalChar | -| regexp.cpp:42:28:42:31 | A-F] | RegExpConstant,RegExpNormalChar | -| regexp.cpp:45:21:45:21 | . | RegExpDot | -| regexp.cpp:45:21:45:22 | .* | RegExpStar | -| regexp.cpp:46:21:46:22 | \\w | RegExpCharacterClassEscape | -| regexp.cpp:46:21:46:23 | \\w+ | RegExpPlus | -| regexp.cpp:46:21:46:25 | \\w+\\W | RegExpSequence | -| regexp.cpp:46:24:46:25 | \\W | RegExpCharacterClassEscape | -| regexp.cpp:47:21:47:22 | \\s | RegExpCharacterClassEscape | -| regexp.cpp:47:21:47:24 | \\s\\S | RegExpSequence | -| regexp.cpp:47:23:47:24 | \\S | RegExpCharacterClassEscape | -| regexp.cpp:48:21:48:22 | \\d | RegExpCharacterClassEscape | -| regexp.cpp:48:21:48:24 | \\d\\D | RegExpSequence | -| regexp.cpp:48:23:48:24 | \\D | RegExpCharacterClassEscape | -| regexp.cpp:49:21:49:22 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:49:21:49:26 | \\n\\r\\t | RegExpSequence | -| regexp.cpp:49:23:49:24 | \\r | RegExpConstant,RegExpEscape | -| regexp.cpp:49:25:49:26 | \\t | RegExpConstant,RegExpEscape | -| regexp.cpp:52:20:52:21 | \\b | RegExpSpecialChar | -| regexp.cpp:52:20:52:25 | \\b!a\\B | RegExpSequence | -| regexp.cpp:52:22:52:23 | !a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:52:24:52:25 | \\B | RegExpNonWordBoundary | -| regexp.cpp:55:20:55:24 | (foo) | RegExpGroup | -| regexp.cpp:55:20:55:25 | (foo)* | RegExpStar | -| regexp.cpp:55:20:55:28 | (foo)*bar | RegExpSequence | -| regexp.cpp:55:21:55:23 | foo | RegExpConstant,RegExpNormalChar | -| regexp.cpp:55:26:55:28 | bar | RegExpConstant,RegExpNormalChar | -| regexp.cpp:56:20:56:21 | fo | RegExpConstant,RegExpNormalChar | -| regexp.cpp:56:20:56:28 | fo(o\|b)ar | RegExpSequence | -| regexp.cpp:56:22:56:26 | (o\|b) | RegExpGroup | -| regexp.cpp:56:23:56:23 | o | RegExpConstant,RegExpNormalChar | -| regexp.cpp:56:23:56:25 | o\|b | RegExpAlt | -| regexp.cpp:56:25:56:25 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:56:27:56:28 | ar | RegExpConstant,RegExpNormalChar | -| regexp.cpp:57:20:57:27 | (a\|b\|cd) | RegExpGroup | -| regexp.cpp:57:20:57:28 | (a\|b\|cd)e | RegExpSequence | -| regexp.cpp:57:21:57:21 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:57:21:57:26 | a\|b\|cd | RegExpAlt | -| regexp.cpp:57:23:57:23 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:57:25:57:26 | cd | RegExpConstant,RegExpNormalChar | -| regexp.cpp:57:28:57:28 | e | RegExpConstant,RegExpNormalChar | -| regexp.cpp:58:20:58:25 | (?::+) | RegExpGroup | -| regexp.cpp:58:20:58:27 | (?::+)\\w | RegExpSequence | -| regexp.cpp:58:23:58:23 | : | RegExpConstant,RegExpNormalChar | -| regexp.cpp:58:23:58:24 | :+ | RegExpPlus | -| regexp.cpp:58:26:58:27 | \\w | RegExpCharacterClassEscape | -| regexp.cpp:61:21:61:24 | (a+) | RegExpGroup | -| regexp.cpp:61:21:61:28 | (a+)b+\\1 | RegExpSequence | -| regexp.cpp:61:22:61:22 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:61:22:61:23 | a+ | RegExpPlus | -| regexp.cpp:61:25:61:25 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:61:25:61:26 | b+ | RegExpPlus | -| regexp.cpp:61:27:61:28 | \\1 | RegExpBackRef | -| regexp.cpp:64:21:64:31 | [[:alnum:]] | RegExpCharacterClass | -| regexp.cpp:64:21:64:32 | [[:alnum:]]* | RegExpStar | -| regexp.cpp:64:22:64:30 | [:alnum:] | RegExpNamedCharacterProperty | -| regexp.cpp:65:21:65:31 | [[:digit:]] | RegExpCharacterClass | -| regexp.cpp:65:21:65:32 | [[:digit:]]+ | RegExpPlus | -| regexp.cpp:65:22:65:30 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.cpp:66:21:66:31 | [[:alnum:]] | RegExpCharacterClass | -| regexp.cpp:66:21:66:36 | [[:alnum:]]{2,3} | RegExpRange | -| regexp.cpp:66:22:66:30 | [:alnum:] | RegExpNamedCharacterProperty | -| regexp.cpp:67:21:67:34 | [a-f[:digit:]] | RegExpCharacterClass | -| regexp.cpp:67:21:67:35 | [a-f[:digit:]]+ | RegExpPlus | -| regexp.cpp:67:22:67:22 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:67:22:67:24 | a-f | RegExpCharacterRange | -| regexp.cpp:67:24:67:24 | f | RegExpConstant,RegExpNormalChar | -| regexp.cpp:67:25:67:33 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.cpp:70:22:70:32 | [[:alpha:]] | RegExpCharacterClass | -| regexp.cpp:70:22:70:43 | [[:alpha:]][[:digit:]] | RegExpSequence | -| regexp.cpp:70:23:70:31 | [:alpha:] | RegExpNamedCharacterProperty | -| regexp.cpp:70:33:70:43 | [[:digit:]] | RegExpCharacterClass | -| regexp.cpp:70:34:70:42 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.cpp:73:22:73:41 | [[:alpha:][:digit:]] | RegExpCharacterClass | -| regexp.cpp:73:23:73:31 | [:alpha:] | RegExpNamedCharacterProperty | -| regexp.cpp:73:32:73:40 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.cpp:76:22:76:38 | [A-F[:digit:]a-f] | RegExpCharacterClass | -| regexp.cpp:76:23:76:23 | A | RegExpConstant,RegExpNormalChar | -| regexp.cpp:76:23:76:25 | A-F | RegExpCharacterRange | -| regexp.cpp:76:25:76:25 | F | RegExpConstant,RegExpNormalChar | -| regexp.cpp:76:26:76:34 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.cpp:76:35:76:35 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:76:35:76:37 | a-f | RegExpCharacterRange | -| regexp.cpp:76:37:76:37 | f | RegExpConstant,RegExpNormalChar | -| regexp.cpp:79:27:79:33 | [[.a.]] | RegExpCharacterClass | -| regexp.cpp:79:28:79:32 | [.a.] | RegExpNamedCharacterProperty | -| regexp.cpp:80:27:80:39 | [A-F[.b.]a-f] | RegExpCharacterClass | -| regexp.cpp:80:28:80:28 | A | RegExpConstant,RegExpNormalChar | -| regexp.cpp:80:28:80:30 | A-F | RegExpCharacterRange | -| regexp.cpp:80:30:80:30 | F | RegExpConstant,RegExpNormalChar | -| regexp.cpp:80:31:80:35 | [.b.] | RegExpNamedCharacterProperty | -| regexp.cpp:80:36:80:36 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:80:36:80:38 | a-f | RegExpCharacterRange | -| regexp.cpp:80:38:80:38 | f | RegExpConstant,RegExpNormalChar | -| regexp.cpp:83:28:83:34 | [[=a=]] | RegExpCharacterClass | -| regexp.cpp:83:29:83:33 | [=a=] | RegExpNamedCharacterProperty | -| regexp.cpp:84:28:84:40 | [A-F[=b=]a-f] | RegExpCharacterClass | -| regexp.cpp:84:29:84:29 | A | RegExpConstant,RegExpNormalChar | -| regexp.cpp:84:29:84:31 | A-F | RegExpCharacterRange | -| regexp.cpp:84:31:84:31 | F | RegExpConstant,RegExpNormalChar | -| regexp.cpp:84:32:84:36 | [=b=] | RegExpNamedCharacterProperty | -| regexp.cpp:84:37:84:37 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:84:37:84:39 | a-f | RegExpCharacterRange | -| regexp.cpp:84:39:84:39 | f | RegExpConstant,RegExpNormalChar | -| regexp.cpp:87:22:87:30 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.cpp:90:19:90:24 | \\u0061 | RegExpConstant,RegExpEscape | -| regexp.cpp:93:19:93:22 | \\x61 | RegExpConstant,RegExpEscape | -| regexp.cpp:96:21:96:23 | \\cA | RegExpConstant,RegExpEscape | -| regexp.cpp:97:21:97:25 | [\\cz] | RegExpCharacterClass | -| regexp.cpp:97:22:97:24 | \\cz | RegExpConstant,RegExpEscape | -| regexp.cpp:100:20:100:21 | \\0 | RegExpConstant,RegExpEscape | -| regexp.cpp:101:20:101:23 | [\\0] | RegExpCharacterClass | -| regexp.cpp:101:21:101:22 | \\0 | RegExpConstant,RegExpEscape | -| regexp.cpp:104:21:104:21 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:104:21:104:23 | a*? | RegExpStar | -| regexp.cpp:105:21:105:21 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:105:21:105:23 | b+? | RegExpPlus | -| regexp.cpp:106:21:106:21 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:106:21:106:23 | c?? | RegExpOpt | -| regexp.cpp:107:21:107:21 | d | RegExpConstant,RegExpNormalChar | -| regexp.cpp:107:21:107:27 | d{2,3}? | RegExpQuantifier | -| regexp.cpp:108:18:108:19 | \\f | RegExpConstant,RegExpEscape | -| regexp.cpp:108:18:108:21 | \\f\\v | RegExpSequence | -| regexp.cpp:108:20:108:21 | \\v | RegExpConstant,RegExpEscape | -| regexp.cpp:111:25:111:25 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:111:25:111:28 | a\\nb | RegExpSequence | -| regexp.cpp:111:26:111:27 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:111:28:111:28 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:112:37:112:37 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:112:37:112:40 | a\\nc | RegExpSequence | -| regexp.cpp:112:38:112:39 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:112:40:112:40 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:113:39:113:39 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:113:39:113:42 | a\\nc | RegExpSequence | -| regexp.cpp:113:40:113:41 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:113:42:113:42 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:114:38:114:38 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:114:38:114:41 | a\\nc | RegExpSequence | -| regexp.cpp:114:39:114:40 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:114:41:114:41 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:31:21:31:21 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:31:22:31:22 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:32:19:32:30 | [a-fA-F0-9_] | RegExpCharacterClass | +| regexp.cpp:32:20:32:20 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:32:20:32:22 | a-f | RegExpCharacterRange | +| regexp.cpp:32:22:32:22 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:32:23:32:23 | A | RegExpConstant,RegExpNormalChar | +| regexp.cpp:32:23:32:25 | A-F | RegExpCharacterRange | +| regexp.cpp:32:25:32:25 | F | RegExpConstant,RegExpNormalChar | +| regexp.cpp:32:26:32:26 | 0 | RegExpConstant,RegExpNormalChar | +| regexp.cpp:32:26:32:28 | 0-9 | RegExpCharacterRange | +| regexp.cpp:32:28:32:28 | 9 | RegExpConstant,RegExpNormalChar | +| regexp.cpp:32:29:32:29 | _ | RegExpConstant,RegExpNormalChar | +| regexp.cpp:33:19:33:22 | [\\w] | RegExpCharacterClass | +| regexp.cpp:33:19:33:23 | [\\w]+ | RegExpPlus | +| regexp.cpp:33:20:33:21 | \\w | RegExpCharacterClassEscape | +| regexp.cpp:34:19:34:20 | \\[ | RegExpConstant,RegExpEscape | +| regexp.cpp:34:19:34:27 | \\[\\][123] | RegExpSequence | +| regexp.cpp:34:21:34:22 | \\] | RegExpConstant,RegExpEscape | +| regexp.cpp:34:23:34:27 | [123] | RegExpCharacterClass | +| regexp.cpp:34:24:34:24 | 1 | RegExpConstant,RegExpNormalChar | +| regexp.cpp:34:25:34:25 | 2 | RegExpConstant,RegExpNormalChar | +| regexp.cpp:34:26:34:26 | 3 | RegExpConstant,RegExpNormalChar | +| regexp.cpp:35:19:35:24 | [^A-Z] | RegExpCharacterClass | +| regexp.cpp:35:21:35:21 | A | RegExpConstant,RegExpNormalChar | +| regexp.cpp:35:21:35:23 | A-Z | RegExpCharacterRange | +| regexp.cpp:35:23:35:23 | Z | RegExpConstant,RegExpNormalChar | +| regexp.cpp:36:19:36:21 | []] | RegExpCharacterClass | +| regexp.cpp:36:20:36:20 | ] | RegExpConstant,RegExpNormalChar | +| regexp.cpp:37:19:37:22 | [^]] | RegExpCharacterClass | +| regexp.cpp:37:21:37:21 | ] | RegExpConstant,RegExpNormalChar | +| regexp.cpp:38:19:38:22 | [^-] | RegExpCharacterClass | +| regexp.cpp:38:21:38:21 | - | RegExpConstant,RegExpNormalChar | +| regexp.cpp:39:19:39:21 | [\|] | RegExpCharacterClass | +| regexp.cpp:39:20:39:20 | \| | RegExpConstant,RegExpNormalChar | +| regexp.cpp:40:20:40:23 | [\\b] | RegExpCharacterClass | +| regexp.cpp:40:21:40:22 | \\b | RegExpConstant,RegExpEscape | +| regexp.cpp:43:22:43:27 | [[a-f] | RegExpCharacterClass | +| regexp.cpp:43:22:43:31 | [[a-f]A-F] | RegExpSequence | +| regexp.cpp:43:23:43:23 | [ | RegExpConstant,RegExpNormalChar | +| regexp.cpp:43:24:43:24 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:43:24:43:26 | a-f | RegExpCharacterRange | +| regexp.cpp:43:26:43:26 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:43:28:43:31 | A-F] | RegExpConstant,RegExpNormalChar | +| regexp.cpp:46:21:46:21 | . | RegExpDot | +| regexp.cpp:46:21:46:22 | .* | RegExpStar | +| regexp.cpp:47:21:47:22 | \\w | RegExpCharacterClassEscape | +| regexp.cpp:47:21:47:23 | \\w+ | RegExpPlus | +| regexp.cpp:47:21:47:25 | \\w+\\W | RegExpSequence | +| regexp.cpp:47:24:47:25 | \\W | RegExpCharacterClassEscape | +| regexp.cpp:48:21:48:22 | \\s | RegExpCharacterClassEscape | +| regexp.cpp:48:21:48:24 | \\s\\S | RegExpSequence | +| regexp.cpp:48:23:48:24 | \\S | RegExpCharacterClassEscape | +| regexp.cpp:49:21:49:22 | \\d | RegExpCharacterClassEscape | +| regexp.cpp:49:21:49:24 | \\d\\D | RegExpSequence | +| regexp.cpp:49:23:49:24 | \\D | RegExpCharacterClassEscape | +| regexp.cpp:50:21:50:22 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:50:21:50:26 | \\n\\r\\t | RegExpSequence | +| regexp.cpp:50:23:50:24 | \\r | RegExpConstant,RegExpEscape | +| regexp.cpp:50:25:50:26 | \\t | RegExpConstant,RegExpEscape | +| regexp.cpp:53:20:53:21 | \\b | RegExpSpecialChar | +| regexp.cpp:53:20:53:25 | \\b!a\\B | RegExpSequence | +| regexp.cpp:53:22:53:23 | !a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:53:24:53:25 | \\B | RegExpNonWordBoundary | +| regexp.cpp:56:20:56:24 | (foo) | RegExpGroup | +| regexp.cpp:56:20:56:25 | (foo)* | RegExpStar | +| regexp.cpp:56:20:56:28 | (foo)*bar | RegExpSequence | +| regexp.cpp:56:21:56:23 | foo | RegExpConstant,RegExpNormalChar | +| regexp.cpp:56:26:56:28 | bar | RegExpConstant,RegExpNormalChar | +| regexp.cpp:57:20:57:21 | fo | RegExpConstant,RegExpNormalChar | +| regexp.cpp:57:20:57:28 | fo(o\|b)ar | RegExpSequence | +| regexp.cpp:57:22:57:26 | (o\|b) | RegExpGroup | +| regexp.cpp:57:23:57:23 | o | RegExpConstant,RegExpNormalChar | +| regexp.cpp:57:23:57:25 | o\|b | RegExpAlt | +| regexp.cpp:57:25:57:25 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:57:27:57:28 | ar | RegExpConstant,RegExpNormalChar | +| regexp.cpp:58:20:58:27 | (a\|b\|cd) | RegExpGroup | +| regexp.cpp:58:20:58:28 | (a\|b\|cd)e | RegExpSequence | +| regexp.cpp:58:21:58:21 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:58:21:58:26 | a\|b\|cd | RegExpAlt | +| regexp.cpp:58:23:58:23 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:58:25:58:26 | cd | RegExpConstant,RegExpNormalChar | +| regexp.cpp:58:28:58:28 | e | RegExpConstant,RegExpNormalChar | +| regexp.cpp:59:20:59:25 | (?::+) | RegExpGroup | +| regexp.cpp:59:20:59:27 | (?::+)\\w | RegExpSequence | +| regexp.cpp:59:23:59:23 | : | RegExpConstant,RegExpNormalChar | +| regexp.cpp:59:23:59:24 | :+ | RegExpPlus | +| regexp.cpp:59:26:59:27 | \\w | RegExpCharacterClassEscape | +| regexp.cpp:62:21:62:24 | (a+) | RegExpGroup | +| regexp.cpp:62:21:62:28 | (a+)b+\\1 | RegExpSequence | +| regexp.cpp:62:22:62:22 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:62:22:62:23 | a+ | RegExpPlus | +| regexp.cpp:62:25:62:25 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:62:25:62:26 | b+ | RegExpPlus | +| regexp.cpp:62:27:62:28 | \\1 | RegExpBackRef | +| regexp.cpp:65:21:65:31 | [[:alnum:]] | RegExpCharacterClass | +| regexp.cpp:65:21:65:32 | [[:alnum:]]* | RegExpStar | +| regexp.cpp:65:22:65:30 | [:alnum:] | RegExpNamedCharacterProperty | +| regexp.cpp:66:21:66:31 | [[:digit:]] | RegExpCharacterClass | +| regexp.cpp:66:21:66:32 | [[:digit:]]+ | RegExpPlus | +| regexp.cpp:66:22:66:30 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:67:21:67:31 | [[:alnum:]] | RegExpCharacterClass | +| regexp.cpp:67:21:67:36 | [[:alnum:]]{2,3} | RegExpRange | +| regexp.cpp:67:22:67:30 | [:alnum:] | RegExpNamedCharacterProperty | +| regexp.cpp:68:21:68:34 | [a-f[:digit:]] | RegExpCharacterClass | +| regexp.cpp:68:21:68:35 | [a-f[:digit:]]+ | RegExpPlus | +| regexp.cpp:68:22:68:22 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:68:22:68:24 | a-f | RegExpCharacterRange | +| regexp.cpp:68:24:68:24 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:68:25:68:33 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:71:22:71:32 | [[:alpha:]] | RegExpCharacterClass | +| regexp.cpp:71:22:71:43 | [[:alpha:]][[:digit:]] | RegExpSequence | +| regexp.cpp:71:23:71:31 | [:alpha:] | RegExpNamedCharacterProperty | +| regexp.cpp:71:33:71:43 | [[:digit:]] | RegExpCharacterClass | +| regexp.cpp:71:34:71:42 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:74:22:74:41 | [[:alpha:][:digit:]] | RegExpCharacterClass | +| regexp.cpp:74:23:74:31 | [:alpha:] | RegExpNamedCharacterProperty | +| regexp.cpp:74:32:74:40 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:77:22:77:38 | [A-F[:digit:]a-f] | RegExpCharacterClass | +| regexp.cpp:77:23:77:23 | A | RegExpConstant,RegExpNormalChar | +| regexp.cpp:77:23:77:25 | A-F | RegExpCharacterRange | +| regexp.cpp:77:25:77:25 | F | RegExpConstant,RegExpNormalChar | +| regexp.cpp:77:26:77:34 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:77:35:77:35 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:77:35:77:37 | a-f | RegExpCharacterRange | +| regexp.cpp:77:37:77:37 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:80:27:80:33 | [[.a.]] | RegExpCharacterClass | +| regexp.cpp:80:28:80:32 | [.a.] | RegExpNamedCharacterProperty | +| regexp.cpp:81:27:81:39 | [A-F[.b.]a-f] | RegExpCharacterClass | +| regexp.cpp:81:28:81:28 | A | RegExpConstant,RegExpNormalChar | +| regexp.cpp:81:28:81:30 | A-F | RegExpCharacterRange | +| regexp.cpp:81:30:81:30 | F | RegExpConstant,RegExpNormalChar | +| regexp.cpp:81:31:81:35 | [.b.] | RegExpNamedCharacterProperty | +| regexp.cpp:81:36:81:36 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:81:36:81:38 | a-f | RegExpCharacterRange | +| regexp.cpp:81:38:81:38 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:84:28:84:34 | [[=a=]] | RegExpCharacterClass | +| regexp.cpp:84:29:84:33 | [=a=] | RegExpNamedCharacterProperty | +| regexp.cpp:85:28:85:40 | [A-F[=b=]a-f] | RegExpCharacterClass | +| regexp.cpp:85:29:85:29 | A | RegExpConstant,RegExpNormalChar | +| regexp.cpp:85:29:85:31 | A-F | RegExpCharacterRange | +| regexp.cpp:85:31:85:31 | F | RegExpConstant,RegExpNormalChar | +| regexp.cpp:85:32:85:36 | [=b=] | RegExpNamedCharacterProperty | +| regexp.cpp:85:37:85:37 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:85:37:85:39 | a-f | RegExpCharacterRange | +| regexp.cpp:85:39:85:39 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:88:22:88:30 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:91:19:91:24 | \\u0061 | RegExpConstant,RegExpEscape | +| regexp.cpp:94:19:94:22 | \\x61 | RegExpConstant,RegExpEscape | +| regexp.cpp:97:21:97:23 | \\cA | RegExpConstant,RegExpEscape | +| regexp.cpp:98:21:98:25 | [\\cz] | RegExpCharacterClass | +| regexp.cpp:98:22:98:24 | \\cz | RegExpConstant,RegExpEscape | +| regexp.cpp:101:20:101:21 | \\0 | RegExpConstant,RegExpEscape | +| regexp.cpp:102:20:102:23 | [\\0] | RegExpCharacterClass | +| regexp.cpp:102:21:102:22 | \\0 | RegExpConstant,RegExpEscape | +| regexp.cpp:105:21:105:21 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:105:21:105:23 | a*? | RegExpStar | +| regexp.cpp:106:21:106:21 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:106:21:106:23 | b+? | RegExpPlus | +| regexp.cpp:107:21:107:21 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:107:21:107:23 | c?? | RegExpOpt | +| regexp.cpp:108:21:108:21 | d | RegExpConstant,RegExpNormalChar | +| regexp.cpp:108:21:108:27 | d{2,3}? | RegExpQuantifier | +| regexp.cpp:109:18:109:19 | \\f | RegExpConstant,RegExpEscape | +| regexp.cpp:109:18:109:21 | \\f\\v | RegExpSequence | +| regexp.cpp:109:20:109:21 | \\v | RegExpConstant,RegExpEscape | +| regexp.cpp:112:25:112:25 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:112:25:112:28 | a\\nb | RegExpSequence | +| regexp.cpp:112:26:112:27 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:112:28:112:28 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:113:37:113:37 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:113:37:113:40 | a\\nc | RegExpSequence | +| regexp.cpp:113:38:113:39 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:113:40:113:40 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:114:39:114:39 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:114:39:114:42 | a\\nc | RegExpSequence | +| regexp.cpp:114:40:114:41 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:114:42:114:42 | c | RegExpConstant,RegExpNormalChar | | regexp.cpp:115:38:115:38 | a | RegExpConstant,RegExpNormalChar | | regexp.cpp:115:38:115:41 | a\\nc | RegExpSequence | | regexp.cpp:115:39:115:40 | \\n | RegExpConstant,RegExpEscape | | regexp.cpp:115:41:115:41 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:116:23:116:23 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:116:23:116:26 | a\\nc | RegExpSequence | -| regexp.cpp:116:24:116:25 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:116:26:116:26 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:117:40:117:40 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:117:40:117:43 | a\\nc | RegExpSequence | -| regexp.cpp:117:41:117:42 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:117:43:117:43 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:118:42:118:42 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:118:42:118:45 | a\\nc | RegExpSequence | -| regexp.cpp:118:43:118:44 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:118:45:118:45 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:119:41:119:41 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:119:41:119:44 | a\\nc | RegExpSequence | -| regexp.cpp:119:42:119:43 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:119:44:119:44 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:116:38:116:38 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:116:38:116:41 | a\\nc | RegExpSequence | +| regexp.cpp:116:39:116:40 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:116:41:116:41 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:117:23:117:23 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:117:23:117:26 | a\\nc | RegExpSequence | +| regexp.cpp:117:24:117:25 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:117:26:117:26 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:118:26:118:26 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:118:26:118:29 | a\\nc | RegExpSequence | +| regexp.cpp:118:27:118:28 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:118:29:118:29 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:119:42:119:42 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:119:42:119:45 | a\\nc | RegExpSequence | +| regexp.cpp:119:43:119:44 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:119:45:119:45 | c | RegExpConstant,RegExpNormalChar | | regexp.cpp:120:41:120:41 | a | RegExpConstant,RegExpNormalChar | | regexp.cpp:120:41:120:44 | a\\nc | RegExpSequence | | regexp.cpp:120:42:120:43 | \\n | RegExpConstant,RegExpEscape | | regexp.cpp:120:44:120:44 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:121:25:121:25 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:121:25:121:28 | a\\nc | RegExpSequence | -| regexp.cpp:121:26:121:27 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:121:28:121:28 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:122:29:122:29 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:122:29:122:32 | a\\nc | RegExpSequence | -| regexp.cpp:122:30:122:31 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:122:32:122:32 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:121:41:121:41 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:121:41:121:44 | a\\nc | RegExpSequence | +| regexp.cpp:121:42:121:43 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:121:44:121:44 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:122:25:122:25 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:122:25:122:28 | a\\nc | RegExpSequence | +| regexp.cpp:122:26:122:27 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:122:28:122:28 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:123:29:123:29 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:123:29:123:32 | a\\nc | RegExpSequence | +| regexp.cpp:123:30:123:31 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:123:32:123:32 | c | RegExpConstant,RegExpNormalChar | regExpNormalCharValue -| regexp.cpp:18:19:18:21 | abc | abc | -| regexp.cpp:21:20:21:20 | a | a | -| regexp.cpp:21:22:21:22 | b | b | -| regexp.cpp:21:24:21:24 | c | c | -| regexp.cpp:21:26:21:26 | d | d | +| regexp.cpp:19:19:19:21 | abc | abc | | regexp.cpp:22:20:22:20 | a | a | +| regexp.cpp:22:22:22:22 | b | b | +| regexp.cpp:22:24:22:24 | c | c | +| regexp.cpp:22:26:22:26 | d | d | | regexp.cpp:23:20:23:20 | a | a | | regexp.cpp:24:20:24:20 | a | a | -| regexp.cpp:27:19:27:21 | foo | foo | -| regexp.cpp:27:23:27:25 | bar | bar | -| regexp.cpp:30:20:30:20 | a | a | -| regexp.cpp:30:21:30:21 | b | b | -| regexp.cpp:30:22:30:22 | c | c | +| regexp.cpp:25:20:25:20 | a | a | +| regexp.cpp:28:19:28:21 | foo | foo | +| regexp.cpp:28:23:28:25 | bar | bar | | regexp.cpp:31:20:31:20 | a | a | -| regexp.cpp:31:22:31:22 | f | f | -| regexp.cpp:31:23:31:23 | A | A | -| regexp.cpp:31:25:31:25 | F | F | -| regexp.cpp:31:26:31:26 | 0 | 0 | -| regexp.cpp:31:28:31:28 | 9 | 9 | -| regexp.cpp:31:29:31:29 | _ | _ | -| regexp.cpp:32:20:32:21 | \\w | w | -| regexp.cpp:33:19:33:20 | \\[ | [ | -| regexp.cpp:33:21:33:22 | \\] | ] | -| regexp.cpp:33:24:33:24 | 1 | 1 | -| regexp.cpp:33:25:33:25 | 2 | 2 | -| regexp.cpp:33:26:33:26 | 3 | 3 | -| regexp.cpp:34:21:34:21 | A | A | -| regexp.cpp:34:23:34:23 | Z | Z | -| regexp.cpp:35:20:35:20 | ] | ] | -| regexp.cpp:36:21:36:21 | ] | ] | -| regexp.cpp:37:21:37:21 | - | - | -| regexp.cpp:38:20:38:20 | \| | \| | -| regexp.cpp:39:21:39:22 | \\b | b | -| regexp.cpp:42:23:42:23 | [ | [ | -| regexp.cpp:42:24:42:24 | a | a | -| regexp.cpp:42:26:42:26 | f | f | -| regexp.cpp:42:28:42:31 | A-F] | A-F] | -| regexp.cpp:46:21:46:22 | \\w | w | -| regexp.cpp:46:24:46:25 | \\W | W | -| regexp.cpp:47:21:47:22 | \\s | s | -| regexp.cpp:47:23:47:24 | \\S | S | -| regexp.cpp:48:21:48:22 | \\d | d | -| regexp.cpp:48:23:48:24 | \\D | D | -| regexp.cpp:49:21:49:22 | \\n | \n | -| regexp.cpp:49:23:49:24 | \\r | \r | -| regexp.cpp:49:25:49:26 | \\t | \t | -| regexp.cpp:52:22:52:23 | !a | !a | -| regexp.cpp:55:21:55:23 | foo | foo | -| regexp.cpp:55:26:55:28 | bar | bar | -| regexp.cpp:56:20:56:21 | fo | fo | -| regexp.cpp:56:23:56:23 | o | o | -| regexp.cpp:56:25:56:25 | b | b | -| regexp.cpp:56:27:56:28 | ar | ar | -| regexp.cpp:57:21:57:21 | a | a | -| regexp.cpp:57:23:57:23 | b | b | -| regexp.cpp:57:25:57:26 | cd | cd | -| regexp.cpp:57:28:57:28 | e | e | -| regexp.cpp:58:23:58:23 | : | : | -| regexp.cpp:58:26:58:27 | \\w | w | -| regexp.cpp:61:22:61:22 | a | a | -| regexp.cpp:61:25:61:25 | b | b | -| regexp.cpp:67:22:67:22 | a | a | -| regexp.cpp:67:24:67:24 | f | f | -| regexp.cpp:76:23:76:23 | A | A | -| regexp.cpp:76:25:76:25 | F | F | -| regexp.cpp:76:35:76:35 | a | a | -| regexp.cpp:76:37:76:37 | f | f | -| regexp.cpp:80:28:80:28 | A | A | -| regexp.cpp:80:30:80:30 | F | F | -| regexp.cpp:80:36:80:36 | a | a | -| regexp.cpp:80:38:80:38 | f | f | -| regexp.cpp:84:29:84:29 | A | A | -| regexp.cpp:84:31:84:31 | F | F | -| regexp.cpp:84:37:84:37 | a | a | -| regexp.cpp:84:39:84:39 | f | f | -| regexp.cpp:90:19:90:24 | \\u0061 | a | -| regexp.cpp:93:19:93:22 | \\x61 | a | -| regexp.cpp:96:21:96:23 | \\cA | \u0001 | -| regexp.cpp:97:22:97:24 | \\cz | \u001a | -| regexp.cpp:100:20:100:21 | \\0 | \u0000 | -| regexp.cpp:101:21:101:22 | \\0 | \u0000 | -| regexp.cpp:104:21:104:21 | a | a | -| regexp.cpp:105:21:105:21 | b | b | -| regexp.cpp:106:21:106:21 | c | c | -| regexp.cpp:107:21:107:21 | d | d | -| regexp.cpp:108:18:108:19 | \\f | \u000c | -| regexp.cpp:108:20:108:21 | \\v | \u000b | -| regexp.cpp:111:25:111:25 | a | a | -| regexp.cpp:111:26:111:27 | \\n | \n | -| regexp.cpp:111:28:111:28 | b | b | -| regexp.cpp:112:37:112:37 | a | a | -| regexp.cpp:112:38:112:39 | \\n | \n | -| regexp.cpp:112:40:112:40 | c | c | -| regexp.cpp:113:39:113:39 | a | a | -| regexp.cpp:113:40:113:41 | \\n | \n | -| regexp.cpp:113:42:113:42 | c | c | -| regexp.cpp:114:38:114:38 | a | a | -| regexp.cpp:114:39:114:40 | \\n | \n | -| regexp.cpp:114:41:114:41 | c | c | +| regexp.cpp:31:21:31:21 | b | b | +| regexp.cpp:31:22:31:22 | c | c | +| regexp.cpp:32:20:32:20 | a | a | +| regexp.cpp:32:22:32:22 | f | f | +| regexp.cpp:32:23:32:23 | A | A | +| regexp.cpp:32:25:32:25 | F | F | +| regexp.cpp:32:26:32:26 | 0 | 0 | +| regexp.cpp:32:28:32:28 | 9 | 9 | +| regexp.cpp:32:29:32:29 | _ | _ | +| regexp.cpp:33:20:33:21 | \\w | w | +| regexp.cpp:34:19:34:20 | \\[ | [ | +| regexp.cpp:34:21:34:22 | \\] | ] | +| regexp.cpp:34:24:34:24 | 1 | 1 | +| regexp.cpp:34:25:34:25 | 2 | 2 | +| regexp.cpp:34:26:34:26 | 3 | 3 | +| regexp.cpp:35:21:35:21 | A | A | +| regexp.cpp:35:23:35:23 | Z | Z | +| regexp.cpp:36:20:36:20 | ] | ] | +| regexp.cpp:37:21:37:21 | ] | ] | +| regexp.cpp:38:21:38:21 | - | - | +| regexp.cpp:39:20:39:20 | \| | \| | +| regexp.cpp:40:21:40:22 | \\b | b | +| regexp.cpp:43:23:43:23 | [ | [ | +| regexp.cpp:43:24:43:24 | a | a | +| regexp.cpp:43:26:43:26 | f | f | +| regexp.cpp:43:28:43:31 | A-F] | A-F] | +| regexp.cpp:47:21:47:22 | \\w | w | +| regexp.cpp:47:24:47:25 | \\W | W | +| regexp.cpp:48:21:48:22 | \\s | s | +| regexp.cpp:48:23:48:24 | \\S | S | +| regexp.cpp:49:21:49:22 | \\d | d | +| regexp.cpp:49:23:49:24 | \\D | D | +| regexp.cpp:50:21:50:22 | \\n | \n | +| regexp.cpp:50:23:50:24 | \\r | \r | +| regexp.cpp:50:25:50:26 | \\t | \t | +| regexp.cpp:53:22:53:23 | !a | !a | +| regexp.cpp:56:21:56:23 | foo | foo | +| regexp.cpp:56:26:56:28 | bar | bar | +| regexp.cpp:57:20:57:21 | fo | fo | +| regexp.cpp:57:23:57:23 | o | o | +| regexp.cpp:57:25:57:25 | b | b | +| regexp.cpp:57:27:57:28 | ar | ar | +| regexp.cpp:58:21:58:21 | a | a | +| regexp.cpp:58:23:58:23 | b | b | +| regexp.cpp:58:25:58:26 | cd | cd | +| regexp.cpp:58:28:58:28 | e | e | +| regexp.cpp:59:23:59:23 | : | : | +| regexp.cpp:59:26:59:27 | \\w | w | +| regexp.cpp:62:22:62:22 | a | a | +| regexp.cpp:62:25:62:25 | b | b | +| regexp.cpp:68:22:68:22 | a | a | +| regexp.cpp:68:24:68:24 | f | f | +| regexp.cpp:77:23:77:23 | A | A | +| regexp.cpp:77:25:77:25 | F | F | +| regexp.cpp:77:35:77:35 | a | a | +| regexp.cpp:77:37:77:37 | f | f | +| regexp.cpp:81:28:81:28 | A | A | +| regexp.cpp:81:30:81:30 | F | F | +| regexp.cpp:81:36:81:36 | a | a | +| regexp.cpp:81:38:81:38 | f | f | +| regexp.cpp:85:29:85:29 | A | A | +| regexp.cpp:85:31:85:31 | F | F | +| regexp.cpp:85:37:85:37 | a | a | +| regexp.cpp:85:39:85:39 | f | f | +| regexp.cpp:91:19:91:24 | \\u0061 | a | +| regexp.cpp:94:19:94:22 | \\x61 | a | +| regexp.cpp:97:21:97:23 | \\cA | \u0001 | +| regexp.cpp:98:22:98:24 | \\cz | \u001a | +| regexp.cpp:101:20:101:21 | \\0 | \u0000 | +| regexp.cpp:102:21:102:22 | \\0 | \u0000 | +| regexp.cpp:105:21:105:21 | a | a | +| regexp.cpp:106:21:106:21 | b | b | +| regexp.cpp:107:21:107:21 | c | c | +| regexp.cpp:108:21:108:21 | d | d | +| regexp.cpp:109:18:109:19 | \\f | \u000c | +| regexp.cpp:109:20:109:21 | \\v | \u000b | +| regexp.cpp:112:25:112:25 | a | a | +| regexp.cpp:112:26:112:27 | \\n | \n | +| regexp.cpp:112:28:112:28 | b | b | +| regexp.cpp:113:37:113:37 | a | a | +| regexp.cpp:113:38:113:39 | \\n | \n | +| regexp.cpp:113:40:113:40 | c | c | +| regexp.cpp:114:39:114:39 | a | a | +| regexp.cpp:114:40:114:41 | \\n | \n | +| regexp.cpp:114:42:114:42 | c | c | | regexp.cpp:115:38:115:38 | a | a | | regexp.cpp:115:39:115:40 | \\n | \n | | regexp.cpp:115:41:115:41 | c | c | -| regexp.cpp:116:23:116:23 | a | a | -| regexp.cpp:116:24:116:25 | \\n | \n | -| regexp.cpp:116:26:116:26 | c | c | -| regexp.cpp:117:40:117:40 | a | a | -| regexp.cpp:117:41:117:42 | \\n | \n | -| regexp.cpp:117:43:117:43 | c | c | -| regexp.cpp:118:42:118:42 | a | a | -| regexp.cpp:118:43:118:44 | \\n | \n | -| regexp.cpp:118:45:118:45 | c | c | -| regexp.cpp:119:41:119:41 | a | a | -| regexp.cpp:119:42:119:43 | \\n | \n | -| regexp.cpp:119:44:119:44 | c | c | +| regexp.cpp:116:38:116:38 | a | a | +| regexp.cpp:116:39:116:40 | \\n | \n | +| regexp.cpp:116:41:116:41 | c | c | +| regexp.cpp:117:23:117:23 | a | a | +| regexp.cpp:117:24:117:25 | \\n | \n | +| regexp.cpp:117:26:117:26 | c | c | +| regexp.cpp:118:26:118:26 | a | a | +| regexp.cpp:118:27:118:28 | \\n | \n | +| regexp.cpp:118:29:118:29 | c | c | +| regexp.cpp:119:42:119:42 | a | a | +| regexp.cpp:119:43:119:44 | \\n | \n | +| regexp.cpp:119:45:119:45 | c | c | | regexp.cpp:120:41:120:41 | a | a | | regexp.cpp:120:42:120:43 | \\n | \n | | regexp.cpp:120:44:120:44 | c | c | -| regexp.cpp:121:25:121:25 | a | a | -| regexp.cpp:121:26:121:27 | \\n | \n | -| regexp.cpp:121:28:121:28 | c | c | -| regexp.cpp:122:29:122:29 | a | a | -| regexp.cpp:122:30:122:31 | \\n | \n | -| regexp.cpp:122:32:122:32 | c | c | +| regexp.cpp:121:41:121:41 | a | a | +| regexp.cpp:121:42:121:43 | \\n | \n | +| regexp.cpp:121:44:121:44 | c | c | +| regexp.cpp:122:25:122:25 | a | a | +| regexp.cpp:122:26:122:27 | \\n | \n | +| regexp.cpp:122:28:122:28 | c | c | +| regexp.cpp:123:29:123:29 | a | a | +| regexp.cpp:123:30:123:31 | \\n | \n | +| regexp.cpp:123:32:123:32 | c | c | From 957d1fcc455da3f5034c0e8cb056f8a7a1596a60 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 28 Aug 2026 16:50:39 +0200 Subject: [PATCH 0577/2098] C++: Add `[^[:digit:]]` test --- .../library-tests/regex/locations.expected | 59 ++-- .../test/library-tests/regex/parse.expected | 145 +++++---- .../regex/rawstringliteral.expected | 12 +- cpp/ql/test/library-tests/regex/regexp.cpp | 1 + .../test/library-tests/regex/regexp.expected | 302 +++++++++--------- 5 files changed, 264 insertions(+), 255 deletions(-) diff --git a/cpp/ql/test/library-tests/regex/locations.expected b/cpp/ql/test/library-tests/regex/locations.expected index f798d434504a..3eaa0b2d8155 100644 --- a/cpp/ql/test/library-tests/regex/locations.expected +++ b/cpp/ql/test/library-tests/regex/locations.expected @@ -30,34 +30,35 @@ | regexp.cpp:66:21:66:32 | [[:digit:]]+ | regexp.cpp | 66 | 21 | 66 | 32 | | regexp.cpp:67:21:67:36 | [[:alnum:]]{2,3} | regexp.cpp | 67 | 21 | 67 | 36 | | regexp.cpp:68:21:68:35 | [a-f[:digit:]]+ | regexp.cpp | 68 | 21 | 68 | 35 | -| regexp.cpp:71:22:71:43 | [[:alpha:]][[:digit:]] | regexp.cpp | 71 | 22 | 71 | 43 | -| regexp.cpp:74:22:74:41 | [[:alpha:][:digit:]] | regexp.cpp | 74 | 22 | 74 | 41 | -| regexp.cpp:77:22:77:38 | [A-F[:digit:]a-f] | regexp.cpp | 77 | 22 | 77 | 38 | -| regexp.cpp:80:27:80:33 | [[.a.]] | regexp.cpp | 80 | 27 | 80 | 33 | -| regexp.cpp:81:27:81:39 | [A-F[.b.]a-f] | regexp.cpp | 81 | 27 | 81 | 39 | -| regexp.cpp:84:28:84:34 | [[=a=]] | regexp.cpp | 84 | 28 | 84 | 34 | -| regexp.cpp:85:28:85:40 | [A-F[=b=]a-f] | regexp.cpp | 85 | 28 | 85 | 40 | -| regexp.cpp:88:22:88:30 | [:digit:] | regexp.cpp | 88 | 22 | 88 | 30 | -| regexp.cpp:91:19:91:24 | \\u0061 | regexp.cpp | 91 | 19 | 91 | 24 | -| regexp.cpp:94:19:94:22 | \\x61 | regexp.cpp | 94 | 19 | 94 | 22 | -| regexp.cpp:97:21:97:23 | \\cA | regexp.cpp | 97 | 21 | 97 | 23 | -| regexp.cpp:98:21:98:25 | [\\cz] | regexp.cpp | 98 | 21 | 98 | 25 | -| regexp.cpp:101:20:101:21 | \\0 | regexp.cpp | 101 | 20 | 101 | 21 | -| regexp.cpp:102:20:102:23 | [\\0] | regexp.cpp | 102 | 20 | 102 | 23 | -| regexp.cpp:105:21:105:23 | a*? | regexp.cpp | 105 | 21 | 105 | 23 | -| regexp.cpp:106:21:106:23 | b+? | regexp.cpp | 106 | 21 | 106 | 23 | -| regexp.cpp:107:21:107:23 | c?? | regexp.cpp | 107 | 21 | 107 | 23 | -| regexp.cpp:108:21:108:27 | d{2,3}? | regexp.cpp | 108 | 21 | 108 | 27 | -| regexp.cpp:109:18:109:21 | \\f\\v | regexp.cpp | 109 | 18 | 109 | 21 | -| regexp.cpp:112:25:112:28 | a\\nb | regexp.cpp | 112 | 25 | 112 | 28 | -| regexp.cpp:113:37:113:40 | a\\nc | regexp.cpp | 113 | 37 | 113 | 40 | -| regexp.cpp:114:39:114:42 | a\\nc | regexp.cpp | 114 | 39 | 114 | 42 | -| regexp.cpp:115:38:115:41 | a\\nc | regexp.cpp | 115 | 38 | 115 | 41 | +| regexp.cpp:69:21:69:32 | [^[:digit:]] | regexp.cpp | 69 | 21 | 69 | 32 | +| regexp.cpp:72:22:72:43 | [[:alpha:]][[:digit:]] | regexp.cpp | 72 | 22 | 72 | 43 | +| regexp.cpp:75:22:75:41 | [[:alpha:][:digit:]] | regexp.cpp | 75 | 22 | 75 | 41 | +| regexp.cpp:78:22:78:38 | [A-F[:digit:]a-f] | regexp.cpp | 78 | 22 | 78 | 38 | +| regexp.cpp:81:27:81:33 | [[.a.]] | regexp.cpp | 81 | 27 | 81 | 33 | +| regexp.cpp:82:27:82:39 | [A-F[.b.]a-f] | regexp.cpp | 82 | 27 | 82 | 39 | +| regexp.cpp:85:28:85:34 | [[=a=]] | regexp.cpp | 85 | 28 | 85 | 34 | +| regexp.cpp:86:28:86:40 | [A-F[=b=]a-f] | regexp.cpp | 86 | 28 | 86 | 40 | +| regexp.cpp:89:22:89:30 | [:digit:] | regexp.cpp | 89 | 22 | 89 | 30 | +| regexp.cpp:92:19:92:24 | \\u0061 | regexp.cpp | 92 | 19 | 92 | 24 | +| regexp.cpp:95:19:95:22 | \\x61 | regexp.cpp | 95 | 19 | 95 | 22 | +| regexp.cpp:98:21:98:23 | \\cA | regexp.cpp | 98 | 21 | 98 | 23 | +| regexp.cpp:99:21:99:25 | [\\cz] | regexp.cpp | 99 | 21 | 99 | 25 | +| regexp.cpp:102:20:102:21 | \\0 | regexp.cpp | 102 | 20 | 102 | 21 | +| regexp.cpp:103:20:103:23 | [\\0] | regexp.cpp | 103 | 20 | 103 | 23 | +| regexp.cpp:106:21:106:23 | a*? | regexp.cpp | 106 | 21 | 106 | 23 | +| regexp.cpp:107:21:107:23 | b+? | regexp.cpp | 107 | 21 | 107 | 23 | +| regexp.cpp:108:21:108:23 | c?? | regexp.cpp | 108 | 21 | 108 | 23 | +| regexp.cpp:109:21:109:27 | d{2,3}? | regexp.cpp | 109 | 21 | 109 | 27 | +| regexp.cpp:110:18:110:21 | \\f\\v | regexp.cpp | 110 | 18 | 110 | 21 | +| regexp.cpp:113:25:113:28 | a\\nb | regexp.cpp | 113 | 25 | 113 | 28 | +| regexp.cpp:114:37:114:40 | a\\nc | regexp.cpp | 114 | 37 | 114 | 40 | +| regexp.cpp:115:39:115:42 | a\\nc | regexp.cpp | 115 | 39 | 115 | 42 | | regexp.cpp:116:38:116:41 | a\\nc | regexp.cpp | 116 | 38 | 116 | 41 | -| regexp.cpp:117:23:117:26 | a\\nc | regexp.cpp | 117 | 23 | 117 | 26 | -| regexp.cpp:118:26:118:29 | a\\nc | regexp.cpp | 118 | 26 | 118 | 29 | -| regexp.cpp:119:42:119:45 | a\\nc | regexp.cpp | 119 | 42 | 119 | 45 | -| regexp.cpp:120:41:120:44 | a\\nc | regexp.cpp | 120 | 41 | 120 | 44 | +| regexp.cpp:117:38:117:41 | a\\nc | regexp.cpp | 117 | 38 | 117 | 41 | +| regexp.cpp:118:23:118:26 | a\\nc | regexp.cpp | 118 | 23 | 118 | 26 | +| regexp.cpp:119:26:119:29 | a\\nc | regexp.cpp | 119 | 26 | 119 | 29 | +| regexp.cpp:120:42:120:45 | a\\nc | regexp.cpp | 120 | 42 | 120 | 45 | | regexp.cpp:121:41:121:44 | a\\nc | regexp.cpp | 121 | 41 | 121 | 44 | -| regexp.cpp:122:25:122:28 | a\\nc | regexp.cpp | 122 | 25 | 122 | 28 | -| regexp.cpp:123:29:123:32 | a\\nc | regexp.cpp | 123 | 29 | 123 | 32 | +| regexp.cpp:122:41:122:44 | a\\nc | regexp.cpp | 122 | 41 | 122 | 44 | +| regexp.cpp:123:25:123:28 | a\\nc | regexp.cpp | 123 | 25 | 123 | 28 | +| regexp.cpp:124:29:124:32 | a\\nc | regexp.cpp | 124 | 29 | 124 | 32 | diff --git a/cpp/ql/test/library-tests/regex/parse.expected b/cpp/ql/test/library-tests/regex/parse.expected index b64030dd963f..4d31f87d50da 100644 --- a/cpp/ql/test/library-tests/regex/parse.expected +++ b/cpp/ql/test/library-tests/regex/parse.expected @@ -357,176 +357,170 @@ regexp.cpp: # 68| [RegExpNamedCharacterProperty] [:digit:] -# 71| [RegExpCharacterClass] [[:alpha:]] +# 69| [RegExpCharacterClass] [^[:digit:]] +#-----| 0 -> [RegExpNamedCharacterProperty] [:digit:] + +# 69| [RegExpNamedCharacterProperty] [:digit:] + +# 72| [RegExpCharacterClass] [[:alpha:]] #-----| 0 -> [RegExpNamedCharacterProperty] [:alpha:] -# 71| [RegExpSequence] [[:alpha:]][[:digit:]] +# 72| [RegExpSequence] [[:alpha:]][[:digit:]] #-----| 0 -> [RegExpCharacterClass] [[:alpha:]] #-----| 1 -> [RegExpCharacterClass] [[:digit:]] -# 71| [RegExpNamedCharacterProperty] [:alpha:] +# 72| [RegExpNamedCharacterProperty] [:alpha:] -# 71| [RegExpCharacterClass] [[:digit:]] +# 72| [RegExpCharacterClass] [[:digit:]] #-----| 0 -> [RegExpNamedCharacterProperty] [:digit:] -# 71| [RegExpNamedCharacterProperty] [:digit:] +# 72| [RegExpNamedCharacterProperty] [:digit:] -# 74| [RegExpCharacterClass] [[:alpha:][:digit:]] +# 75| [RegExpCharacterClass] [[:alpha:][:digit:]] #-----| 0 -> [RegExpNamedCharacterProperty] [:alpha:] #-----| 1 -> [RegExpNamedCharacterProperty] [:digit:] -# 74| [RegExpNamedCharacterProperty] [:alpha:] +# 75| [RegExpNamedCharacterProperty] [:alpha:] -# 74| [RegExpNamedCharacterProperty] [:digit:] +# 75| [RegExpNamedCharacterProperty] [:digit:] -# 77| [RegExpCharacterClass] [A-F[:digit:]a-f] +# 78| [RegExpCharacterClass] [A-F[:digit:]a-f] #-----| 0 -> [RegExpCharacterRange] A-F #-----| 1 -> [RegExpNamedCharacterProperty] [:digit:] #-----| 2 -> [RegExpCharacterRange] a-f -# 77| [RegExpConstant, RegExpNormalChar] A +# 78| [RegExpConstant, RegExpNormalChar] A -# 77| [RegExpCharacterRange] A-F +# 78| [RegExpCharacterRange] A-F #-----| 0 -> [RegExpConstant, RegExpNormalChar] A #-----| 1 -> [RegExpConstant, RegExpNormalChar] F -# 77| [RegExpConstant, RegExpNormalChar] F +# 78| [RegExpConstant, RegExpNormalChar] F -# 77| [RegExpNamedCharacterProperty] [:digit:] +# 78| [RegExpNamedCharacterProperty] [:digit:] -# 77| [RegExpConstant, RegExpNormalChar] a +# 78| [RegExpConstant, RegExpNormalChar] a -# 77| [RegExpCharacterRange] a-f +# 78| [RegExpCharacterRange] a-f #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] f -# 77| [RegExpConstant, RegExpNormalChar] f +# 78| [RegExpConstant, RegExpNormalChar] f -# 80| [RegExpCharacterClass] [[.a.]] +# 81| [RegExpCharacterClass] [[.a.]] #-----| 0 -> [RegExpNamedCharacterProperty] [.a.] -# 80| [RegExpNamedCharacterProperty] [.a.] +# 81| [RegExpNamedCharacterProperty] [.a.] -# 81| [RegExpCharacterClass] [A-F[.b.]a-f] +# 82| [RegExpCharacterClass] [A-F[.b.]a-f] #-----| 0 -> [RegExpCharacterRange] A-F #-----| 1 -> [RegExpNamedCharacterProperty] [.b.] #-----| 2 -> [RegExpCharacterRange] a-f -# 81| [RegExpConstant, RegExpNormalChar] A +# 82| [RegExpConstant, RegExpNormalChar] A -# 81| [RegExpCharacterRange] A-F +# 82| [RegExpCharacterRange] A-F #-----| 0 -> [RegExpConstant, RegExpNormalChar] A #-----| 1 -> [RegExpConstant, RegExpNormalChar] F -# 81| [RegExpConstant, RegExpNormalChar] F +# 82| [RegExpConstant, RegExpNormalChar] F -# 81| [RegExpNamedCharacterProperty] [.b.] +# 82| [RegExpNamedCharacterProperty] [.b.] -# 81| [RegExpConstant, RegExpNormalChar] a +# 82| [RegExpConstant, RegExpNormalChar] a -# 81| [RegExpCharacterRange] a-f +# 82| [RegExpCharacterRange] a-f #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] f -# 81| [RegExpConstant, RegExpNormalChar] f +# 82| [RegExpConstant, RegExpNormalChar] f -# 84| [RegExpCharacterClass] [[=a=]] +# 85| [RegExpCharacterClass] [[=a=]] #-----| 0 -> [RegExpNamedCharacterProperty] [=a=] -# 84| [RegExpNamedCharacterProperty] [=a=] +# 85| [RegExpNamedCharacterProperty] [=a=] -# 85| [RegExpCharacterClass] [A-F[=b=]a-f] +# 86| [RegExpCharacterClass] [A-F[=b=]a-f] #-----| 0 -> [RegExpCharacterRange] A-F #-----| 1 -> [RegExpNamedCharacterProperty] [=b=] #-----| 2 -> [RegExpCharacterRange] a-f -# 85| [RegExpConstant, RegExpNormalChar] A +# 86| [RegExpConstant, RegExpNormalChar] A -# 85| [RegExpCharacterRange] A-F +# 86| [RegExpCharacterRange] A-F #-----| 0 -> [RegExpConstant, RegExpNormalChar] A #-----| 1 -> [RegExpConstant, RegExpNormalChar] F -# 85| [RegExpConstant, RegExpNormalChar] F +# 86| [RegExpConstant, RegExpNormalChar] F -# 85| [RegExpNamedCharacterProperty] [=b=] +# 86| [RegExpNamedCharacterProperty] [=b=] -# 85| [RegExpConstant, RegExpNormalChar] a +# 86| [RegExpConstant, RegExpNormalChar] a -# 85| [RegExpCharacterRange] a-f +# 86| [RegExpCharacterRange] a-f #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] f -# 85| [RegExpConstant, RegExpNormalChar] f +# 86| [RegExpConstant, RegExpNormalChar] f -# 88| [RegExpNamedCharacterProperty] [:digit:] +# 89| [RegExpNamedCharacterProperty] [:digit:] -# 91| [RegExpConstant, RegExpEscape] \u0061 +# 92| [RegExpConstant, RegExpEscape] \u0061 -# 94| [RegExpConstant, RegExpEscape] \x61 +# 95| [RegExpConstant, RegExpEscape] \x61 -# 97| [RegExpConstant, RegExpEscape] \cA +# 98| [RegExpConstant, RegExpEscape] \cA -# 98| [RegExpCharacterClass] [\cz] +# 99| [RegExpCharacterClass] [\cz] #-----| 0 -> [RegExpConstant, RegExpEscape] \cz -# 98| [RegExpConstant, RegExpEscape] \cz +# 99| [RegExpConstant, RegExpEscape] \cz -# 101| [RegExpConstant, RegExpEscape] \0 +# 102| [RegExpConstant, RegExpEscape] \0 -# 102| [RegExpCharacterClass] [\0] +# 103| [RegExpCharacterClass] [\0] #-----| 0 -> [RegExpConstant, RegExpEscape] \0 -# 102| [RegExpConstant, RegExpEscape] \0 +# 103| [RegExpConstant, RegExpEscape] \0 -# 105| [RegExpConstant, RegExpNormalChar] a +# 106| [RegExpConstant, RegExpNormalChar] a -# 105| [RegExpStar] a*? +# 106| [RegExpStar] a*? #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 106| [RegExpConstant, RegExpNormalChar] b +# 107| [RegExpConstant, RegExpNormalChar] b -# 106| [RegExpPlus] b+? +# 107| [RegExpPlus] b+? #-----| 0 -> [RegExpConstant, RegExpNormalChar] b -# 107| [RegExpConstant, RegExpNormalChar] c +# 108| [RegExpConstant, RegExpNormalChar] c -# 107| [RegExpOpt] c?? +# 108| [RegExpOpt] c?? #-----| 0 -> [RegExpConstant, RegExpNormalChar] c -# 108| [RegExpConstant, RegExpNormalChar] d +# 109| [RegExpConstant, RegExpNormalChar] d -# 108| [RegExpQuantifier] d{2,3}? +# 109| [RegExpQuantifier] d{2,3}? #-----| 0 -> [RegExpConstant, RegExpNormalChar] d -# 109| [RegExpConstant, RegExpEscape] \f +# 110| [RegExpConstant, RegExpEscape] \f -# 109| [RegExpSequence] \f\v +# 110| [RegExpSequence] \f\v #-----| 0 -> [RegExpConstant, RegExpEscape] \f #-----| 1 -> [RegExpConstant, RegExpEscape] \v -# 109| [RegExpConstant, RegExpEscape] \v - -# 112| [RegExpConstant, RegExpNormalChar] a - -# 112| [RegExpSequence] a\nb -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] b - -# 112| [RegExpConstant, RegExpEscape] \n - -# 112| [RegExpConstant, RegExpNormalChar] b +# 110| [RegExpConstant, RegExpEscape] \v # 113| [RegExpConstant, RegExpNormalChar] a -# 113| [RegExpSequence] a\nc +# 113| [RegExpSequence] a\nb #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c +#-----| 2 -> [RegExpConstant, RegExpNormalChar] b # 113| [RegExpConstant, RegExpEscape] \n -# 113| [RegExpConstant, RegExpNormalChar] c +# 113| [RegExpConstant, RegExpNormalChar] b # 114| [RegExpConstant, RegExpNormalChar] a @@ -637,3 +631,14 @@ regexp.cpp: # 123| [RegExpConstant, RegExpEscape] \n # 123| [RegExpConstant, RegExpNormalChar] c + +# 124| [RegExpConstant, RegExpNormalChar] a + +# 124| [RegExpSequence] a\nc +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpEscape] \n +#-----| 2 -> [RegExpConstant, RegExpNormalChar] c + +# 124| [RegExpConstant, RegExpEscape] \n + +# 124| [RegExpConstant, RegExpNormalChar] c diff --git a/cpp/ql/test/library-tests/regex/rawstringliteral.expected b/cpp/ql/test/library-tests/regex/rawstringliteral.expected index d156030b74de..4602a4af9f8d 100644 --- a/cpp/ql/test/library-tests/regex/rawstringliteral.expected +++ b/cpp/ql/test/library-tests/regex/rawstringliteral.expected @@ -1,7 +1,7 @@ -| regexp.cpp:117:20:117:28 | a\\nc | -| regexp.cpp:118:22:118:31 | a\\nc | -| regexp.cpp:119:37:119:47 | a\\nc | -| regexp.cpp:120:37:120:46 | a\\nc | +| regexp.cpp:118:20:118:28 | a\\nc | +| regexp.cpp:119:22:119:31 | a\\nc | +| regexp.cpp:120:37:120:47 | a\\nc | | regexp.cpp:121:37:121:46 | a\\nc | -| regexp.cpp:122:21:122:31 | a\\nc | -| regexp.cpp:123:23:123:37 | a\\nc | +| regexp.cpp:122:37:122:46 | a\\nc | +| regexp.cpp:123:21:123:31 | a\\nc | +| regexp.cpp:124:23:124:37 | a\\nc | diff --git a/cpp/ql/test/library-tests/regex/regexp.cpp b/cpp/ql/test/library-tests/regex/regexp.cpp index 3845651aa93e..d15e1fc1736b 100644 --- a/cpp/ql/test/library-tests/regex/regexp.cpp +++ b/cpp/ql/test/library-tests/regex/regexp.cpp @@ -66,6 +66,7 @@ std::regex r_prop1("[[:alnum:]]*"); std::regex r_prop2("[[:digit:]]+"); std::regex r_prop3("[[:alnum:]]{2,3}"); std::regex r_prop4("[a-f[:digit:]]+"); // Also valid inside character classes +std::regex r_prop5("[^[:digit:]]"); // Two separate character classes, each containing a single POSIX bracket expression std::regex r_posix1("[[:alpha:]][[:digit:]]"); diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index 93c27b321de4..838a960ef298 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -134,110 +134,112 @@ term | regexp.cpp:68:22:68:24 | a-f | RegExpCharacterRange | | regexp.cpp:68:24:68:24 | f | RegExpConstant,RegExpNormalChar | | regexp.cpp:68:25:68:33 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.cpp:71:22:71:32 | [[:alpha:]] | RegExpCharacterClass | -| regexp.cpp:71:22:71:43 | [[:alpha:]][[:digit:]] | RegExpSequence | -| regexp.cpp:71:23:71:31 | [:alpha:] | RegExpNamedCharacterProperty | -| regexp.cpp:71:33:71:43 | [[:digit:]] | RegExpCharacterClass | -| regexp.cpp:71:34:71:42 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.cpp:74:22:74:41 | [[:alpha:][:digit:]] | RegExpCharacterClass | -| regexp.cpp:74:23:74:31 | [:alpha:] | RegExpNamedCharacterProperty | -| regexp.cpp:74:32:74:40 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.cpp:77:22:77:38 | [A-F[:digit:]a-f] | RegExpCharacterClass | -| regexp.cpp:77:23:77:23 | A | RegExpConstant,RegExpNormalChar | -| regexp.cpp:77:23:77:25 | A-F | RegExpCharacterRange | -| regexp.cpp:77:25:77:25 | F | RegExpConstant,RegExpNormalChar | -| regexp.cpp:77:26:77:34 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.cpp:77:35:77:35 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:77:35:77:37 | a-f | RegExpCharacterRange | -| regexp.cpp:77:37:77:37 | f | RegExpConstant,RegExpNormalChar | -| regexp.cpp:80:27:80:33 | [[.a.]] | RegExpCharacterClass | -| regexp.cpp:80:28:80:32 | [.a.] | RegExpNamedCharacterProperty | -| regexp.cpp:81:27:81:39 | [A-F[.b.]a-f] | RegExpCharacterClass | -| regexp.cpp:81:28:81:28 | A | RegExpConstant,RegExpNormalChar | -| regexp.cpp:81:28:81:30 | A-F | RegExpCharacterRange | -| regexp.cpp:81:30:81:30 | F | RegExpConstant,RegExpNormalChar | -| regexp.cpp:81:31:81:35 | [.b.] | RegExpNamedCharacterProperty | -| regexp.cpp:81:36:81:36 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:81:36:81:38 | a-f | RegExpCharacterRange | -| regexp.cpp:81:38:81:38 | f | RegExpConstant,RegExpNormalChar | -| regexp.cpp:84:28:84:34 | [[=a=]] | RegExpCharacterClass | -| regexp.cpp:84:29:84:33 | [=a=] | RegExpNamedCharacterProperty | -| regexp.cpp:85:28:85:40 | [A-F[=b=]a-f] | RegExpCharacterClass | -| regexp.cpp:85:29:85:29 | A | RegExpConstant,RegExpNormalChar | -| regexp.cpp:85:29:85:31 | A-F | RegExpCharacterRange | -| regexp.cpp:85:31:85:31 | F | RegExpConstant,RegExpNormalChar | -| regexp.cpp:85:32:85:36 | [=b=] | RegExpNamedCharacterProperty | -| regexp.cpp:85:37:85:37 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:85:37:85:39 | a-f | RegExpCharacterRange | -| regexp.cpp:85:39:85:39 | f | RegExpConstant,RegExpNormalChar | -| regexp.cpp:88:22:88:30 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.cpp:91:19:91:24 | \\u0061 | RegExpConstant,RegExpEscape | -| regexp.cpp:94:19:94:22 | \\x61 | RegExpConstant,RegExpEscape | -| regexp.cpp:97:21:97:23 | \\cA | RegExpConstant,RegExpEscape | -| regexp.cpp:98:21:98:25 | [\\cz] | RegExpCharacterClass | -| regexp.cpp:98:22:98:24 | \\cz | RegExpConstant,RegExpEscape | -| regexp.cpp:101:20:101:21 | \\0 | RegExpConstant,RegExpEscape | -| regexp.cpp:102:20:102:23 | [\\0] | RegExpCharacterClass | -| regexp.cpp:102:21:102:22 | \\0 | RegExpConstant,RegExpEscape | -| regexp.cpp:105:21:105:21 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:105:21:105:23 | a*? | RegExpStar | -| regexp.cpp:106:21:106:21 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:106:21:106:23 | b+? | RegExpPlus | -| regexp.cpp:107:21:107:21 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:107:21:107:23 | c?? | RegExpOpt | -| regexp.cpp:108:21:108:21 | d | RegExpConstant,RegExpNormalChar | -| regexp.cpp:108:21:108:27 | d{2,3}? | RegExpQuantifier | -| regexp.cpp:109:18:109:19 | \\f | RegExpConstant,RegExpEscape | -| regexp.cpp:109:18:109:21 | \\f\\v | RegExpSequence | -| regexp.cpp:109:20:109:21 | \\v | RegExpConstant,RegExpEscape | -| regexp.cpp:112:25:112:25 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:112:25:112:28 | a\\nb | RegExpSequence | -| regexp.cpp:112:26:112:27 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:112:28:112:28 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:113:37:113:37 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:113:37:113:40 | a\\nc | RegExpSequence | -| regexp.cpp:113:38:113:39 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:113:40:113:40 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:114:39:114:39 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:114:39:114:42 | a\\nc | RegExpSequence | -| regexp.cpp:114:40:114:41 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:114:42:114:42 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:115:38:115:38 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:115:38:115:41 | a\\nc | RegExpSequence | -| regexp.cpp:115:39:115:40 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:115:41:115:41 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:69:21:69:32 | [^[:digit:]] | RegExpCharacterClass | +| regexp.cpp:69:23:69:31 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:72:22:72:32 | [[:alpha:]] | RegExpCharacterClass | +| regexp.cpp:72:22:72:43 | [[:alpha:]][[:digit:]] | RegExpSequence | +| regexp.cpp:72:23:72:31 | [:alpha:] | RegExpNamedCharacterProperty | +| regexp.cpp:72:33:72:43 | [[:digit:]] | RegExpCharacterClass | +| regexp.cpp:72:34:72:42 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:75:22:75:41 | [[:alpha:][:digit:]] | RegExpCharacterClass | +| regexp.cpp:75:23:75:31 | [:alpha:] | RegExpNamedCharacterProperty | +| regexp.cpp:75:32:75:40 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:78:22:78:38 | [A-F[:digit:]a-f] | RegExpCharacterClass | +| regexp.cpp:78:23:78:23 | A | RegExpConstant,RegExpNormalChar | +| regexp.cpp:78:23:78:25 | A-F | RegExpCharacterRange | +| regexp.cpp:78:25:78:25 | F | RegExpConstant,RegExpNormalChar | +| regexp.cpp:78:26:78:34 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:78:35:78:35 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:78:35:78:37 | a-f | RegExpCharacterRange | +| regexp.cpp:78:37:78:37 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:81:27:81:33 | [[.a.]] | RegExpCharacterClass | +| regexp.cpp:81:28:81:32 | [.a.] | RegExpNamedCharacterProperty | +| regexp.cpp:82:27:82:39 | [A-F[.b.]a-f] | RegExpCharacterClass | +| regexp.cpp:82:28:82:28 | A | RegExpConstant,RegExpNormalChar | +| regexp.cpp:82:28:82:30 | A-F | RegExpCharacterRange | +| regexp.cpp:82:30:82:30 | F | RegExpConstant,RegExpNormalChar | +| regexp.cpp:82:31:82:35 | [.b.] | RegExpNamedCharacterProperty | +| regexp.cpp:82:36:82:36 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:82:36:82:38 | a-f | RegExpCharacterRange | +| regexp.cpp:82:38:82:38 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:85:28:85:34 | [[=a=]] | RegExpCharacterClass | +| regexp.cpp:85:29:85:33 | [=a=] | RegExpNamedCharacterProperty | +| regexp.cpp:86:28:86:40 | [A-F[=b=]a-f] | RegExpCharacterClass | +| regexp.cpp:86:29:86:29 | A | RegExpConstant,RegExpNormalChar | +| regexp.cpp:86:29:86:31 | A-F | RegExpCharacterRange | +| regexp.cpp:86:31:86:31 | F | RegExpConstant,RegExpNormalChar | +| regexp.cpp:86:32:86:36 | [=b=] | RegExpNamedCharacterProperty | +| regexp.cpp:86:37:86:37 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:86:37:86:39 | a-f | RegExpCharacterRange | +| regexp.cpp:86:39:86:39 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:89:22:89:30 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:92:19:92:24 | \\u0061 | RegExpConstant,RegExpEscape | +| regexp.cpp:95:19:95:22 | \\x61 | RegExpConstant,RegExpEscape | +| regexp.cpp:98:21:98:23 | \\cA | RegExpConstant,RegExpEscape | +| regexp.cpp:99:21:99:25 | [\\cz] | RegExpCharacterClass | +| regexp.cpp:99:22:99:24 | \\cz | RegExpConstant,RegExpEscape | +| regexp.cpp:102:20:102:21 | \\0 | RegExpConstant,RegExpEscape | +| regexp.cpp:103:20:103:23 | [\\0] | RegExpCharacterClass | +| regexp.cpp:103:21:103:22 | \\0 | RegExpConstant,RegExpEscape | +| regexp.cpp:106:21:106:21 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:106:21:106:23 | a*? | RegExpStar | +| regexp.cpp:107:21:107:21 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:107:21:107:23 | b+? | RegExpPlus | +| regexp.cpp:108:21:108:21 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:108:21:108:23 | c?? | RegExpOpt | +| regexp.cpp:109:21:109:21 | d | RegExpConstant,RegExpNormalChar | +| regexp.cpp:109:21:109:27 | d{2,3}? | RegExpQuantifier | +| regexp.cpp:110:18:110:19 | \\f | RegExpConstant,RegExpEscape | +| regexp.cpp:110:18:110:21 | \\f\\v | RegExpSequence | +| regexp.cpp:110:20:110:21 | \\v | RegExpConstant,RegExpEscape | +| regexp.cpp:113:25:113:25 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:113:25:113:28 | a\\nb | RegExpSequence | +| regexp.cpp:113:26:113:27 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:113:28:113:28 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:114:37:114:37 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:114:37:114:40 | a\\nc | RegExpSequence | +| regexp.cpp:114:38:114:39 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:114:40:114:40 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:115:39:115:39 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:115:39:115:42 | a\\nc | RegExpSequence | +| regexp.cpp:115:40:115:41 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:115:42:115:42 | c | RegExpConstant,RegExpNormalChar | | regexp.cpp:116:38:116:38 | a | RegExpConstant,RegExpNormalChar | | regexp.cpp:116:38:116:41 | a\\nc | RegExpSequence | | regexp.cpp:116:39:116:40 | \\n | RegExpConstant,RegExpEscape | | regexp.cpp:116:41:116:41 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:117:23:117:23 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:117:23:117:26 | a\\nc | RegExpSequence | -| regexp.cpp:117:24:117:25 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:117:26:117:26 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:118:26:118:26 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:118:26:118:29 | a\\nc | RegExpSequence | -| regexp.cpp:118:27:118:28 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:118:29:118:29 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:119:42:119:42 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:119:42:119:45 | a\\nc | RegExpSequence | -| regexp.cpp:119:43:119:44 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:119:45:119:45 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:120:41:120:41 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:120:41:120:44 | a\\nc | RegExpSequence | -| regexp.cpp:120:42:120:43 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:120:44:120:44 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:117:38:117:38 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:117:38:117:41 | a\\nc | RegExpSequence | +| regexp.cpp:117:39:117:40 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:117:41:117:41 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:118:23:118:23 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:118:23:118:26 | a\\nc | RegExpSequence | +| regexp.cpp:118:24:118:25 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:118:26:118:26 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:119:26:119:26 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:119:26:119:29 | a\\nc | RegExpSequence | +| regexp.cpp:119:27:119:28 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:119:29:119:29 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:120:42:120:42 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:120:42:120:45 | a\\nc | RegExpSequence | +| regexp.cpp:120:43:120:44 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:120:45:120:45 | c | RegExpConstant,RegExpNormalChar | | regexp.cpp:121:41:121:41 | a | RegExpConstant,RegExpNormalChar | | regexp.cpp:121:41:121:44 | a\\nc | RegExpSequence | | regexp.cpp:121:42:121:43 | \\n | RegExpConstant,RegExpEscape | | regexp.cpp:121:44:121:44 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:122:25:122:25 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:122:25:122:28 | a\\nc | RegExpSequence | -| regexp.cpp:122:26:122:27 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:122:28:122:28 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:123:29:123:29 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:123:29:123:32 | a\\nc | RegExpSequence | -| regexp.cpp:123:30:123:31 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:123:32:123:32 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:122:41:122:41 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:122:41:122:44 | a\\nc | RegExpSequence | +| regexp.cpp:122:42:122:43 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:122:44:122:44 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:123:25:123:25 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:123:25:123:28 | a\\nc | RegExpSequence | +| regexp.cpp:123:26:123:27 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:123:28:123:28 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:124:29:124:29 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:124:29:124:32 | a\\nc | RegExpSequence | +| regexp.cpp:124:30:124:31 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:124:32:124:32 | c | RegExpConstant,RegExpNormalChar | regExpNormalCharValue | regexp.cpp:19:19:19:21 | abc | abc | | regexp.cpp:22:20:22:20 | a | a | @@ -302,63 +304,63 @@ regExpNormalCharValue | regexp.cpp:62:25:62:25 | b | b | | regexp.cpp:68:22:68:22 | a | a | | regexp.cpp:68:24:68:24 | f | f | -| regexp.cpp:77:23:77:23 | A | A | -| regexp.cpp:77:25:77:25 | F | F | -| regexp.cpp:77:35:77:35 | a | a | -| regexp.cpp:77:37:77:37 | f | f | -| regexp.cpp:81:28:81:28 | A | A | -| regexp.cpp:81:30:81:30 | F | F | -| regexp.cpp:81:36:81:36 | a | a | -| regexp.cpp:81:38:81:38 | f | f | -| regexp.cpp:85:29:85:29 | A | A | -| regexp.cpp:85:31:85:31 | F | F | -| regexp.cpp:85:37:85:37 | a | a | -| regexp.cpp:85:39:85:39 | f | f | -| regexp.cpp:91:19:91:24 | \\u0061 | a | -| regexp.cpp:94:19:94:22 | \\x61 | a | -| regexp.cpp:97:21:97:23 | \\cA | \u0001 | -| regexp.cpp:98:22:98:24 | \\cz | \u001a | -| regexp.cpp:101:20:101:21 | \\0 | \u0000 | -| regexp.cpp:102:21:102:22 | \\0 | \u0000 | -| regexp.cpp:105:21:105:21 | a | a | -| regexp.cpp:106:21:106:21 | b | b | -| regexp.cpp:107:21:107:21 | c | c | -| regexp.cpp:108:21:108:21 | d | d | -| regexp.cpp:109:18:109:19 | \\f | \u000c | -| regexp.cpp:109:20:109:21 | \\v | \u000b | -| regexp.cpp:112:25:112:25 | a | a | -| regexp.cpp:112:26:112:27 | \\n | \n | -| regexp.cpp:112:28:112:28 | b | b | -| regexp.cpp:113:37:113:37 | a | a | -| regexp.cpp:113:38:113:39 | \\n | \n | -| regexp.cpp:113:40:113:40 | c | c | -| regexp.cpp:114:39:114:39 | a | a | -| regexp.cpp:114:40:114:41 | \\n | \n | -| regexp.cpp:114:42:114:42 | c | c | -| regexp.cpp:115:38:115:38 | a | a | -| regexp.cpp:115:39:115:40 | \\n | \n | -| regexp.cpp:115:41:115:41 | c | c | +| regexp.cpp:78:23:78:23 | A | A | +| regexp.cpp:78:25:78:25 | F | F | +| regexp.cpp:78:35:78:35 | a | a | +| regexp.cpp:78:37:78:37 | f | f | +| regexp.cpp:82:28:82:28 | A | A | +| regexp.cpp:82:30:82:30 | F | F | +| regexp.cpp:82:36:82:36 | a | a | +| regexp.cpp:82:38:82:38 | f | f | +| regexp.cpp:86:29:86:29 | A | A | +| regexp.cpp:86:31:86:31 | F | F | +| regexp.cpp:86:37:86:37 | a | a | +| regexp.cpp:86:39:86:39 | f | f | +| regexp.cpp:92:19:92:24 | \\u0061 | a | +| regexp.cpp:95:19:95:22 | \\x61 | a | +| regexp.cpp:98:21:98:23 | \\cA | \u0001 | +| regexp.cpp:99:22:99:24 | \\cz | \u001a | +| regexp.cpp:102:20:102:21 | \\0 | \u0000 | +| regexp.cpp:103:21:103:22 | \\0 | \u0000 | +| regexp.cpp:106:21:106:21 | a | a | +| regexp.cpp:107:21:107:21 | b | b | +| regexp.cpp:108:21:108:21 | c | c | +| regexp.cpp:109:21:109:21 | d | d | +| regexp.cpp:110:18:110:19 | \\f | \u000c | +| regexp.cpp:110:20:110:21 | \\v | \u000b | +| regexp.cpp:113:25:113:25 | a | a | +| regexp.cpp:113:26:113:27 | \\n | \n | +| regexp.cpp:113:28:113:28 | b | b | +| regexp.cpp:114:37:114:37 | a | a | +| regexp.cpp:114:38:114:39 | \\n | \n | +| regexp.cpp:114:40:114:40 | c | c | +| regexp.cpp:115:39:115:39 | a | a | +| regexp.cpp:115:40:115:41 | \\n | \n | +| regexp.cpp:115:42:115:42 | c | c | | regexp.cpp:116:38:116:38 | a | a | | regexp.cpp:116:39:116:40 | \\n | \n | | regexp.cpp:116:41:116:41 | c | c | -| regexp.cpp:117:23:117:23 | a | a | -| regexp.cpp:117:24:117:25 | \\n | \n | -| regexp.cpp:117:26:117:26 | c | c | -| regexp.cpp:118:26:118:26 | a | a | -| regexp.cpp:118:27:118:28 | \\n | \n | -| regexp.cpp:118:29:118:29 | c | c | -| regexp.cpp:119:42:119:42 | a | a | -| regexp.cpp:119:43:119:44 | \\n | \n | -| regexp.cpp:119:45:119:45 | c | c | -| regexp.cpp:120:41:120:41 | a | a | -| regexp.cpp:120:42:120:43 | \\n | \n | -| regexp.cpp:120:44:120:44 | c | c | +| regexp.cpp:117:38:117:38 | a | a | +| regexp.cpp:117:39:117:40 | \\n | \n | +| regexp.cpp:117:41:117:41 | c | c | +| regexp.cpp:118:23:118:23 | a | a | +| regexp.cpp:118:24:118:25 | \\n | \n | +| regexp.cpp:118:26:118:26 | c | c | +| regexp.cpp:119:26:119:26 | a | a | +| regexp.cpp:119:27:119:28 | \\n | \n | +| regexp.cpp:119:29:119:29 | c | c | +| regexp.cpp:120:42:120:42 | a | a | +| regexp.cpp:120:43:120:44 | \\n | \n | +| regexp.cpp:120:45:120:45 | c | c | | regexp.cpp:121:41:121:41 | a | a | | regexp.cpp:121:42:121:43 | \\n | \n | | regexp.cpp:121:44:121:44 | c | c | -| regexp.cpp:122:25:122:25 | a | a | -| regexp.cpp:122:26:122:27 | \\n | \n | -| regexp.cpp:122:28:122:28 | c | c | -| regexp.cpp:123:29:123:29 | a | a | -| regexp.cpp:123:30:123:31 | \\n | \n | -| regexp.cpp:123:32:123:32 | c | c | +| regexp.cpp:122:41:122:41 | a | a | +| regexp.cpp:122:42:122:43 | \\n | \n | +| regexp.cpp:122:44:122:44 | c | c | +| regexp.cpp:123:25:123:25 | a | a | +| regexp.cpp:123:26:123:27 | \\n | \n | +| regexp.cpp:123:28:123:28 | c | c | +| regexp.cpp:124:29:124:29 | a | a | +| regexp.cpp:124:30:124:31 | \\n | \n | +| regexp.cpp:124:32:124:32 | c | c | From c4c66676e82727a9ba5e0323a88f2965676beb7a Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 28 Aug 2026 17:03:31 +0200 Subject: [PATCH 0578/2098] Docs: keep beta marker on Apple Silicon Restore the "currently in beta" marker on the Apple Silicon footnote while keeping the Rosetta 2 guidance, so the note now states both the beta status and when Rosetta 2 is required. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- docs/codeql/reusables/supported-platforms.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/codeql/reusables/supported-platforms.rst b/docs/codeql/reusables/supported-platforms.rst index 2944d8e6cc0a..c12b89fc37e6 100644 --- a/docs/codeql/reusables/supported-platforms.rst +++ b/docs/codeql/reusables/supported-platforms.rst @@ -19,4 +19,4 @@ .. container:: footnote-group .. [1] Support for Linux on arm64 is currently in beta. - .. [2] On Apple Silicon, building your code during analysis requires Rosetta 2; analyzing an interpreted language or using build mode ``none`` runs natively. + .. [2] Support for Apple Silicon is currently in beta. Building your code during analysis requires Rosetta 2; analyzing an interpreted language or using build mode ``none`` runs natively. From 7732801d6d07784043dd0b9d0c1ea9fa4236b4a9 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 28 Aug 2026 17:11:33 +0200 Subject: [PATCH 0579/2098] C++: Add another POSIX collating symbol test case --- .../library-tests/regex/locations.expected | 49 ++-- .../test/library-tests/regex/parse.expected | 93 +++---- .../regex/rawstringliteral.expected | 12 +- cpp/ql/test/library-tests/regex/regexp.cpp | 1 + .../test/library-tests/regex/regexp.expected | 234 +++++++++--------- 5 files changed, 199 insertions(+), 190 deletions(-) diff --git a/cpp/ql/test/library-tests/regex/locations.expected b/cpp/ql/test/library-tests/regex/locations.expected index 3eaa0b2d8155..2b1d61175c94 100644 --- a/cpp/ql/test/library-tests/regex/locations.expected +++ b/cpp/ql/test/library-tests/regex/locations.expected @@ -36,29 +36,30 @@ | regexp.cpp:78:22:78:38 | [A-F[:digit:]a-f] | regexp.cpp | 78 | 22 | 78 | 38 | | regexp.cpp:81:27:81:33 | [[.a.]] | regexp.cpp | 81 | 27 | 81 | 33 | | regexp.cpp:82:27:82:39 | [A-F[.b.]a-f] | regexp.cpp | 82 | 27 | 82 | 39 | -| regexp.cpp:85:28:85:34 | [[=a=]] | regexp.cpp | 85 | 28 | 85 | 34 | -| regexp.cpp:86:28:86:40 | [A-F[=b=]a-f] | regexp.cpp | 86 | 28 | 86 | 40 | -| regexp.cpp:89:22:89:30 | [:digit:] | regexp.cpp | 89 | 22 | 89 | 30 | -| regexp.cpp:92:19:92:24 | \\u0061 | regexp.cpp | 92 | 19 | 92 | 24 | -| regexp.cpp:95:19:95:22 | \\x61 | regexp.cpp | 95 | 19 | 95 | 22 | -| regexp.cpp:98:21:98:23 | \\cA | regexp.cpp | 98 | 21 | 98 | 23 | -| regexp.cpp:99:21:99:25 | [\\cz] | regexp.cpp | 99 | 21 | 99 | 25 | -| regexp.cpp:102:20:102:21 | \\0 | regexp.cpp | 102 | 20 | 102 | 21 | -| regexp.cpp:103:20:103:23 | [\\0] | regexp.cpp | 103 | 20 | 103 | 23 | -| regexp.cpp:106:21:106:23 | a*? | regexp.cpp | 106 | 21 | 106 | 23 | -| regexp.cpp:107:21:107:23 | b+? | regexp.cpp | 107 | 21 | 107 | 23 | -| regexp.cpp:108:21:108:23 | c?? | regexp.cpp | 108 | 21 | 108 | 23 | -| regexp.cpp:109:21:109:27 | d{2,3}? | regexp.cpp | 109 | 21 | 109 | 27 | -| regexp.cpp:110:18:110:21 | \\f\\v | regexp.cpp | 110 | 18 | 110 | 21 | -| regexp.cpp:113:25:113:28 | a\\nb | regexp.cpp | 113 | 25 | 113 | 28 | -| regexp.cpp:114:37:114:40 | a\\nc | regexp.cpp | 114 | 37 | 114 | 40 | -| regexp.cpp:115:39:115:42 | a\\nc | regexp.cpp | 115 | 39 | 115 | 42 | -| regexp.cpp:116:38:116:41 | a\\nc | regexp.cpp | 116 | 38 | 116 | 41 | +| regexp.cpp:83:27:83:34 | [[.ch.]] | regexp.cpp | 83 | 27 | 83 | 34 | +| regexp.cpp:86:28:86:34 | [[=a=]] | regexp.cpp | 86 | 28 | 86 | 34 | +| regexp.cpp:87:28:87:40 | [A-F[=b=]a-f] | regexp.cpp | 87 | 28 | 87 | 40 | +| regexp.cpp:90:22:90:30 | [:digit:] | regexp.cpp | 90 | 22 | 90 | 30 | +| regexp.cpp:93:19:93:24 | \\u0061 | regexp.cpp | 93 | 19 | 93 | 24 | +| regexp.cpp:96:19:96:22 | \\x61 | regexp.cpp | 96 | 19 | 96 | 22 | +| regexp.cpp:99:21:99:23 | \\cA | regexp.cpp | 99 | 21 | 99 | 23 | +| regexp.cpp:100:21:100:25 | [\\cz] | regexp.cpp | 100 | 21 | 100 | 25 | +| regexp.cpp:103:20:103:21 | \\0 | regexp.cpp | 103 | 20 | 103 | 21 | +| regexp.cpp:104:20:104:23 | [\\0] | regexp.cpp | 104 | 20 | 104 | 23 | +| regexp.cpp:107:21:107:23 | a*? | regexp.cpp | 107 | 21 | 107 | 23 | +| regexp.cpp:108:21:108:23 | b+? | regexp.cpp | 108 | 21 | 108 | 23 | +| regexp.cpp:109:21:109:23 | c?? | regexp.cpp | 109 | 21 | 109 | 23 | +| regexp.cpp:110:21:110:27 | d{2,3}? | regexp.cpp | 110 | 21 | 110 | 27 | +| regexp.cpp:111:18:111:21 | \\f\\v | regexp.cpp | 111 | 18 | 111 | 21 | +| regexp.cpp:114:25:114:28 | a\\nb | regexp.cpp | 114 | 25 | 114 | 28 | +| regexp.cpp:115:37:115:40 | a\\nc | regexp.cpp | 115 | 37 | 115 | 40 | +| regexp.cpp:116:39:116:42 | a\\nc | regexp.cpp | 116 | 39 | 116 | 42 | | regexp.cpp:117:38:117:41 | a\\nc | regexp.cpp | 117 | 38 | 117 | 41 | -| regexp.cpp:118:23:118:26 | a\\nc | regexp.cpp | 118 | 23 | 118 | 26 | -| regexp.cpp:119:26:119:29 | a\\nc | regexp.cpp | 119 | 26 | 119 | 29 | -| regexp.cpp:120:42:120:45 | a\\nc | regexp.cpp | 120 | 42 | 120 | 45 | -| regexp.cpp:121:41:121:44 | a\\nc | regexp.cpp | 121 | 41 | 121 | 44 | +| regexp.cpp:118:38:118:41 | a\\nc | regexp.cpp | 118 | 38 | 118 | 41 | +| regexp.cpp:119:23:119:26 | a\\nc | regexp.cpp | 119 | 23 | 119 | 26 | +| regexp.cpp:120:26:120:29 | a\\nc | regexp.cpp | 120 | 26 | 120 | 29 | +| regexp.cpp:121:42:121:45 | a\\nc | regexp.cpp | 121 | 42 | 121 | 45 | | regexp.cpp:122:41:122:44 | a\\nc | regexp.cpp | 122 | 41 | 122 | 44 | -| regexp.cpp:123:25:123:28 | a\\nc | regexp.cpp | 123 | 25 | 123 | 28 | -| regexp.cpp:124:29:124:32 | a\\nc | regexp.cpp | 124 | 29 | 124 | 32 | +| regexp.cpp:123:41:123:44 | a\\nc | regexp.cpp | 123 | 41 | 123 | 44 | +| regexp.cpp:124:25:124:28 | a\\nc | regexp.cpp | 124 | 25 | 124 | 28 | +| regexp.cpp:125:29:125:32 | a\\nc | regexp.cpp | 125 | 29 | 125 | 32 | diff --git a/cpp/ql/test/library-tests/regex/parse.expected b/cpp/ql/test/library-tests/regex/parse.expected index 4d31f87d50da..47cef58ceb61 100644 --- a/cpp/ql/test/library-tests/regex/parse.expected +++ b/cpp/ql/test/library-tests/regex/parse.expected @@ -435,103 +435,97 @@ regexp.cpp: # 82| [RegExpConstant, RegExpNormalChar] f -# 85| [RegExpCharacterClass] [[=a=]] +# 83| [RegExpCharacterClass] [[.ch.]] +#-----| 0 -> [RegExpNamedCharacterProperty] [.ch.] + +# 83| [RegExpNamedCharacterProperty] [.ch.] + +# 86| [RegExpCharacterClass] [[=a=]] #-----| 0 -> [RegExpNamedCharacterProperty] [=a=] -# 85| [RegExpNamedCharacterProperty] [=a=] +# 86| [RegExpNamedCharacterProperty] [=a=] -# 86| [RegExpCharacterClass] [A-F[=b=]a-f] +# 87| [RegExpCharacterClass] [A-F[=b=]a-f] #-----| 0 -> [RegExpCharacterRange] A-F #-----| 1 -> [RegExpNamedCharacterProperty] [=b=] #-----| 2 -> [RegExpCharacterRange] a-f -# 86| [RegExpConstant, RegExpNormalChar] A +# 87| [RegExpConstant, RegExpNormalChar] A -# 86| [RegExpCharacterRange] A-F +# 87| [RegExpCharacterRange] A-F #-----| 0 -> [RegExpConstant, RegExpNormalChar] A #-----| 1 -> [RegExpConstant, RegExpNormalChar] F -# 86| [RegExpConstant, RegExpNormalChar] F +# 87| [RegExpConstant, RegExpNormalChar] F -# 86| [RegExpNamedCharacterProperty] [=b=] +# 87| [RegExpNamedCharacterProperty] [=b=] -# 86| [RegExpConstant, RegExpNormalChar] a +# 87| [RegExpConstant, RegExpNormalChar] a -# 86| [RegExpCharacterRange] a-f +# 87| [RegExpCharacterRange] a-f #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] f -# 86| [RegExpConstant, RegExpNormalChar] f +# 87| [RegExpConstant, RegExpNormalChar] f -# 89| [RegExpNamedCharacterProperty] [:digit:] +# 90| [RegExpNamedCharacterProperty] [:digit:] -# 92| [RegExpConstant, RegExpEscape] \u0061 +# 93| [RegExpConstant, RegExpEscape] \u0061 -# 95| [RegExpConstant, RegExpEscape] \x61 +# 96| [RegExpConstant, RegExpEscape] \x61 -# 98| [RegExpConstant, RegExpEscape] \cA +# 99| [RegExpConstant, RegExpEscape] \cA -# 99| [RegExpCharacterClass] [\cz] +# 100| [RegExpCharacterClass] [\cz] #-----| 0 -> [RegExpConstant, RegExpEscape] \cz -# 99| [RegExpConstant, RegExpEscape] \cz +# 100| [RegExpConstant, RegExpEscape] \cz -# 102| [RegExpConstant, RegExpEscape] \0 +# 103| [RegExpConstant, RegExpEscape] \0 -# 103| [RegExpCharacterClass] [\0] +# 104| [RegExpCharacterClass] [\0] #-----| 0 -> [RegExpConstant, RegExpEscape] \0 -# 103| [RegExpConstant, RegExpEscape] \0 +# 104| [RegExpConstant, RegExpEscape] \0 -# 106| [RegExpConstant, RegExpNormalChar] a +# 107| [RegExpConstant, RegExpNormalChar] a -# 106| [RegExpStar] a*? +# 107| [RegExpStar] a*? #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 107| [RegExpConstant, RegExpNormalChar] b +# 108| [RegExpConstant, RegExpNormalChar] b -# 107| [RegExpPlus] b+? +# 108| [RegExpPlus] b+? #-----| 0 -> [RegExpConstant, RegExpNormalChar] b -# 108| [RegExpConstant, RegExpNormalChar] c +# 109| [RegExpConstant, RegExpNormalChar] c -# 108| [RegExpOpt] c?? +# 109| [RegExpOpt] c?? #-----| 0 -> [RegExpConstant, RegExpNormalChar] c -# 109| [RegExpConstant, RegExpNormalChar] d +# 110| [RegExpConstant, RegExpNormalChar] d -# 109| [RegExpQuantifier] d{2,3}? +# 110| [RegExpQuantifier] d{2,3}? #-----| 0 -> [RegExpConstant, RegExpNormalChar] d -# 110| [RegExpConstant, RegExpEscape] \f +# 111| [RegExpConstant, RegExpEscape] \f -# 110| [RegExpSequence] \f\v +# 111| [RegExpSequence] \f\v #-----| 0 -> [RegExpConstant, RegExpEscape] \f #-----| 1 -> [RegExpConstant, RegExpEscape] \v -# 110| [RegExpConstant, RegExpEscape] \v - -# 113| [RegExpConstant, RegExpNormalChar] a - -# 113| [RegExpSequence] a\nb -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] b - -# 113| [RegExpConstant, RegExpEscape] \n - -# 113| [RegExpConstant, RegExpNormalChar] b +# 111| [RegExpConstant, RegExpEscape] \v # 114| [RegExpConstant, RegExpNormalChar] a -# 114| [RegExpSequence] a\nc +# 114| [RegExpSequence] a\nb #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c +#-----| 2 -> [RegExpConstant, RegExpNormalChar] b # 114| [RegExpConstant, RegExpEscape] \n -# 114| [RegExpConstant, RegExpNormalChar] c +# 114| [RegExpConstant, RegExpNormalChar] b # 115| [RegExpConstant, RegExpNormalChar] a @@ -642,3 +636,14 @@ regexp.cpp: # 124| [RegExpConstant, RegExpEscape] \n # 124| [RegExpConstant, RegExpNormalChar] c + +# 125| [RegExpConstant, RegExpNormalChar] a + +# 125| [RegExpSequence] a\nc +#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 1 -> [RegExpConstant, RegExpEscape] \n +#-----| 2 -> [RegExpConstant, RegExpNormalChar] c + +# 125| [RegExpConstant, RegExpEscape] \n + +# 125| [RegExpConstant, RegExpNormalChar] c diff --git a/cpp/ql/test/library-tests/regex/rawstringliteral.expected b/cpp/ql/test/library-tests/regex/rawstringliteral.expected index 4602a4af9f8d..7eae0eaee6d9 100644 --- a/cpp/ql/test/library-tests/regex/rawstringliteral.expected +++ b/cpp/ql/test/library-tests/regex/rawstringliteral.expected @@ -1,7 +1,7 @@ -| regexp.cpp:118:20:118:28 | a\\nc | -| regexp.cpp:119:22:119:31 | a\\nc | -| regexp.cpp:120:37:120:47 | a\\nc | -| regexp.cpp:121:37:121:46 | a\\nc | +| regexp.cpp:119:20:119:28 | a\\nc | +| regexp.cpp:120:22:120:31 | a\\nc | +| regexp.cpp:121:37:121:47 | a\\nc | | regexp.cpp:122:37:122:46 | a\\nc | -| regexp.cpp:123:21:123:31 | a\\nc | -| regexp.cpp:124:23:124:37 | a\\nc | +| regexp.cpp:123:37:123:46 | a\\nc | +| regexp.cpp:124:21:124:31 | a\\nc | +| regexp.cpp:125:23:125:37 | a\\nc | diff --git a/cpp/ql/test/library-tests/regex/regexp.cpp b/cpp/ql/test/library-tests/regex/regexp.cpp index d15e1fc1736b..6c08079bf762 100644 --- a/cpp/ql/test/library-tests/regex/regexp.cpp +++ b/cpp/ql/test/library-tests/regex/regexp.cpp @@ -80,6 +80,7 @@ std::regex r_posix3("[A-F[:digit:]a-f]"); // POSIX collating symbols std::regex r_posix_coll1("[[.a.]]"); std::regex r_posix_coll2("[A-F[.b.]a-f]"); +std::regex r_posix_coll3("[[.ch.]]"); // POSIX equivalence classes std::regex r_posix_equiv1("[[=a=]]"); diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index 838a960ef298..bf319f395217 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -162,84 +162,86 @@ term | regexp.cpp:82:36:82:36 | a | RegExpConstant,RegExpNormalChar | | regexp.cpp:82:36:82:38 | a-f | RegExpCharacterRange | | regexp.cpp:82:38:82:38 | f | RegExpConstant,RegExpNormalChar | -| regexp.cpp:85:28:85:34 | [[=a=]] | RegExpCharacterClass | -| regexp.cpp:85:29:85:33 | [=a=] | RegExpNamedCharacterProperty | -| regexp.cpp:86:28:86:40 | [A-F[=b=]a-f] | RegExpCharacterClass | -| regexp.cpp:86:29:86:29 | A | RegExpConstant,RegExpNormalChar | -| regexp.cpp:86:29:86:31 | A-F | RegExpCharacterRange | -| regexp.cpp:86:31:86:31 | F | RegExpConstant,RegExpNormalChar | -| regexp.cpp:86:32:86:36 | [=b=] | RegExpNamedCharacterProperty | -| regexp.cpp:86:37:86:37 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:86:37:86:39 | a-f | RegExpCharacterRange | -| regexp.cpp:86:39:86:39 | f | RegExpConstant,RegExpNormalChar | -| regexp.cpp:89:22:89:30 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.cpp:92:19:92:24 | \\u0061 | RegExpConstant,RegExpEscape | -| regexp.cpp:95:19:95:22 | \\x61 | RegExpConstant,RegExpEscape | -| regexp.cpp:98:21:98:23 | \\cA | RegExpConstant,RegExpEscape | -| regexp.cpp:99:21:99:25 | [\\cz] | RegExpCharacterClass | -| regexp.cpp:99:22:99:24 | \\cz | RegExpConstant,RegExpEscape | -| regexp.cpp:102:20:102:21 | \\0 | RegExpConstant,RegExpEscape | -| regexp.cpp:103:20:103:23 | [\\0] | RegExpCharacterClass | -| regexp.cpp:103:21:103:22 | \\0 | RegExpConstant,RegExpEscape | -| regexp.cpp:106:21:106:21 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:106:21:106:23 | a*? | RegExpStar | -| regexp.cpp:107:21:107:21 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:107:21:107:23 | b+? | RegExpPlus | -| regexp.cpp:108:21:108:21 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:108:21:108:23 | c?? | RegExpOpt | -| regexp.cpp:109:21:109:21 | d | RegExpConstant,RegExpNormalChar | -| regexp.cpp:109:21:109:27 | d{2,3}? | RegExpQuantifier | -| regexp.cpp:110:18:110:19 | \\f | RegExpConstant,RegExpEscape | -| regexp.cpp:110:18:110:21 | \\f\\v | RegExpSequence | -| regexp.cpp:110:20:110:21 | \\v | RegExpConstant,RegExpEscape | -| regexp.cpp:113:25:113:25 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:113:25:113:28 | a\\nb | RegExpSequence | -| regexp.cpp:113:26:113:27 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:113:28:113:28 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:114:37:114:37 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:114:37:114:40 | a\\nc | RegExpSequence | -| regexp.cpp:114:38:114:39 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:114:40:114:40 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:115:39:115:39 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:115:39:115:42 | a\\nc | RegExpSequence | -| regexp.cpp:115:40:115:41 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:115:42:115:42 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:116:38:116:38 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:116:38:116:41 | a\\nc | RegExpSequence | -| regexp.cpp:116:39:116:40 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:116:41:116:41 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:83:27:83:34 | [[.ch.]] | RegExpCharacterClass | +| regexp.cpp:83:28:83:33 | [.ch.] | RegExpNamedCharacterProperty | +| regexp.cpp:86:28:86:34 | [[=a=]] | RegExpCharacterClass | +| regexp.cpp:86:29:86:33 | [=a=] | RegExpNamedCharacterProperty | +| regexp.cpp:87:28:87:40 | [A-F[=b=]a-f] | RegExpCharacterClass | +| regexp.cpp:87:29:87:29 | A | RegExpConstant,RegExpNormalChar | +| regexp.cpp:87:29:87:31 | A-F | RegExpCharacterRange | +| regexp.cpp:87:31:87:31 | F | RegExpConstant,RegExpNormalChar | +| regexp.cpp:87:32:87:36 | [=b=] | RegExpNamedCharacterProperty | +| regexp.cpp:87:37:87:37 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:87:37:87:39 | a-f | RegExpCharacterRange | +| regexp.cpp:87:39:87:39 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:90:22:90:30 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:93:19:93:24 | \\u0061 | RegExpConstant,RegExpEscape | +| regexp.cpp:96:19:96:22 | \\x61 | RegExpConstant,RegExpEscape | +| regexp.cpp:99:21:99:23 | \\cA | RegExpConstant,RegExpEscape | +| regexp.cpp:100:21:100:25 | [\\cz] | RegExpCharacterClass | +| regexp.cpp:100:22:100:24 | \\cz | RegExpConstant,RegExpEscape | +| regexp.cpp:103:20:103:21 | \\0 | RegExpConstant,RegExpEscape | +| regexp.cpp:104:20:104:23 | [\\0] | RegExpCharacterClass | +| regexp.cpp:104:21:104:22 | \\0 | RegExpConstant,RegExpEscape | +| regexp.cpp:107:21:107:21 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:107:21:107:23 | a*? | RegExpStar | +| regexp.cpp:108:21:108:21 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:108:21:108:23 | b+? | RegExpPlus | +| regexp.cpp:109:21:109:21 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:109:21:109:23 | c?? | RegExpOpt | +| regexp.cpp:110:21:110:21 | d | RegExpConstant,RegExpNormalChar | +| regexp.cpp:110:21:110:27 | d{2,3}? | RegExpQuantifier | +| regexp.cpp:111:18:111:19 | \\f | RegExpConstant,RegExpEscape | +| regexp.cpp:111:18:111:21 | \\f\\v | RegExpSequence | +| regexp.cpp:111:20:111:21 | \\v | RegExpConstant,RegExpEscape | +| regexp.cpp:114:25:114:25 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:114:25:114:28 | a\\nb | RegExpSequence | +| regexp.cpp:114:26:114:27 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:114:28:114:28 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:115:37:115:37 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:115:37:115:40 | a\\nc | RegExpSequence | +| regexp.cpp:115:38:115:39 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:115:40:115:40 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:116:39:116:39 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:116:39:116:42 | a\\nc | RegExpSequence | +| regexp.cpp:116:40:116:41 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:116:42:116:42 | c | RegExpConstant,RegExpNormalChar | | regexp.cpp:117:38:117:38 | a | RegExpConstant,RegExpNormalChar | | regexp.cpp:117:38:117:41 | a\\nc | RegExpSequence | | regexp.cpp:117:39:117:40 | \\n | RegExpConstant,RegExpEscape | | regexp.cpp:117:41:117:41 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:118:23:118:23 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:118:23:118:26 | a\\nc | RegExpSequence | -| regexp.cpp:118:24:118:25 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:118:26:118:26 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:119:26:119:26 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:119:26:119:29 | a\\nc | RegExpSequence | -| regexp.cpp:119:27:119:28 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:119:29:119:29 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:120:42:120:42 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:120:42:120:45 | a\\nc | RegExpSequence | -| regexp.cpp:120:43:120:44 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:120:45:120:45 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:121:41:121:41 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:121:41:121:44 | a\\nc | RegExpSequence | -| regexp.cpp:121:42:121:43 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:121:44:121:44 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:118:38:118:38 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:118:38:118:41 | a\\nc | RegExpSequence | +| regexp.cpp:118:39:118:40 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:118:41:118:41 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:119:23:119:23 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:119:23:119:26 | a\\nc | RegExpSequence | +| regexp.cpp:119:24:119:25 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:119:26:119:26 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:120:26:120:26 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:120:26:120:29 | a\\nc | RegExpSequence | +| regexp.cpp:120:27:120:28 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:120:29:120:29 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:121:42:121:42 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:121:42:121:45 | a\\nc | RegExpSequence | +| regexp.cpp:121:43:121:44 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:121:45:121:45 | c | RegExpConstant,RegExpNormalChar | | regexp.cpp:122:41:122:41 | a | RegExpConstant,RegExpNormalChar | | regexp.cpp:122:41:122:44 | a\\nc | RegExpSequence | | regexp.cpp:122:42:122:43 | \\n | RegExpConstant,RegExpEscape | | regexp.cpp:122:44:122:44 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:123:25:123:25 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:123:25:123:28 | a\\nc | RegExpSequence | -| regexp.cpp:123:26:123:27 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:123:28:123:28 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:124:29:124:29 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:124:29:124:32 | a\\nc | RegExpSequence | -| regexp.cpp:124:30:124:31 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:124:32:124:32 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:123:41:123:41 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:123:41:123:44 | a\\nc | RegExpSequence | +| regexp.cpp:123:42:123:43 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:123:44:123:44 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:124:25:124:25 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:124:25:124:28 | a\\nc | RegExpSequence | +| regexp.cpp:124:26:124:27 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:124:28:124:28 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:125:29:125:29 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:125:29:125:32 | a\\nc | RegExpSequence | +| regexp.cpp:125:30:125:31 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:125:32:125:32 | c | RegExpConstant,RegExpNormalChar | regExpNormalCharValue | regexp.cpp:19:19:19:21 | abc | abc | | regexp.cpp:22:20:22:20 | a | a | @@ -312,55 +314,55 @@ regExpNormalCharValue | regexp.cpp:82:30:82:30 | F | F | | regexp.cpp:82:36:82:36 | a | a | | regexp.cpp:82:38:82:38 | f | f | -| regexp.cpp:86:29:86:29 | A | A | -| regexp.cpp:86:31:86:31 | F | F | -| regexp.cpp:86:37:86:37 | a | a | -| regexp.cpp:86:39:86:39 | f | f | -| regexp.cpp:92:19:92:24 | \\u0061 | a | -| regexp.cpp:95:19:95:22 | \\x61 | a | -| regexp.cpp:98:21:98:23 | \\cA | \u0001 | -| regexp.cpp:99:22:99:24 | \\cz | \u001a | -| regexp.cpp:102:20:102:21 | \\0 | \u0000 | -| regexp.cpp:103:21:103:22 | \\0 | \u0000 | -| regexp.cpp:106:21:106:21 | a | a | -| regexp.cpp:107:21:107:21 | b | b | -| regexp.cpp:108:21:108:21 | c | c | -| regexp.cpp:109:21:109:21 | d | d | -| regexp.cpp:110:18:110:19 | \\f | \u000c | -| regexp.cpp:110:20:110:21 | \\v | \u000b | -| regexp.cpp:113:25:113:25 | a | a | -| regexp.cpp:113:26:113:27 | \\n | \n | -| regexp.cpp:113:28:113:28 | b | b | -| regexp.cpp:114:37:114:37 | a | a | -| regexp.cpp:114:38:114:39 | \\n | \n | -| regexp.cpp:114:40:114:40 | c | c | -| regexp.cpp:115:39:115:39 | a | a | -| regexp.cpp:115:40:115:41 | \\n | \n | -| regexp.cpp:115:42:115:42 | c | c | -| regexp.cpp:116:38:116:38 | a | a | -| regexp.cpp:116:39:116:40 | \\n | \n | -| regexp.cpp:116:41:116:41 | c | c | +| regexp.cpp:87:29:87:29 | A | A | +| regexp.cpp:87:31:87:31 | F | F | +| regexp.cpp:87:37:87:37 | a | a | +| regexp.cpp:87:39:87:39 | f | f | +| regexp.cpp:93:19:93:24 | \\u0061 | a | +| regexp.cpp:96:19:96:22 | \\x61 | a | +| regexp.cpp:99:21:99:23 | \\cA | \u0001 | +| regexp.cpp:100:22:100:24 | \\cz | \u001a | +| regexp.cpp:103:20:103:21 | \\0 | \u0000 | +| regexp.cpp:104:21:104:22 | \\0 | \u0000 | +| regexp.cpp:107:21:107:21 | a | a | +| regexp.cpp:108:21:108:21 | b | b | +| regexp.cpp:109:21:109:21 | c | c | +| regexp.cpp:110:21:110:21 | d | d | +| regexp.cpp:111:18:111:19 | \\f | \u000c | +| regexp.cpp:111:20:111:21 | \\v | \u000b | +| regexp.cpp:114:25:114:25 | a | a | +| regexp.cpp:114:26:114:27 | \\n | \n | +| regexp.cpp:114:28:114:28 | b | b | +| regexp.cpp:115:37:115:37 | a | a | +| regexp.cpp:115:38:115:39 | \\n | \n | +| regexp.cpp:115:40:115:40 | c | c | +| regexp.cpp:116:39:116:39 | a | a | +| regexp.cpp:116:40:116:41 | \\n | \n | +| regexp.cpp:116:42:116:42 | c | c | | regexp.cpp:117:38:117:38 | a | a | | regexp.cpp:117:39:117:40 | \\n | \n | | regexp.cpp:117:41:117:41 | c | c | -| regexp.cpp:118:23:118:23 | a | a | -| regexp.cpp:118:24:118:25 | \\n | \n | -| regexp.cpp:118:26:118:26 | c | c | -| regexp.cpp:119:26:119:26 | a | a | -| regexp.cpp:119:27:119:28 | \\n | \n | -| regexp.cpp:119:29:119:29 | c | c | -| regexp.cpp:120:42:120:42 | a | a | -| regexp.cpp:120:43:120:44 | \\n | \n | -| regexp.cpp:120:45:120:45 | c | c | -| regexp.cpp:121:41:121:41 | a | a | -| regexp.cpp:121:42:121:43 | \\n | \n | -| regexp.cpp:121:44:121:44 | c | c | +| regexp.cpp:118:38:118:38 | a | a | +| regexp.cpp:118:39:118:40 | \\n | \n | +| regexp.cpp:118:41:118:41 | c | c | +| regexp.cpp:119:23:119:23 | a | a | +| regexp.cpp:119:24:119:25 | \\n | \n | +| regexp.cpp:119:26:119:26 | c | c | +| regexp.cpp:120:26:120:26 | a | a | +| regexp.cpp:120:27:120:28 | \\n | \n | +| regexp.cpp:120:29:120:29 | c | c | +| regexp.cpp:121:42:121:42 | a | a | +| regexp.cpp:121:43:121:44 | \\n | \n | +| regexp.cpp:121:45:121:45 | c | c | | regexp.cpp:122:41:122:41 | a | a | | regexp.cpp:122:42:122:43 | \\n | \n | | regexp.cpp:122:44:122:44 | c | c | -| regexp.cpp:123:25:123:25 | a | a | -| regexp.cpp:123:26:123:27 | \\n | \n | -| regexp.cpp:123:28:123:28 | c | c | -| regexp.cpp:124:29:124:29 | a | a | -| regexp.cpp:124:30:124:31 | \\n | \n | -| regexp.cpp:124:32:124:32 | c | c | +| regexp.cpp:123:41:123:41 | a | a | +| regexp.cpp:123:42:123:43 | \\n | \n | +| regexp.cpp:123:44:123:44 | c | c | +| regexp.cpp:124:25:124:25 | a | a | +| regexp.cpp:124:26:124:27 | \\n | \n | +| regexp.cpp:124:28:124:28 | c | c | +| regexp.cpp:125:29:125:29 | a | a | +| regexp.cpp:125:30:125:31 | \\n | \n | +| regexp.cpp:125:32:125:32 | c | c | From 18074d07fbe855e7421602a4b8bd288aa096d44e Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 28 Aug 2026 17:16:48 +0200 Subject: [PATCH 0580/2098] C++: Remove duplicated checks These already occur in `isIdentityEscape`. --- cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll | 3 --- 1 file changed, 3 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll index 463bc3822e49..e66a67c49f1d 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll @@ -573,9 +573,6 @@ private module Impl implements RegexTreeViewSig { * TODO: Handle named escapes. */ override string getValue() { - not this.isUnicode() and - not this.isHex() and - not this.isControl() and this.isIdentityEscape() and result = this.getUnescaped() or From 40a8746945006dbb5ff5b118cd268bb4990470d3 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 28 Aug 2026 17:22:38 +0200 Subject: [PATCH 0581/2098] C++: Document potentially unexpected regex location information --- cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll index e66a67c49f1d..351d02acb453 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll @@ -225,7 +225,12 @@ private module Impl implements RegexTreeViewSig { ) } - /** Holds if this term is found at the specified location offsets. */ + /** + * Holds if this term is found at the specified location offsets. + * + * Note: these locations may not be accurate when the regex was not defined as a raw string + * and contains `\`-escaped characters. + */ predicate hasLocationInfo( string filepath, int startline, int startcolumn, int endline, int endcolumn ) { From 0ab94543fb0dc369b1786280ccf321deb915a6d2 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 28 Aug 2026 17:32:23 +0200 Subject: [PATCH 0582/2098] C++: Address `RegExpNormalChar` review feedback --- .../semmle/code/cpp/regex/RegexTreeView.qll | 28 +- .../test/library-tests/regex/parse.expected | 354 +++++++++--------- .../test/library-tests/regex/regexp.expected | 178 ++++----- cpp/ql/test/library-tests/regex/regexp.ql | 2 +- 4 files changed, 281 insertions(+), 281 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll index 351d02acb453..8d30fcc15873 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll @@ -40,7 +40,7 @@ private newtype TRegExpParent = /** A special character */ TRegExpSpecialChar(RegExp re, int start, int end) { re.specialCharacter(start, end, _) } or /** A normal character */ - TRegExpNormalChar(RegExp re, int start, int end) { + TRegExpNormalChars(RegExp re, int start, int end) { re.normalCharacterSequence(start, end) or re.escapedCharacter(start, end) and @@ -129,7 +129,7 @@ private module Impl implements RegexTreeViewSig { or this = TRegExpCharacterRange(re, start, end) or - this = TRegExpNormalChar(re, start, end) + this = TRegExpNormalChars(re, start, end) or this = TRegExpGroup(re, start, end) or @@ -172,7 +172,7 @@ private module Impl implements RegexTreeViewSig { or result = this.(RegExpCharacterRange).getChild(i) or - result = this.(RegExpNormalChar).getChild(i) + result = this.(RegExpNormalChars).getChild(i) or result = this.(RegExpGroup).getChild(i) or @@ -570,7 +570,7 @@ private module Impl implements RegexTreeViewSig { * \w * ``` */ - class RegExpEscape extends RegExpNormalChar { + class RegExpEscape extends RegExpNormalChars { RegExpEscape() { re.escapedCharacter(start, end) } /** @@ -805,30 +805,30 @@ private module Impl implements RegexTreeViewSig { } /** - * A normal character in a regular expression, that is, a character - * without special meaning. This includes escaped characters. + * A normal-character term in a regular expression, that is, a sequence + * of characters without special meaning or a single escaped character. * * Examples: * ``` - * t + * abc * \t * ``` */ - additional class RegExpNormalChar extends RegExpTerm, TRegExpNormalChar { - RegExpNormalChar() { this = TRegExpNormalChar(re, start, end) } + additional class RegExpNormalChars extends RegExpTerm, TRegExpNormalChars { + RegExpNormalChars() { this = TRegExpNormalChars(re, start, end) } /** - * Holds if this constant represents a valid Unicode character (as opposed + * Holds if this constant consists of a valid Unicode character (as opposed * to a surrogate code point that does not correspond to a character by itself.) */ predicate isCharacter() { any() } - /** Gets the string representation of the char matched by this term. */ + /** Gets the string representation of this term. */ string getValue() { result = re.getText().substring(start, end) } override RegExpTerm getChild(int i) { none() } - override string getAPrimaryQlClass() { result = "RegExpNormalChar" } + override string getAPrimaryQlClass() { result = "RegExpNormalChars" } } /** @@ -845,14 +845,14 @@ private module Impl implements RegexTreeViewSig { string value; RegExpConstant() { - this = TRegExpNormalChar(re, start, end) and + this = TRegExpNormalChars(re, start, end) and not this instanceof RegExpCharacterClassEscape and // exclude chars in qualifiers // TODO: push this into regex library not exists(int qstart, int qend | re.qualifiedPart(_, qstart, qend, _, _) | qstart <= start and end <= qend ) and - value = this.(RegExpNormalChar).getValue() + value = this.(RegExpNormalChars).getValue() or this = TRegExpSpecialChar(re, start, end) and re.inCharSet(start) and diff --git a/cpp/ql/test/library-tests/regex/parse.expected b/cpp/ql/test/library-tests/regex/parse.expected index 47cef58ceb61..29673e73396f 100644 --- a/cpp/ql/test/library-tests/regex/parse.expected +++ b/cpp/ql/test/library-tests/regex/parse.expected @@ -1,94 +1,94 @@ regexp.cpp: -# 19| [RegExpConstant, RegExpNormalChar] abc +# 19| [RegExpConstant, RegExpNormalChars] abc -# 22| [RegExpConstant, RegExpNormalChar] a +# 22| [RegExpConstant, RegExpNormalChars] a # 22| [RegExpStar] a* -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 0 -> [RegExpConstant, RegExpNormalChars] a # 22| [RegExpSequence] a*b+c?d #-----| 0 -> [RegExpStar] a* #-----| 1 -> [RegExpPlus] b+ #-----| 2 -> [RegExpOpt] c? -#-----| 3 -> [RegExpConstant, RegExpNormalChar] d +#-----| 3 -> [RegExpConstant, RegExpNormalChars] d -# 22| [RegExpConstant, RegExpNormalChar] b +# 22| [RegExpConstant, RegExpNormalChars] b # 22| [RegExpPlus] b+ -#-----| 0 -> [RegExpConstant, RegExpNormalChar] b +#-----| 0 -> [RegExpConstant, RegExpNormalChars] b -# 22| [RegExpConstant, RegExpNormalChar] c +# 22| [RegExpConstant, RegExpNormalChars] c # 22| [RegExpOpt] c? -#-----| 0 -> [RegExpConstant, RegExpNormalChar] c +#-----| 0 -> [RegExpConstant, RegExpNormalChars] c -# 22| [RegExpConstant, RegExpNormalChar] d +# 22| [RegExpConstant, RegExpNormalChars] d -# 23| [RegExpConstant, RegExpNormalChar] a +# 23| [RegExpConstant, RegExpNormalChars] a # 23| [RegExpRange] a{4,8} -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 0 -> [RegExpConstant, RegExpNormalChars] a -# 24| [RegExpConstant, RegExpNormalChar] a +# 24| [RegExpConstant, RegExpNormalChars] a # 24| [InfiniteRepetitionQuantifier, RegExpRange] a{3,} -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 0 -> [RegExpConstant, RegExpNormalChars] a -# 25| [RegExpConstant, RegExpNormalChar] a +# 25| [RegExpConstant, RegExpNormalChars] a # 25| [RegExpRange] a{7} -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 0 -> [RegExpConstant, RegExpNormalChars] a -# 28| [RegExpConstant, RegExpNormalChar] foo +# 28| [RegExpConstant, RegExpNormalChars] foo # 28| [RegExpAlt] foo|bar -#-----| 0 -> [RegExpConstant, RegExpNormalChar] foo -#-----| 1 -> [RegExpConstant, RegExpNormalChar] bar +#-----| 0 -> [RegExpConstant, RegExpNormalChars] foo +#-----| 1 -> [RegExpConstant, RegExpNormalChars] bar -# 28| [RegExpConstant, RegExpNormalChar] bar +# 28| [RegExpConstant, RegExpNormalChars] bar # 31| [RegExpCharacterClass] [abc] -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpNormalChar] b -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c +#-----| 0 -> [RegExpConstant, RegExpNormalChars] a +#-----| 1 -> [RegExpConstant, RegExpNormalChars] b +#-----| 2 -> [RegExpConstant, RegExpNormalChars] c -# 31| [RegExpConstant, RegExpNormalChar] a +# 31| [RegExpConstant, RegExpNormalChars] a -# 31| [RegExpConstant, RegExpNormalChar] b +# 31| [RegExpConstant, RegExpNormalChars] b -# 31| [RegExpConstant, RegExpNormalChar] c +# 31| [RegExpConstant, RegExpNormalChars] c # 32| [RegExpCharacterClass] [a-fA-F0-9_] #-----| 0 -> [RegExpCharacterRange] a-f #-----| 1 -> [RegExpCharacterRange] A-F #-----| 2 -> [RegExpCharacterRange] 0-9 -#-----| 3 -> [RegExpConstant, RegExpNormalChar] _ +#-----| 3 -> [RegExpConstant, RegExpNormalChars] _ -# 32| [RegExpConstant, RegExpNormalChar] a +# 32| [RegExpConstant, RegExpNormalChars] a # 32| [RegExpCharacterRange] a-f -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpNormalChar] f +#-----| 0 -> [RegExpConstant, RegExpNormalChars] a +#-----| 1 -> [RegExpConstant, RegExpNormalChars] f -# 32| [RegExpConstant, RegExpNormalChar] f +# 32| [RegExpConstant, RegExpNormalChars] f -# 32| [RegExpConstant, RegExpNormalChar] A +# 32| [RegExpConstant, RegExpNormalChars] A # 32| [RegExpCharacterRange] A-F -#-----| 0 -> [RegExpConstant, RegExpNormalChar] A -#-----| 1 -> [RegExpConstant, RegExpNormalChar] F +#-----| 0 -> [RegExpConstant, RegExpNormalChars] A +#-----| 1 -> [RegExpConstant, RegExpNormalChars] F -# 32| [RegExpConstant, RegExpNormalChar] F +# 32| [RegExpConstant, RegExpNormalChars] F -# 32| [RegExpConstant, RegExpNormalChar] 0 +# 32| [RegExpConstant, RegExpNormalChars] 0 # 32| [RegExpCharacterRange] 0-9 -#-----| 0 -> [RegExpConstant, RegExpNormalChar] 0 -#-----| 1 -> [RegExpConstant, RegExpNormalChar] 9 +#-----| 0 -> [RegExpConstant, RegExpNormalChars] 0 +#-----| 1 -> [RegExpConstant, RegExpNormalChars] 9 -# 32| [RegExpConstant, RegExpNormalChar] 9 +# 32| [RegExpConstant, RegExpNormalChars] 9 -# 32| [RegExpConstant, RegExpNormalChar] _ +# 32| [RegExpConstant, RegExpNormalChars] _ # 33| [RegExpCharacterClass] [\w] #-----| 0 -> [RegExpCharacterClassEscape] \w @@ -108,46 +108,46 @@ regexp.cpp: # 34| [RegExpConstant, RegExpEscape] \] # 34| [RegExpCharacterClass] [123] -#-----| 0 -> [RegExpConstant, RegExpNormalChar] 1 -#-----| 1 -> [RegExpConstant, RegExpNormalChar] 2 -#-----| 2 -> [RegExpConstant, RegExpNormalChar] 3 +#-----| 0 -> [RegExpConstant, RegExpNormalChars] 1 +#-----| 1 -> [RegExpConstant, RegExpNormalChars] 2 +#-----| 2 -> [RegExpConstant, RegExpNormalChars] 3 -# 34| [RegExpConstant, RegExpNormalChar] 1 +# 34| [RegExpConstant, RegExpNormalChars] 1 -# 34| [RegExpConstant, RegExpNormalChar] 2 +# 34| [RegExpConstant, RegExpNormalChars] 2 -# 34| [RegExpConstant, RegExpNormalChar] 3 +# 34| [RegExpConstant, RegExpNormalChars] 3 # 35| [RegExpCharacterClass] [^A-Z] #-----| 0 -> [RegExpCharacterRange] A-Z -# 35| [RegExpConstant, RegExpNormalChar] A +# 35| [RegExpConstant, RegExpNormalChars] A # 35| [RegExpCharacterRange] A-Z -#-----| 0 -> [RegExpConstant, RegExpNormalChar] A -#-----| 1 -> [RegExpConstant, RegExpNormalChar] Z +#-----| 0 -> [RegExpConstant, RegExpNormalChars] A +#-----| 1 -> [RegExpConstant, RegExpNormalChars] Z -# 35| [RegExpConstant, RegExpNormalChar] Z +# 35| [RegExpConstant, RegExpNormalChars] Z # 36| [RegExpCharacterClass] []] -#-----| 0 -> [RegExpConstant, RegExpNormalChar] ] +#-----| 0 -> [RegExpConstant, RegExpNormalChars] ] -# 36| [RegExpConstant, RegExpNormalChar] ] +# 36| [RegExpConstant, RegExpNormalChars] ] # 37| [RegExpCharacterClass] [^]] -#-----| 0 -> [RegExpConstant, RegExpNormalChar] ] +#-----| 0 -> [RegExpConstant, RegExpNormalChars] ] -# 37| [RegExpConstant, RegExpNormalChar] ] +# 37| [RegExpConstant, RegExpNormalChars] ] # 38| [RegExpCharacterClass] [^-] -#-----| 0 -> [RegExpConstant, RegExpNormalChar] - +#-----| 0 -> [RegExpConstant, RegExpNormalChars] - -# 38| [RegExpConstant, RegExpNormalChar] - +# 38| [RegExpConstant, RegExpNormalChars] - # 39| [RegExpCharacterClass] [|] -#-----| 0 -> [RegExpConstant, RegExpNormalChar] | +#-----| 0 -> [RegExpConstant, RegExpNormalChars] | -# 39| [RegExpConstant, RegExpNormalChar] | +# 39| [RegExpConstant, RegExpNormalChars] | # 40| [RegExpCharacterClass] [\b] #-----| 0 -> [RegExpConstant, RegExpEscape] \b @@ -155,24 +155,24 @@ regexp.cpp: # 40| [RegExpConstant, RegExpEscape] \b # 43| [RegExpCharacterClass] [[a-f] -#-----| 0 -> [RegExpConstant, RegExpNormalChar] [ +#-----| 0 -> [RegExpConstant, RegExpNormalChars] [ #-----| 1 -> [RegExpCharacterRange] a-f # 43| [RegExpSequence] [[a-f]A-F] #-----| 0 -> [RegExpCharacterClass] [[a-f] -#-----| 1 -> [RegExpConstant, RegExpNormalChar] A-F] +#-----| 1 -> [RegExpConstant, RegExpNormalChars] A-F] -# 43| [RegExpConstant, RegExpNormalChar] [ +# 43| [RegExpConstant, RegExpNormalChars] [ -# 43| [RegExpConstant, RegExpNormalChar] a +# 43| [RegExpConstant, RegExpNormalChars] a # 43| [RegExpCharacterRange] a-f -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpNormalChar] f +#-----| 0 -> [RegExpConstant, RegExpNormalChars] a +#-----| 1 -> [RegExpConstant, RegExpNormalChars] f -# 43| [RegExpConstant, RegExpNormalChar] f +# 43| [RegExpConstant, RegExpNormalChars] f -# 43| [RegExpConstant, RegExpNormalChar] A-F] +# 43| [RegExpConstant, RegExpNormalChars] A-F] # 46| [RegExpDot] . @@ -221,66 +221,66 @@ regexp.cpp: # 53| [RegExpSequence] \b!a\B #-----| 0 -> [RegExpSpecialChar] \b -#-----| 1 -> [RegExpConstant, RegExpNormalChar] !a +#-----| 1 -> [RegExpConstant, RegExpNormalChars] !a #-----| 2 -> [RegExpNonWordBoundary] \B -# 53| [RegExpConstant, RegExpNormalChar] !a +# 53| [RegExpConstant, RegExpNormalChars] !a # 53| [RegExpNonWordBoundary] \B # 56| [RegExpGroup] (foo) -#-----| 0 -> [RegExpConstant, RegExpNormalChar] foo +#-----| 0 -> [RegExpConstant, RegExpNormalChars] foo # 56| [RegExpStar] (foo)* #-----| 0 -> [RegExpGroup] (foo) # 56| [RegExpSequence] (foo)*bar #-----| 0 -> [RegExpStar] (foo)* -#-----| 1 -> [RegExpConstant, RegExpNormalChar] bar +#-----| 1 -> [RegExpConstant, RegExpNormalChars] bar -# 56| [RegExpConstant, RegExpNormalChar] foo +# 56| [RegExpConstant, RegExpNormalChars] foo -# 56| [RegExpConstant, RegExpNormalChar] bar +# 56| [RegExpConstant, RegExpNormalChars] bar -# 57| [RegExpConstant, RegExpNormalChar] fo +# 57| [RegExpConstant, RegExpNormalChars] fo # 57| [RegExpSequence] fo(o|b)ar -#-----| 0 -> [RegExpConstant, RegExpNormalChar] fo +#-----| 0 -> [RegExpConstant, RegExpNormalChars] fo #-----| 1 -> [RegExpGroup] (o|b) -#-----| 2 -> [RegExpConstant, RegExpNormalChar] ar +#-----| 2 -> [RegExpConstant, RegExpNormalChars] ar # 57| [RegExpGroup] (o|b) #-----| 0 -> [RegExpAlt] o|b -# 57| [RegExpConstant, RegExpNormalChar] o +# 57| [RegExpConstant, RegExpNormalChars] o # 57| [RegExpAlt] o|b -#-----| 0 -> [RegExpConstant, RegExpNormalChar] o -#-----| 1 -> [RegExpConstant, RegExpNormalChar] b +#-----| 0 -> [RegExpConstant, RegExpNormalChars] o +#-----| 1 -> [RegExpConstant, RegExpNormalChars] b -# 57| [RegExpConstant, RegExpNormalChar] b +# 57| [RegExpConstant, RegExpNormalChars] b -# 57| [RegExpConstant, RegExpNormalChar] ar +# 57| [RegExpConstant, RegExpNormalChars] ar # 58| [RegExpGroup] (a|b|cd) #-----| 0 -> [RegExpAlt] a|b|cd # 58| [RegExpSequence] (a|b|cd)e #-----| 0 -> [RegExpGroup] (a|b|cd) -#-----| 1 -> [RegExpConstant, RegExpNormalChar] e +#-----| 1 -> [RegExpConstant, RegExpNormalChars] e -# 58| [RegExpConstant, RegExpNormalChar] a +# 58| [RegExpConstant, RegExpNormalChars] a # 58| [RegExpAlt] a|b|cd -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpNormalChar] b -#-----| 2 -> [RegExpConstant, RegExpNormalChar] cd +#-----| 0 -> [RegExpConstant, RegExpNormalChars] a +#-----| 1 -> [RegExpConstant, RegExpNormalChars] b +#-----| 2 -> [RegExpConstant, RegExpNormalChars] cd -# 58| [RegExpConstant, RegExpNormalChar] b +# 58| [RegExpConstant, RegExpNormalChars] b -# 58| [RegExpConstant, RegExpNormalChar] cd +# 58| [RegExpConstant, RegExpNormalChars] cd -# 58| [RegExpConstant, RegExpNormalChar] e +# 58| [RegExpConstant, RegExpNormalChars] e # 59| [RegExpGroup] (?::+) #-----| 0 -> [RegExpPlus] :+ @@ -289,10 +289,10 @@ regexp.cpp: #-----| 0 -> [RegExpGroup] (?::+) #-----| 1 -> [RegExpCharacterClassEscape] \w -# 59| [RegExpConstant, RegExpNormalChar] : +# 59| [RegExpConstant, RegExpNormalChars] : # 59| [RegExpPlus] :+ -#-----| 0 -> [RegExpConstant, RegExpNormalChar] : +#-----| 0 -> [RegExpConstant, RegExpNormalChars] : # 59| [RegExpCharacterClassEscape] \w @@ -304,15 +304,15 @@ regexp.cpp: #-----| 1 -> [RegExpPlus] b+ #-----| 2 -> [RegExpBackRef] \1 -# 62| [RegExpConstant, RegExpNormalChar] a +# 62| [RegExpConstant, RegExpNormalChars] a # 62| [RegExpPlus] a+ -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 0 -> [RegExpConstant, RegExpNormalChars] a -# 62| [RegExpConstant, RegExpNormalChar] b +# 62| [RegExpConstant, RegExpNormalChars] b # 62| [RegExpPlus] b+ -#-----| 0 -> [RegExpConstant, RegExpNormalChar] b +#-----| 0 -> [RegExpConstant, RegExpNormalChars] b # 62| [RegExpBackRef] \1 @@ -347,13 +347,13 @@ regexp.cpp: # 68| [RegExpPlus] [a-f[:digit:]]+ #-----| 0 -> [RegExpCharacterClass] [a-f[:digit:]] -# 68| [RegExpConstant, RegExpNormalChar] a +# 68| [RegExpConstant, RegExpNormalChars] a # 68| [RegExpCharacterRange] a-f -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpNormalChar] f +#-----| 0 -> [RegExpConstant, RegExpNormalChars] a +#-----| 1 -> [RegExpConstant, RegExpNormalChars] f -# 68| [RegExpConstant, RegExpNormalChar] f +# 68| [RegExpConstant, RegExpNormalChars] f # 68| [RegExpNamedCharacterProperty] [:digit:] @@ -389,23 +389,23 @@ regexp.cpp: #-----| 1 -> [RegExpNamedCharacterProperty] [:digit:] #-----| 2 -> [RegExpCharacterRange] a-f -# 78| [RegExpConstant, RegExpNormalChar] A +# 78| [RegExpConstant, RegExpNormalChars] A # 78| [RegExpCharacterRange] A-F -#-----| 0 -> [RegExpConstant, RegExpNormalChar] A -#-----| 1 -> [RegExpConstant, RegExpNormalChar] F +#-----| 0 -> [RegExpConstant, RegExpNormalChars] A +#-----| 1 -> [RegExpConstant, RegExpNormalChars] F -# 78| [RegExpConstant, RegExpNormalChar] F +# 78| [RegExpConstant, RegExpNormalChars] F # 78| [RegExpNamedCharacterProperty] [:digit:] -# 78| [RegExpConstant, RegExpNormalChar] a +# 78| [RegExpConstant, RegExpNormalChars] a # 78| [RegExpCharacterRange] a-f -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpNormalChar] f +#-----| 0 -> [RegExpConstant, RegExpNormalChars] a +#-----| 1 -> [RegExpConstant, RegExpNormalChars] f -# 78| [RegExpConstant, RegExpNormalChar] f +# 78| [RegExpConstant, RegExpNormalChars] f # 81| [RegExpCharacterClass] [[.a.]] #-----| 0 -> [RegExpNamedCharacterProperty] [.a.] @@ -417,23 +417,23 @@ regexp.cpp: #-----| 1 -> [RegExpNamedCharacterProperty] [.b.] #-----| 2 -> [RegExpCharacterRange] a-f -# 82| [RegExpConstant, RegExpNormalChar] A +# 82| [RegExpConstant, RegExpNormalChars] A # 82| [RegExpCharacterRange] A-F -#-----| 0 -> [RegExpConstant, RegExpNormalChar] A -#-----| 1 -> [RegExpConstant, RegExpNormalChar] F +#-----| 0 -> [RegExpConstant, RegExpNormalChars] A +#-----| 1 -> [RegExpConstant, RegExpNormalChars] F -# 82| [RegExpConstant, RegExpNormalChar] F +# 82| [RegExpConstant, RegExpNormalChars] F # 82| [RegExpNamedCharacterProperty] [.b.] -# 82| [RegExpConstant, RegExpNormalChar] a +# 82| [RegExpConstant, RegExpNormalChars] a # 82| [RegExpCharacterRange] a-f -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpNormalChar] f +#-----| 0 -> [RegExpConstant, RegExpNormalChars] a +#-----| 1 -> [RegExpConstant, RegExpNormalChars] f -# 82| [RegExpConstant, RegExpNormalChar] f +# 82| [RegExpConstant, RegExpNormalChars] f # 83| [RegExpCharacterClass] [[.ch.]] #-----| 0 -> [RegExpNamedCharacterProperty] [.ch.] @@ -450,23 +450,23 @@ regexp.cpp: #-----| 1 -> [RegExpNamedCharacterProperty] [=b=] #-----| 2 -> [RegExpCharacterRange] a-f -# 87| [RegExpConstant, RegExpNormalChar] A +# 87| [RegExpConstant, RegExpNormalChars] A # 87| [RegExpCharacterRange] A-F -#-----| 0 -> [RegExpConstant, RegExpNormalChar] A -#-----| 1 -> [RegExpConstant, RegExpNormalChar] F +#-----| 0 -> [RegExpConstant, RegExpNormalChars] A +#-----| 1 -> [RegExpConstant, RegExpNormalChars] F -# 87| [RegExpConstant, RegExpNormalChar] F +# 87| [RegExpConstant, RegExpNormalChars] F # 87| [RegExpNamedCharacterProperty] [=b=] -# 87| [RegExpConstant, RegExpNormalChar] a +# 87| [RegExpConstant, RegExpNormalChars] a # 87| [RegExpCharacterRange] a-f -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpNormalChar] f +#-----| 0 -> [RegExpConstant, RegExpNormalChars] a +#-----| 1 -> [RegExpConstant, RegExpNormalChars] f -# 87| [RegExpConstant, RegExpNormalChar] f +# 87| [RegExpConstant, RegExpNormalChars] f # 90| [RegExpNamedCharacterProperty] [:digit:] @@ -488,25 +488,25 @@ regexp.cpp: # 104| [RegExpConstant, RegExpEscape] \0 -# 107| [RegExpConstant, RegExpNormalChar] a +# 107| [RegExpConstant, RegExpNormalChars] a # 107| [RegExpStar] a*? -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 0 -> [RegExpConstant, RegExpNormalChars] a -# 108| [RegExpConstant, RegExpNormalChar] b +# 108| [RegExpConstant, RegExpNormalChars] b # 108| [RegExpPlus] b+? -#-----| 0 -> [RegExpConstant, RegExpNormalChar] b +#-----| 0 -> [RegExpConstant, RegExpNormalChars] b -# 109| [RegExpConstant, RegExpNormalChar] c +# 109| [RegExpConstant, RegExpNormalChars] c # 109| [RegExpOpt] c?? -#-----| 0 -> [RegExpConstant, RegExpNormalChar] c +#-----| 0 -> [RegExpConstant, RegExpNormalChars] c -# 110| [RegExpConstant, RegExpNormalChar] d +# 110| [RegExpConstant, RegExpNormalChars] d # 110| [RegExpQuantifier] d{2,3}? -#-----| 0 -> [RegExpConstant, RegExpNormalChar] d +#-----| 0 -> [RegExpConstant, RegExpNormalChars] d # 111| [RegExpConstant, RegExpEscape] \f @@ -516,134 +516,134 @@ regexp.cpp: # 111| [RegExpConstant, RegExpEscape] \v -# 114| [RegExpConstant, RegExpNormalChar] a +# 114| [RegExpConstant, RegExpNormalChars] a # 114| [RegExpSequence] a\nb -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 0 -> [RegExpConstant, RegExpNormalChars] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] b +#-----| 2 -> [RegExpConstant, RegExpNormalChars] b # 114| [RegExpConstant, RegExpEscape] \n -# 114| [RegExpConstant, RegExpNormalChar] b +# 114| [RegExpConstant, RegExpNormalChars] b -# 115| [RegExpConstant, RegExpNormalChar] a +# 115| [RegExpConstant, RegExpNormalChars] a # 115| [RegExpSequence] a\nc -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 0 -> [RegExpConstant, RegExpNormalChars] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c +#-----| 2 -> [RegExpConstant, RegExpNormalChars] c # 115| [RegExpConstant, RegExpEscape] \n -# 115| [RegExpConstant, RegExpNormalChar] c +# 115| [RegExpConstant, RegExpNormalChars] c -# 116| [RegExpConstant, RegExpNormalChar] a +# 116| [RegExpConstant, RegExpNormalChars] a # 116| [RegExpSequence] a\nc -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 0 -> [RegExpConstant, RegExpNormalChars] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c +#-----| 2 -> [RegExpConstant, RegExpNormalChars] c # 116| [RegExpConstant, RegExpEscape] \n -# 116| [RegExpConstant, RegExpNormalChar] c +# 116| [RegExpConstant, RegExpNormalChars] c -# 117| [RegExpConstant, RegExpNormalChar] a +# 117| [RegExpConstant, RegExpNormalChars] a # 117| [RegExpSequence] a\nc -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 0 -> [RegExpConstant, RegExpNormalChars] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c +#-----| 2 -> [RegExpConstant, RegExpNormalChars] c # 117| [RegExpConstant, RegExpEscape] \n -# 117| [RegExpConstant, RegExpNormalChar] c +# 117| [RegExpConstant, RegExpNormalChars] c -# 118| [RegExpConstant, RegExpNormalChar] a +# 118| [RegExpConstant, RegExpNormalChars] a # 118| [RegExpSequence] a\nc -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 0 -> [RegExpConstant, RegExpNormalChars] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c +#-----| 2 -> [RegExpConstant, RegExpNormalChars] c # 118| [RegExpConstant, RegExpEscape] \n -# 118| [RegExpConstant, RegExpNormalChar] c +# 118| [RegExpConstant, RegExpNormalChars] c -# 119| [RegExpConstant, RegExpNormalChar] a +# 119| [RegExpConstant, RegExpNormalChars] a # 119| [RegExpSequence] a\nc -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 0 -> [RegExpConstant, RegExpNormalChars] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c +#-----| 2 -> [RegExpConstant, RegExpNormalChars] c # 119| [RegExpConstant, RegExpEscape] \n -# 119| [RegExpConstant, RegExpNormalChar] c +# 119| [RegExpConstant, RegExpNormalChars] c -# 120| [RegExpConstant, RegExpNormalChar] a +# 120| [RegExpConstant, RegExpNormalChars] a # 120| [RegExpSequence] a\nc -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 0 -> [RegExpConstant, RegExpNormalChars] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c +#-----| 2 -> [RegExpConstant, RegExpNormalChars] c # 120| [RegExpConstant, RegExpEscape] \n -# 120| [RegExpConstant, RegExpNormalChar] c +# 120| [RegExpConstant, RegExpNormalChars] c -# 121| [RegExpConstant, RegExpNormalChar] a +# 121| [RegExpConstant, RegExpNormalChars] a # 121| [RegExpSequence] a\nc -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 0 -> [RegExpConstant, RegExpNormalChars] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c +#-----| 2 -> [RegExpConstant, RegExpNormalChars] c # 121| [RegExpConstant, RegExpEscape] \n -# 121| [RegExpConstant, RegExpNormalChar] c +# 121| [RegExpConstant, RegExpNormalChars] c -# 122| [RegExpConstant, RegExpNormalChar] a +# 122| [RegExpConstant, RegExpNormalChars] a # 122| [RegExpSequence] a\nc -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 0 -> [RegExpConstant, RegExpNormalChars] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c +#-----| 2 -> [RegExpConstant, RegExpNormalChars] c # 122| [RegExpConstant, RegExpEscape] \n -# 122| [RegExpConstant, RegExpNormalChar] c +# 122| [RegExpConstant, RegExpNormalChars] c -# 123| [RegExpConstant, RegExpNormalChar] a +# 123| [RegExpConstant, RegExpNormalChars] a # 123| [RegExpSequence] a\nc -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 0 -> [RegExpConstant, RegExpNormalChars] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c +#-----| 2 -> [RegExpConstant, RegExpNormalChars] c # 123| [RegExpConstant, RegExpEscape] \n -# 123| [RegExpConstant, RegExpNormalChar] c +# 123| [RegExpConstant, RegExpNormalChars] c -# 124| [RegExpConstant, RegExpNormalChar] a +# 124| [RegExpConstant, RegExpNormalChars] a # 124| [RegExpSequence] a\nc -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 0 -> [RegExpConstant, RegExpNormalChars] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c +#-----| 2 -> [RegExpConstant, RegExpNormalChars] c # 124| [RegExpConstant, RegExpEscape] \n -# 124| [RegExpConstant, RegExpNormalChar] c +# 124| [RegExpConstant, RegExpNormalChars] c -# 125| [RegExpConstant, RegExpNormalChar] a +# 125| [RegExpConstant, RegExpNormalChars] a # 125| [RegExpSequence] a\nc -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a +#-----| 0 -> [RegExpConstant, RegExpNormalChars] a #-----| 1 -> [RegExpConstant, RegExpEscape] \n -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c +#-----| 2 -> [RegExpConstant, RegExpNormalChars] c # 125| [RegExpConstant, RegExpEscape] \n -# 125| [RegExpConstant, RegExpNormalChar] c +# 125| [RegExpConstant, RegExpNormalChars] c diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index bf319f395217..dfc39e1027d4 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -4,39 +4,39 @@ groupNumber | regexp.cpp:58:20:58:27 | (a\|b\|cd) | 1 | | regexp.cpp:62:21:62:24 | (a+) | 1 | term -| regexp.cpp:19:19:19:21 | abc | RegExpConstant,RegExpNormalChar | -| regexp.cpp:22:20:22:20 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:19:19:19:21 | abc | RegExpConstant,RegExpNormalChars | +| regexp.cpp:22:20:22:20 | a | RegExpConstant,RegExpNormalChars | | regexp.cpp:22:20:22:21 | a* | RegExpStar | | regexp.cpp:22:20:22:26 | a*b+c?d | RegExpSequence | -| regexp.cpp:22:22:22:22 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:22:22:22:22 | b | RegExpConstant,RegExpNormalChars | | regexp.cpp:22:22:22:23 | b+ | RegExpPlus | -| regexp.cpp:22:24:22:24 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:22:24:22:24 | c | RegExpConstant,RegExpNormalChars | | regexp.cpp:22:24:22:25 | c? | RegExpOpt | -| regexp.cpp:22:26:22:26 | d | RegExpConstant,RegExpNormalChar | -| regexp.cpp:23:20:23:20 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:22:26:22:26 | d | RegExpConstant,RegExpNormalChars | +| regexp.cpp:23:20:23:20 | a | RegExpConstant,RegExpNormalChars | | regexp.cpp:23:20:23:25 | a{4,8} | RegExpRange | -| regexp.cpp:24:20:24:20 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:24:20:24:20 | a | RegExpConstant,RegExpNormalChars | | regexp.cpp:24:20:24:24 | a{3,} | InfiniteRepetitionQuantifier,RegExpRange | -| regexp.cpp:25:20:25:20 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:25:20:25:20 | a | RegExpConstant,RegExpNormalChars | | regexp.cpp:25:20:25:23 | a{7} | RegExpRange | -| regexp.cpp:28:19:28:21 | foo | RegExpConstant,RegExpNormalChar | +| regexp.cpp:28:19:28:21 | foo | RegExpConstant,RegExpNormalChars | | regexp.cpp:28:19:28:25 | foo\|bar | RegExpAlt | -| regexp.cpp:28:23:28:25 | bar | RegExpConstant,RegExpNormalChar | +| regexp.cpp:28:23:28:25 | bar | RegExpConstant,RegExpNormalChars | | regexp.cpp:31:19:31:23 | [abc] | RegExpCharacterClass | -| regexp.cpp:31:20:31:20 | a | RegExpConstant,RegExpNormalChar | -| regexp.cpp:31:21:31:21 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:31:22:31:22 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:31:20:31:20 | a | RegExpConstant,RegExpNormalChars | +| regexp.cpp:31:21:31:21 | b | RegExpConstant,RegExpNormalChars | +| regexp.cpp:31:22:31:22 | c | RegExpConstant,RegExpNormalChars | | regexp.cpp:32:19:32:30 | [a-fA-F0-9_] | RegExpCharacterClass | -| regexp.cpp:32:20:32:20 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:32:20:32:20 | a | RegExpConstant,RegExpNormalChars | | regexp.cpp:32:20:32:22 | a-f | RegExpCharacterRange | -| regexp.cpp:32:22:32:22 | f | RegExpConstant,RegExpNormalChar | -| regexp.cpp:32:23:32:23 | A | RegExpConstant,RegExpNormalChar | +| regexp.cpp:32:22:32:22 | f | RegExpConstant,RegExpNormalChars | +| regexp.cpp:32:23:32:23 | A | RegExpConstant,RegExpNormalChars | | regexp.cpp:32:23:32:25 | A-F | RegExpCharacterRange | -| regexp.cpp:32:25:32:25 | F | RegExpConstant,RegExpNormalChar | -| regexp.cpp:32:26:32:26 | 0 | RegExpConstant,RegExpNormalChar | +| regexp.cpp:32:25:32:25 | F | RegExpConstant,RegExpNormalChars | +| regexp.cpp:32:26:32:26 | 0 | RegExpConstant,RegExpNormalChars | | regexp.cpp:32:26:32:28 | 0-9 | RegExpCharacterRange | -| regexp.cpp:32:28:32:28 | 9 | RegExpConstant,RegExpNormalChar | -| regexp.cpp:32:29:32:29 | _ | RegExpConstant,RegExpNormalChar | +| regexp.cpp:32:28:32:28 | 9 | RegExpConstant,RegExpNormalChars | +| regexp.cpp:32:29:32:29 | _ | RegExpConstant,RegExpNormalChars | | regexp.cpp:33:19:33:22 | [\\w] | RegExpCharacterClass | | regexp.cpp:33:19:33:23 | [\\w]+ | RegExpPlus | | regexp.cpp:33:20:33:21 | \\w | RegExpCharacterClassEscape | @@ -44,30 +44,30 @@ term | regexp.cpp:34:19:34:27 | \\[\\][123] | RegExpSequence | | regexp.cpp:34:21:34:22 | \\] | RegExpConstant,RegExpEscape | | regexp.cpp:34:23:34:27 | [123] | RegExpCharacterClass | -| regexp.cpp:34:24:34:24 | 1 | RegExpConstant,RegExpNormalChar | -| regexp.cpp:34:25:34:25 | 2 | RegExpConstant,RegExpNormalChar | -| regexp.cpp:34:26:34:26 | 3 | RegExpConstant,RegExpNormalChar | +| regexp.cpp:34:24:34:24 | 1 | RegExpConstant,RegExpNormalChars | +| regexp.cpp:34:25:34:25 | 2 | RegExpConstant,RegExpNormalChars | +| regexp.cpp:34:26:34:26 | 3 | RegExpConstant,RegExpNormalChars | | regexp.cpp:35:19:35:24 | [^A-Z] | RegExpCharacterClass | -| regexp.cpp:35:21:35:21 | A | RegExpConstant,RegExpNormalChar | +| regexp.cpp:35:21:35:21 | A | RegExpConstant,RegExpNormalChars | | regexp.cpp:35:21:35:23 | A-Z | RegExpCharacterRange | -| regexp.cpp:35:23:35:23 | Z | RegExpConstant,RegExpNormalChar | +| regexp.cpp:35:23:35:23 | Z | RegExpConstant,RegExpNormalChars | | regexp.cpp:36:19:36:21 | []] | RegExpCharacterClass | -| regexp.cpp:36:20:36:20 | ] | RegExpConstant,RegExpNormalChar | +| regexp.cpp:36:20:36:20 | ] | RegExpConstant,RegExpNormalChars | | regexp.cpp:37:19:37:22 | [^]] | RegExpCharacterClass | -| regexp.cpp:37:21:37:21 | ] | RegExpConstant,RegExpNormalChar | +| regexp.cpp:37:21:37:21 | ] | RegExpConstant,RegExpNormalChars | | regexp.cpp:38:19:38:22 | [^-] | RegExpCharacterClass | -| regexp.cpp:38:21:38:21 | - | RegExpConstant,RegExpNormalChar | +| regexp.cpp:38:21:38:21 | - | RegExpConstant,RegExpNormalChars | | regexp.cpp:39:19:39:21 | [\|] | RegExpCharacterClass | -| regexp.cpp:39:20:39:20 | \| | RegExpConstant,RegExpNormalChar | +| regexp.cpp:39:20:39:20 | \| | RegExpConstant,RegExpNormalChars | | regexp.cpp:40:20:40:23 | [\\b] | RegExpCharacterClass | | regexp.cpp:40:21:40:22 | \\b | RegExpConstant,RegExpEscape | | regexp.cpp:43:22:43:27 | [[a-f] | RegExpCharacterClass | | regexp.cpp:43:22:43:31 | [[a-f]A-F] | RegExpSequence | -| regexp.cpp:43:23:43:23 | [ | RegExpConstant,RegExpNormalChar | -| regexp.cpp:43:24:43:24 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:43:23:43:23 | [ | RegExpConstant,RegExpNormalChars | +| regexp.cpp:43:24:43:24 | a | RegExpConstant,RegExpNormalChars | | regexp.cpp:43:24:43:26 | a-f | RegExpCharacterRange | -| regexp.cpp:43:26:43:26 | f | RegExpConstant,RegExpNormalChar | -| regexp.cpp:43:28:43:31 | A-F] | RegExpConstant,RegExpNormalChar | +| regexp.cpp:43:26:43:26 | f | RegExpConstant,RegExpNormalChars | +| regexp.cpp:43:28:43:31 | A-F] | RegExpConstant,RegExpNormalChars | | regexp.cpp:46:21:46:21 | . | RegExpDot | | regexp.cpp:46:21:46:22 | .* | RegExpStar | | regexp.cpp:47:21:47:22 | \\w | RegExpCharacterClassEscape | @@ -86,37 +86,37 @@ term | regexp.cpp:50:25:50:26 | \\t | RegExpConstant,RegExpEscape | | regexp.cpp:53:20:53:21 | \\b | RegExpSpecialChar | | regexp.cpp:53:20:53:25 | \\b!a\\B | RegExpSequence | -| regexp.cpp:53:22:53:23 | !a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:53:22:53:23 | !a | RegExpConstant,RegExpNormalChars | | regexp.cpp:53:24:53:25 | \\B | RegExpNonWordBoundary | | regexp.cpp:56:20:56:24 | (foo) | RegExpGroup | | regexp.cpp:56:20:56:25 | (foo)* | RegExpStar | | regexp.cpp:56:20:56:28 | (foo)*bar | RegExpSequence | -| regexp.cpp:56:21:56:23 | foo | RegExpConstant,RegExpNormalChar | -| regexp.cpp:56:26:56:28 | bar | RegExpConstant,RegExpNormalChar | -| regexp.cpp:57:20:57:21 | fo | RegExpConstant,RegExpNormalChar | +| regexp.cpp:56:21:56:23 | foo | RegExpConstant,RegExpNormalChars | +| regexp.cpp:56:26:56:28 | bar | RegExpConstant,RegExpNormalChars | +| regexp.cpp:57:20:57:21 | fo | RegExpConstant,RegExpNormalChars | | regexp.cpp:57:20:57:28 | fo(o\|b)ar | RegExpSequence | | regexp.cpp:57:22:57:26 | (o\|b) | RegExpGroup | -| regexp.cpp:57:23:57:23 | o | RegExpConstant,RegExpNormalChar | +| regexp.cpp:57:23:57:23 | o | RegExpConstant,RegExpNormalChars | | regexp.cpp:57:23:57:25 | o\|b | RegExpAlt | -| regexp.cpp:57:25:57:25 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:57:27:57:28 | ar | RegExpConstant,RegExpNormalChar | +| regexp.cpp:57:25:57:25 | b | RegExpConstant,RegExpNormalChars | +| regexp.cpp:57:27:57:28 | ar | RegExpConstant,RegExpNormalChars | | regexp.cpp:58:20:58:27 | (a\|b\|cd) | RegExpGroup | | regexp.cpp:58:20:58:28 | (a\|b\|cd)e | RegExpSequence | -| regexp.cpp:58:21:58:21 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:58:21:58:21 | a | RegExpConstant,RegExpNormalChars | | regexp.cpp:58:21:58:26 | a\|b\|cd | RegExpAlt | -| regexp.cpp:58:23:58:23 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:58:25:58:26 | cd | RegExpConstant,RegExpNormalChar | -| regexp.cpp:58:28:58:28 | e | RegExpConstant,RegExpNormalChar | +| regexp.cpp:58:23:58:23 | b | RegExpConstant,RegExpNormalChars | +| regexp.cpp:58:25:58:26 | cd | RegExpConstant,RegExpNormalChars | +| regexp.cpp:58:28:58:28 | e | RegExpConstant,RegExpNormalChars | | regexp.cpp:59:20:59:25 | (?::+) | RegExpGroup | | regexp.cpp:59:20:59:27 | (?::+)\\w | RegExpSequence | -| regexp.cpp:59:23:59:23 | : | RegExpConstant,RegExpNormalChar | +| regexp.cpp:59:23:59:23 | : | RegExpConstant,RegExpNormalChars | | regexp.cpp:59:23:59:24 | :+ | RegExpPlus | | regexp.cpp:59:26:59:27 | \\w | RegExpCharacterClassEscape | | regexp.cpp:62:21:62:24 | (a+) | RegExpGroup | | regexp.cpp:62:21:62:28 | (a+)b+\\1 | RegExpSequence | -| regexp.cpp:62:22:62:22 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:62:22:62:22 | a | RegExpConstant,RegExpNormalChars | | regexp.cpp:62:22:62:23 | a+ | RegExpPlus | -| regexp.cpp:62:25:62:25 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:62:25:62:25 | b | RegExpConstant,RegExpNormalChars | | regexp.cpp:62:25:62:26 | b+ | RegExpPlus | | regexp.cpp:62:27:62:28 | \\1 | RegExpBackRef | | regexp.cpp:65:21:65:31 | [[:alnum:]] | RegExpCharacterClass | @@ -130,9 +130,9 @@ term | regexp.cpp:67:22:67:30 | [:alnum:] | RegExpNamedCharacterProperty | | regexp.cpp:68:21:68:34 | [a-f[:digit:]] | RegExpCharacterClass | | regexp.cpp:68:21:68:35 | [a-f[:digit:]]+ | RegExpPlus | -| regexp.cpp:68:22:68:22 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:68:22:68:22 | a | RegExpConstant,RegExpNormalChars | | regexp.cpp:68:22:68:24 | a-f | RegExpCharacterRange | -| regexp.cpp:68:24:68:24 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:68:24:68:24 | f | RegExpConstant,RegExpNormalChars | | regexp.cpp:68:25:68:33 | [:digit:] | RegExpNamedCharacterProperty | | regexp.cpp:69:21:69:32 | [^[:digit:]] | RegExpCharacterClass | | regexp.cpp:69:23:69:31 | [:digit:] | RegExpNamedCharacterProperty | @@ -145,35 +145,35 @@ term | regexp.cpp:75:23:75:31 | [:alpha:] | RegExpNamedCharacterProperty | | regexp.cpp:75:32:75:40 | [:digit:] | RegExpNamedCharacterProperty | | regexp.cpp:78:22:78:38 | [A-F[:digit:]a-f] | RegExpCharacterClass | -| regexp.cpp:78:23:78:23 | A | RegExpConstant,RegExpNormalChar | +| regexp.cpp:78:23:78:23 | A | RegExpConstant,RegExpNormalChars | | regexp.cpp:78:23:78:25 | A-F | RegExpCharacterRange | -| regexp.cpp:78:25:78:25 | F | RegExpConstant,RegExpNormalChar | +| regexp.cpp:78:25:78:25 | F | RegExpConstant,RegExpNormalChars | | regexp.cpp:78:26:78:34 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.cpp:78:35:78:35 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:78:35:78:35 | a | RegExpConstant,RegExpNormalChars | | regexp.cpp:78:35:78:37 | a-f | RegExpCharacterRange | -| regexp.cpp:78:37:78:37 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:78:37:78:37 | f | RegExpConstant,RegExpNormalChars | | regexp.cpp:81:27:81:33 | [[.a.]] | RegExpCharacterClass | | regexp.cpp:81:28:81:32 | [.a.] | RegExpNamedCharacterProperty | | regexp.cpp:82:27:82:39 | [A-F[.b.]a-f] | RegExpCharacterClass | -| regexp.cpp:82:28:82:28 | A | RegExpConstant,RegExpNormalChar | +| regexp.cpp:82:28:82:28 | A | RegExpConstant,RegExpNormalChars | | regexp.cpp:82:28:82:30 | A-F | RegExpCharacterRange | -| regexp.cpp:82:30:82:30 | F | RegExpConstant,RegExpNormalChar | +| regexp.cpp:82:30:82:30 | F | RegExpConstant,RegExpNormalChars | | regexp.cpp:82:31:82:35 | [.b.] | RegExpNamedCharacterProperty | -| regexp.cpp:82:36:82:36 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:82:36:82:36 | a | RegExpConstant,RegExpNormalChars | | regexp.cpp:82:36:82:38 | a-f | RegExpCharacterRange | -| regexp.cpp:82:38:82:38 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:82:38:82:38 | f | RegExpConstant,RegExpNormalChars | | regexp.cpp:83:27:83:34 | [[.ch.]] | RegExpCharacterClass | | regexp.cpp:83:28:83:33 | [.ch.] | RegExpNamedCharacterProperty | | regexp.cpp:86:28:86:34 | [[=a=]] | RegExpCharacterClass | | regexp.cpp:86:29:86:33 | [=a=] | RegExpNamedCharacterProperty | | regexp.cpp:87:28:87:40 | [A-F[=b=]a-f] | RegExpCharacterClass | -| regexp.cpp:87:29:87:29 | A | RegExpConstant,RegExpNormalChar | +| regexp.cpp:87:29:87:29 | A | RegExpConstant,RegExpNormalChars | | regexp.cpp:87:29:87:31 | A-F | RegExpCharacterRange | -| regexp.cpp:87:31:87:31 | F | RegExpConstant,RegExpNormalChar | +| regexp.cpp:87:31:87:31 | F | RegExpConstant,RegExpNormalChars | | regexp.cpp:87:32:87:36 | [=b=] | RegExpNamedCharacterProperty | -| regexp.cpp:87:37:87:37 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:87:37:87:37 | a | RegExpConstant,RegExpNormalChars | | regexp.cpp:87:37:87:39 | a-f | RegExpCharacterRange | -| regexp.cpp:87:39:87:39 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:87:39:87:39 | f | RegExpConstant,RegExpNormalChars | | regexp.cpp:90:22:90:30 | [:digit:] | RegExpNamedCharacterProperty | | regexp.cpp:93:19:93:24 | \\u0061 | RegExpConstant,RegExpEscape | | regexp.cpp:96:19:96:22 | \\x61 | RegExpConstant,RegExpEscape | @@ -183,65 +183,65 @@ term | regexp.cpp:103:20:103:21 | \\0 | RegExpConstant,RegExpEscape | | regexp.cpp:104:20:104:23 | [\\0] | RegExpCharacterClass | | regexp.cpp:104:21:104:22 | \\0 | RegExpConstant,RegExpEscape | -| regexp.cpp:107:21:107:21 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:107:21:107:21 | a | RegExpConstant,RegExpNormalChars | | regexp.cpp:107:21:107:23 | a*? | RegExpStar | -| regexp.cpp:108:21:108:21 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:108:21:108:21 | b | RegExpConstant,RegExpNormalChars | | regexp.cpp:108:21:108:23 | b+? | RegExpPlus | -| regexp.cpp:109:21:109:21 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:109:21:109:21 | c | RegExpConstant,RegExpNormalChars | | regexp.cpp:109:21:109:23 | c?? | RegExpOpt | -| regexp.cpp:110:21:110:21 | d | RegExpConstant,RegExpNormalChar | +| regexp.cpp:110:21:110:21 | d | RegExpConstant,RegExpNormalChars | | regexp.cpp:110:21:110:27 | d{2,3}? | RegExpQuantifier | | regexp.cpp:111:18:111:19 | \\f | RegExpConstant,RegExpEscape | | regexp.cpp:111:18:111:21 | \\f\\v | RegExpSequence | | regexp.cpp:111:20:111:21 | \\v | RegExpConstant,RegExpEscape | -| regexp.cpp:114:25:114:25 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:114:25:114:25 | a | RegExpConstant,RegExpNormalChars | | regexp.cpp:114:25:114:28 | a\\nb | RegExpSequence | | regexp.cpp:114:26:114:27 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:114:28:114:28 | b | RegExpConstant,RegExpNormalChar | -| regexp.cpp:115:37:115:37 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:114:28:114:28 | b | RegExpConstant,RegExpNormalChars | +| regexp.cpp:115:37:115:37 | a | RegExpConstant,RegExpNormalChars | | regexp.cpp:115:37:115:40 | a\\nc | RegExpSequence | | regexp.cpp:115:38:115:39 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:115:40:115:40 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:116:39:116:39 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:115:40:115:40 | c | RegExpConstant,RegExpNormalChars | +| regexp.cpp:116:39:116:39 | a | RegExpConstant,RegExpNormalChars | | regexp.cpp:116:39:116:42 | a\\nc | RegExpSequence | | regexp.cpp:116:40:116:41 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:116:42:116:42 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:117:38:117:38 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:116:42:116:42 | c | RegExpConstant,RegExpNormalChars | +| regexp.cpp:117:38:117:38 | a | RegExpConstant,RegExpNormalChars | | regexp.cpp:117:38:117:41 | a\\nc | RegExpSequence | | regexp.cpp:117:39:117:40 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:117:41:117:41 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:118:38:118:38 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:117:41:117:41 | c | RegExpConstant,RegExpNormalChars | +| regexp.cpp:118:38:118:38 | a | RegExpConstant,RegExpNormalChars | | regexp.cpp:118:38:118:41 | a\\nc | RegExpSequence | | regexp.cpp:118:39:118:40 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:118:41:118:41 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:119:23:119:23 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:118:41:118:41 | c | RegExpConstant,RegExpNormalChars | +| regexp.cpp:119:23:119:23 | a | RegExpConstant,RegExpNormalChars | | regexp.cpp:119:23:119:26 | a\\nc | RegExpSequence | | regexp.cpp:119:24:119:25 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:119:26:119:26 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:120:26:120:26 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:119:26:119:26 | c | RegExpConstant,RegExpNormalChars | +| regexp.cpp:120:26:120:26 | a | RegExpConstant,RegExpNormalChars | | regexp.cpp:120:26:120:29 | a\\nc | RegExpSequence | | regexp.cpp:120:27:120:28 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:120:29:120:29 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:121:42:121:42 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:120:29:120:29 | c | RegExpConstant,RegExpNormalChars | +| regexp.cpp:121:42:121:42 | a | RegExpConstant,RegExpNormalChars | | regexp.cpp:121:42:121:45 | a\\nc | RegExpSequence | | regexp.cpp:121:43:121:44 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:121:45:121:45 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:122:41:122:41 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:121:45:121:45 | c | RegExpConstant,RegExpNormalChars | +| regexp.cpp:122:41:122:41 | a | RegExpConstant,RegExpNormalChars | | regexp.cpp:122:41:122:44 | a\\nc | RegExpSequence | | regexp.cpp:122:42:122:43 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:122:44:122:44 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:123:41:123:41 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:122:44:122:44 | c | RegExpConstant,RegExpNormalChars | +| regexp.cpp:123:41:123:41 | a | RegExpConstant,RegExpNormalChars | | regexp.cpp:123:41:123:44 | a\\nc | RegExpSequence | | regexp.cpp:123:42:123:43 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:123:44:123:44 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:124:25:124:25 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:123:44:123:44 | c | RegExpConstant,RegExpNormalChars | +| regexp.cpp:124:25:124:25 | a | RegExpConstant,RegExpNormalChars | | regexp.cpp:124:25:124:28 | a\\nc | RegExpSequence | | regexp.cpp:124:26:124:27 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:124:28:124:28 | c | RegExpConstant,RegExpNormalChar | -| regexp.cpp:125:29:125:29 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:124:28:124:28 | c | RegExpConstant,RegExpNormalChars | +| regexp.cpp:125:29:125:29 | a | RegExpConstant,RegExpNormalChars | | regexp.cpp:125:29:125:32 | a\\nc | RegExpSequence | | regexp.cpp:125:30:125:31 | \\n | RegExpConstant,RegExpEscape | -| regexp.cpp:125:32:125:32 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:125:32:125:32 | c | RegExpConstant,RegExpNormalChars | regExpNormalCharValue | regexp.cpp:19:19:19:21 | abc | abc | | regexp.cpp:22:20:22:20 | a | a | diff --git a/cpp/ql/test/library-tests/regex/regexp.ql b/cpp/ql/test/library-tests/regex/regexp.ql index b8eb41e12dbb..67246e433e9c 100644 --- a/cpp/ql/test/library-tests/regex/regexp.ql +++ b/cpp/ql/test/library-tests/regex/regexp.ql @@ -10,6 +10,6 @@ query predicate groupNumber(RegExpGroup g, int number) { number = g.getNumber() query predicate term(RegExpTerm term, string c) { c = term.getPrimaryQlClasses() } -query predicate regExpNormalCharValue(RegExpNormalChar term, string value) { +query predicate regExpNormalCharValue(RegExpNormalChars term, string value) { value = term.getValue() } From 9e52f2836be976c88a5576ad6aec9683d7b33b71 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Thu, 27 Aug 2026 12:50:29 +0100 Subject: [PATCH 0583/2098] C++: Test edge cases for string literal locations. --- cpp/ql/test/library-tests/regex/locations.expected | 1 + cpp/ql/test/library-tests/regex/parse.expected | 6 ++++++ cpp/ql/test/library-tests/regex/regexp.cpp | 7 +++++++ cpp/ql/test/library-tests/regex/regexp.expected | 6 ++++++ 4 files changed, 20 insertions(+) diff --git a/cpp/ql/test/library-tests/regex/locations.expected b/cpp/ql/test/library-tests/regex/locations.expected index 2b1d61175c94..2259740249f9 100644 --- a/cpp/ql/test/library-tests/regex/locations.expected +++ b/cpp/ql/test/library-tests/regex/locations.expected @@ -63,3 +63,4 @@ | regexp.cpp:123:41:123:44 | a\\nc | regexp.cpp | 123 | 41 | 123 | 44 | | regexp.cpp:124:25:124:28 | a\\nc | regexp.cpp | 124 | 25 | 124 | 28 | | regexp.cpp:125:29:125:32 | a\\nc | regexp.cpp | 125 | 29 | 125 | 32 | +| regexp.cpp:130:29:130:32 | abc1 | regexp.cpp | 130 | 29 | 130 | 32 | diff --git a/cpp/ql/test/library-tests/regex/parse.expected b/cpp/ql/test/library-tests/regex/parse.expected index 29673e73396f..ea724fca5d58 100644 --- a/cpp/ql/test/library-tests/regex/parse.expected +++ b/cpp/ql/test/library-tests/regex/parse.expected @@ -1,3 +1,7 @@ +#-----| [RegExpConstant, RegExpNormalChars] xabc3x + +#-----| [RegExpConstant, RegExpNormalChars] abc2 + regexp.cpp: # 19| [RegExpConstant, RegExpNormalChars] abc @@ -647,3 +651,5 @@ regexp.cpp: # 125| [RegExpConstant, RegExpEscape] \n # 125| [RegExpConstant, RegExpNormalChars] c + +# 130| [RegExpConstant, RegExpNormalChars] abc1 diff --git a/cpp/ql/test/library-tests/regex/regexp.cpp b/cpp/ql/test/library-tests/regex/regexp.cpp index 6c08079bf762..a7956aa4a21d 100644 --- a/cpp/ql/test/library-tests/regex/regexp.cpp +++ b/cpp/ql/test/library-tests/regex/regexp.cpp @@ -123,3 +123,10 @@ std::basic_regex r_loc_uR(uR"(a\nc)"); std::basic_regex r_loc_UR(UR"(a\nc)"); std::regex r_loc_Rx(R"x(a\nc)x"); std::regex r_loc_Rfoo(R"foo(a\nc)foo"); + +// Composite and stringified string literals +#define STRINGIFY(str) #str +#define WRAP(str) "x" #str "x" +std::regex r_loc_composite("ab" "c1"); +std::regex r_loc_macro1(STRINGIFY(abc2)); +std::regex r_loc_macro2(WRAP(abc3)); diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index dfc39e1027d4..d4cd3893f2b8 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -4,6 +4,8 @@ groupNumber | regexp.cpp:58:20:58:27 | (a\|b\|cd) | 1 | | regexp.cpp:62:21:62:24 | (a+) | 1 | term +| file://:0:0:0:0 | abc2 | RegExpConstant,RegExpNormalChars | +| file://:0:0:0:0 | xabc3x | RegExpConstant,RegExpNormalChars | | regexp.cpp:19:19:19:21 | abc | RegExpConstant,RegExpNormalChars | | regexp.cpp:22:20:22:20 | a | RegExpConstant,RegExpNormalChars | | regexp.cpp:22:20:22:21 | a* | RegExpStar | @@ -242,7 +244,10 @@ term | regexp.cpp:125:29:125:32 | a\\nc | RegExpSequence | | regexp.cpp:125:30:125:31 | \\n | RegExpConstant,RegExpEscape | | regexp.cpp:125:32:125:32 | c | RegExpConstant,RegExpNormalChars | +| regexp.cpp:130:29:130:32 | abc1 | RegExpConstant,RegExpNormalChars | regExpNormalCharValue +| file://:0:0:0:0 | abc2 | abc2 | +| file://:0:0:0:0 | xabc3x | xabc3x | | regexp.cpp:19:19:19:21 | abc | abc | | regexp.cpp:22:20:22:20 | a | a | | regexp.cpp:22:22:22:22 | b | b | @@ -366,3 +371,4 @@ regExpNormalCharValue | regexp.cpp:125:29:125:29 | a | a | | regexp.cpp:125:30:125:31 | \\n | \n | | regexp.cpp:125:32:125:32 | c | c | +| regexp.cpp:130:29:130:32 | abc1 | abc1 | From 8e169d351b11ab5534020b26755eb4afc704320e Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Thu, 27 Aug 2026 12:53:58 +0100 Subject: [PATCH 0584/2098] C++: Address an edge case for regex locations. --- cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll | 5 +++++ cpp/ql/test/library-tests/regex/locations.expected | 2 ++ cpp/ql/test/library-tests/regex/parse.expected | 8 ++++---- cpp/ql/test/library-tests/regex/regexp.expected | 8 ++++---- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll index 8d30fcc15873..5d664c0f89ed 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll @@ -222,6 +222,11 @@ private module Impl implements RegexTreeViewSig { // Find the opening '"'. not re instanceof RawStringLiteral and result = 1 + min(int i | vt.charAt(i) = "\"") + or + // No opening '"'. + not re instanceof RawStringLiteral and + not exists(int i | vt.charAt(i) = "\"") and + result = 0 ) } diff --git a/cpp/ql/test/library-tests/regex/locations.expected b/cpp/ql/test/library-tests/regex/locations.expected index 2259740249f9..faac1198b943 100644 --- a/cpp/ql/test/library-tests/regex/locations.expected +++ b/cpp/ql/test/library-tests/regex/locations.expected @@ -64,3 +64,5 @@ | regexp.cpp:124:25:124:28 | a\\nc | regexp.cpp | 124 | 25 | 124 | 28 | | regexp.cpp:125:29:125:32 | a\\nc | regexp.cpp | 125 | 29 | 125 | 32 | | regexp.cpp:130:29:130:32 | abc1 | regexp.cpp | 130 | 29 | 130 | 32 | +| regexp.cpp:131:35:131:38 | abc2 | regexp.cpp | 131 | 35 | 131 | 38 | +| regexp.cpp:132:25:132:30 | xabc3x | regexp.cpp | 132 | 25 | 132 | 30 | diff --git a/cpp/ql/test/library-tests/regex/parse.expected b/cpp/ql/test/library-tests/regex/parse.expected index ea724fca5d58..35ee14d13119 100644 --- a/cpp/ql/test/library-tests/regex/parse.expected +++ b/cpp/ql/test/library-tests/regex/parse.expected @@ -1,7 +1,3 @@ -#-----| [RegExpConstant, RegExpNormalChars] xabc3x - -#-----| [RegExpConstant, RegExpNormalChars] abc2 - regexp.cpp: # 19| [RegExpConstant, RegExpNormalChars] abc @@ -653,3 +649,7 @@ regexp.cpp: # 125| [RegExpConstant, RegExpNormalChars] c # 130| [RegExpConstant, RegExpNormalChars] abc1 + +# 131| [RegExpConstant, RegExpNormalChars] abc2 + +# 132| [RegExpConstant, RegExpNormalChars] xabc3x diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index d4cd3893f2b8..a5ce518846a4 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -4,8 +4,6 @@ groupNumber | regexp.cpp:58:20:58:27 | (a\|b\|cd) | 1 | | regexp.cpp:62:21:62:24 | (a+) | 1 | term -| file://:0:0:0:0 | abc2 | RegExpConstant,RegExpNormalChars | -| file://:0:0:0:0 | xabc3x | RegExpConstant,RegExpNormalChars | | regexp.cpp:19:19:19:21 | abc | RegExpConstant,RegExpNormalChars | | regexp.cpp:22:20:22:20 | a | RegExpConstant,RegExpNormalChars | | regexp.cpp:22:20:22:21 | a* | RegExpStar | @@ -245,9 +243,9 @@ term | regexp.cpp:125:30:125:31 | \\n | RegExpConstant,RegExpEscape | | regexp.cpp:125:32:125:32 | c | RegExpConstant,RegExpNormalChars | | regexp.cpp:130:29:130:32 | abc1 | RegExpConstant,RegExpNormalChars | +| regexp.cpp:131:35:131:38 | abc2 | RegExpConstant,RegExpNormalChars | +| regexp.cpp:132:25:132:30 | xabc3x | RegExpConstant,RegExpNormalChars | regExpNormalCharValue -| file://:0:0:0:0 | abc2 | abc2 | -| file://:0:0:0:0 | xabc3x | xabc3x | | regexp.cpp:19:19:19:21 | abc | abc | | regexp.cpp:22:20:22:20 | a | a | | regexp.cpp:22:22:22:22 | b | b | @@ -372,3 +370,5 @@ regExpNormalCharValue | regexp.cpp:125:30:125:31 | \\n | \n | | regexp.cpp:125:32:125:32 | c | c | | regexp.cpp:130:29:130:32 | abc1 | abc1 | +| regexp.cpp:131:35:131:38 | abc2 | abc2 | +| regexp.cpp:132:25:132:30 | xabc3x | xabc3x | From 52f171078dd5aa39384dc88b87045ec8fc62c672 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 28 Aug 2026 17:43:40 +0200 Subject: [PATCH 0585/2098] C++: Fix QL-for-QL alert and formatting issue --- cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll index 5d664c0f89ed..de3a12bb9e19 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll @@ -225,7 +225,7 @@ private module Impl implements RegexTreeViewSig { or // No opening '"'. not re instanceof RawStringLiteral and - not exists(int i | vt.charAt(i) = "\"") and + not vt.charAt(_) = "\"" and result = 0 ) } @@ -811,7 +811,7 @@ private module Impl implements RegexTreeViewSig { /** * A normal-character term in a regular expression, that is, a sequence - * of characters without special meaning or a single escaped character. + * of characters without special meaning or a single escaped character. * * Examples: * ``` From 50ed141605c8c428c53b64fdcc9f4fd144e69da3 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 28 Aug 2026 17:51:29 +0200 Subject: [PATCH 0586/2098] C++: Expand on `hasLocationInfo` fragility --- cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll index de3a12bb9e19..4d7176c14b75 100644 --- a/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll +++ b/cpp/ql/lib/semmle/code/cpp/regex/RegexTreeView.qll @@ -234,7 +234,7 @@ private module Impl implements RegexTreeViewSig { * Holds if this term is found at the specified location offsets. * * Note: these locations may not be accurate when the regex was not defined as a raw string - * and contains `\`-escaped characters. + * and contains `\`-escaped characters, or when macros were used to define the regex. */ predicate hasLocationInfo( string filepath, int startline, int startcolumn, int endline, int endcolumn From ef1b821b11c64a3149f5f6f9eb31afdd0e129d46 Mon Sep 17 00:00:00 2001 From: Mia Miu Date: Sat, 29 Aug 2026 17:33:23 +1200 Subject: [PATCH 0587/2098] Fix synchronized query-help file --- python/ql/src/Metrics/FLinesOfDuplicatedCodeCommon.inc.qhelp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/ql/src/Metrics/FLinesOfDuplicatedCodeCommon.inc.qhelp b/python/ql/src/Metrics/FLinesOfDuplicatedCodeCommon.inc.qhelp index 6fc36156c110..47e4c871dbe0 100644 --- a/python/ql/src/Metrics/FLinesOfDuplicatedCodeCommon.inc.qhelp +++ b/python/ql/src/Metrics/FLinesOfDuplicatedCodeCommon.inc.qhelp @@ -27,7 +27,7 @@ a shared library or module. -
  • Wikipedia: Duplicate code.
  • +
  • Wikipedia: Duplicate code.
  • M. Fowler, Refactoring. Addison-Wesley, 1999.
  • From 4796ff463e3dd83b535b26c7c8797721a5fa62e1 Mon Sep 17 00:00:00 2001 From: AkshayK Date: Sun, 30 Aug 2026 16:15:50 -0400 Subject: [PATCH 0588/2098] cpp: address review feedback on libpq SQL-injection sinks Trim the model-file comment and change note to house style, drop the redundant test header comment, and regenerate the expected results for the shifted line numbers. --- .../2026-08-27-libpq-sql-sinks.md | 2 +- cpp/ql/lib/ext/Postgres.model.yml | 8 ++-- .../CWE-089/SqlTainted/SqlTainted.expected | 38 +++++++++---------- .../CWE/CWE-089/SqlTainted/test_libpq.c | 3 -- 4 files changed, 24 insertions(+), 27 deletions(-) diff --git a/cpp/ql/lib/change-notes/2026-08-27-libpq-sql-sinks.md b/cpp/ql/lib/change-notes/2026-08-27-libpq-sql-sinks.md index 94899fdafafa..64cba8096173 100644 --- a/cpp/ql/lib/change-notes/2026-08-27-libpq-sql-sinks.md +++ b/cpp/ql/lib/change-notes/2026-08-27-libpq-sql-sinks.md @@ -1,4 +1,4 @@ --- category: minorAnalysis --- -* Added the PostgreSQL libpq query-execution functions (`PQexec`, `PQexecParams`, `PQprepare`, and their asynchronous `PQsendQuery`/`PQsendQueryParams`/`PQsendPrepare` counterparts) as `sql-injection` sinks, so the "Uncontrolled data used in SQL query" query flags tainted data reaching their command/query arguments. +* Added the PostgreSQL libpq (asynchronous) query-execution functions `PQexec`, `PQexecParams`, `PQprepare`, `PQsendQuery`, `PQsendQueryParams`, `PQsendPrepare` as `sql-injection` sinks. diff --git a/cpp/ql/lib/ext/Postgres.model.yml b/cpp/ql/lib/ext/Postgres.model.yml index 958522e09cbe..5c977ebc5756 100644 --- a/cpp/ql/lib/ext/Postgres.model.yml +++ b/cpp/ql/lib/ext/Postgres.model.yml @@ -4,10 +4,10 @@ extensions: pack: codeql/cpp-all extensible: sinkModel data: # namespace, type, subtypes, name, signature, ext, input, kind, provenance - # Functions that take a raw SQL command string. The `*Params`/`*Prepare` forms still - # interpret their command/query text as SQL, so injection into that text is a sink even - # though the parameter *values* are passed separately. The `*Prepared` forms take a - # prepared-statement name rather than SQL text and are therefore not modeled here. + # The `*Params`/`*Prepare` functions interpret their command/query text as SQL, + # so injection into that text is a sink even though the parameter values are + # passed separately. The `*Prepared` functions take a prepared-statement name + # rather than SQL text and are therefore not modeled here. - ["", "", False, "PQexec", "", "", "Argument[*1]", "sql-injection", "manual"] - ["", "", False, "PQexecParams", "", "", "Argument[*1]", "sql-injection", "manual"] - ["", "", False, "PQprepare", "", "", "Argument[*2]", "sql-injection", "manual"] diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected index 5dedd13a12bd..1f8441edcd61 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected @@ -6,12 +6,12 @@ | test.c:106:24:106:29 | query1 | test.c:101:8:101:16 | gets output argument | test.c:106:24:106:29 | query1 | This argument to a SQL query function is derived from $@. | test.c:101:8:101:16 | gets output argument | user input (string read by gets) | | test.c:107:28:107:33 | query1 | test.c:101:8:101:16 | gets output argument | test.c:107:28:107:33 | query1 | This argument to a SQL query function is derived from $@. | test.c:101:8:101:16 | gets output argument | user input (string read by gets) | | test.cpp:43:27:43:33 | *access to array | test.cpp:39:27:39:30 | **argv | test.cpp:43:27:43:33 | *access to array | This argument to a SQL query function is derived from $@ and then passed to pqxx::work::exec1((unnamed parameter 0)). | test.cpp:39:27:39:30 | **argv | user input (a command-line argument) | -| test_libpq.c:29:16:29:24 | userInput | test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:29:16:29:24 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:26:8:26:16 | gets output argument | user input (string read by gets) | -| test_libpq.c:30:22:30:30 | userInput | test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:30:22:30:30 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:26:8:26:16 | gets output argument | user input (string read by gets) | -| test_libpq.c:31:27:31:35 | userInput | test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:31:27:31:35 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:26:8:26:16 | gets output argument | user input (string read by gets) | -| test_libpq.c:32:21:32:29 | userInput | test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:32:21:32:29 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:26:8:26:16 | gets output argument | user input (string read by gets) | -| test_libpq.c:33:27:33:35 | userInput | test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:33:27:33:35 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:26:8:26:16 | gets output argument | user input (string read by gets) | -| test_libpq.c:34:31:34:39 | userInput | test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:34:31:34:39 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:26:8:26:16 | gets output argument | user input (string read by gets) | +| test_libpq.c:26:16:26:24 | userInput | test_libpq.c:23:8:23:16 | gets output argument | test_libpq.c:26:16:26:24 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:23:8:23:16 | gets output argument | user input (string read by gets) | +| test_libpq.c:27:22:27:30 | userInput | test_libpq.c:23:8:23:16 | gets output argument | test_libpq.c:27:22:27:30 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:23:8:23:16 | gets output argument | user input (string read by gets) | +| test_libpq.c:28:27:28:35 | userInput | test_libpq.c:23:8:23:16 | gets output argument | test_libpq.c:28:27:28:35 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:23:8:23:16 | gets output argument | user input (string read by gets) | +| test_libpq.c:29:21:29:29 | userInput | test_libpq.c:23:8:23:16 | gets output argument | test_libpq.c:29:21:29:29 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:23:8:23:16 | gets output argument | user input (string read by gets) | +| test_libpq.c:30:27:30:35 | userInput | test_libpq.c:23:8:23:16 | gets output argument | test_libpq.c:30:27:30:35 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:23:8:23:16 | gets output argument | user input (string read by gets) | +| test_libpq.c:31:31:31:39 | userInput | test_libpq.c:23:8:23:16 | gets output argument | test_libpq.c:31:31:31:39 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:23:8:23:16 | gets output argument | user input (string read by gets) | edges | test.c:14:27:14:30 | **argv | test.c:15:20:15:26 | *access to array | provenance | | | test.c:15:20:15:26 | *access to array | test.c:21:18:21:23 | *query1 | provenance | TaintFunction | @@ -26,12 +26,12 @@ edges | test.c:101:8:101:16 | gets output argument | test.c:106:24:106:29 | query1 | provenance | TaintFunction Sink:MaD:2 | | test.c:101:8:101:16 | gets output argument | test.c:107:28:107:33 | query1 | provenance | TaintFunction Sink:MaD:1 | | test.cpp:39:27:39:30 | **argv | test.cpp:43:27:43:33 | *access to array | provenance | | -| test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:29:16:29:24 | userInput | provenance | Sink:MaD:3 | -| test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:30:22:30:30 | userInput | provenance | Sink:MaD:4 | -| test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:31:27:31:35 | userInput | provenance | Sink:MaD:5 | -| test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:32:21:32:29 | userInput | provenance | Sink:MaD:7 | -| test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:33:27:33:35 | userInput | provenance | Sink:MaD:8 | -| test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:34:31:34:39 | userInput | provenance | Sink:MaD:6 | +| test_libpq.c:23:8:23:16 | gets output argument | test_libpq.c:26:16:26:24 | userInput | provenance | Sink:MaD:3 | +| test_libpq.c:23:8:23:16 | gets output argument | test_libpq.c:27:22:27:30 | userInput | provenance | Sink:MaD:4 | +| test_libpq.c:23:8:23:16 | gets output argument | test_libpq.c:28:27:28:35 | userInput | provenance | Sink:MaD:5 | +| test_libpq.c:23:8:23:16 | gets output argument | test_libpq.c:29:21:29:29 | userInput | provenance | Sink:MaD:7 | +| test_libpq.c:23:8:23:16 | gets output argument | test_libpq.c:30:27:30:35 | userInput | provenance | Sink:MaD:8 | +| test_libpq.c:23:8:23:16 | gets output argument | test_libpq.c:31:31:31:39 | userInput | provenance | Sink:MaD:6 | models | 1 | Sink: ; ; false; OCIStmtPrepare2; ; ; Argument[*3]; sql-injection; manual | | 2 | Sink: ; ; false; OCIStmtPrepare; ; ; Argument[*2]; sql-injection; manual | @@ -59,11 +59,11 @@ nodes | test.c:107:28:107:33 | query1 | semmle.label | query1 | | test.cpp:39:27:39:30 | **argv | semmle.label | **argv | | test.cpp:43:27:43:33 | *access to array | semmle.label | *access to array | -| test_libpq.c:26:8:26:16 | gets output argument | semmle.label | gets output argument | -| test_libpq.c:29:16:29:24 | userInput | semmle.label | userInput | -| test_libpq.c:30:22:30:30 | userInput | semmle.label | userInput | -| test_libpq.c:31:27:31:35 | userInput | semmle.label | userInput | -| test_libpq.c:32:21:32:29 | userInput | semmle.label | userInput | -| test_libpq.c:33:27:33:35 | userInput | semmle.label | userInput | -| test_libpq.c:34:31:34:39 | userInput | semmle.label | userInput | +| test_libpq.c:23:8:23:16 | gets output argument | semmle.label | gets output argument | +| test_libpq.c:26:16:26:24 | userInput | semmle.label | userInput | +| test_libpq.c:27:22:27:30 | userInput | semmle.label | userInput | +| test_libpq.c:28:27:28:35 | userInput | semmle.label | userInput | +| test_libpq.c:29:21:29:29 | userInput | semmle.label | userInput | +| test_libpq.c:30:27:30:35 | userInput | semmle.label | userInput | +| test_libpq.c:31:31:31:39 | userInput | semmle.label | userInput | subpaths diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/test_libpq.c b/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/test_libpq.c index 4fc26907b136..85ebe943ce62 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/test_libpq.c +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/test_libpq.c @@ -1,6 +1,3 @@ -// Test case for the PostgreSQL libpq SQL-injection sinks modeled in Postgres.model.yml. -// Associated with CWE-089: SQL injection. - typedef unsigned long size_t; typedef unsigned int Oid; typedef struct pg_conn PGconn; From 8701ce9f7e64bd26f4194fab75c7f6324be2c661 Mon Sep 17 00:00:00 2001 From: AkshayK Date: Thu, 27 Aug 2026 15:08:27 -0400 Subject: [PATCH 0589/2098] cpp: model BDE bdlbb::Blob byte-buffer taint flow Add flow summaries for the BDE segmented byte buffer BloombergLP::bdlbb::Blob so taint reaches a blob's payload bytes: - Accessor chain: Blob::buffer taints the returned BlobBuffer, and BlobBuffer::data/buffer taint the bytes. - bdlbb::BlobUtil::copy and getContiguousRangeOrCopy propagate taint between a blob and a flat buffer in both directions. This unblocks blob-carried sources such as bmqa::Message::getData, whose payload was previously stranded on the opaque Blob object. Not a duplicate; the bdlbb namespace had no coverage. Verified with a BloombergLP::bdlbb-shaped stub in the dataflow external-models harness. --- .../2026-08-27-bdlbb-blob-models.md | 4 + cpp/ql/lib/ext/bdlbb.model.yml | 20 +++++ .../dataflow/external-models/bdlbb.cpp | 83 +++++++++++++++++++ .../dataflow/external-models/flow.expected | 64 +++++++++++++- .../dataflow/external-models/steps.expected | 11 +++ .../external-models/validatemodels.expected | 3 + 6 files changed, 183 insertions(+), 2 deletions(-) create mode 100644 cpp/ql/lib/change-notes/2026-08-27-bdlbb-blob-models.md create mode 100644 cpp/ql/lib/ext/bdlbb.model.yml create mode 100644 cpp/ql/test/library-tests/dataflow/external-models/bdlbb.cpp diff --git a/cpp/ql/lib/change-notes/2026-08-27-bdlbb-blob-models.md b/cpp/ql/lib/change-notes/2026-08-27-bdlbb-blob-models.md new file mode 100644 index 000000000000..f1db9d3c3116 --- /dev/null +++ b/cpp/ql/lib/change-notes/2026-08-27-bdlbb-blob-models.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added flow summaries for the BDE `bdlbb::Blob` segmented byte buffer (`BloombergLP::bdlbb`). Taint now flows from a blob to its bytes through the `Blob::buffer`/`BlobBuffer::data` accessor chain and through the `bdlbb::BlobUtil::copy` and `getContiguousRangeOrCopy` helpers, so a blob populated from untrusted input (for example a BlazingMQ message body read via `bmqa::Message::getData`) is tracked into the payload bytes. diff --git a/cpp/ql/lib/ext/bdlbb.model.yml b/cpp/ql/lib/ext/bdlbb.model.yml new file mode 100644 index 000000000000..135f6c631e83 --- /dev/null +++ b/cpp/ql/lib/ext/bdlbb.model.yml @@ -0,0 +1,20 @@ +# Model of the BDE bdlbb::Blob segmented byte buffer (BloombergLP::bdlbb). +# Lets taint reach a blob's payload bytes, e.g. a message body filled by bmqa::Message::getData. +extensions: + - addsTo: + pack: codeql/cpp-all + extensible: summaryModel + data: # namespace, type, subtypes, name, signature, ext, input, output, kind, provenance + # Accessor chain: a tainted blob taints its buffers, and a tainted buffer taints its bytes. + - ["BloombergLP::bdlbb", "Blob", true, "buffer", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bdlbb", "BlobBuffer", true, "data", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + # BlobUtil read-out: the source blob (Argument[*1]) taints the destination buffer (and the + # returned contiguous range). + - ["BloombergLP::bdlbb", "BlobUtil", true, "copy", "(char *,const Blob &,int,int)", "", "Argument[*1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bdlbb", "BlobUtil", true, "getContiguousRangeOrCopy", "", "", "Argument[*1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bdlbb", "BlobUtil", true, "getContiguousRangeOrCopy", "", "", "Argument[*1]", "ReturnValue[*]", "taint", "manual"] + # BlobUtil write-in: the source (Argument[*2]) taints the destination blob. `copy` has two + # write-in overloads, one taking a raw byte buffer and one taking another blob as the source; + # each row pins the exact signature so the int offset/length arguments are never tainted. + - ["BloombergLP::bdlbb", "BlobUtil", true, "copy", "(Blob *,int,const char *,int)", "", "Argument[*2]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bdlbb", "BlobUtil", true, "copy", "(Blob *,int,const Blob &,int,int)", "", "Argument[*2]", "Argument[*0]", "taint", "manual"] diff --git a/cpp/ql/test/library-tests/dataflow/external-models/bdlbb.cpp b/cpp/ql/test/library-tests/dataflow/external-models/bdlbb.cpp new file mode 100644 index 000000000000..a76174c42d46 --- /dev/null +++ b/cpp/ql/test/library-tests/dataflow/external-models/bdlbb.cpp @@ -0,0 +1,83 @@ + +// --- stub library headers --- + +namespace bsl { + typedef unsigned long size_t; + template class allocator {}; + template struct char_traits {}; + template, class Allocator = allocator > + class basic_string { + public: + basic_string(const charT* s, const Allocator& a = Allocator()); + const charT* data() const; + size_t size() const; + }; + typedef basic_string string; +} + +namespace BloombergLP { +namespace bdlbb { + class BlobBuffer { + public: + char *data() const; + }; + + class Blob { + public: + const BlobBuffer &buffer(int index) const; + }; + + struct BlobUtil { + static void copy(char *dstBuffer, const Blob &srcBlob, int position, int length); + static void copy(Blob *dstBlob, int dstOffset, const char *srcBuffer, int length); + static void copy(Blob *dstBlob, int dstOffset, const Blob &srcBlob, int srcOffset, + int length); + static char *getContiguousRangeOrCopy(char *dstBuffer, const Blob &srcBlob, int position, + int length, int alignment); + }; +} +} + +// --- test code --- + +char *source(); +void sink(char); + +// A blob populated from a tainted buffer taints the bytes read back out of it. +void test_BlobUtil_copy() { + bsl::string s(source()); + BloombergLP::bdlbb::Blob blob; + BloombergLP::bdlbb::BlobUtil::copy(&blob, 0, s.data(), s.size()); + char dst[16]; + BloombergLP::bdlbb::BlobUtil::copy(dst, blob, 0, 16); + sink(*dst); // $ ir +} + +void test_accessor_chain() { + bsl::string s(source()); + BloombergLP::bdlbb::Blob blob; + BloombergLP::bdlbb::BlobUtil::copy(&blob, 0, s.data(), s.size()); + const char *p = blob.buffer(0).data(); + sink(*p); // $ ir +} + +void test_getContiguousRangeOrCopy() { + bsl::string s(source()); + BloombergLP::bdlbb::Blob blob; + BloombergLP::bdlbb::BlobUtil::copy(&blob, 0, s.data(), s.size()); + char dst[16]; + char *r = BloombergLP::bdlbb::BlobUtil::getContiguousRangeOrCopy(dst, blob, 0, 16, 1); + sink(*r); // $ ir +} + +// A blob copied into another blob carries the taint across. +void test_BlobUtil_copy_blob_to_blob() { + bsl::string s(source()); + BloombergLP::bdlbb::Blob src; + BloombergLP::bdlbb::BlobUtil::copy(&src, 0, s.data(), s.size()); + BloombergLP::bdlbb::Blob dst; + BloombergLP::bdlbb::BlobUtil::copy(&dst, 0, src, 0, 16); + char out[16]; + BloombergLP::bdlbb::BlobUtil::copy(out, dst, 0, 16); + sink(*out); // $ ir +} diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index b6f5f4a4452f..8989ddfa612b 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -95,7 +95,13 @@ models | 94 | Summary: Azure::Core::IO; BodyStream; true; ReadToCount; ; ; Argument[-1]; Argument[*0]; taint; manual | | 95 | Summary: Azure::Core::IO; BodyStream; true; ReadToEnd; ; ; Argument[-1]; ReturnValue.Element; taint; manual | | 96 | Summary: Azure; Nullable; true; Value; ; ; Argument[-1]; ReturnValue[*]; taint; manual | -| 97 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | +| 97 | Summary: BloombergLP::bdlbb; Blob; true; buffer; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 98 | Summary: BloombergLP::bdlbb; BlobBuffer; true; data; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 99 | Summary: BloombergLP::bdlbb; BlobUtil; true; copy; (Blob *,int,const Blob &,int,int); ; Argument[*2]; Argument[*0]; taint; manual | +| 100 | Summary: BloombergLP::bdlbb; BlobUtil; true; copy; (Blob *,int,const char *,int); ; Argument[*2]; Argument[*0]; taint; manual | +| 101 | Summary: BloombergLP::bdlbb; BlobUtil; true; copy; (char *,const Blob &,int,int); ; Argument[*1]; Argument[*0]; taint; manual | +| 102 | Summary: BloombergLP::bdlbb; BlobUtil; true; getContiguousRangeOrCopy; ; ; Argument[*1]; ReturnValue[*]; taint; manual | +| 103 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | edges | asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:91:7:91:17 | recv_buffer | provenance | Src:MaD:56 | | asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:93:29:93:39 | recv_buffer | provenance | Src:MaD:56 Sink:MaD:4 | @@ -104,7 +110,7 @@ edges | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | | | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:101:7:101:17 | send_buffer | provenance | | | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:103:29:103:39 | send_buffer | provenance | Sink:MaD:4 | -| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:97 | +| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:103 | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:257:5:257:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:262:5:262:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:266:38:266:41 | *resp | provenance | | @@ -144,6 +150,31 @@ edges | azure.cpp:294:38:294:53 | call to operator[] | azure.cpp:295:10:295:20 | contentType | provenance | | | azure.cpp:294:38:294:53 | call to operator[] | azure.cpp:295:10:295:20 | contentType | provenance | | | azure.cpp:295:10:295:20 | contentType | azure.cpp:295:10:295:20 | contentType | provenance | | +| bdlbb.cpp:48:16:48:23 | call to source | bdlbb.cpp:50:49:50:52 | *call to data | provenance | TaintFunction | +| bdlbb.cpp:50:37:50:41 | copy output argument | bdlbb.cpp:52:42:52:45 | *blob | provenance | | +| bdlbb.cpp:50:49:50:52 | *call to data | bdlbb.cpp:50:37:50:41 | copy output argument | provenance | MaD:100 | +| bdlbb.cpp:52:37:52:39 | copy output argument | bdlbb.cpp:53:7:53:10 | * ... | provenance | | +| bdlbb.cpp:52:42:52:45 | *blob | bdlbb.cpp:52:37:52:39 | copy output argument | provenance | MaD:101 | +| bdlbb.cpp:57:16:57:23 | call to source | bdlbb.cpp:59:49:59:52 | *call to data | provenance | TaintFunction | +| bdlbb.cpp:59:37:59:41 | copy output argument | bdlbb.cpp:60:18:60:21 | *blob | provenance | | +| bdlbb.cpp:59:49:59:52 | *call to data | bdlbb.cpp:59:37:59:41 | copy output argument | provenance | MaD:100 | +| bdlbb.cpp:60:18:60:21 | *blob | bdlbb.cpp:60:29:60:32 | *call to buffer | provenance | MaD:97 | +| bdlbb.cpp:60:18:60:38 | *call to data | bdlbb.cpp:60:18:60:38 | *call to data | provenance | | +| bdlbb.cpp:60:18:60:38 | *call to data | bdlbb.cpp:61:7:61:8 | * ... | provenance | | +| bdlbb.cpp:60:29:60:32 | *call to buffer | bdlbb.cpp:60:18:60:38 | *call to data | provenance | MaD:98 | +| bdlbb.cpp:65:16:65:23 | call to source | bdlbb.cpp:67:49:67:52 | *call to data | provenance | TaintFunction | +| bdlbb.cpp:67:37:67:41 | copy output argument | bdlbb.cpp:69:72:69:75 | *blob | provenance | | +| bdlbb.cpp:67:49:67:52 | *call to data | bdlbb.cpp:67:37:67:41 | copy output argument | provenance | MaD:100 | +| bdlbb.cpp:69:12:69:65 | *call to getContiguousRangeOrCopy | bdlbb.cpp:69:12:69:65 | *call to getContiguousRangeOrCopy | provenance | | +| bdlbb.cpp:69:12:69:65 | *call to getContiguousRangeOrCopy | bdlbb.cpp:70:7:70:8 | * ... | provenance | | +| bdlbb.cpp:69:72:69:75 | *blob | bdlbb.cpp:69:12:69:65 | *call to getContiguousRangeOrCopy | provenance | MaD:102 | +| bdlbb.cpp:75:16:75:23 | call to source | bdlbb.cpp:77:48:77:51 | *call to data | provenance | TaintFunction | +| bdlbb.cpp:77:37:77:40 | copy output argument | bdlbb.cpp:79:46:79:48 | *src | provenance | | +| bdlbb.cpp:77:48:77:51 | *call to data | bdlbb.cpp:77:37:77:40 | copy output argument | provenance | MaD:100 | +| bdlbb.cpp:79:37:79:40 | copy output argument | bdlbb.cpp:81:42:81:44 | *dst | provenance | | +| bdlbb.cpp:79:46:79:48 | *src | bdlbb.cpp:79:37:79:40 | copy output argument | provenance | MaD:99 | +| bdlbb.cpp:81:37:81:39 | copy output argument | bdlbb.cpp:82:7:82:10 | * ... | provenance | | +| bdlbb.cpp:81:42:81:44 | *dst | bdlbb.cpp:81:37:81:39 | copy output argument | provenance | MaD:101 | | test.cpp:7:47:7:52 | value2 | test.cpp:7:64:7:69 | value2 | provenance | | | test.cpp:7:64:7:69 | value2 | test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | provenance | | | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:10:10:10:18 | call to ymlSource | provenance | Src:MaD:48 | @@ -532,6 +563,35 @@ nodes | azure.cpp:295:10:295:20 | contentType | semmle.label | contentType | | azure.cpp:295:10:295:20 | contentType | semmle.label | contentType | | azure.cpp:295:10:295:20 | contentType | semmle.label | contentType | +| bdlbb.cpp:48:16:48:23 | call to source | semmle.label | call to source | +| bdlbb.cpp:50:37:50:41 | copy output argument | semmle.label | copy output argument | +| bdlbb.cpp:50:49:50:52 | *call to data | semmle.label | *call to data | +| bdlbb.cpp:52:37:52:39 | copy output argument | semmle.label | copy output argument | +| bdlbb.cpp:52:42:52:45 | *blob | semmle.label | *blob | +| bdlbb.cpp:53:7:53:10 | * ... | semmle.label | * ... | +| bdlbb.cpp:57:16:57:23 | call to source | semmle.label | call to source | +| bdlbb.cpp:59:37:59:41 | copy output argument | semmle.label | copy output argument | +| bdlbb.cpp:59:49:59:52 | *call to data | semmle.label | *call to data | +| bdlbb.cpp:60:18:60:21 | *blob | semmle.label | *blob | +| bdlbb.cpp:60:18:60:38 | *call to data | semmle.label | *call to data | +| bdlbb.cpp:60:18:60:38 | *call to data | semmle.label | *call to data | +| bdlbb.cpp:60:29:60:32 | *call to buffer | semmle.label | *call to buffer | +| bdlbb.cpp:61:7:61:8 | * ... | semmle.label | * ... | +| bdlbb.cpp:65:16:65:23 | call to source | semmle.label | call to source | +| bdlbb.cpp:67:37:67:41 | copy output argument | semmle.label | copy output argument | +| bdlbb.cpp:67:49:67:52 | *call to data | semmle.label | *call to data | +| bdlbb.cpp:69:12:69:65 | *call to getContiguousRangeOrCopy | semmle.label | *call to getContiguousRangeOrCopy | +| bdlbb.cpp:69:12:69:65 | *call to getContiguousRangeOrCopy | semmle.label | *call to getContiguousRangeOrCopy | +| bdlbb.cpp:69:72:69:75 | *blob | semmle.label | *blob | +| bdlbb.cpp:70:7:70:8 | * ... | semmle.label | * ... | +| bdlbb.cpp:75:16:75:23 | call to source | semmle.label | call to source | +| bdlbb.cpp:77:37:77:40 | copy output argument | semmle.label | copy output argument | +| bdlbb.cpp:77:48:77:51 | *call to data | semmle.label | *call to data | +| bdlbb.cpp:79:37:79:40 | copy output argument | semmle.label | copy output argument | +| bdlbb.cpp:79:46:79:48 | *src | semmle.label | *src | +| bdlbb.cpp:81:37:81:39 | copy output argument | semmle.label | copy output argument | +| bdlbb.cpp:81:42:81:44 | *dst | semmle.label | *dst | +| bdlbb.cpp:82:7:82:10 | * ... | semmle.label | * ... | | test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | semmle.label | *ymlStepGenerated_with_body | | test.cpp:7:47:7:52 | value2 | semmle.label | value2 | | test.cpp:7:64:7:69 | value2 | semmle.label | value2 | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/steps.expected b/cpp/ql/test/library-tests/dataflow/external-models/steps.expected index 0fe13460cfbf..9a455ec8ab8c 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/steps.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/steps.expected @@ -4,6 +4,17 @@ | azure.cpp:262:5:262:8 | *resp | azure.cpp:262:23:262:28 | ReadToCount output argument | | azure.cpp:287:79:287:98 | call to string | azure.cpp:287:62:287:99 | call to Url | | azure.cpp:289:24:289:56 | call to GetHeader | azure.cpp:289:63:289:65 | call to Value | +| bdlbb.cpp:50:49:50:52 | *call to data | bdlbb.cpp:50:37:50:41 | copy output argument | +| bdlbb.cpp:52:42:52:45 | *blob | bdlbb.cpp:52:37:52:39 | copy output argument | +| bdlbb.cpp:59:49:59:52 | *call to data | bdlbb.cpp:59:37:59:41 | copy output argument | +| bdlbb.cpp:60:18:60:21 | *blob | bdlbb.cpp:60:29:60:32 | *call to buffer | +| bdlbb.cpp:60:29:60:32 | *call to buffer | bdlbb.cpp:60:18:60:38 | *call to data | +| bdlbb.cpp:67:49:67:52 | *call to data | bdlbb.cpp:67:37:67:41 | copy output argument | +| bdlbb.cpp:69:72:69:75 | *blob | bdlbb.cpp:69:12:69:65 | *call to getContiguousRangeOrCopy | +| bdlbb.cpp:69:72:69:75 | *blob | bdlbb.cpp:69:67:69:69 | getContiguousRangeOrCopy output argument | +| bdlbb.cpp:77:48:77:51 | *call to data | bdlbb.cpp:77:37:77:40 | copy output argument | +| bdlbb.cpp:79:46:79:48 | *src | bdlbb.cpp:79:37:79:40 | copy output argument | +| bdlbb.cpp:81:42:81:44 | *dst | bdlbb.cpp:81:37:81:39 | copy output argument | | test.cpp:17:24:17:24 | x | test.cpp:17:10:17:22 | call to ymlStepManual | | test.cpp:21:27:21:27 | x | test.cpp:21:10:21:25 | call to ymlStepGenerated | | test.cpp:25:35:25:35 | x | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/validatemodels.expected b/cpp/ql/test/library-tests/dataflow/external-models/validatemodels.expected index 15ae50bddc26..1fbe5da66459 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/validatemodels.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/validatemodels.expected @@ -370,6 +370,8 @@ | Dubious signature "(BN_MONT_CTX *,const BIGNUM *,int,const unsigned char *,size_t,uint32_t,uint32_t)" in summary model. | | Dubious signature "(BN_RECP_CTX *,const BIGNUM *,BN_CTX *)" in summary model. | | Dubious signature "(BUF_MEM *,size_t)" in summary model. | +| Dubious signature "(Blob *,int,const Blob &,int,int)" in summary model. | +| Dubious signature "(Blob *,int,const char *,int)" in summary model. | | Dubious signature "(BrotliBitReader *const,uint64_t,uint64_t *)" in summary model. | | Dubious signature "(BrotliDecoderState *,BrotliDecoderStateInternal *,BrotliSharedDictionaryType,size_t,const uint8_t[])" in summary model. | | Dubious signature "(BrotliDecoderState *,BrotliDecoderStateInternal *,brotli_decoder_metadata_start_func,brotli_decoder_metadata_chunk_func,void *)" in summary model. | @@ -2948,6 +2950,7 @@ | Dubious signature "(char *,char *__restrict__,int,FILE *,FILE *__restrict__)" in summary model. | | Dubious signature "(char *,char *__restrict__,size_t,const char *,const char *__restrict__,const tm *,const tm *__restrict__,locale_t)" in summary model. | | Dubious signature "(char *,char,char **)" in summary model. | +| Dubious signature "(char *,const Blob &,int,int)" in summary model. | | Dubious signature "(char *,const char *)" in summary model. | | Dubious signature "(char *,const char **,const char **,const char **,const char **,const char **)" in summary model. | | Dubious signature "(char *,const char *,char **)" in summary model. | From a7186e559a734dffbaf9a99202fb08f9902a15bc Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 31 Aug 2026 09:15:07 +0200 Subject: [PATCH 0590/2098] Rust: Fix model missed by Copilot --- .../dataflow/models/models.expected | 130 ++++++++++-------- .../dataflow/models/models.ext.yml | 2 +- 2 files changed, 74 insertions(+), 58 deletions(-) diff --git a/rust/ql/test/library-tests/dataflow/models/models.expected b/rust/ql/test/library-tests/dataflow/models/models.expected index 15e5d5f268d0..e9f7bd86efd8 100644 --- a/rust/ql/test/library-tests/dataflow/models/models.expected +++ b/rust/ql/test/library-tests/dataflow/models/models.expected @@ -21,23 +21,24 @@ models | 20 | Summary: ::max; Argument[self,0]; ReturnValue; value | | 21 | Summary: ::lt; Argument[self].Reference; ReturnValue; taint | | 22 | Summary: ::index; Argument[self].Reference.Element; ReturnValue.Reference; value | -| 23 | Summary: main::apply; Argument[0]; Argument[1].Parameter[0]; value | -| 24 | Summary: main::apply; Argument[1].ReturnValue; ReturnValue; value | -| 25 | Summary: main::coerce; Argument[0]; ReturnValue; taint | -| 26 | Summary: main::external_file::generated_summary; Argument[0]; ReturnValue; value | -| 27 | Summary: main::external_file::neutral_manual_summary; Argument[0]; ReturnValue; value | -| 28 | Summary: main::get_array_element; Argument[0].Element; ReturnValue; value | -| 29 | Summary: main::get_async_number; Argument[0]; ReturnValue.Future; value | -| 30 | Summary: main::get_struct_field; Argument[0].Field[main::MyStruct::field1]; ReturnValue; value | -| 31 | Summary: main::get_tuple_element; Argument[0].Field[0]; ReturnValue; value | -| 32 | Summary: main::get_var_field; Argument[0].Field[main::MyFieldEnum::C::field_c]; ReturnValue; value | -| 33 | Summary: main::get_var_pos; Argument[0].Field[main::MyPosEnum::A(0)]; ReturnValue; value | -| 34 | Summary: main::set_array_element; Argument[0]; ReturnValue.Element; value | -| 35 | Summary: main::set_struct_field; Argument[0]; ReturnValue.Field[main::MyStruct::field2]; value | -| 36 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value | -| 37 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value | -| 38 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value | -| 39 | Summary: main::snd; Argument[1]; ReturnValue; value | +| 23 | Summary: ::flow_through2; Argument[0]; ReturnValue; value | +| 24 | Summary: main::apply; Argument[0]; Argument[1].Parameter[0]; value | +| 25 | Summary: main::apply; Argument[1].ReturnValue; ReturnValue; value | +| 26 | Summary: main::coerce; Argument[0]; ReturnValue; taint | +| 27 | Summary: main::external_file::generated_summary; Argument[0]; ReturnValue; value | +| 28 | Summary: main::external_file::neutral_manual_summary; Argument[0]; ReturnValue; value | +| 29 | Summary: main::get_array_element; Argument[0].Element; ReturnValue; value | +| 30 | Summary: main::get_async_number; Argument[0]; ReturnValue.Future; value | +| 31 | Summary: main::get_struct_field; Argument[0].Field[main::MyStruct::field1]; ReturnValue; value | +| 32 | Summary: main::get_tuple_element; Argument[0].Field[0]; ReturnValue; value | +| 33 | Summary: main::get_var_field; Argument[0].Field[main::MyFieldEnum::C::field_c]; ReturnValue; value | +| 34 | Summary: main::get_var_pos; Argument[0].Field[main::MyPosEnum::A(0)]; ReturnValue; value | +| 35 | Summary: main::set_array_element; Argument[0]; ReturnValue.Element; value | +| 36 | Summary: main::set_struct_field; Argument[0]; ReturnValue.Field[main::MyStruct::field2]; value | +| 37 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value | +| 38 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value | +| 39 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value | +| 40 | Summary: main::snd; Argument[1]; ReturnValue; value | edges | main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | | | main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | | @@ -47,13 +48,13 @@ edges | main.rs:16:19:16:19 | s | main.rs:16:10:16:20 | identity(...) | provenance | QL | | main.rs:25:9:25:9 | s | main.rs:26:17:26:17 | s | provenance | | | main.rs:25:13:25:22 | source(...) | main.rs:25:9:25:9 | s | provenance | | -| main.rs:26:17:26:17 | s | main.rs:26:10:26:18 | coerce(...) | provenance | MaD:25 | +| main.rs:26:17:26:17 | s | main.rs:26:10:26:18 | coerce(...) | provenance | MaD:26 | | main.rs:41:9:41:10 | s1 | main.rs:42:17:42:18 | s1 | provenance | | | main.rs:41:9:41:10 | s1 | main.rs:42:17:42:18 | s1 | provenance | | | main.rs:41:14:41:23 | source(...) | main.rs:41:9:41:10 | s1 | provenance | | | main.rs:41:14:41:23 | source(...) | main.rs:41:9:41:10 | s1 | provenance | | -| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:39 | -| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:39 | +| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:40 | +| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:40 | | main.rs:54:9:54:9 | s | main.rs:55:27:55:27 | s | provenance | | | main.rs:54:9:54:9 | s | main.rs:55:27:55:27 | s | provenance | | | main.rs:54:13:54:21 | source(...) | main.rs:54:9:54:9 | s | provenance | | @@ -64,8 +65,8 @@ edges | main.rs:55:14:55:28 | ...::A(...) [A] | main.rs:55:9:55:10 | e1 [A] | provenance | | | main.rs:55:27:55:27 | s | main.rs:55:14:55:28 | ...::A(...) [A] | provenance | | | main.rs:55:27:55:27 | s | main.rs:55:14:55:28 | ...::A(...) [A] | provenance | | -| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:33 | -| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:33 | +| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:34 | +| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:34 | | main.rs:67:9:67:9 | s | main.rs:68:26:68:26 | s | provenance | | | main.rs:67:9:67:9 | s | main.rs:68:26:68:26 | s | provenance | | | main.rs:67:13:67:21 | source(...) | main.rs:67:9:67:9 | s | provenance | | @@ -74,8 +75,8 @@ edges | main.rs:68:9:68:10 | e1 [B] | main.rs:69:11:69:12 | e1 [B] | provenance | | | main.rs:68:14:68:27 | set_var_pos(...) [B] | main.rs:68:9:68:10 | e1 [B] | provenance | | | main.rs:68:14:68:27 | set_var_pos(...) [B] | main.rs:68:9:68:10 | e1 [B] | provenance | | -| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:38 | -| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:38 | +| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:39 | +| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:39 | | main.rs:69:11:69:12 | e1 [B] | main.rs:71:9:71:23 | ...::B(...) [B] | provenance | | | main.rs:69:11:69:12 | e1 [B] | main.rs:71:9:71:23 | ...::B(...) [B] | provenance | | | main.rs:71:9:71:23 | ...::B(...) [B] | main.rs:71:22:71:22 | i | provenance | | @@ -92,8 +93,8 @@ edges | main.rs:88:14:88:42 | ...::C {...} [C] | main.rs:88:9:88:10 | e1 [C] | provenance | | | main.rs:88:40:88:40 | s | main.rs:88:14:88:42 | ...::C {...} [C] | provenance | | | main.rs:88:40:88:40 | s | main.rs:88:14:88:42 | ...::C {...} [C] | provenance | | -| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:32 | -| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:32 | +| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:33 | +| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:33 | | main.rs:100:9:100:9 | s | main.rs:101:28:101:28 | s | provenance | | | main.rs:100:9:100:9 | s | main.rs:101:28:101:28 | s | provenance | | | main.rs:100:13:100:21 | source(...) | main.rs:100:9:100:9 | s | provenance | | @@ -102,8 +103,8 @@ edges | main.rs:101:9:101:10 | e1 [D] | main.rs:102:11:102:12 | e1 [D] | provenance | | | main.rs:101:14:101:29 | set_var_field(...) [D] | main.rs:101:9:101:10 | e1 [D] | provenance | | | main.rs:101:14:101:29 | set_var_field(...) [D] | main.rs:101:9:101:10 | e1 [D] | provenance | | -| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:37 | -| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:37 | +| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:38 | +| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:38 | | main.rs:102:11:102:12 | e1 [D] | main.rs:104:9:104:37 | ...::D {...} [D] | provenance | | | main.rs:102:11:102:12 | e1 [D] | main.rs:104:9:104:37 | ...::D {...} [D] | provenance | | | main.rs:104:9:104:37 | ...::D {...} [D] | main.rs:104:35:104:35 | i | provenance | | @@ -120,8 +121,8 @@ edges | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | main.rs:121:9:121:17 | my_struct [MyStruct.field1] | provenance | | | main.rs:122:17:122:17 | s | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | provenance | | | main.rs:122:17:122:17 | s | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | provenance | | -| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:30 | -| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:30 | +| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:31 | +| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:31 | | main.rs:142:9:142:9 | s | main.rs:143:38:143:38 | s | provenance | | | main.rs:142:9:142:9 | s | main.rs:143:38:143:38 | s | provenance | | | main.rs:142:13:142:21 | source(...) | main.rs:142:9:142:9 | s | provenance | | @@ -130,16 +131,16 @@ edges | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | provenance | | | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | provenance | | | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | provenance | | -| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:35 | -| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:35 | +| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:36 | +| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:36 | | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | main.rs:145:10:145:25 | my_struct.field2 | provenance | | | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | main.rs:145:10:145:25 | my_struct.field2 | provenance | | | main.rs:154:9:154:9 | s | main.rs:155:29:155:29 | s | provenance | | | main.rs:154:9:154:9 | s | main.rs:155:29:155:29 | s | provenance | | | main.rs:154:13:154:21 | source(...) | main.rs:154:9:154:9 | s | provenance | | | main.rs:154:13:154:21 | source(...) | main.rs:154:9:154:9 | s | provenance | | -| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:28 | -| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:28 | +| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:29 | +| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:29 | | main.rs:155:29:155:29 | s | main.rs:155:28:155:30 | [...] [element] | provenance | | | main.rs:155:29:155:29 | s | main.rs:155:28:155:30 | [...] [element] | provenance | | | main.rs:164:9:164:9 | s | main.rs:165:33:165:33 | s | provenance | | @@ -150,8 +151,8 @@ edges | main.rs:165:9:165:11 | arr [element] | main.rs:166:10:166:12 | arr [element] | provenance | | | main.rs:165:15:165:34 | set_array_element(...) [element] | main.rs:165:9:165:11 | arr [element] | provenance | | | main.rs:165:15:165:34 | set_array_element(...) [element] | main.rs:165:9:165:11 | arr [element] | provenance | | -| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:34 | -| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:34 | +| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:35 | +| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:35 | | main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:22 | | main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:22 | | main.rs:175:9:175:9 | s | main.rs:176:14:176:14 | s | provenance | | @@ -164,8 +165,8 @@ edges | main.rs:176:13:176:18 | TupleExpr [tuple.0] | main.rs:176:9:176:9 | t [tuple.0] | provenance | | | main.rs:176:14:176:14 | s | main.rs:176:13:176:18 | TupleExpr [tuple.0] | provenance | | | main.rs:176:14:176:14 | s | main.rs:176:13:176:18 | TupleExpr [tuple.0] | provenance | | -| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:31 | -| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:31 | +| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:32 | +| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:32 | | main.rs:188:9:188:9 | s | main.rs:189:31:189:31 | s | provenance | | | main.rs:188:9:188:9 | s | main.rs:189:31:189:31 | s | provenance | | | main.rs:188:13:188:22 | source(...) | main.rs:188:9:188:9 | s | provenance | | @@ -174,8 +175,8 @@ edges | main.rs:189:9:189:9 | t [tuple.1] | main.rs:191:10:191:10 | t [tuple.1] | provenance | | | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | main.rs:189:9:189:9 | t [tuple.1] | provenance | | | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | main.rs:189:9:189:9 | t [tuple.1] | provenance | | -| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:36 | -| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:36 | +| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:37 | +| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:37 | | main.rs:191:10:191:10 | t [tuple.1] | main.rs:191:10:191:12 | t.1 | provenance | | | main.rs:191:10:191:10 | t [tuple.1] | main.rs:191:10:191:12 | t.1 | provenance | | | main.rs:203:9:203:9 | s | main.rs:208:11:208:11 | s | provenance | | @@ -184,8 +185,8 @@ edges | main.rs:203:13:203:22 | source(...) | main.rs:203:9:203:9 | s | provenance | | | main.rs:204:14:204:14 | ... | main.rs:205:14:205:14 | n | provenance | | | main.rs:204:14:204:14 | ... | main.rs:205:14:205:14 | n | provenance | | -| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:23 | -| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:23 | +| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:24 | +| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:24 | | main.rs:212:13:212:22 | source(...) | main.rs:214:23:214:23 | f [captured s] | provenance | | | main.rs:212:13:212:22 | source(...) | main.rs:214:23:214:23 | f [captured s] | provenance | | | main.rs:213:40:213:40 | s | main.rs:213:17:213:42 | if ... {...} else {...} | provenance | | @@ -194,14 +195,14 @@ edges | main.rs:214:9:214:9 | t | main.rs:215:10:215:10 | t | provenance | | | main.rs:214:13:214:24 | apply(...) | main.rs:214:9:214:9 | t | provenance | | | main.rs:214:13:214:24 | apply(...) | main.rs:214:9:214:9 | t | provenance | | -| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:23 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:23 | | main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:24 | | main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:24 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:23 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:23 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:25 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:25 | | main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:24 | | main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:24 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:25 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:25 | | main.rs:219:9:219:9 | s | main.rs:221:19:221:19 | s | provenance | | | main.rs:219:9:219:9 | s | main.rs:221:19:221:19 | s | provenance | | | main.rs:219:13:219:22 | source(...) | main.rs:219:9:219:9 | s | provenance | | @@ -212,10 +213,10 @@ edges | main.rs:221:9:221:9 | t | main.rs:222:10:222:10 | t | provenance | | | main.rs:221:13:221:23 | apply(...) | main.rs:221:9:221:9 | t | provenance | | | main.rs:221:13:221:23 | apply(...) | main.rs:221:9:221:9 | t | provenance | | -| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | provenance | MaD:23 | -| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | provenance | MaD:23 | -| main.rs:221:19:221:19 | s | main.rs:221:13:221:23 | apply(...) | provenance | MaD:23 | -| main.rs:221:19:221:19 | s | main.rs:221:13:221:23 | apply(...) | provenance | MaD:23 | +| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | provenance | MaD:24 | +| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | provenance | MaD:24 | +| main.rs:221:19:221:19 | s | main.rs:221:13:221:23 | apply(...) | provenance | MaD:24 | +| main.rs:221:19:221:19 | s | main.rs:221:13:221:23 | apply(...) | provenance | MaD:24 | | main.rs:231:9:231:9 | s | main.rs:232:30:232:30 | s | provenance | | | main.rs:231:9:231:9 | s | main.rs:232:30:232:30 | s | provenance | | | main.rs:231:13:231:22 | source(...) | main.rs:231:9:231:9 | s | provenance | | @@ -226,8 +227,8 @@ edges | main.rs:232:13:232:31 | get_async_number(...) [future] | main.rs:232:13:232:37 | await ... | provenance | | | main.rs:232:13:232:37 | await ... | main.rs:232:9:232:9 | t | provenance | | | main.rs:232:13:232:37 | await ... | main.rs:232:9:232:9 | t | provenance | | -| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:29 | -| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:29 | +| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:30 | +| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:30 | | main.rs:257:9:257:9 | s [D] | main.rs:258:11:258:11 | s [D] | provenance | | | main.rs:257:9:257:9 | s [D] | main.rs:258:11:258:11 | s [D] | provenance | | | main.rs:257:13:257:27 | enum_source(...) | main.rs:257:9:257:9 | s [D] | provenance | Src:MaD:12 | @@ -368,6 +369,12 @@ edges | main.rs:497:9:497:10 | x6 | main.rs:498:10:498:11 | x6 | provenance | | | main.rs:497:14:497:23 | source(...) | main.rs:497:14:497:27 | ... < ... | provenance | MaD:21 | | main.rs:497:14:497:27 | ... < ... | main.rs:497:9:497:10 | x6 | provenance | | +| main.rs:503:9:503:10 | x8 | main.rs:504:10:504:11 | x8 | provenance | | +| main.rs:503:9:503:10 | x8 | main.rs:504:10:504:11 | x8 | provenance | | +| main.rs:503:14:503:44 | ...::flow_through2(...) | main.rs:503:9:503:10 | x8 | provenance | | +| main.rs:503:14:503:44 | ...::flow_through2(...) | main.rs:503:9:503:10 | x8 | provenance | | +| main.rs:503:34:503:43 | source(...) | main.rs:503:14:503:44 | ...::flow_through2(...) | provenance | MaD:23 | +| main.rs:503:34:503:43 | source(...) | main.rs:503:14:503:44 | ...::flow_through2(...) | provenance | MaD:23 | | main.rs:506:9:506:10 | x9 | main.rs:507:10:507:11 | x9 | provenance | | | main.rs:506:9:506:10 | x9 | main.rs:507:10:507:11 | x9 | provenance | | | main.rs:506:14:506:44 | ...::flow_through3(...) | main.rs:506:9:506:10 | x9 | provenance | | @@ -382,10 +389,10 @@ edges | main.rs:522:20:522:28 | source(...) | main.rs:522:20:522:28 | source(...) | provenance | Sink:MaD:4 | | main.rs:524:25:524:33 | source(...) | main.rs:524:25:524:33 | source(...) | provenance | Sink:MaD:5 | | main.rs:524:25:524:33 | source(...) | main.rs:524:25:524:33 | source(...) | provenance | Sink:MaD:5 | -| main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | provenance | MaD:26 | -| main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | provenance | MaD:26 | -| main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | provenance | MaD:27 | -| main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | provenance | MaD:27 | +| main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | provenance | MaD:27 | +| main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | provenance | MaD:27 | +| main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | provenance | MaD:28 | +| main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | provenance | MaD:28 | nodes | main.rs:15:9:15:9 | s | semmle.label | s | | main.rs:15:9:15:9 | s | semmle.label | s | @@ -785,6 +792,14 @@ nodes | main.rs:497:14:497:23 | source(...) | semmle.label | source(...) | | main.rs:497:14:497:27 | ... < ... | semmle.label | ... < ... | | main.rs:498:10:498:11 | x6 | semmle.label | x6 | +| main.rs:503:9:503:10 | x8 | semmle.label | x8 | +| main.rs:503:9:503:10 | x8 | semmle.label | x8 | +| main.rs:503:14:503:44 | ...::flow_through2(...) | semmle.label | ...::flow_through2(...) | +| main.rs:503:14:503:44 | ...::flow_through2(...) | semmle.label | ...::flow_through2(...) | +| main.rs:503:34:503:43 | source(...) | semmle.label | source(...) | +| main.rs:503:34:503:43 | source(...) | semmle.label | source(...) | +| main.rs:504:10:504:11 | x8 | semmle.label | x8 | +| main.rs:504:10:504:11 | x8 | semmle.label | x8 | | main.rs:506:9:506:10 | x9 | semmle.label | x9 | | main.rs:506:9:506:10 | x9 | semmle.label | x9 | | main.rs:506:14:506:44 | ...::flow_through3(...) | semmle.label | ...::flow_through3(...) | @@ -823,7 +838,6 @@ subpaths | main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | main.rs:220:17:220:42 | if ... {...} else {...} | main.rs:221:13:221:23 | apply(...) | | main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | main.rs:220:17:220:42 | if ... {...} else {...} | main.rs:221:13:221:23 | apply(...) | testFailures -| main.rs:504:15:504:34 | //... | Missing result: hasValueFlow=29 | invalidSpecComponent #select | main.rs:16:10:16:20 | identity(...) | main.rs:15:13:15:21 | source(...) | main.rs:16:10:16:20 | identity(...) | $@ | main.rs:15:13:15:21 | source(...) | source(...) | @@ -901,6 +915,8 @@ invalidSpecComponent | main.rs:492:10:492:11 | x4 | main.rs:491:14:491:23 | source(...) | main.rs:492:10:492:11 | x4 | $@ | main.rs:491:14:491:23 | source(...) | source(...) | | main.rs:495:10:495:11 | x5 | main.rs:494:14:494:23 | source(...) | main.rs:495:10:495:11 | x5 | $@ | main.rs:494:14:494:23 | source(...) | source(...) | | main.rs:498:10:498:11 | x6 | main.rs:497:14:497:23 | source(...) | main.rs:498:10:498:11 | x6 | $@ | main.rs:497:14:497:23 | source(...) | source(...) | +| main.rs:504:10:504:11 | x8 | main.rs:503:34:503:43 | source(...) | main.rs:504:10:504:11 | x8 | $@ | main.rs:503:34:503:43 | source(...) | source(...) | +| main.rs:504:10:504:11 | x8 | main.rs:503:34:503:43 | source(...) | main.rs:504:10:504:11 | x8 | $@ | main.rs:503:34:503:43 | source(...) | source(...) | | main.rs:507:10:507:11 | x9 | main.rs:506:34:506:43 | source(...) | main.rs:507:10:507:11 | x9 | $@ | main.rs:506:34:506:43 | source(...) | source(...) | | main.rs:507:10:507:11 | x9 | main.rs:506:34:506:43 | source(...) | main.rs:507:10:507:11 | x9 | $@ | main.rs:506:34:506:43 | source(...) | source(...) | | main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | $@ | main.rs:519:10:519:28 | generated_source(...) | generated_source(...) | diff --git a/rust/ql/test/library-tests/dataflow/models/models.ext.yml b/rust/ql/test/library-tests/dataflow/models/models.ext.yml index e4623b191643..1a5e01e8a1c9 100644 --- a/rust/ql/test/library-tests/dataflow/models/models.ext.yml +++ b/rust/ql/test/library-tests/dataflow/models/models.ext.yml @@ -54,7 +54,7 @@ extensions: - ["main::external_file::generated_summary", "Argument[0]", "ReturnValue", "value", "dfc-generated"] - ["main::external_file::neutral_generated_summary", "Argument[0]", "ReturnValue", "value", "dfc-generated"] - ["main::external_file::neutral_manual_summary", "Argument[0]", "ReturnValue", "value", "manual"] - - ["main::external_file::MyTrait2::flow_through2", "Argument[0]", "ReturnValue", "value", "manual"] + - ["::flow_through2", "Argument[0]", "ReturnValue", "value", "manual"] - ["<_ as main::MyTrait3>::flow_through3", "Argument[0]", "ReturnValue", "value", "manual"] - addsTo: pack: codeql/rust-all From a9f60faca2851d82cde17265eb74b53e650125ea Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Mon, 31 Aug 2026 09:47:39 +0200 Subject: [PATCH 0591/2098] CFG: Exclude blocks from post-order in case they're Exprs. --- shared/controlflow/codeql/controlflow/ControlFlowGraph.qll | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll index d230990ce45d..9c0f32fee397 100644 --- a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll +++ b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll @@ -571,7 +571,8 @@ module Make0 Ast> { not n instanceof LogicalNotExpr and not n instanceof ConditionalExpr and not n instanceof Switch and - not n instanceof Case + not n instanceof Case and + not n instanceof BlockStmt } /** From 13ecf2e55c4396ad64c15b62353d9677ae58fda1 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Mon, 31 Aug 2026 10:10:01 +0200 Subject: [PATCH 0592/2098] C++: Improve test stability when models are added Without the additional filtering test results may change when new models are added (whether those are relevant for this test or not). --- .../NonConstantFormat.expected | 44 ++++++++++--------- .../NonConstantFormat/NonConstantFormat.qlref | 4 +- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/cpp/ql/test/query-tests/Likely Bugs/Format/NonConstantFormat/NonConstantFormat.expected b/cpp/ql/test/query-tests/Likely Bugs/Format/NonConstantFormat/NonConstantFormat.expected index a4395489d4ee..d0784987f322 100644 --- a/cpp/ql/test/query-tests/Likely Bugs/Format/NonConstantFormat/NonConstantFormat.expected +++ b/cpp/ql/test/query-tests/Likely Bugs/Format/NonConstantFormat/NonConstantFormat.expected @@ -1,3 +1,23 @@ +#select +| NonConstantFormat.c:30:10:30:16 | *access to array | NonConstantFormat.c:28:27:28:30 | **argv | NonConstantFormat.c:30:10:30:16 | *access to array | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | NonConstantFormat.c:30:3:30:8 | call to printf | printf | +| NonConstantFormat.c:41:9:41:45 | *call to any_random_function | NonConstantFormat.c:41:9:41:45 | *call to any_random_function | NonConstantFormat.c:41:9:41:45 | *call to any_random_function | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | NonConstantFormat.c:41:2:41:7 | call to printf | printf | +| NonConstantFormat.c:45:9:45:48 | *call to gettext | NonConstantFormat.c:45:11:45:47 | *call to any_random_function | NonConstantFormat.c:45:9:45:48 | *call to gettext | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | NonConstantFormat.c:45:2:45:7 | call to printf | printf | +| nested.cpp:21:23:21:26 | *fmt0 | nested.cpp:42:24:42:34 | *call to ext_fmt_str | nested.cpp:21:23:21:26 | *fmt0 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | nested.cpp:21:5:21:12 | call to snprintf | snprintf | +| nested.cpp:79:32:79:38 | *call to get_fmt | nested.cpp:79:32:79:38 | *call to get_fmt | nested.cpp:79:32:79:38 | *call to get_fmt | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | nested.cpp:79:5:79:14 | call to diagnostic | diagnostic | +| nested.cpp:87:18:87:20 | *fmt | nested.cpp:86:19:86:46 | *call to __builtin_alloca | nested.cpp:87:18:87:20 | *fmt | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | nested.cpp:87:7:87:16 | call to diagnostic | diagnostic | +| test.cpp:130:20:130:26 | *access to array | test.cpp:46:27:46:30 | **argv | test.cpp:130:20:130:26 | *access to array | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:130:2:130:10 | call to sprintf | sprintf | +| test.cpp:170:12:170:14 | *res | test.cpp:167:31:167:34 | *data | test.cpp:170:12:170:14 | *res | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:170:5:170:10 | call to printf | printf | +| test.cpp:195:31:195:33 | *str | test.cpp:193:32:193:34 | *str | test.cpp:195:31:195:33 | *str | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:195:3:195:18 | call to StringCchPrintfW | StringCchPrintfW | +| test.cpp:197:11:197:14 | *wstr | test.cpp:193:32:193:34 | *str | test.cpp:197:11:197:14 | *wstr | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:197:3:197:9 | call to wprintf | wprintf | +| test.cpp:205:12:205:20 | *... + ... | test.cpp:204:25:204:36 | *call to get_string | test.cpp:205:12:205:20 | *... + ... | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:205:5:205:10 | call to printf | printf | +| test.cpp:206:12:206:16 | *hello | test.cpp:204:25:204:36 | *call to get_string | test.cpp:206:12:206:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:206:5:206:10 | call to printf | printf | +| test.cpp:211:12:211:16 | *hello | test.cpp:209:25:209:36 | *call to get_string | test.cpp:211:12:211:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:211:5:211:10 | call to printf | printf | +| test.cpp:217:12:217:16 | *hello | test.cpp:215:25:215:36 | *call to get_string | test.cpp:217:12:217:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:217:5:217:10 | call to printf | printf | +| test.cpp:223:12:223:16 | *hello | test.cpp:221:25:221:36 | *call to get_string | test.cpp:223:12:223:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:223:5:223:10 | call to printf | printf | +| test.cpp:228:12:228:18 | *++ ... | test.cpp:227:25:227:36 | *call to get_string | test.cpp:228:12:228:18 | *++ ... | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:228:5:228:10 | call to printf | printf | +| test.cpp:235:12:235:16 | *hello | test.cpp:232:25:232:36 | *call to get_string | test.cpp:235:12:235:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:235:5:235:10 | call to printf | printf | +| test.cpp:242:12:242:16 | *hello | test.cpp:239:25:239:36 | *call to get_string | test.cpp:242:12:242:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:242:5:242:10 | call to printf | printf | +| test.cpp:247:12:247:16 | *hello | test.cpp:245:25:245:36 | *call to get_string | test.cpp:247:12:247:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:247:5:247:10 | call to printf | printf | edges | NonConstantFormat.c:28:27:28:30 | **argv | NonConstantFormat.c:30:10:30:16 | *access to array | provenance | | | NonConstantFormat.c:45:11:45:47 | *call to any_random_function | NonConstantFormat.c:45:9:45:48 | *call to gettext | provenance | DataFlowFunction | @@ -15,7 +35,7 @@ edges | test.cpp:193:32:193:34 | *str | test.cpp:195:31:195:33 | *str | provenance | | | test.cpp:193:32:193:34 | *str | test.cpp:197:11:197:14 | *wstr | provenance | TaintFunction | | test.cpp:195:20:195:23 | StringCchPrintfW output argument | test.cpp:197:11:197:14 | *wstr | provenance | | -| test.cpp:195:31:195:33 | *str | test.cpp:195:20:195:23 | StringCchPrintfW output argument | provenance | MaD:403 | +| test.cpp:195:31:195:33 | *str | test.cpp:195:20:195:23 | StringCchPrintfW output argument | provenance | MaD:1 | | test.cpp:204:25:204:36 | *call to get_string | test.cpp:204:25:204:36 | *call to get_string | provenance | | | test.cpp:204:25:204:36 | *call to get_string | test.cpp:205:12:205:20 | *... + ... | provenance | | | test.cpp:204:25:204:36 | *call to get_string | test.cpp:206:12:206:16 | *hello | provenance | | @@ -37,6 +57,8 @@ edges | test.cpp:239:25:239:36 | *call to get_string | test.cpp:242:12:242:16 | *hello | provenance | | | test.cpp:245:25:245:36 | *call to get_string | test.cpp:245:25:245:36 | *call to get_string | provenance | | | test.cpp:245:25:245:36 | *call to get_string | test.cpp:247:12:247:16 | *hello | provenance | | +models +| 1 | Summary: ; ; false; StringCchPrintfW; ; ; Argument[*2..8]; Argument[*0]; taint; manual | nodes | NonConstantFormat.c:28:27:28:30 | **argv | semmle.label | **argv | | NonConstantFormat.c:30:10:30:16 | *access to array | semmle.label | *access to array | @@ -93,23 +115,3 @@ nodes | test.cpp:245:25:245:36 | *call to get_string | semmle.label | *call to get_string | | test.cpp:247:12:247:16 | *hello | semmle.label | *hello | subpaths -#select -| NonConstantFormat.c:30:10:30:16 | *access to array | NonConstantFormat.c:28:27:28:30 | **argv | NonConstantFormat.c:30:10:30:16 | *access to array | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | NonConstantFormat.c:30:3:30:8 | call to printf | printf | -| NonConstantFormat.c:41:9:41:45 | *call to any_random_function | NonConstantFormat.c:41:9:41:45 | *call to any_random_function | NonConstantFormat.c:41:9:41:45 | *call to any_random_function | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | NonConstantFormat.c:41:2:41:7 | call to printf | printf | -| NonConstantFormat.c:45:9:45:48 | *call to gettext | NonConstantFormat.c:45:11:45:47 | *call to any_random_function | NonConstantFormat.c:45:9:45:48 | *call to gettext | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | NonConstantFormat.c:45:2:45:7 | call to printf | printf | -| nested.cpp:21:23:21:26 | *fmt0 | nested.cpp:42:24:42:34 | *call to ext_fmt_str | nested.cpp:21:23:21:26 | *fmt0 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | nested.cpp:21:5:21:12 | call to snprintf | snprintf | -| nested.cpp:79:32:79:38 | *call to get_fmt | nested.cpp:79:32:79:38 | *call to get_fmt | nested.cpp:79:32:79:38 | *call to get_fmt | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | nested.cpp:79:5:79:14 | call to diagnostic | diagnostic | -| nested.cpp:87:18:87:20 | *fmt | nested.cpp:86:19:86:46 | *call to __builtin_alloca | nested.cpp:87:18:87:20 | *fmt | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | nested.cpp:87:7:87:16 | call to diagnostic | diagnostic | -| test.cpp:130:20:130:26 | *access to array | test.cpp:46:27:46:30 | **argv | test.cpp:130:20:130:26 | *access to array | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:130:2:130:10 | call to sprintf | sprintf | -| test.cpp:170:12:170:14 | *res | test.cpp:167:31:167:34 | *data | test.cpp:170:12:170:14 | *res | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:170:5:170:10 | call to printf | printf | -| test.cpp:195:31:195:33 | *str | test.cpp:193:32:193:34 | *str | test.cpp:195:31:195:33 | *str | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:195:3:195:18 | call to StringCchPrintfW | StringCchPrintfW | -| test.cpp:197:11:197:14 | *wstr | test.cpp:193:32:193:34 | *str | test.cpp:197:11:197:14 | *wstr | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:197:3:197:9 | call to wprintf | wprintf | -| test.cpp:205:12:205:20 | *... + ... | test.cpp:204:25:204:36 | *call to get_string | test.cpp:205:12:205:20 | *... + ... | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:205:5:205:10 | call to printf | printf | -| test.cpp:206:12:206:16 | *hello | test.cpp:204:25:204:36 | *call to get_string | test.cpp:206:12:206:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:206:5:206:10 | call to printf | printf | -| test.cpp:211:12:211:16 | *hello | test.cpp:209:25:209:36 | *call to get_string | test.cpp:211:12:211:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:211:5:211:10 | call to printf | printf | -| test.cpp:217:12:217:16 | *hello | test.cpp:215:25:215:36 | *call to get_string | test.cpp:217:12:217:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:217:5:217:10 | call to printf | printf | -| test.cpp:223:12:223:16 | *hello | test.cpp:221:25:221:36 | *call to get_string | test.cpp:223:12:223:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:223:5:223:10 | call to printf | printf | -| test.cpp:228:12:228:18 | *++ ... | test.cpp:227:25:227:36 | *call to get_string | test.cpp:228:12:228:18 | *++ ... | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:228:5:228:10 | call to printf | printf | -| test.cpp:235:12:235:16 | *hello | test.cpp:232:25:232:36 | *call to get_string | test.cpp:235:12:235:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:235:5:235:10 | call to printf | printf | -| test.cpp:242:12:242:16 | *hello | test.cpp:239:25:239:36 | *call to get_string | test.cpp:242:12:242:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:242:5:242:10 | call to printf | printf | -| test.cpp:247:12:247:16 | *hello | test.cpp:245:25:245:36 | *call to get_string | test.cpp:247:12:247:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:247:5:247:10 | call to printf | printf | diff --git a/cpp/ql/test/query-tests/Likely Bugs/Format/NonConstantFormat/NonConstantFormat.qlref b/cpp/ql/test/query-tests/Likely Bugs/Format/NonConstantFormat/NonConstantFormat.qlref index cb71273232ca..e33cbe4e51e1 100644 --- a/cpp/ql/test/query-tests/Likely Bugs/Format/NonConstantFormat/NonConstantFormat.qlref +++ b/cpp/ql/test/query-tests/Likely Bugs/Format/NonConstantFormat/NonConstantFormat.qlref @@ -1,2 +1,4 @@ query: Likely Bugs/Format/NonConstantFormat.ql -postprocess: utils/test/InlineExpectationsTestQuery.ql +postprocess: + - utils/test/PrettyPrintModels.ql + - utils/test/InlineExpectationsTestQuery.ql From 546e64d51e3bc279b7d8fc5edd81245ba7ea3af0 Mon Sep 17 00:00:00 2001 From: "Piotr P. Karwasz" Date: Mon, 31 Aug 2026 10:39:49 +0200 Subject: [PATCH 0593/2098] Java: update the Commons XML model to the commons-secure-xml 1.0.0 API The library was renamed from commons-xml to commons-secure-xml: the org.apache.commons.xml.XmlFactories entry point is replaced by six per-factory classes in org.apache.commons.xml.secure, whose static new* methods mirror the JAXP factory entry points and all return hardened factories. Assisted-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01BiNxFje3KZrioKjQTcBCyk --- .../2026-08-02-apache-commons-secure-xml.md | 5 +++ ...2026-08-02-apache-commons-xml-factories.md | 5 --- .../java/frameworks/apache/CommonsXml.qll | 28 ++++++++----- ...ests.java => SecureXmlFactoriesTests.java} | 36 +++++++++++------ .../test/query-tests/security/CWE-611/options | 2 +- .../secure/SecureDocumentBuilderFactory.java | 34 ++++++++++++++++ .../xml/secure/SecureSAXParserFactory.java | 34 ++++++++++++++++ .../xml/secure/SecureSchemaFactory.java | 23 +++++++++++ .../xml/secure/SecureTransformerFactory.java | 22 +++++++++++ .../xml/secure/SecureXMLInputFactory.java | 26 +++++++++++++ .../xml/secure/SecureXPathFactory.java | 28 +++++++++++++ .../org/apache/commons/xml/XmlFactories.java | 39 ------------------- 12 files changed, 216 insertions(+), 66 deletions(-) create mode 100644 java/ql/lib/change-notes/2026-08-02-apache-commons-secure-xml.md delete mode 100644 java/ql/lib/change-notes/2026-08-02-apache-commons-xml-factories.md rename java/ql/test/query-tests/security/CWE-611/{XmlFactoriesTests.java => SecureXmlFactoriesTests.java} (54%) create mode 100644 java/ql/test/stubs/apache-commons-secure-xml-1.0.0/org/apache/commons/xml/secure/SecureDocumentBuilderFactory.java create mode 100644 java/ql/test/stubs/apache-commons-secure-xml-1.0.0/org/apache/commons/xml/secure/SecureSAXParserFactory.java create mode 100644 java/ql/test/stubs/apache-commons-secure-xml-1.0.0/org/apache/commons/xml/secure/SecureSchemaFactory.java create mode 100644 java/ql/test/stubs/apache-commons-secure-xml-1.0.0/org/apache/commons/xml/secure/SecureTransformerFactory.java create mode 100644 java/ql/test/stubs/apache-commons-secure-xml-1.0.0/org/apache/commons/xml/secure/SecureXMLInputFactory.java create mode 100644 java/ql/test/stubs/apache-commons-secure-xml-1.0.0/org/apache/commons/xml/secure/SecureXPathFactory.java delete mode 100644 java/ql/test/stubs/apache-commons-xml-0.1.0/org/apache/commons/xml/XmlFactories.java diff --git a/java/ql/lib/change-notes/2026-08-02-apache-commons-secure-xml.md b/java/ql/lib/change-notes/2026-08-02-apache-commons-secure-xml.md new file mode 100644 index 000000000000..898255b12458 --- /dev/null +++ b/java/ql/lib/change-notes/2026-08-02-apache-commons-secure-xml.md @@ -0,0 +1,5 @@ +--- +category: feature +--- +* Factories returned by the Apache Commons Secure XML (`org.apache.commons.xml.secure`) hardening library's `SecureDocumentBuilderFactory`, `SecureSAXParserFactory`, `SecureXMLInputFactory`, `SecureTransformerFactory` and `SecureSchemaFactory` classes are now recognized as safely configured by the XXE query. +* A new extensible class `SafeXmlFactorySource` was added to `semmle.code.java.security.XmlParsers` for modeling sources of pre-hardened JAXP factories. diff --git a/java/ql/lib/change-notes/2026-08-02-apache-commons-xml-factories.md b/java/ql/lib/change-notes/2026-08-02-apache-commons-xml-factories.md deleted file mode 100644 index 6ec4686065be..000000000000 --- a/java/ql/lib/change-notes/2026-08-02-apache-commons-xml-factories.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: feature ---- -* Factories returned by the Apache Commons XML (`org.apache.commons.xml.XmlFactories`) hardening library are now recognized as safely configured by the XXE query. -* A new extensible class `SafeXmlFactorySource` was added to `semmle.code.java.security.XmlParsers` for modeling sources of pre-hardened JAXP factories. diff --git a/java/ql/lib/semmle/code/java/frameworks/apache/CommonsXml.qll b/java/ql/lib/semmle/code/java/frameworks/apache/CommonsXml.qll index aa6d840a0782..fa570b0b61ae 100644 --- a/java/ql/lib/semmle/code/java/frameworks/apache/CommonsXml.qll +++ b/java/ql/lib/semmle/code/java/frameworks/apache/CommonsXml.qll @@ -92,23 +92,31 @@ private module SafeDigesterFlowConfig implements DataFlow::ConfigSig { private module SafeDigesterFlow = DataFlow::Global; /** - * A call to one of the `org.apache.commons.xml.XmlFactories.newXxxFactory()` methods - * of the Apache Commons XML library. + * A call to one of the static factory methods of the `org.apache.commons.xml.secure` + * `SecureXxxFactory` classes of the Apache Commons Secure XML library. * - * Every such method returns a fresh JAXP factory that has already been hardened against - * XML external entity (XXE) attacks, so any parser created from it is treated as safe. + * These methods mirror the JAXP factory entry points (`newInstance`, `newDefaultInstance`, + * `newNSInstance`, `newFactory`, ...) and every one of them returns a fresh JAXP factory + * that has already been hardened against XML external entity (XXE) attacks, so any parser + * created from it is treated as safe. * - * `newXPathFactory` is matched for completeness, but the XXE model has no `XPathFactory` + * `SecureXPathFactory` is matched for completeness, but the XXE model has no `XPathFactory` * safety chain (the XXE sink for XPath is the document being evaluated, not the factory), * so it currently has no effect on XXE results. */ -private class CommonsXmlSafeXmlFactory extends SafeXmlFactorySource, MethodCall { - CommonsXmlSafeXmlFactory() { - this.getMethod().getDeclaringType().hasQualifiedName("org.apache.commons.xml", "XmlFactories") and +private class CommonsSecureXmlFactory extends SafeXmlFactorySource, MethodCall { + CommonsSecureXmlFactory() { + this.getMethod() + .getDeclaringType() + .hasQualifiedName("org.apache.commons.xml.secure", + [ + "SecureDocumentBuilderFactory", "SecureSAXParserFactory", "SecureXMLInputFactory", + "SecureTransformerFactory", "SecureSchemaFactory", "SecureXPathFactory" + ]) and this.getMethod() .hasName([ - "newDocumentBuilderFactory", "newSAXParserFactory", "newXMLInputFactory", - "newTransformerFactory", "newSchemaFactory", "newXPathFactory" + "newDefaultInstance", "newDefaultNSInstance", "newInstance", "newNSInstance", + "newDefaultFactory", "newFactory" ]) } } diff --git a/java/ql/test/query-tests/security/CWE-611/XmlFactoriesTests.java b/java/ql/test/query-tests/security/CWE-611/SecureXmlFactoriesTests.java similarity index 54% rename from java/ql/test/query-tests/security/CWE-611/XmlFactoriesTests.java rename to java/ql/test/query-tests/security/CWE-611/SecureXmlFactoriesTests.java index c5fcc18a3daa..77c6dccfed73 100644 --- a/java/ql/test/query-tests/security/CWE-611/XmlFactoriesTests.java +++ b/java/ql/test/query-tests/security/CWE-611/SecureXmlFactoriesTests.java @@ -15,49 +15,63 @@ import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; -import org.apache.commons.xml.XmlFactories; +import org.apache.commons.xml.secure.SecureDocumentBuilderFactory; +import org.apache.commons.xml.secure.SecureSAXParserFactory; +import org.apache.commons.xml.secure.SecureSchemaFactory; +import org.apache.commons.xml.secure.SecureTransformerFactory; +import org.apache.commons.xml.secure.SecureXMLInputFactory; -// Every factory returned by `org.apache.commons.xml.XmlFactories` is already hardened against -// XXE, so the parsers created from them must not be reported. -public class XmlFactoriesTests { +// Every factory returned by the `org.apache.commons.xml.secure.SecureXxxFactory` classes is +// already hardened against XXE, so the parsers created from them must not be reported. +public class SecureXmlFactoriesTests { public void hardenedDocumentBuilder(Socket sock) throws Exception { - DocumentBuilderFactory factory = XmlFactories.newDocumentBuilderFactory(); + DocumentBuilderFactory factory = SecureDocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); builder.parse(sock.getInputStream()); // safe } public void hardenedDocumentBuilderChained(Socket sock) throws Exception { - XmlFactories.newDocumentBuilderFactory().newDocumentBuilder().parse(sock.getInputStream()); // safe + SecureDocumentBuilderFactory.newDefaultNSInstance().newDocumentBuilder().parse(sock.getInputStream()); // safe } public void hardenedSaxParser(Socket sock) throws Exception { - SAXParserFactory factory = XmlFactories.newSAXParserFactory(); + SAXParserFactory factory = SecureSAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); parser.parse(sock.getInputStream(), new DefaultHandler()); // safe } public void hardenedSaxParserXmlReader(Socket sock) throws Exception { - SAXParser parser = XmlFactories.newSAXParserFactory().newSAXParser(); + SAXParser parser = SecureSAXParserFactory.newNSInstance().newSAXParser(); XMLReader reader = parser.getXMLReader(); reader.parse(new org.xml.sax.InputSource(sock.getInputStream())); // safe } public void hardenedXmlInputFactory(Socket sock) throws Exception { - XMLInputFactory factory = XmlFactories.newXMLInputFactory(); + XMLInputFactory factory = SecureXMLInputFactory.newFactory(); factory.createXMLStreamReader(sock.getInputStream()); // safe factory.createXMLEventReader(sock.getInputStream()); // safe } + public void hardenedXmlInputFactoryDefault(Socket sock) throws Exception { + XMLInputFactory factory = SecureXMLInputFactory.newDefaultFactory(); + factory.createXMLStreamReader(sock.getInputStream()); // safe + } + public void hardenedTransformer(Socket sock) throws Exception { - TransformerFactory tf = XmlFactories.newTransformerFactory(); + TransformerFactory tf = SecureTransformerFactory.newInstance(); Transformer transformer = tf.newTransformer(); transformer.transform(new StreamSource(sock.getInputStream()), null); // safe tf.newTransformer(new StreamSource(sock.getInputStream())); // safe } + public void hardenedTransformerDefault(Socket sock) throws Exception { + TransformerFactory tf = SecureTransformerFactory.newDefaultInstance(); + tf.newTransformer(new StreamSource(sock.getInputStream())); // safe + } + public void hardenedSchema(Socket sock) throws Exception { - SchemaFactory factory = XmlFactories.newSchemaFactory(XMLConstants.W3C_XML_SCHEMA_NS_URI); + SchemaFactory factory = SecureSchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); Schema schema = factory.newSchema(new StreamSource(sock.getInputStream())); // safe } } diff --git a/java/ql/test/query-tests/security/CWE-611/options b/java/ql/test/query-tests/security/CWE-611/options index 1d6e3c40b307..c7186f87c849 100644 --- a/java/ql/test/query-tests/security/CWE-611/options +++ b/java/ql/test/query-tests/security/CWE-611/options @@ -1 +1 @@ -//semmle-extractor-options: --javac-args -cp ${testdir}/../../../stubs/jdom-1.1.3:${testdir}/../../../stubs/dom4j-2.1.1:${testdir}/../../../stubs/simple-xml-2.7.1:${testdir}/../../../stubs/jaxb-api-2.3.1:${testdir}/../../../stubs/jaxen-1.2.0:${testdir}/../../../stubs/apache-commons-digester3-3.2:${testdir}/../../../stubs/servlet-api-2.4/:${testdir}/../../../stubs/rundeck-api-java-client-13.2:${testdir}/../../../stubs/springframework-5.8.x/:${testdir}/../../../stubs/mdht-1.2.0/:${testdir}/../../../stubs/woodstox-core-6.4.0:${testdir}/../../../stubs/apache-commons-xml-0.1.0 +//semmle-extractor-options: --javac-args -cp ${testdir}/../../../stubs/jdom-1.1.3:${testdir}/../../../stubs/dom4j-2.1.1:${testdir}/../../../stubs/simple-xml-2.7.1:${testdir}/../../../stubs/jaxb-api-2.3.1:${testdir}/../../../stubs/jaxen-1.2.0:${testdir}/../../../stubs/apache-commons-digester3-3.2:${testdir}/../../../stubs/servlet-api-2.4/:${testdir}/../../../stubs/rundeck-api-java-client-13.2:${testdir}/../../../stubs/springframework-5.8.x/:${testdir}/../../../stubs/mdht-1.2.0/:${testdir}/../../../stubs/woodstox-core-6.4.0:${testdir}/../../../stubs/apache-commons-secure-xml-1.0.0 diff --git a/java/ql/test/stubs/apache-commons-secure-xml-1.0.0/org/apache/commons/xml/secure/SecureDocumentBuilderFactory.java b/java/ql/test/stubs/apache-commons-secure-xml-1.0.0/org/apache/commons/xml/secure/SecureDocumentBuilderFactory.java new file mode 100644 index 000000000000..22011e425aa2 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-secure-xml-1.0.0/org/apache/commons/xml/secure/SecureDocumentBuilderFactory.java @@ -0,0 +1,34 @@ +// Minimal stub of org.apache.commons.xml.secure.SecureDocumentBuilderFactory for testing purposes + +package org.apache.commons.xml.secure; + +import javax.xml.parsers.DocumentBuilderFactory; + +public final class SecureDocumentBuilderFactory { + + public static DocumentBuilderFactory newDefaultInstance() { + return null; + } + + public static DocumentBuilderFactory newDefaultNSInstance() { + return null; + } + + public static DocumentBuilderFactory newInstance() { + return null; + } + + public static DocumentBuilderFactory newInstance(final String factoryClassName, final ClassLoader classLoader) { + return null; + } + + public static DocumentBuilderFactory newNSInstance() { + return null; + } + + public static DocumentBuilderFactory newNSInstance(final String factoryClassName, final ClassLoader classLoader) { + return null; + } + + private SecureDocumentBuilderFactory() {} +} diff --git a/java/ql/test/stubs/apache-commons-secure-xml-1.0.0/org/apache/commons/xml/secure/SecureSAXParserFactory.java b/java/ql/test/stubs/apache-commons-secure-xml-1.0.0/org/apache/commons/xml/secure/SecureSAXParserFactory.java new file mode 100644 index 000000000000..4a0adcb44617 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-secure-xml-1.0.0/org/apache/commons/xml/secure/SecureSAXParserFactory.java @@ -0,0 +1,34 @@ +// Minimal stub of org.apache.commons.xml.secure.SecureSAXParserFactory for testing purposes + +package org.apache.commons.xml.secure; + +import javax.xml.parsers.SAXParserFactory; + +public final class SecureSAXParserFactory { + + public static SAXParserFactory newDefaultInstance() { + return null; + } + + public static SAXParserFactory newDefaultNSInstance() { + return null; + } + + public static SAXParserFactory newInstance() { + return null; + } + + public static SAXParserFactory newInstance(final String factoryClassName, final ClassLoader classLoader) { + return null; + } + + public static SAXParserFactory newNSInstance() { + return null; + } + + public static SAXParserFactory newNSInstance(final String factoryClassName, final ClassLoader classLoader) { + return null; + } + + private SecureSAXParserFactory() {} +} diff --git a/java/ql/test/stubs/apache-commons-secure-xml-1.0.0/org/apache/commons/xml/secure/SecureSchemaFactory.java b/java/ql/test/stubs/apache-commons-secure-xml-1.0.0/org/apache/commons/xml/secure/SecureSchemaFactory.java new file mode 100644 index 000000000000..5c0d5ac258de --- /dev/null +++ b/java/ql/test/stubs/apache-commons-secure-xml-1.0.0/org/apache/commons/xml/secure/SecureSchemaFactory.java @@ -0,0 +1,23 @@ +// Minimal stub of org.apache.commons.xml.secure.SecureSchemaFactory for testing purposes + +package org.apache.commons.xml.secure; + +import javax.xml.validation.SchemaFactory; + +public final class SecureSchemaFactory { + + public static SchemaFactory newDefaultInstance() { + return null; + } + + public static SchemaFactory newInstance(final String schemaLanguage) { + return null; + } + + public static SchemaFactory newInstance(final String schemaLanguage, final String factoryClassName, + final ClassLoader classLoader) { + return null; + } + + private SecureSchemaFactory() {} +} diff --git a/java/ql/test/stubs/apache-commons-secure-xml-1.0.0/org/apache/commons/xml/secure/SecureTransformerFactory.java b/java/ql/test/stubs/apache-commons-secure-xml-1.0.0/org/apache/commons/xml/secure/SecureTransformerFactory.java new file mode 100644 index 000000000000..c51bb648ca10 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-secure-xml-1.0.0/org/apache/commons/xml/secure/SecureTransformerFactory.java @@ -0,0 +1,22 @@ +// Minimal stub of org.apache.commons.xml.secure.SecureTransformerFactory for testing purposes + +package org.apache.commons.xml.secure; + +import javax.xml.transform.TransformerFactory; + +public final class SecureTransformerFactory { + + public static TransformerFactory newDefaultInstance() { + return null; + } + + public static TransformerFactory newInstance() { + return null; + } + + public static TransformerFactory newInstance(final String factoryClassName, final ClassLoader classLoader) { + return null; + } + + private SecureTransformerFactory() {} +} diff --git a/java/ql/test/stubs/apache-commons-secure-xml-1.0.0/org/apache/commons/xml/secure/SecureXMLInputFactory.java b/java/ql/test/stubs/apache-commons-secure-xml-1.0.0/org/apache/commons/xml/secure/SecureXMLInputFactory.java new file mode 100644 index 000000000000..7116d3c14ae4 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-secure-xml-1.0.0/org/apache/commons/xml/secure/SecureXMLInputFactory.java @@ -0,0 +1,26 @@ +// Minimal stub of org.apache.commons.xml.secure.SecureXMLInputFactory for testing purposes + +package org.apache.commons.xml.secure; + +import javax.xml.stream.XMLInputFactory; + +public final class SecureXMLInputFactory { + + public static XMLInputFactory newDefaultFactory() { + return null; + } + + public static XMLInputFactory newFactory() { + return null; + } + + public static XMLInputFactory newFactory(final String factoryId, final ClassLoader classLoader) { + return null; + } + + public static XMLInputFactory newInstance() { + return null; + } + + private SecureXMLInputFactory() {} +} diff --git a/java/ql/test/stubs/apache-commons-secure-xml-1.0.0/org/apache/commons/xml/secure/SecureXPathFactory.java b/java/ql/test/stubs/apache-commons-secure-xml-1.0.0/org/apache/commons/xml/secure/SecureXPathFactory.java new file mode 100644 index 000000000000..b7bc969bf7f7 --- /dev/null +++ b/java/ql/test/stubs/apache-commons-secure-xml-1.0.0/org/apache/commons/xml/secure/SecureXPathFactory.java @@ -0,0 +1,28 @@ +// Minimal stub of org.apache.commons.xml.secure.SecureXPathFactory for testing purposes + +package org.apache.commons.xml.secure; + +import javax.xml.xpath.XPathFactory; +import javax.xml.xpath.XPathFactoryConfigurationException; + +public final class SecureXPathFactory { + + public static XPathFactory newDefaultInstance() { + return null; + } + + public static XPathFactory newInstance() { + return null; + } + + public static XPathFactory newInstance(final String uri) throws XPathFactoryConfigurationException { + return null; + } + + public static XPathFactory newInstance(final String uri, final String factoryClassName, final ClassLoader classLoader) + throws XPathFactoryConfigurationException { + return null; + } + + private SecureXPathFactory() {} +} diff --git a/java/ql/test/stubs/apache-commons-xml-0.1.0/org/apache/commons/xml/XmlFactories.java b/java/ql/test/stubs/apache-commons-xml-0.1.0/org/apache/commons/xml/XmlFactories.java deleted file mode 100644 index 0b820c958214..000000000000 --- a/java/ql/test/stubs/apache-commons-xml-0.1.0/org/apache/commons/xml/XmlFactories.java +++ /dev/null @@ -1,39 +0,0 @@ -// Minimal stub of org.apache.commons.xml.XmlFactories for testing purposes - -package org.apache.commons.xml; - -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.SAXParserFactory; -import javax.xml.stream.XMLInputFactory; -import javax.xml.transform.TransformerFactory; -import javax.xml.validation.SchemaFactory; -import javax.xml.xpath.XPathFactory; - -public final class XmlFactories { - - public static DocumentBuilderFactory newDocumentBuilderFactory() { - return null; - } - - public static SAXParserFactory newSAXParserFactory() { - return null; - } - - public static SchemaFactory newSchemaFactory(final String schemaLanguage) { - return null; - } - - public static TransformerFactory newTransformerFactory() { - return null; - } - - public static XMLInputFactory newXMLInputFactory() { - return null; - } - - public static XPathFactory newXPathFactory() { - return null; - } - - private XmlFactories() {} -} From 209cd4c7aa0d07f3665800b9a477f41748c33567 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 31 Aug 2026 11:18:45 +0200 Subject: [PATCH 0594/2098] C#: Add NuGet feed list to the unit tests. --- csharp/extractor/Semmle.Extraction.Tests/DotNet.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs b/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs index 260eae10bd1b..77913053eb53 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs @@ -148,11 +148,11 @@ public void TestDotnetRestoreProjectToDirectory3() var dotnet = MakeDotnet(dotnetCliInvoker); // Execute - var res = dotnet.Restore(new("myproject.csproj", "mypackages", false, [], true)); + var res = dotnet.Restore(new("myproject.csproj", "mypackages", false, ["-s", "https://my.nuget.source1"], true)); // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); - Assert.Equal(["restore", "--no-dependencies", "myproject.csproj", "--packages", "mypackages", "/p:DisableImplicitNuGetFallbackFolder=true", "--verbosity", "normal", "--force"], lastArgs); + Assert.Equal(["restore", "--no-dependencies", "myproject.csproj", "--packages", "mypackages", "/p:DisableImplicitNuGetFallbackFolder=true", "--verbosity", "normal", "--force", "-s", "https://my.nuget.source1"], lastArgs); Assert.Equal(2, res.AssetsFilePaths.Count()); Assert.Contains("/path/to/project.assets.json", res.AssetsFilePaths); Assert.Contains("/path/to/project2.assets.json", res.AssetsFilePaths); @@ -166,11 +166,11 @@ public void TestDotnetRestoreSolutionToDirectory1() var dotnet = MakeDotnet(dotnetCliInvoker); // Execute - var res = dotnet.Restore(new("mysolution.sln", "mypackages", false, [])); + var res = dotnet.Restore(new("mysolution.sln", "mypackages", false, ["-s", "https://my.nuget.source1", "-s", "https://my.nuget.source2"])); // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); - Assert.Equal(["restore", "--no-dependencies", "mysolution.sln", "--packages", "mypackages", "/p:DisableImplicitNuGetFallbackFolder=true", "--verbosity", "normal"], lastArgs); + Assert.Equal(["restore", "--no-dependencies", "mysolution.sln", "--packages", "mypackages", "/p:DisableImplicitNuGetFallbackFolder=true", "--verbosity", "normal", "-s", "https://my.nuget.source1", "-s", "https://my.nuget.source2"], lastArgs); Assert.Equal(2, res.RestoredProjects.Count()); Assert.Contains("/path/to/project.csproj", res.RestoredProjects); Assert.Contains("/path/to/project2.csproj", res.RestoredProjects); From a14379ed07cca3b5069d86e609d88bf6bda24d38 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 31 Aug 2026 11:34:52 +0200 Subject: [PATCH 0595/2098] C#: Move feed prefix logic out of the feed manager. --- .../DotNet.cs | 3 ++- .../FeedManager.cs | 23 ++++--------------- .../NugetPackageRestorer.cs | 8 +++---- .../PackagesConfigRestorer.cs | 4 ++-- 4 files changed, 13 insertions(+), 25 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs index 9fd3749ae340..9cf13c7af96d 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs @@ -90,7 +90,8 @@ private List GetRestoreArgs(RestoreSettings restoreSettings) args.Add("/p:EnableWindowsTargeting=true"); } - args.AddRange(restoreSettings.NugetSources); + var nugetSources = restoreSettings.NugetSources.SelectMany(source => ["-s", source]).ToList(); + args.AddRange(nugetSources); return args; } diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs index 581d4c15e9dd..542254425045 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs @@ -157,19 +157,16 @@ private IEnumerable GetFeedsFromNugetConfig(string nugetConfigPath) => /// If there are no feeds, a dummy source argument is added to override any default feeds that `restore` would use. /// /// The list of feeds to use for the restore command. - /// The prefix to use for each source argument (e.g., "-s"). /// The list of NuGet sources arguments for the restore command. - public List FeedsToRestoreArgument(IEnumerable feeds, string sourceArgumentPrefix) + public List RestoreFeeds(IEnumerable feeds) { // If there are no feeds, we want to override any default feeds that `restore` would use by passing a dummy source argument. if (!feeds.Any()) { - return [sourceArgumentPrefix, emptyPackageDirectory.DirInfo.FullName]; + return [emptyPackageDirectory.DirInfo.FullName]; } - // Add package sources. If any are present, they override all sources specified in - // the configuration file(s). - return feeds.SelectMany(feed => [sourceArgumentPrefix, feed]).ToList(); + return feeds.ToList(); } private IEnumerable FeedsToUseAux(HashSet feedsToConsider) @@ -202,16 +199,6 @@ public IEnumerable FeedsToUse(string path) return FeedsToUseAux(feedsToConsider); } - /// - /// Constructs the NuGet sources argument for the `dotnet restore` command based on the given feeds. - /// - /// The list of NuGet feeds to use for the restore command. - /// A list representing the NuGet sources arguments for the `dotnet restore` command. - public List FeedsToDotnetRestoreArgument(IEnumerable feeds) - { - return FeedsToRestoreArgument(feeds, "-s"); - } - /// /// Constructs the list of NuGet sources to use for dotnet restore. /// (1) Use the feeds we get from `dotnet nuget list source` @@ -219,7 +206,7 @@ public List FeedsToDotnetRestoreArgument(IEnumerable feeds) /// /// Path to project/solution /// A list representing the NuGet sources arguments for the `dotnet restore` command. - public List MakeDotnetRestoreSourcesArguments(string path) + public List MakeRestoreFeeds(string path) { // Do not construct a set of explicit NuGet sources to use for restore. if (!CheckNugetFeedResponsiveness && !HasPrivateRegistryFeeds) @@ -229,7 +216,7 @@ public List MakeDotnetRestoreSourcesArguments(string path) var feedsToUse = FeedsToUse(path); - return FeedsToDotnetRestoreArgument(feedsToUse); + return RestoreFeeds(feedsToUse); } private (int initialTimeout, int tryCount) GetFeedRequestSettings(bool isFallback) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs index 2867a7cc6327..2003941bd358 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs @@ -53,7 +53,7 @@ public NugetPackageRestorer( public string? TryRestore(string package) { var feeds = feedManager.CheckNugetFeedResponsiveness ? feedManager.ReachableFeeds : feedManager.AllFeeds; - var nugetSources = feedManager.FeedsToDotnetRestoreArgument(feeds); + var nugetSources = feedManager.RestoreFeeds(feeds); if (TryRestorePackageManually(package, nugetSources)) { var packageDir = DependencyManager.GetPackageDirectory(package, missingPackageDirectory.DirInfo); @@ -216,7 +216,7 @@ private IEnumerable RestoreSolutions(out DependencyContainer dependencie var projects = fileProvider.Solutions.SelectMany(solution => { logger.LogInfo($"Restoring solution {solution}..."); - var nugetSources = feedManager.MakeDotnetRestoreSourcesArguments(solution); + var nugetSources = feedManager.MakeRestoreFeeds(solution); var res = dotnet.Restore(new(solution, PackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: true, NugetSources: nugetSources, TargetWindows: isWindows)); if (res.Success) { @@ -264,7 +264,7 @@ private void RestoreProjects(IEnumerable projects, out ConcurrentBag projects, out ConcurrentBag p.ToLowerInvariant()); var alreadyDownloadedLegacyPackages = GetRestoredLegacyPackageNames(); diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/PackagesConfigRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/PackagesConfigRestorer.cs index e5a9365a08e3..a09bcca9fd00 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/PackagesConfigRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/PackagesConfigRestorer.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Collections.Immutable; using System.Diagnostics; using System.IO; using System.Linq; @@ -180,7 +179,8 @@ private bool TryRestoreNugetPackage(string packagesConfig) { feedsToUse.Add(FeedManager.PublicNugetOrgFeed); } - sourcesArgument = feedManager.FeedsToRestoreArgument(feedsToUse, "-Source"); + var restoreFeeds = feedManager.RestoreFeeds(feedsToUse); + sourcesArgument = restoreFeeds.SelectMany(feed => ["-Source", feed]).ToList(); } /* Use nuget.exe to install a package. From 829f880ba06e7181b4b21db143ca5cd6d9cae303 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 31 Aug 2026 11:36:26 +0200 Subject: [PATCH 0596/2098] C#: Update unit tests to reflect the new logic. --- csharp/extractor/Semmle.Extraction.Tests/DotNet.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs b/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs index 77913053eb53..77e88a58443a 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs @@ -148,7 +148,7 @@ public void TestDotnetRestoreProjectToDirectory3() var dotnet = MakeDotnet(dotnetCliInvoker); // Execute - var res = dotnet.Restore(new("myproject.csproj", "mypackages", false, ["-s", "https://my.nuget.source1"], true)); + var res = dotnet.Restore(new("myproject.csproj", "mypackages", false, ["https://my.nuget.source1"], true)); // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); @@ -166,7 +166,7 @@ public void TestDotnetRestoreSolutionToDirectory1() var dotnet = MakeDotnet(dotnetCliInvoker); // Execute - var res = dotnet.Restore(new("mysolution.sln", "mypackages", false, ["-s", "https://my.nuget.source1", "-s", "https://my.nuget.source2"])); + var res = dotnet.Restore(new("mysolution.sln", "mypackages", false, ["https://my.nuget.source1", "https://my.nuget.source2"])); // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); From 66faa153649b9d971efe7192c36f60fba2e22e2b Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Mon, 31 Aug 2026 12:48:42 +0200 Subject: [PATCH 0597/2098] Unified: Add Callable type --- unified/extractor/ast_types.yml | 8 +++++++ .../ql/lib/codeql/unified/internal/Ast.qll | 22 +++++++++++++------ unified/ql/lib/unified.dbscheme | 2 ++ 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/unified/extractor/ast_types.yml b/unified/extractor/ast_types.yml index 854829a17cb4..1c98bdeefe61 100644 --- a/unified/extractor/ast_types.yml +++ b/unified/extractor/ast_types.yml @@ -73,6 +73,14 @@ supertypes: - while_stmt - do_while_stmt - labeled_stmt + callable: + - top_level + - function_expr + - function_declaration + - constructor_declaration + - destructor_declaration + - accessor_declaration + - initializer_declaration # A member is anything that can appear in the body of a class-like declaration member: - constructor_declaration diff --git a/unified/ql/lib/codeql/unified/internal/Ast.qll b/unified/ql/lib/codeql/unified/internal/Ast.qll index d5ffa0218523..eb02d0434837 100644 --- a/unified/ql/lib/codeql/unified/internal/Ast.qll +++ b/unified/ql/lib/codeql/unified/internal/Ast.qll @@ -96,7 +96,7 @@ module Unified { } /** A class representing `accessor_declaration` nodes. */ - class AccessorDeclaration extends @unified_accessor_declaration, F::Member, F::Stmt { + class AccessorDeclaration extends @unified_accessor_declaration, F::Callable, F::Member, F::Stmt { /** Gets the name of the primary QL class for this element. */ final override string getAPrimaryQlClass() { result = "AccessorDeclaration" } @@ -373,6 +373,8 @@ module Unified { } } + class Callable extends @unified_callable, F::AstNode { } + /** A class representing `catch_clause` nodes. */ class CatchClause extends @unified_catch_clause, F::AstNode { /** Gets the name of the primary QL class for this element. */ @@ -503,7 +505,9 @@ module Unified { } /** A class representing `constructor_declaration` nodes. */ - class ConstructorDeclaration extends @unified_constructor_declaration, F::Member, F::Stmt { + class ConstructorDeclaration extends @unified_constructor_declaration, F::Callable, F::Member, + F::Stmt + { /** Gets the name of the primary QL class for this element. */ final override string getAPrimaryQlClass() { result = "ConstructorDeclaration" } @@ -581,7 +585,9 @@ module Unified { } /** A class representing `destructor_declaration` nodes. */ - class DestructorDeclaration extends @unified_destructor_declaration, F::Member, F::Stmt { + class DestructorDeclaration extends @unified_destructor_declaration, F::Callable, F::Member, + F::Stmt + { /** Gets the name of the primary QL class for this element. */ final override string getAPrimaryQlClass() { result = "DestructorDeclaration" } @@ -718,7 +724,7 @@ module Unified { } /** A class representing `function_declaration` nodes. */ - class FunctionDeclaration extends @unified_function_declaration, F::Member, F::Stmt { + class FunctionDeclaration extends @unified_function_declaration, F::Callable, F::Member, F::Stmt { /** Gets the name of the primary QL class for this element. */ final override string getAPrimaryQlClass() { result = "FunctionDeclaration" } @@ -774,7 +780,7 @@ module Unified { } /** A class representing `function_expr` nodes. */ - class FunctionExpr extends @unified_function_expr, F::Expr { + class FunctionExpr extends @unified_function_expr, F::Callable, F::Expr { /** Gets the name of the primary QL class for this element. */ final override string getAPrimaryQlClass() { result = "FunctionExpr" } @@ -949,7 +955,7 @@ module Unified { } /** A class representing `initializer_declaration` nodes. */ - class InitializerDeclaration extends @unified_initializer_declaration, F::Member { + class InitializerDeclaration extends @unified_initializer_declaration, F::Callable, F::Member { /** Gets the name of the primary QL class for this element. */ final override string getAPrimaryQlClass() { result = "InitializerDeclaration" } @@ -1350,7 +1356,7 @@ module Unified { } /** A class representing `top_level` nodes. */ - class TopLevel extends @unified_top_level, F::AstNode { + class TopLevel extends @unified_top_level, F::Callable { /** Gets the name of the primary QL class for this element. */ final override string getAPrimaryQlClass() { result = "TopLevel" } @@ -2071,6 +2077,8 @@ module UnifiedFinal { final class CallExpr = F::CallExpr; + final class Callable = F::Callable; + final class CatchClause = F::CatchClause; final class ClassLikeDeclaration = F::ClassLikeDeclaration; diff --git a/unified/ql/lib/unified.dbscheme b/unified/ql/lib/unified.dbscheme index c36721515d5c..825d9fd0ff61 100644 --- a/unified/ql/lib/unified.dbscheme +++ b/unified/ql/lib/unified.dbscheme @@ -292,6 +292,8 @@ unified_call_expr_def( int callee: @unified_expr_or_type ref ); +@unified_callable = @unified_accessor_declaration | @unified_constructor_declaration | @unified_destructor_declaration | @unified_function_declaration | @unified_function_expr | @unified_initializer_declaration | @unified_top_level + #keyset[unified_catch_clause, index] unified_catch_clause_modifier( int unified_catch_clause: @unified_catch_clause ref, From 5e9dade29749c5d1ebff51b1658176aefbd7338e Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 31 Aug 2026 13:41:00 +0200 Subject: [PATCH 0598/2098] Rust: Start canonical path part indices at zero Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 4e7f3f7f-82b3-403c-93fa-984f56c89a70 --- .../ql/lib/codeql/rust/internal/PathResolution.qll | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index 707aad9cddd2..42f3f1d5ba3e 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -1104,32 +1104,32 @@ final class TraitItemNode extends ImplOrTraitItemNode, NamedItemNode, TypeItemNo bindingset[c] private string getCanonicalPathPart(Crate c, int i) { - i = -1 and + i = 0 and result = "<" or - i = 0 and + i = 1 and result = this.getCanonicalPathPrefix(c) or - i = 1 and + i = 2 and result = "::" or - i = 2 and + i = 3 and result = this.getName() or - i = 3 and + i = 4 and result = ">" } language[monotonicAggregates] override string getCanonicalPath(Crate c) { this.hasCanonicalPath(c) and - result = strictconcat(int i | i in [0 .. 2] | this.getCanonicalPathPart(c, i) order by i) + result = strictconcat(int i | i in [1 .. 3] | this.getCanonicalPathPart(c, i) order by i) } language[monotonicAggregates] override string getCanonicalPathPrefixFor(Crate c, ItemNode child) { this.providesCanonicalPathPrefixFor(c, child) and - result = strictconcat(int i | i in [-1 .. 3] | this.getCanonicalPathPart(c, i) order by i) + result = strictconcat(int i | i in [0 .. 4] | this.getCanonicalPathPart(c, i) order by i) } } From 178f12c8872049ac283e5e56f03ff84bd945f484 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 31 Aug 2026 11:11:27 +0200 Subject: [PATCH 0599/2098] C#: Introduce IFileProvider interface. --- .../DependencyManager.cs | 2 +- .../FeedManager.cs | 4 ++-- .../FileProvider.cs | 3 +-- .../IFileProvider.cs | 22 +++++++++++++++++++ .../NugetPackageRestorer.cs | 4 ++-- .../PackagesConfigRestorer.cs | 6 ++--- .../DotnetSourceGeneratorBase.cs | 4 ++-- .../SourceGenerators/RazorGenerator.cs | 2 +- .../SourceGenerators/ResxGenerator.cs | 2 +- 9 files changed, 35 insertions(+), 14 deletions(-) create mode 100644 csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IFileProvider.cs diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs index 2706d5262931..d68e83ea3fd5 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs @@ -30,7 +30,7 @@ public sealed partial class DependencyManager : IDisposable, ICompilationInfoCon private readonly DependabotProxy? dependabotProxy; private readonly IDotNet dotnet; private readonly FileContent fileContent; - private readonly FileProvider fileProvider; + private readonly IFileProvider fileProvider; // Only used as a set, but ConcurrentDictionary is the only concurrent set in .NET. private readonly IDictionary usedReferences = new ConcurrentDictionary(); diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs index 542254425045..c97996d8fa32 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs @@ -21,7 +21,7 @@ internal sealed partial class FeedManager : IDisposable private readonly ILogger logger; private readonly IDotNet dotnet; - private readonly FileProvider fileProvider; + private readonly IFileProvider fileProvider; private readonly DependabotProxy? dependabotProxy; private readonly DependencyDirectory emptyPackageDirectory; private readonly ImmutableHashSet privateRegistryFeeds; @@ -79,7 +79,7 @@ internal sealed partial class FeedManager : IDisposable /// public ImmutableHashSet ReachableFallbackFeeds => lazyReachableFallbackFeeds.Value; - public FeedManager(ILogger logger, IDotNet dotnet, DependabotProxy? dependabotProxy, FileProvider fileProvider) + public FeedManager(ILogger logger, IDotNet dotnet, DependabotProxy? dependabotProxy, IFileProvider fileProvider) { this.logger = logger; this.dotnet = dotnet; diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FileProvider.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FileProvider.cs index 9e6b810b95ec..4f55bbff7f27 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FileProvider.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FileProvider.cs @@ -2,12 +2,11 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using System.Security.Policy; using Semmle.Util.Logging; namespace Semmle.Extraction.CSharp.DependencyFetching { - public class FileProvider + public class FileProvider : IFileProvider { private static readonly HashSet binaryFileExtensions = [".dll", ".exe"]; // TODO: add more binary file extensions. diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IFileProvider.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IFileProvider.cs new file mode 100644 index 000000000000..919be0af61a7 --- /dev/null +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IFileProvider.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; +using System.IO; + +namespace Semmle.Extraction.CSharp.DependencyFetching +{ + public interface IFileProvider + { + DirectoryInfo SourceDir { get; } + IEnumerable SmallNonBinary { get; } + IEnumerable Sources { get; } + ICollection Projects { get; } + ICollection Solutions { get; } + IEnumerable Dlls { get; } + ICollection NugetConfigs { get; } + ICollection NugetExes { get; } + string? RootNugetConfig { get; } + IEnumerable GlobalJsons { get; } + ICollection PackagesConfigs { get; } + ICollection RazorViews { get; } + ICollection Resources { get; } + } +} diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs index 2003941bd358..b483d702ad94 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs @@ -15,7 +15,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching { internal sealed partial class NugetPackageRestorer : IDisposable { - private readonly FileProvider fileProvider; + private readonly IFileProvider fileProvider; private readonly FileContent fileContent; private readonly IDotNet dotnet; private readonly IDiagnosticsWriter diagnosticsWriter; @@ -29,7 +29,7 @@ internal sealed partial class NugetPackageRestorer : IDisposable public NugetPackageRestorer( - FileProvider fileProvider, + IFileProvider fileProvider, FileContent fileContent, IDotNet dotnet, DependabotProxy? dependabotProxy, diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/PackagesConfigRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/PackagesConfigRestorer.cs index a09bcca9fd00..d4403bb955ef 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/PackagesConfigRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/PackagesConfigRestorer.cs @@ -33,7 +33,7 @@ internal interface IPackagesConfigRestore /// internal class PackagesConfigRestoreFactory { - public static IPackagesConfigRestore Create(FileProvider fileProvider, DependencyDirectory packageDirectory, Semmle.Util.Logging.ILogger logger, FeedManager feedManager) + public static IPackagesConfigRestore Create(IFileProvider fileProvider, DependencyDirectory packageDirectory, Semmle.Util.Logging.ILogger logger, FeedManager feedManager) { if (SystemBuildActions.Instance.IsWindows() || SystemBuildActions.Instance.IsMonoInstalled()) { @@ -55,7 +55,7 @@ private class NugetExeWrapper : IPackagesConfigRestore public int PackageCount => fileProvider.PackagesConfigs.Count; - private readonly FileProvider fileProvider; + private readonly IFileProvider fileProvider; /// /// The packages directory. @@ -74,7 +74,7 @@ private class NugetExeWrapper : IPackagesConfigRestore /// /// Create the package manager for a specified source tree. /// - public NugetExeWrapper(FileProvider fileProvider, DependencyDirectory packageDirectory, Semmle.Util.Logging.ILogger logger, FeedManager feedManager) + public NugetExeWrapper(IFileProvider fileProvider, DependencyDirectory packageDirectory, Semmle.Util.Logging.ILogger logger, FeedManager feedManager) { this.fileProvider = fileProvider; this.packageDirectory = packageDirectory; diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/SourceGenerators/DotnetSourceGeneratorBase.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/SourceGenerators/DotnetSourceGeneratorBase.cs index c17981803ddb..6a150e8d542a 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/SourceGenerators/DotnetSourceGeneratorBase.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/SourceGenerators/DotnetSourceGeneratorBase.cs @@ -9,14 +9,14 @@ namespace Semmle.Extraction.CSharp.DependencyFetching { internal abstract class DotnetSourceGeneratorBase : SourceGeneratorBase where T : DotnetSourceGeneratorWrapper { - protected readonly FileProvider fileProvider; + protected readonly IFileProvider fileProvider; protected readonly FileContent fileContent; protected readonly IDotNet dotnet; protected readonly ICompilationInfoContainer compilationInfoContainer; protected readonly IEnumerable references; public DotnetSourceGeneratorBase( - FileProvider fileProvider, + IFileProvider fileProvider, FileContent fileContent, IDotNet dotnet, ICompilationInfoContainer compilationInfoContainer, diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/SourceGenerators/RazorGenerator.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/SourceGenerators/RazorGenerator.cs index 3f9a17dc6b30..8d4536b4503c 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/SourceGenerators/RazorGenerator.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/SourceGenerators/RazorGenerator.cs @@ -8,7 +8,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching internal class RazorGenerator : DotnetSourceGeneratorBase { public RazorGenerator( - FileProvider fileProvider, + IFileProvider fileProvider, FileContent fileContent, IDotNet dotnet, ICompilationInfoContainer compilationInfoContainer, diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/SourceGenerators/ResxGenerator.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/SourceGenerators/ResxGenerator.cs index da66ef275442..e6e27ea27534 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/SourceGenerators/ResxGenerator.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/SourceGenerators/ResxGenerator.cs @@ -10,7 +10,7 @@ internal class ResxGenerator : DotnetSourceGeneratorBase private readonly string? sourceGeneratorFolder = null; public ResxGenerator( - FileProvider fileProvider, + IFileProvider fileProvider, FileContent fileContent, IDotNet dotnet, ICompilationInfoContainer compilationInfoContainer, From 29e1392e87503ef64792bb4cf62c538280a41843 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 31 Aug 2026 12:53:18 +0200 Subject: [PATCH 0600/2098] C#: Introduce interface for DependabotProxy. --- .../DependabotProxy.cs | 27 ++++++----------- .../DependencyManager.cs | 2 +- .../DotNet.cs | 4 +-- .../DotNetCliInvoker.cs | 4 +-- .../FeedManager.cs | 4 +-- .../IDependabotProxy.cs | 29 +++++++++++++++++++ .../NugetPackageRestorer.cs | 2 +- 7 files changed, 46 insertions(+), 26 deletions(-) create mode 100644 csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDependabotProxy.cs diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs index e06970141fed..08b142219a97 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs @@ -9,7 +9,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching { - public class DependabotProxy : IDisposable + public class DependabotProxy : IDependabotProxy { /// /// Represents configurations for package registries. @@ -21,24 +21,15 @@ public record class RegistryConfig(string Type, string URL); private readonly string host; private readonly string port; - /// - /// The full address of the Dependabot proxy, if available. - /// - internal string Address { get; } - /// - /// The URLs of package registries that are configured for the proxy. - /// - internal HashSet RegistryURLs { get; } - /// - /// The path to the temporary file where the certificate is stored. - /// - internal string? CertificatePath { get; private set; } - /// - /// The certificate used for the Dependabot proxy. - /// - internal X509Certificate2? Certificate { get; private set; } + public string Address { get; } + + public HashSet RegistryURLs { get; } + + public string? CertificatePath { get; private set; } + + public X509Certificate2? Certificate { get; private set; } - internal static DependabotProxy? GetDependabotProxy( + internal static IDependabotProxy? GetDependabotProxy( ILogger logger, IDiagnosticsWriter diagnosticsWriter, TemporaryDirectory tempWorkingDirectory) { // Setting HTTP(S)_PROXY and SSL_CERT_FILE have no effect on Windows or macOS, diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs index d68e83ea3fd5..707fabbf83fb 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs @@ -27,7 +27,7 @@ public sealed partial class DependencyManager : IDisposable, ICompilationInfoCon private readonly ILogger logger; private readonly IDiagnosticsWriter diagnosticsWriter; private readonly NugetPackageRestorer nugetPackageRestorer; - private readonly DependabotProxy? dependabotProxy; + private readonly IDependabotProxy? dependabotProxy; private readonly IDotNet dotnet; private readonly FileContent fileContent; private readonly IFileProvider fileProvider; diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs index 9cf13c7af96d..9958fbce4e71 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs @@ -31,11 +31,11 @@ private DotNet(IDotNetCliInvoker dotnetCliInvoker, ILogger logger, bool runDotne } } - private DotNet(ILogger logger, string? dotNetPath, TemporaryDirectory tempWorkingDirectory, DependabotProxy? dependabotProxy) : this(new DotNetCliInvoker(logger, Path.Join(dotNetPath ?? string.Empty, "dotnet"), dependabotProxy), logger, dotNetPath is null, tempWorkingDirectory) { } + private DotNet(ILogger logger, string? dotNetPath, TemporaryDirectory tempWorkingDirectory, IDependabotProxy? dependabotProxy) : this(new DotNetCliInvoker(logger, Path.Join(dotNetPath ?? string.Empty, "dotnet"), dependabotProxy), logger, dotNetPath is null, tempWorkingDirectory) { } internal static IDotNet Make(IDotNetCliInvoker dotnetCliInvoker, ILogger logger, bool runDotnetInfo) => new DotNet(dotnetCliInvoker, logger, runDotnetInfo); - public static IDotNet Make(ILogger logger, string? dotNetPath, TemporaryDirectory tempWorkingDirectory, DependabotProxy? dependabotProxy) => new DotNet(logger, dotNetPath, tempWorkingDirectory, dependabotProxy); + public static IDotNet Make(ILogger logger, string? dotNetPath, TemporaryDirectory tempWorkingDirectory, IDependabotProxy? dependabotProxy) => new DotNet(logger, dotNetPath, tempWorkingDirectory, dependabotProxy); private static void HandleRetryExitCode143(string dotnet, int attempt, ILogger logger) { diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNetCliInvoker.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNetCliInvoker.cs index b982cac65477..c6f97c5f8be2 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNetCliInvoker.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNetCliInvoker.cs @@ -12,11 +12,11 @@ namespace Semmle.Extraction.CSharp.DependencyFetching internal sealed class DotNetCliInvoker : IDotNetCliInvoker { private readonly ILogger logger; - private readonly DependabotProxy? proxy; + private readonly IDependabotProxy? proxy; public string Exec { get; } - public DotNetCliInvoker(ILogger logger, string exec, DependabotProxy? dependabotProxy) + public DotNetCliInvoker(ILogger logger, string exec, IDependabotProxy? dependabotProxy) { this.logger = logger; this.proxy = dependabotProxy; diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs index c97996d8fa32..b7efc49ad5ca 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs @@ -22,7 +22,7 @@ internal sealed partial class FeedManager : IDisposable private readonly ILogger logger; private readonly IDotNet dotnet; private readonly IFileProvider fileProvider; - private readonly DependabotProxy? dependabotProxy; + private readonly IDependabotProxy? dependabotProxy; private readonly DependencyDirectory emptyPackageDirectory; private readonly ImmutableHashSet privateRegistryFeeds; @@ -79,7 +79,7 @@ internal sealed partial class FeedManager : IDisposable /// public ImmutableHashSet ReachableFallbackFeeds => lazyReachableFallbackFeeds.Value; - public FeedManager(ILogger logger, IDotNet dotnet, DependabotProxy? dependabotProxy, IFileProvider fileProvider) + public FeedManager(ILogger logger, IDotNet dotnet, IDependabotProxy? dependabotProxy, IFileProvider fileProvider) { this.logger = logger; this.dotnet = dotnet; diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDependabotProxy.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDependabotProxy.cs new file mode 100644 index 000000000000..37a11900fddf --- /dev/null +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDependabotProxy.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Security.Cryptography.X509Certificates; + +namespace Semmle.Extraction.CSharp.DependencyFetching +{ + public interface IDependabotProxy : IDisposable + { + /// + /// The full address of the Dependabot proxy, if available. + /// + string Address { get; } + + /// + /// The URLs of package registries that are configured for the proxy. + /// + HashSet RegistryURLs { get; } + + /// + /// The path to the temporary file where the certificate is stored. + /// + string? CertificatePath { get; } + + /// + /// The certificate used for the Dependabot proxy. + /// + X509Certificate2? Certificate { get; } + } +} diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs index b483d702ad94..85d6056d7218 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs @@ -32,7 +32,7 @@ public NugetPackageRestorer( IFileProvider fileProvider, FileContent fileContent, IDotNet dotnet, - DependabotProxy? dependabotProxy, + IDependabotProxy? dependabotProxy, IDiagnosticsWriter diagnosticsWriter, ILogger logger, ICompilationInfoContainer compilationInfoContainer) From 0f2a7cf7ea564805f7d8d282f99329caa1c54eaa Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 31 Aug 2026 13:16:44 +0200 Subject: [PATCH 0601/2098] C#: Make FeedManager unit-testable. --- .../FeedManager.cs | 103 ++--------------- .../FeedManagerIO.cs | 109 ++++++++++++++++++ .../IFeedManagerIO.cs | 16 +++ 3 files changed, 134 insertions(+), 94 deletions(-) create mode 100644 csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManagerIO.cs create mode 100644 csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IFeedManagerIO.cs diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs index b7efc49ad5ca..6c4593f3400c 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs @@ -1,15 +1,8 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; -using System.IO; using System.Linq; -using System.Net; -using System.Net.Http; -using System.Security.Cryptography.X509Certificates; -using System.Text; using System.Text.RegularExpressions; -using System.Threading; -using System.Threading.Tasks; using Semmle.Util; using Semmle.Util.Logging; @@ -22,9 +15,9 @@ internal sealed partial class FeedManager : IDisposable private readonly ILogger logger; private readonly IDotNet dotnet; private readonly IFileProvider fileProvider; - private readonly IDependabotProxy? dependabotProxy; private readonly DependencyDirectory emptyPackageDirectory; private readonly ImmutableHashSet privateRegistryFeeds; + private readonly IFeedManagerIO feedManagerIo; /// /// Gets whether there are private package registries configured for C#. @@ -79,12 +72,12 @@ internal sealed partial class FeedManager : IDisposable /// public ImmutableHashSet ReachableFallbackFeeds => lazyReachableFallbackFeeds.Value; - public FeedManager(ILogger logger, IDotNet dotnet, IDependabotProxy? dependabotProxy, IFileProvider fileProvider) + public FeedManager(ILogger logger, IDotNet dotnet, IDependabotProxy? dependabotProxy, IFileProvider fileProvider, IFeedManagerIO feedManagerIo) { this.logger = logger; this.dotnet = dotnet; - this.dependabotProxy = dependabotProxy; this.fileProvider = fileProvider; + this.feedManagerIo = feedManagerIo; privateRegistryFeeds = dependabotProxy?.RegistryURLs.ToImmutableHashSet() ?? []; HasPrivateRegistryFeeds = privateRegistryFeeds.Count > 0; emptyPackageDirectory = new DependencyDirectory("empty", "empty package", logger); @@ -105,17 +98,9 @@ public FeedManager(ILogger logger, IDotNet dotnet, IDependabotProxy? dependabotP }); } - private string? GetDirectoryName(string path) + public FeedManager(ILogger logger, IDotNet dotnet, IDependabotProxy? dependabotProxy, IFileProvider fileProvider) + : this(logger, dotnet, dependabotProxy, fileProvider, new FeedManagerIO(logger, dependabotProxy)) { - try - { - return new FileInfo(path).Directory?.FullName; - } - catch (Exception exc) - { - logger.LogWarning($"Failed to get directory of '{path}': {exc}"); - } - return null; } private IEnumerable GetFeeds(Func> getNugetFeeds) @@ -193,7 +178,7 @@ private IEnumerable FeedsToUseAux(HashSet feedsToConsider) public IEnumerable FeedsToUse(string path) { // Find the path specific feeds. - var folder = GetDirectoryName(path); + var folder = feedManagerIo.GetDirectoryName(path); var feedsToConsider = folder is not null ? GetFeedsFromFolder(folder).ToHashSet() : new HashSet(); return FeedsToUseAux(feedsToConsider); @@ -238,76 +223,6 @@ public List MakeRestoreFeeds(string path) return (timeoutMilliSeconds, tryCount); } - private static async Task ExecuteGetRequest(string address, HttpClient httpClient, CancellationToken cancellationToken) - { - return await httpClient.GetAsync(address, HttpCompletionOption.ResponseHeadersRead, cancellationToken); - } - - private bool IsFeedReachable(string feed, int timeoutMilliSeconds, int tryCount) - { - logger.LogInfo($"Checking if NuGet feed '{feed}' is reachable..."); - - // Configure the HttpClient to be aware of the Dependabot Proxy, if used. - HttpClientHandler httpClientHandler = new(); - if (dependabotProxy != null) - { - httpClientHandler.Proxy = new WebProxy(dependabotProxy.Address); - - if (dependabotProxy.Certificate != null) - { - httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, _) => - { - if (chain is null || cert is null) - { - var msg = cert is null && chain is null - ? "certificate and chain" - : chain is null - ? "chain" - : "certificate"; - logger.LogWarning($"Dependabot proxy certificate validation failed due to missing {msg}"); - return false; - } - chain.ChainPolicy.TrustMode = X509ChainTrustMode.CustomRootTrust; - chain.ChainPolicy.CustomTrustStore.Add(dependabotProxy.Certificate); - return chain.Build(cert); - }; - } - } - - using HttpClient client = new(httpClientHandler); - - for (var i = 0; i < tryCount; i++) - { - using var cts = new CancellationTokenSource(); - cts.CancelAfter(timeoutMilliSeconds); - try - { - logger.LogInfo($"Attempt {i + 1}/{tryCount} to reach NuGet feed '{feed}'."); - using var response = ExecuteGetRequest(feed, client, cts.Token).GetAwaiter().GetResult(); - response.EnsureSuccessStatusCode(); - logger.LogInfo($"Querying NuGet feed '{feed}' succeeded."); - return true; - } - catch (Exception exc) - { - if (exc is TaskCanceledException tce && - tce.CancellationToken == cts.Token && - cts.Token.IsCancellationRequested) - { - logger.LogInfo($"Didn't receive answer from NuGet feed '{feed}' in {timeoutMilliSeconds}ms."); - timeoutMilliSeconds *= 2; - continue; - } - - logger.LogInfo($"Querying NuGet feed '{feed}' failed. The reason for the failure: {exc.Message}"); - return false; - } - } - - logger.LogWarning($"Didn't receive answer from NuGet feed '{feed}'. Tried it {tryCount} times."); - return false; - } - /// /// Retrieves a list of excluded NuGet feeds from the corresponding environment variable. /// @@ -361,7 +276,7 @@ public bool IsDefaultFeedReachable() if (CheckNugetFeedResponsiveness) { var (initialTimeout, tryCount) = GetFeedRequestSettings(isFallback: false); - return IsFeedReachable(PublicNugetOrgFeed, initialTimeout, tryCount); + return feedManagerIo.IsFeedReachable(PublicNugetOrgFeed, initialTimeout, tryCount); } return true; @@ -380,7 +295,7 @@ private List GetReachableNuGetFeeds(HashSet feedsToCheck, bool i var (initialTimeout, tryCount) = GetFeedRequestSettings(isFallback); var reachableFeeds = feedsToCheck - .Where(feed => IsFeedReachable(feed, initialTimeout, tryCount)) + .Where(feed => feedManagerIo.IsFeedReachable(feed, initialTimeout, tryCount)) .ToList(); if (reachableFeeds.Count == 0) @@ -464,7 +379,7 @@ private ImmutableHashSet GetAllFeeds() if (nugetConfigs.Count > 0) { var nugetConfigFeeds = nugetConfigs - .Select(GetDirectoryName) + .Select(feedManagerIo.GetDirectoryName) .Where(folder => folder != null) .SelectMany(folder => GetFeedsFromFolder(folder!)) .ToHashSet(); diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManagerIO.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManagerIO.cs new file mode 100644 index 000000000000..8e771f6037a4 --- /dev/null +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManagerIO.cs @@ -0,0 +1,109 @@ + +using System; +using System.IO; +using Semmle.Util.Logging; +using System.Net.Http; +using System.Net; +using System.Security.Cryptography.X509Certificates; +using System.Threading; +using System.Threading.Tasks; + +namespace Semmle.Extraction.CSharp.DependencyFetching +{ + public class FeedManagerIO : IFeedManagerIO + { + private readonly ILogger logger; + private readonly IDependabotProxy? dependabotProxy; + + public FeedManagerIO(ILogger logger, IDependabotProxy? dependabotProxy) + { + this.logger = logger; + this.dependabotProxy = dependabotProxy; + } + + public string? GetDirectoryName(string path) + { + try + { + return new FileInfo(path).Directory?.FullName; + } + catch (Exception exc) + { + logger.LogWarning($"Failed to get directory of '{path}': {exc}"); + } + return null; + } + + private static async Task ExecuteGetRequest(string address, HttpClient httpClient, CancellationToken cancellationToken) + { + return await httpClient.GetAsync(address, HttpCompletionOption.ResponseHeadersRead, cancellationToken); + } + + public bool IsFeedReachable(string feed, int timeoutMilliSeconds, int tryCount) + { + logger.LogInfo($"Checking if NuGet feed '{feed}' is reachable..."); + + // Configure the HttpClient to be aware of the Dependabot Proxy, if used. + HttpClientHandler httpClientHandler = new(); + if (dependabotProxy != null) + { + httpClientHandler.Proxy = new WebProxy(dependabotProxy.Address); + + if (dependabotProxy.Certificate != null) + { + httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, _) => + { + if (chain is null || cert is null) + { + var msg = cert is null && chain is null + ? "certificate and chain" + : chain is null + ? "chain" + : "certificate"; + logger.LogWarning($"Dependabot proxy certificate validation failed due to missing {msg}"); + return false; + } + chain.ChainPolicy.TrustMode = X509ChainTrustMode.CustomRootTrust; + chain.ChainPolicy.CustomTrustStore.Add(dependabotProxy.Certificate); + return chain.Build(cert); + }; + } + } + + using HttpClient client = new(httpClientHandler); + + for (var i = 0; i < tryCount; i++) + { + using var cts = new CancellationTokenSource(); + cts.CancelAfter(timeoutMilliSeconds); + try + { + logger.LogInfo($"Attempt {i + 1}/{tryCount} to reach NuGet feed '{feed}'."); + using var response = ExecuteGetRequest(feed, client, cts.Token).GetAwaiter().GetResult(); + response.EnsureSuccessStatusCode(); + logger.LogInfo($"Querying NuGet feed '{feed}' succeeded."); + return true; + } + catch (Exception exc) + { + if (exc is TaskCanceledException tce && + tce.CancellationToken == cts.Token && + cts.Token.IsCancellationRequested) + { + logger.LogInfo($"Didn't receive answer from NuGet feed '{feed}' in {timeoutMilliSeconds}ms."); + timeoutMilliSeconds *= 2; + continue; + } + + logger.LogInfo($"Querying NuGet feed '{feed}' failed. The reason for the failure: {exc.Message}"); + return false; + } + } + + logger.LogWarning($"Didn't receive answer from NuGet feed '{feed}'. Tried it {tryCount} times."); + return false; + } + + + } +} diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IFeedManagerIO.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IFeedManagerIO.cs new file mode 100644 index 000000000000..380c5f3b5f28 --- /dev/null +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IFeedManagerIO.cs @@ -0,0 +1,16 @@ + +namespace Semmle.Extraction.CSharp.DependencyFetching +{ + public interface IFeedManagerIO + { + /// + /// Gets the directory name of the specified path. + /// + string? GetDirectoryName(string path); + + /// + /// Returns true if the feed is reachable within the specified timeout and try count. + /// + bool IsFeedReachable(string feed, int timeoutMilliSeconds, int tryCount); + } +} From 53972f5e3e58d0dfd8e2308bae9bbf78b78c4073 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 31 Aug 2026 13:23:26 +0200 Subject: [PATCH 0602/2098] C#: Move DotNetStub into its own file. --- .../Semmle.Extraction.Tests/DotNetStub.cs | 33 +++++++++++++++++++ .../Semmle.Extraction.Tests/Runtime.cs | 27 --------------- 2 files changed, 33 insertions(+), 27 deletions(-) create mode 100644 csharp/extractor/Semmle.Extraction.Tests/DotNetStub.cs diff --git a/csharp/extractor/Semmle.Extraction.Tests/DotNetStub.cs b/csharp/extractor/Semmle.Extraction.Tests/DotNetStub.cs new file mode 100644 index 000000000000..fcccfdc6296a --- /dev/null +++ b/csharp/extractor/Semmle.Extraction.Tests/DotNetStub.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using Semmle.Extraction.CSharp.DependencyFetching; + +namespace Semmle.Extraction.Tests +{ + internal class DotNetStub : IDotNet + { + private readonly IList runtimes; + private readonly IList sdks; + + public DotNetStub(IList runtimes, IList sdks) + { + this.runtimes = runtimes; + this.sdks = sdks; + } + public bool AddPackage(string folder, string package) => true; + + public bool New(string folder) => true; + + public RestoreResult Restore(RestoreSettings restoreSettings) => new(true, Array.Empty()); + + public IList GetListedRuntimes() => runtimes; + + public IList GetListedSdks() => sdks; + + public bool Exec(List execArgs) => true; + + public IList GetNugetFeeds(string nugetConfig) => []; + + public IList GetNugetFeedsFromFolder(string folderPath) => []; + } +} diff --git a/csharp/extractor/Semmle.Extraction.Tests/Runtime.cs b/csharp/extractor/Semmle.Extraction.Tests/Runtime.cs index 348cadae2fd0..12933994647e 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/Runtime.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/Runtime.cs @@ -5,33 +5,6 @@ namespace Semmle.Extraction.Tests { - internal class DotNetStub : IDotNet - { - private readonly IList runtimes; - private readonly IList sdks; - - public DotNetStub(IList runtimes, IList sdks) - { - this.runtimes = runtimes; - this.sdks = sdks; - } - public bool AddPackage(string folder, string package) => true; - - public bool New(string folder) => true; - - public RestoreResult Restore(RestoreSettings restoreSettings) => new(true, Array.Empty()); - - public IList GetListedRuntimes() => runtimes; - - public IList GetListedSdks() => sdks; - - public bool Exec(List execArgs) => true; - - public IList GetNugetFeeds(string nugetConfig) => []; - - public IList GetNugetFeedsFromFolder(string folderPath) => []; - } - public class RuntimeTests { private static string FixExpectedPathOnWindows(string path) => path.Replace('\\', '/'); From b76f7939d7fb7d5a10a1de2b271c11516d0a73e3 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 31 Aug 2026 15:18:04 +0200 Subject: [PATCH 0603/2098] C#: Add some Feed manager unit tests. --- .../Semmle.Extraction.Tests/DotNetStub.cs | 10 +- .../Semmle.Extraction.Tests/FeedManager.cs | 187 ++++++++++++++++++ .../Semmle.Extraction.Tests/Runtime.cs | 15 +- 3 files changed, 203 insertions(+), 9 deletions(-) create mode 100644 csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs diff --git a/csharp/extractor/Semmle.Extraction.Tests/DotNetStub.cs b/csharp/extractor/Semmle.Extraction.Tests/DotNetStub.cs index fcccfdc6296a..119e39fd0974 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/DotNetStub.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/DotNetStub.cs @@ -8,11 +8,15 @@ internal class DotNetStub : IDotNet { private readonly IList runtimes; private readonly IList sdks; + private readonly IList nugetFeedsFromConfig; + private readonly IList nugetFeedsFromFolder; - public DotNetStub(IList runtimes, IList sdks) + public DotNetStub(IList runtimes, IList sdks, IList nugetFeedsFromConfig, IList nugetFeedsFromFolder) { this.runtimes = runtimes; this.sdks = sdks; + this.nugetFeedsFromConfig = nugetFeedsFromConfig; + this.nugetFeedsFromFolder = nugetFeedsFromFolder; } public bool AddPackage(string folder, string package) => true; @@ -26,8 +30,8 @@ public DotNetStub(IList runtimes, IList sdks) public bool Exec(List execArgs) => true; - public IList GetNugetFeeds(string nugetConfig) => []; + public IList GetNugetFeeds(string nugetConfig) => nugetFeedsFromConfig; - public IList GetNugetFeedsFromFolder(string folderPath) => []; + public IList GetNugetFeedsFromFolder(string folderPath) => nugetFeedsFromFolder; } } diff --git a/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs b/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs new file mode 100644 index 000000000000..f70efdb4cdcc --- /dev/null +++ b/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs @@ -0,0 +1,187 @@ +using Xunit; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Semmle.Extraction.CSharp.DependencyFetching; + +namespace Semmle.Extraction.Tests +{ + public class DependabotProxyStub : IDependabotProxy + { + public string Address { get; } = ""; + public HashSet RegistryURLs { get; } = ["https://example.com/registry1", "https://example.com/registry2"]; + public string? CertificatePath { get; } = null; + public System.Security.Cryptography.X509Certificates.X509Certificate2? Certificate { get; } = null; + + public void Dispose() { } + } + + public class FeedManagerIOStub : IFeedManagerIO + { + private readonly List unreachableFeeds; + + public FeedManagerIOStub(List unreachableFeeds) + { + this.unreachableFeeds = unreachableFeeds; + } + + public string? GetDirectoryName(string path) + { + return "/path/to/folder"; + } + + public bool IsFeedReachable(string feed, int timeoutMilliSeconds, int tryCount) + { + return !unreachableFeeds.Contains(feed); + } + } + + public class FileProviderStub : IFileProvider + { + public DirectoryInfo SourceDir { get; } = new DirectoryInfo("/path/to/source"); + public IEnumerable SmallNonBinary { get; } = Enumerable.Empty(); + public IEnumerable Sources { get; } = Enumerable.Empty(); + public ICollection Projects { get; } = new List(); + public ICollection Solutions { get; } = new List(); + public IEnumerable Dlls { get; } = Enumerable.Empty(); + public ICollection NugetConfigs { get; } = ["/path/to/nuget.config"]; + public ICollection NugetExes { get; } = new List(); + public string? RootNugetConfig { get; } = null; + public IEnumerable GlobalJsons { get; } = Enumerable.Empty(); + public ICollection PackagesConfigs { get; } = new List(); + public ICollection RazorViews { get; } = new List(); + public ICollection Resources { get; } = new List(); + } + + public class FeedManagerTests + { + private static FeedManager MakeFeedManager() + { + var logger = new LoggerStub(); + var dotnet = new DotNetStub([], [], ["E https://feed.from/config"], ["E https://feed.from/folder1", "E https://feed.from/folder2", "D https://feed.from/folder3"]); + var dependabotProxy = new DependabotProxyStub(); + var fileProvider = new FileProviderStub(); + var feedManagerIo = new FeedManagerIOStub(["https://example.com/registry1", "https://feed.from/folder2"]); + return new FeedManager(logger, dotnet, dependabotProxy, fileProvider, feedManagerIo); + } + + [Fact] + public void TestExplicitFeeds() + { + // Setup + var feedManager = MakeFeedManager(); + + // Execute + var actualFeeds = feedManager.ExplicitFeeds; + + // Verify + Assert.Equal([ + "https://example.com/registry1", + "https://example.com/registry2", + "https://feed.from/config" + ], actualFeeds); + } + + [Fact] + public void TestInheritedFeeds() + { + // Setup + var feedManager = MakeFeedManager(); + + // Execute + var inherited = feedManager.InheritedFeeds; + + // Verify + Assert.Equal([ + "https://feed.from/folder1", + "https://feed.from/folder2" + ], inherited); + } + + [Fact] + public void TestAllFeeds() + { + // Setup + var feedManager = MakeFeedManager(); + + // Execute + var all = feedManager.AllFeeds; + + // Verify + Assert.Equal([ + "https://example.com/registry1", + "https://example.com/registry2", + "https://feed.from/config", + "https://feed.from/folder1", + "https://feed.from/folder2" + ], all); + } + + [Fact] + public void TestReachableFeeds() + { + // Setup + var feedManager = MakeFeedManager(); + + // Execute + var reachableFeeds = feedManager.ReachableFeeds; + + // Verify + Assert.Equal([ + "https://example.com/registry2", + "https://feed.from/config", + "https://feed.from/folder1" + ], reachableFeeds); + } + + [Fact] + public void TestReachableExplicitFeeds() + { + // Setup + var feedManager = MakeFeedManager(); + + // Execute + var reachableFeeds = feedManager.ReachableExplicitFeeds; + + // Verify + Assert.Equal([ + "https://example.com/registry2", + "https://feed.from/config" + ], reachableFeeds); + } + + [Fact] + public void TestReachableFallbackFeeds() + { + // Setup + var feedManager = MakeFeedManager(); + + // Execute + var reachableFallback = feedManager.ReachableFallbackFeeds; + + // Verify + Assert.Equal([ + "https://example.com/registry2", + "https://feed.from/config", + "https://api.nuget.org/v3/index.json" + ], reachableFallback); + } + + [Fact] + public void TestFeedsToUse() + { + // Setup + var feedManager = MakeFeedManager(); + + // Execute + var feedsToUse = feedManager.FeedsToUse("/path/to/packages.config").ToHashSet(); + + // Verify + Assert.Equal([ + "https://example.com/registry2", + "https://feed.from/folder1" + ], feedsToUse); + } + } +} diff --git a/csharp/extractor/Semmle.Extraction.Tests/Runtime.cs b/csharp/extractor/Semmle.Extraction.Tests/Runtime.cs index 12933994647e..ea2483f3faf3 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/Runtime.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/Runtime.cs @@ -9,6 +9,8 @@ public class RuntimeTests { private static string FixExpectedPathOnWindows(string path) => path.Replace('\\', '/'); + private static DotNetStub MakeDotNetStub(IList listedRuntimes) => new DotNetStub(listedRuntimes, null!, [], []); + [Fact] public void TestRuntime1() { @@ -23,7 +25,7 @@ public void TestRuntime1() "Microsoft.NETCore.App 7.0.0 [/path/dotnet/shared/Microsoft.NETCore.App]", "Microsoft.NETCore.App 7.0.2 [/path/dotnet/shared/Microsoft.NETCore.App]" }; - var dotnet = new DotNetStub(listedRuntimes, null!); + var dotnet = MakeDotNetStub(listedRuntimes); var runtime = new Runtime(dotnet); // Execute @@ -49,7 +51,7 @@ public void TestRuntime2() "Microsoft.NETCore.App 8.0.0-preview.5.43280.8 [/path/dotnet/shared/Microsoft.NETCore.App]", "Microsoft.NETCore.App 8.0.0-preview.5.23280.8 [/path/dotnet/shared/Microsoft.NETCore.App]" }; - var dotnet = new DotNetStub(listedRuntimes, null!); + var dotnet = new DotNetStub(listedRuntimes, null!, [], []); var runtime = new Runtime(dotnet); // Execute @@ -72,7 +74,7 @@ public void TestRuntime3() "Microsoft.NETCore.App 8.0.0-rc.4.43280.8 [/path/dotnet/shared/Microsoft.NETCore.App]", "Microsoft.NETCore.App 8.0.0-preview.5.23280.8 [/path/dotnet/shared/Microsoft.NETCore.App]" }; - var dotnet = new DotNetStub(listedRuntimes, null!); + var dotnet = MakeDotNetStub(listedRuntimes); var runtime = new Runtime(dotnet); // Execute @@ -101,7 +103,7 @@ public void TestRuntime4() @"Microsoft.WindowsDesktop.App 6.0.20 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]", @"Microsoft.WindowsDesktop.App 7.0.4 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]" }; - var dotnet = new DotNetStub(listedRuntimes, null!); + var dotnet = MakeDotNetStub(listedRuntimes); var runtime = new Runtime(dotnet); // Execute @@ -122,6 +124,7 @@ public class SdkTests { private static string FixExpectedPathOnWindows(string path) => path.Replace('\\', '/'); + private static DotNetStub MakeDotNetStub(IList listedSdks) => new DotNetStub(null!, listedSdks, [], []); [Fact] public void TestSdk1() { @@ -136,7 +139,7 @@ public void TestSdk1() "6.0.102 [/usr/local/share/dotnet/sdk6]", "6.0.301 [/usr/local/share/dotnet/sdk7]", }; - var dotnet = new DotNetStub(null!, listedSdks); + var dotnet = MakeDotNetStub(listedSdks); var sdk = new Sdk(dotnet, new LoggerStub()); // Execute @@ -158,7 +161,7 @@ public void TestSdk2() "8.0.100-preview.7.23376.3 [/usr/local/share/dotnet/sdk3]", "7.0.400 [/usr/local/share/dotnet/sdk4]", }; - var dotnet = new DotNetStub(null!, listedSdks); + var dotnet = MakeDotNetStub(listedSdks); var sdk = new Sdk(dotnet, new LoggerStub()); // Execute From 6c7aecae02f1127542fd6b3706a03612a85a25ef Mon Sep 17 00:00:00 2001 From: Kristen Newbury Date: Mon, 31 Aug 2026 11:36:29 -0400 Subject: [PATCH 0604/2098] Improve wording on doc in actions/security/ControlChecks.qll --- actions/ql/lib/codeql/actions/security/ControlChecks.qll | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/actions/ql/lib/codeql/actions/security/ControlChecks.qll b/actions/ql/lib/codeql/actions/security/ControlChecks.qll index 7a5e5f455683..5bc77f154ee4 100644 --- a/actions/ql/lib/codeql/actions/security/ControlChecks.qll +++ b/actions/ql/lib/codeql/actions/security/ControlChecks.qll @@ -282,10 +282,10 @@ abstract class LabelCheck extends ControlCheck { * * It is possible to customize which deployment environments apply. The default behavior * of this model is for any environment to be considered a sanitizer. - * If values are (currently manually/externally) provided in `actions/ql/lib/ext/config/deployment_environment.yml` - * then those names will be used to define the valid sanitizer set. - * To create a default of "no default sanitizer environment" one can add an - * empty string to the data array in `deployment_environment.yml`. + * If values are provided then those names + * will be used to define the valid sanitizer set. + * To describe the situation where there is no acceptable sanitizer environment + * populate the predicate `enabledDeploymentEnvironmentDataModel` to contain a single empty string. */ class EnvironmentCheck extends ControlCheck instanceof Environment { EnvironmentCheck() { From b9559cd2ac66b05eef64fef81cf35e0f412233af Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 1 Sep 2026 00:41:10 +0000 Subject: [PATCH 0605/2098] Add changed framework coverage reports --- csharp/documentation/library-coverage/coverage.csv | 4 +++- csharp/documentation/library-coverage/coverage.rst | 6 +++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/csharp/documentation/library-coverage/coverage.csv b/csharp/documentation/library-coverage/coverage.csv index a70a91755624..1a2aceca44eb 100644 --- a/csharp/documentation/library-coverage/coverage.csv +++ b/csharp/documentation/library-coverage/coverage.csv @@ -10,9 +10,11 @@ Internal.IL,,,68,,,,,,,,,,,,,,,,,,,41,27 Internal.Pgo,,,9,,,,,,,,,,,,,,,,,,,2,7 Internal.TypeSystem,,,365,,,,,,,,,,,,,,,,,,,216,149 Microsoft.ApplicationBlocks.Data,28,,,,,,,,,,,,28,,,,,,,,,, +Microsoft.AspNet.OData,,,5,,,,,,,,,,,,,,,,,,,5, Microsoft.AspNetCore.Components,2,4,2,,,,,,,2,,,,,,,,,4,,,1,1 Microsoft.AspNetCore.Http,,,1,,,,,,,,,,,,,,,,,,,1, Microsoft.AspNetCore.Mvc,,,2,,,,,,,,,,,,,,,,,,,,2 +Microsoft.AspNetCore.OData.Deltas,,,5,,,,,,,,,,,,,,,,,,,5, Microsoft.AspNetCore.WebUtilities,,,2,,,,,,,,,,,,,,,,,,,2, Microsoft.CSharp,,,2,,,,,,,,,,,,,,,,,,,2, Microsoft.Data.SqlClient,7,,4,,,,,,,,,,7,,,,,,,,,4, @@ -44,5 +46,5 @@ NHibernate,3,,,,,,,,,,,,3,,,,,,,,,, Newtonsoft.Json,,,91,,,,,,,,,,,,,,,,,,,73,18 ServiceStack,194,,7,27,,,,,75,,,,92,,,,,,,,,7, SourceGenerators,,,5,,,,,,,,,,,,,,,,,,,,5 -System,59,48,12495,,6,5,12,,,4,1,,31,2,,6,15,17,5,3,,6382,6113 +System,59,48,12500,,6,5,12,,,4,1,,31,2,,6,15,17,5,3,,6387,6113 Windows.Security.Cryptography.Core,1,,,,,,,1,,,,,,,,,,,,,,, diff --git a/csharp/documentation/library-coverage/coverage.rst b/csharp/documentation/library-coverage/coverage.rst index f487850e54b9..a5adcad4314b 100644 --- a/csharp/documentation/library-coverage/coverage.rst +++ b/csharp/documentation/library-coverage/coverage.rst @@ -8,7 +8,7 @@ C# framework & library support Framework / library,Package,Flow sources,Taint & value steps,Sinks (total),`CWE-079` :sub:`Cross-site scripting` `ServiceStack `_,"``ServiceStack.*``, ``ServiceStack``",,7,194, - System,"``System.*``, ``System``",48,12495,59,5 - Others,"``Amazon.Lambda.APIGatewayEvents``, ``Amazon.Lambda.Core``, ``Dapper``, ``ILCompiler``, ``ILLink.RoslynAnalyzer``, ``ILLink.Shared``, ``ILLink.Tasks``, ``Internal.IL``, ``Internal.Pgo``, ``Internal.TypeSystem``, ``Microsoft.ApplicationBlocks.Data``, ``Microsoft.AspNetCore.Components``, ``Microsoft.AspNetCore.Http``, ``Microsoft.AspNetCore.Mvc``, ``Microsoft.AspNetCore.WebUtilities``, ``Microsoft.CSharp``, ``Microsoft.Data.SqlClient``, ``Microsoft.Diagnostics.Tools.Pgo``, ``Microsoft.DotNet.Build.Tasks``, ``Microsoft.DotNet.PlatformAbstractions``, ``Microsoft.EntityFrameworkCore``, ``Microsoft.Extensions.Caching.Distributed``, ``Microsoft.Extensions.Caching.Memory``, ``Microsoft.Extensions.Configuration``, ``Microsoft.Extensions.DependencyInjection``, ``Microsoft.Extensions.DependencyModel``, ``Microsoft.Extensions.Diagnostics.Metrics``, ``Microsoft.Extensions.FileProviders``, ``Microsoft.Extensions.FileSystemGlobbing``, ``Microsoft.Extensions.Hosting``, ``Microsoft.Extensions.Http``, ``Microsoft.Extensions.Logging``, ``Microsoft.Extensions.Options``, ``Microsoft.Extensions.Primitives``, ``Microsoft.Interop``, ``Microsoft.JSInterop``, ``Microsoft.NET.Build.Tasks``, ``Microsoft.VisualBasic``, ``Microsoft.Win32``, ``Mono.Linker``, ``MySql.Data.MySqlClient``, ``NHibernate``, ``Newtonsoft.Json``, ``SourceGenerators``, ``Windows.Security.Cryptography.Core``",60,2406,162,4 - Totals,,108,14908,415,9 + System,"``System.*``, ``System``",48,12500,59,5 + Others,"``Amazon.Lambda.APIGatewayEvents``, ``Amazon.Lambda.Core``, ``Dapper``, ``ILCompiler``, ``ILLink.RoslynAnalyzer``, ``ILLink.Shared``, ``ILLink.Tasks``, ``Internal.IL``, ``Internal.Pgo``, ``Internal.TypeSystem``, ``Microsoft.ApplicationBlocks.Data``, ``Microsoft.AspNet.OData``, ``Microsoft.AspNetCore.Components``, ``Microsoft.AspNetCore.Http``, ``Microsoft.AspNetCore.Mvc``, ``Microsoft.AspNetCore.OData.Deltas``, ``Microsoft.AspNetCore.WebUtilities``, ``Microsoft.CSharp``, ``Microsoft.Data.SqlClient``, ``Microsoft.Diagnostics.Tools.Pgo``, ``Microsoft.DotNet.Build.Tasks``, ``Microsoft.DotNet.PlatformAbstractions``, ``Microsoft.EntityFrameworkCore``, ``Microsoft.Extensions.Caching.Distributed``, ``Microsoft.Extensions.Caching.Memory``, ``Microsoft.Extensions.Configuration``, ``Microsoft.Extensions.DependencyInjection``, ``Microsoft.Extensions.DependencyModel``, ``Microsoft.Extensions.Diagnostics.Metrics``, ``Microsoft.Extensions.FileProviders``, ``Microsoft.Extensions.FileSystemGlobbing``, ``Microsoft.Extensions.Hosting``, ``Microsoft.Extensions.Http``, ``Microsoft.Extensions.Logging``, ``Microsoft.Extensions.Options``, ``Microsoft.Extensions.Primitives``, ``Microsoft.Interop``, ``Microsoft.JSInterop``, ``Microsoft.NET.Build.Tasks``, ``Microsoft.VisualBasic``, ``Microsoft.Win32``, ``Mono.Linker``, ``MySql.Data.MySqlClient``, ``NHibernate``, ``Newtonsoft.Json``, ``SourceGenerators``, ``Windows.Security.Cryptography.Core``",60,2416,162,4 + Totals,,108,14923,415,9 From 6202d287d8a0d30154b87e35abc93f322f6aef0a Mon Sep 17 00:00:00 2001 From: Kasper Svendsen Date: Tue, 1 Sep 2026 08:02:35 +0200 Subject: [PATCH 0606/2098] CPP: Disable dynamic reordering for AliasedSSA::isCoveredOffset --- .../cpp/ir/implementation/aliased_ssa/internal/AliasedSSA.qll | 1 + 1 file changed, 1 insertion(+) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasedSSA.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasedSSA.qll index 522cd393081e..2ace50221313 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasedSSA.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasedSSA.qll @@ -815,6 +815,7 @@ private predicate isRelatableMemoryLocation(VariableMemoryLocation vml) { vml.getStartBitOffset() != Ints::unknown() } +pragma[no_dynamic_join_order] private predicate isCoveredOffset(Allocation var, int offsetRank, VariableMemoryLocation vml) { exists(int startRank, int endRank, VirtualVariable vvar | vml.getStartBitOffset() = rank[startRank](IntValue offset_ | isRelevantOffset(vvar, offset_)) and From d0156c18f6290498c4956959e0f80275c497bf5d Mon Sep 17 00:00:00 2001 From: Jeroen Ketema <93738568+jketema@users.noreply.github.com> Date: Tue, 1 Sep 2026 06:30:18 +0000 Subject: [PATCH 0607/2098] Unified: Enable on Arm64 --- MODULE.bazel | 2 ++ unified/BUILD.bazel | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/MODULE.bazel b/MODULE.bazel index 17a6936f892c..7f15d1e889f7 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -237,11 +237,13 @@ use_repo( swift, "swift_toolchain", "swift_toolchain_ubuntu22.04", + "swift_toolchain_ubuntu22.04-aarch64", "swift_toolchain_xcode", ) register_toolchains( "@swift_toolchain//:swift_toolchain_exec_ubuntu22.04", + "@swift_toolchain//:swift_toolchain_exec_ubuntu22.04-aarch64", "@swift_toolchain//:swift_toolchain_exec_xcode", dev_dependency = True, ) diff --git a/unified/BUILD.bazel b/unified/BUILD.bazel index d17a7c505669..bde1d88a9d49 100644 --- a/unified/BUILD.bazel +++ b/unified/BUILD.bazel @@ -43,7 +43,7 @@ codeql_pkg_files( name = "extractor-arch", exes = codeql_platform_select( linux64 = ["//unified/extractor"], - linux_arm64 = ["//unified/extractor-unsupported-os:extractor"], + linux_arm64 = ["//unified/extractor"], osx64 = ["//unified/extractor"], win64 = ["//unified/extractor-unsupported-os:extractor"], ), From d3f80b65a4b0ac1441ed556669ae9a57ba65decd Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Tue, 1 Sep 2026 09:31:49 +0200 Subject: [PATCH 0608/2098] Unified: Add a debug query to view the AST as a graph. --- .../codeql/unified/internal/dev/debugAst.ql | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 unified/ql/lib/codeql/unified/internal/dev/debugAst.ql diff --git a/unified/ql/lib/codeql/unified/internal/dev/debugAst.ql b/unified/ql/lib/codeql/unified/internal/dev/debugAst.ql new file mode 100644 index 000000000000..bdd63a1750c4 --- /dev/null +++ b/unified/ql/lib/codeql/unified/internal/dev/debugAst.ql @@ -0,0 +1,50 @@ +/** + * @name Pretty print AST as graph + * @description Debug the AST by printing it as a graph. + * @id unified/debug-ast + * @kind graph + */ + +import unified + +private predicate skip(AstNode e) { e instanceof Modifier } + +AstNode getChild(AstNode n, int index) { + result.getParent() = n and + result.getParentIndex() = index and + not skip(n) and + not skip(result) +} + +predicate relevant(AstNode n) { + n.getLocation().getFile().getBaseName() = "CLI.swift" and + n.getLocation().getStartLine() = [98 .. 120] and + not skip(n) +} + +// Add additional node info here +string tag(AstNode n) { none() } + +query predicate nodes(AstNode n, string key, string val) { + key = "semmle.label" and + relevant(n) and + val = concat(string t | t = tag(n)) + " " + n.toString() +} + +// Add additional edge info here +string etag(AstNode child, AstNode parent) { + exists(string name, int i, string arg | + PrintAst::getChild(parent, name, i) = child and + result = name + arg and + if i = -1 then arg = "()" else arg = "(" + i.toString() + ")" + ) +} + +query predicate edges(AstNode pred, AstNode succ, string attr, string val) { + attr = "semmle.label" and + relevant(succ) and + exists(int i | + pred = getChild(succ, i) and + val = i + " " + concat(string t | t = etag(pred, succ) | t, ", ") + ) +} From 2a1dbdfd1ce6ff66bc244bf2a12bdd7ae2e4b32a Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 27 Aug 2026 12:54:43 +0200 Subject: [PATCH 0609/2098] Rust: Add source/sink/barrier MaD trait tests --- .../dataflow/barrier/external_file.rs | 8 + .../dataflow/barrier/inline-flow.expected | 6 + .../dataflow/barrier/inline-flow.ext.yml | 8 + .../library-tests/dataflow/barrier/main.rs | 22 + .../dataflow/models/external_file.rs | 20 + .../library-tests/dataflow/models/main.rs | 30 + .../dataflow/models/models.expected | 556 +++++++++--------- .../dataflow/models/models.ext.yml | 4 + 8 files changed, 387 insertions(+), 267 deletions(-) create mode 100644 rust/ql/test/library-tests/dataflow/barrier/external_file.rs diff --git a/rust/ql/test/library-tests/dataflow/barrier/external_file.rs b/rust/ql/test/library-tests/dataflow/barrier/external_file.rs new file mode 100644 index 000000000000..8edf52027b65 --- /dev/null +++ b/rust/ql/test/library-tests/dataflow/barrier/external_file.rs @@ -0,0 +1,8 @@ +pub trait MyBarrierTrait2 { + fn sanitize2(s: &str); +} + +impl MyBarrierTrait2 for T { + // inherits model from the trait function + fn sanitize2(s: &str) {} +} diff --git a/rust/ql/test/library-tests/dataflow/barrier/inline-flow.expected b/rust/ql/test/library-tests/dataflow/barrier/inline-flow.expected index 0514da67333d..28b65bb8a68f 100644 --- a/rust/ql/test/library-tests/dataflow/barrier/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/barrier/inline-flow.expected @@ -4,6 +4,8 @@ edges | main.rs:21:13:21:21 | source(...) | main.rs:21:9:21:9 | s | provenance | | | main.rs:32:9:32:9 | s | main.rs:33:10:33:10 | s | provenance | | | main.rs:32:13:32:21 | source(...) | main.rs:32:9:32:9 | s | provenance | | +| main.rs:63:9:63:9 | s | main.rs:65:10:65:10 | s | provenance | | +| main.rs:63:13:63:21 | source(...) | main.rs:63:9:63:9 | s | provenance | | nodes | main.rs:17:10:17:18 | source(...) | semmle.label | source(...) | | main.rs:21:9:21:9 | s | semmle.label | s | @@ -12,9 +14,13 @@ nodes | main.rs:32:9:32:9 | s | semmle.label | s | | main.rs:32:13:32:21 | source(...) | semmle.label | source(...) | | main.rs:33:10:33:10 | s | semmle.label | s | +| main.rs:63:9:63:9 | s | semmle.label | s | +| main.rs:63:13:63:21 | source(...) | semmle.label | source(...) | +| main.rs:65:10:65:10 | s | semmle.label | s | subpaths testFailures #select | main.rs:17:10:17:18 | source(...) | main.rs:17:10:17:18 | source(...) | main.rs:17:10:17:18 | source(...) | $@ | main.rs:17:10:17:18 | source(...) | source(...) | | main.rs:22:10:22:10 | s | main.rs:21:13:21:21 | source(...) | main.rs:22:10:22:10 | s | $@ | main.rs:21:13:21:21 | source(...) | source(...) | | main.rs:33:10:33:10 | s | main.rs:32:13:32:21 | source(...) | main.rs:33:10:33:10 | s | $@ | main.rs:32:13:32:21 | source(...) | source(...) | +| main.rs:65:10:65:10 | s | main.rs:63:13:63:21 | source(...) | main.rs:65:10:65:10 | s | $@ | main.rs:63:13:63:21 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/barrier/inline-flow.ext.yml b/rust/ql/test/library-tests/dataflow/barrier/inline-flow.ext.yml index 58e55a040d21..090db71d51f9 100644 --- a/rust/ql/test/library-tests/dataflow/barrier/inline-flow.ext.yml +++ b/rust/ql/test/library-tests/dataflow/barrier/inline-flow.ext.yml @@ -4,8 +4,16 @@ extensions: extensible: barrierModel data: - ["main::sanitize", "ReturnValue", "test-barrier", "manual"] + - ["::sanitize2", "Argument[0]", "test-barrier", "manual"] + - ["<_ as main::MyBarrierTrait3>::sanitize3", "Argument[0]", "test-barrier", "manual"] - addsTo: pack: codeql/rust-all extensible: barrierGuardModel data: - ["main::verify_safe", "Argument[0]", "true", "test-barrier", "manual"] + - addsTo: + pack: codeql/rust-all + extensible: additionalExternalFile + data: + - ["external_file.rs"] + diff --git a/rust/ql/test/library-tests/dataflow/barrier/main.rs b/rust/ql/test/library-tests/dataflow/barrier/main.rs index 268a8673bc9b..7c186f0feb28 100644 --- a/rust/ql/test/library-tests/dataflow/barrier/main.rs +++ b/rust/ql/test/library-tests/dataflow/barrier/main.rs @@ -46,3 +46,25 @@ fn with_barrier_guard() { sink(s); } } + +mod external_file; +use external_file::*; + +trait MyBarrierTrait3 { + fn sanitize3(s: &str); +} + +impl MyBarrierTrait3 for T { + // has an explicit model + fn sanitize3(s: &str) {} +} + +fn with_trait_barriers() { + let s = source(2); + <()>::sanitize2(s); + sink(s); // $ SPURIOUS: hasValueFlow=2 + + let s = source(3); + <()>::sanitize3(s); + sink(s); +} diff --git a/rust/ql/test/library-tests/dataflow/models/external_file.rs b/rust/ql/test/library-tests/dataflow/models/external_file.rs index 044150eb8ee2..6a45ab80c0f8 100644 --- a/rust/ql/test/library-tests/dataflow/models/external_file.rs +++ b/rust/ql/test/library-tests/dataflow/models/external_file.rs @@ -38,3 +38,23 @@ impl MyTrait2 for T { 0 } } + +pub trait MySourceTrait2 { + fn produce2(i: i64) -> i64; +} + +impl MySourceTrait2 for T { + // inherits model from the trait function + fn produce2(i: i64) -> i64 { + 0 + } +} + +pub trait MySinkTrait2 { + fn consume2(i: i64); +} + +impl MySinkTrait2 for T { + // inherits model from the trait function + fn consume2(i: i64) {} +} diff --git a/rust/ql/test/library-tests/dataflow/models/main.rs b/rust/ql/test/library-tests/dataflow/models/main.rs index d7ca16d2b1f5..a9c6d6c9c409 100644 --- a/rust/ql/test/library-tests/dataflow/models/main.rs +++ b/rust/ql/test/library-tests/dataflow/models/main.rs @@ -471,6 +471,26 @@ impl MyTrait3 for T { } } +trait MySourceTrait3 { + fn produce3(i: i64) -> i64; +} + +impl MySourceTrait3 for T { + // has an explicit model + fn produce3(i: i64) -> i64 { + 0 + } +} + +trait MySinkTrait3 { + fn consume3(i: i64); +} + +impl MySinkTrait3 for T { + // has an explicit model + fn consume3(i: i64) {} +} + fn test_trait_model(x: T) { let x1 = source(20).max(0); sink(x1); // $ hasValueFlow=20 @@ -505,6 +525,16 @@ fn test_trait_model(x: T) { let x9 = <()>::flow_through3(source(30)); sink(x9); // $ hasValueFlow=30 + + let x10 = <()>::produce2(31); + sink(x10); // $ MISSING: hasValueFlow=31 + + let x11 = <()>::produce3(32); + sink(x11); // $ hasValueFlow=32 + + <()>::consume2(source(33)); // $ MISSING: hasValueFlow=33 + + <()>::consume3(source(34)); // $ hasValueFlow=34 } mod external_file; diff --git a/rust/ql/test/library-tests/dataflow/models/models.expected b/rust/ql/test/library-tests/dataflow/models/models.expected index e9f7bd86efd8..050ff912293a 100644 --- a/rust/ql/test/library-tests/dataflow/models/models.expected +++ b/rust/ql/test/library-tests/dataflow/models/models.expected @@ -1,44 +1,46 @@ models -| 1 | Sink: ::sink; Argument[self].Field[main::MyFieldEnum::D::field_d]; test-sink | -| 2 | Sink: main::enum_sink; Argument[0].Field[main::MyFieldEnum::C::field_c]; test-sink | -| 3 | Sink: main::enum_sink_nested; Argument[0].Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-sink | -| 4 | Sink: main::external_file::generated_sink; Argument[0]; test-sink | -| 5 | Sink: main::external_file::neutral_manual_sink; Argument[0]; test-sink | -| 6 | Sink: main::simple_sink; Argument[0]; test-sink | -| 7 | Sink: main::sink_out_of_function::pass_sink; Argument[0].ReturnValue; test-sink | -| 8 | Sink: main::sink_out_of_function::pass_sink_nested; Argument[0].ReturnValue.Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-sink | -| 9 | Source: ::source; ReturnValue.Field[main::MyFieldEnum::C::field_c]; test-source | -| 10 | Source: ::test_param_source; Parameter[0]; test-source | -| 11 | Source: main::arg_source; Argument[0]; test-source | -| 12 | Source: main::enum_source; ReturnValue.Field[main::MyFieldEnum::D::field_d]; test-source | -| 13 | Source: main::enum_source_nested; ReturnValue.Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-source | -| 14 | Source: main::external_file::generated_source; ReturnValue; test-source | -| 15 | Source: main::external_file::neutral_manual_source; ReturnValue; test-source | -| 16 | Source: main::simple_source; ReturnValue; test-source | -| 17 | Source: main::source_into_function::pass_source; Argument[1].Parameter[0]; test-source | -| 18 | Source: main::source_into_function::pass_source_nested; Argument[1].Parameter[0].Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-source | -| 19 | Summary: <_ as main::MyTrait3>::flow_through3; Argument[0]; ReturnValue; value | -| 20 | Summary: ::max; Argument[self,0]; ReturnValue; value | -| 21 | Summary: ::lt; Argument[self].Reference; ReturnValue; taint | -| 22 | Summary: ::index; Argument[self].Reference.Element; ReturnValue.Reference; value | -| 23 | Summary: ::flow_through2; Argument[0]; ReturnValue; value | -| 24 | Summary: main::apply; Argument[0]; Argument[1].Parameter[0]; value | -| 25 | Summary: main::apply; Argument[1].ReturnValue; ReturnValue; value | -| 26 | Summary: main::coerce; Argument[0]; ReturnValue; taint | -| 27 | Summary: main::external_file::generated_summary; Argument[0]; ReturnValue; value | -| 28 | Summary: main::external_file::neutral_manual_summary; Argument[0]; ReturnValue; value | -| 29 | Summary: main::get_array_element; Argument[0].Element; ReturnValue; value | -| 30 | Summary: main::get_async_number; Argument[0]; ReturnValue.Future; value | -| 31 | Summary: main::get_struct_field; Argument[0].Field[main::MyStruct::field1]; ReturnValue; value | -| 32 | Summary: main::get_tuple_element; Argument[0].Field[0]; ReturnValue; value | -| 33 | Summary: main::get_var_field; Argument[0].Field[main::MyFieldEnum::C::field_c]; ReturnValue; value | -| 34 | Summary: main::get_var_pos; Argument[0].Field[main::MyPosEnum::A(0)]; ReturnValue; value | -| 35 | Summary: main::set_array_element; Argument[0]; ReturnValue.Element; value | -| 36 | Summary: main::set_struct_field; Argument[0]; ReturnValue.Field[main::MyStruct::field2]; value | -| 37 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value | -| 38 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value | -| 39 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value | -| 40 | Summary: main::snd; Argument[1]; ReturnValue; value | +| 1 | Sink: <_ as main::MySinkTrait3>::consume3; Argument[0]; test-sink | +| 2 | Sink: ::sink; Argument[self].Field[main::MyFieldEnum::D::field_d]; test-sink | +| 3 | Sink: main::enum_sink; Argument[0].Field[main::MyFieldEnum::C::field_c]; test-sink | +| 4 | Sink: main::enum_sink_nested; Argument[0].Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-sink | +| 5 | Sink: main::external_file::generated_sink; Argument[0]; test-sink | +| 6 | Sink: main::external_file::neutral_manual_sink; Argument[0]; test-sink | +| 7 | Sink: main::simple_sink; Argument[0]; test-sink | +| 8 | Sink: main::sink_out_of_function::pass_sink; Argument[0].ReturnValue; test-sink | +| 9 | Sink: main::sink_out_of_function::pass_sink_nested; Argument[0].ReturnValue.Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-sink | +| 10 | Source: <_ as main::MySourceTrait3>::produce3; ReturnValue; test-source | +| 11 | Source: ::source; ReturnValue.Field[main::MyFieldEnum::C::field_c]; test-source | +| 12 | Source: ::test_param_source; Parameter[0]; test-source | +| 13 | Source: main::arg_source; Argument[0]; test-source | +| 14 | Source: main::enum_source; ReturnValue.Field[main::MyFieldEnum::D::field_d]; test-source | +| 15 | Source: main::enum_source_nested; ReturnValue.Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-source | +| 16 | Source: main::external_file::generated_source; ReturnValue; test-source | +| 17 | Source: main::external_file::neutral_manual_source; ReturnValue; test-source | +| 18 | Source: main::simple_source; ReturnValue; test-source | +| 19 | Source: main::source_into_function::pass_source; Argument[1].Parameter[0]; test-source | +| 20 | Source: main::source_into_function::pass_source_nested; Argument[1].Parameter[0].Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-source | +| 21 | Summary: <_ as main::MyTrait3>::flow_through3; Argument[0]; ReturnValue; value | +| 22 | Summary: ::max; Argument[self,0]; ReturnValue; value | +| 23 | Summary: ::lt; Argument[self].Reference; ReturnValue; taint | +| 24 | Summary: ::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 25 | Summary: ::flow_through2; Argument[0]; ReturnValue; value | +| 26 | Summary: main::apply; Argument[0]; Argument[1].Parameter[0]; value | +| 27 | Summary: main::apply; Argument[1].ReturnValue; ReturnValue; value | +| 28 | Summary: main::coerce; Argument[0]; ReturnValue; taint | +| 29 | Summary: main::external_file::generated_summary; Argument[0]; ReturnValue; value | +| 30 | Summary: main::external_file::neutral_manual_summary; Argument[0]; ReturnValue; value | +| 31 | Summary: main::get_array_element; Argument[0].Element; ReturnValue; value | +| 32 | Summary: main::get_async_number; Argument[0]; ReturnValue.Future; value | +| 33 | Summary: main::get_struct_field; Argument[0].Field[main::MyStruct::field1]; ReturnValue; value | +| 34 | Summary: main::get_tuple_element; Argument[0].Field[0]; ReturnValue; value | +| 35 | Summary: main::get_var_field; Argument[0].Field[main::MyFieldEnum::C::field_c]; ReturnValue; value | +| 36 | Summary: main::get_var_pos; Argument[0].Field[main::MyPosEnum::A(0)]; ReturnValue; value | +| 37 | Summary: main::set_array_element; Argument[0]; ReturnValue.Element; value | +| 38 | Summary: main::set_struct_field; Argument[0]; ReturnValue.Field[main::MyStruct::field2]; value | +| 39 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value | +| 40 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value | +| 41 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value | +| 42 | Summary: main::snd; Argument[1]; ReturnValue; value | edges | main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | | | main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | | @@ -48,13 +50,13 @@ edges | main.rs:16:19:16:19 | s | main.rs:16:10:16:20 | identity(...) | provenance | QL | | main.rs:25:9:25:9 | s | main.rs:26:17:26:17 | s | provenance | | | main.rs:25:13:25:22 | source(...) | main.rs:25:9:25:9 | s | provenance | | -| main.rs:26:17:26:17 | s | main.rs:26:10:26:18 | coerce(...) | provenance | MaD:26 | +| main.rs:26:17:26:17 | s | main.rs:26:10:26:18 | coerce(...) | provenance | MaD:28 | | main.rs:41:9:41:10 | s1 | main.rs:42:17:42:18 | s1 | provenance | | | main.rs:41:9:41:10 | s1 | main.rs:42:17:42:18 | s1 | provenance | | | main.rs:41:14:41:23 | source(...) | main.rs:41:9:41:10 | s1 | provenance | | | main.rs:41:14:41:23 | source(...) | main.rs:41:9:41:10 | s1 | provenance | | -| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:40 | -| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:40 | +| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:42 | +| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:42 | | main.rs:54:9:54:9 | s | main.rs:55:27:55:27 | s | provenance | | | main.rs:54:9:54:9 | s | main.rs:55:27:55:27 | s | provenance | | | main.rs:54:13:54:21 | source(...) | main.rs:54:9:54:9 | s | provenance | | @@ -65,8 +67,8 @@ edges | main.rs:55:14:55:28 | ...::A(...) [A] | main.rs:55:9:55:10 | e1 [A] | provenance | | | main.rs:55:27:55:27 | s | main.rs:55:14:55:28 | ...::A(...) [A] | provenance | | | main.rs:55:27:55:27 | s | main.rs:55:14:55:28 | ...::A(...) [A] | provenance | | -| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:34 | -| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:34 | +| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:36 | +| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:36 | | main.rs:67:9:67:9 | s | main.rs:68:26:68:26 | s | provenance | | | main.rs:67:9:67:9 | s | main.rs:68:26:68:26 | s | provenance | | | main.rs:67:13:67:21 | source(...) | main.rs:67:9:67:9 | s | provenance | | @@ -75,8 +77,8 @@ edges | main.rs:68:9:68:10 | e1 [B] | main.rs:69:11:69:12 | e1 [B] | provenance | | | main.rs:68:14:68:27 | set_var_pos(...) [B] | main.rs:68:9:68:10 | e1 [B] | provenance | | | main.rs:68:14:68:27 | set_var_pos(...) [B] | main.rs:68:9:68:10 | e1 [B] | provenance | | -| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:39 | -| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:39 | +| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:41 | +| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:41 | | main.rs:69:11:69:12 | e1 [B] | main.rs:71:9:71:23 | ...::B(...) [B] | provenance | | | main.rs:69:11:69:12 | e1 [B] | main.rs:71:9:71:23 | ...::B(...) [B] | provenance | | | main.rs:71:9:71:23 | ...::B(...) [B] | main.rs:71:22:71:22 | i | provenance | | @@ -93,8 +95,8 @@ edges | main.rs:88:14:88:42 | ...::C {...} [C] | main.rs:88:9:88:10 | e1 [C] | provenance | | | main.rs:88:40:88:40 | s | main.rs:88:14:88:42 | ...::C {...} [C] | provenance | | | main.rs:88:40:88:40 | s | main.rs:88:14:88:42 | ...::C {...} [C] | provenance | | -| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:33 | -| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:33 | +| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:35 | +| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:35 | | main.rs:100:9:100:9 | s | main.rs:101:28:101:28 | s | provenance | | | main.rs:100:9:100:9 | s | main.rs:101:28:101:28 | s | provenance | | | main.rs:100:13:100:21 | source(...) | main.rs:100:9:100:9 | s | provenance | | @@ -103,8 +105,8 @@ edges | main.rs:101:9:101:10 | e1 [D] | main.rs:102:11:102:12 | e1 [D] | provenance | | | main.rs:101:14:101:29 | set_var_field(...) [D] | main.rs:101:9:101:10 | e1 [D] | provenance | | | main.rs:101:14:101:29 | set_var_field(...) [D] | main.rs:101:9:101:10 | e1 [D] | provenance | | -| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:38 | -| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:38 | +| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:40 | +| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:40 | | main.rs:102:11:102:12 | e1 [D] | main.rs:104:9:104:37 | ...::D {...} [D] | provenance | | | main.rs:102:11:102:12 | e1 [D] | main.rs:104:9:104:37 | ...::D {...} [D] | provenance | | | main.rs:104:9:104:37 | ...::D {...} [D] | main.rs:104:35:104:35 | i | provenance | | @@ -121,8 +123,8 @@ edges | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | main.rs:121:9:121:17 | my_struct [MyStruct.field1] | provenance | | | main.rs:122:17:122:17 | s | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | provenance | | | main.rs:122:17:122:17 | s | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | provenance | | -| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:31 | -| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:31 | +| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:33 | +| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:33 | | main.rs:142:9:142:9 | s | main.rs:143:38:143:38 | s | provenance | | | main.rs:142:9:142:9 | s | main.rs:143:38:143:38 | s | provenance | | | main.rs:142:13:142:21 | source(...) | main.rs:142:9:142:9 | s | provenance | | @@ -131,16 +133,16 @@ edges | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | provenance | | | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | provenance | | | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | provenance | | -| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:36 | -| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:36 | +| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:38 | +| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:38 | | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | main.rs:145:10:145:25 | my_struct.field2 | provenance | | | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | main.rs:145:10:145:25 | my_struct.field2 | provenance | | | main.rs:154:9:154:9 | s | main.rs:155:29:155:29 | s | provenance | | | main.rs:154:9:154:9 | s | main.rs:155:29:155:29 | s | provenance | | | main.rs:154:13:154:21 | source(...) | main.rs:154:9:154:9 | s | provenance | | | main.rs:154:13:154:21 | source(...) | main.rs:154:9:154:9 | s | provenance | | -| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:29 | -| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:29 | +| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:31 | +| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:31 | | main.rs:155:29:155:29 | s | main.rs:155:28:155:30 | [...] [element] | provenance | | | main.rs:155:29:155:29 | s | main.rs:155:28:155:30 | [...] [element] | provenance | | | main.rs:164:9:164:9 | s | main.rs:165:33:165:33 | s | provenance | | @@ -151,10 +153,10 @@ edges | main.rs:165:9:165:11 | arr [element] | main.rs:166:10:166:12 | arr [element] | provenance | | | main.rs:165:15:165:34 | set_array_element(...) [element] | main.rs:165:9:165:11 | arr [element] | provenance | | | main.rs:165:15:165:34 | set_array_element(...) [element] | main.rs:165:9:165:11 | arr [element] | provenance | | -| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:35 | -| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:35 | -| main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:22 | -| main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:22 | +| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:37 | +| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:37 | +| main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:24 | +| main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:24 | | main.rs:175:9:175:9 | s | main.rs:176:14:176:14 | s | provenance | | | main.rs:175:9:175:9 | s | main.rs:176:14:176:14 | s | provenance | | | main.rs:175:13:175:22 | source(...) | main.rs:175:9:175:9 | s | provenance | | @@ -165,8 +167,8 @@ edges | main.rs:176:13:176:18 | TupleExpr [tuple.0] | main.rs:176:9:176:9 | t [tuple.0] | provenance | | | main.rs:176:14:176:14 | s | main.rs:176:13:176:18 | TupleExpr [tuple.0] | provenance | | | main.rs:176:14:176:14 | s | main.rs:176:13:176:18 | TupleExpr [tuple.0] | provenance | | -| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:32 | -| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:32 | +| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:34 | +| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:34 | | main.rs:188:9:188:9 | s | main.rs:189:31:189:31 | s | provenance | | | main.rs:188:9:188:9 | s | main.rs:189:31:189:31 | s | provenance | | | main.rs:188:13:188:22 | source(...) | main.rs:188:9:188:9 | s | provenance | | @@ -175,8 +177,8 @@ edges | main.rs:189:9:189:9 | t [tuple.1] | main.rs:191:10:191:10 | t [tuple.1] | provenance | | | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | main.rs:189:9:189:9 | t [tuple.1] | provenance | | | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | main.rs:189:9:189:9 | t [tuple.1] | provenance | | -| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:37 | -| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:37 | +| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:39 | +| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:39 | | main.rs:191:10:191:10 | t [tuple.1] | main.rs:191:10:191:12 | t.1 | provenance | | | main.rs:191:10:191:10 | t [tuple.1] | main.rs:191:10:191:12 | t.1 | provenance | | | main.rs:203:9:203:9 | s | main.rs:208:11:208:11 | s | provenance | | @@ -185,8 +187,8 @@ edges | main.rs:203:13:203:22 | source(...) | main.rs:203:9:203:9 | s | provenance | | | main.rs:204:14:204:14 | ... | main.rs:205:14:205:14 | n | provenance | | | main.rs:204:14:204:14 | ... | main.rs:205:14:205:14 | n | provenance | | -| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:24 | -| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:24 | +| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:26 | +| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:26 | | main.rs:212:13:212:22 | source(...) | main.rs:214:23:214:23 | f [captured s] | provenance | | | main.rs:212:13:212:22 | source(...) | main.rs:214:23:214:23 | f [captured s] | provenance | | | main.rs:213:40:213:40 | s | main.rs:213:17:213:42 | if ... {...} else {...} | provenance | | @@ -195,14 +197,14 @@ edges | main.rs:214:9:214:9 | t | main.rs:215:10:215:10 | t | provenance | | | main.rs:214:13:214:24 | apply(...) | main.rs:214:9:214:9 | t | provenance | | | main.rs:214:13:214:24 | apply(...) | main.rs:214:9:214:9 | t | provenance | | -| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:24 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:24 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:25 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:25 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:24 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:24 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:25 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:25 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:26 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:26 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:27 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:27 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:26 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:26 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:27 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:27 | | main.rs:219:9:219:9 | s | main.rs:221:19:221:19 | s | provenance | | | main.rs:219:9:219:9 | s | main.rs:221:19:221:19 | s | provenance | | | main.rs:219:13:219:22 | source(...) | main.rs:219:9:219:9 | s | provenance | | @@ -213,10 +215,10 @@ edges | main.rs:221:9:221:9 | t | main.rs:222:10:222:10 | t | provenance | | | main.rs:221:13:221:23 | apply(...) | main.rs:221:9:221:9 | t | provenance | | | main.rs:221:13:221:23 | apply(...) | main.rs:221:9:221:9 | t | provenance | | -| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | provenance | MaD:24 | -| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | provenance | MaD:24 | -| main.rs:221:19:221:19 | s | main.rs:221:13:221:23 | apply(...) | provenance | MaD:24 | -| main.rs:221:19:221:19 | s | main.rs:221:13:221:23 | apply(...) | provenance | MaD:24 | +| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | provenance | MaD:26 | +| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | provenance | MaD:26 | +| main.rs:221:19:221:19 | s | main.rs:221:13:221:23 | apply(...) | provenance | MaD:26 | +| main.rs:221:19:221:19 | s | main.rs:221:13:221:23 | apply(...) | provenance | MaD:26 | | main.rs:231:9:231:9 | s | main.rs:232:30:232:30 | s | provenance | | | main.rs:231:9:231:9 | s | main.rs:232:30:232:30 | s | provenance | | | main.rs:231:13:231:22 | source(...) | main.rs:231:9:231:9 | s | provenance | | @@ -227,12 +229,12 @@ edges | main.rs:232:13:232:31 | get_async_number(...) [future] | main.rs:232:13:232:37 | await ... | provenance | | | main.rs:232:13:232:37 | await ... | main.rs:232:9:232:9 | t | provenance | | | main.rs:232:13:232:37 | await ... | main.rs:232:9:232:9 | t | provenance | | -| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:30 | -| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:30 | +| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:32 | +| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:32 | | main.rs:257:9:257:9 | s [D] | main.rs:258:11:258:11 | s [D] | provenance | | | main.rs:257:9:257:9 | s [D] | main.rs:258:11:258:11 | s [D] | provenance | | -| main.rs:257:13:257:27 | enum_source(...) | main.rs:257:9:257:9 | s [D] | provenance | Src:MaD:12 | -| main.rs:257:13:257:27 | enum_source(...) | main.rs:257:9:257:9 | s [D] | provenance | Src:MaD:12 | +| main.rs:257:13:257:27 | enum_source(...) | main.rs:257:9:257:9 | s [D] | provenance | Src:MaD:14 | +| main.rs:257:13:257:27 | enum_source(...) | main.rs:257:9:257:9 | s [D] | provenance | Src:MaD:14 | | main.rs:258:11:258:11 | s [D] | main.rs:260:9:260:37 | ...::D {...} [D] | provenance | | | main.rs:258:11:258:11 | s [D] | main.rs:260:9:260:37 | ...::D {...} [D] | provenance | | | main.rs:260:9:260:37 | ...::D {...} [D] | main.rs:260:35:260:35 | i | provenance | | @@ -241,8 +243,8 @@ edges | main.rs:260:35:260:35 | i | main.rs:260:47:260:47 | i | provenance | | | main.rs:264:9:264:9 | s [E, Some] | main.rs:265:11:265:11 | s [E, Some] | provenance | | | main.rs:264:9:264:9 | s [E, Some] | main.rs:265:11:265:11 | s [E, Some] | provenance | | -| main.rs:264:13:264:34 | enum_source_nested(...) | main.rs:264:9:264:9 | s [E, Some] | provenance | Src:MaD:13 | -| main.rs:264:13:264:34 | enum_source_nested(...) | main.rs:264:9:264:9 | s [E, Some] | provenance | Src:MaD:13 | +| main.rs:264:13:264:34 | enum_source_nested(...) | main.rs:264:9:264:9 | s [E, Some] | provenance | Src:MaD:15 | +| main.rs:264:13:264:34 | enum_source_nested(...) | main.rs:264:9:264:9 | s [E, Some] | provenance | Src:MaD:15 | | main.rs:265:11:265:11 | s [E, Some] | main.rs:268:9:268:37 | ...::E {...} [E, Some] | provenance | | | main.rs:265:11:265:11 | s [E, Some] | main.rs:268:9:268:37 | ...::E {...} [E, Some] | provenance | | | main.rs:268:9:268:37 | ...::E {...} [E, Some] | main.rs:268:35:268:35 | o [Some] | provenance | | @@ -257,24 +259,24 @@ edges | main.rs:270:22:270:22 | i | main.rs:270:33:270:33 | i | provenance | | | main.rs:279:9:279:9 | s [C] | main.rs:280:11:280:11 | s [C] | provenance | | | main.rs:279:9:279:9 | s [C] | main.rs:280:11:280:11 | s [C] | provenance | | -| main.rs:279:13:279:24 | e.source(...) | main.rs:279:9:279:9 | s [C] | provenance | Src:MaD:9 | -| main.rs:279:13:279:24 | e.source(...) | main.rs:279:9:279:9 | s [C] | provenance | Src:MaD:9 | +| main.rs:279:13:279:24 | e.source(...) | main.rs:279:9:279:9 | s [C] | provenance | Src:MaD:11 | +| main.rs:279:13:279:24 | e.source(...) | main.rs:279:9:279:9 | s [C] | provenance | Src:MaD:11 | | main.rs:280:11:280:11 | s [C] | main.rs:281:9:281:37 | ...::C {...} [C] | provenance | | | main.rs:280:11:280:11 | s [C] | main.rs:281:9:281:37 | ...::C {...} [C] | provenance | | | main.rs:281:9:281:37 | ...::C {...} [C] | main.rs:281:35:281:35 | i | provenance | | | main.rs:281:9:281:37 | ...::C {...} [C] | main.rs:281:35:281:35 | i | provenance | | | main.rs:281:35:281:35 | i | main.rs:281:47:281:47 | i | provenance | | | main.rs:281:35:281:35 | i | main.rs:281:47:281:47 | i | provenance | | -| main.rs:303:24:303:24 | a | main.rs:302:26:302:26 | a | provenance | Src:MaD:17 | -| main.rs:303:24:303:24 | a | main.rs:302:26:302:26 | a | provenance | Src:MaD:17 | -| main.rs:305:24:307:9 | \|...\| ... | main.rs:306:18:306:18 | a | provenance | Src:MaD:17 | -| main.rs:305:24:307:9 | \|...\| ... | main.rs:306:18:306:18 | a | provenance | Src:MaD:17 | -| main.rs:312:24:312:24 | f | main.rs:310:18:310:18 | a | provenance | Src:MaD:17 | -| main.rs:312:24:312:24 | f | main.rs:310:18:310:18 | a | provenance | Src:MaD:17 | -| main.rs:314:24:316:9 | \|...\| ... | main.rs:315:18:315:18 | a | provenance | Src:MaD:17 | -| main.rs:314:24:316:9 | \|...\| ... | main.rs:315:18:315:18 | a | provenance | Src:MaD:17 | -| main.rs:318:31:329:9 | \|...\| ... | main.rs:318:31:329:9 | \|...\| ... [E, Some] | provenance | Src:MaD:18 | -| main.rs:318:31:329:9 | \|...\| ... | main.rs:318:31:329:9 | \|...\| ... [E, Some] | provenance | Src:MaD:18 | +| main.rs:303:24:303:24 | a | main.rs:302:26:302:26 | a | provenance | Src:MaD:19 | +| main.rs:303:24:303:24 | a | main.rs:302:26:302:26 | a | provenance | Src:MaD:19 | +| main.rs:305:24:307:9 | \|...\| ... | main.rs:306:18:306:18 | a | provenance | Src:MaD:19 | +| main.rs:305:24:307:9 | \|...\| ... | main.rs:306:18:306:18 | a | provenance | Src:MaD:19 | +| main.rs:312:24:312:24 | f | main.rs:310:18:310:18 | a | provenance | Src:MaD:19 | +| main.rs:312:24:312:24 | f | main.rs:310:18:310:18 | a | provenance | Src:MaD:19 | +| main.rs:314:24:316:9 | \|...\| ... | main.rs:315:18:315:18 | a | provenance | Src:MaD:19 | +| main.rs:314:24:316:9 | \|...\| ... | main.rs:315:18:315:18 | a | provenance | Src:MaD:19 | +| main.rs:318:31:329:9 | \|...\| ... | main.rs:318:31:329:9 | \|...\| ... [E, Some] | provenance | Src:MaD:20 | +| main.rs:318:31:329:9 | \|...\| ... | main.rs:318:31:329:9 | \|...\| ... [E, Some] | provenance | Src:MaD:20 | | main.rs:318:31:329:9 | \|...\| ... [E, Some] | main.rs:319:19:319:19 | e [E, Some] | provenance | | | main.rs:318:31:329:9 | \|...\| ... [E, Some] | main.rs:319:19:319:19 | e [E, Some] | provenance | | | main.rs:319:19:319:19 | e [E, Some] | main.rs:322:17:322:45 | ...::E {...} [E, Some] | provenance | | @@ -289,8 +291,8 @@ edges | main.rs:324:25:324:31 | Some(...) [Some] | main.rs:324:30:324:30 | i | provenance | | | main.rs:324:30:324:30 | i | main.rs:324:41:324:41 | i | provenance | | | main.rs:324:30:324:30 | i | main.rs:324:41:324:41 | i | provenance | | -| main.rs:344:21:344:29 | source(...) | main.rs:345:19:345:19 | a | provenance | Sink:MaD:7 | -| main.rs:344:21:344:29 | source(...) | main.rs:345:19:345:19 | a | provenance | Sink:MaD:7 | +| main.rs:344:21:344:29 | source(...) | main.rs:345:19:345:19 | a | provenance | Sink:MaD:8 | +| main.rs:344:21:344:29 | source(...) | main.rs:345:19:345:19 | a | provenance | Sink:MaD:8 | | main.rs:348:17:348:17 | s | main.rs:350:39:350:39 | s | provenance | | | main.rs:348:17:348:17 | s | main.rs:350:39:350:39 | s | provenance | | | main.rs:348:21:348:29 | source(...) | main.rs:348:17:348:17 | s | provenance | | @@ -301,20 +303,20 @@ edges | main.rs:350:26:350:40 | ...::Some(...) [Some] | main.rs:349:13:351:13 | ...::E {...} [E, Some] | provenance | | | main.rs:350:39:350:39 | s | main.rs:350:26:350:40 | ...::Some(...) [Some] | provenance | | | main.rs:350:39:350:39 | s | main.rs:350:26:350:40 | ...::Some(...) [Some] | provenance | | -| main.rs:353:26:353:26 | b [E, Some] | main.rs:353:26:353:26 | b | provenance | Sink:MaD:8 | -| main.rs:353:26:353:26 | b [E, Some] | main.rs:353:26:353:26 | b | provenance | Sink:MaD:8 | +| main.rs:353:26:353:26 | b [E, Some] | main.rs:353:26:353:26 | b | provenance | Sink:MaD:9 | +| main.rs:353:26:353:26 | b [E, Some] | main.rs:353:26:353:26 | b | provenance | Sink:MaD:9 | | main.rs:364:9:364:9 | s | main.rs:365:41:365:41 | s | provenance | | | main.rs:364:9:364:9 | s | main.rs:365:41:365:41 | s | provenance | | | main.rs:364:9:364:9 | s | main.rs:368:53:368:53 | s | provenance | | | main.rs:364:9:364:9 | s | main.rs:368:53:368:53 | s | provenance | | | main.rs:364:13:364:22 | source(...) | main.rs:364:9:364:9 | s | provenance | | | main.rs:364:13:364:22 | source(...) | main.rs:364:9:364:9 | s | provenance | | -| main.rs:365:15:365:43 | ...::C {...} [C] | main.rs:365:15:365:43 | ...::C {...} | provenance | Sink:MaD:2 | -| main.rs:365:15:365:43 | ...::C {...} [C] | main.rs:365:15:365:43 | ...::C {...} | provenance | Sink:MaD:2 | +| main.rs:365:15:365:43 | ...::C {...} [C] | main.rs:365:15:365:43 | ...::C {...} | provenance | Sink:MaD:3 | +| main.rs:365:15:365:43 | ...::C {...} [C] | main.rs:365:15:365:43 | ...::C {...} | provenance | Sink:MaD:3 | | main.rs:365:41:365:41 | s | main.rs:365:15:365:43 | ...::C {...} [C] | provenance | | | main.rs:365:41:365:41 | s | main.rs:365:15:365:43 | ...::C {...} [C] | provenance | | -| main.rs:368:22:368:56 | ...::E {...} [E, Some] | main.rs:368:22:368:56 | ...::E {...} | provenance | Sink:MaD:3 | -| main.rs:368:22:368:56 | ...::E {...} [E, Some] | main.rs:368:22:368:56 | ...::E {...} | provenance | Sink:MaD:3 | +| main.rs:368:22:368:56 | ...::E {...} [E, Some] | main.rs:368:22:368:56 | ...::E {...} | provenance | Sink:MaD:4 | +| main.rs:368:22:368:56 | ...::E {...} [E, Some] | main.rs:368:22:368:56 | ...::E {...} | provenance | Sink:MaD:4 | | main.rs:368:48:368:54 | Some(...) [Some] | main.rs:368:22:368:56 | ...::E {...} [E, Some] | provenance | | | main.rs:368:48:368:54 | Some(...) [Some] | main.rs:368:22:368:56 | ...::E {...} [E, Some] | provenance | | | main.rs:368:53:368:53 | s | main.rs:368:48:368:54 | Some(...) [Some] | provenance | | @@ -323,76 +325,82 @@ edges | main.rs:372:9:372:9 | s | main.rs:373:39:373:39 | s | provenance | | | main.rs:372:13:372:22 | source(...) | main.rs:372:9:372:9 | s | provenance | | | main.rs:372:13:372:22 | source(...) | main.rs:372:9:372:9 | s | provenance | | -| main.rs:373:9:373:9 | e [D] | main.rs:374:5:374:5 | e | provenance | Sink:MaD:1 | -| main.rs:373:9:373:9 | e [D] | main.rs:374:5:374:5 | e | provenance | Sink:MaD:1 | +| main.rs:373:9:373:9 | e [D] | main.rs:374:5:374:5 | e | provenance | Sink:MaD:2 | +| main.rs:373:9:373:9 | e [D] | main.rs:374:5:374:5 | e | provenance | Sink:MaD:2 | | main.rs:373:13:373:41 | ...::D {...} [D] | main.rs:373:9:373:9 | e [D] | provenance | | | main.rs:373:13:373:41 | ...::D {...} [D] | main.rs:373:9:373:9 | e [D] | provenance | | | main.rs:373:39:373:39 | s | main.rs:373:13:373:41 | ...::D {...} [D] | provenance | | | main.rs:373:39:373:39 | s | main.rs:373:13:373:41 | ...::D {...} [D] | provenance | | | main.rs:383:9:383:9 | s | main.rs:384:10:384:10 | s | provenance | | | main.rs:383:9:383:9 | s | main.rs:384:10:384:10 | s | provenance | | -| main.rs:383:13:383:29 | simple_source(...) | main.rs:383:9:383:9 | s | provenance | Src:MaD:16 | -| main.rs:383:13:383:29 | simple_source(...) | main.rs:383:9:383:9 | s | provenance | Src:MaD:16 | -| main.rs:391:9:391:9 | s | main.rs:392:17:392:17 | s | provenance | Sink:MaD:6 | -| main.rs:391:9:391:9 | s | main.rs:392:17:392:17 | s | provenance | Sink:MaD:6 | +| main.rs:383:13:383:29 | simple_source(...) | main.rs:383:9:383:9 | s | provenance | Src:MaD:18 | +| main.rs:383:13:383:29 | simple_source(...) | main.rs:383:9:383:9 | s | provenance | Src:MaD:18 | +| main.rs:391:9:391:9 | s | main.rs:392:17:392:17 | s | provenance | Sink:MaD:7 | +| main.rs:391:9:391:9 | s | main.rs:392:17:392:17 | s | provenance | Sink:MaD:7 | | main.rs:391:13:391:22 | source(...) | main.rs:391:9:391:9 | s | provenance | | | main.rs:391:13:391:22 | source(...) | main.rs:391:9:391:9 | s | provenance | | -| main.rs:400:16:400:16 | i | main.rs:401:10:401:10 | i | provenance | Src:MaD:11 | -| main.rs:400:16:400:16 | i | main.rs:401:10:401:10 | i | provenance | Src:MaD:11 | -| main.rs:410:26:410:31 | ...: i64 | main.rs:411:14:411:14 | i | provenance | Src:MaD:10 | -| main.rs:410:26:410:31 | ...: i64 | main.rs:411:14:411:14 | i | provenance | Src:MaD:10 | -| main.rs:475:9:475:10 | x1 | main.rs:476:10:476:11 | x1 | provenance | | -| main.rs:475:9:475:10 | x1 | main.rs:476:10:476:11 | x1 | provenance | | -| main.rs:475:14:475:23 | source(...) | main.rs:475:14:475:30 | ... .max(...) | provenance | MaD:20 | -| main.rs:475:14:475:23 | source(...) | main.rs:475:14:475:30 | ... .max(...) | provenance | MaD:20 | -| main.rs:475:14:475:30 | ... .max(...) | main.rs:475:9:475:10 | x1 | provenance | | -| main.rs:475:14:475:30 | ... .max(...) | main.rs:475:9:475:10 | x1 | provenance | | -| main.rs:478:9:478:10 | x2 [MyStruct.field1] | main.rs:486:10:486:11 | x2 [MyStruct.field1] | provenance | | -| main.rs:478:9:478:10 | x2 [MyStruct.field1] | main.rs:486:10:486:11 | x2 [MyStruct.field1] | provenance | | -| main.rs:478:14:485:6 | ... .max(...) [MyStruct.field1] | main.rs:478:9:478:10 | x2 [MyStruct.field1] | provenance | | -| main.rs:478:14:485:6 | ... .max(...) [MyStruct.field1] | main.rs:478:9:478:10 | x2 [MyStruct.field1] | provenance | | -| main.rs:478:15:481:5 | MyStruct {...} [MyStruct.field1] | main.rs:478:14:485:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:20 | -| main.rs:478:15:481:5 | MyStruct {...} [MyStruct.field1] | main.rs:478:14:485:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:20 | -| main.rs:479:17:479:26 | source(...) | main.rs:478:15:481:5 | MyStruct {...} [MyStruct.field1] | provenance | | -| main.rs:479:17:479:26 | source(...) | main.rs:478:15:481:5 | MyStruct {...} [MyStruct.field1] | provenance | | -| main.rs:486:10:486:11 | x2 [MyStruct.field1] | main.rs:486:10:486:18 | x2.field1 | provenance | | -| main.rs:486:10:486:11 | x2 [MyStruct.field1] | main.rs:486:10:486:18 | x2.field1 | provenance | | -| main.rs:491:9:491:10 | x4 | main.rs:492:10:492:11 | x4 | provenance | | -| main.rs:491:9:491:10 | x4 | main.rs:492:10:492:11 | x4 | provenance | | -| main.rs:491:14:491:23 | source(...) | main.rs:491:14:491:30 | ... .max(...) | provenance | MaD:20 | -| main.rs:491:14:491:23 | source(...) | main.rs:491:14:491:30 | ... .max(...) | provenance | MaD:20 | -| main.rs:491:14:491:30 | ... .max(...) | main.rs:491:9:491:10 | x4 | provenance | | -| main.rs:491:14:491:30 | ... .max(...) | main.rs:491:9:491:10 | x4 | provenance | | -| main.rs:494:9:494:10 | x5 | main.rs:495:10:495:11 | x5 | provenance | | -| main.rs:494:14:494:23 | source(...) | main.rs:494:14:494:30 | ... .lt(...) | provenance | MaD:21 | -| main.rs:494:14:494:30 | ... .lt(...) | main.rs:494:9:494:10 | x5 | provenance | | -| main.rs:497:9:497:10 | x6 | main.rs:498:10:498:11 | x6 | provenance | | -| main.rs:497:14:497:23 | source(...) | main.rs:497:14:497:27 | ... < ... | provenance | MaD:21 | -| main.rs:497:14:497:27 | ... < ... | main.rs:497:9:497:10 | x6 | provenance | | -| main.rs:503:9:503:10 | x8 | main.rs:504:10:504:11 | x8 | provenance | | -| main.rs:503:9:503:10 | x8 | main.rs:504:10:504:11 | x8 | provenance | | -| main.rs:503:14:503:44 | ...::flow_through2(...) | main.rs:503:9:503:10 | x8 | provenance | | -| main.rs:503:14:503:44 | ...::flow_through2(...) | main.rs:503:9:503:10 | x8 | provenance | | -| main.rs:503:34:503:43 | source(...) | main.rs:503:14:503:44 | ...::flow_through2(...) | provenance | MaD:23 | -| main.rs:503:34:503:43 | source(...) | main.rs:503:14:503:44 | ...::flow_through2(...) | provenance | MaD:23 | -| main.rs:506:9:506:10 | x9 | main.rs:507:10:507:11 | x9 | provenance | | -| main.rs:506:9:506:10 | x9 | main.rs:507:10:507:11 | x9 | provenance | | -| main.rs:506:14:506:44 | ...::flow_through3(...) | main.rs:506:9:506:10 | x9 | provenance | | -| main.rs:506:14:506:44 | ...::flow_through3(...) | main.rs:506:9:506:10 | x9 | provenance | | -| main.rs:506:34:506:43 | source(...) | main.rs:506:14:506:44 | ...::flow_through3(...) | provenance | MaD:19 | -| main.rs:506:34:506:43 | source(...) | main.rs:506:14:506:44 | ...::flow_through3(...) | provenance | MaD:19 | -| main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | provenance | Src:MaD:14 | -| main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | provenance | Src:MaD:14 | -| main.rs:521:10:521:33 | neutral_manual_source(...) | main.rs:521:10:521:33 | neutral_manual_source(...) | provenance | Src:MaD:15 | -| main.rs:521:10:521:33 | neutral_manual_source(...) | main.rs:521:10:521:33 | neutral_manual_source(...) | provenance | Src:MaD:15 | -| main.rs:522:20:522:28 | source(...) | main.rs:522:20:522:28 | source(...) | provenance | Sink:MaD:4 | -| main.rs:522:20:522:28 | source(...) | main.rs:522:20:522:28 | source(...) | provenance | Sink:MaD:4 | -| main.rs:524:25:524:33 | source(...) | main.rs:524:25:524:33 | source(...) | provenance | Sink:MaD:5 | -| main.rs:524:25:524:33 | source(...) | main.rs:524:25:524:33 | source(...) | provenance | Sink:MaD:5 | -| main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | provenance | MaD:27 | -| main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | provenance | MaD:27 | -| main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | provenance | MaD:28 | -| main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | provenance | MaD:28 | +| main.rs:400:16:400:16 | i | main.rs:401:10:401:10 | i | provenance | Src:MaD:13 | +| main.rs:400:16:400:16 | i | main.rs:401:10:401:10 | i | provenance | Src:MaD:13 | +| main.rs:410:26:410:31 | ...: i64 | main.rs:411:14:411:14 | i | provenance | Src:MaD:12 | +| main.rs:410:26:410:31 | ...: i64 | main.rs:411:14:411:14 | i | provenance | Src:MaD:12 | +| main.rs:495:9:495:10 | x1 | main.rs:496:10:496:11 | x1 | provenance | | +| main.rs:495:9:495:10 | x1 | main.rs:496:10:496:11 | x1 | provenance | | +| main.rs:495:14:495:23 | source(...) | main.rs:495:14:495:30 | ... .max(...) | provenance | MaD:22 | +| main.rs:495:14:495:23 | source(...) | main.rs:495:14:495:30 | ... .max(...) | provenance | MaD:22 | +| main.rs:495:14:495:30 | ... .max(...) | main.rs:495:9:495:10 | x1 | provenance | | +| main.rs:495:14:495:30 | ... .max(...) | main.rs:495:9:495:10 | x1 | provenance | | +| main.rs:498:9:498:10 | x2 [MyStruct.field1] | main.rs:506:10:506:11 | x2 [MyStruct.field1] | provenance | | +| main.rs:498:9:498:10 | x2 [MyStruct.field1] | main.rs:506:10:506:11 | x2 [MyStruct.field1] | provenance | | +| main.rs:498:14:505:6 | ... .max(...) [MyStruct.field1] | main.rs:498:9:498:10 | x2 [MyStruct.field1] | provenance | | +| main.rs:498:14:505:6 | ... .max(...) [MyStruct.field1] | main.rs:498:9:498:10 | x2 [MyStruct.field1] | provenance | | +| main.rs:498:15:501:5 | MyStruct {...} [MyStruct.field1] | main.rs:498:14:505:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:22 | +| main.rs:498:15:501:5 | MyStruct {...} [MyStruct.field1] | main.rs:498:14:505:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:22 | +| main.rs:499:17:499:26 | source(...) | main.rs:498:15:501:5 | MyStruct {...} [MyStruct.field1] | provenance | | +| main.rs:499:17:499:26 | source(...) | main.rs:498:15:501:5 | MyStruct {...} [MyStruct.field1] | provenance | | +| main.rs:506:10:506:11 | x2 [MyStruct.field1] | main.rs:506:10:506:18 | x2.field1 | provenance | | +| main.rs:506:10:506:11 | x2 [MyStruct.field1] | main.rs:506:10:506:18 | x2.field1 | provenance | | +| main.rs:511:9:511:10 | x4 | main.rs:512:10:512:11 | x4 | provenance | | +| main.rs:511:9:511:10 | x4 | main.rs:512:10:512:11 | x4 | provenance | | +| main.rs:511:14:511:23 | source(...) | main.rs:511:14:511:30 | ... .max(...) | provenance | MaD:22 | +| main.rs:511:14:511:23 | source(...) | main.rs:511:14:511:30 | ... .max(...) | provenance | MaD:22 | +| main.rs:511:14:511:30 | ... .max(...) | main.rs:511:9:511:10 | x4 | provenance | | +| main.rs:511:14:511:30 | ... .max(...) | main.rs:511:9:511:10 | x4 | provenance | | +| main.rs:514:9:514:10 | x5 | main.rs:515:10:515:11 | x5 | provenance | | +| main.rs:514:14:514:23 | source(...) | main.rs:514:14:514:30 | ... .lt(...) | provenance | MaD:23 | +| main.rs:514:14:514:30 | ... .lt(...) | main.rs:514:9:514:10 | x5 | provenance | | +| main.rs:517:9:517:10 | x6 | main.rs:518:10:518:11 | x6 | provenance | | +| main.rs:517:14:517:23 | source(...) | main.rs:517:14:517:27 | ... < ... | provenance | MaD:23 | +| main.rs:517:14:517:27 | ... < ... | main.rs:517:9:517:10 | x6 | provenance | | +| main.rs:523:9:523:10 | x8 | main.rs:524:10:524:11 | x8 | provenance | | +| main.rs:523:9:523:10 | x8 | main.rs:524:10:524:11 | x8 | provenance | | +| main.rs:523:14:523:44 | ...::flow_through2(...) | main.rs:523:9:523:10 | x8 | provenance | | +| main.rs:523:14:523:44 | ...::flow_through2(...) | main.rs:523:9:523:10 | x8 | provenance | | +| main.rs:523:34:523:43 | source(...) | main.rs:523:14:523:44 | ...::flow_through2(...) | provenance | MaD:25 | +| main.rs:523:34:523:43 | source(...) | main.rs:523:14:523:44 | ...::flow_through2(...) | provenance | MaD:25 | +| main.rs:526:9:526:10 | x9 | main.rs:527:10:527:11 | x9 | provenance | | +| main.rs:526:9:526:10 | x9 | main.rs:527:10:527:11 | x9 | provenance | | +| main.rs:526:14:526:44 | ...::flow_through3(...) | main.rs:526:9:526:10 | x9 | provenance | | +| main.rs:526:14:526:44 | ...::flow_through3(...) | main.rs:526:9:526:10 | x9 | provenance | | +| main.rs:526:34:526:43 | source(...) | main.rs:526:14:526:44 | ...::flow_through3(...) | provenance | MaD:21 | +| main.rs:526:34:526:43 | source(...) | main.rs:526:14:526:44 | ...::flow_through3(...) | provenance | MaD:21 | +| main.rs:532:9:532:11 | x11 | main.rs:533:10:533:12 | x11 | provenance | | +| main.rs:532:9:532:11 | x11 | main.rs:533:10:533:12 | x11 | provenance | | +| main.rs:532:15:532:32 | ...::produce3(...) | main.rs:532:9:532:11 | x11 | provenance | Src:MaD:10 | +| main.rs:532:15:532:32 | ...::produce3(...) | main.rs:532:9:532:11 | x11 | provenance | Src:MaD:10 | +| main.rs:537:20:537:29 | source(...) | main.rs:537:20:537:29 | source(...) | provenance | Sink:MaD:1 | +| main.rs:537:20:537:29 | source(...) | main.rs:537:20:537:29 | source(...) | provenance | Sink:MaD:1 | +| main.rs:549:10:549:28 | generated_source(...) | main.rs:549:10:549:28 | generated_source(...) | provenance | Src:MaD:16 | +| main.rs:549:10:549:28 | generated_source(...) | main.rs:549:10:549:28 | generated_source(...) | provenance | Src:MaD:16 | +| main.rs:551:10:551:33 | neutral_manual_source(...) | main.rs:551:10:551:33 | neutral_manual_source(...) | provenance | Src:MaD:17 | +| main.rs:551:10:551:33 | neutral_manual_source(...) | main.rs:551:10:551:33 | neutral_manual_source(...) | provenance | Src:MaD:17 | +| main.rs:552:20:552:28 | source(...) | main.rs:552:20:552:28 | source(...) | provenance | Sink:MaD:5 | +| main.rs:552:20:552:28 | source(...) | main.rs:552:20:552:28 | source(...) | provenance | Sink:MaD:5 | +| main.rs:554:25:554:33 | source(...) | main.rs:554:25:554:33 | source(...) | provenance | Sink:MaD:6 | +| main.rs:554:25:554:33 | source(...) | main.rs:554:25:554:33 | source(...) | provenance | Sink:MaD:6 | +| main.rs:555:28:555:36 | source(...) | main.rs:555:10:555:37 | generated_summary(...) | provenance | MaD:29 | +| main.rs:555:28:555:36 | source(...) | main.rs:555:10:555:37 | generated_summary(...) | provenance | MaD:29 | +| main.rs:557:33:557:41 | source(...) | main.rs:557:10:557:42 | neutral_manual_summary(...) | provenance | MaD:30 | +| main.rs:557:33:557:41 | source(...) | main.rs:557:10:557:42 | neutral_manual_summary(...) | provenance | MaD:30 | nodes | main.rs:15:9:15:9 | s | semmle.label | s | | main.rs:15:9:15:9 | s | semmle.label | s | @@ -756,82 +764,92 @@ nodes | main.rs:410:26:410:31 | ...: i64 | semmle.label | ...: i64 | | main.rs:411:14:411:14 | i | semmle.label | i | | main.rs:411:14:411:14 | i | semmle.label | i | -| main.rs:475:9:475:10 | x1 | semmle.label | x1 | -| main.rs:475:9:475:10 | x1 | semmle.label | x1 | -| main.rs:475:14:475:23 | source(...) | semmle.label | source(...) | -| main.rs:475:14:475:23 | source(...) | semmle.label | source(...) | -| main.rs:475:14:475:30 | ... .max(...) | semmle.label | ... .max(...) | -| main.rs:475:14:475:30 | ... .max(...) | semmle.label | ... .max(...) | -| main.rs:476:10:476:11 | x1 | semmle.label | x1 | -| main.rs:476:10:476:11 | x1 | semmle.label | x1 | -| main.rs:478:9:478:10 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | -| main.rs:478:9:478:10 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | -| main.rs:478:14:485:6 | ... .max(...) [MyStruct.field1] | semmle.label | ... .max(...) [MyStruct.field1] | -| main.rs:478:14:485:6 | ... .max(...) [MyStruct.field1] | semmle.label | ... .max(...) [MyStruct.field1] | -| main.rs:478:15:481:5 | MyStruct {...} [MyStruct.field1] | semmle.label | MyStruct {...} [MyStruct.field1] | -| main.rs:478:15:481:5 | MyStruct {...} [MyStruct.field1] | semmle.label | MyStruct {...} [MyStruct.field1] | -| main.rs:479:17:479:26 | source(...) | semmle.label | source(...) | -| main.rs:479:17:479:26 | source(...) | semmle.label | source(...) | -| main.rs:486:10:486:11 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | -| main.rs:486:10:486:11 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | -| main.rs:486:10:486:18 | x2.field1 | semmle.label | x2.field1 | -| main.rs:486:10:486:18 | x2.field1 | semmle.label | x2.field1 | -| main.rs:491:9:491:10 | x4 | semmle.label | x4 | -| main.rs:491:9:491:10 | x4 | semmle.label | x4 | -| main.rs:491:14:491:23 | source(...) | semmle.label | source(...) | -| main.rs:491:14:491:23 | source(...) | semmle.label | source(...) | -| main.rs:491:14:491:30 | ... .max(...) | semmle.label | ... .max(...) | -| main.rs:491:14:491:30 | ... .max(...) | semmle.label | ... .max(...) | -| main.rs:492:10:492:11 | x4 | semmle.label | x4 | -| main.rs:492:10:492:11 | x4 | semmle.label | x4 | -| main.rs:494:9:494:10 | x5 | semmle.label | x5 | -| main.rs:494:14:494:23 | source(...) | semmle.label | source(...) | -| main.rs:494:14:494:30 | ... .lt(...) | semmle.label | ... .lt(...) | -| main.rs:495:10:495:11 | x5 | semmle.label | x5 | -| main.rs:497:9:497:10 | x6 | semmle.label | x6 | -| main.rs:497:14:497:23 | source(...) | semmle.label | source(...) | -| main.rs:497:14:497:27 | ... < ... | semmle.label | ... < ... | -| main.rs:498:10:498:11 | x6 | semmle.label | x6 | -| main.rs:503:9:503:10 | x8 | semmle.label | x8 | -| main.rs:503:9:503:10 | x8 | semmle.label | x8 | -| main.rs:503:14:503:44 | ...::flow_through2(...) | semmle.label | ...::flow_through2(...) | -| main.rs:503:14:503:44 | ...::flow_through2(...) | semmle.label | ...::flow_through2(...) | -| main.rs:503:34:503:43 | source(...) | semmle.label | source(...) | -| main.rs:503:34:503:43 | source(...) | semmle.label | source(...) | -| main.rs:504:10:504:11 | x8 | semmle.label | x8 | -| main.rs:504:10:504:11 | x8 | semmle.label | x8 | -| main.rs:506:9:506:10 | x9 | semmle.label | x9 | -| main.rs:506:9:506:10 | x9 | semmle.label | x9 | -| main.rs:506:14:506:44 | ...::flow_through3(...) | semmle.label | ...::flow_through3(...) | -| main.rs:506:14:506:44 | ...::flow_through3(...) | semmle.label | ...::flow_through3(...) | -| main.rs:506:34:506:43 | source(...) | semmle.label | source(...) | -| main.rs:506:34:506:43 | source(...) | semmle.label | source(...) | -| main.rs:507:10:507:11 | x9 | semmle.label | x9 | -| main.rs:507:10:507:11 | x9 | semmle.label | x9 | -| main.rs:519:10:519:28 | generated_source(...) | semmle.label | generated_source(...) | -| main.rs:519:10:519:28 | generated_source(...) | semmle.label | generated_source(...) | -| main.rs:519:10:519:28 | generated_source(...) | semmle.label | generated_source(...) | -| main.rs:519:10:519:28 | generated_source(...) | semmle.label | generated_source(...) | -| main.rs:521:10:521:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | -| main.rs:521:10:521:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | -| main.rs:521:10:521:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | -| main.rs:521:10:521:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | -| main.rs:522:20:522:28 | source(...) | semmle.label | source(...) | -| main.rs:522:20:522:28 | source(...) | semmle.label | source(...) | -| main.rs:522:20:522:28 | source(...) | semmle.label | source(...) | -| main.rs:522:20:522:28 | source(...) | semmle.label | source(...) | -| main.rs:524:25:524:33 | source(...) | semmle.label | source(...) | -| main.rs:524:25:524:33 | source(...) | semmle.label | source(...) | -| main.rs:524:25:524:33 | source(...) | semmle.label | source(...) | -| main.rs:524:25:524:33 | source(...) | semmle.label | source(...) | -| main.rs:525:10:525:37 | generated_summary(...) | semmle.label | generated_summary(...) | -| main.rs:525:10:525:37 | generated_summary(...) | semmle.label | generated_summary(...) | -| main.rs:525:28:525:36 | source(...) | semmle.label | source(...) | -| main.rs:525:28:525:36 | source(...) | semmle.label | source(...) | -| main.rs:527:10:527:42 | neutral_manual_summary(...) | semmle.label | neutral_manual_summary(...) | -| main.rs:527:10:527:42 | neutral_manual_summary(...) | semmle.label | neutral_manual_summary(...) | -| main.rs:527:33:527:41 | source(...) | semmle.label | source(...) | -| main.rs:527:33:527:41 | source(...) | semmle.label | source(...) | +| main.rs:495:9:495:10 | x1 | semmle.label | x1 | +| main.rs:495:9:495:10 | x1 | semmle.label | x1 | +| main.rs:495:14:495:23 | source(...) | semmle.label | source(...) | +| main.rs:495:14:495:23 | source(...) | semmle.label | source(...) | +| main.rs:495:14:495:30 | ... .max(...) | semmle.label | ... .max(...) | +| main.rs:495:14:495:30 | ... .max(...) | semmle.label | ... .max(...) | +| main.rs:496:10:496:11 | x1 | semmle.label | x1 | +| main.rs:496:10:496:11 | x1 | semmle.label | x1 | +| main.rs:498:9:498:10 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | +| main.rs:498:9:498:10 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | +| main.rs:498:14:505:6 | ... .max(...) [MyStruct.field1] | semmle.label | ... .max(...) [MyStruct.field1] | +| main.rs:498:14:505:6 | ... .max(...) [MyStruct.field1] | semmle.label | ... .max(...) [MyStruct.field1] | +| main.rs:498:15:501:5 | MyStruct {...} [MyStruct.field1] | semmle.label | MyStruct {...} [MyStruct.field1] | +| main.rs:498:15:501:5 | MyStruct {...} [MyStruct.field1] | semmle.label | MyStruct {...} [MyStruct.field1] | +| main.rs:499:17:499:26 | source(...) | semmle.label | source(...) | +| main.rs:499:17:499:26 | source(...) | semmle.label | source(...) | +| main.rs:506:10:506:11 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | +| main.rs:506:10:506:11 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | +| main.rs:506:10:506:18 | x2.field1 | semmle.label | x2.field1 | +| main.rs:506:10:506:18 | x2.field1 | semmle.label | x2.field1 | +| main.rs:511:9:511:10 | x4 | semmle.label | x4 | +| main.rs:511:9:511:10 | x4 | semmle.label | x4 | +| main.rs:511:14:511:23 | source(...) | semmle.label | source(...) | +| main.rs:511:14:511:23 | source(...) | semmle.label | source(...) | +| main.rs:511:14:511:30 | ... .max(...) | semmle.label | ... .max(...) | +| main.rs:511:14:511:30 | ... .max(...) | semmle.label | ... .max(...) | +| main.rs:512:10:512:11 | x4 | semmle.label | x4 | +| main.rs:512:10:512:11 | x4 | semmle.label | x4 | +| main.rs:514:9:514:10 | x5 | semmle.label | x5 | +| main.rs:514:14:514:23 | source(...) | semmle.label | source(...) | +| main.rs:514:14:514:30 | ... .lt(...) | semmle.label | ... .lt(...) | +| main.rs:515:10:515:11 | x5 | semmle.label | x5 | +| main.rs:517:9:517:10 | x6 | semmle.label | x6 | +| main.rs:517:14:517:23 | source(...) | semmle.label | source(...) | +| main.rs:517:14:517:27 | ... < ... | semmle.label | ... < ... | +| main.rs:518:10:518:11 | x6 | semmle.label | x6 | +| main.rs:523:9:523:10 | x8 | semmle.label | x8 | +| main.rs:523:9:523:10 | x8 | semmle.label | x8 | +| main.rs:523:14:523:44 | ...::flow_through2(...) | semmle.label | ...::flow_through2(...) | +| main.rs:523:14:523:44 | ...::flow_through2(...) | semmle.label | ...::flow_through2(...) | +| main.rs:523:34:523:43 | source(...) | semmle.label | source(...) | +| main.rs:523:34:523:43 | source(...) | semmle.label | source(...) | +| main.rs:524:10:524:11 | x8 | semmle.label | x8 | +| main.rs:524:10:524:11 | x8 | semmle.label | x8 | +| main.rs:526:9:526:10 | x9 | semmle.label | x9 | +| main.rs:526:9:526:10 | x9 | semmle.label | x9 | +| main.rs:526:14:526:44 | ...::flow_through3(...) | semmle.label | ...::flow_through3(...) | +| main.rs:526:14:526:44 | ...::flow_through3(...) | semmle.label | ...::flow_through3(...) | +| main.rs:526:34:526:43 | source(...) | semmle.label | source(...) | +| main.rs:526:34:526:43 | source(...) | semmle.label | source(...) | +| main.rs:527:10:527:11 | x9 | semmle.label | x9 | +| main.rs:527:10:527:11 | x9 | semmle.label | x9 | +| main.rs:532:9:532:11 | x11 | semmle.label | x11 | +| main.rs:532:9:532:11 | x11 | semmle.label | x11 | +| main.rs:532:15:532:32 | ...::produce3(...) | semmle.label | ...::produce3(...) | +| main.rs:532:15:532:32 | ...::produce3(...) | semmle.label | ...::produce3(...) | +| main.rs:533:10:533:12 | x11 | semmle.label | x11 | +| main.rs:533:10:533:12 | x11 | semmle.label | x11 | +| main.rs:537:20:537:29 | source(...) | semmle.label | source(...) | +| main.rs:537:20:537:29 | source(...) | semmle.label | source(...) | +| main.rs:537:20:537:29 | source(...) | semmle.label | source(...) | +| main.rs:537:20:537:29 | source(...) | semmle.label | source(...) | +| main.rs:549:10:549:28 | generated_source(...) | semmle.label | generated_source(...) | +| main.rs:549:10:549:28 | generated_source(...) | semmle.label | generated_source(...) | +| main.rs:549:10:549:28 | generated_source(...) | semmle.label | generated_source(...) | +| main.rs:549:10:549:28 | generated_source(...) | semmle.label | generated_source(...) | +| main.rs:551:10:551:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | +| main.rs:551:10:551:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | +| main.rs:551:10:551:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | +| main.rs:551:10:551:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | +| main.rs:552:20:552:28 | source(...) | semmle.label | source(...) | +| main.rs:552:20:552:28 | source(...) | semmle.label | source(...) | +| main.rs:552:20:552:28 | source(...) | semmle.label | source(...) | +| main.rs:552:20:552:28 | source(...) | semmle.label | source(...) | +| main.rs:554:25:554:33 | source(...) | semmle.label | source(...) | +| main.rs:554:25:554:33 | source(...) | semmle.label | source(...) | +| main.rs:554:25:554:33 | source(...) | semmle.label | source(...) | +| main.rs:554:25:554:33 | source(...) | semmle.label | source(...) | +| main.rs:555:10:555:37 | generated_summary(...) | semmle.label | generated_summary(...) | +| main.rs:555:10:555:37 | generated_summary(...) | semmle.label | generated_summary(...) | +| main.rs:555:28:555:36 | source(...) | semmle.label | source(...) | +| main.rs:555:28:555:36 | source(...) | semmle.label | source(...) | +| main.rs:557:10:557:42 | neutral_manual_summary(...) | semmle.label | neutral_manual_summary(...) | +| main.rs:557:10:557:42 | neutral_manual_summary(...) | semmle.label | neutral_manual_summary(...) | +| main.rs:557:33:557:41 | source(...) | semmle.label | source(...) | +| main.rs:557:33:557:41 | source(...) | semmle.label | source(...) | subpaths | main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | main.rs:213:17:213:42 | if ... {...} else {...} | main.rs:214:13:214:24 | apply(...) | | main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | main.rs:213:17:213:42 | if ... {...} else {...} | main.rs:214:13:214:24 | apply(...) | @@ -907,27 +925,31 @@ invalidSpecComponent | main.rs:401:10:401:10 | i | main.rs:400:16:400:16 | i | main.rs:401:10:401:10 | i | $@ | main.rs:400:16:400:16 | i | i | | main.rs:411:14:411:14 | i | main.rs:410:26:410:31 | ...: i64 | main.rs:411:14:411:14 | i | $@ | main.rs:410:26:410:31 | ...: i64 | ...: i64 | | main.rs:411:14:411:14 | i | main.rs:410:26:410:31 | ...: i64 | main.rs:411:14:411:14 | i | $@ | main.rs:410:26:410:31 | ...: i64 | ...: i64 | -| main.rs:476:10:476:11 | x1 | main.rs:475:14:475:23 | source(...) | main.rs:476:10:476:11 | x1 | $@ | main.rs:475:14:475:23 | source(...) | source(...) | -| main.rs:476:10:476:11 | x1 | main.rs:475:14:475:23 | source(...) | main.rs:476:10:476:11 | x1 | $@ | main.rs:475:14:475:23 | source(...) | source(...) | -| main.rs:486:10:486:18 | x2.field1 | main.rs:479:17:479:26 | source(...) | main.rs:486:10:486:18 | x2.field1 | $@ | main.rs:479:17:479:26 | source(...) | source(...) | -| main.rs:486:10:486:18 | x2.field1 | main.rs:479:17:479:26 | source(...) | main.rs:486:10:486:18 | x2.field1 | $@ | main.rs:479:17:479:26 | source(...) | source(...) | -| main.rs:492:10:492:11 | x4 | main.rs:491:14:491:23 | source(...) | main.rs:492:10:492:11 | x4 | $@ | main.rs:491:14:491:23 | source(...) | source(...) | -| main.rs:492:10:492:11 | x4 | main.rs:491:14:491:23 | source(...) | main.rs:492:10:492:11 | x4 | $@ | main.rs:491:14:491:23 | source(...) | source(...) | -| main.rs:495:10:495:11 | x5 | main.rs:494:14:494:23 | source(...) | main.rs:495:10:495:11 | x5 | $@ | main.rs:494:14:494:23 | source(...) | source(...) | -| main.rs:498:10:498:11 | x6 | main.rs:497:14:497:23 | source(...) | main.rs:498:10:498:11 | x6 | $@ | main.rs:497:14:497:23 | source(...) | source(...) | -| main.rs:504:10:504:11 | x8 | main.rs:503:34:503:43 | source(...) | main.rs:504:10:504:11 | x8 | $@ | main.rs:503:34:503:43 | source(...) | source(...) | -| main.rs:504:10:504:11 | x8 | main.rs:503:34:503:43 | source(...) | main.rs:504:10:504:11 | x8 | $@ | main.rs:503:34:503:43 | source(...) | source(...) | -| main.rs:507:10:507:11 | x9 | main.rs:506:34:506:43 | source(...) | main.rs:507:10:507:11 | x9 | $@ | main.rs:506:34:506:43 | source(...) | source(...) | -| main.rs:507:10:507:11 | x9 | main.rs:506:34:506:43 | source(...) | main.rs:507:10:507:11 | x9 | $@ | main.rs:506:34:506:43 | source(...) | source(...) | -| main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | $@ | main.rs:519:10:519:28 | generated_source(...) | generated_source(...) | -| main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | $@ | main.rs:519:10:519:28 | generated_source(...) | generated_source(...) | -| main.rs:521:10:521:33 | neutral_manual_source(...) | main.rs:521:10:521:33 | neutral_manual_source(...) | main.rs:521:10:521:33 | neutral_manual_source(...) | $@ | main.rs:521:10:521:33 | neutral_manual_source(...) | neutral_manual_source(...) | -| main.rs:521:10:521:33 | neutral_manual_source(...) | main.rs:521:10:521:33 | neutral_manual_source(...) | main.rs:521:10:521:33 | neutral_manual_source(...) | $@ | main.rs:521:10:521:33 | neutral_manual_source(...) | neutral_manual_source(...) | -| main.rs:522:20:522:28 | source(...) | main.rs:522:20:522:28 | source(...) | main.rs:522:20:522:28 | source(...) | $@ | main.rs:522:20:522:28 | source(...) | source(...) | -| main.rs:522:20:522:28 | source(...) | main.rs:522:20:522:28 | source(...) | main.rs:522:20:522:28 | source(...) | $@ | main.rs:522:20:522:28 | source(...) | source(...) | -| main.rs:524:25:524:33 | source(...) | main.rs:524:25:524:33 | source(...) | main.rs:524:25:524:33 | source(...) | $@ | main.rs:524:25:524:33 | source(...) | source(...) | -| main.rs:524:25:524:33 | source(...) | main.rs:524:25:524:33 | source(...) | main.rs:524:25:524:33 | source(...) | $@ | main.rs:524:25:524:33 | source(...) | source(...) | -| main.rs:525:10:525:37 | generated_summary(...) | main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | $@ | main.rs:525:28:525:36 | source(...) | source(...) | -| main.rs:525:10:525:37 | generated_summary(...) | main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | $@ | main.rs:525:28:525:36 | source(...) | source(...) | -| main.rs:527:10:527:42 | neutral_manual_summary(...) | main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | $@ | main.rs:527:33:527:41 | source(...) | source(...) | -| main.rs:527:10:527:42 | neutral_manual_summary(...) | main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | $@ | main.rs:527:33:527:41 | source(...) | source(...) | +| main.rs:496:10:496:11 | x1 | main.rs:495:14:495:23 | source(...) | main.rs:496:10:496:11 | x1 | $@ | main.rs:495:14:495:23 | source(...) | source(...) | +| main.rs:496:10:496:11 | x1 | main.rs:495:14:495:23 | source(...) | main.rs:496:10:496:11 | x1 | $@ | main.rs:495:14:495:23 | source(...) | source(...) | +| main.rs:506:10:506:18 | x2.field1 | main.rs:499:17:499:26 | source(...) | main.rs:506:10:506:18 | x2.field1 | $@ | main.rs:499:17:499:26 | source(...) | source(...) | +| main.rs:506:10:506:18 | x2.field1 | main.rs:499:17:499:26 | source(...) | main.rs:506:10:506:18 | x2.field1 | $@ | main.rs:499:17:499:26 | source(...) | source(...) | +| main.rs:512:10:512:11 | x4 | main.rs:511:14:511:23 | source(...) | main.rs:512:10:512:11 | x4 | $@ | main.rs:511:14:511:23 | source(...) | source(...) | +| main.rs:512:10:512:11 | x4 | main.rs:511:14:511:23 | source(...) | main.rs:512:10:512:11 | x4 | $@ | main.rs:511:14:511:23 | source(...) | source(...) | +| main.rs:515:10:515:11 | x5 | main.rs:514:14:514:23 | source(...) | main.rs:515:10:515:11 | x5 | $@ | main.rs:514:14:514:23 | source(...) | source(...) | +| main.rs:518:10:518:11 | x6 | main.rs:517:14:517:23 | source(...) | main.rs:518:10:518:11 | x6 | $@ | main.rs:517:14:517:23 | source(...) | source(...) | +| main.rs:524:10:524:11 | x8 | main.rs:523:34:523:43 | source(...) | main.rs:524:10:524:11 | x8 | $@ | main.rs:523:34:523:43 | source(...) | source(...) | +| main.rs:524:10:524:11 | x8 | main.rs:523:34:523:43 | source(...) | main.rs:524:10:524:11 | x8 | $@ | main.rs:523:34:523:43 | source(...) | source(...) | +| main.rs:527:10:527:11 | x9 | main.rs:526:34:526:43 | source(...) | main.rs:527:10:527:11 | x9 | $@ | main.rs:526:34:526:43 | source(...) | source(...) | +| main.rs:527:10:527:11 | x9 | main.rs:526:34:526:43 | source(...) | main.rs:527:10:527:11 | x9 | $@ | main.rs:526:34:526:43 | source(...) | source(...) | +| main.rs:533:10:533:12 | x11 | main.rs:532:15:532:32 | ...::produce3(...) | main.rs:533:10:533:12 | x11 | $@ | main.rs:532:15:532:32 | ...::produce3(...) | ...::produce3(...) | +| main.rs:533:10:533:12 | x11 | main.rs:532:15:532:32 | ...::produce3(...) | main.rs:533:10:533:12 | x11 | $@ | main.rs:532:15:532:32 | ...::produce3(...) | ...::produce3(...) | +| main.rs:537:20:537:29 | source(...) | main.rs:537:20:537:29 | source(...) | main.rs:537:20:537:29 | source(...) | $@ | main.rs:537:20:537:29 | source(...) | source(...) | +| main.rs:537:20:537:29 | source(...) | main.rs:537:20:537:29 | source(...) | main.rs:537:20:537:29 | source(...) | $@ | main.rs:537:20:537:29 | source(...) | source(...) | +| main.rs:549:10:549:28 | generated_source(...) | main.rs:549:10:549:28 | generated_source(...) | main.rs:549:10:549:28 | generated_source(...) | $@ | main.rs:549:10:549:28 | generated_source(...) | generated_source(...) | +| main.rs:549:10:549:28 | generated_source(...) | main.rs:549:10:549:28 | generated_source(...) | main.rs:549:10:549:28 | generated_source(...) | $@ | main.rs:549:10:549:28 | generated_source(...) | generated_source(...) | +| main.rs:551:10:551:33 | neutral_manual_source(...) | main.rs:551:10:551:33 | neutral_manual_source(...) | main.rs:551:10:551:33 | neutral_manual_source(...) | $@ | main.rs:551:10:551:33 | neutral_manual_source(...) | neutral_manual_source(...) | +| main.rs:551:10:551:33 | neutral_manual_source(...) | main.rs:551:10:551:33 | neutral_manual_source(...) | main.rs:551:10:551:33 | neutral_manual_source(...) | $@ | main.rs:551:10:551:33 | neutral_manual_source(...) | neutral_manual_source(...) | +| main.rs:552:20:552:28 | source(...) | main.rs:552:20:552:28 | source(...) | main.rs:552:20:552:28 | source(...) | $@ | main.rs:552:20:552:28 | source(...) | source(...) | +| main.rs:552:20:552:28 | source(...) | main.rs:552:20:552:28 | source(...) | main.rs:552:20:552:28 | source(...) | $@ | main.rs:552:20:552:28 | source(...) | source(...) | +| main.rs:554:25:554:33 | source(...) | main.rs:554:25:554:33 | source(...) | main.rs:554:25:554:33 | source(...) | $@ | main.rs:554:25:554:33 | source(...) | source(...) | +| main.rs:554:25:554:33 | source(...) | main.rs:554:25:554:33 | source(...) | main.rs:554:25:554:33 | source(...) | $@ | main.rs:554:25:554:33 | source(...) | source(...) | +| main.rs:555:10:555:37 | generated_summary(...) | main.rs:555:28:555:36 | source(...) | main.rs:555:10:555:37 | generated_summary(...) | $@ | main.rs:555:28:555:36 | source(...) | source(...) | +| main.rs:555:10:555:37 | generated_summary(...) | main.rs:555:28:555:36 | source(...) | main.rs:555:10:555:37 | generated_summary(...) | $@ | main.rs:555:28:555:36 | source(...) | source(...) | +| main.rs:557:10:557:42 | neutral_manual_summary(...) | main.rs:557:33:557:41 | source(...) | main.rs:557:10:557:42 | neutral_manual_summary(...) | $@ | main.rs:557:33:557:41 | source(...) | source(...) | +| main.rs:557:10:557:42 | neutral_manual_summary(...) | main.rs:557:33:557:41 | source(...) | main.rs:557:10:557:42 | neutral_manual_summary(...) | $@ | main.rs:557:33:557:41 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/models/models.ext.yml b/rust/ql/test/library-tests/dataflow/models/models.ext.yml index 1a5e01e8a1c9..644d17f21d40 100644 --- a/rust/ql/test/library-tests/dataflow/models/models.ext.yml +++ b/rust/ql/test/library-tests/dataflow/models/models.ext.yml @@ -14,6 +14,8 @@ extensions: - ["main::external_file::generated_source", "ReturnValue", "test-source", "dfc-generated"] # not actually generated, but we want to test behaviour of generated models here. - ["main::external_file::neutral_generated_source", "ReturnValue", "test-source", "dfc-generated"] - ["main::external_file::neutral_manual_source", "ReturnValue", "test-source", "manual"] + - ["::produce2", "ReturnValue", "test-source", "manual"] + - ["<_ as main::MySourceTrait3>::produce3", "ReturnValue", "test-source", "manual"] - addsTo: pack: codeql/rust-all extensible: sinkModel @@ -27,6 +29,8 @@ extensions: - ["main::external_file::generated_sink", "Argument[0]", "test-sink", "dfc-generated"] - ["main::external_file::neutral_generated_sink", "Argument[0]", "test-sink", "dfc-generated"] - ["main::external_file::neutral_manual_sink", "Argument[0]", "test-sink", "manual"] + - ["::consume2", "Argument[0]", "test-sink", "manual"] + - ["<_ as main::MySinkTrait3>::consume3", "Argument[0]", "test-sink", "manual"] - addsTo: pack: codeql/rust-all extensible: summaryModel From 631419a9125661c0008b53f461622556a9a2f56d Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Tue, 1 Sep 2026 09:50:56 +0200 Subject: [PATCH 0610/2098] Unified: Add BinaryExpr.getAnOperand to FacadeAst. --- unified/ql/lib/codeql/unified/internal/AstExtra.qll | 2 -- unified/ql/lib/codeql/unified/internal/FacadeAst.qll | 5 +++++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/AstExtra.qll b/unified/ql/lib/codeql/unified/internal/AstExtra.qll index 378712b86cb9..4b8f5a9f8bbf 100644 --- a/unified/ql/lib/codeql/unified/internal/AstExtra.qll +++ b/unified/ql/lib/codeql/unified/internal/AstExtra.qll @@ -10,8 +10,6 @@ module Public { */ class LogicalAndExpr extends BinaryExpr { LogicalAndExpr() { this.getOperator().getValue() = "&&" } - - Expr getAnOperand() { result = [this.getLeft(), this.getRight()] } } /** diff --git a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll index 44adef76e425..60990e0016f9 100644 --- a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll +++ b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll @@ -49,6 +49,11 @@ module Unified { } } + /** A binary expression. */ + class BinaryExpr extends G::BinaryExpr { + Expr getAnOperand() { result = [this.getLeft(), this.getRight()] } + } + /** A function call */ class CallExpr extends G::CallExpr { /** Gets the named argument with the given `name`. */ From a1ac9b1c9b446aebee382a2b59dbaedb6a1d7254 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Tue, 1 Sep 2026 09:55:44 +0200 Subject: [PATCH 0611/2098] Unified: Add more logical expressions to AstExtra. --- .../lib/codeql/unified/internal/AstExtra.qll | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/AstExtra.qll b/unified/ql/lib/codeql/unified/internal/AstExtra.qll index 4b8f5a9f8bbf..f5a9ad09caaa 100644 --- a/unified/ql/lib/codeql/unified/internal/AstExtra.qll +++ b/unified/ql/lib/codeql/unified/internal/AstExtra.qll @@ -5,13 +5,26 @@ private import unified module Public { - /** - * A logical 'and' expression with short-circuiting. - */ + /** A short-circuiting logical AND expression. */ class LogicalAndExpr extends BinaryExpr { LogicalAndExpr() { this.getOperator().getValue() = "&&" } } + /** A short-circuiting logical OR expression. */ + class LogicalOrExpr extends BinaryExpr { + LogicalOrExpr() { this.getOperator().getValue() = "||" } + } + + /** A short-circuiting null-coalescing expression. */ + class NullCoalescingExpr extends BinaryExpr { + NullCoalescingExpr() { this.getOperator().getValue() = "??" } + } + + /** A logical NOT expression. */ + class LogicalNotExpr extends UnaryExpr { + LogicalNotExpr() { this.getOperator().(PrefixOperator).getValue() = "!" } + } + /** * Declaration of a local or top-level variable. */ From 61e11ebcde43d3ca71441f45663a73b17b2dafef Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Tue, 1 Sep 2026 10:01:22 +0200 Subject: [PATCH 0612/2098] CFG: Exclude 'try's from post-order in case they're Exprs. --- shared/controlflow/codeql/controlflow/ControlFlowGraph.qll | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll index 9c0f32fee397..21bdcf5b8335 100644 --- a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll +++ b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll @@ -572,7 +572,8 @@ module Make0 Ast> { not n instanceof ConditionalExpr and not n instanceof Switch and not n instanceof Case and - not n instanceof BlockStmt + not n instanceof BlockStmt and + not n instanceof TryStmt } /** From 872aabc6887bbddb8e23f7a755ea360bb200cbab Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 27 Aug 2026 19:28:38 +0200 Subject: [PATCH 0613/2098] FlowSummaryImpl: Align source/sink/barrier prioriterization with that for summaries --- .../cpp/dataflow/internal/FlowSummaryImpl.qll | 20 +- .../dataflow/internal/FlowSummaryImpl.qll | 6 +- .../go/dataflow/internal/FlowSummaryImpl.qll | 6 +- .../dataflow/internal/FlowSummaryImpl.qll | 6 +- .../dataflow/internal/FlowSummaryPrivate.qll | 6 +- .../dataflow/new/internal/FlowSummaryImpl.qll | 6 +- .../dataflow/internal/FlowSummaryImpl.qll | 6 +- .../dataflow/internal/FlowSummaryImpl.qll | 186 ++++++++++-------- .../dataflow/internal/FlowSummaryImpl.qll | 6 +- 9 files changed, 126 insertions(+), 122 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll index efe18e0945ed..780c802dc8ae 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll @@ -17,10 +17,6 @@ module Input implements InputSig { class SummarizedCallableBase = Function; - class SourceBase = Function; - - class SinkBase = Function; - class FlowSummaryCallBase = CallInstruction; predicate callableFromSource(SummarizedCallableBase c) { exists(c.getBlock()) } @@ -232,7 +228,7 @@ private module Input2 implements Impl::Private::InputSig2 { bindingset[source, sc] SourceSinkReportingElement getASourceReportingElement( - Input::SourceBase source, Impl::Private::SummaryComponent sc + Input::SummarizedCallableBase source, Impl::Private::SummaryComponent sc ) { exists(Call call | call.getTarget() = source | sc = Impl::Private::SummaryComponent::return(_) and @@ -312,7 +308,7 @@ private module Input2 implements Impl::Private::InputSig2 { bindingset[sink, sc] SourceSinkReportingElement getASinkReportingElement( - Input::SinkBase sink, Impl::Private::SummaryComponent sc + Input::SummarizedCallableBase sink, Impl::Private::SummaryComponent sc ) { exists(Call call, ArgumentPosition pos | call.getTarget() = sink and @@ -525,9 +521,10 @@ private class SourceModelFunction extends Public::SourceElement instanceof Funct } override predicate isSource( - string output, string kind, Public::Provenance provenance, string model + string output, string kind, Public::Provenance provenance, boolean isExact, string model ) { - sourceModel(namespace, type, subtypes, name, signature, ext, output, kind, provenance, model) + sourceModel(namespace, type, subtypes, name, signature, ext, output, kind, provenance, model) and + isExact = true } } @@ -544,7 +541,10 @@ private class SinkModelFunction extends Public::SinkElement instanceof Function this = interpretElement(namespace, type, subtypes, name, signature, ext) } - override predicate isSink(string input, string kind, Public::Provenance provenance, string model) { - sinkModel(namespace, type, subtypes, name, signature, ext, input, kind, provenance, model) + override predicate isSink( + string input, string kind, Public::Provenance provenance, boolean isExact, string model + ) { + sinkModel(namespace, type, subtypes, name, signature, ext, input, kind, provenance, model) and + isExact = true } } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll index 816b31580daf..88785012d81b 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll @@ -30,14 +30,10 @@ module Input implements InputSig ) } - class SourceBase extends Void { + class FlowSummaryCallBase extends Void { Location getLocation() { none() } } - class SinkBase = SourceBase; - - class FlowSummaryCallBase = SourceBase; - DataFlowCallable getSummarizedCallableAsDataFlowCallable(SummarizedCallableBase c) { result.asSummarizedCallable() = c } diff --git a/go/ql/lib/semmle/go/dataflow/internal/FlowSummaryImpl.qll b/go/ql/lib/semmle/go/dataflow/internal/FlowSummaryImpl.qll index cce64ab5c32b..4dc80eed652f 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/FlowSummaryImpl.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/FlowSummaryImpl.qll @@ -27,14 +27,10 @@ module Input implements InputSig { class SummarizedCallableBase = Callable; - class SourceBase extends Void { + class FlowSummaryCallBase extends Void { Location getLocation() { none() } } - class SinkBase = SourceBase; - - class FlowSummaryCallBase = SourceBase; - predicate callableFromSource(SummarizedCallableBase c) { exists(c.getFuncDef()) } DataFlowCallable getSummarizedCallableAsDataFlowCallable(SummarizedCallableBase c) { diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImpl.qll b/java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImpl.qll index 20d26c67baac..0dc800ecaaa0 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImpl.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImpl.qll @@ -37,14 +37,10 @@ module Input implements InputSig { sc.asCallable() = any(Callable c | c.fromSource() and not c.isStub()) } - class SourceBase extends Void { + class FlowSummaryCallBase extends Void { Location getLocation() { none() } } - class SinkBase = SourceBase; - - class FlowSummaryCallBase = SourceBase; - DataFlowCallable getSummarizedCallableAsDataFlowCallable(SummarizedCallableBase c) { result.asSummarizedCallable() = c } diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/FlowSummaryPrivate.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/FlowSummaryPrivate.qll index ba0d84d2a6bf..1e50fda83fcc 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/FlowSummaryPrivate.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/FlowSummaryPrivate.qll @@ -24,14 +24,10 @@ class SummarizedCallableBase extends string { Location getLocation() { none() } } -class SourceBase extends Void { +class FlowSummaryCallBase extends Void { Location getLocation() { none() } } -class SinkBase = SourceBase; - -class FlowSummaryCallBase = SourceBase; - DataFlowCallable getSummarizedCallableAsDataFlowCallable(SummarizedCallableBase c) { result.asLibraryCallable() = c } diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/FlowSummaryImpl.qll b/python/ql/lib/semmle/python/dataflow/new/internal/FlowSummaryImpl.qll index ca943351f833..2f081870085d 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/FlowSummaryImpl.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/FlowSummaryImpl.qll @@ -21,14 +21,10 @@ module Input implements InputSig Location getLocation() { none() } } - class SourceBase extends Void { + class FlowSummaryCallBase extends Void { Location getLocation() { none() } } - class SinkBase = SourceBase; - - class FlowSummaryCallBase = SourceBase; - predicate callableFromSource(SummarizedCallableBase c) { none() } DataFlowCallable getSummarizedCallableAsDataFlowCallable(SummarizedCallableBase c) { diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/FlowSummaryImpl.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/FlowSummaryImpl.qll index 629ad0c284ee..ede0e898bcb3 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/FlowSummaryImpl.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/FlowSummaryImpl.qll @@ -20,14 +20,10 @@ module Input implements InputSig { Location getLocation() { result instanceof EmptyLocation } } - class SourceBase extends Void { + class FlowSummaryCallBase extends Void { Location getLocation() { none() } } - class SinkBase = SourceBase; - - class FlowSummaryCallBase = SourceBase; - predicate callableFromSource(SummarizedCallableBase c) { none() } DataFlowCallable getSummarizedCallableAsDataFlowCallable(SummarizedCallableBase c) { diff --git a/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll b/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll index 32273b92507f..200fc0e791d7 100644 --- a/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll +++ b/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll @@ -28,28 +28,6 @@ signature module InputSig Lang> { bindingset[c] predicate callableFromSource(SummarizedCallableBase c); - /** - * A base class of elements that are candidates for flow source modeling. - */ - bindingset[this] - class SourceBase { - bindingset[this] - string toString(); - - Location getLocation(); - } - - /** - * A base class of elements that are candidates for flow sink modeling. - */ - bindingset[this] - class SinkBase { - bindingset[this] - string toString(); - - Location getLocation(); - } - /** * Holds if a neutral (MaD) model exists for `c` of kind `kind` * with provenance `provenance` and `isExact` is true if the model @@ -225,10 +203,6 @@ module Make< final private class SummarizedCallableBaseFinal = SummarizedCallableBase; - final private class SourceBaseFinal = SourceBase; - - final private class SinkBaseFinal = SinkBase; - /** Provides classes and predicates for defining flow summaries. */ module Public { private import Private @@ -371,7 +345,7 @@ module Make< } /** A source element. */ - abstract class SourceElement extends SourceBaseFinal { + abstract class SourceElement extends SummarizedCallableBaseFinal { bindingset[this] SourceElement() { any() } @@ -380,11 +354,13 @@ module Make< * flows out as described by `output`. */ pragma[nomagic] - abstract predicate isSource(string output, string kind, Provenance provenance, string model); + abstract predicate isSource( + string output, string kind, Provenance provenance, boolean isExact, string model + ); } /** A sink element. */ - abstract class SinkElement extends SinkBaseFinal { + abstract class SinkElement extends SummarizedCallableBaseFinal { bindingset[this] SinkElement() { any() } @@ -393,11 +369,13 @@ module Make< * flows in as described by `input`. */ pragma[nomagic] - abstract predicate isSink(string input, string kind, Provenance provenance, string model); + abstract predicate isSink( + string input, string kind, Provenance provenance, boolean isExact, string model + ); } /** A barrier element. */ - abstract class BarrierElement extends SourceBaseFinal { + abstract class BarrierElement extends SummarizedCallableBaseFinal { bindingset[this] BarrierElement() { any() } @@ -406,11 +384,13 @@ module Make< * flows out as described by `output`. */ pragma[nomagic] - abstract predicate isBarrier(string output, string kind, Provenance provenance, string model); + abstract predicate isBarrier( + string output, string kind, Provenance provenance, boolean isExact, string model + ); } /** A barrier guard element. */ - abstract class BarrierGuardElement extends SinkBaseFinal { + abstract class BarrierGuardElement extends SummarizedCallableBaseFinal { bindingset[this] BarrierGuardElement() { any() } @@ -420,7 +400,8 @@ module Make< */ pragma[nomagic] abstract predicate isBarrierGuard( - string input, string acceptingValue, string kind, Provenance provenance, string model + string input, string acceptingValue, string kind, Provenance provenance, boolean isExact, + string model ); } @@ -534,6 +515,51 @@ module Make< module Private { private import Public + private signature predicate modelSig( + SummarizedCallableBase c, string kind, Provenance provenance, string model, boolean isExact, + string modelKind + ); + + private module RelevantModel { + /** + * Holds if the model described by the parameters is relevant. A model may be + * irrelevant if a more specific model exists. + */ + predicate isRelevantModel( + SummarizedCallableBase c, string kind, Provenance provenance, string model, boolean isExact + ) { + exists(string modelKind | + model(c, kind, provenance, model, isExact, modelKind) and + if provenance.isGenerated() or isExact = false + then + // Only apply generated models to functions in library code + not (provenance.isGenerated() and callableFromSource(c)) and + // Only apply generated or inexact models when no strictly better model exists + not exists(Provenance other, boolean isExactOther | + model(c, _, other, _, isExactOther, modelKind) + or + neutralElement(c, modelKind, other, isExactOther) + | + provenance.isGenerated() and other.isManual() + or + provenance.getVerification() = other.getVerification() and + isExact = false and + isExactOther = true + ) + else any() + ) + } + } + + private predicate summaryModel( + SummarizedCallableBase c, string kind, Provenance p, string model, boolean isExact, + string modelKind + ) { + c.(SummarizedCallable).propagatesFlow(_, _, _, p, isExact, model) and + kind = "(unused)" and + modelKind = "summary" + } + /** * Holds if `c` has a relevant flow summary. * @@ -550,23 +576,7 @@ module Make< boolean isExact, string model ) { c.propagatesFlow(input, output, preservesValue, p, isExact, model) and - if p.isGenerated() or isExact = false - then - // Only apply generated models to functions in library code - not (p.isGenerated() and callableFromSource(c)) and - // Only apply generated or inexact models when no strictly better model exists - not exists(Provenance other, boolean isExactOther | - c.propagatesFlow(_, _, _, other, isExactOther, _) - or - neutralElement(c, "summary", other, isExactOther) - | - p.isGenerated() and other.isManual() - or - p.getVerification() = other.getVerification() and - isExact = false and - isExactOther = true - ) - else any() + RelevantModel::isRelevantModel(c, _, p, model, isExact) } /** @@ -759,52 +769,72 @@ module Make< unsupportedCallable(callable, _, _, _) } + private predicate sourceModel( + SummarizedCallableBase c, string kind, Provenance p, string model, boolean isExact, + string modelKind + ) { + c.(SourceElement).isSource(_, kind, p, isExact, model) and + modelKind = "source" + } + private predicate isRelevantSource( SourceElement e, string output, string kind, Provenance provenance, string model ) { - e.isSource(output, kind, provenance, model) and - ( - provenance.isManual() - or - provenance.isGenerated() and - not exists(Provenance p | p.isManual() and e.isSource(_, kind, p, _)) + exists(boolean isExact | + e.isSource(output, kind, provenance, isExact, model) and + RelevantModel::isRelevantModel(e, kind, provenance, model, isExact) ) } + private predicate sinkModel( + SummarizedCallableBase c, string kind, Provenance p, string model, boolean isExact, + string modelKind + ) { + c.(SinkElement).isSink(_, kind, p, isExact, model) and + modelKind = "sink" + } + private predicate isRelevantSink( SinkElement e, string input, string kind, Provenance provenance, string model ) { - e.isSink(input, kind, provenance, model) and - ( - provenance.isManual() - or - provenance.isGenerated() and - not exists(Provenance p | p.isManual() and e.isSink(_, kind, p, _)) + exists(boolean isExact | + e.isSink(input, kind, provenance, isExact, model) and + RelevantModel::isRelevantModel(e, kind, provenance, model, isExact) ) } + private predicate barrierModel( + SummarizedCallableBase c, string kind, Provenance p, string model, boolean isExact, + string modelKind + ) { + c.(BarrierElement).isBarrier(_, kind, p, isExact, model) and + modelKind = "barrier" + } + private predicate isRelevantBarrier( BarrierElement e, string output, string kind, Provenance provenance, string model ) { - e.isBarrier(output, kind, provenance, model) and - ( - provenance.isManual() - or - provenance.isGenerated() and - not exists(Provenance p | p.isManual() and e.isBarrier(_, kind, p, _)) + exists(boolean isExact | + e.isBarrier(output, kind, provenance, isExact, model) and + RelevantModel::isRelevantModel(e, kind, provenance, model, isExact) ) } + private predicate barrierGuardModel( + SummarizedCallableBase c, string kind, Provenance p, string model, boolean isExact, + string modelKind + ) { + c.(BarrierGuardElement).isBarrierGuard(_, _, kind, p, isExact, model) and + modelKind = "barrier-guard" + } + private predicate isRelevantBarrierGuard( BarrierGuardElement e, string input, string acceptingValue, string kind, Provenance provenance, string model ) { - e.isBarrierGuard(input, acceptingValue, kind, provenance, model) and - ( - provenance.isManual() - or - provenance.isGenerated() and - not exists(Provenance p | p.isManual() and e.isBarrierGuard(_, _, kind, p, _)) + exists(boolean isExact | + e.isBarrierGuard(input, acceptingValue, kind, provenance, isExact, model) and + RelevantModel::isRelevantModel(e, kind, provenance, model, isExact) ) } @@ -1464,7 +1494,7 @@ module Make< */ bindingset[source, sc] default SourceSinkReportingElement getASourceReportingElement( - SourceBase source, SummaryComponent sc + SummarizedCallableBase source, SummaryComponent sc ) { none() } @@ -1489,7 +1519,9 @@ module Make< * at position 0 in a call to `sink`. */ bindingset[sink, sc] - default SourceSinkReportingElement getASinkReportingElement(SinkBase sink, SummaryComponent sc) { + default SourceSinkReportingElement getASinkReportingElement( + SummarizedCallableBase sink, SummaryComponent sc + ) { none() } diff --git a/swift/ql/lib/codeql/swift/dataflow/internal/FlowSummaryImpl.qll b/swift/ql/lib/codeql/swift/dataflow/internal/FlowSummaryImpl.qll index 4c83edf66823..ed7fc8d41f2c 100644 --- a/swift/ql/lib/codeql/swift/dataflow/internal/FlowSummaryImpl.qll +++ b/swift/ql/lib/codeql/swift/dataflow/internal/FlowSummaryImpl.qll @@ -16,14 +16,10 @@ module Input implements InputSig class SummarizedCallableBase = Function; - class SourceBase extends Void { + class FlowSummaryCallBase extends Void { Location getLocation() { none() } } - class SinkBase = SourceBase; - - class FlowSummaryCallBase = SourceBase; - predicate callableFromSource(SummarizedCallableBase c) { c.hasBody() } DataFlowCallable getSummarizedCallableAsDataFlowCallable(SummarizedCallableBase c) { From 2d69fc39e538a8c7d92357e327769add57e99778 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 27 Aug 2026 19:29:54 +0200 Subject: [PATCH 0614/2098] Rust: Derive source/sink/barrier MaD implementation models from trait models --- .../lib/codeql/rust/dataflow/FlowBarrier.qll | 12 +- rust/ql/lib/codeql/rust/dataflow/FlowSink.qll | 4 +- .../lib/codeql/rust/dataflow/FlowSource.qll | 4 +- .../dataflow/internal/FlowSummaryImpl.qll | 15 +- .../rust/dataflow/internal/ModelsAsData.qll | 117 ++++--- .../codeql/rust/internal/PathResolution.qll | 6 + .../dataflow/barrier/inline-flow.expected | 6 - .../library-tests/dataflow/barrier/main.rs | 2 +- .../library-tests/dataflow/models/main.rs | 4 +- .../dataflow/models/models.expected | 300 ++++++++++-------- .../CryptographicOperations.expected | 30 ++ .../WeakSensitiveDataHashing.expected | 68 +++- .../CWE-327/WeakSensitiveDataHashing/test.rs | 60 ++-- .../HardcodedCryptographicValue.expected | 193 ++++++++--- .../security/CWE-798/test_cipher.rs | 32 +- 15 files changed, 552 insertions(+), 301 deletions(-) diff --git a/rust/ql/lib/codeql/rust/dataflow/FlowBarrier.qll b/rust/ql/lib/codeql/rust/dataflow/FlowBarrier.qll index 49e1d6769219..c81976f1f280 100644 --- a/rust/ql/lib/codeql/rust/dataflow/FlowBarrier.qll +++ b/rust/ql/lib/codeql/rust/dataflow/FlowBarrier.qll @@ -44,9 +44,9 @@ module FlowBarrier { Range() { any() } override predicate isBarrier( - string output, string kind, Impl::Public::Provenance provenance, string model + string output, string kind, Impl::Public::Provenance provenance, boolean isExact, string model ) { - this.isBarrier(output, kind) and provenance = "manual" and model = "" + this.isBarrier(output, kind) and provenance = "manual" and isExact = true and model = "" } /** @@ -67,9 +67,13 @@ module FlowBarrierGuard { Range() { any() } override predicate isBarrierGuard( - string input, string branch, string kind, Impl::Public::Provenance provenance, string model + string input, string branch, string kind, Impl::Public::Provenance provenance, + boolean isExact, string model ) { - this.isBarrierGuard(input, branch, kind) and provenance = "manual" and model = "" + this.isBarrierGuard(input, branch, kind) and + provenance = "manual" and + isExact = true and + model = "" } /** diff --git a/rust/ql/lib/codeql/rust/dataflow/FlowSink.qll b/rust/ql/lib/codeql/rust/dataflow/FlowSink.qll index d4883b7b1b9c..0e800afa7c2b 100644 --- a/rust/ql/lib/codeql/rust/dataflow/FlowSink.qll +++ b/rust/ql/lib/codeql/rust/dataflow/FlowSink.qll @@ -36,9 +36,9 @@ module FlowSink { Range() { any() } override predicate isSink( - string input, string kind, Impl::Public::Provenance provenance, string model + string input, string kind, Impl::Public::Provenance provenance, boolean isExact, string model ) { - this.isSink(input, kind) and provenance = "manual" and model = "" + this.isSink(input, kind) and provenance = "manual" and isExact = true and model = "" } /** diff --git a/rust/ql/lib/codeql/rust/dataflow/FlowSource.qll b/rust/ql/lib/codeql/rust/dataflow/FlowSource.qll index 51562fdf83a3..a298d9c1fad6 100644 --- a/rust/ql/lib/codeql/rust/dataflow/FlowSource.qll +++ b/rust/ql/lib/codeql/rust/dataflow/FlowSource.qll @@ -42,9 +42,9 @@ module FlowSource { Range() { any() } override predicate isSource( - string output, string kind, Impl::Public::Provenance provenance, string model + string output, string kind, Impl::Public::Provenance provenance, boolean isExact, string model ) { - this.isSource(output, kind) and provenance = "manual" and model = "" + this.isSource(output, kind) and provenance = "manual" and isExact = true and model = "" } /** diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/FlowSummaryImpl.qll b/rust/ql/lib/codeql/rust/dataflow/internal/FlowSummaryImpl.qll index 10375c2e180a..58932fc2ae46 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/FlowSummaryImpl.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/FlowSummaryImpl.qll @@ -43,17 +43,12 @@ module Input implements InputSig { result.asSummarizedCallable() = c } - class SourceBase = Function; - - class SinkBase = Function; - predicate neutralElement( Input::SummarizedCallableBase c, string kind, string provenance, boolean isExact ) { - exists(string path | - neutralModel(path, kind, provenance, _) and - c.getCanonicalPath() = path and - isExact = true + exists(string path, Provenance orig | + neutralModel(path, kind, orig, _) and + interpretPath(path, c, orig, provenance, isExact) ) } @@ -170,7 +165,7 @@ module Input2 implements Impl::Private::InputSig2 { } SourceSinkReportingElement getASourceReportingElement( - Input::SourceBase source, Impl::Private::SummaryComponent sc + Input::SummarizedCallableBase source, Impl::Private::SummaryComponent sc ) { exists(Call call | call.getResolvedTarget() = source | sc = Impl::Private::SummaryComponent::return(_) and @@ -200,7 +195,7 @@ module Input2 implements Impl::Private::InputSig2 { } SourceSinkReportingElement getASinkReportingElement( - Input::SinkBase sink, Impl::Private::SummaryComponent sc + Input::SummarizedCallableBase sink, Impl::Private::SummaryComponent sc ) { exists(Call call | call.getResolvedTarget() = sink and diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll b/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll index fddf1bbb5fab..3949ebbb7900 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll @@ -174,6 +174,26 @@ predicate interpretModelForTest(QlBuiltins::ExtensionId madId, string model) { ) } +bindingset[path] +pragma[inline_late] +private Function interpretPath0(string path) { path = result.getCanonicalPath() } + +bindingset[path, orig] +pragma[inline_late] +predicate interpretPath(string path, Function f, Provenance orig, Provenance p, boolean isExact) { + exists(Function f0 | f0 = interpretPath0(path) | + f = f0 and + isExact = true and + p = orig + or + f.implements(f0) and + isExact = false and + // making inherited models generated means that source code definitions and + // exact generated models take precedence + p = "hq-generated" + ) +} + private class SummarizedCallableFromModel extends SummarizedCallable::Range { string input_; string output_; @@ -183,19 +203,9 @@ private class SummarizedCallableFromModel extends SummarizedCallable::Range { QlBuiltins::ExtensionId madId; SummarizedCallableFromModel() { - exists(string path, Function f, Provenance p | + exists(string path, Provenance p | summaryModel(path, input_, output_, kind, p, madId) and - f.getCanonicalPath() = path - | - this = f and - isExact_ = true and - p_ = p - or - this.implements(f) and - isExact_ = false and - // making inherited models generated means that source code definitions and - // exact generated models take precedence - p_ = "hq-generated" + interpretPath(path, this, p, p_, isExact_) ) } @@ -246,78 +256,97 @@ private class SummarizedCallableWithCallback extends SummarizedCallable::Range { private class FlowSourceFromModel extends FlowSource::Range { private string path; + private string kind_; + private Provenance orig; + private Provenance p_; + private boolean isExact_; FlowSourceFromModel() { - sourceModel(path, _, _, _, _) and - this.getCanonicalPath() = path + sourceModel(path, _, kind_, orig, _) and + interpretPath(path, this, orig, p_, isExact_) } - override predicate isSource(string output, string kind, Provenance provenance, string model) { + override predicate isSource( + string output, string kind, Provenance provenance, boolean isExact, string model + ) { exists(QlBuiltins::ExtensionId madId | - sourceModel(path, output, kind, provenance, madId) and - model = "MaD:" + madId.toString() - ) and - // Only apply generated models when no neutral model exists - // (the shared code only applies neutral models to summaries at present) - not ( - provenance.isGenerated() and - neutralModel(path, "source", _, _) + sourceModel(path, output, kind, orig, madId) and + model = "MaD:" + madId.toString() and + kind = kind_ and + provenance = p_ and + isExact = isExact_ ) } } private class FlowSinkFromModel extends FlowSink::Range { private string path; + private string kind_; + private Provenance orig; + private Provenance p_; + private boolean isExact_; FlowSinkFromModel() { - sinkModel(path, _, _, _, _) and - this.getCanonicalPath() = path + sinkModel(path, _, kind_, orig, _) and + interpretPath(path, this, orig, p_, isExact_) } - override predicate isSink(string input, string kind, Provenance provenance, string model) { + override predicate isSink( + string input, string kind, Provenance provenance, boolean isExact, string model + ) { exists(QlBuiltins::ExtensionId madId | - sinkModel(path, input, kind, provenance, madId) and - model = "MaD:" + madId.toString() - ) and - // Only apply generated models when no neutral model exists - // (the shared code only applies neutral models to summaries at present) - not ( - provenance.isGenerated() and - neutralModel(path, "sink", _, _) + sinkModel(path, input, kind, orig, madId) and + model = "MaD:" + madId.toString() and + kind = kind_ and + provenance = p_ and + isExact = isExact_ ) } } private class FlowBarrierFromModel extends FlowBarrier::Range { private string path; + private Provenance orig; + private Provenance p_; + private boolean isExact_; FlowBarrierFromModel() { - barrierModel(path, _, _, _, _) and - this.getCanonicalPath() = path + barrierModel(path, _, _, orig, _) and + interpretPath(path, this, orig, p_, isExact_) } - override predicate isBarrier(string output, string kind, Provenance provenance, string model) { + override predicate isBarrier( + string output, string kind, Provenance provenance, boolean isExact, string model + ) { exists(QlBuiltins::ExtensionId madId | - barrierModel(path, output, kind, provenance, madId) and - model = "MaD:" + madId.toString() + barrierModel(path, output, kind, orig, madId) and + model = "MaD:" + madId.toString() and + provenance = p_ and + isExact = isExact_ ) } } private class FlowBarrierGuardFromModel extends FlowBarrierGuard::Range { private string path; + private Provenance orig; + private Provenance p_; + private boolean isExact_; FlowBarrierGuardFromModel() { - barrierGuardModel(path, _, _, _, _, _) and - this.getCanonicalPath() = path + barrierGuardModel(path, _, _, _, orig, _) and + interpretPath(path, this, orig, p_, isExact_) } override predicate isBarrierGuard( - string input, string acceptingValue, string kind, Provenance provenance, string model + string input, string acceptingValue, string kind, Provenance provenance, boolean isExact, + string model ) { exists(QlBuiltins::ExtensionId madId | - barrierGuardModel(path, input, acceptingValue, kind, provenance, madId) and - model = "MaD:" + madId.toString() + barrierGuardModel(path, input, acceptingValue, kind, orig, madId) and + model = "MaD:" + madId.toString() and + provenance = p_ and + isExact = isExact_ ) } } diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index 42f3f1d5ba3e..bd9322487161 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -2409,4 +2409,10 @@ private module Debug { result = i.getCanonicalPath(c) and i = getRelevantLocatable() } + + predicate debugCallTargetCanonicalPath(Call call, Function f, string path) { + call = getRelevantLocatable() and + f = call.getStaticTarget() and + path = f.getCanonicalPath() + } } diff --git a/rust/ql/test/library-tests/dataflow/barrier/inline-flow.expected b/rust/ql/test/library-tests/dataflow/barrier/inline-flow.expected index 28b65bb8a68f..0514da67333d 100644 --- a/rust/ql/test/library-tests/dataflow/barrier/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/barrier/inline-flow.expected @@ -4,8 +4,6 @@ edges | main.rs:21:13:21:21 | source(...) | main.rs:21:9:21:9 | s | provenance | | | main.rs:32:9:32:9 | s | main.rs:33:10:33:10 | s | provenance | | | main.rs:32:13:32:21 | source(...) | main.rs:32:9:32:9 | s | provenance | | -| main.rs:63:9:63:9 | s | main.rs:65:10:65:10 | s | provenance | | -| main.rs:63:13:63:21 | source(...) | main.rs:63:9:63:9 | s | provenance | | nodes | main.rs:17:10:17:18 | source(...) | semmle.label | source(...) | | main.rs:21:9:21:9 | s | semmle.label | s | @@ -14,13 +12,9 @@ nodes | main.rs:32:9:32:9 | s | semmle.label | s | | main.rs:32:13:32:21 | source(...) | semmle.label | source(...) | | main.rs:33:10:33:10 | s | semmle.label | s | -| main.rs:63:9:63:9 | s | semmle.label | s | -| main.rs:63:13:63:21 | source(...) | semmle.label | source(...) | -| main.rs:65:10:65:10 | s | semmle.label | s | subpaths testFailures #select | main.rs:17:10:17:18 | source(...) | main.rs:17:10:17:18 | source(...) | main.rs:17:10:17:18 | source(...) | $@ | main.rs:17:10:17:18 | source(...) | source(...) | | main.rs:22:10:22:10 | s | main.rs:21:13:21:21 | source(...) | main.rs:22:10:22:10 | s | $@ | main.rs:21:13:21:21 | source(...) | source(...) | | main.rs:33:10:33:10 | s | main.rs:32:13:32:21 | source(...) | main.rs:33:10:33:10 | s | $@ | main.rs:32:13:32:21 | source(...) | source(...) | -| main.rs:65:10:65:10 | s | main.rs:63:13:63:21 | source(...) | main.rs:65:10:65:10 | s | $@ | main.rs:63:13:63:21 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/barrier/main.rs b/rust/ql/test/library-tests/dataflow/barrier/main.rs index 7c186f0feb28..f0467631fff8 100644 --- a/rust/ql/test/library-tests/dataflow/barrier/main.rs +++ b/rust/ql/test/library-tests/dataflow/barrier/main.rs @@ -62,7 +62,7 @@ impl MyBarrierTrait3 for T { fn with_trait_barriers() { let s = source(2); <()>::sanitize2(s); - sink(s); // $ SPURIOUS: hasValueFlow=2 + sink(s); let s = source(3); <()>::sanitize3(s); diff --git a/rust/ql/test/library-tests/dataflow/models/main.rs b/rust/ql/test/library-tests/dataflow/models/main.rs index a9c6d6c9c409..b005f11d546a 100644 --- a/rust/ql/test/library-tests/dataflow/models/main.rs +++ b/rust/ql/test/library-tests/dataflow/models/main.rs @@ -527,12 +527,12 @@ fn test_trait_model(x: T) { sink(x9); // $ hasValueFlow=30 let x10 = <()>::produce2(31); - sink(x10); // $ MISSING: hasValueFlow=31 + sink(x10); // $ hasValueFlow=31 let x11 = <()>::produce3(32); sink(x11); // $ hasValueFlow=32 - <()>::consume2(source(33)); // $ MISSING: hasValueFlow=33 + <()>::consume2(source(33)); // $ hasValueFlow=33 <()>::consume3(source(34)); // $ hasValueFlow=34 } diff --git a/rust/ql/test/library-tests/dataflow/models/models.expected b/rust/ql/test/library-tests/dataflow/models/models.expected index 050ff912293a..3988b6d77fae 100644 --- a/rust/ql/test/library-tests/dataflow/models/models.expected +++ b/rust/ql/test/library-tests/dataflow/models/models.expected @@ -1,46 +1,48 @@ models | 1 | Sink: <_ as main::MySinkTrait3>::consume3; Argument[0]; test-sink | | 2 | Sink: ::sink; Argument[self].Field[main::MyFieldEnum::D::field_d]; test-sink | -| 3 | Sink: main::enum_sink; Argument[0].Field[main::MyFieldEnum::C::field_c]; test-sink | -| 4 | Sink: main::enum_sink_nested; Argument[0].Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-sink | -| 5 | Sink: main::external_file::generated_sink; Argument[0]; test-sink | -| 6 | Sink: main::external_file::neutral_manual_sink; Argument[0]; test-sink | -| 7 | Sink: main::simple_sink; Argument[0]; test-sink | -| 8 | Sink: main::sink_out_of_function::pass_sink; Argument[0].ReturnValue; test-sink | -| 9 | Sink: main::sink_out_of_function::pass_sink_nested; Argument[0].ReturnValue.Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-sink | -| 10 | Source: <_ as main::MySourceTrait3>::produce3; ReturnValue; test-source | -| 11 | Source: ::source; ReturnValue.Field[main::MyFieldEnum::C::field_c]; test-source | -| 12 | Source: ::test_param_source; Parameter[0]; test-source | -| 13 | Source: main::arg_source; Argument[0]; test-source | -| 14 | Source: main::enum_source; ReturnValue.Field[main::MyFieldEnum::D::field_d]; test-source | -| 15 | Source: main::enum_source_nested; ReturnValue.Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-source | -| 16 | Source: main::external_file::generated_source; ReturnValue; test-source | -| 17 | Source: main::external_file::neutral_manual_source; ReturnValue; test-source | -| 18 | Source: main::simple_source; ReturnValue; test-source | -| 19 | Source: main::source_into_function::pass_source; Argument[1].Parameter[0]; test-source | -| 20 | Source: main::source_into_function::pass_source_nested; Argument[1].Parameter[0].Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-source | -| 21 | Summary: <_ as main::MyTrait3>::flow_through3; Argument[0]; ReturnValue; value | -| 22 | Summary: ::max; Argument[self,0]; ReturnValue; value | -| 23 | Summary: ::lt; Argument[self].Reference; ReturnValue; taint | -| 24 | Summary: ::index; Argument[self].Reference.Element; ReturnValue.Reference; value | -| 25 | Summary: ::flow_through2; Argument[0]; ReturnValue; value | -| 26 | Summary: main::apply; Argument[0]; Argument[1].Parameter[0]; value | -| 27 | Summary: main::apply; Argument[1].ReturnValue; ReturnValue; value | -| 28 | Summary: main::coerce; Argument[0]; ReturnValue; taint | -| 29 | Summary: main::external_file::generated_summary; Argument[0]; ReturnValue; value | -| 30 | Summary: main::external_file::neutral_manual_summary; Argument[0]; ReturnValue; value | -| 31 | Summary: main::get_array_element; Argument[0].Element; ReturnValue; value | -| 32 | Summary: main::get_async_number; Argument[0]; ReturnValue.Future; value | -| 33 | Summary: main::get_struct_field; Argument[0].Field[main::MyStruct::field1]; ReturnValue; value | -| 34 | Summary: main::get_tuple_element; Argument[0].Field[0]; ReturnValue; value | -| 35 | Summary: main::get_var_field; Argument[0].Field[main::MyFieldEnum::C::field_c]; ReturnValue; value | -| 36 | Summary: main::get_var_pos; Argument[0].Field[main::MyPosEnum::A(0)]; ReturnValue; value | -| 37 | Summary: main::set_array_element; Argument[0]; ReturnValue.Element; value | -| 38 | Summary: main::set_struct_field; Argument[0]; ReturnValue.Field[main::MyStruct::field2]; value | -| 39 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value | -| 40 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value | -| 41 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value | -| 42 | Summary: main::snd; Argument[1]; ReturnValue; value | +| 3 | Sink: ::consume2; Argument[0]; test-sink | +| 4 | Sink: main::enum_sink; Argument[0].Field[main::MyFieldEnum::C::field_c]; test-sink | +| 5 | Sink: main::enum_sink_nested; Argument[0].Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-sink | +| 6 | Sink: main::external_file::generated_sink; Argument[0]; test-sink | +| 7 | Sink: main::external_file::neutral_manual_sink; Argument[0]; test-sink | +| 8 | Sink: main::simple_sink; Argument[0]; test-sink | +| 9 | Sink: main::sink_out_of_function::pass_sink; Argument[0].ReturnValue; test-sink | +| 10 | Sink: main::sink_out_of_function::pass_sink_nested; Argument[0].ReturnValue.Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-sink | +| 11 | Source: <_ as main::MySourceTrait3>::produce3; ReturnValue; test-source | +| 12 | Source: ::source; ReturnValue.Field[main::MyFieldEnum::C::field_c]; test-source | +| 13 | Source: ::test_param_source; Parameter[0]; test-source | +| 14 | Source: ::produce2; ReturnValue; test-source | +| 15 | Source: main::arg_source; Argument[0]; test-source | +| 16 | Source: main::enum_source; ReturnValue.Field[main::MyFieldEnum::D::field_d]; test-source | +| 17 | Source: main::enum_source_nested; ReturnValue.Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-source | +| 18 | Source: main::external_file::generated_source; ReturnValue; test-source | +| 19 | Source: main::external_file::neutral_manual_source; ReturnValue; test-source | +| 20 | Source: main::simple_source; ReturnValue; test-source | +| 21 | Source: main::source_into_function::pass_source; Argument[1].Parameter[0]; test-source | +| 22 | Source: main::source_into_function::pass_source_nested; Argument[1].Parameter[0].Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-source | +| 23 | Summary: <_ as main::MyTrait3>::flow_through3; Argument[0]; ReturnValue; value | +| 24 | Summary: ::max; Argument[self,0]; ReturnValue; value | +| 25 | Summary: ::lt; Argument[self].Reference; ReturnValue; taint | +| 26 | Summary: ::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 27 | Summary: ::flow_through2; Argument[0]; ReturnValue; value | +| 28 | Summary: main::apply; Argument[0]; Argument[1].Parameter[0]; value | +| 29 | Summary: main::apply; Argument[1].ReturnValue; ReturnValue; value | +| 30 | Summary: main::coerce; Argument[0]; ReturnValue; taint | +| 31 | Summary: main::external_file::generated_summary; Argument[0]; ReturnValue; value | +| 32 | Summary: main::external_file::neutral_manual_summary; Argument[0]; ReturnValue; value | +| 33 | Summary: main::get_array_element; Argument[0].Element; ReturnValue; value | +| 34 | Summary: main::get_async_number; Argument[0]; ReturnValue.Future; value | +| 35 | Summary: main::get_struct_field; Argument[0].Field[main::MyStruct::field1]; ReturnValue; value | +| 36 | Summary: main::get_tuple_element; Argument[0].Field[0]; ReturnValue; value | +| 37 | Summary: main::get_var_field; Argument[0].Field[main::MyFieldEnum::C::field_c]; ReturnValue; value | +| 38 | Summary: main::get_var_pos; Argument[0].Field[main::MyPosEnum::A(0)]; ReturnValue; value | +| 39 | Summary: main::set_array_element; Argument[0]; ReturnValue.Element; value | +| 40 | Summary: main::set_struct_field; Argument[0]; ReturnValue.Field[main::MyStruct::field2]; value | +| 41 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value | +| 42 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value | +| 43 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value | +| 44 | Summary: main::snd; Argument[1]; ReturnValue; value | edges | main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | | | main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | | @@ -50,13 +52,13 @@ edges | main.rs:16:19:16:19 | s | main.rs:16:10:16:20 | identity(...) | provenance | QL | | main.rs:25:9:25:9 | s | main.rs:26:17:26:17 | s | provenance | | | main.rs:25:13:25:22 | source(...) | main.rs:25:9:25:9 | s | provenance | | -| main.rs:26:17:26:17 | s | main.rs:26:10:26:18 | coerce(...) | provenance | MaD:28 | +| main.rs:26:17:26:17 | s | main.rs:26:10:26:18 | coerce(...) | provenance | MaD:30 | | main.rs:41:9:41:10 | s1 | main.rs:42:17:42:18 | s1 | provenance | | | main.rs:41:9:41:10 | s1 | main.rs:42:17:42:18 | s1 | provenance | | | main.rs:41:14:41:23 | source(...) | main.rs:41:9:41:10 | s1 | provenance | | | main.rs:41:14:41:23 | source(...) | main.rs:41:9:41:10 | s1 | provenance | | -| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:42 | -| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:42 | +| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:44 | +| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:44 | | main.rs:54:9:54:9 | s | main.rs:55:27:55:27 | s | provenance | | | main.rs:54:9:54:9 | s | main.rs:55:27:55:27 | s | provenance | | | main.rs:54:13:54:21 | source(...) | main.rs:54:9:54:9 | s | provenance | | @@ -67,8 +69,8 @@ edges | main.rs:55:14:55:28 | ...::A(...) [A] | main.rs:55:9:55:10 | e1 [A] | provenance | | | main.rs:55:27:55:27 | s | main.rs:55:14:55:28 | ...::A(...) [A] | provenance | | | main.rs:55:27:55:27 | s | main.rs:55:14:55:28 | ...::A(...) [A] | provenance | | -| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:36 | -| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:36 | +| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:38 | +| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:38 | | main.rs:67:9:67:9 | s | main.rs:68:26:68:26 | s | provenance | | | main.rs:67:9:67:9 | s | main.rs:68:26:68:26 | s | provenance | | | main.rs:67:13:67:21 | source(...) | main.rs:67:9:67:9 | s | provenance | | @@ -77,8 +79,8 @@ edges | main.rs:68:9:68:10 | e1 [B] | main.rs:69:11:69:12 | e1 [B] | provenance | | | main.rs:68:14:68:27 | set_var_pos(...) [B] | main.rs:68:9:68:10 | e1 [B] | provenance | | | main.rs:68:14:68:27 | set_var_pos(...) [B] | main.rs:68:9:68:10 | e1 [B] | provenance | | -| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:41 | -| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:41 | +| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:43 | +| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:43 | | main.rs:69:11:69:12 | e1 [B] | main.rs:71:9:71:23 | ...::B(...) [B] | provenance | | | main.rs:69:11:69:12 | e1 [B] | main.rs:71:9:71:23 | ...::B(...) [B] | provenance | | | main.rs:71:9:71:23 | ...::B(...) [B] | main.rs:71:22:71:22 | i | provenance | | @@ -95,8 +97,8 @@ edges | main.rs:88:14:88:42 | ...::C {...} [C] | main.rs:88:9:88:10 | e1 [C] | provenance | | | main.rs:88:40:88:40 | s | main.rs:88:14:88:42 | ...::C {...} [C] | provenance | | | main.rs:88:40:88:40 | s | main.rs:88:14:88:42 | ...::C {...} [C] | provenance | | -| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:35 | -| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:35 | +| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:37 | +| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:37 | | main.rs:100:9:100:9 | s | main.rs:101:28:101:28 | s | provenance | | | main.rs:100:9:100:9 | s | main.rs:101:28:101:28 | s | provenance | | | main.rs:100:13:100:21 | source(...) | main.rs:100:9:100:9 | s | provenance | | @@ -105,8 +107,8 @@ edges | main.rs:101:9:101:10 | e1 [D] | main.rs:102:11:102:12 | e1 [D] | provenance | | | main.rs:101:14:101:29 | set_var_field(...) [D] | main.rs:101:9:101:10 | e1 [D] | provenance | | | main.rs:101:14:101:29 | set_var_field(...) [D] | main.rs:101:9:101:10 | e1 [D] | provenance | | -| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:40 | -| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:40 | +| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:42 | +| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:42 | | main.rs:102:11:102:12 | e1 [D] | main.rs:104:9:104:37 | ...::D {...} [D] | provenance | | | main.rs:102:11:102:12 | e1 [D] | main.rs:104:9:104:37 | ...::D {...} [D] | provenance | | | main.rs:104:9:104:37 | ...::D {...} [D] | main.rs:104:35:104:35 | i | provenance | | @@ -123,8 +125,8 @@ edges | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | main.rs:121:9:121:17 | my_struct [MyStruct.field1] | provenance | | | main.rs:122:17:122:17 | s | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | provenance | | | main.rs:122:17:122:17 | s | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | provenance | | -| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:33 | -| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:33 | +| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:35 | +| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:35 | | main.rs:142:9:142:9 | s | main.rs:143:38:143:38 | s | provenance | | | main.rs:142:9:142:9 | s | main.rs:143:38:143:38 | s | provenance | | | main.rs:142:13:142:21 | source(...) | main.rs:142:9:142:9 | s | provenance | | @@ -133,16 +135,16 @@ edges | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | provenance | | | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | provenance | | | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | provenance | | -| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:38 | -| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:38 | +| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:40 | +| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:40 | | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | main.rs:145:10:145:25 | my_struct.field2 | provenance | | | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | main.rs:145:10:145:25 | my_struct.field2 | provenance | | | main.rs:154:9:154:9 | s | main.rs:155:29:155:29 | s | provenance | | | main.rs:154:9:154:9 | s | main.rs:155:29:155:29 | s | provenance | | | main.rs:154:13:154:21 | source(...) | main.rs:154:9:154:9 | s | provenance | | | main.rs:154:13:154:21 | source(...) | main.rs:154:9:154:9 | s | provenance | | -| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:31 | -| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:31 | +| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:33 | +| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:33 | | main.rs:155:29:155:29 | s | main.rs:155:28:155:30 | [...] [element] | provenance | | | main.rs:155:29:155:29 | s | main.rs:155:28:155:30 | [...] [element] | provenance | | | main.rs:164:9:164:9 | s | main.rs:165:33:165:33 | s | provenance | | @@ -153,10 +155,10 @@ edges | main.rs:165:9:165:11 | arr [element] | main.rs:166:10:166:12 | arr [element] | provenance | | | main.rs:165:15:165:34 | set_array_element(...) [element] | main.rs:165:9:165:11 | arr [element] | provenance | | | main.rs:165:15:165:34 | set_array_element(...) [element] | main.rs:165:9:165:11 | arr [element] | provenance | | -| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:37 | -| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:37 | -| main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:24 | -| main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:24 | +| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:39 | +| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:39 | +| main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:26 | +| main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:26 | | main.rs:175:9:175:9 | s | main.rs:176:14:176:14 | s | provenance | | | main.rs:175:9:175:9 | s | main.rs:176:14:176:14 | s | provenance | | | main.rs:175:13:175:22 | source(...) | main.rs:175:9:175:9 | s | provenance | | @@ -167,8 +169,8 @@ edges | main.rs:176:13:176:18 | TupleExpr [tuple.0] | main.rs:176:9:176:9 | t [tuple.0] | provenance | | | main.rs:176:14:176:14 | s | main.rs:176:13:176:18 | TupleExpr [tuple.0] | provenance | | | main.rs:176:14:176:14 | s | main.rs:176:13:176:18 | TupleExpr [tuple.0] | provenance | | -| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:34 | -| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:34 | +| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:36 | +| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:36 | | main.rs:188:9:188:9 | s | main.rs:189:31:189:31 | s | provenance | | | main.rs:188:9:188:9 | s | main.rs:189:31:189:31 | s | provenance | | | main.rs:188:13:188:22 | source(...) | main.rs:188:9:188:9 | s | provenance | | @@ -177,8 +179,8 @@ edges | main.rs:189:9:189:9 | t [tuple.1] | main.rs:191:10:191:10 | t [tuple.1] | provenance | | | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | main.rs:189:9:189:9 | t [tuple.1] | provenance | | | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | main.rs:189:9:189:9 | t [tuple.1] | provenance | | -| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:39 | -| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:39 | +| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:41 | +| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:41 | | main.rs:191:10:191:10 | t [tuple.1] | main.rs:191:10:191:12 | t.1 | provenance | | | main.rs:191:10:191:10 | t [tuple.1] | main.rs:191:10:191:12 | t.1 | provenance | | | main.rs:203:9:203:9 | s | main.rs:208:11:208:11 | s | provenance | | @@ -187,8 +189,8 @@ edges | main.rs:203:13:203:22 | source(...) | main.rs:203:9:203:9 | s | provenance | | | main.rs:204:14:204:14 | ... | main.rs:205:14:205:14 | n | provenance | | | main.rs:204:14:204:14 | ... | main.rs:205:14:205:14 | n | provenance | | -| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:26 | -| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:26 | +| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:28 | +| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:28 | | main.rs:212:13:212:22 | source(...) | main.rs:214:23:214:23 | f [captured s] | provenance | | | main.rs:212:13:212:22 | source(...) | main.rs:214:23:214:23 | f [captured s] | provenance | | | main.rs:213:40:213:40 | s | main.rs:213:17:213:42 | if ... {...} else {...} | provenance | | @@ -197,14 +199,14 @@ edges | main.rs:214:9:214:9 | t | main.rs:215:10:215:10 | t | provenance | | | main.rs:214:13:214:24 | apply(...) | main.rs:214:9:214:9 | t | provenance | | | main.rs:214:13:214:24 | apply(...) | main.rs:214:9:214:9 | t | provenance | | -| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:26 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:26 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:27 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:27 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:26 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:26 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:27 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:27 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:28 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:28 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:29 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:29 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:28 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:28 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:29 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:29 | | main.rs:219:9:219:9 | s | main.rs:221:19:221:19 | s | provenance | | | main.rs:219:9:219:9 | s | main.rs:221:19:221:19 | s | provenance | | | main.rs:219:13:219:22 | source(...) | main.rs:219:9:219:9 | s | provenance | | @@ -215,10 +217,10 @@ edges | main.rs:221:9:221:9 | t | main.rs:222:10:222:10 | t | provenance | | | main.rs:221:13:221:23 | apply(...) | main.rs:221:9:221:9 | t | provenance | | | main.rs:221:13:221:23 | apply(...) | main.rs:221:9:221:9 | t | provenance | | -| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | provenance | MaD:26 | -| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | provenance | MaD:26 | -| main.rs:221:19:221:19 | s | main.rs:221:13:221:23 | apply(...) | provenance | MaD:26 | -| main.rs:221:19:221:19 | s | main.rs:221:13:221:23 | apply(...) | provenance | MaD:26 | +| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | provenance | MaD:28 | +| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | provenance | MaD:28 | +| main.rs:221:19:221:19 | s | main.rs:221:13:221:23 | apply(...) | provenance | MaD:28 | +| main.rs:221:19:221:19 | s | main.rs:221:13:221:23 | apply(...) | provenance | MaD:28 | | main.rs:231:9:231:9 | s | main.rs:232:30:232:30 | s | provenance | | | main.rs:231:9:231:9 | s | main.rs:232:30:232:30 | s | provenance | | | main.rs:231:13:231:22 | source(...) | main.rs:231:9:231:9 | s | provenance | | @@ -229,12 +231,12 @@ edges | main.rs:232:13:232:31 | get_async_number(...) [future] | main.rs:232:13:232:37 | await ... | provenance | | | main.rs:232:13:232:37 | await ... | main.rs:232:9:232:9 | t | provenance | | | main.rs:232:13:232:37 | await ... | main.rs:232:9:232:9 | t | provenance | | -| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:32 | -| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:32 | +| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:34 | +| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:34 | | main.rs:257:9:257:9 | s [D] | main.rs:258:11:258:11 | s [D] | provenance | | | main.rs:257:9:257:9 | s [D] | main.rs:258:11:258:11 | s [D] | provenance | | -| main.rs:257:13:257:27 | enum_source(...) | main.rs:257:9:257:9 | s [D] | provenance | Src:MaD:14 | -| main.rs:257:13:257:27 | enum_source(...) | main.rs:257:9:257:9 | s [D] | provenance | Src:MaD:14 | +| main.rs:257:13:257:27 | enum_source(...) | main.rs:257:9:257:9 | s [D] | provenance | Src:MaD:16 | +| main.rs:257:13:257:27 | enum_source(...) | main.rs:257:9:257:9 | s [D] | provenance | Src:MaD:16 | | main.rs:258:11:258:11 | s [D] | main.rs:260:9:260:37 | ...::D {...} [D] | provenance | | | main.rs:258:11:258:11 | s [D] | main.rs:260:9:260:37 | ...::D {...} [D] | provenance | | | main.rs:260:9:260:37 | ...::D {...} [D] | main.rs:260:35:260:35 | i | provenance | | @@ -243,8 +245,8 @@ edges | main.rs:260:35:260:35 | i | main.rs:260:47:260:47 | i | provenance | | | main.rs:264:9:264:9 | s [E, Some] | main.rs:265:11:265:11 | s [E, Some] | provenance | | | main.rs:264:9:264:9 | s [E, Some] | main.rs:265:11:265:11 | s [E, Some] | provenance | | -| main.rs:264:13:264:34 | enum_source_nested(...) | main.rs:264:9:264:9 | s [E, Some] | provenance | Src:MaD:15 | -| main.rs:264:13:264:34 | enum_source_nested(...) | main.rs:264:9:264:9 | s [E, Some] | provenance | Src:MaD:15 | +| main.rs:264:13:264:34 | enum_source_nested(...) | main.rs:264:9:264:9 | s [E, Some] | provenance | Src:MaD:17 | +| main.rs:264:13:264:34 | enum_source_nested(...) | main.rs:264:9:264:9 | s [E, Some] | provenance | Src:MaD:17 | | main.rs:265:11:265:11 | s [E, Some] | main.rs:268:9:268:37 | ...::E {...} [E, Some] | provenance | | | main.rs:265:11:265:11 | s [E, Some] | main.rs:268:9:268:37 | ...::E {...} [E, Some] | provenance | | | main.rs:268:9:268:37 | ...::E {...} [E, Some] | main.rs:268:35:268:35 | o [Some] | provenance | | @@ -259,24 +261,24 @@ edges | main.rs:270:22:270:22 | i | main.rs:270:33:270:33 | i | provenance | | | main.rs:279:9:279:9 | s [C] | main.rs:280:11:280:11 | s [C] | provenance | | | main.rs:279:9:279:9 | s [C] | main.rs:280:11:280:11 | s [C] | provenance | | -| main.rs:279:13:279:24 | e.source(...) | main.rs:279:9:279:9 | s [C] | provenance | Src:MaD:11 | -| main.rs:279:13:279:24 | e.source(...) | main.rs:279:9:279:9 | s [C] | provenance | Src:MaD:11 | +| main.rs:279:13:279:24 | e.source(...) | main.rs:279:9:279:9 | s [C] | provenance | Src:MaD:12 | +| main.rs:279:13:279:24 | e.source(...) | main.rs:279:9:279:9 | s [C] | provenance | Src:MaD:12 | | main.rs:280:11:280:11 | s [C] | main.rs:281:9:281:37 | ...::C {...} [C] | provenance | | | main.rs:280:11:280:11 | s [C] | main.rs:281:9:281:37 | ...::C {...} [C] | provenance | | | main.rs:281:9:281:37 | ...::C {...} [C] | main.rs:281:35:281:35 | i | provenance | | | main.rs:281:9:281:37 | ...::C {...} [C] | main.rs:281:35:281:35 | i | provenance | | | main.rs:281:35:281:35 | i | main.rs:281:47:281:47 | i | provenance | | | main.rs:281:35:281:35 | i | main.rs:281:47:281:47 | i | provenance | | -| main.rs:303:24:303:24 | a | main.rs:302:26:302:26 | a | provenance | Src:MaD:19 | -| main.rs:303:24:303:24 | a | main.rs:302:26:302:26 | a | provenance | Src:MaD:19 | -| main.rs:305:24:307:9 | \|...\| ... | main.rs:306:18:306:18 | a | provenance | Src:MaD:19 | -| main.rs:305:24:307:9 | \|...\| ... | main.rs:306:18:306:18 | a | provenance | Src:MaD:19 | -| main.rs:312:24:312:24 | f | main.rs:310:18:310:18 | a | provenance | Src:MaD:19 | -| main.rs:312:24:312:24 | f | main.rs:310:18:310:18 | a | provenance | Src:MaD:19 | -| main.rs:314:24:316:9 | \|...\| ... | main.rs:315:18:315:18 | a | provenance | Src:MaD:19 | -| main.rs:314:24:316:9 | \|...\| ... | main.rs:315:18:315:18 | a | provenance | Src:MaD:19 | -| main.rs:318:31:329:9 | \|...\| ... | main.rs:318:31:329:9 | \|...\| ... [E, Some] | provenance | Src:MaD:20 | -| main.rs:318:31:329:9 | \|...\| ... | main.rs:318:31:329:9 | \|...\| ... [E, Some] | provenance | Src:MaD:20 | +| main.rs:303:24:303:24 | a | main.rs:302:26:302:26 | a | provenance | Src:MaD:21 | +| main.rs:303:24:303:24 | a | main.rs:302:26:302:26 | a | provenance | Src:MaD:21 | +| main.rs:305:24:307:9 | \|...\| ... | main.rs:306:18:306:18 | a | provenance | Src:MaD:21 | +| main.rs:305:24:307:9 | \|...\| ... | main.rs:306:18:306:18 | a | provenance | Src:MaD:21 | +| main.rs:312:24:312:24 | f | main.rs:310:18:310:18 | a | provenance | Src:MaD:21 | +| main.rs:312:24:312:24 | f | main.rs:310:18:310:18 | a | provenance | Src:MaD:21 | +| main.rs:314:24:316:9 | \|...\| ... | main.rs:315:18:315:18 | a | provenance | Src:MaD:21 | +| main.rs:314:24:316:9 | \|...\| ... | main.rs:315:18:315:18 | a | provenance | Src:MaD:21 | +| main.rs:318:31:329:9 | \|...\| ... | main.rs:318:31:329:9 | \|...\| ... [E, Some] | provenance | Src:MaD:22 | +| main.rs:318:31:329:9 | \|...\| ... | main.rs:318:31:329:9 | \|...\| ... [E, Some] | provenance | Src:MaD:22 | | main.rs:318:31:329:9 | \|...\| ... [E, Some] | main.rs:319:19:319:19 | e [E, Some] | provenance | | | main.rs:318:31:329:9 | \|...\| ... [E, Some] | main.rs:319:19:319:19 | e [E, Some] | provenance | | | main.rs:319:19:319:19 | e [E, Some] | main.rs:322:17:322:45 | ...::E {...} [E, Some] | provenance | | @@ -291,8 +293,8 @@ edges | main.rs:324:25:324:31 | Some(...) [Some] | main.rs:324:30:324:30 | i | provenance | | | main.rs:324:30:324:30 | i | main.rs:324:41:324:41 | i | provenance | | | main.rs:324:30:324:30 | i | main.rs:324:41:324:41 | i | provenance | | -| main.rs:344:21:344:29 | source(...) | main.rs:345:19:345:19 | a | provenance | Sink:MaD:8 | -| main.rs:344:21:344:29 | source(...) | main.rs:345:19:345:19 | a | provenance | Sink:MaD:8 | +| main.rs:344:21:344:29 | source(...) | main.rs:345:19:345:19 | a | provenance | Sink:MaD:9 | +| main.rs:344:21:344:29 | source(...) | main.rs:345:19:345:19 | a | provenance | Sink:MaD:9 | | main.rs:348:17:348:17 | s | main.rs:350:39:350:39 | s | provenance | | | main.rs:348:17:348:17 | s | main.rs:350:39:350:39 | s | provenance | | | main.rs:348:21:348:29 | source(...) | main.rs:348:17:348:17 | s | provenance | | @@ -303,20 +305,20 @@ edges | main.rs:350:26:350:40 | ...::Some(...) [Some] | main.rs:349:13:351:13 | ...::E {...} [E, Some] | provenance | | | main.rs:350:39:350:39 | s | main.rs:350:26:350:40 | ...::Some(...) [Some] | provenance | | | main.rs:350:39:350:39 | s | main.rs:350:26:350:40 | ...::Some(...) [Some] | provenance | | -| main.rs:353:26:353:26 | b [E, Some] | main.rs:353:26:353:26 | b | provenance | Sink:MaD:9 | -| main.rs:353:26:353:26 | b [E, Some] | main.rs:353:26:353:26 | b | provenance | Sink:MaD:9 | +| main.rs:353:26:353:26 | b [E, Some] | main.rs:353:26:353:26 | b | provenance | Sink:MaD:10 | +| main.rs:353:26:353:26 | b [E, Some] | main.rs:353:26:353:26 | b | provenance | Sink:MaD:10 | | main.rs:364:9:364:9 | s | main.rs:365:41:365:41 | s | provenance | | | main.rs:364:9:364:9 | s | main.rs:365:41:365:41 | s | provenance | | | main.rs:364:9:364:9 | s | main.rs:368:53:368:53 | s | provenance | | | main.rs:364:9:364:9 | s | main.rs:368:53:368:53 | s | provenance | | | main.rs:364:13:364:22 | source(...) | main.rs:364:9:364:9 | s | provenance | | | main.rs:364:13:364:22 | source(...) | main.rs:364:9:364:9 | s | provenance | | -| main.rs:365:15:365:43 | ...::C {...} [C] | main.rs:365:15:365:43 | ...::C {...} | provenance | Sink:MaD:3 | -| main.rs:365:15:365:43 | ...::C {...} [C] | main.rs:365:15:365:43 | ...::C {...} | provenance | Sink:MaD:3 | +| main.rs:365:15:365:43 | ...::C {...} [C] | main.rs:365:15:365:43 | ...::C {...} | provenance | Sink:MaD:4 | +| main.rs:365:15:365:43 | ...::C {...} [C] | main.rs:365:15:365:43 | ...::C {...} | provenance | Sink:MaD:4 | | main.rs:365:41:365:41 | s | main.rs:365:15:365:43 | ...::C {...} [C] | provenance | | | main.rs:365:41:365:41 | s | main.rs:365:15:365:43 | ...::C {...} [C] | provenance | | -| main.rs:368:22:368:56 | ...::E {...} [E, Some] | main.rs:368:22:368:56 | ...::E {...} | provenance | Sink:MaD:4 | -| main.rs:368:22:368:56 | ...::E {...} [E, Some] | main.rs:368:22:368:56 | ...::E {...} | provenance | Sink:MaD:4 | +| main.rs:368:22:368:56 | ...::E {...} [E, Some] | main.rs:368:22:368:56 | ...::E {...} | provenance | Sink:MaD:5 | +| main.rs:368:22:368:56 | ...::E {...} [E, Some] | main.rs:368:22:368:56 | ...::E {...} | provenance | Sink:MaD:5 | | main.rs:368:48:368:54 | Some(...) [Some] | main.rs:368:22:368:56 | ...::E {...} [E, Some] | provenance | | | main.rs:368:48:368:54 | Some(...) [Some] | main.rs:368:22:368:56 | ...::E {...} [E, Some] | provenance | | | main.rs:368:53:368:53 | s | main.rs:368:48:368:54 | Some(...) [Some] | provenance | | @@ -333,74 +335,80 @@ edges | main.rs:373:39:373:39 | s | main.rs:373:13:373:41 | ...::D {...} [D] | provenance | | | main.rs:383:9:383:9 | s | main.rs:384:10:384:10 | s | provenance | | | main.rs:383:9:383:9 | s | main.rs:384:10:384:10 | s | provenance | | -| main.rs:383:13:383:29 | simple_source(...) | main.rs:383:9:383:9 | s | provenance | Src:MaD:18 | -| main.rs:383:13:383:29 | simple_source(...) | main.rs:383:9:383:9 | s | provenance | Src:MaD:18 | -| main.rs:391:9:391:9 | s | main.rs:392:17:392:17 | s | provenance | Sink:MaD:7 | -| main.rs:391:9:391:9 | s | main.rs:392:17:392:17 | s | provenance | Sink:MaD:7 | +| main.rs:383:13:383:29 | simple_source(...) | main.rs:383:9:383:9 | s | provenance | Src:MaD:20 | +| main.rs:383:13:383:29 | simple_source(...) | main.rs:383:9:383:9 | s | provenance | Src:MaD:20 | +| main.rs:391:9:391:9 | s | main.rs:392:17:392:17 | s | provenance | Sink:MaD:8 | +| main.rs:391:9:391:9 | s | main.rs:392:17:392:17 | s | provenance | Sink:MaD:8 | | main.rs:391:13:391:22 | source(...) | main.rs:391:9:391:9 | s | provenance | | | main.rs:391:13:391:22 | source(...) | main.rs:391:9:391:9 | s | provenance | | -| main.rs:400:16:400:16 | i | main.rs:401:10:401:10 | i | provenance | Src:MaD:13 | -| main.rs:400:16:400:16 | i | main.rs:401:10:401:10 | i | provenance | Src:MaD:13 | -| main.rs:410:26:410:31 | ...: i64 | main.rs:411:14:411:14 | i | provenance | Src:MaD:12 | -| main.rs:410:26:410:31 | ...: i64 | main.rs:411:14:411:14 | i | provenance | Src:MaD:12 | +| main.rs:400:16:400:16 | i | main.rs:401:10:401:10 | i | provenance | Src:MaD:15 | +| main.rs:400:16:400:16 | i | main.rs:401:10:401:10 | i | provenance | Src:MaD:15 | +| main.rs:410:26:410:31 | ...: i64 | main.rs:411:14:411:14 | i | provenance | Src:MaD:13 | +| main.rs:410:26:410:31 | ...: i64 | main.rs:411:14:411:14 | i | provenance | Src:MaD:13 | | main.rs:495:9:495:10 | x1 | main.rs:496:10:496:11 | x1 | provenance | | | main.rs:495:9:495:10 | x1 | main.rs:496:10:496:11 | x1 | provenance | | -| main.rs:495:14:495:23 | source(...) | main.rs:495:14:495:30 | ... .max(...) | provenance | MaD:22 | -| main.rs:495:14:495:23 | source(...) | main.rs:495:14:495:30 | ... .max(...) | provenance | MaD:22 | +| main.rs:495:14:495:23 | source(...) | main.rs:495:14:495:30 | ... .max(...) | provenance | MaD:24 | +| main.rs:495:14:495:23 | source(...) | main.rs:495:14:495:30 | ... .max(...) | provenance | MaD:24 | | main.rs:495:14:495:30 | ... .max(...) | main.rs:495:9:495:10 | x1 | provenance | | | main.rs:495:14:495:30 | ... .max(...) | main.rs:495:9:495:10 | x1 | provenance | | | main.rs:498:9:498:10 | x2 [MyStruct.field1] | main.rs:506:10:506:11 | x2 [MyStruct.field1] | provenance | | | main.rs:498:9:498:10 | x2 [MyStruct.field1] | main.rs:506:10:506:11 | x2 [MyStruct.field1] | provenance | | | main.rs:498:14:505:6 | ... .max(...) [MyStruct.field1] | main.rs:498:9:498:10 | x2 [MyStruct.field1] | provenance | | | main.rs:498:14:505:6 | ... .max(...) [MyStruct.field1] | main.rs:498:9:498:10 | x2 [MyStruct.field1] | provenance | | -| main.rs:498:15:501:5 | MyStruct {...} [MyStruct.field1] | main.rs:498:14:505:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:22 | -| main.rs:498:15:501:5 | MyStruct {...} [MyStruct.field1] | main.rs:498:14:505:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:22 | +| main.rs:498:15:501:5 | MyStruct {...} [MyStruct.field1] | main.rs:498:14:505:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:24 | +| main.rs:498:15:501:5 | MyStruct {...} [MyStruct.field1] | main.rs:498:14:505:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:24 | | main.rs:499:17:499:26 | source(...) | main.rs:498:15:501:5 | MyStruct {...} [MyStruct.field1] | provenance | | | main.rs:499:17:499:26 | source(...) | main.rs:498:15:501:5 | MyStruct {...} [MyStruct.field1] | provenance | | | main.rs:506:10:506:11 | x2 [MyStruct.field1] | main.rs:506:10:506:18 | x2.field1 | provenance | | | main.rs:506:10:506:11 | x2 [MyStruct.field1] | main.rs:506:10:506:18 | x2.field1 | provenance | | | main.rs:511:9:511:10 | x4 | main.rs:512:10:512:11 | x4 | provenance | | | main.rs:511:9:511:10 | x4 | main.rs:512:10:512:11 | x4 | provenance | | -| main.rs:511:14:511:23 | source(...) | main.rs:511:14:511:30 | ... .max(...) | provenance | MaD:22 | -| main.rs:511:14:511:23 | source(...) | main.rs:511:14:511:30 | ... .max(...) | provenance | MaD:22 | +| main.rs:511:14:511:23 | source(...) | main.rs:511:14:511:30 | ... .max(...) | provenance | MaD:24 | +| main.rs:511:14:511:23 | source(...) | main.rs:511:14:511:30 | ... .max(...) | provenance | MaD:24 | | main.rs:511:14:511:30 | ... .max(...) | main.rs:511:9:511:10 | x4 | provenance | | | main.rs:511:14:511:30 | ... .max(...) | main.rs:511:9:511:10 | x4 | provenance | | | main.rs:514:9:514:10 | x5 | main.rs:515:10:515:11 | x5 | provenance | | -| main.rs:514:14:514:23 | source(...) | main.rs:514:14:514:30 | ... .lt(...) | provenance | MaD:23 | +| main.rs:514:14:514:23 | source(...) | main.rs:514:14:514:30 | ... .lt(...) | provenance | MaD:25 | | main.rs:514:14:514:30 | ... .lt(...) | main.rs:514:9:514:10 | x5 | provenance | | | main.rs:517:9:517:10 | x6 | main.rs:518:10:518:11 | x6 | provenance | | -| main.rs:517:14:517:23 | source(...) | main.rs:517:14:517:27 | ... < ... | provenance | MaD:23 | +| main.rs:517:14:517:23 | source(...) | main.rs:517:14:517:27 | ... < ... | provenance | MaD:25 | | main.rs:517:14:517:27 | ... < ... | main.rs:517:9:517:10 | x6 | provenance | | | main.rs:523:9:523:10 | x8 | main.rs:524:10:524:11 | x8 | provenance | | | main.rs:523:9:523:10 | x8 | main.rs:524:10:524:11 | x8 | provenance | | | main.rs:523:14:523:44 | ...::flow_through2(...) | main.rs:523:9:523:10 | x8 | provenance | | | main.rs:523:14:523:44 | ...::flow_through2(...) | main.rs:523:9:523:10 | x8 | provenance | | -| main.rs:523:34:523:43 | source(...) | main.rs:523:14:523:44 | ...::flow_through2(...) | provenance | MaD:25 | -| main.rs:523:34:523:43 | source(...) | main.rs:523:14:523:44 | ...::flow_through2(...) | provenance | MaD:25 | +| main.rs:523:34:523:43 | source(...) | main.rs:523:14:523:44 | ...::flow_through2(...) | provenance | MaD:27 | +| main.rs:523:34:523:43 | source(...) | main.rs:523:14:523:44 | ...::flow_through2(...) | provenance | MaD:27 | | main.rs:526:9:526:10 | x9 | main.rs:527:10:527:11 | x9 | provenance | | | main.rs:526:9:526:10 | x9 | main.rs:527:10:527:11 | x9 | provenance | | | main.rs:526:14:526:44 | ...::flow_through3(...) | main.rs:526:9:526:10 | x9 | provenance | | | main.rs:526:14:526:44 | ...::flow_through3(...) | main.rs:526:9:526:10 | x9 | provenance | | -| main.rs:526:34:526:43 | source(...) | main.rs:526:14:526:44 | ...::flow_through3(...) | provenance | MaD:21 | -| main.rs:526:34:526:43 | source(...) | main.rs:526:14:526:44 | ...::flow_through3(...) | provenance | MaD:21 | +| main.rs:526:34:526:43 | source(...) | main.rs:526:14:526:44 | ...::flow_through3(...) | provenance | MaD:23 | +| main.rs:526:34:526:43 | source(...) | main.rs:526:14:526:44 | ...::flow_through3(...) | provenance | MaD:23 | +| main.rs:529:9:529:11 | x10 | main.rs:530:10:530:12 | x10 | provenance | | +| main.rs:529:9:529:11 | x10 | main.rs:530:10:530:12 | x10 | provenance | | +| main.rs:529:15:529:32 | ...::produce2(...) | main.rs:529:9:529:11 | x10 | provenance | Src:MaD:14 | +| main.rs:529:15:529:32 | ...::produce2(...) | main.rs:529:9:529:11 | x10 | provenance | Src:MaD:14 | | main.rs:532:9:532:11 | x11 | main.rs:533:10:533:12 | x11 | provenance | | | main.rs:532:9:532:11 | x11 | main.rs:533:10:533:12 | x11 | provenance | | -| main.rs:532:15:532:32 | ...::produce3(...) | main.rs:532:9:532:11 | x11 | provenance | Src:MaD:10 | -| main.rs:532:15:532:32 | ...::produce3(...) | main.rs:532:9:532:11 | x11 | provenance | Src:MaD:10 | +| main.rs:532:15:532:32 | ...::produce3(...) | main.rs:532:9:532:11 | x11 | provenance | Src:MaD:11 | +| main.rs:532:15:532:32 | ...::produce3(...) | main.rs:532:9:532:11 | x11 | provenance | Src:MaD:11 | +| main.rs:535:20:535:29 | source(...) | main.rs:535:20:535:29 | source(...) | provenance | Sink:MaD:3 | +| main.rs:535:20:535:29 | source(...) | main.rs:535:20:535:29 | source(...) | provenance | Sink:MaD:3 | | main.rs:537:20:537:29 | source(...) | main.rs:537:20:537:29 | source(...) | provenance | Sink:MaD:1 | | main.rs:537:20:537:29 | source(...) | main.rs:537:20:537:29 | source(...) | provenance | Sink:MaD:1 | -| main.rs:549:10:549:28 | generated_source(...) | main.rs:549:10:549:28 | generated_source(...) | provenance | Src:MaD:16 | -| main.rs:549:10:549:28 | generated_source(...) | main.rs:549:10:549:28 | generated_source(...) | provenance | Src:MaD:16 | -| main.rs:551:10:551:33 | neutral_manual_source(...) | main.rs:551:10:551:33 | neutral_manual_source(...) | provenance | Src:MaD:17 | -| main.rs:551:10:551:33 | neutral_manual_source(...) | main.rs:551:10:551:33 | neutral_manual_source(...) | provenance | Src:MaD:17 | -| main.rs:552:20:552:28 | source(...) | main.rs:552:20:552:28 | source(...) | provenance | Sink:MaD:5 | -| main.rs:552:20:552:28 | source(...) | main.rs:552:20:552:28 | source(...) | provenance | Sink:MaD:5 | -| main.rs:554:25:554:33 | source(...) | main.rs:554:25:554:33 | source(...) | provenance | Sink:MaD:6 | -| main.rs:554:25:554:33 | source(...) | main.rs:554:25:554:33 | source(...) | provenance | Sink:MaD:6 | -| main.rs:555:28:555:36 | source(...) | main.rs:555:10:555:37 | generated_summary(...) | provenance | MaD:29 | -| main.rs:555:28:555:36 | source(...) | main.rs:555:10:555:37 | generated_summary(...) | provenance | MaD:29 | -| main.rs:557:33:557:41 | source(...) | main.rs:557:10:557:42 | neutral_manual_summary(...) | provenance | MaD:30 | -| main.rs:557:33:557:41 | source(...) | main.rs:557:10:557:42 | neutral_manual_summary(...) | provenance | MaD:30 | +| main.rs:549:10:549:28 | generated_source(...) | main.rs:549:10:549:28 | generated_source(...) | provenance | Src:MaD:18 | +| main.rs:549:10:549:28 | generated_source(...) | main.rs:549:10:549:28 | generated_source(...) | provenance | Src:MaD:18 | +| main.rs:551:10:551:33 | neutral_manual_source(...) | main.rs:551:10:551:33 | neutral_manual_source(...) | provenance | Src:MaD:19 | +| main.rs:551:10:551:33 | neutral_manual_source(...) | main.rs:551:10:551:33 | neutral_manual_source(...) | provenance | Src:MaD:19 | +| main.rs:552:20:552:28 | source(...) | main.rs:552:20:552:28 | source(...) | provenance | Sink:MaD:6 | +| main.rs:552:20:552:28 | source(...) | main.rs:552:20:552:28 | source(...) | provenance | Sink:MaD:6 | +| main.rs:554:25:554:33 | source(...) | main.rs:554:25:554:33 | source(...) | provenance | Sink:MaD:7 | +| main.rs:554:25:554:33 | source(...) | main.rs:554:25:554:33 | source(...) | provenance | Sink:MaD:7 | +| main.rs:555:28:555:36 | source(...) | main.rs:555:10:555:37 | generated_summary(...) | provenance | MaD:31 | +| main.rs:555:28:555:36 | source(...) | main.rs:555:10:555:37 | generated_summary(...) | provenance | MaD:31 | +| main.rs:557:33:557:41 | source(...) | main.rs:557:10:557:42 | neutral_manual_summary(...) | provenance | MaD:32 | +| main.rs:557:33:557:41 | source(...) | main.rs:557:10:557:42 | neutral_manual_summary(...) | provenance | MaD:32 | nodes | main.rs:15:9:15:9 | s | semmle.label | s | | main.rs:15:9:15:9 | s | semmle.label | s | @@ -816,12 +824,22 @@ nodes | main.rs:526:34:526:43 | source(...) | semmle.label | source(...) | | main.rs:527:10:527:11 | x9 | semmle.label | x9 | | main.rs:527:10:527:11 | x9 | semmle.label | x9 | +| main.rs:529:9:529:11 | x10 | semmle.label | x10 | +| main.rs:529:9:529:11 | x10 | semmle.label | x10 | +| main.rs:529:15:529:32 | ...::produce2(...) | semmle.label | ...::produce2(...) | +| main.rs:529:15:529:32 | ...::produce2(...) | semmle.label | ...::produce2(...) | +| main.rs:530:10:530:12 | x10 | semmle.label | x10 | +| main.rs:530:10:530:12 | x10 | semmle.label | x10 | | main.rs:532:9:532:11 | x11 | semmle.label | x11 | | main.rs:532:9:532:11 | x11 | semmle.label | x11 | | main.rs:532:15:532:32 | ...::produce3(...) | semmle.label | ...::produce3(...) | | main.rs:532:15:532:32 | ...::produce3(...) | semmle.label | ...::produce3(...) | | main.rs:533:10:533:12 | x11 | semmle.label | x11 | | main.rs:533:10:533:12 | x11 | semmle.label | x11 | +| main.rs:535:20:535:29 | source(...) | semmle.label | source(...) | +| main.rs:535:20:535:29 | source(...) | semmle.label | source(...) | +| main.rs:535:20:535:29 | source(...) | semmle.label | source(...) | +| main.rs:535:20:535:29 | source(...) | semmle.label | source(...) | | main.rs:537:20:537:29 | source(...) | semmle.label | source(...) | | main.rs:537:20:537:29 | source(...) | semmle.label | source(...) | | main.rs:537:20:537:29 | source(...) | semmle.label | source(...) | @@ -937,8 +955,12 @@ invalidSpecComponent | main.rs:524:10:524:11 | x8 | main.rs:523:34:523:43 | source(...) | main.rs:524:10:524:11 | x8 | $@ | main.rs:523:34:523:43 | source(...) | source(...) | | main.rs:527:10:527:11 | x9 | main.rs:526:34:526:43 | source(...) | main.rs:527:10:527:11 | x9 | $@ | main.rs:526:34:526:43 | source(...) | source(...) | | main.rs:527:10:527:11 | x9 | main.rs:526:34:526:43 | source(...) | main.rs:527:10:527:11 | x9 | $@ | main.rs:526:34:526:43 | source(...) | source(...) | +| main.rs:530:10:530:12 | x10 | main.rs:529:15:529:32 | ...::produce2(...) | main.rs:530:10:530:12 | x10 | $@ | main.rs:529:15:529:32 | ...::produce2(...) | ...::produce2(...) | +| main.rs:530:10:530:12 | x10 | main.rs:529:15:529:32 | ...::produce2(...) | main.rs:530:10:530:12 | x10 | $@ | main.rs:529:15:529:32 | ...::produce2(...) | ...::produce2(...) | | main.rs:533:10:533:12 | x11 | main.rs:532:15:532:32 | ...::produce3(...) | main.rs:533:10:533:12 | x11 | $@ | main.rs:532:15:532:32 | ...::produce3(...) | ...::produce3(...) | | main.rs:533:10:533:12 | x11 | main.rs:532:15:532:32 | ...::produce3(...) | main.rs:533:10:533:12 | x11 | $@ | main.rs:532:15:532:32 | ...::produce3(...) | ...::produce3(...) | +| main.rs:535:20:535:29 | source(...) | main.rs:535:20:535:29 | source(...) | main.rs:535:20:535:29 | source(...) | $@ | main.rs:535:20:535:29 | source(...) | source(...) | +| main.rs:535:20:535:29 | source(...) | main.rs:535:20:535:29 | source(...) | main.rs:535:20:535:29 | source(...) | $@ | main.rs:535:20:535:29 | source(...) | source(...) | | main.rs:537:20:537:29 | source(...) | main.rs:537:20:537:29 | source(...) | main.rs:537:20:537:29 | source(...) | $@ | main.rs:537:20:537:29 | source(...) | source(...) | | main.rs:537:20:537:29 | source(...) | main.rs:537:20:537:29 | source(...) | main.rs:537:20:537:29 | source(...) | $@ | main.rs:537:20:537:29 | source(...) | source(...) | | main.rs:549:10:549:28 | generated_source(...) | main.rs:549:10:549:28 | generated_source(...) | main.rs:549:10:549:28 | generated_source(...) | $@ | main.rs:549:10:549:28 | generated_source(...) | generated_source(...) | diff --git a/rust/ql/test/query-tests/security/CWE-327/WeakSensitiveDataHashing/CryptographicOperations.expected b/rust/ql/test/query-tests/security/CWE-327/WeakSensitiveDataHashing/CryptographicOperations.expected index e9a73ff6fe43..268c02082bfa 100644 --- a/rust/ql/test/query-tests/security/CWE-327/WeakSensitiveDataHashing/CryptographicOperations.expected +++ b/rust/ql/test/query-tests/security/CWE-327/WeakSensitiveDataHashing/CryptographicOperations.expected @@ -1,10 +1,40 @@ +| test.rs:13:26:13:33 | harmless | HashingAlgorithm MD5 WEAK inputs:1 | +| test.rs:14:26:14:39 | credit_card_no | HashingAlgorithm MD5 WEAK inputs:1 | +| test.rs:15:26:15:33 | password | HashingAlgorithm MD5 WEAK inputs:1 | +| test.rs:16:26:16:43 | encrypted_password | HashingAlgorithm MD5 WEAK inputs:1 | | test.rs:19:26:19:33 | harmless | HashingAlgorithm MD5 WEAK inputs:1 | | test.rs:20:26:20:39 | credit_card_no | HashingAlgorithm MD5 WEAK inputs:1 | | test.rs:21:26:21:33 | password | HashingAlgorithm MD5 WEAK inputs:1 | | test.rs:22:26:22:43 | encrypted_password | HashingAlgorithm MD5 WEAK inputs:1 | +| test.rs:25:28:25:35 | harmless | HashingAlgorithm SHA1 WEAK inputs:1 | +| test.rs:26:28:26:41 | credit_card_no | HashingAlgorithm SHA1 WEAK inputs:1 | +| test.rs:27:28:27:35 | password | HashingAlgorithm SHA1 WEAK inputs:1 | +| test.rs:28:28:28:45 | encrypted_password | HashingAlgorithm SHA1 WEAK inputs:1 | +| test.rs:31:36:31:43 | harmless | HashingAlgorithm SHA1 WEAK inputs:1 | +| test.rs:32:36:32:49 | credit_card_no | HashingAlgorithm SHA1 WEAK inputs:1 | +| test.rs:33:36:33:43 | password | HashingAlgorithm SHA1 WEAK inputs:1 | +| test.rs:34:36:34:53 | encrypted_password | HashingAlgorithm SHA1 WEAK inputs:1 | +| test.rs:37:32:37:39 | harmless | HashingAlgorithm SHA3256 inputs:1 | +| test.rs:38:32:38:45 | credit_card_no | HashingAlgorithm SHA3256 inputs:1 | +| test.rs:39:32:39:39 | password | HashingAlgorithm SHA3256 inputs:1 | +| test.rs:40:32:40:49 | encrypted_password | HashingAlgorithm SHA3256 inputs:1 | +| test.rs:59:26:59:37 | harmless_str | HashingAlgorithm MD5 WEAK inputs:1 | +| test.rs:60:26:60:37 | password_str | HashingAlgorithm MD5 WEAK inputs:1 | +| test.rs:61:26:61:37 | harmless_arr | HashingAlgorithm MD5 WEAK inputs:1 | +| test.rs:62:26:62:37 | password_arr | HashingAlgorithm MD5 WEAK inputs:1 | +| test.rs:63:26:63:37 | harmless_vec | HashingAlgorithm MD5 WEAK inputs:1 | +| test.rs:64:26:64:37 | password_vec | HashingAlgorithm MD5 WEAK inputs:1 | | test.rs:67:26:67:40 | ...::new(...) | HashingAlgorithm MD5 WEAK | | test.rs:73:9:73:23 | ...::new(...) | HashingAlgorithm MD5 WEAK | | test.rs:74:9:74:23 | ...::new(...) | HashingAlgorithm MD5 WEAK | +| test.rs:76:35:76:42 | harmless | HashingAlgorithm MD5 WEAK inputs:1 | +| test.rs:77:35:77:42 | password | HashingAlgorithm MD5 WEAK inputs:1 | +| test.rs:80:26:80:40 | harmless.trim() | HashingAlgorithm MD5 WEAK inputs:1 | +| test.rs:81:26:81:40 | password.trim() | HashingAlgorithm MD5 WEAK inputs:1 | +| test.rs:82:26:82:44 | harmless.as_bytes() | HashingAlgorithm MD5 WEAK inputs:1 | +| test.rs:83:26:83:44 | password.as_bytes() | HashingAlgorithm MD5 WEAK inputs:1 | +| test.rs:84:26:84:67 | ... .unwrap() | HashingAlgorithm MD5 WEAK inputs:1 | +| test.rs:85:26:85:67 | ... .unwrap() | HashingAlgorithm MD5 WEAK inputs:1 | | test.rs:133:26:133:40 | ...::new(...) | HashingAlgorithm MD5 WEAK | | test.rs:156:26:156:40 | ...::new(...) | HashingAlgorithm MD5 WEAK | | test.rs:176:13:176:24 | ...::new(...) | EncryptionAlgorithm SEED | diff --git a/rust/ql/test/query-tests/security/CWE-327/WeakSensitiveDataHashing/WeakSensitiveDataHashing.expected b/rust/ql/test/query-tests/security/CWE-327/WeakSensitiveDataHashing/WeakSensitiveDataHashing.expected index e34feaa0592f..7b9c2e0de23f 100644 --- a/rust/ql/test/query-tests/security/CWE-327/WeakSensitiveDataHashing/WeakSensitiveDataHashing.expected +++ b/rust/ql/test/query-tests/security/CWE-327/WeakSensitiveDataHashing/WeakSensitiveDataHashing.expected @@ -1,19 +1,79 @@ #select +| test.rs:14:26:14:39 | credit_card_no | test.rs:14:26:14:39 | credit_card_no | test.rs:14:26:14:39 | credit_card_no | $@ is used in a hashing algorithm (MD5) that is insecure. | test.rs:14:26:14:39 | credit_card_no | Sensitive data (private) | +| test.rs:15:26:15:33 | password | test.rs:15:26:15:33 | password | test.rs:15:26:15:33 | password | $@ is used in a hashing algorithm (MD5) that is insecure for password hashing, since it is not a computationally expensive hash function. | test.rs:15:26:15:33 | password | Sensitive data (password) | | test.rs:20:26:20:39 | credit_card_no | test.rs:20:26:20:39 | credit_card_no | test.rs:20:26:20:39 | credit_card_no | $@ is used in a hashing algorithm (MD5) that is insecure. | test.rs:20:26:20:39 | credit_card_no | Sensitive data (private) | | test.rs:21:26:21:33 | password | test.rs:21:26:21:33 | password | test.rs:21:26:21:33 | password | $@ is used in a hashing algorithm (MD5) that is insecure for password hashing, since it is not a computationally expensive hash function. | test.rs:21:26:21:33 | password | Sensitive data (password) | +| test.rs:26:28:26:41 | credit_card_no | test.rs:26:28:26:41 | credit_card_no | test.rs:26:28:26:41 | credit_card_no | $@ is used in a hashing algorithm (SHA1) that is insecure. | test.rs:26:28:26:41 | credit_card_no | Sensitive data (private) | +| test.rs:27:28:27:35 | password | test.rs:27:28:27:35 | password | test.rs:27:28:27:35 | password | $@ is used in a hashing algorithm (SHA1) that is insecure for password hashing, since it is not a computationally expensive hash function. | test.rs:27:28:27:35 | password | Sensitive data (password) | +| test.rs:32:36:32:49 | credit_card_no | test.rs:32:36:32:49 | credit_card_no | test.rs:32:36:32:49 | credit_card_no | $@ is used in a hashing algorithm (SHA1) that is insecure. | test.rs:32:36:32:49 | credit_card_no | Sensitive data (private) | +| test.rs:33:36:33:43 | password | test.rs:33:36:33:43 | password | test.rs:33:36:33:43 | password | $@ is used in a hashing algorithm (SHA1) that is insecure for password hashing, since it is not a computationally expensive hash function. | test.rs:33:36:33:43 | password | Sensitive data (password) | +| test.rs:39:32:39:39 | password | test.rs:39:32:39:39 | password | test.rs:39:32:39:39 | password | $@ is used in a hashing algorithm (SHA3256) that is insecure for password hashing, since it is not a computationally expensive hash function. | test.rs:39:32:39:39 | password | Sensitive data (password) | +| test.rs:60:26:60:37 | password_str | test.rs:60:26:60:37 | password_str | test.rs:60:26:60:37 | password_str | $@ is used in a hashing algorithm (MD5) that is insecure for password hashing, since it is not a computationally expensive hash function. | test.rs:60:26:60:37 | password_str | Sensitive data (password) | +| test.rs:62:26:62:37 | password_arr | test.rs:62:26:62:37 | password_arr | test.rs:62:26:62:37 | password_arr | $@ is used in a hashing algorithm (MD5) that is insecure for password hashing, since it is not a computationally expensive hash function. | test.rs:62:26:62:37 | password_arr | Sensitive data (password) | +| test.rs:64:26:64:37 | password_vec | test.rs:64:26:64:37 | password_vec | test.rs:64:26:64:37 | password_vec | $@ is used in a hashing algorithm (MD5) that is insecure for password hashing, since it is not a computationally expensive hash function. | test.rs:64:26:64:37 | password_vec | Sensitive data (password) | +| test.rs:77:35:77:42 | password | test.rs:77:35:77:42 | password | test.rs:77:35:77:42 | password | $@ is used in a hashing algorithm (MD5) that is insecure for password hashing, since it is not a computationally expensive hash function. | test.rs:77:35:77:42 | password | Sensitive data (password) | +| test.rs:81:26:81:40 | password.trim() | test.rs:81:26:81:33 | password | test.rs:81:26:81:40 | password.trim() | $@ is used in a hashing algorithm (MD5) that is insecure for password hashing, since it is not a computationally expensive hash function. | test.rs:81:26:81:33 | password | Sensitive data (password) | +| test.rs:83:26:83:44 | password.as_bytes() | test.rs:83:26:83:33 | password | test.rs:83:26:83:44 | password.as_bytes() | $@ is used in a hashing algorithm (MD5) that is insecure for password hashing, since it is not a computationally expensive hash function. | test.rs:83:26:83:33 | password | Sensitive data (password) | | test.rs:211:30:211:34 | value | test.rs:226:29:226:36 | password | test.rs:211:30:211:34 | value | $@ is used in a hashing algorithm (MD5) that is insecure for password hashing, since it is not a computationally expensive hash function. | test.rs:226:29:226:36 | password | Sensitive data (password) | edges -| test.rs:20:26:20:39 | credit_card_no | test.rs:20:26:20:39 | credit_card_no | provenance | Sink:MaD:1 | -| test.rs:21:26:21:33 | password | test.rs:21:26:21:33 | password | provenance | Sink:MaD:1 | -| test.rs:210:20:210:30 | ...: ... | test.rs:211:30:211:34 | value | provenance | Sink:MaD:1 | +| test.rs:14:26:14:39 | credit_card_no | test.rs:14:26:14:39 | credit_card_no | provenance | Sink:MaD:1 | +| test.rs:15:26:15:33 | password | test.rs:15:26:15:33 | password | provenance | Sink:MaD:1 | +| test.rs:20:26:20:39 | credit_card_no | test.rs:20:26:20:39 | credit_card_no | provenance | Sink:MaD:3 | +| test.rs:21:26:21:33 | password | test.rs:21:26:21:33 | password | provenance | Sink:MaD:3 | +| test.rs:26:28:26:41 | credit_card_no | test.rs:26:28:26:41 | credit_card_no | provenance | Sink:MaD:1 | +| test.rs:27:28:27:35 | password | test.rs:27:28:27:35 | password | provenance | Sink:MaD:1 | +| test.rs:32:36:32:49 | credit_card_no | test.rs:32:36:32:49 | credit_card_no | provenance | Sink:MaD:1 | +| test.rs:33:36:33:43 | password | test.rs:33:36:33:43 | password | provenance | Sink:MaD:1 | +| test.rs:39:32:39:39 | password | test.rs:39:32:39:39 | password | provenance | Sink:MaD:1 | +| test.rs:60:26:60:37 | password_str | test.rs:60:26:60:37 | password_str | provenance | Sink:MaD:1 | +| test.rs:62:26:62:37 | password_arr | test.rs:62:26:62:37 | password_arr | provenance | Sink:MaD:1 | +| test.rs:64:26:64:37 | password_vec | test.rs:64:26:64:37 | password_vec | provenance | Sink:MaD:1 | +| test.rs:77:35:77:42 | password | test.rs:77:35:77:42 | password | provenance | Sink:MaD:2 | +| test.rs:81:26:81:33 | password | test.rs:81:26:81:40 | password.trim() [&ref] | provenance | MaD:5 | +| test.rs:81:26:81:40 | password.trim() [&ref] | test.rs:81:26:81:40 | password.trim() | provenance | Sink:MaD:1 | +| test.rs:83:26:83:33 | password | test.rs:83:26:83:44 | password.as_bytes() [&ref] | provenance | MaD:4 | +| test.rs:83:26:83:44 | password.as_bytes() [&ref] | test.rs:83:26:83:44 | password.as_bytes() | provenance | Sink:MaD:1 | +| test.rs:210:20:210:30 | ...: ... | test.rs:211:30:211:34 | value | provenance | Sink:MaD:3 | | test.rs:226:29:226:36 | password | test.rs:210:20:210:30 | ...: ... | provenance | | models -| 1 | Sink: md5::compute; Argument[0]; hasher-input | +| 1 | Sink: ::digest; Argument[0]; hasher-input | +| 2 | Sink: ::new_with_prefix; Argument[0]; hasher-input | +| 3 | Sink: md5::compute; Argument[0]; hasher-input | +| 4 | Summary: ::as_bytes; Argument[self].Reference; ReturnValue.Reference; taint | +| 5 | Summary: ::trim; Argument[self].Reference; ReturnValue.Reference; taint | nodes +| test.rs:14:26:14:39 | credit_card_no | semmle.label | credit_card_no | +| test.rs:14:26:14:39 | credit_card_no | semmle.label | credit_card_no | +| test.rs:15:26:15:33 | password | semmle.label | password | +| test.rs:15:26:15:33 | password | semmle.label | password | | test.rs:20:26:20:39 | credit_card_no | semmle.label | credit_card_no | | test.rs:20:26:20:39 | credit_card_no | semmle.label | credit_card_no | | test.rs:21:26:21:33 | password | semmle.label | password | | test.rs:21:26:21:33 | password | semmle.label | password | +| test.rs:26:28:26:41 | credit_card_no | semmle.label | credit_card_no | +| test.rs:26:28:26:41 | credit_card_no | semmle.label | credit_card_no | +| test.rs:27:28:27:35 | password | semmle.label | password | +| test.rs:27:28:27:35 | password | semmle.label | password | +| test.rs:32:36:32:49 | credit_card_no | semmle.label | credit_card_no | +| test.rs:32:36:32:49 | credit_card_no | semmle.label | credit_card_no | +| test.rs:33:36:33:43 | password | semmle.label | password | +| test.rs:33:36:33:43 | password | semmle.label | password | +| test.rs:39:32:39:39 | password | semmle.label | password | +| test.rs:39:32:39:39 | password | semmle.label | password | +| test.rs:60:26:60:37 | password_str | semmle.label | password_str | +| test.rs:60:26:60:37 | password_str | semmle.label | password_str | +| test.rs:62:26:62:37 | password_arr | semmle.label | password_arr | +| test.rs:62:26:62:37 | password_arr | semmle.label | password_arr | +| test.rs:64:26:64:37 | password_vec | semmle.label | password_vec | +| test.rs:64:26:64:37 | password_vec | semmle.label | password_vec | +| test.rs:77:35:77:42 | password | semmle.label | password | +| test.rs:77:35:77:42 | password | semmle.label | password | +| test.rs:81:26:81:33 | password | semmle.label | password | +| test.rs:81:26:81:40 | password.trim() | semmle.label | password.trim() | +| test.rs:81:26:81:40 | password.trim() [&ref] | semmle.label | password.trim() [&ref] | +| test.rs:83:26:83:33 | password | semmle.label | password | +| test.rs:83:26:83:44 | password.as_bytes() | semmle.label | password.as_bytes() | +| test.rs:83:26:83:44 | password.as_bytes() [&ref] | semmle.label | password.as_bytes() [&ref] | | test.rs:210:20:210:30 | ...: ... | semmle.label | ...: ... | | test.rs:211:30:211:34 | value | semmle.label | value | | test.rs:226:29:226:36 | password | semmle.label | password | diff --git a/rust/ql/test/query-tests/security/CWE-327/WeakSensitiveDataHashing/test.rs b/rust/ql/test/query-tests/security/CWE-327/WeakSensitiveDataHashing/test.rs index d6bdfb5bbdca..b5d9f0f8c634 100644 --- a/rust/ql/test/query-tests/security/CWE-327/WeakSensitiveDataHashing/test.rs +++ b/rust/ql/test/query-tests/security/CWE-327/WeakSensitiveDataHashing/test.rs @@ -10,10 +10,10 @@ fn test_hash_algorithms( // test hashing with different algorithms and data // MD5 - _ = md5::Md5::digest(harmless); - _ = md5::Md5::digest(credit_card_no); // $ MISSING: Alert[rust/weak-sensitive-data-hashing] - _ = md5::Md5::digest(password); // $ MISSING: Alert[rust/weak-sensitive-data-hashing] - _ = md5::Md5::digest(encrypted_password); + _ = md5::Md5::digest(harmless); // $ Alert[rust/summary/cryptographic-operations] + _ = md5::Md5::digest(credit_card_no); // $ Alert[rust/weak-sensitive-data-hashing] Alert[rust/summary/cryptographic-operations] + _ = md5::Md5::digest(password); // $ Alert[rust/weak-sensitive-data-hashing] Alert[rust/summary/cryptographic-operations] + _ = md5::Md5::digest(encrypted_password); // $ Alert[rust/summary/cryptographic-operations] // MD5 (alternative / older library) _ = md5_alt::compute(harmless); // $ Alert[rust/summary/cryptographic-operations] @@ -22,22 +22,22 @@ fn test_hash_algorithms( _ = md5_alt::compute(encrypted_password); // $ Alert[rust/summary/cryptographic-operations] // SHA-1 - _ = sha1::Sha1::digest(harmless); - _ = sha1::Sha1::digest(credit_card_no); // $ MISSING: Alert[rust/weak-sensitive-data-hashing] - _ = sha1::Sha1::digest(password); // $ MISSING: Alert[rust/weak-sensitive-data-hashing] - _ = sha1::Sha1::digest(encrypted_password); + _ = sha1::Sha1::digest(harmless); // $ Alert[rust/summary/cryptographic-operations] + _ = sha1::Sha1::digest(credit_card_no); // $ Alert[rust/weak-sensitive-data-hashing] Alert[rust/summary/cryptographic-operations] + _ = sha1::Sha1::digest(password); // $ Alert[rust/weak-sensitive-data-hashing] Alert[rust/summary/cryptographic-operations] + _ = sha1::Sha1::digest(encrypted_password); // $ Alert[rust/summary/cryptographic-operations] // SHA-1 checked - _ = sha1_checked::Sha1::digest(harmless); - _ = sha1_checked::Sha1::digest(credit_card_no); // $ MISSING: Alert[rust/weak-sensitive-data-hashing] - _ = sha1_checked::Sha1::digest(password); // $ MISSING: Alert[rust/weak-sensitive-data-hashing] - _ = sha1_checked::Sha1::digest(encrypted_password); + _ = sha1_checked::Sha1::digest(harmless); // $ Alert[rust/summary/cryptographic-operations] + _ = sha1_checked::Sha1::digest(credit_card_no); // $ Alert[rust/weak-sensitive-data-hashing] Alert[rust/summary/cryptographic-operations] + _ = sha1_checked::Sha1::digest(password); // $ Alert[rust/weak-sensitive-data-hashing] Alert[rust/summary/cryptographic-operations] + _ = sha1_checked::Sha1::digest(encrypted_password); // $ Alert[rust/summary/cryptographic-operations] // SHA-256 (appropriate for sensitive data hashing) - _ = sha3::Sha3_256::digest(harmless); - _ = sha3::Sha3_256::digest(credit_card_no); - _ = sha3::Sha3_256::digest(password); // $ MISSING: Alert[rust/weak-sensitive-data-hashing] - _ = sha3::Sha3_256::digest(encrypted_password); + _ = sha3::Sha3_256::digest(harmless); // $ Alert[rust/summary/cryptographic-operations] + _ = sha3::Sha3_256::digest(credit_card_no); // $ Alert[rust/summary/cryptographic-operations] + _ = sha3::Sha3_256::digest(password); // $ Alert[rust/weak-sensitive-data-hashing] Alert[rust/summary/cryptographic-operations] + _ = sha3::Sha3_256::digest(encrypted_password); // $ Alert[rust/summary/cryptographic-operations] // Argon2 (appropriate for password hashing) let argon2_salt = argon2::password_hash::Salt::from_b64(salt).unwrap(); @@ -56,12 +56,12 @@ fn test_hash_code_patterns( // test hashing with different code patterns // hash different types of data - _ = md5::Md5::digest(harmless_str); - _ = md5::Md5::digest(password_str); // $ MISSING: Alert[rust/weak-sensitive-data-hashing] - _ = md5::Md5::digest(harmless_arr); - _ = md5::Md5::digest(password_arr); // $ MISSING: Alert[rust/weak-sensitive-data-hashing] - _ = md5::Md5::digest(harmless_vec); - _ = md5::Md5::digest(password_vec); // $ MISSING: Alert[rust/weak-sensitive-data-hashing] + _ = md5::Md5::digest(harmless_str); // $ Alert[rust/summary/cryptographic-operations] + _ = md5::Md5::digest(password_str); // $ Alert[rust/weak-sensitive-data-hashing] Alert[rust/summary/cryptographic-operations] + _ = md5::Md5::digest(harmless_arr); // $ Alert[rust/summary/cryptographic-operations] + _ = md5::Md5::digest(password_arr); // $ Alert[rust/weak-sensitive-data-hashing] Alert[rust/summary/cryptographic-operations] + _ = md5::Md5::digest(harmless_vec); // $ Alert[rust/summary/cryptographic-operations] + _ = md5::Md5::digest(password_vec); // $ Alert[rust/weak-sensitive-data-hashing] Alert[rust/summary/cryptographic-operations] // hash through a hasher object let mut md5_hasher = md5::Md5::new(); // $ Alert[rust/summary/cryptographic-operations] @@ -73,16 +73,16 @@ fn test_hash_code_patterns( _ = md5::Md5::new().chain_update(harmless).chain_update(harmless).chain_update(harmless).finalize(); // $ Alert[rust/summary/cryptographic-operations] _ = md5::Md5::new().chain_update(harmless).chain_update(password).chain_update(harmless).finalize(); // $ Alert[rust/summary/cryptographic-operations] MISSING: Alert[rust/weak-sensitive-data-hashing] - _ = md5::Md5::new_with_prefix(harmless).finalize(); - _ = md5::Md5::new_with_prefix(password).finalize(); // $ MISSING: Alert[rust/weak-sensitive-data-hashing] + _ = md5::Md5::new_with_prefix(harmless).finalize(); // $ Alert[rust/summary/cryptographic-operations] + _ = md5::Md5::new_with_prefix(password).finalize(); // $ Alert[rust/weak-sensitive-data-hashing] Alert[rust/summary/cryptographic-operations] // hash transformed data - _ = md5::Md5::digest(harmless.trim()); - _ = md5::Md5::digest(password.trim()); // $ MISSING: Alert[rust/weak-sensitive-data-hashing] - _ = md5::Md5::digest(harmless.as_bytes()); - _ = md5::Md5::digest(password.as_bytes()); // $ MISSING: Alert[rust/weak-sensitive-data-hashing] - _ = md5::Md5::digest(std::str::from_utf8(harmless_arr).unwrap()); - _ = md5::Md5::digest(std::str::from_utf8(password_arr).unwrap()); // $ MISSING: Alert[rust/weak-sensitive-data-hashing] + _ = md5::Md5::digest(harmless.trim()); // $ Alert[rust/summary/cryptographic-operations] + _ = md5::Md5::digest(password.trim()); // $ Alert[rust/weak-sensitive-data-hashing] Alert[rust/summary/cryptographic-operations] + _ = md5::Md5::digest(harmless.as_bytes()); // $ Alert[rust/summary/cryptographic-operations] + _ = md5::Md5::digest(password.as_bytes()); // $ Alert[rust/weak-sensitive-data-hashing] Alert[rust/summary/cryptographic-operations] + _ = md5::Md5::digest(std::str::from_utf8(harmless_arr).unwrap()); // $ Alert[rust/summary/cryptographic-operations] + _ = md5::Md5::digest(std::str::from_utf8(password_arr).unwrap()); // $ Alert[rust/summary/cryptographic-operations] $ MISSING: Alert[rust/weak-sensitive-data-hashing] } #[derive(Serialize)] diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index 28c66266ed89..ae90b8f0282c 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -5,7 +5,15 @@ | test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) | This hard-coded value is used as $@. | test_cipher.rs:38:49:38:80 | ...::from_slice(...) | a key | | test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) | This hard-coded value is used as $@. | test_cipher.rs:42:49:42:79 | ...::from_slice(...) | a key | | test_cipher.rs:50:37:50:54 | ...::zeroed(...) | test_cipher.rs:50:37:50:54 | ...::zeroed(...) | test_cipher.rs:51:50:51:82 | ...::from_slice(...) | This hard-coded value is used as $@. | test_cipher.rs:51:50:51:82 | ...::from_slice(...) | a key | +| test_cipher.rs:66:19:66:26 | [0u8; 32] | test_cipher.rs:66:19:66:26 | [0u8; 32] | test_cipher.rs:67:35:67:47 | const2.into() | This hard-coded value is used as $@. | test_cipher.rs:67:35:67:47 | const2.into() | a key | | test_cipher.rs:73:19:73:26 | [0u8; 32] | test_cipher.rs:73:19:73:26 | [0u8; 32] | test_cipher.rs:74:46:74:51 | const2 | This hard-coded value is used as $@. | test_cipher.rs:74:46:74:51 | const2 | a key | +| test_cipher.rs:80:19:80:26 | [0u8; 32] | test_cipher.rs:80:19:80:26 | [0u8; 32] | test_cipher.rs:81:63:81:75 | const6.into() | This hard-coded value is used as $@. | test_cipher.rs:81:63:81:75 | const6.into() | a key | +| test_cipher.rs:84:19:84:27 | [0u8; 16] | test_cipher.rs:84:19:84:27 | [0u8; 16] | test_cipher.rs:85:75:85:87 | const7.into() | This hard-coded value is used as $@. | test_cipher.rs:85:75:85:87 | const7.into() | an initialization vector | +| test_cipher.rs:94:23:94:40 | "1234567890123456" | test_cipher.rs:94:23:94:40 | "1234567890123456" | test_cipher.rs:95:63:95:73 | key9.into() | This hard-coded value is used as $@. | test_cipher.rs:95:63:95:73 | key9.into() | a key | +| test_cipher.rs:124:25:124:30 | [0; 32] | test_cipher.rs:124:25:124:30 | [0; 32] | test_cipher.rs:126:34:126:45 | &... | This hard-coded value is used as $@. | test_cipher.rs:126:34:126:45 | &... | a key | +| test_cipher.rs:125:18:125:23 | [0; 12] | test_cipher.rs:125:18:125:23 | [0; 12] | test_cipher.rs:127:29:127:42 | &... | This hard-coded value is used as $@. | test_cipher.rs:127:29:127:42 | &... | a nonce | +| test_cipher.rs:129:33:129:41 | [0xff; 32] | test_cipher.rs:129:33:129:41 | [0xff; 32] | test_cipher.rs:132:34:132:38 | &key3 | This hard-coded value is used as $@. | test_cipher.rs:132:34:132:38 | &key3 | a key | +| test_cipher.rs:131:27:131:35 | [0xff; 12] | test_cipher.rs:131:27:131:35 | [0xff; 12] | test_cipher.rs:133:29:133:42 | &... | This hard-coded value is used as $@. | test_cipher.rs:133:29:133:42 | &... | a nonce | | test_cookie.rs:17:28:17:34 | [0; 64] | test_cookie.rs:17:28:17:34 | [0; 64] | test_cookie.rs:18:26:18:32 | &array1 | This hard-coded value is used as $@. | test_cookie.rs:18:26:18:32 | &array1 | a key | | test_cookie.rs:21:28:21:34 | [0; 64] | test_cookie.rs:21:28:21:34 | [0; 64] | test_cookie.rs:22:26:22:32 | &array2 | This hard-coded value is used as $@. | test_cookie.rs:22:26:22:32 | &array2 | a key | | test_cookie.rs:25:16:29:5 | match ... { ... } | test_cookie.rs:25:16:29:5 | match ... { ... } | test_cookie.rs:30:26:30:40 | str3.as_bytes() | This hard-coded value is used as $@. | test_cookie.rs:30:26:30:40 | str3.as_bytes() | a key | @@ -29,61 +37,107 @@ edges | test_cipher.rs:18:9:18:14 | const1 [&ref] | test_cipher.rs:19:73:19:78 | const1 [&ref] | provenance | | | test_cipher.rs:18:28:18:36 | &... [&ref] | test_cipher.rs:18:9:18:14 | const1 [&ref] | provenance | | | test_cipher.rs:18:29:18:36 | [0u8; 16] | test_cipher.rs:18:28:18:36 | &... [&ref] | provenance | | -| test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref] | test_cipher.rs:19:49:19:79 | ...::from_slice(...) | provenance | Sink:MaD:2 | -| test_cipher.rs:19:73:19:78 | const1 [&ref] | test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref] | provenance | MaD:14 | +| test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref] | test_cipher.rs:19:49:19:79 | ...::from_slice(...) | provenance | Sink:MaD:3 | +| test_cipher.rs:19:73:19:78 | const1 [&ref] | test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref] | provenance | MaD:20 | | test_cipher.rs:25:9:25:14 | const4 [&ref] | test_cipher.rs:26:66:26:71 | const4 [&ref] | provenance | | | test_cipher.rs:25:28:25:36 | &... [&ref] | test_cipher.rs:25:9:25:14 | const4 [&ref] | provenance | | | test_cipher.rs:25:29:25:36 | [0u8; 16] | test_cipher.rs:25:28:25:36 | &... [&ref] | provenance | | -| test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref] | test_cipher.rs:26:42:26:72 | ...::from_slice(...) | provenance | Sink:MaD:3 | -| test_cipher.rs:26:66:26:71 | const4 [&ref] | test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref] | provenance | MaD:14 | +| test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref] | test_cipher.rs:26:42:26:72 | ...::from_slice(...) | provenance | Sink:MaD:4 | +| test_cipher.rs:26:66:26:71 | const4 [&ref] | test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref] | provenance | MaD:20 | | test_cipher.rs:29:9:29:14 | const5 [&ref] | test_cipher.rs:30:95:30:100 | const5 [&ref] | provenance | | | test_cipher.rs:29:28:29:36 | &... [&ref] | test_cipher.rs:29:9:29:14 | const5 [&ref] | provenance | | | test_cipher.rs:29:29:29:36 | [0u8; 16] | test_cipher.rs:29:28:29:36 | &... [&ref] | provenance | | -| test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref] | test_cipher.rs:30:72:30:101 | ...::from_slice(...) | provenance | Sink:MaD:4 | -| test_cipher.rs:30:95:30:100 | const5 [&ref] | test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref] | provenance | MaD:14 | +| test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref] | test_cipher.rs:30:72:30:101 | ...::from_slice(...) | provenance | Sink:MaD:5 | +| test_cipher.rs:30:95:30:100 | const5 [&ref] | test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref] | provenance | MaD:20 | | test_cipher.rs:37:9:37:14 | const7 | test_cipher.rs:38:74:38:79 | const7 | provenance | | | test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:37:9:37:14 | const7 | provenance | | -| test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) | provenance | Sink:MaD:2 | -| test_cipher.rs:38:73:38:79 | &const7 [&ref] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | provenance | MaD:14 | +| test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) | provenance | Sink:MaD:3 | +| test_cipher.rs:38:73:38:79 | &const7 [&ref] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | provenance | MaD:20 | | test_cipher.rs:38:74:38:79 | const7 | test_cipher.rs:38:73:38:79 | &const7 [&ref] | provenance | | | test_cipher.rs:41:9:41:14 | const8 [&ref] | test_cipher.rs:42:73:42:78 | const8 [&ref] | provenance | | | test_cipher.rs:41:28:41:76 | &... [&ref] | test_cipher.rs:41:9:41:14 | const8 [&ref] | provenance | | | test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:41:28:41:76 | &... [&ref] | provenance | | -| test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) | provenance | Sink:MaD:2 | -| test_cipher.rs:42:73:42:78 | const8 [&ref] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | provenance | MaD:14 | +| test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) | provenance | Sink:MaD:3 | +| test_cipher.rs:42:73:42:78 | const8 [&ref] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | provenance | MaD:20 | | test_cipher.rs:50:9:50:15 | const10 [element] | test_cipher.rs:51:75:51:81 | const10 [element] | provenance | | -| test_cipher.rs:50:37:50:54 | ...::zeroed(...) | test_cipher.rs:50:9:50:15 | const10 [element] | provenance | Src:MaD:7 | -| test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | test_cipher.rs:51:50:51:82 | ...::from_slice(...) | provenance | Sink:MaD:2 Sink:MaD:2 | -| test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | provenance | MaD:14 | +| test_cipher.rs:50:37:50:54 | ...::zeroed(...) | test_cipher.rs:50:9:50:15 | const10 [element] | provenance | Src:MaD:11 | +| test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | test_cipher.rs:51:50:51:82 | ...::from_slice(...) | provenance | Sink:MaD:3 Sink:MaD:3 | +| test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | provenance | MaD:20 | | test_cipher.rs:51:75:51:81 | const10 [element] | test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | provenance | | -| test_cipher.rs:73:9:73:14 | const2 [&ref] | test_cipher.rs:74:46:74:51 | const2 | provenance | Sink:MaD:6 | +| test_cipher.rs:66:9:66:14 | const2 [&ref] | test_cipher.rs:67:35:67:40 | const2 [&ref] | provenance | | +| test_cipher.rs:66:18:66:26 | &... [&ref] | test_cipher.rs:66:9:66:14 | const2 [&ref] | provenance | | +| test_cipher.rs:66:19:66:26 | [0u8; 32] | test_cipher.rs:66:18:66:26 | &... [&ref] | provenance | | +| test_cipher.rs:67:35:67:40 | const2 [&ref] | test_cipher.rs:67:35:67:47 | const2.into() [element] | provenance | MaD:18 | +| test_cipher.rs:67:35:67:47 | const2.into() [element] | test_cipher.rs:67:35:67:47 | const2.into() | provenance | Sink:MaD:7 | +| test_cipher.rs:73:9:73:14 | const2 [&ref] | test_cipher.rs:74:46:74:51 | const2 | provenance | Sink:MaD:8 | | test_cipher.rs:73:18:73:26 | &... [&ref] | test_cipher.rs:73:9:73:14 | const2 [&ref] | provenance | | | test_cipher.rs:73:19:73:26 | [0u8; 32] | test_cipher.rs:73:18:73:26 | &... [&ref] | provenance | | +| test_cipher.rs:80:9:80:14 | const6 [&ref] | test_cipher.rs:81:63:81:68 | const6 [&ref] | provenance | | +| test_cipher.rs:80:18:80:26 | &... [&ref] | test_cipher.rs:80:9:80:14 | const6 [&ref] | provenance | | +| test_cipher.rs:80:19:80:26 | [0u8; 32] | test_cipher.rs:80:18:80:26 | &... [&ref] | provenance | | +| test_cipher.rs:81:63:81:68 | const6 [&ref] | test_cipher.rs:81:63:81:75 | const6.into() [element] | provenance | MaD:18 | +| test_cipher.rs:81:63:81:75 | const6.into() [element] | test_cipher.rs:81:63:81:75 | const6.into() | provenance | Sink:MaD:9 | +| test_cipher.rs:84:9:84:14 | const7 [&ref] | test_cipher.rs:85:75:85:80 | const7 [&ref] | provenance | | +| test_cipher.rs:84:18:84:27 | &... [&ref] | test_cipher.rs:84:9:84:14 | const7 [&ref] | provenance | | +| test_cipher.rs:84:19:84:27 | [0u8; 16] | test_cipher.rs:84:18:84:27 | &... [&ref] | provenance | | +| test_cipher.rs:85:75:85:80 | const7 [&ref] | test_cipher.rs:85:75:85:87 | const7.into() [element] | provenance | MaD:18 | +| test_cipher.rs:85:75:85:87 | const7.into() [element] | test_cipher.rs:85:75:85:87 | const7.into() | provenance | Sink:MaD:10 | +| test_cipher.rs:94:9:94:12 | key9 [&ref] | test_cipher.rs:95:63:95:66 | key9 [&ref] | provenance | | +| test_cipher.rs:94:23:94:40 | "1234567890123456" | test_cipher.rs:94:23:94:51 | "1234567890123456".as_bytes() [&ref] | provenance | MaD:19 | +| test_cipher.rs:94:23:94:51 | "1234567890123456".as_bytes() [&ref] | test_cipher.rs:94:9:94:12 | key9 [&ref] | provenance | | +| test_cipher.rs:95:63:95:66 | key9 [&ref] | test_cipher.rs:95:63:95:73 | key9.into() [element] | provenance | MaD:18 | +| test_cipher.rs:95:63:95:73 | key9.into() [element] | test_cipher.rs:95:63:95:73 | key9.into() | provenance | Sink:MaD:9 | +| test_cipher.rs:124:9:124:12 | key2 | test_cipher.rs:126:35:126:38 | key2 | provenance | | +| test_cipher.rs:124:25:124:30 | [0; 32] | test_cipher.rs:124:9:124:12 | key2 | provenance | | +| test_cipher.rs:125:9:125:14 | nonce2 | test_cipher.rs:127:30:127:35 | nonce2 | provenance | | +| test_cipher.rs:125:18:125:23 | [0; 12] | test_cipher.rs:125:9:125:14 | nonce2 | provenance | | +| test_cipher.rs:126:34:126:45 | &... [&ref, element] | test_cipher.rs:126:34:126:45 | &... | provenance | Sink:MaD:7 Sink:MaD:7 | +| test_cipher.rs:126:35:126:38 | key2 | test_cipher.rs:126:35:126:45 | key2.into() [element] | provenance | MaD:17 | +| test_cipher.rs:126:35:126:38 | key2 | test_cipher.rs:126:35:126:45 | key2.into() [element] | provenance | MaD:18 | +| test_cipher.rs:126:35:126:45 | key2.into() [element] | test_cipher.rs:126:34:126:45 | &... [&ref, element] | provenance | | +| test_cipher.rs:127:29:127:42 | &... [&ref, element] | test_cipher.rs:127:29:127:42 | &... | provenance | Sink:MaD:1 Sink:MaD:1 | +| test_cipher.rs:127:30:127:35 | nonce2 | test_cipher.rs:127:30:127:42 | nonce2.into() [element] | provenance | MaD:17 | +| test_cipher.rs:127:30:127:35 | nonce2 | test_cipher.rs:127:30:127:42 | nonce2.into() [element] | provenance | MaD:18 | +| test_cipher.rs:127:30:127:42 | nonce2.into() [element] | test_cipher.rs:127:29:127:42 | &... [&ref, element] | provenance | | +| test_cipher.rs:129:9:129:18 | key3_array [&ref] | test_cipher.rs:130:45:130:54 | key3_array [&ref] | provenance | | +| test_cipher.rs:129:32:129:41 | &... [&ref] | test_cipher.rs:129:9:129:18 | key3_array [&ref] | provenance | | +| test_cipher.rs:129:33:129:41 | [0xff; 32] | test_cipher.rs:129:32:129:41 | &... [&ref] | provenance | | +| test_cipher.rs:130:9:130:12 | key3 [&ref] | test_cipher.rs:132:35:132:38 | key3 [&ref] | provenance | | +| test_cipher.rs:130:16:130:55 | ...::from_slice(...) [&ref] | test_cipher.rs:130:9:130:12 | key3 [&ref] | provenance | | +| test_cipher.rs:130:45:130:54 | key3_array [&ref] | test_cipher.rs:130:16:130:55 | ...::from_slice(...) [&ref] | provenance | MaD:20 | +| test_cipher.rs:131:9:131:14 | nonce3 | test_cipher.rs:133:30:133:35 | nonce3 | provenance | | +| test_cipher.rs:131:27:131:35 | [0xff; 12] | test_cipher.rs:131:9:131:14 | nonce3 | provenance | | +| test_cipher.rs:132:34:132:38 | &key3 [&ref, &ref] | test_cipher.rs:132:34:132:38 | &key3 | provenance | Sink:MaD:7 Sink:MaD:7 | +| test_cipher.rs:132:35:132:38 | key3 [&ref] | test_cipher.rs:132:34:132:38 | &key3 [&ref, &ref] | provenance | | +| test_cipher.rs:133:29:133:42 | &... [&ref, element] | test_cipher.rs:133:29:133:42 | &... | provenance | Sink:MaD:1 Sink:MaD:1 | +| test_cipher.rs:133:30:133:35 | nonce3 | test_cipher.rs:133:30:133:42 | nonce3.into() [element] | provenance | MaD:17 | +| test_cipher.rs:133:30:133:35 | nonce3 | test_cipher.rs:133:30:133:42 | nonce3.into() [element] | provenance | MaD:18 | +| test_cipher.rs:133:30:133:42 | nonce3.into() [element] | test_cipher.rs:133:29:133:42 | &... [&ref, element] | provenance | | | test_cookie.rs:17:9:17:14 | array1 | test_cookie.rs:18:27:18:32 | array1 | provenance | | | test_cookie.rs:17:28:17:34 | [0; 64] | test_cookie.rs:17:9:17:14 | array1 | provenance | | -| test_cookie.rs:18:26:18:32 | &array1 [&ref] | test_cookie.rs:18:26:18:32 | &array1 | provenance | Sink:MaD:5 | +| test_cookie.rs:18:26:18:32 | &array1 [&ref] | test_cookie.rs:18:26:18:32 | &array1 | provenance | Sink:MaD:6 | | test_cookie.rs:18:27:18:32 | array1 | test_cookie.rs:18:26:18:32 | &array1 [&ref] | provenance | | | test_cookie.rs:21:9:21:14 | array2 | test_cookie.rs:22:27:22:32 | array2 | provenance | | | test_cookie.rs:21:28:21:34 | [0; 64] | test_cookie.rs:21:9:21:14 | array2 | provenance | | -| test_cookie.rs:22:26:22:32 | &array2 [&ref] | test_cookie.rs:22:26:22:32 | &array2 | provenance | Sink:MaD:5 | +| test_cookie.rs:22:26:22:32 | &array2 [&ref] | test_cookie.rs:22:26:22:32 | &array2 | provenance | Sink:MaD:6 | | test_cookie.rs:22:27:22:32 | array2 | test_cookie.rs:22:26:22:32 | &array2 [&ref] | provenance | | | test_cookie.rs:25:9:25:12 | str3 | test_cookie.rs:30:26:30:29 | str3 | provenance | | | test_cookie.rs:25:16:29:5 | match ... { ... } | test_cookie.rs:25:9:25:12 | str3 | provenance | | -| test_cookie.rs:30:26:30:29 | str3 | test_cookie.rs:30:26:30:40 | str3.as_bytes() [&ref] | provenance | MaD:13 | -| test_cookie.rs:30:26:30:40 | str3.as_bytes() [&ref] | test_cookie.rs:30:26:30:40 | str3.as_bytes() | provenance | Sink:MaD:5 | +| test_cookie.rs:30:26:30:29 | str3 | test_cookie.rs:30:26:30:40 | str3.as_bytes() [&ref] | provenance | MaD:19 | +| test_cookie.rs:30:26:30:40 | str3.as_bytes() [&ref] | test_cookie.rs:30:26:30:40 | str3.as_bytes() | provenance | Sink:MaD:6 | | test_cookie.rs:33:9:33:14 | array4 | test_cookie.rs:38:27:38:32 | array4 | provenance | | | test_cookie.rs:33:27:37:5 | [...] | test_cookie.rs:33:9:33:14 | array4 | provenance | | -| test_cookie.rs:38:26:38:32 | &array4 [&ref] | test_cookie.rs:38:26:38:32 | &array4 | provenance | Sink:MaD:5 | +| test_cookie.rs:38:26:38:32 | &array4 [&ref] | test_cookie.rs:38:26:38:32 | &array4 | provenance | Sink:MaD:6 | | test_cookie.rs:38:27:38:32 | array4 | test_cookie.rs:38:26:38:32 | &array4 [&ref] | provenance | | -| test_cookie.rs:54:9:54:14 | array2 | test_cookie.rs:58:34:58:39 | array2 | provenance | Sink:MaD:1 | +| test_cookie.rs:54:9:54:14 | array2 | test_cookie.rs:58:34:58:39 | array2 | provenance | Sink:MaD:2 | | test_cookie.rs:54:18:54:37 | ...::from(...) | test_cookie.rs:54:9:54:14 | array2 | provenance | | -| test_cookie.rs:54:28:54:36 | [0u8; 64] | test_cookie.rs:54:18:54:37 | ...::from(...) | provenance | MaD:8 | -| test_cookie.rs:54:28:54:36 | [0u8; 64] | test_cookie.rs:54:18:54:37 | ...::from(...) | provenance | MaD:9 | -| test_cookie.rs:54:28:54:36 | [0u8; 64] | test_cookie.rs:54:18:54:37 | ...::from(...) | provenance | MaD:10 | -| test_cookie.rs:54:28:54:36 | [0u8; 64] | test_cookie.rs:54:18:54:37 | ...::from(...) | provenance | MaD:11 | | test_cookie.rs:54:28:54:36 | [0u8; 64] | test_cookie.rs:54:18:54:37 | ...::from(...) | provenance | MaD:12 | -| test_cookie.rs:65:9:65:14 | array3 [element] | test_cookie.rs:69:34:69:39 | array3 | provenance | Sink:MaD:1 | -| test_cookie.rs:65:23:65:25 | 0u8 | test_cookie.rs:65:23:65:29 | ...::from_elem(...) [element] | provenance | MaD:15 | +| test_cookie.rs:54:28:54:36 | [0u8; 64] | test_cookie.rs:54:18:54:37 | ...::from(...) | provenance | MaD:13 | +| test_cookie.rs:54:28:54:36 | [0u8; 64] | test_cookie.rs:54:18:54:37 | ...::from(...) | provenance | MaD:14 | +| test_cookie.rs:54:28:54:36 | [0u8; 64] | test_cookie.rs:54:18:54:37 | ...::from(...) | provenance | MaD:15 | +| test_cookie.rs:54:28:54:36 | [0u8; 64] | test_cookie.rs:54:18:54:37 | ...::from(...) | provenance | MaD:16 | +| test_cookie.rs:65:9:65:14 | array3 [element] | test_cookie.rs:69:34:69:39 | array3 | provenance | Sink:MaD:2 | +| test_cookie.rs:65:23:65:25 | 0u8 | test_cookie.rs:65:23:65:29 | ...::from_elem(...) [element] | provenance | MaD:21 | | test_cookie.rs:65:23:65:29 | ...::from_elem(...) [element] | test_cookie.rs:65:9:65:14 | array3 [element] | provenance | | | test_heuristic.rs:38:25:38:30 | 0xFFFF | test_heuristic.rs:81:22:81:31 | MY_CONST_1 | provenance | | | test_heuristic.rs:39:25:39:59 | ... as u64 | test_heuristic.rs:82:22:82:31 | MY_CONST_2 | provenance | | @@ -97,21 +151,27 @@ edges | test_heuristic.rs:86:29:86:32 | 1u64 | test_heuristic.rs:87:22:87:31 | MY_CONST_5 | provenance | | | test_heuristic.rs:88:29:88:33 | ... + ... | test_heuristic.rs:89:22:89:31 | MY_CONST_6 | provenance | | models -| 1 | Sink: ::from; Argument[0]; credentials-key | -| 2 | Sink: ::new; Argument[0]; credentials-key | -| 3 | Sink: ::new; Argument[0]; credentials-key | -| 4 | Sink: ::new; Argument[1]; credentials-iv | -| 5 | Sink: ::from; Argument[0].Reference; credentials-key | -| 6 | Sink: ::new_from_slice; Argument[0]; credentials-key | -| 7 | Source: core::mem::zeroed; ReturnValue.Element; constant-source | -| 8 | Summary: ::from; Argument[0].Field[alloc::borrow::Cow::Owned(0)]; ReturnValue; value | -| 9 | Summary: ::from; Argument[0].Field[alloc::bstr::ByteString(0)]; ReturnValue; value | -| 10 | Summary: ::from; Argument[0].Field[alloc::collections::binary_heap::BinaryHeap::data]; ReturnValue; value | -| 11 | Summary: ::from; Argument[0].Field[alloc::string::String::vec]; ReturnValue; value | -| 12 | Summary: ::from; Argument[0]; ReturnValue; taint | -| 13 | Summary: ::as_bytes; Argument[self].Reference; ReturnValue.Reference; taint | -| 14 | Summary: ::from_slice; Argument[0].Reference; ReturnValue.Reference; value | -| 15 | Summary: alloc::vec::from_elem; Argument[0]; ReturnValue.Element; value | +| 1 | Sink: ::encrypt; Argument[0]; credentials-nonce | +| 2 | Sink: ::from; Argument[0]; credentials-key | +| 3 | Sink: ::new; Argument[0]; credentials-key | +| 4 | Sink: ::new; Argument[0]; credentials-key | +| 5 | Sink: ::new; Argument[1]; credentials-iv | +| 6 | Sink: ::from; Argument[0].Reference; credentials-key | +| 7 | Sink: ::new; Argument[0]; credentials-key | +| 8 | Sink: ::new_from_slice; Argument[0]; credentials-key | +| 9 | Sink: ::new; Argument[0]; credentials-key | +| 10 | Sink: ::new; Argument[1]; credentials-iv | +| 11 | Source: core::mem::zeroed; ReturnValue.Element; constant-source | +| 12 | Summary: ::from; Argument[0].Field[alloc::borrow::Cow::Owned(0)]; ReturnValue; value | +| 13 | Summary: ::from; Argument[0].Field[alloc::bstr::ByteString(0)]; ReturnValue; value | +| 14 | Summary: ::from; Argument[0].Field[alloc::collections::binary_heap::BinaryHeap::data]; ReturnValue; value | +| 15 | Summary: ::from; Argument[0].Field[alloc::string::String::vec]; ReturnValue; value | +| 16 | Summary: ::from; Argument[0]; ReturnValue; taint | +| 17 | Summary: ::into; Argument[self].Element; ReturnValue.Element; taint | +| 18 | Summary: ::into; Argument[self].Reference.Element; ReturnValue.Element; taint | +| 19 | Summary: ::as_bytes; Argument[self].Reference; ReturnValue.Reference; taint | +| 20 | Summary: ::from_slice; Argument[0].Reference; ReturnValue.Reference; value | +| 21 | Summary: alloc::vec::from_elem; Argument[0]; ReturnValue.Element; value | nodes | test_cipher.rs:18:9:18:14 | const1 [&ref] | semmle.label | const1 [&ref] | | test_cipher.rs:18:28:18:36 | &... [&ref] | semmle.label | &... [&ref] | @@ -149,10 +209,61 @@ nodes | test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | semmle.label | ...::from_slice(...) [&ref, element] | | test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | semmle.label | &const10 [&ref, element] | | test_cipher.rs:51:75:51:81 | const10 [element] | semmle.label | const10 [element] | +| test_cipher.rs:66:9:66:14 | const2 [&ref] | semmle.label | const2 [&ref] | +| test_cipher.rs:66:18:66:26 | &... [&ref] | semmle.label | &... [&ref] | +| test_cipher.rs:66:19:66:26 | [0u8; 32] | semmle.label | [0u8; 32] | +| test_cipher.rs:67:35:67:40 | const2 [&ref] | semmle.label | const2 [&ref] | +| test_cipher.rs:67:35:67:47 | const2.into() | semmle.label | const2.into() | +| test_cipher.rs:67:35:67:47 | const2.into() [element] | semmle.label | const2.into() [element] | | test_cipher.rs:73:9:73:14 | const2 [&ref] | semmle.label | const2 [&ref] | | test_cipher.rs:73:18:73:26 | &... [&ref] | semmle.label | &... [&ref] | | test_cipher.rs:73:19:73:26 | [0u8; 32] | semmle.label | [0u8; 32] | | test_cipher.rs:74:46:74:51 | const2 | semmle.label | const2 | +| test_cipher.rs:80:9:80:14 | const6 [&ref] | semmle.label | const6 [&ref] | +| test_cipher.rs:80:18:80:26 | &... [&ref] | semmle.label | &... [&ref] | +| test_cipher.rs:80:19:80:26 | [0u8; 32] | semmle.label | [0u8; 32] | +| test_cipher.rs:81:63:81:68 | const6 [&ref] | semmle.label | const6 [&ref] | +| test_cipher.rs:81:63:81:75 | const6.into() | semmle.label | const6.into() | +| test_cipher.rs:81:63:81:75 | const6.into() [element] | semmle.label | const6.into() [element] | +| test_cipher.rs:84:9:84:14 | const7 [&ref] | semmle.label | const7 [&ref] | +| test_cipher.rs:84:18:84:27 | &... [&ref] | semmle.label | &... [&ref] | +| test_cipher.rs:84:19:84:27 | [0u8; 16] | semmle.label | [0u8; 16] | +| test_cipher.rs:85:75:85:80 | const7 [&ref] | semmle.label | const7 [&ref] | +| test_cipher.rs:85:75:85:87 | const7.into() | semmle.label | const7.into() | +| test_cipher.rs:85:75:85:87 | const7.into() [element] | semmle.label | const7.into() [element] | +| test_cipher.rs:94:9:94:12 | key9 [&ref] | semmle.label | key9 [&ref] | +| test_cipher.rs:94:23:94:40 | "1234567890123456" | semmle.label | "1234567890123456" | +| test_cipher.rs:94:23:94:51 | "1234567890123456".as_bytes() [&ref] | semmle.label | "1234567890123456".as_bytes() [&ref] | +| test_cipher.rs:95:63:95:66 | key9 [&ref] | semmle.label | key9 [&ref] | +| test_cipher.rs:95:63:95:73 | key9.into() | semmle.label | key9.into() | +| test_cipher.rs:95:63:95:73 | key9.into() [element] | semmle.label | key9.into() [element] | +| test_cipher.rs:124:9:124:12 | key2 | semmle.label | key2 | +| test_cipher.rs:124:25:124:30 | [0; 32] | semmle.label | [0; 32] | +| test_cipher.rs:125:9:125:14 | nonce2 | semmle.label | nonce2 | +| test_cipher.rs:125:18:125:23 | [0; 12] | semmle.label | [0; 12] | +| test_cipher.rs:126:34:126:45 | &... | semmle.label | &... | +| test_cipher.rs:126:34:126:45 | &... [&ref, element] | semmle.label | &... [&ref, element] | +| test_cipher.rs:126:35:126:38 | key2 | semmle.label | key2 | +| test_cipher.rs:126:35:126:45 | key2.into() [element] | semmle.label | key2.into() [element] | +| test_cipher.rs:127:29:127:42 | &... | semmle.label | &... | +| test_cipher.rs:127:29:127:42 | &... [&ref, element] | semmle.label | &... [&ref, element] | +| test_cipher.rs:127:30:127:35 | nonce2 | semmle.label | nonce2 | +| test_cipher.rs:127:30:127:42 | nonce2.into() [element] | semmle.label | nonce2.into() [element] | +| test_cipher.rs:129:9:129:18 | key3_array [&ref] | semmle.label | key3_array [&ref] | +| test_cipher.rs:129:32:129:41 | &... [&ref] | semmle.label | &... [&ref] | +| test_cipher.rs:129:33:129:41 | [0xff; 32] | semmle.label | [0xff; 32] | +| test_cipher.rs:130:9:130:12 | key3 [&ref] | semmle.label | key3 [&ref] | +| test_cipher.rs:130:16:130:55 | ...::from_slice(...) [&ref] | semmle.label | ...::from_slice(...) [&ref] | +| test_cipher.rs:130:45:130:54 | key3_array [&ref] | semmle.label | key3_array [&ref] | +| test_cipher.rs:131:9:131:14 | nonce3 | semmle.label | nonce3 | +| test_cipher.rs:131:27:131:35 | [0xff; 12] | semmle.label | [0xff; 12] | +| test_cipher.rs:132:34:132:38 | &key3 | semmle.label | &key3 | +| test_cipher.rs:132:34:132:38 | &key3 [&ref, &ref] | semmle.label | &key3 [&ref, &ref] | +| test_cipher.rs:132:35:132:38 | key3 [&ref] | semmle.label | key3 [&ref] | +| test_cipher.rs:133:29:133:42 | &... | semmle.label | &... | +| test_cipher.rs:133:29:133:42 | &... [&ref, element] | semmle.label | &... [&ref, element] | +| test_cipher.rs:133:30:133:35 | nonce3 | semmle.label | nonce3 | +| test_cipher.rs:133:30:133:42 | nonce3.into() [element] | semmle.label | nonce3.into() [element] | | test_cookie.rs:17:9:17:14 | array1 | semmle.label | array1 | | test_cookie.rs:17:28:17:34 | [0; 64] | semmle.label | [0; 64] | | test_cookie.rs:18:26:18:32 | &array1 | semmle.label | &array1 | diff --git a/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs index 7278f786b100..d09e00af86cb 100644 --- a/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs +++ b/rust/ql/test/query-tests/security/CWE-798/test_cipher.rs @@ -63,8 +63,8 @@ fn test_block_cipher_aes( let aes_cipher1 = Aes256::new(key256.into()); aes_cipher1.encrypt_block(block128.into()); - let const2 = &[0u8;32]; // $ MISSING: Alert[rust/hard-coded-cryptographic-value] - let aes_cipher2 = Aes256::new(const2.into()); // $ MISSING: Sink + let const2 = &[0u8;32]; // $ Alert[rust/hard-coded-cryptographic-value] + let aes_cipher2 = Aes256::new(const2.into()); // $ Sink aes_cipher2.encrypt_block(block128.into()); let aes_cipher3 = Aes256::new_from_slice(key256).unwrap(); @@ -77,12 +77,12 @@ fn test_block_cipher_aes( let aes_cipher5 = cfb_mode::Encryptor::::new(key.into(), iv.into()); _ = aes_cipher5.encrypt_b2b(input, output).unwrap(); - let const6 = &[0u8;32]; // $ MISSING: Alert[rust/hard-coded-cryptographic-value] - let aes_cipher6 = cfb_mode::Encryptor::::new(const6.into(), iv.into()); // $ MISSING: Sink + let const6 = &[0u8;32]; // $ Alert[rust/hard-coded-cryptographic-value] + let aes_cipher6 = cfb_mode::Encryptor::::new(const6.into(), iv.into()); // $ Sink _ = aes_cipher6.encrypt_b2b(input, output).unwrap(); - let const7 = &[0u8; 16]; // $ MISSING: Alert[rust/hard-coded-cryptographic-value] - let aes_cipher7 = cfb_mode::Encryptor::::new(key.into(), const7.into()); // $ MISSING: Sink + let const7 = &[0u8; 16]; // $ Alert[rust/hard-coded-cryptographic-value] + let aes_cipher7 = cfb_mode::Encryptor::::new(key.into(), const7.into()); // $ Sink _ = aes_cipher7.encrypt_b2b(input, output).unwrap(); // various string conversions @@ -91,8 +91,8 @@ fn test_block_cipher_aes( let aes_cipher8 = cfb_mode::Encryptor::::new(key8.into(), iv.into()); _ = aes_cipher8.encrypt_b2b(input, output).unwrap(); - let key9: &[u8] = "1234567890123456".as_bytes(); // $ MISSING: Alert[rust/hard-coded-cryptographic-value] - let aes_cipher9 = cfb_mode::Encryptor::::new(key9.into(), iv.into()); + let key9: &[u8] = "1234567890123456".as_bytes(); // $ Alert[rust/hard-coded-cryptographic-value] + let aes_cipher9 = cfb_mode::Encryptor::::new(key9.into(), iv.into()); // $ Sink _ = aes_cipher9.encrypt_b2b(input, output).unwrap(); let key10: [u8; 32] = match base64::engine::general_purpose::STANDARD.decode(key_str) { @@ -121,16 +121,16 @@ fn test_aes_gcm( let cipher1 = Aes256Gcm::new(&key1); let _ = cipher1.encrypt(&nonce1, b"plaintext".as_ref()).unwrap(); - let key2: [u8;32] = [0;32]; // $ MISSING: Alert[rust/hard-coded-cryptographic-value] - let nonce2 = [0;12]; // $ MISSING: Alert[rust/hard-coded-cryptographic-value] - let cipher2 = Aes256Gcm::new(&key2.into()); // $ MISSING: Sink - let _ = cipher2.encrypt(&nonce2.into(), b"plaintext".as_ref()).unwrap(); // $ MISSING: Sink + let key2: [u8;32] = [0;32]; // $ Alert[rust/hard-coded-cryptographic-value] + let nonce2 = [0;12]; // $ Alert[rust/hard-coded-cryptographic-value] + let cipher2 = Aes256Gcm::new(&key2.into()); // $ Sink + let _ = cipher2.encrypt(&nonce2.into(), b"plaintext".as_ref()).unwrap(); // $ Sink - let key3_array: &[u8;32] = &[0xff;32]; // $ MISSING: Alert[rust/hard-coded-cryptographic-value] + let key3_array: &[u8;32] = &[0xff;32]; // $ Alert[rust/hard-coded-cryptographic-value] let key3 = Key::::from_slice(key3_array); - let nonce3: [u8;12] = [0xff;12]; // $ MISSING: Alert[rust/hard-coded-cryptographic-value] - let cipher3 = Aes256Gcm::new(&key3); // $ MISSING: Sink - let _ = cipher3.encrypt(&nonce3.into(), b"plaintext".as_ref()).unwrap(); // $ MISSING: Sink + let nonce3: [u8;12] = [0xff;12]; // $ Alert[rust/hard-coded-cryptographic-value] + let cipher3 = Aes256Gcm::new(&key3); // $ Sink + let _ = cipher3.encrypt(&nonce3.into(), b"plaintext".as_ref()).unwrap(); // $ Sink // with barrier From 4f4ba85e56410adec1dcc0ec2d41c8e24d3a55b6 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Tue, 1 Sep 2026 10:07:17 +0200 Subject: [PATCH 0615/2098] Unified: Add qldoc. --- unified/ql/lib/codeql/unified/internal/FacadeAst.qll | 1 + 1 file changed, 1 insertion(+) diff --git a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll index 60990e0016f9..af66648a345c 100644 --- a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll +++ b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll @@ -51,6 +51,7 @@ module Unified { /** A binary expression. */ class BinaryExpr extends G::BinaryExpr { + /** Gets an operand of this binary expression. */ Expr getAnOperand() { result = [this.getLeft(), this.getRight()] } } From 575df8efd8cd858c39d3a9a9b82169f864a9fe3f Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Thu, 27 Aug 2026 18:13:54 +0200 Subject: [PATCH 0616/2098] Skip mono/nuget C# integration tests on Ubuntu 26.04 Ubuntu dropped the `mono-complete` package in 26.04, and mono's own apt repository publishes nothing newer than `stable-focal`, so there is nothing to fall back on. 25.04 and 25.10 still ship it, so 26.04 is the cutoff. Without mono the legacy `packages.config` restore silently yields nothing and the buildless extractor falls back to downloading .NET Framework reference assemblies, so these four tests fail rather than being skipped. Uses the new `runs_on` version comparisons, which also lets the macOS clause collapse to `runs_on.macos < 15`. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- csharp/ql/integration-tests/posix/conftest.py | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/csharp/ql/integration-tests/posix/conftest.py b/csharp/ql/integration-tests/posix/conftest.py index 543bc046c982..ff1b954d1736 100644 --- a/csharp/ql/integration-tests/posix/conftest.py +++ b/csharp/ql/integration-tests/posix/conftest.py @@ -5,15 +5,10 @@ def _supports_mono_nuget(): """ Helper function to determine if the current platform supports Mono and nuget. - Returns True if running on Linux or on macOS x86_64 (excluding macos-15 and macos-26). - macOS ARM runners (macos-15 and macos-26) are excluded due to issues with Mono and nuget. + Returns True on Ubuntu before 26.04 and on macOS x86_64 before macOS 15. Linux other than + Ubuntu is not selected, as we do not test on it. + Ubuntu dropped the `mono-complete` package in 26.04, and mono is end-of-life, its own apt + repository publishing nothing newer than Ubuntu 20.04, so there is nothing to fall back on. + macOS 15 and later are ARM runners, which have issues with Mono and nuget. """ - return ( - runs_on.linux - or ( - runs_on.macos - and runs_on.x86_64 - and not runs_on.macos_15 - and not runs_on.macos_26 - ) - ) + return runs_on.ubuntu < 2604 or (runs_on.macos < 15 and runs_on.x86_64) From aab9cb67288b5182d9138d0a09657b7824fa9fa6 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Fri, 28 Aug 2026 13:59:30 +0200 Subject: [PATCH 0617/2098] Unified: Add control flow graph. --- .../ql/consistency-queries/CfgConsistency.ql | 2 + unified/ql/consistency-queries/qlpack.yml | 5 + .../unified/internal/ControlFlowGraph.qll | 277 ++++++++++++++++++ .../lib/codeql/unified/internal/FacadeAst.qll | 8 + .../ql/lib/ide-contextual-queries/printCfg.ql | 40 +++ unified/ql/lib/qlpack.yml | 3 +- unified/ql/lib/unified.qll | 1 + 7 files changed, 335 insertions(+), 1 deletion(-) create mode 100644 unified/ql/consistency-queries/CfgConsistency.ql create mode 100644 unified/ql/consistency-queries/qlpack.yml create mode 100644 unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll create mode 100644 unified/ql/lib/ide-contextual-queries/printCfg.ql diff --git a/unified/ql/consistency-queries/CfgConsistency.ql b/unified/ql/consistency-queries/CfgConsistency.ql new file mode 100644 index 000000000000..5bbfd7e22170 --- /dev/null +++ b/unified/ql/consistency-queries/CfgConsistency.ql @@ -0,0 +1,2 @@ +import unified +import ControlFlow::Consistency diff --git a/unified/ql/consistency-queries/qlpack.yml b/unified/ql/consistency-queries/qlpack.yml new file mode 100644 index 000000000000..3013f12c3257 --- /dev/null +++ b/unified/ql/consistency-queries/qlpack.yml @@ -0,0 +1,5 @@ +name: codeql/unified-consistency-queries +groups: [unified, test, consistency-queries] +dependencies: + codeql/unified-all: ${workspace} +warnOnImplicitThis: true diff --git a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll new file mode 100644 index 000000000000..18f98ad57913 --- /dev/null +++ b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll @@ -0,0 +1,277 @@ +/** + * Provides classes representing the control flow graph within callables. + */ +overlay[local?] +module; + +import unified +private import codeql.controlflow.ControlFlowGraph +private import codeql.controlflow.SuccessorType + +private module Cfg0 = Make0; + +private module Cfg1 = Make1; + +private module Cfg2 = Make2; + +private import Cfg0 +private import Cfg1 +private import Cfg2 +import Public + +/** Provides an implementation of the AST signature for Unified. */ +private module Ast implements AstSig { + private import unified as U + + class AstNode = U::AstNode; + + private predicate skipControlFlow(AstNode e) { e instanceof Modifier or e instanceof Identifier } + + AstNode getChild(AstNode n, int index) { + result.getParent() = n and + result.getParentIndex() = index and + not n instanceof Callable and + not skipControlFlow(n) and + not skipControlFlow(result) + } + + Callable getEnclosingCallable(AstNode node) { + exists(AstNode parent | parent = node.getParent() | + result = parent + or + not parent instanceof Callable and + result = getEnclosingCallable(parent) + ) + } + + class Callable = U::Callable; + + AstNode callableGetBody(Callable c) { + result = c.(AccessorDeclaration).getBody() or + result = c.(ConstructorDeclaration).getBody() or + result = c.(DestructorDeclaration).getBody() or + result = c.(FunctionDeclaration).getBody() or + result = c.(FunctionExpr).getBody() or + result = c.(InitializerDeclaration).getBody() or + result = c.(TopLevel).getBody() + } + + class Parameter extends U::Parameter { + Expr getDefaultValue() { result = super.getDefault() } + + AstNode getPattern() { result = super.getPattern() } + } + + Parameter callableGetParameter(Callable c, int index) { + result = c.(AccessorDeclaration).getParameter(index) or + result = c.(ConstructorDeclaration).getParameter(index) or + result = c.(FunctionDeclaration).getParameter(index) or + result = c.(FunctionExpr).getParameter(index) + } + + class Stmt = U::Stmt; + + class Expr = U::Expr; + + class BlockStmt = U::Block; + + class ExprStmt extends Stmt { + ExprStmt() { none() } + + Expr getExpr() { none() } + } + + class IfStmt extends Stmt { + IfStmt() { none() } + + Expr getCondition() { none() } + + Stmt getThen() { none() } + + Stmt getElse() { none() } + } + + abstract class LoopStmt extends Stmt { + Stmt getBody() { none() } + } + + class WhileStmt extends LoopStmt instanceof U::WhileStmt { + override Stmt getBody() { result = U::WhileStmt.super.getBody() } + + Expr getCondition() { result = super.getCondition() } + } + + class DoStmt extends LoopStmt instanceof U::DoWhileStmt { + override Stmt getBody() { result = U::DoWhileStmt.super.getBody() } + + Expr getCondition() { result = super.getCondition() } + } + + class UntilStmt extends LoopStmt { + UntilStmt() { none() } + + Expr getCondition() { none() } + } + + class ForStmt extends LoopStmt { + ForStmt() { none() } + + AstNode getInit(int index) { none() } + + Expr getCondition() { none() } + + AstNode getUpdate(int index) { none() } + } + + class ForeachStmt extends LoopStmt instanceof U::ForEachStmt { + override Stmt getBody() { result = U::ForEachStmt.super.getBody() } + + // TODO support foreach guard + // + // TODO: Expr != Pattern + Expr getVariable() { result = super.getPattern() } + + Expr getCollection() { result = super.getIterable() } + } + + class BreakStmt = U::BreakExpr; + + class ContinueStmt = U::ContinueExpr; + + class GotoStmt extends Stmt { + GotoStmt() { none() } + } + + class ReturnStmt extends U::ReturnExpr { + Expr getExpr() { result = super.getValue() } + } + + class Throw extends U::ThrowExpr { + Expr getExpr() { result = super.getValue() } + } + + class TryStmt extends U::TryExpr { + AstNode getBody(int index) { index = 0 and result = super.getBody() } + + CatchClause getCatch(int index) { result = super.getCatchClause(index) } + + Stmt getFinally() { none() } + } + + class CatchClause extends U::CatchClause { + AstNode getPattern() { result = super.getPattern() } + + AstNode getVariable() { none() } + + Expr getCondition() { none() } + + Stmt getBody() { result = super.getBody() } + } + + class Switch extends U::SwitchExpr { + Expr getExpr() { result = super.getValue() } + + Case getCase(int index) { result = super.getCase(index) } + + Stmt getStmt(int index) { none() } + } + + class Case extends U::SwitchCase { + AstNode getPattern(int index) { result = super.getPattern() and index = 0 } + + Expr getGuard() { none() } + + AstNode getBody() { result = super.getBody() } + } + + class DefaultCase extends Case { + DefaultCase() { not exists(super.getPattern()) } + } + + class ConditionalExpr = U::IfExpr; + + // TODO: sort out the relationship between BinaryExpr and Assignment + class BinaryExpr extends U::BinaryExpr { + Expr getLeftOperand() { result = super.getLeft() } + + Expr getRightOperand() { result = super.getRight() } + } + + class LogicalAndExpr extends BinaryExpr, U::LogicalAndExpr { } + + class LogicalOrExpr extends BinaryExpr, U::LogicalOrExpr { } + + class NullCoalescingExpr extends BinaryExpr, U::NullCoalescingExpr { } + + class UnaryExpr = U::UnaryExpr; + + class LogicalNotExpr = U::LogicalNotExpr; + + // TODO + class Assignment extends BinaryExpr { + Assignment() { none() } + } + + class AssignExpr extends Assignment { } + + class CompoundAssignment extends Assignment { } + + class AssignLogicalAndExpr extends CompoundAssignment { } + + class AssignLogicalOrExpr extends CompoundAssignment { } + + class AssignNullCoalescingExpr extends CompoundAssignment { } + + class BooleanLiteral extends U::BooleanLiteral { + boolean getValue() { result.toString() = super.getValue() } + } + + class PatternMatchExpr extends U::PatternGuardExpr { + Expr getExpr() { result = super.getValue() } + + AstNode getPattern() { result = super.getPattern() } + } +} + +private module Input implements InputSig1, InputSig2 { + private import codeql.util.Void + + predicate cfgCachedStageRef() { CfgCachedStage::ref() } + + class Label extends string { + Label() { + any(LabeledStmt l).getLabel().getValue() = this or + any(BreakExpr b).getLabel().getValue() = this or + any(ContinueExpr c).getLabel().getValue() = this + } + + string toString() { result = this } + } + + private Label getLabelOfStmt(Stmt s) { + exists(LabeledStmt l | s = l.getStmt() | + result = l.getLabel().getValue() or + result = getLabelOfStmt(l) + ) + } + + predicate hasLabel(Ast::AstNode n, Label l) { + l = getLabelOfStmt(n) + or + l = n.(BreakExpr).getLabel().getValue() + or + l = n.(ContinueExpr).getLabel().getValue() + } + + class CallableContext = Void; + + predicate beginAbruptCompletion( + AstNode ast, PreControlFlowNode n, AbruptCompletion c, boolean always + ) { + none() + } + + predicate endAbruptCompletion(AstNode ast, PreControlFlowNode n, AbruptCompletion c) { none() } + + predicate step(PreControlFlowNode n1, PreControlFlowNode n2) { none() } +} diff --git a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll index af66648a345c..3da8de4b8f03 100644 --- a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll +++ b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll @@ -39,6 +39,14 @@ module Unified { } } + /** A block statement. */ + class Block extends G::Block { + /** Gets the last statement in this block. */ + Stmt getLastStmt() { + exists(int i | result = this.getStmt(i) and not exists(this.getStmt(i + 1))) + } + } + /** An expression */ class Expr extends G::Expr { /** Gets the string value of this expression, if it is a known string constant. */ diff --git a/unified/ql/lib/ide-contextual-queries/printCfg.ql b/unified/ql/lib/ide-contextual-queries/printCfg.ql new file mode 100644 index 000000000000..f183c5c63cc9 --- /dev/null +++ b/unified/ql/lib/ide-contextual-queries/printCfg.ql @@ -0,0 +1,40 @@ +/** + * @name Print CFG + * @description Produces a representation of a file's Control Flow Graph. + * This query is used by the VS Code extension. + * @id unified/print-cfg + * @kind graph + * @tags ide-contextual-queries/print-cfg + */ + +private import unified +private import codeql.Locations + +external string selectedSourceFile(); + +private predicate selectedSourceFileAlias = selectedSourceFile/0; + +external int selectedSourceLine(); + +private predicate selectedSourceLineAlias = selectedSourceLine/0; + +external int selectedSourceColumn(); + +private predicate selectedSourceColumnAlias = selectedSourceColumn/0; + +module ViewCfgQueryInput implements ControlFlow::ViewCfgQueryInputSig { + predicate selectedSourceFile = selectedSourceFileAlias/0; + + predicate selectedSourceLine = selectedSourceLineAlias/0; + + predicate selectedSourceColumn = selectedSourceColumnAlias/0; + + predicate cfgScopeSpan( + Callable scope, File file, int startLine, int startColumn, int endLine, int endColumn + ) { + file = scope.getFile() and + scope.getLocation().hasLocationInfo(_, startLine, startColumn, endLine, endColumn) + } +} + +import ControlFlow::ViewCfgQuery diff --git a/unified/ql/lib/qlpack.yml b/unified/ql/lib/qlpack.yml index d67af16271b6..0167b114ba96 100644 --- a/unified/ql/lib/qlpack.yml +++ b/unified/ql/lib/qlpack.yml @@ -6,7 +6,8 @@ extractor: unified library: true upgrades: upgrades dependencies: - codeql/util: ${workspace} + codeql/controlflow: ${workspace} codeql/namebinding: ${workspace} + codeql/util: ${workspace} warnOnImplicitThis: true compileForOverlayEval: true diff --git a/unified/ql/lib/unified.qll b/unified/ql/lib/unified.qll index 67d6ce7558ea..033d00aa6def 100644 --- a/unified/ql/lib/unified.qll +++ b/unified/ql/lib/unified.qll @@ -6,4 +6,5 @@ import codeql.Locations import codeql.files.FileSystem import codeql.unified.internal.Ast::UnifiedFinal import codeql.unified.internal.AstExtra::Public +import codeql.unified.internal.ControlFlowGraph import codeql.unified.internal.LocalNameBinding::Public From 3ca261a18e558a6d8bb88d9e7bc9e88d35b876f3 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Tue, 1 Sep 2026 13:58:36 +0200 Subject: [PATCH 0618/2098] Unified: Move `extension` workaround into static name binding library --- .../ql/lib/codeql/unified/internal/AnalysisQuality.qll | 6 ------ .../lib/codeql/unified/internal/LocalNameBinding.qll | 3 +++ .../lib/codeql/unified/internal/StaticNameBinding.qll | 1 - .../test/library-tests/static-name-binding/test.swift | 10 +++++++++- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll index d894e02e2c7e..6f899bba4283 100644 --- a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll +++ b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll @@ -53,12 +53,6 @@ module StaticNameResolutionStats implements EntityStatsSig { or result.isModuleScopeNode(_) and result.(NamespaceNode).ref().isIdentifier(this) - ) and - // Do not consider a type extension to be a valid target - // TODO: Fix in the AST mapping: type extensions should reference their type, not declare it - not exists(ClassLikeDeclaration cls | - cls.hasModifier("extension") and - result.isIdentifier(cls.getName()) ) } diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index e9ffcd8a29af..5a44080464cc 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -231,6 +231,7 @@ private module LocalNameBindingInput implements LocalNameBindingInputSig Date: Tue, 1 Sep 2026 12:38:47 +0000 Subject: [PATCH 0619/2098] Unified: simplify Bazel build --- unified/BUILD.bazel | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/unified/BUILD.bazel b/unified/BUILD.bazel index bde1d88a9d49..ece7381dc930 100644 --- a/unified/BUILD.bazel +++ b/unified/BUILD.bazel @@ -42,10 +42,8 @@ codeql_pkg_files( codeql_pkg_files( name = "extractor-arch", exes = codeql_platform_select( - linux64 = ["//unified/extractor"], - linux_arm64 = ["//unified/extractor"], - osx64 = ["//unified/extractor"], win64 = ["//unified/extractor-unsupported-os:extractor"], + otherwise = ["//unified/extractor"], ), prefix = "tools/{CODEQL_PLATFORM}", ) From e8c6fafe0f024771ed9878db580641895357828c Mon Sep 17 00:00:00 2001 From: Jeroen Ketema <93738568+jketema@users.noreply.github.com> Date: Tue, 1 Sep 2026 12:43:40 +0000 Subject: [PATCH 0620/2098] Unified: fix formatting --- unified/BUILD.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/BUILD.bazel b/unified/BUILD.bazel index ece7381dc930..55bf87e8e38b 100644 --- a/unified/BUILD.bazel +++ b/unified/BUILD.bazel @@ -42,8 +42,8 @@ codeql_pkg_files( codeql_pkg_files( name = "extractor-arch", exes = codeql_platform_select( - win64 = ["//unified/extractor-unsupported-os:extractor"], otherwise = ["//unified/extractor"], + win64 = ["//unified/extractor-unsupported-os:extractor"], ), prefix = "tools/{CODEQL_PLATFORM}", ) From 957b71372994644a0bef70544846b435b0f942f8 Mon Sep 17 00:00:00 2001 From: yoff Date: Wed, 19 Aug 2026 13:05:03 +0200 Subject: [PATCH 0621/2098] Python: test shared CFG exception reachability Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../ExceptionReachabilityTest.expected | 0 .../ExceptionReachabilityTest.ql | 29 +++++++++++++++++++ .../ControlFlow/shared-cfg-exceptions/test.py | 12 ++++++++ 3 files changed, 41 insertions(+) create mode 100644 python/ql/test/library-tests/ControlFlow/shared-cfg-exceptions/ExceptionReachabilityTest.expected create mode 100644 python/ql/test/library-tests/ControlFlow/shared-cfg-exceptions/ExceptionReachabilityTest.ql create mode 100644 python/ql/test/library-tests/ControlFlow/shared-cfg-exceptions/test.py diff --git a/python/ql/test/library-tests/ControlFlow/shared-cfg-exceptions/ExceptionReachabilityTest.expected b/python/ql/test/library-tests/ControlFlow/shared-cfg-exceptions/ExceptionReachabilityTest.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/ql/test/library-tests/ControlFlow/shared-cfg-exceptions/ExceptionReachabilityTest.ql b/python/ql/test/library-tests/ControlFlow/shared-cfg-exceptions/ExceptionReachabilityTest.ql new file mode 100644 index 000000000000..c98e73336676 --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/shared-cfg-exceptions/ExceptionReachabilityTest.ql @@ -0,0 +1,29 @@ +/** + * Inline-expectations test for exception-handler reachability in the shared CFG. + */ + +import python +import semmle.python.controlflow.internal.AstNodeImpl as CfgImpl +import semmle.python.controlflow.internal.Cfg as Cfg +import utils.test.InlineExpectationsTest + +module ExceptionReachabilityTest implements TestSig { + string getARelevantTag() { result = "exception-handler" } + + predicate hasActualResult(Location location, string element, string tag, string value) { + exists( + Expr source, ExceptStmt handler, Cfg::ControlFlowNode sourceCfg, + Cfg::ControlFlowNode handlerEntry + | + sourceCfg.getNode() = source and + handlerEntry = sourceCfg.getAnExceptionalSuccessor() and + CfgImpl::astNodeToPyNode(handlerEntry.getAstNode()) = handler and + location = source.getLocation() and + element = source.toString() and + tag = "exception-handler" and + value = handler.getType().toString() + ) + } +} + +import MakeTest diff --git a/python/ql/test/library-tests/ControlFlow/shared-cfg-exceptions/test.py b/python/ql/test/library-tests/ControlFlow/shared-cfg-exceptions/test.py new file mode 100644 index 000000000000..3a0cbb23abaf --- /dev/null +++ b/python/ql/test/library-tests/ControlFlow/shared-cfg-exceptions/test.py @@ -0,0 +1,12 @@ +def generator(): + try: + yield # $ MISSING: exception-handler=GeneratorExit + except GeneratorExit: + return + + +def load_module(): + try: + import unavailable_module # $ MISSING: exception-handler=ImportError + except ImportError: + return None From 9df64e74ed61480ee27f3a81571a23c406833810 Mon Sep 17 00:00:00 2001 From: yoff Date: Wed, 19 Aug 2026 13:05:33 +0200 Subject: [PATCH 0622/2098] Python: wire leaf exceptions to catch entries Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../ql/lib/semmle/python/controlflow/internal/AstNodeImpl.qll | 2 +- .../library-tests/ControlFlow/shared-cfg-exceptions/test.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/python/ql/lib/semmle/python/controlflow/internal/AstNodeImpl.qll b/python/ql/lib/semmle/python/controlflow/internal/AstNodeImpl.qll index 78218f489215..e4666b74d172 100644 --- a/python/ql/lib/semmle/python/controlflow/internal/AstNodeImpl.qll +++ b/python/ql/lib/semmle/python/controlflow/internal/AstNodeImpl.qll @@ -1724,7 +1724,7 @@ private module Input implements InputSig1, InputSig2 { always = true or mayThrow(ast) and - n.isIn(ast) and + n.injects(ast) and c.asSimpleAbruptCompletion() instanceof ExceptionSuccessor and always = false } diff --git a/python/ql/test/library-tests/ControlFlow/shared-cfg-exceptions/test.py b/python/ql/test/library-tests/ControlFlow/shared-cfg-exceptions/test.py index 3a0cbb23abaf..0e55eba97407 100644 --- a/python/ql/test/library-tests/ControlFlow/shared-cfg-exceptions/test.py +++ b/python/ql/test/library-tests/ControlFlow/shared-cfg-exceptions/test.py @@ -1,12 +1,12 @@ def generator(): try: - yield # $ MISSING: exception-handler=GeneratorExit + yield # $ exception-handler=GeneratorExit except GeneratorExit: return def load_module(): try: - import unavailable_module # $ MISSING: exception-handler=ImportError + import unavailable_module # $ exception-handler=ImportError except ImportError: return None From 8d65f0a8ad387650473b23fed74071c479de5db6 Mon Sep 17 00:00:00 2001 From: yoff Date: Tue, 25 Aug 2026 14:23:37 +0200 Subject: [PATCH 0623/2098] Python: model throwing leaves as post-order Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 860cd56d-31cf-49f4-a947-45e0d72447c6 --- .../ql/lib/semmle/python/controlflow/internal/AstNodeImpl.qll | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/python/ql/lib/semmle/python/controlflow/internal/AstNodeImpl.qll b/python/ql/lib/semmle/python/controlflow/internal/AstNodeImpl.qll index e4666b74d172..7e653c7b9a16 100644 --- a/python/ql/lib/semmle/python/controlflow/internal/AstNodeImpl.qll +++ b/python/ql/lib/semmle/python/controlflow/internal/AstNodeImpl.qll @@ -1626,6 +1626,8 @@ private module Input implements InputSig1, InputSig2 { n = any(Ast::AssertStmt a).getTest() } + predicate postOrInOrder(Ast::AstNode n) { mayThrow(n) } + private string assertThrowTag() { result = "[assert-throw]" } /** @@ -1724,7 +1726,7 @@ private module Input implements InputSig1, InputSig2 { always = true or mayThrow(ast) and - n.injects(ast) and + n.isIn(ast) and c.asSimpleAbruptCompletion() instanceof ExceptionSuccessor and always = false } From 918ff2e39d0cad1fd76db3ca956495317e4653b5 Mon Sep 17 00:00:00 2001 From: yoff Date: Tue, 1 Sep 2026 14:18:51 +0200 Subject: [PATCH 0624/2098] Python: Restrict the set of throwing exceptions Technically all unary and binary expressions can throw if they dispatch to dunder implementations (such as __neq__). But we omit these edges to obtain a more useful CFG; the cases where user code catches these exceptions are probably rare. --- .../python/controlflow/internal/AstNodeImpl.qll | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/python/ql/lib/semmle/python/controlflow/internal/AstNodeImpl.qll b/python/ql/lib/semmle/python/controlflow/internal/AstNodeImpl.qll index 7e653c7b9a16..1a2e6487805b 100644 --- a/python/ql/lib/semmle/python/controlflow/internal/AstNodeImpl.qll +++ b/python/ql/lib/semmle/python/controlflow/internal/AstNodeImpl.qll @@ -1635,12 +1635,15 @@ private module Input implements InputSig1, InputSig2 { * its normal evaluation (not via an explicit `raise`/`assert`, which are * modeled separately). * - * The set mirrors what the legacy CFG used to flag implicitly: function + * `TypeError` is intentionally excluded along with exceptions thrown by dunder + * implementations to avoid cluttering the CFG; we expect user code to catch + * these only rarely. + * + * Otherwise, the set mirrors what the legacy CFG used to flag implicitly: function * calls (anything can raise), attribute access (`AttributeError`), - * subscript access (`IndexError`/`KeyError`/`TypeError`), arithmetic and - * comparison operators (`TypeError`/`ZeroDivisionError`), imports + * subscript access (`IndexError`/`KeyError`), division (`ZeroDivisionError`), imports * (`ImportError`/`ModuleNotFoundError`), and generator/coroutine - * suspension points (`await`/`yield`/`yield from`). + * suspension points (`await`/`yield`/`yield from` throwing `CancelledError` or `GeneratorExit`). * * Bare `Name` reads are intentionally excluded — modeling every name * read as `mayThrow` would explode CFG edge count for negligible @@ -1654,11 +1657,7 @@ private module Input implements InputSig1, InputSig2 { or e instanceof Py::Subscript or - e instanceof Py::BinaryExpr - or - e instanceof Py::UnaryExpr - or - e instanceof Py::Compare + e instanceof Py::BinaryExpr and e.(Py::BinaryExpr).getOp() instanceof Py::Div or e instanceof Py::ImportExpr or From 8116060b90a7cc72bf1dcb1c8b666ca87108508c Mon Sep 17 00:00:00 2001 From: Taus Date: Tue, 1 Sep 2026 13:59:55 +0000 Subject: [PATCH 0625/2098] Python: Add telemetry for Python analysis version Here' `python_analysis_version` is the version of Python that we are analysing the code as. In practice, all we care about is the major version, but we might as well include the full thing (since it can be overridden on the command line). The `python_runtime_version` is the actual version of Python that ran the extractor. --- .../writing-diagnostics/diagnostics.expected | 20 +++++++ python/extractor/semmle/logging.py | 12 +++++ python/extractor/semmle/util.py | 2 +- python/extractor/semmle/worker.py | 10 +++- python/extractor/tests/test_diagnostics.py | 54 +++++++++++++++++++ 5 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 python/extractor/tests/test_diagnostics.py diff --git a/python/extractor/cli-integration-test/writing-diagnostics/diagnostics.expected b/python/extractor/cli-integration-test/writing-diagnostics/diagnostics.expected index 12a241ad7b68..715fb8dd12f7 100644 --- a/python/extractor/cli-integration-test/writing-diagnostics/diagnostics.expected +++ b/python/extractor/cli-integration-test/writing-diagnostics/diagnostics.expected @@ -161,3 +161,23 @@ "telemetry": true } } +{ + "attributes": { + "extractor_version": "7.1.10", + "python_analysis_version": "3.12", + "python_runtime_version": "3.12.3" + }, + "markdownMessage": "Internal telemetry for the Python extractor.\n\nNo action needed.", + "severity": "note", + "source": { + "extractorName": "python", + "id": "py/extractor/summary", + "name": "Python extractor telemetry" + }, + "timestamp": "2026-09-01T13:41:33.056818Z", + "visibility": { + "cliSummaryTable": false, + "statusPage": false, + "telemetry": true + } +} diff --git a/python/extractor/semmle/logging.py b/python/extractor/semmle/logging.py index 64037163e697..369592534676 100644 --- a/python/extractor/semmle/logging.py +++ b/python/extractor/semmle/logging.py @@ -8,6 +8,9 @@ import multiprocessing import enum import datetime +import platform + +from semmle.util import VERSION, get_analysis_version #Use standard Semmle logging levels @@ -355,6 +358,15 @@ def with_timestamp(self, timestamp): self.timestamp = timestamp return self +def extractor_telemetry_message(): + return (DiagnosticMessage(Source("py/extractor/summary", "Python extractor telemetry"), Severity.NOTE) + .markdown("Internal telemetry for the Python extractor.\n\nNo action needed.") + .attribute("python_analysis_version", get_analysis_version()) + .attribute("python_runtime_version", platform.python_version()) + .attribute("extractor_version", VERSION) + .telemetry() + ) + def get_stack_trace_lines(): """Creates a stack trace for inclusion into the `attributes` part of a diagnostic message. Limits the size of the stack trace to 5000 characters, so as to not make the SARIF file overly big. diff --git a/python/extractor/semmle/util.py b/python/extractor/semmle/util.py index 977d47c69dca..60d215e5bdf4 100644 --- a/python/extractor/semmle/util.py +++ b/python/extractor/semmle/util.py @@ -10,7 +10,7 @@ #Semantic version of extractor. #Update this if any changes are made -VERSION = "7.1.9" +VERSION = "7.1.10" PY_EXTENSIONS = ".py", ".pyw" diff --git a/python/extractor/semmle/worker.py b/python/extractor/semmle/worker.py index ac8231390742..8d771828ada8 100644 --- a/python/extractor/semmle/worker.py +++ b/python/extractor/semmle/worker.py @@ -10,7 +10,7 @@ from semmle.extractors import SuperExtractor, ModulePrinter, SkippedBuiltin from semmle.profiling import get_profiler from semmle.path_rename import renamer_from_options_and_env -from semmle.logging import WARN, recursion_error_message, internal_error_message, Logger +from semmle.logging import WARN, recursion_error_message, internal_error_message, extractor_telemetry_message, Logger from semmle.util import FileExtractable, FolderExtractable class ExtractorFailure(Exception): @@ -239,6 +239,12 @@ def _drain_queue(queue): #Emptied queue as best we can. pass +def _write_extractor_telemetry(diagnostics_writer, logger: Logger): + try: + diagnostics_writer.write(extractor_telemetry_message()) + except OSError as ex: + logger.warning("Failed to write extractor telemetry: %s", ex) + class DiagnosticsWriter(object): def __init__(self, proc_id): self.proc_id = proc_id @@ -276,6 +282,8 @@ def _extract_loop(proc_id, queue, trap_dir, archive, options, reply_queue, logge reply_queue.put(("INTERRUPT", None, None)) sys.exit(2) logger.set_process_id(proc_id) + if write_global_data: + _write_extractor_telemetry(diagnostics_writer, logger) try: if options.trace_only: extractor = ModulePrinter(options, trap_dir, archive, renamer, logger) diff --git a/python/extractor/tests/test_diagnostics.py b/python/extractor/tests/test_diagnostics.py new file mode 100644 index 000000000000..a40f339e3e4b --- /dev/null +++ b/python/extractor/tests/test_diagnostics.py @@ -0,0 +1,54 @@ +import platform + +from semmle import logging +from semmle import util +from semmle import worker + + +def test_extractor_telemetry_message(mocker): + mocker.patch("semmle.logging.get_analysis_version", return_value="3.13") + + message = logging.extractor_telemetry_message().to_dict() + message.pop("timestamp") + + assert message == { + "source": { + "id": "py/extractor/summary", + "name": "Python extractor telemetry", + "extractorName": "python", + }, + "severity": "note", + "markdownMessage": "Internal telemetry for the Python extractor.\n\nNo action needed.", + "visibility": { + "statusPage": False, + "cliSummaryTable": False, + "telemetry": True, + }, + "attributes": { + "python_analysis_version": "3.13", + "python_runtime_version": platform.python_version(), + "extractor_version": util.VERSION, + }, + } + + +def test_write_extractor_telemetry(mocker): + diagnostics_writer = mocker.Mock() + logger = mocker.Mock() + + worker._write_extractor_telemetry(diagnostics_writer, logger) + + diagnostics_writer.write.assert_called_once() + logger.warning.assert_not_called() + + +def test_write_extractor_telemetry_handles_io_error(mocker): + diagnostics_writer = mocker.Mock() + diagnostics_writer.write.side_effect = OSError("write failed") + logger = mocker.Mock() + + worker._write_extractor_telemetry(diagnostics_writer, logger) + + logger.warning.assert_called_once_with( + "Failed to write extractor telemetry: %s", diagnostics_writer.write.side_effect + ) From 66089849eac54946dcf78f62a95006f3402dd6bb Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 31 Aug 2026 14:59:41 +0200 Subject: [PATCH 0626/2098] FlowSummaryImpl: Model more source/sink steps as jump steps --- .../dataflow/external-models/flow.expected | 48 +++++++++----- .../dataflow/models/models.expected | 48 ++++++++++---- .../sources/database/InlineFlow.expected | 52 +++++++++------ .../web_frameworks/InlineFlow.expected | 64 +++++++++++++------ .../security/CWE-079/actix/XSS.expected | 4 +- .../security/CWE-079/axum/XSS.expected | 4 +- .../security/CWE-079/warp/XSS.expected | 4 +- .../security/CWE-117/LogInjection.expected | 4 +- .../security/CWE-918/RequestForgery.expected | 4 +- .../dataflow/internal/FlowSummaryImpl.qll | 16 +++-- 10 files changed, 174 insertions(+), 74 deletions(-) diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index b6f5f4a4452f..74f24322340f 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -240,6 +240,7 @@ edges | test.cpp:223:12:223:12 | *s | test.cpp:223:13:223:15 | call to operator[] | provenance | MaD:87 | | test.cpp:223:13:223:15 | call to operator[] | test.cpp:223:13:223:15 | call to operator[] | provenance | | | test.cpp:223:13:223:15 | call to operator[] | test.cpp:224:11:224:11 | c | provenance | Sink:MaD:3 | +| test.cpp:242:29:242:29 | *s [value] | test.cpp:243:10:243:10 | *s [value] | provenance | | | test.cpp:243:10:243:10 | *s [value] | test.cpp:243:13:243:17 | value | provenance | | | test.cpp:243:13:243:17 | value | test.cpp:243:13:243:17 | value | provenance | Sink:MaD:3 | | test.cpp:247:26:247:39 | call to ymlFieldSource | test.cpp:247:26:247:39 | call to ymlFieldSource [value] | provenance | Src:MaD:47 | @@ -247,35 +248,41 @@ edges | test.cpp:248:10:248:16 | *wrapper [value] | test.cpp:248:18:248:22 | value | provenance | | | test.cpp:248:18:248:22 | value | test.cpp:248:18:248:22 | value | provenance | Sink:MaD:3 | | test.cpp:250:32:250:32 | source_from_callback_template output argument | test.cpp:250:32:250:32 | source_from_callback_template output argument [value] | provenance | Src:MaD:40 | -| test.cpp:250:32:250:32 | source_from_callback_template output argument [value] | test.cpp:243:10:243:10 | *s [value] | provenance | | +| test.cpp:250:32:250:32 | source_from_callback_template output argument [value] | test.cpp:242:29:242:29 | *s [value] | provenance | | | test.cpp:251:27:251:27 | source_from_callback_ptr output argument | test.cpp:251:27:251:27 | source_from_callback_ptr output argument [value] | provenance | Src:MaD:37 | -| test.cpp:251:27:251:27 | source_from_callback_ptr output argument [value] | test.cpp:243:10:243:10 | *s [value] | provenance | | +| test.cpp:251:27:251:27 | source_from_callback_ptr output argument [value] | test.cpp:242:29:242:29 | *s [value] | provenance | | +| test.cpp:257:35:257:35 | *s [value] | test.cpp:258:12:258:12 | *s [value] | provenance | | | test.cpp:258:12:258:12 | *s [value] | test.cpp:258:15:258:19 | value | provenance | | | test.cpp:258:15:258:19 | value | test.cpp:258:15:258:19 | value | provenance | Sink:MaD:3 | | test.cpp:262:27:262:31 | source_from_callback_ptr output argument | test.cpp:262:27:262:31 | source_from_callback_ptr output argument [value] | provenance | Src:MaD:37 | -| test.cpp:262:27:262:31 | source_from_callback_ptr output argument [value] | test.cpp:243:10:243:10 | *s [value] | provenance | | -| test.cpp:262:27:262:31 | source_from_callback_ptr output argument [value] | test.cpp:258:12:258:12 | *s [value] | provenance | | +| test.cpp:262:27:262:31 | source_from_callback_ptr output argument [value] | test.cpp:242:29:242:29 | *s [value] | provenance | | +| test.cpp:262:27:262:31 | source_from_callback_ptr output argument [value] | test.cpp:257:35:257:35 | *s [value] | provenance | | | test.cpp:264:32:266:2 | source_from_callback_template output argument | test.cpp:264:32:266:2 | source_from_callback_template output argument [value] | provenance | Src:MaD:40 | -| test.cpp:264:32:266:2 | source_from_callback_template output argument [value] | test.cpp:265:11:265:11 | *s [value] | provenance | | +| test.cpp:264:32:266:2 | source_from_callback_template output argument [value] | test.cpp:264:56:264:56 | *s [value] | provenance | | +| test.cpp:264:56:264:56 | *s [value] | test.cpp:265:11:265:11 | *s [value] | provenance | | | test.cpp:265:11:265:11 | *s [value] | test.cpp:265:14:265:18 | value | provenance | | | test.cpp:265:14:265:18 | value | test.cpp:265:14:265:18 | value | provenance | Sink:MaD:3 | | test.cpp:268:27:268:27 | source_from_callback_ptr output argument | test.cpp:268:27:268:27 | source_from_callback_ptr output argument [value] | provenance | Src:MaD:37 | -| test.cpp:268:27:268:27 | source_from_callback_ptr output argument [value] | test.cpp:269:11:269:11 | *s [value] | provenance | | +| test.cpp:268:27:268:27 | source_from_callback_ptr output argument [value] | test.cpp:268:51:268:51 | *s [value] | provenance | | +| test.cpp:268:51:268:51 | *s [value] | test.cpp:269:11:269:11 | *s [value] | provenance | | | test.cpp:269:11:269:11 | *s [value] | test.cpp:269:14:269:18 | value | provenance | | | test.cpp:269:14:269:18 | value | test.cpp:269:14:269:18 | value | provenance | Sink:MaD:3 | +| test.cpp:273:40:273:40 | *s [value] | test.cpp:274:12:274:12 | *s [value] | provenance | | | test.cpp:274:12:274:12 | *s [value] | test.cpp:274:15:274:19 | value | provenance | | | test.cpp:274:15:274:19 | value | test.cpp:274:15:274:19 | value | provenance | Sink:MaD:3 | | test.cpp:278:32:278:34 | source_from_callback_template output argument | test.cpp:278:32:278:34 | source_from_callback_template output argument [value] | provenance | Src:MaD:40 | -| test.cpp:278:32:278:34 | source_from_callback_template output argument [value] | test.cpp:274:12:274:12 | *s [value] | provenance | | +| test.cpp:278:32:278:34 | source_from_callback_template output argument [value] | test.cpp:273:40:273:40 | *s [value] | provenance | | | test.cpp:293:5:293:26 | *callback_returning_int | test.cpp:307:10:307:31 | call to callback_returning_int | provenance | | | test.cpp:294:5:294:28 | *callback_returning_int_2 | test.cpp:310:10:310:33 | call to callback_returning_int_2 | provenance | | | test.cpp:295:6:295:31 | **callback_returning_ptr_int | test.cpp:313:13:313:38 | *call to callback_returning_ptr_int | provenance | | +| test.cpp:297:5:297:20 | *return_ymlSource | test.cpp:318:37:318:52 | return_ymlSource | provenance | Sink:MaD:1 | +| test.cpp:297:33:297:41 | call to ymlSource | test.cpp:297:5:297:20 | *return_ymlSource | provenance | | +| test.cpp:297:33:297:41 | call to ymlSource | test.cpp:297:5:297:20 | *return_ymlSource | provenance | Src:MaD:48 | | test.cpp:297:33:297:41 | call to ymlSource | test.cpp:297:33:297:41 | call to ymlSource | provenance | Src:MaD:48 | -| test.cpp:297:33:297:41 | call to ymlSource | test.cpp:318:37:318:52 | return_ymlSource | provenance | Sink:MaD:1 | -| test.cpp:297:33:297:41 | call to ymlSource | test.cpp:318:37:318:52 | return_ymlSource | provenance | Src:MaD:48 Sink:MaD:1 | -| test.cpp:299:41:299:52 | *call to ymlSourcePtr | test.cpp:321:36:321:58 | return_ptr_to_ymlSource | provenance | Sink:MaD:2 | +| test.cpp:299:6:299:28 | **return_ptr_to_ymlSource | test.cpp:321:36:321:58 | return_ptr_to_ymlSource | provenance | Sink:MaD:2 | +| test.cpp:299:41:299:52 | *call to ymlSourcePtr | test.cpp:299:6:299:28 | **return_ptr_to_ymlSource | provenance | | +| test.cpp:299:41:299:52 | call to ymlSourcePtr | test.cpp:299:6:299:28 | **return_ptr_to_ymlSource | provenance | Src:MaD:49 | | test.cpp:299:41:299:52 | call to ymlSourcePtr | test.cpp:299:41:299:52 | *call to ymlSourcePtr | provenance | Src:MaD:49 | -| test.cpp:299:41:299:52 | call to ymlSourcePtr | test.cpp:321:36:321:58 | return_ptr_to_ymlSource | provenance | Src:MaD:49 Sink:MaD:2 | | test.cpp:304:11:304:22 | call to ymlSourcePtr | test.cpp:304:10:304:24 | * ... | provenance | Src:MaD:49 Sink:MaD:3 | | test.cpp:306:39:306:60 | source_from_callback_return_template output argument | test.cpp:293:5:293:26 | *callback_returning_int | provenance | Src:MaD:39 | | test.cpp:307:10:307:31 | call to callback_returning_int | test.cpp:307:10:307:31 | call to callback_returning_int | provenance | Sink:MaD:3 | @@ -284,11 +291,13 @@ edges | test.cpp:312:38:312:63 | source_ptr_from_callback_return_ptr output argument | test.cpp:295:6:295:31 | **callback_returning_ptr_int | provenance | Src:MaD:41 | | test.cpp:313:13:313:38 | *call to callback_returning_ptr_int | test.cpp:313:13:313:38 | *call to callback_returning_ptr_int | provenance | | | test.cpp:313:13:313:38 | *call to callback_returning_ptr_int | test.cpp:315:10:315:13 | * ... | provenance | Sink:MaD:3 | -| test.cpp:317:51:317:59 | call to ymlSource | test.cpp:317:37:317:64 | [...](...){...} | provenance | Sink:MaD:1 | -| test.cpp:317:51:317:59 | call to ymlSource | test.cpp:317:37:317:64 | [...](...){...} | provenance | Src:MaD:48 Sink:MaD:1 | +| test.cpp:317:39:317:39 | *operator() | test.cpp:317:37:317:64 | [...](...){...} | provenance | Sink:MaD:1 | +| test.cpp:317:51:317:59 | call to ymlSource | test.cpp:317:39:317:39 | *operator() | provenance | | +| test.cpp:317:51:317:59 | call to ymlSource | test.cpp:317:39:317:39 | *operator() | provenance | Src:MaD:48 | | test.cpp:317:51:317:59 | call to ymlSource | test.cpp:317:51:317:59 | call to ymlSource | provenance | Src:MaD:48 | -| test.cpp:320:50:320:61 | *call to ymlSourcePtr | test.cpp:320:36:320:36 | call to operator int *(*)() | provenance | Sink:MaD:2 | -| test.cpp:320:50:320:61 | call to ymlSourcePtr | test.cpp:320:36:320:36 | call to operator int *(*)() | provenance | Src:MaD:49 Sink:MaD:2 | +| test.cpp:320:38:320:38 | **operator() | test.cpp:320:36:320:36 | call to operator int *(*)() | provenance | Sink:MaD:2 | +| test.cpp:320:50:320:61 | *call to ymlSourcePtr | test.cpp:320:38:320:38 | **operator() | provenance | | +| test.cpp:320:50:320:61 | call to ymlSourcePtr | test.cpp:320:38:320:38 | **operator() | provenance | Src:MaD:49 | | test.cpp:320:50:320:61 | call to ymlSourcePtr | test.cpp:320:50:320:61 | *call to ymlSourcePtr | provenance | Src:MaD:49 | | test.cpp:324:36:324:36 | p | test.cpp:325:10:325:10 | *p [value] | provenance | Src:MaD:43 | | test.cpp:324:36:324:36 | p | test.cpp:327:11:327:11 | *p [*pointer] | provenance | Src:MaD:42 | @@ -640,6 +649,7 @@ nodes | test.cpp:223:13:223:15 | call to operator[] | semmle.label | call to operator[] | | test.cpp:223:13:223:15 | call to operator[] | semmle.label | call to operator[] | | test.cpp:224:11:224:11 | c | semmle.label | c | +| test.cpp:242:29:242:29 | *s [value] | semmle.label | *s [value] | | test.cpp:243:10:243:10 | *s [value] | semmle.label | *s [value] | | test.cpp:243:13:243:17 | value | semmle.label | value | | test.cpp:243:13:243:17 | value | semmle.label | value | @@ -652,6 +662,7 @@ nodes | test.cpp:250:32:250:32 | source_from_callback_template output argument [value] | semmle.label | source_from_callback_template output argument [value] | | test.cpp:251:27:251:27 | source_from_callback_ptr output argument | semmle.label | source_from_callback_ptr output argument | | test.cpp:251:27:251:27 | source_from_callback_ptr output argument [value] | semmle.label | source_from_callback_ptr output argument [value] | +| test.cpp:257:35:257:35 | *s [value] | semmle.label | *s [value] | | test.cpp:258:12:258:12 | *s [value] | semmle.label | *s [value] | | test.cpp:258:15:258:19 | value | semmle.label | value | | test.cpp:258:15:258:19 | value | semmle.label | value | @@ -659,14 +670,17 @@ nodes | test.cpp:262:27:262:31 | source_from_callback_ptr output argument [value] | semmle.label | source_from_callback_ptr output argument [value] | | test.cpp:264:32:266:2 | source_from_callback_template output argument | semmle.label | source_from_callback_template output argument | | test.cpp:264:32:266:2 | source_from_callback_template output argument [value] | semmle.label | source_from_callback_template output argument [value] | +| test.cpp:264:56:264:56 | *s [value] | semmle.label | *s [value] | | test.cpp:265:11:265:11 | *s [value] | semmle.label | *s [value] | | test.cpp:265:14:265:18 | value | semmle.label | value | | test.cpp:265:14:265:18 | value | semmle.label | value | | test.cpp:268:27:268:27 | source_from_callback_ptr output argument | semmle.label | source_from_callback_ptr output argument | | test.cpp:268:27:268:27 | source_from_callback_ptr output argument [value] | semmle.label | source_from_callback_ptr output argument [value] | +| test.cpp:268:51:268:51 | *s [value] | semmle.label | *s [value] | | test.cpp:269:11:269:11 | *s [value] | semmle.label | *s [value] | | test.cpp:269:14:269:18 | value | semmle.label | value | | test.cpp:269:14:269:18 | value | semmle.label | value | +| test.cpp:273:40:273:40 | *s [value] | semmle.label | *s [value] | | test.cpp:274:12:274:12 | *s [value] | semmle.label | *s [value] | | test.cpp:274:15:274:19 | value | semmle.label | value | | test.cpp:274:15:274:19 | value | semmle.label | value | @@ -675,8 +689,10 @@ nodes | test.cpp:293:5:293:26 | *callback_returning_int | semmle.label | *callback_returning_int | | test.cpp:294:5:294:28 | *callback_returning_int_2 | semmle.label | *callback_returning_int_2 | | test.cpp:295:6:295:31 | **callback_returning_ptr_int | semmle.label | **callback_returning_ptr_int | +| test.cpp:297:5:297:20 | *return_ymlSource | semmle.label | *return_ymlSource | | test.cpp:297:33:297:41 | call to ymlSource | semmle.label | call to ymlSource | | test.cpp:297:33:297:41 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:299:6:299:28 | **return_ptr_to_ymlSource | semmle.label | **return_ptr_to_ymlSource | | test.cpp:299:41:299:52 | *call to ymlSourcePtr | semmle.label | *call to ymlSourcePtr | | test.cpp:299:41:299:52 | call to ymlSourcePtr | semmle.label | call to ymlSourcePtr | | test.cpp:304:10:304:24 | * ... | semmle.label | * ... | @@ -692,10 +708,12 @@ nodes | test.cpp:313:13:313:38 | *call to callback_returning_ptr_int | semmle.label | *call to callback_returning_ptr_int | | test.cpp:315:10:315:13 | * ... | semmle.label | * ... | | test.cpp:317:37:317:64 | [...](...){...} | semmle.label | [...](...){...} | +| test.cpp:317:39:317:39 | *operator() | semmle.label | *operator() | | test.cpp:317:51:317:59 | call to ymlSource | semmle.label | call to ymlSource | | test.cpp:317:51:317:59 | call to ymlSource | semmle.label | call to ymlSource | | test.cpp:318:37:318:52 | return_ymlSource | semmle.label | return_ymlSource | | test.cpp:320:36:320:36 | call to operator int *(*)() | semmle.label | call to operator int *(*)() | +| test.cpp:320:38:320:38 | **operator() | semmle.label | **operator() | | test.cpp:320:50:320:61 | *call to ymlSourcePtr | semmle.label | *call to ymlSourcePtr | | test.cpp:320:50:320:61 | call to ymlSourcePtr | semmle.label | call to ymlSourcePtr | | test.cpp:321:36:321:58 | return_ptr_to_ymlSource | semmle.label | return_ptr_to_ymlSource | diff --git a/rust/ql/test/library-tests/dataflow/models/models.expected b/rust/ql/test/library-tests/dataflow/models/models.expected index 3988b6d77fae..4bb38eb73ca3 100644 --- a/rust/ql/test/library-tests/dataflow/models/models.expected +++ b/rust/ql/test/library-tests/dataflow/models/models.expected @@ -269,18 +269,28 @@ edges | main.rs:281:9:281:37 | ...::C {...} [C] | main.rs:281:35:281:35 | i | provenance | | | main.rs:281:35:281:35 | i | main.rs:281:47:281:47 | i | provenance | | | main.rs:281:35:281:35 | i | main.rs:281:47:281:47 | i | provenance | | -| main.rs:303:24:303:24 | a | main.rs:302:26:302:26 | a | provenance | Src:MaD:21 | -| main.rs:303:24:303:24 | a | main.rs:302:26:302:26 | a | provenance | Src:MaD:21 | -| main.rs:305:24:307:9 | \|...\| ... | main.rs:306:18:306:18 | a | provenance | Src:MaD:21 | -| main.rs:305:24:307:9 | \|...\| ... | main.rs:306:18:306:18 | a | provenance | Src:MaD:21 | -| main.rs:312:24:312:24 | f | main.rs:310:18:310:18 | a | provenance | Src:MaD:21 | -| main.rs:312:24:312:24 | f | main.rs:310:18:310:18 | a | provenance | Src:MaD:21 | -| main.rs:314:24:316:9 | \|...\| ... | main.rs:315:18:315:18 | a | provenance | Src:MaD:21 | -| main.rs:314:24:316:9 | \|...\| ... | main.rs:315:18:315:18 | a | provenance | Src:MaD:21 | +| main.rs:302:18:302:18 | ... | main.rs:302:26:302:26 | a | provenance | | +| main.rs:302:18:302:18 | ... | main.rs:302:26:302:26 | a | provenance | | +| main.rs:303:24:303:24 | a | main.rs:302:18:302:18 | ... | provenance | Src:MaD:21 | +| main.rs:303:24:303:24 | a | main.rs:302:18:302:18 | ... | provenance | Src:MaD:21 | +| main.rs:305:24:307:9 | \|...\| ... | main.rs:305:25:305:25 | ... | provenance | Src:MaD:21 | +| main.rs:305:24:307:9 | \|...\| ... | main.rs:305:25:305:25 | ... | provenance | Src:MaD:21 | +| main.rs:305:25:305:25 | ... | main.rs:306:18:306:18 | a | provenance | | +| main.rs:305:25:305:25 | ... | main.rs:306:18:306:18 | a | provenance | | +| main.rs:309:14:309:19 | ...: i64 | main.rs:310:18:310:18 | a | provenance | | +| main.rs:309:14:309:19 | ...: i64 | main.rs:310:18:310:18 | a | provenance | | +| main.rs:312:24:312:24 | f | main.rs:309:14:309:19 | ...: i64 | provenance | Src:MaD:21 | +| main.rs:312:24:312:24 | f | main.rs:309:14:309:19 | ...: i64 | provenance | Src:MaD:21 | +| main.rs:314:24:316:9 | \|...\| ... | main.rs:314:36:314:36 | ... | provenance | Src:MaD:21 | +| main.rs:314:24:316:9 | \|...\| ... | main.rs:314:36:314:36 | ... | provenance | Src:MaD:21 | +| main.rs:314:36:314:36 | ... | main.rs:315:18:315:18 | a | provenance | | +| main.rs:314:36:314:36 | ... | main.rs:315:18:315:18 | a | provenance | | | main.rs:318:31:329:9 | \|...\| ... | main.rs:318:31:329:9 | \|...\| ... [E, Some] | provenance | Src:MaD:22 | | main.rs:318:31:329:9 | \|...\| ... | main.rs:318:31:329:9 | \|...\| ... [E, Some] | provenance | Src:MaD:22 | -| main.rs:318:31:329:9 | \|...\| ... [E, Some] | main.rs:319:19:319:19 | e [E, Some] | provenance | | -| main.rs:318:31:329:9 | \|...\| ... [E, Some] | main.rs:319:19:319:19 | e [E, Some] | provenance | | +| main.rs:318:31:329:9 | \|...\| ... [E, Some] | main.rs:318:32:318:32 | ... [E, Some] | provenance | | +| main.rs:318:31:329:9 | \|...\| ... [E, Some] | main.rs:318:32:318:32 | ... [E, Some] | provenance | | +| main.rs:318:32:318:32 | ... [E, Some] | main.rs:319:19:319:19 | e [E, Some] | provenance | | +| main.rs:318:32:318:32 | ... [E, Some] | main.rs:319:19:319:19 | e [E, Some] | provenance | | | main.rs:319:19:319:19 | e [E, Some] | main.rs:322:17:322:45 | ...::E {...} [E, Some] | provenance | | | main.rs:319:19:319:19 | e [E, Some] | main.rs:322:17:322:45 | ...::E {...} [E, Some] | provenance | | | main.rs:322:17:322:45 | ...::E {...} [E, Some] | main.rs:322:43:322:43 | o [Some] | provenance | | @@ -295,12 +305,14 @@ edges | main.rs:324:30:324:30 | i | main.rs:324:41:324:41 | i | provenance | | | main.rs:344:21:344:29 | source(...) | main.rs:345:19:345:19 | a | provenance | Sink:MaD:9 | | main.rs:344:21:344:29 | source(...) | main.rs:345:19:345:19 | a | provenance | Sink:MaD:9 | +| main.rs:347:22:352:9 | { ... } [E, Some] | main.rs:353:26:353:26 | b [E, Some] | provenance | | +| main.rs:347:22:352:9 | { ... } [E, Some] | main.rs:353:26:353:26 | b [E, Some] | provenance | | | main.rs:348:17:348:17 | s | main.rs:350:39:350:39 | s | provenance | | | main.rs:348:17:348:17 | s | main.rs:350:39:350:39 | s | provenance | | | main.rs:348:21:348:29 | source(...) | main.rs:348:17:348:17 | s | provenance | | | main.rs:348:21:348:29 | source(...) | main.rs:348:17:348:17 | s | provenance | | -| main.rs:349:13:351:13 | ...::E {...} [E, Some] | main.rs:353:26:353:26 | b [E, Some] | provenance | | -| main.rs:349:13:351:13 | ...::E {...} [E, Some] | main.rs:353:26:353:26 | b [E, Some] | provenance | | +| main.rs:349:13:351:13 | ...::E {...} [E, Some] | main.rs:347:22:352:9 | { ... } [E, Some] | provenance | | +| main.rs:349:13:351:13 | ...::E {...} [E, Some] | main.rs:347:22:352:9 | { ... } [E, Some] | provenance | | | main.rs:350:26:350:40 | ...::Some(...) [Some] | main.rs:349:13:351:13 | ...::E {...} [E, Some] | provenance | | | main.rs:350:26:350:40 | ...::Some(...) [Some] | main.rs:349:13:351:13 | ...::E {...} [E, Some] | provenance | | | main.rs:350:39:350:39 | s | main.rs:350:26:350:40 | ...::Some(...) [Some] | provenance | | @@ -670,26 +682,36 @@ nodes | main.rs:281:35:281:35 | i | semmle.label | i | | main.rs:281:47:281:47 | i | semmle.label | i | | main.rs:281:47:281:47 | i | semmle.label | i | +| main.rs:302:18:302:18 | ... | semmle.label | ... | +| main.rs:302:18:302:18 | ... | semmle.label | ... | | main.rs:302:26:302:26 | a | semmle.label | a | | main.rs:302:26:302:26 | a | semmle.label | a | | main.rs:303:24:303:24 | a | semmle.label | a | | main.rs:303:24:303:24 | a | semmle.label | a | | main.rs:305:24:307:9 | \|...\| ... | semmle.label | \|...\| ... | | main.rs:305:24:307:9 | \|...\| ... | semmle.label | \|...\| ... | +| main.rs:305:25:305:25 | ... | semmle.label | ... | +| main.rs:305:25:305:25 | ... | semmle.label | ... | | main.rs:306:18:306:18 | a | semmle.label | a | | main.rs:306:18:306:18 | a | semmle.label | a | +| main.rs:309:14:309:19 | ...: i64 | semmle.label | ...: i64 | +| main.rs:309:14:309:19 | ...: i64 | semmle.label | ...: i64 | | main.rs:310:18:310:18 | a | semmle.label | a | | main.rs:310:18:310:18 | a | semmle.label | a | | main.rs:312:24:312:24 | f | semmle.label | f | | main.rs:312:24:312:24 | f | semmle.label | f | | main.rs:314:24:316:9 | \|...\| ... | semmle.label | \|...\| ... | | main.rs:314:24:316:9 | \|...\| ... | semmle.label | \|...\| ... | +| main.rs:314:36:314:36 | ... | semmle.label | ... | +| main.rs:314:36:314:36 | ... | semmle.label | ... | | main.rs:315:18:315:18 | a | semmle.label | a | | main.rs:315:18:315:18 | a | semmle.label | a | | main.rs:318:31:329:9 | \|...\| ... | semmle.label | \|...\| ... | | main.rs:318:31:329:9 | \|...\| ... | semmle.label | \|...\| ... | | main.rs:318:31:329:9 | \|...\| ... [E, Some] | semmle.label | \|...\| ... [E, Some] | | main.rs:318:31:329:9 | \|...\| ... [E, Some] | semmle.label | \|...\| ... [E, Some] | +| main.rs:318:32:318:32 | ... [E, Some] | semmle.label | ... [E, Some] | +| main.rs:318:32:318:32 | ... [E, Some] | semmle.label | ... [E, Some] | | main.rs:319:19:319:19 | e [E, Some] | semmle.label | e [E, Some] | | main.rs:319:19:319:19 | e [E, Some] | semmle.label | e [E, Some] | | main.rs:322:17:322:45 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | @@ -708,6 +730,8 @@ nodes | main.rs:344:21:344:29 | source(...) | semmle.label | source(...) | | main.rs:345:19:345:19 | a | semmle.label | a | | main.rs:345:19:345:19 | a | semmle.label | a | +| main.rs:347:22:352:9 | { ... } [E, Some] | semmle.label | { ... } [E, Some] | +| main.rs:347:22:352:9 | { ... } [E, Some] | semmle.label | { ... } [E, Some] | | main.rs:348:17:348:17 | s | semmle.label | s | | main.rs:348:17:348:17 | s | semmle.label | s | | main.rs:348:21:348:29 | source(...) | semmle.label | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/sources/database/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/database/InlineFlow.expected index a59260cd2694..7135bcf0a373 100644 --- a/rust/ql/test/library-tests/dataflow/sources/database/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/database/InlineFlow.expected @@ -47,27 +47,31 @@ edges | test.rs:41:14:41:61 | ... .get(...) [Some] | test.rs:41:14:41:70 | ... .unwrap() | provenance | MaD:13 | | test.rs:42:13:42:15 | row | test.rs:44:22:44:22 | v | provenance | | | test.rs:42:20:42:21 | t1 [element] | test.rs:42:13:42:15 | row | provenance | | -| test.rs:50:13:52:13 | \|...\| ... | test.rs:51:22:51:27 | values | provenance | Src:MaD:4 | -| test.rs:57:13:61:13 | \|...\| ... | test.rs:58:22:58:29 | values.0 | provenance | Src:MaD:4 | -| test.rs:57:13:61:13 | \|...\| ... | test.rs:59:22:59:29 | values.1 | provenance | Src:MaD:4 | -| test.rs:57:13:61:13 | \|...\| ... | test.rs:60:22:60:29 | values.2 | provenance | Src:MaD:4 | +| test.rs:50:13:52:13 | \|...\| ... | test.rs:50:14:50:24 | ...: i64 | provenance | Src:MaD:4 | +| test.rs:50:14:50:24 | ...: i64 | test.rs:51:22:51:27 | values | provenance | | +| test.rs:57:13:61:13 | \|...\| ... | test.rs:57:14:57:39 | ...: ... | provenance | Src:MaD:4 | +| test.rs:57:14:57:39 | ...: ... | test.rs:58:22:58:29 | values.0 | provenance | | +| test.rs:57:14:57:39 | ...: ... | test.rs:59:22:59:29 | values.1 | provenance | | +| test.rs:57:14:57:39 | ...: ... | test.rs:60:22:60:29 | values.2 | provenance | | | test.rs:64:13:64:17 | total | test.rs:68:14:68:18 | total | provenance | | | test.rs:64:13:64:17 | total [Wrapping] | test.rs:68:14:68:18 | total | provenance | | | test.rs:64:21:67:10 | conn.query_fold(...) [Ok, Wrapping] | test.rs:64:21:67:11 | TryExpr [Wrapping] | provenance | | | test.rs:64:21:67:10 | conn.query_fold(...) [Ok] | test.rs:64:21:67:11 | TryExpr | provenance | | | test.rs:64:21:67:11 | TryExpr | test.rs:64:13:64:17 | total | provenance | | | test.rs:64:21:67:11 | TryExpr [Wrapping] | test.rs:64:13:64:17 | total [Wrapping] | provenance | | -| test.rs:64:65:67:9 | \|...\| ... | test.rs:65:18:65:20 | row | provenance | Src:MaD:3 | -| test.rs:64:65:67:9 | \|...\| ... | test.rs:66:19:66:21 | row | provenance | Src:MaD:3 | +| test.rs:64:65:67:9 | \|...\| ... | test.rs:64:76:64:83 | ...: i64 | provenance | Src:MaD:3 | +| test.rs:64:76:64:83 | ...: i64 | test.rs:65:18:65:20 | row | provenance | | +| test.rs:64:76:64:83 | ...: i64 | test.rs:66:19:66:21 | row | provenance | | | test.rs:64:86:67:9 | { ... } | test.rs:64:21:67:10 | conn.query_fold(...) [Ok] | provenance | MaD:15 | | test.rs:64:86:67:9 | { ... } [Wrapping] | test.rs:64:21:67:10 | conn.query_fold(...) [Ok, Wrapping] | provenance | MaD:15 | | test.rs:66:13:66:21 | ... + ... | test.rs:64:86:67:9 | { ... } | provenance | | | test.rs:66:13:66:21 | ... + ... [Wrapping] | test.rs:64:86:67:9 | { ... } [Wrapping] | provenance | | | test.rs:66:19:66:21 | row | test.rs:66:13:66:21 | ... + ... | provenance | MaD:12 | | test.rs:66:19:66:21 | row | test.rs:66:13:66:21 | ... + ... [Wrapping] | provenance | MaD:11 | -| test.rs:70:72:78:9 | \|...\| ... | test.rs:71:17:71:18 | id | provenance | Src:MaD:3 | -| test.rs:70:72:78:9 | \|...\| ... | test.rs:72:17:72:20 | name | provenance | Src:MaD:3 | -| test.rs:70:72:78:9 | \|...\| ... | test.rs:73:17:73:19 | age | provenance | Src:MaD:3 | +| test.rs:70:72:78:9 | \|...\| ... | test.rs:70:83:70:105 | ...: ... | provenance | Src:MaD:3 | +| test.rs:70:83:70:105 | ...: ... | test.rs:71:17:71:18 | id | provenance | | +| test.rs:70:83:70:105 | ...: ... | test.rs:72:17:72:20 | name | provenance | | +| test.rs:70:83:70:105 | ...: ... | test.rs:73:17:73:19 | age | provenance | | | test.rs:71:17:71:18 | id | test.rs:74:18:74:19 | id | provenance | | | test.rs:72:17:72:20 | name | test.rs:75:18:75:21 | name | provenance | | | test.rs:73:17:73:19 | age | test.rs:76:18:76:20 | age | provenance | | @@ -89,10 +93,12 @@ edges | test.rs:114:24:114:38 | row.take_opt(...) [Some, Ok] | test.rs:114:24:114:47 | ... .unwrap() [Ok] | provenance | MaD:13 | | test.rs:114:24:114:47 | ... .unwrap() [Ok] | test.rs:114:24:114:56 | ... .unwrap() | provenance | MaD:14 | | test.rs:114:24:114:56 | ... .unwrap() | test.rs:114:13:114:14 | v4 | provenance | | -| test.rs:137:13:139:13 | \|...\| ... | test.rs:138:22:138:27 | values | provenance | Src:MaD:6 | -| test.rs:144:13:148:13 | \|...\| ... | test.rs:145:22:145:29 | values.0 | provenance | Src:MaD:6 | -| test.rs:144:13:148:13 | \|...\| ... | test.rs:146:22:146:29 | values.1 | provenance | Src:MaD:6 | -| test.rs:144:13:148:13 | \|...\| ... | test.rs:147:22:147:29 | values.2 | provenance | Src:MaD:6 | +| test.rs:137:13:139:13 | \|...\| ... | test.rs:137:14:137:24 | ...: i64 | provenance | Src:MaD:6 | +| test.rs:137:14:137:24 | ...: i64 | test.rs:138:22:138:27 | values | provenance | | +| test.rs:144:13:148:13 | \|...\| ... | test.rs:144:14:144:39 | ...: ... | provenance | Src:MaD:6 | +| test.rs:144:14:144:39 | ...: ... | test.rs:145:22:145:29 | values.0 | provenance | | +| test.rs:144:14:144:39 | ...: ... | test.rs:146:22:146:29 | values.1 | provenance | | +| test.rs:144:14:144:39 | ...: ... | test.rs:147:22:147:29 | values.2 | provenance | | | test.rs:151:13:151:17 | total | test.rs:155:14:155:18 | total | provenance | | | test.rs:151:13:151:17 | total [Wrapping] | test.rs:155:14:155:18 | total | provenance | | | test.rs:151:21:154:10 | conn.query_fold(...) [future, Ok, Wrapping] | test.rs:151:21:154:16 | await ... [Ok, Wrapping] | provenance | | @@ -101,17 +107,19 @@ edges | test.rs:151:21:154:16 | await ... [Ok] | test.rs:151:21:154:17 | TryExpr | provenance | | | test.rs:151:21:154:17 | TryExpr | test.rs:151:13:151:17 | total | provenance | | | test.rs:151:21:154:17 | TryExpr [Wrapping] | test.rs:151:13:151:17 | total [Wrapping] | provenance | | -| test.rs:151:65:154:9 | \|...\| ... | test.rs:152:18:152:20 | row | provenance | Src:MaD:5 | -| test.rs:151:65:154:9 | \|...\| ... | test.rs:153:19:153:21 | row | provenance | Src:MaD:5 | +| test.rs:151:65:154:9 | \|...\| ... | test.rs:151:76:151:83 | ...: i64 | provenance | Src:MaD:5 | +| test.rs:151:76:151:83 | ...: i64 | test.rs:152:18:152:20 | row | provenance | | +| test.rs:151:76:151:83 | ...: i64 | test.rs:153:19:153:21 | row | provenance | | | test.rs:151:86:154:9 | { ... } | test.rs:151:21:154:10 | conn.query_fold(...) [future, Ok] | provenance | MaD:16 | | test.rs:151:86:154:9 | { ... } [Wrapping] | test.rs:151:21:154:10 | conn.query_fold(...) [future, Ok, Wrapping] | provenance | MaD:16 | | test.rs:153:13:153:21 | ... + ... | test.rs:151:86:154:9 | { ... } | provenance | | | test.rs:153:13:153:21 | ... + ... [Wrapping] | test.rs:151:86:154:9 | { ... } [Wrapping] | provenance | | | test.rs:153:19:153:21 | row | test.rs:153:13:153:21 | ... + ... | provenance | MaD:12 | | test.rs:153:19:153:21 | row | test.rs:153:13:153:21 | ... + ... [Wrapping] | provenance | MaD:11 | -| test.rs:157:72:165:9 | \|...\| ... | test.rs:158:17:158:18 | id | provenance | Src:MaD:5 | -| test.rs:157:72:165:9 | \|...\| ... | test.rs:159:17:159:20 | name | provenance | Src:MaD:5 | -| test.rs:157:72:165:9 | \|...\| ... | test.rs:160:17:160:19 | age | provenance | Src:MaD:5 | +| test.rs:157:72:165:9 | \|...\| ... | test.rs:157:83:157:105 | ...: ... | provenance | Src:MaD:5 | +| test.rs:157:83:157:105 | ...: ... | test.rs:158:17:158:18 | id | provenance | | +| test.rs:157:83:157:105 | ...: ... | test.rs:159:17:159:20 | name | provenance | | +| test.rs:157:83:157:105 | ...: ... | test.rs:160:17:160:19 | age | provenance | | | test.rs:158:17:158:18 | id | test.rs:161:18:161:19 | id | provenance | | | test.rs:159:17:159:20 | name | test.rs:162:18:162:21 | name | provenance | | | test.rs:160:17:160:19 | age | test.rs:163:18:163:20 | age | provenance | | @@ -155,8 +163,10 @@ nodes | test.rs:42:20:42:21 | t1 [element] | semmle.label | t1 [element] | | test.rs:44:22:44:22 | v | semmle.label | v | | test.rs:50:13:52:13 | \|...\| ... | semmle.label | \|...\| ... | +| test.rs:50:14:50:24 | ...: i64 | semmle.label | ...: i64 | | test.rs:51:22:51:27 | values | semmle.label | values | | test.rs:57:13:61:13 | \|...\| ... | semmle.label | \|...\| ... | +| test.rs:57:14:57:39 | ...: ... | semmle.label | ...: ... | | test.rs:58:22:58:29 | values.0 | semmle.label | values.0 | | test.rs:59:22:59:29 | values.1 | semmle.label | values.1 | | test.rs:60:22:60:29 | values.2 | semmle.label | values.2 | @@ -167,6 +177,7 @@ nodes | test.rs:64:21:67:11 | TryExpr | semmle.label | TryExpr | | test.rs:64:21:67:11 | TryExpr [Wrapping] | semmle.label | TryExpr [Wrapping] | | test.rs:64:65:67:9 | \|...\| ... | semmle.label | \|...\| ... | +| test.rs:64:76:64:83 | ...: i64 | semmle.label | ...: i64 | | test.rs:64:86:67:9 | { ... } | semmle.label | { ... } | | test.rs:64:86:67:9 | { ... } [Wrapping] | semmle.label | { ... } [Wrapping] | | test.rs:65:18:65:20 | row | semmle.label | row | @@ -175,6 +186,7 @@ nodes | test.rs:66:19:66:21 | row | semmle.label | row | | test.rs:68:14:68:18 | total | semmle.label | total | | test.rs:70:72:78:9 | \|...\| ... | semmle.label | \|...\| ... | +| test.rs:70:83:70:105 | ...: ... | semmle.label | ...: ... | | test.rs:71:17:71:18 | id | semmle.label | id | | test.rs:72:17:72:20 | name | semmle.label | name | | test.rs:73:17:73:19 | age | semmle.label | age | @@ -204,8 +216,10 @@ nodes | test.rs:114:24:114:56 | ... .unwrap() | semmle.label | ... .unwrap() | | test.rs:115:14:115:15 | v4 | semmle.label | v4 | | test.rs:137:13:139:13 | \|...\| ... | semmle.label | \|...\| ... | +| test.rs:137:14:137:24 | ...: i64 | semmle.label | ...: i64 | | test.rs:138:22:138:27 | values | semmle.label | values | | test.rs:144:13:148:13 | \|...\| ... | semmle.label | \|...\| ... | +| test.rs:144:14:144:39 | ...: ... | semmle.label | ...: ... | | test.rs:145:22:145:29 | values.0 | semmle.label | values.0 | | test.rs:146:22:146:29 | values.1 | semmle.label | values.1 | | test.rs:147:22:147:29 | values.2 | semmle.label | values.2 | @@ -218,6 +232,7 @@ nodes | test.rs:151:21:154:17 | TryExpr | semmle.label | TryExpr | | test.rs:151:21:154:17 | TryExpr [Wrapping] | semmle.label | TryExpr [Wrapping] | | test.rs:151:65:154:9 | \|...\| ... | semmle.label | \|...\| ... | +| test.rs:151:76:151:83 | ...: i64 | semmle.label | ...: i64 | | test.rs:151:86:154:9 | { ... } | semmle.label | { ... } | | test.rs:151:86:154:9 | { ... } [Wrapping] | semmle.label | { ... } [Wrapping] | | test.rs:152:18:152:20 | row | semmle.label | row | @@ -226,6 +241,7 @@ nodes | test.rs:153:19:153:21 | row | semmle.label | row | | test.rs:155:14:155:18 | total | semmle.label | total | | test.rs:157:72:165:9 | \|...\| ... | semmle.label | \|...\| ... | +| test.rs:157:83:157:105 | ...: ... | semmle.label | ...: ... | | test.rs:158:17:158:18 | id | semmle.label | id | | test.rs:159:17:159:20 | name | semmle.label | name | | test.rs:160:17:160:19 | age | semmle.label | age | diff --git a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected index c1f6cce28888..965e0c004f88 100644 --- a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected @@ -25,6 +25,7 @@ edges | test.rs:58:14:58:15 | ms | test.rs:60:14:60:17 | ms.a | provenance | | | test.rs:58:14:58:15 | ms | test.rs:61:14:61:17 | ms.b | provenance | | | test.rs:68:15:68:15 | a | test.rs:70:14:70:14 | a | provenance | | +| test.rs:97:33:97:55 | ...: ...::Path::<...> | test.rs:98:17:98:20 | path | provenance | | | test.rs:98:13:98:13 | a | test.rs:99:14:99:14 | a | provenance | | | test.rs:98:13:98:13 | a | test.rs:100:14:100:14 | a | provenance | | | test.rs:98:13:98:13 | a | test.rs:101:14:101:14 | a | provenance | | @@ -32,33 +33,46 @@ edges | test.rs:98:17:98:33 | path.into_inner() | test.rs:98:13:98:13 | a | provenance | | | test.rs:99:14:99:14 | a | test.rs:99:14:99:23 | a.as_str() | provenance | MaD:13 | | test.rs:100:14:100:14 | a | test.rs:100:14:100:25 | a.as_bytes() | provenance | MaD:12 | +| test.rs:106:33:106:65 | ...: ...::Path::<...> | test.rs:107:22:107:25 | path | provenance | | | test.rs:107:13:107:18 | TuplePat | test.rs:109:14:109:14 | a | provenance | | | test.rs:107:13:107:18 | TuplePat | test.rs:110:14:110:14 | b | provenance | | | test.rs:107:22:107:25 | path | test.rs:107:22:107:38 | path.into_inner() | provenance | MaD:11 | | test.rs:107:22:107:38 | path.into_inner() | test.rs:107:13:107:18 | TuplePat | provenance | | -| test.rs:122:14:122:31 | my_actix_handler_4 | test.rs:123:17:123:20 | path | provenance | Src:MaD:1 | +| test.rs:115:33:115:65 | ...: ...::Query::<...> | test.rs:116:14:116:14 | a | provenance | | +| test.rs:122:14:122:31 | my_actix_handler_4 | test.rs:122:33:122:55 | ...: ...::Path::<...> | provenance | Src:MaD:1 | +| test.rs:122:33:122:55 | ...: ...::Path::<...> | test.rs:123:17:123:20 | path | provenance | | | test.rs:123:13:123:13 | a | test.rs:124:14:124:14 | a | provenance | | | test.rs:123:17:123:20 | path | test.rs:123:17:123:33 | path.into_inner() | provenance | MaD:11 | | test.rs:123:17:123:33 | path.into_inner() | test.rs:123:13:123:13 | a | provenance | | -| test.rs:131:44:131:61 | my_actix_handler_1 | test.rs:98:17:98:20 | path | provenance | Src:MaD:2 | -| test.rs:132:48:132:65 | my_actix_handler_2 | test.rs:107:22:107:25 | path | provenance | Src:MaD:2 | -| test.rs:133:44:133:61 | my_actix_handler_3 | test.rs:116:14:116:14 | a | provenance | Src:MaD:2 | +| test.rs:131:44:131:61 | my_actix_handler_1 | test.rs:97:33:97:55 | ...: ...::Path::<...> | provenance | Src:MaD:2 | +| test.rs:132:48:132:65 | my_actix_handler_2 | test.rs:106:33:106:65 | ...: ...::Path::<...> | provenance | Src:MaD:2 | +| test.rs:133:44:133:61 | my_actix_handler_3 | test.rs:115:33:115:65 | ...: ...::Query::<...> | provenance | Src:MaD:2 | +| test.rs:147:32:147:52 | ...: Path::<...> | test.rs:148:14:148:14 | a | provenance | | +| test.rs:147:32:147:52 | ...: Path::<...> | test.rs:149:14:149:14 | a | provenance | | +| test.rs:147:32:147:52 | ...: Path::<...> | test.rs:150:14:150:14 | a | provenance | | | test.rs:148:14:148:14 | a | test.rs:148:14:148:23 | a.as_str() | provenance | MaD:13 | | test.rs:149:14:149:14 | a | test.rs:149:14:149:25 | a.as_bytes() | provenance | MaD:12 | -| test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:148:14:148:14 | a | provenance | Src:MaD:8 | -| test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:149:14:149:14 | a | provenance | Src:MaD:8 | -| test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:150:14:150:14 | a | provenance | Src:MaD:8 | -| test.rs:201:39:201:55 | my_axum_handler_2 | test.rs:156:14:156:14 | a | provenance | Src:MaD:9 | -| test.rs:201:39:201:55 | my_axum_handler_2 | test.rs:157:14:157:14 | b | provenance | Src:MaD:9 | -| test.rs:202:33:202:49 | my_axum_handler_3 | test.rs:164:18:164:20 | key | provenance | Src:MaD:10 | -| test.rs:202:33:202:49 | my_axum_handler_3 | test.rs:165:18:165:22 | value | provenance | Src:MaD:10 | -| test.rs:205:65:205:81 | my_axum_handler_5 | test.rs:181:14:181:20 | payload | provenance | Src:MaD:4 | -| test.rs:207:33:207:49 | my_axum_handler_6 | test.rs:187:14:187:17 | body | provenance | Src:MaD:8 | -| test.rs:207:56:207:72 | my_axum_handler_7 | test.rs:193:14:193:17 | body | provenance | Src:MaD:3 | -| test.rs:222:37:227:9 | \|...\| ... | test.rs:224:18:224:18 | a | provenance | Src:MaD:6 | -| test.rs:231:13:235:13 | \|...\| ... | test.rs:232:22:232:22 | a | provenance | Src:MaD:7 | -| test.rs:240:13:248:9 | \|...\| ... | test.rs:243:22:243:23 | id | provenance | Src:MaD:5 | -| test.rs:253:13:258:14 | \|...\| ... | test.rs:255:22:255:22 | a | provenance | Src:MaD:6 | +| test.rs:155:32:155:67 | ...: Path::<...> | test.rs:156:14:156:14 | a | provenance | | +| test.rs:155:32:155:67 | ...: Path::<...> | test.rs:157:14:157:14 | b | provenance | | +| test.rs:162:32:162:76 | ...: Query::<...> | test.rs:164:18:164:20 | key | provenance | | +| test.rs:162:32:162:76 | ...: Query::<...> | test.rs:165:18:165:22 | value | provenance | | +| test.rs:179:32:179:69 | ...: Json::<...> | test.rs:181:14:181:20 | payload | provenance | | +| test.rs:186:32:186:43 | ...: String | test.rs:187:14:187:17 | body | provenance | | +| test.rs:192:32:192:43 | ...: String | test.rs:193:14:193:17 | body | provenance | | +| test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:147:32:147:52 | ...: Path::<...> | provenance | Src:MaD:8 | +| test.rs:201:39:201:55 | my_axum_handler_2 | test.rs:155:32:155:67 | ...: Path::<...> | provenance | Src:MaD:9 | +| test.rs:202:33:202:49 | my_axum_handler_3 | test.rs:162:32:162:76 | ...: Query::<...> | provenance | Src:MaD:10 | +| test.rs:205:65:205:81 | my_axum_handler_5 | test.rs:179:32:179:69 | ...: Json::<...> | provenance | Src:MaD:4 | +| test.rs:207:33:207:49 | my_axum_handler_6 | test.rs:186:32:186:43 | ...: String | provenance | Src:MaD:8 | +| test.rs:207:56:207:72 | my_axum_handler_7 | test.rs:192:32:192:43 | ...: String | provenance | Src:MaD:3 | +| test.rs:222:37:227:9 | \|...\| ... | test.rs:222:38:222:46 | ...: String | provenance | Src:MaD:6 | +| test.rs:222:38:222:46 | ...: String | test.rs:224:18:224:18 | a | provenance | | +| test.rs:231:13:235:13 | \|...\| ... | test.rs:231:25:231:33 | ...: String | provenance | Src:MaD:7 | +| test.rs:231:25:231:33 | ...: String | test.rs:232:22:232:22 | a | provenance | | +| test.rs:240:13:248:9 | \|...\| ... | test.rs:240:26:240:32 | ...: u64 | provenance | Src:MaD:5 | +| test.rs:240:26:240:32 | ...: u64 | test.rs:243:22:243:23 | id | provenance | | +| test.rs:253:13:258:14 | \|...\| ... | test.rs:253:15:253:23 | ...: String | provenance | Src:MaD:6 | +| test.rs:253:15:253:23 | ...: String | test.rs:255:22:255:22 | a | provenance | | nodes | test.rs:11:31:11:31 | a | semmle.label | a | | test.rs:13:14:13:14 | a | semmle.label | a | @@ -77,6 +91,7 @@ nodes | test.rs:61:14:61:17 | ms.b | semmle.label | ms.b | | test.rs:68:15:68:15 | a | semmle.label | a | | test.rs:70:14:70:14 | a | semmle.label | a | +| test.rs:97:33:97:55 | ...: ...::Path::<...> | semmle.label | ...: ...::Path::<...> | | test.rs:98:13:98:13 | a | semmle.label | a | | test.rs:98:17:98:20 | path | semmle.label | path | | test.rs:98:17:98:33 | path.into_inner() | semmle.label | path.into_inner() | @@ -85,13 +100,16 @@ nodes | test.rs:100:14:100:14 | a | semmle.label | a | | test.rs:100:14:100:25 | a.as_bytes() | semmle.label | a.as_bytes() | | test.rs:101:14:101:14 | a | semmle.label | a | +| test.rs:106:33:106:65 | ...: ...::Path::<...> | semmle.label | ...: ...::Path::<...> | | test.rs:107:13:107:18 | TuplePat | semmle.label | TuplePat | | test.rs:107:22:107:25 | path | semmle.label | path | | test.rs:107:22:107:38 | path.into_inner() | semmle.label | path.into_inner() | | test.rs:109:14:109:14 | a | semmle.label | a | | test.rs:110:14:110:14 | b | semmle.label | b | +| test.rs:115:33:115:65 | ...: ...::Query::<...> | semmle.label | ...: ...::Query::<...> | | test.rs:116:14:116:14 | a | semmle.label | a | | test.rs:122:14:122:31 | my_actix_handler_4 | semmle.label | my_actix_handler_4 | +| test.rs:122:33:122:55 | ...: ...::Path::<...> | semmle.label | ...: ...::Path::<...> | | test.rs:123:13:123:13 | a | semmle.label | a | | test.rs:123:17:123:20 | path | semmle.label | path | | test.rs:123:17:123:33 | path.into_inner() | semmle.label | path.into_inner() | @@ -99,17 +117,23 @@ nodes | test.rs:131:44:131:61 | my_actix_handler_1 | semmle.label | my_actix_handler_1 | | test.rs:132:48:132:65 | my_actix_handler_2 | semmle.label | my_actix_handler_2 | | test.rs:133:44:133:61 | my_actix_handler_3 | semmle.label | my_actix_handler_3 | +| test.rs:147:32:147:52 | ...: Path::<...> | semmle.label | ...: Path::<...> | | test.rs:148:14:148:14 | a | semmle.label | a | | test.rs:148:14:148:23 | a.as_str() | semmle.label | a.as_str() | | test.rs:149:14:149:14 | a | semmle.label | a | | test.rs:149:14:149:25 | a.as_bytes() | semmle.label | a.as_bytes() | | test.rs:150:14:150:14 | a | semmle.label | a | +| test.rs:155:32:155:67 | ...: Path::<...> | semmle.label | ...: Path::<...> | | test.rs:156:14:156:14 | a | semmle.label | a | | test.rs:157:14:157:14 | b | semmle.label | b | +| test.rs:162:32:162:76 | ...: Query::<...> | semmle.label | ...: Query::<...> | | test.rs:164:18:164:20 | key | semmle.label | key | | test.rs:165:18:165:22 | value | semmle.label | value | +| test.rs:179:32:179:69 | ...: Json::<...> | semmle.label | ...: Json::<...> | | test.rs:181:14:181:20 | payload | semmle.label | payload | +| test.rs:186:32:186:43 | ...: String | semmle.label | ...: String | | test.rs:187:14:187:17 | body | semmle.label | body | +| test.rs:192:32:192:43 | ...: String | semmle.label | ...: String | | test.rs:193:14:193:17 | body | semmle.label | body | | test.rs:200:34:200:50 | my_axum_handler_1 | semmle.label | my_axum_handler_1 | | test.rs:201:39:201:55 | my_axum_handler_2 | semmle.label | my_axum_handler_2 | @@ -118,12 +142,16 @@ nodes | test.rs:207:33:207:49 | my_axum_handler_6 | semmle.label | my_axum_handler_6 | | test.rs:207:56:207:72 | my_axum_handler_7 | semmle.label | my_axum_handler_7 | | test.rs:222:37:227:9 | \|...\| ... | semmle.label | \|...\| ... | +| test.rs:222:38:222:46 | ...: String | semmle.label | ...: String | | test.rs:224:18:224:18 | a | semmle.label | a | | test.rs:231:13:235:13 | \|...\| ... | semmle.label | \|...\| ... | +| test.rs:231:25:231:33 | ...: String | semmle.label | ...: String | | test.rs:232:22:232:22 | a | semmle.label | a | | test.rs:240:13:248:9 | \|...\| ... | semmle.label | \|...\| ... | +| test.rs:240:26:240:32 | ...: u64 | semmle.label | ...: u64 | | test.rs:243:22:243:23 | id | semmle.label | id | | test.rs:253:13:258:14 | \|...\| ... | semmle.label | \|...\| ... | +| test.rs:253:15:253:23 | ...: String | semmle.label | ...: String | | test.rs:255:22:255:22 | a | semmle.label | a | subpaths testFailures diff --git a/rust/ql/test/query-tests/security/CWE-079/actix/XSS.expected b/rust/ql/test/query-tests/security/CWE-079/actix/XSS.expected index 2e738540c6ee..bdc89446d9f4 100644 --- a/rust/ql/test/query-tests/security/CWE-079/actix/XSS.expected +++ b/rust/ql/test/query-tests/security/CWE-079/actix/XSS.expected @@ -1,7 +1,8 @@ #select | main.rs:25:15:25:18 | html | main.rs:9:10:9:27 | vulnerable_handler | main.rs:25:15:25:18 | html | Cross-site scripting vulnerability due to a $@. | main.rs:9:10:9:27 | vulnerable_handler | user-provided value | edges -| main.rs:9:10:9:27 | vulnerable_handler | main.rs:10:22:10:25 | path | provenance | Src:MaD:2 | +| main.rs:9:10:9:27 | vulnerable_handler | main.rs:9:29:9:51 | ...: ...::Path::<...> | provenance | Src:MaD:2 | +| main.rs:9:29:9:51 | ...: ...::Path::<...> | main.rs:10:22:10:25 | path | provenance | | | main.rs:10:9:10:18 | user_input | main.rs:13:9:22:18 | MacroExpr | provenance | | | main.rs:10:22:10:25 | path | main.rs:10:22:10:38 | path.into_inner() | provenance | MaD:3 | | main.rs:10:22:10:38 | path.into_inner() | main.rs:10:9:10:18 | user_input | provenance | | @@ -18,6 +19,7 @@ models | 5 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes | main.rs:9:10:9:27 | vulnerable_handler | semmle.label | vulnerable_handler | +| main.rs:9:29:9:51 | ...: ...::Path::<...> | semmle.label | ...: ...::Path::<...> | | main.rs:10:9:10:18 | user_input | semmle.label | user_input | | main.rs:10:22:10:25 | path | semmle.label | path | | main.rs:10:22:10:38 | path.into_inner() | semmle.label | path.into_inner() | diff --git a/rust/ql/test/query-tests/security/CWE-079/axum/XSS.expected b/rust/ql/test/query-tests/security/CWE-079/axum/XSS.expected index 1a7b911e5ad5..d087e05c6387 100644 --- a/rust/ql/test/query-tests/security/CWE-079/axum/XSS.expected +++ b/rust/ql/test/query-tests/security/CWE-079/axum/XSS.expected @@ -1,17 +1,19 @@ #select | main.rs:10:10:10:21 | html_content | main.rs:15:55:15:67 | greet_handler | main.rs:10:10:10:21 | html_content | Cross-site scripting vulnerability due to a $@. | main.rs:15:55:15:67 | greet_handler | user-provided value | edges +| main.rs:8:24:8:59 | ...: Query::<...> | main.rs:9:32:9:63 | MacroExpr | provenance | | | main.rs:9:9:9:20 | html_content | main.rs:10:10:10:21 | html_content | provenance | | | main.rs:9:32:9:63 | ...::format(...) | main.rs:9:32:9:63 | { ... } | provenance | | | main.rs:9:32:9:63 | ...::must_use(...) | main.rs:9:9:9:20 | html_content | provenance | | | main.rs:9:32:9:63 | MacroExpr | main.rs:9:32:9:63 | ...::format(...) | provenance | MaD:2 | | main.rs:9:32:9:63 | { ... } | main.rs:9:32:9:63 | ...::must_use(...) | provenance | MaD:3 | -| main.rs:15:55:15:67 | greet_handler | main.rs:9:32:9:63 | MacroExpr | provenance | Src:MaD:1 | +| main.rs:15:55:15:67 | greet_handler | main.rs:8:24:8:59 | ...: Query::<...> | provenance | Src:MaD:1 | models | 1 | Source: axum::routing::method_routing::get; Argument[0].Parameter[0..7]; remote | | 2 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | | 3 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes +| main.rs:8:24:8:59 | ...: Query::<...> | semmle.label | ...: Query::<...> | | main.rs:9:9:9:20 | html_content | semmle.label | html_content | | main.rs:9:32:9:63 | ...::format(...) | semmle.label | ...::format(...) | | main.rs:9:32:9:63 | ...::must_use(...) | semmle.label | ...::must_use(...) | diff --git a/rust/ql/test/query-tests/security/CWE-079/warp/XSS.expected b/rust/ql/test/query-tests/security/CWE-079/warp/XSS.expected index e6f56c8e71cb..1609b5c0eaf6 100644 --- a/rust/ql/test/query-tests/security/CWE-079/warp/XSS.expected +++ b/rust/ql/test/query-tests/security/CWE-079/warp/XSS.expected @@ -1,7 +1,8 @@ #select | main.rs:10:31:10:34 | body | main.rs:7:14:11:9 | \|...\| ... | main.rs:10:31:10:34 | body | Cross-site scripting vulnerability due to a $@. | main.rs:7:14:11:9 | \|...\| ... | user-provided value | edges -| main.rs:7:14:11:9 | \|...\| ... | main.rs:9:32:9:56 | MacroExpr | provenance | Src:MaD:2 | +| main.rs:7:14:11:9 | \|...\| ... | main.rs:7:15:7:26 | ...: String | provenance | Src:MaD:2 | +| main.rs:7:15:7:26 | ...: String | main.rs:9:32:9:56 | MacroExpr | provenance | | | main.rs:9:17:9:20 | body | main.rs:10:31:10:34 | body | provenance | Sink:MaD:1 | | main.rs:9:32:9:56 | ...::format(...) | main.rs:9:32:9:56 | { ... } | provenance | | | main.rs:9:32:9:56 | ...::must_use(...) | main.rs:9:17:9:20 | body | provenance | | @@ -14,6 +15,7 @@ models | 4 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes | main.rs:7:14:11:9 | \|...\| ... | semmle.label | \|...\| ... | +| main.rs:7:15:7:26 | ...: String | semmle.label | ...: String | | main.rs:9:17:9:20 | body | semmle.label | body | | main.rs:9:32:9:56 | ...::format(...) | semmle.label | ...::format(...) | | main.rs:9:32:9:56 | ...::must_use(...) | semmle.label | ...::must_use(...) | diff --git a/rust/ql/test/query-tests/security/CWE-117/LogInjection.expected b/rust/ql/test/query-tests/security/CWE-117/LogInjection.expected index 5b8c80bda2cc..5ccfc2084386 100644 --- a/rust/ql/test/query-tests/security/CWE-117/LogInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-117/LogInjection.expected @@ -78,6 +78,7 @@ edges | main.rs:127:25:127:45 | ...::var(...) | main.rs:127:25:127:45 | ...::var(...) [Ok] | provenance | Src:MaD:7 | | main.rs:127:25:127:45 | ...::var(...) [Ok] | main.rs:127:25:127:65 | ... .unwrap_or_default() | provenance | MaD:20 | | main.rs:127:25:127:65 | ... .unwrap_or_default() | main.rs:127:13:127:21 | user_data | provenance | | +| main.rs:140:32:140:59 | ...: Option::<...> | main.rs:141:22:141:27 | o_path | provenance | | | main.rs:141:13:141:18 | m_path [Some] | main.rs:143:26:143:31 | m_path [Some] | provenance | | | main.rs:141:22:141:27 | o_path | main.rs:141:22:141:38 | o_path.map(...) [Some] | provenance | MaD:14 | | main.rs:141:22:141:27 | o_path | main.rs:141:34:141:34 | ... | provenance | MaD:14 | @@ -85,7 +86,7 @@ edges | main.rs:141:34:141:34 | ... | main.rs:141:37:141:37 | x | provenance | | | main.rs:143:26:143:31 | m_path [Some] | main.rs:143:26:143:40 | m_path.unwrap() | provenance | MaD:15 | | main.rs:143:26:143:40 | m_path.unwrap() | main.rs:143:18:143:40 | MacroExpr | provenance | Sink:MaD:3 | -| main.rs:150:32:150:48 | my_axum_handler_1 | main.rs:141:22:141:27 | o_path | provenance | Src:MaD:4 | +| main.rs:150:32:150:48 | my_axum_handler_1 | main.rs:140:32:140:59 | ...: Option::<...> | provenance | Src:MaD:4 | models | 1 | Sink: log::__private_api::log; Argument[0]; log-injection | | 2 | Sink: std::io::stdio::_eprint; Argument[0]; log-injection | @@ -174,6 +175,7 @@ nodes | main.rs:127:25:127:65 | ... .unwrap_or_default() | semmle.label | ... .unwrap_or_default() | | main.rs:130:18:130:38 | MacroExpr | semmle.label | MacroExpr | | main.rs:131:19:131:49 | MacroExpr | semmle.label | MacroExpr | +| main.rs:140:32:140:59 | ...: Option::<...> | semmle.label | ...: Option::<...> | | main.rs:141:13:141:18 | m_path [Some] | semmle.label | m_path [Some] | | main.rs:141:22:141:27 | o_path | semmle.label | o_path | | main.rs:141:22:141:38 | o_path.map(...) [Some] | semmle.label | o_path.map(...) [Some] | diff --git a/rust/ql/test/query-tests/security/CWE-918/RequestForgery.expected b/rust/ql/test/query-tests/security/CWE-918/RequestForgery.expected index 2a74d0f58387..cc2f47497f23 100644 --- a/rust/ql/test/query-tests/security/CWE-918/RequestForgery.expected +++ b/rust/ql/test/query-tests/security/CWE-918/RequestForgery.expected @@ -40,7 +40,8 @@ edges | request_forgery_tests.rs:31:43:31:50 | user_url | request_forgery_tests.rs:31:42:31:50 | &user_url [&ref] | provenance | | | request_forgery_tests.rs:37:50:37:58 | &user_url [&ref] | request_forgery_tests.rs:37:50:37:58 | &user_url | provenance | Sink:MaD:1 | | request_forgery_tests.rs:37:51:37:58 | user_url | request_forgery_tests.rs:37:50:37:58 | &user_url [&ref] | provenance | | -| request_forgery_tests.rs:65:42:73:9 | \|...\| ... | request_forgery_tests.rs:68:42:68:42 | a | provenance | Src:MaD:2 | +| request_forgery_tests.rs:65:42:73:9 | \|...\| ... | request_forgery_tests.rs:65:49:65:57 | ...: String | provenance | Src:MaD:2 | +| request_forgery_tests.rs:65:49:65:57 | ...: String | request_forgery_tests.rs:68:42:68:42 | a | provenance | | | request_forgery_tests.rs:68:41:68:42 | &a [&ref] | request_forgery_tests.rs:68:41:68:42 | &a | provenance | Sink:MaD:1 | | request_forgery_tests.rs:68:42:68:42 | a | request_forgery_tests.rs:68:41:68:42 | &a [&ref] | provenance | | models @@ -84,6 +85,7 @@ nodes | request_forgery_tests.rs:37:50:37:58 | &user_url [&ref] | semmle.label | &user_url [&ref] | | request_forgery_tests.rs:37:51:37:58 | user_url | semmle.label | user_url | | request_forgery_tests.rs:65:42:73:9 | \|...\| ... | semmle.label | \|...\| ... | +| request_forgery_tests.rs:65:49:65:57 | ...: String | semmle.label | ...: String | | request_forgery_tests.rs:68:41:68:42 | &a | semmle.label | &a | | request_forgery_tests.rs:68:41:68:42 | &a [&ref] | semmle.label | &a [&ref] | | request_forgery_tests.rs:68:42:68:42 | a | semmle.label | a | diff --git a/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll b/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll index 200fc0e791d7..55141831f9e7 100644 --- a/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll +++ b/shared/dataflow/codeql/dataflow/internal/FlowSummaryImpl.qll @@ -2292,20 +2292,24 @@ module Make< /** Provides a compilation of flow summaries to atomic data-flow steps. */ module Steps { private predicate sourceExitStep(SourceOutputNode nodeFrom, Node nodeTo, boolean local) { - exists(SummaryComponent sc, SourceSinkReportingElement e | - nodeFrom.isExit(_, sc, e, _) and + exists(SummaryComponent sc, SourceSinkReportingElement e, string model | + nodeFrom.isExit(_, sc, e, model) and nodeTo = getSourceDataFlowNode(e, sc) and - if e.getEnclosingCallable() = getNodeEnclosingCallable(nodeTo) + if + e.getEnclosingCallable() = getNodeEnclosingCallable(nodeTo) and + (nodeFrom.isEntry(_, model) or summaryStoreStep(_, _, nodeFrom)) then local = true else local = false ) } private predicate sinkEntryStep(Node nodeFrom, SinkInputNode nodeTo, boolean local) { - exists(SummaryComponent sc, SourceSinkReportingElement e | - nodeTo.isEntry(_, sc, e, _) and + exists(SummaryComponent sc, SourceSinkReportingElement e, string model | + nodeTo.isEntry(_, sc, e, model) and nodeFrom = getSinkDataFlowNode(e, sc) and - if e.getEnclosingCallable() = getNodeEnclosingCallable(nodeFrom) + if + e.getEnclosingCallable() = getNodeEnclosingCallable(nodeFrom) and + (nodeTo.isExit(_, model) or summaryReadStep(nodeTo, _, _)) then local = true else local = false ) From d64ad79e15e56a516d91ab488c5eb01a1f2edbc8 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 31 Aug 2026 16:07:55 +0200 Subject: [PATCH 0627/2098] Fix `accept-expected-changes-from-ci.py` --- misc/scripts/accept-expected-changes-from-ci.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/misc/scripts/accept-expected-changes-from-ci.py b/misc/scripts/accept-expected-changes-from-ci.py index e5f583044d40..0b50c5c42b50 100755 --- a/misc/scripts/accept-expected-changes-from-ci.py +++ b/misc/scripts/accept-expected-changes-from-ci.py @@ -208,7 +208,7 @@ def get_log_content(status: GithubStatus) -> str: LOGGER.debug(f"'{status.context}': Getting logs") if status.job_ids: contents = [subprocess.check_output( - ["gh", "api", f"/repos/{status.nwo}/actions/jobs/{job_id}/logs"], + ["gh", "api", f"/repos/{status.nwo}/actions/jobs/{job_id}/logs", "--allow-escape-sequences"], ).decode("utf-8") for job_id in status.job_ids] content = "\n".join(contents) else: @@ -275,7 +275,7 @@ def main(pr_number: Optional[int], sha_override: Optional[str] = None, force=Fal lang_test_failures: List[GithubStatus] = list() for status in newest_status.values(): - if " Language Tests" in status.context or status.context in supported_internal_status_language_test_names: + if " Language Tests" in status.context and not " Language Tests Windows" in status.context or status.context in supported_internal_status_language_test_names: if status.state == "failure": lang_test_failures.append(status) elif status.state == "pending": From 734a77de59a7f320660b440038cdd739c4052c88 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema <93738568+jketema@users.noreply.github.com> Date: Tue, 1 Sep 2026 14:07:47 +0000 Subject: [PATCH 0628/2098] Bazel: Add `lfs_archives` function This pulls out some generic stuff from the Swift static runtime into a generic location. Internal clean-up PR will follow once this is in. --- misc/bazel/lfs.bzl | 47 +++++++++++++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/misc/bazel/lfs.bzl b/misc/bazel/lfs.bzl index daba8331dc36..52f404685cda 100644 --- a/misc/bazel/lfs.bzl +++ b/misc/bazel/lfs.bzl @@ -28,19 +28,19 @@ def lfs_smudge(repository_ctx, srcs, *, extract = False, stripPrefix = None, exe res = repository_ctx.download([], src.basename, sha256 = info, allow_fail = True, executable = executable) if not res.success: remote.append(src) - if remote: - infos = probe(remote) - for src, info in zip(remote, infos): - sha256, _, url = info.partition(" ") - repository_ctx.report_progress("downloading remote %s" % src.basename) - repository_ctx.download(url, src.basename, sha256 = sha256, executable = executable) - if extract: - for src in srcs: - repository_ctx.report_progress("extracting %s" % src.basename) - repository_ctx.extract(src.basename, stripPrefix = stripPrefix) - repository_ctx.delete(src.basename) + if remote: + infos = probe(remote) + for src, info in zip(remote, infos): + sha256, _, url = info.partition(" ") + repository_ctx.report_progress("downloading remote %s" % src.basename) + repository_ctx.download(url, src.basename, sha256 = sha256, executable = executable) + if extract: + for src in srcs: + repository_ctx.report_progress("extracting %s" % src.basename) + repository_ctx.extract(src.basename, stripPrefix = stripPrefix) + repository_ctx.delete(src.basename) -def _download_and_extract_lfs(repository_ctx): +def _download_and_extract_lfs_archive(repository_ctx): attr = repository_ctx.attr src = repository_ctx.path(attr.src) if attr.build_file_content and attr.build_file: @@ -51,6 +51,14 @@ def _download_and_extract_lfs(repository_ctx): elif attr.build_file: repository_ctx.symlink(attr.build_file, "BUILD.bazel") +def _download_and_extract_lfs_archives(repository_ctx): + lfs_smudge( + repository_ctx, + [repository_ctx.path(src) for src in repository_ctx.attr.srcs], + extract = True, + stripPrefix = repository_ctx.attr.strip_prefix, + ) + def _download_lfs(repository_ctx): attr = repository_ctx.attr if int(bool(attr.srcs)) + int(bool(attr.dir)) != 1: @@ -86,7 +94,7 @@ def _download_lfs(repository_ctx): lfs_archive = repository_rule( doc = "Export the contents from an on-demand LFS archive. The corresponding path should be added to be ignored " + "in `.lfsconfig`.", - implementation = _download_and_extract_lfs, + implementation = _download_and_extract_lfs_archive, attrs = { "src": attr.label(mandatory = True, doc = "Local path to the LFS archive to extract."), "build_file_content": attr.string(doc = "The content for the BUILD file for this repository. " + @@ -97,6 +105,19 @@ lfs_archive = repository_rule( }, ) +lfs_archives = repository_rule( + doc = "Overlay the contents from on-demand LFS archives. The corresponding paths should be added to be ignored " + + "in `.lfsconfig`.", + implementation = _download_and_extract_lfs_archives, + attrs = { + "srcs": attr.label_list( + doc = "Local paths to the LFS archives to extract in order.", + mandatory = True, + ), + "strip_prefix": attr.string(default = "", doc = "A directory prefix to strip from the extracted files. "), + }, +) + lfs_files = repository_rule( doc = "Export LFS files for on-demand download. Exactly one between `srcs` and `dir` must be defined. The " + "corresponding paths should be added to be ignored in `.lfsconfig`.", From 41ad940adf3da52ad444da61d2a3350eb66e63a0 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Tue, 1 Sep 2026 10:16:01 -0400 Subject: [PATCH 0629/2098] fix: missed where opporunity false positive --- csharp/ql/lib/Linq/Helpers.qll | 20 +++++++- .../ql/src/Linq/MissedWhereOpportunity.qhelp | 27 ++++++---- .../ql/src/Linq/MissedWhereOpportunityGood.cs | 33 ++++++++++++ .../MissedWhereOpportunity.cs | 50 +++++++++++++++++++ .../MissedWhereOpportunity.expected | 1 + 5 files changed, 121 insertions(+), 10 deletions(-) create mode 100644 csharp/ql/src/Linq/MissedWhereOpportunityGood.cs diff --git a/csharp/ql/lib/Linq/Helpers.qll b/csharp/ql/lib/Linq/Helpers.qll index 2a4d5c8c27a2..4d0c30e55f1a 100644 --- a/csharp/ql/lib/Linq/Helpers.qll +++ b/csharp/ql/lib/Linq/Helpers.qll @@ -20,6 +20,23 @@ private int numStmts(ForeachStmt fes) { else result = 1 } +private predicate terminatesCallable(Stmt s) { + s.stripSingletonBlocks() instanceof ReturnStmt + or + s.stripSingletonBlocks() instanceof YieldBreakStmt + or + s.stripSingletonBlocks() instanceof ThrowStmt + or + exists(BlockStmt b | b = s.stripSingletonBlocks() | terminatesCallable(b.getLastStmt())) + or + exists(IfStmt nested | + nested = s.stripSingletonBlocks() and + exists(nested.getElse()) and + terminatesCallable(nested.getThen()) and + terminatesCallable(nested.getElse()) + ) +} + /** Holds if the type's qualified name is "System.Linq.Enumerable" */ predicate isEnumerableType(ValueOrRefType t) { t.hasFullyQualifiedName("System.Linq", "Enumerable") @@ -152,7 +169,8 @@ predicate missedWhereOpportunity(ForeachStmtGenericEnumerable fes, IfStmt is) { is.getThen() instanceof ContinueStmt or not exists(is.getElse()) and - numStmts(fes) = 1 + numStmts(fes) = 1 and + not terminatesCallable(is.getThen()) ) } diff --git a/csharp/ql/src/Linq/MissedWhereOpportunity.qhelp b/csharp/ql/src/Linq/MissedWhereOpportunity.qhelp index 6b22d1a14edc..a1f98a76e6d1 100644 --- a/csharp/ql/src/Linq/MissedWhereOpportunity.qhelp +++ b/csharp/ql/src/Linq/MissedWhereOpportunity.qhelp @@ -3,29 +3,38 @@ "qhelp.dtd"> -

    Programmers sometimes need to iterative over a filtered version of a sequence, rather than the -sequence itself. For example, you might want to print out only the numbers in the range [1,10] that -are even. One standard way of doing this is to write a loop that iterates over the whole sequence, -testing the variable each iteration to determine whether or not it is even. This is often written -using either if(!condition(var)) continue; as the initial statement in the loop, or by +

    Programmers sometimes need to iterate over a filtered version of a sequence, rather than the +sequence itself. For example, you might want to print out only the numbers in the range [1,10] that +are even. One standard way of doing this is to write a loop that iterates over the whole sequence, +testing the variable each iteration to determine whether or not it is even. This is often written +using either if(!condition(var)) continue; as the initial statement in the loop, or by enclosing the entire loop body with if(condition(var)).

    +

    This recommendation does not apply when the matching branch exits the loop by exiting the current +method or iterator, such as with a full return, yield break, or +throw. In those cases the loop is searching for a terminal condition rather than +filtering the remaining loop body.

    +
    -

    This pattern works well and is also available as the Where method in LINQ in C# 3.5 -and above. It is better to use a library method in preference to writing your own pattern unless you -have a specific need for a custom version. In particular, this makes the code easier to read by +

    This pattern works well and is also available as the Where method in LINQ in C# 3.5 +and above. It is better to use a library method in preference to writing your own pattern unless you +have a specific need for a custom version. In particular, this makes the code easier to read by expressing the intent better and by reducing the nesting depth of the code.

    -

    This example shows two ways of iterating over a series of integers and only performing an action +

    This example shows two ways of iterating over a series of integers and only performing an action on the even ones.

    This is far better expressed using the Where method.

    +

    The following examples should not use Where, because the matching branch exits the +method or iterator instead of continuing with filtered loop work.

    + +
    diff --git a/csharp/ql/src/Linq/MissedWhereOpportunityGood.cs b/csharp/ql/src/Linq/MissedWhereOpportunityGood.cs new file mode 100644 index 000000000000..da28fd6e79f1 --- /dev/null +++ b/csharp/ql/src/Linq/MissedWhereOpportunityGood.cs @@ -0,0 +1,33 @@ +class MissedWhereOpportunityGood +{ + public int? FindFirstEven(System.Collections.Generic.IEnumerable values) + { + foreach (int value in values) + { + if (value % 2 == 0) + return value; + } + + return null; + } + + public System.Collections.Generic.IEnumerable ValuesUntilFirstEven(System.Collections.Generic.IEnumerable values) + { + foreach (int value in values) + { + if (value % 2 == 0) + yield break; + + yield return value; + } + } + + public void ThrowOnFirstEven(System.Collections.Generic.IEnumerable values) + { + foreach (int value in values) + { + if (value % 2 == 0) + throw new System.InvalidOperationException("Unexpected even value."); + } + } +} diff --git a/csharp/ql/test/query-tests/Linq/MissedWhereOpportunity/MissedWhereOpportunity.cs b/csharp/ql/test/query-tests/Linq/MissedWhereOpportunity/MissedWhereOpportunity.cs index 0fee1e9c48ff..abee5da38f9d 100644 --- a/csharp/ql/test/query-tests/Linq/MissedWhereOpportunity/MissedWhereOpportunity.cs +++ b/csharp/ql/test/query-tests/Linq/MissedWhereOpportunity/MissedWhereOpportunity.cs @@ -76,6 +76,56 @@ public void M5(IEnumerable elements) } // $ Alert } + public int M6(IEnumerable elements) + { + // GOOD: The filtered case returns from the method instead of continuing the loop. + foreach (var element in elements) + { + if (element.GetHashCode() % 2 == 0) + { + return element; + } + } + + return 0; + } + + public IEnumerable M7(IEnumerable elements) + { + // GOOD: The filtered case exits the iterator instead of continuing the loop. + foreach (var element in elements) + { + if (element.GetHashCode() % 2 == 0) + { + yield break; + } + } + } + + public void M8(IEnumerable elements) + { + // GOOD: The filtered case throws instead of continuing the loop. + foreach (var element in elements) + { + if (element.GetHashCode() % 2 == 0) + { + throw new InvalidOperationException(); + } + } + } + + public IEnumerable M9(IEnumerable elements) + { + // BAD: A yield return does not exit the iterator, so the loop still filters yielded values. + foreach (var element in elements) + { + if (element.GetHashCode() % 2 == 0) + { + yield return element; + } + } // $ Alert + } + public class NonEnumerableClass { public IEnumerator GetEnumerator() => throw null; diff --git a/csharp/ql/test/query-tests/Linq/MissedWhereOpportunity/MissedWhereOpportunity.expected b/csharp/ql/test/query-tests/Linq/MissedWhereOpportunity/MissedWhereOpportunity.expected index 5efde9aebedc..8b9398292ef2 100644 --- a/csharp/ql/test/query-tests/Linq/MissedWhereOpportunity/MissedWhereOpportunity.expected +++ b/csharp/ql/test/query-tests/Linq/MissedWhereOpportunity/MissedWhereOpportunity.expected @@ -2,3 +2,4 @@ | MissedWhereOpportunity.cs:19:9:26:9 | foreach (... ... in ...) ... | This foreach loop $@ - consider filtering the sequence explicitly using '.Where(...)'. | MissedWhereOpportunity.cs:21:17:21:26 | ... == ... | implicitly filters its target sequence | | MissedWhereOpportunity.cs:45:9:52:9 | foreach (... ... in ...) ... | This foreach loop $@ - consider filtering the sequence explicitly using '.Where(...)'. | MissedWhereOpportunity.cs:47:17:47:26 | ... == ... | implicitly filters its target sequence | | MissedWhereOpportunity.cs:70:9:76:9 | foreach (... ... in ...) ... | This foreach loop $@ - consider filtering the sequence explicitly using '.Where(...)'. | MissedWhereOpportunity.cs:72:17:72:46 | ... == ... | implicitly filters its target sequence | +| MissedWhereOpportunity.cs:120:9:126:9 | foreach (... ... in ...) ... | This foreach loop $@ - consider filtering the sequence explicitly using '.Where(...)'. | MissedWhereOpportunity.cs:122:17:122:46 | ... == ... | implicitly filters its target sequence | From 9b572852b185feb6138c8262949ece06120f5a08 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema <93738568+jketema@users.noreply.github.com> Date: Tue, 1 Sep 2026 14:17:24 +0000 Subject: [PATCH 0630/2098] Bazel: remove redundant whitespace --- misc/bazel/lfs.bzl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/misc/bazel/lfs.bzl b/misc/bazel/lfs.bzl index 52f404685cda..6e8920d155f3 100644 --- a/misc/bazel/lfs.bzl +++ b/misc/bazel/lfs.bzl @@ -101,7 +101,7 @@ lfs_archive = repository_rule( "Either build_file or build_file_content can be specified, but not both."), "build_file": attr.label(doc = "The file to use as the BUILD file for this repository. " + "Either build_file or build_file_content can be specified, but not both."), - "strip_prefix": attr.string(default = "", doc = "A directory prefix to strip from the extracted files. "), + "strip_prefix": attr.string(default = "", doc = "A directory prefix to strip from the extracted files."), }, ) @@ -114,7 +114,7 @@ lfs_archives = repository_rule( doc = "Local paths to the LFS archives to extract in order.", mandatory = True, ), - "strip_prefix": attr.string(default = "", doc = "A directory prefix to strip from the extracted files. "), + "strip_prefix": attr.string(default = "", doc = "A directory prefix to strip from the extracted files."), }, ) From dc42a4c645b97d20bc8ee5c53727068a5a40ecb9 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Tue, 1 Sep 2026 10:23:54 -0400 Subject: [PATCH 0631/2098] docs: rewording Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- csharp/ql/src/Linq/MissedWhereOpportunity.qhelp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/csharp/ql/src/Linq/MissedWhereOpportunity.qhelp b/csharp/ql/src/Linq/MissedWhereOpportunity.qhelp index a1f98a76e6d1..f8f2769b0812 100644 --- a/csharp/ql/src/Linq/MissedWhereOpportunity.qhelp +++ b/csharp/ql/src/Linq/MissedWhereOpportunity.qhelp @@ -10,10 +10,10 @@ testing the variable each iteration to determine whether or not it is even. This using either if(!condition(var)) continue; as the initial statement in the loop, or by enclosing the entire loop body with if(condition(var)).

    -

    This recommendation does not apply when the matching branch exits the loop by exiting the current -method or iterator, such as with a full return, yield break, or -throw. In those cases the loop is searching for a terminal condition rather than -filtering the remaining loop body.

    +

    This recommendation does not apply when the matching branch exits the loop without continuing to +later iterations, such as with return, yield break, or throw. +In those cases the loop is searching for a terminal condition rather than filtering the remaining +loop body.

    From 17412f33db75e9688b9977d80bafa119846291ee Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Tue, 1 Sep 2026 10:50:59 -0400 Subject: [PATCH 0632/2098] tests: adds a unit test to prevent regression on else cases --- .../MissedWhereOpportunity.cs | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/csharp/ql/test/query-tests/Linq/MissedWhereOpportunity/MissedWhereOpportunity.cs b/csharp/ql/test/query-tests/Linq/MissedWhereOpportunity/MissedWhereOpportunity.cs index abee5da38f9d..192e9893c955 100644 --- a/csharp/ql/test/query-tests/Linq/MissedWhereOpportunity/MissedWhereOpportunity.cs +++ b/csharp/ql/test/query-tests/Linq/MissedWhereOpportunity/MissedWhereOpportunity.cs @@ -126,6 +126,42 @@ public IEnumerable M9(IEnumerable elements) } // $ Alert } + public int M10(IEnumerable elements) + { + // GOOD: The filtered case ends with a return from the method instead of continuing the loop. + foreach (var element in elements) + { + if (element.GetHashCode() % 2 == 0) + { + Console.WriteLine(element); + return element; + } + } + + return 0; + } + + public int M11(IEnumerable elements) + { + // GOOD: Both nested filtered cases return from the method instead of continuing the loop. + foreach (var element in elements) + { + if (element.GetHashCode() % 2 == 0) + { + if (element > 10) + { + return element; + } + else + { + return 10; + } + } + } + + return 0; + } + public class NonEnumerableClass { public IEnumerator GetEnumerator() => throw null; From 327158734400bdfb1a1387787d88c560122c2519 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Tue, 1 Sep 2026 10:58:11 -0400 Subject: [PATCH 0633/2098] chore: fixes missing break case Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- csharp/ql/lib/Linq/Helpers.qll | 2 ++ 1 file changed, 2 insertions(+) diff --git a/csharp/ql/lib/Linq/Helpers.qll b/csharp/ql/lib/Linq/Helpers.qll index 4d0c30e55f1a..2909c6696a73 100644 --- a/csharp/ql/lib/Linq/Helpers.qll +++ b/csharp/ql/lib/Linq/Helpers.qll @@ -27,6 +27,8 @@ private predicate terminatesCallable(Stmt s) { or s.stripSingletonBlocks() instanceof ThrowStmt or + s.stripSingletonBlocks() instanceof BreakStmt + or exists(BlockStmt b | b = s.stripSingletonBlocks() | terminatesCallable(b.getLastStmt())) or exists(IfStmt nested | From c5f2bdbdd362c33ab8b083f8e2ee985949cbf997 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema <93738568+jketema@users.noreply.github.com> Date: Tue, 1 Sep 2026 15:00:59 +0000 Subject: [PATCH 0634/2098] Bazel: Address review comments --- misc/bazel/lfs.bzl | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/misc/bazel/lfs.bzl b/misc/bazel/lfs.bzl index 6e8920d155f3..a07dd52ea0d8 100644 --- a/misc/bazel/lfs.bzl +++ b/misc/bazel/lfs.bzl @@ -40,24 +40,29 @@ def lfs_smudge(repository_ctx, srcs, *, extract = False, stripPrefix = None, exe repository_ctx.extract(src.basename, stripPrefix = stripPrefix) repository_ctx.delete(src.basename) -def _download_and_extract_lfs_archive(repository_ctx): +def _add_build_file(repository_ctx): attr = repository_ctx.attr - src = repository_ctx.path(attr.src) if attr.build_file_content and attr.build_file: fail("You should specify only one among build_file_content and build_file for rule @%s" % repository_ctx.name) - lfs_smudge(repository_ctx, [src], extract = True, stripPrefix = attr.strip_prefix) if attr.build_file_content: repository_ctx.file("BUILD.bazel", attr.build_file_content) elif attr.build_file: repository_ctx.symlink(attr.build_file, "BUILD.bazel") +def _download_and_extract_lfs_archive(repository_ctx): + attr = repository_ctx.attr + lfs_smudge(repository_ctx, [repository_ctx.path(attr.src)], extract = True, stripPrefix = attr.strip_prefix) + _add_build_file(repository_ctx) + def _download_and_extract_lfs_archives(repository_ctx): - lfs_smudge( - repository_ctx, - [repository_ctx.path(src) for src in repository_ctx.attr.srcs], - extract = True, - stripPrefix = repository_ctx.attr.strip_prefix, - ) + for src in repository_ctx.attr.srcs: + lfs_smudge( + repository_ctx, + [repository_ctx.path(src)], + extract = True, + stripPrefix = repository_ctx.attr.strip_prefix, + ) + _add_build_file(repository_ctx) def _download_lfs(repository_ctx): attr = repository_ctx.attr @@ -110,10 +115,11 @@ lfs_archives = repository_rule( "in `.lfsconfig`.", implementation = _download_and_extract_lfs_archives, attrs = { - "srcs": attr.label_list( - doc = "Local paths to the LFS archives to extract in order.", - mandatory = True, - ), + "build_file": attr.label(doc = "The file to use as the BUILD file for this repository. " + + "Either build_file or build_file_content can be specified, but not both."), + "build_file_content": attr.string(doc = "The content for the BUILD file for this repository. " + + "Either build_file or build_file_content can be specified, but not both."), + "srcs": attr.label_list(doc = "Local paths to the LFS archives to extract in order.", mandatory = True), "strip_prefix": attr.string(default = "", doc = "A directory prefix to strip from the extracted files."), }, ) From ed15edf6df947adc5aa7bcc50676c8f73df71017 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Tue, 1 Sep 2026 11:02:14 -0400 Subject: [PATCH 0635/2098] feat(csharp): adds a missed first or default opprtunity rule --- csharp/ql/lib/Linq/Helpers.qll | 37 +++++ .../Linq/MissedFirstOrDefaultOpportunity.cs | 18 +++ .../MissedFirstOrDefaultOpportunity.qhelp | 36 +++++ .../Linq/MissedFirstOrDefaultOpportunity.ql | 22 +++ .../MissedFirstOrDefaultOpportunityFix.cs | 8 ++ .../MissedFirstOrDefaultOpportunityGood.cs | 35 +++++ .../csharp-security-and-quality.qls | 1 + .../MissedFirstOrDefaultOpportunity.cs | 129 ++++++++++++++++++ .../MissedFirstOrDefaultOpportunity.expected | 3 + .../MissedFirstOrDefaultOpportunity.qlref | 2 + 10 files changed, 291 insertions(+) create mode 100644 csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.cs create mode 100644 csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.qhelp create mode 100644 csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.ql create mode 100644 csharp/ql/src/Linq/MissedFirstOrDefaultOpportunityFix.cs create mode 100644 csharp/ql/src/Linq/MissedFirstOrDefaultOpportunityGood.cs create mode 100644 csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.cs create mode 100644 csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.expected create mode 100644 csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.qlref diff --git a/csharp/ql/lib/Linq/Helpers.qll b/csharp/ql/lib/Linq/Helpers.qll index 2a4d5c8c27a2..6f636aab4acc 100644 --- a/csharp/ql/lib/Linq/Helpers.qll +++ b/csharp/ql/lib/Linq/Helpers.qll @@ -20,6 +20,17 @@ private int numStmts(ForeachStmt fes) { else result = 1 } +private predicate returnsLoopVariable(ForeachStmt fes, Stmt s, ReturnStmt ret) { + ret = s.stripSingletonBlocks() and + ret.getExpr().stripCasts().(VariableAccess).getTarget() = fes.getVariable() +} + +private predicate returnsDefaultValue(ReturnStmt ret) { + ret.getExpr().stripCasts() instanceof NullLiteral + or + ret.getExpr().stripCasts() instanceof DefaultValueExpr +} + /** Holds if the type's qualified name is "System.Linq.Enumerable" */ predicate isEnumerableType(ValueOrRefType t) { t.hasFullyQualifiedName("System.Linq", "Enumerable") @@ -156,6 +167,32 @@ predicate missedWhereOpportunity(ForeachStmtGenericEnumerable fes, IfStmt is) { ) } +/** + * Holds if `foreach` statement `fes` could be converted to a `.FirstOrDefault()` call. + * That is, the loop contains a single `if` statement that accesses the loop variable, + * returns the loop variable when the condition matches, and is followed by a default return. + */ +predicate missedFirstOrDefaultOpportunity( + ForeachStmtGenericEnumerable fes, IfStmt is, ReturnStmt ret, ReturnStmt defaultRet +) { + // The loop only checks whether the current element is the first match. + is = firstStmt(fes) and + not exists(is.getElse()) and + numStmts(fes) = 1 and + exists(VariableAccess va | + va.getTarget() = fes.getVariable() and + va = is.getCondition().getAChildExpr*() + ) and + not is.getCondition().getAChildExpr*() instanceof AwaitExpr and + returnsLoopVariable(fes, is.getThen(), ret) and + // If no element matches, the method returns the same value that FirstOrDefault would. + returnsDefaultValue(defaultRet) and + exists(BlockStmt enclosingBlock, int i | + enclosingBlock.getStmt(i) = fes and + enclosingBlock.getStmt(i + 1) = defaultRet + ) +} + //#################### CLASSES #################### /** A LINQ Any(...) call. */ class AnyCall extends MethodCall { diff --git a/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.cs b/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.cs new file mode 100644 index 000000000000..1a7a1dff6e93 --- /dev/null +++ b/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.cs @@ -0,0 +1,18 @@ +class MissedFirstOrDefaultOpportunity +{ + public static Operation FindOperation(System.Collections.Generic.IEnumerable operations, string operationId) + { + foreach (var operation in operations) + { + if (string.Equals(operation.OperationId, operationId, System.StringComparison.Ordinal)) + return operation; + } + + return null; + } +} + +class Operation +{ + public string OperationId { get; set; } +} diff --git a/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.qhelp b/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.qhelp new file mode 100644 index 000000000000..578b062ca34e --- /dev/null +++ b/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.qhelp @@ -0,0 +1,36 @@ + + + +

    Programmers sometimes search a sequence by iterating over each element, testing it, and returning +the first element that satisfies the test. If the loop completes without finding a match, the method +then returns a default value such as null or default.

    + +
    + +

    This pattern is directly available as the FirstOrDefault method in LINQ. Using the +library method makes the search intent explicit and avoids manually spelling out the loop and +fallback return.

    + +
    + +

    In this example the method searches a list of operations for the first operation with a matching +identifier, returning null if no match is found.

    + + +

    The LINQ FirstOrDefault method can express this search more directly.

    + + +

    The following examples should not use FirstOrDefault, because they do more than +return the matching element or because the fallback value is not the default value.

    + + +
    + + +
  • MSDN: Enumerable.FirstOrDefault Method.
  • + + +
    +
    diff --git a/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.ql b/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.ql new file mode 100644 index 000000000000..adf0149478ac --- /dev/null +++ b/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.ql @@ -0,0 +1,22 @@ +/** + * @name Missed opportunity to use FirstOrDefault + * @description The intent of a foreach loop that returns the first sequence element satisfying a predicate, or a default value otherwise, + * can often be better expressed using LINQ's 'FirstOrDefault' method. + * @kind problem + * @problem.severity recommendation + * @precision high + * @id cs/linq/missed-firstordefault + * @tags quality + * maintainability + * readability + * language-features + */ + +import csharp +import Linq.Helpers + +from ForeachStmtGenericEnumerable fes, IfStmt is, ReturnStmt ret, ReturnStmt defaultRet +where missedFirstOrDefaultOpportunity(fes, is, ret, defaultRet) +select fes, + "This foreach loop $@ - consider finding the element explicitly using '.FirstOrDefault(...)'.", + is.getCondition(), "returns the first sequence element satisfying a predicate" diff --git a/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunityFix.cs b/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunityFix.cs new file mode 100644 index 000000000000..ba75401e9a73 --- /dev/null +++ b/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunityFix.cs @@ -0,0 +1,8 @@ +class MissedFirstOrDefaultOpportunityFix +{ + public static Operation FindOperation(System.Collections.Generic.IEnumerable operations, string operationId) + { + return operations.FirstOrDefault(operation => + string.Equals(operation.OperationId, operationId, System.StringComparison.Ordinal)); + } +} diff --git a/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunityGood.cs b/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunityGood.cs new file mode 100644 index 000000000000..17593b87c001 --- /dev/null +++ b/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunityGood.cs @@ -0,0 +1,35 @@ +class MissedFirstOrDefaultOpportunityGood +{ + public static Operation FindOperationOrThrow(System.Collections.Generic.IEnumerable operations, string operationId) + { + foreach (var operation in operations) + { + if (string.Equals(operation.OperationId, operationId, System.StringComparison.Ordinal)) + throw new System.InvalidOperationException("Unexpected operation."); + } + + return null; + } + + public static Operation FindReplacementOperation(System.Collections.Generic.IEnumerable operations, string operationId) + { + foreach (var operation in operations) + { + if (string.Equals(operation.OperationId, operationId, System.StringComparison.Ordinal)) + return operation; + } + + return new Operation(); + } + + public static string FindOperationId(System.Collections.Generic.IEnumerable operations, string operationId) + { + foreach (var operation in operations) + { + if (string.Equals(operation.OperationId, operationId, System.StringComparison.Ordinal)) + return operation.OperationId; + } + + return null; + } +} diff --git a/csharp/ql/src/codeql-suites/csharp-security-and-quality.qls b/csharp/ql/src/codeql-suites/csharp-security-and-quality.qls index 9700c8b03410..c86e286862ec 100644 --- a/csharp/ql/src/codeql-suites/csharp-security-and-quality.qls +++ b/csharp/ql/src/codeql-suites/csharp-security-and-quality.qls @@ -51,6 +51,7 @@ - cs/linq/inconsistent-enumeration - cs/linq/missed-all - cs/linq/missed-cast + - cs/linq/missed-firstordefault - cs/linq/missed-oftype - cs/linq/missed-select - cs/linq/missed-where diff --git a/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.cs b/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.cs new file mode 100644 index 000000000000..2894ef26d3de --- /dev/null +++ b/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.cs @@ -0,0 +1,129 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +class MissedFirstOrDefaultOpportunity +{ + public Operation M1(IEnumerable operations, string operationId) + { + // BAD: Can be replaced with operations.FirstOrDefault(operation => ...). + foreach (var operation in operations) + { + if (string.Equals(operation.OperationId, operationId, StringComparison.Ordinal)) + return operation; + } // $ Alert + + return null; + } + + public int M2(IEnumerable values) + { + // BAD: Can be replaced with values.FirstOrDefault(value => ...). + foreach (var value in values) + { + if (value > 0) + { + return value; + } + } // $ Alert + + return default; + } + + public int? M3(List values) + { + // BAD: Can be replaced with values.FirstOrDefault(value => ...). + foreach (var value in values) + { + if (value > 0) + return value; + } // $ Alert + + return default(int); + } + + public Operation M4(IEnumerable operations, string operationId) + { + // GOOD: FirstOrDefault does not throw when a match is found. + foreach (var operation in operations) + { + if (string.Equals(operation.OperationId, operationId, StringComparison.Ordinal)) + throw new InvalidOperationException(); + } + + return null; + } + + public Operation M5(IEnumerable operations, string operationId) + { + // GOOD: FirstOrDefault would return null/default when no match is found. + foreach (var operation in operations) + { + if (string.Equals(operation.OperationId, operationId, StringComparison.Ordinal)) + return operation; + } + + return new Operation(); + } + + public string M6(IEnumerable operations, string operationId) + { + // GOOD: FirstOrDefault would return the matching operation, not one of its properties. + foreach (var operation in operations) + { + if (string.Equals(operation.OperationId, operationId, StringComparison.Ordinal)) + return operation.OperationId; + } + + return null; + } + + public Operation M7(IEnumerable operations, string operationId) + { + // GOOD: The matched case has an additional side effect. + foreach (var operation in operations) + { + if (string.Equals(operation.OperationId, operationId, StringComparison.Ordinal)) + { + Console.WriteLine(operation.OperationId); + return operation; + } + } + + return null; + } + + public async Task M8(IEnumerable operations, string operationId) + { + // GOOD: FirstOrDefault does not support an async predicate. + foreach (var operation in operations) + { + if (await IsMatch(operation, operationId)) + return operation; + } + + return null; + } + + public Operation M9(IEnumerable operations, string operationId) + { + // GOOD: FirstOrDefault does not have an equivalent for an else branch in the loop. + foreach (var operation in operations) + { + if (string.Equals(operation.OperationId, operationId, StringComparison.Ordinal)) + return operation; + else + return null; + } + + return null; + } + + private static Task IsMatch(Operation operation, string operationId) => + Task.FromResult(string.Equals(operation.OperationId, operationId, StringComparison.Ordinal)); +} + +class Operation +{ + public string OperationId { get; set; } +} diff --git a/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.expected b/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.expected new file mode 100644 index 000000000000..6724c12bc08e --- /dev/null +++ b/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.expected @@ -0,0 +1,3 @@ +| MissedFirstOrDefaultOpportunity.cs:10:9:14:9 | foreach (... ... in ...) ... | This foreach loop $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | MissedFirstOrDefaultOpportunity.cs:12:17:12:91 | call to method Equals | returns the first sequence element satisfying a predicate | +| MissedFirstOrDefaultOpportunity.cs:22:9:28:9 | foreach (... ... in ...) ... | This foreach loop $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | MissedFirstOrDefaultOpportunity.cs:24:17:24:25 | ... > ... | returns the first sequence element satisfying a predicate | +| MissedFirstOrDefaultOpportunity.cs:36:9:40:9 | foreach (... ... in ...) ... | This foreach loop $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | MissedFirstOrDefaultOpportunity.cs:38:17:38:25 | ... > ... | returns the first sequence element satisfying a predicate | diff --git a/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.qlref b/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.qlref new file mode 100644 index 000000000000..91cc5ae4d348 --- /dev/null +++ b/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.qlref @@ -0,0 +1,2 @@ +query: Linq/MissedFirstOrDefaultOpportunity.ql +postprocess: utils/test/InlineExpectationsTestQuery.ql From 3a36d253f61e822bde2fa7c6016bc2fc3d471aae Mon Sep 17 00:00:00 2001 From: yoff Date: Tue, 1 Sep 2026 18:16:40 +0200 Subject: [PATCH 0636/2098] Remove redundant consistency qltests Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: cdf52e0a-b37e-4fd9-a902-420148ff5ef8 --- .../InvalidAbruptCompletionOrigin.expected | 17 ----------------- .../graph/InvalidAbruptCompletionOrigin.ql | 6 ------ .../InvalidAbruptCompletionOrigin.expected | 17 ----------------- .../basic/InvalidAbruptCompletionOrigin.ql | 6 ------ .../InvalidAbruptCompletionOrigin.expected | 17 ----------------- .../successors/InvalidAbruptCompletionOrigin.ql | 6 ------ 6 files changed, 69 deletions(-) delete mode 100644 csharp/ql/test/library-tests/controlflow/graph/InvalidAbruptCompletionOrigin.expected delete mode 100644 csharp/ql/test/library-tests/controlflow/graph/InvalidAbruptCompletionOrigin.ql delete mode 100644 java/ql/test/library-tests/controlflow/basic/InvalidAbruptCompletionOrigin.expected delete mode 100644 java/ql/test/library-tests/controlflow/basic/InvalidAbruptCompletionOrigin.ql delete mode 100644 python/ql/test/library-tests/ControlFlow/successors/InvalidAbruptCompletionOrigin.expected delete mode 100644 python/ql/test/library-tests/ControlFlow/successors/InvalidAbruptCompletionOrigin.ql diff --git a/csharp/ql/test/library-tests/controlflow/graph/InvalidAbruptCompletionOrigin.expected b/csharp/ql/test/library-tests/controlflow/graph/InvalidAbruptCompletionOrigin.expected deleted file mode 100644 index 5834c35bd638..000000000000 --- a/csharp/ql/test/library-tests/controlflow/graph/InvalidAbruptCompletionOrigin.expected +++ /dev/null @@ -1,17 +0,0 @@ -consistencyOverview -siblingsWithSameIndexInDefaultCfg -deadEnd -nonUniqueEnclosingCallable -nonUniqueInConditionalContext -nonLocalStep -ambiguousAdditionalNode -invalidAbruptCompletionOrigin -missingInNodeForPostOrInOrder -multipleSuccessors -multipleConditionalSuccessorKinds -directAndConditionalSuccessors -selfLoop -bodyPartNonOverlap -parameterNonOverlap -parameterEnclosingCallable -#select diff --git a/csharp/ql/test/library-tests/controlflow/graph/InvalidAbruptCompletionOrigin.ql b/csharp/ql/test/library-tests/controlflow/graph/InvalidAbruptCompletionOrigin.ql deleted file mode 100644 index 91c6a93e025a..000000000000 --- a/csharp/ql/test/library-tests/controlflow/graph/InvalidAbruptCompletionOrigin.ql +++ /dev/null @@ -1,6 +0,0 @@ -import csharp -import ControlFlow::Consistency - -from int results -where consistencyOverview("invalidAbruptCompletionOrigin", results) -select results diff --git a/java/ql/test/library-tests/controlflow/basic/InvalidAbruptCompletionOrigin.expected b/java/ql/test/library-tests/controlflow/basic/InvalidAbruptCompletionOrigin.expected deleted file mode 100644 index 5834c35bd638..000000000000 --- a/java/ql/test/library-tests/controlflow/basic/InvalidAbruptCompletionOrigin.expected +++ /dev/null @@ -1,17 +0,0 @@ -consistencyOverview -siblingsWithSameIndexInDefaultCfg -deadEnd -nonUniqueEnclosingCallable -nonUniqueInConditionalContext -nonLocalStep -ambiguousAdditionalNode -invalidAbruptCompletionOrigin -missingInNodeForPostOrInOrder -multipleSuccessors -multipleConditionalSuccessorKinds -directAndConditionalSuccessors -selfLoop -bodyPartNonOverlap -parameterNonOverlap -parameterEnclosingCallable -#select diff --git a/java/ql/test/library-tests/controlflow/basic/InvalidAbruptCompletionOrigin.ql b/java/ql/test/library-tests/controlflow/basic/InvalidAbruptCompletionOrigin.ql deleted file mode 100644 index 0e4aa51f72f0..000000000000 --- a/java/ql/test/library-tests/controlflow/basic/InvalidAbruptCompletionOrigin.ql +++ /dev/null @@ -1,6 +0,0 @@ -import java -import ControlFlow::Consistency - -from int results -where consistencyOverview("invalidAbruptCompletionOrigin", results) -select results diff --git a/python/ql/test/library-tests/ControlFlow/successors/InvalidAbruptCompletionOrigin.expected b/python/ql/test/library-tests/ControlFlow/successors/InvalidAbruptCompletionOrigin.expected deleted file mode 100644 index 5834c35bd638..000000000000 --- a/python/ql/test/library-tests/ControlFlow/successors/InvalidAbruptCompletionOrigin.expected +++ /dev/null @@ -1,17 +0,0 @@ -consistencyOverview -siblingsWithSameIndexInDefaultCfg -deadEnd -nonUniqueEnclosingCallable -nonUniqueInConditionalContext -nonLocalStep -ambiguousAdditionalNode -invalidAbruptCompletionOrigin -missingInNodeForPostOrInOrder -multipleSuccessors -multipleConditionalSuccessorKinds -directAndConditionalSuccessors -selfLoop -bodyPartNonOverlap -parameterNonOverlap -parameterEnclosingCallable -#select diff --git a/python/ql/test/library-tests/ControlFlow/successors/InvalidAbruptCompletionOrigin.ql b/python/ql/test/library-tests/ControlFlow/successors/InvalidAbruptCompletionOrigin.ql deleted file mode 100644 index 2d3cf71dffe9..000000000000 --- a/python/ql/test/library-tests/ControlFlow/successors/InvalidAbruptCompletionOrigin.ql +++ /dev/null @@ -1,6 +0,0 @@ -import semmle.python.controlflow.internal.AstNodeImpl -import ControlFlow::Consistency - -from int results -where consistencyOverview("invalidAbruptCompletionOrigin", results) -select results From 5e11c9aeb65fbba2432107ad9603c525d1bd90be Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Tue, 1 Sep 2026 13:09:33 -0400 Subject: [PATCH 0637/2098] tests: adds a negative test for break --- .../MissedWhereOpportunity/MissedWhereOpportunity.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/csharp/ql/test/query-tests/Linq/MissedWhereOpportunity/MissedWhereOpportunity.cs b/csharp/ql/test/query-tests/Linq/MissedWhereOpportunity/MissedWhereOpportunity.cs index 192e9893c955..7b9d35821299 100644 --- a/csharp/ql/test/query-tests/Linq/MissedWhereOpportunity/MissedWhereOpportunity.cs +++ b/csharp/ql/test/query-tests/Linq/MissedWhereOpportunity/MissedWhereOpportunity.cs @@ -162,6 +162,18 @@ public int M11(IEnumerable elements) return 0; } + public void M12(IEnumerable elements) + { + // GOOD: The filtered case exits the loop instead of continuing with filtered loop work. + foreach (var element in elements) + { + if (element.GetHashCode() % 2 == 0) + { + break; + } + } + } + public class NonEnumerableClass { public IEnumerator GetEnumerator() => throw null; From 41a9a16b757559819b29c2a8cc0218e1c44cb671 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Tue, 1 Sep 2026 13:24:25 -0400 Subject: [PATCH 0638/2098] fix: handle non null default values in the rule --- csharp/ql/lib/Linq/Helpers.qll | 24 ++++++++-- .../MissedFirstOrDefaultOpportunity.cs | 48 +++++++++++++++++++ .../MissedFirstOrDefaultOpportunity.expected | 2 + 3 files changed, 69 insertions(+), 5 deletions(-) diff --git a/csharp/ql/lib/Linq/Helpers.qll b/csharp/ql/lib/Linq/Helpers.qll index 6f636aab4acc..870f328ea5b0 100644 --- a/csharp/ql/lib/Linq/Helpers.qll +++ b/csharp/ql/lib/Linq/Helpers.qll @@ -25,10 +25,24 @@ private predicate returnsLoopVariable(ForeachStmt fes, Stmt s, ReturnStmt ret) { ret.getExpr().stripCasts().(VariableAccess).getTarget() = fes.getVariable() } -private predicate returnsDefaultValue(ReturnStmt ret) { - ret.getExpr().stripCasts() instanceof NullLiteral - or - ret.getExpr().stripCasts() instanceof DefaultValueExpr +private predicate hasNullDefault(Type t) { t.isRefType() or t instanceof NullableType } + +private predicate returnsDefaultValue(ForeachStmt fes, ReturnStmt ret) { + exists(Type elementType | + elementType = fes.getVariable().getType() | + ret.getExpr().stripCasts() instanceof NullLiteral and + hasNullDefault(elementType) + or + exists(DefaultValueExpr defaultValue | + defaultValue = ret.getExpr().stripCasts() and + ( + defaultValue.getType() = elementType + or + hasNullDefault(elementType) and + hasNullDefault(defaultValue.getType()) + ) + ) + ) } /** Holds if the type's qualified name is "System.Linq.Enumerable" */ @@ -186,7 +200,7 @@ predicate missedFirstOrDefaultOpportunity( not is.getCondition().getAChildExpr*() instanceof AwaitExpr and returnsLoopVariable(fes, is.getThen(), ret) and // If no element matches, the method returns the same value that FirstOrDefault would. - returnsDefaultValue(defaultRet) and + returnsDefaultValue(fes, defaultRet) and exists(BlockStmt enclosingBlock, int i | enclosingBlock.getStmt(i) = fes and enclosingBlock.getStmt(i + 1) = defaultRet diff --git a/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.cs b/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.cs index 2894ef26d3de..80584bd6ea6b 100644 --- a/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.cs +++ b/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.cs @@ -119,6 +119,54 @@ public Operation M9(IEnumerable operations, string operationId) return null; } + public object M10(IEnumerable values) + { + // GOOD: FirstOrDefault would return boxed 0 when no match is found, not null. + foreach (var value in values) + { + if (value > 0) + return value; + } + + return null; + } + + public object M11(IEnumerable values) + { + // GOOD: FirstOrDefault would return boxed 0 when no match is found, not default(object). + foreach (var value in values) + { + if (value > 0) + return value; + } + + return default(object); + } + + public object M12(IEnumerable values) + { + // BAD: FirstOrDefault returns null for missing reference-type elements, matching the fallback. + foreach (var value in values) + { + if (value.Length > 0) + return value; + } // $ Alert + + return null; + } + + public object M13(IEnumerable values) + { + // BAD: FirstOrDefault returns 0 for missing int elements, matching the fallback before boxing. + foreach (var value in values) + { + if (value > 0) + return value; + } // $ Alert + + return default(int); + } + private static Task IsMatch(Operation operation, string operationId) => Task.FromResult(string.Equals(operation.OperationId, operationId, StringComparison.Ordinal)); } diff --git a/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.expected b/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.expected index 6724c12bc08e..70689f5aaeb9 100644 --- a/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.expected +++ b/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.expected @@ -1,3 +1,5 @@ | MissedFirstOrDefaultOpportunity.cs:10:9:14:9 | foreach (... ... in ...) ... | This foreach loop $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | MissedFirstOrDefaultOpportunity.cs:12:17:12:91 | call to method Equals | returns the first sequence element satisfying a predicate | | MissedFirstOrDefaultOpportunity.cs:22:9:28:9 | foreach (... ... in ...) ... | This foreach loop $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | MissedFirstOrDefaultOpportunity.cs:24:17:24:25 | ... > ... | returns the first sequence element satisfying a predicate | | MissedFirstOrDefaultOpportunity.cs:36:9:40:9 | foreach (... ... in ...) ... | This foreach loop $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | MissedFirstOrDefaultOpportunity.cs:38:17:38:25 | ... > ... | returns the first sequence element satisfying a predicate | +| MissedFirstOrDefaultOpportunity.cs:149:9:153:9 | foreach (... ... in ...) ... | This foreach loop $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | MissedFirstOrDefaultOpportunity.cs:151:17:151:32 | ... > ... | returns the first sequence element satisfying a predicate | +| MissedFirstOrDefaultOpportunity.cs:161:9:165:9 | foreach (... ... in ...) ... | This foreach loop $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | MissedFirstOrDefaultOpportunity.cs:163:17:163:25 | ... > ... | returns the first sequence element satisfying a predicate | From b2721ad27d061bd24fddb89dd9c37ddddd65e1da Mon Sep 17 00:00:00 2001 From: Kasper Svendsen Date: Tue, 1 Sep 2026 09:40:53 +0200 Subject: [PATCH 0639/2098] Ruby: Disable dynamic reordering for select predicate --- shared/concepts/codeql/concepts/ConceptsShared.qll | 1 + 1 file changed, 1 insertion(+) diff --git a/shared/concepts/codeql/concepts/ConceptsShared.qll b/shared/concepts/codeql/concepts/ConceptsShared.qll index c2d9b03f8f79..038edc2efe30 100644 --- a/shared/concepts/codeql/concepts/ConceptsShared.qll +++ b/shared/concepts/codeql/concepts/ConceptsShared.qll @@ -128,6 +128,7 @@ module ConceptsMake DataFlowLang> { * Gets a data flow node that contributes to the URL of the request. * Depending on the framework, a request may have multiple nodes which contribute to the URL. */ + pragma[no_dynamic_join_order] abstract DataFlowNode getAUrlPart(); /** Gets a string that identifies the framework used for this request. */ From f452bd48ebf0cf989ead1f81d769fba38b2f9a9d Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Wed, 2 Sep 2026 10:19:37 +0200 Subject: [PATCH 0640/2098] Apply suggestion from @asgerf Co-authored-by: Asger F --- unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll index 18f98ad57913..ee27d4a28bc8 100644 --- a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll @@ -4,7 +4,7 @@ overlay[local?] module; -import unified +private import unified private import codeql.controlflow.ControlFlowGraph private import codeql.controlflow.SuccessorType From 479cceb9f496efa6bac06b03c45dd5f1cabba152 Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 2 Sep 2026 10:21:54 +0200 Subject: [PATCH 0641/2098] JS: Report HTML/XHTML files under file coverage --- javascript/resources/codeql-extractor.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/javascript/resources/codeql-extractor.yml b/javascript/resources/codeql-extractor.yml index bfc99d826fc5..b7c4999385dd 100644 --- a/javascript/resources/codeql-extractor.yml +++ b/javascript/resources/codeql-extractor.yml @@ -25,15 +25,23 @@ file_coverage_languages: display_name: Vue.js component scc_languages: - Vue + - name: html + display_name: HTML + scc_languages: + - HTML + - XHTML github_api_languages: - JavaScript - TypeScript - Vue + - HTML scc_languages: - JavaScript - TypeScript - TypeScript Typings - Vue + - HTML + - XHTML file_types: - name: javascript display_name: JavaScript From 35e48a6c8460f3be11c67592f711cf35ef099c09 Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 2 Sep 2026 10:30:44 +0200 Subject: [PATCH 0642/2098] JS: Change note --- javascript/ql/src/change-notes/2026-09-02-html-coverage.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 javascript/ql/src/change-notes/2026-09-02-html-coverage.md diff --git a/javascript/ql/src/change-notes/2026-09-02-html-coverage.md b/javascript/ql/src/change-notes/2026-09-02-html-coverage.md new file mode 100644 index 000000000000..793fd10845e1 --- /dev/null +++ b/javascript/ql/src/change-notes/2026-09-02-html-coverage.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* HTML files are now included in file-coverage stats, and will start showing up on the status page for CodeQL under "Scanned Files". From 23772149ca0fc2b3d35f0a5b6a431797daf85c88 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Wed, 2 Sep 2026 10:32:49 +0200 Subject: [PATCH 0643/2098] Add actions.lock extraction Teach the JavaScript extractor to classify .lock files as YAML while limiting default autobuild extraction to explicitly included paths. Expose Actions lockfiles through the ActionsLock QL class and cover extraction with QL and database-creation integration tests. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 4994bb27-c5ca-47e9-b082-cfc1ca244e86 --- actions/extractor/tools/autobuild-impl.ps1 | 3 ++- actions/extractor/tools/autobuild.sh | 1 + .../actions-lock/query/actions.ql | 4 ++++ .../actions-lock/query/qlpack.yml | 4 ++++ .../src/.github/workflows/test.yml | 6 ++++++ .../actions-lock/src/actions.lock | 19 +++++++++++++++++++ .../ql/integration-tests/actions-lock/test.py | 4 ++++ actions/ql/lib/actions.qll | 1 + .../2026-09-01-actions-lock-yaml.md | 5 +++++ actions/ql/lib/codeql/actions/Lock.qll | 10 ++++++++++ .../actions-lock/.github/workflows/test.yml | 6 ++++++ .../library-tests/actions-lock/actions.lock | 19 +++++++++++++++++++ .../test/library-tests/actions-lock/options | 1 + .../library-tests/actions-lock/test.expected | 1 + .../test/library-tests/actions-lock/test.ql | 4 ++++ .../com/semmle/js/extractor/AutoBuild.java | 3 +++ .../semmle/js/extractor/FileExtractor.java | 2 +- 17 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 actions/ql/integration-tests/actions-lock/query/actions.ql create mode 100644 actions/ql/integration-tests/actions-lock/query/qlpack.yml create mode 100644 actions/ql/integration-tests/actions-lock/src/.github/workflows/test.yml create mode 100644 actions/ql/integration-tests/actions-lock/src/actions.lock create mode 100644 actions/ql/integration-tests/actions-lock/test.py create mode 100644 actions/ql/lib/change-notes/2026-09-01-actions-lock-yaml.md create mode 100644 actions/ql/lib/codeql/actions/Lock.qll create mode 100644 actions/ql/test/library-tests/actions-lock/.github/workflows/test.yml create mode 100644 actions/ql/test/library-tests/actions-lock/actions.lock create mode 100644 actions/ql/test/library-tests/actions-lock/options create mode 100644 actions/ql/test/library-tests/actions-lock/test.expected create mode 100644 actions/ql/test/library-tests/actions-lock/test.ql diff --git a/actions/extractor/tools/autobuild-impl.ps1 b/actions/extractor/tools/autobuild-impl.ps1 index e232cd3cc545..6f04a28520d3 100644 --- a/actions/extractor/tools/autobuild-impl.ps1 +++ b/actions/extractor/tools/autobuild-impl.ps1 @@ -9,7 +9,8 @@ $DefaultPathFilters = @( 'include:.github/reusable_workflows/**/*.yml', 'include:.github/reusable_workflows/**/*.yaml', 'include:**/action.yml', - 'include:**/action.yaml' + 'include:**/action.yaml', + 'include:**/actions.lock' ) if ($null -ne $env:LGTM_INDEX_FILTERS) { diff --git a/actions/extractor/tools/autobuild.sh b/actions/extractor/tools/autobuild.sh index f2cbb7ddfa7e..c2794044ee64 100755 --- a/actions/extractor/tools/autobuild.sh +++ b/actions/extractor/tools/autobuild.sh @@ -14,6 +14,7 @@ include:.github/reusable_workflows/**/*.yml include:.github/reusable_workflows/**/*.yaml include:**/action.yml include:**/action.yaml +include:**/actions.lock END ) diff --git a/actions/ql/integration-tests/actions-lock/query/actions.ql b/actions/ql/integration-tests/actions-lock/query/actions.ql new file mode 100644 index 000000000000..03451f476fcd --- /dev/null +++ b/actions/ql/integration-tests/actions-lock/query/actions.ql @@ -0,0 +1,4 @@ +import codeql.actions.Lock + +from ActionsLock lock +select lock.getFile() diff --git a/actions/ql/integration-tests/actions-lock/query/qlpack.yml b/actions/ql/integration-tests/actions-lock/query/qlpack.yml new file mode 100644 index 000000000000..03c0b4e9a3af --- /dev/null +++ b/actions/ql/integration-tests/actions-lock/query/qlpack.yml @@ -0,0 +1,4 @@ +name: codeql/actions-lock-integration-test +dependencies: + codeql/actions-all: "*" +warnOnImplicitThis: true diff --git a/actions/ql/integration-tests/actions-lock/src/.github/workflows/test.yml b/actions/ql/integration-tests/actions-lock/src/.github/workflows/test.yml new file mode 100644 index 000000000000..79afdcdf7006 --- /dev/null +++ b/actions/ql/integration-tests/actions-lock/src/.github/workflows/test.yml @@ -0,0 +1,6 @@ +on: push +jobs: + test: + runs-on: ubuntu-latest + steps: + - run: echo test diff --git a/actions/ql/integration-tests/actions-lock/src/actions.lock b/actions/ql/integration-tests/actions-lock/src/actions.lock new file mode 100644 index 000000000000..bb91aa093d86 --- /dev/null +++ b/actions/ql/integration-tests/actions-lock/src/actions.lock @@ -0,0 +1,19 @@ +# This file is machine-generated by `gh actions-lock`. +# Do not edit by hand; run `gh actions-lock` to update. +# Docs: https://gh.io/actions-lockfile +version: 'v0.0.2' +workflows: + '.github/workflows/test.yml': + - 'actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1' + - 'github/codeql-action@db488ddef3bf6cb639b32c2e9a7c0a7ea8271d28' +dependencies: + 'actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1': + ref: '3d3c42e5aac5ba805825da76410c181273ba90b1' + commit: 'sha1-3d3c42e5aac5ba805825da76410c181273ba90b1' + owner_id: 44036562 + repo_id: 197814629 + 'github/codeql-action@db488ddef3bf6cb639b32c2e9a7c0a7ea8271d28': + ref: 'v4.37.8' + commit: 'sha1-db488ddef3bf6cb639b32c2e9a7c0a7ea8271d28' + owner_id: 9919 + repo_id: 259445878 diff --git a/actions/ql/integration-tests/actions-lock/test.py b/actions/ql/integration-tests/actions-lock/test.py new file mode 100644 index 000000000000..3d63143dc1c2 --- /dev/null +++ b/actions/ql/integration-tests/actions-lock/test.py @@ -0,0 +1,4 @@ +def test_actions_lock(codeql, actions, javascript): + codeql.database.create(source_root="src", language="actions") + output = codeql.query.run("query/actions.ql", database="test-db", _capture=True) + assert "actions.lock" in output diff --git a/actions/ql/lib/actions.qll b/actions/ql/lib/actions.qll index 2c1d1cee9259..f57127b0f031 100644 --- a/actions/ql/lib/actions.qll +++ b/actions/ql/lib/actions.qll @@ -1 +1,2 @@ import codeql.actions.Ast +import codeql.actions.Lock diff --git a/actions/ql/lib/change-notes/2026-09-01-actions-lock-yaml.md b/actions/ql/lib/change-notes/2026-09-01-actions-lock-yaml.md new file mode 100644 index 000000000000..ed0a25515da0 --- /dev/null +++ b/actions/ql/lib/change-notes/2026-09-01-actions-lock-yaml.md @@ -0,0 +1,5 @@ +--- +category: feature +--- +* GitHub Actions databases now extract `actions.lock` files. The new `ActionsLock` class + provides access to their YAML abstract syntax trees. diff --git a/actions/ql/lib/codeql/actions/Lock.qll b/actions/ql/lib/codeql/actions/Lock.qll new file mode 100644 index 000000000000..8fb8a8a8b359 --- /dev/null +++ b/actions/ql/lib/codeql/actions/Lock.qll @@ -0,0 +1,10 @@ +/** + * Provides classes for working with GitHub Actions lockfiles. + */ + +private import codeql.actions.ast.internal.Yaml + +/** An `actions.lock` file. */ +class ActionsLock extends YamlDocument { + ActionsLock() { this.getFile().getBaseName() = "actions.lock" } +} diff --git a/actions/ql/test/library-tests/actions-lock/.github/workflows/test.yml b/actions/ql/test/library-tests/actions-lock/.github/workflows/test.yml new file mode 100644 index 000000000000..79afdcdf7006 --- /dev/null +++ b/actions/ql/test/library-tests/actions-lock/.github/workflows/test.yml @@ -0,0 +1,6 @@ +on: push +jobs: + test: + runs-on: ubuntu-latest + steps: + - run: echo test diff --git a/actions/ql/test/library-tests/actions-lock/actions.lock b/actions/ql/test/library-tests/actions-lock/actions.lock new file mode 100644 index 000000000000..bb91aa093d86 --- /dev/null +++ b/actions/ql/test/library-tests/actions-lock/actions.lock @@ -0,0 +1,19 @@ +# This file is machine-generated by `gh actions-lock`. +# Do not edit by hand; run `gh actions-lock` to update. +# Docs: https://gh.io/actions-lockfile +version: 'v0.0.2' +workflows: + '.github/workflows/test.yml': + - 'actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1' + - 'github/codeql-action@db488ddef3bf6cb639b32c2e9a7c0a7ea8271d28' +dependencies: + 'actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1': + ref: '3d3c42e5aac5ba805825da76410c181273ba90b1' + commit: 'sha1-3d3c42e5aac5ba805825da76410c181273ba90b1' + owner_id: 44036562 + repo_id: 197814629 + 'github/codeql-action@db488ddef3bf6cb639b32c2e9a7c0a7ea8271d28': + ref: 'v4.37.8' + commit: 'sha1-db488ddef3bf6cb639b32c2e9a7c0a7ea8271d28' + owner_id: 9919 + repo_id: 259445878 diff --git a/actions/ql/test/library-tests/actions-lock/options b/actions/ql/test/library-tests/actions-lock/options new file mode 100644 index 000000000000..fa6fe3a34854 --- /dev/null +++ b/actions/ql/test/library-tests/actions-lock/options @@ -0,0 +1 @@ +semmle-extractor-options: actions.lock diff --git a/actions/ql/test/library-tests/actions-lock/test.expected b/actions/ql/test/library-tests/actions-lock/test.expected new file mode 100644 index 000000000000..128df0e9ae0e --- /dev/null +++ b/actions/ql/test/library-tests/actions-lock/test.expected @@ -0,0 +1 @@ +| actions.lock:0:0:0:0 | actions.lock | diff --git a/actions/ql/test/library-tests/actions-lock/test.ql b/actions/ql/test/library-tests/actions-lock/test.ql new file mode 100644 index 000000000000..03451f476fcd --- /dev/null +++ b/actions/ql/test/library-tests/actions-lock/test.ql @@ -0,0 +1,4 @@ +import codeql.actions.Lock + +from ActionsLock lock +select lock.getFile() diff --git a/javascript/extractor/src/com/semmle/js/extractor/AutoBuild.java b/javascript/extractor/src/com/semmle/js/extractor/AutoBuild.java index d88897819211..b6cdfa44a7db 100644 --- a/javascript/extractor/src/com/semmle/js/extractor/AutoBuild.java +++ b/javascript/extractor/src/com/semmle/js/extractor/AutoBuild.java @@ -404,6 +404,9 @@ private void setupFilters() { patterns.add("**/*tsconfig*.json"); patterns.add("**/codeql-javascript-*.json"); + // exclude lock files that are not explicitly included via `LGTM_INDEX_FILTERS` + patterns.add("-**/*.lock"); + // include any explicitly specified extensions for (String extension : fileTypes.keySet()) patterns.add("**/*" + extension); diff --git a/javascript/extractor/src/com/semmle/js/extractor/FileExtractor.java b/javascript/extractor/src/com/semmle/js/extractor/FileExtractor.java index 70d6677855d5..5247b2e506ef 100644 --- a/javascript/extractor/src/com/semmle/js/extractor/FileExtractor.java +++ b/javascript/extractor/src/com/semmle/js/extractor/FileExtractor.java @@ -321,7 +321,7 @@ public boolean isTrapCachingAllowed() { } }, - YAML(".raml", ".yaml", ".yml") { + YAML(".lock", ".raml", ".yaml", ".yml") { @Override public IExtractor mkExtractor(ExtractorConfig config, ExtractorState state) { return new YAMLExtractor(config); From 53f30a0796ae179132d3a3601c5409eee4dce60d Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Wed, 2 Sep 2026 10:53:35 +0200 Subject: [PATCH 0644/2098] CFG: Rename ForeachStmt to ForEachStmt. --- .../code/csharp/controlflow/internal/ControlFlowGraph.qll | 2 +- java/ql/lib/semmle/code/java/ControlFlowGraph.qll | 2 +- .../semmle/python/controlflow/internal/AstNodeImpl.qll | 6 +++--- ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll | 6 +++--- .../controlflow/codeql/controlflow/ControlFlowGraph.qll | 8 ++++---- .../ql/lib/codeql/unified/internal/ControlFlowGraph.qll | 2 +- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraph.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraph.qll index 14bbb0251728..b30646466a57 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraph.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraph.qll @@ -190,7 +190,7 @@ module Ast implements AstSig { final private class FinalForeachStmt = CS::ForeachStmt; - class ForeachStmt extends FinalForeachStmt { + class ForEachStmt extends FinalForeachStmt { Expr getVariable() { result = this.getVariableDeclExpr() or result = this.getVariableDeclTuple() } diff --git a/java/ql/lib/semmle/code/java/ControlFlowGraph.qll b/java/ql/lib/semmle/code/java/ControlFlowGraph.qll index c4f0c44b3813..1281afc52728 100644 --- a/java/ql/lib/semmle/code/java/ControlFlowGraph.qll +++ b/java/ql/lib/semmle/code/java/ControlFlowGraph.qll @@ -100,7 +100,7 @@ private module Ast implements AstSig { final private class FinalEnhancedForStmt = J::EnhancedForStmt; - class ForeachStmt extends FinalEnhancedForStmt { + class ForEachStmt extends FinalEnhancedForStmt { Expr getVariable() { result = super.getVariable() } Expr getCollection() { result = super.getExpr() } diff --git a/python/ql/lib/semmle/python/controlflow/internal/AstNodeImpl.qll b/python/ql/lib/semmle/python/controlflow/internal/AstNodeImpl.qll index 78218f489215..1cc3082d90f7 100644 --- a/python/ql/lib/semmle/python/controlflow/internal/AstNodeImpl.qll +++ b/python/ql/lib/semmle/python/controlflow/internal/AstNodeImpl.qll @@ -657,10 +657,10 @@ module Ast implements AstSig { } /** A for-each loop (`for x in iterable:`). */ - class ForeachStmt extends LoopStmtImpl { + class ForEachStmt extends LoopStmtImpl { private Py::For forStmt; - ForeachStmt() { this = TPyStmt(forStmt) } + ForEachStmt() { this = TPyStmt(forStmt) } /** Gets the loop variable. */ Expr getVariable() { result.asExpr() = forStmt.getTarget() } @@ -898,7 +898,7 @@ module Ast implements AstSig { AstNode getLoopElse(LoopStmt loop) { result = loop.(WhileStmt).getElse() or - result = loop.(ForeachStmt).getElse() + result = loop.(ForEachStmt).getElse() } /** An exception handler (`except` or `except*`). */ diff --git a/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll b/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll index 4ad4c3d6a41b..419f840290c4 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll @@ -295,9 +295,9 @@ private module Ast implements AstSig { AstNode getUpdate(int index) { none() } } - // `ForExpr` would be a match for `ForeachStmt`, but it is desugared. - class ForeachStmt extends LoopStmt { - ForeachStmt() { none() } + // `ForExpr` would be a match for `ForEachStmt`, but it is desugared. + class ForEachStmt extends LoopStmt { + ForEachStmt() { none() } Expr getVariable() { none() } diff --git a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll index 21bdcf5b8335..c1a121f810df 100644 --- a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll +++ b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll @@ -147,7 +147,7 @@ signature module AstSig { } /** A for-loop that iterates over the elements of a collection. */ - class ForeachStmt extends LoopStmt { + class ForEachStmt extends LoopStmt { /** Gets the variable declaration of this `foreach` loop. */ Expr getVariable(); @@ -650,7 +650,7 @@ module Make0 Ast> { any(Case case).getGuard() = n ) or - any(ForeachStmt foreachstmt).getCollection() = n and kind.isEmptiness() + any(ForEachStmt foreachstmt).getCollection() = n and kind.isEmptiness() or kind.isMatching() and ( @@ -1656,7 +1656,7 @@ module Make0 Ast> { n2.isAfter(loopstmt) ) or - exists(ForeachStmt foreachstmt | + exists(ForEachStmt foreachstmt | n1.isBefore(foreachstmt) and n2.isBefore(foreachstmt.getCollection()) or @@ -2401,7 +2401,7 @@ module Make0 Ast> { // allow for loop headers in foreach loops (they're checking emptiness on the iterator, not the collection) not ( t instanceof DirectSuccessor and - node.isAdditional(any(ForeachStmt foreach), loopHeaderTag()) + node.isAdditional(any(ForEachStmt foreach), loopHeaderTag()) ) and // allow for functions with multiple bodies not exists(Callable c | diff --git a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll index ee27d4a28bc8..15db0eb3836e 100644 --- a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll @@ -123,7 +123,7 @@ private module Ast implements AstSig { AstNode getUpdate(int index) { none() } } - class ForeachStmt extends LoopStmt instanceof U::ForEachStmt { + class ForEachStmt extends LoopStmt instanceof U::ForEachStmt { override Stmt getBody() { result = U::ForEachStmt.super.getBody() } // TODO support foreach guard From 3d143e1c07af88c284e0727ca332beb00e84682b Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Wed, 2 Sep 2026 10:59:22 +0200 Subject: [PATCH 0645/2098] Unified: Make pattern a subtype of expr. --- unified/extractor/ast_types.yml | 4 +--- unified/ql/lib/codeql/unified/internal/Ast.qll | 10 +++------- unified/ql/lib/unified.dbscheme | 6 ++---- 3 files changed, 6 insertions(+), 14 deletions(-) diff --git a/unified/extractor/ast_types.yml b/unified/extractor/ast_types.yml index 1c98bdeefe61..dd17a9d584bf 100644 --- a/unified/extractor/ast_types.yml +++ b/unified/extractor/ast_types.yml @@ -33,8 +33,6 @@ supertypes: - switch_expr - unresolved_operator_sequence - unsupported_node - expr_or_pattern: - - expr - pattern expr_or_type: - expr @@ -164,7 +162,7 @@ named: # Plain assignment assign_expr: - target: expr_or_pattern + target: expr value: expr # Compound assignment diff --git a/unified/ql/lib/codeql/unified/internal/Ast.qll b/unified/ql/lib/codeql/unified/internal/Ast.qll index eb02d0434837..cf927e257a9c 100644 --- a/unified/ql/lib/codeql/unified/internal/Ast.qll +++ b/unified/ql/lib/codeql/unified/internal/Ast.qll @@ -189,7 +189,7 @@ module Unified { final override string getAPrimaryQlClass() { result = "AssignExpr" } /** Gets the node corresponding to the field `target`. */ - final F::ExprOrPattern getTarget() { unified_assign_expr_def(this, result, _) } + final F::Expr getTarget() { unified_assign_expr_def(this, result, _) } /** Gets the node corresponding to the field `value`. */ final F::Expr getValue() { unified_assign_expr_def(this, _, result) } @@ -658,7 +658,7 @@ module Unified { } } - class Expr extends @unified_expr, F::ExprOrOperator, F::ExprOrPattern, F::ExprOrType, F::Stmt { } + class Expr extends @unified_expr, F::ExprOrOperator, F::ExprOrType, F::Stmt { } /** A class representing `expr_equality_pattern` nodes. */ class ExprEqualityPattern extends @unified_expr_equality_pattern, F::Pattern { @@ -674,8 +674,6 @@ module Unified { class ExprOrOperator extends @unified_expr_or_operator, F::AstNode { } - class ExprOrPattern extends @unified_expr_or_pattern, F::AstNode { } - class ExprOrType extends @unified_expr_or_type, F::AstNode { } /** A class representing `fixity` tokens. */ @@ -1201,7 +1199,7 @@ module Unified { } } - class Pattern extends @unified_pattern, F::ExprOrPattern { } + class Pattern extends @unified_pattern, F::Expr { } /** A class representing `pattern_element` nodes. */ class PatternElement extends @unified_pattern_element, F::AstNode { @@ -2107,8 +2105,6 @@ module UnifiedFinal { final class ExprOrOperator = F::ExprOrOperator; - final class ExprOrPattern = F::ExprOrPattern; - final class ExprOrType = F::ExprOrType; final class Fixity = F::Fixity; diff --git a/unified/ql/lib/unified.dbscheme b/unified/ql/lib/unified.dbscheme index 825d9fd0ff61..56312bb69d2c 100644 --- a/unified/ql/lib/unified.dbscheme +++ b/unified/ql/lib/unified.dbscheme @@ -196,7 +196,7 @@ unified_array_literal_def( unified_assign_expr_def( unique int id: @unified_assign_expr, - int target: @unified_expr_or_pattern ref, + int target: @unified_expr ref, int value: @unified_expr ref ); @@ -462,7 +462,7 @@ unified_equality_type_constraint_def( int right: @unified_type_expr ref ); -@unified_expr = @unified_array_literal | @unified_assign_expr | @unified_binary_expr | @unified_block | @unified_break_expr | @unified_call_expr | @unified_compound_assign_expr | @unified_continue_expr | @unified_function_expr | @unified_if_expr | @unified_key_value_pair | @unified_map_literal | @unified_member_access_expr | @unified_name_expr | @unified_pattern_guard_expr | @unified_return_expr | @unified_switch_expr | @unified_throw_expr | @unified_token_boolean_literal | @unified_token_builtin_expr | @unified_token_empty_expr | @unified_token_float_literal | @unified_token_int_literal | @unified_token_regex_literal | @unified_token_string_literal | @unified_token_super_expr | @unified_token_unsupported_node | @unified_try_expr | @unified_tuple_expr | @unified_type_cast_expr | @unified_type_test_expr | @unified_unary_expr | @unified_unresolved_operator_sequence +@unified_expr = @unified_array_literal | @unified_assign_expr | @unified_binary_expr | @unified_block | @unified_break_expr | @unified_call_expr | @unified_compound_assign_expr | @unified_continue_expr | @unified_function_expr | @unified_if_expr | @unified_key_value_pair | @unified_map_literal | @unified_member_access_expr | @unified_name_expr | @unified_pattern | @unified_pattern_guard_expr | @unified_return_expr | @unified_switch_expr | @unified_throw_expr | @unified_token_boolean_literal | @unified_token_builtin_expr | @unified_token_empty_expr | @unified_token_float_literal | @unified_token_int_literal | @unified_token_regex_literal | @unified_token_string_literal | @unified_token_super_expr | @unified_token_unsupported_node | @unified_try_expr | @unified_tuple_expr | @unified_type_cast_expr | @unified_type_test_expr | @unified_unary_expr | @unified_unresolved_operator_sequence unified_expr_equality_pattern_def( unique int id: @unified_expr_equality_pattern, @@ -471,8 +471,6 @@ unified_expr_equality_pattern_def( @unified_expr_or_operator = @unified_expr | @unified_token_infix_operator -@unified_expr_or_pattern = @unified_expr | @unified_pattern - @unified_expr_or_type = @unified_expr | @unified_type_expr unified_for_each_stmt_body( From d36354beabef2c5c351610d0ce884187c167a888 Mon Sep 17 00:00:00 2001 From: Kasper Svendsen Date: Wed, 2 Sep 2026 11:56:56 +0200 Subject: [PATCH 0646/2098] C#: Disable dynamic reordering for Unification::Gvn::unifiableTypeArguments --- csharp/ql/lib/semmle/code/csharp/Unification.qll | 1 + 1 file changed, 1 insertion(+) diff --git a/csharp/ql/lib/semmle/code/csharp/Unification.qll b/csharp/ql/lib/semmle/code/csharp/Unification.qll index c8b78cd07a27..8dabaa8a20a8 100644 --- a/csharp/ql/lib/semmle/code/csharp/Unification.qll +++ b/csharp/ql/lib/semmle/code/csharp/Unification.qll @@ -348,6 +348,7 @@ module Gvn { * * `subsumes` indicates whether `arg1` in fact subsumes `arg2`. */ + pragma[no_dynamic_join_order] pragma[nomagic] private predicate unifiableTypeArguments( CompoundTypeKind k, GvnTypeArgument arg1, GvnTypeArgument arg2, int i, boolean subsumes From a92b6a8a5396aa3cb0e07c2f975e39e2ac80e3ac Mon Sep 17 00:00:00 2001 From: yoff Date: Wed, 2 Sep 2026 12:02:36 +0200 Subject: [PATCH 0647/2098] Apply suggestion from @aschackmull Co-authored-by: Anders Schack-Mulligen --- .../ql/lib/semmle/python/controlflow/internal/AstNodeImpl.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/ql/lib/semmle/python/controlflow/internal/AstNodeImpl.qll b/python/ql/lib/semmle/python/controlflow/internal/AstNodeImpl.qll index 1a2e6487805b..7de8546a80b5 100644 --- a/python/ql/lib/semmle/python/controlflow/internal/AstNodeImpl.qll +++ b/python/ql/lib/semmle/python/controlflow/internal/AstNodeImpl.qll @@ -1657,7 +1657,7 @@ private module Input implements InputSig1, InputSig2 { or e instanceof Py::Subscript or - e instanceof Py::BinaryExpr and e.(Py::BinaryExpr).getOp() instanceof Py::Div + e.(Py::BinaryExpr).getOp() instanceof Py::Div or e instanceof Py::ImportExpr or From 46f8cf6499ae00aaa83d9faff20e80cd167f01f7 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Wed, 2 Sep 2026 12:03:09 +0200 Subject: [PATCH 0648/2098] C#: Rename ForeachStmt to ForEachStmt. --- .../ql/consistency-queries/SsaConsistency.ql | 2 +- csharp/ql/lib/Linq/Helpers.qll | 30 +++++++++++-------- csharp/ql/lib/semmle/code/csharp/Stmt.qll | 9 ++++-- .../controlflow/internal/ControlFlowGraph.qll | 4 +-- .../semmle/code/csharp/dataflow/Nullness.qll | 4 +-- .../dataflow/internal/DataFlowPrivate.qll | 2 +- .../ql/lib/semmle/code/csharp/exprs/Expr.qll | 2 +- .../NoDisposeCallOnLocalIDisposable.ql | 2 +- csharp/ql/src/Dead Code/DeadStoreOfLocal.ql | 2 +- .../ql/src/Language Abuse/ForeachCapture.ql | 14 ++++----- .../Collections/WriteOnlyContainer.ql | 2 +- .../src/Likely Bugs/Statements/UseBraces.ql | 2 +- csharp/ql/src/Linq/BadMultipleIteration.ql | 2 +- csharp/ql/src/Linq/MissedAllOpportunity.ql | 2 +- csharp/ql/src/Linq/MissedCastOpportunity.ql | 2 +- csharp/ql/src/Linq/MissedOfTypeOpportunity.ql | 2 +- csharp/ql/src/Linq/MissedSelectOpportunity.ql | 2 +- csharp/ql/src/Linq/MissedWhereOpportunity.ql | 2 +- .../ql/test/library-tests/csharp7/ForEach.ql | 2 +- .../ql/test/library-tests/csharp9/foreach.ql | 4 +-- .../test/library-tests/statements/Foreach1.ql | 2 +- .../test/library-tests/statements/Foreach3.ql | 2 +- 22 files changed, 53 insertions(+), 44 deletions(-) diff --git a/csharp/ql/consistency-queries/SsaConsistency.ql b/csharp/ql/consistency-queries/SsaConsistency.ql index 003e7ddd5e94..6b3f4510e487 100644 --- a/csharp/ql/consistency-queries/SsaConsistency.ql +++ b/csharp/ql/consistency-queries/SsaConsistency.ql @@ -10,7 +10,7 @@ query predicate localDeclWithSsaDef(LocalVariableDeclExpr d) { exists(SsaExplicitWrite def | d = def.getDefinition().(AssignableDefinitions::LocalVariableDefinition).getDeclaration() | - not d = any(ForeachStmt fs).getVariableDeclExpr() and + not d = any(ForEachStmt fs).getVariableDeclExpr() and not d = any(SpecificCatchClause scc).getVariableDeclExpr() and not d.getVariable().getType() instanceof Struct and not d instanceof PatternExpr and diff --git a/csharp/ql/lib/Linq/Helpers.qll b/csharp/ql/lib/Linq/Helpers.qll index 2a4d5c8c27a2..feabaecff55a 100644 --- a/csharp/ql/lib/Linq/Helpers.qll +++ b/csharp/ql/lib/Linq/Helpers.qll @@ -8,13 +8,13 @@ private import semmle.code.csharp.frameworks.system.collections.Generic as Gener private import semmle.code.csharp.frameworks.system.Collections as Collections //#################### PREDICATES #################### -private Stmt firstStmt(ForeachStmt fes) { +private Stmt firstStmt(ForEachStmt fes) { if fes.getBody() instanceof BlockStmt then result = fes.getBody().(BlockStmt).getStmt(0) else result = fes.getBody() } -private int numStmts(ForeachStmt fes) { +private int numStmts(ForEachStmt fes) { if fes.getBody() instanceof BlockStmt then result = count(fes.getBody().(BlockStmt).getAStmt()) else result = 1 @@ -33,12 +33,15 @@ predicate isIEnumerableType(ValueOrRefType t) { ) } +/** DEPRECATED: Use `ForEachStmtGenericEnumerable` instead. */ +deprecated class ForeachStmtGenericEnumerable = ForEachStmtGenericEnumerable; + /** * A class of foreach statements where the iterable expression * supports the use of the LINQ extension methods on `IEnumerable`. */ -class ForeachStmtGenericEnumerable extends ForeachStmt { - ForeachStmtGenericEnumerable() { +class ForEachStmtGenericEnumerable extends ForEachStmt { + ForEachStmtGenericEnumerable() { exists(ValueOrRefType t | t = this.getIterableExpr().getType() | t.getABaseType*().getUnboundDeclaration() instanceof GenericCollections::SystemCollectionsGenericIEnumerableTInterface or @@ -47,12 +50,15 @@ class ForeachStmtGenericEnumerable extends ForeachStmt { } } +/** DEPRECATED: Use `ForEachStmtEnumerable` instead. */ +deprecated class ForeachStmtEnumerable = ForEachStmtEnumerable; + /** * A class of foreach statements where the iterable expression * supports the use of the LINQ extension methods on `IEnumerable`. */ -class ForeachStmtEnumerable extends ForeachStmt { - ForeachStmtEnumerable() { +class ForEachStmtEnumerable extends ForEachStmt { + ForEachStmtEnumerable() { exists(ValueOrRefType t | t = this.getIterableExpr().getType() | t.getABaseType*() instanceof Collections::SystemCollectionsIEnumerableInterface or t.(ArrayType).getRank() = 1 @@ -62,11 +68,11 @@ class ForeachStmtEnumerable extends ForeachStmt { /** * Holds if `foreach` statement `fes` could be converted to a `.All()` call. - * That is, the `ForeachStmt` contains a single `if` with a condition that + * That is, the `ForEachStmt` contains a single `if` with a condition that * accesses the loop variable and with a body that assigns `false` to a variable * and `break`s out of the `foreach`. */ -predicate missedAllOpportunity(ForeachStmtGenericEnumerable fes) { +predicate missedAllOpportunity(ForEachStmtGenericEnumerable fes) { exists(IfStmt is | // The loop contains an if statement with no else case, and nothing else. is = firstStmt(fes) and @@ -90,7 +96,7 @@ predicate missedAllOpportunity(ForeachStmtGenericEnumerable fes) { * block, the access is a cast, and the first statement is a * local variable declaration statement `s`. */ -predicate missedCastOpportunity(ForeachStmtEnumerable fes, LocalVariableDeclStmt s) { +predicate missedCastOpportunity(ForEachStmtEnumerable fes, LocalVariableDeclStmt s) { s = firstStmt(fes) and forex(VariableAccess va | va = fes.getVariable().getAnAccess() | va = s.getAVariableDeclExpr().getAChildExpr*() @@ -107,7 +113,7 @@ predicate missedCastOpportunity(ForeachStmtEnumerable fes, LocalVariableDeclStmt * block, the access is a cast with the `as` operator, and the first statement * is a local variable declaration statement `s`. */ -predicate missedOfTypeOpportunity(ForeachStmtEnumerable fes, LocalVariableDeclStmt s) { +predicate missedOfTypeOpportunity(ForEachStmtEnumerable fes, LocalVariableDeclStmt s) { s = firstStmt(fes) and forex(VariableAccess va | va = fes.getVariable().getAnAccess() | va = s.getAVariableDeclExpr().getAChildExpr*() @@ -125,7 +131,7 @@ predicate missedOfTypeOpportunity(ForeachStmtEnumerable fes, LocalVariableDeclSt * local variable declaration statement `s`, and the initializer does not * contain an `await` expression (since `Select` does not support async lambdas). */ -predicate missedSelectOpportunity(ForeachStmtGenericEnumerable fes, LocalVariableDeclStmt s) { +predicate missedSelectOpportunity(ForEachStmtGenericEnumerable fes, LocalVariableDeclStmt s) { s = firstStmt(fes) and forex(VariableAccess va | va = fes.getVariable().getAnAccess() | va = s.getAVariableDeclExpr().getAChildExpr*() @@ -140,7 +146,7 @@ predicate missedSelectOpportunity(ForeachStmtGenericEnumerable fes, LocalVariabl * variable, and the body of the `if` is either a `continue` or there's nothing * else in the loop than the `if`. */ -predicate missedWhereOpportunity(ForeachStmtGenericEnumerable fes, IfStmt is) { +predicate missedWhereOpportunity(ForEachStmtGenericEnumerable fes, IfStmt is) { // The very first thing the foreach loop does is test its iteration variable. is = firstStmt(fes) and exists(VariableAccess va | diff --git a/csharp/ql/lib/semmle/code/csharp/Stmt.qll b/csharp/ql/lib/semmle/code/csharp/Stmt.qll index 3be818e43a50..ebf0e354b9bc 100644 --- a/csharp/ql/lib/semmle/code/csharp/Stmt.qll +++ b/csharp/ql/lib/semmle/code/csharp/Stmt.qll @@ -305,7 +305,7 @@ class DefaultCase extends CaseStmt, LabeledStmt { * * Either a `while` statement (`WhileStmt`), a `do`-`while` statement * (`DoStmt`), a `for` statement (`ForStmt`), or a `foreach` statement - * (`ForeachStmt`). + * (`ForEachStmt`). */ class LoopStmt extends Stmt, @loop_stmt { /** Gets the body of this loop statement. */ @@ -422,6 +422,9 @@ class ForStmt extends LoopStmt, @for_stmt { override string getAPrimaryQlClass() { result = "ForStmt" } } +/** DEPRECATED: Use `ForEachStmt` instead. */ +deprecated class ForeachStmt = ForEachStmt; + /** * A `foreach` loop, for example * @@ -431,7 +434,7 @@ class ForStmt extends LoopStmt, @for_stmt { * } * ``` */ -class ForeachStmt extends LoopStmt, @foreach_stmt { +class ForEachStmt extends LoopStmt, @foreach_stmt { /** * Gets the local variable of this `foreach` loop, if any. * @@ -564,7 +567,7 @@ class ForeachStmt extends LoopStmt, @foreach_stmt { override string toString() { result = "foreach (... ... in ...) ..." } - override string getAPrimaryQlClass() { result = "ForeachStmt" } + override string getAPrimaryQlClass() { result = "ForEachStmt" } } /** diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraph.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraph.qll index b30646466a57..b813d58875c1 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraph.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraph.qll @@ -188,9 +188,9 @@ module Ast implements AstSig { AstNode getUpdate(int index) { result = super.getUpdate(index) } } - final private class FinalForeachStmt = CS::ForeachStmt; + final private class FinalForEachStmt = CS::ForEachStmt; - class ForEachStmt extends FinalForeachStmt { + class ForEachStmt extends FinalForEachStmt { Expr getVariable() { result = this.getVariableDeclExpr() or result = this.getVariableDeclTuple() } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll index 1cd9c71acfc9..be2ed39a7d45 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll @@ -116,7 +116,7 @@ private predicate nonNullDef(SsaExplicitWrite def) { any(AssignableDefinitions::LocalVariableDefinition d | d.getExpr() = any(SpecificCatchClause scc).getVariableDeclExpr() or - d.getExpr() = any(ForeachStmt fs).getAVariableDeclExpr() + d.getExpr() = any(ForEachStmt fs).getAVariableDeclExpr() ) ) } @@ -306,7 +306,7 @@ class Dereference extends G::DereferenceableExpr { or this = any(LockStmt stmt).getExpr() or - this = any(ForeachStmt stmt).getIterableExpr() + this = any(ForEachStmt stmt).getIterableExpr() or exists(ExtensionMethodCall emc, Parameter p | this = emc.getArgumentForParameter(p) and diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll index d114101a7a38..8b86347ce460 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll @@ -2207,7 +2207,7 @@ private predicate readContentStep(Node node1, Content c, Node node2) { c instanceof ElementContent or exists( - ForeachStmt fs, SsaExplicitWrite def, AssignableDefinitions::LocalVariableDefinition defTo + ForEachStmt fs, SsaExplicitWrite def, AssignableDefinitions::LocalVariableDefinition defTo | node1.asExpr() = fs.getIterableExpr() and defTo.getDeclaration() = fs.getVariableDeclExpr() and diff --git a/csharp/ql/lib/semmle/code/csharp/exprs/Expr.qll b/csharp/ql/lib/semmle/code/csharp/exprs/Expr.qll index 857212f90aac..c8648741d011 100644 --- a/csharp/ql/lib/semmle/code/csharp/exprs/Expr.qll +++ b/csharp/ql/lib/semmle/code/csharp/exprs/Expr.qll @@ -1107,7 +1107,7 @@ class QualifiableExpr extends Expr, @qualifiable_expr { private Expr getAnAssignOrForeachChild() { result = any(AssignExpr e).getLeftOperand() or - result = any(ForeachStmt fs).getVariableDeclTuple() + result = any(ForEachStmt fs).getVariableDeclTuple() or result = getAnAssignOrForeachChild().getAChildExpr() } diff --git a/csharp/ql/src/API Abuse/NoDisposeCallOnLocalIDisposable.ql b/csharp/ql/src/API Abuse/NoDisposeCallOnLocalIDisposable.ql index 3fc8e07f6afe..e99647939c38 100644 --- a/csharp/ql/src/API Abuse/NoDisposeCallOnLocalIDisposable.ql +++ b/csharp/ql/src/API Abuse/NoDisposeCallOnLocalIDisposable.ql @@ -59,7 +59,7 @@ module DisposeCallOnLocalIDisposableConfig implements DataFlow::ConfigSig { exists(UsingStmt us | us.getAnExpr() = e) or // Foreach calls Dispose - exists(ForeachStmt fs | fs.getIterableExpr() = e) + exists(ForEachStmt fs | fs.getIterableExpr() = e) or // As are disposables on which the Dispose method is called explicitly exists(MethodCall mc | diff --git a/csharp/ql/src/Dead Code/DeadStoreOfLocal.ql b/csharp/ql/src/Dead Code/DeadStoreOfLocal.ql index 20f522e7b484..af6aa286ef07 100644 --- a/csharp/ql/src/Dead Code/DeadStoreOfLocal.ql +++ b/csharp/ql/src/Dead Code/DeadStoreOfLocal.ql @@ -31,7 +31,7 @@ class RelevantDefinition extends AssignableDefinition { any(LocalVariableDeclExpr lvde | lvde = any(SpecificCatchClause scc).getVariableDeclExpr() or - lvde = any(ForeachStmt fs).getVariableDeclExpr() and + lvde = any(ForEachStmt fs).getVariableDeclExpr() and not lvde.getName() = "_" ) or diff --git a/csharp/ql/src/Language Abuse/ForeachCapture.ql b/csharp/ql/src/Language Abuse/ForeachCapture.ql index 2ed24b42eba9..77226bdead79 100644 --- a/csharp/ql/src/Language Abuse/ForeachCapture.ql +++ b/csharp/ql/src/Language Abuse/ForeachCapture.ql @@ -23,17 +23,17 @@ predicate lambdaCaptures(AnonymousFunctionExpr lambda, Variable v) { exists(VariableAccess va | va.getEnclosingCallable() = lambda | va.getTarget() = v) } -predicate lambdaCapturesLoopVariable(AnonymousFunctionExpr lambda, ForeachStmt loop, Variable v) { +predicate lambdaCapturesLoopVariable(AnonymousFunctionExpr lambda, ForEachStmt loop, Variable v) { lambdaCaptures(lambda, v) and - inForeachStmtBody(loop, lambda) and + inForEachStmtBody(loop, lambda) and loop.getVariable() = v } -predicate inForeachStmtBody(ForeachStmt loop, Element e) { +predicate inForEachStmtBody(ForEachStmt loop, Element e) { e = loop.getBody() or exists(Element mid | - inForeachStmtBody(loop, mid) and + inForEachStmtBody(loop, mid) and e = mid.getAChild() ) } @@ -53,7 +53,7 @@ module LambdaDataFlow { exists(DataFlow::Node sink | flow(DataFlow::exprNode(lambda), sink) | storage = getAssignmentTarget(sink.asExpr()) ) and - exists(ForeachStmt loop | lambdaCapturesLoopVariable(lambda, loop, loopVar) | + exists(ForEachStmt loop | lambdaCapturesLoopVariable(lambda, loop, loopVar) | not declaredInsideLoop(loop, storage) ) } @@ -103,9 +103,9 @@ Element getCollectionAssignmentTarget(Expr e) { } // Variable v is declared inside the loop body -predicate declaredInsideLoop(ForeachStmt loop, LocalVariable v) { +predicate declaredInsideLoop(ForEachStmt loop, LocalVariable v) { exists(LocalVariableDeclStmt decl | decl.getVariableDeclExpr(_).getVariable() = v | - inForeachStmtBody(loop, decl) + inForEachStmtBody(loop, decl) ) } diff --git a/csharp/ql/src/Likely Bugs/Collections/WriteOnlyContainer.ql b/csharp/ql/src/Likely Bugs/Collections/WriteOnlyContainer.ql index 046099213cc6..df382ee4b9f7 100644 --- a/csharp/ql/src/Likely Bugs/Collections/WriteOnlyContainer.ql +++ b/csharp/ql/src/Likely Bugs/Collections/WriteOnlyContainer.ql @@ -28,7 +28,7 @@ where any(LocalVariableDeclAndInitExpr ass | ass.getRightOperand() instanceof ObjectCreation) .getLeftOperand() ) and - not v = any(ForeachStmt fs).getVariable() and + not v = any(ForEachStmt fs).getVariable() and not v = any(BindingPatternExpr vpe).getVariableDeclExpr().getVariable() and not v = any(Attribute a).getTarget() select v, "The contents of this container are never accessed." diff --git a/csharp/ql/src/Likely Bugs/Statements/UseBraces.ql b/csharp/ql/src/Likely Bugs/Statements/UseBraces.ql index 39f0bfddf6aa..ccac74250dab 100644 --- a/csharp/ql/src/Likely Bugs/Statements/UseBraces.ql +++ b/csharp/ql/src/Likely Bugs/Statements/UseBraces.ql @@ -36,7 +36,7 @@ class IfThenElseStmt extends IfStmt { Stmt getTrailingBody(Stmt s) { result = s.(ForStmt).getBody() or - result = s.(ForeachStmt).getBody() or + result = s.(ForEachStmt).getBody() or result = s.(WhileStmt).getBody() or result = s.(IfThenStmt).getThen() or result = s.(IfThenElseStmt).getElse() diff --git a/csharp/ql/src/Linq/BadMultipleIteration.ql b/csharp/ql/src/Linq/BadMultipleIteration.ql index 0f9e335e2251..7de0d7f1b6d8 100644 --- a/csharp/ql/src/Linq/BadMultipleIteration.ql +++ b/csharp/ql/src/Linq/BadMultipleIteration.ql @@ -38,7 +38,7 @@ predicate likelyNonRepeatableSequence(IEnumerableSequence seq) { /** An access to an enumerable sequence that potentially consumes sequence elements. */ predicate potentiallyConsumingAccess(VariableAccess va) { - exists(ForeachStmt fes | va = fes.getIterableExpr()) + exists(ForEachStmt fes | va = fes.getIterableExpr()) or exists(MethodCall mc | va = mc.getArgument(0) and diff --git a/csharp/ql/src/Linq/MissedAllOpportunity.ql b/csharp/ql/src/Linq/MissedAllOpportunity.ql index 1c03372d23b6..9e84c280c3f5 100644 --- a/csharp/ql/src/Linq/MissedAllOpportunity.ql +++ b/csharp/ql/src/Linq/MissedAllOpportunity.ql @@ -32,7 +32,7 @@ import Linq.Helpers * bool allEven = lst.All(i => i % 2 == 0); */ -from ForeachStmtGenericEnumerable fes +from ForEachStmtGenericEnumerable fes where missedAllOpportunity(fes) select fes, "This foreach loop looks as if it might be testing whether every sequence element satisfies a predicate - consider using '.All(...)'." diff --git a/csharp/ql/src/Linq/MissedCastOpportunity.ql b/csharp/ql/src/Linq/MissedCastOpportunity.ql index d40009e24c89..66e920f740e1 100644 --- a/csharp/ql/src/Linq/MissedCastOpportunity.ql +++ b/csharp/ql/src/Linq/MissedCastOpportunity.ql @@ -15,7 +15,7 @@ import csharp import Linq.Helpers -from ForeachStmtEnumerable fes, LocalVariableDeclStmt s +from ForEachStmtEnumerable fes, LocalVariableDeclStmt s where missedCastOpportunity(fes, s) select fes, "This foreach loop immediately $@ - consider casting the sequence explicitly using '.Cast(...)'.", diff --git a/csharp/ql/src/Linq/MissedOfTypeOpportunity.ql b/csharp/ql/src/Linq/MissedOfTypeOpportunity.ql index a4c8dff4b538..d80f9d983a7f 100644 --- a/csharp/ql/src/Linq/MissedOfTypeOpportunity.ql +++ b/csharp/ql/src/Linq/MissedOfTypeOpportunity.ql @@ -15,7 +15,7 @@ import csharp import Linq.Helpers -from ForeachStmtEnumerable fes, LocalVariableDeclStmt s +from ForEachStmtEnumerable fes, LocalVariableDeclStmt s where missedOfTypeOpportunity(fes, s) select fes, "This foreach loop immediately uses 'as' to $@ - consider using '.OfType(...)' instead.", s, diff --git a/csharp/ql/src/Linq/MissedSelectOpportunity.ql b/csharp/ql/src/Linq/MissedSelectOpportunity.ql index 8ea2a1c11d73..9e3571f36d54 100644 --- a/csharp/ql/src/Linq/MissedSelectOpportunity.ql +++ b/csharp/ql/src/Linq/MissedSelectOpportunity.ql @@ -22,7 +22,7 @@ predicate oversized(LocalVariableDeclStmt s) { ) } -from ForeachStmtGenericEnumerable fes, LocalVariableDeclStmt s +from ForEachStmtGenericEnumerable fes, LocalVariableDeclStmt s where missedSelectOpportunity(fes, s) and not oversized(s) diff --git a/csharp/ql/src/Linq/MissedWhereOpportunity.ql b/csharp/ql/src/Linq/MissedWhereOpportunity.ql index 62b34b93305a..e9e82f79baf3 100644 --- a/csharp/ql/src/Linq/MissedWhereOpportunity.ql +++ b/csharp/ql/src/Linq/MissedWhereOpportunity.ql @@ -14,7 +14,7 @@ import csharp import Linq.Helpers -from ForeachStmtGenericEnumerable fes, IfStmt is +from ForEachStmtGenericEnumerable fes, IfStmt is where missedWhereOpportunity(fes, is) and not missedAllOpportunity(fes) diff --git a/csharp/ql/test/library-tests/csharp7/ForEach.ql b/csharp/ql/test/library-tests/csharp7/ForEach.ql index e42b6f47372f..5391d6b96f8a 100644 --- a/csharp/ql/test/library-tests/csharp7/ForEach.ql +++ b/csharp/ql/test/library-tests/csharp7/ForEach.ql @@ -1,5 +1,5 @@ import csharp -from ForeachStmt stmt, int i +from ForEachStmt stmt, int i select stmt, i, stmt.getVariableDeclExpr(i), stmt.getVariable(i), stmt.getIterableExpr(), stmt.getBody() diff --git a/csharp/ql/test/library-tests/csharp9/foreach.ql b/csharp/ql/test/library-tests/csharp9/foreach.ql index 343ecc556ab8..eae1f44fdd25 100644 --- a/csharp/ql/test/library-tests/csharp9/foreach.ql +++ b/csharp/ql/test/library-tests/csharp9/foreach.ql @@ -4,11 +4,11 @@ private string getLocation(Member m) { if m.fromSource() then result = m.getALocation().(SourceLocation).toString() else result = "-" } -private string getIsAsync(ForeachStmt f) { +private string getIsAsync(ForEachStmt f) { if f.isAsync() then result = "async" else result = "sync" } -from ForeachStmt f +from ForEachStmt f select f, f.getElementType().toString(), getIsAsync(f), f.getGetEnumerator().getDeclaringType().getFullyQualifiedNameDebug(), getLocation(f.getGetEnumerator()), f.getCurrent().getDeclaringType().getFullyQualifiedNameDebug(), diff --git a/csharp/ql/test/library-tests/statements/Foreach1.ql b/csharp/ql/test/library-tests/statements/Foreach1.ql index 3f70956d9ca6..6f52f23fd988 100644 --- a/csharp/ql/test/library-tests/statements/Foreach1.ql +++ b/csharp/ql/test/library-tests/statements/Foreach1.ql @@ -4,5 +4,5 @@ import csharp -where forall(ForeachStmt s | exists(s.getBody()) and exists(s.getIterableExpr())) +where forall(ForEachStmt s | exists(s.getBody()) and exists(s.getIterableExpr())) select 1 diff --git a/csharp/ql/test/library-tests/statements/Foreach3.ql b/csharp/ql/test/library-tests/statements/Foreach3.ql index 9dfe5ba6a4e9..2ff6a0cdbe68 100644 --- a/csharp/ql/test/library-tests/statements/Foreach3.ql +++ b/csharp/ql/test/library-tests/statements/Foreach3.ql @@ -4,7 +4,7 @@ import csharp -from Method m, ForeachStmt s +from Method m, ForEachStmt s where m.getName() = "MainForeach" and s.getEnclosingCallable() = m and From a5e733cf72e7fb3996e098e059b83fe2b62386ab Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Wed, 2 Sep 2026 12:49:02 +0200 Subject: [PATCH 0649/2098] C#: Adjust printAst expected output. --- csharp/ql/test/library-tests/csharp7/PrintAst.expected | 6 +++--- csharp/ql/test/library-tests/csharp8/PrintAst.expected | 2 +- csharp/ql/test/library-tests/csharp9/PrintAst.expected | 8 ++++---- .../ql/test/library-tests/definitions/PrintAst.expected | 2 +- csharp/ql/test/library-tests/methods/PrintAst.expected | 2 +- csharp/ql/test/library-tests/statements/PrintAst.expected | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/csharp/ql/test/library-tests/csharp7/PrintAst.expected b/csharp/ql/test/library-tests/csharp7/PrintAst.expected index 47ab207bb556..6ac8d9d92ac7 100644 --- a/csharp/ql/test/library-tests/csharp7/PrintAst.expected +++ b/csharp/ql/test/library-tests/csharp7/PrintAst.expected @@ -864,19 +864,19 @@ CSharp7.cs: # 283| -1: [ParameterAccess] access to parameter item # 283| 1: [PropertyCall] access to property Value # 283| -1: [ParameterAccess] access to parameter item -# 285| 2: [ForeachStmt] foreach (... ... in ...) ... +# 285| 2: [ForEachStmt] foreach (... ... in ...) ... # 285| 0: [TupleExpr] (..., ...) # 285| 0: [LocalVariableDeclExpr] Int32 a # 285| 1: [LocalVariableDeclExpr] String b # 285| 1: [LocalVariableAccess] access to local variable list # 285| 2: [BlockStmt] {...} -# 287| 3: [ForeachStmt] foreach (... ... in ...) ... +# 287| 3: [ForEachStmt] foreach (... ... in ...) ... # 287| 0: [TupleExpr] (..., ...) # 287| 0: [LocalVariableDeclExpr] Int32 a # 287| 1: [LocalVariableDeclExpr] String b # 287| 1: [LocalVariableAccess] access to local variable list # 287| 2: [BlockStmt] {...} -# 289| 4: [ForeachStmt] foreach (... ... in ...) ... +# 289| 4: [ForEachStmt] foreach (... ... in ...) ... # 289| 0: [TupleExpr] (..., ...) # 289| 0: [LocalVariableDeclExpr] Int32 a # 289| 1: [LocalVariableDeclExpr] String b diff --git a/csharp/ql/test/library-tests/csharp8/PrintAst.expected b/csharp/ql/test/library-tests/csharp8/PrintAst.expected index f5eb7caab572..4efcaad323ac 100644 --- a/csharp/ql/test/library-tests/csharp8/PrintAst.expected +++ b/csharp/ql/test/library-tests/csharp8/PrintAst.expected @@ -33,7 +33,7 @@ AsyncStreams.cs: # 15| 7: [Method] F # 15| -1: [TypeMention] Void # 16| 4: [BlockStmt] {...} -# 17| 0: [ForeachStmt] foreach (... ... in ...) ... +# 17| 0: [ForEachStmt] foreach (... ... in ...) ... # 17| 0: [LocalVariableDeclExpr] Int32 item # 17| 0: [TypeMention] int # 17| 1: [MethodCall] call to method Items diff --git a/csharp/ql/test/library-tests/csharp9/PrintAst.expected b/csharp/ql/test/library-tests/csharp9/PrintAst.expected index 459349fb9fc8..f86c98e4c6cf 100644 --- a/csharp/ql/test/library-tests/csharp9/PrintAst.expected +++ b/csharp/ql/test/library-tests/csharp9/PrintAst.expected @@ -241,7 +241,7 @@ ForeachExtension.cs: # 23| 0: [TypeMention] Enumerable # 23| 0: [IntLiteral] 0 # 23| 1: [IntLiteral] 10 -# 24| 1: [ForeachStmt] foreach (... ... in ...) ... +# 24| 1: [ForEachStmt] foreach (... ... in ...) ... # 24| 0: [LocalVariableDeclExpr] Int32 item # 24| 0: [TypeMention] int # 24| 1: [LocalVariableAccess] access to local variable enumerator1 @@ -252,17 +252,17 @@ ForeachExtension.cs: # 28| 1: [TypeMention] int # 28| 0: [LocalVariableAccess] access to local variable enumerator2 # 28| 1: [MethodCall] call to method GetAsyncEnumerator -# 29| 3: [ForeachStmt] foreach (... ... in ...) ... +# 29| 3: [ForEachStmt] foreach (... ... in ...) ... # 29| 0: [LocalVariableDeclExpr] Int32 item # 29| 0: [TypeMention] int # 29| 1: [LocalVariableAccess] access to local variable enumerator2 # 30| 2: [BlockStmt] {...} -# 33| 4: [ForeachStmt] foreach (... ... in ...) ... +# 33| 4: [ForEachStmt] foreach (... ... in ...) ... # 33| 0: [LocalVariableDeclExpr] Int32 item # 33| 0: [TypeMention] int # 33| 1: [IntLiteral] 42 # 34| 2: [BlockStmt] {...} -# 37| 5: [ForeachStmt] foreach (... ... in ...) ... +# 37| 5: [ForEachStmt] foreach (... ... in ...) ... # 37| 0: [LocalVariableDeclExpr] Int32 i # 37| 0: [TypeMention] int # 37| 1: [ArrayCreation] array creation of type Int32[] diff --git a/csharp/ql/test/library-tests/definitions/PrintAst.expected b/csharp/ql/test/library-tests/definitions/PrintAst.expected index 28196c75a857..fd9adbb2bff0 100644 --- a/csharp/ql/test/library-tests/definitions/PrintAst.expected +++ b/csharp/ql/test/library-tests/definitions/PrintAst.expected @@ -199,7 +199,7 @@ definitions.cs: # 86| 0: [LocalVariableDeclExpr] Exception e # 86| 0: [TypeMention] Exception # 87| 1: [BlockStmt] {...} -# 88| 0: [ForeachStmt] foreach (... ... in ...) ... +# 88| 0: [ForEachStmt] foreach (... ... in ...) ... # 88| 0: [LocalVariableDeclExpr] S1 s # 88| 0: [TypeMention] S1 # 88| 1: [ParameterAccess] access to parameter ss diff --git a/csharp/ql/test/library-tests/methods/PrintAst.expected b/csharp/ql/test/library-tests/methods/PrintAst.expected index 4810c6c0b5b7..f8a673575a12 100644 --- a/csharp/ql/test/library-tests/methods/PrintAst.expected +++ b/csharp/ql/test/library-tests/methods/PrintAst.expected @@ -323,7 +323,7 @@ methods.cs: # 127| 1: [StringLiteralUtf16] "22" # 127| 2: [StringLiteralUtf16] "333" # 127| 3: [StringLiteralUtf16] "4444" -# 128| 1: [ForeachStmt] foreach (... ... in ...) ... +# 128| 1: [ForEachStmt] foreach (... ... in ...) ... # 128| 0: [LocalVariableDeclExpr] String s # 128| 0: [TypeMention] string # 128| 1: [MethodCall] call to method Slice diff --git a/csharp/ql/test/library-tests/statements/PrintAst.expected b/csharp/ql/test/library-tests/statements/PrintAst.expected index 59af8ce4a2ea..7709f65b7c3c 100644 --- a/csharp/ql/test/library-tests/statements/PrintAst.expected +++ b/csharp/ql/test/library-tests/statements/PrintAst.expected @@ -357,7 +357,7 @@ statements.cs: # 139| -1: [TypeMention] String[] # 139| 1: [TypeMention] string # 140| 4: [BlockStmt] {...} -# 141| 0: [ForeachStmt] foreach (... ... in ...) ... +# 141| 0: [ForEachStmt] foreach (... ... in ...) ... # 141| 0: [LocalVariableDeclExpr] String s # 141| 0: [TypeMention] string # 141| 1: [ParameterAccess] access to parameter args @@ -501,7 +501,7 @@ statements.cs: # 192| 24: [Method] MainYield # 192| -1: [TypeMention] Void # 193| 4: [BlockStmt] {...} -# 194| 0: [ForeachStmt] foreach (... ... in ...) ... +# 194| 0: [ForEachStmt] foreach (... ... in ...) ... # 194| 0: [LocalVariableDeclExpr] Int32 x # 194| 0: [TypeMention] int # 194| 1: [MethodCall] call to method Range From ee6a1798b5b4a4d8956330b0dbf2cfd480eb426b Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Tue, 1 Sep 2026 11:09:36 +0200 Subject: [PATCH 0650/2098] C#: Add explicit class with dependabot configuration. --- .../DependabotProxy.cs | 24 +++++++------------ .../DependabotProxyConfiguration.cs | 15 ++++++++++++ .../IDependabotProxyConfiguration.cs | 21 ++++++++++++++++ 3 files changed, 44 insertions(+), 16 deletions(-) create mode 100644 csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxyConfiguration.cs create mode 100644 csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDependabotProxyConfiguration.cs diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs index 08b142219a97..7166d18c6694 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs @@ -39,23 +39,18 @@ public record class RegistryConfig(string Type, string URL); // instance of `DependabotProxy` on those platforms. if (SystemBuildActions.Instance.IsWindows() || SystemBuildActions.Instance.IsMacOs()) return null; - // Obtain and store the address of the Dependabot proxy, if available. - var host = Environment.GetEnvironmentVariable(EnvironmentVariableNames.ProxyHost); - var port = Environment.GetEnvironmentVariable(EnvironmentVariableNames.ProxyPort); + var proxyConfig = new DependabotProxyConfiguration(); - if (string.IsNullOrWhiteSpace(host) || string.IsNullOrWhiteSpace(port)) + if (string.IsNullOrWhiteSpace(proxyConfig.Host) || string.IsNullOrWhiteSpace(proxyConfig.Port)) { logger.LogInfo("No Dependabot proxy credentials are configured."); return null; } - var result = new DependabotProxy(host, port); + var result = new DependabotProxy(proxyConfig.Host, proxyConfig.Port); logger.LogInfo($"Dependabot proxy configured at {result.Address}"); - // Obtain and store the proxy's certificate, if available. - var cert = Environment.GetEnvironmentVariable(EnvironmentVariableNames.ProxyCertificate); - - if (!string.IsNullOrWhiteSpace(cert)) + if (!string.IsNullOrWhiteSpace(proxyConfig.Certificate)) { var certDirPath = new DirectoryInfo(Path.Join(tempWorkingDirectory.DirInfo.FullName, ".dependabot-proxy")); Directory.CreateDirectory(certDirPath.FullName); @@ -64,24 +59,21 @@ public record class RegistryConfig(string Type, string URL); var certFile = new FileInfo(result.CertificatePath); using var writer = certFile.CreateText(); - writer.Write(cert); + writer.Write(proxyConfig.Certificate); writer.Close(); logger.LogInfo($"Stored Dependabot proxy certificate at {result.CertificatePath}"); - result.Certificate = X509Certificate2.CreateFromPem(cert); + result.Certificate = X509Certificate2.CreateFromPem(proxyConfig.Certificate); } - // Try to obtain the list of private registry URLs. - var registryURLs = Environment.GetEnvironmentVariable(EnvironmentVariableNames.ProxyURLs); - - if (!string.IsNullOrWhiteSpace(registryURLs)) + if (!string.IsNullOrWhiteSpace(proxyConfig.RegistryURLs)) { try { // The value of the environment variable should be a JSON array of objects, such as: // [ { "type": "nuget_feed", "url": "https://nuget.pkg.github.com/org/index.json" } ] - var array = JsonConvert.DeserializeObject>(registryURLs); + var array = JsonConvert.DeserializeObject>(proxyConfig.RegistryURLs); if (array is not null) { foreach (RegistryConfig config in array) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxyConfiguration.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxyConfiguration.cs new file mode 100644 index 000000000000..2d81f94aea2c --- /dev/null +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxyConfiguration.cs @@ -0,0 +1,15 @@ +using System; + +namespace Semmle.Extraction.CSharp.DependencyFetching +{ + public class DependabotProxyConfiguration : IDependabotProxyConfiguration + { + public string? Host { get; } = Environment.GetEnvironmentVariable(EnvironmentVariableNames.ProxyHost); + + public string? Port { get; } = Environment.GetEnvironmentVariable(EnvironmentVariableNames.ProxyPort); + + public string? Certificate { get; } = Environment.GetEnvironmentVariable(EnvironmentVariableNames.ProxyCertificate); + + public string? RegistryURLs { get; } = Environment.GetEnvironmentVariable(EnvironmentVariableNames.ProxyURLs); + } +} diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDependabotProxyConfiguration.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDependabotProxyConfiguration.cs new file mode 100644 index 000000000000..c67ee4fc39df --- /dev/null +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDependabotProxyConfiguration.cs @@ -0,0 +1,21 @@ +using System; + +namespace Semmle.Extraction.CSharp.DependencyFetching +{ + public interface IDependabotProxyConfiguration + { + // The host of the Dependabot proxy, if available. + string? Host { get; } + + // The port of the Dependabot proxy, if available. + string? Port { get; } + + // The certificate of the Dependabot proxy, if available. + string? Certificate { get; } + + // The list of package registries that are configured for the proxy, if any. + // The value of the environment variable should be a JSON array of objects, such as: + // [ { "type": "nuget_feed", "url": "https://nuget.pkg.github.com/org/index.json" } ] + string? RegistryURLs { get; } + } +} From 68d8351fee65443e4ab87ec2a840c455e183adee Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Tue, 1 Sep 2026 12:42:03 +0200 Subject: [PATCH 0651/2098] C#: Move some logic into the DependabotProxy object construction. --- .../DependabotProxy.cs | 90 +++++++++---------- 1 file changed, 43 insertions(+), 47 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs index 7166d18c6694..c298877da8a6 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs @@ -18,76 +18,54 @@ public class DependabotProxy : IDependabotProxy /// The URL of the package registry. public record class RegistryConfig(string Type, string URL); - private readonly string host; - private readonly string port; - public string Address { get; } - public HashSet RegistryURLs { get; } + public HashSet RegistryURLs { get; } = []; public string? CertificatePath { get; private set; } public X509Certificate2? Certificate { get; private set; } - internal static IDependabotProxy? GetDependabotProxy( - ILogger logger, IDiagnosticsWriter diagnosticsWriter, TemporaryDirectory tempWorkingDirectory) + private DependabotProxy(IDependabotProxyConfiguration config, ILogger logger, TemporaryDirectory tempWorkingDirectory) { - // Setting HTTP(S)_PROXY and SSL_CERT_FILE have no effect on Windows or macOS, - // but we would still end up using the Dependabot proxy to check for feed reachability. - // This would result in us discovering that the feeds are reachable, but `dotnet` would - // fail to connect to them. To prevent this from happening, we do not initialise an - // instance of `DependabotProxy` on those platforms. - if (SystemBuildActions.Instance.IsWindows() || SystemBuildActions.Instance.IsMacOs()) return null; - - var proxyConfig = new DependabotProxyConfiguration(); + Address = $"http://{config.Host}:{config.Port}"; - if (string.IsNullOrWhiteSpace(proxyConfig.Host) || string.IsNullOrWhiteSpace(proxyConfig.Port)) - { - logger.LogInfo("No Dependabot proxy credentials are configured."); - return null; - } - - var result = new DependabotProxy(proxyConfig.Host, proxyConfig.Port); - logger.LogInfo($"Dependabot proxy configured at {result.Address}"); - - if (!string.IsNullOrWhiteSpace(proxyConfig.Certificate)) + if (!string.IsNullOrWhiteSpace(config.Certificate)) { var certDirPath = new DirectoryInfo(Path.Join(tempWorkingDirectory.DirInfo.FullName, ".dependabot-proxy")); Directory.CreateDirectory(certDirPath.FullName); - result.CertificatePath = Path.Join(certDirPath.FullName, "proxy.crt"); - var certFile = new FileInfo(result.CertificatePath); + CertificatePath = Path.Join(certDirPath.FullName, "proxy.crt"); + var certFile = new FileInfo(CertificatePath); using var writer = certFile.CreateText(); - writer.Write(proxyConfig.Certificate); + writer.Write(config.Certificate); writer.Close(); - logger.LogInfo($"Stored Dependabot proxy certificate at {result.CertificatePath}"); + logger.LogInfo($"Stored Dependabot proxy certificate at {CertificatePath}"); - result.Certificate = X509Certificate2.CreateFromPem(proxyConfig.Certificate); + Certificate = X509Certificate2.CreateFromPem(config.Certificate); } - if (!string.IsNullOrWhiteSpace(proxyConfig.RegistryURLs)) + if (!string.IsNullOrWhiteSpace(config.RegistryURLs)) { try { - // The value of the environment variable should be a JSON array of objects, such as: - // [ { "type": "nuget_feed", "url": "https://nuget.pkg.github.com/org/index.json" } ] - var array = JsonConvert.DeserializeObject>(proxyConfig.RegistryURLs); + var array = JsonConvert.DeserializeObject>(config.RegistryURLs); if (array is not null) { - foreach (RegistryConfig config in array) + foreach (RegistryConfig registry in array) { // The array contains all configured private registries, not just ones for C#. // We ignore the non-C# ones here. - if (!config.Type.Equals("nuget_feed")) + if (!registry.Type.Equals("nuget_feed")) { - logger.LogDebug($"Ignoring registry at '{config.URL}' since it is not of type 'nuget_feed'."); + logger.LogDebug($"Ignoring registry at '{registry.URL}' since it is not of type 'nuget_feed'."); continue; } - logger.LogInfo($"Found private registry at '{config.URL}'"); - result.RegistryURLs.Add(config.URL); + logger.LogInfo($"Found private registry at '{registry.URL}'"); + RegistryURLs.Add(registry.URL); } } } @@ -96,6 +74,32 @@ public record class RegistryConfig(string Type, string URL); logger.LogError($"Unable to parse '{EnvironmentVariableNames.ProxyURLs}': {ex.Message}"); } } + } + + + internal static IDependabotProxy? GetDependabotProxy( + ILogger logger, IDiagnosticsWriter diagnosticsWriter, TemporaryDirectory tempWorkingDirectory) + { + // Setting HTTP(S)_PROXY and SSL_CERT_FILE have no effect on Windows or macOS, + // but we would still end up using the Dependabot proxy to check for feed reachability. + // This would result in us discovering that the feeds are reachable, but `dotnet` would + // fail to connect to them. To prevent this from happening, we do not initialise an + // instance of `DependabotProxy` on those platforms. + if (SystemBuildActions.Instance.IsWindows() || SystemBuildActions.Instance.IsMacOs()) + { + return null; + } + + var proxyConfig = new DependabotProxyConfiguration(); + + if (string.IsNullOrWhiteSpace(proxyConfig.Host) || string.IsNullOrWhiteSpace(proxyConfig.Port)) + { + logger.LogInfo("No Dependabot proxy credentials are configured."); + return null; + } + + var result = new DependabotProxy(proxyConfig, logger, tempWorkingDirectory); + logger.LogInfo($"Dependabot proxy configured at {result.Address}"); // Emit a diagnostic for the discovered private registries, so that it is easy // for users to see that they were picked up. @@ -117,17 +121,9 @@ public record class RegistryConfig(string Type, string URL); return result; } - private DependabotProxy(string host, string port) - { - this.host = host; - this.port = port; - this.Address = $"http://{this.host}:{this.port}"; - this.RegistryURLs = new HashSet(); - } - public void Dispose() { - this.Certificate?.Dispose(); + Certificate?.Dispose(); } } } From b3ae7ff0d5af8a093605859c2d2810c526c9467c Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Tue, 1 Sep 2026 14:48:29 +0200 Subject: [PATCH 0652/2098] C#: Minor re-write to enable OS independant testing of dependabot proxy object creation. --- .../DependabotProxy.cs | 10 ++++++---- .../DependencyManager.cs | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs index c298877da8a6..a80593f85a55 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs @@ -76,9 +76,7 @@ private DependabotProxy(IDependabotProxyConfiguration config, ILogger logger, Te } } - - internal static IDependabotProxy? GetDependabotProxy( - ILogger logger, IDiagnosticsWriter diagnosticsWriter, TemporaryDirectory tempWorkingDirectory) + internal static IDependabotProxy? Make(ILogger logger, IDiagnosticsWriter diagnosticsWriter, TemporaryDirectory tempWorkingDirectory) { // Setting HTTP(S)_PROXY and SSL_CERT_FILE have no effect on Windows or macOS, // but we would still end up using the Dependabot proxy to check for feed reachability. @@ -90,8 +88,12 @@ private DependabotProxy(IDependabotProxyConfiguration config, ILogger logger, Te return null; } - var proxyConfig = new DependabotProxyConfiguration(); + return MakeAux(new DependabotProxyConfiguration(), logger, diagnosticsWriter, tempWorkingDirectory); + } + internal static IDependabotProxy? MakeAux( + IDependabotProxyConfiguration proxyConfig, ILogger logger, IDiagnosticsWriter diagnosticsWriter, TemporaryDirectory tempWorkingDirectory) + { if (string.IsNullOrWhiteSpace(proxyConfig.Host) || string.IsNullOrWhiteSpace(proxyConfig.Port)) { logger.LogInfo("No Dependabot proxy credentials are configured."); diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs index 707fabbf83fb..a985947c0c12 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs @@ -106,7 +106,7 @@ void exitCallback(int ret, string msg, bool silent) return BuildScript.Success; }).Run(SystemBuildActions.Instance, startCallback, exitCallback); - dependabotProxy = DependabotProxy.GetDependabotProxy(logger, diagnosticsWriter, tempWorkingDirectory); + dependabotProxy = DependabotProxy.Make(logger, diagnosticsWriter, tempWorkingDirectory); try { From 8583ecc639eb1a199e0f13b3e4298e997320e26c Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Tue, 1 Sep 2026 14:48:58 +0200 Subject: [PATCH 0653/2098] C#: Add DependabotProxy unit-tests. --- .../DependabotProxy.cs | 185 ++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100644 csharp/extractor/Semmle.Extraction.Tests/DependabotProxy.cs diff --git a/csharp/extractor/Semmle.Extraction.Tests/DependabotProxy.cs b/csharp/extractor/Semmle.Extraction.Tests/DependabotProxy.cs new file mode 100644 index 000000000000..7aadae00b4ea --- /dev/null +++ b/csharp/extractor/Semmle.Extraction.Tests/DependabotProxy.cs @@ -0,0 +1,185 @@ +using Xunit; +using System; +using System.IO; +using Semmle.Extraction.CSharp.DependencyFetching; +using Semmle.Util; + +namespace Semmle.Extraction.Tests +{ + public class DependabotConfigurationStub : IDependabotProxyConfiguration + { + public string? Host { get; set; } + public string? Port { get; set; } + public string? Certificate { get; set; } + public string? RegistryURLs { get; set; } + } + + public class DiagnosticsWriterStub : IDiagnosticsWriter + { + public void AddEntry(Semmle.Util.DiagnosticMessage entry) { } + public void Dispose() { } + } + + public class DependabotProxyTests + { + private static TemporaryDirectory MakeTemporaryDirectory() + { + var tmp = Path.Join(Path.GetTempPath(), "DependabotProxyTests", Guid.NewGuid().ToString()); + return new TemporaryDirectory(tmp, "testing", new LoggerStub()); + } + + [Fact] + public void TestDependabotProxyCreation1() + { + // Setup + var config = new DependabotConfigurationStub + { + Host = "my.private.server", + Port = "", + }; + + // Execute + using var tempWorkingDirectory = MakeTemporaryDirectory(); + using var proxy = DependabotProxy.MakeAux(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); + + // Verify + Assert.Null(proxy); + } + + [Fact] + public void TestDependabotProxyCreation2() + { + // Setup + var config = new DependabotConfigurationStub + { + Port = "8080", + }; + + // Execute + using var tempWorkingDirectory = MakeTemporaryDirectory(); + using var proxy = DependabotProxy.MakeAux(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); + + // Verify + Assert.Null(proxy); + } + + private const string ExampleCertificate = """ + -----BEGIN CERTIFICATE----- + MIIFJTCCAw2gAwIBAgIUDImU6YnuAqJ1QuRp+OpJQPnPu6wwDQYJKoZIhvcNAQEL + BQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTI2MDkwMTEyMjUzMVoXDTI3MDkw + MTEyMjUzMVowFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0BAQEF + AAOCAg8AMIICCgKCAgEAnlp7yQ1VuocMwIZWlCle3bEM86+1ED6BFfPFpIrRhfUT + c+5IvPng8TIZPO4mROp5G9YDZfOtXW2bwktyZNUhsBcxqUT1lmXit21vc5W9Gxx5 + 4G8nyF4/FcjFkmxkZifxiUCdBceDcE7+kx2itq/a7gLPlyTzvz5etu1nHEC3Jg/y + TVhAwdwysgAo9WymFCczDa2ga6nOPBOaxwLnoPl9041KSu5oIo9QC0Im+US1R18Q + /mXa+wkmjf+bYAkE/pZie8z8Q7h9yppTngGzkoDEebFYyaMr8MXlFdWS8f/eMwSp + iMFSsmlCqgUbA672APxzOcuSMMYrblzGkvZp23qbNjwQuQKlgAYBTSGltLv4U8JF + ePNcgDCY6RG55rNvF1gk1L2h25jcw1LX6fSvQGCOkzNmP03AhqZBUigO1Zt0zLwi + K4m0bH7nPLJFEN6tI3tybyZeC2RVyiSHvOkgx35Qj8RQ3XMVkImJNBYOMc2MkmMZ + ux6XMiHqXCON4zaWuWSovciZeMAQAspCrzVDLH6p2DWEfw/zDfQNU3iLk21sZGei + 0GKzs8zrxUcqOU9V4Cnm+7JJ6eqS72f1+wX0ROb3djC6KgCE/NaHqo4apiI3K+CH + T0rVRsJIHyT39YO1c1I1vhAKRSH5kQVe3qRfIT/AuaDLQY6WqGPzrOkem78sjtsC + AwEAAaNvMG0wHQYDVR0OBBYEFK0DP5MD6mhEcdcm346uwoPL2NFGMB8GA1UdIwQY + MBaAFK0DP5MD6mhEcdcm346uwoPL2NFGMA8GA1UdEwEB/wQFMAMBAf8wGgYDVR0R + BBMwEYIJbG9jYWxob3N0hwR/AAABMA0GCSqGSIb3DQEBCwUAA4ICAQCc5u8qNHHG + kONjfvq7Denq6QaEt4dZZDDODAvgUzZnnBjEhgrp7zfxtbyU/I0+DWnKQMKA9wPM + ktiFGd0lldEqoT+E7b0kN124lBGqZ/uYkhsWZ0Nc5dD+UB9oJszwOc5KNuquOnr6 + SbsfXVm4yLvVLXl67c0jvqvRgGg9/6Q6eMzohW6abMdbYhS28/DsJhCea/dV3+L1 + oVJ3O/A8e86m174ZCGE8s9UtnVYylBkAryDqaaQLdOBQ2C7uxdRAUNHSIa2JlqUc + 5+cod8lFojKb74hbgj6wkXyajsFttqYMh7CeASsnjZXDQ4MC3DqqDVCZuNvJ85Rt + ya3Tljp4Ln2AAAoKC3REUeU8PQqpk1vVIj0FSr3RvBTvwzyNfWFVqyBiXTATuV9n + 6AemqqXo5MZrHHeRaSTF8A70Jxbt9yx75xQxp3O3tdEL1Mxbl9X7c/hizOfLbeHH + IkAgzALQgi87Zbf2tOhRwH5NrB4ijyUUfovRHUwzsZOoTNqlVeNzbDRVbegx9V99 + /3vwNZgpStGl/JYhN9qY5hJKnC64ltMvuNGpLeJCGyFkrtFS8gKkgR7VKrGo7h3+ + Zo8rz8TFjP7RmSgQbrmFuPqNOGXzPidu2sMMFacKV7Rn4bEtHzW3MDhqVD4w/pGD + L0xpnWjzLYltVjz8mo07yh+zQ10G71Cl1w== + -----END CERTIFICATE----- + """; + + [Fact] + public void TestDependabotProxyCertificate() + { + // Setup + var config = new DependabotConfigurationStub + { + Port = "8080", + Host = "my.private.server", + Certificate = ExampleCertificate + }; + + // Execute + using var tempWorkingDirectory = MakeTemporaryDirectory(); + using var proxy = DependabotProxy.MakeAux(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); + + // Verify + Assert.NotNull(proxy); + Assert.Equal("http://my.private.server:8080", proxy.Address); + Assert.NotNull(proxy.Certificate); + Assert.NotNull(proxy.CertificatePath); + } + + [Fact] + public void TestDependabotRegistryUrls1() + { + // Setup + var config = new DependabotConfigurationStub + { + Port = "8080", + Host = "my.private.server", + RegistryURLs = "Doesn't parse as a JSON list" + }; + + // Execute + using var tempWorkingDirectory = MakeTemporaryDirectory(); + using var proxy = DependabotProxy.MakeAux(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); + + // Verify + Assert.NotNull(proxy); + Assert.Equal([], proxy.RegistryURLs); + } + + [Fact] + public void TestDependabotRegistryUrls2() + { + // Setup + var config = new DependabotConfigurationStub + { + Port = "8080", + Host = "my.private.server", + RegistryURLs = "[ { \"type\": \"nuget_feed\", \"url\": \"https://nuget.pkg.github.com/org/index.json\" } ]" + }; + + // Execute + using var tempWorkingDirectory = MakeTemporaryDirectory(); + using var proxy = DependabotProxy.MakeAux(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); + + // Verify + Assert.NotNull(proxy); + Assert.Equal([ + "https://nuget.pkg.github.com/org/index.json" + ], proxy.RegistryURLs); + } + + [Fact] + public void TestDependabotRegistryUrls3() + { + // Setup + var config = new DependabotConfigurationStub + { + Port = "8080", + Host = "my.private.server", + RegistryURLs = "[ { \"type\": \"nuget_feed\", \"url\": \"https://example.com/org/index.json\" }, { \"type\": \"wrong_type\", \"url\": \"https://nuget.pkg.github.com/org/index.json\" } ]" + }; + + // Execute + using var tempWorkingDirectory = MakeTemporaryDirectory(); + using var proxy = DependabotProxy.MakeAux(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); + + // Verify + Assert.NotNull(proxy); + Assert.Equal([ + "https://example.com/org/index.json" + ], proxy.RegistryURLs); + } + } +} From 9cc80de0719faa8ceb27f360d0fc5c6e53641112 Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 2 Sep 2026 13:59:28 +0200 Subject: [PATCH 0654/2098] unified: Merge Pattern and TypeExpr into Expr --- unified/extractor/ast_types.yml | 174 +++----- .../extractor/src/languages/swift/swift.rs | 181 ++++----- .../closures/closure-with-capture-list.output | 4 +- .../closure-with-explicit-parameters.output | 12 +- .../closure-with-shorthand-parameters.output | 2 +- .../closures/multi-statement-closure.output | 14 +- .../swift/collections/array-literal.output | 2 +- .../collections/dictionary-literal.output | 2 +- .../collections/dictionary-subscript.output | 2 +- .../empty-array-literal-with-type.output | 10 +- .../swift/collections/set-literal.output | 10 +- .../swift/collections/subscript-access.output | 2 +- .../swift/collections/tuple-literal.output | 2 +- .../collections/tuple-member-access.output | 2 +- ...g-modifier-does-not-leak-to-sibling.output | 8 +- .../swift/control-flow/fallthrough.output | 10 +- .../swift/control-flow/guard-let.output | 16 +- ...t-with-shadowing-in-condition-value.output | 2 +- .../if-let-optional-binding.output | 16 +- .../nested-enum-case-pattern.output | 40 +- .../switch-case-item-where-clauses.output | 7 +- .../control-flow/switch-statement.output | 10 +- .../switch-with-binding-pattern.output | 24 +- ...with-labeled-case-pattern-arguments.output | 34 +- .../control-flow/ternary-expression.output | 2 +- ...with-deeply-nested-path-three-parts.output | 2 +- .../import-with-dotted-path-two-parts.output | 2 +- .../scoped-import-uses-name-pattern.output | 2 +- .../simple-import-with-single-name.output | 2 +- .../expressions/array-type-constructor.output | 32 +- .../expressions/array-type-metatype.output | 14 +- .../expressions/consume-expression.output | 4 +- .../swift/expressions/copy-expression.output | 4 +- .../generic-specialization-expression.output | 10 +- .../expressions/key-path-expression.output | 2 +- .../functions/call-with-inout-argument.output | 4 +- ...onstructor-call-with-type-arguments.output | 10 +- ...nction-with-default-parameter-value.output | 6 +- .../function-with-inout-parameter.output | 2 +- .../function-with-named-parameters.output | 6 +- ...ion-with-parameters-and-return-type.output | 16 +- .../swift/functions/generic-function.output | 10 +- .../swift/functions/generic-type-alias.output | 16 +- .../leading-dot-expression-call.output | 2 +- .../leading-dot-expression-value.output | 2 +- .../functions/nested-function-type.output | 50 +-- .../swift/functions/variadic-function.output | 10 +- .../swift/literals/line-magic-literal.output | 2 +- .../swift/loops/break-and-continue.output | 2 +- .../loops/for-in-over-array-literal.output | 2 +- .../swift/loops/for-in-over-range.output | 2 +- .../loops/for-in-with-where-clause.output | 2 +- .../operators/custom-postfix-operator.output | 2 +- .../swift/operators/partial-range-from.output | 2 +- ...solved-operator-sequence-with-casts.output | 12 +- ...lved-operator-sequence-with-ternary.output | 28 +- .../unresolved-operator-sequence.output | 12 +- .../catch-where-clauses.output | 4 +- .../optionals-and-errors/force-unwrap.output | 2 +- .../nil-coalescing.output | 2 +- .../optional-chaining.output | 2 +- .../optional-enum-case-binding.output | 26 +- .../optional-type-annotation.output | 10 +- .../throwing-function.output | 4 +- .../try-expression-2.output | 2 +- .../try-expression.output | 2 +- ...er-does-not-leak-into-accessor-body.output | 10 +- .../swift/types/class-inheritance.output | 4 +- .../swift/types/class-with-initializer.output | 12 +- .../swift/types/class-with-method.output | 2 +- .../class-with-multiple-base-types.output | 8 +- .../types/class-with-stored-properties.output | 12 +- .../swift/types/computed-property.output | 16 +- .../types/constructor-with-parameters.output | 12 +- .../types/enum-with-associated-values.output | 12 +- .../corpus/swift/types/enum-with-cases.output | 8 +- ...separated-cases-chained-declaration.output | 8 +- .../tests/corpus/swift/types/extension.output | 4 +- ...tion-type-with-convention-attribute.output | 2 +- ...nction-type-with-sendable-attribute.output | 2 +- ...ic-class-parameters-and-constraints.output | 20 +- .../swift/types/generic-type-arguments.output | 18 +- .../swift/types/inline-array-type.output | 2 +- .../swift/types/noncopyable-type.output | 6 +- .../property-with-getter-and-setter.output | 10 +- ...nd-read-write-property-requirements.output | 12 +- .../corpus/swift/types/qualified-type.output | 30 +- .../tests/corpus/swift/types/struct.output | 12 +- ...fier-does-not-leak-into-initializer.output | 8 +- .../corpus/swift/variables/let-binding.output | 2 +- .../variables/let-with-type-annotation.output | 6 +- .../multiple-bindings-on-one-line.output | 4 +- ...y-with-willset-and-didset-observers.output | 6 +- .../tuple-destructuring-binding.output | 14 +- .../corpus/swift/variables/var-binding.output | 2 +- .../variables/var-without-initialiser.output | 6 +- .../ql/lib/codeql/unified/internal/Ast.qll | 375 +++--------------- .../unified/internal/ControlFlowGraph.qll | 1 - .../lib/codeql/unified/internal/FacadeAst.qll | 10 - .../unified/internal/LocalNameBinding.qll | 37 +- .../unified/internal/StaticNameBinding.qll | 12 +- unified/ql/lib/unified.dbscheme | 227 +++-------- .../library-tests/BasicTest/test.expected | 62 +++ .../ql/test/library-tests/BasicTest/test.ql | 4 + 104 files changed, 741 insertions(+), 1173 deletions(-) diff --git a/unified/extractor/ast_types.yml b/unified/extractor/ast_types.yml index dd17a9d584bf..167829166795 100644 --- a/unified/extractor/ast_types.yml +++ b/unified/extractor/ast_types.yml @@ -1,6 +1,7 @@ supertypes: expr: - name_expr + - named_pattern - int_literal - float_literal - boolean_literal @@ -33,25 +34,16 @@ supertypes: - switch_expr - unresolved_operator_sequence - unsupported_node - - pattern - expr_or_type: - - expr - - type_expr + - or_pattern + - conditional_pattern + - bulk_importing_pattern + - generic_type_expr + - inferred_type_expr # An element of an `unresolved_operator_sequence`: either an operand (`expr`) # or one of the infix operators separating the operands. expr_or_operator: - expr - infix_operator - pattern: - - name_pattern - - tuple_pattern - - constructor_pattern - - or_pattern - - conditional_pattern - - ignore_pattern - - expr_equality_pattern - - bulk_importing_pattern - - unsupported_node # A statement is anything that can appear in a block. # This type contains all of 'expr' and has partial overlap with 'member'. # For example, type_alias_declaration can appear either as a stmt or member. @@ -91,13 +83,6 @@ supertypes: - type_alias_declaration - associated_type_declaration - unsupported_node - type_expr: - - named_type_expr - - generic_type_expr - - tuple_type_expr - - function_type_expr - - inferred_type_expr - - unsupported_node type_constraint: - equality_type_constraint - bound_type_constraint @@ -111,10 +96,16 @@ named: top_level: body: block - # An identifier used in the context of an expression + # An identifier used as a name reference. name_expr: identifier: identifier + # An identifier that introduces a binding, optionally applying a nested pattern. + named_pattern: + modifier*: modifier + identifier: identifier + sub_pattern?: expr + # An integer literal int_literal: @@ -175,11 +166,10 @@ named: # # Method calls are represented as a call whose `function` is a `member_access_expr`. # - # Constructor calls are marked by a language-specific modifier, and the target may be - # a `type_expr` if the parser can deduce that the target is a type. + # Constructor calls are marked by a language-specific modifier. call_expr: modifier*: modifier - callee: expr_or_type + callee: expr argument*: argument argument: @@ -189,13 +179,9 @@ named: # Member access, such as `obj.member`. # - # The base may be a type expression when it is a static member access like `Array.method`. - # In ambiguous cases where the parser cannot distinguish static and instance member access, the base - # will be typically be an expression. - # # For `super.x` the base will be an instance of `super_expr`. member_access_expr: - base: expr_or_type + base: expr member: identifier # A type expression that refers to a type inferred from the contextual type. @@ -211,8 +197,8 @@ named: modifier*: modifier capture_declaration*: variable_declaration parameter*: parameter - return_type?: type_expr - body: block + return_type?: expr + body?: block array_literal: element*: expr @@ -228,26 +214,25 @@ named: key: expr value: expr - # A tuple expression, such as `(a, b, c)`. + # A tuple expression, pattern, or type, such as `(a, b, c)`. tuple_expr: - element*: expr + element*: argument # A parameter. # # `type` is its declared type annotation (if any) # # `pattern` binds the parameter's internal name(s). For a simple parameter this is a - # `name_pattern`, but may be an arbitrary pattern for languages where patterns may appear - # in the parameter list. + # `named_pattern`, but may be an arbitrary expression where languages allow destructuring. # # `external_name` is the name by which to call sites refer to the parameter, if the parameter # can be passed as a named parameter. For example, the Swift function `func greet(person id: String)` - # would have `person` as the external name and a `name_pattern` wrapping `id` is the parameter's pattern. + # would have `person` as the external name and a `named_pattern` wrapping `id` as the parameter's pattern. parameter: modifier*: modifier external_name?: identifier - type?: type_expr - pattern?: pattern + type?: expr + pattern?: expr default?: expr # An expression that does nothing. Used where the grammar permits an @@ -279,8 +264,8 @@ named: # `chained_declaration` modifier so the grouping can be recovered downstream. variable_declaration: modifier*: modifier - pattern: pattern - type?: type_expr + pattern: expr + type?: expr value?: expr # Evaluate 'condition', and if false, execute 'else' which must break from the enclosing block scope (return, break, etc). @@ -323,7 +308,7 @@ named: import_declaration: modifier*: modifier imported_expr: expr # Qualified names are encoded as a chain of member_access_expr ending with a name_expr - pattern?: pattern # Binds local names in scope (possibly via bulk_importing_pattern) + pattern?: expr # Binds local names in scope (possibly via bulk_importing_pattern) # `typealias Name = Type` type_alias_declaration: @@ -331,7 +316,7 @@ named: name: identifier type_parameter*: type_parameter type_constraint*: type_constraint - type: type_expr + type: expr # A top-level function declaration. function_declaration: @@ -340,13 +325,13 @@ named: type_parameter*: type_parameter type_constraint*: type_constraint parameter*: parameter - return_type?: type_expr + return_type?: expr body?: block # `for pattern in iterable [where guard] { body }`. for_each_stmt: modifier*: modifier - pattern: pattern + pattern: expr iterable: expr guard?: expr body?: block @@ -372,7 +357,7 @@ named: catch_clause: modifier*: modifier - pattern?: pattern + pattern?: expr body: block # `switch value { case pattern: body case ...: default: body }` @@ -386,7 +371,7 @@ named: # A `default:` entry has no pattern. switch_case: modifier*: modifier - pattern?: pattern + pattern?: expr body: block # Evaluate 'expr' and match its result against 'pattern', and return true if it matches. @@ -396,7 +381,7 @@ named: # # Java: 'if (x instanceof Foo y && w ...) { ... }' pattern_guard_expr: - pattern: pattern + pattern: expr value: expr # A type cast expression, such as `x as T`, `x as? T`, or `x as! T`. The @@ -404,49 +389,19 @@ named: type_cast_expr: expr: expr operator: infix_operator - type: type_expr + type: expr # A type-test expression, such as `x is T`. Yields a boolean indicating # whether `expr` is an instance of `type`. type_test_expr: expr: expr - operator: infix_operator - type: type_expr - - # An identifier that introduces a variable. - # - # When used as a pattern, the pattern matches anything and binds its incoming value to the variable - name_pattern: - modifier*: modifier - identifier: identifier - sub_pattern?: pattern - - # A pattern matching anything, binding no variables, usually using the syntax "_" - ignore_pattern: - - # A pattern that matches if the incoming value is equal to the value of the given expression. - # Used for literal patterns in switch (e.g. `case 1:`). - expr_equality_pattern: - expr: expr - - # A tuple pattern such as `(a, b)` in `let (a, b) = pair`. - # - # Elements of the tuple pattern can have names, such as Swift's `let (foo: x, bar: y) = tuple`. - tuple_pattern: - modifier*: modifier - element*: pattern_element - - # A pattern such as `Some(x)` where `Some` is the constructor and `x` is an element. - # The element names are interpreted as argument labels and/or field names. - constructor_pattern: - modifier*: modifier - constructor: expr_or_type - element*: pattern_element + operator?: infix_operator + type: expr # A disjunction pattern that matches if any of its sub-patterns match. or_pattern: modifier*: modifier - pattern*: pattern + pattern*: expr # A pattern that matches against a nested pattern, and subsequently checks a condition. # The match is rejected if the condition does not hold. @@ -454,22 +409,7 @@ named: conditional_pattern: modifier*: modifier condition: expr - pattern: pattern - - # A pattern with an optional associated name. - pattern_element: - modifier*: modifier - key?: identifier - pattern: pattern - - # A pattern that checks if the incoming value has the given type, and if so, the - # value is matched against the given nested pattern (and succeeds iff the nested match succeeds). - # - # In Swift: `if let y = x as? Foo` is a pattern_guard_expr containing a type_test_pattern - # In Java: `x instanceof Foo y` is a type_test_pattern wrapping a name_pattern - type_test_pattern: - pattern: pattern - type: type_expr + pattern: expr # A '*' pattern that imports all members of the incoming value into the local scope # Currently this can only appear in import declarations. @@ -495,21 +435,21 @@ named: type_parameter: modifier*: modifier name: identifier - bound?: type_expr + bound?: expr # A generic constraint of the form `T == U`, requiring two types to be # equal. Appears in `where` clauses on generic declarations # (e.g. Swift `func foo() where T == U`). equality_type_constraint: - left: type_expr - right: type_expr + left: expr + right: expr # A generic constraint of the form `T: Bound`, requiring a type parameter # to conform to (or inherit from) some other type. Appears in `where` # clauses on generic declarations (e.g. Swift `where T: Equatable`). bound_type_constraint: - type: type_expr - bound: type_expr + type: expr + bound: expr # `infix operator +++` (and the like) — a declaration of a custom operator. operator_syntax_declaration: @@ -541,7 +481,7 @@ named: # kind should be included as a modifier on this node. base_type: modifier*: modifier - type: type_expr + type: expr constructor_declaration: modifier*: modifier @@ -568,7 +508,7 @@ named: name: identifier accessor_kind: accessor_kind parameter*: parameter - type?: type_expr + type?: expr body?: block # "get", "set", or a language-specific kind like "didSet" @@ -582,29 +522,11 @@ named: associated_type_declaration: modifier*: modifier name: identifier - bound?: type_expr - - named_type_expr: - qualifier?: type_expr - name: identifier + bound?: expr generic_type_expr: - base: type_expr - type_argument*: type_expr - - # A tuple type such as `(Int, String)` or `(a: A, b: B)`. - tuple_type_expr: - element*: tuple_type_element - - # An element of a `tuple_type_expr`, optionally carrying a label. - tuple_type_element: - name?: identifier - type: type_expr - - # A function type such as `(Int, String) -> Bool` or `(x: Int) -> Bool`. - function_type_expr: - parameter*: parameter - return_type: type_expr + base: expr + type_argument*: expr # A modifier such as 'static', 'public', or 'async'. For now this is just a leaf node with a string value. modifier: diff --git a/unified/extractor/src/languages/swift/swift.rs b/unified/extractor/src/languages/swift/swift.rs index 6396d4addd75..9f389c66650a 100644 --- a/unified/extractor/src/languages/swift/swift.rs +++ b/unified/extractor/src/languages/swift/swift.rs @@ -30,16 +30,13 @@ struct SwiftContext { /// True while translating the parameters of a `functionType`. swift-syntax /// models a function type's parameters with the same `tupleTypeElement` /// kind as a tuple type's elements, so the shared `tupleTypeElement` rule - /// reads this to emit a `parameter` (function-type param) rather than a - /// `tuple_type_element` (tuple-type element). The `tupleType` / - /// `functionType` rules each set it for their direct children, so nested - /// types are translated in the correct context. + /// reads this to emit a `parameter` (function-type parameter) rather than + /// an `argument` (tuple element). The `tupleType` / `functionType` rules + /// each set it for their direct children, so nested types are translated + /// in the correct context. in_function_type: bool, - /// True while translating the argument list of an enum-case - /// `constructor_pattern` (e.g. `case .foo(let x, 3)`). Read by the - /// `labeledExpr` rules so a bare expression argument becomes an - /// `expr_equality_pattern` (wrapped in a `pattern_element`) rather than a - /// call `argument`. + /// True while translating a pattern. Optional chaining in this context is + /// represented as an `Optional.some` call rather than being unwrapped. in_pattern: bool, } @@ -159,28 +156,22 @@ fn translation_rules() -> Vec> { // (hex/binary/octal, single- vs multi-line, raw): each is a single // `*LiteralExpr` kind, so one rule per literal type suffices. rule!((integerLiteralExpr) @@node => expr { - let value = tree!((int_literal #{node})); - if ctx.in_pattern { tree!((expr_equality_pattern expr: {value})) } else { value } + tree!((int_literal #{node})) }), rule!((floatLiteralExpr) @@node => expr { - let value = tree!((float_literal #{node})); - if ctx.in_pattern { tree!((expr_equality_pattern expr: {value})) } else { value } + tree!((float_literal #{node})) }), rule!((booleanLiteralExpr) @@node => expr { - let value = tree!((boolean_literal #{node})); - if ctx.in_pattern { tree!((expr_equality_pattern expr: {value})) } else { value } + tree!((boolean_literal #{node})) }), rule!((nilLiteralExpr) @@node => expr { - let value = tree!((builtin_expr #{node})); - if ctx.in_pattern { tree!((expr_equality_pattern expr: {value})) } else { value } + tree!((builtin_expr #{node})) }), rule!((stringLiteralExpr) @@node => expr { - let value = tree!((string_literal #{node})); - if ctx.in_pattern { tree!((expr_equality_pattern expr: {value})) } else { value } + tree!((string_literal #{node})) }), rule!((regexLiteralExpr) @@node => expr { - let value = tree!((regex_literal #{node})); - if ctx.in_pattern { tree!((expr_equality_pattern expr: {value})) } else { value } + tree!((regex_literal #{node})) }), // ---- Names ---- // A function reference spelled with argument labels (`f(x:y:z:)`) is a @@ -195,12 +186,7 @@ fn translation_rules() -> Vec> { (unsupported_node) ), rule!((declReferenceExpr baseName: (identifier) @name) => expr { - let name = tree!((name_expr identifier: (identifier #{name}))); - if ctx.in_pattern { - tree!((expr_equality_pattern expr: {name})) - } else { - name - } + tree!((name_expr identifier: (identifier #{name}))) }), // A bare name reference (`x`), and an operator used as a value (`+` in // `reduce(0, +)`), are both `declReferenceExpr`; its `baseName` is the @@ -208,8 +194,7 @@ fn translation_rules() -> Vec> { rule!((declReferenceExpr baseName: @name) => (name_expr identifier: (identifier #{name}))), // A discard `_` used as an expression — e.g. the target of a discarding // assignment `_ = x`. swift-syntax models it as a `discardAssignmentExpr`; - // the target AST has no expression-level discard (only `ignore_pattern`, - // which is a pattern), so it becomes a `name_expr` over the `_` token. + // the target AST represents it as a `name_expr` over the `_` token. rule!((discardAssignmentExpr wildcard: @@w) => (name_expr identifier: (identifier #{w}))), // A generic specialization in expression position (`C`, // `Array`) is represented by swift-syntax as a @@ -222,7 +207,7 @@ fn translation_rules() -> Vec> { genericArgumentClause: (genericArgumentClause arguments: (genericArgument argument: @args)*)) => (generic_type_expr - base: (named_type_expr name: (identifier #{name})) + base: (name_expr identifier: (identifier #{name})) type_argument: {args}) ), // ---- Operators ---- @@ -357,7 +342,7 @@ fn translation_rules() -> Vec> { result.push(tree!( (variable_declaration modifier: {ctx.outer_modifiers.clone()} - pattern: (name_pattern identifier: (identifier #{name})) + pattern: (named_pattern identifier: (identifier #{name})) type: {ty} value: {val}) )); @@ -465,7 +450,7 @@ fn translation_rules() -> Vec> { rule!( (enumCaseParameter firstName: _? @@name type: @ty) => - (parameter pattern: (name_pattern identifier: (identifier #{name}))? type: {ty}) + (parameter pattern: (named_pattern identifier: (identifier #{name}))? type: {ty}) ), // An enum element with associated values (`case circle(radius: Double)`) // becomes a nested `class_like_declaration` whose constructor carries the @@ -491,7 +476,7 @@ fn translation_rules() -> Vec> { modifier: {ctx.outer_modifiers.clone()} modifier: {chained_modifier(&mut ctx)} modifier: (modifier "enum_case") - pattern: (name_pattern identifier: (identifier #{name})) + pattern: (named_pattern identifier: (identifier #{name})) value: {val}) ), rule!( @@ -501,7 +486,7 @@ fn translation_rules() -> Vec> { modifier: {ctx.outer_modifiers.clone()} modifier: {chained_modifier(&mut ctx)} modifier: (modifier "enum_case") - pattern: (name_pattern identifier: (identifier #{name}))) + pattern: (named_pattern identifier: (identifier #{name}))) ), // Enum cases. A single `case` declaration may carry modifiers // (e.g. `indirect`) and list several comma-separated elements; each @@ -527,20 +512,19 @@ fn translation_rules() -> Vec> { rule!( (identifierPattern identifier: @name) => - (name_pattern identifier: (identifier #{name})) + (named_pattern identifier: (identifier #{name})) ), // A `let`/`var` value-binding pattern (`let x`) inside a case or `if case` - // introduces a new binding; it unwraps to its inner pattern (a - // `name_pattern`). + // introduces a new binding; it unwraps to its inner expression. rule!((valueBindingPattern pattern: @p) => pattern { p }), // A tuple destructuring pattern (`let (a, b) = …`). A labelled element - // (`let (x: a) = …`) carries its label through as the `pattern_element` - // key; unlabelled elements have no key. - rule!((tuplePattern elements: _* @els) => (tuple_pattern element: {els})), + // (`let (x: a) = …`) carries its label through as the `argument` name; + // unlabelled elements have no name. + rule!((tuplePattern elements: _* @els) => (tuple_expr element: {els})), rule!( (tuplePatternElement label: _? @@label pattern: @p) => - (pattern_element key: (identifier #{label})? pattern: {p}) + (argument name: (identifier #{label})? value: {p}) ), // A type-casting pattern (`case is T`). Not yet supported, so it is // mapped to `unsupported_node` — an explicit reminder that this needs @@ -550,7 +534,7 @@ fn translation_rules() -> Vec> { // A wildcard *binding* pattern (`let _ = x`, `for _ in xs`). swift-syntax // models this as a `wildcardPattern`, distinct from the `_` match form // handled by the context-aware `discardAssignmentExpr` rule. - rule!((wildcardPattern) => (ignore_pattern)), + rule!((wildcardPattern) @@wildcard => (name_expr identifier: (identifier #{wildcard}))), // An expression pattern only establishes pattern context; its child // determines the concrete pattern shape. rule!((expressionPattern expression: @@e) => expr { @@ -611,7 +595,7 @@ fn translation_rules() -> Vec> { }; tree!((parameter external_name: {external} - pattern: (name_pattern identifier: (identifier #{name})) + pattern: (named_pattern identifier: (identifier #{name})) type: {ty} default: {val})) } @@ -629,7 +613,7 @@ fn translation_rules() -> Vec> { => (call_expr callee: (generic_type_expr - base: (named_type_expr name: (identifier "Array")) + base: (name_expr identifier: (identifier "Array")) type_argument: {element}) argument: {args} argument: (argument value: {tc})) @@ -641,7 +625,7 @@ fn translation_rules() -> Vec> { => (call_expr callee: (generic_type_expr - base: (named_type_expr name: (identifier "Array")) + base: (name_expr identifier: (identifier "Array")) type_argument: {element}) argument: {args}) ), @@ -663,20 +647,11 @@ fn translation_rules() -> Vec> { ctx.in_pattern = false; ctx.translate(rawCallee) })?; - if ctx.in_pattern { - tree!((constructor_pattern constructor: {callee} element: {args})) - } else { - tree!((call_expr callee: {callee} argument: {args})) - } + tree!((call_expr callee: {callee} argument: {args})) } ), - // A call argument or an enum-case pattern argument. When translating an - // enum-case `constructor_pattern`'s arguments (`ctx.in_pattern`), a - // `patternExpr` argument (`let x`) becomes a bound `name_pattern`, a - // wildcard (`_`) becomes an `ignore_pattern`, and any other expression - // becomes an `expr_equality_pattern`; each is wrapped in a - // `pattern_element` carrying the optional argument label as its `key`. - // Otherwise the argument keeps its label as the `name` and its value. + // A call or enum-case pattern argument. Both use the shared `argument` + // shape, preserving the optional label as `name` and the child as `value`. // The pattern-only shapes (`patternExpr`, `discardAssignmentExpr`) are // matched first; they never occur as ordinary call arguments. rule!( @@ -687,40 +662,26 @@ fn translation_rules() -> Vec> { arguments: _* @elements)) => argument { - if ctx.in_pattern { - tree!((pattern_element - key: (identifier #{lbl})? - pattern: (constructor_pattern - constructor: {constructor} - element: {elements}))) - } else { - tree!((argument - name: (identifier #{lbl})? - value: (call_expr callee: {constructor} argument: {elements}))) - } + tree!((argument + name: (identifier #{lbl})? + value: (call_expr callee: {constructor} argument: {elements}))) } ), rule!( (labeledExpr label: _? @@lbl expression: (patternExpr pattern: @p)) => - (pattern_element key: (identifier #{lbl})? pattern: {p}) + (argument name: (identifier #{lbl})? value: {p}) ), rule!( (labeledExpr label: _? @@lbl expression: (discardAssignmentExpr) @@wildcard) => - (pattern_element key: (identifier #{lbl})? pattern: (ignore_pattern #{wildcard})) + (argument name: (identifier #{lbl})? value: (name_expr identifier: (identifier #{wildcard}))) ), rule!( (labeledExpr label: _? @@lbl expression: @val) => argument { - if ctx.in_pattern { - tree!((pattern_element - key: (identifier #{lbl})? - pattern: {val})) - } else { - tree!((argument name: (identifier #{lbl})? value: {val})) - } + tree!((argument name: (identifier #{lbl})? value: {val})) } ), // Member access (`list.append`). The `declName` is itself a @@ -737,7 +698,7 @@ fn translation_rules() -> Vec> { => (member_access_expr base: (generic_type_expr - base: (named_type_expr name: (identifier "Array")) + base: (name_expr identifier: (identifier "Array")) type_argument: {element}) member: (identifier #{member})) ), @@ -783,7 +744,7 @@ fn translation_rules() -> Vec> { ), // A closure capture (`[weak self]`, `[x]`, `[y = expr]`). The optional // ownership specifier (`weak`/`unowned`) becomes a modifier; the - // captured name becomes the bound `name_pattern`; an explicit capture + // captured name becomes the bound `name_expr`; an explicit capture // initializer (`[y = expr]`) becomes the bound value. rule!( (closureCapture @@ -793,7 +754,7 @@ fn translation_rules() -> Vec> { => (variable_declaration modifier: (modifier #{spec})? - pattern: (name_pattern identifier: (identifier #{name})) + pattern: (named_pattern identifier: (identifier #{name})) value: {val}) ), // A closure parameter clause (`(x: Int, y)`) unwraps to its parameters. @@ -803,14 +764,14 @@ fn translation_rules() -> Vec> { rule!( (closureParameter firstName: @name type: _? @ty) => - (parameter pattern: (name_pattern identifier: (identifier #{name})) type: {ty}) + (parameter pattern: (named_pattern identifier: (identifier #{name})) type: {ty}) ), // A shorthand closure parameter (`x` in `{ x, y in … }`): a bare name // with no parentheses and no type. rule!( (closureShorthandParameter name: @name) => - (parameter pattern: (name_pattern identifier: (identifier #{name}))) + (parameter pattern: (named_pattern identifier: (identifier #{name}))) ), // ---- Control flow ---- // An `if`/`else` expression. Conditions are joined via `and_chain`; the @@ -881,18 +842,18 @@ fn translation_rules() -> Vec> { => (pattern_guard_expr value: {val} - pattern: (constructor_pattern - constructor: (member_access_expr base: (named_type_expr name: (identifier "Optional")) member: (identifier "some")) - element: (pattern_element pattern: (name_pattern identifier: (identifier #{name}))))) + pattern: (call_expr + callee: (member_access_expr base: (name_expr identifier: (identifier "Optional")) member: (identifier "some")) + argument: (argument value: (named_pattern identifier: (identifier #{name}))))) ), rule!( (optionalBindingCondition pattern: (identifierPattern identifier: @name)) => (pattern_guard_expr value: (name_expr identifier: (identifier #{name})) - pattern: (constructor_pattern - constructor: (member_access_expr base: (named_type_expr name: (identifier "Optional")) member: (identifier "some")) - element: (pattern_element pattern: (name_pattern identifier: (identifier #{name}))))) + pattern: (call_expr + callee: (member_access_expr base: (name_expr identifier: (identifier "Optional")) member: (identifier "some")) + argument: (argument value: (named_pattern identifier: (identifier #{name}))))) ), // A single condition in an `if`/`while`/`guard` condition list unwraps to // its inner expression; `and_chain` joins multiple with `&&`. @@ -964,11 +925,11 @@ fn translation_rules() -> Vec> { rule!((optionalChainingExpr expression: @@inner) => expr { let inner = ctx.translate(inner)?.into_iter().next().ok_or("optional chaining expression has no child")?; if ctx.in_pattern { - tree!((constructor_pattern - constructor: (member_access_expr - base: (named_type_expr name: (identifier "Optional")) + tree!((call_expr + callee: (member_access_expr + base: (name_expr identifier: (identifier "Optional")) member: (identifier "some")) - element: (pattern_element pattern: {inner}))) + argument: (argument value: {inner}))) } else { inner } @@ -1029,7 +990,7 @@ fn translation_rules() -> Vec> { // `importPathComponent`s) becomes a `name_expr`/`member_access_expr` // chain (via `member_chain`). A scoped import (`import struct Foo.Bar`) // has an `importKindSpecifier` and binds the last path component as a - // `name_pattern`; a plain import (`import Foundation`) has none and uses + // `name_expr`; a plain import (`import Foundation`) has none and uses // a `bulk_importing_pattern` spanning the whole declaration. Any leading // attributes (`@_exported`) and access modifiers (`public`) become // `modifier`s. @@ -1046,7 +1007,7 @@ fn translation_rules() -> Vec> { Some(_) => None, // scoped import, no bulk import }; let last = *parts.last().ok_or("import has no path")?; - let pattern = tree!((name_pattern identifier: (identifier #{last}) sub_pattern: {bulk_import})); + let pattern = tree!((named_pattern identifier: (identifier #{last}) sub_pattern: {bulk_import})); tree!((import_declaration modifier: (modifier #{kind})? modifier: {attrs} @@ -1075,75 +1036,75 @@ fn translation_rules() -> Vec> { genericArgumentClause: (genericArgumentClause arguments: (genericArgument argument: @args)*)) => (generic_type_expr - base: (named_type_expr name: (identifier #{name})) + base: (name_expr identifier: (identifier #{name})) type_argument: {args}) ), // A named type (`Int`). `identifierType.name` is the type-name token. - rule!((identifierType name: @@n) => (named_type_expr name: (identifier #{n}))), + rule!((identifierType name: @@n) => (name_expr identifier: (identifier #{n}))), // A qualified type (`Outer.Inner`, `NSString.CompareOptions`). swift-syntax - // nests these as `memberType` nodes; preserve the nesting in the - // named_type_expr qualifier field. + // nests these as `memberType` nodes; preserve the nesting as ordinary + // member access. rule!( (memberType baseType: @base name: @@name) => - (named_type_expr qualifier: {base} name: (identifier #{name})) + (member_access_expr base: {base} member: (identifier #{name})) ), // Sugared types desugar to `generic_type_expr`: `T?` -> Optional, // `[T]` -> Array, `[K: V]` -> Dictionary. rule!( (optionalType wrappedType: @w) => - (generic_type_expr base: (named_type_expr name: (identifier "Optional")) type_argument: {w}) + (generic_type_expr base: (name_expr identifier: (identifier "Optional")) type_argument: {w}) ), rule!( (arrayType element: @e) => - (generic_type_expr base: (named_type_expr name: (identifier "Array")) type_argument: {e}) + (generic_type_expr base: (name_expr identifier: (identifier "Array")) type_argument: {e}) ), rule!( (dictionaryType key: @k value: @v) => - (generic_type_expr base: (named_type_expr name: (identifier "Dictionary")) type_argument: {k} type_argument: {v}) + (generic_type_expr base: (name_expr identifier: (identifier "Dictionary")) type_argument: {k} type_argument: {v}) ), // A tuple type (`(Int, String)`) or function type (`(Int) -> Bool`). // Both hold their contents as `tupleTypeElement`s, but a tuple element - // maps to `tuple_type_element` while a function parameter maps to - // `parameter`. Each container sets `ctx.in_function_type` for its direct + // maps to `argument` while a function parameter maps to `parameter`. + // Each container sets `ctx.in_function_type` for its direct // children (and translates them explicitly, so a nested type is // translated in the right context) and the shared `tupleTypeElement` // rule below reads it. An element's label (`firstName`) is optional. rule!( (tupleType elements: _* @@elems) => - tuple_type_expr { + tuple_expr { ctx.in_function_type = false; let mut out = Vec::new(); for e in elems { out.extend(ctx.translate(e)?); } - tree!((tuple_type_expr element: {out})) + tree!((tuple_expr element: {out})) } ), rule!( (functionType parameters: _* @@params returnClause: (returnClause type: @ret)) => - function_type_expr { + function_expr { ctx.in_function_type = true; let mut out = Vec::new(); for p in params { out.extend(ctx.translate(p)?); } - tree!((function_type_expr parameter: {out} return_type: {ret})) + tree!((function_expr parameter: {out} return_type: {ret})) } ), rule!( (tupleTypeElement firstName: _? @@name type: @ty) => - tuple_type_element { + argument { if ctx.in_function_type { tree!((parameter external_name: (identifier #{name})? type: {ty})) } else { - tree!((tuple_type_element name: (identifier #{name})? type: {ty})) + tree!((argument name: (identifier #{name})? value: {ty})) } } ), diff --git a/unified/extractor/tests/corpus/swift/closures/closure-with-capture-list.output b/unified/extractor/tests/corpus/swift/closures/closure-with-capture-list.output index 6833344de16d..d9203985ad59 100644 --- a/unified/extractor/tests/corpus/swift/closures/closure-with-capture-list.output +++ b/unified/extractor/tests/corpus/swift/closures/closure-with-capture-list.output @@ -67,7 +67,7 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "f" value: function_expr @@ -75,7 +75,7 @@ top_level variable_declaration modifier: modifier "weak" pattern: - name_pattern + named_pattern identifier: identifier "self" body: block diff --git a/unified/extractor/tests/corpus/swift/closures/closure-with-explicit-parameters.output b/unified/extractor/tests/corpus/swift/closures/closure-with-explicit-parameters.output index c20da77c72cb..f9ba376b2272 100644 --- a/unified/extractor/tests/corpus/swift/closures/closure-with-explicit-parameters.output +++ b/unified/extractor/tests/corpus/swift/closures/closure-with-explicit-parameters.output @@ -69,21 +69,21 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "f" value: function_expr parameter: parameter type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" pattern: - name_pattern + named_pattern identifier: identifier "x" return_type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" body: block stmt: diff --git a/unified/extractor/tests/corpus/swift/closures/closure-with-shorthand-parameters.output b/unified/extractor/tests/corpus/swift/closures/closure-with-shorthand-parameters.output index 1b07604e02c5..a5a074d48a78 100644 --- a/unified/extractor/tests/corpus/swift/closures/closure-with-shorthand-parameters.output +++ b/unified/extractor/tests/corpus/swift/closures/closure-with-shorthand-parameters.output @@ -46,7 +46,7 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "f" value: function_expr diff --git a/unified/extractor/tests/corpus/swift/closures/multi-statement-closure.output b/unified/extractor/tests/corpus/swift/closures/multi-statement-closure.output index 4fbc1c8f71f0..b5fb2465fce4 100644 --- a/unified/extractor/tests/corpus/swift/closures/multi-statement-closure.output +++ b/unified/extractor/tests/corpus/swift/closures/multi-statement-closure.output @@ -100,28 +100,28 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "f" value: function_expr parameter: parameter type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" pattern: - name_pattern + named_pattern identifier: identifier "x" return_type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" body: block stmt: variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "y" value: binary_expr diff --git a/unified/extractor/tests/corpus/swift/collections/array-literal.output b/unified/extractor/tests/corpus/swift/collections/array-literal.output index c6ea2c2094fa..37d02ffec267 100644 --- a/unified/extractor/tests/corpus/swift/collections/array-literal.output +++ b/unified/extractor/tests/corpus/swift/collections/array-literal.output @@ -48,7 +48,7 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "xs" value: array_literal diff --git a/unified/extractor/tests/corpus/swift/collections/dictionary-literal.output b/unified/extractor/tests/corpus/swift/collections/dictionary-literal.output index edd306a69cbd..689ab33ce2fe 100644 --- a/unified/extractor/tests/corpus/swift/collections/dictionary-literal.output +++ b/unified/extractor/tests/corpus/swift/collections/dictionary-literal.output @@ -59,6 +59,6 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "d" value: map_literal "[\"a\": 1, \"b\": 2]" diff --git a/unified/extractor/tests/corpus/swift/collections/dictionary-subscript.output b/unified/extractor/tests/corpus/swift/collections/dictionary-subscript.output index e2f939e0683c..e24550673f80 100644 --- a/unified/extractor/tests/corpus/swift/collections/dictionary-subscript.output +++ b/unified/extractor/tests/corpus/swift/collections/dictionary-subscript.output @@ -48,7 +48,7 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "v" value: call_expr diff --git a/unified/extractor/tests/corpus/swift/collections/empty-array-literal-with-type.output b/unified/extractor/tests/corpus/swift/collections/empty-array-literal-with-type.output index e9a70a43bb42..51b535de7ee2 100644 --- a/unified/extractor/tests/corpus/swift/collections/empty-array-literal-with-type.output +++ b/unified/extractor/tests/corpus/swift/collections/empty-array-literal-with-type.output @@ -44,14 +44,14 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "xs" type: generic_type_expr base: - named_type_expr - name: identifier "Array" + name_expr + identifier: identifier "Array" type_argument: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" value: array_literal "[]" diff --git a/unified/extractor/tests/corpus/swift/collections/set-literal.output b/unified/extractor/tests/corpus/swift/collections/set-literal.output index a06670231ebb..a0bfaab57804 100644 --- a/unified/extractor/tests/corpus/swift/collections/set-literal.output +++ b/unified/extractor/tests/corpus/swift/collections/set-literal.output @@ -63,16 +63,16 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "s" type: generic_type_expr base: - named_type_expr - name: identifier "Set" + name_expr + identifier: identifier "Set" type_argument: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" value: array_literal element: diff --git a/unified/extractor/tests/corpus/swift/collections/subscript-access.output b/unified/extractor/tests/corpus/swift/collections/subscript-access.output index ec24f0c1f1df..2ae548bfe1d0 100644 --- a/unified/extractor/tests/corpus/swift/collections/subscript-access.output +++ b/unified/extractor/tests/corpus/swift/collections/subscript-access.output @@ -45,7 +45,7 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "first" value: call_expr diff --git a/unified/extractor/tests/corpus/swift/collections/tuple-literal.output b/unified/extractor/tests/corpus/swift/collections/tuple-literal.output index facbc2fcbb45..74d505ab5b8c 100644 --- a/unified/extractor/tests/corpus/swift/collections/tuple-literal.output +++ b/unified/extractor/tests/corpus/swift/collections/tuple-literal.output @@ -52,6 +52,6 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "t" value: tuple_expr "(1, \"two\", 3.0)" diff --git a/unified/extractor/tests/corpus/swift/collections/tuple-member-access.output b/unified/extractor/tests/corpus/swift/collections/tuple-member-access.output index 6ecbd22eebe0..30298ed89865 100644 --- a/unified/extractor/tests/corpus/swift/collections/tuple-member-access.output +++ b/unified/extractor/tests/corpus/swift/collections/tuple-member-access.output @@ -38,7 +38,7 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "n" value: member_access_expr diff --git a/unified/extractor/tests/corpus/swift/control-flow/binding-modifier-does-not-leak-to-sibling.output b/unified/extractor/tests/corpus/swift/control-flow/binding-modifier-does-not-leak-to-sibling.output index 800647eb7474..bb3c49721f44 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/binding-modifier-does-not-leak-to-sibling.output +++ b/unified/extractor/tests/corpus/swift/control-flow/binding-modifier-does-not-leak-to-sibling.output @@ -91,7 +91,7 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "x" value: int_literal "1" switch_expr @@ -101,10 +101,8 @@ top_level case: switch_case pattern: - expr_equality_pattern - expr: - name_expr - identifier: identifier "someConstant" + name_expr + identifier: identifier "someConstant" body: block stmt: diff --git a/unified/extractor/tests/corpus/swift/control-flow/fallthrough.output b/unified/extractor/tests/corpus/swift/control-flow/fallthrough.output index 9cfe81048402..79bea22bbe24 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/fallthrough.output +++ b/unified/extractor/tests/corpus/swift/control-flow/fallthrough.output @@ -92,10 +92,10 @@ top_level parameter external_name: identifier "_" type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" pattern: - name_pattern + named_pattern identifier: identifier "x" body: block @@ -106,9 +106,7 @@ top_level identifier: identifier "x" case: switch_case - pattern: - expr_equality_pattern - expr: int_literal "1" + pattern: int_literal "1" body: block stmt: unsupported_node "fallthrough" diff --git a/unified/extractor/tests/corpus/swift/control-flow/guard-let.output b/unified/extractor/tests/corpus/swift/control-flow/guard-let.output index d739eca564b5..9c0fbc37926e 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/guard-let.output +++ b/unified/extractor/tests/corpus/swift/control-flow/guard-let.output @@ -44,17 +44,17 @@ top_level condition: pattern_guard_expr pattern: - constructor_pattern - constructor: + call_expr + callee: member_access_expr base: - named_type_expr - name: identifier "Optional" + name_expr + identifier: identifier "Optional" member: identifier "some" - element: - pattern_element - pattern: - name_pattern + argument: + argument + value: + named_pattern identifier: identifier "value" value: name_expr diff --git a/unified/extractor/tests/corpus/swift/control-flow/if-case-let-with-shadowing-in-condition-value.output b/unified/extractor/tests/corpus/swift/control-flow/if-case-let-with-shadowing-in-condition-value.output index 2a0676513f23..808b1dd610c9 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/if-case-let-with-shadowing-in-condition-value.output +++ b/unified/extractor/tests/corpus/swift/control-flow/if-case-let-with-shadowing-in-condition-value.output @@ -68,7 +68,7 @@ top_level condition: pattern_guard_expr pattern: - name_pattern + named_pattern identifier: identifier "x" value: binary_expr diff --git a/unified/extractor/tests/corpus/swift/control-flow/if-let-optional-binding.output b/unified/extractor/tests/corpus/swift/control-flow/if-let-optional-binding.output index d1bcf82b0faa..5f26de40c1b3 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/if-let-optional-binding.output +++ b/unified/extractor/tests/corpus/swift/control-flow/if-let-optional-binding.output @@ -57,17 +57,17 @@ top_level condition: pattern_guard_expr pattern: - constructor_pattern - constructor: + call_expr + callee: member_access_expr base: - named_type_expr - name: identifier "Optional" + name_expr + identifier: identifier "Optional" member: identifier "some" - element: - pattern_element - pattern: - name_pattern + argument: + argument + value: + named_pattern identifier: identifier "value" value: name_expr diff --git a/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output b/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output index 66a6f32dab4d..c6eae5b793f0 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output +++ b/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output @@ -166,27 +166,27 @@ top_level case: switch_case pattern: - constructor_pattern - constructor: + call_expr + callee: member_access_expr base: inferred_type_expr "." member: identifier "received" - element: - pattern_element - pattern: - constructor_pattern - constructor: + argument: + argument + value: + call_expr + callee: member_access_expr base: inferred_type_expr "." member: identifier "some" - element: - pattern_element - pattern: - name_pattern + argument: + argument + value: + named_pattern identifier: identifier "value" - pattern_element - pattern: - name_pattern + argument + value: + named_pattern identifier: identifier "timestamp" body: block @@ -206,17 +206,17 @@ top_level identifier: identifier "timestamp" switch_case pattern: - constructor_pattern - constructor: + call_expr + callee: member_access_expr base: name_expr identifier: identifier "Type" member: identifier "some" - element: - pattern_element - pattern: - name_pattern + argument: + argument + value: + named_pattern identifier: identifier "value" body: block diff --git a/unified/extractor/tests/corpus/swift/control-flow/switch-case-item-where-clauses.output b/unified/extractor/tests/corpus/swift/control-flow/switch-case-item-where-clauses.output index 9d2041aa2ad1..c60b3ffb7284 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/switch-case-item-where-clauses.output +++ b/unified/extractor/tests/corpus/swift/control-flow/switch-case-item-where-clauses.output @@ -170,7 +170,7 @@ top_level operator: infix_operator ">" right: int_literal "0" pattern: - name_pattern + named_pattern identifier: identifier "x" body: block @@ -195,10 +195,9 @@ top_level operator: infix_operator "<" right: int_literal "0" pattern: - name_pattern + named_pattern identifier: identifier "y" - expr_equality_pattern - expr: int_literal "0" + int_literal "0" body: block stmt: diff --git a/unified/extractor/tests/corpus/swift/control-flow/switch-statement.output b/unified/extractor/tests/corpus/swift/control-flow/switch-statement.output index a88579852947..c14948ae54e9 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/switch-statement.output +++ b/unified/extractor/tests/corpus/swift/control-flow/switch-statement.output @@ -130,9 +130,7 @@ top_level identifier: identifier "x" case: switch_case - pattern: - expr_equality_pattern - expr: int_literal "1" + pattern: int_literal "1" body: block stmt: @@ -147,10 +145,8 @@ top_level pattern: or_pattern pattern: - expr_equality_pattern - expr: int_literal "2" - expr_equality_pattern - expr: int_literal "3" + int_literal "2" + int_literal "3" body: block stmt: diff --git a/unified/extractor/tests/corpus/swift/control-flow/switch-with-binding-pattern.output b/unified/extractor/tests/corpus/swift/control-flow/switch-with-binding-pattern.output index 90bb6b44e6e5..3db9aa3ddcc3 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/switch-with-binding-pattern.output +++ b/unified/extractor/tests/corpus/swift/control-flow/switch-with-binding-pattern.output @@ -126,15 +126,15 @@ top_level case: switch_case pattern: - constructor_pattern - constructor: + call_expr + callee: member_access_expr base: inferred_type_expr "." member: identifier "circle" - element: - pattern_element - pattern: - name_pattern + argument: + argument + value: + named_pattern identifier: identifier "r" body: block @@ -150,15 +150,15 @@ top_level identifier: identifier "r" switch_case pattern: - constructor_pattern - constructor: + call_expr + callee: member_access_expr base: inferred_type_expr "." member: identifier "square" - element: - pattern_element - pattern: - name_pattern + argument: + argument + value: + named_pattern identifier: identifier "s" body: block diff --git a/unified/extractor/tests/corpus/swift/control-flow/switch-with-labeled-case-pattern-arguments.output b/unified/extractor/tests/corpus/swift/control-flow/switch-with-labeled-case-pattern-arguments.output index 20b17d160e44..269eed5906ab 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/switch-with-labeled-case-pattern-arguments.output +++ b/unified/extractor/tests/corpus/swift/control-flow/switch-with-labeled-case-pattern-arguments.output @@ -134,17 +134,15 @@ top_level case: switch_case pattern: - constructor_pattern - constructor: + call_expr + callee: member_access_expr base: inferred_type_expr "." member: identifier "implicit" - element: - pattern_element - key: identifier "isAcknowledged" - pattern: - expr_equality_pattern - expr: boolean_literal "false" + argument: + argument + name: identifier "isAcknowledged" + value: boolean_literal "false" body: block stmt: @@ -157,18 +155,20 @@ top_level value: string_literal "\"yes\"" switch_case pattern: - constructor_pattern - constructor: + call_expr + callee: member_access_expr base: inferred_type_expr "." member: identifier "thread" - element: - pattern_element - key: identifier "threadRowId" - pattern: ignore_pattern "_" - pattern_element - pattern: - name_pattern + argument: + argument + name: identifier "threadRowId" + value: + name_expr + identifier: identifier "_" + argument + value: + named_pattern identifier: identifier "rowId" body: block diff --git a/unified/extractor/tests/corpus/swift/control-flow/ternary-expression.output b/unified/extractor/tests/corpus/swift/control-flow/ternary-expression.output index 88c7bc1b886c..360835a10799 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/ternary-expression.output +++ b/unified/extractor/tests/corpus/swift/control-flow/ternary-expression.output @@ -53,7 +53,7 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "y" value: if_expr diff --git a/unified/extractor/tests/corpus/swift/desugar/import-with-deeply-nested-path-three-parts.output b/unified/extractor/tests/corpus/swift/desugar/import-with-deeply-nested-path-three-parts.output index ed16e68e219d..b423f1c0e14e 100644 --- a/unified/extractor/tests/corpus/swift/desugar/import-with-deeply-nested-path-three-parts.output +++ b/unified/extractor/tests/corpus/swift/desugar/import-with-deeply-nested-path-three-parts.output @@ -38,6 +38,6 @@ top_level member: identifier "Networking" member: identifier "URLSession" pattern: - name_pattern + named_pattern identifier: identifier "URLSession" sub_pattern: bulk_importing_pattern "import Foundation.Networking.URLSession" diff --git a/unified/extractor/tests/corpus/swift/desugar/import-with-dotted-path-two-parts.output b/unified/extractor/tests/corpus/swift/desugar/import-with-dotted-path-two-parts.output index 88f08baa19ce..074dd8a1cca7 100644 --- a/unified/extractor/tests/corpus/swift/desugar/import-with-dotted-path-two-parts.output +++ b/unified/extractor/tests/corpus/swift/desugar/import-with-dotted-path-two-parts.output @@ -32,6 +32,6 @@ top_level identifier: identifier "Foundation" member: identifier "Networking" pattern: - name_pattern + named_pattern identifier: identifier "Networking" sub_pattern: bulk_importing_pattern "import Foundation.Networking" diff --git a/unified/extractor/tests/corpus/swift/desugar/scoped-import-uses-name-pattern.output b/unified/extractor/tests/corpus/swift/desugar/scoped-import-uses-name-pattern.output index 93319c522981..376a7cefd43c 100644 --- a/unified/extractor/tests/corpus/swift/desugar/scoped-import-uses-name-pattern.output +++ b/unified/extractor/tests/corpus/swift/desugar/scoped-import-uses-name-pattern.output @@ -34,5 +34,5 @@ top_level identifier: identifier "Foundation" member: identifier "Date" pattern: - name_pattern + named_pattern identifier: identifier "Date" diff --git a/unified/extractor/tests/corpus/swift/desugar/simple-import-with-single-name.output b/unified/extractor/tests/corpus/swift/desugar/simple-import-with-single-name.output index 31261cd952c3..600df253234b 100644 --- a/unified/extractor/tests/corpus/swift/desugar/simple-import-with-single-name.output +++ b/unified/extractor/tests/corpus/swift/desugar/simple-import-with-single-name.output @@ -26,6 +26,6 @@ top_level name_expr identifier: identifier "Foundation" pattern: - name_pattern + named_pattern identifier: identifier "Foundation" sub_pattern: bulk_importing_pattern "import Foundation" diff --git a/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.output b/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.output index 43f1c8a553da..4f74f03a5de0 100644 --- a/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.output +++ b/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.output @@ -131,43 +131,43 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "values" value: call_expr callee: generic_type_expr base: - named_type_expr - name: identifier "Array" + name_expr + identifier: identifier "Array" type_argument: generic_type_expr base: - named_type_expr - name: identifier "Result" + name_expr + identifier: identifier "Result" type_argument: - named_type_expr - name: identifier "Void" + name_expr + identifier: identifier "Void" variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "initialized" value: call_expr callee: generic_type_expr base: - named_type_expr - name: identifier "Array" + name_expr + identifier: identifier "Array" type_argument: generic_type_expr base: - named_type_expr - name: identifier "Result" + name_expr + identifier: identifier "Result" type_argument: - named_type_expr - name: identifier "Void" + name_expr + identifier: identifier "Void" argument: argument name: identifier "unsafeUninitializedCapacity" @@ -178,11 +178,11 @@ top_level parameter: parameter pattern: - name_pattern + named_pattern identifier: identifier "_" parameter pattern: - name_pattern + named_pattern identifier: identifier "count" body: block diff --git a/unified/extractor/tests/corpus/swift/expressions/array-type-metatype.output b/unified/extractor/tests/corpus/swift/expressions/array-type-metatype.output index f06917190b3a..95262f0c5487 100644 --- a/unified/extractor/tests/corpus/swift/expressions/array-type-metatype.output +++ b/unified/extractor/tests/corpus/swift/expressions/array-type-metatype.output @@ -55,21 +55,21 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "type" value: member_access_expr base: generic_type_expr base: - named_type_expr - name: identifier "Array" + name_expr + identifier: identifier "Array" type_argument: generic_type_expr base: - named_type_expr - name: identifier "Result" + name_expr + identifier: identifier "Result" type_argument: - named_type_expr - name: identifier "Void" + name_expr + identifier: identifier "Void" member: identifier "self" diff --git a/unified/extractor/tests/corpus/swift/expressions/consume-expression.output b/unified/extractor/tests/corpus/swift/expressions/consume-expression.output index f20f89b72558..50ac9b41dbae 100644 --- a/unified/extractor/tests/corpus/swift/expressions/consume-expression.output +++ b/unified/extractor/tests/corpus/swift/expressions/consume-expression.output @@ -69,7 +69,7 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "original" value: array_literal @@ -80,6 +80,6 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "consumed" value: unsupported_node "consume original" diff --git a/unified/extractor/tests/corpus/swift/expressions/copy-expression.output b/unified/extractor/tests/corpus/swift/expressions/copy-expression.output index 9f065b046a90..c12051aca725 100644 --- a/unified/extractor/tests/corpus/swift/expressions/copy-expression.output +++ b/unified/extractor/tests/corpus/swift/expressions/copy-expression.output @@ -69,7 +69,7 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "original" value: array_literal @@ -80,6 +80,6 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "copied" value: unsupported_node "copy original" diff --git a/unified/extractor/tests/corpus/swift/expressions/generic-specialization-expression.output b/unified/extractor/tests/corpus/swift/expressions/generic-specialization-expression.output index 94cdf978b9d2..0871c64a4d64 100644 --- a/unified/extractor/tests/corpus/swift/expressions/generic-specialization-expression.output +++ b/unified/extractor/tests/corpus/swift/expressions/generic-specialization-expression.output @@ -49,15 +49,15 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "numbers" value: call_expr callee: generic_type_expr base: - named_type_expr - name: identifier "Array" + name_expr + identifier: identifier "Array" type_argument: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" diff --git a/unified/extractor/tests/corpus/swift/expressions/key-path-expression.output b/unified/extractor/tests/corpus/swift/expressions/key-path-expression.output index a803e9e594fd..461d9fc4b89f 100644 --- a/unified/extractor/tests/corpus/swift/expressions/key-path-expression.output +++ b/unified/extractor/tests/corpus/swift/expressions/key-path-expression.output @@ -43,6 +43,6 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "keyPath" value: unsupported_node "\\String.count" diff --git a/unified/extractor/tests/corpus/swift/functions/call-with-inout-argument.output b/unified/extractor/tests/corpus/swift/functions/call-with-inout-argument.output index 3dae9884c81e..542f7e54730e 100644 --- a/unified/extractor/tests/corpus/swift/functions/call-with-inout-argument.output +++ b/unified/extractor/tests/corpus/swift/functions/call-with-inout-argument.output @@ -76,13 +76,13 @@ top_level variable_declaration modifier: modifier "var" pattern: - name_pattern + named_pattern identifier: identifier "a" value: int_literal "1" variable_declaration modifier: modifier "var" pattern: - name_pattern + named_pattern identifier: identifier "b" value: int_literal "2" call_expr diff --git a/unified/extractor/tests/corpus/swift/functions/constructor-call-with-type-arguments.output b/unified/extractor/tests/corpus/swift/functions/constructor-call-with-type-arguments.output index 37afdfa0d639..bb7b5fce65d5 100644 --- a/unified/extractor/tests/corpus/swift/functions/constructor-call-with-type-arguments.output +++ b/unified/extractor/tests/corpus/swift/functions/constructor-call-with-type-arguments.output @@ -92,15 +92,15 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "x" value: call_expr callee: generic_type_expr base: - named_type_expr - name: identifier "C" + name_expr + identifier: identifier "C" type_argument: - named_type_expr - name: identifier "Foo" + name_expr + identifier: identifier "Foo" diff --git a/unified/extractor/tests/corpus/swift/functions/function-with-default-parameter-value.output b/unified/extractor/tests/corpus/swift/functions/function-with-default-parameter-value.output index 3495a13106fb..bff9c6018540 100644 --- a/unified/extractor/tests/corpus/swift/functions/function-with-default-parameter-value.output +++ b/unified/extractor/tests/corpus/swift/functions/function-with-default-parameter-value.output @@ -70,10 +70,10 @@ top_level parameter: parameter type: - named_type_expr - name: identifier "String" + name_expr + identifier: identifier "String" pattern: - name_pattern + named_pattern identifier: identifier "name" default: string_literal "\"world\"" body: diff --git a/unified/extractor/tests/corpus/swift/functions/function-with-inout-parameter.output b/unified/extractor/tests/corpus/swift/functions/function-with-inout-parameter.output index 232fb6dc2dbc..9c3aa054e1f9 100644 --- a/unified/extractor/tests/corpus/swift/functions/function-with-inout-parameter.output +++ b/unified/extractor/tests/corpus/swift/functions/function-with-inout-parameter.output @@ -68,7 +68,7 @@ top_level external_name: identifier "_" type: unsupported_node "inout Int" pattern: - name_pattern + named_pattern identifier: identifier "x" body: block diff --git a/unified/extractor/tests/corpus/swift/functions/function-with-named-parameters.output b/unified/extractor/tests/corpus/swift/functions/function-with-named-parameters.output index 7488edbcb231..2c577f940197 100644 --- a/unified/extractor/tests/corpus/swift/functions/function-with-named-parameters.output +++ b/unified/extractor/tests/corpus/swift/functions/function-with-named-parameters.output @@ -62,10 +62,10 @@ top_level parameter external_name: identifier "person" type: - named_type_expr - name: identifier "String" + name_expr + identifier: identifier "String" pattern: - name_pattern + named_pattern identifier: identifier "name" body: block diff --git a/unified/extractor/tests/corpus/swift/functions/function-with-parameters-and-return-type.output b/unified/extractor/tests/corpus/swift/functions/function-with-parameters-and-return-type.output index e69b19307674..0acf938ebe4f 100644 --- a/unified/extractor/tests/corpus/swift/functions/function-with-parameters-and-return-type.output +++ b/unified/extractor/tests/corpus/swift/functions/function-with-parameters-and-return-type.output @@ -79,22 +79,22 @@ top_level parameter external_name: identifier "_" type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" pattern: - name_pattern + named_pattern identifier: identifier "a" parameter external_name: identifier "_" type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" pattern: - name_pattern + named_pattern identifier: identifier "b" return_type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" body: block stmt: diff --git a/unified/extractor/tests/corpus/swift/functions/generic-function.output b/unified/extractor/tests/corpus/swift/functions/generic-function.output index dc7831410e23..6cf4caef5b12 100644 --- a/unified/extractor/tests/corpus/swift/functions/generic-function.output +++ b/unified/extractor/tests/corpus/swift/functions/generic-function.output @@ -72,14 +72,14 @@ top_level parameter external_name: identifier "_" type: - named_type_expr - name: identifier "T" + name_expr + identifier: identifier "T" pattern: - name_pattern + named_pattern identifier: identifier "x" return_type: - named_type_expr - name: identifier "T" + name_expr + identifier: identifier "T" body: block stmt: diff --git a/unified/extractor/tests/corpus/swift/functions/generic-type-alias.output b/unified/extractor/tests/corpus/swift/functions/generic-type-alias.output index 36737bd95bda..d60ce9b27b27 100644 --- a/unified/extractor/tests/corpus/swift/functions/generic-type-alias.output +++ b/unified/extractor/tests/corpus/swift/functions/generic-type-alias.output @@ -61,17 +61,17 @@ top_level type_parameter name: identifier "T" bound: - named_type_expr - name: identifier "Equatable" + name_expr + identifier: identifier "Equatable" type_parameter name: identifier "U" type: generic_type_expr base: - named_type_expr - name: identifier "Dictionary" + name_expr + identifier: identifier "Dictionary" type_argument: - named_type_expr - name: identifier "T" - named_type_expr - name: identifier "U" + name_expr + identifier: identifier "T" + name_expr + identifier: identifier "U" diff --git a/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-call.output b/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-call.output index a5b38e1e2bea..7b7aab7984fc 100644 --- a/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-call.output +++ b/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-call.output @@ -45,7 +45,7 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "y" value: call_expr diff --git a/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-value.output b/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-value.output index 41128b61818e..8b374c20c858 100644 --- a/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-value.output +++ b/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-value.output @@ -35,7 +35,7 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "x" value: member_access_expr diff --git a/unified/extractor/tests/corpus/swift/functions/nested-function-type.output b/unified/extractor/tests/corpus/swift/functions/nested-function-type.output index d9ce0cd7a976..0428a5a5356d 100644 --- a/unified/extractor/tests/corpus/swift/functions/nested-function-type.output +++ b/unified/extractor/tests/corpus/swift/functions/nested-function-type.output @@ -107,50 +107,50 @@ top_level type_alias_declaration name: identifier "NestedFunction" type: - function_type_expr + function_expr parameter: parameter type: - function_type_expr + function_expr parameter: parameter type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" return_type: - named_type_expr - name: identifier "Bool" + name_expr + identifier: identifier "Bool" return_type: - named_type_expr - name: identifier "Bool" + name_expr + identifier: identifier "Bool" type_alias_declaration name: identifier "MixedParametersAndTuples" type: - function_type_expr + function_expr parameter: parameter type: - function_type_expr + function_expr parameter: parameter type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" return_type: - named_type_expr - name: identifier "Bool" + name_expr + identifier: identifier "Bool" parameter type: - named_type_expr - name: identifier "String" + name_expr + identifier: identifier "String" return_type: - tuple_type_expr + tuple_expr element: - tuple_type_element - type: - named_type_expr - name: identifier "Bool" - tuple_type_element - type: - named_type_expr - name: identifier "Int" + argument + value: + name_expr + identifier: identifier "Bool" + argument + value: + name_expr + identifier: identifier "Int" diff --git a/unified/extractor/tests/corpus/swift/functions/variadic-function.output b/unified/extractor/tests/corpus/swift/functions/variadic-function.output index 78c20ffc01e9..9a87fa620158 100644 --- a/unified/extractor/tests/corpus/swift/functions/variadic-function.output +++ b/unified/extractor/tests/corpus/swift/functions/variadic-function.output @@ -83,14 +83,14 @@ top_level parameter external_name: identifier "_" type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" pattern: - name_pattern + named_pattern identifier: identifier "values" return_type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" body: block stmt: diff --git a/unified/extractor/tests/corpus/swift/literals/line-magic-literal.output b/unified/extractor/tests/corpus/swift/literals/line-magic-literal.output index 1616055fc16c..d0fe61074147 100644 --- a/unified/extractor/tests/corpus/swift/literals/line-magic-literal.output +++ b/unified/extractor/tests/corpus/swift/literals/line-magic-literal.output @@ -35,6 +35,6 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "currentLine" value: unsupported_node "#line" diff --git a/unified/extractor/tests/corpus/swift/loops/break-and-continue.output b/unified/extractor/tests/corpus/swift/loops/break-and-continue.output index 7ce869998272..524dfc851553 100644 --- a/unified/extractor/tests/corpus/swift/loops/break-and-continue.output +++ b/unified/extractor/tests/corpus/swift/loops/break-and-continue.output @@ -104,7 +104,7 @@ top_level stmt: for_each_stmt pattern: - name_pattern + named_pattern identifier: identifier "x" iterable: name_expr diff --git a/unified/extractor/tests/corpus/swift/loops/for-in-over-array-literal.output b/unified/extractor/tests/corpus/swift/loops/for-in-over-array-literal.output index 2d8db27bfe85..d8d851da1ec4 100644 --- a/unified/extractor/tests/corpus/swift/loops/for-in-over-array-literal.output +++ b/unified/extractor/tests/corpus/swift/loops/for-in-over-array-literal.output @@ -62,7 +62,7 @@ top_level stmt: for_each_stmt pattern: - name_pattern + named_pattern identifier: identifier "x" iterable: array_literal diff --git a/unified/extractor/tests/corpus/swift/loops/for-in-over-range.output b/unified/extractor/tests/corpus/swift/loops/for-in-over-range.output index cb8b4e67b68d..1299d445a0ec 100644 --- a/unified/extractor/tests/corpus/swift/loops/for-in-over-range.output +++ b/unified/extractor/tests/corpus/swift/loops/for-in-over-range.output @@ -54,7 +54,7 @@ top_level stmt: for_each_stmt pattern: - name_pattern + named_pattern identifier: identifier "i" iterable: binary_expr diff --git a/unified/extractor/tests/corpus/swift/loops/for-in-with-where-clause.output b/unified/extractor/tests/corpus/swift/loops/for-in-with-where-clause.output index 6659039029f3..50632ecf9f33 100644 --- a/unified/extractor/tests/corpus/swift/loops/for-in-with-where-clause.output +++ b/unified/extractor/tests/corpus/swift/loops/for-in-with-where-clause.output @@ -60,7 +60,7 @@ top_level stmt: for_each_stmt pattern: - name_pattern + named_pattern identifier: identifier "x" iterable: name_expr diff --git a/unified/extractor/tests/corpus/swift/operators/custom-postfix-operator.output b/unified/extractor/tests/corpus/swift/operators/custom-postfix-operator.output index 5067671aa997..a16f291fbfab 100644 --- a/unified/extractor/tests/corpus/swift/operators/custom-postfix-operator.output +++ b/unified/extractor/tests/corpus/swift/operators/custom-postfix-operator.output @@ -43,6 +43,6 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "squared" value: unsupported_node "3^^" diff --git a/unified/extractor/tests/corpus/swift/operators/partial-range-from.output b/unified/extractor/tests/corpus/swift/operators/partial-range-from.output index 1b9208cedf8b..300d3e7c2e69 100644 --- a/unified/extractor/tests/corpus/swift/operators/partial-range-from.output +++ b/unified/extractor/tests/corpus/swift/operators/partial-range-from.output @@ -35,6 +35,6 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "range" value: unsupported_node "3..." diff --git a/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-casts.output b/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-casts.output index a0563c7bc88b..27e81c82766e 100644 --- a/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-casts.output +++ b/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-casts.output @@ -99,18 +99,18 @@ top_level parameter external_name: identifier "_" type: - named_type_expr - name: identifier "Any" + name_expr + identifier: identifier "Any" pattern: - name_pattern + named_pattern identifier: identifier "a" parameter external_name: identifier "_" type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" pattern: - name_pattern + named_pattern identifier: identifier "b" body: block diff --git a/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-ternary.output b/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-ternary.output index 57274c32a9c2..3bd9a4e920cb 100644 --- a/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-ternary.output +++ b/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-ternary.output @@ -105,38 +105,38 @@ top_level parameter external_name: identifier "_" type: - named_type_expr - name: identifier "Bool" + name_expr + identifier: identifier "Bool" pattern: - name_pattern + named_pattern identifier: identifier "c" parameter external_name: identifier "_" type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" pattern: - name_pattern + named_pattern identifier: identifier "a" parameter external_name: identifier "_" type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" pattern: - name_pattern + named_pattern identifier: identifier "b" parameter external_name: identifier "_" type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" pattern: - name_pattern + named_pattern identifier: identifier "d" return_type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" body: block stmt: diff --git a/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence.output b/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence.output index 46dc8ca6ae89..dc652b757aba 100644 --- a/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence.output +++ b/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence.output @@ -72,18 +72,18 @@ top_level parameter external_name: identifier "_" type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" pattern: - name_pattern + named_pattern identifier: identifier "a" parameter external_name: identifier "_" type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" pattern: - name_pattern + named_pattern identifier: identifier "b" body: block diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/catch-where-clauses.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/catch-where-clauses.output index 79b7879d35fa..7c50ddc7bbf8 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/catch-where-clauses.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/catch-where-clauses.output @@ -168,7 +168,7 @@ top_level name_expr identifier: identifier "e" pattern: - name_pattern + named_pattern identifier: identifier "e" conditional_pattern condition: @@ -182,7 +182,7 @@ top_level name_expr identifier: identifier "f" pattern: - name_pattern + named_pattern identifier: identifier "f" body: block diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/force-unwrap.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/force-unwrap.output index 2c6fd1a6f763..a7014629e1b0 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/force-unwrap.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/force-unwrap.output @@ -35,7 +35,7 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "n" value: unary_expr diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/nil-coalescing.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/nil-coalescing.output index 31a039ad0065..c90fe3ae7f36 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/nil-coalescing.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/nil-coalescing.output @@ -40,7 +40,7 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "n" value: binary_expr diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-chaining.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-chaining.output index b69b0ae47d50..8f07d4a51d8a 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-chaining.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-chaining.output @@ -50,7 +50,7 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "n" value: member_access_expr diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.output index 7b1eb1eea3b4..35e1a7319ed2 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.output @@ -80,25 +80,25 @@ top_level condition: pattern_guard_expr pattern: - constructor_pattern - constructor: + call_expr + callee: member_access_expr base: - named_type_expr - name: identifier "Optional" + name_expr + identifier: identifier "Optional" member: identifier "some" - element: - pattern_element - pattern: - constructor_pattern - constructor: + argument: + argument + value: + call_expr + callee: member_access_expr base: inferred_type_expr "." member: identifier "some" - element: - pattern_element - pattern: - name_pattern + argument: + argument + value: + named_pattern identifier: identifier "value" value: name_expr diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-type-annotation.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-type-annotation.output index 1927b494ef9a..132f3a424475 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-type-annotation.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-type-annotation.output @@ -41,14 +41,14 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "x" type: generic_type_expr base: - named_type_expr - name: identifier "Optional" + name_expr + identifier: identifier "Optional" type_argument: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" value: builtin_expr "nil" diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/throwing-function.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/throwing-function.output index e68b4c3c57ac..03ad472b33e0 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/throwing-function.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/throwing-function.output @@ -58,8 +58,8 @@ top_level function_declaration name: identifier "read" return_type: - named_type_expr - name: identifier "String" + name_expr + identifier: identifier "String" body: block stmt: diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/try-expression-2.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/try-expression-2.output index aafc0c67c217..c7fe32e98bd4 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/try-expression-2.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/try-expression-2.output @@ -42,7 +42,7 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "result" value: unary_expr diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/try-expression.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/try-expression.output index 5b1b0b24d0fa..269d77f7c0ad 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/try-expression.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/try-expression.output @@ -42,7 +42,7 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "result" value: unary_expr diff --git a/unified/extractor/tests/corpus/swift/types/binding-modifier-does-not-leak-into-accessor-body.output b/unified/extractor/tests/corpus/swift/types/binding-modifier-does-not-leak-into-accessor-body.output index c05bc7794437..9bcd96de183b 100644 --- a/unified/extractor/tests/corpus/swift/types/binding-modifier-does-not-leak-into-accessor-body.output +++ b/unified/extractor/tests/corpus/swift/types/binding-modifier-does-not-leak-into-accessor-body.output @@ -101,8 +101,8 @@ top_level name: identifier "p" accessor_kind: accessor_kind "get" type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" body: block stmt: @@ -113,10 +113,8 @@ top_level case: switch_case pattern: - expr_equality_pattern - expr: - name_expr - identifier: identifier "someConstant" + name_expr + identifier: identifier "someConstant" body: block stmt: diff --git a/unified/extractor/tests/corpus/swift/types/class-inheritance.output b/unified/extractor/tests/corpus/swift/types/class-inheritance.output index 12328f4acb0d..9eff2e05f4a7 100644 --- a/unified/extractor/tests/corpus/swift/types/class-inheritance.output +++ b/unified/extractor/tests/corpus/swift/types/class-inheritance.output @@ -38,5 +38,5 @@ top_level base_type: base_type type: - named_type_expr - name: identifier "Animal" + name_expr + identifier: identifier "Animal" diff --git a/unified/extractor/tests/corpus/swift/types/class-with-initializer.output b/unified/extractor/tests/corpus/swift/types/class-with-initializer.output index 83945d89e3a0..814badd5672d 100644 --- a/unified/extractor/tests/corpus/swift/types/class-with-initializer.output +++ b/unified/extractor/tests/corpus/swift/types/class-with-initializer.output @@ -97,19 +97,19 @@ top_level variable_declaration modifier: modifier "var" pattern: - name_pattern + named_pattern identifier: identifier "x" type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" constructor_declaration parameter: parameter type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" pattern: - name_pattern + named_pattern identifier: identifier "x" body: block diff --git a/unified/extractor/tests/corpus/swift/types/class-with-method.output b/unified/extractor/tests/corpus/swift/types/class-with-method.output index f45cb31e53ad..6d705579a6df 100644 --- a/unified/extractor/tests/corpus/swift/types/class-with-method.output +++ b/unified/extractor/tests/corpus/swift/types/class-with-method.output @@ -84,7 +84,7 @@ top_level variable_declaration modifier: modifier "var" pattern: - name_pattern + named_pattern identifier: identifier "n" value: int_literal "0" function_declaration diff --git a/unified/extractor/tests/corpus/swift/types/class-with-multiple-base-types.output b/unified/extractor/tests/corpus/swift/types/class-with-multiple-base-types.output index e66b88e9be3d..3075db477518 100644 --- a/unified/extractor/tests/corpus/swift/types/class-with-multiple-base-types.output +++ b/unified/extractor/tests/corpus/swift/types/class-with-multiple-base-types.output @@ -43,9 +43,9 @@ top_level base_type: base_type type: - named_type_expr - name: identifier "Control" + name_expr + identifier: identifier "Control" base_type type: - named_type_expr - name: identifier "Drawable" + name_expr + identifier: identifier "Drawable" diff --git a/unified/extractor/tests/corpus/swift/types/class-with-stored-properties.output b/unified/extractor/tests/corpus/swift/types/class-with-stored-properties.output index e184426eb755..456632aee765 100644 --- a/unified/extractor/tests/corpus/swift/types/class-with-stored-properties.output +++ b/unified/extractor/tests/corpus/swift/types/class-with-stored-properties.output @@ -68,16 +68,16 @@ top_level variable_declaration modifier: modifier "var" pattern: - name_pattern + named_pattern identifier: identifier "x" type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" variable_declaration modifier: modifier "var" pattern: - name_pattern + named_pattern identifier: identifier "y" type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" diff --git a/unified/extractor/tests/corpus/swift/types/computed-property.output b/unified/extractor/tests/corpus/swift/types/computed-property.output index 24e816be0091..d1472abad268 100644 --- a/unified/extractor/tests/corpus/swift/types/computed-property.output +++ b/unified/extractor/tests/corpus/swift/types/computed-property.output @@ -108,26 +108,26 @@ top_level variable_declaration modifier: modifier "var" pattern: - name_pattern + named_pattern identifier: identifier "w" type: - named_type_expr - name: identifier "Double" + name_expr + identifier: identifier "Double" variable_declaration modifier: modifier "var" pattern: - name_pattern + named_pattern identifier: identifier "h" type: - named_type_expr - name: identifier "Double" + name_expr + identifier: identifier "Double" accessor_declaration modifier: modifier "var" name: identifier "area" accessor_kind: accessor_kind "get" type: - named_type_expr - name: identifier "Double" + name_expr + identifier: identifier "Double" body: block stmt: diff --git a/unified/extractor/tests/corpus/swift/types/constructor-with-parameters.output b/unified/extractor/tests/corpus/swift/types/constructor-with-parameters.output index c9be21dd156a..9b943de8c8d1 100644 --- a/unified/extractor/tests/corpus/swift/types/constructor-with-parameters.output +++ b/unified/extractor/tests/corpus/swift/types/constructor-with-parameters.output @@ -72,17 +72,17 @@ top_level parameter external_name: identifier "width" type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" pattern: - name_pattern + named_pattern identifier: identifier "w" parameter external_name: identifier "height" type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" pattern: - name_pattern + named_pattern identifier: identifier "h" body: block "init(width w: Int, height h: Int) {}" diff --git a/unified/extractor/tests/corpus/swift/types/enum-with-associated-values.output b/unified/extractor/tests/corpus/swift/types/enum-with-associated-values.output index 399239bbea30..b8a86a5b57d7 100644 --- a/unified/extractor/tests/corpus/swift/types/enum-with-associated-values.output +++ b/unified/extractor/tests/corpus/swift/types/enum-with-associated-values.output @@ -81,10 +81,10 @@ top_level parameter: parameter type: - named_type_expr - name: identifier "Double" + name_expr + identifier: identifier "Double" pattern: - name_pattern + named_pattern identifier: identifier "radius" body: block "circle(radius: Double)" class_like_declaration @@ -95,9 +95,9 @@ top_level parameter: parameter type: - named_type_expr - name: identifier "Double" + name_expr + identifier: identifier "Double" pattern: - name_pattern + named_pattern identifier: identifier "side" body: block "square(side: Double)" diff --git a/unified/extractor/tests/corpus/swift/types/enum-with-cases.output b/unified/extractor/tests/corpus/swift/types/enum-with-cases.output index f081c2a82046..a73235cbdc53 100644 --- a/unified/extractor/tests/corpus/swift/types/enum-with-cases.output +++ b/unified/extractor/tests/corpus/swift/types/enum-with-cases.output @@ -72,20 +72,20 @@ top_level variable_declaration modifier: modifier "enum_case" pattern: - name_pattern + named_pattern identifier: identifier "north" variable_declaration modifier: modifier "enum_case" pattern: - name_pattern + named_pattern identifier: identifier "south" variable_declaration modifier: modifier "enum_case" pattern: - name_pattern + named_pattern identifier: identifier "east" variable_declaration modifier: modifier "enum_case" pattern: - name_pattern + named_pattern identifier: identifier "west" diff --git a/unified/extractor/tests/corpus/swift/types/enum-with-comma-separated-cases-chained-declaration.output b/unified/extractor/tests/corpus/swift/types/enum-with-comma-separated-cases-chained-declaration.output index 6a4ea95e9a62..840e6fd1425c 100644 --- a/unified/extractor/tests/corpus/swift/types/enum-with-comma-separated-cases-chained-declaration.output +++ b/unified/extractor/tests/corpus/swift/types/enum-with-comma-separated-cases-chained-declaration.output @@ -51,26 +51,26 @@ top_level variable_declaration modifier: modifier "enum_case" pattern: - name_pattern + named_pattern identifier: identifier "clubs" variable_declaration modifier: modifier "chained_declaration" modifier "enum_case" pattern: - name_pattern + named_pattern identifier: identifier "diamonds" variable_declaration modifier: modifier "chained_declaration" modifier "enum_case" pattern: - name_pattern + named_pattern identifier: identifier "hearts" variable_declaration modifier: modifier "chained_declaration" modifier "enum_case" pattern: - name_pattern + named_pattern identifier: identifier "spades" diff --git a/unified/extractor/tests/corpus/swift/types/extension.output b/unified/extractor/tests/corpus/swift/types/extension.output index 1b1d02ebddad..943674ae2d4d 100644 --- a/unified/extractor/tests/corpus/swift/types/extension.output +++ b/unified/extractor/tests/corpus/swift/types/extension.output @@ -75,8 +75,8 @@ top_level function_declaration name: identifier "squared" return_type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" body: block stmt: diff --git a/unified/extractor/tests/corpus/swift/types/function-type-with-convention-attribute.output b/unified/extractor/tests/corpus/swift/types/function-type-with-convention-attribute.output index 3d484d6f65d8..d7dc17326afe 100644 --- a/unified/extractor/tests/corpus/swift/types/function-type-with-convention-attribute.output +++ b/unified/extractor/tests/corpus/swift/types/function-type-with-convention-attribute.output @@ -65,7 +65,7 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "callback" type: unsupported_node "@convention(c) () -> Void" value: diff --git a/unified/extractor/tests/corpus/swift/types/function-type-with-sendable-attribute.output b/unified/extractor/tests/corpus/swift/types/function-type-with-sendable-attribute.output index ef9f838dadbe..3228b81bc456 100644 --- a/unified/extractor/tests/corpus/swift/types/function-type-with-sendable-attribute.output +++ b/unified/extractor/tests/corpus/swift/types/function-type-with-sendable-attribute.output @@ -58,7 +58,7 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "handler" type: unsupported_node "@Sendable () -> Void" value: diff --git a/unified/extractor/tests/corpus/swift/types/generic-class-parameters-and-constraints.output b/unified/extractor/tests/corpus/swift/types/generic-class-parameters-and-constraints.output index 26b17599ae00..0b1152ce4678 100644 --- a/unified/extractor/tests/corpus/swift/types/generic-class-parameters-and-constraints.output +++ b/unified/extractor/tests/corpus/swift/types/generic-class-parameters-and-constraints.output @@ -73,22 +73,22 @@ top_level type_parameter name: identifier "T" bound: - named_type_expr - name: identifier "Equatable" + name_expr + identifier: identifier "Equatable" type_parameter name: identifier "U" type_constraint: bound_type_constraint type: - named_type_expr - name: identifier "U" + name_expr + identifier: identifier "U" bound: - named_type_expr - name: identifier "Equatable" + name_expr + identifier: identifier "Equatable" equality_type_constraint left: - named_type_expr - name: identifier "U" + name_expr + identifier: identifier "U" right: - named_type_expr - name: identifier "T" + name_expr + identifier: identifier "T" diff --git a/unified/extractor/tests/corpus/swift/types/generic-type-arguments.output b/unified/extractor/tests/corpus/swift/types/generic-type-arguments.output index ce12c853d9d5..3c3310d0dbed 100644 --- a/unified/extractor/tests/corpus/swift/types/generic-type-arguments.output +++ b/unified/extractor/tests/corpus/swift/types/generic-type-arguments.output @@ -63,21 +63,21 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "cache" type: generic_type_expr base: - named_type_expr - name: identifier "Dictionary" + name_expr + identifier: identifier "Dictionary" type_argument: - named_type_expr - name: identifier "String" + name_expr + identifier: identifier "String" generic_type_expr base: - named_type_expr - name: identifier "Array" + name_expr + identifier: identifier "Array" type_argument: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" value: map_literal "[:]" diff --git a/unified/extractor/tests/corpus/swift/types/inline-array-type.output b/unified/extractor/tests/corpus/swift/types/inline-array-type.output index 5f70d9d55168..b0e08711e9a2 100644 --- a/unified/extractor/tests/corpus/swift/types/inline-array-type.output +++ b/unified/extractor/tests/corpus/swift/types/inline-array-type.output @@ -66,7 +66,7 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "triple" type: unsupported_node "[3 of Int]" value: diff --git a/unified/extractor/tests/corpus/swift/types/noncopyable-type.output b/unified/extractor/tests/corpus/swift/types/noncopyable-type.output index 4fb13ca13ece..784a0139a760 100644 --- a/unified/extractor/tests/corpus/swift/types/noncopyable-type.output +++ b/unified/extractor/tests/corpus/swift/types/noncopyable-type.output @@ -64,8 +64,8 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "descriptor" type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" diff --git a/unified/extractor/tests/corpus/swift/types/property-with-getter-and-setter.output b/unified/extractor/tests/corpus/swift/types/property-with-getter-and-setter.output index 951768cd8444..60183b0ff7b5 100644 --- a/unified/extractor/tests/corpus/swift/types/property-with-getter-and-setter.output +++ b/unified/extractor/tests/corpus/swift/types/property-with-getter-and-setter.output @@ -115,7 +115,7 @@ top_level modifier "var" modifier "private" pattern: - name_pattern + named_pattern identifier: identifier "_v" value: int_literal "0" accessor_declaration @@ -123,8 +123,8 @@ top_level name: identifier "v" accessor_kind: accessor_kind "get" type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" body: block stmt: @@ -139,8 +139,8 @@ top_level name: identifier "v" accessor_kind: accessor_kind "set" type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" body: block stmt: diff --git a/unified/extractor/tests/corpus/swift/types/protocol-with-read-only-and-read-write-property-requirements.output b/unified/extractor/tests/corpus/swift/types/protocol-with-read-only-and-read-write-property-requirements.output index 83362740bb1e..fa1f7771e511 100644 --- a/unified/extractor/tests/corpus/swift/types/protocol-with-read-only-and-read-write-property-requirements.output +++ b/unified/extractor/tests/corpus/swift/types/protocol-with-read-only-and-read-write-property-requirements.output @@ -88,18 +88,18 @@ top_level name: identifier "foo" accessor_kind: accessor_kind "get" type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" accessor_declaration name: identifier "bar" accessor_kind: accessor_kind "get" type: - named_type_expr - name: identifier "String" + name_expr + identifier: identifier "String" accessor_declaration modifier: modifier "chained_declaration" name: identifier "bar" accessor_kind: accessor_kind "set" type: - named_type_expr - name: identifier "String" + name_expr + identifier: identifier "String" diff --git a/unified/extractor/tests/corpus/swift/types/qualified-type.output b/unified/extractor/tests/corpus/swift/types/qualified-type.output index f561dc6ab2dc..12dd46786964 100644 --- a/unified/extractor/tests/corpus/swift/types/qualified-type.output +++ b/unified/extractor/tests/corpus/swift/types/qualified-type.output @@ -115,25 +115,25 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "value" type: - named_type_expr - qualifier: - named_type_expr - name: identifier "Outer" - name: identifier "Inner" + member_access_expr + base: + name_expr + identifier: identifier "Outer" + member: identifier "Inner" variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "nested" type: - named_type_expr - qualifier: - named_type_expr - qualifier: - named_type_expr - name: identifier "Outer" - name: identifier "Inner" - name: identifier "Deep" + member_access_expr + base: + member_access_expr + base: + name_expr + identifier: identifier "Outer" + member: identifier "Inner" + member: identifier "Deep" diff --git a/unified/extractor/tests/corpus/swift/types/struct.output b/unified/extractor/tests/corpus/swift/types/struct.output index 57fb25c9e193..6ea2d81c0c67 100644 --- a/unified/extractor/tests/corpus/swift/types/struct.output +++ b/unified/extractor/tests/corpus/swift/types/struct.output @@ -68,16 +68,16 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "x" type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "y" type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" diff --git a/unified/extractor/tests/corpus/swift/variables/binding-modifier-does-not-leak-into-initializer.output b/unified/extractor/tests/corpus/swift/variables/binding-modifier-does-not-leak-into-initializer.output index d159cd6b37cb..d6d9516b93f5 100644 --- a/unified/extractor/tests/corpus/swift/variables/binding-modifier-does-not-leak-into-initializer.output +++ b/unified/extractor/tests/corpus/swift/variables/binding-modifier-does-not-leak-into-initializer.output @@ -68,7 +68,7 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "x" value: switch_expr @@ -78,10 +78,8 @@ top_level case: switch_case pattern: - expr_equality_pattern - expr: - name_expr - identifier: identifier "someConstant" + name_expr + identifier: identifier "someConstant" body: block stmt: int_literal "1" diff --git a/unified/extractor/tests/corpus/swift/variables/let-binding.output b/unified/extractor/tests/corpus/swift/variables/let-binding.output index 4774eb3eeca8..00cf7be87c3f 100644 --- a/unified/extractor/tests/corpus/swift/variables/let-binding.output +++ b/unified/extractor/tests/corpus/swift/variables/let-binding.output @@ -32,6 +32,6 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "x" value: int_literal "1" diff --git a/unified/extractor/tests/corpus/swift/variables/let-with-type-annotation.output b/unified/extractor/tests/corpus/swift/variables/let-with-type-annotation.output index a56feb445ace..112cca7e7b07 100644 --- a/unified/extractor/tests/corpus/swift/variables/let-with-type-annotation.output +++ b/unified/extractor/tests/corpus/swift/variables/let-with-type-annotation.output @@ -38,9 +38,9 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "x" type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" value: int_literal "1" diff --git a/unified/extractor/tests/corpus/swift/variables/multiple-bindings-on-one-line.output b/unified/extractor/tests/corpus/swift/variables/multiple-bindings-on-one-line.output index 9470a578ad62..1c46136955ff 100644 --- a/unified/extractor/tests/corpus/swift/variables/multiple-bindings-on-one-line.output +++ b/unified/extractor/tests/corpus/swift/variables/multiple-bindings-on-one-line.output @@ -43,7 +43,7 @@ top_level variable_declaration modifier: modifier "let" pattern: - name_pattern + named_pattern identifier: identifier "x" value: int_literal "1" variable_declaration @@ -51,6 +51,6 @@ top_level modifier "let" modifier "chained_declaration" pattern: - name_pattern + named_pattern identifier: identifier "y" value: int_literal "2" diff --git a/unified/extractor/tests/corpus/swift/variables/property-with-willset-and-didset-observers.output b/unified/extractor/tests/corpus/swift/variables/property-with-willset-and-didset-observers.output index 8071d5d52900..79945f6fb16b 100644 --- a/unified/extractor/tests/corpus/swift/variables/property-with-willset-and-didset-observers.output +++ b/unified/extractor/tests/corpus/swift/variables/property-with-willset-and-didset-observers.output @@ -108,11 +108,11 @@ top_level variable_declaration modifier: modifier "var" pattern: - name_pattern + named_pattern identifier: identifier "x" type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" value: int_literal "0" accessor_declaration modifier: diff --git a/unified/extractor/tests/corpus/swift/variables/tuple-destructuring-binding.output b/unified/extractor/tests/corpus/swift/variables/tuple-destructuring-binding.output index 6b6bd81115ed..8fc96f0feeba 100644 --- a/unified/extractor/tests/corpus/swift/variables/tuple-destructuring-binding.output +++ b/unified/extractor/tests/corpus/swift/variables/tuple-destructuring-binding.output @@ -43,15 +43,15 @@ top_level variable_declaration modifier: modifier "let" pattern: - tuple_pattern + tuple_expr element: - pattern_element - pattern: - name_pattern + argument + value: + named_pattern identifier: identifier "a" - pattern_element - pattern: - name_pattern + argument + value: + named_pattern identifier: identifier "b" value: name_expr diff --git a/unified/extractor/tests/corpus/swift/variables/var-binding.output b/unified/extractor/tests/corpus/swift/variables/var-binding.output index 63498105dc75..babfbc9583bf 100644 --- a/unified/extractor/tests/corpus/swift/variables/var-binding.output +++ b/unified/extractor/tests/corpus/swift/variables/var-binding.output @@ -32,6 +32,6 @@ top_level variable_declaration modifier: modifier "var" pattern: - name_pattern + named_pattern identifier: identifier "x" value: int_literal "1" diff --git a/unified/extractor/tests/corpus/swift/variables/var-without-initialiser.output b/unified/extractor/tests/corpus/swift/variables/var-without-initialiser.output index d841ce2bb583..0a01e0cc8ac2 100644 --- a/unified/extractor/tests/corpus/swift/variables/var-without-initialiser.output +++ b/unified/extractor/tests/corpus/swift/variables/var-without-initialiser.output @@ -32,8 +32,8 @@ top_level variable_declaration modifier: modifier "var" pattern: - name_pattern + named_pattern identifier: identifier "x" type: - named_type_expr - name: identifier "Int" + name_expr + identifier: identifier "Int" diff --git a/unified/ql/lib/codeql/unified/internal/Ast.qll b/unified/ql/lib/codeql/unified/internal/Ast.qll index cf927e257a9c..cd5f8a7aaf00 100644 --- a/unified/ql/lib/codeql/unified/internal/Ast.qll +++ b/unified/ql/lib/codeql/unified/internal/Ast.qll @@ -124,7 +124,7 @@ module Unified { final F::Parameter getAParameter() { result = this.getParameter(_) } /** Gets the node corresponding to the field `type`. */ - final F::TypeExpr getType() { unified_accessor_declaration_type(this, result) } + final F::Expr getType() { unified_accessor_declaration_type(this, result) } /** Gets a field or child node of this node. */ final override F::AstNode getAFieldOrChild() { @@ -206,7 +206,7 @@ module Unified { final override string getAPrimaryQlClass() { result = "AssociatedTypeDeclaration" } /** Gets the node corresponding to the field `bound`. */ - final F::TypeExpr getBound() { unified_associated_type_declaration_bound(this, result) } + final F::Expr getBound() { unified_associated_type_declaration_bound(this, result) } /** Gets the node corresponding to the field `modifier`. */ final F::Modifier getModifier(int i) { @@ -239,7 +239,7 @@ module Unified { final F::Modifier getAModifier() { result = this.getModifier(_) } /** Gets the node corresponding to the field `type`. */ - final F::TypeExpr getType() { unified_base_type_def(this, result) } + final F::Expr getType() { unified_base_type_def(this, result) } /** Gets a field or child node of this node. */ final override F::AstNode getAFieldOrChild() { @@ -296,10 +296,10 @@ module Unified { final override string getAPrimaryQlClass() { result = "BoundTypeConstraint" } /** Gets the node corresponding to the field `bound`. */ - final F::TypeExpr getBound() { unified_bound_type_constraint_def(this, result, _) } + final F::Expr getBound() { unified_bound_type_constraint_def(this, result, _) } /** Gets the node corresponding to the field `type`. */ - final F::TypeExpr getType() { unified_bound_type_constraint_def(this, _, result) } + final F::Expr getType() { unified_bound_type_constraint_def(this, _, result) } /** Gets a field or child node of this node. */ final override F::AstNode getAFieldOrChild() { @@ -327,7 +327,7 @@ module Unified { } /** A class representing `bulk_importing_pattern` nodes. */ - class BulkImportingPattern extends @unified_bulk_importing_pattern, F::Pattern { + class BulkImportingPattern extends @unified_bulk_importing_pattern, F::Expr { /** Gets the name of the primary QL class for this element. */ final override string getAPrimaryQlClass() { result = "BulkImportingPattern" } @@ -357,7 +357,7 @@ module Unified { final F::Argument getAnArgument() { result = this.getArgument(_) } /** Gets the node corresponding to the field `callee`. */ - final F::ExprOrType getCallee() { unified_call_expr_def(this, result) } + final F::Expr getCallee() { unified_call_expr_def(this, result) } /** Gets the node corresponding to the field `modifier`. */ final F::Modifier getModifier(int i) { unified_call_expr_modifier(this, i, result) } @@ -390,7 +390,7 @@ module Unified { final F::Modifier getAModifier() { result = this.getModifier(_) } /** Gets the node corresponding to the field `pattern`. */ - final F::Pattern getPattern() { unified_catch_clause_pattern(this, result) } + final F::Expr getPattern() { unified_catch_clause_pattern(this, result) } /** Gets a field or child node of this node. */ final override F::AstNode getAFieldOrChild() { @@ -480,7 +480,7 @@ module Unified { } /** A class representing `conditional_pattern` nodes. */ - class ConditionalPattern extends @unified_conditional_pattern, F::Pattern { + class ConditionalPattern extends @unified_conditional_pattern, F::Expr { /** Gets the name of the primary QL class for this element. */ final override string getAPrimaryQlClass() { result = "ConditionalPattern" } @@ -494,7 +494,7 @@ module Unified { final F::Modifier getAModifier() { result = this.getModifier(_) } /** Gets the node corresponding to the field `pattern`. */ - final F::Pattern getPattern() { unified_conditional_pattern_def(this, _, result) } + final F::Expr getPattern() { unified_conditional_pattern_def(this, _, result) } /** Gets a field or child node of this node. */ final override F::AstNode getAFieldOrChild() { @@ -542,36 +542,6 @@ module Unified { } } - /** A class representing `constructor_pattern` nodes. */ - class ConstructorPattern extends @unified_constructor_pattern, F::Pattern { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ConstructorPattern" } - - /** Gets the node corresponding to the field `constructor`. */ - final F::ExprOrType getConstructor() { unified_constructor_pattern_def(this, result) } - - /** Gets the node corresponding to the field `element`. */ - final F::PatternElement getElement(int i) { - unified_constructor_pattern_element(this, i, result) - } - - /** Gets the node corresponding to the field `element`. */ - final F::PatternElement getAnElement() { result = this.getElement(_) } - - /** Gets the node corresponding to the field `modifier`. */ - final F::Modifier getModifier(int i) { unified_constructor_pattern_modifier(this, i, result) } - - /** Gets the node corresponding to the field `modifier`. */ - final F::Modifier getAModifier() { result = this.getModifier(_) } - - /** Gets a field or child node of this node. */ - final override F::AstNode getAFieldOrChild() { - unified_constructor_pattern_def(this, result) or - unified_constructor_pattern_element(this, _, result) or - unified_constructor_pattern_modifier(this, _, result) - } - } - /** A class representing `continue_expr` nodes. */ class ContinueExpr extends @unified_continue_expr, F::Expr { /** Gets the name of the primary QL class for this element. */ @@ -646,10 +616,10 @@ module Unified { final override string getAPrimaryQlClass() { result = "EqualityTypeConstraint" } /** Gets the node corresponding to the field `left`. */ - final F::TypeExpr getLeft() { unified_equality_type_constraint_def(this, result, _) } + final F::Expr getLeft() { unified_equality_type_constraint_def(this, result, _) } /** Gets the node corresponding to the field `right`. */ - final F::TypeExpr getRight() { unified_equality_type_constraint_def(this, _, result) } + final F::Expr getRight() { unified_equality_type_constraint_def(this, _, result) } /** Gets a field or child node of this node. */ final override F::AstNode getAFieldOrChild() { @@ -658,24 +628,10 @@ module Unified { } } - class Expr extends @unified_expr, F::ExprOrOperator, F::ExprOrType, F::Stmt { } - - /** A class representing `expr_equality_pattern` nodes. */ - class ExprEqualityPattern extends @unified_expr_equality_pattern, F::Pattern { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "ExprEqualityPattern" } - - /** Gets the node corresponding to the field `expr`. */ - final F::Expr getExpr() { unified_expr_equality_pattern_def(this, result) } - - /** Gets a field or child node of this node. */ - final override F::AstNode getAFieldOrChild() { unified_expr_equality_pattern_def(this, result) } - } + class Expr extends @unified_expr, F::ExprOrOperator, F::Stmt { } class ExprOrOperator extends @unified_expr_or_operator, F::AstNode { } - class ExprOrType extends @unified_expr_or_type, F::AstNode { } - /** A class representing `fixity` tokens. */ class Fixity extends @unified_token_fixity, F::AstNode, F::Token { /** Gets the name of the primary QL class for this element. */ @@ -709,7 +665,7 @@ module Unified { final F::Modifier getAModifier() { result = this.getModifier(_) } /** Gets the node corresponding to the field `pattern`. */ - final F::Pattern getPattern() { unified_for_each_stmt_def(this, _, result) } + final F::Expr getPattern() { unified_for_each_stmt_def(this, _, result) } /** Gets a field or child node of this node. */ final override F::AstNode getAFieldOrChild() { @@ -747,7 +703,7 @@ module Unified { final F::Parameter getAParameter() { result = this.getParameter(_) } /** Gets the node corresponding to the field `return_type`. */ - final F::TypeExpr getReturnType() { unified_function_declaration_return_type(this, result) } + final F::Expr getReturnType() { unified_function_declaration_return_type(this, result) } /** Gets the node corresponding to the field `type_constraint`. */ final F::TypeConstraint getTypeConstraint(int i) { @@ -783,7 +739,7 @@ module Unified { final override string getAPrimaryQlClass() { result = "FunctionExpr" } /** Gets the node corresponding to the field `body`. */ - final F::Block getBody() { unified_function_expr_def(this, result) } + final F::Block getBody() { unified_function_expr_body(this, result) } /** Gets the node corresponding to the field `capture_declaration`. */ final F::VariableDeclaration getCaptureDeclaration(int i) { @@ -806,11 +762,11 @@ module Unified { final F::Parameter getAParameter() { result = this.getParameter(_) } /** Gets the node corresponding to the field `return_type`. */ - final F::TypeExpr getReturnType() { unified_function_expr_return_type(this, result) } + final F::Expr getReturnType() { unified_function_expr_return_type(this, result) } /** Gets a field or child node of this node. */ final override F::AstNode getAFieldOrChild() { - unified_function_expr_def(this, result) or + unified_function_expr_body(this, result) or unified_function_expr_capture_declaration(this, _, result) or unified_function_expr_modifier(this, _, result) or unified_function_expr_parameter(this, _, result) or @@ -818,42 +774,21 @@ module Unified { } } - /** A class representing `function_type_expr` nodes. */ - class FunctionTypeExpr extends @unified_function_type_expr, F::TypeExpr { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "FunctionTypeExpr" } - - /** Gets the node corresponding to the field `parameter`. */ - final F::Parameter getParameter(int i) { unified_function_type_expr_parameter(this, i, result) } - - /** Gets the node corresponding to the field `parameter`. */ - final F::Parameter getAParameter() { result = this.getParameter(_) } - - /** Gets the node corresponding to the field `return_type`. */ - final F::TypeExpr getReturnType() { unified_function_type_expr_def(this, result) } - - /** Gets a field or child node of this node. */ - final override F::AstNode getAFieldOrChild() { - unified_function_type_expr_parameter(this, _, result) or - unified_function_type_expr_def(this, result) - } - } - /** A class representing `generic_type_expr` nodes. */ - class GenericTypeExpr extends @unified_generic_type_expr, F::TypeExpr { + class GenericTypeExpr extends @unified_generic_type_expr, F::Expr { /** Gets the name of the primary QL class for this element. */ final override string getAPrimaryQlClass() { result = "GenericTypeExpr" } /** Gets the node corresponding to the field `base`. */ - final F::TypeExpr getBase() { unified_generic_type_expr_def(this, result) } + final F::Expr getBase() { unified_generic_type_expr_def(this, result) } /** Gets the node corresponding to the field `type_argument`. */ - final F::TypeExpr getTypeArgument(int i) { + final F::Expr getTypeArgument(int i) { unified_generic_type_expr_type_argument(this, i, result) } /** Gets the node corresponding to the field `type_argument`. */ - final F::TypeExpr getATypeArgument() { result = this.getTypeArgument(_) } + final F::Expr getATypeArgument() { result = this.getTypeArgument(_) } /** Gets a field or child node of this node. */ final override F::AstNode getAFieldOrChild() { @@ -907,12 +842,6 @@ module Unified { } } - /** A class representing `ignore_pattern` tokens. */ - class IgnorePattern extends @unified_token_ignore_pattern, F::Pattern, F::Token { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "IgnorePattern" } - } - /** A class representing `import_declaration` nodes. */ class ImportDeclaration extends @unified_import_declaration, F::Stmt { /** Gets the name of the primary QL class for this element. */ @@ -928,7 +857,7 @@ module Unified { final F::Modifier getAModifier() { result = this.getModifier(_) } /** Gets the node corresponding to the field `pattern`. */ - final F::Pattern getPattern() { unified_import_declaration_pattern(this, result) } + final F::Expr getPattern() { unified_import_declaration_pattern(this, result) } /** Gets a field or child node of this node. */ final override F::AstNode getAFieldOrChild() { @@ -939,7 +868,7 @@ module Unified { } /** A class representing `inferred_type_expr` tokens. */ - class InferredTypeExpr extends @unified_token_inferred_type_expr, F::Token, F::TypeExpr { + class InferredTypeExpr extends @unified_token_inferred_type_expr, F::Expr, F::Token { /** Gets the name of the primary QL class for this element. */ final override string getAPrimaryQlClass() { result = "InferredTypeExpr" } } @@ -1038,7 +967,7 @@ module Unified { final override string getAPrimaryQlClass() { result = "MemberAccessExpr" } /** Gets the node corresponding to the field `base`. */ - final F::ExprOrType getBase() { unified_member_access_expr_def(this, result, _) } + final F::Expr getBase() { unified_member_access_expr_def(this, result, _) } /** Gets the node corresponding to the field `member`. */ final F::Identifier getMember() { unified_member_access_expr_def(this, _, result) } @@ -1068,45 +997,28 @@ module Unified { final override F::AstNode getAFieldOrChild() { unified_name_expr_def(this, result) } } - /** A class representing `name_pattern` nodes. */ - class NamePattern extends @unified_name_pattern, F::Pattern { + /** A class representing `named_pattern` nodes. */ + class NamedPattern extends @unified_named_pattern, F::Expr { /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "NamePattern" } + final override string getAPrimaryQlClass() { result = "NamedPattern" } /** Gets the node corresponding to the field `identifier`. */ - final F::Identifier getIdentifier() { unified_name_pattern_def(this, result) } + final F::Identifier getIdentifier() { unified_named_pattern_def(this, result) } /** Gets the node corresponding to the field `modifier`. */ - final F::Modifier getModifier(int i) { unified_name_pattern_modifier(this, i, result) } + final F::Modifier getModifier(int i) { unified_named_pattern_modifier(this, i, result) } /** Gets the node corresponding to the field `modifier`. */ final F::Modifier getAModifier() { result = this.getModifier(_) } /** Gets the node corresponding to the field `sub_pattern`. */ - final F::Pattern getSubPattern() { unified_name_pattern_sub_pattern(this, result) } + final F::Expr getSubPattern() { unified_named_pattern_sub_pattern(this, result) } /** Gets a field or child node of this node. */ final override F::AstNode getAFieldOrChild() { - unified_name_pattern_def(this, result) or - unified_name_pattern_modifier(this, _, result) or - unified_name_pattern_sub_pattern(this, result) - } - } - - /** A class representing `named_type_expr` nodes. */ - class NamedTypeExpr extends @unified_named_type_expr, F::TypeExpr { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "NamedTypeExpr" } - - /** Gets the node corresponding to the field `name`. */ - final F::Identifier getName() { unified_named_type_expr_def(this, result) } - - /** Gets the node corresponding to the field `qualifier`. */ - final F::TypeExpr getQualifier() { unified_named_type_expr_qualifier(this, result) } - - /** Gets a field or child node of this node. */ - final override F::AstNode getAFieldOrChild() { - unified_named_type_expr_def(this, result) or unified_named_type_expr_qualifier(this, result) + unified_named_pattern_def(this, result) or + unified_named_pattern_modifier(this, _, result) or + unified_named_pattern_sub_pattern(this, result) } } @@ -1144,7 +1056,7 @@ module Unified { } /** A class representing `or_pattern` nodes. */ - class OrPattern extends @unified_or_pattern, F::Pattern { + class OrPattern extends @unified_or_pattern, F::Expr { /** Gets the name of the primary QL class for this element. */ final override string getAPrimaryQlClass() { result = "OrPattern" } @@ -1155,10 +1067,10 @@ module Unified { final F::Modifier getAModifier() { result = this.getModifier(_) } /** Gets the node corresponding to the field `pattern`. */ - final F::Pattern getPattern(int i) { unified_or_pattern_pattern(this, i, result) } + final F::Expr getPattern(int i) { unified_or_pattern_pattern(this, i, result) } /** Gets the node corresponding to the field `pattern`. */ - final F::Pattern getAPattern() { result = this.getPattern(_) } + final F::Expr getAPattern() { result = this.getPattern(_) } /** Gets a field or child node of this node. */ final override F::AstNode getAFieldOrChild() { @@ -1184,10 +1096,10 @@ module Unified { final F::Modifier getAModifier() { result = this.getModifier(_) } /** Gets the node corresponding to the field `pattern`. */ - final F::Pattern getPattern() { unified_parameter_pattern(this, result) } + final F::Expr getPattern() { unified_parameter_pattern(this, result) } /** Gets the node corresponding to the field `type`. */ - final F::TypeExpr getType() { unified_parameter_type(this, result) } + final F::Expr getType() { unified_parameter_type(this, result) } /** Gets a field or child node of this node. */ final override F::AstNode getAFieldOrChild() { @@ -1199,40 +1111,13 @@ module Unified { } } - class Pattern extends @unified_pattern, F::Expr { } - - /** A class representing `pattern_element` nodes. */ - class PatternElement extends @unified_pattern_element, F::AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "PatternElement" } - - /** Gets the node corresponding to the field `key`. */ - final F::Identifier getKey() { unified_pattern_element_key(this, result) } - - /** Gets the node corresponding to the field `modifier`. */ - final F::Modifier getModifier(int i) { unified_pattern_element_modifier(this, i, result) } - - /** Gets the node corresponding to the field `modifier`. */ - final F::Modifier getAModifier() { result = this.getModifier(_) } - - /** Gets the node corresponding to the field `pattern`. */ - final F::Pattern getPattern() { unified_pattern_element_def(this, result) } - - /** Gets a field or child node of this node. */ - final override F::AstNode getAFieldOrChild() { - unified_pattern_element_key(this, result) or - unified_pattern_element_modifier(this, _, result) or - unified_pattern_element_def(this, result) - } - } - /** A class representing `pattern_guard_expr` nodes. */ class PatternGuardExpr extends @unified_pattern_guard_expr, F::Expr { /** Gets the name of the primary QL class for this element. */ final override string getAPrimaryQlClass() { result = "PatternGuardExpr" } /** Gets the node corresponding to the field `pattern`. */ - final F::Pattern getPattern() { unified_pattern_guard_expr_def(this, result, _) } + final F::Expr getPattern() { unified_pattern_guard_expr_def(this, result, _) } /** Gets the node corresponding to the field `value`. */ final F::Expr getValue() { unified_pattern_guard_expr_def(this, _, result) } @@ -1303,7 +1188,7 @@ module Unified { final F::Modifier getAModifier() { result = this.getModifier(_) } /** Gets the node corresponding to the field `pattern`. */ - final F::Pattern getPattern() { unified_switch_case_pattern(this, result) } + final F::Expr getPattern() { unified_switch_case_pattern(this, result) } /** Gets a field or child node of this node. */ final override F::AstNode getAFieldOrChild() { @@ -1399,73 +1284,15 @@ module Unified { final override string getAPrimaryQlClass() { result = "TupleExpr" } /** Gets the node corresponding to the field `element`. */ - final F::Expr getElement(int i) { unified_tuple_expr_element(this, i, result) } + final F::Argument getElement(int i) { unified_tuple_expr_element(this, i, result) } /** Gets the node corresponding to the field `element`. */ - final F::Expr getAnElement() { result = this.getElement(_) } + final F::Argument getAnElement() { result = this.getElement(_) } /** Gets a field or child node of this node. */ final override F::AstNode getAFieldOrChild() { unified_tuple_expr_element(this, _, result) } } - /** A class representing `tuple_pattern` nodes. */ - class TuplePattern extends @unified_tuple_pattern, F::Pattern { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "TuplePattern" } - - /** Gets the node corresponding to the field `element`. */ - final F::PatternElement getElement(int i) { unified_tuple_pattern_element(this, i, result) } - - /** Gets the node corresponding to the field `element`. */ - final F::PatternElement getAnElement() { result = this.getElement(_) } - - /** Gets the node corresponding to the field `modifier`. */ - final F::Modifier getModifier(int i) { unified_tuple_pattern_modifier(this, i, result) } - - /** Gets the node corresponding to the field `modifier`. */ - final F::Modifier getAModifier() { result = this.getModifier(_) } - - /** Gets a field or child node of this node. */ - final override F::AstNode getAFieldOrChild() { - unified_tuple_pattern_element(this, _, result) or - unified_tuple_pattern_modifier(this, _, result) - } - } - - /** A class representing `tuple_type_element` nodes. */ - class TupleTypeElement extends @unified_tuple_type_element, F::AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "TupleTypeElement" } - - /** Gets the node corresponding to the field `name`. */ - final F::Identifier getName() { unified_tuple_type_element_name(this, result) } - - /** Gets the node corresponding to the field `type`. */ - final F::TypeExpr getType() { unified_tuple_type_element_def(this, result) } - - /** Gets a field or child node of this node. */ - final override F::AstNode getAFieldOrChild() { - unified_tuple_type_element_name(this, result) or unified_tuple_type_element_def(this, result) - } - } - - /** A class representing `tuple_type_expr` nodes. */ - class TupleTypeExpr extends @unified_tuple_type_expr, F::TypeExpr { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "TupleTypeExpr" } - - /** Gets the node corresponding to the field `element`. */ - final F::TupleTypeElement getElement(int i) { unified_tuple_type_expr_element(this, i, result) } - - /** Gets the node corresponding to the field `element`. */ - final F::TupleTypeElement getAnElement() { result = this.getElement(_) } - - /** Gets a field or child node of this node. */ - final override F::AstNode getAFieldOrChild() { - unified_tuple_type_expr_element(this, _, result) - } - } - /** A class representing `type_alias_declaration` nodes. */ class TypeAliasDeclaration extends @unified_type_alias_declaration, F::Member, F::Stmt { /** Gets the name of the primary QL class for this element. */ @@ -1483,7 +1310,7 @@ module Unified { final F::Identifier getName() { unified_type_alias_declaration_def(this, result, _) } /** Gets the node corresponding to the field `type`. */ - final F::TypeExpr getType() { unified_type_alias_declaration_def(this, _, result) } + final F::Expr getType() { unified_type_alias_declaration_def(this, _, result) } /** Gets the node corresponding to the field `type_constraint`. */ final F::TypeConstraint getTypeConstraint(int i) { @@ -1523,7 +1350,7 @@ module Unified { final F::InfixOperator getOperator() { unified_type_cast_expr_def(this, _, result, _) } /** Gets the node corresponding to the field `type`. */ - final F::TypeExpr getType() { unified_type_cast_expr_def(this, _, _, result) } + final F::Expr getType() { unified_type_cast_expr_def(this, _, _, result) } /** Gets a field or child node of this node. */ final override F::AstNode getAFieldOrChild() { @@ -1535,15 +1362,13 @@ module Unified { class TypeConstraint extends @unified_type_constraint, F::AstNode { } - class TypeExpr extends @unified_type_expr, F::ExprOrType { } - /** A class representing `type_parameter` nodes. */ class TypeParameter extends @unified_type_parameter, F::AstNode { /** Gets the name of the primary QL class for this element. */ final override string getAPrimaryQlClass() { result = "TypeParameter" } /** Gets the node corresponding to the field `bound`. */ - final F::TypeExpr getBound() { unified_type_parameter_bound(this, result) } + final F::Expr getBound() { unified_type_parameter_bound(this, result) } /** Gets the node corresponding to the field `modifier`. */ final F::Modifier getModifier(int i) { unified_type_parameter_modifier(this, i, result) } @@ -1568,37 +1393,19 @@ module Unified { final override string getAPrimaryQlClass() { result = "TypeTestExpr" } /** Gets the node corresponding to the field `expr`. */ - final F::Expr getExpr() { unified_type_test_expr_def(this, result, _, _) } + final F::Expr getExpr() { unified_type_test_expr_def(this, result, _) } /** Gets the node corresponding to the field `operator`. */ - final F::InfixOperator getOperator() { unified_type_test_expr_def(this, _, result, _) } - - /** Gets the node corresponding to the field `type`. */ - final F::TypeExpr getType() { unified_type_test_expr_def(this, _, _, result) } - - /** Gets a field or child node of this node. */ - final override F::AstNode getAFieldOrChild() { - unified_type_test_expr_def(this, result, _, _) or - unified_type_test_expr_def(this, _, result, _) or - unified_type_test_expr_def(this, _, _, result) - } - } - - /** A class representing `type_test_pattern` nodes. */ - class TypeTestPattern extends @unified_type_test_pattern, F::AstNode { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "TypeTestPattern" } - - /** Gets the node corresponding to the field `pattern`. */ - final F::Pattern getPattern() { unified_type_test_pattern_def(this, result, _) } + final F::InfixOperator getOperator() { unified_type_test_expr_operator(this, result) } /** Gets the node corresponding to the field `type`. */ - final F::TypeExpr getType() { unified_type_test_pattern_def(this, _, result) } + final F::Expr getType() { unified_type_test_expr_def(this, _, result) } /** Gets a field or child node of this node. */ final override F::AstNode getAFieldOrChild() { - unified_type_test_pattern_def(this, result, _) or - unified_type_test_pattern_def(this, _, result) + unified_type_test_expr_def(this, result, _) or + unified_type_test_expr_operator(this, result) or + unified_type_test_expr_def(this, _, result) } } @@ -1639,9 +1446,7 @@ module Unified { } /** A class representing `unsupported_node` tokens. */ - class UnsupportedNode extends @unified_token_unsupported_node, F::Expr, F::Member, F::Pattern, - F::Token, F::TypeExpr - { + class UnsupportedNode extends @unified_token_unsupported_node, F::Expr, F::Member, F::Token { /** Gets the name of the primary QL class for this element. */ final override string getAPrimaryQlClass() { result = "UnsupportedNode" } } @@ -1658,10 +1463,10 @@ module Unified { final F::Modifier getAModifier() { result = this.getModifier(_) } /** Gets the node corresponding to the field `pattern`. */ - final F::Pattern getPattern() { unified_variable_declaration_def(this, result) } + final F::Expr getPattern() { unified_variable_declaration_def(this, result) } /** Gets the node corresponding to the field `type`. */ - final F::TypeExpr getType() { unified_variable_declaration_type(this, result) } + final F::Expr getType() { unified_variable_declaration_type(this, result) } /** Gets the node corresponding to the field `value`. */ final F::Expr getValue() { unified_variable_declaration_value(this, result) } @@ -1798,12 +1603,6 @@ module Unified { or result = node.(ConstructorDeclaration).getParameter(i) and name = "getParameter" or - result = node.(ConstructorPattern).getConstructor() and i = -1 and name = "getConstructor" - or - result = node.(ConstructorPattern).getElement(i) and name = "getElement" - or - result = node.(ConstructorPattern).getModifier(i) and name = "getModifier" - or result = node.(ContinueExpr).getLabel() and i = -1 and name = "getLabel" or result = node.(DestructorDeclaration).getBody() and i = -1 and name = "getBody" @@ -1820,8 +1619,6 @@ module Unified { or result = node.(EqualityTypeConstraint).getRight() and i = -1 and name = "getRight" or - result = node.(ExprEqualityPattern).getExpr() and i = -1 and name = "getExpr" - or result = node.(ForEachStmt).getBody() and i = -1 and name = "getBody" or result = node.(ForEachStmt).getGuard() and i = -1 and name = "getGuard" @@ -1856,10 +1653,6 @@ module Unified { or result = node.(FunctionExpr).getReturnType() and i = -1 and name = "getReturnType" or - result = node.(FunctionTypeExpr).getParameter(i) and name = "getParameter" - or - result = node.(FunctionTypeExpr).getReturnType() and i = -1 and name = "getReturnType" - or result = node.(GenericTypeExpr).getBase() and i = -1 and name = "getBase" or result = node.(GenericTypeExpr).getTypeArgument(i) and name = "getTypeArgument" @@ -1900,15 +1693,11 @@ module Unified { or result = node.(NameExpr).getIdentifier() and i = -1 and name = "getIdentifier" or - result = node.(NamePattern).getIdentifier() and i = -1 and name = "getIdentifier" - or - result = node.(NamePattern).getModifier(i) and name = "getModifier" - or - result = node.(NamePattern).getSubPattern() and i = -1 and name = "getSubPattern" + result = node.(NamedPattern).getIdentifier() and i = -1 and name = "getIdentifier" or - result = node.(NamedTypeExpr).getName() and i = -1 and name = "getName" + result = node.(NamedPattern).getModifier(i) and name = "getModifier" or - result = node.(NamedTypeExpr).getQualifier() and i = -1 and name = "getQualifier" + result = node.(NamedPattern).getSubPattern() and i = -1 and name = "getSubPattern" or result = node.(OperatorSyntaxDeclaration).getFixity() and i = -1 and name = "getFixity" or @@ -1934,12 +1723,6 @@ module Unified { or result = node.(Parameter).getType() and i = -1 and name = "getType" or - result = node.(PatternElement).getKey() and i = -1 and name = "getKey" - or - result = node.(PatternElement).getModifier(i) and name = "getModifier" - or - result = node.(PatternElement).getPattern() and i = -1 and name = "getPattern" - or result = node.(PatternGuardExpr).getPattern() and i = -1 and name = "getPattern" or result = node.(PatternGuardExpr).getValue() and i = -1 and name = "getValue" @@ -1970,16 +1753,6 @@ module Unified { or result = node.(TupleExpr).getElement(i) and name = "getElement" or - result = node.(TuplePattern).getElement(i) and name = "getElement" - or - result = node.(TuplePattern).getModifier(i) and name = "getModifier" - or - result = node.(TupleTypeElement).getName() and i = -1 and name = "getName" - or - result = node.(TupleTypeElement).getType() and i = -1 and name = "getType" - or - result = node.(TupleTypeExpr).getElement(i) and name = "getElement" - or result = node.(TypeAliasDeclaration).getModifier(i) and name = "getModifier" or result = node.(TypeAliasDeclaration).getName() and i = -1 and name = "getName" @@ -2008,10 +1781,6 @@ module Unified { or result = node.(TypeTestExpr).getType() and i = -1 and name = "getType" or - result = node.(TypeTestPattern).getPattern() and i = -1 and name = "getPattern" - or - result = node.(TypeTestPattern).getType() and i = -1 and name = "getType" - or result = node.(UnaryExpr).getOperand() and i = -1 and name = "getOperand" or result = node.(UnaryExpr).getOperator() and i = -1 and name = "getOperator" @@ -2087,8 +1856,6 @@ module UnifiedFinal { final class ConstructorDeclaration = F::ConstructorDeclaration; - final class ConstructorPattern = F::ConstructorPattern; - final class ContinueExpr = F::ContinueExpr; final class DestructorDeclaration = F::DestructorDeclaration; @@ -2101,12 +1868,8 @@ module UnifiedFinal { final class Expr = F::Expr; - final class ExprEqualityPattern = F::ExprEqualityPattern; - final class ExprOrOperator = F::ExprOrOperator; - final class ExprOrType = F::ExprOrType; - final class Fixity = F::Fixity; final class FloatLiteral = F::FloatLiteral; @@ -2117,8 +1880,6 @@ module UnifiedFinal { final class FunctionExpr = F::FunctionExpr; - final class FunctionTypeExpr = F::FunctionTypeExpr; - final class GenericTypeExpr = F::GenericTypeExpr; final class GuardIfStmt = F::GuardIfStmt; @@ -2127,8 +1888,6 @@ module UnifiedFinal { final class IfExpr = F::IfExpr; - final class IgnorePattern = F::IgnorePattern; - final class ImportDeclaration = F::ImportDeclaration; final class InferredTypeExpr = F::InferredTypeExpr; @@ -2153,9 +1912,7 @@ module UnifiedFinal { final class NameExpr = F::NameExpr; - final class NamePattern = F::NamePattern; - - final class NamedTypeExpr = F::NamedTypeExpr; + final class NamedPattern = F::NamedPattern; final class Operator = F::Operator; @@ -2165,10 +1922,6 @@ module UnifiedFinal { final class Parameter = F::Parameter; - final class Pattern = F::Pattern; - - final class PatternElement = F::PatternElement; - final class PatternGuardExpr = F::PatternGuardExpr; final class PostfixOperator = F::PostfixOperator; @@ -2197,26 +1950,16 @@ module UnifiedFinal { final class TupleExpr = F::TupleExpr; - final class TuplePattern = F::TuplePattern; - - final class TupleTypeElement = F::TupleTypeElement; - - final class TupleTypeExpr = F::TupleTypeExpr; - final class TypeAliasDeclaration = F::TypeAliasDeclaration; final class TypeCastExpr = F::TypeCastExpr; final class TypeConstraint = F::TypeConstraint; - final class TypeExpr = F::TypeExpr; - final class TypeParameter = F::TypeParameter; final class TypeTestExpr = F::TypeTestExpr; - final class TypeTestPattern = F::TypeTestPattern; - final class UnaryExpr = F::UnaryExpr; final class UnresolvedOperatorSequence = F::UnresolvedOperatorSequence; diff --git a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll index 15db0eb3836e..2e4a7dfc4c3a 100644 --- a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll @@ -128,7 +128,6 @@ private module Ast implements AstSig { // TODO support foreach guard // - // TODO: Expr != Pattern Expr getVariable() { result = super.getPattern() } Expr getCollection() { result = super.getIterable() } diff --git a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll index 3da8de4b8f03..3262de611441 100644 --- a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll +++ b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll @@ -74,14 +74,4 @@ module Unified { ) } } - - /** The base class for all patterns. */ - class Pattern extends G::Pattern { - /** Gets the immediately-enclosing pattern in which this is a nested pattern. */ - Pattern getEnclosingPattern() { - result = this.getParent() - or - result = this.getParent().(PatternElement).getParent() - } - } } diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index 5a44080464cc..870612cf3ebc 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -168,7 +168,7 @@ private module LocalNameBindingInput implements LocalNameBindingInputSig Date: Wed, 2 Sep 2026 14:12:21 +0200 Subject: [PATCH 0655/2098] Include actions.lock in baseline paths Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- actions/extractor/tools/baseline-config.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/actions/extractor/tools/baseline-config.json b/actions/extractor/tools/baseline-config.json index fde0bd1ecdff..5c0044c8d9d8 100644 --- a/actions/extractor/tools/baseline-config.json +++ b/actions/extractor/tools/baseline-config.json @@ -5,6 +5,7 @@ ".github/reusable_workflows/**/*.yml", ".github/reusable_workflows/**/*.yaml", "**/action.yml", - "**/action.yaml" + "**/action.yaml", + "**/actions.lock" ] } From dd005e51f3027230dc5611dd982b3fc0c39261d3 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Wed, 2 Sep 2026 08:15:06 -0400 Subject: [PATCH 0656/2098] chore: applies review suggestion Co-authored-by: Michael Nebel --- csharp/ql/lib/Linq/Helpers.qll | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/csharp/ql/lib/Linq/Helpers.qll b/csharp/ql/lib/Linq/Helpers.qll index 2909c6696a73..ad4e83e91ba6 100644 --- a/csharp/ql/lib/Linq/Helpers.qll +++ b/csharp/ql/lib/Linq/Helpers.qll @@ -21,21 +21,23 @@ private int numStmts(ForeachStmt fes) { } private predicate terminatesCallable(Stmt s) { - s.stripSingletonBlocks() instanceof ReturnStmt - or - s.stripSingletonBlocks() instanceof YieldBreakStmt - or - s.stripSingletonBlocks() instanceof ThrowStmt - or - s.stripSingletonBlocks() instanceof BreakStmt - or - exists(BlockStmt b | b = s.stripSingletonBlocks() | terminatesCallable(b.getLastStmt())) - or - exists(IfStmt nested | - nested = s.stripSingletonBlocks() and - exists(nested.getElse()) and - terminatesCallable(nested.getThen()) and - terminatesCallable(nested.getElse()) + exists(Stmt stripped | stripped = s.stripSingletonBlocks() | + stripped instanceof ReturnStmt + or + stripped instanceof YieldBreakStmt + or + stripped instanceof ThrowStmt + or + stripped instanceof BreakStmt + or + stripped = any(BlockStmt b | terminatesCallable(b.getLastStmt())) + or + stripped = + any(IfStmt nested | + exists(nested.getElse()) and + terminatesCallable(nested.getThen()) and + terminatesCallable(nested.getElse()) + ) ) } From d06e55c6239145353c7382a42882a48e6a10bd04 Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 2 Sep 2026 14:26:12 +0200 Subject: [PATCH 0657/2098] unified: Preserve 'var' and 'let' pattern modifiers in AST --- unified/extractor/ast_types.yml | 6 ++ .../extractor/src/languages/swift/swift.rs | 8 +- ...t-with-shadowing-in-condition-value.output | 84 ++++++++++++++++++- ...et-with-shadowing-in-condition-value.swift | 4 + .../nested-enum-case-pattern.output | 54 ++++++------ .../switch-case-item-where-clauses.output | 14 +++- .../switch-with-binding-pattern.output | 14 +++- ...with-labeled-case-pattern-arguments.output | 7 +- .../catch-where-clauses.output | 14 +++- .../optional-enum-case-binding.output | 7 +- .../ql/lib/codeql/unified/internal/Ast.qll | 26 ++++++ .../unified/internal/LocalNameBinding.qll | 2 + unified/ql/lib/unified.dbscheme | 16 +++- 13 files changed, 210 insertions(+), 46 deletions(-) diff --git a/unified/extractor/ast_types.yml b/unified/extractor/ast_types.yml index 167829166795..b6f1d6bcfa79 100644 --- a/unified/extractor/ast_types.yml +++ b/unified/extractor/ast_types.yml @@ -2,6 +2,7 @@ supertypes: expr: - name_expr - named_pattern + - expr_pattern - int_literal - float_literal - boolean_literal @@ -106,6 +107,11 @@ named: identifier: identifier sub_pattern?: expr + # A pattern expression with modifiers, such as `let x` or `var x`. + expr_pattern: + modifier*: modifier + expr: expr + # An integer literal int_literal: diff --git a/unified/extractor/src/languages/swift/swift.rs b/unified/extractor/src/languages/swift/swift.rs index 9f389c66650a..6fcaca5f7c5a 100644 --- a/unified/extractor/src/languages/swift/swift.rs +++ b/unified/extractor/src/languages/swift/swift.rs @@ -515,8 +515,12 @@ fn translation_rules() -> Vec> { (named_pattern identifier: (identifier #{name})) ), // A `let`/`var` value-binding pattern (`let x`) inside a case or `if case` - // introduces a new binding; it unwraps to its inner expression. - rule!((valueBindingPattern pattern: @p) => pattern { p }), + // preserves the binding specifier around its inner pattern. + rule!( + (valueBindingPattern bindingSpecifier: @@spec pattern: @p) + => + (expr_pattern modifier: (modifier #{spec}) expr: {p}) + ), // A tuple destructuring pattern (`let (a, b) = …`). A labelled element // (`let (x: a) = …`) carries its label through as the `argument` name; // unlabelled elements have no name. diff --git a/unified/extractor/tests/corpus/swift/control-flow/if-case-let-with-shadowing-in-condition-value.output b/unified/extractor/tests/corpus/swift/control-flow/if-case-let-with-shadowing-in-condition-value.output index 808b1dd610c9..68181bb1b334 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/if-case-let-with-shadowing-in-condition-value.output +++ b/unified/extractor/tests/corpus/swift/control-flow/if-case-let-with-shadowing-in-condition-value.output @@ -2,6 +2,10 @@ if case let x = x + 10 { print(x) } +if case var y = y + 10 { + y += 1 +} + --- sourceFile @@ -57,6 +61,54 @@ sourceFile bindingSpecifier: let caseKeyword: case ifKeyword: if + codeBlockItem + item: + expressionStmt + expression: + ifExpr + body: + codeBlock + leftBrace: { + rightBrace: } + statements: + codeBlockItem + item: + infixOperatorExpr + operator: + binaryOperatorExpr + operator: binaryOperator "+=" + leftOperand: + declReferenceExpr + baseName: identifier "y" + rightOperand: + integerLiteralExpr + literal: integerLiteral "1" + conditions: + conditionElement + condition: + matchingPatternCondition + initializer: + initializerClause + equal: = + value: + infixOperatorExpr + operator: + binaryOperatorExpr + operator: binaryOperator "+" + leftOperand: + declReferenceExpr + baseName: identifier "y" + rightOperand: + integerLiteralExpr + literal: integerLiteral "10" + pattern: + valueBindingPattern + pattern: + identifierPattern + identifier: identifier "y" + bindingSpecifier: var + caseKeyword: case + ifKeyword: if --- @@ -68,8 +120,11 @@ top_level condition: pattern_guard_expr pattern: - named_pattern - identifier: identifier "x" + expr_pattern + modifier: modifier "let" + expr: + named_pattern + identifier: identifier "x" value: binary_expr left: @@ -89,3 +144,28 @@ top_level value: name_expr identifier: identifier "x" + if_expr + condition: + pattern_guard_expr + pattern: + expr_pattern + modifier: modifier "var" + expr: + named_pattern + identifier: identifier "y" + value: + binary_expr + left: + name_expr + identifier: identifier "y" + operator: infix_operator "+" + right: int_literal "10" + then: + block + stmt: + compound_assign_expr + target: + name_expr + identifier: identifier "y" + operator: infix_operator "+=" + value: int_literal "1" diff --git a/unified/extractor/tests/corpus/swift/control-flow/if-case-let-with-shadowing-in-condition-value.swift b/unified/extractor/tests/corpus/swift/control-flow/if-case-let-with-shadowing-in-condition-value.swift index c57c8ae5b67c..0939555e91ad 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/if-case-let-with-shadowing-in-condition-value.swift +++ b/unified/extractor/tests/corpus/swift/control-flow/if-case-let-with-shadowing-in-condition-value.swift @@ -1,3 +1,7 @@ if case let x = x + 10 { print(x) } + +if case var y = y + 10 { + y += 1 +} diff --git a/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output b/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output index c6eae5b793f0..fd2230d05c9d 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output +++ b/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output @@ -166,28 +166,31 @@ top_level case: switch_case pattern: - call_expr - callee: - member_access_expr - base: inferred_type_expr "." - member: identifier "received" - argument: - argument - value: - call_expr - callee: - member_access_expr - base: inferred_type_expr "." - member: identifier "some" - argument: - argument - value: - named_pattern - identifier: identifier "value" - argument - value: - named_pattern - identifier: identifier "timestamp" + expr_pattern + modifier: modifier "let" + expr: + call_expr + callee: + member_access_expr + base: inferred_type_expr "." + member: identifier "received" + argument: + argument + value: + call_expr + callee: + member_access_expr + base: inferred_type_expr "." + member: identifier "some" + argument: + argument + value: + named_pattern + identifier: identifier "value" + argument + value: + named_pattern + identifier: identifier "timestamp" body: block stmt: @@ -216,8 +219,11 @@ top_level argument: argument value: - named_pattern - identifier: identifier "value" + expr_pattern + modifier: modifier "let" + expr: + named_pattern + identifier: identifier "value" body: block stmt: diff --git a/unified/extractor/tests/corpus/swift/control-flow/switch-case-item-where-clauses.output b/unified/extractor/tests/corpus/swift/control-flow/switch-case-item-where-clauses.output index c60b3ffb7284..045c37f682f6 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/switch-case-item-where-clauses.output +++ b/unified/extractor/tests/corpus/swift/control-flow/switch-case-item-where-clauses.output @@ -170,8 +170,11 @@ top_level operator: infix_operator ">" right: int_literal "0" pattern: - named_pattern - identifier: identifier "x" + expr_pattern + modifier: modifier "let" + expr: + named_pattern + identifier: identifier "x" body: block stmt: @@ -195,8 +198,11 @@ top_level operator: infix_operator "<" right: int_literal "0" pattern: - named_pattern - identifier: identifier "y" + expr_pattern + modifier: modifier "let" + expr: + named_pattern + identifier: identifier "y" int_literal "0" body: block diff --git a/unified/extractor/tests/corpus/swift/control-flow/switch-with-binding-pattern.output b/unified/extractor/tests/corpus/swift/control-flow/switch-with-binding-pattern.output index 3db9aa3ddcc3..02362e80068d 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/switch-with-binding-pattern.output +++ b/unified/extractor/tests/corpus/swift/control-flow/switch-with-binding-pattern.output @@ -134,8 +134,11 @@ top_level argument: argument value: - named_pattern - identifier: identifier "r" + expr_pattern + modifier: modifier "let" + expr: + named_pattern + identifier: identifier "r" body: block stmt: @@ -158,8 +161,11 @@ top_level argument: argument value: - named_pattern - identifier: identifier "s" + expr_pattern + modifier: modifier "let" + expr: + named_pattern + identifier: identifier "s" body: block stmt: diff --git a/unified/extractor/tests/corpus/swift/control-flow/switch-with-labeled-case-pattern-arguments.output b/unified/extractor/tests/corpus/swift/control-flow/switch-with-labeled-case-pattern-arguments.output index 269eed5906ab..61a1096d69b3 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/switch-with-labeled-case-pattern-arguments.output +++ b/unified/extractor/tests/corpus/swift/control-flow/switch-with-labeled-case-pattern-arguments.output @@ -168,8 +168,11 @@ top_level identifier: identifier "_" argument value: - named_pattern - identifier: identifier "rowId" + expr_pattern + modifier: modifier "let" + expr: + named_pattern + identifier: identifier "rowId" body: block stmt: diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/catch-where-clauses.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/catch-where-clauses.output index 7c50ddc7bbf8..c44fbeade974 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/catch-where-clauses.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/catch-where-clauses.output @@ -168,8 +168,11 @@ top_level name_expr identifier: identifier "e" pattern: - named_pattern - identifier: identifier "e" + expr_pattern + modifier: modifier "let" + expr: + named_pattern + identifier: identifier "e" conditional_pattern condition: call_expr @@ -182,8 +185,11 @@ top_level name_expr identifier: identifier "f" pattern: - named_pattern - identifier: identifier "f" + expr_pattern + modifier: modifier "let" + expr: + named_pattern + identifier: identifier "f" body: block stmt: diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.output index 35e1a7319ed2..6ff9453e3296 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.output @@ -98,8 +98,11 @@ top_level argument: argument value: - named_pattern - identifier: identifier "value" + expr_pattern + modifier: modifier "let" + expr: + named_pattern + identifier: identifier "value" value: name_expr identifier: identifier "input" diff --git a/unified/ql/lib/codeql/unified/internal/Ast.qll b/unified/ql/lib/codeql/unified/internal/Ast.qll index cd5f8a7aaf00..3a211b830349 100644 --- a/unified/ql/lib/codeql/unified/internal/Ast.qll +++ b/unified/ql/lib/codeql/unified/internal/Ast.qll @@ -632,6 +632,26 @@ module Unified { class ExprOrOperator extends @unified_expr_or_operator, F::AstNode { } + /** A class representing `expr_pattern` nodes. */ + class ExprPattern extends @unified_expr_pattern, F::Expr { + /** Gets the name of the primary QL class for this element. */ + final override string getAPrimaryQlClass() { result = "ExprPattern" } + + /** Gets the node corresponding to the field `expr`. */ + final F::Expr getExpr() { unified_expr_pattern_def(this, result) } + + /** Gets the node corresponding to the field `modifier`. */ + final F::Modifier getModifier(int i) { unified_expr_pattern_modifier(this, i, result) } + + /** Gets the node corresponding to the field `modifier`. */ + final F::Modifier getAModifier() { result = this.getModifier(_) } + + /** Gets a field or child node of this node. */ + final override F::AstNode getAFieldOrChild() { + unified_expr_pattern_def(this, result) or unified_expr_pattern_modifier(this, _, result) + } + } + /** A class representing `fixity` tokens. */ class Fixity extends @unified_token_fixity, F::AstNode, F::Token { /** Gets the name of the primary QL class for this element. */ @@ -1619,6 +1639,10 @@ module Unified { or result = node.(EqualityTypeConstraint).getRight() and i = -1 and name = "getRight" or + result = node.(ExprPattern).getExpr() and i = -1 and name = "getExpr" + or + result = node.(ExprPattern).getModifier(i) and name = "getModifier" + or result = node.(ForEachStmt).getBody() and i = -1 and name = "getBody" or result = node.(ForEachStmt).getGuard() and i = -1 and name = "getGuard" @@ -1870,6 +1894,8 @@ module UnifiedFinal { final class ExprOrOperator = F::ExprOrOperator; + final class ExprPattern = F::ExprPattern; + final class Fixity = F::Fixity; final class FloatLiteral = F::FloatLiteral; diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index 870612cf3ebc..0aaf3c017f9e 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -285,6 +285,8 @@ private module LocalNameBindingInput implements LocalNameBindingInputSig Date: Wed, 2 Sep 2026 12:34:45 +0000 Subject: [PATCH 0658/2098] Bazel: Factor out the shared attributes --- misc/bazel/lfs.bzl | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/misc/bazel/lfs.bzl b/misc/bazel/lfs.bzl index a07dd52ea0d8..c0e2cd7a8b12 100644 --- a/misc/bazel/lfs.bzl +++ b/misc/bazel/lfs.bzl @@ -96,18 +96,21 @@ def _download_lfs(repository_ctx): 'alias(name = "file", actual = "//:%s", visibility = ["//visibility:public"])\n' % name, ) +_lfs_archive_attrs = { + "build_file": attr.label(doc = "The file to use as the BUILD file for this repository. " + + "Either build_file or build_file_content can be specified, but not both."), + "build_file_content": attr.string(doc = "The content for the BUILD file for this repository. " + + "Either build_file or build_file_content can be specified, but not both."), + "strip_prefix": attr.string(default = "", doc = "A directory prefix to strip from the extracted files."), +} + lfs_archive = repository_rule( doc = "Export the contents from an on-demand LFS archive. The corresponding path should be added to be ignored " + "in `.lfsconfig`.", implementation = _download_and_extract_lfs_archive, attrs = { "src": attr.label(mandatory = True, doc = "Local path to the LFS archive to extract."), - "build_file_content": attr.string(doc = "The content for the BUILD file for this repository. " + - "Either build_file or build_file_content can be specified, but not both."), - "build_file": attr.label(doc = "The file to use as the BUILD file for this repository. " + - "Either build_file or build_file_content can be specified, but not both."), - "strip_prefix": attr.string(default = "", doc = "A directory prefix to strip from the extracted files."), - }, + } | _lfs_archive_attrs, ) lfs_archives = repository_rule( @@ -115,13 +118,8 @@ lfs_archives = repository_rule( "in `.lfsconfig`.", implementation = _download_and_extract_lfs_archives, attrs = { - "build_file": attr.label(doc = "The file to use as the BUILD file for this repository. " + - "Either build_file or build_file_content can be specified, but not both."), - "build_file_content": attr.string(doc = "The content for the BUILD file for this repository. " + - "Either build_file or build_file_content can be specified, but not both."), "srcs": attr.label_list(doc = "Local paths to the LFS archives to extract in order.", mandatory = True), - "strip_prefix": attr.string(default = "", doc = "A directory prefix to strip from the extracted files."), - }, + } | _lfs_archive_attrs, ) lfs_files = repository_rule( From d6ffc18f790e52831a546c0b1bafc91284be7da2 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Wed, 2 Sep 2026 09:12:32 -0400 Subject: [PATCH 0659/2098] docs: removes additional cases to avoid the page being too long Signed-off-by: Vincent Biret --- .../ql/src/Linq/MissedWhereOpportunity.qhelp | 2 +- .../ql/src/Linq/MissedWhereOpportunityGood.cs | 20 ------------------- 2 files changed, 1 insertion(+), 21 deletions(-) diff --git a/csharp/ql/src/Linq/MissedWhereOpportunity.qhelp b/csharp/ql/src/Linq/MissedWhereOpportunity.qhelp index f8f2769b0812..53ac540441c4 100644 --- a/csharp/ql/src/Linq/MissedWhereOpportunity.qhelp +++ b/csharp/ql/src/Linq/MissedWhereOpportunity.qhelp @@ -31,7 +31,7 @@ on the even ones.

    This is far better expressed using the Where method.

    -

    The following examples should not use Where, because the matching branch exits the +

    The following example should not use Where, because the matching branch exits the method or iterator instead of continuing with filtered loop work.

    diff --git a/csharp/ql/src/Linq/MissedWhereOpportunityGood.cs b/csharp/ql/src/Linq/MissedWhereOpportunityGood.cs index da28fd6e79f1..b96db876583a 100644 --- a/csharp/ql/src/Linq/MissedWhereOpportunityGood.cs +++ b/csharp/ql/src/Linq/MissedWhereOpportunityGood.cs @@ -10,24 +10,4 @@ class MissedWhereOpportunityGood return null; } - - public System.Collections.Generic.IEnumerable ValuesUntilFirstEven(System.Collections.Generic.IEnumerable values) - { - foreach (int value in values) - { - if (value % 2 == 0) - yield break; - - yield return value; - } - } - - public void ThrowOnFirstEven(System.Collections.Generic.IEnumerable values) - { - foreach (int value in values) - { - if (value % 2 == 0) - throw new System.InvalidOperationException("Unexpected even value."); - } - } } From baab7592782f40626f8943ae781934a5ca5a5ac3 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Wed, 2 Sep 2026 09:14:13 -0400 Subject: [PATCH 0660/2098] chore: applies review suggestion Co-authored-by: Michael Nebel --- csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.ql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.ql b/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.ql index adf0149478ac..d166eb440603 100644 --- a/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.ql +++ b/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.ql @@ -18,5 +18,5 @@ import Linq.Helpers from ForeachStmtGenericEnumerable fes, IfStmt is, ReturnStmt ret, ReturnStmt defaultRet where missedFirstOrDefaultOpportunity(fes, is, ret, defaultRet) select fes, - "This foreach loop $@ - consider finding the element explicitly using '.FirstOrDefault(...)'.", - is.getCondition(), "returns the first sequence element satisfying a predicate" + "This foreach loop returns the first sequence element satisfying a $@ - consider finding the element explicitly using '.FirstOrDefault(...)'.", + is.getCondition(), "predicate" From a52c2cb24d762a19ac75675f904d84e5caa06774 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Wed, 2 Sep 2026 09:14:30 -0400 Subject: [PATCH 0661/2098] chore: applies review suggestion Co-authored-by: Michael Nebel --- csharp/ql/lib/Linq/Helpers.qll | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/csharp/ql/lib/Linq/Helpers.qll b/csharp/ql/lib/Linq/Helpers.qll index 870f328ea5b0..a1ffd30ee5bc 100644 --- a/csharp/ql/lib/Linq/Helpers.qll +++ b/csharp/ql/lib/Linq/Helpers.qll @@ -28,8 +28,11 @@ private predicate returnsLoopVariable(ForeachStmt fes, Stmt s, ReturnStmt ret) { private predicate hasNullDefault(Type t) { t.isRefType() or t instanceof NullableType } private predicate returnsDefaultValue(ForeachStmt fes, ReturnStmt ret) { - exists(Type elementType | - elementType = fes.getVariable().getType() | + exists(BlockStmt enclosingBlock, int i, Type elementType | + enclosingBlock.getStmt(i) = fes and + enclosingBlock.getStmt(i + 1) = ret and + elementType = fes.getVariable().getType() + | ret.getExpr().stripCasts() instanceof NullLiteral and hasNullDefault(elementType) or From 6744d560243caf312907f70a3eae1541b757b869 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Wed, 2 Sep 2026 09:16:33 -0400 Subject: [PATCH 0662/2098] chore: reverts addition to ruleset --- csharp/ql/src/codeql-suites/csharp-security-and-quality.qls | 1 - 1 file changed, 1 deletion(-) diff --git a/csharp/ql/src/codeql-suites/csharp-security-and-quality.qls b/csharp/ql/src/codeql-suites/csharp-security-and-quality.qls index c86e286862ec..9700c8b03410 100644 --- a/csharp/ql/src/codeql-suites/csharp-security-and-quality.qls +++ b/csharp/ql/src/codeql-suites/csharp-security-and-quality.qls @@ -51,7 +51,6 @@ - cs/linq/inconsistent-enumeration - cs/linq/missed-all - cs/linq/missed-cast - - cs/linq/missed-firstordefault - cs/linq/missed-oftype - cs/linq/missed-select - cs/linq/missed-where From c97f0f4b3059e4e772a63df44124d3a0ee522393 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Wed, 2 Sep 2026 09:22:20 -0400 Subject: [PATCH 0663/2098] chore: applies review suggestions --- csharp/ql/lib/Linq/Helpers.qll | 16 ++++++---------- .../src/Linq/MissedFirstOrDefaultOpportunity.cs | 7 +++++-- .../src/Linq/MissedFirstOrDefaultOpportunity.ql | 4 ++-- .../Linq/MissedFirstOrDefaultOpportunityFix.cs | 8 ++++++-- .../Linq/MissedFirstOrDefaultOpportunityGood.cs | 17 ++++++++++------- .../MissedFirstOrDefaultOpportunity.expected | 10 +++++----- 6 files changed, 34 insertions(+), 28 deletions(-) diff --git a/csharp/ql/lib/Linq/Helpers.qll b/csharp/ql/lib/Linq/Helpers.qll index a1ffd30ee5bc..7739ad610d09 100644 --- a/csharp/ql/lib/Linq/Helpers.qll +++ b/csharp/ql/lib/Linq/Helpers.qll @@ -28,9 +28,7 @@ private predicate returnsLoopVariable(ForeachStmt fes, Stmt s, ReturnStmt ret) { private predicate hasNullDefault(Type t) { t.isRefType() or t instanceof NullableType } private predicate returnsDefaultValue(ForeachStmt fes, ReturnStmt ret) { - exists(BlockStmt enclosingBlock, int i, Type elementType | - enclosingBlock.getStmt(i) = fes and - enclosingBlock.getStmt(i + 1) = ret and + exists(Type elementType | elementType = fes.getVariable().getType() | ret.getExpr().stripCasts() instanceof NullLiteral and @@ -189,9 +187,7 @@ predicate missedWhereOpportunity(ForeachStmtGenericEnumerable fes, IfStmt is) { * That is, the loop contains a single `if` statement that accesses the loop variable, * returns the loop variable when the condition matches, and is followed by a default return. */ -predicate missedFirstOrDefaultOpportunity( - ForeachStmtGenericEnumerable fes, IfStmt is, ReturnStmt ret, ReturnStmt defaultRet -) { +predicate missedFirstOrDefaultOpportunity(ForeachStmtGenericEnumerable fes, IfStmt is) { // The loop only checks whether the current element is the first match. is = firstStmt(fes) and not exists(is.getElse()) and @@ -201,10 +197,10 @@ predicate missedFirstOrDefaultOpportunity( va = is.getCondition().getAChildExpr*() ) and not is.getCondition().getAChildExpr*() instanceof AwaitExpr and - returnsLoopVariable(fes, is.getThen(), ret) and - // If no element matches, the method returns the same value that FirstOrDefault would. - returnsDefaultValue(fes, defaultRet) and - exists(BlockStmt enclosingBlock, int i | + exists(ReturnStmt ret, ReturnStmt defaultRet, BlockStmt enclosingBlock, int i | + returnsLoopVariable(fes, is.getThen(), ret) and + // If no element matches, the method returns the same value that FirstOrDefault would. + returnsDefaultValue(fes, defaultRet) and enclosingBlock.getStmt(i) = fes and enclosingBlock.getStmt(i + 1) = defaultRet ) diff --git a/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.cs b/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.cs index 1a7a1dff6e93..ef968cc7dfd9 100644 --- a/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.cs +++ b/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.cs @@ -1,10 +1,13 @@ +using System; +using System.Collections.Generic; + class MissedFirstOrDefaultOpportunity { - public static Operation FindOperation(System.Collections.Generic.IEnumerable operations, string operationId) + public static Operation FindOperation(IEnumerable operations, string operationId) { foreach (var operation in operations) { - if (string.Equals(operation.OperationId, operationId, System.StringComparison.Ordinal)) + if (string.Equals(operation.OperationId, operationId, StringComparison.Ordinal)) return operation; } diff --git a/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.ql b/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.ql index d166eb440603..705881a73bdf 100644 --- a/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.ql +++ b/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.ql @@ -15,8 +15,8 @@ import csharp import Linq.Helpers -from ForeachStmtGenericEnumerable fes, IfStmt is, ReturnStmt ret, ReturnStmt defaultRet -where missedFirstOrDefaultOpportunity(fes, is, ret, defaultRet) +from ForeachStmtGenericEnumerable fes, IfStmt is +where missedFirstOrDefaultOpportunity(fes, is) select fes, "This foreach loop returns the first sequence element satisfying a $@ - consider finding the element explicitly using '.FirstOrDefault(...)'.", is.getCondition(), "predicate" diff --git a/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunityFix.cs b/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunityFix.cs index ba75401e9a73..3d7818fc0db8 100644 --- a/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunityFix.cs +++ b/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunityFix.cs @@ -1,8 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; + class MissedFirstOrDefaultOpportunityFix { - public static Operation FindOperation(System.Collections.Generic.IEnumerable operations, string operationId) + public static Operation FindOperation(IEnumerable operations, string operationId) { return operations.FirstOrDefault(operation => - string.Equals(operation.OperationId, operationId, System.StringComparison.Ordinal)); + string.Equals(operation.OperationId, operationId, StringComparison.Ordinal)); } } diff --git a/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunityGood.cs b/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunityGood.cs index 17593b87c001..6c65760416de 100644 --- a/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunityGood.cs +++ b/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunityGood.cs @@ -1,32 +1,35 @@ +using System; +using System.Collections.Generic; + class MissedFirstOrDefaultOpportunityGood { - public static Operation FindOperationOrThrow(System.Collections.Generic.IEnumerable operations, string operationId) + public static Operation FindOperationOrThrow(IEnumerable operations, string operationId) { foreach (var operation in operations) { - if (string.Equals(operation.OperationId, operationId, System.StringComparison.Ordinal)) - throw new System.InvalidOperationException("Unexpected operation."); + if (string.Equals(operation.OperationId, operationId, StringComparison.Ordinal)) + throw new InvalidOperationException("Unexpected operation."); } return null; } - public static Operation FindReplacementOperation(System.Collections.Generic.IEnumerable operations, string operationId) + public static Operation FindReplacementOperation(IEnumerable operations, string operationId) { foreach (var operation in operations) { - if (string.Equals(operation.OperationId, operationId, System.StringComparison.Ordinal)) + if (string.Equals(operation.OperationId, operationId, StringComparison.Ordinal)) return operation; } return new Operation(); } - public static string FindOperationId(System.Collections.Generic.IEnumerable operations, string operationId) + public static string FindOperationId(IEnumerable operations, string operationId) { foreach (var operation in operations) { - if (string.Equals(operation.OperationId, operationId, System.StringComparison.Ordinal)) + if (string.Equals(operation.OperationId, operationId, StringComparison.Ordinal)) return operation.OperationId; } diff --git a/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.expected b/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.expected index 70689f5aaeb9..b4cfdff5fdd9 100644 --- a/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.expected +++ b/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.expected @@ -1,5 +1,5 @@ -| MissedFirstOrDefaultOpportunity.cs:10:9:14:9 | foreach (... ... in ...) ... | This foreach loop $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | MissedFirstOrDefaultOpportunity.cs:12:17:12:91 | call to method Equals | returns the first sequence element satisfying a predicate | -| MissedFirstOrDefaultOpportunity.cs:22:9:28:9 | foreach (... ... in ...) ... | This foreach loop $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | MissedFirstOrDefaultOpportunity.cs:24:17:24:25 | ... > ... | returns the first sequence element satisfying a predicate | -| MissedFirstOrDefaultOpportunity.cs:36:9:40:9 | foreach (... ... in ...) ... | This foreach loop $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | MissedFirstOrDefaultOpportunity.cs:38:17:38:25 | ... > ... | returns the first sequence element satisfying a predicate | -| MissedFirstOrDefaultOpportunity.cs:149:9:153:9 | foreach (... ... in ...) ... | This foreach loop $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | MissedFirstOrDefaultOpportunity.cs:151:17:151:32 | ... > ... | returns the first sequence element satisfying a predicate | -| MissedFirstOrDefaultOpportunity.cs:161:9:165:9 | foreach (... ... in ...) ... | This foreach loop $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | MissedFirstOrDefaultOpportunity.cs:163:17:163:25 | ... > ... | returns the first sequence element satisfying a predicate | +| MissedFirstOrDefaultOpportunity.cs:10:9:14:9 | foreach (... ... in ...) ... | This foreach loop returns the first sequence element satisfying a $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | MissedFirstOrDefaultOpportunity.cs:12:17:12:91 | call to method Equals | predicate | +| MissedFirstOrDefaultOpportunity.cs:22:9:28:9 | foreach (... ... in ...) ... | This foreach loop returns the first sequence element satisfying a $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | MissedFirstOrDefaultOpportunity.cs:24:17:24:25 | ... > ... | predicate | +| MissedFirstOrDefaultOpportunity.cs:36:9:40:9 | foreach (... ... in ...) ... | This foreach loop returns the first sequence element satisfying a $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | MissedFirstOrDefaultOpportunity.cs:38:17:38:25 | ... > ... | predicate | +| MissedFirstOrDefaultOpportunity.cs:149:9:153:9 | foreach (... ... in ...) ... | This foreach loop returns the first sequence element satisfying a $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | MissedFirstOrDefaultOpportunity.cs:151:17:151:32 | ... > ... | predicate | +| MissedFirstOrDefaultOpportunity.cs:161:9:165:9 | foreach (... ... in ...) ... | This foreach loop returns the first sequence element satisfying a $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | MissedFirstOrDefaultOpportunity.cs:163:17:163:25 | ... > ... | predicate | From 2dc8ef98001ab505e1da87ab83e72c19bcc8a39d Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Wed, 2 Sep 2026 16:30:35 +0200 Subject: [PATCH 0664/2098] C#: Address some review comments. --- .../DependabotProxy.cs | 11 ++++++--- .../DependabotProxy.cs | 24 +++++++++---------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs index a80593f85a55..3bf843d3fa2c 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs @@ -88,15 +88,20 @@ private DependabotProxy(IDependabotProxyConfiguration config, ILogger logger, Te return null; } - return MakeAux(new DependabotProxyConfiguration(), logger, diagnosticsWriter, tempWorkingDirectory); + return Make(new DependabotProxyConfiguration(), logger, diagnosticsWriter, tempWorkingDirectory); } - internal static IDependabotProxy? MakeAux( + /// + /// Creates an instance of the Dependabot proxy using the specified configuration. + /// Returns null if the proxy cannot be created. + /// This overload is exposed primarily to enable platform-independent unit testing. + /// + internal static IDependabotProxy? Make( IDependabotProxyConfiguration proxyConfig, ILogger logger, IDiagnosticsWriter diagnosticsWriter, TemporaryDirectory tempWorkingDirectory) { if (string.IsNullOrWhiteSpace(proxyConfig.Host) || string.IsNullOrWhiteSpace(proxyConfig.Port)) { - logger.LogInfo("No Dependabot proxy credentials are configured."); + logger.LogDebug("No Dependabot proxy credentials are configured."); return null; } diff --git a/csharp/extractor/Semmle.Extraction.Tests/DependabotProxy.cs b/csharp/extractor/Semmle.Extraction.Tests/DependabotProxy.cs index 7aadae00b4ea..9c8c762f5989 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/DependabotProxy.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/DependabotProxy.cs @@ -34,13 +34,13 @@ public void TestDependabotProxyCreation1() // Setup var config = new DependabotConfigurationStub { - Host = "my.private.server", + Host = "localhost", Port = "", }; // Execute using var tempWorkingDirectory = MakeTemporaryDirectory(); - using var proxy = DependabotProxy.MakeAux(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); + using var proxy = DependabotProxy.Make(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); // Verify Assert.Null(proxy); @@ -57,7 +57,7 @@ public void TestDependabotProxyCreation2() // Execute using var tempWorkingDirectory = MakeTemporaryDirectory(); - using var proxy = DependabotProxy.MakeAux(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); + using var proxy = DependabotProxy.Make(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); // Verify Assert.Null(proxy); @@ -103,17 +103,17 @@ public void TestDependabotProxyCertificate() var config = new DependabotConfigurationStub { Port = "8080", - Host = "my.private.server", + Host = "localhost", Certificate = ExampleCertificate }; // Execute using var tempWorkingDirectory = MakeTemporaryDirectory(); - using var proxy = DependabotProxy.MakeAux(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); + using var proxy = DependabotProxy.Make(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); // Verify Assert.NotNull(proxy); - Assert.Equal("http://my.private.server:8080", proxy.Address); + Assert.Equal("http://localhost:8080", proxy.Address); Assert.NotNull(proxy.Certificate); Assert.NotNull(proxy.CertificatePath); } @@ -125,13 +125,13 @@ public void TestDependabotRegistryUrls1() var config = new DependabotConfigurationStub { Port = "8080", - Host = "my.private.server", + Host = "localhost", RegistryURLs = "Doesn't parse as a JSON list" }; // Execute using var tempWorkingDirectory = MakeTemporaryDirectory(); - using var proxy = DependabotProxy.MakeAux(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); + using var proxy = DependabotProxy.Make(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); // Verify Assert.NotNull(proxy); @@ -145,13 +145,13 @@ public void TestDependabotRegistryUrls2() var config = new DependabotConfigurationStub { Port = "8080", - Host = "my.private.server", + Host = "localhost", RegistryURLs = "[ { \"type\": \"nuget_feed\", \"url\": \"https://nuget.pkg.github.com/org/index.json\" } ]" }; // Execute using var tempWorkingDirectory = MakeTemporaryDirectory(); - using var proxy = DependabotProxy.MakeAux(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); + using var proxy = DependabotProxy.Make(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); // Verify Assert.NotNull(proxy); @@ -167,13 +167,13 @@ public void TestDependabotRegistryUrls3() var config = new DependabotConfigurationStub { Port = "8080", - Host = "my.private.server", + Host = "localhost", RegistryURLs = "[ { \"type\": \"nuget_feed\", \"url\": \"https://example.com/org/index.json\" }, { \"type\": \"wrong_type\", \"url\": \"https://nuget.pkg.github.com/org/index.json\" } ]" }; // Execute using var tempWorkingDirectory = MakeTemporaryDirectory(); - using var proxy = DependabotProxy.MakeAux(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); + using var proxy = DependabotProxy.Make(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); // Verify Assert.NotNull(proxy); From 72c44b885966ba75418607e7e7a3f4f3c57c701d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 3 Sep 2026 00:36:00 +0000 Subject: [PATCH 0665/2098] Add changed framework coverage reports --- java/documentation/library-coverage/coverage.csv | 3 +++ java/documentation/library-coverage/coverage.rst | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/java/documentation/library-coverage/coverage.csv b/java/documentation/library-coverage/coverage.csv index ef3a711c8dcf..7b6e62aeca2b 100644 --- a/java/documentation/library-coverage/coverage.csv +++ b/java/documentation/library-coverage/coverage.csv @@ -65,6 +65,9 @@ groovy.text,1,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, groovy.util,5,,,,,,,,,,,,,5,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, hudson,75,9,2648,,4,,,,,,3,2,,,,4,,,,,,,,,,,39,17,,,,,,,,,6,,,,,,,,,,,,,,,,5,4,2572,76 io.jsonwebtoken,,2,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,4, +io.micronaut.context.annotation,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,, +io.micronaut.core.convert.value,,,8,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,7,1 +io.micronaut.http,31,14,47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,25,2,,,,,,4,,,,,,,,,,14,39,8 io.netty.bootstrap,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,,,,,,,,,,,,,,,,,,, io.netty.buffer,,,207,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,130,77 io.netty.channel,9,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,,,,,,,,,,,,,,,,,2,, diff --git a/java/documentation/library-coverage/coverage.rst b/java/documentation/library-coverage/coverage.rst index 0b4387b476d7..96b98337fe5f 100644 --- a/java/documentation/library-coverage/coverage.rst +++ b/java/documentation/library-coverage/coverage.rst @@ -40,6 +40,6 @@ Java framework & library support `Spring `_,``org.springframework.*``,46,504,152,26,,36,14,,36 `Thymeleaf `_,``org.thymeleaf``,,2,2,,,,,, `jOOQ `_,``org.jooq``,,,1,,,1,,, - Others,"``actions.osgi``, ``antlr``, ``ch.ethz.ssh2``, ``cn.hutool.core.codec``, ``com.alibaba.com.caucho.hessian.io``, ``com.alibaba.druid.sql``, ``com.alibaba.fastjson2``, ``com.amazonaws.auth``, ``com.auth0.jwt.algorithms``, ``com.azure.identity``, ``com.caucho.burlap.io``, ``com.caucho.hessian.io``, ``com.cedarsoftware.util.io``, ``com.esotericsoftware.kryo.io``, ``com.esotericsoftware.kryo5.io``, ``com.esotericsoftware.yamlbeans``, ``com.hubspot.jinjava``, ``com.jcraft.jsch``, ``com.microsoft.sqlserver.jdbc``, ``com.mitchellbosecke.pebble``, ``com.opensymphony.xwork2``, ``com.sshtools.j2ssh.authentication``, ``com.sun.crypto.provider``, ``com.sun.jndi.ldap``, ``com.sun.net.httpserver``, ``com.sun.net.ssl``, ``com.sun.rowset``, ``com.sun.security.auth.module``, ``com.sun.security.ntlm``, ``com.sun.security.sasl.digest``, ``com.thoughtworks.xstream``, ``com.trilead.ssh2``, ``com.unboundid.ldap.sdk``, ``com.zaxxer.hikari``, ``flexjson``, ``hudson``, ``io.jsonwebtoken``, ``io.r2dbc.spi``, ``io.undertow.server.handlers.resource``, ``javafx.scene.web``, ``jenkins``, ``jodd.json``, ``liquibase.database.jvm``, ``liquibase.statement.core``, ``net.lingala.zip4j``, ``net.schmizz.sshj``, ``net.sf.json``, ``net.sf.saxon.s9api``, ``ognl``, ``org.acegisecurity``, ``org.antlr.runtime``, ``org.apache.avro``, ``org.apache.commons.codec``, ``org.apache.commons.compress.archivers.tar``, ``org.apache.commons.exec``, ``org.apache.commons.fileupload``, ``org.apache.commons.httpclient.util``, ``org.apache.commons.jelly``, ``org.apache.commons.jexl2``, ``org.apache.commons.jexl3``, ``org.apache.commons.lang``, ``org.apache.commons.logging``, ``org.apache.commons.net``, ``org.apache.commons.ognl``, ``org.apache.cxf.catalog``, ``org.apache.cxf.common.classloader``, ``org.apache.cxf.common.jaxb``, ``org.apache.cxf.common.logging``, ``org.apache.cxf.configuration.jsse``, ``org.apache.cxf.helpers``, ``org.apache.cxf.resource``, ``org.apache.cxf.staxutils``, ``org.apache.cxf.tools.corba.utils``, ``org.apache.cxf.tools.util``, ``org.apache.cxf.transform``, ``org.apache.directory.ldap.client.api``, ``org.apache.hadoop.fs``, ``org.apache.hadoop.hive.metastore``, ``org.apache.hadoop.hive.ql.exec``, ``org.apache.hadoop.hive.ql.metadata``, ``org.apache.hc.client5.http.async.methods``, ``org.apache.hc.client5.http.classic.methods``, ``org.apache.hc.client5.http.fluent``, ``org.apache.hc.client5.http.protocol``, ``org.apache.hc.client5.http.utils``, ``org.apache.hive.hcatalog.templeton``, ``org.apache.ibatis.jdbc``, ``org.apache.ibatis.mapping``, ``org.apache.log4j``, ``org.apache.poi``, ``org.apache.shiro.authc``, ``org.apache.shiro.codec``, ``org.apache.shiro.jndi``, ``org.apache.shiro.mgt``, ``org.apache.sshd.client.session``, ``org.apache.tools.ant``, ``org.apache.tools.zip``, ``org.codehaus.cargo.container.installer``, ``org.dom4j``, ``org.exolab.castor.xml``, ``org.fusesource.leveldbjni``, ``org.geogebra.web.full.main``, ``org.gradle.api.file``, ``org.ho.yaml``, ``org.influxdb``, ``org.jabsorb``, ``org.jboss.vfs``, ``org.jdbi.v3.core``, ``org.jenkins.ui.icon``, ``org.jenkins.ui.symbol``, ``org.keycloak.models.map.storage``, ``org.kohsuke.stapler``, ``org.lastaflute.web``, ``org.mvel2``, ``org.openjdk.jmh.runner.options``, ``org.owasp.esapi``, ``org.pac4j.jwt.config.encryption``, ``org.pac4j.jwt.config.signature``, ``org.scijava.log``, ``org.xml.sax``, ``org.xmlpull.v1``, ``play.libs.ws``, ``play.mvc``, ``ratpack.core.form``, ``ratpack.core.handling``, ``ratpack.core.http``, ``ratpack.exec``, ``ratpack.form``, ``ratpack.func``, ``ratpack.handling``, ``ratpack.http``, ``ratpack.util``, ``software.amazon.awssdk.transfer.s3.model``, ``sun.jvmstat.perfdata.monitor.protocol.local``, ``sun.jvmstat.perfdata.monitor.protocol.rmi``, ``sun.misc``, ``sun.net.ftp``, ``sun.net.www.protocol.http``, ``sun.security.acl``, ``sun.security.jgss.krb5``, ``sun.security.krb5``, ``sun.security.pkcs``, ``sun.security.pkcs11``, ``sun.security.provider``, ``sun.security.ssl``, ``sun.security.x509``, ``sun.tools.jconsole``",151,8258,824,188,6,20,18,,186 - Totals,,406,28636,2765,461,16,151,33,1,416 + Others,"``actions.osgi``, ``antlr``, ``ch.ethz.ssh2``, ``cn.hutool.core.codec``, ``com.alibaba.com.caucho.hessian.io``, ``com.alibaba.druid.sql``, ``com.alibaba.fastjson2``, ``com.amazonaws.auth``, ``com.auth0.jwt.algorithms``, ``com.azure.identity``, ``com.caucho.burlap.io``, ``com.caucho.hessian.io``, ``com.cedarsoftware.util.io``, ``com.esotericsoftware.kryo.io``, ``com.esotericsoftware.kryo5.io``, ``com.esotericsoftware.yamlbeans``, ``com.hubspot.jinjava``, ``com.jcraft.jsch``, ``com.microsoft.sqlserver.jdbc``, ``com.mitchellbosecke.pebble``, ``com.opensymphony.xwork2``, ``com.sshtools.j2ssh.authentication``, ``com.sun.crypto.provider``, ``com.sun.jndi.ldap``, ``com.sun.net.httpserver``, ``com.sun.net.ssl``, ``com.sun.rowset``, ``com.sun.security.auth.module``, ``com.sun.security.ntlm``, ``com.sun.security.sasl.digest``, ``com.thoughtworks.xstream``, ``com.trilead.ssh2``, ``com.unboundid.ldap.sdk``, ``com.zaxxer.hikari``, ``flexjson``, ``hudson``, ``io.jsonwebtoken``, ``io.micronaut.context.annotation``, ``io.micronaut.core.convert.value``, ``io.micronaut.http``, ``io.r2dbc.spi``, ``io.undertow.server.handlers.resource``, ``javafx.scene.web``, ``jenkins``, ``jodd.json``, ``liquibase.database.jvm``, ``liquibase.statement.core``, ``net.lingala.zip4j``, ``net.schmizz.sshj``, ``net.sf.json``, ``net.sf.saxon.s9api``, ``ognl``, ``org.acegisecurity``, ``org.antlr.runtime``, ``org.apache.avro``, ``org.apache.commons.codec``, ``org.apache.commons.compress.archivers.tar``, ``org.apache.commons.exec``, ``org.apache.commons.fileupload``, ``org.apache.commons.httpclient.util``, ``org.apache.commons.jelly``, ``org.apache.commons.jexl2``, ``org.apache.commons.jexl3``, ``org.apache.commons.lang``, ``org.apache.commons.logging``, ``org.apache.commons.net``, ``org.apache.commons.ognl``, ``org.apache.cxf.catalog``, ``org.apache.cxf.common.classloader``, ``org.apache.cxf.common.jaxb``, ``org.apache.cxf.common.logging``, ``org.apache.cxf.configuration.jsse``, ``org.apache.cxf.helpers``, ``org.apache.cxf.resource``, ``org.apache.cxf.staxutils``, ``org.apache.cxf.tools.corba.utils``, ``org.apache.cxf.tools.util``, ``org.apache.cxf.transform``, ``org.apache.directory.ldap.client.api``, ``org.apache.hadoop.fs``, ``org.apache.hadoop.hive.metastore``, ``org.apache.hadoop.hive.ql.exec``, ``org.apache.hadoop.hive.ql.metadata``, ``org.apache.hc.client5.http.async.methods``, ``org.apache.hc.client5.http.classic.methods``, ``org.apache.hc.client5.http.fluent``, ``org.apache.hc.client5.http.protocol``, ``org.apache.hc.client5.http.utils``, ``org.apache.hive.hcatalog.templeton``, ``org.apache.ibatis.jdbc``, ``org.apache.ibatis.mapping``, ``org.apache.log4j``, ``org.apache.poi``, ``org.apache.shiro.authc``, ``org.apache.shiro.codec``, ``org.apache.shiro.jndi``, ``org.apache.shiro.mgt``, ``org.apache.sshd.client.session``, ``org.apache.tools.ant``, ``org.apache.tools.zip``, ``org.codehaus.cargo.container.installer``, ``org.dom4j``, ``org.exolab.castor.xml``, ``org.fusesource.leveldbjni``, ``org.geogebra.web.full.main``, ``org.gradle.api.file``, ``org.ho.yaml``, ``org.influxdb``, ``org.jabsorb``, ``org.jboss.vfs``, ``org.jdbi.v3.core``, ``org.jenkins.ui.icon``, ``org.jenkins.ui.symbol``, ``org.keycloak.models.map.storage``, ``org.kohsuke.stapler``, ``org.lastaflute.web``, ``org.mvel2``, ``org.openjdk.jmh.runner.options``, ``org.owasp.esapi``, ``org.pac4j.jwt.config.encryption``, ``org.pac4j.jwt.config.signature``, ``org.scijava.log``, ``org.xml.sax``, ``org.xmlpull.v1``, ``play.libs.ws``, ``play.mvc``, ``ratpack.core.form``, ``ratpack.core.handling``, ``ratpack.core.http``, ``ratpack.exec``, ``ratpack.form``, ``ratpack.func``, ``ratpack.handling``, ``ratpack.http``, ``ratpack.util``, ``software.amazon.awssdk.transfer.s3.model``, ``sun.jvmstat.perfdata.monitor.protocol.local``, ``sun.jvmstat.perfdata.monitor.protocol.rmi``, ``sun.misc``, ``sun.net.ftp``, ``sun.net.www.protocol.http``, ``sun.security.acl``, ``sun.security.jgss.krb5``, ``sun.security.krb5``, ``sun.security.pkcs``, ``sun.security.pkcs11``, ``sun.security.provider``, ``sun.security.ssl``, ``sun.security.x509``, ``sun.tools.jconsole``",167,8313,855,188,6,20,18,,211 + Totals,,422,28691,2796,461,16,151,33,1,441 From 2dcc6eaf3f2994ce1efbea1c0ec9af009e77b7b7 Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 2 Sep 2026 23:04:09 +0200 Subject: [PATCH 0666/2098] unified: Let bare identifiers appear in expr, pattern, and type context --- unified/extractor/ast_types.yml | 12 +- .../extractor/src/languages/swift/swift.rs | 85 +++--- .../closures/closure-with-capture-list.output | 12 +- .../closure-with-explicit-parameters.output | 20 +- .../closure-with-shorthand-parameters.output | 12 +- .../closures/multi-statement-closure.output | 28 +- .../swift/closures/trailing-closure.output | 8 +- .../swift/collections/array-literal.output | 4 +- .../collections/dictionary-literal.output | 4 +- .../collections/dictionary-subscript.output | 8 +- .../empty-array-literal-with-type.output | 12 +- .../swift/collections/set-literal.output | 12 +- .../swift/collections/subscript-access.output | 8 +- .../swift/collections/tuple-literal.output | 4 +- .../collections/tuple-member-access.output | 8 +- ...g-modifier-does-not-leak-to-sibling.output | 16 +- .../swift/control-flow/defer-statement.output | 4 +- .../swift/control-flow/fallthrough.output | 12 +- .../swift/control-flow/guard-let.output | 13 +- ...t-with-shadowing-in-condition-value.output | 28 +- .../control-flow/if-else-if-chain.output | 20 +- .../corpus/swift/control-flow/if-else.output | 20 +- .../if-let-optional-binding.output | 21 +- .../swift/control-flow/if-statement.output | 12 +- .../nested-enum-case-pattern.output | 40 +-- .../switch-case-item-where-clauses.output | 32 +-- .../control-flow/switch-statement.output | 16 +- .../switch-with-binding-pattern.output | 28 +- ...with-labeled-case-pattern-arguments.output | 24 +- .../control-flow/ternary-expression.output | 8 +- ...er-additive-expression-is-desugared.output | 8 +- ...with-deeply-nested-path-three-parts.output | 4 +- .../import-with-dotted-path-two-parts.output | 4 +- .../scoped-import-uses-name-pattern.output | 8 +- .../simple-import-with-single-name.output | 4 +- .../expressions/array-type-constructor.output | 44 +--- .../expressions/array-type-metatype.output | 16 +- .../expressions/consume-expression.output | 8 +- .../swift/expressions/copy-expression.output | 8 +- .../generic-specialization-expression.output | 12 +- .../expressions/key-path-expression.output | 4 +- .../functions/call-with-inout-argument.output | 12 +- ...onstructor-call-with-type-arguments.output | 12 +- ...nction-call-with-labelled-arguments.output | 4 +- .../swift/functions/function-call.output | 4 +- ...nction-with-default-parameter-value.output | 16 +- .../function-with-inout-parameter.output | 8 +- .../function-with-named-parameters.output | 16 +- .../function-with-no-parameters.output | 4 +- ...ion-with-parameters-and-return-type.output | 28 +- .../swift/functions/generic-function.output | 16 +- .../swift/functions/generic-type-alias.output | 14 +- .../leading-dot-expression-call.output | 4 +- .../leading-dot-expression-value.output | 4 +- .../corpus/swift/functions/method-call.output | 4 +- .../functions/nested-function-type.output | 32 +-- .../swift/functions/variadic-function.output | 20 +- .../swift/literals/line-magic-literal.output | 4 +- .../swift/loops/break-and-continue.output | 24 +- .../loops/for-in-over-array-literal.output | 12 +- .../swift/loops/for-in-over-range.output | 12 +- .../loops/for-in-with-where-clause.output | 20 +- .../swift/loops/repeat-while-loop.output | 8 +- .../corpus/swift/loops/while-loop.output | 8 +- .../corpus/swift/operators/addition.output | 8 +- .../corpus/swift/operators/comparison.output | 8 +- .../operators/custom-postfix-operator.output | 4 +- .../corpus/swift/operators/division.output | 8 +- .../corpus/swift/operators/equality.output | 8 +- .../corpus/swift/operators/logical-and.output | 8 +- .../corpus/swift/operators/logical-not.output | 4 +- .../corpus/swift/operators/logical-or.output | 8 +- .../swift/operators/multiplication.output | 8 +- ...cedence-addition-and-multiplication.output | 12 +- .../operators/parenthesised-expression.output | 4 +- .../swift/operators/partial-range-from.output | 4 +- .../corpus/swift/operators/subtraction.output | 8 +- ...solved-operator-sequence-with-casts.output | 34 +-- ...lved-operator-sequence-with-ternary.output | 48 +--- .../unresolved-operator-sequence.output | 25 +- .../catch-where-clauses.output | 36 +-- .../optionals-and-errors/do-catch.output | 12 +- .../optionals-and-errors/force-unwrap.output | 8 +- .../nil-coalescing.output | 8 +- .../optional-chaining.output | 8 +- .../optional-enum-case-binding.output | 20 +- .../optional-type-annotation.output | 12 +- .../throwing-function.output | 4 +- .../try-expression-2.output | 8 +- .../try-expression.output | 8 +- ...er-does-not-leak-into-accessor-body.output | 12 +- .../swift/types/class-inheritance.output | 4 +- .../swift/types/class-with-initializer.output | 24 +- .../swift/types/class-with-method.output | 8 +- .../class-with-multiple-base-types.output | 8 +- .../types/class-with-stored-properties.output | 16 +- .../swift/types/computed-property.output | 28 +- .../types/constructor-with-parameters.output | 16 +- .../types/enum-with-associated-values.output | 16 +- .../corpus/swift/types/enum-with-cases.output | 16 +- ...separated-cases-chained-declaration.output | 16 +- .../tests/corpus/swift/types/extension.output | 12 +- ...tion-type-with-convention-attribute.output | 4 +- ...nction-type-with-sendable-attribute.output | 4 +- ...ic-class-parameters-and-constraints.output | 20 +- .../swift/types/generic-type-arguments.output | 19 +- .../swift/types/inline-array-type.output | 4 +- .../swift/types/noncopyable-type.output | 8 +- .../property-with-getter-and-setter.output | 24 +- ...nd-read-write-property-requirements.output | 12 +- .../corpus/swift/types/qualified-type.output | 16 +- .../tests/corpus/swift/types/struct.output | 16 +- .../corpus/swift/variables/assignment.output | 4 +- ...fier-does-not-leak-into-initializer.output | 12 +- .../variables/compound-assignment.output | 4 +- .../corpus/swift/variables/let-binding.output | 4 +- .../variables/let-with-type-annotation.output | 8 +- .../multiple-bindings-on-one-line.output | 8 +- ...y-with-willset-and-didset-observers.output | 24 +- .../tuple-destructuring-binding.output | 12 +- .../corpus/swift/variables/var-binding.output | 4 +- .../variables/var-without-initialiser.output | 8 +- .../ql/lib/codeql/unified/internal/Ast.qll | 26 +- .../unified/internal/LocalNameBinding.qll | 27 +- .../unified/internal/NameBindingPlugin.qll | 21 +- .../internal/NameBindingPluginSwift.qll | 41 ++- .../unified/internal/StaticNameBinding.qll | 34 ++- unified/ql/lib/unified.dbscheme | 17 +- .../library-tests/BasicTest/test.expected | 246 +++++++++++------- .../ql/test/library-tests/BasicTest/test.ql | 2 +- 130 files changed, 695 insertions(+), 1370 deletions(-) diff --git a/unified/extractor/ast_types.yml b/unified/extractor/ast_types.yml index b6f1d6bcfa79..552fb8d89b64 100644 --- a/unified/extractor/ast_types.yml +++ b/unified/extractor/ast_types.yml @@ -1,6 +1,6 @@ supertypes: expr: - - name_expr + - identifier - named_pattern - expr_pattern - int_literal @@ -97,15 +97,11 @@ named: top_level: body: block - # An identifier used as a name reference. - name_expr: - identifier: identifier - - # An identifier that introduces a binding, optionally applying a nested pattern. + # An identifier pattern that applies a nested pattern. Used for scoped imports. named_pattern: modifier*: modifier identifier: identifier - sub_pattern?: expr + sub_pattern: expr # A pattern expression with modifiers, such as `let x` or `var x`. expr_pattern: @@ -313,7 +309,7 @@ named: # import_declaration: modifier*: modifier - imported_expr: expr # Qualified names are encoded as a chain of member_access_expr ending with a name_expr + imported_expr: expr # Qualified names are encoded as a chain of member_access_expr ending with an identifier pattern?: expr # Binds local names in scope (possibly via bulk_importing_pattern) # `typealias Name = Type` diff --git a/unified/extractor/src/languages/swift/swift.rs b/unified/extractor/src/languages/swift/swift.rs index 6fcaca5f7c5a..1dd3d6a6bfd8 100644 --- a/unified/extractor/src/languages/swift/swift.rs +++ b/unified/extractor/src/languages/swift/swift.rs @@ -105,7 +105,7 @@ fn make_or_pattern( } /// Translate a multi-part identifier (for example `Foo.Bar.Baz`) into a -/// `member_access_expr` chain rooted at a `name_expr` over the first +/// `member_access_expr` chain rooted at an `identifier` for the first /// part. Panics on an empty input because the grammar's `_+` quantifier /// guarantees at least one part. fn member_chain( @@ -116,7 +116,7 @@ fn member_chain( let first = iter .next() .expect("identifier with `part:` must have at least one part"); - let init = tree!((name_expr identifier: (identifier #{first}))); + let init = tree!((identifier #{first})); iter.fold( init, |acc, elem| tree!((member_access_expr base: {acc} member: (identifier #{elem}))), @@ -186,16 +186,16 @@ fn translation_rules() -> Vec> { (unsupported_node) ), rule!((declReferenceExpr baseName: (identifier) @name) => expr { - tree!((name_expr identifier: (identifier #{name}))) + tree!((identifier #{name})) }), // A bare name reference (`x`), and an operator used as a value (`+` in // `reduce(0, +)`), are both `declReferenceExpr`; its `baseName` is the // referenced identifier / operator symbol. - rule!((declReferenceExpr baseName: @name) => (name_expr identifier: (identifier #{name}))), + rule!((declReferenceExpr baseName: @name) => (identifier #{name})), // A discard `_` used as an expression — e.g. the target of a discarding // assignment `_ = x`. swift-syntax models it as a `discardAssignmentExpr`; - // the target AST represents it as a `name_expr` over the `_` token. - rule!((discardAssignmentExpr wildcard: @@w) => (name_expr identifier: (identifier #{w}))), + // the target AST represents it as an `identifier` over the `_` token. + rule!((discardAssignmentExpr wildcard: @@w) => (identifier #{w})), // A generic specialization in expression position (`C`, // `Array`) is represented by swift-syntax as a // `genericSpecializationExpr`. When used as a call target @@ -207,7 +207,7 @@ fn translation_rules() -> Vec> { genericArgumentClause: (genericArgumentClause arguments: (genericArgument argument: @args)*)) => (generic_type_expr - base: (name_expr identifier: (identifier #{name})) + base: (identifier #{name}) type_argument: {args}) ), // ---- Operators ---- @@ -342,7 +342,7 @@ fn translation_rules() -> Vec> { result.push(tree!( (variable_declaration modifier: {ctx.outer_modifiers.clone()} - pattern: (named_pattern identifier: (identifier #{name})) + pattern: (identifier #{name}) type: {ty} value: {val}) )); @@ -450,7 +450,7 @@ fn translation_rules() -> Vec> { rule!( (enumCaseParameter firstName: _? @@name type: @ty) => - (parameter pattern: (named_pattern identifier: (identifier #{name}))? type: {ty}) + (parameter pattern: (identifier #{name})? type: {ty}) ), // An enum element with associated values (`case circle(radius: Double)`) // becomes a nested `class_like_declaration` whose constructor carries the @@ -476,7 +476,7 @@ fn translation_rules() -> Vec> { modifier: {ctx.outer_modifiers.clone()} modifier: {chained_modifier(&mut ctx)} modifier: (modifier "enum_case") - pattern: (named_pattern identifier: (identifier #{name})) + pattern: (identifier #{name}) value: {val}) ), rule!( @@ -486,7 +486,7 @@ fn translation_rules() -> Vec> { modifier: {ctx.outer_modifiers.clone()} modifier: {chained_modifier(&mut ctx)} modifier: (modifier "enum_case") - pattern: (named_pattern identifier: (identifier #{name}))) + pattern: (identifier #{name})) ), // Enum cases. A single `case` declaration may carry modifiers // (e.g. `indirect`) and list several comma-separated elements; each @@ -512,7 +512,7 @@ fn translation_rules() -> Vec> { rule!( (identifierPattern identifier: @name) => - (named_pattern identifier: (identifier #{name})) + (identifier #{name}) ), // A `let`/`var` value-binding pattern (`let x`) inside a case or `if case` // preserves the binding specifier around its inner pattern. @@ -538,7 +538,7 @@ fn translation_rules() -> Vec> { // A wildcard *binding* pattern (`let _ = x`, `for _ in xs`). swift-syntax // models this as a `wildcardPattern`, distinct from the `_` match form // handled by the context-aware `discardAssignmentExpr` rule. - rule!((wildcardPattern) @@wildcard => (name_expr identifier: (identifier #{wildcard}))), + rule!((wildcardPattern) @@wildcard => (identifier #{wildcard})), // An expression pattern only establishes pattern context; its child // determines the concrete pattern shape. rule!((expressionPattern expression: @@e) => expr { @@ -599,7 +599,7 @@ fn translation_rules() -> Vec> { }; tree!((parameter external_name: {external} - pattern: (named_pattern identifier: (identifier #{name})) + pattern: (identifier #{name}) type: {ty} default: {val})) } @@ -617,7 +617,7 @@ fn translation_rules() -> Vec> { => (call_expr callee: (generic_type_expr - base: (name_expr identifier: (identifier "Array")) + base: (identifier "Array") type_argument: {element}) argument: {args} argument: (argument value: {tc})) @@ -629,7 +629,7 @@ fn translation_rules() -> Vec> { => (call_expr callee: (generic_type_expr - base: (name_expr identifier: (identifier "Array")) + base: (identifier "Array") type_argument: {element}) argument: {args}) ), @@ -679,7 +679,7 @@ fn translation_rules() -> Vec> { rule!( (labeledExpr label: _? @@lbl expression: (discardAssignmentExpr) @@wildcard) => - (argument name: (identifier #{lbl})? value: (name_expr identifier: (identifier #{wildcard}))) + (argument name: (identifier #{lbl})? value: (identifier #{wildcard})) ), rule!( (labeledExpr label: _? @@lbl expression: @val) @@ -702,7 +702,7 @@ fn translation_rules() -> Vec> { => (member_access_expr base: (generic_type_expr - base: (name_expr identifier: (identifier "Array")) + base: (identifier "Array") type_argument: {element}) member: (identifier #{member})) ), @@ -748,7 +748,7 @@ fn translation_rules() -> Vec> { ), // A closure capture (`[weak self]`, `[x]`, `[y = expr]`). The optional // ownership specifier (`weak`/`unowned`) becomes a modifier; the - // captured name becomes the bound `name_expr`; an explicit capture + // captured name becomes the bound `identifier`; an explicit capture // initializer (`[y = expr]`) becomes the bound value. rule!( (closureCapture @@ -758,7 +758,7 @@ fn translation_rules() -> Vec> { => (variable_declaration modifier: (modifier #{spec})? - pattern: (named_pattern identifier: (identifier #{name})) + pattern: (identifier #{name}) value: {val}) ), // A closure parameter clause (`(x: Int, y)`) unwraps to its parameters. @@ -768,14 +768,14 @@ fn translation_rules() -> Vec> { rule!( (closureParameter firstName: @name type: _? @ty) => - (parameter pattern: (named_pattern identifier: (identifier #{name})) type: {ty}) + (parameter pattern: (identifier #{name}) type: {ty}) ), // A shorthand closure parameter (`x` in `{ x, y in … }`): a bare name // with no parentheses and no type. rule!( (closureShorthandParameter name: @name) => - (parameter pattern: (named_pattern identifier: (identifier #{name}))) + (parameter pattern: (identifier #{name})) ), // ---- Control flow ---- // An `if`/`else` expression. Conditions are joined via `and_chain`; the @@ -847,17 +847,21 @@ fn translation_rules() -> Vec> { (pattern_guard_expr value: {val} pattern: (call_expr - callee: (member_access_expr base: (name_expr identifier: (identifier "Optional")) member: (identifier "some")) - argument: (argument value: (named_pattern identifier: (identifier #{name}))))) + callee: (member_access_expr base: (identifier "Optional") member: (identifier "some")) + argument: (argument value: (expr_pattern + modifier: (modifier "let") + expr: (identifier #{name}))))) ), rule!( (optionalBindingCondition pattern: (identifierPattern identifier: @name)) => (pattern_guard_expr - value: (name_expr identifier: (identifier #{name})) + value: (identifier #{name}) pattern: (call_expr - callee: (member_access_expr base: (name_expr identifier: (identifier "Optional")) member: (identifier "some")) - argument: (argument value: (named_pattern identifier: (identifier #{name}))))) + callee: (member_access_expr base: (identifier "Optional") member: (identifier "some")) + argument: (argument value: (expr_pattern + modifier: (modifier "let") + expr: (identifier #{name}))))) ), // A single condition in an `if`/`while`/`guard` condition list unwraps to // its inner expression; `and_chain` joins multiple with `&&`. @@ -931,7 +935,7 @@ fn translation_rules() -> Vec> { if ctx.in_pattern { tree!((call_expr callee: (member_access_expr - base: (name_expr identifier: (identifier "Optional")) + base: (identifier "Optional") member: (identifier "some")) argument: (argument value: {inner}))) } else { @@ -991,10 +995,10 @@ fn translation_rules() -> Vec> { rule!((forceUnwrapExpr expression: @e) => (unary_expr operator: (postfix_operator "!") operand: {e})), // ---- Imports ---- // An import declaration. The dotted path (a list of - // `importPathComponent`s) becomes a `name_expr`/`member_access_expr` + // `importPathComponent`s) becomes an `identifier`/`member_access_expr` // chain (via `member_chain`). A scoped import (`import struct Foo.Bar`) // has an `importKindSpecifier` and binds the last path component as a - // `name_expr`; a plain import (`import Foundation`) has none and uses + // raw identifier; a plain import (`import Foundation`) has none and uses // a `bulk_importing_pattern` spanning the whole declaration. Any leading // attributes (`@_exported`) and access modifiers (`public`) become // `modifier`s. @@ -1006,12 +1010,13 @@ fn translation_rules() -> Vec> { path: (importPathComponent name: @@parts)*) => import_declaration { - let bulk_import = match kind { - None => Some(tree!((bulk_importing_pattern))), - Some(_) => None, // scoped import, no bulk import - }; let last = *parts.last().ok_or("import has no path")?; - let pattern = tree!((named_pattern identifier: (identifier #{last}) sub_pattern: {bulk_import})); + let pattern = match kind { + None => tree!((named_pattern + identifier: (identifier #{last}) + sub_pattern: (bulk_importing_pattern))), + Some(_) => tree!((identifier #{last})), + }; tree!((import_declaration modifier: (modifier #{kind})? modifier: {attrs} @@ -1040,11 +1045,11 @@ fn translation_rules() -> Vec> { genericArgumentClause: (genericArgumentClause arguments: (genericArgument argument: @args)*)) => (generic_type_expr - base: (name_expr identifier: (identifier #{name})) + base: (identifier #{name}) type_argument: {args}) ), // A named type (`Int`). `identifierType.name` is the type-name token. - rule!((identifierType name: @@n) => (name_expr identifier: (identifier #{n}))), + rule!((identifierType name: @@n) => (identifier #{n})), // A qualified type (`Outer.Inner`, `NSString.CompareOptions`). swift-syntax // nests these as `memberType` nodes; preserve the nesting as ordinary // member access. @@ -1058,17 +1063,17 @@ fn translation_rules() -> Vec> { rule!( (optionalType wrappedType: @w) => - (generic_type_expr base: (name_expr identifier: (identifier "Optional")) type_argument: {w}) + (generic_type_expr base: (identifier "Optional") type_argument: {w}) ), rule!( (arrayType element: @e) => - (generic_type_expr base: (name_expr identifier: (identifier "Array")) type_argument: {e}) + (generic_type_expr base: (identifier "Array") type_argument: {e}) ), rule!( (dictionaryType key: @k value: @v) => - (generic_type_expr base: (name_expr identifier: (identifier "Dictionary")) type_argument: {k} type_argument: {v}) + (generic_type_expr base: (identifier "Dictionary") type_argument: {k} type_argument: {v}) ), // A tuple type (`(Int, String)`) or function type (`(Int) -> Bool`). // Both hold their contents as `tupleTypeElement`s, but a tuple element diff --git a/unified/extractor/tests/corpus/swift/closures/closure-with-capture-list.output b/unified/extractor/tests/corpus/swift/closures/closure-with-capture-list.output index d9203985ad59..04779c095df8 100644 --- a/unified/extractor/tests/corpus/swift/closures/closure-with-capture-list.output +++ b/unified/extractor/tests/corpus/swift/closures/closure-with-capture-list.output @@ -66,24 +66,18 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "f" + pattern: identifier "f" value: function_expr capture_declaration: variable_declaration modifier: modifier "weak" - pattern: - named_pattern - identifier: identifier "self" + pattern: identifier "self" body: block stmt: call_expr callee: member_access_expr - base: - name_expr - identifier: identifier "self" + base: identifier "self" member: identifier "doThing" diff --git a/unified/extractor/tests/corpus/swift/closures/closure-with-explicit-parameters.output b/unified/extractor/tests/corpus/swift/closures/closure-with-explicit-parameters.output index f9ba376b2272..dca87eb8bebc 100644 --- a/unified/extractor/tests/corpus/swift/closures/closure-with-explicit-parameters.output +++ b/unified/extractor/tests/corpus/swift/closures/closure-with-explicit-parameters.output @@ -68,28 +68,18 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "f" + pattern: identifier "f" value: function_expr parameter: parameter - type: - name_expr - identifier: identifier "Int" - pattern: - named_pattern - identifier: identifier "x" - return_type: - name_expr - identifier: identifier "Int" + type: identifier "Int" + pattern: identifier "x" + return_type: identifier "Int" body: block stmt: binary_expr - left: - name_expr - identifier: identifier "x" + left: identifier "x" operator: infix_operator "*" right: int_literal "2" diff --git a/unified/extractor/tests/corpus/swift/closures/closure-with-shorthand-parameters.output b/unified/extractor/tests/corpus/swift/closures/closure-with-shorthand-parameters.output index a5a074d48a78..2473ae994abe 100644 --- a/unified/extractor/tests/corpus/swift/closures/closure-with-shorthand-parameters.output +++ b/unified/extractor/tests/corpus/swift/closures/closure-with-shorthand-parameters.output @@ -45,19 +45,13 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "f" + pattern: identifier "f" value: function_expr body: block stmt: binary_expr - left: - name_expr - identifier: identifier "$0" + left: identifier "$0" operator: infix_operator "+" - right: - name_expr - identifier: identifier "$1" + right: identifier "$1" diff --git a/unified/extractor/tests/corpus/swift/closures/multi-statement-closure.output b/unified/extractor/tests/corpus/swift/closures/multi-statement-closure.output index b5fb2465fce4..83b9fec3302a 100644 --- a/unified/extractor/tests/corpus/swift/closures/multi-statement-closure.output +++ b/unified/extractor/tests/corpus/swift/closures/multi-statement-closure.output @@ -99,42 +99,28 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "f" + pattern: identifier "f" value: function_expr parameter: parameter - type: - name_expr - identifier: identifier "Int" - pattern: - named_pattern - identifier: identifier "x" - return_type: - name_expr - identifier: identifier "Int" + type: identifier "Int" + pattern: identifier "x" + return_type: identifier "Int" body: block stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "y" + pattern: identifier "y" value: binary_expr - left: - name_expr - identifier: identifier "x" + left: identifier "x" operator: infix_operator "+" right: int_literal "1" return_expr value: binary_expr - left: - name_expr - identifier: identifier "y" + left: identifier "y" operator: infix_operator "*" right: int_literal "2" diff --git a/unified/extractor/tests/corpus/swift/closures/trailing-closure.output b/unified/extractor/tests/corpus/swift/closures/trailing-closure.output index 3e26ff27eb58..83bdf051b24a 100644 --- a/unified/extractor/tests/corpus/swift/closures/trailing-closure.output +++ b/unified/extractor/tests/corpus/swift/closures/trailing-closure.output @@ -46,9 +46,7 @@ top_level call_expr callee: member_access_expr - base: - name_expr - identifier: identifier "xs" + base: identifier "xs" member: identifier "map" argument: argument @@ -58,8 +56,6 @@ top_level block stmt: binary_expr - left: - name_expr - identifier: identifier "$0" + left: identifier "$0" operator: infix_operator "*" right: int_literal "2" diff --git a/unified/extractor/tests/corpus/swift/collections/array-literal.output b/unified/extractor/tests/corpus/swift/collections/array-literal.output index 37d02ffec267..b6fd3a4331bc 100644 --- a/unified/extractor/tests/corpus/swift/collections/array-literal.output +++ b/unified/extractor/tests/corpus/swift/collections/array-literal.output @@ -47,9 +47,7 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "xs" + pattern: identifier "xs" value: array_literal element: diff --git a/unified/extractor/tests/corpus/swift/collections/dictionary-literal.output b/unified/extractor/tests/corpus/swift/collections/dictionary-literal.output index 689ab33ce2fe..f2a2be74c780 100644 --- a/unified/extractor/tests/corpus/swift/collections/dictionary-literal.output +++ b/unified/extractor/tests/corpus/swift/collections/dictionary-literal.output @@ -58,7 +58,5 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "d" + pattern: identifier "d" value: map_literal "[\"a\": 1, \"b\": 2]" diff --git a/unified/extractor/tests/corpus/swift/collections/dictionary-subscript.output b/unified/extractor/tests/corpus/swift/collections/dictionary-subscript.output index e24550673f80..bf67e55bd23d 100644 --- a/unified/extractor/tests/corpus/swift/collections/dictionary-subscript.output +++ b/unified/extractor/tests/corpus/swift/collections/dictionary-subscript.output @@ -47,14 +47,10 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "v" + pattern: identifier "v" value: call_expr - callee: - name_expr - identifier: identifier "d" + callee: identifier "d" argument: argument value: string_literal "\"key\"" diff --git a/unified/extractor/tests/corpus/swift/collections/empty-array-literal-with-type.output b/unified/extractor/tests/corpus/swift/collections/empty-array-literal-with-type.output index 51b535de7ee2..5e562153961b 100644 --- a/unified/extractor/tests/corpus/swift/collections/empty-array-literal-with-type.output +++ b/unified/extractor/tests/corpus/swift/collections/empty-array-literal-with-type.output @@ -43,15 +43,9 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "xs" + pattern: identifier "xs" type: generic_type_expr - base: - name_expr - identifier: identifier "Array" - type_argument: - name_expr - identifier: identifier "Int" + base: identifier "Array" + type_argument: identifier "Int" value: array_literal "[]" diff --git a/unified/extractor/tests/corpus/swift/collections/set-literal.output b/unified/extractor/tests/corpus/swift/collections/set-literal.output index a0bfaab57804..071c7c4fcb70 100644 --- a/unified/extractor/tests/corpus/swift/collections/set-literal.output +++ b/unified/extractor/tests/corpus/swift/collections/set-literal.output @@ -62,17 +62,11 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "s" + pattern: identifier "s" type: generic_type_expr - base: - name_expr - identifier: identifier "Set" - type_argument: - name_expr - identifier: identifier "Int" + base: identifier "Set" + type_argument: identifier "Int" value: array_literal element: diff --git a/unified/extractor/tests/corpus/swift/collections/subscript-access.output b/unified/extractor/tests/corpus/swift/collections/subscript-access.output index 2ae548bfe1d0..6067a9a90684 100644 --- a/unified/extractor/tests/corpus/swift/collections/subscript-access.output +++ b/unified/extractor/tests/corpus/swift/collections/subscript-access.output @@ -44,14 +44,10 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "first" + pattern: identifier "first" value: call_expr - callee: - name_expr - identifier: identifier "xs" + callee: identifier "xs" argument: argument value: int_literal "0" diff --git a/unified/extractor/tests/corpus/swift/collections/tuple-literal.output b/unified/extractor/tests/corpus/swift/collections/tuple-literal.output index 74d505ab5b8c..5d7742f744bc 100644 --- a/unified/extractor/tests/corpus/swift/collections/tuple-literal.output +++ b/unified/extractor/tests/corpus/swift/collections/tuple-literal.output @@ -51,7 +51,5 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "t" + pattern: identifier "t" value: tuple_expr "(1, \"two\", 3.0)" diff --git a/unified/extractor/tests/corpus/swift/collections/tuple-member-access.output b/unified/extractor/tests/corpus/swift/collections/tuple-member-access.output index 30298ed89865..84496832c073 100644 --- a/unified/extractor/tests/corpus/swift/collections/tuple-member-access.output +++ b/unified/extractor/tests/corpus/swift/collections/tuple-member-access.output @@ -37,12 +37,8 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "n" + pattern: identifier "n" value: member_access_expr - base: - name_expr - identifier: identifier "t" + base: identifier "t" member: identifier "0" diff --git a/unified/extractor/tests/corpus/swift/control-flow/binding-modifier-does-not-leak-to-sibling.output b/unified/extractor/tests/corpus/swift/control-flow/binding-modifier-does-not-leak-to-sibling.output index bb3c49721f44..1a50d875f783 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/binding-modifier-does-not-leak-to-sibling.output +++ b/unified/extractor/tests/corpus/swift/control-flow/binding-modifier-does-not-leak-to-sibling.output @@ -90,26 +90,18 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "x" + pattern: identifier "x" value: int_literal "1" switch_expr - value: - name_expr - identifier: identifier "y" + value: identifier "y" case: switch_case - pattern: - name_expr - identifier: identifier "someConstant" + pattern: identifier "someConstant" body: block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument value: string_literal "\"matched\"" diff --git a/unified/extractor/tests/corpus/swift/control-flow/defer-statement.output b/unified/extractor/tests/corpus/swift/control-flow/defer-statement.output index 6e8ec9ae3b9a..8032d521df75 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/defer-statement.output +++ b/unified/extractor/tests/corpus/swift/control-flow/defer-statement.output @@ -86,9 +86,7 @@ top_level stmt: unsupported_node "defer { print(\"cleanup\") }" call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument value: string_literal "\"work\"" diff --git a/unified/extractor/tests/corpus/swift/control-flow/fallthrough.output b/unified/extractor/tests/corpus/swift/control-flow/fallthrough.output index 79bea22bbe24..bc8943e35763 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/fallthrough.output +++ b/unified/extractor/tests/corpus/swift/control-flow/fallthrough.output @@ -91,19 +91,13 @@ top_level parameter: parameter external_name: identifier "_" - type: - name_expr - identifier: identifier "Int" - pattern: - named_pattern - identifier: identifier "x" + type: identifier "Int" + pattern: identifier "x" body: block stmt: switch_expr - value: - name_expr - identifier: identifier "x" + value: identifier "x" case: switch_case pattern: int_literal "1" diff --git a/unified/extractor/tests/corpus/swift/control-flow/guard-let.output b/unified/extractor/tests/corpus/swift/control-flow/guard-let.output index 9c0fbc37926e..6a694affb251 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/guard-let.output +++ b/unified/extractor/tests/corpus/swift/control-flow/guard-let.output @@ -47,18 +47,15 @@ top_level call_expr callee: member_access_expr - base: - name_expr - identifier: identifier "Optional" + base: identifier "Optional" member: identifier "some" argument: argument value: - named_pattern - identifier: identifier "value" - value: - name_expr - identifier: identifier "optional" + expr_pattern + modifier: modifier "let" + expr: identifier "value" + value: identifier "optional" else: block stmt: return_expr "return" diff --git a/unified/extractor/tests/corpus/swift/control-flow/if-case-let-with-shadowing-in-condition-value.output b/unified/extractor/tests/corpus/swift/control-flow/if-case-let-with-shadowing-in-condition-value.output index 68181bb1b334..699609a26309 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/if-case-let-with-shadowing-in-condition-value.output +++ b/unified/extractor/tests/corpus/swift/control-flow/if-case-let-with-shadowing-in-condition-value.output @@ -122,50 +122,36 @@ top_level pattern: expr_pattern modifier: modifier "let" - expr: - named_pattern - identifier: identifier "x" + expr: identifier "x" value: binary_expr - left: - name_expr - identifier: identifier "x" + left: identifier "x" operator: infix_operator "+" right: int_literal "10" then: block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument - value: - name_expr - identifier: identifier "x" + value: identifier "x" if_expr condition: pattern_guard_expr pattern: expr_pattern modifier: modifier "var" - expr: - named_pattern - identifier: identifier "y" + expr: identifier "y" value: binary_expr - left: - name_expr - identifier: identifier "y" + left: identifier "y" operator: infix_operator "+" right: int_literal "10" then: block stmt: compound_assign_expr - target: - name_expr - identifier: identifier "y" + target: identifier "y" operator: infix_operator "+=" value: int_literal "1" diff --git a/unified/extractor/tests/corpus/swift/control-flow/if-else-if-chain.output b/unified/extractor/tests/corpus/swift/control-flow/if-else-if-chain.output index 35f1c2c46d2c..82c5b6c468ca 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/if-else-if-chain.output +++ b/unified/extractor/tests/corpus/swift/control-flow/if-else-if-chain.output @@ -115,18 +115,14 @@ top_level if_expr condition: binary_expr - left: - name_expr - identifier: identifier "x" + left: identifier "x" operator: infix_operator ">" right: int_literal "0" then: block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument value: int_literal "1" @@ -134,18 +130,14 @@ top_level if_expr condition: binary_expr - left: - name_expr - identifier: identifier "x" + left: identifier "x" operator: infix_operator "<" right: int_literal "0" then: block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument value: int_literal "2" @@ -153,9 +145,7 @@ top_level block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument value: int_literal "3" diff --git a/unified/extractor/tests/corpus/swift/control-flow/if-else.output b/unified/extractor/tests/corpus/swift/control-flow/if-else.output index 744b5c51ab24..86c3b9cd876c 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/if-else.output +++ b/unified/extractor/tests/corpus/swift/control-flow/if-else.output @@ -80,35 +80,25 @@ top_level if_expr condition: binary_expr - left: - name_expr - identifier: identifier "x" + left: identifier "x" operator: infix_operator ">" right: int_literal "0" then: block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument - value: - name_expr - identifier: identifier "x" + value: identifier "x" else: block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument value: unary_expr - operand: - name_expr - identifier: identifier "x" + operand: identifier "x" operator: prefix_operator "-" diff --git a/unified/extractor/tests/corpus/swift/control-flow/if-let-optional-binding.output b/unified/extractor/tests/corpus/swift/control-flow/if-let-optional-binding.output index 5f26de40c1b3..096f4c6c3c8e 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/if-let-optional-binding.output +++ b/unified/extractor/tests/corpus/swift/control-flow/if-let-optional-binding.output @@ -60,27 +60,20 @@ top_level call_expr callee: member_access_expr - base: - name_expr - identifier: identifier "Optional" + base: identifier "Optional" member: identifier "some" argument: argument value: - named_pattern - identifier: identifier "value" - value: - name_expr - identifier: identifier "optional" + expr_pattern + modifier: modifier "let" + expr: identifier "value" + value: identifier "optional" then: block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument - value: - name_expr - identifier: identifier "value" + value: identifier "value" diff --git a/unified/extractor/tests/corpus/swift/control-flow/if-statement.output b/unified/extractor/tests/corpus/swift/control-flow/if-statement.output index 77bba019ffb9..c0a7cfd021d8 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/if-statement.output +++ b/unified/extractor/tests/corpus/swift/control-flow/if-statement.output @@ -55,20 +55,14 @@ top_level if_expr condition: binary_expr - left: - name_expr - identifier: identifier "x" + left: identifier "x" operator: infix_operator ">" right: int_literal "0" then: block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument - value: - name_expr - identifier: identifier "x" + value: identifier "x" diff --git a/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output b/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output index fd2230d05c9d..59a8198ed919 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output +++ b/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output @@ -160,9 +160,7 @@ top_level block stmt: switch_expr - value: - name_expr - identifier: identifier "event" + value: identifier "event" case: switch_case pattern: @@ -184,58 +182,40 @@ top_level member: identifier "some" argument: argument - value: - named_pattern - identifier: identifier "value" + value: identifier "value" argument - value: - named_pattern - identifier: identifier "timestamp" + value: identifier "timestamp" body: block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument - value: - name_expr - identifier: identifier "value" + value: identifier "value" argument - value: - name_expr - identifier: identifier "timestamp" + value: identifier "timestamp" switch_case pattern: call_expr callee: member_access_expr - base: - name_expr - identifier: identifier "Type" + base: identifier "Type" member: identifier "some" argument: argument value: expr_pattern modifier: modifier "let" - expr: - named_pattern - identifier: identifier "value" + expr: identifier "value" body: block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument - value: - name_expr - identifier: identifier "value" + value: identifier "value" switch_case body: block diff --git a/unified/extractor/tests/corpus/swift/control-flow/switch-case-item-where-clauses.output b/unified/extractor/tests/corpus/swift/control-flow/switch-case-item-where-clauses.output index 045c37f682f6..77adadc261b1 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/switch-case-item-where-clauses.output +++ b/unified/extractor/tests/corpus/swift/control-flow/switch-case-item-where-clauses.output @@ -155,33 +155,25 @@ top_level block stmt: switch_expr - value: - name_expr - identifier: identifier "n" + value: identifier "n" case: switch_case pattern: conditional_pattern condition: binary_expr - left: - name_expr - identifier: identifier "x" + left: identifier "x" operator: infix_operator ">" right: int_literal "0" pattern: expr_pattern modifier: modifier "let" - expr: - named_pattern - identifier: identifier "x" + expr: identifier "x" body: block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument value: string_literal "\"positive\"" @@ -192,25 +184,19 @@ top_level conditional_pattern condition: binary_expr - left: - name_expr - identifier: identifier "y" + left: identifier "y" operator: infix_operator "<" right: int_literal "0" pattern: expr_pattern modifier: modifier "let" - expr: - named_pattern - identifier: identifier "y" + expr: identifier "y" int_literal "0" body: block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument value: string_literal "\"non-positive\"" @@ -219,9 +205,7 @@ top_level block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument value: string_literal "\"other\"" diff --git a/unified/extractor/tests/corpus/swift/control-flow/switch-statement.output b/unified/extractor/tests/corpus/swift/control-flow/switch-statement.output index c14948ae54e9..3ba92e37ab8f 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/switch-statement.output +++ b/unified/extractor/tests/corpus/swift/control-flow/switch-statement.output @@ -125,9 +125,7 @@ top_level block stmt: switch_expr - value: - name_expr - identifier: identifier "x" + value: identifier "x" case: switch_case pattern: int_literal "1" @@ -135,9 +133,7 @@ top_level block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument value: string_literal "\"one\"" @@ -151,9 +147,7 @@ top_level block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument value: string_literal "\"two or three\"" @@ -162,9 +156,7 @@ top_level block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument value: string_literal "\"other\"" diff --git a/unified/extractor/tests/corpus/swift/control-flow/switch-with-binding-pattern.output b/unified/extractor/tests/corpus/swift/control-flow/switch-with-binding-pattern.output index 02362e80068d..466c3fbb6989 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/switch-with-binding-pattern.output +++ b/unified/extractor/tests/corpus/swift/control-flow/switch-with-binding-pattern.output @@ -120,9 +120,7 @@ top_level block stmt: switch_expr - value: - name_expr - identifier: identifier "shape" + value: identifier "shape" case: switch_case pattern: @@ -136,21 +134,15 @@ top_level value: expr_pattern modifier: modifier "let" - expr: - named_pattern - identifier: identifier "r" + expr: identifier "r" body: block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument - value: - name_expr - identifier: identifier "r" + value: identifier "r" switch_case pattern: call_expr @@ -163,18 +155,12 @@ top_level value: expr_pattern modifier: modifier "let" - expr: - named_pattern - identifier: identifier "s" + expr: identifier "s" body: block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument - value: - name_expr - identifier: identifier "s" + value: identifier "s" diff --git a/unified/extractor/tests/corpus/swift/control-flow/switch-with-labeled-case-pattern-arguments.output b/unified/extractor/tests/corpus/swift/control-flow/switch-with-labeled-case-pattern-arguments.output index 61a1096d69b3..532b72eab51f 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/switch-with-labeled-case-pattern-arguments.output +++ b/unified/extractor/tests/corpus/swift/control-flow/switch-with-labeled-case-pattern-arguments.output @@ -128,9 +128,7 @@ top_level block stmt: switch_expr - value: - name_expr - identifier: identifier "x" + value: identifier "x" case: switch_case pattern: @@ -147,9 +145,7 @@ top_level block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument value: string_literal "\"yes\"" @@ -163,25 +159,17 @@ top_level argument: argument name: identifier "threadRowId" - value: - name_expr - identifier: identifier "_" + value: identifier "_" argument value: expr_pattern modifier: modifier "let" - expr: - named_pattern - identifier: identifier "rowId" + expr: identifier "rowId" body: block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument - value: - name_expr - identifier: identifier "rowId" + value: identifier "rowId" diff --git a/unified/extractor/tests/corpus/swift/control-flow/ternary-expression.output b/unified/extractor/tests/corpus/swift/control-flow/ternary-expression.output index 360835a10799..299d84c7822f 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/ternary-expression.output +++ b/unified/extractor/tests/corpus/swift/control-flow/ternary-expression.output @@ -52,16 +52,12 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "y" + pattern: identifier "y" value: if_expr condition: binary_expr - left: - name_expr - identifier: identifier "x" + left: identifier "x" operator: infix_operator ">" right: int_literal "0" then: int_literal "1" diff --git a/unified/extractor/tests/corpus/swift/desugar/another-additive-expression-is-desugared.output b/unified/extractor/tests/corpus/swift/desugar/another-additive-expression-is-desugared.output index 982309ffa5af..e27b9c7089ec 100644 --- a/unified/extractor/tests/corpus/swift/desugar/another-additive-expression-is-desugared.output +++ b/unified/extractor/tests/corpus/swift/desugar/another-additive-expression-is-desugared.output @@ -25,10 +25,6 @@ top_level block stmt: binary_expr - left: - name_expr - identifier: identifier "foo" + left: identifier "foo" operator: infix_operator "+" - right: - name_expr - identifier: identifier "bar" + right: identifier "bar" diff --git a/unified/extractor/tests/corpus/swift/desugar/import-with-deeply-nested-path-three-parts.output b/unified/extractor/tests/corpus/swift/desugar/import-with-deeply-nested-path-three-parts.output index b423f1c0e14e..9c7f425f41b6 100644 --- a/unified/extractor/tests/corpus/swift/desugar/import-with-deeply-nested-path-three-parts.output +++ b/unified/extractor/tests/corpus/swift/desugar/import-with-deeply-nested-path-three-parts.output @@ -32,9 +32,7 @@ top_level member_access_expr base: member_access_expr - base: - name_expr - identifier: identifier "Foundation" + base: identifier "Foundation" member: identifier "Networking" member: identifier "URLSession" pattern: diff --git a/unified/extractor/tests/corpus/swift/desugar/import-with-dotted-path-two-parts.output b/unified/extractor/tests/corpus/swift/desugar/import-with-dotted-path-two-parts.output index 074dd8a1cca7..e3b18f34db1c 100644 --- a/unified/extractor/tests/corpus/swift/desugar/import-with-dotted-path-two-parts.output +++ b/unified/extractor/tests/corpus/swift/desugar/import-with-dotted-path-two-parts.output @@ -27,9 +27,7 @@ top_level import_declaration imported_expr: member_access_expr - base: - name_expr - identifier: identifier "Foundation" + base: identifier "Foundation" member: identifier "Networking" pattern: named_pattern diff --git a/unified/extractor/tests/corpus/swift/desugar/scoped-import-uses-name-pattern.output b/unified/extractor/tests/corpus/swift/desugar/scoped-import-uses-name-pattern.output index 376a7cefd43c..451067727e35 100644 --- a/unified/extractor/tests/corpus/swift/desugar/scoped-import-uses-name-pattern.output +++ b/unified/extractor/tests/corpus/swift/desugar/scoped-import-uses-name-pattern.output @@ -29,10 +29,6 @@ top_level modifier: modifier "struct" imported_expr: member_access_expr - base: - name_expr - identifier: identifier "Foundation" + base: identifier "Foundation" member: identifier "Date" - pattern: - named_pattern - identifier: identifier "Date" + pattern: identifier "Date" diff --git a/unified/extractor/tests/corpus/swift/desugar/simple-import-with-single-name.output b/unified/extractor/tests/corpus/swift/desugar/simple-import-with-single-name.output index 600df253234b..6b4e171983d4 100644 --- a/unified/extractor/tests/corpus/swift/desugar/simple-import-with-single-name.output +++ b/unified/extractor/tests/corpus/swift/desugar/simple-import-with-single-name.output @@ -22,9 +22,7 @@ top_level block stmt: import_declaration - imported_expr: - name_expr - identifier: identifier "Foundation" + imported_expr: identifier "Foundation" pattern: named_pattern identifier: identifier "Foundation" diff --git a/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.output b/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.output index 4f74f03a5de0..19a7d4df0774 100644 --- a/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.output +++ b/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.output @@ -130,44 +130,28 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "values" + pattern: identifier "values" value: call_expr callee: generic_type_expr - base: - name_expr - identifier: identifier "Array" + base: identifier "Array" type_argument: generic_type_expr - base: - name_expr - identifier: identifier "Result" - type_argument: - name_expr - identifier: identifier "Void" + base: identifier "Result" + type_argument: identifier "Void" variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "initialized" + pattern: identifier "initialized" value: call_expr callee: generic_type_expr - base: - name_expr - identifier: identifier "Array" + base: identifier "Array" type_argument: generic_type_expr - base: - name_expr - identifier: identifier "Result" - type_argument: - name_expr - identifier: identifier "Void" + base: identifier "Result" + type_argument: identifier "Void" argument: argument name: identifier "unsafeUninitializedCapacity" @@ -177,18 +161,12 @@ top_level function_expr parameter: parameter - pattern: - named_pattern - identifier: identifier "_" + pattern: identifier "_" parameter - pattern: - named_pattern - identifier: identifier "count" + pattern: identifier "count" body: block stmt: assign_expr - target: - name_expr - identifier: identifier "count" + target: identifier "count" value: int_literal "0" diff --git a/unified/extractor/tests/corpus/swift/expressions/array-type-metatype.output b/unified/extractor/tests/corpus/swift/expressions/array-type-metatype.output index 95262f0c5487..2a7f9df2cf05 100644 --- a/unified/extractor/tests/corpus/swift/expressions/array-type-metatype.output +++ b/unified/extractor/tests/corpus/swift/expressions/array-type-metatype.output @@ -54,22 +54,14 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "type" + pattern: identifier "type" value: member_access_expr base: generic_type_expr - base: - name_expr - identifier: identifier "Array" + base: identifier "Array" type_argument: generic_type_expr - base: - name_expr - identifier: identifier "Result" - type_argument: - name_expr - identifier: identifier "Void" + base: identifier "Result" + type_argument: identifier "Void" member: identifier "self" diff --git a/unified/extractor/tests/corpus/swift/expressions/consume-expression.output b/unified/extractor/tests/corpus/swift/expressions/consume-expression.output index 50ac9b41dbae..aedba985574d 100644 --- a/unified/extractor/tests/corpus/swift/expressions/consume-expression.output +++ b/unified/extractor/tests/corpus/swift/expressions/consume-expression.output @@ -68,9 +68,7 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "original" + pattern: identifier "original" value: array_literal element: @@ -79,7 +77,5 @@ top_level int_literal "3" variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "consumed" + pattern: identifier "consumed" value: unsupported_node "consume original" diff --git a/unified/extractor/tests/corpus/swift/expressions/copy-expression.output b/unified/extractor/tests/corpus/swift/expressions/copy-expression.output index c12051aca725..448dd95e78b3 100644 --- a/unified/extractor/tests/corpus/swift/expressions/copy-expression.output +++ b/unified/extractor/tests/corpus/swift/expressions/copy-expression.output @@ -68,9 +68,7 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "original" + pattern: identifier "original" value: array_literal element: @@ -79,7 +77,5 @@ top_level int_literal "3" variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "copied" + pattern: identifier "copied" value: unsupported_node "copy original" diff --git a/unified/extractor/tests/corpus/swift/expressions/generic-specialization-expression.output b/unified/extractor/tests/corpus/swift/expressions/generic-specialization-expression.output index 0871c64a4d64..b8b3a5a7903f 100644 --- a/unified/extractor/tests/corpus/swift/expressions/generic-specialization-expression.output +++ b/unified/extractor/tests/corpus/swift/expressions/generic-specialization-expression.output @@ -48,16 +48,10 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "numbers" + pattern: identifier "numbers" value: call_expr callee: generic_type_expr - base: - name_expr - identifier: identifier "Array" - type_argument: - name_expr - identifier: identifier "Int" + base: identifier "Array" + type_argument: identifier "Int" diff --git a/unified/extractor/tests/corpus/swift/expressions/key-path-expression.output b/unified/extractor/tests/corpus/swift/expressions/key-path-expression.output index 461d9fc4b89f..c71105e4ee2e 100644 --- a/unified/extractor/tests/corpus/swift/expressions/key-path-expression.output +++ b/unified/extractor/tests/corpus/swift/expressions/key-path-expression.output @@ -42,7 +42,5 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "keyPath" + pattern: identifier "keyPath" value: unsupported_node "\\String.count" diff --git a/unified/extractor/tests/corpus/swift/functions/call-with-inout-argument.output b/unified/extractor/tests/corpus/swift/functions/call-with-inout-argument.output index 542f7e54730e..13e99e707a86 100644 --- a/unified/extractor/tests/corpus/swift/functions/call-with-inout-argument.output +++ b/unified/extractor/tests/corpus/swift/functions/call-with-inout-argument.output @@ -75,20 +75,14 @@ top_level stmt: variable_declaration modifier: modifier "var" - pattern: - named_pattern - identifier: identifier "a" + pattern: identifier "a" value: int_literal "1" variable_declaration modifier: modifier "var" - pattern: - named_pattern - identifier: identifier "b" + pattern: identifier "b" value: int_literal "2" call_expr - callee: - name_expr - identifier: identifier "swap" + callee: identifier "swap" argument: argument value: unsupported_node "&a" diff --git a/unified/extractor/tests/corpus/swift/functions/constructor-call-with-type-arguments.output b/unified/extractor/tests/corpus/swift/functions/constructor-call-with-type-arguments.output index bb7b5fce65d5..364a2022cc62 100644 --- a/unified/extractor/tests/corpus/swift/functions/constructor-call-with-type-arguments.output +++ b/unified/extractor/tests/corpus/swift/functions/constructor-call-with-type-arguments.output @@ -91,16 +91,10 @@ top_level name: identifier "T" variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "x" + pattern: identifier "x" value: call_expr callee: generic_type_expr - base: - name_expr - identifier: identifier "C" - type_argument: - name_expr - identifier: identifier "Foo" + base: identifier "C" + type_argument: identifier "Foo" diff --git a/unified/extractor/tests/corpus/swift/functions/function-call-with-labelled-arguments.output b/unified/extractor/tests/corpus/swift/functions/function-call-with-labelled-arguments.output index f885d5762f2d..b8ff5468aa88 100644 --- a/unified/extractor/tests/corpus/swift/functions/function-call-with-labelled-arguments.output +++ b/unified/extractor/tests/corpus/swift/functions/function-call-with-labelled-arguments.output @@ -33,9 +33,7 @@ top_level block stmt: call_expr - callee: - name_expr - identifier: identifier "greet" + callee: identifier "greet" argument: argument name: identifier "person" diff --git a/unified/extractor/tests/corpus/swift/functions/function-call.output b/unified/extractor/tests/corpus/swift/functions/function-call.output index a1e2859ccd6a..35cac76d7bd1 100644 --- a/unified/extractor/tests/corpus/swift/functions/function-call.output +++ b/unified/extractor/tests/corpus/swift/functions/function-call.output @@ -32,9 +32,7 @@ top_level block stmt: call_expr - callee: - name_expr - identifier: identifier "foo" + callee: identifier "foo" argument: argument value: int_literal "1" diff --git a/unified/extractor/tests/corpus/swift/functions/function-with-default-parameter-value.output b/unified/extractor/tests/corpus/swift/functions/function-with-default-parameter-value.output index bff9c6018540..ed4989826cd6 100644 --- a/unified/extractor/tests/corpus/swift/functions/function-with-default-parameter-value.output +++ b/unified/extractor/tests/corpus/swift/functions/function-with-default-parameter-value.output @@ -69,22 +69,14 @@ top_level name: identifier "greet" parameter: parameter - type: - name_expr - identifier: identifier "String" - pattern: - named_pattern - identifier: identifier "name" + type: identifier "String" + pattern: identifier "name" default: string_literal "\"world\"" body: block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument - value: - name_expr - identifier: identifier "name" + value: identifier "name" diff --git a/unified/extractor/tests/corpus/swift/functions/function-with-inout-parameter.output b/unified/extractor/tests/corpus/swift/functions/function-with-inout-parameter.output index 9c3aa054e1f9..a568b9da17e7 100644 --- a/unified/extractor/tests/corpus/swift/functions/function-with-inout-parameter.output +++ b/unified/extractor/tests/corpus/swift/functions/function-with-inout-parameter.output @@ -67,15 +67,11 @@ top_level parameter external_name: identifier "_" type: unsupported_node "inout Int" - pattern: - named_pattern - identifier: identifier "x" + pattern: identifier "x" body: block stmt: compound_assign_expr - target: - name_expr - identifier: identifier "x" + target: identifier "x" operator: infix_operator "+=" value: int_literal "1" diff --git a/unified/extractor/tests/corpus/swift/functions/function-with-named-parameters.output b/unified/extractor/tests/corpus/swift/functions/function-with-named-parameters.output index 2c577f940197..fb23a5bd55bf 100644 --- a/unified/extractor/tests/corpus/swift/functions/function-with-named-parameters.output +++ b/unified/extractor/tests/corpus/swift/functions/function-with-named-parameters.output @@ -61,21 +61,13 @@ top_level parameter: parameter external_name: identifier "person" - type: - name_expr - identifier: identifier "String" - pattern: - named_pattern - identifier: identifier "name" + type: identifier "String" + pattern: identifier "name" body: block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument - value: - name_expr - identifier: identifier "name" + value: identifier "name" diff --git a/unified/extractor/tests/corpus/swift/functions/function-with-no-parameters.output b/unified/extractor/tests/corpus/swift/functions/function-with-no-parameters.output index 4ddc26ae94d6..99ba3a45e2e1 100644 --- a/unified/extractor/tests/corpus/swift/functions/function-with-no-parameters.output +++ b/unified/extractor/tests/corpus/swift/functions/function-with-no-parameters.output @@ -57,9 +57,7 @@ top_level block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument value: string_literal "\"hello\"" diff --git a/unified/extractor/tests/corpus/swift/functions/function-with-parameters-and-return-type.output b/unified/extractor/tests/corpus/swift/functions/function-with-parameters-and-return-type.output index 0acf938ebe4f..6f5d2aa98f9d 100644 --- a/unified/extractor/tests/corpus/swift/functions/function-with-parameters-and-return-type.output +++ b/unified/extractor/tests/corpus/swift/functions/function-with-parameters-and-return-type.output @@ -78,33 +78,19 @@ top_level parameter: parameter external_name: identifier "_" - type: - name_expr - identifier: identifier "Int" - pattern: - named_pattern - identifier: identifier "a" + type: identifier "Int" + pattern: identifier "a" parameter external_name: identifier "_" - type: - name_expr - identifier: identifier "Int" - pattern: - named_pattern - identifier: identifier "b" - return_type: - name_expr - identifier: identifier "Int" + type: identifier "Int" + pattern: identifier "b" + return_type: identifier "Int" body: block stmt: return_expr value: binary_expr - left: - name_expr - identifier: identifier "a" + left: identifier "a" operator: infix_operator "+" - right: - name_expr - identifier: identifier "b" + right: identifier "b" diff --git a/unified/extractor/tests/corpus/swift/functions/generic-function.output b/unified/extractor/tests/corpus/swift/functions/generic-function.output index 6cf4caef5b12..e296b760ccaa 100644 --- a/unified/extractor/tests/corpus/swift/functions/generic-function.output +++ b/unified/extractor/tests/corpus/swift/functions/generic-function.output @@ -71,19 +71,11 @@ top_level parameter: parameter external_name: identifier "_" - type: - name_expr - identifier: identifier "T" - pattern: - named_pattern - identifier: identifier "x" - return_type: - name_expr - identifier: identifier "T" + type: identifier "T" + pattern: identifier "x" + return_type: identifier "T" body: block stmt: return_expr - value: - name_expr - identifier: identifier "x" + value: identifier "x" diff --git a/unified/extractor/tests/corpus/swift/functions/generic-type-alias.output b/unified/extractor/tests/corpus/swift/functions/generic-type-alias.output index d60ce9b27b27..6bc55e07b0af 100644 --- a/unified/extractor/tests/corpus/swift/functions/generic-type-alias.output +++ b/unified/extractor/tests/corpus/swift/functions/generic-type-alias.output @@ -60,18 +60,12 @@ top_level type_parameter: type_parameter name: identifier "T" - bound: - name_expr - identifier: identifier "Equatable" + bound: identifier "Equatable" type_parameter name: identifier "U" type: generic_type_expr - base: - name_expr - identifier: identifier "Dictionary" + base: identifier "Dictionary" type_argument: - name_expr - identifier: identifier "T" - name_expr - identifier: identifier "U" + identifier "T" + identifier "U" diff --git a/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-call.output b/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-call.output index 7b7aab7984fc..92da0bab18f6 100644 --- a/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-call.output +++ b/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-call.output @@ -44,9 +44,7 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "y" + pattern: identifier "y" value: call_expr callee: diff --git a/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-value.output b/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-value.output index 8b374c20c858..310d9278f54a 100644 --- a/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-value.output +++ b/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-value.output @@ -34,9 +34,7 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "x" + pattern: identifier "x" value: member_access_expr base: inferred_type_expr "." diff --git a/unified/extractor/tests/corpus/swift/functions/method-call.output b/unified/extractor/tests/corpus/swift/functions/method-call.output index 3c0b150b8235..eb6985200bd8 100644 --- a/unified/extractor/tests/corpus/swift/functions/method-call.output +++ b/unified/extractor/tests/corpus/swift/functions/method-call.output @@ -35,9 +35,7 @@ top_level call_expr callee: member_access_expr - base: - name_expr - identifier: identifier "list" + base: identifier "list" member: identifier "append" argument: argument diff --git a/unified/extractor/tests/corpus/swift/functions/nested-function-type.output b/unified/extractor/tests/corpus/swift/functions/nested-function-type.output index 0428a5a5356d..9f2f1c9f8ccc 100644 --- a/unified/extractor/tests/corpus/swift/functions/nested-function-type.output +++ b/unified/extractor/tests/corpus/swift/functions/nested-function-type.output @@ -114,15 +114,9 @@ top_level function_expr parameter: parameter - type: - name_expr - identifier: identifier "Int" - return_type: - name_expr - identifier: identifier "Bool" - return_type: - name_expr - identifier: identifier "Bool" + type: identifier "Int" + return_type: identifier "Bool" + return_type: identifier "Bool" type_alias_declaration name: identifier "MixedParametersAndTuples" type: @@ -133,24 +127,14 @@ top_level function_expr parameter: parameter - type: - name_expr - identifier: identifier "Int" - return_type: - name_expr - identifier: identifier "Bool" + type: identifier "Int" + return_type: identifier "Bool" parameter - type: - name_expr - identifier: identifier "String" + type: identifier "String" return_type: tuple_expr element: argument - value: - name_expr - identifier: identifier "Bool" + value: identifier "Bool" argument - value: - name_expr - identifier: identifier "Int" + value: identifier "Int" diff --git a/unified/extractor/tests/corpus/swift/functions/variadic-function.output b/unified/extractor/tests/corpus/swift/functions/variadic-function.output index 9a87fa620158..888d71b41895 100644 --- a/unified/extractor/tests/corpus/swift/functions/variadic-function.output +++ b/unified/extractor/tests/corpus/swift/functions/variadic-function.output @@ -82,15 +82,9 @@ top_level parameter: parameter external_name: identifier "_" - type: - name_expr - identifier: identifier "Int" - pattern: - named_pattern - identifier: identifier "values" - return_type: - name_expr - identifier: identifier "Int" + type: identifier "Int" + pattern: identifier "values" + return_type: identifier "Int" body: block stmt: @@ -99,14 +93,10 @@ top_level call_expr callee: member_access_expr - base: - name_expr - identifier: identifier "values" + base: identifier "values" member: identifier "reduce" argument: argument value: int_literal "0" argument - value: - name_expr - identifier: identifier "+" + value: identifier "+" diff --git a/unified/extractor/tests/corpus/swift/literals/line-magic-literal.output b/unified/extractor/tests/corpus/swift/literals/line-magic-literal.output index d0fe61074147..291ab41d8fe4 100644 --- a/unified/extractor/tests/corpus/swift/literals/line-magic-literal.output +++ b/unified/extractor/tests/corpus/swift/literals/line-magic-literal.output @@ -34,7 +34,5 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "currentLine" + pattern: identifier "currentLine" value: unsupported_node "#line" diff --git a/unified/extractor/tests/corpus/swift/loops/break-and-continue.output b/unified/extractor/tests/corpus/swift/loops/break-and-continue.output index 524dfc851553..4143f2a5b99b 100644 --- a/unified/extractor/tests/corpus/swift/loops/break-and-continue.output +++ b/unified/extractor/tests/corpus/swift/loops/break-and-continue.output @@ -103,21 +103,15 @@ top_level block stmt: for_each_stmt - pattern: - named_pattern - identifier: identifier "x" - iterable: - name_expr - identifier: identifier "xs" + pattern: identifier "x" + iterable: identifier "xs" body: block stmt: if_expr condition: binary_expr - left: - name_expr - identifier: identifier "x" + left: identifier "x" operator: infix_operator "<" right: int_literal "0" then: @@ -126,20 +120,14 @@ top_level if_expr condition: binary_expr - left: - name_expr - identifier: identifier "x" + left: identifier "x" operator: infix_operator ">" right: int_literal "100" then: block stmt: break_expr "break" call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument - value: - name_expr - identifier: identifier "x" + value: identifier "x" diff --git a/unified/extractor/tests/corpus/swift/loops/for-in-over-array-literal.output b/unified/extractor/tests/corpus/swift/loops/for-in-over-array-literal.output index d8d851da1ec4..3eb9c22f53a7 100644 --- a/unified/extractor/tests/corpus/swift/loops/for-in-over-array-literal.output +++ b/unified/extractor/tests/corpus/swift/loops/for-in-over-array-literal.output @@ -61,9 +61,7 @@ top_level block stmt: for_each_stmt - pattern: - named_pattern - identifier: identifier "x" + pattern: identifier "x" iterable: array_literal element: @@ -74,11 +72,7 @@ top_level block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument - value: - name_expr - identifier: identifier "x" + value: identifier "x" diff --git a/unified/extractor/tests/corpus/swift/loops/for-in-over-range.output b/unified/extractor/tests/corpus/swift/loops/for-in-over-range.output index 1299d445a0ec..2dd2f67df8b2 100644 --- a/unified/extractor/tests/corpus/swift/loops/for-in-over-range.output +++ b/unified/extractor/tests/corpus/swift/loops/for-in-over-range.output @@ -53,9 +53,7 @@ top_level block stmt: for_each_stmt - pattern: - named_pattern - identifier: identifier "i" + pattern: identifier "i" iterable: binary_expr left: int_literal "0" @@ -65,11 +63,7 @@ top_level block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument - value: - name_expr - identifier: identifier "i" + value: identifier "i" diff --git a/unified/extractor/tests/corpus/swift/loops/for-in-with-where-clause.output b/unified/extractor/tests/corpus/swift/loops/for-in-with-where-clause.output index 50632ecf9f33..febf7450e2d1 100644 --- a/unified/extractor/tests/corpus/swift/loops/for-in-with-where-clause.output +++ b/unified/extractor/tests/corpus/swift/loops/for-in-with-where-clause.output @@ -59,28 +59,18 @@ top_level block stmt: for_each_stmt - pattern: - named_pattern - identifier: identifier "x" - iterable: - name_expr - identifier: identifier "xs" + pattern: identifier "x" + iterable: identifier "xs" guard: binary_expr - left: - name_expr - identifier: identifier "x" + left: identifier "x" operator: infix_operator ">" right: int_literal "0" body: block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument - value: - name_expr - identifier: identifier "x" + value: identifier "x" diff --git a/unified/extractor/tests/corpus/swift/loops/repeat-while-loop.output b/unified/extractor/tests/corpus/swift/loops/repeat-while-loop.output index 71c49fd2cd10..025cdb19f63f 100644 --- a/unified/extractor/tests/corpus/swift/loops/repeat-while-loop.output +++ b/unified/extractor/tests/corpus/swift/loops/repeat-while-loop.output @@ -52,15 +52,11 @@ top_level block stmt: compound_assign_expr - target: - name_expr - identifier: identifier "x" + target: identifier "x" operator: infix_operator "-=" value: int_literal "1" condition: binary_expr - left: - name_expr - identifier: identifier "x" + left: identifier "x" operator: infix_operator ">" right: int_literal "0" diff --git a/unified/extractor/tests/corpus/swift/loops/while-loop.output b/unified/extractor/tests/corpus/swift/loops/while-loop.output index 1132c6f9f819..54b3c20d61ab 100644 --- a/unified/extractor/tests/corpus/swift/loops/while-loop.output +++ b/unified/extractor/tests/corpus/swift/loops/while-loop.output @@ -51,17 +51,13 @@ top_level while_stmt condition: binary_expr - left: - name_expr - identifier: identifier "x" + left: identifier "x" operator: infix_operator ">" right: int_literal "0" body: block stmt: compound_assign_expr - target: - name_expr - identifier: identifier "x" + target: identifier "x" operator: infix_operator "-=" value: int_literal "1" diff --git a/unified/extractor/tests/corpus/swift/operators/addition.output b/unified/extractor/tests/corpus/swift/operators/addition.output index 9ba0f4de4770..d7607c50c10c 100644 --- a/unified/extractor/tests/corpus/swift/operators/addition.output +++ b/unified/extractor/tests/corpus/swift/operators/addition.output @@ -25,10 +25,6 @@ top_level block stmt: binary_expr - left: - name_expr - identifier: identifier "a" + left: identifier "a" operator: infix_operator "+" - right: - name_expr - identifier: identifier "b" + right: identifier "b" diff --git a/unified/extractor/tests/corpus/swift/operators/comparison.output b/unified/extractor/tests/corpus/swift/operators/comparison.output index 49bb8c996f2c..98d11f401bc8 100644 --- a/unified/extractor/tests/corpus/swift/operators/comparison.output +++ b/unified/extractor/tests/corpus/swift/operators/comparison.output @@ -25,10 +25,6 @@ top_level block stmt: binary_expr - left: - name_expr - identifier: identifier "a" + left: identifier "a" operator: infix_operator "<" - right: - name_expr - identifier: identifier "b" + right: identifier "b" diff --git a/unified/extractor/tests/corpus/swift/operators/custom-postfix-operator.output b/unified/extractor/tests/corpus/swift/operators/custom-postfix-operator.output index a16f291fbfab..df8ad5e47745 100644 --- a/unified/extractor/tests/corpus/swift/operators/custom-postfix-operator.output +++ b/unified/extractor/tests/corpus/swift/operators/custom-postfix-operator.output @@ -42,7 +42,5 @@ top_level unsupported_node "postfix operator ^^" variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "squared" + pattern: identifier "squared" value: unsupported_node "3^^" diff --git a/unified/extractor/tests/corpus/swift/operators/division.output b/unified/extractor/tests/corpus/swift/operators/division.output index f15dce8e8ea5..306a3639b3e1 100644 --- a/unified/extractor/tests/corpus/swift/operators/division.output +++ b/unified/extractor/tests/corpus/swift/operators/division.output @@ -25,10 +25,6 @@ top_level block stmt: binary_expr - left: - name_expr - identifier: identifier "a" + left: identifier "a" operator: infix_operator "/" - right: - name_expr - identifier: identifier "b" + right: identifier "b" diff --git a/unified/extractor/tests/corpus/swift/operators/equality.output b/unified/extractor/tests/corpus/swift/operators/equality.output index 7cf139ffa18d..7280d13ff1aa 100644 --- a/unified/extractor/tests/corpus/swift/operators/equality.output +++ b/unified/extractor/tests/corpus/swift/operators/equality.output @@ -25,10 +25,6 @@ top_level block stmt: binary_expr - left: - name_expr - identifier: identifier "a" + left: identifier "a" operator: infix_operator "==" - right: - name_expr - identifier: identifier "b" + right: identifier "b" diff --git a/unified/extractor/tests/corpus/swift/operators/logical-and.output b/unified/extractor/tests/corpus/swift/operators/logical-and.output index 32a71ed1088c..102b83ec6ed4 100644 --- a/unified/extractor/tests/corpus/swift/operators/logical-and.output +++ b/unified/extractor/tests/corpus/swift/operators/logical-and.output @@ -25,10 +25,6 @@ top_level block stmt: binary_expr - left: - name_expr - identifier: identifier "a" + left: identifier "a" operator: infix_operator "&&" - right: - name_expr - identifier: identifier "b" + right: identifier "b" diff --git a/unified/extractor/tests/corpus/swift/operators/logical-not.output b/unified/extractor/tests/corpus/swift/operators/logical-not.output index 1e80aa2ca71e..03476b41def3 100644 --- a/unified/extractor/tests/corpus/swift/operators/logical-not.output +++ b/unified/extractor/tests/corpus/swift/operators/logical-not.output @@ -20,7 +20,5 @@ top_level block stmt: unary_expr - operand: - name_expr - identifier: identifier "a" + operand: identifier "a" operator: prefix_operator "!" diff --git a/unified/extractor/tests/corpus/swift/operators/logical-or.output b/unified/extractor/tests/corpus/swift/operators/logical-or.output index b75d018dea71..8a447d8bb9fd 100644 --- a/unified/extractor/tests/corpus/swift/operators/logical-or.output +++ b/unified/extractor/tests/corpus/swift/operators/logical-or.output @@ -25,10 +25,6 @@ top_level block stmt: binary_expr - left: - name_expr - identifier: identifier "a" + left: identifier "a" operator: infix_operator "||" - right: - name_expr - identifier: identifier "b" + right: identifier "b" diff --git a/unified/extractor/tests/corpus/swift/operators/multiplication.output b/unified/extractor/tests/corpus/swift/operators/multiplication.output index 387c16439c48..0313287d9431 100644 --- a/unified/extractor/tests/corpus/swift/operators/multiplication.output +++ b/unified/extractor/tests/corpus/swift/operators/multiplication.output @@ -25,10 +25,6 @@ top_level block stmt: binary_expr - left: - name_expr - identifier: identifier "a" + left: identifier "a" operator: infix_operator "*" - right: - name_expr - identifier: identifier "b" + right: identifier "b" diff --git a/unified/extractor/tests/corpus/swift/operators/operator-precedence-addition-and-multiplication.output b/unified/extractor/tests/corpus/swift/operators/operator-precedence-addition-and-multiplication.output index f458c3ef847c..abbc1c6d5782 100644 --- a/unified/extractor/tests/corpus/swift/operators/operator-precedence-addition-and-multiplication.output +++ b/unified/extractor/tests/corpus/swift/operators/operator-precedence-addition-and-multiplication.output @@ -33,16 +33,10 @@ top_level block stmt: binary_expr - left: - name_expr - identifier: identifier "a" + left: identifier "a" operator: infix_operator "+" right: binary_expr - left: - name_expr - identifier: identifier "b" + left: identifier "b" operator: infix_operator "*" - right: - name_expr - identifier: identifier "c" + right: identifier "c" diff --git a/unified/extractor/tests/corpus/swift/operators/parenthesised-expression.output b/unified/extractor/tests/corpus/swift/operators/parenthesised-expression.output index 0324476ce994..1c8de726f41a 100644 --- a/unified/extractor/tests/corpus/swift/operators/parenthesised-expression.output +++ b/unified/extractor/tests/corpus/swift/operators/parenthesised-expression.output @@ -41,6 +41,4 @@ top_level binary_expr left: tuple_expr "(a + b)" operator: infix_operator "*" - right: - name_expr - identifier: identifier "c" + right: identifier "c" diff --git a/unified/extractor/tests/corpus/swift/operators/partial-range-from.output b/unified/extractor/tests/corpus/swift/operators/partial-range-from.output index 300d3e7c2e69..6b0a834494ec 100644 --- a/unified/extractor/tests/corpus/swift/operators/partial-range-from.output +++ b/unified/extractor/tests/corpus/swift/operators/partial-range-from.output @@ -34,7 +34,5 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "range" + pattern: identifier "range" value: unsupported_node "3..." diff --git a/unified/extractor/tests/corpus/swift/operators/subtraction.output b/unified/extractor/tests/corpus/swift/operators/subtraction.output index 5c6fd51a2d38..63b4662fb575 100644 --- a/unified/extractor/tests/corpus/swift/operators/subtraction.output +++ b/unified/extractor/tests/corpus/swift/operators/subtraction.output @@ -25,10 +25,6 @@ top_level block stmt: binary_expr - left: - name_expr - identifier: identifier "a" + left: identifier "a" operator: infix_operator "-" - right: - name_expr - identifier: identifier "b" + right: identifier "b" diff --git a/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-casts.output b/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-casts.output index 27e81c82766e..f557670b2ff7 100644 --- a/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-casts.output +++ b/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-casts.output @@ -98,44 +98,30 @@ top_level parameter: parameter external_name: identifier "_" - type: - name_expr - identifier: identifier "Any" - pattern: - named_pattern - identifier: identifier "a" + type: identifier "Any" + pattern: identifier "a" parameter external_name: identifier "_" - type: - name_expr - identifier: identifier "Int" - pattern: - named_pattern - identifier: identifier "b" + type: identifier "Int" + pattern: identifier "b" body: block stmt: unresolved_operator_sequence element: - name_expr - identifier: identifier "_" + identifier "_" infix_operator "=" - name_expr - identifier: identifier "a" + identifier "a" infix_operator "as" unsupported_node "Int" infix_operator ".&" - name_expr - identifier: identifier "b" + identifier "b" unresolved_operator_sequence element: - name_expr - identifier: identifier "_" + identifier "_" infix_operator "=" - name_expr - identifier: identifier "a" + identifier "a" infix_operator "is" unsupported_node "Int" infix_operator ".&" - name_expr - identifier: identifier "b" + identifier "b" diff --git a/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-ternary.output b/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-ternary.output index 3bd9a4e920cb..4d33c7dbd388 100644 --- a/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-ternary.output +++ b/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-ternary.output @@ -104,39 +104,21 @@ top_level parameter: parameter external_name: identifier "_" - type: - name_expr - identifier: identifier "Bool" - pattern: - named_pattern - identifier: identifier "c" + type: identifier "Bool" + pattern: identifier "c" parameter external_name: identifier "_" - type: - name_expr - identifier: identifier "Int" - pattern: - named_pattern - identifier: identifier "a" + type: identifier "Int" + pattern: identifier "a" parameter external_name: identifier "_" - type: - name_expr - identifier: identifier "Int" - pattern: - named_pattern - identifier: identifier "b" + type: identifier "Int" + pattern: identifier "b" parameter external_name: identifier "_" - type: - name_expr - identifier: identifier "Int" - pattern: - named_pattern - identifier: identifier "d" - return_type: - name_expr - identifier: identifier "Int" + type: identifier "Int" + pattern: identifier "d" + return_type: identifier "Int" body: block stmt: @@ -144,14 +126,10 @@ top_level value: unresolved_operator_sequence element: - name_expr - identifier: identifier "c" + identifier "c" infix_operator "?" - name_expr - identifier: identifier "a" + identifier "a" infix_operator ":" - name_expr - identifier: identifier "b" + identifier "b" infix_operator ".&" - name_expr - identifier: identifier "d" + identifier "d" diff --git a/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence.output b/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence.output index dc652b757aba..477de980d2da 100644 --- a/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence.output +++ b/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence.output @@ -71,30 +71,19 @@ top_level parameter: parameter external_name: identifier "_" - type: - name_expr - identifier: identifier "Int" - pattern: - named_pattern - identifier: identifier "a" + type: identifier "Int" + pattern: identifier "a" parameter external_name: identifier "_" - type: - name_expr - identifier: identifier "Int" - pattern: - named_pattern - identifier: identifier "b" + type: identifier "Int" + pattern: identifier "b" body: block stmt: unresolved_operator_sequence element: - name_expr - identifier: identifier "_" + identifier "_" infix_operator "=" - name_expr - identifier: identifier "a" + identifier "a" infix_operator ".&" - name_expr - identifier: identifier "b" + identifier "b" diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/catch-where-clauses.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/catch-where-clauses.output index c44fbeade974..3a603e8f504c 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/catch-where-clauses.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/catch-where-clauses.output @@ -147,9 +147,7 @@ top_level unary_expr operand: call_expr - callee: - name_expr - identifier: identifier "foo" + callee: identifier "foo" operator: prefix_operator "try" catch_clause: catch_clause @@ -159,44 +157,30 @@ top_level conditional_pattern condition: call_expr - callee: - name_expr - identifier: identifier "isNetworkError" + callee: identifier "isNetworkError" argument: argument - value: - name_expr - identifier: identifier "e" + value: identifier "e" pattern: expr_pattern modifier: modifier "let" - expr: - named_pattern - identifier: identifier "e" + expr: identifier "e" conditional_pattern condition: call_expr - callee: - name_expr - identifier: identifier "isTimeout" + callee: identifier "isTimeout" argument: argument - value: - name_expr - identifier: identifier "f" + value: identifier "f" pattern: expr_pattern modifier: modifier "let" - expr: - named_pattern - identifier: identifier "f" + expr: identifier "f" body: block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument value: string_literal "\"retry\"" @@ -205,9 +189,7 @@ top_level block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument value: string_literal "\"fallback\"" diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/do-catch.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/do-catch.output index 81491b295fc1..8db6319fd778 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/do-catch.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/do-catch.output @@ -68,9 +68,7 @@ top_level unary_expr operand: call_expr - callee: - name_expr - identifier: identifier "foo" + callee: identifier "foo" operator: prefix_operator "try" catch_clause: catch_clause @@ -78,11 +76,7 @@ top_level block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument - value: - name_expr - identifier: identifier "error" + value: identifier "error" diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/force-unwrap.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/force-unwrap.output index a7014629e1b0..c977adaaa3f3 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/force-unwrap.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/force-unwrap.output @@ -34,12 +34,8 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "n" + pattern: identifier "n" value: unary_expr - operand: - name_expr - identifier: identifier "opt" + operand: identifier "opt" operator: postfix_operator "!" diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/nil-coalescing.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/nil-coalescing.output index c90fe3ae7f36..c8b6a85d6203 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/nil-coalescing.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/nil-coalescing.output @@ -39,13 +39,9 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "n" + pattern: identifier "n" value: binary_expr - left: - name_expr - identifier: identifier "opt" + left: identifier "opt" operator: infix_operator "??" right: int_literal "0" diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-chaining.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-chaining.output index 8f07d4a51d8a..6752c80348ce 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-chaining.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-chaining.output @@ -49,15 +49,11 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "n" + pattern: identifier "n" value: member_access_expr base: member_access_expr - base: - name_expr - identifier: identifier "obj" + base: identifier "obj" member: identifier "foo" member: identifier "bar" diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.output index 6ff9453e3296..c94032771ccf 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.output @@ -83,9 +83,7 @@ top_level call_expr callee: member_access_expr - base: - name_expr - identifier: identifier "Optional" + base: identifier "Optional" member: identifier "some" argument: argument @@ -100,21 +98,13 @@ top_level value: expr_pattern modifier: modifier "let" - expr: - named_pattern - identifier: identifier "value" - value: - name_expr - identifier: identifier "input" + expr: identifier "value" + value: identifier "input" then: block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument - value: - name_expr - identifier: identifier "value" + value: identifier "value" diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-type-annotation.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-type-annotation.output index 132f3a424475..dd73c9899745 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-type-annotation.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-type-annotation.output @@ -40,15 +40,9 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "x" + pattern: identifier "x" type: generic_type_expr - base: - name_expr - identifier: identifier "Optional" - type_argument: - name_expr - identifier: identifier "Int" + base: identifier "Optional" + type_argument: identifier "Int" value: builtin_expr "nil" diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/throwing-function.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/throwing-function.output index 03ad472b33e0..33346c4f38b8 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/throwing-function.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/throwing-function.output @@ -57,9 +57,7 @@ top_level stmt: function_declaration name: identifier "read" - return_type: - name_expr - identifier: identifier "String" + return_type: identifier "String" body: block stmt: diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/try-expression-2.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/try-expression-2.output index c7fe32e98bd4..faacc2583539 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/try-expression-2.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/try-expression-2.output @@ -41,14 +41,10 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "result" + pattern: identifier "result" value: unary_expr operand: call_expr - callee: - name_expr - identifier: identifier "foo" + callee: identifier "foo" operator: prefix_operator "try!" diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/try-expression.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/try-expression.output index 269d77f7c0ad..a5e07f561208 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/try-expression.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/try-expression.output @@ -41,14 +41,10 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "result" + pattern: identifier "result" value: unary_expr operand: call_expr - callee: - name_expr - identifier: identifier "foo" + callee: identifier "foo" operator: prefix_operator "try?" diff --git a/unified/extractor/tests/corpus/swift/types/binding-modifier-does-not-leak-into-accessor-body.output b/unified/extractor/tests/corpus/swift/types/binding-modifier-does-not-leak-into-accessor-body.output index 9bcd96de183b..a69eaa87ec54 100644 --- a/unified/extractor/tests/corpus/swift/types/binding-modifier-does-not-leak-into-accessor-body.output +++ b/unified/extractor/tests/corpus/swift/types/binding-modifier-does-not-leak-into-accessor-body.output @@ -100,21 +100,15 @@ top_level modifier: modifier "var" name: identifier "p" accessor_kind: accessor_kind "get" - type: - name_expr - identifier: identifier "Int" + type: identifier "Int" body: block stmt: switch_expr - value: - name_expr - identifier: identifier "y" + value: identifier "y" case: switch_case - pattern: - name_expr - identifier: identifier "someConstant" + pattern: identifier "someConstant" body: block stmt: diff --git a/unified/extractor/tests/corpus/swift/types/class-inheritance.output b/unified/extractor/tests/corpus/swift/types/class-inheritance.output index 9eff2e05f4a7..497d55d2a638 100644 --- a/unified/extractor/tests/corpus/swift/types/class-inheritance.output +++ b/unified/extractor/tests/corpus/swift/types/class-inheritance.output @@ -37,6 +37,4 @@ top_level name: identifier "Dog" base_type: base_type - type: - name_expr - identifier: identifier "Animal" + type: identifier "Animal" diff --git a/unified/extractor/tests/corpus/swift/types/class-with-initializer.output b/unified/extractor/tests/corpus/swift/types/class-with-initializer.output index 814badd5672d..a1821edafa1d 100644 --- a/unified/extractor/tests/corpus/swift/types/class-with-initializer.output +++ b/unified/extractor/tests/corpus/swift/types/class-with-initializer.output @@ -96,31 +96,19 @@ top_level member: variable_declaration modifier: modifier "var" - pattern: - named_pattern - identifier: identifier "x" - type: - name_expr - identifier: identifier "Int" + pattern: identifier "x" + type: identifier "Int" constructor_declaration parameter: parameter - type: - name_expr - identifier: identifier "Int" - pattern: - named_pattern - identifier: identifier "x" + type: identifier "Int" + pattern: identifier "x" body: block stmt: assign_expr target: member_access_expr - base: - name_expr - identifier: identifier "self" + base: identifier "self" member: identifier "x" - value: - name_expr - identifier: identifier "x" + value: identifier "x" diff --git a/unified/extractor/tests/corpus/swift/types/class-with-method.output b/unified/extractor/tests/corpus/swift/types/class-with-method.output index 6d705579a6df..b0a95f9aefe2 100644 --- a/unified/extractor/tests/corpus/swift/types/class-with-method.output +++ b/unified/extractor/tests/corpus/swift/types/class-with-method.output @@ -83,9 +83,7 @@ top_level member: variable_declaration modifier: modifier "var" - pattern: - named_pattern - identifier: identifier "n" + pattern: identifier "n" value: int_literal "0" function_declaration name: identifier "bump" @@ -93,8 +91,6 @@ top_level block stmt: compound_assign_expr - target: - name_expr - identifier: identifier "n" + target: identifier "n" operator: infix_operator "+=" value: int_literal "1" diff --git a/unified/extractor/tests/corpus/swift/types/class-with-multiple-base-types.output b/unified/extractor/tests/corpus/swift/types/class-with-multiple-base-types.output index 3075db477518..20db0ee87754 100644 --- a/unified/extractor/tests/corpus/swift/types/class-with-multiple-base-types.output +++ b/unified/extractor/tests/corpus/swift/types/class-with-multiple-base-types.output @@ -42,10 +42,6 @@ top_level name: identifier "Button" base_type: base_type - type: - name_expr - identifier: identifier "Control" + type: identifier "Control" base_type - type: - name_expr - identifier: identifier "Drawable" + type: identifier "Drawable" diff --git a/unified/extractor/tests/corpus/swift/types/class-with-stored-properties.output b/unified/extractor/tests/corpus/swift/types/class-with-stored-properties.output index 456632aee765..440f2a9bae5c 100644 --- a/unified/extractor/tests/corpus/swift/types/class-with-stored-properties.output +++ b/unified/extractor/tests/corpus/swift/types/class-with-stored-properties.output @@ -67,17 +67,9 @@ top_level member: variable_declaration modifier: modifier "var" - pattern: - named_pattern - identifier: identifier "x" - type: - name_expr - identifier: identifier "Int" + pattern: identifier "x" + type: identifier "Int" variable_declaration modifier: modifier "var" - pattern: - named_pattern - identifier: identifier "y" - type: - name_expr - identifier: identifier "Int" + pattern: identifier "y" + type: identifier "Int" diff --git a/unified/extractor/tests/corpus/swift/types/computed-property.output b/unified/extractor/tests/corpus/swift/types/computed-property.output index d1472abad268..e02bf629c7b7 100644 --- a/unified/extractor/tests/corpus/swift/types/computed-property.output +++ b/unified/extractor/tests/corpus/swift/types/computed-property.output @@ -107,37 +107,23 @@ top_level member: variable_declaration modifier: modifier "var" - pattern: - named_pattern - identifier: identifier "w" - type: - name_expr - identifier: identifier "Double" + pattern: identifier "w" + type: identifier "Double" variable_declaration modifier: modifier "var" - pattern: - named_pattern - identifier: identifier "h" - type: - name_expr - identifier: identifier "Double" + pattern: identifier "h" + type: identifier "Double" accessor_declaration modifier: modifier "var" name: identifier "area" accessor_kind: accessor_kind "get" - type: - name_expr - identifier: identifier "Double" + type: identifier "Double" body: block stmt: return_expr value: binary_expr - left: - name_expr - identifier: identifier "w" + left: identifier "w" operator: infix_operator "*" - right: - name_expr - identifier: identifier "h" + right: identifier "h" diff --git a/unified/extractor/tests/corpus/swift/types/constructor-with-parameters.output b/unified/extractor/tests/corpus/swift/types/constructor-with-parameters.output index 9b943de8c8d1..e3ca48312608 100644 --- a/unified/extractor/tests/corpus/swift/types/constructor-with-parameters.output +++ b/unified/extractor/tests/corpus/swift/types/constructor-with-parameters.output @@ -71,18 +71,10 @@ top_level parameter: parameter external_name: identifier "width" - type: - name_expr - identifier: identifier "Int" - pattern: - named_pattern - identifier: identifier "w" + type: identifier "Int" + pattern: identifier "w" parameter external_name: identifier "height" - type: - name_expr - identifier: identifier "Int" - pattern: - named_pattern - identifier: identifier "h" + type: identifier "Int" + pattern: identifier "h" body: block "init(width w: Int, height h: Int) {}" diff --git a/unified/extractor/tests/corpus/swift/types/enum-with-associated-values.output b/unified/extractor/tests/corpus/swift/types/enum-with-associated-values.output index b8a86a5b57d7..b8038d1797ac 100644 --- a/unified/extractor/tests/corpus/swift/types/enum-with-associated-values.output +++ b/unified/extractor/tests/corpus/swift/types/enum-with-associated-values.output @@ -80,12 +80,8 @@ top_level constructor_declaration parameter: parameter - type: - name_expr - identifier: identifier "Double" - pattern: - named_pattern - identifier: identifier "radius" + type: identifier "Double" + pattern: identifier "radius" body: block "circle(radius: Double)" class_like_declaration modifier: modifier "enum_case" @@ -94,10 +90,6 @@ top_level constructor_declaration parameter: parameter - type: - name_expr - identifier: identifier "Double" - pattern: - named_pattern - identifier: identifier "side" + type: identifier "Double" + pattern: identifier "side" body: block "square(side: Double)" diff --git a/unified/extractor/tests/corpus/swift/types/enum-with-cases.output b/unified/extractor/tests/corpus/swift/types/enum-with-cases.output index a73235cbdc53..99e3792af512 100644 --- a/unified/extractor/tests/corpus/swift/types/enum-with-cases.output +++ b/unified/extractor/tests/corpus/swift/types/enum-with-cases.output @@ -71,21 +71,13 @@ top_level member: variable_declaration modifier: modifier "enum_case" - pattern: - named_pattern - identifier: identifier "north" + pattern: identifier "north" variable_declaration modifier: modifier "enum_case" - pattern: - named_pattern - identifier: identifier "south" + pattern: identifier "south" variable_declaration modifier: modifier "enum_case" - pattern: - named_pattern - identifier: identifier "east" + pattern: identifier "east" variable_declaration modifier: modifier "enum_case" - pattern: - named_pattern - identifier: identifier "west" + pattern: identifier "west" diff --git a/unified/extractor/tests/corpus/swift/types/enum-with-comma-separated-cases-chained-declaration.output b/unified/extractor/tests/corpus/swift/types/enum-with-comma-separated-cases-chained-declaration.output index 840e6fd1425c..4e7353b2ec2a 100644 --- a/unified/extractor/tests/corpus/swift/types/enum-with-comma-separated-cases-chained-declaration.output +++ b/unified/extractor/tests/corpus/swift/types/enum-with-comma-separated-cases-chained-declaration.output @@ -50,27 +50,19 @@ top_level member: variable_declaration modifier: modifier "enum_case" - pattern: - named_pattern - identifier: identifier "clubs" + pattern: identifier "clubs" variable_declaration modifier: modifier "chained_declaration" modifier "enum_case" - pattern: - named_pattern - identifier: identifier "diamonds" + pattern: identifier "diamonds" variable_declaration modifier: modifier "chained_declaration" modifier "enum_case" - pattern: - named_pattern - identifier: identifier "hearts" + pattern: identifier "hearts" variable_declaration modifier: modifier "chained_declaration" modifier "enum_case" - pattern: - named_pattern - identifier: identifier "spades" + pattern: identifier "spades" diff --git a/unified/extractor/tests/corpus/swift/types/extension.output b/unified/extractor/tests/corpus/swift/types/extension.output index 943674ae2d4d..fac2a1ee614f 100644 --- a/unified/extractor/tests/corpus/swift/types/extension.output +++ b/unified/extractor/tests/corpus/swift/types/extension.output @@ -74,19 +74,13 @@ top_level member: function_declaration name: identifier "squared" - return_type: - name_expr - identifier: identifier "Int" + return_type: identifier "Int" body: block stmt: return_expr value: binary_expr - left: - name_expr - identifier: identifier "self" + left: identifier "self" operator: infix_operator "*" - right: - name_expr - identifier: identifier "self" + right: identifier "self" diff --git a/unified/extractor/tests/corpus/swift/types/function-type-with-convention-attribute.output b/unified/extractor/tests/corpus/swift/types/function-type-with-convention-attribute.output index d7dc17326afe..1522ef79c8a4 100644 --- a/unified/extractor/tests/corpus/swift/types/function-type-with-convention-attribute.output +++ b/unified/extractor/tests/corpus/swift/types/function-type-with-convention-attribute.output @@ -64,9 +64,7 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "callback" + pattern: identifier "callback" type: unsupported_node "@convention(c) () -> Void" value: function_expr diff --git a/unified/extractor/tests/corpus/swift/types/function-type-with-sendable-attribute.output b/unified/extractor/tests/corpus/swift/types/function-type-with-sendable-attribute.output index 3228b81bc456..8478fad42c7e 100644 --- a/unified/extractor/tests/corpus/swift/types/function-type-with-sendable-attribute.output +++ b/unified/extractor/tests/corpus/swift/types/function-type-with-sendable-attribute.output @@ -57,9 +57,7 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "handler" + pattern: identifier "handler" type: unsupported_node "@Sendable () -> Void" value: function_expr diff --git a/unified/extractor/tests/corpus/swift/types/generic-class-parameters-and-constraints.output b/unified/extractor/tests/corpus/swift/types/generic-class-parameters-and-constraints.output index 0b1152ce4678..bab8e792f82e 100644 --- a/unified/extractor/tests/corpus/swift/types/generic-class-parameters-and-constraints.output +++ b/unified/extractor/tests/corpus/swift/types/generic-class-parameters-and-constraints.output @@ -72,23 +72,13 @@ top_level type_parameter: type_parameter name: identifier "T" - bound: - name_expr - identifier: identifier "Equatable" + bound: identifier "Equatable" type_parameter name: identifier "U" type_constraint: bound_type_constraint - type: - name_expr - identifier: identifier "U" - bound: - name_expr - identifier: identifier "Equatable" + type: identifier "U" + bound: identifier "Equatable" equality_type_constraint - left: - name_expr - identifier: identifier "U" - right: - name_expr - identifier: identifier "T" + left: identifier "U" + right: identifier "T" diff --git a/unified/extractor/tests/corpus/swift/types/generic-type-arguments.output b/unified/extractor/tests/corpus/swift/types/generic-type-arguments.output index 3c3310d0dbed..17cdddf083fb 100644 --- a/unified/extractor/tests/corpus/swift/types/generic-type-arguments.output +++ b/unified/extractor/tests/corpus/swift/types/generic-type-arguments.output @@ -62,22 +62,13 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "cache" + pattern: identifier "cache" type: generic_type_expr - base: - name_expr - identifier: identifier "Dictionary" + base: identifier "Dictionary" type_argument: - name_expr - identifier: identifier "String" + identifier "String" generic_type_expr - base: - name_expr - identifier: identifier "Array" - type_argument: - name_expr - identifier: identifier "Int" + base: identifier "Array" + type_argument: identifier "Int" value: map_literal "[:]" diff --git a/unified/extractor/tests/corpus/swift/types/inline-array-type.output b/unified/extractor/tests/corpus/swift/types/inline-array-type.output index b0e08711e9a2..0be81cb39306 100644 --- a/unified/extractor/tests/corpus/swift/types/inline-array-type.output +++ b/unified/extractor/tests/corpus/swift/types/inline-array-type.output @@ -65,9 +65,7 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "triple" + pattern: identifier "triple" type: unsupported_node "[3 of Int]" value: array_literal diff --git a/unified/extractor/tests/corpus/swift/types/noncopyable-type.output b/unified/extractor/tests/corpus/swift/types/noncopyable-type.output index 784a0139a760..7239db059235 100644 --- a/unified/extractor/tests/corpus/swift/types/noncopyable-type.output +++ b/unified/extractor/tests/corpus/swift/types/noncopyable-type.output @@ -63,9 +63,5 @@ top_level member: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "descriptor" - type: - name_expr - identifier: identifier "Int" + pattern: identifier "descriptor" + type: identifier "Int" diff --git a/unified/extractor/tests/corpus/swift/types/property-with-getter-and-setter.output b/unified/extractor/tests/corpus/swift/types/property-with-getter-and-setter.output index 60183b0ff7b5..9bf243aae9bb 100644 --- a/unified/extractor/tests/corpus/swift/types/property-with-getter-and-setter.output +++ b/unified/extractor/tests/corpus/swift/types/property-with-getter-and-setter.output @@ -114,40 +114,28 @@ top_level modifier: modifier "var" modifier "private" - pattern: - named_pattern - identifier: identifier "_v" + pattern: identifier "_v" value: int_literal "0" accessor_declaration modifier: modifier "var" name: identifier "v" accessor_kind: accessor_kind "get" - type: - name_expr - identifier: identifier "Int" + type: identifier "Int" body: block stmt: return_expr - value: - name_expr - identifier: identifier "_v" + value: identifier "_v" accessor_declaration modifier: modifier "var" modifier "chained_declaration" name: identifier "v" accessor_kind: accessor_kind "set" - type: - name_expr - identifier: identifier "Int" + type: identifier "Int" body: block stmt: assign_expr - target: - name_expr - identifier: identifier "_v" - value: - name_expr - identifier: identifier "newValue" + target: identifier "_v" + value: identifier "newValue" diff --git a/unified/extractor/tests/corpus/swift/types/protocol-with-read-only-and-read-write-property-requirements.output b/unified/extractor/tests/corpus/swift/types/protocol-with-read-only-and-read-write-property-requirements.output index fa1f7771e511..2ed1dc4cc3f2 100644 --- a/unified/extractor/tests/corpus/swift/types/protocol-with-read-only-and-read-write-property-requirements.output +++ b/unified/extractor/tests/corpus/swift/types/protocol-with-read-only-and-read-write-property-requirements.output @@ -87,19 +87,13 @@ top_level accessor_declaration name: identifier "foo" accessor_kind: accessor_kind "get" - type: - name_expr - identifier: identifier "Int" + type: identifier "Int" accessor_declaration name: identifier "bar" accessor_kind: accessor_kind "get" - type: - name_expr - identifier: identifier "String" + type: identifier "String" accessor_declaration modifier: modifier "chained_declaration" name: identifier "bar" accessor_kind: accessor_kind "set" - type: - name_expr - identifier: identifier "String" + type: identifier "String" diff --git a/unified/extractor/tests/corpus/swift/types/qualified-type.output b/unified/extractor/tests/corpus/swift/types/qualified-type.output index 12dd46786964..cf3cf07d832b 100644 --- a/unified/extractor/tests/corpus/swift/types/qualified-type.output +++ b/unified/extractor/tests/corpus/swift/types/qualified-type.output @@ -114,26 +114,18 @@ top_level name: identifier "Deep" variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "value" + pattern: identifier "value" type: member_access_expr - base: - name_expr - identifier: identifier "Outer" + base: identifier "Outer" member: identifier "Inner" variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "nested" + pattern: identifier "nested" type: member_access_expr base: member_access_expr - base: - name_expr - identifier: identifier "Outer" + base: identifier "Outer" member: identifier "Inner" member: identifier "Deep" diff --git a/unified/extractor/tests/corpus/swift/types/struct.output b/unified/extractor/tests/corpus/swift/types/struct.output index 6ea2d81c0c67..eb04e0e5d79c 100644 --- a/unified/extractor/tests/corpus/swift/types/struct.output +++ b/unified/extractor/tests/corpus/swift/types/struct.output @@ -67,17 +67,9 @@ top_level member: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "x" - type: - name_expr - identifier: identifier "Int" + pattern: identifier "x" + type: identifier "Int" variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "y" - type: - name_expr - identifier: identifier "Int" + pattern: identifier "y" + type: identifier "Int" diff --git a/unified/extractor/tests/corpus/swift/variables/assignment.output b/unified/extractor/tests/corpus/swift/variables/assignment.output index a011eb76cafc..a81c74dd6c29 100644 --- a/unified/extractor/tests/corpus/swift/variables/assignment.output +++ b/unified/extractor/tests/corpus/swift/variables/assignment.output @@ -25,7 +25,5 @@ top_level block stmt: assign_expr - target: - name_expr - identifier: identifier "x" + target: identifier "x" value: int_literal "1" diff --git a/unified/extractor/tests/corpus/swift/variables/binding-modifier-does-not-leak-into-initializer.output b/unified/extractor/tests/corpus/swift/variables/binding-modifier-does-not-leak-into-initializer.output index d6d9516b93f5..6776009f62bb 100644 --- a/unified/extractor/tests/corpus/swift/variables/binding-modifier-does-not-leak-into-initializer.output +++ b/unified/extractor/tests/corpus/swift/variables/binding-modifier-does-not-leak-into-initializer.output @@ -67,19 +67,13 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "x" + pattern: identifier "x" value: switch_expr - value: - name_expr - identifier: identifier "y" + value: identifier "y" case: switch_case - pattern: - name_expr - identifier: identifier "someConstant" + pattern: identifier "someConstant" body: block stmt: int_literal "1" diff --git a/unified/extractor/tests/corpus/swift/variables/compound-assignment.output b/unified/extractor/tests/corpus/swift/variables/compound-assignment.output index 485b5044ad69..0189512f9abd 100644 --- a/unified/extractor/tests/corpus/swift/variables/compound-assignment.output +++ b/unified/extractor/tests/corpus/swift/variables/compound-assignment.output @@ -25,8 +25,6 @@ top_level block stmt: compound_assign_expr - target: - name_expr - identifier: identifier "x" + target: identifier "x" operator: infix_operator "+=" value: int_literal "1" diff --git a/unified/extractor/tests/corpus/swift/variables/let-binding.output b/unified/extractor/tests/corpus/swift/variables/let-binding.output index 00cf7be87c3f..d4cefc129d47 100644 --- a/unified/extractor/tests/corpus/swift/variables/let-binding.output +++ b/unified/extractor/tests/corpus/swift/variables/let-binding.output @@ -31,7 +31,5 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "x" + pattern: identifier "x" value: int_literal "1" diff --git a/unified/extractor/tests/corpus/swift/variables/let-with-type-annotation.output b/unified/extractor/tests/corpus/swift/variables/let-with-type-annotation.output index 112cca7e7b07..8a28988e8b9d 100644 --- a/unified/extractor/tests/corpus/swift/variables/let-with-type-annotation.output +++ b/unified/extractor/tests/corpus/swift/variables/let-with-type-annotation.output @@ -37,10 +37,6 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "x" - type: - name_expr - identifier: identifier "Int" + pattern: identifier "x" + type: identifier "Int" value: int_literal "1" diff --git a/unified/extractor/tests/corpus/swift/variables/multiple-bindings-on-one-line.output b/unified/extractor/tests/corpus/swift/variables/multiple-bindings-on-one-line.output index 1c46136955ff..2ab4bc96691f 100644 --- a/unified/extractor/tests/corpus/swift/variables/multiple-bindings-on-one-line.output +++ b/unified/extractor/tests/corpus/swift/variables/multiple-bindings-on-one-line.output @@ -42,15 +42,11 @@ top_level stmt: variable_declaration modifier: modifier "let" - pattern: - named_pattern - identifier: identifier "x" + pattern: identifier "x" value: int_literal "1" variable_declaration modifier: modifier "let" modifier "chained_declaration" - pattern: - named_pattern - identifier: identifier "y" + pattern: identifier "y" value: int_literal "2" diff --git a/unified/extractor/tests/corpus/swift/variables/property-with-willset-and-didset-observers.output b/unified/extractor/tests/corpus/swift/variables/property-with-willset-and-didset-observers.output index 79945f6fb16b..8531885ad9d0 100644 --- a/unified/extractor/tests/corpus/swift/variables/property-with-willset-and-didset-observers.output +++ b/unified/extractor/tests/corpus/swift/variables/property-with-willset-and-didset-observers.output @@ -107,12 +107,8 @@ top_level member: variable_declaration modifier: modifier "var" - pattern: - named_pattern - identifier: identifier "x" - type: - name_expr - identifier: identifier "Int" + pattern: identifier "x" + type: identifier "Int" value: int_literal "0" accessor_declaration modifier: @@ -124,14 +120,10 @@ top_level block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument - value: - name_expr - identifier: identifier "newValue" + value: identifier "newValue" accessor_declaration modifier: modifier "var" @@ -142,11 +134,7 @@ top_level block stmt: call_expr - callee: - name_expr - identifier: identifier "print" + callee: identifier "print" argument: argument - value: - name_expr - identifier: identifier "oldValue" + value: identifier "oldValue" diff --git a/unified/extractor/tests/corpus/swift/variables/tuple-destructuring-binding.output b/unified/extractor/tests/corpus/swift/variables/tuple-destructuring-binding.output index 8fc96f0feeba..1036f85b4e94 100644 --- a/unified/extractor/tests/corpus/swift/variables/tuple-destructuring-binding.output +++ b/unified/extractor/tests/corpus/swift/variables/tuple-destructuring-binding.output @@ -46,13 +46,7 @@ top_level tuple_expr element: argument - value: - named_pattern - identifier: identifier "a" + value: identifier "a" argument - value: - named_pattern - identifier: identifier "b" - value: - name_expr - identifier: identifier "pair" + value: identifier "b" + value: identifier "pair" diff --git a/unified/extractor/tests/corpus/swift/variables/var-binding.output b/unified/extractor/tests/corpus/swift/variables/var-binding.output index babfbc9583bf..a2c717034c0d 100644 --- a/unified/extractor/tests/corpus/swift/variables/var-binding.output +++ b/unified/extractor/tests/corpus/swift/variables/var-binding.output @@ -31,7 +31,5 @@ top_level stmt: variable_declaration modifier: modifier "var" - pattern: - named_pattern - identifier: identifier "x" + pattern: identifier "x" value: int_literal "1" diff --git a/unified/extractor/tests/corpus/swift/variables/var-without-initialiser.output b/unified/extractor/tests/corpus/swift/variables/var-without-initialiser.output index 0a01e0cc8ac2..7996077c0d36 100644 --- a/unified/extractor/tests/corpus/swift/variables/var-without-initialiser.output +++ b/unified/extractor/tests/corpus/swift/variables/var-without-initialiser.output @@ -31,9 +31,5 @@ top_level stmt: variable_declaration modifier: modifier "var" - pattern: - named_pattern - identifier: identifier "x" - type: - name_expr - identifier: identifier "Int" + pattern: identifier "x" + type: identifier "Int" diff --git a/unified/ql/lib/codeql/unified/internal/Ast.qll b/unified/ql/lib/codeql/unified/internal/Ast.qll index 3a211b830349..cb8861ba3feb 100644 --- a/unified/ql/lib/codeql/unified/internal/Ast.qll +++ b/unified/ql/lib/codeql/unified/internal/Ast.qll @@ -835,7 +835,7 @@ module Unified { } /** A class representing `identifier` tokens. */ - class Identifier extends @unified_token_identifier, F::AstNode, F::Token { + class Identifier extends @unified_token_identifier, F::Expr, F::Token { /** Gets the name of the primary QL class for this element. */ final override string getAPrimaryQlClass() { result = "Identifier" } } @@ -1005,25 +1005,13 @@ module Unified { final override string getAPrimaryQlClass() { result = "Modifier" } } - /** A class representing `name_expr` nodes. */ - class NameExpr extends @unified_name_expr, F::Expr { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "NameExpr" } - - /** Gets the node corresponding to the field `identifier`. */ - final F::Identifier getIdentifier() { unified_name_expr_def(this, result) } - - /** Gets a field or child node of this node. */ - final override F::AstNode getAFieldOrChild() { unified_name_expr_def(this, result) } - } - /** A class representing `named_pattern` nodes. */ class NamedPattern extends @unified_named_pattern, F::Expr { /** Gets the name of the primary QL class for this element. */ final override string getAPrimaryQlClass() { result = "NamedPattern" } /** Gets the node corresponding to the field `identifier`. */ - final F::Identifier getIdentifier() { unified_named_pattern_def(this, result) } + final F::Identifier getIdentifier() { unified_named_pattern_def(this, result, _) } /** Gets the node corresponding to the field `modifier`. */ final F::Modifier getModifier(int i) { unified_named_pattern_modifier(this, i, result) } @@ -1032,13 +1020,13 @@ module Unified { final F::Modifier getAModifier() { result = this.getModifier(_) } /** Gets the node corresponding to the field `sub_pattern`. */ - final F::Expr getSubPattern() { unified_named_pattern_sub_pattern(this, result) } + final F::Expr getSubPattern() { unified_named_pattern_def(this, _, result) } /** Gets a field or child node of this node. */ final override F::AstNode getAFieldOrChild() { - unified_named_pattern_def(this, result) or + unified_named_pattern_def(this, result, _) or unified_named_pattern_modifier(this, _, result) or - unified_named_pattern_sub_pattern(this, result) + unified_named_pattern_def(this, _, result) } } @@ -1715,8 +1703,6 @@ module Unified { or result = node.(MemberAccessExpr).getMember() and i = -1 and name = "getMember" or - result = node.(NameExpr).getIdentifier() and i = -1 and name = "getIdentifier" - or result = node.(NamedPattern).getIdentifier() and i = -1 and name = "getIdentifier" or result = node.(NamedPattern).getModifier(i) and name = "getModifier" @@ -1936,8 +1922,6 @@ module UnifiedFinal { final class Modifier = F::Modifier; - final class NameExpr = F::NameExpr; - final class NamedPattern = F::NamedPattern; final class Operator = F::Operator; diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index 0aaf3c017f9e..2682c7b39301 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -5,6 +5,7 @@ private import unified private import unified as U private import codeql.namebinding.LocalNameBinding +private import codeql.unified.internal.NameBindingPlugin private module LocalNameBindingInput implements LocalNameBindingInputSig { class AstNode = U::AstNode; @@ -188,6 +189,7 @@ private module LocalNameBindingInput implements LocalNameBindingInputSig; */ predicate isTrivialNameAlias(NameDeclaration decl) { exists(ImportDeclaration imprt | - decl = getIdentifierFromRef(imprt.getPattern()) and + decl = getImportBindingIdentifier(imprt) and decl.getName() = getIdentifierFromRef(imprt.getImportedExpr()).getValue() ) } diff --git a/unified/ql/lib/unified.dbscheme b/unified/ql/lib/unified.dbscheme index a2a455022598..d589fc70b3ad 100644 --- a/unified/ql/lib/unified.dbscheme +++ b/unified/ql/lib/unified.dbscheme @@ -443,7 +443,7 @@ unified_equality_type_constraint_def( int right: @unified_expr ref ); -@unified_expr = @unified_array_literal | @unified_assign_expr | @unified_binary_expr | @unified_block | @unified_break_expr | @unified_bulk_importing_pattern | @unified_call_expr | @unified_compound_assign_expr | @unified_conditional_pattern | @unified_continue_expr | @unified_expr_pattern | @unified_function_expr | @unified_generic_type_expr | @unified_if_expr | @unified_key_value_pair | @unified_map_literal | @unified_member_access_expr | @unified_name_expr | @unified_named_pattern | @unified_or_pattern | @unified_pattern_guard_expr | @unified_return_expr | @unified_switch_expr | @unified_throw_expr | @unified_token_boolean_literal | @unified_token_builtin_expr | @unified_token_empty_expr | @unified_token_float_literal | @unified_token_inferred_type_expr | @unified_token_int_literal | @unified_token_regex_literal | @unified_token_string_literal | @unified_token_super_expr | @unified_token_unsupported_node | @unified_try_expr | @unified_tuple_expr | @unified_type_cast_expr | @unified_type_test_expr | @unified_unary_expr | @unified_unresolved_operator_sequence +@unified_expr = @unified_array_literal | @unified_assign_expr | @unified_binary_expr | @unified_block | @unified_break_expr | @unified_bulk_importing_pattern | @unified_call_expr | @unified_compound_assign_expr | @unified_conditional_pattern | @unified_continue_expr | @unified_expr_pattern | @unified_function_expr | @unified_generic_type_expr | @unified_if_expr | @unified_key_value_pair | @unified_map_literal | @unified_member_access_expr | @unified_named_pattern | @unified_or_pattern | @unified_pattern_guard_expr | @unified_return_expr | @unified_switch_expr | @unified_throw_expr | @unified_token_boolean_literal | @unified_token_builtin_expr | @unified_token_empty_expr | @unified_token_float_literal | @unified_token_identifier | @unified_token_inferred_type_expr | @unified_token_int_literal | @unified_token_regex_literal | @unified_token_string_literal | @unified_token_super_expr | @unified_token_unsupported_node | @unified_try_expr | @unified_tuple_expr | @unified_type_cast_expr | @unified_type_test_expr | @unified_unary_expr | @unified_unresolved_operator_sequence @unified_expr_or_operator = @unified_expr | @unified_token_infix_operator @@ -653,11 +653,6 @@ unified_member_access_expr_def( int member: @unified_token_identifier ref ); -unified_name_expr_def( - unique int id: @unified_name_expr, - int identifier: @unified_token_identifier ref -); - #keyset[unified_named_pattern, index] unified_named_pattern_modifier( int unified_named_pattern: @unified_named_pattern ref, @@ -665,14 +660,10 @@ unified_named_pattern_modifier( unique int modifier: @unified_token_modifier ref ); -unified_named_pattern_sub_pattern( - unique int unified_named_pattern: @unified_named_pattern ref, - unique int sub_pattern: @unified_expr ref -); - unified_named_pattern_def( unique int id: @unified_named_pattern, - int identifier: @unified_token_identifier ref + int identifier: @unified_token_identifier ref, + int sub_pattern: @unified_expr ref ); @unified_operator = @unified_token_infix_operator | @unified_token_postfix_operator | @unified_token_prefix_operator @@ -998,7 +989,7 @@ unified_trivia_tokeninfo( string value: string ref ); -@unified_ast_node = @unified_accessor_declaration | @unified_argument | @unified_array_literal | @unified_assign_expr | @unified_associated_type_declaration | @unified_base_type | @unified_binary_expr | @unified_block | @unified_bound_type_constraint | @unified_break_expr | @unified_bulk_importing_pattern | @unified_call_expr | @unified_catch_clause | @unified_class_like_declaration | @unified_compound_assign_expr | @unified_conditional_pattern | @unified_constructor_declaration | @unified_continue_expr | @unified_destructor_declaration | @unified_do_while_stmt | @unified_equality_type_constraint | @unified_expr_pattern | @unified_for_each_stmt | @unified_function_declaration | @unified_function_expr | @unified_generic_type_expr | @unified_guard_if_stmt | @unified_if_expr | @unified_import_declaration | @unified_initializer_declaration | @unified_key_value_pair | @unified_labeled_stmt | @unified_map_literal | @unified_member_access_expr | @unified_name_expr | @unified_named_pattern | @unified_operator_syntax_declaration | @unified_or_pattern | @unified_parameter | @unified_pattern_guard_expr | @unified_return_expr | @unified_switch_case | @unified_switch_expr | @unified_throw_expr | @unified_token | @unified_top_level | @unified_trivia_token | @unified_try_expr | @unified_tuple_expr | @unified_type_alias_declaration | @unified_type_cast_expr | @unified_type_parameter | @unified_type_test_expr | @unified_unary_expr | @unified_unresolved_operator_sequence | @unified_variable_declaration | @unified_while_stmt +@unified_ast_node = @unified_accessor_declaration | @unified_argument | @unified_array_literal | @unified_assign_expr | @unified_associated_type_declaration | @unified_base_type | @unified_binary_expr | @unified_block | @unified_bound_type_constraint | @unified_break_expr | @unified_bulk_importing_pattern | @unified_call_expr | @unified_catch_clause | @unified_class_like_declaration | @unified_compound_assign_expr | @unified_conditional_pattern | @unified_constructor_declaration | @unified_continue_expr | @unified_destructor_declaration | @unified_do_while_stmt | @unified_equality_type_constraint | @unified_expr_pattern | @unified_for_each_stmt | @unified_function_declaration | @unified_function_expr | @unified_generic_type_expr | @unified_guard_if_stmt | @unified_if_expr | @unified_import_declaration | @unified_initializer_declaration | @unified_key_value_pair | @unified_labeled_stmt | @unified_map_literal | @unified_member_access_expr | @unified_named_pattern | @unified_operator_syntax_declaration | @unified_or_pattern | @unified_parameter | @unified_pattern_guard_expr | @unified_return_expr | @unified_switch_case | @unified_switch_expr | @unified_throw_expr | @unified_token | @unified_top_level | @unified_trivia_token | @unified_try_expr | @unified_tuple_expr | @unified_type_alias_declaration | @unified_type_cast_expr | @unified_type_parameter | @unified_type_test_expr | @unified_unary_expr | @unified_unresolved_operator_sequence | @unified_variable_declaration | @unified_while_stmt unified_ast_node_location( unique int node: @unified_ast_node ref, diff --git a/unified/ql/test/library-tests/BasicTest/test.expected b/unified/ql/test/library-tests/BasicTest/test.expected index 2f0237557687..0194a63380d7 100644 --- a/unified/ql/test/library-tests/BasicTest/test.expected +++ b/unified/ql/test/library-tests/BasicTest/test.expected @@ -1,101 +1,155 @@ -nameExpr -| name_expr.swift:1:9:1:9 | NameExpr | y | -| test.swift:1:8:1:17 | NameExpr | Foundation | -| test.swift:4:21:4:29 | NameExpr | Equatable | -| test.swift:5:16:5:18 | NameExpr | Array | -| test.swift:5:17:5:17 | NameExpr | T | -| test.swift:7:31:7:31 | NameExpr | T | -| test.swift:8:9:8:13 | NameExpr | items | -| test.swift:8:22:8:25 | NameExpr | item | -| test.swift:11:27:11:27 | NameExpr | T | -| test.swift:11:33:11:36 | NameExpr | Bool | -| test.swift:12:16:12:20 | NameExpr | items | -| test.swift:12:31:12:34 | NameExpr | item | -| test.swift:19:16:19:18 | NameExpr | Int | -| test.swift:20:25:20:27 | NameExpr | Int | -| test.swift:20:33:20:39 | NameExpr | Element | -| test.swift:20:33:20:40 | NameExpr | Optional | -| test.swift:24:15:24:24 | NameExpr | Collection | -| test.swift:24:36:24:36 | NameExpr | T | -| test.swift:24:49:24:49 | NameExpr | T | -| test.swift:24:55:24:65 | NameExpr | Array | -| test.swift:24:56:24:56 | NameExpr | T | -| test.swift:25:18:25:22 | NameExpr | Array | -| test.swift:25:24:25:28 | NameExpr | first | -| test.swift:26:17:26:22 | NameExpr | second | -| test.swift:27:13:27:18 | NameExpr | result | -| test.swift:27:29:27:32 | NameExpr | item | -| test.swift:28:13:28:18 | NameExpr | result | -| test.swift:28:27:28:30 | NameExpr | item | -| test.swift:31:12:31:17 | NameExpr | result | -| test.swift:35:23:35:32 | NameExpr | DataSource | -| test.swift:36:25:36:25 | NameExpr | T | -| test.swift:37:23:37:25 | NameExpr | Array | -| test.swift:37:24:37:24 | NameExpr | T | -| test.swift:39:16:39:18 | NameExpr | Int | -| test.swift:40:16:40:19 | NameExpr | data | -| test.swift:43:18:43:21 | NameExpr | Bool | -| test.swift:44:9:44:12 | NameExpr | data | -| test.swift:47:25:47:27 | NameExpr | Int | -| test.swift:47:33:47:33 | NameExpr | T | -| test.swift:47:33:47:34 | NameExpr | Optional | -| test.swift:48:15:48:19 | NameExpr | index | -| test.swift:48:29:48:33 | NameExpr | index | -| test.swift:48:37:48:40 | NameExpr | data | -| test.swift:49:16:49:19 | NameExpr | data | -| test.swift:49:21:49:25 | NameExpr | index | -| test.swift:52:22:52:22 | NameExpr | T | -| test.swift:53:9:53:12 | NameExpr | data | -| test.swift:53:21:53:24 | NameExpr | item | -| test.swift:58:31:58:35 | NameExpr | Error | -| test.swift:59:18:59:24 | NameExpr | Success | -| test.swift:60:18:60:24 | NameExpr | Failure | -| test.swift:62:31:62:37 | NameExpr | Success | -| test.swift:62:43:62:43 | NameExpr | U | -| test.swift:62:49:62:54 | NameExpr | Result | -| test.swift:62:56:62:56 | NameExpr | U | -| test.swift:62:59:62:65 | NameExpr | Failure | -| test.swift:63:16:63:19 | NameExpr | self | -| test.swift:65:29:65:37 | NameExpr | transform | -| test.swift:65:39:65:43 | NameExpr | value | -| test.swift:67:29:67:33 | NameExpr | error | -| test.swift:74:24:74:27 | NameExpr | Bool | -| test.swift:76:16:76:19 | NameExpr | self | -| test.swift:76:21:76:21 | NameExpr | i | -| test.swift:76:26:76:29 | NameExpr | self | -| test.swift:76:31:76:31 | NameExpr | i | -| test.swift:85:27:85:29 | NameExpr | Array | -| test.swift:85:28:85:28 | NameExpr | T | -| test.swift:85:44:85:44 | NameExpr | T | -| test.swift:85:47:85:47 | NameExpr | T | -| test.swift:85:53:85:53 | NameExpr | T | -| test.swift:85:59:85:59 | NameExpr | T | -| test.swift:85:59:85:60 | NameExpr | Optional | -| test.swift:86:12:86:17 | NameExpr | values | -| test.swift:87:12:87:17 | NameExpr | values | -| test.swift:87:38:87:43 | NameExpr | values | -| test.swift:87:49:87:57 | NameExpr | transform | +identifier +| name_expr.swift:1:5:1:5 | x | x | +| name_expr.swift:1:9:1:9 | y | y | +| strings.swift:1:5:1:5 | x | x | +| test.swift:1:8:1:17 | Foundation | Foundation | +| test.swift:1:8:1:17 | Foundation | Foundation | +| test.swift:4:8:4:16 | Container | Container | +| test.swift:4:18:4:18 | T | T | +| test.swift:4:21:4:29 | Equatable | Equatable | +| test.swift:5:9:5:13 | items | items | +| test.swift:5:16:5:18 | Array | Array | +| test.swift:5:17:5:17 | T | T | +| test.swift:7:19:7:21 | add | add | +| test.swift:7:23:7:23 | _ | _ | +| test.swift:7:25:7:28 | item | item | +| test.swift:7:31:7:31 | T | T | +| test.swift:8:9:8:13 | items | items | +| test.swift:8:15:8:20 | append | append | +| test.swift:8:22:8:25 | item | item | +| test.swift:11:10:11:17 | contains | contains | +| test.swift:11:19:11:19 | _ | _ | +| test.swift:11:21:11:24 | item | item | +| test.swift:11:27:11:27 | T | T | +| test.swift:11:33:11:36 | Bool | Bool | +| test.swift:12:16:12:20 | items | items | +| test.swift:12:22:12:29 | contains | contains | +| test.swift:12:31:12:34 | item | item | +| test.swift:17:10:17:19 | DataSource | DataSource | +| test.swift:18:20:18:26 | Element | Element | +| test.swift:19:9:19:13 | count | count | +| test.swift:19:16:19:18 | Int | Int | +| test.swift:20:10:20:13 | item | item | +| test.swift:20:15:20:16 | at | at | +| test.swift:20:18:20:22 | index | index | +| test.swift:20:25:20:27 | Int | Int | +| test.swift:20:33:20:39 | Element | Element | +| test.swift:20:33:20:40 | Optional | Optional | +| test.swift:24:6:24:10 | merge | merge | +| test.swift:24:12:24:12 | T | T | +| test.swift:24:15:24:24 | Collection | Collection | +| test.swift:24:27:24:27 | _ | _ | +| test.swift:24:29:24:33 | first | first | +| test.swift:24:36:24:36 | T | T | +| test.swift:24:39:24:39 | _ | _ | +| test.swift:24:41:24:46 | second | second | +| test.swift:24:49:24:49 | T | T | +| test.swift:24:55:24:65 | Array | Array | +| test.swift:24:56:24:56 | T | T | +| test.swift:24:58:24:64 | Element | Element | +| test.swift:25:9:25:14 | result | result | +| test.swift:25:18:25:22 | Array | Array | +| test.swift:25:24:25:28 | first | first | +| test.swift:26:9:26:12 | item | item | +| test.swift:26:17:26:22 | second | second | +| test.swift:27:13:27:18 | result | result | +| test.swift:27:20:27:27 | contains | contains | +| test.swift:27:29:27:32 | item | item | +| test.swift:28:13:28:18 | result | result | +| test.swift:28:20:28:25 | append | append | +| test.swift:28:27:28:30 | item | item | +| test.swift:31:12:31:17 | result | result | +| test.swift:35:7:35:17 | DataManager | DataManager | +| test.swift:35:19:35:19 | T | T | +| test.swift:35:23:35:32 | DataSource | DataSource | +| test.swift:36:15:36:21 | Element | Element | +| test.swift:36:25:36:25 | T | T | +| test.swift:37:17:37:20 | data | data | +| test.swift:37:23:37:25 | Array | Array | +| test.swift:37:24:37:24 | T | T | +| test.swift:39:9:39:13 | count | count | +| test.swift:39:16:39:18 | Int | Int | +| test.swift:40:16:40:19 | data | data | +| test.swift:40:21:40:25 | count | count | +| test.swift:43:9:43:15 | isEmpty | isEmpty | +| test.swift:43:18:43:21 | Bool | Bool | +| test.swift:44:9:44:12 | data | data | +| test.swift:44:14:44:20 | isEmpty | isEmpty | +| test.swift:47:10:47:13 | item | item | +| test.swift:47:15:47:16 | at | at | +| test.swift:47:18:47:22 | index | index | +| test.swift:47:25:47:27 | Int | Int | +| test.swift:47:33:47:33 | T | T | +| test.swift:47:33:47:34 | Optional | Optional | +| test.swift:48:15:48:19 | index | index | +| test.swift:48:29:48:33 | index | index | +| test.swift:48:37:48:40 | data | data | +| test.swift:48:42:48:46 | count | count | +| test.swift:49:16:49:19 | data | data | +| test.swift:49:21:49:25 | index | index | +| test.swift:52:10:52:12 | add | add | +| test.swift:52:14:52:14 | _ | _ | +| test.swift:52:16:52:19 | item | item | +| test.swift:52:22:52:22 | T | T | +| test.swift:53:9:53:12 | data | data | +| test.swift:53:14:53:19 | append | append | +| test.swift:53:21:53:24 | item | item | +| test.swift:58:6:58:11 | Result | Result | +| test.swift:58:13:58:19 | Success | Success | +| test.swift:58:22:58:28 | Failure | Failure | +| test.swift:58:31:58:35 | Error | Error | +| test.swift:59:10:59:16 | success | success | +| test.swift:59:18:59:24 | Success | Success | +| test.swift:60:10:60:16 | failure | failure | +| test.swift:60:18:60:24 | Failure | Failure | +| test.swift:62:10:62:12 | map | map | +| test.swift:62:14:62:14 | U | U | +| test.swift:62:17:62:17 | _ | _ | +| test.swift:62:19:62:27 | transform | transform | +| test.swift:62:31:62:37 | Success | Success | +| test.swift:62:43:62:43 | U | U | +| test.swift:62:49:62:54 | Result | Result | +| test.swift:62:56:62:56 | U | U | +| test.swift:62:59:62:65 | Failure | Failure | +| test.swift:63:16:63:19 | self | self | +| test.swift:64:15:64:21 | success | success | +| test.swift:64:27:64:31 | value | value | +| test.swift:65:21:65:27 | success | success | +| test.swift:65:29:65:37 | transform | transform | +| test.swift:65:39:65:43 | value | value | +| test.swift:66:15:66:21 | failure | failure | +| test.swift:66:27:66:31 | error | error | +| test.swift:67:21:67:27 | failure | failure | +| test.swift:67:29:67:33 | error | error | +| test.swift:73:11:73:15 | Array | Array | +| test.swift:74:10:74:17 | isSorted | isSorted | +| test.swift:74:24:74:27 | Bool | Bool | +| test.swift:75:13:75:13 | i | i | +| test.swift:76:16:76:19 | self | self | +| test.swift:76:21:76:21 | i | i | +| test.swift:76:26:76:29 | self | self | +| test.swift:76:31:76:31 | i | i | +| test.swift:85:6:85:12 | combine | combine | +| test.swift:85:14:85:14 | T | T | +| test.swift:85:17:85:17 | _ | _ | +| test.swift:85:19:85:24 | values | values | +| test.swift:85:27:85:29 | Array | Array | +| test.swift:85:28:85:28 | T | T | +| test.swift:85:32:85:40 | transform | transform | +| test.swift:85:44:85:44 | T | T | +| test.swift:85:47:85:47 | T | T | +| test.swift:85:53:85:53 | T | T | +| test.swift:85:59:85:59 | T | T | +| test.swift:85:59:85:60 | Optional | Optional | +| test.swift:86:12:86:17 | values | values | +| test.swift:86:19:86:25 | isEmpty | isEmpty | +| test.swift:87:12:87:17 | values | values | +| test.swift:87:19:87:27 | dropFirst | dropFirst | +| test.swift:87:31:87:36 | reduce | reduce | +| test.swift:87:38:87:43 | values | values | +| test.swift:87:49:87:57 | transform | transform | namedPattern -| name_expr.swift:1:5:1:5 | NamedPattern | x | -| strings.swift:1:5:1:5 | NamedPattern | x | | test.swift:1:1:1:17 | NamedPattern | Foundation | -| test.swift:5:9:5:13 | NamedPattern | items | -| test.swift:7:25:7:28 | NamedPattern | item | -| test.swift:11:21:11:24 | NamedPattern | item | -| test.swift:20:18:20:22 | NamedPattern | index | -| test.swift:24:29:24:33 | NamedPattern | first | -| test.swift:24:41:24:46 | NamedPattern | second | -| test.swift:25:9:25:14 | NamedPattern | result | -| test.swift:26:9:26:12 | NamedPattern | item | -| test.swift:37:17:37:20 | NamedPattern | data | -| test.swift:47:18:47:22 | NamedPattern | index | -| test.swift:52:16:52:19 | NamedPattern | item | -| test.swift:62:19:62:27 | NamedPattern | transform | -| test.swift:64:27:64:31 | NamedPattern | value | -| test.swift:66:27:66:31 | NamedPattern | error | -| test.swift:75:13:75:13 | NamedPattern | i | -| test.swift:85:19:85:24 | NamedPattern | values | -| test.swift:85:32:85:40 | NamedPattern | transform | unsupported stringValue | strings.swift:1:9:1:15 | "hello" | "hello" | diff --git a/unified/ql/test/library-tests/BasicTest/test.ql b/unified/ql/test/library-tests/BasicTest/test.ql index 3baa88102715..f06c7b0138c9 100644 --- a/unified/ql/test/library-tests/BasicTest/test.ql +++ b/unified/ql/test/library-tests/BasicTest/test.ql @@ -1,6 +1,6 @@ import unified -query predicate nameExpr(NameExpr node, string value) { value = node.getIdentifier().getValue() } +query predicate identifier(Identifier node, string value) { value = node.getValue() } query predicate namedPattern(NamedPattern node, string value) { value = node.getIdentifier().getValue() From 1925c2058293310ebd32d71e995dc399ea822219 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Wed, 2 Sep 2026 19:40:51 +0200 Subject: [PATCH 0667/2098] Rust: Make crate fallback logic more conservative in path resolution library --- .../codeql/rust/internal/PathResolution.qll | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index bd9322487161..a79908ac6f00 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -568,6 +568,16 @@ class CrateItemNode extends NamedItemNode instanceof Crate { ) } + pragma[nomagic] + predicate isLatestVersion(string name) { + this = + max(CrateItemNode c, string ver | + name = c.getName() and ver = c.(Crate).getVersion() + | + c order by ver + ) + } + override string getName() { result = Crate.super.getName() } override Namespace getNamespace() { @@ -1529,11 +1539,11 @@ private predicate crateDependencyEdge(SourceFileItemNode file, string name, Crat crateDependency(file, name, dep) or // As a fallback, give all files access to crates that do not conflict with known dependencies - // and declarations. This is in order to workaround incomplete crate dependency information - // provided by the extractor, as well as `CrateItemNode.getASourceFile()` being unable to map - // a given file to its crate (for example, if the file is `mod` imported inside a macro that the - // extractor is unable to expand). - name = dep.getName() and + // and declarations, as long as those crates have a unique latest version. + // This is in order to workaround incomplete crate dependency information provided by the extractor, + // as well as `CrateItemNode.getASourceFile()` being unable to map a given file to its crate (for + // example, if the file is `mod` imported inside a macro that the extractor is unable to expand). + dep = unique(CrateItemNode dep0 | dep0.isLatestVersion(name)) and not hasDeclOrDep(file, name) } @@ -2385,6 +2395,11 @@ private module Debug { useImportEdge(use, name, item, kind) } + predicate debugCrateDependencyEdge(SourceFileItemNode file, string name, CrateItemNode dep) { + file = getRelevantLocatable() and + crateDependencyEdge(file, name, dep) + } + ItemNode debugGetASuccessor(ItemNode i, string name, SuccessorKind kind) { i = getRelevantLocatable() and result = i.getASuccessor(name, kind, _) From 9cd018a018bea4d43b6e735a7f0e278d159572e1 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 3 Sep 2026 09:22:06 +0200 Subject: [PATCH 0668/2098] unified: Invert definition of plugin hook --- .../codeql/unified/internal/LocalNameBinding.qll | 15 +++++++-------- .../codeql/unified/internal/NameBindingPlugin.qll | 4 ++-- .../unified/internal/NameBindingPluginSwift.qll | 9 ++++----- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index 2682c7b39301..e48290179082 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -189,7 +189,7 @@ private module LocalNameBindingInput implements LocalNameBindingInputSig Date: Thu, 3 Sep 2026 04:21:07 -0400 Subject: [PATCH 0669/2098] fix(cpp): model bdlbb::BlobBuffer::buffer and trim model comments Address review feedback on the bdlbb::Blob models: - Add a summary for BlobBuffer::buffer(), which returns the bsl::shared_ptr that owns the bytes. No shared_ptr rows are needed: SmartPointer.qll already covers bsl::shared_ptr::get(). - Add a harness case that reads through blob.buffer(0).buffer().get(). - Shorten the section comments in bdlbb.model.yml and the change note. --- .../2026-08-27-bdlbb-blob-models.md | 2 +- cpp/ql/lib/ext/bdlbb.model.yml | 10 +- .../dataflow/external-models/bdlbb.cpp | 15 ++ .../dataflow/external-models/flow.expected | 138 ++++++++++-------- .../dataflow/external-models/steps.expected | 25 ++-- 5 files changed, 111 insertions(+), 79 deletions(-) diff --git a/cpp/ql/lib/change-notes/2026-08-27-bdlbb-blob-models.md b/cpp/ql/lib/change-notes/2026-08-27-bdlbb-blob-models.md index f1db9d3c3116..ed52e5e091e2 100644 --- a/cpp/ql/lib/change-notes/2026-08-27-bdlbb-blob-models.md +++ b/cpp/ql/lib/change-notes/2026-08-27-bdlbb-blob-models.md @@ -1,4 +1,4 @@ --- category: minorAnalysis --- -* Added flow summaries for the BDE `bdlbb::Blob` segmented byte buffer (`BloombergLP::bdlbb`). Taint now flows from a blob to its bytes through the `Blob::buffer`/`BlobBuffer::data` accessor chain and through the `bdlbb::BlobUtil::copy` and `getContiguousRangeOrCopy` helpers, so a blob populated from untrusted input (for example a BlazingMQ message body read via `bmqa::Message::getData`) is tracked into the payload bytes. +* Added flow summaries for the BDE `BloombergLP::bdlbb::Blob` segmented byte buffer. diff --git a/cpp/ql/lib/ext/bdlbb.model.yml b/cpp/ql/lib/ext/bdlbb.model.yml index 135f6c631e83..e5c50207c464 100644 --- a/cpp/ql/lib/ext/bdlbb.model.yml +++ b/cpp/ql/lib/ext/bdlbb.model.yml @@ -5,16 +5,14 @@ extensions: pack: codeql/cpp-all extensible: summaryModel data: # namespace, type, subtypes, name, signature, ext, input, output, kind, provenance - # Accessor chain: a tainted blob taints its buffers, and a tainted buffer taints its bytes. + # Accessor chain - ["BloombergLP::bdlbb", "Blob", true, "buffer", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] - ["BloombergLP::bdlbb", "BlobBuffer", true, "data", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] - # BlobUtil read-out: the source blob (Argument[*1]) taints the destination buffer (and the - # returned contiguous range). + - ["BloombergLP::bdlbb", "BlobBuffer", true, "buffer", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + # BlobUtil read-out - ["BloombergLP::bdlbb", "BlobUtil", true, "copy", "(char *,const Blob &,int,int)", "", "Argument[*1]", "Argument[*0]", "taint", "manual"] - ["BloombergLP::bdlbb", "BlobUtil", true, "getContiguousRangeOrCopy", "", "", "Argument[*1]", "Argument[*0]", "taint", "manual"] - ["BloombergLP::bdlbb", "BlobUtil", true, "getContiguousRangeOrCopy", "", "", "Argument[*1]", "ReturnValue[*]", "taint", "manual"] - # BlobUtil write-in: the source (Argument[*2]) taints the destination blob. `copy` has two - # write-in overloads, one taking a raw byte buffer and one taking another blob as the source; - # each row pins the exact signature so the int offset/length arguments are never tainted. + # BlobUtil write-in - ["BloombergLP::bdlbb", "BlobUtil", true, "copy", "(Blob *,int,const char *,int)", "", "Argument[*2]", "Argument[*0]", "taint", "manual"] - ["BloombergLP::bdlbb", "BlobUtil", true, "copy", "(Blob *,int,const Blob &,int,int)", "", "Argument[*2]", "Argument[*0]", "taint", "manual"] diff --git a/cpp/ql/test/library-tests/dataflow/external-models/bdlbb.cpp b/cpp/ql/test/library-tests/dataflow/external-models/bdlbb.cpp index a76174c42d46..c8ec9dfd031e 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/bdlbb.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/bdlbb.cpp @@ -13,6 +13,10 @@ namespace bsl { size_t size() const; }; typedef basic_string string; + template class shared_ptr { + public: + T *get() const; + }; } namespace BloombergLP { @@ -20,6 +24,8 @@ namespace bdlbb { class BlobBuffer { public: char *data() const; + bsl::shared_ptr &buffer(); + const bsl::shared_ptr &buffer() const; }; class Blob { @@ -61,6 +67,15 @@ void test_accessor_chain() { sink(*p); // $ ir } +// The get() step comes from the built-in smart pointer model, not from bdlbb.model.yml. +void test_accessor_chain_shared_ptr() { + bsl::string s(source()); + BloombergLP::bdlbb::Blob blob; + BloombergLP::bdlbb::BlobUtil::copy(&blob, 0, s.data(), s.size()); + const char *p = blob.buffer(0).buffer().get(); + sink(*p); // $ ir +} + void test_getContiguousRangeOrCopy() { bsl::string s(source()); BloombergLP::bdlbb::Blob blob; diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index 8989ddfa612b..96bd8c372936 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -96,12 +96,13 @@ models | 95 | Summary: Azure::Core::IO; BodyStream; true; ReadToEnd; ; ; Argument[-1]; ReturnValue.Element; taint; manual | | 96 | Summary: Azure; Nullable; true; Value; ; ; Argument[-1]; ReturnValue[*]; taint; manual | | 97 | Summary: BloombergLP::bdlbb; Blob; true; buffer; ; ; Argument[-1]; ReturnValue[*]; taint; manual | -| 98 | Summary: BloombergLP::bdlbb; BlobBuffer; true; data; ; ; Argument[-1]; ReturnValue[*]; taint; manual | -| 99 | Summary: BloombergLP::bdlbb; BlobUtil; true; copy; (Blob *,int,const Blob &,int,int); ; Argument[*2]; Argument[*0]; taint; manual | -| 100 | Summary: BloombergLP::bdlbb; BlobUtil; true; copy; (Blob *,int,const char *,int); ; Argument[*2]; Argument[*0]; taint; manual | -| 101 | Summary: BloombergLP::bdlbb; BlobUtil; true; copy; (char *,const Blob &,int,int); ; Argument[*1]; Argument[*0]; taint; manual | -| 102 | Summary: BloombergLP::bdlbb; BlobUtil; true; getContiguousRangeOrCopy; ; ; Argument[*1]; ReturnValue[*]; taint; manual | -| 103 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | +| 98 | Summary: BloombergLP::bdlbb; BlobBuffer; true; buffer; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 99 | Summary: BloombergLP::bdlbb; BlobBuffer; true; data; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 100 | Summary: BloombergLP::bdlbb; BlobUtil; true; copy; (Blob *,int,const Blob &,int,int); ; Argument[*2]; Argument[*0]; taint; manual | +| 101 | Summary: BloombergLP::bdlbb; BlobUtil; true; copy; (Blob *,int,const char *,int); ; Argument[*2]; Argument[*0]; taint; manual | +| 102 | Summary: BloombergLP::bdlbb; BlobUtil; true; copy; (char *,const Blob &,int,int); ; Argument[*1]; Argument[*0]; taint; manual | +| 103 | Summary: BloombergLP::bdlbb; BlobUtil; true; getContiguousRangeOrCopy; ; ; Argument[*1]; ReturnValue[*]; taint; manual | +| 104 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | edges | asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:91:7:91:17 | recv_buffer | provenance | Src:MaD:56 | | asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:93:29:93:39 | recv_buffer | provenance | Src:MaD:56 Sink:MaD:4 | @@ -110,7 +111,7 @@ edges | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | | | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:101:7:101:17 | send_buffer | provenance | | | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:103:29:103:39 | send_buffer | provenance | Sink:MaD:4 | -| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:103 | +| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:104 | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:257:5:257:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:262:5:262:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:266:38:266:41 | *resp | provenance | | @@ -150,31 +151,38 @@ edges | azure.cpp:294:38:294:53 | call to operator[] | azure.cpp:295:10:295:20 | contentType | provenance | | | azure.cpp:294:38:294:53 | call to operator[] | azure.cpp:295:10:295:20 | contentType | provenance | | | azure.cpp:295:10:295:20 | contentType | azure.cpp:295:10:295:20 | contentType | provenance | | -| bdlbb.cpp:48:16:48:23 | call to source | bdlbb.cpp:50:49:50:52 | *call to data | provenance | TaintFunction | -| bdlbb.cpp:50:37:50:41 | copy output argument | bdlbb.cpp:52:42:52:45 | *blob | provenance | | -| bdlbb.cpp:50:49:50:52 | *call to data | bdlbb.cpp:50:37:50:41 | copy output argument | provenance | MaD:100 | -| bdlbb.cpp:52:37:52:39 | copy output argument | bdlbb.cpp:53:7:53:10 | * ... | provenance | | -| bdlbb.cpp:52:42:52:45 | *blob | bdlbb.cpp:52:37:52:39 | copy output argument | provenance | MaD:101 | -| bdlbb.cpp:57:16:57:23 | call to source | bdlbb.cpp:59:49:59:52 | *call to data | provenance | TaintFunction | -| bdlbb.cpp:59:37:59:41 | copy output argument | bdlbb.cpp:60:18:60:21 | *blob | provenance | | -| bdlbb.cpp:59:49:59:52 | *call to data | bdlbb.cpp:59:37:59:41 | copy output argument | provenance | MaD:100 | -| bdlbb.cpp:60:18:60:21 | *blob | bdlbb.cpp:60:29:60:32 | *call to buffer | provenance | MaD:97 | -| bdlbb.cpp:60:18:60:38 | *call to data | bdlbb.cpp:60:18:60:38 | *call to data | provenance | | -| bdlbb.cpp:60:18:60:38 | *call to data | bdlbb.cpp:61:7:61:8 | * ... | provenance | | -| bdlbb.cpp:60:29:60:32 | *call to buffer | bdlbb.cpp:60:18:60:38 | *call to data | provenance | MaD:98 | -| bdlbb.cpp:65:16:65:23 | call to source | bdlbb.cpp:67:49:67:52 | *call to data | provenance | TaintFunction | -| bdlbb.cpp:67:37:67:41 | copy output argument | bdlbb.cpp:69:72:69:75 | *blob | provenance | | -| bdlbb.cpp:67:49:67:52 | *call to data | bdlbb.cpp:67:37:67:41 | copy output argument | provenance | MaD:100 | -| bdlbb.cpp:69:12:69:65 | *call to getContiguousRangeOrCopy | bdlbb.cpp:69:12:69:65 | *call to getContiguousRangeOrCopy | provenance | | -| bdlbb.cpp:69:12:69:65 | *call to getContiguousRangeOrCopy | bdlbb.cpp:70:7:70:8 | * ... | provenance | | -| bdlbb.cpp:69:72:69:75 | *blob | bdlbb.cpp:69:12:69:65 | *call to getContiguousRangeOrCopy | provenance | MaD:102 | -| bdlbb.cpp:75:16:75:23 | call to source | bdlbb.cpp:77:48:77:51 | *call to data | provenance | TaintFunction | -| bdlbb.cpp:77:37:77:40 | copy output argument | bdlbb.cpp:79:46:79:48 | *src | provenance | | -| bdlbb.cpp:77:48:77:51 | *call to data | bdlbb.cpp:77:37:77:40 | copy output argument | provenance | MaD:100 | -| bdlbb.cpp:79:37:79:40 | copy output argument | bdlbb.cpp:81:42:81:44 | *dst | provenance | | -| bdlbb.cpp:79:46:79:48 | *src | bdlbb.cpp:79:37:79:40 | copy output argument | provenance | MaD:99 | -| bdlbb.cpp:81:37:81:39 | copy output argument | bdlbb.cpp:82:7:82:10 | * ... | provenance | | -| bdlbb.cpp:81:42:81:44 | *dst | bdlbb.cpp:81:37:81:39 | copy output argument | provenance | MaD:101 | +| bdlbb.cpp:54:16:54:23 | call to source | bdlbb.cpp:56:49:56:52 | *call to data | provenance | TaintFunction | +| bdlbb.cpp:56:37:56:41 | copy output argument | bdlbb.cpp:58:42:58:45 | *blob | provenance | | +| bdlbb.cpp:56:49:56:52 | *call to data | bdlbb.cpp:56:37:56:41 | copy output argument | provenance | MaD:101 | +| bdlbb.cpp:58:37:58:39 | copy output argument | bdlbb.cpp:59:7:59:10 | * ... | provenance | | +| bdlbb.cpp:58:42:58:45 | *blob | bdlbb.cpp:58:37:58:39 | copy output argument | provenance | MaD:102 | +| bdlbb.cpp:63:16:63:23 | call to source | bdlbb.cpp:65:49:65:52 | *call to data | provenance | TaintFunction | +| bdlbb.cpp:65:37:65:41 | copy output argument | bdlbb.cpp:66:18:66:21 | *blob | provenance | | +| bdlbb.cpp:65:49:65:52 | *call to data | bdlbb.cpp:65:37:65:41 | copy output argument | provenance | MaD:101 | +| bdlbb.cpp:66:18:66:21 | *blob | bdlbb.cpp:66:29:66:32 | *call to buffer | provenance | MaD:97 | +| bdlbb.cpp:66:18:66:38 | *call to data | bdlbb.cpp:66:18:66:38 | *call to data | provenance | | +| bdlbb.cpp:66:18:66:38 | *call to data | bdlbb.cpp:67:7:67:8 | * ... | provenance | | +| bdlbb.cpp:66:29:66:32 | *call to buffer | bdlbb.cpp:66:18:66:38 | *call to data | provenance | MaD:99 | +| bdlbb.cpp:72:16:72:23 | call to source | bdlbb.cpp:74:49:74:52 | *call to data | provenance | TaintFunction | +| bdlbb.cpp:74:37:74:41 | copy output argument | bdlbb.cpp:75:18:75:21 | *blob | provenance | | +| bdlbb.cpp:74:49:74:52 | *call to data | bdlbb.cpp:74:37:74:41 | copy output argument | provenance | MaD:101 | +| bdlbb.cpp:75:18:75:21 | *blob | bdlbb.cpp:75:29:75:32 | *call to buffer | provenance | MaD:97 | +| bdlbb.cpp:75:18:75:46 | call to get | bdlbb.cpp:76:7:76:8 | * ... | provenance | | +| bdlbb.cpp:75:29:75:32 | *call to buffer | bdlbb.cpp:75:39:75:41 | *call to buffer | provenance | MaD:98 | +| bdlbb.cpp:75:39:75:41 | *call to buffer | bdlbb.cpp:75:18:75:46 | call to get | provenance | DataFlowFunction | +| bdlbb.cpp:80:16:80:23 | call to source | bdlbb.cpp:82:49:82:52 | *call to data | provenance | TaintFunction | +| bdlbb.cpp:82:37:82:41 | copy output argument | bdlbb.cpp:84:72:84:75 | *blob | provenance | | +| bdlbb.cpp:82:49:82:52 | *call to data | bdlbb.cpp:82:37:82:41 | copy output argument | provenance | MaD:101 | +| bdlbb.cpp:84:12:84:65 | *call to getContiguousRangeOrCopy | bdlbb.cpp:84:12:84:65 | *call to getContiguousRangeOrCopy | provenance | | +| bdlbb.cpp:84:12:84:65 | *call to getContiguousRangeOrCopy | bdlbb.cpp:85:7:85:8 | * ... | provenance | | +| bdlbb.cpp:84:72:84:75 | *blob | bdlbb.cpp:84:12:84:65 | *call to getContiguousRangeOrCopy | provenance | MaD:103 | +| bdlbb.cpp:90:16:90:23 | call to source | bdlbb.cpp:92:48:92:51 | *call to data | provenance | TaintFunction | +| bdlbb.cpp:92:37:92:40 | copy output argument | bdlbb.cpp:94:46:94:48 | *src | provenance | | +| bdlbb.cpp:92:48:92:51 | *call to data | bdlbb.cpp:92:37:92:40 | copy output argument | provenance | MaD:101 | +| bdlbb.cpp:94:37:94:40 | copy output argument | bdlbb.cpp:96:42:96:44 | *dst | provenance | | +| bdlbb.cpp:94:46:94:48 | *src | bdlbb.cpp:94:37:94:40 | copy output argument | provenance | MaD:100 | +| bdlbb.cpp:96:37:96:39 | copy output argument | bdlbb.cpp:97:7:97:10 | * ... | provenance | | +| bdlbb.cpp:96:42:96:44 | *dst | bdlbb.cpp:96:37:96:39 | copy output argument | provenance | MaD:102 | | test.cpp:7:47:7:52 | value2 | test.cpp:7:64:7:69 | value2 | provenance | | | test.cpp:7:64:7:69 | value2 | test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | provenance | | | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:10:10:10:18 | call to ymlSource | provenance | Src:MaD:48 | @@ -563,35 +571,43 @@ nodes | azure.cpp:295:10:295:20 | contentType | semmle.label | contentType | | azure.cpp:295:10:295:20 | contentType | semmle.label | contentType | | azure.cpp:295:10:295:20 | contentType | semmle.label | contentType | -| bdlbb.cpp:48:16:48:23 | call to source | semmle.label | call to source | -| bdlbb.cpp:50:37:50:41 | copy output argument | semmle.label | copy output argument | -| bdlbb.cpp:50:49:50:52 | *call to data | semmle.label | *call to data | -| bdlbb.cpp:52:37:52:39 | copy output argument | semmle.label | copy output argument | -| bdlbb.cpp:52:42:52:45 | *blob | semmle.label | *blob | -| bdlbb.cpp:53:7:53:10 | * ... | semmle.label | * ... | -| bdlbb.cpp:57:16:57:23 | call to source | semmle.label | call to source | -| bdlbb.cpp:59:37:59:41 | copy output argument | semmle.label | copy output argument | -| bdlbb.cpp:59:49:59:52 | *call to data | semmle.label | *call to data | -| bdlbb.cpp:60:18:60:21 | *blob | semmle.label | *blob | -| bdlbb.cpp:60:18:60:38 | *call to data | semmle.label | *call to data | -| bdlbb.cpp:60:18:60:38 | *call to data | semmle.label | *call to data | -| bdlbb.cpp:60:29:60:32 | *call to buffer | semmle.label | *call to buffer | -| bdlbb.cpp:61:7:61:8 | * ... | semmle.label | * ... | -| bdlbb.cpp:65:16:65:23 | call to source | semmle.label | call to source | -| bdlbb.cpp:67:37:67:41 | copy output argument | semmle.label | copy output argument | -| bdlbb.cpp:67:49:67:52 | *call to data | semmle.label | *call to data | -| bdlbb.cpp:69:12:69:65 | *call to getContiguousRangeOrCopy | semmle.label | *call to getContiguousRangeOrCopy | -| bdlbb.cpp:69:12:69:65 | *call to getContiguousRangeOrCopy | semmle.label | *call to getContiguousRangeOrCopy | -| bdlbb.cpp:69:72:69:75 | *blob | semmle.label | *blob | -| bdlbb.cpp:70:7:70:8 | * ... | semmle.label | * ... | -| bdlbb.cpp:75:16:75:23 | call to source | semmle.label | call to source | -| bdlbb.cpp:77:37:77:40 | copy output argument | semmle.label | copy output argument | -| bdlbb.cpp:77:48:77:51 | *call to data | semmle.label | *call to data | -| bdlbb.cpp:79:37:79:40 | copy output argument | semmle.label | copy output argument | -| bdlbb.cpp:79:46:79:48 | *src | semmle.label | *src | -| bdlbb.cpp:81:37:81:39 | copy output argument | semmle.label | copy output argument | -| bdlbb.cpp:81:42:81:44 | *dst | semmle.label | *dst | -| bdlbb.cpp:82:7:82:10 | * ... | semmle.label | * ... | +| bdlbb.cpp:54:16:54:23 | call to source | semmle.label | call to source | +| bdlbb.cpp:56:37:56:41 | copy output argument | semmle.label | copy output argument | +| bdlbb.cpp:56:49:56:52 | *call to data | semmle.label | *call to data | +| bdlbb.cpp:58:37:58:39 | copy output argument | semmle.label | copy output argument | +| bdlbb.cpp:58:42:58:45 | *blob | semmle.label | *blob | +| bdlbb.cpp:59:7:59:10 | * ... | semmle.label | * ... | +| bdlbb.cpp:63:16:63:23 | call to source | semmle.label | call to source | +| bdlbb.cpp:65:37:65:41 | copy output argument | semmle.label | copy output argument | +| bdlbb.cpp:65:49:65:52 | *call to data | semmle.label | *call to data | +| bdlbb.cpp:66:18:66:21 | *blob | semmle.label | *blob | +| bdlbb.cpp:66:18:66:38 | *call to data | semmle.label | *call to data | +| bdlbb.cpp:66:18:66:38 | *call to data | semmle.label | *call to data | +| bdlbb.cpp:66:29:66:32 | *call to buffer | semmle.label | *call to buffer | +| bdlbb.cpp:67:7:67:8 | * ... | semmle.label | * ... | +| bdlbb.cpp:72:16:72:23 | call to source | semmle.label | call to source | +| bdlbb.cpp:74:37:74:41 | copy output argument | semmle.label | copy output argument | +| bdlbb.cpp:74:49:74:52 | *call to data | semmle.label | *call to data | +| bdlbb.cpp:75:18:75:21 | *blob | semmle.label | *blob | +| bdlbb.cpp:75:18:75:46 | call to get | semmle.label | call to get | +| bdlbb.cpp:75:29:75:32 | *call to buffer | semmle.label | *call to buffer | +| bdlbb.cpp:75:39:75:41 | *call to buffer | semmle.label | *call to buffer | +| bdlbb.cpp:76:7:76:8 | * ... | semmle.label | * ... | +| bdlbb.cpp:80:16:80:23 | call to source | semmle.label | call to source | +| bdlbb.cpp:82:37:82:41 | copy output argument | semmle.label | copy output argument | +| bdlbb.cpp:82:49:82:52 | *call to data | semmle.label | *call to data | +| bdlbb.cpp:84:12:84:65 | *call to getContiguousRangeOrCopy | semmle.label | *call to getContiguousRangeOrCopy | +| bdlbb.cpp:84:12:84:65 | *call to getContiguousRangeOrCopy | semmle.label | *call to getContiguousRangeOrCopy | +| bdlbb.cpp:84:72:84:75 | *blob | semmle.label | *blob | +| bdlbb.cpp:85:7:85:8 | * ... | semmle.label | * ... | +| bdlbb.cpp:90:16:90:23 | call to source | semmle.label | call to source | +| bdlbb.cpp:92:37:92:40 | copy output argument | semmle.label | copy output argument | +| bdlbb.cpp:92:48:92:51 | *call to data | semmle.label | *call to data | +| bdlbb.cpp:94:37:94:40 | copy output argument | semmle.label | copy output argument | +| bdlbb.cpp:94:46:94:48 | *src | semmle.label | *src | +| bdlbb.cpp:96:37:96:39 | copy output argument | semmle.label | copy output argument | +| bdlbb.cpp:96:42:96:44 | *dst | semmle.label | *dst | +| bdlbb.cpp:97:7:97:10 | * ... | semmle.label | * ... | | test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | semmle.label | *ymlStepGenerated_with_body | | test.cpp:7:47:7:52 | value2 | semmle.label | value2 | | test.cpp:7:64:7:69 | value2 | semmle.label | value2 | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/steps.expected b/cpp/ql/test/library-tests/dataflow/external-models/steps.expected index 9a455ec8ab8c..42d2c0183c34 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/steps.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/steps.expected @@ -4,17 +4,20 @@ | azure.cpp:262:5:262:8 | *resp | azure.cpp:262:23:262:28 | ReadToCount output argument | | azure.cpp:287:79:287:98 | call to string | azure.cpp:287:62:287:99 | call to Url | | azure.cpp:289:24:289:56 | call to GetHeader | azure.cpp:289:63:289:65 | call to Value | -| bdlbb.cpp:50:49:50:52 | *call to data | bdlbb.cpp:50:37:50:41 | copy output argument | -| bdlbb.cpp:52:42:52:45 | *blob | bdlbb.cpp:52:37:52:39 | copy output argument | -| bdlbb.cpp:59:49:59:52 | *call to data | bdlbb.cpp:59:37:59:41 | copy output argument | -| bdlbb.cpp:60:18:60:21 | *blob | bdlbb.cpp:60:29:60:32 | *call to buffer | -| bdlbb.cpp:60:29:60:32 | *call to buffer | bdlbb.cpp:60:18:60:38 | *call to data | -| bdlbb.cpp:67:49:67:52 | *call to data | bdlbb.cpp:67:37:67:41 | copy output argument | -| bdlbb.cpp:69:72:69:75 | *blob | bdlbb.cpp:69:12:69:65 | *call to getContiguousRangeOrCopy | -| bdlbb.cpp:69:72:69:75 | *blob | bdlbb.cpp:69:67:69:69 | getContiguousRangeOrCopy output argument | -| bdlbb.cpp:77:48:77:51 | *call to data | bdlbb.cpp:77:37:77:40 | copy output argument | -| bdlbb.cpp:79:46:79:48 | *src | bdlbb.cpp:79:37:79:40 | copy output argument | -| bdlbb.cpp:81:42:81:44 | *dst | bdlbb.cpp:81:37:81:39 | copy output argument | +| bdlbb.cpp:56:49:56:52 | *call to data | bdlbb.cpp:56:37:56:41 | copy output argument | +| bdlbb.cpp:58:42:58:45 | *blob | bdlbb.cpp:58:37:58:39 | copy output argument | +| bdlbb.cpp:65:49:65:52 | *call to data | bdlbb.cpp:65:37:65:41 | copy output argument | +| bdlbb.cpp:66:18:66:21 | *blob | bdlbb.cpp:66:29:66:32 | *call to buffer | +| bdlbb.cpp:66:29:66:32 | *call to buffer | bdlbb.cpp:66:18:66:38 | *call to data | +| bdlbb.cpp:74:49:74:52 | *call to data | bdlbb.cpp:74:37:74:41 | copy output argument | +| bdlbb.cpp:75:18:75:21 | *blob | bdlbb.cpp:75:29:75:32 | *call to buffer | +| bdlbb.cpp:75:29:75:32 | *call to buffer | bdlbb.cpp:75:39:75:41 | *call to buffer | +| bdlbb.cpp:82:49:82:52 | *call to data | bdlbb.cpp:82:37:82:41 | copy output argument | +| bdlbb.cpp:84:72:84:75 | *blob | bdlbb.cpp:84:12:84:65 | *call to getContiguousRangeOrCopy | +| bdlbb.cpp:84:72:84:75 | *blob | bdlbb.cpp:84:67:84:69 | getContiguousRangeOrCopy output argument | +| bdlbb.cpp:92:48:92:51 | *call to data | bdlbb.cpp:92:37:92:40 | copy output argument | +| bdlbb.cpp:94:46:94:48 | *src | bdlbb.cpp:94:37:94:40 | copy output argument | +| bdlbb.cpp:96:42:96:44 | *dst | bdlbb.cpp:96:37:96:39 | copy output argument | | test.cpp:17:24:17:24 | x | test.cpp:17:10:17:22 | call to ymlStepManual | | test.cpp:21:27:21:27 | x | test.cpp:21:10:21:25 | call to ymlStepGenerated | | test.cpp:25:35:25:35 | x | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | From 186e211bb527eba31631632b5db02a3fb3f38a35 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 3 Sep 2026 10:39:23 +0200 Subject: [PATCH 0670/2098] unified: Clean up API a bit --- .../lib/codeql/unified/internal/FacadeAst.qll | 8 + .../unified/internal/LocalNameBinding.qll | 203 ++++++++---------- .../unified/internal/NameBindingPlugin.qll | 10 +- .../internal/NameBindingPluginSwift.qll | 48 ++--- 4 files changed, 118 insertions(+), 151 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll index 3262de611441..ec17e6505c95 100644 --- a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll +++ b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll @@ -55,6 +55,14 @@ module Unified { // just strip the quotes here and ignore escape sequences. result = this.(StringLiteral).getValue().regexpCapture("\"(.*)\"", 1) } + + /** Gets the immediately-enclosing expression, skipping over intermediate sub-nodes like `Argument`, and without crossing a function boundary. */ + Expr getEnclosingExpr() { + result = this.getParent() and + not result instanceof Callable + or + result = this.getParent().(Argument).getParent() + } } /** A binary expression. */ diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index e48290179082..df95034cdf85 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -186,119 +186,94 @@ private module LocalNameBindingInput implements LocalNameBindingInputSig Date: Thu, 3 Sep 2026 07:05:11 -0400 Subject: [PATCH 0671/2098] chore: applies review suggestion Co-authored-by: Michael Nebel --- csharp/ql/lib/Linq/Helpers.qll | 1 - 1 file changed, 1 deletion(-) diff --git a/csharp/ql/lib/Linq/Helpers.qll b/csharp/ql/lib/Linq/Helpers.qll index ad4e83e91ba6..fcbc01c5e35d 100644 --- a/csharp/ql/lib/Linq/Helpers.qll +++ b/csharp/ql/lib/Linq/Helpers.qll @@ -34,7 +34,6 @@ private predicate terminatesCallable(Stmt s) { or stripped = any(IfStmt nested | - exists(nested.getElse()) and terminatesCallable(nested.getThen()) and terminatesCallable(nested.getElse()) ) From 6525503b73f653474b2545ae8ebad6560bd2e7f1 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Thu, 3 Sep 2026 07:18:20 -0400 Subject: [PATCH 0672/2098] chore: linting --- csharp/ql/lib/Linq/Helpers.qll | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/csharp/ql/lib/Linq/Helpers.qll b/csharp/ql/lib/Linq/Helpers.qll index 7739ad610d09..5ac772016627 100644 --- a/csharp/ql/lib/Linq/Helpers.qll +++ b/csharp/ql/lib/Linq/Helpers.qll @@ -197,8 +197,8 @@ predicate missedFirstOrDefaultOpportunity(ForeachStmtGenericEnumerable fes, IfSt va = is.getCondition().getAChildExpr*() ) and not is.getCondition().getAChildExpr*() instanceof AwaitExpr and - exists(ReturnStmt ret, ReturnStmt defaultRet, BlockStmt enclosingBlock, int i | - returnsLoopVariable(fes, is.getThen(), ret) and + exists(ReturnStmt defaultRet, BlockStmt enclosingBlock, int i | + returnsLoopVariable(fes, is.getThen(), _) and // If no element matches, the method returns the same value that FirstOrDefault would. returnsDefaultValue(fes, defaultRet) and enclosingBlock.getStmt(i) = fes and From dd84d7f14473cb1f025259f8c4c935b7e86b8697 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Thu, 3 Sep 2026 07:22:40 -0400 Subject: [PATCH 0673/2098] docs: adds change note for linq where fixes --- .../change-notes/2026-09-03-missed-where-terminal-branches.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 csharp/ql/src/change-notes/2026-09-03-missed-where-terminal-branches.md diff --git a/csharp/ql/src/change-notes/2026-09-03-missed-where-terminal-branches.md b/csharp/ql/src/change-notes/2026-09-03-missed-where-terminal-branches.md new file mode 100644 index 000000000000..33515e4c90cd --- /dev/null +++ b/csharp/ql/src/change-notes/2026-09-03-missed-where-terminal-branches.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `cs/linq/missed-where` query no longer flags `foreach` loops where the matching branch terminates the method, iterator, or loop instead of continuing with filtered loop work. From 543ead43237534a30147127d67f35e799e2aab56 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 3 Sep 2026 13:01:33 +0200 Subject: [PATCH 0674/2098] C#: Add change-note. --- .../ql/src/change-notes/2026-09-03-missed-firstordefault.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 csharp/ql/src/change-notes/2026-09-03-missed-firstordefault.md diff --git a/csharp/ql/src/change-notes/2026-09-03-missed-firstordefault.md b/csharp/ql/src/change-notes/2026-09-03-missed-firstordefault.md new file mode 100644 index 000000000000..f4fed0de1301 --- /dev/null +++ b/csharp/ql/src/change-notes/2026-09-03-missed-firstordefault.md @@ -0,0 +1,4 @@ +--- +category: newQuery +--- +* Added a new query, `cs/linq/missed-firstordefault`, that detects `foreach` loops that can be expressed more clearly using LINQ's `FirstOrDefault` method. From 2eb16daa053d99df7b37895e90d4ea166cdc1c76 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 3 Sep 2026 12:56:55 +0200 Subject: [PATCH 0675/2098] C#: Update integration test expected output. --- .../posix/query-suite/csharp-code-quality-extended.qls.expected | 1 + .../posix/query-suite/csharp-code-quality.qls.expected | 1 + 2 files changed, 2 insertions(+) diff --git a/csharp/ql/integration-tests/posix/query-suite/csharp-code-quality-extended.qls.expected b/csharp/ql/integration-tests/posix/query-suite/csharp-code-quality-extended.qls.expected index c6361fe69c52..931f5f372d40 100644 --- a/csharp/ql/integration-tests/posix/query-suite/csharp-code-quality-extended.qls.expected +++ b/csharp/ql/integration-tests/posix/query-suite/csharp-code-quality-extended.qls.expected @@ -93,6 +93,7 @@ ql/csharp/ql/src/Likely Bugs/UncheckedCastInEquals.ql ql/csharp/ql/src/Linq/BadMultipleIteration.ql ql/csharp/ql/src/Linq/MissedAllOpportunity.ql ql/csharp/ql/src/Linq/MissedCastOpportunity.ql +ql/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.ql ql/csharp/ql/src/Linq/MissedOfTypeOpportunity.ql ql/csharp/ql/src/Linq/MissedSelectOpportunity.ql ql/csharp/ql/src/Linq/MissedWhereOpportunity.ql diff --git a/csharp/ql/integration-tests/posix/query-suite/csharp-code-quality.qls.expected b/csharp/ql/integration-tests/posix/query-suite/csharp-code-quality.qls.expected index b944b848df8e..420c53f9f277 100644 --- a/csharp/ql/integration-tests/posix/query-suite/csharp-code-quality.qls.expected +++ b/csharp/ql/integration-tests/posix/query-suite/csharp-code-quality.qls.expected @@ -55,6 +55,7 @@ ql/csharp/ql/src/Likely Bugs/StringBuilderCharInit.ql ql/csharp/ql/src/Likely Bugs/UncheckedCastInEquals.ql ql/csharp/ql/src/Linq/MissedAllOpportunity.ql ql/csharp/ql/src/Linq/MissedCastOpportunity.ql +ql/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.ql ql/csharp/ql/src/Linq/MissedOfTypeOpportunity.ql ql/csharp/ql/src/Linq/MissedSelectOpportunity.ql ql/csharp/ql/src/Linq/MissedWhereOpportunity.ql From 6d867e12e2403b563d943ddd281c78063fa7ec06 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 3 Sep 2026 11:06:44 +0200 Subject: [PATCH 0676/2098] C#: Address some review comments. Signed-off-by: Vincent Biret --- csharp/ql/lib/Linq/Helpers.qll | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/csharp/ql/lib/Linq/Helpers.qll b/csharp/ql/lib/Linq/Helpers.qll index 5ac772016627..f41c435accf6 100644 --- a/csharp/ql/lib/Linq/Helpers.qll +++ b/csharp/ql/lib/Linq/Helpers.qll @@ -20,15 +20,19 @@ private int numStmts(ForeachStmt fes) { else result = 1 } -private predicate returnsLoopVariable(ForeachStmt fes, Stmt s, ReturnStmt ret) { - ret = s.stripSingletonBlocks() and - ret.getExpr().stripCasts().(VariableAccess).getTarget() = fes.getVariable() +private predicate returnsLoopVariable(ForeachStmt fes, Stmt s) { + exists(ReturnStmt ret | + ret = s.stripSingletonBlocks() and + ret.getExpr().stripCasts().(VariableAccess).getTarget() = fes.getVariable() + ) } private predicate hasNullDefault(Type t) { t.isRefType() or t instanceof NullableType } -private predicate returnsDefaultValue(ForeachStmt fes, ReturnStmt ret) { - exists(Type elementType | +private predicate returnsDefaultValueAfterForeach(ForeachStmt fes) { + exists(BlockStmt enclosingBlock, int i, Type elementType, ReturnStmt ret | + enclosingBlock.getStmt(i) = fes and + enclosingBlock.getStmt(i + 1) = ret and elementType = fes.getVariable().getType() | ret.getExpr().stripCasts() instanceof NullLiteral and @@ -192,18 +196,14 @@ predicate missedFirstOrDefaultOpportunity(ForeachStmtGenericEnumerable fes, IfSt is = firstStmt(fes) and not exists(is.getElse()) and numStmts(fes) = 1 and + // Condition relies on loop variable. exists(VariableAccess va | va.getTarget() = fes.getVariable() and va = is.getCondition().getAChildExpr*() ) and not is.getCondition().getAChildExpr*() instanceof AwaitExpr and - exists(ReturnStmt defaultRet, BlockStmt enclosingBlock, int i | - returnsLoopVariable(fes, is.getThen(), _) and - // If no element matches, the method returns the same value that FirstOrDefault would. - returnsDefaultValue(fes, defaultRet) and - enclosingBlock.getStmt(i) = fes and - enclosingBlock.getStmt(i + 1) = defaultRet - ) + returnsLoopVariable(fes, is.getThen()) and + returnsDefaultValueAfterForeach(fes) } //#################### CLASSES #################### From 1617ace586d7d37244d81baccf08870f5b811f3f Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Thu, 3 Sep 2026 07:40:09 -0400 Subject: [PATCH 0677/2098] chore: applies review suggestions Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- csharp/ql/lib/Linq/Helpers.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csharp/ql/lib/Linq/Helpers.qll b/csharp/ql/lib/Linq/Helpers.qll index f41c435accf6..f1ed31c6c2e8 100644 --- a/csharp/ql/lib/Linq/Helpers.qll +++ b/csharp/ql/lib/Linq/Helpers.qll @@ -23,7 +23,7 @@ private int numStmts(ForeachStmt fes) { private predicate returnsLoopVariable(ForeachStmt fes, Stmt s) { exists(ReturnStmt ret | ret = s.stripSingletonBlocks() and - ret.getExpr().stripCasts().(VariableAccess).getTarget() = fes.getVariable() + ret.getExpr().stripImplicit().(VariableAccess).getTarget() = fes.getVariable() ) } From 51a59291347c91826822487054ebbe66d355454f Mon Sep 17 00:00:00 2001 From: Taus Date: Thu, 3 Sep 2026 11:49:10 +0000 Subject: [PATCH 0678/2098] unified: Pin `swift-syntax` directly --- unified/scripts/regenerate-node-types.sh | 7 ++----- unified/swift-syntax-rs/README.md | 13 ++++++++----- .../schemagen/Package.resolved | 14 ++++++++++++++ .../swift-syntax-rs/schemagen/Package.swift | 11 ++++++----- unified/swift-syntax-rs/schemagen/README.md | 19 ++++++++++--------- 5 files changed, 40 insertions(+), 24 deletions(-) create mode 100644 unified/swift-syntax-rs/schemagen/Package.resolved diff --git a/unified/scripts/regenerate-node-types.sh b/unified/scripts/regenerate-node-types.sh index e811dd3dd632..26cb1472f795 100755 --- a/unified/scripts/regenerate-node-types.sh +++ b/unified/scripts/regenerate-node-types.sh @@ -17,7 +17,6 @@ IFS=$'\n\t' root=$(cd "$(dirname "$0")/.." && pwd) swift_syntax_rs_dir="$root/swift-syntax-rs" -ffi_dir="$swift_syntax_rs_dir/swift" schemagen_dir="$swift_syntax_rs_dir/schemagen" output="$root/extractor/swift_node_types.yml" @@ -38,14 +37,12 @@ run_swift() { fi } -# `schemagen` takes swift-syntax as a path dependency on this checkout, so that -# the schema describes exactly the version the parser links. echo "Resolving swift-syntax..." >&2 ( - cd "$ffi_dir" + cd "$schemagen_dir" run_swift package resolve >&2 ) -checkout="$ffi_dir/.build/checkouts/swift-syntax" +checkout="$schemagen_dir/.build/checkouts/swift-syntax" syntax_support="$checkout/CodeGeneration/Sources/SyntaxSupport" if [[ ! -d $syntax_support ]]; then echo "error: $syntax_support not found after resolving swift-syntax." >&2 diff --git a/unified/swift-syntax-rs/README.md b/unified/swift-syntax-rs/README.md index d272c551bd7c..ee0e559820b4 100644 --- a/unified/swift-syntax-rs/README.md +++ b/unified/swift-syntax-rs/README.md @@ -196,12 +196,15 @@ Requirements: swift.org. The Bazel C++ toolchain must still provide the macOS SDK, but a full Xcode installation is not required. -The Swift compiler version is kept in sync across three places: the +The Swift compiler version is kept in sync between the [`.swift-version`](.swift-version) file (read by the local `cargo`/`swift build` -and by [swiftly](https://www.swift.org/swiftly/)), the literal `swift_version` -pinned on `swift.toolchain(...)` in the root `MODULE.bazel` (the hermetic -swift.org Bazel toolchain), and the `swift-syntax` release in -`swift/Package.swift`. +and by [swiftly](https://www.swift.org/swiftly/)) and the literal +`swift_version` pinned on `swift.toolchain(...)` in the root `MODULE.bazel` +(the hermetic swift.org Bazel toolchain). + +The swift-syntax version is independently pinned in the root `MODULE.bazel`, +[`swift/Package.swift`](swift/Package.swift), and +[`schemagen/Package.swift`](schemagen/Package.swift). Update all three together. (The Bazel toolchain pins a literal rather than reading `.swift-version` via `swift_version_file`, because the latter makes the module extension read a diff --git a/unified/swift-syntax-rs/schemagen/Package.resolved b/unified/swift-syntax-rs/schemagen/Package.resolved new file mode 100644 index 000000000000..71155ffedbc0 --- /dev/null +++ b/unified/swift-syntax-rs/schemagen/Package.resolved @@ -0,0 +1,14 @@ +{ + "pins" : [ + { + "identity" : "swift-syntax", + "kind" : "remoteSourceControl", + "location" : "https://github.com/swiftlang/swift-syntax.git", + "state" : { + "revision" : "79e4b74a295b6eb74a8b585e3a39d29e70c1dbd1", + "version" : "603.0.2" + } + } + ], + "version" : 2 +} diff --git a/unified/swift-syntax-rs/schemagen/Package.swift b/unified/swift-syntax-rs/schemagen/Package.swift index c241713751e6..7ee5fd143f90 100644 --- a/unified/swift-syntax-rs/schemagen/Package.swift +++ b/unified/swift-syntax-rs/schemagen/Package.swift @@ -17,11 +17,12 @@ let package = Package( .macOS(.v10_15), ], dependencies: [ - // Deliberately a path dependency on the checkout the neighbouring FFI - // package resolved, rather than a second URL/exact pin: the schema has - // to describe the very swift-syntax that the parser links, and a - // single pin cannot drift from itself. - .package(name: "swift-syntax", path: "../swift/.build/checkouts/swift-syntax"), + // Keep this independent pin synchronized with the swift-syntax pins in + // `../swift/Package.swift` and the repository's `MODULE.bazel`. + .package( + url: "https://github.com/swiftlang/swift-syntax.git", + exact: "603.0.2" + ), ], targets: [ // `SyntaxSupport` is a target of swift-syntax's separate diff --git a/unified/swift-syntax-rs/schemagen/README.md b/unified/swift-syntax-rs/schemagen/README.md index 727f93c48b30..fc9ea0947f29 100644 --- a/unified/swift-syntax-rs/schemagen/README.md +++ b/unified/swift-syntax-rs/schemagen/README.md @@ -34,16 +34,17 @@ products. SwiftPM can only depend on products, and Bazel's swift-syntax module does not export the `CodeGeneration` sources, so neither build system can reach it directly. -The regeneration script therefore copies those sources out of the resolved -swift-syntax checkout into `Sources/SyntaxSupport`, where this package builds -them as its own. That directory is git-ignored and refreshed on every run, so -it always matches the pinned version rather than drifting as a stale vendored -copy would. +The regeneration script therefore resolves this package's swift-syntax +dependency and copies its `CodeGeneration/Sources/SyntaxSupport` sources into +`Sources/SyntaxSupport`, where this package builds them as its own. That +directory is git-ignored and refreshed on every run, so it always matches +schemagen's pin rather than drifting as a stale vendored copy would. -For the same reason this package takes swift-syntax as a path dependency on the -checkout the neighbouring FFI package resolved, rather than declaring a second -pinned dependency of its own. The schema must describe exactly the -swift-syntax version linked by `swift-syntax-rs`. +Schemagen has its own exact swift-syntax pin in `Package.swift`. Keep it +synchronized with the SwiftPM parser pin in `../swift/Package.swift` and the +Bazel pin in the repository's `MODULE.bazel`. The build systems resolve these +independently, so regeneration does not itself guarantee that all three pins +match. ## What is filtered out From 7f8a20e4a57ffda798cce7da9ab48abafb9c8d1c Mon Sep 17 00:00:00 2001 From: yoff Date: Thu, 3 Sep 2026 13:55:38 +0200 Subject: [PATCH 0679/2098] shared: consistent order for consistency checks --- shared/controlflow/codeql/controlflow/ControlFlowGraph.qll | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll index ccf093cfa76d..18961deb83bb 100644 --- a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll +++ b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll @@ -2254,15 +2254,15 @@ module Make0 Ast> { query = "ambiguousAdditionalNode" and results = strictcount(AstNode n, string tag | ambiguousAdditionalNode(n, tag)) or - query = "missingInNodeForPostOrInOrder" and - results = strictcount(AstNode ast | missingInNodeForPostOrInOrder(ast)) - or query = "invalidAbruptCompletionOrigin" and results = strictcount(AstNode ast, PreControlFlowNode node | invalidAbruptCompletionOrigin(ast, node) ) or + query = "missingInNodeForPostOrInOrder" and + results = strictcount(AstNode ast | missingInNodeForPostOrInOrder(ast)) + or query = "multipleSuccessors" and results = strictcount(ControlFlowNode node, SuccessorType t, ControlFlowNode successor | From 9207c4be562334eef2760e36e2aeaf86e5984f8b Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 3 Sep 2026 13:04:03 +0200 Subject: [PATCH 0680/2098] Address review comment --- go/ql/lib/semmle/go/dependencies/SemVer.qll | 34 ++++--------------- .../semmle/javascript/dependencies/SemVer.qll | 34 ++++--------------- .../codeql/rust/internal/PathResolution.qll | 3 +- shared/util/codeql/util/SemVer.qll | 26 ++++++++++++++ 4 files changed, 42 insertions(+), 55 deletions(-) create mode 100644 shared/util/codeql/util/SemVer.qll diff --git a/go/ql/lib/semmle/go/dependencies/SemVer.qll b/go/ql/lib/semmle/go/dependencies/SemVer.qll index 290617781ec0..74444f94d50b 100644 --- a/go/ql/lib/semmle/go/dependencies/SemVer.qll +++ b/go/ql/lib/semmle/go/dependencies/SemVer.qll @@ -5,6 +5,7 @@ overlay[local?] module; import semmle.go.dependencies.Dependencies +private import codeql.util.SemVer /** * A SemVer-formatted version string in a dependency. @@ -17,35 +18,35 @@ class DependencySemVer extends string { DependencySemVer() { this = dep.getDepVersion() and - normalized = normalizeSemver(this) + normalized = normalizeSemVer(this) } /** * Holds if this version may be before `last`. */ bindingset[last] - predicate maybeBefore(string last) { normalized < normalizeSemver(last) } + predicate maybeBefore(string last) { normalized < normalizeSemVer(last) } /** * Holds if this version may be after `first`. */ bindingset[first] - predicate maybeAfter(string first) { normalizeSemver(first) < normalized } + predicate maybeAfter(string first) { normalizeSemVer(first) < normalized } /** * Holds if this version may be between `first` (inclusive) and `last` (exclusive). */ bindingset[first, last] predicate maybeBetween(string first, string last) { - normalizeSemver(first) <= normalized and - normalized < normalizeSemver(last) + normalizeSemVer(first) <= normalized and + normalized < normalizeSemVer(last) } /** * Holds if this version is equivalent to `other`. */ bindingset[other] - predicate is(string other) { normalized = normalizeSemver(other) } + predicate is(string other) { normalized = normalizeSemVer(other) } /** * Gets the dependency that uses this string. @@ -53,27 +54,6 @@ class DependencySemVer extends string { Dependency getDependency() { result = dep } } -bindingset[str] -private string leftPad(string str) { result = ("000" + str).suffix(str.length()) } - -/** - * Normalizes a SemVer string such that the lexicographical ordering - * of two normalized strings is consistent with the SemVer ordering. - * - * Pre-release information and build metadata is not yet supported. - */ -bindingset[orig] -private string normalizeSemver(string orig) { - exists(string pattern, string major, string minor, string patch | - pattern = "v?(\\d+)\\.(\\d+)\\.(\\d+)(\\D.*)?" and - major = orig.regexpCapture(pattern, 1) and - minor = orig.regexpCapture(pattern, 2) and - patch = orig.regexpCapture(pattern, 3) - | - result = leftPad(major) + "." + leftPad(minor) + "." + leftPad(patch) - ) -} - /** * A version string in a dependency that has a SemVer, but also contains a git commit SHA. * diff --git a/javascript/ql/lib/semmle/javascript/dependencies/SemVer.qll b/javascript/ql/lib/semmle/javascript/dependencies/SemVer.qll index 1d091e9219c9..1ebbfad608fd 100644 --- a/javascript/ql/lib/semmle/javascript/dependencies/SemVer.qll +++ b/javascript/ql/lib/semmle/javascript/dependencies/SemVer.qll @@ -3,6 +3,7 @@ */ import semmle.javascript.dependencies.Dependencies +private import codeql.util.SemVer /** * A SemVer-formatted version string in a dependency. @@ -15,59 +16,38 @@ class DependencySemVer extends string { DependencySemVer() { dep.info(_, this) and - normalized = normalizeSemver(this) + normalized = normalizeSemVer(this) } /** * Holds if this version may be before `last`. */ bindingset[last] - predicate maybeBefore(string last) { normalized < normalizeSemver(last) } + predicate maybeBefore(string last) { normalized < normalizeSemVer(last) } /** * Holds if this version may be after `first`. */ bindingset[first] - predicate maybeAfter(string first) { normalizeSemver(first) < normalized } + predicate maybeAfter(string first) { normalizeSemVer(first) < normalized } /** * Holds if this version may be between `first` (inclusive) and `last` (exclusive). */ bindingset[first, last] predicate maybeBetween(string first, string last) { - normalizeSemver(first) <= normalized and - normalized < normalizeSemver(last) + normalizeSemVer(first) <= normalized and + normalized < normalizeSemVer(last) } /** * Holds if this version is equivalent to `other`. */ bindingset[other] - predicate is(string other) { normalized = normalizeSemver(other) } + predicate is(string other) { normalized = normalizeSemVer(other) } /** * Gets the dependency that uses this string. */ Dependency getDependency() { result = dep } } - -bindingset[str] -private string leftPad(string str) { result = ("000" + str).suffix(str.length()) } - -/** - * Normalizes a SemVer string such that the lexicographical ordering - * of two normalized strings is consistent with the SemVer ordering. - * - * Pre-release information and build metadata is not yet supported. - */ -bindingset[orig] -private string normalizeSemver(string orig) { - exists(string pattern, string major, string minor, string patch | - pattern = "(\\d+)\\.(\\d+)\\.(\\d+)" and - major = orig.regexpCapture(pattern, 1) and - minor = orig.regexpCapture(pattern, 2) and - patch = orig.regexpCapture(pattern, 3) - | - result = leftPad(major) + "." + leftPad(minor) + "." + leftPad(patch) - ) -} diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index a79908ac6f00..fbc859843ceb 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -48,6 +48,7 @@ private import codeql.rust.elements.internal.CallExprImpl::Impl as CallExprImpl private import codeql.rust.internal.CachedStages private import codeql.rust.frameworks.stdlib.Builtins as Builtins private import codeql.util.Option +private import codeql.util.SemVer private newtype TNamespace = TTypeNamespace() or @@ -572,7 +573,7 @@ class CrateItemNode extends NamedItemNode instanceof Crate { predicate isLatestVersion(string name) { this = max(CrateItemNode c, string ver | - name = c.getName() and ver = c.(Crate).getVersion() + name = c.getName() and ver = normalizeSemVer(c.(Crate).getVersion()) | c order by ver ) diff --git a/shared/util/codeql/util/SemVer.qll b/shared/util/codeql/util/SemVer.qll new file mode 100644 index 000000000000..d412fa698fda --- /dev/null +++ b/shared/util/codeql/util/SemVer.qll @@ -0,0 +1,26 @@ +/** + * Provides logic for working SemVer (Semantic Versioning). + */ +overlay[local?] +module; + +bindingset[str] +private string leftPad(string str) { result = ("0000" + str).suffix(str.length()) } + +/** + * Normalizes a SemVer string such that the lexicographical ordering + * of two normalized strings is consistent with the SemVer ordering. + * + * Pre-release information and build metadata is not yet supported. + */ +bindingset[orig] +string normalizeSemVer(string orig) { + exists(string pattern, string major, string minor, string patch | + pattern = "v?(\\d+)\\.(\\d+)\\.(\\d+)(\\D.*)?" and + major = orig.regexpCapture(pattern, 1) and + minor = orig.regexpCapture(pattern, 2) and + patch = orig.regexpCapture(pattern, 3) + | + result = leftPad(major) + "." + leftPad(minor) + "." + leftPad(patch) + ) +} From e3ed273d80a35fbeefa0280bf016c40b9083e7b8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 3 Sep 2026 12:48:42 +0000 Subject: [PATCH 0681/2098] Initial plan From bc584152b0fe36c428741b5f5ddc4b7f697a6f46 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 3 Sep 2026 12:56:00 +0000 Subject: [PATCH 0682/2098] Allow await property names in async functions Co-authored-by: hvitved <3667920+hvitved@users.noreply.github.com> --- javascript/extractor/src/com/semmle/jcorn/Parser.java | 4 ++-- .../AwaitPropertyName/AwaitPropertyName.expected | 0 .../library-tests/AwaitPropertyName/AwaitPropertyName.ql | 5 +++++ javascript/ql/test/library-tests/AwaitPropertyName/tst.js | 5 +++++ 4 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 javascript/ql/test/library-tests/AwaitPropertyName/AwaitPropertyName.expected create mode 100644 javascript/ql/test/library-tests/AwaitPropertyName/AwaitPropertyName.ql create mode 100644 javascript/ql/test/library-tests/AwaitPropertyName/tst.js diff --git a/javascript/extractor/src/com/semmle/jcorn/Parser.java b/javascript/extractor/src/com/semmle/jcorn/Parser.java index a248a82dd140..cb9af6c6822c 100644 --- a/javascript/extractor/src/com/semmle/jcorn/Parser.java +++ b/javascript/extractor/src/com/semmle/jcorn/Parser.java @@ -2296,9 +2296,9 @@ protected Identifier parseIdent(boolean liberal) { && (this.options.ecmaVersion() >= 6 || inputSubstring(this.start, this.end).indexOf("\\") == -1)) this.raiseRecoverable(this.start, "The keyword '" + this.value + "' is reserved"); - if (!isPrivateField && this.inGenerator && this.value.equals("yield")) + if (!liberal && !isPrivateField && this.inGenerator && this.value.equals("yield")) this.raiseRecoverable(this.start, "Can not use 'yield' as identifier inside a generator"); - if (!isPrivateField && this.inAsync && this.value.equals("await")) + if (!liberal && !isPrivateField && this.inAsync && this.value.equals("await")) this.raiseRecoverable( this.start, "Can not use 'await' as identifier inside an async function"); name = String.valueOf(this.value); diff --git a/javascript/ql/test/library-tests/AwaitPropertyName/AwaitPropertyName.expected b/javascript/ql/test/library-tests/AwaitPropertyName/AwaitPropertyName.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/javascript/ql/test/library-tests/AwaitPropertyName/AwaitPropertyName.ql b/javascript/ql/test/library-tests/AwaitPropertyName/AwaitPropertyName.ql new file mode 100644 index 000000000000..499d9bc46d6e --- /dev/null +++ b/javascript/ql/test/library-tests/AwaitPropertyName/AwaitPropertyName.ql @@ -0,0 +1,5 @@ +import javascript + +from Expr e +where e.toString() = "this expression should not exist" +select e diff --git a/javascript/ql/test/library-tests/AwaitPropertyName/tst.js b/javascript/ql/test/library-tests/AwaitPropertyName/tst.js new file mode 100644 index 000000000000..d2e91afcfa1a --- /dev/null +++ b/javascript/ql/test/library-tests/AwaitPropertyName/tst.js @@ -0,0 +1,5 @@ +const pool = { await() { return 42; } }; + +async function issue22499() { + return await pool.await(); +} From 63a5e8a76248159e06e7e8bb259b56637619ac72 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Thu, 3 Sep 2026 09:24:01 -0400 Subject: [PATCH 0683/2098] chore: applies review suggestions Co-authored-by: Michael Nebel --- csharp/ql/lib/Linq/Helpers.qll | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/csharp/ql/lib/Linq/Helpers.qll b/csharp/ql/lib/Linq/Helpers.qll index f1ed31c6c2e8..7241d0829889 100644 --- a/csharp/ql/lib/Linq/Helpers.qll +++ b/csharp/ql/lib/Linq/Helpers.qll @@ -35,11 +35,11 @@ private predicate returnsDefaultValueAfterForeach(ForeachStmt fes) { enclosingBlock.getStmt(i + 1) = ret and elementType = fes.getVariable().getType() | - ret.getExpr().stripCasts() instanceof NullLiteral and + ret.getExpr().stripImplicit() instanceof NullLiteral and hasNullDefault(elementType) or exists(DefaultValueExpr defaultValue | - defaultValue = ret.getExpr().stripCasts() and + defaultValue = ret.getExpr().stripImplicit() and ( defaultValue.getType() = elementType or @@ -202,6 +202,7 @@ predicate missedFirstOrDefaultOpportunity(ForeachStmtGenericEnumerable fes, IfSt va = is.getCondition().getAChildExpr*() ) and not is.getCondition().getAChildExpr*() instanceof AwaitExpr and + not fes.isAsync() and returnsLoopVariable(fes, is.getThen()) and returnsDefaultValueAfterForeach(fes) } From df7d49d1e0aff059ee3e93bd72434ca7813a0c3b Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 3 Sep 2026 15:40:18 +0200 Subject: [PATCH 0684/2098] Rename `normalizeSemVer` to `padSemVer` and adopt Ruby implementation --- go/ql/lib/semmle/go/dependencies/SemVer.qll | 12 ++--- .../semmle/javascript/dependencies/SemVer.qll | 12 ++--- .../ql/lib/codeql/ruby/frameworks/Gemfile.qll | 50 +++---------------- .../codeql/rust/internal/PathResolution.qll | 2 +- shared/util/codeql/util/SemVer.qll | 49 ++++++++++++++---- 5 files changed, 59 insertions(+), 66 deletions(-) diff --git a/go/ql/lib/semmle/go/dependencies/SemVer.qll b/go/ql/lib/semmle/go/dependencies/SemVer.qll index 74444f94d50b..a55d4e127990 100644 --- a/go/ql/lib/semmle/go/dependencies/SemVer.qll +++ b/go/ql/lib/semmle/go/dependencies/SemVer.qll @@ -18,35 +18,35 @@ class DependencySemVer extends string { DependencySemVer() { this = dep.getDepVersion() and - normalized = normalizeSemVer(this) + normalized = padSemVer(this) } /** * Holds if this version may be before `last`. */ bindingset[last] - predicate maybeBefore(string last) { normalized < normalizeSemVer(last) } + predicate maybeBefore(string last) { normalized < padSemVer(last) } /** * Holds if this version may be after `first`. */ bindingset[first] - predicate maybeAfter(string first) { normalizeSemVer(first) < normalized } + predicate maybeAfter(string first) { padSemVer(first) < normalized } /** * Holds if this version may be between `first` (inclusive) and `last` (exclusive). */ bindingset[first, last] predicate maybeBetween(string first, string last) { - normalizeSemVer(first) <= normalized and - normalized < normalizeSemVer(last) + padSemVer(first) <= normalized and + normalized < padSemVer(last) } /** * Holds if this version is equivalent to `other`. */ bindingset[other] - predicate is(string other) { normalized = normalizeSemVer(other) } + predicate is(string other) { normalized = padSemVer(other) } /** * Gets the dependency that uses this string. diff --git a/javascript/ql/lib/semmle/javascript/dependencies/SemVer.qll b/javascript/ql/lib/semmle/javascript/dependencies/SemVer.qll index 1ebbfad608fd..a869856076d5 100644 --- a/javascript/ql/lib/semmle/javascript/dependencies/SemVer.qll +++ b/javascript/ql/lib/semmle/javascript/dependencies/SemVer.qll @@ -16,35 +16,35 @@ class DependencySemVer extends string { DependencySemVer() { dep.info(_, this) and - normalized = normalizeSemVer(this) + normalized = padSemVer(this) } /** * Holds if this version may be before `last`. */ bindingset[last] - predicate maybeBefore(string last) { normalized < normalizeSemVer(last) } + predicate maybeBefore(string last) { normalized < padSemVer(last) } /** * Holds if this version may be after `first`. */ bindingset[first] - predicate maybeAfter(string first) { normalizeSemVer(first) < normalized } + predicate maybeAfter(string first) { padSemVer(first) < normalized } /** * Holds if this version may be between `first` (inclusive) and `last` (exclusive). */ bindingset[first, last] predicate maybeBetween(string first, string last) { - normalizeSemVer(first) <= normalized and - normalized < normalizeSemVer(last) + padSemVer(first) <= normalized and + normalized < padSemVer(last) } /** * Holds if this version is equivalent to `other`. */ bindingset[other] - predicate is(string other) { normalized = normalizeSemVer(other) } + predicate is(string other) { normalized = padSemVer(other) } /** * Gets the dependency that uses this string. diff --git a/ruby/ql/lib/codeql/ruby/frameworks/Gemfile.qll b/ruby/ql/lib/codeql/ruby/frameworks/Gemfile.qll index 83ebc27100a8..14153f8b16aa 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/Gemfile.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/Gemfile.qll @@ -3,6 +3,7 @@ */ private import codeql.ruby.AST +private import codeql.util.SemVer /** * Provides classes and predicates for Gemfiles, including version constraint logic. @@ -138,7 +139,7 @@ module Gemfile { exists(int thisMajor, int thisMinor, int otherMajor, int otherMinor | thisMajor = this.getVersion().getMajor() and thisMinor = this.getVersion().getMinor() and - exists(string maj, string mi | normalizeSemver(other, _, maj, mi, _) | + exists(string maj, string mi | exists(padSemVer(other, maj, mi, _)) | otherMajor = maj.toInt() and otherMinor = mi.toInt() ) | @@ -171,26 +172,26 @@ module Gemfile { Version() { this = any(Gem c).getAVersionConstraint().getVersionString() and - normalized = normalizeSemver(this) + normalized = padSemVer(this) } /** * Holds if this version is strictly before the version defined by `other`. */ bindingset[other] - predicate before(string other) { normalized < normalizeSemver(other) } + predicate before(string other) { normalized < padSemVer(other) } /** * Holds if this versino is equal to the version defined by `other`. */ bindingset[other] - predicate equal(string other) { normalized = normalizeSemver(other) } + predicate equal(string other) { normalized = padSemVer(other) } /** * Holds if this version is strictly after the version defined by `other`. */ bindingset[other] - predicate after(string other) { normalized > normalizeSemver(other) } + predicate after(string other) { normalized > padSemVer(other) } /** * Holds if this version defines a patch number. @@ -212,43 +213,4 @@ module Gemfile { */ int getPatch() { result = getPatch(normalized).toInt() } } - - /** - * Normalizes a SemVer string such that the lexicographical ordering - * of two normalized strings is consistent with the SemVer ordering. - * - * Pre-release information and build metadata is not supported. - */ - bindingset[orig] - private predicate normalizeSemver( - string orig, string normalized, string major, string minor, string patch - ) { - major = getMajor(orig) and - ( - minor = getMinor(orig) - or - not exists(getMinor(orig)) and minor = "0" - ) and - ( - patch = getPatch(orig) - or - not exists(getPatch(orig)) and patch = "0" - ) and - normalized = leftPad(major) + "." + leftPad(minor) + "." + leftPad(patch) - } - - bindingset[orig] - private string normalizeSemver(string orig) { normalizeSemver(orig, result, _, _, _) } - - bindingset[s] - private string getMajor(string s) { result = s.regexpCapture("(\\d+).*", 1) } - - bindingset[s] - private string getMinor(string s) { result = s.regexpCapture("(\\d+)\\.(\\d+).*", 2) } - - bindingset[s] - private string getPatch(string s) { result = s.regexpCapture("(\\d+)\\.(\\d+)\\.(\\d+).*", 3) } - - bindingset[str] - private string leftPad(string str) { result = ("000" + str).suffix(str.length()) } } diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index fbc859843ceb..f62262f7423f 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -573,7 +573,7 @@ class CrateItemNode extends NamedItemNode instanceof Crate { predicate isLatestVersion(string name) { this = max(CrateItemNode c, string ver | - name = c.getName() and ver = normalizeSemVer(c.(Crate).getVersion()) + name = c.getName() and ver = padSemVer(c.(Crate).getVersion()) | c order by ver ) diff --git a/shared/util/codeql/util/SemVer.qll b/shared/util/codeql/util/SemVer.qll index d412fa698fda..4c063721ce00 100644 --- a/shared/util/codeql/util/SemVer.qll +++ b/shared/util/codeql/util/SemVer.qll @@ -7,6 +7,24 @@ module; bindingset[str] private string leftPad(string str) { result = ("0000" + str).suffix(str.length()) } +/** + * Gets the major number of a SemVer string. + */ +bindingset[s] +string getMajor(string s) { result = s.regexpCapture("v?(\\d+).*", 1) } + +/** + * Gets the minor number of a SemVer string. + */ +bindingset[s] +string getMinor(string s) { result = s.regexpCapture("v?(\\d+)\\.(\\d+).*", 2) } + +/** + * Gets the patch number of a SemVer string. + */ +bindingset[s] +string getPatch(string s) { result = s.regexpCapture("v?(\\d+)\\.(\\d+)\\.(\\d+).*", 3) } + /** * Normalizes a SemVer string such that the lexicographical ordering * of two normalized strings is consistent with the SemVer ordering. @@ -14,13 +32,26 @@ private string leftPad(string str) { result = ("0000" + str).suffix(str.length() * Pre-release information and build metadata is not yet supported. */ bindingset[orig] -string normalizeSemVer(string orig) { - exists(string pattern, string major, string minor, string patch | - pattern = "v?(\\d+)\\.(\\d+)\\.(\\d+)(\\D.*)?" and - major = orig.regexpCapture(pattern, 1) and - minor = orig.regexpCapture(pattern, 2) and - patch = orig.regexpCapture(pattern, 3) - | - result = leftPad(major) + "." + leftPad(minor) + "." + leftPad(patch) - ) +string padSemVer(string orig, string major, string minor, string patch) { + major = getMajor(orig) and + ( + minor = getMinor(orig) + or + not exists(getMinor(orig)) and minor = "0" + ) and + ( + patch = getPatch(orig) + or + not exists(getPatch(orig)) and patch = "0" + ) and + result = leftPad(major) + "." + leftPad(minor) + "." + leftPad(patch) } + +/** + * Normalizes a SemVer string such that the lexicographical ordering + * of two normalized strings is consistent with the SemVer ordering. + * + * Pre-release information and build metadata is not yet supported. + */ +bindingset[orig] +string padSemVer(string orig) { result = padSemVer(orig, _, _, _) } From 703d68037c603445e1f033561acf801d6dd1925c Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Thu, 3 Sep 2026 15:29:55 +0200 Subject: [PATCH 0685/2098] Java: make JDK 11 version normalisation in gradle buildless test robust `java.version` may carry a fourth `$PATCH` component (JEP 322), as in Temurin `jdk-11.0.32.1+1`. The previous pattern matched exactly three components, so the trailing `.1` survived and the test reported `11.1`. Accept any number of version components, and anchor on the surrounding quotes so the substitution only rewrites a whole JSON string rather than version-like text elsewhere in the diagnostics. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../gradle-sample-without-wrapper-or-gradle-buildless/test.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/java/ql/integration-tests/java/gradle-sample-without-wrapper-or-gradle-buildless/test.py b/java/ql/integration-tests/java/gradle-sample-without-wrapper-or-gradle-buildless/test.py index 3aaee01f4055..a312878e107f 100644 --- a/java/ql/integration-tests/java/gradle-sample-without-wrapper-or-gradle-buildless/test.py +++ b/java/ql/integration-tests/java/gradle-sample-without-wrapper-or-gradle-buildless/test.py @@ -6,7 +6,9 @@ # The version of gradle used doesn't work on java 17 def test(codeql, use_java_11, java, environment, check_diagnostics): check_diagnostics.redact += ["attributes.java_vendor"] - check_diagnostics.replacements = [("11\\.[0-9]+\\.[0-9]+", "11")] + # the JDK build provided by the CI runner image may report any number of version components + # (e.g. `11.0.32` or `11.0.32.1`), so keep only the feature version + check_diagnostics.replacements = [(r'"11(\.[0-9]+)+"', '"11"')] gradle_override_dir = pathlib.Path(tempfile.mkdtemp()) if runs_on.windows: (gradle_override_dir / "gradle.bat").write_text("@echo off\nexit /b 2\n") From 6da0e6abd2b307319a997162bdf515915e8ba702 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Thu, 3 Sep 2026 10:39:24 -0400 Subject: [PATCH 0686/2098] chore: applies review suggestions Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- csharp/ql/lib/Linq/Helpers.qll | 1 + 1 file changed, 1 insertion(+) diff --git a/csharp/ql/lib/Linq/Helpers.qll b/csharp/ql/lib/Linq/Helpers.qll index 1be677e1a0b3..7516d3b2767b 100644 --- a/csharp/ql/lib/Linq/Helpers.qll +++ b/csharp/ql/lib/Linq/Helpers.qll @@ -225,6 +225,7 @@ predicate missedFirstOrDefaultOpportunity(ForeachStmtGenericEnumerable fes, IfSt not is.getCondition().getAChildExpr*() instanceof AwaitExpr and not fes.isAsync() and returnsLoopVariable(fes, is.getThen()) and +fes.getElementType() = fes.getVariable().getType() and returnsDefaultValueAfterForeach(fes) } From 22bfd1b6a45f168412125ab120cf6f20fb677f0a Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Tue, 1 Sep 2026 09:37:25 +0200 Subject: [PATCH 0687/2098] Rust: Add more `axum` tests --- .../TypeInferenceConsistency.expected | 6 +- .../web_frameworks/InlineFlow.expected | 208 ++++++++------- .../web_frameworks/TaintSources.expected | 248 +++++++++--------- .../dataflow/sources/web_frameworks/test.rs | 13 +- 4 files changed, 252 insertions(+), 223 deletions(-) diff --git a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/CONSISTENCY/TypeInferenceConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/CONSISTENCY/TypeInferenceConsistency.expected index f1bdb2cddbd6..d5b1af2b25cc 100644 --- a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/CONSISTENCY/TypeInferenceConsistency.expected +++ b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/CONSISTENCY/TypeInferenceConsistency.expected @@ -1,4 +1,4 @@ nonUniqueCertainType -| test.rs:131:30:131:39 | ...::get(...) | | -| test.rs:132:34:132:43 | ...::get(...) | | -| test.rs:133:30:133:39 | ...::get(...) | | +| test.rs:132:30:132:39 | ...::get(...) | | +| test.rs:133:34:133:43 | ...::get(...) | | +| test.rs:134:30:134:39 | ...::get(...) | | diff --git a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected index 965e0c004f88..5a992eb5a54e 100644 --- a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected @@ -39,40 +39,44 @@ edges | test.rs:107:22:107:25 | path | test.rs:107:22:107:38 | path.into_inner() | provenance | MaD:11 | | test.rs:107:22:107:38 | path.into_inner() | test.rs:107:13:107:18 | TuplePat | provenance | | | test.rs:115:33:115:65 | ...: ...::Query::<...> | test.rs:116:14:116:14 | a | provenance | | -| test.rs:122:14:122:31 | my_actix_handler_4 | test.rs:122:33:122:55 | ...: ...::Path::<...> | provenance | Src:MaD:1 | -| test.rs:122:33:122:55 | ...: ...::Path::<...> | test.rs:123:17:123:20 | path | provenance | | -| test.rs:123:13:123:13 | a | test.rs:124:14:124:14 | a | provenance | | -| test.rs:123:17:123:20 | path | test.rs:123:17:123:33 | path.into_inner() | provenance | MaD:11 | -| test.rs:123:17:123:33 | path.into_inner() | test.rs:123:13:123:13 | a | provenance | | -| test.rs:131:44:131:61 | my_actix_handler_1 | test.rs:97:33:97:55 | ...: ...::Path::<...> | provenance | Src:MaD:2 | -| test.rs:132:48:132:65 | my_actix_handler_2 | test.rs:106:33:106:65 | ...: ...::Path::<...> | provenance | Src:MaD:2 | -| test.rs:133:44:133:61 | my_actix_handler_3 | test.rs:115:33:115:65 | ...: ...::Query::<...> | provenance | Src:MaD:2 | -| test.rs:147:32:147:52 | ...: Path::<...> | test.rs:148:14:148:14 | a | provenance | | -| test.rs:147:32:147:52 | ...: Path::<...> | test.rs:149:14:149:14 | a | provenance | | -| test.rs:147:32:147:52 | ...: Path::<...> | test.rs:150:14:150:14 | a | provenance | | -| test.rs:148:14:148:14 | a | test.rs:148:14:148:23 | a.as_str() | provenance | MaD:13 | -| test.rs:149:14:149:14 | a | test.rs:149:14:149:25 | a.as_bytes() | provenance | MaD:12 | -| test.rs:155:32:155:67 | ...: Path::<...> | test.rs:156:14:156:14 | a | provenance | | -| test.rs:155:32:155:67 | ...: Path::<...> | test.rs:157:14:157:14 | b | provenance | | -| test.rs:162:32:162:76 | ...: Query::<...> | test.rs:164:18:164:20 | key | provenance | | -| test.rs:162:32:162:76 | ...: Query::<...> | test.rs:165:18:165:22 | value | provenance | | -| test.rs:179:32:179:69 | ...: Json::<...> | test.rs:181:14:181:20 | payload | provenance | | -| test.rs:186:32:186:43 | ...: String | test.rs:187:14:187:17 | body | provenance | | -| test.rs:192:32:192:43 | ...: String | test.rs:193:14:193:17 | body | provenance | | -| test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:147:32:147:52 | ...: Path::<...> | provenance | Src:MaD:8 | -| test.rs:201:39:201:55 | my_axum_handler_2 | test.rs:155:32:155:67 | ...: Path::<...> | provenance | Src:MaD:9 | -| test.rs:202:33:202:49 | my_axum_handler_3 | test.rs:162:32:162:76 | ...: Query::<...> | provenance | Src:MaD:10 | -| test.rs:205:65:205:81 | my_axum_handler_5 | test.rs:179:32:179:69 | ...: Json::<...> | provenance | Src:MaD:4 | -| test.rs:207:33:207:49 | my_axum_handler_6 | test.rs:186:32:186:43 | ...: String | provenance | Src:MaD:8 | -| test.rs:207:56:207:72 | my_axum_handler_7 | test.rs:192:32:192:43 | ...: String | provenance | Src:MaD:3 | -| test.rs:222:37:227:9 | \|...\| ... | test.rs:222:38:222:46 | ...: String | provenance | Src:MaD:6 | -| test.rs:222:38:222:46 | ...: String | test.rs:224:18:224:18 | a | provenance | | -| test.rs:231:13:235:13 | \|...\| ... | test.rs:231:25:231:33 | ...: String | provenance | Src:MaD:7 | -| test.rs:231:25:231:33 | ...: String | test.rs:232:22:232:22 | a | provenance | | -| test.rs:240:13:248:9 | \|...\| ... | test.rs:240:26:240:32 | ...: u64 | provenance | Src:MaD:5 | -| test.rs:240:26:240:32 | ...: u64 | test.rs:243:22:243:23 | id | provenance | | -| test.rs:253:13:258:14 | \|...\| ... | test.rs:253:15:253:23 | ...: String | provenance | Src:MaD:6 | -| test.rs:253:15:253:23 | ...: String | test.rs:255:22:255:22 | a | provenance | | +| test.rs:123:14:123:31 | my_actix_handler_4 | test.rs:123:33:123:55 | ...: ...::Path::<...> | provenance | Src:MaD:1 | +| test.rs:123:33:123:55 | ...: ...::Path::<...> | test.rs:124:17:124:20 | path | provenance | | +| test.rs:124:13:124:13 | a | test.rs:125:14:125:14 | a | provenance | | +| test.rs:124:17:124:20 | path | test.rs:124:17:124:33 | path.into_inner() | provenance | MaD:11 | +| test.rs:124:17:124:33 | path.into_inner() | test.rs:124:13:124:13 | a | provenance | | +| test.rs:132:44:132:61 | my_actix_handler_1 | test.rs:97:33:97:55 | ...: ...::Path::<...> | provenance | Src:MaD:2 | +| test.rs:133:48:133:65 | my_actix_handler_2 | test.rs:106:33:106:65 | ...: ...::Path::<...> | provenance | Src:MaD:2 | +| test.rs:134:44:134:61 | my_actix_handler_3 | test.rs:115:33:115:65 | ...: ...::Query::<...> | provenance | Src:MaD:2 | +| test.rs:148:32:148:52 | ...: Path::<...> | test.rs:149:14:149:14 | a | provenance | | +| test.rs:148:32:148:52 | ...: Path::<...> | test.rs:150:14:150:14 | a | provenance | | +| test.rs:148:32:148:52 | ...: Path::<...> | test.rs:151:14:151:14 | a | provenance | | +| test.rs:149:14:149:14 | a | test.rs:149:14:149:23 | a.as_str() | provenance | MaD:13 | +| test.rs:150:14:150:14 | a | test.rs:150:14:150:25 | a.as_bytes() | provenance | MaD:12 | +| test.rs:156:32:156:67 | ...: Path::<...> | test.rs:157:14:157:14 | a | provenance | | +| test.rs:156:32:156:67 | ...: Path::<...> | test.rs:158:14:158:14 | b | provenance | | +| test.rs:163:32:163:76 | ...: Query::<...> | test.rs:165:18:165:20 | key | provenance | | +| test.rs:163:32:163:76 | ...: Query::<...> | test.rs:166:18:166:22 | value | provenance | | +| test.rs:180:32:180:69 | ...: Json::<...> | test.rs:182:14:182:20 | payload | provenance | | +| test.rs:187:32:187:43 | ...: String | test.rs:188:14:188:17 | body | provenance | | +| test.rs:193:32:193:43 | ...: String | test.rs:194:14:194:17 | body | provenance | | +| test.rs:199:32:199:47 | ...: State::<...> | test.rs:200:14:200:20 | state.0 | provenance | | +| test.rs:199:50:199:61 | ...: String | test.rs:201:14:201:17 | body | provenance | | +| test.rs:208:34:208:50 | my_axum_handler_1 | test.rs:148:32:148:52 | ...: Path::<...> | provenance | Src:MaD:8 | +| test.rs:209:39:209:55 | my_axum_handler_2 | test.rs:156:32:156:67 | ...: Path::<...> | provenance | Src:MaD:9 | +| test.rs:210:33:210:49 | my_axum_handler_3 | test.rs:163:32:163:76 | ...: Query::<...> | provenance | Src:MaD:10 | +| test.rs:213:65:213:81 | my_axum_handler_5 | test.rs:180:32:180:69 | ...: Json::<...> | provenance | Src:MaD:4 | +| test.rs:215:33:215:49 | my_axum_handler_6 | test.rs:187:32:187:43 | ...: String | provenance | Src:MaD:8 | +| test.rs:215:56:215:72 | my_axum_handler_7 | test.rs:193:32:193:43 | ...: String | provenance | Src:MaD:3 | +| test.rs:216:33:216:49 | my_axum_handler_8 | test.rs:199:32:199:47 | ...: State::<...> | provenance | Src:MaD:8 | +| test.rs:216:33:216:49 | my_axum_handler_8 | test.rs:199:50:199:61 | ...: String | provenance | Src:MaD:8 | +| test.rs:231:37:236:9 | \|...\| ... | test.rs:231:38:231:46 | ...: String | provenance | Src:MaD:6 | +| test.rs:231:38:231:46 | ...: String | test.rs:233:18:233:18 | a | provenance | | +| test.rs:240:13:244:13 | \|...\| ... | test.rs:240:25:240:33 | ...: String | provenance | Src:MaD:7 | +| test.rs:240:25:240:33 | ...: String | test.rs:241:22:241:22 | a | provenance | | +| test.rs:249:13:257:9 | \|...\| ... | test.rs:249:26:249:32 | ...: u64 | provenance | Src:MaD:5 | +| test.rs:249:26:249:32 | ...: u64 | test.rs:252:22:252:23 | id | provenance | | +| test.rs:262:13:267:14 | \|...\| ... | test.rs:262:15:262:23 | ...: String | provenance | Src:MaD:6 | +| test.rs:262:15:262:23 | ...: String | test.rs:264:22:264:22 | a | provenance | | nodes | test.rs:11:31:11:31 | a | semmle.label | a | | test.rs:13:14:13:14 | a | semmle.label | a | @@ -108,51 +112,57 @@ nodes | test.rs:110:14:110:14 | b | semmle.label | b | | test.rs:115:33:115:65 | ...: ...::Query::<...> | semmle.label | ...: ...::Query::<...> | | test.rs:116:14:116:14 | a | semmle.label | a | -| test.rs:122:14:122:31 | my_actix_handler_4 | semmle.label | my_actix_handler_4 | -| test.rs:122:33:122:55 | ...: ...::Path::<...> | semmle.label | ...: ...::Path::<...> | -| test.rs:123:13:123:13 | a | semmle.label | a | -| test.rs:123:17:123:20 | path | semmle.label | path | -| test.rs:123:17:123:33 | path.into_inner() | semmle.label | path.into_inner() | -| test.rs:124:14:124:14 | a | semmle.label | a | -| test.rs:131:44:131:61 | my_actix_handler_1 | semmle.label | my_actix_handler_1 | -| test.rs:132:48:132:65 | my_actix_handler_2 | semmle.label | my_actix_handler_2 | -| test.rs:133:44:133:61 | my_actix_handler_3 | semmle.label | my_actix_handler_3 | -| test.rs:147:32:147:52 | ...: Path::<...> | semmle.label | ...: Path::<...> | -| test.rs:148:14:148:14 | a | semmle.label | a | -| test.rs:148:14:148:23 | a.as_str() | semmle.label | a.as_str() | +| test.rs:123:14:123:31 | my_actix_handler_4 | semmle.label | my_actix_handler_4 | +| test.rs:123:33:123:55 | ...: ...::Path::<...> | semmle.label | ...: ...::Path::<...> | +| test.rs:124:13:124:13 | a | semmle.label | a | +| test.rs:124:17:124:20 | path | semmle.label | path | +| test.rs:124:17:124:33 | path.into_inner() | semmle.label | path.into_inner() | +| test.rs:125:14:125:14 | a | semmle.label | a | +| test.rs:132:44:132:61 | my_actix_handler_1 | semmle.label | my_actix_handler_1 | +| test.rs:133:48:133:65 | my_actix_handler_2 | semmle.label | my_actix_handler_2 | +| test.rs:134:44:134:61 | my_actix_handler_3 | semmle.label | my_actix_handler_3 | +| test.rs:148:32:148:52 | ...: Path::<...> | semmle.label | ...: Path::<...> | | test.rs:149:14:149:14 | a | semmle.label | a | -| test.rs:149:14:149:25 | a.as_bytes() | semmle.label | a.as_bytes() | +| test.rs:149:14:149:23 | a.as_str() | semmle.label | a.as_str() | | test.rs:150:14:150:14 | a | semmle.label | a | -| test.rs:155:32:155:67 | ...: Path::<...> | semmle.label | ...: Path::<...> | -| test.rs:156:14:156:14 | a | semmle.label | a | -| test.rs:157:14:157:14 | b | semmle.label | b | -| test.rs:162:32:162:76 | ...: Query::<...> | semmle.label | ...: Query::<...> | -| test.rs:164:18:164:20 | key | semmle.label | key | -| test.rs:165:18:165:22 | value | semmle.label | value | -| test.rs:179:32:179:69 | ...: Json::<...> | semmle.label | ...: Json::<...> | -| test.rs:181:14:181:20 | payload | semmle.label | payload | -| test.rs:186:32:186:43 | ...: String | semmle.label | ...: String | -| test.rs:187:14:187:17 | body | semmle.label | body | -| test.rs:192:32:192:43 | ...: String | semmle.label | ...: String | -| test.rs:193:14:193:17 | body | semmle.label | body | -| test.rs:200:34:200:50 | my_axum_handler_1 | semmle.label | my_axum_handler_1 | -| test.rs:201:39:201:55 | my_axum_handler_2 | semmle.label | my_axum_handler_2 | -| test.rs:202:33:202:49 | my_axum_handler_3 | semmle.label | my_axum_handler_3 | -| test.rs:205:65:205:81 | my_axum_handler_5 | semmle.label | my_axum_handler_5 | -| test.rs:207:33:207:49 | my_axum_handler_6 | semmle.label | my_axum_handler_6 | -| test.rs:207:56:207:72 | my_axum_handler_7 | semmle.label | my_axum_handler_7 | -| test.rs:222:37:227:9 | \|...\| ... | semmle.label | \|...\| ... | -| test.rs:222:38:222:46 | ...: String | semmle.label | ...: String | -| test.rs:224:18:224:18 | a | semmle.label | a | -| test.rs:231:13:235:13 | \|...\| ... | semmle.label | \|...\| ... | -| test.rs:231:25:231:33 | ...: String | semmle.label | ...: String | -| test.rs:232:22:232:22 | a | semmle.label | a | -| test.rs:240:13:248:9 | \|...\| ... | semmle.label | \|...\| ... | -| test.rs:240:26:240:32 | ...: u64 | semmle.label | ...: u64 | -| test.rs:243:22:243:23 | id | semmle.label | id | -| test.rs:253:13:258:14 | \|...\| ... | semmle.label | \|...\| ... | -| test.rs:253:15:253:23 | ...: String | semmle.label | ...: String | -| test.rs:255:22:255:22 | a | semmle.label | a | +| test.rs:150:14:150:25 | a.as_bytes() | semmle.label | a.as_bytes() | +| test.rs:151:14:151:14 | a | semmle.label | a | +| test.rs:156:32:156:67 | ...: Path::<...> | semmle.label | ...: Path::<...> | +| test.rs:157:14:157:14 | a | semmle.label | a | +| test.rs:158:14:158:14 | b | semmle.label | b | +| test.rs:163:32:163:76 | ...: Query::<...> | semmle.label | ...: Query::<...> | +| test.rs:165:18:165:20 | key | semmle.label | key | +| test.rs:166:18:166:22 | value | semmle.label | value | +| test.rs:180:32:180:69 | ...: Json::<...> | semmle.label | ...: Json::<...> | +| test.rs:182:14:182:20 | payload | semmle.label | payload | +| test.rs:187:32:187:43 | ...: String | semmle.label | ...: String | +| test.rs:188:14:188:17 | body | semmle.label | body | +| test.rs:193:32:193:43 | ...: String | semmle.label | ...: String | +| test.rs:194:14:194:17 | body | semmle.label | body | +| test.rs:199:32:199:47 | ...: State::<...> | semmle.label | ...: State::<...> | +| test.rs:199:50:199:61 | ...: String | semmle.label | ...: String | +| test.rs:200:14:200:20 | state.0 | semmle.label | state.0 | +| test.rs:201:14:201:17 | body | semmle.label | body | +| test.rs:208:34:208:50 | my_axum_handler_1 | semmle.label | my_axum_handler_1 | +| test.rs:209:39:209:55 | my_axum_handler_2 | semmle.label | my_axum_handler_2 | +| test.rs:210:33:210:49 | my_axum_handler_3 | semmle.label | my_axum_handler_3 | +| test.rs:213:65:213:81 | my_axum_handler_5 | semmle.label | my_axum_handler_5 | +| test.rs:215:33:215:49 | my_axum_handler_6 | semmle.label | my_axum_handler_6 | +| test.rs:215:56:215:72 | my_axum_handler_7 | semmle.label | my_axum_handler_7 | +| test.rs:216:33:216:49 | my_axum_handler_8 | semmle.label | my_axum_handler_8 | +| test.rs:216:33:216:49 | my_axum_handler_8 | semmle.label | my_axum_handler_8 | +| test.rs:231:37:236:9 | \|...\| ... | semmle.label | \|...\| ... | +| test.rs:231:38:231:46 | ...: String | semmle.label | ...: String | +| test.rs:233:18:233:18 | a | semmle.label | a | +| test.rs:240:13:244:13 | \|...\| ... | semmle.label | \|...\| ... | +| test.rs:240:25:240:33 | ...: String | semmle.label | ...: String | +| test.rs:241:22:241:22 | a | semmle.label | a | +| test.rs:249:13:257:9 | \|...\| ... | semmle.label | \|...\| ... | +| test.rs:249:26:249:32 | ...: u64 | semmle.label | ...: u64 | +| test.rs:252:22:252:23 | id | semmle.label | id | +| test.rs:262:13:267:14 | \|...\| ... | semmle.label | \|...\| ... | +| test.rs:262:15:262:23 | ...: String | semmle.label | ...: String | +| test.rs:264:22:264:22 | a | semmle.label | a | subpaths testFailures #select @@ -166,24 +176,26 @@ testFailures | test.rs:60:14:60:17 | ms.a | test.rs:58:14:58:15 | ms | test.rs:60:14:60:17 | ms.a | $@ | test.rs:58:14:58:15 | ms | ms | | test.rs:61:14:61:17 | ms.b | test.rs:58:14:58:15 | ms | test.rs:61:14:61:17 | ms.b | $@ | test.rs:58:14:58:15 | ms | ms | | test.rs:70:14:70:14 | a | test.rs:68:15:68:15 | a | test.rs:70:14:70:14 | a | $@ | test.rs:68:15:68:15 | a | a | -| test.rs:99:14:99:23 | a.as_str() | test.rs:131:44:131:61 | my_actix_handler_1 | test.rs:99:14:99:23 | a.as_str() | $@ | test.rs:131:44:131:61 | my_actix_handler_1 | my_actix_handler_1 | -| test.rs:100:14:100:25 | a.as_bytes() | test.rs:131:44:131:61 | my_actix_handler_1 | test.rs:100:14:100:25 | a.as_bytes() | $@ | test.rs:131:44:131:61 | my_actix_handler_1 | my_actix_handler_1 | -| test.rs:101:14:101:14 | a | test.rs:131:44:131:61 | my_actix_handler_1 | test.rs:101:14:101:14 | a | $@ | test.rs:131:44:131:61 | my_actix_handler_1 | my_actix_handler_1 | -| test.rs:109:14:109:14 | a | test.rs:132:48:132:65 | my_actix_handler_2 | test.rs:109:14:109:14 | a | $@ | test.rs:132:48:132:65 | my_actix_handler_2 | my_actix_handler_2 | -| test.rs:110:14:110:14 | b | test.rs:132:48:132:65 | my_actix_handler_2 | test.rs:110:14:110:14 | b | $@ | test.rs:132:48:132:65 | my_actix_handler_2 | my_actix_handler_2 | -| test.rs:116:14:116:14 | a | test.rs:133:44:133:61 | my_actix_handler_3 | test.rs:116:14:116:14 | a | $@ | test.rs:133:44:133:61 | my_actix_handler_3 | my_actix_handler_3 | -| test.rs:124:14:124:14 | a | test.rs:122:14:122:31 | my_actix_handler_4 | test.rs:124:14:124:14 | a | $@ | test.rs:122:14:122:31 | my_actix_handler_4 | my_actix_handler_4 | -| test.rs:148:14:148:23 | a.as_str() | test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:148:14:148:23 | a.as_str() | $@ | test.rs:200:34:200:50 | my_axum_handler_1 | my_axum_handler_1 | -| test.rs:149:14:149:25 | a.as_bytes() | test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:149:14:149:25 | a.as_bytes() | $@ | test.rs:200:34:200:50 | my_axum_handler_1 | my_axum_handler_1 | -| test.rs:150:14:150:14 | a | test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:150:14:150:14 | a | $@ | test.rs:200:34:200:50 | my_axum_handler_1 | my_axum_handler_1 | -| test.rs:156:14:156:14 | a | test.rs:201:39:201:55 | my_axum_handler_2 | test.rs:156:14:156:14 | a | $@ | test.rs:201:39:201:55 | my_axum_handler_2 | my_axum_handler_2 | -| test.rs:157:14:157:14 | b | test.rs:201:39:201:55 | my_axum_handler_2 | test.rs:157:14:157:14 | b | $@ | test.rs:201:39:201:55 | my_axum_handler_2 | my_axum_handler_2 | -| test.rs:164:18:164:20 | key | test.rs:202:33:202:49 | my_axum_handler_3 | test.rs:164:18:164:20 | key | $@ | test.rs:202:33:202:49 | my_axum_handler_3 | my_axum_handler_3 | -| test.rs:165:18:165:22 | value | test.rs:202:33:202:49 | my_axum_handler_3 | test.rs:165:18:165:22 | value | $@ | test.rs:202:33:202:49 | my_axum_handler_3 | my_axum_handler_3 | -| test.rs:181:14:181:20 | payload | test.rs:205:65:205:81 | my_axum_handler_5 | test.rs:181:14:181:20 | payload | $@ | test.rs:205:65:205:81 | my_axum_handler_5 | my_axum_handler_5 | -| test.rs:187:14:187:17 | body | test.rs:207:33:207:49 | my_axum_handler_6 | test.rs:187:14:187:17 | body | $@ | test.rs:207:33:207:49 | my_axum_handler_6 | my_axum_handler_6 | -| test.rs:193:14:193:17 | body | test.rs:207:56:207:72 | my_axum_handler_7 | test.rs:193:14:193:17 | body | $@ | test.rs:207:56:207:72 | my_axum_handler_7 | my_axum_handler_7 | -| test.rs:224:18:224:18 | a | test.rs:222:37:227:9 | \|...\| ... | test.rs:224:18:224:18 | a | $@ | test.rs:222:37:227:9 | \|...\| ... | \|...\| ... | -| test.rs:232:22:232:22 | a | test.rs:231:13:235:13 | \|...\| ... | test.rs:232:22:232:22 | a | $@ | test.rs:231:13:235:13 | \|...\| ... | \|...\| ... | -| test.rs:243:22:243:23 | id | test.rs:240:13:248:9 | \|...\| ... | test.rs:243:22:243:23 | id | $@ | test.rs:240:13:248:9 | \|...\| ... | \|...\| ... | -| test.rs:255:22:255:22 | a | test.rs:253:13:258:14 | \|...\| ... | test.rs:255:22:255:22 | a | $@ | test.rs:253:13:258:14 | \|...\| ... | \|...\| ... | +| test.rs:99:14:99:23 | a.as_str() | test.rs:132:44:132:61 | my_actix_handler_1 | test.rs:99:14:99:23 | a.as_str() | $@ | test.rs:132:44:132:61 | my_actix_handler_1 | my_actix_handler_1 | +| test.rs:100:14:100:25 | a.as_bytes() | test.rs:132:44:132:61 | my_actix_handler_1 | test.rs:100:14:100:25 | a.as_bytes() | $@ | test.rs:132:44:132:61 | my_actix_handler_1 | my_actix_handler_1 | +| test.rs:101:14:101:14 | a | test.rs:132:44:132:61 | my_actix_handler_1 | test.rs:101:14:101:14 | a | $@ | test.rs:132:44:132:61 | my_actix_handler_1 | my_actix_handler_1 | +| test.rs:109:14:109:14 | a | test.rs:133:48:133:65 | my_actix_handler_2 | test.rs:109:14:109:14 | a | $@ | test.rs:133:48:133:65 | my_actix_handler_2 | my_actix_handler_2 | +| test.rs:110:14:110:14 | b | test.rs:133:48:133:65 | my_actix_handler_2 | test.rs:110:14:110:14 | b | $@ | test.rs:133:48:133:65 | my_actix_handler_2 | my_actix_handler_2 | +| test.rs:116:14:116:14 | a | test.rs:134:44:134:61 | my_actix_handler_3 | test.rs:116:14:116:14 | a | $@ | test.rs:134:44:134:61 | my_actix_handler_3 | my_actix_handler_3 | +| test.rs:125:14:125:14 | a | test.rs:123:14:123:31 | my_actix_handler_4 | test.rs:125:14:125:14 | a | $@ | test.rs:123:14:123:31 | my_actix_handler_4 | my_actix_handler_4 | +| test.rs:149:14:149:23 | a.as_str() | test.rs:208:34:208:50 | my_axum_handler_1 | test.rs:149:14:149:23 | a.as_str() | $@ | test.rs:208:34:208:50 | my_axum_handler_1 | my_axum_handler_1 | +| test.rs:150:14:150:25 | a.as_bytes() | test.rs:208:34:208:50 | my_axum_handler_1 | test.rs:150:14:150:25 | a.as_bytes() | $@ | test.rs:208:34:208:50 | my_axum_handler_1 | my_axum_handler_1 | +| test.rs:151:14:151:14 | a | test.rs:208:34:208:50 | my_axum_handler_1 | test.rs:151:14:151:14 | a | $@ | test.rs:208:34:208:50 | my_axum_handler_1 | my_axum_handler_1 | +| test.rs:157:14:157:14 | a | test.rs:209:39:209:55 | my_axum_handler_2 | test.rs:157:14:157:14 | a | $@ | test.rs:209:39:209:55 | my_axum_handler_2 | my_axum_handler_2 | +| test.rs:158:14:158:14 | b | test.rs:209:39:209:55 | my_axum_handler_2 | test.rs:158:14:158:14 | b | $@ | test.rs:209:39:209:55 | my_axum_handler_2 | my_axum_handler_2 | +| test.rs:165:18:165:20 | key | test.rs:210:33:210:49 | my_axum_handler_3 | test.rs:165:18:165:20 | key | $@ | test.rs:210:33:210:49 | my_axum_handler_3 | my_axum_handler_3 | +| test.rs:166:18:166:22 | value | test.rs:210:33:210:49 | my_axum_handler_3 | test.rs:166:18:166:22 | value | $@ | test.rs:210:33:210:49 | my_axum_handler_3 | my_axum_handler_3 | +| test.rs:182:14:182:20 | payload | test.rs:213:65:213:81 | my_axum_handler_5 | test.rs:182:14:182:20 | payload | $@ | test.rs:213:65:213:81 | my_axum_handler_5 | my_axum_handler_5 | +| test.rs:188:14:188:17 | body | test.rs:215:33:215:49 | my_axum_handler_6 | test.rs:188:14:188:17 | body | $@ | test.rs:215:33:215:49 | my_axum_handler_6 | my_axum_handler_6 | +| test.rs:194:14:194:17 | body | test.rs:215:56:215:72 | my_axum_handler_7 | test.rs:194:14:194:17 | body | $@ | test.rs:215:56:215:72 | my_axum_handler_7 | my_axum_handler_7 | +| test.rs:200:14:200:20 | state.0 | test.rs:216:33:216:49 | my_axum_handler_8 | test.rs:200:14:200:20 | state.0 | $@ | test.rs:216:33:216:49 | my_axum_handler_8 | my_axum_handler_8 | +| test.rs:201:14:201:17 | body | test.rs:216:33:216:49 | my_axum_handler_8 | test.rs:201:14:201:17 | body | $@ | test.rs:216:33:216:49 | my_axum_handler_8 | my_axum_handler_8 | +| test.rs:233:18:233:18 | a | test.rs:231:37:236:9 | \|...\| ... | test.rs:233:18:233:18 | a | $@ | test.rs:231:37:236:9 | \|...\| ... | \|...\| ... | +| test.rs:241:22:241:22 | a | test.rs:240:13:244:13 | \|...\| ... | test.rs:241:22:241:22 | a | $@ | test.rs:240:13:244:13 | \|...\| ... | \|...\| ... | +| test.rs:252:22:252:23 | id | test.rs:249:13:257:9 | \|...\| ... | test.rs:252:22:252:23 | id | $@ | test.rs:249:13:257:9 | \|...\| ... | \|...\| ... | +| test.rs:264:22:264:22 | a | test.rs:262:13:267:14 | \|...\| ... | test.rs:264:22:264:22 | a | $@ | test.rs:262:13:267:14 | \|...\| ... | \|...\| ... | diff --git a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/TaintSources.expected b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/TaintSources.expected index 456ec4949bbe..ede8cb0d4ad0 100644 --- a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/TaintSources.expected +++ b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/TaintSources.expected @@ -3,123 +3,131 @@ | test.rs:48:14:48:30 | MyStruct {...} | Flow source 'RemoteSource' of type remote (DEFAULT). | | test.rs:58:14:58:15 | ms | Flow source 'RemoteSource' of type remote (DEFAULT). | | test.rs:68:15:68:15 | a | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:122:14:122:31 | my_actix_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:122:14:122:31 | my_actix_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:122:14:122:31 | my_actix_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:122:14:122:31 | my_actix_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:122:14:122:31 | my_actix_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:122:14:122:31 | my_actix_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:122:14:122:31 | my_actix_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:122:14:122:31 | my_actix_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:131:44:131:61 | my_actix_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:131:44:131:61 | my_actix_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:131:44:131:61 | my_actix_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:131:44:131:61 | my_actix_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:131:44:131:61 | my_actix_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:131:44:131:61 | my_actix_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:131:44:131:61 | my_actix_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:131:44:131:61 | my_actix_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:132:48:132:65 | my_actix_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:132:48:132:65 | my_actix_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:132:48:132:65 | my_actix_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:132:48:132:65 | my_actix_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:132:48:132:65 | my_actix_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:132:48:132:65 | my_actix_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:132:48:132:65 | my_actix_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:132:48:132:65 | my_actix_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:133:44:133:61 | my_actix_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:133:44:133:61 | my_actix_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:133:44:133:61 | my_actix_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:133:44:133:61 | my_actix_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:133:44:133:61 | my_actix_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:133:44:133:61 | my_actix_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:133:44:133:61 | my_actix_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:133:44:133:61 | my_actix_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:200:34:200:50 | my_axum_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:200:34:200:50 | my_axum_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:200:34:200:50 | my_axum_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:200:34:200:50 | my_axum_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:200:34:200:50 | my_axum_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:200:34:200:50 | my_axum_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:200:34:200:50 | my_axum_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:200:34:200:50 | my_axum_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:201:39:201:55 | my_axum_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:201:39:201:55 | my_axum_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:201:39:201:55 | my_axum_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:201:39:201:55 | my_axum_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:201:39:201:55 | my_axum_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:201:39:201:55 | my_axum_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:201:39:201:55 | my_axum_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:201:39:201:55 | my_axum_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:202:33:202:49 | my_axum_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:202:33:202:49 | my_axum_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:202:33:202:49 | my_axum_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:202:33:202:49 | my_axum_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:202:33:202:49 | my_axum_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:202:33:202:49 | my_axum_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:202:33:202:49 | my_axum_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:202:33:202:49 | my_axum_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:21:205:37 | my_axum_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:21:205:37 | my_axum_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:21:205:37 | my_axum_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:21:205:37 | my_axum_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:21:205:37 | my_axum_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:21:205:37 | my_axum_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:21:205:37 | my_axum_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:21:205:37 | my_axum_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:65:205:81 | my_axum_handler_5 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:65:205:81 | my_axum_handler_5 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:65:205:81 | my_axum_handler_5 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:65:205:81 | my_axum_handler_5 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:65:205:81 | my_axum_handler_5 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:65:205:81 | my_axum_handler_5 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:65:205:81 | my_axum_handler_5 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:205:65:205:81 | my_axum_handler_5 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:33:207:49 | my_axum_handler_6 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:33:207:49 | my_axum_handler_6 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:33:207:49 | my_axum_handler_6 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:33:207:49 | my_axum_handler_6 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:33:207:49 | my_axum_handler_6 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:33:207:49 | my_axum_handler_6 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:33:207:49 | my_axum_handler_6 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:33:207:49 | my_axum_handler_6 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:56:207:72 | my_axum_handler_7 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:56:207:72 | my_axum_handler_7 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:56:207:72 | my_axum_handler_7 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:56:207:72 | my_axum_handler_7 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:56:207:72 | my_axum_handler_7 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:56:207:72 | my_axum_handler_7 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:56:207:72 | my_axum_handler_7 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:207:56:207:72 | my_axum_handler_7 | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:222:37:227:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:222:37:227:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:222:37:227:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:222:37:227:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:222:37:227:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:222:37:227:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:222:37:227:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:222:37:227:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:231:13:235:13 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:231:13:235:13 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:231:13:235:13 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:231:13:235:13 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:231:13:235:13 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:231:13:235:13 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:231:13:235:13 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:231:13:235:13 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:240:13:248:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:240:13:248:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:240:13:248:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:240:13:248:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:240:13:248:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:240:13:248:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:240:13:248:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:240:13:248:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:253:13:258:14 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:253:13:258:14 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:253:13:258:14 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:253:13:258:14 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:253:13:258:14 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:253:13:258:14 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:253:13:258:14 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | -| test.rs:253:13:258:14 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:123:14:123:31 | my_actix_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:123:14:123:31 | my_actix_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:123:14:123:31 | my_actix_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:123:14:123:31 | my_actix_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:123:14:123:31 | my_actix_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:123:14:123:31 | my_actix_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:123:14:123:31 | my_actix_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:123:14:123:31 | my_actix_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:132:44:132:61 | my_actix_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:132:44:132:61 | my_actix_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:132:44:132:61 | my_actix_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:132:44:132:61 | my_actix_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:132:44:132:61 | my_actix_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:132:44:132:61 | my_actix_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:132:44:132:61 | my_actix_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:132:44:132:61 | my_actix_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:133:48:133:65 | my_actix_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:133:48:133:65 | my_actix_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:133:48:133:65 | my_actix_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:133:48:133:65 | my_actix_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:133:48:133:65 | my_actix_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:133:48:133:65 | my_actix_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:133:48:133:65 | my_actix_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:133:48:133:65 | my_actix_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:134:44:134:61 | my_actix_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:134:44:134:61 | my_actix_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:134:44:134:61 | my_actix_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:134:44:134:61 | my_actix_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:134:44:134:61 | my_actix_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:134:44:134:61 | my_actix_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:134:44:134:61 | my_actix_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:134:44:134:61 | my_actix_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:208:34:208:50 | my_axum_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:208:34:208:50 | my_axum_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:208:34:208:50 | my_axum_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:208:34:208:50 | my_axum_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:208:34:208:50 | my_axum_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:208:34:208:50 | my_axum_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:208:34:208:50 | my_axum_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:208:34:208:50 | my_axum_handler_1 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:209:39:209:55 | my_axum_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:209:39:209:55 | my_axum_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:209:39:209:55 | my_axum_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:209:39:209:55 | my_axum_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:209:39:209:55 | my_axum_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:209:39:209:55 | my_axum_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:209:39:209:55 | my_axum_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:209:39:209:55 | my_axum_handler_2 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:210:33:210:49 | my_axum_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:210:33:210:49 | my_axum_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:210:33:210:49 | my_axum_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:210:33:210:49 | my_axum_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:210:33:210:49 | my_axum_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:210:33:210:49 | my_axum_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:210:33:210:49 | my_axum_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:210:33:210:49 | my_axum_handler_3 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:213:21:213:37 | my_axum_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:213:21:213:37 | my_axum_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:213:21:213:37 | my_axum_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:213:21:213:37 | my_axum_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:213:21:213:37 | my_axum_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:213:21:213:37 | my_axum_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:213:21:213:37 | my_axum_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:213:21:213:37 | my_axum_handler_4 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:213:65:213:81 | my_axum_handler_5 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:213:65:213:81 | my_axum_handler_5 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:213:65:213:81 | my_axum_handler_5 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:213:65:213:81 | my_axum_handler_5 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:213:65:213:81 | my_axum_handler_5 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:213:65:213:81 | my_axum_handler_5 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:213:65:213:81 | my_axum_handler_5 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:213:65:213:81 | my_axum_handler_5 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:215:33:215:49 | my_axum_handler_6 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:215:33:215:49 | my_axum_handler_6 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:215:33:215:49 | my_axum_handler_6 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:215:33:215:49 | my_axum_handler_6 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:215:33:215:49 | my_axum_handler_6 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:215:33:215:49 | my_axum_handler_6 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:215:33:215:49 | my_axum_handler_6 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:215:33:215:49 | my_axum_handler_6 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:215:56:215:72 | my_axum_handler_7 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:215:56:215:72 | my_axum_handler_7 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:215:56:215:72 | my_axum_handler_7 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:215:56:215:72 | my_axum_handler_7 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:215:56:215:72 | my_axum_handler_7 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:215:56:215:72 | my_axum_handler_7 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:215:56:215:72 | my_axum_handler_7 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:215:56:215:72 | my_axum_handler_7 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:216:33:216:49 | my_axum_handler_8 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:216:33:216:49 | my_axum_handler_8 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:216:33:216:49 | my_axum_handler_8 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:216:33:216:49 | my_axum_handler_8 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:216:33:216:49 | my_axum_handler_8 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:216:33:216:49 | my_axum_handler_8 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:216:33:216:49 | my_axum_handler_8 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:216:33:216:49 | my_axum_handler_8 | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:231:37:236:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:231:37:236:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:231:37:236:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:231:37:236:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:231:37:236:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:231:37:236:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:231:37:236:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:231:37:236:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:240:13:244:13 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:240:13:244:13 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:240:13:244:13 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:240:13:244:13 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:240:13:244:13 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:240:13:244:13 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:240:13:244:13 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:240:13:244:13 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:249:13:257:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:249:13:257:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:249:13:257:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:249:13:257:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:249:13:257:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:249:13:257:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:249:13:257:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:249:13:257:9 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:262:13:267:14 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:262:13:267:14 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:262:13:267:14 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:262:13:267:14 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:262:13:267:14 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:262:13:267:14 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:262:13:267:14 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | +| test.rs:262:13:267:14 | \|...\| ... | Flow source 'RemoteSource' of type remote (DEFAULT). | diff --git a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/test.rs b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/test.rs index ab9f129dddbe..96fb7dc1b8d9 100644 --- a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/test.rs +++ b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/test.rs @@ -118,6 +118,7 @@ mod actix_test { "".to_string() } + #[rustfmt::skip] #[get("/4/{a}")] async fn my_actix_handler_4(path: web::Path) -> String { // $ Alert[rust/summary/taint-sources] let a = path.into_inner(); @@ -139,7 +140,7 @@ mod actix_test { mod axum_test { use super::sink; - use axum::extract::{Json, Path, Query, Request}; + use axum::extract::{Json, Path, Query, Request, State}; use axum::routing::{get, post, put, MethodFilter}; use axum::Router; use std::collections::HashMap; @@ -195,6 +196,13 @@ mod axum_test { "" } + async fn my_axum_handler_8(state: State<()>, body: String) -> &'static str { + sink(state.0); // $ SPURIOUS: hasTaintFlow=my_axum_handler_8 + sink(body); // $ hasTaintFlow=my_axum_handler_8 + + "" + } + async fn test_axum() { let app = Router::<()>::new() .route("/1/{a}", get(my_axum_handler_1)) // $ Alert[rust/summary/taint-sources]) @@ -204,7 +212,8 @@ mod axum_test { "/4/:a", get(my_axum_handler_4).on(MethodFilter::DELETE, my_axum_handler_5), // $ Alert[rust/summary/taint-sources]) ) - .route("/5/:a", get(my_axum_handler_6).get(my_axum_handler_7)); // $ Alert[rust/summary/taint-sources]) + .route("/5/:a", get(my_axum_handler_6).get(my_axum_handler_7)) // $ Alert[rust/summary/taint-sources]) + .route("/6/:a", get(my_axum_handler_8)); // $ Alert[rust/summary/taint-sources]) // ... } From d8e57bd223566df5bc236c0fdc54f12e222ab781 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 31 Aug 2026 15:34:21 +0200 Subject: [PATCH 0688/2098] Rust: Exclude taint-read-steps for `axum::extract::state::State` --- rust/ql/lib/codeql/rust/frameworks/axum.model.yml | 7 ++++++- .../dataflow/sources/web_frameworks/InlineFlow.expected | 6 ------ .../library-tests/dataflow/sources/web_frameworks/test.rs | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/rust/ql/lib/codeql/rust/frameworks/axum.model.yml b/rust/ql/lib/codeql/rust/frameworks/axum.model.yml index 7ae7dec36359..55783beebf41 100644 --- a/rust/ql/lib/codeql/rust/frameworks/axum.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/axum.model.yml @@ -20,4 +20,9 @@ extensions: - ["::patch", "Argument[0].Parameter[0..7]", "remote", "manual"] # on - ["axum::routing::method_routing::on", "Argument[1].Parameter[0..7]", "remote", "manual"] - - ["::on", "Argument[1].Parameter[0..7]", "remote", "manual"] \ No newline at end of file + - ["::on", "Argument[1].Parameter[0..7]", "remote", "manual"] + - addsTo: + pack: codeql/rust-all + extensible: excludeFieldTaintStep + data: + - ["axum::extract::state::State(0)"] diff --git a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected index 5a992eb5a54e..a32c200ed7fd 100644 --- a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected @@ -59,7 +59,6 @@ edges | test.rs:180:32:180:69 | ...: Json::<...> | test.rs:182:14:182:20 | payload | provenance | | | test.rs:187:32:187:43 | ...: String | test.rs:188:14:188:17 | body | provenance | | | test.rs:193:32:193:43 | ...: String | test.rs:194:14:194:17 | body | provenance | | -| test.rs:199:32:199:47 | ...: State::<...> | test.rs:200:14:200:20 | state.0 | provenance | | | test.rs:199:50:199:61 | ...: String | test.rs:201:14:201:17 | body | provenance | | | test.rs:208:34:208:50 | my_axum_handler_1 | test.rs:148:32:148:52 | ...: Path::<...> | provenance | Src:MaD:8 | | test.rs:209:39:209:55 | my_axum_handler_2 | test.rs:156:32:156:67 | ...: Path::<...> | provenance | Src:MaD:9 | @@ -67,7 +66,6 @@ edges | test.rs:213:65:213:81 | my_axum_handler_5 | test.rs:180:32:180:69 | ...: Json::<...> | provenance | Src:MaD:4 | | test.rs:215:33:215:49 | my_axum_handler_6 | test.rs:187:32:187:43 | ...: String | provenance | Src:MaD:8 | | test.rs:215:56:215:72 | my_axum_handler_7 | test.rs:193:32:193:43 | ...: String | provenance | Src:MaD:3 | -| test.rs:216:33:216:49 | my_axum_handler_8 | test.rs:199:32:199:47 | ...: State::<...> | provenance | Src:MaD:8 | | test.rs:216:33:216:49 | my_axum_handler_8 | test.rs:199:50:199:61 | ...: String | provenance | Src:MaD:8 | | test.rs:231:37:236:9 | \|...\| ... | test.rs:231:38:231:46 | ...: String | provenance | Src:MaD:6 | | test.rs:231:38:231:46 | ...: String | test.rs:233:18:233:18 | a | provenance | | @@ -139,9 +137,7 @@ nodes | test.rs:188:14:188:17 | body | semmle.label | body | | test.rs:193:32:193:43 | ...: String | semmle.label | ...: String | | test.rs:194:14:194:17 | body | semmle.label | body | -| test.rs:199:32:199:47 | ...: State::<...> | semmle.label | ...: State::<...> | | test.rs:199:50:199:61 | ...: String | semmle.label | ...: String | -| test.rs:200:14:200:20 | state.0 | semmle.label | state.0 | | test.rs:201:14:201:17 | body | semmle.label | body | | test.rs:208:34:208:50 | my_axum_handler_1 | semmle.label | my_axum_handler_1 | | test.rs:209:39:209:55 | my_axum_handler_2 | semmle.label | my_axum_handler_2 | @@ -150,7 +146,6 @@ nodes | test.rs:215:33:215:49 | my_axum_handler_6 | semmle.label | my_axum_handler_6 | | test.rs:215:56:215:72 | my_axum_handler_7 | semmle.label | my_axum_handler_7 | | test.rs:216:33:216:49 | my_axum_handler_8 | semmle.label | my_axum_handler_8 | -| test.rs:216:33:216:49 | my_axum_handler_8 | semmle.label | my_axum_handler_8 | | test.rs:231:37:236:9 | \|...\| ... | semmle.label | \|...\| ... | | test.rs:231:38:231:46 | ...: String | semmle.label | ...: String | | test.rs:233:18:233:18 | a | semmle.label | a | @@ -193,7 +188,6 @@ testFailures | test.rs:182:14:182:20 | payload | test.rs:213:65:213:81 | my_axum_handler_5 | test.rs:182:14:182:20 | payload | $@ | test.rs:213:65:213:81 | my_axum_handler_5 | my_axum_handler_5 | | test.rs:188:14:188:17 | body | test.rs:215:33:215:49 | my_axum_handler_6 | test.rs:188:14:188:17 | body | $@ | test.rs:215:33:215:49 | my_axum_handler_6 | my_axum_handler_6 | | test.rs:194:14:194:17 | body | test.rs:215:56:215:72 | my_axum_handler_7 | test.rs:194:14:194:17 | body | $@ | test.rs:215:56:215:72 | my_axum_handler_7 | my_axum_handler_7 | -| test.rs:200:14:200:20 | state.0 | test.rs:216:33:216:49 | my_axum_handler_8 | test.rs:200:14:200:20 | state.0 | $@ | test.rs:216:33:216:49 | my_axum_handler_8 | my_axum_handler_8 | | test.rs:201:14:201:17 | body | test.rs:216:33:216:49 | my_axum_handler_8 | test.rs:201:14:201:17 | body | $@ | test.rs:216:33:216:49 | my_axum_handler_8 | my_axum_handler_8 | | test.rs:233:18:233:18 | a | test.rs:231:37:236:9 | \|...\| ... | test.rs:233:18:233:18 | a | $@ | test.rs:231:37:236:9 | \|...\| ... | \|...\| ... | | test.rs:241:22:241:22 | a | test.rs:240:13:244:13 | \|...\| ... | test.rs:241:22:241:22 | a | $@ | test.rs:240:13:244:13 | \|...\| ... | \|...\| ... | diff --git a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/test.rs b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/test.rs index 96fb7dc1b8d9..b9d05a5816aa 100644 --- a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/test.rs +++ b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/test.rs @@ -197,7 +197,7 @@ mod axum_test { } async fn my_axum_handler_8(state: State<()>, body: String) -> &'static str { - sink(state.0); // $ SPURIOUS: hasTaintFlow=my_axum_handler_8 + sink(state.0); sink(body); // $ hasTaintFlow=my_axum_handler_8 "" From 613eeaf55e5dd07084618911afdf94f3891a5d1d Mon Sep 17 00:00:00 2001 From: Henry Mercer Date: Thu, 3 Sep 2026 18:28:22 +0100 Subject: [PATCH 0689/2098] Swift: Point at the host-only thinned resource dir The semmle-code change now thins only `usr/lib/swift/host`, so test that artifact rather than the earlier one which also thinned the per-target libraries. --- swift/third_party/load.bzl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swift/third_party/load.bzl b/swift/third_party/load.bzl index 05cac9509e11..2e116056e7a2 100644 --- a/swift/third_party/load.bzl +++ b/swift/third_party/load.bzl @@ -6,7 +6,7 @@ load("//misc/bazel:lfs.bzl", "lfs_archive", "lfs_files") _override = { # these are used to test new artifacts. Must be empty before merging to main - "resource-dir-macOS-swift-6.3.3-RELEASE-228.zip": "7c4d3307c8986fb2118bb46d36637fcf82385b8a19153f3656fe5065058fbccb", + "resource-dir-macOS-swift-6.3.3-RELEASE-237.zip": "0589f8b61a87447d03b4b81b915f6b341ff8bcb123effda586cba46cc9487bd6", } _staging_url = "https://github.com/dsp-testing/codeql-swift-artifacts/releases/download/staging-{}/{}" From 7aa084c9fd5f080f7b45a50e6decc778b5951133 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 3 Sep 2026 18:55:10 +0100 Subject: [PATCH 0690/2098] C++: Fix join in AliasedSSA. Before (on an internal Microsoft repo): Evaluated relational algebra for predicate AliasedSSA::AllocationMemoryLocation.getVirtualVariable/0#dispred#8debd926@f62ba08v with tuple counts: 5606472 ~0% {2} r1 = AliasedSSA::AllocationMemoryLocation#57439a9b_10#join_rhs AND NOT `AliasAnalysis::allocationEscapes/1#93dc9772`(FIRST 1) 5534569 ~0% {2} r2 = r1 AND NOT `project#AliasedSSA::getGroupedMemoryLocation/3#14ef79fc#ffbf`(FIRST 1) 10613026097 ~0% {2} | JOIN WITH AliasedSSA::AllocationMemoryLocation#57439a9b_10#join_rhs ON FIRST 1 OUTPUT Rhs.1, Lhs.1 5534569 ~6% {2} | JOIN WITH AliasedSSA::VirtualVariable#5712df39 ON FIRST 1 OUTPUT Lhs.1, Lhs.0 759836 ~0% {2} r3 = JOIN AliasedSSA::AllocationMemoryLocation#57439a9b_10#join_rhs WITH `AliasAnalysis::allocationEscapes/1#93dc9772` ON FIRST 1 OUTPUT Lhs.0, Lhs.1 759832 ~6% {3} | JOIN WITH `AliasConfiguration::Allocation.getEnclosingIRFunction/0#dispred#3254a7ee` ON FIRST 1 OUTPUT Rhs.1, _, Lhs.1 759832 ~0% {3} | REWRITE WITH Out.1 := false 759832 ~1% {2} | JOIN WITH num#AliasedSSA::TAllAliasedMemory#4bb632db ON FIRST 2 OUTPUT Rhs.2, Lhs.2 759832 ~1% {2} | JOIN WITH AliasedSSA::VirtualVariable#5712df39 ON FIRST 1 OUTPUT Lhs.1, Lhs.0 5606472 ~0% {4} r4 = SCAN r1 OUTPUT In.0, _, _, In.1 5606472 ~0% {4} | REWRITE WITH Out.1 := false, Out.2 := false 71903 ~5% {2} | JOIN WITH `AliasedSSA::getGroupedMemoryLocation/3#14ef79fc#ffbf` ON FIRST 3 OUTPUT Rhs.3, Lhs.3 71903 ~3% {2} | JOIN WITH `AliasedSSA::GroupedMemoryLocation.getVirtualVariable/0#dispred#143f2d1b` ON FIRST 1 OUTPUT Rhs.1, Lhs.1 71903 ~2% {2} | JOIN WITH AliasedSSA::VirtualVariable#5712df39 ON FIRST 1 OUTPUT Lhs.1, Lhs.0 6366304 ~5% {2} r5 = r2 UNION r3 UNION r4 return r5 After: [2026-09-03 14:39:34] Evaluated non-recursive predicate AliasedSSA::getAllocationMemoryLocation/1#171552fa@42e30agr in 15ms (size: 505315). Evaluated relational algebra for predicate AliasedSSA::getAllocationMemoryLocation/1#171552fa@42e30agr with tuple counts: 505315 ~2% {2} r1 = JOIN AliasedSSA::VirtualVariable#5712df39 WITH `AliasedSSA::MemoryLocation0.getAnAllocation/0#dispred#f0047858` ON FIRST 1 OUTPUT Rhs.1, Lhs.0 return r1 [2026-09-03 14:39:39] Evaluated non-recursive predicate AliasedSSA::AllocationMemoryLocation.getVirtualVariable/0#dispred#8debd926@21855asb in 1811ms (size: 6366304). Evaluated relational algebra for predicate AliasedSSA::AllocationMemoryLocation.getVirtualVariable/0#dispred#8debd926@21855asb with tuple counts: 5606472 ~0% {2} r1 = AliasedSSA::AllocationMemoryLocation#57439a9b_10#join_rhs AND NOT `AliasAnalysis::allocationEscapes/1#93dc9772`(FIRST 1) 5534569 ~0% {2} r2 = r1 AND NOT `project#AliasedSSA::getGroupedMemoryLocation/3#14ef79fc#ffbf`(FIRST 1) 5534569 ~1% {2} | JOIN WITH `AliasedSSA::getAllocationMemoryLocation/1#171552fa` ON FIRST 1 OUTPUT Rhs.1, Lhs.1 5534569 ~6% {2} | JOIN WITH AliasedSSA::VirtualVariable#5712df39 ON FIRST 1 OUTPUT Lhs.1, Lhs.0 759836 ~0% {2} r3 = JOIN AliasedSSA::AllocationMemoryLocation#57439a9b_10#join_rhs WITH `AliasAnalysis::allocationEscapes/1#93dc9772` ON FIRST 1 OUTPUT Lhs.0, Lhs.1 759832 ~6% {3} | JOIN WITH `AliasConfiguration::Allocation.getEnclosingIRFunction/0#dispred#3254a7ee` ON FIRST 1 OUTPUT Rhs.1, _, Lhs.1 759832 ~0% {3} | REWRITE WITH Out.1 := false 759832 ~1% {2} | JOIN WITH num#AliasedSSA::TAllAliasedMemory#4bb632db ON FIRST 2 OUTPUT Rhs.2, Lhs.2 759832 ~1% {2} | JOIN WITH AliasedSSA::VirtualVariable#5712df39 ON FIRST 1 OUTPUT Lhs.1, Lhs.0 5606472 ~0% {4} r4 = SCAN r1 OUTPUT In.0, _, _, In.1 5606472 ~0% {4} | REWRITE WITH Out.1 := false, Out.2 := false 71903 ~5% {2} | JOIN WITH `AliasedSSA::getGroupedMemoryLocation/3#14ef79fc#ffbf` ON FIRST 3 OUTPUT Rhs.3, Lhs.3 71903 ~3% {2} | JOIN WITH `AliasedSSA::GroupedMemoryLocation.getVirtualVariable/0#dispred#143f2d1b` ON FIRST 1 OUTPUT Rhs.1, Lhs.1 71903 ~2% {2} | JOIN WITH AliasedSSA::VirtualVariable#5712df39 ON FIRST 1 OUTPUT Lhs.1, Lhs.0 6366304 ~5% {2} r5 = r2 UNION r3 UNION r4 return r5 --- .../ir/implementation/aliased_ssa/internal/AliasedSSA.qll | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasedSSA.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasedSSA.qll index 2ace50221313..59ee08973e1a 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasedSSA.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasedSSA.qll @@ -295,6 +295,11 @@ abstract class MemoryLocation0 extends TMemoryLocation { */ abstract class VirtualVariable extends MemoryLocation0 { } +pragma[nomagic] +private VirtualVariable getAllocationMemoryLocation(Allocation alloc) { + result.getAnAllocation() = alloc +} + abstract class AllocationMemoryLocation extends MemoryLocation0 { Allocation var; boolean isMayAccess; @@ -313,7 +318,7 @@ abstract class AllocationMemoryLocation extends MemoryLocation0 { result = getGroupedMemoryLocation(var, false, false).getVirtualVariable() or not exists(getGroupedMemoryLocation(var, false, false)) and - result.(AllocationMemoryLocation).getAnAllocation() = var + result = getAllocationMemoryLocation(var) ) } From c99bff955ecdd663e298955a4df8128c4861af79 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 3 Sep 2026 18:57:10 +0100 Subject: [PATCH 0691/2098] C++: Fix join in IR construction. Before (on an internal Microsoft repo): [2026-08-28 14:36:46] Evaluated non-recursive predicate TranslatedElement::TranslatedElement.getInstructionSuccessorInternal/2#dispred#a6e054ca@2248725r in 470505ms (size: 136995987). Evaluated relational algebra for predicate TranslatedElement::TranslatedElement.getInstructionSuccessorInternal/2#dispred#a6e054ca@2248725r with tuple counts: 437 ~0% {2} r158 = JOIN EdgeKind::EdgeKindImpl#8ed21aeb WITH num#InstructionTag::CallTargetTag#8c4ab419 CARTESIAN PRODUCT OUTPUT Lhs.0, Rhs.0 437 ~0% {3} | JOIN WITH num#InstructionTag::CallTag#a77d4021 CARTESIAN PRODUCT OUTPUT Rhs.0, Lhs.0, Lhs.1 1070556919 ~0% {4} | JOIN WITH `TranslatedElement::TranslatedElement.getInstruction/1#dispred#f6df9482_102#join_rhs` ON FIRST 1 OUTPUT Rhs.1, Lhs.1, Lhs.2, Rhs.2 316388 ~1% {4} | JOIN WITH TranslatedInitialization::TranslatedDefaultFieldInitialization#d9c761ed ON FIRST 1 OUTPUT Lhs.0, Lhs.2, Lhs.1, Lhs.3 After: [2026-09-03 13:56:28] Evaluated non-recursive predicate TranslatedInitialization::getCallInstruction/1#c88d849b@3e960544 in 40ms (size: 724). Evaluated relational algebra for predicate TranslatedInitialization::getCallInstruction/1#c88d849b@3e960544 with tuple counts: 724 ~3% {2} r1 = JOIN `_TranslatedElement::TranslatedElement.getInstruction/1#dispred#f6df9482_102#join_rhs_num#Instruction__#shared#1` WITH TranslatedInitialization::TranslatedDefaultFieldInitialization#d9c761ed ON FIRST 1 OUTPUT Lhs.0, Lhs.1 return r1 437 ~0% {2} r5 = JOIN EdgeKind::EdgeKindImpl#8ed21aeb WITH num#InstructionTag::CallTargetTag#8c4ab419 CARTESIAN PRODUCT OUTPUT Lhs.0, Rhs.0 316388 ~1% {4} | JOIN WITH `TranslatedInitialization::getCallInstruction/1#c88d849b` CARTESIAN PRODUCT OUTPUT Rhs.0, Lhs.1, Lhs.0, Rhs.1 --- .../raw/internal/TranslatedInitialization.qll | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll index 10c033131225..c24cb98d2bd9 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll @@ -618,6 +618,11 @@ class TranslatedExplicitFieldInitialization extends TranslatedNonDefaultFieldIni override int getPosition() { result = position } } +pragma[nomagic] +private Instruction getCallInstruction(TranslatedDefaultFieldInitialization tdfi) { + result = tdfi.getInstruction(CallTag()) +} + /** * The IR translation of the initialization of a field from an element of an initializer * list where default initialization is used. @@ -642,7 +647,7 @@ class TranslatedDefaultFieldInitialization extends TranslatedFieldInitialization override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = CallTargetTag() and - result = this.getInstruction(CallTag()) + result = getCallInstruction(this) or tag = CallTag() and result = this.getSideEffects().getFirstInstruction(kind) From da937262ac2d9849fb9b8cffe7158f88bef2e0e8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 3 Sep 2026 18:10:42 +0000 Subject: [PATCH 0692/2098] Release preparation for version 2.27.0 --- actions/ql/lib/CHANGELOG.md | 11 +++++++++++ .../change-notes/2026-09-01-actions-lock-yaml.md | 5 ----- .../0.6.1.md} | 12 +++++++++--- actions/ql/lib/codeql-pack.release.yml | 2 +- actions/ql/lib/qlpack.yml | 2 +- actions/ql/src/CHANGELOG.md | 4 ++++ actions/ql/src/change-notes/released/0.6.35.md | 3 +++ actions/ql/src/codeql-pack.release.yml | 2 +- actions/ql/src/qlpack.yml | 2 +- cpp/ql/lib/CHANGELOG.md | 11 +++++++++++ ...6-08-19-access-paths-for-sources-and-sinks.md | 4 ---- .../2026-08-21-compiler-generated.md | 4 ---- .../change-notes/2026-08-27-libpq-sql-sinks.md | 4 ---- cpp/ql/lib/change-notes/released/12.1.0.md | 10 ++++++++++ cpp/ql/lib/codeql-pack.release.yml | 2 +- cpp/ql/lib/qlpack.yml | 2 +- cpp/ql/src/CHANGELOG.md | 6 ++++++ .../1.8.3.md} | 9 +++++---- cpp/ql/src/codeql-pack.release.yml | 2 +- cpp/ql/src/qlpack.yml | 2 +- csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md | 4 ++++ .../lib/change-notes/released/1.7.74.md | 3 +++ .../Solorigate/lib/codeql-pack.release.yml | 2 +- csharp/ql/campaigns/Solorigate/lib/qlpack.yml | 2 +- csharp/ql/campaigns/Solorigate/src/CHANGELOG.md | 4 ++++ .../src/change-notes/released/1.7.74.md | 3 +++ .../Solorigate/src/codeql-pack.release.yml | 2 +- csharp/ql/campaigns/Solorigate/src/qlpack.yml | 2 +- csharp/ql/lib/CHANGELOG.md | 12 ++++++++++++ ...026-07-31-aspnet-core-controller-discovery.md | 4 ---- .../2026-08-18-tsp-nuget-feed-reachability.md | 4 ---- .../change-notes/2026-08-19-odata-taint-step.md | 4 ---- .../change-notes/2026-08-20-dotnet-restore.md | 4 ---- csharp/ql/lib/change-notes/released/7.3.0.md | 11 +++++++++++ csharp/ql/lib/codeql-pack.release.yml | 2 +- csharp/ql/lib/qlpack.yml | 2 +- csharp/ql/src/CHANGELOG.md | 6 ++++++ .../1.9.3.md} | 7 ++++--- csharp/ql/src/codeql-pack.release.yml | 2 +- csharp/ql/src/qlpack.yml | 2 +- go/ql/consistency-queries/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.57.md | 3 +++ .../consistency-queries/codeql-pack.release.yml | 2 +- go/ql/consistency-queries/qlpack.yml | 2 +- go/ql/lib/CHANGELOG.md | 4 ++++ go/ql/lib/change-notes/released/7.3.1.md | 3 +++ go/ql/lib/codeql-pack.release.yml | 2 +- go/ql/lib/qlpack.yml | 2 +- go/ql/src/CHANGELOG.md | 4 ++++ go/ql/src/change-notes/released/1.6.10.md | 3 +++ go/ql/src/codeql-pack.release.yml | 2 +- go/ql/src/qlpack.yml | 2 +- java/ql/lib/CHANGELOG.md | 11 +++++++++++ java/ql/lib/change-notes/2026-02-27-micronaut.md | 4 ---- .../9.3.0.md} | 11 ++++++++--- java/ql/lib/codeql-pack.release.yml | 2 +- java/ql/lib/qlpack.yml | 2 +- java/ql/src/CHANGELOG.md | 4 ++++ java/ql/src/change-notes/released/1.11.10.md | 3 +++ java/ql/src/codeql-pack.release.yml | 2 +- java/ql/src/qlpack.yml | 2 +- javascript/ql/lib/CHANGELOG.md | 4 ++++ .../ql/lib/change-notes/released/2.10.1.md | 3 +++ javascript/ql/lib/codeql-pack.release.yml | 2 +- javascript/ql/lib/qlpack.yml | 2 +- javascript/ql/src/CHANGELOG.md | 6 ++++++ .../2.4.5.md} | 7 ++++--- javascript/ql/src/codeql-pack.release.yml | 2 +- javascript/ql/src/qlpack.yml | 2 +- misc/suite-helpers/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.57.md | 3 +++ misc/suite-helpers/codeql-pack.release.yml | 2 +- misc/suite-helpers/qlpack.yml | 2 +- python/ql/lib/CHANGELOG.md | 7 +++++++ .../2026-08-27-tsg-parser-unicode-escapes.md | 4 ---- .../7.2.5.md} | 8 +++++--- python/ql/lib/codeql-pack.release.yml | 2 +- python/ql/lib/qlpack.yml | 2 +- python/ql/src/CHANGELOG.md | 4 ++++ python/ql/src/change-notes/released/1.8.10.md | 3 +++ python/ql/src/codeql-pack.release.yml | 2 +- python/ql/src/qlpack.yml | 2 +- ruby/ql/lib/CHANGELOG.md | 16 ++++++++++++++++ .../7.0.0.md} | 7 ++++--- ruby/ql/lib/codeql-pack.release.yml | 2 +- ruby/ql/lib/qlpack.yml | 2 +- ruby/ql/src/CHANGELOG.md | 4 ++++ ruby/ql/src/change-notes/released/1.6.10.md | 3 +++ ruby/ql/src/codeql-pack.release.yml | 2 +- ruby/ql/src/qlpack.yml | 2 +- rust/ql/lib/CHANGELOG.md | 8 ++++++++ .../0.2.21.md} | 7 ++++--- rust/ql/lib/codeql-pack.release.yml | 2 +- rust/ql/lib/qlpack.yml | 2 +- rust/ql/src/CHANGELOG.md | 12 ++++++++++++ .../change-notes/2026-08-11-command-injection.md | 4 ---- ...0-unused-variables-in-incomplete-functions.md | 4 ---- ...-hardcoded-cryptographic-match-expressions.md | 5 ----- rust/ql/src/change-notes/released/0.1.42.md | 11 +++++++++++ rust/ql/src/codeql-pack.release.yml | 2 +- rust/ql/src/qlpack.yml | 2 +- shared/concepts/CHANGELOG.md | 4 ++++ shared/concepts/change-notes/released/0.0.31.md | 3 +++ shared/concepts/codeql-pack.release.yml | 2 +- shared/concepts/qlpack.yml | 2 +- shared/controlflow/CHANGELOG.md | 4 ++++ .../controlflow/change-notes/released/2.0.41.md | 3 +++ shared/controlflow/codeql-pack.release.yml | 2 +- shared/controlflow/qlpack.yml | 2 +- shared/dataflow/CHANGELOG.md | 4 ++++ shared/dataflow/change-notes/released/2.1.13.md | 3 +++ shared/dataflow/codeql-pack.release.yml | 2 +- shared/dataflow/qlpack.yml | 2 +- shared/mad/CHANGELOG.md | 4 ++++ shared/mad/change-notes/released/1.0.57.md | 3 +++ shared/mad/codeql-pack.release.yml | 2 +- shared/mad/qlpack.yml | 2 +- shared/namebinding/CHANGELOG.md | 4 ++++ .../namebinding/change-notes/released/0.0.6.md | 3 +++ shared/namebinding/codeql-pack.release.yml | 2 +- shared/namebinding/qlpack.yml | 2 +- shared/quantum/CHANGELOG.md | 4 ++++ shared/quantum/change-notes/released/0.0.35.md | 3 +++ shared/quantum/codeql-pack.release.yml | 2 +- shared/quantum/qlpack.yml | 2 +- shared/rangeanalysis/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.57.md | 3 +++ shared/rangeanalysis/codeql-pack.release.yml | 2 +- shared/rangeanalysis/qlpack.yml | 2 +- shared/regex/CHANGELOG.md | 4 ++++ shared/regex/change-notes/released/1.0.57.md | 3 +++ shared/regex/codeql-pack.release.yml | 2 +- shared/regex/qlpack.yml | 2 +- shared/ssa/CHANGELOG.md | 4 ++++ shared/ssa/change-notes/released/2.0.33.md | 3 +++ shared/ssa/codeql-pack.release.yml | 2 +- shared/ssa/qlpack.yml | 2 +- shared/threat-models/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.57.md | 3 +++ shared/threat-models/codeql-pack.release.yml | 2 +- shared/threat-models/qlpack.yml | 2 +- shared/tutorial/CHANGELOG.md | 4 ++++ shared/tutorial/change-notes/released/1.0.57.md | 3 +++ shared/tutorial/codeql-pack.release.yml | 2 +- shared/tutorial/qlpack.yml | 2 +- shared/typeflow/CHANGELOG.md | 4 ++++ shared/typeflow/change-notes/released/1.0.57.md | 3 +++ shared/typeflow/codeql-pack.release.yml | 2 +- shared/typeflow/qlpack.yml | 2 +- shared/typeinference/CHANGELOG.md | 4 ++++ .../change-notes/released/0.0.38.md | 3 +++ shared/typeinference/codeql-pack.release.yml | 2 +- shared/typeinference/qlpack.yml | 2 +- shared/typetracking/CHANGELOG.md | 4 ++++ .../typetracking/change-notes/released/2.0.41.md | 3 +++ shared/typetracking/codeql-pack.release.yml | 2 +- shared/typetracking/qlpack.yml | 2 +- shared/typos/CHANGELOG.md | 4 ++++ shared/typos/change-notes/released/1.0.57.md | 3 +++ shared/typos/codeql-pack.release.yml | 2 +- shared/typos/qlpack.yml | 2 +- shared/util/CHANGELOG.md | 4 ++++ shared/util/change-notes/released/2.0.44.md | 3 +++ shared/util/codeql-pack.release.yml | 2 +- shared/util/qlpack.yml | 2 +- shared/xml/CHANGELOG.md | 4 ++++ shared/xml/change-notes/released/1.0.57.md | 3 +++ shared/xml/codeql-pack.release.yml | 2 +- shared/xml/qlpack.yml | 2 +- shared/yaml/CHANGELOG.md | 4 ++++ shared/yaml/change-notes/released/1.0.57.md | 3 +++ shared/yaml/codeql-pack.release.yml | 2 +- shared/yaml/qlpack.yml | 2 +- swift/ql/lib/CHANGELOG.md | 4 ++++ swift/ql/lib/change-notes/released/6.8.3.md | 3 +++ swift/ql/lib/codeql-pack.release.yml | 2 +- swift/ql/lib/qlpack.yml | 2 +- swift/ql/src/CHANGELOG.md | 4 ++++ swift/ql/src/change-notes/released/1.3.10.md | 3 +++ swift/ql/src/codeql-pack.release.yml | 2 +- swift/ql/src/qlpack.yml | 2 +- 181 files changed, 482 insertions(+), 163 deletions(-) delete mode 100644 actions/ql/lib/change-notes/2026-09-01-actions-lock-yaml.md rename actions/ql/lib/change-notes/{2026-08-19-association-if-check-event-validity.md => released/0.6.1.md} (73%) create mode 100644 actions/ql/src/change-notes/released/0.6.35.md delete mode 100644 cpp/ql/lib/change-notes/2026-08-19-access-paths-for-sources-and-sinks.md delete mode 100644 cpp/ql/lib/change-notes/2026-08-21-compiler-generated.md delete mode 100644 cpp/ql/lib/change-notes/2026-08-27-libpq-sql-sinks.md create mode 100644 cpp/ql/lib/change-notes/released/12.1.0.md rename cpp/ql/src/change-notes/{2026-08-28-leap-year-unsafe-array-fp.md => released/1.8.3.md} (83%) create mode 100644 csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.74.md create mode 100644 csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.74.md delete mode 100644 csharp/ql/lib/change-notes/2026-07-31-aspnet-core-controller-discovery.md delete mode 100644 csharp/ql/lib/change-notes/2026-08-18-tsp-nuget-feed-reachability.md delete mode 100644 csharp/ql/lib/change-notes/2026-08-19-odata-taint-step.md delete mode 100644 csharp/ql/lib/change-notes/2026-08-20-dotnet-restore.md create mode 100644 csharp/ql/lib/change-notes/released/7.3.0.md rename csharp/ql/src/change-notes/{2026-09-03-missed-where-terminal-branches.md => released/1.9.3.md} (80%) create mode 100644 go/ql/consistency-queries/change-notes/released/1.0.57.md create mode 100644 go/ql/lib/change-notes/released/7.3.1.md create mode 100644 go/ql/src/change-notes/released/1.6.10.md delete mode 100644 java/ql/lib/change-notes/2026-02-27-micronaut.md rename java/ql/lib/change-notes/{2026-08-02-apache-commons-secure-xml.md => released/9.3.0.md} (65%) create mode 100644 java/ql/src/change-notes/released/1.11.10.md create mode 100644 javascript/ql/lib/change-notes/released/2.10.1.md rename javascript/ql/src/change-notes/{2026-09-02-html-coverage.md => released/2.4.5.md} (75%) create mode 100644 misc/suite-helpers/change-notes/released/1.0.57.md delete mode 100644 python/ql/lib/change-notes/2026-08-27-tsg-parser-unicode-escapes.md rename python/ql/lib/change-notes/{2026-08-19-legacy-parser-relaxed-except.md => released/7.2.5.md} (60%) create mode 100644 python/ql/src/change-notes/released/1.8.10.md rename ruby/ql/lib/change-notes/{2026-08-24-cfg-swap.md => released/7.0.0.md} (96%) create mode 100644 ruby/ql/src/change-notes/released/1.6.10.md rename rust/ql/lib/change-notes/{2026-08-28-angle-bracket-trait-canonical-paths.md => released/0.2.21.md} (82%) delete mode 100644 rust/ql/src/change-notes/2026-08-11-command-injection.md delete mode 100644 rust/ql/src/change-notes/2026-08-20-unused-variables-in-incomplete-functions.md delete mode 100644 rust/ql/src/change-notes/2026-08-25-hardcoded-cryptographic-match-expressions.md create mode 100644 rust/ql/src/change-notes/released/0.1.42.md create mode 100644 shared/concepts/change-notes/released/0.0.31.md create mode 100644 shared/controlflow/change-notes/released/2.0.41.md create mode 100644 shared/dataflow/change-notes/released/2.1.13.md create mode 100644 shared/mad/change-notes/released/1.0.57.md create mode 100644 shared/namebinding/change-notes/released/0.0.6.md create mode 100644 shared/quantum/change-notes/released/0.0.35.md create mode 100644 shared/rangeanalysis/change-notes/released/1.0.57.md create mode 100644 shared/regex/change-notes/released/1.0.57.md create mode 100644 shared/ssa/change-notes/released/2.0.33.md create mode 100644 shared/threat-models/change-notes/released/1.0.57.md create mode 100644 shared/tutorial/change-notes/released/1.0.57.md create mode 100644 shared/typeflow/change-notes/released/1.0.57.md create mode 100644 shared/typeinference/change-notes/released/0.0.38.md create mode 100644 shared/typetracking/change-notes/released/2.0.41.md create mode 100644 shared/typos/change-notes/released/1.0.57.md create mode 100644 shared/util/change-notes/released/2.0.44.md create mode 100644 shared/xml/change-notes/released/1.0.57.md create mode 100644 shared/yaml/change-notes/released/1.0.57.md create mode 100644 swift/ql/lib/change-notes/released/6.8.3.md create mode 100644 swift/ql/src/change-notes/released/1.3.10.md diff --git a/actions/ql/lib/CHANGELOG.md b/actions/ql/lib/CHANGELOG.md index e686c4d596f4..d1943239b2d1 100644 --- a/actions/ql/lib/CHANGELOG.md +++ b/actions/ql/lib/CHANGELOG.md @@ -1,3 +1,14 @@ +## 0.6.1 + +### New Features + +* GitHub Actions databases now extract `actions.lock` files. The new `ActionsLock` class + provides access to their YAML abstract syntax trees. + +### Minor Analysis Improvements + +* Checks on author association fields read from the event payload (e.g. `github.event.pull_request.author_association`) now only count as protection for events whose payload actually populates that field. Previously, a condition such as `github.event.pull_request.author_association != 'NONE'` on a workflow triggered by `issues` events was treated as a protective check even though `github.event.pull_request` is not populated for `issues` events, which makes the condition vacuous. This change may result in more alerts for queries using the `ControlCheck` class. + ## 0.6.0 ### Breaking Changes diff --git a/actions/ql/lib/change-notes/2026-09-01-actions-lock-yaml.md b/actions/ql/lib/change-notes/2026-09-01-actions-lock-yaml.md deleted file mode 100644 index ed0a25515da0..000000000000 --- a/actions/ql/lib/change-notes/2026-09-01-actions-lock-yaml.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: feature ---- -* GitHub Actions databases now extract `actions.lock` files. The new `ActionsLock` class - provides access to their YAML abstract syntax trees. diff --git a/actions/ql/lib/change-notes/2026-08-19-association-if-check-event-validity.md b/actions/ql/lib/change-notes/released/0.6.1.md similarity index 73% rename from actions/ql/lib/change-notes/2026-08-19-association-if-check-event-validity.md rename to actions/ql/lib/change-notes/released/0.6.1.md index 28ef240b2394..19f7f95948ad 100644 --- a/actions/ql/lib/change-notes/2026-08-19-association-if-check-event-validity.md +++ b/actions/ql/lib/change-notes/released/0.6.1.md @@ -1,4 +1,10 @@ ---- -category: minorAnalysis ---- +## 0.6.1 + +### New Features + +* GitHub Actions databases now extract `actions.lock` files. The new `ActionsLock` class + provides access to their YAML abstract syntax trees. + +### Minor Analysis Improvements + * Checks on author association fields read from the event payload (e.g. `github.event.pull_request.author_association`) now only count as protection for events whose payload actually populates that field. Previously, a condition such as `github.event.pull_request.author_association != 'NONE'` on a workflow triggered by `issues` events was treated as a protective check even though `github.event.pull_request` is not populated for `issues` events, which makes the condition vacuous. This change may result in more alerts for queries using the `ControlCheck` class. diff --git a/actions/ql/lib/codeql-pack.release.yml b/actions/ql/lib/codeql-pack.release.yml index a3f820f884d3..80fb0899f645 100644 --- a/actions/ql/lib/codeql-pack.release.yml +++ b/actions/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.6.0 +lastReleaseVersion: 0.6.1 diff --git a/actions/ql/lib/qlpack.yml b/actions/ql/lib/qlpack.yml index b86df498d3dd..612e631c6f8b 100644 --- a/actions/ql/lib/qlpack.yml +++ b/actions/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-all -version: 0.6.1-dev +version: 0.6.1 library: true warnOnImplicitThis: true dependencies: diff --git a/actions/ql/src/CHANGELOG.md b/actions/ql/src/CHANGELOG.md index 6a4f17d872be..9676c26efaff 100644 --- a/actions/ql/src/CHANGELOG.md +++ b/actions/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.35 + +No user-facing changes. + ## 0.6.34 ### Minor Analysis Improvements diff --git a/actions/ql/src/change-notes/released/0.6.35.md b/actions/ql/src/change-notes/released/0.6.35.md new file mode 100644 index 000000000000..aa17e650d404 --- /dev/null +++ b/actions/ql/src/change-notes/released/0.6.35.md @@ -0,0 +1,3 @@ +## 0.6.35 + +No user-facing changes. diff --git a/actions/ql/src/codeql-pack.release.yml b/actions/ql/src/codeql-pack.release.yml index fe5075b50fbd..0a9561ad0b98 100644 --- a/actions/ql/src/codeql-pack.release.yml +++ b/actions/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.6.34 +lastReleaseVersion: 0.6.35 diff --git a/actions/ql/src/qlpack.yml b/actions/ql/src/qlpack.yml index f4323defe6e8..5e4877698e63 100644 --- a/actions/ql/src/qlpack.yml +++ b/actions/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-queries -version: 0.6.35-dev +version: 0.6.35 library: false warnOnImplicitThis: true groups: [actions, queries] diff --git a/cpp/ql/lib/CHANGELOG.md b/cpp/ql/lib/CHANGELOG.md index eb81fb24c603..c42b0d3ec5d5 100644 --- a/cpp/ql/lib/CHANGELOG.md +++ b/cpp/ql/lib/CHANGELOG.md @@ -1,3 +1,14 @@ +## 12.1.0 + +### New Features + +* Sources and sinks defined using models-as-data now support access paths with fields. For example, the path `ReturnValue.Field[S::f]` makes the field `S::f` a flow source when it is returned by a call. + +### Minor Analysis Improvements + +* Added the PostgreSQL libpq (asynchronous) query-execution functions `PQexec`, `PQexecParams`, `PQprepare`, `PQsendQuery`, `PQsendQueryParams`, `PQsendPrepare` as `sql-injection` sinks. +* Initializers of compiler-generated variables are now recognized as compiler-generated. A new predicate `isCompilerGenerated` on `Initializer` has been added to reflect this. + ## 12.0.3 No user-facing changes. diff --git a/cpp/ql/lib/change-notes/2026-08-19-access-paths-for-sources-and-sinks.md b/cpp/ql/lib/change-notes/2026-08-19-access-paths-for-sources-and-sinks.md deleted file mode 100644 index 7cbe82b6f8e9..000000000000 --- a/cpp/ql/lib/change-notes/2026-08-19-access-paths-for-sources-and-sinks.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: feature ---- -* Sources and sinks defined using models-as-data now support access paths with fields. For example, the path `ReturnValue.Field[S::f]` makes the field `S::f` a flow source when it is returned by a call. \ No newline at end of file diff --git a/cpp/ql/lib/change-notes/2026-08-21-compiler-generated.md b/cpp/ql/lib/change-notes/2026-08-21-compiler-generated.md deleted file mode 100644 index eed0d6c8c389..000000000000 --- a/cpp/ql/lib/change-notes/2026-08-21-compiler-generated.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Initializers of compiler-generated variables are now recognized as compiler-generated. A new predicate `isCompilerGenerated` on `Initializer` has been added to reflect this. \ No newline at end of file diff --git a/cpp/ql/lib/change-notes/2026-08-27-libpq-sql-sinks.md b/cpp/ql/lib/change-notes/2026-08-27-libpq-sql-sinks.md deleted file mode 100644 index 64cba8096173..000000000000 --- a/cpp/ql/lib/change-notes/2026-08-27-libpq-sql-sinks.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added the PostgreSQL libpq (asynchronous) query-execution functions `PQexec`, `PQexecParams`, `PQprepare`, `PQsendQuery`, `PQsendQueryParams`, `PQsendPrepare` as `sql-injection` sinks. diff --git a/cpp/ql/lib/change-notes/released/12.1.0.md b/cpp/ql/lib/change-notes/released/12.1.0.md new file mode 100644 index 000000000000..a56939e92a70 --- /dev/null +++ b/cpp/ql/lib/change-notes/released/12.1.0.md @@ -0,0 +1,10 @@ +## 12.1.0 + +### New Features + +* Sources and sinks defined using models-as-data now support access paths with fields. For example, the path `ReturnValue.Field[S::f]` makes the field `S::f` a flow source when it is returned by a call. + +### Minor Analysis Improvements + +* Added the PostgreSQL libpq (asynchronous) query-execution functions `PQexec`, `PQexecParams`, `PQprepare`, `PQsendQuery`, `PQsendQueryParams`, `PQsendPrepare` as `sql-injection` sinks. +* Initializers of compiler-generated variables are now recognized as compiler-generated. A new predicate `isCompilerGenerated` on `Initializer` has been added to reflect this. diff --git a/cpp/ql/lib/codeql-pack.release.yml b/cpp/ql/lib/codeql-pack.release.yml index 9901aa9768db..87f64222020b 100644 --- a/cpp/ql/lib/codeql-pack.release.yml +++ b/cpp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 12.0.3 +lastReleaseVersion: 12.1.0 diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index b676012be506..c3e40cb63948 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-all -version: 12.0.4-dev +version: 12.1.0 groups: cpp dbscheme: semmlecode.cpp.dbscheme extractor: cpp diff --git a/cpp/ql/src/CHANGELOG.md b/cpp/ql/src/CHANGELOG.md index 9a8c1243217c..de14ac42a586 100644 --- a/cpp/ql/src/CHANGELOG.md +++ b/cpp/ql/src/CHANGELOG.md @@ -1,3 +1,9 @@ +## 1.8.3 + +### Minor Analysis Improvements + +* The `cpp/leap-year/unsafe-array-for-days-of-the-year` query ("Unsafe array for days of the year") no longer reports an alert on the `__PRETTY_FUNCTION__` variable (and related variables) when the enclosing function has a signature that is exactly 364 characters. + ## 1.8.2 No user-facing changes. diff --git a/cpp/ql/src/change-notes/2026-08-28-leap-year-unsafe-array-fp.md b/cpp/ql/src/change-notes/released/1.8.3.md similarity index 83% rename from cpp/ql/src/change-notes/2026-08-28-leap-year-unsafe-array-fp.md rename to cpp/ql/src/change-notes/released/1.8.3.md index 4ba04f0de358..46bddcbc40ea 100644 --- a/cpp/ql/src/change-notes/2026-08-28-leap-year-unsafe-array-fp.md +++ b/cpp/ql/src/change-notes/released/1.8.3.md @@ -1,4 +1,5 @@ ---- -category: minorAnalysis ---- -* The `cpp/leap-year/unsafe-array-for-days-of-the-year` query ("Unsafe array for days of the year") no longer reports an alert on the `__PRETTY_FUNCTION__` variable (and related variables) when the enclosing function has a signature that is exactly 364 characters. \ No newline at end of file +## 1.8.3 + +### Minor Analysis Improvements + +* The `cpp/leap-year/unsafe-array-for-days-of-the-year` query ("Unsafe array for days of the year") no longer reports an alert on the `__PRETTY_FUNCTION__` variable (and related variables) when the enclosing function has a signature that is exactly 364 characters. diff --git a/cpp/ql/src/codeql-pack.release.yml b/cpp/ql/src/codeql-pack.release.yml index 559af8348bb0..8071ef421ab4 100644 --- a/cpp/ql/src/codeql-pack.release.yml +++ b/cpp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.8.2 +lastReleaseVersion: 1.8.3 diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml index b365b8a398c3..ca971b04aaad 100644 --- a/cpp/ql/src/qlpack.yml +++ b/cpp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-queries -version: 1.8.3-dev +version: 1.8.3 groups: - cpp - queries diff --git a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md index 1897f105e373..8d3c16f6bc95 100644 --- a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.7.74 + +No user-facing changes. + ## 1.7.73 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.74.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.74.md new file mode 100644 index 000000000000..3af579633adc --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.74.md @@ -0,0 +1,3 @@ +## 1.7.74 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml index 95fecc284bee..34061dc1c22a 100644 --- a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.73 +lastReleaseVersion: 1.7.74 diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml index d045c1c7224b..990c6ad4dbc8 100644 --- a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-all -version: 1.7.74-dev +version: 1.7.74 groups: - csharp - solorigate diff --git a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md index 1897f105e373..8d3c16f6bc95 100644 --- a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.7.74 + +No user-facing changes. + ## 1.7.73 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.74.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.74.md new file mode 100644 index 000000000000..3af579633adc --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.74.md @@ -0,0 +1,3 @@ +## 1.7.74 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml index 95fecc284bee..34061dc1c22a 100644 --- a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.73 +lastReleaseVersion: 1.7.74 diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml index 3b5e1b3341e3..199504aa7dd3 100644 --- a/csharp/ql/campaigns/Solorigate/src/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-queries -version: 1.7.74-dev +version: 1.7.74 groups: - csharp - solorigate diff --git a/csharp/ql/lib/CHANGELOG.md b/csharp/ql/lib/CHANGELOG.md index 4df4b3da22fa..78b2f677db3e 100644 --- a/csharp/ql/lib/CHANGELOG.md +++ b/csharp/ql/lib/CHANGELOG.md @@ -1,3 +1,15 @@ +## 7.3.0 + +### New Features + +* Added taint modeling for OData action parameter binding (`Microsoft.AspNet.OData`/`Microsoft.AspNetCore.OData`). Values cast, `as`-converted, or type-tested out of `ODataActionParameters`, and entities tracked by `Delta` (via `GetInstance`, `Patch`, `Put`, `CopyChangedValues`, and `CopyUnchangedValues`), now taint the members of the target type. + +### Minor Analysis Improvements + +* In `build-mode: none`, project and solution restoration is now always attempted using the feeds available. +* C# analysis with build mode `none` now lists unreachable explicitly configured NuGet feeds in both the extraction warning and the tool status page note. This makes it easier to identify feeds that may cause dependencies to be missing from the analysis. +* Improved ASP.NET Core MVC controller and action discovery to more closely match runtime behavior, including application parts, endpoint mappings, inherited actions, and controller and action exclusions. Service-injected action parameters are no longer modeled as remote input. + ## 7.2.0 ### New Features diff --git a/csharp/ql/lib/change-notes/2026-07-31-aspnet-core-controller-discovery.md b/csharp/ql/lib/change-notes/2026-07-31-aspnet-core-controller-discovery.md deleted file mode 100644 index a55f736a1e84..000000000000 --- a/csharp/ql/lib/change-notes/2026-07-31-aspnet-core-controller-discovery.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Improved ASP.NET Core MVC controller and action discovery to more closely match runtime behavior, including application parts, endpoint mappings, inherited actions, and controller and action exclusions. Service-injected action parameters are no longer modeled as remote input. diff --git a/csharp/ql/lib/change-notes/2026-08-18-tsp-nuget-feed-reachability.md b/csharp/ql/lib/change-notes/2026-08-18-tsp-nuget-feed-reachability.md deleted file mode 100644 index fc391ad6f804..000000000000 --- a/csharp/ql/lib/change-notes/2026-08-18-tsp-nuget-feed-reachability.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* C# analysis with build mode `none` now lists unreachable explicitly configured NuGet feeds in both the extraction warning and the tool status page note. This makes it easier to identify feeds that may cause dependencies to be missing from the analysis. diff --git a/csharp/ql/lib/change-notes/2026-08-19-odata-taint-step.md b/csharp/ql/lib/change-notes/2026-08-19-odata-taint-step.md deleted file mode 100644 index 3d0a6cbeb8ae..000000000000 --- a/csharp/ql/lib/change-notes/2026-08-19-odata-taint-step.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: feature ---- -* Added taint modeling for OData action parameter binding (`Microsoft.AspNet.OData`/`Microsoft.AspNetCore.OData`). Values cast, `as`-converted, or type-tested out of `ODataActionParameters`, and entities tracked by `Delta` (via `GetInstance`, `Patch`, `Put`, `CopyChangedValues`, and `CopyUnchangedValues`), now taint the members of the target type. diff --git a/csharp/ql/lib/change-notes/2026-08-20-dotnet-restore.md b/csharp/ql/lib/change-notes/2026-08-20-dotnet-restore.md deleted file mode 100644 index 9bd47c960e18..000000000000 --- a/csharp/ql/lib/change-notes/2026-08-20-dotnet-restore.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* In `build-mode: none`, project and solution restoration is now always attempted using the feeds available. diff --git a/csharp/ql/lib/change-notes/released/7.3.0.md b/csharp/ql/lib/change-notes/released/7.3.0.md new file mode 100644 index 000000000000..2af204c27e3d --- /dev/null +++ b/csharp/ql/lib/change-notes/released/7.3.0.md @@ -0,0 +1,11 @@ +## 7.3.0 + +### New Features + +* Added taint modeling for OData action parameter binding (`Microsoft.AspNet.OData`/`Microsoft.AspNetCore.OData`). Values cast, `as`-converted, or type-tested out of `ODataActionParameters`, and entities tracked by `Delta` (via `GetInstance`, `Patch`, `Put`, `CopyChangedValues`, and `CopyUnchangedValues`), now taint the members of the target type. + +### Minor Analysis Improvements + +* In `build-mode: none`, project and solution restoration is now always attempted using the feeds available. +* C# analysis with build mode `none` now lists unreachable explicitly configured NuGet feeds in both the extraction warning and the tool status page note. This makes it easier to identify feeds that may cause dependencies to be missing from the analysis. +* Improved ASP.NET Core MVC controller and action discovery to more closely match runtime behavior, including application parts, endpoint mappings, inherited actions, and controller and action exclusions. Service-injected action parameters are no longer modeled as remote input. diff --git a/csharp/ql/lib/codeql-pack.release.yml b/csharp/ql/lib/codeql-pack.release.yml index fda9ea165fc5..2b9b871fffa7 100644 --- a/csharp/ql/lib/codeql-pack.release.yml +++ b/csharp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 7.2.0 +lastReleaseVersion: 7.3.0 diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index c011a9a20d0b..15fadfad8a0f 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-all -version: 7.2.1-dev +version: 7.3.0 groups: csharp dbscheme: semmlecode.csharp.dbscheme extractor: csharp diff --git a/csharp/ql/src/CHANGELOG.md b/csharp/ql/src/CHANGELOG.md index 2e430f88a6ed..cf86d815aa53 100644 --- a/csharp/ql/src/CHANGELOG.md +++ b/csharp/ql/src/CHANGELOG.md @@ -1,3 +1,9 @@ +## 1.9.3 + +### Minor Analysis Improvements + +* The `cs/linq/missed-where` query no longer flags `foreach` loops where the matching branch terminates the method, iterator, or loop instead of continuing with filtered loop work. + ## 1.9.2 ### Minor Analysis Improvements diff --git a/csharp/ql/src/change-notes/2026-09-03-missed-where-terminal-branches.md b/csharp/ql/src/change-notes/released/1.9.3.md similarity index 80% rename from csharp/ql/src/change-notes/2026-09-03-missed-where-terminal-branches.md rename to csharp/ql/src/change-notes/released/1.9.3.md index 33515e4c90cd..675cc4b65718 100644 --- a/csharp/ql/src/change-notes/2026-09-03-missed-where-terminal-branches.md +++ b/csharp/ql/src/change-notes/released/1.9.3.md @@ -1,4 +1,5 @@ ---- -category: minorAnalysis ---- +## 1.9.3 + +### Minor Analysis Improvements + * The `cs/linq/missed-where` query no longer flags `foreach` loops where the matching branch terminates the method, iterator, or loop instead of continuing with filtered loop work. diff --git a/csharp/ql/src/codeql-pack.release.yml b/csharp/ql/src/codeql-pack.release.yml index 842136056d89..46a56c94195c 100644 --- a/csharp/ql/src/codeql-pack.release.yml +++ b/csharp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.9.2 +lastReleaseVersion: 1.9.3 diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml index 84048f55bc43..a2f6f0aac243 100644 --- a/csharp/ql/src/qlpack.yml +++ b/csharp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-queries -version: 1.9.3-dev +version: 1.9.3 groups: - csharp - queries diff --git a/go/ql/consistency-queries/CHANGELOG.md b/go/ql/consistency-queries/CHANGELOG.md index 7a0754e81b29..3a71bc3b5561 100644 --- a/go/ql/consistency-queries/CHANGELOG.md +++ b/go/ql/consistency-queries/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.57 + +No user-facing changes. + ## 1.0.56 No user-facing changes. diff --git a/go/ql/consistency-queries/change-notes/released/1.0.57.md b/go/ql/consistency-queries/change-notes/released/1.0.57.md new file mode 100644 index 000000000000..18a94c4bca4a --- /dev/null +++ b/go/ql/consistency-queries/change-notes/released/1.0.57.md @@ -0,0 +1,3 @@ +## 1.0.57 + +No user-facing changes. diff --git a/go/ql/consistency-queries/codeql-pack.release.yml b/go/ql/consistency-queries/codeql-pack.release.yml index 9bb27b4fdb71..08ea3909354f 100644 --- a/go/ql/consistency-queries/codeql-pack.release.yml +++ b/go/ql/consistency-queries/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.56 +lastReleaseVersion: 1.0.57 diff --git a/go/ql/consistency-queries/qlpack.yml b/go/ql/consistency-queries/qlpack.yml index bebfec169a09..353e4dd1cdcd 100644 --- a/go/ql/consistency-queries/qlpack.yml +++ b/go/ql/consistency-queries/qlpack.yml @@ -1,5 +1,5 @@ name: codeql-go-consistency-queries -version: 1.0.57-dev +version: 1.0.57 groups: - go - queries diff --git a/go/ql/lib/CHANGELOG.md b/go/ql/lib/CHANGELOG.md index 7ccc01fbd4c4..0c60f6aed295 100644 --- a/go/ql/lib/CHANGELOG.md +++ b/go/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 7.3.1 + +No user-facing changes. + ## 7.3.0 ### Major Analysis Improvements diff --git a/go/ql/lib/change-notes/released/7.3.1.md b/go/ql/lib/change-notes/released/7.3.1.md new file mode 100644 index 000000000000..2f2fe5472266 --- /dev/null +++ b/go/ql/lib/change-notes/released/7.3.1.md @@ -0,0 +1,3 @@ +## 7.3.1 + +No user-facing changes. diff --git a/go/ql/lib/codeql-pack.release.yml b/go/ql/lib/codeql-pack.release.yml index 2b9b871fffa7..43cb026b1392 100644 --- a/go/ql/lib/codeql-pack.release.yml +++ b/go/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 7.3.0 +lastReleaseVersion: 7.3.1 diff --git a/go/ql/lib/qlpack.yml b/go/ql/lib/qlpack.yml index 12e9a5f97982..fb42dcb703ae 100644 --- a/go/ql/lib/qlpack.yml +++ b/go/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-all -version: 7.3.1-dev +version: 7.3.1 groups: go dbscheme: go.dbscheme extractor: go diff --git a/go/ql/src/CHANGELOG.md b/go/ql/src/CHANGELOG.md index 8b7e75f28b40..96239d742d4a 100644 --- a/go/ql/src/CHANGELOG.md +++ b/go/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.6.10 + +No user-facing changes. + ## 1.6.9 No user-facing changes. diff --git a/go/ql/src/change-notes/released/1.6.10.md b/go/ql/src/change-notes/released/1.6.10.md new file mode 100644 index 000000000000..0c6a14492ed0 --- /dev/null +++ b/go/ql/src/change-notes/released/1.6.10.md @@ -0,0 +1,3 @@ +## 1.6.10 + +No user-facing changes. diff --git a/go/ql/src/codeql-pack.release.yml b/go/ql/src/codeql-pack.release.yml index 018779df35eb..995e7a94a564 100644 --- a/go/ql/src/codeql-pack.release.yml +++ b/go/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.6.9 +lastReleaseVersion: 1.6.10 diff --git a/go/ql/src/qlpack.yml b/go/ql/src/qlpack.yml index 64813b045694..bc9f243309af 100644 --- a/go/ql/src/qlpack.yml +++ b/go/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-queries -version: 1.6.10-dev +version: 1.6.10 groups: - go - queries diff --git a/java/ql/lib/CHANGELOG.md b/java/ql/lib/CHANGELOG.md index 4d0a6c8c20fd..13a7b5b7961b 100644 --- a/java/ql/lib/CHANGELOG.md +++ b/java/ql/lib/CHANGELOG.md @@ -1,3 +1,14 @@ +## 9.3.0 + +### New Features + +* Factories returned by the Apache Commons Secure XML (`org.apache.commons.xml.secure`) hardening library's `SecureDocumentBuilderFactory`, `SecureSAXParserFactory`, `SecureXMLInputFactory`, `SecureTransformerFactory` and `SecureSchemaFactory` classes are now recognized as safely configured by the XXE query. +* A new extensible class `SafeXmlFactorySource` was added to `semmle.code.java.security.XmlParsers` for modeling sources of pre-hardened JAXP factories. + +### Minor Analysis Improvements + +* Added modeling for the Micronaut framework, including HTTP controllers, WebSocket endpoints, configuration injection, data access, security annotations, and HTTP client sinks. + ## 9.2.4 ### Minor Analysis Improvements diff --git a/java/ql/lib/change-notes/2026-02-27-micronaut.md b/java/ql/lib/change-notes/2026-02-27-micronaut.md deleted file mode 100644 index 36c978c372a7..000000000000 --- a/java/ql/lib/change-notes/2026-02-27-micronaut.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added modeling for the Micronaut framework, including HTTP controllers, WebSocket endpoints, configuration injection, data access, security annotations, and HTTP client sinks. diff --git a/java/ql/lib/change-notes/2026-08-02-apache-commons-secure-xml.md b/java/ql/lib/change-notes/released/9.3.0.md similarity index 65% rename from java/ql/lib/change-notes/2026-08-02-apache-commons-secure-xml.md rename to java/ql/lib/change-notes/released/9.3.0.md index 898255b12458..efabbd03ca3c 100644 --- a/java/ql/lib/change-notes/2026-08-02-apache-commons-secure-xml.md +++ b/java/ql/lib/change-notes/released/9.3.0.md @@ -1,5 +1,10 @@ ---- -category: feature ---- +## 9.3.0 + +### New Features + * Factories returned by the Apache Commons Secure XML (`org.apache.commons.xml.secure`) hardening library's `SecureDocumentBuilderFactory`, `SecureSAXParserFactory`, `SecureXMLInputFactory`, `SecureTransformerFactory` and `SecureSchemaFactory` classes are now recognized as safely configured by the XXE query. * A new extensible class `SafeXmlFactorySource` was added to `semmle.code.java.security.XmlParsers` for modeling sources of pre-hardened JAXP factories. + +### Minor Analysis Improvements + +* Added modeling for the Micronaut framework, including HTTP controllers, WebSocket endpoints, configuration injection, data access, security annotations, and HTTP client sinks. diff --git a/java/ql/lib/codeql-pack.release.yml b/java/ql/lib/codeql-pack.release.yml index 19834a650c92..a806354ee450 100644 --- a/java/ql/lib/codeql-pack.release.yml +++ b/java/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 9.2.4 +lastReleaseVersion: 9.3.0 diff --git a/java/ql/lib/qlpack.yml b/java/ql/lib/qlpack.yml index 0beb3b3caa70..d97a58c5c809 100644 --- a/java/ql/lib/qlpack.yml +++ b/java/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-all -version: 9.2.5-dev +version: 9.3.0 groups: java dbscheme: config/semmlecode.dbscheme extractor: java diff --git a/java/ql/src/CHANGELOG.md b/java/ql/src/CHANGELOG.md index 2ff710125824..0bb36a39ed24 100644 --- a/java/ql/src/CHANGELOG.md +++ b/java/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.11.10 + +No user-facing changes. + ## 1.11.9 No user-facing changes. diff --git a/java/ql/src/change-notes/released/1.11.10.md b/java/ql/src/change-notes/released/1.11.10.md new file mode 100644 index 000000000000..735d0b8ceb75 --- /dev/null +++ b/java/ql/src/change-notes/released/1.11.10.md @@ -0,0 +1,3 @@ +## 1.11.10 + +No user-facing changes. diff --git a/java/ql/src/codeql-pack.release.yml b/java/ql/src/codeql-pack.release.yml index ea2e740768c2..ae9cd379d8c8 100644 --- a/java/ql/src/codeql-pack.release.yml +++ b/java/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.11.9 +lastReleaseVersion: 1.11.10 diff --git a/java/ql/src/qlpack.yml b/java/ql/src/qlpack.yml index 6b312fc5dc44..9c3cffa047ca 100644 --- a/java/ql/src/qlpack.yml +++ b/java/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-queries -version: 1.11.10-dev +version: 1.11.10 groups: - java - queries diff --git a/javascript/ql/lib/CHANGELOG.md b/javascript/ql/lib/CHANGELOG.md index f83e33346d66..c4910f0c369c 100644 --- a/javascript/ql/lib/CHANGELOG.md +++ b/javascript/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.10.1 + +No user-facing changes. + ## 2.10.0 ### New Features diff --git a/javascript/ql/lib/change-notes/released/2.10.1.md b/javascript/ql/lib/change-notes/released/2.10.1.md new file mode 100644 index 000000000000..e1113832b1c6 --- /dev/null +++ b/javascript/ql/lib/change-notes/released/2.10.1.md @@ -0,0 +1,3 @@ +## 2.10.1 + +No user-facing changes. diff --git a/javascript/ql/lib/codeql-pack.release.yml b/javascript/ql/lib/codeql-pack.release.yml index ffff75a8d4c2..1366256715eb 100644 --- a/javascript/ql/lib/codeql-pack.release.yml +++ b/javascript/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.10.0 +lastReleaseVersion: 2.10.1 diff --git a/javascript/ql/lib/qlpack.yml b/javascript/ql/lib/qlpack.yml index 0a74e2c419ac..97f274ff58ae 100644 --- a/javascript/ql/lib/qlpack.yml +++ b/javascript/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-all -version: 2.10.1-dev +version: 2.10.1 groups: javascript dbscheme: semmlecode.javascript.dbscheme extractor: javascript diff --git a/javascript/ql/src/CHANGELOG.md b/javascript/ql/src/CHANGELOG.md index 9a958424d795..541393cea333 100644 --- a/javascript/ql/src/CHANGELOG.md +++ b/javascript/ql/src/CHANGELOG.md @@ -1,3 +1,9 @@ +## 2.4.5 + +### Minor Analysis Improvements + +* HTML files are now included in file-coverage stats, and will start showing up on the status page for CodeQL under "Scanned Files". + ## 2.4.4 ### Minor Analysis Improvements diff --git a/javascript/ql/src/change-notes/2026-09-02-html-coverage.md b/javascript/ql/src/change-notes/released/2.4.5.md similarity index 75% rename from javascript/ql/src/change-notes/2026-09-02-html-coverage.md rename to javascript/ql/src/change-notes/released/2.4.5.md index 793fd10845e1..1aa2fab3f616 100644 --- a/javascript/ql/src/change-notes/2026-09-02-html-coverage.md +++ b/javascript/ql/src/change-notes/released/2.4.5.md @@ -1,4 +1,5 @@ ---- -category: minorAnalysis ---- +## 2.4.5 + +### Minor Analysis Improvements + * HTML files are now included in file-coverage stats, and will start showing up on the status page for CodeQL under "Scanned Files". diff --git a/javascript/ql/src/codeql-pack.release.yml b/javascript/ql/src/codeql-pack.release.yml index 2facd66a43f4..4d5f66ce2c87 100644 --- a/javascript/ql/src/codeql-pack.release.yml +++ b/javascript/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.4.4 +lastReleaseVersion: 2.4.5 diff --git a/javascript/ql/src/qlpack.yml b/javascript/ql/src/qlpack.yml index bdefbdee61f7..83e2caff741c 100644 --- a/javascript/ql/src/qlpack.yml +++ b/javascript/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-queries -version: 2.4.5-dev +version: 2.4.5 groups: - javascript - queries diff --git a/misc/suite-helpers/CHANGELOG.md b/misc/suite-helpers/CHANGELOG.md index 097e573de503..4289e0e8c4f7 100644 --- a/misc/suite-helpers/CHANGELOG.md +++ b/misc/suite-helpers/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.57 + +No user-facing changes. + ## 1.0.56 No user-facing changes. diff --git a/misc/suite-helpers/change-notes/released/1.0.57.md b/misc/suite-helpers/change-notes/released/1.0.57.md new file mode 100644 index 000000000000..18a94c4bca4a --- /dev/null +++ b/misc/suite-helpers/change-notes/released/1.0.57.md @@ -0,0 +1,3 @@ +## 1.0.57 + +No user-facing changes. diff --git a/misc/suite-helpers/codeql-pack.release.yml b/misc/suite-helpers/codeql-pack.release.yml index 9bb27b4fdb71..08ea3909354f 100644 --- a/misc/suite-helpers/codeql-pack.release.yml +++ b/misc/suite-helpers/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.56 +lastReleaseVersion: 1.0.57 diff --git a/misc/suite-helpers/qlpack.yml b/misc/suite-helpers/qlpack.yml index be95f2ac4322..ba51f45be36f 100644 --- a/misc/suite-helpers/qlpack.yml +++ b/misc/suite-helpers/qlpack.yml @@ -1,4 +1,4 @@ name: codeql/suite-helpers -version: 1.0.57-dev +version: 1.0.57 groups: shared warnOnImplicitThis: true diff --git a/python/ql/lib/CHANGELOG.md b/python/ql/lib/CHANGELOG.md index 51d7011de576..ec64251b69d5 100644 --- a/python/ql/lib/CHANGELOG.md +++ b/python/ql/lib/CHANGELOG.md @@ -1,3 +1,10 @@ +## 7.2.5 + +### Bug Fixes + +* Fixed a bug where a Python file could be silently dropped from the analysis (with a spurious "A parse error occurred" diagnostic) when it contained a string literal, comment, or identifier with a character such as the U+FE0F emoji variation selector, a U+200D zero width joiner, or a combining accent. +* Fixed the extraction of PEP 758 `except A, B:` clauses by the default (non-tree-sitter) Python parser. Previously the second exception type was extracted as a Python 2 style alias binding, so it was recorded as a `Store` rather than a use. This caused false positives from queries that reason about whether a name is used, such as `py/unused-import`. When extracting Python 2 (`--lang=2`), `except A, e:` continues to bind `e` as an alias, since that is what the syntax means in that version. + ## 7.2.4 ### Minor Analysis Improvements diff --git a/python/ql/lib/change-notes/2026-08-27-tsg-parser-unicode-escapes.md b/python/ql/lib/change-notes/2026-08-27-tsg-parser-unicode-escapes.md deleted file mode 100644 index 56b70081d529..000000000000 --- a/python/ql/lib/change-notes/2026-08-27-tsg-parser-unicode-escapes.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: fix ---- -* Fixed a bug where a Python file could be silently dropped from the analysis (with a spurious "A parse error occurred" diagnostic) when it contained a string literal, comment, or identifier with a character such as the U+FE0F emoji variation selector, a U+200D zero width joiner, or a combining accent. diff --git a/python/ql/lib/change-notes/2026-08-19-legacy-parser-relaxed-except.md b/python/ql/lib/change-notes/released/7.2.5.md similarity index 60% rename from python/ql/lib/change-notes/2026-08-19-legacy-parser-relaxed-except.md rename to python/ql/lib/change-notes/released/7.2.5.md index 5e7681b2436f..c3e78fbb5fcc 100644 --- a/python/ql/lib/change-notes/2026-08-19-legacy-parser-relaxed-except.md +++ b/python/ql/lib/change-notes/released/7.2.5.md @@ -1,4 +1,6 @@ ---- -category: fix ---- +## 7.2.5 + +### Bug Fixes + +* Fixed a bug where a Python file could be silently dropped from the analysis (with a spurious "A parse error occurred" diagnostic) when it contained a string literal, comment, or identifier with a character such as the U+FE0F emoji variation selector, a U+200D zero width joiner, or a combining accent. * Fixed the extraction of PEP 758 `except A, B:` clauses by the default (non-tree-sitter) Python parser. Previously the second exception type was extracted as a Python 2 style alias binding, so it was recorded as a `Store` rather than a use. This caused false positives from queries that reason about whether a name is used, such as `py/unused-import`. When extracting Python 2 (`--lang=2`), `except A, e:` continues to bind `e` as an alias, since that is what the syntax means in that version. diff --git a/python/ql/lib/codeql-pack.release.yml b/python/ql/lib/codeql-pack.release.yml index 330556d11a76..c6aa7ff5b753 100644 --- a/python/ql/lib/codeql-pack.release.yml +++ b/python/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 7.2.4 +lastReleaseVersion: 7.2.5 diff --git a/python/ql/lib/qlpack.yml b/python/ql/lib/qlpack.yml index 46c4b9e2e00e..715a4f61bfc8 100644 --- a/python/ql/lib/qlpack.yml +++ b/python/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-all -version: 7.2.5-dev +version: 7.2.5 groups: python dbscheme: semmlecode.python.dbscheme extractor: python diff --git a/python/ql/src/CHANGELOG.md b/python/ql/src/CHANGELOG.md index da09ff7f9d50..874d180f72cc 100644 --- a/python/ql/src/CHANGELOG.md +++ b/python/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.8.10 + +No user-facing changes. + ## 1.8.9 No user-facing changes. diff --git a/python/ql/src/change-notes/released/1.8.10.md b/python/ql/src/change-notes/released/1.8.10.md new file mode 100644 index 000000000000..7a74b9d2cc34 --- /dev/null +++ b/python/ql/src/change-notes/released/1.8.10.md @@ -0,0 +1,3 @@ +## 1.8.10 + +No user-facing changes. diff --git a/python/ql/src/codeql-pack.release.yml b/python/ql/src/codeql-pack.release.yml index 2fed7501f873..b615673a3ce0 100644 --- a/python/ql/src/codeql-pack.release.yml +++ b/python/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.8.9 +lastReleaseVersion: 1.8.10 diff --git a/python/ql/src/qlpack.yml b/python/ql/src/qlpack.yml index 9778815a4631..d48bc1e8e7cc 100644 --- a/python/ql/src/qlpack.yml +++ b/python/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-queries -version: 1.8.10-dev +version: 1.8.10 groups: - python - queries diff --git a/ruby/ql/lib/CHANGELOG.md b/ruby/ql/lib/CHANGELOG.md index f9916662c642..056f71cef95e 100644 --- a/ruby/ql/lib/CHANGELOG.md +++ b/ruby/ql/lib/CHANGELOG.md @@ -1,3 +1,19 @@ +## 7.0.0 + +### Breaking Changes + +* The Ruby control flow graph implementation has been completely replaced. This + affects a number of queries slightly. The CFG now includes additional nodes + to more accurately represent certain constructs. This also means that any + existing code that implicitly relies on very specific details about the CFG + may need to be updated. The CFG no longer uses splitting, which means that + AST nodes now have a unique CFG node representation. In particular, + `ControlFlowNode.getAstNode` has changed its meaning. The AST-to-CFG mapping + remains one-to-many, but now for a different reason. It used to be because of + splitting, but now it's because of additional "helper" CFG nodes. To get the + (now canonical) CFG node for a given AST node, use + `Stmt.getControlFlowNode()` instead. + ## 6.0.4 ### Minor Analysis Improvements diff --git a/ruby/ql/lib/change-notes/2026-08-24-cfg-swap.md b/ruby/ql/lib/change-notes/released/7.0.0.md similarity index 96% rename from ruby/ql/lib/change-notes/2026-08-24-cfg-swap.md rename to ruby/ql/lib/change-notes/released/7.0.0.md index a428124f0a77..48882586df42 100644 --- a/ruby/ql/lib/change-notes/2026-08-24-cfg-swap.md +++ b/ruby/ql/lib/change-notes/released/7.0.0.md @@ -1,6 +1,7 @@ ---- -category: breaking ---- +## 7.0.0 + +### Breaking Changes + * The Ruby control flow graph implementation has been completely replaced. This affects a number of queries slightly. The CFG now includes additional nodes to more accurately represent certain constructs. This also means that any diff --git a/ruby/ql/lib/codeql-pack.release.yml b/ruby/ql/lib/codeql-pack.release.yml index ae1f15cd344a..e0db21c78694 100644 --- a/ruby/ql/lib/codeql-pack.release.yml +++ b/ruby/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 6.0.4 +lastReleaseVersion: 7.0.0 diff --git a/ruby/ql/lib/qlpack.yml b/ruby/ql/lib/qlpack.yml index 8071a411828b..2c52daba2b15 100644 --- a/ruby/ql/lib/qlpack.yml +++ b/ruby/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-all -version: 6.0.5-dev +version: 7.0.0 groups: ruby extractor: ruby dbscheme: ruby.dbscheme diff --git a/ruby/ql/src/CHANGELOG.md b/ruby/ql/src/CHANGELOG.md index 312e56c3716e..c8a0fd7cbbc3 100644 --- a/ruby/ql/src/CHANGELOG.md +++ b/ruby/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.6.10 + +No user-facing changes. + ## 1.6.9 No user-facing changes. diff --git a/ruby/ql/src/change-notes/released/1.6.10.md b/ruby/ql/src/change-notes/released/1.6.10.md new file mode 100644 index 000000000000..0c6a14492ed0 --- /dev/null +++ b/ruby/ql/src/change-notes/released/1.6.10.md @@ -0,0 +1,3 @@ +## 1.6.10 + +No user-facing changes. diff --git a/ruby/ql/src/codeql-pack.release.yml b/ruby/ql/src/codeql-pack.release.yml index 018779df35eb..995e7a94a564 100644 --- a/ruby/ql/src/codeql-pack.release.yml +++ b/ruby/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.6.9 +lastReleaseVersion: 1.6.10 diff --git a/ruby/ql/src/qlpack.yml b/ruby/ql/src/qlpack.yml index 872cf18c8e03..a215aec72b83 100644 --- a/ruby/ql/src/qlpack.yml +++ b/ruby/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-queries -version: 1.6.10-dev +version: 1.6.10 groups: - ruby - queries diff --git a/rust/ql/lib/CHANGELOG.md b/rust/ql/lib/CHANGELOG.md index 4ec33279ba1b..26e0631f2ced 100644 --- a/rust/ql/lib/CHANGELOG.md +++ b/rust/ql/lib/CHANGELOG.md @@ -1,3 +1,11 @@ +## 0.2.21 + +### Minor Analysis Improvements + +* Canonical paths for Rust trait items now use the format `::item` instead of + `crate::Trait::item`. Custom data extension models that reference trait items must be + updated to use the new format. + ## 0.2.20 ### Major Analysis Improvements diff --git a/rust/ql/lib/change-notes/2026-08-28-angle-bracket-trait-canonical-paths.md b/rust/ql/lib/change-notes/released/0.2.21.md similarity index 82% rename from rust/ql/lib/change-notes/2026-08-28-angle-bracket-trait-canonical-paths.md rename to rust/ql/lib/change-notes/released/0.2.21.md index 280f78d5555b..bf7b2c0c0178 100644 --- a/rust/ql/lib/change-notes/2026-08-28-angle-bracket-trait-canonical-paths.md +++ b/rust/ql/lib/change-notes/released/0.2.21.md @@ -1,6 +1,7 @@ ---- -category: minorAnalysis ---- +## 0.2.21 + +### Minor Analysis Improvements + * Canonical paths for Rust trait items now use the format `::item` instead of `crate::Trait::item`. Custom data extension models that reference trait items must be updated to use the new format. diff --git a/rust/ql/lib/codeql-pack.release.yml b/rust/ql/lib/codeql-pack.release.yml index 7c91e0e29ffa..8d4f094a4664 100644 --- a/rust/ql/lib/codeql-pack.release.yml +++ b/rust/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.2.20 +lastReleaseVersion: 0.2.21 diff --git a/rust/ql/lib/qlpack.yml b/rust/ql/lib/qlpack.yml index 59a2c38c8a2b..dc1059ff64c5 100644 --- a/rust/ql/lib/qlpack.yml +++ b/rust/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rust-all -version: 0.2.21-dev +version: 0.2.21 groups: rust extractor: rust dbscheme: rust.dbscheme diff --git a/rust/ql/src/CHANGELOG.md b/rust/ql/src/CHANGELOG.md index 5a8f3ea1b9a5..91b75ac72346 100644 --- a/rust/ql/src/CHANGELOG.md +++ b/rust/ql/src/CHANGELOG.md @@ -1,3 +1,15 @@ +## 0.1.42 + +### New Queries + +* Added a new query, `rust/command-line-injection`, to detect uncontrolled command lines. + +### Minor Analysis Improvements + +* The `rust/hard-coded-cryptographic-value` query has been adjusted to produce +fewer results in certain situations where many results were being produced with very similar source locations. +* The `rust/unused-variable` query no longer reports variables in functions containing the standard `todo!()` or `unimplemented!()` macros. + ## 0.1.41 No user-facing changes. diff --git a/rust/ql/src/change-notes/2026-08-11-command-injection.md b/rust/ql/src/change-notes/2026-08-11-command-injection.md deleted file mode 100644 index 2175cc9cdf18..000000000000 --- a/rust/ql/src/change-notes/2026-08-11-command-injection.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: newQuery ---- -* Added a new query, `rust/command-line-injection`, to detect uncontrolled command lines. diff --git a/rust/ql/src/change-notes/2026-08-20-unused-variables-in-incomplete-functions.md b/rust/ql/src/change-notes/2026-08-20-unused-variables-in-incomplete-functions.md deleted file mode 100644 index 882c91178175..000000000000 --- a/rust/ql/src/change-notes/2026-08-20-unused-variables-in-incomplete-functions.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The `rust/unused-variable` query no longer reports variables in functions containing the standard `todo!()` or `unimplemented!()` macros. \ No newline at end of file diff --git a/rust/ql/src/change-notes/2026-08-25-hardcoded-cryptographic-match-expressions.md b/rust/ql/src/change-notes/2026-08-25-hardcoded-cryptographic-match-expressions.md deleted file mode 100644 index b2c71664f87a..000000000000 --- a/rust/ql/src/change-notes/2026-08-25-hardcoded-cryptographic-match-expressions.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: minorAnalysis ---- -* The `rust/hard-coded-cryptographic-value` query has been adjusted to produce -fewer results in certain situations where many results were being produced with very similar source locations. diff --git a/rust/ql/src/change-notes/released/0.1.42.md b/rust/ql/src/change-notes/released/0.1.42.md new file mode 100644 index 000000000000..617d6a48de02 --- /dev/null +++ b/rust/ql/src/change-notes/released/0.1.42.md @@ -0,0 +1,11 @@ +## 0.1.42 + +### New Queries + +* Added a new query, `rust/command-line-injection`, to detect uncontrolled command lines. + +### Minor Analysis Improvements + +* The `rust/hard-coded-cryptographic-value` query has been adjusted to produce +fewer results in certain situations where many results were being produced with very similar source locations. +* The `rust/unused-variable` query no longer reports variables in functions containing the standard `todo!()` or `unimplemented!()` macros. diff --git a/rust/ql/src/codeql-pack.release.yml b/rust/ql/src/codeql-pack.release.yml index 38f91b8ed622..55593f737cc9 100644 --- a/rust/ql/src/codeql-pack.release.yml +++ b/rust/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.1.41 +lastReleaseVersion: 0.1.42 diff --git a/rust/ql/src/qlpack.yml b/rust/ql/src/qlpack.yml index b4048003f9cf..2e13de282d58 100644 --- a/rust/ql/src/qlpack.yml +++ b/rust/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rust-queries -version: 0.1.42-dev +version: 0.1.42 groups: - rust - queries diff --git a/shared/concepts/CHANGELOG.md b/shared/concepts/CHANGELOG.md index 6a88efccf19f..e399ac467e78 100644 --- a/shared/concepts/CHANGELOG.md +++ b/shared/concepts/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.31 + +No user-facing changes. + ## 0.0.30 No user-facing changes. diff --git a/shared/concepts/change-notes/released/0.0.31.md b/shared/concepts/change-notes/released/0.0.31.md new file mode 100644 index 000000000000..99e11d52c92a --- /dev/null +++ b/shared/concepts/change-notes/released/0.0.31.md @@ -0,0 +1,3 @@ +## 0.0.31 + +No user-facing changes. diff --git a/shared/concepts/codeql-pack.release.yml b/shared/concepts/codeql-pack.release.yml index 0c61b463bab3..54b504d06ecb 100644 --- a/shared/concepts/codeql-pack.release.yml +++ b/shared/concepts/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.30 +lastReleaseVersion: 0.0.31 diff --git a/shared/concepts/qlpack.yml b/shared/concepts/qlpack.yml index 6a1db5dc8858..f5005081b57a 100644 --- a/shared/concepts/qlpack.yml +++ b/shared/concepts/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/concepts -version: 0.0.31-dev +version: 0.0.31 groups: shared library: true dependencies: diff --git a/shared/controlflow/CHANGELOG.md b/shared/controlflow/CHANGELOG.md index 76ba233c908f..5edd14954f3e 100644 --- a/shared/controlflow/CHANGELOG.md +++ b/shared/controlflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.41 + +No user-facing changes. + ## 2.0.40 No user-facing changes. diff --git a/shared/controlflow/change-notes/released/2.0.41.md b/shared/controlflow/change-notes/released/2.0.41.md new file mode 100644 index 000000000000..5b519388ce82 --- /dev/null +++ b/shared/controlflow/change-notes/released/2.0.41.md @@ -0,0 +1,3 @@ +## 2.0.41 + +No user-facing changes. diff --git a/shared/controlflow/codeql-pack.release.yml b/shared/controlflow/codeql-pack.release.yml index df31666e556c..dcd61b02de59 100644 --- a/shared/controlflow/codeql-pack.release.yml +++ b/shared/controlflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.40 +lastReleaseVersion: 2.0.41 diff --git a/shared/controlflow/qlpack.yml b/shared/controlflow/qlpack.yml index 9c7448a0c159..fd5bfcb78586 100644 --- a/shared/controlflow/qlpack.yml +++ b/shared/controlflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/controlflow -version: 2.0.41-dev +version: 2.0.41 groups: shared library: true dependencies: diff --git a/shared/dataflow/CHANGELOG.md b/shared/dataflow/CHANGELOG.md index 17b7451f2d4d..f42b3d852dc7 100644 --- a/shared/dataflow/CHANGELOG.md +++ b/shared/dataflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.1.13 + +No user-facing changes. + ## 2.1.12 No user-facing changes. diff --git a/shared/dataflow/change-notes/released/2.1.13.md b/shared/dataflow/change-notes/released/2.1.13.md new file mode 100644 index 000000000000..52b732297b8c --- /dev/null +++ b/shared/dataflow/change-notes/released/2.1.13.md @@ -0,0 +1,3 @@ +## 2.1.13 + +No user-facing changes. diff --git a/shared/dataflow/codeql-pack.release.yml b/shared/dataflow/codeql-pack.release.yml index 64ef0f5a22c1..77d1ddbc8f91 100644 --- a/shared/dataflow/codeql-pack.release.yml +++ b/shared/dataflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.1.12 +lastReleaseVersion: 2.1.13 diff --git a/shared/dataflow/qlpack.yml b/shared/dataflow/qlpack.yml index 133b33e834d8..09e851c73c93 100644 --- a/shared/dataflow/qlpack.yml +++ b/shared/dataflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/dataflow -version: 2.1.13-dev +version: 2.1.13 groups: shared library: true dependencies: diff --git a/shared/mad/CHANGELOG.md b/shared/mad/CHANGELOG.md index 1f510be02756..0aa8d83bb6fa 100644 --- a/shared/mad/CHANGELOG.md +++ b/shared/mad/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.57 + +No user-facing changes. + ## 1.0.56 No user-facing changes. diff --git a/shared/mad/change-notes/released/1.0.57.md b/shared/mad/change-notes/released/1.0.57.md new file mode 100644 index 000000000000..18a94c4bca4a --- /dev/null +++ b/shared/mad/change-notes/released/1.0.57.md @@ -0,0 +1,3 @@ +## 1.0.57 + +No user-facing changes. diff --git a/shared/mad/codeql-pack.release.yml b/shared/mad/codeql-pack.release.yml index 9bb27b4fdb71..08ea3909354f 100644 --- a/shared/mad/codeql-pack.release.yml +++ b/shared/mad/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.56 +lastReleaseVersion: 1.0.57 diff --git a/shared/mad/qlpack.yml b/shared/mad/qlpack.yml index 28a84ca5aa86..e350a3a2ddbd 100644 --- a/shared/mad/qlpack.yml +++ b/shared/mad/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/mad -version: 1.0.57-dev +version: 1.0.57 groups: shared library: true dependencies: diff --git a/shared/namebinding/CHANGELOG.md b/shared/namebinding/CHANGELOG.md index 9b269441c000..ad2e63eb4709 100644 --- a/shared/namebinding/CHANGELOG.md +++ b/shared/namebinding/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.6 + +No user-facing changes. + ## 0.0.5 No user-facing changes. diff --git a/shared/namebinding/change-notes/released/0.0.6.md b/shared/namebinding/change-notes/released/0.0.6.md new file mode 100644 index 000000000000..ccbce856079d --- /dev/null +++ b/shared/namebinding/change-notes/released/0.0.6.md @@ -0,0 +1,3 @@ +## 0.0.6 + +No user-facing changes. diff --git a/shared/namebinding/codeql-pack.release.yml b/shared/namebinding/codeql-pack.release.yml index bb45a1ab0182..cf398ce02aa4 100644 --- a/shared/namebinding/codeql-pack.release.yml +++ b/shared/namebinding/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.5 +lastReleaseVersion: 0.0.6 diff --git a/shared/namebinding/qlpack.yml b/shared/namebinding/qlpack.yml index 6ab033915b70..f18af62921c4 100644 --- a/shared/namebinding/qlpack.yml +++ b/shared/namebinding/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/namebinding -version: 0.0.6-dev +version: 0.0.6 groups: shared library: true dependencies: diff --git a/shared/quantum/CHANGELOG.md b/shared/quantum/CHANGELOG.md index fd3064b1a947..4916c26d385a 100644 --- a/shared/quantum/CHANGELOG.md +++ b/shared/quantum/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.35 + +No user-facing changes. + ## 0.0.34 No user-facing changes. diff --git a/shared/quantum/change-notes/released/0.0.35.md b/shared/quantum/change-notes/released/0.0.35.md new file mode 100644 index 000000000000..1ffec5217282 --- /dev/null +++ b/shared/quantum/change-notes/released/0.0.35.md @@ -0,0 +1,3 @@ +## 0.0.35 + +No user-facing changes. diff --git a/shared/quantum/codeql-pack.release.yml b/shared/quantum/codeql-pack.release.yml index 6fb3b6253bb9..143c97892032 100644 --- a/shared/quantum/codeql-pack.release.yml +++ b/shared/quantum/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.34 +lastReleaseVersion: 0.0.35 diff --git a/shared/quantum/qlpack.yml b/shared/quantum/qlpack.yml index 73a8ef49ee5c..83384e926bcb 100644 --- a/shared/quantum/qlpack.yml +++ b/shared/quantum/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/quantum -version: 0.0.35-dev +version: 0.0.35 groups: shared library: true dependencies: diff --git a/shared/rangeanalysis/CHANGELOG.md b/shared/rangeanalysis/CHANGELOG.md index d3e4d9e87c60..965a43bc55b1 100644 --- a/shared/rangeanalysis/CHANGELOG.md +++ b/shared/rangeanalysis/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.57 + +No user-facing changes. + ## 1.0.56 No user-facing changes. diff --git a/shared/rangeanalysis/change-notes/released/1.0.57.md b/shared/rangeanalysis/change-notes/released/1.0.57.md new file mode 100644 index 000000000000..18a94c4bca4a --- /dev/null +++ b/shared/rangeanalysis/change-notes/released/1.0.57.md @@ -0,0 +1,3 @@ +## 1.0.57 + +No user-facing changes. diff --git a/shared/rangeanalysis/codeql-pack.release.yml b/shared/rangeanalysis/codeql-pack.release.yml index 9bb27b4fdb71..08ea3909354f 100644 --- a/shared/rangeanalysis/codeql-pack.release.yml +++ b/shared/rangeanalysis/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.56 +lastReleaseVersion: 1.0.57 diff --git a/shared/rangeanalysis/qlpack.yml b/shared/rangeanalysis/qlpack.yml index c7a74dae7c26..2b0eb43866da 100644 --- a/shared/rangeanalysis/qlpack.yml +++ b/shared/rangeanalysis/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rangeanalysis -version: 1.0.57-dev +version: 1.0.57 groups: shared library: true dependencies: diff --git a/shared/regex/CHANGELOG.md b/shared/regex/CHANGELOG.md index 327845009d11..20e772df81ad 100644 --- a/shared/regex/CHANGELOG.md +++ b/shared/regex/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.57 + +No user-facing changes. + ## 1.0.56 No user-facing changes. diff --git a/shared/regex/change-notes/released/1.0.57.md b/shared/regex/change-notes/released/1.0.57.md new file mode 100644 index 000000000000..18a94c4bca4a --- /dev/null +++ b/shared/regex/change-notes/released/1.0.57.md @@ -0,0 +1,3 @@ +## 1.0.57 + +No user-facing changes. diff --git a/shared/regex/codeql-pack.release.yml b/shared/regex/codeql-pack.release.yml index 9bb27b4fdb71..08ea3909354f 100644 --- a/shared/regex/codeql-pack.release.yml +++ b/shared/regex/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.56 +lastReleaseVersion: 1.0.57 diff --git a/shared/regex/qlpack.yml b/shared/regex/qlpack.yml index 2afdc58e3d11..d4ad24634326 100644 --- a/shared/regex/qlpack.yml +++ b/shared/regex/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/regex -version: 1.0.57-dev +version: 1.0.57 groups: shared library: true dependencies: diff --git a/shared/ssa/CHANGELOG.md b/shared/ssa/CHANGELOG.md index 1cc5dec08b82..1ed23b3a72b6 100644 --- a/shared/ssa/CHANGELOG.md +++ b/shared/ssa/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.33 + +No user-facing changes. + ## 2.0.32 No user-facing changes. diff --git a/shared/ssa/change-notes/released/2.0.33.md b/shared/ssa/change-notes/released/2.0.33.md new file mode 100644 index 000000000000..d33a61332cf3 --- /dev/null +++ b/shared/ssa/change-notes/released/2.0.33.md @@ -0,0 +1,3 @@ +## 2.0.33 + +No user-facing changes. diff --git a/shared/ssa/codeql-pack.release.yml b/shared/ssa/codeql-pack.release.yml index 483a0d5db8ec..92e23200b4d6 100644 --- a/shared/ssa/codeql-pack.release.yml +++ b/shared/ssa/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.32 +lastReleaseVersion: 2.0.33 diff --git a/shared/ssa/qlpack.yml b/shared/ssa/qlpack.yml index c5c7755b1755..92b8603a9d6e 100644 --- a/shared/ssa/qlpack.yml +++ b/shared/ssa/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ssa -version: 2.0.33-dev +version: 2.0.33 groups: shared library: true dependencies: diff --git a/shared/threat-models/CHANGELOG.md b/shared/threat-models/CHANGELOG.md index 7a0754e81b29..3a71bc3b5561 100644 --- a/shared/threat-models/CHANGELOG.md +++ b/shared/threat-models/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.57 + +No user-facing changes. + ## 1.0.56 No user-facing changes. diff --git a/shared/threat-models/change-notes/released/1.0.57.md b/shared/threat-models/change-notes/released/1.0.57.md new file mode 100644 index 000000000000..18a94c4bca4a --- /dev/null +++ b/shared/threat-models/change-notes/released/1.0.57.md @@ -0,0 +1,3 @@ +## 1.0.57 + +No user-facing changes. diff --git a/shared/threat-models/codeql-pack.release.yml b/shared/threat-models/codeql-pack.release.yml index 9bb27b4fdb71..08ea3909354f 100644 --- a/shared/threat-models/codeql-pack.release.yml +++ b/shared/threat-models/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.56 +lastReleaseVersion: 1.0.57 diff --git a/shared/threat-models/qlpack.yml b/shared/threat-models/qlpack.yml index a29a2c7dc6a0..a51fdda87b7f 100644 --- a/shared/threat-models/qlpack.yml +++ b/shared/threat-models/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/threat-models -version: 1.0.57-dev +version: 1.0.57 library: true groups: shared dataExtensions: diff --git a/shared/tutorial/CHANGELOG.md b/shared/tutorial/CHANGELOG.md index df769dd96aec..b3541e1248f5 100644 --- a/shared/tutorial/CHANGELOG.md +++ b/shared/tutorial/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.57 + +No user-facing changes. + ## 1.0.56 No user-facing changes. diff --git a/shared/tutorial/change-notes/released/1.0.57.md b/shared/tutorial/change-notes/released/1.0.57.md new file mode 100644 index 000000000000..18a94c4bca4a --- /dev/null +++ b/shared/tutorial/change-notes/released/1.0.57.md @@ -0,0 +1,3 @@ +## 1.0.57 + +No user-facing changes. diff --git a/shared/tutorial/codeql-pack.release.yml b/shared/tutorial/codeql-pack.release.yml index 9bb27b4fdb71..08ea3909354f 100644 --- a/shared/tutorial/codeql-pack.release.yml +++ b/shared/tutorial/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.56 +lastReleaseVersion: 1.0.57 diff --git a/shared/tutorial/qlpack.yml b/shared/tutorial/qlpack.yml index b94e0b81dadc..2c2dde8c1793 100644 --- a/shared/tutorial/qlpack.yml +++ b/shared/tutorial/qlpack.yml @@ -1,7 +1,7 @@ name: codeql/tutorial description: Library for the CodeQL detective tutorials, helping new users learn to write CodeQL queries. -version: 1.0.57-dev +version: 1.0.57 groups: shared library: true warnOnImplicitThis: true diff --git a/shared/typeflow/CHANGELOG.md b/shared/typeflow/CHANGELOG.md index 28d0101ccf54..ad7f55dd34bd 100644 --- a/shared/typeflow/CHANGELOG.md +++ b/shared/typeflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.57 + +No user-facing changes. + ## 1.0.56 No user-facing changes. diff --git a/shared/typeflow/change-notes/released/1.0.57.md b/shared/typeflow/change-notes/released/1.0.57.md new file mode 100644 index 000000000000..18a94c4bca4a --- /dev/null +++ b/shared/typeflow/change-notes/released/1.0.57.md @@ -0,0 +1,3 @@ +## 1.0.57 + +No user-facing changes. diff --git a/shared/typeflow/codeql-pack.release.yml b/shared/typeflow/codeql-pack.release.yml index 9bb27b4fdb71..08ea3909354f 100644 --- a/shared/typeflow/codeql-pack.release.yml +++ b/shared/typeflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.56 +lastReleaseVersion: 1.0.57 diff --git a/shared/typeflow/qlpack.yml b/shared/typeflow/qlpack.yml index 0475b6bf7325..6ea63f761cdd 100644 --- a/shared/typeflow/qlpack.yml +++ b/shared/typeflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeflow -version: 1.0.57-dev +version: 1.0.57 groups: shared library: true dependencies: diff --git a/shared/typeinference/CHANGELOG.md b/shared/typeinference/CHANGELOG.md index e34fb7c21ba1..6ab8c640bc68 100644 --- a/shared/typeinference/CHANGELOG.md +++ b/shared/typeinference/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.38 + +No user-facing changes. + ## 0.0.37 No user-facing changes. diff --git a/shared/typeinference/change-notes/released/0.0.38.md b/shared/typeinference/change-notes/released/0.0.38.md new file mode 100644 index 000000000000..6aef3fb33021 --- /dev/null +++ b/shared/typeinference/change-notes/released/0.0.38.md @@ -0,0 +1,3 @@ +## 0.0.38 + +No user-facing changes. diff --git a/shared/typeinference/codeql-pack.release.yml b/shared/typeinference/codeql-pack.release.yml index 7982dda40f4c..078a0e3aff01 100644 --- a/shared/typeinference/codeql-pack.release.yml +++ b/shared/typeinference/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.37 +lastReleaseVersion: 0.0.38 diff --git a/shared/typeinference/qlpack.yml b/shared/typeinference/qlpack.yml index 3cd87a73bdc2..5cabb023ce1e 100644 --- a/shared/typeinference/qlpack.yml +++ b/shared/typeinference/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeinference -version: 0.0.38-dev +version: 0.0.38 groups: shared library: true dependencies: diff --git a/shared/typetracking/CHANGELOG.md b/shared/typetracking/CHANGELOG.md index 60257ae7e1e0..2c6907a4eaae 100644 --- a/shared/typetracking/CHANGELOG.md +++ b/shared/typetracking/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.41 + +No user-facing changes. + ## 2.0.40 No user-facing changes. diff --git a/shared/typetracking/change-notes/released/2.0.41.md b/shared/typetracking/change-notes/released/2.0.41.md new file mode 100644 index 000000000000..5b519388ce82 --- /dev/null +++ b/shared/typetracking/change-notes/released/2.0.41.md @@ -0,0 +1,3 @@ +## 2.0.41 + +No user-facing changes. diff --git a/shared/typetracking/codeql-pack.release.yml b/shared/typetracking/codeql-pack.release.yml index df31666e556c..dcd61b02de59 100644 --- a/shared/typetracking/codeql-pack.release.yml +++ b/shared/typetracking/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.40 +lastReleaseVersion: 2.0.41 diff --git a/shared/typetracking/qlpack.yml b/shared/typetracking/qlpack.yml index eff084212ba2..854d8bae6da0 100644 --- a/shared/typetracking/qlpack.yml +++ b/shared/typetracking/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typetracking -version: 2.0.41-dev +version: 2.0.41 groups: shared library: true dependencies: diff --git a/shared/typos/CHANGELOG.md b/shared/typos/CHANGELOG.md index a43daa8503c9..503f9fa3d4f0 100644 --- a/shared/typos/CHANGELOG.md +++ b/shared/typos/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.57 + +No user-facing changes. + ## 1.0.56 No user-facing changes. diff --git a/shared/typos/change-notes/released/1.0.57.md b/shared/typos/change-notes/released/1.0.57.md new file mode 100644 index 000000000000..18a94c4bca4a --- /dev/null +++ b/shared/typos/change-notes/released/1.0.57.md @@ -0,0 +1,3 @@ +## 1.0.57 + +No user-facing changes. diff --git a/shared/typos/codeql-pack.release.yml b/shared/typos/codeql-pack.release.yml index 9bb27b4fdb71..08ea3909354f 100644 --- a/shared/typos/codeql-pack.release.yml +++ b/shared/typos/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.56 +lastReleaseVersion: 1.0.57 diff --git a/shared/typos/qlpack.yml b/shared/typos/qlpack.yml index 5933bd6862a1..712073d7668a 100644 --- a/shared/typos/qlpack.yml +++ b/shared/typos/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typos -version: 1.0.57-dev +version: 1.0.57 groups: shared library: true warnOnImplicitThis: true diff --git a/shared/util/CHANGELOG.md b/shared/util/CHANGELOG.md index 194ea712d2ad..68a57b6e1bbc 100644 --- a/shared/util/CHANGELOG.md +++ b/shared/util/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.44 + +No user-facing changes. + ## 2.0.43 No user-facing changes. diff --git a/shared/util/change-notes/released/2.0.44.md b/shared/util/change-notes/released/2.0.44.md new file mode 100644 index 000000000000..47addacab148 --- /dev/null +++ b/shared/util/change-notes/released/2.0.44.md @@ -0,0 +1,3 @@ +## 2.0.44 + +No user-facing changes. diff --git a/shared/util/codeql-pack.release.yml b/shared/util/codeql-pack.release.yml index 26126cee2c6b..2032d0ef8b3f 100644 --- a/shared/util/codeql-pack.release.yml +++ b/shared/util/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.43 +lastReleaseVersion: 2.0.44 diff --git a/shared/util/qlpack.yml b/shared/util/qlpack.yml index c8f2c7a57343..76bb1b6957a2 100644 --- a/shared/util/qlpack.yml +++ b/shared/util/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/util -version: 2.0.44-dev +version: 2.0.44 groups: shared library: true dependencies: null diff --git a/shared/xml/CHANGELOG.md b/shared/xml/CHANGELOG.md index 8d1557082db1..19444d2622d1 100644 --- a/shared/xml/CHANGELOG.md +++ b/shared/xml/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.57 + +No user-facing changes. + ## 1.0.56 No user-facing changes. diff --git a/shared/xml/change-notes/released/1.0.57.md b/shared/xml/change-notes/released/1.0.57.md new file mode 100644 index 000000000000..18a94c4bca4a --- /dev/null +++ b/shared/xml/change-notes/released/1.0.57.md @@ -0,0 +1,3 @@ +## 1.0.57 + +No user-facing changes. diff --git a/shared/xml/codeql-pack.release.yml b/shared/xml/codeql-pack.release.yml index 9bb27b4fdb71..08ea3909354f 100644 --- a/shared/xml/codeql-pack.release.yml +++ b/shared/xml/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.56 +lastReleaseVersion: 1.0.57 diff --git a/shared/xml/qlpack.yml b/shared/xml/qlpack.yml index 71a98a37b522..c9251eb88c4d 100644 --- a/shared/xml/qlpack.yml +++ b/shared/xml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/xml -version: 1.0.57-dev +version: 1.0.57 groups: shared library: true dependencies: diff --git a/shared/yaml/CHANGELOG.md b/shared/yaml/CHANGELOG.md index 5a2e1a8833b0..8835951f9c51 100644 --- a/shared/yaml/CHANGELOG.md +++ b/shared/yaml/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.57 + +No user-facing changes. + ## 1.0.56 No user-facing changes. diff --git a/shared/yaml/change-notes/released/1.0.57.md b/shared/yaml/change-notes/released/1.0.57.md new file mode 100644 index 000000000000..18a94c4bca4a --- /dev/null +++ b/shared/yaml/change-notes/released/1.0.57.md @@ -0,0 +1,3 @@ +## 1.0.57 + +No user-facing changes. diff --git a/shared/yaml/codeql-pack.release.yml b/shared/yaml/codeql-pack.release.yml index 9bb27b4fdb71..08ea3909354f 100644 --- a/shared/yaml/codeql-pack.release.yml +++ b/shared/yaml/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.56 +lastReleaseVersion: 1.0.57 diff --git a/shared/yaml/qlpack.yml b/shared/yaml/qlpack.yml index 83ede2e7653b..ccc990b27d02 100644 --- a/shared/yaml/qlpack.yml +++ b/shared/yaml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/yaml -version: 1.0.57-dev +version: 1.0.57 groups: shared library: true warnOnImplicitThis: true diff --git a/swift/ql/lib/CHANGELOG.md b/swift/ql/lib/CHANGELOG.md index e71c0491bc0a..b907f330f976 100644 --- a/swift/ql/lib/CHANGELOG.md +++ b/swift/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 6.8.3 + +No user-facing changes. + ## 6.8.2 No user-facing changes. diff --git a/swift/ql/lib/change-notes/released/6.8.3.md b/swift/ql/lib/change-notes/released/6.8.3.md new file mode 100644 index 000000000000..d35c1fbb4ff4 --- /dev/null +++ b/swift/ql/lib/change-notes/released/6.8.3.md @@ -0,0 +1,3 @@ +## 6.8.3 + +No user-facing changes. diff --git a/swift/ql/lib/codeql-pack.release.yml b/swift/ql/lib/codeql-pack.release.yml index 42fdf5962a78..de8d19f816cf 100644 --- a/swift/ql/lib/codeql-pack.release.yml +++ b/swift/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 6.8.2 +lastReleaseVersion: 6.8.3 diff --git a/swift/ql/lib/qlpack.yml b/swift/ql/lib/qlpack.yml index f539a679b130..dd31b62e1481 100644 --- a/swift/ql/lib/qlpack.yml +++ b/swift/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-all -version: 6.8.3-dev +version: 6.8.3 groups: swift extractor: swift dbscheme: swift.dbscheme diff --git a/swift/ql/src/CHANGELOG.md b/swift/ql/src/CHANGELOG.md index 25dde1dc3ab1..f828ae84a5ac 100644 --- a/swift/ql/src/CHANGELOG.md +++ b/swift/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.3.10 + +No user-facing changes. + ## 1.3.9 No user-facing changes. diff --git a/swift/ql/src/change-notes/released/1.3.10.md b/swift/ql/src/change-notes/released/1.3.10.md new file mode 100644 index 000000000000..182c8ffe713a --- /dev/null +++ b/swift/ql/src/change-notes/released/1.3.10.md @@ -0,0 +1,3 @@ +## 1.3.10 + +No user-facing changes. diff --git a/swift/ql/src/codeql-pack.release.yml b/swift/ql/src/codeql-pack.release.yml index 5ce113f4464d..eb79ac3dca3f 100644 --- a/swift/ql/src/codeql-pack.release.yml +++ b/swift/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.3.9 +lastReleaseVersion: 1.3.10 diff --git a/swift/ql/src/qlpack.yml b/swift/ql/src/qlpack.yml index ca8bf05e942d..fd6ec0e549bc 100644 --- a/swift/ql/src/qlpack.yml +++ b/swift/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-queries -version: 1.3.10-dev +version: 1.3.10 groups: - swift - queries From 3dcfd08f929f259ae6de5c88154047fc43ad6aa1 Mon Sep 17 00:00:00 2001 From: Taus Date: Wed, 2 Sep 2026 11:52:49 +0000 Subject: [PATCH 0693/2098] Python: Add telemetry for parser usage Adds statistics on how many files were extracted using the old parser and using the tree-sitter parser. Because parsing is done in parallel across many workers, I opted not to consolidate these statistics for the entire run. Instead, we emit the statistics for each worker and then need to aggregate themselves after the telemetry has been ingested. (In practice the number of workers is ~16 at most, so is unlikely to be an issue.) In terms of implementation, I opted to simply extend the existing `DiagnosticsWriter` object (instantiatied once per worker) with methods for counting the number of parsed files, and then thread this object through to `modules.py` where the magic happens. Finally, this also required instantiating such an object in cases where we call directly into the extractor for debugging purposes (e.g. dumping the AST or CFG). Note that in these cases we do not actually print any diagnostics, so it's harmless to create these objects. As for tests, we add a new separate CLI integration test that checks the behaviour against a database that contains two files -- one that can be parsed with the old parser and one that requires the new one. The existing diagnostics test is modified slightly so that it ignores these statistics (as we cannot guarantee their exact form due to worker nondeterminism). --- .../parser-telemetry/repo_dir/old_parser.py | 1 + .../repo_dir/tree_sitter_parser.py | 3 + .../parser-telemetry/test.sh | 17 +++ .../parser-telemetry/test_parser_telemetry.py | 25 +++++ .../test_diagnostics_output.py | 9 +- .../semmle/extractors/module_printer.py | 4 +- .../semmle/extractors/py_extractor.py | 3 +- python/extractor/semmle/logging.py | 8 ++ python/extractor/semmle/python/finder.py | 4 +- python/extractor/semmle/python/modules.py | 5 +- .../semmle/python/parser/dump_ast.py | 3 +- python/extractor/semmle/python/passes/flow.py | 3 +- python/extractor/semmle/worker.py | 25 ++++- python/extractor/tests/test_diagnostics.py | 105 ++++++++++++++++++ 14 files changed, 205 insertions(+), 10 deletions(-) create mode 100644 python/extractor/cli-integration-test/parser-telemetry/repo_dir/old_parser.py create mode 100644 python/extractor/cli-integration-test/parser-telemetry/repo_dir/tree_sitter_parser.py create mode 100755 python/extractor/cli-integration-test/parser-telemetry/test.sh create mode 100644 python/extractor/cli-integration-test/parser-telemetry/test_parser_telemetry.py diff --git a/python/extractor/cli-integration-test/parser-telemetry/repo_dir/old_parser.py b/python/extractor/cli-integration-test/parser-telemetry/repo_dir/old_parser.py new file mode 100644 index 000000000000..7d4290a117a4 --- /dev/null +++ b/python/extractor/cli-integration-test/parser-telemetry/repo_dir/old_parser.py @@ -0,0 +1 @@ +x = 1 diff --git a/python/extractor/cli-integration-test/parser-telemetry/repo_dir/tree_sitter_parser.py b/python/extractor/cli-integration-test/parser-telemetry/repo_dir/tree_sitter_parser.py new file mode 100644 index 000000000000..08a86e1f4c6d --- /dev/null +++ b/python/extractor/cli-integration-test/parser-telemetry/repo_dir/tree_sitter_parser.py @@ -0,0 +1,3 @@ +match 1: + case 1: + pass diff --git a/python/extractor/cli-integration-test/parser-telemetry/test.sh b/python/extractor/cli-integration-test/parser-telemetry/test.sh new file mode 100755 index 000000000000..86219c86bf12 --- /dev/null +++ b/python/extractor/cli-integration-test/parser-telemetry/test.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +set -Eeuo pipefail # see https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/ + +set -x + +CODEQL=${CODEQL:-codeql} + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +cd "$SCRIPTDIR" + +rm -rf db + +$CODEQL database create db --language python --source-root repo_dir/ +python3 test_parser_telemetry.py db + +rm -rf db diff --git a/python/extractor/cli-integration-test/parser-telemetry/test_parser_telemetry.py b/python/extractor/cli-integration-test/parser-telemetry/test_parser_telemetry.py new file mode 100644 index 000000000000..c848f63eacd5 --- /dev/null +++ b/python/extractor/cli-integration-test/parser-telemetry/test_parser_telemetry.py @@ -0,0 +1,25 @@ +import glob +import json +import os +import sys + + +database = sys.argv[1] +diagnostics = [] +diagnostic_dir = os.path.join(database, "diagnostic", "extractors", "python") +for path in glob.glob(os.path.join(diagnostic_dir, "*.jsonl")): + with open(path) as diagnostic_file: + diagnostics.extend(json.loads(line) for line in diagnostic_file) +parser_statistics = [ + diagnostic + for diagnostic in diagnostics + if diagnostic["source"]["id"] == "py/extractor/parser-statistics" +] +actual = ( + sum(diagnostic["attributes"]["old_parser_file_count"] for diagnostic in parser_statistics), + sum( + diagnostic["attributes"]["tree_sitter_parser_file_count"] + for diagnostic in parser_statistics + ), +) +assert actual == (1, 1), actual diff --git a/python/extractor/cli-integration-test/writing-diagnostics/test_diagnostics_output.py b/python/extractor/cli-integration-test/writing-diagnostics/test_diagnostics_output.py index 0dce022a0f95..fae7bc93d88b 100644 --- a/python/extractor/cli-integration-test/writing-diagnostics/test_diagnostics_output.py +++ b/python/extractor/cli-integration-test/writing-diagnostics/test_diagnostics_output.py @@ -4,4 +4,11 @@ import diagnostics_test_utils test_db = "db" -diagnostics_test_utils.check_diagnostics(".", test_db, skip_attributes=True) +diagnostics_test_utils.check_diagnostics( + ".", + test_db, + skip_attributes=True, + replacements={ + r'"py/extractor/parser-statistics"': '"cli/py/extractor/parser-statistics"' + }, +) diff --git a/python/extractor/semmle/extractors/module_printer.py b/python/extractor/semmle/extractors/module_printer.py index d2f4a6cc92bd..aeaa8e63f5eb 100644 --- a/python/extractor/semmle/extractors/module_printer.py +++ b/python/extractor/semmle/extractors/module_printer.py @@ -6,9 +6,9 @@ class ModulePrinter(object): name = "module printer" - def __init__(self, options, trap_folder, src_archive, renamer, logger): + def __init__(self, options, trap_folder, src_archive, renamer, logger, diagnostics_writer): self.logger = logger - self.py_extractor = PythonExtractor(options, trap_folder, src_archive, logger) + self.py_extractor = PythonExtractor(options, trap_folder, src_archive, logger, diagnostics_writer) def process(self, unit): imports = () diff --git a/python/extractor/semmle/extractors/py_extractor.py b/python/extractor/semmle/extractors/py_extractor.py index 8014063b3cb8..3b5a37fb7a96 100644 --- a/python/extractor/semmle/extractors/py_extractor.py +++ b/python/extractor/semmle/extractors/py_extractor.py @@ -16,6 +16,7 @@ def __init__(self, options, trap_folder, src_archive, logger: Logger, diagnostic self.module_extractor = extractor.Extractor.from_options(options, trap_folder, src_archive, logger, diagnostics_writer) self.finder = finder.Finder.from_options_and_env(options, logger) self.importer = imports.importer_from_options(options, self.finder, logger) + self.diagnostics_writer = diagnostics_writer def _get_module_and_imports(self, unit): if not isinstance(unit, util.FileExtractable): @@ -24,7 +25,7 @@ def _get_module_and_imports(self, unit): module = self.finder.from_extractable(unit) if module is None: return None, () - py_module = module.load(self.logger) + py_module = module.load(self.logger, self.diagnostics_writer) if py_module is None: return None, () imports = set(mod.get_extractable() for mod in self.importer.get_imports(module, py_module)) diff --git a/python/extractor/semmle/logging.py b/python/extractor/semmle/logging.py index 369592534676..6f5255a7a9d5 100644 --- a/python/extractor/semmle/logging.py +++ b/python/extractor/semmle/logging.py @@ -367,6 +367,14 @@ def extractor_telemetry_message(): .telemetry() ) +def parser_statistics_telemetry_message(old_parser_file_count, tree_sitter_parser_file_count): + return (DiagnosticMessage(Source("py/extractor/parser-statistics", "Python parser statistics"), Severity.NOTE) + .markdown("Internal parser telemetry for the Python extractor.\n\nNo action needed.") + .attribute("old_parser_file_count", old_parser_file_count) + .attribute("tree_sitter_parser_file_count", tree_sitter_parser_file_count) + .telemetry() + ) + def get_stack_trace_lines(): """Creates a stack trace for inclusion into the `attributes` part of a diagnostic message. Limits the size of the stack trace to 5000 characters, so as to not make the SARIF file overly big. diff --git a/python/extractor/semmle/python/finder.py b/python/extractor/semmle/python/finder.py index 632ef920d055..46e63f5e578f 100644 --- a/python/extractor/semmle/python/finder.py +++ b/python/extractor/semmle/python/finder.py @@ -65,8 +65,8 @@ def all_sub_modules(self): def get_extractable(self): return FileExtractable(self.path) - def load(self, logger=None): - return PythonSourceModule(self.name, self.path, logger=logger) + def load(self, logger, diagnostics_writer): + return PythonSourceModule(self.name, self.path, logger=logger, diagnostics_writer=diagnostics_writer) def __str__(self): return "Python module at %s" % self.path diff --git a/python/extractor/semmle/python/modules.py b/python/extractor/semmle/python/modules.py index 810c4e060f7b..7192f97cfb11 100644 --- a/python/extractor/semmle/python/modules.py +++ b/python/extractor/semmle/python/modules.py @@ -18,7 +18,7 @@ class PythonSourceModule(object): kind = None - def __init__(self, name, path, logger, bytes_source = None): + def __init__(self, name, path, logger, diagnostics_writer, bytes_source = None): assert isinstance(path, str), path self.name = name # May be None self.path = path @@ -34,6 +34,7 @@ def __init__(self, name, path, logger, bytes_source = None): self._line_types = None self._comments = None self._tokens = None + self.diagnostics_writer = diagnostics_writer self.logger = logger with timers["decode"]: self.encoding, self.bytes_source = semmle.python.parser.tokenizer.encoding_from_source(bytes_source) @@ -113,6 +114,7 @@ def old_py_ast(self): self.logger.debug("Trying old parser on %s", self.path) self._py_ast = semmle.python.parser.parse(self.tokens, self.logger) self.logger.debug("Old parser successful on %s", self.path) + self.diagnostics_writer.record_old_parser() else: self.logger.debug("Found (during old_py_ast) parse tree for %s in cache", self.path) return self._py_ast @@ -147,6 +149,7 @@ def py_ast(self): self.logger.debug("Trying tsg-python on %s", self.path) self._py_ast = semmle.python.parser.tsg_parser.parse(self.path, self.logger) self.logger.debug("tsg-python successful on %s", self.path) + self.diagnostics_writer.record_tree_sitter_parser() else: self.logger.debug("Found (during py_ast) parse tree for %s in cache", self.path) return self._py_ast diff --git a/python/extractor/semmle/python/parser/dump_ast.py b/python/extractor/semmle/python/parser/dump_ast.py index 3a7db5ab0713..97abb502e59a 100644 --- a/python/extractor/semmle/python/parser/dump_ast.py +++ b/python/extractor/semmle/python/parser/dump_ast.py @@ -119,7 +119,8 @@ def reset_error_count(self): self.error_count = 0 def old_parser(inputfile, logger): - mod = PythonSourceModule(None, inputfile, logger) + from semmle.worker import DiagnosticsWriter + mod = PythonSourceModule(None, inputfile, logger, DiagnosticsWriter(0)) logger.close() return mod.old_py_ast diff --git a/python/extractor/semmle/python/passes/flow.py b/python/extractor/semmle/python/passes/flow.py index 6ea5405a8540..a100bbae7c9c 100755 --- a/python/extractor/semmle/python/passes/flow.py +++ b/python/extractor/semmle/python/passes/flow.py @@ -1916,7 +1916,8 @@ def write_ssa_phi(out, phi, arg): import semmle.python.parser.tsg_parser parsed_ast = semmle.python.parser.tsg_parser.parse(inputfile, FakeLogger()) else: - module = modules.PythonSourceModule("__main__", inputfile, FakeLogger()) + from semmle.worker import DiagnosticsWriter + module = modules.PythonSourceModule("__main__", inputfile, FakeLogger(), DiagnosticsWriter(0)) parsed_ast = module.ast FlowPass(options.split, options.prune, options.unroll).extract(parsed_ast, writer) writer.close() diff --git a/python/extractor/semmle/worker.py b/python/extractor/semmle/worker.py index 8d771828ada8..82997f186e4f 100644 --- a/python/extractor/semmle/worker.py +++ b/python/extractor/semmle/worker.py @@ -11,6 +11,7 @@ from semmle.profiling import get_profiler from semmle.path_rename import renamer_from_options_and_env from semmle.logging import WARN, recursion_error_message, internal_error_message, extractor_telemetry_message, Logger +from semmle.logging import parser_statistics_telemetry_message from semmle.util import FileExtractable, FolderExtractable class ExtractorFailure(Exception): @@ -245,9 +246,29 @@ def _write_extractor_telemetry(diagnostics_writer, logger: Logger): except OSError as ex: logger.warning("Failed to write extractor telemetry: %s", ex) +def _write_parser_statistics_telemetry(diagnostics_writer, logger: Logger): + counts = diagnostics_writer.parser_statistics() + if counts == (0, 0): + return + try: + diagnostics_writer.write(parser_statistics_telemetry_message(*counts)) + except OSError as ex: + logger.warning("Failed to write parser statistics telemetry: %s", ex) + class DiagnosticsWriter(object): def __init__(self, proc_id): self.proc_id = proc_id + self.old_parser_file_count = 0 + self.tree_sitter_parser_file_count = 0 + + def record_old_parser(self): + self.old_parser_file_count += 1 + + def record_tree_sitter_parser(self): + self.tree_sitter_parser_file_count += 1 + + def parser_statistics(self): + return self.old_parser_file_count, self.tree_sitter_parser_file_count def write(self, message): dir = os.environ.get("CODEQL_EXTRACTOR_PYTHON_DIAGNOSTIC_DIR") @@ -286,7 +307,7 @@ def _extract_loop(proc_id, queue, trap_dir, archive, options, reply_queue, logge _write_extractor_telemetry(diagnostics_writer, logger) try: if options.trace_only: - extractor = ModulePrinter(options, trap_dir, archive, renamer, logger) + extractor = ModulePrinter(options, trap_dir, archive, renamer, logger, diagnostics_writer) else: extractor = SuperExtractor(options, trap_dir, archive, renamer, logger, diagnostics_writer) profiler = get_profiler(options, id, logger) @@ -299,6 +320,7 @@ def _extract_loop(proc_id, queue, trap_dir, archive, options, reply_queue, logge if write_global_data: extractor.write_global_data() extractor.close() + _write_parser_statistics_telemetry(diagnostics_writer, logger) return try: start = time.time() @@ -352,4 +374,5 @@ def _extract_loop(proc_id, queue, trap_dir, archive, options, reply_queue, logge except _Empty: #Cleared queue enough to avoid deadlock. pass + _write_parser_statistics_telemetry(diagnostics_writer, logger) sys.exit(2) diff --git a/python/extractor/tests/test_diagnostics.py b/python/extractor/tests/test_diagnostics.py index a40f339e3e4b..7d0c2814ca68 100644 --- a/python/extractor/tests/test_diagnostics.py +++ b/python/extractor/tests/test_diagnostics.py @@ -3,6 +3,7 @@ from semmle import logging from semmle import util from semmle import worker +from semmle.python.modules import PythonSourceModule def test_extractor_telemetry_message(mocker): @@ -32,6 +33,32 @@ def test_extractor_telemetry_message(mocker): } +def test_parser_statistics_telemetry_message(): + message = logging.parser_statistics_telemetry_message( + old_parser_file_count=12, tree_sitter_parser_file_count=3 + ).to_dict() + message.pop("timestamp") + + assert message == { + "source": { + "id": "py/extractor/parser-statistics", + "name": "Python parser statistics", + "extractorName": "python", + }, + "severity": "note", + "markdownMessage": "Internal parser telemetry for the Python extractor.\n\nNo action needed.", + "visibility": { + "statusPage": False, + "cliSummaryTable": False, + "telemetry": True, + }, + "attributes": { + "old_parser_file_count": 12, + "tree_sitter_parser_file_count": 3, + }, + } + + def test_write_extractor_telemetry(mocker): diagnostics_writer = mocker.Mock() logger = mocker.Mock() @@ -39,6 +66,11 @@ def test_write_extractor_telemetry(mocker): worker._write_extractor_telemetry(diagnostics_writer, logger) diagnostics_writer.write.assert_called_once() + assert diagnostics_writer.write.call_args.args[0].to_dict()["attributes"] == { + "python_analysis_version": util.get_analysis_version(), + "python_runtime_version": platform.python_version(), + "extractor_version": util.VERSION, + } logger.warning.assert_not_called() @@ -52,3 +84,76 @@ def test_write_extractor_telemetry_handles_io_error(mocker): logger.warning.assert_called_once_with( "Failed to write extractor telemetry: %s", diagnostics_writer.write.side_effect ) + + +def test_write_parser_statistics_telemetry(mocker): + diagnostics_writer = mocker.Mock() + diagnostics_writer.parser_statistics.return_value = (1, 1) + logger = mocker.Mock() + + worker._write_parser_statistics_telemetry(diagnostics_writer, logger) + + diagnostics_writer.write.assert_called_once() + assert diagnostics_writer.write.call_args.args[0].to_dict()["attributes"] == { + "old_parser_file_count": 1, + "tree_sitter_parser_file_count": 1, + } + logger.warning.assert_not_called() + + +def test_does_not_write_empty_parser_statistics_telemetry(mocker): + diagnostics_writer = mocker.Mock() + diagnostics_writer.parser_statistics.return_value = (0, 0) + logger = mocker.Mock() + + worker._write_parser_statistics_telemetry(diagnostics_writer, logger) + + diagnostics_writer.write.assert_not_called() + logger.warning.assert_not_called() + + +def test_records_old_parser_usage_once(mocker, monkeypatch): + monkeypatch.delenv("CODEQL_PYTHON_DISABLE_OLD_PARSER", raising=False) + monkeypatch.delenv("CODEQL_PYTHON_DISABLE_TSG_PARSER", raising=False) + old_ast = object() + mocker.patch("semmle.python.parser.parse", return_value=old_ast) + diagnostics_writer = worker.DiagnosticsWriter(1) + module = PythonSourceModule( + None, + "test.py", + mocker.Mock(), + diagnostics_writer, + bytes_source=b"x = 1\n", + ) + + parsed_ast = module.py_ast + # Access the cached AST again to verify that it is not counted twice. + _ = module.py_ast + + assert parsed_ast is old_ast + assert diagnostics_writer.parser_statistics() == (1, 0) + + +def test_records_tree_sitter_parser_usage_once(mocker, monkeypatch): + monkeypatch.delenv("CODEQL_PYTHON_DISABLE_OLD_PARSER", raising=False) + monkeypatch.delenv("CODEQL_PYTHON_DISABLE_TSG_PARSER", raising=False) + tree_sitter_ast = object() + mocker.patch("semmle.python.parser.parse", side_effect=SyntaxError("old parser failed")) + mocker.patch( + "semmle.python.parser.tsg_parser.parse", return_value=tree_sitter_ast + ) + diagnostics_writer = worker.DiagnosticsWriter(1) + module = PythonSourceModule( + None, + "test.py", + mocker.Mock(), + diagnostics_writer, + bytes_source=b"x = 1\n", + ) + + parsed_ast = module.py_ast + # Access the cached AST again to verify that it is not counted twice. + _ = module.py_ast + + assert parsed_ast is tree_sitter_ast + assert diagnostics_writer.parser_statistics() == (0, 1) From e3dff5e42e94409e7dce7c16b6dddfed40b58b0c Mon Sep 17 00:00:00 2001 From: Taus Date: Thu, 3 Sep 2026 14:40:33 +0000 Subject: [PATCH 0694/2098] Python: Add extractor flag telemetry Records any non-default extractor flags (without their arguments) as a normalised string. This will enable us to determine which flags are actually used (and which ones we might therefore get rid of). When there are no flags other than the ones the autobuilder injects, we simply report the string `"default"`. That way, there's no need to remember exactly which flags are enabled by default during extraction. --- .../writing-diagnostics/diagnostics.expected | 1 + .../test_diagnostics_output.py | 14 ++++++++ python/extractor/semmle/cmdline.py | 17 ++++++++-- python/extractor/semmle/logging.py | 3 +- python/extractor/semmle/worker.py | 6 ++-- python/extractor/tests/test_cmdline.py | 34 +++++++++++++++++++ python/extractor/tests/test_diagnostics.py | 14 ++++++-- 7 files changed, 80 insertions(+), 9 deletions(-) create mode 100644 python/extractor/tests/test_cmdline.py diff --git a/python/extractor/cli-integration-test/writing-diagnostics/diagnostics.expected b/python/extractor/cli-integration-test/writing-diagnostics/diagnostics.expected index 715fb8dd12f7..4b6fceb48faf 100644 --- a/python/extractor/cli-integration-test/writing-diagnostics/diagnostics.expected +++ b/python/extractor/cli-integration-test/writing-diagnostics/diagnostics.expected @@ -163,6 +163,7 @@ } { "attributes": { + "extractor_flags": "default", "extractor_version": "7.1.10", "python_analysis_version": "3.12", "python_runtime_version": "3.12.3" diff --git a/python/extractor/cli-integration-test/writing-diagnostics/test_diagnostics_output.py b/python/extractor/cli-integration-test/writing-diagnostics/test_diagnostics_output.py index fae7bc93d88b..4108b9731943 100644 --- a/python/extractor/cli-integration-test/writing-diagnostics/test_diagnostics_output.py +++ b/python/extractor/cli-integration-test/writing-diagnostics/test_diagnostics_output.py @@ -1,9 +1,23 @@ import os import sys +import glob +import json sys.path.append(os.path.join(os.path.dirname(__file__), "..", "..", "..", "..", "..", "integration-tests")) import diagnostics_test_utils test_db = "db" +diagnostics = [] +diagnostic_dir = os.path.join(test_db, "diagnostic", "extractors", "python") +for path in glob.glob(os.path.join(diagnostic_dir, "*.jsonl")): + with open(path) as diagnostic_file: + diagnostics.extend(json.loads(line) for line in diagnostic_file) +summary = [ + diagnostic + for diagnostic in diagnostics + if diagnostic["source"]["id"] == "py/extractor/summary" +] +assert len(summary) == 1 +assert summary[0]["attributes"]["extractor_flags"] == "default" diagnostics_test_utils.check_diagnostics( ".", test_db, diff --git a/python/extractor/semmle/cmdline.py b/python/extractor/semmle/cmdline.py index 47007c065fdc..213a1f4affae 100644 --- a/python/extractor/semmle/cmdline.py +++ b/python/extractor/semmle/cmdline.py @@ -1,4 +1,4 @@ -from optparse import OptionParser, OptionGroup, HelpFormatter +from optparse import Option, OptionParser, OptionGroup, HelpFormatter import shlex import sys import os @@ -8,9 +8,21 @@ from semmle.util import VERSION +DEFAULT_AUTOBUILDER_FLAGS = {"R", "c", "v", "verbosity", "z"} + + +class RecordingOption(Option): + def process(self, opt, value, values, parser): + flag = (self._short_opts or self._long_opts)[0].lstrip("-") + if flag not in DEFAULT_AUTOBUILDER_FLAGS: + parser.extractor_flags.add(flag) + return Option.process(self, opt, value, values, parser) + + def make_parser(): '''Parse command_line, returning options, arguments''' - parser = OptionParser(add_help_option=False, version='%s' % VERSION) + parser = OptionParser(option_class=RecordingOption, add_help_option=False, version='%s' % VERSION) + parser.extractor_flags = set() import_options = OptionGroup(parser, "Import following options", description="Note that -a -n -g and -t are included for backwards compatibility. They are ignored") @@ -172,6 +184,7 @@ def parse(command_line): setattr(options, attr, dval) args.extend(extra_args) del options.file + options.extractor_flags = sorted(parser.extractor_flags) if options.help: if options.verbose: for opt in parser._get_all_options(): diff --git a/python/extractor/semmle/logging.py b/python/extractor/semmle/logging.py index 6f5255a7a9d5..652ab810d0fb 100644 --- a/python/extractor/semmle/logging.py +++ b/python/extractor/semmle/logging.py @@ -358,12 +358,13 @@ def with_timestamp(self, timestamp): self.timestamp = timestamp return self -def extractor_telemetry_message(): +def extractor_telemetry_message(extractor_flags): return (DiagnosticMessage(Source("py/extractor/summary", "Python extractor telemetry"), Severity.NOTE) .markdown("Internal telemetry for the Python extractor.\n\nNo action needed.") .attribute("python_analysis_version", get_analysis_version()) .attribute("python_runtime_version", platform.python_version()) .attribute("extractor_version", VERSION) + .attribute("extractor_flags", " ".join(extractor_flags) or "default") .telemetry() ) diff --git a/python/extractor/semmle/worker.py b/python/extractor/semmle/worker.py index 82997f186e4f..15b7b556bf88 100644 --- a/python/extractor/semmle/worker.py +++ b/python/extractor/semmle/worker.py @@ -240,9 +240,9 @@ def _drain_queue(queue): #Emptied queue as best we can. pass -def _write_extractor_telemetry(diagnostics_writer, logger: Logger): +def _write_extractor_telemetry(diagnostics_writer, logger: Logger, extractor_flags): try: - diagnostics_writer.write(extractor_telemetry_message()) + diagnostics_writer.write(extractor_telemetry_message(extractor_flags)) except OSError as ex: logger.warning("Failed to write extractor telemetry: %s", ex) @@ -304,7 +304,7 @@ def _extract_loop(proc_id, queue, trap_dir, archive, options, reply_queue, logge sys.exit(2) logger.set_process_id(proc_id) if write_global_data: - _write_extractor_telemetry(diagnostics_writer, logger) + _write_extractor_telemetry(diagnostics_writer, logger, options.extractor_flags) try: if options.trace_only: extractor = ModulePrinter(options, trap_dir, archive, renamer, logger, diagnostics_writer) diff --git a/python/extractor/tests/test_cmdline.py b/python/extractor/tests/test_cmdline.py new file mode 100644 index 000000000000..76f2fe951b57 --- /dev/null +++ b/python/extractor/tests/test_cmdline.py @@ -0,0 +1,34 @@ +from semmle import cmdline + + +def test_records_flags_without_values(): + options, args = cmdline.parse( + [ + "--verbosity=3", + "-zall", + "-R", + "/src", + "-vv", + "--path", + "/lib", + "-p", + "/other-lib", + "module", + ] + ) + + assert options.extractor_flags == ["p"] + assert args == ["module"] + + +def test_records_flags_from_option_file(tmp_path): + options_file = tmp_path / "extractor-options" + options_file.write_text("--colorize --max-import-depth 2") + + options, _ = cmdline.parse(["-f", str(options_file)]) + + assert options.extractor_flags == [ + "colorize", + "f", + "max-import-depth", + ] diff --git a/python/extractor/tests/test_diagnostics.py b/python/extractor/tests/test_diagnostics.py index 7d0c2814ca68..ddfd22436de9 100644 --- a/python/extractor/tests/test_diagnostics.py +++ b/python/extractor/tests/test_diagnostics.py @@ -9,7 +9,7 @@ def test_extractor_telemetry_message(mocker): mocker.patch("semmle.logging.get_analysis_version", return_value="3.13") - message = logging.extractor_telemetry_message().to_dict() + message = logging.extractor_telemetry_message(["colorize", "p"]).to_dict() message.pop("timestamp") assert message == { @@ -29,6 +29,7 @@ def test_extractor_telemetry_message(mocker): "python_analysis_version": "3.13", "python_runtime_version": platform.python_version(), "extractor_version": util.VERSION, + "extractor_flags": "colorize p", }, } @@ -59,17 +60,24 @@ def test_parser_statistics_telemetry_message(): } +def test_extractor_telemetry_message_includes_empty_flags(): + message = logging.extractor_telemetry_message([]).to_dict() + + assert message["attributes"]["extractor_flags"] == "default" + + def test_write_extractor_telemetry(mocker): diagnostics_writer = mocker.Mock() logger = mocker.Mock() - worker._write_extractor_telemetry(diagnostics_writer, logger) + worker._write_extractor_telemetry(diagnostics_writer, logger, ["quiet"]) diagnostics_writer.write.assert_called_once() assert diagnostics_writer.write.call_args.args[0].to_dict()["attributes"] == { "python_analysis_version": util.get_analysis_version(), "python_runtime_version": platform.python_version(), "extractor_version": util.VERSION, + "extractor_flags": "quiet", } logger.warning.assert_not_called() @@ -79,7 +87,7 @@ def test_write_extractor_telemetry_handles_io_error(mocker): diagnostics_writer.write.side_effect = OSError("write failed") logger = mocker.Mock() - worker._write_extractor_telemetry(diagnostics_writer, logger) + worker._write_extractor_telemetry(diagnostics_writer, logger, []) logger.warning.assert_called_once_with( "Failed to write extractor telemetry: %s", diagnostics_writer.write.side_effect From cb6264182606cd012e0c353a30e0745b10fe58fe Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 3 Sep 2026 22:41:48 +0000 Subject: [PATCH 0695/2098] Post-release preparation for codeql-cli-2.27.0 --- actions/ql/lib/qlpack.yml | 2 +- actions/ql/src/qlpack.yml | 2 +- cpp/ql/lib/qlpack.yml | 2 +- cpp/ql/src/qlpack.yml | 2 +- csharp/ql/campaigns/Solorigate/lib/qlpack.yml | 2 +- csharp/ql/campaigns/Solorigate/src/qlpack.yml | 2 +- csharp/ql/lib/qlpack.yml | 2 +- csharp/ql/src/qlpack.yml | 2 +- go/ql/consistency-queries/qlpack.yml | 2 +- go/ql/lib/qlpack.yml | 2 +- go/ql/src/qlpack.yml | 2 +- java/ql/lib/qlpack.yml | 2 +- java/ql/src/qlpack.yml | 2 +- javascript/ql/lib/qlpack.yml | 2 +- javascript/ql/src/qlpack.yml | 2 +- misc/suite-helpers/qlpack.yml | 2 +- python/ql/lib/qlpack.yml | 2 +- python/ql/src/qlpack.yml | 2 +- ruby/ql/lib/qlpack.yml | 2 +- ruby/ql/src/qlpack.yml | 2 +- rust/ql/lib/qlpack.yml | 2 +- rust/ql/src/qlpack.yml | 2 +- shared/concepts/qlpack.yml | 2 +- shared/controlflow/qlpack.yml | 2 +- shared/dataflow/qlpack.yml | 2 +- shared/mad/qlpack.yml | 2 +- shared/namebinding/qlpack.yml | 2 +- shared/quantum/qlpack.yml | 2 +- shared/rangeanalysis/qlpack.yml | 2 +- shared/regex/qlpack.yml | 2 +- shared/ssa/qlpack.yml | 2 +- shared/threat-models/qlpack.yml | 2 +- shared/tutorial/qlpack.yml | 2 +- shared/typeflow/qlpack.yml | 2 +- shared/typeinference/qlpack.yml | 2 +- shared/typetracking/qlpack.yml | 2 +- shared/typos/qlpack.yml | 2 +- shared/util/qlpack.yml | 2 +- shared/xml/qlpack.yml | 2 +- shared/yaml/qlpack.yml | 2 +- swift/ql/lib/qlpack.yml | 2 +- swift/ql/src/qlpack.yml | 2 +- 42 files changed, 42 insertions(+), 42 deletions(-) diff --git a/actions/ql/lib/qlpack.yml b/actions/ql/lib/qlpack.yml index 612e631c6f8b..268018a37415 100644 --- a/actions/ql/lib/qlpack.yml +++ b/actions/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-all -version: 0.6.1 +version: 0.6.2-dev library: true warnOnImplicitThis: true dependencies: diff --git a/actions/ql/src/qlpack.yml b/actions/ql/src/qlpack.yml index 5e4877698e63..5feedb52c8ce 100644 --- a/actions/ql/src/qlpack.yml +++ b/actions/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-queries -version: 0.6.35 +version: 0.6.36-dev library: false warnOnImplicitThis: true groups: [actions, queries] diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index c3e40cb63948..5114bf861a36 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-all -version: 12.1.0 +version: 12.1.1-dev groups: cpp dbscheme: semmlecode.cpp.dbscheme extractor: cpp diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml index ca971b04aaad..034523449c24 100644 --- a/cpp/ql/src/qlpack.yml +++ b/cpp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-queries -version: 1.8.3 +version: 1.8.4-dev groups: - cpp - queries diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml index 990c6ad4dbc8..07c306a65a9d 100644 --- a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-all -version: 1.7.74 +version: 1.7.75-dev groups: - csharp - solorigate diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml index 199504aa7dd3..94bf9c0f7db3 100644 --- a/csharp/ql/campaigns/Solorigate/src/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-queries -version: 1.7.74 +version: 1.7.75-dev groups: - csharp - solorigate diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index 15fadfad8a0f..18ee2c149098 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-all -version: 7.3.0 +version: 7.3.1-dev groups: csharp dbscheme: semmlecode.csharp.dbscheme extractor: csharp diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml index a2f6f0aac243..c90064a3b913 100644 --- a/csharp/ql/src/qlpack.yml +++ b/csharp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-queries -version: 1.9.3 +version: 1.9.4-dev groups: - csharp - queries diff --git a/go/ql/consistency-queries/qlpack.yml b/go/ql/consistency-queries/qlpack.yml index 353e4dd1cdcd..c9c318de2fa2 100644 --- a/go/ql/consistency-queries/qlpack.yml +++ b/go/ql/consistency-queries/qlpack.yml @@ -1,5 +1,5 @@ name: codeql-go-consistency-queries -version: 1.0.57 +version: 1.0.58-dev groups: - go - queries diff --git a/go/ql/lib/qlpack.yml b/go/ql/lib/qlpack.yml index fb42dcb703ae..4dc828abeffe 100644 --- a/go/ql/lib/qlpack.yml +++ b/go/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-all -version: 7.3.1 +version: 7.3.2-dev groups: go dbscheme: go.dbscheme extractor: go diff --git a/go/ql/src/qlpack.yml b/go/ql/src/qlpack.yml index bc9f243309af..fdfdd1f67432 100644 --- a/go/ql/src/qlpack.yml +++ b/go/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-queries -version: 1.6.10 +version: 1.6.11-dev groups: - go - queries diff --git a/java/ql/lib/qlpack.yml b/java/ql/lib/qlpack.yml index d97a58c5c809..d6aefad45233 100644 --- a/java/ql/lib/qlpack.yml +++ b/java/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-all -version: 9.3.0 +version: 9.3.1-dev groups: java dbscheme: config/semmlecode.dbscheme extractor: java diff --git a/java/ql/src/qlpack.yml b/java/ql/src/qlpack.yml index 9c3cffa047ca..1bb0cdc16c09 100644 --- a/java/ql/src/qlpack.yml +++ b/java/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-queries -version: 1.11.10 +version: 1.11.11-dev groups: - java - queries diff --git a/javascript/ql/lib/qlpack.yml b/javascript/ql/lib/qlpack.yml index 97f274ff58ae..93c4370aab6d 100644 --- a/javascript/ql/lib/qlpack.yml +++ b/javascript/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-all -version: 2.10.1 +version: 2.10.2-dev groups: javascript dbscheme: semmlecode.javascript.dbscheme extractor: javascript diff --git a/javascript/ql/src/qlpack.yml b/javascript/ql/src/qlpack.yml index 83e2caff741c..456c7f4ca7b5 100644 --- a/javascript/ql/src/qlpack.yml +++ b/javascript/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-queries -version: 2.4.5 +version: 2.4.6-dev groups: - javascript - queries diff --git a/misc/suite-helpers/qlpack.yml b/misc/suite-helpers/qlpack.yml index ba51f45be36f..1c27d6177555 100644 --- a/misc/suite-helpers/qlpack.yml +++ b/misc/suite-helpers/qlpack.yml @@ -1,4 +1,4 @@ name: codeql/suite-helpers -version: 1.0.57 +version: 1.0.58-dev groups: shared warnOnImplicitThis: true diff --git a/python/ql/lib/qlpack.yml b/python/ql/lib/qlpack.yml index 715a4f61bfc8..ad9d7605202a 100644 --- a/python/ql/lib/qlpack.yml +++ b/python/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-all -version: 7.2.5 +version: 7.2.6-dev groups: python dbscheme: semmlecode.python.dbscheme extractor: python diff --git a/python/ql/src/qlpack.yml b/python/ql/src/qlpack.yml index d48bc1e8e7cc..70ce9eeef942 100644 --- a/python/ql/src/qlpack.yml +++ b/python/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-queries -version: 1.8.10 +version: 1.8.11-dev groups: - python - queries diff --git a/ruby/ql/lib/qlpack.yml b/ruby/ql/lib/qlpack.yml index 2c52daba2b15..f38a7120a31f 100644 --- a/ruby/ql/lib/qlpack.yml +++ b/ruby/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-all -version: 7.0.0 +version: 7.0.1-dev groups: ruby extractor: ruby dbscheme: ruby.dbscheme diff --git a/ruby/ql/src/qlpack.yml b/ruby/ql/src/qlpack.yml index a215aec72b83..d532c03248a0 100644 --- a/ruby/ql/src/qlpack.yml +++ b/ruby/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-queries -version: 1.6.10 +version: 1.6.11-dev groups: - ruby - queries diff --git a/rust/ql/lib/qlpack.yml b/rust/ql/lib/qlpack.yml index dc1059ff64c5..bb31a181ec16 100644 --- a/rust/ql/lib/qlpack.yml +++ b/rust/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rust-all -version: 0.2.21 +version: 0.2.22-dev groups: rust extractor: rust dbscheme: rust.dbscheme diff --git a/rust/ql/src/qlpack.yml b/rust/ql/src/qlpack.yml index 2e13de282d58..dc4e53aeaf81 100644 --- a/rust/ql/src/qlpack.yml +++ b/rust/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rust-queries -version: 0.1.42 +version: 0.1.43-dev groups: - rust - queries diff --git a/shared/concepts/qlpack.yml b/shared/concepts/qlpack.yml index f5005081b57a..677235474b91 100644 --- a/shared/concepts/qlpack.yml +++ b/shared/concepts/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/concepts -version: 0.0.31 +version: 0.0.32-dev groups: shared library: true dependencies: diff --git a/shared/controlflow/qlpack.yml b/shared/controlflow/qlpack.yml index fd5bfcb78586..66ae31f61364 100644 --- a/shared/controlflow/qlpack.yml +++ b/shared/controlflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/controlflow -version: 2.0.41 +version: 2.0.42-dev groups: shared library: true dependencies: diff --git a/shared/dataflow/qlpack.yml b/shared/dataflow/qlpack.yml index 09e851c73c93..134205735fe7 100644 --- a/shared/dataflow/qlpack.yml +++ b/shared/dataflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/dataflow -version: 2.1.13 +version: 2.1.14-dev groups: shared library: true dependencies: diff --git a/shared/mad/qlpack.yml b/shared/mad/qlpack.yml index e350a3a2ddbd..783f372bc478 100644 --- a/shared/mad/qlpack.yml +++ b/shared/mad/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/mad -version: 1.0.57 +version: 1.0.58-dev groups: shared library: true dependencies: diff --git a/shared/namebinding/qlpack.yml b/shared/namebinding/qlpack.yml index f18af62921c4..af4358254944 100644 --- a/shared/namebinding/qlpack.yml +++ b/shared/namebinding/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/namebinding -version: 0.0.6 +version: 0.0.7-dev groups: shared library: true dependencies: diff --git a/shared/quantum/qlpack.yml b/shared/quantum/qlpack.yml index 83384e926bcb..044e243531fd 100644 --- a/shared/quantum/qlpack.yml +++ b/shared/quantum/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/quantum -version: 0.0.35 +version: 0.0.36-dev groups: shared library: true dependencies: diff --git a/shared/rangeanalysis/qlpack.yml b/shared/rangeanalysis/qlpack.yml index 2b0eb43866da..6b4e8a5adede 100644 --- a/shared/rangeanalysis/qlpack.yml +++ b/shared/rangeanalysis/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rangeanalysis -version: 1.0.57 +version: 1.0.58-dev groups: shared library: true dependencies: diff --git a/shared/regex/qlpack.yml b/shared/regex/qlpack.yml index d4ad24634326..ad414ca86d3d 100644 --- a/shared/regex/qlpack.yml +++ b/shared/regex/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/regex -version: 1.0.57 +version: 1.0.58-dev groups: shared library: true dependencies: diff --git a/shared/ssa/qlpack.yml b/shared/ssa/qlpack.yml index 92b8603a9d6e..07e6041a5142 100644 --- a/shared/ssa/qlpack.yml +++ b/shared/ssa/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ssa -version: 2.0.33 +version: 2.0.34-dev groups: shared library: true dependencies: diff --git a/shared/threat-models/qlpack.yml b/shared/threat-models/qlpack.yml index a51fdda87b7f..84c172ce3f25 100644 --- a/shared/threat-models/qlpack.yml +++ b/shared/threat-models/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/threat-models -version: 1.0.57 +version: 1.0.58-dev library: true groups: shared dataExtensions: diff --git a/shared/tutorial/qlpack.yml b/shared/tutorial/qlpack.yml index 2c2dde8c1793..fa374cda8f72 100644 --- a/shared/tutorial/qlpack.yml +++ b/shared/tutorial/qlpack.yml @@ -1,7 +1,7 @@ name: codeql/tutorial description: Library for the CodeQL detective tutorials, helping new users learn to write CodeQL queries. -version: 1.0.57 +version: 1.0.58-dev groups: shared library: true warnOnImplicitThis: true diff --git a/shared/typeflow/qlpack.yml b/shared/typeflow/qlpack.yml index 6ea63f761cdd..4dd13d3aad94 100644 --- a/shared/typeflow/qlpack.yml +++ b/shared/typeflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeflow -version: 1.0.57 +version: 1.0.58-dev groups: shared library: true dependencies: diff --git a/shared/typeinference/qlpack.yml b/shared/typeinference/qlpack.yml index 5cabb023ce1e..68db81a4851b 100644 --- a/shared/typeinference/qlpack.yml +++ b/shared/typeinference/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeinference -version: 0.0.38 +version: 0.0.39-dev groups: shared library: true dependencies: diff --git a/shared/typetracking/qlpack.yml b/shared/typetracking/qlpack.yml index 854d8bae6da0..9b52023e6343 100644 --- a/shared/typetracking/qlpack.yml +++ b/shared/typetracking/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typetracking -version: 2.0.41 +version: 2.0.42-dev groups: shared library: true dependencies: diff --git a/shared/typos/qlpack.yml b/shared/typos/qlpack.yml index 712073d7668a..ade80e7678f0 100644 --- a/shared/typos/qlpack.yml +++ b/shared/typos/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typos -version: 1.0.57 +version: 1.0.58-dev groups: shared library: true warnOnImplicitThis: true diff --git a/shared/util/qlpack.yml b/shared/util/qlpack.yml index 76bb1b6957a2..0a61f3903159 100644 --- a/shared/util/qlpack.yml +++ b/shared/util/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/util -version: 2.0.44 +version: 2.0.45-dev groups: shared library: true dependencies: null diff --git a/shared/xml/qlpack.yml b/shared/xml/qlpack.yml index c9251eb88c4d..133a3b9dac86 100644 --- a/shared/xml/qlpack.yml +++ b/shared/xml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/xml -version: 1.0.57 +version: 1.0.58-dev groups: shared library: true dependencies: diff --git a/shared/yaml/qlpack.yml b/shared/yaml/qlpack.yml index ccc990b27d02..14b67df2f8d1 100644 --- a/shared/yaml/qlpack.yml +++ b/shared/yaml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/yaml -version: 1.0.57 +version: 1.0.58-dev groups: shared library: true warnOnImplicitThis: true diff --git a/swift/ql/lib/qlpack.yml b/swift/ql/lib/qlpack.yml index dd31b62e1481..9806fded2032 100644 --- a/swift/ql/lib/qlpack.yml +++ b/swift/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-all -version: 6.8.3 +version: 6.8.4-dev groups: swift extractor: swift dbscheme: swift.dbscheme diff --git a/swift/ql/src/qlpack.yml b/swift/ql/src/qlpack.yml index fd6ec0e549bc..aa419cb33887 100644 --- a/swift/ql/src/qlpack.yml +++ b/swift/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-queries -version: 1.3.10 +version: 1.3.11-dev groups: - swift - queries From 365727c445c8f0d60e078809a590c84279ac1e7e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 4 Sep 2026 06:21:55 +0000 Subject: [PATCH 0696/2098] Test await and yield property names Co-authored-by: asgerf <316427+asgerf@users.noreply.github.com> --- .../library-tests/AwaitPropertyName/AwaitPropertyName.ql | 5 ++--- javascript/ql/test/library-tests/AwaitPropertyName/options | 1 + javascript/ql/test/library-tests/AwaitPropertyName/tst.js | 5 +++++ 3 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 javascript/ql/test/library-tests/AwaitPropertyName/options diff --git a/javascript/ql/test/library-tests/AwaitPropertyName/AwaitPropertyName.ql b/javascript/ql/test/library-tests/AwaitPropertyName/AwaitPropertyName.ql index 499d9bc46d6e..939784b52eab 100644 --- a/javascript/ql/test/library-tests/AwaitPropertyName/AwaitPropertyName.ql +++ b/javascript/ql/test/library-tests/AwaitPropertyName/AwaitPropertyName.ql @@ -1,5 +1,4 @@ import javascript -from Expr e -where e.toString() = "this expression should not exist" -select e +from JSParseError err +select err diff --git a/javascript/ql/test/library-tests/AwaitPropertyName/options b/javascript/ql/test/library-tests/AwaitPropertyName/options new file mode 100644 index 000000000000..13f987b19caf --- /dev/null +++ b/javascript/ql/test/library-tests/AwaitPropertyName/options @@ -0,0 +1 @@ +semmle-extractor-options: --tolerate-parse-errors diff --git a/javascript/ql/test/library-tests/AwaitPropertyName/tst.js b/javascript/ql/test/library-tests/AwaitPropertyName/tst.js index d2e91afcfa1a..4edc377402c0 100644 --- a/javascript/ql/test/library-tests/AwaitPropertyName/tst.js +++ b/javascript/ql/test/library-tests/AwaitPropertyName/tst.js @@ -1,5 +1,10 @@ const pool = { await() { return 42; } }; +const generator = { yield() { return 42; } }; async function issue22499() { return await pool.await(); } + +function* yieldPropertyName() { + return generator.yield(); +} From da77b35c728ee767655cbdbb5e3aa42d1261dc4d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 27 Aug 2026 12:51:35 +0000 Subject: [PATCH 0697/2098] Hoist identical fields from union members to abstract predicates Co-authored-by: aschackmull <28296824+aschackmull@users.noreply.github.com> --- .../tree-sitter-extractor/src/generator/ql.rs | 14 +- .../src/generator/ql_gen.rs | 315 +++++++++++++----- 2 files changed, 249 insertions(+), 80 deletions(-) diff --git a/shared/tree-sitter-extractor/src/generator/ql.rs b/shared/tree-sitter-extractor/src/generator/ql.rs index f114e251af21..2d91d6c66f67 100644 --- a/shared/tree-sitter-extractor/src/generator/ql.rs +++ b/shared/tree-sitter-extractor/src/generator/ql.rs @@ -109,7 +109,7 @@ impl fmt::Display for Class<'_> { is_final: false, return_type: None, formal_parameters: vec![], - body: charpred.clone(), + body: Some(charpred.clone()), overlay: None, } )?; @@ -307,7 +307,9 @@ pub struct Predicate<'a> { pub is_final: bool, pub return_type: Option>, pub formal_parameters: Vec>, - pub body: Expression<'a>, + /// The body of the predicate, or `None` if this is an `abstract` + /// predicate declaration with no body. + pub body: Option>, pub overlay: Option, } @@ -330,6 +332,9 @@ impl fmt::Display for Predicate<'_> { if self.is_final { write!(f, "final ")?; } + if self.body.is_none() { + write!(f, "abstract ")?; + } if self.overridden { write!(f, "override ")?; } @@ -344,7 +349,10 @@ impl fmt::Display for Predicate<'_> { } write!(f, "{param}")?; } - write!(f, ") {{ {} }}", self.body)?; + match &self.body { + Some(body) => write!(f, ") {{ {body} }}")?, + None => write!(f, ");")?, + } Ok(()) } diff --git a/shared/tree-sitter-extractor/src/generator/ql_gen.rs b/shared/tree-sitter-extractor/src/generator/ql_gen.rs index 237ed9ddb968..04a9e73aee1b 100644 --- a/shared/tree-sitter-extractor/src/generator/ql_gen.rs +++ b/shared/tree-sitter-extractor/src/generator/ql_gen.rs @@ -1,3 +1,4 @@ +use std::collections::BTreeMap; use std::collections::BTreeSet; use crate::{generator::ql, node_types}; @@ -20,14 +21,14 @@ pub fn create_ast_node_class<'a>( is_final: false, return_type: Some(ql::Type::String), formal_parameters: vec![], - body: ql::Expression::Equals( + body: Some(ql::Expression::Equals( Box::new(ql::Expression::Var("result")), Box::new(ql::Expression::Dot( Box::new(ql::Expression::Var("this")), "getAPrimaryQlClass", vec![], )), - ), + )), overlay: None, }; let get_location = ql::Predicate { @@ -38,10 +39,10 @@ pub fn create_ast_node_class<'a>( is_final: true, return_type: Some(ql::Type::Normal("L::Location")), formal_parameters: vec![], - body: ql::Expression::Pred( + body: Some(ql::Expression::Pred( node_location_table, vec![ql::Expression::Var("this"), ql::Expression::Var("result")], - ), + )), overlay: None, }; let get_a_field_or_child = create_none_predicate( @@ -58,14 +59,14 @@ pub fn create_ast_node_class<'a>( is_final: true, return_type: Some(ql::Type::Facade("AstNode")), formal_parameters: vec![], - body: ql::Expression::Pred( + body: Some(ql::Expression::Pred( node_parent_table, vec![ ql::Expression::Var("this"), ql::Expression::Var("result"), ql::Expression::Var("_"), ], - ), + )), overlay: None, }; let get_parent_index = ql::Predicate { @@ -78,14 +79,14 @@ pub fn create_ast_node_class<'a>( is_final: true, return_type: Some(ql::Type::Int), formal_parameters: vec![], - body: ql::Expression::Pred( + body: Some(ql::Expression::Pred( node_parent_table, vec![ ql::Expression::Var("this"), ql::Expression::Var("_"), ql::Expression::Var("result"), ], - ), + )), overlay: None, }; let get_a_primary_ql_class = ql::Predicate { @@ -98,10 +99,10 @@ pub fn create_ast_node_class<'a>( is_final: false, return_type: Some(ql::Type::String), formal_parameters: vec![], - body: ql::Expression::Equals( + body: Some(ql::Expression::Equals( Box::new(ql::Expression::Var("result")), Box::new(ql::Expression::String("???")), - ), + )), overlay: None, }; let get_primary_ql_classes = ql::Predicate { @@ -116,7 +117,7 @@ pub fn create_ast_node_class<'a>( is_final: false, return_type: Some(ql::Type::String), formal_parameters: vec![], - body: ql::Expression::Equals( + body: Some(ql::Expression::Equals( Box::new(ql::Expression::Var("result")), Box::new(ql::Expression::Aggregate { name: "concat", @@ -129,7 +130,7 @@ pub fn create_ast_node_class<'a>( )), second_expr: Some(Box::new(ql::Expression::String(","))), }), - ), + )), overlay: None, }; ql::Class { @@ -163,7 +164,12 @@ pub fn create_token_class<'a>(token_type: &'a str, tokeninfo: &'a str) -> ql::Cl is_final: true, return_type: Some(ql::Type::String), formal_parameters: vec![], - body: create_get_field_expr_for_column_storage("result", tokeninfo, 1, tokeninfo_arity), + body: Some(create_get_field_expr_for_column_storage( + "result", + tokeninfo, + 1, + tokeninfo_arity, + )), overlay: None, }; let to_string = ql::Predicate { @@ -176,14 +182,14 @@ pub fn create_token_class<'a>(token_type: &'a str, tokeninfo: &'a str) -> ql::Cl is_final: true, return_type: Some(ql::Type::String), formal_parameters: vec![], - body: ql::Expression::Equals( + body: Some(ql::Expression::Equals( Box::new(ql::Expression::Var("result")), Box::new(ql::Expression::Dot( Box::new(ql::Expression::Var("this")), "getValue", vec![], )), - ), + )), overlay: None, }; ql::Class { @@ -223,12 +229,12 @@ pub fn create_trivia_token_class<'a>( is_final: true, return_type: Some(ql::Type::String), formal_parameters: vec![], - body: create_get_field_expr_for_column_storage( + body: Some(create_get_field_expr_for_column_storage( "result", trivia_tokeninfo, 1, trivia_tokeninfo_arity, - ), + )), overlay: None, }; let to_string = ql::Predicate { @@ -241,14 +247,14 @@ pub fn create_trivia_token_class<'a>( is_final: true, return_type: Some(ql::Type::String), formal_parameters: vec![], - body: ql::Expression::Equals( + body: Some(ql::Expression::Equals( Box::new(ql::Expression::Var("result")), Box::new(ql::Expression::Dot( Box::new(ql::Expression::Var("this")), "getValue", vec![], )), - ), + )), overlay: None, }; ql::Class { @@ -306,7 +312,7 @@ fn create_none_predicate<'a>( is_final: false, return_type, formal_parameters: Vec::new(), - body: ql::Expression::Pred("none", vec![]), + body: Some(ql::Expression::Pred("none", vec![])), overlay: None, } } @@ -324,10 +330,10 @@ fn create_get_a_primary_ql_class(class_name: &str, is_final: bool) -> ql::Predic is_final, return_type: Some(ql::Type::String), formal_parameters: vec![], - body: ql::Expression::Equals( + body: Some(ql::Expression::Equals( Box::new(ql::Expression::Var("result")), Box::new(ql::Expression::String(class_name)), - ), + )), overlay: None, } } @@ -342,13 +348,13 @@ pub fn create_is_overlay_predicate() -> ql::Predicate<'static> { return_type: None, overlay: Some(ql::OverlayAnnotation::Local), formal_parameters: vec![], - body: ql::Expression::Pred( + body: Some(ql::Expression::Pred( "databaseMetadata", vec![ ql::Expression::String("isOverlay"), ql::Expression::String("true"), ], - ), + )), } } @@ -368,7 +374,7 @@ pub fn create_get_node_file_predicate<'a>( name: "node", param_type: ql::Type::At(ast_node_name), }], - body: ql::Expression::Aggregate { + body: Some(ql::Expression::Aggregate { name: "exists", vars: vec![ql::FormalParameter { name: "loc", @@ -390,7 +396,7 @@ pub fn create_get_node_file_predicate<'a>( ], )), second_expr: None, - }, + }), } } @@ -415,7 +421,7 @@ pub fn create_discardable_ast_node_predicate(ast_node_name: &str) -> ql::Predica param_type: ql::Type::At(ast_node_name), }, ], - body: ql::Expression::And(vec![ + body: Some(ql::Expression::And(vec![ ql::Expression::Negation(Box::new(ql::Expression::Pred("isOverlay", vec![]))), ql::Expression::Equals( Box::new(ql::Expression::Var("file")), @@ -424,7 +430,7 @@ pub fn create_discardable_ast_node_predicate(ast_node_name: &str) -> ql::Predica vec![ql::Expression::Var("node")], )), ), - ]), + ])), } } @@ -444,7 +450,7 @@ pub fn create_discard_ast_node_predicate(ast_node_name: &str) -> ql::Predicate<' name: "node", param_type: ql::Type::At(ast_node_name), }], - body: ql::Expression::Aggregate { + body: Some(ql::Expression::Aggregate { name: "exists", vars: vec![ ql::FormalParameter { @@ -468,7 +474,7 @@ pub fn create_discard_ast_node_predicate(ast_node_name: &str) -> ql::Predicate<' ql::Expression::Pred("overlayChangedFiles", vec![ql::Expression::Var("path")]), ])), second_expr: None, - }, + }), } } @@ -493,7 +499,7 @@ pub fn create_discardable_location_predicate() -> ql::Predicate<'static> { param_type: ql::Type::At("location_default"), }, ], - body: ql::Expression::And(vec![ + body: Some(ql::Expression::And(vec![ ql::Expression::Negation(Box::new(ql::Expression::Pred("isOverlay", vec![]))), ql::Expression::Pred( "locations_default", @@ -506,7 +512,7 @@ pub fn create_discardable_location_predicate() -> ql::Predicate<'static> { ql::Expression::Var("_"), ], ), - ]), + ])), } } @@ -529,7 +535,7 @@ pub fn create_discard_location_predicate() -> ql::Predicate<'static> { name: "loc", param_type: ql::Type::At("location_default"), }], - body: ql::Expression::Aggregate { + body: Some(ql::Expression::Aggregate { name: "exists", vars: vec![ ql::FormalParameter { @@ -553,7 +559,7 @@ pub fn create_discard_location_predicate() -> ql::Predicate<'static> { ql::Expression::Pred("overlayChangedFiles", vec![ql::Expression::Var("path")]), ])), second_expr: None, - }, + }), } } @@ -760,7 +766,7 @@ fn create_field_getters<'a>( is_final: true, return_type: return_type.clone(), formal_parameters, - body, + body: Some(body), overlay: None, }]; @@ -773,14 +779,14 @@ fn create_field_getters<'a>( is_final: true, return_type, formal_parameters: vec![], - body: ql::Expression::Equals( + body: Some(ql::Expression::Equals( Box::new(ql::Expression::Var("result")), Box::new(ql::Expression::Dot( Box::new(ql::Expression::Var("this")), &field.getter_name, vec![ql::Expression::Var("_")], )), - ), + )), overlay: None, }); } @@ -828,6 +834,86 @@ fn class_supertypes<'a>( supertypes } +/// Returns whether `a` and `b` have the same signature, i.e. the same name, +/// return type, and formal parameters. Predicates with the same signature can +/// override one another. +fn same_predicate_signature(a: &ql::Predicate, b: &ql::Predicate) -> bool { + a.name == b.name && a.return_type == b.return_type && a.formal_parameters == b.formal_parameters +} + +/// Computes, for each tree-sitter supertype (union) node, the list of +/// predicates that are guaranteed to be defined identically (in terms of +/// name, return type, and formal parameters, though not necessarily body) by +/// every one of its members. These are the predicates that can be hoisted to +/// an `abstract` predicate on the union's class, with the corresponding +/// predicates on its members becoming `override`s. +/// +/// The result for a given node is memoized in `cache` (keyed by its QL class +/// name), and also used to answer the query for any other node that +/// (directly, or transitively through further supertypes) has that node as a +/// member. The same cache also serves as the answer to "what does the class +/// named X expose?", used by `is_predicate_inherited`. +fn compute_exposed_predicates<'a, 'b>( + type_name: &'a node_types::TypeName, + nodes: &'a node_types::NodeTypeMap, + field_predicates: &BTreeMap<&node_types::TypeName, Vec>>, + cache: &'b mut BTreeMap<&'a str, Vec>>, +) -> &'b Vec> { + let node = nodes.get(type_name); + let class_name = node.map_or(type_name.kind.as_str(), |node| node.ql_class_name.as_str()); + if !cache.contains_key(class_name) { + let exposed = match node.map(|node| &node.kind) { + Some(node_types::EntryKind::Table { .. }) => { + field_predicates.get(type_name).cloned().unwrap_or_default() + } + Some(node_types::EntryKind::Union { members }) => { + let mut members = members.iter(); + let mut common = match members.next() { + Some(first) => { + compute_exposed_predicates(first, nodes, field_predicates, cache).clone() + } + None => Vec::new(), + }; + for member in members { + let member_predicates = + compute_exposed_predicates(member, nodes, field_predicates, cache); + common.retain(|predicate| { + member_predicates + .iter() + .any(|other| same_predicate_signature(predicate, other)) + }); + } + common + } + Some(node_types::EntryKind::Token { .. }) | None => Vec::new(), + }; + cache.insert(class_name, exposed); + } + cache.get(class_name).unwrap() +} + +/// Returns whether `predicate` (declared, or about to be declared, on the +/// class for `type_name`) is already exposed by one of `type_name`'s direct +/// supertypes, and therefore must be marked as an `override` (for a concrete +/// predicate) or can be omitted entirely (for an `abstract` one, since it's +/// already inherited). +fn is_predicate_inherited( + predicate: &ql::Predicate, + type_name: &node_types::TypeName, + direct_supertypes: &BTreeMap>, + exposed_predicates: &BTreeMap<&str, Vec>, +) -> bool { + direct_supertypes.get(type_name).is_some_and(|supertypes| { + supertypes.iter().any(|supertype| { + exposed_predicates.get(supertype).is_some_and(|predicates| { + predicates + .iter() + .any(|other| same_predicate_signature(predicate, other)) + }) + }) + }) +} + /// Converts the given node types into CodeQL classes wrapping the dbscheme. pub fn convert_nodes(nodes: &node_types::NodeTypeMap) -> Vec> { let mut classes = Vec::new(); @@ -841,6 +927,71 @@ pub fn convert_nodes(nodes: &node_types::NodeTypeMap) -> Vec> { } } + // First, compute the field-getter predicates (and the expressions used by + // `getAFieldOrChild`) for every table node, without yet knowing whether + // any of them will need to be marked `override`. These are needed both + // to build the final classes below, and to figure out which fields are + // shared identically by all the members of a supertype. + let mut field_predicates: BTreeMap<&node_types::TypeName, Vec>> = + BTreeMap::new(); + let mut get_child_exprs: BTreeMap<&node_types::TypeName, Vec>> = + BTreeMap::new(); + for (type_name, node) in nodes { + if let node_types::EntryKind::Table { + name: main_table_name, + fields, + } = &node.kind + { + if fields.is_empty() { + panic!("Encountered node '{}' with no fields", type_name.kind); + } + + // Count how many columns there will be in the main table. There + // will be one for the id, plus one for each field that's stored + // as a column. + let main_table_arity = 1 + fields + .iter() + .filter(|&f| matches!(f.storage, node_types::Storage::Column { .. })) + .count(); + + let mut main_table_column_index: usize = 0; + let mut predicates = Vec::new(); + let mut exprs = Vec::new(); + for field in fields { + let (get_preds, get_child_expr) = create_field_getters( + main_table_name, + main_table_arity, + &mut main_table_column_index, + field, + nodes, + ); + predicates.extend(get_preds); + if let Some(get_child_expr) = get_child_expr { + exprs.push(get_child_expr) + } + } + field_predicates.insert(type_name, predicates); + get_child_exprs.insert(type_name, exprs); + } + } + + // Next, for every supertype (union) node, compute the predicates that are + // guaranteed to be defined identically (in name, return type, and formal + // parameters) by every one of its members. Such predicates can be hoisted + // to an `abstract` predicate on the supertype's class, with the + // corresponding predicates on its members becoming `override`s. + let mut exposed_predicates: BTreeMap<&str, Vec>> = BTreeMap::new(); + for (type_name, node) in nodes { + if let node_types::EntryKind::Union { .. } = &node.kind { + compute_exposed_predicates( + type_name, + nodes, + &field_predicates, + &mut exposed_predicates, + ); + } + } + for (type_name, node) in nodes { match &node.kind { node_types::EntryKind::Token { kind_id: _ } => { @@ -865,7 +1016,26 @@ pub fn convert_nodes(nodes: &node_types::NodeTypeMap) -> Vec> { } node_types::EntryKind::Union { members: _ } => { // It's a tree-sitter supertype node, so we're wrapping a dbscheme - // union type. + // union type. Any predicate that's identically defined by every + // member becomes an `abstract` predicate here. + let predicates = exposed_predicates + .get(node.ql_class_name.as_str()) + .cloned() + .unwrap_or_default() + .into_iter() + .map(|predicate| ql::Predicate { + overridden: is_predicate_inherited( + &predicate, + type_name, + &direct_supertypes, + &exposed_predicates, + ), + is_private: false, + is_final: false, + body: None, + ..predicate + }) + .collect(); classes.push(ql::TopLevel::Class(ql::Class { qldoc: None, name: &node.ql_class_name, @@ -879,25 +1049,10 @@ pub fn convert_nodes(nodes: &node_types::NodeTypeMap) -> Vec> { &direct_supertypes, ), characteristic_predicate: None, - predicates: vec![], + predicates, })); } - node_types::EntryKind::Table { - name: main_table_name, - fields, - } => { - if fields.is_empty() { - panic!("Encountered node '{}' with no fields", type_name.kind); - } - - // Count how many columns there will be in the main table. There - // will be one for the id, plus one for each field that's stored - // as a column. - let main_table_arity = 1 + fields - .iter() - .filter(|&f| matches!(f.storage, node_types::Storage::Column { .. })) - .count(); - + node_types::EntryKind::Table { .. } => { let main_class_name = &node.ql_class_name; let mut main_class = ql::Class { qldoc: Some(format!("A class representing `{}` nodes.", type_name.kind)), @@ -915,26 +1070,30 @@ pub fn convert_nodes(nodes: &node_types::NodeTypeMap) -> Vec> { predicates: vec![create_get_a_primary_ql_class(main_class_name, true)], }; - let mut main_table_column_index: usize = 0; - let mut get_child_exprs: Vec = Vec::new(); - - // Iterate through the fields, creating: - // - classes to wrap union types if fields need them, - // - predicates to access the fields, - // - the QL expressions to access the fields that will be part of getAFieldOrChild. - for field in fields { - let (get_preds, get_child_expr) = create_field_getters( - main_table_name, - main_table_arity, - &mut main_table_column_index, - field, - nodes, - ); - main_class.predicates.extend(get_preds); - if let Some(get_child_expr) = get_child_expr { - get_child_exprs.push(get_child_expr) - } - } + // A field getter that's identically defined (in signature) by + // every member of one of this node's direct supertypes is an + // override of the corresponding `abstract` predicate declared + // there. + main_class.predicates.extend( + field_predicates + .get(type_name) + .cloned() + .unwrap_or_default() + .into_iter() + .map(|predicate| { + let overridden = predicate.overridden + || is_predicate_inherited( + &predicate, + type_name, + &direct_supertypes, + &exposed_predicates, + ); + ql::Predicate { + overridden, + ..predicate + } + }), + ); main_class.predicates.push(ql::Predicate { qldoc: Some(String::from("Gets a field or child node of this node.")), @@ -944,7 +1103,9 @@ pub fn convert_nodes(nodes: &node_types::NodeTypeMap) -> Vec> { is_final: true, return_type: Some(ql::Type::Facade("AstNode")), formal_parameters: vec![], - body: ql::Expression::Or(get_child_exprs), + body: Some(ql::Expression::Or( + get_child_exprs.get(type_name).cloned().unwrap_or_default(), + )), overlay: None, }); @@ -1038,7 +1199,7 @@ pub fn create_print_ast_module(nodes: &node_types::NodeTypeMap) -> ql::TopLevel< param_type: ql::Type::Int, }, ], - body: ql::Expression::Or(disjuncts), + body: Some(ql::Expression::Or(disjuncts)), overlay: None, }; From a96622e3feba400a5857480228d4ed696ceebdd4 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Fri, 4 Sep 2026 07:57:48 +0200 Subject: [PATCH 0698/2098] Unified: Regenerate Ast.qll --- .../ql/lib/codeql/unified/internal/Ast.qll | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/Ast.qll b/unified/ql/lib/codeql/unified/internal/Ast.qll index cf927e257a9c..d47bd07d142e 100644 --- a/unified/ql/lib/codeql/unified/internal/Ast.qll +++ b/unified/ql/lib/codeql/unified/internal/Ast.qll @@ -104,7 +104,7 @@ module Unified { final F::AccessorKind getAccessorKind() { unified_accessor_declaration_def(this, result, _) } /** Gets the node corresponding to the field `body`. */ - final F::Block getBody() { unified_accessor_declaration_body(this, result) } + final override F::Block getBody() { unified_accessor_declaration_body(this, result) } /** Gets the node corresponding to the field `modifier`. */ final F::Modifier getModifier(int i) { unified_accessor_declaration_modifier(this, i, result) } @@ -373,7 +373,10 @@ module Unified { } } - class Callable extends @unified_callable, F::AstNode { } + class Callable extends @unified_callable, F::AstNode { + /** Gets the node corresponding to the field `body`. */ + abstract F::Block getBody(); + } /** A class representing `catch_clause` nodes. */ class CatchClause extends @unified_catch_clause, F::AstNode { @@ -512,7 +515,7 @@ module Unified { final override string getAPrimaryQlClass() { result = "ConstructorDeclaration" } /** Gets the node corresponding to the field `body`. */ - final F::Block getBody() { unified_constructor_declaration_def(this, result) } + final override F::Block getBody() { unified_constructor_declaration_def(this, result) } /** Gets the node corresponding to the field `modifier`. */ final F::Modifier getModifier(int i) { @@ -592,7 +595,7 @@ module Unified { final override string getAPrimaryQlClass() { result = "DestructorDeclaration" } /** Gets the node corresponding to the field `body`. */ - final F::Block getBody() { unified_destructor_declaration_def(this, result) } + final override F::Block getBody() { unified_destructor_declaration_def(this, result) } /** Gets the node corresponding to the field `modifier`. */ final F::Modifier getModifier(int i) { @@ -727,7 +730,7 @@ module Unified { final override string getAPrimaryQlClass() { result = "FunctionDeclaration" } /** Gets the node corresponding to the field `body`. */ - final F::Block getBody() { unified_function_declaration_body(this, result) } + final override F::Block getBody() { unified_function_declaration_body(this, result) } /** Gets the node corresponding to the field `modifier`. */ final F::Modifier getModifier(int i) { unified_function_declaration_modifier(this, i, result) } @@ -783,7 +786,7 @@ module Unified { final override string getAPrimaryQlClass() { result = "FunctionExpr" } /** Gets the node corresponding to the field `body`. */ - final F::Block getBody() { unified_function_expr_def(this, result) } + final override F::Block getBody() { unified_function_expr_def(this, result) } /** Gets the node corresponding to the field `capture_declaration`. */ final F::VariableDeclaration getCaptureDeclaration(int i) { @@ -958,7 +961,7 @@ module Unified { final override string getAPrimaryQlClass() { result = "InitializerDeclaration" } /** Gets the node corresponding to the field `body`. */ - final F::Block getBody() { unified_initializer_declaration_def(this, result) } + final override F::Block getBody() { unified_initializer_declaration_def(this, result) } /** Gets the node corresponding to the field `modifier`. */ final F::Modifier getModifier(int i) { @@ -1359,7 +1362,7 @@ module Unified { final override string getAPrimaryQlClass() { result = "TopLevel" } /** Gets the node corresponding to the field `body`. */ - final F::Block getBody() { unified_top_level_def(this, result) } + final override F::Block getBody() { unified_top_level_def(this, result) } /** Gets a field or child node of this node. */ final override F::AstNode getAFieldOrChild() { unified_top_level_def(this, result) } From 04865cbecad113e59fd3c86ae388d08195f75839 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Fri, 4 Sep 2026 07:58:47 +0200 Subject: [PATCH 0699/2098] Unified: Simplify callableGetBody. --- .../lib/codeql/unified/internal/ControlFlowGraph.qll | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll index 15db0eb3836e..47bda0e16dd3 100644 --- a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll @@ -46,15 +46,7 @@ private module Ast implements AstSig { class Callable = U::Callable; - AstNode callableGetBody(Callable c) { - result = c.(AccessorDeclaration).getBody() or - result = c.(ConstructorDeclaration).getBody() or - result = c.(DestructorDeclaration).getBody() or - result = c.(FunctionDeclaration).getBody() or - result = c.(FunctionExpr).getBody() or - result = c.(InitializerDeclaration).getBody() or - result = c.(TopLevel).getBody() - } + AstNode callableGetBody(Callable c) { result = c.getBody() } class Parameter extends U::Parameter { Expr getDefaultValue() { result = super.getDefault() } From d456656e6e4bec3ccf547ede8aa006a01fd5b85a Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Fri, 4 Sep 2026 10:28:02 +0200 Subject: [PATCH 0700/2098] Guard against infinite recursion on malformed supertype declarations. --- shared/tree-sitter-extractor/src/generator/ql_gen.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/shared/tree-sitter-extractor/src/generator/ql_gen.rs b/shared/tree-sitter-extractor/src/generator/ql_gen.rs index 04a9e73aee1b..b6f3d45f4b12 100644 --- a/shared/tree-sitter-extractor/src/generator/ql_gen.rs +++ b/shared/tree-sitter-extractor/src/generator/ql_gen.rs @@ -862,6 +862,9 @@ fn compute_exposed_predicates<'a, 'b>( let node = nodes.get(type_name); let class_name = node.map_or(type_name.kind.as_str(), |node| node.ql_class_name.as_str()); if !cache.contains_key(class_name) { + // Supertype declarations that recursively refer to themselves are a mistake, but we don't + // want to cause infinite recursion, so we insert a temporary sentinel. + cache.insert(class_name, Vec::new()); let exposed = match node.map(|node| &node.kind) { Some(node_types::EntryKind::Table { .. }) => { field_predicates.get(type_name).cloned().unwrap_or_default() From 0565ba384b63b743d2edee165c5aa75102ea6d55 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 4 Sep 2026 11:03:40 +0200 Subject: [PATCH 0701/2098] C++: Update supported compiler extensions in docs --- docs/codeql/reusables/supported-versions-compilers.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/codeql/reusables/supported-versions-compilers.rst b/docs/codeql/reusables/supported-versions-compilers.rst index 8651fa91a269..e341918e5931 100644 --- a/docs/codeql/reusables/supported-versions-compilers.rst +++ b/docs/codeql/reusables/supported-versions-compilers.rst @@ -4,9 +4,9 @@ :stub-columns: 1 Language,Variants,Compilers,Extensions - C/C++,"C89, C99, C11, C17, C23, C++98, C++03, C++11, C++14, C++17, C++20, C++23 [1]_ [2]_ [3]_","Clang (including clang-cl and armclang) extensions (up to Clang 21), + C/C++,"C89, C99, C11, C17, C23, C++98, C++03, C++11, C++14, C++17, C++20, C++23 [1]_ [2]_ [3]_","Clang (including clang-cl and armclang) extensions (up to Clang 22), - GNU extensions (up to GCC 15), + GNU extensions (up to GCC 16), Microsoft extensions (up to VS 2022), From 56f5e447ce588328babe14b9798af9e4b76f02ce Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 4 Sep 2026 11:37:32 +0200 Subject: [PATCH 0702/2098] Kotlin: fix broken formatting --- .../src/main/java/com/semmle/util/files/FileUtil.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/kotlin-extractor/src/main/java/com/semmle/util/files/FileUtil.java b/java/kotlin-extractor/src/main/java/com/semmle/util/files/FileUtil.java index 19bdc786c5e2..16df41e5341e 100644 --- a/java/kotlin-extractor/src/main/java/com/semmle/util/files/FileUtil.java +++ b/java/kotlin-extractor/src/main/java/com/semmle/util/files/FileUtil.java @@ -1244,8 +1244,8 @@ public static File tryMakeCanonical (File f) try { // getCanonicalFile does not canonicalize subst drives on Windows, so do this separately. This // is a no-op on non-Windows platforms. - return SubstResolver.resolve(f.getCanonicalFile()); } - catch (IOException ignored) { + return SubstResolver.resolve(f.getCanonicalFile()); + } catch (IOException ignored) { Exceptions.ignore(ignored, "Can't log error: Could be too verbose."); return new File(simplifyPath(f)); } From 4ebad019fc608d8dd0ef84405a9b6e96c6dc9757 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Fri, 4 Sep 2026 11:40:19 +0200 Subject: [PATCH 0703/2098] Cfg: Add consistency check for multiple default cases. --- .../codeql/controlflow/ControlFlowGraph.qll | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll index c3f9868a638a..392a777d3ef4 100644 --- a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll +++ b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll @@ -2286,7 +2286,7 @@ module Make0 Ast> { multipleConditionalSuccessorKinds(node, t1, t2, succ1, succ2) ) or - query = "directAndConditionalSuccessor" and + query = "directAndConditionalSuccessors" and results = strictcount(ControlFlowNode node, ConditionalSuccessor t1, DirectSuccessor t2, ControlFlowNode succ1, ControlFlowNode succ2 | @@ -2295,6 +2295,19 @@ module Make0 Ast> { or query = "selfLoop" and results = strictcount(ControlFlowNode node, SuccessorType t | selfLoop(node, t)) + or + query = "bodyPartNonOverlap" and + results = strictcount(Callable c | bodyPartNonOverlap(c)) + or + query = "parameterNonOverlap" and + results = strictcount(Callable c, Parameter p | parameterNonOverlap(c, p)) + or + query = "parameterEnclosingCallable" and + results = strictcount(Parameter p, Callable c | parameterEnclosingCallable(p, c)) + or + query = "multipleDefaultCases" and + results = + strictcount(Switch s, int defaultCases | multipleDefaultCases(s, defaultCases)) } /** @@ -2495,6 +2508,16 @@ module Make0 Ast> { p = callableGetParameter(c, _) and not c = getEnclosingCallable(p) } + + /** + * Holds if a switch `s` has multiple default cases. + * + * A well-formed switch statement should have at most one default case. + */ + query predicate multipleDefaultCases(Switch s, int defaultCases) { + defaultCases = strictcount(DefaultCase c | s.getCase(_) = c) and + defaultCases > 1 + } } } } From 3ce6182f705bcf5bc2b07952004903de57432f4b Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 3 Sep 2026 11:06:10 +0200 Subject: [PATCH 0704/2098] unified: Rename identifier -> name_node unified: Rename back to Identifier --- unified/extractor/ast_types.yml | 34 +++--- .../extractor/src/languages/swift/swift.rs | 84 ++++++------- .../closures/closure-with-capture-list.output | 2 +- .../swift/closures/trailing-closure.output | 2 +- .../collections/tuple-member-access.output | 2 +- .../swift/control-flow/defer-statement.output | 2 +- .../control-flow/discard-statement.output | 4 +- .../swift/control-flow/fallthrough.output | 4 +- .../swift/control-flow/guard-let.output | 2 +- .../if-let-optional-binding.output | 2 +- .../nested-enum-case-pattern.output | 6 +- .../switch-with-binding-pattern.output | 4 +- ...with-labeled-case-pattern-arguments.output | 8 +- ...with-deeply-nested-path-three-parts.output | 6 +- .../import-with-dotted-path-two-parts.output | 4 +- .../scoped-import-uses-name-pattern.output | 2 +- .../simple-import-with-single-name.output | 2 +- .../expressions/array-type-constructor.output | 2 +- .../expressions/array-type-metatype.output | 2 +- .../expressions/unsafe-expression.output | 2 +- ...onstructor-call-with-type-arguments.output | 6 +- ...nction-call-with-labelled-arguments.output | 2 +- ...nction-with-default-parameter-value.output | 2 +- .../function-with-inout-parameter.output | 4 +- .../function-with-named-parameters.output | 4 +- .../function-with-no-parameters.output | 2 +- ...ion-with-parameters-and-return-type.output | 6 +- .../swift/functions/generic-function.output | 6 +- .../swift/functions/generic-type-alias.output | 6 +- .../leading-dot-expression-call.output | 2 +- .../leading-dot-expression-value.output | 2 +- .../corpus/swift/functions/method-call.output | 2 +- .../functions/nested-function-type.output | 4 +- .../swift/functions/variadic-function.output | 6 +- ...solved-operator-sequence-with-casts.output | 6 +- ...lved-operator-sequence-with-ternary.output | 10 +- .../unresolved-operator-sequence.output | 6 +- .../optional-chaining.output | 4 +- .../optional-enum-case-binding.output | 4 +- .../throwing-function.output | 2 +- ...er-does-not-leak-into-accessor-body.output | 2 +- .../swift/types/class-inheritance.output | 2 +- .../swift/types/class-with-initializer.output | 4 +- .../swift/types/class-with-method.output | 4 +- .../class-with-multiple-base-types.output | 2 +- .../types/class-with-stored-properties.output | 2 +- .../swift/types/computed-property.output | 4 +- ...nditional-compilation-in-class-body.output | 2 +- .../types/constructor-with-parameters.output | 6 +- .../corpus/swift/types/empty-class.output | 2 +- .../types/enum-with-associated-values.output | 6 +- .../corpus/swift/types/enum-with-cases.output | 2 +- ...separated-cases-chained-declaration.output | 2 +- .../tests/corpus/swift/types/extension.output | 4 +- ...ic-class-parameters-and-constraints.output | 6 +- .../swift/types/noncopyable-type.output | 2 +- .../property-with-getter-and-setter.output | 6 +- .../swift/types/protocol-declaration.output | 4 +- ...nd-read-write-property-requirements.output | 38 +++++- ...and-read-write-property-requirements.swift | 1 + .../corpus/swift/types/qualified-type.output | 12 +- .../tests/corpus/swift/types/struct.output | 2 +- ...y-with-willset-and-didset-observers.output | 6 +- .../unified/internal/AnalysisQuality.qll | 2 +- .../ql/lib/codeql/unified/internal/Ast.qll | 112 +++++++++--------- .../unified/internal/ControlFlowGraph.qll | 12 +- .../lib/codeql/unified/internal/FacadeAst.qll | 2 +- .../unified/internal/LocalNameBinding.qll | 37 +++--- .../unified/internal/NameBindingPlugin.qll | 4 +- .../internal/NameBindingPluginSwift.qll | 4 +- .../unified/internal/StaticNameBinding.qll | 14 +-- unified/ql/lib/unified.dbscheme | 42 +++---- unified/ql/lib/utils/test/TestUtils.qll | 4 +- .../ql/test/library-tests/BasicTest/test.ql | 2 +- 74 files changed, 326 insertions(+), 292 deletions(-) diff --git a/unified/extractor/ast_types.yml b/unified/extractor/ast_types.yml index 552fb8d89b64..28f152c24e1e 100644 --- a/unified/extractor/ast_types.yml +++ b/unified/extractor/ast_types.yml @@ -97,10 +97,10 @@ named: top_level: body: block - # An identifier pattern that applies a nested pattern. Used for scoped imports. + # A name pattern that applies a nested pattern. Used for scoped imports. named_pattern: modifier*: modifier - identifier: identifier + name_node: identifier sub_pattern: expr # A pattern expression with modifiers, such as `let x` or `var x`. @@ -176,7 +176,7 @@ named: argument: modifier*: modifier - name?: identifier + name_node?: identifier value: expr # Member access, such as `obj.member`. @@ -184,7 +184,7 @@ named: # For `super.x` the base will be an instance of `super_expr`. member_access_expr: base: expr - member: identifier + member_name_node: identifier # A type expression that refers to a type inferred from the contextual type. # This is used to translate Swift's leading-dot syntax, `.foo`, which means `T.foo` where @@ -232,7 +232,7 @@ named: # would have `person` as the external name and a `named_pattern` wrapping `id` as the parameter's pattern. parameter: modifier*: modifier - external_name?: identifier + external_name_node?: identifier type?: expr pattern?: expr default?: expr @@ -279,17 +279,17 @@ named: # `break` (with optional label) break_expr: - label?: identifier + label_name_node?: identifier # `continue` (with optional label) continue_expr: - label?: identifier + label_name_node?: identifier # A labeled statement, such as `outer: for ... { ... }`. The labeled # statement appears as the `stmt` field; `break`/`continue` may target # the label. labeled_stmt: - label: identifier + label_name_node: identifier stmt: stmt # `return value` or bare `return` @@ -315,7 +315,7 @@ named: # `typealias Name = Type` type_alias_declaration: modifier*: modifier - name: identifier + name_node: identifier type_parameter*: type_parameter type_constraint*: type_constraint type: expr @@ -323,7 +323,7 @@ named: # A top-level function declaration. function_declaration: modifier*: modifier - name: identifier + name_node: identifier type_parameter*: type_parameter type_constraint*: type_constraint parameter*: parameter @@ -418,7 +418,7 @@ named: bulk_importing_pattern: modifier*: modifier - # An simple unqualified identifier token + # A simple unqualified name token identifier: # A node that we don't yet translate @@ -436,7 +436,7 @@ named: type_parameter: modifier*: modifier - name: identifier + name_node: identifier bound?: expr # A generic constraint of the form `T == U`, requiring two types to be @@ -456,7 +456,7 @@ named: # `infix operator +++` (and the like) — a declaration of a custom operator. operator_syntax_declaration: modifier*: modifier - name: identifier + name_node: identifier # The fixity specifier (`prefix`, `infix`, `postfix`), when applicable. fixity?: fixity # The declared precedence level, when present (e.g. Swift's @@ -471,7 +471,7 @@ named: # no `name`; the extended type appears as a `base_type`. class_like_declaration: modifier*: modifier - name?: identifier + name_node?: identifier type_parameter*: type_parameter type_constraint*: type_constraint base_type*: base_type @@ -487,7 +487,7 @@ named: constructor_declaration: modifier*: modifier - name?: identifier + name_node?: identifier parameter*: parameter body: block @@ -507,7 +507,7 @@ named: # (each observer also tagged with `chained_declaration`). accessor_declaration: modifier*: modifier - name: identifier + name_node: identifier accessor_kind: accessor_kind parameter*: parameter type?: expr @@ -523,7 +523,7 @@ named: associated_type_declaration: modifier*: modifier - name: identifier + name_node: identifier bound?: expr generic_type_expr: diff --git a/unified/extractor/src/languages/swift/swift.rs b/unified/extractor/src/languages/swift/swift.rs index 1dd3d6a6bfd8..d5c79fe92690 100644 --- a/unified/extractor/src/languages/swift/swift.rs +++ b/unified/extractor/src/languages/swift/swift.rs @@ -8,10 +8,10 @@ use yeast::{ConcreteDesugarer, DesugaringConfig, PhaseKind, Rule, rule, tree}; /// post-hoc mutation. #[derive(Clone, Default)] struct SwiftContext { - /// Identifier node for the property name. Set by the accessor-bearing + /// Name node for the property name. Set by the accessor-bearing /// `variableDecl` rule before translating the accessor block; read by the /// inner `accessorDecl` rules to name each `accessor_declaration`. - property_name: Option, + property_name_node: Option, /// Translated type node for the property type. Set (for computed /// properties) by the accessor-bearing `variableDecl` rule; read by the /// inner `accessorDecl` rules. Left `None` for stored properties with @@ -105,7 +105,7 @@ fn make_or_pattern( } /// Translate a multi-part identifier (for example `Foo.Bar.Baz`) into a -/// `member_access_expr` chain rooted at an `identifier` for the first +/// `member_access_expr` chain rooted at a `name_node` for the first /// part. Panics on an empty input because the grammar's `_+` quantifier /// guarantees at least one part. fn member_chain( @@ -119,7 +119,7 @@ fn member_chain( let init = tree!((identifier #{first})); iter.fold( init, - |acc, elem| tree!((member_access_expr base: {acc} member: (identifier #{elem}))), + |acc, elem| tree!((member_access_expr base: {acc} member_name_node: (identifier #{elem}))), ) } @@ -194,7 +194,7 @@ fn translation_rules() -> Vec> { rule!((declReferenceExpr baseName: @name) => (identifier #{name})), // A discard `_` used as an expression — e.g. the target of a discarding // assignment `_ = x`. swift-syntax models it as a `discardAssignmentExpr`; - // the target AST represents it as an `identifier` over the `_` token. + // the target AST represents it as a `name_node` over the `_` token. rule!((discardAssignmentExpr wildcard: @@w) => (identifier #{w})), // A generic specialization in expression position (`C`, // `Array`) is represented by swift-syntax as a @@ -299,7 +299,7 @@ fn translation_rules() -> Vec> { => (accessor_declaration modifier: (modifier #{spec}) - name: (identifier #{name}) + name_node: (identifier #{name}) type: {ty} accessor_kind: (accessor_kind "get") body: (block stmt: {body})) @@ -330,7 +330,7 @@ fn translation_rules() -> Vec> { => member* { ctx.outer_modifiers = vec![tree!((modifier #{spec}))]; - ctx.property_name = Some(tree!((identifier #{name}))); + ctx.property_name_node = Some(tree!((identifier #{name}))); let mut result = Vec::new(); if let Some(val) = val { // Stored property with observers: the initializer is not part @@ -377,7 +377,7 @@ fn translation_rules() -> Vec> { }; let chained = chained_modifier(&mut ctx); let name = ctx - .property_name + .property_name_node .ok_or("accessor outside property context")?; let ty = ctx.property_type; let body = match body { @@ -391,7 +391,7 @@ fn translation_rules() -> Vec> { (accessor_declaration modifier: {binding} modifier: {chained} - name: {name} + name_node: {name} type: {ty} accessor_kind: (accessor_kind #{spec}) body: {body}) @@ -466,7 +466,7 @@ fn translation_rules() -> Vec> { modifier: {ctx.outer_modifiers.clone()} modifier: {chained_modifier(&mut ctx)} modifier: (modifier "enum_case") - name: (identifier #{name}) + name_node: (identifier #{name}) member: (constructor_declaration parameter: {params} body: (block))) ), rule!( @@ -528,7 +528,7 @@ fn translation_rules() -> Vec> { rule!( (tuplePatternElement label: _? @@label pattern: @p) => - (argument name: (identifier #{label})? value: {p}) + (argument name_node: (identifier #{label})? value: {p}) ), // A type-casting pattern (`case is T`). Not yet supported, so it is // mapped to `unsupported_node` — an explicit reminder that this needs @@ -560,7 +560,7 @@ fn translation_rules() -> Vec> { body: (codeBlock statements: _* @body)) => (function_declaration - name: (identifier #{name}) + name_node: (identifier #{name}) type_parameter: {type_params} parameter: {params} return_type: {ret} @@ -575,7 +575,7 @@ fn translation_rules() -> Vec> { returnClause: (returnClause type: @ret)?)) => (function_declaration - name: (identifier #{name}) + name_node: (identifier #{name}) type_parameter: {type_params} parameter: {params} return_type: {ret} @@ -598,7 +598,7 @@ fn translation_rules() -> Vec> { None => (None, first), }; tree!((parameter - external_name: {external} + external_name_node: {external} pattern: (identifier #{name}) type: {ty} default: {val})) @@ -667,25 +667,25 @@ fn translation_rules() -> Vec> { => argument { tree!((argument - name: (identifier #{lbl})? + name_node: (identifier #{lbl})? value: (call_expr callee: {constructor} argument: {elements}))) } ), rule!( (labeledExpr label: _? @@lbl expression: (patternExpr pattern: @p)) => - (argument name: (identifier #{lbl})? value: {p}) + (argument name_node: (identifier #{lbl})? value: {p}) ), rule!( (labeledExpr label: _? @@lbl expression: (discardAssignmentExpr) @@wildcard) => - (argument name: (identifier #{lbl})? value: (identifier #{wildcard})) + (argument name_node: (identifier #{lbl})? value: (identifier #{wildcard})) ), rule!( (labeledExpr label: _? @@lbl expression: @val) => argument { - tree!((argument name: (identifier #{lbl})? value: {val})) + tree!((argument name_node: (identifier #{lbl})? value: {val})) } ), // Member access (`list.append`). The `declName` is itself a @@ -704,24 +704,24 @@ fn translation_rules() -> Vec> { base: (generic_type_expr base: (identifier "Array") type_argument: {element}) - member: (identifier #{member})) + member_name_node: (identifier #{member})) ), rule!( (memberAccessExpr base: @base declName: (declReferenceExpr baseName: @member)) => - (member_access_expr base: {base} member: (identifier #{member})) + (member_access_expr base: {base} member_name_node: (identifier #{member})) ), rule!( (memberAccessExpr period: @dot declName: (declReferenceExpr baseName: @member)) => - (member_access_expr base: (inferred_type_expr #{dot}) member: (identifier #{member})) + (member_access_expr base: (inferred_type_expr #{dot}) member_name_node: (identifier #{member})) ), // Control transfer, one rule per keyword. `return` carries an optional // value; `break` / `continue` an optional target label; `throw` its // thrown expression. rule!((returnStmt expression: _? @val) => (return_expr value: {val})), - rule!((breakStmt label: _? @@lbl) => (break_expr label: (identifier #{lbl})?)), - rule!((continueStmt label: _? @@lbl) => (continue_expr label: (identifier #{lbl})?)), + rule!((breakStmt label: _? @@lbl) => (break_expr label_name_node: (identifier #{lbl})?)), + rule!((continueStmt label: _? @@lbl) => (continue_expr label_name_node: (identifier #{lbl})?)), rule!((throwStmt expression: @val) => (throw_expr value: {val})), // ---- Closures ---- // A closure (`{ (x: Int) -> Int in … }`) becomes a `function_expr`. The @@ -748,7 +748,7 @@ fn translation_rules() -> Vec> { ), // A closure capture (`[weak self]`, `[x]`, `[y = expr]`). The optional // ownership specifier (`weak`/`unowned`) becomes a modifier; the - // captured name becomes the bound `identifier`; an explicit capture + // captured name becomes the bound `name_node`; an explicit capture // initializer (`[y = expr]`) becomes the bound value. rule!( (closureCapture @@ -847,7 +847,7 @@ fn translation_rules() -> Vec> { (pattern_guard_expr value: {val} pattern: (call_expr - callee: (member_access_expr base: (identifier "Optional") member: (identifier "some")) + callee: (member_access_expr base: (identifier "Optional") member_name_node: (identifier "some")) argument: (argument value: (expr_pattern modifier: (modifier "let") expr: (identifier #{name}))))) @@ -858,7 +858,7 @@ fn translation_rules() -> Vec> { (pattern_guard_expr value: (identifier #{name}) pattern: (call_expr - callee: (member_access_expr base: (identifier "Optional") member: (identifier "some")) + callee: (member_access_expr base: (identifier "Optional") member_name_node: (identifier "some")) argument: (argument value: (expr_pattern modifier: (modifier "let") expr: (identifier #{name}))))) @@ -905,7 +905,7 @@ fn translation_rules() -> Vec> { rule!( (labeledStmt label: @@lbl statement: @stmt) => - (labeled_stmt label: (identifier #{lbl}) stmt: {stmt}) + (labeled_stmt label_name_node: (identifier #{lbl}) stmt: {stmt}) ), // ---- Collections ---- // An array literal (`[1, 2, 3]`). Each `arrayElement` unwraps to its @@ -936,7 +936,7 @@ fn translation_rules() -> Vec> { tree!((call_expr callee: (member_access_expr base: (identifier "Optional") - member: (identifier "some")) + member_name_node: (identifier "some")) argument: (argument value: {inner}))) } else { inner @@ -995,10 +995,10 @@ fn translation_rules() -> Vec> { rule!((forceUnwrapExpr expression: @e) => (unary_expr operator: (postfix_operator "!") operand: {e})), // ---- Imports ---- // An import declaration. The dotted path (a list of - // `importPathComponent`s) becomes an `identifier`/`member_access_expr` + // `importPathComponent`s) becomes a `name_node`/`member_access_expr` // chain (via `member_chain`). A scoped import (`import struct Foo.Bar`) // has an `importKindSpecifier` and binds the last path component as a - // raw identifier; a plain import (`import Foundation`) has none and uses + // raw name node; a plain import (`import Foundation`) has none and uses // a `bulk_importing_pattern` spanning the whole declaration. Any leading // attributes (`@_exported`) and access modifiers (`public`) become // `modifier`s. @@ -1013,7 +1013,7 @@ fn translation_rules() -> Vec> { let last = *parts.last().ok_or("import has no path")?; let pattern = match kind { None => tree!((named_pattern - identifier: (identifier #{last}) + name_node: (identifier #{last}) sub_pattern: (bulk_importing_pattern))), Some(_) => tree!((identifier #{last})), }; @@ -1056,7 +1056,7 @@ fn translation_rules() -> Vec> { rule!( (memberType baseType: @base name: @@name) => - (member_access_expr base: {base} member: (identifier #{name})) + (member_access_expr base: {base} member_name_node: (identifier #{name})) ), // Sugared types desugar to `generic_type_expr`: `T?` -> Optional, // `[T]` -> Array, `[K: V]` -> Dictionary. @@ -1111,9 +1111,9 @@ fn translation_rules() -> Vec> { => argument { if ctx.in_function_type { - tree!((parameter external_name: (identifier #{name})? type: {ty})) + tree!((parameter external_name_node: (identifier #{name})? type: {ty})) } else { - tree!((argument name: (identifier #{name})? value: {ty})) + tree!((argument name_node: (identifier #{name})? value: {ty})) } } ), @@ -1134,7 +1134,7 @@ fn translation_rules() -> Vec> { (type_parameter modifier: {attrs} modifier: (modifier #{spec})? - name: (identifier #{name}) + name_node: (identifier #{name}) bound: {bound}) ), rule!( @@ -1165,7 +1165,7 @@ fn translation_rules() -> Vec> { (class_like_declaration modifier: (modifier #{kind}) modifier: {mods} - name: (identifier #{name}) + name_node: (identifier #{name}) type_parameter: {params} type_constraint: {parameter_constraints} type_constraint: {declaration_constraints} @@ -1188,7 +1188,7 @@ fn translation_rules() -> Vec> { (class_like_declaration modifier: (modifier #{kind}) modifier: {mods} - name: (identifier #{name}) + name_node: (identifier #{name}) type_parameter: {params} type_constraint: {parameter_constraints} type_constraint: {declaration_constraints} @@ -1211,7 +1211,7 @@ fn translation_rules() -> Vec> { (class_like_declaration modifier: (modifier #{kind}) modifier: {mods} - name: (identifier #{name}) + name_node: (identifier #{name}) type_parameter: {params} type_constraint: {parameter_constraints} type_constraint: {declaration_constraints} @@ -1232,7 +1232,7 @@ fn translation_rules() -> Vec> { (class_like_declaration modifier: (modifier #{kind}) modifier: {mods} - name: (identifier #{name}) + name_node: (identifier #{name}) type_parameter: {params} type_constraint: {declaration_constraints} base_type: {bases.into_iter().map(|ty| tree!((base_type type: {ty})))} @@ -1253,7 +1253,7 @@ fn translation_rules() -> Vec> { (class_like_declaration modifier: (modifier #{kind}) modifier: {mods} - name: (identifier #{name}) + name_node: (identifier #{name}) base_type: {bases.into_iter().map(|ty| tree!((base_type type: {ty})))} member: {members}) ), @@ -1294,7 +1294,7 @@ fn translation_rules() -> Vec> { => (type_alias_declaration modifier: {mods} - name: (identifier #{name}) + name_node: (identifier #{name}) type_parameter: {type_params} r#type: {val}) ), @@ -1307,7 +1307,7 @@ fn translation_rules() -> Vec> { => (associated_type_declaration modifier: {mods} - name: (identifier #{name}) + name_node: (identifier #{name}) bound: {bound}) ), // ---- Fallbacks ---- diff --git a/unified/extractor/tests/corpus/swift/closures/closure-with-capture-list.output b/unified/extractor/tests/corpus/swift/closures/closure-with-capture-list.output index 04779c095df8..64de98c7b745 100644 --- a/unified/extractor/tests/corpus/swift/closures/closure-with-capture-list.output +++ b/unified/extractor/tests/corpus/swift/closures/closure-with-capture-list.output @@ -80,4 +80,4 @@ top_level callee: member_access_expr base: identifier "self" - member: identifier "doThing" + member_name_node: identifier "doThing" diff --git a/unified/extractor/tests/corpus/swift/closures/trailing-closure.output b/unified/extractor/tests/corpus/swift/closures/trailing-closure.output index 83bdf051b24a..399075b488db 100644 --- a/unified/extractor/tests/corpus/swift/closures/trailing-closure.output +++ b/unified/extractor/tests/corpus/swift/closures/trailing-closure.output @@ -47,7 +47,7 @@ top_level callee: member_access_expr base: identifier "xs" - member: identifier "map" + member_name_node: identifier "map" argument: argument value: diff --git a/unified/extractor/tests/corpus/swift/collections/tuple-member-access.output b/unified/extractor/tests/corpus/swift/collections/tuple-member-access.output index 84496832c073..ed31af94f0aa 100644 --- a/unified/extractor/tests/corpus/swift/collections/tuple-member-access.output +++ b/unified/extractor/tests/corpus/swift/collections/tuple-member-access.output @@ -41,4 +41,4 @@ top_level value: member_access_expr base: identifier "t" - member: identifier "0" + member_name_node: identifier "0" diff --git a/unified/extractor/tests/corpus/swift/control-flow/defer-statement.output b/unified/extractor/tests/corpus/swift/control-flow/defer-statement.output index 8032d521df75..0a9adb11a990 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/defer-statement.output +++ b/unified/extractor/tests/corpus/swift/control-flow/defer-statement.output @@ -80,7 +80,7 @@ top_level block stmt: function_declaration - name: identifier "withCleanup" + name_node: identifier "withCleanup" body: block stmt: diff --git a/unified/extractor/tests/corpus/swift/control-flow/discard-statement.output b/unified/extractor/tests/corpus/swift/control-flow/discard-statement.output index 7e0eac29c0fc..8fc2dfb9d963 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/discard-statement.output +++ b/unified/extractor/tests/corpus/swift/control-flow/discard-statement.output @@ -69,13 +69,13 @@ top_level stmt: class_like_declaration modifier: modifier "struct" - name: identifier "Resource" + name_node: identifier "Resource" base_type: base_type type: unsupported_node "~Copyable" member: function_declaration - name: identifier "close" + name_node: identifier "close" body: block stmt: unsupported_node "discard self" diff --git a/unified/extractor/tests/corpus/swift/control-flow/fallthrough.output b/unified/extractor/tests/corpus/swift/control-flow/fallthrough.output index bc8943e35763..a0920ac436aa 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/fallthrough.output +++ b/unified/extractor/tests/corpus/swift/control-flow/fallthrough.output @@ -87,10 +87,10 @@ top_level block stmt: function_declaration - name: identifier "classify" + name_node: identifier "classify" parameter: parameter - external_name: identifier "_" + external_name_node: identifier "_" type: identifier "Int" pattern: identifier "x" body: diff --git a/unified/extractor/tests/corpus/swift/control-flow/guard-let.output b/unified/extractor/tests/corpus/swift/control-flow/guard-let.output index 6a694affb251..2eb1682529f1 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/guard-let.output +++ b/unified/extractor/tests/corpus/swift/control-flow/guard-let.output @@ -48,7 +48,7 @@ top_level callee: member_access_expr base: identifier "Optional" - member: identifier "some" + member_name_node: identifier "some" argument: argument value: diff --git a/unified/extractor/tests/corpus/swift/control-flow/if-let-optional-binding.output b/unified/extractor/tests/corpus/swift/control-flow/if-let-optional-binding.output index 096f4c6c3c8e..1a09a2874e9a 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/if-let-optional-binding.output +++ b/unified/extractor/tests/corpus/swift/control-flow/if-let-optional-binding.output @@ -61,7 +61,7 @@ top_level callee: member_access_expr base: identifier "Optional" - member: identifier "some" + member_name_node: identifier "some" argument: argument value: diff --git a/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output b/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output index 59a8198ed919..4d0afdcb77db 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output +++ b/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output @@ -171,7 +171,7 @@ top_level callee: member_access_expr base: inferred_type_expr "." - member: identifier "received" + member_name_node: identifier "received" argument: argument value: @@ -179,7 +179,7 @@ top_level callee: member_access_expr base: inferred_type_expr "." - member: identifier "some" + member_name_node: identifier "some" argument: argument value: identifier "value" @@ -201,7 +201,7 @@ top_level callee: member_access_expr base: identifier "Type" - member: identifier "some" + member_name_node: identifier "some" argument: argument value: diff --git a/unified/extractor/tests/corpus/swift/control-flow/switch-with-binding-pattern.output b/unified/extractor/tests/corpus/swift/control-flow/switch-with-binding-pattern.output index 466c3fbb6989..5820da95f35c 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/switch-with-binding-pattern.output +++ b/unified/extractor/tests/corpus/swift/control-flow/switch-with-binding-pattern.output @@ -128,7 +128,7 @@ top_level callee: member_access_expr base: inferred_type_expr "." - member: identifier "circle" + member_name_node: identifier "circle" argument: argument value: @@ -149,7 +149,7 @@ top_level callee: member_access_expr base: inferred_type_expr "." - member: identifier "square" + member_name_node: identifier "square" argument: argument value: diff --git a/unified/extractor/tests/corpus/swift/control-flow/switch-with-labeled-case-pattern-arguments.output b/unified/extractor/tests/corpus/swift/control-flow/switch-with-labeled-case-pattern-arguments.output index 532b72eab51f..aca699ad6f74 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/switch-with-labeled-case-pattern-arguments.output +++ b/unified/extractor/tests/corpus/swift/control-flow/switch-with-labeled-case-pattern-arguments.output @@ -136,10 +136,10 @@ top_level callee: member_access_expr base: inferred_type_expr "." - member: identifier "implicit" + member_name_node: identifier "implicit" argument: argument - name: identifier "isAcknowledged" + name_node: identifier "isAcknowledged" value: boolean_literal "false" body: block @@ -155,10 +155,10 @@ top_level callee: member_access_expr base: inferred_type_expr "." - member: identifier "thread" + member_name_node: identifier "thread" argument: argument - name: identifier "threadRowId" + name_node: identifier "threadRowId" value: identifier "_" argument value: diff --git a/unified/extractor/tests/corpus/swift/desugar/import-with-deeply-nested-path-three-parts.output b/unified/extractor/tests/corpus/swift/desugar/import-with-deeply-nested-path-three-parts.output index 9c7f425f41b6..85e830e07383 100644 --- a/unified/extractor/tests/corpus/swift/desugar/import-with-deeply-nested-path-three-parts.output +++ b/unified/extractor/tests/corpus/swift/desugar/import-with-deeply-nested-path-three-parts.output @@ -33,9 +33,9 @@ top_level base: member_access_expr base: identifier "Foundation" - member: identifier "Networking" - member: identifier "URLSession" + member_name_node: identifier "Networking" + member_name_node: identifier "URLSession" pattern: named_pattern - identifier: identifier "URLSession" + name_node: identifier "URLSession" sub_pattern: bulk_importing_pattern "import Foundation.Networking.URLSession" diff --git a/unified/extractor/tests/corpus/swift/desugar/import-with-dotted-path-two-parts.output b/unified/extractor/tests/corpus/swift/desugar/import-with-dotted-path-two-parts.output index e3b18f34db1c..966d399f070d 100644 --- a/unified/extractor/tests/corpus/swift/desugar/import-with-dotted-path-two-parts.output +++ b/unified/extractor/tests/corpus/swift/desugar/import-with-dotted-path-two-parts.output @@ -28,8 +28,8 @@ top_level imported_expr: member_access_expr base: identifier "Foundation" - member: identifier "Networking" + member_name_node: identifier "Networking" pattern: named_pattern - identifier: identifier "Networking" + name_node: identifier "Networking" sub_pattern: bulk_importing_pattern "import Foundation.Networking" diff --git a/unified/extractor/tests/corpus/swift/desugar/scoped-import-uses-name-pattern.output b/unified/extractor/tests/corpus/swift/desugar/scoped-import-uses-name-pattern.output index 451067727e35..6983e5408fbc 100644 --- a/unified/extractor/tests/corpus/swift/desugar/scoped-import-uses-name-pattern.output +++ b/unified/extractor/tests/corpus/swift/desugar/scoped-import-uses-name-pattern.output @@ -30,5 +30,5 @@ top_level imported_expr: member_access_expr base: identifier "Foundation" - member: identifier "Date" + member_name_node: identifier "Date" pattern: identifier "Date" diff --git a/unified/extractor/tests/corpus/swift/desugar/simple-import-with-single-name.output b/unified/extractor/tests/corpus/swift/desugar/simple-import-with-single-name.output index 6b4e171983d4..a7c401563932 100644 --- a/unified/extractor/tests/corpus/swift/desugar/simple-import-with-single-name.output +++ b/unified/extractor/tests/corpus/swift/desugar/simple-import-with-single-name.output @@ -25,5 +25,5 @@ top_level imported_expr: identifier "Foundation" pattern: named_pattern - identifier: identifier "Foundation" + name_node: identifier "Foundation" sub_pattern: bulk_importing_pattern "import Foundation" diff --git a/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.output b/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.output index 19a7d4df0774..be59a73183d9 100644 --- a/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.output +++ b/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.output @@ -154,7 +154,7 @@ top_level type_argument: identifier "Void" argument: argument - name: identifier "unsafeUninitializedCapacity" + name_node: identifier "unsafeUninitializedCapacity" value: int_literal "1" argument value: diff --git a/unified/extractor/tests/corpus/swift/expressions/array-type-metatype.output b/unified/extractor/tests/corpus/swift/expressions/array-type-metatype.output index 2a7f9df2cf05..080cf34bb3c1 100644 --- a/unified/extractor/tests/corpus/swift/expressions/array-type-metatype.output +++ b/unified/extractor/tests/corpus/swift/expressions/array-type-metatype.output @@ -64,4 +64,4 @@ top_level generic_type_expr base: identifier "Result" type_argument: identifier "Void" - member: identifier "self" + member_name_node: identifier "self" diff --git a/unified/extractor/tests/corpus/swift/expressions/unsafe-expression.output b/unified/extractor/tests/corpus/swift/expressions/unsafe-expression.output index 2bdc964ddeaa..a91bf6e2684c 100644 --- a/unified/extractor/tests/corpus/swift/expressions/unsafe-expression.output +++ b/unified/extractor/tests/corpus/swift/expressions/unsafe-expression.output @@ -46,6 +46,6 @@ top_level block stmt: function_declaration - name: identifier "doWork" + name_node: identifier "doWork" body: block "func doWork() {}" unsupported_node "unsafe doWork()" diff --git a/unified/extractor/tests/corpus/swift/functions/constructor-call-with-type-arguments.output b/unified/extractor/tests/corpus/swift/functions/constructor-call-with-type-arguments.output index 364a2022cc62..baf959c0cc86 100644 --- a/unified/extractor/tests/corpus/swift/functions/constructor-call-with-type-arguments.output +++ b/unified/extractor/tests/corpus/swift/functions/constructor-call-with-type-arguments.output @@ -82,13 +82,13 @@ top_level stmt: class_like_declaration modifier: modifier "class" - name: identifier "Foo" + name_node: identifier "Foo" class_like_declaration modifier: modifier "class" - name: identifier "C" + name_node: identifier "C" type_parameter: type_parameter - name: identifier "T" + name_node: identifier "T" variable_declaration modifier: modifier "let" pattern: identifier "x" diff --git a/unified/extractor/tests/corpus/swift/functions/function-call-with-labelled-arguments.output b/unified/extractor/tests/corpus/swift/functions/function-call-with-labelled-arguments.output index b8ff5468aa88..81c2af30295d 100644 --- a/unified/extractor/tests/corpus/swift/functions/function-call-with-labelled-arguments.output +++ b/unified/extractor/tests/corpus/swift/functions/function-call-with-labelled-arguments.output @@ -36,5 +36,5 @@ top_level callee: identifier "greet" argument: argument - name: identifier "person" + name_node: identifier "person" value: string_literal "\"Bob\"" diff --git a/unified/extractor/tests/corpus/swift/functions/function-with-default-parameter-value.output b/unified/extractor/tests/corpus/swift/functions/function-with-default-parameter-value.output index ed4989826cd6..3d4c6483cb50 100644 --- a/unified/extractor/tests/corpus/swift/functions/function-with-default-parameter-value.output +++ b/unified/extractor/tests/corpus/swift/functions/function-with-default-parameter-value.output @@ -66,7 +66,7 @@ top_level block stmt: function_declaration - name: identifier "greet" + name_node: identifier "greet" parameter: parameter type: identifier "String" diff --git a/unified/extractor/tests/corpus/swift/functions/function-with-inout-parameter.output b/unified/extractor/tests/corpus/swift/functions/function-with-inout-parameter.output index a568b9da17e7..198bb22bb29f 100644 --- a/unified/extractor/tests/corpus/swift/functions/function-with-inout-parameter.output +++ b/unified/extractor/tests/corpus/swift/functions/function-with-inout-parameter.output @@ -62,10 +62,10 @@ top_level block stmt: function_declaration - name: identifier "increment" + name_node: identifier "increment" parameter: parameter - external_name: identifier "_" + external_name_node: identifier "_" type: unsupported_node "inout Int" pattern: identifier "x" body: diff --git a/unified/extractor/tests/corpus/swift/functions/function-with-named-parameters.output b/unified/extractor/tests/corpus/swift/functions/function-with-named-parameters.output index fb23a5bd55bf..6ad2a386ae8e 100644 --- a/unified/extractor/tests/corpus/swift/functions/function-with-named-parameters.output +++ b/unified/extractor/tests/corpus/swift/functions/function-with-named-parameters.output @@ -57,10 +57,10 @@ top_level block stmt: function_declaration - name: identifier "greet" + name_node: identifier "greet" parameter: parameter - external_name: identifier "person" + external_name_node: identifier "person" type: identifier "String" pattern: identifier "name" body: diff --git a/unified/extractor/tests/corpus/swift/functions/function-with-no-parameters.output b/unified/extractor/tests/corpus/swift/functions/function-with-no-parameters.output index 99ba3a45e2e1..39c0b67786e2 100644 --- a/unified/extractor/tests/corpus/swift/functions/function-with-no-parameters.output +++ b/unified/extractor/tests/corpus/swift/functions/function-with-no-parameters.output @@ -52,7 +52,7 @@ top_level block stmt: function_declaration - name: identifier "greet" + name_node: identifier "greet" body: block stmt: diff --git a/unified/extractor/tests/corpus/swift/functions/function-with-parameters-and-return-type.output b/unified/extractor/tests/corpus/swift/functions/function-with-parameters-and-return-type.output index 6f5d2aa98f9d..88311a0596e7 100644 --- a/unified/extractor/tests/corpus/swift/functions/function-with-parameters-and-return-type.output +++ b/unified/extractor/tests/corpus/swift/functions/function-with-parameters-and-return-type.output @@ -74,14 +74,14 @@ top_level block stmt: function_declaration - name: identifier "add" + name_node: identifier "add" parameter: parameter - external_name: identifier "_" + external_name_node: identifier "_" type: identifier "Int" pattern: identifier "a" parameter - external_name: identifier "_" + external_name_node: identifier "_" type: identifier "Int" pattern: identifier "b" return_type: identifier "Int" diff --git a/unified/extractor/tests/corpus/swift/functions/generic-function.output b/unified/extractor/tests/corpus/swift/functions/generic-function.output index e296b760ccaa..646ee6196166 100644 --- a/unified/extractor/tests/corpus/swift/functions/generic-function.output +++ b/unified/extractor/tests/corpus/swift/functions/generic-function.output @@ -64,13 +64,13 @@ top_level block stmt: function_declaration - name: identifier "identity" + name_node: identifier "identity" type_parameter: type_parameter - name: identifier "T" + name_node: identifier "T" parameter: parameter - external_name: identifier "_" + external_name_node: identifier "_" type: identifier "T" pattern: identifier "x" return_type: identifier "T" diff --git a/unified/extractor/tests/corpus/swift/functions/generic-type-alias.output b/unified/extractor/tests/corpus/swift/functions/generic-type-alias.output index 6bc55e07b0af..459aec5b784c 100644 --- a/unified/extractor/tests/corpus/swift/functions/generic-type-alias.output +++ b/unified/extractor/tests/corpus/swift/functions/generic-type-alias.output @@ -56,13 +56,13 @@ top_level block stmt: type_alias_declaration - name: identifier "Box" + name_node: identifier "Box" type_parameter: type_parameter - name: identifier "T" + name_node: identifier "T" bound: identifier "Equatable" type_parameter - name: identifier "U" + name_node: identifier "U" type: generic_type_expr base: identifier "Dictionary" diff --git a/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-call.output b/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-call.output index 92da0bab18f6..5cb220bbb681 100644 --- a/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-call.output +++ b/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-call.output @@ -50,7 +50,7 @@ top_level callee: member_access_expr base: inferred_type_expr "." - member: identifier "some" + member_name_node: identifier "some" argument: argument value: int_literal "1" diff --git a/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-value.output b/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-value.output index 310d9278f54a..1c2eab54b2ef 100644 --- a/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-value.output +++ b/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-value.output @@ -38,4 +38,4 @@ top_level value: member_access_expr base: inferred_type_expr "." - member: identifier "foo" + member_name_node: identifier "foo" diff --git a/unified/extractor/tests/corpus/swift/functions/method-call.output b/unified/extractor/tests/corpus/swift/functions/method-call.output index eb6985200bd8..52a36238c2d5 100644 --- a/unified/extractor/tests/corpus/swift/functions/method-call.output +++ b/unified/extractor/tests/corpus/swift/functions/method-call.output @@ -36,7 +36,7 @@ top_level callee: member_access_expr base: identifier "list" - member: identifier "append" + member_name_node: identifier "append" argument: argument value: int_literal "1" diff --git a/unified/extractor/tests/corpus/swift/functions/nested-function-type.output b/unified/extractor/tests/corpus/swift/functions/nested-function-type.output index 9f2f1c9f8ccc..b14135c1065c 100644 --- a/unified/extractor/tests/corpus/swift/functions/nested-function-type.output +++ b/unified/extractor/tests/corpus/swift/functions/nested-function-type.output @@ -105,7 +105,7 @@ top_level block stmt: type_alias_declaration - name: identifier "NestedFunction" + name_node: identifier "NestedFunction" type: function_expr parameter: @@ -118,7 +118,7 @@ top_level return_type: identifier "Bool" return_type: identifier "Bool" type_alias_declaration - name: identifier "MixedParametersAndTuples" + name_node: identifier "MixedParametersAndTuples" type: function_expr parameter: diff --git a/unified/extractor/tests/corpus/swift/functions/variadic-function.output b/unified/extractor/tests/corpus/swift/functions/variadic-function.output index 888d71b41895..79384b19b20f 100644 --- a/unified/extractor/tests/corpus/swift/functions/variadic-function.output +++ b/unified/extractor/tests/corpus/swift/functions/variadic-function.output @@ -78,10 +78,10 @@ top_level block stmt: function_declaration - name: identifier "sum" + name_node: identifier "sum" parameter: parameter - external_name: identifier "_" + external_name_node: identifier "_" type: identifier "Int" pattern: identifier "values" return_type: identifier "Int" @@ -94,7 +94,7 @@ top_level callee: member_access_expr base: identifier "values" - member: identifier "reduce" + member_name_node: identifier "reduce" argument: argument value: int_literal "0" diff --git a/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-casts.output b/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-casts.output index f557670b2ff7..d78fb757a8d9 100644 --- a/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-casts.output +++ b/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-casts.output @@ -94,14 +94,14 @@ top_level block stmt: function_declaration - name: identifier "casts" + name_node: identifier "casts" parameter: parameter - external_name: identifier "_" + external_name_node: identifier "_" type: identifier "Any" pattern: identifier "a" parameter - external_name: identifier "_" + external_name_node: identifier "_" type: identifier "Int" pattern: identifier "b" body: diff --git a/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-ternary.output b/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-ternary.output index 4d33c7dbd388..80e0f7285631 100644 --- a/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-ternary.output +++ b/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-ternary.output @@ -100,22 +100,22 @@ top_level block stmt: function_declaration - name: identifier "choose" + name_node: identifier "choose" parameter: parameter - external_name: identifier "_" + external_name_node: identifier "_" type: identifier "Bool" pattern: identifier "c" parameter - external_name: identifier "_" + external_name_node: identifier "_" type: identifier "Int" pattern: identifier "a" parameter - external_name: identifier "_" + external_name_node: identifier "_" type: identifier "Int" pattern: identifier "b" parameter - external_name: identifier "_" + external_name_node: identifier "_" type: identifier "Int" pattern: identifier "d" return_type: identifier "Int" diff --git a/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence.output b/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence.output index 477de980d2da..ae2da42f2d43 100644 --- a/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence.output +++ b/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence.output @@ -67,14 +67,14 @@ top_level block stmt: function_declaration - name: identifier "combine" + name_node: identifier "combine" parameter: parameter - external_name: identifier "_" + external_name_node: identifier "_" type: identifier "Int" pattern: identifier "a" parameter - external_name: identifier "_" + external_name_node: identifier "_" type: identifier "Int" pattern: identifier "b" body: diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-chaining.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-chaining.output index 6752c80348ce..42b65ed696b0 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-chaining.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-chaining.output @@ -55,5 +55,5 @@ top_level base: member_access_expr base: identifier "obj" - member: identifier "foo" - member: identifier "bar" + member_name_node: identifier "foo" + member_name_node: identifier "bar" diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.output index c94032771ccf..05223133226b 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.output @@ -84,7 +84,7 @@ top_level callee: member_access_expr base: identifier "Optional" - member: identifier "some" + member_name_node: identifier "some" argument: argument value: @@ -92,7 +92,7 @@ top_level callee: member_access_expr base: inferred_type_expr "." - member: identifier "some" + member_name_node: identifier "some" argument: argument value: diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/throwing-function.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/throwing-function.output index 33346c4f38b8..7915e7ee92f8 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/throwing-function.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/throwing-function.output @@ -56,7 +56,7 @@ top_level block stmt: function_declaration - name: identifier "read" + name_node: identifier "read" return_type: identifier "String" body: block diff --git a/unified/extractor/tests/corpus/swift/types/binding-modifier-does-not-leak-into-accessor-body.output b/unified/extractor/tests/corpus/swift/types/binding-modifier-does-not-leak-into-accessor-body.output index a69eaa87ec54..0c839689dce0 100644 --- a/unified/extractor/tests/corpus/swift/types/binding-modifier-does-not-leak-into-accessor-body.output +++ b/unified/extractor/tests/corpus/swift/types/binding-modifier-does-not-leak-into-accessor-body.output @@ -98,7 +98,7 @@ top_level stmt: accessor_declaration modifier: modifier "var" - name: identifier "p" + name_node: identifier "p" accessor_kind: accessor_kind "get" type: identifier "Int" body: diff --git a/unified/extractor/tests/corpus/swift/types/class-inheritance.output b/unified/extractor/tests/corpus/swift/types/class-inheritance.output index 497d55d2a638..28af5a0f7086 100644 --- a/unified/extractor/tests/corpus/swift/types/class-inheritance.output +++ b/unified/extractor/tests/corpus/swift/types/class-inheritance.output @@ -34,7 +34,7 @@ top_level stmt: class_like_declaration modifier: modifier "class" - name: identifier "Dog" + name_node: identifier "Dog" base_type: base_type type: identifier "Animal" diff --git a/unified/extractor/tests/corpus/swift/types/class-with-initializer.output b/unified/extractor/tests/corpus/swift/types/class-with-initializer.output index a1821edafa1d..8027fd0fca8c 100644 --- a/unified/extractor/tests/corpus/swift/types/class-with-initializer.output +++ b/unified/extractor/tests/corpus/swift/types/class-with-initializer.output @@ -92,7 +92,7 @@ top_level stmt: class_like_declaration modifier: modifier "class" - name: identifier "Point" + name_node: identifier "Point" member: variable_declaration modifier: modifier "var" @@ -110,5 +110,5 @@ top_level target: member_access_expr base: identifier "self" - member: identifier "x" + member_name_node: identifier "x" value: identifier "x" diff --git a/unified/extractor/tests/corpus/swift/types/class-with-method.output b/unified/extractor/tests/corpus/swift/types/class-with-method.output index b0a95f9aefe2..f0b8cbf68dfb 100644 --- a/unified/extractor/tests/corpus/swift/types/class-with-method.output +++ b/unified/extractor/tests/corpus/swift/types/class-with-method.output @@ -79,14 +79,14 @@ top_level stmt: class_like_declaration modifier: modifier "class" - name: identifier "Counter" + name_node: identifier "Counter" member: variable_declaration modifier: modifier "var" pattern: identifier "n" value: int_literal "0" function_declaration - name: identifier "bump" + name_node: identifier "bump" body: block stmt: diff --git a/unified/extractor/tests/corpus/swift/types/class-with-multiple-base-types.output b/unified/extractor/tests/corpus/swift/types/class-with-multiple-base-types.output index 20db0ee87754..f6c87accee27 100644 --- a/unified/extractor/tests/corpus/swift/types/class-with-multiple-base-types.output +++ b/unified/extractor/tests/corpus/swift/types/class-with-multiple-base-types.output @@ -39,7 +39,7 @@ top_level stmt: class_like_declaration modifier: modifier "class" - name: identifier "Button" + name_node: identifier "Button" base_type: base_type type: identifier "Control" diff --git a/unified/extractor/tests/corpus/swift/types/class-with-stored-properties.output b/unified/extractor/tests/corpus/swift/types/class-with-stored-properties.output index 440f2a9bae5c..a2eea59d3e87 100644 --- a/unified/extractor/tests/corpus/swift/types/class-with-stored-properties.output +++ b/unified/extractor/tests/corpus/swift/types/class-with-stored-properties.output @@ -63,7 +63,7 @@ top_level stmt: class_like_declaration modifier: modifier "class" - name: identifier "Point" + name_node: identifier "Point" member: variable_declaration modifier: modifier "var" diff --git a/unified/extractor/tests/corpus/swift/types/computed-property.output b/unified/extractor/tests/corpus/swift/types/computed-property.output index e02bf629c7b7..ab7c072ae40d 100644 --- a/unified/extractor/tests/corpus/swift/types/computed-property.output +++ b/unified/extractor/tests/corpus/swift/types/computed-property.output @@ -103,7 +103,7 @@ top_level stmt: class_like_declaration modifier: modifier "class" - name: identifier "Rect" + name_node: identifier "Rect" member: variable_declaration modifier: modifier "var" @@ -115,7 +115,7 @@ top_level type: identifier "Double" accessor_declaration modifier: modifier "var" - name: identifier "area" + name_node: identifier "area" accessor_kind: accessor_kind "get" type: identifier "Double" body: diff --git a/unified/extractor/tests/corpus/swift/types/conditional-compilation-in-class-body.output b/unified/extractor/tests/corpus/swift/types/conditional-compilation-in-class-body.output index 2c530111b9ca..b184e9b33ea1 100644 --- a/unified/extractor/tests/corpus/swift/types/conditional-compilation-in-class-body.output +++ b/unified/extractor/tests/corpus/swift/types/conditional-compilation-in-class-body.output @@ -83,5 +83,5 @@ top_level stmt: class_like_declaration modifier: modifier "class" - name: identifier "C" + name_node: identifier "C" member: unsupported_node "#if DEBUG\n init(x: Int) {}\n deinit {}\n#endif" diff --git a/unified/extractor/tests/corpus/swift/types/constructor-with-parameters.output b/unified/extractor/tests/corpus/swift/types/constructor-with-parameters.output index e3ca48312608..d594e9c48df4 100644 --- a/unified/extractor/tests/corpus/swift/types/constructor-with-parameters.output +++ b/unified/extractor/tests/corpus/swift/types/constructor-with-parameters.output @@ -65,16 +65,16 @@ top_level stmt: class_like_declaration modifier: modifier "struct" - name: identifier "Size" + name_node: identifier "Size" member: constructor_declaration parameter: parameter - external_name: identifier "width" + external_name_node: identifier "width" type: identifier "Int" pattern: identifier "w" parameter - external_name: identifier "height" + external_name_node: identifier "height" type: identifier "Int" pattern: identifier "h" body: block "init(width w: Int, height h: Int) {}" diff --git a/unified/extractor/tests/corpus/swift/types/empty-class.output b/unified/extractor/tests/corpus/swift/types/empty-class.output index 6693744c9b43..27bb4b5e67cd 100644 --- a/unified/extractor/tests/corpus/swift/types/empty-class.output +++ b/unified/extractor/tests/corpus/swift/types/empty-class.output @@ -26,4 +26,4 @@ top_level stmt: class_like_declaration modifier: modifier "class" - name: identifier "Foo" + name_node: identifier "Foo" diff --git a/unified/extractor/tests/corpus/swift/types/enum-with-associated-values.output b/unified/extractor/tests/corpus/swift/types/enum-with-associated-values.output index b8038d1797ac..6e4bf71fe920 100644 --- a/unified/extractor/tests/corpus/swift/types/enum-with-associated-values.output +++ b/unified/extractor/tests/corpus/swift/types/enum-with-associated-values.output @@ -71,11 +71,11 @@ top_level stmt: class_like_declaration modifier: modifier "enum" - name: identifier "Shape" + name_node: identifier "Shape" member: class_like_declaration modifier: modifier "enum_case" - name: identifier "circle" + name_node: identifier "circle" member: constructor_declaration parameter: @@ -85,7 +85,7 @@ top_level body: block "circle(radius: Double)" class_like_declaration modifier: modifier "enum_case" - name: identifier "square" + name_node: identifier "square" member: constructor_declaration parameter: diff --git a/unified/extractor/tests/corpus/swift/types/enum-with-cases.output b/unified/extractor/tests/corpus/swift/types/enum-with-cases.output index 99e3792af512..7c9184a774b3 100644 --- a/unified/extractor/tests/corpus/swift/types/enum-with-cases.output +++ b/unified/extractor/tests/corpus/swift/types/enum-with-cases.output @@ -67,7 +67,7 @@ top_level stmt: class_like_declaration modifier: modifier "enum" - name: identifier "Direction" + name_node: identifier "Direction" member: variable_declaration modifier: modifier "enum_case" diff --git a/unified/extractor/tests/corpus/swift/types/enum-with-comma-separated-cases-chained-declaration.output b/unified/extractor/tests/corpus/swift/types/enum-with-comma-separated-cases-chained-declaration.output index 4e7353b2ec2a..87b81b333d2f 100644 --- a/unified/extractor/tests/corpus/swift/types/enum-with-comma-separated-cases-chained-declaration.output +++ b/unified/extractor/tests/corpus/swift/types/enum-with-comma-separated-cases-chained-declaration.output @@ -46,7 +46,7 @@ top_level stmt: class_like_declaration modifier: modifier "enum" - name: identifier "Suit" + name_node: identifier "Suit" member: variable_declaration modifier: modifier "enum_case" diff --git a/unified/extractor/tests/corpus/swift/types/extension.output b/unified/extractor/tests/corpus/swift/types/extension.output index fac2a1ee614f..3b0621788175 100644 --- a/unified/extractor/tests/corpus/swift/types/extension.output +++ b/unified/extractor/tests/corpus/swift/types/extension.output @@ -70,10 +70,10 @@ top_level stmt: class_like_declaration modifier: modifier "extension" - name: identifier "Int" + name_node: identifier "Int" member: function_declaration - name: identifier "squared" + name_node: identifier "squared" return_type: identifier "Int" body: block diff --git a/unified/extractor/tests/corpus/swift/types/generic-class-parameters-and-constraints.output b/unified/extractor/tests/corpus/swift/types/generic-class-parameters-and-constraints.output index bab8e792f82e..92b1713cebad 100644 --- a/unified/extractor/tests/corpus/swift/types/generic-class-parameters-and-constraints.output +++ b/unified/extractor/tests/corpus/swift/types/generic-class-parameters-and-constraints.output @@ -68,13 +68,13 @@ top_level stmt: class_like_declaration modifier: modifier "class" - name: identifier "Box" + name_node: identifier "Box" type_parameter: type_parameter - name: identifier "T" + name_node: identifier "T" bound: identifier "Equatable" type_parameter - name: identifier "U" + name_node: identifier "U" type_constraint: bound_type_constraint type: identifier "U" diff --git a/unified/extractor/tests/corpus/swift/types/noncopyable-type.output b/unified/extractor/tests/corpus/swift/types/noncopyable-type.output index 7239db059235..970d21683f6e 100644 --- a/unified/extractor/tests/corpus/swift/types/noncopyable-type.output +++ b/unified/extractor/tests/corpus/swift/types/noncopyable-type.output @@ -56,7 +56,7 @@ top_level stmt: class_like_declaration modifier: modifier "struct" - name: identifier "FileHandle" + name_node: identifier "FileHandle" base_type: base_type type: unsupported_node "~Copyable" diff --git a/unified/extractor/tests/corpus/swift/types/property-with-getter-and-setter.output b/unified/extractor/tests/corpus/swift/types/property-with-getter-and-setter.output index 9bf243aae9bb..0641e6e30931 100644 --- a/unified/extractor/tests/corpus/swift/types/property-with-getter-and-setter.output +++ b/unified/extractor/tests/corpus/swift/types/property-with-getter-and-setter.output @@ -108,7 +108,7 @@ top_level stmt: class_like_declaration modifier: modifier "class" - name: identifier "Box" + name_node: identifier "Box" member: variable_declaration modifier: @@ -118,7 +118,7 @@ top_level value: int_literal "0" accessor_declaration modifier: modifier "var" - name: identifier "v" + name_node: identifier "v" accessor_kind: accessor_kind "get" type: identifier "Int" body: @@ -130,7 +130,7 @@ top_level modifier: modifier "var" modifier "chained_declaration" - name: identifier "v" + name_node: identifier "v" accessor_kind: accessor_kind "set" type: identifier "Int" body: diff --git a/unified/extractor/tests/corpus/swift/types/protocol-declaration.output b/unified/extractor/tests/corpus/swift/types/protocol-declaration.output index e848fb23eb3f..1521bc349b92 100644 --- a/unified/extractor/tests/corpus/swift/types/protocol-declaration.output +++ b/unified/extractor/tests/corpus/swift/types/protocol-declaration.output @@ -42,8 +42,8 @@ top_level stmt: class_like_declaration modifier: modifier "protocol" - name: identifier "Drawable" + name_node: identifier "Drawable" member: function_declaration - name: identifier "draw" + name_node: identifier "draw" body: block "func draw()" diff --git a/unified/extractor/tests/corpus/swift/types/protocol-with-read-only-and-read-write-property-requirements.output b/unified/extractor/tests/corpus/swift/types/protocol-with-read-only-and-read-write-property-requirements.output index 2ed1dc4cc3f2..37e084520a18 100644 --- a/unified/extractor/tests/corpus/swift/types/protocol-with-read-only-and-read-write-property-requirements.output +++ b/unified/extractor/tests/corpus/swift/types/protocol-with-read-only-and-read-write-property-requirements.output @@ -1,6 +1,7 @@ protocol P { var foo: Int { get } var bar: String { get set } + var count: Int { get } } --- @@ -71,6 +72,31 @@ sourceFile attributes: leftBrace: { rightBrace: } + memberBlockItem + decl: + variableDecl + attributes: + modifiers: + bindingSpecifier: var + bindings: + patternBinding + pattern: + identifierPattern + identifier: identifier "count" + typeAnnotation: + typeAnnotation + colon: : + type: + identifierType + name: identifier "Int" + accessorBlock: + accessorBlock + accessors: + accessorDecl + accessorSpecifier: get + attributes: + leftBrace: { + rightBrace: } modifiers: protocolKeyword: protocol @@ -82,18 +108,22 @@ top_level stmt: class_like_declaration modifier: modifier "protocol" - name: identifier "P" + name_node: identifier "P" member: accessor_declaration - name: identifier "foo" + name_node: identifier "foo" accessor_kind: accessor_kind "get" type: identifier "Int" accessor_declaration - name: identifier "bar" + name_node: identifier "bar" accessor_kind: accessor_kind "get" type: identifier "String" accessor_declaration modifier: modifier "chained_declaration" - name: identifier "bar" + name_node: identifier "bar" accessor_kind: accessor_kind "set" type: identifier "String" + accessor_declaration + name_node: identifier "count" + accessor_kind: accessor_kind "get" + type: identifier "Int" diff --git a/unified/extractor/tests/corpus/swift/types/protocol-with-read-only-and-read-write-property-requirements.swift b/unified/extractor/tests/corpus/swift/types/protocol-with-read-only-and-read-write-property-requirements.swift index 44299edc15b9..24abb0e89fff 100644 --- a/unified/extractor/tests/corpus/swift/types/protocol-with-read-only-and-read-write-property-requirements.swift +++ b/unified/extractor/tests/corpus/swift/types/protocol-with-read-only-and-read-write-property-requirements.swift @@ -1,4 +1,5 @@ protocol P { var foo: Int { get } var bar: String { get set } + var count: Int { get } } diff --git a/unified/extractor/tests/corpus/swift/types/qualified-type.output b/unified/extractor/tests/corpus/swift/types/qualified-type.output index cf3cf07d832b..4512e9e6c54d 100644 --- a/unified/extractor/tests/corpus/swift/types/qualified-type.output +++ b/unified/extractor/tests/corpus/swift/types/qualified-type.output @@ -103,22 +103,22 @@ top_level stmt: class_like_declaration modifier: modifier "struct" - name: identifier "Outer" + name_node: identifier "Outer" member: class_like_declaration modifier: modifier "struct" - name: identifier "Inner" + name_node: identifier "Inner" member: class_like_declaration modifier: modifier "struct" - name: identifier "Deep" + name_node: identifier "Deep" variable_declaration modifier: modifier "let" pattern: identifier "value" type: member_access_expr base: identifier "Outer" - member: identifier "Inner" + member_name_node: identifier "Inner" variable_declaration modifier: modifier "let" pattern: identifier "nested" @@ -127,5 +127,5 @@ top_level base: member_access_expr base: identifier "Outer" - member: identifier "Inner" - member: identifier "Deep" + member_name_node: identifier "Inner" + member_name_node: identifier "Deep" diff --git a/unified/extractor/tests/corpus/swift/types/struct.output b/unified/extractor/tests/corpus/swift/types/struct.output index eb04e0e5d79c..133a2935acd7 100644 --- a/unified/extractor/tests/corpus/swift/types/struct.output +++ b/unified/extractor/tests/corpus/swift/types/struct.output @@ -63,7 +63,7 @@ top_level stmt: class_like_declaration modifier: modifier "struct" - name: identifier "Point" + name_node: identifier "Point" member: variable_declaration modifier: modifier "let" diff --git a/unified/extractor/tests/corpus/swift/variables/property-with-willset-and-didset-observers.output b/unified/extractor/tests/corpus/swift/variables/property-with-willset-and-didset-observers.output index 8531885ad9d0..c574ee74d788 100644 --- a/unified/extractor/tests/corpus/swift/variables/property-with-willset-and-didset-observers.output +++ b/unified/extractor/tests/corpus/swift/variables/property-with-willset-and-didset-observers.output @@ -103,7 +103,7 @@ top_level stmt: class_like_declaration modifier: modifier "class" - name: identifier "C" + name_node: identifier "C" member: variable_declaration modifier: modifier "var" @@ -114,7 +114,7 @@ top_level modifier: modifier "var" modifier "chained_declaration" - name: identifier "x" + name_node: identifier "x" accessor_kind: accessor_kind "willSet" body: block @@ -128,7 +128,7 @@ top_level modifier: modifier "var" modifier "chained_declaration" - name: identifier "x" + name_node: identifier "x" accessor_kind: accessor_kind "didSet" body: block diff --git a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll index 6f899bba4283..d1568edfff80 100644 --- a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll +++ b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll @@ -4,7 +4,7 @@ private import codeql.unified.internal.StaticNameBinding private import codeql.unified.internal.LocalNameBinding private import codeql.unified.internal.NameBindingPlugin -/** Stats about identifiers that static name binding could resolve. */ +/** Stats about name nodes that static name binding could resolve. */ module StaticNameResolutionStats implements EntityStatsSig { /** * Holds if `name` has been positively identified as referring to a value, so static name binding diff --git a/unified/ql/lib/codeql/unified/internal/Ast.qll b/unified/ql/lib/codeql/unified/internal/Ast.qll index cb8861ba3feb..61898be7ed43 100644 --- a/unified/ql/lib/codeql/unified/internal/Ast.qll +++ b/unified/ql/lib/codeql/unified/internal/Ast.qll @@ -112,8 +112,8 @@ module Unified { /** Gets the node corresponding to the field `modifier`. */ final F::Modifier getAModifier() { result = this.getModifier(_) } - /** Gets the node corresponding to the field `name`. */ - final F::Identifier getName() { unified_accessor_declaration_def(this, _, result) } + /** Gets the node corresponding to the field `name_node`. */ + final F::Identifier getNameNode() { unified_accessor_declaration_def(this, _, result) } /** Gets the node corresponding to the field `parameter`. */ final F::Parameter getParameter(int i) { @@ -154,8 +154,8 @@ module Unified { /** Gets the node corresponding to the field `modifier`. */ final F::Modifier getAModifier() { result = this.getModifier(_) } - /** Gets the node corresponding to the field `name`. */ - final F::Identifier getName() { unified_argument_name(this, result) } + /** Gets the node corresponding to the field `name_node`. */ + final F::Identifier getNameNode() { unified_argument_name_node(this, result) } /** Gets the node corresponding to the field `value`. */ final F::Expr getValue() { unified_argument_def(this, result) } @@ -163,7 +163,7 @@ module Unified { /** Gets a field or child node of this node. */ final override F::AstNode getAFieldOrChild() { unified_argument_modifier(this, _, result) or - unified_argument_name(this, result) or + unified_argument_name_node(this, result) or unified_argument_def(this, result) } } @@ -216,8 +216,8 @@ module Unified { /** Gets the node corresponding to the field `modifier`. */ final F::Modifier getAModifier() { result = this.getModifier(_) } - /** Gets the node corresponding to the field `name`. */ - final F::Identifier getName() { unified_associated_type_declaration_def(this, result) } + /** Gets the node corresponding to the field `name_node`. */ + final F::Identifier getNameNode() { unified_associated_type_declaration_def(this, result) } /** Gets a field or child node of this node. */ final override F::AstNode getAFieldOrChild() { @@ -313,11 +313,13 @@ module Unified { /** Gets the name of the primary QL class for this element. */ final override string getAPrimaryQlClass() { result = "BreakExpr" } - /** Gets the node corresponding to the field `label`. */ - final F::Identifier getLabel() { unified_break_expr_label(this, result) } + /** Gets the node corresponding to the field `label_name_node`. */ + final F::Identifier getLabelNameNode() { unified_break_expr_label_name_node(this, result) } /** Gets a field or child node of this node. */ - final override F::AstNode getAFieldOrChild() { unified_break_expr_label(this, result) } + final override F::AstNode getAFieldOrChild() { + unified_break_expr_label_name_node(this, result) + } } /** A class representing `builtin_expr` tokens. */ @@ -427,8 +429,8 @@ module Unified { /** Gets the node corresponding to the field `modifier`. */ final F::Modifier getAModifier() { result = this.getModifier(_) } - /** Gets the node corresponding to the field `name`. */ - final F::Identifier getName() { unified_class_like_declaration_name(this, result) } + /** Gets the node corresponding to the field `name_node`. */ + final F::Identifier getNameNode() { unified_class_like_declaration_name_node(this, result) } /** Gets the node corresponding to the field `type_constraint`. */ final F::TypeConstraint getTypeConstraint(int i) { @@ -451,7 +453,7 @@ module Unified { unified_class_like_declaration_base_type(this, _, result) or unified_class_like_declaration_member(this, _, result) or unified_class_like_declaration_modifier(this, _, result) or - unified_class_like_declaration_name(this, result) or + unified_class_like_declaration_name_node(this, result) or unified_class_like_declaration_type_constraint(this, _, result) or unified_class_like_declaration_type_parameter(this, _, result) } @@ -522,8 +524,8 @@ module Unified { /** Gets the node corresponding to the field `modifier`. */ final F::Modifier getAModifier() { result = this.getModifier(_) } - /** Gets the node corresponding to the field `name`. */ - final F::Identifier getName() { unified_constructor_declaration_name(this, result) } + /** Gets the node corresponding to the field `name_node`. */ + final F::Identifier getNameNode() { unified_constructor_declaration_name_node(this, result) } /** Gets the node corresponding to the field `parameter`. */ final F::Parameter getParameter(int i) { @@ -537,7 +539,7 @@ module Unified { final override F::AstNode getAFieldOrChild() { unified_constructor_declaration_def(this, result) or unified_constructor_declaration_modifier(this, _, result) or - unified_constructor_declaration_name(this, result) or + unified_constructor_declaration_name_node(this, result) or unified_constructor_declaration_parameter(this, _, result) } } @@ -547,11 +549,13 @@ module Unified { /** Gets the name of the primary QL class for this element. */ final override string getAPrimaryQlClass() { result = "ContinueExpr" } - /** Gets the node corresponding to the field `label`. */ - final F::Identifier getLabel() { unified_continue_expr_label(this, result) } + /** Gets the node corresponding to the field `label_name_node`. */ + final F::Identifier getLabelNameNode() { unified_continue_expr_label_name_node(this, result) } /** Gets a field or child node of this node. */ - final override F::AstNode getAFieldOrChild() { unified_continue_expr_label(this, result) } + final override F::AstNode getAFieldOrChild() { + unified_continue_expr_label_name_node(this, result) + } } /** A class representing `destructor_declaration` nodes. */ @@ -711,8 +715,8 @@ module Unified { /** Gets the node corresponding to the field `modifier`. */ final F::Modifier getAModifier() { result = this.getModifier(_) } - /** Gets the node corresponding to the field `name`. */ - final F::Identifier getName() { unified_function_declaration_def(this, result) } + /** Gets the node corresponding to the field `name_node`. */ + final F::Identifier getNameNode() { unified_function_declaration_def(this, result) } /** Gets the node corresponding to the field `parameter`. */ final F::Parameter getParameter(int i) { @@ -952,8 +956,8 @@ module Unified { /** Gets the name of the primary QL class for this element. */ final override string getAPrimaryQlClass() { result = "LabeledStmt" } - /** Gets the node corresponding to the field `label`. */ - final F::Identifier getLabel() { unified_labeled_stmt_def(this, result, _) } + /** Gets the node corresponding to the field `label_name_node`. */ + final F::Identifier getLabelNameNode() { unified_labeled_stmt_def(this, result, _) } /** Gets the node corresponding to the field `stmt`. */ final F::Stmt getStmt() { unified_labeled_stmt_def(this, _, result) } @@ -989,8 +993,8 @@ module Unified { /** Gets the node corresponding to the field `base`. */ final F::Expr getBase() { unified_member_access_expr_def(this, result, _) } - /** Gets the node corresponding to the field `member`. */ - final F::Identifier getMember() { unified_member_access_expr_def(this, _, result) } + /** Gets the node corresponding to the field `member_name_node`. */ + final F::Identifier getMemberNameNode() { unified_member_access_expr_def(this, _, result) } /** Gets a field or child node of this node. */ final override F::AstNode getAFieldOrChild() { @@ -1010,22 +1014,22 @@ module Unified { /** Gets the name of the primary QL class for this element. */ final override string getAPrimaryQlClass() { result = "NamedPattern" } - /** Gets the node corresponding to the field `identifier`. */ - final F::Identifier getIdentifier() { unified_named_pattern_def(this, result, _) } - /** Gets the node corresponding to the field `modifier`. */ final F::Modifier getModifier(int i) { unified_named_pattern_modifier(this, i, result) } /** Gets the node corresponding to the field `modifier`. */ final F::Modifier getAModifier() { result = this.getModifier(_) } + /** Gets the node corresponding to the field `name_node`. */ + final F::Identifier getNameNode() { unified_named_pattern_def(this, result, _) } + /** Gets the node corresponding to the field `sub_pattern`. */ final F::Expr getSubPattern() { unified_named_pattern_def(this, _, result) } /** Gets a field or child node of this node. */ final override F::AstNode getAFieldOrChild() { - unified_named_pattern_def(this, result, _) or unified_named_pattern_modifier(this, _, result) or + unified_named_pattern_def(this, result, _) or unified_named_pattern_def(this, _, result) } } @@ -1048,8 +1052,8 @@ module Unified { /** Gets the node corresponding to the field `modifier`. */ final F::Modifier getAModifier() { result = this.getModifier(_) } - /** Gets the node corresponding to the field `name`. */ - final F::Identifier getName() { unified_operator_syntax_declaration_def(this, result) } + /** Gets the node corresponding to the field `name_node`. */ + final F::Identifier getNameNode() { unified_operator_syntax_declaration_def(this, result) } /** Gets the node corresponding to the field `precedence`. */ final F::Expr getPrecedence() { unified_operator_syntax_declaration_precedence(this, result) } @@ -1094,8 +1098,8 @@ module Unified { /** Gets the node corresponding to the field `default`. */ final F::Expr getDefault() { unified_parameter_default(this, result) } - /** Gets the node corresponding to the field `external_name`. */ - final F::Identifier getExternalName() { unified_parameter_external_name(this, result) } + /** Gets the node corresponding to the field `external_name_node`. */ + final F::Identifier getExternalNameNode() { unified_parameter_external_name_node(this, result) } /** Gets the node corresponding to the field `modifier`. */ final F::Modifier getModifier(int i) { unified_parameter_modifier(this, i, result) } @@ -1112,7 +1116,7 @@ module Unified { /** Gets a field or child node of this node. */ final override F::AstNode getAFieldOrChild() { unified_parameter_default(this, result) or - unified_parameter_external_name(this, result) or + unified_parameter_external_name_node(this, result) or unified_parameter_modifier(this, _, result) or unified_parameter_pattern(this, result) or unified_parameter_type(this, result) @@ -1314,8 +1318,8 @@ module Unified { /** Gets the node corresponding to the field `modifier`. */ final F::Modifier getAModifier() { result = this.getModifier(_) } - /** Gets the node corresponding to the field `name`. */ - final F::Identifier getName() { unified_type_alias_declaration_def(this, result, _) } + /** Gets the node corresponding to the field `name_node`. */ + final F::Identifier getNameNode() { unified_type_alias_declaration_def(this, result, _) } /** Gets the node corresponding to the field `type`. */ final F::Expr getType() { unified_type_alias_declaration_def(this, _, result) } @@ -1384,8 +1388,8 @@ module Unified { /** Gets the node corresponding to the field `modifier`. */ final F::Modifier getAModifier() { result = this.getModifier(_) } - /** Gets the node corresponding to the field `name`. */ - final F::Identifier getName() { unified_type_parameter_def(this, result) } + /** Gets the node corresponding to the field `name_node`. */ + final F::Identifier getNameNode() { unified_type_parameter_def(this, result) } /** Gets a field or child node of this node. */ final override F::AstNode getAFieldOrChild() { @@ -1523,7 +1527,7 @@ module Unified { or result = node.(AccessorDeclaration).getModifier(i) and name = "getModifier" or - result = node.(AccessorDeclaration).getName() and i = -1 and name = "getName" + result = node.(AccessorDeclaration).getNameNode() and i = -1 and name = "getNameNode" or result = node.(AccessorDeclaration).getParameter(i) and name = "getParameter" or @@ -1531,7 +1535,7 @@ module Unified { or result = node.(Argument).getModifier(i) and name = "getModifier" or - result = node.(Argument).getName() and i = -1 and name = "getName" + result = node.(Argument).getNameNode() and i = -1 and name = "getNameNode" or result = node.(Argument).getValue() and i = -1 and name = "getValue" or @@ -1545,7 +1549,7 @@ module Unified { or result = node.(AssociatedTypeDeclaration).getModifier(i) and name = "getModifier" or - result = node.(AssociatedTypeDeclaration).getName() and i = -1 and name = "getName" + result = node.(AssociatedTypeDeclaration).getNameNode() and i = -1 and name = "getNameNode" or result = node.(BaseType).getModifier(i) and name = "getModifier" or @@ -1563,7 +1567,7 @@ module Unified { or result = node.(BoundTypeConstraint).getType() and i = -1 and name = "getType" or - result = node.(BreakExpr).getLabel() and i = -1 and name = "getLabel" + result = node.(BreakExpr).getLabelNameNode() and i = -1 and name = "getLabelNameNode" or result = node.(BulkImportingPattern).getModifier(i) and name = "getModifier" or @@ -1585,7 +1589,7 @@ module Unified { or result = node.(ClassLikeDeclaration).getModifier(i) and name = "getModifier" or - result = node.(ClassLikeDeclaration).getName() and i = -1 and name = "getName" + result = node.(ClassLikeDeclaration).getNameNode() and i = -1 and name = "getNameNode" or result = node.(ClassLikeDeclaration).getTypeConstraint(i) and name = "getTypeConstraint" or @@ -1607,11 +1611,11 @@ module Unified { or result = node.(ConstructorDeclaration).getModifier(i) and name = "getModifier" or - result = node.(ConstructorDeclaration).getName() and i = -1 and name = "getName" + result = node.(ConstructorDeclaration).getNameNode() and i = -1 and name = "getNameNode" or result = node.(ConstructorDeclaration).getParameter(i) and name = "getParameter" or - result = node.(ContinueExpr).getLabel() and i = -1 and name = "getLabel" + result = node.(ContinueExpr).getLabelNameNode() and i = -1 and name = "getLabelNameNode" or result = node.(DestructorDeclaration).getBody() and i = -1 and name = "getBody" or @@ -1645,7 +1649,7 @@ module Unified { or result = node.(FunctionDeclaration).getModifier(i) and name = "getModifier" or - result = node.(FunctionDeclaration).getName() and i = -1 and name = "getName" + result = node.(FunctionDeclaration).getNameNode() and i = -1 and name = "getNameNode" or result = node.(FunctionDeclaration).getParameter(i) and name = "getParameter" or @@ -1693,7 +1697,7 @@ module Unified { or result = node.(KeyValuePair).getValue() and i = -1 and name = "getValue" or - result = node.(LabeledStmt).getLabel() and i = -1 and name = "getLabel" + result = node.(LabeledStmt).getLabelNameNode() and i = -1 and name = "getLabelNameNode" or result = node.(LabeledStmt).getStmt() and i = -1 and name = "getStmt" or @@ -1701,19 +1705,19 @@ module Unified { or result = node.(MemberAccessExpr).getBase() and i = -1 and name = "getBase" or - result = node.(MemberAccessExpr).getMember() and i = -1 and name = "getMember" - or - result = node.(NamedPattern).getIdentifier() and i = -1 and name = "getIdentifier" + result = node.(MemberAccessExpr).getMemberNameNode() and i = -1 and name = "getMemberNameNode" or result = node.(NamedPattern).getModifier(i) and name = "getModifier" or + result = node.(NamedPattern).getNameNode() and i = -1 and name = "getNameNode" + or result = node.(NamedPattern).getSubPattern() and i = -1 and name = "getSubPattern" or result = node.(OperatorSyntaxDeclaration).getFixity() and i = -1 and name = "getFixity" or result = node.(OperatorSyntaxDeclaration).getModifier(i) and name = "getModifier" or - result = node.(OperatorSyntaxDeclaration).getName() and i = -1 and name = "getName" + result = node.(OperatorSyntaxDeclaration).getNameNode() and i = -1 and name = "getNameNode" or result = node.(OperatorSyntaxDeclaration).getPrecedence() and i = -1 and @@ -1725,7 +1729,7 @@ module Unified { or result = node.(Parameter).getDefault() and i = -1 and name = "getDefault" or - result = node.(Parameter).getExternalName() and i = -1 and name = "getExternalName" + result = node.(Parameter).getExternalNameNode() and i = -1 and name = "getExternalNameNode" or result = node.(Parameter).getModifier(i) and name = "getModifier" or @@ -1765,7 +1769,7 @@ module Unified { or result = node.(TypeAliasDeclaration).getModifier(i) and name = "getModifier" or - result = node.(TypeAliasDeclaration).getName() and i = -1 and name = "getName" + result = node.(TypeAliasDeclaration).getNameNode() and i = -1 and name = "getNameNode" or result = node.(TypeAliasDeclaration).getType() and i = -1 and name = "getType" or @@ -1783,7 +1787,7 @@ module Unified { or result = node.(TypeParameter).getModifier(i) and name = "getModifier" or - result = node.(TypeParameter).getName() and i = -1 and name = "getName" + result = node.(TypeParameter).getNameNode() and i = -1 and name = "getNameNode" or result = node.(TypeTestExpr).getExpr() and i = -1 and name = "getExpr" or diff --git a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll index 2e4a7dfc4c3a..371eb3c3bcd2 100644 --- a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll @@ -239,9 +239,9 @@ private module Input implements InputSig1, InputSig2 { class Label extends string { Label() { - any(LabeledStmt l).getLabel().getValue() = this or - any(BreakExpr b).getLabel().getValue() = this or - any(ContinueExpr c).getLabel().getValue() = this + any(LabeledStmt l).getLabelNameNode().getValue() = this or + any(BreakExpr b).getLabelNameNode().getValue() = this or + any(ContinueExpr c).getLabelNameNode().getValue() = this } string toString() { result = this } @@ -249,7 +249,7 @@ private module Input implements InputSig1, InputSig2 { private Label getLabelOfStmt(Stmt s) { exists(LabeledStmt l | s = l.getStmt() | - result = l.getLabel().getValue() or + result = l.getLabelNameNode().getValue() or result = getLabelOfStmt(l) ) } @@ -257,9 +257,9 @@ private module Input implements InputSig1, InputSig2 { predicate hasLabel(Ast::AstNode n, Label l) { l = getLabelOfStmt(n) or - l = n.(BreakExpr).getLabel().getValue() + l = n.(BreakExpr).getLabelNameNode().getValue() or - l = n.(ContinueExpr).getLabel().getValue() + l = n.(ContinueExpr).getLabelNameNode().getValue() } class CallableContext = Void; diff --git a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll index ec17e6505c95..bd5b1149b6e0 100644 --- a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll +++ b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll @@ -77,7 +77,7 @@ module Unified { Expr getNamedArgument(string name) { exists(Argument arg | arg = this.getAnArgument() and - arg.getName().getValue() = name and + arg.getNameNode().getValue() = name and result = arg.getValue() ) } diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index df95034cdf85..019373a01987 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -102,7 +102,7 @@ private module LocalNameBindingInput implements LocalNameBindingInputSig Date: Thu, 3 Sep 2026 11:09:16 +0200 Subject: [PATCH 0705/2098] unified: Add getName() convenience predicates --- .../unified/internal/ControlFlowGraph.qll | 12 +-- .../lib/codeql/unified/internal/FacadeAst.qll | 77 ++++++++++++++++++- .../internal/NameBindingPluginSwift.qll | 2 +- .../unified/internal/StaticNameBinding.qll | 2 +- unified/ql/lib/utils/test/TestUtils.qll | 4 +- .../ql/test/library-tests/BasicTest/test.ql | 4 +- 6 files changed, 87 insertions(+), 14 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll index 371eb3c3bcd2..ef14141c606e 100644 --- a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll @@ -239,9 +239,9 @@ private module Input implements InputSig1, InputSig2 { class Label extends string { Label() { - any(LabeledStmt l).getLabelNameNode().getValue() = this or - any(BreakExpr b).getLabelNameNode().getValue() = this or - any(ContinueExpr c).getLabelNameNode().getValue() = this + any(LabeledStmt l).getLabelName() = this or + any(BreakExpr b).getLabelName() = this or + any(ContinueExpr c).getLabelName() = this } string toString() { result = this } @@ -249,7 +249,7 @@ private module Input implements InputSig1, InputSig2 { private Label getLabelOfStmt(Stmt s) { exists(LabeledStmt l | s = l.getStmt() | - result = l.getLabelNameNode().getValue() or + result = l.getLabelName() or result = getLabelOfStmt(l) ) } @@ -257,9 +257,9 @@ private module Input implements InputSig1, InputSig2 { predicate hasLabel(Ast::AstNode n, Label l) { l = getLabelOfStmt(n) or - l = n.(BreakExpr).getLabelNameNode().getValue() + l = n.(BreakExpr).getLabelName() or - l = n.(ContinueExpr).getLabelNameNode().getValue() + l = n.(ContinueExpr).getLabelName() } class CallableContext = Void; diff --git a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll index bd5b1149b6e0..dcec57f0a4ae 100644 --- a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll +++ b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll @@ -65,6 +65,81 @@ module Unified { } } + class AccessorDeclaration extends G::AccessorDeclaration { + /** Gets the name of this accessor. */ + string getName() { result = this.getNameNode().getValue() } + } + + class Argument extends G::Argument { + /** Gets the name of this argument. */ + string getName() { result = this.getNameNode().getValue() } + } + + class AssociatedTypeDeclaration extends G::AssociatedTypeDeclaration { + /** Gets the name of this associated type. */ + string getName() { result = this.getNameNode().getValue() } + } + + class BreakExpr extends G::BreakExpr { + /** Gets the label name targeted by this break. */ + string getLabelName() { result = this.getLabelNameNode().getValue() } + } + + class ClassLikeDeclaration extends G::ClassLikeDeclaration { + /** Gets the name of this declaration. */ + string getName() { result = this.getNameNode().getValue() } + } + + class ConstructorDeclaration extends G::ConstructorDeclaration { + /** Gets the name of this constructor. */ + string getName() { result = this.getNameNode().getValue() } + } + + class ContinueExpr extends G::ContinueExpr { + /** Gets the label name targeted by this continue. */ + string getLabelName() { result = this.getLabelNameNode().getValue() } + } + + class FunctionDeclaration extends G::FunctionDeclaration { + /** Gets the name of this function. */ + string getName() { result = this.getNameNode().getValue() } + } + + class LabeledStmt extends G::LabeledStmt { + /** Gets the label name of this statement. */ + string getLabelName() { result = this.getLabelNameNode().getValue() } + } + + class MemberAccessExpr extends G::MemberAccessExpr { + /** Gets the member name of this access. */ + string getMemberName() { result = this.getMemberNameNode().getValue() } + } + + class NamedPattern extends G::NamedPattern { + /** Gets the name bound by this pattern. */ + string getName() { result = this.getNameNode().getValue() } + } + + class OperatorSyntaxDeclaration extends G::OperatorSyntaxDeclaration { + /** Gets the name of this operator. */ + string getName() { result = this.getNameNode().getValue() } + } + + class Parameter extends G::Parameter { + /** Gets the external name of this parameter. */ + string getExternalName() { result = this.getExternalNameNode().getValue() } + } + + class TypeAliasDeclaration extends G::TypeAliasDeclaration { + /** Gets the name of this type alias. */ + string getName() { result = this.getNameNode().getValue() } + } + + class TypeParameter extends G::TypeParameter { + /** Gets the name of this type parameter. */ + string getName() { result = this.getNameNode().getValue() } + } + /** A binary expression. */ class BinaryExpr extends G::BinaryExpr { /** Gets an operand of this binary expression. */ @@ -77,7 +152,7 @@ module Unified { Expr getNamedArgument(string name) { exists(Argument arg | arg = this.getAnArgument() and - arg.getNameNode().getValue() = name and + arg.getName() = name and result = arg.getValue() ) } diff --git a/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll b/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll index fa9b4b8a2c74..644aaa6df54c 100644 --- a/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll +++ b/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll @@ -81,7 +81,7 @@ class SwiftPackageTarget extends ModuleScopeRepr, CallExpr { SwiftPackageTarget() { this.getFile().getBaseName() = "Package.swift" and - this.getCallee().(MemberAccessExpr).getMemberNameNode().getValue() = targetKind and + this.getCallee().(MemberAccessExpr).getMemberName() = targetKind and targetKind = [ "target", "executableTarget", "testTarget", "systemLibrary", "binaryTarget", "plugin", diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 62e0998bb5b8..26d94f0591fb 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -163,7 +163,7 @@ private NameBindingNode getNodeFromUncertainScope(AstNode n) { result.isLocalNam predicate readStep(NameBindingNode node1, string name, NameBindingNode node2) { exists(MemberAccessExpr expr | node1 = getNodeFromRef(expr.getBase()) and - name = expr.getMemberNameNode().getValue() and + name = expr.getMemberName() and node2 = getNodeFromRef(expr) ) or diff --git a/unified/ql/lib/utils/test/TestUtils.qll b/unified/ql/lib/utils/test/TestUtils.qll index 911929c9771f..6a7fbae3d592 100644 --- a/unified/ql/lib/utils/test/TestUtils.qll +++ b/unified/ql/lib/utils/test/TestUtils.qll @@ -4,9 +4,9 @@ private import codeql.unified.internal.StaticNameBinding private string deriveClassName(ClassLikeDeclaration cls) { not exists(cls.getParent().getEnclosingClass()) and - result = cls.getNameNode().getValue() + result = cls.getName() or - result = deriveClassName(cls.getParent().getEnclosingClass()) + "." + cls.getNameNode().getValue() + result = deriveClassName(cls.getParent().getEnclosingClass()) + "." + cls.getName() } private string defaultName(NameDeclaration decl) { diff --git a/unified/ql/test/library-tests/BasicTest/test.ql b/unified/ql/test/library-tests/BasicTest/test.ql index 4f8528b31d75..75fea1330e4a 100644 --- a/unified/ql/test/library-tests/BasicTest/test.ql +++ b/unified/ql/test/library-tests/BasicTest/test.ql @@ -2,9 +2,7 @@ import unified query predicate identifier(Identifier node, string value) { value = node.getValue() } -query predicate namedPattern(NamedPattern node, string value) { - value = node.getNameNode().getValue() -} +query predicate namedPattern(NamedPattern node, string value) { value = node.getName() } query predicate unsupported(UnsupportedNode node, string value) { value = node.getValue() } From 99ffe04c77e43432fdfc2cc2ff4295bd8d8e29b9 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 4 Sep 2026 13:17:28 +0200 Subject: [PATCH 0706/2098] unified: Fix a bad comment --- unified/extractor/ast_types.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/extractor/ast_types.yml b/unified/extractor/ast_types.yml index 28f152c24e1e..82b49f981180 100644 --- a/unified/extractor/ast_types.yml +++ b/unified/extractor/ast_types.yml @@ -97,7 +97,7 @@ named: top_level: body: block - # A name pattern that applies a nested pattern. Used for scoped imports. + # A pattern that binds the incoming value to a name, and then applies it to a sub-pattern. named_pattern: modifier*: modifier name_node: identifier From bafa95be37998e9d74a543498d4ce71927efa1ec Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 4 Sep 2026 13:25:50 +0200 Subject: [PATCH 0707/2098] unified: Add test for unbound var in PatternGuardExpr --- .../ql/test/library-tests/local-name-binding/test.swift | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/unified/ql/test/library-tests/local-name-binding/test.swift b/unified/ql/test/library-tests/local-name-binding/test.swift index b5d0469e8a44..5e9adaa03d87 100644 --- a/unified/ql/test/library-tests/local-name-binding/test.swift +++ b/unified/ql/test/library-tests/local-name-binding/test.swift @@ -354,3 +354,11 @@ func t38(value: E38) { // $ access=E38 print(y) // $ access=y1 } } + +// A non-binding pattern in a guard refers to an existing variable +func t39(value: Int) { + let x = 1 // name=x1 + guard case x = value else { // $ access=value MISSING: access=x1 + return + } +} From 777ff0af97773719fb11b060da1b3f59398e75f7 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 4 Sep 2026 13:26:50 +0200 Subject: [PATCH 0708/2098] unified: Fix the aforementioned bug --- .../ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll | 4 +++- unified/ql/test/library-tests/local-name-binding/test.swift | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll b/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll index 644aaa6df54c..dbfa0222cfdd 100644 --- a/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll +++ b/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll @@ -44,12 +44,14 @@ class NameBindingPluginSwift extends NameBindingPlugin { /** Holds if `node` is in a context where a bare name node should be seen as a reference rather than a declaration. */ private predicate isUnboundPattern(Expr node) { - // 'case/catch' start an unbound-pattern context, 'let/var' terminate it + // 'case/catch/guard' start an unbound-pattern context, 'let/var' terminate it ( node = any(SwitchCase c).getPattern() or node = any(CatchClause c).getPattern() or + node = any(PatternGuardExpr c).getPattern() + or isUnboundPattern(node.(Expr).getEnclosingExpr()) ) and not node.(ExprPattern).hasModifier(["let", "var"]) diff --git a/unified/ql/test/library-tests/local-name-binding/test.swift b/unified/ql/test/library-tests/local-name-binding/test.swift index 5e9adaa03d87..23d71d8f6dcd 100644 --- a/unified/ql/test/library-tests/local-name-binding/test.swift +++ b/unified/ql/test/library-tests/local-name-binding/test.swift @@ -358,7 +358,7 @@ func t38(value: E38) { // $ access=E38 // A non-binding pattern in a guard refers to an existing variable func t39(value: Int) { let x = 1 // name=x1 - guard case x = value else { // $ access=value MISSING: access=x1 + guard case x = value else { // $ access=value access=x1 return } } From 65615a79a81ebde5a2a7682bb3e6350491343925 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 4 Sep 2026 13:34:55 +0100 Subject: [PATCH 0709/2098] C++: Fix join in virtual dispatch's 'returnStep' predicate. --- .../ir/dataflow/internal/DataFlowDispatch.qll | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowDispatch.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowDispatch.qll index bce936552768..03a565ef946d 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowDispatch.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowDispatch.qll @@ -131,6 +131,15 @@ private predicate qualifierSourceImpl(RelevantNode n, Class c) { ) } +pragma[nomagic] +private predicate hasKindAndEnclosingCallable( + DataFlowPrivate::DataFlowCallable callable, DataFlowPrivate::ReturnKind kind, + DataFlowPrivate::ReturnNode return +) { + return.getEnclosingCallable() = callable and + return.getKind() = kind +} + private module TrackVirtualDispatch { /** * Gets a possible runtime target of `c` using both static call-target @@ -197,11 +206,21 @@ private module TrackVirtualDispatch { ) } + pragma[nomagic] + private predicate hasDispatchWithKind( + DataFlowPrivate::DataFlowCallable callable, DataFlowPrivate::ReturnKind kind, + LocalSourceNode n2 + ) { + exists(DataFlowPrivate::DataFlowCall call | + n2 = DataFlowPrivate::getAnOutNode(call, kind) and + callable = dispatch(call) + ) + } + predicate returnStep(Node n1, LocalSourceNode n2) { - exists(DataFlowPrivate::DataFlowCallable callable, DataFlowPrivate::DataFlowCall call | - n1.(DataFlowPrivate::ReturnNode).getEnclosingCallable() = callable and - callable = dispatch(call) and - n2 = DataFlowPrivate::getAnOutNode(call, n1.(DataFlowPrivate::ReturnNode).getKind()) + exists(DataFlowPrivate::DataFlowCallable callable, DataFlowPrivate::ReturnKind kind | + hasKindAndEnclosingCallable(callable, kind, n1) and + hasDispatchWithKind(callable, kind, n2) ) } From 25aef0e2c9f05e6d10d7dd16070c9b1b4e96ab71 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Fri, 4 Sep 2026 08:59:47 -0400 Subject: [PATCH 0710/2098] chore: formatting Co-authored-by: Michael Nebel --- csharp/ql/lib/Linq/Helpers.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csharp/ql/lib/Linq/Helpers.qll b/csharp/ql/lib/Linq/Helpers.qll index 7516d3b2767b..084b4358a529 100644 --- a/csharp/ql/lib/Linq/Helpers.qll +++ b/csharp/ql/lib/Linq/Helpers.qll @@ -225,7 +225,7 @@ predicate missedFirstOrDefaultOpportunity(ForeachStmtGenericEnumerable fes, IfSt not is.getCondition().getAChildExpr*() instanceof AwaitExpr and not fes.isAsync() and returnsLoopVariable(fes, is.getThen()) and -fes.getElementType() = fes.getVariable().getType() and + fes.getElementType() = fes.getVariable().getType() and returnsDefaultValueAfterForeach(fes) } From 8234bad721cd9625d00b89bdb1711775ac6e323b Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Fri, 4 Sep 2026 09:00:42 -0400 Subject: [PATCH 0711/2098] tests: adds additional validation for lambda corner case --- csharp/ql/lib/Linq/Helpers.qll | 3 ++- .../MissedFirstOrDefaultOpportunity.cs | 12 ++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/csharp/ql/lib/Linq/Helpers.qll b/csharp/ql/lib/Linq/Helpers.qll index 7516d3b2767b..32417c815c28 100644 --- a/csharp/ql/lib/Linq/Helpers.qll +++ b/csharp/ql/lib/Linq/Helpers.qll @@ -224,8 +224,9 @@ predicate missedFirstOrDefaultOpportunity(ForeachStmtGenericEnumerable fes, IfSt ) and not is.getCondition().getAChildExpr*() instanceof AwaitExpr and not fes.isAsync() and + not fes.getVariable().isCaptured() and returnsLoopVariable(fes, is.getThen()) and -fes.getElementType() = fes.getVariable().getType() and + fes.getElementType() = fes.getVariable().getType() and returnsDefaultValueAfterForeach(fes) } diff --git a/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.cs b/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.cs index 80584bd6ea6b..8120a70414e5 100644 --- a/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.cs +++ b/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.cs @@ -167,6 +167,18 @@ public object M13(IEnumerable values) return default(int); } + public Operation M14(IEnumerable operations, Func[] predicates) + { + // GOOD: Ignore the corner case where the foreach variable is captured by a nested lambda. + foreach (var operation in operations) + { + if (Array.Exists(predicates, predicate => predicate(operation.OperationId))) + return operation; + } + + return null; + } + private static Task IsMatch(Operation operation, string operationId) => Task.FromResult(string.Equals(operation.OperationId, operationId, StringComparison.Ordinal)); } From b42f997f1e7d1101f4ef66479767b2d3d0ff8874 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 4 Sep 2026 17:00:48 +0200 Subject: [PATCH 0712/2098] C++: Fix test I broke by accident --- .../taint-tests/test_mad-signatures.expected | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/test_mad-signatures.expected b/cpp/ql/test/library-tests/dataflow/taint-tests/test_mad-signatures.expected index d494c09e71d5..2da7e83cca37 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/test_mad-signatures.expected +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/test_mad-signatures.expected @@ -1962,6 +1962,15 @@ getSignatureParameterName | (BUF_MEM *,size_t) | | BUF_MEM_grow | 1 | size_t | | (BUF_MEM *,size_t) | | BUF_MEM_grow_clean | 0 | BUF_MEM * | | (BUF_MEM *,size_t) | | BUF_MEM_grow_clean | 1 | size_t | +| (Blob *,int,const Blob &,int,int) | BlobUtil | copy | 0 | Blob * | +| (Blob *,int,const Blob &,int,int) | BlobUtil | copy | 1 | int | +| (Blob *,int,const Blob &,int,int) | BlobUtil | copy | 2 | const Blob & | +| (Blob *,int,const Blob &,int,int) | BlobUtil | copy | 3 | int | +| (Blob *,int,const Blob &,int,int) | BlobUtil | copy | 4 | int | +| (Blob *,int,const char *,int) | BlobUtil | copy | 0 | Blob * | +| (Blob *,int,const char *,int) | BlobUtil | copy | 1 | int | +| (Blob *,int,const char *,int) | BlobUtil | copy | 2 | const char * | +| (Blob *,int,const char *,int) | BlobUtil | copy | 3 | int | | (BrotliBitReader *const,uint64_t,uint64_t *) | | BrotliSafeReadBits32Slow | 0 | BrotliBitReader *const | | (BrotliBitReader *const,uint64_t,uint64_t *) | | BrotliSafeReadBits32Slow | 1 | uint64_t | | (BrotliBitReader *const,uint64_t,uint64_t *) | | BrotliSafeReadBits32Slow | 2 | uint64_t * | @@ -13127,6 +13136,10 @@ getSignatureParameterName | (char *,char,char **) | | __old_strtok_r_1c | 0 | char * | | (char *,char,char **) | | __old_strtok_r_1c | 1 | char | | (char *,char,char **) | | __old_strtok_r_1c | 2 | char ** | +| (char *,const Blob &,int,int) | BlobUtil | copy | 0 | char * | +| (char *,const Blob &,int,int) | BlobUtil | copy | 1 | const Blob & | +| (char *,const Blob &,int,int) | BlobUtil | copy | 2 | int | +| (char *,const Blob &,int,int) | BlobUtil | copy | 3 | int | | (char *,const char *) | | xstrdup | 0 | char * | | (char *,const char *) | | xstrdup | 1 | const char * | | (char *,const char **,const char **,const char **,const char **,const char **) | | _nl_explode_name | 0 | char * | From 8bc69b4012c0cc3515e4a55143710ffee34c7c37 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 4 Sep 2026 17:04:21 +0100 Subject: [PATCH 0713/2098] C++: Fix a bad join. Before: ``` [2026-09-04 12:36:27] Evaluated non-recursive predicate FlowSummaryImpl::Input2::hasKindAndEnclosingFunction/3#3e350d0c@603f9du6 in 374ms (size: 604170). Evaluated relational algebra for predicate FlowSummaryImpl::Input2::hasKindAndEnclosingFunction/3#3e350d0c@603f9du6 with tuple counts: 672310 ~0% {2} r1 = JOIN `cached_ResolveFunction::isFunction/1#9226b83f` WITH DataFlowPrivate::TSourceCallable#54d42094 ON FIRST 1 OUTPUT Rhs.1, Lhs.0 34670069 ~2% {2} | JOIN WITH `DataFlowUtil::Node.getEnclosingCallable/0#dispred#74002437_10#join_rhs` ON FIRST 1 OUTPUT Rhs.1, Lhs.1 604170 ~0% {3} | JOIN WITH `DataFlowPrivate::ReturnNode.getKind/0#dispred#c7586c0b` ON FIRST 1 OUTPUT Lhs.1, Rhs.1, Lhs.0 return r1 ``` After: ``` [2026-09-04 16:46:20] Evaluated non-recursive predicate FlowSummaryImpl::Input2::hasKindAndEnclosingFunction/3#3e350d0c@1ded09ff in 1158ms (size: 604170). Evaluated relational algebra for predicate FlowSummaryImpl::Input2::hasKindAndEnclosingFunction/3#3e350d0c@1ded09ff with tuple counts: 614924 ~1% {3} r1 = JOIN `DataFlowPrivate::ReturnNode.getKind/0#dispred#c7586c0b` WITH `DataFlowUtil::Node.getEnclosingCallable/0#dispred#74002437` ON FIRST 1 OUTPUT Rhs.1, Lhs.1, Lhs.0 604170 ~5% {3} | JOIN WITH DataFlowPrivate::TSourceCallable#54d42094_10#join_rhs ON FIRST 1 OUTPUT Rhs.1, Lhs.1, Lhs.2 604170 ~5% {3} | JOIN WITH `cached_ResolveFunction::isFunction/1#9226b83f` ON FIRST 1 OUTPUT Lhs.0, Lhs.1, Lhs.2 return r1 ``` --- .../lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll index 780c802dc8ae..176b95933db8 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll @@ -256,7 +256,7 @@ private module Input2 implements Impl::Private::InputSig2 { pragma[nomagic] private predicate hasKindAndEnclosingFunction(Function f, ReturnKind rk, ReturnNode r) { r.getEnclosingCallable().asSourceCallable() = f and - r.getKind() = rk + pragma[only_bind_into](r).getKind() = rk } pragma[nomagic] From 0208f19c639b25315b61fd250a5184cb822325b7 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 4 Sep 2026 17:05:14 +0100 Subject: [PATCH 0714/2098] C++: Reduce tuple duplication in store step pipeline. Before (notice the large tuple duplication): ``` [2026-09-04 12:36:27] Evaluated non-recursive predicate DataFlowPrivate::storeStepImpl/4#5a9e2fd2@8e5724c9 in 1535ms (size: 189539). Evaluated relational algebra for predicate DataFlowPrivate::storeStepImpl/4#5a9e2fd2@8e5724c9 with tuple counts: 20361 ~4% {3} r1 = JOIN DataFlowNodes::TFlowSummaryNode#d5706fd6 WITH `FlowSummaryImpl::Private::Steps::summaryStoreStep/3#a7d89e4d` ON FIRST 1 OUTPUT Rhs.2, Lhs.1, Rhs.1 20361 ~0% {4} | JOIN WITH DataFlowNodes::TFlowSummaryNode#d5706fd6 ON FIRST 1 OUTPUT Lhs.1, Lhs.2, Rhs.1, _ 20361 ~0% {4} | REWRITE WITH Out.3 := true 27390490 ~0% {3} r2 = SCAN `DataFlowPrivate::nodeHasInstruction/3#f469bb06` OUTPUT In.1, In.0, In.2 1146769 ~1% {3} | JOIN WITH `Instruction::StoreInstruction.getDestinationAddressOperand/0#dispred#596a4aba` ON FIRST 1 OUTPUT Rhs.1, Lhs.1, Lhs.2 1251911 ~0% {6} | JOIN WITH `DataFlowPrivate::numberOfLoadsFromOperand/4#7e555666_1023#join_rhs` ON FIRST 1 OUTPUT Rhs.1, Lhs.1, Rhs.3, _, Lhs.2, Rhs.2 1251911 ~3% {4} | REWRITE WITH Tmp.3 := 1, Out.3 := (Tmp.3 + In.4 + In.5) KEEPING 4 354360 ~0% {6} | JOIN WITH DataFlowNodes::PostFieldUpdateNode#ba49e082_1023#join_rhs ON FIRST 1 OUTPUT Rhs.1, Lhs.1, Lhs.2, Lhs.3, Rhs.2, Rhs.3 354360 ~0% {8} | JOIN WITH DataFlowNodes::TPostUpdateNodeImpl#15a1088b_21#join_rhs ON FIRST 1 OUTPUT Lhs.1, Lhs.2, Lhs.3, Lhs.0, Lhs.4, Lhs.5, Rhs.1, _ {7} | REWRITE WITH Tmp.7 := 1, TEST InOut.6 = Tmp.7 KEEPING 7 170359 ~1% {6} | SCAN OUTPUT In.3, In.4, In.5, In.0, In.1, In.2 697388 ~3% {5} | JOIN WITH DataFlowNodes::PostFieldUpdateNode#ba49e082_0231#join_rhs ON FIRST 3 OUTPUT Rhs.3, Lhs.3, Lhs.4, Lhs.5, Lhs.0 697555 ~302% {5} | JOIN WITH `DataFlowNodes::FieldAddress.getField/0#dispred#fea3b845` ON FIRST 1 OUTPUT Rhs.1, Lhs.1, Lhs.2, Lhs.3, Lhs.4 895112 ~156% {5} | JOIN WITH `DataFlowUtil::FieldContent.getAField/0#dispred#ba1c91e5_10#join_rhs` ON FIRST 1 OUTPUT Rhs.1, Lhs.3, Lhs.1, Lhs.2, Lhs.4 417949 ~139% {4} | JOIN WITH `DataFlowUtil::Content.getIndirectionIndex/0#dispred#c14b335b` ON FIRST 2 OUTPUT Lhs.2, Lhs.0, Lhs.4, Lhs.3 438310 ~121% {4} r3 = r1 UNION r2 return r3 ``` After: ``` [2026-09-04 16:30:27] Evaluated non-recursive predicate DataFlowPrivate::storeStepTarget/4#0e049f2e@635fa9rj in 72ms (size: 699622). Evaluated relational algebra for predicate DataFlowPrivate::storeStepTarget/4#0e049f2e@635fa9rj with tuple counts: 702928 ~0% {4} r1 = JOIN `DataFlowPrivate::hasFieldAndIndirectionIndex/3#a1231a07` WITH `DataFlowPrivate::hasFieldAddressAndField/3#35a98069` ON FIRST 1 OUTPUT Rhs.2, Lhs.1, Rhs.1, Lhs.2 return r1 [2026-09-04 16:30:38] Evaluated non-recursive predicate DataFlowPrivate::storeStepSource/4#765254a7@d27b3d3c in 163ms (size: 1251911). Evaluated relational algebra for predicate DataFlowPrivate::storeStepSource/4#765254a7@d27b3d3c with tuple counts: 863285 ~0% {2} r1 = JOIN `Instruction::StoreInstruction.getDestinationAddressOperand/0#dispred#596a4aba` WITH Instruction::StoreInstruction#ae96f30c ON FIRST 1 OUTPUT Lhs.0, Lhs.1 1146769 ~2% {3} | JOIN WITH `DataFlowPrivate::nodeHasInstruction/3#f469bb06_102#join_rhs` ON FIRST 1 OUTPUT Lhs.1, Rhs.1, Rhs.2 1251911 ~1% {6} | JOIN WITH `DataFlowPrivate::numberOfLoadsFromOperand/4#7e555666_1023#join_rhs` ON FIRST 1 OUTPUT Rhs.1, _, Lhs.1, Rhs.3, Lhs.2, Rhs.2 1251911 ~1% {4} | REWRITE WITH Tmp.1 := 1, Out.1 := (Tmp.1 + In.4 + In.5) KEEPING 4 return r1 [2026-09-04 16:30:38] Evaluated non-recursive predicate DataFlowPrivate::storeStepImpl/4#5a9e2fd2@ddd0439f in 70ms (size: 189539). Evaluated relational algebra for predicate DataFlowPrivate::storeStepImpl/4#5a9e2fd2@ddd0439f with tuple counts: 169178 ~0% {4} r1 = JOIN `DataFlowPrivate::storeStepTarget/4#0e049f2e` WITH `DataFlowPrivate::storeStepSource/4#765254a7` ON FIRST 2 OUTPUT Rhs.2, Lhs.3, Lhs.2, Rhs.3 20361 ~4% {3} r2 = JOIN DataFlowNodes::TFlowSummaryNode#d5706fd6 WITH `FlowSummaryImpl::Private::Steps::summaryStoreStep/3#a7d89e4d` ON FIRST 1 OUTPUT Rhs.2, Lhs.1, Rhs.1 20361 ~0% {4} | JOIN WITH DataFlowNodes::TFlowSummaryNode#d5706fd6 ON FIRST 1 OUTPUT Lhs.1, Lhs.2, Rhs.1, _ 20361 ~0% {4} | REWRITE WITH Out.3 := true 189539 ~0% {4} r3 = r1 UNION r2 return r3 ``` --- .../ir/dataflow/internal/DataFlowPrivate.qll | 57 ++++++++++++++----- 1 file changed, 44 insertions(+), 13 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll index 3a1b42645642..551035c5589e 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll @@ -122,6 +122,47 @@ private module Cached { FlowSummaryImpl::Private::Steps::summaryJumpStep(n1, n2) } + bindingset[store] + pragma[inline_late] + private predicate nodeHasInstructionLate(Node node, StoreInstruction store, int indirectionIndex) { + nodeHasInstruction(node, store, indirectionIndex) + } + + pragma[nomagic] + private predicate storeStepSource( + Operand fieldAddress, int contentIndirectionIndex, Node node, boolean certain + ) { + exists(int indirectionIndex, int numberOfLoads, StoreInstruction store | + nodeHasInstructionLate(node, store, indirectionIndex) and + numberOfLoadsFromOperand(fieldAddress, store.getDestinationAddressOperand(), numberOfLoads, + certain) and + contentIndirectionIndex = 1 + indirectionIndex + numberOfLoads + ) + } + + pragma[nomagic] + private predicate hasFieldAddressAndField(Field f, PostFieldUpdateNode pfu, Operand fieldAddress) { + pfu.getIndirectionIndex() = 1 and + pfu.getUpdatedField() = f and + pfu.getFieldAddress() = fieldAddress + } + + pragma[nomagic] + private predicate hasFieldAndIndirectionIndex(Field f, int indirectionIndex, FieldContent fc) { + fc.getAField() = f and + fc.getIndirectionIndex() = indirectionIndex + } + + pragma[nomagic] + private predicate storeStepTarget( + Operand address, int indirectionIndex, PostFieldUpdateNode pfu, FieldContent fc + ) { + exists(Field f | + hasFieldAddressAndField(f, pfu, address) and + hasFieldAndIndirectionIndex(f, indirectionIndex, fc) + ) + } + /** * Holds if data can flow from `node1` to `node2` via an assignment to `f`. * Thus, `node2` references an object with a field `f` that contains the @@ -132,19 +173,9 @@ private module Cached { */ cached predicate storeStepImpl(Node node1, Content c, Node node2, boolean certain) { - exists( - PostFieldUpdateNode postFieldUpdate, int indirectionIndex1, int numberOfLoads, - StoreInstruction store, FieldContent fc - | - postFieldUpdate = node2 and - fc = c and - nodeHasInstruction(node1, pragma[only_bind_into](store), - pragma[only_bind_into](indirectionIndex1)) and - postFieldUpdate.getIndirectionIndex() = 1 and - numberOfLoadsFromOperand(postFieldUpdate.getFieldAddress(), - store.getDestinationAddressOperand(), numberOfLoads, certain) and - fc.getAField() = postFieldUpdate.getUpdatedField() and - getIndirectionIndexLate(fc) = 1 + indirectionIndex1 + numberOfLoads + exists(Operand fieldAddress, int indirectionIndex | + storeStepSource(fieldAddress, indirectionIndex, node1, certain) and + storeStepTarget(fieldAddress, indirectionIndex, node2, c) ) or // models-as-data summarized flow From a770173d326d0966fd43c61d8145bb617e107545 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 4 Sep 2026 14:37:45 +0200 Subject: [PATCH 0715/2098] unified: Drive-by fix a bad join ordering --- .../ql/lib/codeql/unified/internal/StaticNameBinding.qll | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 26d94f0591fb..3d529744f618 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -401,16 +401,23 @@ private module TrackNamespaceInput implements TrackInputSig { private module TrackNamespace = Track; +bindingset[node1, node2] +pragma[inline_late] +private predicate sameName(Identifier node1, Identifier node2) { + node1.getValue() = node2.getValue() +} + /** * Holds if `decl` is a trivial local alias for an imported name. * * Declaration-tracking usually stops at type-aliases, but trivial aliases * will be passed through. */ +pragma[nomagic] predicate isTrivialNameAlias(NameDeclaration decl) { exists(ImportDeclaration imprt | decl = getImportBindingIdentifier(imprt) and - decl.getName() = getIdentifierFromRef(imprt.getImportedExpr()).getValue() + sameName(decl, getIdentifierFromRef(imprt.getImportedExpr())) ) } From 0d2aa5b8f56fdbdd0cd9ffa473d3231bb8f2c6a8 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 4 Sep 2026 22:34:58 +0200 Subject: [PATCH 0716/2098] unified: Change plugin hook to isNonPattern --- .../codeql/unified/internal/LocalNameBinding.qll | 14 +++++++++++++- .../codeql/unified/internal/NameBindingPlugin.qll | 9 ++++----- .../unified/internal/NameBindingPluginSwift.qll | 6 ++---- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index 019373a01987..b44d6914b3f1 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -185,8 +185,20 @@ private module LocalNameBindingInput implements LocalNameBindingInputSig Date: Fri, 4 Sep 2026 22:35:50 +0200 Subject: [PATCH 0717/2098] unified: Simplify charpred --- unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll | 3 --- 1 file changed, 3 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index b44d6914b3f1..62a82e63967f 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -389,9 +389,6 @@ module Public { */ class PotentialLocalNameAccess extends Identifier { PotentialLocalNameAccess() { - this instanceof NameDeclaration - or - not this instanceof NameDeclaration and not this = any(MemberAccessExpr e).getMemberNameNode() and not this = any(Argument a).getNameNode() and not this = any(Parameter p).getExternalNameNode() and From f82774b69b0a25d7eb9765f4980c1c19b2905e92 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan <62447351+owen-mc@users.noreply.github.com> Date: Sun, 6 Sep 2026 11:27:18 +0100 Subject: [PATCH 0718/2098] Apply suggestion from @owen-mc --- actions/ql/lib/codeql/actions/security/ControlChecks.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actions/ql/lib/codeql/actions/security/ControlChecks.qll b/actions/ql/lib/codeql/actions/security/ControlChecks.qll index 5bc77f154ee4..733c92559d70 100644 --- a/actions/ql/lib/codeql/actions/security/ControlChecks.qll +++ b/actions/ql/lib/codeql/actions/security/ControlChecks.qll @@ -277,7 +277,7 @@ abstract class LabelCheck extends ControlCheck { } /** - * This type represents deployment environments that may serve as sanitizers for + * A deployment environment that may serve as a sanitizer for * various vulnerabilities. * * It is possible to customize which deployment environments apply. The default behavior From 43984e2aa549d2bb7f34811e9688ea8815c1afa8 Mon Sep 17 00:00:00 2001 From: Asger F Date: Sun, 6 Sep 2026 19:46:51 +0200 Subject: [PATCH 0719/2098] unified: Fix getIdentifierFromRef --- unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 3d529744f618..9055e7331e7c 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -119,7 +119,7 @@ class NameBindingNode extends TNameBindingNode { } Identifier getIdentifierFromRef(AstNode n) { - result = n.(Identifier) + result = n.(PotentialLocalNameAccess) or result = n.(MemberAccessExpr).getMemberNameNode() } From 8897f3c4945a0253f3dfc048f350b5c30ab2749a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 7 Sep 2026 03:04:28 +0000 Subject: [PATCH 0720/2098] Go: Update to 1.27.1 --- MODULE.bazel | 2 +- go/actions/test/action.yml | 2 +- go/extractor/go.mod | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 7f15d1e889f7..93fcde1bfd7f 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -305,7 +305,7 @@ use_repo( ) go_sdk = use_extension("@rules_go//go:extensions.bzl", "go_sdk") -go_sdk.download(version = "1.27.0") +go_sdk.download(version = "1.27.1") go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps") go_deps.from_file(go_mod = "//go/extractor:go.mod") diff --git a/go/actions/test/action.yml b/go/actions/test/action.yml index 25ff389dc01e..5c6fea376ecc 100644 --- a/go/actions/test/action.yml +++ b/go/actions/test/action.yml @@ -4,7 +4,7 @@ inputs: go-test-version: description: Which Go version to use for running the tests required: false - default: "~1.27.0" + default: "~1.27.1" run-code-checks: description: Whether to run qhelp generation checks required: false diff --git a/go/extractor/go.mod b/go/extractor/go.mod index 74a25627fdce..83510bce510e 100644 --- a/go/extractor/go.mod +++ b/go/extractor/go.mod @@ -2,7 +2,7 @@ module github.com/github/codeql-go/extractor go 1.27 -toolchain go1.27.0 +toolchain go1.27.1 // when updating this, run // bazel run @rules_go//go -- mod tidy From f5eec514eb63a66a756adc072d9a9ec01c1ebd66 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Mon, 7 Sep 2026 10:09:56 +0200 Subject: [PATCH 0721/2098] Docs: replace deprecated GHIcons logo with Primer Octovisuals asset GHIcons is deprecated and the hot-linked URL now 404s. The replacement `code-ql` icon is hosted alongside the site's other assets, so the `../` path matches the nav links already in this file. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- docs/codeql/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/codeql/index.html b/docs/codeql/index.html index 981599627bd6..0b2833d25dac 100644 --- a/docs/codeql/index.html +++ b/docs/codeql/index.html @@ -66,7 +66,7 @@
    - +

    CodeQL documentation

    CodeQL enables you to query code as though it were data. Write a query to find all variants of a vulnerability, eradicating it forever. Then share your query to help others do the same.

    From f267992e7ee14aa2a4cd6283510f5ce67bb957b7 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Mon, 7 Sep 2026 09:38:07 +0200 Subject: [PATCH 0722/2098] Rust: Update path resolution tests for `m::{self}` `m::{self}` where `m` is a struct errors since Rust 1.96: - https://releases.rs/docs/1.96.0/#compatibility-notes - https://github.com/rust-lang/rust/pull/152996 --- .../path-resolution/invalid/main.rs | 12 + .../library-tests/path-resolution/main.rs | 35 +- .../path-resolution/path-resolution.expected | 644 +++++++++--------- 3 files changed, 361 insertions(+), 330 deletions(-) diff --git a/rust/ql/test/library-tests/path-resolution/invalid/main.rs b/rust/ql/test/library-tests/path-resolution/invalid/main.rs index b58fcb2d9346..8e22756b060c 100644 --- a/rust/ql/test/library-tests/path-resolution/invalid/main.rs +++ b/rust/ql/test/library-tests/path-resolution/invalid/main.rs @@ -4,3 +4,15 @@ struct A; // A1 struct A; // A2 fn f(x: A) {} // $ item=A2 (the latter occurence takes precedence) + +/// Test `m::{self}` where `m` is a struct. Per the Rust specification `m` must +/// resolve to a module, trait, or enum: +/// https://doc.rust-lang.org/reference/items/use-declarations.html#r-items.use.self.module +mod self_import_from_struct { + struct MyStruct; // Struct + + #[rustfmt::skip] + use self::MyStruct::{ // $ item=Struct + self // $ SPURIOUS: item=Struct + }; +} diff --git a/rust/ql/test/library-tests/path-resolution/main.rs b/rust/ql/test/library-tests/path-resolution/main.rs index f95b6ef09ef3..2af5301b29f3 100644 --- a/rust/ql/test/library-tests/path-resolution/main.rs +++ b/rust/ql/test/library-tests/path-resolution/main.rs @@ -685,29 +685,38 @@ mod m18 { } } -mod m21 { - mod m22 { +/// Test importing modules, traits, and enums with `{self}`. +mod self_imports { + mod definitions { + pub mod my_module { + pub fn f() {} // I107 + } // I104 + pub trait MyTrait {} // I105 pub enum MyEnum { - A, // I104 - } // I105 + A, // I108 + } // I106 + } - pub struct MyStruct; // I106 - } // I107 + mod imports { + #[rustfmt::skip] + use super::definitions::my_module::{ // $ item=I104 + self // $ item=I104 + }; - mod m33 { #[rustfmt::skip] - use super::m22::MyEnum::{ // $ item=I105 - self // $ item=I105 + use super::definitions::MyTrait::{ // $ item=I105 + self // $ MISSING: item=I105 SPURIOUS: item=definitions }; #[rustfmt::skip] - use super::m22::MyStruct::{ // $ item=I106 + use super::definitions::MyEnum::{ // $ item=I106 self // $ item=I106 }; - fn f() { - let _ = MyEnum::A; // $ item=I104 - let _ = MyStruct {}; // $ item=I106 + #[rustfmt::skip] + fn f() { // $ MISSING: item=I105 + my_module::f(); // $ item=I107 + let _ = MyEnum::A; // $ item=I108 } } } 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 ef881e62f53b..1bab8b3b2eaf 100644 --- a/rust/ql/test/library-tests/path-resolution/path-resolution.expected +++ b/rust/ql/test/library-tests/path-resolution/path-resolution.expected @@ -1,4 +1,5 @@ mod +| invalid/main.rs:8:1:18:1 | mod self_import_from_struct | | lib.rs:1:1:1:11 | mod my | | main.rs:1:1:1:7 | mod my | | main.rs:8:1:8:8 | mod my2 | @@ -25,18 +26,19 @@ mod | main.rs:668:1:686:1 | mod m18 | | main.rs:673:5:685:5 | mod m19 | | main.rs:678:9:684:9 | mod m20 | -| main.rs:688:1:713:1 | mod m21 | -| main.rs:689:5:695:5 | mod m22 | -| main.rs:697:5:712:5 | mod m33 | -| main.rs:715:1:740:1 | mod m23 | -| main.rs:742:1:810:1 | mod m24 | -| main.rs:827:1:879:1 | mod associated_types | -| main.rs:881:1:954:1 | mod associated_types_subtrait | -| main.rs:960:1:979:1 | mod impl_with_attribute_macro | -| main.rs:981:1:1022:1 | mod patterns | -| main.rs:1024:1:1068:1 | mod self_constructors | -| main.rs:1070:1:1099:1 | mod self_types | -| main.rs:1101:1:1145:1 | mod const_static | +| main.rs:688:1:722:1 | mod self_imports | +| main.rs:690:5:698:5 | mod definitions | +| main.rs:691:9:693:9 | mod my_module | +| main.rs:700:5:721:5 | mod imports | +| main.rs:724:1:749:1 | mod m23 | +| main.rs:751:1:819:1 | mod m24 | +| main.rs:836:1:888:1 | mod associated_types | +| main.rs:890:1:963:1 | mod associated_types_subtrait | +| main.rs:969:1:988:1 | mod impl_with_attribute_macro | +| main.rs:990:1:1031:1 | mod patterns | +| main.rs:1033:1:1077:1 | mod self_constructors | +| main.rs:1079:1:1108:1 | mod self_types | +| main.rs:1110:1:1154:1 | mod const_static | | my2/mod.rs:1:1:1:16 | mod nested2 | | my2/mod.rs:20:1:20:12 | mod my3 | | my2/mod.rs:22:1:23:10 | mod mymod | @@ -53,6 +55,9 @@ mod | my/nested.rs:2:5:11:5 | mod nested2 | resolvePath | invalid/main.rs:6:9:6:9 | A | invalid/main.rs:3:11:4:9 | struct A | +| invalid/main.rs:15:9:15:12 | self | invalid/main.rs:8:1:18:1 | mod self_import_from_struct | +| invalid/main.rs:15:9:15:22 | ...::MyStruct | invalid/main.rs:12:5:12:20 | struct MyStruct | +| invalid/main.rs:16:9:16:12 | self | invalid/main.rs:12:5:12:20 | struct MyStruct | | main.rs:4:8:4:9 | my | main.rs:1:1:1:7 | mod my | | main.rs:4:14:4:17 | self | main.rs:1:1:1:7 | mod my | | main.rs:6:5:6:6 | my | main.rs:1:1:1:7 | mod my | @@ -78,7 +83,7 @@ resolvePath | main.rs:37:17:37:24 | ...::f | main.rs:26:9:28:9 | fn f | | main.rs:39:17:39:23 | println | {EXTERNAL LOCATION} | MacroRules | | main.rs:40:17:40:17 | f | main.rs:26:9:28:9 | fn f | -| main.rs:47:9:47:13 | super | main.rs:1:1:1184:2 | SourceFile | +| main.rs:47:9:47:13 | super | main.rs:1:1:1193:2 | SourceFile | | main.rs:47:9:47:17 | ...::m1 | main.rs:20:1:44:1 | mod m1 | | main.rs:47:9:47:21 | ...::m2 | main.rs:25:5:43:5 | mod m2 | | main.rs:47:9:47:24 | ...::g | main.rs:30:9:34:9 | fn g | @@ -93,7 +98,7 @@ resolvePath | main.rs:68:17:68:19 | Foo | main.rs:66:9:66:21 | struct Foo | | main.rs:71:13:71:15 | Foo | main.rs:60:5:60:17 | struct Foo | | main.rs:73:5:73:5 | f | main.rs:62:5:69:5 | fn f | -| main.rs:75:5:75:8 | self | main.rs:1:1:1184:2 | SourceFile | +| main.rs:75:5:75:8 | self | main.rs:1:1:1193:2 | SourceFile | | main.rs:75:5:75:11 | ...::i | main.rs:78:1:90:1 | fn i | | main.rs:79:5:79:11 | println | {EXTERNAL LOCATION} | MacroRules | | main.rs:81:13:81:15 | Foo | main.rs:55:1:55:13 | struct Foo | @@ -115,7 +120,7 @@ resolvePath | main.rs:112:9:112:15 | println | {EXTERNAL LOCATION} | MacroRules | | main.rs:118:9:118:15 | println | {EXTERNAL LOCATION} | MacroRules | | main.rs:122:9:122:15 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:125:13:125:17 | super | main.rs:1:1:1184:2 | SourceFile | +| main.rs:125:13:125:17 | super | main.rs:1:1:1193:2 | SourceFile | | main.rs:125:13:125:21 | ...::m5 | main.rs:110:1:114:1 | mod m5 | | main.rs:126:9:126:9 | f | main.rs:111:5:113:5 | fn f | | main.rs:126:9:126:9 | f | main.rs:117:5:119:5 | fn f | @@ -385,307 +390,312 @@ resolvePath | main.rs:682:17:682:21 | super | main.rs:673:5:685:5 | mod m19 | | main.rs:682:17:682:28 | ...::super | main.rs:668:1:686:1 | mod m18 | | main.rs:682:17:682:31 | ...::f | main.rs:669:5:671:5 | fn f | -| main.rs:699:13:699:17 | super | main.rs:688:1:713:1 | mod m21 | -| main.rs:699:13:699:22 | ...::m22 | main.rs:689:5:695:5 | mod m22 | -| main.rs:699:13:699:30 | ...::MyEnum | main.rs:690:9:692:9 | enum MyEnum | -| main.rs:700:13:700:16 | self | main.rs:690:9:692:9 | enum MyEnum | -| main.rs:704:13:704:17 | super | main.rs:688:1:713:1 | mod m21 | -| main.rs:704:13:704:22 | ...::m22 | main.rs:689:5:695:5 | mod m22 | -| main.rs:704:13:704:32 | ...::MyStruct | main.rs:694:9:694:28 | struct MyStruct | -| main.rs:705:13:705:16 | self | main.rs:694:9:694:28 | struct MyStruct | -| main.rs:709:21:709:26 | MyEnum | main.rs:690:9:692:9 | enum MyEnum | -| main.rs:709:21:709:29 | ...::A | main.rs:691:13:691:13 | A | -| main.rs:710:21:710:28 | MyStruct | main.rs:694:9:694:28 | struct MyStruct | -| main.rs:726:10:728:5 | Trait1::<...> | main.rs:716:5:721:5 | trait Trait1 | -| main.rs:727:7:727:10 | Self | main.rs:723:5:723:13 | struct S | -| main.rs:729:11:729:11 | S | main.rs:723:5:723:13 | struct S | -| main.rs:731:13:731:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:737:17:737:17 | S | main.rs:723:5:723:13 | struct S | -| main.rs:753:15:753:15 | T | main.rs:752:26:752:26 | T | -| main.rs:758:9:758:24 | GenericStruct::<...> | main.rs:751:5:754:5 | struct GenericStruct | -| main.rs:758:23:758:23 | T | main.rs:757:10:757:10 | T | -| main.rs:760:9:760:9 | T | main.rs:757:10:757:10 | T | -| main.rs:760:12:760:17 | TraitA | main.rs:743:5:745:5 | trait TraitA | -| main.rs:769:9:769:24 | GenericStruct::<...> | main.rs:751:5:754:5 | struct GenericStruct | -| main.rs:769:23:769:23 | T | main.rs:768:10:768:10 | T | -| main.rs:771:9:771:9 | T | main.rs:768:10:768:10 | T | -| main.rs:771:12:771:17 | TraitB | main.rs:747:5:749:5 | trait TraitB | -| main.rs:772:9:772:9 | T | main.rs:768:10:768:10 | T | -| main.rs:772:12:772:17 | TraitA | main.rs:743:5:745:5 | trait TraitA | -| main.rs:783:10:783:15 | TraitA | main.rs:743:5:745:5 | trait TraitA | -| main.rs:783:21:783:31 | Implementor | main.rs:780:5:780:23 | struct Implementor | -| main.rs:785:13:785:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:790:10:790:15 | TraitB | main.rs:747:5:749:5 | trait TraitB | -| main.rs:790:21:790:31 | Implementor | main.rs:780:5:780:23 | struct Implementor | -| main.rs:792:13:792:19 | println | {EXTERNAL LOCATION} | MacroRules | -| main.rs:798:24:798:34 | Implementor | main.rs:780:5:780:23 | struct Implementor | -| main.rs:799:23:799:35 | GenericStruct | main.rs:751:5:754:5 | struct GenericStruct | -| main.rs:805:9:805:36 | GenericStruct::<...> | main.rs:751:5:754:5 | struct GenericStruct | -| main.rs:805:9:805:50 | ...::call_trait_a | main.rs:762:9:764:9 | fn call_trait_a | -| main.rs:805:25:805:35 | Implementor | main.rs:780:5:780:23 | struct Implementor | -| main.rs:808:9:808:36 | GenericStruct::<...> | main.rs:751:5:754:5 | struct GenericStruct | -| main.rs:808:9:808:47 | ...::call_both | main.rs:774:9:777:9 | fn call_both | -| main.rs:808:25:808:35 | Implementor | main.rs:780:5:780:23 | struct Implementor | -| main.rs:814:3:814:12 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:814:3:814:24 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | -| main.rs:818:6:818:12 | AStruct | main.rs:817:1:817:17 | struct AStruct | -| main.rs:820:7:820:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:820:7:820:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | -| main.rs:823:7:823:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:823:7:823:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | -| main.rs:828:9:828:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:828:9:828:19 | ...::marker | {EXTERNAL LOCATION} | mod marker | -| main.rs:828:9:828:32 | ...::PhantomData | {EXTERNAL LOCATION} | struct PhantomData | -| main.rs:829:9:829:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:829:9:829:19 | ...::result | {EXTERNAL LOCATION} | mod result | -| main.rs:829:9:829:27 | ...::Result | {EXTERNAL LOCATION} | enum Result | -| main.rs:837:19:837:22 | Self | main.rs:831:5:839:5 | trait Reduce | -| main.rs:837:19:837:29 | ...::Input | main.rs:832:9:832:19 | type Input | -| main.rs:838:14:838:46 | Result::<...> | {EXTERNAL LOCATION} | enum Result | -| main.rs:838:21:838:24 | Self | main.rs:831:5:839:5 | trait Reduce | -| main.rs:838:21:838:32 | ...::Output | main.rs:833:21:834:20 | type Output | -| main.rs:838:35:838:38 | Self | main.rs:831:5:839:5 | trait Reduce | -| main.rs:838:35:838:45 | ...::Error | main.rs:832:21:833:19 | type Error | -| main.rs:842:17:842:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData | -| main.rs:842:29:842:33 | Input | main.rs:841:19:841:23 | Input | -| main.rs:843:17:843:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData | -| main.rs:843:29:843:33 | Error | main.rs:841:26:841:30 | Error | -| main.rs:850:11:850:16 | Reduce | main.rs:831:5:839:5 | trait Reduce | -| main.rs:851:13:854:9 | MyImpl::<...> | main.rs:841:5:844:5 | struct MyImpl | -| main.rs:852:13:852:17 | Input | main.rs:848:13:848:17 | Input | -| main.rs:853:13:853:17 | Error | main.rs:849:13:849:17 | Error | -| main.rs:856:22:859:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | -| main.rs:857:13:857:17 | Input | main.rs:848:13:848:17 | Input | -| main.rs:858:13:858:16 | Self | main.rs:846:5:878:5 | impl Reduce for MyImpl::<...> { ... } | -| main.rs:858:13:858:23 | ...::Error | main.rs:860:11:864:9 | type Error | -| main.rs:861:22:863:9 | Option::<...> | {EXTERNAL LOCATION} | enum Option | -| main.rs:862:11:862:15 | Error | main.rs:849:13:849:17 | Error | -| main.rs:866:13:866:17 | Input | main.rs:848:13:848:17 | Input | -| main.rs:871:19:871:22 | Self | main.rs:846:5:878:5 | impl Reduce for MyImpl::<...> { ... } | -| main.rs:871:19:871:29 | ...::Input | main.rs:856:9:860:9 | type Input | -| main.rs:872:14:875:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | -| main.rs:873:13:873:16 | Self | main.rs:846:5:878:5 | impl Reduce for MyImpl::<...> { ... } | -| main.rs:873:13:873:24 | ...::Output | main.rs:864:11:867:9 | type Output | -| main.rs:874:13:874:16 | Self | main.rs:846:5:878:5 | impl Reduce for MyImpl::<...> { ... } | -| main.rs:874:13:874:23 | ...::Error | main.rs:860:11:864:9 | type Error | -| main.rs:886:16:886:20 | Super | main.rs:882:5:884:5 | trait Super | -| main.rs:888:19:888:22 | Self | main.rs:886:5:890:5 | trait Sub | -| main.rs:888:19:888:27 | ...::Out | main.rs:883:9:883:17 | type Out | -| main.rs:893:9:893:10 | ST | main.rs:892:14:892:15 | ST | -| main.rs:897:10:897:14 | Super | main.rs:882:5:884:5 | trait Super | -| main.rs:897:20:897:25 | S::<...> | main.rs:892:5:894:6 | struct S | -| main.rs:897:22:897:24 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:898:20:898:23 | char | {EXTERNAL LOCATION} | struct char | -| main.rs:903:10:903:14 | Super | main.rs:882:5:884:5 | trait Super | -| main.rs:903:20:903:26 | S::<...> | main.rs:892:5:894:6 | struct S | -| main.rs:903:22:903:25 | bool | {EXTERNAL LOCATION} | struct bool | -| main.rs:904:20:904:22 | i64 | {EXTERNAL LOCATION} | struct i64 | -| main.rs:909:10:909:12 | Sub | main.rs:886:5:890:5 | trait Sub | -| main.rs:909:18:909:23 | S::<...> | main.rs:892:5:894:6 | struct S | -| main.rs:909:20:909:22 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:910:19:910:22 | Self | main.rs:908:5:913:5 | impl Sub for S::<...> { ... } | -| main.rs:910:19:910:27 | ...::Out | main.rs:883:9:883:17 | type Out | -| main.rs:916:10:916:12 | Sub | main.rs:886:5:890:5 | trait Sub | -| main.rs:916:18:916:24 | S::<...> | main.rs:892:5:894:6 | struct S | -| main.rs:916:20:916:23 | bool | {EXTERNAL LOCATION} | struct bool | -| main.rs:917:19:917:22 | Self | main.rs:915:5:920:5 | impl Sub for S::<...> { ... } | -| main.rs:917:19:917:27 | ...::Out | main.rs:883:9:883:17 | type Out | -| main.rs:926:19:926:26 | SuperAlt | main.rs:922:5:924:5 | trait SuperAlt | -| main.rs:928:23:928:26 | Self | main.rs:926:5:930:5 | trait SubAlt | -| main.rs:928:23:928:31 | ...::Out | main.rs:923:9:923:17 | type Out | -| main.rs:933:13:933:20 | SuperAlt | main.rs:922:5:924:5 | trait SuperAlt | -| main.rs:933:26:933:29 | S::<...> | main.rs:892:5:894:6 | struct S | -| main.rs:933:28:933:28 | A | main.rs:933:10:933:10 | A | -| main.rs:934:20:934:20 | A | main.rs:933:10:933:10 | A | -| main.rs:939:13:939:18 | SubAlt | main.rs:926:5:930:5 | trait SubAlt | -| main.rs:939:24:939:27 | S::<...> | main.rs:892:5:894:6 | struct S | -| main.rs:939:26:939:26 | A | main.rs:939:10:939:10 | A | -| main.rs:940:23:940:26 | Self | main.rs:938:5:943:5 | impl SubAlt for S::<...> { ... } | -| main.rs:940:23:940:31 | ...::Out | main.rs:923:9:923:17 | type Out | -| main.rs:946:10:946:16 | S::<...> | main.rs:892:5:894:6 | struct S | -| main.rs:946:12:946:15 | bool | {EXTERNAL LOCATION} | struct bool | -| main.rs:948:21:948:37 | <...> | main.rs:882:5:884:5 | trait Super | -| main.rs:948:21:948:42 | ...::Out | main.rs:883:9:883:17 | type Out | -| main.rs:948:22:948:27 | S::<...> | main.rs:892:5:894:6 | struct S | -| main.rs:948:24:948:26 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:948:32:948:36 | Super | main.rs:882:5:884:5 | trait Super | -| main.rs:949:21:949:38 | <...> | main.rs:882:5:884:5 | trait Super | -| main.rs:949:21:949:43 | ...::Out | main.rs:883:9:883:17 | type Out | -| main.rs:949:22:949:28 | S::<...> | main.rs:892:5:894:6 | struct S | -| main.rs:949:24:949:27 | bool | {EXTERNAL LOCATION} | struct bool | -| main.rs:949:33:949:37 | Super | main.rs:882:5:884:5 | trait Super | -| main.rs:951:21:951:41 | <...> | main.rs:922:5:924:5 | trait SuperAlt | -| main.rs:951:21:951:46 | ...::Out | main.rs:923:9:923:17 | type Out | -| main.rs:951:22:951:28 | S::<...> | main.rs:892:5:894:6 | struct S | -| main.rs:951:24:951:27 | bool | {EXTERNAL LOCATION} | struct bool | -| main.rs:951:33:951:40 | SuperAlt | main.rs:922:5:924:5 | trait SuperAlt | -| main.rs:956:5:956:7 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:956:11:956:14 | self | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:958:15:958:17 | ztd | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:958:15:958:25 | ...::string | {EXTERNAL LOCATION} | mod string | -| main.rs:958:15:958:33 | ...::String | {EXTERNAL LOCATION} | struct String | -| main.rs:968:7:968:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:968:7:968:26 | ...::identity | proc_macro.rs:15:1:18:1 | fn identity | -| main.rs:969:10:969:15 | ATrait | main.rs:964:5:966:5 | trait ATrait | -| main.rs:969:21:969:23 | i64 | {EXTERNAL LOCATION} | struct i64 | -| main.rs:971:11:971:13 | i64 | {EXTERNAL LOCATION} | struct i64 | -| main.rs:977:17:977:19 | Foo | main.rs:962:5:962:15 | struct Foo | -| main.rs:983:22:983:32 | Option::<...> | {EXTERNAL LOCATION} | enum Option | -| main.rs:983:29:983:31 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:984:17:984:20 | Some | {EXTERNAL LOCATION} | Some | -| main.rs:985:17:985:27 | Option::<...> | {EXTERNAL LOCATION} | enum Option | -| main.rs:985:24:985:26 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:986:13:986:16 | Some | {EXTERNAL LOCATION} | Some | -| main.rs:987:17:987:20 | None | {EXTERNAL LOCATION} | None | -| main.rs:989:13:989:16 | None | {EXTERNAL LOCATION} | None | -| main.rs:990:17:990:20 | None | {EXTERNAL LOCATION} | None | -| main.rs:999:19:999:29 | Option::<...> | {EXTERNAL LOCATION} | enum Option | -| main.rs:999:26:999:28 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:1000:26:1000:29 | test | main.rs:982:5:996:5 | fn test | -| main.rs:1006:14:1006:16 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:1011:17:1011:20 | Some | {EXTERNAL LOCATION} | Some | -| main.rs:1013:13:1013:16 | Some | {EXTERNAL LOCATION} | Some | -| main.rs:1018:13:1018:16 | Some | {EXTERNAL LOCATION} | Some | -| main.rs:1018:18:1018:18 | z | main.rs:1005:5:1007:12 | const z | -| main.rs:1018:24:1018:24 | z | main.rs:1005:5:1007:12 | const z | -| main.rs:1026:24:1026:26 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:1029:10:1029:20 | TupleStruct | main.rs:1026:5:1026:28 | struct TupleStruct | -| main.rs:1031:19:1031:21 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:1031:27:1031:30 | Self | main.rs:1026:5:1026:28 | struct TupleStruct | -| main.rs:1032:21:1032:24 | Self | main.rs:1026:5:1026:28 | struct TupleStruct | -| main.rs:1033:31:1033:34 | Self | main.rs:1026:5:1026:28 | struct TupleStruct | -| main.rs:1039:12:1039:14 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:1043:10:1043:21 | StructStruct | main.rs:1038:5:1040:5 | struct StructStruct | -| main.rs:1045:19:1045:21 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:1045:27:1045:30 | Self | main.rs:1038:5:1040:5 | struct StructStruct | -| main.rs:1046:13:1046:16 | Self | main.rs:1038:5:1040:5 | struct StructStruct | -| main.rs:1052:13:1052:15 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:1057:10:1057:15 | MyEnum | main.rs:1050:5:1054:5 | enum MyEnum | -| main.rs:1058:25:1058:27 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:1060:17:1060:20 | Self | main.rs:1056:5:1067:5 | impl MyEnum { ... } | -| main.rs:1060:17:1060:23 | ...::A | main.rs:1051:9:1053:9 | A | -| main.rs:1073:15:1073:15 | T | main.rs:1072:31:1072:31 | T | -| main.rs:1074:15:1074:31 | Option::<...> | {EXTERNAL LOCATION} | enum Option | -| main.rs:1074:22:1074:30 | Box::<...> | {EXTERNAL LOCATION} | struct Box | -| main.rs:1074:26:1074:29 | Self | main.rs:1072:5:1075:5 | struct NonEmptyListStruct | -| main.rs:1078:16:1078:16 | T | main.rs:1077:27:1077:27 | T | -| main.rs:1079:14:1079:14 | T | main.rs:1077:27:1077:27 | T | -| main.rs:1079:17:1079:25 | Box::<...> | {EXTERNAL LOCATION} | struct Box | -| main.rs:1079:21:1079:24 | Self | main.rs:1077:5:1080:5 | enum NonEmptyListEnum | -| main.rs:1083:10:1083:30 | NonEmptyListEnum::<...> | main.rs:1077:5:1080:5 | enum NonEmptyListEnum | -| main.rs:1083:27:1083:29 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:1084:30:1084:32 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:1084:38:1084:41 | Self | main.rs:1077:5:1080:5 | enum NonEmptyListEnum | -| main.rs:1085:17:1085:32 | NonEmptyListEnum | main.rs:1077:5:1080:5 | enum NonEmptyListEnum | -| main.rs:1086:13:1086:16 | Self | main.rs:1082:5:1088:5 | impl NonEmptyListEnum::<...> { ... } | -| main.rs:1086:13:1086:24 | ...::Single | main.rs:1078:9:1078:17 | Single | -| main.rs:1094:13:1094:16 | Copy | {EXTERNAL LOCATION} | trait Copy | -| main.rs:1096:17:1096:17 | T | main.rs:1093:9:1093:9 | T | -| main.rs:1097:16:1097:16 | T | main.rs:1093:9:1093:9 | T | -| main.rs:1097:23:1097:26 | Self | main.rs:1090:5:1098:5 | union NonEmptyListUnion | -| main.rs:1103:9:1103:13 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) | -| main.rs:1103:9:1103:27 | ...::const_static | main.rs:1101:1:1145:1 | mod const_static | -| main.rs:1105:27:1105:29 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:1107:29:1107:31 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:1110:17:1110:26 | CONST_ITEM | main.rs:1105:5:1105:35 | const CONST_ITEM | -| main.rs:1111:17:1111:27 | STATIC_ITEM | main.rs:1107:5:1107:37 | static STATIC_ITEM | -| main.rs:1112:17:1112:28 | const_static | main.rs:1101:1:1145:1 | mod const_static | -| main.rs:1112:17:1112:40 | ...::CONST_ITEM | main.rs:1105:5:1105:35 | const CONST_ITEM | -| main.rs:1113:17:1113:28 | const_static | main.rs:1101:1:1145:1 | mod const_static | -| main.rs:1113:17:1113:41 | ...::STATIC_ITEM | main.rs:1107:5:1107:37 | static STATIC_ITEM | -| main.rs:1114:17:1114:27 | CONST_ALIAS | main.rs:1117:9:1118:13 | const CONST_ALIAS | -| main.rs:1115:17:1115:28 | STATIC_ALIAS | main.rs:1118:15:1120:13 | static STATIC_ALIAS | -| main.rs:1117:28:1117:30 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:1117:34:1117:43 | CONST_ITEM | main.rs:1105:5:1105:35 | const CONST_ITEM | -| main.rs:1119:30:1119:32 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:1119:36:1119:46 | STATIC_ITEM | main.rs:1107:5:1107:37 | static STATIC_ITEM | -| main.rs:1122:17:1122:27 | CONST_ALIAS | main.rs:1117:9:1118:13 | const CONST_ALIAS | -| main.rs:1123:17:1123:28 | STATIC_ALIAS | main.rs:1118:15:1120:13 | static STATIC_ALIAS | -| main.rs:1126:32:1126:34 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:1126:38:1126:47 | CONST_ITEM | main.rs:1105:5:1105:35 | const CONST_ITEM | -| main.rs:1128:34:1128:36 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:1128:40:1128:50 | STATIC_ITEM | main.rs:1107:5:1107:37 | static STATIC_ITEM | -| main.rs:1131:21:1131:31 | CONST_ALIAS | main.rs:1126:13:1127:17 | const CONST_ALIAS | -| main.rs:1132:21:1132:32 | STATIC_ALIAS | main.rs:1127:19:1129:17 | static STATIC_ALIAS | -| main.rs:1136:32:1136:34 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:1136:38:1136:47 | CONST_ITEM | main.rs:1105:5:1105:35 | const CONST_ITEM | -| main.rs:1138:34:1138:36 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:1138:40:1138:50 | STATIC_ITEM | main.rs:1107:5:1107:37 | static STATIC_ITEM | -| main.rs:1141:21:1141:31 | CONST_ALIAS | main.rs:1136:13:1137:17 | const CONST_ALIAS | -| main.rs:1142:21:1142:32 | STATIC_ALIAS | main.rs:1137:19:1139:17 | static STATIC_ALIAS | -| main.rs:1148:5:1148:6 | my | main.rs:1:1:1:7 | mod my | -| main.rs:1148:5:1148:14 | ...::nested | my.rs:1:1:1:15 | mod nested | -| main.rs:1148:5:1148:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 | -| main.rs:1148:5:1148:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 | -| main.rs:1148:5:1148:35 | ...::f | my/nested.rs:3:9:5:9 | fn f | -| main.rs:1149:5:1149:6 | my | main.rs:1:1:1:7 | mod my | -| main.rs:1149:5:1149:9 | ...::f | my.rs:5:1:7:1 | fn f | -| main.rs:1150:5:1150:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | -| main.rs:1150:5:1150:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | -| main.rs:1150:5:1150:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | -| main.rs:1150:5:1150:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:1151:5:1151:5 | f | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:1152:5:1152:5 | g | my2/nested2.rs:7:9:9:9 | fn g | -| main.rs:1153:5:1153:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) | -| main.rs:1153:5:1153:12 | ...::h | main.rs:57:1:76:1 | fn h | -| main.rs:1154:5:1154:6 | m1 | main.rs:20:1:44:1 | mod m1 | -| main.rs:1154:5:1154:10 | ...::m2 | main.rs:25:5:43:5 | mod m2 | -| main.rs:1154:5:1154:13 | ...::g | main.rs:30:9:34:9 | fn g | -| main.rs:1155:5:1155:6 | m1 | main.rs:20:1:44:1 | mod m1 | -| main.rs:1155:5:1155:10 | ...::m2 | main.rs:25:5:43:5 | mod m2 | -| main.rs:1155:5:1155:14 | ...::m3 | main.rs:36:9:42:9 | mod m3 | -| main.rs:1155:5:1155:17 | ...::h | main.rs:37:27:41:13 | fn h | -| main.rs:1156:5:1156:6 | m4 | main.rs:46:1:53:1 | mod m4 | -| main.rs:1156:5:1156:9 | ...::i | main.rs:49:5:52:5 | fn i | -| main.rs:1157:5:1157:5 | h | main.rs:57:1:76:1 | fn h | -| main.rs:1158:5:1158:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:1159:5:1159:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g | -| main.rs:1160:5:1160:5 | j | main.rs:104:1:108:1 | fn j | -| main.rs:1161:5:1161:6 | m6 | main.rs:116:1:128:1 | mod m6 | -| main.rs:1161:5:1161:9 | ...::g | main.rs:121:5:127:5 | fn g | -| main.rs:1162:5:1162:6 | m7 | main.rs:130:1:149:1 | mod m7 | -| main.rs:1162:5:1162:9 | ...::f | main.rs:141:5:148:5 | fn f | -| main.rs:1163:5:1163:6 | m8 | main.rs:151:1:205:1 | mod m8 | -| main.rs:1163:5:1163:9 | ...::g | main.rs:189:5:204:5 | fn g | -| main.rs:1164:5:1164:6 | m9 | main.rs:207:1:215:1 | mod m9 | -| main.rs:1164:5:1164:9 | ...::f | main.rs:210:5:214:5 | fn f | -| main.rs:1165:5:1165:7 | m11 | main.rs:238:1:275:1 | mod m11 | -| main.rs:1165:5:1165:10 | ...::f | main.rs:243:5:246:5 | fn f | -| main.rs:1166:5:1166:7 | m15 | main.rs:306:1:375:1 | mod m15 | -| main.rs:1166:5:1166:10 | ...::f | main.rs:362:5:374:5 | fn f | -| main.rs:1167:5:1167:7 | m16 | main.rs:377:1:575:1 | mod m16 | -| main.rs:1167:5:1167:10 | ...::f | main.rs:447:5:471:5 | fn f | -| main.rs:1168:5:1168:20 | trait_visibility | main.rs:577:1:634:1 | mod trait_visibility | -| main.rs:1168:5:1168:23 | ...::f | main.rs:604:5:633:5 | fn f | -| main.rs:1169:5:1169:7 | m17 | main.rs:636:1:666:1 | mod m17 | -| main.rs:1169:5:1169:10 | ...::f | main.rs:660:5:665:5 | fn f | -| main.rs:1170:5:1170:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 | -| main.rs:1170:5:1170:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f | -| main.rs:1171:5:1171:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 | -| main.rs:1171:5:1171:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f | -| main.rs:1172:5:1172:7 | my3 | my2/mod.rs:20:1:20:12 | mod my3 | -| main.rs:1172:5:1172:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f | -| main.rs:1173:5:1173:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | -| main.rs:1174:5:1174:12 | my_alias | main.rs:1:1:1:7 | mod my | -| main.rs:1174:5:1174:22 | ...::nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | -| main.rs:1175:5:1175:7 | m18 | main.rs:668:1:686:1 | mod m18 | -| main.rs:1175:5:1175:12 | ...::m19 | main.rs:673:5:685:5 | mod m19 | -| main.rs:1175:5:1175:17 | ...::m20 | main.rs:678:9:684:9 | mod m20 | -| main.rs:1175:5:1175:20 | ...::g | main.rs:679:13:683:13 | fn g | -| main.rs:1176:5:1176:7 | m23 | main.rs:715:1:740:1 | mod m23 | -| main.rs:1176:5:1176:10 | ...::f | main.rs:735:5:739:5 | fn f | -| main.rs:1177:5:1177:7 | m24 | main.rs:742:1:810:1 | mod m24 | -| main.rs:1177:5:1177:10 | ...::f | main.rs:796:5:809:5 | fn f | -| main.rs:1178:5:1178:8 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) | -| main.rs:1178:5:1178:11 | ...::h | main.rs:57:1:76:1 | fn h | -| main.rs:1179:5:1179:13 | z_changed | main.rs:815:1:815:9 | fn z_changed | -| main.rs:1180:5:1180:11 | AStruct | main.rs:817:1:817:17 | struct AStruct | -| main.rs:1180:5:1180:22 | ...::z_on_type | main.rs:821:5:821:17 | fn z_on_type | -| main.rs:1181:5:1181:11 | AStruct | main.rs:817:1:817:17 | struct AStruct | -| main.rs:1182:5:1182:29 | impl_with_attribute_macro | main.rs:960:1:979:1 | mod impl_with_attribute_macro | -| main.rs:1182:5:1182:35 | ...::test | main.rs:975:5:978:5 | fn test | -| main.rs:1183:5:1183:12 | patterns | main.rs:981:1:1022:1 | mod patterns | -| main.rs:1183:5:1183:18 | ...::test | main.rs:982:5:996:5 | fn test | +| main.rs:702:13:702:17 | super | main.rs:688:1:722:1 | mod self_imports | +| main.rs:702:13:702:30 | ...::definitions | main.rs:690:5:698:5 | mod definitions | +| main.rs:702:13:702:41 | ...::my_module | main.rs:691:9:693:9 | mod my_module | +| main.rs:703:13:703:16 | self | main.rs:691:9:693:9 | mod my_module | +| main.rs:707:13:707:17 | super | main.rs:688:1:722:1 | mod self_imports | +| main.rs:707:13:707:30 | ...::definitions | main.rs:690:5:698:5 | mod definitions | +| main.rs:707:13:707:39 | ...::MyTrait | main.rs:693:11:694:28 | trait MyTrait | +| main.rs:708:13:708:16 | self | main.rs:690:5:698:5 | mod definitions | +| main.rs:712:13:712:17 | super | main.rs:688:1:722:1 | mod self_imports | +| main.rs:712:13:712:30 | ...::definitions | main.rs:690:5:698:5 | mod definitions | +| main.rs:712:13:712:38 | ...::MyEnum | main.rs:694:30:697:9 | enum MyEnum | +| main.rs:713:13:713:16 | self | main.rs:694:30:697:9 | enum MyEnum | +| main.rs:718:13:718:21 | my_module | main.rs:691:9:693:9 | mod my_module | +| main.rs:718:13:718:24 | ...::f | main.rs:692:13:692:25 | fn f | +| main.rs:719:21:719:26 | MyEnum | main.rs:694:30:697:9 | enum MyEnum | +| main.rs:719:21:719:29 | ...::A | main.rs:696:13:696:13 | A | +| main.rs:735:10:737:5 | Trait1::<...> | main.rs:725:5:730:5 | trait Trait1 | +| main.rs:736:7:736:10 | Self | main.rs:732:5:732:13 | struct S | +| main.rs:738:11:738:11 | S | main.rs:732:5:732:13 | struct S | +| main.rs:740:13:740:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:746:17:746:17 | S | main.rs:732:5:732:13 | struct S | +| main.rs:762:15:762:15 | T | main.rs:761:26:761:26 | T | +| main.rs:767:9:767:24 | GenericStruct::<...> | main.rs:760:5:763:5 | struct GenericStruct | +| main.rs:767:23:767:23 | T | main.rs:766:10:766:10 | T | +| main.rs:769:9:769:9 | T | main.rs:766:10:766:10 | T | +| main.rs:769:12:769:17 | TraitA | main.rs:752:5:754:5 | trait TraitA | +| main.rs:778:9:778:24 | GenericStruct::<...> | main.rs:760:5:763:5 | struct GenericStruct | +| main.rs:778:23:778:23 | T | main.rs:777:10:777:10 | T | +| main.rs:780:9:780:9 | T | main.rs:777:10:777:10 | T | +| main.rs:780:12:780:17 | TraitB | main.rs:756:5:758:5 | trait TraitB | +| main.rs:781:9:781:9 | T | main.rs:777:10:777:10 | T | +| main.rs:781:12:781:17 | TraitA | main.rs:752:5:754:5 | trait TraitA | +| main.rs:792:10:792:15 | TraitA | main.rs:752:5:754:5 | trait TraitA | +| main.rs:792:21:792:31 | Implementor | main.rs:789:5:789:23 | struct Implementor | +| main.rs:794:13:794:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:799:10:799:15 | TraitB | main.rs:756:5:758:5 | trait TraitB | +| main.rs:799:21:799:31 | Implementor | main.rs:789:5:789:23 | struct Implementor | +| main.rs:801:13:801:19 | println | {EXTERNAL LOCATION} | MacroRules | +| main.rs:807:24:807:34 | Implementor | main.rs:789:5:789:23 | struct Implementor | +| main.rs:808:23:808:35 | GenericStruct | main.rs:760:5:763:5 | struct GenericStruct | +| main.rs:814:9:814:36 | GenericStruct::<...> | main.rs:760:5:763:5 | struct GenericStruct | +| main.rs:814:9:814:50 | ...::call_trait_a | main.rs:771:9:773:9 | fn call_trait_a | +| main.rs:814:25:814:35 | Implementor | main.rs:789:5:789:23 | struct Implementor | +| main.rs:817:9:817:36 | GenericStruct::<...> | main.rs:760:5:763:5 | struct GenericStruct | +| main.rs:817:9:817:47 | ...::call_both | main.rs:783:9:786:9 | fn call_both | +| main.rs:817:25:817:35 | Implementor | main.rs:789:5:789:23 | struct Implementor | +| main.rs:823:3:823:12 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:823:3:823:24 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | +| main.rs:827:6:827:12 | AStruct | main.rs:826:1:826:17 | struct AStruct | +| main.rs:829:7:829:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:829:7:829:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | +| main.rs:832:7:832:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:832:7:832:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | +| main.rs:837:9:837:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:837:9:837:19 | ...::marker | {EXTERNAL LOCATION} | mod marker | +| main.rs:837:9:837:32 | ...::PhantomData | {EXTERNAL LOCATION} | struct PhantomData | +| main.rs:838:9:838:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:838:9:838:19 | ...::result | {EXTERNAL LOCATION} | mod result | +| main.rs:838:9:838:27 | ...::Result | {EXTERNAL LOCATION} | enum Result | +| main.rs:846:19:846:22 | Self | main.rs:840:5:848:5 | trait Reduce | +| main.rs:846:19:846:29 | ...::Input | main.rs:841:9:841:19 | type Input | +| main.rs:847:14:847:46 | Result::<...> | {EXTERNAL LOCATION} | enum Result | +| main.rs:847:21:847:24 | Self | main.rs:840:5:848:5 | trait Reduce | +| main.rs:847:21:847:32 | ...::Output | main.rs:842:21:843:20 | type Output | +| main.rs:847:35:847:38 | Self | main.rs:840:5:848:5 | trait Reduce | +| main.rs:847:35:847:45 | ...::Error | main.rs:841:21:842:19 | type Error | +| main.rs:851:17:851:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData | +| main.rs:851:29:851:33 | Input | main.rs:850:19:850:23 | Input | +| main.rs:852:17:852:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData | +| main.rs:852:29:852:33 | Error | main.rs:850:26:850:30 | Error | +| main.rs:859:11:859:16 | Reduce | main.rs:840:5:848:5 | trait Reduce | +| main.rs:860:13:863:9 | MyImpl::<...> | main.rs:850:5:853:5 | struct MyImpl | +| main.rs:861:13:861:17 | Input | main.rs:857:13:857:17 | Input | +| main.rs:862:13:862:17 | Error | main.rs:858:13:858:17 | Error | +| main.rs:865:22:868:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | +| main.rs:866:13:866:17 | Input | main.rs:857:13:857:17 | Input | +| main.rs:867:13:867:16 | Self | main.rs:855:5:887:5 | impl Reduce for MyImpl::<...> { ... } | +| main.rs:867:13:867:23 | ...::Error | main.rs:869:11:873:9 | type Error | +| main.rs:870:22:872:9 | Option::<...> | {EXTERNAL LOCATION} | enum Option | +| main.rs:871:11:871:15 | Error | main.rs:858:13:858:17 | Error | +| main.rs:875:13:875:17 | Input | main.rs:857:13:857:17 | Input | +| main.rs:880:19:880:22 | Self | main.rs:855:5:887:5 | impl Reduce for MyImpl::<...> { ... } | +| main.rs:880:19:880:29 | ...::Input | main.rs:865:9:869:9 | type Input | +| main.rs:881:14:884:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | +| main.rs:882:13:882:16 | Self | main.rs:855:5:887:5 | impl Reduce for MyImpl::<...> { ... } | +| main.rs:882:13:882:24 | ...::Output | main.rs:873:11:876:9 | type Output | +| main.rs:883:13:883:16 | Self | main.rs:855:5:887:5 | impl Reduce for MyImpl::<...> { ... } | +| main.rs:883:13:883:23 | ...::Error | main.rs:869:11:873:9 | type Error | +| main.rs:895:16:895:20 | Super | main.rs:891:5:893:5 | trait Super | +| main.rs:897:19:897:22 | Self | main.rs:895:5:899:5 | trait Sub | +| main.rs:897:19:897:27 | ...::Out | main.rs:892:9:892:17 | type Out | +| main.rs:902:9:902:10 | ST | main.rs:901:14:901:15 | ST | +| main.rs:906:10:906:14 | Super | main.rs:891:5:893:5 | trait Super | +| main.rs:906:20:906:25 | S::<...> | main.rs:901:5:903:6 | struct S | +| main.rs:906:22:906:24 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:907:20:907:23 | char | {EXTERNAL LOCATION} | struct char | +| main.rs:912:10:912:14 | Super | main.rs:891:5:893:5 | trait Super | +| main.rs:912:20:912:26 | S::<...> | main.rs:901:5:903:6 | struct S | +| main.rs:912:22:912:25 | bool | {EXTERNAL LOCATION} | struct bool | +| main.rs:913:20:913:22 | i64 | {EXTERNAL LOCATION} | struct i64 | +| main.rs:918:10:918:12 | Sub | main.rs:895:5:899:5 | trait Sub | +| main.rs:918:18:918:23 | S::<...> | main.rs:901:5:903:6 | struct S | +| main.rs:918:20:918:22 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:919:19:919:22 | Self | main.rs:917:5:922:5 | impl Sub for S::<...> { ... } | +| main.rs:919:19:919:27 | ...::Out | main.rs:892:9:892:17 | type Out | +| main.rs:925:10:925:12 | Sub | main.rs:895:5:899:5 | trait Sub | +| main.rs:925:18:925:24 | S::<...> | main.rs:901:5:903:6 | struct S | +| main.rs:925:20:925:23 | bool | {EXTERNAL LOCATION} | struct bool | +| main.rs:926:19:926:22 | Self | main.rs:924:5:929:5 | impl Sub for S::<...> { ... } | +| main.rs:926:19:926:27 | ...::Out | main.rs:892:9:892:17 | type Out | +| main.rs:935:19:935:26 | SuperAlt | main.rs:931:5:933:5 | trait SuperAlt | +| main.rs:937:23:937:26 | Self | main.rs:935:5:939:5 | trait SubAlt | +| main.rs:937:23:937:31 | ...::Out | main.rs:932:9:932:17 | type Out | +| main.rs:942:13:942:20 | SuperAlt | main.rs:931:5:933:5 | trait SuperAlt | +| main.rs:942:26:942:29 | S::<...> | main.rs:901:5:903:6 | struct S | +| main.rs:942:28:942:28 | A | main.rs:942:10:942:10 | A | +| main.rs:943:20:943:20 | A | main.rs:942:10:942:10 | A | +| main.rs:948:13:948:18 | SubAlt | main.rs:935:5:939:5 | trait SubAlt | +| main.rs:948:24:948:27 | S::<...> | main.rs:901:5:903:6 | struct S | +| main.rs:948:26:948:26 | A | main.rs:948:10:948:10 | A | +| main.rs:949:23:949:26 | Self | main.rs:947:5:952:5 | impl SubAlt for S::<...> { ... } | +| main.rs:949:23:949:31 | ...::Out | main.rs:932:9:932:17 | type Out | +| main.rs:955:10:955:16 | S::<...> | main.rs:901:5:903:6 | struct S | +| main.rs:955:12:955:15 | bool | {EXTERNAL LOCATION} | struct bool | +| main.rs:957:21:957:37 | <...> | main.rs:891:5:893:5 | trait Super | +| main.rs:957:21:957:42 | ...::Out | main.rs:892:9:892:17 | type Out | +| main.rs:957:22:957:27 | S::<...> | main.rs:901:5:903:6 | struct S | +| main.rs:957:24:957:26 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:957:32:957:36 | Super | main.rs:891:5:893:5 | trait Super | +| main.rs:958:21:958:38 | <...> | main.rs:891:5:893:5 | trait Super | +| main.rs:958:21:958:43 | ...::Out | main.rs:892:9:892:17 | type Out | +| main.rs:958:22:958:28 | S::<...> | main.rs:901:5:903:6 | struct S | +| main.rs:958:24:958:27 | bool | {EXTERNAL LOCATION} | struct bool | +| main.rs:958:33:958:37 | Super | main.rs:891:5:893:5 | trait Super | +| main.rs:960:21:960:41 | <...> | main.rs:931:5:933:5 | trait SuperAlt | +| main.rs:960:21:960:46 | ...::Out | main.rs:932:9:932:17 | type Out | +| main.rs:960:22:960:28 | S::<...> | main.rs:901:5:903:6 | struct S | +| main.rs:960:24:960:27 | bool | {EXTERNAL LOCATION} | struct bool | +| main.rs:960:33:960:40 | SuperAlt | main.rs:931:5:933:5 | trait SuperAlt | +| main.rs:965:5:965:7 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:965:11:965:14 | self | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:967:15:967:17 | ztd | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:967:15:967:25 | ...::string | {EXTERNAL LOCATION} | mod string | +| main.rs:967:15:967:33 | ...::String | {EXTERNAL LOCATION} | struct String | +| main.rs:977:7:977:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:977:7:977:26 | ...::identity | proc_macro.rs:15:1:18:1 | fn identity | +| main.rs:978:10:978:15 | ATrait | main.rs:973:5:975:5 | trait ATrait | +| main.rs:978:21:978:23 | i64 | {EXTERNAL LOCATION} | struct i64 | +| main.rs:980:11:980:13 | i64 | {EXTERNAL LOCATION} | struct i64 | +| main.rs:986:17:986:19 | Foo | main.rs:971:5:971:15 | struct Foo | +| main.rs:992:22:992:32 | Option::<...> | {EXTERNAL LOCATION} | enum Option | +| main.rs:992:29:992:31 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:993:17:993:20 | Some | {EXTERNAL LOCATION} | Some | +| main.rs:994:17:994:27 | Option::<...> | {EXTERNAL LOCATION} | enum Option | +| main.rs:994:24:994:26 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:995:13:995:16 | Some | {EXTERNAL LOCATION} | Some | +| main.rs:996:17:996:20 | None | {EXTERNAL LOCATION} | None | +| main.rs:998:13:998:16 | None | {EXTERNAL LOCATION} | None | +| main.rs:999:17:999:20 | None | {EXTERNAL LOCATION} | None | +| main.rs:1008:19:1008:29 | Option::<...> | {EXTERNAL LOCATION} | enum Option | +| main.rs:1008:26:1008:28 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:1009:26:1009:29 | test | main.rs:991:5:1005:5 | fn test | +| main.rs:1015:14:1015:16 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:1020:17:1020:20 | Some | {EXTERNAL LOCATION} | Some | +| main.rs:1022:13:1022:16 | Some | {EXTERNAL LOCATION} | Some | +| main.rs:1027:13:1027:16 | Some | {EXTERNAL LOCATION} | Some | +| main.rs:1027:18:1027:18 | z | main.rs:1014:5:1016:12 | const z | +| main.rs:1027:24:1027:24 | z | main.rs:1014:5:1016:12 | const z | +| main.rs:1035:24:1035:26 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:1038:10:1038:20 | TupleStruct | main.rs:1035:5:1035:28 | struct TupleStruct | +| main.rs:1040:19:1040:21 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:1040:27:1040:30 | Self | main.rs:1035:5:1035:28 | struct TupleStruct | +| main.rs:1041:21:1041:24 | Self | main.rs:1035:5:1035:28 | struct TupleStruct | +| main.rs:1042:31:1042:34 | Self | main.rs:1035:5:1035:28 | struct TupleStruct | +| main.rs:1048:12:1048:14 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:1052:10:1052:21 | StructStruct | main.rs:1047:5:1049:5 | struct StructStruct | +| main.rs:1054:19:1054:21 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:1054:27:1054:30 | Self | main.rs:1047:5:1049:5 | struct StructStruct | +| main.rs:1055:13:1055:16 | Self | main.rs:1047:5:1049:5 | struct StructStruct | +| main.rs:1061:13:1061:15 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:1066:10:1066:15 | MyEnum | main.rs:1059:5:1063:5 | enum MyEnum | +| main.rs:1067:25:1067:27 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:1069:17:1069:20 | Self | main.rs:1065:5:1076:5 | impl MyEnum { ... } | +| main.rs:1069:17:1069:23 | ...::A | main.rs:1060:9:1062:9 | A | +| main.rs:1082:15:1082:15 | T | main.rs:1081:31:1081:31 | T | +| main.rs:1083:15:1083:31 | Option::<...> | {EXTERNAL LOCATION} | enum Option | +| main.rs:1083:22:1083:30 | Box::<...> | {EXTERNAL LOCATION} | struct Box | +| main.rs:1083:26:1083:29 | Self | main.rs:1081:5:1084:5 | struct NonEmptyListStruct | +| main.rs:1087:16:1087:16 | T | main.rs:1086:27:1086:27 | T | +| main.rs:1088:14:1088:14 | T | main.rs:1086:27:1086:27 | T | +| main.rs:1088:17:1088:25 | Box::<...> | {EXTERNAL LOCATION} | struct Box | +| main.rs:1088:21:1088:24 | Self | main.rs:1086:5:1089:5 | enum NonEmptyListEnum | +| main.rs:1092:10:1092:30 | NonEmptyListEnum::<...> | main.rs:1086:5:1089:5 | enum NonEmptyListEnum | +| main.rs:1092:27:1092:29 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:1093:30:1093:32 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:1093:38:1093:41 | Self | main.rs:1086:5:1089:5 | enum NonEmptyListEnum | +| main.rs:1094:17:1094:32 | NonEmptyListEnum | main.rs:1086:5:1089:5 | enum NonEmptyListEnum | +| main.rs:1095:13:1095:16 | Self | main.rs:1091:5:1097:5 | impl NonEmptyListEnum::<...> { ... } | +| main.rs:1095:13:1095:24 | ...::Single | main.rs:1087:9:1087:17 | Single | +| main.rs:1103:13:1103:16 | Copy | {EXTERNAL LOCATION} | trait Copy | +| main.rs:1105:17:1105:17 | T | main.rs:1102:9:1102:9 | T | +| main.rs:1106:16:1106:16 | T | main.rs:1102:9:1102:9 | T | +| main.rs:1106:23:1106:26 | Self | main.rs:1099:5:1107:5 | union NonEmptyListUnion | +| main.rs:1112:9:1112:13 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) | +| main.rs:1112:9:1112:27 | ...::const_static | main.rs:1110:1:1154:1 | mod const_static | +| main.rs:1114:27:1114:29 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:1116:29:1116:31 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:1119:17:1119:26 | CONST_ITEM | main.rs:1114:5:1114:35 | const CONST_ITEM | +| main.rs:1120:17:1120:27 | STATIC_ITEM | main.rs:1116:5:1116:37 | static STATIC_ITEM | +| main.rs:1121:17:1121:28 | const_static | main.rs:1110:1:1154:1 | mod const_static | +| main.rs:1121:17:1121:40 | ...::CONST_ITEM | main.rs:1114:5:1114:35 | const CONST_ITEM | +| main.rs:1122:17:1122:28 | const_static | main.rs:1110:1:1154:1 | mod const_static | +| main.rs:1122:17:1122:41 | ...::STATIC_ITEM | main.rs:1116:5:1116:37 | static STATIC_ITEM | +| main.rs:1123:17:1123:27 | CONST_ALIAS | main.rs:1126:9:1127:13 | const CONST_ALIAS | +| main.rs:1124:17:1124:28 | STATIC_ALIAS | main.rs:1127:15:1129:13 | static STATIC_ALIAS | +| main.rs:1126:28:1126:30 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:1126:34:1126:43 | CONST_ITEM | main.rs:1114:5:1114:35 | const CONST_ITEM | +| main.rs:1128:30:1128:32 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:1128:36:1128:46 | STATIC_ITEM | main.rs:1116:5:1116:37 | static STATIC_ITEM | +| main.rs:1131:17:1131:27 | CONST_ALIAS | main.rs:1126:9:1127:13 | const CONST_ALIAS | +| main.rs:1132:17:1132:28 | STATIC_ALIAS | main.rs:1127:15:1129:13 | static STATIC_ALIAS | +| main.rs:1135:32:1135:34 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:1135:38:1135:47 | CONST_ITEM | main.rs:1114:5:1114:35 | const CONST_ITEM | +| main.rs:1137:34:1137:36 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:1137:40:1137:50 | STATIC_ITEM | main.rs:1116:5:1116:37 | static STATIC_ITEM | +| main.rs:1140:21:1140:31 | CONST_ALIAS | main.rs:1135:13:1136:17 | const CONST_ALIAS | +| main.rs:1141:21:1141:32 | STATIC_ALIAS | main.rs:1136:19:1138:17 | static STATIC_ALIAS | +| main.rs:1145:32:1145:34 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:1145:38:1145:47 | CONST_ITEM | main.rs:1114:5:1114:35 | const CONST_ITEM | +| main.rs:1147:34:1147:36 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:1147:40:1147:50 | STATIC_ITEM | main.rs:1116:5:1116:37 | static STATIC_ITEM | +| main.rs:1150:21:1150:31 | CONST_ALIAS | main.rs:1145:13:1146:17 | const CONST_ALIAS | +| main.rs:1151:21:1151:32 | STATIC_ALIAS | main.rs:1146:19:1148:17 | static STATIC_ALIAS | +| main.rs:1157:5:1157:6 | my | main.rs:1:1:1:7 | mod my | +| main.rs:1157:5:1157:14 | ...::nested | my.rs:1:1:1:15 | mod nested | +| main.rs:1157:5:1157:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 | +| main.rs:1157:5:1157:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 | +| main.rs:1157:5:1157:35 | ...::f | my/nested.rs:3:9:5:9 | fn f | +| main.rs:1158:5:1158:6 | my | main.rs:1:1:1:7 | mod my | +| main.rs:1158:5:1158:9 | ...::f | my.rs:5:1:7:1 | fn f | +| main.rs:1159:5:1159:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | +| main.rs:1159:5:1159:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | +| main.rs:1159:5:1159:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | +| main.rs:1159:5:1159:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:1160:5:1160:5 | f | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:1161:5:1161:5 | g | my2/nested2.rs:7:9:9:9 | fn g | +| main.rs:1162:5:1162:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) | +| main.rs:1162:5:1162:12 | ...::h | main.rs:57:1:76:1 | fn h | +| main.rs:1163:5:1163:6 | m1 | main.rs:20:1:44:1 | mod m1 | +| main.rs:1163:5:1163:10 | ...::m2 | main.rs:25:5:43:5 | mod m2 | +| main.rs:1163:5:1163:13 | ...::g | main.rs:30:9:34:9 | fn g | +| main.rs:1164:5:1164:6 | m1 | main.rs:20:1:44:1 | mod m1 | +| main.rs:1164:5:1164:10 | ...::m2 | main.rs:25:5:43:5 | mod m2 | +| main.rs:1164:5:1164:14 | ...::m3 | main.rs:36:9:42:9 | mod m3 | +| main.rs:1164:5:1164:17 | ...::h | main.rs:37:27:41:13 | fn h | +| main.rs:1165:5:1165:6 | m4 | main.rs:46:1:53:1 | mod m4 | +| main.rs:1165:5:1165:9 | ...::i | main.rs:49:5:52:5 | fn i | +| main.rs:1166:5:1166:5 | h | main.rs:57:1:76:1 | fn h | +| main.rs:1167:5:1167:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:1168:5:1168:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g | +| main.rs:1169:5:1169:5 | j | main.rs:104:1:108:1 | fn j | +| main.rs:1170:5:1170:6 | m6 | main.rs:116:1:128:1 | mod m6 | +| main.rs:1170:5:1170:9 | ...::g | main.rs:121:5:127:5 | fn g | +| main.rs:1171:5:1171:6 | m7 | main.rs:130:1:149:1 | mod m7 | +| main.rs:1171:5:1171:9 | ...::f | main.rs:141:5:148:5 | fn f | +| main.rs:1172:5:1172:6 | m8 | main.rs:151:1:205:1 | mod m8 | +| main.rs:1172:5:1172:9 | ...::g | main.rs:189:5:204:5 | fn g | +| main.rs:1173:5:1173:6 | m9 | main.rs:207:1:215:1 | mod m9 | +| main.rs:1173:5:1173:9 | ...::f | main.rs:210:5:214:5 | fn f | +| main.rs:1174:5:1174:7 | m11 | main.rs:238:1:275:1 | mod m11 | +| main.rs:1174:5:1174:10 | ...::f | main.rs:243:5:246:5 | fn f | +| main.rs:1175:5:1175:7 | m15 | main.rs:306:1:375:1 | mod m15 | +| main.rs:1175:5:1175:10 | ...::f | main.rs:362:5:374:5 | fn f | +| main.rs:1176:5:1176:7 | m16 | main.rs:377:1:575:1 | mod m16 | +| main.rs:1176:5:1176:10 | ...::f | main.rs:447:5:471:5 | fn f | +| main.rs:1177:5:1177:20 | trait_visibility | main.rs:577:1:634:1 | mod trait_visibility | +| main.rs:1177:5:1177:23 | ...::f | main.rs:604:5:633:5 | fn f | +| main.rs:1178:5:1178:7 | m17 | main.rs:636:1:666:1 | mod m17 | +| main.rs:1178:5:1178:10 | ...::f | main.rs:660:5:665:5 | fn f | +| main.rs:1179:5:1179:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 | +| main.rs:1179:5:1179:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f | +| main.rs:1180:5:1180:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 | +| main.rs:1180:5:1180:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f | +| main.rs:1181:5:1181:7 | my3 | my2/mod.rs:20:1:20:12 | mod my3 | +| main.rs:1181:5:1181:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f | +| main.rs:1182:5:1182:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | +| main.rs:1183:5:1183:12 | my_alias | main.rs:1:1:1:7 | mod my | +| main.rs:1183:5:1183:22 | ...::nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | +| main.rs:1184:5:1184:7 | m18 | main.rs:668:1:686:1 | mod m18 | +| main.rs:1184:5:1184:12 | ...::m19 | main.rs:673:5:685:5 | mod m19 | +| main.rs:1184:5:1184:17 | ...::m20 | main.rs:678:9:684:9 | mod m20 | +| main.rs:1184:5:1184:20 | ...::g | main.rs:679:13:683:13 | fn g | +| main.rs:1185:5:1185:7 | m23 | main.rs:724:1:749:1 | mod m23 | +| main.rs:1185:5:1185:10 | ...::f | main.rs:744:5:748:5 | fn f | +| main.rs:1186:5:1186:7 | m24 | main.rs:751:1:819:1 | mod m24 | +| main.rs:1186:5:1186:10 | ...::f | main.rs:805:5:818:5 | fn f | +| main.rs:1187:5:1187:8 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) | +| main.rs:1187:5:1187:11 | ...::h | main.rs:57:1:76:1 | fn h | +| main.rs:1188:5:1188:13 | z_changed | main.rs:824:1:824:9 | fn z_changed | +| main.rs:1189:5:1189:11 | AStruct | main.rs:826:1:826:17 | struct AStruct | +| main.rs:1189:5:1189:22 | ...::z_on_type | main.rs:830:5:830:17 | fn z_on_type | +| main.rs:1190:5:1190:11 | AStruct | main.rs:826:1:826:17 | struct AStruct | +| main.rs:1191:5:1191:29 | impl_with_attribute_macro | main.rs:969:1:988:1 | mod impl_with_attribute_macro | +| main.rs:1191:5:1191:35 | ...::test | main.rs:984:5:987:5 | fn test | +| main.rs:1192:5:1192:12 | patterns | main.rs:990:1:1031:1 | mod patterns | +| main.rs:1192:5:1192:18 | ...::test | main.rs:991:5:1005:5 | fn test | | my2/mod.rs:4:5:4:11 | println | {EXTERNAL LOCATION} | MacroRules | | 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 | @@ -711,7 +721,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:57:1:76:1 | fn h | | 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:1184:2 | SourceFile | +| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:1193:2 | SourceFile | | my2/my3/mod.rs:7:5:7:19 | ...::h | main.rs:57:1:76:1 | fn h | | 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 | From 1c36485ea97bec92d492f9d3bc9a9108513963a9 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Mon, 7 Sep 2026 10:25:15 +0200 Subject: [PATCH 0723/2098] Rust: Fix path resolution for `m::{self}` paths where `m` is a trait --- rust/ql/lib/codeql/rust/internal/PathResolution.qll | 2 +- rust/ql/test/library-tests/path-resolution/invalid/main.rs | 2 +- rust/ql/test/library-tests/path-resolution/main.rs | 4 ++-- .../library-tests/path-resolution/path-resolution.expected | 5 +++-- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index f62262f7423f..01c31107ba2d 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -427,7 +427,7 @@ abstract class ItemNode extends Locatable { if this instanceof Module or this instanceof Enum or - this instanceof Struct or + this instanceof Trait or this instanceof Crate then ( kind.isBoth() and diff --git a/rust/ql/test/library-tests/path-resolution/invalid/main.rs b/rust/ql/test/library-tests/path-resolution/invalid/main.rs index 8e22756b060c..08918a9b60e1 100644 --- a/rust/ql/test/library-tests/path-resolution/invalid/main.rs +++ b/rust/ql/test/library-tests/path-resolution/invalid/main.rs @@ -13,6 +13,6 @@ mod self_import_from_struct { #[rustfmt::skip] use self::MyStruct::{ // $ item=Struct - self // $ SPURIOUS: item=Struct + self // $ SPURIOUS: item=self_import_from_struct }; } diff --git a/rust/ql/test/library-tests/path-resolution/main.rs b/rust/ql/test/library-tests/path-resolution/main.rs index 2af5301b29f3..781641e98ce0 100644 --- a/rust/ql/test/library-tests/path-resolution/main.rs +++ b/rust/ql/test/library-tests/path-resolution/main.rs @@ -705,7 +705,7 @@ mod self_imports { #[rustfmt::skip] use super::definitions::MyTrait::{ // $ item=I105 - self // $ MISSING: item=I105 SPURIOUS: item=definitions + self // $ item=I105 }; #[rustfmt::skip] @@ -714,7 +714,7 @@ mod self_imports { }; #[rustfmt::skip] - fn f() { // $ MISSING: item=I105 + fn f() { // $ item=I105 my_module::f(); // $ item=I107 let _ = MyEnum::A; // $ item=I108 } 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 1bab8b3b2eaf..9df115b9bdb1 100644 --- a/rust/ql/test/library-tests/path-resolution/path-resolution.expected +++ b/rust/ql/test/library-tests/path-resolution/path-resolution.expected @@ -57,7 +57,7 @@ resolvePath | invalid/main.rs:6:9:6:9 | A | invalid/main.rs:3:11:4:9 | struct A | | invalid/main.rs:15:9:15:12 | self | invalid/main.rs:8:1:18:1 | mod self_import_from_struct | | invalid/main.rs:15:9:15:22 | ...::MyStruct | invalid/main.rs:12:5:12:20 | struct MyStruct | -| invalid/main.rs:16:9:16:12 | self | invalid/main.rs:12:5:12:20 | struct MyStruct | +| invalid/main.rs:16:9:16:12 | self | invalid/main.rs:8:1:18:1 | mod self_import_from_struct | | main.rs:4:8:4:9 | my | main.rs:1:1:1:7 | mod my | | main.rs:4:14:4:17 | self | main.rs:1:1:1:7 | mod my | | main.rs:6:5:6:6 | my | main.rs:1:1:1:7 | mod my | @@ -397,11 +397,12 @@ resolvePath | main.rs:707:13:707:17 | super | main.rs:688:1:722:1 | mod self_imports | | main.rs:707:13:707:30 | ...::definitions | main.rs:690:5:698:5 | mod definitions | | main.rs:707:13:707:39 | ...::MyTrait | main.rs:693:11:694:28 | trait MyTrait | -| main.rs:708:13:708:16 | self | main.rs:690:5:698:5 | mod definitions | +| main.rs:708:13:708:16 | self | main.rs:693:11:694:28 | trait MyTrait | | main.rs:712:13:712:17 | super | main.rs:688:1:722:1 | mod self_imports | | main.rs:712:13:712:30 | ...::definitions | main.rs:690:5:698:5 | mod definitions | | main.rs:712:13:712:38 | ...::MyEnum | main.rs:694:30:697:9 | enum MyEnum | | main.rs:713:13:713:16 | self | main.rs:694:30:697:9 | enum MyEnum | +| main.rs:717:17:717:23 | MyTrait | main.rs:693:11:694:28 | trait MyTrait | | main.rs:718:13:718:21 | my_module | main.rs:691:9:693:9 | mod my_module | | main.rs:718:13:718:24 | ...::f | main.rs:692:13:692:25 | fn f | | main.rs:719:21:719:26 | MyEnum | main.rs:694:30:697:9 | enum MyEnum | From c9198ea3814715f3dfd7c215f95e82bd77dc6703 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Mon, 7 Sep 2026 11:10:28 +0200 Subject: [PATCH 0724/2098] Rust: Add change note --- rust/ql/lib/change-notes/2026-09-07-self-path-trait.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 rust/ql/lib/change-notes/2026-09-07-self-path-trait.md diff --git a/rust/ql/lib/change-notes/2026-09-07-self-path-trait.md b/rust/ql/lib/change-notes/2026-09-07-self-path-trait.md new file mode 100644 index 000000000000..ff7b0f2d350d --- /dev/null +++ b/rust/ql/lib/change-notes/2026-09-07-self-path-trait.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Fix path resolution for `m::{self}` paths where `m` is a trait. \ No newline at end of file From b3b559eb1d60b1fba5fe8cb411db81a202f49fa6 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Mon, 7 Sep 2026 11:05:56 +0200 Subject: [PATCH 0725/2098] Yeast: Keep AST iteration order as in ast_types.yml. --- shared/yeast-schema/src/schema.rs | 13 ++++++++- shared/yeast/src/lib.rs | 44 ++++++++++++++++++++++--------- 2 files changed, 44 insertions(+), 13 deletions(-) diff --git a/shared/yeast-schema/src/schema.rs b/shared/yeast-schema/src/schema.rs index 0675d8913422..6f5d3fe7d0a1 100644 --- a/shared/yeast-schema/src/schema.rs +++ b/shared/yeast-schema/src/schema.rs @@ -47,7 +47,7 @@ pub struct Schema { /// Per-node-kind declared field order (named fields only), as written in /// the source node-types YAML. Field ids are not a stable ordering key /// across front-ends, so this preserves the authored order for - /// presentation (see the AST dump). + /// presentation (see the AST dump) and tree traversal during extraction. field_order: BTreeMap>, } @@ -193,6 +193,17 @@ impl Schema { for name in other.field_ids.keys() { self.register_field(name); } + for (kind, order) in &other.field_order { + let order = order + .iter() + .filter_map(|&field_id| { + other + .field_name_for_id(field_id) + .map(|name| self.register_field(name)) + }) + .collect(); + self.set_field_order(kind, order); + } } /// Track a name for a kind ID without registering it as named or diff --git a/shared/yeast/src/lib.rs b/shared/yeast/src/lib.rs index 94f75faa4763..32e6889ee5a2 100644 --- a/shared/yeast/src/lib.rs +++ b/shared/yeast/src/lib.rs @@ -323,7 +323,7 @@ impl<'a> AstCursor<'a> { fn goto_first_child_opt(&mut self) -> Option<()> { let parent_id = self.node_id; let parent = self.ast.get_node(parent_id)?; - let mut children = ChildrenIter::new(parent); + let mut children = ChildrenIter::new(self.ast, parent); let first_child = children.next()?; self.node_id = first_child; self.parents.push((parent_id, children)); @@ -340,15 +340,35 @@ impl<'a> AstCursor<'a> { #[derive(Debug)] struct ChildrenIter<'a> { current_field: Option, - fields: std::collections::btree_map::Iter<'a, FieldId, Vec>, + fields: &'a BTreeMap>, + field_order: std::vec::IntoIter, field_children: Option>, } impl<'a> ChildrenIter<'a> { - fn new(node: &'a Node) -> Self { + fn new(ast: &'a Ast, node: &'a Node) -> Self { + let fields = &node.fields; + let present: Vec = fields.keys().copied().collect(); + let field_order = match ast.schema.field_order(node.kind_name()) { + Some(order) => { + let mut fields: Vec = order + .iter() + .copied() + .filter(|field| fields.contains_key(field)) + .collect(); + for field in present { + if !fields.contains(&field) { + fields.push(field); + } + } + fields.into_iter() + } + None => present.into_iter(), + }; Self { current_field: None, - fields: node.fields.iter(), + fields, + field_order, field_children: None, } } @@ -363,20 +383,20 @@ impl Iterator for ChildrenIter<'_> { fn next(&mut self) -> Option { match self.field_children.as_mut() { - None => match self.fields.next() { - Some((field, children)) => { - self.current_field = Some(*field); - self.field_children = Some(children.iter()); + None => match self.field_order.next() { + Some(field) => { + self.current_field = Some(field); + self.field_children = Some(self.fields[&field].iter()); self.next() } None => None, }, Some(children) => match children.next() { - None => match self.fields.next() { + None => match self.field_order.next() { None => None, - Some((field, children)) => { - self.current_field = Some(*field); - self.field_children = Some(children.iter()); + Some(field) => { + self.current_field = Some(field); + self.field_children = Some(self.fields[&field].iter()); self.next() } }, From 796790df501e11850c6e55a761a06e67b38066f7 Mon Sep 17 00:00:00 2001 From: Anders Fugmann Date: Wed, 26 Aug 2026 12:42:19 +0200 Subject: [PATCH 0726/2098] Kotlin: add 2.4.20-RC artifacts Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- MODULE.bazel | 3 +++ java/kotlin-extractor/deps/kotlin-compiler-2.4.20-RC.jar | 3 +++ .../deps/kotlin-compiler-embeddable-2.4.20-RC.jar | 3 +++ java/kotlin-extractor/deps/kotlin-stdlib-2.4.20-RC.jar | 3 +++ 4 files changed, 12 insertions(+) create mode 100644 java/kotlin-extractor/deps/kotlin-compiler-2.4.20-RC.jar create mode 100644 java/kotlin-extractor/deps/kotlin-compiler-embeddable-2.4.20-RC.jar create mode 100644 java/kotlin-extractor/deps/kotlin-stdlib-2.4.20-RC.jar diff --git a/MODULE.bazel b/MODULE.bazel index 93fcde1bfd7f..811d397f6359 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -278,6 +278,7 @@ use_repo( "kotlin-compiler-2.3.0", "kotlin-compiler-2.3.20", "kotlin-compiler-2.4.0", + "kotlin-compiler-2.4.20-RC", "kotlin-compiler-embeddable-1.8.0", "kotlin-compiler-embeddable-1.9.0-Beta", "kotlin-compiler-embeddable-1.9.20-Beta", @@ -290,6 +291,7 @@ use_repo( "kotlin-compiler-embeddable-2.3.0", "kotlin-compiler-embeddable-2.3.20", "kotlin-compiler-embeddable-2.4.0", + "kotlin-compiler-embeddable-2.4.20-RC", "kotlin-stdlib-1.8.0", "kotlin-stdlib-1.9.0-Beta", "kotlin-stdlib-1.9.20-Beta", @@ -302,6 +304,7 @@ use_repo( "kotlin-stdlib-2.3.0", "kotlin-stdlib-2.3.20", "kotlin-stdlib-2.4.0", + "kotlin-stdlib-2.4.20-RC", ) go_sdk = use_extension("@rules_go//go:extensions.bzl", "go_sdk") diff --git a/java/kotlin-extractor/deps/kotlin-compiler-2.4.20-RC.jar b/java/kotlin-extractor/deps/kotlin-compiler-2.4.20-RC.jar new file mode 100644 index 000000000000..8e5a4c945250 --- /dev/null +++ b/java/kotlin-extractor/deps/kotlin-compiler-2.4.20-RC.jar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5e2e10f209ef5a63ed70d04ab5c64a8cf346c323f356eb4241ce34ee03cf2e53 +size 60184229 diff --git a/java/kotlin-extractor/deps/kotlin-compiler-embeddable-2.4.20-RC.jar b/java/kotlin-extractor/deps/kotlin-compiler-embeddable-2.4.20-RC.jar new file mode 100644 index 000000000000..4a7601447f96 --- /dev/null +++ b/java/kotlin-extractor/deps/kotlin-compiler-embeddable-2.4.20-RC.jar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fac41bf816409462e189b41b87c4a8dfb48b995b4d8d6271968d4f638ceab255 +size 58593000 diff --git a/java/kotlin-extractor/deps/kotlin-stdlib-2.4.20-RC.jar b/java/kotlin-extractor/deps/kotlin-stdlib-2.4.20-RC.jar new file mode 100644 index 000000000000..2fb1da42a55a --- /dev/null +++ b/java/kotlin-extractor/deps/kotlin-stdlib-2.4.20-RC.jar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:540bee6d6310863014877cb4df8f087c256b22d0925955d1d20943d706bba524 +size 1853317 From ea75176a87b3a45d28a962daa0809bcdc54fb6f8 Mon Sep 17 00:00:00 2001 From: Anders Fugmann Date: Wed, 26 Aug 2026 12:42:19 +0200 Subject: [PATCH 0727/2098] Kotlin: address KT-85816 Kotlin 2.4.20-RC removes the remaining ComponentRegistrar API under KT-85816. Use an RC-specific registrar that only implements CompilerPluginRegistrar, and package the legacy ComponentRegistrar service only for older compilers. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- java/kotlin-extractor/BUILD.bazel | 31 ++++++++++++++++-- .../v_2_4_20-RC/Kotlin2ComponentRegistrar.kt | 32 +++++++++++++++++++ 2 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_4_20-RC/Kotlin2ComponentRegistrar.kt diff --git a/java/kotlin-extractor/BUILD.bazel b/java/kotlin-extractor/BUILD.bazel index f33949f83914..1b9501e7c142 100644 --- a/java/kotlin-extractor/BUILD.bazel +++ b/java/kotlin-extractor/BUILD.bazel @@ -57,6 +57,10 @@ _compiler_plugin_registrar_service_source = "src/main/resources/META-INF/service _compiler_plugin_registrar_service_target = "META-INF/services/org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar" +_component_registrar_service_source = "src/main/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar" + +_component_registrar_service_target = "META-INF/services/org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar" + py_binary( name = "generate_dbscheme", srcs = ["generate_dbscheme.py"], @@ -68,7 +72,10 @@ _resources = [ r[len("src/main/resources/"):], ) for r in glob(["src/main/resources/**"]) - if r != _compiler_plugin_registrar_service_source + if r not in ( + _compiler_plugin_registrar_service_source, + _component_registrar_service_source, + ) ] _compiler_plugin_registrar_service = ( @@ -76,6 +83,11 @@ _compiler_plugin_registrar_service = ( _compiler_plugin_registrar_service_target, ) +_component_registrar_service = ( + _component_registrar_service_source, + _component_registrar_service_target, +) + kt_javac_options( name = "javac-options", release = "8", @@ -93,7 +105,9 @@ kt_javac_options( "kotlin.RequiresOptIn", "org.jetbrains.kotlin.ir.symbols.%s" % ("IrSymbolInternals" if version_less(v, "2.0.0") else "UnsafeDuringIrConstructionAPI"), - ] + ([] if version_less(v, "2.2.20") else ["org.jetbrains.kotlin.DeprecatedForRemovalCompilerApi"]), + ] + ( + [] if version_less(v, "2.2.20") else ["org.jetbrains.kotlin.DeprecatedForRemovalCompilerApi"] + ), x_suppress_version_warnings = True, ), # * extractor.name is different for each version, so we need to put it in different output dirs @@ -103,6 +117,8 @@ kt_javac_options( name = "resources-%s" % v, srcs = [src for src, _ in _resources] + ( [_compiler_plugin_registrar_service[0]] if not version_less(v, "2.4.0") else [] + ) + ( + [_component_registrar_service[0]] if version_less(v, "2.4.20") else [] ), outs = [ "%s/com/github/codeql/extractor.name" % v, @@ -114,6 +130,11 @@ kt_javac_options( v, _compiler_plugin_registrar_service[1], )] if not version_less(v, "2.4.0") else [] + ) + ( + ["%s/%s" % ( + v, + _component_registrar_service[1], + )] if version_less(v, "2.4.20") else [] ), cmd = "\n".join([ "echo %s-%s > $(RULEDIR)/%s/com/github/codeql/extractor.name" % (_extractor_name_prefix, v, v), @@ -126,6 +147,12 @@ kt_javac_options( v, _compiler_plugin_registrar_service[1], )] if not version_less(v, "2.4.0") else [] + ) + ( + ["cp $(execpath %s) $(RULEDIR)/%s/%s" % ( + _component_registrar_service[0], + v, + _component_registrar_service[1], + )] if version_less(v, "2.4.20") else [] )), ), kt_jvm_library( diff --git a/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_4_20-RC/Kotlin2ComponentRegistrar.kt b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_4_20-RC/Kotlin2ComponentRegistrar.kt new file mode 100644 index 000000000000..f5091752633c --- /dev/null +++ b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_4_20-RC/Kotlin2ComponentRegistrar.kt @@ -0,0 +1,32 @@ +package com.github.codeql + +import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension +import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar +import org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi +import org.jetbrains.kotlin.config.CompilerConfiguration + +@OptIn(ExperimentalCompilerApi::class) +abstract class Kotlin2ComponentRegistrar : CompilerPluginRegistrar() { + override val supportsK2: Boolean + get() = true + + override val pluginId: String + get() = "kotlin-extractor" + + private var extensionStorage: CompilerPluginRegistrar.ExtensionStorage? = null + + override fun ExtensionStorage.registerExtensions(configuration: CompilerConfiguration) { + this@Kotlin2ComponentRegistrar.extensionStorage = this + doRegisterExtensions(configuration) + } + + abstract fun doRegisterExtensions(configuration: CompilerConfiguration) + + protected fun registerExtractorExtension(extension: IrGenerationExtension) { + val storage = extensionStorage + ?: throw IllegalStateException("registerExtractorExtension called before registerExtensions") + with(storage) { + IrGenerationExtension.registerExtension(extension) + } + } +} From b891c6a8379669a5242a5a5112e5e8031fb9a810 Mon Sep 17 00:00:00 2001 From: Anders Fugmann Date: Wed, 26 Aug 2026 12:42:31 +0200 Subject: [PATCH 0728/2098] Kotlin: address KT-86046 Kotlin 2.4.20-RC marks public K1 APIs with K1Deprecation under KT-86046 and rejects the previous repeatable-annotation IR access path. Opt in to K1Deprecation for 2.4.20 and later, and use the existing annotationClass compatibility extension. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- java/kotlin-extractor/BUILD.bazel | 2 ++ java/kotlin-extractor/src/main/kotlin/MetaAnnotationSupport.kt | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/java/kotlin-extractor/BUILD.bazel b/java/kotlin-extractor/BUILD.bazel index 1b9501e7c142..fae93f6a2cc4 100644 --- a/java/kotlin-extractor/BUILD.bazel +++ b/java/kotlin-extractor/BUILD.bazel @@ -107,6 +107,8 @@ kt_javac_options( ("IrSymbolInternals" if version_less(v, "2.0.0") else "UnsafeDuringIrConstructionAPI"), ] + ( [] if version_less(v, "2.2.20") else ["org.jetbrains.kotlin.DeprecatedForRemovalCompilerApi"] + ) + ( + [] if version_less(v, "2.4.20") else ["org.jetbrains.kotlin.K1Deprecation"] ), x_suppress_version_warnings = True, ), diff --git a/java/kotlin-extractor/src/main/kotlin/MetaAnnotationSupport.kt b/java/kotlin-extractor/src/main/kotlin/MetaAnnotationSupport.kt index e215b5ca31da..d5650389448d 100644 --- a/java/kotlin-extractor/src/main/kotlin/MetaAnnotationSupport.kt +++ b/java/kotlin-extractor/src/main/kotlin/MetaAnnotationSupport.kt @@ -96,8 +96,7 @@ class MetaAnnotationSupport( val metaAnnotations = annotationClass.annotations val jvmRepeatable = metaAnnotations.find { - it.symbol.owner.parentAsClass.fqNameWhenAvailable == - JvmAnnotationNames.REPEATABLE_ANNOTATION + it.annotationClass.fqNameWhenAvailable == JvmAnnotationNames.REPEATABLE_ANNOTATION } return if (jvmRepeatable != null) { ((jvmRepeatable.codeQlGetValueArgument(0) as? IrClassReference)?.symbol as? IrClassSymbol) From 78caf2f488f668a89e41886a60dcbfe6ab987a64 Mon Sep 17 00:00:00 2001 From: Anders Fugmann Date: Wed, 26 Aug 2026 12:42:32 +0200 Subject: [PATCH 0729/2098] Kotlin: preserve generated forwarder locations Kotlin 2.4.20-RC assigns synthetic source offsets to generated interface forwarders. Use the enclosing class location for each fabricated forwarder and its generated body and accesses, preserving existing database and query output. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../src/main/kotlin/KotlinFileExtractor.kt | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/java/kotlin-extractor/src/main/kotlin/KotlinFileExtractor.kt b/java/kotlin-extractor/src/main/kotlin/KotlinFileExtractor.kt index 0b975d9b829b..bef2b554d7ec 100644 --- a/java/kotlin-extractor/src/main/kotlin/KotlinFileExtractor.kt +++ b/java/kotlin-extractor/src/main/kotlin/KotlinFileExtractor.kt @@ -1645,8 +1645,9 @@ open class KotlinFileExtractor( extractMethodAndParameterTypeAccesses: Boolean, typeSubstitution: TypeSubstitution?, classTypeArgsIncludingOuterClasses: List? - ) : Label = - forceExtractFunction( + ) : Label { + val sourceLoc = tw.getLocation(f.parentClassOrNull ?: f) + return forceExtractFunction( f, parentId, extractBody = false, @@ -1656,6 +1657,7 @@ open class KotlinFileExtractor( classTypeArgsIncludingOuterClasses, overriddenAttributes = OverriddenFunctionAttributes( + sourceLoc = sourceLoc, visibility = DescriptorVisibilities.PUBLIC, modality = Modality.OPEN ) @@ -1666,7 +1668,6 @@ open class KotlinFileExtractor( CompilerGeneratedKinds.INTERFACE_FORWARDER.kind ) if (extractBody) { - val realFunctionLocId = tw.getLocation(f) val inheritedDefaultFunction = f.realOverrideTarget val directlyInheritedSymbol = when (f) { @@ -1686,10 +1687,10 @@ open class KotlinFileExtractor( (directlyInheritedSymbol.owner.parentClassOrNull ?: return functionId) .typeWith() - extractExpressionBody(functionId, realFunctionLocId).also { returnId -> + extractExpressionBody(functionId, sourceLoc).also { returnId -> extractRawMethodAccess( f, - realFunctionLocId, + sourceLoc, f.returnType, functionId, returnId, @@ -1702,7 +1703,7 @@ open class KotlinFileExtractor( extractVariableAccess( syntheticParamId, param.type, - realFunctionLocId, + sourceLoc, argParentId, idxOffset + idx, functionId, @@ -1718,7 +1719,7 @@ open class KotlinFileExtractor( callId, -1, returnId, - realFunctionLocId + sourceLoc ) }, null @@ -1726,6 +1727,7 @@ open class KotlinFileExtractor( } } } + } private fun extractFunction( f: IrFunction, From 0e0b862029cc0401ffcfea3c25b0d6f6d0fa6fbc Mon Sep 17 00:00:00 2001 From: Anders Fugmann Date: Wed, 26 Aug 2026 12:42:32 +0200 Subject: [PATCH 0730/2098] Kotlin: enable 2.4.20-RC support Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- java/kotlin-extractor/versions.bzl | 1 + .../diagnostics/kotlin-version-too-new/diagnostics.expected | 2 +- .../fake-kotlinc-source/kotlin/KotlinVersion.java | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/java/kotlin-extractor/versions.bzl b/java/kotlin-extractor/versions.bzl index f9642c96b788..f31d69b2a226 100644 --- a/java/kotlin-extractor/versions.bzl +++ b/java/kotlin-extractor/versions.bzl @@ -12,6 +12,7 @@ VERSIONS = [ "2.3.0", "2.3.20", "2.4.0", + "2.4.20-RC", ] def _version_to_tuple(v): diff --git a/java/ql/integration-tests/kotlin/all-platforms/diagnostics/kotlin-version-too-new/diagnostics.expected b/java/ql/integration-tests/kotlin/all-platforms/diagnostics/kotlin-version-too-new/diagnostics.expected index 09429027c5d6..613709bfb152 100644 --- a/java/ql/integration-tests/kotlin/all-platforms/diagnostics/kotlin-version-too-new/diagnostics.expected +++ b/java/ql/integration-tests/kotlin/all-platforms/diagnostics/kotlin-version-too-new/diagnostics.expected @@ -1,5 +1,5 @@ { - "markdownMessage": "The Kotlin version installed (`999.999.999`) is too recent for this version of CodeQL. Install a version lower than 2.4.20.", + "markdownMessage": "The Kotlin version installed (`2.4.20`) is too recent for this version of CodeQL. Install a version lower than 2.4.20.", "severity": "error", "source": { "extractorName": "java", diff --git a/java/ql/integration-tests/kotlin/all-platforms/diagnostics/kotlin-version-too-new/fake-kotlinc-source/kotlin/KotlinVersion.java b/java/ql/integration-tests/kotlin/all-platforms/diagnostics/kotlin-version-too-new/fake-kotlinc-source/kotlin/KotlinVersion.java index e4bd4ecb7e10..523d7e1d0d87 100644 --- a/java/ql/integration-tests/kotlin/all-platforms/diagnostics/kotlin-version-too-new/fake-kotlinc-source/kotlin/KotlinVersion.java +++ b/java/ql/integration-tests/kotlin/all-platforms/diagnostics/kotlin-version-too-new/fake-kotlinc-source/kotlin/KotlinVersion.java @@ -2,6 +2,6 @@ public class KotlinVersion { - public static String CURRENT = "999.999.999"; + public static String CURRENT = "2.4.20"; } From a5a1878955b25b7d99caf30188893e7728332d07 Mon Sep 17 00:00:00 2001 From: Anders Fugmann Date: Wed, 26 Aug 2026 12:42:33 +0200 Subject: [PATCH 0731/2098] Kotlin: make 2.4.20-RC the test default Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- java/kotlin-extractor/dev/wrapper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/kotlin-extractor/dev/wrapper.py b/java/kotlin-extractor/dev/wrapper.py index 1b29de23f766..8c795418f67e 100755 --- a/java/kotlin-extractor/dev/wrapper.py +++ b/java/kotlin-extractor/dev/wrapper.py @@ -27,7 +27,7 @@ import io import os -DEFAULT_VERSION = "2.4.10" +DEFAULT_VERSION = "2.4.20-RC" def options(): From 352483f6c603bfa2c2d331b90c48f626d9db089d Mon Sep 17 00:00:00 2001 From: Anders Fugmann Date: Wed, 26 Aug 2026 12:42:33 +0200 Subject: [PATCH 0732/2098] Kotlin: document preliminary 2.4.20-RC support Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- docs/codeql/reusables/supported-versions-compilers.rst | 3 ++- java/ql/lib/change-notes/2026-08-21-kotlin-2.4.20.md | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 java/ql/lib/change-notes/2026-08-21-kotlin-2.4.20.md diff --git a/docs/codeql/reusables/supported-versions-compilers.rst b/docs/codeql/reusables/supported-versions-compilers.rst index e341918e5931..b8bb5714045e 100644 --- a/docs/codeql/reusables/supported-versions-compilers.rst +++ b/docs/codeql/reusables/supported-versions-compilers.rst @@ -21,7 +21,7 @@ Java,"Java 7 to 26 [5]_","javac (OpenJDK and Oracle JDK), Eclipse compiler for Java (ECJ) [6]_",``.java`` - Kotlin,"Kotlin 1.8.0 to 2.4.1\ *x*","kotlinc",``.kt`` + Kotlin [13]_,"Kotlin 1.8.0 to 2.4.20-RC","kotlinc",``.kt`` JavaScript,ECMAScript 2022 or lower,Not applicable,"``.js``, ``.jsx``, ``.mjs``, ``.es``, ``.es6``, ``.htm``, ``.html``, ``.xhtm``, ``.xhtml``, ``.vue``, ``.hbs``, ``.ejs``, ``.njk``, ``.json``, ``.yaml``, ``.yml``, ``.raml``, ``.xml`` [7]_" Python [8]_,"2.7, 3.5, 3.6, 3.7, 3.8, 3.9, 3.10, 3.11, 3.12, 3.13, 3.14",Not applicable,``.py`` Ruby,"up to 3.3",Not applicable,"``.rb``, ``.erb``, ``.gemspec``, ``Gemfile``" @@ -43,3 +43,4 @@ .. [10] Support for the analysis of Swift requires macOS. .. [11] Embedded Swift is not supported. .. [12] TypeScript analysis is performed by running the JavaScript extractor with TypeScript enabled. This is the default. + .. [13] Support for Kotlin 2.4.20-RC is preliminary. diff --git a/java/ql/lib/change-notes/2026-08-21-kotlin-2.4.20.md b/java/ql/lib/change-notes/2026-08-21-kotlin-2.4.20.md new file mode 100644 index 000000000000..15ae8bc3dbdd --- /dev/null +++ b/java/ql/lib/change-notes/2026-08-21-kotlin-2.4.20.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Preliminary support for Kotlin 2.4.20-RC has been added. From b1c4fe77ceac7c283d6fe0c9a3be099b2fea28da Mon Sep 17 00:00:00 2001 From: Anders Fugmann Date: Fri, 28 Aug 2026 13:14:01 +0200 Subject: [PATCH 0733/2098] Kotlin: support 2.4.20-RC2 Replace the previous 2.4.20-RC dependency set and compatibility marker with RC2 while preserving existing extraction output. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- MODULE.bazel | 6 +++--- docs/codeql/reusables/supported-versions-compilers.rst | 4 ++-- java/kotlin-extractor/deps/kotlin-compiler-2.4.20-RC.jar | 3 --- java/kotlin-extractor/deps/kotlin-compiler-2.4.20-RC2.jar | 3 +++ .../deps/kotlin-compiler-embeddable-2.4.20-RC.jar | 3 --- .../deps/kotlin-compiler-embeddable-2.4.20-RC2.jar | 3 +++ java/kotlin-extractor/deps/kotlin-stdlib-2.4.20-RC.jar | 3 --- java/kotlin-extractor/deps/kotlin-stdlib-2.4.20-RC2.jar | 3 +++ java/kotlin-extractor/dev/wrapper.py | 2 +- .../Kotlin2ComponentRegistrar.kt | 0 java/kotlin-extractor/versions.bzl | 2 +- java/ql/lib/change-notes/2026-08-21-kotlin-2.4.20.md | 2 +- 12 files changed, 17 insertions(+), 17 deletions(-) delete mode 100644 java/kotlin-extractor/deps/kotlin-compiler-2.4.20-RC.jar create mode 100644 java/kotlin-extractor/deps/kotlin-compiler-2.4.20-RC2.jar delete mode 100644 java/kotlin-extractor/deps/kotlin-compiler-embeddable-2.4.20-RC.jar create mode 100644 java/kotlin-extractor/deps/kotlin-compiler-embeddable-2.4.20-RC2.jar delete mode 100644 java/kotlin-extractor/deps/kotlin-stdlib-2.4.20-RC.jar create mode 100644 java/kotlin-extractor/deps/kotlin-stdlib-2.4.20-RC2.jar rename java/kotlin-extractor/src/main/kotlin/utils/versions/{v_2_4_20-RC => v_2_4_20-RC2}/Kotlin2ComponentRegistrar.kt (100%) diff --git a/MODULE.bazel b/MODULE.bazel index 811d397f6359..1dc8748a719d 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -278,7 +278,7 @@ use_repo( "kotlin-compiler-2.3.0", "kotlin-compiler-2.3.20", "kotlin-compiler-2.4.0", - "kotlin-compiler-2.4.20-RC", + "kotlin-compiler-2.4.20-RC2", "kotlin-compiler-embeddable-1.8.0", "kotlin-compiler-embeddable-1.9.0-Beta", "kotlin-compiler-embeddable-1.9.20-Beta", @@ -291,7 +291,7 @@ use_repo( "kotlin-compiler-embeddable-2.3.0", "kotlin-compiler-embeddable-2.3.20", "kotlin-compiler-embeddable-2.4.0", - "kotlin-compiler-embeddable-2.4.20-RC", + "kotlin-compiler-embeddable-2.4.20-RC2", "kotlin-stdlib-1.8.0", "kotlin-stdlib-1.9.0-Beta", "kotlin-stdlib-1.9.20-Beta", @@ -304,7 +304,7 @@ use_repo( "kotlin-stdlib-2.3.0", "kotlin-stdlib-2.3.20", "kotlin-stdlib-2.4.0", - "kotlin-stdlib-2.4.20-RC", + "kotlin-stdlib-2.4.20-RC2", ) go_sdk = use_extension("@rules_go//go:extensions.bzl", "go_sdk") diff --git a/docs/codeql/reusables/supported-versions-compilers.rst b/docs/codeql/reusables/supported-versions-compilers.rst index b8bb5714045e..77ebb3ece993 100644 --- a/docs/codeql/reusables/supported-versions-compilers.rst +++ b/docs/codeql/reusables/supported-versions-compilers.rst @@ -21,7 +21,7 @@ Java,"Java 7 to 26 [5]_","javac (OpenJDK and Oracle JDK), Eclipse compiler for Java (ECJ) [6]_",``.java`` - Kotlin [13]_,"Kotlin 1.8.0 to 2.4.20-RC","kotlinc",``.kt`` + Kotlin [13]_,"Kotlin 1.8.0 to 2.4.20-RC2","kotlinc",``.kt`` JavaScript,ECMAScript 2022 or lower,Not applicable,"``.js``, ``.jsx``, ``.mjs``, ``.es``, ``.es6``, ``.htm``, ``.html``, ``.xhtm``, ``.xhtml``, ``.vue``, ``.hbs``, ``.ejs``, ``.njk``, ``.json``, ``.yaml``, ``.yml``, ``.raml``, ``.xml`` [7]_" Python [8]_,"2.7, 3.5, 3.6, 3.7, 3.8, 3.9, 3.10, 3.11, 3.12, 3.13, 3.14",Not applicable,``.py`` Ruby,"up to 3.3",Not applicable,"``.rb``, ``.erb``, ``.gemspec``, ``Gemfile``" @@ -43,4 +43,4 @@ .. [10] Support for the analysis of Swift requires macOS. .. [11] Embedded Swift is not supported. .. [12] TypeScript analysis is performed by running the JavaScript extractor with TypeScript enabled. This is the default. - .. [13] Support for Kotlin 2.4.20-RC is preliminary. + .. [13] Support for Kotlin 2.4.20-RC2 is preliminary. diff --git a/java/kotlin-extractor/deps/kotlin-compiler-2.4.20-RC.jar b/java/kotlin-extractor/deps/kotlin-compiler-2.4.20-RC.jar deleted file mode 100644 index 8e5a4c945250..000000000000 --- a/java/kotlin-extractor/deps/kotlin-compiler-2.4.20-RC.jar +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5e2e10f209ef5a63ed70d04ab5c64a8cf346c323f356eb4241ce34ee03cf2e53 -size 60184229 diff --git a/java/kotlin-extractor/deps/kotlin-compiler-2.4.20-RC2.jar b/java/kotlin-extractor/deps/kotlin-compiler-2.4.20-RC2.jar new file mode 100644 index 000000000000..61b97c2daab3 --- /dev/null +++ b/java/kotlin-extractor/deps/kotlin-compiler-2.4.20-RC2.jar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ec34d6a2587d59cc0dfeb65b5588f2d631edf93d0f2543f3b026f902456094df +size 60184461 diff --git a/java/kotlin-extractor/deps/kotlin-compiler-embeddable-2.4.20-RC.jar b/java/kotlin-extractor/deps/kotlin-compiler-embeddable-2.4.20-RC.jar deleted file mode 100644 index 4a7601447f96..000000000000 --- a/java/kotlin-extractor/deps/kotlin-compiler-embeddable-2.4.20-RC.jar +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fac41bf816409462e189b41b87c4a8dfb48b995b4d8d6271968d4f638ceab255 -size 58593000 diff --git a/java/kotlin-extractor/deps/kotlin-compiler-embeddable-2.4.20-RC2.jar b/java/kotlin-extractor/deps/kotlin-compiler-embeddable-2.4.20-RC2.jar new file mode 100644 index 000000000000..2c5e630eed5f --- /dev/null +++ b/java/kotlin-extractor/deps/kotlin-compiler-embeddable-2.4.20-RC2.jar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2654e7834a9e3c12e4626e2d5ace62f38682f9cdd348dba48a6bbde3479d6db2 +size 58593232 diff --git a/java/kotlin-extractor/deps/kotlin-stdlib-2.4.20-RC.jar b/java/kotlin-extractor/deps/kotlin-stdlib-2.4.20-RC.jar deleted file mode 100644 index 2fb1da42a55a..000000000000 --- a/java/kotlin-extractor/deps/kotlin-stdlib-2.4.20-RC.jar +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:540bee6d6310863014877cb4df8f087c256b22d0925955d1d20943d706bba524 -size 1853317 diff --git a/java/kotlin-extractor/deps/kotlin-stdlib-2.4.20-RC2.jar b/java/kotlin-extractor/deps/kotlin-stdlib-2.4.20-RC2.jar new file mode 100644 index 000000000000..66a27b7faf12 --- /dev/null +++ b/java/kotlin-extractor/deps/kotlin-stdlib-2.4.20-RC2.jar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1697a320cbceeee25123ce07aa8e3b356094601b1bff8a55ac8db39ffbbca0ef +size 1853317 diff --git a/java/kotlin-extractor/dev/wrapper.py b/java/kotlin-extractor/dev/wrapper.py index 8c795418f67e..fa1df5714e0b 100755 --- a/java/kotlin-extractor/dev/wrapper.py +++ b/java/kotlin-extractor/dev/wrapper.py @@ -27,7 +27,7 @@ import io import os -DEFAULT_VERSION = "2.4.20-RC" +DEFAULT_VERSION = "2.4.20-RC2" def options(): diff --git a/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_4_20-RC/Kotlin2ComponentRegistrar.kt b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_4_20-RC2/Kotlin2ComponentRegistrar.kt similarity index 100% rename from java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_4_20-RC/Kotlin2ComponentRegistrar.kt rename to java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_4_20-RC2/Kotlin2ComponentRegistrar.kt diff --git a/java/kotlin-extractor/versions.bzl b/java/kotlin-extractor/versions.bzl index f31d69b2a226..6fb456e9fa73 100644 --- a/java/kotlin-extractor/versions.bzl +++ b/java/kotlin-extractor/versions.bzl @@ -12,7 +12,7 @@ VERSIONS = [ "2.3.0", "2.3.20", "2.4.0", - "2.4.20-RC", + "2.4.20-RC2", ] def _version_to_tuple(v): diff --git a/java/ql/lib/change-notes/2026-08-21-kotlin-2.4.20.md b/java/ql/lib/change-notes/2026-08-21-kotlin-2.4.20.md index 15ae8bc3dbdd..08772e5635d1 100644 --- a/java/ql/lib/change-notes/2026-08-21-kotlin-2.4.20.md +++ b/java/ql/lib/change-notes/2026-08-21-kotlin-2.4.20.md @@ -1,4 +1,4 @@ --- category: minorAnalysis --- -* Preliminary support for Kotlin 2.4.20-RC has been added. +* Preliminary support for Kotlin 2.4.20-RC2 has been added. From 8301109cd6b1d55ca9a938424d0202746e33cd3e Mon Sep 17 00:00:00 2001 From: Anders Fugmann Date: Thu, 3 Sep 2026 15:58:45 +0200 Subject: [PATCH 0734/2098] Kotlin: document preliminary 2.4.20 support Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../supported-versions-compilers.rst | 26 +++++++++---------- .../change-notes/2026-08-21-kotlin-2.4.20.md | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/codeql/reusables/supported-versions-compilers.rst b/docs/codeql/reusables/supported-versions-compilers.rst index 77ebb3ece993..077a719f408c 100644 --- a/docs/codeql/reusables/supported-versions-compilers.rst +++ b/docs/codeql/reusables/supported-versions-compilers.rst @@ -21,13 +21,13 @@ Java,"Java 7 to 26 [5]_","javac (OpenJDK and Oracle JDK), Eclipse compiler for Java (ECJ) [6]_",``.java`` - Kotlin [13]_,"Kotlin 1.8.0 to 2.4.20-RC2","kotlinc",``.kt`` - JavaScript,ECMAScript 2022 or lower,Not applicable,"``.js``, ``.jsx``, ``.mjs``, ``.es``, ``.es6``, ``.htm``, ``.html``, ``.xhtm``, ``.xhtml``, ``.vue``, ``.hbs``, ``.ejs``, ``.njk``, ``.json``, ``.yaml``, ``.yml``, ``.raml``, ``.xml`` [7]_" - Python [8]_,"2.7, 3.5, 3.6, 3.7, 3.8, 3.9, 3.10, 3.11, 3.12, 3.13, 3.14",Not applicable,``.py`` + Kotlin,"Kotlin 1.8.0 to 2.4.20 [7]_","kotlinc",``.kt`` + JavaScript,ECMAScript 2022 or lower,Not applicable,"``.js``, ``.jsx``, ``.mjs``, ``.es``, ``.es6``, ``.htm``, ``.html``, ``.xhtm``, ``.xhtml``, ``.vue``, ``.hbs``, ``.ejs``, ``.njk``, ``.json``, ``.yaml``, ``.yml``, ``.raml``, ``.xml`` [8]_" + Python [9]_,"2.7, 3.5, 3.6, 3.7, 3.8, 3.9, 3.10, 3.11, 3.12, 3.13, 3.14",Not applicable,``.py`` Ruby,"up to 3.3",Not applicable,"``.rb``, ``.erb``, ``.gemspec``, ``Gemfile``" - Rust [9]_,"Rust editions 2021 and 2024","Rust compiler","``.rs``, ``Cargo.toml``" - Swift [10]_ [11]_,"Swift 5.4-6.3","Swift compiler","``.swift``" - TypeScript [12]_,"2.6-7.0",Standard TypeScript compiler,"``.ts``, ``.tsx``, ``.mts``, ``.cts``" + Rust [10]_,"Rust editions 2021 and 2024","Rust compiler","``.rs``, ``Cargo.toml``" + Swift [11]_ [12]_,"Swift 5.4-6.3","Swift compiler","``.swift``" + TypeScript [13]_,"2.6-7.0",Standard TypeScript compiler,"``.ts``, ``.tsx``, ``.mts``, ``.cts``" .. container:: footnote-group @@ -37,10 +37,10 @@ .. [4] Support for the Arm Compiler (armcc) is preliminary. .. [5] Builds that execute on Java 7 to 26 can be analyzed. The analysis understands standard language features in Java 8 to 26; "preview" and "incubator" features are not supported. Source code using Java language versions older than Java 8 are analyzed as Java 8 code. .. [6] ECJ is supported when the build invokes it via the Maven Compiler plugin or the Takari Lifecycle plugin. - .. [7] JSX and Flow code, YAML, JSON, HTML, and XML files may also be analyzed with JavaScript files. - .. [8] The extractor requires Python 3 to run. To analyze Python 2.7 you should install both versions of Python. - .. [9] Requires ``rustup`` and ``cargo`` to be installed. Features from nightly toolchains are not supported. - .. [10] Support for the analysis of Swift requires macOS. - .. [11] Embedded Swift is not supported. - .. [12] TypeScript analysis is performed by running the JavaScript extractor with TypeScript enabled. This is the default. - .. [13] Support for Kotlin 2.4.20-RC2 is preliminary. + .. [7] Support for Kotlin 2.4.20 is preliminary. + .. [8] JSX and Flow code, YAML, JSON, HTML, and XML files may also be analyzed with JavaScript files. + .. [9] The extractor requires Python 3 to run. To analyze Python 2.7 you should install both versions of Python. + .. [10] Requires ``rustup`` and ``cargo`` to be installed. Features from nightly toolchains are not supported. + .. [11] Support for the analysis of Swift requires macOS. + .. [12] Embedded Swift is not supported. + .. [13] TypeScript analysis is performed by running the JavaScript extractor with TypeScript enabled. This is the default. diff --git a/java/ql/lib/change-notes/2026-08-21-kotlin-2.4.20.md b/java/ql/lib/change-notes/2026-08-21-kotlin-2.4.20.md index 08772e5635d1..c01c05552848 100644 --- a/java/ql/lib/change-notes/2026-08-21-kotlin-2.4.20.md +++ b/java/ql/lib/change-notes/2026-08-21-kotlin-2.4.20.md @@ -1,4 +1,4 @@ --- category: minorAnalysis --- -* Preliminary support for Kotlin 2.4.20-RC2 has been added. +* Preliminary support for Kotlin 2.4.20 has been added. From 570eba1e70cd9fbb8bb9bac990bd261e67e391d8 Mon Sep 17 00:00:00 2001 From: Anders Fugmann Date: Thu, 3 Sep 2026 15:58:46 +0200 Subject: [PATCH 0735/2098] Kotlin: restore future-version diagnostic test Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../diagnostics/kotlin-version-too-new/diagnostics.expected | 2 +- .../fake-kotlinc-source/kotlin/KotlinVersion.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/java/ql/integration-tests/kotlin/all-platforms/diagnostics/kotlin-version-too-new/diagnostics.expected b/java/ql/integration-tests/kotlin/all-platforms/diagnostics/kotlin-version-too-new/diagnostics.expected index 613709bfb152..ff2c056ff962 100644 --- a/java/ql/integration-tests/kotlin/all-platforms/diagnostics/kotlin-version-too-new/diagnostics.expected +++ b/java/ql/integration-tests/kotlin/all-platforms/diagnostics/kotlin-version-too-new/diagnostics.expected @@ -1,5 +1,5 @@ { - "markdownMessage": "The Kotlin version installed (`2.4.20`) is too recent for this version of CodeQL. Install a version lower than 2.4.20.", + "markdownMessage": "The Kotlin version installed (`999.999.999`) is too recent for this version of CodeQL. Install a version lower than 2.4.30.", "severity": "error", "source": { "extractorName": "java", diff --git a/java/ql/integration-tests/kotlin/all-platforms/diagnostics/kotlin-version-too-new/fake-kotlinc-source/kotlin/KotlinVersion.java b/java/ql/integration-tests/kotlin/all-platforms/diagnostics/kotlin-version-too-new/fake-kotlinc-source/kotlin/KotlinVersion.java index 523d7e1d0d87..e4bd4ecb7e10 100644 --- a/java/ql/integration-tests/kotlin/all-platforms/diagnostics/kotlin-version-too-new/fake-kotlinc-source/kotlin/KotlinVersion.java +++ b/java/ql/integration-tests/kotlin/all-platforms/diagnostics/kotlin-version-too-new/fake-kotlinc-source/kotlin/KotlinVersion.java @@ -2,6 +2,6 @@ public class KotlinVersion { - public static String CURRENT = "2.4.20"; + public static String CURRENT = "999.999.999"; } From 8b72dd3946779b258758a710b6f364946ede9ef7 Mon Sep 17 00:00:00 2001 From: Anders Fugmann Date: Thu, 3 Sep 2026 16:40:43 +0200 Subject: [PATCH 0736/2098] Kotlin: support 2.4.20-RC3 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- MODULE.bazel | 6 +++--- java/kotlin-extractor/deps/kotlin-compiler-2.4.20-RC2.jar | 3 --- java/kotlin-extractor/deps/kotlin-compiler-2.4.20-RC3.jar | 3 +++ .../deps/kotlin-compiler-embeddable-2.4.20-RC2.jar | 3 --- .../deps/kotlin-compiler-embeddable-2.4.20-RC3.jar | 3 +++ java/kotlin-extractor/deps/kotlin-stdlib-2.4.20-RC2.jar | 3 --- java/kotlin-extractor/deps/kotlin-stdlib-2.4.20-RC3.jar | 3 +++ java/kotlin-extractor/dev/wrapper.py | 2 +- .../Kotlin2ComponentRegistrar.kt | 0 java/kotlin-extractor/versions.bzl | 2 +- 10 files changed, 14 insertions(+), 14 deletions(-) delete mode 100644 java/kotlin-extractor/deps/kotlin-compiler-2.4.20-RC2.jar create mode 100644 java/kotlin-extractor/deps/kotlin-compiler-2.4.20-RC3.jar delete mode 100644 java/kotlin-extractor/deps/kotlin-compiler-embeddable-2.4.20-RC2.jar create mode 100644 java/kotlin-extractor/deps/kotlin-compiler-embeddable-2.4.20-RC3.jar delete mode 100644 java/kotlin-extractor/deps/kotlin-stdlib-2.4.20-RC2.jar create mode 100644 java/kotlin-extractor/deps/kotlin-stdlib-2.4.20-RC3.jar rename java/kotlin-extractor/src/main/kotlin/utils/versions/{v_2_4_20-RC2 => v_2_4_20-RC3}/Kotlin2ComponentRegistrar.kt (100%) diff --git a/MODULE.bazel b/MODULE.bazel index 1dc8748a719d..902f0ec3bf6d 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -278,7 +278,7 @@ use_repo( "kotlin-compiler-2.3.0", "kotlin-compiler-2.3.20", "kotlin-compiler-2.4.0", - "kotlin-compiler-2.4.20-RC2", + "kotlin-compiler-2.4.20-RC3", "kotlin-compiler-embeddable-1.8.0", "kotlin-compiler-embeddable-1.9.0-Beta", "kotlin-compiler-embeddable-1.9.20-Beta", @@ -291,7 +291,7 @@ use_repo( "kotlin-compiler-embeddable-2.3.0", "kotlin-compiler-embeddable-2.3.20", "kotlin-compiler-embeddable-2.4.0", - "kotlin-compiler-embeddable-2.4.20-RC2", + "kotlin-compiler-embeddable-2.4.20-RC3", "kotlin-stdlib-1.8.0", "kotlin-stdlib-1.9.0-Beta", "kotlin-stdlib-1.9.20-Beta", @@ -304,7 +304,7 @@ use_repo( "kotlin-stdlib-2.3.0", "kotlin-stdlib-2.3.20", "kotlin-stdlib-2.4.0", - "kotlin-stdlib-2.4.20-RC2", + "kotlin-stdlib-2.4.20-RC3", ) go_sdk = use_extension("@rules_go//go:extensions.bzl", "go_sdk") diff --git a/java/kotlin-extractor/deps/kotlin-compiler-2.4.20-RC2.jar b/java/kotlin-extractor/deps/kotlin-compiler-2.4.20-RC2.jar deleted file mode 100644 index 61b97c2daab3..000000000000 --- a/java/kotlin-extractor/deps/kotlin-compiler-2.4.20-RC2.jar +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec34d6a2587d59cc0dfeb65b5588f2d631edf93d0f2543f3b026f902456094df -size 60184461 diff --git a/java/kotlin-extractor/deps/kotlin-compiler-2.4.20-RC3.jar b/java/kotlin-extractor/deps/kotlin-compiler-2.4.20-RC3.jar new file mode 100644 index 000000000000..5fc806f55546 --- /dev/null +++ b/java/kotlin-extractor/deps/kotlin-compiler-2.4.20-RC3.jar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a82b8fcea2bb26e0183c8d4abaa11c73d0546513778cde864afca093ebf47fc +size 60184483 diff --git a/java/kotlin-extractor/deps/kotlin-compiler-embeddable-2.4.20-RC2.jar b/java/kotlin-extractor/deps/kotlin-compiler-embeddable-2.4.20-RC2.jar deleted file mode 100644 index 2c5e630eed5f..000000000000 --- a/java/kotlin-extractor/deps/kotlin-compiler-embeddable-2.4.20-RC2.jar +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2654e7834a9e3c12e4626e2d5ace62f38682f9cdd348dba48a6bbde3479d6db2 -size 58593232 diff --git a/java/kotlin-extractor/deps/kotlin-compiler-embeddable-2.4.20-RC3.jar b/java/kotlin-extractor/deps/kotlin-compiler-embeddable-2.4.20-RC3.jar new file mode 100644 index 000000000000..f0b154d6c32b --- /dev/null +++ b/java/kotlin-extractor/deps/kotlin-compiler-embeddable-2.4.20-RC3.jar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8b5e606e085246cf3f45e94bc5f19703330cd4336f8018a51ed5f5c41df05b48 +size 58593254 diff --git a/java/kotlin-extractor/deps/kotlin-stdlib-2.4.20-RC2.jar b/java/kotlin-extractor/deps/kotlin-stdlib-2.4.20-RC2.jar deleted file mode 100644 index 66a27b7faf12..000000000000 --- a/java/kotlin-extractor/deps/kotlin-stdlib-2.4.20-RC2.jar +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1697a320cbceeee25123ce07aa8e3b356094601b1bff8a55ac8db39ffbbca0ef -size 1853317 diff --git a/java/kotlin-extractor/deps/kotlin-stdlib-2.4.20-RC3.jar b/java/kotlin-extractor/deps/kotlin-stdlib-2.4.20-RC3.jar new file mode 100644 index 000000000000..dbfe536e3a28 --- /dev/null +++ b/java/kotlin-extractor/deps/kotlin-stdlib-2.4.20-RC3.jar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:45311a8ed12064c4f8d23f54a1a79f72897f2a94ba39a15b22d73b07500078db +size 1853318 diff --git a/java/kotlin-extractor/dev/wrapper.py b/java/kotlin-extractor/dev/wrapper.py index fa1df5714e0b..c2b5909c239a 100755 --- a/java/kotlin-extractor/dev/wrapper.py +++ b/java/kotlin-extractor/dev/wrapper.py @@ -27,7 +27,7 @@ import io import os -DEFAULT_VERSION = "2.4.20-RC2" +DEFAULT_VERSION = "2.4.20-RC3" def options(): diff --git a/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_4_20-RC2/Kotlin2ComponentRegistrar.kt b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_4_20-RC3/Kotlin2ComponentRegistrar.kt similarity index 100% rename from java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_4_20-RC2/Kotlin2ComponentRegistrar.kt rename to java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_4_20-RC3/Kotlin2ComponentRegistrar.kt diff --git a/java/kotlin-extractor/versions.bzl b/java/kotlin-extractor/versions.bzl index 6fb456e9fa73..189dbc6b3819 100644 --- a/java/kotlin-extractor/versions.bzl +++ b/java/kotlin-extractor/versions.bzl @@ -12,7 +12,7 @@ VERSIONS = [ "2.3.0", "2.3.20", "2.4.0", - "2.4.20-RC2", + "2.4.20-RC3", ] def _version_to_tuple(v): From 47cc7d8176fc7370c99a3f897035bec0bb924efc Mon Sep 17 00:00:00 2001 From: Anders Fugmann Date: Mon, 7 Sep 2026 15:42:35 +0200 Subject: [PATCH 0737/2098] Kotlin: use 2.4.20 GA Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- MODULE.bazel | 6 ++--- .../supported-versions-compilers.rst | 25 +++++++++---------- .../deps/kotlin-compiler-2.4.20-RC3.jar | 3 --- .../deps/kotlin-compiler-2.4.20.jar | 3 +++ .../kotlin-compiler-embeddable-2.4.20-RC3.jar | 3 --- .../kotlin-compiler-embeddable-2.4.20.jar | 3 +++ .../deps/kotlin-stdlib-2.4.20-RC3.jar | 3 --- .../deps/kotlin-stdlib-2.4.20.jar | 3 +++ java/kotlin-extractor/dev/wrapper.py | 2 +- .../Kotlin2ComponentRegistrar.kt | 0 java/kotlin-extractor/versions.bzl | 2 +- .../change-notes/2026-08-21-kotlin-2.4.20.md | 2 +- 12 files changed, 27 insertions(+), 28 deletions(-) delete mode 100644 java/kotlin-extractor/deps/kotlin-compiler-2.4.20-RC3.jar create mode 100644 java/kotlin-extractor/deps/kotlin-compiler-2.4.20.jar delete mode 100644 java/kotlin-extractor/deps/kotlin-compiler-embeddable-2.4.20-RC3.jar create mode 100644 java/kotlin-extractor/deps/kotlin-compiler-embeddable-2.4.20.jar delete mode 100644 java/kotlin-extractor/deps/kotlin-stdlib-2.4.20-RC3.jar create mode 100644 java/kotlin-extractor/deps/kotlin-stdlib-2.4.20.jar rename java/kotlin-extractor/src/main/kotlin/utils/versions/{v_2_4_20-RC3 => v_2_4_20}/Kotlin2ComponentRegistrar.kt (100%) diff --git a/MODULE.bazel b/MODULE.bazel index 902f0ec3bf6d..a257c9de25ff 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -278,7 +278,7 @@ use_repo( "kotlin-compiler-2.3.0", "kotlin-compiler-2.3.20", "kotlin-compiler-2.4.0", - "kotlin-compiler-2.4.20-RC3", + "kotlin-compiler-2.4.20", "kotlin-compiler-embeddable-1.8.0", "kotlin-compiler-embeddable-1.9.0-Beta", "kotlin-compiler-embeddable-1.9.20-Beta", @@ -291,7 +291,7 @@ use_repo( "kotlin-compiler-embeddable-2.3.0", "kotlin-compiler-embeddable-2.3.20", "kotlin-compiler-embeddable-2.4.0", - "kotlin-compiler-embeddable-2.4.20-RC3", + "kotlin-compiler-embeddable-2.4.20", "kotlin-stdlib-1.8.0", "kotlin-stdlib-1.9.0-Beta", "kotlin-stdlib-1.9.20-Beta", @@ -304,7 +304,7 @@ use_repo( "kotlin-stdlib-2.3.0", "kotlin-stdlib-2.3.20", "kotlin-stdlib-2.4.0", - "kotlin-stdlib-2.4.20-RC3", + "kotlin-stdlib-2.4.20", ) go_sdk = use_extension("@rules_go//go:extensions.bzl", "go_sdk") diff --git a/docs/codeql/reusables/supported-versions-compilers.rst b/docs/codeql/reusables/supported-versions-compilers.rst index 077a719f408c..677b0e139eb6 100644 --- a/docs/codeql/reusables/supported-versions-compilers.rst +++ b/docs/codeql/reusables/supported-versions-compilers.rst @@ -21,13 +21,13 @@ Java,"Java 7 to 26 [5]_","javac (OpenJDK and Oracle JDK), Eclipse compiler for Java (ECJ) [6]_",``.java`` - Kotlin,"Kotlin 1.8.0 to 2.4.20 [7]_","kotlinc",``.kt`` - JavaScript,ECMAScript 2022 or lower,Not applicable,"``.js``, ``.jsx``, ``.mjs``, ``.es``, ``.es6``, ``.htm``, ``.html``, ``.xhtm``, ``.xhtml``, ``.vue``, ``.hbs``, ``.ejs``, ``.njk``, ``.json``, ``.yaml``, ``.yml``, ``.raml``, ``.xml`` [8]_" - Python [9]_,"2.7, 3.5, 3.6, 3.7, 3.8, 3.9, 3.10, 3.11, 3.12, 3.13, 3.14",Not applicable,``.py`` + Kotlin,"Kotlin 1.8.0 to 2.4.20","kotlinc",``.kt`` + JavaScript,ECMAScript 2022 or lower,Not applicable,"``.js``, ``.jsx``, ``.mjs``, ``.es``, ``.es6``, ``.htm``, ``.html``, ``.xhtm``, ``.xhtml``, ``.vue``, ``.hbs``, ``.ejs``, ``.njk``, ``.json``, ``.yaml``, ``.yml``, ``.raml``, ``.xml`` [7]_" + Python [8]_,"2.7, 3.5, 3.6, 3.7, 3.8, 3.9, 3.10, 3.11, 3.12, 3.13, 3.14",Not applicable,``.py`` Ruby,"up to 3.3",Not applicable,"``.rb``, ``.erb``, ``.gemspec``, ``Gemfile``" - Rust [10]_,"Rust editions 2021 and 2024","Rust compiler","``.rs``, ``Cargo.toml``" - Swift [11]_ [12]_,"Swift 5.4-6.3","Swift compiler","``.swift``" - TypeScript [13]_,"2.6-7.0",Standard TypeScript compiler,"``.ts``, ``.tsx``, ``.mts``, ``.cts``" + Rust [9]_,"Rust editions 2021 and 2024","Rust compiler","``.rs``, ``Cargo.toml``" + Swift [10]_ [11]_,"Swift 5.4-6.3","Swift compiler","``.swift``" + TypeScript [12]_,"2.6-7.0",Standard TypeScript compiler,"``.ts``, ``.tsx``, ``.mts``, ``.cts``" .. container:: footnote-group @@ -37,10 +37,9 @@ .. [4] Support for the Arm Compiler (armcc) is preliminary. .. [5] Builds that execute on Java 7 to 26 can be analyzed. The analysis understands standard language features in Java 8 to 26; "preview" and "incubator" features are not supported. Source code using Java language versions older than Java 8 are analyzed as Java 8 code. .. [6] ECJ is supported when the build invokes it via the Maven Compiler plugin or the Takari Lifecycle plugin. - .. [7] Support for Kotlin 2.4.20 is preliminary. - .. [8] JSX and Flow code, YAML, JSON, HTML, and XML files may also be analyzed with JavaScript files. - .. [9] The extractor requires Python 3 to run. To analyze Python 2.7 you should install both versions of Python. - .. [10] Requires ``rustup`` and ``cargo`` to be installed. Features from nightly toolchains are not supported. - .. [11] Support for the analysis of Swift requires macOS. - .. [12] Embedded Swift is not supported. - .. [13] TypeScript analysis is performed by running the JavaScript extractor with TypeScript enabled. This is the default. + .. [7] JSX and Flow code, YAML, JSON, HTML, and XML files may also be analyzed with JavaScript files. + .. [8] The extractor requires Python 3 to run. To analyze Python 2.7 you should install both versions of Python. + .. [9] Requires ``rustup`` and ``cargo`` to be installed. Features from nightly toolchains are not supported. + .. [10] Support for the analysis of Swift requires macOS. + .. [11] Embedded Swift is not supported. + .. [12] TypeScript analysis is performed by running the JavaScript extractor with TypeScript enabled. This is the default. diff --git a/java/kotlin-extractor/deps/kotlin-compiler-2.4.20-RC3.jar b/java/kotlin-extractor/deps/kotlin-compiler-2.4.20-RC3.jar deleted file mode 100644 index 5fc806f55546..000000000000 --- a/java/kotlin-extractor/deps/kotlin-compiler-2.4.20-RC3.jar +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7a82b8fcea2bb26e0183c8d4abaa11c73d0546513778cde864afca093ebf47fc -size 60184483 diff --git a/java/kotlin-extractor/deps/kotlin-compiler-2.4.20.jar b/java/kotlin-extractor/deps/kotlin-compiler-2.4.20.jar new file mode 100644 index 000000000000..6ffc5a160971 --- /dev/null +++ b/java/kotlin-extractor/deps/kotlin-compiler-2.4.20.jar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:038d406cc51d5fe3f6b5a16366a3f083b783bceb9e576e3103e695c3ce04e0fa +size 60184475 diff --git a/java/kotlin-extractor/deps/kotlin-compiler-embeddable-2.4.20-RC3.jar b/java/kotlin-extractor/deps/kotlin-compiler-embeddable-2.4.20-RC3.jar deleted file mode 100644 index f0b154d6c32b..000000000000 --- a/java/kotlin-extractor/deps/kotlin-compiler-embeddable-2.4.20-RC3.jar +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8b5e606e085246cf3f45e94bc5f19703330cd4336f8018a51ed5f5c41df05b48 -size 58593254 diff --git a/java/kotlin-extractor/deps/kotlin-compiler-embeddable-2.4.20.jar b/java/kotlin-extractor/deps/kotlin-compiler-embeddable-2.4.20.jar new file mode 100644 index 000000000000..4084155d18e5 --- /dev/null +++ b/java/kotlin-extractor/deps/kotlin-compiler-embeddable-2.4.20.jar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cf97161430683fb9af96dc6a7017ffae1fe8737b80d12eee11f2fe3e76f8ded8 +size 58593245 diff --git a/java/kotlin-extractor/deps/kotlin-stdlib-2.4.20-RC3.jar b/java/kotlin-extractor/deps/kotlin-stdlib-2.4.20-RC3.jar deleted file mode 100644 index dbfe536e3a28..000000000000 --- a/java/kotlin-extractor/deps/kotlin-stdlib-2.4.20-RC3.jar +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:45311a8ed12064c4f8d23f54a1a79f72897f2a94ba39a15b22d73b07500078db -size 1853318 diff --git a/java/kotlin-extractor/deps/kotlin-stdlib-2.4.20.jar b/java/kotlin-extractor/deps/kotlin-stdlib-2.4.20.jar new file mode 100644 index 000000000000..bf737b49cf30 --- /dev/null +++ b/java/kotlin-extractor/deps/kotlin-stdlib-2.4.20.jar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2226de463d309d4a5500a481320b3dea515a6981dcae1def531fbc158884e25f +size 1853314 diff --git a/java/kotlin-extractor/dev/wrapper.py b/java/kotlin-extractor/dev/wrapper.py index c2b5909c239a..6940765cbc33 100755 --- a/java/kotlin-extractor/dev/wrapper.py +++ b/java/kotlin-extractor/dev/wrapper.py @@ -27,7 +27,7 @@ import io import os -DEFAULT_VERSION = "2.4.20-RC3" +DEFAULT_VERSION = "2.4.20" def options(): diff --git a/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_4_20-RC3/Kotlin2ComponentRegistrar.kt b/java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_4_20/Kotlin2ComponentRegistrar.kt similarity index 100% rename from java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_4_20-RC3/Kotlin2ComponentRegistrar.kt rename to java/kotlin-extractor/src/main/kotlin/utils/versions/v_2_4_20/Kotlin2ComponentRegistrar.kt diff --git a/java/kotlin-extractor/versions.bzl b/java/kotlin-extractor/versions.bzl index 189dbc6b3819..17c925493905 100644 --- a/java/kotlin-extractor/versions.bzl +++ b/java/kotlin-extractor/versions.bzl @@ -12,7 +12,7 @@ VERSIONS = [ "2.3.0", "2.3.20", "2.4.0", - "2.4.20-RC3", + "2.4.20", ] def _version_to_tuple(v): diff --git a/java/ql/lib/change-notes/2026-08-21-kotlin-2.4.20.md b/java/ql/lib/change-notes/2026-08-21-kotlin-2.4.20.md index c01c05552848..22925adf104e 100644 --- a/java/ql/lib/change-notes/2026-08-21-kotlin-2.4.20.md +++ b/java/ql/lib/change-notes/2026-08-21-kotlin-2.4.20.md @@ -1,4 +1,4 @@ --- category: minorAnalysis --- -* Preliminary support for Kotlin 2.4.20 has been added. +* Support for Kotlin 2.4.20 has been added. From 291a5765c1b3d21b86784c10cbfb3daaa57cb9cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jack=20N=C3=B8rskov=20J=C3=B8rgensen?= Date: Tue, 8 Sep 2026 10:14:41 +0000 Subject: [PATCH 0738/2098] Improve hapi coverage --- .../2026-09-08-hapi-wrapped-routes.md | 4 + .../internal/FunctionWrapperSteps.qll | 27 ++++ .../lib/semmle/javascript/frameworks/Hapi.qll | 127 ++++++++++++++---- .../frameworks/hapi/WrappedRouteFlow.qll | 15 +++ .../frameworks/hapi/src/wrapped-route.js | 42 ++++++ .../frameworks/hapi/tests.expected | 14 ++ .../library-tests/frameworks/hapi/tests.ql | 1 + 7 files changed, 201 insertions(+), 29 deletions(-) create mode 100644 javascript/ql/lib/change-notes/2026-09-08-hapi-wrapped-routes.md create mode 100644 javascript/ql/test/library-tests/frameworks/hapi/WrappedRouteFlow.qll create mode 100644 javascript/ql/test/library-tests/frameworks/hapi/src/wrapped-route.js diff --git a/javascript/ql/lib/change-notes/2026-09-08-hapi-wrapped-routes.md b/javascript/ql/lib/change-notes/2026-09-08-hapi-wrapped-routes.md new file mode 100644 index 000000000000..039c61c3de26 --- /dev/null +++ b/javascript/ql/lib/change-notes/2026-09-08-hapi-wrapped-routes.md @@ -0,0 +1,4 @@ +--- +category: fix +--- +* Improved Hapi route handler and request input tracking through custom route registration helpers and higher-order function wrappers. \ No newline at end of file diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/FunctionWrapperSteps.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/FunctionWrapperSteps.qll index dda1ac7ae34f..a1899f121cf7 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/FunctionWrapperSteps.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/FunctionWrapperSteps.qll @@ -145,3 +145,30 @@ private module Cached { } import Cached + +private DataFlow::SourceNode forwardedCalleeSource( + DataFlow::CallNode call, DataFlow::TypeBackTracker t +) { + t.start() and + result = call.getCalleeNode().getALocalSource() + or + exists(DataFlow::TypeBackTracker t2 | result = forwardedCalleeSource(call, t2).backtrack(t2, t)) +} + +/** Data flow into a concrete function invoked through a forwarding wrapper. */ +private class FunctionWrapperCallStep extends DataFlow::SharedFlowStep { + DataFlow::CallNode call; + DataFlow::FunctionNode wrapped; + + FunctionWrapperCallStep() { + DataFlow::functionOneWayForwardingStep(wrapped, + forwardedCalleeSource(call, DataFlow::TypeBackTracker::end())) + } + + override predicate step(DataFlow::Node pred, DataFlow::Node succ) { + exists(int index | + pred = call.getArgument(index) and + succ = wrapped.getParameter(index) + ) + } +} diff --git a/javascript/ql/lib/semmle/javascript/frameworks/Hapi.qll b/javascript/ql/lib/semmle/javascript/frameworks/Hapi.qll index a6dbf40d1e06..a63610527abb 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/Hapi.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/Hapi.qll @@ -4,6 +4,7 @@ import javascript import semmle.javascript.frameworks.HTTP +private import semmle.javascript.dataflow.internal.CallGraphs module Hapi { /** @@ -116,17 +117,21 @@ module Hapi { this.(DataFlow::PropRead).accesses(request, "rawPayload") or exists(DataFlow::PropRead payload | - // `request.payload.name` + // `request.payload.name`, or `request.payload` when the object is forwarded. payload.accesses(request, "payload") and - this.(DataFlow::PropRead).accesses(payload, _) + if exists(payload.getAPropertyRead()) + then this = payload.getAPropertyRead() + else this = payload ) ) or kind = "parameter" and - exists(DataFlow::PropRead query | - // `request.query.name` - query.accesses(request, ["query", "params"]) and - this.(DataFlow::PropRead).accesses(query, _) + exists(DataFlow::PropRead parameter | + // `request.query.name` / `request.params.name`, or the object when it is forwarded. + parameter.accesses(request, ["query", "params"]) and + if exists(parameter.getAPropertyRead()) + then this = parameter.getAPropertyRead() + else this = parameter ) or exists(DataFlow::PropRead url | @@ -199,30 +204,10 @@ module Hapi { */ class RouteSetup extends DataFlow::MethodCallNode, Http::Servers::StandardRouteSetup { ServerDefinition server; - DataFlow::Node handler; RouteSetup() { server.ref().getAMethodCall() = this and - ( - // server.route({ handler: fun }) - this.getMethodName() = "route" and - this.getOptionArgument(0, "handler") = handler - or - // server.ext('/', fun) - this.getMethodName() = "ext" and - handler = this.getArgument(1) - or - // server.route([{ handler(request){}]) - this.getMethodName() = "route" and - handler = - this.getArgument(0) - .getALocalSource() - .(DataFlow::ArrayCreationNode) - .getAnElement() - .getALocalSource() - .getAPropertySource("handler") - .getAFunctionValue() - ) + this.getMethodName() = ["route", "ext"] } override DataFlow::SourceNode getARouteHandler() { @@ -233,11 +218,45 @@ module Hapi { t.start() and result = this.getRouteHandler().getALocalSource() or - exists(DataFlow::TypeBackTracker t2 | result = this.getARouteHandler(t2).backtrack(t2, t)) + this.getMethodName() = "route" and + t.isInProp("handler") and + result = this.getArgument(0).getALocalSource() + or + exists(DataFlow::TypeBackTracker t2, DataFlow::SourceNode succ | + succ = this.getARouteHandler(t2) + | + result = succ.backtrack(t2, t) + or + Http::routeHandlerStep(result, succ) and + t = t2 + or + DataFlow::SharedFlowStep::storeStep(result.getALocalUse(), succ, + DataFlow::PseudoProperties::arrayElement()) and + t = t2.continue() + ) } pragma[noinline] - private DataFlow::Node getRouteHandler() { result = handler } + private DataFlow::Node getRouteHandler() { + // server.route({ handler: fun }) + this.getMethodName() = "route" and + this.getOptionArgument(0, "handler") = result + or + // server.ext('/', fun) + this.getMethodName() = "ext" and + result = this.getArgument(1) + or + // server.route([{ handler(request){}]) + this.getMethodName() = "route" and + result = + this.getArgument(0) + .getALocalSource() + .(DataFlow::ArrayCreationNode) + .getAnElement() + .getALocalSource() + .getAPropertySource("handler") + .getAFunctionValue() + } override DataFlow::Node getServer() { result = server } } @@ -263,6 +282,56 @@ module Hapi { } } + private DataFlow::SourceNode routeDefinitionRef( + DataFlow::ObjectLiteralNode definition, DataFlow::TypeTracker t + ) { + t.start() and + result = definition + or + exists(DataFlow::TypeTracker t2 | result = routeDefinitionRef(definition, t2).track(t2, t)) + } + + private predicate handlerRegistration( + DataFlow::FunctionNode handler, DataFlow::ObjectLiteralNode definition + ) { + exists( + DataFlow::CallNode registration, DataFlow::FunctionNode registrar, + DataFlow::ParameterNode handlerParameter, DataFlow::SourceNode handlerRef, int index + | + registration.getACallee() = registrar.getFunction() and + handlerParameter = registrar.getParameter(index) and + handlerParameter.flowsTo(definition.getAPropertyWrite("handler").getRhs()) and + ( + handlerRef = handler + or + handlerRef = CallGraph::callgraphStep(handler, DataFlow::TypeTracker::end()) + ) and + handlerRef.flowsTo(registration.getArgument(index)) + ) + } + + /** Data flow through handlers stored in route definitions by registration helpers. */ + private class RegisteredHandlerCallStep extends DataFlow::SharedFlowStep { + DataFlow::CallNode call; + DataFlow::FunctionNode handler; + + RegisteredHandlerCallStep() { + exists(DataFlow::ObjectLiteralNode definition, DataFlow::PropRead handlerRead | + handlerRegistration(handler, definition) and + handlerRead.getPropertyName() = "handler" and + routeDefinitionRef(definition, DataFlow::TypeTracker::end()).flowsTo(handlerRead.getBase()) and + call.getCalleeNode() = handlerRead + ) + } + + override predicate step(DataFlow::Node pred, DataFlow::Node succ) { + exists(int index | + pred = call.getArgument(index) and + succ = handler.getParameter(index) + ) + } + } + /** * A function that looks like a Hapi route handler and flows to a route setup. */ diff --git a/javascript/ql/test/library-tests/frameworks/hapi/WrappedRouteFlow.qll b/javascript/ql/test/library-tests/frameworks/hapi/WrappedRouteFlow.qll new file mode 100644 index 000000000000..ccefa38e4f0d --- /dev/null +++ b/javascript/ql/test/library-tests/frameworks/hapi/WrappedRouteFlow.qll @@ -0,0 +1,15 @@ +import javascript + +module WrappedRouteConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof Http::RequestInputAccess } + + predicate isSink(DataFlow::Node sink) { + sink = DataFlow::globalVarRef("sink").getACall().getArgument(0) + } +} + +module WrappedRouteTaint = TaintTracking::Global; + +query predicate test_WrappedRouteFlow(DataFlow::Node source, DataFlow::Node sink) { + WrappedRouteTaint::flow(source, sink) +} \ No newline at end of file diff --git a/javascript/ql/test/library-tests/frameworks/hapi/src/wrapped-route.js b/javascript/ql/test/library-tests/frameworks/hapi/src/wrapped-route.js new file mode 100644 index 000000000000..15dc1ab26c16 --- /dev/null +++ b/javascript/ql/test/library-tests/frameworks/hapi/src/wrapped-route.js @@ -0,0 +1,42 @@ +const Hapi = require("hapi"); + +const endpoints = []; + +function endpoint(handler) { + endpoints.push({ handler }); +} + +function routeConfig(handler) { + return { + handler: async function (request, h) { + return handler(request.query); + }, + }; +} + +function createCached(fn) { + return async function (...args) { + return fn(...args); + }; +} + +const cached = createCached(function (filter) { + sink(filter); +}); + +class Routes { + get(query) { + return cached(query.filter); + } +} + +endpoint(Routes.prototype.get); + +function register(server, instance) { + for (const definition of endpoints) { + const wrapped = async (query) => definition.handler.call(instance, query); + server.route(routeConfig(wrapped)); + } +} + +register(new Hapi.Server(), new Routes()); \ No newline at end of file diff --git a/javascript/ql/test/library-tests/frameworks/hapi/tests.expected b/javascript/ql/test/library-tests/frameworks/hapi/tests.expected index 730bae77bf93..b896db8ed294 100644 --- a/javascript/ql/test/library-tests/frameworks/hapi/tests.expected +++ b/javascript/ql/test/library-tests/frameworks/hapi/tests.expected @@ -14,6 +14,7 @@ test_RouteSetup | src/hapihapi.js:17:1:18:2 | server2 ... dler\\n}) | | src/hapihapi.js:29:1:29:20 | server2.route(route) | | src/hapihapi.js:36:1:36:38 | server2 ... ler()}) | +| src/wrapped-route.js:38:5:38:38 | server. ... apped)) | test_RequestExpr | src/hapi.js:13:32:13:38 | request | src/hapi.js:13:14:15:5 | functio ... n\\n } | | src/hapi.js:13:32:13:38 | request | src/hapi.js:13:14:15:5 | functio ... n\\n } | @@ -56,6 +57,9 @@ test_RequestExpr | src/hapihapi.js:25:3:25:9 | request | src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapihapi.js:26:3:26:9 | request | src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapihapi.js:34:22:34:24 | req | src/hapihapi.js:34:12:34:30 | function (req, h){} | +| src/wrapped-route.js:11:30:11:36 | request | src/wrapped-route.js:11:14:13:5 | async f ... ;\\n } | +| src/wrapped-route.js:11:30:11:36 | request | src/wrapped-route.js:11:14:13:5 | async f ... ;\\n } | +| src/wrapped-route.js:12:22:12:28 | request | src/wrapped-route.js:11:14:13:5 | async f ... ;\\n } | test_HeaderAccess | src/hapi.js:25:3:25:21 | request.headers.baz | baz | | src/hapiglue.js:27:3:27:21 | request.headers.baz | baz | @@ -80,6 +84,7 @@ test_RouteHandler | src/hapihapi.js:17:30:18:1 | functio ... ndler\\n} | src/hapihapi.js:4:15:4:31 | new Hapi.Server() | | src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapihapi.js:4:15:4:31 | new Hapi.Server() | | src/hapihapi.js:34:12:34:30 | function (req, h){} | src/hapihapi.js:4:15:4:31 | new Hapi.Server() | +| src/wrapped-route.js:11:14:13:5 | async f ... ;\\n } | src/wrapped-route.js:42:10:42:26 | new Hapi.Server() | test_HeaderDefinition | src/hapi.js:14:9:14:46 | request ... 1', '') | src/hapi.js:13:14:15:5 | functio ... n\\n } | | src/hapiglue.js:14:9:14:46 | request ... 1', '') | src/hapiglue.js:13:14:15:5 | functio ... n\\n } | @@ -93,6 +98,7 @@ test_ServerDefinition | src/hapiglue.js:44:45:44:51 | server_ | | src/hapihapi.js:1:15:1:50 | new (re ... erver() | | src/hapihapi.js:4:15:4:31 | new Hapi.Server() | +| src/wrapped-route.js:42:10:42:26 | new Hapi.Server() | test_RequestInputAccess | src/hapi.js:21:3:21:20 | request.rawPayload | body | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapi.js:22:3:22:21 | request.payload.foo | body | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | @@ -114,6 +120,7 @@ test_RequestInputAccess | src/hapihapi.js:24:3:24:18 | request.url.path | url | src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapihapi.js:25:3:25:21 | request.headers.baz | header | src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapihapi.js:26:3:26:21 | request.state.token | cookie | src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} | +| src/wrapped-route.js:12:22:12:34 | request.query | parameter | src/wrapped-route.js:11:14:13:5 | async f ... ;\\n } | test_RouteSetup_getServer | src/hapi.js:7:1:9:2 | server2 ... ler1\\n}) | src/hapi.js:4:15:4:31 | new Hapi.Server() | | src/hapi.js:12:1:15:7 | server2 ... }}) | src/hapi.js:4:15:4:31 | new Hapi.Server() | @@ -130,6 +137,7 @@ test_RouteSetup_getServer | src/hapihapi.js:17:1:18:2 | server2 ... dler\\n}) | src/hapihapi.js:4:15:4:31 | new Hapi.Server() | | src/hapihapi.js:29:1:29:20 | server2.route(route) | src/hapihapi.js:4:15:4:31 | new Hapi.Server() | | src/hapihapi.js:36:1:36:38 | server2 ... ler()}) | src/hapihapi.js:4:15:4:31 | new Hapi.Server() | +| src/wrapped-route.js:38:5:38:38 | server. ... apped)) | src/wrapped-route.js:42:10:42:26 | new Hapi.Server() | test_HeaderDefinition_defines | src/hapi.js:14:9:14:46 | request ... 1', '') | header1 | | | src/hapiglue.js:14:9:14:46 | request ... 1', '') | header1 | | @@ -156,6 +164,7 @@ test_RouteSetup_getARouteHandler | src/hapihapi.js:36:1:36:38 | server2 ... ler()}) | src/hapihapi.js:33:1:35:1 | return of function getHandler | | src/hapihapi.js:36:1:36:38 | server2 ... ler()}) | src/hapihapi.js:34:12:34:30 | function (req, h){} | | src/hapihapi.js:36:1:36:38 | server2 ... ler()}) | src/hapihapi.js:36:25:36:36 | getHandler() | +| src/wrapped-route.js:38:5:38:38 | server. ... apped)) | src/wrapped-route.js:11:14:13:5 | async f ... ;\\n } | test_RouteHandler_getARequestExpr | src/hapi.js:13:14:15:5 | functio ... n\\n } | src/hapi.js:13:32:13:38 | request | | src/hapi.js:13:14:15:5 | functio ... n\\n } | src/hapi.js:13:32:13:38 | request | @@ -198,6 +207,9 @@ test_RouteHandler_getARequestExpr | src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapihapi.js:25:3:25:9 | request | | src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapihapi.js:26:3:26:9 | request | | src/hapihapi.js:34:12:34:30 | function (req, h){} | src/hapihapi.js:34:22:34:24 | req | +| src/wrapped-route.js:11:14:13:5 | async f ... ;\\n } | src/wrapped-route.js:11:30:11:36 | request | +| src/wrapped-route.js:11:14:13:5 | async f ... ;\\n } | src/wrapped-route.js:11:30:11:36 | request | +| src/wrapped-route.js:11:14:13:5 | async f ... ;\\n } | src/wrapped-route.js:12:22:12:28 | request | test_HeaderDefinition_getAHeaderName | src/hapi.js:14:9:14:46 | request ... 1', '') | header1 | | src/hapiglue.js:14:9:14:46 | request ... 1', '') | header1 | @@ -206,3 +218,5 @@ test_RouteHandler_getAResponseHeader | src/hapi.js:13:14:15:5 | functio ... n\\n } | header1 | src/hapi.js:14:9:14:46 | request ... 1', '') | | src/hapiglue.js:13:14:15:5 | functio ... n\\n } | header1 | src/hapiglue.js:14:9:14:46 | request ... 1', '') | | src/hapihapi.js:13:14:15:5 | functio ... n\\n } | header1 | src/hapihapi.js:14:9:14:46 | request ... 1', '') | +test_WrappedRouteFlow +| src/wrapped-route.js:12:22:12:34 | request.query | src/wrapped-route.js:24:8:24:13 | filter | diff --git a/javascript/ql/test/library-tests/frameworks/hapi/tests.ql b/javascript/ql/test/library-tests/frameworks/hapi/tests.ql index 396381b2b239..541c165d5e7f 100644 --- a/javascript/ql/test/library-tests/frameworks/hapi/tests.ql +++ b/javascript/ql/test/library-tests/frameworks/hapi/tests.ql @@ -12,3 +12,4 @@ import RouteSetup_getARouteHandler import RouteHandler import RequestExpr import RouteHandler_getARequestExpr +import WrappedRouteFlow From dbdd8b49a70889f17a9318c4b4c13b2cbd00a0c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jack=20N=C3=B8rskov=20J=C3=B8rgensen?= Date: Tue, 8 Sep 2026 10:43:03 +0000 Subject: [PATCH 0739/2098] Address lint issue --- .../ql/test/library-tests/frameworks/hapi/WrappedRouteFlow.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javascript/ql/test/library-tests/frameworks/hapi/WrappedRouteFlow.qll b/javascript/ql/test/library-tests/frameworks/hapi/WrappedRouteFlow.qll index ccefa38e4f0d..930167bd9cc7 100644 --- a/javascript/ql/test/library-tests/frameworks/hapi/WrappedRouteFlow.qll +++ b/javascript/ql/test/library-tests/frameworks/hapi/WrappedRouteFlow.qll @@ -12,4 +12,4 @@ module WrappedRouteTaint = TaintTracking::Global; query predicate test_WrappedRouteFlow(DataFlow::Node source, DataFlow::Node sink) { WrappedRouteTaint::flow(source, sink) -} \ No newline at end of file +} From 39ffd10d355c0086b35b5b0aed590772574541ae Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 8 Sep 2026 11:44:34 +0000 Subject: [PATCH 0740/2098] Include elided tokens in yeast ranges Co-authored-by: aschackmull <28296824+aschackmull@users.noreply.github.com> --- shared/yeast/src/lib.rs | 31 ++++++++++++++++++++++++++++--- shared/yeast/tests/test.rs | 25 +++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 3 deletions(-) diff --git a/shared/yeast/src/lib.rs b/shared/yeast/src/lib.rs index 94f75faa4763..cba96367ce05 100644 --- a/shared/yeast/src/lib.rs +++ b/shared/yeast/src/lib.rs @@ -571,11 +571,17 @@ impl Ast { let source_range = match &content { // Parsed nodes already carry an exact source range in their content. NodeContent::Range(_) => source_range, - // Synthesized nodes derive location from children when possible, - // and fall back to the inherited rule-match range otherwise. + // Synthesized nodes derive location from both their children and + // the inherited rule-match range, so tokens matched by a rule but + // elided from its output still contribute to the replacement range. _ => self .union_source_range_of_children(&fields) - .or(source_range), + .map_or(source_range, |child_range| { + Some(match source_range { + Some(source_range) => union_source_ranges(child_range, source_range), + None => child_range, + }) + }), }; let id = self.nodes.len(); self.nodes.push(Node { @@ -766,6 +772,25 @@ impl Ast { } } +fn union_source_ranges(first: Range, second: Range) -> Range { + let (start_byte, start_point) = if first.start_byte <= second.start_byte { + (first.start_byte, first.start_point) + } else { + (second.start_byte, second.start_point) + }; + let (end_byte, end_point) = if first.end_byte >= second.end_byte { + (first.end_byte, first.end_point) + } else { + (second.end_byte, second.end_point) + }; + Range { + start_byte, + end_byte, + start_point, + end_point, + } +} + /// A node in our AST #[derive(PartialEq, Eq, Debug, Clone, Serialize)] pub struct Node { diff --git a/shared/yeast/tests/test.rs b/shared/yeast/tests/test.rs index 60ed8afe84dd..bc2417ce2ecf 100644 --- a/shared/yeast/tests/test.rs +++ b/shared/yeast/tests/test.rs @@ -1663,6 +1663,31 @@ fn test_hash_brace_uses_capture_location_for_leaf() { assert_eq!(bar.end_byte(), 7); } +/// Regression test: tokens matched by a rule but elided from the output still +/// contribute to the source location of the synthesized replacement node. +#[test] +fn test_elided_tokens_contribute_to_replacement_location() { + let rule: Rule = rule!( + (call + method: (identifier) @name + receiver: (identifier) @recv + ) + => + (call + method: {name} + ) + ); + + let ast = run_and_ast("foo.bar()", vec![rule]); + let root = ast.get_node(ast.get_root()).unwrap(); + let stmt_field = ast.field_id_for_name("stmt").unwrap(); + let call_id = root.field_children(stmt_field)[0]; + let call = ast.get_node(call_id).unwrap(); + + assert_eq!(call.start_byte(), 0); + assert_eq!(call.end_byte(), 7); +} + // ---- `rules!` macro tests (compile-time type-checking) ---- /// `rules!` should accept well-typed rules using the bare-rule-body From 496cd17fca66e5aea4f8b4bb60d4ff4dddd67d66 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 8 Sep 2026 11:45:55 +0000 Subject: [PATCH 0741/2098] Fix yeast elided token regression test Co-authored-by: aschackmull <28296824+aschackmull@users.noreply.github.com> --- shared/yeast/tests/test.rs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/shared/yeast/tests/test.rs b/shared/yeast/tests/test.rs index bc2417ce2ecf..35393685b5ca 100644 --- a/shared/yeast/tests/test.rs +++ b/shared/yeast/tests/test.rs @@ -1679,13 +1679,21 @@ fn test_elided_tokens_contribute_to_replacement_location() { ); let ast = run_and_ast("foo.bar()", vec![rule]); - let root = ast.get_node(ast.get_root()).unwrap(); - let stmt_field = ast.field_id_for_name("stmt").unwrap(); - let call_id = root.field_children(stmt_field)[0]; + let call_ids: Vec = ast + .reachable_node_ids() + .into_iter() + .filter(|&id| { + ast.get_node(id) + .is_some_and(|node| node.kind_name() == "call") + }) + .collect(); + + assert_eq!(call_ids.len(), 1, "expected exactly one reachable call"); + let call_id = call_ids[0]; let call = ast.get_node(call_id).unwrap(); assert_eq!(call.start_byte(), 0); - assert_eq!(call.end_byte(), 7); + assert_eq!(call.end_byte(), 9); } // ---- `rules!` macro tests (compile-time type-checking) ---- From eb85858f080204521fc037131f26b8020a5fe5f3 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Tue, 8 Sep 2026 08:43:57 -0400 Subject: [PATCH 0742/2098] chore: applies renamed caused by main renames --- csharp/ql/lib/Linq/Helpers.qll | 6 +++--- csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.ql | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/csharp/ql/lib/Linq/Helpers.qll b/csharp/ql/lib/Linq/Helpers.qll index 3601cd404d5a..052b5fe6c2e6 100644 --- a/csharp/ql/lib/Linq/Helpers.qll +++ b/csharp/ql/lib/Linq/Helpers.qll @@ -20,7 +20,7 @@ private int numStmts(ForEachStmt fes) { else result = 1 } -private predicate returnsLoopVariable(ForeachStmt fes, Stmt s) { +private predicate returnsLoopVariable(ForEachStmt fes, Stmt s) { exists(ReturnStmt ret | ret = s.stripSingletonBlocks() and ret.getExpr().stripImplicit().(VariableAccess).getTarget() = fes.getVariable() @@ -29,7 +29,7 @@ private predicate returnsLoopVariable(ForeachStmt fes, Stmt s) { private predicate hasNullDefault(Type t) { t.isRefType() or t instanceof NullableType } -private predicate returnsDefaultValueAfterForeach(ForeachStmt fes) { +private predicate returnsDefaultValueAfterForeach(ForEachStmt fes) { exists(BlockStmt enclosingBlock, int i, Type elementType, ReturnStmt ret | enclosingBlock.getStmt(i) = fes and enclosingBlock.getStmt(i + 1) = ret and @@ -218,7 +218,7 @@ predicate missedWhereOpportunity(ForEachStmtGenericEnumerable fes, IfStmt is) { * That is, the loop contains a single `if` statement that accesses the loop variable, * returns the loop variable when the condition matches, and is followed by a default return. */ -predicate missedFirstOrDefaultOpportunity(ForeachStmtGenericEnumerable fes, IfStmt is) { +predicate missedFirstOrDefaultOpportunity(ForEachStmtGenericEnumerable fes, IfStmt is) { // The loop only checks whether the current element is the first match. is = firstStmt(fes) and not exists(is.getElse()) and diff --git a/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.ql b/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.ql index 705881a73bdf..286b653979e3 100644 --- a/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.ql +++ b/csharp/ql/src/Linq/MissedFirstOrDefaultOpportunity.ql @@ -15,7 +15,7 @@ import csharp import Linq.Helpers -from ForeachStmtGenericEnumerable fes, IfStmt is +from ForEachStmtGenericEnumerable fes, IfStmt is where missedFirstOrDefaultOpportunity(fes, is) select fes, "This foreach loop returns the first sequence element satisfying a $@ - consider finding the element explicitly using '.FirstOrDefault(...)'.", From 75837fc2225375d204f8d70972f2c77fdc0a2be6 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 8 Sep 2026 13:06:54 +0100 Subject: [PATCH 0743/2098] C++: Add tests with missing flow. --- .../dataflow/external-models/asio_streams.cpp | 79 ++++++++++++++++++- .../dataflow/external-models/flow.expected | 36 ++++----- .../dataflow/external-models/sinks.expected | 4 +- .../dataflow/external-models/sources.expected | 2 +- .../dataflow/external-models/steps.expected | 2 +- 5 files changed, 98 insertions(+), 25 deletions(-) diff --git a/cpp/ql/test/library-tests/dataflow/external-models/asio_streams.cpp b/cpp/ql/test/library-tests/dataflow/external-models/asio_streams.cpp index 401091122b8e..11f081981fb3 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/asio_streams.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/asio_streams.cpp @@ -18,6 +18,11 @@ namespace std { }; typedef basic_string string; + + class string_view { + public: + string_view(const char* s); + }; }; namespace boost { @@ -29,14 +34,50 @@ namespace boost { }; namespace asio { - template - class basic_stream_socket /*: public basic_socket*/ { - }; + class any_io_executor { }; + + class socket_base { }; + + template + class basic_socket : public socket_base { }; + + template + class basic_stream_socket : public basic_socket { }; namespace ip { + class resolver_base { + public: + enum flags { passive = 1 }; + }; + + template + class basic_resolver { + public: + class results_type { + }; + + results_type resolve(const std::string &host, const std::string &service); + results_type resolve(const std::string &host, const std::string &service, boost::system::error_code &ec); + results_type resolve(const std::string &host, const std::string &service, resolver_base::flags resolve_flags); + results_type resolve(const std::string &host, const std::string &service, resolver_base::flags resolve_flags, boost::system::error_code &ec); + results_type resolve(std::string_view host, std::string_view service); + results_type resolve(std::string_view host, std::string_view service, boost::system::error_code &ec); + results_type resolve(std::string_view host, std::string_view service, resolver_base::flags resolve_flags); + results_type resolve(std::string_view host, std::string_view service, resolver_base::flags resolve_flags, boost::system::error_code &ec); + results_type resolve(const InternetProtocol &protocol, const std::string &host, const std::string &service); + results_type resolve(const InternetProtocol &protocol, const std::string &host, const std::string &service, boost::system::error_code &ec); + results_type resolve(const InternetProtocol &protocol, const std::string &host, const std::string &service, resolver_base::flags resolve_flags); + results_type resolve(const InternetProtocol &protocol, const std::string &host, const std::string &service, resolver_base::flags resolve_flags, boost::system::error_code &ec); + results_type resolve(const InternetProtocol &protocol, std::string_view host, std::string_view service); + results_type resolve(const InternetProtocol &protocol, std::string_view host, std::string_view service, boost::system::error_code &ec); + results_type resolve(const InternetProtocol &protocol, std::string_view host, std::string_view service, resolver_base::flags resolve_flags); + results_type resolve(const InternetProtocol &protocol, std::string_view host, std::string_view service, resolver_base::flags resolve_flags, boost::system::error_code &ec); + }; + class tcp { public: typedef basic_stream_socket socket; + typedef basic_resolver resolver; }; }; @@ -76,6 +117,7 @@ void sink(char *); void sink(std::string); void sink(boost::asio::streambuf); void sink(boost::asio::mutable_buffer); +void sink(boost::asio::ip::tcp::resolver::results_type); char *getenv(const char *name); int send(int, const void*, int, int); @@ -105,3 +147,34 @@ void test(boost::asio::ip::tcp::socket &socket) { // ... } } + +void test_resolve() { + boost::asio::ip::tcp::resolver resolver; + boost::asio::ip::tcp protocol; + boost::asio::ip::resolver_base::flags flags = boost::asio::ip::resolver_base::passive; + boost::system::error_code error; + std::string host(source()); + std::string service(""); + std::string_view host_view(source()); + std::string_view service_view(""); + + sink(resolver.resolve(host, service)); // $ MISSING: ir + sink(resolver.resolve(host, service, error)); // $ MISSING: ir + sink(resolver.resolve(host, service, flags)); // $ MISSING: ir + sink(resolver.resolve(host, service, flags, error)); // $ MISSING: ir + + sink(resolver.resolve(host_view, service_view)); // $ MISSING: ir + sink(resolver.resolve(host_view, service_view, error)); // $ MISSING: ir + sink(resolver.resolve(host_view, service_view, flags)); // $ MISSING: ir + sink(resolver.resolve(host_view, service_view, flags, error)); // $ MISSING: ir + + sink(resolver.resolve(protocol, host, service)); // $ MISSING: ir + sink(resolver.resolve(protocol, host, service, error)); // $ MISSING: ir + sink(resolver.resolve(protocol, host, service, flags)); // $ MISSING: ir + sink(resolver.resolve(protocol, host, service, flags, error)); // $ MISSING: ir + + sink(resolver.resolve(protocol, host_view, service_view)); // $ MISSING: ir + sink(resolver.resolve(protocol, host_view, service_view, error)); // $ MISSING: ir + sink(resolver.resolve(protocol, host_view, service_view, flags)); // $ MISSING: ir + sink(resolver.resolve(protocol, host_view, service_view, flags, error)); // $ MISSING: ir +} diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index 65817b549a90..26c6432acd56 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -104,14 +104,14 @@ models | 103 | Summary: BloombergLP::bdlbb; BlobUtil; true; getContiguousRangeOrCopy; ; ; Argument[*1]; ReturnValue[*]; taint; manual | | 104 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | edges -| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:91:7:91:17 | recv_buffer | provenance | Src:MaD:56 | -| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:93:29:93:39 | recv_buffer | provenance | Src:MaD:56 Sink:MaD:4 | -| asio_streams.cpp:97:37:97:44 | call to source | asio_streams.cpp:98:7:98:14 | send_str | provenance | TaintFunction | -| asio_streams.cpp:97:37:97:44 | call to source | asio_streams.cpp:100:64:100:71 | *send_str | provenance | TaintFunction | -| asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | | -| asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:101:7:101:17 | send_buffer | provenance | | -| asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:103:29:103:39 | send_buffer | provenance | Sink:MaD:4 | -| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:104 | +| asio_streams.cpp:129:34:129:44 | read_until output argument | asio_streams.cpp:133:7:133:17 | recv_buffer | provenance | Src:MaD:56 | +| asio_streams.cpp:129:34:129:44 | read_until output argument | asio_streams.cpp:135:29:135:39 | recv_buffer | provenance | Src:MaD:56 Sink:MaD:4 | +| asio_streams.cpp:139:37:139:44 | call to source | asio_streams.cpp:140:7:140:14 | send_str | provenance | TaintFunction | +| asio_streams.cpp:139:37:139:44 | call to source | asio_streams.cpp:142:64:142:71 | *send_str | provenance | TaintFunction | +| asio_streams.cpp:142:44:142:62 | call to buffer | asio_streams.cpp:142:44:142:62 | call to buffer | provenance | | +| asio_streams.cpp:142:44:142:62 | call to buffer | asio_streams.cpp:143:7:143:17 | send_buffer | provenance | | +| asio_streams.cpp:142:44:142:62 | call to buffer | asio_streams.cpp:145:29:145:39 | send_buffer | provenance | Sink:MaD:4 | +| asio_streams.cpp:142:64:142:71 | *send_str | asio_streams.cpp:142:44:142:62 | call to buffer | provenance | MaD:104 | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:257:5:257:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:262:5:262:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:266:38:266:41 | *resp | provenance | | @@ -526,16 +526,16 @@ edges | windows.cpp:1172:21:1172:24 | *guid | windows.cpp:1172:27:1172:29 | StringFromGUID2 output argument | provenance | MaD:76 | | windows.cpp:1172:27:1172:29 | StringFromGUID2 output argument | windows.cpp:1174:10:1174:13 | * ... | provenance | | nodes -| asio_streams.cpp:87:34:87:44 | read_until output argument | semmle.label | read_until output argument | -| asio_streams.cpp:91:7:91:17 | recv_buffer | semmle.label | recv_buffer | -| asio_streams.cpp:93:29:93:39 | recv_buffer | semmle.label | recv_buffer | -| asio_streams.cpp:97:37:97:44 | call to source | semmle.label | call to source | -| asio_streams.cpp:98:7:98:14 | send_str | semmle.label | send_str | -| asio_streams.cpp:100:44:100:62 | call to buffer | semmle.label | call to buffer | -| asio_streams.cpp:100:44:100:62 | call to buffer | semmle.label | call to buffer | -| asio_streams.cpp:100:64:100:71 | *send_str | semmle.label | *send_str | -| asio_streams.cpp:101:7:101:17 | send_buffer | semmle.label | send_buffer | -| asio_streams.cpp:103:29:103:39 | send_buffer | semmle.label | send_buffer | +| asio_streams.cpp:129:34:129:44 | read_until output argument | semmle.label | read_until output argument | +| asio_streams.cpp:133:7:133:17 | recv_buffer | semmle.label | recv_buffer | +| asio_streams.cpp:135:29:135:39 | recv_buffer | semmle.label | recv_buffer | +| asio_streams.cpp:139:37:139:44 | call to source | semmle.label | call to source | +| asio_streams.cpp:140:7:140:14 | send_str | semmle.label | send_str | +| asio_streams.cpp:142:44:142:62 | call to buffer | semmle.label | call to buffer | +| asio_streams.cpp:142:44:142:62 | call to buffer | semmle.label | call to buffer | +| asio_streams.cpp:142:64:142:71 | *send_str | semmle.label | *send_str | +| asio_streams.cpp:143:7:143:17 | send_buffer | semmle.label | send_buffer | +| asio_streams.cpp:145:29:145:39 | send_buffer | semmle.label | send_buffer | | azure.cpp:253:48:253:60 | *call to GetBodyStream | semmle.label | *call to GetBodyStream | | azure.cpp:253:48:253:60 | call to GetBodyStream | semmle.label | call to GetBodyStream | | azure.cpp:257:5:257:8 | *resp | semmle.label | *resp | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected index 5851e825013d..f3423b983053 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected @@ -1,5 +1,5 @@ -| asio_streams.cpp:93:29:93:39 | recv_buffer | remote-sink | -| asio_streams.cpp:103:29:103:39 | send_buffer | remote-sink | +| asio_streams.cpp:135:29:135:39 | recv_buffer | remote-sink | +| asio_streams.cpp:145:29:145:39 | send_buffer | remote-sink | | test.cpp:12:10:12:10 | 0 | test-sink | | test.cpp:14:10:14:10 | x | test-sink | | test.cpp:18:10:18:10 | y | test-sink | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected index b30f1e88b99a..6f1b889e2bb8 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected @@ -1,4 +1,4 @@ -| asio_streams.cpp:87:34:87:44 | read_until output argument | remote | +| asio_streams.cpp:129:34:129:44 | read_until output argument | remote | | azure.cpp:253:48:253:60 | call to GetBodyStream | remote | | azure.cpp:273:52:273:61 | call to GetHeaders | remote | | azure.cpp:277:38:277:44 | call to GetBody | remote | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/steps.expected b/cpp/ql/test/library-tests/dataflow/external-models/steps.expected index 42d2c0183c34..a556f8d27d8a 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/steps.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/steps.expected @@ -1,4 +1,4 @@ -| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | +| asio_streams.cpp:142:64:142:71 | *send_str | asio_streams.cpp:142:44:142:62 | call to buffer | | azure.cpp:252:79:252:98 | call to string | azure.cpp:252:62:252:99 | call to Url | | azure.cpp:257:5:257:8 | *resp | azure.cpp:257:16:257:21 | Read output argument | | azure.cpp:262:5:262:8 | *resp | azure.cpp:262:23:262:28 | ReadToCount output argument | From d42e432d149ae36fedbeef2126cd976c954d5273 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 8 Sep 2026 13:07:11 +0100 Subject: [PATCH 0744/2098] C++: Add models for boost::asio::ip's resolve function. --- cpp/ql/lib/ext/Boost.Asio.model.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/cpp/ql/lib/ext/Boost.Asio.model.yml b/cpp/ql/lib/ext/Boost.Asio.model.yml index f6ba957d2596..7f18bf170f84 100644 --- a/cpp/ql/lib/ext/Boost.Asio.model.yml +++ b/cpp/ql/lib/ext/Boost.Asio.model.yml @@ -23,3 +23,19 @@ extensions: extensible: summaryModel data: # namespace, type, subtypes, name, signature, ext, input, output, kind, provenance - ["boost::asio", "", False, "buffer", "", "", "Argument[*0]", "ReturnValue", "taint", "manual"] + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const string &,const string &)", "", "Argument[*0]", "ReturnValue", "taint", "manual"] + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const string &,const string &,error_code &)", "", "Argument[*0]", "ReturnValue", "taint", "manual"] + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const string &,const string &,flags)", "", "Argument[*0]", "ReturnValue", "taint", "manual"] + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const string &,const string &,flags,error_code &)", "", "Argument[*0]", "ReturnValue", "taint", "manual"] + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(string_view,string_view)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(string_view,string_view,error_code &)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(string_view,string_view,flags)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(string_view,string_view,flags,error_code &)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const InternetProtocol &,const string &,const string &)", "", "Argument[*1]", "ReturnValue", "taint", "manual"] + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const InternetProtocol &,const string &,const string &,error_code &)", "", "Argument[*1]", "ReturnValue", "taint", "manual"] + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const InternetProtocol &,const string &,const string &,flags)", "", "Argument[*1]", "ReturnValue", "taint", "manual"] + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const InternetProtocol &,const string &,const string &,flags,error_code &)", "", "Argument[*1]", "ReturnValue", "taint", "manual"] + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const InternetProtocol &,string_view,string_view)", "", "Argument[1]", "ReturnValue", "taint", "manual"] + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const InternetProtocol &,string_view,string_view,error_code &)", "", "Argument[1]", "ReturnValue", "taint", "manual"] + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const InternetProtocol &,string_view,string_view,flags)", "", "Argument[1]", "ReturnValue", "taint", "manual"] + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const InternetProtocol &,string_view,string_view,flags,error_code &)", "", "Argument[1]", "ReturnValue", "taint", "manual"] \ No newline at end of file From 79d7ef21bffd7ee16c40edfdb7cefc93511f0a09 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 8 Sep 2026 13:07:29 +0100 Subject: [PATCH 0745/2098] C++: Accept test changes. --- .../dataflow/external-models/asio_streams.cpp | 38 ++++---- .../dataflow/external-models/flow.expected | 86 ++++++++++++++++++- .../dataflow/external-models/steps.expected | 16 ++++ .../external-models/validatemodels.expected | 14 +++ .../taint-tests/test_mad-signatures.expected | 56 ++++++++++++ 5 files changed, 189 insertions(+), 21 deletions(-) diff --git a/cpp/ql/test/library-tests/dataflow/external-models/asio_streams.cpp b/cpp/ql/test/library-tests/dataflow/external-models/asio_streams.cpp index 11f081981fb3..3a3ab528d227 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/asio_streams.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/asio_streams.cpp @@ -158,23 +158,23 @@ void test_resolve() { std::string_view host_view(source()); std::string_view service_view(""); - sink(resolver.resolve(host, service)); // $ MISSING: ir - sink(resolver.resolve(host, service, error)); // $ MISSING: ir - sink(resolver.resolve(host, service, flags)); // $ MISSING: ir - sink(resolver.resolve(host, service, flags, error)); // $ MISSING: ir - - sink(resolver.resolve(host_view, service_view)); // $ MISSING: ir - sink(resolver.resolve(host_view, service_view, error)); // $ MISSING: ir - sink(resolver.resolve(host_view, service_view, flags)); // $ MISSING: ir - sink(resolver.resolve(host_view, service_view, flags, error)); // $ MISSING: ir - - sink(resolver.resolve(protocol, host, service)); // $ MISSING: ir - sink(resolver.resolve(protocol, host, service, error)); // $ MISSING: ir - sink(resolver.resolve(protocol, host, service, flags)); // $ MISSING: ir - sink(resolver.resolve(protocol, host, service, flags, error)); // $ MISSING: ir - - sink(resolver.resolve(protocol, host_view, service_view)); // $ MISSING: ir - sink(resolver.resolve(protocol, host_view, service_view, error)); // $ MISSING: ir - sink(resolver.resolve(protocol, host_view, service_view, flags)); // $ MISSING: ir - sink(resolver.resolve(protocol, host_view, service_view, flags, error)); // $ MISSING: ir + sink(resolver.resolve(host, service)); // $ ir + sink(resolver.resolve(host, service, error)); // $ ir + sink(resolver.resolve(host, service, flags)); // $ ir + sink(resolver.resolve(host, service, flags, error)); // $ ir + + sink(resolver.resolve(host_view, service_view)); // $ ir + sink(resolver.resolve(host_view, service_view, error)); // $ ir + sink(resolver.resolve(host_view, service_view, flags)); // $ ir + sink(resolver.resolve(host_view, service_view, flags, error)); // $ ir + + sink(resolver.resolve(protocol, host, service)); // $ ir + sink(resolver.resolve(protocol, host, service, error)); // $ ir + sink(resolver.resolve(protocol, host, service, flags)); // $ ir + sink(resolver.resolve(protocol, host, service, flags, error)); // $ ir + + sink(resolver.resolve(protocol, host_view, service_view)); // $ ir + sink(resolver.resolve(protocol, host_view, service_view, error)); // $ ir + sink(resolver.resolve(protocol, host_view, service_view, flags)); // $ ir + sink(resolver.resolve(protocol, host_view, service_view, flags, error)); // $ ir } diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index 26c6432acd56..fd0d9c700702 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -102,7 +102,23 @@ models | 101 | Summary: BloombergLP::bdlbb; BlobUtil; true; copy; (Blob *,int,const char *,int); ; Argument[*2]; Argument[*0]; taint; manual | | 102 | Summary: BloombergLP::bdlbb; BlobUtil; true; copy; (char *,const Blob &,int,int); ; Argument[*1]; Argument[*0]; taint; manual | | 103 | Summary: BloombergLP::bdlbb; BlobUtil; true; getContiguousRangeOrCopy; ; ; Argument[*1]; ReturnValue[*]; taint; manual | -| 104 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | +| 104 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,const string &,const string &); ; Argument[*1]; ReturnValue; taint; manual | +| 105 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,const string &,const string &,error_code &); ; Argument[*1]; ReturnValue; taint; manual | +| 106 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,const string &,const string &,flags); ; Argument[*1]; ReturnValue; taint; manual | +| 107 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,const string &,const string &,flags,error_code &); ; Argument[*1]; ReturnValue; taint; manual | +| 108 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,string_view,string_view); ; Argument[1]; ReturnValue; taint; manual | +| 109 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,string_view,string_view,error_code &); ; Argument[1]; ReturnValue; taint; manual | +| 110 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,string_view,string_view,flags); ; Argument[1]; ReturnValue; taint; manual | +| 111 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,string_view,string_view,flags,error_code &); ; Argument[1]; ReturnValue; taint; manual | +| 112 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const string &,const string &); ; Argument[*0]; ReturnValue; taint; manual | +| 113 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const string &,const string &,error_code &); ; Argument[*0]; ReturnValue; taint; manual | +| 114 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const string &,const string &,flags); ; Argument[*0]; ReturnValue; taint; manual | +| 115 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const string &,const string &,flags,error_code &); ; Argument[*0]; ReturnValue; taint; manual | +| 116 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view); ; Argument[0]; ReturnValue; taint; manual | +| 117 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view,error_code &); ; Argument[0]; ReturnValue; taint; manual | +| 118 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view,flags); ; Argument[0]; ReturnValue; taint; manual | +| 119 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view,flags,error_code &); ; Argument[0]; ReturnValue; taint; manual | +| 120 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | edges | asio_streams.cpp:129:34:129:44 | read_until output argument | asio_streams.cpp:133:7:133:17 | recv_buffer | provenance | Src:MaD:56 | | asio_streams.cpp:129:34:129:44 | read_until output argument | asio_streams.cpp:135:29:135:39 | recv_buffer | provenance | Src:MaD:56 Sink:MaD:4 | @@ -111,7 +127,39 @@ edges | asio_streams.cpp:142:44:142:62 | call to buffer | asio_streams.cpp:142:44:142:62 | call to buffer | provenance | | | asio_streams.cpp:142:44:142:62 | call to buffer | asio_streams.cpp:143:7:143:17 | send_buffer | provenance | | | asio_streams.cpp:142:44:142:62 | call to buffer | asio_streams.cpp:145:29:145:39 | send_buffer | provenance | Sink:MaD:4 | -| asio_streams.cpp:142:64:142:71 | *send_str | asio_streams.cpp:142:44:142:62 | call to buffer | provenance | MaD:104 | +| asio_streams.cpp:142:64:142:71 | *send_str | asio_streams.cpp:142:44:142:62 | call to buffer | provenance | MaD:120 | +| asio_streams.cpp:156:19:156:26 | call to source | asio_streams.cpp:161:24:161:27 | *host | provenance | TaintFunction | +| asio_streams.cpp:156:19:156:26 | call to source | asio_streams.cpp:162:24:162:27 | *host | provenance | TaintFunction | +| asio_streams.cpp:156:19:156:26 | call to source | asio_streams.cpp:163:24:163:27 | *host | provenance | TaintFunction | +| asio_streams.cpp:156:19:156:26 | call to source | asio_streams.cpp:164:24:164:27 | *host | provenance | TaintFunction | +| asio_streams.cpp:156:19:156:26 | call to source | asio_streams.cpp:171:34:171:37 | *host | provenance | TaintFunction | +| asio_streams.cpp:156:19:156:26 | call to source | asio_streams.cpp:172:34:172:37 | *host | provenance | TaintFunction | +| asio_streams.cpp:156:19:156:26 | call to source | asio_streams.cpp:173:34:173:37 | *host | provenance | TaintFunction | +| asio_streams.cpp:156:19:156:26 | call to source | asio_streams.cpp:174:34:174:37 | *host | provenance | TaintFunction | +| asio_streams.cpp:158:29:158:36 | call to source | asio_streams.cpp:166:24:166:32 | host_view | provenance | TaintFunction | +| asio_streams.cpp:158:29:158:36 | call to source | asio_streams.cpp:167:24:167:32 | host_view | provenance | TaintFunction | +| asio_streams.cpp:158:29:158:36 | call to source | asio_streams.cpp:168:24:168:32 | host_view | provenance | TaintFunction | +| asio_streams.cpp:158:29:158:36 | call to source | asio_streams.cpp:169:24:169:32 | host_view | provenance | TaintFunction | +| asio_streams.cpp:158:29:158:36 | call to source | asio_streams.cpp:176:34:176:42 | host_view | provenance | TaintFunction | +| asio_streams.cpp:158:29:158:36 | call to source | asio_streams.cpp:177:34:177:42 | host_view | provenance | TaintFunction | +| asio_streams.cpp:158:29:158:36 | call to source | asio_streams.cpp:178:34:178:42 | host_view | provenance | TaintFunction | +| asio_streams.cpp:158:29:158:36 | call to source | asio_streams.cpp:179:34:179:42 | host_view | provenance | TaintFunction | +| asio_streams.cpp:161:24:161:27 | *host | asio_streams.cpp:161:16:161:22 | call to resolve | provenance | MaD:112 | +| asio_streams.cpp:162:24:162:27 | *host | asio_streams.cpp:162:16:162:22 | call to resolve | provenance | MaD:113 | +| asio_streams.cpp:163:24:163:27 | *host | asio_streams.cpp:163:16:163:22 | call to resolve | provenance | MaD:114 | +| asio_streams.cpp:164:24:164:27 | *host | asio_streams.cpp:164:16:164:22 | call to resolve | provenance | MaD:115 | +| asio_streams.cpp:166:24:166:32 | host_view | asio_streams.cpp:166:16:166:22 | call to resolve | provenance | MaD:116 | +| asio_streams.cpp:167:24:167:32 | host_view | asio_streams.cpp:167:16:167:22 | call to resolve | provenance | MaD:117 | +| asio_streams.cpp:168:24:168:32 | host_view | asio_streams.cpp:168:16:168:22 | call to resolve | provenance | MaD:118 | +| asio_streams.cpp:169:24:169:32 | host_view | asio_streams.cpp:169:16:169:22 | call to resolve | provenance | MaD:119 | +| asio_streams.cpp:171:34:171:37 | *host | asio_streams.cpp:171:16:171:22 | call to resolve | provenance | MaD:104 | +| asio_streams.cpp:172:34:172:37 | *host | asio_streams.cpp:172:16:172:22 | call to resolve | provenance | MaD:105 | +| asio_streams.cpp:173:34:173:37 | *host | asio_streams.cpp:173:16:173:22 | call to resolve | provenance | MaD:106 | +| asio_streams.cpp:174:34:174:37 | *host | asio_streams.cpp:174:16:174:22 | call to resolve | provenance | MaD:107 | +| asio_streams.cpp:176:34:176:42 | host_view | asio_streams.cpp:176:16:176:22 | call to resolve | provenance | MaD:108 | +| asio_streams.cpp:177:34:177:42 | host_view | asio_streams.cpp:177:16:177:22 | call to resolve | provenance | MaD:109 | +| asio_streams.cpp:178:34:178:42 | host_view | asio_streams.cpp:178:16:178:22 | call to resolve | provenance | MaD:110 | +| asio_streams.cpp:179:34:179:42 | host_view | asio_streams.cpp:179:16:179:22 | call to resolve | provenance | MaD:111 | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:257:5:257:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:262:5:262:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:266:38:266:41 | *resp | provenance | | @@ -536,6 +584,40 @@ nodes | asio_streams.cpp:142:64:142:71 | *send_str | semmle.label | *send_str | | asio_streams.cpp:143:7:143:17 | send_buffer | semmle.label | send_buffer | | asio_streams.cpp:145:29:145:39 | send_buffer | semmle.label | send_buffer | +| asio_streams.cpp:156:19:156:26 | call to source | semmle.label | call to source | +| asio_streams.cpp:158:29:158:36 | call to source | semmle.label | call to source | +| asio_streams.cpp:161:16:161:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:161:24:161:27 | *host | semmle.label | *host | +| asio_streams.cpp:162:16:162:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:162:24:162:27 | *host | semmle.label | *host | +| asio_streams.cpp:163:16:163:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:163:24:163:27 | *host | semmle.label | *host | +| asio_streams.cpp:164:16:164:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:164:24:164:27 | *host | semmle.label | *host | +| asio_streams.cpp:166:16:166:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:166:24:166:32 | host_view | semmle.label | host_view | +| asio_streams.cpp:167:16:167:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:167:24:167:32 | host_view | semmle.label | host_view | +| asio_streams.cpp:168:16:168:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:168:24:168:32 | host_view | semmle.label | host_view | +| asio_streams.cpp:169:16:169:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:169:24:169:32 | host_view | semmle.label | host_view | +| asio_streams.cpp:171:16:171:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:171:34:171:37 | *host | semmle.label | *host | +| asio_streams.cpp:172:16:172:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:172:34:172:37 | *host | semmle.label | *host | +| asio_streams.cpp:173:16:173:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:173:34:173:37 | *host | semmle.label | *host | +| asio_streams.cpp:174:16:174:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:174:34:174:37 | *host | semmle.label | *host | +| asio_streams.cpp:176:16:176:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:176:34:176:42 | host_view | semmle.label | host_view | +| asio_streams.cpp:177:16:177:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:177:34:177:42 | host_view | semmle.label | host_view | +| asio_streams.cpp:178:16:178:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:178:34:178:42 | host_view | semmle.label | host_view | +| asio_streams.cpp:179:16:179:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:179:34:179:42 | host_view | semmle.label | host_view | | azure.cpp:253:48:253:60 | *call to GetBodyStream | semmle.label | *call to GetBodyStream | | azure.cpp:253:48:253:60 | call to GetBodyStream | semmle.label | call to GetBodyStream | | azure.cpp:257:5:257:8 | *resp | semmle.label | *resp | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/steps.expected b/cpp/ql/test/library-tests/dataflow/external-models/steps.expected index a556f8d27d8a..67c8c074a8ee 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/steps.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/steps.expected @@ -1,4 +1,20 @@ | asio_streams.cpp:142:64:142:71 | *send_str | asio_streams.cpp:142:44:142:62 | call to buffer | +| asio_streams.cpp:161:24:161:27 | *host | asio_streams.cpp:161:16:161:22 | call to resolve | +| asio_streams.cpp:162:24:162:27 | *host | asio_streams.cpp:162:16:162:22 | call to resolve | +| asio_streams.cpp:163:24:163:27 | *host | asio_streams.cpp:163:16:163:22 | call to resolve | +| asio_streams.cpp:164:24:164:27 | *host | asio_streams.cpp:164:16:164:22 | call to resolve | +| asio_streams.cpp:166:24:166:32 | host_view | asio_streams.cpp:166:16:166:22 | call to resolve | +| asio_streams.cpp:167:24:167:32 | host_view | asio_streams.cpp:167:16:167:22 | call to resolve | +| asio_streams.cpp:168:24:168:32 | host_view | asio_streams.cpp:168:16:168:22 | call to resolve | +| asio_streams.cpp:169:24:169:32 | host_view | asio_streams.cpp:169:16:169:22 | call to resolve | +| asio_streams.cpp:171:34:171:37 | *host | asio_streams.cpp:171:16:171:22 | call to resolve | +| asio_streams.cpp:172:34:172:37 | *host | asio_streams.cpp:172:16:172:22 | call to resolve | +| asio_streams.cpp:173:34:173:37 | *host | asio_streams.cpp:173:16:173:22 | call to resolve | +| asio_streams.cpp:174:34:174:37 | *host | asio_streams.cpp:174:16:174:22 | call to resolve | +| asio_streams.cpp:176:34:176:42 | host_view | asio_streams.cpp:176:16:176:22 | call to resolve | +| asio_streams.cpp:177:34:177:42 | host_view | asio_streams.cpp:177:16:177:22 | call to resolve | +| asio_streams.cpp:178:34:178:42 | host_view | asio_streams.cpp:178:16:178:22 | call to resolve | +| asio_streams.cpp:179:34:179:42 | host_view | asio_streams.cpp:179:16:179:22 | call to resolve | | azure.cpp:252:79:252:98 | call to string | azure.cpp:252:62:252:99 | call to Url | | azure.cpp:257:5:257:8 | *resp | azure.cpp:257:16:257:21 | Read output argument | | azure.cpp:262:5:262:8 | *resp | azure.cpp:262:23:262:28 | ReadToCount output argument | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/validatemodels.expected b/cpp/ql/test/library-tests/dataflow/external-models/validatemodels.expected index 1fbe5da66459..694427213c86 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/validatemodels.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/validatemodels.expected @@ -3350,6 +3350,14 @@ | Dubious signature "(const IPAddressRange *,unsigned char **)" in summary model. | | Dubious signature "(const ISSUER_SIGN_TOOL *,unsigned char **)" in summary model. | | Dubious signature "(const ISSUING_DIST_POINT *,unsigned char **)" in summary model. | +| Dubious signature "(const InternetProtocol &,const string &,const string &)" in summary model. | +| Dubious signature "(const InternetProtocol &,const string &,const string &,error_code &)" in summary model. | +| Dubious signature "(const InternetProtocol &,const string &,const string &,flags)" in summary model. | +| Dubious signature "(const InternetProtocol &,const string &,const string &,flags,error_code &)" in summary model. | +| Dubious signature "(const InternetProtocol &,string_view,string_view)" in summary model. | +| Dubious signature "(const InternetProtocol &,string_view,string_view,error_code &)" in summary model. | +| Dubious signature "(const InternetProtocol &,string_view,string_view,flags)" in summary model. | +| Dubious signature "(const InternetProtocol &,string_view,string_view,flags,error_code &)" in summary model. | | Dubious signature "(const MATRIX *,const VECTOR *,VECTOR *)" in summary model. | | Dubious signature "(const MD5_params *)" in summary model. | | Dubious signature "(const ML_DSA_KEY *)" in summary model. | @@ -4153,6 +4161,10 @@ | Dubious signature "(const stack_st_X509_EXTENSION *,int,int)" in summary model. | | Dubious signature "(const stack_st_X509_NAME *)" in summary model. | | Dubious signature "(const stat *)" in summary model. | +| Dubious signature "(const string &,const string &)" in summary model. | +| Dubious signature "(const string &,const string &,error_code &)" in summary model. | +| Dubious signature "(const string &,const string &,flags)" in summary model. | +| Dubious signature "(const string &,const string &,flags,error_code &)" in summary model. | | Dubious signature "(const td_thragent_t *,lwpid_t,td_thrhandle_t *)" in summary model. | | Dubious signature "(const td_thragent_t *,ps_prochandle **)" in summary model. | | Dubious signature "(const td_thragent_t *,pthread_t,td_thrhandle_t *)" in summary model. | @@ -5180,6 +5192,8 @@ | Dubious signature "(string_buf *,uint32_t *)" in summary model. | | Dubious signature "(string_buf *,unsigned char *)" in summary model. | | Dubious signature "(string_buf *,unsigned char **,size_t *)" in summary model. | +| Dubious signature "(string_view,string_view,error_code &)" in summary model. | +| Dubious signature "(string_view,string_view,flags,error_code &)" in summary model. | | Dubious signature "(stringtable *,const char *)" in summary model. | | Dubious signature "(stringtable *,stringtable_finalized *)" in summary model. | | Dubious signature "(support_descriptors *,const char *,FILE *)" in summary model. | diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/test_mad-signatures.expected b/cpp/ql/test/library-tests/dataflow/taint-tests/test_mad-signatures.expected index 2da7e83cca37..65a5391a3ed0 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/test_mad-signatures.expected +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/test_mad-signatures.expected @@ -15040,6 +15040,38 @@ getSignatureParameterName | (const ISSUER_SIGN_TOOL *,unsigned char **) | | i2d_ISSUER_SIGN_TOOL | 1 | unsigned char ** | | (const ISSUING_DIST_POINT *,unsigned char **) | | i2d_ISSUING_DIST_POINT | 0 | const ISSUING_DIST_POINT * | | (const ISSUING_DIST_POINT *,unsigned char **) | | i2d_ISSUING_DIST_POINT | 1 | unsigned char ** | +| (const InternetProtocol &,const string &,const string &) | basic_resolver | resolve | 0 | const class:0 & | +| (const InternetProtocol &,const string &,const string &) | basic_resolver | resolve | 1 | const string & | +| (const InternetProtocol &,const string &,const string &) | basic_resolver | resolve | 2 | const string & | +| (const InternetProtocol &,const string &,const string &,error_code &) | basic_resolver | resolve | 0 | const class:0 & | +| (const InternetProtocol &,const string &,const string &,error_code &) | basic_resolver | resolve | 1 | const string & | +| (const InternetProtocol &,const string &,const string &,error_code &) | basic_resolver | resolve | 2 | const string & | +| (const InternetProtocol &,const string &,const string &,error_code &) | basic_resolver | resolve | 3 | error_code & | +| (const InternetProtocol &,const string &,const string &,flags) | basic_resolver | resolve | 0 | const class:0 & | +| (const InternetProtocol &,const string &,const string &,flags) | basic_resolver | resolve | 1 | const string & | +| (const InternetProtocol &,const string &,const string &,flags) | basic_resolver | resolve | 2 | const string & | +| (const InternetProtocol &,const string &,const string &,flags) | basic_resolver | resolve | 3 | flags | +| (const InternetProtocol &,const string &,const string &,flags,error_code &) | basic_resolver | resolve | 0 | const class:0 & | +| (const InternetProtocol &,const string &,const string &,flags,error_code &) | basic_resolver | resolve | 1 | const string & | +| (const InternetProtocol &,const string &,const string &,flags,error_code &) | basic_resolver | resolve | 2 | const string & | +| (const InternetProtocol &,const string &,const string &,flags,error_code &) | basic_resolver | resolve | 3 | flags | +| (const InternetProtocol &,const string &,const string &,flags,error_code &) | basic_resolver | resolve | 4 | error_code & | +| (const InternetProtocol &,string_view,string_view) | basic_resolver | resolve | 0 | const class:0 & | +| (const InternetProtocol &,string_view,string_view) | basic_resolver | resolve | 1 | string_view | +| (const InternetProtocol &,string_view,string_view) | basic_resolver | resolve | 2 | string_view | +| (const InternetProtocol &,string_view,string_view,error_code &) | basic_resolver | resolve | 0 | const class:0 & | +| (const InternetProtocol &,string_view,string_view,error_code &) | basic_resolver | resolve | 1 | string_view | +| (const InternetProtocol &,string_view,string_view,error_code &) | basic_resolver | resolve | 2 | string_view | +| (const InternetProtocol &,string_view,string_view,error_code &) | basic_resolver | resolve | 3 | error_code & | +| (const InternetProtocol &,string_view,string_view,flags) | basic_resolver | resolve | 0 | const class:0 & | +| (const InternetProtocol &,string_view,string_view,flags) | basic_resolver | resolve | 1 | string_view | +| (const InternetProtocol &,string_view,string_view,flags) | basic_resolver | resolve | 2 | string_view | +| (const InternetProtocol &,string_view,string_view,flags) | basic_resolver | resolve | 3 | flags | +| (const InternetProtocol &,string_view,string_view,flags,error_code &) | basic_resolver | resolve | 0 | const class:0 & | +| (const InternetProtocol &,string_view,string_view,flags,error_code &) | basic_resolver | resolve | 1 | string_view | +| (const InternetProtocol &,string_view,string_view,flags,error_code &) | basic_resolver | resolve | 2 | string_view | +| (const InternetProtocol &,string_view,string_view,flags,error_code &) | basic_resolver | resolve | 3 | flags | +| (const InternetProtocol &,string_view,string_view,flags,error_code &) | basic_resolver | resolve | 4 | error_code & | | (const MATRIX *,const VECTOR *,VECTOR *) | | ossl_ml_dsa_matrix_mult_vector | 0 | const MATRIX * | | (const MATRIX *,const VECTOR *,VECTOR *) | | ossl_ml_dsa_matrix_mult_vector | 1 | const VECTOR * | | (const MATRIX *,const VECTOR *,VECTOR *) | | ossl_ml_dsa_matrix_mult_vector | 2 | VECTOR * | @@ -18552,6 +18584,18 @@ getSignatureParameterName | (const stat *) | | get_stat_ctime_ns | 0 | const stat * | | (const stat *) | | get_stat_mtime | 0 | const stat * | | (const stat *) | | get_stat_mtime_ns | 0 | const stat * | +| (const string &,const string &) | basic_resolver | resolve | 0 | const string & | +| (const string &,const string &) | basic_resolver | resolve | 1 | const string & | +| (const string &,const string &,error_code &) | basic_resolver | resolve | 0 | const string & | +| (const string &,const string &,error_code &) | basic_resolver | resolve | 1 | const string & | +| (const string &,const string &,error_code &) | basic_resolver | resolve | 2 | error_code & | +| (const string &,const string &,flags) | basic_resolver | resolve | 0 | const string & | +| (const string &,const string &,flags) | basic_resolver | resolve | 1 | const string & | +| (const string &,const string &,flags) | basic_resolver | resolve | 2 | flags | +| (const string &,const string &,flags,error_code &) | basic_resolver | resolve | 0 | const string & | +| (const string &,const string &,flags,error_code &) | basic_resolver | resolve | 1 | const string & | +| (const string &,const string &,flags,error_code &) | basic_resolver | resolve | 2 | flags | +| (const string &,const string &,flags,error_code &) | basic_resolver | resolve | 3 | error_code & | | (const td_thragent_t *,lwpid_t,td_thrhandle_t *) | | __td_ta_lookup_th_unique | 0 | const td_thragent_t * | | (const td_thragent_t *,lwpid_t,td_thrhandle_t *) | | __td_ta_lookup_th_unique | 1 | lwpid_t | | (const td_thragent_t *,lwpid_t,td_thrhandle_t *) | | __td_ta_lookup_th_unique | 2 | td_thrhandle_t * | @@ -24702,6 +24746,18 @@ getSignatureParameterName | (string_buf *,unsigned char **,size_t *) | | _libssh2_get_string | 0 | string_buf * | | (string_buf *,unsigned char **,size_t *) | | _libssh2_get_string | 1 | unsigned char ** | | (string_buf *,unsigned char **,size_t *) | | _libssh2_get_string | 2 | size_t * | +| (string_view,string_view) | basic_resolver | resolve | 0 | string_view | +| (string_view,string_view) | basic_resolver | resolve | 1 | string_view | +| (string_view,string_view,error_code &) | basic_resolver | resolve | 0 | string_view | +| (string_view,string_view,error_code &) | basic_resolver | resolve | 1 | string_view | +| (string_view,string_view,error_code &) | basic_resolver | resolve | 2 | error_code & | +| (string_view,string_view,flags) | basic_resolver | resolve | 0 | string_view | +| (string_view,string_view,flags) | basic_resolver | resolve | 1 | string_view | +| (string_view,string_view,flags) | basic_resolver | resolve | 2 | flags | +| (string_view,string_view,flags,error_code &) | basic_resolver | resolve | 0 | string_view | +| (string_view,string_view,flags,error_code &) | basic_resolver | resolve | 1 | string_view | +| (string_view,string_view,flags,error_code &) | basic_resolver | resolve | 2 | flags | +| (string_view,string_view,flags,error_code &) | basic_resolver | resolve | 3 | error_code & | | (stringtable *,const char *) | | stringtable_add | 0 | stringtable * | | (stringtable *,const char *) | | stringtable_add | 1 | const char * | | (stringtable *,stringtable_finalized *) | | stringtable_finalize | 0 | stringtable * | From c05fc73dd6ea229b501e08e69043f83156f75f97 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 7 Sep 2026 15:37:40 +0200 Subject: [PATCH 0746/2098] Rust: Avoid path resolution in `Element.toString` Define string representations on concrete element classes, make existing renderers total when unresolved child data is absent, and remove the path-resolution-dependent fallback from Element. Add a consistency check for elements that lack a string representation and update generated-file metadata for customized wrappers. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- rust/ql/.generated.list | 79 ------------------- rust/ql/.gitattributes | 79 ------------------- .../codeql/rust/elements/internal/AbiImpl.qll | 6 +- .../rust/elements/internal/ArgListImpl.qll | 6 +- .../internal/ArrayExprInternalImpl.qll | 5 +- .../elements/internal/ArrayTypeReprImpl.qll | 6 +- .../elements/internal/AsmClobberAbiImpl.qll | 6 +- .../rust/elements/internal/AsmConstImpl.qll | 6 +- .../rust/elements/internal/AsmDirSpecImpl.qll | 6 +- .../rust/elements/internal/AsmExprImpl.qll | 6 +- .../rust/elements/internal/AsmLabelImpl.qll | 6 +- .../elements/internal/AsmOperandExprImpl.qll | 6 +- .../elements/internal/AsmOperandNamedImpl.qll | 6 +- .../rust/elements/internal/AsmOptionImpl.qll | 6 +- .../elements/internal/AsmOptionsListImpl.qll | 6 +- .../elements/internal/AsmRegOperandImpl.qll | 6 +- .../rust/elements/internal/AsmRegSpecImpl.qll | 6 +- .../rust/elements/internal/AsmSymImpl.qll | 6 +- .../elements/internal/AssocItemListImpl.qll | 6 +- .../elements/internal/AssocTypeArgImpl.qll | 6 +- .../rust/elements/internal/AttrImpl.qll | 6 +- .../rust/elements/internal/CfgAtomImpl.qll | 5 +- .../elements/internal/CfgAttrMetaImpl.qll | 5 +- .../elements/internal/CfgCompositeImpl.qll | 5 +- .../rust/elements/internal/CfgMetaImpl.qll | 5 +- .../elements/internal/ClosureExprImpl.qll | 4 +- .../rust/elements/internal/ConstArgImpl.qll | 6 +- .../elements/internal/ConstBlockPatImpl.qll | 6 +- .../rust/elements/internal/ConstImpl.qll | 2 +- .../rust/elements/internal/ConstParamImpl.qll | 6 +- .../internal/DynTraitTypeReprImpl.qll | 2 + .../rust/elements/internal/ElementImpl.qll | 2 +- .../rust/elements/internal/EnumImpl.qll | 2 +- .../rust/elements/internal/ExprStmtImpl.qll | 6 +- .../elements/internal/ExternBlockImpl.qll | 6 +- .../elements/internal/ExternCrateImpl.qll | 6 +- .../elements/internal/ExternItemListImpl.qll | 6 +- .../rust/elements/internal/FieldExprImpl.qll | 2 +- .../elements/internal/FnPtrTypeReprImpl.qll | 6 +- .../elements/internal/ForTypeReprImpl.qll | 6 +- .../elements/internal/FormatArgsArgImpl.qll | 6 +- .../internal/FormatArgsArgNameImpl.qll | 5 +- .../elements/internal/FormatArgsExprImpl.qll | 2 + .../rust/elements/internal/FunctionImpl.qll | 2 +- .../rust/elements/internal/ImplImpl.qll | 2 +- .../rust/elements/internal/ItemImpl.qll | 12 +-- .../rust/elements/internal/ItemListImpl.qll | 6 +- .../elements/internal/KeyValueMetaImpl.qll | 5 +- .../elements/internal/LifetimeArgImpl.qll | 6 +- .../elements/internal/LifetimeParamImpl.qll | 6 +- .../rust/elements/internal/MacroCallImpl.qll | 4 +- .../rust/elements/internal/MacroDefImpl.qll | 6 +- .../rust/elements/internal/MacroExprImpl.qll | 6 +- .../rust/elements/internal/MacroItemsImpl.qll | 6 +- .../rust/elements/internal/MacroPatImpl.qll | 6 +- .../rust/elements/internal/MacroRulesImpl.qll | 6 +- .../elements/internal/MacroTypeReprImpl.qll | 6 +- .../elements/internal/MatchArmListImpl.qll | 6 +- .../rust/elements/internal/MatchGuardImpl.qll | 6 +- .../rust/elements/internal/ModuleImpl.qll | 2 +- .../rust/elements/internal/NamedCrateImpl.qll | 5 +- .../elements/internal/OffsetOfExprImpl.qll | 6 +- .../rust/elements/internal/ParamListImpl.qll | 2 + .../elements/internal/ParenTypeReprImpl.qll | 4 +- .../internal/ParenthesizedArgListImpl.qll | 6 +- .../rust/elements/internal/PathMetaImpl.qll | 5 +- .../elements/internal/PathSegmentImpl.qll | 2 +- .../elements/internal/PtrTypeReprImpl.qll | 6 +- .../rust/elements/internal/RangePatImpl.qll | 6 +- .../elements/internal/RefTypeReprImpl.qll | 6 +- .../rust/elements/internal/RenameImpl.qll | 6 +- .../elements/internal/RetTypeReprImpl.qll | 6 +- .../internal/ReturnTypeSyntaxImpl.qll | 6 +- .../rust/elements/internal/SelfParamImpl.qll | 6 +- .../rust/elements/internal/SlicePatImpl.qll | 6 +- .../elements/internal/SliceTypeReprImpl.qll | 6 +- .../rust/elements/internal/SourceFileImpl.qll | 6 +- .../rust/elements/internal/StaticImpl.qll | 2 +- .../rust/elements/internal/StmtListImpl.qll | 2 + .../internal/StructExprFieldListImpl.qll | 6 +- .../elements/internal/StructFieldListImpl.qll | 6 +- .../rust/elements/internal/StructImpl.qll | 2 +- .../internal/StructPatFieldListImpl.qll | 6 +- .../rust/elements/internal/TokenTreeImpl.qll | 6 +- .../elements/internal/TokenTreeMetaImpl.qll | 5 +- .../rust/elements/internal/TraitImpl.qll | 2 +- .../internal/TryBlockModifierImpl.qll | 5 +- .../rust/elements/internal/TryExprImpl.qll | 6 +- .../rust/elements/internal/TupleExprImpl.qll | 6 +- .../rust/elements/internal/TupleFieldImpl.qll | 2 + .../elements/internal/TupleFieldListImpl.qll | 6 +- .../rust/elements/internal/TuplePatImpl.qll | 2 + .../elements/internal/TupleTypeReprImpl.qll | 6 +- .../rust/elements/internal/TypeArgImpl.qll | 6 +- .../rust/elements/internal/TypeBoundImpl.qll | 2 + .../elements/internal/TypeBoundListImpl.qll | 2 +- .../rust/elements/internal/UnsafeMetaImpl.qll | 5 +- .../internal/UseBoundGenericArgsImpl.qll | 6 +- .../codeql/rust/elements/internal/UseImpl.qll | 4 +- .../elements/internal/UseTreeListImpl.qll | 6 +- .../elements/internal/VariantListImpl.qll | 6 +- .../elements/internal/WhereClauseImpl.qll | 6 +- .../rust/elements/internal/WherePredImpl.qll | 6 +- .../rust/elements/internal/YeetExprImpl.qll | 6 +- .../rust/elements/internal/YieldExprImpl.qll | 6 +- .../codeql/rust/internal/AstConsistency.qll | 13 +++ .../macro-expansion/PrintAst.expected | 16 ++-- .../macro-expansion/test.expected | 30 +++---- .../macro-in-library/PrintAst.expected | 2 +- .../diagnostics/AstConsistencyCounts.expected | 1 + 110 files changed, 386 insertions(+), 362 deletions(-) diff --git a/rust/ql/.generated.list b/rust/ql/.generated.list index 4e2371c73bed..adbfad531d72 100644 --- a/rust/ql/.generated.list +++ b/rust/ql/.generated.list @@ -198,46 +198,27 @@ lib/codeql/rust/elements/WildcardPat.qll 4f941afc5f9f8d319719312399a8f787c75a0db lib/codeql/rust/elements/YeetExpr.qll 4172bf70de31cab17639da6eed4a12a7afcefd7aa9182216c3811c822d3d6b17 88223aab1bef696f508e0605615d6b83e1eaef755314e6a651ae977edd3757c3 lib/codeql/rust/elements/YieldExpr.qll de2dc096a077f6c57bba9d1c2b2dcdbecce501333753b866d77c3ffbe06aa516 1f3e8949689c09ed356ff4777394fe39f2ed2b1e6c381fd391790da4f5d5c76a lib/codeql/rust/elements/internal/AbiConstructor.qll 4484538db49d7c1d31c139f0f21879fceb48d00416e24499a1d4b1337b4141ac 460818e397f2a1a8f2e5466d9551698b0e569d4640fcb87de6c4268a519b3da1 -lib/codeql/rust/elements/internal/AbiImpl.qll 28a2b6bdb38fd626e5d7d1ed29b839b95976c3a03717d840669eb17c4d6f0c7a 8e83877855abe760f3be8f45c2cf91c1f6e810ec0301313910b8104b2474d9cf lib/codeql/rust/elements/internal/ArgListConstructor.qll a73685c8792ae23a2d628e7357658efb3f6e34006ff6e9661863ef116ec0b015 0bee572a046e8dfc031b1216d729843991519d94ae66280f5e795d20aea07a22 -lib/codeql/rust/elements/internal/ArgListImpl.qll 0903b2ca31b3e5439f631582d12f17d77721d63fdb54dc41372d19b742881ce4 2c71c153ccca4b4988e6a25c37e58dc8ecb5a7483273afff563a8542f33e7949 lib/codeql/rust/elements/internal/ArrayExprInternal.qll 07a219b3d3fba3ff8b18e77686b2f58ab01acd99e0f5d5cad5d91af937e228f5 7528fc0e2064c481f0d6cbff3835950a044e429a2cd00c4d8442d2e132560d37 lib/codeql/rust/elements/internal/ArrayExprInternalConstructor.qll f9756bc40beee99c5e4355bf157030b440c532dff5bdf43e848b3aa1a00fea90 39467f7f313e6f9ede1fe92375ee408098dc65291ca8ee50e36a3684a2767836 -lib/codeql/rust/elements/internal/ArrayExprInternalImpl.qll ae4488846c8309b2d4a51d54b36fce0a75107917c0b1f8af5ccf40797f570580 37838c7d6a04b95a16ed46e963d7e56def7a30b5e5ef1ab7e0dfdb5f256fa874 lib/codeql/rust/elements/internal/ArrayTypeReprConstructor.qll 52fea288f2031ae4fd5e5fe62300311134ed1dec29e372500487bf2c294516c1 fa6484f548aa0b85867813166f4b6699517dda9906e42d361f5e8c6486bdcb81 -lib/codeql/rust/elements/internal/ArrayTypeReprImpl.qll c00e03cc7136383bde1d830a8760e0e8665ed49692023ad27ad1e9c8eeb27c48 52cbc8e247f346f4b99855d653b8845b162300ecdab22db0578e7dec969768d0 lib/codeql/rust/elements/internal/AsmClobberAbiConstructor.qll 8bc39bd50f46b7c51b0cf2700d434d19d779ed6660e67e6dcec086e5a137ae3e 4e7425194565bea7a0fdc06e98338ebaeef4810d1e87245cdc55274534f1a592 -lib/codeql/rust/elements/internal/AsmClobberAbiImpl.qll aa6be2677bec6fa83ec3e29ee2aa53a0214a50de9a620a52ebdc6b94aaf38736 128937b710b5321788fe9675e0d364da09fd771c9ebc34b3de106496ef43396c lib/codeql/rust/elements/internal/AsmConstConstructor.qll 810cb616b04b3e70beb0e21f9ead43238d666ab21982ad513fc30c3357c85758 ad864bec16d3295b86c8aef3dc7170b58ef307a8d4d8b1bc1e91373021d6ae10 -lib/codeql/rust/elements/internal/AsmConstImpl.qll 775e6cc5df01462b649925a4bdd8f8d5481ec1d84e1c764d8eaf94e9e032822c 810c069fad76d4441c556dc72544cb4cac84169ae749e0686d88985acfc9acd9 lib/codeql/rust/elements/internal/AsmDirSpecConstructor.qll 91514d37fc4f274015606cc61e3137be71b06a8f5c09e3211affb1a7bd6d95b2 866ba3f8077e59b94ae07d38a9152081fc11122e18aa89cdd0c0acd9c846ed87 -lib/codeql/rust/elements/internal/AsmDirSpecImpl.qll ba95497c1c83ee9193adbdd619efe60c8178123ead1eef8e07e1b686af1106fb c0c99a40187cd2bb12bef97fc312ca69c742c965ea130da842eb75d91ecfb0d8 lib/codeql/rust/elements/internal/AsmExprConstructor.qll 36c68023b58beec30af9f05d9d902a4c49faa0206b5528d6aad494a91da07941 4d91b7d30def03e634b92c0d7b99b47c3aadd75f4499f425b80355bc775ea5b6 -lib/codeql/rust/elements/internal/AsmExprImpl.qll a5eec51c3a01e89456283a3054a40527b819a3f4c28405e1e38b09adae922581 ba53e4bdbe9e13d658dd78765c6ea7db3bb0f60536c24751bcb9108f07134401 lib/codeql/rust/elements/internal/AsmLabelConstructor.qll e5f04525befc30136b656b020ade440c8b987ec787ff9c3feec77c1660f2556d cb9394581e39656bbe50cf8cc882c1b4b5534d7d0d59cef5c716d1c716a8a4f6 -lib/codeql/rust/elements/internal/AsmLabelImpl.qll cc1cc4be2f804915731acadb438ee755d330d3557a5d029aff1b208f2b5a7d19 298b8e2974f5c01e9f6bab5c485ce7e149a1392343bfc7c03a536c4bd41c0e7c lib/codeql/rust/elements/internal/AsmOperandExprConstructor.qll a7a724033717fe6c7aefb344bc21278baa690408135958d51fe01106e3df6f69 72212bf8792f5b8483a3567aab86fad70a45d9d33e85d81c275f96b2b10c87d1 -lib/codeql/rust/elements/internal/AsmOperandExprImpl.qll d97b9ab3740c68b17b716d672371958dcbca396b2fed670d407732e13989fbec f34b43f3f8b70da9470216cc6f535b928291780edebce69e208b7a9fb662b0f4 lib/codeql/rust/elements/internal/AsmOperandImpl.qll acd1eb6467d7b1904e2f35b5abe9aa4431b9382c68da68ea9a90938c8277e2f0 ab21f5a8d57da0698b8fbfee6d569c95671ea48d433e64337e69452523cec9c3 lib/codeql/rust/elements/internal/AsmOperandNamedConstructor.qll 321fdd145a3449c7a93e6b16bb2d6e35a7d8c8aa63a325aa121d62309509ae58 08386b0e35c5e24918732f450a65f3b217601dc07123396df618ac46b9e94d7d -lib/codeql/rust/elements/internal/AsmOperandNamedImpl.qll a50add359936b7efa3411163e6d51ee3e4083dd05f65cefb63a7648bbf251202 9c7d9515d9adcc4652aea864dfd5273f1260539b41b4d201778e0374988553cb lib/codeql/rust/elements/internal/AsmOptionConstructor.qll 4dc373d005a09bf4baba7205a5fe536dae9fcd39c5a761796a04bf026862e0c2 3e4d8f38344c1a246bce6e4f1df1fc47e928b7a528b6a82683259f7bc190ed13 -lib/codeql/rust/elements/internal/AsmOptionImpl.qll 41199586e1ef9127f07673b46293816a483774e997c5b2e44cf5579ce3aad765 3ee04fd2d070a581afe15822da768f1e4c1e3f1a3645f01e1b99717d9dce93ec lib/codeql/rust/elements/internal/AsmOptionsListConstructor.qll 45e78f45fb65c1ae98f16e5c4d8129b91cf079b6793c5241981fab881b6a28a7 1fc496b87693e779e5185741461d5de7061699d7d94d15c8a6edec4fb0c5ccc7 -lib/codeql/rust/elements/internal/AsmOptionsListImpl.qll 078ad57aaa0741ad256d6f7102ad226979766b4991fc3c96b12b556732c17f6b c70814bae7ef4c5e3e6f05f7a512d4e2cd559922616f0c0e6fc68127b21a1089 lib/codeql/rust/elements/internal/AsmPieceImpl.qll 1e501905bbf11c5a3cc4327af6b4a48ce157258d29c5936269e406d9e0fe21d4 54b91047f72c03ebbd84cf1826b7bfc556620a161edf3085d0a4faef8e60f63e lib/codeql/rust/elements/internal/AsmRegOperandConstructor.qll 5299b8134fdf2034c4d82a13a1f5ba7d90ffeae18ecd1d59aa43fd3dbf7ab92b d135f5e4a2d9da6917fb3b8277be9fcd68bcb1e3a76e4b2e70eb0b969b391402 -lib/codeql/rust/elements/internal/AsmRegOperandImpl.qll 0999a4b492e6508dd74de56ed3a40d0e16959877efc060a516a404336ec605a3 70ca08941d76ebac530ee98894aa721877147b21c447d4e93c3aef92222bb1ca lib/codeql/rust/elements/internal/AsmRegSpecConstructor.qll bf3e0783645622691183e2f0df50144710a3198159c030e350b87f7c1bb0c86f 66f7c92260038785f9010c0914e69589bb5ff64fb14c2fb2c786851ca3c52866 -lib/codeql/rust/elements/internal/AsmRegSpecImpl.qll 7ad0a5b86922e321da9f8c7ea8aefa88068b27bcea3890f981b061a204ab576d 65f13c423ef42209bd514523f21dd1e43cc4f5c191bdb85ba7128c76241f78a8 lib/codeql/rust/elements/internal/AsmSymConstructor.qll 9c7e8471081b9173f01592d4b9d22584a0d1cee6b4851050d642ddaa4017659e adc5b4b2a8cd7164da4867d83aa08c6e54c45614c1f4fc9aa1cbbedd3c20a1b3 -lib/codeql/rust/elements/internal/AsmSymImpl.qll e173807c5b6cf856f5f4eaedb2be41d48db95dd8a973e1dc857a883383feec50 ab19c9f479c0272a5257ab45977c9f9dd60380fe33b4ade14f3dddf2970112de lib/codeql/rust/elements/internal/AssocItemListConstructor.qll 1977164a68d52707ddee2f16e4d5a3de07280864510648750016010baec61637 bb750f1a016b42a32583b423655279e967be5def66f6b68c5018ec1e022e25e1 -lib/codeql/rust/elements/internal/AssocItemListImpl.qll 70e82744464827326bfc394dab417f39905db155fb631f804bf1f27e23892698 760c7b42137d010e15920f9623e461daaf16518ab44a36a15259e549ecd4fa7a lib/codeql/rust/elements/internal/AssocTypeArgConstructor.qll 58b4ac5a532e55d71f77a5af8eadaf7ba53a8715c398f48285dac1db3a6c87a3 f0d889f32d9ea7bd633b495df014e39af24454608253200c05721022948bd856 -lib/codeql/rust/elements/internal/AssocTypeArgImpl.qll 5a5016276bef74ae52c6b7a04dfd46b0d466356292c110860c7f650a2d455100 b72b10eeede0f945c96f098e484058469f6e6e2223d29377d6ef3e2fde698624 lib/codeql/rust/elements/internal/AttrConstructor.qll de1dd30692635810277430291ba3889a456344dbd25938d9f8289ab22506d5cd 57b62b2b07dee4a9daeed241e0b4514ba36fd5ec0abb089869a4d5b2c79d6e72 -lib/codeql/rust/elements/internal/AttrImpl.qll 3d5b3b8efd1f1401a33585d36a8f127ea1dff21fc41330e2e6828925bcc0995a 28c9132499da2ccb00e4f3618341c2d4268c2dccbbf4739af33d4c074f9b29cd lib/codeql/rust/elements/internal/AwaitExprConstructor.qll 44ff1653e73d5b9f6885c0a200b45175bb8f2ceb8942c0816520976c74f1fc77 11e6f4a1e1462a59e2652925c8bd6663e0346c311c0b60ebe80daa3b55b268b0 lib/codeql/rust/elements/internal/BecomeExprConstructor.qll ba073aaa256cb8827a0307c3128d50f62b11aac0b1f324e48c95f30351a9b942 3a787ded505c3158fa4f4923f66e8ecdcb7b5f86f27f64c5412dc32dca031f18 lib/codeql/rust/elements/internal/BinaryExprConstructor.qll 7f9b17757f78b9fb7c46e21d2040a77fa50083bef4911c8464991c3d1ad91d87 a59390cd8e896c0bfbdc9ba0674e06d980ffcefa710fbc9886be52ed427e9717 @@ -247,51 +228,36 @@ lib/codeql/rust/elements/internal/BreakExprConstructor.qll 356be043c28e0b34fdf92 lib/codeql/rust/elements/internal/CallExprConstructor.qll 742b38e862e2cf82fd1ecc4d4fc5b4782a9c7c07f031452b2bae7aa59d5aa13a cad6e0a8be21d91b20ac2ec16cab9c30eae810b452c0f1992ed87d5c7f4144dc lib/codeql/rust/elements/internal/CastExprConstructor.qll f3d6e10c4731f38a384675aeab3fba47d17b9e15648293787092bb3247ed808d d738a7751dbadb70aa1dcffcf8af7fa61d4cf8029798369a7e8620013afff4ed lib/codeql/rust/elements/internal/CfgAtomConstructor.qll b71484029b4fdaa5df6b42f6b38c3feb0ad72284e5badf3d8413b78d6d14240b 146c73c0354d67fbccba5eb2fe21918ab441d953e005b4ec5482c80388d9493d -lib/codeql/rust/elements/internal/CfgAtomImpl.qll 47ca5355933e1c405dc2edec7bff9fd9be5132f708d6d7e0237a9f0a809eefa7 965eeca1d9ba5045735b16fa0340c0227f22418e0545f381c4df36eac23cf3fe lib/codeql/rust/elements/internal/CfgAttrMetaConstructor.qll 8cae731f5e86830dec3367b1c69e807389bc434b4f83ff6e13427e4106ec6f2c 0ced22b35219edf0250a8542062f66641f03c13575a3c71d4d718ce5146288ea -lib/codeql/rust/elements/internal/CfgAttrMetaImpl.qll 2b8a578d52aea3ab218f1337ba2c8737cf16e9c64580b1916860dc66ae3e9025 e92e5e8dc79b1da72873af410b778054df7e22bc9080719d60371bc72bc27043 lib/codeql/rust/elements/internal/CfgCompositeConstructor.qll 160bfbccdd80c9b9421b33cb302f6fe48bebe80050a01ad72a43f7332100f834 0102cad0255d632cac4ffaf334ce15f9beff9d7eb7d14a50255ef5c0e4b67d7b -lib/codeql/rust/elements/internal/CfgCompositeImpl.qll 840a148dc5c4b213ffdaca6213d6f2dfa3c1dad3f99293f8244baa3bf6902909 36e9291b124c52bb2e4620bead8acf2f9be4a2281eccfd74411adaf91914dd20 lib/codeql/rust/elements/internal/CfgMetaConstructor.qll 335cb7a36e430b08a12c5548d0a91bbb9a00aaa2f9b0dc7b2fa526882ec0271e 0bd7002f58c1c19c22023d6f03874d84e083e1aa09ec9cac888661d5ad632f6b -lib/codeql/rust/elements/internal/CfgMetaImpl.qll 9d820fb4dee32288e467a8b667ba191588381d8ec2a0ce0e5e8645ee437a16a8 5888fb533768a36d94f56f81058aa0d00c4a2c13721af42bdd30628747698bce lib/codeql/rust/elements/internal/CfgPredicateImpl.qll 3ba6c6732a7de4df967dd2cb2b4cc99db8aefb2301b75521f1b369052e3a2ec0 c07d4366f98f374f24e235f809946dc513a16203e4c1eb151c8185a5bc79e70d lib/codeql/rust/elements/internal/ClosureExprConstructor.qll a348229d2b25c7ebd43b58461830b7915e92d31ae83436ec831e0c4873f6218a 70a1d2ac33db3ac4da5826b0e8628f2f29a8f9cdfd8e4fd0e488d90ce0031a38 lib/codeql/rust/elements/internal/CommentConstructor.qll 0b4a6a976d667bf7595500dfb91b9cfc87460a501837ba5382d9a8d8321d7736 7d02d8c94a319dc48e7978d5270e33fc5c308d443768ff96b618236d250123f1 lib/codeql/rust/elements/internal/ConstArgConstructor.qll f63021dc1ca2276786da3a981d06c18d7a360b5e75c08bca5d1afece4f7c4a83 487a870cbf5ed6554d671a8e159edd9261d853eba2d28ce2bd459759f47f11f2 -lib/codeql/rust/elements/internal/ConstArgImpl.qll dc7e7b5fe1a6eeb61dd30a55a3ed2ab87bb82d712b40e4901cff44e4a6fae3f4 1ea7553d764617807df71286a4dd5cbbf51c9f45aa8c8c19e9cc91b41dbe0645 lib/codeql/rust/elements/internal/ConstBlockPatConstructor.qll ddb4a0045635d477e87360ecafec0ba90ddcffc6e62996eb6e7edd5a5d65b860 442061d0497a615b3f008b990f5e3c4f045110f76500eff81a7f44ffd1319acf -lib/codeql/rust/elements/internal/ConstBlockPatImpl.qll 2082a3244c21e03b6dadfba9b3f97a00981324e10d1465d3a51cf3c921eb89e4 889e347834d8c6e90dfef9714af073b3b2193f6830f1c8356cee9c6573b3ecb4 lib/codeql/rust/elements/internal/ConstConstructor.qll 72a31fd9b8b3fd910e35af1b2b30fa54cc4d9e14e7eabdb94b4cd2af95b2df38 3edc0a82a7b446fdfd3e71947801f3c7cac010b2a217b8accb69980387bdd67a lib/codeql/rust/elements/internal/ConstParamConstructor.qll f6645f952aac87c7e00e5e9661275312a1df47172088b4de6b5a253d5c4ed048 eda737470a7b89cf6a02715c9147d074041d6d00fd50d5b2d70266add6e4b571 -lib/codeql/rust/elements/internal/ConstParamImpl.qll c6995be58f84d1df65897c80f7ee3dd8eb410bb3e634ff1bfe1be94dfb3fdf32 bcfb5547b40f24bcec20056fe1d36724b734c920b0bc7538fe2974b03f4478fe lib/codeql/rust/elements/internal/ContinueExprConstructor.qll cd93f1b35ccdb031d7e8deba92f6a76187f6009c454f3ea07e89ba459de57ca6 6f658e7d580c4c9068b01d6dd6f72888b8800860668a6653f8c3b27dc9996935 lib/codeql/rust/elements/internal/CrateConstructor.qll 2a3710ed6ff4ffdbc773ac16e2cf176415be8908e1d59fd0702bdeddbae096f4 f75a069b0ef71e54089001eb3a34b8a9e4ce8e4f65ffa71b669b38cf86e0af40 lib/codeql/rust/elements/internal/DynTraitTypeReprConstructor.qll 6964e6c80fb7f5e283c1d15562cef18ed097452b7fcbc04eff780c7646675c7a f03c4830bf1b958fdfb6563136fa21c911b2e41ce1d1caee14ec572c7232866d lib/codeql/rust/elements/internal/EnumConstructor.qll eca1a13937faacb1db50e4cf69d175f992f2204a5aaed9144bb6f3cb63814ac5 1bafba78b2729fdb052a25a1ba3f4f70871564aa4df632b4a1d467858a437924 lib/codeql/rust/elements/internal/ExprImpl.qll ab20ee174e2e786f34af6e5dedf3ec071bb89fc266b3e91df6377f72aa38d3f2 f68192700f449bf1c229cfbaabd5353c7c559941c915d5a0c88752cf9844194b lib/codeql/rust/elements/internal/ExprStmtConstructor.qll dd6bb06a7d48c12f630aafd611621cc50ce0f3e7d9abba5484a695f90879264b dc8b6ec8acc314e041ae71868803630c5d4cab488c72c1ea929bb756e1847c52 -lib/codeql/rust/elements/internal/ExprStmtImpl.qll 420221c64245b490dab85f4e50d6b408cf488349869eb87312c166e185ad8145 2c2a4c71eea8c1ad8823e8e22780fadebb38ae502b3a7b9b062923a188fef692 lib/codeql/rust/elements/internal/ExternBlockConstructor.qll 884bafd1cb5a6ce9f54a7a6b9ba1c8814f38e3baf69a2ff8cfc8b02163204b9d ee26e070fcbfd730bbfaf0502d5ed54110c25f84e7b65948c8638a314b67ea5d -lib/codeql/rust/elements/internal/ExternBlockImpl.qll 6234810c73ede38cd78bf4824e729db0485522f0098f2a4af43c44233996f1eb 9b6327a491ee5c713b4f5056231e67160a34894c736cc5c7248a7c6c45f620ad lib/codeql/rust/elements/internal/ExternCrateConstructor.qll edd4d69ca7e36bd8389a96eac4ce04d9dd3857b0470b9f24319312469b0f8654 c80f4968e675f4b29e92a2fd8783f800823cc855ad193fee64869d5ba244d949 -lib/codeql/rust/elements/internal/ExternCrateImpl.qll 4aedfd8f0398015c3a93bf49d9ebdeb6a805bc05ae6ddbf5ee4d27b3af363f9b fba287a8b62ae795f28ac3aa1f67221109473deb48aaa91ff567087dbeb54d4e lib/codeql/rust/elements/internal/ExternItemImpl.qll 9a723a8d67054d8442dcca6dd0f285b25e69f39b1f4c90040fb04cd991d25069 e4de7bd6d9c1ce4a62b05ee4a64bdc169403bffa9673275c2a6c061ccff9a570 lib/codeql/rust/elements/internal/ExternItemListConstructor.qll 9e4f6a036707c848c0553119272fd2b11c1740dd9910a626a9a0cf68a55b249b efde86b18bd419154fb5b6d28790a14ea989b317d84b5c1ddbdfb29c6924fd86 -lib/codeql/rust/elements/internal/ExternItemListImpl.qll f73e1a11ff7810aa554254a394b5e167e45114c6deaa6c3d16fb2b3c6cd60286 b7f8453582fbd8d4a4e0472e850398418542e5c33bc4fe2f743a649374787aa4 lib/codeql/rust/elements/internal/ExtractorStep.qll 1c65668007ea71d05333e44132eccc01dc2a2b4908fb37d0a73995119d3ed5f0 8cbe1eeb35bc2bc95c1b7765070d1ff58aae03fd28dc94896b091858eea40efe lib/codeql/rust/elements/internal/ExtractorStepConstructor.qll 00c527a3139ad399ea1efd0ebe4656372d70f6c4e79136bc497a6cb84becae8e 93817f3dddeaf2c0964ab31c2df451dcee0aeba7cb6520803d8ce42cefcb3703 lib/codeql/rust/elements/internal/FieldExprConstructor.qll b3be2c4ccaf2c8a1283f3d5349d7f4f49f87b35e310ef33491023c5ab6f3abc5 645d0d4073b032f6b7284fc36a10a6ec85596fb95c68f30c09504f2c5a6f789f lib/codeql/rust/elements/internal/FieldListImpl.qll 6b80b573989ee85389c4485729a40c92c7e0a5b8a96a4385e812c74fb63c894f d333bcb043616b95ffefed4d216f94e5b07541f8153e4fb8084f4e793947b023 lib/codeql/rust/elements/internal/FnPtrTypeReprConstructor.qll 61d8808ea027a6e04d5304c880974332a0195451f6b4474f84b3695ec907d865 0916c63a02b01a839fe23ec8b189d37dc1b8bc4e1ba753cbf6d6f5067a46965a -lib/codeql/rust/elements/internal/FnPtrTypeReprImpl.qll 6b66f9bda1b5deba50a02b6ac7deb8e922da04cf19d6ed9834141bc97074bf14 b0a07d7b9204256a85188fda2deaf14e18d24e8a881727fd6e5b571bf9debdc8 lib/codeql/rust/elements/internal/ForBinderConstructor.qll 98f16b0106a19210713404f4be8b1b9f70c88efb0b88bdf2f9ea9c8fbd129842 a7af9e75f11d824a60c367924542a31a0f46f7b1f88d3ee330d4dd26b2f29df5 lib/codeql/rust/elements/internal/ForExprConstructor.qll d79b88dac19256300b758ba0f37ce3f07e9f848d6ae0c1fdb87bd348e760aa3e 62123b11858293429aa609ea77d2f45cb8c8eebae80a1d81da6f3ad7d1dbc19b lib/codeql/rust/elements/internal/ForTypeReprConstructor.qll eae141dbe9256ab0eb812a926ebf226075d150f6506dfecb56c85eb169cdc76b 721c2272193a6f9504fb780d40e316a93247ebfb1f302bb0a0222af689300245 -lib/codeql/rust/elements/internal/ForTypeReprImpl.qll dbbcb86626dcba3d5534d461d7306c354a15f800ff37c1d039801b868179b387 f942eebb20fb2603b7bab0e90f3e3f7a3f87dd6229090fc011c692a52164ac90 lib/codeql/rust/elements/internal/FormatArgsArgConstructor.qll 8bd9b4e035ef8adeb3ac510dd68043934c0140facb933be1f240096d01cdfa11 74e9d3bbd8882ae59a7e88935d468e0a90a6529a4e2af6a3d83e93944470f0ee -lib/codeql/rust/elements/internal/FormatArgsArgImpl.qll 6a8f55e51e141e4875ed03a7cc65eea49daa349de370b957e1e8c6bc4478425c 7efab8981ccbe75a4843315404674793dda66dde02ba432edbca25c7d355778a lib/codeql/rust/elements/internal/FormatArgsArgNameConstructor.qll 1d5221a97f0edee8c07fd1140a9409cf7c3e6e90fc226278bbe64cf55d72b5c5 a77954bd52b2aa7b2e6891482001a2600c9365778630baf318ffd05cf1630568 -lib/codeql/rust/elements/internal/FormatArgsArgNameImpl.qll 58576638f78150e84c11ae9c702c1f4ea286460f6476a89f0259c9f7cf34dd36 3befb988d6e8ece20b718cd59bac4a68c458814c3157e4d1d7a513a03fd4bd1e lib/codeql/rust/elements/internal/FormatArgsExprConstructor.qll ce29ff5a839b885b1ab7a02d6a381ae474ab1be3e6ee7dcfd7595bdf28e4b558 63bf957426871905a51ea319662a59e38104c197a1024360aca364dc145b11e8 lib/codeql/rust/elements/internal/FunctionConstructor.qll b50aea579938d03745dfbd8b5fa8498f7f83b967369f63d6875510e09ab7f5d2 19cca32aeaecaf9debc27329e8c39ecec69464bb1d89d7b09908a1d73a8d92a2 lib/codeql/rust/elements/internal/GenericArgImpl.qll fde43bb0e3cb2d8eb9feb02012b0a4f934015f8175ec112dea1077d131f55acb 44842e8075f750ba2876cff28d07284f99188982aa6d674ec863ad90305bf6ae @@ -305,41 +271,29 @@ lib/codeql/rust/elements/internal/ImplTraitTypeReprConstructor.qll 1ed355e5e56f4 lib/codeql/rust/elements/internal/IndexExprConstructor.qll 99bdc3d793c4dbd993860da60abe2b7c604345d645e86916462bc55a6939a5d1 3fe9d7da725956903707806aadbecac8d5b3874e8bed63c9bab54fff630e75dd lib/codeql/rust/elements/internal/InferTypeReprConstructor.qll bc5f16853401617fc9c5af8a1287a23c5921df1b615cfbe2d7c7a70145ecfcbd da93bd28ea2daade2cbb0a729be3fbf05f72bc02009565c7bb062e4f68fdb9e7 lib/codeql/rust/elements/internal/ItemListConstructor.qll 08af3bd12536941c3dd4a43c81cc861be24325e242e2593c087a3ce632674291 2fa166159c409d2aaffa73a30babb40829a6de580bd40894d909ee6152801082 -lib/codeql/rust/elements/internal/ItemListImpl.qll 195dbe93c334ad2bfc29db530bda9aaea88fc31696b2f230faae9e6c2ecb74a8 e498983a5b2f7a91e2fd336e85ac17e521a18c677784a0788d95bb283f3652e7 lib/codeql/rust/elements/internal/KeyValueMetaConstructor.qll 946f4df587ae7c77445faec67b0c796e008a10c642e5bdf881f9f75e819a1f93 d2bff94a5f8967fabadb76424917383e1472467db1d90214b1b871ebf8da672d -lib/codeql/rust/elements/internal/KeyValueMetaImpl.qll 6f895ee05d983885ad3624b5c64483f2c9024888ed62781889c589ba6fadb4eb 4004bb1b22c30e27f7e2262e9788d1ad3ea4cb08729d8910140c54663a123b91 lib/codeql/rust/elements/internal/LabelConstructor.qll 1f814c94251e664bfa1b1a606aef995382e40e78d4f953350ec951ee0bc8bd34 3157fb8c7c6bd365a739f217ad73ba1e0b65ccd59b922e5ab034e3449915b36c lib/codeql/rust/elements/internal/LetElseConstructor.qll b2b5d68e5701379a0870aa6278078e09f06aa18ddd14045fc6ae62e90827ece7 7359e70bea8a78bcaf6e6ecc8cc37c5135ae31415b74645594456cc8daa82118 lib/codeql/rust/elements/internal/LetExprConstructor.qll 66f27cbdafb2b72b31d99645ec5ed72f4b762a7d6f5d292d7639dd8b86272972 7da048f4d7f677919c41d5c87ead301eacc12ece634d30b30a8ae1fab580ff30 lib/codeql/rust/elements/internal/LetStmtConstructor.qll 7ee0d67bebd6d3b9c7560137c165675d17b231318c084952ba4a2226d61e501f 84199ba755bb6c00579eee245b2bca41da478ca813b202b05abaa1246dcf13d8 lib/codeql/rust/elements/internal/LifetimeArgConstructor.qll 270f7de475814d42e242e5bfe45d7365a675e62c10257110286e6a16ce026454 643d644b60bfe9943507a77011e5360231ac520fbc2f48e4064b80454b96c19b -lib/codeql/rust/elements/internal/LifetimeArgImpl.qll ea3e831077f6ee51de90949a3487b007aeeea74f08e74ee8ce2f4f1a41bc7b7c da99145353601cf124e4ebbd425cc4b8561b5f6f7451c9696ac0bed94eaf84cd lib/codeql/rust/elements/internal/LifetimeConstructor.qll 2babe40165547ac53f69296bb966201e8634d6d46bc413a174f52575e874d8cd ef419ae0e1b334d8b03cdb96bc1696787b8e76de5d1a08716e2ff5bd7d6dc60d lib/codeql/rust/elements/internal/LifetimeParamConstructor.qll 530c59a701d814ebc5e12dc35e3bfb84ed6ee9b5be7a0956ea7ada65f75ff100 ff6507e5d82690e0eec675956813afabbbcfb89626b2dbfffe3da34baeff278c -lib/codeql/rust/elements/internal/LifetimeParamImpl.qll e9251af977880dcdf659472fa488b3f031fa6f6cbf6d9431218db342148b534f 63b287477b23434f50763b2077a5f2461de3d8ba41ef18ac430ffa76eb7f2704 lib/codeql/rust/elements/internal/LiteralExprConstructor.qll 8ea3569bd50704ce7d57be790d2dfd38f4c40cb0b12e0dd60d6830e8145a686f 88d07ad3298003f314f74bd8e3d64a3094de32080ad42a7e6741c416c3856095 lib/codeql/rust/elements/internal/LiteralPatConstructor.qll b660cb428a0cba0b713fc7b07d5d2921de4a2f65a805535fb6387684c40620de 2dbc9fbc56e9de53d24265d6b13738ef5b9ced33cc3c4c1c270e04dc2fc1330f lib/codeql/rust/elements/internal/LoopExprConstructor.qll 45f3f8f7441fcab6adc58831421679ee07bac68ac0417f3cbc90c97426cc805b f7ab3361b4a11e898126378ea277d76949466946762cd6cb5e9e9b4bb9860420 lib/codeql/rust/elements/internal/LoopingExprImpl.qll 17885c1bcf7b5a3f9c7bbad3d4d55e24372af0dedd5e7fc0efcfc0a8b2cdad70 104dc45ca399b9f6e8227ad561679f728d60170398a52b31fc90cb2a2dd3c33c lib/codeql/rust/elements/internal/MacroCallConstructor.qll 707fee4fba1fd632cd00128f493e8919eaaea552ad653af4c1b7a138e362907d b49e7e36bf9306199f2326af042740ff858871b5c79f6aeddf3d5037044dbf1f lib/codeql/rust/elements/internal/MacroDefConstructor.qll 382a3bdf46905d112ee491620cc94f87d584d72f49e01eb1483f749e4709c055 eb61b90d8d8d655c2b00ff576ae20c8da9709eeef754212bc64d8e1558ad05ce -lib/codeql/rust/elements/internal/MacroDefImpl.qll 73db95ff82834e0063699c7d31349b65e95ba7436fe0a8914dbdd3a383f8b1c9 cd2f078f84ce73fdc88b207df105b297f2cd3b780428968214443af3a2719e8f lib/codeql/rust/elements/internal/MacroExprConstructor.qll b12edb21ea189a1b28d96309c69c3d08e08837621af22edd67ff9416c097d2df d35bc98e7b7b5451930214c0d93dce33a2c7b5b74f36bf99f113f53db1f19c14 -lib/codeql/rust/elements/internal/MacroExprImpl.qll 35b0f734e62d054e0f7678b28454a07371acc5f6fb2ae73e814c54a4b8eb928a cd3d3d9af009b0103dd42714b1f6531ee6d96f9f40b7c141267ce974ef95b70e lib/codeql/rust/elements/internal/MacroItemsConstructor.qll 8e9ab7ec1e0f50a22605d4e993f99a85ca8059fbb506d67bc8f5a281af367b05 2602f9db31ea0c48192c3dde3bb5625a8ed1cae4cd3408729b9e09318d5bd071 -lib/codeql/rust/elements/internal/MacroItemsImpl.qll f89f46b578f27241e055acf56e8b4495da042ad37fb3e091f606413d3ac18e14 12e9f6d7196871fb3f0d53cccf19869dc44f623b4888a439a7c213dbe1e439be lib/codeql/rust/elements/internal/MacroPatConstructor.qll 24744c1bbe21c1d249a04205fb09795ae38ed106ba1423e86ccbc5e62359eaa2 4fac3f731a1ffd87c1230d561c5236bd28dcde0d1ce0dcd7d7a84ba393669d4a -lib/codeql/rust/elements/internal/MacroPatImpl.qll c014ffc6c8de9463d61b1d5f0055085543f68918fa9161723565fc946154b437 fb5d0679fe409c8dad7247fdfc1289ef944537f2a51e08bcf4bbb1485ef5fd2a lib/codeql/rust/elements/internal/MacroRulesConstructor.qll dc04726ad59915ec980501c4cd3b3d2ad774f454ddbf138ff5808eba6bd63dea 8d6bf20feb850c47d1176237027ef131f18c5cbb095f6ab8b3ec58cea9bce856 -lib/codeql/rust/elements/internal/MacroRulesImpl.qll 63f5f1151075826697966f91f56e45810de8f2ac3ec84b8fd9f5f160f906f0d5 1b70f90f4b7fb66839cfe0db84825a949ed1518278a56921ed0059857d788e2b lib/codeql/rust/elements/internal/MacroTypeReprConstructor.qll cf8a3bdcd41dda1452200993206593e957825b406b357fc89c6286cb282347ac a82279485416567428ab7bff7b8da7a3d1233fb1cfcdb1b22932ff13bd8c8ec9 -lib/codeql/rust/elements/internal/MacroTypeReprImpl.qll 50d47f2c0732a0fa33ed815e2b70ae0dbe78364abc8091e7bf89936c894a1e39 bf8a6454bb616cb64f51c546701988f00fb2ae9f3fc0dca311d87e7c240eb1b1 lib/codeql/rust/elements/internal/MatchArmConstructor.qll b41c1d5822d54127ce376ef62c6a5fa60e11697319fc7d9c9c54fd313d784a93 96cca80e5684e5893c0e9c0dff365ef8ad9e15ff648c9969ba42d91f95abea05 lib/codeql/rust/elements/internal/MatchArmListConstructor.qll 8bc5ac978fe1158ef70d0ac06bdad9e02aadd657decb64abcc4ea03f6715a87a 4604ab0e524d0de6e19c16711b713f2090c95a8708909816a2b046f1bd83fe24 -lib/codeql/rust/elements/internal/MatchArmListImpl.qll 16de8d9e0768ee42c5069df5c9b6bf21abcbf5345fa90d90b2dfcefd7579d6d9 91575188d9ed55d993ed6141e40f3f30506e4a1030cac4a9ac384f1e0f6880a9 lib/codeql/rust/elements/internal/MatchExprConstructor.qll 0355ca543a0f9ad56697bc2e1e2511fa3f233bc1f6344d9e1c2369106901c696 78622807a1c4bff61b751c715639510146c7a713e0c4f63246e9a2cf302f4875 lib/codeql/rust/elements/internal/MatchGuardConstructor.qll d4cae02d2902fe8d3cb6b9c2796137863f41f55840f6623935a1c99df43f28d8 0c89f2ca71a2fd5a3f365291e784cb779e34ba0542d9285515e1856424cec60d -lib/codeql/rust/elements/internal/MatchGuardImpl.qll 489040ca1ea85edda91405fab3d12321b6541d2888c35356d3c14c707bf1468e 2b60223a822b840356a3668da3f9578e6a9b8f683fcdd3dbd99b5354c7d96095 lib/codeql/rust/elements/internal/MethodCallExprConstructor.qll a1b3c4587f0ae60d206980b1d9e6881d998f29d2b592a73421d6a44124c70c20 8d4eaa3eb54653fac17f7d95e9cc833fe1398d27c02b2388cd9af8724a560ded lib/codeql/rust/elements/internal/MissingConstructor.qll aab0b7f2846f14a5914661a18c7c9eae71b9bde2162a3c5e5e8a8ecafa20e854 8f30b00b5b7918a7500786cc749b61695158b5b3cc8e9f2277b6b6bf0f7850a0 lib/codeql/rust/elements/internal/MissingImpl.qll e81caa383797dfe837cf101fb78d23ab150b32fef7b47ffcc5489bfcd942ac3e 9f3212d45d77e5888e435e7babd55c1e6b42c3c16f5b1f71170ac41f93ee8d0b @@ -348,10 +302,8 @@ lib/codeql/rust/elements/internal/NameConstructor.qll a760134c6d4fc785746e1a5dc0 lib/codeql/rust/elements/internal/NameRefConstructor.qll 5ff6eacc614fd41f98b54cbb4960a07a1471cf4ea291758d33e54a48fd5d1bc4 c538d65414a24dfdbeb49cfd997588227559ba038f0b55d14bb5d89ed1a016f2 lib/codeql/rust/elements/internal/NamedCrate.qll 6c697076387b5af00422e227540d100ff7c03d3001f6a4c5b61433191d022490 2276f85411db199598fc6a5d8d6ec5762e42b1b45c98e398eeb75e69c697b57f lib/codeql/rust/elements/internal/NamedCrateConstructor.qll 72e07ece16f787dfd993982848689dc2e11845aa5634e9ee5ad8865b95cb59dc ea6555ae33cabe408935649b5e8c6218158036a3b7c4e1abc8bd7cd51c05a912 -lib/codeql/rust/elements/internal/NamedCrateImpl.qll ba1f775ca6177a5bdb2ef1891a3fd505642e2fec63910f958f380039499f45bf f66b503b3574d3be75b79870b754015740f58195c4924b71c21ba4e673efd8c4 lib/codeql/rust/elements/internal/NeverTypeReprConstructor.qll 2e0a9c75e389e9ef41a18dd9b5d6c29ffe1d1d633e51ef1de90ec553236d201a 61ea87802fd1c3a68e864ccd76657253a228b06471e4c55bcf94ca2be554f866 lib/codeql/rust/elements/internal/OffsetOfExprConstructor.qll 616e146562adb3ac0fba4d6f55dd6ce60518ed377c0856f1f09ba49593e7bfab 80518ce90fc6d08011d6f5fc2a543958067739e1b0a6a5f2ed90fc9b1db078f0 -lib/codeql/rust/elements/internal/OffsetOfExprImpl.qll e52d4596068cc54719438121f7d5afcaab04e0c70168ac5e4df1a3a0969817a6 6ab37e659d79e02fb2685d6802ae124157bf14b6f790b31688f437c87f40f52c lib/codeql/rust/elements/internal/OrPatConstructor.qll 4ef583e07298487c0c4c6d7c76ffcc04b1e5fe58aba0c1da3e2c8446a9e0c92b 980a6bd176ae5e5b11c134569910c5468ba91f480982d846e222d031a6a05f1a lib/codeql/rust/elements/internal/ParamConstructor.qll b98a2d8969f289fdcc8c0fb11cbd19a3b0c71be038c4a74f5988295a2bae52f0 77d81b31064167945b79b19d9697b57ca24462c3a7cc19e462c4693ce87db532 lib/codeql/rust/elements/internal/ParamListConstructor.qll 3123142ab3cab46fb53d7f3eff6ba2d3ff7a45b78839a53dc1979a9c6a54920e 165f3d777ea257cfcf142cc4ba9a0ebcd1902eb99842b8a6657c87087f3df6fe @@ -359,42 +311,30 @@ lib/codeql/rust/elements/internal/ParenExprConstructor.qll 104b67dc3fd53ab52e2a4 lib/codeql/rust/elements/internal/ParenPatConstructor.qll 9aea3c3b677755177d85c63e20234c234f530a16db20ab699de05ca3f1b59787 29f24aed0d880629a53b30550467ade09a0a778dbf88891769c1e11b0b239f98 lib/codeql/rust/elements/internal/ParenTypeReprConstructor.qll b3825399f90c8546c254df1f3285fe6053b8137e4705978de50017be941c9f42 696fa20ce5bd4731566b88c8ea13df836627354d37cc9d39514d89d8fb730200 lib/codeql/rust/elements/internal/ParenthesizedArgListConstructor.qll 67f49d376e87a58d7b22eb6e8f90c5b3d295a732be657b27ea6b86835a0ac327 6549e4f5bccb2d29dfeb207625f4d940344ac1bb4c7a7ae007a8eb1c4c985da0 -lib/codeql/rust/elements/internal/ParenthesizedArgListImpl.qll c885ff2903fcbe89540aff643d416e8d0dd5dcf1f7a77f48b9952f4679f8c92b 7e5d8e6d77999f02fe4267ceac6892b2063b1252cf5fa3bceab7898c6bad5c54 lib/codeql/rust/elements/internal/PathAstNodeImpl.qll 5a38c42a9127fc2071a9e8f0914996d8c3763e2708805de922e42771de50f649 ebe319cce565497071118cd4c291668bbcdf5fc8942c07efc5a10181b4ce5880 lib/codeql/rust/elements/internal/PathConstructor.qll 5c6354c28faf9f28f3efee8e19bdb82773adcf4b0c1a38788b06af25bcb6bc4a 3e2aeef7b6b9cda7f7f45a6c8119c98803aa644cf6a492cf0fce318eba40fe8f lib/codeql/rust/elements/internal/PathExprBaseImpl.qll e8b09447ee41b4123f7d94c6b366b2602d8022c9644f1088c670c7794307ab2e 96b9b328771aaf19ba18d0591e85fcc915c0f930b2479b433de3bfdd2ea25249 lib/codeql/rust/elements/internal/PathExprConstructor.qll cf6e0a338a8ed2d1042bdee4c2c49be5827e8c572d8c56e828db265d39e59ae3 36a3d1b7c5cc2cf527616be787b32071b9e2a6613a4f6b3f82e2a3b0e02a516f lib/codeql/rust/elements/internal/PathMetaConstructor.qll de6ebd053e66f0c72e6acb59c7a7e7326abfe0331e65080cc539030b93c49e32 327a8d8b5a6d721daa763cb5dac83247f9b2d9650be53ce01cbae02b15fbad94 -lib/codeql/rust/elements/internal/PathMetaImpl.qll 052152ec17c827054b1e9fccfc7cd7cb12fc0787e82242fde5724fd7a77b3b39 677460de83898bdfc9f06460ddb5dab2d4d884a88998c879b7eff5018d9b434a lib/codeql/rust/elements/internal/PathPatConstructor.qll 966c4ea22218ef71e000d7ce8dd5b570c39ad96b9239a3aa8a38292e2a9f36d2 8a1f348e9257ffc6e6bedcd70389b8e7ec2a3ed6e7b3733744ddfab284826e57 lib/codeql/rust/elements/internal/PathSegmentConstructor.qll 2d9639e42035dc7e73b7d6ddb8a977beadc6b4492dee4292b2f85b4409344441 c337fc3b9ef56366428772563e3f25f711474d16e860d3e89c1395a95d9e83e7 lib/codeql/rust/elements/internal/PathTypeReprConstructor.qll e05e7be13d48e7f832e735254777692d4be827a745b1fd94b9649d46fe574393 4aa1e6935a4479b61f205265cbbba01ce96d09a680c20d5decf30d1374d484d4 lib/codeql/rust/elements/internal/PrefixExprConstructor.qll 90c50b0df2d4b4cbf5e2b7d67a9d243a1af9bfff660b7a70d8b9c7859c28bca7 1a1b5ea1f06ed8d41a658c872e8e1915c241a7c799c691df81b9a7b55d8f2f1e lib/codeql/rust/elements/internal/PtrTypeReprConstructor.qll c8bd3502dc23429577fbff0fe3e3c78b812b2237b2bb65862c137083fdaa7a4a 4d5c135be30f71a3712acbc22bdb6c425fa6463043a9ee64543da31151d68366 -lib/codeql/rust/elements/internal/PtrTypeReprImpl.qll cb3cf7960a05f2c1930067fc62c5a207fc5faac143758b9b9e5f117fbd073f2f 40545d4768380f0dde9b708932f92f57566ac49f3f9b4147a8ff2ea90a0947c7 lib/codeql/rust/elements/internal/RangeExprConstructor.qll a0aa90a1c38c5deea56475399016afae2a00a858b961fbbab8ddeb3bc6a08103 0ddf1bcf28aafc56d7334e6138fb268f9b36a429e4cbdd982cd8384e0644076b lib/codeql/rust/elements/internal/RangePatConstructor.qll fe4345cb41d970ab64196ca37eccb26e5b9cf85fab4253cacfd2b31de03bd070 1d09d5ec8203d76aed2dfb7e7f14c0c07d6559c8f589e11860fff8a2c682c1a6 -lib/codeql/rust/elements/internal/RangePatImpl.qll ef11ab2c002896036553231741a7cf896fafa09e22e920e15661b9cbe4393cae 24ac2dcce3055a77f3a5e0b38cf13aebefd2eeaefa53674ff144a6225634ac0d lib/codeql/rust/elements/internal/RefExprConstructor.qll 9ad08c0f3d980a56a2af8857cb84db589941d20ab3ae5c8ece004ccaccaaf950 4cac3ace31b7ed77a72e989fce9cdbae2247f03c28a3f0c50d67385d02c7f193 lib/codeql/rust/elements/internal/RefPatConstructor.qll d8b88c2c468b08072f6f853306eb61eb88ee1e6c5cfb63958f115a64a9715bb3 0c1d6a8af6a66912698acce47e89d4e3239e67f89c228a36a141f9c685c36394 lib/codeql/rust/elements/internal/RefTypeReprConstructor.qll 8e7012b456ebf1cc7a2c50892c0fffd51f0d5d83e417e1d4cabd4d409e3dddc0 4f3c6368bcea5e8c3f0b83591336f01331dc6dabf9c1e8b67de0fc4d640f65f0 -lib/codeql/rust/elements/internal/RefTypeReprImpl.qll 553dd95e1a49ab7aef5db08e7bb550104c604ec33c9a3c7529370cd47c6a0965 8902db7c814f631c2a995df5911a7b13b6a38c524417e4bbbf2bda74ad53e14c lib/codeql/rust/elements/internal/RenameConstructor.qll 65fa2e938978d154701e6cac05b56320b176ee014ef5c20a7b66f3e94fd5c4a7 dfc0ff4606b8e1c14003cc93a0811f4d62ec993b07ff3c1aa0776746577ed103 -lib/codeql/rust/elements/internal/RenameImpl.qll 61c681055f1f86402af0772539f702e9e19a123f8cfcfca225535c3a1a4cb1d7 1aa1c78616c4b54a31c8af74de141aef9e5ada53f3859df631ecb4238faabdbf lib/codeql/rust/elements/internal/RestPatConstructor.qll 45430925ddf08fba70ede44c7f413ddb41b3113c149b7efc276e0c2bf72507b4 25c678898d72446e7a975bb8b7f2fde51e55b59dbd42f2cca997c833b1a995f1 lib/codeql/rust/elements/internal/RetTypeReprConstructor.qll 6dcb56c92a13f5ca2c9a8344bc05638cc611543896c578cd6ca185054f155537 3fe34953ba397dc31533bd28b48df76693e86b51c4a89c26ad4dfdbd816a0874 -lib/codeql/rust/elements/internal/RetTypeReprImpl.qll 321355a9b39193e09ef7c38b807d7f3c221dce06b0cafd2e0ceccdfbb81712e4 02ea0fb17416889b400e0706eeacc0afc6b489b76158e8c26b9b77102df6bd60 lib/codeql/rust/elements/internal/ReturnExprConstructor.qll 57be5afbe20aa8db6e63c1f2871914c19c186730ad7dccaa424038c6305730d5 4d3c4f2e9b38a4b54ff26a0032455cdcca3d35fec201b6c932072a9e31fbb4fe lib/codeql/rust/elements/internal/ReturnTypeSyntaxConstructor.qll 8994672e504d1674e5773157d0ad8a0dc3aad3d64ef295e7722e647e78e36c11 abe7df754721f4ff7f3e3bb22d275976b2e9a1ef51436a461fe52ebd2d29cff1 -lib/codeql/rust/elements/internal/ReturnTypeSyntaxImpl.qll 554af21b52fedfc356cb873e25c2429e6660ae62ea01be708de4342960cf4048 cdc497a3693bb162a7528b75e902c4743b0a974c6c44152f822a16107a83bee4 lib/codeql/rust/elements/internal/SelfParamConstructor.qll a63af1d1ccde6013c09e0397f1247f5ab3efd97f3410dd1b6c15e1fb6cd96e54 0d8977653c074d5010c78144327f8b6c4da07f09d21e5cc3342082cd50107a81 -lib/codeql/rust/elements/internal/SelfParamImpl.qll 4112ffa718b95b3917ac3dfb45f4f4df56c1ee9cbbc61b91ec16628be57001c5 23f49c040a785ff5c9b09891d09007e9878fa78be086a68621d1f4d59d2e5d86 lib/codeql/rust/elements/internal/SlicePatConstructor.qll 19216ec9e87ca98784d78b29b8b06ea9ac428e2faa468f0717d1c0d0a8e7351c 458e5be76aa51aec579566be39486525ec9d4c73d248cb228da74892e2a56c08 -lib/codeql/rust/elements/internal/SlicePatImpl.qll c6176095360e3b23382557242d2d3ff0b5e0f01f8b1c438452518e9c36ff3c70 644ab41a59a619947f69f75e2d0807245d4ddefc247efaeab63b99b4f08c1cc1 lib/codeql/rust/elements/internal/SliceTypeReprConstructor.qll 4576f203450767bfd142b1d6797b6482bb78f7700b6b410475b182d5067504ae 2b5aeaf91d5ea10e2370fa88b86bce7d0691d6d00f18ab8e1a1be917bb1619bb -lib/codeql/rust/elements/internal/SliceTypeReprImpl.qll ba1a53a3ecc90a7f54c003fc9610c782ce169faf9674010e14ed08a947f464e1 ccd1b77eea0a528fca76d5a4d6590ce259727fe38b4a2d7860974bf2c64389bb lib/codeql/rust/elements/internal/SourceFileConstructor.qll 1dc559887ea7798774528b5505c8601c61030c17480f7ffca49b68b76fcc0321 75a635b88622e3110b16795bd12ca6fc4af176c92d6e441518d60aa47255edc1 -lib/codeql/rust/elements/internal/SourceFileImpl.qll 829cc59d508c190fecfcfb0e27df232fd0a53cb98a6c6f110aecc7242db6f794 2834ab836557ae294410ccde023cca6ef6315aa4b78a7c238862437cec697583 lib/codeql/rust/elements/internal/StaticConstructor.qll 6dd7ee3fd16466c407de35b439074b56341fc97a9c36846b725c2eb43fd4a643 5bf5b0e78d0e9eb294a57b91075de6e4b86a9e6335f546c83ec11ab4c51e5679 lib/codeql/rust/elements/internal/StmtImpl.qll ea99d261f32592ff368cc3a1960864989897c92944f1675549e0753964cb562f 9117b4cdfad56f8fa3bc5d921c2146b4ff0658e8914ac51bf48eb3e68599dd6b lib/codeql/rust/elements/internal/StmtListConstructor.qll 435d59019e17a6279110a23d3d5dfbc1d1e16fc358a93a1d688484d22a754866 23fcb60a5cbb66174e459bc10bd7c28ed532fd1ab46f10b9f0c8a6291d3e343f @@ -402,36 +342,25 @@ lib/codeql/rust/elements/internal/StructConstructor.qll 52921ea6e70421fd08884dc0 lib/codeql/rust/elements/internal/StructExprConstructor.qll 69761fa65a4bedf2893fdfc49753fd1289d9eb64cf405227458161b95fa550cb 72ed5f32dcf6a462d9d3cadfc57395a40ee6f4e294a88dbda78761b4a0759ece lib/codeql/rust/elements/internal/StructExprFieldConstructor.qll 6766d7941963904b3a704e64381a478d410c2ef88e8facbc82efca4e781dac96 a14ce465f0f4e43dea5c21c269d803b0ad452d2eb03f4342ea7a9f5d0b357d60 lib/codeql/rust/elements/internal/StructExprFieldListConstructor.qll fda308db380c608d5df1dc48b30bccb32bce31eabff807d0e623b812000a2a2c 84fb7cb24bf61aec602956f867c722d10907b3edfd4dd6946f1349cf6240b4f1 -lib/codeql/rust/elements/internal/StructExprFieldListImpl.qll 93c8e243095ad67e9cf59e6f66af08244fd45539199193d18275d946ea558ee3 53c90a886971cf6d8a6afd10a1f4bb859e0b9ebc17f32fcb220a01c1d6524743 lib/codeql/rust/elements/internal/StructFieldConstructor.qll 07c7ca8cd5666a0d022573e8d4f9a2e8b237c629c729b9563d783f5e34f232ce 82de0f502272ebdc4f3b15aa314611dd20e82f78ad629e79b5459fdcacf44f9e lib/codeql/rust/elements/internal/StructFieldListConstructor.qll c4ed03a31f08e63f77411e443635ae20caa82c0b4ce27a8ca0011ddf85602874 9f6c12949ea06f932c141fed8e6f7d2d93e0d3305dfc60db163feb34ada90917 -lib/codeql/rust/elements/internal/StructFieldListImpl.qll 7b0d40025d49d133ea34d9e6abddca379fc5e1158813c68b9e2bf2b8b17b40a8 67262e95dc760e7f0dd0e8c54ccd9a0abc95d7cca15c22430c1020dbc6366e6a lib/codeql/rust/elements/internal/StructPatConstructor.qll 4289608942b7ca73d5a7760232ef23cd9a1baf63cc1d0dc64e7dfea146194fe4 189aec3a5c376addd75b17a79729837fb4185de4abf45008df3956a2d9cdadb8 lib/codeql/rust/elements/internal/StructPatFieldConstructor.qll 780294d2bbad2062a7c66a0dca370e12551d94dd97540936864cf26cbafd7d0e aa9c717f3ec13927be9c598af06ae0b785fb6645a409acf4eaedf07b0b765079 lib/codeql/rust/elements/internal/StructPatFieldListConstructor.qll f67090a3738f2dc89874325c1ec2d4b4d975a5fdef505f0008a016f33868bebb 1c10b9ae42ed78758f59902c44c3eeebb0bd862c04783f83aa4db5653f12bf0e -lib/codeql/rust/elements/internal/StructPatFieldListImpl.qll 046464430ba9cc0a924bb1370b584650c29b6abdaf0da73faa87cf7ec85cf959 84d236a133a016fbd373dbbc1aa70741f5ea67b3ea678adfac2625bc714419af lib/codeql/rust/elements/internal/TokenImpl.qll 87629ffee74cacc6e8af5e96e18e62fb0fa4043d3ba1e7360daa880e628f8530 d54e213e39ae2b9bb92ab377dc72d72ba5bca88b72d29032507cdcbef201a215 lib/codeql/rust/elements/internal/TokenTreeConstructor.qll 0be1f838b04ff944560aa477cbe4ab1ad0b3f4ae982de84773faac5902fcae45 254b387adc2e1e3c355651ab958785d0b8babbc0030194234698a1219e9497b3 -lib/codeql/rust/elements/internal/TokenTreeImpl.qll 7c16b22a8ff4ad33be25c3d2d43b8f043cab7626538ac5d8938b074dc663b4f4 793e04299d571a8cea2097e6c43136c5e618b31da91ccc68bda334c3d2c3793d lib/codeql/rust/elements/internal/TokenTreeMetaConstructor.qll 059903cc9cbc77d753f1e7833bbc6ba42d55d281bdf0a3ec1c79d0224be1613f b387eb1eb56f83ff9b2831552db5f23af9b8b8bd822e277f2c1e95ed88b71c1f -lib/codeql/rust/elements/internal/TokenTreeMetaImpl.qll e0c30c264f05a5b610c6d1c7bdacd804b4188031e3968756e6670d51b9b7ee02 084adcb4898a694a8be217a416b693e8291848f3802d4437a2004384ab079037 lib/codeql/rust/elements/internal/TraitConstructor.qll 1f790e63c32f1a22ae1b039ca585b5fe6ffef6339c1e2bf8bca108febb433035 535cebd676001bfbbb724d8006fa2da94e585951b8fd54c7dc092732214615b5 lib/codeql/rust/elements/internal/TryBlockModifierConstructor.qll 55a69eced15a1637cb84889e50cf465bbc677baaf4bf3e4e5ab37615018f5803 ee6141225ade44559067474a75b27e3c68dbb149dc9c24dacc1e9d8c791f13f7 -lib/codeql/rust/elements/internal/TryBlockModifierImpl.qll 97ab789b3a0d9f9e851cee967cc92ae28446355e7bfeb7ff598787f18b9fdfa5 6f24a42b5e4c448f3ac447200becbf63b83bf1f26e99fca933f5e4262906d278 lib/codeql/rust/elements/internal/TryExprConstructor.qll 98e3077ebc4d76f687488b344f532b698512af215b66f0a74b5cea8ed180836c b95603c10c262911eeffdf4ccba14849e8443916b360e287963d5f2582d8e434 -lib/codeql/rust/elements/internal/TryExprImpl.qll cacf43a49ba518be3f94e4a355f5889861edc41f77601eff27e0ed774eca6651 5f4a6a346ec457d5de89b32419e8b4c2deddc55e2d61dbb59842d7f34aa11c44 lib/codeql/rust/elements/internal/TupleExprConstructor.qll 71c38786723225d3d90399b8a085b2b2664c62256654db9e1288fadd56745b9d 639ad70b49ebadc027127fbdc9de14e5180169a4285908233bc38ccac6f14110 -lib/codeql/rust/elements/internal/TupleExprImpl.qll daabbc7dd36c615cdd8d3b59e06f4992a302b26554115711f733508836887abe 4c43a26e5f8b68d9d032bb5cd0af88cf9ac9b4b4e40af47dc85dd931ce9db6f8 lib/codeql/rust/elements/internal/TupleFieldConstructor.qll 89d3cf2540235044ed5a89706cfbdebc5cdf9180fd5b6d3376c79a1b2c0430c0 16861fe089aac8e42a5a90d81dd48d5015391d0a06c78ca02bd876d65378699f lib/codeql/rust/elements/internal/TupleFieldListConstructor.qll 4335ba2061b6e4968db9ec05c0b4d3e6a564db89a2df69e036f317672a7900b1 0b8dded875dbf696cf588e8c21acc27332a2ff66ced7bfabdfc1ad621991f888 -lib/codeql/rust/elements/internal/TupleFieldListImpl.qll 2e5141d5894d1cebadef9cd3afe7585779327c4e24390201e1ef05a29401caf8 bbfa1e0b513393012bf2ae43a3aa0e33fce6ea4d110d1be0f039562071f3c547 lib/codeql/rust/elements/internal/TuplePatConstructor.qll 2a5e83ad5b8713a732e610128aeddf14e9b344402d6cf30ff0b43aa39e838418 6d467f7141307523994f03ed7b8e8b1a5bcf860963c9934b90e54582ea38096a lib/codeql/rust/elements/internal/TupleStructPatConstructor.qll 9d68f67a17a5cec0e78907a53eccfa7696be5b0571da4b486c8184274e56344a 3ffa29f546cd6c644be4fecc7415477a3a4dc00d69b8764be9119abe4c6d8b9e lib/codeql/rust/elements/internal/TupleTypeReprConstructor.qll 80c31c25fd27e330690fb500d757a4bbd33f226186d88ea73bfe4cf29a7db508 d572a72fa361990a3d0a3f9b81d1e966e2ba1ac0a60314ec824c1b8b2814c857 -lib/codeql/rust/elements/internal/TupleTypeReprImpl.qll daf679e3cac0eaf1c20880b49b22bbe0822a27cc6ab2c241916b4bf6da995586 ebd87d7fce7d8acd7fa37c4107f8210e60412dd418104bd9fdbdbcde13c8b6a7 lib/codeql/rust/elements/internal/TypeAliasConstructor.qll 048caa79eb7d400971e3e6d7e580867cbee4bd6b9d291aafac423aa96c321e76 d1d1e33a789ae6fa1a96af4d23d6376b9d82e14e3cbb777963e2d2cb8b22f66d lib/codeql/rust/elements/internal/TypeArgConstructor.qll 51d621e170fdf5f91497f8cc8c1764ce8a59fde5a2b9ecfad17ce826a96c56c4 a5bbb329bde456a40ffa84a325a4be1271dbde842c1573d1beb7056c8fb0f681 -lib/codeql/rust/elements/internal/TypeArgImpl.qll 77886af8b2c045463c4c34d781c8f618eec5f5143098548047730f73c7e4a34a 6be6c519b71f9196e0559958e85efe8a78fbce7a90ca2401d7c402e46bc865c9 lib/codeql/rust/elements/internal/TypeBoundConstructor.qll ba99616e65cf2811187016ff23e5b0005cfd0f1123622e908ff8b560aaa5847f fde78432b55b31cf68a3acb7093256217df37539f942c4441d1b1e7bf9271d89 lib/codeql/rust/elements/internal/TypeBoundListConstructor.qll 4b634b3a4ca8909ce8c0d172d9258168c5271435474089902456c2e3e47ae1c5 3af74623ced55b3263c096810a685517d36b75229431b81f3bb8101294940025 lib/codeql/rust/elements/internal/TypeItemImpl.qll e439593cfbf8fb647b69151b7a0ef2b60b7dfa4603d1a0d911b0f924997acd0c 72caab93da71a88df1c0890ae70e866dc607ce61b177243ee60afa555881c72b @@ -443,28 +372,20 @@ lib/codeql/rust/elements/internal/UnimplementedConstructor.qll 70b0489fdc75fed38 lib/codeql/rust/elements/internal/UnimplementedImpl.qll 06771abc088e0a8fc24032c9d2633618e8e40343ef8757a68cc0a70f1617165a 5738f626f1f4f573fdf7dcd5bd57a0948d290ed89342b9160e95ef3c84044f9a lib/codeql/rust/elements/internal/UnionConstructor.qll d650551a1b3ef29c5a770bdad626269cf539ed0c675af954bc847d2c6111f3f6 aca9064ad653a126ab4f03703e96b274587c852dc5e7ff3fea0fec4d45993f10 lib/codeql/rust/elements/internal/UnsafeMetaConstructor.qll 89c041ebd8ff05137d0244c97b9cd8ea1afffbc1d6d3e6aab906546897d851aa 6da0034021f992ae39977694418a4d8f2fe6b426f54f606a2a089c3896e6eb52 -lib/codeql/rust/elements/internal/UnsafeMetaImpl.qll 38134143aec9d5f48762a1d70330a8899bd3e94265f80b0772e7db3987a7a107 7731646d9a29357c7567a08129d018c4b09982781d8b6cb73d93bcea7f71f0a1 lib/codeql/rust/elements/internal/UseBoundGenericArgImpl.qll 2f90bfd5e43113da1155445bef0334ab84acddef102bd62dfa2ef908717a5d09 dd2fa3c6081d79e1d96360dbdb339128cd944e7b7dc26c449c04f970ee1d7848 lib/codeql/rust/elements/internal/UseBoundGenericArgsConstructor.qll 84d4a959d098fcd1713cb169e15b4945d846121701d2c5709b11e19202c21f2b 93113c92be9bc9f0b8530c308fe482dfeddc7dc827fc44049cecb3eab28df731 -lib/codeql/rust/elements/internal/UseBoundGenericArgsImpl.qll 0f98d47c1e09c46dd3da66a4770181a0caae0512b362faaec997af22bb5f4ce7 1919235e50b9d2fee9bd5d407a0bc023a02dbb04b2662349fad5a8d6cfa98069 lib/codeql/rust/elements/internal/UseConstructor.qll a4f790795e18abc29a50d6fbaa0db64cba781e3259a42cbf0468c24ac66b63e7 2fa288f073ac094a838c11f091def2c790b347b6a1b79407c11b10c73d6bff57 lib/codeql/rust/elements/internal/UseTreeConstructor.qll 3e6e834100fcc7249f8a20f8bd9debe09b705fcf5a0e655537e71ac1c6f7956b cdbc84b8f1b009be1e4a7aaba7f5237823cea62c86b38f1794aad97e3dfcf64b lib/codeql/rust/elements/internal/UseTreeListConstructor.qll 973577da5d7b58eb245f108bd1ae2fecc5645f2795421dedf7687b067a233003 f41e5e3ffcb2a387e5c37f56c0b271e8dc20428b6ff4c63e1ee42fcfa4e67d0a -lib/codeql/rust/elements/internal/UseTreeListImpl.qll a155fbfeb9792d511e1f3331d6756ccff6cca18c7ca4cac0faa7184cbb2e0dd4 0eeb1343b2284c02f9a0f0237267c77857a3a3a0f57df8277437313fde38d1b7 lib/codeql/rust/elements/internal/VariantConstructor.qll 0297d4a9a9b32448d6d6063d308c8d0e7a067d028b9ec97de10a1d659ee2cfdd 6a4bee28b340e97d06b262120fd39ab21717233a5bcc142ba542cb1b456eb952 lib/codeql/rust/elements/internal/VariantListConstructor.qll c841fb345eb46ea3978a0ed7a689f8955efc9178044b140b74d98a6bcd0c926a c9e52d112abdba2b60013fa01a944c8770766bf7368f9878e6b13daaa4eed446 -lib/codeql/rust/elements/internal/VariantListImpl.qll 4ceeda617696eb547c707589ba26103cf4c5c3d889955531be24cbf224e79dff 4258196c126fd2fad0e18068cb3d570a67034a8b26e2f13f8223d7f1a246d1a4 lib/codeql/rust/elements/internal/VisibilityConstructor.qll 1fd30663d87945f08d15cfaca54f586a658f26b7a98ea45ac73a35d36d4f65d0 6ddaf11742cc8fbbe03af2aa578394041ae077911e62d2fa6c885ae0543ba53a lib/codeql/rust/elements/internal/WhereClauseConstructor.qll 6d6f0f0376cf45fac37ea0c7c4345d08718d2a3d6d913e591de1de9e640317c9 ff690f3d4391e5f1fae6e9014365810105e8befe9d6b52a82625994319af9ffd -lib/codeql/rust/elements/internal/WhereClauseImpl.qll 006e330df395183d15896e5f81128e24b8274d849fe45afb5040444e4b764226 ed5e8317b5f33104e5c322588dc400755c8852bbb77ef835177b13af7480fd43 lib/codeql/rust/elements/internal/WherePredConstructor.qll f331c37085792a01159e8c218e9ef827e80e99b7c3d5978b6489808f05bd11f8 179cad3e4c5aaaf27755891694ef3569322fcf34c5290e6af49e5b5e3f8aa732 -lib/codeql/rust/elements/internal/WherePredImpl.qll eabd6553a16165ddb0103602d8cff65c6af22580ea7a0e2beabbf795ffabdb2d 8025d8bd2351ec2de8273225a6e59d46748d7bfd7e53251fa4eb90d5140afd92 lib/codeql/rust/elements/internal/WhileExprConstructor.qll 01eb17d834584b3cba0098d367324d137aacfc60860752d9053ec414180897e7 e5e0999fb48a48ba9b3e09f87d8f44f43cc3d8a276059d9f67e7714a1852b8a5 lib/codeql/rust/elements/internal/WildcardPatConstructor.qll 5980c4e5724f88a8cb91365fc2b65a72a47183d01a37f3ff11dcd2021e612dd9 c015e94953e02dc405f8cdc1f24f7cae6b7c1134d69878e99c6858143fc7ab34 lib/codeql/rust/elements/internal/YeetExprConstructor.qll 7763e1717d3672156587250a093dd21680ad88c8224a815b472e1c9bba18f976 70dd1fd50824902362554c8c6075468060d0abbe3b3335957be335057512a417 -lib/codeql/rust/elements/internal/YeetExprImpl.qll e8924147c3ebe0c32d04c5b33edfd82ae965c32479acfd4429eeab525cf42efb b2debcfa42df901f254c58705a5009825ec153464c9ab4b323aa439e5924e59e lib/codeql/rust/elements/internal/YieldExprConstructor.qll 8cbfa6405acb151ee31ccc7c89336948a597d783e8890e5c3e53853850871712 966f685eb6b9063bc359213323d3ff760b536158ecd17608e7618a3e9adf475f -lib/codeql/rust/elements/internal/YieldExprImpl.qll af184649a348ddd0be16dee9daae307240bf123ace09243950342e9d71ededd9 17df90f67dd51623e8a5715b344ccd8740c8fc415af092469f801b99caacb70d lib/codeql/rust/elements/internal/generated/Abi.qll f5a22afe5596c261b4409395056ce3227b25d67602d51d0b72734d870f614df3 06d1c242ccd31f1cc90212823077e1a7a9e93cd3771a14ebe2f0659c979f3dd1 lib/codeql/rust/elements/internal/generated/Addressable.qll 624c380d385af6563885417d1e8ecd5d9b7abf1435c0ab79a1b9a405387874a3 e2755dc2155d6f2bc0e2d54006da0e62ee359440592db9d6a8b73202ef28e64f lib/codeql/rust/elements/internal/generated/ArgList.qll e41f48258082876a8ceac9107209d94fdd00a62d2e4c632987a01a8394c4aff6 bf1982d14f8cd55fa0c3da2c6aab56fc73b15a3572ffc72d9a94f2c860f8f3b7 diff --git a/rust/ql/.gitattributes b/rust/ql/.gitattributes index 2ae7fd51d450..f3527f25e73d 100644 --- a/rust/ql/.gitattributes +++ b/rust/ql/.gitattributes @@ -200,46 +200,27 @@ /lib/codeql/rust/elements/YeetExpr.qll linguist-generated /lib/codeql/rust/elements/YieldExpr.qll linguist-generated /lib/codeql/rust/elements/internal/AbiConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/AbiImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ArgListConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/ArgListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ArrayExprInternal.qll linguist-generated /lib/codeql/rust/elements/internal/ArrayExprInternalConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/ArrayExprInternalImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ArrayTypeReprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/ArrayTypeReprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AsmClobberAbiConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/AsmClobberAbiImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AsmConstConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/AsmConstImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AsmDirSpecConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/AsmDirSpecImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AsmExprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/AsmExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AsmLabelConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/AsmLabelImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AsmOperandExprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/AsmOperandExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AsmOperandImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AsmOperandNamedConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/AsmOperandNamedImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AsmOptionConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/AsmOptionImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AsmOptionsListConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/AsmOptionsListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AsmPieceImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AsmRegOperandConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/AsmRegOperandImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AsmRegSpecConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/AsmRegSpecImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AsmSymConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/AsmSymImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AssocItemListConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/AssocItemListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AssocTypeArgConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/AssocTypeArgImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AttrConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/AttrImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AwaitExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/BecomeExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/BinaryExprConstructor.qll linguist-generated @@ -249,51 +230,36 @@ /lib/codeql/rust/elements/internal/CallExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/CastExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/CfgAtomConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/CfgAtomImpl.qll linguist-generated /lib/codeql/rust/elements/internal/CfgAttrMetaConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/CfgAttrMetaImpl.qll linguist-generated /lib/codeql/rust/elements/internal/CfgCompositeConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/CfgCompositeImpl.qll linguist-generated /lib/codeql/rust/elements/internal/CfgMetaConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/CfgMetaImpl.qll linguist-generated /lib/codeql/rust/elements/internal/CfgPredicateImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ClosureExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/CommentConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ConstArgConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/ConstArgImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ConstBlockPatConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/ConstBlockPatImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ConstConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ConstParamConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/ConstParamImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ContinueExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/CrateConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/DynTraitTypeReprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/EnumConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ExprStmtConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/ExprStmtImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ExternBlockConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/ExternBlockImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ExternCrateConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/ExternCrateImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ExternItemImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ExternItemListConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/ExternItemListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ExtractorStep.qll linguist-generated /lib/codeql/rust/elements/internal/ExtractorStepConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/FieldExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/FieldListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/FnPtrTypeReprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/FnPtrTypeReprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ForBinderConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ForExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ForTypeReprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/ForTypeReprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/FormatArgsArgConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/FormatArgsArgImpl.qll linguist-generated /lib/codeql/rust/elements/internal/FormatArgsArgNameConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/FormatArgsArgNameImpl.qll linguist-generated /lib/codeql/rust/elements/internal/FormatArgsExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/FunctionConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/GenericArgImpl.qll linguist-generated @@ -307,41 +273,29 @@ /lib/codeql/rust/elements/internal/IndexExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/InferTypeReprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ItemListConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/ItemListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/KeyValueMetaConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/KeyValueMetaImpl.qll linguist-generated /lib/codeql/rust/elements/internal/LabelConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/LetElseConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/LetExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/LetStmtConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/LifetimeArgConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/LifetimeArgImpl.qll linguist-generated /lib/codeql/rust/elements/internal/LifetimeConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/LifetimeParamConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/LifetimeParamImpl.qll linguist-generated /lib/codeql/rust/elements/internal/LiteralExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/LiteralPatConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/LoopExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/LoopingExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/MacroCallConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/MacroDefConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/MacroDefImpl.qll linguist-generated /lib/codeql/rust/elements/internal/MacroExprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/MacroExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/MacroItemsConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/MacroItemsImpl.qll linguist-generated /lib/codeql/rust/elements/internal/MacroPatConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/MacroPatImpl.qll linguist-generated /lib/codeql/rust/elements/internal/MacroRulesConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/MacroRulesImpl.qll linguist-generated /lib/codeql/rust/elements/internal/MacroTypeReprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/MacroTypeReprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/MatchArmConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/MatchArmListConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/MatchArmListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/MatchExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/MatchGuardConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/MatchGuardImpl.qll linguist-generated /lib/codeql/rust/elements/internal/MethodCallExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/MissingConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/MissingImpl.qll linguist-generated @@ -350,10 +304,8 @@ /lib/codeql/rust/elements/internal/NameRefConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/NamedCrate.qll linguist-generated /lib/codeql/rust/elements/internal/NamedCrateConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/NamedCrateImpl.qll linguist-generated /lib/codeql/rust/elements/internal/NeverTypeReprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/OffsetOfExprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/OffsetOfExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/OrPatConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ParamConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ParamListConstructor.qll linguist-generated @@ -361,42 +313,30 @@ /lib/codeql/rust/elements/internal/ParenPatConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ParenTypeReprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ParenthesizedArgListConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/ParenthesizedArgListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/PathAstNodeImpl.qll linguist-generated /lib/codeql/rust/elements/internal/PathConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/PathExprBaseImpl.qll linguist-generated /lib/codeql/rust/elements/internal/PathExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/PathMetaConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/PathMetaImpl.qll linguist-generated /lib/codeql/rust/elements/internal/PathPatConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/PathSegmentConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/PathTypeReprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/PrefixExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/PtrTypeReprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/PtrTypeReprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/RangeExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/RangePatConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/RangePatImpl.qll linguist-generated /lib/codeql/rust/elements/internal/RefExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/RefPatConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/RefTypeReprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/RefTypeReprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/RenameConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/RenameImpl.qll linguist-generated /lib/codeql/rust/elements/internal/RestPatConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/RetTypeReprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/RetTypeReprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ReturnExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ReturnTypeSyntaxConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/ReturnTypeSyntaxImpl.qll linguist-generated /lib/codeql/rust/elements/internal/SelfParamConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/SelfParamImpl.qll linguist-generated /lib/codeql/rust/elements/internal/SlicePatConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/SlicePatImpl.qll linguist-generated /lib/codeql/rust/elements/internal/SliceTypeReprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/SliceTypeReprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/SourceFileConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/SourceFileImpl.qll linguist-generated /lib/codeql/rust/elements/internal/StaticConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/StmtImpl.qll linguist-generated /lib/codeql/rust/elements/internal/StmtListConstructor.qll linguist-generated @@ -404,36 +344,25 @@ /lib/codeql/rust/elements/internal/StructExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/StructExprFieldConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/StructExprFieldListConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/StructExprFieldListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/StructFieldConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/StructFieldListConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/StructFieldListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/StructPatConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/StructPatFieldConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/StructPatFieldListConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/StructPatFieldListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TokenImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TokenTreeConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/TokenTreeImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TokenTreeMetaConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/TokenTreeMetaImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TraitConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/TryBlockModifierConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/TryBlockModifierImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TryExprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/TryExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TupleExprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/TupleExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TupleFieldConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/TupleFieldListConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/TupleFieldListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TuplePatConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/TupleStructPatConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/TupleTypeReprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/TupleTypeReprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TypeAliasConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/TypeArgConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/TypeArgImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TypeBoundConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/TypeBoundListConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/TypeItemImpl.qll linguist-generated @@ -445,28 +374,20 @@ /lib/codeql/rust/elements/internal/UnimplementedImpl.qll linguist-generated /lib/codeql/rust/elements/internal/UnionConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/UnsafeMetaConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/UnsafeMetaImpl.qll linguist-generated /lib/codeql/rust/elements/internal/UseBoundGenericArgImpl.qll linguist-generated /lib/codeql/rust/elements/internal/UseBoundGenericArgsConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/UseBoundGenericArgsImpl.qll linguist-generated /lib/codeql/rust/elements/internal/UseConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/UseTreeConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/UseTreeListConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/UseTreeListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/VariantConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/VariantListConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/VariantListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/VisibilityConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/WhereClauseConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/WhereClauseImpl.qll linguist-generated /lib/codeql/rust/elements/internal/WherePredConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/WherePredImpl.qll linguist-generated /lib/codeql/rust/elements/internal/WhileExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/WildcardPatConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/YeetExprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/YeetExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/YieldExprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/YieldExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/generated/Abi.qll linguist-generated /lib/codeql/rust/elements/internal/generated/Addressable.qll linguist-generated /lib/codeql/rust/elements/internal/generated/ArgList.qll linguist-generated diff --git a/rust/ql/lib/codeql/rust/elements/internal/AbiImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AbiImpl.qll index 2534d71e610c..adc08fc02304 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AbiImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AbiImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `Abi`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.Abi * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An ABI specification for an extern function or block. * @@ -21,5 +21,7 @@ module Impl { * // ^^^ * ``` */ - class Abi extends Generated::Abi { } + class Abi extends Generated::Abi { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ArgListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ArgListImpl.qll index f5fd9a066a78..1816402bf14e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ArgListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ArgListImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ArgList`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.ArgList * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A list of arguments in a function or method call. * @@ -21,5 +21,7 @@ module Impl { * // ^^^^^^^^^ * ``` */ - class ArgList extends Generated::ArgList { } + class ArgList extends Generated::ArgList { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ArrayExprInternalImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ArrayExprInternalImpl.qll index df972e84525d..174417b1dab1 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ArrayExprInternalImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ArrayExprInternalImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ArrayExprInternal`. * @@ -12,5 +11,7 @@ private import codeql.rust.elements.internal.generated.ArrayExprInternal * be referenced directly. */ module Impl { - class ArrayExprInternal extends Generated::ArrayExprInternal { } + class ArrayExprInternal extends Generated::ArrayExprInternal { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ArrayTypeReprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ArrayTypeReprImpl.qll index cb72de9b87eb..76f2748ee40b 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ArrayTypeReprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ArrayTypeReprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ArrayTypeRepr`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.ArrayTypeRepr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An array type representation. * @@ -21,5 +21,7 @@ module Impl { * // ^^^^^^^^ * ``` */ - class ArrayTypeRepr extends Generated::ArrayTypeRepr { } + class ArrayTypeRepr extends Generated::ArrayTypeRepr { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/AsmClobberAbiImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AsmClobberAbiImpl.qll index aa8a49e0fa24..3b0e4bb2917d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AsmClobberAbiImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AsmClobberAbiImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `AsmClobberAbi`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.AsmClobberAbi * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A clobbered ABI in an inline assembly block. * @@ -22,5 +22,7 @@ module Impl { * // ^^^^^^^^^^^^^^^^ * ``` */ - class AsmClobberAbi extends Generated::AsmClobberAbi { } + class AsmClobberAbi extends Generated::AsmClobberAbi { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/AsmConstImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AsmConstImpl.qll index 2c66fc52a3fc..d753838d8135 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AsmConstImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AsmConstImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `AsmConst`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.AsmConst * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A constant operand in an inline assembly block. * @@ -22,5 +22,7 @@ module Impl { * // ^^^^^^^ * ``` */ - class AsmConst extends Generated::AsmConst { } + class AsmConst extends Generated::AsmConst { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/AsmDirSpecImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AsmDirSpecImpl.qll index d9c284eca28c..379d1aba0426 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AsmDirSpecImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AsmDirSpecImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `AsmDirSpec`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.AsmDirSpec * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An inline assembly direction specifier. * @@ -22,5 +22,7 @@ module Impl { * // ^^^ ^^ * ``` */ - class AsmDirSpec extends Generated::AsmDirSpec { } + class AsmDirSpec extends Generated::AsmDirSpec { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/AsmExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AsmExprImpl.qll index 338f4772a53e..1f281d87c3d5 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AsmExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AsmExprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `AsmExpr`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.AsmExpr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An inline assembly expression. For example: * ```rust @@ -21,5 +21,7 @@ module Impl { * } * ``` */ - class AsmExpr extends Generated::AsmExpr { } + class AsmExpr extends Generated::AsmExpr { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/AsmLabelImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AsmLabelImpl.qll index ee89b6cb27d5..bc681076f5db 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AsmLabelImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AsmLabelImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `AsmLabel`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.AsmLabel * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A label in an inline assembly block. * @@ -25,5 +25,7 @@ module Impl { * ); * ``` */ - class AsmLabel extends Generated::AsmLabel { } + class AsmLabel extends Generated::AsmLabel { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/AsmOperandExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AsmOperandExprImpl.qll index ee0db41767aa..a3295686857a 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AsmOperandExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AsmOperandExprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `AsmOperandExpr`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.AsmOperandExpr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An operand expression in an inline assembly block. * @@ -22,5 +22,7 @@ module Impl { * // ^ ^ * ``` */ - class AsmOperandExpr extends Generated::AsmOperandExpr { } + class AsmOperandExpr extends Generated::AsmOperandExpr { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/AsmOperandNamedImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AsmOperandNamedImpl.qll index dd45bcc05a9a..522ce7ed07ce 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AsmOperandNamedImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AsmOperandNamedImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `AsmOperandNamed`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.AsmOperandNamed * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A named operand in an inline assembly block. * @@ -22,5 +22,7 @@ module Impl { * // ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^ * ``` */ - class AsmOperandNamed extends Generated::AsmOperandNamed { } + class AsmOperandNamed extends Generated::AsmOperandNamed { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/AsmOptionImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AsmOptionImpl.qll index 60d56d225810..10973c0e0d0d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AsmOptionImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AsmOptionImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `AsmOption`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.AsmOption * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An option in an inline assembly block. * @@ -22,5 +22,7 @@ module Impl { * // ^^^^^^^^^^^^^^^^ * ``` */ - class AsmOption extends Generated::AsmOption { } + class AsmOption extends Generated::AsmOption { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/AsmOptionsListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AsmOptionsListImpl.qll index ca8e80f82ecc..47ef16b26a06 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AsmOptionsListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AsmOptionsListImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `AsmOptionsList`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.AsmOptionsList * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A list of options in an inline assembly block. * @@ -22,5 +22,7 @@ module Impl { * // ^^^^^^^^^^^^^^^^ * ``` */ - class AsmOptionsList extends Generated::AsmOptionsList { } + class AsmOptionsList extends Generated::AsmOptionsList { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/AsmRegOperandImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AsmRegOperandImpl.qll index d3d6b24c15a3..810b37964e73 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AsmRegOperandImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AsmRegOperandImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `AsmRegOperand`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.AsmRegOperand * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A register operand in an inline assembly block. * @@ -22,5 +22,7 @@ module Impl { * // ^ ^ * ``` */ - class AsmRegOperand extends Generated::AsmRegOperand { } + class AsmRegOperand extends Generated::AsmRegOperand { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/AsmRegSpecImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AsmRegSpecImpl.qll index 24798bae93c8..563bdc80fe82 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AsmRegSpecImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AsmRegSpecImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `AsmRegSpec`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.AsmRegSpec * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A register specification in an inline assembly block. * @@ -22,5 +22,7 @@ module Impl { * // ^^^ ^^^ * ``` */ - class AsmRegSpec extends Generated::AsmRegSpec { } + class AsmRegSpec extends Generated::AsmRegSpec { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/AsmSymImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AsmSymImpl.qll index ad118f38d1c5..c7d25e88a974 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AsmSymImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AsmSymImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `AsmSym`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.AsmSym * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A symbol operand in an inline assembly block. * @@ -22,5 +22,7 @@ module Impl { * // ^^^^^^^^^^^^^^^^^^^^^^ * ``` */ - class AsmSym extends Generated::AsmSym { } + class AsmSym extends Generated::AsmSym { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/AssocItemListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AssocItemListImpl.qll index f68c9e5fbe3f..6b492d9db722 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AssocItemListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AssocItemListImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `AssocItemList`. * @@ -12,8 +11,11 @@ private import codeql.rust.elements.internal.generated.AssocItemList * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A list of `AssocItem` elements, as appearing in a `Trait` or `Impl`. */ - class AssocItemList extends Generated::AssocItemList { } + class AssocItemList extends Generated::AssocItemList { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/AssocTypeArgImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AssocTypeArgImpl.qll index fab477d4c3f6..aa0c222f3b62 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AssocTypeArgImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AssocTypeArgImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `AssocTypeArg`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.AssocTypeArg * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An associated type argument in a path. * @@ -26,5 +26,7 @@ module Impl { * } * ``` */ - class AssocTypeArg extends Generated::AssocTypeArg { } + class AssocTypeArg extends Generated::AssocTypeArg { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/AttrImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AttrImpl.qll index e01d3c3652e4..dc948c3f9007 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AttrImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AttrImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `Attr`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.Attr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An attribute applied to an item. * @@ -22,5 +22,7 @@ module Impl { * struct S; * ``` */ - class Attr extends Generated::Attr { } + class Attr extends Generated::Attr { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/CfgAtomImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/CfgAtomImpl.qll index 6f1515cb7d1b..6a66a0efcc74 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/CfgAtomImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/CfgAtomImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `CfgAtom`. * @@ -12,5 +11,7 @@ private import codeql.rust.elements.internal.generated.CfgAtom * be referenced directly. */ module Impl { - class CfgAtom extends Generated::CfgAtom { } + class CfgAtom extends Generated::CfgAtom { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/CfgAttrMetaImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/CfgAttrMetaImpl.qll index 5e189d4126de..f9c79f2e4939 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/CfgAttrMetaImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/CfgAttrMetaImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `CfgAttrMeta`. * @@ -12,5 +11,7 @@ private import codeql.rust.elements.internal.generated.CfgAttrMeta * be referenced directly. */ module Impl { - class CfgAttrMeta extends Generated::CfgAttrMeta { } + class CfgAttrMeta extends Generated::CfgAttrMeta { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/CfgCompositeImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/CfgCompositeImpl.qll index 58c9a10af763..7dba801a875a 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/CfgCompositeImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/CfgCompositeImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `CfgComposite`. * @@ -12,5 +11,7 @@ private import codeql.rust.elements.internal.generated.CfgComposite * be referenced directly. */ module Impl { - class CfgComposite extends Generated::CfgComposite { } + class CfgComposite extends Generated::CfgComposite { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/CfgMetaImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/CfgMetaImpl.qll index f3c75352121e..6f1fc84e4ba4 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/CfgMetaImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/CfgMetaImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `CfgMeta`. * @@ -12,5 +11,7 @@ private import codeql.rust.elements.internal.generated.CfgMeta * be referenced directly. */ module Impl { - class CfgMeta extends Generated::CfgMeta { } + class CfgMeta extends Generated::CfgMeta { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ClosureExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ClosureExprImpl.qll index cef396dea18b..b55fc8aca390 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ClosureExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ClosureExprImpl.qll @@ -28,7 +28,9 @@ module Impl { * ``` */ class ClosureExpr extends Generated::ClosureExpr { - override string toStringImpl() { result = "|...| " + this.getBody().toAbbreviatedString() } + override string toStringImpl() { + result = "|...| " + concat(this.getBody().toAbbreviatedString()) + } override Expr getBody() { result = this.getClosureBody() } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ConstArgImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ConstArgImpl.qll index 7a5a78df17cc..90276ee6f06e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ConstArgImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ConstArgImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ConstArg`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.ConstArg * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A constant argument in a generic argument list. * @@ -21,5 +21,7 @@ module Impl { * // ^ * ``` */ - class ConstArg extends Generated::ConstArg { } + class ConstArg extends Generated::ConstArg { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ConstBlockPatImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ConstBlockPatImpl.qll index 7d823a729568..52a9090dbaaa 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ConstBlockPatImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ConstBlockPatImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ConstBlockPat`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.ConstBlockPat * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A const block pattern. For example: * ```rust @@ -21,5 +21,7 @@ module Impl { * }; * ``` */ - class ConstBlockPat extends Generated::ConstBlockPat { } + class ConstBlockPat extends Generated::ConstBlockPat { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ConstImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ConstImpl.qll index e90ae6217798..c71260913f79 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ConstImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ConstImpl.qll @@ -28,7 +28,7 @@ module Impl { /** Gets an access to this constant item. */ ConstAccess getAnAccess() { this = result.getConst() } - override string toStringImpl() { result = "const " + this.getName().getText() } + override string toStringImpl() { result = "const " + concat(this.getName().getText()) } } /** diff --git a/rust/ql/lib/codeql/rust/elements/internal/ConstParamImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ConstParamImpl.qll index e4ff7186254f..7e41ee37e5f1 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ConstParamImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ConstParamImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ConstParam`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.ConstParam * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A constant parameter in a generic parameter list. * @@ -21,5 +21,7 @@ module Impl { * // ^^^^^^^^^^^^^^ * ``` */ - class ConstParam extends Generated::ConstParam { } + class ConstParam extends Generated::ConstParam { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/DynTraitTypeReprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/DynTraitTypeReprImpl.qll index 53e46a5f65a7..91f09efab90b 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/DynTraitTypeReprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/DynTraitTypeReprImpl.qll @@ -25,6 +25,8 @@ module Impl { * ``` */ class DynTraitTypeRepr extends Generated::DynTraitTypeRepr { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** Gets the trait that this trait object refers to. */ pragma[nomagic] Trait getTrait() { diff --git a/rust/ql/lib/codeql/rust/elements/internal/ElementImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ElementImpl.qll index 277e77d8eab5..56ce9c6b7322 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ElementImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ElementImpl.qll @@ -124,7 +124,7 @@ module Impl { class Element extends Generated::Element { Element() { MacroExpansion::isRelevantElement(this) } - override string toStringImpl() { result = this.getAPrimaryQlClass() } + override string toStringImpl() { none() } /** * INTERNAL: Do not use. diff --git a/rust/ql/lib/codeql/rust/elements/internal/EnumImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/EnumImpl.qll index 3862cc42137e..568dae0e7df0 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/EnumImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/EnumImpl.qll @@ -23,7 +23,7 @@ module Impl { * ``` */ class Enum extends Generated::Enum { - override string toStringImpl() { result = "enum " + this.getName().getText() } + override string toStringImpl() { result = "enum " + concat(this.getName().getText()) } /** Gets the variant named `name`, if any. */ pragma[nomagic] diff --git a/rust/ql/lib/codeql/rust/elements/internal/ExprStmtImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ExprStmtImpl.qll index 1f36bd00db7e..0652b7d9090d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ExprStmtImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ExprStmtImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ExprStmt`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.ExprStmt * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An expression statement. For example: * ```rust @@ -20,5 +20,7 @@ module Impl { * use std::env; * ``` */ - class ExprStmt extends Generated::ExprStmt { } + class ExprStmt extends Generated::ExprStmt { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ExternBlockImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ExternBlockImpl.qll index bb60d9c6e660..2c584f6d79fd 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ExternBlockImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ExternBlockImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ExternBlock`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.ExternBlock * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An extern block containing foreign function declarations. * @@ -22,5 +22,7 @@ module Impl { * } * ``` */ - class ExternBlock extends Generated::ExternBlock { } + class ExternBlock extends Generated::ExternBlock { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ExternCrateImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ExternCrateImpl.qll index af9e4005b196..a7e128571a03 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ExternCrateImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ExternCrateImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ExternCrate`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.ExternCrate * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An extern crate declaration. * @@ -20,5 +20,7 @@ module Impl { * extern crate serde; * ``` */ - class ExternCrate extends Generated::ExternCrate { } + class ExternCrate extends Generated::ExternCrate { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ExternItemListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ExternItemListImpl.qll index f2281c5f6d87..0a787d6ff08b 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ExternItemListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ExternItemListImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ExternItemList`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.ExternItemList * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A list of items inside an extern block. * @@ -23,5 +23,7 @@ module Impl { * } * ``` */ - class ExternItemList extends Generated::ExternItemList { } + class ExternItemList extends Generated::ExternItemList { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/FieldExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/FieldExprImpl.qll index db5578b835ae..29591826d0e6 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/FieldExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/FieldExprImpl.qll @@ -31,7 +31,7 @@ module Impl { override string toStringImpl() { exists(string abbr, string name | abbr = this.getContainer().toAbbreviatedString() and - name = this.getIdentifier().getText() and + name = concat(this.getIdentifier().getText()) and if abbr = "..." then result = "... ." + name else result = abbr + "." + name ) } diff --git a/rust/ql/lib/codeql/rust/elements/internal/FnPtrTypeReprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/FnPtrTypeReprImpl.qll index 41d1151ac362..e39ac8ad523e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/FnPtrTypeReprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/FnPtrTypeReprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `FnPtrTypeRepr`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.FnPtrTypeRepr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A function pointer type. * @@ -21,5 +21,7 @@ module Impl { * // ^^^^^^^^^^^^^^ * ``` */ - class FnPtrTypeRepr extends Generated::FnPtrTypeRepr { } + class FnPtrTypeRepr extends Generated::FnPtrTypeRepr { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ForTypeReprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ForTypeReprImpl.qll index 409c0d94c94f..9220b6210dc1 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ForTypeReprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ForTypeReprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ForTypeRepr`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.ForTypeRepr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A function pointer type with a `for` modifier. * @@ -21,5 +21,7 @@ module Impl { * // ^^^^^^^^^^^^^^^^^^^^^^^^^^ * ``` */ - class ForTypeRepr extends Generated::ForTypeRepr { } + class ForTypeRepr extends Generated::ForTypeRepr { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/FormatArgsArgImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/FormatArgsArgImpl.qll index c7fa88b51b0b..d82d243662e5 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/FormatArgsArgImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/FormatArgsArgImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `FormatArgsArg`. * @@ -12,11 +11,14 @@ private import codeql.rust.elements.internal.generated.FormatArgsArg * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A FormatArgsArg. For example the `"world"` in: * ```rust * format_args!("Hello, {}!", "world") * ``` */ - class FormatArgsArg extends Generated::FormatArgsArg { } + class FormatArgsArg extends Generated::FormatArgsArg { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/FormatArgsArgNameImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/FormatArgsArgNameImpl.qll index 31ead66d0ac2..c3ff9f1df7a1 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/FormatArgsArgNameImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/FormatArgsArgNameImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `FormatArgsArgName`. * @@ -12,5 +11,7 @@ private import codeql.rust.elements.internal.generated.FormatArgsArgName * be referenced directly. */ module Impl { - class FormatArgsArgName extends Generated::FormatArgsArgName { } + class FormatArgsArgName extends Generated::FormatArgsArgName { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/FormatArgsExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/FormatArgsExprImpl.qll index 6cc3aa114616..da91d724db3c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/FormatArgsExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/FormatArgsExprImpl.qll @@ -24,6 +24,8 @@ module Impl { * ``` */ class FormatArgsExpr extends Generated::FormatArgsExpr { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + override Format getFormat(int index) { result = rank[index + 1](Format f, int i | f.getParent() = this and f.getIndex() = i | f order by i) diff --git a/rust/ql/lib/codeql/rust/elements/internal/FunctionImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/FunctionImpl.qll index 69b85bb1ee24..c5d3d9c5379a 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/FunctionImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/FunctionImpl.qll @@ -27,7 +27,7 @@ module Impl { * ``` */ class Function extends Generated::Function { - override string toStringImpl() { result = "fn " + this.getName().getText() } + override string toStringImpl() { result = "fn " + concat(this.getName().getText()) } pragma[nomagic] private predicate hasPotentialCommentAt(File f, int line) { diff --git a/rust/ql/lib/codeql/rust/elements/internal/ImplImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ImplImpl.qll index 4c039a6f957f..e8a0ad279130 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ImplImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ImplImpl.qll @@ -34,7 +34,7 @@ module Impl { or not this.hasTraitTy() and trait = "" ) and - result = "impl " + trait + this.getSelfTy().toAbbreviatedString() + " { ... }" + result = "impl " + trait + concat(this.getSelfTy().toAbbreviatedString()) + " { ... }" ) } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ItemImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ItemImpl.qll index 46e554e4b420..0edbad6d2b86 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ItemImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ItemImpl.qll @@ -22,11 +22,11 @@ module Impl { * enum E {} * ``` */ - class Item extends Generated::Item { } - - private class ItemWithAttributeMacroExpansion extends Item { - ItemWithAttributeMacroExpansion() { this.hasAttributeMacroExpansion() } - - override string toStringImpl() { result = "(item with attribute macro expansion)" } + class Item extends Generated::Item { + override string toStringImpl() { + if this.hasAttributeMacroExpansion() + then result = "(item with attribute macro expansion)" + else result = super.toStringImpl() + } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ItemListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ItemListImpl.qll index 2d94e6340dd2..65dda52be4e1 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ItemListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ItemListImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ItemList`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.ItemList * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A list of items in a module or block. * @@ -23,5 +23,7 @@ module Impl { * } * ``` */ - class ItemList extends Generated::ItemList { } + class ItemList extends Generated::ItemList { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/KeyValueMetaImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/KeyValueMetaImpl.qll index ac3befd85b60..3d22c12e1aa1 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/KeyValueMetaImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/KeyValueMetaImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `KeyValueMeta`. * @@ -12,5 +11,7 @@ private import codeql.rust.elements.internal.generated.KeyValueMeta * be referenced directly. */ module Impl { - class KeyValueMeta extends Generated::KeyValueMeta { } + class KeyValueMeta extends Generated::KeyValueMeta { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/LifetimeArgImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/LifetimeArgImpl.qll index db3bd53c8935..5c8dd4d6c3cd 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/LifetimeArgImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/LifetimeArgImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `LifetimeArg`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.LifetimeArg * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A lifetime argument in a generic argument list. * @@ -21,5 +21,7 @@ module Impl { * // ^^ * ``` */ - class LifetimeArg extends Generated::LifetimeArg { } + class LifetimeArg extends Generated::LifetimeArg { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/LifetimeParamImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/LifetimeParamImpl.qll index 7db6c5bcb69f..8baf08712052 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/LifetimeParamImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/LifetimeParamImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `LifetimeParam`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.LifetimeParam * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A lifetime parameter in a generic parameter list. * @@ -21,5 +21,7 @@ module Impl { * // ^^ * ``` */ - class LifetimeParam extends Generated::LifetimeParam { } + class LifetimeParam extends Generated::LifetimeParam { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/MacroCallImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/MacroCallImpl.qll index 8e048517f63c..b5c22bfb69dc 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/MacroCallImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/MacroCallImpl.qll @@ -24,7 +24,9 @@ module Impl { * ``` */ class MacroCall extends Generated::MacroCall { - override string toStringImpl() { result = this.getPath().toAbbreviatedString() + "!..." } + override string toStringImpl() { + result = concat(this.getPath().toAbbreviatedString()) + "!..." + } /** * Gets the macro definition that this macro call resolves to. diff --git a/rust/ql/lib/codeql/rust/elements/internal/MacroDefImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/MacroDefImpl.qll index 90cdfd533c6a..b46d73ce2a17 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/MacroDefImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/MacroDefImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `MacroDef`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.MacroDef * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A Rust 2.0 style declarative macro definition. * @@ -22,5 +22,7 @@ module Impl { * } * ``` */ - class MacroDef extends Generated::MacroDef { } + class MacroDef extends Generated::MacroDef { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/MacroExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/MacroExprImpl.qll index 2dfb6e445ac4..d4e18b6c00fa 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/MacroExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/MacroExprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `MacroExpr`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.MacroExpr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A macro expression, representing the invocation of a macro that produces an expression. * @@ -20,5 +20,7 @@ module Impl { * let y = vec![1, 2, 3]; * ``` */ - class MacroExpr extends Generated::MacroExpr { } + class MacroExpr extends Generated::MacroExpr { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/MacroItemsImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/MacroItemsImpl.qll index 0efb96554a47..c41836fbdcf4 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/MacroItemsImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/MacroItemsImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `MacroItems`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.MacroItems * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A sequence of items generated by a macro. For example: * ```rust @@ -28,5 +28,7 @@ module Impl { * } * ``` */ - class MacroItems extends Generated::MacroItems { } + class MacroItems extends Generated::MacroItems { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/MacroPatImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/MacroPatImpl.qll index 166b105ab959..8a990bb2bb46 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/MacroPatImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/MacroPatImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `MacroPat`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.MacroPat * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A macro pattern, representing the invocation of a macro that produces a pattern. * @@ -29,5 +29,7 @@ module Impl { * } * ``` */ - class MacroPat extends Generated::MacroPat { } + class MacroPat extends Generated::MacroPat { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/MacroRulesImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/MacroRulesImpl.qll index 5d5b45ea84f6..0999afac1682 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/MacroRulesImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/MacroRulesImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `MacroRules`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.MacroRules * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A macro definition using the `macro_rules!` syntax. * ```rust @@ -22,5 +22,7 @@ module Impl { * } * ``` */ - class MacroRules extends Generated::MacroRules { } + class MacroRules extends Generated::MacroRules { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/MacroTypeReprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/MacroTypeReprImpl.qll index 87801fe58770..40bb3a3b57cc 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/MacroTypeReprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/MacroTypeReprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `MacroTypeRepr`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.MacroTypeRepr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A type produced by a macro. * @@ -24,5 +24,7 @@ module Impl { * // ^^^^^^^^^^^^^ * ``` */ - class MacroTypeRepr extends Generated::MacroTypeRepr { } + class MacroTypeRepr extends Generated::MacroTypeRepr { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/MatchArmListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/MatchArmListImpl.qll index 6f77dc0b42fc..7e8b1b521679 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/MatchArmListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/MatchArmListImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `MatchArmList`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.MatchArmList * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A list of arms in a match expression. * @@ -25,5 +25,7 @@ module Impl { * // ^^^^^^^^^^^ * ``` */ - class MatchArmList extends Generated::MatchArmList { } + class MatchArmList extends Generated::MatchArmList { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/MatchGuardImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/MatchGuardImpl.qll index 495fcc88ef65..5ef7a203694b 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/MatchGuardImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/MatchGuardImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `MatchGuard`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.MatchGuard * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A guard condition in a match arm. * @@ -24,5 +24,7 @@ module Impl { * } * ``` */ - class MatchGuard extends Generated::MatchGuard { } + class MatchGuard extends Generated::MatchGuard { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ModuleImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ModuleImpl.qll index 19f63f0790fa..bf1a1b12817d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ModuleImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ModuleImpl.qll @@ -24,6 +24,6 @@ module Impl { * ``` */ class Module extends Generated::Module { - override string toStringImpl() { result = "mod " + this.getName().getText() } + override string toStringImpl() { result = "mod " + concat(this.getName().getText()) } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/NamedCrateImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/NamedCrateImpl.qll index 2dafd18c22b7..ccaca9d83943 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/NamedCrateImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/NamedCrateImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `NamedCrate`. * @@ -12,5 +11,7 @@ private import codeql.rust.elements.internal.generated.NamedCrate * be referenced directly. */ module Impl { - class NamedCrate extends Generated::NamedCrate { } + class NamedCrate extends Generated::NamedCrate { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/OffsetOfExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/OffsetOfExprImpl.qll index 53a0c2e06dc7..0482b91843fe 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/OffsetOfExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/OffsetOfExprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `OffsetOfExpr`. * @@ -12,11 +11,14 @@ private import codeql.rust.elements.internal.generated.OffsetOfExpr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An `offset_of` expression. For example: * ```rust * builtin # offset_of(Struct, field); * ``` */ - class OffsetOfExpr extends Generated::OffsetOfExpr { } + class OffsetOfExpr extends Generated::OffsetOfExpr { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ParamListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ParamListImpl.qll index c0b914c1e3ca..ca9f28f4eaa2 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ParamListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ParamListImpl.qll @@ -22,6 +22,8 @@ module Impl { * ``` */ class ParamList extends Generated::ParamList { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets any of the parameters of this parameter list. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/ParenTypeReprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ParenTypeReprImpl.qll index c96bae09eeb3..8db0462f6b0c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ParenTypeReprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ParenTypeReprImpl.qll @@ -22,6 +22,8 @@ module Impl { * ``` */ class ParenTypeRepr extends Generated::ParenTypeRepr { - override string toStringImpl() { result = "(" + this.getTypeRepr().toAbbreviatedString() + ")" } + override string toStringImpl() { + result = "(" + concat(this.getTypeRepr().toAbbreviatedString()) + ")" + } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ParenthesizedArgListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ParenthesizedArgListImpl.qll index b6b41caea7a5..dbb28970be10 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ParenthesizedArgListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ParenthesizedArgListImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ParenthesizedArgList`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.ParenthesizedArgList * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A parenthesized argument list as used in function traits. * @@ -26,5 +26,7 @@ module Impl { * } * ``` */ - class ParenthesizedArgList extends Generated::ParenthesizedArgList { } + class ParenthesizedArgList extends Generated::ParenthesizedArgList { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/PathMetaImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/PathMetaImpl.qll index fd58653419e7..6e0db162f786 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/PathMetaImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/PathMetaImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `PathMeta`. * @@ -12,5 +11,7 @@ private import codeql.rust.elements.internal.generated.PathMeta * be referenced directly. */ module Impl { - class PathMeta extends Generated::PathMeta { } + class PathMeta extends Generated::PathMeta { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/PathSegmentImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/PathSegmentImpl.qll index 42c32802bc2c..6512d8dd805c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/PathSegmentImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/PathSegmentImpl.qll @@ -22,7 +22,7 @@ module Impl { * - `` */ class PathSegment extends Generated::PathSegment { - override string toStringImpl() { result = this.toAbbreviatedString() } + override string toStringImpl() { result = concat(this.toAbbreviatedString()) } override string toAbbreviatedString() { result = strictconcat(int i | | this.toAbbreviatedStringPart(i), "::" order by i) diff --git a/rust/ql/lib/codeql/rust/elements/internal/PtrTypeReprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/PtrTypeReprImpl.qll index 3e8c80ba0ea4..ca18cb6c862d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/PtrTypeReprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/PtrTypeReprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `PtrTypeRepr`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.PtrTypeRepr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A pointer type. * @@ -22,5 +22,7 @@ module Impl { * // ^^^^^^^^^ * ``` */ - class PtrTypeRepr extends Generated::PtrTypeRepr { } + class PtrTypeRepr extends Generated::PtrTypeRepr { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/RangePatImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/RangePatImpl.qll index dc88a8070a5a..38935f9ca9ad 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/RangePatImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/RangePatImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `RangePat`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.RangePat * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A range pattern. For example: * ```rust @@ -22,5 +22,7 @@ module Impl { * } * ``` */ - class RangePat extends Generated::RangePat { } + class RangePat extends Generated::RangePat { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/RefTypeReprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/RefTypeReprImpl.qll index 334d223a42cf..a3014bfc6cad 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/RefTypeReprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/RefTypeReprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `RefTypeRepr`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.RefTypeRepr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A reference type. * @@ -22,5 +22,7 @@ module Impl { * // ^^^^^^^^ * ``` */ - class RefTypeRepr extends Generated::RefTypeRepr { } + class RefTypeRepr extends Generated::RefTypeRepr { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/RenameImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/RenameImpl.qll index 1788cf98c254..88f9e13a7f5d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/RenameImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/RenameImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `Rename`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.Rename * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A rename in a use declaration. * @@ -21,5 +21,7 @@ module Impl { * // ^^^^^^ * ``` */ - class Rename extends Generated::Rename { } + class Rename extends Generated::Rename { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/RetTypeReprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/RetTypeReprImpl.qll index d8b6a5b9e82c..0c95aa955ac3 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/RetTypeReprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/RetTypeReprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `RetTypeRepr`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.RetTypeRepr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A return type in a function signature. * @@ -21,5 +21,7 @@ module Impl { * // ^^^^^^ * ``` */ - class RetTypeRepr extends Generated::RetTypeRepr { } + class RetTypeRepr extends Generated::RetTypeRepr { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ReturnTypeSyntaxImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ReturnTypeSyntaxImpl.qll index ffb09d726ab9..381d673c4279 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ReturnTypeSyntaxImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ReturnTypeSyntaxImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ReturnTypeSyntax`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.ReturnTypeSyntax * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A return type notation `(..)` to reference or bound the type returned by a trait method * @@ -31,5 +31,7 @@ module Impl { * } * ``` */ - class ReturnTypeSyntax extends Generated::ReturnTypeSyntax { } + class ReturnTypeSyntax extends Generated::ReturnTypeSyntax { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/SelfParamImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/SelfParamImpl.qll index dad7b1d96fb2..11327066a48f 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/SelfParamImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/SelfParamImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `SelfParam`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.SelfParam * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A `self` parameter. For example `self` in: * ```rust @@ -25,5 +25,7 @@ module Impl { * } * ``` */ - class SelfParam extends Generated::SelfParam { } + class SelfParam extends Generated::SelfParam { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/SlicePatImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/SlicePatImpl.qll index d905247cc663..6b2cb0cb8781 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/SlicePatImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/SlicePatImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `SlicePat`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.SlicePat * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A slice pattern. For example: * ```rust @@ -22,5 +22,7 @@ module Impl { * } * ``` */ - class SlicePat extends Generated::SlicePat { } + class SlicePat extends Generated::SlicePat { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/SliceTypeReprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/SliceTypeReprImpl.qll index 3c17ad922a6a..b08521e17a1d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/SliceTypeReprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/SliceTypeReprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `SliceTypeRepr`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.SliceTypeRepr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A slice type. * @@ -21,5 +21,7 @@ module Impl { * // ^^^^^ * ``` */ - class SliceTypeRepr extends Generated::SliceTypeRepr { } + class SliceTypeRepr extends Generated::SliceTypeRepr { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/SourceFileImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/SourceFileImpl.qll index 7be1e405ddfe..e97c066e6f62 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/SourceFileImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/SourceFileImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `SourceFile`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.SourceFile * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A source file. * @@ -21,5 +21,7 @@ module Impl { * fn main() {} * ``` */ - class SourceFile extends Generated::SourceFile { } + class SourceFile extends Generated::SourceFile { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/StaticImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/StaticImpl.qll index 8002947bae8e..69696d243bff 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/StaticImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/StaticImpl.qll @@ -28,7 +28,7 @@ module Impl { /** Gets an access to this static item. */ StaticAccess getAnAccess() { this = result.getStatic() } - override string toStringImpl() { result = "static " + this.getName().getText() } + override string toStringImpl() { result = "static " + concat(this.getName().getText()) } } /** diff --git a/rust/ql/lib/codeql/rust/elements/internal/StmtListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/StmtListImpl.qll index d56b4c49ce21..1e1c6f2a2bca 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/StmtListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/StmtListImpl.qll @@ -27,6 +27,8 @@ module Impl { * ``` */ class StmtList extends Generated::StmtList { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th statement or expression of this statement list (0-based). * diff --git a/rust/ql/lib/codeql/rust/elements/internal/StructExprFieldListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/StructExprFieldListImpl.qll index b4197e55885d..c00d54ab0ce1 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/StructExprFieldListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/StructExprFieldListImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `StructExprFieldList`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.StructExprFieldList * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A list of fields in a struct expression. * @@ -21,5 +21,7 @@ module Impl { * // ^^^^^^^^^^^ * ``` */ - class StructExprFieldList extends Generated::StructExprFieldList { } + class StructExprFieldList extends Generated::StructExprFieldList { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/StructFieldListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/StructFieldListImpl.qll index a6a16d430c21..bcaf879db754 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/StructFieldListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/StructFieldListImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `StructFieldList`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.StructFieldList * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A list of fields in a struct declaration. * @@ -21,5 +21,7 @@ module Impl { * // ^^^^^^^^^^^^^^^ * ``` */ - class StructFieldList extends Generated::StructFieldList { } + class StructFieldList extends Generated::StructFieldList { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/StructImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/StructImpl.qll index 23fa1e76d9a8..4a33d26b06ac 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/StructImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/StructImpl.qll @@ -23,7 +23,7 @@ module Impl { * ``` */ class Struct extends Generated::Struct { - override string toStringImpl() { result = "struct " + this.getName().getText() } + override string toStringImpl() { result = "struct " + concat(this.getName().getText()) } /** Gets the record field named `name`, if any. */ pragma[nomagic] diff --git a/rust/ql/lib/codeql/rust/elements/internal/StructPatFieldListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/StructPatFieldListImpl.qll index a2a078a5bf33..81fa9d687ea2 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/StructPatFieldListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/StructPatFieldListImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `StructPatFieldList`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.StructPatFieldList * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A list of fields in a struct pattern. * @@ -21,5 +21,7 @@ module Impl { * // ^^^^^ * ``` */ - class StructPatFieldList extends Generated::StructPatFieldList { } + class StructPatFieldList extends Generated::StructPatFieldList { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/TokenTreeImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TokenTreeImpl.qll index 15e9c15abe12..3fc3b62278aa 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TokenTreeImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TokenTreeImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `TokenTree`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.TokenTree * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A token tree in a macro definition or invocation. * @@ -25,5 +25,7 @@ module Impl { * // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * ``` */ - class TokenTree extends Generated::TokenTree { } + class TokenTree extends Generated::TokenTree { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/TokenTreeMetaImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TokenTreeMetaImpl.qll index b61b222879d8..33c928c763d3 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TokenTreeMetaImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TokenTreeMetaImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `TokenTreeMeta`. * @@ -12,5 +11,7 @@ private import codeql.rust.elements.internal.generated.TokenTreeMeta * be referenced directly. */ module Impl { - class TokenTreeMeta extends Generated::TokenTreeMeta { } + class TokenTreeMeta extends Generated::TokenTreeMeta { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/TraitImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TraitImpl.qll index bb9ffa83244f..8fb9ea0f1329 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TraitImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TraitImpl.qll @@ -26,7 +26,7 @@ module Impl { * ``` */ class Trait extends Generated::Trait { - override string toStringImpl() { result = "trait " + this.getName().getText() } + override string toStringImpl() { result = "trait " + concat(this.getName().getText()) } /** * Gets the number of generic parameters of this trait. diff --git a/rust/ql/lib/codeql/rust/elements/internal/TryBlockModifierImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TryBlockModifierImpl.qll index 8be62790eeeb..8e478141f23e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TryBlockModifierImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TryBlockModifierImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `TryBlockModifier`. * @@ -12,5 +11,7 @@ private import codeql.rust.elements.internal.generated.TryBlockModifier * be referenced directly. */ module Impl { - class TryBlockModifier extends Generated::TryBlockModifier { } + class TryBlockModifier extends Generated::TryBlockModifier { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/TryExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TryExprImpl.qll index 0eaa4462ea70..dd133194d4d1 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TryExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TryExprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `TryExpr`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.TryExpr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A try expression using the `?` operator. * @@ -21,5 +21,7 @@ module Impl { * // ^ * ``` */ - class TryExpr extends Generated::TryExpr { } + class TryExpr extends Generated::TryExpr { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/TupleExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TupleExprImpl.qll index df818859d879..0a40768fb263 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TupleExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TupleExprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `TupleExpr`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.TupleExpr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A tuple expression. For example: * ```rust @@ -20,5 +20,7 @@ module Impl { * let (a, b) = tuple; * ``` */ - class TupleExpr extends Generated::TupleExpr { } + class TupleExpr extends Generated::TupleExpr { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/TupleFieldImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TupleFieldImpl.qll index f26c855e3cb2..d9ac804c72da 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TupleFieldImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TupleFieldImpl.qll @@ -24,6 +24,8 @@ module Impl { * ``` */ class TupleField extends Generated::TupleField { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** Holds if this tuple field is the `pos`th field of variant `v`. */ predicate isVariantField(Variant v, int pos) { this = v.getTupleField(pos) } diff --git a/rust/ql/lib/codeql/rust/elements/internal/TupleFieldListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TupleFieldListImpl.qll index b52f0477987b..bee2af0a683c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TupleFieldListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TupleFieldListImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `TupleFieldList`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.TupleFieldList * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A list of fields in a tuple struct or tuple variant. * @@ -21,5 +21,7 @@ module Impl { * // ^^^^^^^^^^^^^ * ``` */ - class TupleFieldList extends Generated::TupleFieldList { } + class TupleFieldList extends Generated::TupleFieldList { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/TuplePatImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TuplePatImpl.qll index ac9a723b6e13..b4a9ffed6ef4 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TuplePatImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TuplePatImpl.qll @@ -22,6 +22,8 @@ module Impl { * ``` */ class TuplePat extends Generated::TuplePat { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the arity of the tuple matched by this pattern, if any. * diff --git a/rust/ql/lib/codeql/rust/elements/internal/TupleTypeReprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TupleTypeReprImpl.qll index 47b18d2aca95..f529d731e0f7 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TupleTypeReprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TupleTypeReprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `TupleTypeRepr`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.TupleTypeRepr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A tuple type. * @@ -21,5 +21,7 @@ module Impl { * // ^^^^^^^^^^^^^ * ``` */ - class TupleTypeRepr extends Generated::TupleTypeRepr { } + class TupleTypeRepr extends Generated::TupleTypeRepr { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/TypeArgImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TypeArgImpl.qll index 616bc8e5af5c..56a3cf9ed5a0 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TypeArgImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TypeArgImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `TypeArg`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.TypeArg * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A type argument in a generic argument list. * @@ -21,5 +21,7 @@ module Impl { * // ^^^ * ``` */ - class TypeArg extends Generated::TypeArg { } + class TypeArg extends Generated::TypeArg { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/TypeBoundImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TypeBoundImpl.qll index cf05bbc4adad..918238cd656e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TypeBoundImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TypeBoundImpl.qll @@ -24,6 +24,8 @@ module Impl { * ``` */ class TypeBound extends Generated::TypeBound { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + override string toAbbreviatedString() { result = this.getLifetime().toAbbreviatedString() or diff --git a/rust/ql/lib/codeql/rust/elements/internal/TypeBoundListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TypeBoundListImpl.qll index 0d386b6edb05..f5676dd6dfed 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TypeBoundListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TypeBoundListImpl.qll @@ -22,7 +22,7 @@ module Impl { * ``` */ class TypeBoundList extends Generated::TypeBoundList { - override string toStringImpl() { result = this.toAbbreviatedString() } + override string toStringImpl() { result = concat(this.toAbbreviatedString()) } private string toAbbreviatedStringPart(int index) { result = this.getBound(index).toAbbreviatedString() diff --git a/rust/ql/lib/codeql/rust/elements/internal/UnsafeMetaImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/UnsafeMetaImpl.qll index 7da4ed5ace29..295b6b06b5fa 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/UnsafeMetaImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/UnsafeMetaImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `UnsafeMeta`. * @@ -12,5 +11,7 @@ private import codeql.rust.elements.internal.generated.UnsafeMeta * be referenced directly. */ module Impl { - class UnsafeMeta extends Generated::UnsafeMeta { } + class UnsafeMeta extends Generated::UnsafeMeta { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/UseBoundGenericArgsImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/UseBoundGenericArgsImpl.qll index 5b18c8f49789..eab75ccca592 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/UseBoundGenericArgsImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/UseBoundGenericArgsImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `UseBoundGenericArgs`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.UseBoundGenericArgs * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A use<..> bound to control which generic parameters are captured by an impl Trait return type. * @@ -21,5 +21,7 @@ module Impl { * // ^^^^^^^^ * ``` */ - class UseBoundGenericArgs extends Generated::UseBoundGenericArgs { } + class UseBoundGenericArgs extends Generated::UseBoundGenericArgs { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/UseImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/UseImpl.qll index a5baa18b81c0..78fb41812580 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/UseImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/UseImpl.qll @@ -19,6 +19,8 @@ module Impl { * ``` */ class Use extends Generated::Use { - override string toStringImpl() { result = "use " + this.getUseTree().toAbbreviatedString() } + override string toStringImpl() { + result = "use " + concat(this.getUseTree().toAbbreviatedString()) + } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/UseTreeListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/UseTreeListImpl.qll index d5f86f1ba3a7..de3260b9d8f3 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/UseTreeListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/UseTreeListImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `UseTreeList`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.UseTreeList * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A list of use trees in a use declaration. * @@ -21,5 +21,7 @@ module Impl { * // ^^^^^^^^ * ``` */ - class UseTreeList extends Generated::UseTreeList { } + class UseTreeList extends Generated::UseTreeList { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/VariantListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/VariantListImpl.qll index 2537307d34e1..c671954d10b4 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/VariantListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/VariantListImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `VariantList`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.VariantList * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A list of variants in an enum declaration. * @@ -21,5 +21,7 @@ module Impl { * // ^^^^^^^^^^^ * ``` */ - class VariantList extends Generated::VariantList { } + class VariantList extends Generated::VariantList { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/WhereClauseImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/WhereClauseImpl.qll index aa916bbee56f..00d34f2ea290 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/WhereClauseImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/WhereClauseImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `WhereClause`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.WhereClause * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A where clause in a generic declaration. * @@ -21,5 +21,7 @@ module Impl { * // ^^^^^^^^^^^^^^ * ``` */ - class WhereClause extends Generated::WhereClause { } + class WhereClause extends Generated::WhereClause { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/WherePredImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/WherePredImpl.qll index 9e4231ec5154..58b238c1af9a 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/WherePredImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/WherePredImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `WherePred`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.WherePred * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A predicate in a where clause. * @@ -23,5 +23,7 @@ module Impl { * // ^^^^^^^^^^^^^^^^^^^^^^^^ * ``` */ - class WherePred extends Generated::WherePred { } + class WherePred extends Generated::WherePred { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/YeetExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/YeetExprImpl.qll index 37ddd76f8f8d..4e2049d24f63 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/YeetExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/YeetExprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `YeetExpr`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.YeetExpr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A `yeet` expression. For example: * ```rust @@ -20,5 +20,7 @@ module Impl { * } * ``` */ - class YeetExpr extends Generated::YeetExpr { } + class YeetExpr extends Generated::YeetExpr { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/YieldExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/YieldExprImpl.qll index 573f66266158..8e682a17b2ab 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/YieldExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/YieldExprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `YieldExpr`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.YieldExpr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A `yield` expression. For example: * ```rust @@ -21,5 +21,7 @@ module Impl { * }; * ``` */ - class YieldExpr extends Generated::YieldExpr { } + class YieldExpr extends Generated::YieldExpr { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/internal/AstConsistency.qll b/rust/ql/lib/codeql/rust/internal/AstConsistency.qll index 97f49a42560c..75a87c4e2866 100644 --- a/rust/ql/lib/codeql/rust/internal/AstConsistency.qll +++ b/rust/ql/lib/codeql/rust/internal/AstConsistency.qll @@ -5,6 +5,16 @@ private import rust private import codeql.rust.elements.internal.generated.ParentChild +private predicate missingToString(Element e) { not exists(e.toString()) } + +/** + * Holds if `e` lacks a `toString()` result. + */ +query predicate missingToString(Element e, string cls) { + missingToString(e) and + cls = e.getPrimaryQlClasses() +} + private predicate multipleToStrings(Element e) { strictcount(e.toString()) > 1 } /** @@ -86,6 +96,9 @@ query predicate multipleVariableTargets(VariableAccess va, Variable v1) { */ int getAstInconsistencyCounts(string type) { // total results from all the AST consistency query predicates. + type = "Missing toString" and + result = count(Element e | missingToString(e) | e) + or type = "Multiple toStrings" and result = count(Element e | multipleToStrings(e) | e) or diff --git a/rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected b/rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected index 53067409287f..a21af0bfc183 100644 --- a/rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected +++ b/rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected @@ -174,7 +174,7 @@ macro_expansion.rs: # 1| getPath(): [Path] MyTrait # 1| getSegment(): [PathSegment] MyTrait # 1| getIdentifier(): [NameRef] MyTrait -# 3| getItem(1): [Function] (item with attribute macro expansion) +# 3| getItem(1): [Function] fn # 4| getAttributeMacroExpansion(): [MacroItems] MacroItems # 4| getItem(0): [Function] fn foo # 4| getParamList(): [ParamList] ParamList @@ -190,7 +190,7 @@ macro_expansion.rs: # 5| getIdentifier(): [NameRef] concat # 5| getTokenTree(): [TokenTree] TokenTree # 5| getMacroCallExpansion(): [StringLiteralExpr] "Hello world!" -# 7| getStatement(1): [Function] (item with attribute macro expansion) +# 7| getStatement(1): [Function] fn # 8| getAttributeMacroExpansion(): [MacroItems] MacroItems # 8| getItem(0): [Function] fn inner_0 # 8| getParamList(): [ParamList] ParamList @@ -238,7 +238,7 @@ macro_expansion.rs: # 5| getIdentifier(): [NameRef] concat # 5| getTokenTree(): [TokenTree] TokenTree # 5| getMacroCallExpansion(): [StringLiteralExpr] "Hello world!" -# 7| getStatement(1): [Function] (item with attribute macro expansion) +# 7| getStatement(1): [Function] fn # 8| getAttributeMacroExpansion(): [MacroItems] MacroItems # 8| getItem(0): [Function] fn inner_0 # 8| getParamList(): [ParamList] ParamList @@ -277,9 +277,9 @@ macro_expansion.rs: # 3| getPath(): [Path] add_one # 3| getSegment(): [PathSegment] add_one # 3| getIdentifier(): [NameRef] add_one -# 14| getItem(2): [Function] (item with attribute macro expansion) +# 14| getItem(2): [Function] fn # 15| getAttributeMacroExpansion(): [MacroItems] MacroItems -# 15| getItem(0): [Function] (item with attribute macro expansion) +# 15| getItem(0): [Function] fn # 16| getAttributeMacroExpansion(): [MacroItems] MacroItems # 16| getItem(0): [Function] fn bar_0 # 16| getParamList(): [ParamList] ParamList @@ -298,7 +298,7 @@ macro_expansion.rs: # 15| getPath(): [Path] add_one # 15| getSegment(): [PathSegment] add_one # 15| getIdentifier(): [NameRef] add_one -# 15| getItem(1): [Function] (item with attribute macro expansion) +# 15| getItem(1): [Function] fn # 16| getAttributeMacroExpansion(): [MacroItems] MacroItems # 16| getItem(0): [Function] fn bar_1 # 16| getParamList(): [ParamList] ParamList @@ -328,7 +328,7 @@ macro_expansion.rs: # 15| getPath(): [Path] add_one # 15| getSegment(): [PathSegment] add_one # 15| getIdentifier(): [NameRef] add_one -# 18| getItem(3): [Function] (item with attribute macro expansion) +# 18| getItem(3): [Function] fn # 18| getAttributeMacroExpansion(): [MacroItems] MacroItems # 18| getAttr(0): [Attr] Attr # 18| getMeta(): [PathMeta] PathMeta @@ -343,7 +343,7 @@ macro_expansion.rs: # 28| getVisibility(): [Visibility] pub # 30| getItem(6): [Impl] impl S { ... } # 30| getAssocItemList(): [AssocItemList] AssocItemList -# 31| getAssocItem(0): [Function] (item with attribute macro expansion) +# 31| getAssocItem(0): [Function] fn # 32| getAttributeMacroExpansion(): [MacroItems] MacroItems # 32| getItem(0): [Function] fn bzz_0 # 32| getParamList(): [ParamList] ParamList diff --git a/rust/ql/test/extractor-tests/macro-expansion/test.expected b/rust/ql/test/extractor-tests/macro-expansion/test.expected index 108fa52ced94..65ee3f3e7fad 100644 --- a/rust/ql/test/extractor-tests/macro-expansion/test.expected +++ b/rust/ql/test/extractor-tests/macro-expansion/test.expected @@ -1,19 +1,19 @@ attribute_macros -| macro_expansion.rs:3:1:12:1 | (item with attribute macro expansion) | 0 | macro_expansion.rs:4:1:12:1 | fn foo | -| macro_expansion.rs:3:1:12:1 | (item with attribute macro expansion) | 1 | macro_expansion.rs:4:1:12:1 | fn foo_new | -| macro_expansion.rs:7:5:8:17 | (item with attribute macro expansion) | 0 | macro_expansion.rs:8:5:8:17 | fn inner_0 | -| macro_expansion.rs:7:5:8:17 | (item with attribute macro expansion) | 0 | macro_expansion.rs:8:5:8:17 | fn inner_0 | -| macro_expansion.rs:7:5:8:17 | (item with attribute macro expansion) | 1 | macro_expansion.rs:8:5:8:17 | fn inner_1 | -| macro_expansion.rs:7:5:8:17 | (item with attribute macro expansion) | 1 | macro_expansion.rs:8:5:8:17 | fn inner_1 | -| macro_expansion.rs:14:1:16:15 | (item with attribute macro expansion) | 0 | macro_expansion.rs:15:1:16:15 | (item with attribute macro expansion) | -| macro_expansion.rs:14:1:16:15 | (item with attribute macro expansion) | 1 | macro_expansion.rs:15:1:16:15 | (item with attribute macro expansion) | -| macro_expansion.rs:15:1:16:15 | (item with attribute macro expansion) | 0 | macro_expansion.rs:16:1:16:15 | fn bar_0 | -| macro_expansion.rs:15:1:16:15 | (item with attribute macro expansion) | 0 | macro_expansion.rs:16:1:16:15 | fn bar_1 | -| macro_expansion.rs:15:1:16:15 | (item with attribute macro expansion) | 1 | macro_expansion.rs:16:1:16:15 | fn bar_0_new | -| macro_expansion.rs:15:1:16:15 | (item with attribute macro expansion) | 1 | macro_expansion.rs:16:1:16:15 | fn bar_1_new | -| macro_expansion.rs:31:5:34:5 | (item with attribute macro expansion) | 0 | macro_expansion.rs:32:5:34:5 | fn bzz_0 | -| macro_expansion.rs:31:5:34:5 | (item with attribute macro expansion) | 1 | macro_expansion.rs:32:5:34:5 | fn bzz_1 | -| macro_expansion.rs:31:5:34:5 | (item with attribute macro expansion) | 2 | macro_expansion.rs:32:5:34:5 | fn bzz_2 | +| macro_expansion.rs:3:1:12:1 | fn | 0 | macro_expansion.rs:4:1:12:1 | fn foo | +| macro_expansion.rs:3:1:12:1 | fn | 1 | macro_expansion.rs:4:1:12:1 | fn foo_new | +| macro_expansion.rs:7:5:8:17 | fn | 0 | macro_expansion.rs:8:5:8:17 | fn inner_0 | +| macro_expansion.rs:7:5:8:17 | fn | 0 | macro_expansion.rs:8:5:8:17 | fn inner_0 | +| macro_expansion.rs:7:5:8:17 | fn | 1 | macro_expansion.rs:8:5:8:17 | fn inner_1 | +| macro_expansion.rs:7:5:8:17 | fn | 1 | macro_expansion.rs:8:5:8:17 | fn inner_1 | +| macro_expansion.rs:14:1:16:15 | fn | 0 | macro_expansion.rs:15:1:16:15 | fn | +| macro_expansion.rs:14:1:16:15 | fn | 1 | macro_expansion.rs:15:1:16:15 | fn | +| macro_expansion.rs:15:1:16:15 | fn | 0 | macro_expansion.rs:16:1:16:15 | fn bar_0 | +| macro_expansion.rs:15:1:16:15 | fn | 0 | macro_expansion.rs:16:1:16:15 | fn bar_1 | +| macro_expansion.rs:15:1:16:15 | fn | 1 | macro_expansion.rs:16:1:16:15 | fn bar_0_new | +| macro_expansion.rs:15:1:16:15 | fn | 1 | macro_expansion.rs:16:1:16:15 | fn bar_1_new | +| macro_expansion.rs:31:5:34:5 | fn | 0 | macro_expansion.rs:32:5:34:5 | fn bzz_0 | +| macro_expansion.rs:31:5:34:5 | fn | 1 | macro_expansion.rs:32:5:34:5 | fn bzz_1 | +| macro_expansion.rs:31:5:34:5 | fn | 2 | macro_expansion.rs:32:5:34:5 | fn bzz_2 | derive_macros | macro_expansion.rs:83:1:86:1 | struct MyDerive | 0 | 0 | macro_expansion.rs:83:1:86:1 | impl ...::Debug for MyDerive::<...> { ... } | | macro_expansion.rs:88:1:92:1 | enum MyDeriveEnum | 0 | 0 | macro_expansion.rs:88:1:92:1 | impl ...::PartialEq for MyDeriveEnum::<...> { ... } | diff --git a/rust/ql/test/extractor-tests/macro-in-library/PrintAst.expected b/rust/ql/test/extractor-tests/macro-in-library/PrintAst.expected index 78b3d8cc786e..8f167fdbb3ba 100644 --- a/rust/ql/test/extractor-tests/macro-in-library/PrintAst.expected +++ b/rust/ql/test/extractor-tests/macro-in-library/PrintAst.expected @@ -5,7 +5,7 @@ lib.rs: # 1| getVisibility(): [Visibility] pub macro_in_library.rs: # 1| [SourceFile] SourceFile -# 1| getItem(0): [MacroCall] (item with attribute macro expansion) +# 1| getItem(0): [MacroCall] !... # 2| getAttributeMacroExpansion(): [MacroItems] MacroItems # 2| getItem(0): [Function] fn foo # 2| getParamList(): [ParamList] ParamList diff --git a/rust/ql/test/query-tests/diagnostics/AstConsistencyCounts.expected b/rust/ql/test/query-tests/diagnostics/AstConsistencyCounts.expected index 0028cd74b6ef..9205c8015ad8 100644 --- a/rust/ql/test/query-tests/diagnostics/AstConsistencyCounts.expected +++ b/rust/ql/test/query-tests/diagnostics/AstConsistencyCounts.expected @@ -1,3 +1,4 @@ +| Missing toString | 0 | | Multiple children | 0 | | Multiple locations | 0 | | Multiple parents | 0 | From cce40cc89345b3972da4753dadef7a5a2b86d046 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 8 Sep 2026 14:45:45 +0100 Subject: [PATCH 0747/2098] C++: Add change note. --- cpp/ql/lib/change-notes/2026-09-08-boost-asio-ip-resolve.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 cpp/ql/lib/change-notes/2026-09-08-boost-asio-ip-resolve.md diff --git a/cpp/ql/lib/change-notes/2026-09-08-boost-asio-ip-resolve.md b/cpp/ql/lib/change-notes/2026-09-08-boost-asio-ip-resolve.md new file mode 100644 index 000000000000..9276eed8ed83 --- /dev/null +++ b/cpp/ql/lib/change-notes/2026-09-08-boost-asio-ip-resolve.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added taint flow models for the `boost::asio::ip::basic_resolver::resolve` function. \ No newline at end of file From ae6fb336aa34d1d84c319619e4be642fdbf172c2 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 8 Sep 2026 15:20:56 +0100 Subject: [PATCH 0748/2098] C++: Also add taint from the service argument. --- cpp/ql/lib/ext/Boost.Asio.model.yml | 32 +++--- .../dataflow/external-models/asio_streams.cpp | 33 ++++++- .../dataflow/external-models/flow.expected | 98 ++++++++++++++++--- .../dataflow/external-models/steps.expected | 48 +++++++++ 4 files changed, 178 insertions(+), 33 deletions(-) diff --git a/cpp/ql/lib/ext/Boost.Asio.model.yml b/cpp/ql/lib/ext/Boost.Asio.model.yml index 7f18bf170f84..eb6728af4124 100644 --- a/cpp/ql/lib/ext/Boost.Asio.model.yml +++ b/cpp/ql/lib/ext/Boost.Asio.model.yml @@ -23,19 +23,19 @@ extensions: extensible: summaryModel data: # namespace, type, subtypes, name, signature, ext, input, output, kind, provenance - ["boost::asio", "", False, "buffer", "", "", "Argument[*0]", "ReturnValue", "taint", "manual"] - - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const string &,const string &)", "", "Argument[*0]", "ReturnValue", "taint", "manual"] - - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const string &,const string &,error_code &)", "", "Argument[*0]", "ReturnValue", "taint", "manual"] - - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const string &,const string &,flags)", "", "Argument[*0]", "ReturnValue", "taint", "manual"] - - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const string &,const string &,flags,error_code &)", "", "Argument[*0]", "ReturnValue", "taint", "manual"] - - ["boost::asio::ip", "basic_resolver", False, "resolve", "(string_view,string_view)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["boost::asio::ip", "basic_resolver", False, "resolve", "(string_view,string_view,error_code &)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["boost::asio::ip", "basic_resolver", False, "resolve", "(string_view,string_view,flags)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["boost::asio::ip", "basic_resolver", False, "resolve", "(string_view,string_view,flags,error_code &)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const InternetProtocol &,const string &,const string &)", "", "Argument[*1]", "ReturnValue", "taint", "manual"] - - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const InternetProtocol &,const string &,const string &,error_code &)", "", "Argument[*1]", "ReturnValue", "taint", "manual"] - - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const InternetProtocol &,const string &,const string &,flags)", "", "Argument[*1]", "ReturnValue", "taint", "manual"] - - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const InternetProtocol &,const string &,const string &,flags,error_code &)", "", "Argument[*1]", "ReturnValue", "taint", "manual"] - - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const InternetProtocol &,string_view,string_view)", "", "Argument[1]", "ReturnValue", "taint", "manual"] - - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const InternetProtocol &,string_view,string_view,error_code &)", "", "Argument[1]", "ReturnValue", "taint", "manual"] - - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const InternetProtocol &,string_view,string_view,flags)", "", "Argument[1]", "ReturnValue", "taint", "manual"] - - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const InternetProtocol &,string_view,string_view,flags,error_code &)", "", "Argument[1]", "ReturnValue", "taint", "manual"] \ No newline at end of file + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const string &,const string &)", "", "Argument[*0..1]", "ReturnValue", "taint", "manual"] + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const string &,const string &,error_code &)", "", "Argument[*0..1]", "ReturnValue", "taint", "manual"] + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const string &,const string &,flags)", "", "Argument[*0..1]", "ReturnValue", "taint", "manual"] + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const string &,const string &,flags,error_code &)", "", "Argument[*0..1]", "ReturnValue", "taint", "manual"] + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(string_view,string_view)", "", "Argument[0..1]", "ReturnValue", "taint", "manual"] + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(string_view,string_view,error_code &)", "", "Argument[0..1]", "ReturnValue", "taint", "manual"] + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(string_view,string_view,flags)", "", "Argument[0..1]", "ReturnValue", "taint", "manual"] + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(string_view,string_view,flags,error_code &)", "", "Argument[0..1]", "ReturnValue", "taint", "manual"] + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const InternetProtocol &,const string &,const string &)", "", "Argument[*1..2]", "ReturnValue", "taint", "manual"] + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const InternetProtocol &,const string &,const string &,error_code &)", "", "Argument[*1..2]", "ReturnValue", "taint", "manual"] + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const InternetProtocol &,const string &,const string &,flags)", "", "Argument[*1..2]", "ReturnValue", "taint", "manual"] + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const InternetProtocol &,const string &,const string &,flags,error_code &)", "", "Argument[*1..2]", "ReturnValue", "taint", "manual"] + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const InternetProtocol &,string_view,string_view)", "", "Argument[1..2]", "ReturnValue", "taint", "manual"] + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const InternetProtocol &,string_view,string_view,error_code &)", "", "Argument[1..2]", "ReturnValue", "taint", "manual"] + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const InternetProtocol &,string_view,string_view,flags)", "", "Argument[1..2]", "ReturnValue", "taint", "manual"] + - ["boost::asio::ip", "basic_resolver", False, "resolve", "(const InternetProtocol &,string_view,string_view,flags,error_code &)", "", "Argument[1..2]", "ReturnValue", "taint", "manual"] \ No newline at end of file diff --git a/cpp/ql/test/library-tests/dataflow/external-models/asio_streams.cpp b/cpp/ql/test/library-tests/dataflow/external-models/asio_streams.cpp index 3a3ab528d227..76b2a07fc858 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/asio_streams.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/asio_streams.cpp @@ -148,7 +148,7 @@ void test(boost::asio::ip::tcp::socket &socket) { } } -void test_resolve() { +void test_resolve_host() { boost::asio::ip::tcp::resolver resolver; boost::asio::ip::tcp protocol; boost::asio::ip::resolver_base::flags flags = boost::asio::ip::resolver_base::passive; @@ -178,3 +178,34 @@ void test_resolve() { sink(resolver.resolve(protocol, host_view, service_view, flags)); // $ ir sink(resolver.resolve(protocol, host_view, service_view, flags, error)); // $ ir } + +void test_resolve_service() { + boost::asio::ip::tcp::resolver resolver; + boost::asio::ip::tcp protocol; + boost::asio::ip::resolver_base::flags flags = boost::asio::ip::resolver_base::passive; + boost::system::error_code error; + std::string host(""); + std::string service(source()); + std::string_view host_view(""); + std::string_view service_view(source()); + + sink(resolver.resolve(host, service)); // $ ir + sink(resolver.resolve(host, service, error)); // $ ir + sink(resolver.resolve(host, service, flags)); // $ ir + sink(resolver.resolve(host, service, flags, error)); // $ ir + + sink(resolver.resolve(host_view, service_view)); // $ ir + sink(resolver.resolve(host_view, service_view, error)); // $ ir + sink(resolver.resolve(host_view, service_view, flags)); // $ ir + sink(resolver.resolve(host_view, service_view, flags, error)); // $ ir + + sink(resolver.resolve(protocol, host, service)); // $ ir + sink(resolver.resolve(protocol, host, service, error)); // $ ir + sink(resolver.resolve(protocol, host, service, flags)); // $ ir + sink(resolver.resolve(protocol, host, service, flags, error)); // $ ir + + sink(resolver.resolve(protocol, host_view, service_view)); // $ ir + sink(resolver.resolve(protocol, host_view, service_view, error)); // $ ir + sink(resolver.resolve(protocol, host_view, service_view, flags)); // $ ir + sink(resolver.resolve(protocol, host_view, service_view, flags, error)); // $ ir +} diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index fd0d9c700702..ee6d7539cc0a 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -102,22 +102,22 @@ models | 101 | Summary: BloombergLP::bdlbb; BlobUtil; true; copy; (Blob *,int,const char *,int); ; Argument[*2]; Argument[*0]; taint; manual | | 102 | Summary: BloombergLP::bdlbb; BlobUtil; true; copy; (char *,const Blob &,int,int); ; Argument[*1]; Argument[*0]; taint; manual | | 103 | Summary: BloombergLP::bdlbb; BlobUtil; true; getContiguousRangeOrCopy; ; ; Argument[*1]; ReturnValue[*]; taint; manual | -| 104 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,const string &,const string &); ; Argument[*1]; ReturnValue; taint; manual | -| 105 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,const string &,const string &,error_code &); ; Argument[*1]; ReturnValue; taint; manual | -| 106 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,const string &,const string &,flags); ; Argument[*1]; ReturnValue; taint; manual | -| 107 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,const string &,const string &,flags,error_code &); ; Argument[*1]; ReturnValue; taint; manual | -| 108 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,string_view,string_view); ; Argument[1]; ReturnValue; taint; manual | -| 109 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,string_view,string_view,error_code &); ; Argument[1]; ReturnValue; taint; manual | -| 110 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,string_view,string_view,flags); ; Argument[1]; ReturnValue; taint; manual | -| 111 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,string_view,string_view,flags,error_code &); ; Argument[1]; ReturnValue; taint; manual | -| 112 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const string &,const string &); ; Argument[*0]; ReturnValue; taint; manual | -| 113 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const string &,const string &,error_code &); ; Argument[*0]; ReturnValue; taint; manual | -| 114 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const string &,const string &,flags); ; Argument[*0]; ReturnValue; taint; manual | -| 115 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const string &,const string &,flags,error_code &); ; Argument[*0]; ReturnValue; taint; manual | -| 116 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view); ; Argument[0]; ReturnValue; taint; manual | -| 117 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view,error_code &); ; Argument[0]; ReturnValue; taint; manual | -| 118 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view,flags); ; Argument[0]; ReturnValue; taint; manual | -| 119 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view,flags,error_code &); ; Argument[0]; ReturnValue; taint; manual | +| 104 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,const string &,const string &); ; Argument[*1..2]; ReturnValue; taint; manual | +| 105 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,const string &,const string &,error_code &); ; Argument[*1..2]; ReturnValue; taint; manual | +| 106 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,const string &,const string &,flags); ; Argument[*1..2]; ReturnValue; taint; manual | +| 107 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,const string &,const string &,flags,error_code &); ; Argument[*1..2]; ReturnValue; taint; manual | +| 108 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,string_view,string_view); ; Argument[1..2]; ReturnValue; taint; manual | +| 109 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,string_view,string_view,error_code &); ; Argument[1..2]; ReturnValue; taint; manual | +| 110 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,string_view,string_view,flags); ; Argument[1..2]; ReturnValue; taint; manual | +| 111 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,string_view,string_view,flags,error_code &); ; Argument[1..2]; ReturnValue; taint; manual | +| 112 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const string &,const string &); ; Argument[*0..1]; ReturnValue; taint; manual | +| 113 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const string &,const string &,error_code &); ; Argument[*0..1]; ReturnValue; taint; manual | +| 114 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const string &,const string &,flags); ; Argument[*0..1]; ReturnValue; taint; manual | +| 115 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const string &,const string &,flags,error_code &); ; Argument[*0..1]; ReturnValue; taint; manual | +| 116 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view); ; Argument[0..1]; ReturnValue; taint; manual | +| 117 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view,error_code &); ; Argument[0..1]; ReturnValue; taint; manual | +| 118 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view,flags); ; Argument[0..1]; ReturnValue; taint; manual | +| 119 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view,flags,error_code &); ; Argument[0..1]; ReturnValue; taint; manual | | 120 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | edges | asio_streams.cpp:129:34:129:44 | read_until output argument | asio_streams.cpp:133:7:133:17 | recv_buffer | provenance | Src:MaD:56 | @@ -160,6 +160,38 @@ edges | asio_streams.cpp:177:34:177:42 | host_view | asio_streams.cpp:177:16:177:22 | call to resolve | provenance | MaD:109 | | asio_streams.cpp:178:34:178:42 | host_view | asio_streams.cpp:178:16:178:22 | call to resolve | provenance | MaD:110 | | asio_streams.cpp:179:34:179:42 | host_view | asio_streams.cpp:179:16:179:22 | call to resolve | provenance | MaD:111 | +| asio_streams.cpp:188:22:188:29 | call to source | asio_streams.cpp:192:30:192:36 | *service | provenance | TaintFunction | +| asio_streams.cpp:188:22:188:29 | call to source | asio_streams.cpp:193:30:193:36 | *service | provenance | TaintFunction | +| asio_streams.cpp:188:22:188:29 | call to source | asio_streams.cpp:194:30:194:36 | *service | provenance | TaintFunction | +| asio_streams.cpp:188:22:188:29 | call to source | asio_streams.cpp:195:30:195:36 | *service | provenance | TaintFunction | +| asio_streams.cpp:188:22:188:29 | call to source | asio_streams.cpp:202:40:202:46 | *service | provenance | TaintFunction | +| asio_streams.cpp:188:22:188:29 | call to source | asio_streams.cpp:203:40:203:46 | *service | provenance | TaintFunction | +| asio_streams.cpp:188:22:188:29 | call to source | asio_streams.cpp:204:40:204:46 | *service | provenance | TaintFunction | +| asio_streams.cpp:188:22:188:29 | call to source | asio_streams.cpp:205:40:205:46 | *service | provenance | TaintFunction | +| asio_streams.cpp:190:32:190:39 | call to source | asio_streams.cpp:197:35:197:46 | service_view | provenance | TaintFunction | +| asio_streams.cpp:190:32:190:39 | call to source | asio_streams.cpp:198:35:198:46 | service_view | provenance | TaintFunction | +| asio_streams.cpp:190:32:190:39 | call to source | asio_streams.cpp:199:35:199:46 | service_view | provenance | TaintFunction | +| asio_streams.cpp:190:32:190:39 | call to source | asio_streams.cpp:200:35:200:46 | service_view | provenance | TaintFunction | +| asio_streams.cpp:190:32:190:39 | call to source | asio_streams.cpp:207:45:207:56 | service_view | provenance | TaintFunction | +| asio_streams.cpp:190:32:190:39 | call to source | asio_streams.cpp:208:45:208:56 | service_view | provenance | TaintFunction | +| asio_streams.cpp:190:32:190:39 | call to source | asio_streams.cpp:209:45:209:56 | service_view | provenance | TaintFunction | +| asio_streams.cpp:190:32:190:39 | call to source | asio_streams.cpp:210:45:210:56 | service_view | provenance | TaintFunction | +| asio_streams.cpp:192:30:192:36 | *service | asio_streams.cpp:192:16:192:22 | call to resolve | provenance | MaD:112 | +| asio_streams.cpp:193:30:193:36 | *service | asio_streams.cpp:193:16:193:22 | call to resolve | provenance | MaD:113 | +| asio_streams.cpp:194:30:194:36 | *service | asio_streams.cpp:194:16:194:22 | call to resolve | provenance | MaD:114 | +| asio_streams.cpp:195:30:195:36 | *service | asio_streams.cpp:195:16:195:22 | call to resolve | provenance | MaD:115 | +| asio_streams.cpp:197:35:197:46 | service_view | asio_streams.cpp:197:16:197:22 | call to resolve | provenance | MaD:116 | +| asio_streams.cpp:198:35:198:46 | service_view | asio_streams.cpp:198:16:198:22 | call to resolve | provenance | MaD:117 | +| asio_streams.cpp:199:35:199:46 | service_view | asio_streams.cpp:199:16:199:22 | call to resolve | provenance | MaD:118 | +| asio_streams.cpp:200:35:200:46 | service_view | asio_streams.cpp:200:16:200:22 | call to resolve | provenance | MaD:119 | +| asio_streams.cpp:202:40:202:46 | *service | asio_streams.cpp:202:16:202:22 | call to resolve | provenance | MaD:104 | +| asio_streams.cpp:203:40:203:46 | *service | asio_streams.cpp:203:16:203:22 | call to resolve | provenance | MaD:105 | +| asio_streams.cpp:204:40:204:46 | *service | asio_streams.cpp:204:16:204:22 | call to resolve | provenance | MaD:106 | +| asio_streams.cpp:205:40:205:46 | *service | asio_streams.cpp:205:16:205:22 | call to resolve | provenance | MaD:107 | +| asio_streams.cpp:207:45:207:56 | service_view | asio_streams.cpp:207:16:207:22 | call to resolve | provenance | MaD:108 | +| asio_streams.cpp:208:45:208:56 | service_view | asio_streams.cpp:208:16:208:22 | call to resolve | provenance | MaD:109 | +| asio_streams.cpp:209:45:209:56 | service_view | asio_streams.cpp:209:16:209:22 | call to resolve | provenance | MaD:110 | +| asio_streams.cpp:210:45:210:56 | service_view | asio_streams.cpp:210:16:210:22 | call to resolve | provenance | MaD:111 | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:257:5:257:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:262:5:262:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:266:38:266:41 | *resp | provenance | | @@ -618,6 +650,40 @@ nodes | asio_streams.cpp:178:34:178:42 | host_view | semmle.label | host_view | | asio_streams.cpp:179:16:179:22 | call to resolve | semmle.label | call to resolve | | asio_streams.cpp:179:34:179:42 | host_view | semmle.label | host_view | +| asio_streams.cpp:188:22:188:29 | call to source | semmle.label | call to source | +| asio_streams.cpp:190:32:190:39 | call to source | semmle.label | call to source | +| asio_streams.cpp:192:16:192:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:192:30:192:36 | *service | semmle.label | *service | +| asio_streams.cpp:193:16:193:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:193:30:193:36 | *service | semmle.label | *service | +| asio_streams.cpp:194:16:194:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:194:30:194:36 | *service | semmle.label | *service | +| asio_streams.cpp:195:16:195:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:195:30:195:36 | *service | semmle.label | *service | +| asio_streams.cpp:197:16:197:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:197:35:197:46 | service_view | semmle.label | service_view | +| asio_streams.cpp:198:16:198:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:198:35:198:46 | service_view | semmle.label | service_view | +| asio_streams.cpp:199:16:199:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:199:35:199:46 | service_view | semmle.label | service_view | +| asio_streams.cpp:200:16:200:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:200:35:200:46 | service_view | semmle.label | service_view | +| asio_streams.cpp:202:16:202:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:202:40:202:46 | *service | semmle.label | *service | +| asio_streams.cpp:203:16:203:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:203:40:203:46 | *service | semmle.label | *service | +| asio_streams.cpp:204:16:204:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:204:40:204:46 | *service | semmle.label | *service | +| asio_streams.cpp:205:16:205:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:205:40:205:46 | *service | semmle.label | *service | +| asio_streams.cpp:207:16:207:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:207:45:207:56 | service_view | semmle.label | service_view | +| asio_streams.cpp:208:16:208:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:208:45:208:56 | service_view | semmle.label | service_view | +| asio_streams.cpp:209:16:209:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:209:45:209:56 | service_view | semmle.label | service_view | +| asio_streams.cpp:210:16:210:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:210:45:210:56 | service_view | semmle.label | service_view | | azure.cpp:253:48:253:60 | *call to GetBodyStream | semmle.label | *call to GetBodyStream | | azure.cpp:253:48:253:60 | call to GetBodyStream | semmle.label | call to GetBodyStream | | azure.cpp:257:5:257:8 | *resp | semmle.label | *resp | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/steps.expected b/cpp/ql/test/library-tests/dataflow/external-models/steps.expected index 67c8c074a8ee..04d300ecbc81 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/steps.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/steps.expected @@ -1,20 +1,68 @@ | asio_streams.cpp:142:64:142:71 | *send_str | asio_streams.cpp:142:44:142:62 | call to buffer | | asio_streams.cpp:161:24:161:27 | *host | asio_streams.cpp:161:16:161:22 | call to resolve | +| asio_streams.cpp:161:30:161:36 | *service | asio_streams.cpp:161:16:161:22 | call to resolve | | asio_streams.cpp:162:24:162:27 | *host | asio_streams.cpp:162:16:162:22 | call to resolve | +| asio_streams.cpp:162:30:162:36 | *service | asio_streams.cpp:162:16:162:22 | call to resolve | | asio_streams.cpp:163:24:163:27 | *host | asio_streams.cpp:163:16:163:22 | call to resolve | +| asio_streams.cpp:163:30:163:36 | *service | asio_streams.cpp:163:16:163:22 | call to resolve | | asio_streams.cpp:164:24:164:27 | *host | asio_streams.cpp:164:16:164:22 | call to resolve | +| asio_streams.cpp:164:30:164:36 | *service | asio_streams.cpp:164:16:164:22 | call to resolve | | asio_streams.cpp:166:24:166:32 | host_view | asio_streams.cpp:166:16:166:22 | call to resolve | +| asio_streams.cpp:166:35:166:46 | service_view | asio_streams.cpp:166:16:166:22 | call to resolve | | asio_streams.cpp:167:24:167:32 | host_view | asio_streams.cpp:167:16:167:22 | call to resolve | +| asio_streams.cpp:167:35:167:46 | service_view | asio_streams.cpp:167:16:167:22 | call to resolve | | asio_streams.cpp:168:24:168:32 | host_view | asio_streams.cpp:168:16:168:22 | call to resolve | +| asio_streams.cpp:168:35:168:46 | service_view | asio_streams.cpp:168:16:168:22 | call to resolve | | asio_streams.cpp:169:24:169:32 | host_view | asio_streams.cpp:169:16:169:22 | call to resolve | +| asio_streams.cpp:169:35:169:46 | service_view | asio_streams.cpp:169:16:169:22 | call to resolve | | asio_streams.cpp:171:34:171:37 | *host | asio_streams.cpp:171:16:171:22 | call to resolve | +| asio_streams.cpp:171:40:171:46 | *service | asio_streams.cpp:171:16:171:22 | call to resolve | | asio_streams.cpp:172:34:172:37 | *host | asio_streams.cpp:172:16:172:22 | call to resolve | +| asio_streams.cpp:172:40:172:46 | *service | asio_streams.cpp:172:16:172:22 | call to resolve | | asio_streams.cpp:173:34:173:37 | *host | asio_streams.cpp:173:16:173:22 | call to resolve | +| asio_streams.cpp:173:40:173:46 | *service | asio_streams.cpp:173:16:173:22 | call to resolve | | asio_streams.cpp:174:34:174:37 | *host | asio_streams.cpp:174:16:174:22 | call to resolve | +| asio_streams.cpp:174:40:174:46 | *service | asio_streams.cpp:174:16:174:22 | call to resolve | | asio_streams.cpp:176:34:176:42 | host_view | asio_streams.cpp:176:16:176:22 | call to resolve | +| asio_streams.cpp:176:45:176:56 | service_view | asio_streams.cpp:176:16:176:22 | call to resolve | | asio_streams.cpp:177:34:177:42 | host_view | asio_streams.cpp:177:16:177:22 | call to resolve | +| asio_streams.cpp:177:45:177:56 | service_view | asio_streams.cpp:177:16:177:22 | call to resolve | | asio_streams.cpp:178:34:178:42 | host_view | asio_streams.cpp:178:16:178:22 | call to resolve | +| asio_streams.cpp:178:45:178:56 | service_view | asio_streams.cpp:178:16:178:22 | call to resolve | | asio_streams.cpp:179:34:179:42 | host_view | asio_streams.cpp:179:16:179:22 | call to resolve | +| asio_streams.cpp:179:45:179:56 | service_view | asio_streams.cpp:179:16:179:22 | call to resolve | +| asio_streams.cpp:192:24:192:27 | *host | asio_streams.cpp:192:16:192:22 | call to resolve | +| asio_streams.cpp:192:30:192:36 | *service | asio_streams.cpp:192:16:192:22 | call to resolve | +| asio_streams.cpp:193:24:193:27 | *host | asio_streams.cpp:193:16:193:22 | call to resolve | +| asio_streams.cpp:193:30:193:36 | *service | asio_streams.cpp:193:16:193:22 | call to resolve | +| asio_streams.cpp:194:24:194:27 | *host | asio_streams.cpp:194:16:194:22 | call to resolve | +| asio_streams.cpp:194:30:194:36 | *service | asio_streams.cpp:194:16:194:22 | call to resolve | +| asio_streams.cpp:195:24:195:27 | *host | asio_streams.cpp:195:16:195:22 | call to resolve | +| asio_streams.cpp:195:30:195:36 | *service | asio_streams.cpp:195:16:195:22 | call to resolve | +| asio_streams.cpp:197:24:197:32 | host_view | asio_streams.cpp:197:16:197:22 | call to resolve | +| asio_streams.cpp:197:35:197:46 | service_view | asio_streams.cpp:197:16:197:22 | call to resolve | +| asio_streams.cpp:198:24:198:32 | host_view | asio_streams.cpp:198:16:198:22 | call to resolve | +| asio_streams.cpp:198:35:198:46 | service_view | asio_streams.cpp:198:16:198:22 | call to resolve | +| asio_streams.cpp:199:24:199:32 | host_view | asio_streams.cpp:199:16:199:22 | call to resolve | +| asio_streams.cpp:199:35:199:46 | service_view | asio_streams.cpp:199:16:199:22 | call to resolve | +| asio_streams.cpp:200:24:200:32 | host_view | asio_streams.cpp:200:16:200:22 | call to resolve | +| asio_streams.cpp:200:35:200:46 | service_view | asio_streams.cpp:200:16:200:22 | call to resolve | +| asio_streams.cpp:202:34:202:37 | *host | asio_streams.cpp:202:16:202:22 | call to resolve | +| asio_streams.cpp:202:40:202:46 | *service | asio_streams.cpp:202:16:202:22 | call to resolve | +| asio_streams.cpp:203:34:203:37 | *host | asio_streams.cpp:203:16:203:22 | call to resolve | +| asio_streams.cpp:203:40:203:46 | *service | asio_streams.cpp:203:16:203:22 | call to resolve | +| asio_streams.cpp:204:34:204:37 | *host | asio_streams.cpp:204:16:204:22 | call to resolve | +| asio_streams.cpp:204:40:204:46 | *service | asio_streams.cpp:204:16:204:22 | call to resolve | +| asio_streams.cpp:205:34:205:37 | *host | asio_streams.cpp:205:16:205:22 | call to resolve | +| asio_streams.cpp:205:40:205:46 | *service | asio_streams.cpp:205:16:205:22 | call to resolve | +| asio_streams.cpp:207:34:207:42 | host_view | asio_streams.cpp:207:16:207:22 | call to resolve | +| asio_streams.cpp:207:45:207:56 | service_view | asio_streams.cpp:207:16:207:22 | call to resolve | +| asio_streams.cpp:208:34:208:42 | host_view | asio_streams.cpp:208:16:208:22 | call to resolve | +| asio_streams.cpp:208:45:208:56 | service_view | asio_streams.cpp:208:16:208:22 | call to resolve | +| asio_streams.cpp:209:34:209:42 | host_view | asio_streams.cpp:209:16:209:22 | call to resolve | +| asio_streams.cpp:209:45:209:56 | service_view | asio_streams.cpp:209:16:209:22 | call to resolve | +| asio_streams.cpp:210:34:210:42 | host_view | asio_streams.cpp:210:16:210:22 | call to resolve | +| asio_streams.cpp:210:45:210:56 | service_view | asio_streams.cpp:210:16:210:22 | call to resolve | | azure.cpp:252:79:252:98 | call to string | azure.cpp:252:62:252:99 | call to Url | | azure.cpp:257:5:257:8 | *resp | azure.cpp:257:16:257:21 | Read output argument | | azure.cpp:262:5:262:8 | *resp | azure.cpp:262:23:262:28 | ReadToCount output argument | From aa5e47480b9627f00d2e7ad3188e299c3190cb9e Mon Sep 17 00:00:00 2001 From: Taus Date: Tue, 8 Sep 2026 21:04:21 +0000 Subject: [PATCH 0749/2098] Python: Output JSON from `tsg-python` Changes the current text-based dump of the tsg-python graph to the native JSON output that tree-sitter-graph provides. This saves us the hassle of parsing the output ourselves, including the recently added bug fix that allowed us to interpret Rust-style string escapes in Python. As an added bonus, relying on the json module instead of our own parser roughly cuts the AST reconstruction time in half compared to previously, an extraction speedup in the neighbourhood of 3-4% (when tested on an extraction of `python/cpython` using only the tsg-python parser). --- MODULE.bazel | 1 + misc/bazel/3rdparty/py_deps/BUILD.bazel | 12 ++ misc/bazel/3rdparty/py_deps/defs.bzl | 2 + .../semmle/python/parser/tsg_parser.py | 137 +++++++----------- python/extractor/semmle/util.py | 2 +- python/extractor/tests/test_tsg_parser.py | 135 ++++++++--------- python/extractor/tsg-python/Cargo.lock | 1 + python/extractor/tsg-python/Cargo.toml | 1 + python/extractor/tsg-python/src/main.rs | 5 +- 9 files changed, 140 insertions(+), 156 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index a257c9de25ff..22224cbf1ecf 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -93,6 +93,7 @@ use_repo( "vendor_py__cc-1.2.14", "vendor_py__clap-4.5.30", "vendor_py__regex-1.11.1", + "vendor_py__serde_json-1.0.138", "vendor_py__tree-sitter-0.24.7", "vendor_py__tree-sitter-graph-0.12.0", ) diff --git a/misc/bazel/3rdparty/py_deps/BUILD.bazel b/misc/bazel/3rdparty/py_deps/BUILD.bazel index 86bfde266419..133e44f06738 100644 --- a/misc/bazel/3rdparty/py_deps/BUILD.bazel +++ b/misc/bazel/3rdparty/py_deps/BUILD.bazel @@ -79,6 +79,18 @@ alias( tags = ["manual"], ) +alias( + name = "serde_json-1.0.138", + actual = "@vendor_py__serde_json-1.0.138//:serde_json", + tags = ["manual"], +) + +alias( + name = "serde_json", + actual = "@vendor_py__serde_json-1.0.138//:serde_json", + tags = ["manual"], +) + alias( name = "tree-sitter-0.24.7", actual = "@vendor_py__tree-sitter-0.24.7//:tree_sitter", diff --git a/misc/bazel/3rdparty/py_deps/defs.bzl b/misc/bazel/3rdparty/py_deps/defs.bzl index 70e6051ac930..394011f5aeb6 100644 --- a/misc/bazel/3rdparty/py_deps/defs.bzl +++ b/misc/bazel/3rdparty/py_deps/defs.bzl @@ -298,6 +298,7 @@ _NORMAL_DEPENDENCIES = { "anyhow": Label("@vendor_py__anyhow-1.0.95//:anyhow"), "clap": Label("@vendor_py__clap-4.5.30//:clap"), "regex": Label("@vendor_py__regex-1.11.1//:regex"), + "serde_json": Label("@vendor_py__serde_json-1.0.138//:serde_json"), "tree-sitter": Label("@vendor_py__tree-sitter-0.24.7//:tree_sitter"), "tree-sitter-graph": Label("@vendor_py__tree-sitter-graph-0.12.0//:tree_sitter_graph"), }, @@ -942,6 +943,7 @@ def crate_repositories(): struct(repo = "vendor_py__cc-1.2.14", is_dev_dep = False), struct(repo = "vendor_py__clap-4.5.30", is_dev_dep = False), struct(repo = "vendor_py__regex-1.11.1", is_dev_dep = False), + struct(repo = "vendor_py__serde_json-1.0.138", is_dev_dep = False), struct(repo = "vendor_py__tree-sitter-0.24.7", is_dev_dep = False), struct(repo = "vendor_py__tree-sitter-graph-0.12.0", is_dev_dep = False), ] diff --git a/python/extractor/semmle/python/parser/tsg_parser.py b/python/extractor/semmle/python/parser/tsg_parser.py index 83dc853b525e..1f77b648b2fa 100644 --- a/python/extractor/semmle/python/parser/tsg_parser.py +++ b/python/extractor/semmle/python/parser/tsg_parser.py @@ -3,7 +3,7 @@ # Functions and classes used for parsing Python files using `tree-sitter-graph` from ast import literal_eval -import re +import json import sys import os import semmle.python.parser @@ -114,98 +114,67 @@ def __repr__(self): cargo_file = os.path.join(tsg_python_path, "Cargo.toml") tsg_command = ["cargo", "run", "--quiet", "--release", "--manifest-path="+cargo_file] +def _decode_tsg_value(value): + value_type = value["type"] + if value_type == "null": + return None + if value_type in ("bool", "int", "string"): + return value[value_type] + if value_type == "list": + return [_decode_tsg_value(item) for item in value["values"]] + if value_type == "graphNode": + return Node(value["id"]) + raise ValueError("Unsupported TSG value type '{}'".format(value_type)) + +def _decode_tsg_node_attributes(encoded_attrs, path, logger): + # Decode every attribute first so location information is available if string decoding fails. + attrs = { + key: _decode_tsg_value(value) + for key, value in encoded_attrs.items() + } + if "s" not in attrs: + return attrs + + try: + attrs["s"] = evaluate_string(attrs["s"]) + except Exception as ex: + loc = ":".join(str(i) for i in get_location_info(attrs)) + error = ex.args[0] if ex.args else "unknown" + logger.warning( + "Error '{}' while parsing value {} at {}:{}\n".format( + error, repr(attrs["s"]), path, loc + ) + ) + return attrs + def read_tsg_python_output(path, logger): + command_args = tsg_command + [path] + p = subprocess.Popen(command_args, stdout=subprocess.PIPE) + stdout, _ = p.communicate() + if p.returncode: + raise subprocess.CalledProcessError(p.returncode, command_args, stdout) + # Mapping from node id (an integer) to a dictionary containing attribute data. node_attr = {} # Mapping a start node to a map from attribute names to lists of (value, end_node) pairs. edge_attr = {} - command_args = tsg_command + [path] - p = subprocess.Popen(command_args, stdout=subprocess.PIPE) - for line in p.stdout: - line = line.decode(sys.getfilesystemencoding()) - line = line.rstrip() - if line.startswith("node"): # e.g. `node 5` - current_node = int(line.split(" ")[1]) - d = {} - node_attr[current_node] = d - in_node = True - elif line.startswith("edge"): # e.g. `edge 5 -> 6` - current_start, current_end = tuple(map(int, line[4:].split("->"))) - d = edge_attr.setdefault(current_start, {}) - in_node = False - else: # attribute, e.g. `_kind: "Class"` - key, value = line[2:].split(": ", 1) - if value.startswith("[graph node"): # e.g. `_skip_to: [graph node 5]` - value = Node(int(value.split(" ")[2][:-1])) - elif value == "#true": # e.g. `_is_parenthesised: #true` - value = True - elif value == "#false": # e.g. `top: #false` - value = False - elif value == "#null": # e.g. `exc: #null` - value = None - else: # literal values, e.g. `name: "k1.k2"` or `level: 5` - value = rust_to_python_escapes(value) - try: - if key =="s" and value[0] == '"': # e.g. `s: "k1.k2"` - value = evaluate_string(value) - else: - value = literal_eval(value) - if isinstance(value, bytes): - try: - value = value.decode(sys.getfilesystemencoding()) - except UnicodeDecodeError: - # just include the bytes as-is - pass - except Exception as ex: - # We may not know the location at this point -- for instance if we forgot to set - # it -- but `get_location_info` will degrade gracefully in this case. - loc = ":".join(str(i) for i in get_location_info(d)) - error = ex.args[0] if ex.args else "unknown" - logger.warning("Error '{}' while parsing value {} at {}:{}\n".format(error, repr(value), path, loc)) - if in_node: - d[key] = value - else: - d.setdefault(key, []).append((value, current_end)) - p.stdout.close() - p.terminate() - p.wait() + for encoded_node in json.loads(stdout): + current_node = encoded_node["id"] + attrs = _decode_tsg_node_attributes(encoded_node["attrs"], path, logger) + node_attr[current_node] = attrs + for encoded_edge in encoded_node["edges"]: + current_end = encoded_edge["sink"] + edge_fields = edge_attr.setdefault(current_node, {}) + for key, value in encoded_edge["attrs"].items(): + value = _decode_tsg_value(value) + edge_fields.setdefault(key, []).append((value, current_end)) logger.debug("Read {} nodes and {} edges from TSG output".format(len(node_attr), len(edge_attr))) return node_attr, edge_attr -# `tsg-python` serialises string values using Rust's `Debug` formatting, which diverges from what -# Python's `literal_eval` accepts in two ways: -# - characters Rust considers non-printable -- including grapheme-extending ones such as the U+FE0F -# variation selector, U+200D zero width joiner and combining accents -- are rendered as `\u{...}`, -# a syntax Python does not know at all; -# - NUL is rendered as `\0`, which Python reads as the start of an *octal* escape, silently -# swallowing up to two more digits (NUL followed by `1` is emitted as `"\01"`, which decodes -# to `\x01`). -# Everything else Rust emits (`\t`, `\r`, `\n`, `\\`, `\"`, and unescaped characters) is read back -# identically by `literal_eval`, as verified exhaustively over every Unicode scalar value. -_RUST_ESCAPE = re.compile(r"\\(?:u\{([0-9a-fA-F]{1,6})\}|.)", re.DOTALL) - -def rust_to_python_escapes(text): - """Rewrites Rust escapes in `text` that Python would reject or misread into their equivalents. - - Matching every escape sequence (rather than only the offending ones) keeps the scan in step with - the backslashes, so an escaped backslash -- how a literal `\\u{fe0f}` in the source is - serialised -- is left alone.""" - if "\\u{" not in text and "\\0" not in text: - return text - def replace(match): - code_point = match.group(1) - if code_point is None: - return "\\x00" if match.group(0) == "\\0" else match.group(0) - code_point = int(code_point, 16) - if code_point > 0xFFFF: - return "\\U{:08x}".format(code_point) - return "\\u{:04x}".format(code_point) - return _RUST_ESCAPE.sub(replace, text) - -def evaluate_string(s): - s = literal_eval(s) - prefix, quotes, content = split_string(s, None) +def evaluate_string(source_literal): + """Evaluates Python string literal text that has already been decoded from the wire format.""" + prefix, quotes, content = split_string(source_literal, None) ends_with_illegal_character = False # If the string ends with the same quote character as the outer quotes (and/or backslashes) # (e.g. the first string part of `f"""hello"{0}"""`), we must take care to not accidently create diff --git a/python/extractor/semmle/util.py b/python/extractor/semmle/util.py index 60d215e5bdf4..c429fc1d02a4 100644 --- a/python/extractor/semmle/util.py +++ b/python/extractor/semmle/util.py @@ -10,7 +10,7 @@ #Semantic version of extractor. #Update this if any changes are made -VERSION = "7.1.10" +VERSION = "7.1.11" PY_EXTENSIONS = ".py", ".pyw" diff --git a/python/extractor/tests/test_tsg_parser.py b/python/extractor/tests/test_tsg_parser.py index b4df0007e905..49514830c2d6 100644 --- a/python/extractor/tests/test_tsg_parser.py +++ b/python/extractor/tests/test_tsg_parser.py @@ -1,75 +1,76 @@ import unittest - -from ast import literal_eval +import json from semmle.logging import format_message -from semmle.python.parser.tsg_parser import evaluate_string, rust_to_python_escapes - - -class RustEscapeTest(unittest.TestCase): - """`tsg-python` serialises strings with Rust's `Debug` formatting, which escapes characters such - as U+FE0F as `\\u{...}` -- a syntax Python's `literal_eval` does not accept -- and NUL as `\\0`, - which Python reads as an octal escape.""" - - def test_untouched_without_escapes(self): - text = '"caf\u00e9 \u2713 \U0001f4be"' - self.assertEqual(rust_to_python_escapes(text), text) - - def test_basic_multilingual_plane(self): - self.assertEqual(rust_to_python_escapes(r'"\u{fe0f}"'), r'"\ufe0f"') - self.assertEqual(rust_to_python_escapes(r'"\u{200d}"'), r'"\u200d"') - - def test_short_and_astral_code_points(self): - self.assertEqual(rust_to_python_escapes(r'"\u{0}"'), r'"\u0000"') - self.assertEqual(rust_to_python_escapes(r'"\u{1f4a9}"'), r'"\U0001f4a9"') - - def test_other_escapes_are_preserved(self): - self.assertEqual(rust_to_python_escapes(r'"a\nb\"c\u{ad}"'), r'"a\nb\"c\u00ad"') - - def test_escaped_backslash_is_not_an_escape_introducer(self): - # How a raw string `r"\u{fe0f}"` in the analysed source gets serialised: the `\u{fe0f}` is - # literal text, not an escape, and must survive unchanged. - self.assertEqual(rust_to_python_escapes(r'"\\u{fe0f}"'), r'"\\u{fe0f}"') - - def test_nul_is_not_left_as_an_octal_escape(self): - # Rust renders NUL as `\0`; Python would read that as the start of an octal escape and - # swallow the digits that follow, decoding `"\01"` to U+0001 instead of NUL then `1`. - self.assertEqual(rust_to_python_escapes(r'"\01"'), r'"\x001"') - - def test_every_escape_shape_round_trips(self): - # Rust's `Debug for str` only ever emits these escape shapes. Check that each round-trips - # with every printable ASCII neighbour before and after it. - for escape_shape, expected in [ - (r'\0', "\x00"), - (r'\t', "\t"), - (r'\n', "\n"), - (r'\r', "\r"), - (r'\\', "\\"), - (r'\"', '"'), - (r'\u{1}', "\u0001"), - (r'\u{1f}', "\u001f"), - (r'\u{300}', "\u0300"), - (r'\u{fe0f}', "\ufe0f"), - (r'\u{e0100}', "\U000e0100"), - (r'\u{10fffe}', "\U0010fffe"), - ]: - for neighbour in map(chr, range(0x20, 0x7F)): - rendered_neighbour = {"\\": r"\\", '"': r'\"'}.get(neighbour, neighbour) - for position, text, expected_value in [ - ("before", '"' + rendered_neighbour + escape_shape + '"', neighbour + expected), - ("after", '"' + escape_shape + rendered_neighbour + '"', expected + neighbour), - ]: - with self.subTest( - escape_shape=escape_shape, - neighbour=neighbour, - position=position, - ): - self.assertEqual(literal_eval(rust_to_python_escapes(text)), expected_value) +from semmle.python.parser.tsg_parser import Node, evaluate_string, read_tsg_python_output + + +class JsonOutputTest(unittest.TestCase): + def test_decodes_nodes_edges_and_attribute_values(self): + output = json.dumps( + [ + { + "id": 0, + "edges": [ + { + "sink": 1, + "attrs": {"body": {"type": "int", "int": 0}}, + } + ], + "attrs": { + "_kind": {"type": "string", "string": "Module"}, + "_location": { + "type": "list", + "values": [ + {"type": "int", "int": 0}, + {"type": "int", "int": 0}, + {"type": "int", "int": 1}, + {"type": "int", "int": 0}, + ], + }, + }, + }, + { + "id": 1, + "edges": [], + "attrs": { + "_kind": {"type": "string", "string": "Name"}, + "variable": { + "type": "string", + "string": "caf\u00e9 \u26a0\ufe0f \U0001f4be", + }, + "s": { + "type": "string", + "string": '"\u26a0\ufe0f problem %s: %s"', + }, + "is_async": {"type": "bool", "bool": True}, + "optional": {"type": "null"}, + "_skip_to": {"type": "graphNode", "id": 0}, + }, + }, + ] + ).encode("utf-8") + + process = unittest.mock.Mock() + process.communicate.return_value = (output, None) + process.returncode = 0 + with unittest.mock.patch( + "semmle.python.parser.tsg_parser.subprocess.Popen", return_value=process + ): + node_attr, edge_attr = read_tsg_python_output( + "test.py", unittest.mock.Mock() + ) + + self.assertEqual(node_attr[1]["variable"], "caf\u00e9 \u26a0\ufe0f \U0001f4be") + self.assertEqual(node_attr[1]["s"], "\u26a0\ufe0f problem %s: %s") + self.assertIs(node_attr[1]["is_async"], True) + self.assertIsNone(node_attr[1]["optional"]) + self.assertIsInstance(node_attr[1]["_skip_to"], Node) + self.assertEqual(node_attr[1]["_skip_to"].id, 0) + self.assertEqual(edge_attr, {0: {"body": [(0, 1)]}}) def test_evaluate_string_on_reported_value(self): - # The exact value from https://github.com/github/codeql/issues/22435 that used to raise - # `truncated \uXXXX escape`. - value = rust_to_python_escapes('"\\"\u26a0\\u{fe0f} problem %s: %s\\""') + value = '"\u26a0\ufe0f problem %s: %s"' self.assertEqual(evaluate_string(value), "\u26a0\ufe0f problem %s: %s") diff --git a/python/extractor/tsg-python/Cargo.lock b/python/extractor/tsg-python/Cargo.lock index f3604d1a3870..9c2e616354e3 100644 --- a/python/extractor/tsg-python/Cargo.lock +++ b/python/extractor/tsg-python/Cargo.lock @@ -321,6 +321,7 @@ dependencies = [ "anyhow", "clap", "regex", + "serde_json", "tree-sitter", "tree-sitter-graph", "tsp", diff --git a/python/extractor/tsg-python/Cargo.toml b/python/extractor/tsg-python/Cargo.toml index f02fb06931b2..378f8698b654 100644 --- a/python/extractor/tsg-python/Cargo.toml +++ b/python/extractor/tsg-python/Cargo.toml @@ -14,3 +14,4 @@ tree-sitter = "=0.24.7" tree-sitter-graph = "0.12.0" tsp = {path = "tsp"} clap = "4.5" +serde_json = "1.0" diff --git a/python/extractor/tsg-python/src/main.rs b/python/extractor/tsg-python/src/main.rs index 19b2f6dcfece..2885203bc039 100644 --- a/python/extractor/tsg-python/src/main.rs +++ b/python/extractor/tsg-python/src/main.rs @@ -710,9 +710,6 @@ fn main() -> Result<()> { add_syntax_error_nodes(&mut graph, &syntax_errors); } - // `pretty_print` renders string values with Rust's `Debug` formatting, so non-printable and - // grapheme-extending characters come out as `\u{...}`. The reader on the other side - // (`semmle/python/parser/tsg_parser.py`) translates those into Python escapes. - print!("{}", graph.pretty_print()); + serde_json::to_writer(std::io::stdout().lock(), &graph)?; Ok(()) } From 4b344fb244ba37b51d586c2f92c4d103ce511aa3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Sep 2026 03:05:06 +0000 Subject: [PATCH 0750/2098] Bump golang.org/x/mod Bumps the extractor-dependencies group in /go/extractor with 1 update: [golang.org/x/mod](https://github.com/golang/mod). Updates `golang.org/x/mod` from 0.40.0 to 0.41.0 - [Commits](https://github.com/golang/mod/compare/v0.40.0...v0.41.0) --- updated-dependencies: - dependency-name: golang.org/x/mod dependency-version: 0.41.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: extractor-dependencies ... Signed-off-by: dependabot[bot] --- go/extractor/go.mod | 7 ++----- go/extractor/go.sum | 4 ++-- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/go/extractor/go.mod b/go/extractor/go.mod index 83510bce510e..c255e949755d 100644 --- a/go/extractor/go.mod +++ b/go/extractor/go.mod @@ -8,14 +8,11 @@ toolchain go1.27.1 // bazel run @rules_go//go -- mod tidy // when adding or removing dependencies, run // bazel mod tidy -require ( - golang.org/x/mod v0.40.0 - golang.org/x/tools v0.49.0 -) - require ( github.com/stretchr/testify v1.11.1 + golang.org/x/mod v0.41.0 golang.org/x/sys v0.47.0 + golang.org/x/tools v0.49.0 ) require ( diff --git a/go/extractor/go.sum b/go/extractor/go.sum index f06d2fb2b567..8efdb012631e 100644 --- a/go/extractor/go.sum +++ b/go/extractor/go.sum @@ -6,8 +6,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -golang.org/x/mod v0.40.0 h1:hUv+3cXcdRHz08UmSiOob7sadHig73uo5bkXxQ/tvUs= -golang.org/x/mod v0.40.0/go.mod h1:0/weTWkPWGBikyTWAX3dkjVztMmBA5hM0DH6BElSupE= +golang.org/x/mod v0.41.0 h1:qJmnOUb4YB+FsEuM3HcWucdZASCPGhsX6uljO6pog0c= +golang.org/x/mod v0.41.0/go.mod h1:Ek9pY8RKWXwsWvd3rQiHYtMqkjSUV+s1Rj7j4H5Ur6o= golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= From ebcde45d5821d519613cd2f9078010bd9b5aba65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jack=20N=C3=B8rskov=20J=C3=B8rgensen?= Date: Wed, 9 Sep 2026 07:20:47 +0000 Subject: [PATCH 0751/2098] Copy Express modelling of request input --- .../lib/semmle/javascript/frameworks/Hapi.qll | 35 ++++++++++++------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/javascript/ql/lib/semmle/javascript/frameworks/Hapi.qll b/javascript/ql/lib/semmle/javascript/frameworks/Hapi.qll index a63610527abb..c55c857cb83e 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/Hapi.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/Hapi.qll @@ -102,6 +102,19 @@ module Hapi { override RequestSource src; } + private DataFlow::SourceNode requestInputRef( + RouteHandler rh, string property, DataFlow::TypeTracker t + ) { + t.start() and + result = rh.getRequestParameter().getAPropertyRead(property) + or + exists(DataFlow::TypeTracker t2 | result = requestInputRef(rh, property, t2).track(t2, t)) + } + + private DataFlow::SourceNode requestInputRef(RouteHandler rh, string property) { + result = requestInputRef(rh, property, DataFlow::TypeTracker::end()) + } + /** * An access to a user-controlled Hapi request input. */ @@ -116,22 +129,18 @@ module Hapi { // `request.rawPayload` this.(DataFlow::PropRead).accesses(request, "rawPayload") or - exists(DataFlow::PropRead payload | - // `request.payload.name`, or `request.payload` when the object is forwarded. - payload.accesses(request, "payload") and - if exists(payload.getAPropertyRead()) - then this = payload.getAPropertyRead() - else this = payload - ) + // `request.payload` is an object, so prefer a property read if possible. + if exists(requestInputRef(rh, "payload").getAPropertyRead()) + then this = requestInputRef(rh, "payload").getAPropertyRead() + else this = rh.getRequestParameter().getAPropertyRead("payload") ) or kind = "parameter" and - exists(DataFlow::PropRead parameter | - // `request.query.name` / `request.params.name`, or the object when it is forwarded. - parameter.accesses(request, ["query", "params"]) and - if exists(parameter.getAPropertyRead()) - then this = parameter.getAPropertyRead() - else this = parameter + exists(string property | property = ["query", "params"] | + // These are objects, so prefer a property read if possible. + if exists(requestInputRef(rh, property).getAPropertyRead()) + then this = requestInputRef(rh, property).getAPropertyRead() + else this = rh.getRequestParameter().getAPropertyRead(property) ) or exists(DataFlow::PropRead url | From 1b41baea51da92c47257830b70b1c0a21d0aef11 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Mon, 7 Sep 2026 17:43:17 +0100 Subject: [PATCH 0752/2098] C++: Add tests with missing flow. In the upcoming commits we will add a new extensional predicate which allows us to model that a function forwards it arguments to the constructor of a given type. This initial commit adds the test YAML models for this new extensional predicate. --- cpp/ql/lib/ext/empty.model.yml | 4 + .../internal/ExternalFlowExtensions.qll | 8 ++ .../dataflow/external-models/flow.ext.yml | 10 +++ .../dataflow/external-models/sinks.expected | 6 ++ .../dataflow/external-models/sources.expected | 4 + .../dataflow/external-models/test.cpp | 78 +++++++++++++++++++ 6 files changed, 110 insertions(+) diff --git a/cpp/ql/lib/ext/empty.model.yml b/cpp/ql/lib/ext/empty.model.yml index e5202b5ad73c..9c2921cfef1b 100644 --- a/cpp/ql/lib/ext/empty.model.yml +++ b/cpp/ql/lib/ext/empty.model.yml @@ -21,3 +21,7 @@ extensions: pack: codeql/cpp-all extensible: summaryModel data: [] + - addsTo: + pack: codeql/cpp-all + extensible: forwardsModel + data: [] \ No newline at end of file diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/ExternalFlowExtensions.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/ExternalFlowExtensions.qll index 22c74c2aa714..e05c1bb2b810 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/ExternalFlowExtensions.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/ExternalFlowExtensions.qll @@ -51,6 +51,14 @@ extensible predicate neutralModel( string namespace, string type, string name, string signature, string kind, string provenance ); +/** + * Holds if a constructor forwarding model exists for the given parameters. + */ +extensible predicate forwardsModel( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string start, string constructor, string output, string provenance, QlBuiltins::ExtensionId madId +); + module Extensions implements SharedMaD::ExtensionsSig { import ExternalFlowExtensions diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml b/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml index 0db87b5da615..735bcaa320ed 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml @@ -42,3 +42,13 @@ extensions: - ["", "ReverseFlow", True, "get_ptr", "", "", "ReturnValue[*]", "Argument[-1].Field[ReverseFlow::value]", "value", "manual"] - ["", "MyString", True, "operator[]", "", "", "ReturnValue[*]", "Argument[-1]", "taint", "manual"] - ["", "MyString", True, "operator[]", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["", "Forwarder", True, "get", "", "", "Argument[-1]", "ReturnValue", "value", "manual"] + - ["", "Container", True, "get", "", "", "Argument[-1].Element", "ReturnValue[*]", "value", "manual"] + - ["", "Element", True, "Element", "", "", "Argument[0]", "Argument[-1].Field[Element::x]", "value", "manual"] + - ["", "ElementWithDefaultArgument", True, "ElementWithDefaultArgument", "", "", "Argument[0]", "Argument[-1].Field[ElementWithDefaultArgument::x]", "value", "manual"] + - addsTo: + pack: codeql/cpp-all + extensible: forwardsModel + data: # namespace, type, subtypes, name, signature, ext, start, constructor, output, provenance + - ["", "Forwarder", True, "forward", "(Args &&)", "", "0", "T", "Argument[-1]", "manual"] + - ["", "Container", True, "emplace", "(int,Args &&)", "", "1", "T", "Argument[-1].Element", "manual"] diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected index 5851e825013d..0701b0f7eeb2 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected @@ -43,3 +43,9 @@ | test.cpp:331:10:331:19 | * ... | test-sink | | test.cpp:333:15:333:20 | source | test-sink | | test.cpp:334:10:334:16 | * ... | test-sink | +| test.cpp:365:15:365:15 | s | test-sink | +| test.cpp:366:15:366:16 | ul | test-sink | +| test.cpp:374:15:374:15 | s | test-sink | +| test.cpp:375:15:375:16 | ul | test-sink | +| test.cpp:398:13:398:13 | x | test-sink | +| test.cpp:412:13:412:13 | x | test-sink | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected index b30f1e88b99a..7f71ec61b6e4 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected @@ -19,6 +19,10 @@ | test.cpp:222:10:222:18 | call to ymlSource | local | | test.cpp:297:33:297:41 | call to ymlSource | local | | test.cpp:317:51:317:59 | call to ymlSource | local | +| test.cpp:361:15:361:23 | call to ymlSource | local | +| test.cpp:370:24:370:32 | call to ymlSource | local | +| test.cpp:394:11:394:19 | call to ymlSource | local | +| test.cpp:408:11:408:19 | call to ymlSource | local | | windows.cpp:22:15:22:29 | call to GetCommandLineA | local | | windows.cpp:34:17:34:38 | call to GetEnvironmentStringsA | local | | windows.cpp:39:36:39:38 | GetEnvironmentVariableA output argument | local | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp index 739c36bc67d3..7865c177e4e6 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp @@ -332,4 +332,82 @@ void test_parameter(SourceWrapper* p, SourceWrapper s, int* source) { ymlSink((int)source); // clean ymlSink(*source); // $ ir +} + + +struct ConstructableFromInt { + short s; + unsigned long ul; + ConstructableFromInt(short arg) { + this->s = arg; + } + + ConstructableFromInt(unsigned long arg) { + this->ul = arg; + } +}; + +template +struct Forwarder { + template + void forward(Args&&... args); + + T get(); +}; + +void forward_test() { + { + Forwarder f; + short x = ymlSource(); + f.forward(x); + + ConstructableFromInt c = f.get(); + ymlSink(c.s); // $ MISSING: ir + ymlSink(c.ul); // clean + } + { + Forwarder f; + unsigned long ul = ymlSource(); + f.forward(ul); + + ConstructableFromInt c = f.get(); + ymlSink(c.s); // clean + ymlSink(c.ul); // $ MISSING: ir + } +} + +template +struct Container { + template + void emplace(int pos, Args&&... args); + + T& get(); +}; + +struct Element { + int x; + Element(int); +}; + +void forward_test_model() { + Container c; + int x = ymlSource(); + c.emplace(0, x); + + Element e = c.get(); + ymlSink(e.x); // $ MISSING: ir +} + +struct ElementWithDefaultArgument { + int x; + ElementWithDefaultArgument(int x, int = 0); +}; + +void forward_test_model_with_default_argument() { + Container c; + int x = ymlSource(); + c.emplace(0, x); + + ElementWithDefaultArgument e = c.get(); + ymlSink(e.x); // $ MISSING: ir } \ No newline at end of file From 0169e1852daeb86d0cc933f7d62cd8a6d2240c3a Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 8 Sep 2026 12:52:49 +0100 Subject: [PATCH 0753/2098] C++: Add a missing utility predicate on Call instructions. --- .../implementation/aliased_ssa/Instruction.qll | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll index b7dcd4d8f754..4d26df9726b3 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll @@ -1706,6 +1706,13 @@ class CallInstruction extends Instruction { result.getIndex() = index } + /** + * Gets a positional argument operand, if any. + */ + final PositionalArgumentOperand getAPositionalArgumentOperand() { + result = this.getPositionalArgumentOperand(_) + } + /** * Gets the argument at the specified index. */ @@ -1714,6 +1721,11 @@ class CallInstruction extends Instruction { result = this.getPositionalArgumentOperand(index).getDef() } + /** + * Gets a positional argument, if any. + */ + final Instruction getAPositionalArgument() { result = this.getPositionalArgument(_) } + /** * Gets the argument operand at the specified index, or `this` if `index` is `-1`. */ @@ -1735,6 +1747,11 @@ class CallInstruction extends Instruction { */ final int getNumberOfArguments() { result = count(this.getAnArgumentOperand()) } + /** + * Gets the number of positional arguments of the call. + */ + final int getNumberOfPositionalArguments() { result = count(this.getAPositionalArgument()) } + /** * Holds if the result is a side effect for the argument at the specified index, or `this` if * `index` is `-1`. From 3777020fe9ec32e1263abffd192241bc190d0016 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 8 Sep 2026 12:53:05 +0100 Subject: [PATCH 0754/2098] C++: Sync identical files. --- .../cpp/ir/implementation/raw/Instruction.qll | 17 +++++++++++++++++ .../unaliased_ssa/Instruction.qll | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll index b7dcd4d8f754..4d26df9726b3 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll @@ -1706,6 +1706,13 @@ class CallInstruction extends Instruction { result.getIndex() = index } + /** + * Gets a positional argument operand, if any. + */ + final PositionalArgumentOperand getAPositionalArgumentOperand() { + result = this.getPositionalArgumentOperand(_) + } + /** * Gets the argument at the specified index. */ @@ -1714,6 +1721,11 @@ class CallInstruction extends Instruction { result = this.getPositionalArgumentOperand(index).getDef() } + /** + * Gets a positional argument, if any. + */ + final Instruction getAPositionalArgument() { result = this.getPositionalArgument(_) } + /** * Gets the argument operand at the specified index, or `this` if `index` is `-1`. */ @@ -1735,6 +1747,11 @@ class CallInstruction extends Instruction { */ final int getNumberOfArguments() { result = count(this.getAnArgumentOperand()) } + /** + * Gets the number of positional arguments of the call. + */ + final int getNumberOfPositionalArguments() { result = count(this.getAPositionalArgument()) } + /** * Holds if the result is a side effect for the argument at the specified index, or `this` if * `index` is `-1`. diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll index b7dcd4d8f754..4d26df9726b3 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll @@ -1706,6 +1706,13 @@ class CallInstruction extends Instruction { result.getIndex() = index } + /** + * Gets a positional argument operand, if any. + */ + final PositionalArgumentOperand getAPositionalArgumentOperand() { + result = this.getPositionalArgumentOperand(_) + } + /** * Gets the argument at the specified index. */ @@ -1714,6 +1721,11 @@ class CallInstruction extends Instruction { result = this.getPositionalArgumentOperand(index).getDef() } + /** + * Gets a positional argument, if any. + */ + final Instruction getAPositionalArgument() { result = this.getPositionalArgument(_) } + /** * Gets the argument operand at the specified index, or `this` if `index` is `-1`. */ @@ -1735,6 +1747,11 @@ class CallInstruction extends Instruction { */ final int getNumberOfArguments() { result = count(this.getAnArgumentOperand()) } + /** + * Gets the number of positional arguments of the call. + */ + final int getNumberOfPositionalArguments() { result = count(this.getAPositionalArgument()) } + /** * Holds if the result is a side effect for the argument at the specified index, or `this` if * `index` is `-1`. From 77bb230e198b369cb413fe044b1a2eaddca20b24 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 8 Sep 2026 23:41:32 +0100 Subject: [PATCH 0755/2098] C++: Small refactor. --- .../code/cpp/ir/dataflow/internal/DataFlowNodes.qll | 11 ++++------- .../cpp/ir/dataflow/internal/DataFlowPrivate.qll | 6 +++--- .../code/cpp/ir/dataflow/internal/SsaImplCommon.qll | 13 ++++++++++++- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll index 541b6d13b149..39bc10415161 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll @@ -144,7 +144,7 @@ private module Cached { TNonUnionContent(CanonicalField f, int indirectionIndex) { // the indirection index for field content starts at 1 (because `TNonUnionContent` is thought of as // the address of the field, `FieldAddress` in the IR). - indirectionIndex = [1 .. max(SsaImpl::getMaxIndirectionsForType(f.getAnUnspecifiedType()))] and + indirectionIndex = [1 .. max(SsaImpl::getMaxIndirectionsForGLType(f.getAnUnspecifiedType()))] and // Reads and writes of union fields are tracked using `UnionContent`. not f.getDeclaringType() instanceof Union } or @@ -156,7 +156,7 @@ private module Cached { // field can be read by any read of the union's fields. Again, the indirection index // is 1-based (because 0 is considered the address). indirectionIndex = - [1 .. max(SsaImpl::getMaxIndirectionsForType(getAFieldWithSize(u, bytes) + [1 .. max(SsaImpl::getMaxIndirectionsForGLType(getAFieldWithSize(u, bytes) .getAnUnspecifiedType()) )] ) @@ -184,7 +184,7 @@ private module Cached { TNode0(Node0Impl node) { DataFlowImplCommon::forceCachingInSameStage() } or TGlobalLikeVariableNode(GlobalLikeVariable var, int indirectionIndex) { indirectionIndex = - [getMinIndirectionsForType(var.getUnspecifiedType()) .. SsaImpl::getMaxIndirectionsForType(var.getUnspecifiedType())] + [getMinIndirectionsForType(var.getUnspecifiedType()) .. SsaImpl::getMaxIndirectionsForGLType(var.getUnspecifiedType())] } or TPostUpdateNodeImpl(Operand operand, int indirectionIndex) { isPostUpdateNodeImpl(operand, indirectionIndex) @@ -209,10 +209,7 @@ private module Cached { TBodyLessParameterNodeImpl(Parameter p, int indirectionIndex) { // Rule out parameters of catch blocks. not exists(p.getCatchBlock()) and - // We subtract one because `getMaxIndirectionsForType` returns the maximum - // indirection for a glvalue of a given type, and this doesn't apply to - // parameters. - indirectionIndex = [0 .. SsaImpl::getMaxIndirectionsForType(p.getUnspecifiedType()) - 1] and + indirectionIndex = [0 .. SsaImpl::getMaxIndirectionsForPRType(p.getUnspecifiedType())] and not any(InitializeParameterInstruction init).getParameter() = p } or TFlowSummaryNode(FlowSummaryImpl::Private::SummaryNode sn) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll index 551035c5589e..8f66739aaa45 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll @@ -737,7 +737,7 @@ newtype TPosition = // the function. exists(Cpp::Function f, Cpp::Parameter p | p = f.getParameter(argumentIndex) and - indirectionIndex = [1 .. Ssa::getMaxIndirectionsForType(p.getUnspecifiedType()) - 1] + indirectionIndex = [1 .. Ssa::getMaxIndirectionsForPRType(p.getUnspecifiedType())] ) } or TFlowSummaryPosition(ReturnKind rk) { FlowSummaryImpl::Private::relevantFlowSummaryPosition(rk) } @@ -755,7 +755,7 @@ private newtype TReturnKind = [0 .. max(Cpp::Function f | not exists(f.getBlock()) | - Ssa::getMaxIndirectionsForType(f.getUnspecifiedType()) - 1 // -1 because a returned value is a prvalue not a glvalue + Ssa::getMaxIndirectionsForPRType(f.getUnspecifiedType()) )] } or TIndirectReturnKind(int argumentIndex, int indirectionIndex) { @@ -770,7 +770,7 @@ private newtype TReturnKind = [0 .. max(Cpp::Function f | not exists(f.getBlock()) | - Ssa::getMaxIndirectionsForType(f.getParameter(argumentIndex).getUnspecifiedType()) - 1 // -1 because an argument is a prvalue not a glvalue + Ssa::getMaxIndirectionsForPRType(f.getParameter(argumentIndex).getUnspecifiedType()) )] } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImplCommon.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImplCommon.qll index 31931189003c..5a56042612a4 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImplCommon.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImplCommon.qll @@ -40,10 +40,21 @@ CppType getLanguageType(Operand operand) { result = getResultLanguageType(operan * - If `type = MyStruct`, the result is 1 * - If `type = char*`, the result is 2 */ -int getMaxIndirectionsForType(Type type) { +int getMaxIndirectionsForGLType(Type type) { result = countIndirectionsForCppType(getTypeForGLValue(type)) } +/** + * Gets the maximum number of indirections a prvalue of type `type` can have. + * For example: + * - If `type = int`, the result is 0 + * - If `type = MyStruct`, the result is 0 + * - If `type = char*`, the result is 1 + */ +int getMaxIndirectionsForPRType(Type type) { + result = countIndirectionsForCppType(getTypeForPRValue(type)) +} + private class PointerOrArrayOrReferenceType extends Cpp::DerivedType { PointerOrArrayOrReferenceType() { this instanceof Cpp::PointerType From 04c2ac48e29877eb1b9e7df55cea10acff33c972 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Mon, 7 Sep 2026 17:51:57 +0100 Subject: [PATCH 0756/2098] C++: We will need the template resolution for something other than the signature to implement the forwardsModel. So instead of recursing on the number of elements in the signature we will recurse on the number of elements in the type (or name) columns. For well-formed models this will be equivalent. --- .../semmle/code/cpp/dataflow/ExternalFlow.qll | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll index 4f84b30d557e..40cb03daf262 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll @@ -596,6 +596,14 @@ private string getAtIndex(string s, int i) { not (s = "" and i = 0) } +/** Gets the number of comma-separated arguments in `s`. */ +bindingset[s] +private int getNumberOfArguments(string s) { + s = "" and result = 0 + or + s != "" and result = count(s.indexOf(",")) + 1 +} + /** * Normalizes `partiallyNormalizedSignature` by replacing the `remaining` * number of template arguments in `partiallyNormalizedSignature` with their @@ -605,7 +613,7 @@ private string getSignatureWithoutClassTemplateNames( string partiallyNormalizedSignature, string typeArgs, string nameArgs, int remaining ) { elementSpecWithArguments0(_, _, _, partiallyNormalizedSignature, typeArgs, nameArgs) and - remaining = count(partiallyNormalizedSignature.indexOf(",")) + 1 and + remaining = getNumberOfArguments(typeArgs) and result = partiallyNormalizedSignature or exists(string mid | @@ -619,7 +627,7 @@ private string getSignatureWithoutClassTemplateNames( ) or // Make sure `remaining` is properly bound - remaining = [0 .. count(partiallyNormalizedSignature.indexOf(",")) + 1] and + remaining = [0 .. getNumberOfArguments(typeArgs)] and not exists(getAtIndex(typeArgs, remaining)) and result = mid ) @@ -636,7 +644,7 @@ pragma[nomagic] private string getSignatureWithoutFunctionTemplateNames( string partiallyNormalizedSignature, string typeArgs, string nameArgs, int remaining ) { - remaining = count(partiallyNormalizedSignature.indexOf(",")) + 1 and + remaining = getNumberOfArguments(nameArgs) and result = getSignatureWithoutClassTemplateNames(partiallyNormalizedSignature, typeArgs, nameArgs, 0) or @@ -651,7 +659,7 @@ private string getSignatureWithoutFunctionTemplateNames( ) or // Make sure `remaining` is properly bound - remaining = [0 .. count(partiallyNormalizedSignature.indexOf(",")) + 1] and + remaining = [0 .. getNumberOfArguments(nameArgs)] and not exists(getAtIndex(nameArgs, remaining)) and result = mid ) From 48de4cbede00181ed1741b6dd46b28e5a1ff0766 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Mon, 7 Sep 2026 17:58:27 +0100 Subject: [PATCH 0757/2098] C++: Add MaD support for models that specify argument forwarding. --- .../semmle/code/cpp/dataflow/ExternalFlow.qll | 122 ++++++++++++++- .../cpp/dataflow/internal/FlowSummaryImpl.qll | 3 + .../ir/dataflow/internal/DataFlowNodes.qll | 3 + .../ir/dataflow/internal/DataFlowPrivate.qll | 145 ++++++++++++++++-- 4 files changed, 258 insertions(+), 15 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll index 40cb03daf262..c9dedb4da82d 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll @@ -15,6 +15,8 @@ * `namespace; type; subtypes; name; signature; ext; output; kind; provenance` * - BarrierGuards: * `namespace; type; subtypes; name; signature; ext; input; acceptingValue; kind; provenance` + * - Forwards: + * `namespace; type; subtypes; name; signature; ext; start; constructor; output; provenance` * * The interpretation of a row is similar to API-graphs with a left-to-right * reading. @@ -115,6 +117,7 @@ private import new.DataFlow private import semmle.code.cpp.controlflow.IRGuards private import semmle.code.cpp.ir.dataflow.internal.DataFlowNodes as Nodes private import semmle.code.cpp.ir.dataflow.internal.DataFlowPrivate as Private +private import semmle.code.cpp.ir.dataflow.internal.SsaImpl as SsaImpl private import semmle.code.cpp.ir.dataflow.internal.DataFlowUtil private import internal.FlowSummaryImpl private import internal.FlowSummaryImpl::Public @@ -160,6 +163,20 @@ predicate summaryModel( ) } +/** + * Holds if a forward model exists for the given parameters. + */ +predicate forwardsModel( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string start, string constructor, string output, string provenance, string model +) { + exists(QlBuiltins::ExtensionId madId | + Extensions::forwardsModel(namespace, type, subtypes, name, signature, ext, start, constructor, + output, provenance, madId) and + model = "MaD:" + madId.toString() + ) +} + /** Provides a query predicate to check the data for validation errors. */ module ModelValidation { private string getInvalidModelInput() { @@ -186,6 +203,8 @@ module ModelValidation { sourceModel(_, _, _, _, _, _, output, _, _, _) and pred = "source" or summaryModel(_, _, _, _, _, _, _, output, _, _, _) and pred = "summary" + or + forwardsModel(_, _, _, _, _, _, _, _, output, _, _) and pred = "forwards" | invalidSpecComponent(output, part) and not part = "" and @@ -259,7 +278,8 @@ private predicate elementSpec( sinkModel(namespace, type, subtypes, name, signature, ext, _, _, _, _) or barrierModel(namespace, type, subtypes, name, signature, ext, _, _, _, _) or barrierGuardModel(namespace, type, subtypes, name, signature, ext, _, _, _, _, _) or - summaryModel(namespace, type, subtypes, name, signature, ext, _, _, _, _, _) + summaryModel(namespace, type, subtypes, name, signature, ext, _, _, _, _, _) or + forwardsModel(namespace, type, subtypes, name, signature, ext, _, _, _, _, _) } /** @@ -1054,6 +1074,103 @@ private module Cached { import Cached +/** Gets the constructor type selected by `constructorType` in a forwarding model. */ +bindingset[forwarder, type, name, constructorType] +private Type getForwardedConstructorType( + Function forwarder, string type, string name, string constructorType +) { + exists(string typeArguments, int index | + parseAngles(type, _, typeArguments, "") and + constructorType = getAtIndex(typeArguments, index) and + result = forwarder.getDeclaringType().getTemplateArgument(index) + ) + or + exists(string nameArguments, int index | + parseAngles(name, _, nameArguments, "") and + constructorType = getAtIndex(nameArguments, index) and + result = forwarder.getTemplateArgument(index) + ) +} + +/** Interprets a forwarding model, retaining its output and provenance. */ +private predicate interpretForwardsModel( + Function forwarder, Constructor constructor, int start, string output, string provenance, + string model +) { + exists( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string startString, string constructorType + | + forwardsModel(namespace, type, subtypes, name, signature, ext, startString, constructorType, + output, provenance, model) and + forwarder = interpretElement(namespace, type, subtypes, name, signature, ext) and + start = startString.toInt() + | + // Either the row specifies forwarding to a type given by the type or + // function template, in which case we need to resolve that from the type + // or function name. + constructor.getDeclaringType() = + getForwardedConstructorType(forwarder, type, name, constructorType).getUnspecifiedType() + or + // Or the row specifies forwarding to a specific type. + classHasQualifiedName(constructor.getDeclaringType(), namespace, constructorType) + ) +} + +/** Holds if `forwarder` forwards its arguments starting at `start` to `constructor`. */ +predicate forwards(Function forwarder, Constructor constructor, int start) { + interpretForwardsModel(forwarder, constructor, start, _, _, _) +} + +private int referenceIndirection(Type unspecified) { + if unspecified instanceof ReferenceType then result = 1 else result = 0 +} + +/** + * In order to support flow summaries for functions that perform "perfect + * forwarding" we interpret a call such as: + * ```cpp + * struct Foo { Foo(int) }; + * std::vector v; + * v.emplace_back(42); + * ``` + * as: + * ```cpp + * v.emplace_back(42, &Foo); + * ``` + * and add two summaries: + * (1) One flow from `42` to the first argument of a call to `Foo` + * (2) One flow from the return value of `Foo` to the `this` argument of the call + * to `emplace_back` (with a sequence of output `Content`s). + * + * These two summaries are automatically generated when a forwarding model + * for `emplace_back` exists. + */ +private predicate interpretForwardingSummary( + Function forwarder, string input, string output, string provenance, string model +) { + exists(Constructor constructor, int start, string constructorOutput | + interpretForwardsModel(forwarder, constructor, start, constructorOutput, provenance, model) + | + // Generate the (1) summary + exists(int index, Parameter arg, Parameter p, int indirection | + arg = forwarder.getParameter(start + index) and + p = constructor.getParameter(index) and + indirection = [0 .. SsaImpl::getMaxIndirectionsForPRType(p.getUnspecifiedType())] and + input = + "Argument[" + repeatStars(indirection + referenceIndirection(arg.getUnspecifiedType())) + + (start + index) + "]" and + output = + "Argument[forward].Parameter[" + + repeatStars(indirection + referenceIndirection(p.getUnspecifiedType())) + index + "]" + ) + or + // Generate the (2) summary + input = "Argument[forward].Parameter[-1]" and + output = constructorOutput + ) +} + /** * Holds if `node` is specified as a source with the given kind in a MaD flow * model. @@ -1082,6 +1199,9 @@ private predicate interpretSummary( model) and f = interpretElement(namespace, type, subtypes, name, signature, ext) ) + or + interpretForwardingSummary(f, input, output, provenance, model) and + kind = "value" } // adapter class for converting Mad summaries to `SummarizedCallable`s diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll index 176b95933db8..6c613308d5f4 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll @@ -111,6 +111,9 @@ module Input implements InputSig { pos = -1 and result = TIndirectionPosition(pos, indirection + 1) ) ) + or + argString = "forward" and + result = TForwardPosition() } bindingset[token] diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll index 39bc10415161..b493ba001559 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll @@ -191,6 +191,9 @@ private module Cached { } or TSsaSynthNode(SsaImpl::SynthNode n) or TSsaIteratorNode(IteratorFlow::IteratorFlowNode n) or + TForwarderConstructorArgumentNode(CallInstruction call) { + isForwarderConstructorArgumentNodeImpl(call) + } or TRawIndirectOperand0(Node0Impl node, int indirectionIndex) { SsaImpl::hasRawIndirectOperand(node.asOperand(), indirectionIndex) } or diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll index 8f66739aaa45..a60d3ca04cce 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll @@ -593,6 +593,101 @@ private class SideEffectArgumentNode extends ArgumentNode, SideEffectOperandNode } } +/** + * Gets `unspecifiedType`, but with the outermost `ReferenceType` removed, if any. + */ +private Type stripReferences(Type unspecifiedType) { + result = unspecifiedType.(Cpp::ReferenceType).getBaseType().getUnspecifiedType() + or + not unspecifiedType instanceof Cpp::ReferenceType and + result = unspecifiedType +} + +predicate forwardingCallTargetsConstructor( + CallInstruction call, Cpp::Constructor constructor, int start +) { + exists(int numberOfForwardedArguments | + External::forwards(call.getStaticCallTarget(), constructor, start) and + call.getNumberOfPositionalArguments() = start + numberOfForwardedArguments and + forall(int i | i = [0 .. constructor.getNumberOfParameters() - 1] | + // If we are still processing the forwarded arguments then we need to + // check that the argument types match the parameter types. + // Functions that perform perfect forwarding are always written as: + // ``` + // template void emplace(Args&&... args) { ... } + // ``` + // and so all the arguments will be reference typed (lvalue or rvalued). + // However, the constructor may not specify all the arguments by + // reference. + i < numberOfForwardedArguments and + stripReferences(call.getPositionalArgument(start + i).getResultType()) = + stripReferences(constructor.getParameter(i).getUnspecifiedType()) + or + // If the constructor has a default argument and we have processed all + // the forwarded arguments then we don't need to check the types. + i >= numberOfForwardedArguments and constructor.getParameter(i).hasInitializer() + ) + ) +} + +/** Holds if `call` is a call that forwards arguments to a constructor call. */ +predicate isForwarderConstructorArgumentNodeImpl(CallInstruction call) { + forwardingCallTargetsConstructor(call, _, _) +} + +/** + * In order to implement a MaD summary for a flow such as: + * ``` + * struct Foo { + * int x; + * Foo(int x) { // (2) + * this->x = x; + * } + * } + * + * std::vector v; + * int x = source(); + * v.emplace_back(x); // (1) + * sink(v.back()); + * ``` + * we model it as if the code was: + * ``` + * v.__emplace_back(x, &Foo) + * ``` + * (nevermind that this is not real C++ since you cannot take the address of a + * constructor.) + * where `__emplace_back` invokes `Foo` with the `x` argument and returns the + * result. + * + * This class serves as the argument node for `&Foo`. + */ +private class ForwarderConstructorArgumentNode extends ArgumentNode, + TForwarderConstructorArgumentNode +{ + private CallInstruction call; + + ForwarderConstructorArgumentNode() { this = TForwarderConstructorArgumentNode(call) } + + override predicate sourceArgumentOf(CallInstruction c, ArgumentPosition pos) { + c = call and pos = TForwardPosition() + } + + /** + * Gets a constructor which may be targeted by this forwarding call. + */ + Cpp::Constructor getAConstructor() { forwardingCallTargetsConstructor(call, result, _) } + + override DataFlowCallable getEnclosingCallable() { + result.asSourceCallable() = this.getFunction() + } + + override Declaration getFunction() { result = call.getEnclosingFunction() } + + override Location getLocationImpl() { result = call.getLocation() } + + override string toStringImpl() { result = "forwarder for " + call.toString() } +} + /** * An argument node that is part of a summary. These only occur when the * summary contains a synthesized call. @@ -672,6 +767,12 @@ abstract class Position extends TPosition { this.getArgumentIndex() = -1 and result = call.getQualifier() } + + /** + * Holds if this position is the synthetic argument for an address of a + * constructor used for functions which perform "perfect forwarding". + */ + predicate isForward() { none() } } class DirectPosition extends Position, TDirectPosition { @@ -721,6 +822,16 @@ class FlowSummaryPosition extends Position, TFlowSummaryPosition { final override int getIndirectionIndex() { result = rk.getIndirectionIndex() } } +class ForwardPosition extends Position, TForwardPosition { + final override predicate isForward() { any() } + + override int getArgumentIndex() { none() } + + final override int getIndirectionIndex() { result = 0 } + + override string toString() { result = "forward" } +} + newtype TPosition = TDirectPosition(int argumentIndex) { exists(any(CallInstruction c).getArgument(argumentIndex)) @@ -740,6 +851,7 @@ newtype TPosition = indirectionIndex = [1 .. Ssa::getMaxIndirectionsForPRType(p.getUnspecifiedType())] ) } or + TForwardPosition() or TFlowSummaryPosition(ReturnKind rk) { FlowSummaryImpl::Private::relevantFlowSummaryPosition(rk) } private newtype TReturnKind = @@ -1258,6 +1370,19 @@ private predicate summarizedCallableIsManual(SummarizedCallable sc) { sc.asSummarizedCallable().hasManualModel() } +private DataFlowCallable getTarget(Declaration target) { + // Don't use the source callable if there is a manual model for the target. + not exists(SummarizedCallable sc | + sc.asSummarizedCallable() = target and + summarizedCallableIsManual(sc) + ) and + result.asSourceCallable() = target + or + // When there is no function body, or when we have a manual model, dispatch to the summary. + (not target.hasDefinition() or summarizedCallableIsManual(result)) and + result.asSummarizedCallable() = target +} + /** * A function call relevant for data flow. This includes calls from source * code and calls inside library callables with a flow summary. @@ -1293,20 +1418,7 @@ class DataFlowCall extends TDataFlowCall { * whether is it manual or generated. */ final DataFlowCallable getStaticCallTarget() { - exists(Declaration target | target = this.getStaticCallSourceTarget() | - // Don't use the source callable if there is a manual model for the - // target - not exists(SummarizedCallable sc | - sc.asSummarizedCallable() = target and - summarizedCallableIsManual(sc) - ) and - result.asSourceCallable() = target - or - // When there is no function body, or when we have a manual model then - // we dispatch to the summary. - (not target.hasDefinition() or summarizedCallableIsManual(result)) and - result.asSummarizedCallable() = target - ) + result = getTarget(this.getStaticCallSourceTarget()) } /** @@ -1493,6 +1605,8 @@ predicate nodeIsHidden(Node n) { n instanceof SsaSynthNode or n.(FlowSummaryNode).getSummaryNode().isHidden() + or + n instanceof ForwarderConstructorArgumentNode } predicate neverSkipInPathGraph(Node n) { @@ -1574,6 +1688,9 @@ predicate lambdaCreation(Node creation, LambdaCallKind kind, DataFlowCallable c) kind.isFunctionPointer() and creation.asInstruction().(FunctionAddressInstruction).getFunctionSymbol() = c.asSourceCallable() or + kind.isFunctionPointer() and + c = getTarget(creation.(ForwarderConstructorArgumentNode).getAConstructor()) + or kind.isFunctor() and exists(OperatorCall operator | operator = c.asSourceCallable() | isFunctorCreationWithoutConstructor(creation, operator) From 4f2fc96bedff0ec6117b848eff60454e6525b794 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Mon, 7 Sep 2026 20:14:15 +0100 Subject: [PATCH 0758/2098] C++: Accept test changes. --- .../dataflow/external-models/flow.expected | 188 +++++++++++++----- .../dataflow/external-models/test.cpp | 8 +- 2 files changed, 147 insertions(+), 49 deletions(-) diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index 65817b549a90..d66dc6d385f6 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -85,24 +85,26 @@ models | 84 | Summary: ; ; false; ymlStepGenerated; ; ; Argument[0]; ReturnValue; taint; df-generated | | 85 | Summary: ; ; false; ymlStepManual; ; ; Argument[0]; ReturnValue; taint; manual | | 86 | Summary: ; ; false; ymlStepManual_with_body; ; ; Argument[0]; ReturnValue; taint; manual | -| 87 | Summary: ; MyString; true; operator[]; ; ; Argument[-1]; ReturnValue[*]; taint; manual | -| 88 | Summary: ; MyString; true; operator[]; ; ; ReturnValue[*]; Argument[-1]; taint; manual | -| 89 | Summary: ; ReverseFlow; true; get_ptr; ; ; ReturnValue[*]; Argument[-1].Field[ReverseFlow::value]; value; manual | -| 90 | Summary: ; TemplateClass1; true; templateFunction2; (U,V); ; Argument[1]; ReturnValue; value; manual | -| 91 | Summary: ; TemplateClass1; false; templateFunction; (T,U); ; Argument[0]; ReturnValue; value; manual | -| 92 | Summary: ; TemplateClass2; true; function; (U,T); ; Argument[1]; ReturnValue; value; manual | -| 93 | Summary: Azure::Core::IO; BodyStream; true; Read; ; ; Argument[-1]; Argument[*0]; taint; manual | -| 94 | Summary: Azure::Core::IO; BodyStream; true; ReadToCount; ; ; Argument[-1]; Argument[*0]; taint; manual | -| 95 | Summary: Azure::Core::IO; BodyStream; true; ReadToEnd; ; ; Argument[-1]; ReturnValue.Element; taint; manual | -| 96 | Summary: Azure; Nullable; true; Value; ; ; Argument[-1]; ReturnValue[*]; taint; manual | -| 97 | Summary: BloombergLP::bdlbb; Blob; true; buffer; ; ; Argument[-1]; ReturnValue[*]; taint; manual | -| 98 | Summary: BloombergLP::bdlbb; BlobBuffer; true; buffer; ; ; Argument[-1]; ReturnValue[*]; taint; manual | -| 99 | Summary: BloombergLP::bdlbb; BlobBuffer; true; data; ; ; Argument[-1]; ReturnValue[*]; taint; manual | -| 100 | Summary: BloombergLP::bdlbb; BlobUtil; true; copy; (Blob *,int,const Blob &,int,int); ; Argument[*2]; Argument[*0]; taint; manual | -| 101 | Summary: BloombergLP::bdlbb; BlobUtil; true; copy; (Blob *,int,const char *,int); ; Argument[*2]; Argument[*0]; taint; manual | -| 102 | Summary: BloombergLP::bdlbb; BlobUtil; true; copy; (char *,const Blob &,int,int); ; Argument[*1]; Argument[*0]; taint; manual | -| 103 | Summary: BloombergLP::bdlbb; BlobUtil; true; getContiguousRangeOrCopy; ; ; Argument[*1]; ReturnValue[*]; taint; manual | -| 104 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | +| 87 | Summary: ; Container; true; get; ; ; Argument[-1].Element; ReturnValue[*]; value; manual | +| 88 | Summary: ; Forwarder; true; get; ; ; Argument[-1]; ReturnValue; value; manual | +| 89 | Summary: ; MyString; true; operator[]; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 90 | Summary: ; MyString; true; operator[]; ; ; ReturnValue[*]; Argument[-1]; taint; manual | +| 91 | Summary: ; ReverseFlow; true; get_ptr; ; ; ReturnValue[*]; Argument[-1].Field[ReverseFlow::value]; value; manual | +| 92 | Summary: ; TemplateClass1; true; templateFunction2; (U,V); ; Argument[1]; ReturnValue; value; manual | +| 93 | Summary: ; TemplateClass1; false; templateFunction; (T,U); ; Argument[0]; ReturnValue; value; manual | +| 94 | Summary: ; TemplateClass2; true; function; (U,T); ; Argument[1]; ReturnValue; value; manual | +| 95 | Summary: Azure::Core::IO; BodyStream; true; Read; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 96 | Summary: Azure::Core::IO; BodyStream; true; ReadToCount; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 97 | Summary: Azure::Core::IO; BodyStream; true; ReadToEnd; ; ; Argument[-1]; ReturnValue.Element; taint; manual | +| 98 | Summary: Azure; Nullable; true; Value; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 99 | Summary: BloombergLP::bdlbb; Blob; true; buffer; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 100 | Summary: BloombergLP::bdlbb; BlobBuffer; true; buffer; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 101 | Summary: BloombergLP::bdlbb; BlobBuffer; true; data; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 102 | Summary: BloombergLP::bdlbb; BlobUtil; true; copy; (Blob *,int,const Blob &,int,int); ; Argument[*2]; Argument[*0]; taint; manual | +| 103 | Summary: BloombergLP::bdlbb; BlobUtil; true; copy; (Blob *,int,const char *,int); ; Argument[*2]; Argument[*0]; taint; manual | +| 104 | Summary: BloombergLP::bdlbb; BlobUtil; true; copy; (char *,const Blob &,int,int); ; Argument[*1]; Argument[*0]; taint; manual | +| 105 | Summary: BloombergLP::bdlbb; BlobUtil; true; getContiguousRangeOrCopy; ; ; Argument[*1]; ReturnValue[*]; taint; manual | +| 106 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | edges | asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:91:7:91:17 | recv_buffer | provenance | Src:MaD:56 | | asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:93:29:93:39 | recv_buffer | provenance | Src:MaD:56 Sink:MaD:4 | @@ -111,16 +113,16 @@ edges | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | | | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:101:7:101:17 | send_buffer | provenance | | | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:103:29:103:39 | send_buffer | provenance | Sink:MaD:4 | -| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:104 | +| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:106 | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:257:5:257:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:262:5:262:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:266:38:266:41 | *resp | provenance | | | azure.cpp:253:48:253:60 | call to GetBodyStream | azure.cpp:253:48:253:60 | *call to GetBodyStream | provenance | Src:MaD:53 | -| azure.cpp:257:5:257:8 | *resp | azure.cpp:257:16:257:21 | Read output argument | provenance | MaD:93 | +| azure.cpp:257:5:257:8 | *resp | azure.cpp:257:16:257:21 | Read output argument | provenance | MaD:95 | | azure.cpp:257:16:257:21 | Read output argument | azure.cpp:258:10:258:16 | * ... | provenance | | -| azure.cpp:262:5:262:8 | *resp | azure.cpp:262:23:262:28 | ReadToCount output argument | provenance | MaD:94 | +| azure.cpp:262:5:262:8 | *resp | azure.cpp:262:23:262:28 | ReadToCount output argument | provenance | MaD:96 | | azure.cpp:262:23:262:28 | ReadToCount output argument | azure.cpp:263:10:263:16 | * ... | provenance | | -| azure.cpp:266:38:266:41 | *resp | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | provenance | MaD:95 | +| azure.cpp:266:38:266:41 | *resp | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | provenance | MaD:97 | | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | provenance | | | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | azure.cpp:267:10:267:12 | vec [element] | provenance | | | azure.cpp:267:10:267:12 | vec [element] | azure.cpp:267:10:267:12 | vec | provenance | | @@ -136,10 +138,10 @@ edges | azure.cpp:278:10:278:13 | body | azure.cpp:278:10:278:13 | body | provenance | | | azure.cpp:281:68:281:84 | *call to ExtractBodyStream | azure.cpp:282:21:282:23 | *call to get | provenance | | | azure.cpp:281:68:281:84 | call to ExtractBodyStream | azure.cpp:281:68:281:84 | *call to ExtractBodyStream | provenance | Src:MaD:50 | -| azure.cpp:282:21:282:23 | *call to get | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | MaD:95 | +| azure.cpp:282:21:282:23 | *call to get | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | MaD:97 | | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | azure.cpp:282:10:282:38 | call to ReadToEnd | provenance | | | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | | -| azure.cpp:289:24:289:56 | call to GetHeader | azure.cpp:289:63:289:65 | call to Value | provenance | MaD:96 | +| azure.cpp:289:24:289:56 | call to GetHeader | azure.cpp:289:63:289:65 | call to Value | provenance | MaD:98 | | azure.cpp:289:32:289:40 | call to GetHeader | azure.cpp:289:24:289:56 | call to GetHeader | provenance | | | azure.cpp:289:32:289:40 | call to GetHeader | azure.cpp:289:32:289:40 | call to GetHeader | provenance | Src:MaD:54 | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:289:63:289:65 | call to Value | provenance | | @@ -153,36 +155,36 @@ edges | azure.cpp:295:10:295:20 | contentType | azure.cpp:295:10:295:20 | contentType | provenance | | | bdlbb.cpp:54:16:54:23 | call to source | bdlbb.cpp:56:49:56:52 | *call to data | provenance | TaintFunction | | bdlbb.cpp:56:37:56:41 | copy output argument | bdlbb.cpp:58:42:58:45 | *blob | provenance | | -| bdlbb.cpp:56:49:56:52 | *call to data | bdlbb.cpp:56:37:56:41 | copy output argument | provenance | MaD:101 | +| bdlbb.cpp:56:49:56:52 | *call to data | bdlbb.cpp:56:37:56:41 | copy output argument | provenance | MaD:103 | | bdlbb.cpp:58:37:58:39 | copy output argument | bdlbb.cpp:59:7:59:10 | * ... | provenance | | -| bdlbb.cpp:58:42:58:45 | *blob | bdlbb.cpp:58:37:58:39 | copy output argument | provenance | MaD:102 | +| bdlbb.cpp:58:42:58:45 | *blob | bdlbb.cpp:58:37:58:39 | copy output argument | provenance | MaD:104 | | bdlbb.cpp:63:16:63:23 | call to source | bdlbb.cpp:65:49:65:52 | *call to data | provenance | TaintFunction | | bdlbb.cpp:65:37:65:41 | copy output argument | bdlbb.cpp:66:18:66:21 | *blob | provenance | | -| bdlbb.cpp:65:49:65:52 | *call to data | bdlbb.cpp:65:37:65:41 | copy output argument | provenance | MaD:101 | -| bdlbb.cpp:66:18:66:21 | *blob | bdlbb.cpp:66:29:66:32 | *call to buffer | provenance | MaD:97 | +| bdlbb.cpp:65:49:65:52 | *call to data | bdlbb.cpp:65:37:65:41 | copy output argument | provenance | MaD:103 | +| bdlbb.cpp:66:18:66:21 | *blob | bdlbb.cpp:66:29:66:32 | *call to buffer | provenance | MaD:99 | | bdlbb.cpp:66:18:66:38 | *call to data | bdlbb.cpp:66:18:66:38 | *call to data | provenance | | | bdlbb.cpp:66:18:66:38 | *call to data | bdlbb.cpp:67:7:67:8 | * ... | provenance | | -| bdlbb.cpp:66:29:66:32 | *call to buffer | bdlbb.cpp:66:18:66:38 | *call to data | provenance | MaD:99 | +| bdlbb.cpp:66:29:66:32 | *call to buffer | bdlbb.cpp:66:18:66:38 | *call to data | provenance | MaD:101 | | bdlbb.cpp:72:16:72:23 | call to source | bdlbb.cpp:74:49:74:52 | *call to data | provenance | TaintFunction | | bdlbb.cpp:74:37:74:41 | copy output argument | bdlbb.cpp:75:18:75:21 | *blob | provenance | | -| bdlbb.cpp:74:49:74:52 | *call to data | bdlbb.cpp:74:37:74:41 | copy output argument | provenance | MaD:101 | -| bdlbb.cpp:75:18:75:21 | *blob | bdlbb.cpp:75:29:75:32 | *call to buffer | provenance | MaD:97 | +| bdlbb.cpp:74:49:74:52 | *call to data | bdlbb.cpp:74:37:74:41 | copy output argument | provenance | MaD:103 | +| bdlbb.cpp:75:18:75:21 | *blob | bdlbb.cpp:75:29:75:32 | *call to buffer | provenance | MaD:99 | | bdlbb.cpp:75:18:75:46 | call to get | bdlbb.cpp:76:7:76:8 | * ... | provenance | | -| bdlbb.cpp:75:29:75:32 | *call to buffer | bdlbb.cpp:75:39:75:41 | *call to buffer | provenance | MaD:98 | +| bdlbb.cpp:75:29:75:32 | *call to buffer | bdlbb.cpp:75:39:75:41 | *call to buffer | provenance | MaD:100 | | bdlbb.cpp:75:39:75:41 | *call to buffer | bdlbb.cpp:75:18:75:46 | call to get | provenance | DataFlowFunction | | bdlbb.cpp:80:16:80:23 | call to source | bdlbb.cpp:82:49:82:52 | *call to data | provenance | TaintFunction | | bdlbb.cpp:82:37:82:41 | copy output argument | bdlbb.cpp:84:72:84:75 | *blob | provenance | | -| bdlbb.cpp:82:49:82:52 | *call to data | bdlbb.cpp:82:37:82:41 | copy output argument | provenance | MaD:101 | +| bdlbb.cpp:82:49:82:52 | *call to data | bdlbb.cpp:82:37:82:41 | copy output argument | provenance | MaD:103 | | bdlbb.cpp:84:12:84:65 | *call to getContiguousRangeOrCopy | bdlbb.cpp:84:12:84:65 | *call to getContiguousRangeOrCopy | provenance | | | bdlbb.cpp:84:12:84:65 | *call to getContiguousRangeOrCopy | bdlbb.cpp:85:7:85:8 | * ... | provenance | | -| bdlbb.cpp:84:72:84:75 | *blob | bdlbb.cpp:84:12:84:65 | *call to getContiguousRangeOrCopy | provenance | MaD:103 | +| bdlbb.cpp:84:72:84:75 | *blob | bdlbb.cpp:84:12:84:65 | *call to getContiguousRangeOrCopy | provenance | MaD:105 | | bdlbb.cpp:90:16:90:23 | call to source | bdlbb.cpp:92:48:92:51 | *call to data | provenance | TaintFunction | | bdlbb.cpp:92:37:92:40 | copy output argument | bdlbb.cpp:94:46:94:48 | *src | provenance | | -| bdlbb.cpp:92:48:92:51 | *call to data | bdlbb.cpp:92:37:92:40 | copy output argument | provenance | MaD:101 | +| bdlbb.cpp:92:48:92:51 | *call to data | bdlbb.cpp:92:37:92:40 | copy output argument | provenance | MaD:103 | | bdlbb.cpp:94:37:94:40 | copy output argument | bdlbb.cpp:96:42:96:44 | *dst | provenance | | -| bdlbb.cpp:94:46:94:48 | *src | bdlbb.cpp:94:37:94:40 | copy output argument | provenance | MaD:100 | +| bdlbb.cpp:94:46:94:48 | *src | bdlbb.cpp:94:37:94:40 | copy output argument | provenance | MaD:102 | | bdlbb.cpp:96:37:96:39 | copy output argument | bdlbb.cpp:97:7:97:10 | * ... | provenance | | -| bdlbb.cpp:96:42:96:44 | *dst | bdlbb.cpp:96:37:96:39 | copy output argument | provenance | MaD:102 | +| bdlbb.cpp:96:42:96:44 | *dst | bdlbb.cpp:96:37:96:39 | copy output argument | provenance | MaD:104 | | test.cpp:7:47:7:52 | value2 | test.cpp:7:64:7:69 | value2 | provenance | | | test.cpp:7:64:7:69 | value2 | test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | provenance | | | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:10:10:10:18 | call to ymlSource | provenance | Src:MaD:48 | @@ -234,27 +236,27 @@ edges | test.cpp:133:10:133:18 | call to ymlSource | test.cpp:134:45:134:45 | x | provenance | | | test.cpp:134:13:134:43 | call to templateFunction | test.cpp:134:13:134:43 | call to templateFunction | provenance | | | test.cpp:134:13:134:43 | call to templateFunction | test.cpp:135:10:135:10 | y | provenance | Sink:MaD:3 | -| test.cpp:134:45:134:45 | x | test.cpp:134:13:134:43 | call to templateFunction | provenance | MaD:91 | +| test.cpp:134:45:134:45 | x | test.cpp:134:13:134:43 | call to templateFunction | provenance | MaD:93 | | test.cpp:146:10:146:18 | call to ymlSource | test.cpp:146:10:146:18 | call to ymlSource | provenance | Src:MaD:48 | | test.cpp:146:10:146:18 | call to ymlSource | test.cpp:148:26:148:26 | x | provenance | | | test.cpp:148:10:148:27 | call to function | test.cpp:148:10:148:27 | call to function | provenance | | | test.cpp:148:10:148:27 | call to function | test.cpp:149:10:149:10 | z | provenance | Sink:MaD:3 | -| test.cpp:148:26:148:26 | x | test.cpp:148:10:148:27 | call to function | provenance | MaD:92 | +| test.cpp:148:26:148:26 | x | test.cpp:148:10:148:27 | call to function | provenance | MaD:94 | | test.cpp:155:10:155:18 | call to ymlSource | test.cpp:155:10:155:18 | call to ymlSource | provenance | Src:MaD:48 | | test.cpp:155:10:155:18 | call to ymlSource | test.cpp:157:26:157:26 | x | provenance | | | test.cpp:157:13:157:20 | call to function | test.cpp:157:13:157:20 | call to function | provenance | | | test.cpp:157:13:157:20 | call to function | test.cpp:158:10:158:10 | z | provenance | Sink:MaD:3 | -| test.cpp:157:26:157:26 | x | test.cpp:157:13:157:20 | call to function | provenance | MaD:92 | +| test.cpp:157:26:157:26 | x | test.cpp:157:13:157:20 | call to function | provenance | MaD:94 | | test.cpp:164:34:164:34 | x | test.cpp:165:69:165:69 | x | provenance | | | test.cpp:165:12:165:64 | call to templateFunction2 | test.cpp:164:7:164:7 | *templateFunction3 | provenance | | | test.cpp:165:12:165:64 | call to templateFunction2 | test.cpp:165:12:165:64 | call to templateFunction2 | provenance | | -| test.cpp:165:69:165:69 | x | test.cpp:165:12:165:64 | call to templateFunction2 | provenance | MaD:90 | +| test.cpp:165:69:165:69 | x | test.cpp:165:12:165:64 | call to templateFunction2 | provenance | MaD:92 | | test.cpp:170:10:170:18 | call to ymlSource | test.cpp:170:10:170:18 | call to ymlSource | provenance | Src:MaD:48 | | test.cpp:170:10:170:18 | call to ymlSource | test.cpp:172:51:172:51 | x | provenance | | | test.cpp:172:13:172:44 | call to templateFunction3 | test.cpp:172:13:172:44 | call to templateFunction3 | provenance | | | test.cpp:172:13:172:44 | call to templateFunction3 | test.cpp:173:10:173:10 | y | provenance | Sink:MaD:3 | | test.cpp:172:51:172:51 | x | test.cpp:164:34:164:34 | x | provenance | | -| test.cpp:172:51:172:51 | x | test.cpp:172:13:172:44 | call to templateFunction3 | provenance | MaD:90 | +| test.cpp:172:51:172:51 | x | test.cpp:172:13:172:44 | call to templateFunction3 | provenance | MaD:92 | | test.cpp:186:2:186:2 | *s [post update] [myField] | test.cpp:187:33:187:34 | *& ... [myField] | provenance | | | test.cpp:186:2:186:24 | ... = ... | test.cpp:186:2:186:2 | *s [post update] [myField] | provenance | | | test.cpp:186:14:186:22 | call to ymlSource | test.cpp:186:2:186:24 | ... = ... | provenance | Src:MaD:48 | @@ -268,15 +270,15 @@ edges | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | test.cpp:201:10:201:10 | x | provenance | Sink:MaD:3 | | test.cpp:200:35:200:36 | *& ... [myField] | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | provenance | MaD:83 | | test.cpp:216:3:216:4 | get_ptr output argument [value] | test.cpp:217:11:217:12 | *rf [value] | provenance | | -| test.cpp:216:3:216:28 | ... = ... | test.cpp:216:3:216:4 | get_ptr output argument [value] | provenance | MaD:89 | +| test.cpp:216:3:216:28 | ... = ... | test.cpp:216:3:216:4 | get_ptr output argument [value] | provenance | MaD:91 | | test.cpp:216:18:216:26 | call to ymlSource | test.cpp:216:3:216:28 | ... = ... | provenance | Src:MaD:48 | | test.cpp:217:11:217:12 | *rf [value] | test.cpp:217:14:217:18 | value | provenance | | | test.cpp:217:14:217:18 | value | test.cpp:217:14:217:18 | value | provenance | | | test.cpp:217:14:217:18 | value | test.cpp:218:11:218:11 | x | provenance | Sink:MaD:3 | | test.cpp:222:3:222:3 | operator[] output argument | test.cpp:223:12:223:12 | *s | provenance | | -| test.cpp:222:3:222:20 | ... = ... | test.cpp:222:3:222:3 | operator[] output argument | provenance | MaD:88 | +| test.cpp:222:3:222:20 | ... = ... | test.cpp:222:3:222:3 | operator[] output argument | provenance | MaD:90 | | test.cpp:222:10:222:18 | call to ymlSource | test.cpp:222:3:222:20 | ... = ... | provenance | Src:MaD:48 | -| test.cpp:223:12:223:12 | *s | test.cpp:223:13:223:15 | call to operator[] | provenance | MaD:87 | +| test.cpp:223:12:223:12 | *s | test.cpp:223:13:223:15 | call to operator[] | provenance | MaD:89 | | test.cpp:223:13:223:15 | call to operator[] | test.cpp:223:13:223:15 | call to operator[] | provenance | | | test.cpp:223:13:223:15 | call to operator[] | test.cpp:224:11:224:11 | c | provenance | Sink:MaD:3 | | test.cpp:242:29:242:29 | *s [value] | test.cpp:243:10:243:10 | *s [value] | provenance | | @@ -351,6 +353,52 @@ edges | test.cpp:329:12:329:16 | value | test.cpp:329:12:329:16 | value | provenance | Sink:MaD:3 | | test.cpp:331:10:331:19 | * ... | test.cpp:331:10:331:19 | * ... | provenance | Sink:MaD:3 | | test.cpp:331:11:331:11 | *s [*pointer] | test.cpp:331:10:331:19 | * ... | provenance | | +| test.cpp:341:30:341:32 | arg | test.cpp:342:5:342:17 | ... = ... | provenance | | +| test.cpp:342:5:342:8 | *this [post update] [s] | test.cpp:341:3:341:22 | *this [Return] [s] | provenance | | +| test.cpp:342:5:342:17 | ... = ... | test.cpp:342:5:342:8 | *this [post update] [s] | provenance | | +| test.cpp:345:38:345:40 | arg | test.cpp:346:5:346:18 | ... = ... | provenance | | +| test.cpp:346:5:346:8 | *this [post update] [ul] | test.cpp:345:3:345:22 | *this [Return] [ul] | provenance | | +| test.cpp:346:5:346:18 | ... = ... | test.cpp:346:5:346:8 | *this [post update] [ul] | provenance | | +| test.cpp:361:15:361:23 | call to ymlSource | test.cpp:361:15:361:25 | call to ymlSource | provenance | Src:MaD:48 | +| test.cpp:361:15:361:25 | call to ymlSource | test.cpp:362:15:362:15 | *x | provenance | | +| test.cpp:362:5:362:5 | forward output argument [s] | test.cpp:364:30:364:30 | *f [s] | provenance | | +| test.cpp:362:15:362:15 | *x | test.cpp:341:30:341:32 | arg | provenance | | +| test.cpp:362:15:362:15 | *x | test.cpp:362:5:362:5 | forward output argument [s] | provenance | | +| test.cpp:364:30:364:30 | *f [s] | test.cpp:364:32:364:34 | call to get [s] | provenance | MaD:88 | +| test.cpp:364:32:364:34 | call to get [s] | test.cpp:364:32:364:34 | call to get [s] | provenance | | +| test.cpp:364:32:364:34 | call to get [s] | test.cpp:365:13:365:13 | *c [s] | provenance | | +| test.cpp:365:13:365:13 | *c [s] | test.cpp:365:13:365:15 | s | provenance | | +| test.cpp:365:13:365:13 | *c [s] | test.cpp:365:15:365:15 | s | provenance | Sink:MaD:3 | +| test.cpp:365:13:365:15 | s | test.cpp:365:15:365:15 | s | provenance | Sink:MaD:3 | +| test.cpp:370:24:370:32 | call to ymlSource | test.cpp:370:24:370:34 | call to ymlSource | provenance | Src:MaD:48 | +| test.cpp:370:24:370:34 | call to ymlSource | test.cpp:371:15:371:16 | *ul | provenance | | +| test.cpp:371:5:371:5 | forward output argument [ul] | test.cpp:373:30:373:30 | *f [ul] | provenance | | +| test.cpp:371:15:371:16 | *ul | test.cpp:345:38:345:40 | arg | provenance | | +| test.cpp:371:15:371:16 | *ul | test.cpp:371:5:371:5 | forward output argument [ul] | provenance | | +| test.cpp:373:30:373:30 | *f [ul] | test.cpp:373:32:373:34 | call to get [ul] | provenance | MaD:88 | +| test.cpp:373:32:373:34 | call to get [ul] | test.cpp:373:32:373:34 | call to get [ul] | provenance | | +| test.cpp:373:32:373:34 | call to get [ul] | test.cpp:375:13:375:13 | *c [ul] | provenance | | +| test.cpp:375:13:375:13 | *c [ul] | test.cpp:375:13:375:16 | ul | provenance | | +| test.cpp:375:13:375:13 | *c [ul] | test.cpp:375:15:375:16 | ul | provenance | Sink:MaD:3 | +| test.cpp:375:13:375:16 | ul | test.cpp:375:15:375:16 | ul | provenance | Sink:MaD:3 | +| test.cpp:394:11:394:19 | call to ymlSource | test.cpp:394:11:394:19 | call to ymlSource | provenance | Src:MaD:48 | +| test.cpp:394:11:394:19 | call to ymlSource | test.cpp:395:16:395:16 | *x | provenance | | +| test.cpp:395:3:395:3 | emplace output argument [element, x] | test.cpp:397:15:397:15 | *c [element, x] | provenance | | +| test.cpp:395:16:395:16 | *x | test.cpp:395:3:395:3 | emplace output argument [element, x] | provenance | | +| test.cpp:397:15:397:15 | *c [element, x] | test.cpp:397:20:397:22 | call to get [x] | provenance | MaD:87 | +| test.cpp:397:20:397:22 | call to get [x] | test.cpp:397:20:397:22 | call to get [x] | provenance | | +| test.cpp:397:20:397:22 | call to get [x] | test.cpp:398:11:398:11 | *e [x] | provenance | | +| test.cpp:398:11:398:11 | *e [x] | test.cpp:398:13:398:13 | x | provenance | | +| test.cpp:398:13:398:13 | x | test.cpp:398:13:398:13 | x | provenance | Sink:MaD:3 | +| test.cpp:408:11:408:19 | call to ymlSource | test.cpp:408:11:408:19 | call to ymlSource | provenance | Src:MaD:48 | +| test.cpp:408:11:408:19 | call to ymlSource | test.cpp:409:16:409:16 | *x | provenance | | +| test.cpp:409:3:409:3 | emplace output argument [element, x] | test.cpp:411:34:411:34 | *c [element, x] | provenance | | +| test.cpp:409:16:409:16 | *x | test.cpp:409:3:409:3 | emplace output argument [element, x] | provenance | | +| test.cpp:411:34:411:34 | *c [element, x] | test.cpp:411:39:411:41 | call to get [x] | provenance | MaD:87 | +| test.cpp:411:39:411:41 | call to get [x] | test.cpp:411:39:411:41 | call to get [x] | provenance | | +| test.cpp:411:39:411:41 | call to get [x] | test.cpp:412:11:412:11 | *e [x] | provenance | | +| test.cpp:412:11:412:11 | *e [x] | test.cpp:412:13:412:13 | x | provenance | | +| test.cpp:412:13:412:13 | x | test.cpp:412:13:412:13 | x | provenance | Sink:MaD:3 | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:24:8:24:11 | * ... | provenance | | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:27:36:27:38 | *cmd | provenance | | | windows.cpp:22:15:22:29 | call to GetCommandLineA | windows.cpp:22:15:22:29 | *call to GetCommandLineA | provenance | Src:MaD:5 | @@ -811,6 +859,54 @@ nodes | test.cpp:331:10:331:19 | * ... | semmle.label | * ... | | test.cpp:331:11:331:11 | *s [*pointer] | semmle.label | *s [*pointer] | | test.cpp:334:10:334:16 | * ... | semmle.label | * ... | +| test.cpp:341:3:341:22 | *this [Return] [s] | semmle.label | *this [Return] [s] | +| test.cpp:341:30:341:32 | arg | semmle.label | arg | +| test.cpp:342:5:342:8 | *this [post update] [s] | semmle.label | *this [post update] [s] | +| test.cpp:342:5:342:17 | ... = ... | semmle.label | ... = ... | +| test.cpp:345:3:345:22 | *this [Return] [ul] | semmle.label | *this [Return] [ul] | +| test.cpp:345:38:345:40 | arg | semmle.label | arg | +| test.cpp:346:5:346:8 | *this [post update] [ul] | semmle.label | *this [post update] [ul] | +| test.cpp:346:5:346:18 | ... = ... | semmle.label | ... = ... | +| test.cpp:361:15:361:23 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:361:15:361:25 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:362:5:362:5 | forward output argument [s] | semmle.label | forward output argument [s] | +| test.cpp:362:15:362:15 | *x | semmle.label | *x | +| test.cpp:364:30:364:30 | *f [s] | semmle.label | *f [s] | +| test.cpp:364:32:364:34 | call to get [s] | semmle.label | call to get [s] | +| test.cpp:364:32:364:34 | call to get [s] | semmle.label | call to get [s] | +| test.cpp:365:13:365:13 | *c [s] | semmle.label | *c [s] | +| test.cpp:365:13:365:15 | s | semmle.label | s | +| test.cpp:365:15:365:15 | s | semmle.label | s | +| test.cpp:370:24:370:32 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:370:24:370:34 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:371:5:371:5 | forward output argument [ul] | semmle.label | forward output argument [ul] | +| test.cpp:371:15:371:16 | *ul | semmle.label | *ul | +| test.cpp:373:30:373:30 | *f [ul] | semmle.label | *f [ul] | +| test.cpp:373:32:373:34 | call to get [ul] | semmle.label | call to get [ul] | +| test.cpp:373:32:373:34 | call to get [ul] | semmle.label | call to get [ul] | +| test.cpp:375:13:375:13 | *c [ul] | semmle.label | *c [ul] | +| test.cpp:375:13:375:16 | ul | semmle.label | ul | +| test.cpp:375:15:375:16 | ul | semmle.label | ul | +| test.cpp:394:11:394:19 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:394:11:394:19 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:395:3:395:3 | emplace output argument [element, x] | semmle.label | emplace output argument [element, x] | +| test.cpp:395:16:395:16 | *x | semmle.label | *x | +| test.cpp:397:15:397:15 | *c [element, x] | semmle.label | *c [element, x] | +| test.cpp:397:20:397:22 | call to get [x] | semmle.label | call to get [x] | +| test.cpp:397:20:397:22 | call to get [x] | semmle.label | call to get [x] | +| test.cpp:398:11:398:11 | *e [x] | semmle.label | *e [x] | +| test.cpp:398:13:398:13 | x | semmle.label | x | +| test.cpp:398:13:398:13 | x | semmle.label | x | +| test.cpp:408:11:408:19 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:408:11:408:19 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:409:3:409:3 | emplace output argument [element, x] | semmle.label | emplace output argument [element, x] | +| test.cpp:409:16:409:16 | *x | semmle.label | *x | +| test.cpp:411:34:411:34 | *c [element, x] | semmle.label | *c [element, x] | +| test.cpp:411:39:411:41 | call to get [x] | semmle.label | call to get [x] | +| test.cpp:411:39:411:41 | call to get [x] | semmle.label | call to get [x] | +| test.cpp:412:11:412:11 | *e [x] | semmle.label | *e [x] | +| test.cpp:412:13:412:13 | x | semmle.label | x | +| test.cpp:412:13:412:13 | x | semmle.label | x | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | semmle.label | *call to GetCommandLineA | | windows.cpp:22:15:22:29 | call to GetCommandLineA | semmle.label | call to GetCommandLineA | | windows.cpp:24:8:24:11 | * ... | semmle.label | * ... | @@ -1032,4 +1128,6 @@ nodes subpaths | test.cpp:32:41:32:41 | x | test.cpp:7:47:7:52 | value2 | test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | | test.cpp:172:51:172:51 | x | test.cpp:164:34:164:34 | x | test.cpp:164:7:164:7 | *templateFunction3 | test.cpp:172:13:172:44 | call to templateFunction3 | +| test.cpp:362:15:362:15 | *x | test.cpp:341:30:341:32 | arg | test.cpp:341:3:341:22 | *this [Return] [s] | test.cpp:362:5:362:5 | forward output argument [s] | +| test.cpp:371:15:371:16 | *ul | test.cpp:345:38:345:40 | arg | test.cpp:345:3:345:22 | *this [Return] [ul] | test.cpp:371:5:371:5 | forward output argument [ul] | testFailures diff --git a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp index 7865c177e4e6..4d6345710ce7 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp @@ -362,7 +362,7 @@ void forward_test() { f.forward(x); ConstructableFromInt c = f.get(); - ymlSink(c.s); // $ MISSING: ir + ymlSink(c.s); // $ ir ymlSink(c.ul); // clean } { @@ -372,7 +372,7 @@ void forward_test() { ConstructableFromInt c = f.get(); ymlSink(c.s); // clean - ymlSink(c.ul); // $ MISSING: ir + ymlSink(c.ul); // $ ir } } @@ -395,7 +395,7 @@ void forward_test_model() { c.emplace(0, x); Element e = c.get(); - ymlSink(e.x); // $ MISSING: ir + ymlSink(e.x); // $ ir } struct ElementWithDefaultArgument { @@ -409,5 +409,5 @@ void forward_test_model_with_default_argument() { c.emplace(0, x); ElementWithDefaultArgument e = c.get(); - ymlSink(e.x); // $ MISSING: ir + ymlSink(e.x); // $ ir } \ No newline at end of file From 0a5fd5ebc5e51937bf1fd5f60518873d0779541f Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Wed, 9 Sep 2026 11:26:20 +0200 Subject: [PATCH 0759/2098] Rust: Remove experimental flag to `codeql_pack` rule --- rust/BUILD.bazel | 1 - 1 file changed, 1 deletion(-) diff --git a/rust/BUILD.bazel b/rust/BUILD.bazel index 6536a4b6fd9e..d574cbc7c330 100644 --- a/rust/BUILD.bazel +++ b/rust/BUILD.bazel @@ -58,5 +58,4 @@ codeql_pack( ":tools", "//rust/downgrades", ], - experimental = True, ) From db2a462b933264a8a09e71abba7ccf14e9917d28 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Wed, 9 Sep 2026 11:26:30 +0100 Subject: [PATCH 0760/2098] Apply batched suggestions from code review C++: Accept Copilot suggestion Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../code/cpp/ir/implementation/aliased_ssa/Instruction.qll | 2 +- .../lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll | 2 +- .../code/cpp/ir/implementation/unaliased_ssa/Instruction.qll | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll index 4d26df9726b3..40aec2243ff4 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll @@ -1750,7 +1750,7 @@ class CallInstruction extends Instruction { /** * Gets the number of positional arguments of the call. */ - final int getNumberOfPositionalArguments() { result = count(this.getAPositionalArgument()) } + final int getNumberOfPositionalArguments() { result = count(this.getAPositionalArgumentOperand()) } /** * Holds if the result is a side effect for the argument at the specified index, or `this` if diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll index 4d26df9726b3..40aec2243ff4 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll @@ -1750,7 +1750,7 @@ class CallInstruction extends Instruction { /** * Gets the number of positional arguments of the call. */ - final int getNumberOfPositionalArguments() { result = count(this.getAPositionalArgument()) } + final int getNumberOfPositionalArguments() { result = count(this.getAPositionalArgumentOperand()) } /** * Holds if the result is a side effect for the argument at the specified index, or `this` if diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll index 4d26df9726b3..40aec2243ff4 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll @@ -1750,7 +1750,7 @@ class CallInstruction extends Instruction { /** * Gets the number of positional arguments of the call. */ - final int getNumberOfPositionalArguments() { result = count(this.getAPositionalArgument()) } + final int getNumberOfPositionalArguments() { result = count(this.getAPositionalArgumentOperand()) } /** * Holds if the result is a side effect for the argument at the specified index, or `this` if From 908e32b00aba755cbc385695d0bbee33b663b0b4 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Wed, 9 Sep 2026 11:38:34 +0100 Subject: [PATCH 0761/2098] C++: Respond to Copilot comments. --- .../semmle/code/cpp/dataflow/ExternalFlow.qll | 36 ++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll index c9dedb4da82d..224094543dce 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll @@ -1075,20 +1075,25 @@ private module Cached { import Cached /** Gets the constructor type selected by `constructorType` in a forwarding model. */ -bindingset[forwarder, type, name, constructorType] private Type getForwardedConstructorType( - Function forwarder, string type, string name, string constructorType + Function forwarder, string namespace, string type, boolean subtypes, string name, + string signature, string ext, string constructorType ) { - exists(string typeArguments, int index | - parseAngles(type, _, typeArguments, "") and - constructorType = getAtIndex(typeArguments, index) and - result = forwarder.getDeclaringType().getTemplateArgument(index) - ) - or - exists(string nameArguments, int index | - parseAngles(name, _, nameArguments, "") and - constructorType = getAtIndex(nameArguments, index) and - result = forwarder.getTemplateArgument(index) + exists(int index | + forwardsModel(namespace, type, subtypes, name, signature, ext, _, constructorType, _, _, _) and + forwarder = interpretElement(namespace, type, subtypes, name, signature, ext) + | + exists(string typeArguments | + parseAngles(type, _, typeArguments, "") and + constructorType = getAtIndex(typeArguments, index) and + result = forwarder.getDeclaringType().getTemplateArgument(index) + ) + or + exists(string nameArguments | + parseAngles(name, _, nameArguments, "") and + constructorType = getAtIndex(nameArguments, index) and + result = forwarder.getTemplateArgument(index) + ) ) } @@ -1110,9 +1115,14 @@ private predicate interpretForwardsModel( // function template, in which case we need to resolve that from the type // or function name. constructor.getDeclaringType() = - getForwardedConstructorType(forwarder, type, name, constructorType).getUnspecifiedType() + getForwardedConstructorType(forwarder, namespace, type, subtypes, name, signature, ext, + constructorType).getUnspecifiedType() or // Or the row specifies forwarding to a specific type. + not exists( + getForwardedConstructorType(forwarder, namespace, type, subtypes, name, signature, ext, + constructorType) + ) and classHasQualifiedName(constructor.getDeclaringType(), namespace, constructorType) ) } From 10981ae7d9c9024ed7df1a844ea257e4ccae0af2 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Wed, 9 Sep 2026 11:39:43 +0100 Subject: [PATCH 0762/2098] C++: Autoformat after Copilot suggestions. --- .../code/cpp/ir/implementation/aliased_ssa/Instruction.qll | 4 +++- .../lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll | 4 +++- .../code/cpp/ir/implementation/unaliased_ssa/Instruction.qll | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll index 40aec2243ff4..5205e8d3f0ba 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll @@ -1750,7 +1750,9 @@ class CallInstruction extends Instruction { /** * Gets the number of positional arguments of the call. */ - final int getNumberOfPositionalArguments() { result = count(this.getAPositionalArgumentOperand()) } + final int getNumberOfPositionalArguments() { + result = count(this.getAPositionalArgumentOperand()) + } /** * Holds if the result is a side effect for the argument at the specified index, or `this` if diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll index 40aec2243ff4..5205e8d3f0ba 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll @@ -1750,7 +1750,9 @@ class CallInstruction extends Instruction { /** * Gets the number of positional arguments of the call. */ - final int getNumberOfPositionalArguments() { result = count(this.getAPositionalArgumentOperand()) } + final int getNumberOfPositionalArguments() { + result = count(this.getAPositionalArgumentOperand()) + } /** * Holds if the result is a side effect for the argument at the specified index, or `this` if diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll index 40aec2243ff4..5205e8d3f0ba 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll @@ -1750,7 +1750,9 @@ class CallInstruction extends Instruction { /** * Gets the number of positional arguments of the call. */ - final int getNumberOfPositionalArguments() { result = count(this.getAPositionalArgumentOperand()) } + final int getNumberOfPositionalArguments() { + result = count(this.getAPositionalArgumentOperand()) + } /** * Holds if the result is a side effect for the argument at the specified index, or `this` if From 1511488cbe43602a32e25d9599a3cbf4eb02e183 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Wed, 9 Sep 2026 11:40:57 +0100 Subject: [PATCH 0763/2098] C++: Fix spelling. --- .../semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll index a60d3ca04cce..ca9170371dfa 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll @@ -654,7 +654,7 @@ predicate isForwarderConstructorArgumentNodeImpl(CallInstruction call) { * ``` * v.__emplace_back(x, &Foo) * ``` - * (nevermind that this is not real C++ since you cannot take the address of a + * (never mind that this is not real C++ since you cannot take the address of a * constructor.) * where `__emplace_back` invokes `Foo` with the `x` argument and returns the * result. From cca9f3fce1eaccd064ff69eb651741f6eee3da41 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Wed, 9 Sep 2026 11:59:17 +0100 Subject: [PATCH 0764/2098] C++: Add false positive from lack of overload handling. --- .../dataflow/external-models/flow.expected | 59 +++++++++++++++++++ .../dataflow/external-models/sinks.expected | 3 + .../dataflow/external-models/sources.expected | 1 + .../dataflow/external-models/test.cpp | 25 ++++++++ 4 files changed, 88 insertions(+) diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index d66dc6d385f6..e88ac350f6c6 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -399,6 +399,34 @@ edges | test.cpp:411:39:411:41 | call to get [x] | test.cpp:412:11:412:11 | *e [x] | provenance | | | test.cpp:412:11:412:11 | *e [x] | test.cpp:412:13:412:13 | x | provenance | | | test.cpp:412:13:412:13 | x | test.cpp:412:13:412:13 | x | provenance | Sink:MaD:3 | +| test.cpp:417:3:417:28 | *ElementWithOverloadedArity [post update] [x] | test.cpp:417:3:417:28 | *this [Return] [x] | provenance | | +| test.cpp:417:34:417:38 | first | test.cpp:417:45:417:49 | first | provenance | | +| test.cpp:417:45:417:49 | first | test.cpp:417:3:417:28 | *ElementWithOverloadedArity [post update] [x] | provenance | | +| test.cpp:418:3:418:28 | *ElementWithOverloadedArity [post update] [x] | test.cpp:418:3:418:28 | *this [Return] [x] | provenance | | +| test.cpp:418:39:418:44 | second | test.cpp:418:51:418:56 | second | provenance | | +| test.cpp:418:51:418:56 | second | test.cpp:418:3:418:28 | *ElementWithOverloadedArity [post update] [x] | provenance | | +| test.cpp:422:11:422:19 | call to ymlSource | test.cpp:422:11:422:19 | call to ymlSource | provenance | Src:MaD:48 | +| test.cpp:422:11:422:19 | call to ymlSource | test.cpp:425:18:425:18 | *x | provenance | | +| test.cpp:422:11:422:19 | call to ymlSource | test.cpp:430:18:430:18 | *x | provenance | | +| test.cpp:422:11:422:19 | call to ymlSource | test.cpp:435:21:435:21 | *x | provenance | | +| test.cpp:425:5:425:5 | emplace output argument [element, x] | test.cpp:426:13:426:13 | *c [element, x] | provenance | | +| test.cpp:425:18:425:18 | *x | test.cpp:417:34:417:38 | first | provenance | | +| test.cpp:425:18:425:18 | *x | test.cpp:425:5:425:5 | emplace output argument [element, x] | provenance | | +| test.cpp:426:13:426:13 | *c [element, x] | test.cpp:426:18:426:20 | *call to get [x] | provenance | MaD:87 | +| test.cpp:426:18:426:20 | *call to get [x] | test.cpp:426:21:426:21 | x | provenance | | +| test.cpp:426:21:426:21 | x | test.cpp:426:21:426:21 | x | provenance | Sink:MaD:3 | +| test.cpp:430:5:430:5 | emplace output argument [element, x] | test.cpp:431:13:431:13 | *c [element, x] | provenance | | +| test.cpp:430:18:430:18 | *x | test.cpp:417:34:417:38 | first | provenance | | +| test.cpp:430:18:430:18 | *x | test.cpp:430:5:430:5 | emplace output argument [element, x] | provenance | | +| test.cpp:431:13:431:13 | *c [element, x] | test.cpp:431:18:431:20 | *call to get [x] | provenance | MaD:87 | +| test.cpp:431:18:431:20 | *call to get [x] | test.cpp:431:21:431:21 | x | provenance | | +| test.cpp:431:21:431:21 | x | test.cpp:431:21:431:21 | x | provenance | Sink:MaD:3 | +| test.cpp:435:5:435:5 | emplace output argument [element, x] | test.cpp:436:13:436:13 | *c [element, x] | provenance | | +| test.cpp:435:21:435:21 | *x | test.cpp:418:39:418:44 | second | provenance | | +| test.cpp:435:21:435:21 | *x | test.cpp:435:5:435:5 | emplace output argument [element, x] | provenance | | +| test.cpp:436:13:436:13 | *c [element, x] | test.cpp:436:18:436:20 | *call to get [x] | provenance | MaD:87 | +| test.cpp:436:18:436:20 | *call to get [x] | test.cpp:436:21:436:21 | x | provenance | | +| test.cpp:436:21:436:21 | x | test.cpp:436:21:436:21 | x | provenance | Sink:MaD:3 | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:24:8:24:11 | * ... | provenance | | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:27:36:27:38 | *cmd | provenance | | | windows.cpp:22:15:22:29 | call to GetCommandLineA | windows.cpp:22:15:22:29 | *call to GetCommandLineA | provenance | Src:MaD:5 | @@ -907,6 +935,34 @@ nodes | test.cpp:412:11:412:11 | *e [x] | semmle.label | *e [x] | | test.cpp:412:13:412:13 | x | semmle.label | x | | test.cpp:412:13:412:13 | x | semmle.label | x | +| test.cpp:417:3:417:28 | *ElementWithOverloadedArity [post update] [x] | semmle.label | *ElementWithOverloadedArity [post update] [x] | +| test.cpp:417:3:417:28 | *this [Return] [x] | semmle.label | *this [Return] [x] | +| test.cpp:417:34:417:38 | first | semmle.label | first | +| test.cpp:417:45:417:49 | first | semmle.label | first | +| test.cpp:418:3:418:28 | *ElementWithOverloadedArity [post update] [x] | semmle.label | *ElementWithOverloadedArity [post update] [x] | +| test.cpp:418:3:418:28 | *this [Return] [x] | semmle.label | *this [Return] [x] | +| test.cpp:418:39:418:44 | second | semmle.label | second | +| test.cpp:418:51:418:56 | second | semmle.label | second | +| test.cpp:422:11:422:19 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:422:11:422:19 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:425:5:425:5 | emplace output argument [element, x] | semmle.label | emplace output argument [element, x] | +| test.cpp:425:18:425:18 | *x | semmle.label | *x | +| test.cpp:426:13:426:13 | *c [element, x] | semmle.label | *c [element, x] | +| test.cpp:426:18:426:20 | *call to get [x] | semmle.label | *call to get [x] | +| test.cpp:426:21:426:21 | x | semmle.label | x | +| test.cpp:426:21:426:21 | x | semmle.label | x | +| test.cpp:430:5:430:5 | emplace output argument [element, x] | semmle.label | emplace output argument [element, x] | +| test.cpp:430:18:430:18 | *x | semmle.label | *x | +| test.cpp:431:13:431:13 | *c [element, x] | semmle.label | *c [element, x] | +| test.cpp:431:18:431:20 | *call to get [x] | semmle.label | *call to get [x] | +| test.cpp:431:21:431:21 | x | semmle.label | x | +| test.cpp:431:21:431:21 | x | semmle.label | x | +| test.cpp:435:5:435:5 | emplace output argument [element, x] | semmle.label | emplace output argument [element, x] | +| test.cpp:435:21:435:21 | *x | semmle.label | *x | +| test.cpp:436:13:436:13 | *c [element, x] | semmle.label | *c [element, x] | +| test.cpp:436:18:436:20 | *call to get [x] | semmle.label | *call to get [x] | +| test.cpp:436:21:436:21 | x | semmle.label | x | +| test.cpp:436:21:436:21 | x | semmle.label | x | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | semmle.label | *call to GetCommandLineA | | windows.cpp:22:15:22:29 | call to GetCommandLineA | semmle.label | call to GetCommandLineA | | windows.cpp:24:8:24:11 | * ... | semmle.label | * ... | @@ -1130,4 +1186,7 @@ subpaths | test.cpp:172:51:172:51 | x | test.cpp:164:34:164:34 | x | test.cpp:164:7:164:7 | *templateFunction3 | test.cpp:172:13:172:44 | call to templateFunction3 | | test.cpp:362:15:362:15 | *x | test.cpp:341:30:341:32 | arg | test.cpp:341:3:341:22 | *this [Return] [s] | test.cpp:362:5:362:5 | forward output argument [s] | | test.cpp:371:15:371:16 | *ul | test.cpp:345:38:345:40 | arg | test.cpp:345:3:345:22 | *this [Return] [ul] | test.cpp:371:5:371:5 | forward output argument [ul] | +| test.cpp:425:18:425:18 | *x | test.cpp:417:34:417:38 | first | test.cpp:417:3:417:28 | *this [Return] [x] | test.cpp:425:5:425:5 | emplace output argument [element, x] | +| test.cpp:430:18:430:18 | *x | test.cpp:417:34:417:38 | first | test.cpp:417:3:417:28 | *this [Return] [x] | test.cpp:430:5:430:5 | emplace output argument [element, x] | +| test.cpp:435:21:435:21 | *x | test.cpp:418:39:418:44 | second | test.cpp:418:3:418:28 | *this [Return] [x] | test.cpp:435:5:435:5 | emplace output argument [element, x] | testFailures diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected index 0701b0f7eeb2..6db6de3fc398 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected @@ -49,3 +49,6 @@ | test.cpp:375:15:375:16 | ul | test-sink | | test.cpp:398:13:398:13 | x | test-sink | | test.cpp:412:13:412:13 | x | test-sink | +| test.cpp:426:21:426:21 | x | test-sink | +| test.cpp:431:21:431:21 | x | test-sink | +| test.cpp:436:21:436:21 | x | test-sink | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected index 7f71ec61b6e4..bf4dd9810df4 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected @@ -23,6 +23,7 @@ | test.cpp:370:24:370:32 | call to ymlSource | local | | test.cpp:394:11:394:19 | call to ymlSource | local | | test.cpp:408:11:408:19 | call to ymlSource | local | +| test.cpp:422:11:422:19 | call to ymlSource | local | | windows.cpp:22:15:22:29 | call to GetCommandLineA | local | | windows.cpp:34:17:34:38 | call to GetEnvironmentStringsA | local | | windows.cpp:39:36:39:38 | GetEnvironmentVariableA output argument | local | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp index 4d6345710ce7..94b961a853eb 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp @@ -410,4 +410,29 @@ void forward_test_model_with_default_argument() { ElementWithDefaultArgument e = c.get(); ymlSink(e.x); // $ ir +} + +struct ElementWithOverloadedArity { + int x; + ElementWithOverloadedArity(int first) : x(first) {} + ElementWithOverloadedArity(int, int second) : x(second) {} +}; + +void forward_test_constructor_arity() { + int x = ymlSource(); + { + Container c; + c.emplace(0, x); + ymlSink(c.get().x); // $ ir + } + { + Container c; + c.emplace(0, x, 0); + ymlSink(c.get().x); // $ SPURIOUS: ir + } + { + Container c; + c.emplace(0, 0, x); + ymlSink(c.get().x); // $ ir + } } \ No newline at end of file From 246c4864fe1a55cd2b186d8d6592e5383fd7a0a2 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Wed, 9 Sep 2026 12:08:34 +0100 Subject: [PATCH 0765/2098] C++: Fix FP by ensuring that the targeted constructor has at least as many parameters as the number of forwarded arguments. --- .../cpp/ir/dataflow/internal/DataFlowPrivate.qll | 4 ++++ .../dataflow/external-models/flow.expected | 14 -------------- .../dataflow/external-models/test.cpp | 2 +- 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll index ca9170371dfa..7faa8bb8681c 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll @@ -607,6 +607,10 @@ predicate forwardingCallTargetsConstructor( CallInstruction call, Cpp::Constructor constructor, int start ) { exists(int numberOfForwardedArguments | + numberOfForwardedArguments <= constructor.getNumberOfParameters() + or + constructor.isVarargs() + | External::forwards(call.getStaticCallTarget(), constructor, start) and call.getNumberOfPositionalArguments() = start + numberOfForwardedArguments and forall(int i | i = [0 .. constructor.getNumberOfParameters() - 1] | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index e88ac350f6c6..60638e39b726 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -407,7 +407,6 @@ edges | test.cpp:418:51:418:56 | second | test.cpp:418:3:418:28 | *ElementWithOverloadedArity [post update] [x] | provenance | | | test.cpp:422:11:422:19 | call to ymlSource | test.cpp:422:11:422:19 | call to ymlSource | provenance | Src:MaD:48 | | test.cpp:422:11:422:19 | call to ymlSource | test.cpp:425:18:425:18 | *x | provenance | | -| test.cpp:422:11:422:19 | call to ymlSource | test.cpp:430:18:430:18 | *x | provenance | | | test.cpp:422:11:422:19 | call to ymlSource | test.cpp:435:21:435:21 | *x | provenance | | | test.cpp:425:5:425:5 | emplace output argument [element, x] | test.cpp:426:13:426:13 | *c [element, x] | provenance | | | test.cpp:425:18:425:18 | *x | test.cpp:417:34:417:38 | first | provenance | | @@ -415,12 +414,6 @@ edges | test.cpp:426:13:426:13 | *c [element, x] | test.cpp:426:18:426:20 | *call to get [x] | provenance | MaD:87 | | test.cpp:426:18:426:20 | *call to get [x] | test.cpp:426:21:426:21 | x | provenance | | | test.cpp:426:21:426:21 | x | test.cpp:426:21:426:21 | x | provenance | Sink:MaD:3 | -| test.cpp:430:5:430:5 | emplace output argument [element, x] | test.cpp:431:13:431:13 | *c [element, x] | provenance | | -| test.cpp:430:18:430:18 | *x | test.cpp:417:34:417:38 | first | provenance | | -| test.cpp:430:18:430:18 | *x | test.cpp:430:5:430:5 | emplace output argument [element, x] | provenance | | -| test.cpp:431:13:431:13 | *c [element, x] | test.cpp:431:18:431:20 | *call to get [x] | provenance | MaD:87 | -| test.cpp:431:18:431:20 | *call to get [x] | test.cpp:431:21:431:21 | x | provenance | | -| test.cpp:431:21:431:21 | x | test.cpp:431:21:431:21 | x | provenance | Sink:MaD:3 | | test.cpp:435:5:435:5 | emplace output argument [element, x] | test.cpp:436:13:436:13 | *c [element, x] | provenance | | | test.cpp:435:21:435:21 | *x | test.cpp:418:39:418:44 | second | provenance | | | test.cpp:435:21:435:21 | *x | test.cpp:435:5:435:5 | emplace output argument [element, x] | provenance | | @@ -951,12 +944,6 @@ nodes | test.cpp:426:18:426:20 | *call to get [x] | semmle.label | *call to get [x] | | test.cpp:426:21:426:21 | x | semmle.label | x | | test.cpp:426:21:426:21 | x | semmle.label | x | -| test.cpp:430:5:430:5 | emplace output argument [element, x] | semmle.label | emplace output argument [element, x] | -| test.cpp:430:18:430:18 | *x | semmle.label | *x | -| test.cpp:431:13:431:13 | *c [element, x] | semmle.label | *c [element, x] | -| test.cpp:431:18:431:20 | *call to get [x] | semmle.label | *call to get [x] | -| test.cpp:431:21:431:21 | x | semmle.label | x | -| test.cpp:431:21:431:21 | x | semmle.label | x | | test.cpp:435:5:435:5 | emplace output argument [element, x] | semmle.label | emplace output argument [element, x] | | test.cpp:435:21:435:21 | *x | semmle.label | *x | | test.cpp:436:13:436:13 | *c [element, x] | semmle.label | *c [element, x] | @@ -1187,6 +1174,5 @@ subpaths | test.cpp:362:15:362:15 | *x | test.cpp:341:30:341:32 | arg | test.cpp:341:3:341:22 | *this [Return] [s] | test.cpp:362:5:362:5 | forward output argument [s] | | test.cpp:371:15:371:16 | *ul | test.cpp:345:38:345:40 | arg | test.cpp:345:3:345:22 | *this [Return] [ul] | test.cpp:371:5:371:5 | forward output argument [ul] | | test.cpp:425:18:425:18 | *x | test.cpp:417:34:417:38 | first | test.cpp:417:3:417:28 | *this [Return] [x] | test.cpp:425:5:425:5 | emplace output argument [element, x] | -| test.cpp:430:18:430:18 | *x | test.cpp:417:34:417:38 | first | test.cpp:417:3:417:28 | *this [Return] [x] | test.cpp:430:5:430:5 | emplace output argument [element, x] | | test.cpp:435:21:435:21 | *x | test.cpp:418:39:418:44 | second | test.cpp:418:3:418:28 | *this [Return] [x] | test.cpp:435:5:435:5 | emplace output argument [element, x] | testFailures diff --git a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp index 94b961a853eb..4bcfeb64473a 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp @@ -428,7 +428,7 @@ void forward_test_constructor_arity() { { Container c; c.emplace(0, x, 0); - ymlSink(c.get().x); // $ SPURIOUS: ir + ymlSink(c.get().x); // clean } { Container c; From 94b78bf0355d8c9bca81a5efd7a8c2017050131f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 9 Sep 2026 11:09:50 +0000 Subject: [PATCH 0766/2098] Keep import member-chain locations precise Co-authored-by: aschackmull <28296824+aschackmull@users.noreply.github.com> --- .../extractor/src/languages/swift/swift.rs | 10 ++- unified/extractor/tests/corpus_tests.rs | 5 +- .../extractor/tests/swift_syntax_pipeline.rs | 67 +++++++++++++++++++ 3 files changed, 77 insertions(+), 5 deletions(-) diff --git a/unified/extractor/src/languages/swift/swift.rs b/unified/extractor/src/languages/swift/swift.rs index 6396d4addd75..1816c81930c5 100644 --- a/unified/extractor/src/languages/swift/swift.rs +++ b/unified/extractor/src/languages/swift/swift.rs @@ -115,15 +115,21 @@ fn member_chain( ctx: &mut yeast::build::BuildCtx<'_, SwiftContext>, parts: Vec, ) -> yeast::Id { + // `member_chain` builds the imported expression inside the larger import + // declaration rule. The imported expression should span the import path, + // not the whole declaration including the `import` keyword. + let source_range = ctx.source_range.take(); let mut iter = parts.into_iter(); let first = iter .next() .expect("identifier with `part:` must have at least one part"); let init = tree!((name_expr identifier: (identifier #{first}))); - iter.fold( + let result = iter.fold( init, |acc, elem| tree!((member_access_expr base: {acc} member: (identifier #{elem}))), - ) + ); + ctx.source_range = source_range; + result } /// Compound-assignment operator spellings (`+=`, `<<=`, ...). Used to tell a diff --git a/unified/extractor/tests/corpus_tests.rs b/unified/extractor/tests/corpus_tests.rs index f0a3c448f12b..47675fc2287f 100644 --- a/unified/extractor/tests/corpus_tests.rs +++ b/unified/extractor/tests/corpus_tests.rs @@ -98,9 +98,8 @@ fn collect_corpus_stems(dir: &Path, out: &mut Vec) { #[cfg(bazel)] fn corpus_dir() -> std::path::PathBuf { - let base = std::path::PathBuf::from( - std::env::var("RUNFILES_DIR").expect("RUNFILES_DIR not set"), - ); + let base = + std::path::PathBuf::from(std::env::var("RUNFILES_DIR").expect("RUNFILES_DIR not set")); std::fs::read_dir(&base) .expect("failed to read RUNFILES_DIR") .filter_map(Result::ok) diff --git a/unified/extractor/tests/swift_syntax_pipeline.rs b/unified/extractor/tests/swift_syntax_pipeline.rs index fde060f98203..3ae966d7bc38 100644 --- a/unified/extractor/tests/swift_syntax_pipeline.rs +++ b/unified/extractor/tests/swift_syntax_pipeline.rs @@ -16,6 +16,39 @@ mod languages; /// A real `swift-syntax-rs` JSON dump of the Swift source `let x = 1`. const LET_X_JSON: &str = include_str!("fixtures/let_x.swiftsyntax.json"); +const IMPORT_FOUNDATION_JSON: &str = r#"{ + "kind": "sourceFile", + "range": {"start":{"offset":0,"line":1,"column":1},"end":{"offset":17,"line":1,"column":18}}, + "statements": [ + { + "kind": "codeBlockItem", + "range": {"start":{"offset":0,"line":1,"column":1},"end":{"offset":17,"line":1,"column":18}}, + "item": { + "kind": "importDecl", + "range": {"start":{"offset":0,"line":1,"column":1},"end":{"offset":17,"line":1,"column":18}}, + "importKeyword": { + "kind": "token", + "tokenKind": "keyword(SwiftSyntax.Keyword.import)", + "text": "import", + "range": {"start":{"offset":0,"line":1,"column":1},"end":{"offset":6,"line":1,"column":7}} + }, + "path": [ + { + "kind": "importPathComponent", + "range": {"start":{"offset":7,"line":1,"column":8},"end":{"offset":17,"line":1,"column":18}}, + "name": { + "kind": "token", + "tokenKind": "identifier(\"Foundation\")", + "text": "Foundation", + "range": {"start":{"offset":7,"line":1,"column":8},"end":{"offset":17,"line":1,"column":18}} + } + } + ] + } + } + ] +}"#; + #[test] fn swift_syntax_json_runs_through_the_desugarer() { let lang = languages::all_language_specs() @@ -47,3 +80,37 @@ fn swift_syntax_json_runs_through_the_desugarer() { assert!(dump.contains("top_level"), "unexpected dump: {dump}"); assert!(dump.contains("block"), "unexpected dump: {dump}"); } + +#[test] +fn import_name_expr_location_excludes_import_keyword() { + let lang = languages::all_language_specs() + .into_iter() + .find(|l| l.file_globs.iter().any(|g| g.contains("swift"))) + .expect("swift language spec"); + let desugarer = lang.desugarer.as_ref(); + let adapted = languages::swift_adapter::json_to_ast(IMPORT_FOUNDATION_JSON) + .expect("adapter should succeed"); + + let desugared = desugarer + .run_from_ast(adapted.ast) + .expect("desugaring an import should not error"); + + let name_expr_ids: Vec = desugared + .reachable_node_ids() + .into_iter() + .filter(|&id| { + desugared + .get_node(id) + .is_some_and(|node| node.kind_name() == "name_expr") + }) + .collect(); + assert_eq!( + name_expr_ids.len(), + 1, + "expected exactly one reachable name_expr" + ); + + let name_expr = desugared.get_node(name_expr_ids[0]).unwrap(); + assert_eq!(name_expr.start_byte(), 7); + assert_eq!(name_expr.end_byte(), 17); +} From daacaa6d8fbedb893192767738d56f83173193e3 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Wed, 2 Sep 2026 15:04:05 +0200 Subject: [PATCH 0767/2098] C#: DependabotProxy now parses replaces-base and exposes a list of URLs to replace the default NuGet feed. --- .../DependabotProxy.cs | 37 ++++++++++++++++--- .../FeedManager.cs | 2 +- .../IDependabotProxy.cs | 9 ++++- .../DependabotProxy.cs | 31 +++++++++++++++- .../Semmle.Extraction.Tests/FeedManager.cs | 4 +- 5 files changed, 73 insertions(+), 10 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs index 3bf843d3fa2c..c4afcc9792bc 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Immutable; using System.Collections.Generic; using System.IO; using System.Security.Cryptography.X509Certificates; @@ -14,13 +15,39 @@ public class DependabotProxy : IDependabotProxy /// /// Represents configurations for package registries. /// - /// The type of package registry. - /// The URL of the package registry. - public record class RegistryConfig(string Type, string URL); + public class RegistryConfig + { + /// + /// The type of the package registry. + /// + public string Type { get; init; } = ""; + + /// + /// The URL of the package registry. + /// + public string URL { get; init; } = ""; + + /// + /// A boolean indicating whether this registry replaces the base registry. + /// + [JsonProperty("replaces-base")] + public bool ReplacesBase { get; init; } = false; + }; public string Address { get; } - public HashSet RegistryURLs { get; } = []; + /// + /// A dictionary mapping registry URLs to a boolean indicating whether they replace the base registry. + /// + private readonly Dictionary registryMapping = []; + + private ImmutableHashSet? registryURLs; + public ImmutableHashSet RegistryURLs => + registryURLs ??= registryMapping.Keys.ToImmutableHashSet(); + + private ImmutableHashSet? registryBaseURLs; + public ImmutableHashSet RegistryBaseURLs => + registryBaseURLs ??= registryMapping.Where(kvp => kvp.Value).Select(kvp => kvp.Key).ToImmutableHashSet(); public string? CertificatePath { get; private set; } @@ -65,7 +92,7 @@ private DependabotProxy(IDependabotProxyConfiguration config, ILogger logger, Te } logger.LogInfo($"Found private registry at '{registry.URL}'"); - RegistryURLs.Add(registry.URL); + registryMapping.AddOrUpdateToLatest(registry.URL, registry.ReplacesBase); } } } diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs index 6c4593f3400c..f286f3a3652f 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs @@ -78,7 +78,7 @@ public FeedManager(ILogger logger, IDotNet dotnet, IDependabotProxy? dependabotP this.dotnet = dotnet; this.fileProvider = fileProvider; this.feedManagerIo = feedManagerIo; - privateRegistryFeeds = dependabotProxy?.RegistryURLs.ToImmutableHashSet() ?? []; + privateRegistryFeeds = dependabotProxy?.RegistryURLs ?? []; HasPrivateRegistryFeeds = privateRegistryFeeds.Count > 0; emptyPackageDirectory = new DependencyDirectory("empty", "empty package", logger); diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDependabotProxy.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDependabotProxy.cs index 37a11900fddf..aafaf851e356 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDependabotProxy.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDependabotProxy.cs @@ -1,5 +1,5 @@ using System; -using System.Collections.Generic; +using System.Collections.Immutable; using System.Security.Cryptography.X509Certificates; namespace Semmle.Extraction.CSharp.DependencyFetching @@ -14,7 +14,12 @@ public interface IDependabotProxy : IDisposable /// /// The URLs of package registries that are configured for the proxy. /// - HashSet RegistryURLs { get; } + ImmutableHashSet RegistryURLs { get; } + + /// + /// The URLs of package registries that replace the base registry. + /// + ImmutableHashSet RegistryBaseURLs { get; } /// /// The path to the temporary file where the certificate is stored. diff --git a/csharp/extractor/Semmle.Extraction.Tests/DependabotProxy.cs b/csharp/extractor/Semmle.Extraction.Tests/DependabotProxy.cs index 9c8c762f5989..83d899c50912 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/DependabotProxy.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/DependabotProxy.cs @@ -135,7 +135,8 @@ public void TestDependabotRegistryUrls1() // Verify Assert.NotNull(proxy); - Assert.Equal([], proxy.RegistryURLs); + Assert.Empty(proxy.RegistryURLs); + Assert.Empty(proxy.RegistryBaseURLs); } [Fact] @@ -158,6 +159,7 @@ public void TestDependabotRegistryUrls2() Assert.Equal([ "https://nuget.pkg.github.com/org/index.json" ], proxy.RegistryURLs); + Assert.Empty(proxy.RegistryBaseURLs); } [Fact] @@ -180,6 +182,33 @@ public void TestDependabotRegistryUrls3() Assert.Equal([ "https://example.com/org/index.json" ], proxy.RegistryURLs); + Assert.Empty(proxy.RegistryBaseURLs); + } + + [Fact] + public void TestDependabotReplacesBase1() + { + // Setup + var config = new DependabotConfigurationStub + { + Port = "8080", + Host = "localhost", + RegistryURLs = "[ { \"type\": \"nuget_feed\", \"url\": \"https://example.com/org/index.json\", \"replaces-base\": true }, { \"type\": \"nuget_feed\", \"url\": \"https://example2.com/org/index.json\", \"replaces-base\": false } ]" + }; + + // Execute + using var tempWorkingDirectory = MakeTemporaryDirectory(); + using var proxy = DependabotProxy.Make(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); + + // Verify + Assert.NotNull(proxy); + Assert.Equal([ + "https://example.com/org/index.json", + "https://example2.com/org/index.json" + ], proxy.RegistryURLs); + Assert.Equal([ + "https://example.com/org/index.json", + ], proxy.RegistryBaseURLs); } } } diff --git a/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs b/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs index f70efdb4cdcc..c6eb024d16b2 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs @@ -4,13 +4,15 @@ using System.IO; using System.Linq; using Semmle.Extraction.CSharp.DependencyFetching; +using System.Collections.Immutable; namespace Semmle.Extraction.Tests { public class DependabotProxyStub : IDependabotProxy { public string Address { get; } = ""; - public HashSet RegistryURLs { get; } = ["https://example.com/registry1", "https://example.com/registry2"]; + public ImmutableHashSet RegistryURLs { get; } = ["https://example.com/registry1", "https://example.com/registry2"]; + public ImmutableHashSet RegistryBaseURLs { get; } = []; public string? CertificatePath { get; } = null; public System.Security.Cryptography.X509Certificates.X509Certificate2? Certificate { get; } = null; From ee9fe7537de7b3201e09e6f0922e92e8ea4ad6dc Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Wed, 2 Sep 2026 15:58:39 +0200 Subject: [PATCH 0768/2098] C#: Use the RegistryUrls from the dependabot proxy as default feeds is replaces-base is set, otherwise use nuget.org. --- .../EnvironmentVariableNames.cs | 1 - .../FeedManager.cs | 32 +++++------ .../PackagesConfigRestorer.cs | 14 ++--- .../Semmle.Extraction.Tests/FeedManager.cs | 56 ++++++++++++++++++- 4 files changed, 73 insertions(+), 30 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/EnvironmentVariableNames.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/EnvironmentVariableNames.cs index b1134ad21e24..94a87037cdbc 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/EnvironmentVariableNames.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/EnvironmentVariableNames.cs @@ -56,7 +56,6 @@ internal static class EnvironmentVariableNames /// /// Specifies the NuGet feeds to use for fallback NuGet dependency fetching. The value is a space-separated list of feed URLs. - /// The default value is `https://api.nuget.org/v3/index.json`. /// public const string FallbackNugetFeeds = "CODEQL_EXTRACTOR_CSHARP_BUILDLESS_NUGET_FEEDS_FALLBACK"; diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs index f286f3a3652f..217a0ec11718 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs @@ -17,6 +17,7 @@ internal sealed partial class FeedManager : IDisposable private readonly IFileProvider fileProvider; private readonly DependencyDirectory emptyPackageDirectory; private readonly ImmutableHashSet privateRegistryFeeds; + private readonly ImmutableHashSet defaultFeeds; private readonly IFeedManagerIO feedManagerIo; /// @@ -72,6 +73,13 @@ internal sealed partial class FeedManager : IDisposable /// public ImmutableHashSet ReachableFallbackFeeds => lazyReachableFallbackFeeds.Value; + private readonly Lazy> lazyReachableDefaultFeeds; + + /// + /// Gets the list of reachable default NuGet feeds. + /// + public ImmutableHashSet ReachableDefaultFeeds => lazyReachableDefaultFeeds.Value; + public FeedManager(ILogger logger, IDotNet dotnet, IDependabotProxy? dependabotProxy, IFileProvider fileProvider, IFeedManagerIO feedManagerIo) { this.logger = logger; @@ -80,6 +88,9 @@ public FeedManager(ILogger logger, IDotNet dotnet, IDependabotProxy? dependabotP this.feedManagerIo = feedManagerIo; privateRegistryFeeds = dependabotProxy?.RegistryURLs ?? []; HasPrivateRegistryFeeds = privateRegistryFeeds.Count > 0; + defaultFeeds = dependabotProxy?.RegistryBaseURLs.Any() == true + ? dependabotProxy.RegistryBaseURLs + : [PublicNugetOrgFeed]; emptyPackageDirectory = new DependencyDirectory("empty", "empty package", logger); lazyExplicitFeeds = new Lazy>(GetExplicitFeeds); @@ -96,6 +107,7 @@ public FeedManager(ILogger logger, IDotNet dotnet, IDependabotProxy? dependabotP var reachableFallbackFeeds = GetReachableFallbackNugetFeeds(); return reachableFallbackFeeds.ToImmutableHashSet(); }); + lazyReachableDefaultFeeds = new Lazy>(() => CheckSpecifiedFeeds(defaultFeeds)); } public FeedManager(ILogger logger, IDotNet dotnet, IDependabotProxy? dependabotProxy, IFileProvider fileProvider) @@ -266,22 +278,6 @@ private ImmutableHashSet CheckSpecifiedFeeds(ImmutableHashSet fe return reachable.Union(feeds.Where(feed => excludedFeeds.Contains(feed))).ToImmutableHashSet(); } - /// - /// Return true if the default NuGet feed is reachable, false otherwise. - /// If the reachability check is disabled, this method will always return true. - /// - /// True if the default NuGet feed is reachable, false otherwise. - public bool IsDefaultFeedReachable() - { - if (CheckNugetFeedResponsiveness) - { - var (initialTimeout, tryCount) = GetFeedRequestSettings(isFallback: false); - return feedManagerIo.IsFeedReachable(PublicNugetOrgFeed, initialTimeout, tryCount); - } - - return true; - } - /// /// Tests which of the feeds given by are reachable. /// @@ -315,8 +311,8 @@ private List GetReachableFallbackNugetFeeds() var fallbackFeeds = EnvironmentVariables.GetURLs(EnvironmentVariableNames.FallbackNugetFeeds).ToHashSet(); if (fallbackFeeds.Count == 0) { - fallbackFeeds.Add(PublicNugetOrgFeed); - logger.LogInfo($"No fallback NuGet feeds specified. Adding default feed: {PublicNugetOrgFeed}"); + fallbackFeeds.UnionWith(defaultFeeds); + logger.LogInfo($"No fallback NuGet feeds specified. Adding default feeds: {string.Join(", ", defaultFeeds.OrderBy(f => f))}"); var shouldAddNugetConfigFeeds = EnvironmentVariables.GetBooleanOptOut(EnvironmentVariableNames.AddNugetConfigFeedsToFallback); logger.LogInfo($"Adding feeds from nuget.config to fallback restore: {shouldAddNugetConfigFeeds}"); diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/PackagesConfigRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/PackagesConfigRestorer.cs index d4403bb955ef..964a24441387 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/PackagesConfigRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/PackagesConfigRestorer.cs @@ -67,10 +67,6 @@ private class NugetExeWrapper : IPackagesConfigRestore private bool IsWindows => SystemBuildActions.Instance.IsWindows(); - private bool? isDefaultFeedReachable; - private bool IsDefaultFeedReachable => - isDefaultFeedReachable ??= feedManager.IsDefaultFeedReachable(); - /// /// Create the package manager for a specified source tree. /// @@ -169,15 +165,15 @@ private bool TryRestoreNugetPackage(string packagesConfig) List sourcesArgument = []; var feedsToUse = feedManager.FeedsToUse(packagesConfig).ToList(); - var useDefaultFeed = feedsToUse.Count == 0 && IsDefaultFeedReachable; + var useDefaultFeeds = feedsToUse.Count == 0 && feedManager.ReachableDefaultFeeds.Count > 0; // Explicitly construct the sources to be used for the restore command when checking feed - // responsiveness, using private registries, or falling back to nuget.org. - if (feedManager.CheckNugetFeedResponsiveness || feedManager.HasPrivateRegistryFeeds || useDefaultFeed) + // responsiveness, using private registries, or falling back to default feeds. + if (feedManager.CheckNugetFeedResponsiveness || feedManager.HasPrivateRegistryFeeds || useDefaultFeeds) { - if (useDefaultFeed) + if (useDefaultFeeds) { - feedsToUse.Add(FeedManager.PublicNugetOrgFeed); + feedsToUse.AddRange(feedManager.ReachableDefaultFeeds); } var restoreFeeds = feedManager.RestoreFeeds(feedsToUse); sourcesArgument = restoreFeeds.SelectMany(feed => ["-Source", feed]).ToList(); diff --git a/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs b/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs index c6eb024d16b2..0a66b4766c1f 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs @@ -1,10 +1,11 @@ using Xunit; using System; using System.Collections.Generic; +using System.Collections.Immutable; using System.IO; using System.Linq; +using System.Security.Cryptography.X509Certificates; using Semmle.Extraction.CSharp.DependencyFetching; -using System.Collections.Immutable; namespace Semmle.Extraction.Tests { @@ -14,7 +15,18 @@ public class DependabotProxyStub : IDependabotProxy public ImmutableHashSet RegistryURLs { get; } = ["https://example.com/registry1", "https://example.com/registry2"]; public ImmutableHashSet RegistryBaseURLs { get; } = []; public string? CertificatePath { get; } = null; - public System.Security.Cryptography.X509Certificates.X509Certificate2? Certificate { get; } = null; + public X509Certificate2? Certificate { get; } = null; + + public void Dispose() { } + } + + public class DependabotProxyStubWithBaseUrls : IDependabotProxy + { + public string Address { get; } = ""; + public ImmutableHashSet RegistryURLs { get; } = ["https://example.com/registry1", "https://example.com/registry2", "https://example.com/base1", "https://example.com/base2"]; + public ImmutableHashSet RegistryBaseURLs { get; } = ["https://example.com/base1", "https://example.com/base2"]; + public string? CertificatePath { get; } = null; + public X509Certificate2? Certificate { get; } = null; public void Dispose() { } } @@ -185,5 +197,45 @@ public void TestFeedsToUse() "https://feed.from/folder1" ], feedsToUse); } + + [Fact] + public void TestDefaultFeeds1() + { + // Setup + var feedManager = MakeFeedManager(); + + // Execute + var reachableDefault = feedManager.ReachableDefaultFeeds; + + // Verify + Assert.Equal([ + "https://api.nuget.org/v3/index.json" + ], reachableDefault); + } + + [Fact] + public void TestDefaultFeeds2() + { + // Setup + var logger = new LoggerStub(); + var dotnet = new DotNetStub([], [], [], []); + var dependabotProxy = new DependabotProxyStubWithBaseUrls(); + var fileProvider = new FileProviderStub(); + var feedManagerIo = new FeedManagerIOStub(["https://example.com/registry2", "https://example.com/base1"]); + var feedManager = new FeedManager(logger, dotnet, dependabotProxy, fileProvider, feedManagerIo); + + // Execute + var reachableDefault = feedManager.ReachableDefaultFeeds; + var reachableFallback = feedManager.ReachableFallbackFeeds; + + // Verify + Assert.Equal([ + "https://example.com/base2" + ], reachableDefault); + Assert.Equal([ + "https://example.com/registry1", + "https://example.com/base2" + ], reachableFallback); + } } } From dcaf038051d5b8ccaa4ffa93fc5989ea1a72872e Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 3 Sep 2026 15:58:18 +0200 Subject: [PATCH 0769/2098] C#: Add change-note. --- csharp/ql/lib/change-notes/2026-09-03-replaces-base.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 csharp/ql/lib/change-notes/2026-09-03-replaces-base.md diff --git a/csharp/ql/lib/change-notes/2026-09-03-replaces-base.md b/csharp/ql/lib/change-notes/2026-09-03-replaces-base.md new file mode 100644 index 000000000000..bd16b0e21711 --- /dev/null +++ b/csharp/ql/lib/change-notes/2026-09-03-replaces-base.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* In `build-mode: none`, private NuGet registries configured with `replaces-base: true` in the organization-level private registry configuration now replace `nuget.org` sources whenever dependencies are downloaded, including sources discovered from NuGet configuration. From 1f93077d70cf62d0e308d72f20d50409bb647597 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Fri, 4 Sep 2026 11:01:10 +0200 Subject: [PATCH 0770/2098] C#: Preserve semantics of reachability for default feeds when using [mono] nuget. --- .../FeedManager.cs | 15 ++++++++++----- .../PackagesConfigRestorer.cs | 7 +++++-- .../Semmle.Extraction.Tests/FeedManager.cs | 9 +++++++++ 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs index 217a0ec11718..9a184c945578 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs @@ -17,7 +17,6 @@ internal sealed partial class FeedManager : IDisposable private readonly IFileProvider fileProvider; private readonly DependencyDirectory emptyPackageDirectory; private readonly ImmutableHashSet privateRegistryFeeds; - private readonly ImmutableHashSet defaultFeeds; private readonly IFeedManagerIO feedManagerIo; /// @@ -75,6 +74,12 @@ internal sealed partial class FeedManager : IDisposable private readonly Lazy> lazyReachableDefaultFeeds; + /// + /// Gets the list of default NuGet feeds that are configured in the environment. + /// This is either the public NuGet feed or a set of feeds specified by the environment. + /// + public ImmutableHashSet DefaultFeeds { get; init; } + /// /// Gets the list of reachable default NuGet feeds. /// @@ -88,7 +93,7 @@ public FeedManager(ILogger logger, IDotNet dotnet, IDependabotProxy? dependabotP this.feedManagerIo = feedManagerIo; privateRegistryFeeds = dependabotProxy?.RegistryURLs ?? []; HasPrivateRegistryFeeds = privateRegistryFeeds.Count > 0; - defaultFeeds = dependabotProxy?.RegistryBaseURLs.Any() == true + DefaultFeeds = dependabotProxy?.RegistryBaseURLs.Any() == true ? dependabotProxy.RegistryBaseURLs : [PublicNugetOrgFeed]; emptyPackageDirectory = new DependencyDirectory("empty", "empty package", logger); @@ -107,7 +112,7 @@ public FeedManager(ILogger logger, IDotNet dotnet, IDependabotProxy? dependabotP var reachableFallbackFeeds = GetReachableFallbackNugetFeeds(); return reachableFallbackFeeds.ToImmutableHashSet(); }); - lazyReachableDefaultFeeds = new Lazy>(() => CheckSpecifiedFeeds(defaultFeeds)); + lazyReachableDefaultFeeds = new Lazy>(() => CheckSpecifiedFeeds(DefaultFeeds)); } public FeedManager(ILogger logger, IDotNet dotnet, IDependabotProxy? dependabotProxy, IFileProvider fileProvider) @@ -311,8 +316,8 @@ private List GetReachableFallbackNugetFeeds() var fallbackFeeds = EnvironmentVariables.GetURLs(EnvironmentVariableNames.FallbackNugetFeeds).ToHashSet(); if (fallbackFeeds.Count == 0) { - fallbackFeeds.UnionWith(defaultFeeds); - logger.LogInfo($"No fallback NuGet feeds specified. Adding default feeds: {string.Join(", ", defaultFeeds.OrderBy(f => f))}"); + fallbackFeeds.UnionWith(DefaultFeeds); + logger.LogInfo($"No fallback NuGet feeds specified. Adding default feeds: {string.Join(", ", DefaultFeeds.OrderBy(f => f))}"); var shouldAddNugetConfigFeeds = EnvironmentVariables.GetBooleanOptOut(EnvironmentVariableNames.AddNugetConfigFeedsToFallback); logger.LogInfo($"Adding feeds from nuget.config to fallback restore: {shouldAddNugetConfigFeeds}"); diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/PackagesConfigRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/PackagesConfigRestorer.cs index 964a24441387..861622ca4c02 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/PackagesConfigRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/PackagesConfigRestorer.cs @@ -165,7 +165,10 @@ private bool TryRestoreNugetPackage(string packagesConfig) List sourcesArgument = []; var feedsToUse = feedManager.FeedsToUse(packagesConfig).ToList(); - var useDefaultFeeds = feedsToUse.Count == 0 && feedManager.ReachableDefaultFeeds.Count > 0; + var defaultFeeds = feedManager.CheckNugetFeedResponsiveness + ? feedManager.ReachableDefaultFeeds + : feedManager.DefaultFeeds; + var useDefaultFeeds = feedsToUse.Count == 0 && defaultFeeds.Count > 0; // Explicitly construct the sources to be used for the restore command when checking feed // responsiveness, using private registries, or falling back to default feeds. @@ -173,7 +176,7 @@ private bool TryRestoreNugetPackage(string packagesConfig) { if (useDefaultFeeds) { - feedsToUse.AddRange(feedManager.ReachableDefaultFeeds); + feedsToUse.AddRange(defaultFeeds); } var restoreFeeds = feedManager.RestoreFeeds(feedsToUse); sourcesArgument = restoreFeeds.SelectMany(feed => ["-Source", feed]).ToList(); diff --git a/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs b/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs index 0a66b4766c1f..37aca8003e71 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs @@ -205,9 +205,13 @@ public void TestDefaultFeeds1() var feedManager = MakeFeedManager(); // Execute + var defaultFeeds = feedManager.DefaultFeeds; var reachableDefault = feedManager.ReachableDefaultFeeds; // Verify + Assert.Equal([ + "https://api.nuget.org/v3/index.json" + ], defaultFeeds); Assert.Equal([ "https://api.nuget.org/v3/index.json" ], reachableDefault); @@ -225,10 +229,15 @@ public void TestDefaultFeeds2() var feedManager = new FeedManager(logger, dotnet, dependabotProxy, fileProvider, feedManagerIo); // Execute + var defaultFeeds = feedManager.DefaultFeeds; var reachableDefault = feedManager.ReachableDefaultFeeds; var reachableFallback = feedManager.ReachableFallbackFeeds; // Verify + Assert.Equal([ + "https://example.com/base1", + "https://example.com/base2" + ], defaultFeeds); Assert.Equal([ "https://example.com/base2" ], reachableDefault); From 02f1792b6d4cff4601661d9313ec7b54bdadf0c5 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Fri, 4 Sep 2026 12:28:48 +0200 Subject: [PATCH 0771/2098] C#: Remove isNullOrEmpty check as it is implied by the case above. --- .../FeedManager.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs index 9a184c945578..c37d9e57a349 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs @@ -141,10 +141,7 @@ private IEnumerable GetFeeds(Func> getNugetFeeds) continue; } - if (!string.IsNullOrWhiteSpace(url)) - { - yield return url; - } + yield return url; } } From b30141c1bb6da50c221f2db9ddd2008392d1af78 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Fri, 4 Sep 2026 13:04:13 +0200 Subject: [PATCH 0772/2098] C#: Make a complete replacement of the default nuget.org feed in case private registries with replaces-base: true is set. --- .../FeedManager.cs | 40 +++++++++++-- .../Semmle.Extraction.Tests/FeedManager.cs | 57 +++++++++++++++++++ 2 files changed, 93 insertions(+), 4 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs index c37d9e57a349..3d323d3976e9 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs @@ -10,13 +10,17 @@ namespace Semmle.Extraction.CSharp.DependencyFetching { internal sealed partial class FeedManager : IDisposable { - internal const string PublicNugetOrgFeed = "https://api.nuget.org/v3/index.json"; + private const string PublicNugetOrg = "nuget.org"; + private const string PublicDotNugetOrg = $".{PublicNugetOrg}"; + internal const string PublicApiNugetOrgFeed = $"https://api{PublicDotNugetOrg}/v3/index.json"; private readonly ILogger logger; private readonly IDotNet dotnet; private readonly IFileProvider fileProvider; private readonly DependencyDirectory emptyPackageDirectory; private readonly ImmutableHashSet privateRegistryFeeds; + private readonly bool hasPrivateRegistryBaseFeeds; + private readonly ImmutableHashSet privateRegistryBaseFeeds; private readonly IFeedManagerIO feedManagerIo; /// @@ -93,9 +97,12 @@ public FeedManager(ILogger logger, IDotNet dotnet, IDependabotProxy? dependabotP this.feedManagerIo = feedManagerIo; privateRegistryFeeds = dependabotProxy?.RegistryURLs ?? []; HasPrivateRegistryFeeds = privateRegistryFeeds.Count > 0; - DefaultFeeds = dependabotProxy?.RegistryBaseURLs.Any() == true - ? dependabotProxy.RegistryBaseURLs - : [PublicNugetOrgFeed]; + privateRegistryBaseFeeds = dependabotProxy?.RegistryBaseURLs ?? []; + hasPrivateRegistryBaseFeeds = privateRegistryBaseFeeds.Count > 0; + + DefaultFeeds = hasPrivateRegistryBaseFeeds + ? privateRegistryBaseFeeds + : [PublicApiNugetOrgFeed]; emptyPackageDirectory = new DependencyDirectory("empty", "empty package", logger); lazyExplicitFeeds = new Lazy>(GetExplicitFeeds); @@ -120,6 +127,20 @@ public FeedManager(ILogger logger, IDotNet dotnet, IDependabotProxy? dependabotP { } + private bool IsNugetOrgFeed(string url) + { + try + { + var uri = new Uri(url); + return uri.Host.EndsWith(PublicDotNugetOrg, StringComparison.InvariantCultureIgnoreCase) || + string.Equals(uri.Host, PublicNugetOrg, StringComparison.InvariantCultureIgnoreCase); + } + catch (UriFormatException) + { + return false; + } + } + private IEnumerable GetFeeds(Func> getNugetFeeds) { var results = getNugetFeeds(); @@ -141,6 +162,17 @@ private IEnumerable GetFeeds(Func> getNugetFeeds) continue; } + if (hasPrivateRegistryBaseFeeds && IsNugetOrgFeed(url)) + { + // Use private registry base feeds. + foreach (var feed in privateRegistryBaseFeeds) + { + logger.LogDebug($"Using private registry base feed '{feed}'."); + yield return feed; + } + continue; + } + yield return url; } } diff --git a/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs b/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs index 37aca8003e71..13d96e77cbfa 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs @@ -246,5 +246,62 @@ public void TestDefaultFeeds2() "https://example.com/base2" ], reachableFallback); } + + [Fact] + public void TestNugetOrg() + { + // Setup + var logger = new LoggerStub(); + var dotnet = new DotNetStub([], [], [], ["E https://api.nuget.org/v3/index.json"]); + var dependabotProxy = new DependabotProxyStub(); + var fileProvider = new FileProviderStub(); + var feedManagerIo = new FeedManagerIOStub(["https://example.com/registry2", "https://example.com/base1"]); + var feedManager = new FeedManager(logger, dotnet, dependabotProxy, fileProvider, feedManagerIo); + + // Execute + var explicitFeeds = feedManager.ExplicitFeeds; + var allFeeds = feedManager.AllFeeds; + + // Verify + Assert.Equal([ + "https://example.com/registry1", + "https://example.com/registry2", + ], explicitFeeds); + Assert.Equal([ + "https://example.com/registry1", + "https://example.com/registry2", + "https://api.nuget.org/v3/index.json" + ], allFeeds); + + } + [Fact] + public void TestNugetOrgReplacement() + { + // Setup + var logger = new LoggerStub(); + var dotnet = new DotNetStub([], [], ["E https://api.nuget.org/v3/index.json"], ["E https://api.nuget.org/v3/index.json"]); + var dependabotProxy = new DependabotProxyStubWithBaseUrls(); + var fileProvider = new FileProviderStub(); + var feedManagerIo = new FeedManagerIOStub(["https://example.com/registry2", "https://example.com/base1"]); + var feedManager = new FeedManager(logger, dotnet, dependabotProxy, fileProvider, feedManagerIo); + + // Execute + var explicitFeeds = feedManager.ExplicitFeeds; + var allFeeds = feedManager.AllFeeds; + + // Verify + Assert.Equal([ + "https://example.com/base1", + "https://example.com/base2", + "https://example.com/registry1", + "https://example.com/registry2" + ], explicitFeeds); + Assert.Equal([ + "https://example.com/base1", + "https://example.com/base2", + "https://example.com/registry1", + "https://example.com/registry2", + ], allFeeds); + } } } From 28503f683e2ea10bd82fe419580a43f265d3d537 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Fri, 4 Sep 2026 14:40:20 +0200 Subject: [PATCH 0773/2098] C#: Exclude TryRestoreManually fallback without nugetSources when private registries are configured (to make implementation consistent). --- .../NugetPackageRestorer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs index 85d6056d7218..f62105f2b482 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs @@ -460,7 +460,7 @@ private bool TryRestorePackageManually(string package, List nugetSources return true; } - if (!feedManager.CheckNugetFeedResponsiveness && res.HasNugetPackageSourceError && nugetSources.Count > 0) + if (!feedManager.CheckNugetFeedResponsiveness && !feedManager.HasPrivateRegistryFeeds && res.HasNugetPackageSourceError && nugetSources.Count > 0) { logger.LogDebug($"Trying to restore '{package}' without explicitly providing NuGet sources."); // Restore could not be completed because the listed source is unavailable. Try without an explicit restore source argument. From 4e2e1ae76ddab0748893d399ca7a0fe529edbc05 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Fri, 4 Sep 2026 15:09:38 +0200 Subject: [PATCH 0774/2098] C#: Minor improvements to unit test. --- csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs b/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs index 13d96e77cbfa..d1b963965abd 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs @@ -279,7 +279,7 @@ public void TestNugetOrgReplacement() { // Setup var logger = new LoggerStub(); - var dotnet = new DotNetStub([], [], ["E https://api.nuget.org/v3/index.json"], ["E https://api.nuget.org/v3/index.json"]); + var dotnet = new DotNetStub([], [], ["E https://www.nuget.org/api/v2/"], ["E https://api.nuget.org/v3/index.json"]); var dependabotProxy = new DependabotProxyStubWithBaseUrls(); var fileProvider = new FileProviderStub(); var feedManagerIo = new FeedManagerIOStub(["https://example.com/registry2", "https://example.com/base1"]); From b2e83bb7807d568c7ca88ba1f94935fab11eeaa3 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Tue, 8 Sep 2026 13:14:54 +0200 Subject: [PATCH 0775/2098] C#: Address review comments. --- .../DependabotProxy.cs | 30 ++++++++-- .../DependabotProxy.cs | 46 +++++++++++++-- .../Semmle.Extraction.Tests/FeedManager.cs | 59 ++++++++++++++++++- .../change-notes/2026-09-03-replaces-base.md | 2 +- 4 files changed, 122 insertions(+), 15 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs index c4afcc9792bc..da8104458653 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs @@ -20,12 +20,12 @@ public class RegistryConfig /// /// The type of the package registry. /// - public string Type { get; init; } = ""; + public string? Type { get; init; } /// /// The URL of the package registry. /// - public string URL { get; init; } = ""; + public string? Url { get; init; } /// /// A boolean indicating whether this registry replaces the base registry. @@ -42,10 +42,22 @@ public class RegistryConfig private readonly Dictionary registryMapping = []; private ImmutableHashSet? registryURLs; + /// + /// Gets the set of registry URLs that have been configured as part of the organization-level + /// private registry configuration. This includes all registries, regardless of whether they replace + /// the default feeds. + /// public ImmutableHashSet RegistryURLs => registryURLs ??= registryMapping.Keys.ToImmutableHashSet(); private ImmutableHashSet? registryBaseURLs; + /// + /// Gets the set of registry URLs that have been configured as part of the organization-level + /// private registry configuration and that replace the default registry. This is a subset of + /// . + /// If non-empty, the set should be used as a replacement for the default registry during + /// package resolution. + /// public ImmutableHashSet RegistryBaseURLs => registryBaseURLs ??= registryMapping.Where(kvp => kvp.Value).Select(kvp => kvp.Key).ToImmutableHashSet(); @@ -83,16 +95,22 @@ private DependabotProxy(IDependabotProxyConfiguration config, ILogger logger, Te { foreach (RegistryConfig registry in array) { + if (string.IsNullOrWhiteSpace(registry.Url)) + { + logger.LogDebug("Ignoring registry with empty URL."); + continue; + } + // The array contains all configured private registries, not just ones for C#. // We ignore the non-C# ones here. - if (!registry.Type.Equals("nuget_feed")) + if (registry.Type is null || !registry.Type.Equals("nuget_feed")) { - logger.LogDebug($"Ignoring registry at '{registry.URL}' since it is not of type 'nuget_feed'."); + logger.LogDebug($"Ignoring registry at '{registry.Url}' since it is not of type 'nuget_feed'."); continue; } - logger.LogInfo($"Found private registry at '{registry.URL}'"); - registryMapping.AddOrUpdateToLatest(registry.URL, registry.ReplacesBase); + logger.LogInfo($"Found private registry at '{registry.Url}'"); + registryMapping.AddOrUpdateToLatest(registry.Url, registry.ReplacesBase); } } } diff --git a/csharp/extractor/Semmle.Extraction.Tests/DependabotProxy.cs b/csharp/extractor/Semmle.Extraction.Tests/DependabotProxy.cs index 83d899c50912..71c3943fe8fe 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/DependabotProxy.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/DependabotProxy.cs @@ -28,8 +28,12 @@ private static TemporaryDirectory MakeTemporaryDirectory() return new TemporaryDirectory(tmp, "testing", new LoggerStub()); } + /// + /// The purpose of this test is to verify that the registry proxy correctly handles the case where the port is not specified. + /// In this case, the registry proxy should not be created. + /// [Fact] - public void TestDependabotProxyCreation1() + public void TestDependabotProxyNoPort() { // Setup var config = new DependabotConfigurationStub @@ -46,8 +50,12 @@ public void TestDependabotProxyCreation1() Assert.Null(proxy); } + /// + /// The purpose of this test is to verify that the registry proxy correctly handles the case where the host is not specified. + /// In this case, the registry proxy should not be created. + /// [Fact] - public void TestDependabotProxyCreation2() + public void TestDependabotProxyNoHost() { // Setup var config = new DependabotConfigurationStub @@ -96,6 +104,10 @@ public void TestDependabotProxyCreation2() -----END CERTIFICATE----- """; + /// + /// The purpose of this test is to verify that the registry proxy correctly handles the case + /// where the port, host, and certificate are specified. + /// [Fact] public void TestDependabotProxyCertificate() { @@ -118,8 +130,13 @@ public void TestDependabotProxyCertificate() Assert.NotNull(proxy.CertificatePath); } + /// + /// The purpose of this test is to verify that the registry proxy correctly handles the case + /// where the RegistryURLs environment variable is not a valid JSON list. + /// In this case, the registry proxy should be created, but the list of private registries should be empty. + /// [Fact] - public void TestDependabotRegistryUrls1() + public void TestDependabotRegistryUrlsParseError() { // Setup var config = new DependabotConfigurationStub @@ -139,8 +156,13 @@ public void TestDependabotRegistryUrls1() Assert.Empty(proxy.RegistryBaseURLs); } + /// + /// The purpose of this test is to verify that the registry proxy correctly handles the case + /// where the RegistryURLs environment variable is a valid JSON list with a single entry. + /// In this case, the registry proxy should be created, and the list of private registries should contain the single entry. + /// [Fact] - public void TestDependabotRegistryUrls2() + public void TestDependabotRegistryUrlsSingle() { // Setup var config = new DependabotConfigurationStub @@ -162,6 +184,13 @@ public void TestDependabotRegistryUrls2() Assert.Empty(proxy.RegistryBaseURLs); } + /// + /// The purpose of this test is to verify that the registry proxy correctly handles the case + /// where the RegistryURLs environment variable is a valid JSON list with multiple entries, but only one of them + /// is of type "nuget_feed", which is relevant for C#. + /// In this case, the registry proxy should be created, and the list of private registries should + /// contain only the entry of type "nuget_feed". + /// [Fact] public void TestDependabotRegistryUrls3() { @@ -185,8 +214,15 @@ public void TestDependabotRegistryUrls3() Assert.Empty(proxy.RegistryBaseURLs); } + /// + /// The purpose of this test is to verify that the registry proxy correctly handles the case + /// where the RegistryURLs environment variable is a valid JSON list with multiple entries and one of them + /// is configured to replace the base feeds. + /// In this case, the registry proxy should be created, and the list of private registries should contain all + /// entries, while the list of base registries should contain only the entry that replaces the base feeds. + /// [Fact] - public void TestDependabotReplacesBase1() + public void TestDependabotRegistryUrlsReplacesBase() { // Setup var config = new DependabotConfigurationStub diff --git a/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs b/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs index d1b963965abd..425024425332 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs @@ -68,6 +68,11 @@ public class FileProviderStub : IFileProvider public ICollection Resources { get; } = new List(); } + /// + /// The purpose of this test class is to verify the behavior of the FeedManager class. + /// The tests use stub implementations of the FeedManager's dependencies to control the behavior of the FeedManager + /// and verify its behavior. + /// public class FeedManagerTests { private static FeedManager MakeFeedManager() @@ -80,6 +85,10 @@ private static FeedManager MakeFeedManager() return new FeedManager(logger, dotnet, dependabotProxy, fileProvider, feedManagerIo); } + /// + /// The purpose of this test is to verify that the FeedManager correctly computes the set of + /// explicit feeds. + /// [Fact] public void TestExplicitFeeds() { @@ -97,6 +106,10 @@ public void TestExplicitFeeds() ], actualFeeds); } + /// + /// The purpose of this test is to verify that the FeedManager correctly computes the set of + /// inherited feeds. + /// [Fact] public void TestInheritedFeeds() { @@ -113,6 +126,10 @@ public void TestInheritedFeeds() ], inherited); } + /// + /// The purpose of this test is to verify that the FeedManager correctly computes the set of + /// all feeds. + /// [Fact] public void TestAllFeeds() { @@ -132,6 +149,10 @@ public void TestAllFeeds() ], all); } + /// + /// The purpose of this test is to verify that the FeedManager correctly computes the set of + /// reachable feeds. + /// [Fact] public void TestReachableFeeds() { @@ -149,6 +170,10 @@ public void TestReachableFeeds() ], reachableFeeds); } + /// + /// The purpose of this test is to verify that the FeedManager correctly computes the set of + /// reachable explicit feeds. + /// [Fact] public void TestReachableExplicitFeeds() { @@ -165,6 +190,10 @@ public void TestReachableExplicitFeeds() ], reachableFeeds); } + /// + /// The purpose of this test is to verify that the FeedManager correctly computes the set of + /// reachable fallback feeds. + /// [Fact] public void TestReachableFallbackFeeds() { @@ -182,6 +211,10 @@ public void TestReachableFallbackFeeds() ], reachableFallback); } + /// + /// The purpose of this test is to verify that the FeedManager correctly computes the set of + /// feeds to use for a given file. + /// [Fact] public void TestFeedsToUse() { @@ -198,8 +231,12 @@ public void TestFeedsToUse() ], feedsToUse); } + /// + /// The purpose of this test is to verify that the FeedManager correctly computes the set of + /// default feeds and reachable default feeds when no private registries are configured. + /// [Fact] - public void TestDefaultFeeds1() + public void TestDefaultFeedsNugetOrg() { // Setup var feedManager = MakeFeedManager(); @@ -217,8 +254,13 @@ public void TestDefaultFeeds1() ], reachableDefault); } + /// + /// The purpose of this test is to verify that the FeedManager correctly computes the set of + /// default feeds, reachable default feeds, and fallback feeds when private registries + /// are configured and some of them replace the default feeds. + /// [Fact] - public void TestDefaultFeeds2() + public void TestDefaultFeedsPrivateRegistries() { // Setup var logger = new LoggerStub(); @@ -247,8 +289,13 @@ public void TestDefaultFeeds2() ], reachableFallback); } + /// + /// The purpose of this test is to verify that the FeedManager correctly computes the set of + /// all feeds when https://api.nuget.org/v3/index.json is not replaced by any private registries because + /// none of them are configured to replace the base feeds. + /// [Fact] - public void TestNugetOrg() + public void TestNugetOrgNotReplaced() { // Setup var logger = new LoggerStub(); @@ -274,6 +321,12 @@ public void TestNugetOrg() ], allFeeds); } + + /// + /// The purpose of this test is to verify that the FeedManager correctly computes the set of + /// all feeds when https://api.nuget.org/v3/index.json and related NuGet.org URLs are replaced by private + /// registries configured to replace the base feeds. + /// [Fact] public void TestNugetOrgReplacement() { diff --git a/csharp/ql/lib/change-notes/2026-09-03-replaces-base.md b/csharp/ql/lib/change-notes/2026-09-03-replaces-base.md index bd16b0e21711..a2cf9b41be26 100644 --- a/csharp/ql/lib/change-notes/2026-09-03-replaces-base.md +++ b/csharp/ql/lib/change-notes/2026-09-03-replaces-base.md @@ -1,4 +1,4 @@ --- category: minorAnalysis --- -* In `build-mode: none`, private NuGet registries configured with `replaces-base: true` in the organization-level private registry configuration now replace `nuget.org` sources whenever dependencies are downloaded, including sources discovered from NuGet configuration. +* Private NuGet registries for which the "Replaces base" option is enabled in the organization-level private registry configuration now replace `nuget.org` sources whenever dependencies are downloaded, including sources discovered from NuGet configuration. From dadf67da607ed3b33d0e067346431e02f9e07819 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Wed, 9 Sep 2026 14:31:19 +0200 Subject: [PATCH 0776/2098] C#: Address review comments related to logging. --- .../DependabotProxy.cs | 10 ++++++++-- .../FeedManager.cs | 4 ++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs index da8104458653..8229a3da1375 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs @@ -97,13 +97,19 @@ private DependabotProxy(IDependabotProxyConfiguration config, ILogger logger, Te { if (string.IsNullOrWhiteSpace(registry.Url)) { - logger.LogDebug("Ignoring registry with empty URL."); + logger.LogError("Ignoring registry with empty URL."); + continue; + } + + if (string.IsNullOrWhiteSpace(registry.Type)) + { + logger.LogError($"Ignoring registry at '{registry.Url}' since it has no type."); continue; } // The array contains all configured private registries, not just ones for C#. // We ignore the non-C# ones here. - if (registry.Type is null || !registry.Type.Equals("nuget_feed")) + if (!registry.Type.Equals("nuget_feed")) { logger.LogDebug($"Ignoring registry at '{registry.Url}' since it is not of type 'nuget_feed'."); continue; diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs index 3d323d3976e9..6567174ddc0f 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs @@ -359,6 +359,10 @@ private List GetReachableFallbackNugetFeeds() logger.LogInfo($"Using NuGet feeds from nuget.config files as fallback feeds: {string.Join(", ", ExplicitFeeds.OrderBy(f => f))}"); } } + else + { + logger.LogInfo($"Using fallback NuGet feeds from environment variable '{EnvironmentVariableNames.FallbackNugetFeeds}'."); + } return GetReachableNuGetFeeds(fallbackFeeds, isFallback: true); } From 11f7d08d97bf486aaec6939cc8fa750717bb9387 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 9 Sep 2026 12:34:02 +0000 Subject: [PATCH 0777/2098] update codeql documentation --- .../codeql-changelog/codeql-cli-2.27.0.rst | 152 ++++++++++++++++++ .../codeql-changelog/index.rst | 1 + 2 files changed, 153 insertions(+) create mode 100644 docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.27.0.rst diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.27.0.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.27.0.rst new file mode 100644 index 000000000000..43dd62546243 --- /dev/null +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.27.0.rst @@ -0,0 +1,152 @@ +.. _codeql-cli-2.27.0: + +========================== +CodeQL 2.27.0 (2026-09-09) +========================== + +.. contents:: Contents + :depth: 2 + :local: + :backlinks: none + +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. + +Security Coverage +----------------- + +CodeQL 2.27.0 runs a total of 498 security queries when configured with the Default suite (covering 170 CWE). The Extended suite enables an additional 131 queries (covering 32 more CWE). 1 security query has been added with this release. + +CodeQL CLI +---------- + +Deprecations +~~~~~~~~~~~~ + +* Language support for Java 9 and 10 has been deprecated and will be removed in January 2027. Java 7 and 8 will continue to be supported. +* The generic multi-platform :code:`codeql.zip` CLI distribution is deprecated and will be removed in a future release. Download the per-platform + :code:`codeql-PLATFORM.zip` for your platform instead. The CLI now emits a warning when it is run from an all-platforms distribution; set + :code:`CODEQL_ALLOW_ALL_PLATFORMS_DIST=true` to suppress it. + +New Features +~~~~~~~~~~~~ + +* CodeQL now supports native Linux arm64 (:code:`linux-arm64`) as a first-class platform. The per-platform CLI (:code:`codeql-linux-arm64.zip`) and CodeQL bundle + (:code:`codeql-bundle-linux-arm64.tar.gz` and :code:`codeql-bundle-linux-arm64.tar.zst`) + are available as release assets. Arm64 binaries are provided as a per-platform download only, and are not included in the combined :code:`codeql.zip`, + :code:`codeql-bundle.tar.gz`, or :code:`codeql-bundle.tar.zst`. +* CodeQL can now take advantage of an organization's private registry configurations in Code Scanning Default Setup to authenticate to container registries or the GitHub API when trying to fetch custom queries or packs. + This allows custom queries or packs to be accessed from private locations in Code Scanning Default Setup as long as suitable "Git Source" or "Docker Registry" private registry configurations are set up for the organization. + +Query Packs +----------- + +Minor Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +C/C++ +""""" + +* The :code:`cpp/leap-year/unsafe-array-for-days-of-the-year` query ("Unsafe array for days of the year") no longer reports an alert on the :code:`__PRETTY_FUNCTION__` variable (and related variables) when the enclosing function has a signature that is exactly 364 characters. + +C# +"" + +* The :code:`cs/linq/missed-where` query no longer flags :code:`foreach` loops where the matching branch terminates the method, iterator, or loop instead of continuing with filtered loop work. + +JavaScript/TypeScript +""""""""""""""""""""" + +* HTML files are now included in file-coverage stats, and will start showing up on the status page for CodeQL under "Scanned Files". + +Rust +"""" + +* The :code:`rust/hard-coded-cryptographic-value` query has been adjusted to produce fewer results in certain situations where many results were being produced with very similar source locations. +* The :code:`rust/unused-variable` query no longer reports variables in functions containing the standard :code:`todo!()` or :code:`unimplemented!()` macros. + +New Queries +~~~~~~~~~~~ + +Rust +"""" + +* Added a new query, :code:`rust/command-line-injection`, to detect uncontrolled command lines. + +Language Libraries +------------------ + +Bug Fixes +~~~~~~~~~ + +Python +"""""" + +* Fixed a bug where a Python file could be silently dropped from the analysis (with a spurious "A parse error occurred" diagnostic) when it contained a string literal, comment, or identifier with a character such as the U+FE0F emoji variation selector, a U+200D zero width joiner, or a combining accent. +* Fixed the extraction of PEP 758 :code:`except A, B:` clauses by the default (non-tree-sitter) Python parser. Previously the second exception type was extracted as a Python 2 style alias binding, so it was recorded as a :code:`Store` rather than a use. This caused false positives from queries that reason about whether a name is used, such as :code:`py/unused-import`. When extracting Python 2 (:code:`--lang=2`), :code:`except A, e:` continues to bind :code:`e` as an alias, since that is what the syntax means in that version. + +Breaking Changes +~~~~~~~~~~~~~~~~ + +Ruby +"""" + +* The Ruby control flow graph implementation has been completely replaced. This affects a number of queries slightly. The CFG now includes additional nodes to more accurately represent certain constructs. This also means that any existing code that implicitly relies on very specific details about the CFG may need to be updated. The CFG no longer uses splitting, which means that AST nodes now have a unique CFG node representation. In particular, + :code:`ControlFlowNode.getAstNode` has changed its meaning. The AST-to-CFG mapping remains one-to-many, but now for a different reason. It used to be because of splitting, but now it's because of additional "helper" CFG nodes. To get the + (now canonical) CFG node for a given AST node, use + :code:`Stmt.getControlFlowNode()` instead. + +Minor Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +C/C++ +""""" + +* Added the PostgreSQL libpq (asynchronous) query-execution functions :code:`PQexec`, :code:`PQexecParams`, :code:`PQprepare`, :code:`PQsendQuery`, :code:`PQsendQueryParams`, :code:`PQsendPrepare` as :code:`sql-injection` sinks. +* Initializers of compiler-generated variables are now recognized as compiler-generated. A new predicate :code:`isCompilerGenerated` on :code:`Initializer` has been added to reflect this. + +C# +"" + +* In :code:`build-mode: none`, project and solution restoration is now always attempted using the feeds available. +* C# analysis with build mode :code:`none` now lists unreachable explicitly configured NuGet feeds in both the extraction warning and the tool status page note. This makes it easier to identify feeds that may cause dependencies to be missing from the analysis. +* Improved ASP.NET Core MVC controller and action discovery to more closely match runtime behavior, including application parts, endpoint mappings, inherited actions, and controller and action exclusions. Service-injected action parameters are no longer modeled as remote input. + +Java/Kotlin +""""""""""" + +* Added modeling for the Micronaut framework, including HTTP controllers, WebSocket endpoints, configuration injection, data access, security annotations, and HTTP client sinks. + +GitHub Actions +"""""""""""""" + +* Checks on author association fields read from the event payload (e.g. :code:`github.event.pull_request.author_association`) now only count as protection for events whose payload actually populates that field. Previously, a condition such as :code:`github.event.pull_request.author_association != 'NONE'` on a workflow triggered by :code:`issues` events was treated as a protective check even though :code:`github.event.pull_request` is not populated for :code:`issues` events, which makes the condition vacuous. This change may result in more alerts for queries using the :code:`ControlCheck` class. + +Rust +"""" + +* Canonical paths for Rust trait items now use the format :code:`::item` instead of + :code:`crate::Trait::item`. Custom data extension models that reference trait items must be updated to use the new format. + +New Features +~~~~~~~~~~~~ + +C/C++ +""""" + +* Sources and sinks defined using models-as-data now support access paths with fields. For example, the path :code:`ReturnValue.Field[S::f]` makes the field :code:`S::f` a flow source when it is returned by a call. + +C# +"" + +* Added taint modeling for OData action parameter binding (:code:`Microsoft.AspNet.OData`\ /\ :code:`Microsoft.AspNetCore.OData`). Values cast, :code:`as`\ -converted, or type-tested out of :code:`ODataActionParameters`, and entities tracked by :code:`Delta` (via :code:`GetInstance`, :code:`Patch`, :code:`Put`, :code:`CopyChangedValues`, and :code:`CopyUnchangedValues`), now taint the members of the target type. + +Java/Kotlin +""""""""""" + +* Factories returned by the Apache Commons Secure XML (:code:`org.apache.commons.xml.secure`) hardening library's :code:`SecureDocumentBuilderFactory`, :code:`SecureSAXParserFactory`, :code:`SecureXMLInputFactory`, :code:`SecureTransformerFactory` and :code:`SecureSchemaFactory` classes are now recognized as safely configured by the XXE query. +* A new extensible class :code:`SafeXmlFactorySource` was added to :code:`semmle.code.java.security.XmlParsers` for modeling sources of pre-hardened JAXP factories. + +GitHub Actions +"""""""""""""" + +* GitHub Actions databases now extract :code:`actions.lock` files. The new :code:`ActionsLock` class provides access to their YAML abstract syntax trees. diff --git a/docs/codeql/codeql-overview/codeql-changelog/index.rst b/docs/codeql/codeql-overview/codeql-changelog/index.rst index 0267c6ef8ef5..5b85a3b05e44 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/index.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/index.rst @@ -11,6 +11,7 @@ A list of queries for each suite and language `is available here Date: Wed, 9 Sep 2026 14:35:15 +0200 Subject: [PATCH 0778/2098] C#: Rename GetNugetFeeds to GetNugetFeedsFromConfig. --- .../Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs | 2 +- .../Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs | 2 +- .../Semmle.Extraction.CSharp.DependencyFetching/IDotNet.cs | 2 +- csharp/extractor/Semmle.Extraction.Tests/DotNet.cs | 2 +- csharp/extractor/Semmle.Extraction.Tests/DotNetStub.cs | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs index 9958fbce4e71..340d86eb3914 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs @@ -137,7 +137,7 @@ public bool Exec(List execArgs) private static readonly IReadOnlyList nugetListSourceCommandArgs = ["nuget", "list", "source", "--format", "Short"]; - public IList GetNugetFeeds(string nugetConfig) + public IList GetNugetFeedsFromConfig(string nugetConfig) { logger.LogInfo($"Getting NuGet feeds from '{nugetConfig}'..."); return GetResultList([.. nugetListSourceCommandArgs, "--configfile", nugetConfig]); diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs index 6567174ddc0f..aeca9c6b2a13 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs @@ -181,7 +181,7 @@ private IEnumerable GetFeedsFromFolder(string folderPath) => GetFeeds(() => dotnet.GetNugetFeedsFromFolder(folderPath)); private IEnumerable GetFeedsFromNugetConfig(string nugetConfigPath) => - GetFeeds(() => dotnet.GetNugetFeeds(nugetConfigPath)); + GetFeeds(() => dotnet.GetNugetFeedsFromConfig(nugetConfigPath)); /// /// Constructs the NuGet sources argument for the restore command based on the given feeds. diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNet.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNet.cs index 0e93fa92813a..06186f1a28d3 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNet.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNet.cs @@ -13,7 +13,7 @@ public interface IDotNet IList GetListedRuntimes(); IList GetListedSdks(); bool Exec(List execArgs); - IList GetNugetFeeds(string nugetConfig); + IList GetNugetFeedsFromConfig(string nugetConfig); IList GetNugetFeedsFromFolder(string folderPath); } diff --git a/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs b/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs index 77e88a58443a..1d393a418ca9 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs @@ -285,7 +285,7 @@ public void TestNugetFeeds() var dotnet = MakeDotnet(dotnetCliInvoker); // Execute - dotnet.GetNugetFeeds("abc"); + dotnet.GetNugetFeedsFromConfig("abc"); // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); diff --git a/csharp/extractor/Semmle.Extraction.Tests/DotNetStub.cs b/csharp/extractor/Semmle.Extraction.Tests/DotNetStub.cs index 119e39fd0974..12a131380e41 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/DotNetStub.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/DotNetStub.cs @@ -30,7 +30,7 @@ public DotNetStub(IList runtimes, IList sdks, IList nuge public bool Exec(List execArgs) => true; - public IList GetNugetFeeds(string nugetConfig) => nugetFeedsFromConfig; + public IList GetNugetFeedsFromConfig(string nugetConfig) => nugetFeedsFromConfig; public IList GetNugetFeedsFromFolder(string folderPath) => nugetFeedsFromFolder; } From 7eaf822b01a9a81c8683cafbd51884d77bab01ba Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Wed, 9 Sep 2026 16:30:52 +0200 Subject: [PATCH 0779/2098] C#: Improve FeedManager unit test explanations. --- .../Semmle.Extraction.Tests/FeedManager.cs | 62 +++++++++++-------- 1 file changed, 37 insertions(+), 25 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs b/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs index 425024425332..2fdecd570954 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs @@ -86,8 +86,10 @@ private static FeedManager MakeFeedManager() } /// - /// The purpose of this test is to verify that the FeedManager correctly computes the set of - /// explicit feeds. + /// Verify that `FeedManager` correctly computes the explicit feeds using feeds discovered in nuget.config files and + /// private registries. + /// See the initialization of `DotNetStub` and `DependabotProxyStub` in `MakeFeedManager` for the feeds configured + /// to be returned and classified as explicit feeds. /// [Fact] public void TestExplicitFeeds() @@ -107,8 +109,9 @@ public void TestExplicitFeeds() } /// - /// The purpose of this test is to verify that the FeedManager correctly computes the set of - /// inherited feeds. + /// Verify that `FeedManager` correctly computes the inherited feeds using feeds discovered from the environment. + /// See the initialization of `DotNetStub` in `MakeFeedManager` for the feeds configured + /// to be returned and classified as inherited feeds. /// [Fact] public void TestInheritedFeeds() @@ -127,8 +130,10 @@ public void TestInheritedFeeds() } /// - /// The purpose of this test is to verify that the FeedManager correctly computes the set of - /// all feeds. + /// Verify that `FeedManager` correctly computes all feeds using feeds discovered in nuget.config files, private registries, + /// and the environment. + /// See the initialization of `DotNetStub` and `DependabotProxyStub` in `MakeFeedManager` for the feeds configured + /// to be returned and included in all feeds. /// [Fact] public void TestAllFeeds() @@ -150,8 +155,10 @@ public void TestAllFeeds() } /// - /// The purpose of this test is to verify that the FeedManager correctly computes the set of - /// reachable feeds. + /// Verify that `FeedManager` correctly computes the reachable feeds using feeds discovered in + /// nuget.config files, private registries, and the environment. + /// See the initialization of `FeedManagerIOStub` in `MakeFeedManager` for the feeds configured as unreachable + /// and therefore filtered out of the reachable feeds. /// [Fact] public void TestReachableFeeds() @@ -171,8 +178,10 @@ public void TestReachableFeeds() } /// - /// The purpose of this test is to verify that the FeedManager correctly computes the set of - /// reachable explicit feeds. + /// Verify that `FeedManager` correctly computes the reachable explicit feeds using feeds discovered in + /// nuget.config files and private registries. + /// See the initialization of `FeedManagerIOStub` in `MakeFeedManager` for the feeds configured as unreachable + /// and therefore filtered out of the reachable explicit feeds. /// [Fact] public void TestReachableExplicitFeeds() @@ -191,8 +200,10 @@ public void TestReachableExplicitFeeds() } /// - /// The purpose of this test is to verify that the FeedManager correctly computes the set of - /// reachable fallback feeds. + /// Verify that `FeedManager` correctly computes the reachable fallback feeds using feeds discovered in + /// nuget.config files and the default NuGet.org feed. + /// See the initialization of `FeedManagerIOStub` in `MakeFeedManager` for the feeds configured as unreachable + /// and therefore filtered out of the reachable fallback feeds. /// [Fact] public void TestReachableFallbackFeeds() @@ -212,8 +223,10 @@ public void TestReachableFallbackFeeds() } /// - /// The purpose of this test is to verify that the FeedManager correctly computes the set of - /// feeds to use for a given file. + /// Verify that `FeedManager` correctly computes the feeds to use for a given packages.config file from feeds discovered + /// in private registries and the environment. + /// See the initialization of `DotNetStub` in `MakeFeedManager` for the feeds configured + /// to be returned and selected for use. /// [Fact] public void TestFeedsToUse() @@ -232,8 +245,8 @@ public void TestFeedsToUse() } /// - /// The purpose of this test is to verify that the FeedManager correctly computes the set of - /// default feeds and reachable default feeds when no private registries are configured. + /// Verify that `FeedManager` correctly computes the default feeds and reachable default feeds + /// when no private registries are configured. /// [Fact] public void TestDefaultFeedsNugetOrg() @@ -255,9 +268,9 @@ public void TestDefaultFeedsNugetOrg() } /// - /// The purpose of this test is to verify that the FeedManager correctly computes the set of - /// default feeds, reachable default feeds, and fallback feeds when private registries - /// are configured and some of them replace the default feeds. + /// Verify that `FeedManager` correctly computes the default feeds and reachable default feeds + /// when private registries are configured to replace the default feeds. + /// See the initialization of `DependabotProxyStubWithBaseUrls` for the feeds configured to replace the default feeds. /// [Fact] public void TestDefaultFeedsPrivateRegistries() @@ -290,9 +303,8 @@ public void TestDefaultFeedsPrivateRegistries() } /// - /// The purpose of this test is to verify that the FeedManager correctly computes the set of - /// all feeds when https://api.nuget.org/v3/index.json is not replaced by any private registries because - /// none of them are configured to replace the base feeds. + /// Verify that `FeedManager` correctly computes all feeds when https://api.nuget.org/v3/index.json is not replaced + /// by a private registry because no private registry is configured to replace the base feed. /// [Fact] public void TestNugetOrgNotReplaced() @@ -323,9 +335,9 @@ public void TestNugetOrgNotReplaced() } /// - /// The purpose of this test is to verify that the FeedManager correctly computes the set of - /// all feeds when https://api.nuget.org/v3/index.json and related NuGet.org URLs are replaced by private - /// registries configured to replace the base feeds. + /// Verify that `FeedManager` correctly computes the explicit and all feeds when https://api.nuget.org/v3/index.json and + /// related NuGet.org URLs are replaced by private registries configured to replace the base feeds. + /// See the initialization of `DependabotProxyStubWithBaseUrls` for the feeds configured as default replacements. /// [Fact] public void TestNugetOrgReplacement() From 93aa3a305f5cc9af6b9675611993346bfe74ece8 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Wed, 9 Sep 2026 16:39:46 +0200 Subject: [PATCH 0780/2098] C#: Update change note. --- csharp/ql/lib/change-notes/2026-09-03-replaces-base.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csharp/ql/lib/change-notes/2026-09-03-replaces-base.md b/csharp/ql/lib/change-notes/2026-09-03-replaces-base.md index a2cf9b41be26..2a80f4a89eab 100644 --- a/csharp/ql/lib/change-notes/2026-09-03-replaces-base.md +++ b/csharp/ql/lib/change-notes/2026-09-03-replaces-base.md @@ -1,4 +1,4 @@ --- category: minorAnalysis --- -* Private NuGet registries for which the "Replaces base" option is enabled in the organization-level private registry configuration now replace `nuget.org` sources whenever dependencies are downloaded, including sources discovered from NuGet configuration. +* Private NuGet registries for which the "Replaces base" option is enabled in the organization-level private registry configuration now replace default NuGet feeds whenever dependencies are downloaded, including when default NuGet feeds are configured explicitly for a project. From 7fedff2b6c4af61b6abebf55167fe36efcff4872 Mon Sep 17 00:00:00 2001 From: Jeff Martin Date: Thu, 9 Jul 2026 19:17:09 -0500 Subject: [PATCH 0781/2098] actions: stop unpinned-tag flagging $/ self-references A $/ reference (e.g. "uses: $/path/to/action") is a same-repo self-reference that resolves to the commit the workflow is running at. It is inherently pinned, exactly like a "./" local reference, so it must never be reported by actions/unpinned-tag. Adds an isSelfReference(nwo) guard to the query plus a test fixture covering the bare "$/actions/foo" form and the "$/actions/foo@v1" form (the latter is rejected by the $/ rule but writable by a user; the guard suppresses it either way). Part of github/actions-dispatch#755. --- .../ql/src/Security/CWE-829/UnpinnedActionsTag.ql | 7 +++++++ .../2026-07-09-unpinned-tag-self-reference.md | 4 ++++ .../CWE-829/.github/workflows/self_ref_dollar.yml | 15 +++++++++++++++ 3 files changed, 26 insertions(+) create mode 100644 actions/ql/src/change-notes/2026-07-09-unpinned-tag-self-reference.md create mode 100644 actions/ql/test/query-tests/Security/CWE-829/.github/workflows/self_ref_dollar.yml diff --git a/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql b/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql index f98439063712..0385417e7dc2 100644 --- a/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql +++ b/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql @@ -33,6 +33,12 @@ private predicate isPinnedContainer(string version) { bindingset[nwo] private predicate isContainerImage(string nwo) { nwo.regexpMatch("^docker://.+") } +// A `$/` reference is a same-repo self-reference (e.g. `$/path/to/action`), resolved at the +// commit the calling workflow is running. Like `./` local references, it is inherently pinned +// and can never be an unpinned-tag finding, so we never flag it. +bindingset[nwo] +private predicate isSelfReference(string nwo) { nwo.matches("$/%") } + private predicate hasUsesContainerName(Uses uses, string name) { exists(Workflow workflow | uses.getEnclosingWorkflow() = workflow and @@ -55,6 +61,7 @@ where hasUsesContainerName(uses, name) and uses.getVersion() = version and not isTrustedOwner(nwo) and + not isSelfReference(nwo) and not ( if uses instanceof UsesStep and isContainerImage(nwo) then isPinnedContainer(version) diff --git a/actions/ql/src/change-notes/2026-07-09-unpinned-tag-self-reference.md b/actions/ql/src/change-notes/2026-07-09-unpinned-tag-self-reference.md new file mode 100644 index 000000000000..c972741f1e7b --- /dev/null +++ b/actions/ql/src/change-notes/2026-07-09-unpinned-tag-self-reference.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `actions/unpinned-tag` query no longer reports `$/` same-repo self-references (e.g. `uses: $/path/to/action`), which are inherently pinned to the running commit, just like `./` local references. diff --git a/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/self_ref_dollar.yml b/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/self_ref_dollar.yml new file mode 100644 index 000000000000..0c1275d35764 --- /dev/null +++ b/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/self_ref_dollar.yml @@ -0,0 +1,15 @@ +on: + pull_request + +jobs: + build: + name: Build and test + runs-on: ubuntu-latest + steps: + # `$/` is a same-repo self-reference resolved at the running commit. It is inherently + # pinned (like `./` local refs) and must never be reported as an unpinned tag. + - uses: $/actions/foo + # `$/…@ref` is rejected by the `$/` rule, but a user could still write it. It must also + # never be flagged; this case exercises the `not isSelfReference(nwo)` suppression, since + # without it `$/actions/foo@v1` would otherwise be reported as an unpinned tag. + - uses: $/actions/foo@v1 From 180c109c58663694a587070a44c87ceaffd71e0c Mon Sep 17 00:00:00 2001 From: Jeff Martin Date: Thu, 9 Jul 2026 19:17:42 -0500 Subject: [PATCH 0782/2098] actions: scaffold lockfile-aware pinning for unpinned-tag Adds the seam for making actions/unpinned-tag aware of a repository's Actions lockfile (.github/workflows/actions.lock), so that a tag ref bound to a verified commit in the lockfile is not reported as unpinned (Option A from the #755 spike). Introduces the extensible predicate pinnedByLockfileDataModel(workflow_path, nwo, ref) in ConfigExtensions.qll, re-exported through Config.qll, with a data-extension stub in ext/config/pinned_by_lockfile.yml documenting the intended row shape. The query gains a "not pinnedByLockfile(...)" clause keyed on the workflow file's relative path. The predicate is meant to be populated by the CodeQL Actions extractor, which must parse actions.lock at database-creation time using the canonical parser github.com/github/actions-lockfile/go. That extractor work is a separate change and is not implemented here; until it ships the predicate is empty and the new clause is a no-op. A test-scoped data extension exercises the clause end to end. Part of github/actions-dispatch#755. --- .../2026-07-09-pinned-by-lockfile.md | 4 ++++ .../ql/lib/codeql/actions/config/Config.qll | 13 ++++++++++++ .../actions/config/ConfigExtensions.qll | 20 +++++++++++++++++++ .../ql/lib/ext/config/pinned_by_lockfile.yml | 20 +++++++++++++++++++ .../Security/CWE-829/UnpinnedActionsTag.ql | 10 ++++++++++ .../2026-07-09-unpinned-tag-lockfile-aware.md | 4 ++++ actions/ql/test/qlpack.yml | 1 + .../.github/workflows/lockfile_pinned.yml | 17 ++++++++++++++++ .../CWE-829/pinned_by_lockfile.model.yml | 10 ++++++++++ 9 files changed, 99 insertions(+) create mode 100644 actions/ql/lib/change-notes/2026-07-09-pinned-by-lockfile.md create mode 100644 actions/ql/lib/ext/config/pinned_by_lockfile.yml create mode 100644 actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md create mode 100644 actions/ql/test/query-tests/Security/CWE-829/.github/workflows/lockfile_pinned.yml create mode 100644 actions/ql/test/query-tests/Security/CWE-829/pinned_by_lockfile.model.yml diff --git a/actions/ql/lib/change-notes/2026-07-09-pinned-by-lockfile.md b/actions/ql/lib/change-notes/2026-07-09-pinned-by-lockfile.md new file mode 100644 index 000000000000..d9b09e27ab81 --- /dev/null +++ b/actions/ql/lib/change-notes/2026-07-09-pinned-by-lockfile.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added a new extensible predicate `pinnedByLockfileDataModel(workflow_path, nwo, ref)`, which records `uses:` references that are pinned by a repository's Actions lockfile (`.github/workflows/actions.lock`). It is intended to be populated by the CodeQL Actions extractor and is currently unpopulated, so it has no effect until that support ships. diff --git a/actions/ql/lib/codeql/actions/config/Config.qll b/actions/ql/lib/codeql/actions/config/Config.qll index 27e24514c091..952eab11fb02 100644 --- a/actions/ql/lib/codeql/actions/config/Config.qll +++ b/actions/ql/lib/codeql/actions/config/Config.qll @@ -135,6 +135,19 @@ predicate trustedActionsOwnerDataModel(string owner) { Extensions::trustedActionsOwnerDataModel(owner) } +/** + * MaD models for `uses` references pinned by the repository's Actions lockfile + * (`.github/workflows/actions.lock`). Populated by the CodeQL Actions extractor; see + * `pinnedByLockfileDataModel` in `ConfigExtensions.qll`. + * Fields: + * - workflow_path: repo-relative path of the file containing the `uses:` reference + * - nwo: owner and name of the referenced action (e.g. `actions/checkout`) + * - ref: the ref as written in `uses:` (e.g. `v4`) + */ +predicate pinnedByLockfileDataModel(string workflow_path, string nwo, string ref) { + Extensions::pinnedByLockfileDataModel(workflow_path, nwo, ref) +} + /** * MaD models for untrusted git commands * Fields: diff --git a/actions/ql/lib/codeql/actions/config/ConfigExtensions.qll b/actions/ql/lib/codeql/actions/config/ConfigExtensions.qll index 4ee438fc63cb..69a3a6972cea 100644 --- a/actions/ql/lib/codeql/actions/config/ConfigExtensions.qll +++ b/actions/ql/lib/codeql/actions/config/ConfigExtensions.qll @@ -68,6 +68,26 @@ extensible predicate immutableActionsDataModel(string action); */ extensible predicate trustedActionsOwnerDataModel(string owner); +/** + * Holds if the `uses` reference `nwo`@`ref` in the workflow or composite action file at + * `workflow_path` is pinned by an entry in the repository's Actions lockfile + * (`.github/workflows/actions.lock`). + * + * This predicate is intended to be populated by the CodeQL Actions extractor, which parses + * `actions.lock` at database-creation time using the canonical lockfile parser at + * `github.com/github/actions-lockfile/go`. Each lockfile entry binds an `nwo`@`ref` to a + * verified commit SHA, which is exactly the pinning evidence the `actions/unpinned-tag` query + * otherwise lacks. Until the extractor populates this predicate it is empty, so any clause that + * consumes it is a clean no-op and behaviour is unchanged for repositories without a lockfile. + * + * Fields: + * - `workflow_path`: repo-relative path of the file containing the `uses:` reference, + * e.g. `.github/workflows/ci.yml`. + * - `nwo`: owner and name of the referenced action, e.g. `actions/checkout`. + * - `ref`: the ref (tag or branch) as written in `uses:`, e.g. `v4`. + */ +extensible predicate pinnedByLockfileDataModel(string workflow_path, string nwo, string ref); + /** * Holds for git commands that may introduce untrusted data when called on an attacker controlled branch. */ diff --git a/actions/ql/lib/ext/config/pinned_by_lockfile.yml b/actions/ql/lib/ext/config/pinned_by_lockfile.yml new file mode 100644 index 000000000000..d2b3ad2f3977 --- /dev/null +++ b/actions/ql/lib/ext/config/pinned_by_lockfile.yml @@ -0,0 +1,20 @@ +extensions: + - addsTo: + pack: codeql/actions-all + extensible: pinnedByLockfileDataModel + # `pinnedByLockfileDataModel` records `uses:` references that are pinned by the repository's + # Actions lockfile (`.github/workflows/actions.lock`). It is intended to be populated by the + # CodeQL Actions extractor, which parses the lockfile at database-creation time using the + # canonical Go parser at `github.com/github/actions-lockfile/go`. Each row is + # `[workflow_path, nwo, ref]`: + # - workflow_path: repo-relative path of the file containing the `uses:` reference + # - nwo: owner/name of the referenced action (e.g. `actions/checkout`) + # - ref: the ref as written in `uses:` (e.g. `v4`) + # + # Example of the intended shape (commented out; real data is supplied by the extractor): + # - [".github/workflows/ci.yml", "actions/checkout", "v4"] + # + # Until the extractor populates this predicate it stays empty, so the + # `not pinnedByLockfile(...)` clause in `actions/unpinned-tag` is a no-op and behaviour is + # unchanged for repositories without a lockfile. + data: [] diff --git a/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql b/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql index 0385417e7dc2..cc93f509aa95 100644 --- a/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql +++ b/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql @@ -39,6 +39,15 @@ private predicate isContainerImage(string nwo) { nwo.regexpMatch("^docker://.+") bindingset[nwo] private predicate isSelfReference(string nwo) { nwo.matches("$/%") } +// Holds if `uses` (calling action `nwo` at `version`) is pinned by an entry in the repository's +// Actions lockfile (`.github/workflows/actions.lock`). The underlying `pinnedByLockfileDataModel` +// predicate is populated by the CodeQL Actions extractor when it parses the lockfile at +// database-creation time; until then this is a clean no-op and no lockfile-pinned refs are +// suppressed. See `pinnedByLockfileDataModel` in `ConfigExtensions.qll` for the intended shape. +private predicate pinnedByLockfile(UsesStep uses, string nwo, string version) { + pinnedByLockfileDataModel(uses.getLocation().getFile().getRelativePath(), nwo, version) +} + private predicate hasUsesContainerName(Uses uses, string name) { exists(Workflow workflow | uses.getEnclosingWorkflow() = workflow and @@ -62,6 +71,7 @@ where uses.getVersion() = version and not isTrustedOwner(nwo) and not isSelfReference(nwo) and + not exists(UsesStep step | uses = step and pinnedByLockfile(step, nwo, version)) and not ( if uses instanceof UsesStep and isContainerImage(nwo) then isPinnedContainer(version) diff --git a/actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md b/actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md new file mode 100644 index 000000000000..beae154ff21d --- /dev/null +++ b/actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `actions/unpinned-tag` query no longer reports `uses:` references that are recorded as pinned by a repository's Actions lockfile (`.github/workflows/actions.lock`) via the new `pinnedByLockfileDataModel` extensible predicate. This predicate is populated by the CodeQL Actions extractor and has no effect until that support ships. diff --git a/actions/ql/test/qlpack.yml b/actions/ql/test/qlpack.yml index 9c9e714fc67a..807ea41f522e 100644 --- a/actions/ql/test/qlpack.yml +++ b/actions/ql/test/qlpack.yml @@ -11,4 +11,5 @@ extractor: actions tests: . warnOnImplicitThis: true dataExtensions: + - query-tests/Security/CWE-829/*.model.yml - output-clobbering.model.yml diff --git a/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/lockfile_pinned.yml b/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/lockfile_pinned.yml new file mode 100644 index 000000000000..efc5c986a3b9 --- /dev/null +++ b/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/lockfile_pinned.yml @@ -0,0 +1,17 @@ +on: + pull_request + +jobs: + build: + name: Build and test + runs-on: ubuntu-latest + steps: + # `some-owner/pinned-action@v1` is a tag ref that would normally be reported as an unpinned + # tag. The test data extension `pinned_by_lockfile.model.yml` records it as pinned by the + # repository's Actions lockfile, so the `not pinnedByLockfile(...)` clause suppresses it (this + # fixture is expected to produce no findings). This mirrors what the CodeQL Actions extractor + # will do by parsing `.github/workflows/actions.lock`. + # + # Negative control is provided for free by the many other fixtures in this directory whose tag + # refs are NOT recorded in the data extension and therefore remain reported. + - uses: some-owner/pinned-action@v1 diff --git a/actions/ql/test/query-tests/Security/CWE-829/pinned_by_lockfile.model.yml b/actions/ql/test/query-tests/Security/CWE-829/pinned_by_lockfile.model.yml new file mode 100644 index 000000000000..4853fc5a265e --- /dev/null +++ b/actions/ql/test/query-tests/Security/CWE-829/pinned_by_lockfile.model.yml @@ -0,0 +1,10 @@ +extensions: + - addsTo: + pack: codeql/actions-all + extensible: pinnedByLockfileDataModel + # Test data standing in for what the CodeQL Actions extractor will emit from + # `.github/workflows/actions.lock`. Records `some-owner/pinned-action@v1` in + # `lockfile_pinned.yml` as pinned by the lockfile so the `actions/unpinned-tag` + # query suppresses it. + data: + - [".github/workflows/lockfile_pinned.yml", "some-owner/pinned-action", "v1"] From e80ae35b2a2e1116348ea99b96f507b0bb078b55 Mon Sep 17 00:00:00 2001 From: Jeff Martin Date: Thu, 9 Jul 2026 20:52:36 -0500 Subject: [PATCH 0783/2098] actions: add lockfile-to-data-extension generator for unpinned-tag Add a Go tool that parses a repository's Actions lockfile (.github/workflows/actions.lock) with the canonical parser at github.com/github/actions-lockfile/go and emits a CodeQL data extension populating pinnedByLockfileDataModel, the predicate the actions/unpinned-tag query already consumes to suppress lockfile-pinned refs. The generator is transport-agnostic: it produces the same [workflow_path, nwo, ref] rows whether they ship as a model pack applied via --model-packs (as today, mirroring codeql/immutable-actions-list) or later feed an extractor-native relation, so the parsing core is reusable without touching the query. Lockfiles record the resolved ref (e.g. v4.3.1) while workflows usually write a shorter mutable tag (v4). Since the query matches the ref as written, the generator expands every full-semver resolved ref into its major.minor and major-only forms, so uses: owner/action@v4 is recognized as pinned by a v4.3.1 lockfile entry. Verified end to end against a synthetic repo: the lockfile-pinned short-tag ref is suppressed while unlocked refs still report. actions-lockfile is not yet public, so go.mod carries a local replace directive for building and testing; remove it once the module is published. --- .../lockfile-extension-generator/.gitignore | 1 + .../lockfile-extension-generator/README.md | 75 +++++++++++ .../lockfile-extension-generator/generator.go | 117 ++++++++++++++++++ .../generator_test.go | 91 ++++++++++++++ .../tools/lockfile-extension-generator/go.mod | 16 +++ .../tools/lockfile-extension-generator/go.sum | 10 ++ .../lockfile-extension-generator/main.go | 57 +++++++++ .../testdata/actions.lock | 19 +++ .../testdata/expected.yml | 16 +++ 9 files changed, 402 insertions(+) create mode 100644 actions/extractor/tools/lockfile-extension-generator/.gitignore create mode 100644 actions/extractor/tools/lockfile-extension-generator/README.md create mode 100644 actions/extractor/tools/lockfile-extension-generator/generator.go create mode 100644 actions/extractor/tools/lockfile-extension-generator/generator_test.go create mode 100644 actions/extractor/tools/lockfile-extension-generator/go.mod create mode 100644 actions/extractor/tools/lockfile-extension-generator/go.sum create mode 100644 actions/extractor/tools/lockfile-extension-generator/main.go create mode 100644 actions/extractor/tools/lockfile-extension-generator/testdata/actions.lock create mode 100644 actions/extractor/tools/lockfile-extension-generator/testdata/expected.yml diff --git a/actions/extractor/tools/lockfile-extension-generator/.gitignore b/actions/extractor/tools/lockfile-extension-generator/.gitignore new file mode 100644 index 000000000000..554d32ee98ca --- /dev/null +++ b/actions/extractor/tools/lockfile-extension-generator/.gitignore @@ -0,0 +1 @@ +/lockfile-extension-generator diff --git a/actions/extractor/tools/lockfile-extension-generator/README.md b/actions/extractor/tools/lockfile-extension-generator/README.md new file mode 100644 index 000000000000..99ce1cf07b91 --- /dev/null +++ b/actions/extractor/tools/lockfile-extension-generator/README.md @@ -0,0 +1,75 @@ +# lockfile-extension-generator + +Turns a repository's GitHub Actions lockfile (`.github/workflows/actions.lock`) +into a CodeQL data extension that populates the `pinnedByLockfileDataModel` +extensible predicate consumed by the `actions/unpinned-tag` +(`js/actions/actions-workflow-unpinned-tag`) query. + +## Why + +`actions/unpinned-tag` flags `uses:` references pinned to a mutable tag (e.g. +`actions/checkout@v4`) rather than an immutable commit SHA. When a repository +maintains an Actions lockfile, every such tag is already bound to a verified +commit SHA at run time by the lockfile — which is exactly the pinning evidence +the query otherwise lacks. Feeding the lockfile's bindings into +`pinnedByLockfileDataModel` lets the query suppress those references while still +flagging genuinely unpinned ones. + +The generator is deliberately **transport-agnostic**. It parses the lockfile +with the canonical parser at `github.com/github/actions-lockfile/go` and emits +the `[workflow_path, nwo, ref]` rows the query already matches on. Today those +rows ship as a data-extension model pack applied at analysis time via +`--model-packs` (the same mechanism as `codeql/immutable-actions-list`). The +same parsing core can later feed an extractor-native relation without changing +the query. + +## Ref normalization + +A lockfile records the *resolved* ref for each dependency — the CLI prefers a +full semver tag such as `v4.3.1`. A workflow author, however, usually writes a +shorter, mutable tag such as `v4` or `v4.3` in `uses:`, and the query matches on +the ref exactly as written. For every full-semver resolved ref the generator +therefore also emits its major.minor (`v4.3`) and major-only (`v4`) forms, so a +`uses: owner/action@v4` is recognized as pinned by a lockfile entry that +resolved to `v4.3.1`. Partial tags, pre-release tags, branches, and SHAs pass +through unchanged. + +## Usage + +``` +lockfile-extension-generator [output-file] +``` + +- ``: repository root to scan; the lockfile is read from + `/.github/workflows/actions.lock`. +- `[output-file]`: destination for the extension YAML; defaults to stdout. + +If the repository has no lockfile the generator exits successfully without +writing anything, so it is safe to run unconditionally. + +## Building and testing locally + +`github.com/github/actions-lockfile` is not yet public, so the module cannot be +fetched by the module proxy. Point the `replace` directive in `go.mod` at a +local clone before building or testing: + +``` +go mod edit -replace github.com/github/actions-lockfile/go=/path/to/actions-lockfile/go +go test ./... +``` + +Remove the `replace` directive once actions-lockfile is published. + +## End-to-end check + +``` +# A repo whose workflow writes `uses: owner/action@v4` while the lockfile +# resolves it to v4.3.1: +lockfile-extension-generator /path/to/repo /tmp/pack/ext/pinned.yml +codeql database analyze \ + codeql/actions-queries:Security/CWE-829/UnpinnedActionsTag.ql \ + --additional-packs=/tmp/pack --model-packs= +``` + +The lockfile-pinned reference is suppressed; references not covered by the +lockfile are still reported. diff --git a/actions/extractor/tools/lockfile-extension-generator/generator.go b/actions/extractor/tools/lockfile-extension-generator/generator.go new file mode 100644 index 000000000000..f7b0a43495f8 --- /dev/null +++ b/actions/extractor/tools/lockfile-extension-generator/generator.go @@ -0,0 +1,117 @@ +// Package main implements a generator that turns a repository's Actions lockfile +// (`.github/workflows/actions.lock`) into a CodeQL data extension populating the +// `pinnedByLockfileDataModel` extensible predicate consumed by the +// `actions/unpinned-tag` query. +// +// The generator is deliberately transport-agnostic: it parses the lockfile with +// the canonical parser at `github.com/github/actions-lockfile/go` and emits the +// same `[workflow_path, nwo, ref]` rows the query already matches on. Today those +// rows are shipped as a data-extension model pack (applied at analysis time via +// `--model-packs`, exactly like `codeql/immutable-actions-list`). The same parsing +// core can later feed an extractor-native TRAP relation without changing the query. +package main + +import ( + "fmt" + "sort" + "strings" + + "github.com/github/actions-lockfile/go/pkg/lockfile" +) + +// row is a single `pinnedByLockfileDataModel` tuple: the reference +// `nwo`@`ref` in the workflow or composite action file at `workflowPath` is +// pinned by the repository's Actions lockfile. +type row struct { + workflowPath string + nwo string + ref string +} + +// rowsFromLockfile parses lockfile `contents` and returns the deduplicated, +// sorted set of `pinnedByLockfileDataModel` rows it implies. +// +// A lockfile records the *resolved* ref for each dependency (the CLI prefers a +// full semver tag such as `v4.3.1`), but a workflow author usually writes a +// shorter, mutable tag such as `v4` or `v4.3` in `uses:`. The query matches on +// the ref exactly as written, so for every full-semver resolved ref we also +// emit its major-only (`v4`) and major.minor (`v4.3`) forms. This lets a +// `uses: owner/action@v4` be recognised as pinned by a lockfile entry that +// resolved to `v4.3.1`, which is the common real-world case. +func rowsFromLockfile(contents []byte) ([]row, error) { + f, err := lockfile.Parse(contents) + if err != nil { + return nil, fmt.Errorf("parsing lockfile: %w", err) + } + + seen := make(map[row]struct{}) + for workflowPath, pinKeys := range f.Workflows { + for _, key := range pinKeys { + pin, ok := lockfile.ParsePin(key) + if !ok { + continue + } + // Prefer the resolved ref recorded in the dependency metadata; fall + // back to the ref embedded in the pin key. + ref := pin.Ref + if dep, ok := f.Dependencies[key]; ok && dep.Ref != "" { + ref = dep.Ref + } + for _, r := range refVariants(ref) { + seen[row{workflowPath: workflowPath, nwo: pin.NWO, ref: r}] = struct{}{} + } + } + } + + rows := make([]row, 0, len(seen)) + for r := range seen { + rows = append(rows, r) + } + sort.Slice(rows, func(i, j int) bool { + if rows[i].workflowPath != rows[j].workflowPath { + return rows[i].workflowPath < rows[j].workflowPath + } + if rows[i].nwo != rows[j].nwo { + return rows[i].nwo < rows[j].nwo + } + return rows[i].ref < rows[j].ref + }) + return rows, nil +} + +// refVariants returns every ref string a workflow author might have written in +// `uses:` that the resolved `ref` covers. For a full semver tag (e.g. `v4.3.1`) +// this is the tag itself plus its major.minor (`v4.3`) and major-only (`v4`) +// forms; for anything else (a branch, a partial tag, a SHA) it is just the ref. +func refVariants(ref string) []string { + sv, ok := lockfile.ParseSemVer(ref) + if !ok || !sv.IsFull() { + return []string{ref} + } + variants := []string{ref} + if minor := sv.MinorTag(); minor != ref { + variants = append(variants, minor) + } + if major := sv.MajorTag(); major != ref { + variants = append(variants, major) + } + return variants +} + +// renderExtension serialises `rows` as a CodeQL data-extension YAML document that +// adds to the `pinnedByLockfileDataModel` extensible predicate in +// `codeql/actions-all`. +func renderExtension(rows []row) string { + var b strings.Builder + b.WriteString("# Generated by lockfile-extension-generator from .github/workflows/actions.lock.\n") + b.WriteString("# Do not edit by hand; regenerate from the repository's Actions lockfile.\n") + b.WriteString("extensions:\n") + b.WriteString(" - addsTo:\n") + b.WriteString(" pack: codeql/actions-all\n") + b.WriteString(" extensible: pinnedByLockfileDataModel\n") + b.WriteString(" data:\n") + for _, r := range rows { + fmt.Fprintf(&b, " - [%q, %q, %q]\n", r.workflowPath, r.nwo, r.ref) + } + return b.String() +} diff --git a/actions/extractor/tools/lockfile-extension-generator/generator_test.go b/actions/extractor/tools/lockfile-extension-generator/generator_test.go new file mode 100644 index 000000000000..512a6679dc47 --- /dev/null +++ b/actions/extractor/tools/lockfile-extension-generator/generator_test.go @@ -0,0 +1,91 @@ +package main + +import ( + "os" + "testing" +) + +func TestRowsFromLockfile(t *testing.T) { + contents, err := os.ReadFile("testdata/actions.lock") + if err != nil { + t.Fatalf("reading fixture: %v", err) + } + + rows, err := rowsFromLockfile(contents) + if err != nil { + t.Fatalf("rowsFromLockfile: %v", err) + } + + // Every full-semver resolved ref expands to {raw, minor, major} so a + // workflow that writes a shorter tag in `uses:` still matches. Rows are + // sorted by (workflowPath, nwo, ref). + want := []row{ + {".github/workflows/ci.yml", "actions/checkout", "v4"}, + {".github/workflows/ci.yml", "actions/checkout", "v4.3"}, + {".github/workflows/ci.yml", "actions/checkout", "v4.3.1"}, + {".github/workflows/ci.yml", "some-owner/pinned-action", "v1"}, + {".github/workflows/ci.yml", "some-owner/pinned-action", "v1.2"}, + {".github/workflows/ci.yml", "some-owner/pinned-action", "v1.2.0"}, + {".github/workflows/release.yml", "actions/checkout", "v4"}, + {".github/workflows/release.yml", "actions/checkout", "v4.3"}, + {".github/workflows/release.yml", "actions/checkout", "v4.3.1"}, + } + + if len(rows) != len(want) { + t.Fatalf("got %d rows, want %d:\n%#v", len(rows), len(want), rows) + } + for i := range want { + if rows[i] != want[i] { + t.Errorf("row %d: got %+v, want %+v", i, rows[i], want[i]) + } + } +} + +func TestRefVariants(t *testing.T) { + cases := []struct { + ref string + want []string + }{ + {"v4.3.1", []string{"v4.3.1", "v4.3", "v4"}}, + {"v1.0.0", []string{"v1.0.0", "v1.0", "v1"}}, + // Partial tags are already their own broadest form. + {"v4", []string{"v4"}}, + {"v4.3", []string{"v4.3"}}, + // Pre-release and non-semver refs pass through untouched. + {"v2.0.0-beta.1", []string{"v2.0.0-beta.1"}}, + {"main", []string{"main"}}, + } + for _, c := range cases { + got := refVariants(c.ref) + if len(got) != len(c.want) { + t.Errorf("refVariants(%q) = %v, want %v", c.ref, got, c.want) + continue + } + for i := range c.want { + if got[i] != c.want[i] { + t.Errorf("refVariants(%q) = %v, want %v", c.ref, got, c.want) + break + } + } + } +} + +func TestRenderExtensionMatchesGolden(t *testing.T) { + contents, err := os.ReadFile("testdata/actions.lock") + if err != nil { + t.Fatalf("reading fixture: %v", err) + } + rows, err := rowsFromLockfile(contents) + if err != nil { + t.Fatalf("rowsFromLockfile: %v", err) + } + got := renderExtension(rows) + + want, err := os.ReadFile("testdata/expected.yml") + if err != nil { + t.Fatalf("reading golden: %v", err) + } + if got != string(want) { + t.Errorf("rendered extension does not match testdata/expected.yml:\n--- got ---\n%s", got) + } +} diff --git a/actions/extractor/tools/lockfile-extension-generator/go.mod b/actions/extractor/tools/lockfile-extension-generator/go.mod new file mode 100644 index 000000000000..538ae9ae6922 --- /dev/null +++ b/actions/extractor/tools/lockfile-extension-generator/go.mod @@ -0,0 +1,16 @@ +module github.com/github/codeql/actions/extractor/tools/lockfile-extension-generator + +go 1.23 + +require github.com/github/actions-lockfile/go v0.0.0-00010101000000-000000000000 + +require gopkg.in/yaml.v3 v3.0.1 // indirect + +// LOCAL TESTING ONLY: github.com/github/actions-lockfile is not yet public, so it +// cannot be fetched by the module proxy. Point this at a local clone of the +// repository to build and test the generator: +// +// go mod edit -replace github.com/github/actions-lockfile/go=/path/to/actions-lockfile/go +// +// Remove this replace directive once actions-lockfile is published. +replace github.com/github/actions-lockfile/go => /Users/nodeselector/ghq/github.com/github/actions-lockfile/go diff --git a/actions/extractor/tools/lockfile-extension-generator/go.sum b/actions/extractor/tools/lockfile-extension-generator/go.sum new file mode 100644 index 000000000000..c4c1710c475c --- /dev/null +++ b/actions/extractor/tools/lockfile-extension-generator/go.sum @@ -0,0 +1,10 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/actions/extractor/tools/lockfile-extension-generator/main.go b/actions/extractor/tools/lockfile-extension-generator/main.go new file mode 100644 index 000000000000..417c2a848e69 --- /dev/null +++ b/actions/extractor/tools/lockfile-extension-generator/main.go @@ -0,0 +1,57 @@ +package main + +import ( + "fmt" + "os" + "path/filepath" + + "github.com/github/actions-lockfile/go/pkg/lockfile" +) + +// main reads a repository's Actions lockfile and writes the corresponding +// `pinnedByLockfileDataModel` data extension. +// +// Usage: +// +// lockfile-extension-generator [output-file] +// +// `` is the root of the repository to scan; the lockfile is read +// from `/.github/workflows/actions.lock`. When `[output-file]` is +// omitted the extension is written to stdout. If the repository has no lockfile +// the generator exits successfully without writing anything, so it is safe to +// run unconditionally. +func main() { + if len(os.Args) < 2 || len(os.Args) > 3 { + fmt.Fprintf(os.Stderr, "usage: %s [output-file]\n", filepath.Base(os.Args[0])) + os.Exit(2) + } + sourceRoot := os.Args[1] + + lockPath := filepath.Join(sourceRoot, filepath.FromSlash(lockfile.Path)) + contents, err := os.ReadFile(lockPath) + if err != nil { + if os.IsNotExist(err) { + // No lockfile: nothing to pin. A clean no-op keeps this safe to run + // against every repository. + return + } + fmt.Fprintf(os.Stderr, "error: reading %s: %v\n", lockPath, err) + os.Exit(1) + } + + rows, err := rowsFromLockfile(contents) + if err != nil { + fmt.Fprintf(os.Stderr, "error: %v\n", err) + os.Exit(1) + } + + out := renderExtension(rows) + if len(os.Args) == 3 { + if err := os.WriteFile(os.Args[2], []byte(out), 0o644); err != nil { + fmt.Fprintf(os.Stderr, "error: writing %s: %v\n", os.Args[2], err) + os.Exit(1) + } + return + } + fmt.Print(out) +} diff --git a/actions/extractor/tools/lockfile-extension-generator/testdata/actions.lock b/actions/extractor/tools/lockfile-extension-generator/testdata/actions.lock new file mode 100644 index 000000000000..012688ac0993 --- /dev/null +++ b/actions/extractor/tools/lockfile-extension-generator/testdata/actions.lock @@ -0,0 +1,19 @@ +# Machine-generated by `gh actions-lock`; used here as a test fixture. +version: 'v0.0.2' +workflows: + '.github/workflows/ci.yml': + - 'actions/checkout@v4.3.1' + - 'some-owner/pinned-action@v1.2.0' + '.github/workflows/release.yml': + - 'actions/checkout@v4.3.1' +dependencies: + 'actions/checkout@v4.3.1': + ref: 'v4.3.1' + commit: 'sha1-34e114876b0b11c390a56381ad16ebd13914f8d5' + owner_id: 44036562 + repo_id: 197814629 + 'some-owner/pinned-action@v1.2.0': + ref: 'v1.2.0' + commit: 'sha1-1111111111111111111111111111111111111111' + owner_id: 12345 + repo_id: 67890 diff --git a/actions/extractor/tools/lockfile-extension-generator/testdata/expected.yml b/actions/extractor/tools/lockfile-extension-generator/testdata/expected.yml new file mode 100644 index 000000000000..4dba2d6f997c --- /dev/null +++ b/actions/extractor/tools/lockfile-extension-generator/testdata/expected.yml @@ -0,0 +1,16 @@ +# Generated by lockfile-extension-generator from .github/workflows/actions.lock. +# Do not edit by hand; regenerate from the repository's Actions lockfile. +extensions: + - addsTo: + pack: codeql/actions-all + extensible: pinnedByLockfileDataModel + data: + - [".github/workflows/ci.yml", "actions/checkout", "v4"] + - [".github/workflows/ci.yml", "actions/checkout", "v4.3"] + - [".github/workflows/ci.yml", "actions/checkout", "v4.3.1"] + - [".github/workflows/ci.yml", "some-owner/pinned-action", "v1"] + - [".github/workflows/ci.yml", "some-owner/pinned-action", "v1.2"] + - [".github/workflows/ci.yml", "some-owner/pinned-action", "v1.2.0"] + - [".github/workflows/release.yml", "actions/checkout", "v4"] + - [".github/workflows/release.yml", "actions/checkout", "v4.3"] + - [".github/workflows/release.yml", "actions/checkout", "v4.3.1"] From 9f8032df24e9f6db8e7f6c161a17accf7f7db9b6 Mon Sep 17 00:00:00 2001 From: Jeff Martin Date: Thu, 9 Jul 2026 21:10:04 -0500 Subject: [PATCH 0784/2098] actions: generate lockfile-pinned data extension during extraction Wire the lockfile-extension-generator into the Actions extractor autobuild so that codeql database create automatically emits the pinnedByLockfileDataModel data extension from a repository's .github/workflows/actions.lock. The extension is written into the database as a self-contained model pack under /lockfile-extension (codeql/actions-lockfile-pins). A new generate-lockfile-extension.sh runs after JS extraction: it locates the lockfile relative to the captured source root, resolves the generator (prebuilt binary if shipped, else builds from source when a Go toolchain is present), and writes the pack. It is a clean no-op when the repository has no lockfile, so it is safe to run against every database. CodeQL does not auto-apply extensions carried inside a database, so analysis still adds the pack explicitly via --model-packs codeql/actions-lockfile-pins (--additional-packs /lockfile-extension). Wiring that into the analysis harness is the remaining step and lives outside this repo. Verified end to end locally by overlaying the modified extractor into the CLI bundle: database create emits the extension, and analyze suppresses a lockfile-pinned short-tag ref (uses: owner/action@v4 resolved to v4.3.1) while still reporting refs not covered by the lockfile. --- actions/extractor/tools/autobuild.sh | 14 ++++ .../tools/generate-lockfile-extension.sh | 80 +++++++++++++++++++ .../lockfile-extension-generator/README.md | 28 +++++++ 3 files changed, 122 insertions(+) create mode 100755 actions/extractor/tools/generate-lockfile-extension.sh diff --git a/actions/extractor/tools/autobuild.sh b/actions/extractor/tools/autobuild.sh index c2794044ee64..e66b6d8ea68f 100755 --- a/actions/extractor/tools/autobuild.sh +++ b/actions/extractor/tools/autobuild.sh @@ -38,6 +38,11 @@ else export LGTM_INDEX_FILTERS fi +# Capture the source root before handing off to the JavaScript autobuilder, +# which may change the working directory. The Actions extractor runs from the +# source root, so `pwd` here is the root of the repository being analysed. +ACTIONS_SRC_ROOT="$(pwd)" + # Find the JavaScript extractor directory via `codeql resolve extractor`. CODEQL_EXTRACTOR_JAVASCRIPT_ROOT="$("${CODEQL_DIST}/codeql" resolve extractor --language javascript)" export CODEQL_EXTRACTOR_JAVASCRIPT_ROOT @@ -56,3 +61,12 @@ env CODEQL_EXTRACTOR_JAVASCRIPT_DIAGNOSTIC_DIR="${CODEQL_EXTRACTOR_ACTIONS_DIAGN CODEQL_EXTRACTOR_JAVASCRIPT_TRAP_DIR="${CODEQL_EXTRACTOR_ACTIONS_TRAP_DIR}" \ CODEQL_EXTRACTOR_JAVASCRIPT_WIP_DATABASE="${CODEQL_EXTRACTOR_ACTIONS_WIP_DATABASE}" \ "${JAVASCRIPT_AUTO_BUILD}" + +# Generate the lockfile-pinned data extension from the repository's Actions +# lockfile, if present. This is a no-op for repositories without a lockfile. +GENERATE_LOCKFILE_EXTENSION="$(CDPATH= cd "$(dirname "$0")" && pwd)/generate-lockfile-extension.sh" +if [ -x "${GENERATE_LOCKFILE_EXTENSION}" ]; then + echo "Generating lockfile-pinned data extension." + "${GENERATE_LOCKFILE_EXTENSION}" "${ACTIONS_SRC_ROOT}" || \ + echo "Lockfile-pinned data extension generation failed; continuing without it." >&2 +fi diff --git a/actions/extractor/tools/generate-lockfile-extension.sh b/actions/extractor/tools/generate-lockfile-extension.sh new file mode 100755 index 000000000000..7a3e89ec313e --- /dev/null +++ b/actions/extractor/tools/generate-lockfile-extension.sh @@ -0,0 +1,80 @@ +#!/bin/sh + +# Generates a CodeQL data extension that records the `uses:` references pinned by +# the repository's GitHub Actions lockfile (`.github/workflows/actions.lock`), +# populating the `pinnedByLockfileDataModel` extensible predicate consumed by the +# `actions/unpinned-tag` query. +# +# It is invoked by the Actions extractor autobuild during `codeql database +# create`. The generated extension is written into the database as a +# self-contained model pack under: +# +# /lockfile-extension/ +# qlpack.yml +# ext/pinned_by_lockfile.model.yml +# +# CodeQL does not auto-apply extensions carried inside a database, so analysis +# must add this pack explicitly, e.g.: +# +# codeql database analyze ... \ +# --additional-packs /lockfile-extension \ +# --model-packs codeql/actions-lockfile-pins +# +# The step is a clean no-op when the repository has no lockfile, so it is safe to +# run against every database. + +set -eu + +SRC_ROOT="${1:?usage: generate-lockfile-extension.sh }" +LOCKFILE="${SRC_ROOT}/.github/workflows/actions.lock" + +if [ ! -f "${LOCKFILE}" ]; then + echo "No Actions lockfile at '${LOCKFILE}'; skipping lockfile-pinned extension." + exit 0 +fi + +if [ -z "${CODEQL_EXTRACTOR_ACTIONS_WIP_DATABASE:-}" ]; then + echo "CODEQL_EXTRACTOR_ACTIONS_WIP_DATABASE is not set; cannot write lockfile extension." >&2 + exit 0 +fi + +SCRIPT_DIR="$(CDPATH= cd "$(dirname "$0")" && pwd)" +GEN_DIR="${SCRIPT_DIR}/lockfile-extension-generator" + +PACK_DIR="${CODEQL_EXTRACTOR_ACTIONS_WIP_DATABASE}/lockfile-extension" +EXT_DIR="${PACK_DIR}/ext" +mkdir -p "${EXT_DIR}" + +# Resolve the generator: prefer a prebuilt binary shipped with the extractor; +# otherwise build from source with the Go toolchain if it is available. +GEN_BIN="${GEN_DIR}/bin/lockfile-extension-generator" +RUN_GENERATOR="" +if [ -x "${GEN_BIN}" ]; then + RUN_GENERATOR="${GEN_BIN}" +elif command -v go >/dev/null 2>&1; then + BUILT_BIN="${CODEQL_EXTRACTOR_ACTIONS_SCRATCH_DIR:-${PACK_DIR}}/lockfile-extension-generator" + echo "Building lockfile-extension-generator from source with 'go build'." + ( cd "${GEN_DIR}" && go build -o "${BUILT_BIN}" . ) + RUN_GENERATOR="${BUILT_BIN}" +else + echo "No lockfile-extension-generator binary and no Go toolchain; skipping lockfile-pinned extension." >&2 + exit 0 +fi + +"${RUN_GENERATOR}" "${SRC_ROOT}" "${EXT_DIR}/pinned_by_lockfile.model.yml" + +cat > "${PACK_DIR}/qlpack.yml" <<'EOF' +name: codeql/actions-lockfile-pins +version: 0.0.1 +library: true +warnOnImplicitThis: true +# Generated per-database from the repository's Actions lockfile by the Actions +# extractor. Apply it at analysis time with `--model-packs +# codeql/actions-lockfile-pins` (and `--additional-packs /lockfile-extension`). +extensionTargets: + codeql/actions-all: "*" +dataExtensions: + - ext/*.model.yml +EOF + +echo "Wrote lockfile-pinned data extension to '${PACK_DIR}'." diff --git a/actions/extractor/tools/lockfile-extension-generator/README.md b/actions/extractor/tools/lockfile-extension-generator/README.md index 99ce1cf07b91..4d39191746d1 100644 --- a/actions/extractor/tools/lockfile-extension-generator/README.md +++ b/actions/extractor/tools/lockfile-extension-generator/README.md @@ -23,6 +23,34 @@ rows ship as a data-extension model pack applied at analysis time via same parsing core can later feed an extractor-native relation without changing the query. +## Extractor integration + +The Actions extractor runs this generator automatically during `codeql database +create` (see `../generate-lockfile-extension.sh`, invoked from +`../autobuild.sh`). When the repository has a lockfile, the extractor writes a +self-contained model pack into the database: + +``` +/lockfile-extension/ + qlpack.yml # name: codeql/actions-lockfile-pins + ext/pinned_by_lockfile.model.yml # generated pinnedByLockfileDataModel rows +``` + +CodeQL does not auto-apply extensions carried inside a database, so analysis +must add this pack explicitly: + +``` +codeql database analyze \ + codeql/actions-queries:Security/CWE-829/UnpinnedActionsTag.ql \ + --additional-packs /lockfile-extension \ + --model-packs codeql/actions-lockfile-pins +``` + +Wiring that flag into the analysis harness (e.g. the CodeQL Action) is the +remaining integration step and lives outside this repository. Generation is a +clean no-op for repositories without a lockfile, so the extractor step is safe +to run unconditionally. + ## Ref normalization A lockfile records the *resolved* ref for each dependency — the CLI prefers a From 9e7133bf1db96a7cf000e63b7bd9c94523297961 Mon Sep 17 00:00:00 2001 From: Jeff Martin Date: Thu, 9 Jul 2026 21:50:24 -0500 Subject: [PATCH 0785/2098] actions: drop machine-specific replace, document lockfile generator limits The committed go.mod for the lockfile-extension generator carried an absolute-path replace directive pointing at a local clone of the private actions-lockfile repo, which would leak a developer path and break builds for anyone else. Keep the how-to-test comment but drop the replace line; local testing uses `go mod edit -replace`. Also update the two change notes to state that the extractor now generates the pinnedByLockfileDataModel data into a database-local model pack (applied via --model-packs), and document the composite-action completeness gap in the generator README. --- .../tools/lockfile-extension-generator/README.md | 13 +++++++++++++ .../tools/lockfile-extension-generator/go.mod | 1 + .../change-notes/2026-07-09-pinned-by-lockfile.md | 2 +- .../2026-07-09-unpinned-tag-lockfile-aware.md | 2 +- 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/actions/extractor/tools/lockfile-extension-generator/README.md b/actions/extractor/tools/lockfile-extension-generator/README.md index 4d39191746d1..45eff56ac63e 100644 --- a/actions/extractor/tools/lockfile-extension-generator/README.md +++ b/actions/extractor/tools/lockfile-extension-generator/README.md @@ -101,3 +101,16 @@ codeql database analyze \ The lockfile-pinned reference is suppressed; references not covered by the lockfile are still reported. + +## Limitations + +- **Composite actions.** A lockfile records each workflow's *transitive* pin + list keyed by the workflow path. A `uses:` that appears only inside a + composite action file (`.github/actions/*/action.yml`) is therefore not + emitted against that action file's own path, so the query does not suppress + it. This is a completeness gap, not a correctness one: it can only leave a + reference reported, never wrongly suppress one, because a row is only ever + emitted for a `(path, nwo, ref)` the lockfile actually pins. +- **Ref forms the lockfile can't cover.** Only the resolved ref and its + major/major.minor forms are emitted. A `uses:` written with an unrelated tag + or a moving branch that the lockfile did not resolve from is not matched. diff --git a/actions/extractor/tools/lockfile-extension-generator/go.mod b/actions/extractor/tools/lockfile-extension-generator/go.mod index 538ae9ae6922..50cd43b16fb4 100644 --- a/actions/extractor/tools/lockfile-extension-generator/go.mod +++ b/actions/extractor/tools/lockfile-extension-generator/go.mod @@ -13,4 +13,5 @@ require gopkg.in/yaml.v3 v3.0.1 // indirect // go mod edit -replace github.com/github/actions-lockfile/go=/path/to/actions-lockfile/go // // Remove this replace directive once actions-lockfile is published. + replace github.com/github/actions-lockfile/go => /Users/nodeselector/ghq/github.com/github/actions-lockfile/go diff --git a/actions/ql/lib/change-notes/2026-07-09-pinned-by-lockfile.md b/actions/ql/lib/change-notes/2026-07-09-pinned-by-lockfile.md index d9b09e27ab81..7020d4418631 100644 --- a/actions/ql/lib/change-notes/2026-07-09-pinned-by-lockfile.md +++ b/actions/ql/lib/change-notes/2026-07-09-pinned-by-lockfile.md @@ -1,4 +1,4 @@ --- category: minorAnalysis --- -* Added a new extensible predicate `pinnedByLockfileDataModel(workflow_path, nwo, ref)`, which records `uses:` references that are pinned by a repository's Actions lockfile (`.github/workflows/actions.lock`). It is intended to be populated by the CodeQL Actions extractor and is currently unpopulated, so it has no effect until that support ships. +* Added a new extensible predicate `pinnedByLockfileDataModel(workflow_path, nwo, ref)`, which records `uses:` references that are pinned by a repository's Actions lockfile (`.github/workflows/actions.lock`). The CodeQL Actions extractor generates this data at database-creation time into a database-local model pack (`codeql/actions-lockfile-pins`); it has no effect unless that pack is supplied to analysis (for example via `--model-packs`), so behaviour is unchanged for repositories without a lockfile or analyses that do not opt in. diff --git a/actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md b/actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md index beae154ff21d..35059072fcf1 100644 --- a/actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md +++ b/actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md @@ -1,4 +1,4 @@ --- category: minorAnalysis --- -* The `actions/unpinned-tag` query no longer reports `uses:` references that are recorded as pinned by a repository's Actions lockfile (`.github/workflows/actions.lock`) via the new `pinnedByLockfileDataModel` extensible predicate. This predicate is populated by the CodeQL Actions extractor and has no effect until that support ships. +* The `actions/unpinned-tag` query no longer reports `uses:` references that are recorded as pinned by a repository's Actions lockfile (`.github/workflows/actions.lock`) via the new `pinnedByLockfileDataModel` extensible predicate. The CodeQL Actions extractor generates this data at database-creation time into a database-local model pack (`codeql/actions-lockfile-pins`); references are suppressed only when that pack is supplied to analysis (for example via `--model-packs`), so behaviour is unchanged for repositories without a lockfile or analyses that do not opt in. From d425c272beab11b8493c9cfb1c8cf5c9f1a51bc4 Mon Sep 17 00:00:00 2001 From: Jeff Martin Date: Thu, 9 Jul 2026 21:52:46 -0500 Subject: [PATCH 0786/2098] actions: keep lockfile generator go.mod free of local replace The previous commit re-staged a dirty working-tree go.mod, so the machine-specific replace directive pointing at a local actions-lockfile clone leaked back into the tree. Drop it for real and move the local replace into a gitignored go.work so committed module metadata stays portable while local builds still resolve the not-yet-public dependency. --- .../extractor/tools/lockfile-extension-generator/.gitignore | 4 ++++ actions/extractor/tools/lockfile-extension-generator/go.mod | 2 -- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/actions/extractor/tools/lockfile-extension-generator/.gitignore b/actions/extractor/tools/lockfile-extension-generator/.gitignore index 554d32ee98ca..b6ebbfc11b8c 100644 --- a/actions/extractor/tools/lockfile-extension-generator/.gitignore +++ b/actions/extractor/tools/lockfile-extension-generator/.gitignore @@ -1 +1,5 @@ /lockfile-extension-generator + +# local-only module workspace carrying the actions-lockfile replace +go.work +go.work.sum diff --git a/actions/extractor/tools/lockfile-extension-generator/go.mod b/actions/extractor/tools/lockfile-extension-generator/go.mod index 50cd43b16fb4..69d91a03f69b 100644 --- a/actions/extractor/tools/lockfile-extension-generator/go.mod +++ b/actions/extractor/tools/lockfile-extension-generator/go.mod @@ -13,5 +13,3 @@ require gopkg.in/yaml.v3 v3.0.1 // indirect // go mod edit -replace github.com/github/actions-lockfile/go=/path/to/actions-lockfile/go // // Remove this replace directive once actions-lockfile is published. - -replace github.com/github/actions-lockfile/go => /Users/nodeselector/ghq/github.com/github/actions-lockfile/go From feed86481d650f4bfcf7b6bb52d216eb1f4d1deb Mon Sep 17 00:00:00 2001 From: Jeff Martin Date: Thu, 9 Jul 2026 21:55:14 -0500 Subject: [PATCH 0787/2098] actions: rename self-reference to self repository in unpinned-tag Canonical terminology flip: `$/` resolves to the same REPOSITORY at the running SHA ("self repository"), while `./` is "self workspace". Rename the isSelfReference predicate to isSelfRepository, reword the code comment, and update the change note (renamed to ...-self-repository.md) and test fixture comments to match. No change to query results, the finding message, or any .expected output. --- actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql | 10 +++++----- .../2026-07-09-unpinned-tag-self-reference.md | 4 ---- .../2026-07-09-unpinned-tag-self-repository.md | 4 ++++ .../CWE-829/.github/workflows/self_ref_dollar.yml | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) delete mode 100644 actions/ql/src/change-notes/2026-07-09-unpinned-tag-self-reference.md create mode 100644 actions/ql/src/change-notes/2026-07-09-unpinned-tag-self-repository.md diff --git a/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql b/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql index cc93f509aa95..6c75d32e5074 100644 --- a/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql +++ b/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql @@ -33,11 +33,11 @@ private predicate isPinnedContainer(string version) { bindingset[nwo] private predicate isContainerImage(string nwo) { nwo.regexpMatch("^docker://.+") } -// A `$/` reference is a same-repo self-reference (e.g. `$/path/to/action`), resolved at the -// commit the calling workflow is running. Like `./` local references, it is inherently pinned -// and can never be an unpinned-tag finding, so we never flag it. +// A `$/` reference is a same-repository (self repository) reference (e.g. `$/path/to/action`), +// resolved at the commit the calling workflow is running. Like `./` local (self workspace) +// references, it is inherently pinned and can never be an unpinned-tag finding, so we never flag it. bindingset[nwo] -private predicate isSelfReference(string nwo) { nwo.matches("$/%") } +private predicate isSelfRepository(string nwo) { nwo.matches("$/%") } // Holds if `uses` (calling action `nwo` at `version`) is pinned by an entry in the repository's // Actions lockfile (`.github/workflows/actions.lock`). The underlying `pinnedByLockfileDataModel` @@ -70,7 +70,7 @@ where hasUsesContainerName(uses, name) and uses.getVersion() = version and not isTrustedOwner(nwo) and - not isSelfReference(nwo) and + not isSelfRepository(nwo) and not exists(UsesStep step | uses = step and pinnedByLockfile(step, nwo, version)) and not ( if uses instanceof UsesStep and isContainerImage(nwo) diff --git a/actions/ql/src/change-notes/2026-07-09-unpinned-tag-self-reference.md b/actions/ql/src/change-notes/2026-07-09-unpinned-tag-self-reference.md deleted file mode 100644 index c972741f1e7b..000000000000 --- a/actions/ql/src/change-notes/2026-07-09-unpinned-tag-self-reference.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The `actions/unpinned-tag` query no longer reports `$/` same-repo self-references (e.g. `uses: $/path/to/action`), which are inherently pinned to the running commit, just like `./` local references. diff --git a/actions/ql/src/change-notes/2026-07-09-unpinned-tag-self-repository.md b/actions/ql/src/change-notes/2026-07-09-unpinned-tag-self-repository.md new file mode 100644 index 000000000000..02e1eac704b2 --- /dev/null +++ b/actions/ql/src/change-notes/2026-07-09-unpinned-tag-self-repository.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `actions/unpinned-tag` query no longer reports `$/` self repository references (e.g. `uses: $/path/to/action`), which resolve to the same repository at the running commit and are therefore inherently pinned, just like `./` self workspace (local) references. diff --git a/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/self_ref_dollar.yml b/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/self_ref_dollar.yml index 0c1275d35764..0d651b0bb0f6 100644 --- a/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/self_ref_dollar.yml +++ b/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/self_ref_dollar.yml @@ -6,10 +6,10 @@ jobs: name: Build and test runs-on: ubuntu-latest steps: - # `$/` is a same-repo self-reference resolved at the running commit. It is inherently - # pinned (like `./` local refs) and must never be reported as an unpinned tag. + # `$/` is a same-repository (self repository) reference resolved at the running commit. It is + # inherently pinned (like `./` self workspace refs) and must never be reported as an unpinned tag. - uses: $/actions/foo # `$/…@ref` is rejected by the `$/` rule, but a user could still write it. It must also - # never be flagged; this case exercises the `not isSelfReference(nwo)` suppression, since + # never be flagged; this case exercises the `not isSelfRepository(nwo)` suppression, since # without it `$/actions/foo@v1` would otherwise be reported as an unpinned tag. - uses: $/actions/foo@v1 From c17aea9a43cd1af2aee60e2c8d1f5452ecb0786e Mon Sep 17 00:00:00 2001 From: Jeff Martin Date: Thu, 9 Jul 2026 22:01:30 -0500 Subject: [PATCH 0788/2098] actions: make lockfile-extension generation atomic Stage the generated model pack in a temp dir inside the WIP database and publish it with a single rename only after it is fully written, with an EXIT trap that cleans up on any failure. Previously a failed 'go build' (expected until the private actions-lockfile dependency is public) left a half-written pack dir behind (an ext/ with no qlpack.yml) that could break analyses run with --additional-packs. Verified across three cases: repo with a lockfile (atomic publish), repo without one (clean no-op), and no Go toolchain available (graceful skip, no partial pack). --- .../tools/generate-lockfile-extension.sh | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/actions/extractor/tools/generate-lockfile-extension.sh b/actions/extractor/tools/generate-lockfile-extension.sh index 7a3e89ec313e..82b3ba2ecc15 100755 --- a/actions/extractor/tools/generate-lockfile-extension.sh +++ b/actions/extractor/tools/generate-lockfile-extension.sh @@ -42,8 +42,15 @@ SCRIPT_DIR="$(CDPATH= cd "$(dirname "$0")" && pwd)" GEN_DIR="${SCRIPT_DIR}/lockfile-extension-generator" PACK_DIR="${CODEQL_EXTRACTOR_ACTIONS_WIP_DATABASE}/lockfile-extension" -EXT_DIR="${PACK_DIR}/ext" -mkdir -p "${EXT_DIR}" + +# Stage the pack in a sibling temp dir inside the database directory (same +# filesystem as the final location) so the final `mv` is an atomic rename, and +# only publish a complete pack on success -- a failure part-way through never +# leaves a half-written pack dir (e.g. an `ext/` with no `qlpack.yml`) that would +# break `--additional-packs`. +STAGE_DIR="$(mktemp -d "${CODEQL_EXTRACTOR_ACTIONS_WIP_DATABASE}/lockfile-extension.XXXXXX")" +trap 'rm -rf "${STAGE_DIR}"' EXIT +mkdir -p "${STAGE_DIR}/ext" # Resolve the generator: prefer a prebuilt binary shipped with the extractor; # otherwise build from source with the Go toolchain if it is available. @@ -52,7 +59,7 @@ RUN_GENERATOR="" if [ -x "${GEN_BIN}" ]; then RUN_GENERATOR="${GEN_BIN}" elif command -v go >/dev/null 2>&1; then - BUILT_BIN="${CODEQL_EXTRACTOR_ACTIONS_SCRATCH_DIR:-${PACK_DIR}}/lockfile-extension-generator" + BUILT_BIN="${STAGE_DIR}/lockfile-extension-generator" echo "Building lockfile-extension-generator from source with 'go build'." ( cd "${GEN_DIR}" && go build -o "${BUILT_BIN}" . ) RUN_GENERATOR="${BUILT_BIN}" @@ -61,9 +68,9 @@ else exit 0 fi -"${RUN_GENERATOR}" "${SRC_ROOT}" "${EXT_DIR}/pinned_by_lockfile.model.yml" +"${RUN_GENERATOR}" "${SRC_ROOT}" "${STAGE_DIR}/ext/pinned_by_lockfile.model.yml" -cat > "${PACK_DIR}/qlpack.yml" <<'EOF' +cat > "${STAGE_DIR}/qlpack.yml" <<'EOF' name: codeql/actions-lockfile-pins version: 0.0.1 library: true @@ -77,4 +84,10 @@ dataExtensions: - ext/*.model.yml EOF +# Publish atomically: the pack only appears in the database once fully written. +rm -f "${STAGE_DIR}/lockfile-extension-generator" +rm -rf "${PACK_DIR}" +mv "${STAGE_DIR}" "${PACK_DIR}" +trap - EXIT + echo "Wrote lockfile-pinned data extension to '${PACK_DIR}'." From 287a59c0e2abdde1410278e316030ea03ca282b0 Mon Sep 17 00:00:00 2001 From: Jeff Martin Date: Thu, 9 Jul 2026 22:12:33 -0500 Subject: [PATCH 0789/2098] actions: drop private actions-lockfile dependency from generator The generator pulled in github.com/github/actions-lockfile/go purely to parse a small, stable YAML file, which meant it could not build without a local clone of that (currently private) module -- forcing a gitignored go.work with a machine-specific replace and breaking any CI/bazel build. Parse the minimal core of the lockfile format directly instead (new lockfile.go: YAML unmarshal, pin-key parsing, and the semver major/minor/full logic), faithfully mirroring the canonical parser's semantics. The golden fixture (testdata/expected.yml) is unchanged, byte for byte, which proves the reimplementation matches. Added unit tests for parsePin, parseSemVer/isFull, and parseLockfile. The generator now depends only on gopkg.in/yaml.v3 and builds anywhere the Go toolchain is available, with no replace directive and no go.work. Verified end-to-end through the real extractor: on-demand 'go build' during database create succeeds with a stock toolchain, and the lockfile-pinned ref is still suppressed while an unlocked ref still fires. --- .../lockfile-extension-generator/.gitignore | 4 - .../lockfile-extension-generator/README.md | 28 ++-- .../lockfile-extension-generator/generator.go | 41 ++--- .../tools/lockfile-extension-generator/go.mod | 12 +- .../tools/lockfile-extension-generator/go.sum | 6 - .../lockfile-extension-generator/lockfile.go | 140 ++++++++++++++++++ .../lockfile_test.go | 92 ++++++++++++ .../lockfile-extension-generator/main.go | 4 +- 8 files changed, 272 insertions(+), 55 deletions(-) create mode 100644 actions/extractor/tools/lockfile-extension-generator/lockfile.go create mode 100644 actions/extractor/tools/lockfile-extension-generator/lockfile_test.go diff --git a/actions/extractor/tools/lockfile-extension-generator/.gitignore b/actions/extractor/tools/lockfile-extension-generator/.gitignore index b6ebbfc11b8c..554d32ee98ca 100644 --- a/actions/extractor/tools/lockfile-extension-generator/.gitignore +++ b/actions/extractor/tools/lockfile-extension-generator/.gitignore @@ -1,5 +1 @@ /lockfile-extension-generator - -# local-only module workspace carrying the actions-lockfile replace -go.work -go.work.sum diff --git a/actions/extractor/tools/lockfile-extension-generator/README.md b/actions/extractor/tools/lockfile-extension-generator/README.md index 45eff56ac63e..ed18259fc1ed 100644 --- a/actions/extractor/tools/lockfile-extension-generator/README.md +++ b/actions/extractor/tools/lockfile-extension-generator/README.md @@ -15,13 +15,14 @@ the query otherwise lacks. Feeding the lockfile's bindings into `pinnedByLockfileDataModel` lets the query suppress those references while still flagging genuinely unpinned ones. -The generator is deliberately **transport-agnostic**. It parses the lockfile -with the canonical parser at `github.com/github/actions-lockfile/go` and emits -the `[workflow_path, nwo, ref]` rows the query already matches on. Today those -rows ship as a data-extension model pack applied at analysis time via -`--model-packs` (the same mechanism as `codeql/immutable-actions-list`). The -same parsing core can later feed an extractor-native relation without changing -the query. +The generator is deliberately **transport-agnostic**. It parses the minimal, +stable core of the lockfile format directly (see `lockfile.go`) and emits the +`[workflow_path, nwo, ref]` rows the query already matches on. It has no +dependency on the `github.com/github/actions-lockfile` module, so it builds +anywhere the Go toolchain is available. Today those rows ship as a +data-extension model pack applied at analysis time via `--model-packs` (the same +mechanism as `codeql/immutable-actions-list`). The same parsing core can later +feed an extractor-native relation without changing the query. ## Extractor integration @@ -77,16 +78,19 @@ writing anything, so it is safe to run unconditionally. ## Building and testing locally -`github.com/github/actions-lockfile` is not yet public, so the module cannot be -fetched by the module proxy. Point the `replace` directive in `go.mod` at a -local clone before building or testing: +The generator depends only on `gopkg.in/yaml.v3`, so it builds and tests with a +stock Go toolchain and no special setup: ``` -go mod edit -replace github.com/github/actions-lockfile/go=/path/to/actions-lockfile/go +go build ./... go test ./... ``` -Remove the `replace` directive once actions-lockfile is published. +The golden test (`testdata/expected.yml`) pins the exact generated output for a +representative lockfile, so any change to parsing or ref normalization must be +reflected there deliberately. The lockfile parsing in `lockfile.go` mirrors the +canonical semantics of `github.com/github/actions-lockfile`; if that format +evolves, update `lockfile.go` and the golden fixture together. ## End-to-end check diff --git a/actions/extractor/tools/lockfile-extension-generator/generator.go b/actions/extractor/tools/lockfile-extension-generator/generator.go index f7b0a43495f8..1c00b24238a5 100644 --- a/actions/extractor/tools/lockfile-extension-generator/generator.go +++ b/actions/extractor/tools/lockfile-extension-generator/generator.go @@ -3,20 +3,23 @@ // `pinnedByLockfileDataModel` extensible predicate consumed by the // `actions/unpinned-tag` query. // -// The generator is deliberately transport-agnostic: it parses the lockfile with -// the canonical parser at `github.com/github/actions-lockfile/go` and emits the -// same `[workflow_path, nwo, ref]` rows the query already matches on. Today those -// rows are shipped as a data-extension model pack (applied at analysis time via -// `--model-packs`, exactly like `codeql/immutable-actions-list`). The same parsing -// core can later feed an extractor-native TRAP relation without changing the query. +// The generator is deliberately transport-agnostic: it parses the lockfile and +// emits the same `[workflow_path, nwo, ref]` rows the query already matches on. +// Today those rows are shipped as a data-extension model pack (applied at +// analysis time via `--model-packs`, exactly like `codeql/immutable-actions-list`). +// The same parsing core can later feed an extractor-native TRAP relation without +// changing the query. +// +// The lockfile format is owned by `github.com/github/actions-lockfile`; this +// generator parses the minimal, stable core it needs directly (see lockfile.go) +// so it has no dependency on that (currently private) module and builds anywhere +// the Go toolchain is available. package main import ( "fmt" "sort" "strings" - - "github.com/github/actions-lockfile/go/pkg/lockfile" ) // row is a single `pinnedByLockfileDataModel` tuple: the reference @@ -39,26 +42,26 @@ type row struct { // `uses: owner/action@v4` be recognised as pinned by a lockfile entry that // resolved to `v4.3.1`, which is the common real-world case. func rowsFromLockfile(contents []byte) ([]row, error) { - f, err := lockfile.Parse(contents) + doc, err := parseLockfile(contents) if err != nil { - return nil, fmt.Errorf("parsing lockfile: %w", err) + return nil, err } seen := make(map[row]struct{}) - for workflowPath, pinKeys := range f.Workflows { + for workflowPath, pinKeys := range doc.Workflows { for _, key := range pinKeys { - pin, ok := lockfile.ParsePin(key) + nwo, keyRef, ok := parsePin(key) if !ok { continue } // Prefer the resolved ref recorded in the dependency metadata; fall // back to the ref embedded in the pin key. - ref := pin.Ref - if dep, ok := f.Dependencies[key]; ok && dep.Ref != "" { + ref := keyRef + if dep, ok := doc.Dependencies[key]; ok && dep.Ref != "" { ref = dep.Ref } for _, r := range refVariants(ref) { - seen[row{workflowPath: workflowPath, nwo: pin.NWO, ref: r}] = struct{}{} + seen[row{workflowPath: workflowPath, nwo: nwo, ref: r}] = struct{}{} } } } @@ -84,15 +87,15 @@ func rowsFromLockfile(contents []byte) ([]row, error) { // this is the tag itself plus its major.minor (`v4.3`) and major-only (`v4`) // forms; for anything else (a branch, a partial tag, a SHA) it is just the ref. func refVariants(ref string) []string { - sv, ok := lockfile.ParseSemVer(ref) - if !ok || !sv.IsFull() { + sv, ok := parseSemVer(ref) + if !ok || !sv.isFull() { return []string{ref} } variants := []string{ref} - if minor := sv.MinorTag(); minor != ref { + if minor := sv.minorTag(); minor != ref { variants = append(variants, minor) } - if major := sv.MajorTag(); major != ref { + if major := sv.majorTag(); major != ref { variants = append(variants, major) } return variants diff --git a/actions/extractor/tools/lockfile-extension-generator/go.mod b/actions/extractor/tools/lockfile-extension-generator/go.mod index 69d91a03f69b..5fe4ede0532e 100644 --- a/actions/extractor/tools/lockfile-extension-generator/go.mod +++ b/actions/extractor/tools/lockfile-extension-generator/go.mod @@ -2,14 +2,4 @@ module github.com/github/codeql/actions/extractor/tools/lockfile-extension-gener go 1.23 -require github.com/github/actions-lockfile/go v0.0.0-00010101000000-000000000000 - -require gopkg.in/yaml.v3 v3.0.1 // indirect - -// LOCAL TESTING ONLY: github.com/github/actions-lockfile is not yet public, so it -// cannot be fetched by the module proxy. Point this at a local clone of the -// repository to build and test the generator: -// -// go mod edit -replace github.com/github/actions-lockfile/go=/path/to/actions-lockfile/go -// -// Remove this replace directive once actions-lockfile is published. +require gopkg.in/yaml.v3 v3.0.1 diff --git a/actions/extractor/tools/lockfile-extension-generator/go.sum b/actions/extractor/tools/lockfile-extension-generator/go.sum index c4c1710c475c..a62c313c5b0c 100644 --- a/actions/extractor/tools/lockfile-extension-generator/go.sum +++ b/actions/extractor/tools/lockfile-extension-generator/go.sum @@ -1,9 +1,3 @@ -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= -github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/actions/extractor/tools/lockfile-extension-generator/lockfile.go b/actions/extractor/tools/lockfile-extension-generator/lockfile.go new file mode 100644 index 000000000000..a8fd87a913fa --- /dev/null +++ b/actions/extractor/tools/lockfile-extension-generator/lockfile.go @@ -0,0 +1,140 @@ +package main + +import ( + "fmt" + "regexp" + "strconv" + "strings" + + "gopkg.in/yaml.v3" +) + +// lockfilePath is the repo-relative location of the GitHub Actions lockfile. +const lockfilePath = ".github/workflows/actions.lock" + +// lockfileDoc is the subset of the Actions lockfile (schema v0.0.2) that the +// generator needs: the per-workflow flat list of canonical pin keys, and the +// resolved ref recorded for each dependency. +// +// The full format is owned by `github.com/github/actions-lockfile`. We parse it +// directly here rather than depending on that (currently private) module so the +// generator builds anywhere the Go toolchain is available, with no module-proxy +// access to a private repository. The fields we read are a stable, minimal core +// of the format; see the schema in that repository for the authoritative shape. +type lockfileDoc struct { + Version string `yaml:"version"` + Workflows map[string][]string `yaml:"workflows"` + Dependencies map[string]lockfileDependency `yaml:"dependencies"` +} + +type lockfileDependency struct { + Ref string `yaml:"ref"` + Commit string `yaml:"commit"` +} + +func parseLockfile(contents []byte) (*lockfileDoc, error) { + var doc lockfileDoc + if err := yaml.Unmarshal(contents, &doc); err != nil { + return nil, fmt.Errorf("parsing lockfile YAML: %w", err) + } + return &doc, nil +} + +// parsePin parses a canonical lockfile pin key of the form "OWNER/REPO@REF". +// +// It mirrors `lockfile.ParsePin`: the "@" separates repo from ref, the repo +// portion must contain exactly one "/", owner and repo are lower-cased (git +// forges treat them case-insensitively) while the ref preserves its casing, and +// a ref may not be empty or contain a colon. Sub-action paths +// ("owner/repo/sub@ref") are rejected because the lockfile pins at repo+ref +// granularity. Returns ok=false for anything that does not match. +func parsePin(s string) (nwo, ref string, ok bool) { + atIdx := strings.IndexByte(s, '@') + if atIdx <= 0 || atIdx == len(s)-1 { + return "", "", false + } + repoPath := s[:atIdx] + ref = s[atIdx+1:] + + if strings.Count(repoPath, "/") != 1 { + return "", "", false + } + slashIdx := strings.IndexByte(repoPath, '/') + owner := repoPath[:slashIdx] + repo := repoPath[slashIdx+1:] + if owner == "" || repo == "" { + return "", "", false + } + if ref == "" || strings.Contains(ref, ":") { + return "", "", false + } + nwo = strings.ToLower(owner) + "/" + strings.ToLower(repo) + return nwo, ref, true +} + +// semVer holds the parsed components of a semver-ish Actions tag. The scheme is +// deliberately lax (bare "2.0.0", partial "v4"/"v4.2", arbitrary suffixes all +// appear in the wild), matching `lockfile.SemVer`. +type semVer struct { + prefix string + major int + minor int + patch int + rest string + raw string +} + +var versionRE = regexp.MustCompile(`^(v?)(\d+)(?:\.(\d+))?(?:\.(\d+))?(.*)$`) + +func parseSemVer(tag string) (semVer, bool) { + if isFullSha(tag) { + return semVer{}, false + } + m := versionRE.FindStringSubmatch(tag) + if m == nil { + return semVer{}, false + } + major, err := strconv.Atoi(m[2]) + if err != nil { + return semVer{}, false + } + minor := 0 + if m[3] != "" { + if minor, err = strconv.Atoi(m[3]); err != nil { + return semVer{}, false + } + } + patch := 0 + if m[4] != "" { + if patch, err = strconv.Atoi(m[4]); err != nil { + return semVer{}, false + } + } + return semVer{prefix: m[1], major: major, minor: minor, patch: patch, rest: m[5], raw: tag}, true +} + +func (s semVer) majorTag() string { return fmt.Sprintf("%s%d", s.prefix, s.major) } + +func (s semVer) minorTag() string { return fmt.Sprintf("%s%d.%d", s.prefix, s.major, s.minor) } + +// isFull reports whether the tag has all three components (major.minor.patch) +// and no pre-release suffix. Tags like "v4" or "v4.2" return false. Only a full +// version uniquely identifies a release, so only full versions get expanded +// into their shorter mutable forms. +func (s semVer) isFull() bool { + return s.rest == "" && s.raw != s.majorTag() && s.raw != s.minorTag() +} + +// isFullSha reports whether s looks like a full commit hash (SHA-1 or SHA-256), +// which must not be treated as a version tag. +func isFullSha(s string) bool { + if len(s) != 40 && len(s) != 64 { + return false + } + for _, c := range s { + if !((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')) { + return false + } + } + return true +} diff --git a/actions/extractor/tools/lockfile-extension-generator/lockfile_test.go b/actions/extractor/tools/lockfile-extension-generator/lockfile_test.go new file mode 100644 index 000000000000..f3f64359cac0 --- /dev/null +++ b/actions/extractor/tools/lockfile-extension-generator/lockfile_test.go @@ -0,0 +1,92 @@ +package main + +import "testing" + +func TestParsePin(t *testing.T) { + cases := []struct { + in string + wantNWO string + wantRef string + wantOK bool + }{ + {"actions/checkout@v4.3.1", "actions/checkout", "v4.3.1", true}, + {"Some-Owner/Pinned-Action@v1.2.0", "some-owner/pinned-action", "v1.2.0", true}, // owner/repo lower-cased, ref preserved + {"owner/repo@V1.2.0", "owner/repo", "V1.2.0", true}, // ref casing preserved + {"owner/repo@sha1-deadbeef", "owner/repo", "sha1-deadbeef", true}, // colon-free ref accepted + {"owner/repo", "", "", false}, // no @ + {"owner/repo@", "", "", false}, // empty ref + {"@v1", "", "", false}, // no repo path + {"owner/repo/sub@v1", "", "", false}, // sub-action path rejected + {"owneronly@v1", "", "", false}, // no slash + {"owner/repo@ref:with:colon", "", "", false}, // colon rejected + } + for _, c := range cases { + nwo, ref, ok := parsePin(c.in) + if ok != c.wantOK || nwo != c.wantNWO || ref != c.wantRef { + t.Errorf("parsePin(%q) = (%q, %q, %v), want (%q, %q, %v)", + c.in, nwo, ref, ok, c.wantNWO, c.wantRef, c.wantOK) + } + } +} + +func TestParseSemVerAndIsFull(t *testing.T) { + cases := []struct { + tag string + wantOK bool + wantFull bool + wantMajor string + wantMinor string + }{ + {"v4.3.1", true, true, "v4", "v4.3"}, + {"4.3.1", true, true, "4", "4.3"}, // bare, no "v" prefix + {"v4", true, false, "v4", "v4.0"}, + {"v4.3", true, false, "v4", "v4.3"}, + {"v2.0.0-beta.1", true, false, "v2", "v2.0"}, // pre-release: not full + {"main", false, false, "", ""}, + {"0123456789abcdef0123456789abcdef01234567", false, false, "", ""}, // 40-char SHA + } + for _, c := range cases { + sv, ok := parseSemVer(c.tag) + if ok != c.wantOK { + t.Errorf("parseSemVer(%q) ok = %v, want %v", c.tag, ok, c.wantOK) + continue + } + if !ok { + continue + } + if got := sv.isFull(); got != c.wantFull { + t.Errorf("parseSemVer(%q).isFull() = %v, want %v", c.tag, got, c.wantFull) + } + if got := sv.majorTag(); got != c.wantMajor { + t.Errorf("parseSemVer(%q).majorTag() = %q, want %q", c.tag, got, c.wantMajor) + } + if got := sv.minorTag(); got != c.wantMinor { + t.Errorf("parseSemVer(%q).minorTag() = %q, want %q", c.tag, got, c.wantMinor) + } + } +} + +func TestParseLockfile(t *testing.T) { + doc, err := parseLockfile([]byte(`version: 'v0.0.2' +workflows: + '.github/workflows/ci.yml': + - 'actions/checkout@v4.3.1' +dependencies: + 'actions/checkout@v4.3.1': + ref: 'v4.3.1' + commit: 'sha1-abc' +`)) + if err != nil { + t.Fatalf("parseLockfile: %v", err) + } + if doc.Version != "v0.0.2" { + t.Errorf("version = %q, want v0.0.2", doc.Version) + } + keys := doc.Workflows[".github/workflows/ci.yml"] + if len(keys) != 1 || keys[0] != "actions/checkout@v4.3.1" { + t.Errorf("workflows entry = %v", keys) + } + if dep := doc.Dependencies["actions/checkout@v4.3.1"]; dep.Ref != "v4.3.1" { + t.Errorf("dependency ref = %q, want v4.3.1", dep.Ref) + } +} diff --git a/actions/extractor/tools/lockfile-extension-generator/main.go b/actions/extractor/tools/lockfile-extension-generator/main.go index 417c2a848e69..4c7811a591c1 100644 --- a/actions/extractor/tools/lockfile-extension-generator/main.go +++ b/actions/extractor/tools/lockfile-extension-generator/main.go @@ -4,8 +4,6 @@ import ( "fmt" "os" "path/filepath" - - "github.com/github/actions-lockfile/go/pkg/lockfile" ) // main reads a repository's Actions lockfile and writes the corresponding @@ -27,7 +25,7 @@ func main() { } sourceRoot := os.Args[1] - lockPath := filepath.Join(sourceRoot, filepath.FromSlash(lockfile.Path)) + lockPath := filepath.Join(sourceRoot, filepath.FromSlash(lockfilePath)) contents, err := os.ReadFile(lockPath) if err != nil { if os.IsNotExist(err) { From b6a8394bc028d13f70e953eda729c75483f7b224 Mon Sep 17 00:00:00 2001 From: Jeff Martin Date: Thu, 9 Jul 2026 22:31:27 -0500 Subject: [PATCH 0790/2098] actions: emit empty data list for zero-row lockfile extension A lockfile that pins no repo-level actions (e.g. only sub-path actions like github/codeql-action/init@v3, which parsePin skips) produced a bare `data:` (YAML null) extension, which CodeQL's `resolve extensions-by-pack` rejects and aborts the analysis. Emit `data: []` for the zero-row case, matching the repo convention, and note the narrow transitive-per-path over-suppression edge in the change note. --- .../lockfile-extension-generator/generator.go | 10 +++++++++ .../generator_test.go | 22 +++++++++++++++++++ .../2026-07-09-unpinned-tag-lockfile-aware.md | 2 +- 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/actions/extractor/tools/lockfile-extension-generator/generator.go b/actions/extractor/tools/lockfile-extension-generator/generator.go index 1c00b24238a5..9bd0ee23ff6d 100644 --- a/actions/extractor/tools/lockfile-extension-generator/generator.go +++ b/actions/extractor/tools/lockfile-extension-generator/generator.go @@ -112,6 +112,16 @@ func renderExtension(rows []row) string { b.WriteString(" - addsTo:\n") b.WriteString(" pack: codeql/actions-all\n") b.WriteString(" extensible: pinnedByLockfileDataModel\n") + // `data` must be a YAML sequence. When there are no rows we must emit an + // explicit empty list (`data: []`); a bare `data:` parses as null, which + // CodeQL's extension loader rejects (`resolve extensions-by-pack` fails and + // aborts the whole analysis). Zero rows is reachable whenever a lockfile is + // present but pins no repo-level actions (e.g. only sub-path actions such as + // `github/codeql-action/init@v3`, which `parsePin` intentionally skips). + if len(rows) == 0 { + b.WriteString(" data: []\n") + return b.String() + } b.WriteString(" data:\n") for _, r := range rows { fmt.Fprintf(&b, " - [%q, %q, %q]\n", r.workflowPath, r.nwo, r.ref) diff --git a/actions/extractor/tools/lockfile-extension-generator/generator_test.go b/actions/extractor/tools/lockfile-extension-generator/generator_test.go index 512a6679dc47..cfa71e0acb9b 100644 --- a/actions/extractor/tools/lockfile-extension-generator/generator_test.go +++ b/actions/extractor/tools/lockfile-extension-generator/generator_test.go @@ -2,6 +2,7 @@ package main import ( "os" + "strings" "testing" ) @@ -89,3 +90,24 @@ func TestRenderExtensionMatchesGolden(t *testing.T) { t.Errorf("rendered extension does not match testdata/expected.yml:\n--- got ---\n%s", got) } } + +func TestRenderExtensionZeroRowsEmitsEmptyList(t *testing.T) { + // A lockfile that pins only sub-path actions (skipped by parsePin) or an + // empty `workflows` map yields zero rows while a lockfile is present. The + // rendered extension must use `data: []`, not a bare `data:` (YAML null), + // which CodeQL's extension loader rejects and which aborts the analysis. + rows, err := rowsFromLockfile([]byte("version: \"v0.0.2\"\nworkflows:\n \".github/workflows/ci.yml\":\n - \"github/codeql-action/init@v3\"\ndependencies: {}\n")) + if err != nil { + t.Fatalf("rowsFromLockfile: %v", err) + } + if len(rows) != 0 { + t.Fatalf("expected zero rows for a sub-path-only lockfile, got %d: %v", len(rows), rows) + } + got := renderExtension(rows) + if !strings.Contains(got, "data: []") { + t.Errorf("zero-row extension must emit `data: []`, got:\n%s", got) + } + if strings.Contains(got, "data:\n") { + t.Errorf("zero-row extension must not emit a null `data:` line, got:\n%s", got) + } +} diff --git a/actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md b/actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md index 35059072fcf1..a2f3332b4e4f 100644 --- a/actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md +++ b/actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md @@ -1,4 +1,4 @@ --- category: minorAnalysis --- -* The `actions/unpinned-tag` query no longer reports `uses:` references that are recorded as pinned by a repository's Actions lockfile (`.github/workflows/actions.lock`) via the new `pinnedByLockfileDataModel` extensible predicate. The CodeQL Actions extractor generates this data at database-creation time into a database-local model pack (`codeql/actions-lockfile-pins`); references are suppressed only when that pack is supplied to analysis (for example via `--model-packs`), so behaviour is unchanged for repositories without a lockfile or analyses that do not opt in. +* The `actions/unpinned-tag` query no longer reports `uses:` references that are recorded as pinned by a repository's Actions lockfile (`.github/workflows/actions.lock`) via the new `pinnedByLockfileDataModel` extensible predicate. The CodeQL Actions extractor generates this data at database-creation time into a database-local model pack (`codeql/actions-lockfile-pins`); references are suppressed only when that pack is supplied to analysis (for example via `--model-packs`), so behaviour is unchanged for repositories without a lockfile or analyses that do not opt in. Because the lockfile keys its pins transitively by workflow path, a stale lockfile could in rare cases suppress a directly-written unpinned tag that shares an action and major version with a transitively-pinned dependency of the same workflow; keeping the lockfile current avoids this. From f8f8aa8a62b0db6d838191007d201e4308636c2f Mon Sep 17 00:00:00 2001 From: Jeff Martin Date: Mon, 13 Jul 2026 18:28:02 -0500 Subject: [PATCH 0791/2098] actions/unpinned-tag: match lockfile pins case-insensitively on owner/repo The lockfile generator lower-cases owner/repo (GitHub treats them case-insensitively) while preserving the ref, so a mixed-case ref such as `uses: Azure/login@v1` never matched the lowercase pinnedByLockfileDataModel row and was still reported as unpinned. Lower-case nwo only for the data-model lookup, keeping source casing in the alert message. Adds a mixed-case suppression test plus a mixed-case control that must still fire. --- actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql | 8 +++++++- .../CWE-829/.github/workflows/lockfile_pinned.yml | 8 ++++++++ .../Security/CWE-829/UnpinnedActionsTag.expected | 1 + .../Security/CWE-829/UntrustedCheckoutCritical.expected | 2 ++ .../Security/CWE-829/pinned_by_lockfile.model.yml | 3 +++ 5 files changed, 21 insertions(+), 1 deletion(-) diff --git a/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql b/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql index 6c75d32e5074..ae56feee3de5 100644 --- a/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql +++ b/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql @@ -44,8 +44,14 @@ private predicate isSelfRepository(string nwo) { nwo.matches("$/%") } // predicate is populated by the CodeQL Actions extractor when it parses the lockfile at // database-creation time; until then this is a clean no-op and no lockfile-pinned refs are // suppressed. See `pinnedByLockfileDataModel` in `ConfigExtensions.qll` for the intended shape. +bindingset[nwo] private predicate pinnedByLockfile(UsesStep uses, string nwo, string version) { - pinnedByLockfileDataModel(uses.getLocation().getFile().getRelativePath(), nwo, version) + // The lockfile generator lower-cases owner/repo (GitHub treats them + // case-insensitively) but preserves the ref, so match `nwo` case-insensitively + // and `version` exactly. `nwo` keeps its source casing everywhere else (e.g. the + // alert message) so authors still see the ref as written. + pinnedByLockfileDataModel(uses.getLocation().getFile().getRelativePath(), nwo.toLowerCase(), + version) } private predicate hasUsesContainerName(Uses uses, string name) { diff --git a/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/lockfile_pinned.yml b/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/lockfile_pinned.yml index efc5c986a3b9..53a41e96e057 100644 --- a/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/lockfile_pinned.yml +++ b/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/lockfile_pinned.yml @@ -15,3 +15,11 @@ jobs: # Negative control is provided for free by the many other fixtures in this directory whose tag # refs are NOT recorded in the data extension and therefore remain reported. - uses: some-owner/pinned-action@v1 + # `Mixed-Owner/Pinned-Action@v1` is pinned by the lockfile too, but written with the mixed-case + # owner/repo that authors commonly use (Azure, GoogleCloudPlatform, ...). The generator emits + # the lockfile nwo lower-cased, so the query must match owner/repo case-insensitively; this ref + # is therefore expected to be suppressed (no finding). + - uses: Mixed-Owner/Pinned-Action@v1 + # Negative control: a mixed-case ref that is NOT recorded in the lockfile data must still be + # reported, guarding against over-suppression of every mixed-case ref. + - uses: Mixed-Owner/Unpinned-Action@v2 diff --git a/actions/ql/test/query-tests/Security/CWE-829/UnpinnedActionsTag.expected b/actions/ql/test/query-tests/Security/CWE-829/UnpinnedActionsTag.expected index 05f9cf3d8fd5..71ca2adb9f3b 100644 --- a/actions/ql/test/query-tests/Security/CWE-829/UnpinnedActionsTag.expected +++ b/actions/ql/test/query-tests/Security/CWE-829/UnpinnedActionsTag.expected @@ -21,6 +21,7 @@ | .github/workflows/label_trusted_checkout2.yml:21:13:21:36 | completely/fakeaction@v2 | Unpinned 3rd party Action 'label_trusted_checkout2.yml' step $@ uses 'completely/fakeaction' with ref 'v2', not a pinned commit hash | .github/workflows/label_trusted_checkout2.yml:21:7:25:4 | Uses Step | Uses Step | | .github/workflows/label_trusted_checkout2.yml:25:13:25:37 | fakerepo/comment-on-pr@v1 | Unpinned 3rd party Action 'label_trusted_checkout2.yml' step $@ uses 'fakerepo/comment-on-pr' with ref 'v1', not a pinned commit hash | .github/workflows/label_trusted_checkout2.yml:25:7:28:21 | Uses Step | Uses Step | | .github/workflows/level0.yml:36:15:36:47 | rlespinasse/github-slug-action@v4 | Unpinned 3rd party Action 'Poutine Level 0' step $@ uses 'rlespinasse/github-slug-action' with ref 'v4', not a pinned commit hash | .github/workflows/level0.yml:36:9:39:6 | Uses Step | Uses Step | +| .github/workflows/lockfile_pinned.yml:25:13:25:42 | Mixed-Owner/Unpinned-Action@v2 | Unpinned 3rd party Action 'lockfile_pinned.yml' step $@ uses 'Mixed-Owner/Unpinned-Action' with ref 'v2', not a pinned commit hash | .github/workflows/lockfile_pinned.yml:25:7:25:43 | Uses Step | Uses Step | | .github/workflows/mend.yml:31:15:31:34 | ruby/setup-ruby@v1 | Unpinned 3rd party Action 'Test' step $@ uses 'ruby/setup-ruby' with ref 'v1', not a pinned commit hash | .github/workflows/mend.yml:29:9:33:28 | Uses Step | Uses Step | | .github/workflows/pr-workflow.yml:60:15:60:52 | amannn/action-semantic-pull-request@v5 | Unpinned 3rd party Action 'pr-workflow' step $@ uses 'amannn/action-semantic-pull-request' with ref 'v5', not a pinned commit hash | .github/workflows/pr-workflow.yml:60:9:70:6 | Uses Step | Uses Step | | .github/workflows/pr-workflow.yml:109:15:109:42 | actionsdesk/lfs-warning@v3.2 | Unpinned 3rd party Action 'pr-workflow' step $@ uses 'actionsdesk/lfs-warning' with ref 'v3.2', not a pinned commit hash | .github/workflows/pr-workflow.yml:109:9:124:6 | Uses Step | Uses Step | diff --git a/actions/ql/test/query-tests/Security/CWE-829/UntrustedCheckoutCritical.expected b/actions/ql/test/query-tests/Security/CWE-829/UntrustedCheckoutCritical.expected index 32999ec70e27..2d293ce0de3c 100644 --- a/actions/ql/test/query-tests/Security/CWE-829/UntrustedCheckoutCritical.expected +++ b/actions/ql/test/query-tests/Security/CWE-829/UntrustedCheckoutCritical.expected @@ -170,6 +170,8 @@ edges | .github/workflows/level0.yml:125:9:129:6 | Uses Step | .github/workflows/level0.yml:129:9:133:6 | Uses Step | | .github/workflows/level0.yml:128:17:128:57 | github.event.pull_request.head.sha | .github/workflows/level0.yml:125:9:129:6 | Uses Step | | .github/workflows/level0.yml:129:9:133:6 | Uses Step | .github/workflows/level0.yml:133:9:135:23 | Run Step | +| .github/workflows/lockfile_pinned.yml:17:7:22:4 | Uses Step | .github/workflows/lockfile_pinned.yml:22:7:25:4 | Uses Step | +| .github/workflows/lockfile_pinned.yml:22:7:25:4 | Uses Step | .github/workflows/lockfile_pinned.yml:25:7:25:43 | Uses Step | | .github/workflows/mend.yml:13:9:22:6 | Run Step: set_ref | .github/workflows/mend.yml:22:9:29:6 | Uses Step | | .github/workflows/mend.yml:22:9:29:6 | Uses Step | .github/workflows/mend.yml:29:9:33:28 | Uses Step | | .github/workflows/mend.yml:27:17:27:48 | steps.set_ref.outputs.ref | .github/workflows/mend.yml:22:9:29:6 | Uses Step | diff --git a/actions/ql/test/query-tests/Security/CWE-829/pinned_by_lockfile.model.yml b/actions/ql/test/query-tests/Security/CWE-829/pinned_by_lockfile.model.yml index 4853fc5a265e..6e78ddf7dfeb 100644 --- a/actions/ql/test/query-tests/Security/CWE-829/pinned_by_lockfile.model.yml +++ b/actions/ql/test/query-tests/Security/CWE-829/pinned_by_lockfile.model.yml @@ -8,3 +8,6 @@ extensions: # query suppresses it. data: - [".github/workflows/lockfile_pinned.yml", "some-owner/pinned-action", "v1"] + # Lower-cased form of `Mixed-Owner/Pinned-Action@v1`, as the generator emits it. Exercises the + # case-insensitive owner/repo match in the `actions/unpinned-tag` query. + - [".github/workflows/lockfile_pinned.yml", "mixed-owner/pinned-action", "v1"] From 2db34d2b50fed205439dce3ea7567aa737e0b7cb Mon Sep 17 00:00:00 2001 From: Jeff Martin Date: Mon, 13 Jul 2026 18:28:04 -0500 Subject: [PATCH 0792/2098] actions: use US spelling in lockfile-aware pinning comments behaviour -> behavior, recognised -> recognized, serialises -> serializes across the lockfile-aware pinning comments and change notes. Comments/docs only; no logic change. --- .../extractor/tools/lockfile-extension-generator/generator.go | 4 ++-- actions/ql/lib/change-notes/2026-07-09-pinned-by-lockfile.md | 2 +- actions/ql/lib/codeql/actions/config/ConfigExtensions.qll | 2 +- actions/ql/lib/ext/config/pinned_by_lockfile.yml | 2 +- .../change-notes/2026-07-09-unpinned-tag-lockfile-aware.md | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/actions/extractor/tools/lockfile-extension-generator/generator.go b/actions/extractor/tools/lockfile-extension-generator/generator.go index 9bd0ee23ff6d..1a55dcfabdf5 100644 --- a/actions/extractor/tools/lockfile-extension-generator/generator.go +++ b/actions/extractor/tools/lockfile-extension-generator/generator.go @@ -39,7 +39,7 @@ type row struct { // shorter, mutable tag such as `v4` or `v4.3` in `uses:`. The query matches on // the ref exactly as written, so for every full-semver resolved ref we also // emit its major-only (`v4`) and major.minor (`v4.3`) forms. This lets a -// `uses: owner/action@v4` be recognised as pinned by a lockfile entry that +// `uses: owner/action@v4` be recognized as pinned by a lockfile entry that // resolved to `v4.3.1`, which is the common real-world case. func rowsFromLockfile(contents []byte) ([]row, error) { doc, err := parseLockfile(contents) @@ -101,7 +101,7 @@ func refVariants(ref string) []string { return variants } -// renderExtension serialises `rows` as a CodeQL data-extension YAML document that +// renderExtension serializes `rows` as a CodeQL data-extension YAML document that // adds to the `pinnedByLockfileDataModel` extensible predicate in // `codeql/actions-all`. func renderExtension(rows []row) string { diff --git a/actions/ql/lib/change-notes/2026-07-09-pinned-by-lockfile.md b/actions/ql/lib/change-notes/2026-07-09-pinned-by-lockfile.md index 7020d4418631..30ba217f7d1f 100644 --- a/actions/ql/lib/change-notes/2026-07-09-pinned-by-lockfile.md +++ b/actions/ql/lib/change-notes/2026-07-09-pinned-by-lockfile.md @@ -1,4 +1,4 @@ --- category: minorAnalysis --- -* Added a new extensible predicate `pinnedByLockfileDataModel(workflow_path, nwo, ref)`, which records `uses:` references that are pinned by a repository's Actions lockfile (`.github/workflows/actions.lock`). The CodeQL Actions extractor generates this data at database-creation time into a database-local model pack (`codeql/actions-lockfile-pins`); it has no effect unless that pack is supplied to analysis (for example via `--model-packs`), so behaviour is unchanged for repositories without a lockfile or analyses that do not opt in. +* Added a new extensible predicate `pinnedByLockfileDataModel(workflow_path, nwo, ref)`, which records `uses:` references that are pinned by a repository's Actions lockfile (`.github/workflows/actions.lock`). The CodeQL Actions extractor generates this data at database-creation time into a database-local model pack (`codeql/actions-lockfile-pins`); it has no effect unless that pack is supplied to analysis (for example via `--model-packs`), so behavior is unchanged for repositories without a lockfile or analyses that do not opt in. diff --git a/actions/ql/lib/codeql/actions/config/ConfigExtensions.qll b/actions/ql/lib/codeql/actions/config/ConfigExtensions.qll index 69a3a6972cea..89774d3160c2 100644 --- a/actions/ql/lib/codeql/actions/config/ConfigExtensions.qll +++ b/actions/ql/lib/codeql/actions/config/ConfigExtensions.qll @@ -78,7 +78,7 @@ extensible predicate trustedActionsOwnerDataModel(string owner); * `github.com/github/actions-lockfile/go`. Each lockfile entry binds an `nwo`@`ref` to a * verified commit SHA, which is exactly the pinning evidence the `actions/unpinned-tag` query * otherwise lacks. Until the extractor populates this predicate it is empty, so any clause that - * consumes it is a clean no-op and behaviour is unchanged for repositories without a lockfile. + * consumes it is a clean no-op and behavior is unchanged for repositories without a lockfile. * * Fields: * - `workflow_path`: repo-relative path of the file containing the `uses:` reference, diff --git a/actions/ql/lib/ext/config/pinned_by_lockfile.yml b/actions/ql/lib/ext/config/pinned_by_lockfile.yml index d2b3ad2f3977..f0116051557c 100644 --- a/actions/ql/lib/ext/config/pinned_by_lockfile.yml +++ b/actions/ql/lib/ext/config/pinned_by_lockfile.yml @@ -15,6 +15,6 @@ extensions: # - [".github/workflows/ci.yml", "actions/checkout", "v4"] # # Until the extractor populates this predicate it stays empty, so the - # `not pinnedByLockfile(...)` clause in `actions/unpinned-tag` is a no-op and behaviour is + # `not pinnedByLockfile(...)` clause in `actions/unpinned-tag` is a no-op and behavior is # unchanged for repositories without a lockfile. data: [] diff --git a/actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md b/actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md index a2f3332b4e4f..54e4b23d0f7f 100644 --- a/actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md +++ b/actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md @@ -1,4 +1,4 @@ --- category: minorAnalysis --- -* The `actions/unpinned-tag` query no longer reports `uses:` references that are recorded as pinned by a repository's Actions lockfile (`.github/workflows/actions.lock`) via the new `pinnedByLockfileDataModel` extensible predicate. The CodeQL Actions extractor generates this data at database-creation time into a database-local model pack (`codeql/actions-lockfile-pins`); references are suppressed only when that pack is supplied to analysis (for example via `--model-packs`), so behaviour is unchanged for repositories without a lockfile or analyses that do not opt in. Because the lockfile keys its pins transitively by workflow path, a stale lockfile could in rare cases suppress a directly-written unpinned tag that shares an action and major version with a transitively-pinned dependency of the same workflow; keeping the lockfile current avoids this. +* The `actions/unpinned-tag` query no longer reports `uses:` references that are recorded as pinned by a repository's Actions lockfile (`.github/workflows/actions.lock`) via the new `pinnedByLockfileDataModel` extensible predicate. The CodeQL Actions extractor generates this data at database-creation time into a database-local model pack (`codeql/actions-lockfile-pins`); references are suppressed only when that pack is supplied to analysis (for example via `--model-packs`), so behavior is unchanged for repositories without a lockfile or analyses that do not opt in. Because the lockfile keys its pins transitively by workflow path, a stale lockfile could in rare cases suppress a directly-written unpinned tag that shares an action and major version with a transitively-pinned dependency of the same workflow; keeping the lockfile current avoids this. From 77ac6d95b424710c17e741f3773be394215c6acc Mon Sep 17 00:00:00 2001 From: Jeff Martin Date: Thu, 23 Jul 2026 09:47:09 -0500 Subject: [PATCH 0793/2098] actions: drop lockfile-extension generator from unpinned-tag PR Removes the Go lockfile-extension-generator tool and its extractor autobuild hook, keeping this PR to its intended discussion scope: the $/ self-repository suppression plus the QL seam (pinnedByLockfileDataModel extensible predicate and the not pinnedByLockfile(...) clause). Parsing actions.lock and populating the predicate is extractor-team work on the CodeQL CLI cycle, and the tool here reimplemented the canonical parser at github.com/github/actions-lockfile rather than depending on it, so it would drift. It also wrote a model pack into the database that CodeQL does not auto-apply, so it never took effect without extra analysis flags. Better to scaffold the seam and let the extractor own population. Reverts the additions to actions/extractor/tools/autobuild.sh and deletes actions/extractor/tools/generate-lockfile-extension.sh and actions/extractor/tools/lockfile-extension-generator/. Query behavior and test expected output are unchanged; the CWE-829 query tests still pass. --- actions/extractor/tools/autobuild.sh | 14 -- .../tools/generate-lockfile-extension.sh | 93 ------------ .../lockfile-extension-generator/.gitignore | 1 - .../lockfile-extension-generator/README.md | 120 --------------- .../lockfile-extension-generator/generator.go | 130 ---------------- .../generator_test.go | 113 -------------- .../tools/lockfile-extension-generator/go.mod | 5 - .../tools/lockfile-extension-generator/go.sum | 4 - .../lockfile-extension-generator/lockfile.go | 140 ------------------ .../lockfile_test.go | 92 ------------ .../lockfile-extension-generator/main.go | 55 ------- .../testdata/actions.lock | 19 --- .../testdata/expected.yml | 16 -- .../Security/CWE-829/UnpinnedActionsTag.ql | 4 +- .../.github/workflows/lockfile_pinned.yml | 2 +- .../CWE-829/pinned_by_lockfile.model.yml | 2 +- 16 files changed, 4 insertions(+), 806 deletions(-) delete mode 100755 actions/extractor/tools/generate-lockfile-extension.sh delete mode 100644 actions/extractor/tools/lockfile-extension-generator/.gitignore delete mode 100644 actions/extractor/tools/lockfile-extension-generator/README.md delete mode 100644 actions/extractor/tools/lockfile-extension-generator/generator.go delete mode 100644 actions/extractor/tools/lockfile-extension-generator/generator_test.go delete mode 100644 actions/extractor/tools/lockfile-extension-generator/go.mod delete mode 100644 actions/extractor/tools/lockfile-extension-generator/go.sum delete mode 100644 actions/extractor/tools/lockfile-extension-generator/lockfile.go delete mode 100644 actions/extractor/tools/lockfile-extension-generator/lockfile_test.go delete mode 100644 actions/extractor/tools/lockfile-extension-generator/main.go delete mode 100644 actions/extractor/tools/lockfile-extension-generator/testdata/actions.lock delete mode 100644 actions/extractor/tools/lockfile-extension-generator/testdata/expected.yml diff --git a/actions/extractor/tools/autobuild.sh b/actions/extractor/tools/autobuild.sh index e66b6d8ea68f..c2794044ee64 100755 --- a/actions/extractor/tools/autobuild.sh +++ b/actions/extractor/tools/autobuild.sh @@ -38,11 +38,6 @@ else export LGTM_INDEX_FILTERS fi -# Capture the source root before handing off to the JavaScript autobuilder, -# which may change the working directory. The Actions extractor runs from the -# source root, so `pwd` here is the root of the repository being analysed. -ACTIONS_SRC_ROOT="$(pwd)" - # Find the JavaScript extractor directory via `codeql resolve extractor`. CODEQL_EXTRACTOR_JAVASCRIPT_ROOT="$("${CODEQL_DIST}/codeql" resolve extractor --language javascript)" export CODEQL_EXTRACTOR_JAVASCRIPT_ROOT @@ -61,12 +56,3 @@ env CODEQL_EXTRACTOR_JAVASCRIPT_DIAGNOSTIC_DIR="${CODEQL_EXTRACTOR_ACTIONS_DIAGN CODEQL_EXTRACTOR_JAVASCRIPT_TRAP_DIR="${CODEQL_EXTRACTOR_ACTIONS_TRAP_DIR}" \ CODEQL_EXTRACTOR_JAVASCRIPT_WIP_DATABASE="${CODEQL_EXTRACTOR_ACTIONS_WIP_DATABASE}" \ "${JAVASCRIPT_AUTO_BUILD}" - -# Generate the lockfile-pinned data extension from the repository's Actions -# lockfile, if present. This is a no-op for repositories without a lockfile. -GENERATE_LOCKFILE_EXTENSION="$(CDPATH= cd "$(dirname "$0")" && pwd)/generate-lockfile-extension.sh" -if [ -x "${GENERATE_LOCKFILE_EXTENSION}" ]; then - echo "Generating lockfile-pinned data extension." - "${GENERATE_LOCKFILE_EXTENSION}" "${ACTIONS_SRC_ROOT}" || \ - echo "Lockfile-pinned data extension generation failed; continuing without it." >&2 -fi diff --git a/actions/extractor/tools/generate-lockfile-extension.sh b/actions/extractor/tools/generate-lockfile-extension.sh deleted file mode 100755 index 82b3ba2ecc15..000000000000 --- a/actions/extractor/tools/generate-lockfile-extension.sh +++ /dev/null @@ -1,93 +0,0 @@ -#!/bin/sh - -# Generates a CodeQL data extension that records the `uses:` references pinned by -# the repository's GitHub Actions lockfile (`.github/workflows/actions.lock`), -# populating the `pinnedByLockfileDataModel` extensible predicate consumed by the -# `actions/unpinned-tag` query. -# -# It is invoked by the Actions extractor autobuild during `codeql database -# create`. The generated extension is written into the database as a -# self-contained model pack under: -# -# /lockfile-extension/ -# qlpack.yml -# ext/pinned_by_lockfile.model.yml -# -# CodeQL does not auto-apply extensions carried inside a database, so analysis -# must add this pack explicitly, e.g.: -# -# codeql database analyze ... \ -# --additional-packs /lockfile-extension \ -# --model-packs codeql/actions-lockfile-pins -# -# The step is a clean no-op when the repository has no lockfile, so it is safe to -# run against every database. - -set -eu - -SRC_ROOT="${1:?usage: generate-lockfile-extension.sh }" -LOCKFILE="${SRC_ROOT}/.github/workflows/actions.lock" - -if [ ! -f "${LOCKFILE}" ]; then - echo "No Actions lockfile at '${LOCKFILE}'; skipping lockfile-pinned extension." - exit 0 -fi - -if [ -z "${CODEQL_EXTRACTOR_ACTIONS_WIP_DATABASE:-}" ]; then - echo "CODEQL_EXTRACTOR_ACTIONS_WIP_DATABASE is not set; cannot write lockfile extension." >&2 - exit 0 -fi - -SCRIPT_DIR="$(CDPATH= cd "$(dirname "$0")" && pwd)" -GEN_DIR="${SCRIPT_DIR}/lockfile-extension-generator" - -PACK_DIR="${CODEQL_EXTRACTOR_ACTIONS_WIP_DATABASE}/lockfile-extension" - -# Stage the pack in a sibling temp dir inside the database directory (same -# filesystem as the final location) so the final `mv` is an atomic rename, and -# only publish a complete pack on success -- a failure part-way through never -# leaves a half-written pack dir (e.g. an `ext/` with no `qlpack.yml`) that would -# break `--additional-packs`. -STAGE_DIR="$(mktemp -d "${CODEQL_EXTRACTOR_ACTIONS_WIP_DATABASE}/lockfile-extension.XXXXXX")" -trap 'rm -rf "${STAGE_DIR}"' EXIT -mkdir -p "${STAGE_DIR}/ext" - -# Resolve the generator: prefer a prebuilt binary shipped with the extractor; -# otherwise build from source with the Go toolchain if it is available. -GEN_BIN="${GEN_DIR}/bin/lockfile-extension-generator" -RUN_GENERATOR="" -if [ -x "${GEN_BIN}" ]; then - RUN_GENERATOR="${GEN_BIN}" -elif command -v go >/dev/null 2>&1; then - BUILT_BIN="${STAGE_DIR}/lockfile-extension-generator" - echo "Building lockfile-extension-generator from source with 'go build'." - ( cd "${GEN_DIR}" && go build -o "${BUILT_BIN}" . ) - RUN_GENERATOR="${BUILT_BIN}" -else - echo "No lockfile-extension-generator binary and no Go toolchain; skipping lockfile-pinned extension." >&2 - exit 0 -fi - -"${RUN_GENERATOR}" "${SRC_ROOT}" "${STAGE_DIR}/ext/pinned_by_lockfile.model.yml" - -cat > "${STAGE_DIR}/qlpack.yml" <<'EOF' -name: codeql/actions-lockfile-pins -version: 0.0.1 -library: true -warnOnImplicitThis: true -# Generated per-database from the repository's Actions lockfile by the Actions -# extractor. Apply it at analysis time with `--model-packs -# codeql/actions-lockfile-pins` (and `--additional-packs /lockfile-extension`). -extensionTargets: - codeql/actions-all: "*" -dataExtensions: - - ext/*.model.yml -EOF - -# Publish atomically: the pack only appears in the database once fully written. -rm -f "${STAGE_DIR}/lockfile-extension-generator" -rm -rf "${PACK_DIR}" -mv "${STAGE_DIR}" "${PACK_DIR}" -trap - EXIT - -echo "Wrote lockfile-pinned data extension to '${PACK_DIR}'." diff --git a/actions/extractor/tools/lockfile-extension-generator/.gitignore b/actions/extractor/tools/lockfile-extension-generator/.gitignore deleted file mode 100644 index 554d32ee98ca..000000000000 --- a/actions/extractor/tools/lockfile-extension-generator/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/lockfile-extension-generator diff --git a/actions/extractor/tools/lockfile-extension-generator/README.md b/actions/extractor/tools/lockfile-extension-generator/README.md deleted file mode 100644 index ed18259fc1ed..000000000000 --- a/actions/extractor/tools/lockfile-extension-generator/README.md +++ /dev/null @@ -1,120 +0,0 @@ -# lockfile-extension-generator - -Turns a repository's GitHub Actions lockfile (`.github/workflows/actions.lock`) -into a CodeQL data extension that populates the `pinnedByLockfileDataModel` -extensible predicate consumed by the `actions/unpinned-tag` -(`js/actions/actions-workflow-unpinned-tag`) query. - -## Why - -`actions/unpinned-tag` flags `uses:` references pinned to a mutable tag (e.g. -`actions/checkout@v4`) rather than an immutable commit SHA. When a repository -maintains an Actions lockfile, every such tag is already bound to a verified -commit SHA at run time by the lockfile — which is exactly the pinning evidence -the query otherwise lacks. Feeding the lockfile's bindings into -`pinnedByLockfileDataModel` lets the query suppress those references while still -flagging genuinely unpinned ones. - -The generator is deliberately **transport-agnostic**. It parses the minimal, -stable core of the lockfile format directly (see `lockfile.go`) and emits the -`[workflow_path, nwo, ref]` rows the query already matches on. It has no -dependency on the `github.com/github/actions-lockfile` module, so it builds -anywhere the Go toolchain is available. Today those rows ship as a -data-extension model pack applied at analysis time via `--model-packs` (the same -mechanism as `codeql/immutable-actions-list`). The same parsing core can later -feed an extractor-native relation without changing the query. - -## Extractor integration - -The Actions extractor runs this generator automatically during `codeql database -create` (see `../generate-lockfile-extension.sh`, invoked from -`../autobuild.sh`). When the repository has a lockfile, the extractor writes a -self-contained model pack into the database: - -``` -/lockfile-extension/ - qlpack.yml # name: codeql/actions-lockfile-pins - ext/pinned_by_lockfile.model.yml # generated pinnedByLockfileDataModel rows -``` - -CodeQL does not auto-apply extensions carried inside a database, so analysis -must add this pack explicitly: - -``` -codeql database analyze \ - codeql/actions-queries:Security/CWE-829/UnpinnedActionsTag.ql \ - --additional-packs /lockfile-extension \ - --model-packs codeql/actions-lockfile-pins -``` - -Wiring that flag into the analysis harness (e.g. the CodeQL Action) is the -remaining integration step and lives outside this repository. Generation is a -clean no-op for repositories without a lockfile, so the extractor step is safe -to run unconditionally. - -## Ref normalization - -A lockfile records the *resolved* ref for each dependency — the CLI prefers a -full semver tag such as `v4.3.1`. A workflow author, however, usually writes a -shorter, mutable tag such as `v4` or `v4.3` in `uses:`, and the query matches on -the ref exactly as written. For every full-semver resolved ref the generator -therefore also emits its major.minor (`v4.3`) and major-only (`v4`) forms, so a -`uses: owner/action@v4` is recognized as pinned by a lockfile entry that -resolved to `v4.3.1`. Partial tags, pre-release tags, branches, and SHAs pass -through unchanged. - -## Usage - -``` -lockfile-extension-generator [output-file] -``` - -- ``: repository root to scan; the lockfile is read from - `/.github/workflows/actions.lock`. -- `[output-file]`: destination for the extension YAML; defaults to stdout. - -If the repository has no lockfile the generator exits successfully without -writing anything, so it is safe to run unconditionally. - -## Building and testing locally - -The generator depends only on `gopkg.in/yaml.v3`, so it builds and tests with a -stock Go toolchain and no special setup: - -``` -go build ./... -go test ./... -``` - -The golden test (`testdata/expected.yml`) pins the exact generated output for a -representative lockfile, so any change to parsing or ref normalization must be -reflected there deliberately. The lockfile parsing in `lockfile.go` mirrors the -canonical semantics of `github.com/github/actions-lockfile`; if that format -evolves, update `lockfile.go` and the golden fixture together. - -## End-to-end check - -``` -# A repo whose workflow writes `uses: owner/action@v4` while the lockfile -# resolves it to v4.3.1: -lockfile-extension-generator /path/to/repo /tmp/pack/ext/pinned.yml -codeql database analyze \ - codeql/actions-queries:Security/CWE-829/UnpinnedActionsTag.ql \ - --additional-packs=/tmp/pack --model-packs= -``` - -The lockfile-pinned reference is suppressed; references not covered by the -lockfile are still reported. - -## Limitations - -- **Composite actions.** A lockfile records each workflow's *transitive* pin - list keyed by the workflow path. A `uses:` that appears only inside a - composite action file (`.github/actions/*/action.yml`) is therefore not - emitted against that action file's own path, so the query does not suppress - it. This is a completeness gap, not a correctness one: it can only leave a - reference reported, never wrongly suppress one, because a row is only ever - emitted for a `(path, nwo, ref)` the lockfile actually pins. -- **Ref forms the lockfile can't cover.** Only the resolved ref and its - major/major.minor forms are emitted. A `uses:` written with an unrelated tag - or a moving branch that the lockfile did not resolve from is not matched. diff --git a/actions/extractor/tools/lockfile-extension-generator/generator.go b/actions/extractor/tools/lockfile-extension-generator/generator.go deleted file mode 100644 index 1a55dcfabdf5..000000000000 --- a/actions/extractor/tools/lockfile-extension-generator/generator.go +++ /dev/null @@ -1,130 +0,0 @@ -// Package main implements a generator that turns a repository's Actions lockfile -// (`.github/workflows/actions.lock`) into a CodeQL data extension populating the -// `pinnedByLockfileDataModel` extensible predicate consumed by the -// `actions/unpinned-tag` query. -// -// The generator is deliberately transport-agnostic: it parses the lockfile and -// emits the same `[workflow_path, nwo, ref]` rows the query already matches on. -// Today those rows are shipped as a data-extension model pack (applied at -// analysis time via `--model-packs`, exactly like `codeql/immutable-actions-list`). -// The same parsing core can later feed an extractor-native TRAP relation without -// changing the query. -// -// The lockfile format is owned by `github.com/github/actions-lockfile`; this -// generator parses the minimal, stable core it needs directly (see lockfile.go) -// so it has no dependency on that (currently private) module and builds anywhere -// the Go toolchain is available. -package main - -import ( - "fmt" - "sort" - "strings" -) - -// row is a single `pinnedByLockfileDataModel` tuple: the reference -// `nwo`@`ref` in the workflow or composite action file at `workflowPath` is -// pinned by the repository's Actions lockfile. -type row struct { - workflowPath string - nwo string - ref string -} - -// rowsFromLockfile parses lockfile `contents` and returns the deduplicated, -// sorted set of `pinnedByLockfileDataModel` rows it implies. -// -// A lockfile records the *resolved* ref for each dependency (the CLI prefers a -// full semver tag such as `v4.3.1`), but a workflow author usually writes a -// shorter, mutable tag such as `v4` or `v4.3` in `uses:`. The query matches on -// the ref exactly as written, so for every full-semver resolved ref we also -// emit its major-only (`v4`) and major.minor (`v4.3`) forms. This lets a -// `uses: owner/action@v4` be recognized as pinned by a lockfile entry that -// resolved to `v4.3.1`, which is the common real-world case. -func rowsFromLockfile(contents []byte) ([]row, error) { - doc, err := parseLockfile(contents) - if err != nil { - return nil, err - } - - seen := make(map[row]struct{}) - for workflowPath, pinKeys := range doc.Workflows { - for _, key := range pinKeys { - nwo, keyRef, ok := parsePin(key) - if !ok { - continue - } - // Prefer the resolved ref recorded in the dependency metadata; fall - // back to the ref embedded in the pin key. - ref := keyRef - if dep, ok := doc.Dependencies[key]; ok && dep.Ref != "" { - ref = dep.Ref - } - for _, r := range refVariants(ref) { - seen[row{workflowPath: workflowPath, nwo: nwo, ref: r}] = struct{}{} - } - } - } - - rows := make([]row, 0, len(seen)) - for r := range seen { - rows = append(rows, r) - } - sort.Slice(rows, func(i, j int) bool { - if rows[i].workflowPath != rows[j].workflowPath { - return rows[i].workflowPath < rows[j].workflowPath - } - if rows[i].nwo != rows[j].nwo { - return rows[i].nwo < rows[j].nwo - } - return rows[i].ref < rows[j].ref - }) - return rows, nil -} - -// refVariants returns every ref string a workflow author might have written in -// `uses:` that the resolved `ref` covers. For a full semver tag (e.g. `v4.3.1`) -// this is the tag itself plus its major.minor (`v4.3`) and major-only (`v4`) -// forms; for anything else (a branch, a partial tag, a SHA) it is just the ref. -func refVariants(ref string) []string { - sv, ok := parseSemVer(ref) - if !ok || !sv.isFull() { - return []string{ref} - } - variants := []string{ref} - if minor := sv.minorTag(); minor != ref { - variants = append(variants, minor) - } - if major := sv.majorTag(); major != ref { - variants = append(variants, major) - } - return variants -} - -// renderExtension serializes `rows` as a CodeQL data-extension YAML document that -// adds to the `pinnedByLockfileDataModel` extensible predicate in -// `codeql/actions-all`. -func renderExtension(rows []row) string { - var b strings.Builder - b.WriteString("# Generated by lockfile-extension-generator from .github/workflows/actions.lock.\n") - b.WriteString("# Do not edit by hand; regenerate from the repository's Actions lockfile.\n") - b.WriteString("extensions:\n") - b.WriteString(" - addsTo:\n") - b.WriteString(" pack: codeql/actions-all\n") - b.WriteString(" extensible: pinnedByLockfileDataModel\n") - // `data` must be a YAML sequence. When there are no rows we must emit an - // explicit empty list (`data: []`); a bare `data:` parses as null, which - // CodeQL's extension loader rejects (`resolve extensions-by-pack` fails and - // aborts the whole analysis). Zero rows is reachable whenever a lockfile is - // present but pins no repo-level actions (e.g. only sub-path actions such as - // `github/codeql-action/init@v3`, which `parsePin` intentionally skips). - if len(rows) == 0 { - b.WriteString(" data: []\n") - return b.String() - } - b.WriteString(" data:\n") - for _, r := range rows { - fmt.Fprintf(&b, " - [%q, %q, %q]\n", r.workflowPath, r.nwo, r.ref) - } - return b.String() -} diff --git a/actions/extractor/tools/lockfile-extension-generator/generator_test.go b/actions/extractor/tools/lockfile-extension-generator/generator_test.go deleted file mode 100644 index cfa71e0acb9b..000000000000 --- a/actions/extractor/tools/lockfile-extension-generator/generator_test.go +++ /dev/null @@ -1,113 +0,0 @@ -package main - -import ( - "os" - "strings" - "testing" -) - -func TestRowsFromLockfile(t *testing.T) { - contents, err := os.ReadFile("testdata/actions.lock") - if err != nil { - t.Fatalf("reading fixture: %v", err) - } - - rows, err := rowsFromLockfile(contents) - if err != nil { - t.Fatalf("rowsFromLockfile: %v", err) - } - - // Every full-semver resolved ref expands to {raw, minor, major} so a - // workflow that writes a shorter tag in `uses:` still matches. Rows are - // sorted by (workflowPath, nwo, ref). - want := []row{ - {".github/workflows/ci.yml", "actions/checkout", "v4"}, - {".github/workflows/ci.yml", "actions/checkout", "v4.3"}, - {".github/workflows/ci.yml", "actions/checkout", "v4.3.1"}, - {".github/workflows/ci.yml", "some-owner/pinned-action", "v1"}, - {".github/workflows/ci.yml", "some-owner/pinned-action", "v1.2"}, - {".github/workflows/ci.yml", "some-owner/pinned-action", "v1.2.0"}, - {".github/workflows/release.yml", "actions/checkout", "v4"}, - {".github/workflows/release.yml", "actions/checkout", "v4.3"}, - {".github/workflows/release.yml", "actions/checkout", "v4.3.1"}, - } - - if len(rows) != len(want) { - t.Fatalf("got %d rows, want %d:\n%#v", len(rows), len(want), rows) - } - for i := range want { - if rows[i] != want[i] { - t.Errorf("row %d: got %+v, want %+v", i, rows[i], want[i]) - } - } -} - -func TestRefVariants(t *testing.T) { - cases := []struct { - ref string - want []string - }{ - {"v4.3.1", []string{"v4.3.1", "v4.3", "v4"}}, - {"v1.0.0", []string{"v1.0.0", "v1.0", "v1"}}, - // Partial tags are already their own broadest form. - {"v4", []string{"v4"}}, - {"v4.3", []string{"v4.3"}}, - // Pre-release and non-semver refs pass through untouched. - {"v2.0.0-beta.1", []string{"v2.0.0-beta.1"}}, - {"main", []string{"main"}}, - } - for _, c := range cases { - got := refVariants(c.ref) - if len(got) != len(c.want) { - t.Errorf("refVariants(%q) = %v, want %v", c.ref, got, c.want) - continue - } - for i := range c.want { - if got[i] != c.want[i] { - t.Errorf("refVariants(%q) = %v, want %v", c.ref, got, c.want) - break - } - } - } -} - -func TestRenderExtensionMatchesGolden(t *testing.T) { - contents, err := os.ReadFile("testdata/actions.lock") - if err != nil { - t.Fatalf("reading fixture: %v", err) - } - rows, err := rowsFromLockfile(contents) - if err != nil { - t.Fatalf("rowsFromLockfile: %v", err) - } - got := renderExtension(rows) - - want, err := os.ReadFile("testdata/expected.yml") - if err != nil { - t.Fatalf("reading golden: %v", err) - } - if got != string(want) { - t.Errorf("rendered extension does not match testdata/expected.yml:\n--- got ---\n%s", got) - } -} - -func TestRenderExtensionZeroRowsEmitsEmptyList(t *testing.T) { - // A lockfile that pins only sub-path actions (skipped by parsePin) or an - // empty `workflows` map yields zero rows while a lockfile is present. The - // rendered extension must use `data: []`, not a bare `data:` (YAML null), - // which CodeQL's extension loader rejects and which aborts the analysis. - rows, err := rowsFromLockfile([]byte("version: \"v0.0.2\"\nworkflows:\n \".github/workflows/ci.yml\":\n - \"github/codeql-action/init@v3\"\ndependencies: {}\n")) - if err != nil { - t.Fatalf("rowsFromLockfile: %v", err) - } - if len(rows) != 0 { - t.Fatalf("expected zero rows for a sub-path-only lockfile, got %d: %v", len(rows), rows) - } - got := renderExtension(rows) - if !strings.Contains(got, "data: []") { - t.Errorf("zero-row extension must emit `data: []`, got:\n%s", got) - } - if strings.Contains(got, "data:\n") { - t.Errorf("zero-row extension must not emit a null `data:` line, got:\n%s", got) - } -} diff --git a/actions/extractor/tools/lockfile-extension-generator/go.mod b/actions/extractor/tools/lockfile-extension-generator/go.mod deleted file mode 100644 index 5fe4ede0532e..000000000000 --- a/actions/extractor/tools/lockfile-extension-generator/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/github/codeql/actions/extractor/tools/lockfile-extension-generator - -go 1.23 - -require gopkg.in/yaml.v3 v3.0.1 diff --git a/actions/extractor/tools/lockfile-extension-generator/go.sum b/actions/extractor/tools/lockfile-extension-generator/go.sum deleted file mode 100644 index a62c313c5b0c..000000000000 --- a/actions/extractor/tools/lockfile-extension-generator/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/actions/extractor/tools/lockfile-extension-generator/lockfile.go b/actions/extractor/tools/lockfile-extension-generator/lockfile.go deleted file mode 100644 index a8fd87a913fa..000000000000 --- a/actions/extractor/tools/lockfile-extension-generator/lockfile.go +++ /dev/null @@ -1,140 +0,0 @@ -package main - -import ( - "fmt" - "regexp" - "strconv" - "strings" - - "gopkg.in/yaml.v3" -) - -// lockfilePath is the repo-relative location of the GitHub Actions lockfile. -const lockfilePath = ".github/workflows/actions.lock" - -// lockfileDoc is the subset of the Actions lockfile (schema v0.0.2) that the -// generator needs: the per-workflow flat list of canonical pin keys, and the -// resolved ref recorded for each dependency. -// -// The full format is owned by `github.com/github/actions-lockfile`. We parse it -// directly here rather than depending on that (currently private) module so the -// generator builds anywhere the Go toolchain is available, with no module-proxy -// access to a private repository. The fields we read are a stable, minimal core -// of the format; see the schema in that repository for the authoritative shape. -type lockfileDoc struct { - Version string `yaml:"version"` - Workflows map[string][]string `yaml:"workflows"` - Dependencies map[string]lockfileDependency `yaml:"dependencies"` -} - -type lockfileDependency struct { - Ref string `yaml:"ref"` - Commit string `yaml:"commit"` -} - -func parseLockfile(contents []byte) (*lockfileDoc, error) { - var doc lockfileDoc - if err := yaml.Unmarshal(contents, &doc); err != nil { - return nil, fmt.Errorf("parsing lockfile YAML: %w", err) - } - return &doc, nil -} - -// parsePin parses a canonical lockfile pin key of the form "OWNER/REPO@REF". -// -// It mirrors `lockfile.ParsePin`: the "@" separates repo from ref, the repo -// portion must contain exactly one "/", owner and repo are lower-cased (git -// forges treat them case-insensitively) while the ref preserves its casing, and -// a ref may not be empty or contain a colon. Sub-action paths -// ("owner/repo/sub@ref") are rejected because the lockfile pins at repo+ref -// granularity. Returns ok=false for anything that does not match. -func parsePin(s string) (nwo, ref string, ok bool) { - atIdx := strings.IndexByte(s, '@') - if atIdx <= 0 || atIdx == len(s)-1 { - return "", "", false - } - repoPath := s[:atIdx] - ref = s[atIdx+1:] - - if strings.Count(repoPath, "/") != 1 { - return "", "", false - } - slashIdx := strings.IndexByte(repoPath, '/') - owner := repoPath[:slashIdx] - repo := repoPath[slashIdx+1:] - if owner == "" || repo == "" { - return "", "", false - } - if ref == "" || strings.Contains(ref, ":") { - return "", "", false - } - nwo = strings.ToLower(owner) + "/" + strings.ToLower(repo) - return nwo, ref, true -} - -// semVer holds the parsed components of a semver-ish Actions tag. The scheme is -// deliberately lax (bare "2.0.0", partial "v4"/"v4.2", arbitrary suffixes all -// appear in the wild), matching `lockfile.SemVer`. -type semVer struct { - prefix string - major int - minor int - patch int - rest string - raw string -} - -var versionRE = regexp.MustCompile(`^(v?)(\d+)(?:\.(\d+))?(?:\.(\d+))?(.*)$`) - -func parseSemVer(tag string) (semVer, bool) { - if isFullSha(tag) { - return semVer{}, false - } - m := versionRE.FindStringSubmatch(tag) - if m == nil { - return semVer{}, false - } - major, err := strconv.Atoi(m[2]) - if err != nil { - return semVer{}, false - } - minor := 0 - if m[3] != "" { - if minor, err = strconv.Atoi(m[3]); err != nil { - return semVer{}, false - } - } - patch := 0 - if m[4] != "" { - if patch, err = strconv.Atoi(m[4]); err != nil { - return semVer{}, false - } - } - return semVer{prefix: m[1], major: major, minor: minor, patch: patch, rest: m[5], raw: tag}, true -} - -func (s semVer) majorTag() string { return fmt.Sprintf("%s%d", s.prefix, s.major) } - -func (s semVer) minorTag() string { return fmt.Sprintf("%s%d.%d", s.prefix, s.major, s.minor) } - -// isFull reports whether the tag has all three components (major.minor.patch) -// and no pre-release suffix. Tags like "v4" or "v4.2" return false. Only a full -// version uniquely identifies a release, so only full versions get expanded -// into their shorter mutable forms. -func (s semVer) isFull() bool { - return s.rest == "" && s.raw != s.majorTag() && s.raw != s.minorTag() -} - -// isFullSha reports whether s looks like a full commit hash (SHA-1 or SHA-256), -// which must not be treated as a version tag. -func isFullSha(s string) bool { - if len(s) != 40 && len(s) != 64 { - return false - } - for _, c := range s { - if !((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')) { - return false - } - } - return true -} diff --git a/actions/extractor/tools/lockfile-extension-generator/lockfile_test.go b/actions/extractor/tools/lockfile-extension-generator/lockfile_test.go deleted file mode 100644 index f3f64359cac0..000000000000 --- a/actions/extractor/tools/lockfile-extension-generator/lockfile_test.go +++ /dev/null @@ -1,92 +0,0 @@ -package main - -import "testing" - -func TestParsePin(t *testing.T) { - cases := []struct { - in string - wantNWO string - wantRef string - wantOK bool - }{ - {"actions/checkout@v4.3.1", "actions/checkout", "v4.3.1", true}, - {"Some-Owner/Pinned-Action@v1.2.0", "some-owner/pinned-action", "v1.2.0", true}, // owner/repo lower-cased, ref preserved - {"owner/repo@V1.2.0", "owner/repo", "V1.2.0", true}, // ref casing preserved - {"owner/repo@sha1-deadbeef", "owner/repo", "sha1-deadbeef", true}, // colon-free ref accepted - {"owner/repo", "", "", false}, // no @ - {"owner/repo@", "", "", false}, // empty ref - {"@v1", "", "", false}, // no repo path - {"owner/repo/sub@v1", "", "", false}, // sub-action path rejected - {"owneronly@v1", "", "", false}, // no slash - {"owner/repo@ref:with:colon", "", "", false}, // colon rejected - } - for _, c := range cases { - nwo, ref, ok := parsePin(c.in) - if ok != c.wantOK || nwo != c.wantNWO || ref != c.wantRef { - t.Errorf("parsePin(%q) = (%q, %q, %v), want (%q, %q, %v)", - c.in, nwo, ref, ok, c.wantNWO, c.wantRef, c.wantOK) - } - } -} - -func TestParseSemVerAndIsFull(t *testing.T) { - cases := []struct { - tag string - wantOK bool - wantFull bool - wantMajor string - wantMinor string - }{ - {"v4.3.1", true, true, "v4", "v4.3"}, - {"4.3.1", true, true, "4", "4.3"}, // bare, no "v" prefix - {"v4", true, false, "v4", "v4.0"}, - {"v4.3", true, false, "v4", "v4.3"}, - {"v2.0.0-beta.1", true, false, "v2", "v2.0"}, // pre-release: not full - {"main", false, false, "", ""}, - {"0123456789abcdef0123456789abcdef01234567", false, false, "", ""}, // 40-char SHA - } - for _, c := range cases { - sv, ok := parseSemVer(c.tag) - if ok != c.wantOK { - t.Errorf("parseSemVer(%q) ok = %v, want %v", c.tag, ok, c.wantOK) - continue - } - if !ok { - continue - } - if got := sv.isFull(); got != c.wantFull { - t.Errorf("parseSemVer(%q).isFull() = %v, want %v", c.tag, got, c.wantFull) - } - if got := sv.majorTag(); got != c.wantMajor { - t.Errorf("parseSemVer(%q).majorTag() = %q, want %q", c.tag, got, c.wantMajor) - } - if got := sv.minorTag(); got != c.wantMinor { - t.Errorf("parseSemVer(%q).minorTag() = %q, want %q", c.tag, got, c.wantMinor) - } - } -} - -func TestParseLockfile(t *testing.T) { - doc, err := parseLockfile([]byte(`version: 'v0.0.2' -workflows: - '.github/workflows/ci.yml': - - 'actions/checkout@v4.3.1' -dependencies: - 'actions/checkout@v4.3.1': - ref: 'v4.3.1' - commit: 'sha1-abc' -`)) - if err != nil { - t.Fatalf("parseLockfile: %v", err) - } - if doc.Version != "v0.0.2" { - t.Errorf("version = %q, want v0.0.2", doc.Version) - } - keys := doc.Workflows[".github/workflows/ci.yml"] - if len(keys) != 1 || keys[0] != "actions/checkout@v4.3.1" { - t.Errorf("workflows entry = %v", keys) - } - if dep := doc.Dependencies["actions/checkout@v4.3.1"]; dep.Ref != "v4.3.1" { - t.Errorf("dependency ref = %q, want v4.3.1", dep.Ref) - } -} diff --git a/actions/extractor/tools/lockfile-extension-generator/main.go b/actions/extractor/tools/lockfile-extension-generator/main.go deleted file mode 100644 index 4c7811a591c1..000000000000 --- a/actions/extractor/tools/lockfile-extension-generator/main.go +++ /dev/null @@ -1,55 +0,0 @@ -package main - -import ( - "fmt" - "os" - "path/filepath" -) - -// main reads a repository's Actions lockfile and writes the corresponding -// `pinnedByLockfileDataModel` data extension. -// -// Usage: -// -// lockfile-extension-generator [output-file] -// -// `` is the root of the repository to scan; the lockfile is read -// from `/.github/workflows/actions.lock`. When `[output-file]` is -// omitted the extension is written to stdout. If the repository has no lockfile -// the generator exits successfully without writing anything, so it is safe to -// run unconditionally. -func main() { - if len(os.Args) < 2 || len(os.Args) > 3 { - fmt.Fprintf(os.Stderr, "usage: %s [output-file]\n", filepath.Base(os.Args[0])) - os.Exit(2) - } - sourceRoot := os.Args[1] - - lockPath := filepath.Join(sourceRoot, filepath.FromSlash(lockfilePath)) - contents, err := os.ReadFile(lockPath) - if err != nil { - if os.IsNotExist(err) { - // No lockfile: nothing to pin. A clean no-op keeps this safe to run - // against every repository. - return - } - fmt.Fprintf(os.Stderr, "error: reading %s: %v\n", lockPath, err) - os.Exit(1) - } - - rows, err := rowsFromLockfile(contents) - if err != nil { - fmt.Fprintf(os.Stderr, "error: %v\n", err) - os.Exit(1) - } - - out := renderExtension(rows) - if len(os.Args) == 3 { - if err := os.WriteFile(os.Args[2], []byte(out), 0o644); err != nil { - fmt.Fprintf(os.Stderr, "error: writing %s: %v\n", os.Args[2], err) - os.Exit(1) - } - return - } - fmt.Print(out) -} diff --git a/actions/extractor/tools/lockfile-extension-generator/testdata/actions.lock b/actions/extractor/tools/lockfile-extension-generator/testdata/actions.lock deleted file mode 100644 index 012688ac0993..000000000000 --- a/actions/extractor/tools/lockfile-extension-generator/testdata/actions.lock +++ /dev/null @@ -1,19 +0,0 @@ -# Machine-generated by `gh actions-lock`; used here as a test fixture. -version: 'v0.0.2' -workflows: - '.github/workflows/ci.yml': - - 'actions/checkout@v4.3.1' - - 'some-owner/pinned-action@v1.2.0' - '.github/workflows/release.yml': - - 'actions/checkout@v4.3.1' -dependencies: - 'actions/checkout@v4.3.1': - ref: 'v4.3.1' - commit: 'sha1-34e114876b0b11c390a56381ad16ebd13914f8d5' - owner_id: 44036562 - repo_id: 197814629 - 'some-owner/pinned-action@v1.2.0': - ref: 'v1.2.0' - commit: 'sha1-1111111111111111111111111111111111111111' - owner_id: 12345 - repo_id: 67890 diff --git a/actions/extractor/tools/lockfile-extension-generator/testdata/expected.yml b/actions/extractor/tools/lockfile-extension-generator/testdata/expected.yml deleted file mode 100644 index 4dba2d6f997c..000000000000 --- a/actions/extractor/tools/lockfile-extension-generator/testdata/expected.yml +++ /dev/null @@ -1,16 +0,0 @@ -# Generated by lockfile-extension-generator from .github/workflows/actions.lock. -# Do not edit by hand; regenerate from the repository's Actions lockfile. -extensions: - - addsTo: - pack: codeql/actions-all - extensible: pinnedByLockfileDataModel - data: - - [".github/workflows/ci.yml", "actions/checkout", "v4"] - - [".github/workflows/ci.yml", "actions/checkout", "v4.3"] - - [".github/workflows/ci.yml", "actions/checkout", "v4.3.1"] - - [".github/workflows/ci.yml", "some-owner/pinned-action", "v1"] - - [".github/workflows/ci.yml", "some-owner/pinned-action", "v1.2"] - - [".github/workflows/ci.yml", "some-owner/pinned-action", "v1.2.0"] - - [".github/workflows/release.yml", "actions/checkout", "v4"] - - [".github/workflows/release.yml", "actions/checkout", "v4.3"] - - [".github/workflows/release.yml", "actions/checkout", "v4.3.1"] diff --git a/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql b/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql index ae56feee3de5..3c908134a44f 100644 --- a/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql +++ b/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql @@ -46,8 +46,8 @@ private predicate isSelfRepository(string nwo) { nwo.matches("$/%") } // suppressed. See `pinnedByLockfileDataModel` in `ConfigExtensions.qll` for the intended shape. bindingset[nwo] private predicate pinnedByLockfile(UsesStep uses, string nwo, string version) { - // The lockfile generator lower-cases owner/repo (GitHub treats them - // case-insensitively) but preserves the ref, so match `nwo` case-insensitively + // The extractor populates this predicate with lower-cased owner/repo (GitHub treats + // them case-insensitively) but preserves the ref, so match `nwo` case-insensitively // and `version` exactly. `nwo` keeps its source casing everywhere else (e.g. the // alert message) so authors still see the ref as written. pinnedByLockfileDataModel(uses.getLocation().getFile().getRelativePath(), nwo.toLowerCase(), diff --git a/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/lockfile_pinned.yml b/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/lockfile_pinned.yml index 53a41e96e057..7d3dcb66faaa 100644 --- a/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/lockfile_pinned.yml +++ b/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/lockfile_pinned.yml @@ -16,7 +16,7 @@ jobs: # refs are NOT recorded in the data extension and therefore remain reported. - uses: some-owner/pinned-action@v1 # `Mixed-Owner/Pinned-Action@v1` is pinned by the lockfile too, but written with the mixed-case - # owner/repo that authors commonly use (Azure, GoogleCloudPlatform, ...). The generator emits + # owner/repo that authors commonly use (Azure, GoogleCloudPlatform, ...). The extractor emits # the lockfile nwo lower-cased, so the query must match owner/repo case-insensitively; this ref # is therefore expected to be suppressed (no finding). - uses: Mixed-Owner/Pinned-Action@v1 diff --git a/actions/ql/test/query-tests/Security/CWE-829/pinned_by_lockfile.model.yml b/actions/ql/test/query-tests/Security/CWE-829/pinned_by_lockfile.model.yml index 6e78ddf7dfeb..12f79944cd38 100644 --- a/actions/ql/test/query-tests/Security/CWE-829/pinned_by_lockfile.model.yml +++ b/actions/ql/test/query-tests/Security/CWE-829/pinned_by_lockfile.model.yml @@ -8,6 +8,6 @@ extensions: # query suppresses it. data: - [".github/workflows/lockfile_pinned.yml", "some-owner/pinned-action", "v1"] - # Lower-cased form of `Mixed-Owner/Pinned-Action@v1`, as the generator emits it. Exercises the + # Lower-cased form of `Mixed-Owner/Pinned-Action@v1`, as the extractor emits it. Exercises the # case-insensitive owner/repo match in the `actions/unpinned-tag` query. - [".github/workflows/lockfile_pinned.yml", "mixed-owner/pinned-action", "v1"] From 91faa260db9e5b0d98e7b842b647fe999b325e73 Mon Sep 17 00:00:00 2001 From: Jeff Martin Date: Mon, 31 Aug 2026 15:01:50 -0700 Subject: [PATCH 0794/2098] actions/unpinned-tag: normalize lockfile action identity --- .../2026-07-09-pinned-by-lockfile.md | 2 +- .../ql/lib/codeql/actions/config/Config.qll | 15 ++++++++++---- .../actions/config/ConfigExtensions.qll | 11 ++++------ .../ql/lib/ext/config/pinned_by_lockfile.yml | 20 ------------------- .../Security/CWE-829/UnpinnedActionsTag.ql | 20 ++++--------------- .../2026-07-09-unpinned-tag-lockfile-aware.md | 2 +- .../.github/workflows/lockfile_pinned.yml | 14 ++++++++----- .../CWE-829/UnpinnedActionsTag.expected | 3 ++- .../UntrustedCheckoutCritical.expected | 4 +++- .../CWE-829/pinned_by_lockfile.model.yml | 8 ++------ 10 files changed, 37 insertions(+), 62 deletions(-) delete mode 100644 actions/ql/lib/ext/config/pinned_by_lockfile.yml diff --git a/actions/ql/lib/change-notes/2026-07-09-pinned-by-lockfile.md b/actions/ql/lib/change-notes/2026-07-09-pinned-by-lockfile.md index 30ba217f7d1f..2c441c182a97 100644 --- a/actions/ql/lib/change-notes/2026-07-09-pinned-by-lockfile.md +++ b/actions/ql/lib/change-notes/2026-07-09-pinned-by-lockfile.md @@ -1,4 +1,4 @@ --- category: minorAnalysis --- -* Added a new extensible predicate `pinnedByLockfileDataModel(workflow_path, nwo, ref)`, which records `uses:` references that are pinned by a repository's Actions lockfile (`.github/workflows/actions.lock`). The CodeQL Actions extractor generates this data at database-creation time into a database-local model pack (`codeql/actions-lockfile-pins`); it has no effect unless that pack is supplied to analysis (for example via `--model-packs`), so behavior is unchanged for repositories without a lockfile or analyses that do not opt in. +* Added a new extensible predicate `pinnedByLockfileDataModel(workflow_path, nwo, ref)`, which lets model packs record `uses:` references pinned by a repository's Actions lockfile (`.github/workflows/actions.lock`). diff --git a/actions/ql/lib/codeql/actions/config/Config.qll b/actions/ql/lib/codeql/actions/config/Config.qll index 952eab11fb02..8b6fcaefa290 100644 --- a/actions/ql/lib/codeql/actions/config/Config.qll +++ b/actions/ql/lib/codeql/actions/config/Config.qll @@ -137,15 +137,22 @@ predicate trustedActionsOwnerDataModel(string owner) { /** * MaD models for `uses` references pinned by the repository's Actions lockfile - * (`.github/workflows/actions.lock`). Populated by the CodeQL Actions extractor; see - * `pinnedByLockfileDataModel` in `ConfigExtensions.qll`. + * (`.github/workflows/actions.lock`). * Fields: * - workflow_path: repo-relative path of the file containing the `uses:` reference - * - nwo: owner and name of the referenced action (e.g. `actions/checkout`) + * - nwo: referenced action, optionally including a sub-action path (e.g. `actions/cache/save`) * - ref: the ref as written in `uses:` (e.g. `v4`) */ +bindingset[nwo] predicate pinnedByLockfileDataModel(string workflow_path, string nwo, string ref) { - Extensions::pinnedByLockfileDataModel(workflow_path, nwo, ref) + exists(string pinnedNwo | + Extensions::pinnedByLockfileDataModel(workflow_path, pinnedNwo, ref) and + ( + nwo.toLowerCase() = pinnedNwo + or + nwo.toLowerCase().prefix(pinnedNwo.length() + 1) = pinnedNwo + "/" + ) + ) } /** diff --git a/actions/ql/lib/codeql/actions/config/ConfigExtensions.qll b/actions/ql/lib/codeql/actions/config/ConfigExtensions.qll index 89774d3160c2..f40defd2b212 100644 --- a/actions/ql/lib/codeql/actions/config/ConfigExtensions.qll +++ b/actions/ql/lib/codeql/actions/config/ConfigExtensions.qll @@ -73,17 +73,14 @@ extensible predicate trustedActionsOwnerDataModel(string owner); * `workflow_path` is pinned by an entry in the repository's Actions lockfile * (`.github/workflows/actions.lock`). * - * This predicate is intended to be populated by the CodeQL Actions extractor, which parses - * `actions.lock` at database-creation time using the canonical lockfile parser at - * `github.com/github/actions-lockfile/go`. Each lockfile entry binds an `nwo`@`ref` to a - * verified commit SHA, which is exactly the pinning evidence the `actions/unpinned-tag` query - * otherwise lacks. Until the extractor populates this predicate it is empty, so any clause that - * consumes it is a clean no-op and behavior is unchanged for repositories without a lockfile. + * Supply rows from a model pack generated with the canonical parser at + * `github.com/github/actions-lockfile/go/pkg/lockfile`. Each lockfile entry binds an `nwo`@`ref` + * to a verified commit SHA. Without such a model pack this predicate is empty. * * Fields: * - `workflow_path`: repo-relative path of the file containing the `uses:` reference, * e.g. `.github/workflows/ci.yml`. - * - `nwo`: owner and name of the referenced action, e.g. `actions/checkout`. + * - `nwo`: canonical owner and repository from the lockfile pin, e.g. `actions/cache`. * - `ref`: the ref (tag or branch) as written in `uses:`, e.g. `v4`. */ extensible predicate pinnedByLockfileDataModel(string workflow_path, string nwo, string ref); diff --git a/actions/ql/lib/ext/config/pinned_by_lockfile.yml b/actions/ql/lib/ext/config/pinned_by_lockfile.yml deleted file mode 100644 index f0116051557c..000000000000 --- a/actions/ql/lib/ext/config/pinned_by_lockfile.yml +++ /dev/null @@ -1,20 +0,0 @@ -extensions: - - addsTo: - pack: codeql/actions-all - extensible: pinnedByLockfileDataModel - # `pinnedByLockfileDataModel` records `uses:` references that are pinned by the repository's - # Actions lockfile (`.github/workflows/actions.lock`). It is intended to be populated by the - # CodeQL Actions extractor, which parses the lockfile at database-creation time using the - # canonical Go parser at `github.com/github/actions-lockfile/go`. Each row is - # `[workflow_path, nwo, ref]`: - # - workflow_path: repo-relative path of the file containing the `uses:` reference - # - nwo: owner/name of the referenced action (e.g. `actions/checkout`) - # - ref: the ref as written in `uses:` (e.g. `v4`) - # - # Example of the intended shape (commented out; real data is supplied by the extractor): - # - [".github/workflows/ci.yml", "actions/checkout", "v4"] - # - # Until the extractor populates this predicate it stays empty, so the - # `not pinnedByLockfile(...)` clause in `actions/unpinned-tag` is a no-op and behavior is - # unchanged for repositories without a lockfile. - data: [] diff --git a/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql b/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql index 3c908134a44f..d84d0ade3309 100644 --- a/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql +++ b/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql @@ -39,21 +39,6 @@ private predicate isContainerImage(string nwo) { nwo.regexpMatch("^docker://.+") bindingset[nwo] private predicate isSelfRepository(string nwo) { nwo.matches("$/%") } -// Holds if `uses` (calling action `nwo` at `version`) is pinned by an entry in the repository's -// Actions lockfile (`.github/workflows/actions.lock`). The underlying `pinnedByLockfileDataModel` -// predicate is populated by the CodeQL Actions extractor when it parses the lockfile at -// database-creation time; until then this is a clean no-op and no lockfile-pinned refs are -// suppressed. See `pinnedByLockfileDataModel` in `ConfigExtensions.qll` for the intended shape. -bindingset[nwo] -private predicate pinnedByLockfile(UsesStep uses, string nwo, string version) { - // The extractor populates this predicate with lower-cased owner/repo (GitHub treats - // them case-insensitively) but preserves the ref, so match `nwo` case-insensitively - // and `version` exactly. `nwo` keeps its source casing everywhere else (e.g. the - // alert message) so authors still see the ref as written. - pinnedByLockfileDataModel(uses.getLocation().getFile().getRelativePath(), nwo.toLowerCase(), - version) -} - private predicate hasUsesContainerName(Uses uses, string name) { exists(Workflow workflow | uses.getEnclosingWorkflow() = workflow and @@ -77,7 +62,10 @@ where uses.getVersion() = version and not isTrustedOwner(nwo) and not isSelfRepository(nwo) and - not exists(UsesStep step | uses = step and pinnedByLockfile(step, nwo, version)) and + not exists(UsesStep step | + uses = step and + pinnedByLockfileDataModel(step.getLocation().getFile().getRelativePath(), nwo, version) + ) and not ( if uses instanceof UsesStep and isContainerImage(nwo) then isPinnedContainer(version) diff --git a/actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md b/actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md index 54e4b23d0f7f..e02fdc01a905 100644 --- a/actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md +++ b/actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md @@ -1,4 +1,4 @@ --- category: minorAnalysis --- -* The `actions/unpinned-tag` query no longer reports `uses:` references that are recorded as pinned by a repository's Actions lockfile (`.github/workflows/actions.lock`) via the new `pinnedByLockfileDataModel` extensible predicate. The CodeQL Actions extractor generates this data at database-creation time into a database-local model pack (`codeql/actions-lockfile-pins`); references are suppressed only when that pack is supplied to analysis (for example via `--model-packs`), so behavior is unchanged for repositories without a lockfile or analyses that do not opt in. Because the lockfile keys its pins transitively by workflow path, a stale lockfile could in rare cases suppress a directly-written unpinned tag that shares an action and major version with a transitively-pinned dependency of the same workflow; keeping the lockfile current avoids this. +* The `actions/unpinned-tag` query no longer reports `uses:` references recorded by the new `pinnedByLockfileDataModel` extensible predicate. Lockfile pins match repository sub-actions while preserving ref casing. diff --git a/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/lockfile_pinned.yml b/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/lockfile_pinned.yml index 7d3dcb66faaa..6108f659bce1 100644 --- a/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/lockfile_pinned.yml +++ b/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/lockfile_pinned.yml @@ -9,17 +9,21 @@ jobs: # `some-owner/pinned-action@v1` is a tag ref that would normally be reported as an unpinned # tag. The test data extension `pinned_by_lockfile.model.yml` records it as pinned by the # repository's Actions lockfile, so the `not pinnedByLockfile(...)` clause suppresses it (this - # fixture is expected to produce no findings). This mirrors what the CodeQL Actions extractor - # will do by parsing `.github/workflows/actions.lock`. + # fixture is expected to produce no findings). This mirrors data supplied by an external + # model pack generated from `.github/workflows/actions.lock`. # # Negative control is provided for free by the many other fixtures in this directory whose tag # refs are NOT recorded in the data extension and therefore remain reported. - uses: some-owner/pinned-action@v1 # `Mixed-Owner/Pinned-Action@v1` is pinned by the lockfile too, but written with the mixed-case - # owner/repo that authors commonly use (Azure, GoogleCloudPlatform, ...). The extractor emits - # the lockfile nwo lower-cased, so the query must match owner/repo case-insensitively; this ref - # is therefore expected to be suppressed (no finding). + # owner/repo that authors commonly use (Azure, GoogleCloudPlatform, ...). + # Lockfile pins canonicalize owner/repo, so this ref is also expected to be suppressed (no + # finding). - uses: Mixed-Owner/Pinned-Action@v1 # Negative control: a mixed-case ref that is NOT recorded in the lockfile data must still be # reported, guarding against over-suppression of every mixed-case ref. - uses: Mixed-Owner/Unpinned-Action@v2 + # A repository-scoped pin also covers its sub-actions. + - uses: some-owner/pinned-action/save@v1 + # Ref casing must match the canonical lockfile pin exactly. + - uses: some-owner/pinned-action@V1 diff --git a/actions/ql/test/query-tests/Security/CWE-829/UnpinnedActionsTag.expected b/actions/ql/test/query-tests/Security/CWE-829/UnpinnedActionsTag.expected index 71ca2adb9f3b..e922727ce58f 100644 --- a/actions/ql/test/query-tests/Security/CWE-829/UnpinnedActionsTag.expected +++ b/actions/ql/test/query-tests/Security/CWE-829/UnpinnedActionsTag.expected @@ -21,7 +21,8 @@ | .github/workflows/label_trusted_checkout2.yml:21:13:21:36 | completely/fakeaction@v2 | Unpinned 3rd party Action 'label_trusted_checkout2.yml' step $@ uses 'completely/fakeaction' with ref 'v2', not a pinned commit hash | .github/workflows/label_trusted_checkout2.yml:21:7:25:4 | Uses Step | Uses Step | | .github/workflows/label_trusted_checkout2.yml:25:13:25:37 | fakerepo/comment-on-pr@v1 | Unpinned 3rd party Action 'label_trusted_checkout2.yml' step $@ uses 'fakerepo/comment-on-pr' with ref 'v1', not a pinned commit hash | .github/workflows/label_trusted_checkout2.yml:25:7:28:21 | Uses Step | Uses Step | | .github/workflows/level0.yml:36:15:36:47 | rlespinasse/github-slug-action@v4 | Unpinned 3rd party Action 'Poutine Level 0' step $@ uses 'rlespinasse/github-slug-action' with ref 'v4', not a pinned commit hash | .github/workflows/level0.yml:36:9:39:6 | Uses Step | Uses Step | -| .github/workflows/lockfile_pinned.yml:25:13:25:42 | Mixed-Owner/Unpinned-Action@v2 | Unpinned 3rd party Action 'lockfile_pinned.yml' step $@ uses 'Mixed-Owner/Unpinned-Action' with ref 'v2', not a pinned commit hash | .github/workflows/lockfile_pinned.yml:25:7:25:43 | Uses Step | Uses Step | +| .github/workflows/lockfile_pinned.yml:25:13:25:42 | Mixed-Owner/Unpinned-Action@v2 | Unpinned 3rd party Action 'lockfile_pinned.yml' step $@ uses 'Mixed-Owner/Unpinned-Action' with ref 'v2', not a pinned commit hash | .github/workflows/lockfile_pinned.yml:25:7:27:4 | Uses Step | Uses Step | +| .github/workflows/lockfile_pinned.yml:29:13:29:39 | some-owner/pinned-action@V1 | Unpinned 3rd party Action 'lockfile_pinned.yml' step $@ uses 'some-owner/pinned-action' with ref 'V1', not a pinned commit hash | .github/workflows/lockfile_pinned.yml:29:7:29:40 | Uses Step | Uses Step | | .github/workflows/mend.yml:31:15:31:34 | ruby/setup-ruby@v1 | Unpinned 3rd party Action 'Test' step $@ uses 'ruby/setup-ruby' with ref 'v1', not a pinned commit hash | .github/workflows/mend.yml:29:9:33:28 | Uses Step | Uses Step | | .github/workflows/pr-workflow.yml:60:15:60:52 | amannn/action-semantic-pull-request@v5 | Unpinned 3rd party Action 'pr-workflow' step $@ uses 'amannn/action-semantic-pull-request' with ref 'v5', not a pinned commit hash | .github/workflows/pr-workflow.yml:60:9:70:6 | Uses Step | Uses Step | | .github/workflows/pr-workflow.yml:109:15:109:42 | actionsdesk/lfs-warning@v3.2 | Unpinned 3rd party Action 'pr-workflow' step $@ uses 'actionsdesk/lfs-warning' with ref 'v3.2', not a pinned commit hash | .github/workflows/pr-workflow.yml:109:9:124:6 | Uses Step | Uses Step | diff --git a/actions/ql/test/query-tests/Security/CWE-829/UntrustedCheckoutCritical.expected b/actions/ql/test/query-tests/Security/CWE-829/UntrustedCheckoutCritical.expected index 2d293ce0de3c..bcf37e00df6f 100644 --- a/actions/ql/test/query-tests/Security/CWE-829/UntrustedCheckoutCritical.expected +++ b/actions/ql/test/query-tests/Security/CWE-829/UntrustedCheckoutCritical.expected @@ -171,7 +171,9 @@ edges | .github/workflows/level0.yml:128:17:128:57 | github.event.pull_request.head.sha | .github/workflows/level0.yml:125:9:129:6 | Uses Step | | .github/workflows/level0.yml:129:9:133:6 | Uses Step | .github/workflows/level0.yml:133:9:135:23 | Run Step | | .github/workflows/lockfile_pinned.yml:17:7:22:4 | Uses Step | .github/workflows/lockfile_pinned.yml:22:7:25:4 | Uses Step | -| .github/workflows/lockfile_pinned.yml:22:7:25:4 | Uses Step | .github/workflows/lockfile_pinned.yml:25:7:25:43 | Uses Step | +| .github/workflows/lockfile_pinned.yml:22:7:25:4 | Uses Step | .github/workflows/lockfile_pinned.yml:25:7:27:4 | Uses Step | +| .github/workflows/lockfile_pinned.yml:25:7:27:4 | Uses Step | .github/workflows/lockfile_pinned.yml:27:7:29:4 | Uses Step | +| .github/workflows/lockfile_pinned.yml:27:7:29:4 | Uses Step | .github/workflows/lockfile_pinned.yml:29:7:29:40 | Uses Step | | .github/workflows/mend.yml:13:9:22:6 | Run Step: set_ref | .github/workflows/mend.yml:22:9:29:6 | Uses Step | | .github/workflows/mend.yml:22:9:29:6 | Uses Step | .github/workflows/mend.yml:29:9:33:28 | Uses Step | | .github/workflows/mend.yml:27:17:27:48 | steps.set_ref.outputs.ref | .github/workflows/mend.yml:22:9:29:6 | Uses Step | diff --git a/actions/ql/test/query-tests/Security/CWE-829/pinned_by_lockfile.model.yml b/actions/ql/test/query-tests/Security/CWE-829/pinned_by_lockfile.model.yml index 12f79944cd38..3250b8914d5a 100644 --- a/actions/ql/test/query-tests/Security/CWE-829/pinned_by_lockfile.model.yml +++ b/actions/ql/test/query-tests/Security/CWE-829/pinned_by_lockfile.model.yml @@ -2,12 +2,8 @@ extensions: - addsTo: pack: codeql/actions-all extensible: pinnedByLockfileDataModel - # Test data standing in for what the CodeQL Actions extractor will emit from - # `.github/workflows/actions.lock`. Records `some-owner/pinned-action@v1` in - # `lockfile_pinned.yml` as pinned by the lockfile so the `actions/unpinned-tag` - # query suppresses it. + # Canonical lockfile pin rows supplied by an external model pack. data: - [".github/workflows/lockfile_pinned.yml", "some-owner/pinned-action", "v1"] - # Lower-cased form of `Mixed-Owner/Pinned-Action@v1`, as the extractor emits it. Exercises the - # case-insensitive owner/repo match in the `actions/unpinned-tag` query. + # Owner/repo is canonicalized; ref casing is preserved. - [".github/workflows/lockfile_pinned.yml", "mixed-owner/pinned-action", "v1"] From 45a6dd700a99df398cabb70e7cec10f58c9d4c10 Mon Sep 17 00:00:00 2001 From: Jeff Martin Date: Mon, 31 Aug 2026 15:23:56 -0700 Subject: [PATCH 0795/2098] actions/unpinned-tag: regenerate expected results after sync --- .../Security/CWE-829/UntrustedCheckoutCritical.expected | 1 + 1 file changed, 1 insertion(+) diff --git a/actions/ql/test/query-tests/Security/CWE-829/UntrustedCheckoutCritical.expected b/actions/ql/test/query-tests/Security/CWE-829/UntrustedCheckoutCritical.expected index bcf37e00df6f..b17295e6837d 100644 --- a/actions/ql/test/query-tests/Security/CWE-829/UntrustedCheckoutCritical.expected +++ b/actions/ql/test/query-tests/Security/CWE-829/UntrustedCheckoutCritical.expected @@ -245,6 +245,7 @@ edges | .github/workflows/resolve-args.yml:20:9:22:6 | Uses Step | .github/workflows/resolve-args.yml:22:9:36:13 | Run Step: resolve-step | | .github/workflows/reusable_local.yml:23:9:26:6 | Uses Step | .github/workflows/reusable_local.yml:26:9:29:7 | Run Step | | .github/workflows/reusable_local.yml:25:17:25:36 | inputs.branch | .github/workflows/reusable_local.yml:23:9:26:6 | Uses Step | +| .github/workflows/self_ref_dollar.yml:11:7:15:4 | Uses Step | .github/workflows/self_ref_dollar.yml:15:7:15:29 | Uses Step | | .github/workflows/test1.yml:18:9:21:6 | Uses Step | .github/workflows/test1.yml:21:9:24:6 | Run Step | | .github/workflows/test1.yml:21:9:24:6 | Run Step | .github/workflows/test1.yml:24:9:25:39 | Run Step | | .github/workflows/test2.yml:13:9:16:6 | Uses Step | .github/workflows/test2.yml:16:9:20:52 | Uses Step | From 2e04003c9b2cfcf8f0e0a178a93c5760dc24427f Mon Sep 17 00:00:00 2001 From: Jeff Martin Date: Wed, 2 Sep 2026 07:34:33 -0700 Subject: [PATCH 0796/2098] Actions: consume extracted lockfile pins --- .../2026-07-09-pinned-by-lockfile.md | 4 --- actions/ql/lib/codeql/actions/Lock.qll | 34 +++++++++++++++++++ .../ql/lib/codeql/actions/config/Config.qll | 20 ----------- .../actions/config/ConfigExtensions.qll | 17 ---------- .../Security/CWE-829/UnpinnedActionsTag.ql | 4 ++- .../2026-07-09-unpinned-tag-lockfile-aware.md | 2 +- actions/ql/test/qlpack.yml | 1 - .../.github/workflows/actions.lock | 30 ++++++++++++++++ .../.github/workflows/rust-ci.yml | 16 +++++++++ .../UnpinnedActionsTag.expected | 6 ++++ .../CWE-829-Lockfile/UnpinnedActionsTag.qlref | 1 + .../Security/CWE-829-Lockfile/options | 1 + .../.github/workflows/lockfile_pinned.yml | 29 ---------------- .../CWE-829/UnpinnedActionsTag.expected | 2 -- .../UntrustedCheckoutCritical.expected | 4 --- .../CWE-829/pinned_by_lockfile.model.yml | 9 ----- 16 files changed, 92 insertions(+), 88 deletions(-) delete mode 100644 actions/ql/lib/change-notes/2026-07-09-pinned-by-lockfile.md create mode 100644 actions/ql/test/query-tests/Security/CWE-829-Lockfile/.github/workflows/actions.lock create mode 100644 actions/ql/test/query-tests/Security/CWE-829-Lockfile/.github/workflows/rust-ci.yml create mode 100644 actions/ql/test/query-tests/Security/CWE-829-Lockfile/UnpinnedActionsTag.expected create mode 100644 actions/ql/test/query-tests/Security/CWE-829-Lockfile/UnpinnedActionsTag.qlref create mode 100644 actions/ql/test/query-tests/Security/CWE-829-Lockfile/options delete mode 100644 actions/ql/test/query-tests/Security/CWE-829/.github/workflows/lockfile_pinned.yml delete mode 100644 actions/ql/test/query-tests/Security/CWE-829/pinned_by_lockfile.model.yml diff --git a/actions/ql/lib/change-notes/2026-07-09-pinned-by-lockfile.md b/actions/ql/lib/change-notes/2026-07-09-pinned-by-lockfile.md deleted file mode 100644 index 2c441c182a97..000000000000 --- a/actions/ql/lib/change-notes/2026-07-09-pinned-by-lockfile.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added a new extensible predicate `pinnedByLockfileDataModel(workflow_path, nwo, ref)`, which lets model packs record `uses:` references pinned by a repository's Actions lockfile (`.github/workflows/actions.lock`). diff --git a/actions/ql/lib/codeql/actions/Lock.qll b/actions/ql/lib/codeql/actions/Lock.qll index 8fb8a8a8b359..03a92060641d 100644 --- a/actions/ql/lib/codeql/actions/Lock.qll +++ b/actions/ql/lib/codeql/actions/Lock.qll @@ -7,4 +7,38 @@ private import codeql.actions.ast.internal.Yaml /** An `actions.lock` file. */ class ActionsLock extends YamlDocument { ActionsLock() { this.getFile().getBaseName() = "actions.lock" } + + /** + * Holds if the v0.0.2 lockfile records `nwo` at `ref` for `workflowPath` with a full commit + * digest. Repository pins also cover sub-actions such as `actions/cache/save`. + */ + bindingset[nwo] + predicate pins(string workflowPath, string nwo, string ref) { + this.getFile().getRelativePath() = ".github/workflows/actions.lock" and + exists( + YamlMapping root, YamlSequence workflowPins, YamlScalar pinNode, YamlMapping dependency, + string pin, string pinnedNwo + | + root = this and + root.lookup("version").(YamlScalar).getValue() = "v0.0.2" and + root.lookup("workflows").(YamlMapping).lookup(workflowPath) = workflowPins and + workflowPins.getElement(_) = pinNode and + pin = pinNode.getValue() and + pinnedNwo = pin.regexpCapture("^([^/@:]+/[^/@:]+)@([^:]+)$", 1) and + ref = pin.regexpCapture("^([^/@:]+/[^/@:]+)@([^:]+)$", 2) and + pinnedNwo = pinnedNwo.toLowerCase() and + ( + nwo.toLowerCase() = pinnedNwo + or + nwo.toLowerCase().prefix(pinnedNwo.length() + 1) = pinnedNwo + "/" + ) and + root.lookup("dependencies").(YamlMapping).lookup(pin) = dependency and + dependency.lookup("ref").(YamlScalar).getValue() = ref and + dependency + .lookup("commit") + .(YamlScalar) + .getValue() + .regexpMatch("^(sha1-[A-Fa-f0-9]{40}|sha256-[A-Fa-f0-9]{64})$") + ) + } } diff --git a/actions/ql/lib/codeql/actions/config/Config.qll b/actions/ql/lib/codeql/actions/config/Config.qll index 8b6fcaefa290..27e24514c091 100644 --- a/actions/ql/lib/codeql/actions/config/Config.qll +++ b/actions/ql/lib/codeql/actions/config/Config.qll @@ -135,26 +135,6 @@ predicate trustedActionsOwnerDataModel(string owner) { Extensions::trustedActionsOwnerDataModel(owner) } -/** - * MaD models for `uses` references pinned by the repository's Actions lockfile - * (`.github/workflows/actions.lock`). - * Fields: - * - workflow_path: repo-relative path of the file containing the `uses:` reference - * - nwo: referenced action, optionally including a sub-action path (e.g. `actions/cache/save`) - * - ref: the ref as written in `uses:` (e.g. `v4`) - */ -bindingset[nwo] -predicate pinnedByLockfileDataModel(string workflow_path, string nwo, string ref) { - exists(string pinnedNwo | - Extensions::pinnedByLockfileDataModel(workflow_path, pinnedNwo, ref) and - ( - nwo.toLowerCase() = pinnedNwo - or - nwo.toLowerCase().prefix(pinnedNwo.length() + 1) = pinnedNwo + "/" - ) - ) -} - /** * MaD models for untrusted git commands * Fields: diff --git a/actions/ql/lib/codeql/actions/config/ConfigExtensions.qll b/actions/ql/lib/codeql/actions/config/ConfigExtensions.qll index f40defd2b212..4ee438fc63cb 100644 --- a/actions/ql/lib/codeql/actions/config/ConfigExtensions.qll +++ b/actions/ql/lib/codeql/actions/config/ConfigExtensions.qll @@ -68,23 +68,6 @@ extensible predicate immutableActionsDataModel(string action); */ extensible predicate trustedActionsOwnerDataModel(string owner); -/** - * Holds if the `uses` reference `nwo`@`ref` in the workflow or composite action file at - * `workflow_path` is pinned by an entry in the repository's Actions lockfile - * (`.github/workflows/actions.lock`). - * - * Supply rows from a model pack generated with the canonical parser at - * `github.com/github/actions-lockfile/go/pkg/lockfile`. Each lockfile entry binds an `nwo`@`ref` - * to a verified commit SHA. Without such a model pack this predicate is empty. - * - * Fields: - * - `workflow_path`: repo-relative path of the file containing the `uses:` reference, - * e.g. `.github/workflows/ci.yml`. - * - `nwo`: canonical owner and repository from the lockfile pin, e.g. `actions/cache`. - * - `ref`: the ref (tag or branch) as written in `uses:`, e.g. `v4`. - */ -extensible predicate pinnedByLockfileDataModel(string workflow_path, string nwo, string ref); - /** * Holds for git commands that may introduce untrusted data when called on an attacker controlled branch. */ diff --git a/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql b/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql index d84d0ade3309..e0022b8bfa36 100644 --- a/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql +++ b/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql @@ -64,7 +64,9 @@ where not isSelfRepository(nwo) and not exists(UsesStep step | uses = step and - pinnedByLockfileDataModel(step.getLocation().getFile().getRelativePath(), nwo, version) + exists(ActionsLock lock | + lock.pins(step.getLocation().getFile().getRelativePath(), nwo, version) + ) ) and not ( if uses instanceof UsesStep and isContainerImage(nwo) diff --git a/actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md b/actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md index e02fdc01a905..71eac4248f74 100644 --- a/actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md +++ b/actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md @@ -1,4 +1,4 @@ --- category: minorAnalysis --- -* The `actions/unpinned-tag` query no longer reports `uses:` references recorded by the new `pinnedByLockfileDataModel` extensible predicate. Lockfile pins match repository sub-actions while preserving ref casing. +* The `actions/unpinned-tag` query no longer reports action references pinned by a valid v0.0.2 `.github/workflows/actions.lock` entry for the enclosing workflow. diff --git a/actions/ql/test/qlpack.yml b/actions/ql/test/qlpack.yml index 807ea41f522e..9c9e714fc67a 100644 --- a/actions/ql/test/qlpack.yml +++ b/actions/ql/test/qlpack.yml @@ -11,5 +11,4 @@ extractor: actions tests: . warnOnImplicitThis: true dataExtensions: - - query-tests/Security/CWE-829/*.model.yml - output-clobbering.model.yml diff --git a/actions/ql/test/query-tests/Security/CWE-829-Lockfile/.github/workflows/actions.lock b/actions/ql/test/query-tests/Security/CWE-829-Lockfile/.github/workflows/actions.lock new file mode 100644 index 000000000000..c9dfcc187c6e --- /dev/null +++ b/actions/ql/test/query-tests/Security/CWE-829-Lockfile/.github/workflows/actions.lock @@ -0,0 +1,30 @@ +version: v0.0.2 +workflows: + .github/workflows/rust-ci.yml: + - dtolnay/rust-toolchain@v1 + - mismatched/action@v1 + - malformed/action@v1 + - missing/action@v1 + .github/workflows/other.yml: + - other-workflow/action@v1 +dependencies: + dtolnay/rust-toolchain@v1: + ref: v1 + commit: sha1-6c977a6ca4077a0ceb28ffbe03f59d46e9ac8772 + owner_id: 1940490 + repo_id: 260749683 + other-workflow/action@v1: + ref: v1 + commit: sha1-1111111111111111111111111111111111111111 + owner_id: 1 + repo_id: 2 + mismatched/action@v1: + ref: V1 + commit: sha1-2222222222222222222222222222222222222222 + owner_id: 3 + repo_id: 4 + malformed/action@v1: + ref: v1 + commit: 6c977a6ca4077a0ceb28ffbe03f59d46e9ac8772 + owner_id: 5 + repo_id: 6 diff --git a/actions/ql/test/query-tests/Security/CWE-829-Lockfile/.github/workflows/rust-ci.yml b/actions/ql/test/query-tests/Security/CWE-829-Lockfile/.github/workflows/rust-ci.yml new file mode 100644 index 000000000000..fa09f9c5575d --- /dev/null +++ b/actions/ql/test/query-tests/Security/CWE-829-Lockfile/.github/workflows/rust-ci.yml @@ -0,0 +1,16 @@ +on: + pull_request + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: dtolnay/rust-toolchain@v1 + - uses: DToLnAy/RuSt-ToOlChAiN/save@v1 + - uses: dtolnay/rust-toolchain@V1 + - uses: other-workflow/action@v1 + - uses: mismatched/action@v1 + - uses: malformed/action@v1 + - uses: missing/action@v1 + reusable: + uses: dtolnay/rust-toolchain/.github/workflows/reusable.yml@v1 diff --git a/actions/ql/test/query-tests/Security/CWE-829-Lockfile/UnpinnedActionsTag.expected b/actions/ql/test/query-tests/Security/CWE-829-Lockfile/UnpinnedActionsTag.expected new file mode 100644 index 000000000000..a583011353cd --- /dev/null +++ b/actions/ql/test/query-tests/Security/CWE-829-Lockfile/UnpinnedActionsTag.expected @@ -0,0 +1,6 @@ +| .github/workflows/rust-ci.yml:10:13:10:37 | dtolnay/rust-toolchain@V1 | Unpinned 3rd party Action 'rust-ci.yml' step $@ uses 'dtolnay/rust-toolchain' with ref 'V1', not a pinned commit hash | .github/workflows/rust-ci.yml:10:7:11:4 | Uses Step | Uses Step | +| .github/workflows/rust-ci.yml:11:13:11:36 | other-workflow/action@v1 | Unpinned 3rd party Action 'rust-ci.yml' step $@ uses 'other-workflow/action' with ref 'v1', not a pinned commit hash | .github/workflows/rust-ci.yml:11:7:12:4 | Uses Step | Uses Step | +| .github/workflows/rust-ci.yml:12:13:12:32 | mismatched/action@v1 | Unpinned 3rd party Action 'rust-ci.yml' step $@ uses 'mismatched/action' with ref 'v1', not a pinned commit hash | .github/workflows/rust-ci.yml:12:7:13:4 | Uses Step | Uses Step | +| .github/workflows/rust-ci.yml:13:13:13:31 | malformed/action@v1 | Unpinned 3rd party Action 'rust-ci.yml' step $@ uses 'malformed/action' with ref 'v1', not a pinned commit hash | .github/workflows/rust-ci.yml:13:7:14:4 | Uses Step | Uses Step | +| .github/workflows/rust-ci.yml:14:13:14:29 | missing/action@v1 | Unpinned 3rd party Action 'rust-ci.yml' step $@ uses 'missing/action' with ref 'v1', not a pinned commit hash | .github/workflows/rust-ci.yml:14:7:15:2 | Uses Step | Uses Step | +| .github/workflows/rust-ci.yml:16:11:16:66 | dtolnay/rust-toolchain/.github/workflows/reusable.yml@v1 | Job $@ in 'rust-ci.yml' uses reusable workflow 'dtolnay/rust-toolchain/.github/workflows/reusable.yml' with ref 'v1', not a pinned commit hash | .github/workflows/rust-ci.yml:16:5:16:67 | Job: reusable | Job: reusable | diff --git a/actions/ql/test/query-tests/Security/CWE-829-Lockfile/UnpinnedActionsTag.qlref b/actions/ql/test/query-tests/Security/CWE-829-Lockfile/UnpinnedActionsTag.qlref new file mode 100644 index 000000000000..8c9db66bf6bb --- /dev/null +++ b/actions/ql/test/query-tests/Security/CWE-829-Lockfile/UnpinnedActionsTag.qlref @@ -0,0 +1 @@ +Security/CWE-829/UnpinnedActionsTag.ql diff --git a/actions/ql/test/query-tests/Security/CWE-829-Lockfile/options b/actions/ql/test/query-tests/Security/CWE-829-Lockfile/options new file mode 100644 index 000000000000..af54d6532407 --- /dev/null +++ b/actions/ql/test/query-tests/Security/CWE-829-Lockfile/options @@ -0,0 +1 @@ +semmle-extractor-options: --file-type YAML .github/workflows/actions.lock diff --git a/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/lockfile_pinned.yml b/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/lockfile_pinned.yml deleted file mode 100644 index 6108f659bce1..000000000000 --- a/actions/ql/test/query-tests/Security/CWE-829/.github/workflows/lockfile_pinned.yml +++ /dev/null @@ -1,29 +0,0 @@ -on: - pull_request - -jobs: - build: - name: Build and test - runs-on: ubuntu-latest - steps: - # `some-owner/pinned-action@v1` is a tag ref that would normally be reported as an unpinned - # tag. The test data extension `pinned_by_lockfile.model.yml` records it as pinned by the - # repository's Actions lockfile, so the `not pinnedByLockfile(...)` clause suppresses it (this - # fixture is expected to produce no findings). This mirrors data supplied by an external - # model pack generated from `.github/workflows/actions.lock`. - # - # Negative control is provided for free by the many other fixtures in this directory whose tag - # refs are NOT recorded in the data extension and therefore remain reported. - - uses: some-owner/pinned-action@v1 - # `Mixed-Owner/Pinned-Action@v1` is pinned by the lockfile too, but written with the mixed-case - # owner/repo that authors commonly use (Azure, GoogleCloudPlatform, ...). - # Lockfile pins canonicalize owner/repo, so this ref is also expected to be suppressed (no - # finding). - - uses: Mixed-Owner/Pinned-Action@v1 - # Negative control: a mixed-case ref that is NOT recorded in the lockfile data must still be - # reported, guarding against over-suppression of every mixed-case ref. - - uses: Mixed-Owner/Unpinned-Action@v2 - # A repository-scoped pin also covers its sub-actions. - - uses: some-owner/pinned-action/save@v1 - # Ref casing must match the canonical lockfile pin exactly. - - uses: some-owner/pinned-action@V1 diff --git a/actions/ql/test/query-tests/Security/CWE-829/UnpinnedActionsTag.expected b/actions/ql/test/query-tests/Security/CWE-829/UnpinnedActionsTag.expected index e922727ce58f..05f9cf3d8fd5 100644 --- a/actions/ql/test/query-tests/Security/CWE-829/UnpinnedActionsTag.expected +++ b/actions/ql/test/query-tests/Security/CWE-829/UnpinnedActionsTag.expected @@ -21,8 +21,6 @@ | .github/workflows/label_trusted_checkout2.yml:21:13:21:36 | completely/fakeaction@v2 | Unpinned 3rd party Action 'label_trusted_checkout2.yml' step $@ uses 'completely/fakeaction' with ref 'v2', not a pinned commit hash | .github/workflows/label_trusted_checkout2.yml:21:7:25:4 | Uses Step | Uses Step | | .github/workflows/label_trusted_checkout2.yml:25:13:25:37 | fakerepo/comment-on-pr@v1 | Unpinned 3rd party Action 'label_trusted_checkout2.yml' step $@ uses 'fakerepo/comment-on-pr' with ref 'v1', not a pinned commit hash | .github/workflows/label_trusted_checkout2.yml:25:7:28:21 | Uses Step | Uses Step | | .github/workflows/level0.yml:36:15:36:47 | rlespinasse/github-slug-action@v4 | Unpinned 3rd party Action 'Poutine Level 0' step $@ uses 'rlespinasse/github-slug-action' with ref 'v4', not a pinned commit hash | .github/workflows/level0.yml:36:9:39:6 | Uses Step | Uses Step | -| .github/workflows/lockfile_pinned.yml:25:13:25:42 | Mixed-Owner/Unpinned-Action@v2 | Unpinned 3rd party Action 'lockfile_pinned.yml' step $@ uses 'Mixed-Owner/Unpinned-Action' with ref 'v2', not a pinned commit hash | .github/workflows/lockfile_pinned.yml:25:7:27:4 | Uses Step | Uses Step | -| .github/workflows/lockfile_pinned.yml:29:13:29:39 | some-owner/pinned-action@V1 | Unpinned 3rd party Action 'lockfile_pinned.yml' step $@ uses 'some-owner/pinned-action' with ref 'V1', not a pinned commit hash | .github/workflows/lockfile_pinned.yml:29:7:29:40 | Uses Step | Uses Step | | .github/workflows/mend.yml:31:15:31:34 | ruby/setup-ruby@v1 | Unpinned 3rd party Action 'Test' step $@ uses 'ruby/setup-ruby' with ref 'v1', not a pinned commit hash | .github/workflows/mend.yml:29:9:33:28 | Uses Step | Uses Step | | .github/workflows/pr-workflow.yml:60:15:60:52 | amannn/action-semantic-pull-request@v5 | Unpinned 3rd party Action 'pr-workflow' step $@ uses 'amannn/action-semantic-pull-request' with ref 'v5', not a pinned commit hash | .github/workflows/pr-workflow.yml:60:9:70:6 | Uses Step | Uses Step | | .github/workflows/pr-workflow.yml:109:15:109:42 | actionsdesk/lfs-warning@v3.2 | Unpinned 3rd party Action 'pr-workflow' step $@ uses 'actionsdesk/lfs-warning' with ref 'v3.2', not a pinned commit hash | .github/workflows/pr-workflow.yml:109:9:124:6 | Uses Step | Uses Step | diff --git a/actions/ql/test/query-tests/Security/CWE-829/UntrustedCheckoutCritical.expected b/actions/ql/test/query-tests/Security/CWE-829/UntrustedCheckoutCritical.expected index b17295e6837d..381ca41243f1 100644 --- a/actions/ql/test/query-tests/Security/CWE-829/UntrustedCheckoutCritical.expected +++ b/actions/ql/test/query-tests/Security/CWE-829/UntrustedCheckoutCritical.expected @@ -170,10 +170,6 @@ edges | .github/workflows/level0.yml:125:9:129:6 | Uses Step | .github/workflows/level0.yml:129:9:133:6 | Uses Step | | .github/workflows/level0.yml:128:17:128:57 | github.event.pull_request.head.sha | .github/workflows/level0.yml:125:9:129:6 | Uses Step | | .github/workflows/level0.yml:129:9:133:6 | Uses Step | .github/workflows/level0.yml:133:9:135:23 | Run Step | -| .github/workflows/lockfile_pinned.yml:17:7:22:4 | Uses Step | .github/workflows/lockfile_pinned.yml:22:7:25:4 | Uses Step | -| .github/workflows/lockfile_pinned.yml:22:7:25:4 | Uses Step | .github/workflows/lockfile_pinned.yml:25:7:27:4 | Uses Step | -| .github/workflows/lockfile_pinned.yml:25:7:27:4 | Uses Step | .github/workflows/lockfile_pinned.yml:27:7:29:4 | Uses Step | -| .github/workflows/lockfile_pinned.yml:27:7:29:4 | Uses Step | .github/workflows/lockfile_pinned.yml:29:7:29:40 | Uses Step | | .github/workflows/mend.yml:13:9:22:6 | Run Step: set_ref | .github/workflows/mend.yml:22:9:29:6 | Uses Step | | .github/workflows/mend.yml:22:9:29:6 | Uses Step | .github/workflows/mend.yml:29:9:33:28 | Uses Step | | .github/workflows/mend.yml:27:17:27:48 | steps.set_ref.outputs.ref | .github/workflows/mend.yml:22:9:29:6 | Uses Step | diff --git a/actions/ql/test/query-tests/Security/CWE-829/pinned_by_lockfile.model.yml b/actions/ql/test/query-tests/Security/CWE-829/pinned_by_lockfile.model.yml deleted file mode 100644 index 3250b8914d5a..000000000000 --- a/actions/ql/test/query-tests/Security/CWE-829/pinned_by_lockfile.model.yml +++ /dev/null @@ -1,9 +0,0 @@ -extensions: - - addsTo: - pack: codeql/actions-all - extensible: pinnedByLockfileDataModel - # Canonical lockfile pin rows supplied by an external model pack. - data: - - [".github/workflows/lockfile_pinned.yml", "some-owner/pinned-action", "v1"] - # Owner/repo is canonicalized; ref casing is preserved. - - [".github/workflows/lockfile_pinned.yml", "mixed-owner/pinned-action", "v1"] From 24a18e490f54162e8ccb114579d1e7d090af6e93 Mon Sep 17 00:00:00 2001 From: Jeff Martin Date: Wed, 2 Sep 2026 09:55:08 -0700 Subject: [PATCH 0797/2098] Actions tests: add lockfile inline expectations --- .../.github/workflows/rust-ci.yml | 12 ++++---- .../InlineExpectationsTestQuery.ql | 30 +++++++++++++++++++ .../UnpinnedActionsTag.expected | 2 +- .../CWE-829-Lockfile/UnpinnedActionsTag.qlref | 3 +- 4 files changed, 39 insertions(+), 8 deletions(-) create mode 100644 actions/ql/test/query-tests/Security/CWE-829-Lockfile/InlineExpectationsTestQuery.ql diff --git a/actions/ql/test/query-tests/Security/CWE-829-Lockfile/.github/workflows/rust-ci.yml b/actions/ql/test/query-tests/Security/CWE-829-Lockfile/.github/workflows/rust-ci.yml index fa09f9c5575d..3838b3589dc5 100644 --- a/actions/ql/test/query-tests/Security/CWE-829-Lockfile/.github/workflows/rust-ci.yml +++ b/actions/ql/test/query-tests/Security/CWE-829-Lockfile/.github/workflows/rust-ci.yml @@ -7,10 +7,10 @@ jobs: steps: - uses: dtolnay/rust-toolchain@v1 - uses: DToLnAy/RuSt-ToOlChAiN/save@v1 - - uses: dtolnay/rust-toolchain@V1 - - uses: other-workflow/action@v1 - - uses: mismatched/action@v1 - - uses: malformed/action@v1 - - uses: missing/action@v1 + - uses: dtolnay/rust-toolchain@V1 # $ Alert + - uses: other-workflow/action@v1 # $ Alert + - uses: mismatched/action@v1 # $ Alert + - uses: malformed/action@v1 # $ Alert + - uses: missing/action@v1 # $ Alert reusable: - uses: dtolnay/rust-toolchain/.github/workflows/reusable.yml@v1 + uses: dtolnay/rust-toolchain/.github/workflows/reusable.yml@v1 # $ Alert diff --git a/actions/ql/test/query-tests/Security/CWE-829-Lockfile/InlineExpectationsTestQuery.ql b/actions/ql/test/query-tests/Security/CWE-829-Lockfile/InlineExpectationsTestQuery.ql new file mode 100644 index 000000000000..a67c200cf117 --- /dev/null +++ b/actions/ql/test/query-tests/Security/CWE-829-Lockfile/InlineExpectationsTestQuery.ql @@ -0,0 +1,30 @@ +/** + * @kind test-postprocess + */ + +private import codeql.Locations as Locations +private import codeql.actions.ast.internal.Yaml as Yaml +private import codeql.util.test.InlineExpectationsTest as T +import T::TestPostProcessing + +private module Impl implements T::InlineExpectationsTestSig { + class Location = Locations::Location; + + class ExpectationComment extends Yaml::YamlComment { + string getContents() { result = this.getText() } + } +} + +private module Input implements T::TestPostProcessing::InputSig { + string getRelativeUrl(Locations::Location location) { + exists(int startLine, int startColumn, int endLine, int endColumn | + location.hasLocationInfo(_, startLine, startColumn, endLine, endColumn) + | + result = + location.getFile().getRelativePath() + ":" + startLine + ":" + startColumn + ":" + endLine + + ":" + endColumn + ) + } +} + +import T::TestPostProcessing::Make diff --git a/actions/ql/test/query-tests/Security/CWE-829-Lockfile/UnpinnedActionsTag.expected b/actions/ql/test/query-tests/Security/CWE-829-Lockfile/UnpinnedActionsTag.expected index a583011353cd..98fd715f4a81 100644 --- a/actions/ql/test/query-tests/Security/CWE-829-Lockfile/UnpinnedActionsTag.expected +++ b/actions/ql/test/query-tests/Security/CWE-829-Lockfile/UnpinnedActionsTag.expected @@ -3,4 +3,4 @@ | .github/workflows/rust-ci.yml:12:13:12:32 | mismatched/action@v1 | Unpinned 3rd party Action 'rust-ci.yml' step $@ uses 'mismatched/action' with ref 'v1', not a pinned commit hash | .github/workflows/rust-ci.yml:12:7:13:4 | Uses Step | Uses Step | | .github/workflows/rust-ci.yml:13:13:13:31 | malformed/action@v1 | Unpinned 3rd party Action 'rust-ci.yml' step $@ uses 'malformed/action' with ref 'v1', not a pinned commit hash | .github/workflows/rust-ci.yml:13:7:14:4 | Uses Step | Uses Step | | .github/workflows/rust-ci.yml:14:13:14:29 | missing/action@v1 | Unpinned 3rd party Action 'rust-ci.yml' step $@ uses 'missing/action' with ref 'v1', not a pinned commit hash | .github/workflows/rust-ci.yml:14:7:15:2 | Uses Step | Uses Step | -| .github/workflows/rust-ci.yml:16:11:16:66 | dtolnay/rust-toolchain/.github/workflows/reusable.yml@v1 | Job $@ in 'rust-ci.yml' uses reusable workflow 'dtolnay/rust-toolchain/.github/workflows/reusable.yml' with ref 'v1', not a pinned commit hash | .github/workflows/rust-ci.yml:16:5:16:67 | Job: reusable | Job: reusable | +| .github/workflows/rust-ci.yml:16:11:16:66 | dtolnay/rust-toolchain/.github/workflows/reusable.yml@v1 | Job $@ in 'rust-ci.yml' uses reusable workflow 'dtolnay/rust-toolchain/.github/workflows/reusable.yml' with ref 'v1', not a pinned commit hash | .github/workflows/rust-ci.yml:16:5:16:77 | Job: reusable | Job: reusable | diff --git a/actions/ql/test/query-tests/Security/CWE-829-Lockfile/UnpinnedActionsTag.qlref b/actions/ql/test/query-tests/Security/CWE-829-Lockfile/UnpinnedActionsTag.qlref index 8c9db66bf6bb..9278832ade5c 100644 --- a/actions/ql/test/query-tests/Security/CWE-829-Lockfile/UnpinnedActionsTag.qlref +++ b/actions/ql/test/query-tests/Security/CWE-829-Lockfile/UnpinnedActionsTag.qlref @@ -1 +1,2 @@ -Security/CWE-829/UnpinnedActionsTag.ql +query: Security/CWE-829/UnpinnedActionsTag.ql +postprocess: InlineExpectationsTestQuery.ql From e005d151552e09f290ef7a7de18d4364a50cc6ba Mon Sep 17 00:00:00 2001 From: Jeff Martin Date: Wed, 2 Sep 2026 13:24:23 -0700 Subject: [PATCH 0798/2098] Actions tests: share inline expectations utility --- .../utils/test/ActionsInlineExpectationsTestQuery.ql} | 0 .../Security/CWE-829-Lockfile/UnpinnedActionsTag.qlref | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename actions/ql/{test/query-tests/Security/CWE-829-Lockfile/InlineExpectationsTestQuery.ql => lib/utils/test/ActionsInlineExpectationsTestQuery.ql} (100%) diff --git a/actions/ql/test/query-tests/Security/CWE-829-Lockfile/InlineExpectationsTestQuery.ql b/actions/ql/lib/utils/test/ActionsInlineExpectationsTestQuery.ql similarity index 100% rename from actions/ql/test/query-tests/Security/CWE-829-Lockfile/InlineExpectationsTestQuery.ql rename to actions/ql/lib/utils/test/ActionsInlineExpectationsTestQuery.ql diff --git a/actions/ql/test/query-tests/Security/CWE-829-Lockfile/UnpinnedActionsTag.qlref b/actions/ql/test/query-tests/Security/CWE-829-Lockfile/UnpinnedActionsTag.qlref index 9278832ade5c..e8bf2d64977b 100644 --- a/actions/ql/test/query-tests/Security/CWE-829-Lockfile/UnpinnedActionsTag.qlref +++ b/actions/ql/test/query-tests/Security/CWE-829-Lockfile/UnpinnedActionsTag.qlref @@ -1,2 +1,2 @@ query: Security/CWE-829/UnpinnedActionsTag.ql -postprocess: InlineExpectationsTestQuery.ql +postprocess: utils/test/ActionsInlineExpectationsTestQuery.ql From 38f59df789fce75c82610ff2579cea9f7eaa3eea Mon Sep 17 00:00:00 2001 From: Jeff Martin Date: Wed, 2 Sep 2026 20:28:18 -0700 Subject: [PATCH 0799/2098] Actions tests: keep inline adapter outside library API --- .../Security/CWE-829-Lockfile/UnpinnedActionsTag.qlref | 2 +- .../test => test/utils}/ActionsInlineExpectationsTestQuery.ql | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename actions/ql/{lib/utils/test => test/utils}/ActionsInlineExpectationsTestQuery.ql (100%) diff --git a/actions/ql/test/query-tests/Security/CWE-829-Lockfile/UnpinnedActionsTag.qlref b/actions/ql/test/query-tests/Security/CWE-829-Lockfile/UnpinnedActionsTag.qlref index e8bf2d64977b..d33a5b380859 100644 --- a/actions/ql/test/query-tests/Security/CWE-829-Lockfile/UnpinnedActionsTag.qlref +++ b/actions/ql/test/query-tests/Security/CWE-829-Lockfile/UnpinnedActionsTag.qlref @@ -1,2 +1,2 @@ query: Security/CWE-829/UnpinnedActionsTag.ql -postprocess: utils/test/ActionsInlineExpectationsTestQuery.ql +postprocess: utils/ActionsInlineExpectationsTestQuery.ql diff --git a/actions/ql/lib/utils/test/ActionsInlineExpectationsTestQuery.ql b/actions/ql/test/utils/ActionsInlineExpectationsTestQuery.ql similarity index 100% rename from actions/ql/lib/utils/test/ActionsInlineExpectationsTestQuery.ql rename to actions/ql/test/utils/ActionsInlineExpectationsTestQuery.ql From 2b7e7ab61080c2666a0d2aadc9be93c462608e40 Mon Sep 17 00:00:00 2001 From: Jeff Martin Date: Wed, 2 Sep 2026 21:07:09 -0700 Subject: [PATCH 0800/2098] Actions lockfiles: ignore schema version value --- actions/ql/lib/codeql/actions/Lock.qll | 5 ++--- .../change-notes/2026-07-09-unpinned-tag-lockfile-aware.md | 2 +- .../Security/CWE-829-Lockfile/.github/workflows/actions.lock | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/actions/ql/lib/codeql/actions/Lock.qll b/actions/ql/lib/codeql/actions/Lock.qll index 03a92060641d..062d74a54f90 100644 --- a/actions/ql/lib/codeql/actions/Lock.qll +++ b/actions/ql/lib/codeql/actions/Lock.qll @@ -9,8 +9,8 @@ class ActionsLock extends YamlDocument { ActionsLock() { this.getFile().getBaseName() = "actions.lock" } /** - * Holds if the v0.0.2 lockfile records `nwo` at `ref` for `workflowPath` with a full commit - * digest. Repository pins also cover sub-actions such as `actions/cache/save`. + * Holds if the lockfile records `nwo` at `ref` for `workflowPath` with a full commit digest. + * Repository pins also cover sub-actions such as `actions/cache/save`. */ bindingset[nwo] predicate pins(string workflowPath, string nwo, string ref) { @@ -20,7 +20,6 @@ class ActionsLock extends YamlDocument { string pin, string pinnedNwo | root = this and - root.lookup("version").(YamlScalar).getValue() = "v0.0.2" and root.lookup("workflows").(YamlMapping).lookup(workflowPath) = workflowPins and workflowPins.getElement(_) = pinNode and pin = pinNode.getValue() and diff --git a/actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md b/actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md index 71eac4248f74..258850e3c52a 100644 --- a/actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md +++ b/actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md @@ -1,4 +1,4 @@ --- category: minorAnalysis --- -* The `actions/unpinned-tag` query no longer reports action references pinned by a valid v0.0.2 `.github/workflows/actions.lock` entry for the enclosing workflow. +* The `actions/unpinned-tag` query no longer reports action references pinned by a structurally valid `.github/workflows/actions.lock` entry for the enclosing workflow. diff --git a/actions/ql/test/query-tests/Security/CWE-829-Lockfile/.github/workflows/actions.lock b/actions/ql/test/query-tests/Security/CWE-829-Lockfile/.github/workflows/actions.lock index c9dfcc187c6e..f34ae47c6610 100644 --- a/actions/ql/test/query-tests/Security/CWE-829-Lockfile/.github/workflows/actions.lock +++ b/actions/ql/test/query-tests/Security/CWE-829-Lockfile/.github/workflows/actions.lock @@ -1,4 +1,4 @@ -version: v0.0.2 +version: future-version workflows: .github/workflows/rust-ci.yml: - dtolnay/rust-toolchain@v1 From a2213ae984f9149c3577d186036962f61ef4bd14 Mon Sep 17 00:00:00 2001 From: Jeff Martin Date: Wed, 2 Sep 2026 22:02:00 -0700 Subject: [PATCH 0801/2098] Actions lockfiles: match repository casing --- actions/ql/lib/codeql/actions/Lock.qll | 5 ++--- .../Security/CWE-829-Lockfile/.github/workflows/actions.lock | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/actions/ql/lib/codeql/actions/Lock.qll b/actions/ql/lib/codeql/actions/Lock.qll index 062d74a54f90..f1d4e9445f05 100644 --- a/actions/ql/lib/codeql/actions/Lock.qll +++ b/actions/ql/lib/codeql/actions/Lock.qll @@ -25,11 +25,10 @@ class ActionsLock extends YamlDocument { pin = pinNode.getValue() and pinnedNwo = pin.regexpCapture("^([^/@:]+/[^/@:]+)@([^:]+)$", 1) and ref = pin.regexpCapture("^([^/@:]+/[^/@:]+)@([^:]+)$", 2) and - pinnedNwo = pinnedNwo.toLowerCase() and ( - nwo.toLowerCase() = pinnedNwo + nwo.toLowerCase() = pinnedNwo.toLowerCase() or - nwo.toLowerCase().prefix(pinnedNwo.length() + 1) = pinnedNwo + "/" + nwo.toLowerCase().prefix(pinnedNwo.length() + 1) = pinnedNwo.toLowerCase() + "/" ) and root.lookup("dependencies").(YamlMapping).lookup(pin) = dependency and dependency.lookup("ref").(YamlScalar).getValue() = ref and diff --git a/actions/ql/test/query-tests/Security/CWE-829-Lockfile/.github/workflows/actions.lock b/actions/ql/test/query-tests/Security/CWE-829-Lockfile/.github/workflows/actions.lock index f34ae47c6610..8f42f6f8181f 100644 --- a/actions/ql/test/query-tests/Security/CWE-829-Lockfile/.github/workflows/actions.lock +++ b/actions/ql/test/query-tests/Security/CWE-829-Lockfile/.github/workflows/actions.lock @@ -1,14 +1,14 @@ version: future-version workflows: .github/workflows/rust-ci.yml: - - dtolnay/rust-toolchain@v1 + - DToLnAy/RuSt-ToOlChAiN@v1 - mismatched/action@v1 - malformed/action@v1 - missing/action@v1 .github/workflows/other.yml: - other-workflow/action@v1 dependencies: - dtolnay/rust-toolchain@v1: + DToLnAy/RuSt-ToOlChAiN@v1: ref: v1 commit: sha1-6c977a6ca4077a0ceb28ffbe03f59d46e9ac8772 owner_id: 1940490 From ff9bf5db531f4a503d08ead85014f68f747493b4 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 3 Sep 2026 10:24:53 +0200 Subject: [PATCH 0802/2098] Code review suggestions --- actions/ql/lib/codeql/actions/Lock.qll | 46 ++++++++++--------- .../Security/CWE-829/UnpinnedActionsTag.ql | 7 +-- 2 files changed, 25 insertions(+), 28 deletions(-) diff --git a/actions/ql/lib/codeql/actions/Lock.qll b/actions/ql/lib/codeql/actions/Lock.qll index f1d4e9445f05..020b097300db 100644 --- a/actions/ql/lib/codeql/actions/Lock.qll +++ b/actions/ql/lib/codeql/actions/Lock.qll @@ -2,35 +2,21 @@ * Provides classes for working with GitHub Actions lockfiles. */ +private import actions private import codeql.actions.ast.internal.Yaml -/** An `actions.lock` file. */ -class ActionsLock extends YamlDocument { - ActionsLock() { this.getFile().getBaseName() = "actions.lock" } +/** A `.github/workflows/actions.lock` file. */ +class ActionsLock extends YamlDocument, YamlMapping { + ActionsLock() { this.getFile().getRelativePath() = ".github/workflows/actions.lock" } - /** - * Holds if the lockfile records `nwo` at `ref` for `workflowPath` with a full commit digest. - * Repository pins also cover sub-actions such as `actions/cache/save`. - */ - bindingset[nwo] - predicate pins(string workflowPath, string nwo, string ref) { - this.getFile().getRelativePath() = ".github/workflows/actions.lock" and - exists( - YamlMapping root, YamlSequence workflowPins, YamlScalar pinNode, YamlMapping dependency, - string pin, string pinnedNwo - | - root = this and - root.lookup("workflows").(YamlMapping).lookup(workflowPath) = workflowPins and + private predicate pins0(string workflowPath, string pinnedNwo, string ref) { + exists(YamlSequence workflowPins, YamlScalar pinNode, YamlMapping dependency, string pin | + this.lookup("workflows").(YamlMapping).lookup(workflowPath) = workflowPins and workflowPins.getElement(_) = pinNode and pin = pinNode.getValue() and pinnedNwo = pin.regexpCapture("^([^/@:]+/[^/@:]+)@([^:]+)$", 1) and ref = pin.regexpCapture("^([^/@:]+/[^/@:]+)@([^:]+)$", 2) and - ( - nwo.toLowerCase() = pinnedNwo.toLowerCase() - or - nwo.toLowerCase().prefix(pinnedNwo.length() + 1) = pinnedNwo.toLowerCase() + "/" - ) and - root.lookup("dependencies").(YamlMapping).lookup(pin) = dependency and + this.lookup("dependencies").(YamlMapping).lookup(pin) = dependency and dependency.lookup("ref").(YamlScalar).getValue() = ref and dependency .lookup("commit") @@ -39,4 +25,20 @@ class ActionsLock extends YamlDocument { .regexpMatch("^(sha1-[A-Fa-f0-9]{40}|sha256-[A-Fa-f0-9]{64})$") ) } + + /** + * Holds if this lockfile pins the use at `uses` to `ref` with a full commit digest. + * Repository pins also cover sub-actions such as `actions/cache/save`. + */ + predicate pins(UsesStep uses, string ref) { + exists(string workflowPath, string pinnedNwo, string nwo | + this.pins0(workflowPath, pinnedNwo, ref) and + workflowPath = uses.getLocation().getFile().getRelativePath() and + nwo = uses.getCallee() + | + nwo.toLowerCase() = pinnedNwo.toLowerCase() + or + nwo.toLowerCase().prefix(pinnedNwo.length() + 1) = pinnedNwo.toLowerCase() + "/" + ) + } } diff --git a/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql b/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql index e0022b8bfa36..8a1f821d073a 100644 --- a/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql +++ b/actions/ql/src/Security/CWE-829/UnpinnedActionsTag.ql @@ -62,12 +62,7 @@ where uses.getVersion() = version and not isTrustedOwner(nwo) and not isSelfRepository(nwo) and - not exists(UsesStep step | - uses = step and - exists(ActionsLock lock | - lock.pins(step.getLocation().getFile().getRelativePath(), nwo, version) - ) - ) and + not any(ActionsLock lock).pins(uses, version) and not ( if uses instanceof UsesStep and isContainerImage(nwo) then isPinnedContainer(version) From 5b343f26ec3fb90578a861e8df676178fbf84631 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 9 Sep 2026 15:43:56 +0000 Subject: [PATCH 0803/2098] Import unittest.mock explicitly in test_tsg_parser Co-authored-by: tausbn <1104778+tausbn@users.noreply.github.com> --- python/extractor/tests/test_tsg_parser.py | 1 + 1 file changed, 1 insertion(+) diff --git a/python/extractor/tests/test_tsg_parser.py b/python/extractor/tests/test_tsg_parser.py index 49514830c2d6..7dac2c06111f 100644 --- a/python/extractor/tests/test_tsg_parser.py +++ b/python/extractor/tests/test_tsg_parser.py @@ -1,4 +1,5 @@ import unittest +import unittest.mock import json from semmle.logging import format_message From 9c85aabcd4e2df562e534754dca85fcbd8afabcf Mon Sep 17 00:00:00 2001 From: AkshayK Date: Thu, 27 Aug 2026 10:17:19 -0400 Subject: [PATCH 0804/2098] cpp: model Protocol Buffers parse/serialize taint flow Add flow summaries for the protobuf C++ API on google::protobuf::MessageLite (subtypes=true, so Message and all generated messages are covered): - ParseFrom*/MergeFrom* (string, array, Cord, istream, zero-copy and coded-stream forms) propagate taint from the encoded input to the message. - SerializeTo*/AppendTo* propagate taint from the message to the output buffer or stream; SerializeAs*/... to the return value. File-descriptor variants are omitted (the fd is an int, not a buffer). --- .../2026-08-27-protobuf-models.md | 4 + cpp/ql/lib/ext/Protobuf.model.yml | 58 +++++++++ .../dataflow/external-models/flow.expected | 47 +++++++ .../dataflow/external-models/protobuf.cpp | 122 ++++++++++++++++++ .../dataflow/external-models/steps.expected | 15 +++ 5 files changed, 246 insertions(+) create mode 100644 cpp/ql/lib/change-notes/2026-08-27-protobuf-models.md create mode 100644 cpp/ql/lib/ext/Protobuf.model.yml create mode 100644 cpp/ql/test/library-tests/dataflow/external-models/protobuf.cpp diff --git a/cpp/ql/lib/change-notes/2026-08-27-protobuf-models.md b/cpp/ql/lib/change-notes/2026-08-27-protobuf-models.md new file mode 100644 index 000000000000..a039b28de676 --- /dev/null +++ b/cpp/ql/lib/change-notes/2026-08-27-protobuf-models.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added flow summaries for the Protocol Buffers C++ API (`google::protobuf::MessageLite`, covering `Message` and all generated messages). The `ParseFrom*`/`MergeFrom*` methods (string, array, Cord, istream, and zero-copy/coded-stream forms) propagate taint from the encoded input to the message, and the `SerializeTo*`/`SerializeAs*`/`AppendTo*` methods propagate taint from the message to the output buffer, stream, or return value. diff --git a/cpp/ql/lib/ext/Protobuf.model.yml b/cpp/ql/lib/ext/Protobuf.model.yml new file mode 100644 index 000000000000..b080855536a1 --- /dev/null +++ b/cpp/ql/lib/ext/Protobuf.model.yml @@ -0,0 +1,58 @@ +extensions: + - addsTo: + pack: codeql/cpp-all + extensible: summaryModel + data: # namespace, type, subtypes, name, signature, ext, input, output, kind, provenance + # Flow summaries for the Protocol Buffers C++ API. All of these methods are declared on + # `google::protobuf::MessageLite`; `subtypes` covers `Message` and every generated message. + # + # File-descriptor variants (`{Parse,Serialize}*FromFileDescriptor`) are intentionally omitted: + # the descriptor is an `int`, not a data buffer, so there is no buffer argument to model. + + # Deserialization: the encoded input (`Argument[*0]`) taints the message (`this`). + - ["google::protobuf", "MessageLite", True, "ParseFromString", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "ParsePartialFromString", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "MergeFromString", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "MergePartialFromString", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "ParseFromArray", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "ParsePartialFromArray", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "ParseFromCord", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "ParsePartialFromCord", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "MergeFromCord", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "MergePartialFromCord", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "ParseFromIstream", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "ParsePartialFromIstream", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "ParseFromZeroCopyStream", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "ParsePartialFromZeroCopyStream", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "ParseFromBoundedZeroCopyStream", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "ParsePartialFromBoundedZeroCopyStream", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "MergeFromBoundedZeroCopyStream", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "MergePartialFromBoundedZeroCopyStream", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "ParseFromCodedStream", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "ParsePartialFromCodedStream", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "MergeFromCodedStream", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "MergePartialFromCodedStream", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + + # Serialization into an output buffer/stream: the message (`this`) taints `Argument[*0]`. + - ["google::protobuf", "MessageLite", True, "SerializeToString", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "SerializePartialToString", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "AppendToString", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "AppendPartialToString", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "SerializeToArray", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "SerializePartialToArray", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "SerializeToCord", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "SerializePartialToCord", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "AppendToCord", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "AppendPartialToCord", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "SerializeToOstream", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "SerializePartialToOstream", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "SerializeToZeroCopyStream", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "SerializePartialToZeroCopyStream", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "SerializeToCodedStream", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "SerializePartialToCodedStream", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + + # Serialization returning the bytes: the message (`this`) taints the (by-value) return value. + - ["google::protobuf", "MessageLite", True, "SerializeAsString", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "SerializePartialAsString", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "SerializeAsCord", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "SerializePartialAsCord", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index ee6d7539cc0a..9ac2b53f5094 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -119,6 +119,10 @@ models | 118 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view,flags); ; Argument[0..1]; ReturnValue; taint; manual | | 119 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view,flags,error_code &); ; Argument[0..1]; ReturnValue; taint; manual | | 120 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | +| 121 | Summary: google::protobuf; MessageLite; true; ParseFromArray; ; ; Argument[*0]; Argument[-1]; taint; manual | +| 122 | Summary: google::protobuf; MessageLite; true; ParseFromString; ; ; Argument[*0]; Argument[-1]; taint; manual | +| 123 | Summary: google::protobuf; MessageLite; true; SerializeAsString; ; ; Argument[-1]; ReturnValue; taint; manual | +| 124 | Summary: google::protobuf; MessageLite; true; SerializeToArray; ; ; Argument[-1]; Argument[*0]; taint; manual | edges | asio_streams.cpp:129:34:129:44 | read_until output argument | asio_streams.cpp:133:7:133:17 | recv_buffer | provenance | Src:MaD:56 | | asio_streams.cpp:129:34:129:44 | read_until output argument | asio_streams.cpp:135:29:135:39 | recv_buffer | provenance | Src:MaD:56 Sink:MaD:4 | @@ -263,6 +267,26 @@ edges | bdlbb.cpp:94:46:94:48 | *src | bdlbb.cpp:94:37:94:40 | copy output argument | provenance | MaD:100 | | bdlbb.cpp:96:37:96:39 | copy output argument | bdlbb.cpp:97:7:97:10 | * ... | provenance | | | bdlbb.cpp:96:42:96:44 | *dst | bdlbb.cpp:96:37:96:39 | copy output argument | provenance | MaD:102 | +| protobuf.cpp:75:33:75:40 | call to source | protobuf.cpp:76:22:76:25 | *data | provenance | TaintFunction | +| protobuf.cpp:76:2:76:4 | ParseFromString output argument | protobuf.cpp:78:2:78:4 | *msg | provenance | | +| protobuf.cpp:76:22:76:25 | *data | protobuf.cpp:76:2:76:4 | ParseFromString output argument | provenance | MaD:122 | +| protobuf.cpp:78:2:78:4 | *msg | protobuf.cpp:78:23:78:25 | SerializeToArray output argument | provenance | MaD:124 | +| protobuf.cpp:78:23:78:25 | SerializeToArray output argument | protobuf.cpp:79:7:79:10 | * ... | provenance | | +| protobuf.cpp:84:33:84:40 | call to source | protobuf.cpp:85:21:85:31 | *call to data | provenance | TaintFunction | +| protobuf.cpp:85:2:85:4 | ParseFromArray output argument | protobuf.cpp:87:2:87:4 | *msg | provenance | | +| protobuf.cpp:85:21:85:31 | *call to data | protobuf.cpp:85:2:85:4 | ParseFromArray output argument | provenance | MaD:121 | +| protobuf.cpp:87:2:87:4 | *msg | protobuf.cpp:87:23:87:25 | SerializeToArray output argument | provenance | MaD:124 | +| protobuf.cpp:87:23:87:25 | SerializeToArray output argument | protobuf.cpp:88:7:88:10 | * ... | provenance | | +| protobuf.cpp:95:33:95:40 | call to source | protobuf.cpp:96:22:96:25 | *data | provenance | TaintFunction | +| protobuf.cpp:96:2:96:4 | ParseFromString output argument | protobuf.cpp:98:23:98:25 | *msg | provenance | | +| protobuf.cpp:96:22:96:25 | *data | protobuf.cpp:96:2:96:4 | ParseFromString output argument | provenance | MaD:122 | +| protobuf.cpp:98:2:98:5 | ParseFromString output argument | protobuf.cpp:100:2:100:5 | *msg2 | provenance | | +| protobuf.cpp:98:23:98:25 | *msg | protobuf.cpp:98:27:98:43 | call to SerializeAsString | provenance | MaD:123 | +| protobuf.cpp:98:23:98:45 | call to SerializeAsString | protobuf.cpp:98:2:98:5 | ParseFromString output argument | provenance | MaD:122 | +| protobuf.cpp:98:27:98:43 | call to SerializeAsString | protobuf.cpp:98:23:98:45 | call to SerializeAsString | provenance | | +| protobuf.cpp:98:27:98:43 | call to SerializeAsString | protobuf.cpp:98:27:98:43 | call to SerializeAsString | provenance | | +| protobuf.cpp:100:2:100:5 | *msg2 | protobuf.cpp:100:24:100:26 | SerializeToArray output argument | provenance | MaD:124 | +| protobuf.cpp:100:24:100:26 | SerializeToArray output argument | protobuf.cpp:101:7:101:10 | * ... | provenance | | | test.cpp:7:47:7:52 | value2 | test.cpp:7:64:7:69 | value2 | provenance | | | test.cpp:7:64:7:69 | value2 | test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | provenance | | | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:10:10:10:18 | call to ymlSource | provenance | Src:MaD:48 | @@ -765,6 +789,29 @@ nodes | bdlbb.cpp:96:37:96:39 | copy output argument | semmle.label | copy output argument | | bdlbb.cpp:96:42:96:44 | *dst | semmle.label | *dst | | bdlbb.cpp:97:7:97:10 | * ... | semmle.label | * ... | +| protobuf.cpp:75:33:75:40 | call to source | semmle.label | call to source | +| protobuf.cpp:76:2:76:4 | ParseFromString output argument | semmle.label | ParseFromString output argument | +| protobuf.cpp:76:22:76:25 | *data | semmle.label | *data | +| protobuf.cpp:78:2:78:4 | *msg | semmle.label | *msg | +| protobuf.cpp:78:23:78:25 | SerializeToArray output argument | semmle.label | SerializeToArray output argument | +| protobuf.cpp:79:7:79:10 | * ... | semmle.label | * ... | +| protobuf.cpp:84:33:84:40 | call to source | semmle.label | call to source | +| protobuf.cpp:85:2:85:4 | ParseFromArray output argument | semmle.label | ParseFromArray output argument | +| protobuf.cpp:85:21:85:31 | *call to data | semmle.label | *call to data | +| protobuf.cpp:87:2:87:4 | *msg | semmle.label | *msg | +| protobuf.cpp:87:23:87:25 | SerializeToArray output argument | semmle.label | SerializeToArray output argument | +| protobuf.cpp:88:7:88:10 | * ... | semmle.label | * ... | +| protobuf.cpp:95:33:95:40 | call to source | semmle.label | call to source | +| protobuf.cpp:96:2:96:4 | ParseFromString output argument | semmle.label | ParseFromString output argument | +| protobuf.cpp:96:22:96:25 | *data | semmle.label | *data | +| protobuf.cpp:98:2:98:5 | ParseFromString output argument | semmle.label | ParseFromString output argument | +| protobuf.cpp:98:23:98:25 | *msg | semmle.label | *msg | +| protobuf.cpp:98:23:98:45 | call to SerializeAsString | semmle.label | call to SerializeAsString | +| protobuf.cpp:98:27:98:43 | call to SerializeAsString | semmle.label | call to SerializeAsString | +| protobuf.cpp:98:27:98:43 | call to SerializeAsString | semmle.label | call to SerializeAsString | +| protobuf.cpp:100:2:100:5 | *msg2 | semmle.label | *msg2 | +| protobuf.cpp:100:24:100:26 | SerializeToArray output argument | semmle.label | SerializeToArray output argument | +| protobuf.cpp:101:7:101:10 | * ... | semmle.label | * ... | | test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | semmle.label | *ymlStepGenerated_with_body | | test.cpp:7:47:7:52 | value2 | semmle.label | value2 | | test.cpp:7:64:7:69 | value2 | semmle.label | value2 | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/protobuf.cpp b/cpp/ql/test/library-tests/dataflow/external-models/protobuf.cpp new file mode 100644 index 000000000000..f7bb22a4855b --- /dev/null +++ b/cpp/ql/test/library-tests/dataflow/external-models/protobuf.cpp @@ -0,0 +1,122 @@ + +// --- stub library headers --- + +namespace std { + typedef unsigned long size_t; + + template class allocator { + }; + + template struct char_traits { + }; + + template, class Allocator = allocator > + class basic_string { + public: + basic_string(); + basic_string(const charT* s, const Allocator& a = Allocator()); + const charT* data() const; + size_t size() const; + }; + + typedef basic_string string; + + class istream { + public: + istream(); + }; + + class ostream { + public: + ostream(); + }; +} + +namespace google { +namespace protobuf { + // A faithful subset of `MessageLite`; every method below is declared on `MessageLite` + // in the real headers (message_lite.h), including the iostream-based ones. + class MessageLite { + public: + bool ParseFromString(const std::string &data); + bool MergeFromString(const std::string &data); + bool ParsePartialFromString(const std::string &data); + bool ParseFromArray(const void *data, int size); + bool ParseFromIstream(std::istream *input); + bool SerializeToString(std::string *output) const; + bool SerializePartialToString(std::string *output) const; + bool AppendToString(std::string *output) const; + bool SerializeToArray(void *data, int size) const; + bool SerializeToOstream(std::ostream *output) const; + std::string SerializeAsString() const; + }; + + class Message : public MessageLite { + }; +} +} + +// A generated message type derives from `Message`. +class Person : public google::protobuf::Message { +}; + +// --- test code --- + +char *source(); +void sink(char); + +// Message taint is observed through `SerializeToArray`, whose scalar output flows cleanly +// to a sink. The object-typed serialize outputs (String/Ostream/...) and the input-stream +// parse methods are checked directly by `steps.ql`, which asserts each summary step exists. + +// Deserialization: the encoded input taints the message (`this`). +void test_ParseFromString() { + Person msg; + std::string data = std::string(source()); + msg.ParseFromString(data); + char buf[64]; + msg.SerializeToArray(buf, sizeof(buf)); + sink(*buf); // $ ir +} + +void test_ParseFromArray() { + Person msg; + std::string data = std::string(source()); + msg.ParseFromArray(data.data(), data.size()); + char buf[64]; + msg.SerializeToArray(buf, sizeof(buf)); + sink(*buf); // $ ir +} + +// Serialization returning the bytes: the message taints the returned string, observed by +// parsing it into a second message and serializing that back out. +void test_SerializeAsString() { + Person msg; + std::string data = std::string(source()); + msg.ParseFromString(data); + Person msg2; + msg2.ParseFromString(msg.SerializeAsString()); + char buf[64]; + msg2.SerializeToArray(buf, sizeof(buf)); + sink(*buf); // $ ir +} + +// Additional modeled methods, exercised so their summary steps are covered by `steps.ql`. +void test_step_coverage() { + Person msg; + std::string data = std::string(source()); + + msg.MergeFromString(data); + msg.ParsePartialFromString(data); + + std::istream in; + msg.ParseFromIstream(&in); + + std::string out; + msg.SerializeToString(&out); + msg.SerializePartialToString(&out); + msg.AppendToString(&out); + + std::ostream os; + msg.SerializeToOstream(&os); +} diff --git a/cpp/ql/test/library-tests/dataflow/external-models/steps.expected b/cpp/ql/test/library-tests/dataflow/external-models/steps.expected index 04d300ecbc81..d2b2bf7c0276 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/steps.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/steps.expected @@ -82,6 +82,21 @@ | bdlbb.cpp:92:48:92:51 | *call to data | bdlbb.cpp:92:37:92:40 | copy output argument | | bdlbb.cpp:94:46:94:48 | *src | bdlbb.cpp:94:37:94:40 | copy output argument | | bdlbb.cpp:96:42:96:44 | *dst | bdlbb.cpp:96:37:96:39 | copy output argument | +| protobuf.cpp:76:22:76:25 | *data | protobuf.cpp:76:2:76:4 | ParseFromString output argument | +| protobuf.cpp:78:2:78:4 | *msg | protobuf.cpp:78:23:78:25 | SerializeToArray output argument | +| protobuf.cpp:85:21:85:31 | *call to data | protobuf.cpp:85:2:85:4 | ParseFromArray output argument | +| protobuf.cpp:87:2:87:4 | *msg | protobuf.cpp:87:23:87:25 | SerializeToArray output argument | +| protobuf.cpp:96:22:96:25 | *data | protobuf.cpp:96:2:96:4 | ParseFromString output argument | +| protobuf.cpp:98:23:98:25 | *msg | protobuf.cpp:98:27:98:43 | call to SerializeAsString | +| protobuf.cpp:98:23:98:45 | call to SerializeAsString | protobuf.cpp:98:2:98:5 | ParseFromString output argument | +| protobuf.cpp:100:2:100:5 | *msg2 | protobuf.cpp:100:24:100:26 | SerializeToArray output argument | +| protobuf.cpp:109:22:109:25 | *data | protobuf.cpp:109:2:109:4 | MergeFromString output argument | +| protobuf.cpp:110:29:110:32 | *data | protobuf.cpp:110:2:110:4 | ParsePartialFromString output argument | +| protobuf.cpp:113:23:113:25 | *& ... | protobuf.cpp:113:2:113:4 | ParseFromIstream output argument | +| protobuf.cpp:116:2:116:4 | *msg | protobuf.cpp:116:24:116:27 | SerializeToString output argument | +| protobuf.cpp:117:2:117:4 | *msg | protobuf.cpp:117:31:117:34 | SerializePartialToString output argument | +| protobuf.cpp:118:2:118:4 | *msg | protobuf.cpp:118:21:118:24 | AppendToString output argument | +| protobuf.cpp:121:2:121:4 | *msg | protobuf.cpp:121:25:121:27 | SerializeToOstream output argument | | test.cpp:17:24:17:24 | x | test.cpp:17:10:17:22 | call to ymlStepManual | | test.cpp:21:27:21:27 | x | test.cpp:21:10:21:25 | call to ymlStepGenerated | | test.cpp:25:35:25:35 | x | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | From a7e25845e8aa0bd91bcb3cff1615a6b15361cd1b Mon Sep 17 00:00:00 2001 From: Akshay K Date: Fri, 28 Aug 2026 12:28:40 -0400 Subject: [PATCH 0805/2098] Update cpp/ql/lib/change-notes/2026-08-27-protobuf-models.md Co-authored-by: Jeroen Ketema <93738568+jketema@users.noreply.github.com> --- cpp/ql/lib/change-notes/2026-08-27-protobuf-models.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/ql/lib/change-notes/2026-08-27-protobuf-models.md b/cpp/ql/lib/change-notes/2026-08-27-protobuf-models.md index a039b28de676..f68eaac98cfc 100644 --- a/cpp/ql/lib/change-notes/2026-08-27-protobuf-models.md +++ b/cpp/ql/lib/change-notes/2026-08-27-protobuf-models.md @@ -1,4 +1,4 @@ --- category: minorAnalysis --- -* Added flow summaries for the Protocol Buffers C++ API (`google::protobuf::MessageLite`, covering `Message` and all generated messages). The `ParseFrom*`/`MergeFrom*` methods (string, array, Cord, istream, and zero-copy/coded-stream forms) propagate taint from the encoded input to the message, and the `SerializeTo*`/`SerializeAs*`/`AppendTo*` methods propagate taint from the message to the output buffer, stream, or return value. +* Added flow summaries for the Protocol Buffers C++ API (`google::protobuf::MessageLite`, covering `Message` and all generated messages). From d84a3024db254de65bac7aaa46985a7641dd5765 Mon Sep 17 00:00:00 2001 From: AkshayK Date: Fri, 28 Aug 2026 13:14:39 -0400 Subject: [PATCH 0806/2098] fix(cpp): correct protobuf string parse models and expand test coverage --- cpp/ql/lib/ext/Protobuf.model.yml | 17 +- .../dataflow/external-models/flow.expected | 80 ++++----- .../dataflow/external-models/protobuf.cpp | 160 +++++++++++++++--- .../dataflow/external-models/steps.expected | 65 +++++-- .../external-models/validatemodels.expected | 1 + 5 files changed, 233 insertions(+), 90 deletions(-) diff --git a/cpp/ql/lib/ext/Protobuf.model.yml b/cpp/ql/lib/ext/Protobuf.model.yml index b080855536a1..08171f22e298 100644 --- a/cpp/ql/lib/ext/Protobuf.model.yml +++ b/cpp/ql/lib/ext/Protobuf.model.yml @@ -9,11 +9,18 @@ extensions: # File-descriptor variants (`{Parse,Serialize}*FromFileDescriptor`) are intentionally omitted: # the descriptor is an `int`, not a data buffer, so there is no buffer argument to model. - # Deserialization: the encoded input (`Argument[*0]`) taints the message (`this`). - - ["google::protobuf", "MessageLite", True, "ParseFromString", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] - - ["google::protobuf", "MessageLite", True, "ParsePartialFromString", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] - - ["google::protobuf", "MessageLite", True, "MergeFromString", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] - - ["google::protobuf", "MessageLite", True, "MergePartialFromString", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + # Deserialization: the encoded input taints the message (`this`). The `*FromString` methods each + # have a `string_view` overload (the buffer is the by-value argument, so `Argument[0]`) and a + # `const Cord &` overload (the buffer is behind a reference, so `Argument[*0]`). The remaining + # inputs below are pointers or references, so they take `Argument[*0]`. + - ["google::protobuf", "MessageLite", True, "ParseFromString", "(string_view)", "", "Argument[0]", "Argument[-1]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "ParseFromString", "(const Cord &)", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "ParsePartialFromString", "(string_view)", "", "Argument[0]", "Argument[-1]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "ParsePartialFromString", "(const Cord &)", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "MergeFromString", "(string_view)", "", "Argument[0]", "Argument[-1]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "MergeFromString", "(const Cord &)", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "MergePartialFromString", "(string_view)", "", "Argument[0]", "Argument[-1]", "taint", "manual"] + - ["google::protobuf", "MessageLite", True, "MergePartialFromString", "(const Cord &)", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] - ["google::protobuf", "MessageLite", True, "ParseFromArray", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] - ["google::protobuf", "MessageLite", True, "ParsePartialFromArray", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] - ["google::protobuf", "MessageLite", True, "ParseFromCord", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index 9ac2b53f5094..e4434fddee46 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -120,9 +120,8 @@ models | 119 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view,flags,error_code &); ; Argument[0..1]; ReturnValue; taint; manual | | 120 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | | 121 | Summary: google::protobuf; MessageLite; true; ParseFromArray; ; ; Argument[*0]; Argument[-1]; taint; manual | -| 122 | Summary: google::protobuf; MessageLite; true; ParseFromString; ; ; Argument[*0]; Argument[-1]; taint; manual | -| 123 | Summary: google::protobuf; MessageLite; true; SerializeAsString; ; ; Argument[-1]; ReturnValue; taint; manual | -| 124 | Summary: google::protobuf; MessageLite; true; SerializeToArray; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 122 | Summary: google::protobuf; MessageLite; true; SerializeAsString; ; ; Argument[-1]; ReturnValue; taint; manual | +| 123 | Summary: google::protobuf; MessageLite; true; SerializeToArray; ; ; Argument[-1]; Argument[*0]; taint; manual | edges | asio_streams.cpp:129:34:129:44 | read_until output argument | asio_streams.cpp:133:7:133:17 | recv_buffer | provenance | Src:MaD:56 | | asio_streams.cpp:129:34:129:44 | read_until output argument | asio_streams.cpp:135:29:135:39 | recv_buffer | provenance | Src:MaD:56 Sink:MaD:4 | @@ -267,26 +266,21 @@ edges | bdlbb.cpp:94:46:94:48 | *src | bdlbb.cpp:94:37:94:40 | copy output argument | provenance | MaD:100 | | bdlbb.cpp:96:37:96:39 | copy output argument | bdlbb.cpp:97:7:97:10 | * ... | provenance | | | bdlbb.cpp:96:42:96:44 | *dst | bdlbb.cpp:96:37:96:39 | copy output argument | provenance | MaD:102 | -| protobuf.cpp:75:33:75:40 | call to source | protobuf.cpp:76:22:76:25 | *data | provenance | TaintFunction | -| protobuf.cpp:76:2:76:4 | ParseFromString output argument | protobuf.cpp:78:2:78:4 | *msg | provenance | | -| protobuf.cpp:76:22:76:25 | *data | protobuf.cpp:76:2:76:4 | ParseFromString output argument | provenance | MaD:122 | -| protobuf.cpp:78:2:78:4 | *msg | protobuf.cpp:78:23:78:25 | SerializeToArray output argument | provenance | MaD:124 | -| protobuf.cpp:78:23:78:25 | SerializeToArray output argument | protobuf.cpp:79:7:79:10 | * ... | provenance | | -| protobuf.cpp:84:33:84:40 | call to source | protobuf.cpp:85:21:85:31 | *call to data | provenance | TaintFunction | -| protobuf.cpp:85:2:85:4 | ParseFromArray output argument | protobuf.cpp:87:2:87:4 | *msg | provenance | | -| protobuf.cpp:85:21:85:31 | *call to data | protobuf.cpp:85:2:85:4 | ParseFromArray output argument | provenance | MaD:121 | -| protobuf.cpp:87:2:87:4 | *msg | protobuf.cpp:87:23:87:25 | SerializeToArray output argument | provenance | MaD:124 | -| protobuf.cpp:87:23:87:25 | SerializeToArray output argument | protobuf.cpp:88:7:88:10 | * ... | provenance | | -| protobuf.cpp:95:33:95:40 | call to source | protobuf.cpp:96:22:96:25 | *data | provenance | TaintFunction | -| protobuf.cpp:96:2:96:4 | ParseFromString output argument | protobuf.cpp:98:23:98:25 | *msg | provenance | | -| protobuf.cpp:96:22:96:25 | *data | protobuf.cpp:96:2:96:4 | ParseFromString output argument | provenance | MaD:122 | -| protobuf.cpp:98:2:98:5 | ParseFromString output argument | protobuf.cpp:100:2:100:5 | *msg2 | provenance | | -| protobuf.cpp:98:23:98:25 | *msg | protobuf.cpp:98:27:98:43 | call to SerializeAsString | provenance | MaD:123 | -| protobuf.cpp:98:23:98:45 | call to SerializeAsString | protobuf.cpp:98:2:98:5 | ParseFromString output argument | provenance | MaD:122 | -| protobuf.cpp:98:27:98:43 | call to SerializeAsString | protobuf.cpp:98:23:98:45 | call to SerializeAsString | provenance | | -| protobuf.cpp:98:27:98:43 | call to SerializeAsString | protobuf.cpp:98:27:98:43 | call to SerializeAsString | provenance | | -| protobuf.cpp:100:2:100:5 | *msg2 | protobuf.cpp:100:24:100:26 | SerializeToArray output argument | provenance | MaD:124 | -| protobuf.cpp:100:24:100:26 | SerializeToArray output argument | protobuf.cpp:101:7:101:10 | * ... | provenance | | +| protobuf.cpp:140:33:140:40 | call to source | protobuf.cpp:141:21:141:31 | *call to data | provenance | TaintFunction | +| protobuf.cpp:141:2:141:4 | ParseFromArray output argument | protobuf.cpp:143:2:143:4 | *msg | provenance | | +| protobuf.cpp:141:21:141:31 | *call to data | protobuf.cpp:141:2:141:4 | ParseFromArray output argument | provenance | MaD:121 | +| protobuf.cpp:143:2:143:4 | *msg | protobuf.cpp:143:23:143:25 | SerializeToArray output argument | provenance | MaD:123 | +| protobuf.cpp:143:23:143:25 | SerializeToArray output argument | protobuf.cpp:144:7:144:10 | * ... | provenance | | +| protobuf.cpp:151:33:151:40 | call to source | protobuf.cpp:152:21:152:31 | *call to data | provenance | TaintFunction | +| protobuf.cpp:152:2:152:4 | ParseFromArray output argument | protobuf.cpp:153:18:153:20 | *msg | provenance | | +| protobuf.cpp:152:21:152:31 | *call to data | protobuf.cpp:152:2:152:4 | ParseFromArray output argument | provenance | MaD:121 | +| protobuf.cpp:153:18:153:20 | *msg | protobuf.cpp:153:22:153:38 | call to SerializeAsString | provenance | MaD:122 | +| protobuf.cpp:153:22:153:38 | call to SerializeAsString | protobuf.cpp:153:22:153:38 | call to SerializeAsString | provenance | | +| protobuf.cpp:153:22:153:38 | call to SerializeAsString | protobuf.cpp:155:22:155:29 | *call to data | provenance | TaintFunction | +| protobuf.cpp:155:2:155:5 | ParseFromArray output argument | protobuf.cpp:157:2:157:5 | *msg2 | provenance | | +| protobuf.cpp:155:22:155:29 | *call to data | protobuf.cpp:155:2:155:5 | ParseFromArray output argument | provenance | MaD:121 | +| protobuf.cpp:157:2:157:5 | *msg2 | protobuf.cpp:157:24:157:26 | SerializeToArray output argument | provenance | MaD:123 | +| protobuf.cpp:157:24:157:26 | SerializeToArray output argument | protobuf.cpp:158:7:158:10 | * ... | provenance | | | test.cpp:7:47:7:52 | value2 | test.cpp:7:64:7:69 | value2 | provenance | | | test.cpp:7:64:7:69 | value2 | test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | provenance | | | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:10:10:10:18 | call to ymlSource | provenance | Src:MaD:48 | @@ -789,29 +783,23 @@ nodes | bdlbb.cpp:96:37:96:39 | copy output argument | semmle.label | copy output argument | | bdlbb.cpp:96:42:96:44 | *dst | semmle.label | *dst | | bdlbb.cpp:97:7:97:10 | * ... | semmle.label | * ... | -| protobuf.cpp:75:33:75:40 | call to source | semmle.label | call to source | -| protobuf.cpp:76:2:76:4 | ParseFromString output argument | semmle.label | ParseFromString output argument | -| protobuf.cpp:76:22:76:25 | *data | semmle.label | *data | -| protobuf.cpp:78:2:78:4 | *msg | semmle.label | *msg | -| protobuf.cpp:78:23:78:25 | SerializeToArray output argument | semmle.label | SerializeToArray output argument | -| protobuf.cpp:79:7:79:10 | * ... | semmle.label | * ... | -| protobuf.cpp:84:33:84:40 | call to source | semmle.label | call to source | -| protobuf.cpp:85:2:85:4 | ParseFromArray output argument | semmle.label | ParseFromArray output argument | -| protobuf.cpp:85:21:85:31 | *call to data | semmle.label | *call to data | -| protobuf.cpp:87:2:87:4 | *msg | semmle.label | *msg | -| protobuf.cpp:87:23:87:25 | SerializeToArray output argument | semmle.label | SerializeToArray output argument | -| protobuf.cpp:88:7:88:10 | * ... | semmle.label | * ... | -| protobuf.cpp:95:33:95:40 | call to source | semmle.label | call to source | -| protobuf.cpp:96:2:96:4 | ParseFromString output argument | semmle.label | ParseFromString output argument | -| protobuf.cpp:96:22:96:25 | *data | semmle.label | *data | -| protobuf.cpp:98:2:98:5 | ParseFromString output argument | semmle.label | ParseFromString output argument | -| protobuf.cpp:98:23:98:25 | *msg | semmle.label | *msg | -| protobuf.cpp:98:23:98:45 | call to SerializeAsString | semmle.label | call to SerializeAsString | -| protobuf.cpp:98:27:98:43 | call to SerializeAsString | semmle.label | call to SerializeAsString | -| protobuf.cpp:98:27:98:43 | call to SerializeAsString | semmle.label | call to SerializeAsString | -| protobuf.cpp:100:2:100:5 | *msg2 | semmle.label | *msg2 | -| protobuf.cpp:100:24:100:26 | SerializeToArray output argument | semmle.label | SerializeToArray output argument | -| protobuf.cpp:101:7:101:10 | * ... | semmle.label | * ... | +| protobuf.cpp:140:33:140:40 | call to source | semmle.label | call to source | +| protobuf.cpp:141:2:141:4 | ParseFromArray output argument | semmle.label | ParseFromArray output argument | +| protobuf.cpp:141:21:141:31 | *call to data | semmle.label | *call to data | +| protobuf.cpp:143:2:143:4 | *msg | semmle.label | *msg | +| protobuf.cpp:143:23:143:25 | SerializeToArray output argument | semmle.label | SerializeToArray output argument | +| protobuf.cpp:144:7:144:10 | * ... | semmle.label | * ... | +| protobuf.cpp:151:33:151:40 | call to source | semmle.label | call to source | +| protobuf.cpp:152:2:152:4 | ParseFromArray output argument | semmle.label | ParseFromArray output argument | +| protobuf.cpp:152:21:152:31 | *call to data | semmle.label | *call to data | +| protobuf.cpp:153:18:153:20 | *msg | semmle.label | *msg | +| protobuf.cpp:153:22:153:38 | call to SerializeAsString | semmle.label | call to SerializeAsString | +| protobuf.cpp:153:22:153:38 | call to SerializeAsString | semmle.label | call to SerializeAsString | +| protobuf.cpp:155:2:155:5 | ParseFromArray output argument | semmle.label | ParseFromArray output argument | +| protobuf.cpp:155:22:155:29 | *call to data | semmle.label | *call to data | +| protobuf.cpp:157:2:157:5 | *msg2 | semmle.label | *msg2 | +| protobuf.cpp:157:24:157:26 | SerializeToArray output argument | semmle.label | SerializeToArray output argument | +| protobuf.cpp:158:7:158:10 | * ... | semmle.label | * ... | | test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | semmle.label | *ymlStepGenerated_with_body | | test.cpp:7:47:7:52 | value2 | semmle.label | value2 | | test.cpp:7:64:7:69 | value2 | semmle.label | value2 | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/protobuf.cpp b/cpp/ql/test/library-tests/dataflow/external-models/protobuf.cpp index f7bb22a4855b..bc9a29ce45a0 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/protobuf.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/protobuf.cpp @@ -32,23 +32,86 @@ namespace std { }; } +namespace absl { + // `absl::string_view` is passed by value; `absl::Cord` is passed by const reference. + class string_view { + public: + string_view(); + string_view(const char *s); + string_view(const std::string &s); + }; + + class Cord { + public: + Cord(); + }; +} + namespace google { namespace protobuf { - // A faithful subset of `MessageLite`; every method below is declared on `MessageLite` - // in the real headers (message_lite.h), including the iostream-based ones. + namespace io { + class ZeroCopyInputStream {}; + class ZeroCopyOutputStream {}; + class CodedInputStream {}; + class CodedOutputStream {}; + } + + // A faithful subset of `MessageLite`. The string/Cord/stream signatures mirror the real + // `message_lite.h`; the iostream-based methods are declared on `Message` in the real headers + // but are modeled here on `MessageLite` (with `subtypes` covering `Message`). class MessageLite { public: - bool ParseFromString(const std::string &data); - bool MergeFromString(const std::string &data); - bool ParsePartialFromString(const std::string &data); + // Deserialization: input taints the message. + bool ParseFromString(absl::string_view data); + bool ParseFromString(const absl::Cord &data); + bool ParsePartialFromString(absl::string_view data); + bool ParsePartialFromString(const absl::Cord &data); + bool MergeFromString(absl::string_view data); + bool MergeFromString(const absl::Cord &data); + bool MergePartialFromString(absl::string_view data); + bool MergePartialFromString(const absl::Cord &data); bool ParseFromArray(const void *data, int size); + bool ParsePartialFromArray(const void *data, int size); + bool ParseFromCord(const absl::Cord &data); + bool ParsePartialFromCord(const absl::Cord &data); + bool MergeFromCord(const absl::Cord &data); + bool MergePartialFromCord(const absl::Cord &data); bool ParseFromIstream(std::istream *input); + bool ParsePartialFromIstream(std::istream *input); + bool ParseFromZeroCopyStream(io::ZeroCopyInputStream *input); + bool ParsePartialFromZeroCopyStream(io::ZeroCopyInputStream *input); + bool ParseFromBoundedZeroCopyStream(io::ZeroCopyInputStream *input, int size); + bool ParsePartialFromBoundedZeroCopyStream(io::ZeroCopyInputStream *input, int size); + bool MergeFromBoundedZeroCopyStream(io::ZeroCopyInputStream *input, int size); + bool MergePartialFromBoundedZeroCopyStream(io::ZeroCopyInputStream *input, int size); + bool ParseFromCodedStream(io::CodedInputStream *input); + bool ParsePartialFromCodedStream(io::CodedInputStream *input); + bool MergeFromCodedStream(io::CodedInputStream *input); + bool MergePartialFromCodedStream(io::CodedInputStream *input); + + // Serialization into an output buffer/stream: the message taints the output argument. bool SerializeToString(std::string *output) const; bool SerializePartialToString(std::string *output) const; bool AppendToString(std::string *output) const; + bool AppendPartialToString(std::string *output) const; bool SerializeToArray(void *data, int size) const; + bool SerializePartialToArray(void *data, int size) const; + bool SerializeToCord(absl::Cord *output) const; + bool SerializePartialToCord(absl::Cord *output) const; + bool AppendToCord(absl::Cord *output) const; + bool AppendPartialToCord(absl::Cord *output) const; bool SerializeToOstream(std::ostream *output) const; + bool SerializePartialToOstream(std::ostream *output) const; + bool SerializeToZeroCopyStream(io::ZeroCopyOutputStream *output) const; + bool SerializePartialToZeroCopyStream(io::ZeroCopyOutputStream *output) const; + bool SerializeToCodedStream(io::CodedOutputStream *output) const; + bool SerializePartialToCodedStream(io::CodedOutputStream *output) const; + + // Serialization returning the bytes. std::string SerializeAsString() const; + std::string SerializePartialAsString() const; + absl::Cord SerializeAsCord() const; + absl::Cord SerializePartialAsCord() const; }; class Message : public MessageLite { @@ -65,20 +128,13 @@ class Person : public google::protobuf::Message { char *source(); void sink(char); -// Message taint is observed through `SerializeToArray`, whose scalar output flows cleanly -// to a sink. The object-typed serialize outputs (String/Ostream/...) and the input-stream -// parse methods are checked directly by `steps.ql`, which asserts each summary step exists. +// End-to-end flow is demonstrated through the pointer-to-buffer methods, where content taint +// flows naturally: `ParseFromArray` reads a tainted buffer into the message, and `SerializeToArray` +// writes the message back out to a scalar buffer that reaches the sink. The `string_view`, `Cord`, +// and stream overloads do not carry content taint through their argument conversions without further +// library models, so they are exercised for summary-step coverage (`steps.ql`) rather than flow. // Deserialization: the encoded input taints the message (`this`). -void test_ParseFromString() { - Person msg; - std::string data = std::string(source()); - msg.ParseFromString(data); - char buf[64]; - msg.SerializeToArray(buf, sizeof(buf)); - sink(*buf); // $ ir -} - void test_ParseFromArray() { Person msg; std::string data = std::string(source()); @@ -88,35 +144,91 @@ void test_ParseFromArray() { sink(*buf); // $ ir } -// Serialization returning the bytes: the message taints the returned string, observed by -// parsing it into a second message and serializing that back out. +// Serialization returning the bytes: the message taints the returned string, observed by parsing it +// into a second message and serializing that back out. void test_SerializeAsString() { Person msg; std::string data = std::string(source()); - msg.ParseFromString(data); + msg.ParseFromArray(data.data(), data.size()); + std::string s = msg.SerializeAsString(); Person msg2; - msg2.ParseFromString(msg.SerializeAsString()); + msg2.ParseFromArray(s.data(), s.size()); char buf[64]; msg2.SerializeToArray(buf, sizeof(buf)); sink(*buf); // $ ir } -// Additional modeled methods, exercised so their summary steps are covered by `steps.ql`. +// Every modeled method is called below so its summary step is covered by `steps.ql`. Endpoint +// mistakes and rows that fail to bind show up as missing lines in `steps.expected`. void test_step_coverage() { Person msg; std::string data = std::string(source()); + absl::string_view sv = data; + absl::Cord cord; + + msg.ParseFromString(sv); + msg.ParseFromString(cord); + msg.ParsePartialFromString(sv); + msg.ParsePartialFromString(cord); + msg.MergeFromString(sv); + msg.MergeFromString(cord); + msg.MergePartialFromString(sv); + msg.MergePartialFromString(cord); + + msg.ParsePartialFromArray(data.data(), data.size()); - msg.MergeFromString(data); - msg.ParsePartialFromString(data); + msg.ParseFromCord(cord); + msg.ParsePartialFromCord(cord); + msg.MergeFromCord(cord); + msg.MergePartialFromCord(cord); std::istream in; msg.ParseFromIstream(&in); + msg.ParsePartialFromIstream(&in); + + google::protobuf::io::ZeroCopyInputStream zin; + msg.ParseFromZeroCopyStream(&zin); + msg.ParsePartialFromZeroCopyStream(&zin); + msg.ParseFromBoundedZeroCopyStream(&zin, 1); + msg.ParsePartialFromBoundedZeroCopyStream(&zin, 1); + msg.MergeFromBoundedZeroCopyStream(&zin, 1); + msg.MergePartialFromBoundedZeroCopyStream(&zin, 1); + + google::protobuf::io::CodedInputStream cin; + msg.ParseFromCodedStream(&cin); + msg.ParsePartialFromCodedStream(&cin); + msg.MergeFromCodedStream(&cin); + msg.MergePartialFromCodedStream(&cin); std::string out; msg.SerializeToString(&out); msg.SerializePartialToString(&out); msg.AppendToString(&out); + msg.AppendPartialToString(&out); + + char buf[64]; + msg.SerializePartialToArray(buf, sizeof(buf)); + + absl::Cord cordout; + msg.SerializeToCord(&cordout); + msg.SerializePartialToCord(&cordout); + msg.AppendToCord(&cordout); + msg.AppendPartialToCord(&cordout); std::ostream os; msg.SerializeToOstream(&os); + msg.SerializePartialToOstream(&os); + + google::protobuf::io::ZeroCopyOutputStream zout; + msg.SerializeToZeroCopyStream(&zout); + msg.SerializePartialToZeroCopyStream(&zout); + + google::protobuf::io::CodedOutputStream cout; + msg.SerializeToCodedStream(&cout); + msg.SerializePartialToCodedStream(&cout); + + msg.SerializeAsString(); + msg.SerializePartialAsString(); + msg.SerializeAsCord(); + msg.SerializePartialAsCord(); } diff --git a/cpp/ql/test/library-tests/dataflow/external-models/steps.expected b/cpp/ql/test/library-tests/dataflow/external-models/steps.expected index d2b2bf7c0276..c1811c3357fa 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/steps.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/steps.expected @@ -82,21 +82,56 @@ | bdlbb.cpp:92:48:92:51 | *call to data | bdlbb.cpp:92:37:92:40 | copy output argument | | bdlbb.cpp:94:46:94:48 | *src | bdlbb.cpp:94:37:94:40 | copy output argument | | bdlbb.cpp:96:42:96:44 | *dst | bdlbb.cpp:96:37:96:39 | copy output argument | -| protobuf.cpp:76:22:76:25 | *data | protobuf.cpp:76:2:76:4 | ParseFromString output argument | -| protobuf.cpp:78:2:78:4 | *msg | protobuf.cpp:78:23:78:25 | SerializeToArray output argument | -| protobuf.cpp:85:21:85:31 | *call to data | protobuf.cpp:85:2:85:4 | ParseFromArray output argument | -| protobuf.cpp:87:2:87:4 | *msg | protobuf.cpp:87:23:87:25 | SerializeToArray output argument | -| protobuf.cpp:96:22:96:25 | *data | protobuf.cpp:96:2:96:4 | ParseFromString output argument | -| protobuf.cpp:98:23:98:25 | *msg | protobuf.cpp:98:27:98:43 | call to SerializeAsString | -| protobuf.cpp:98:23:98:45 | call to SerializeAsString | protobuf.cpp:98:2:98:5 | ParseFromString output argument | -| protobuf.cpp:100:2:100:5 | *msg2 | protobuf.cpp:100:24:100:26 | SerializeToArray output argument | -| protobuf.cpp:109:22:109:25 | *data | protobuf.cpp:109:2:109:4 | MergeFromString output argument | -| protobuf.cpp:110:29:110:32 | *data | protobuf.cpp:110:2:110:4 | ParsePartialFromString output argument | -| protobuf.cpp:113:23:113:25 | *& ... | protobuf.cpp:113:2:113:4 | ParseFromIstream output argument | -| protobuf.cpp:116:2:116:4 | *msg | protobuf.cpp:116:24:116:27 | SerializeToString output argument | -| protobuf.cpp:117:2:117:4 | *msg | protobuf.cpp:117:31:117:34 | SerializePartialToString output argument | -| protobuf.cpp:118:2:118:4 | *msg | protobuf.cpp:118:21:118:24 | AppendToString output argument | -| protobuf.cpp:121:2:121:4 | *msg | protobuf.cpp:121:25:121:27 | SerializeToOstream output argument | +| protobuf.cpp:141:21:141:31 | *call to data | protobuf.cpp:141:2:141:4 | ParseFromArray output argument | +| protobuf.cpp:143:2:143:4 | *msg | protobuf.cpp:143:23:143:25 | SerializeToArray output argument | +| protobuf.cpp:152:21:152:31 | *call to data | protobuf.cpp:152:2:152:4 | ParseFromArray output argument | +| protobuf.cpp:153:18:153:20 | *msg | protobuf.cpp:153:22:153:38 | call to SerializeAsString | +| protobuf.cpp:155:22:155:29 | *call to data | protobuf.cpp:155:2:155:5 | ParseFromArray output argument | +| protobuf.cpp:157:2:157:5 | *msg2 | protobuf.cpp:157:24:157:26 | SerializeToArray output argument | +| protobuf.cpp:169:22:169:23 | sv | protobuf.cpp:169:2:169:4 | ParseFromString output argument | +| protobuf.cpp:170:22:170:25 | *cord | protobuf.cpp:170:2:170:4 | ParseFromString output argument | +| protobuf.cpp:171:29:171:30 | sv | protobuf.cpp:171:2:171:4 | ParsePartialFromString output argument | +| protobuf.cpp:172:29:172:32 | *cord | protobuf.cpp:172:2:172:4 | ParsePartialFromString output argument | +| protobuf.cpp:173:22:173:23 | sv | protobuf.cpp:173:2:173:4 | MergeFromString output argument | +| protobuf.cpp:174:22:174:25 | *cord | protobuf.cpp:174:2:174:4 | MergeFromString output argument | +| protobuf.cpp:175:29:175:30 | sv | protobuf.cpp:175:2:175:4 | MergePartialFromString output argument | +| protobuf.cpp:176:29:176:32 | *cord | protobuf.cpp:176:2:176:4 | MergePartialFromString output argument | +| protobuf.cpp:178:28:178:38 | *call to data | protobuf.cpp:178:2:178:4 | ParsePartialFromArray output argument | +| protobuf.cpp:180:20:180:23 | *cord | protobuf.cpp:180:2:180:4 | ParseFromCord output argument | +| protobuf.cpp:181:27:181:30 | *cord | protobuf.cpp:181:2:181:4 | ParsePartialFromCord output argument | +| protobuf.cpp:182:20:182:23 | *cord | protobuf.cpp:182:2:182:4 | MergeFromCord output argument | +| protobuf.cpp:183:27:183:30 | *cord | protobuf.cpp:183:2:183:4 | MergePartialFromCord output argument | +| protobuf.cpp:186:23:186:25 | *& ... | protobuf.cpp:186:2:186:4 | ParseFromIstream output argument | +| protobuf.cpp:187:30:187:32 | *& ... | protobuf.cpp:187:2:187:4 | ParsePartialFromIstream output argument | +| protobuf.cpp:190:30:190:33 | *& ... | protobuf.cpp:190:2:190:4 | ParseFromZeroCopyStream output argument | +| protobuf.cpp:191:37:191:40 | *& ... | protobuf.cpp:191:2:191:4 | ParsePartialFromZeroCopyStream output argument | +| protobuf.cpp:192:37:192:40 | *& ... | protobuf.cpp:192:2:192:4 | ParseFromBoundedZeroCopyStream output argument | +| protobuf.cpp:193:44:193:47 | *& ... | protobuf.cpp:193:2:193:4 | ParsePartialFromBoundedZeroCopyStream output argument | +| protobuf.cpp:194:37:194:40 | *& ... | protobuf.cpp:194:2:194:4 | MergeFromBoundedZeroCopyStream output argument | +| protobuf.cpp:195:44:195:47 | *& ... | protobuf.cpp:195:2:195:4 | MergePartialFromBoundedZeroCopyStream output argument | +| protobuf.cpp:198:27:198:30 | *& ... | protobuf.cpp:198:2:198:4 | ParseFromCodedStream output argument | +| protobuf.cpp:199:34:199:37 | *& ... | protobuf.cpp:199:2:199:4 | ParsePartialFromCodedStream output argument | +| protobuf.cpp:200:27:200:30 | *& ... | protobuf.cpp:200:2:200:4 | MergeFromCodedStream output argument | +| protobuf.cpp:201:34:201:37 | *& ... | protobuf.cpp:201:2:201:4 | MergePartialFromCodedStream output argument | +| protobuf.cpp:204:2:204:4 | *msg | protobuf.cpp:204:24:204:27 | SerializeToString output argument | +| protobuf.cpp:205:2:205:4 | *msg | protobuf.cpp:205:31:205:34 | SerializePartialToString output argument | +| protobuf.cpp:206:2:206:4 | *msg | protobuf.cpp:206:21:206:24 | AppendToString output argument | +| protobuf.cpp:207:2:207:4 | *msg | protobuf.cpp:207:28:207:31 | AppendPartialToString output argument | +| protobuf.cpp:210:2:210:4 | *msg | protobuf.cpp:210:30:210:32 | SerializePartialToArray output argument | +| protobuf.cpp:213:2:213:4 | *msg | protobuf.cpp:213:22:213:29 | SerializeToCord output argument | +| protobuf.cpp:214:2:214:4 | *msg | protobuf.cpp:214:29:214:36 | SerializePartialToCord output argument | +| protobuf.cpp:215:2:215:4 | *msg | protobuf.cpp:215:19:215:26 | AppendToCord output argument | +| protobuf.cpp:216:2:216:4 | *msg | protobuf.cpp:216:26:216:33 | AppendPartialToCord output argument | +| protobuf.cpp:219:2:219:4 | *msg | protobuf.cpp:219:25:219:27 | SerializeToOstream output argument | +| protobuf.cpp:220:2:220:4 | *msg | protobuf.cpp:220:32:220:34 | SerializePartialToOstream output argument | +| protobuf.cpp:223:2:223:4 | *msg | protobuf.cpp:223:32:223:36 | SerializeToZeroCopyStream output argument | +| protobuf.cpp:224:2:224:4 | *msg | protobuf.cpp:224:39:224:43 | SerializePartialToZeroCopyStream output argument | +| protobuf.cpp:227:2:227:4 | *msg | protobuf.cpp:227:29:227:33 | SerializeToCodedStream output argument | +| protobuf.cpp:228:2:228:4 | *msg | protobuf.cpp:228:36:228:40 | SerializePartialToCodedStream output argument | +| protobuf.cpp:230:2:230:4 | *msg | protobuf.cpp:230:6:230:22 | call to SerializeAsString | +| protobuf.cpp:231:2:231:4 | *msg | protobuf.cpp:231:6:231:29 | call to SerializePartialAsString | +| protobuf.cpp:232:2:232:4 | *msg | protobuf.cpp:232:6:232:20 | call to SerializeAsCord | +| protobuf.cpp:233:2:233:4 | *msg | protobuf.cpp:233:6:233:27 | call to SerializePartialAsCord | | test.cpp:17:24:17:24 | x | test.cpp:17:10:17:22 | call to ymlStepManual | | test.cpp:21:27:21:27 | x | test.cpp:21:10:21:25 | call to ymlStepGenerated | | test.cpp:25:35:25:35 | x | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/validatemodels.expected b/cpp/ql/test/library-tests/dataflow/external-models/validatemodels.expected index 694427213c86..d5b0b0cc0213 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/validatemodels.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/validatemodels.expected @@ -3167,6 +3167,7 @@ | Dubious signature "(const CURLU *,CURLUPart,char **,unsigned int)" in summary model. | | Dubious signature "(const ComPtr &)" in summary model. | | Dubious signature "(const Command *,const size_t,const BlockSplit *,const BlockSplit *,const BlockSplit *,const uint8_t *,size_t,size_t,uint8_t,uint8_t,const ContextType *,HistogramLiteral *,HistogramCommand *,HistogramDistance *)" in summary model. | +| Dubious signature "(const Cord &)" in summary model. | | Dubious signature "(const Curl_easy *,const connectdata *,int)" in summary model. | | Dubious signature "(const DH *)" in summary model. | | Dubious signature "(const DH *,const BIGNUM *)" in summary model. | From d603cddea0bca8a21cfffe4fbfd8da19d0936963 Mon Sep 17 00:00:00 2001 From: AkshayK Date: Thu, 3 Sep 2026 05:29:47 -0400 Subject: [PATCH 0807/2098] test(cpp): add sink-based protobuf model tests and trim comments Replace the step-coverage function with one sink test per model row using a template source, declare the Cord overloads of the ToString methods in the stub, drop the incorrect istream comment from the fixture, and shorten the model-file and change-note comments per review. --- .../2026-08-27-protobuf-models.md | 2 +- cpp/ql/lib/ext/Protobuf.model.yml | 12 +- .../dataflow/external-models/flow.expected | 519 ++++++++++++++++-- .../dataflow/external-models/protobuf.cpp | 414 +++++++++++--- .../dataflow/external-models/steps.expected | 102 ++-- 5 files changed, 874 insertions(+), 175 deletions(-) diff --git a/cpp/ql/lib/change-notes/2026-08-27-protobuf-models.md b/cpp/ql/lib/change-notes/2026-08-27-protobuf-models.md index f68eaac98cfc..952a1e2a0e33 100644 --- a/cpp/ql/lib/change-notes/2026-08-27-protobuf-models.md +++ b/cpp/ql/lib/change-notes/2026-08-27-protobuf-models.md @@ -1,4 +1,4 @@ --- category: minorAnalysis --- -* Added flow summaries for the Protocol Buffers C++ API (`google::protobuf::MessageLite`, covering `Message` and all generated messages). +* Added flow summaries for the Protocol Buffers `google::protobuf::MessageLite` C++ API. diff --git a/cpp/ql/lib/ext/Protobuf.model.yml b/cpp/ql/lib/ext/Protobuf.model.yml index 08171f22e298..02bbad0b1282 100644 --- a/cpp/ql/lib/ext/Protobuf.model.yml +++ b/cpp/ql/lib/ext/Protobuf.model.yml @@ -3,16 +3,10 @@ extensions: pack: codeql/cpp-all extensible: summaryModel data: # namespace, type, subtypes, name, signature, ext, input, output, kind, provenance - # Flow summaries for the Protocol Buffers C++ API. All of these methods are declared on - # `google::protobuf::MessageLite`; `subtypes` covers `Message` and every generated message. - # # File-descriptor variants (`{Parse,Serialize}*FromFileDescriptor`) are intentionally omitted: # the descriptor is an `int`, not a data buffer, so there is no buffer argument to model. - # Deserialization: the encoded input taints the message (`this`). The `*FromString` methods each - # have a `string_view` overload (the buffer is the by-value argument, so `Argument[0]`) and a - # `const Cord &` overload (the buffer is behind a reference, so `Argument[*0]`). The remaining - # inputs below are pointers or references, so they take `Argument[*0]`. + # Deserialization - ["google::protobuf", "MessageLite", True, "ParseFromString", "(string_view)", "", "Argument[0]", "Argument[-1]", "taint", "manual"] - ["google::protobuf", "MessageLite", True, "ParseFromString", "(const Cord &)", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] - ["google::protobuf", "MessageLite", True, "ParsePartialFromString", "(string_view)", "", "Argument[0]", "Argument[-1]", "taint", "manual"] @@ -40,7 +34,7 @@ extensions: - ["google::protobuf", "MessageLite", True, "MergeFromCodedStream", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] - ["google::protobuf", "MessageLite", True, "MergePartialFromCodedStream", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] - # Serialization into an output buffer/stream: the message (`this`) taints `Argument[*0]`. + # Serialization - ["google::protobuf", "MessageLite", True, "SerializeToString", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] - ["google::protobuf", "MessageLite", True, "SerializePartialToString", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] - ["google::protobuf", "MessageLite", True, "AppendToString", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] @@ -58,7 +52,7 @@ extensions: - ["google::protobuf", "MessageLite", True, "SerializeToCodedStream", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] - ["google::protobuf", "MessageLite", True, "SerializePartialToCodedStream", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] - # Serialization returning the bytes: the message (`this`) taints the (by-value) return value. + # Serialization returning bytes - ["google::protobuf", "MessageLite", True, "SerializeAsString", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] - ["google::protobuf", "MessageLite", True, "SerializePartialAsString", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] - ["google::protobuf", "MessageLite", True, "SerializeAsCord", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index e4434fddee46..47bd4c4e0877 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -119,9 +119,52 @@ models | 118 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view,flags); ; Argument[0..1]; ReturnValue; taint; manual | | 119 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view,flags,error_code &); ; Argument[0..1]; ReturnValue; taint; manual | | 120 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | -| 121 | Summary: google::protobuf; MessageLite; true; ParseFromArray; ; ; Argument[*0]; Argument[-1]; taint; manual | -| 122 | Summary: google::protobuf; MessageLite; true; SerializeAsString; ; ; Argument[-1]; ReturnValue; taint; manual | -| 123 | Summary: google::protobuf; MessageLite; true; SerializeToArray; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 121 | Summary: google::protobuf; MessageLite; true; AppendPartialToCord; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 122 | Summary: google::protobuf; MessageLite; true; AppendPartialToString; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 123 | Summary: google::protobuf; MessageLite; true; AppendToCord; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 124 | Summary: google::protobuf; MessageLite; true; AppendToString; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 125 | Summary: google::protobuf; MessageLite; true; MergeFromBoundedZeroCopyStream; ; ; Argument[*0]; Argument[-1]; taint; manual | +| 126 | Summary: google::protobuf; MessageLite; true; MergeFromCodedStream; ; ; Argument[*0]; Argument[-1]; taint; manual | +| 127 | Summary: google::protobuf; MessageLite; true; MergeFromCord; ; ; Argument[*0]; Argument[-1]; taint; manual | +| 128 | Summary: google::protobuf; MessageLite; true; MergeFromString; (const Cord &); ; Argument[*0]; Argument[-1]; taint; manual | +| 129 | Summary: google::protobuf; MessageLite; true; MergeFromString; (string_view); ; Argument[0]; Argument[-1]; taint; manual | +| 130 | Summary: google::protobuf; MessageLite; true; MergePartialFromBoundedZeroCopyStream; ; ; Argument[*0]; Argument[-1]; taint; manual | +| 131 | Summary: google::protobuf; MessageLite; true; MergePartialFromCodedStream; ; ; Argument[*0]; Argument[-1]; taint; manual | +| 132 | Summary: google::protobuf; MessageLite; true; MergePartialFromCord; ; ; Argument[*0]; Argument[-1]; taint; manual | +| 133 | Summary: google::protobuf; MessageLite; true; MergePartialFromString; (const Cord &); ; Argument[*0]; Argument[-1]; taint; manual | +| 134 | Summary: google::protobuf; MessageLite; true; MergePartialFromString; (string_view); ; Argument[0]; Argument[-1]; taint; manual | +| 135 | Summary: google::protobuf; MessageLite; true; ParseFromArray; ; ; Argument[*0]; Argument[-1]; taint; manual | +| 136 | Summary: google::protobuf; MessageLite; true; ParseFromBoundedZeroCopyStream; ; ; Argument[*0]; Argument[-1]; taint; manual | +| 137 | Summary: google::protobuf; MessageLite; true; ParseFromCodedStream; ; ; Argument[*0]; Argument[-1]; taint; manual | +| 138 | Summary: google::protobuf; MessageLite; true; ParseFromCord; ; ; Argument[*0]; Argument[-1]; taint; manual | +| 139 | Summary: google::protobuf; MessageLite; true; ParseFromIstream; ; ; Argument[*0]; Argument[-1]; taint; manual | +| 140 | Summary: google::protobuf; MessageLite; true; ParseFromString; (const Cord &); ; Argument[*0]; Argument[-1]; taint; manual | +| 141 | Summary: google::protobuf; MessageLite; true; ParseFromString; (string_view); ; Argument[0]; Argument[-1]; taint; manual | +| 142 | Summary: google::protobuf; MessageLite; true; ParseFromZeroCopyStream; ; ; Argument[*0]; Argument[-1]; taint; manual | +| 143 | Summary: google::protobuf; MessageLite; true; ParsePartialFromArray; ; ; Argument[*0]; Argument[-1]; taint; manual | +| 144 | Summary: google::protobuf; MessageLite; true; ParsePartialFromBoundedZeroCopyStream; ; ; Argument[*0]; Argument[-1]; taint; manual | +| 145 | Summary: google::protobuf; MessageLite; true; ParsePartialFromCodedStream; ; ; Argument[*0]; Argument[-1]; taint; manual | +| 146 | Summary: google::protobuf; MessageLite; true; ParsePartialFromCord; ; ; Argument[*0]; Argument[-1]; taint; manual | +| 147 | Summary: google::protobuf; MessageLite; true; ParsePartialFromIstream; ; ; Argument[*0]; Argument[-1]; taint; manual | +| 148 | Summary: google::protobuf; MessageLite; true; ParsePartialFromString; (const Cord &); ; Argument[*0]; Argument[-1]; taint; manual | +| 149 | Summary: google::protobuf; MessageLite; true; ParsePartialFromString; (string_view); ; Argument[0]; Argument[-1]; taint; manual | +| 150 | Summary: google::protobuf; MessageLite; true; ParsePartialFromZeroCopyStream; ; ; Argument[*0]; Argument[-1]; taint; manual | +| 151 | Summary: google::protobuf; MessageLite; true; SerializeAsCord; ; ; Argument[-1]; ReturnValue; taint; manual | +| 152 | Summary: google::protobuf; MessageLite; true; SerializeAsString; ; ; Argument[-1]; ReturnValue; taint; manual | +| 153 | Summary: google::protobuf; MessageLite; true; SerializePartialAsCord; ; ; Argument[-1]; ReturnValue; taint; manual | +| 154 | Summary: google::protobuf; MessageLite; true; SerializePartialAsString; ; ; Argument[-1]; ReturnValue; taint; manual | +| 155 | Summary: google::protobuf; MessageLite; true; SerializePartialToArray; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 156 | Summary: google::protobuf; MessageLite; true; SerializePartialToCodedStream; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 157 | Summary: google::protobuf; MessageLite; true; SerializePartialToCord; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 158 | Summary: google::protobuf; MessageLite; true; SerializePartialToOstream; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 159 | Summary: google::protobuf; MessageLite; true; SerializePartialToString; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 160 | Summary: google::protobuf; MessageLite; true; SerializePartialToZeroCopyStream; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 161 | Summary: google::protobuf; MessageLite; true; SerializeToArray; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 162 | Summary: google::protobuf; MessageLite; true; SerializeToCodedStream; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 163 | Summary: google::protobuf; MessageLite; true; SerializeToCord; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 164 | Summary: google::protobuf; MessageLite; true; SerializeToOstream; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 165 | Summary: google::protobuf; MessageLite; true; SerializeToString; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 166 | Summary: google::protobuf; MessageLite; true; SerializeToZeroCopyStream; ; ; Argument[-1]; Argument[*0]; taint; manual | edges | asio_streams.cpp:129:34:129:44 | read_until output argument | asio_streams.cpp:133:7:133:17 | recv_buffer | provenance | Src:MaD:56 | | asio_streams.cpp:129:34:129:44 | read_until output argument | asio_streams.cpp:135:29:135:39 | recv_buffer | provenance | Src:MaD:56 Sink:MaD:4 | @@ -266,21 +309,200 @@ edges | bdlbb.cpp:94:46:94:48 | *src | bdlbb.cpp:94:37:94:40 | copy output argument | provenance | MaD:100 | | bdlbb.cpp:96:37:96:39 | copy output argument | bdlbb.cpp:97:7:97:10 | * ... | provenance | | | bdlbb.cpp:96:42:96:44 | *dst | bdlbb.cpp:96:37:96:39 | copy output argument | provenance | MaD:102 | -| protobuf.cpp:140:33:140:40 | call to source | protobuf.cpp:141:21:141:31 | *call to data | provenance | TaintFunction | -| protobuf.cpp:141:2:141:4 | ParseFromArray output argument | protobuf.cpp:143:2:143:4 | *msg | provenance | | -| protobuf.cpp:141:21:141:31 | *call to data | protobuf.cpp:141:2:141:4 | ParseFromArray output argument | provenance | MaD:121 | -| protobuf.cpp:143:2:143:4 | *msg | protobuf.cpp:143:23:143:25 | SerializeToArray output argument | provenance | MaD:123 | -| protobuf.cpp:143:23:143:25 | SerializeToArray output argument | protobuf.cpp:144:7:144:10 | * ... | provenance | | -| protobuf.cpp:151:33:151:40 | call to source | protobuf.cpp:152:21:152:31 | *call to data | provenance | TaintFunction | -| protobuf.cpp:152:2:152:4 | ParseFromArray output argument | protobuf.cpp:153:18:153:20 | *msg | provenance | | -| protobuf.cpp:152:21:152:31 | *call to data | protobuf.cpp:152:2:152:4 | ParseFromArray output argument | provenance | MaD:121 | -| protobuf.cpp:153:18:153:20 | *msg | protobuf.cpp:153:22:153:38 | call to SerializeAsString | provenance | MaD:122 | -| protobuf.cpp:153:22:153:38 | call to SerializeAsString | protobuf.cpp:153:22:153:38 | call to SerializeAsString | provenance | | -| protobuf.cpp:153:22:153:38 | call to SerializeAsString | protobuf.cpp:155:22:155:29 | *call to data | provenance | TaintFunction | -| protobuf.cpp:155:2:155:5 | ParseFromArray output argument | protobuf.cpp:157:2:157:5 | *msg2 | provenance | | -| protobuf.cpp:155:22:155:29 | *call to data | protobuf.cpp:155:2:155:5 | ParseFromArray output argument | provenance | MaD:121 | -| protobuf.cpp:157:2:157:5 | *msg2 | protobuf.cpp:157:24:157:26 | SerializeToArray output argument | provenance | MaD:123 | -| protobuf.cpp:157:24:157:26 | SerializeToArray output argument | protobuf.cpp:158:7:158:10 | * ... | provenance | | +| protobuf.cpp:134:27:134:51 | call to source | protobuf.cpp:134:27:134:51 | call to source | provenance | | +| protobuf.cpp:134:27:134:51 | call to source | protobuf.cpp:135:22:135:25 | data | provenance | | +| protobuf.cpp:135:2:135:4 | ParseFromString output argument | protobuf.cpp:136:7:136:9 | msg | provenance | | +| protobuf.cpp:135:22:135:25 | data | protobuf.cpp:135:2:135:4 | ParseFromString output argument | provenance | MaD:141 | +| protobuf.cpp:141:20:141:37 | call to source | protobuf.cpp:141:20:141:37 | call to source | provenance | | +| protobuf.cpp:141:20:141:37 | call to source | protobuf.cpp:142:22:142:25 | *data | provenance | | +| protobuf.cpp:142:2:142:4 | ParseFromString output argument | protobuf.cpp:143:7:143:9 | msg | provenance | | +| protobuf.cpp:142:22:142:25 | *data | protobuf.cpp:142:2:142:4 | ParseFromString output argument | provenance | MaD:140 | +| protobuf.cpp:148:27:148:51 | call to source | protobuf.cpp:148:27:148:51 | call to source | provenance | | +| protobuf.cpp:148:27:148:51 | call to source | protobuf.cpp:149:29:149:32 | data | provenance | | +| protobuf.cpp:149:2:149:4 | ParsePartialFromString output argument | protobuf.cpp:150:7:150:9 | msg | provenance | | +| protobuf.cpp:149:29:149:32 | data | protobuf.cpp:149:2:149:4 | ParsePartialFromString output argument | provenance | MaD:149 | +| protobuf.cpp:155:20:155:37 | call to source | protobuf.cpp:155:20:155:37 | call to source | provenance | | +| protobuf.cpp:155:20:155:37 | call to source | protobuf.cpp:156:29:156:32 | *data | provenance | | +| protobuf.cpp:156:2:156:4 | ParsePartialFromString output argument | protobuf.cpp:157:7:157:9 | msg | provenance | | +| protobuf.cpp:156:29:156:32 | *data | protobuf.cpp:156:2:156:4 | ParsePartialFromString output argument | provenance | MaD:148 | +| protobuf.cpp:162:27:162:51 | call to source | protobuf.cpp:162:27:162:51 | call to source | provenance | | +| protobuf.cpp:162:27:162:51 | call to source | protobuf.cpp:163:22:163:25 | data | provenance | | +| protobuf.cpp:163:2:163:4 | MergeFromString output argument | protobuf.cpp:164:7:164:9 | msg | provenance | | +| protobuf.cpp:163:22:163:25 | data | protobuf.cpp:163:2:163:4 | MergeFromString output argument | provenance | MaD:129 | +| protobuf.cpp:169:20:169:37 | call to source | protobuf.cpp:169:20:169:37 | call to source | provenance | | +| protobuf.cpp:169:20:169:37 | call to source | protobuf.cpp:170:22:170:25 | *data | provenance | | +| protobuf.cpp:170:2:170:4 | MergeFromString output argument | protobuf.cpp:171:7:171:9 | msg | provenance | | +| protobuf.cpp:170:22:170:25 | *data | protobuf.cpp:170:2:170:4 | MergeFromString output argument | provenance | MaD:128 | +| protobuf.cpp:176:27:176:51 | call to source | protobuf.cpp:176:27:176:51 | call to source | provenance | | +| protobuf.cpp:176:27:176:51 | call to source | protobuf.cpp:177:29:177:32 | data | provenance | | +| protobuf.cpp:177:2:177:4 | MergePartialFromString output argument | protobuf.cpp:178:7:178:9 | msg | provenance | | +| protobuf.cpp:177:29:177:32 | data | protobuf.cpp:177:2:177:4 | MergePartialFromString output argument | provenance | MaD:134 | +| protobuf.cpp:183:20:183:37 | call to source | protobuf.cpp:183:20:183:37 | call to source | provenance | | +| protobuf.cpp:183:20:183:37 | call to source | protobuf.cpp:184:29:184:32 | *data | provenance | | +| protobuf.cpp:184:2:184:4 | MergePartialFromString output argument | protobuf.cpp:185:7:185:9 | msg | provenance | | +| protobuf.cpp:184:29:184:32 | *data | protobuf.cpp:184:2:184:4 | MergePartialFromString output argument | provenance | MaD:133 | +| protobuf.cpp:190:19:190:38 | call to source | protobuf.cpp:191:21:191:31 | *call to data | provenance | TaintFunction | +| protobuf.cpp:191:2:191:4 | ParseFromArray output argument | protobuf.cpp:192:7:192:9 | msg | provenance | | +| protobuf.cpp:191:21:191:31 | *call to data | protobuf.cpp:191:2:191:4 | ParseFromArray output argument | provenance | MaD:135 | +| protobuf.cpp:197:19:197:38 | call to source | protobuf.cpp:198:28:198:38 | *call to data | provenance | TaintFunction | +| protobuf.cpp:198:2:198:4 | ParsePartialFromArray output argument | protobuf.cpp:199:7:199:9 | msg | provenance | | +| protobuf.cpp:198:28:198:38 | *call to data | protobuf.cpp:198:2:198:4 | ParsePartialFromArray output argument | provenance | MaD:143 | +| protobuf.cpp:204:20:204:37 | call to source | protobuf.cpp:204:20:204:37 | call to source | provenance | | +| protobuf.cpp:204:20:204:37 | call to source | protobuf.cpp:205:20:205:23 | *data | provenance | | +| protobuf.cpp:205:2:205:4 | ParseFromCord output argument | protobuf.cpp:206:7:206:9 | msg | provenance | | +| protobuf.cpp:205:20:205:23 | *data | protobuf.cpp:205:2:205:4 | ParseFromCord output argument | provenance | MaD:138 | +| protobuf.cpp:211:20:211:37 | call to source | protobuf.cpp:211:20:211:37 | call to source | provenance | | +| protobuf.cpp:211:20:211:37 | call to source | protobuf.cpp:212:27:212:30 | *data | provenance | | +| protobuf.cpp:212:2:212:4 | ParsePartialFromCord output argument | protobuf.cpp:213:7:213:9 | msg | provenance | | +| protobuf.cpp:212:27:212:30 | *data | protobuf.cpp:212:2:212:4 | ParsePartialFromCord output argument | provenance | MaD:146 | +| protobuf.cpp:218:20:218:37 | call to source | protobuf.cpp:218:20:218:37 | call to source | provenance | | +| protobuf.cpp:218:20:218:37 | call to source | protobuf.cpp:219:20:219:23 | *data | provenance | | +| protobuf.cpp:219:2:219:4 | MergeFromCord output argument | protobuf.cpp:220:7:220:9 | msg | provenance | | +| protobuf.cpp:219:20:219:23 | *data | protobuf.cpp:219:2:219:4 | MergeFromCord output argument | provenance | MaD:127 | +| protobuf.cpp:225:20:225:37 | call to source | protobuf.cpp:225:20:225:37 | call to source | provenance | | +| protobuf.cpp:225:20:225:37 | call to source | protobuf.cpp:226:27:226:30 | *data | provenance | | +| protobuf.cpp:226:2:226:4 | MergePartialFromCord output argument | protobuf.cpp:227:7:227:9 | msg | provenance | | +| protobuf.cpp:226:27:226:30 | *data | protobuf.cpp:226:2:226:4 | MergePartialFromCord output argument | provenance | MaD:132 | +| protobuf.cpp:232:20:232:39 | call to source | protobuf.cpp:232:20:232:39 | call to source | provenance | | +| protobuf.cpp:232:20:232:39 | call to source | protobuf.cpp:233:23:233:25 | *& ... | provenance | | +| protobuf.cpp:233:2:233:4 | ParseFromIstream output argument | protobuf.cpp:234:7:234:9 | msg | provenance | | +| protobuf.cpp:233:23:233:25 | *& ... | protobuf.cpp:233:2:233:4 | ParseFromIstream output argument | provenance | MaD:139 | +| protobuf.cpp:239:20:239:39 | call to source | protobuf.cpp:239:20:239:39 | call to source | provenance | | +| protobuf.cpp:239:20:239:39 | call to source | protobuf.cpp:240:30:240:32 | *& ... | provenance | | +| protobuf.cpp:240:2:240:4 | ParsePartialFromIstream output argument | protobuf.cpp:241:7:241:9 | msg | provenance | | +| protobuf.cpp:240:30:240:32 | *& ... | protobuf.cpp:240:2:240:4 | ParsePartialFromIstream output argument | provenance | MaD:147 | +| protobuf.cpp:246:27:246:53 | call to source | protobuf.cpp:246:27:246:53 | call to source | provenance | | +| protobuf.cpp:246:27:246:53 | call to source | protobuf.cpp:247:30:247:32 | *& ... | provenance | | +| protobuf.cpp:247:2:247:4 | ParseFromZeroCopyStream output argument | protobuf.cpp:248:7:248:9 | msg | provenance | | +| protobuf.cpp:247:30:247:32 | *& ... | protobuf.cpp:247:2:247:4 | ParseFromZeroCopyStream output argument | provenance | MaD:142 | +| protobuf.cpp:253:27:253:53 | call to source | protobuf.cpp:253:27:253:53 | call to source | provenance | | +| protobuf.cpp:253:27:253:53 | call to source | protobuf.cpp:254:37:254:39 | *& ... | provenance | | +| protobuf.cpp:254:2:254:4 | ParsePartialFromZeroCopyStream output argument | protobuf.cpp:255:7:255:9 | msg | provenance | | +| protobuf.cpp:254:37:254:39 | *& ... | protobuf.cpp:254:2:254:4 | ParsePartialFromZeroCopyStream output argument | provenance | MaD:150 | +| protobuf.cpp:260:27:260:53 | call to source | protobuf.cpp:260:27:260:53 | call to source | provenance | | +| protobuf.cpp:260:27:260:53 | call to source | protobuf.cpp:261:37:261:39 | *& ... | provenance | | +| protobuf.cpp:261:2:261:4 | ParseFromBoundedZeroCopyStream output argument | protobuf.cpp:262:7:262:9 | msg | provenance | | +| protobuf.cpp:261:37:261:39 | *& ... | protobuf.cpp:261:2:261:4 | ParseFromBoundedZeroCopyStream output argument | provenance | MaD:136 | +| protobuf.cpp:267:27:267:53 | call to source | protobuf.cpp:267:27:267:53 | call to source | provenance | | +| protobuf.cpp:267:27:267:53 | call to source | protobuf.cpp:268:44:268:46 | *& ... | provenance | | +| protobuf.cpp:268:2:268:4 | ParsePartialFromBoundedZeroCopyStream output argument | protobuf.cpp:269:7:269:9 | msg | provenance | | +| protobuf.cpp:268:44:268:46 | *& ... | protobuf.cpp:268:2:268:4 | ParsePartialFromBoundedZeroCopyStream output argument | provenance | MaD:144 | +| protobuf.cpp:274:27:274:53 | call to source | protobuf.cpp:274:27:274:53 | call to source | provenance | | +| protobuf.cpp:274:27:274:53 | call to source | protobuf.cpp:275:37:275:39 | *& ... | provenance | | +| protobuf.cpp:275:2:275:4 | MergeFromBoundedZeroCopyStream output argument | protobuf.cpp:276:7:276:9 | msg | provenance | | +| protobuf.cpp:275:37:275:39 | *& ... | protobuf.cpp:275:2:275:4 | MergeFromBoundedZeroCopyStream output argument | provenance | MaD:125 | +| protobuf.cpp:281:27:281:53 | call to source | protobuf.cpp:281:27:281:53 | call to source | provenance | | +| protobuf.cpp:281:27:281:53 | call to source | protobuf.cpp:282:44:282:46 | *& ... | provenance | | +| protobuf.cpp:282:2:282:4 | MergePartialFromBoundedZeroCopyStream output argument | protobuf.cpp:283:7:283:9 | msg | provenance | | +| protobuf.cpp:282:44:282:46 | *& ... | protobuf.cpp:282:2:282:4 | MergePartialFromBoundedZeroCopyStream output argument | provenance | MaD:130 | +| protobuf.cpp:288:24:288:47 | call to source | protobuf.cpp:288:24:288:47 | call to source | provenance | | +| protobuf.cpp:288:24:288:47 | call to source | protobuf.cpp:289:27:289:29 | *& ... | provenance | | +| protobuf.cpp:289:2:289:4 | ParseFromCodedStream output argument | protobuf.cpp:290:7:290:9 | msg | provenance | | +| protobuf.cpp:289:27:289:29 | *& ... | protobuf.cpp:289:2:289:4 | ParseFromCodedStream output argument | provenance | MaD:137 | +| protobuf.cpp:295:24:295:47 | call to source | protobuf.cpp:295:24:295:47 | call to source | provenance | | +| protobuf.cpp:295:24:295:47 | call to source | protobuf.cpp:296:34:296:36 | *& ... | provenance | | +| protobuf.cpp:296:2:296:4 | ParsePartialFromCodedStream output argument | protobuf.cpp:297:7:297:9 | msg | provenance | | +| protobuf.cpp:296:34:296:36 | *& ... | protobuf.cpp:296:2:296:4 | ParsePartialFromCodedStream output argument | provenance | MaD:145 | +| protobuf.cpp:302:24:302:47 | call to source | protobuf.cpp:302:24:302:47 | call to source | provenance | | +| protobuf.cpp:302:24:302:47 | call to source | protobuf.cpp:303:27:303:29 | *& ... | provenance | | +| protobuf.cpp:303:2:303:4 | MergeFromCodedStream output argument | protobuf.cpp:304:7:304:9 | msg | provenance | | +| protobuf.cpp:303:27:303:29 | *& ... | protobuf.cpp:303:2:303:4 | MergeFromCodedStream output argument | provenance | MaD:126 | +| protobuf.cpp:309:24:309:47 | call to source | protobuf.cpp:309:24:309:47 | call to source | provenance | | +| protobuf.cpp:309:24:309:47 | call to source | protobuf.cpp:310:34:310:36 | *& ... | provenance | | +| protobuf.cpp:310:2:310:4 | MergePartialFromCodedStream output argument | protobuf.cpp:311:7:311:9 | msg | provenance | | +| protobuf.cpp:310:34:310:36 | *& ... | protobuf.cpp:310:2:310:4 | MergePartialFromCodedStream output argument | provenance | MaD:131 | +| protobuf.cpp:324:15:324:28 | call to source | protobuf.cpp:324:15:324:28 | call to source | provenance | | +| protobuf.cpp:324:15:324:28 | call to source | protobuf.cpp:326:2:326:4 | *msg | provenance | | +| protobuf.cpp:326:2:326:4 | *msg | protobuf.cpp:326:24:326:27 | SerializeToString output argument | provenance | MaD:165 | +| protobuf.cpp:326:24:326:27 | SerializeToString output argument | protobuf.cpp:327:7:327:9 | out | provenance | | +| protobuf.cpp:331:15:331:28 | call to source | protobuf.cpp:331:15:331:28 | call to source | provenance | | +| protobuf.cpp:331:15:331:28 | call to source | protobuf.cpp:333:2:333:4 | *msg | provenance | | +| protobuf.cpp:333:2:333:4 | *msg | protobuf.cpp:333:31:333:34 | SerializePartialToString output argument | provenance | MaD:159 | +| protobuf.cpp:333:31:333:34 | SerializePartialToString output argument | protobuf.cpp:334:7:334:9 | out | provenance | | +| protobuf.cpp:338:15:338:28 | call to source | protobuf.cpp:338:15:338:28 | call to source | provenance | | +| protobuf.cpp:338:15:338:28 | call to source | protobuf.cpp:340:2:340:4 | *msg | provenance | | +| protobuf.cpp:340:2:340:4 | *msg | protobuf.cpp:340:21:340:24 | AppendToString output argument | provenance | MaD:124 | +| protobuf.cpp:340:21:340:24 | AppendToString output argument | protobuf.cpp:341:7:341:9 | out | provenance | | +| protobuf.cpp:345:15:345:28 | call to source | protobuf.cpp:345:15:345:28 | call to source | provenance | | +| protobuf.cpp:345:15:345:28 | call to source | protobuf.cpp:347:2:347:4 | *msg | provenance | | +| protobuf.cpp:347:2:347:4 | *msg | protobuf.cpp:347:28:347:31 | AppendPartialToString output argument | provenance | MaD:122 | +| protobuf.cpp:347:28:347:31 | AppendPartialToString output argument | protobuf.cpp:348:7:348:9 | out | provenance | | +| protobuf.cpp:352:15:352:28 | call to source | protobuf.cpp:352:15:352:28 | call to source | provenance | | +| protobuf.cpp:352:15:352:28 | call to source | protobuf.cpp:354:2:354:4 | *msg | provenance | | +| protobuf.cpp:354:2:354:4 | *msg | protobuf.cpp:354:24:354:27 | SerializeToString output argument | provenance | MaD:165 | +| protobuf.cpp:354:24:354:27 | SerializeToString output argument | protobuf.cpp:355:7:355:9 | out | provenance | | +| protobuf.cpp:359:15:359:28 | call to source | protobuf.cpp:359:15:359:28 | call to source | provenance | | +| protobuf.cpp:359:15:359:28 | call to source | protobuf.cpp:361:2:361:4 | *msg | provenance | | +| protobuf.cpp:361:2:361:4 | *msg | protobuf.cpp:361:31:361:34 | SerializePartialToString output argument | provenance | MaD:159 | +| protobuf.cpp:361:31:361:34 | SerializePartialToString output argument | protobuf.cpp:362:7:362:9 | out | provenance | | +| protobuf.cpp:366:15:366:28 | call to source | protobuf.cpp:366:15:366:28 | call to source | provenance | | +| protobuf.cpp:366:15:366:28 | call to source | protobuf.cpp:368:2:368:4 | *msg | provenance | | +| protobuf.cpp:368:2:368:4 | *msg | protobuf.cpp:368:21:368:24 | AppendToString output argument | provenance | MaD:124 | +| protobuf.cpp:368:21:368:24 | AppendToString output argument | protobuf.cpp:369:7:369:9 | out | provenance | | +| protobuf.cpp:373:15:373:28 | call to source | protobuf.cpp:373:15:373:28 | call to source | provenance | | +| protobuf.cpp:373:15:373:28 | call to source | protobuf.cpp:375:2:375:4 | *msg | provenance | | +| protobuf.cpp:375:2:375:4 | *msg | protobuf.cpp:375:28:375:31 | AppendPartialToString output argument | provenance | MaD:122 | +| protobuf.cpp:375:28:375:31 | AppendPartialToString output argument | protobuf.cpp:376:7:376:9 | out | provenance | | +| protobuf.cpp:380:15:380:28 | call to source | protobuf.cpp:380:15:380:28 | call to source | provenance | | +| protobuf.cpp:380:15:380:28 | call to source | protobuf.cpp:382:2:382:4 | *msg | provenance | | +| protobuf.cpp:382:2:382:4 | *msg | protobuf.cpp:382:23:382:25 | SerializeToArray output argument | provenance | MaD:161 | +| protobuf.cpp:382:23:382:25 | SerializeToArray output argument | protobuf.cpp:383:7:383:10 | * ... | provenance | | +| protobuf.cpp:387:15:387:28 | call to source | protobuf.cpp:387:15:387:28 | call to source | provenance | | +| protobuf.cpp:387:15:387:28 | call to source | protobuf.cpp:389:2:389:4 | *msg | provenance | | +| protobuf.cpp:389:2:389:4 | *msg | protobuf.cpp:389:30:389:32 | SerializePartialToArray output argument | provenance | MaD:155 | +| protobuf.cpp:389:30:389:32 | SerializePartialToArray output argument | protobuf.cpp:390:7:390:10 | * ... | provenance | | +| protobuf.cpp:394:15:394:28 | call to source | protobuf.cpp:394:15:394:28 | call to source | provenance | | +| protobuf.cpp:394:15:394:28 | call to source | protobuf.cpp:396:2:396:4 | *msg | provenance | | +| protobuf.cpp:396:2:396:4 | *msg | protobuf.cpp:396:22:396:25 | SerializeToCord output argument | provenance | MaD:163 | +| protobuf.cpp:396:22:396:25 | SerializeToCord output argument | protobuf.cpp:397:7:397:9 | out | provenance | | +| protobuf.cpp:401:15:401:28 | call to source | protobuf.cpp:401:15:401:28 | call to source | provenance | | +| protobuf.cpp:401:15:401:28 | call to source | protobuf.cpp:403:2:403:4 | *msg | provenance | | +| protobuf.cpp:403:2:403:4 | *msg | protobuf.cpp:403:29:403:32 | SerializePartialToCord output argument | provenance | MaD:157 | +| protobuf.cpp:403:29:403:32 | SerializePartialToCord output argument | protobuf.cpp:404:7:404:9 | out | provenance | | +| protobuf.cpp:408:15:408:28 | call to source | protobuf.cpp:408:15:408:28 | call to source | provenance | | +| protobuf.cpp:408:15:408:28 | call to source | protobuf.cpp:410:2:410:4 | *msg | provenance | | +| protobuf.cpp:410:2:410:4 | *msg | protobuf.cpp:410:19:410:22 | AppendToCord output argument | provenance | MaD:123 | +| protobuf.cpp:410:19:410:22 | AppendToCord output argument | protobuf.cpp:411:7:411:9 | out | provenance | | +| protobuf.cpp:415:15:415:28 | call to source | protobuf.cpp:415:15:415:28 | call to source | provenance | | +| protobuf.cpp:415:15:415:28 | call to source | protobuf.cpp:417:2:417:4 | *msg | provenance | | +| protobuf.cpp:417:2:417:4 | *msg | protobuf.cpp:417:26:417:29 | AppendPartialToCord output argument | provenance | MaD:121 | +| protobuf.cpp:417:26:417:29 | AppendPartialToCord output argument | protobuf.cpp:418:7:418:9 | out | provenance | | +| protobuf.cpp:422:15:422:28 | call to source | protobuf.cpp:422:15:422:28 | call to source | provenance | | +| protobuf.cpp:422:15:422:28 | call to source | protobuf.cpp:424:2:424:4 | *msg | provenance | | +| protobuf.cpp:424:2:424:4 | *msg | protobuf.cpp:424:25:424:28 | SerializeToOstream output argument | provenance | MaD:164 | +| protobuf.cpp:424:25:424:28 | SerializeToOstream output argument | protobuf.cpp:425:7:425:9 | out | provenance | | +| protobuf.cpp:429:15:429:28 | call to source | protobuf.cpp:429:15:429:28 | call to source | provenance | | +| protobuf.cpp:429:15:429:28 | call to source | protobuf.cpp:431:2:431:4 | *msg | provenance | | +| protobuf.cpp:431:2:431:4 | *msg | protobuf.cpp:431:32:431:35 | SerializePartialToOstream output argument | provenance | MaD:158 | +| protobuf.cpp:431:32:431:35 | SerializePartialToOstream output argument | protobuf.cpp:432:7:432:9 | out | provenance | | +| protobuf.cpp:436:15:436:28 | call to source | protobuf.cpp:436:15:436:28 | call to source | provenance | | +| protobuf.cpp:436:15:436:28 | call to source | protobuf.cpp:438:2:438:4 | *msg | provenance | | +| protobuf.cpp:438:2:438:4 | *msg | protobuf.cpp:438:32:438:35 | SerializeToZeroCopyStream output argument | provenance | MaD:166 | +| protobuf.cpp:438:32:438:35 | SerializeToZeroCopyStream output argument | protobuf.cpp:439:7:439:9 | out | provenance | | +| protobuf.cpp:443:15:443:28 | call to source | protobuf.cpp:443:15:443:28 | call to source | provenance | | +| protobuf.cpp:443:15:443:28 | call to source | protobuf.cpp:445:2:445:4 | *msg | provenance | | +| protobuf.cpp:445:2:445:4 | *msg | protobuf.cpp:445:39:445:42 | SerializePartialToZeroCopyStream output argument | provenance | MaD:160 | +| protobuf.cpp:445:39:445:42 | SerializePartialToZeroCopyStream output argument | protobuf.cpp:446:7:446:9 | out | provenance | | +| protobuf.cpp:450:15:450:28 | call to source | protobuf.cpp:450:15:450:28 | call to source | provenance | | +| protobuf.cpp:450:15:450:28 | call to source | protobuf.cpp:452:2:452:4 | *msg | provenance | | +| protobuf.cpp:452:2:452:4 | *msg | protobuf.cpp:452:29:452:32 | SerializeToCodedStream output argument | provenance | MaD:162 | +| protobuf.cpp:452:29:452:32 | SerializeToCodedStream output argument | protobuf.cpp:453:7:453:9 | out | provenance | | +| protobuf.cpp:457:15:457:28 | call to source | protobuf.cpp:457:15:457:28 | call to source | provenance | | +| protobuf.cpp:457:15:457:28 | call to source | protobuf.cpp:459:2:459:4 | *msg | provenance | | +| protobuf.cpp:459:2:459:4 | *msg | protobuf.cpp:459:36:459:39 | SerializePartialToCodedStream output argument | provenance | MaD:156 | +| protobuf.cpp:459:36:459:39 | SerializePartialToCodedStream output argument | protobuf.cpp:460:7:460:9 | out | provenance | | +| protobuf.cpp:466:15:466:28 | call to source | protobuf.cpp:466:15:466:28 | call to source | provenance | | +| protobuf.cpp:466:15:466:28 | call to source | protobuf.cpp:467:7:467:9 | *msg | provenance | | +| protobuf.cpp:467:7:467:9 | *msg | protobuf.cpp:467:11:467:27 | call to SerializeAsString | provenance | MaD:152 | +| protobuf.cpp:471:15:471:28 | call to source | protobuf.cpp:471:15:471:28 | call to source | provenance | | +| protobuf.cpp:471:15:471:28 | call to source | protobuf.cpp:472:7:472:9 | *msg | provenance | | +| protobuf.cpp:472:7:472:9 | *msg | protobuf.cpp:472:11:472:34 | call to SerializePartialAsString | provenance | MaD:154 | +| protobuf.cpp:476:15:476:28 | call to source | protobuf.cpp:476:15:476:28 | call to source | provenance | | +| protobuf.cpp:476:15:476:28 | call to source | protobuf.cpp:477:7:477:9 | *msg | provenance | | +| protobuf.cpp:477:7:477:9 | *msg | protobuf.cpp:477:11:477:25 | call to SerializeAsCord | provenance | MaD:151 | +| protobuf.cpp:481:15:481:28 | call to source | protobuf.cpp:481:15:481:28 | call to source | provenance | | +| protobuf.cpp:481:15:481:28 | call to source | protobuf.cpp:482:7:482:9 | *msg | provenance | | +| protobuf.cpp:482:7:482:9 | *msg | protobuf.cpp:482:11:482:32 | call to SerializePartialAsCord | provenance | MaD:153 | | test.cpp:7:47:7:52 | value2 | test.cpp:7:64:7:69 | value2 | provenance | | | test.cpp:7:64:7:69 | value2 | test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | provenance | | | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:10:10:10:18 | call to ymlSource | provenance | Src:MaD:48 | @@ -783,23 +1005,250 @@ nodes | bdlbb.cpp:96:37:96:39 | copy output argument | semmle.label | copy output argument | | bdlbb.cpp:96:42:96:44 | *dst | semmle.label | *dst | | bdlbb.cpp:97:7:97:10 | * ... | semmle.label | * ... | -| protobuf.cpp:140:33:140:40 | call to source | semmle.label | call to source | -| protobuf.cpp:141:2:141:4 | ParseFromArray output argument | semmle.label | ParseFromArray output argument | -| protobuf.cpp:141:21:141:31 | *call to data | semmle.label | *call to data | -| protobuf.cpp:143:2:143:4 | *msg | semmle.label | *msg | -| protobuf.cpp:143:23:143:25 | SerializeToArray output argument | semmle.label | SerializeToArray output argument | -| protobuf.cpp:144:7:144:10 | * ... | semmle.label | * ... | -| protobuf.cpp:151:33:151:40 | call to source | semmle.label | call to source | -| protobuf.cpp:152:2:152:4 | ParseFromArray output argument | semmle.label | ParseFromArray output argument | -| protobuf.cpp:152:21:152:31 | *call to data | semmle.label | *call to data | -| protobuf.cpp:153:18:153:20 | *msg | semmle.label | *msg | -| protobuf.cpp:153:22:153:38 | call to SerializeAsString | semmle.label | call to SerializeAsString | -| protobuf.cpp:153:22:153:38 | call to SerializeAsString | semmle.label | call to SerializeAsString | -| protobuf.cpp:155:2:155:5 | ParseFromArray output argument | semmle.label | ParseFromArray output argument | -| protobuf.cpp:155:22:155:29 | *call to data | semmle.label | *call to data | -| protobuf.cpp:157:2:157:5 | *msg2 | semmle.label | *msg2 | -| protobuf.cpp:157:24:157:26 | SerializeToArray output argument | semmle.label | SerializeToArray output argument | -| protobuf.cpp:158:7:158:10 | * ... | semmle.label | * ... | +| protobuf.cpp:134:27:134:51 | call to source | semmle.label | call to source | +| protobuf.cpp:134:27:134:51 | call to source | semmle.label | call to source | +| protobuf.cpp:135:2:135:4 | ParseFromString output argument | semmle.label | ParseFromString output argument | +| protobuf.cpp:135:22:135:25 | data | semmle.label | data | +| protobuf.cpp:136:7:136:9 | msg | semmle.label | msg | +| protobuf.cpp:141:20:141:37 | call to source | semmle.label | call to source | +| protobuf.cpp:141:20:141:37 | call to source | semmle.label | call to source | +| protobuf.cpp:142:2:142:4 | ParseFromString output argument | semmle.label | ParseFromString output argument | +| protobuf.cpp:142:22:142:25 | *data | semmle.label | *data | +| protobuf.cpp:143:7:143:9 | msg | semmle.label | msg | +| protobuf.cpp:148:27:148:51 | call to source | semmle.label | call to source | +| protobuf.cpp:148:27:148:51 | call to source | semmle.label | call to source | +| protobuf.cpp:149:2:149:4 | ParsePartialFromString output argument | semmle.label | ParsePartialFromString output argument | +| protobuf.cpp:149:29:149:32 | data | semmle.label | data | +| protobuf.cpp:150:7:150:9 | msg | semmle.label | msg | +| protobuf.cpp:155:20:155:37 | call to source | semmle.label | call to source | +| protobuf.cpp:155:20:155:37 | call to source | semmle.label | call to source | +| protobuf.cpp:156:2:156:4 | ParsePartialFromString output argument | semmle.label | ParsePartialFromString output argument | +| protobuf.cpp:156:29:156:32 | *data | semmle.label | *data | +| protobuf.cpp:157:7:157:9 | msg | semmle.label | msg | +| protobuf.cpp:162:27:162:51 | call to source | semmle.label | call to source | +| protobuf.cpp:162:27:162:51 | call to source | semmle.label | call to source | +| protobuf.cpp:163:2:163:4 | MergeFromString output argument | semmle.label | MergeFromString output argument | +| protobuf.cpp:163:22:163:25 | data | semmle.label | data | +| protobuf.cpp:164:7:164:9 | msg | semmle.label | msg | +| protobuf.cpp:169:20:169:37 | call to source | semmle.label | call to source | +| protobuf.cpp:169:20:169:37 | call to source | semmle.label | call to source | +| protobuf.cpp:170:2:170:4 | MergeFromString output argument | semmle.label | MergeFromString output argument | +| protobuf.cpp:170:22:170:25 | *data | semmle.label | *data | +| protobuf.cpp:171:7:171:9 | msg | semmle.label | msg | +| protobuf.cpp:176:27:176:51 | call to source | semmle.label | call to source | +| protobuf.cpp:176:27:176:51 | call to source | semmle.label | call to source | +| protobuf.cpp:177:2:177:4 | MergePartialFromString output argument | semmle.label | MergePartialFromString output argument | +| protobuf.cpp:177:29:177:32 | data | semmle.label | data | +| protobuf.cpp:178:7:178:9 | msg | semmle.label | msg | +| protobuf.cpp:183:20:183:37 | call to source | semmle.label | call to source | +| protobuf.cpp:183:20:183:37 | call to source | semmle.label | call to source | +| protobuf.cpp:184:2:184:4 | MergePartialFromString output argument | semmle.label | MergePartialFromString output argument | +| protobuf.cpp:184:29:184:32 | *data | semmle.label | *data | +| protobuf.cpp:185:7:185:9 | msg | semmle.label | msg | +| protobuf.cpp:190:19:190:38 | call to source | semmle.label | call to source | +| protobuf.cpp:191:2:191:4 | ParseFromArray output argument | semmle.label | ParseFromArray output argument | +| protobuf.cpp:191:21:191:31 | *call to data | semmle.label | *call to data | +| protobuf.cpp:192:7:192:9 | msg | semmle.label | msg | +| protobuf.cpp:197:19:197:38 | call to source | semmle.label | call to source | +| protobuf.cpp:198:2:198:4 | ParsePartialFromArray output argument | semmle.label | ParsePartialFromArray output argument | +| protobuf.cpp:198:28:198:38 | *call to data | semmle.label | *call to data | +| protobuf.cpp:199:7:199:9 | msg | semmle.label | msg | +| protobuf.cpp:204:20:204:37 | call to source | semmle.label | call to source | +| protobuf.cpp:204:20:204:37 | call to source | semmle.label | call to source | +| protobuf.cpp:205:2:205:4 | ParseFromCord output argument | semmle.label | ParseFromCord output argument | +| protobuf.cpp:205:20:205:23 | *data | semmle.label | *data | +| protobuf.cpp:206:7:206:9 | msg | semmle.label | msg | +| protobuf.cpp:211:20:211:37 | call to source | semmle.label | call to source | +| protobuf.cpp:211:20:211:37 | call to source | semmle.label | call to source | +| protobuf.cpp:212:2:212:4 | ParsePartialFromCord output argument | semmle.label | ParsePartialFromCord output argument | +| protobuf.cpp:212:27:212:30 | *data | semmle.label | *data | +| protobuf.cpp:213:7:213:9 | msg | semmle.label | msg | +| protobuf.cpp:218:20:218:37 | call to source | semmle.label | call to source | +| protobuf.cpp:218:20:218:37 | call to source | semmle.label | call to source | +| protobuf.cpp:219:2:219:4 | MergeFromCord output argument | semmle.label | MergeFromCord output argument | +| protobuf.cpp:219:20:219:23 | *data | semmle.label | *data | +| protobuf.cpp:220:7:220:9 | msg | semmle.label | msg | +| protobuf.cpp:225:20:225:37 | call to source | semmle.label | call to source | +| protobuf.cpp:225:20:225:37 | call to source | semmle.label | call to source | +| protobuf.cpp:226:2:226:4 | MergePartialFromCord output argument | semmle.label | MergePartialFromCord output argument | +| protobuf.cpp:226:27:226:30 | *data | semmle.label | *data | +| protobuf.cpp:227:7:227:9 | msg | semmle.label | msg | +| protobuf.cpp:232:20:232:39 | call to source | semmle.label | call to source | +| protobuf.cpp:232:20:232:39 | call to source | semmle.label | call to source | +| protobuf.cpp:233:2:233:4 | ParseFromIstream output argument | semmle.label | ParseFromIstream output argument | +| protobuf.cpp:233:23:233:25 | *& ... | semmle.label | *& ... | +| protobuf.cpp:234:7:234:9 | msg | semmle.label | msg | +| protobuf.cpp:239:20:239:39 | call to source | semmle.label | call to source | +| protobuf.cpp:239:20:239:39 | call to source | semmle.label | call to source | +| protobuf.cpp:240:2:240:4 | ParsePartialFromIstream output argument | semmle.label | ParsePartialFromIstream output argument | +| protobuf.cpp:240:30:240:32 | *& ... | semmle.label | *& ... | +| protobuf.cpp:241:7:241:9 | msg | semmle.label | msg | +| protobuf.cpp:246:27:246:53 | call to source | semmle.label | call to source | +| protobuf.cpp:246:27:246:53 | call to source | semmle.label | call to source | +| protobuf.cpp:247:2:247:4 | ParseFromZeroCopyStream output argument | semmle.label | ParseFromZeroCopyStream output argument | +| protobuf.cpp:247:30:247:32 | *& ... | semmle.label | *& ... | +| protobuf.cpp:248:7:248:9 | msg | semmle.label | msg | +| protobuf.cpp:253:27:253:53 | call to source | semmle.label | call to source | +| protobuf.cpp:253:27:253:53 | call to source | semmle.label | call to source | +| protobuf.cpp:254:2:254:4 | ParsePartialFromZeroCopyStream output argument | semmle.label | ParsePartialFromZeroCopyStream output argument | +| protobuf.cpp:254:37:254:39 | *& ... | semmle.label | *& ... | +| protobuf.cpp:255:7:255:9 | msg | semmle.label | msg | +| protobuf.cpp:260:27:260:53 | call to source | semmle.label | call to source | +| protobuf.cpp:260:27:260:53 | call to source | semmle.label | call to source | +| protobuf.cpp:261:2:261:4 | ParseFromBoundedZeroCopyStream output argument | semmle.label | ParseFromBoundedZeroCopyStream output argument | +| protobuf.cpp:261:37:261:39 | *& ... | semmle.label | *& ... | +| protobuf.cpp:262:7:262:9 | msg | semmle.label | msg | +| protobuf.cpp:267:27:267:53 | call to source | semmle.label | call to source | +| protobuf.cpp:267:27:267:53 | call to source | semmle.label | call to source | +| protobuf.cpp:268:2:268:4 | ParsePartialFromBoundedZeroCopyStream output argument | semmle.label | ParsePartialFromBoundedZeroCopyStream output argument | +| protobuf.cpp:268:44:268:46 | *& ... | semmle.label | *& ... | +| protobuf.cpp:269:7:269:9 | msg | semmle.label | msg | +| protobuf.cpp:274:27:274:53 | call to source | semmle.label | call to source | +| protobuf.cpp:274:27:274:53 | call to source | semmle.label | call to source | +| protobuf.cpp:275:2:275:4 | MergeFromBoundedZeroCopyStream output argument | semmle.label | MergeFromBoundedZeroCopyStream output argument | +| protobuf.cpp:275:37:275:39 | *& ... | semmle.label | *& ... | +| protobuf.cpp:276:7:276:9 | msg | semmle.label | msg | +| protobuf.cpp:281:27:281:53 | call to source | semmle.label | call to source | +| protobuf.cpp:281:27:281:53 | call to source | semmle.label | call to source | +| protobuf.cpp:282:2:282:4 | MergePartialFromBoundedZeroCopyStream output argument | semmle.label | MergePartialFromBoundedZeroCopyStream output argument | +| protobuf.cpp:282:44:282:46 | *& ... | semmle.label | *& ... | +| protobuf.cpp:283:7:283:9 | msg | semmle.label | msg | +| protobuf.cpp:288:24:288:47 | call to source | semmle.label | call to source | +| protobuf.cpp:288:24:288:47 | call to source | semmle.label | call to source | +| protobuf.cpp:289:2:289:4 | ParseFromCodedStream output argument | semmle.label | ParseFromCodedStream output argument | +| protobuf.cpp:289:27:289:29 | *& ... | semmle.label | *& ... | +| protobuf.cpp:290:7:290:9 | msg | semmle.label | msg | +| protobuf.cpp:295:24:295:47 | call to source | semmle.label | call to source | +| protobuf.cpp:295:24:295:47 | call to source | semmle.label | call to source | +| protobuf.cpp:296:2:296:4 | ParsePartialFromCodedStream output argument | semmle.label | ParsePartialFromCodedStream output argument | +| protobuf.cpp:296:34:296:36 | *& ... | semmle.label | *& ... | +| protobuf.cpp:297:7:297:9 | msg | semmle.label | msg | +| protobuf.cpp:302:24:302:47 | call to source | semmle.label | call to source | +| protobuf.cpp:302:24:302:47 | call to source | semmle.label | call to source | +| protobuf.cpp:303:2:303:4 | MergeFromCodedStream output argument | semmle.label | MergeFromCodedStream output argument | +| protobuf.cpp:303:27:303:29 | *& ... | semmle.label | *& ... | +| protobuf.cpp:304:7:304:9 | msg | semmle.label | msg | +| protobuf.cpp:309:24:309:47 | call to source | semmle.label | call to source | +| protobuf.cpp:309:24:309:47 | call to source | semmle.label | call to source | +| protobuf.cpp:310:2:310:4 | MergePartialFromCodedStream output argument | semmle.label | MergePartialFromCodedStream output argument | +| protobuf.cpp:310:34:310:36 | *& ... | semmle.label | *& ... | +| protobuf.cpp:311:7:311:9 | msg | semmle.label | msg | +| protobuf.cpp:324:15:324:28 | call to source | semmle.label | call to source | +| protobuf.cpp:324:15:324:28 | call to source | semmle.label | call to source | +| protobuf.cpp:326:2:326:4 | *msg | semmle.label | *msg | +| protobuf.cpp:326:24:326:27 | SerializeToString output argument | semmle.label | SerializeToString output argument | +| protobuf.cpp:327:7:327:9 | out | semmle.label | out | +| protobuf.cpp:331:15:331:28 | call to source | semmle.label | call to source | +| protobuf.cpp:331:15:331:28 | call to source | semmle.label | call to source | +| protobuf.cpp:333:2:333:4 | *msg | semmle.label | *msg | +| protobuf.cpp:333:31:333:34 | SerializePartialToString output argument | semmle.label | SerializePartialToString output argument | +| protobuf.cpp:334:7:334:9 | out | semmle.label | out | +| protobuf.cpp:338:15:338:28 | call to source | semmle.label | call to source | +| protobuf.cpp:338:15:338:28 | call to source | semmle.label | call to source | +| protobuf.cpp:340:2:340:4 | *msg | semmle.label | *msg | +| protobuf.cpp:340:21:340:24 | AppendToString output argument | semmle.label | AppendToString output argument | +| protobuf.cpp:341:7:341:9 | out | semmle.label | out | +| protobuf.cpp:345:15:345:28 | call to source | semmle.label | call to source | +| protobuf.cpp:345:15:345:28 | call to source | semmle.label | call to source | +| protobuf.cpp:347:2:347:4 | *msg | semmle.label | *msg | +| protobuf.cpp:347:28:347:31 | AppendPartialToString output argument | semmle.label | AppendPartialToString output argument | +| protobuf.cpp:348:7:348:9 | out | semmle.label | out | +| protobuf.cpp:352:15:352:28 | call to source | semmle.label | call to source | +| protobuf.cpp:352:15:352:28 | call to source | semmle.label | call to source | +| protobuf.cpp:354:2:354:4 | *msg | semmle.label | *msg | +| protobuf.cpp:354:24:354:27 | SerializeToString output argument | semmle.label | SerializeToString output argument | +| protobuf.cpp:355:7:355:9 | out | semmle.label | out | +| protobuf.cpp:359:15:359:28 | call to source | semmle.label | call to source | +| protobuf.cpp:359:15:359:28 | call to source | semmle.label | call to source | +| protobuf.cpp:361:2:361:4 | *msg | semmle.label | *msg | +| protobuf.cpp:361:31:361:34 | SerializePartialToString output argument | semmle.label | SerializePartialToString output argument | +| protobuf.cpp:362:7:362:9 | out | semmle.label | out | +| protobuf.cpp:366:15:366:28 | call to source | semmle.label | call to source | +| protobuf.cpp:366:15:366:28 | call to source | semmle.label | call to source | +| protobuf.cpp:368:2:368:4 | *msg | semmle.label | *msg | +| protobuf.cpp:368:21:368:24 | AppendToString output argument | semmle.label | AppendToString output argument | +| protobuf.cpp:369:7:369:9 | out | semmle.label | out | +| protobuf.cpp:373:15:373:28 | call to source | semmle.label | call to source | +| protobuf.cpp:373:15:373:28 | call to source | semmle.label | call to source | +| protobuf.cpp:375:2:375:4 | *msg | semmle.label | *msg | +| protobuf.cpp:375:28:375:31 | AppendPartialToString output argument | semmle.label | AppendPartialToString output argument | +| protobuf.cpp:376:7:376:9 | out | semmle.label | out | +| protobuf.cpp:380:15:380:28 | call to source | semmle.label | call to source | +| protobuf.cpp:380:15:380:28 | call to source | semmle.label | call to source | +| protobuf.cpp:382:2:382:4 | *msg | semmle.label | *msg | +| protobuf.cpp:382:23:382:25 | SerializeToArray output argument | semmle.label | SerializeToArray output argument | +| protobuf.cpp:383:7:383:10 | * ... | semmle.label | * ... | +| protobuf.cpp:387:15:387:28 | call to source | semmle.label | call to source | +| protobuf.cpp:387:15:387:28 | call to source | semmle.label | call to source | +| protobuf.cpp:389:2:389:4 | *msg | semmle.label | *msg | +| protobuf.cpp:389:30:389:32 | SerializePartialToArray output argument | semmle.label | SerializePartialToArray output argument | +| protobuf.cpp:390:7:390:10 | * ... | semmle.label | * ... | +| protobuf.cpp:394:15:394:28 | call to source | semmle.label | call to source | +| protobuf.cpp:394:15:394:28 | call to source | semmle.label | call to source | +| protobuf.cpp:396:2:396:4 | *msg | semmle.label | *msg | +| protobuf.cpp:396:22:396:25 | SerializeToCord output argument | semmle.label | SerializeToCord output argument | +| protobuf.cpp:397:7:397:9 | out | semmle.label | out | +| protobuf.cpp:401:15:401:28 | call to source | semmle.label | call to source | +| protobuf.cpp:401:15:401:28 | call to source | semmle.label | call to source | +| protobuf.cpp:403:2:403:4 | *msg | semmle.label | *msg | +| protobuf.cpp:403:29:403:32 | SerializePartialToCord output argument | semmle.label | SerializePartialToCord output argument | +| protobuf.cpp:404:7:404:9 | out | semmle.label | out | +| protobuf.cpp:408:15:408:28 | call to source | semmle.label | call to source | +| protobuf.cpp:408:15:408:28 | call to source | semmle.label | call to source | +| protobuf.cpp:410:2:410:4 | *msg | semmle.label | *msg | +| protobuf.cpp:410:19:410:22 | AppendToCord output argument | semmle.label | AppendToCord output argument | +| protobuf.cpp:411:7:411:9 | out | semmle.label | out | +| protobuf.cpp:415:15:415:28 | call to source | semmle.label | call to source | +| protobuf.cpp:415:15:415:28 | call to source | semmle.label | call to source | +| protobuf.cpp:417:2:417:4 | *msg | semmle.label | *msg | +| protobuf.cpp:417:26:417:29 | AppendPartialToCord output argument | semmle.label | AppendPartialToCord output argument | +| protobuf.cpp:418:7:418:9 | out | semmle.label | out | +| protobuf.cpp:422:15:422:28 | call to source | semmle.label | call to source | +| protobuf.cpp:422:15:422:28 | call to source | semmle.label | call to source | +| protobuf.cpp:424:2:424:4 | *msg | semmle.label | *msg | +| protobuf.cpp:424:25:424:28 | SerializeToOstream output argument | semmle.label | SerializeToOstream output argument | +| protobuf.cpp:425:7:425:9 | out | semmle.label | out | +| protobuf.cpp:429:15:429:28 | call to source | semmle.label | call to source | +| protobuf.cpp:429:15:429:28 | call to source | semmle.label | call to source | +| protobuf.cpp:431:2:431:4 | *msg | semmle.label | *msg | +| protobuf.cpp:431:32:431:35 | SerializePartialToOstream output argument | semmle.label | SerializePartialToOstream output argument | +| protobuf.cpp:432:7:432:9 | out | semmle.label | out | +| protobuf.cpp:436:15:436:28 | call to source | semmle.label | call to source | +| protobuf.cpp:436:15:436:28 | call to source | semmle.label | call to source | +| protobuf.cpp:438:2:438:4 | *msg | semmle.label | *msg | +| protobuf.cpp:438:32:438:35 | SerializeToZeroCopyStream output argument | semmle.label | SerializeToZeroCopyStream output argument | +| protobuf.cpp:439:7:439:9 | out | semmle.label | out | +| protobuf.cpp:443:15:443:28 | call to source | semmle.label | call to source | +| protobuf.cpp:443:15:443:28 | call to source | semmle.label | call to source | +| protobuf.cpp:445:2:445:4 | *msg | semmle.label | *msg | +| protobuf.cpp:445:39:445:42 | SerializePartialToZeroCopyStream output argument | semmle.label | SerializePartialToZeroCopyStream output argument | +| protobuf.cpp:446:7:446:9 | out | semmle.label | out | +| protobuf.cpp:450:15:450:28 | call to source | semmle.label | call to source | +| protobuf.cpp:450:15:450:28 | call to source | semmle.label | call to source | +| protobuf.cpp:452:2:452:4 | *msg | semmle.label | *msg | +| protobuf.cpp:452:29:452:32 | SerializeToCodedStream output argument | semmle.label | SerializeToCodedStream output argument | +| protobuf.cpp:453:7:453:9 | out | semmle.label | out | +| protobuf.cpp:457:15:457:28 | call to source | semmle.label | call to source | +| protobuf.cpp:457:15:457:28 | call to source | semmle.label | call to source | +| protobuf.cpp:459:2:459:4 | *msg | semmle.label | *msg | +| protobuf.cpp:459:36:459:39 | SerializePartialToCodedStream output argument | semmle.label | SerializePartialToCodedStream output argument | +| protobuf.cpp:460:7:460:9 | out | semmle.label | out | +| protobuf.cpp:466:15:466:28 | call to source | semmle.label | call to source | +| protobuf.cpp:466:15:466:28 | call to source | semmle.label | call to source | +| protobuf.cpp:467:7:467:9 | *msg | semmle.label | *msg | +| protobuf.cpp:467:11:467:27 | call to SerializeAsString | semmle.label | call to SerializeAsString | +| protobuf.cpp:471:15:471:28 | call to source | semmle.label | call to source | +| protobuf.cpp:471:15:471:28 | call to source | semmle.label | call to source | +| protobuf.cpp:472:7:472:9 | *msg | semmle.label | *msg | +| protobuf.cpp:472:11:472:34 | call to SerializePartialAsString | semmle.label | call to SerializePartialAsString | +| protobuf.cpp:476:15:476:28 | call to source | semmle.label | call to source | +| protobuf.cpp:476:15:476:28 | call to source | semmle.label | call to source | +| protobuf.cpp:477:7:477:9 | *msg | semmle.label | *msg | +| protobuf.cpp:477:11:477:25 | call to SerializeAsCord | semmle.label | call to SerializeAsCord | +| protobuf.cpp:481:15:481:28 | call to source | semmle.label | call to source | +| protobuf.cpp:481:15:481:28 | call to source | semmle.label | call to source | +| protobuf.cpp:482:7:482:9 | *msg | semmle.label | *msg | +| protobuf.cpp:482:11:482:32 | call to SerializePartialAsCord | semmle.label | call to SerializePartialAsCord | | test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | semmle.label | *ymlStepGenerated_with_body | | test.cpp:7:47:7:52 | value2 | semmle.label | value2 | | test.cpp:7:64:7:69 | value2 | semmle.label | value2 | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/protobuf.cpp b/cpp/ql/test/library-tests/dataflow/external-models/protobuf.cpp index bc9a29ce45a0..9e2a86790381 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/protobuf.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/protobuf.cpp @@ -33,7 +33,6 @@ namespace std { } namespace absl { - // `absl::string_view` is passed by value; `absl::Cord` is passed by const reference. class string_view { public: string_view(); @@ -56,12 +55,8 @@ namespace protobuf { class CodedOutputStream {}; } - // A faithful subset of `MessageLite`. The string/Cord/stream signatures mirror the real - // `message_lite.h`; the iostream-based methods are declared on `Message` in the real headers - // but are modeled here on `MessageLite` (with `subtypes` covering `Message`). class MessageLite { public: - // Deserialization: input taints the message. bool ParseFromString(absl::string_view data); bool ParseFromString(const absl::Cord &data); bool ParsePartialFromString(absl::string_view data); @@ -89,11 +84,14 @@ namespace protobuf { bool MergeFromCodedStream(io::CodedInputStream *input); bool MergePartialFromCodedStream(io::CodedInputStream *input); - // Serialization into an output buffer/stream: the message taints the output argument. bool SerializeToString(std::string *output) const; bool SerializePartialToString(std::string *output) const; bool AppendToString(std::string *output) const; bool AppendPartialToString(std::string *output) const; + bool SerializeToString(absl::Cord *output) const; + bool SerializePartialToString(absl::Cord *output) const; + bool AppendToString(absl::Cord *output) const; + bool AppendPartialToString(absl::Cord *output) const; bool SerializeToArray(void *data, int size) const; bool SerializePartialToArray(void *data, int size) const; bool SerializeToCord(absl::Cord *output) const; @@ -107,7 +105,6 @@ namespace protobuf { bool SerializeToCodedStream(io::CodedOutputStream *output) const; bool SerializePartialToCodedStream(io::CodedOutputStream *output) const; - // Serialization returning the bytes. std::string SerializeAsString() const; std::string SerializePartialAsString() const; absl::Cord SerializeAsCord() const; @@ -125,110 +122,367 @@ class Person : public google::protobuf::Message { // --- test code --- -char *source(); -void sink(char); +template T source(); +void sink(...); -// End-to-end flow is demonstrated through the pointer-to-buffer methods, where content taint -// flows naturally: `ParseFromArray` reads a tainted buffer into the message, and `SerializeToArray` -// writes the message back out to a scalar buffer that reaches the sink. The `string_view`, `Cord`, -// and stream overloads do not carry content taint through their argument conversions without further -// library models, so they are exercised for summary-step coverage (`steps.ql`) rather than flow. +using namespace google::protobuf::io; + +// Deserialization: the input taints the message. + +void test_ParseFromString_string_view() { + Person msg; + absl::string_view data = source(); + msg.ParseFromString(data); + sink(msg); // $ ir +} + +void test_ParseFromString_Cord() { + Person msg; + absl::Cord data = source(); + msg.ParseFromString(data); + sink(msg); // $ ir +} + +void test_ParsePartialFromString_string_view() { + Person msg; + absl::string_view data = source(); + msg.ParsePartialFromString(data); + sink(msg); // $ ir +} + +void test_ParsePartialFromString_Cord() { + Person msg; + absl::Cord data = source(); + msg.ParsePartialFromString(data); + sink(msg); // $ ir +} + +void test_MergeFromString_string_view() { + Person msg; + absl::string_view data = source(); + msg.MergeFromString(data); + sink(msg); // $ ir +} + +void test_MergeFromString_Cord() { + Person msg; + absl::Cord data = source(); + msg.MergeFromString(data); + sink(msg); // $ ir +} + +void test_MergePartialFromString_string_view() { + Person msg; + absl::string_view data = source(); + msg.MergePartialFromString(data); + sink(msg); // $ ir +} + +void test_MergePartialFromString_Cord() { + Person msg; + absl::Cord data = source(); + msg.MergePartialFromString(data); + sink(msg); // $ ir +} -// Deserialization: the encoded input taints the message (`this`). void test_ParseFromArray() { Person msg; - std::string data = std::string(source()); + std::string data(source()); msg.ParseFromArray(data.data(), data.size()); - char buf[64]; - msg.SerializeToArray(buf, sizeof(buf)); - sink(*buf); // $ ir + sink(msg); // $ ir } -// Serialization returning the bytes: the message taints the returned string, observed by parsing it -// into a second message and serializing that back out. -void test_SerializeAsString() { +void test_ParsePartialFromArray() { Person msg; - std::string data = std::string(source()); - msg.ParseFromArray(data.data(), data.size()); - std::string s = msg.SerializeAsString(); - Person msg2; - msg2.ParseFromArray(s.data(), s.size()); - char buf[64]; - msg2.SerializeToArray(buf, sizeof(buf)); - sink(*buf); // $ ir + std::string data(source()); + msg.ParsePartialFromArray(data.data(), data.size()); + sink(msg); // $ ir } -// Every modeled method is called below so its summary step is covered by `steps.ql`. Endpoint -// mistakes and rows that fail to bind show up as missing lines in `steps.expected`. -void test_step_coverage() { +void test_ParseFromCord() { Person msg; - std::string data = std::string(source()); - absl::string_view sv = data; - absl::Cord cord; + absl::Cord data = source(); + msg.ParseFromCord(data); + sink(msg); // $ ir +} - msg.ParseFromString(sv); - msg.ParseFromString(cord); - msg.ParsePartialFromString(sv); - msg.ParsePartialFromString(cord); - msg.MergeFromString(sv); - msg.MergeFromString(cord); - msg.MergePartialFromString(sv); - msg.MergePartialFromString(cord); +void test_ParsePartialFromCord() { + Person msg; + absl::Cord data = source(); + msg.ParsePartialFromCord(data); + sink(msg); // $ ir +} - msg.ParsePartialFromArray(data.data(), data.size()); +void test_MergeFromCord() { + Person msg; + absl::Cord data = source(); + msg.MergeFromCord(data); + sink(msg); // $ ir +} - msg.ParseFromCord(cord); - msg.ParsePartialFromCord(cord); - msg.MergeFromCord(cord); - msg.MergePartialFromCord(cord); +void test_MergePartialFromCord() { + Person msg; + absl::Cord data = source(); + msg.MergePartialFromCord(data); + sink(msg); // $ ir +} - std::istream in; +void test_ParseFromIstream() { + Person msg; + std::istream in = source(); msg.ParseFromIstream(&in); + sink(msg); // $ ir +} + +void test_ParsePartialFromIstream() { + Person msg; + std::istream in = source(); msg.ParsePartialFromIstream(&in); + sink(msg); // $ ir +} + +void test_ParseFromZeroCopyStream() { + Person msg; + ZeroCopyInputStream in = source(); + msg.ParseFromZeroCopyStream(&in); + sink(msg); // $ ir +} + +void test_ParsePartialFromZeroCopyStream() { + Person msg; + ZeroCopyInputStream in = source(); + msg.ParsePartialFromZeroCopyStream(&in); + sink(msg); // $ ir +} + +void test_ParseFromBoundedZeroCopyStream() { + Person msg; + ZeroCopyInputStream in = source(); + msg.ParseFromBoundedZeroCopyStream(&in, 1); + sink(msg); // $ ir +} + +void test_ParsePartialFromBoundedZeroCopyStream() { + Person msg; + ZeroCopyInputStream in = source(); + msg.ParsePartialFromBoundedZeroCopyStream(&in, 1); + sink(msg); // $ ir +} + +void test_MergeFromBoundedZeroCopyStream() { + Person msg; + ZeroCopyInputStream in = source(); + msg.MergeFromBoundedZeroCopyStream(&in, 1); + sink(msg); // $ ir +} + +void test_MergePartialFromBoundedZeroCopyStream() { + Person msg; + ZeroCopyInputStream in = source(); + msg.MergePartialFromBoundedZeroCopyStream(&in, 1); + sink(msg); // $ ir +} + +void test_ParseFromCodedStream() { + Person msg; + CodedInputStream in = source(); + msg.ParseFromCodedStream(&in); + sink(msg); // $ ir +} - google::protobuf::io::ZeroCopyInputStream zin; - msg.ParseFromZeroCopyStream(&zin); - msg.ParsePartialFromZeroCopyStream(&zin); - msg.ParseFromBoundedZeroCopyStream(&zin, 1); - msg.ParsePartialFromBoundedZeroCopyStream(&zin, 1); - msg.MergeFromBoundedZeroCopyStream(&zin, 1); - msg.MergePartialFromBoundedZeroCopyStream(&zin, 1); +void test_ParsePartialFromCodedStream() { + Person msg; + CodedInputStream in = source(); + msg.ParsePartialFromCodedStream(&in); + sink(msg); // $ ir +} + +void test_MergeFromCodedStream() { + Person msg; + CodedInputStream in = source(); + msg.MergeFromCodedStream(&in); + sink(msg); // $ ir +} + +void test_MergePartialFromCodedStream() { + Person msg; + CodedInputStream in = source(); + msg.MergePartialFromCodedStream(&in); + sink(msg); // $ ir +} + +void test_untainted_input() { + Person msg; + absl::Cord data; + msg.ParseFromString(data); + sink(msg); // clean +} + +// Serialization: the message taints the output argument. + +void test_SerializeToString() { + Person msg = source(); + std::string out; + msg.SerializeToString(&out); + sink(out); // $ ir +} + +void test_SerializePartialToString() { + Person msg = source(); + std::string out; + msg.SerializePartialToString(&out); + sink(out); // $ ir +} - google::protobuf::io::CodedInputStream cin; - msg.ParseFromCodedStream(&cin); - msg.ParsePartialFromCodedStream(&cin); - msg.MergeFromCodedStream(&cin); - msg.MergePartialFromCodedStream(&cin); +void test_AppendToString() { + Person msg = source(); + std::string out; + msg.AppendToString(&out); + sink(out); // $ ir +} +void test_AppendPartialToString() { + Person msg = source(); std::string out; + msg.AppendPartialToString(&out); + sink(out); // $ ir +} + +void test_SerializeToString_Cord() { + Person msg = source(); + absl::Cord out; msg.SerializeToString(&out); + sink(out); // $ ir +} + +void test_SerializePartialToString_Cord() { + Person msg = source(); + absl::Cord out; msg.SerializePartialToString(&out); + sink(out); // $ ir +} + +void test_AppendToString_Cord() { + Person msg = source(); + absl::Cord out; msg.AppendToString(&out); + sink(out); // $ ir +} + +void test_AppendPartialToString_Cord() { + Person msg = source(); + absl::Cord out; msg.AppendPartialToString(&out); + sink(out); // $ ir +} +void test_SerializeToArray() { + Person msg = source(); + char buf[64]; + msg.SerializeToArray(buf, sizeof(buf)); + sink(*buf); // $ ir +} + +void test_SerializePartialToArray() { + Person msg = source(); char buf[64]; msg.SerializePartialToArray(buf, sizeof(buf)); + sink(*buf); // $ ir +} - absl::Cord cordout; - msg.SerializeToCord(&cordout); - msg.SerializePartialToCord(&cordout); - msg.AppendToCord(&cordout); - msg.AppendPartialToCord(&cordout); +void test_SerializeToCord() { + Person msg = source(); + absl::Cord out; + msg.SerializeToCord(&out); + sink(out); // $ ir +} - std::ostream os; - msg.SerializeToOstream(&os); - msg.SerializePartialToOstream(&os); +void test_SerializePartialToCord() { + Person msg = source(); + absl::Cord out; + msg.SerializePartialToCord(&out); + sink(out); // $ ir +} - google::protobuf::io::ZeroCopyOutputStream zout; - msg.SerializeToZeroCopyStream(&zout); - msg.SerializePartialToZeroCopyStream(&zout); +void test_AppendToCord() { + Person msg = source(); + absl::Cord out; + msg.AppendToCord(&out); + sink(out); // $ ir +} - google::protobuf::io::CodedOutputStream cout; - msg.SerializeToCodedStream(&cout); - msg.SerializePartialToCodedStream(&cout); +void test_AppendPartialToCord() { + Person msg = source(); + absl::Cord out; + msg.AppendPartialToCord(&out); + sink(out); // $ ir +} + +void test_SerializeToOstream() { + Person msg = source(); + std::ostream out; + msg.SerializeToOstream(&out); + sink(out); // $ ir +} + +void test_SerializePartialToOstream() { + Person msg = source(); + std::ostream out; + msg.SerializePartialToOstream(&out); + sink(out); // $ ir +} + +void test_SerializeToZeroCopyStream() { + Person msg = source(); + ZeroCopyOutputStream out; + msg.SerializeToZeroCopyStream(&out); + sink(out); // $ ir +} - msg.SerializeAsString(); - msg.SerializePartialAsString(); - msg.SerializeAsCord(); - msg.SerializePartialAsCord(); +void test_SerializePartialToZeroCopyStream() { + Person msg = source(); + ZeroCopyOutputStream out; + msg.SerializePartialToZeroCopyStream(&out); + sink(out); // $ ir +} + +void test_SerializeToCodedStream() { + Person msg = source(); + CodedOutputStream out; + msg.SerializeToCodedStream(&out); + sink(out); // $ ir +} + +void test_SerializePartialToCodedStream() { + Person msg = source(); + CodedOutputStream out; + msg.SerializePartialToCodedStream(&out); + sink(out); // $ ir +} + +// Serialization: the message taints the returned bytes. + +void test_SerializeAsString() { + Person msg = source(); + sink(msg.SerializeAsString()); // $ ir +} + +void test_SerializePartialAsString() { + Person msg = source(); + sink(msg.SerializePartialAsString()); // $ ir +} + +void test_SerializeAsCord() { + Person msg = source(); + sink(msg.SerializeAsCord()); // $ ir +} + +void test_SerializePartialAsCord() { + Person msg = source(); + sink(msg.SerializePartialAsCord()); // $ ir +} + +void test_untainted_message() { + Person msg; + sink(msg.SerializeAsString()); // clean } diff --git a/cpp/ql/test/library-tests/dataflow/external-models/steps.expected b/cpp/ql/test/library-tests/dataflow/external-models/steps.expected index c1811c3357fa..21db10463a30 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/steps.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/steps.expected @@ -82,56 +82,58 @@ | bdlbb.cpp:92:48:92:51 | *call to data | bdlbb.cpp:92:37:92:40 | copy output argument | | bdlbb.cpp:94:46:94:48 | *src | bdlbb.cpp:94:37:94:40 | copy output argument | | bdlbb.cpp:96:42:96:44 | *dst | bdlbb.cpp:96:37:96:39 | copy output argument | -| protobuf.cpp:141:21:141:31 | *call to data | protobuf.cpp:141:2:141:4 | ParseFromArray output argument | -| protobuf.cpp:143:2:143:4 | *msg | protobuf.cpp:143:23:143:25 | SerializeToArray output argument | -| protobuf.cpp:152:21:152:31 | *call to data | protobuf.cpp:152:2:152:4 | ParseFromArray output argument | -| protobuf.cpp:153:18:153:20 | *msg | protobuf.cpp:153:22:153:38 | call to SerializeAsString | -| protobuf.cpp:155:22:155:29 | *call to data | protobuf.cpp:155:2:155:5 | ParseFromArray output argument | -| protobuf.cpp:157:2:157:5 | *msg2 | protobuf.cpp:157:24:157:26 | SerializeToArray output argument | -| protobuf.cpp:169:22:169:23 | sv | protobuf.cpp:169:2:169:4 | ParseFromString output argument | -| protobuf.cpp:170:22:170:25 | *cord | protobuf.cpp:170:2:170:4 | ParseFromString output argument | -| protobuf.cpp:171:29:171:30 | sv | protobuf.cpp:171:2:171:4 | ParsePartialFromString output argument | -| protobuf.cpp:172:29:172:32 | *cord | protobuf.cpp:172:2:172:4 | ParsePartialFromString output argument | -| protobuf.cpp:173:22:173:23 | sv | protobuf.cpp:173:2:173:4 | MergeFromString output argument | -| protobuf.cpp:174:22:174:25 | *cord | protobuf.cpp:174:2:174:4 | MergeFromString output argument | -| protobuf.cpp:175:29:175:30 | sv | protobuf.cpp:175:2:175:4 | MergePartialFromString output argument | -| protobuf.cpp:176:29:176:32 | *cord | protobuf.cpp:176:2:176:4 | MergePartialFromString output argument | -| protobuf.cpp:178:28:178:38 | *call to data | protobuf.cpp:178:2:178:4 | ParsePartialFromArray output argument | -| protobuf.cpp:180:20:180:23 | *cord | protobuf.cpp:180:2:180:4 | ParseFromCord output argument | -| protobuf.cpp:181:27:181:30 | *cord | protobuf.cpp:181:2:181:4 | ParsePartialFromCord output argument | -| protobuf.cpp:182:20:182:23 | *cord | protobuf.cpp:182:2:182:4 | MergeFromCord output argument | -| protobuf.cpp:183:27:183:30 | *cord | protobuf.cpp:183:2:183:4 | MergePartialFromCord output argument | -| protobuf.cpp:186:23:186:25 | *& ... | protobuf.cpp:186:2:186:4 | ParseFromIstream output argument | -| protobuf.cpp:187:30:187:32 | *& ... | protobuf.cpp:187:2:187:4 | ParsePartialFromIstream output argument | -| protobuf.cpp:190:30:190:33 | *& ... | protobuf.cpp:190:2:190:4 | ParseFromZeroCopyStream output argument | -| protobuf.cpp:191:37:191:40 | *& ... | protobuf.cpp:191:2:191:4 | ParsePartialFromZeroCopyStream output argument | -| protobuf.cpp:192:37:192:40 | *& ... | protobuf.cpp:192:2:192:4 | ParseFromBoundedZeroCopyStream output argument | -| protobuf.cpp:193:44:193:47 | *& ... | protobuf.cpp:193:2:193:4 | ParsePartialFromBoundedZeroCopyStream output argument | -| protobuf.cpp:194:37:194:40 | *& ... | protobuf.cpp:194:2:194:4 | MergeFromBoundedZeroCopyStream output argument | -| protobuf.cpp:195:44:195:47 | *& ... | protobuf.cpp:195:2:195:4 | MergePartialFromBoundedZeroCopyStream output argument | -| protobuf.cpp:198:27:198:30 | *& ... | protobuf.cpp:198:2:198:4 | ParseFromCodedStream output argument | -| protobuf.cpp:199:34:199:37 | *& ... | protobuf.cpp:199:2:199:4 | ParsePartialFromCodedStream output argument | -| protobuf.cpp:200:27:200:30 | *& ... | protobuf.cpp:200:2:200:4 | MergeFromCodedStream output argument | -| protobuf.cpp:201:34:201:37 | *& ... | protobuf.cpp:201:2:201:4 | MergePartialFromCodedStream output argument | -| protobuf.cpp:204:2:204:4 | *msg | protobuf.cpp:204:24:204:27 | SerializeToString output argument | -| protobuf.cpp:205:2:205:4 | *msg | protobuf.cpp:205:31:205:34 | SerializePartialToString output argument | -| protobuf.cpp:206:2:206:4 | *msg | protobuf.cpp:206:21:206:24 | AppendToString output argument | -| protobuf.cpp:207:2:207:4 | *msg | protobuf.cpp:207:28:207:31 | AppendPartialToString output argument | -| protobuf.cpp:210:2:210:4 | *msg | protobuf.cpp:210:30:210:32 | SerializePartialToArray output argument | -| protobuf.cpp:213:2:213:4 | *msg | protobuf.cpp:213:22:213:29 | SerializeToCord output argument | -| protobuf.cpp:214:2:214:4 | *msg | protobuf.cpp:214:29:214:36 | SerializePartialToCord output argument | -| protobuf.cpp:215:2:215:4 | *msg | protobuf.cpp:215:19:215:26 | AppendToCord output argument | -| protobuf.cpp:216:2:216:4 | *msg | protobuf.cpp:216:26:216:33 | AppendPartialToCord output argument | -| protobuf.cpp:219:2:219:4 | *msg | protobuf.cpp:219:25:219:27 | SerializeToOstream output argument | -| protobuf.cpp:220:2:220:4 | *msg | protobuf.cpp:220:32:220:34 | SerializePartialToOstream output argument | -| protobuf.cpp:223:2:223:4 | *msg | protobuf.cpp:223:32:223:36 | SerializeToZeroCopyStream output argument | -| protobuf.cpp:224:2:224:4 | *msg | protobuf.cpp:224:39:224:43 | SerializePartialToZeroCopyStream output argument | -| protobuf.cpp:227:2:227:4 | *msg | protobuf.cpp:227:29:227:33 | SerializeToCodedStream output argument | -| protobuf.cpp:228:2:228:4 | *msg | protobuf.cpp:228:36:228:40 | SerializePartialToCodedStream output argument | -| protobuf.cpp:230:2:230:4 | *msg | protobuf.cpp:230:6:230:22 | call to SerializeAsString | -| protobuf.cpp:231:2:231:4 | *msg | protobuf.cpp:231:6:231:29 | call to SerializePartialAsString | -| protobuf.cpp:232:2:232:4 | *msg | protobuf.cpp:232:6:232:20 | call to SerializeAsCord | -| protobuf.cpp:233:2:233:4 | *msg | protobuf.cpp:233:6:233:27 | call to SerializePartialAsCord | +| protobuf.cpp:135:22:135:25 | data | protobuf.cpp:135:2:135:4 | ParseFromString output argument | +| protobuf.cpp:142:22:142:25 | *data | protobuf.cpp:142:2:142:4 | ParseFromString output argument | +| protobuf.cpp:149:29:149:32 | data | protobuf.cpp:149:2:149:4 | ParsePartialFromString output argument | +| protobuf.cpp:156:29:156:32 | *data | protobuf.cpp:156:2:156:4 | ParsePartialFromString output argument | +| protobuf.cpp:163:22:163:25 | data | protobuf.cpp:163:2:163:4 | MergeFromString output argument | +| protobuf.cpp:170:22:170:25 | *data | protobuf.cpp:170:2:170:4 | MergeFromString output argument | +| protobuf.cpp:177:29:177:32 | data | protobuf.cpp:177:2:177:4 | MergePartialFromString output argument | +| protobuf.cpp:184:29:184:32 | *data | protobuf.cpp:184:2:184:4 | MergePartialFromString output argument | +| protobuf.cpp:191:21:191:31 | *call to data | protobuf.cpp:191:2:191:4 | ParseFromArray output argument | +| protobuf.cpp:198:28:198:38 | *call to data | protobuf.cpp:198:2:198:4 | ParsePartialFromArray output argument | +| protobuf.cpp:205:20:205:23 | *data | protobuf.cpp:205:2:205:4 | ParseFromCord output argument | +| protobuf.cpp:212:27:212:30 | *data | protobuf.cpp:212:2:212:4 | ParsePartialFromCord output argument | +| protobuf.cpp:219:20:219:23 | *data | protobuf.cpp:219:2:219:4 | MergeFromCord output argument | +| protobuf.cpp:226:27:226:30 | *data | protobuf.cpp:226:2:226:4 | MergePartialFromCord output argument | +| protobuf.cpp:233:23:233:25 | *& ... | protobuf.cpp:233:2:233:4 | ParseFromIstream output argument | +| protobuf.cpp:240:30:240:32 | *& ... | protobuf.cpp:240:2:240:4 | ParsePartialFromIstream output argument | +| protobuf.cpp:247:30:247:32 | *& ... | protobuf.cpp:247:2:247:4 | ParseFromZeroCopyStream output argument | +| protobuf.cpp:254:37:254:39 | *& ... | protobuf.cpp:254:2:254:4 | ParsePartialFromZeroCopyStream output argument | +| protobuf.cpp:261:37:261:39 | *& ... | protobuf.cpp:261:2:261:4 | ParseFromBoundedZeroCopyStream output argument | +| protobuf.cpp:268:44:268:46 | *& ... | protobuf.cpp:268:2:268:4 | ParsePartialFromBoundedZeroCopyStream output argument | +| protobuf.cpp:275:37:275:39 | *& ... | protobuf.cpp:275:2:275:4 | MergeFromBoundedZeroCopyStream output argument | +| protobuf.cpp:282:44:282:46 | *& ... | protobuf.cpp:282:2:282:4 | MergePartialFromBoundedZeroCopyStream output argument | +| protobuf.cpp:289:27:289:29 | *& ... | protobuf.cpp:289:2:289:4 | ParseFromCodedStream output argument | +| protobuf.cpp:296:34:296:36 | *& ... | protobuf.cpp:296:2:296:4 | ParsePartialFromCodedStream output argument | +| protobuf.cpp:303:27:303:29 | *& ... | protobuf.cpp:303:2:303:4 | MergeFromCodedStream output argument | +| protobuf.cpp:310:34:310:36 | *& ... | protobuf.cpp:310:2:310:4 | MergePartialFromCodedStream output argument | +| protobuf.cpp:317:22:317:25 | *data | protobuf.cpp:317:2:317:4 | ParseFromString output argument | +| protobuf.cpp:326:2:326:4 | *msg | protobuf.cpp:326:24:326:27 | SerializeToString output argument | +| protobuf.cpp:333:2:333:4 | *msg | protobuf.cpp:333:31:333:34 | SerializePartialToString output argument | +| protobuf.cpp:340:2:340:4 | *msg | protobuf.cpp:340:21:340:24 | AppendToString output argument | +| protobuf.cpp:347:2:347:4 | *msg | protobuf.cpp:347:28:347:31 | AppendPartialToString output argument | +| protobuf.cpp:354:2:354:4 | *msg | protobuf.cpp:354:24:354:27 | SerializeToString output argument | +| protobuf.cpp:361:2:361:4 | *msg | protobuf.cpp:361:31:361:34 | SerializePartialToString output argument | +| protobuf.cpp:368:2:368:4 | *msg | protobuf.cpp:368:21:368:24 | AppendToString output argument | +| protobuf.cpp:375:2:375:4 | *msg | protobuf.cpp:375:28:375:31 | AppendPartialToString output argument | +| protobuf.cpp:382:2:382:4 | *msg | protobuf.cpp:382:23:382:25 | SerializeToArray output argument | +| protobuf.cpp:389:2:389:4 | *msg | protobuf.cpp:389:30:389:32 | SerializePartialToArray output argument | +| protobuf.cpp:396:2:396:4 | *msg | protobuf.cpp:396:22:396:25 | SerializeToCord output argument | +| protobuf.cpp:403:2:403:4 | *msg | protobuf.cpp:403:29:403:32 | SerializePartialToCord output argument | +| protobuf.cpp:410:2:410:4 | *msg | protobuf.cpp:410:19:410:22 | AppendToCord output argument | +| protobuf.cpp:417:2:417:4 | *msg | protobuf.cpp:417:26:417:29 | AppendPartialToCord output argument | +| protobuf.cpp:424:2:424:4 | *msg | protobuf.cpp:424:25:424:28 | SerializeToOstream output argument | +| protobuf.cpp:431:2:431:4 | *msg | protobuf.cpp:431:32:431:35 | SerializePartialToOstream output argument | +| protobuf.cpp:438:2:438:4 | *msg | protobuf.cpp:438:32:438:35 | SerializeToZeroCopyStream output argument | +| protobuf.cpp:445:2:445:4 | *msg | protobuf.cpp:445:39:445:42 | SerializePartialToZeroCopyStream output argument | +| protobuf.cpp:452:2:452:4 | *msg | protobuf.cpp:452:29:452:32 | SerializeToCodedStream output argument | +| protobuf.cpp:459:2:459:4 | *msg | protobuf.cpp:459:36:459:39 | SerializePartialToCodedStream output argument | +| protobuf.cpp:467:7:467:9 | *msg | protobuf.cpp:467:11:467:27 | call to SerializeAsString | +| protobuf.cpp:472:7:472:9 | *msg | protobuf.cpp:472:11:472:34 | call to SerializePartialAsString | +| protobuf.cpp:477:7:477:9 | *msg | protobuf.cpp:477:11:477:25 | call to SerializeAsCord | +| protobuf.cpp:482:7:482:9 | *msg | protobuf.cpp:482:11:482:32 | call to SerializePartialAsCord | +| protobuf.cpp:487:7:487:9 | *msg | protobuf.cpp:487:11:487:27 | call to SerializeAsString | | test.cpp:17:24:17:24 | x | test.cpp:17:10:17:22 | call to ymlStepManual | | test.cpp:21:27:21:27 | x | test.cpp:21:10:21:25 | call to ymlStepGenerated | | test.cpp:25:35:25:35 | x | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | From 4f2e8f49d7b8c49363e98966c8b6fd381a5ce8aa Mon Sep 17 00:00:00 2001 From: Keshav Malik Date: Wed, 9 Sep 2026 23:39:46 +0530 Subject: [PATCH 0808/2098] Apply review suggestions --- .../Likely Typos/AmbiguousAssignmentOfComparison.qhelp | 4 ++-- .../Likely Typos/AmbiguousAssignmentOfComparison.ql | 7 +++---- .../2026-08-13-ambiguous-assignment-of-comparison.md | 5 +++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cpp/ql/src/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison.qhelp b/cpp/ql/src/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison.qhelp index 53c001212001..e8404940bfe9 100644 --- a/cpp/ql/src/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison.qhelp +++ b/cpp/ql/src/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison.qhelp @@ -11,14 +11,14 @@ first and then compare it with zero.

    -

    Use parentheses to make the intended operation order explicit. To assign first and compare the +

    Use parentheses to make the intended order of operations explicit. To assign first and compare the assigned value, parenthesize the assignment. To intentionally assign the comparison result, parenthesize the comparison. An explicit cast around the comparison also makes that order clear.

    In the first condition, status receives either zero or one instead of the value -returned by read_status. The second condition explicitly performs the assignment +returned by read_status(). The second condition explicitly performs the assignment before the comparison.

    diff --git a/cpp/ql/src/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison.ql b/cpp/ql/src/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison.ql index c767fecac9a8..2bfe9f7159f5 100644 --- a/cpp/ql/src/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison.ql +++ b/cpp/ql/src/Likely Bugs/Likely Typos/AmbiguousAssignmentOfComparison.ql @@ -1,8 +1,7 @@ /** - * @name Ambiguous assignment of comparison used as truth value - * @description Assigning the result of an unparenthesized comparison when the assignment is used - * as a truth value may indicate that the assignment and comparison are grouped - * incorrectly. + * @name Ambiguous assignment of comparison result used as truth value + * @description Using an assignment of an unparenthesized comparison as + * a truth value may indicate unintended operator grouping. * @kind problem * @problem.severity warning * @precision high diff --git a/cpp/ql/src/change-notes/2026-08-13-ambiguous-assignment-of-comparison.md b/cpp/ql/src/change-notes/2026-08-13-ambiguous-assignment-of-comparison.md index 91e83979b524..bcec04cbf241 100644 --- a/cpp/ql/src/change-notes/2026-08-13-ambiguous-assignment-of-comparison.md +++ b/cpp/ql/src/change-notes/2026-08-13-ambiguous-assignment-of-comparison.md @@ -1,5 +1,6 @@ --- category: newQuery --- -* Added a new query, `cpp/ambiguous-assignment-of-comparison`, to detect assignments of - unparenthesized comparison results when the assignment is used as a truth value. +* Added a new query, `cpp/ambiguous-assignment-of-comparison`, to detect potentially + ambiguous expressions where a comparison result is assigned to a variable and the + assignment is used as a truth value. From 19dc5069b10107535ef5e5efb212f35e1917b2a1 Mon Sep 17 00:00:00 2001 From: David Allison <62114487+david-allison@users.noreply.github.com> Date: Sat, 30 May 2026 06:53:38 +0100 Subject: [PATCH 0809/2098] Kotlin: Fix findTopLevelPropertyOrWarn for K2 `Receiver::class.java` resolves differently from K1: K1: getJavaClass(KClass) - value argument K2: KClass.() - property receiver This caused the lookup to fail, so `Intent(context, Receiver::class.java)` dropped the second argument. log: "Couldn't find JVM intrinsic property kotlin.jvm java in kotlin.jvm.JvmClassMappingKt" This caused false positives in `java/android/implicit-pendingintents` The fix mirrors 5c36e63dfe3fa2c582495d458f0201f5a408860a Fixes #20153 Assisted-by: Claude Opus 4.8 - diagnostics & initial fix Assisted-by: Claude Fable 5.1 - convert to 'when'; re-review --- .../src/main/kotlin/KotlinFileExtractor.kt | 9 ++++++++- .../change-notes/2026-05-30-kclass-java-arg-k2-fix.md | 4 ++++ .../library-tests/kclass-java-arg/test.expected | 1 + .../test-kotlin1/library-tests/kclass-java-arg/test.kt | 10 ++++++++++ .../test-kotlin1/library-tests/kclass-java-arg/test.ql | 5 +++++ .../library-tests/kclass-java-arg/test.expected | 1 + .../test-kotlin2/library-tests/kclass-java-arg/test.kt | 10 ++++++++++ .../test-kotlin2/library-tests/kclass-java-arg/test.ql | 5 +++++ 8 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 java/ql/lib/change-notes/2026-05-30-kclass-java-arg-k2-fix.md create mode 100644 java/ql/test-kotlin1/library-tests/kclass-java-arg/test.expected create mode 100644 java/ql/test-kotlin1/library-tests/kclass-java-arg/test.kt create mode 100644 java/ql/test-kotlin1/library-tests/kclass-java-arg/test.ql create mode 100644 java/ql/test-kotlin2/library-tests/kclass-java-arg/test.expected create mode 100644 java/ql/test-kotlin2/library-tests/kclass-java-arg/test.kt create mode 100644 java/ql/test-kotlin2/library-tests/kclass-java-arg/test.ql diff --git a/java/kotlin-extractor/src/main/kotlin/KotlinFileExtractor.kt b/java/kotlin-extractor/src/main/kotlin/KotlinFileExtractor.kt index bef2b554d7ec..4571987da6af 100644 --- a/java/kotlin-extractor/src/main/kotlin/KotlinFileExtractor.kt +++ b/java/kotlin-extractor/src/main/kotlin/KotlinFileExtractor.kt @@ -3905,7 +3905,14 @@ open class KotlinFileExtractor( val prop = getPropertiesByFqName(pluginContext, propertyPkg, propertyName) - .firstOrNull { it.owner.parentClassOrNull?.fqNameWhenAvailable?.asString() == type } + .firstOrNull { + val owner = it.owner + when (val parent = owner.parent) { + is IrClass -> parent.fqNameWhenAvailable?.asString() + is IrExternalPackageFragment -> getFileClassFqName(owner)?.asString() + else -> null + } == type + } ?.owner if (prop != null) { diff --git a/java/ql/lib/change-notes/2026-05-30-kclass-java-arg-k2-fix.md b/java/ql/lib/change-notes/2026-05-30-kclass-java-arg-k2-fix.md new file mode 100644 index 000000000000..bad7f5c21b30 --- /dev/null +++ b/java/ql/lib/change-notes/2026-05-30-kclass-java-arg-k2-fix.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Fixed an issue where `Foo::class.java` arguments were dropped during extraction under the Kotlin K2 compiler, which could cause false positives in queries such as `java/android/implicit-pendingintents`. diff --git a/java/ql/test-kotlin1/library-tests/kclass-java-arg/test.expected b/java/ql/test-kotlin1/library-tests/kclass-java-arg/test.expected new file mode 100644 index 000000000000..7410c1676f77 --- /dev/null +++ b/java/ql/test-kotlin1/library-tests/kclass-java-arg/test.expected @@ -0,0 +1 @@ +| consume | Class | diff --git a/java/ql/test-kotlin1/library-tests/kclass-java-arg/test.kt b/java/ql/test-kotlin1/library-tests/kclass-java-arg/test.kt new file mode 100644 index 000000000000..c3bfc80fd03e --- /dev/null +++ b/java/ql/test-kotlin1/library-tests/kclass-java-arg/test.kt @@ -0,0 +1,10 @@ +class Target + +class KClassJavaArg { + fun consume(c: Class<*>) {} + + fun test() { + // `Target::class.java` must be extracted as the argument to `consume`. + consume(Target::class.java) + } +} diff --git a/java/ql/test-kotlin1/library-tests/kclass-java-arg/test.ql b/java/ql/test-kotlin1/library-tests/kclass-java-arg/test.ql new file mode 100644 index 000000000000..e4b98d76d1cd --- /dev/null +++ b/java/ql/test-kotlin1/library-tests/kclass-java-arg/test.ql @@ -0,0 +1,5 @@ +import java + +from MethodCall mc, Argument arg +where mc.getMethod().hasName("consume") and arg = mc.getAnArgument() +select mc.getMethod().getName(), arg.getType().getName() diff --git a/java/ql/test-kotlin2/library-tests/kclass-java-arg/test.expected b/java/ql/test-kotlin2/library-tests/kclass-java-arg/test.expected new file mode 100644 index 000000000000..7410c1676f77 --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/kclass-java-arg/test.expected @@ -0,0 +1 @@ +| consume | Class | diff --git a/java/ql/test-kotlin2/library-tests/kclass-java-arg/test.kt b/java/ql/test-kotlin2/library-tests/kclass-java-arg/test.kt new file mode 100644 index 000000000000..c3bfc80fd03e --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/kclass-java-arg/test.kt @@ -0,0 +1,10 @@ +class Target + +class KClassJavaArg { + fun consume(c: Class<*>) {} + + fun test() { + // `Target::class.java` must be extracted as the argument to `consume`. + consume(Target::class.java) + } +} diff --git a/java/ql/test-kotlin2/library-tests/kclass-java-arg/test.ql b/java/ql/test-kotlin2/library-tests/kclass-java-arg/test.ql new file mode 100644 index 000000000000..e4b98d76d1cd --- /dev/null +++ b/java/ql/test-kotlin2/library-tests/kclass-java-arg/test.ql @@ -0,0 +1,5 @@ +import java + +from MethodCall mc, Argument arg +where mc.getMethod().hasName("consume") and arg = mc.getAnArgument() +select mc.getMethod().getName(), arg.getType().getName() From d3a53bd9e69de161b98959f06dd09440d93dccbc Mon Sep 17 00:00:00 2001 From: AkshayK Date: Wed, 9 Sep 2026 17:47:07 -0400 Subject: [PATCH 0810/2098] C++: Model BlazingMQ bmqa message and property taint flow Add flow summaries for BloombergLP::bmqa: Message payload and properties, MessageProperties getters/setters, the property iterator, and the MessageEvent -> MessageIterator -> Message chain. Scalar property getters are deliberately not modelled. --- .../change-notes/2026-09-09-bmqa-models.md | 4 + cpp/ql/lib/ext/bmqa.model.yml | 45 ++ .../dataflow/external-models/bmqa.cpp | 431 ++++++++++++ .../dataflow/external-models/flow.expected | 662 ++++++++++++++++-- .../dataflow/external-models/steps.expected | 84 +++ .../external-models/validatemodels.expected | 1 + .../taint-tests/test_mad-signatures.expected | 2 + 7 files changed, 1179 insertions(+), 50 deletions(-) create mode 100644 cpp/ql/lib/change-notes/2026-09-09-bmqa-models.md create mode 100644 cpp/ql/lib/ext/bmqa.model.yml create mode 100644 cpp/ql/test/library-tests/dataflow/external-models/bmqa.cpp diff --git a/cpp/ql/lib/change-notes/2026-09-09-bmqa-models.md b/cpp/ql/lib/change-notes/2026-09-09-bmqa-models.md new file mode 100644 index 000000000000..e00c3ca3532b --- /dev/null +++ b/cpp/ql/lib/change-notes/2026-09-09-bmqa-models.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added flow summaries for the BlazingMQ `BloombergLP::bmqa::Message` and `MessageProperties` classes and their iterators. diff --git a/cpp/ql/lib/ext/bmqa.model.yml b/cpp/ql/lib/ext/bmqa.model.yml new file mode 100644 index 000000000000..cb1c3834ecf5 --- /dev/null +++ b/cpp/ql/lib/ext/bmqa.model.yml @@ -0,0 +1,45 @@ +# Model of the BlazingMQ client API (BloombergLP::bmqa). Scalar property getters are not modelled. +extensions: + - addsTo: + pack: codeql/cpp-all + extensible: summaryModel + data: # namespace, type, subtypes, name, signature, ext, input, output, kind, provenance + # Message payload + - ["BloombergLP::bmqa", "Message", true, "getData", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bmqa", "Message", true, "setData", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + - ["BloombergLP::bmqa", "Message", true, "setDataRef", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + - ["BloombergLP::bmqa", "Message", true, "clone", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + # Message properties + - ["BloombergLP::bmqa", "Message", true, "loadProperties", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bmqa", "Message", true, "setPropertiesRef", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + - ["BloombergLP::bmqa", "MessageProperties", true, "MessageProperties", "(const MessageProperties &,Allocator *)", "", "Argument[*0]", "Argument[-1]", "value", "manual"] + - ["BloombergLP::bmqa", "MessageProperties", true, "operator=", "", "", "Argument[*0]", "Argument[-1]", "value", "manual"] + - ["BloombergLP::bmqa", "MessageProperties", true, "operator=", "", "", "Argument[*0]", "ReturnValue[*]", "value", "manual"] + - ["BloombergLP::bmqa", "MessageProperties", true, "getPropertyAsString", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bmqa", "MessageProperties", true, "getPropertyAsBinary", "", "", "Argument[-1]", "ReturnValue[*].Element", "taint", "manual"] + - ["BloombergLP::bmqa", "MessageProperties", true, "getPropertyAsStringOr", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bmqa", "MessageProperties", true, "getPropertyAsStringOr", "", "", "Argument[*1]", "ReturnValue[*]", "value", "manual"] + - ["BloombergLP::bmqa", "MessageProperties", true, "getPropertyAsBinaryOr", "", "", "Argument[-1]", "ReturnValue[*].Element", "taint", "manual"] + - ["BloombergLP::bmqa", "MessageProperties", true, "getPropertyAsBinaryOr", "", "", "Argument[*1].Element[@]", "ReturnValue[*].Element[@]", "value", "manual"] + - ["BloombergLP::bmqa", "MessageProperties", true, "setPropertyAsString", "", "", "Argument[1]", "Argument[-1]", "taint", "manual"] + - ["BloombergLP::bmqa", "MessageProperties", true, "setPropertyAsBinary", "", "", "Argument[1]", "Argument[-1]", "taint", "manual"] + # Property names are stored and exposed by MessagePropertiesIterator::name + - ["BloombergLP::bmqa", "MessageProperties", true, "setPropertyAsBool", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"] + - ["BloombergLP::bmqa", "MessageProperties", true, "setPropertyAsChar", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"] + - ["BloombergLP::bmqa", "MessageProperties", true, "setPropertyAsShort", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"] + - ["BloombergLP::bmqa", "MessageProperties", true, "setPropertyAsInt32", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"] + - ["BloombergLP::bmqa", "MessageProperties", true, "setPropertyAsInt64", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"] + - ["BloombergLP::bmqa", "MessageProperties", true, "setPropertyAsString", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"] + - ["BloombergLP::bmqa", "MessageProperties", true, "setPropertyAsBinary", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"] + - ["BloombergLP::bmqa", "MessageProperties", true, "streamIn", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + - ["BloombergLP::bmqa", "MessageProperties", true, "streamOut", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + # Property iteration + - ["BloombergLP::bmqa", "MessagePropertiesIterator", true, "MessagePropertiesIterator", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + - ["BloombergLP::bmqa", "MessagePropertiesIterator", true, "operator=", "", "", "Argument[*0]", "Argument[-1]", "value", "manual"] + - ["BloombergLP::bmqa", "MessagePropertiesIterator", true, "operator=", "", "", "Argument[*0]", "ReturnValue[*]", "value", "manual"] + - ["BloombergLP::bmqa", "MessagePropertiesIterator", true, "name", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bmqa", "MessagePropertiesIterator", true, "getAsString", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bmqa", "MessagePropertiesIterator", true, "getAsBinary", "", "", "Argument[-1]", "ReturnValue[*].Element", "taint", "manual"] + # Event -> iterator -> message + - ["BloombergLP::bmqa", "MessageEvent", true, "messageIterator", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["BloombergLP::bmqa", "MessageIterator", true, "message", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] diff --git a/cpp/ql/test/library-tests/dataflow/external-models/bmqa.cpp b/cpp/ql/test/library-tests/dataflow/external-models/bmqa.cpp new file mode 100644 index 000000000000..589cf480a8fc --- /dev/null +++ b/cpp/ql/test/library-tests/dataflow/external-models/bmqa.cpp @@ -0,0 +1,431 @@ + +// --- stub library headers --- + +namespace bsl { + typedef unsigned long size_t; + typedef int int32_t; + template class allocator {}; + template struct char_traits {}; + template, class Allocator = allocator > + class basic_string { + public: + basic_string(); + basic_string(const charT* s, const Allocator& a = Allocator()); + const charT* data() const; + size_t size() const; + }; + typedef basic_string string; + template > + class basic_string_view { + public: + basic_string_view(); + basic_string_view(const charT* s); + const charT* data() const; + }; + typedef basic_string_view string_view; + template > + class vector { + public: + vector(); + const T* data() const; + const T& operator[](size_t i) const; + void push_back(const T& value); + }; + template class span { + public: + span(); + span(T* p, size_t n); + T* data() const; + }; +} + +namespace BloombergLP { +namespace bslma { + class Allocator {}; +} +namespace bsls { + struct Types { typedef long long Int64; }; +} + +namespace bdlbb { + class Blob {}; + class BlobBufferFactory {}; + struct BlobUtil { + static void copy(char *dstBuffer, const Blob &srcBlob, int position, int length); + static void copy(Blob *dstBlob, int dstOffset, const char *srcBuffer, int length); + }; +} + +namespace bmqa { + class MessageProperties; + class Message { + public: + Message& setData(const bdlbb::Blob* data); + Message& setData(const char* data, bsl::size_t length); + Message& setDataRef(const bdlbb::Blob* data); + Message& setDataRef(const char* data, bsl::size_t length); + Message& setPropertiesRef(const MessageProperties* properties); + Message clone(bslma::Allocator* basicAllocator = 0) const; + int getData(bdlbb::Blob* blob) const; + int loadProperties(MessageProperties* buffer) const; + }; + class MessageProperties { + public: + explicit MessageProperties(bslma::Allocator* basicAllocator = 0); + MessageProperties(const MessageProperties& other, bslma::Allocator* basicAllocator = 0); + MessageProperties& operator=(const MessageProperties& rhs); + int setPropertyAsBool(bsl::string_view name, bool value); + int setPropertyAsChar(bsl::string_view name, char value); + int setPropertyAsShort(bsl::string_view name, short value); + int setPropertyAsInt32(bsl::string_view name, bsl::int32_t value); + int setPropertyAsInt64(bsl::string_view name, bsls::Types::Int64 value); + int setPropertyAsString(bsl::string_view name, bsl::string_view value); + int setPropertyAsBinary(bsl::string_view name, bsl::span value); + int streamIn(const bdlbb::Blob& blob); + const bdlbb::Blob& streamOut(bdlbb::BlobBufferFactory* bufferFactory) const; + bsl::int32_t getPropertyAsInt32(bsl::string_view name) const; + const bsl::string& getPropertyAsString(bsl::string_view name) const; + const bsl::vector& getPropertyAsBinary(bsl::string_view name) const; + const bsl::string& getPropertyAsStringOr(bsl::string_view name, const bsl::string& value) const; + const bsl::vector& getPropertyAsBinaryOr(bsl::string_view name, const bsl::vector& value) const; + }; + class MessagePropertiesIterator { + public: + MessagePropertiesIterator(); + explicit MessagePropertiesIterator(const MessageProperties* properties); + MessagePropertiesIterator& operator=(const MessagePropertiesIterator& rhs); + bool hasNext(); + const bsl::string& name() const; + bsl::int32_t getAsInt32() const; + const bsl::string& getAsString() const; + const bsl::vector& getAsBinary() const; + }; + class MessageIterator { + public: + bool nextMessage(); + const Message& message() const; + }; + class MessageEvent { + public: + MessageIterator messageIterator() const; + }; +} +} + +// --- test code --- + +char *source(); +void sink(char); +void sink(int); + +// A received message or event is made by reinterpreting a tainted bsl::string. + +void test_getData() { + bsl::string data(source()); + BloombergLP::bmqa::Message *msg = (BloombergLP::bmqa::Message *)data.data(); + BloombergLP::bdlbb::Blob blob; + msg->getData(&blob); + char dst[16]; + BloombergLP::bdlbb::BlobUtil::copy(dst, blob, 0, 16); + sink(*dst); // $ ir +} + +void test_event_iterator_message_getData() { + bsl::string data(source()); + BloombergLP::bmqa::MessageEvent *event = (BloombergLP::bmqa::MessageEvent *)data.data(); + BloombergLP::bmqa::MessageIterator it = event->messageIterator(); + while (it.nextMessage()) { + const BloombergLP::bmqa::Message &msg = it.message(); + BloombergLP::bdlbb::Blob blob; + msg.getData(&blob); + char dst[16]; + BloombergLP::bdlbb::BlobUtil::copy(dst, blob, 0, 16); + sink(*dst); // $ ir + } +} + +void test_setDataRef_getData_round_trip() { + bsl::string s(source()); + BloombergLP::bdlbb::Blob in; + BloombergLP::bdlbb::BlobUtil::copy(&in, 0, s.data(), s.size()); + BloombergLP::bmqa::Message msg; + msg.setDataRef(&in); + BloombergLP::bdlbb::Blob out; + msg.getData(&out); + char dst[16]; + BloombergLP::bdlbb::BlobUtil::copy(dst, out, 0, 16); + sink(*dst); // $ ir +} + +void test_setDataRef_chars_getData() { + bsl::string s(source()); + BloombergLP::bmqa::Message msg; + msg.setDataRef(s.data(), s.size()); + BloombergLP::bdlbb::Blob out; + msg.getData(&out); + char dst[16]; + BloombergLP::bdlbb::BlobUtil::copy(dst, out, 0, 16); + sink(*dst); // $ ir +} + +void test_setData_getData() { + bsl::string s(source()); + BloombergLP::bmqa::Message msg; + msg.setData(s.data(), s.size()); + BloombergLP::bdlbb::Blob out; + msg.getData(&out); + char dst[16]; + BloombergLP::bdlbb::BlobUtil::copy(dst, out, 0, 16); + sink(*dst); // $ ir +} + +void test_clone_getData() { + bsl::string data(source()); + BloombergLP::bmqa::Message *msg = (BloombergLP::bmqa::Message *)data.data(); + BloombergLP::bmqa::Message copy = msg->clone(); + BloombergLP::bdlbb::Blob blob; + copy.getData(&blob); + char dst[16]; + BloombergLP::bdlbb::BlobUtil::copy(dst, blob, 0, 16); + sink(*dst); // $ ir +} + +void test_loadProperties_getPropertyAsString() { + bsl::string data(source()); + BloombergLP::bmqa::Message *msg = (BloombergLP::bmqa::Message *)data.data(); + BloombergLP::bmqa::MessageProperties props; + msg->loadProperties(&props); + const bsl::string &value = props.getPropertyAsString("key"); + sink(value.data()[0]); // $ ir +} + +void test_loadProperties_getPropertyAsBinary() { + bsl::string data(source()); + BloombergLP::bmqa::Message *msg = (BloombergLP::bmqa::Message *)data.data(); + BloombergLP::bmqa::MessageProperties props; + msg->loadProperties(&props); + const bsl::vector &value = props.getPropertyAsBinary("key"); + sink(value.data()[0]); // $ ir +} + +void test_loadProperties_getPropertyAsBinary_index() { + bsl::string data(source()); + BloombergLP::bmqa::Message *msg = (BloombergLP::bmqa::Message *)data.data(); + BloombergLP::bmqa::MessageProperties props; + msg->loadProperties(&props); + const bsl::vector &value = props.getPropertyAsBinary("key"); + sink(value[0]); // $ ir +} + +void test_getPropertyAsStringOr() { + bsl::string data(source()); + BloombergLP::bmqa::Message *msg = (BloombergLP::bmqa::Message *)data.data(); + BloombergLP::bmqa::MessageProperties props; + msg->loadProperties(&props); + bsl::string dflt; + const bsl::string &value = props.getPropertyAsStringOr("key", dflt); + sink(*value.data()); // $ ir +} + +// The default value is returned when the property is absent. +void test_getPropertyAsStringOr_default() { + bsl::string dflt(source()); + BloombergLP::bmqa::MessageProperties props; + const bsl::string &value = props.getPropertyAsStringOr("key", dflt); + sink(*value.data()); // $ ir +} + +void test_getPropertyAsBinaryOr() { + bsl::string data(source()); + BloombergLP::bmqa::Message *msg = (BloombergLP::bmqa::Message *)data.data(); + BloombergLP::bmqa::MessageProperties props; + msg->loadProperties(&props); + bsl::vector dflt; + const bsl::vector &value = props.getPropertyAsBinaryOr("key", dflt); + sink(*value.data()); // $ ir +} + +void test_getPropertyAsBinaryOr_default() { + char c = *source(); + bsl::vector dflt; + dflt.push_back(c); + BloombergLP::bmqa::MessageProperties props; + const bsl::vector &value = props.getPropertyAsBinaryOr("key", dflt); + sink(*value.data()); // $ ir +} + +void test_getPropertyAsInt32_no_flow() { + bsl::string data(source()); + BloombergLP::bmqa::Message *msg = (BloombergLP::bmqa::Message *)data.data(); + BloombergLP::bmqa::MessageProperties props; + msg->loadProperties(&props); + sink(props.getPropertyAsInt32("key")); // no flow: scalar getters are not modelled +} + +void test_streamIn_getPropertyAsString() { + bsl::string s(source()); + BloombergLP::bdlbb::Blob blob; + BloombergLP::bdlbb::BlobUtil::copy(&blob, 0, s.data(), s.size()); + BloombergLP::bmqa::MessageProperties props; + props.streamIn(blob); + sink(*props.getPropertyAsString("key").data()); // $ ir +} + +void test_setPropertiesRef_loadProperties() { + bsl::string s(source()); + BloombergLP::bdlbb::Blob blob; + BloombergLP::bdlbb::BlobUtil::copy(&blob, 0, s.data(), s.size()); + BloombergLP::bmqa::MessageProperties in; + in.streamIn(blob); + BloombergLP::bmqa::Message msg; + msg.setPropertiesRef(&in); + BloombergLP::bmqa::MessageProperties out; + msg.loadProperties(&out); + sink(*out.getPropertyAsString("key").data()); // $ ir +} + +void test_streamOut() { + bsl::string data(source()); + BloombergLP::bmqa::Message *msg = (BloombergLP::bmqa::Message *)data.data(); + BloombergLP::bmqa::MessageProperties props; + msg->loadProperties(&props); + BloombergLP::bdlbb::BlobBufferFactory factory; + const BloombergLP::bdlbb::Blob &blob = props.streamOut(&factory); + char dst[16]; + BloombergLP::bdlbb::BlobUtil::copy(dst, blob, 0, 16); + sink(*dst); // $ ir +} + +void test_copy_constructor() { + bsl::string data(source()); + BloombergLP::bmqa::Message *msg = (BloombergLP::bmqa::Message *)data.data(); + BloombergLP::bmqa::MessageProperties props; + msg->loadProperties(&props); + BloombergLP::bmqa::MessageProperties copy(props); + sink(*copy.getPropertyAsString("key").data()); // $ ir +} + +void test_assignment() { + bsl::string data(source()); + BloombergLP::bmqa::Message *msg = (BloombergLP::bmqa::Message *)data.data(); + BloombergLP::bmqa::MessageProperties props; + msg->loadProperties(&props); + BloombergLP::bmqa::MessageProperties copy; + copy = props; + sink(*copy.getPropertyAsString("key").data()); // $ ir +} + +void test_assignment_result() { + bsl::string data(source()); + BloombergLP::bmqa::Message *msg = (BloombergLP::bmqa::Message *)data.data(); + BloombergLP::bmqa::MessageProperties props; + msg->loadProperties(&props); + BloombergLP::bmqa::MessageProperties copy; + sink(*(copy = props).getPropertyAsString("key").data()); // $ ir +} + +void test_setPropertyAsString() { + bsl::string data(source()); + bsl::string_view *value = (bsl::string_view *)data.data(); + BloombergLP::bmqa::MessageProperties props; + props.setPropertyAsString("key", *value); + sink(*props.getPropertyAsString("key").data()); // $ ir +} + +void test_setPropertyAsString_from_chars() { + bsl::string_view value(source()); + BloombergLP::bmqa::MessageProperties props; + props.setPropertyAsString("key", value); + sink(*props.getPropertyAsString("key").data()); // $ ir +} + +void test_setPropertyAsBinary() { + bsl::string data(source()); + bsl::span *value = (bsl::span *)data.data(); + BloombergLP::bmqa::MessageProperties props; + props.setPropertyAsBinary("key", *value); + sink(*props.getPropertyAsBinary("key").data()); // $ ir +} + +// A stored property name is exposed again by the iterator. +void test_setPropertyAsBool_name() { + bsl::string_view name(source()); + BloombergLP::bmqa::MessageProperties props; + props.setPropertyAsBool(name, true); + BloombergLP::bmqa::MessagePropertiesIterator it(&props); + sink(*it.name().data()); // $ ir +} + +void test_setPropertyAsChar_name() { + bsl::string_view name(source()); + BloombergLP::bmqa::MessageProperties props; + props.setPropertyAsChar(name, 'c'); + BloombergLP::bmqa::MessagePropertiesIterator it(&props); + sink(*it.name().data()); // $ ir +} + +void test_setPropertyAsShort_name() { + bsl::string_view name(source()); + BloombergLP::bmqa::MessageProperties props; + props.setPropertyAsShort(name, 1); + BloombergLP::bmqa::MessagePropertiesIterator it(&props); + sink(*it.name().data()); // $ ir +} + +void test_setPropertyAsInt32_name() { + bsl::string_view name(source()); + BloombergLP::bmqa::MessageProperties props; + props.setPropertyAsInt32(name, 1); + BloombergLP::bmqa::MessagePropertiesIterator it(&props); + sink(*it.name().data()); // $ ir +} + +void test_setPropertyAsInt64_name() { + bsl::string_view name(source()); + BloombergLP::bmqa::MessageProperties props; + props.setPropertyAsInt64(name, 1); + BloombergLP::bmqa::MessagePropertiesIterator it(&props); + sink(*it.name().data()); // $ ir +} + +void test_setPropertyAsString_name() { + bsl::string_view name(source()); + BloombergLP::bmqa::MessageProperties props; + props.setPropertyAsString(name, "value"); + BloombergLP::bmqa::MessagePropertiesIterator it(&props); + sink(*it.name().data()); // $ ir +} + +void test_setPropertyAsBinary_name() { + bsl::string_view name(source()); + BloombergLP::bmqa::MessageProperties props; + props.setPropertyAsBinary(name, bsl::span()); + BloombergLP::bmqa::MessagePropertiesIterator it(&props); + sink(*it.name().data()); // $ ir +} + +void test_iterator() { + bsl::string data(source()); + BloombergLP::bmqa::Message *msg = (BloombergLP::bmqa::Message *)data.data(); + BloombergLP::bmqa::MessageProperties props; + msg->loadProperties(&props); + BloombergLP::bmqa::MessagePropertiesIterator it(&props); + while (it.hasNext()) { + sink(*it.name().data()); // $ ir + sink(*it.getAsString().data()); // $ ir + sink(*it.getAsBinary().data()); // $ ir + sink(it.getAsInt32()); // no flow: scalar getters are not modelled + } +} + +void test_iterator_assignment() { + bsl::string data(source()); + BloombergLP::bmqa::Message *msg = (BloombergLP::bmqa::Message *)data.data(); + BloombergLP::bmqa::MessageProperties props; + msg->loadProperties(&props); + BloombergLP::bmqa::MessagePropertiesIterator it(&props); + BloombergLP::bmqa::MessagePropertiesIterator copy; + copy = it; + sink(*copy.getAsString().data()); // $ ir + sink(*(copy = it).name().data()); // $ ir +} diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index ee6d7539cc0a..8a153cb0b1e0 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -102,23 +102,60 @@ models | 101 | Summary: BloombergLP::bdlbb; BlobUtil; true; copy; (Blob *,int,const char *,int); ; Argument[*2]; Argument[*0]; taint; manual | | 102 | Summary: BloombergLP::bdlbb; BlobUtil; true; copy; (char *,const Blob &,int,int); ; Argument[*1]; Argument[*0]; taint; manual | | 103 | Summary: BloombergLP::bdlbb; BlobUtil; true; getContiguousRangeOrCopy; ; ; Argument[*1]; ReturnValue[*]; taint; manual | -| 104 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,const string &,const string &); ; Argument[*1..2]; ReturnValue; taint; manual | -| 105 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,const string &,const string &,error_code &); ; Argument[*1..2]; ReturnValue; taint; manual | -| 106 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,const string &,const string &,flags); ; Argument[*1..2]; ReturnValue; taint; manual | -| 107 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,const string &,const string &,flags,error_code &); ; Argument[*1..2]; ReturnValue; taint; manual | -| 108 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,string_view,string_view); ; Argument[1..2]; ReturnValue; taint; manual | -| 109 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,string_view,string_view,error_code &); ; Argument[1..2]; ReturnValue; taint; manual | -| 110 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,string_view,string_view,flags); ; Argument[1..2]; ReturnValue; taint; manual | -| 111 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,string_view,string_view,flags,error_code &); ; Argument[1..2]; ReturnValue; taint; manual | -| 112 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const string &,const string &); ; Argument[*0..1]; ReturnValue; taint; manual | -| 113 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const string &,const string &,error_code &); ; Argument[*0..1]; ReturnValue; taint; manual | -| 114 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const string &,const string &,flags); ; Argument[*0..1]; ReturnValue; taint; manual | -| 115 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const string &,const string &,flags,error_code &); ; Argument[*0..1]; ReturnValue; taint; manual | -| 116 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view); ; Argument[0..1]; ReturnValue; taint; manual | -| 117 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view,error_code &); ; Argument[0..1]; ReturnValue; taint; manual | -| 118 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view,flags); ; Argument[0..1]; ReturnValue; taint; manual | -| 119 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view,flags,error_code &); ; Argument[0..1]; ReturnValue; taint; manual | -| 120 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | +| 104 | Summary: BloombergLP::bmqa; Message; true; clone; ; ; Argument[-1]; ReturnValue; taint; manual | +| 105 | Summary: BloombergLP::bmqa; Message; true; getData; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 106 | Summary: BloombergLP::bmqa; Message; true; loadProperties; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 107 | Summary: BloombergLP::bmqa; Message; true; setData; ; ; Argument[*0]; Argument[-1]; taint; manual | +| 108 | Summary: BloombergLP::bmqa; Message; true; setDataRef; ; ; Argument[*0]; Argument[-1]; taint; manual | +| 109 | Summary: BloombergLP::bmqa; Message; true; setPropertiesRef; ; ; Argument[*0]; Argument[-1]; taint; manual | +| 110 | Summary: BloombergLP::bmqa; MessageEvent; true; messageIterator; ; ; Argument[-1]; ReturnValue; taint; manual | +| 111 | Summary: BloombergLP::bmqa; MessageIterator; true; message; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 112 | Summary: BloombergLP::bmqa; MessageProperties; true; MessageProperties; (const MessageProperties &,Allocator *); ; Argument[*0]; Argument[-1]; value; manual | +| 113 | Summary: BloombergLP::bmqa; MessageProperties; true; getPropertyAsBinary; ; ; Argument[-1]; ReturnValue[*].Element; taint; manual | +| 114 | Summary: BloombergLP::bmqa; MessageProperties; true; getPropertyAsBinaryOr; ; ; Argument[*1].Element[@]; ReturnValue[*].Element[@]; value; manual | +| 115 | Summary: BloombergLP::bmqa; MessageProperties; true; getPropertyAsBinaryOr; ; ; Argument[-1]; ReturnValue[*].Element; taint; manual | +| 116 | Summary: BloombergLP::bmqa; MessageProperties; true; getPropertyAsString; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 117 | Summary: BloombergLP::bmqa; MessageProperties; true; getPropertyAsStringOr; ; ; Argument[*1]; ReturnValue[*]; value; manual | +| 118 | Summary: BloombergLP::bmqa; MessageProperties; true; getPropertyAsStringOr; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 119 | Summary: BloombergLP::bmqa; MessageProperties; true; operator=; ; ; Argument[*0]; Argument[-1]; value; manual | +| 120 | Summary: BloombergLP::bmqa; MessageProperties; true; operator=; ; ; Argument[*0]; ReturnValue[*]; value; manual | +| 121 | Summary: BloombergLP::bmqa; MessageProperties; true; setPropertyAsBinary; ; ; Argument[0]; Argument[-1]; taint; manual | +| 122 | Summary: BloombergLP::bmqa; MessageProperties; true; setPropertyAsBinary; ; ; Argument[1]; Argument[-1]; taint; manual | +| 123 | Summary: BloombergLP::bmqa; MessageProperties; true; setPropertyAsBool; ; ; Argument[0]; Argument[-1]; taint; manual | +| 124 | Summary: BloombergLP::bmqa; MessageProperties; true; setPropertyAsChar; ; ; Argument[0]; Argument[-1]; taint; manual | +| 125 | Summary: BloombergLP::bmqa; MessageProperties; true; setPropertyAsInt32; ; ; Argument[0]; Argument[-1]; taint; manual | +| 126 | Summary: BloombergLP::bmqa; MessageProperties; true; setPropertyAsInt64; ; ; Argument[0]; Argument[-1]; taint; manual | +| 127 | Summary: BloombergLP::bmqa; MessageProperties; true; setPropertyAsShort; ; ; Argument[0]; Argument[-1]; taint; manual | +| 128 | Summary: BloombergLP::bmqa; MessageProperties; true; setPropertyAsString; ; ; Argument[0]; Argument[-1]; taint; manual | +| 129 | Summary: BloombergLP::bmqa; MessageProperties; true; setPropertyAsString; ; ; Argument[1]; Argument[-1]; taint; manual | +| 130 | Summary: BloombergLP::bmqa; MessageProperties; true; streamIn; ; ; Argument[*0]; Argument[-1]; taint; manual | +| 131 | Summary: BloombergLP::bmqa; MessageProperties; true; streamOut; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 132 | Summary: BloombergLP::bmqa; MessagePropertiesIterator; true; MessagePropertiesIterator; ; ; Argument[*0]; Argument[-1]; taint; manual | +| 133 | Summary: BloombergLP::bmqa; MessagePropertiesIterator; true; getAsBinary; ; ; Argument[-1]; ReturnValue[*].Element; taint; manual | +| 134 | Summary: BloombergLP::bmqa; MessagePropertiesIterator; true; getAsString; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 135 | Summary: BloombergLP::bmqa; MessagePropertiesIterator; true; name; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 136 | Summary: BloombergLP::bmqa; MessagePropertiesIterator; true; operator=; ; ; Argument[*0]; Argument[-1]; value; manual | +| 137 | Summary: BloombergLP::bmqa; MessagePropertiesIterator; true; operator=; ; ; Argument[*0]; ReturnValue[*]; value; manual | +| 138 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,const string &,const string &); ; Argument[*1..2]; ReturnValue; taint; manual | +| 139 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,const string &,const string &,error_code &); ; Argument[*1..2]; ReturnValue; taint; manual | +| 140 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,const string &,const string &,flags); ; Argument[*1..2]; ReturnValue; taint; manual | +| 141 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,const string &,const string &,flags,error_code &); ; Argument[*1..2]; ReturnValue; taint; manual | +| 142 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,string_view,string_view); ; Argument[1..2]; ReturnValue; taint; manual | +| 143 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,string_view,string_view,error_code &); ; Argument[1..2]; ReturnValue; taint; manual | +| 144 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,string_view,string_view,flags); ; Argument[1..2]; ReturnValue; taint; manual | +| 145 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,string_view,string_view,flags,error_code &); ; Argument[1..2]; ReturnValue; taint; manual | +| 146 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const string &,const string &); ; Argument[*0..1]; ReturnValue; taint; manual | +| 147 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const string &,const string &,error_code &); ; Argument[*0..1]; ReturnValue; taint; manual | +| 148 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const string &,const string &,flags); ; Argument[*0..1]; ReturnValue; taint; manual | +| 149 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const string &,const string &,flags,error_code &); ; Argument[*0..1]; ReturnValue; taint; manual | +| 150 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view); ; Argument[0..1]; ReturnValue; taint; manual | +| 151 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view,error_code &); ; Argument[0..1]; ReturnValue; taint; manual | +| 152 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view,flags); ; Argument[0..1]; ReturnValue; taint; manual | +| 153 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view,flags,error_code &); ; Argument[0..1]; ReturnValue; taint; manual | +| 154 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | +| 155 | Summary: bsl; vector; true; data; ; ; Argument[-1].Element[@]; ReturnValue[*@]; value; manual | +| 156 | Summary: bsl; vector; true; operator[]; ; ; Argument[-1].Element[@]; ReturnValue[*@]; value; manual | +| 157 | Summary: bsl; vector; true; push_back; ; ; Argument[*@0]; Argument[-1].Element[@]; value; manual | edges | asio_streams.cpp:129:34:129:44 | read_until output argument | asio_streams.cpp:133:7:133:17 | recv_buffer | provenance | Src:MaD:56 | | asio_streams.cpp:129:34:129:44 | read_until output argument | asio_streams.cpp:135:29:135:39 | recv_buffer | provenance | Src:MaD:56 Sink:MaD:4 | @@ -127,7 +164,7 @@ edges | asio_streams.cpp:142:44:142:62 | call to buffer | asio_streams.cpp:142:44:142:62 | call to buffer | provenance | | | asio_streams.cpp:142:44:142:62 | call to buffer | asio_streams.cpp:143:7:143:17 | send_buffer | provenance | | | asio_streams.cpp:142:44:142:62 | call to buffer | asio_streams.cpp:145:29:145:39 | send_buffer | provenance | Sink:MaD:4 | -| asio_streams.cpp:142:64:142:71 | *send_str | asio_streams.cpp:142:44:142:62 | call to buffer | provenance | MaD:120 | +| asio_streams.cpp:142:64:142:71 | *send_str | asio_streams.cpp:142:44:142:62 | call to buffer | provenance | MaD:154 | | asio_streams.cpp:156:19:156:26 | call to source | asio_streams.cpp:161:24:161:27 | *host | provenance | TaintFunction | | asio_streams.cpp:156:19:156:26 | call to source | asio_streams.cpp:162:24:162:27 | *host | provenance | TaintFunction | | asio_streams.cpp:156:19:156:26 | call to source | asio_streams.cpp:163:24:163:27 | *host | provenance | TaintFunction | @@ -144,22 +181,22 @@ edges | asio_streams.cpp:158:29:158:36 | call to source | asio_streams.cpp:177:34:177:42 | host_view | provenance | TaintFunction | | asio_streams.cpp:158:29:158:36 | call to source | asio_streams.cpp:178:34:178:42 | host_view | provenance | TaintFunction | | asio_streams.cpp:158:29:158:36 | call to source | asio_streams.cpp:179:34:179:42 | host_view | provenance | TaintFunction | -| asio_streams.cpp:161:24:161:27 | *host | asio_streams.cpp:161:16:161:22 | call to resolve | provenance | MaD:112 | -| asio_streams.cpp:162:24:162:27 | *host | asio_streams.cpp:162:16:162:22 | call to resolve | provenance | MaD:113 | -| asio_streams.cpp:163:24:163:27 | *host | asio_streams.cpp:163:16:163:22 | call to resolve | provenance | MaD:114 | -| asio_streams.cpp:164:24:164:27 | *host | asio_streams.cpp:164:16:164:22 | call to resolve | provenance | MaD:115 | -| asio_streams.cpp:166:24:166:32 | host_view | asio_streams.cpp:166:16:166:22 | call to resolve | provenance | MaD:116 | -| asio_streams.cpp:167:24:167:32 | host_view | asio_streams.cpp:167:16:167:22 | call to resolve | provenance | MaD:117 | -| asio_streams.cpp:168:24:168:32 | host_view | asio_streams.cpp:168:16:168:22 | call to resolve | provenance | MaD:118 | -| asio_streams.cpp:169:24:169:32 | host_view | asio_streams.cpp:169:16:169:22 | call to resolve | provenance | MaD:119 | -| asio_streams.cpp:171:34:171:37 | *host | asio_streams.cpp:171:16:171:22 | call to resolve | provenance | MaD:104 | -| asio_streams.cpp:172:34:172:37 | *host | asio_streams.cpp:172:16:172:22 | call to resolve | provenance | MaD:105 | -| asio_streams.cpp:173:34:173:37 | *host | asio_streams.cpp:173:16:173:22 | call to resolve | provenance | MaD:106 | -| asio_streams.cpp:174:34:174:37 | *host | asio_streams.cpp:174:16:174:22 | call to resolve | provenance | MaD:107 | -| asio_streams.cpp:176:34:176:42 | host_view | asio_streams.cpp:176:16:176:22 | call to resolve | provenance | MaD:108 | -| asio_streams.cpp:177:34:177:42 | host_view | asio_streams.cpp:177:16:177:22 | call to resolve | provenance | MaD:109 | -| asio_streams.cpp:178:34:178:42 | host_view | asio_streams.cpp:178:16:178:22 | call to resolve | provenance | MaD:110 | -| asio_streams.cpp:179:34:179:42 | host_view | asio_streams.cpp:179:16:179:22 | call to resolve | provenance | MaD:111 | +| asio_streams.cpp:161:24:161:27 | *host | asio_streams.cpp:161:16:161:22 | call to resolve | provenance | MaD:146 | +| asio_streams.cpp:162:24:162:27 | *host | asio_streams.cpp:162:16:162:22 | call to resolve | provenance | MaD:147 | +| asio_streams.cpp:163:24:163:27 | *host | asio_streams.cpp:163:16:163:22 | call to resolve | provenance | MaD:148 | +| asio_streams.cpp:164:24:164:27 | *host | asio_streams.cpp:164:16:164:22 | call to resolve | provenance | MaD:149 | +| asio_streams.cpp:166:24:166:32 | host_view | asio_streams.cpp:166:16:166:22 | call to resolve | provenance | MaD:150 | +| asio_streams.cpp:167:24:167:32 | host_view | asio_streams.cpp:167:16:167:22 | call to resolve | provenance | MaD:151 | +| asio_streams.cpp:168:24:168:32 | host_view | asio_streams.cpp:168:16:168:22 | call to resolve | provenance | MaD:152 | +| asio_streams.cpp:169:24:169:32 | host_view | asio_streams.cpp:169:16:169:22 | call to resolve | provenance | MaD:153 | +| asio_streams.cpp:171:34:171:37 | *host | asio_streams.cpp:171:16:171:22 | call to resolve | provenance | MaD:138 | +| asio_streams.cpp:172:34:172:37 | *host | asio_streams.cpp:172:16:172:22 | call to resolve | provenance | MaD:139 | +| asio_streams.cpp:173:34:173:37 | *host | asio_streams.cpp:173:16:173:22 | call to resolve | provenance | MaD:140 | +| asio_streams.cpp:174:34:174:37 | *host | asio_streams.cpp:174:16:174:22 | call to resolve | provenance | MaD:141 | +| asio_streams.cpp:176:34:176:42 | host_view | asio_streams.cpp:176:16:176:22 | call to resolve | provenance | MaD:142 | +| asio_streams.cpp:177:34:177:42 | host_view | asio_streams.cpp:177:16:177:22 | call to resolve | provenance | MaD:143 | +| asio_streams.cpp:178:34:178:42 | host_view | asio_streams.cpp:178:16:178:22 | call to resolve | provenance | MaD:144 | +| asio_streams.cpp:179:34:179:42 | host_view | asio_streams.cpp:179:16:179:22 | call to resolve | provenance | MaD:145 | | asio_streams.cpp:188:22:188:29 | call to source | asio_streams.cpp:192:30:192:36 | *service | provenance | TaintFunction | | asio_streams.cpp:188:22:188:29 | call to source | asio_streams.cpp:193:30:193:36 | *service | provenance | TaintFunction | | asio_streams.cpp:188:22:188:29 | call to source | asio_streams.cpp:194:30:194:36 | *service | provenance | TaintFunction | @@ -176,22 +213,22 @@ edges | asio_streams.cpp:190:32:190:39 | call to source | asio_streams.cpp:208:45:208:56 | service_view | provenance | TaintFunction | | asio_streams.cpp:190:32:190:39 | call to source | asio_streams.cpp:209:45:209:56 | service_view | provenance | TaintFunction | | asio_streams.cpp:190:32:190:39 | call to source | asio_streams.cpp:210:45:210:56 | service_view | provenance | TaintFunction | -| asio_streams.cpp:192:30:192:36 | *service | asio_streams.cpp:192:16:192:22 | call to resolve | provenance | MaD:112 | -| asio_streams.cpp:193:30:193:36 | *service | asio_streams.cpp:193:16:193:22 | call to resolve | provenance | MaD:113 | -| asio_streams.cpp:194:30:194:36 | *service | asio_streams.cpp:194:16:194:22 | call to resolve | provenance | MaD:114 | -| asio_streams.cpp:195:30:195:36 | *service | asio_streams.cpp:195:16:195:22 | call to resolve | provenance | MaD:115 | -| asio_streams.cpp:197:35:197:46 | service_view | asio_streams.cpp:197:16:197:22 | call to resolve | provenance | MaD:116 | -| asio_streams.cpp:198:35:198:46 | service_view | asio_streams.cpp:198:16:198:22 | call to resolve | provenance | MaD:117 | -| asio_streams.cpp:199:35:199:46 | service_view | asio_streams.cpp:199:16:199:22 | call to resolve | provenance | MaD:118 | -| asio_streams.cpp:200:35:200:46 | service_view | asio_streams.cpp:200:16:200:22 | call to resolve | provenance | MaD:119 | -| asio_streams.cpp:202:40:202:46 | *service | asio_streams.cpp:202:16:202:22 | call to resolve | provenance | MaD:104 | -| asio_streams.cpp:203:40:203:46 | *service | asio_streams.cpp:203:16:203:22 | call to resolve | provenance | MaD:105 | -| asio_streams.cpp:204:40:204:46 | *service | asio_streams.cpp:204:16:204:22 | call to resolve | provenance | MaD:106 | -| asio_streams.cpp:205:40:205:46 | *service | asio_streams.cpp:205:16:205:22 | call to resolve | provenance | MaD:107 | -| asio_streams.cpp:207:45:207:56 | service_view | asio_streams.cpp:207:16:207:22 | call to resolve | provenance | MaD:108 | -| asio_streams.cpp:208:45:208:56 | service_view | asio_streams.cpp:208:16:208:22 | call to resolve | provenance | MaD:109 | -| asio_streams.cpp:209:45:209:56 | service_view | asio_streams.cpp:209:16:209:22 | call to resolve | provenance | MaD:110 | -| asio_streams.cpp:210:45:210:56 | service_view | asio_streams.cpp:210:16:210:22 | call to resolve | provenance | MaD:111 | +| asio_streams.cpp:192:30:192:36 | *service | asio_streams.cpp:192:16:192:22 | call to resolve | provenance | MaD:146 | +| asio_streams.cpp:193:30:193:36 | *service | asio_streams.cpp:193:16:193:22 | call to resolve | provenance | MaD:147 | +| asio_streams.cpp:194:30:194:36 | *service | asio_streams.cpp:194:16:194:22 | call to resolve | provenance | MaD:148 | +| asio_streams.cpp:195:30:195:36 | *service | asio_streams.cpp:195:16:195:22 | call to resolve | provenance | MaD:149 | +| asio_streams.cpp:197:35:197:46 | service_view | asio_streams.cpp:197:16:197:22 | call to resolve | provenance | MaD:150 | +| asio_streams.cpp:198:35:198:46 | service_view | asio_streams.cpp:198:16:198:22 | call to resolve | provenance | MaD:151 | +| asio_streams.cpp:199:35:199:46 | service_view | asio_streams.cpp:199:16:199:22 | call to resolve | provenance | MaD:152 | +| asio_streams.cpp:200:35:200:46 | service_view | asio_streams.cpp:200:16:200:22 | call to resolve | provenance | MaD:153 | +| asio_streams.cpp:202:40:202:46 | *service | asio_streams.cpp:202:16:202:22 | call to resolve | provenance | MaD:138 | +| asio_streams.cpp:203:40:203:46 | *service | asio_streams.cpp:203:16:203:22 | call to resolve | provenance | MaD:139 | +| asio_streams.cpp:204:40:204:46 | *service | asio_streams.cpp:204:16:204:22 | call to resolve | provenance | MaD:140 | +| asio_streams.cpp:205:40:205:46 | *service | asio_streams.cpp:205:16:205:22 | call to resolve | provenance | MaD:141 | +| asio_streams.cpp:207:45:207:56 | service_view | asio_streams.cpp:207:16:207:22 | call to resolve | provenance | MaD:142 | +| asio_streams.cpp:208:45:208:56 | service_view | asio_streams.cpp:208:16:208:22 | call to resolve | provenance | MaD:143 | +| asio_streams.cpp:209:45:209:56 | service_view | asio_streams.cpp:209:16:209:22 | call to resolve | provenance | MaD:144 | +| asio_streams.cpp:210:45:210:56 | service_view | asio_streams.cpp:210:16:210:22 | call to resolve | provenance | MaD:145 | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:257:5:257:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:262:5:262:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:266:38:266:41 | *resp | provenance | | @@ -263,6 +300,256 @@ edges | bdlbb.cpp:94:46:94:48 | *src | bdlbb.cpp:94:37:94:40 | copy output argument | provenance | MaD:100 | | bdlbb.cpp:96:37:96:39 | copy output argument | bdlbb.cpp:97:7:97:10 | * ... | provenance | | | bdlbb.cpp:96:42:96:44 | *dst | bdlbb.cpp:96:37:96:39 | copy output argument | provenance | MaD:102 | +| bmqa.cpp:124:19:124:26 | call to source | bmqa.cpp:125:36:125:76 | *call to data | provenance | TaintFunction | +| bmqa.cpp:125:36:125:76 | *call to data | bmqa.cpp:127:2:127:4 | *msg | provenance | | +| bmqa.cpp:127:2:127:4 | *msg | bmqa.cpp:127:15:127:19 | getData output argument | provenance | MaD:105 | +| bmqa.cpp:127:15:127:19 | getData output argument | bmqa.cpp:129:42:129:45 | *blob | provenance | | +| bmqa.cpp:129:37:129:39 | copy output argument | bmqa.cpp:130:7:130:10 | * ... | provenance | | +| bmqa.cpp:129:42:129:45 | *blob | bmqa.cpp:129:37:129:39 | copy output argument | provenance | MaD:102 | +| bmqa.cpp:134:19:134:26 | call to source | bmqa.cpp:135:43:135:88 | *call to data | provenance | TaintFunction | +| bmqa.cpp:135:43:135:88 | *call to data | bmqa.cpp:136:42:136:46 | *event | provenance | | +| bmqa.cpp:136:42:136:46 | *event | bmqa.cpp:136:49:136:63 | call to messageIterator | provenance | MaD:110 | +| bmqa.cpp:136:49:136:63 | call to messageIterator | bmqa.cpp:136:49:136:63 | call to messageIterator | provenance | | +| bmqa.cpp:136:49:136:63 | call to messageIterator | bmqa.cpp:138:43:138:44 | *it | provenance | | +| bmqa.cpp:138:43:138:44 | *it | bmqa.cpp:138:53:138:55 | *call to message | provenance | MaD:111 | +| bmqa.cpp:138:53:138:55 | *call to message | bmqa.cpp:138:53:138:55 | *call to message | provenance | | +| bmqa.cpp:138:53:138:55 | *call to message | bmqa.cpp:140:3:140:5 | *msg | provenance | | +| bmqa.cpp:140:3:140:5 | *msg | bmqa.cpp:140:15:140:19 | getData output argument | provenance | MaD:105 | +| bmqa.cpp:140:15:140:19 | getData output argument | bmqa.cpp:142:43:142:46 | *blob | provenance | | +| bmqa.cpp:142:38:142:40 | copy output argument | bmqa.cpp:143:8:143:11 | * ... | provenance | | +| bmqa.cpp:142:43:142:46 | *blob | bmqa.cpp:142:38:142:40 | copy output argument | provenance | MaD:102 | +| bmqa.cpp:148:16:148:23 | call to source | bmqa.cpp:150:47:150:50 | *call to data | provenance | TaintFunction | +| bmqa.cpp:150:37:150:39 | copy output argument | bmqa.cpp:152:17:152:19 | *& ... | provenance | | +| bmqa.cpp:150:47:150:50 | *call to data | bmqa.cpp:150:37:150:39 | copy output argument | provenance | MaD:101 | +| bmqa.cpp:152:2:152:4 | setDataRef output argument | bmqa.cpp:154:2:154:4 | *msg | provenance | | +| bmqa.cpp:152:17:152:19 | *& ... | bmqa.cpp:152:2:152:4 | setDataRef output argument | provenance | MaD:108 | +| bmqa.cpp:154:2:154:4 | *msg | bmqa.cpp:154:14:154:17 | getData output argument | provenance | MaD:105 | +| bmqa.cpp:154:14:154:17 | getData output argument | bmqa.cpp:156:42:156:44 | *out | provenance | | +| bmqa.cpp:156:37:156:39 | copy output argument | bmqa.cpp:157:7:157:10 | * ... | provenance | | +| bmqa.cpp:156:42:156:44 | *out | bmqa.cpp:156:37:156:39 | copy output argument | provenance | MaD:102 | +| bmqa.cpp:161:16:161:23 | call to source | bmqa.cpp:163:19:163:22 | *call to data | provenance | TaintFunction | +| bmqa.cpp:163:2:163:4 | setDataRef output argument | bmqa.cpp:165:2:165:4 | *msg | provenance | | +| bmqa.cpp:163:19:163:22 | *call to data | bmqa.cpp:163:2:163:4 | setDataRef output argument | provenance | MaD:108 | +| bmqa.cpp:165:2:165:4 | *msg | bmqa.cpp:165:14:165:17 | getData output argument | provenance | MaD:105 | +| bmqa.cpp:165:14:165:17 | getData output argument | bmqa.cpp:167:42:167:44 | *out | provenance | | +| bmqa.cpp:167:37:167:39 | copy output argument | bmqa.cpp:168:7:168:10 | * ... | provenance | | +| bmqa.cpp:167:42:167:44 | *out | bmqa.cpp:167:37:167:39 | copy output argument | provenance | MaD:102 | +| bmqa.cpp:172:16:172:23 | call to source | bmqa.cpp:174:16:174:19 | *call to data | provenance | TaintFunction | +| bmqa.cpp:174:2:174:4 | setData output argument | bmqa.cpp:176:2:176:4 | *msg | provenance | | +| bmqa.cpp:174:16:174:19 | *call to data | bmqa.cpp:174:2:174:4 | setData output argument | provenance | MaD:107 | +| bmqa.cpp:176:2:176:4 | *msg | bmqa.cpp:176:14:176:17 | getData output argument | provenance | MaD:105 | +| bmqa.cpp:176:14:176:17 | getData output argument | bmqa.cpp:178:42:178:44 | *out | provenance | | +| bmqa.cpp:178:37:178:39 | copy output argument | bmqa.cpp:179:7:179:10 | * ... | provenance | | +| bmqa.cpp:178:42:178:44 | *out | bmqa.cpp:178:37:178:39 | copy output argument | provenance | MaD:102 | +| bmqa.cpp:183:19:183:26 | call to source | bmqa.cpp:184:36:184:76 | *call to data | provenance | TaintFunction | +| bmqa.cpp:184:36:184:76 | *call to data | bmqa.cpp:185:36:185:38 | *msg | provenance | | +| bmqa.cpp:185:36:185:38 | *msg | bmqa.cpp:185:41:185:45 | call to clone | provenance | MaD:104 | +| bmqa.cpp:185:41:185:45 | call to clone | bmqa.cpp:185:41:185:45 | call to clone | provenance | | +| bmqa.cpp:185:41:185:45 | call to clone | bmqa.cpp:187:2:187:5 | *copy | provenance | | +| bmqa.cpp:187:2:187:5 | *copy | bmqa.cpp:187:15:187:19 | getData output argument | provenance | MaD:105 | +| bmqa.cpp:187:15:187:19 | getData output argument | bmqa.cpp:189:42:189:45 | *blob | provenance | | +| bmqa.cpp:189:37:189:39 | copy output argument | bmqa.cpp:190:7:190:10 | * ... | provenance | | +| bmqa.cpp:189:42:189:45 | *blob | bmqa.cpp:189:37:189:39 | copy output argument | provenance | MaD:102 | +| bmqa.cpp:194:19:194:26 | call to source | bmqa.cpp:195:36:195:76 | *call to data | provenance | TaintFunction | +| bmqa.cpp:195:36:195:76 | *call to data | bmqa.cpp:197:2:197:4 | *msg | provenance | | +| bmqa.cpp:197:2:197:4 | *msg | bmqa.cpp:197:22:197:27 | loadProperties output argument | provenance | MaD:106 | +| bmqa.cpp:197:22:197:27 | loadProperties output argument | bmqa.cpp:198:29:198:33 | *props | provenance | | +| bmqa.cpp:198:29:198:33 | *props | bmqa.cpp:198:54:198:61 | *call to getPropertyAsString | provenance | MaD:116 | +| bmqa.cpp:198:54:198:61 | *call to getPropertyAsString | bmqa.cpp:198:54:198:61 | *call to getPropertyAsString | provenance | | +| bmqa.cpp:198:54:198:61 | *call to getPropertyAsString | bmqa.cpp:199:7:199:21 | access to array | provenance | TaintFunction | +| bmqa.cpp:203:19:203:26 | call to source | bmqa.cpp:204:36:204:76 | *call to data | provenance | TaintFunction | +| bmqa.cpp:204:36:204:76 | *call to data | bmqa.cpp:206:2:206:4 | *msg | provenance | | +| bmqa.cpp:206:2:206:4 | *msg | bmqa.cpp:206:22:206:27 | loadProperties output argument | provenance | MaD:106 | +| bmqa.cpp:206:22:206:27 | loadProperties output argument | bmqa.cpp:207:35:207:39 | *props | provenance | | +| bmqa.cpp:207:35:207:39 | *props | bmqa.cpp:207:60:207:67 | *call to getPropertyAsBinary [element] | provenance | MaD:113 | +| bmqa.cpp:207:60:207:67 | *call to getPropertyAsBinary [element] | bmqa.cpp:207:60:207:67 | *call to getPropertyAsBinary [element] | provenance | | +| bmqa.cpp:207:60:207:67 | *call to getPropertyAsBinary [element] | bmqa.cpp:208:7:208:11 | *value [element] | provenance | | +| bmqa.cpp:208:7:208:11 | *value [element] | bmqa.cpp:208:7:208:21 | access to array | provenance | MaD:155 | +| bmqa.cpp:212:19:212:26 | call to source | bmqa.cpp:213:36:213:76 | *call to data | provenance | TaintFunction | +| bmqa.cpp:213:36:213:76 | *call to data | bmqa.cpp:215:2:215:4 | *msg | provenance | | +| bmqa.cpp:215:2:215:4 | *msg | bmqa.cpp:215:22:215:27 | loadProperties output argument | provenance | MaD:106 | +| bmqa.cpp:215:22:215:27 | loadProperties output argument | bmqa.cpp:216:35:216:39 | *props | provenance | | +| bmqa.cpp:216:35:216:39 | *props | bmqa.cpp:216:60:216:67 | *call to getPropertyAsBinary [element] | provenance | MaD:113 | +| bmqa.cpp:216:60:216:67 | *call to getPropertyAsBinary [element] | bmqa.cpp:216:60:216:67 | *call to getPropertyAsBinary [element] | provenance | | +| bmqa.cpp:216:60:216:67 | *call to getPropertyAsBinary [element] | bmqa.cpp:217:7:217:11 | *value [element] | provenance | | +| bmqa.cpp:217:7:217:11 | *value [element] | bmqa.cpp:217:12:217:14 | call to operator[] | provenance | MaD:156 | +| bmqa.cpp:221:19:221:26 | call to source | bmqa.cpp:222:36:222:76 | *call to data | provenance | TaintFunction | +| bmqa.cpp:222:36:222:76 | *call to data | bmqa.cpp:224:2:224:4 | *msg | provenance | | +| bmqa.cpp:224:2:224:4 | *msg | bmqa.cpp:224:22:224:27 | loadProperties output argument | provenance | MaD:106 | +| bmqa.cpp:224:22:224:27 | loadProperties output argument | bmqa.cpp:226:29:226:33 | *props | provenance | | +| bmqa.cpp:226:29:226:33 | *props | bmqa.cpp:226:56:226:69 | *call to getPropertyAsStringOr | provenance | MaD:118 | +| bmqa.cpp:226:56:226:69 | *call to getPropertyAsStringOr | bmqa.cpp:226:56:226:69 | *call to getPropertyAsStringOr | provenance | | +| bmqa.cpp:226:56:226:69 | *call to getPropertyAsStringOr | bmqa.cpp:227:7:227:19 | * ... | provenance | TaintFunction | +| bmqa.cpp:232:19:232:26 | call to source | bmqa.cpp:234:64:234:67 | *dflt | provenance | TaintFunction | +| bmqa.cpp:234:56:234:69 | *call to getPropertyAsStringOr | bmqa.cpp:234:56:234:69 | *call to getPropertyAsStringOr | provenance | | +| bmqa.cpp:234:56:234:69 | *call to getPropertyAsStringOr | bmqa.cpp:235:7:235:19 | * ... | provenance | TaintFunction | +| bmqa.cpp:234:64:234:67 | *dflt | bmqa.cpp:234:56:234:69 | *call to getPropertyAsStringOr | provenance | MaD:117 | +| bmqa.cpp:239:19:239:26 | call to source | bmqa.cpp:240:36:240:76 | *call to data | provenance | TaintFunction | +| bmqa.cpp:240:36:240:76 | *call to data | bmqa.cpp:242:2:242:4 | *msg | provenance | | +| bmqa.cpp:242:2:242:4 | *msg | bmqa.cpp:242:22:242:27 | loadProperties output argument | provenance | MaD:106 | +| bmqa.cpp:242:22:242:27 | loadProperties output argument | bmqa.cpp:244:35:244:39 | *props | provenance | | +| bmqa.cpp:244:35:244:39 | *props | bmqa.cpp:244:62:244:75 | *call to getPropertyAsBinaryOr [element] | provenance | MaD:115 | +| bmqa.cpp:244:62:244:75 | *call to getPropertyAsBinaryOr [element] | bmqa.cpp:244:62:244:75 | *call to getPropertyAsBinaryOr [element] | provenance | | +| bmqa.cpp:244:62:244:75 | *call to getPropertyAsBinaryOr [element] | bmqa.cpp:245:8:245:12 | *value [element] | provenance | | +| bmqa.cpp:245:8:245:12 | *value [element] | bmqa.cpp:245:7:245:19 | * ... | provenance | MaD:155 | +| bmqa.cpp:249:11:249:19 | * ... | bmqa.cpp:251:17:251:17 | *c | provenance | | +| bmqa.cpp:249:12:249:17 | call to source | bmqa.cpp:249:11:249:19 | * ... | provenance | | +| bmqa.cpp:251:2:251:5 | push_back output argument [element] | bmqa.cpp:253:70:253:73 | *dflt [element] | provenance | | +| bmqa.cpp:251:17:251:17 | *c | bmqa.cpp:251:2:251:5 | push_back output argument [element] | provenance | MaD:157 | +| bmqa.cpp:253:62:253:75 | *call to getPropertyAsBinaryOr [element] | bmqa.cpp:253:62:253:75 | *call to getPropertyAsBinaryOr [element] | provenance | | +| bmqa.cpp:253:62:253:75 | *call to getPropertyAsBinaryOr [element] | bmqa.cpp:254:8:254:12 | *value [element] | provenance | | +| bmqa.cpp:253:70:253:73 | *dflt [element] | bmqa.cpp:253:62:253:75 | *call to getPropertyAsBinaryOr [element] | provenance | MaD:114 | +| bmqa.cpp:254:8:254:12 | *value [element] | bmqa.cpp:254:7:254:19 | * ... | provenance | MaD:155 | +| bmqa.cpp:266:16:266:23 | call to source | bmqa.cpp:268:49:268:52 | *call to data | provenance | TaintFunction | +| bmqa.cpp:268:37:268:41 | copy output argument | bmqa.cpp:270:17:270:20 | *blob | provenance | | +| bmqa.cpp:268:49:268:52 | *call to data | bmqa.cpp:268:37:268:41 | copy output argument | provenance | MaD:101 | +| bmqa.cpp:270:2:270:6 | streamIn output argument | bmqa.cpp:271:8:271:12 | *props | provenance | | +| bmqa.cpp:270:17:270:20 | *blob | bmqa.cpp:270:2:270:6 | streamIn output argument | provenance | MaD:130 | +| bmqa.cpp:271:8:271:12 | *props | bmqa.cpp:271:33:271:40 | *call to getPropertyAsString | provenance | MaD:116 | +| bmqa.cpp:271:33:271:40 | *call to getPropertyAsString | bmqa.cpp:271:7:271:46 | * ... | provenance | TaintFunction | +| bmqa.cpp:275:16:275:23 | call to source | bmqa.cpp:277:49:277:52 | *call to data | provenance | TaintFunction | +| bmqa.cpp:277:37:277:41 | copy output argument | bmqa.cpp:279:14:279:17 | *blob | provenance | | +| bmqa.cpp:277:49:277:52 | *call to data | bmqa.cpp:277:37:277:41 | copy output argument | provenance | MaD:101 | +| bmqa.cpp:279:2:279:3 | streamIn output argument | bmqa.cpp:281:23:281:25 | *& ... | provenance | | +| bmqa.cpp:279:14:279:17 | *blob | bmqa.cpp:279:2:279:3 | streamIn output argument | provenance | MaD:130 | +| bmqa.cpp:281:2:281:4 | setPropertiesRef output argument | bmqa.cpp:283:2:283:4 | *msg | provenance | | +| bmqa.cpp:281:23:281:25 | *& ... | bmqa.cpp:281:2:281:4 | setPropertiesRef output argument | provenance | MaD:109 | +| bmqa.cpp:283:2:283:4 | *msg | bmqa.cpp:283:21:283:24 | loadProperties output argument | provenance | MaD:106 | +| bmqa.cpp:283:21:283:24 | loadProperties output argument | bmqa.cpp:284:8:284:10 | *out | provenance | | +| bmqa.cpp:284:8:284:10 | *out | bmqa.cpp:284:31:284:38 | *call to getPropertyAsString | provenance | MaD:116 | +| bmqa.cpp:284:31:284:38 | *call to getPropertyAsString | bmqa.cpp:284:7:284:44 | * ... | provenance | TaintFunction | +| bmqa.cpp:288:19:288:26 | call to source | bmqa.cpp:289:36:289:76 | *call to data | provenance | TaintFunction | +| bmqa.cpp:289:36:289:76 | *call to data | bmqa.cpp:291:2:291:4 | *msg | provenance | | +| bmqa.cpp:291:2:291:4 | *msg | bmqa.cpp:291:22:291:27 | loadProperties output argument | provenance | MaD:106 | +| bmqa.cpp:291:22:291:27 | loadProperties output argument | bmqa.cpp:293:41:293:45 | *props | provenance | | +| bmqa.cpp:293:41:293:45 | *props | bmqa.cpp:293:56:293:66 | *call to streamOut | provenance | MaD:131 | +| bmqa.cpp:293:56:293:66 | *call to streamOut | bmqa.cpp:293:56:293:66 | *call to streamOut | provenance | | +| bmqa.cpp:293:56:293:66 | *call to streamOut | bmqa.cpp:295:42:295:45 | *blob | provenance | | +| bmqa.cpp:295:37:295:39 | copy output argument | bmqa.cpp:296:7:296:10 | * ... | provenance | | +| bmqa.cpp:295:42:295:45 | *blob | bmqa.cpp:295:37:295:39 | copy output argument | provenance | MaD:102 | +| bmqa.cpp:300:19:300:26 | call to source | bmqa.cpp:301:36:301:76 | *call to data | provenance | TaintFunction | +| bmqa.cpp:301:36:301:76 | *call to data | bmqa.cpp:303:2:303:4 | *msg | provenance | | +| bmqa.cpp:303:2:303:4 | *msg | bmqa.cpp:303:22:303:27 | loadProperties output argument | provenance | MaD:106 | +| bmqa.cpp:303:22:303:27 | loadProperties output argument | bmqa.cpp:304:44:304:48 | *props | provenance | | +| bmqa.cpp:303:22:303:27 | loadProperties output argument | bmqa.cpp:305:8:305:11 | *copy | provenance | DataFlowFunction | +| bmqa.cpp:303:22:303:27 | loadProperties output argument | bmqa.cpp:305:8:305:11 | *copy | provenance | TaintFunction | +| bmqa.cpp:304:39:304:42 | call to MessageProperties | bmqa.cpp:305:8:305:11 | *copy | provenance | | +| bmqa.cpp:304:44:304:48 | *props | bmqa.cpp:304:39:304:42 | call to MessageProperties | provenance | MaD:112 | +| bmqa.cpp:305:8:305:11 | *copy | bmqa.cpp:305:32:305:39 | *call to getPropertyAsString | provenance | MaD:116 | +| bmqa.cpp:305:32:305:39 | *call to getPropertyAsString | bmqa.cpp:305:7:305:45 | * ... | provenance | TaintFunction | +| bmqa.cpp:309:19:309:26 | call to source | bmqa.cpp:310:36:310:76 | *call to data | provenance | TaintFunction | +| bmqa.cpp:310:36:310:76 | *call to data | bmqa.cpp:312:2:312:4 | *msg | provenance | | +| bmqa.cpp:312:2:312:4 | *msg | bmqa.cpp:312:22:312:27 | loadProperties output argument | provenance | MaD:106 | +| bmqa.cpp:312:22:312:27 | loadProperties output argument | bmqa.cpp:314:9:314:13 | *props | provenance | | +| bmqa.cpp:312:22:312:27 | loadProperties output argument | bmqa.cpp:315:8:315:11 | *copy | provenance | TaintFunction | +| bmqa.cpp:314:2:314:5 | operator= output argument | bmqa.cpp:315:8:315:11 | *copy | provenance | | +| bmqa.cpp:314:9:314:13 | *props | bmqa.cpp:314:2:314:5 | operator= output argument | provenance | MaD:119 | +| bmqa.cpp:315:8:315:11 | *copy | bmqa.cpp:315:32:315:39 | *call to getPropertyAsString | provenance | MaD:116 | +| bmqa.cpp:315:32:315:39 | *call to getPropertyAsString | bmqa.cpp:315:7:315:45 | * ... | provenance | TaintFunction | +| bmqa.cpp:319:19:319:26 | call to source | bmqa.cpp:320:36:320:76 | *call to data | provenance | TaintFunction | +| bmqa.cpp:320:36:320:76 | *call to data | bmqa.cpp:322:2:322:4 | *msg | provenance | | +| bmqa.cpp:322:2:322:4 | *msg | bmqa.cpp:322:22:322:27 | loadProperties output argument | provenance | MaD:106 | +| bmqa.cpp:322:22:322:27 | loadProperties output argument | bmqa.cpp:324:8:324:21 | *call to operator= | provenance | TaintFunction | +| bmqa.cpp:322:22:322:27 | loadProperties output argument | bmqa.cpp:324:16:324:20 | *props | provenance | | +| bmqa.cpp:324:8:324:21 | *call to operator= | bmqa.cpp:324:42:324:49 | *call to getPropertyAsString | provenance | MaD:116 | +| bmqa.cpp:324:16:324:20 | *props | bmqa.cpp:324:8:324:21 | *call to operator= | provenance | MaD:120 | +| bmqa.cpp:324:42:324:49 | *call to getPropertyAsString | bmqa.cpp:324:7:324:55 | * ... | provenance | TaintFunction | +| bmqa.cpp:328:19:328:26 | call to source | bmqa.cpp:329:28:329:58 | *call to data | provenance | TaintFunction | +| bmqa.cpp:329:28:329:58 | *call to data | bmqa.cpp:331:35:331:40 | * ... | provenance | | +| bmqa.cpp:331:2:331:6 | setPropertyAsString output argument | bmqa.cpp:332:8:332:12 | *props | provenance | | +| bmqa.cpp:331:35:331:40 | * ... | bmqa.cpp:331:2:331:6 | setPropertyAsString output argument | provenance | MaD:129 | +| bmqa.cpp:332:8:332:12 | *props | bmqa.cpp:332:33:332:40 | *call to getPropertyAsString | provenance | MaD:116 | +| bmqa.cpp:332:33:332:40 | *call to getPropertyAsString | bmqa.cpp:332:7:332:46 | * ... | provenance | TaintFunction | +| bmqa.cpp:336:25:336:32 | call to source | bmqa.cpp:338:35:338:39 | value | provenance | TaintFunction | +| bmqa.cpp:338:2:338:6 | setPropertyAsString output argument | bmqa.cpp:339:8:339:12 | *props | provenance | | +| bmqa.cpp:338:35:338:39 | value | bmqa.cpp:338:2:338:6 | setPropertyAsString output argument | provenance | MaD:129 | +| bmqa.cpp:339:8:339:12 | *props | bmqa.cpp:339:33:339:40 | *call to getPropertyAsString | provenance | MaD:116 | +| bmqa.cpp:339:33:339:40 | *call to getPropertyAsString | bmqa.cpp:339:7:339:46 | * ... | provenance | TaintFunction | +| bmqa.cpp:343:19:343:26 | call to source | bmqa.cpp:344:33:344:68 | *call to data | provenance | TaintFunction | +| bmqa.cpp:344:33:344:68 | *call to data | bmqa.cpp:346:35:346:40 | * ... | provenance | | +| bmqa.cpp:346:2:346:6 | setPropertyAsBinary output argument | bmqa.cpp:347:8:347:12 | *props | provenance | | +| bmqa.cpp:346:35:346:40 | * ... | bmqa.cpp:346:2:346:6 | setPropertyAsBinary output argument | provenance | MaD:122 | +| bmqa.cpp:347:8:347:12 | *props | bmqa.cpp:347:33:347:40 | *call to getPropertyAsBinary [element] | provenance | MaD:113 | +| bmqa.cpp:347:33:347:40 | *call to getPropertyAsBinary [element] | bmqa.cpp:347:7:347:46 | * ... | provenance | MaD:155 | +| bmqa.cpp:352:24:352:31 | call to source | bmqa.cpp:354:26:354:29 | name | provenance | TaintFunction | +| bmqa.cpp:354:2:354:6 | setPropertyAsBool output argument | bmqa.cpp:355:50:355:55 | *& ... | provenance | | +| bmqa.cpp:354:26:354:29 | name | bmqa.cpp:354:2:354:6 | setPropertyAsBool output argument | provenance | MaD:123 | +| bmqa.cpp:355:47:355:48 | call to MessagePropertiesIterator | bmqa.cpp:356:8:356:9 | *it | provenance | | +| bmqa.cpp:355:50:355:55 | *& ... | bmqa.cpp:355:47:355:48 | call to MessagePropertiesIterator | provenance | MaD:132 | +| bmqa.cpp:356:8:356:9 | *it | bmqa.cpp:356:15:356:17 | *call to name | provenance | MaD:135 | +| bmqa.cpp:356:15:356:17 | *call to name | bmqa.cpp:356:7:356:23 | * ... | provenance | TaintFunction | +| bmqa.cpp:360:24:360:31 | call to source | bmqa.cpp:362:26:362:29 | name | provenance | TaintFunction | +| bmqa.cpp:362:2:362:6 | setPropertyAsChar output argument | bmqa.cpp:363:50:363:55 | *& ... | provenance | | +| bmqa.cpp:362:26:362:29 | name | bmqa.cpp:362:2:362:6 | setPropertyAsChar output argument | provenance | MaD:124 | +| bmqa.cpp:363:47:363:48 | call to MessagePropertiesIterator | bmqa.cpp:364:8:364:9 | *it | provenance | | +| bmqa.cpp:363:50:363:55 | *& ... | bmqa.cpp:363:47:363:48 | call to MessagePropertiesIterator | provenance | MaD:132 | +| bmqa.cpp:364:8:364:9 | *it | bmqa.cpp:364:15:364:17 | *call to name | provenance | MaD:135 | +| bmqa.cpp:364:15:364:17 | *call to name | bmqa.cpp:364:7:364:23 | * ... | provenance | TaintFunction | +| bmqa.cpp:368:24:368:31 | call to source | bmqa.cpp:370:27:370:30 | name | provenance | TaintFunction | +| bmqa.cpp:370:2:370:6 | setPropertyAsShort output argument | bmqa.cpp:371:50:371:55 | *& ... | provenance | | +| bmqa.cpp:370:27:370:30 | name | bmqa.cpp:370:2:370:6 | setPropertyAsShort output argument | provenance | MaD:127 | +| bmqa.cpp:371:47:371:48 | call to MessagePropertiesIterator | bmqa.cpp:372:8:372:9 | *it | provenance | | +| bmqa.cpp:371:50:371:55 | *& ... | bmqa.cpp:371:47:371:48 | call to MessagePropertiesIterator | provenance | MaD:132 | +| bmqa.cpp:372:8:372:9 | *it | bmqa.cpp:372:15:372:17 | *call to name | provenance | MaD:135 | +| bmqa.cpp:372:15:372:17 | *call to name | bmqa.cpp:372:7:372:23 | * ... | provenance | TaintFunction | +| bmqa.cpp:376:24:376:31 | call to source | bmqa.cpp:378:27:378:30 | name | provenance | TaintFunction | +| bmqa.cpp:378:2:378:6 | setPropertyAsInt32 output argument | bmqa.cpp:379:50:379:55 | *& ... | provenance | | +| bmqa.cpp:378:27:378:30 | name | bmqa.cpp:378:2:378:6 | setPropertyAsInt32 output argument | provenance | MaD:125 | +| bmqa.cpp:379:47:379:48 | call to MessagePropertiesIterator | bmqa.cpp:380:8:380:9 | *it | provenance | | +| bmqa.cpp:379:50:379:55 | *& ... | bmqa.cpp:379:47:379:48 | call to MessagePropertiesIterator | provenance | MaD:132 | +| bmqa.cpp:380:8:380:9 | *it | bmqa.cpp:380:15:380:17 | *call to name | provenance | MaD:135 | +| bmqa.cpp:380:15:380:17 | *call to name | bmqa.cpp:380:7:380:23 | * ... | provenance | TaintFunction | +| bmqa.cpp:384:24:384:31 | call to source | bmqa.cpp:386:27:386:30 | name | provenance | TaintFunction | +| bmqa.cpp:386:2:386:6 | setPropertyAsInt64 output argument | bmqa.cpp:387:50:387:55 | *& ... | provenance | | +| bmqa.cpp:386:27:386:30 | name | bmqa.cpp:386:2:386:6 | setPropertyAsInt64 output argument | provenance | MaD:126 | +| bmqa.cpp:387:47:387:48 | call to MessagePropertiesIterator | bmqa.cpp:388:8:388:9 | *it | provenance | | +| bmqa.cpp:387:50:387:55 | *& ... | bmqa.cpp:387:47:387:48 | call to MessagePropertiesIterator | provenance | MaD:132 | +| bmqa.cpp:388:8:388:9 | *it | bmqa.cpp:388:15:388:17 | *call to name | provenance | MaD:135 | +| bmqa.cpp:388:15:388:17 | *call to name | bmqa.cpp:388:7:388:23 | * ... | provenance | TaintFunction | +| bmqa.cpp:392:24:392:31 | call to source | bmqa.cpp:394:28:394:31 | name | provenance | TaintFunction | +| bmqa.cpp:394:2:394:6 | setPropertyAsString output argument | bmqa.cpp:395:50:395:55 | *& ... | provenance | | +| bmqa.cpp:394:28:394:31 | name | bmqa.cpp:394:2:394:6 | setPropertyAsString output argument | provenance | MaD:128 | +| bmqa.cpp:395:47:395:48 | call to MessagePropertiesIterator | bmqa.cpp:396:8:396:9 | *it | provenance | | +| bmqa.cpp:395:50:395:55 | *& ... | bmqa.cpp:395:47:395:48 | call to MessagePropertiesIterator | provenance | MaD:132 | +| bmqa.cpp:396:8:396:9 | *it | bmqa.cpp:396:15:396:17 | *call to name | provenance | MaD:135 | +| bmqa.cpp:396:15:396:17 | *call to name | bmqa.cpp:396:7:396:23 | * ... | provenance | TaintFunction | +| bmqa.cpp:400:24:400:31 | call to source | bmqa.cpp:402:28:402:31 | name | provenance | TaintFunction | +| bmqa.cpp:402:2:402:6 | setPropertyAsBinary output argument | bmqa.cpp:403:50:403:55 | *& ... | provenance | | +| bmqa.cpp:402:28:402:31 | name | bmqa.cpp:402:2:402:6 | setPropertyAsBinary output argument | provenance | MaD:121 | +| bmqa.cpp:403:47:403:48 | call to MessagePropertiesIterator | bmqa.cpp:404:8:404:9 | *it | provenance | | +| bmqa.cpp:403:50:403:55 | *& ... | bmqa.cpp:403:47:403:48 | call to MessagePropertiesIterator | provenance | MaD:132 | +| bmqa.cpp:404:8:404:9 | *it | bmqa.cpp:404:15:404:17 | *call to name | provenance | MaD:135 | +| bmqa.cpp:404:15:404:17 | *call to name | bmqa.cpp:404:7:404:23 | * ... | provenance | TaintFunction | +| bmqa.cpp:408:19:408:26 | call to source | bmqa.cpp:409:36:409:76 | *call to data | provenance | TaintFunction | +| bmqa.cpp:409:36:409:76 | *call to data | bmqa.cpp:411:2:411:4 | *msg | provenance | | +| bmqa.cpp:411:2:411:4 | *msg | bmqa.cpp:411:22:411:27 | loadProperties output argument | provenance | MaD:106 | +| bmqa.cpp:411:22:411:27 | loadProperties output argument | bmqa.cpp:412:50:412:55 | *& ... | provenance | | +| bmqa.cpp:412:47:412:48 | call to MessagePropertiesIterator | bmqa.cpp:414:9:414:10 | *it | provenance | | +| bmqa.cpp:412:47:412:48 | call to MessagePropertiesIterator | bmqa.cpp:415:9:415:10 | *it | provenance | | +| bmqa.cpp:412:47:412:48 | call to MessagePropertiesIterator | bmqa.cpp:416:9:416:10 | *it | provenance | | +| bmqa.cpp:412:50:412:55 | *& ... | bmqa.cpp:412:47:412:48 | call to MessagePropertiesIterator | provenance | MaD:132 | +| bmqa.cpp:414:9:414:10 | *it | bmqa.cpp:414:16:414:18 | *call to name | provenance | MaD:135 | +| bmqa.cpp:414:16:414:18 | *call to name | bmqa.cpp:414:8:414:24 | * ... | provenance | TaintFunction | +| bmqa.cpp:415:9:415:10 | *it | bmqa.cpp:415:23:415:25 | *call to getAsString | provenance | MaD:134 | +| bmqa.cpp:415:23:415:25 | *call to getAsString | bmqa.cpp:415:8:415:31 | * ... | provenance | TaintFunction | +| bmqa.cpp:416:9:416:10 | *it | bmqa.cpp:416:23:416:25 | *call to getAsBinary [element] | provenance | MaD:133 | +| bmqa.cpp:416:23:416:25 | *call to getAsBinary [element] | bmqa.cpp:416:8:416:31 | * ... | provenance | MaD:155 | +| bmqa.cpp:422:19:422:26 | call to source | bmqa.cpp:423:36:423:76 | *call to data | provenance | TaintFunction | +| bmqa.cpp:423:36:423:76 | *call to data | bmqa.cpp:425:2:425:4 | *msg | provenance | | +| bmqa.cpp:425:2:425:4 | *msg | bmqa.cpp:425:22:425:27 | loadProperties output argument | provenance | MaD:106 | +| bmqa.cpp:425:22:425:27 | loadProperties output argument | bmqa.cpp:426:50:426:55 | *& ... | provenance | | +| bmqa.cpp:426:47:426:48 | call to MessagePropertiesIterator | bmqa.cpp:428:9:428:10 | *it | provenance | | +| bmqa.cpp:426:47:426:48 | call to MessagePropertiesIterator | bmqa.cpp:429:8:429:11 | *copy | provenance | TaintFunction | +| bmqa.cpp:426:47:426:48 | call to MessagePropertiesIterator | bmqa.cpp:430:8:430:18 | *call to operator= | provenance | TaintFunction | +| bmqa.cpp:426:47:426:48 | call to MessagePropertiesIterator | bmqa.cpp:430:16:430:17 | *it | provenance | | +| bmqa.cpp:426:50:426:55 | *& ... | bmqa.cpp:426:47:426:48 | call to MessagePropertiesIterator | provenance | MaD:132 | +| bmqa.cpp:428:2:428:5 | operator= output argument | bmqa.cpp:429:8:429:11 | *copy | provenance | | +| bmqa.cpp:428:9:428:10 | *it | bmqa.cpp:428:2:428:5 | operator= output argument | provenance | MaD:136 | +| bmqa.cpp:429:8:429:11 | *copy | bmqa.cpp:429:24:429:26 | *call to getAsString | provenance | MaD:134 | +| bmqa.cpp:429:24:429:26 | *call to getAsString | bmqa.cpp:429:7:429:32 | * ... | provenance | TaintFunction | +| bmqa.cpp:430:8:430:18 | *call to operator= | bmqa.cpp:430:24:430:26 | *call to name | provenance | MaD:135 | +| bmqa.cpp:430:16:430:17 | *it | bmqa.cpp:430:8:430:18 | *call to operator= | provenance | MaD:137 | +| bmqa.cpp:430:24:430:26 | *call to name | bmqa.cpp:430:7:430:32 | * ... | provenance | TaintFunction | | test.cpp:7:47:7:52 | value2 | test.cpp:7:64:7:69 | value2 | provenance | | | test.cpp:7:64:7:69 | value2 | test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | provenance | | | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:10:10:10:18 | call to ymlSource | provenance | Src:MaD:48 | @@ -765,6 +1052,281 @@ nodes | bdlbb.cpp:96:37:96:39 | copy output argument | semmle.label | copy output argument | | bdlbb.cpp:96:42:96:44 | *dst | semmle.label | *dst | | bdlbb.cpp:97:7:97:10 | * ... | semmle.label | * ... | +| bmqa.cpp:124:19:124:26 | call to source | semmle.label | call to source | +| bmqa.cpp:125:36:125:76 | *call to data | semmle.label | *call to data | +| bmqa.cpp:127:2:127:4 | *msg | semmle.label | *msg | +| bmqa.cpp:127:15:127:19 | getData output argument | semmle.label | getData output argument | +| bmqa.cpp:129:37:129:39 | copy output argument | semmle.label | copy output argument | +| bmqa.cpp:129:42:129:45 | *blob | semmle.label | *blob | +| bmqa.cpp:130:7:130:10 | * ... | semmle.label | * ... | +| bmqa.cpp:134:19:134:26 | call to source | semmle.label | call to source | +| bmqa.cpp:135:43:135:88 | *call to data | semmle.label | *call to data | +| bmqa.cpp:136:42:136:46 | *event | semmle.label | *event | +| bmqa.cpp:136:49:136:63 | call to messageIterator | semmle.label | call to messageIterator | +| bmqa.cpp:136:49:136:63 | call to messageIterator | semmle.label | call to messageIterator | +| bmqa.cpp:138:43:138:44 | *it | semmle.label | *it | +| bmqa.cpp:138:53:138:55 | *call to message | semmle.label | *call to message | +| bmqa.cpp:138:53:138:55 | *call to message | semmle.label | *call to message | +| bmqa.cpp:140:3:140:5 | *msg | semmle.label | *msg | +| bmqa.cpp:140:15:140:19 | getData output argument | semmle.label | getData output argument | +| bmqa.cpp:142:38:142:40 | copy output argument | semmle.label | copy output argument | +| bmqa.cpp:142:43:142:46 | *blob | semmle.label | *blob | +| bmqa.cpp:143:8:143:11 | * ... | semmle.label | * ... | +| bmqa.cpp:148:16:148:23 | call to source | semmle.label | call to source | +| bmqa.cpp:150:37:150:39 | copy output argument | semmle.label | copy output argument | +| bmqa.cpp:150:47:150:50 | *call to data | semmle.label | *call to data | +| bmqa.cpp:152:2:152:4 | setDataRef output argument | semmle.label | setDataRef output argument | +| bmqa.cpp:152:17:152:19 | *& ... | semmle.label | *& ... | +| bmqa.cpp:154:2:154:4 | *msg | semmle.label | *msg | +| bmqa.cpp:154:14:154:17 | getData output argument | semmle.label | getData output argument | +| bmqa.cpp:156:37:156:39 | copy output argument | semmle.label | copy output argument | +| bmqa.cpp:156:42:156:44 | *out | semmle.label | *out | +| bmqa.cpp:157:7:157:10 | * ... | semmle.label | * ... | +| bmqa.cpp:161:16:161:23 | call to source | semmle.label | call to source | +| bmqa.cpp:163:2:163:4 | setDataRef output argument | semmle.label | setDataRef output argument | +| bmqa.cpp:163:19:163:22 | *call to data | semmle.label | *call to data | +| bmqa.cpp:165:2:165:4 | *msg | semmle.label | *msg | +| bmqa.cpp:165:14:165:17 | getData output argument | semmle.label | getData output argument | +| bmqa.cpp:167:37:167:39 | copy output argument | semmle.label | copy output argument | +| bmqa.cpp:167:42:167:44 | *out | semmle.label | *out | +| bmqa.cpp:168:7:168:10 | * ... | semmle.label | * ... | +| bmqa.cpp:172:16:172:23 | call to source | semmle.label | call to source | +| bmqa.cpp:174:2:174:4 | setData output argument | semmle.label | setData output argument | +| bmqa.cpp:174:16:174:19 | *call to data | semmle.label | *call to data | +| bmqa.cpp:176:2:176:4 | *msg | semmle.label | *msg | +| bmqa.cpp:176:14:176:17 | getData output argument | semmle.label | getData output argument | +| bmqa.cpp:178:37:178:39 | copy output argument | semmle.label | copy output argument | +| bmqa.cpp:178:42:178:44 | *out | semmle.label | *out | +| bmqa.cpp:179:7:179:10 | * ... | semmle.label | * ... | +| bmqa.cpp:183:19:183:26 | call to source | semmle.label | call to source | +| bmqa.cpp:184:36:184:76 | *call to data | semmle.label | *call to data | +| bmqa.cpp:185:36:185:38 | *msg | semmle.label | *msg | +| bmqa.cpp:185:41:185:45 | call to clone | semmle.label | call to clone | +| bmqa.cpp:185:41:185:45 | call to clone | semmle.label | call to clone | +| bmqa.cpp:187:2:187:5 | *copy | semmle.label | *copy | +| bmqa.cpp:187:15:187:19 | getData output argument | semmle.label | getData output argument | +| bmqa.cpp:189:37:189:39 | copy output argument | semmle.label | copy output argument | +| bmqa.cpp:189:42:189:45 | *blob | semmle.label | *blob | +| bmqa.cpp:190:7:190:10 | * ... | semmle.label | * ... | +| bmqa.cpp:194:19:194:26 | call to source | semmle.label | call to source | +| bmqa.cpp:195:36:195:76 | *call to data | semmle.label | *call to data | +| bmqa.cpp:197:2:197:4 | *msg | semmle.label | *msg | +| bmqa.cpp:197:22:197:27 | loadProperties output argument | semmle.label | loadProperties output argument | +| bmqa.cpp:198:29:198:33 | *props | semmle.label | *props | +| bmqa.cpp:198:54:198:61 | *call to getPropertyAsString | semmle.label | *call to getPropertyAsString | +| bmqa.cpp:198:54:198:61 | *call to getPropertyAsString | semmle.label | *call to getPropertyAsString | +| bmqa.cpp:199:7:199:21 | access to array | semmle.label | access to array | +| bmqa.cpp:203:19:203:26 | call to source | semmle.label | call to source | +| bmqa.cpp:204:36:204:76 | *call to data | semmle.label | *call to data | +| bmqa.cpp:206:2:206:4 | *msg | semmle.label | *msg | +| bmqa.cpp:206:22:206:27 | loadProperties output argument | semmle.label | loadProperties output argument | +| bmqa.cpp:207:35:207:39 | *props | semmle.label | *props | +| bmqa.cpp:207:60:207:67 | *call to getPropertyAsBinary [element] | semmle.label | *call to getPropertyAsBinary [element] | +| bmqa.cpp:207:60:207:67 | *call to getPropertyAsBinary [element] | semmle.label | *call to getPropertyAsBinary [element] | +| bmqa.cpp:208:7:208:11 | *value [element] | semmle.label | *value [element] | +| bmqa.cpp:208:7:208:21 | access to array | semmle.label | access to array | +| bmqa.cpp:212:19:212:26 | call to source | semmle.label | call to source | +| bmqa.cpp:213:36:213:76 | *call to data | semmle.label | *call to data | +| bmqa.cpp:215:2:215:4 | *msg | semmle.label | *msg | +| bmqa.cpp:215:22:215:27 | loadProperties output argument | semmle.label | loadProperties output argument | +| bmqa.cpp:216:35:216:39 | *props | semmle.label | *props | +| bmqa.cpp:216:60:216:67 | *call to getPropertyAsBinary [element] | semmle.label | *call to getPropertyAsBinary [element] | +| bmqa.cpp:216:60:216:67 | *call to getPropertyAsBinary [element] | semmle.label | *call to getPropertyAsBinary [element] | +| bmqa.cpp:217:7:217:11 | *value [element] | semmle.label | *value [element] | +| bmqa.cpp:217:12:217:14 | call to operator[] | semmle.label | call to operator[] | +| bmqa.cpp:221:19:221:26 | call to source | semmle.label | call to source | +| bmqa.cpp:222:36:222:76 | *call to data | semmle.label | *call to data | +| bmqa.cpp:224:2:224:4 | *msg | semmle.label | *msg | +| bmqa.cpp:224:22:224:27 | loadProperties output argument | semmle.label | loadProperties output argument | +| bmqa.cpp:226:29:226:33 | *props | semmle.label | *props | +| bmqa.cpp:226:56:226:69 | *call to getPropertyAsStringOr | semmle.label | *call to getPropertyAsStringOr | +| bmqa.cpp:226:56:226:69 | *call to getPropertyAsStringOr | semmle.label | *call to getPropertyAsStringOr | +| bmqa.cpp:227:7:227:19 | * ... | semmle.label | * ... | +| bmqa.cpp:232:19:232:26 | call to source | semmle.label | call to source | +| bmqa.cpp:234:56:234:69 | *call to getPropertyAsStringOr | semmle.label | *call to getPropertyAsStringOr | +| bmqa.cpp:234:56:234:69 | *call to getPropertyAsStringOr | semmle.label | *call to getPropertyAsStringOr | +| bmqa.cpp:234:64:234:67 | *dflt | semmle.label | *dflt | +| bmqa.cpp:235:7:235:19 | * ... | semmle.label | * ... | +| bmqa.cpp:239:19:239:26 | call to source | semmle.label | call to source | +| bmqa.cpp:240:36:240:76 | *call to data | semmle.label | *call to data | +| bmqa.cpp:242:2:242:4 | *msg | semmle.label | *msg | +| bmqa.cpp:242:22:242:27 | loadProperties output argument | semmle.label | loadProperties output argument | +| bmqa.cpp:244:35:244:39 | *props | semmle.label | *props | +| bmqa.cpp:244:62:244:75 | *call to getPropertyAsBinaryOr [element] | semmle.label | *call to getPropertyAsBinaryOr [element] | +| bmqa.cpp:244:62:244:75 | *call to getPropertyAsBinaryOr [element] | semmle.label | *call to getPropertyAsBinaryOr [element] | +| bmqa.cpp:245:7:245:19 | * ... | semmle.label | * ... | +| bmqa.cpp:245:8:245:12 | *value [element] | semmle.label | *value [element] | +| bmqa.cpp:249:11:249:19 | * ... | semmle.label | * ... | +| bmqa.cpp:249:12:249:17 | call to source | semmle.label | call to source | +| bmqa.cpp:251:2:251:5 | push_back output argument [element] | semmle.label | push_back output argument [element] | +| bmqa.cpp:251:17:251:17 | *c | semmle.label | *c | +| bmqa.cpp:253:62:253:75 | *call to getPropertyAsBinaryOr [element] | semmle.label | *call to getPropertyAsBinaryOr [element] | +| bmqa.cpp:253:62:253:75 | *call to getPropertyAsBinaryOr [element] | semmle.label | *call to getPropertyAsBinaryOr [element] | +| bmqa.cpp:253:70:253:73 | *dflt [element] | semmle.label | *dflt [element] | +| bmqa.cpp:254:7:254:19 | * ... | semmle.label | * ... | +| bmqa.cpp:254:8:254:12 | *value [element] | semmle.label | *value [element] | +| bmqa.cpp:266:16:266:23 | call to source | semmle.label | call to source | +| bmqa.cpp:268:37:268:41 | copy output argument | semmle.label | copy output argument | +| bmqa.cpp:268:49:268:52 | *call to data | semmle.label | *call to data | +| bmqa.cpp:270:2:270:6 | streamIn output argument | semmle.label | streamIn output argument | +| bmqa.cpp:270:17:270:20 | *blob | semmle.label | *blob | +| bmqa.cpp:271:7:271:46 | * ... | semmle.label | * ... | +| bmqa.cpp:271:8:271:12 | *props | semmle.label | *props | +| bmqa.cpp:271:33:271:40 | *call to getPropertyAsString | semmle.label | *call to getPropertyAsString | +| bmqa.cpp:275:16:275:23 | call to source | semmle.label | call to source | +| bmqa.cpp:277:37:277:41 | copy output argument | semmle.label | copy output argument | +| bmqa.cpp:277:49:277:52 | *call to data | semmle.label | *call to data | +| bmqa.cpp:279:2:279:3 | streamIn output argument | semmle.label | streamIn output argument | +| bmqa.cpp:279:14:279:17 | *blob | semmle.label | *blob | +| bmqa.cpp:281:2:281:4 | setPropertiesRef output argument | semmle.label | setPropertiesRef output argument | +| bmqa.cpp:281:23:281:25 | *& ... | semmle.label | *& ... | +| bmqa.cpp:283:2:283:4 | *msg | semmle.label | *msg | +| bmqa.cpp:283:21:283:24 | loadProperties output argument | semmle.label | loadProperties output argument | +| bmqa.cpp:284:7:284:44 | * ... | semmle.label | * ... | +| bmqa.cpp:284:8:284:10 | *out | semmle.label | *out | +| bmqa.cpp:284:31:284:38 | *call to getPropertyAsString | semmle.label | *call to getPropertyAsString | +| bmqa.cpp:288:19:288:26 | call to source | semmle.label | call to source | +| bmqa.cpp:289:36:289:76 | *call to data | semmle.label | *call to data | +| bmqa.cpp:291:2:291:4 | *msg | semmle.label | *msg | +| bmqa.cpp:291:22:291:27 | loadProperties output argument | semmle.label | loadProperties output argument | +| bmqa.cpp:293:41:293:45 | *props | semmle.label | *props | +| bmqa.cpp:293:56:293:66 | *call to streamOut | semmle.label | *call to streamOut | +| bmqa.cpp:293:56:293:66 | *call to streamOut | semmle.label | *call to streamOut | +| bmqa.cpp:295:37:295:39 | copy output argument | semmle.label | copy output argument | +| bmqa.cpp:295:42:295:45 | *blob | semmle.label | *blob | +| bmqa.cpp:296:7:296:10 | * ... | semmle.label | * ... | +| bmqa.cpp:300:19:300:26 | call to source | semmle.label | call to source | +| bmqa.cpp:301:36:301:76 | *call to data | semmle.label | *call to data | +| bmqa.cpp:303:2:303:4 | *msg | semmle.label | *msg | +| bmqa.cpp:303:22:303:27 | loadProperties output argument | semmle.label | loadProperties output argument | +| bmqa.cpp:304:39:304:42 | call to MessageProperties | semmle.label | call to MessageProperties | +| bmqa.cpp:304:44:304:48 | *props | semmle.label | *props | +| bmqa.cpp:305:7:305:45 | * ... | semmle.label | * ... | +| bmqa.cpp:305:8:305:11 | *copy | semmle.label | *copy | +| bmqa.cpp:305:32:305:39 | *call to getPropertyAsString | semmle.label | *call to getPropertyAsString | +| bmqa.cpp:309:19:309:26 | call to source | semmle.label | call to source | +| bmqa.cpp:310:36:310:76 | *call to data | semmle.label | *call to data | +| bmqa.cpp:312:2:312:4 | *msg | semmle.label | *msg | +| bmqa.cpp:312:22:312:27 | loadProperties output argument | semmle.label | loadProperties output argument | +| bmqa.cpp:314:2:314:5 | operator= output argument | semmle.label | operator= output argument | +| bmqa.cpp:314:9:314:13 | *props | semmle.label | *props | +| bmqa.cpp:315:7:315:45 | * ... | semmle.label | * ... | +| bmqa.cpp:315:8:315:11 | *copy | semmle.label | *copy | +| bmqa.cpp:315:32:315:39 | *call to getPropertyAsString | semmle.label | *call to getPropertyAsString | +| bmqa.cpp:319:19:319:26 | call to source | semmle.label | call to source | +| bmqa.cpp:320:36:320:76 | *call to data | semmle.label | *call to data | +| bmqa.cpp:322:2:322:4 | *msg | semmle.label | *msg | +| bmqa.cpp:322:22:322:27 | loadProperties output argument | semmle.label | loadProperties output argument | +| bmqa.cpp:324:7:324:55 | * ... | semmle.label | * ... | +| bmqa.cpp:324:8:324:21 | *call to operator= | semmle.label | *call to operator= | +| bmqa.cpp:324:16:324:20 | *props | semmle.label | *props | +| bmqa.cpp:324:42:324:49 | *call to getPropertyAsString | semmle.label | *call to getPropertyAsString | +| bmqa.cpp:328:19:328:26 | call to source | semmle.label | call to source | +| bmqa.cpp:329:28:329:58 | *call to data | semmle.label | *call to data | +| bmqa.cpp:331:2:331:6 | setPropertyAsString output argument | semmle.label | setPropertyAsString output argument | +| bmqa.cpp:331:35:331:40 | * ... | semmle.label | * ... | +| bmqa.cpp:332:7:332:46 | * ... | semmle.label | * ... | +| bmqa.cpp:332:8:332:12 | *props | semmle.label | *props | +| bmqa.cpp:332:33:332:40 | *call to getPropertyAsString | semmle.label | *call to getPropertyAsString | +| bmqa.cpp:336:25:336:32 | call to source | semmle.label | call to source | +| bmqa.cpp:338:2:338:6 | setPropertyAsString output argument | semmle.label | setPropertyAsString output argument | +| bmqa.cpp:338:35:338:39 | value | semmle.label | value | +| bmqa.cpp:339:7:339:46 | * ... | semmle.label | * ... | +| bmqa.cpp:339:8:339:12 | *props | semmle.label | *props | +| bmqa.cpp:339:33:339:40 | *call to getPropertyAsString | semmle.label | *call to getPropertyAsString | +| bmqa.cpp:343:19:343:26 | call to source | semmle.label | call to source | +| bmqa.cpp:344:33:344:68 | *call to data | semmle.label | *call to data | +| bmqa.cpp:346:2:346:6 | setPropertyAsBinary output argument | semmle.label | setPropertyAsBinary output argument | +| bmqa.cpp:346:35:346:40 | * ... | semmle.label | * ... | +| bmqa.cpp:347:7:347:46 | * ... | semmle.label | * ... | +| bmqa.cpp:347:8:347:12 | *props | semmle.label | *props | +| bmqa.cpp:347:33:347:40 | *call to getPropertyAsBinary [element] | semmle.label | *call to getPropertyAsBinary [element] | +| bmqa.cpp:352:24:352:31 | call to source | semmle.label | call to source | +| bmqa.cpp:354:2:354:6 | setPropertyAsBool output argument | semmle.label | setPropertyAsBool output argument | +| bmqa.cpp:354:26:354:29 | name | semmle.label | name | +| bmqa.cpp:355:47:355:48 | call to MessagePropertiesIterator | semmle.label | call to MessagePropertiesIterator | +| bmqa.cpp:355:50:355:55 | *& ... | semmle.label | *& ... | +| bmqa.cpp:356:7:356:23 | * ... | semmle.label | * ... | +| bmqa.cpp:356:8:356:9 | *it | semmle.label | *it | +| bmqa.cpp:356:15:356:17 | *call to name | semmle.label | *call to name | +| bmqa.cpp:360:24:360:31 | call to source | semmle.label | call to source | +| bmqa.cpp:362:2:362:6 | setPropertyAsChar output argument | semmle.label | setPropertyAsChar output argument | +| bmqa.cpp:362:26:362:29 | name | semmle.label | name | +| bmqa.cpp:363:47:363:48 | call to MessagePropertiesIterator | semmle.label | call to MessagePropertiesIterator | +| bmqa.cpp:363:50:363:55 | *& ... | semmle.label | *& ... | +| bmqa.cpp:364:7:364:23 | * ... | semmle.label | * ... | +| bmqa.cpp:364:8:364:9 | *it | semmle.label | *it | +| bmqa.cpp:364:15:364:17 | *call to name | semmle.label | *call to name | +| bmqa.cpp:368:24:368:31 | call to source | semmle.label | call to source | +| bmqa.cpp:370:2:370:6 | setPropertyAsShort output argument | semmle.label | setPropertyAsShort output argument | +| bmqa.cpp:370:27:370:30 | name | semmle.label | name | +| bmqa.cpp:371:47:371:48 | call to MessagePropertiesIterator | semmle.label | call to MessagePropertiesIterator | +| bmqa.cpp:371:50:371:55 | *& ... | semmle.label | *& ... | +| bmqa.cpp:372:7:372:23 | * ... | semmle.label | * ... | +| bmqa.cpp:372:8:372:9 | *it | semmle.label | *it | +| bmqa.cpp:372:15:372:17 | *call to name | semmle.label | *call to name | +| bmqa.cpp:376:24:376:31 | call to source | semmle.label | call to source | +| bmqa.cpp:378:2:378:6 | setPropertyAsInt32 output argument | semmle.label | setPropertyAsInt32 output argument | +| bmqa.cpp:378:27:378:30 | name | semmle.label | name | +| bmqa.cpp:379:47:379:48 | call to MessagePropertiesIterator | semmle.label | call to MessagePropertiesIterator | +| bmqa.cpp:379:50:379:55 | *& ... | semmle.label | *& ... | +| bmqa.cpp:380:7:380:23 | * ... | semmle.label | * ... | +| bmqa.cpp:380:8:380:9 | *it | semmle.label | *it | +| bmqa.cpp:380:15:380:17 | *call to name | semmle.label | *call to name | +| bmqa.cpp:384:24:384:31 | call to source | semmle.label | call to source | +| bmqa.cpp:386:2:386:6 | setPropertyAsInt64 output argument | semmle.label | setPropertyAsInt64 output argument | +| bmqa.cpp:386:27:386:30 | name | semmle.label | name | +| bmqa.cpp:387:47:387:48 | call to MessagePropertiesIterator | semmle.label | call to MessagePropertiesIterator | +| bmqa.cpp:387:50:387:55 | *& ... | semmle.label | *& ... | +| bmqa.cpp:388:7:388:23 | * ... | semmle.label | * ... | +| bmqa.cpp:388:8:388:9 | *it | semmle.label | *it | +| bmqa.cpp:388:15:388:17 | *call to name | semmle.label | *call to name | +| bmqa.cpp:392:24:392:31 | call to source | semmle.label | call to source | +| bmqa.cpp:394:2:394:6 | setPropertyAsString output argument | semmle.label | setPropertyAsString output argument | +| bmqa.cpp:394:28:394:31 | name | semmle.label | name | +| bmqa.cpp:395:47:395:48 | call to MessagePropertiesIterator | semmle.label | call to MessagePropertiesIterator | +| bmqa.cpp:395:50:395:55 | *& ... | semmle.label | *& ... | +| bmqa.cpp:396:7:396:23 | * ... | semmle.label | * ... | +| bmqa.cpp:396:8:396:9 | *it | semmle.label | *it | +| bmqa.cpp:396:15:396:17 | *call to name | semmle.label | *call to name | +| bmqa.cpp:400:24:400:31 | call to source | semmle.label | call to source | +| bmqa.cpp:402:2:402:6 | setPropertyAsBinary output argument | semmle.label | setPropertyAsBinary output argument | +| bmqa.cpp:402:28:402:31 | name | semmle.label | name | +| bmqa.cpp:403:47:403:48 | call to MessagePropertiesIterator | semmle.label | call to MessagePropertiesIterator | +| bmqa.cpp:403:50:403:55 | *& ... | semmle.label | *& ... | +| bmqa.cpp:404:7:404:23 | * ... | semmle.label | * ... | +| bmqa.cpp:404:8:404:9 | *it | semmle.label | *it | +| bmqa.cpp:404:15:404:17 | *call to name | semmle.label | *call to name | +| bmqa.cpp:408:19:408:26 | call to source | semmle.label | call to source | +| bmqa.cpp:409:36:409:76 | *call to data | semmle.label | *call to data | +| bmqa.cpp:411:2:411:4 | *msg | semmle.label | *msg | +| bmqa.cpp:411:22:411:27 | loadProperties output argument | semmle.label | loadProperties output argument | +| bmqa.cpp:412:47:412:48 | call to MessagePropertiesIterator | semmle.label | call to MessagePropertiesIterator | +| bmqa.cpp:412:50:412:55 | *& ... | semmle.label | *& ... | +| bmqa.cpp:414:8:414:24 | * ... | semmle.label | * ... | +| bmqa.cpp:414:9:414:10 | *it | semmle.label | *it | +| bmqa.cpp:414:16:414:18 | *call to name | semmle.label | *call to name | +| bmqa.cpp:415:8:415:31 | * ... | semmle.label | * ... | +| bmqa.cpp:415:9:415:10 | *it | semmle.label | *it | +| bmqa.cpp:415:23:415:25 | *call to getAsString | semmle.label | *call to getAsString | +| bmqa.cpp:416:8:416:31 | * ... | semmle.label | * ... | +| bmqa.cpp:416:9:416:10 | *it | semmle.label | *it | +| bmqa.cpp:416:23:416:25 | *call to getAsBinary [element] | semmle.label | *call to getAsBinary [element] | +| bmqa.cpp:422:19:422:26 | call to source | semmle.label | call to source | +| bmqa.cpp:423:36:423:76 | *call to data | semmle.label | *call to data | +| bmqa.cpp:425:2:425:4 | *msg | semmle.label | *msg | +| bmqa.cpp:425:22:425:27 | loadProperties output argument | semmle.label | loadProperties output argument | +| bmqa.cpp:426:47:426:48 | call to MessagePropertiesIterator | semmle.label | call to MessagePropertiesIterator | +| bmqa.cpp:426:50:426:55 | *& ... | semmle.label | *& ... | +| bmqa.cpp:428:2:428:5 | operator= output argument | semmle.label | operator= output argument | +| bmqa.cpp:428:9:428:10 | *it | semmle.label | *it | +| bmqa.cpp:429:7:429:32 | * ... | semmle.label | * ... | +| bmqa.cpp:429:8:429:11 | *copy | semmle.label | *copy | +| bmqa.cpp:429:24:429:26 | *call to getAsString | semmle.label | *call to getAsString | +| bmqa.cpp:430:7:430:32 | * ... | semmle.label | * ... | +| bmqa.cpp:430:8:430:18 | *call to operator= | semmle.label | *call to operator= | +| bmqa.cpp:430:16:430:17 | *it | semmle.label | *it | +| bmqa.cpp:430:24:430:26 | *call to name | semmle.label | *call to name | | test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | semmle.label | *ymlStepGenerated_with_body | | test.cpp:7:47:7:52 | value2 | semmle.label | value2 | | test.cpp:7:64:7:69 | value2 | semmle.label | value2 | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/steps.expected b/cpp/ql/test/library-tests/dataflow/external-models/steps.expected index 04d300ecbc81..b308b1e97e99 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/steps.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/steps.expected @@ -82,6 +82,90 @@ | bdlbb.cpp:92:48:92:51 | *call to data | bdlbb.cpp:92:37:92:40 | copy output argument | | bdlbb.cpp:94:46:94:48 | *src | bdlbb.cpp:94:37:94:40 | copy output argument | | bdlbb.cpp:96:42:96:44 | *dst | bdlbb.cpp:96:37:96:39 | copy output argument | +| bmqa.cpp:127:2:127:4 | *msg | bmqa.cpp:127:15:127:19 | getData output argument | +| bmqa.cpp:129:42:129:45 | *blob | bmqa.cpp:129:37:129:39 | copy output argument | +| bmqa.cpp:136:42:136:46 | *event | bmqa.cpp:136:49:136:63 | call to messageIterator | +| bmqa.cpp:138:43:138:44 | *it | bmqa.cpp:138:53:138:55 | *call to message | +| bmqa.cpp:140:3:140:5 | *msg | bmqa.cpp:140:15:140:19 | getData output argument | +| bmqa.cpp:142:43:142:46 | *blob | bmqa.cpp:142:38:142:40 | copy output argument | +| bmqa.cpp:150:47:150:50 | *call to data | bmqa.cpp:150:37:150:39 | copy output argument | +| bmqa.cpp:152:17:152:19 | *& ... | bmqa.cpp:152:2:152:4 | setDataRef output argument | +| bmqa.cpp:154:2:154:4 | *msg | bmqa.cpp:154:14:154:17 | getData output argument | +| bmqa.cpp:156:42:156:44 | *out | bmqa.cpp:156:37:156:39 | copy output argument | +| bmqa.cpp:163:19:163:22 | *call to data | bmqa.cpp:163:2:163:4 | setDataRef output argument | +| bmqa.cpp:165:2:165:4 | *msg | bmqa.cpp:165:14:165:17 | getData output argument | +| bmqa.cpp:167:42:167:44 | *out | bmqa.cpp:167:37:167:39 | copy output argument | +| bmqa.cpp:174:16:174:19 | *call to data | bmqa.cpp:174:2:174:4 | setData output argument | +| bmqa.cpp:176:2:176:4 | *msg | bmqa.cpp:176:14:176:17 | getData output argument | +| bmqa.cpp:178:42:178:44 | *out | bmqa.cpp:178:37:178:39 | copy output argument | +| bmqa.cpp:185:36:185:38 | *msg | bmqa.cpp:185:41:185:45 | call to clone | +| bmqa.cpp:187:2:187:5 | *copy | bmqa.cpp:187:15:187:19 | getData output argument | +| bmqa.cpp:189:42:189:45 | *blob | bmqa.cpp:189:37:189:39 | copy output argument | +| bmqa.cpp:197:2:197:4 | *msg | bmqa.cpp:197:22:197:27 | loadProperties output argument | +| bmqa.cpp:198:29:198:33 | *props | bmqa.cpp:198:54:198:61 | *call to getPropertyAsString | +| bmqa.cpp:206:2:206:4 | *msg | bmqa.cpp:206:22:206:27 | loadProperties output argument | +| bmqa.cpp:215:2:215:4 | *msg | bmqa.cpp:215:22:215:27 | loadProperties output argument | +| bmqa.cpp:224:2:224:4 | *msg | bmqa.cpp:224:22:224:27 | loadProperties output argument | +| bmqa.cpp:226:29:226:33 | *props | bmqa.cpp:226:56:226:69 | *call to getPropertyAsStringOr | +| bmqa.cpp:234:29:234:33 | *props | bmqa.cpp:234:56:234:69 | *call to getPropertyAsStringOr | +| bmqa.cpp:242:2:242:4 | *msg | bmqa.cpp:242:22:242:27 | loadProperties output argument | +| bmqa.cpp:261:2:261:4 | *msg | bmqa.cpp:261:22:261:27 | loadProperties output argument | +| bmqa.cpp:268:49:268:52 | *call to data | bmqa.cpp:268:37:268:41 | copy output argument | +| bmqa.cpp:270:17:270:20 | *blob | bmqa.cpp:270:2:270:6 | streamIn output argument | +| bmqa.cpp:271:8:271:12 | *props | bmqa.cpp:271:33:271:40 | *call to getPropertyAsString | +| bmqa.cpp:277:49:277:52 | *call to data | bmqa.cpp:277:37:277:41 | copy output argument | +| bmqa.cpp:279:14:279:17 | *blob | bmqa.cpp:279:2:279:3 | streamIn output argument | +| bmqa.cpp:281:23:281:25 | *& ... | bmqa.cpp:281:2:281:4 | setPropertiesRef output argument | +| bmqa.cpp:283:2:283:4 | *msg | bmqa.cpp:283:21:283:24 | loadProperties output argument | +| bmqa.cpp:284:8:284:10 | *out | bmqa.cpp:284:31:284:38 | *call to getPropertyAsString | +| bmqa.cpp:291:2:291:4 | *msg | bmqa.cpp:291:22:291:27 | loadProperties output argument | +| bmqa.cpp:293:41:293:45 | *props | bmqa.cpp:293:56:293:66 | *call to streamOut | +| bmqa.cpp:295:42:295:45 | *blob | bmqa.cpp:295:37:295:39 | copy output argument | +| bmqa.cpp:303:2:303:4 | *msg | bmqa.cpp:303:22:303:27 | loadProperties output argument | +| bmqa.cpp:305:8:305:11 | *copy | bmqa.cpp:305:32:305:39 | *call to getPropertyAsString | +| bmqa.cpp:312:2:312:4 | *msg | bmqa.cpp:312:22:312:27 | loadProperties output argument | +| bmqa.cpp:315:8:315:11 | *copy | bmqa.cpp:315:32:315:39 | *call to getPropertyAsString | +| bmqa.cpp:322:2:322:4 | *msg | bmqa.cpp:322:22:322:27 | loadProperties output argument | +| bmqa.cpp:324:8:324:21 | *call to operator= | bmqa.cpp:324:42:324:49 | *call to getPropertyAsString | +| bmqa.cpp:331:28:331:32 | call to basic_string_view | bmqa.cpp:331:2:331:6 | setPropertyAsString output argument | +| bmqa.cpp:331:35:331:40 | * ... | bmqa.cpp:331:2:331:6 | setPropertyAsString output argument | +| bmqa.cpp:332:8:332:12 | *props | bmqa.cpp:332:33:332:40 | *call to getPropertyAsString | +| bmqa.cpp:338:28:338:32 | call to basic_string_view | bmqa.cpp:338:2:338:6 | setPropertyAsString output argument | +| bmqa.cpp:338:35:338:39 | value | bmqa.cpp:338:2:338:6 | setPropertyAsString output argument | +| bmqa.cpp:339:8:339:12 | *props | bmqa.cpp:339:33:339:40 | *call to getPropertyAsString | +| bmqa.cpp:346:28:346:32 | call to basic_string_view | bmqa.cpp:346:2:346:6 | setPropertyAsBinary output argument | +| bmqa.cpp:346:35:346:40 | * ... | bmqa.cpp:346:2:346:6 | setPropertyAsBinary output argument | +| bmqa.cpp:354:26:354:29 | name | bmqa.cpp:354:2:354:6 | setPropertyAsBool output argument | +| bmqa.cpp:355:50:355:55 | *& ... | bmqa.cpp:355:47:355:48 | call to MessagePropertiesIterator | +| bmqa.cpp:356:8:356:9 | *it | bmqa.cpp:356:15:356:17 | *call to name | +| bmqa.cpp:362:26:362:29 | name | bmqa.cpp:362:2:362:6 | setPropertyAsChar output argument | +| bmqa.cpp:363:50:363:55 | *& ... | bmqa.cpp:363:47:363:48 | call to MessagePropertiesIterator | +| bmqa.cpp:364:8:364:9 | *it | bmqa.cpp:364:15:364:17 | *call to name | +| bmqa.cpp:370:27:370:30 | name | bmqa.cpp:370:2:370:6 | setPropertyAsShort output argument | +| bmqa.cpp:371:50:371:55 | *& ... | bmqa.cpp:371:47:371:48 | call to MessagePropertiesIterator | +| bmqa.cpp:372:8:372:9 | *it | bmqa.cpp:372:15:372:17 | *call to name | +| bmqa.cpp:378:27:378:30 | name | bmqa.cpp:378:2:378:6 | setPropertyAsInt32 output argument | +| bmqa.cpp:379:50:379:55 | *& ... | bmqa.cpp:379:47:379:48 | call to MessagePropertiesIterator | +| bmqa.cpp:380:8:380:9 | *it | bmqa.cpp:380:15:380:17 | *call to name | +| bmqa.cpp:386:27:386:30 | name | bmqa.cpp:386:2:386:6 | setPropertyAsInt64 output argument | +| bmqa.cpp:387:50:387:55 | *& ... | bmqa.cpp:387:47:387:48 | call to MessagePropertiesIterator | +| bmqa.cpp:388:8:388:9 | *it | bmqa.cpp:388:15:388:17 | *call to name | +| bmqa.cpp:394:28:394:31 | name | bmqa.cpp:394:2:394:6 | setPropertyAsString output argument | +| bmqa.cpp:394:34:394:40 | call to basic_string_view | bmqa.cpp:394:2:394:6 | setPropertyAsString output argument | +| bmqa.cpp:395:50:395:55 | *& ... | bmqa.cpp:395:47:395:48 | call to MessagePropertiesIterator | +| bmqa.cpp:396:8:396:9 | *it | bmqa.cpp:396:15:396:17 | *call to name | +| bmqa.cpp:402:28:402:31 | name | bmqa.cpp:402:2:402:6 | setPropertyAsBinary output argument | +| bmqa.cpp:402:34:402:56 | call to span | bmqa.cpp:402:2:402:6 | setPropertyAsBinary output argument | +| bmqa.cpp:403:50:403:55 | *& ... | bmqa.cpp:403:47:403:48 | call to MessagePropertiesIterator | +| bmqa.cpp:404:8:404:9 | *it | bmqa.cpp:404:15:404:17 | *call to name | +| bmqa.cpp:411:2:411:4 | *msg | bmqa.cpp:411:22:411:27 | loadProperties output argument | +| bmqa.cpp:412:50:412:55 | *& ... | bmqa.cpp:412:47:412:48 | call to MessagePropertiesIterator | +| bmqa.cpp:414:9:414:10 | *it | bmqa.cpp:414:16:414:18 | *call to name | +| bmqa.cpp:415:9:415:10 | *it | bmqa.cpp:415:23:415:25 | *call to getAsString | +| bmqa.cpp:425:2:425:4 | *msg | bmqa.cpp:425:22:425:27 | loadProperties output argument | +| bmqa.cpp:426:50:426:55 | *& ... | bmqa.cpp:426:47:426:48 | call to MessagePropertiesIterator | +| bmqa.cpp:429:8:429:11 | *copy | bmqa.cpp:429:24:429:26 | *call to getAsString | +| bmqa.cpp:430:8:430:18 | *call to operator= | bmqa.cpp:430:24:430:26 | *call to name | | test.cpp:17:24:17:24 | x | test.cpp:17:10:17:22 | call to ymlStepManual | | test.cpp:21:27:21:27 | x | test.cpp:21:10:21:25 | call to ymlStepGenerated | | test.cpp:25:35:25:35 | x | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/validatemodels.expected b/cpp/ql/test/library-tests/dataflow/external-models/validatemodels.expected index 694427213c86..b2f6ad8734eb 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/validatemodels.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/validatemodels.expected @@ -3368,6 +3368,7 @@ | Dubious signature "(const ML_KEM_KEY *,const ML_KEM_KEY *)" in summary model. | | Dubious signature "(const ML_KEM_KEY *,int)" in summary model. | | Dubious signature "(const ML_KEM_KEY *,unsigned char **)" in summary model. | +| Dubious signature "(const MessageProperties &,Allocator *)" in summary model. | | Dubious signature "(const NAMING_AUTHORITY *)" in summary model. | | Dubious signature "(const NAMING_AUTHORITY *,unsigned char **)" in summary model. | | Dubious signature "(const NETSCAPE_CERT_SEQUENCE *,unsigned char **)" in summary model. | diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/test_mad-signatures.expected b/cpp/ql/test/library-tests/dataflow/taint-tests/test_mad-signatures.expected index 65a5391a3ed0..2dee79ac9ff0 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/test_mad-signatures.expected +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/test_mad-signatures.expected @@ -15113,6 +15113,8 @@ getSignatureParameterName | (const ML_KEM_KEY *,int) | | ossl_ml_kem_key_dup | 1 | int | | (const ML_KEM_KEY *,unsigned char **) | | ossl_ml_kem_i2d_pubkey | 0 | const ML_KEM_KEY * | | (const ML_KEM_KEY *,unsigned char **) | | ossl_ml_kem_i2d_pubkey | 1 | unsigned char ** | +| (const MessageProperties &,Allocator *) | MessageProperties | MessageProperties | 0 | const MessageProperties & | +| (const MessageProperties &,Allocator *) | MessageProperties | MessageProperties | 1 | Allocator * | | (const NAMING_AUTHORITY *) | | NAMING_AUTHORITY_get0_authorityId | 0 | const NAMING_AUTHORITY * | | (const NAMING_AUTHORITY *) | | NAMING_AUTHORITY_get0_authorityText | 0 | const NAMING_AUTHORITY * | | (const NAMING_AUTHORITY *) | | NAMING_AUTHORITY_get0_authorityURL | 0 | const NAMING_AUTHORITY * | From d9417a34925be6df4c4643de645490be51720957 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Wed, 2 Sep 2026 13:52:18 +0200 Subject: [PATCH 0811/2098] Rust: Force fixed rust-analyzer compatible toolchain --- Cargo.lock | 1 + MODULE.bazel | 1 + .../tree_sitter_extractors_deps/BUILD.bazel | 12 ++++ .../tree_sitter_extractors_deps/crates.bzl | 2 + .../ra_ap_toolchain-0.0.347/BUILD.bazel | 15 ++++ .../ra_ap_toolchain/BUILD.bazel | 15 ++++ rust/extractor/Cargo.toml | 1 + rust/extractor/src/config.rs | 3 + rust/extractor/src/main.rs | 3 + rust/extractor/src/qltest.rs | 10 +-- rust/extractor/src/toolchain.rs | 71 +++++++++++++++++++ 11 files changed, 125 insertions(+), 9 deletions(-) create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_toolchain-0.0.347/BUILD.bazel create mode 100644 misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_toolchain/BUILD.bazel create mode 100644 rust/extractor/src/toolchain.rs diff --git a/Cargo.lock b/Cargo.lock index c5def22829c8..8875b8bbf90d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -455,6 +455,7 @@ dependencies = [ "ra_ap_span", "ra_ap_syntax", "ra_ap_syntax-bridge", + "ra_ap_toolchain", "ra_ap_vfs", "rust-extractor-macros", "serde", diff --git a/MODULE.bazel b/MODULE.bazel index 87397e58b7a7..86d53cbe41ba 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -139,6 +139,7 @@ use_repo( "vendor_ts__ra_ap_stdx-0.0.347", "vendor_ts__ra_ap_syntax-0.0.347", "vendor_ts__ra_ap_syntax-bridge-0.0.347", + "vendor_ts__ra_ap_toolchain-0.0.347", "vendor_ts__ra_ap_vfs-0.0.347", "vendor_ts__rand-0.10.2", "vendor_ts__rayon-1.12.0", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bazel index 20da09029c6e..4e17b7cd53c8 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bazel +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/BUILD.bazel @@ -457,6 +457,18 @@ alias( tags = ["manual"], ) +alias( + name = "ra_ap_toolchain-0.0.347", + actual = "@vendor_ts__ra_ap_toolchain-0.0.347//:ra_ap_toolchain", + tags = ["manual"], +) + +alias( + name = "ra_ap_toolchain", + actual = "@vendor_ts__ra_ap_toolchain-0.0.347//:ra_ap_toolchain", + tags = ["manual"], +) + alias( name = "ra_ap_vfs-0.0.347", actual = "@vendor_ts__ra_ap_vfs-0.0.347//:ra_ap_vfs", diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/crates.bzl b/misc/bazel/3rdparty/tree_sitter_extractors_deps/crates.bzl index db2d5ff2deae..9e6627eb70a1 100644 --- a/misc/bazel/3rdparty/tree_sitter_extractors_deps/crates.bzl +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/crates.bzl @@ -385,6 +385,7 @@ _NORMAL_DEPENDENCIES = { "ra_ap_span": Label("@vendor_ts//ra_ap_span-0.0.347"), "ra_ap_syntax": Label("@vendor_ts//ra_ap_syntax-0.0.347"), "ra_ap_syntax-bridge": Label("@vendor_ts//ra_ap_syntax-bridge-0.0.347"), + "ra_ap_toolchain": Label("@vendor_ts//ra_ap_toolchain-0.0.347"), "ra_ap_vfs": Label("@vendor_ts//ra_ap_vfs-0.0.347"), "serde": Label("@vendor_ts//serde-1.0.229"), "serde_json": Label("@vendor_ts//serde_json-1.0.151"), @@ -4108,6 +4109,7 @@ def crate_repositories(): struct(repo = "vendor_ts__ra_ap_stdx-0.0.347", is_dev_dep = False), struct(repo = "vendor_ts__ra_ap_syntax-0.0.347", is_dev_dep = False), struct(repo = "vendor_ts__ra_ap_syntax-bridge-0.0.347", is_dev_dep = False), + struct(repo = "vendor_ts__ra_ap_toolchain-0.0.347", is_dev_dep = False), struct(repo = "vendor_ts__ra_ap_vfs-0.0.347", is_dev_dep = False), struct(repo = "vendor_ts__rayon-1.12.0", is_dev_dep = False), struct(repo = "vendor_ts__regex-1.13.1", is_dev_dep = False), diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_toolchain-0.0.347/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_toolchain-0.0.347/BUILD.bazel new file mode 100644 index 000000000000..0923d80069f3 --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_toolchain-0.0.347/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_toolchain-0.0.347", + actual = "@vendor_ts__ra_ap_toolchain-0.0.347//:ra_ap_toolchain", + tags = ["manual"], +) diff --git a/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_toolchain/BUILD.bazel b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_toolchain/BUILD.bazel new file mode 100644 index 000000000000..2a4de2c0fc8f --- /dev/null +++ b/misc/bazel/3rdparty/tree_sitter_extractors_deps/ra_ap_toolchain/BUILD.bazel @@ -0,0 +1,15 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel run @@//misc/bazel/3rdparty:vendor_tree_sitter_extractors +############################################################################### + +package(default_visibility = ["//visibility:public"]) + +alias( + name = "ra_ap_toolchain", + actual = "@vendor_ts__ra_ap_toolchain-0.0.347//:ra_ap_toolchain", + tags = ["manual"], +) diff --git a/rust/extractor/Cargo.toml b/rust/extractor/Cargo.toml index 45f18f2ca7f4..caca0cbb17a2 100644 --- a/rust/extractor/Cargo.toml +++ b/rust/extractor/Cargo.toml @@ -21,6 +21,7 @@ ra_ap_paths = "0.0.347" ra_ap_project_model = "0.0.347" ra_ap_syntax = "0.0.347" ra_ap_syntax-bridge = "0.0.347" +ra_ap_toolchain = "0.0.347" ra_ap_vfs = "0.0.347" ra_ap_parser = "0.0.347" ra_ap_span = "0.0.347" diff --git a/rust/extractor/src/config.rs b/rust/extractor/src/config.rs index 4f54e73bdb23..71d57049b7ed 100644 --- a/rust/extractor/src/config.rs +++ b/rust/extractor/src/config.rs @@ -24,6 +24,8 @@ use std::fmt::Debug; use std::ops::Not; use std::path::{Path, PathBuf}; +use crate::toolchain::select_toolchain; + #[derive(Debug, PartialEq, Eq, Default, Serialize, Deserialize, Clone, Copy, clap::ValueEnum)] #[serde(rename_all = "lowercase")] #[clap(rename_all = "lowercase")] @@ -140,6 +142,7 @@ impl Config { ); } extra_env.extend(self.cargo_extra_env.clone()); + extra_env.insert("RUSTUP_TOOLCHAIN".to_owned(), Some(select_toolchain())); extra_env } diff --git a/rust/extractor/src/main.rs b/rust/extractor/src/main.rs index 7a335f916614..72b6f20c9fb0 100644 --- a/rust/extractor/src/main.rs +++ b/rust/extractor/src/main.rs @@ -1,5 +1,6 @@ use crate::diagnostics::{ExtractionStep, emit_extraction_diagnostics}; use crate::rust_analyzer::{RustAnalyzerNoSemantics, path_to_file_id}; +use crate::toolchain::log_project_toolchain; use crate::translate::SourceKind; use crate::trap::TrapId; use anyhow::Context; @@ -32,6 +33,7 @@ mod diagnostics; pub mod generated; mod qltest; mod rust_analyzer; +mod toolchain; mod translate; pub mod trap; @@ -269,6 +271,7 @@ fn main() -> anyhow::Result<()> { ); } let cwd = cwd()?; + log_project_toolchain(); let (cargo_config, load_cargo_config) = cfg.to_cargo_config(&cwd); let library_mode = if cfg.extract_dependencies_as_source { SourceKind::Source diff --git a/rust/extractor/src/qltest.rs b/rust/extractor/src/qltest.rs index df4f7dd0f942..a4f06bbd7927 100644 --- a/rust/extractor/src/qltest.rs +++ b/rust/extractor/src/qltest.rs @@ -5,7 +5,6 @@ use itertools::Itertools; use std::ffi::OsStr; use std::fs; use std::path::Path; -use std::process::Command; use tracing::info; const DEFAULT_EDITION: &str = "2021"; @@ -91,15 +90,8 @@ fn set_sources(config: &mut Config) -> anyhow::Result<()> { } fn cargo_check(config: &Config) -> anyhow::Result<()> { - let mut command = Command::new("cargo"); + let mut command = ra_ap_toolchain::command("cargo", ".", &config.get_extra_env()); command.env("CARGO_TARGET_DIR", config.cargo_target_dir()); - // Pass the extra environment variables to the initial `cargo check`. - for (key, value) in config.get_extra_env() { - match value { - Some(value) => command.env(key, value), - None => command.env_remove(key), - }; - } let status = command .arg("check") .arg("-q") diff --git a/rust/extractor/src/toolchain.rs b/rust/extractor/src/toolchain.rs new file mode 100644 index 000000000000..14a641bbee19 --- /dev/null +++ b/rust/extractor/src/toolchain.rs @@ -0,0 +1,71 @@ +//! Contains the logic for determining the Rust toolchain to be used by the +//! extractor. +//! +//! Rust-analyzer only guarantees compatibility with the latest Rust toolchain +//! per: +//! +//! +//! The Rust compiler on the other hand has fairly strong backwards +//! compatibility guarantees. Usually updating to a newer toolchain does not +//! cause any compilation errors. +//! +//! We therefore use a fixed Rust toolchain that is known to work with our +//! version of rust-analyzer. This gives us backwards compatibility issues +//! stemming from the Rust compiler, instead of those stemming from +//! rust-analyzer <-> Rust toolchain incompatibilities. The former set of +//! problems is (per current experiments and future expectations) much smaller. + +use std::{io, process}; + +use tracing::{info, warn}; + +/// The toolchain target by the extractor. This should usually be latest Rust +/// toolchain release that precedes our version of rust-analyzer. +/// +/// When rust-analyzer is updated this version should be updated accordingly. +const FIXED_RUST_TOOLCHAIN: &str = "1.97.0"; + +/// The command output of asking `rustup` which toolchain is used by the Rust +/// project in the current working directory. This main looks at +/// `rust-toolchain.toml` if present. +/// +/// Examples of what the stdout might look like when the command is successful: +/// - `nightly-aarch64-apple-darwin (overridden by '/path/to/project/rust-toolchain.toml')` +/// - `nightly-2026-09-01-aarch64-apple-darwin (overridden by '/path/to/project/rust-toolchain.toml')` +/// - `stable-aarch64-apple-darwin (default)` +/// - `1.80.1-aarch64-apple-darwin (overridden by '/path/to/project/rust-toolchain.toml')` +pub fn project_toolchain() -> io::Result { + process::Command::new("rustup") + .args(["show", "active-toolchain"]) + .output() +} + +/// Returns the fixed toolchain except when the project is using a nightly +/// toolchain. +/// +/// When the project is using `nightly`, anything below is almost certain to not +/// work. In that case using the specified nightly toolchain may work if the +/// toolchain is compatible with our rust-analyzer version. +pub fn select_toolchain() -> String { + let nightly = project_toolchain() + .ok() + .filter(|output| output.status.success()) + .and_then(|output| String::from_utf8(output.stdout).ok()) + .and_then(|toolchain| toolchain.split_whitespace().next().map(str::to_owned)) + .filter(|toolchain| toolchain.starts_with("nightly")); + nightly.unwrap_or_else(|| FIXED_RUST_TOOLCHAIN.to_owned()) +} + +pub fn log_project_toolchain() { + match project_toolchain() { + Ok(output) if output.status.success() => info!( + "project Rust toolchain: {}", + String::from_utf8_lossy(&output.stdout).trim() + ), + Ok(output) => warn!( + "unable to determine project Rust toolchain: {}", + String::from_utf8_lossy(&output.stderr).trim() + ), + Err(error) => warn!("unable to determine project Rust toolchain: {error}"), + } +} From d027a5eeefba3841458c3d2fc23602aaa2c12524 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Fri, 4 Sep 2026 11:07:19 +0200 Subject: [PATCH 0812/2098] Rust: Preinstall extractor toolchain in tests Install the fixed toolchain used by the extractor before parallel integration and QL tests start. This avoids concurrent rustup auto-installation races. --- rust/ql/integration-tests/conftest.py | 10 ++++++++++ rust/ql/test/setup.sh | 3 +++ 2 files changed, 13 insertions(+) diff --git a/rust/ql/integration-tests/conftest.py b/rust/ql/integration-tests/conftest.py index 578a81a849a9..3b1f26ee84c8 100644 --- a/rust/ql/integration-tests/conftest.py +++ b/rust/ql/integration-tests/conftest.py @@ -5,6 +5,16 @@ import tomllib +def pytest_configure(config): + # Install the fixed toolchain used by the extractor before xdist starts its + # workers to avoid concurrent rustup downloads. The version here should + # match `FIXED_RUST_TOOLCHAIN`. + if not hasattr(config, "workerinput"): + commands.run( + "rustup toolchain install 1.97.0 --profile minimal --component rust-src" + ) + + @pytest.fixture(params=[2018, 2021, 2024]) def rust_edition(request): return request.param diff --git a/rust/ql/test/setup.sh b/rust/ql/test/setup.sh index ed1f5ab69227..24fa06a70e44 100755 --- a/rust/ql/test/setup.sh +++ b/rust/ql/test/setup.sh @@ -8,6 +8,9 @@ set -euo pipefail # no need to install rust-src explicitly, it's listed in both toolchains cd "$(dirname "$0")" +# Install the fixed toolchain used by the extractor. The version here should +# match `FIXED_RUST_TOOLCHAIN`. +rustup toolchain install 1.97.0 --profile minimal --component rust-src pushd ../../extractor/src/nightly-toolchain rustup install popd From 88d5c494fdec223f5af0618a26f21204c28362c3 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Tue, 8 Sep 2026 13:22:49 +0200 Subject: [PATCH 0813/2098] Rust: Update expected files --- .../crate_graph/crates.expected | 24 +- .../format-macros-legacy/FormatArgs.expected | 18 +- .../LogInjection.expected | 24 +- .../inline-taint-flow.expected | 67 ++-- .../UncontrolledAllocationSize.expected | 298 +++++++++--------- .../test/query-tests/security/CWE-770/main.rs | 4 +- 6 files changed, 228 insertions(+), 207 deletions(-) diff --git a/rust/ql/test/extractor-tests/crate_graph/crates.expected b/rust/ql/test/extractor-tests/crate_graph/crates.expected index 4ed32f7692a9..8f1bb1590f44 100644 --- a/rust/ql/test/extractor-tests/crate_graph/crates.expected +++ b/rust/ql/test/extractor-tests/crate_graph/crates.expected @@ -57,12 +57,12 @@ #-----| core -> Crate(core@0.0.0) #-----| std -> Crate(std@0.0.0) -#-----| Crate(hashbrown@0.16.1) +#-----| Crate(hashbrown@0.17.1) #-----| alloc -> Crate(alloc@0.0.0) #-----| core -> Crate(core@0.0.0) #-----| foldhash -> Crate(foldhash@0.2.0) -#-----| Crate(libc@0.2.178) +#-----| Crate(libc@0.2.185) #-----| rustc_std_workspace_core -> Crate(core@0.0.0) main.rs: @@ -98,7 +98,7 @@ main.rs: #-----| Crate(panic_unwind@0.0.0) #-----| alloc -> Crate(alloc@0.0.0) #-----| core -> Crate(core@0.0.0) -#-----| libc -> Crate(libc@0.2.178) +#-----| libc -> Crate(libc@0.2.185) #-----| unwind -> Crate(unwind@0.0.0) #-----| Crate(proc_macro@0.0.0) @@ -123,27 +123,27 @@ main.rs: #-----| Crate(std@0.0.0) #-----| alloc -> Crate(alloc@0.0.0) #-----| core -> Crate(core@0.0.0) -#-----| cfg_if -> Crate(cfg_if@1.0.4) -#-----| hashbrown -> Crate(hashbrown@0.16.1) -#-----| libc -> Crate(libc@0.2.178) -#-----| rand -> Crate(rand@0.9.2) -#-----| rand_xorshift -> Crate(rand_xorshift@0.4.0) -#-----| rustc_demangle -> Crate(rustc_demangle@0.1.27) #-----| panic_abort -> Crate(panic_abort@0.0.0) +#-----| libc -> Crate(libc@0.2.185) #-----| unwind -> Crate(unwind@0.0.0) #-----| panic_unwind -> Crate(panic_unwind@0.0.0) #-----| std_detect -> Crate(std_detect@0.1.5) +#-----| cfg_if -> Crate(cfg_if@1.0.4) +#-----| hashbrown -> Crate(hashbrown@0.17.1) +#-----| rand -> Crate(rand@0.9.2) +#-----| rand_xorshift -> Crate(rand_xorshift@0.4.0) +#-----| rustc_demangle -> Crate(rustc_demangle@0.1.27) #-----| Crate(std_detect@0.1.5) #-----| alloc -> Crate(alloc@0.0.0) #-----| core -> Crate(core@0.0.0) -#-----| libc -> Crate(libc@0.2.178) +#-----| libc -> Crate(libc@0.2.185) #-----| Crate(test@0.0.0) #-----| core -> Crate(core@0.0.0) #-----| std -> Crate(std@0.0.0) +#-----| libc -> Crate(libc@0.2.185) #-----| getopts -> Crate(getopts@0.2.24) -#-----| libc -> Crate(libc@0.2.178) lib.rs: # 0| Crate(test@0.0.1) @@ -164,7 +164,7 @@ lib.rs: #-----| Crate(unwind@0.0.0) #-----| core -> Crate(core@0.0.0) -#-----| libc -> Crate(libc@0.2.178) +#-----| libc -> Crate(libc@0.2.185) #-----| Crate(version_check@0.9.5) #-----| proc_macro -> Crate(proc_macro@0.0.0) diff --git a/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.expected b/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.expected index 56bf946de0e7..d8373ec3f9e3 100644 --- a/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.expected +++ b/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.expected @@ -1,12 +1,12 @@ -| main.rs:13:10:13:25 | FormatArgsExpr | 1 | -| main.rs:16:10:16:23 | FormatArgsExpr | 0 | -| main.rs:19:13:19:36 | FormatArgsExpr | 1 | +| main.rs:13:18:13:24 | FormatArgsExpr | 1 | +| main.rs:16:18:16:22 | FormatArgsExpr | 0 | +| main.rs:19:21:19:35 | FormatArgsExpr | 1 | | main.rs:27:25:27:33 | FormatArgsExpr | 1 | | main.rs:38:40:38:46 | FormatArgsExpr | 0 | | main.rs:43:52:43:58 | FormatArgsExpr | 0 | -| main.rs:49:13:49:33 | FormatArgsExpr | 1 | -| main.rs:54:13:54:33 | FormatArgsExpr | 0 | -| main.rs:64:5:64:27 | FormatArgsExpr | 1 | -| main.rs:65:5:65:26 | FormatArgsExpr | 0 | -| main.rs:66:5:66:25 | FormatArgsExpr | 1 | -| main.rs:67:5:67:24 | FormatArgsExpr | 0 | +| main.rs:49:26:49:32 | FormatArgsExpr | 1 | +| main.rs:54:28:54:32 | FormatArgsExpr | 0 | +| main.rs:64:14:64:26 | FormatArgsExpr | 1 | +| main.rs:65:15:65:25 | FormatArgsExpr | 0 | +| main.rs:66:12:66:24 | FormatArgsExpr | 1 | +| main.rs:67:13:67:23 | FormatArgsExpr | 0 | diff --git a/rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected b/rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected index 853f6f401549..b294b89e83fb 100644 --- a/rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected +++ b/rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected @@ -1,13 +1,13 @@ #select -| main.rs:64:5:64:27 | FormatArgsExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:64:5:64:27 | FormatArgsExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | -| main.rs:65:5:65:26 | FormatArgsExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:65:5:65:26 | FormatArgsExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | -| main.rs:66:5:66:25 | FormatArgsExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:66:5:66:25 | FormatArgsExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | -| main.rs:67:5:67:24 | FormatArgsExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:67:5:67:24 | FormatArgsExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | +| main.rs:64:14:64:26 | MacroExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:64:14:64:26 | MacroExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | +| main.rs:65:15:65:25 | MacroExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:65:15:65:25 | MacroExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | +| main.rs:66:12:66:24 | MacroExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:66:12:66:24 | MacroExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | +| main.rs:67:13:67:23 | MacroExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:67:13:67:23 | MacroExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | edges -| main.rs:62:9:62:15 | tainted | main.rs:64:5:64:27 | FormatArgsExpr | provenance | Sink:MaD:2 | -| main.rs:62:9:62:15 | tainted | main.rs:65:5:65:26 | FormatArgsExpr | provenance | Sink:MaD:1 | -| main.rs:62:9:62:15 | tainted | main.rs:66:5:66:25 | FormatArgsExpr | provenance | Sink:MaD:2 | -| main.rs:62:9:62:15 | tainted | main.rs:67:5:67:24 | FormatArgsExpr | provenance | Sink:MaD:1 | +| main.rs:62:9:62:15 | tainted | main.rs:64:14:64:26 | MacroExpr | provenance | Sink:MaD:2 | +| main.rs:62:9:62:15 | tainted | main.rs:65:15:65:25 | MacroExpr | provenance | Sink:MaD:1 | +| main.rs:62:9:62:15 | tainted | main.rs:66:12:66:24 | MacroExpr | provenance | Sink:MaD:2 | +| main.rs:62:9:62:15 | tainted | main.rs:67:13:67:23 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:62:19:62:45 | ...::var(...) | main.rs:62:19:62:45 | ...::var(...) [Ok] | provenance | Src:MaD:3 | | main.rs:62:19:62:45 | ...::var(...) [Ok] | main.rs:62:19:62:65 | ... .unwrap_or_default() | provenance | MaD:4 | | main.rs:62:19:62:65 | ... .unwrap_or_default() | main.rs:62:9:62:15 | tainted | provenance | | @@ -21,8 +21,8 @@ nodes | main.rs:62:19:62:45 | ...::var(...) | semmle.label | ...::var(...) | | main.rs:62:19:62:45 | ...::var(...) [Ok] | semmle.label | ...::var(...) [Ok] | | main.rs:62:19:62:65 | ... .unwrap_or_default() | semmle.label | ... .unwrap_or_default() | -| main.rs:64:5:64:27 | FormatArgsExpr | semmle.label | FormatArgsExpr | -| main.rs:65:5:65:26 | FormatArgsExpr | semmle.label | FormatArgsExpr | -| main.rs:66:5:66:25 | FormatArgsExpr | semmle.label | FormatArgsExpr | -| main.rs:67:5:67:24 | FormatArgsExpr | semmle.label | FormatArgsExpr | +| main.rs:64:14:64:26 | MacroExpr | semmle.label | MacroExpr | +| main.rs:65:15:65:25 | MacroExpr | semmle.label | MacroExpr | +| main.rs:66:12:66:24 | MacroExpr | semmle.label | MacroExpr | +| main.rs:67:13:67:23 | MacroExpr | semmle.label | MacroExpr | subpaths diff --git a/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected b/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected index 5e0b16c93af7..97ef77e17760 100644 --- a/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected +++ b/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected @@ -1,67 +1,80 @@ models | 1 | Summary: ::as_str; Argument[self].Reference; ReturnValue.Reference; taint | -| 2 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | -| 3 | Summary: core::fmt::Write::write_fmt; Argument[0]; Argument[self].Reference; taint | -| 4 | Summary: core::fmt::Write::write_str; Argument[0].Reference; Argument[self].Reference; taint | +| 2 | Summary: ::write_fmt; Argument[0]; Argument[self].Reference; taint | +| 3 | Summary: ::write_str; Argument[0].Reference; Argument[self].Reference; taint | +| 4 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | | 5 | Summary: core::fmt::write; Argument[1]; Argument[0].Reference; taint | +| 6 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | edges -| main.rs:12:9:12:9 | a | main.rs:13:10:13:25 | FormatArgsExpr | provenance | | +| main.rs:12:9:12:9 | a | main.rs:13:18:13:24 | MacroExpr | provenance | | | main.rs:12:13:12:21 | source(...) | main.rs:12:9:12:9 | a | provenance | | -| main.rs:13:10:13:25 | ...::format(...) | main.rs:13:10:13:25 | MacroExpr | provenance | | -| main.rs:13:10:13:25 | FormatArgsExpr | main.rs:13:10:13:25 | ...::format(...) | provenance | MaD:2 | -| main.rs:15:9:15:9 | b | main.rs:16:10:16:23 | FormatArgsExpr | provenance | | +| main.rs:13:18:13:24 | ...::format(...) | main.rs:13:18:13:24 | { ... } | provenance | | +| main.rs:13:18:13:24 | ...::must_use(...) | main.rs:13:10:13:25 | MacroExpr | provenance | | +| main.rs:13:18:13:24 | MacroExpr | main.rs:13:18:13:24 | ...::format(...) | provenance | MaD:4 | +| main.rs:13:18:13:24 | { ... } | main.rs:13:18:13:24 | ...::must_use(...) | provenance | MaD:6 | +| main.rs:15:9:15:9 | b | main.rs:16:18:16:22 | MacroExpr | provenance | | | main.rs:15:13:15:21 | source(...) | main.rs:15:9:15:9 | b | provenance | | -| main.rs:16:10:16:23 | ...::format(...) | main.rs:16:10:16:23 | MacroExpr | provenance | | -| main.rs:16:10:16:23 | FormatArgsExpr | main.rs:16:10:16:23 | ...::format(...) | provenance | MaD:2 | -| main.rs:18:9:18:9 | c | main.rs:19:13:19:36 | FormatArgsExpr | provenance | | +| main.rs:16:18:16:22 | ...::format(...) | main.rs:16:18:16:22 | { ... } | provenance | | +| main.rs:16:18:16:22 | ...::must_use(...) | main.rs:16:10:16:23 | MacroExpr | provenance | | +| main.rs:16:18:16:22 | MacroExpr | main.rs:16:18:16:22 | ...::format(...) | provenance | MaD:4 | +| main.rs:16:18:16:22 | { ... } | main.rs:16:18:16:22 | ...::must_use(...) | provenance | MaD:6 | +| main.rs:18:9:18:9 | c | main.rs:19:21:19:35 | MacroExpr | provenance | | | main.rs:18:13:18:21 | source(...) | main.rs:18:9:18:9 | c | provenance | | | main.rs:19:9:19:9 | s | main.rs:20:10:20:10 | s | provenance | | -| main.rs:19:13:19:36 | ...::format(...) | main.rs:19:9:19:9 | s | provenance | | -| main.rs:19:13:19:36 | FormatArgsExpr | main.rs:19:13:19:36 | ...::format(...) | provenance | MaD:2 | +| main.rs:19:21:19:35 | ...::format(...) | main.rs:19:21:19:35 | { ... } | provenance | | +| main.rs:19:21:19:35 | ...::must_use(...) | main.rs:19:9:19:9 | s | provenance | | +| main.rs:19:21:19:35 | MacroExpr | main.rs:19:21:19:35 | ...::format(...) | provenance | MaD:4 | +| main.rs:19:21:19:35 | { ... } | main.rs:19:21:19:35 | ...::must_use(...) | provenance | MaD:6 | | main.rs:26:9:26:9 | a | main.rs:27:9:27:9 | b | provenance | | | main.rs:26:13:26:21 | source(...) | main.rs:26:9:26:9 | a | provenance | | | main.rs:27:9:27:9 | b | main.rs:28:30:28:30 | b | provenance | | | main.rs:28:9:28:9 | c | main.rs:29:10:29:10 | c | provenance | | | main.rs:28:13:28:31 | ...::format(...) | main.rs:28:9:28:9 | c | provenance | | -| main.rs:28:30:28:30 | b | main.rs:28:13:28:31 | ...::format(...) | provenance | MaD:2 | +| main.rs:28:30:28:30 | b | main.rs:28:13:28:31 | ...::format(...) | provenance | MaD:4 | | main.rs:32:9:32:9 | d | main.rs:33:28:33:28 | d | provenance | | | main.rs:32:13:32:21 | source(...) | main.rs:32:9:32:9 | d | provenance | | | main.rs:33:13:33:16 | [post] buf1 | main.rs:34:10:34:13 | buf1 | provenance | | | main.rs:33:28:33:28 | d | main.rs:33:28:33:37 | d.as_str() [&ref] | provenance | MaD:1 | -| main.rs:33:28:33:37 | d.as_str() [&ref] | main.rs:33:13:33:16 | [post] buf1 | provenance | MaD:4 | +| main.rs:33:28:33:37 | d.as_str() [&ref] | main.rs:33:13:33:16 | [post] buf1 | provenance | MaD:3 | | main.rs:37:9:37:9 | e | main.rs:38:28:38:46 | MacroExpr | provenance | | | main.rs:37:13:37:21 | source(...) | main.rs:37:9:37:9 | e | provenance | | | main.rs:38:13:38:16 | [post] buf2 | main.rs:39:10:39:13 | buf2 | provenance | | -| main.rs:38:28:38:46 | MacroExpr | main.rs:38:13:38:16 | [post] buf2 | provenance | MaD:3 | +| main.rs:38:28:38:46 | MacroExpr | main.rs:38:13:38:16 | [post] buf2 | provenance | MaD:2 | | main.rs:42:9:42:9 | f | main.rs:43:40:43:58 | MacroExpr | provenance | | | main.rs:42:13:42:21 | source(...) | main.rs:42:9:42:9 | f | provenance | | | main.rs:43:29:43:37 | [post] &mut buf3 [&ref] | main.rs:43:34:43:37 | [post] buf3 | provenance | | | main.rs:43:34:43:37 | [post] buf3 | main.rs:44:10:44:13 | buf3 | provenance | | | main.rs:43:40:43:58 | MacroExpr | main.rs:43:29:43:37 | [post] &mut buf3 [&ref] | provenance | MaD:5 | -| main.rs:48:9:48:9 | g | main.rs:49:13:49:33 | FormatArgsExpr | provenance | | +| main.rs:48:9:48:9 | g | main.rs:49:26:49:32 | MacroExpr | provenance | | | main.rs:48:13:48:21 | source(...) | main.rs:48:9:48:9 | g | provenance | | -| main.rs:49:13:49:33 | FormatArgsExpr | main.rs:49:20:49:23 | [post] buf4 | provenance | MaD:3 | | main.rs:49:20:49:23 | [post] buf4 | main.rs:50:10:50:13 | buf4 | provenance | | -| main.rs:53:9:53:9 | h | main.rs:54:13:54:33 | FormatArgsExpr | provenance | | +| main.rs:49:26:49:32 | MacroExpr | main.rs:49:20:49:23 | [post] buf4 | provenance | MaD:2 | +| main.rs:53:9:53:9 | h | main.rs:54:28:54:32 | MacroExpr | provenance | | | main.rs:53:13:53:21 | source(...) | main.rs:53:9:53:9 | h | provenance | | -| main.rs:54:13:54:33 | FormatArgsExpr | main.rs:54:22:54:25 | [post] buf5 | provenance | MaD:3 | | main.rs:54:22:54:25 | [post] buf5 | main.rs:55:10:55:13 | buf5 | provenance | | +| main.rs:54:28:54:32 | MacroExpr | main.rs:54:22:54:25 | [post] buf5 | provenance | MaD:2 | nodes | main.rs:12:9:12:9 | a | semmle.label | a | | main.rs:12:13:12:21 | source(...) | semmle.label | source(...) | -| main.rs:13:10:13:25 | ...::format(...) | semmle.label | ...::format(...) | -| main.rs:13:10:13:25 | FormatArgsExpr | semmle.label | FormatArgsExpr | | main.rs:13:10:13:25 | MacroExpr | semmle.label | MacroExpr | +| main.rs:13:18:13:24 | ...::format(...) | semmle.label | ...::format(...) | +| main.rs:13:18:13:24 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| main.rs:13:18:13:24 | MacroExpr | semmle.label | MacroExpr | +| main.rs:13:18:13:24 | { ... } | semmle.label | { ... } | | main.rs:15:9:15:9 | b | semmle.label | b | | main.rs:15:13:15:21 | source(...) | semmle.label | source(...) | -| main.rs:16:10:16:23 | ...::format(...) | semmle.label | ...::format(...) | -| main.rs:16:10:16:23 | FormatArgsExpr | semmle.label | FormatArgsExpr | | main.rs:16:10:16:23 | MacroExpr | semmle.label | MacroExpr | +| main.rs:16:18:16:22 | ...::format(...) | semmle.label | ...::format(...) | +| main.rs:16:18:16:22 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| main.rs:16:18:16:22 | MacroExpr | semmle.label | MacroExpr | +| main.rs:16:18:16:22 | { ... } | semmle.label | { ... } | | main.rs:18:9:18:9 | c | semmle.label | c | | main.rs:18:13:18:21 | source(...) | semmle.label | source(...) | | main.rs:19:9:19:9 | s | semmle.label | s | -| main.rs:19:13:19:36 | ...::format(...) | semmle.label | ...::format(...) | -| main.rs:19:13:19:36 | FormatArgsExpr | semmle.label | FormatArgsExpr | +| main.rs:19:21:19:35 | ...::format(...) | semmle.label | ...::format(...) | +| main.rs:19:21:19:35 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| main.rs:19:21:19:35 | MacroExpr | semmle.label | MacroExpr | +| main.rs:19:21:19:35 | { ... } | semmle.label | { ... } | | main.rs:20:10:20:10 | s | semmle.label | s | | main.rs:26:9:26:9 | a | semmle.label | a | | main.rs:26:13:26:21 | source(...) | semmle.label | source(...) | @@ -89,13 +102,13 @@ nodes | main.rs:44:10:44:13 | buf3 | semmle.label | buf3 | | main.rs:48:9:48:9 | g | semmle.label | g | | main.rs:48:13:48:21 | source(...) | semmle.label | source(...) | -| main.rs:49:13:49:33 | FormatArgsExpr | semmle.label | FormatArgsExpr | | main.rs:49:20:49:23 | [post] buf4 | semmle.label | [post] buf4 | +| main.rs:49:26:49:32 | MacroExpr | semmle.label | MacroExpr | | main.rs:50:10:50:13 | buf4 | semmle.label | buf4 | | main.rs:53:9:53:9 | h | semmle.label | h | | main.rs:53:13:53:21 | source(...) | semmle.label | source(...) | -| main.rs:54:13:54:33 | FormatArgsExpr | semmle.label | FormatArgsExpr | | main.rs:54:22:54:25 | [post] buf5 | semmle.label | [post] buf5 | +| main.rs:54:28:54:32 | MacroExpr | semmle.label | MacroExpr | | main.rs:55:10:55:13 | buf5 | semmle.label | buf5 | subpaths testFailures diff --git a/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected b/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected index 93808f0a9f30..71d1423cd8aa 100644 --- a/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected +++ b/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected @@ -31,6 +31,8 @@ | main.rs:162:35:162:37 | l13 | main.rs:342:13:342:28 | ...::args(...) | main.rs:162:35:162:37 | l13 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | | main.rs:169:35:169:37 | l13 | main.rs:342:13:342:28 | ...::args(...) | main.rs:169:35:169:37 | l13 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | | main.rs:177:31:177:32 | l1 | main.rs:342:13:342:28 | ...::args(...) | main.rs:177:31:177:32 | l1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | +| main.rs:195:38:195:39 | l2 | main.rs:342:13:342:28 | ...::args(...) | main.rs:195:38:195:39 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | +| main.rs:196:45:196:46 | l2 | main.rs:342:13:342:28 | ...::args(...) | main.rs:196:45:196:46 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | | main.rs:197:41:197:42 | l2 | main.rs:342:13:342:28 | ...::args(...) | main.rs:197:41:197:42 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | | main.rs:198:48:198:49 | l2 | main.rs:342:13:342:28 | ...::args(...) | main.rs:198:48:198:49 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | | main.rs:199:41:199:42 | l2 | main.rs:342:13:342:28 | ...::args(...) | main.rs:199:41:199:42 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | @@ -50,100 +52,100 @@ | main.rs:290:40:290:45 | layout | main.rs:314:25:314:40 | ...::args(...) | main.rs:290:40:290:45 | layout | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:314:25:314:40 | ...::args(...) | user-provided value | | main.rs:334:26:334:26 | a | main.rs:342:13:342:28 | ...::args(...) | main.rs:334:26:334:26 | a | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | edges -| main.rs:12:36:12:43 | ...: usize | main.rs:18:41:18:41 | v | provenance | Sink:MaD:14 | +| main.rs:12:36:12:43 | ...: usize | main.rs:18:41:18:41 | v | provenance | Sink:MaD:16 | | main.rs:12:36:12:43 | ...: usize | main.rs:20:50:20:50 | v | provenance | | | main.rs:12:36:12:43 | ...: usize | main.rs:29:60:29:60 | v | provenance | | | main.rs:12:36:12:43 | ...: usize | main.rs:32:60:32:60 | v | provenance | | | main.rs:12:36:12:43 | ...: usize | main.rs:35:49:35:49 | v | provenance | | -| main.rs:20:9:20:10 | l2 | main.rs:21:31:21:32 | l2 | provenance | Sink:MaD:12 | +| main.rs:20:9:20:10 | l2 | main.rs:21:31:21:32 | l2 | provenance | Sink:MaD:14 | | main.rs:20:9:20:10 | l2 | main.rs:22:31:22:32 | l2 | provenance | | | main.rs:20:9:20:10 | l2 | main.rs:23:31:23:32 | l2 | provenance | | -| main.rs:20:9:20:10 | l2 | main.rs:24:38:24:39 | l2 | provenance | Sink:MaD:13 | -| main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | main.rs:20:14:20:63 | ... .unwrap() | provenance | MaD:38 | +| main.rs:20:9:20:10 | l2 | main.rs:24:38:24:39 | l2 | provenance | Sink:MaD:15 | +| main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | main.rs:20:14:20:63 | ... .unwrap() | provenance | MaD:40 | | main.rs:20:14:20:63 | ... .unwrap() | main.rs:20:9:20:10 | l2 | provenance | | -| main.rs:20:50:20:50 | v | main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | provenance | MaD:27 | -| main.rs:22:31:22:32 | l2 | main.rs:22:31:22:44 | l2.align_to(...) [Ok] | provenance | MaD:21 | -| main.rs:22:31:22:44 | l2.align_to(...) [Ok] | main.rs:22:31:22:53 | ... .unwrap() | provenance | MaD:38 | -| main.rs:22:31:22:53 | ... .unwrap() | main.rs:22:31:22:53 | ... .unwrap() | provenance | Sink:MaD:12 | -| main.rs:23:31:23:32 | l2 | main.rs:23:31:23:44 | l2.align_to(...) [Ok] | provenance | MaD:21 | -| main.rs:23:31:23:44 | l2.align_to(...) [Ok] | main.rs:23:31:23:53 | ... .unwrap() | provenance | MaD:38 | -| main.rs:23:31:23:53 | ... .unwrap() | main.rs:23:31:23:68 | ... .pad_to_align() | provenance | MaD:29 | -| main.rs:23:31:23:68 | ... .pad_to_align() | main.rs:23:31:23:68 | ... .pad_to_align() | provenance | Sink:MaD:12 | -| main.rs:29:9:29:10 | l4 | main.rs:30:31:30:32 | l4 | provenance | Sink:MaD:12 | +| main.rs:20:50:20:50 | v | main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | provenance | MaD:29 | +| main.rs:22:31:22:32 | l2 | main.rs:22:31:22:44 | l2.align_to(...) [Ok] | provenance | MaD:23 | +| main.rs:22:31:22:44 | l2.align_to(...) [Ok] | main.rs:22:31:22:53 | ... .unwrap() | provenance | MaD:40 | +| main.rs:22:31:22:53 | ... .unwrap() | main.rs:22:31:22:53 | ... .unwrap() | provenance | Sink:MaD:14 | +| main.rs:23:31:23:32 | l2 | main.rs:23:31:23:44 | l2.align_to(...) [Ok] | provenance | MaD:23 | +| main.rs:23:31:23:44 | l2.align_to(...) [Ok] | main.rs:23:31:23:53 | ... .unwrap() | provenance | MaD:40 | +| main.rs:23:31:23:53 | ... .unwrap() | main.rs:23:31:23:68 | ... .pad_to_align() | provenance | MaD:31 | +| main.rs:23:31:23:68 | ... .pad_to_align() | main.rs:23:31:23:68 | ... .pad_to_align() | provenance | Sink:MaD:14 | +| main.rs:29:9:29:10 | l4 | main.rs:30:31:30:32 | l4 | provenance | Sink:MaD:14 | | main.rs:29:14:29:64 | ...::from_size_align_unchecked(...) | main.rs:29:9:29:10 | l4 | provenance | | -| main.rs:29:60:29:60 | v | main.rs:29:14:29:64 | ...::from_size_align_unchecked(...) | provenance | MaD:28 | -| main.rs:32:9:32:10 | l5 | main.rs:33:31:33:32 | l5 | provenance | Sink:MaD:12 | +| main.rs:29:60:29:60 | v | main.rs:29:14:29:64 | ...::from_size_align_unchecked(...) | provenance | MaD:30 | +| main.rs:32:9:32:10 | l5 | main.rs:33:31:33:32 | l5 | provenance | Sink:MaD:14 | | main.rs:32:14:32:118 | ...::from_size_align_unchecked(...) | main.rs:32:9:32:10 | l5 | provenance | | -| main.rs:32:60:32:60 | v | main.rs:32:60:32:89 | ... * ... | provenance | MaD:35 | -| main.rs:32:60:32:89 | ... * ... | main.rs:32:14:32:118 | ...::from_size_align_unchecked(...) | provenance | MaD:28 | +| main.rs:32:60:32:60 | v | main.rs:32:60:32:89 | ... * ... | provenance | MaD:37 | +| main.rs:32:60:32:89 | ... * ... | main.rs:32:14:32:118 | ...::from_size_align_unchecked(...) | provenance | MaD:30 | | main.rs:35:9:35:10 | s6 | main.rs:36:60:36:61 | s6 | provenance | | | main.rs:35:14:35:54 | ... + ... | main.rs:35:9:35:10 | s6 | provenance | | -| main.rs:35:15:35:49 | ... * ... | main.rs:35:14:35:54 | ... + ... | provenance | MaD:34 | -| main.rs:35:49:35:49 | v | main.rs:35:15:35:49 | ... * ... | provenance | MaD:35 | -| main.rs:36:9:36:10 | l6 | main.rs:37:31:37:32 | l6 | provenance | Sink:MaD:12 | +| main.rs:35:15:35:49 | ... * ... | main.rs:35:14:35:54 | ... + ... | provenance | MaD:36 | +| main.rs:35:49:35:49 | v | main.rs:35:15:35:49 | ... * ... | provenance | MaD:37 | +| main.rs:36:9:36:10 | l6 | main.rs:37:31:37:32 | l6 | provenance | Sink:MaD:14 | | main.rs:36:9:36:10 | l6 | main.rs:39:60:39:61 | l6 | provenance | | | main.rs:36:14:36:65 | ...::from_size_align_unchecked(...) | main.rs:36:9:36:10 | l6 | provenance | | -| main.rs:36:60:36:61 | s6 | main.rs:36:14:36:65 | ...::from_size_align_unchecked(...) | provenance | MaD:28 | -| main.rs:39:9:39:10 | l7 | main.rs:40:31:40:32 | l7 | provenance | Sink:MaD:12 | +| main.rs:36:60:36:61 | s6 | main.rs:36:14:36:65 | ...::from_size_align_unchecked(...) | provenance | MaD:30 | +| main.rs:39:9:39:10 | l7 | main.rs:40:31:40:32 | l7 | provenance | Sink:MaD:14 | | main.rs:39:14:39:72 | ...::from_size_align_unchecked(...) | main.rs:39:9:39:10 | l7 | provenance | | -| main.rs:39:60:39:61 | l6 | main.rs:39:60:39:68 | l6.size() | provenance | MaD:32 | -| main.rs:39:60:39:68 | l6.size() | main.rs:39:14:39:72 | ...::from_size_align_unchecked(...) | provenance | MaD:28 | +| main.rs:39:60:39:61 | l6 | main.rs:39:60:39:68 | l6.size() | provenance | MaD:34 | +| main.rs:39:60:39:68 | l6.size() | main.rs:39:14:39:72 | ...::from_size_align_unchecked(...) | provenance | MaD:30 | | main.rs:43:44:43:51 | ...: usize | main.rs:50:41:50:41 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:51:41:51:41 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:53:48:53:48 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:54:48:54:48 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:58:34:58:34 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:67:46:67:46 | v | provenance | | -| main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | main.rs:50:31:50:51 | ... .unwrap() [tuple.0] | provenance | MaD:38 | +| main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | main.rs:50:31:50:51 | ... .unwrap() [tuple.0] | provenance | MaD:40 | | main.rs:50:31:50:51 | ... .unwrap() [tuple.0] | main.rs:50:31:50:53 | ... .0 | provenance | | -| main.rs:50:31:50:53 | ... .0 | main.rs:50:31:50:53 | ... .0 | provenance | Sink:MaD:12 | -| main.rs:50:41:50:41 | v | main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:30 | -| main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | main.rs:51:31:51:55 | ... .unwrap() [tuple.0] | provenance | MaD:38 | +| main.rs:50:31:50:53 | ... .0 | main.rs:50:31:50:53 | ... .0 | provenance | Sink:MaD:14 | +| main.rs:50:41:50:41 | v | main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:32 | +| main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | main.rs:51:31:51:55 | ... .unwrap() [tuple.0] | provenance | MaD:40 | | main.rs:51:31:51:55 | ... .unwrap() [tuple.0] | main.rs:51:31:51:57 | ... .0 | provenance | | -| main.rs:51:31:51:57 | ... .0 | main.rs:51:31:51:57 | ... .0 | provenance | Sink:MaD:12 | -| main.rs:51:41:51:41 | v | main.rs:51:41:51:45 | ... + ... | provenance | MaD:34 | -| main.rs:51:41:51:45 | ... + ... | main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:30 | -| main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | main.rs:53:31:53:58 | ... .unwrap() | provenance | MaD:38 | -| main.rs:53:31:53:58 | ... .unwrap() | main.rs:53:31:53:58 | ... .unwrap() | provenance | Sink:MaD:12 | -| main.rs:53:48:53:48 | v | main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | provenance | MaD:31 | -| main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | main.rs:54:31:54:63 | ... .unwrap() | provenance | MaD:38 | -| main.rs:54:31:54:63 | ... .unwrap() | main.rs:54:31:54:63 | ... .unwrap() | provenance | Sink:MaD:12 | -| main.rs:54:48:54:48 | v | main.rs:54:48:54:53 | ... * ... | provenance | MaD:35 | -| main.rs:54:48:54:53 | ... * ... | main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | provenance | MaD:31 | +| main.rs:51:31:51:57 | ... .0 | main.rs:51:31:51:57 | ... .0 | provenance | Sink:MaD:14 | +| main.rs:51:41:51:41 | v | main.rs:51:41:51:45 | ... + ... | provenance | MaD:36 | +| main.rs:51:41:51:45 | ... + ... | main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:32 | +| main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | main.rs:53:31:53:58 | ... .unwrap() | provenance | MaD:40 | +| main.rs:53:31:53:58 | ... .unwrap() | main.rs:53:31:53:58 | ... .unwrap() | provenance | Sink:MaD:14 | +| main.rs:53:48:53:48 | v | main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | provenance | MaD:33 | +| main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | main.rs:54:31:54:63 | ... .unwrap() | provenance | MaD:40 | +| main.rs:54:31:54:63 | ... .unwrap() | main.rs:54:31:54:63 | ... .unwrap() | provenance | Sink:MaD:14 | +| main.rs:54:48:54:48 | v | main.rs:54:48:54:53 | ... * ... | provenance | MaD:37 | +| main.rs:54:48:54:53 | ... * ... | main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | provenance | MaD:33 | | main.rs:58:9:58:20 | TuplePat [tuple.0] | main.rs:58:10:58:11 | k1 | provenance | | -| main.rs:58:10:58:11 | k1 | main.rs:59:31:59:32 | k1 | provenance | Sink:MaD:12 | +| main.rs:58:10:58:11 | k1 | main.rs:59:31:59:32 | k1 | provenance | Sink:MaD:14 | | main.rs:58:10:58:11 | k1 | main.rs:60:34:60:35 | k1 | provenance | | | main.rs:58:10:58:11 | k1 | main.rs:62:24:62:25 | k1 | provenance | | | main.rs:58:10:58:11 | k1 | main.rs:64:48:64:49 | k1 | provenance | | | main.rs:58:10:58:11 | k1 | main.rs:65:31:65:32 | k1 | provenance | | -| main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | main.rs:58:24:58:66 | ... .expect(...) [tuple.0] | provenance | MaD:37 | +| main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | main.rs:58:24:58:66 | ... .expect(...) [tuple.0] | provenance | MaD:39 | | main.rs:58:24:58:66 | ... .expect(...) [tuple.0] | main.rs:58:9:58:20 | TuplePat [tuple.0] | provenance | | -| main.rs:58:34:58:34 | v | main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | provenance | MaD:30 | +| main.rs:58:34:58:34 | v | main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | provenance | MaD:32 | | main.rs:60:9:60:20 | TuplePat [tuple.0] | main.rs:60:10:60:11 | k2 | provenance | | -| main.rs:60:10:60:11 | k2 | main.rs:61:31:61:32 | k2 | provenance | Sink:MaD:12 | -| main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | main.rs:60:24:60:45 | ... .unwrap() [tuple.0] | provenance | MaD:38 | +| main.rs:60:10:60:11 | k2 | main.rs:61:31:61:32 | k2 | provenance | Sink:MaD:14 | +| main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | main.rs:60:24:60:45 | ... .unwrap() [tuple.0] | provenance | MaD:40 | | main.rs:60:24:60:45 | ... .unwrap() [tuple.0] | main.rs:60:9:60:20 | TuplePat [tuple.0] | provenance | | -| main.rs:60:34:60:35 | k1 | main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | provenance | MaD:23 | +| main.rs:60:34:60:35 | k1 | main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | provenance | MaD:25 | | main.rs:62:9:62:20 | TuplePat [tuple.0] | main.rs:62:10:62:11 | k3 | provenance | | -| main.rs:62:10:62:11 | k3 | main.rs:63:31:63:32 | k3 | provenance | Sink:MaD:12 | -| main.rs:62:24:62:25 | k1 | main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | provenance | MaD:24 | -| main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | main.rs:62:24:62:45 | ... .unwrap() [tuple.0] | provenance | MaD:38 | +| main.rs:62:10:62:11 | k3 | main.rs:63:31:63:32 | k3 | provenance | Sink:MaD:14 | +| main.rs:62:24:62:25 | k1 | main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | provenance | MaD:26 | +| main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | main.rs:62:24:62:45 | ... .unwrap() [tuple.0] | provenance | MaD:40 | | main.rs:62:24:62:45 | ... .unwrap() [tuple.0] | main.rs:62:9:62:20 | TuplePat [tuple.0] | provenance | | -| main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | main.rs:64:31:64:59 | ... .unwrap() | provenance | MaD:38 | -| main.rs:64:31:64:59 | ... .unwrap() | main.rs:64:31:64:59 | ... .unwrap() | provenance | Sink:MaD:12 | -| main.rs:64:48:64:49 | k1 | main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | provenance | MaD:25 | -| main.rs:65:31:65:32 | k1 | main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | provenance | MaD:26 | -| main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | main.rs:65:31:65:59 | ... .unwrap() | provenance | MaD:38 | -| main.rs:65:31:65:59 | ... .unwrap() | main.rs:65:31:65:59 | ... .unwrap() | provenance | Sink:MaD:12 | -| main.rs:67:9:67:10 | l4 | main.rs:68:31:68:32 | l4 | provenance | Sink:MaD:12 | -| main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | main.rs:67:14:67:56 | ... .unwrap() | provenance | MaD:38 | +| main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | main.rs:64:31:64:59 | ... .unwrap() | provenance | MaD:40 | +| main.rs:64:31:64:59 | ... .unwrap() | main.rs:64:31:64:59 | ... .unwrap() | provenance | Sink:MaD:14 | +| main.rs:64:48:64:49 | k1 | main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | provenance | MaD:27 | +| main.rs:65:31:65:32 | k1 | main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | provenance | MaD:28 | +| main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | main.rs:65:31:65:59 | ... .unwrap() | provenance | MaD:40 | +| main.rs:65:31:65:59 | ... .unwrap() | main.rs:65:31:65:59 | ... .unwrap() | provenance | Sink:MaD:14 | +| main.rs:67:9:67:10 | l4 | main.rs:68:31:68:32 | l4 | provenance | Sink:MaD:14 | +| main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | main.rs:67:14:67:56 | ... .unwrap() | provenance | MaD:40 | | main.rs:67:14:67:56 | ... .unwrap() | main.rs:67:9:67:10 | l4 | provenance | | -| main.rs:67:46:67:46 | v | main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | provenance | MaD:22 | +| main.rs:67:46:67:46 | v | main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | provenance | MaD:24 | | main.rs:86:35:86:42 | ...: usize | main.rs:87:54:87:54 | v | provenance | | -| main.rs:87:9:87:14 | layout | main.rs:88:31:88:36 | layout | provenance | Sink:MaD:12 | -| main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | main.rs:87:18:87:67 | ... .unwrap() | provenance | MaD:38 | +| main.rs:87:9:87:14 | layout | main.rs:88:31:88:36 | layout | provenance | Sink:MaD:14 | +| main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | main.rs:87:18:87:67 | ... .unwrap() | provenance | MaD:40 | | main.rs:87:18:87:67 | ... .unwrap() | main.rs:87:9:87:14 | layout | provenance | | -| main.rs:87:54:87:54 | v | main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | provenance | MaD:27 | +| main.rs:87:54:87:54 | v | main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | provenance | MaD:29 | | main.rs:91:38:91:45 | ...: usize | main.rs:92:47:92:47 | v | provenance | | | main.rs:91:38:91:45 | ...: usize | main.rs:101:51:101:51 | v | provenance | | | main.rs:91:38:91:45 | ...: usize | main.rs:105:33:105:33 | v | provenance | | @@ -151,74 +153,76 @@ edges | main.rs:91:38:91:45 | ...: usize | main.rs:151:62:151:62 | v | provenance | | | main.rs:91:38:91:45 | ...: usize | main.rs:154:62:154:62 | v | provenance | | | main.rs:91:38:91:45 | ...: usize | main.rs:161:55:161:55 | v | provenance | | -| main.rs:92:9:92:10 | l1 | main.rs:96:35:96:36 | l1 | provenance | Sink:MaD:12 | -| main.rs:92:9:92:10 | l1 | main.rs:102:35:102:36 | l1 | provenance | Sink:MaD:12 | -| main.rs:92:9:92:10 | l1 | main.rs:109:35:109:36 | l1 | provenance | Sink:MaD:12 | -| main.rs:92:9:92:10 | l1 | main.rs:111:35:111:36 | l1 | provenance | Sink:MaD:12 | -| main.rs:92:9:92:10 | l1 | main.rs:146:35:146:36 | l1 | provenance | Sink:MaD:12 | -| main.rs:92:9:92:10 | l1 | main.rs:177:31:177:32 | l1 | provenance | Sink:MaD:12 | -| main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | main.rs:92:14:92:57 | ... .unwrap() | provenance | MaD:38 | +| main.rs:92:9:92:10 | l1 | main.rs:96:35:96:36 | l1 | provenance | Sink:MaD:14 | +| main.rs:92:9:92:10 | l1 | main.rs:102:35:102:36 | l1 | provenance | Sink:MaD:14 | +| main.rs:92:9:92:10 | l1 | main.rs:109:35:109:36 | l1 | provenance | Sink:MaD:14 | +| main.rs:92:9:92:10 | l1 | main.rs:111:35:111:36 | l1 | provenance | Sink:MaD:14 | +| main.rs:92:9:92:10 | l1 | main.rs:146:35:146:36 | l1 | provenance | Sink:MaD:14 | +| main.rs:92:9:92:10 | l1 | main.rs:177:31:177:32 | l1 | provenance | Sink:MaD:14 | +| main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | main.rs:92:14:92:57 | ... .unwrap() | provenance | MaD:40 | | main.rs:92:14:92:57 | ... .unwrap() | main.rs:92:9:92:10 | l1 | provenance | | -| main.rs:92:47:92:47 | v | main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | provenance | MaD:22 | -| main.rs:101:13:101:14 | l3 | main.rs:103:35:103:36 | l3 | provenance | Sink:MaD:12 | -| main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | main.rs:101:18:101:61 | ... .unwrap() | provenance | MaD:38 | +| main.rs:92:47:92:47 | v | main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | provenance | MaD:24 | +| main.rs:101:13:101:14 | l3 | main.rs:103:35:103:36 | l3 | provenance | Sink:MaD:14 | +| main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | main.rs:101:18:101:61 | ... .unwrap() | provenance | MaD:40 | | main.rs:101:18:101:61 | ... .unwrap() | main.rs:101:13:101:14 | l3 | provenance | | -| main.rs:101:51:101:51 | v | main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | provenance | MaD:22 | +| main.rs:101:51:101:51 | v | main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | provenance | MaD:24 | | main.rs:105:33:105:33 | v | main.rs:86:35:86:42 | ...: usize | provenance | | -| main.rs:145:13:145:14 | l9 | main.rs:148:35:148:36 | l9 | provenance | Sink:MaD:12 | -| main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | main.rs:145:18:145:61 | ... .unwrap() | provenance | MaD:38 | +| main.rs:145:13:145:14 | l9 | main.rs:148:35:148:36 | l9 | provenance | Sink:MaD:14 | +| main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | main.rs:145:18:145:61 | ... .unwrap() | provenance | MaD:40 | | main.rs:145:18:145:61 | ... .unwrap() | main.rs:145:13:145:14 | l9 | provenance | | -| main.rs:145:51:145:51 | v | main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | provenance | MaD:22 | -| main.rs:151:9:151:11 | l10 | main.rs:152:31:152:33 | l10 | provenance | Sink:MaD:12 | -| main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | main.rs:151:15:151:78 | ... .unwrap() | provenance | MaD:38 | +| main.rs:145:51:145:51 | v | main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | provenance | MaD:24 | +| main.rs:151:9:151:11 | l10 | main.rs:152:31:152:33 | l10 | provenance | Sink:MaD:14 | +| main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | main.rs:151:15:151:78 | ... .unwrap() | provenance | MaD:40 | | main.rs:151:15:151:78 | ... .unwrap() | main.rs:151:9:151:11 | l10 | provenance | | -| main.rs:151:48:151:68 | ...::min(...) | main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | provenance | MaD:22 | -| main.rs:151:62:151:62 | v | main.rs:151:48:151:68 | ...::min(...) | provenance | MaD:40 | -| main.rs:154:9:154:11 | l11 | main.rs:155:31:155:33 | l11 | provenance | Sink:MaD:12 | -| main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | main.rs:154:15:154:78 | ... .unwrap() | provenance | MaD:38 | +| main.rs:151:48:151:68 | ...::min(...) | main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | provenance | MaD:24 | +| main.rs:151:62:151:62 | v | main.rs:151:48:151:68 | ...::min(...) | provenance | MaD:42 | +| main.rs:154:9:154:11 | l11 | main.rs:155:31:155:33 | l11 | provenance | Sink:MaD:14 | +| main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | main.rs:154:15:154:78 | ... .unwrap() | provenance | MaD:40 | | main.rs:154:15:154:78 | ... .unwrap() | main.rs:154:9:154:11 | l11 | provenance | | -| main.rs:154:48:154:68 | ...::max(...) | main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | provenance | MaD:22 | -| main.rs:154:62:154:62 | v | main.rs:154:48:154:68 | ...::max(...) | provenance | MaD:39 | -| main.rs:161:13:161:15 | l13 | main.rs:162:35:162:37 | l13 | provenance | Sink:MaD:12 | -| main.rs:161:13:161:15 | l13 | main.rs:169:35:169:37 | l13 | provenance | Sink:MaD:12 | -| main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | main.rs:161:19:161:68 | ... .unwrap() | provenance | MaD:38 | +| main.rs:154:48:154:68 | ...::max(...) | main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | provenance | MaD:24 | +| main.rs:154:62:154:62 | v | main.rs:154:48:154:68 | ...::max(...) | provenance | MaD:41 | +| main.rs:161:13:161:15 | l13 | main.rs:162:35:162:37 | l13 | provenance | Sink:MaD:14 | +| main.rs:161:13:161:15 | l13 | main.rs:169:35:169:37 | l13 | provenance | Sink:MaD:14 | +| main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | main.rs:161:19:161:68 | ... .unwrap() | provenance | MaD:40 | | main.rs:161:19:161:68 | ... .unwrap() | main.rs:161:13:161:15 | l13 | provenance | | -| main.rs:161:55:161:55 | v | main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | provenance | MaD:27 | +| main.rs:161:55:161:55 | v | main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | provenance | MaD:29 | | main.rs:183:29:183:36 | ...: usize | main.rs:192:46:192:46 | v | provenance | | -| main.rs:192:9:192:10 | l2 | main.rs:197:41:197:42 | l2 | provenance | Sink:MaD:7 | -| main.rs:192:9:192:10 | l2 | main.rs:198:48:198:49 | l2 | provenance | Sink:MaD:8 | +| main.rs:192:9:192:10 | l2 | main.rs:195:38:195:39 | l2 | provenance | Sink:MaD:7 | +| main.rs:192:9:192:10 | l2 | main.rs:196:45:196:46 | l2 | provenance | Sink:MaD:8 | +| main.rs:192:9:192:10 | l2 | main.rs:197:41:197:42 | l2 | provenance | Sink:MaD:9 | +| main.rs:192:9:192:10 | l2 | main.rs:198:48:198:49 | l2 | provenance | Sink:MaD:10 | | main.rs:192:9:192:10 | l2 | main.rs:199:41:199:42 | l2 | provenance | Sink:MaD:1 | | main.rs:192:9:192:10 | l2 | main.rs:200:48:200:49 | l2 | provenance | Sink:MaD:2 | -| main.rs:192:9:192:10 | l2 | main.rs:211:53:211:54 | l2 | provenance | Sink:MaD:9 | -| main.rs:192:9:192:10 | l2 | main.rs:213:60:213:61 | l2 | provenance | Sink:MaD:10 | -| main.rs:192:9:192:10 | l2 | main.rs:216:51:216:52 | l2 | provenance | Sink:MaD:11 | -| main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | main.rs:192:14:192:56 | ... .unwrap() | provenance | MaD:38 | +| main.rs:192:9:192:10 | l2 | main.rs:211:53:211:54 | l2 | provenance | Sink:MaD:11 | +| main.rs:192:9:192:10 | l2 | main.rs:213:60:213:61 | l2 | provenance | Sink:MaD:12 | +| main.rs:192:9:192:10 | l2 | main.rs:216:51:216:52 | l2 | provenance | Sink:MaD:13 | +| main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | main.rs:192:14:192:56 | ... .unwrap() | provenance | MaD:40 | | main.rs:192:14:192:56 | ... .unwrap() | main.rs:192:9:192:10 | l2 | provenance | | -| main.rs:192:46:192:46 | v | main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | provenance | MaD:22 | -| main.rs:220:27:220:34 | ...: usize | main.rs:222:26:222:26 | v | provenance | Sink:MaD:17 | -| main.rs:220:27:220:34 | ...: usize | main.rs:223:36:223:36 | v | provenance | Sink:MaD:15 | -| main.rs:220:27:220:34 | ...: usize | main.rs:225:30:225:30 | v | provenance | Sink:MaD:16 | -| main.rs:220:27:220:34 | ...: usize | main.rs:226:26:226:26 | v | provenance | Sink:MaD:16 | -| main.rs:220:27:220:34 | ...: usize | main.rs:227:31:227:31 | v | provenance | Sink:MaD:18 | +| main.rs:192:46:192:46 | v | main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | provenance | MaD:24 | +| main.rs:220:27:220:34 | ...: usize | main.rs:222:26:222:26 | v | provenance | Sink:MaD:19 | +| main.rs:220:27:220:34 | ...: usize | main.rs:223:36:223:36 | v | provenance | Sink:MaD:17 | +| main.rs:220:27:220:34 | ...: usize | main.rs:225:30:225:30 | v | provenance | Sink:MaD:18 | +| main.rs:220:27:220:34 | ...: usize | main.rs:226:26:226:26 | v | provenance | Sink:MaD:18 | +| main.rs:220:27:220:34 | ...: usize | main.rs:227:31:227:31 | v | provenance | Sink:MaD:20 | | main.rs:230:24:230:31 | ...: usize | main.rs:231:43:231:43 | v | provenance | Sink:MaD:3 | | main.rs:230:24:230:31 | ...: usize | main.rs:232:39:232:39 | v | provenance | Sink:MaD:5 | | main.rs:230:24:230:31 | ...: usize | main.rs:233:46:233:46 | v | provenance | Sink:MaD:4 | | main.rs:230:24:230:31 | ...: usize | main.rs:234:42:234:42 | v | provenance | Sink:MaD:6 | | main.rs:285:24:285:41 | ...: String | main.rs:286:21:286:30 | user_input | provenance | | | main.rs:286:9:286:17 | num_bytes | main.rs:288:54:288:62 | num_bytes | provenance | | -| main.rs:286:21:286:30 | user_input | main.rs:286:21:286:47 | user_input.parse() [Ok] | provenance | MaD:20 | +| main.rs:286:21:286:30 | user_input | main.rs:286:21:286:47 | user_input.parse() [Ok] | provenance | MaD:22 | | main.rs:286:21:286:47 | user_input.parse() [Ok] | main.rs:286:21:286:48 | TryExpr | provenance | | -| main.rs:286:21:286:48 | TryExpr | main.rs:286:21:286:77 | ... * ... | provenance | MaD:35 | +| main.rs:286:21:286:48 | TryExpr | main.rs:286:21:286:77 | ... * ... | provenance | MaD:37 | | main.rs:286:21:286:77 | ... * ... | main.rs:286:9:286:17 | num_bytes | provenance | | -| main.rs:288:9:288:14 | layout | main.rs:290:40:290:45 | layout | provenance | Sink:MaD:12 | -| main.rs:288:18:288:66 | ...::from_size_align(...) [Ok] | main.rs:288:18:288:75 | ... .unwrap() | provenance | MaD:38 | +| main.rs:288:9:288:14 | layout | main.rs:290:40:290:45 | layout | provenance | Sink:MaD:14 | +| main.rs:288:18:288:66 | ...::from_size_align(...) [Ok] | main.rs:288:18:288:75 | ... .unwrap() | provenance | MaD:40 | | main.rs:288:18:288:75 | ... .unwrap() | main.rs:288:9:288:14 | layout | provenance | | -| main.rs:288:54:288:62 | num_bytes | main.rs:288:18:288:66 | ...::from_size_align(...) [Ok] | provenance | MaD:27 | -| main.rs:314:25:314:40 | ...::args(...) | main.rs:314:25:314:40 | ...::args(...) [element] | provenance | Src:MaD:19 | -| main.rs:314:25:314:40 | ...::args(...) [element] | main.rs:314:25:314:47 | ... .nth(...) [Some] | provenance | MaD:33 | -| main.rs:314:25:314:47 | ... .nth(...) [Some] | main.rs:314:25:314:74 | ... .unwrap_or(...) | provenance | MaD:36 | +| main.rs:288:54:288:62 | num_bytes | main.rs:288:18:288:66 | ...::from_size_align(...) [Ok] | provenance | MaD:29 | +| main.rs:314:25:314:40 | ...::args(...) | main.rs:314:25:314:40 | ...::args(...) [element] | provenance | Src:MaD:21 | +| main.rs:314:25:314:40 | ...::args(...) [element] | main.rs:314:25:314:47 | ... .nth(...) [Some] | provenance | MaD:35 | +| main.rs:314:25:314:47 | ... .nth(...) [Some] | main.rs:314:25:314:74 | ... .unwrap_or(...) | provenance | MaD:38 | | main.rs:314:25:314:74 | ... .unwrap_or(...) | main.rs:285:24:285:41 | ...: String | provenance | | -| main.rs:320:26:320:33 | ...: usize | main.rs:334:26:334:26 | a | provenance | Sink:MaD:17 | +| main.rs:320:26:320:33 | ...: usize | main.rs:334:26:334:26 | a | provenance | Sink:MaD:19 | | main.rs:342:9:342:9 | v | main.rs:345:34:345:34 | v | provenance | | | main.rs:342:9:342:9 | v | main.rs:346:42:346:42 | v | provenance | | | main.rs:342:9:342:9 | v | main.rs:347:36:347:36 | v | provenance | | @@ -226,11 +230,11 @@ edges | main.rs:342:9:342:9 | v | main.rs:349:25:349:25 | v | provenance | | | main.rs:342:9:342:9 | v | main.rs:350:22:350:22 | v | provenance | | | main.rs:342:9:342:9 | v | main.rs:352:24:352:24 | v | provenance | | -| main.rs:342:13:342:28 | ...::args(...) | main.rs:342:13:342:28 | ...::args(...) [element] | provenance | Src:MaD:19 | -| main.rs:342:13:342:28 | ...::args(...) [element] | main.rs:342:13:342:35 | ... .nth(...) [Some] | provenance | MaD:33 | -| main.rs:342:13:342:35 | ... .nth(...) [Some] | main.rs:342:13:342:65 | ... .unwrap_or(...) | provenance | MaD:36 | -| main.rs:342:13:342:65 | ... .unwrap_or(...) | main.rs:342:13:342:82 | ... .parse() [Ok] | provenance | MaD:20 | -| main.rs:342:13:342:82 | ... .parse() [Ok] | main.rs:342:13:342:91 | ... .unwrap() | provenance | MaD:38 | +| main.rs:342:13:342:28 | ...::args(...) | main.rs:342:13:342:28 | ...::args(...) [element] | provenance | Src:MaD:21 | +| main.rs:342:13:342:28 | ...::args(...) [element] | main.rs:342:13:342:35 | ... .nth(...) [Some] | provenance | MaD:35 | +| main.rs:342:13:342:35 | ... .nth(...) [Some] | main.rs:342:13:342:65 | ... .unwrap_or(...) | provenance | MaD:38 | +| main.rs:342:13:342:65 | ... .unwrap_or(...) | main.rs:342:13:342:82 | ... .parse() [Ok] | provenance | MaD:22 | +| main.rs:342:13:342:82 | ... .parse() [Ok] | main.rs:342:13:342:91 | ... .unwrap() | provenance | MaD:40 | | main.rs:342:13:342:91 | ... .unwrap() | main.rs:342:9:342:9 | v | provenance | | | main.rs:345:34:345:34 | v | main.rs:12:36:12:43 | ...: usize | provenance | | | main.rs:346:42:346:42 | v | main.rs:43:44:43:51 | ...: usize | provenance | | @@ -246,40 +250,42 @@ models | 4 | Sink: ::try_with_capacity_in; Argument[0]; alloc-layout | | 5 | Sink: ::with_capacity; Argument[0]; alloc-layout | | 6 | Sink: ::with_capacity_in; Argument[0]; alloc-layout | -| 7 | Sink: ::allocate; Argument[0]; alloc-size | -| 8 | Sink: ::allocate_zeroed; Argument[0]; alloc-size | -| 9 | Sink: ::grow; Argument[2]; alloc-size | -| 10 | Sink: ::grow_zeroed; Argument[2]; alloc-size | -| 11 | Sink: ::shrink; Argument[2]; alloc-size | -| 12 | Sink: alloc::alloc::alloc; Argument[0]; alloc-layout | -| 13 | Sink: alloc::alloc::alloc_zeroed; Argument[0]; alloc-layout | -| 14 | Sink: alloc::alloc::realloc; Argument[2]; alloc-size | -| 15 | Sink: libc::unix::aligned_alloc; Argument[1]; alloc-size | -| 16 | Sink: libc::unix::calloc; Argument[0,1]; alloc-size | -| 17 | Sink: libc::unix::malloc; Argument[0]; alloc-size | -| 18 | Sink: libc::unix::realloc; Argument[1]; alloc-size | -| 19 | Source: std::env::args; ReturnValue.Element; commandargs | -| 20 | Summary: ::deref; Argument[self]; ReturnValue; value | -| 21 | Summary: ::align_to; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 22 | Summary: ::array; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 23 | Summary: ::extend; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | -| 24 | Summary: ::extend; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | -| 25 | Summary: ::extend_packed; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 26 | Summary: ::extend_packed; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 27 | Summary: ::from_size_align; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 28 | Summary: ::from_size_align_unchecked; Argument[0]; ReturnValue; taint | -| 29 | Summary: ::pad_to_align; Argument[self].Reference; ReturnValue; taint | -| 30 | Summary: ::repeat; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | -| 31 | Summary: ::repeat_packed; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 32 | Summary: ::size; Argument[self].Reference; ReturnValue; taint | -| 33 | Summary: ::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 34 | Summary: ::add; Argument[self,0]; ReturnValue; taint | -| 35 | Summary: ::mul; Argument[self,0]; ReturnValue; taint | -| 36 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 37 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 38 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 39 | Summary: core::cmp::max; Argument[0]; ReturnValue; value | -| 40 | Summary: core::cmp::min; Argument[0]; ReturnValue; value | +| 7 | Sink: ::alloc; Argument[0]; alloc-layout | +| 8 | Sink: ::alloc_zeroed; Argument[0]; alloc-layout | +| 9 | Sink: ::allocate; Argument[0]; alloc-size | +| 10 | Sink: ::allocate_zeroed; Argument[0]; alloc-size | +| 11 | Sink: ::grow; Argument[2]; alloc-size | +| 12 | Sink: ::grow_zeroed; Argument[2]; alloc-size | +| 13 | Sink: ::shrink; Argument[2]; alloc-size | +| 14 | Sink: alloc::alloc::alloc; Argument[0]; alloc-layout | +| 15 | Sink: alloc::alloc::alloc_zeroed; Argument[0]; alloc-layout | +| 16 | Sink: alloc::alloc::realloc; Argument[2]; alloc-size | +| 17 | Sink: libc::unix::aligned_alloc; Argument[1]; alloc-size | +| 18 | Sink: libc::unix::calloc; Argument[0,1]; alloc-size | +| 19 | Sink: libc::unix::malloc; Argument[0]; alloc-size | +| 20 | Sink: libc::unix::realloc; Argument[1]; alloc-size | +| 21 | Source: std::env::args; ReturnValue.Element; commandargs | +| 22 | Summary: ::deref; Argument[self]; ReturnValue; value | +| 23 | Summary: ::align_to; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 24 | Summary: ::array; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 25 | Summary: ::extend; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | +| 26 | Summary: ::extend; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | +| 27 | Summary: ::extend_packed; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 28 | Summary: ::extend_packed; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 29 | Summary: ::from_size_align; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 30 | Summary: ::from_size_align_unchecked; Argument[0]; ReturnValue; taint | +| 31 | Summary: ::pad_to_align; Argument[self].Reference; ReturnValue; taint | +| 32 | Summary: ::repeat; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | +| 33 | Summary: ::repeat_packed; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 34 | Summary: ::size; Argument[self].Reference; ReturnValue; taint | +| 35 | Summary: ::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 36 | Summary: ::add; Argument[self,0]; ReturnValue; taint | +| 37 | Summary: ::mul; Argument[self,0]; ReturnValue; taint | +| 38 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 39 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 40 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 41 | Summary: core::cmp::max; Argument[0]; ReturnValue; value | +| 42 | Summary: core::cmp::min; Argument[0]; ReturnValue; value | nodes | main.rs:12:36:12:43 | ...: usize | semmle.label | ...: usize | | main.rs:18:41:18:41 | v | semmle.label | v | @@ -423,6 +429,8 @@ nodes | main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | semmle.label | ...::array::<...>(...) [Ok] | | main.rs:192:14:192:56 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:192:46:192:46 | v | semmle.label | v | +| main.rs:195:38:195:39 | l2 | semmle.label | l2 | +| main.rs:196:45:196:46 | l2 | semmle.label | l2 | | main.rs:197:41:197:42 | l2 | semmle.label | l2 | | main.rs:198:48:198:49 | l2 | semmle.label | l2 | | main.rs:199:41:199:42 | l2 | semmle.label | l2 | diff --git a/rust/ql/test/query-tests/security/CWE-770/main.rs b/rust/ql/test/query-tests/security/CWE-770/main.rs index bb3ba37860cc..8581282c6b37 100644 --- a/rust/ql/test/query-tests/security/CWE-770/main.rs +++ b/rust/ql/test/query-tests/security/CWE-770/main.rs @@ -192,8 +192,8 @@ unsafe fn test_system_alloc(v: usize) { let l2 = std::alloc::Layout::array::(v).unwrap(); // These resolve to the blanket `impl GlobalAlloc for A` in `core`, so the target's canonical // path has a type-parameter `Self` (`<_ as ..::GlobalAlloc>::alloc`); the sink model misses it. - let _ = std::alloc::System.alloc(l2); // $ MISSING: Alert[rust/uncontrolled-allocation-size]=arg1 - let _ = std::alloc::System.alloc_zeroed(l2); // $ MISSING: Alert[rust/uncontrolled-allocation-size]=arg1 + let _ = std::alloc::System.alloc(l2); // $ Alert[rust/uncontrolled-allocation-size]=arg1 + let _ = std::alloc::System.alloc_zeroed(l2); // $ Alert[rust/uncontrolled-allocation-size]=arg1 let _ = std::alloc::System.allocate(l2).unwrap(); // $ Alert[rust/uncontrolled-allocation-size]=arg1 let _ = std::alloc::System.allocate_zeroed(l2).unwrap(); // $ Alert[rust/uncontrolled-allocation-size]=arg1 let _ = std::alloc::Global.allocate(l2).unwrap(); // $ Alert[rust/uncontrolled-allocation-size]=arg1 From 11aebd5e7b34d71987d05de7b5fcbf285b7d4d8b Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Thu, 10 Sep 2026 10:39:48 +0200 Subject: [PATCH 0814/2098] Rust: Add model for `GlobalAlloc::realloc` --- .../rust/frameworks/stdlib/alloc.model.yml | 1 + .../UncontrolledAllocationSize.expected | 554 +++++++++--------- .../test/query-tests/security/CWE-770/main.rs | 4 +- 3 files changed, 281 insertions(+), 278 deletions(-) diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml index 738c2c2072aa..67edf4eadfaf 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml @@ -15,6 +15,7 @@ extensions: - ["alloc::alloc::realloc", "Argument[2]", "alloc-size", "manual"] - ["::alloc", "Argument[0]", "alloc-layout", "manual"] - ["::alloc_zeroed", "Argument[0]", "alloc-layout", "manual"] + - ["::realloc", "Argument[2]", "alloc-size", "manual"] - ["::allocate", "Argument[0]", "alloc-layout", "manual"] - ["::allocate_zeroed", "Argument[0]", "alloc-layout", "manual"] - ["::grow", "Argument[2]", "alloc-layout", "manual"] diff --git a/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected b/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected index 71d1423cd8aa..6356fb8c1af3 100644 --- a/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected +++ b/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected @@ -1,151 +1,152 @@ #select -| main.rs:18:41:18:41 | v | main.rs:342:13:342:28 | ...::args(...) | main.rs:18:41:18:41 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:21:31:21:32 | l2 | main.rs:342:13:342:28 | ...::args(...) | main.rs:21:31:21:32 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:22:31:22:53 | ... .unwrap() | main.rs:342:13:342:28 | ...::args(...) | main.rs:22:31:22:53 | ... .unwrap() | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:23:31:23:68 | ... .pad_to_align() | main.rs:342:13:342:28 | ...::args(...) | main.rs:23:31:23:68 | ... .pad_to_align() | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:24:38:24:39 | l2 | main.rs:342:13:342:28 | ...::args(...) | main.rs:24:38:24:39 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:30:31:30:32 | l4 | main.rs:342:13:342:28 | ...::args(...) | main.rs:30:31:30:32 | l4 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:33:31:33:32 | l5 | main.rs:342:13:342:28 | ...::args(...) | main.rs:33:31:33:32 | l5 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:37:31:37:32 | l6 | main.rs:342:13:342:28 | ...::args(...) | main.rs:37:31:37:32 | l6 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:40:31:40:32 | l7 | main.rs:342:13:342:28 | ...::args(...) | main.rs:40:31:40:32 | l7 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:50:31:50:53 | ... .0 | main.rs:342:13:342:28 | ...::args(...) | main.rs:50:31:50:53 | ... .0 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:51:31:51:57 | ... .0 | main.rs:342:13:342:28 | ...::args(...) | main.rs:51:31:51:57 | ... .0 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:53:31:53:58 | ... .unwrap() | main.rs:342:13:342:28 | ...::args(...) | main.rs:53:31:53:58 | ... .unwrap() | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:54:31:54:63 | ... .unwrap() | main.rs:342:13:342:28 | ...::args(...) | main.rs:54:31:54:63 | ... .unwrap() | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:59:31:59:32 | k1 | main.rs:342:13:342:28 | ...::args(...) | main.rs:59:31:59:32 | k1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:61:31:61:32 | k2 | main.rs:342:13:342:28 | ...::args(...) | main.rs:61:31:61:32 | k2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:63:31:63:32 | k3 | main.rs:342:13:342:28 | ...::args(...) | main.rs:63:31:63:32 | k3 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:64:31:64:59 | ... .unwrap() | main.rs:342:13:342:28 | ...::args(...) | main.rs:64:31:64:59 | ... .unwrap() | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:65:31:65:59 | ... .unwrap() | main.rs:342:13:342:28 | ...::args(...) | main.rs:65:31:65:59 | ... .unwrap() | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:68:31:68:32 | l4 | main.rs:342:13:342:28 | ...::args(...) | main.rs:68:31:68:32 | l4 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:88:31:88:36 | layout | main.rs:342:13:342:28 | ...::args(...) | main.rs:88:31:88:36 | layout | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:96:35:96:36 | l1 | main.rs:342:13:342:28 | ...::args(...) | main.rs:96:35:96:36 | l1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:102:35:102:36 | l1 | main.rs:342:13:342:28 | ...::args(...) | main.rs:102:35:102:36 | l1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:103:35:103:36 | l3 | main.rs:342:13:342:28 | ...::args(...) | main.rs:103:35:103:36 | l3 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:109:35:109:36 | l1 | main.rs:342:13:342:28 | ...::args(...) | main.rs:109:35:109:36 | l1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:111:35:111:36 | l1 | main.rs:342:13:342:28 | ...::args(...) | main.rs:111:35:111:36 | l1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:146:35:146:36 | l1 | main.rs:342:13:342:28 | ...::args(...) | main.rs:146:35:146:36 | l1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:148:35:148:36 | l9 | main.rs:342:13:342:28 | ...::args(...) | main.rs:148:35:148:36 | l9 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:152:31:152:33 | l10 | main.rs:342:13:342:28 | ...::args(...) | main.rs:152:31:152:33 | l10 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:155:31:155:33 | l11 | main.rs:342:13:342:28 | ...::args(...) | main.rs:155:31:155:33 | l11 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:162:35:162:37 | l13 | main.rs:342:13:342:28 | ...::args(...) | main.rs:162:35:162:37 | l13 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:169:35:169:37 | l13 | main.rs:342:13:342:28 | ...::args(...) | main.rs:169:35:169:37 | l13 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:177:31:177:32 | l1 | main.rs:342:13:342:28 | ...::args(...) | main.rs:177:31:177:32 | l1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:195:38:195:39 | l2 | main.rs:342:13:342:28 | ...::args(...) | main.rs:195:38:195:39 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:196:45:196:46 | l2 | main.rs:342:13:342:28 | ...::args(...) | main.rs:196:45:196:46 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:197:41:197:42 | l2 | main.rs:342:13:342:28 | ...::args(...) | main.rs:197:41:197:42 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:198:48:198:49 | l2 | main.rs:342:13:342:28 | ...::args(...) | main.rs:198:48:198:49 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:199:41:199:42 | l2 | main.rs:342:13:342:28 | ...::args(...) | main.rs:199:41:199:42 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:200:48:200:49 | l2 | main.rs:342:13:342:28 | ...::args(...) | main.rs:200:48:200:49 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:211:53:211:54 | l2 | main.rs:342:13:342:28 | ...::args(...) | main.rs:211:53:211:54 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:213:60:213:61 | l2 | main.rs:342:13:342:28 | ...::args(...) | main.rs:213:60:213:61 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:216:51:216:52 | l2 | main.rs:342:13:342:28 | ...::args(...) | main.rs:216:51:216:52 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:222:26:222:26 | v | main.rs:342:13:342:28 | ...::args(...) | main.rs:222:26:222:26 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:223:36:223:36 | v | main.rs:342:13:342:28 | ...::args(...) | main.rs:223:36:223:36 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:225:30:225:30 | v | main.rs:342:13:342:28 | ...::args(...) | main.rs:225:30:225:30 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:226:26:226:26 | v | main.rs:342:13:342:28 | ...::args(...) | main.rs:226:26:226:26 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:227:31:227:31 | v | main.rs:342:13:342:28 | ...::args(...) | main.rs:227:31:227:31 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:231:43:231:43 | v | main.rs:342:13:342:28 | ...::args(...) | main.rs:231:43:231:43 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:232:39:232:39 | v | main.rs:342:13:342:28 | ...::args(...) | main.rs:232:39:232:39 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:233:46:233:46 | v | main.rs:342:13:342:28 | ...::args(...) | main.rs:233:46:233:46 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:234:42:234:42 | v | main.rs:342:13:342:28 | ...::args(...) | main.rs:234:42:234:42 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | -| main.rs:290:40:290:45 | layout | main.rs:314:25:314:40 | ...::args(...) | main.rs:290:40:290:45 | layout | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:314:25:314:40 | ...::args(...) | user-provided value | -| main.rs:334:26:334:26 | a | main.rs:342:13:342:28 | ...::args(...) | main.rs:334:26:334:26 | a | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:342:13:342:28 | ...::args(...) | user-provided value | +| main.rs:18:41:18:41 | v | main.rs:340:13:340:28 | ...::args(...) | main.rs:18:41:18:41 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:21:31:21:32 | l2 | main.rs:340:13:340:28 | ...::args(...) | main.rs:21:31:21:32 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:22:31:22:53 | ... .unwrap() | main.rs:340:13:340:28 | ...::args(...) | main.rs:22:31:22:53 | ... .unwrap() | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:23:31:23:68 | ... .pad_to_align() | main.rs:340:13:340:28 | ...::args(...) | main.rs:23:31:23:68 | ... .pad_to_align() | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:24:38:24:39 | l2 | main.rs:340:13:340:28 | ...::args(...) | main.rs:24:38:24:39 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:30:31:30:32 | l4 | main.rs:340:13:340:28 | ...::args(...) | main.rs:30:31:30:32 | l4 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:33:31:33:32 | l5 | main.rs:340:13:340:28 | ...::args(...) | main.rs:33:31:33:32 | l5 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:37:31:37:32 | l6 | main.rs:340:13:340:28 | ...::args(...) | main.rs:37:31:37:32 | l6 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:40:31:40:32 | l7 | main.rs:340:13:340:28 | ...::args(...) | main.rs:40:31:40:32 | l7 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:50:31:50:53 | ... .0 | main.rs:340:13:340:28 | ...::args(...) | main.rs:50:31:50:53 | ... .0 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:51:31:51:57 | ... .0 | main.rs:340:13:340:28 | ...::args(...) | main.rs:51:31:51:57 | ... .0 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:53:31:53:58 | ... .unwrap() | main.rs:340:13:340:28 | ...::args(...) | main.rs:53:31:53:58 | ... .unwrap() | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:54:31:54:63 | ... .unwrap() | main.rs:340:13:340:28 | ...::args(...) | main.rs:54:31:54:63 | ... .unwrap() | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:59:31:59:32 | k1 | main.rs:340:13:340:28 | ...::args(...) | main.rs:59:31:59:32 | k1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:61:31:61:32 | k2 | main.rs:340:13:340:28 | ...::args(...) | main.rs:61:31:61:32 | k2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:63:31:63:32 | k3 | main.rs:340:13:340:28 | ...::args(...) | main.rs:63:31:63:32 | k3 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:64:31:64:59 | ... .unwrap() | main.rs:340:13:340:28 | ...::args(...) | main.rs:64:31:64:59 | ... .unwrap() | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:65:31:65:59 | ... .unwrap() | main.rs:340:13:340:28 | ...::args(...) | main.rs:65:31:65:59 | ... .unwrap() | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:68:31:68:32 | l4 | main.rs:340:13:340:28 | ...::args(...) | main.rs:68:31:68:32 | l4 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:88:31:88:36 | layout | main.rs:340:13:340:28 | ...::args(...) | main.rs:88:31:88:36 | layout | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:96:35:96:36 | l1 | main.rs:340:13:340:28 | ...::args(...) | main.rs:96:35:96:36 | l1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:102:35:102:36 | l1 | main.rs:340:13:340:28 | ...::args(...) | main.rs:102:35:102:36 | l1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:103:35:103:36 | l3 | main.rs:340:13:340:28 | ...::args(...) | main.rs:103:35:103:36 | l3 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:109:35:109:36 | l1 | main.rs:340:13:340:28 | ...::args(...) | main.rs:109:35:109:36 | l1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:111:35:111:36 | l1 | main.rs:340:13:340:28 | ...::args(...) | main.rs:111:35:111:36 | l1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:146:35:146:36 | l1 | main.rs:340:13:340:28 | ...::args(...) | main.rs:146:35:146:36 | l1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:148:35:148:36 | l9 | main.rs:340:13:340:28 | ...::args(...) | main.rs:148:35:148:36 | l9 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:152:31:152:33 | l10 | main.rs:340:13:340:28 | ...::args(...) | main.rs:152:31:152:33 | l10 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:155:31:155:33 | l11 | main.rs:340:13:340:28 | ...::args(...) | main.rs:155:31:155:33 | l11 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:162:35:162:37 | l13 | main.rs:340:13:340:28 | ...::args(...) | main.rs:162:35:162:37 | l13 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:169:35:169:37 | l13 | main.rs:340:13:340:28 | ...::args(...) | main.rs:169:35:169:37 | l13 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:177:31:177:32 | l1 | main.rs:340:13:340:28 | ...::args(...) | main.rs:177:31:177:32 | l1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:193:38:193:39 | l2 | main.rs:340:13:340:28 | ...::args(...) | main.rs:193:38:193:39 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:194:45:194:46 | l2 | main.rs:340:13:340:28 | ...::args(...) | main.rs:194:45:194:46 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:195:41:195:42 | l2 | main.rs:340:13:340:28 | ...::args(...) | main.rs:195:41:195:42 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:196:48:196:49 | l2 | main.rs:340:13:340:28 | ...::args(...) | main.rs:196:48:196:49 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:197:41:197:42 | l2 | main.rs:340:13:340:28 | ...::args(...) | main.rs:197:41:197:42 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:198:48:198:49 | l2 | main.rs:340:13:340:28 | ...::args(...) | main.rs:198:48:198:49 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:203:48:203:48 | v | main.rs:340:13:340:28 | ...::args(...) | main.rs:203:48:203:48 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:209:53:209:54 | l2 | main.rs:340:13:340:28 | ...::args(...) | main.rs:209:53:209:54 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:211:60:211:61 | l2 | main.rs:340:13:340:28 | ...::args(...) | main.rs:211:60:211:61 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:214:51:214:52 | l2 | main.rs:340:13:340:28 | ...::args(...) | main.rs:214:51:214:52 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:220:26:220:26 | v | main.rs:340:13:340:28 | ...::args(...) | main.rs:220:26:220:26 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:221:36:221:36 | v | main.rs:340:13:340:28 | ...::args(...) | main.rs:221:36:221:36 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:223:30:223:30 | v | main.rs:340:13:340:28 | ...::args(...) | main.rs:223:30:223:30 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:224:26:224:26 | v | main.rs:340:13:340:28 | ...::args(...) | main.rs:224:26:224:26 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:225:31:225:31 | v | main.rs:340:13:340:28 | ...::args(...) | main.rs:225:31:225:31 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:229:43:229:43 | v | main.rs:340:13:340:28 | ...::args(...) | main.rs:229:43:229:43 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:230:39:230:39 | v | main.rs:340:13:340:28 | ...::args(...) | main.rs:230:39:230:39 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:231:46:231:46 | v | main.rs:340:13:340:28 | ...::args(...) | main.rs:231:46:231:46 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:232:42:232:42 | v | main.rs:340:13:340:28 | ...::args(...) | main.rs:232:42:232:42 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:288:40:288:45 | layout | main.rs:312:25:312:40 | ...::args(...) | main.rs:288:40:288:45 | layout | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:312:25:312:40 | ...::args(...) | user-provided value | +| main.rs:332:26:332:26 | a | main.rs:340:13:340:28 | ...::args(...) | main.rs:332:26:332:26 | a | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | edges -| main.rs:12:36:12:43 | ...: usize | main.rs:18:41:18:41 | v | provenance | Sink:MaD:16 | +| main.rs:12:36:12:43 | ...: usize | main.rs:18:41:18:41 | v | provenance | Sink:MaD:17 | | main.rs:12:36:12:43 | ...: usize | main.rs:20:50:20:50 | v | provenance | | | main.rs:12:36:12:43 | ...: usize | main.rs:29:60:29:60 | v | provenance | | | main.rs:12:36:12:43 | ...: usize | main.rs:32:60:32:60 | v | provenance | | | main.rs:12:36:12:43 | ...: usize | main.rs:35:49:35:49 | v | provenance | | -| main.rs:20:9:20:10 | l2 | main.rs:21:31:21:32 | l2 | provenance | Sink:MaD:14 | +| main.rs:20:9:20:10 | l2 | main.rs:21:31:21:32 | l2 | provenance | Sink:MaD:15 | | main.rs:20:9:20:10 | l2 | main.rs:22:31:22:32 | l2 | provenance | | | main.rs:20:9:20:10 | l2 | main.rs:23:31:23:32 | l2 | provenance | | -| main.rs:20:9:20:10 | l2 | main.rs:24:38:24:39 | l2 | provenance | Sink:MaD:15 | -| main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | main.rs:20:14:20:63 | ... .unwrap() | provenance | MaD:40 | +| main.rs:20:9:20:10 | l2 | main.rs:24:38:24:39 | l2 | provenance | Sink:MaD:16 | +| main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | main.rs:20:14:20:63 | ... .unwrap() | provenance | MaD:41 | | main.rs:20:14:20:63 | ... .unwrap() | main.rs:20:9:20:10 | l2 | provenance | | -| main.rs:20:50:20:50 | v | main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | provenance | MaD:29 | -| main.rs:22:31:22:32 | l2 | main.rs:22:31:22:44 | l2.align_to(...) [Ok] | provenance | MaD:23 | -| main.rs:22:31:22:44 | l2.align_to(...) [Ok] | main.rs:22:31:22:53 | ... .unwrap() | provenance | MaD:40 | -| main.rs:22:31:22:53 | ... .unwrap() | main.rs:22:31:22:53 | ... .unwrap() | provenance | Sink:MaD:14 | -| main.rs:23:31:23:32 | l2 | main.rs:23:31:23:44 | l2.align_to(...) [Ok] | provenance | MaD:23 | -| main.rs:23:31:23:44 | l2.align_to(...) [Ok] | main.rs:23:31:23:53 | ... .unwrap() | provenance | MaD:40 | -| main.rs:23:31:23:53 | ... .unwrap() | main.rs:23:31:23:68 | ... .pad_to_align() | provenance | MaD:31 | -| main.rs:23:31:23:68 | ... .pad_to_align() | main.rs:23:31:23:68 | ... .pad_to_align() | provenance | Sink:MaD:14 | -| main.rs:29:9:29:10 | l4 | main.rs:30:31:30:32 | l4 | provenance | Sink:MaD:14 | +| main.rs:20:50:20:50 | v | main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | provenance | MaD:30 | +| main.rs:22:31:22:32 | l2 | main.rs:22:31:22:44 | l2.align_to(...) [Ok] | provenance | MaD:24 | +| main.rs:22:31:22:44 | l2.align_to(...) [Ok] | main.rs:22:31:22:53 | ... .unwrap() | provenance | MaD:41 | +| main.rs:22:31:22:53 | ... .unwrap() | main.rs:22:31:22:53 | ... .unwrap() | provenance | Sink:MaD:15 | +| main.rs:23:31:23:32 | l2 | main.rs:23:31:23:44 | l2.align_to(...) [Ok] | provenance | MaD:24 | +| main.rs:23:31:23:44 | l2.align_to(...) [Ok] | main.rs:23:31:23:53 | ... .unwrap() | provenance | MaD:41 | +| main.rs:23:31:23:53 | ... .unwrap() | main.rs:23:31:23:68 | ... .pad_to_align() | provenance | MaD:32 | +| main.rs:23:31:23:68 | ... .pad_to_align() | main.rs:23:31:23:68 | ... .pad_to_align() | provenance | Sink:MaD:15 | +| main.rs:29:9:29:10 | l4 | main.rs:30:31:30:32 | l4 | provenance | Sink:MaD:15 | | main.rs:29:14:29:64 | ...::from_size_align_unchecked(...) | main.rs:29:9:29:10 | l4 | provenance | | -| main.rs:29:60:29:60 | v | main.rs:29:14:29:64 | ...::from_size_align_unchecked(...) | provenance | MaD:30 | -| main.rs:32:9:32:10 | l5 | main.rs:33:31:33:32 | l5 | provenance | Sink:MaD:14 | +| main.rs:29:60:29:60 | v | main.rs:29:14:29:64 | ...::from_size_align_unchecked(...) | provenance | MaD:31 | +| main.rs:32:9:32:10 | l5 | main.rs:33:31:33:32 | l5 | provenance | Sink:MaD:15 | | main.rs:32:14:32:118 | ...::from_size_align_unchecked(...) | main.rs:32:9:32:10 | l5 | provenance | | -| main.rs:32:60:32:60 | v | main.rs:32:60:32:89 | ... * ... | provenance | MaD:37 | -| main.rs:32:60:32:89 | ... * ... | main.rs:32:14:32:118 | ...::from_size_align_unchecked(...) | provenance | MaD:30 | +| main.rs:32:60:32:60 | v | main.rs:32:60:32:89 | ... * ... | provenance | MaD:38 | +| main.rs:32:60:32:89 | ... * ... | main.rs:32:14:32:118 | ...::from_size_align_unchecked(...) | provenance | MaD:31 | | main.rs:35:9:35:10 | s6 | main.rs:36:60:36:61 | s6 | provenance | | | main.rs:35:14:35:54 | ... + ... | main.rs:35:9:35:10 | s6 | provenance | | -| main.rs:35:15:35:49 | ... * ... | main.rs:35:14:35:54 | ... + ... | provenance | MaD:36 | -| main.rs:35:49:35:49 | v | main.rs:35:15:35:49 | ... * ... | provenance | MaD:37 | -| main.rs:36:9:36:10 | l6 | main.rs:37:31:37:32 | l6 | provenance | Sink:MaD:14 | +| main.rs:35:15:35:49 | ... * ... | main.rs:35:14:35:54 | ... + ... | provenance | MaD:37 | +| main.rs:35:49:35:49 | v | main.rs:35:15:35:49 | ... * ... | provenance | MaD:38 | +| main.rs:36:9:36:10 | l6 | main.rs:37:31:37:32 | l6 | provenance | Sink:MaD:15 | | main.rs:36:9:36:10 | l6 | main.rs:39:60:39:61 | l6 | provenance | | | main.rs:36:14:36:65 | ...::from_size_align_unchecked(...) | main.rs:36:9:36:10 | l6 | provenance | | -| main.rs:36:60:36:61 | s6 | main.rs:36:14:36:65 | ...::from_size_align_unchecked(...) | provenance | MaD:30 | -| main.rs:39:9:39:10 | l7 | main.rs:40:31:40:32 | l7 | provenance | Sink:MaD:14 | +| main.rs:36:60:36:61 | s6 | main.rs:36:14:36:65 | ...::from_size_align_unchecked(...) | provenance | MaD:31 | +| main.rs:39:9:39:10 | l7 | main.rs:40:31:40:32 | l7 | provenance | Sink:MaD:15 | | main.rs:39:14:39:72 | ...::from_size_align_unchecked(...) | main.rs:39:9:39:10 | l7 | provenance | | -| main.rs:39:60:39:61 | l6 | main.rs:39:60:39:68 | l6.size() | provenance | MaD:34 | -| main.rs:39:60:39:68 | l6.size() | main.rs:39:14:39:72 | ...::from_size_align_unchecked(...) | provenance | MaD:30 | +| main.rs:39:60:39:61 | l6 | main.rs:39:60:39:68 | l6.size() | provenance | MaD:35 | +| main.rs:39:60:39:68 | l6.size() | main.rs:39:14:39:72 | ...::from_size_align_unchecked(...) | provenance | MaD:31 | | main.rs:43:44:43:51 | ...: usize | main.rs:50:41:50:41 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:51:41:51:41 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:53:48:53:48 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:54:48:54:48 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:58:34:58:34 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:67:46:67:46 | v | provenance | | -| main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | main.rs:50:31:50:51 | ... .unwrap() [tuple.0] | provenance | MaD:40 | +| main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | main.rs:50:31:50:51 | ... .unwrap() [tuple.0] | provenance | MaD:41 | | main.rs:50:31:50:51 | ... .unwrap() [tuple.0] | main.rs:50:31:50:53 | ... .0 | provenance | | -| main.rs:50:31:50:53 | ... .0 | main.rs:50:31:50:53 | ... .0 | provenance | Sink:MaD:14 | -| main.rs:50:41:50:41 | v | main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:32 | -| main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | main.rs:51:31:51:55 | ... .unwrap() [tuple.0] | provenance | MaD:40 | +| main.rs:50:31:50:53 | ... .0 | main.rs:50:31:50:53 | ... .0 | provenance | Sink:MaD:15 | +| main.rs:50:41:50:41 | v | main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:33 | +| main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | main.rs:51:31:51:55 | ... .unwrap() [tuple.0] | provenance | MaD:41 | | main.rs:51:31:51:55 | ... .unwrap() [tuple.0] | main.rs:51:31:51:57 | ... .0 | provenance | | -| main.rs:51:31:51:57 | ... .0 | main.rs:51:31:51:57 | ... .0 | provenance | Sink:MaD:14 | -| main.rs:51:41:51:41 | v | main.rs:51:41:51:45 | ... + ... | provenance | MaD:36 | -| main.rs:51:41:51:45 | ... + ... | main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:32 | -| main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | main.rs:53:31:53:58 | ... .unwrap() | provenance | MaD:40 | -| main.rs:53:31:53:58 | ... .unwrap() | main.rs:53:31:53:58 | ... .unwrap() | provenance | Sink:MaD:14 | -| main.rs:53:48:53:48 | v | main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | provenance | MaD:33 | -| main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | main.rs:54:31:54:63 | ... .unwrap() | provenance | MaD:40 | -| main.rs:54:31:54:63 | ... .unwrap() | main.rs:54:31:54:63 | ... .unwrap() | provenance | Sink:MaD:14 | -| main.rs:54:48:54:48 | v | main.rs:54:48:54:53 | ... * ... | provenance | MaD:37 | -| main.rs:54:48:54:53 | ... * ... | main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | provenance | MaD:33 | +| main.rs:51:31:51:57 | ... .0 | main.rs:51:31:51:57 | ... .0 | provenance | Sink:MaD:15 | +| main.rs:51:41:51:41 | v | main.rs:51:41:51:45 | ... + ... | provenance | MaD:37 | +| main.rs:51:41:51:45 | ... + ... | main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:33 | +| main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | main.rs:53:31:53:58 | ... .unwrap() | provenance | MaD:41 | +| main.rs:53:31:53:58 | ... .unwrap() | main.rs:53:31:53:58 | ... .unwrap() | provenance | Sink:MaD:15 | +| main.rs:53:48:53:48 | v | main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | provenance | MaD:34 | +| main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | main.rs:54:31:54:63 | ... .unwrap() | provenance | MaD:41 | +| main.rs:54:31:54:63 | ... .unwrap() | main.rs:54:31:54:63 | ... .unwrap() | provenance | Sink:MaD:15 | +| main.rs:54:48:54:48 | v | main.rs:54:48:54:53 | ... * ... | provenance | MaD:38 | +| main.rs:54:48:54:53 | ... * ... | main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | provenance | MaD:34 | | main.rs:58:9:58:20 | TuplePat [tuple.0] | main.rs:58:10:58:11 | k1 | provenance | | -| main.rs:58:10:58:11 | k1 | main.rs:59:31:59:32 | k1 | provenance | Sink:MaD:14 | +| main.rs:58:10:58:11 | k1 | main.rs:59:31:59:32 | k1 | provenance | Sink:MaD:15 | | main.rs:58:10:58:11 | k1 | main.rs:60:34:60:35 | k1 | provenance | | | main.rs:58:10:58:11 | k1 | main.rs:62:24:62:25 | k1 | provenance | | | main.rs:58:10:58:11 | k1 | main.rs:64:48:64:49 | k1 | provenance | | | main.rs:58:10:58:11 | k1 | main.rs:65:31:65:32 | k1 | provenance | | -| main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | main.rs:58:24:58:66 | ... .expect(...) [tuple.0] | provenance | MaD:39 | +| main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | main.rs:58:24:58:66 | ... .expect(...) [tuple.0] | provenance | MaD:40 | | main.rs:58:24:58:66 | ... .expect(...) [tuple.0] | main.rs:58:9:58:20 | TuplePat [tuple.0] | provenance | | -| main.rs:58:34:58:34 | v | main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | provenance | MaD:32 | +| main.rs:58:34:58:34 | v | main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | provenance | MaD:33 | | main.rs:60:9:60:20 | TuplePat [tuple.0] | main.rs:60:10:60:11 | k2 | provenance | | -| main.rs:60:10:60:11 | k2 | main.rs:61:31:61:32 | k2 | provenance | Sink:MaD:14 | -| main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | main.rs:60:24:60:45 | ... .unwrap() [tuple.0] | provenance | MaD:40 | +| main.rs:60:10:60:11 | k2 | main.rs:61:31:61:32 | k2 | provenance | Sink:MaD:15 | +| main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | main.rs:60:24:60:45 | ... .unwrap() [tuple.0] | provenance | MaD:41 | | main.rs:60:24:60:45 | ... .unwrap() [tuple.0] | main.rs:60:9:60:20 | TuplePat [tuple.0] | provenance | | -| main.rs:60:34:60:35 | k1 | main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | provenance | MaD:25 | +| main.rs:60:34:60:35 | k1 | main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | provenance | MaD:26 | | main.rs:62:9:62:20 | TuplePat [tuple.0] | main.rs:62:10:62:11 | k3 | provenance | | -| main.rs:62:10:62:11 | k3 | main.rs:63:31:63:32 | k3 | provenance | Sink:MaD:14 | -| main.rs:62:24:62:25 | k1 | main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | provenance | MaD:26 | -| main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | main.rs:62:24:62:45 | ... .unwrap() [tuple.0] | provenance | MaD:40 | +| main.rs:62:10:62:11 | k3 | main.rs:63:31:63:32 | k3 | provenance | Sink:MaD:15 | +| main.rs:62:24:62:25 | k1 | main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | provenance | MaD:27 | +| main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | main.rs:62:24:62:45 | ... .unwrap() [tuple.0] | provenance | MaD:41 | | main.rs:62:24:62:45 | ... .unwrap() [tuple.0] | main.rs:62:9:62:20 | TuplePat [tuple.0] | provenance | | -| main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | main.rs:64:31:64:59 | ... .unwrap() | provenance | MaD:40 | -| main.rs:64:31:64:59 | ... .unwrap() | main.rs:64:31:64:59 | ... .unwrap() | provenance | Sink:MaD:14 | -| main.rs:64:48:64:49 | k1 | main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | provenance | MaD:27 | -| main.rs:65:31:65:32 | k1 | main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | provenance | MaD:28 | -| main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | main.rs:65:31:65:59 | ... .unwrap() | provenance | MaD:40 | -| main.rs:65:31:65:59 | ... .unwrap() | main.rs:65:31:65:59 | ... .unwrap() | provenance | Sink:MaD:14 | -| main.rs:67:9:67:10 | l4 | main.rs:68:31:68:32 | l4 | provenance | Sink:MaD:14 | -| main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | main.rs:67:14:67:56 | ... .unwrap() | provenance | MaD:40 | +| main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | main.rs:64:31:64:59 | ... .unwrap() | provenance | MaD:41 | +| main.rs:64:31:64:59 | ... .unwrap() | main.rs:64:31:64:59 | ... .unwrap() | provenance | Sink:MaD:15 | +| main.rs:64:48:64:49 | k1 | main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | provenance | MaD:28 | +| main.rs:65:31:65:32 | k1 | main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | provenance | MaD:29 | +| main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | main.rs:65:31:65:59 | ... .unwrap() | provenance | MaD:41 | +| main.rs:65:31:65:59 | ... .unwrap() | main.rs:65:31:65:59 | ... .unwrap() | provenance | Sink:MaD:15 | +| main.rs:67:9:67:10 | l4 | main.rs:68:31:68:32 | l4 | provenance | Sink:MaD:15 | +| main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | main.rs:67:14:67:56 | ... .unwrap() | provenance | MaD:41 | | main.rs:67:14:67:56 | ... .unwrap() | main.rs:67:9:67:10 | l4 | provenance | | -| main.rs:67:46:67:46 | v | main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | provenance | MaD:24 | +| main.rs:67:46:67:46 | v | main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | | main.rs:86:35:86:42 | ...: usize | main.rs:87:54:87:54 | v | provenance | | -| main.rs:87:9:87:14 | layout | main.rs:88:31:88:36 | layout | provenance | Sink:MaD:14 | -| main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | main.rs:87:18:87:67 | ... .unwrap() | provenance | MaD:40 | +| main.rs:87:9:87:14 | layout | main.rs:88:31:88:36 | layout | provenance | Sink:MaD:15 | +| main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | main.rs:87:18:87:67 | ... .unwrap() | provenance | MaD:41 | | main.rs:87:18:87:67 | ... .unwrap() | main.rs:87:9:87:14 | layout | provenance | | -| main.rs:87:54:87:54 | v | main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | provenance | MaD:29 | +| main.rs:87:54:87:54 | v | main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | provenance | MaD:30 | | main.rs:91:38:91:45 | ...: usize | main.rs:92:47:92:47 | v | provenance | | | main.rs:91:38:91:45 | ...: usize | main.rs:101:51:101:51 | v | provenance | | | main.rs:91:38:91:45 | ...: usize | main.rs:105:33:105:33 | v | provenance | | @@ -153,96 +154,97 @@ edges | main.rs:91:38:91:45 | ...: usize | main.rs:151:62:151:62 | v | provenance | | | main.rs:91:38:91:45 | ...: usize | main.rs:154:62:154:62 | v | provenance | | | main.rs:91:38:91:45 | ...: usize | main.rs:161:55:161:55 | v | provenance | | -| main.rs:92:9:92:10 | l1 | main.rs:96:35:96:36 | l1 | provenance | Sink:MaD:14 | -| main.rs:92:9:92:10 | l1 | main.rs:102:35:102:36 | l1 | provenance | Sink:MaD:14 | -| main.rs:92:9:92:10 | l1 | main.rs:109:35:109:36 | l1 | provenance | Sink:MaD:14 | -| main.rs:92:9:92:10 | l1 | main.rs:111:35:111:36 | l1 | provenance | Sink:MaD:14 | -| main.rs:92:9:92:10 | l1 | main.rs:146:35:146:36 | l1 | provenance | Sink:MaD:14 | -| main.rs:92:9:92:10 | l1 | main.rs:177:31:177:32 | l1 | provenance | Sink:MaD:14 | -| main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | main.rs:92:14:92:57 | ... .unwrap() | provenance | MaD:40 | +| main.rs:92:9:92:10 | l1 | main.rs:96:35:96:36 | l1 | provenance | Sink:MaD:15 | +| main.rs:92:9:92:10 | l1 | main.rs:102:35:102:36 | l1 | provenance | Sink:MaD:15 | +| main.rs:92:9:92:10 | l1 | main.rs:109:35:109:36 | l1 | provenance | Sink:MaD:15 | +| main.rs:92:9:92:10 | l1 | main.rs:111:35:111:36 | l1 | provenance | Sink:MaD:15 | +| main.rs:92:9:92:10 | l1 | main.rs:146:35:146:36 | l1 | provenance | Sink:MaD:15 | +| main.rs:92:9:92:10 | l1 | main.rs:177:31:177:32 | l1 | provenance | Sink:MaD:15 | +| main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | main.rs:92:14:92:57 | ... .unwrap() | provenance | MaD:41 | | main.rs:92:14:92:57 | ... .unwrap() | main.rs:92:9:92:10 | l1 | provenance | | -| main.rs:92:47:92:47 | v | main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | provenance | MaD:24 | -| main.rs:101:13:101:14 | l3 | main.rs:103:35:103:36 | l3 | provenance | Sink:MaD:14 | -| main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | main.rs:101:18:101:61 | ... .unwrap() | provenance | MaD:40 | +| main.rs:92:47:92:47 | v | main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | +| main.rs:101:13:101:14 | l3 | main.rs:103:35:103:36 | l3 | provenance | Sink:MaD:15 | +| main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | main.rs:101:18:101:61 | ... .unwrap() | provenance | MaD:41 | | main.rs:101:18:101:61 | ... .unwrap() | main.rs:101:13:101:14 | l3 | provenance | | -| main.rs:101:51:101:51 | v | main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | provenance | MaD:24 | +| main.rs:101:51:101:51 | v | main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | | main.rs:105:33:105:33 | v | main.rs:86:35:86:42 | ...: usize | provenance | | -| main.rs:145:13:145:14 | l9 | main.rs:148:35:148:36 | l9 | provenance | Sink:MaD:14 | -| main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | main.rs:145:18:145:61 | ... .unwrap() | provenance | MaD:40 | +| main.rs:145:13:145:14 | l9 | main.rs:148:35:148:36 | l9 | provenance | Sink:MaD:15 | +| main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | main.rs:145:18:145:61 | ... .unwrap() | provenance | MaD:41 | | main.rs:145:18:145:61 | ... .unwrap() | main.rs:145:13:145:14 | l9 | provenance | | -| main.rs:145:51:145:51 | v | main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | provenance | MaD:24 | -| main.rs:151:9:151:11 | l10 | main.rs:152:31:152:33 | l10 | provenance | Sink:MaD:14 | -| main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | main.rs:151:15:151:78 | ... .unwrap() | provenance | MaD:40 | +| main.rs:145:51:145:51 | v | main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | +| main.rs:151:9:151:11 | l10 | main.rs:152:31:152:33 | l10 | provenance | Sink:MaD:15 | +| main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | main.rs:151:15:151:78 | ... .unwrap() | provenance | MaD:41 | | main.rs:151:15:151:78 | ... .unwrap() | main.rs:151:9:151:11 | l10 | provenance | | -| main.rs:151:48:151:68 | ...::min(...) | main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | provenance | MaD:24 | -| main.rs:151:62:151:62 | v | main.rs:151:48:151:68 | ...::min(...) | provenance | MaD:42 | -| main.rs:154:9:154:11 | l11 | main.rs:155:31:155:33 | l11 | provenance | Sink:MaD:14 | -| main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | main.rs:154:15:154:78 | ... .unwrap() | provenance | MaD:40 | +| main.rs:151:48:151:68 | ...::min(...) | main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | +| main.rs:151:62:151:62 | v | main.rs:151:48:151:68 | ...::min(...) | provenance | MaD:43 | +| main.rs:154:9:154:11 | l11 | main.rs:155:31:155:33 | l11 | provenance | Sink:MaD:15 | +| main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | main.rs:154:15:154:78 | ... .unwrap() | provenance | MaD:41 | | main.rs:154:15:154:78 | ... .unwrap() | main.rs:154:9:154:11 | l11 | provenance | | -| main.rs:154:48:154:68 | ...::max(...) | main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | provenance | MaD:24 | -| main.rs:154:62:154:62 | v | main.rs:154:48:154:68 | ...::max(...) | provenance | MaD:41 | -| main.rs:161:13:161:15 | l13 | main.rs:162:35:162:37 | l13 | provenance | Sink:MaD:14 | -| main.rs:161:13:161:15 | l13 | main.rs:169:35:169:37 | l13 | provenance | Sink:MaD:14 | -| main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | main.rs:161:19:161:68 | ... .unwrap() | provenance | MaD:40 | +| main.rs:154:48:154:68 | ...::max(...) | main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | +| main.rs:154:62:154:62 | v | main.rs:154:48:154:68 | ...::max(...) | provenance | MaD:42 | +| main.rs:161:13:161:15 | l13 | main.rs:162:35:162:37 | l13 | provenance | Sink:MaD:15 | +| main.rs:161:13:161:15 | l13 | main.rs:169:35:169:37 | l13 | provenance | Sink:MaD:15 | +| main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | main.rs:161:19:161:68 | ... .unwrap() | provenance | MaD:41 | | main.rs:161:19:161:68 | ... .unwrap() | main.rs:161:13:161:15 | l13 | provenance | | -| main.rs:161:55:161:55 | v | main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | provenance | MaD:29 | +| main.rs:161:55:161:55 | v | main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | provenance | MaD:30 | | main.rs:183:29:183:36 | ...: usize | main.rs:192:46:192:46 | v | provenance | | -| main.rs:192:9:192:10 | l2 | main.rs:195:38:195:39 | l2 | provenance | Sink:MaD:7 | -| main.rs:192:9:192:10 | l2 | main.rs:196:45:196:46 | l2 | provenance | Sink:MaD:8 | -| main.rs:192:9:192:10 | l2 | main.rs:197:41:197:42 | l2 | provenance | Sink:MaD:9 | -| main.rs:192:9:192:10 | l2 | main.rs:198:48:198:49 | l2 | provenance | Sink:MaD:10 | -| main.rs:192:9:192:10 | l2 | main.rs:199:41:199:42 | l2 | provenance | Sink:MaD:1 | -| main.rs:192:9:192:10 | l2 | main.rs:200:48:200:49 | l2 | provenance | Sink:MaD:2 | -| main.rs:192:9:192:10 | l2 | main.rs:211:53:211:54 | l2 | provenance | Sink:MaD:11 | -| main.rs:192:9:192:10 | l2 | main.rs:213:60:213:61 | l2 | provenance | Sink:MaD:12 | -| main.rs:192:9:192:10 | l2 | main.rs:216:51:216:52 | l2 | provenance | Sink:MaD:13 | -| main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | main.rs:192:14:192:56 | ... .unwrap() | provenance | MaD:40 | +| main.rs:183:29:183:36 | ...: usize | main.rs:203:48:203:48 | v | provenance | Sink:MaD:9 | +| main.rs:192:9:192:10 | l2 | main.rs:193:38:193:39 | l2 | provenance | Sink:MaD:7 | +| main.rs:192:9:192:10 | l2 | main.rs:194:45:194:46 | l2 | provenance | Sink:MaD:8 | +| main.rs:192:9:192:10 | l2 | main.rs:195:41:195:42 | l2 | provenance | Sink:MaD:10 | +| main.rs:192:9:192:10 | l2 | main.rs:196:48:196:49 | l2 | provenance | Sink:MaD:11 | +| main.rs:192:9:192:10 | l2 | main.rs:197:41:197:42 | l2 | provenance | Sink:MaD:1 | +| main.rs:192:9:192:10 | l2 | main.rs:198:48:198:49 | l2 | provenance | Sink:MaD:2 | +| main.rs:192:9:192:10 | l2 | main.rs:209:53:209:54 | l2 | provenance | Sink:MaD:12 | +| main.rs:192:9:192:10 | l2 | main.rs:211:60:211:61 | l2 | provenance | Sink:MaD:13 | +| main.rs:192:9:192:10 | l2 | main.rs:214:51:214:52 | l2 | provenance | Sink:MaD:14 | +| main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | main.rs:192:14:192:56 | ... .unwrap() | provenance | MaD:41 | | main.rs:192:14:192:56 | ... .unwrap() | main.rs:192:9:192:10 | l2 | provenance | | -| main.rs:192:46:192:46 | v | main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | provenance | MaD:24 | -| main.rs:220:27:220:34 | ...: usize | main.rs:222:26:222:26 | v | provenance | Sink:MaD:19 | -| main.rs:220:27:220:34 | ...: usize | main.rs:223:36:223:36 | v | provenance | Sink:MaD:17 | -| main.rs:220:27:220:34 | ...: usize | main.rs:225:30:225:30 | v | provenance | Sink:MaD:18 | -| main.rs:220:27:220:34 | ...: usize | main.rs:226:26:226:26 | v | provenance | Sink:MaD:18 | -| main.rs:220:27:220:34 | ...: usize | main.rs:227:31:227:31 | v | provenance | Sink:MaD:20 | -| main.rs:230:24:230:31 | ...: usize | main.rs:231:43:231:43 | v | provenance | Sink:MaD:3 | -| main.rs:230:24:230:31 | ...: usize | main.rs:232:39:232:39 | v | provenance | Sink:MaD:5 | -| main.rs:230:24:230:31 | ...: usize | main.rs:233:46:233:46 | v | provenance | Sink:MaD:4 | -| main.rs:230:24:230:31 | ...: usize | main.rs:234:42:234:42 | v | provenance | Sink:MaD:6 | -| main.rs:285:24:285:41 | ...: String | main.rs:286:21:286:30 | user_input | provenance | | -| main.rs:286:9:286:17 | num_bytes | main.rs:288:54:288:62 | num_bytes | provenance | | -| main.rs:286:21:286:30 | user_input | main.rs:286:21:286:47 | user_input.parse() [Ok] | provenance | MaD:22 | -| main.rs:286:21:286:47 | user_input.parse() [Ok] | main.rs:286:21:286:48 | TryExpr | provenance | | -| main.rs:286:21:286:48 | TryExpr | main.rs:286:21:286:77 | ... * ... | provenance | MaD:37 | -| main.rs:286:21:286:77 | ... * ... | main.rs:286:9:286:17 | num_bytes | provenance | | -| main.rs:288:9:288:14 | layout | main.rs:290:40:290:45 | layout | provenance | Sink:MaD:14 | -| main.rs:288:18:288:66 | ...::from_size_align(...) [Ok] | main.rs:288:18:288:75 | ... .unwrap() | provenance | MaD:40 | -| main.rs:288:18:288:75 | ... .unwrap() | main.rs:288:9:288:14 | layout | provenance | | -| main.rs:288:54:288:62 | num_bytes | main.rs:288:18:288:66 | ...::from_size_align(...) [Ok] | provenance | MaD:29 | -| main.rs:314:25:314:40 | ...::args(...) | main.rs:314:25:314:40 | ...::args(...) [element] | provenance | Src:MaD:21 | -| main.rs:314:25:314:40 | ...::args(...) [element] | main.rs:314:25:314:47 | ... .nth(...) [Some] | provenance | MaD:35 | -| main.rs:314:25:314:47 | ... .nth(...) [Some] | main.rs:314:25:314:74 | ... .unwrap_or(...) | provenance | MaD:38 | -| main.rs:314:25:314:74 | ... .unwrap_or(...) | main.rs:285:24:285:41 | ...: String | provenance | | -| main.rs:320:26:320:33 | ...: usize | main.rs:334:26:334:26 | a | provenance | Sink:MaD:19 | -| main.rs:342:9:342:9 | v | main.rs:345:34:345:34 | v | provenance | | -| main.rs:342:9:342:9 | v | main.rs:346:42:346:42 | v | provenance | | -| main.rs:342:9:342:9 | v | main.rs:347:36:347:36 | v | provenance | | -| main.rs:342:9:342:9 | v | main.rs:348:27:348:27 | v | provenance | | -| main.rs:342:9:342:9 | v | main.rs:349:25:349:25 | v | provenance | | -| main.rs:342:9:342:9 | v | main.rs:350:22:350:22 | v | provenance | | -| main.rs:342:9:342:9 | v | main.rs:352:24:352:24 | v | provenance | | -| main.rs:342:13:342:28 | ...::args(...) | main.rs:342:13:342:28 | ...::args(...) [element] | provenance | Src:MaD:21 | -| main.rs:342:13:342:28 | ...::args(...) [element] | main.rs:342:13:342:35 | ... .nth(...) [Some] | provenance | MaD:35 | -| main.rs:342:13:342:35 | ... .nth(...) [Some] | main.rs:342:13:342:65 | ... .unwrap_or(...) | provenance | MaD:38 | -| main.rs:342:13:342:65 | ... .unwrap_or(...) | main.rs:342:13:342:82 | ... .parse() [Ok] | provenance | MaD:22 | -| main.rs:342:13:342:82 | ... .parse() [Ok] | main.rs:342:13:342:91 | ... .unwrap() | provenance | MaD:40 | -| main.rs:342:13:342:91 | ... .unwrap() | main.rs:342:9:342:9 | v | provenance | | -| main.rs:345:34:345:34 | v | main.rs:12:36:12:43 | ...: usize | provenance | | -| main.rs:346:42:346:42 | v | main.rs:43:44:43:51 | ...: usize | provenance | | -| main.rs:347:36:347:36 | v | main.rs:91:38:91:45 | ...: usize | provenance | | -| main.rs:348:27:348:27 | v | main.rs:183:29:183:36 | ...: usize | provenance | | -| main.rs:349:25:349:25 | v | main.rs:220:27:220:34 | ...: usize | provenance | | -| main.rs:350:22:350:22 | v | main.rs:230:24:230:31 | ...: usize | provenance | | -| main.rs:352:24:352:24 | v | main.rs:320:26:320:33 | ...: usize | provenance | | +| main.rs:192:46:192:46 | v | main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | +| main.rs:218:27:218:34 | ...: usize | main.rs:220:26:220:26 | v | provenance | Sink:MaD:20 | +| main.rs:218:27:218:34 | ...: usize | main.rs:221:36:221:36 | v | provenance | Sink:MaD:18 | +| main.rs:218:27:218:34 | ...: usize | main.rs:223:30:223:30 | v | provenance | Sink:MaD:19 | +| main.rs:218:27:218:34 | ...: usize | main.rs:224:26:224:26 | v | provenance | Sink:MaD:19 | +| main.rs:218:27:218:34 | ...: usize | main.rs:225:31:225:31 | v | provenance | Sink:MaD:21 | +| main.rs:228:24:228:31 | ...: usize | main.rs:229:43:229:43 | v | provenance | Sink:MaD:3 | +| main.rs:228:24:228:31 | ...: usize | main.rs:230:39:230:39 | v | provenance | Sink:MaD:5 | +| main.rs:228:24:228:31 | ...: usize | main.rs:231:46:231:46 | v | provenance | Sink:MaD:4 | +| main.rs:228:24:228:31 | ...: usize | main.rs:232:42:232:42 | v | provenance | Sink:MaD:6 | +| main.rs:283:24:283:41 | ...: String | main.rs:284:21:284:30 | user_input | provenance | | +| main.rs:284:9:284:17 | num_bytes | main.rs:286:54:286:62 | num_bytes | provenance | | +| main.rs:284:21:284:30 | user_input | main.rs:284:21:284:47 | user_input.parse() [Ok] | provenance | MaD:23 | +| main.rs:284:21:284:47 | user_input.parse() [Ok] | main.rs:284:21:284:48 | TryExpr | provenance | | +| main.rs:284:21:284:48 | TryExpr | main.rs:284:21:284:77 | ... * ... | provenance | MaD:38 | +| main.rs:284:21:284:77 | ... * ... | main.rs:284:9:284:17 | num_bytes | provenance | | +| main.rs:286:9:286:14 | layout | main.rs:288:40:288:45 | layout | provenance | Sink:MaD:15 | +| main.rs:286:18:286:66 | ...::from_size_align(...) [Ok] | main.rs:286:18:286:75 | ... .unwrap() | provenance | MaD:41 | +| main.rs:286:18:286:75 | ... .unwrap() | main.rs:286:9:286:14 | layout | provenance | | +| main.rs:286:54:286:62 | num_bytes | main.rs:286:18:286:66 | ...::from_size_align(...) [Ok] | provenance | MaD:30 | +| main.rs:312:25:312:40 | ...::args(...) | main.rs:312:25:312:40 | ...::args(...) [element] | provenance | Src:MaD:22 | +| main.rs:312:25:312:40 | ...::args(...) [element] | main.rs:312:25:312:47 | ... .nth(...) [Some] | provenance | MaD:36 | +| main.rs:312:25:312:47 | ... .nth(...) [Some] | main.rs:312:25:312:74 | ... .unwrap_or(...) | provenance | MaD:39 | +| main.rs:312:25:312:74 | ... .unwrap_or(...) | main.rs:283:24:283:41 | ...: String | provenance | | +| main.rs:318:26:318:33 | ...: usize | main.rs:332:26:332:26 | a | provenance | Sink:MaD:20 | +| main.rs:340:9:340:9 | v | main.rs:343:34:343:34 | v | provenance | | +| main.rs:340:9:340:9 | v | main.rs:344:42:344:42 | v | provenance | | +| main.rs:340:9:340:9 | v | main.rs:345:36:345:36 | v | provenance | | +| main.rs:340:9:340:9 | v | main.rs:346:27:346:27 | v | provenance | | +| main.rs:340:9:340:9 | v | main.rs:347:25:347:25 | v | provenance | | +| main.rs:340:9:340:9 | v | main.rs:348:22:348:22 | v | provenance | | +| main.rs:340:9:340:9 | v | main.rs:350:24:350:24 | v | provenance | | +| main.rs:340:13:340:28 | ...::args(...) | main.rs:340:13:340:28 | ...::args(...) [element] | provenance | Src:MaD:22 | +| main.rs:340:13:340:28 | ...::args(...) [element] | main.rs:340:13:340:35 | ... .nth(...) [Some] | provenance | MaD:36 | +| main.rs:340:13:340:35 | ... .nth(...) [Some] | main.rs:340:13:340:65 | ... .unwrap_or(...) | provenance | MaD:39 | +| main.rs:340:13:340:65 | ... .unwrap_or(...) | main.rs:340:13:340:82 | ... .parse() [Ok] | provenance | MaD:23 | +| main.rs:340:13:340:82 | ... .parse() [Ok] | main.rs:340:13:340:91 | ... .unwrap() | provenance | MaD:41 | +| main.rs:340:13:340:91 | ... .unwrap() | main.rs:340:9:340:9 | v | provenance | | +| main.rs:343:34:343:34 | v | main.rs:12:36:12:43 | ...: usize | provenance | | +| main.rs:344:42:344:42 | v | main.rs:43:44:43:51 | ...: usize | provenance | | +| main.rs:345:36:345:36 | v | main.rs:91:38:91:45 | ...: usize | provenance | | +| main.rs:346:27:346:27 | v | main.rs:183:29:183:36 | ...: usize | provenance | | +| main.rs:347:25:347:25 | v | main.rs:218:27:218:34 | ...: usize | provenance | | +| main.rs:348:22:348:22 | v | main.rs:228:24:228:31 | ...: usize | provenance | | +| main.rs:350:24:350:24 | v | main.rs:318:26:318:33 | ...: usize | provenance | | models | 1 | Sink: ::allocate; Argument[0]; alloc-layout | | 2 | Sink: ::allocate_zeroed; Argument[0]; alloc-layout | @@ -252,40 +254,41 @@ models | 6 | Sink: ::with_capacity_in; Argument[0]; alloc-layout | | 7 | Sink: ::alloc; Argument[0]; alloc-layout | | 8 | Sink: ::alloc_zeroed; Argument[0]; alloc-layout | -| 9 | Sink: ::allocate; Argument[0]; alloc-size | -| 10 | Sink: ::allocate_zeroed; Argument[0]; alloc-size | -| 11 | Sink: ::grow; Argument[2]; alloc-size | -| 12 | Sink: ::grow_zeroed; Argument[2]; alloc-size | -| 13 | Sink: ::shrink; Argument[2]; alloc-size | -| 14 | Sink: alloc::alloc::alloc; Argument[0]; alloc-layout | -| 15 | Sink: alloc::alloc::alloc_zeroed; Argument[0]; alloc-layout | -| 16 | Sink: alloc::alloc::realloc; Argument[2]; alloc-size | -| 17 | Sink: libc::unix::aligned_alloc; Argument[1]; alloc-size | -| 18 | Sink: libc::unix::calloc; Argument[0,1]; alloc-size | -| 19 | Sink: libc::unix::malloc; Argument[0]; alloc-size | -| 20 | Sink: libc::unix::realloc; Argument[1]; alloc-size | -| 21 | Source: std::env::args; ReturnValue.Element; commandargs | -| 22 | Summary: ::deref; Argument[self]; ReturnValue; value | -| 23 | Summary: ::align_to; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 24 | Summary: ::array; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 25 | Summary: ::extend; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | -| 26 | Summary: ::extend; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | -| 27 | Summary: ::extend_packed; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 28 | Summary: ::extend_packed; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 29 | Summary: ::from_size_align; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 30 | Summary: ::from_size_align_unchecked; Argument[0]; ReturnValue; taint | -| 31 | Summary: ::pad_to_align; Argument[self].Reference; ReturnValue; taint | -| 32 | Summary: ::repeat; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | -| 33 | Summary: ::repeat_packed; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 34 | Summary: ::size; Argument[self].Reference; ReturnValue; taint | -| 35 | Summary: ::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 36 | Summary: ::add; Argument[self,0]; ReturnValue; taint | -| 37 | Summary: ::mul; Argument[self,0]; ReturnValue; taint | -| 38 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 39 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 40 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 41 | Summary: core::cmp::max; Argument[0]; ReturnValue; value | -| 42 | Summary: core::cmp::min; Argument[0]; ReturnValue; value | +| 9 | Sink: ::realloc; Argument[2]; alloc-size | +| 10 | Sink: ::allocate; Argument[0]; alloc-size | +| 11 | Sink: ::allocate_zeroed; Argument[0]; alloc-size | +| 12 | Sink: ::grow; Argument[2]; alloc-size | +| 13 | Sink: ::grow_zeroed; Argument[2]; alloc-size | +| 14 | Sink: ::shrink; Argument[2]; alloc-size | +| 15 | Sink: alloc::alloc::alloc; Argument[0]; alloc-layout | +| 16 | Sink: alloc::alloc::alloc_zeroed; Argument[0]; alloc-layout | +| 17 | Sink: alloc::alloc::realloc; Argument[2]; alloc-size | +| 18 | Sink: libc::unix::aligned_alloc; Argument[1]; alloc-size | +| 19 | Sink: libc::unix::calloc; Argument[0,1]; alloc-size | +| 20 | Sink: libc::unix::malloc; Argument[0]; alloc-size | +| 21 | Sink: libc::unix::realloc; Argument[1]; alloc-size | +| 22 | Source: std::env::args; ReturnValue.Element; commandargs | +| 23 | Summary: ::deref; Argument[self]; ReturnValue; value | +| 24 | Summary: ::align_to; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 25 | Summary: ::array; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 26 | Summary: ::extend; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | +| 27 | Summary: ::extend; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | +| 28 | Summary: ::extend_packed; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 29 | Summary: ::extend_packed; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 30 | Summary: ::from_size_align; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 31 | Summary: ::from_size_align_unchecked; Argument[0]; ReturnValue; taint | +| 32 | Summary: ::pad_to_align; Argument[self].Reference; ReturnValue; taint | +| 33 | Summary: ::repeat; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | +| 34 | Summary: ::repeat_packed; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 35 | Summary: ::size; Argument[self].Reference; ReturnValue; taint | +| 36 | Summary: ::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 37 | Summary: ::add; Argument[self,0]; ReturnValue; taint | +| 38 | Summary: ::mul; Argument[self,0]; ReturnValue; taint | +| 39 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 40 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 41 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 42 | Summary: core::cmp::max; Argument[0]; ReturnValue; value | +| 43 | Summary: core::cmp::min; Argument[0]; ReturnValue; value | nodes | main.rs:12:36:12:43 | ...: usize | semmle.label | ...: usize | | main.rs:18:41:18:41 | v | semmle.label | v | @@ -429,55 +432,56 @@ nodes | main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | semmle.label | ...::array::<...>(...) [Ok] | | main.rs:192:14:192:56 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:192:46:192:46 | v | semmle.label | v | -| main.rs:195:38:195:39 | l2 | semmle.label | l2 | -| main.rs:196:45:196:46 | l2 | semmle.label | l2 | +| main.rs:193:38:193:39 | l2 | semmle.label | l2 | +| main.rs:194:45:194:46 | l2 | semmle.label | l2 | +| main.rs:195:41:195:42 | l2 | semmle.label | l2 | +| main.rs:196:48:196:49 | l2 | semmle.label | l2 | | main.rs:197:41:197:42 | l2 | semmle.label | l2 | | main.rs:198:48:198:49 | l2 | semmle.label | l2 | -| main.rs:199:41:199:42 | l2 | semmle.label | l2 | -| main.rs:200:48:200:49 | l2 | semmle.label | l2 | -| main.rs:211:53:211:54 | l2 | semmle.label | l2 | -| main.rs:213:60:213:61 | l2 | semmle.label | l2 | -| main.rs:216:51:216:52 | l2 | semmle.label | l2 | -| main.rs:220:27:220:34 | ...: usize | semmle.label | ...: usize | -| main.rs:222:26:222:26 | v | semmle.label | v | -| main.rs:223:36:223:36 | v | semmle.label | v | -| main.rs:225:30:225:30 | v | semmle.label | v | -| main.rs:226:26:226:26 | v | semmle.label | v | -| main.rs:227:31:227:31 | v | semmle.label | v | -| main.rs:230:24:230:31 | ...: usize | semmle.label | ...: usize | -| main.rs:231:43:231:43 | v | semmle.label | v | -| main.rs:232:39:232:39 | v | semmle.label | v | -| main.rs:233:46:233:46 | v | semmle.label | v | -| main.rs:234:42:234:42 | v | semmle.label | v | -| main.rs:285:24:285:41 | ...: String | semmle.label | ...: String | -| main.rs:286:9:286:17 | num_bytes | semmle.label | num_bytes | -| main.rs:286:21:286:30 | user_input | semmle.label | user_input | -| main.rs:286:21:286:47 | user_input.parse() [Ok] | semmle.label | user_input.parse() [Ok] | -| main.rs:286:21:286:48 | TryExpr | semmle.label | TryExpr | -| main.rs:286:21:286:77 | ... * ... | semmle.label | ... * ... | -| main.rs:288:9:288:14 | layout | semmle.label | layout | -| main.rs:288:18:288:66 | ...::from_size_align(...) [Ok] | semmle.label | ...::from_size_align(...) [Ok] | -| main.rs:288:18:288:75 | ... .unwrap() | semmle.label | ... .unwrap() | -| main.rs:288:54:288:62 | num_bytes | semmle.label | num_bytes | -| main.rs:290:40:290:45 | layout | semmle.label | layout | -| main.rs:314:25:314:40 | ...::args(...) | semmle.label | ...::args(...) | -| main.rs:314:25:314:40 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | -| main.rs:314:25:314:47 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | -| main.rs:314:25:314:74 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | -| main.rs:320:26:320:33 | ...: usize | semmle.label | ...: usize | -| main.rs:334:26:334:26 | a | semmle.label | a | -| main.rs:342:9:342:9 | v | semmle.label | v | -| main.rs:342:13:342:28 | ...::args(...) | semmle.label | ...::args(...) | -| main.rs:342:13:342:28 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | -| main.rs:342:13:342:35 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | -| main.rs:342:13:342:65 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | -| main.rs:342:13:342:82 | ... .parse() [Ok] | semmle.label | ... .parse() [Ok] | -| main.rs:342:13:342:91 | ... .unwrap() | semmle.label | ... .unwrap() | -| main.rs:345:34:345:34 | v | semmle.label | v | -| main.rs:346:42:346:42 | v | semmle.label | v | -| main.rs:347:36:347:36 | v | semmle.label | v | -| main.rs:348:27:348:27 | v | semmle.label | v | -| main.rs:349:25:349:25 | v | semmle.label | v | -| main.rs:350:22:350:22 | v | semmle.label | v | -| main.rs:352:24:352:24 | v | semmle.label | v | +| main.rs:203:48:203:48 | v | semmle.label | v | +| main.rs:209:53:209:54 | l2 | semmle.label | l2 | +| main.rs:211:60:211:61 | l2 | semmle.label | l2 | +| main.rs:214:51:214:52 | l2 | semmle.label | l2 | +| main.rs:218:27:218:34 | ...: usize | semmle.label | ...: usize | +| main.rs:220:26:220:26 | v | semmle.label | v | +| main.rs:221:36:221:36 | v | semmle.label | v | +| main.rs:223:30:223:30 | v | semmle.label | v | +| main.rs:224:26:224:26 | v | semmle.label | v | +| main.rs:225:31:225:31 | v | semmle.label | v | +| main.rs:228:24:228:31 | ...: usize | semmle.label | ...: usize | +| main.rs:229:43:229:43 | v | semmle.label | v | +| main.rs:230:39:230:39 | v | semmle.label | v | +| main.rs:231:46:231:46 | v | semmle.label | v | +| main.rs:232:42:232:42 | v | semmle.label | v | +| main.rs:283:24:283:41 | ...: String | semmle.label | ...: String | +| main.rs:284:9:284:17 | num_bytes | semmle.label | num_bytes | +| main.rs:284:21:284:30 | user_input | semmle.label | user_input | +| main.rs:284:21:284:47 | user_input.parse() [Ok] | semmle.label | user_input.parse() [Ok] | +| main.rs:284:21:284:48 | TryExpr | semmle.label | TryExpr | +| main.rs:284:21:284:77 | ... * ... | semmle.label | ... * ... | +| main.rs:286:9:286:14 | layout | semmle.label | layout | +| main.rs:286:18:286:66 | ...::from_size_align(...) [Ok] | semmle.label | ...::from_size_align(...) [Ok] | +| main.rs:286:18:286:75 | ... .unwrap() | semmle.label | ... .unwrap() | +| main.rs:286:54:286:62 | num_bytes | semmle.label | num_bytes | +| main.rs:288:40:288:45 | layout | semmle.label | layout | +| main.rs:312:25:312:40 | ...::args(...) | semmle.label | ...::args(...) | +| main.rs:312:25:312:40 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | +| main.rs:312:25:312:47 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | +| main.rs:312:25:312:74 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | +| main.rs:318:26:318:33 | ...: usize | semmle.label | ...: usize | +| main.rs:332:26:332:26 | a | semmle.label | a | +| main.rs:340:9:340:9 | v | semmle.label | v | +| main.rs:340:13:340:28 | ...::args(...) | semmle.label | ...::args(...) | +| main.rs:340:13:340:28 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | +| main.rs:340:13:340:35 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | +| main.rs:340:13:340:65 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | +| main.rs:340:13:340:82 | ... .parse() [Ok] | semmle.label | ... .parse() [Ok] | +| main.rs:340:13:340:91 | ... .unwrap() | semmle.label | ... .unwrap() | +| main.rs:343:34:343:34 | v | semmle.label | v | +| main.rs:344:42:344:42 | v | semmle.label | v | +| main.rs:345:36:345:36 | v | semmle.label | v | +| main.rs:346:27:346:27 | v | semmle.label | v | +| main.rs:347:25:347:25 | v | semmle.label | v | +| main.rs:348:22:348:22 | v | semmle.label | v | +| main.rs:350:24:350:24 | v | semmle.label | v | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-770/main.rs b/rust/ql/test/query-tests/security/CWE-770/main.rs index 8581282c6b37..20b13ee6256a 100644 --- a/rust/ql/test/query-tests/security/CWE-770/main.rs +++ b/rust/ql/test/query-tests/security/CWE-770/main.rs @@ -190,8 +190,6 @@ unsafe fn test_system_alloc(v: usize) { let _ = std::alloc::Global.allocate_zeroed(l1).unwrap(); let l2 = std::alloc::Layout::array::(v).unwrap(); - // These resolve to the blanket `impl GlobalAlloc for A` in `core`, so the target's canonical - // path has a type-parameter `Self` (`<_ as ..::GlobalAlloc>::alloc`); the sink model misses it. let _ = std::alloc::System.alloc(l2); // $ Alert[rust/uncontrolled-allocation-size]=arg1 let _ = std::alloc::System.alloc_zeroed(l2); // $ Alert[rust/uncontrolled-allocation-size]=arg1 let _ = std::alloc::System.allocate(l2).unwrap(); // $ Alert[rust/uncontrolled-allocation-size]=arg1 @@ -202,7 +200,7 @@ unsafe fn test_system_alloc(v: usize) { let l3 = std::alloc::Layout::array::(10).unwrap(); let m3 = std::alloc::System.alloc(l3); // `System.realloc` resolves to that same blanket `GlobalAlloc` impl (see above); MISSING. - let _ = std::alloc::System.realloc(m3, l3, v); // $ MISSING: Alert[rust/uncontrolled-allocation-size]=arg1 + let _ = std::alloc::System.realloc(m3, l3, v); // $ Alert[rust/uncontrolled-allocation-size]=arg1 let l4 = std::alloc::Layout::array::(10).unwrap(); let m4 = std::ptr::NonNull::::new(std::alloc::alloc(l4)).unwrap(); From d72065b7a35df48ca7f9b291ae01a54ec87ef231 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Thu, 10 Sep 2026 10:55:28 +0200 Subject: [PATCH 0815/2098] Rust: Overrride `toStringImpl` for new elements classes --- rust/ql/.generated.list | 7 ------- rust/ql/.gitattributes | 7 ------- rust/ql/lib/codeql/rust/elements/internal/DerefPatImpl.qll | 6 ++++-- .../codeql/rust/elements/internal/ImplRestrictionImpl.qll | 6 ++++-- .../codeql/rust/elements/internal/IncludeBytesExprImpl.qll | 6 ++++-- .../codeql/rust/elements/internal/MutRestrictionImpl.qll | 6 ++++-- rust/ql/lib/codeql/rust/elements/internal/NotNullImpl.qll | 6 ++++-- .../codeql/rust/elements/internal/PatternTypeReprImpl.qll | 6 ++++-- .../codeql/rust/elements/internal/VisibilityInnerImpl.qll | 6 ++++-- 9 files changed, 28 insertions(+), 28 deletions(-) diff --git a/rust/ql/.generated.list b/rust/ql/.generated.list index cf2a89cce687..ebbf91a4f16a 100644 --- a/rust/ql/.generated.list +++ b/rust/ql/.generated.list @@ -247,7 +247,6 @@ lib/codeql/rust/elements/internal/ConstParamConstructor.qll f6645f952aac87c7e00e lib/codeql/rust/elements/internal/ContinueExprConstructor.qll cd93f1b35ccdb031d7e8deba92f6a76187f6009c454f3ea07e89ba459de57ca6 6f658e7d580c4c9068b01d6dd6f72888b8800860668a6653f8c3b27dc9996935 lib/codeql/rust/elements/internal/CrateConstructor.qll 2a3710ed6ff4ffdbc773ac16e2cf176415be8908e1d59fd0702bdeddbae096f4 f75a069b0ef71e54089001eb3a34b8a9e4ce8e4f65ffa71b669b38cf86e0af40 lib/codeql/rust/elements/internal/DerefPatConstructor.qll a92a1e9b310a7dc92f31952b08c264cbd57265a5c619ff1abecf739ed4f6525f f86e26668b88baa571ca7521782141ce92f816ec366024c21c953bc335482c10 -lib/codeql/rust/elements/internal/DerefPatImpl.qll b43a939e3d373b411fe7b8b2b8192f6cb58860fd806aaa83f20b7e2be06c7e63 21b433843baa1aef9d5a67bd4cfcfbbb08a64a1e8d31ab254ecdc2ef1f1854c0 lib/codeql/rust/elements/internal/DynTraitTypeReprConstructor.qll 6964e6c80fb7f5e283c1d15562cef18ed097452b7fcbc04eff780c7646675c7a f03c4830bf1b958fdfb6563136fa21c911b2e41ce1d1caee14ec572c7232866d lib/codeql/rust/elements/internal/EnumConstructor.qll eca1a13937faacb1db50e4cf69d175f992f2204a5aaed9144bb6f3cb63814ac5 1bafba78b2729fdb052a25a1ba3f4f70871564aa4df632b4a1d467858a437924 lib/codeql/rust/elements/internal/ExprImpl.qll ab20ee174e2e786f34af6e5dedf3ec071bb89fc266b3e91df6377f72aa38d3f2 f68192700f449bf1c229cfbaabd5353c7c559941c915d5a0c88752cf9844194b @@ -275,10 +274,8 @@ lib/codeql/rust/elements/internal/IdentPatConstructor.qll 09792f5a070996b65f095d lib/codeql/rust/elements/internal/IfExprConstructor.qll 03088b54c8fa623f93a5b5a7eb896f680e8b0e9025488157a02c48aaebc6ad56 906f916c3690d0721a31dd31b302dcdcec4233bb507683007d82cf10793a648f lib/codeql/rust/elements/internal/ImplConstructor.qll 24edccca59f70d812d1458b412a45310ddc096d095332f6e3258903c54c1bb44 7eb673b3ab33a0873ee5ce189105425066b376821cce0fc9eb8ace22995f0bc7 lib/codeql/rust/elements/internal/ImplRestrictionConstructor.qll 7d58e3efd82a6869fec0c95733d710223563ba063a11096bc78bdaa2b52228ee 83c219aabb5d037dcece2e723b8424f0a853d5a7c15562c1b5b964e8ea43fd2d -lib/codeql/rust/elements/internal/ImplRestrictionImpl.qll 5023ad9d8103df7c23b3d301ab6a957b2ed17a7b6f78b724e1cfb913423439dc 35ccaf051a5cbc3bf76578a6a30ff11b6f2520bb55232751ec951d9d65119aa5 lib/codeql/rust/elements/internal/ImplTraitTypeReprConstructor.qll 1ed355e5e56f432b24b6f4778e4dc45c6e65095190cacb7a5015529e0c9d01f8 c8505185a042da4eb20a0cc32323194a0290c4bf821c7e0fce7351b194b10f31 lib/codeql/rust/elements/internal/IncludeBytesExprConstructor.qll 62d20cf32e8c0fa62ef5b472e3b5538b95cc6bf275955f195a4924c2f38c9ba8 5fd4b50e9760af5a5c76d616658adde406470c4c9eac9b846dc0b7583e6460c1 -lib/codeql/rust/elements/internal/IncludeBytesExprImpl.qll cf1da0abb200dceedf5000fe6565456fd1526310565df1f210ec12c37b3b1f4f 82195e928034735f3e41b4d4cf48d411cf6719089f0529a843e79a1dabb94b21 lib/codeql/rust/elements/internal/IndexExprConstructor.qll 99bdc3d793c4dbd993860da60abe2b7c604345d645e86916462bc55a6939a5d1 3fe9d7da725956903707806aadbecac8d5b3874e8bed63c9bab54fff630e75dd lib/codeql/rust/elements/internal/InferTypeReprConstructor.qll bc5f16853401617fc9c5af8a1287a23c5921df1b615cfbe2d7c7a70145ecfcbd da93bd28ea2daade2cbb0a729be3fbf05f72bc02009565c7bb062e4f68fdb9e7 lib/codeql/rust/elements/internal/ItemListConstructor.qll 08af3bd12536941c3dd4a43c81cc861be24325e242e2593c087a3ce632674291 2fa166159c409d2aaffa73a30babb40829a6de580bd40894d909ee6152801082 @@ -310,14 +307,12 @@ lib/codeql/rust/elements/internal/MissingConstructor.qll aab0b7f2846f14a5914661a lib/codeql/rust/elements/internal/MissingImpl.qll e81caa383797dfe837cf101fb78d23ab150b32fef7b47ffcc5489bfcd942ac3e 9f3212d45d77e5888e435e7babd55c1e6b42c3c16f5b1f71170ac41f93ee8d0b lib/codeql/rust/elements/internal/ModuleConstructor.qll 31cc83c9d8f25ac07375d19e568f05c068e1f5aa205ff3d9ac31c2510e6f8468 8a70f3f1c18ff87f17e6baf2f05ccaed55c70469288192fc39ef0bb5531b8c0e lib/codeql/rust/elements/internal/MutRestrictionConstructor.qll 002e0b35790932db84a5643d9ffc531b10dc327b1b44b966e773bf9b4e46a325 5d81599d543825b8ace752dc03bafc9bae7f13bc8bcbb3db5e2e0243fc9c6772 -lib/codeql/rust/elements/internal/MutRestrictionImpl.qll 80e2f1b224a71df6a8c6544c1feb19a92b300cf3447c9905814a6539f89f1dde 16099f2adf7b4b9401f3320fc16d27c170b0d00221d9a062d373216150a2559b lib/codeql/rust/elements/internal/NameConstructor.qll a760134c6d4fc785746e1a5dc042a6bf25b8adaa3947a6897c31e50fd91dd5fd 1359f903d57112bcc1f62a609febb288301bfa810e569aa12e1045fd48b5b5c9 lib/codeql/rust/elements/internal/NameRefConstructor.qll 5ff6eacc614fd41f98b54cbb4960a07a1471cf4ea291758d33e54a48fd5d1bc4 c538d65414a24dfdbeb49cfd997588227559ba038f0b55d14bb5d89ed1a016f2 lib/codeql/rust/elements/internal/NamedCrate.qll 6c697076387b5af00422e227540d100ff7c03d3001f6a4c5b61433191d022490 2276f85411db199598fc6a5d8d6ec5762e42b1b45c98e398eeb75e69c697b57f lib/codeql/rust/elements/internal/NamedCrateConstructor.qll 72e07ece16f787dfd993982848689dc2e11845aa5634e9ee5ad8865b95cb59dc ea6555ae33cabe408935649b5e8c6218158036a3b7c4e1abc8bd7cd51c05a912 lib/codeql/rust/elements/internal/NeverTypeReprConstructor.qll 2e0a9c75e389e9ef41a18dd9b5d6c29ffe1d1d633e51ef1de90ec553236d201a 61ea87802fd1c3a68e864ccd76657253a228b06471e4c55bcf94ca2be554f866 lib/codeql/rust/elements/internal/NotNullConstructor.qll 40e9254021ce7f09861c8d4ac70c3595953e8ade756a3da039d99a638fe8f0f3 3264d3ba76e04cdee673ae38dd3fcd7660978dc17d86c9b8f062bd0fbf3e5d3e -lib/codeql/rust/elements/internal/NotNullImpl.qll d76de5a4967440f52b2b968bae371d7e3aa11b98a38e7de0591720346e70224c 667b432d8500db42c56653b329ef80c7d3079f24efa360528d438c9dff5c9507 lib/codeql/rust/elements/internal/OffsetOfExprConstructor.qll 616e146562adb3ac0fba4d6f55dd6ce60518ed377c0856f1f09ba49593e7bfab 80518ce90fc6d08011d6f5fc2a543958067739e1b0a6a5f2ed90fc9b1db078f0 lib/codeql/rust/elements/internal/OrPatConstructor.qll 4ef583e07298487c0c4c6d7c76ffcc04b1e5fe58aba0c1da3e2c8446a9e0c92b 980a6bd176ae5e5b11c134569910c5468ba91f480982d846e222d031a6a05f1a lib/codeql/rust/elements/internal/ParamConstructor.qll b98a2d8969f289fdcc8c0fb11cbd19a3b0c71be038c4a74f5988295a2bae52f0 77d81b31064167945b79b19d9697b57ca24462c3a7cc19e462c4693ce87db532 @@ -335,7 +330,6 @@ lib/codeql/rust/elements/internal/PathPatConstructor.qll 966c4ea22218ef71e000d7c lib/codeql/rust/elements/internal/PathSegmentConstructor.qll 2d9639e42035dc7e73b7d6ddb8a977beadc6b4492dee4292b2f85b4409344441 c337fc3b9ef56366428772563e3f25f711474d16e860d3e89c1395a95d9e83e7 lib/codeql/rust/elements/internal/PathTypeReprConstructor.qll e05e7be13d48e7f832e735254777692d4be827a745b1fd94b9649d46fe574393 4aa1e6935a4479b61f205265cbbba01ce96d09a680c20d5decf30d1374d484d4 lib/codeql/rust/elements/internal/PatternTypeReprConstructor.qll cf17aaca86534afe86518f1dc2fdbf548fc0e9bf241d1e698a94940ce875d1f2 5799da5538796765846bcf09391ec2388cc96fdc6fea60819301ab6387d5d146 -lib/codeql/rust/elements/internal/PatternTypeReprImpl.qll 38052ab7f6f18d73556644291546d1f58709c2e44c7fdbcb259a4e5102bc1a08 f63d6fb495a1cad07ae55de210e766fdf15f011de4d8b7b2e8124d556287db26 lib/codeql/rust/elements/internal/PrefixExprConstructor.qll 90c50b0df2d4b4cbf5e2b7d67a9d243a1af9bfff660b7a70d8b9c7859c28bca7 1a1b5ea1f06ed8d41a658c872e8e1915c241a7c799c691df81b9a7b55d8f2f1e lib/codeql/rust/elements/internal/PtrTypeReprConstructor.qll c8bd3502dc23429577fbff0fe3e3c78b812b2237b2bb65862c137083fdaa7a4a 4d5c135be30f71a3712acbc22bdb6c425fa6463043a9ee64543da31151d68366 lib/codeql/rust/elements/internal/RangeExprConstructor.qll a0aa90a1c38c5deea56475399016afae2a00a858b961fbbab8ddeb3bc6a08103 0ddf1bcf28aafc56d7334e6138fb268f9b36a429e4cbdd982cd8384e0644076b @@ -398,7 +392,6 @@ lib/codeql/rust/elements/internal/VariantConstructor.qll 0297d4a9a9b32448d6d6063 lib/codeql/rust/elements/internal/VariantListConstructor.qll c841fb345eb46ea3978a0ed7a689f8955efc9178044b140b74d98a6bcd0c926a c9e52d112abdba2b60013fa01a944c8770766bf7368f9878e6b13daaa4eed446 lib/codeql/rust/elements/internal/VisibilityConstructor.qll 1fd30663d87945f08d15cfaca54f586a658f26b7a98ea45ac73a35d36d4f65d0 6ddaf11742cc8fbbe03af2aa578394041ae077911e62d2fa6c885ae0543ba53a lib/codeql/rust/elements/internal/VisibilityInnerConstructor.qll 6d845ba35a3bc8521fb49d1691d6aa10f1f7f4b7f27f12f4d3e316d8d3d6050c eecc48b25464df7e723ce1e9706b2b9ffbb8ccac26edb78b0901ce9912675edc -lib/codeql/rust/elements/internal/VisibilityInnerImpl.qll 9a536441b258a5dae6518b7efa36a881244194f7e0f842a1c730dfeaa979d462 de14821d1d9ffeac766b01ee3ec248c73a531b4d3a7357e5b609e4de40ffea93 lib/codeql/rust/elements/internal/WhereClauseConstructor.qll 6d6f0f0376cf45fac37ea0c7c4345d08718d2a3d6d913e591de1de9e640317c9 ff690f3d4391e5f1fae6e9014365810105e8befe9d6b52a82625994319af9ffd lib/codeql/rust/elements/internal/WherePredConstructor.qll f331c37085792a01159e8c218e9ef827e80e99b7c3d5978b6489808f05bd11f8 179cad3e4c5aaaf27755891694ef3569322fcf34c5290e6af49e5b5e3f8aa732 lib/codeql/rust/elements/internal/WhileExprConstructor.qll 01eb17d834584b3cba0098d367324d137aacfc60860752d9053ec414180897e7 e5e0999fb48a48ba9b3e09f87d8f44f43cc3d8a276059d9f67e7714a1852b8a5 diff --git a/rust/ql/.gitattributes b/rust/ql/.gitattributes index 97ae0958578d..34bded4d4de9 100644 --- a/rust/ql/.gitattributes +++ b/rust/ql/.gitattributes @@ -249,7 +249,6 @@ /lib/codeql/rust/elements/internal/ContinueExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/CrateConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/DerefPatConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/DerefPatImpl.qll linguist-generated /lib/codeql/rust/elements/internal/DynTraitTypeReprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/EnumConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ExprImpl.qll linguist-generated @@ -277,10 +276,8 @@ /lib/codeql/rust/elements/internal/IfExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ImplConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ImplRestrictionConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/ImplRestrictionImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ImplTraitTypeReprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/IncludeBytesExprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/IncludeBytesExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/IndexExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/InferTypeReprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ItemListConstructor.qll linguist-generated @@ -312,14 +309,12 @@ /lib/codeql/rust/elements/internal/MissingImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ModuleConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/MutRestrictionConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/MutRestrictionImpl.qll linguist-generated /lib/codeql/rust/elements/internal/NameConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/NameRefConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/NamedCrate.qll linguist-generated /lib/codeql/rust/elements/internal/NamedCrateConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/NeverTypeReprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/NotNullConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/NotNullImpl.qll linguist-generated /lib/codeql/rust/elements/internal/OffsetOfExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/OrPatConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ParamConstructor.qll linguist-generated @@ -337,7 +332,6 @@ /lib/codeql/rust/elements/internal/PathSegmentConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/PathTypeReprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/PatternTypeReprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/PatternTypeReprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/PrefixExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/PtrTypeReprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/RangeExprConstructor.qll linguist-generated @@ -400,7 +394,6 @@ /lib/codeql/rust/elements/internal/VariantListConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/VisibilityConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/VisibilityInnerConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/VisibilityInnerImpl.qll linguist-generated /lib/codeql/rust/elements/internal/WhereClauseConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/WherePredConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/WhileExprConstructor.qll linguist-generated diff --git a/rust/ql/lib/codeql/rust/elements/internal/DerefPatImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/DerefPatImpl.qll index ec44a20c2b5e..664af10393dd 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/DerefPatImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/DerefPatImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `DerefPat`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.DerefPat * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A deref pattern, matching the value behind a smart pointer. This is an experimental * Rust feature that cannot be written directly in stable Rust; the example below uses @@ -23,5 +23,7 @@ module Impl { * }; * ``` */ - class DerefPat extends Generated::DerefPat { } + class DerefPat extends Generated::DerefPat { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ImplRestrictionImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ImplRestrictionImpl.qll index 7240c6a6bcea..45fe45f45d4e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ImplRestrictionImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ImplRestrictionImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ImplRestriction`. * @@ -12,8 +11,11 @@ private import codeql.rust.elements.internal.generated.ImplRestriction * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An implementation restriction, limiting where a trait can be implemented. For example the `impl(crate)` restriction (an unstable feature). */ - class ImplRestriction extends Generated::ImplRestriction { } + class ImplRestriction extends Generated::ImplRestriction { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/IncludeBytesExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/IncludeBytesExprImpl.qll index 750abcb2f098..985fdf310d38 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/IncludeBytesExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/IncludeBytesExprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `IncludeBytesExpr`. * @@ -12,11 +11,14 @@ private import codeql.rust.elements.internal.generated.IncludeBytesExpr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An expression produced by the built-in `include_bytes!` macro, embedding the contents of a file as a byte array. For example: * ```rust * let data = include_bytes!("data.bin"); * ``` */ - class IncludeBytesExpr extends Generated::IncludeBytesExpr { } + class IncludeBytesExpr extends Generated::IncludeBytesExpr { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/MutRestrictionImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/MutRestrictionImpl.qll index 6d8722a09e6c..cec0128f8c93 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/MutRestrictionImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/MutRestrictionImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `MutRestriction`. * @@ -12,8 +11,11 @@ private import codeql.rust.elements.internal.generated.MutRestriction * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A mutability restriction, limiting where a field can be mutated. For example the `mut(crate)` restriction (an unstable feature). */ - class MutRestriction extends Generated::MutRestriction { } + class MutRestriction extends Generated::MutRestriction { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/NotNullImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/NotNullImpl.qll index 19365f23a2d5..c5c0b9f617ca 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/NotNullImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/NotNullImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `NotNull`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.NotNull * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * The `!null` pattern used in a pattern type to denote a non-null value. Pattern types * are an experimental, mostly compiler-internal feature (used in the standard library for @@ -21,5 +21,7 @@ module Impl { * type NonNull = builtin#pattern_type(*const () is !null); * ``` */ - class NotNull extends Generated::NotNull { } + class NotNull extends Generated::NotNull { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/PatternTypeReprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/PatternTypeReprImpl.qll index 16cb9358ebae..c9b0951a2ffe 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/PatternTypeReprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/PatternTypeReprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `PatternTypeRepr`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.PatternTypeRepr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A pattern type, constraining a type to values matching a pattern. Pattern types are an * experimental, mostly compiler-internal feature and cannot be written directly in stable @@ -20,5 +20,7 @@ module Impl { * type NonZero = builtin#pattern_type(u32 is 1..); * ``` */ - class PatternTypeRepr extends Generated::PatternTypeRepr { } + class PatternTypeRepr extends Generated::PatternTypeRepr { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/VisibilityInnerImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/VisibilityInnerImpl.qll index ad896e5dcd25..28f66a5db70c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/VisibilityInnerImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/VisibilityInnerImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `VisibilityInner`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.VisibilityInner * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * The parenthesized inner part of a visibility modifier or restriction, such as the `(in path)` in `pub(in path)`, or the `(crate)` in `pub(crate)`. For example the `(in foo::bar)` in: * ```rust @@ -19,5 +19,7 @@ module Impl { * // ^^^^^^^^^^^^ * ``` */ - class VisibilityInner extends Generated::VisibilityInner { } + class VisibilityInner extends Generated::VisibilityInner { + override string toStringImpl() { result = this.getAPrimaryQlClass() } + } } From fe2ab568a760a60bfb5090562ef4e0473a9eeedc Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Thu, 10 Sep 2026 11:00:44 +0200 Subject: [PATCH 0816/2098] Rust: Remove stale comment --- .../UncontrolledAllocationSize.expected | 294 +++++++++--------- .../test/query-tests/security/CWE-770/main.rs | 1 - 2 files changed, 147 insertions(+), 148 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected b/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected index 6356fb8c1af3..6b6cb7066279 100644 --- a/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected +++ b/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected @@ -1,57 +1,57 @@ #select -| main.rs:18:41:18:41 | v | main.rs:340:13:340:28 | ...::args(...) | main.rs:18:41:18:41 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:21:31:21:32 | l2 | main.rs:340:13:340:28 | ...::args(...) | main.rs:21:31:21:32 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:22:31:22:53 | ... .unwrap() | main.rs:340:13:340:28 | ...::args(...) | main.rs:22:31:22:53 | ... .unwrap() | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:23:31:23:68 | ... .pad_to_align() | main.rs:340:13:340:28 | ...::args(...) | main.rs:23:31:23:68 | ... .pad_to_align() | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:24:38:24:39 | l2 | main.rs:340:13:340:28 | ...::args(...) | main.rs:24:38:24:39 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:30:31:30:32 | l4 | main.rs:340:13:340:28 | ...::args(...) | main.rs:30:31:30:32 | l4 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:33:31:33:32 | l5 | main.rs:340:13:340:28 | ...::args(...) | main.rs:33:31:33:32 | l5 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:37:31:37:32 | l6 | main.rs:340:13:340:28 | ...::args(...) | main.rs:37:31:37:32 | l6 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:40:31:40:32 | l7 | main.rs:340:13:340:28 | ...::args(...) | main.rs:40:31:40:32 | l7 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:50:31:50:53 | ... .0 | main.rs:340:13:340:28 | ...::args(...) | main.rs:50:31:50:53 | ... .0 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:51:31:51:57 | ... .0 | main.rs:340:13:340:28 | ...::args(...) | main.rs:51:31:51:57 | ... .0 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:53:31:53:58 | ... .unwrap() | main.rs:340:13:340:28 | ...::args(...) | main.rs:53:31:53:58 | ... .unwrap() | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:54:31:54:63 | ... .unwrap() | main.rs:340:13:340:28 | ...::args(...) | main.rs:54:31:54:63 | ... .unwrap() | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:59:31:59:32 | k1 | main.rs:340:13:340:28 | ...::args(...) | main.rs:59:31:59:32 | k1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:61:31:61:32 | k2 | main.rs:340:13:340:28 | ...::args(...) | main.rs:61:31:61:32 | k2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:63:31:63:32 | k3 | main.rs:340:13:340:28 | ...::args(...) | main.rs:63:31:63:32 | k3 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:64:31:64:59 | ... .unwrap() | main.rs:340:13:340:28 | ...::args(...) | main.rs:64:31:64:59 | ... .unwrap() | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:65:31:65:59 | ... .unwrap() | main.rs:340:13:340:28 | ...::args(...) | main.rs:65:31:65:59 | ... .unwrap() | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:68:31:68:32 | l4 | main.rs:340:13:340:28 | ...::args(...) | main.rs:68:31:68:32 | l4 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:88:31:88:36 | layout | main.rs:340:13:340:28 | ...::args(...) | main.rs:88:31:88:36 | layout | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:96:35:96:36 | l1 | main.rs:340:13:340:28 | ...::args(...) | main.rs:96:35:96:36 | l1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:102:35:102:36 | l1 | main.rs:340:13:340:28 | ...::args(...) | main.rs:102:35:102:36 | l1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:103:35:103:36 | l3 | main.rs:340:13:340:28 | ...::args(...) | main.rs:103:35:103:36 | l3 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:109:35:109:36 | l1 | main.rs:340:13:340:28 | ...::args(...) | main.rs:109:35:109:36 | l1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:111:35:111:36 | l1 | main.rs:340:13:340:28 | ...::args(...) | main.rs:111:35:111:36 | l1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:146:35:146:36 | l1 | main.rs:340:13:340:28 | ...::args(...) | main.rs:146:35:146:36 | l1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:148:35:148:36 | l9 | main.rs:340:13:340:28 | ...::args(...) | main.rs:148:35:148:36 | l9 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:152:31:152:33 | l10 | main.rs:340:13:340:28 | ...::args(...) | main.rs:152:31:152:33 | l10 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:155:31:155:33 | l11 | main.rs:340:13:340:28 | ...::args(...) | main.rs:155:31:155:33 | l11 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:162:35:162:37 | l13 | main.rs:340:13:340:28 | ...::args(...) | main.rs:162:35:162:37 | l13 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:169:35:169:37 | l13 | main.rs:340:13:340:28 | ...::args(...) | main.rs:169:35:169:37 | l13 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:177:31:177:32 | l1 | main.rs:340:13:340:28 | ...::args(...) | main.rs:177:31:177:32 | l1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:193:38:193:39 | l2 | main.rs:340:13:340:28 | ...::args(...) | main.rs:193:38:193:39 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:194:45:194:46 | l2 | main.rs:340:13:340:28 | ...::args(...) | main.rs:194:45:194:46 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:195:41:195:42 | l2 | main.rs:340:13:340:28 | ...::args(...) | main.rs:195:41:195:42 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:196:48:196:49 | l2 | main.rs:340:13:340:28 | ...::args(...) | main.rs:196:48:196:49 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:197:41:197:42 | l2 | main.rs:340:13:340:28 | ...::args(...) | main.rs:197:41:197:42 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:198:48:198:49 | l2 | main.rs:340:13:340:28 | ...::args(...) | main.rs:198:48:198:49 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:203:48:203:48 | v | main.rs:340:13:340:28 | ...::args(...) | main.rs:203:48:203:48 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:209:53:209:54 | l2 | main.rs:340:13:340:28 | ...::args(...) | main.rs:209:53:209:54 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:211:60:211:61 | l2 | main.rs:340:13:340:28 | ...::args(...) | main.rs:211:60:211:61 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:214:51:214:52 | l2 | main.rs:340:13:340:28 | ...::args(...) | main.rs:214:51:214:52 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:220:26:220:26 | v | main.rs:340:13:340:28 | ...::args(...) | main.rs:220:26:220:26 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:221:36:221:36 | v | main.rs:340:13:340:28 | ...::args(...) | main.rs:221:36:221:36 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:223:30:223:30 | v | main.rs:340:13:340:28 | ...::args(...) | main.rs:223:30:223:30 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:224:26:224:26 | v | main.rs:340:13:340:28 | ...::args(...) | main.rs:224:26:224:26 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:225:31:225:31 | v | main.rs:340:13:340:28 | ...::args(...) | main.rs:225:31:225:31 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:229:43:229:43 | v | main.rs:340:13:340:28 | ...::args(...) | main.rs:229:43:229:43 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:230:39:230:39 | v | main.rs:340:13:340:28 | ...::args(...) | main.rs:230:39:230:39 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:231:46:231:46 | v | main.rs:340:13:340:28 | ...::args(...) | main.rs:231:46:231:46 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:232:42:232:42 | v | main.rs:340:13:340:28 | ...::args(...) | main.rs:232:42:232:42 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | -| main.rs:288:40:288:45 | layout | main.rs:312:25:312:40 | ...::args(...) | main.rs:288:40:288:45 | layout | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:312:25:312:40 | ...::args(...) | user-provided value | -| main.rs:332:26:332:26 | a | main.rs:340:13:340:28 | ...::args(...) | main.rs:332:26:332:26 | a | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:340:13:340:28 | ...::args(...) | user-provided value | +| main.rs:18:41:18:41 | v | main.rs:339:13:339:28 | ...::args(...) | main.rs:18:41:18:41 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:21:31:21:32 | l2 | main.rs:339:13:339:28 | ...::args(...) | main.rs:21:31:21:32 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:22:31:22:53 | ... .unwrap() | main.rs:339:13:339:28 | ...::args(...) | main.rs:22:31:22:53 | ... .unwrap() | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:23:31:23:68 | ... .pad_to_align() | main.rs:339:13:339:28 | ...::args(...) | main.rs:23:31:23:68 | ... .pad_to_align() | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:24:38:24:39 | l2 | main.rs:339:13:339:28 | ...::args(...) | main.rs:24:38:24:39 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:30:31:30:32 | l4 | main.rs:339:13:339:28 | ...::args(...) | main.rs:30:31:30:32 | l4 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:33:31:33:32 | l5 | main.rs:339:13:339:28 | ...::args(...) | main.rs:33:31:33:32 | l5 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:37:31:37:32 | l6 | main.rs:339:13:339:28 | ...::args(...) | main.rs:37:31:37:32 | l6 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:40:31:40:32 | l7 | main.rs:339:13:339:28 | ...::args(...) | main.rs:40:31:40:32 | l7 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:50:31:50:53 | ... .0 | main.rs:339:13:339:28 | ...::args(...) | main.rs:50:31:50:53 | ... .0 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:51:31:51:57 | ... .0 | main.rs:339:13:339:28 | ...::args(...) | main.rs:51:31:51:57 | ... .0 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:53:31:53:58 | ... .unwrap() | main.rs:339:13:339:28 | ...::args(...) | main.rs:53:31:53:58 | ... .unwrap() | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:54:31:54:63 | ... .unwrap() | main.rs:339:13:339:28 | ...::args(...) | main.rs:54:31:54:63 | ... .unwrap() | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:59:31:59:32 | k1 | main.rs:339:13:339:28 | ...::args(...) | main.rs:59:31:59:32 | k1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:61:31:61:32 | k2 | main.rs:339:13:339:28 | ...::args(...) | main.rs:61:31:61:32 | k2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:63:31:63:32 | k3 | main.rs:339:13:339:28 | ...::args(...) | main.rs:63:31:63:32 | k3 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:64:31:64:59 | ... .unwrap() | main.rs:339:13:339:28 | ...::args(...) | main.rs:64:31:64:59 | ... .unwrap() | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:65:31:65:59 | ... .unwrap() | main.rs:339:13:339:28 | ...::args(...) | main.rs:65:31:65:59 | ... .unwrap() | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:68:31:68:32 | l4 | main.rs:339:13:339:28 | ...::args(...) | main.rs:68:31:68:32 | l4 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:88:31:88:36 | layout | main.rs:339:13:339:28 | ...::args(...) | main.rs:88:31:88:36 | layout | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:96:35:96:36 | l1 | main.rs:339:13:339:28 | ...::args(...) | main.rs:96:35:96:36 | l1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:102:35:102:36 | l1 | main.rs:339:13:339:28 | ...::args(...) | main.rs:102:35:102:36 | l1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:103:35:103:36 | l3 | main.rs:339:13:339:28 | ...::args(...) | main.rs:103:35:103:36 | l3 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:109:35:109:36 | l1 | main.rs:339:13:339:28 | ...::args(...) | main.rs:109:35:109:36 | l1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:111:35:111:36 | l1 | main.rs:339:13:339:28 | ...::args(...) | main.rs:111:35:111:36 | l1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:146:35:146:36 | l1 | main.rs:339:13:339:28 | ...::args(...) | main.rs:146:35:146:36 | l1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:148:35:148:36 | l9 | main.rs:339:13:339:28 | ...::args(...) | main.rs:148:35:148:36 | l9 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:152:31:152:33 | l10 | main.rs:339:13:339:28 | ...::args(...) | main.rs:152:31:152:33 | l10 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:155:31:155:33 | l11 | main.rs:339:13:339:28 | ...::args(...) | main.rs:155:31:155:33 | l11 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:162:35:162:37 | l13 | main.rs:339:13:339:28 | ...::args(...) | main.rs:162:35:162:37 | l13 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:169:35:169:37 | l13 | main.rs:339:13:339:28 | ...::args(...) | main.rs:169:35:169:37 | l13 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:177:31:177:32 | l1 | main.rs:339:13:339:28 | ...::args(...) | main.rs:177:31:177:32 | l1 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:193:38:193:39 | l2 | main.rs:339:13:339:28 | ...::args(...) | main.rs:193:38:193:39 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:194:45:194:46 | l2 | main.rs:339:13:339:28 | ...::args(...) | main.rs:194:45:194:46 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:195:41:195:42 | l2 | main.rs:339:13:339:28 | ...::args(...) | main.rs:195:41:195:42 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:196:48:196:49 | l2 | main.rs:339:13:339:28 | ...::args(...) | main.rs:196:48:196:49 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:197:41:197:42 | l2 | main.rs:339:13:339:28 | ...::args(...) | main.rs:197:41:197:42 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:198:48:198:49 | l2 | main.rs:339:13:339:28 | ...::args(...) | main.rs:198:48:198:49 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:202:48:202:48 | v | main.rs:339:13:339:28 | ...::args(...) | main.rs:202:48:202:48 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:208:53:208:54 | l2 | main.rs:339:13:339:28 | ...::args(...) | main.rs:208:53:208:54 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:210:60:210:61 | l2 | main.rs:339:13:339:28 | ...::args(...) | main.rs:210:60:210:61 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:213:51:213:52 | l2 | main.rs:339:13:339:28 | ...::args(...) | main.rs:213:51:213:52 | l2 | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:219:26:219:26 | v | main.rs:339:13:339:28 | ...::args(...) | main.rs:219:26:219:26 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:220:36:220:36 | v | main.rs:339:13:339:28 | ...::args(...) | main.rs:220:36:220:36 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:222:30:222:30 | v | main.rs:339:13:339:28 | ...::args(...) | main.rs:222:30:222:30 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:223:26:223:26 | v | main.rs:339:13:339:28 | ...::args(...) | main.rs:223:26:223:26 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:224:31:224:31 | v | main.rs:339:13:339:28 | ...::args(...) | main.rs:224:31:224:31 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:228:43:228:43 | v | main.rs:339:13:339:28 | ...::args(...) | main.rs:228:43:228:43 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:229:39:229:39 | v | main.rs:339:13:339:28 | ...::args(...) | main.rs:229:39:229:39 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:230:46:230:46 | v | main.rs:339:13:339:28 | ...::args(...) | main.rs:230:46:230:46 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:231:42:231:42 | v | main.rs:339:13:339:28 | ...::args(...) | main.rs:231:42:231:42 | v | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | +| main.rs:287:40:287:45 | layout | main.rs:311:25:311:40 | ...::args(...) | main.rs:287:40:287:45 | layout | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:311:25:311:40 | ...::args(...) | user-provided value | +| main.rs:331:26:331:26 | a | main.rs:339:13:339:28 | ...::args(...) | main.rs:331:26:331:26 | a | This allocation size is derived from a $@ and could allocate arbitrary amounts of memory. | main.rs:339:13:339:28 | ...::args(...) | user-provided value | edges | main.rs:12:36:12:43 | ...: usize | main.rs:18:41:18:41 | v | provenance | Sink:MaD:17 | | main.rs:12:36:12:43 | ...: usize | main.rs:20:50:20:50 | v | provenance | | @@ -188,63 +188,63 @@ edges | main.rs:161:19:161:68 | ... .unwrap() | main.rs:161:13:161:15 | l13 | provenance | | | main.rs:161:55:161:55 | v | main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | provenance | MaD:30 | | main.rs:183:29:183:36 | ...: usize | main.rs:192:46:192:46 | v | provenance | | -| main.rs:183:29:183:36 | ...: usize | main.rs:203:48:203:48 | v | provenance | Sink:MaD:9 | +| main.rs:183:29:183:36 | ...: usize | main.rs:202:48:202:48 | v | provenance | Sink:MaD:9 | | main.rs:192:9:192:10 | l2 | main.rs:193:38:193:39 | l2 | provenance | Sink:MaD:7 | | main.rs:192:9:192:10 | l2 | main.rs:194:45:194:46 | l2 | provenance | Sink:MaD:8 | | main.rs:192:9:192:10 | l2 | main.rs:195:41:195:42 | l2 | provenance | Sink:MaD:10 | | main.rs:192:9:192:10 | l2 | main.rs:196:48:196:49 | l2 | provenance | Sink:MaD:11 | | main.rs:192:9:192:10 | l2 | main.rs:197:41:197:42 | l2 | provenance | Sink:MaD:1 | | main.rs:192:9:192:10 | l2 | main.rs:198:48:198:49 | l2 | provenance | Sink:MaD:2 | -| main.rs:192:9:192:10 | l2 | main.rs:209:53:209:54 | l2 | provenance | Sink:MaD:12 | -| main.rs:192:9:192:10 | l2 | main.rs:211:60:211:61 | l2 | provenance | Sink:MaD:13 | -| main.rs:192:9:192:10 | l2 | main.rs:214:51:214:52 | l2 | provenance | Sink:MaD:14 | +| main.rs:192:9:192:10 | l2 | main.rs:208:53:208:54 | l2 | provenance | Sink:MaD:12 | +| main.rs:192:9:192:10 | l2 | main.rs:210:60:210:61 | l2 | provenance | Sink:MaD:13 | +| main.rs:192:9:192:10 | l2 | main.rs:213:51:213:52 | l2 | provenance | Sink:MaD:14 | | main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | main.rs:192:14:192:56 | ... .unwrap() | provenance | MaD:41 | | main.rs:192:14:192:56 | ... .unwrap() | main.rs:192:9:192:10 | l2 | provenance | | | main.rs:192:46:192:46 | v | main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | -| main.rs:218:27:218:34 | ...: usize | main.rs:220:26:220:26 | v | provenance | Sink:MaD:20 | -| main.rs:218:27:218:34 | ...: usize | main.rs:221:36:221:36 | v | provenance | Sink:MaD:18 | -| main.rs:218:27:218:34 | ...: usize | main.rs:223:30:223:30 | v | provenance | Sink:MaD:19 | -| main.rs:218:27:218:34 | ...: usize | main.rs:224:26:224:26 | v | provenance | Sink:MaD:19 | -| main.rs:218:27:218:34 | ...: usize | main.rs:225:31:225:31 | v | provenance | Sink:MaD:21 | -| main.rs:228:24:228:31 | ...: usize | main.rs:229:43:229:43 | v | provenance | Sink:MaD:3 | -| main.rs:228:24:228:31 | ...: usize | main.rs:230:39:230:39 | v | provenance | Sink:MaD:5 | -| main.rs:228:24:228:31 | ...: usize | main.rs:231:46:231:46 | v | provenance | Sink:MaD:4 | -| main.rs:228:24:228:31 | ...: usize | main.rs:232:42:232:42 | v | provenance | Sink:MaD:6 | -| main.rs:283:24:283:41 | ...: String | main.rs:284:21:284:30 | user_input | provenance | | -| main.rs:284:9:284:17 | num_bytes | main.rs:286:54:286:62 | num_bytes | provenance | | -| main.rs:284:21:284:30 | user_input | main.rs:284:21:284:47 | user_input.parse() [Ok] | provenance | MaD:23 | -| main.rs:284:21:284:47 | user_input.parse() [Ok] | main.rs:284:21:284:48 | TryExpr | provenance | | -| main.rs:284:21:284:48 | TryExpr | main.rs:284:21:284:77 | ... * ... | provenance | MaD:38 | -| main.rs:284:21:284:77 | ... * ... | main.rs:284:9:284:17 | num_bytes | provenance | | -| main.rs:286:9:286:14 | layout | main.rs:288:40:288:45 | layout | provenance | Sink:MaD:15 | -| main.rs:286:18:286:66 | ...::from_size_align(...) [Ok] | main.rs:286:18:286:75 | ... .unwrap() | provenance | MaD:41 | -| main.rs:286:18:286:75 | ... .unwrap() | main.rs:286:9:286:14 | layout | provenance | | -| main.rs:286:54:286:62 | num_bytes | main.rs:286:18:286:66 | ...::from_size_align(...) [Ok] | provenance | MaD:30 | -| main.rs:312:25:312:40 | ...::args(...) | main.rs:312:25:312:40 | ...::args(...) [element] | provenance | Src:MaD:22 | -| main.rs:312:25:312:40 | ...::args(...) [element] | main.rs:312:25:312:47 | ... .nth(...) [Some] | provenance | MaD:36 | -| main.rs:312:25:312:47 | ... .nth(...) [Some] | main.rs:312:25:312:74 | ... .unwrap_or(...) | provenance | MaD:39 | -| main.rs:312:25:312:74 | ... .unwrap_or(...) | main.rs:283:24:283:41 | ...: String | provenance | | -| main.rs:318:26:318:33 | ...: usize | main.rs:332:26:332:26 | a | provenance | Sink:MaD:20 | -| main.rs:340:9:340:9 | v | main.rs:343:34:343:34 | v | provenance | | -| main.rs:340:9:340:9 | v | main.rs:344:42:344:42 | v | provenance | | -| main.rs:340:9:340:9 | v | main.rs:345:36:345:36 | v | provenance | | -| main.rs:340:9:340:9 | v | main.rs:346:27:346:27 | v | provenance | | -| main.rs:340:9:340:9 | v | main.rs:347:25:347:25 | v | provenance | | -| main.rs:340:9:340:9 | v | main.rs:348:22:348:22 | v | provenance | | -| main.rs:340:9:340:9 | v | main.rs:350:24:350:24 | v | provenance | | -| main.rs:340:13:340:28 | ...::args(...) | main.rs:340:13:340:28 | ...::args(...) [element] | provenance | Src:MaD:22 | -| main.rs:340:13:340:28 | ...::args(...) [element] | main.rs:340:13:340:35 | ... .nth(...) [Some] | provenance | MaD:36 | -| main.rs:340:13:340:35 | ... .nth(...) [Some] | main.rs:340:13:340:65 | ... .unwrap_or(...) | provenance | MaD:39 | -| main.rs:340:13:340:65 | ... .unwrap_or(...) | main.rs:340:13:340:82 | ... .parse() [Ok] | provenance | MaD:23 | -| main.rs:340:13:340:82 | ... .parse() [Ok] | main.rs:340:13:340:91 | ... .unwrap() | provenance | MaD:41 | -| main.rs:340:13:340:91 | ... .unwrap() | main.rs:340:9:340:9 | v | provenance | | -| main.rs:343:34:343:34 | v | main.rs:12:36:12:43 | ...: usize | provenance | | -| main.rs:344:42:344:42 | v | main.rs:43:44:43:51 | ...: usize | provenance | | -| main.rs:345:36:345:36 | v | main.rs:91:38:91:45 | ...: usize | provenance | | -| main.rs:346:27:346:27 | v | main.rs:183:29:183:36 | ...: usize | provenance | | -| main.rs:347:25:347:25 | v | main.rs:218:27:218:34 | ...: usize | provenance | | -| main.rs:348:22:348:22 | v | main.rs:228:24:228:31 | ...: usize | provenance | | -| main.rs:350:24:350:24 | v | main.rs:318:26:318:33 | ...: usize | provenance | | +| main.rs:217:27:217:34 | ...: usize | main.rs:219:26:219:26 | v | provenance | Sink:MaD:20 | +| main.rs:217:27:217:34 | ...: usize | main.rs:220:36:220:36 | v | provenance | Sink:MaD:18 | +| main.rs:217:27:217:34 | ...: usize | main.rs:222:30:222:30 | v | provenance | Sink:MaD:19 | +| main.rs:217:27:217:34 | ...: usize | main.rs:223:26:223:26 | v | provenance | Sink:MaD:19 | +| main.rs:217:27:217:34 | ...: usize | main.rs:224:31:224:31 | v | provenance | Sink:MaD:21 | +| main.rs:227:24:227:31 | ...: usize | main.rs:228:43:228:43 | v | provenance | Sink:MaD:3 | +| main.rs:227:24:227:31 | ...: usize | main.rs:229:39:229:39 | v | provenance | Sink:MaD:5 | +| main.rs:227:24:227:31 | ...: usize | main.rs:230:46:230:46 | v | provenance | Sink:MaD:4 | +| main.rs:227:24:227:31 | ...: usize | main.rs:231:42:231:42 | v | provenance | Sink:MaD:6 | +| main.rs:282:24:282:41 | ...: String | main.rs:283:21:283:30 | user_input | provenance | | +| main.rs:283:9:283:17 | num_bytes | main.rs:285:54:285:62 | num_bytes | provenance | | +| main.rs:283:21:283:30 | user_input | main.rs:283:21:283:47 | user_input.parse() [Ok] | provenance | MaD:23 | +| main.rs:283:21:283:47 | user_input.parse() [Ok] | main.rs:283:21:283:48 | TryExpr | provenance | | +| main.rs:283:21:283:48 | TryExpr | main.rs:283:21:283:77 | ... * ... | provenance | MaD:38 | +| main.rs:283:21:283:77 | ... * ... | main.rs:283:9:283:17 | num_bytes | provenance | | +| main.rs:285:9:285:14 | layout | main.rs:287:40:287:45 | layout | provenance | Sink:MaD:15 | +| main.rs:285:18:285:66 | ...::from_size_align(...) [Ok] | main.rs:285:18:285:75 | ... .unwrap() | provenance | MaD:41 | +| main.rs:285:18:285:75 | ... .unwrap() | main.rs:285:9:285:14 | layout | provenance | | +| main.rs:285:54:285:62 | num_bytes | main.rs:285:18:285:66 | ...::from_size_align(...) [Ok] | provenance | MaD:30 | +| main.rs:311:25:311:40 | ...::args(...) | main.rs:311:25:311:40 | ...::args(...) [element] | provenance | Src:MaD:22 | +| main.rs:311:25:311:40 | ...::args(...) [element] | main.rs:311:25:311:47 | ... .nth(...) [Some] | provenance | MaD:36 | +| main.rs:311:25:311:47 | ... .nth(...) [Some] | main.rs:311:25:311:74 | ... .unwrap_or(...) | provenance | MaD:39 | +| main.rs:311:25:311:74 | ... .unwrap_or(...) | main.rs:282:24:282:41 | ...: String | provenance | | +| main.rs:317:26:317:33 | ...: usize | main.rs:331:26:331:26 | a | provenance | Sink:MaD:20 | +| main.rs:339:9:339:9 | v | main.rs:342:34:342:34 | v | provenance | | +| main.rs:339:9:339:9 | v | main.rs:343:42:343:42 | v | provenance | | +| main.rs:339:9:339:9 | v | main.rs:344:36:344:36 | v | provenance | | +| main.rs:339:9:339:9 | v | main.rs:345:27:345:27 | v | provenance | | +| main.rs:339:9:339:9 | v | main.rs:346:25:346:25 | v | provenance | | +| main.rs:339:9:339:9 | v | main.rs:347:22:347:22 | v | provenance | | +| main.rs:339:9:339:9 | v | main.rs:349:24:349:24 | v | provenance | | +| main.rs:339:13:339:28 | ...::args(...) | main.rs:339:13:339:28 | ...::args(...) [element] | provenance | Src:MaD:22 | +| main.rs:339:13:339:28 | ...::args(...) [element] | main.rs:339:13:339:35 | ... .nth(...) [Some] | provenance | MaD:36 | +| main.rs:339:13:339:35 | ... .nth(...) [Some] | main.rs:339:13:339:65 | ... .unwrap_or(...) | provenance | MaD:39 | +| main.rs:339:13:339:65 | ... .unwrap_or(...) | main.rs:339:13:339:82 | ... .parse() [Ok] | provenance | MaD:23 | +| main.rs:339:13:339:82 | ... .parse() [Ok] | main.rs:339:13:339:91 | ... .unwrap() | provenance | MaD:41 | +| main.rs:339:13:339:91 | ... .unwrap() | main.rs:339:9:339:9 | v | provenance | | +| main.rs:342:34:342:34 | v | main.rs:12:36:12:43 | ...: usize | provenance | | +| main.rs:343:42:343:42 | v | main.rs:43:44:43:51 | ...: usize | provenance | | +| main.rs:344:36:344:36 | v | main.rs:91:38:91:45 | ...: usize | provenance | | +| main.rs:345:27:345:27 | v | main.rs:183:29:183:36 | ...: usize | provenance | | +| main.rs:346:25:346:25 | v | main.rs:217:27:217:34 | ...: usize | provenance | | +| main.rs:347:22:347:22 | v | main.rs:227:24:227:31 | ...: usize | provenance | | +| main.rs:349:24:349:24 | v | main.rs:317:26:317:33 | ...: usize | provenance | | models | 1 | Sink: ::allocate; Argument[0]; alloc-layout | | 2 | Sink: ::allocate_zeroed; Argument[0]; alloc-layout | @@ -438,50 +438,50 @@ nodes | main.rs:196:48:196:49 | l2 | semmle.label | l2 | | main.rs:197:41:197:42 | l2 | semmle.label | l2 | | main.rs:198:48:198:49 | l2 | semmle.label | l2 | -| main.rs:203:48:203:48 | v | semmle.label | v | -| main.rs:209:53:209:54 | l2 | semmle.label | l2 | -| main.rs:211:60:211:61 | l2 | semmle.label | l2 | -| main.rs:214:51:214:52 | l2 | semmle.label | l2 | -| main.rs:218:27:218:34 | ...: usize | semmle.label | ...: usize | -| main.rs:220:26:220:26 | v | semmle.label | v | -| main.rs:221:36:221:36 | v | semmle.label | v | -| main.rs:223:30:223:30 | v | semmle.label | v | -| main.rs:224:26:224:26 | v | semmle.label | v | -| main.rs:225:31:225:31 | v | semmle.label | v | -| main.rs:228:24:228:31 | ...: usize | semmle.label | ...: usize | -| main.rs:229:43:229:43 | v | semmle.label | v | -| main.rs:230:39:230:39 | v | semmle.label | v | -| main.rs:231:46:231:46 | v | semmle.label | v | -| main.rs:232:42:232:42 | v | semmle.label | v | -| main.rs:283:24:283:41 | ...: String | semmle.label | ...: String | -| main.rs:284:9:284:17 | num_bytes | semmle.label | num_bytes | -| main.rs:284:21:284:30 | user_input | semmle.label | user_input | -| main.rs:284:21:284:47 | user_input.parse() [Ok] | semmle.label | user_input.parse() [Ok] | -| main.rs:284:21:284:48 | TryExpr | semmle.label | TryExpr | -| main.rs:284:21:284:77 | ... * ... | semmle.label | ... * ... | -| main.rs:286:9:286:14 | layout | semmle.label | layout | -| main.rs:286:18:286:66 | ...::from_size_align(...) [Ok] | semmle.label | ...::from_size_align(...) [Ok] | -| main.rs:286:18:286:75 | ... .unwrap() | semmle.label | ... .unwrap() | -| main.rs:286:54:286:62 | num_bytes | semmle.label | num_bytes | -| main.rs:288:40:288:45 | layout | semmle.label | layout | -| main.rs:312:25:312:40 | ...::args(...) | semmle.label | ...::args(...) | -| main.rs:312:25:312:40 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | -| main.rs:312:25:312:47 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | -| main.rs:312:25:312:74 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | -| main.rs:318:26:318:33 | ...: usize | semmle.label | ...: usize | -| main.rs:332:26:332:26 | a | semmle.label | a | -| main.rs:340:9:340:9 | v | semmle.label | v | -| main.rs:340:13:340:28 | ...::args(...) | semmle.label | ...::args(...) | -| main.rs:340:13:340:28 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | -| main.rs:340:13:340:35 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | -| main.rs:340:13:340:65 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | -| main.rs:340:13:340:82 | ... .parse() [Ok] | semmle.label | ... .parse() [Ok] | -| main.rs:340:13:340:91 | ... .unwrap() | semmle.label | ... .unwrap() | -| main.rs:343:34:343:34 | v | semmle.label | v | -| main.rs:344:42:344:42 | v | semmle.label | v | -| main.rs:345:36:345:36 | v | semmle.label | v | -| main.rs:346:27:346:27 | v | semmle.label | v | -| main.rs:347:25:347:25 | v | semmle.label | v | -| main.rs:348:22:348:22 | v | semmle.label | v | -| main.rs:350:24:350:24 | v | semmle.label | v | +| main.rs:202:48:202:48 | v | semmle.label | v | +| main.rs:208:53:208:54 | l2 | semmle.label | l2 | +| main.rs:210:60:210:61 | l2 | semmle.label | l2 | +| main.rs:213:51:213:52 | l2 | semmle.label | l2 | +| main.rs:217:27:217:34 | ...: usize | semmle.label | ...: usize | +| main.rs:219:26:219:26 | v | semmle.label | v | +| main.rs:220:36:220:36 | v | semmle.label | v | +| main.rs:222:30:222:30 | v | semmle.label | v | +| main.rs:223:26:223:26 | v | semmle.label | v | +| main.rs:224:31:224:31 | v | semmle.label | v | +| main.rs:227:24:227:31 | ...: usize | semmle.label | ...: usize | +| main.rs:228:43:228:43 | v | semmle.label | v | +| main.rs:229:39:229:39 | v | semmle.label | v | +| main.rs:230:46:230:46 | v | semmle.label | v | +| main.rs:231:42:231:42 | v | semmle.label | v | +| main.rs:282:24:282:41 | ...: String | semmle.label | ...: String | +| main.rs:283:9:283:17 | num_bytes | semmle.label | num_bytes | +| main.rs:283:21:283:30 | user_input | semmle.label | user_input | +| main.rs:283:21:283:47 | user_input.parse() [Ok] | semmle.label | user_input.parse() [Ok] | +| main.rs:283:21:283:48 | TryExpr | semmle.label | TryExpr | +| main.rs:283:21:283:77 | ... * ... | semmle.label | ... * ... | +| main.rs:285:9:285:14 | layout | semmle.label | layout | +| main.rs:285:18:285:66 | ...::from_size_align(...) [Ok] | semmle.label | ...::from_size_align(...) [Ok] | +| main.rs:285:18:285:75 | ... .unwrap() | semmle.label | ... .unwrap() | +| main.rs:285:54:285:62 | num_bytes | semmle.label | num_bytes | +| main.rs:287:40:287:45 | layout | semmle.label | layout | +| main.rs:311:25:311:40 | ...::args(...) | semmle.label | ...::args(...) | +| main.rs:311:25:311:40 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | +| main.rs:311:25:311:47 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | +| main.rs:311:25:311:74 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | +| main.rs:317:26:317:33 | ...: usize | semmle.label | ...: usize | +| main.rs:331:26:331:26 | a | semmle.label | a | +| main.rs:339:9:339:9 | v | semmle.label | v | +| main.rs:339:13:339:28 | ...::args(...) | semmle.label | ...::args(...) | +| main.rs:339:13:339:28 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | +| main.rs:339:13:339:35 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | +| main.rs:339:13:339:65 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | +| main.rs:339:13:339:82 | ... .parse() [Ok] | semmle.label | ... .parse() [Ok] | +| main.rs:339:13:339:91 | ... .unwrap() | semmle.label | ... .unwrap() | +| main.rs:342:34:342:34 | v | semmle.label | v | +| main.rs:343:42:343:42 | v | semmle.label | v | +| main.rs:344:36:344:36 | v | semmle.label | v | +| main.rs:345:27:345:27 | v | semmle.label | v | +| main.rs:346:25:346:25 | v | semmle.label | v | +| main.rs:347:22:347:22 | v | semmle.label | v | +| main.rs:349:24:349:24 | v | semmle.label | v | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-770/main.rs b/rust/ql/test/query-tests/security/CWE-770/main.rs index 20b13ee6256a..7ab9f9445fba 100644 --- a/rust/ql/test/query-tests/security/CWE-770/main.rs +++ b/rust/ql/test/query-tests/security/CWE-770/main.rs @@ -199,7 +199,6 @@ unsafe fn test_system_alloc(v: usize) { let l3 = std::alloc::Layout::array::(10).unwrap(); let m3 = std::alloc::System.alloc(l3); - // `System.realloc` resolves to that same blanket `GlobalAlloc` impl (see above); MISSING. let _ = std::alloc::System.realloc(m3, l3, v); // $ Alert[rust/uncontrolled-allocation-size]=arg1 let l4 = std::alloc::Layout::array::(10).unwrap(); From 3d32cbca3f4cf9de3b761627eb6a0eeb912e71b3 Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 9 Sep 2026 21:09:57 +0200 Subject: [PATCH 0817/2098] unified: Add tests with expressions in pattern context --- .../local-name-binding/expr_patterns.swift | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 unified/ql/test/library-tests/local-name-binding/expr_patterns.swift diff --git a/unified/ql/test/library-tests/local-name-binding/expr_patterns.swift b/unified/ql/test/library-tests/local-name-binding/expr_patterns.swift new file mode 100644 index 000000000000..6bc6cf99686a --- /dev/null +++ b/unified/ql/test/library-tests/local-name-binding/expr_patterns.swift @@ -0,0 +1,40 @@ +func t1() { + let a = 0 // name=a1 + let b = 1 // name=b1 + switch 1 { + case a + b: // $ access=a1 access=b1 + a; // $ access=a1 + b; // $ access=b1 + break + default: + break + } +} + +func t2() { + let b = 1 // name=b1 + class M { + static let b = 1 + } + switch 1 { + case let M.b: // $ access=M + b; // $ access=b1 + break + default: + break + } +} + +func t3() { + let b = 1 // name=b1 + class M { + static let b = 1 + } + switch 1 { + case let true ? M.b : M.b: // $ access=M + b; // $ access=b1 + break + default: + break + } +} From 9df4aa959398f245443faf29ba59be3ada76b91e Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 10 Sep 2026 11:53:38 +0200 Subject: [PATCH 0818/2098] unified: Add corpus test with many expressions in pattern context --- .../switch-expression-pattern.output | 390 ++++++++++++++++++ .../switch-expression-pattern.swift | 11 + 2 files changed, 401 insertions(+) create mode 100644 unified/extractor/tests/corpus/swift/control-flow/switch-expression-pattern.output create mode 100644 unified/extractor/tests/corpus/swift/control-flow/switch-expression-pattern.swift diff --git a/unified/extractor/tests/corpus/swift/control-flow/switch-expression-pattern.output b/unified/extractor/tests/corpus/swift/control-flow/switch-expression-pattern.output new file mode 100644 index 000000000000..0a4fe7302b05 --- /dev/null +++ b/unified/extractor/tests/corpus/swift/control-flow/switch-expression-pattern.output @@ -0,0 +1,390 @@ +// Arbitrary expressions may appear in pattern context. +switch subject { +case value, value + offset, -value, lower...upper, makeValue(), makeValue().member, + .inferred, (value, offset), [value], [key: value], optional?, try value, + value!, value as Target, value is Target, await value: + consume(value) +case condition ? value : fallback: + consume(fallback) +default: + break +} + +--- + +sourceFile + endOfFileToken: endOfFile + statements: + codeBlockItem + item: + expressionStmt + expression: + switchExpr + leftBrace: { + rightBrace: } + cases: + switchCase + label: + switchCaseLabel + colon: : + caseKeyword: case + caseItems: + switchCaseItem + trailingComma: , + pattern: + expressionPattern + expression: + declReferenceExpr + baseName: identifier "value" + switchCaseItem + trailingComma: , + pattern: + expressionPattern + expression: + infixOperatorExpr + operator: + binaryOperatorExpr + operator: binaryOperator "+" + leftOperand: + declReferenceExpr + baseName: identifier "value" + rightOperand: + declReferenceExpr + baseName: identifier "offset" + switchCaseItem + trailingComma: , + pattern: + expressionPattern + expression: + prefixOperatorExpr + expression: + declReferenceExpr + baseName: identifier "value" + operator: prefixOperator "-" + switchCaseItem + trailingComma: , + pattern: + expressionPattern + expression: + infixOperatorExpr + operator: + binaryOperatorExpr + operator: binaryOperator "..." + leftOperand: + declReferenceExpr + baseName: identifier "lower" + rightOperand: + declReferenceExpr + baseName: identifier "upper" + switchCaseItem + trailingComma: , + pattern: + expressionPattern + expression: + functionCallExpr + leftParen: ( + rightParen: ) + arguments: + additionalTrailingClosures: + calledExpression: + declReferenceExpr + baseName: identifier "makeValue" + switchCaseItem + trailingComma: , + pattern: + expressionPattern + expression: + memberAccessExpr + period: . + declName: + declReferenceExpr + baseName: identifier "member" + base: + functionCallExpr + leftParen: ( + rightParen: ) + arguments: + additionalTrailingClosures: + calledExpression: + declReferenceExpr + baseName: identifier "makeValue" + switchCaseItem + trailingComma: , + pattern: + expressionPattern + expression: + memberAccessExpr + period: . + declName: + declReferenceExpr + baseName: identifier "inferred" + switchCaseItem + trailingComma: , + pattern: + expressionPattern + expression: + tupleExpr + leftParen: ( + rightParen: ) + elements: + labeledExpr + expression: + declReferenceExpr + baseName: identifier "value" + trailingComma: , + labeledExpr + expression: + declReferenceExpr + baseName: identifier "offset" + switchCaseItem + trailingComma: , + pattern: + expressionPattern + expression: + arrayExpr + elements: + arrayElement + expression: + declReferenceExpr + baseName: identifier "value" + leftSquare: [ + rightSquare: ] + switchCaseItem + trailingComma: , + pattern: + expressionPattern + expression: + dictionaryExpr + leftSquare: [ + rightSquare: ] + content: + dictionaryElement + colon: : + value: + declReferenceExpr + baseName: identifier "value" + key: + declReferenceExpr + baseName: identifier "key" + switchCaseItem + trailingComma: , + pattern: + expressionPattern + expression: + optionalChainingExpr + expression: + declReferenceExpr + baseName: identifier "optional" + questionMark: ? + switchCaseItem + trailingComma: , + pattern: + expressionPattern + expression: + tryExpr + expression: + declReferenceExpr + baseName: identifier "value" + tryKeyword: try + switchCaseItem + trailingComma: , + pattern: + expressionPattern + expression: + forceUnwrapExpr + expression: + declReferenceExpr + baseName: identifier "value" + exclamationMark: ! + switchCaseItem + trailingComma: , + pattern: + expressionPattern + expression: + asExpr + expression: + declReferenceExpr + baseName: identifier "value" + asKeyword: as + type: + identifierType + name: identifier "Target" + switchCaseItem + trailingComma: , + pattern: + expressionPattern + expression: + isExpr + expression: + declReferenceExpr + baseName: identifier "value" + type: + identifierType + name: identifier "Target" + isKeyword: is + switchCaseItem + pattern: + expressionPattern + expression: + awaitExpr + expression: + declReferenceExpr + baseName: identifier "value" + awaitKeyword: await + statements: + codeBlockItem + item: + functionCallExpr + leftParen: ( + rightParen: ) + arguments: + labeledExpr + expression: + declReferenceExpr + baseName: identifier "value" + additionalTrailingClosures: + calledExpression: + declReferenceExpr + baseName: identifier "consume" + switchCase + label: + switchCaseLabel + colon: : + caseKeyword: case + caseItems: + switchCaseItem + pattern: + expressionPattern + expression: + ternaryExpr + colon: : + condition: + declReferenceExpr + baseName: identifier "condition" + questionMark: ? + elseExpression: + declReferenceExpr + baseName: identifier "fallback" + thenExpression: + declReferenceExpr + baseName: identifier "value" + statements: + codeBlockItem + item: + functionCallExpr + leftParen: ( + rightParen: ) + arguments: + labeledExpr + expression: + declReferenceExpr + baseName: identifier "fallback" + additionalTrailingClosures: + calledExpression: + declReferenceExpr + baseName: identifier "consume" + switchCase + label: + switchDefaultLabel + colon: : + defaultKeyword: default + statements: + codeBlockItem + item: + breakStmt + breakKeyword: break + subject: + declReferenceExpr + baseName: identifier "subject" + switchKeyword: switch + +--- + +top_level + body: + block + stmt: + switch_expr + value: identifier "subject" + case: + switch_case + pattern: + or_pattern + pattern: + identifier "value" + binary_expr + left: identifier "value" + operator: infix_operator "+" + right: identifier "offset" + unary_expr + operand: identifier "value" + operator: prefix_operator "-" + binary_expr + left: identifier "lower" + operator: infix_operator "..." + right: identifier "upper" + call_expr + callee: identifier "makeValue" + member_access_expr + base: + call_expr + callee: identifier "makeValue" + member_name_node: identifier "member" + member_access_expr + base: inferred_type_expr "." + member_name_node: identifier "inferred" + tuple_expr "(value, offset)" + array_literal + element: identifier "value" + map_literal "[key: value]" + call_expr + callee: + member_access_expr + base: identifier "Optional" + member_name_node: identifier "some" + argument: + argument + value: identifier "optional" + unary_expr + operand: identifier "value" + operator: prefix_operator "try" + unary_expr + operand: identifier "value" + operator: postfix_operator "!" + type_cast_expr + expr: identifier "value" + operator: infix_operator "as" + type: identifier "Target" + type_test_expr + expr: identifier "value" + operator: infix_operator "is" + type: identifier "Target" + unary_expr + operand: identifier "value" + operator: prefix_operator "await" + body: + block + stmt: + call_expr + callee: identifier "consume" + argument: + argument + value: identifier "value" + switch_case + pattern: + if_expr + condition: identifier "condition" + then: identifier "value" + else: identifier "fallback" + body: + block + stmt: + call_expr + callee: identifier "consume" + argument: + argument + value: identifier "fallback" + switch_case + body: + block + stmt: break_expr "break" diff --git a/unified/extractor/tests/corpus/swift/control-flow/switch-expression-pattern.swift b/unified/extractor/tests/corpus/swift/control-flow/switch-expression-pattern.swift new file mode 100644 index 000000000000..02efbe6e8177 --- /dev/null +++ b/unified/extractor/tests/corpus/swift/control-flow/switch-expression-pattern.swift @@ -0,0 +1,11 @@ +// Arbitrary expressions may appear in pattern context. +switch subject { +case value, value + offset, -value, lower...upper, makeValue(), makeValue().member, + .inferred, (value, offset), [value], [key: value], optional?, try value, + value!, value as Target, value is Target, await value: + consume(value) +case condition ? value : fallback: + consume(fallback) +default: + break +} \ No newline at end of file From 30e9b94604bf478614f42c180081c8b6ce1cc5b3 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 10 Sep 2026 12:00:43 +0200 Subject: [PATCH 0819/2098] unified: Add IdentifierExpr and use it in CFG --- unified/ql/lib/codeql/unified/internal/AstExtra.qll | 12 ++++++++++++ .../lib/codeql/unified/internal/ControlFlowGraph.qll | 6 +++++- .../lib/codeql/unified/internal/LocalNameBinding.qll | 11 +---------- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/AstExtra.qll b/unified/ql/lib/codeql/unified/internal/AstExtra.qll index f5a9ad09caaa..fea1a2490363 100644 --- a/unified/ql/lib/codeql/unified/internal/AstExtra.qll +++ b/unified/ql/lib/codeql/unified/internal/AstExtra.qll @@ -68,4 +68,16 @@ module Public { final class TopLevelStmt extends Stmt { TopLevelStmt() { this = any(TopLevel t).getBody().getAStmt() } } + + /** An identifier appearing in the context of an expression, pattern, or type annotation. */ + final class IdentifierExpr extends Identifier { + IdentifierExpr() { + not this = any(MemberAccessExpr e).getMemberNameNode() and + not this = any(Argument a).getNameNode() and + not this = any(Parameter p).getExternalNameNode() and + not this = any(LabeledStmt stmt).getLabelNameNode() and + not this = any(BreakExpr expr).getLabelNameNode() and + not this = any(ContinueExpr expr).getLabelNameNode() + } + } } diff --git a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll index 2422c6152034..d545c589185f 100644 --- a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll @@ -25,7 +25,11 @@ private module Ast implements AstSig { class AstNode = U::AstNode; - private predicate skipControlFlow(AstNode e) { e instanceof Modifier or e instanceof Identifier } + private predicate skipControlFlow(AstNode e) { + e instanceof Modifier + or + e instanceof Identifier and not e instanceof IdentifierExpr + } AstNode getChild(AstNode n, int index) { result.getParent() = n and diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index 62a82e63967f..6fe8ace83fcf 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -387,16 +387,7 @@ module Public { * } * ``` */ -class PotentialLocalNameAccess extends Identifier { - PotentialLocalNameAccess() { - not this = any(MemberAccessExpr e).getMemberNameNode() and - not this = any(Argument a).getNameNode() and - not this = any(Parameter p).getExternalNameNode() and - not this = any(LabeledStmt stmt).getLabelNameNode() and - not this = any(BreakExpr expr).getLabelNameNode() and - not this = any(ContinueExpr expr).getLabelNameNode() - } - +class PotentialLocalNameAccess extends IdentifierExpr { LocalName getLocalName() { result = this.(LocalNameBindingOutput::LocalAccess).getLocal() } string getName() { result = this.getValue() } From 2c2490a7ae5a17bc1e1fe6eaa38430ca40c1c51f Mon Sep 17 00:00:00 2001 From: Henry Mercer Date: Thu, 10 Sep 2026 13:33:29 +0100 Subject: [PATCH 0820/2098] Swift: Adopt the smaller macOS host libraries Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- swift/third_party/load.bzl | 1 - swift/third_party/resources/resource-dir-macos.zip | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/swift/third_party/load.bzl b/swift/third_party/load.bzl index 2e116056e7a2..676c5f0ce847 100644 --- a/swift/third_party/load.bzl +++ b/swift/third_party/load.bzl @@ -6,7 +6,6 @@ load("//misc/bazel:lfs.bzl", "lfs_archive", "lfs_files") _override = { # these are used to test new artifacts. Must be empty before merging to main - "resource-dir-macOS-swift-6.3.3-RELEASE-237.zip": "0589f8b61a87447d03b4b81b915f6b341ff8bcb123effda586cba46cc9487bd6", } _staging_url = "https://github.com/dsp-testing/codeql-swift-artifacts/releases/download/staging-{}/{}" diff --git a/swift/third_party/resources/resource-dir-macos.zip b/swift/third_party/resources/resource-dir-macos.zip index 2a606b4771fe..cc53d2e44a66 100644 --- a/swift/third_party/resources/resource-dir-macos.zip +++ b/swift/third_party/resources/resource-dir-macos.zip @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:da5cbdd44ee4728606f2dc0dd0718e3c7c8748ae1ec8d6261365282d54ba8db9 -size 548170081 +oid sha256:0589f8b61a87447d03b4b81b915f6b341ff8bcb123effda586cba46cc9487bd6 +size 433044499 From 612e515f48a23cf23569505fef8da98ff0ba3c2a Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Wed, 9 Sep 2026 10:46:17 +0200 Subject: [PATCH 0821/2098] C#: Add some tests for cs/linq/missed-all. --- .../MissedAllOpportunity.cs | 39 +++++++++++++++++++ .../MissedAllOpportunity.expected | 1 + .../MissedAllOpportunity.qlref | 2 + .../Linq/MissedAllOpportunity/options | 2 + 4 files changed, 44 insertions(+) create mode 100644 csharp/ql/test/query-tests/Linq/MissedAllOpportunity/MissedAllOpportunity.cs create mode 100644 csharp/ql/test/query-tests/Linq/MissedAllOpportunity/MissedAllOpportunity.expected create mode 100644 csharp/ql/test/query-tests/Linq/MissedAllOpportunity/MissedAllOpportunity.qlref create mode 100644 csharp/ql/test/query-tests/Linq/MissedAllOpportunity/options diff --git a/csharp/ql/test/query-tests/Linq/MissedAllOpportunity/MissedAllOpportunity.cs b/csharp/ql/test/query-tests/Linq/MissedAllOpportunity/MissedAllOpportunity.cs new file mode 100644 index 000000000000..e92ad7e91212 --- /dev/null +++ b/csharp/ql/test/query-tests/Linq/MissedAllOpportunity/MissedAllOpportunity.cs @@ -0,0 +1,39 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +class MissedAllOpportunity +{ + public void M1(List lst) + { + // BAD: Can be replaced with lst.All(e => e % 2 == 0) + var allEven = true; + foreach (int i in lst) + { + if (i % 2 != 0) + { + allEven = false; + break; + } + } // $ Alert + } + + public void M2(NonEnumerableClass nec) + { + // GOOD: Linq can't be used here. + var allEven = true; + foreach (int i in nec) + { + if (i % 2 != 0) + { + allEven = false; + break; + } + } + } + + public class NonEnumerableClass + { + public IEnumerator GetEnumerator() => throw null; + } +} diff --git a/csharp/ql/test/query-tests/Linq/MissedAllOpportunity/MissedAllOpportunity.expected b/csharp/ql/test/query-tests/Linq/MissedAllOpportunity/MissedAllOpportunity.expected new file mode 100644 index 000000000000..b4300f8caf07 --- /dev/null +++ b/csharp/ql/test/query-tests/Linq/MissedAllOpportunity/MissedAllOpportunity.expected @@ -0,0 +1 @@ +| MissedAllOpportunity.cs:11:9:18:9 | foreach (... ... in ...) ... | This foreach loop looks as if it might be testing whether every sequence element satisfies a predicate - consider using '.All(...)'. | diff --git a/csharp/ql/test/query-tests/Linq/MissedAllOpportunity/MissedAllOpportunity.qlref b/csharp/ql/test/query-tests/Linq/MissedAllOpportunity/MissedAllOpportunity.qlref new file mode 100644 index 000000000000..689d5fbb60a4 --- /dev/null +++ b/csharp/ql/test/query-tests/Linq/MissedAllOpportunity/MissedAllOpportunity.qlref @@ -0,0 +1,2 @@ +query: Linq/MissedAllOpportunity.ql +postprocess: utils/test/InlineExpectationsTestQuery.ql diff --git a/csharp/ql/test/query-tests/Linq/MissedAllOpportunity/options b/csharp/ql/test/query-tests/Linq/MissedAllOpportunity/options new file mode 100644 index 000000000000..75c39b4541ba --- /dev/null +++ b/csharp/ql/test/query-tests/Linq/MissedAllOpportunity/options @@ -0,0 +1,2 @@ +semmle-extractor-options: /nostdlib /noconfig +semmle-extractor-options: --load-sources-from-project:${testdir}/../../../resources/stubs/_frameworks/Microsoft.NETCore.App/Microsoft.NETCore.App.csproj From 1440cfc7e4f362e3760009ba205418ddbe6eea79 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Wed, 26 Aug 2026 15:37:43 +0200 Subject: [PATCH 0822/2098] C#: Add global ASP.NET Core - enable validation for all action methods. --- .../MissingAntiForgeryTokenValidation.cs | 39 +++++++++++++++++++ ...MissingAntiForgeryTokenValidation.expected | 1 + .../MissingAntiForgeryTokenValidation.qlref | 1 + .../CWE-352/global-aspnetcore/options | 2 + 4 files changed, 43 insertions(+) create mode 100644 csharp/ql/test/query-tests/Security Features/CWE-352/global-aspnetcore/MissingAntiForgeryTokenValidation.cs create mode 100644 csharp/ql/test/query-tests/Security Features/CWE-352/global-aspnetcore/MissingAntiForgeryTokenValidation.expected create mode 100644 csharp/ql/test/query-tests/Security Features/CWE-352/global-aspnetcore/MissingAntiForgeryTokenValidation.qlref create mode 100644 csharp/ql/test/query-tests/Security Features/CWE-352/global-aspnetcore/options diff --git a/csharp/ql/test/query-tests/Security Features/CWE-352/global-aspnetcore/MissingAntiForgeryTokenValidation.cs b/csharp/ql/test/query-tests/Security Features/CWE-352/global-aspnetcore/MissingAntiForgeryTokenValidation.cs new file mode 100644 index 000000000000..438ad03f3200 --- /dev/null +++ b/csharp/ql/test/query-tests/Security Features/CWE-352/global-aspnetcore/MissingAntiForgeryTokenValidation.cs @@ -0,0 +1,39 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.ViewFeatures; +using Microsoft.AspNetCore.Routing; +using Microsoft.Extensions.DependencyInjection; + +public class HomeController : Controller +{ + // GOOD: This is validated by the global filter. + [HttpPost] + public ActionResult Login() + { + return View(); + } + + // GOOD: Antiforgery token is validated explicitly. + [HttpPost] + [ValidateAntiForgeryToken] + public ActionResult UpdateDetails() + { + return View(); + } +} + +public class Program +{ + public static void Main(string[] args) + { + var builder = WebApplication.CreateBuilder(args); + + // Register MVC controllers and Razor views. + // The global filter automatically validates antiforgery tokens + // for unsafe HTTP methods such as POST, PUT, PATCH, and DELETE. + builder.Services.AddControllersWithViews(options => + { + options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute()); + }); + } +} diff --git a/csharp/ql/test/query-tests/Security Features/CWE-352/global-aspnetcore/MissingAntiForgeryTokenValidation.expected b/csharp/ql/test/query-tests/Security Features/CWE-352/global-aspnetcore/MissingAntiForgeryTokenValidation.expected new file mode 100644 index 000000000000..459ba06f47d0 --- /dev/null +++ b/csharp/ql/test/query-tests/Security Features/CWE-352/global-aspnetcore/MissingAntiForgeryTokenValidation.expected @@ -0,0 +1 @@ +| MissingAntiForgeryTokenValidation.cs:11:25:11:29 | Login | Method 'Login' handles a POST request without performing CSRF token validation. | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-352/global-aspnetcore/MissingAntiForgeryTokenValidation.qlref b/csharp/ql/test/query-tests/Security Features/CWE-352/global-aspnetcore/MissingAntiForgeryTokenValidation.qlref new file mode 100644 index 000000000000..5e1ab2426c65 --- /dev/null +++ b/csharp/ql/test/query-tests/Security Features/CWE-352/global-aspnetcore/MissingAntiForgeryTokenValidation.qlref @@ -0,0 +1 @@ +query: Security Features/CWE-352/MissingAntiForgeryTokenValidation.ql diff --git a/csharp/ql/test/query-tests/Security Features/CWE-352/global-aspnetcore/options b/csharp/ql/test/query-tests/Security Features/CWE-352/global-aspnetcore/options new file mode 100644 index 000000000000..698ad488b6d4 --- /dev/null +++ b/csharp/ql/test/query-tests/Security Features/CWE-352/global-aspnetcore/options @@ -0,0 +1,2 @@ +semmle-extractor-options: /nostdlib /noconfig +semmle-extractor-options: --load-sources-from-project:${testdir}/../../../../resources/stubs/_frameworks/Microsoft.AspNetCore.App/Microsoft.AspNetCore.App.csproj From 998d471c5c39f344bb0b0c97a3cd5ce39ca7d5a7 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Wed, 26 Aug 2026 15:40:23 +0200 Subject: [PATCH 0823/2098] C#: Detect possible global auto validate configuration to remove FPs. --- .../frameworks/microsoft/AspNetCore.qll | 28 +++++++++++++++---- .../MissingAntiForgeryTokenValidation.ql | 14 ++++++++-- 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll index abdd81646828..c71e30d6a1b9 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll @@ -144,6 +144,15 @@ class ValidateAntiForgeryAttribute extends Attribute { } } +/** + * The `Microsoft.AspNetCore.Mvc.AutoValidateAntiforgeryTokenAttribute` class. + */ +class AutoValidateAntiforgeryTokenAttribute extends Class { + AutoValidateAntiforgeryTokenAttribute() { + this.hasFullyQualifiedName("Microsoft.AspNetCore.Mvc", "AutoValidateAntiforgeryTokenAttribute") + } +} + /** * A class that has a name like `[Auto...]Validate[...]Anti[Ff]orgery[...Token]` and implements `IFilterMetadata` interface * This class can be added to a collection of global `MvcOptions.Filters` collection. @@ -230,11 +239,20 @@ private Assembly getAnAssemblyFor(Type type) { result = getACompilationFor(type).getOutputAssembly() } -private predicate isMicrosoftAspNetCoreMvcRegistration(MethodCall call) { - call.getTarget() - .hasFullyQualifiedName("Microsoft.Extensions.DependencyInjection", - ["MvcServiceCollectionExtensions", "MvcCoreServiceCollectionExtensions"], - ["AddControllers", "AddControllersWithViews", "AddMvc", "AddMvcCore"]) +/** + * A method that is a registration of an ASP.NET Core MVC service, i.e. `AddControllers`, `AddControllersWithViews`, `AddMvc`, or `AddMvcCore`. + */ +class MicrosoftAspNetCoreMvcRegistration extends Method { + MicrosoftAspNetCoreMvcRegistration() { + this.hasFullyQualifiedName("Microsoft.Extensions.DependencyInjection", + ["MvcServiceCollectionExtensions", "MvcCoreServiceCollectionExtensions"], + ["AddControllers", "AddControllersWithViews", "AddMvc", "AddMvcCore"]) + } +} + +/** Holds if the method call is a registration of an ASP.NET Core MVC service. */ +predicate isMicrosoftAspNetCoreMvcRegistration(MethodCall call) { + call.getTarget() instanceof MicrosoftAspNetCoreMvcRegistration } private predicate isMicrosoftAspNetCoreMvcApplication(Compilation compilation) { diff --git a/csharp/ql/src/Security Features/CWE-352/MissingAntiForgeryTokenValidation.ql b/csharp/ql/src/Security Features/CWE-352/MissingAntiForgeryTokenValidation.ql index 77a3f2b59450..677bba60015c 100644 --- a/csharp/ql/src/Security Features/CWE-352/MissingAntiForgeryTokenValidation.ql +++ b/csharp/ql/src/Security Features/CWE-352/MissingAntiForgeryTokenValidation.ql @@ -36,8 +36,6 @@ private Method getAStartedMethod() { /** * Holds if the project has a global anti forgery filter. - * - * No AspNetCore case here as the corresponding class doesn't seem to exist. */ predicate hasGlobalAntiForgeryFilter() { // A global filter added @@ -49,6 +47,18 @@ predicate hasGlobalAntiForgeryFilter() { // The filter is added by the Application_Start() method getAStartedMethod() = addGlobalFilter.getEnclosingCallable() ) + or + exists(MethodCall addGlobalFilter, MethodCall registrationCall | + addGlobalFilter.getTarget() = + any(AspNetCore::MicrosoftAspNetCoreMvcFilterCollection collection).getAddMethod() and + // The filter is the `AutoValidateAntiforgeryTokenAttribute` filter. + addGlobalFilter.getArgument(0).getType() instanceof + AspNetCore::AutoValidateAntiforgeryTokenAttribute and + // The filter is added in an ASP.NET Core registration call, which is provided as a lambda argument + // to the Mvc registration method. + registrationCall.getTarget() instanceof AspNetCore::MicrosoftAspNetCoreMvcRegistration and + registrationCall.getAnArgument() = addGlobalFilter.getEnclosingCallable() + ) } private class RequireAntiforgeryTokenAttribute extends Attribute { From 1949c45bb0b4b9cce3316e191b9a6aea465a1a2a Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Wed, 26 Aug 2026 16:00:20 +0200 Subject: [PATCH 0824/2098] C#: Update test expected output. --- .../global-aspnetcore/MissingAntiForgeryTokenValidation.expected | 1 - 1 file changed, 1 deletion(-) diff --git a/csharp/ql/test/query-tests/Security Features/CWE-352/global-aspnetcore/MissingAntiForgeryTokenValidation.expected b/csharp/ql/test/query-tests/Security Features/CWE-352/global-aspnetcore/MissingAntiForgeryTokenValidation.expected index 459ba06f47d0..e69de29bb2d1 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-352/global-aspnetcore/MissingAntiForgeryTokenValidation.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-352/global-aspnetcore/MissingAntiForgeryTokenValidation.expected @@ -1 +0,0 @@ -| MissingAntiForgeryTokenValidation.cs:11:25:11:29 | Login | Method 'Login' handles a POST request without performing CSRF token validation. | From b104638c8dec4fa69d51c63f779d55be7da38c1a Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Fri, 28 Aug 2026 09:21:43 +0200 Subject: [PATCH 0825/2098] C#: Add change-note. --- csharp/ql/src/change-notes/2026-08-27-csrf-autovalidate.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 csharp/ql/src/change-notes/2026-08-27-csrf-autovalidate.md diff --git a/csharp/ql/src/change-notes/2026-08-27-csrf-autovalidate.md b/csharp/ql/src/change-notes/2026-08-27-csrf-autovalidate.md new file mode 100644 index 000000000000..7ba5dbe4467c --- /dev/null +++ b/csharp/ql/src/change-notes/2026-08-27-csrf-autovalidate.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `cs/web/missing-token-validation` query now recognizes an ASP.NET Core `AutoValidateAntiforgeryTokenAttribute` registered as a global MVC filter through `AddControllersWithViews` (and friends), avoiding false-positive results for covered actions. From 9e33e07ff8d9f06d59d963353311c7e6aa6de802 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Fri, 28 Aug 2026 10:43:51 +0200 Subject: [PATCH 0826/2098] C#: Make the global validation filter compilation aware. --- .../MissingAntiForgeryTokenValidation.ql | 42 +++++++++++-------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/csharp/ql/src/Security Features/CWE-352/MissingAntiForgeryTokenValidation.ql b/csharp/ql/src/Security Features/CWE-352/MissingAntiForgeryTokenValidation.ql index 677bba60015c..075be812ef5b 100644 --- a/csharp/ql/src/Security Features/CWE-352/MissingAntiForgeryTokenValidation.ql +++ b/csharp/ql/src/Security Features/CWE-352/MissingAntiForgeryTokenValidation.ql @@ -12,6 +12,7 @@ */ import csharp +import semmle.code.csharp.commons.Compilation import semmle.code.csharp.frameworks.system.Web import semmle.code.csharp.frameworks.system.web.Helpers import semmle.code.csharp.frameworks.system.web.Mvc @@ -34,20 +35,19 @@ private Method getAStartedMethod() { getAStartedMethod().calls(result) } -/** - * Holds if the project has a global anti forgery filter. - */ -predicate hasGlobalAntiForgeryFilter() { - // A global filter added +private predicate hasGlobalWebMvcAntiforgeryFilter(Compilation compilation) { exists(MethodCall addGlobalFilter | // addGlobalFilter adds a filter to the global filter collection addGlobalFilter.getTarget() = any(GlobalFilterCollection gfc).getAddMethod() and // The filter is an antiforgery filter addGlobalFilter.getArgumentForName("filter").getType() instanceof AntiForgeryAuthorizationFilter and // The filter is added by the Application_Start() method - getAStartedMethod() = addGlobalFilter.getEnclosingCallable() + getAStartedMethod() = addGlobalFilter.getEnclosingCallable() and + addGlobalFilter.getFile() = compilation.getAFileCompiled() ) - or +} + +predicate hasGlobalAspNetMvcAntiForgeryFilter(Compilation compilation) { exists(MethodCall addGlobalFilter, MethodCall registrationCall | addGlobalFilter.getTarget() = any(AspNetCore::MicrosoftAspNetCoreMvcFilterCollection collection).getAddMethod() and @@ -57,7 +57,8 @@ predicate hasGlobalAntiForgeryFilter() { // The filter is added in an ASP.NET Core registration call, which is provided as a lambda argument // to the Mvc registration method. registrationCall.getTarget() instanceof AspNetCore::MicrosoftAspNetCoreMvcRegistration and - registrationCall.getAnArgument() = addGlobalFilter.getEnclosingCallable() + registrationCall.getAnArgument() = addGlobalFilter.getEnclosingCallable() and + addGlobalFilter.getFile() = compilation.getAFileCompiled() ) } @@ -77,11 +78,12 @@ private class RequireAntiforgeryTokenAttribute extends Attribute { } } -private predicate hasAspNetCoreAntiForgeryMiddleware() { +private predicate hasAspNetCoreAntiForgeryMiddleware(Compilation compilation) { exists(MethodCall call | call.getTarget() .hasFullyQualifiedName("Microsoft.AspNetCore.Builder", - "AntiforgeryApplicationBuilderExtensions", "UseAntiforgery") + "AntiforgeryApplicationBuilderExtensions", "UseAntiforgery") and + call.getFile() = compilation.getAFileCompiled() ) } @@ -116,7 +118,12 @@ private RequireAntiforgeryTokenAttribute getEffectiveRequireAntiforgeryTokenAttr class MvcControllerPostMethod extends Method { private Controller controller; - MvcControllerPostMethod() { controller.getAPostActionMethod() = this } + MvcControllerPostMethod() { + controller.getAPostActionMethod() = this and + exists(Compilation compilation | compilation.getAFileCompiled() = this.getFile() | + not hasGlobalWebMvcAntiforgeryFilter(compilation) + ) + } predicate hasValidateAntiForgeryAttribute() { this.getAnAttribute() instanceof ValidateAntiForgeryTokenAttribute or @@ -126,10 +133,13 @@ class MvcControllerPostMethod extends Method { class AspNetCoreControllerPostMethod extends Method { private AspNetCore::MicrosoftAspNetCoreMvcController controller; + private Compilation compilation; AspNetCoreControllerPostMethod() { controller.getAnActionMethod() = this and - this.getAnAttribute() instanceof AspNetCore::MicrosoftAspNetCoreMvcHttpPostAttribute + this.getAnAttribute() instanceof AspNetCore::MicrosoftAspNetCoreMvcHttpPostAttribute and + compilation.getAFileCompiled() = this.getFile() and + not hasGlobalAspNetMvcAntiForgeryFilter(compilation) } predicate hasValidateAntiForgeryAttribute() { @@ -138,7 +148,7 @@ class AspNetCoreControllerPostMethod extends Method { } predicate hasRequireAntiForgeryAttribute() { - hasAspNetCoreAntiForgeryMiddleware() and + hasAspNetCoreAntiForgeryMiddleware(compilation) and ( getEffectiveRequireAntiforgeryTokenAttributeOnMethod(this).requiresValidation() or @@ -167,7 +177,7 @@ Element getAValidatedElement() { or any(AspNetCore::ValidateAntiForgeryAttribute a).getTarget() = result or - hasAspNetCoreAntiForgeryMiddleware() and + hasAspNetCoreAntiForgeryMiddleware(_) and any(RequireAntiforgeryTokenAttribute a | a.requiresValidation()).getTarget() = result } @@ -177,9 +187,7 @@ where // Verify that validate anti forgery token attributes are used somewhere within this project, to // avoid reporting false positives on projects that use an alternative approach to mitigate CSRF // issues. - exists(getAValidatedElement()) and - // Also ignore cases where a global anti forgery filter is in use. - not hasGlobalAntiForgeryFilter() + exists(getAValidatedElement()) select postMethod, "Method '" + postMethod.getName() + "' handles a POST request without performing CSRF token validation." From 0cdad21b21ec98b56bb6c3c631aaef1be1eabb2d Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Fri, 28 Aug 2026 13:26:33 +0200 Subject: [PATCH 0827/2098] C#: Add support the generic version of specifying auto validate. --- .../frameworks/microsoft/AspNetCore.qll | 4 ++-- .../MissingAntiForgeryTokenValidation.ql | 21 ++++++++++++++----- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll index c71e30d6a1b9..37b0ff2884f9 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll @@ -173,8 +173,8 @@ class MicrosoftAspNetCoreMvcFilterCollection extends Class { /** Gets an `Add` method. */ Method getAddMethod() { - result = this.getAMethod("Add") or - result = this.getABaseType().getAMethod("Add") + result = this.getAMethod(["Add", "Add`1"]) or + result = this.getABaseType().getAMethod(["Add", "Add`1"]) } } diff --git a/csharp/ql/src/Security Features/CWE-352/MissingAntiForgeryTokenValidation.ql b/csharp/ql/src/Security Features/CWE-352/MissingAntiForgeryTokenValidation.ql index 075be812ef5b..8a568c6eca57 100644 --- a/csharp/ql/src/Security Features/CWE-352/MissingAntiForgeryTokenValidation.ql +++ b/csharp/ql/src/Security Features/CWE-352/MissingAntiForgeryTokenValidation.ql @@ -49,11 +49,22 @@ private predicate hasGlobalWebMvcAntiforgeryFilter(Compilation compilation) { predicate hasGlobalAspNetMvcAntiForgeryFilter(Compilation compilation) { exists(MethodCall addGlobalFilter, MethodCall registrationCall | - addGlobalFilter.getTarget() = - any(AspNetCore::MicrosoftAspNetCoreMvcFilterCollection collection).getAddMethod() and - // The filter is the `AutoValidateAntiforgeryTokenAttribute` filter. - addGlobalFilter.getArgument(0).getType() instanceof - AspNetCore::AutoValidateAntiforgeryTokenAttribute and + ( + // The filter is the `AutoValidateAntiforgeryTokenAttribute` filter. + addGlobalFilter.getTarget() = + any(AspNetCore::MicrosoftAspNetCoreMvcFilterCollection collection).getAddMethod() and + ( + addGlobalFilter.getArgument(0).getType() instanceof + AspNetCore::AutoValidateAntiforgeryTokenAttribute or + addGlobalFilter.getArgument(0).(TypeofExpr).getTypeAccess().getTarget() instanceof + AspNetCore::AutoValidateAntiforgeryTokenAttribute + ) + or + addGlobalFilter.getTarget().getUnboundDeclaration() = + any(AspNetCore::MicrosoftAspNetCoreMvcFilterCollection collection).getAddMethod() and + addGlobalFilter.getTarget().(ConstructedGeneric).getTypeArgument(0) instanceof + AspNetCore::AutoValidateAntiforgeryTokenAttribute + ) and // The filter is added in an ASP.NET Core registration call, which is provided as a lambda argument // to the Mvc registration method. registrationCall.getTarget() instanceof AspNetCore::MicrosoftAspNetCoreMvcRegistration and From e2ebb0d5dfa3c776decd7470bafddfc342f77983 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Wed, 9 Sep 2026 11:38:24 +0200 Subject: [PATCH 0828/2098] C#: Add test cases that uses in/out or ref parameters. --- .../MissedAllOpportunity/MissedAllOpportunity.cs | 14 ++++++++++++++ .../MissedAllOpportunity.expected | 4 ++++ .../MissedFirstOrDefaultOpportunity.cs | 14 ++++++++++++++ .../MissedFirstOrDefaultOpportunity.expected | 4 ++++ .../MissedSelectOpportunity.cs | 11 +++++++++++ .../MissedSelectOpportunity.expected | 4 ++++ .../MissedWhereOpportunity.cs | 12 ++++++++++++ .../MissedWhereOpportunity.expected | 4 ++++ 8 files changed, 67 insertions(+) diff --git a/csharp/ql/test/query-tests/Linq/MissedAllOpportunity/MissedAllOpportunity.cs b/csharp/ql/test/query-tests/Linq/MissedAllOpportunity/MissedAllOpportunity.cs index e92ad7e91212..4b09d8bd6409 100644 --- a/csharp/ql/test/query-tests/Linq/MissedAllOpportunity/MissedAllOpportunity.cs +++ b/csharp/ql/test/query-tests/Linq/MissedAllOpportunity/MissedAllOpportunity.cs @@ -32,6 +32,20 @@ public void M2(NonEnumerableClass nec) } } + public void M3(List lst, ref int x) + { + // GOOD: Linq can't be used here because the condition uses a ref parameter. + var allEven = true; + foreach (int i in lst) + { + if (i % 2 != x) + { + allEven = false; + break; + } + } + } + public class NonEnumerableClass { public IEnumerator GetEnumerator() => throw null; diff --git a/csharp/ql/test/query-tests/Linq/MissedAllOpportunity/MissedAllOpportunity.expected b/csharp/ql/test/query-tests/Linq/MissedAllOpportunity/MissedAllOpportunity.expected index b4300f8caf07..67203c735f1e 100644 --- a/csharp/ql/test/query-tests/Linq/MissedAllOpportunity/MissedAllOpportunity.expected +++ b/csharp/ql/test/query-tests/Linq/MissedAllOpportunity/MissedAllOpportunity.expected @@ -1 +1,5 @@ +#select | MissedAllOpportunity.cs:11:9:18:9 | foreach (... ... in ...) ... | This foreach loop looks as if it might be testing whether every sequence element satisfies a predicate - consider using '.All(...)'. | +| MissedAllOpportunity.cs:39:9:46:9 | foreach (... ... in ...) ... | This foreach loop looks as if it might be testing whether every sequence element satisfies a predicate - consider using '.All(...)'. | +testFailures +| MissedAllOpportunity.cs:39:9:46:9 | This foreach loop looks as if it might be testing whether every sequence element satisfies a predicate - consider using '.All(...)'. | Unexpected result: Alert | diff --git a/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.cs b/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.cs index 8120a70414e5..84824efee4bc 100644 --- a/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.cs +++ b/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.cs @@ -179,6 +179,20 @@ public Operation M14(IEnumerable operations, Func[] pre return null; } + public int M15(IEnumerable values, ref readonly int x) + { + // GOOD: FirstOrDefault does not support a predicate that captures a ref parameter. + foreach (var value in values) + { + if (value > x) + { + return value; + } + } + + return default; + } + private static Task IsMatch(Operation operation, string operationId) => Task.FromResult(string.Equals(operation.OperationId, operationId, StringComparison.Ordinal)); } diff --git a/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.expected b/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.expected index b4cfdff5fdd9..aba54e7933cb 100644 --- a/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.expected +++ b/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.expected @@ -1,5 +1,9 @@ +#select | MissedFirstOrDefaultOpportunity.cs:10:9:14:9 | foreach (... ... in ...) ... | This foreach loop returns the first sequence element satisfying a $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | MissedFirstOrDefaultOpportunity.cs:12:17:12:91 | call to method Equals | predicate | | MissedFirstOrDefaultOpportunity.cs:22:9:28:9 | foreach (... ... in ...) ... | This foreach loop returns the first sequence element satisfying a $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | MissedFirstOrDefaultOpportunity.cs:24:17:24:25 | ... > ... | predicate | | MissedFirstOrDefaultOpportunity.cs:36:9:40:9 | foreach (... ... in ...) ... | This foreach loop returns the first sequence element satisfying a $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | MissedFirstOrDefaultOpportunity.cs:38:17:38:25 | ... > ... | predicate | | MissedFirstOrDefaultOpportunity.cs:149:9:153:9 | foreach (... ... in ...) ... | This foreach loop returns the first sequence element satisfying a $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | MissedFirstOrDefaultOpportunity.cs:151:17:151:32 | ... > ... | predicate | | MissedFirstOrDefaultOpportunity.cs:161:9:165:9 | foreach (... ... in ...) ... | This foreach loop returns the first sequence element satisfying a $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | MissedFirstOrDefaultOpportunity.cs:163:17:163:25 | ... > ... | predicate | +| MissedFirstOrDefaultOpportunity.cs:185:9:191:9 | foreach (... ... in ...) ... | This foreach loop returns the first sequence element satisfying a $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | MissedFirstOrDefaultOpportunity.cs:187:17:187:25 | ... > ... | predicate | +testFailures +| MissedFirstOrDefaultOpportunity.cs:185:9:191:9 | This foreach loop returns the first sequence element satisfying a $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | Unexpected result: Alert | diff --git a/csharp/ql/test/query-tests/Linq/MissedSelectOpportunity/MissedSelectOpportunity.cs b/csharp/ql/test/query-tests/Linq/MissedSelectOpportunity/MissedSelectOpportunity.cs index 9655a5a0fa9c..0a958d3e50d8 100644 --- a/csharp/ql/test/query-tests/Linq/MissedSelectOpportunity/MissedSelectOpportunity.cs +++ b/csharp/ql/test/query-tests/Linq/MissedSelectOpportunity/MissedSelectOpportunity.cs @@ -25,6 +25,17 @@ public async Task M2(IEnumerable counters) } } + public void M3(List lst, out int x) + { + // GOOD: Linq can't be used here as the Select would capture an out parameter. + x = 2; + foreach (int i in lst) + { + int j = i * x; + Console.WriteLine(j); + } + } + public interface ICounter { Task CountAsync(); diff --git a/csharp/ql/test/query-tests/Linq/MissedSelectOpportunity/MissedSelectOpportunity.expected b/csharp/ql/test/query-tests/Linq/MissedSelectOpportunity/MissedSelectOpportunity.expected index bc6d464fa3b9..b84ec32441f4 100644 --- a/csharp/ql/test/query-tests/Linq/MissedSelectOpportunity/MissedSelectOpportunity.expected +++ b/csharp/ql/test/query-tests/Linq/MissedSelectOpportunity/MissedSelectOpportunity.expected @@ -1 +1,5 @@ +#select | MissedSelectOpportunity.cs:11:9:15:9 | foreach (... ... in ...) ... | This foreach loop immediately $@ - consider mapping the sequence explicitly using '.Select(...)'. | MissedSelectOpportunity.cs:13:13:13:26 | ... ...; | maps its iteration variable to another variable | +| MissedSelectOpportunity.cs:32:9:36:9 | foreach (... ... in ...) ... | This foreach loop immediately $@ - consider mapping the sequence explicitly using '.Select(...)'. | MissedSelectOpportunity.cs:34:13:34:26 | ... ...; | maps its iteration variable to another variable | +testFailures +| MissedSelectOpportunity.cs:32:9:36:9 | This foreach loop immediately $@ - consider mapping the sequence explicitly using '.Select(...)'. | Unexpected result: Alert | diff --git a/csharp/ql/test/query-tests/Linq/MissedWhereOpportunity/MissedWhereOpportunity.cs b/csharp/ql/test/query-tests/Linq/MissedWhereOpportunity/MissedWhereOpportunity.cs index 7b9d35821299..b3575473eab9 100644 --- a/csharp/ql/test/query-tests/Linq/MissedWhereOpportunity/MissedWhereOpportunity.cs +++ b/csharp/ql/test/query-tests/Linq/MissedWhereOpportunity/MissedWhereOpportunity.cs @@ -174,6 +174,18 @@ public void M12(IEnumerable elements) } } + public void M13(List lst, in int x) + { + // GOOD: Linq can't be used here because the condition uses an in parameter. + foreach (int i in lst) + { + if (i % 2 != x) + continue; + Console.WriteLine(i); + Console.WriteLine((i / 2)); + } + } + public class NonEnumerableClass { public IEnumerator GetEnumerator() => throw null; diff --git a/csharp/ql/test/query-tests/Linq/MissedWhereOpportunity/MissedWhereOpportunity.expected b/csharp/ql/test/query-tests/Linq/MissedWhereOpportunity/MissedWhereOpportunity.expected index 8b9398292ef2..20c2cece7605 100644 --- a/csharp/ql/test/query-tests/Linq/MissedWhereOpportunity/MissedWhereOpportunity.expected +++ b/csharp/ql/test/query-tests/Linq/MissedWhereOpportunity/MissedWhereOpportunity.expected @@ -1,5 +1,9 @@ +#select | MissedWhereOpportunity.cs:10:9:16:9 | foreach (... ... in ...) ... | This foreach loop $@ - consider filtering the sequence explicitly using '.Where(...)'. | MissedWhereOpportunity.cs:12:17:12:26 | ... != ... | implicitly filters its target sequence | | MissedWhereOpportunity.cs:19:9:26:9 | foreach (... ... in ...) ... | This foreach loop $@ - consider filtering the sequence explicitly using '.Where(...)'. | MissedWhereOpportunity.cs:21:17:21:26 | ... == ... | implicitly filters its target sequence | | MissedWhereOpportunity.cs:45:9:52:9 | foreach (... ... in ...) ... | This foreach loop $@ - consider filtering the sequence explicitly using '.Where(...)'. | MissedWhereOpportunity.cs:47:17:47:26 | ... == ... | implicitly filters its target sequence | | MissedWhereOpportunity.cs:70:9:76:9 | foreach (... ... in ...) ... | This foreach loop $@ - consider filtering the sequence explicitly using '.Where(...)'. | MissedWhereOpportunity.cs:72:17:72:46 | ... == ... | implicitly filters its target sequence | | MissedWhereOpportunity.cs:120:9:126:9 | foreach (... ... in ...) ... | This foreach loop $@ - consider filtering the sequence explicitly using '.Where(...)'. | MissedWhereOpportunity.cs:122:17:122:46 | ... == ... | implicitly filters its target sequence | +| MissedWhereOpportunity.cs:180:9:186:9 | foreach (... ... in ...) ... | This foreach loop $@ - consider filtering the sequence explicitly using '.Where(...)'. | MissedWhereOpportunity.cs:182:17:182:26 | ... != ... | implicitly filters its target sequence | +testFailures +| MissedWhereOpportunity.cs:180:9:186:9 | This foreach loop $@ - consider filtering the sequence explicitly using '.Where(...)'. | Unexpected result: Alert | From c145fc5df2de4eb26e4b36d56ee931bcdc081d3c Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 10 Sep 2026 16:52:43 +0200 Subject: [PATCH 0829/2098] unified: Remove unit test for location regression This unit test checked the locations generated for a certain node in the AST. QLTests are much better suited for detecting this, and in fact this was how the problem was detected in the first place, and the test is still in place. The unit test started failing because NameExpr has been replaced by Identifier. Copilot can repair the test, but I'm deliberately removing it because this is the wrong place to test for this type of regression. --- .../extractor/tests/swift_syntax_pipeline.rs | 67 ------------------- 1 file changed, 67 deletions(-) diff --git a/unified/extractor/tests/swift_syntax_pipeline.rs b/unified/extractor/tests/swift_syntax_pipeline.rs index 3ae966d7bc38..fde060f98203 100644 --- a/unified/extractor/tests/swift_syntax_pipeline.rs +++ b/unified/extractor/tests/swift_syntax_pipeline.rs @@ -16,39 +16,6 @@ mod languages; /// A real `swift-syntax-rs` JSON dump of the Swift source `let x = 1`. const LET_X_JSON: &str = include_str!("fixtures/let_x.swiftsyntax.json"); -const IMPORT_FOUNDATION_JSON: &str = r#"{ - "kind": "sourceFile", - "range": {"start":{"offset":0,"line":1,"column":1},"end":{"offset":17,"line":1,"column":18}}, - "statements": [ - { - "kind": "codeBlockItem", - "range": {"start":{"offset":0,"line":1,"column":1},"end":{"offset":17,"line":1,"column":18}}, - "item": { - "kind": "importDecl", - "range": {"start":{"offset":0,"line":1,"column":1},"end":{"offset":17,"line":1,"column":18}}, - "importKeyword": { - "kind": "token", - "tokenKind": "keyword(SwiftSyntax.Keyword.import)", - "text": "import", - "range": {"start":{"offset":0,"line":1,"column":1},"end":{"offset":6,"line":1,"column":7}} - }, - "path": [ - { - "kind": "importPathComponent", - "range": {"start":{"offset":7,"line":1,"column":8},"end":{"offset":17,"line":1,"column":18}}, - "name": { - "kind": "token", - "tokenKind": "identifier(\"Foundation\")", - "text": "Foundation", - "range": {"start":{"offset":7,"line":1,"column":8},"end":{"offset":17,"line":1,"column":18}} - } - } - ] - } - } - ] -}"#; - #[test] fn swift_syntax_json_runs_through_the_desugarer() { let lang = languages::all_language_specs() @@ -80,37 +47,3 @@ fn swift_syntax_json_runs_through_the_desugarer() { assert!(dump.contains("top_level"), "unexpected dump: {dump}"); assert!(dump.contains("block"), "unexpected dump: {dump}"); } - -#[test] -fn import_name_expr_location_excludes_import_keyword() { - let lang = languages::all_language_specs() - .into_iter() - .find(|l| l.file_globs.iter().any(|g| g.contains("swift"))) - .expect("swift language spec"); - let desugarer = lang.desugarer.as_ref(); - let adapted = languages::swift_adapter::json_to_ast(IMPORT_FOUNDATION_JSON) - .expect("adapter should succeed"); - - let desugared = desugarer - .run_from_ast(adapted.ast) - .expect("desugaring an import should not error"); - - let name_expr_ids: Vec = desugared - .reachable_node_ids() - .into_iter() - .filter(|&id| { - desugared - .get_node(id) - .is_some_and(|node| node.kind_name() == "name_expr") - }) - .collect(); - assert_eq!( - name_expr_ids.len(), - 1, - "expected exactly one reachable name_expr" - ); - - let name_expr = desugared.get_node(name_expr_ids[0]).unwrap(); - assert_eq!(name_expr.start_byte(), 7); - assert_eq!(name_expr.end_byte(), 17); -} From 6add30546037b032d82b1d55cc1c2a95b342a9fb Mon Sep 17 00:00:00 2001 From: Taus Date: Wed, 9 Sep 2026 15:53:25 +0000 Subject: [PATCH 0830/2098] Unified: Use offsets for `swift-syntax` locations Gets rid of the `range` objects that were used previously. This results in a roughly 50% decrease in the size of the resulting JSON. The field names that store this new information ($pos, $end, $lineStarts) match the implementation used in the TypeScript extractor. --- .../extractor/src/languages/swift/adapter.rs | 183 +++++++++++++----- .../tests/fixtures/let_x.swiftsyntax.json | 178 +++-------------- .../extractor/tests/swift_syntax_pipeline.rs | 23 ++- unified/swift-syntax-rs/README.md | 56 ++++-- unified/swift-syntax-rs/src/lib.rs | 35 +++- .../SwiftSyntaxFFI/SwiftSyntaxFFI.swift | 83 ++++---- 6 files changed, 285 insertions(+), 273 deletions(-) diff --git a/unified/extractor/src/languages/swift/adapter.rs b/unified/extractor/src/languages/swift/adapter.rs index ae245eb21e80..f1ae56d6c4c2 100644 --- a/unified/extractor/src/languages/swift/adapter.rs +++ b/unified/extractor/src/languages/swift/adapter.rs @@ -61,10 +61,71 @@ const VARYING_TOKEN_KINDS: &[&str] = &[ fn is_metadata_key(key: &str) -> bool { matches!( key, - "kind" | "range" | "tokenKind" | "text" | "leadingTrivia" | "trailingTrivia" + "kind" + | "$pos" + | "$end" + | "$lineStarts" + | "tokenKind" + | "text" + | "leadingTrivia" + | "trailingTrivia" ) } +/// Converts compact UTF-8 byte offsets into tree-sitter-style points. +struct LocationTable { + line_starts: Vec, +} + +impl LocationTable { + fn from_root(root: &Value) -> Result { + let values = root + .get("$lineStarts") + .and_then(Value::as_array) + .ok_or("root node is missing an array `$lineStarts`")?; + let mut line_starts = Vec::with_capacity(values.len()); + for (index, value) in values.iter().enumerate() { + let offset = value + .as_u64() + .and_then(|offset| usize::try_from(offset).ok()) + .ok_or_else(|| format!("`$lineStarts[{index}]` is not a valid byte offset"))?; + line_starts.push(offset); + } + if line_starts.first() != Some(&0) { + return Err("`$lineStarts` must start with offset 0".to_string()); + } + if line_starts.windows(2).any(|pair| pair[0] >= pair[1]) { + return Err("`$lineStarts` offsets must be strictly increasing".to_string()); + } + Ok(Self { line_starts }) + } + + fn point(&self, offset: usize) -> Point { + let row = self + .line_starts + .partition_point(|line_start| *line_start <= offset) + - 1; + Point::new(row, offset - self.line_starts[row]) + } + + /// Parse a node's half-open UTF-8 byte range into a [`yeast::Range`]. + fn range(&self, node: &Value) -> Option { + let offset = |key: &str| { + node.get(key)? + .as_u64() + .and_then(|offset| usize::try_from(offset).ok()) + }; + let start_byte = offset("$pos")?; + let end_byte = offset("$end")?; + Some(Range { + start_byte, + end_byte, + start_point: self.point(start_byte), + end_point: self.point(end_byte), + }) + } +} + /// The classification of a JSON node into a yeast kind name and named-ness. struct KindInfo { /// The name under which the kind is registered in the schema. @@ -158,16 +219,21 @@ fn children_of(value: &Value) -> Vec<&Value> { /// comment/`unexpectedText` trivia carried by a token is harvested into /// `extras` (as [`ExtraToken`]s) during the same pass rather than embedded in /// the tree. -fn build(node: &Value, ast: &mut Ast, extras: &mut Vec) -> Result { +fn build( + node: &Value, + locations: &LocationTable, + ast: &mut Ast, + extras: &mut Vec, +) -> Result { let info = classify(node)?; - collect_extras(node, extras); + collect_extras(node, locations, extras); let mut fields: BTreeMap> = BTreeMap::new(); for (field, value) in field_entries(node) { let field_id = ast.register_field(field); let mut ids = Vec::new(); for child in children_of(value) { - ids.push(build(child, ast, extras)?); + ids.push(build(child, locations, ast, extras)?); } fields.insert(field_id, ids); } @@ -183,7 +249,7 @@ fn build(node: &Value, ast: &mut Ast, extras: &mut Vec) -> Result) -> Result) { +fn collect_extras(node: &Value, locations: &LocationTable, out: &mut Vec) { for key in ["leadingTrivia", "trailingTrivia"] { let Some(Value::Array(pieces)) = node.get(key) else { continue; @@ -199,7 +265,7 @@ fn collect_extras(node: &Value, out: &mut Vec) { for piece in pieces { let (Some(kind), Some(range)) = ( piece.get("kind").and_then(Value::as_str), - parse_range(piece), + locations.range(piece), ) else { continue; }; @@ -232,35 +298,6 @@ fn trivia_kind_id(kind: &str) -> usize { } } -/// Parse a node's `range` into a [`yeast::Range`]. -/// -/// The JSON carries, for `start` and `end`, a 0-based UTF-8 file byte `offset`, -/// a 1-based `line`, and a 1-based UTF-8 byte `column`. yeast (like tree-sitter) -/// uses byte offsets with 0-based rows/columns and an exclusive end, so the -/// line/column are shifted down by one. swift-syntax's end position is already -/// exclusive, so the byte offsets map across directly. -fn parse_range(node: &Value) -> Option { - let range = node.get("range")?; - let point = |key: &str| -> Option<(usize, Point)> { - let p = range.get(key)?; - let offset = p.get("offset")?.as_u64()? as usize; - let line = p.get("line")?.as_u64()? as usize; - let column = p.get("column")?.as_u64()? as usize; - Some(( - offset, - Point::new(line.saturating_sub(1), column.saturating_sub(1)), - )) - }; - let (start_byte, start_point) = point("start")?; - let (end_byte, end_point) = point("end")?; - Some(Range { - start_byte, - end_byte, - start_point, - end_point, - }) -} - /// The authoritative swift-syntax input node-types schema, generated from /// swift-syntax by `swift-syntax-rs/schemagen` (run /// `unified/scripts/regenerate-node-types.sh` to refresh it). @@ -276,10 +313,11 @@ const SWIFT_NODE_TYPES: &str = include_str!("../../../swift_node_types.yml"); /// ever consumes swift-syntax input, so the schema is not a parameter. pub fn json_to_ast(json: &str) -> Result { let root: Value = serde_json::from_str(json).map_err(|e| format!("invalid JSON: {e}"))?; + let locations = LocationTable::from_root(&root)?; let mut ast = Ast::with_schema(yeast::node_types_yaml::schema_from_yaml(SWIFT_NODE_TYPES)?); let mut extras = Vec::new(); - let root_id = build(&root, &mut ast, &mut extras)?; + let root_id = build(&root, &locations, &mut ast, &mut extras)?; ast.set_root(root_id); // Emit extras in source order (the traversal visits nodes bottom-up). @@ -297,23 +335,28 @@ mod tests { /// adapter is tested without needing the Swift toolchain. fn sample_json() -> &'static str { r#"{ + "$lineStarts": [0], + "$pos": 0, + "$end": 9, "kind": "sourceFile", - "range": {"start":{"offset":0,"line":1,"column":1},"end":{"offset":9,"line":1,"column":10}}, "statements": [ { + "$pos": 0, + "$end": 9, "kind": "variableDecl", - "range": {"start":{"offset":0,"line":1,"column":1},"end":{"offset":9,"line":1,"column":10}}, "bindingSpecifier": { + "$pos": 0, + "$end": 3, "kind": "token", "tokenKind": "keyword(SwiftSyntax.Keyword.let)", - "text": "let", - "range": {"start":{"offset":0,"line":1,"column":1},"end":{"offset":3,"line":1,"column":4}} + "text": "let" }, "name": { + "$pos": 4, + "$end": 5, "kind": "token", "tokenKind": "identifier(\"x\")", - "text": "x", - "range": {"start":{"offset":4,"line":1,"column":5},"end":{"offset":5,"line":1,"column":6}} + "text": "x" } } ] @@ -377,30 +420,72 @@ mod tests { .iter() .find(|n| n.kind_name() == "identifier") .expect("identifier node exists"); - // `x` is at file offset 4..5, line 1, column 5 (1-based) in the JSON, - // which maps to 0-based row 0, column 4 and byte range 4..5. + // `x` is at UTF-8 byte range 4..5 on the first line. assert_eq!(ident.start_byte(), 4); assert_eq!(ident.end_byte(), 5); assert_eq!(ident.start_position(), Point::new(0, 4)); assert_eq!(ident.end_position(), Point::new(0, 5)); } + #[test] + fn maps_utf8_locations_across_swift_line_endings() { + // The implied source prefix is `// é😀\r\nlet `: the second line begins + // at UTF-8 byte 11 and `x` occupies bytes 15..16. + let json = r#"{ + "$lineStarts": [0, 11, 21, 31], + "$pos": 0, + "$end": 31, + "kind": "sourceFile", + "name": { + "$pos": 15, + "$end": 16, + "kind": "token", + "tokenKind": "identifier(\"x\")", + "text": "x" + } + }"#; + let ast = json_to_ast(json).expect("adapter should succeed").ast; + let ident = ast + .nodes() + .iter() + .find(|n| n.kind_name() == "identifier") + .expect("identifier node exists"); + assert_eq!(ident.start_byte(), 15); + assert_eq!(ident.end_byte(), 16); + assert_eq!(ident.start_position(), Point::new(1, 4)); + assert_eq!(ident.end_position(), Point::new(1, 5)); + } + + #[test] + fn rejects_invalid_line_starts() { + let json = r#"{"$lineStarts":[1],"$pos":0,"$end":0,"kind":"sourceFile"}"#; + let error = match json_to_ast(json) { + Ok(_) => panic!("invalid line starts should fail"), + Err(error) => error, + }; + assert!(error.contains("must start with offset 0"), "{error}"); + } + #[test] fn collects_extras_into_side_channel() { // A token carrying a trailing line comment in its trivia. let json = r#"{ + "$lineStarts": [0], + "$pos": 0, + "$end": 14, "kind": "sourceFile", - "range": {"start":{"offset":0,"line":1,"column":1},"end":{"offset":14,"line":1,"column":15}}, "value": { + "$pos": 0, + "$end": 1, "kind": "token", "tokenKind": "integerLiteral(\"1\")", "text": "1", - "range": {"start":{"offset":0,"line":1,"column":1},"end":{"offset":1,"line":1,"column":2}}, "trailingTrivia": [ { + "$pos": 2, + "$end": 6, "kind": "lineComment", - "text": "// c", - "range": {"start":{"offset":2,"line":1,"column":3},"end":{"offset":6,"line":1,"column":7}} + "text": "// c" } ] } diff --git a/unified/extractor/tests/fixtures/let_x.swiftsyntax.json b/unified/extractor/tests/fixtures/let_x.swiftsyntax.json index 6c3d18e2fef0..a0b911813fff 100644 --- a/unified/extractor/tests/fixtures/let_x.swiftsyntax.json +++ b/unified/extractor/tests/fixtures/let_x.swiftsyntax.json @@ -1,196 +1,80 @@ { + "$end": 10, + "$lineStarts": [ + 0, + 10 + ], + "$pos": 0, "endOfFileToken": { + "$end": 10, + "$pos": 10, "kind": "token", - "range": { - "end": { - "column": 1, - "line": 2, - "offset": 10 - }, - "start": { - "column": 1, - "line": 2, - "offset": 10 - } - }, "text": "", "tokenKind": "endOfFile" }, "kind": "sourceFile", - "range": { - "end": { - "column": 1, - "line": 2, - "offset": 10 - }, - "start": { - "column": 1, - "line": 1, - "offset": 0 - } - }, "statements": [ { + "$end": 9, + "$pos": 0, "item": { + "$end": 9, + "$pos": 0, "attributes": [], "bindings": [ { + "$end": 9, + "$pos": 4, "initializer": { + "$end": 9, + "$pos": 6, "equal": { + "$end": 7, + "$pos": 6, "kind": "token", - "range": { - "end": { - "column": 8, - "line": 1, - "offset": 7 - }, - "start": { - "column": 7, - "line": 1, - "offset": 6 - } - }, "text": "=", "tokenKind": "equal" }, "kind": "initializerClause", - "range": { - "end": { - "column": 10, - "line": 1, - "offset": 9 - }, - "start": { - "column": 7, - "line": 1, - "offset": 6 - } - }, "value": { + "$end": 9, + "$pos": 8, "kind": "integerLiteralExpr", "literal": { + "$end": 9, + "$pos": 8, "kind": "token", - "range": { - "end": { - "column": 10, - "line": 1, - "offset": 9 - }, - "start": { - "column": 9, - "line": 1, - "offset": 8 - } - }, "text": "1", "tokenKind": "integerLiteral(\"1\")" - }, - "range": { - "end": { - "column": 10, - "line": 1, - "offset": 9 - }, - "start": { - "column": 9, - "line": 1, - "offset": 8 - } } } }, "kind": "patternBinding", "pattern": { + "$end": 5, + "$pos": 4, "identifier": { + "$end": 5, + "$pos": 4, "kind": "token", - "range": { - "end": { - "column": 6, - "line": 1, - "offset": 5 - }, - "start": { - "column": 5, - "line": 1, - "offset": 4 - } - }, "text": "x", "tokenKind": "identifier(\"x\")" }, - "kind": "identifierPattern", - "range": { - "end": { - "column": 6, - "line": 1, - "offset": 5 - }, - "start": { - "column": 5, - "line": 1, - "offset": 4 - } - } - }, - "range": { - "end": { - "column": 10, - "line": 1, - "offset": 9 - }, - "start": { - "column": 5, - "line": 1, - "offset": 4 - } + "kind": "identifierPattern" } } ], "bindingSpecifier": { + "$end": 3, + "$pos": 0, "kind": "token", - "range": { - "end": { - "column": 4, - "line": 1, - "offset": 3 - }, - "start": { - "column": 1, - "line": 1, - "offset": 0 - } - }, "text": "let", "tokenKind": "keyword(SwiftSyntax.Keyword.let)" }, "kind": "variableDecl", - "modifiers": [], - "range": { - "end": { - "column": 10, - "line": 1, - "offset": 9 - }, - "start": { - "column": 1, - "line": 1, - "offset": 0 - } - } + "modifiers": [] }, - "kind": "codeBlockItem", - "range": { - "end": { - "column": 10, - "line": 1, - "offset": 9 - }, - "start": { - "column": 1, - "line": 1, - "offset": 0 - } - } + "kind": "codeBlockItem" } ] } diff --git a/unified/extractor/tests/swift_syntax_pipeline.rs b/unified/extractor/tests/swift_syntax_pipeline.rs index 3ae966d7bc38..a5f628c45967 100644 --- a/unified/extractor/tests/swift_syntax_pipeline.rs +++ b/unified/extractor/tests/swift_syntax_pipeline.rs @@ -17,30 +17,37 @@ mod languages; const LET_X_JSON: &str = include_str!("fixtures/let_x.swiftsyntax.json"); const IMPORT_FOUNDATION_JSON: &str = r#"{ + "$lineStarts": [0], + "$pos": 0, + "$end": 17, "kind": "sourceFile", - "range": {"start":{"offset":0,"line":1,"column":1},"end":{"offset":17,"line":1,"column":18}}, "statements": [ { + "$pos": 0, + "$end": 17, "kind": "codeBlockItem", - "range": {"start":{"offset":0,"line":1,"column":1},"end":{"offset":17,"line":1,"column":18}}, "item": { + "$pos": 0, + "$end": 17, "kind": "importDecl", - "range": {"start":{"offset":0,"line":1,"column":1},"end":{"offset":17,"line":1,"column":18}}, "importKeyword": { + "$pos": 0, + "$end": 6, "kind": "token", "tokenKind": "keyword(SwiftSyntax.Keyword.import)", - "text": "import", - "range": {"start":{"offset":0,"line":1,"column":1},"end":{"offset":6,"line":1,"column":7}} + "text": "import" }, "path": [ { + "$pos": 7, + "$end": 17, "kind": "importPathComponent", - "range": {"start":{"offset":7,"line":1,"column":8},"end":{"offset":17,"line":1,"column":18}}, "name": { + "$pos": 7, + "$end": 17, "kind": "token", "tokenKind": "identifier(\"Foundation\")", - "text": "Foundation", - "range": {"start":{"offset":7,"line":1,"column":8},"end":{"offset":17,"line":1,"column":18}} + "text": "Foundation" } } ] diff --git a/unified/swift-syntax-rs/README.md b/unified/swift-syntax-rs/README.md index ee0e559820b4..32528952071d 100644 --- a/unified/swift-syntax-rs/README.md +++ b/unified/swift-syntax-rs/README.md @@ -10,69 +10,83 @@ builds that shim (via `build.rs`) and provides safe bindings on top of it. ## Output format The emitted JSON tree preserves the AST's named structure. Every node has a -`kind` and a `range` with `start`/`end` positions (UTF-8 `offset` plus 1-based -`line`/`column`). Beyond that: +`kind` and a half-open UTF-8 byte range encoded as 0-based `$pos`/`$end` +offsets. The root also has a `$lineStarts` array containing the UTF-8 byte +offset of every physical source line, so line/column positions can be +reconstructed without repeating them on every node. Beyond that: - **Tokens** carry `text`, `tokenKind`, and — only when non-empty — - `leadingTrivia`/`trailingTrivia` arrays of `{ kind, text }` pieces. + `leadingTrivia`/`trailingTrivia` arrays of `{ kind, text, $pos, $end }` + pieces. - **Layout nodes** (e.g. `functionDecl`) embed their children directly as members keyed by the child's name in the parent (`name`, `signature`, - `body`, …), alongside `kind`/`range`. Absent optional children are omitted. + `body`, …), alongside `kind`/`$pos`/`$end`. Absent optional children are + omitted. - **Collection nodes** (e.g. `codeBlockItemList`) are elided: a list-valued field is simply a JSON array of its elements (e.g. `parameters`, `statements`). - This drops the collection node's own `kind`/`range`. + This drops the collection node's own `kind`/location. Only meaningful trivia is kept — the four comment kinds (`lineComment`, `blockComment`, `docLineComment`, `docBlockComment`) and `unexpectedText` -(source the parser skipped). Whitespace trivia is dropped, since node ranges +(source the parser skipped). Whitespace trivia is dropped, since node offsets already encode positions. ### Example -Parsing `let x = 1 // c` produces the following (each `range` object is +Parsing `let x = 1 // c` produces the following (location offsets are abbreviated here as `…`): ```jsonc { + "$pos": 0, + "$end": …, + "$lineStarts": [0], "kind": "sourceFile", - "range": …, "statements": [ // collection node elided to an array { + "$pos": 0, + "$end": …, "kind": "codeBlockItem", - "range": …, "item": { + "$pos": 0, + "$end": …, "kind": "variableDecl", - "range": …, "attributes": [], // empty collection → empty array "modifiers": [], "bindingSpecifier": { // a token + "$pos": 0, + "$end": 3, "kind": "token", "text": "let", - "tokenKind": "keyword(SwiftSyntax.Keyword.let)", - "range": … + "tokenKind": "keyword(SwiftSyntax.Keyword.let)" }, "bindings": [ { + "$pos": …, + "$end": …, "kind": "patternBinding", - "range": …, "pattern": { + "$pos": …, + "$end": …, "kind": "identifierPattern", - "range": …, - "identifier": { "kind": "token", "text": "x", "tokenKind": "identifier(\"x\")", "range": … } + "identifier": { "$pos": …, "$end": …, "kind": "token", "text": "x", "tokenKind": "identifier(\"x\")" } }, "initializer": { + "$pos": …, + "$end": …, "kind": "initializerClause", - "range": …, - "equal": { "kind": "token", "text": "=", "tokenKind": "equal", "range": … }, + "equal": { "$pos": …, "$end": …, "kind": "token", "text": "=", "tokenKind": "equal" }, "value": { + "$pos": …, + "$end": …, "kind": "integerLiteralExpr", - "range": …, "literal": { + "$pos": …, + "$end": …, "kind": "token", "text": "1", "tokenKind": "integerLiteral(\"1\")", - "range": …, - "trailingTrivia": [ { "kind": "lineComment", "text": "// c" } ] + "trailingTrivia": [ { "$pos": …, "$end": …, "kind": "lineComment", "text": "// c" } ] } } } @@ -81,7 +95,7 @@ abbreviated here as `…`): } } ], - "endOfFileToken": { "kind": "token", "text": "", "tokenKind": "endOfFile", "range": … } + "endOfFileToken": { "$pos": …, "$end": …, "kind": "token", "text": "", "tokenKind": "endOfFile" } } ``` diff --git a/unified/swift-syntax-rs/src/lib.rs b/unified/swift-syntax-rs/src/lib.rs index a87c817a8935..f209780f3eee 100644 --- a/unified/swift-syntax-rs/src/lib.rs +++ b/unified/swift-syntax-rs/src/lib.rs @@ -86,12 +86,18 @@ mod tests { "unexpected tree: {json}" ); assert!(json.contains("\"text\":\"x\""), "unexpected tree: {json}"); - // Source ranges are emitted for every node. - assert!(json.contains("\"range\""), "missing ranges: {json}"); + // Compact UTF-8 source ranges are emitted for every node, with one + // source-wide line-start table. assert!( - json.contains("\"line\"") && json.contains("\"column\"") && json.contains("\"offset\""), + json.contains("\"$pos\"") + && json.contains("\"$end\"") + && json.contains("\"$lineStarts\""), "missing location fields: {json}" ); + assert!( + !json.contains("\"range\""), + "unexpected verbose range: {json}" + ); } #[test] @@ -138,11 +144,32 @@ mod tests { "JSON string was not escaped correctly: {json}" ); assert!( - json.contains(r#""start":{"column":1,"line":1,"offset":0}"#), + json.starts_with(r#"{"$end":"#) && json.contains(r#","$lineStarts":[0,"#), "JSON object keys were not sorted: {json}" ); } + #[test] + fn emits_utf8_offsets_with_swift_syntax_line_boundaries() { + let source = "// é😀\r\nlet x = 1\rlet y = 2\n"; + let json = parse_to_json(source).expect("parsing should succeed"); + + // SwiftSyntax recognizes LF, CR, and CRLF as physical line breaks. The + // offsets are UTF-8 bytes, so the first CRLF ends at byte 11. + assert!( + json.contains(r#""$lineStarts":[0,11,21,31]"#), + "unexpected line starts: {json}" + ); + assert!( + json.contains(r#""$end":16,"$pos":15,"kind":"token","text":"x""#), + "unexpected UTF-8 token range: {json}" + ); + assert!( + json.contains(r#""$end":26,"$pos":25,"kind":"token","text":"y""#), + "unexpected UTF-8 token range: {json}" + ); + } + #[test] fn captures_trivia() { // A leading comment is kept as trivia on the token it precedes. diff --git a/unified/swift-syntax-rs/swift/Sources/SwiftSyntaxFFI/SwiftSyntaxFFI.swift b/unified/swift-syntax-rs/swift/Sources/SwiftSyntaxFFI/SwiftSyntaxFFI.swift index e423e75cf33f..7f6af5898191 100644 --- a/unified/swift-syntax-rs/swift/Sources/SwiftSyntaxFFI/SwiftSyntaxFFI.swift +++ b/unified/swift-syntax-rs/swift/Sources/SwiftSyntaxFFI/SwiftSyntaxFFI.swift @@ -11,25 +11,24 @@ import SwiftParser import Darwin #endif -/// Convert an absolute position into an `{ offset, line, column }` dictionary. +/// Return the UTF-8 byte offset of the start of every physical source line. /// -/// `offset` is a UTF-8 byte offset; `line`/`column` are 1-based. -private func location( - _ position: AbsolutePosition, - _ converter: SourceLocationConverter -) -> [String: Any] { - let loc = converter.location(for: position) - return [ - "offset": position.utf8Offset, - "line": loc.line, - "column": loc.column, - ] +/// Deriving this from `SourceLocationConverter.sourceLines` keeps newline +/// handling exactly aligned with swift-syntax (`\n`, `\r`, and `\r\n`). +private func lineStarts(_ converter: SourceLocationConverter) -> [Any] { + var result: [Any] = [] + var offset = 0 + for line in converter.sourceLines { + result.append(offset) + offset += line.utf8.count + } + return result } /// Trivia kinds worth preserving in the serialized tree. Comments carry /// developer intent (including doc comments), and `unexpectedText` flags source /// the parser had to skip. Whitespace and multi-line-string escape markers are -/// dropped: node ranges already encode positions, so they would only bloat the +/// dropped: node offsets already encode positions, so they would only bloat the /// output. private let keptTriviaKinds: Set = [ "lineComment", @@ -39,7 +38,7 @@ private let keptTriviaKinds: Set = [ "unexpectedText", ] -/// Serialize a trivia collection into an array of `{ kind, text, range }` +/// Serialize a trivia collection into an array of `{ kind, text, $pos, $end }` /// pieces, keeping only the kinds in `keptTriviaKinds`. /// /// `start` is the absolute position of the first piece (a token's leading @@ -48,8 +47,7 @@ private let keptTriviaKinds: Set = [ /// accumulating piece lengths, so kept pieces carry an exact source location. private func serializeTrivia( _ trivia: Trivia, - startingAt start: AbsolutePosition, - _ converter: SourceLocationConverter + startingAt start: AbsolutePosition ) -> [Any] { var result: [Any] = [] var offset = start.utf8Offset @@ -61,12 +59,10 @@ private func serializeTrivia( let kind = Mirror(reflecting: piece).children.first?.label ?? "\(piece)" if keptTriviaKinds.contains(kind) { result.append([ + "$pos": offset, + "$end": offset + length, "kind": kind, "text": Trivia(pieces: [piece]).description, - "range": [ - "start": location(AbsolutePosition(utf8Offset: offset), converter), - "end": location(AbsolutePosition(utf8Offset: offset + length), converter), - ], ]) } offset += length @@ -76,55 +72,50 @@ private func serializeTrivia( /// Recursively convert a SwiftSyntax node into a JSON-serializable value. /// -/// * Tokens carry `kind`, `tokenKind`, `text`, and `range`, plus +/// * Tokens carry `kind`, `tokenKind`, `text`, `$pos`, and `$end`, plus /// `leadingTrivia`/`trailingTrivia` — but only when non-empty (after /// filtering, most tokens have no trivia, so the keys are simply absent). -/// * Layout nodes (e.g. `functionDecl`) carry `kind` and source `range`, and -/// additionally embed their children directly as members keyed by the +/// * Layout nodes (e.g. `functionDecl`) carry `kind`, `$pos`, and `$end`, +/// and additionally embed their children directly as members keyed by the /// child's name in the parent (e.g. `name`, `signature`, `body`); absent -/// optional children are omitted. Field names never collide with -/// `kind`/`range`. +/// optional children are omitted. /// * Collection nodes (e.g. `codeBlockItemList`) are *elided*: they become a /// plain array of their serialized elements, taking the place of the /// collection node itself. A list-valued layout field (e.g. `parameters`) is /// therefore simply a JSON array. This drops the collection node's own -/// `kind`/`range`, which are unnamed and largely recoverable from the +/// `kind`/location, which are unnamed and largely recoverable from the /// elements. -private func serialize( - _ node: Syntax, - _ converter: SourceLocationConverter -) -> Any { +private func serialize(_ node: Syntax) -> Any { if node.kind.isSyntaxCollection { return node.children(viewMode: .sourceAccurate).map { - serialize($0, converter) + serialize($0) } } - // Source range covering the node's content, excluding surrounding trivia. - let range: [String: Any] = [ - "start": location(node.positionAfterSkippingLeadingTrivia, converter), - "end": location(node.endPositionBeforeTrailingTrivia, converter), - ] + // Half-open UTF-8 byte range covering the node's content, excluding + // surrounding trivia. + let start = node.positionAfterSkippingLeadingTrivia.utf8Offset + let end = node.endPositionBeforeTrailingTrivia.utf8Offset if let token = node.as(TokenSyntax.self) { var result: [String: Any] = [ + "$pos": start, + "$end": end, "kind": "token", "tokenKind": "\(token.tokenKind)", "text": token.text, - "range": range, ] // Only emit trivia when present; after filtering, most tokens have none. // Leading trivia starts at the token's own position; trailing trivia // starts just after the token's content. let leading = serializeTrivia( - token.leadingTrivia, startingAt: token.position, converter) + token.leadingTrivia, startingAt: token.position) if !leading.isEmpty { result["leadingTrivia"] = leading } let trailing = serializeTrivia( token.trailingTrivia, - startingAt: token.endPositionBeforeTrailingTrivia, - converter) + startingAt: token.endPositionBeforeTrailingTrivia) if !trailing.isEmpty { result["trailingTrivia"] = trailing } @@ -132,8 +123,9 @@ private func serialize( } var result: [String: Any] = [ + "$pos": start, + "$end": end, "kind": "\(node.kind)", - "range": range, ] var unnamed = 0 for child in node.children(viewMode: .sourceAccurate) { @@ -141,10 +133,10 @@ private func serialize( // parent (the same mechanism SwiftSyntax uses for its debug dump). A // child that is a collection serializes to an array (see above). if let keyPath = child.keyPathInParent, let name = childName(keyPath) { - result[name] = serialize(child, converter) + result[name] = serialize(child) } else { // Defensive fallback for any unnamed layout child. - result["child\(unnamed)"] = serialize(child, converter) + result["child\(unnamed)"] = serialize(child) unnamed += 1 } } @@ -315,7 +307,10 @@ public func ssr_parse_json(_ source: UnsafePointer?) -> UnsafeMutablePoin // converter built from the original tree maps the folded tree correctly. let folded = foldOperators(in: tree) let converter = SourceLocationConverter(fileName: "", tree: tree) - let json = serialize(folded, converter) + guard var json = serialize(folded) as? [String: Any] else { + return nil + } + json["$lineStarts"] = lineStarts(converter) var bytes: [UInt8] = [] do { From fbd27e4d4ad38f078981efb6bf614d6f1f9a4750 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 3 Sep 2026 15:34:11 +0100 Subject: [PATCH 0831/2098] Model `encoding/json/jsontext` package --- .../lib/ext/encoding.json.jsontext.model.yml | 37 +++++++++++++++++++ .../go/frameworks/stdlib/EncodingJson.qll | 12 ++++-- 2 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 go/ql/lib/ext/encoding.json.jsontext.model.yml diff --git a/go/ql/lib/ext/encoding.json.jsontext.model.yml b/go/ql/lib/ext/encoding.json.jsontext.model.yml new file mode 100644 index 000000000000..978bc8b16344 --- /dev/null +++ b/go/ql/lib/ext/encoding.json.jsontext.model.yml @@ -0,0 +1,37 @@ +extensions: + - addsTo: + pack: codeql/go-all + extensible: summaryModel + data: + - ["encoding/json/jsontext", "", False, "AppendFloat", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"] + - ["encoding/json/jsontext", "", False, "AppendFormat", "", "", "Argument[0..1]", "ReturnValue[0]", "taint", "manual"] + - ["encoding/json/jsontext", "", False, "AppendQuote", "", "", "Argument[0..1]", "ReturnValue[0]", "taint", "manual"] + - ["encoding/json/jsontext", "", False, "AppendUnquote", "", "", "Argument[0..1]", "ReturnValue[0]", "taint", "manual"] + - ["encoding/json/jsontext", "", False, "NewDecoder", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["encoding/json/jsontext", "", False, "Float", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["encoding/json/jsontext", "", False, "Float32", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["encoding/json/jsontext", "", False, "Int", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["encoding/json/jsontext", "", False, "String", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["encoding/json/jsontext", "", False, "Uint", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["encoding/json/jsontext", "Decoder", True, "ReadToken", "", "", "Argument[receiver]", "ReturnValue[0]", "taint", "manual"] + - ["encoding/json/jsontext", "Decoder", True, "ReadValue", "", "", "Argument[receiver]", "ReturnValue[0]", "taint", "manual"] + - ["encoding/json/jsontext", "Decoder", True, "Reset", "", "", "Argument[0]", "Argument[receiver]", "taint", "manual"] + - ["encoding/json/jsontext", "Decoder", True, "UnreadBuffer", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] + - ["encoding/json/jsontext", "Encoder", True, "Reset", "", "", "Argument[receiver]", "Argument[0]", "taint", "manual"] + - ["encoding/json/jsontext", "Encoder", True, "WriteToken", "", "", "Argument[0]", "Argument[receiver]", "taint", "manual"] + - ["encoding/json/jsontext", "Encoder", True, "WriteValue", "", "", "Argument[0]", "Argument[receiver]", "taint", "manual"] + - ["encoding/json/jsontext", "Pointer", True, "AppendToken", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] + - ["encoding/json/jsontext", "Pointer", True, "AppendToken", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["encoding/json/jsontext", "Pointer", True, "LastToken", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] + - ["encoding/json/jsontext", "Pointer", True, "Parent", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] + - ["encoding/json/jsontext", "Pointer", True, "Tokens", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] + - ["encoding/json/jsontext", "Token", True, "Clone", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] + - ["encoding/json/jsontext", "Token", True, "Float", "", "", "Argument[receiver]", "ReturnValue[0]", "taint", "manual"] + - ["encoding/json/jsontext", "Token", True, "Float32", "", "", "Argument[receiver]", "ReturnValue[0]", "taint", "manual"] + - ["encoding/json/jsontext", "Token", True, "Int", "", "", "Argument[receiver]", "ReturnValue[0]", "taint", "manual"] + - ["encoding/json/jsontext", "Token", True, "String", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] + - ["encoding/json/jsontext", "Token", True, "Uint", "", "", "Argument[receiver]", "ReturnValue[0]", "taint", "manual"] + - ["encoding/json/jsontext", "Value", True, "Clone", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] + - ["encoding/json/jsontext", "Value", True, "MarshalJSON", "", "", "Argument[receiver]", "ReturnValue[0]", "taint", "manual"] + - ["encoding/json/jsontext", "Value", True, "String", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] + - ["encoding/json/jsontext", "Value", True, "UnmarshalJSON", "", "", "Argument[0]", "Argument[receiver]", "taint", "manual"] diff --git a/go/ql/lib/semmle/go/frameworks/stdlib/EncodingJson.qll b/go/ql/lib/semmle/go/frameworks/stdlib/EncodingJson.qll index bf6e25ff9f12..e04f9392def7 100644 --- a/go/ql/lib/semmle/go/frameworks/stdlib/EncodingJson.qll +++ b/go/ql/lib/semmle/go/frameworks/stdlib/EncodingJson.qll @@ -41,9 +41,15 @@ module EncodingJson { FunctionOutput outp; FunctionModels() { - // signature: func NewEncoder(w io.Writer) *Encoder - this.hasQualifiedName("encoding/json", "NewEncoder") and - (inp.isResult() and outp.isParameter(0)) + ( + // signature: func NewEncoder(w io.Writer) *Encoder + this.hasQualifiedName("encoding/json", "NewEncoder") + or + // signature: func NewEncoder(w io.Writer, opts ...Options) *Encoder + this.hasQualifiedName("encoding/json/jsontext", "NewEncoder") + ) and + inp.isResult() and + outp.isParameter(0) } override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { From fd61ec02110f7b03ba7156f0cb9580bbedfbbc60 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 4 Sep 2026 18:01:37 +0100 Subject: [PATCH 0832/2098] Add models for new functions in Go 1.27 --- go/ql/lib/ext/bytes.model.yml | 1 + go/ql/lib/ext/database.sql.driver.model.yml | 1 + go/ql/lib/ext/database.sql.model.yml | 1 + go/ql/lib/ext/net.url.model.yml | 2 ++ go/ql/lib/ext/strings.model.yml | 1 + .../go/frameworks/StdlibTaintFlow/Bytes.go | 24 +++++++++++++++++++ .../frameworks/StdlibTaintFlow/DatabaseSql.go | 16 ++++++++++++- .../StdlibTaintFlow/DatabaseSqlDriver.go | 12 ++++++++++ .../go/frameworks/StdlibTaintFlow/NetHttp.go | 21 ++++++++++++++++ .../go/frameworks/StdlibTaintFlow/Strings.go | 22 +++++++++++++++++ .../go/frameworks/StdlibTaintFlow/go.mod | 2 +- 11 files changed, 101 insertions(+), 2 deletions(-) diff --git a/go/ql/lib/ext/bytes.model.yml b/go/ql/lib/ext/bytes.model.yml index b55749f828bf..9f5ad37176a7 100644 --- a/go/ql/lib/ext/bytes.model.yml +++ b/go/ql/lib/ext/bytes.model.yml @@ -5,6 +5,7 @@ extensions: data: - ["bytes", "", False, "Clone", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["bytes", "", False, "Cut", "", "", "Argument[0]", "ReturnValue[0..1]", "taint", "manual"] + - ["bytes", "", False, "CutLast", "", "", "Argument[0]", "ReturnValue[0..1]", "taint", "manual"] - ["bytes", "", False, "CutPrefix", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"] - ["bytes", "", False, "CutSuffix", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"] - ["bytes", "", False, "Fields", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] diff --git a/go/ql/lib/ext/database.sql.driver.model.yml b/go/ql/lib/ext/database.sql.driver.model.yml index 0f33a6e14b8c..2c5770e26194 100644 --- a/go/ql/lib/ext/database.sql.driver.model.yml +++ b/go/ql/lib/ext/database.sql.driver.model.yml @@ -24,5 +24,6 @@ extensions: - ["database/sql/driver", "Conn", True, "Prepare", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"] - ["database/sql/driver", "ConnPrepareContext", True, "PrepareContext", "", "", "Argument[1]", "ReturnValue[0]", "taint", "manual"] - ["database/sql/driver", "Rows", True, "Next", "", "", "Argument[receiver]", "Argument[0]", "taint", "manual"] + - ["database/sql/driver", "RowsColumnScanner", True, "ScanColumn", "", "", "Argument[receiver]", "Argument[2]", "taint", "manual"] - ["database/sql/driver", "ValueConverter", True, "ConvertValue", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"] - ["database/sql/driver", "Valuer", True, "Value", "", "", "Argument[receiver]", "ReturnValue[0]", "taint", "manual"] diff --git a/go/ql/lib/ext/database.sql.model.yml b/go/ql/lib/ext/database.sql.model.yml index 8d67dd921423..3f37c2a6eab4 100644 --- a/go/ql/lib/ext/database.sql.model.yml +++ b/go/ql/lib/ext/database.sql.model.yml @@ -49,6 +49,7 @@ extensions: pack: codeql/go-all extensible: summaryModel data: + - ["database/sql", "", False, "ConvertAssign", "", "", "Argument[2]", "Argument[1]", "taint", "manual"] - ["database/sql", "", False, "Named", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"] - ["database/sql", "Conn", True, "PrepareContext", "", "", "Argument[1]", "ReturnValue[0]", "taint", "manual"] - ["database/sql", "DB", True, "Prepare", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"] diff --git a/go/ql/lib/ext/net.url.model.yml b/go/ql/lib/ext/net.url.model.yml index 0b48aa2352c2..4b6d15a6d53f 100644 --- a/go/ql/lib/ext/net.url.model.yml +++ b/go/ql/lib/ext/net.url.model.yml @@ -12,6 +12,7 @@ extensions: - ["net/url", "", False, "QueryUnescape", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"] - ["net/url", "", False, "User", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["net/url", "", False, "UserPassword", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"] + - ["net/url", "URL", True, "Clone", "", "", "Argument[receiver]", "ReturnValue", "value", "manual"] - ["net/url", "URL", True, "EscapedPath", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] - ["net/url", "URL", True, "Hostname", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] - ["net/url", "URL", True, "MarshalBinary", "", "", "Argument[receiver]", "ReturnValue[0]", "taint", "manual"] @@ -24,5 +25,6 @@ extensions: - ["net/url", "URL", True, "ResolveReference", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["net/url", "Userinfo", True, "Password", "", "", "Argument[receiver]", "ReturnValue[0]", "taint", "manual"] - ["net/url", "Userinfo", True, "Username", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] + - ["net/url", "Values", True, "Clone", "", "", "Argument[receiver]", "ReturnValue", "value", "manual"] - ["net/url", "Values", True, "Encode", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] - ["net/url", "Values", True, "Get", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] diff --git a/go/ql/lib/ext/strings.model.yml b/go/ql/lib/ext/strings.model.yml index 01015b31517e..8d657e5a67dd 100644 --- a/go/ql/lib/ext/strings.model.yml +++ b/go/ql/lib/ext/strings.model.yml @@ -3,6 +3,7 @@ extensions: pack: codeql/go-all extensible: summaryModel data: + - ["strings", "", False, "CutLast", "", "", "Argument[0]", "ReturnValue[0..1]", "taint", "manual"] - ["strings", "", False, "Fields", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["strings", "", False, "FieldsFunc", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["strings", "", False, "Join", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"] diff --git a/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/Bytes.go b/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/Bytes.go index ac528c46267d..d744819e2807 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/Bytes.go +++ b/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/Bytes.go @@ -335,6 +335,20 @@ func TaintStepTest_Cutright(sourceCQL interface{}) interface{} { return right } +func TaintStepTest_CutLastleft(sourceCQL interface{}) interface{} { + fromReader628 := sourceCQL.([]byte) + sep := []byte{} + left, _, _ := bytes.CutLast(fromReader628, sep) + return left +} + +func TaintStepTest_CutLastright(sourceCQL interface{}) interface{} { + fromReader628 := sourceCQL.([]byte) + sep := []byte{} + _, right, _ := bytes.CutLast(fromReader628, sep) + return right +} + func TaintStepTest_CutPrefix(sourceCQL interface{}) interface{} { fromReader628 := sourceCQL.([]byte) sep := []byte{} @@ -636,4 +650,14 @@ func RunAllTaints_Bytes() { out := TaintStepTest_BytesBufferPeek(source) sink(55, out) } + { + source := newSource(56) + out := TaintStepTest_CutLastleft(source) + sink(56, out) + } + { + source := newSource(57) + out := TaintStepTest_CutLastright(source) + sink(57, out) + } } diff --git a/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/DatabaseSql.go b/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/DatabaseSql.go index 59a61cff31a9..3e2f5af18bba 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/DatabaseSql.go +++ b/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/DatabaseSql.go @@ -2,7 +2,10 @@ package main -import "database/sql" +import ( + "database/sql" + "database/sql/driver" +) func TaintStepTest_DatabaseSqlNamed_B0I0O0(sourceCQL interface{}) interface{} { fromString656 := sourceCQL.(string) @@ -79,6 +82,12 @@ func TaintStepTest_DatabaseSqlConnPrepareContext(sourceCQL interface{}) interfac return intoPrepareResult0 } +func TaintStepTest_DatabaseSqlConvertAssign(sourceCQL interface{}) interface{} { + var destination interface{} + sql.ConvertAssign(driver.ScanContext{}, &destination, sourceCQL) + return destination +} + func RunAllTaints_DatabaseSql() { { source := newSource(0) @@ -135,4 +144,9 @@ func RunAllTaints_DatabaseSql() { out := TaintStepTest_DatabaseSqlConnPrepareContext(source) sink(10, out) } + { + source := newSource(11) + out := TaintStepTest_DatabaseSqlConvertAssign(source) + sink(11, out) + } } diff --git a/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/DatabaseSqlDriver.go b/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/DatabaseSqlDriver.go index fe44132e0fb4..ff572e9d889d 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/DatabaseSqlDriver.go +++ b/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/DatabaseSqlDriver.go @@ -45,6 +45,13 @@ func TaintStepTest_DatabaseSqlDriverValuerValue_B0I0O0(sourceCQL interface{}) in return intoValue982 } +func TaintStepTest_DatabaseSqlDriverRowsColumnScannerScanColumn(sourceCQL interface{}) interface{} { + fromRows := sourceCQL.(driver.RowsColumnScanner) + var destination interface{} + fromRows.ScanColumn(driver.ScanContext{}, 0, &destination) + return destination +} + func RunAllTaints_DatabaseSqlDriver() { { source := newSource(0) @@ -76,4 +83,9 @@ func RunAllTaints_DatabaseSqlDriver() { out := TaintStepTest_DatabaseSqlDriverValuerValue_B0I0O0(source) sink(5, out) } + { + source := newSource(6) + out := TaintStepTest_DatabaseSqlDriverRowsColumnScannerScanColumn(source) + sink(6, out) + } } diff --git a/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/NetHttp.go b/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/NetHttp.go index ebf7fce029d0..86129bedbff2 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/NetHttp.go +++ b/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/NetHttp.go @@ -6,6 +6,7 @@ import ( "bufio" "io" "net/http" + "net/url" ) func TaintStepTest_NetHttpCanonicalHeaderKey_B0I0O0(sourceCQL interface{}) interface{} { @@ -175,6 +176,16 @@ func TaintStepTest_NetHttpResponseWriterWrite_B0I0O0(sourceCQL interface{}) inte return intoResponseWriter139 } +func TaintStepTest_NetUrlURLClone(sourceCQL interface{}) interface{} { + fromURL := sourceCQL.(*url.URL) + return fromURL.Clone() +} + +func TaintStepTest_NetUrlValuesClone(sourceCQL interface{}) interface{} { + fromValues := sourceCQL.(url.Values) + return fromValues.Clone() +} + func RunAllTaints_NetHttp() { { source := newSource(0) @@ -306,4 +317,14 @@ func RunAllTaints_NetHttp() { out := TaintStepTest_NetHttpResponseWriterWrite_B0I0O0(source) sink(23, out) } + { + source := newSource(26) + out := TaintStepTest_NetUrlURLClone(source) + sink(26, out) + } + { + source := newSource(27) + out := TaintStepTest_NetUrlValuesClone(source) + sink(27, out) + } } diff --git a/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/Strings.go b/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/Strings.go index 878f4809130b..4981b4b7b846 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/Strings.go +++ b/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/Strings.go @@ -274,6 +274,18 @@ func TaintStepTest_StringsReplacerWriteString_B0I0O0(sourceCQL interface{}) inte return intoWriter754 } +func TaintStepTest_StringsCutLastleft(sourceCQL interface{}) interface{} { + fromString := sourceCQL.(string) + left, _, _ := strings.CutLast(fromString, "") + return left +} + +func TaintStepTest_StringsCutLastright(sourceCQL interface{}) interface{} { + fromString := sourceCQL.(string) + _, right, _ := strings.CutLast(fromString, "") + return right +} + func RunAllTaints_Strings() { { source := newSource(0) @@ -490,4 +502,14 @@ func RunAllTaints_Strings() { out := TaintStepTest_StringsReplacerWriteString_B0I0O0(source) sink(42, out) } + { + source := newSource(43) + out := TaintStepTest_StringsCutLastleft(source) + sink(43, out) + } + { + source := newSource(44) + out := TaintStepTest_StringsCutLastright(source) + sink(44, out) + } } diff --git a/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/go.mod b/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/go.mod index 1a8220297f27..50e9957cce14 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/go.mod +++ b/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/go.mod @@ -1,6 +1,6 @@ module example.com/m -go 1.26 +go 1.27 require ( golang.org/x/net v0.0.0-20201010224723-4f7140c49acb From 36b2a865ecc794cf74521060ffa1bb1c7f6dc7b8 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 9 Sep 2026 13:48:51 +0100 Subject: [PATCH 0833/2098] More models for `strings` package Functions returning an `iter.Seq` are not yet modeled. --- go/ql/lib/ext/strings.model.yml | 18 +- .../go/frameworks/StdlibTaintFlow/Strings.go | 177 +++++++++++++++++- 2 files changed, 190 insertions(+), 5 deletions(-) diff --git a/go/ql/lib/ext/strings.model.yml b/go/ql/lib/ext/strings.model.yml index 8d657e5a67dd..4a6d852baab4 100644 --- a/go/ql/lib/ext/strings.model.yml +++ b/go/ql/lib/ext/strings.model.yml @@ -3,10 +3,15 @@ extensions: pack: codeql/go-all extensible: summaryModel data: + - ["strings", "", False, "Clone", "", "", "Argument[0]", "ReturnValue", "value", "manual"] + - ["strings", "", False, "Cut", "", "", "Argument[0]", "ReturnValue[0..1]", "taint", "manual"] - ["strings", "", False, "CutLast", "", "", "Argument[0]", "ReturnValue[0..1]", "taint", "manual"] - - ["strings", "", False, "Fields", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["strings", "", False, "FieldsFunc", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["strings", "", False, "Join", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"] + - ["strings", "", False, "CutPrefix", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"] + - ["strings", "", False, "CutSuffix", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"] + - ["strings", "", False, "Fields", "", "", "Argument[0]", "ReturnValue.ArrayElement", "taint", "manual"] + - ["strings", "", False, "FieldsFunc", "", "", "Argument[0]", "ReturnValue.ArrayElement", "taint", "manual"] + - ["strings", "", False, "Join", "", "", "Argument[0].ArrayElement", "ReturnValue", "taint", "manual"] + - ["strings", "", False, "Join", "", "", "Argument[1]", "ReturnValue", "taint", "manual"] - ["strings", "", False, "Map", "", "", "Argument[1]", "ReturnValue", "taint", "manual"] - ["strings", "", False, "NewReader", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["strings", "", False, "Repeat", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] @@ -35,6 +40,13 @@ extensions: - ["strings", "", False, "TrimRightFunc", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["strings", "", False, "TrimSpace", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["strings", "", False, "TrimSuffix", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["strings", "Builder", True, "String", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] + - ["strings", "Builder", True, "WriteByte", "", "", "Argument[0]", "Argument[receiver]", "taint", "manual"] + - ["strings", "Builder", True, "WriteRune", "", "", "Argument[0]", "Argument[receiver]", "taint", "manual"] + - ["strings", "Reader", True, "ReadByte", "", "", "Argument[receiver]", "ReturnValue[0]", "taint", "manual"] + - ["strings", "Reader", True, "ReadRune", "", "", "Argument[receiver]", "ReturnValue[0]", "taint", "manual"] - ["strings", "Reader", True, "Reset", "", "", "Argument[0]", "Argument[receiver]", "taint", "manual"] + - ["strings", "Replacer", True, "Replace", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] - ["strings", "Replacer", True, "Replace", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["strings", "Replacer", True, "WriteString", "", "", "Argument[receiver]", "Argument[0]", "taint", "manual"] - ["strings", "Replacer", True, "WriteString", "", "", "Argument[1]", "Argument[0]", "taint", "manual"] diff --git a/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/Strings.go b/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/Strings.go index 4981b4b7b846..a6510f7d01d9 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/Strings.go +++ b/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/Strings.go @@ -7,6 +7,65 @@ import ( "strings" ) +func TaintStepTest_StringsClone(sourceCQL interface{}) interface{} { + return strings.Clone(sourceCQL.(string)) +} + +func TaintStepTest_StringsCutleft(sourceCQL interface{}) interface{} { + left, _, _ := strings.Cut(sourceCQL.(string), "") + return left +} + +func TaintStepTest_StringsCutright(sourceCQL interface{}) interface{} { + _, right, _ := strings.Cut(sourceCQL.(string), "") + return right +} + +func TaintStepTest_StringsCutPrefix(sourceCQL interface{}) interface{} { + result, _ := strings.CutPrefix(sourceCQL.(string), "") + return result +} + +func TaintStepTest_StringsCutSuffix(sourceCQL interface{}) interface{} { + result, _ := strings.CutSuffix(sourceCQL.(string), "") + return result +} + +func TaintStepTest_StringsFieldsFuncSeq(sourceCQL interface{}) interface{} { + for result := range strings.FieldsFuncSeq(sourceCQL.(string), nil) { + return result + } + return "" +} + +func TaintStepTest_StringsFieldsSeq(sourceCQL interface{}) interface{} { + for result := range strings.FieldsSeq(sourceCQL.(string)) { + return result + } + return "" +} + +func TaintStepTest_StringsLines(sourceCQL interface{}) interface{} { + for result := range strings.Lines(sourceCQL.(string)) { + return result + } + return "" +} + +func TaintStepTest_StringsSplitAfterSeq(sourceCQL interface{}) interface{} { + for result := range strings.SplitAfterSeq(sourceCQL.(string), "") { + return result + } + return "" +} + +func TaintStepTest_StringsSplitSeq(sourceCQL interface{}) interface{} { + for result := range strings.SplitSeq(sourceCQL.(string), "") { + return result + } + return "" +} + func TaintStepTest_StringsFields_B0I0O0(sourceCQL interface{}) interface{} { fromString656 := sourceCQL.(string) intoString414 := strings.Fields(fromString656) @@ -20,8 +79,8 @@ func TaintStepTest_StringsFieldsFunc_B0I0O0(sourceCQL interface{}) interface{} { } func TaintStepTest_StringsJoin_B0I0O0(sourceCQL interface{}) interface{} { - fromString784 := sourceCQL.([]string) - intoString957 := strings.Join(fromString784, "") + fromString784 := sourceCQL.(string) + intoString957 := strings.Join([]string{fromString784}, "") return intoString957 } @@ -231,6 +290,18 @@ func TaintStepTest_StringsBuilderWriteString_B0I0O0(sourceCQL interface{}) inter return intoBuilder389 } +func TaintStepTest_StringsBuilderWriteByte(sourceCQL interface{}) interface{} { + var builder strings.Builder + builder.WriteByte(sourceCQL.(byte)) + return builder +} + +func TaintStepTest_StringsBuilderWriteRune(sourceCQL interface{}) interface{} { + var builder strings.Builder + builder.WriteRune(sourceCQL.(rune)) + return builder +} + func TaintStepTest_StringsReaderRead_B0I0O0(sourceCQL interface{}) interface{} { fromReader198 := sourceCQL.(strings.Reader) var intoByte477 []byte @@ -245,6 +316,18 @@ func TaintStepTest_StringsReaderReadAt_B0I0O0(sourceCQL interface{}) interface{} return intoByte382 } +func TaintStepTest_StringsReaderReadByte(sourceCQL interface{}) interface{} { + reader := sourceCQL.(strings.Reader) + result, _ := reader.ReadByte() + return result +} + +func TaintStepTest_StringsReaderReadRune(sourceCQL interface{}) interface{} { + reader := sourceCQL.(strings.Reader) + result, _, _ := reader.ReadRune() + return result +} + func TaintStepTest_StringsReaderReset_B0I0O0(sourceCQL interface{}) interface{} { fromString715 := sourceCQL.(string) var intoReader179 strings.Reader @@ -274,6 +357,16 @@ func TaintStepTest_StringsReplacerWriteString_B0I0O0(sourceCQL interface{}) inte return intoWriter754 } +func TaintStepTest_StringsReplacerReplaceReceiver(sourceCQL interface{}) interface{} { + return sourceCQL.(*strings.Replacer).Replace("") +} + +func TaintStepTest_StringsReplacerWriteStringReceiver(sourceCQL interface{}) interface{} { + var writer io.Writer + sourceCQL.(*strings.Replacer).WriteString(writer, "") + return writer +} + func TaintStepTest_StringsCutLastleft(sourceCQL interface{}) interface{} { fromString := sourceCQL.(string) left, _, _ := strings.CutLast(fromString, "") @@ -512,4 +605,84 @@ func RunAllTaints_Strings() { out := TaintStepTest_StringsCutLastright(source) sink(44, out) } + { + source := newSource(45) + out := TaintStepTest_StringsClone(source) + sink(45, out) + } + { + source := newSource(46) + out := TaintStepTest_StringsCutleft(source) + sink(46, out) + } + { + source := newSource(47) + out := TaintStepTest_StringsCutright(source) + sink(47, out) + } + { + source := newSource(48) + out := TaintStepTest_StringsCutPrefix(source) + sink(48, out) + } + { + source := newSource(49) + out := TaintStepTest_StringsCutSuffix(source) + sink(49, out) + } + // { + // source := newSource(50) + // out := TaintStepTest_StringsFieldsFuncSeq(source) + // sink(50, out) + // } + // { + // source := newSource(51) + // out := TaintStepTest_StringsFieldsSeq(source) + // sink(51, out) + // } + // { + // source := newSource(52) + // out := TaintStepTest_StringsLines(source) + // sink(52, out) + // } + // { + // source := newSource(53) + // out := TaintStepTest_StringsSplitAfterSeq(source) + // sink(53, out) + // } + // { + // source := newSource(54) + // out := TaintStepTest_StringsSplitSeq(source) + // sink(54, out) + // } + { + source := newSource(55) + out := TaintStepTest_StringsBuilderWriteByte(source) + sink(55, out) + } + { + source := newSource(56) + out := TaintStepTest_StringsBuilderWriteRune(source) + sink(56, out) + } + { + source := newSource(57) + out := TaintStepTest_StringsReaderReadByte(source) + sink(57, out) + } + { + source := newSource(58) + out := TaintStepTest_StringsReaderReadRune(source) + sink(58, out) + } + { + source := newSource(59) + out := TaintStepTest_StringsReplacerReplaceReceiver(source) + sink(59, out) + } + { + source := newSource(60) + out := TaintStepTest_StringsReplacerWriteStringReceiver(source) + sink(60, out) + } } From 77ee475c0d3753c27e26012c9f9b7c5a46b1b0e6 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 9 Sep 2026 14:04:57 +0100 Subject: [PATCH 0834/2098] Add change note --- go/ql/lib/change-notes/2026-09-09-go-1.27-models.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 go/ql/lib/change-notes/2026-09-09-go-1.27-models.md diff --git a/go/ql/lib/change-notes/2026-09-09-go-1.27-models.md b/go/ql/lib/change-notes/2026-09-09-go-1.27-models.md new file mode 100644 index 000000000000..94c1b4469b73 --- /dev/null +++ b/go/ql/lib/change-notes/2026-09-09-go-1.27-models.md @@ -0,0 +1,7 @@ +--- +category: minorAnalysis +--- +* Added or improved data flow models for the following Go standard-library APIs introduced or updated in Go 1.27: + * `bytes.CutLast`, `database/sql.ConvertAssign`, `database/sql/driver.RowsColumnScanner.ScanColumn`, `net/url.URL.Clone`, `net/url.Values.Clone` and `strings.CutLast`. + * The new `encoding/json/jsontext` package. +* Added more data flow models for the `strings` package: `strings.Clone`, `Cut`, `CutPrefix`, `CutSuffix`, `Fields`, `FieldsFunc`, and `Join`; `strings.Builder.String`, `Builder.WriteByte`, and `Builder.WriteRune`; `strings.Reader.ReadByte` and `Reader.ReadRune`; and `strings.Replacer.Replace` and `Replacer.WriteString`. From 37a24ee6ae03d02c25a3232667e22f1aabc27630 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 9 Sep 2026 15:09:17 +0000 Subject: [PATCH 0835/2098] Initial plan From 1dea92aa0d6487f2c0edab7df994b1b63bd09edf Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 9 Sep 2026 15:16:35 +0000 Subject: [PATCH 0836/2098] Address review feedback drop jsontext Pointer.Tokens model, add jsontext tests, fix strings Fields tests Co-authored-by: owen-mc <62447351+owen-mc@users.noreply.github.com> --- .../lib/ext/encoding.json.jsontext.model.yml | 1 - .../StdlibTaintFlow/EncodingJsonJsontext.go | 413 ++++++++++++++++++ .../go/frameworks/StdlibTaintFlow/Strings.go | 4 +- 3 files changed, 415 insertions(+), 3 deletions(-) create mode 100644 go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/EncodingJsonJsontext.go diff --git a/go/ql/lib/ext/encoding.json.jsontext.model.yml b/go/ql/lib/ext/encoding.json.jsontext.model.yml index 978bc8b16344..d04afceaefe2 100644 --- a/go/ql/lib/ext/encoding.json.jsontext.model.yml +++ b/go/ql/lib/ext/encoding.json.jsontext.model.yml @@ -24,7 +24,6 @@ extensions: - ["encoding/json/jsontext", "Pointer", True, "AppendToken", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["encoding/json/jsontext", "Pointer", True, "LastToken", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] - ["encoding/json/jsontext", "Pointer", True, "Parent", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] - - ["encoding/json/jsontext", "Pointer", True, "Tokens", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] - ["encoding/json/jsontext", "Token", True, "Clone", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] - ["encoding/json/jsontext", "Token", True, "Float", "", "", "Argument[receiver]", "ReturnValue[0]", "taint", "manual"] - ["encoding/json/jsontext", "Token", True, "Float32", "", "", "Argument[receiver]", "ReturnValue[0]", "taint", "manual"] diff --git a/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/EncodingJsonJsontext.go b/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/EncodingJsonJsontext.go new file mode 100644 index 000000000000..771de17ded3f --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/EncodingJsonJsontext.go @@ -0,0 +1,413 @@ +package main + +import ( + "encoding/json/jsontext" + "io" +) + +func TaintStepTest_JsontextAppendFloat_I0(sourceCQL interface{}) interface{} { + fromByte := sourceCQL.([]byte) + intoByte := jsontext.AppendFloat(fromByte, 0, 64) + return intoByte +} + +func TaintStepTest_JsontextAppendFloat_I1(sourceCQL interface{}) interface{} { + fromFloat := sourceCQL.(float64) + intoByte := jsontext.AppendFloat(nil, fromFloat, 64) + return intoByte +} + +func TaintStepTest_JsontextAppendFormat_I0(sourceCQL interface{}) interface{} { + fromByte := sourceCQL.([]byte) + intoByte, _ := jsontext.AppendFormat(fromByte, []byte{}) + return intoByte +} + +func TaintStepTest_JsontextAppendFormat_I1(sourceCQL interface{}) interface{} { + fromByte := sourceCQL.([]byte) + intoByte, _ := jsontext.AppendFormat(nil, fromByte) + return intoByte +} + +func TaintStepTest_JsontextAppendQuote_I0(sourceCQL interface{}) interface{} { + fromByte := sourceCQL.([]byte) + intoByte, _ := jsontext.AppendQuote(fromByte, []byte{}) + return intoByte +} + +func TaintStepTest_JsontextAppendQuote_I1(sourceCQL interface{}) interface{} { + fromString := sourceCQL.(string) + intoByte, _ := jsontext.AppendQuote(nil, fromString) + return intoByte +} + +func TaintStepTest_JsontextAppendUnquote_I0(sourceCQL interface{}) interface{} { + fromByte := sourceCQL.([]byte) + intoByte, _ := jsontext.AppendUnquote(fromByte, []byte{}) + return intoByte +} + +func TaintStepTest_JsontextAppendUnquote_I1(sourceCQL interface{}) interface{} { + fromString := sourceCQL.(string) + intoByte, _ := jsontext.AppendUnquote(nil, fromString) + return intoByte +} + +func TaintStepTest_JsontextNewDecoder(sourceCQL interface{}) interface{} { + fromReader := sourceCQL.(io.Reader) + intoDecoder := jsontext.NewDecoder(fromReader) + return intoDecoder +} + +func TaintStepTest_JsontextNewEncoder(sourceCQL interface{}) interface{} { + fromEncoder := sourceCQL.(*jsontext.Encoder) + var intoWriter io.Writer + intermediateCQL := jsontext.NewEncoder(intoWriter) + link(fromEncoder, intermediateCQL) + return intoWriter +} + +func TaintStepTest_JsontextFloat(sourceCQL interface{}) interface{} { + fromFloat := sourceCQL.(float64) + intoToken := jsontext.Float(fromFloat) + return intoToken +} + +func TaintStepTest_JsontextFloat32(sourceCQL interface{}) interface{} { + fromFloat := sourceCQL.(float32) + intoToken := jsontext.Float32(fromFloat) + return intoToken +} + +func TaintStepTest_JsontextInt(sourceCQL interface{}) interface{} { + fromInt := sourceCQL.(int64) + intoToken := jsontext.Int(fromInt) + return intoToken +} + +func TaintStepTest_JsontextString(sourceCQL interface{}) interface{} { + fromString := sourceCQL.(string) + intoToken := jsontext.String(fromString) + return intoToken +} + +func TaintStepTest_JsontextUint(sourceCQL interface{}) interface{} { + fromUint := sourceCQL.(uint64) + intoToken := jsontext.Uint(fromUint) + return intoToken +} + +func TaintStepTest_JsontextDecoderReadToken(sourceCQL interface{}) interface{} { + fromDecoder := sourceCQL.(jsontext.Decoder) + intoToken, _ := fromDecoder.ReadToken() + return intoToken +} + +func TaintStepTest_JsontextDecoderReadValue(sourceCQL interface{}) interface{} { + fromDecoder := sourceCQL.(jsontext.Decoder) + intoValue, _ := fromDecoder.ReadValue() + return intoValue +} + +func TaintStepTest_JsontextDecoderReset(sourceCQL interface{}) interface{} { + fromReader := sourceCQL.(io.Reader) + var intoDecoder jsontext.Decoder + intoDecoder.Reset(fromReader) + return intoDecoder +} + +func TaintStepTest_JsontextDecoderUnreadBuffer(sourceCQL interface{}) interface{} { + fromDecoder := sourceCQL.(jsontext.Decoder) + intoByte := fromDecoder.UnreadBuffer() + return intoByte +} + +func TaintStepTest_JsontextEncoderReset(sourceCQL interface{}) interface{} { + fromEncoder := sourceCQL.(jsontext.Encoder) + var intoWriter io.Writer + fromEncoder.Reset(intoWriter) + return intoWriter +} + +func TaintStepTest_JsontextEncoderWriteToken(sourceCQL interface{}) interface{} { + fromToken := sourceCQL.(jsontext.Token) + var intoEncoder jsontext.Encoder + intoEncoder.WriteToken(fromToken) + return intoEncoder +} + +func TaintStepTest_JsontextEncoderWriteValue(sourceCQL interface{}) interface{} { + fromValue := sourceCQL.(jsontext.Value) + var intoEncoder jsontext.Encoder + intoEncoder.WriteValue(fromValue) + return intoEncoder +} + +func TaintStepTest_JsontextPointerAppendToken_Receiver(sourceCQL interface{}) interface{} { + fromPointer := sourceCQL.(jsontext.Pointer) + intoPointer := fromPointer.AppendToken("") + return intoPointer +} + +func TaintStepTest_JsontextPointerAppendToken_I0(sourceCQL interface{}) interface{} { + fromString := sourceCQL.(string) + var pointer jsontext.Pointer + intoPointer := pointer.AppendToken(fromString) + return intoPointer +} + +func TaintStepTest_JsontextPointerLastToken(sourceCQL interface{}) interface{} { + fromPointer := sourceCQL.(jsontext.Pointer) + intoString := fromPointer.LastToken() + return intoString +} + +func TaintStepTest_JsontextPointerParent(sourceCQL interface{}) interface{} { + fromPointer := sourceCQL.(jsontext.Pointer) + intoPointer := fromPointer.Parent() + return intoPointer +} + +func TaintStepTest_JsontextTokenClone(sourceCQL interface{}) interface{} { + fromToken := sourceCQL.(jsontext.Token) + intoToken := fromToken.Clone() + return intoToken +} + +func TaintStepTest_JsontextTokenFloat(sourceCQL interface{}) interface{} { + fromToken := sourceCQL.(jsontext.Token) + intoFloat, _ := fromToken.Float() + return intoFloat +} + +func TaintStepTest_JsontextTokenFloat32(sourceCQL interface{}) interface{} { + fromToken := sourceCQL.(jsontext.Token) + intoFloat, _ := fromToken.Float32() + return intoFloat +} + +func TaintStepTest_JsontextTokenInt(sourceCQL interface{}) interface{} { + fromToken := sourceCQL.(jsontext.Token) + intoInt, _ := fromToken.Int() + return intoInt +} + +func TaintStepTest_JsontextTokenString(sourceCQL interface{}) interface{} { + fromToken := sourceCQL.(jsontext.Token) + intoString := fromToken.String() + return intoString +} + +func TaintStepTest_JsontextTokenUint(sourceCQL interface{}) interface{} { + fromToken := sourceCQL.(jsontext.Token) + intoUint, _ := fromToken.Uint() + return intoUint +} + +func TaintStepTest_JsontextValueClone(sourceCQL interface{}) interface{} { + fromValue := sourceCQL.(jsontext.Value) + intoValue := fromValue.Clone() + return intoValue +} + +func TaintStepTest_JsontextValueMarshalJSON(sourceCQL interface{}) interface{} { + fromValue := sourceCQL.(jsontext.Value) + intoByte, _ := fromValue.MarshalJSON() + return intoByte +} + +func TaintStepTest_JsontextValueString(sourceCQL interface{}) interface{} { + fromValue := sourceCQL.(jsontext.Value) + intoString := fromValue.String() + return intoString +} + +func TaintStepTest_JsontextValueUnmarshalJSON(sourceCQL interface{}) interface{} { + fromByte := sourceCQL.([]byte) + var intoValue jsontext.Value + intoValue.UnmarshalJSON(fromByte) + return intoValue +} + +func RunAllTaints_EncodingJsonJsontext() { + { + source := newSource(0) + out := TaintStepTest_JsontextAppendFloat_I0(source) + sink(0, out) + } + { + source := newSource(1) + out := TaintStepTest_JsontextAppendFloat_I1(source) + sink(1, out) + } + { + source := newSource(2) + out := TaintStepTest_JsontextAppendFormat_I0(source) + sink(2, out) + } + { + source := newSource(3) + out := TaintStepTest_JsontextAppendFormat_I1(source) + sink(3, out) + } + { + source := newSource(4) + out := TaintStepTest_JsontextAppendQuote_I0(source) + sink(4, out) + } + { + source := newSource(5) + out := TaintStepTest_JsontextAppendQuote_I1(source) + sink(5, out) + } + { + source := newSource(6) + out := TaintStepTest_JsontextAppendUnquote_I0(source) + sink(6, out) + } + { + source := newSource(7) + out := TaintStepTest_JsontextAppendUnquote_I1(source) + sink(7, out) + } + { + source := newSource(8) + out := TaintStepTest_JsontextNewDecoder(source) + sink(8, out) + } + { + source := newSource(9) + out := TaintStepTest_JsontextNewEncoder(source) + sink(9, out) + } + { + source := newSource(10) + out := TaintStepTest_JsontextFloat(source) + sink(10, out) + } + { + source := newSource(11) + out := TaintStepTest_JsontextFloat32(source) + sink(11, out) + } + { + source := newSource(12) + out := TaintStepTest_JsontextInt(source) + sink(12, out) + } + { + source := newSource(13) + out := TaintStepTest_JsontextString(source) + sink(13, out) + } + { + source := newSource(14) + out := TaintStepTest_JsontextUint(source) + sink(14, out) + } + { + source := newSource(15) + out := TaintStepTest_JsontextDecoderReadToken(source) + sink(15, out) + } + { + source := newSource(16) + out := TaintStepTest_JsontextDecoderReadValue(source) + sink(16, out) + } + { + source := newSource(17) + out := TaintStepTest_JsontextDecoderReset(source) + sink(17, out) + } + { + source := newSource(18) + out := TaintStepTest_JsontextDecoderUnreadBuffer(source) + sink(18, out) + } + { + source := newSource(19) + out := TaintStepTest_JsontextEncoderReset(source) + sink(19, out) + } + { + source := newSource(20) + out := TaintStepTest_JsontextEncoderWriteToken(source) + sink(20, out) + } + { + source := newSource(21) + out := TaintStepTest_JsontextEncoderWriteValue(source) + sink(21, out) + } + { + source := newSource(22) + out := TaintStepTest_JsontextPointerAppendToken_Receiver(source) + sink(22, out) + } + { + source := newSource(23) + out := TaintStepTest_JsontextPointerAppendToken_I0(source) + sink(23, out) + } + { + source := newSource(24) + out := TaintStepTest_JsontextPointerLastToken(source) + sink(24, out) + } + { + source := newSource(25) + out := TaintStepTest_JsontextPointerParent(source) + sink(25, out) + } + { + source := newSource(26) + out := TaintStepTest_JsontextTokenClone(source) + sink(26, out) + } + { + source := newSource(27) + out := TaintStepTest_JsontextTokenFloat(source) + sink(27, out) + } + { + source := newSource(28) + out := TaintStepTest_JsontextTokenFloat32(source) + sink(28, out) + } + { + source := newSource(29) + out := TaintStepTest_JsontextTokenInt(source) + sink(29, out) + } + { + source := newSource(30) + out := TaintStepTest_JsontextTokenString(source) + sink(30, out) + } + { + source := newSource(31) + out := TaintStepTest_JsontextTokenUint(source) + sink(31, out) + } + { + source := newSource(32) + out := TaintStepTest_JsontextValueClone(source) + sink(32, out) + } + { + source := newSource(33) + out := TaintStepTest_JsontextValueMarshalJSON(source) + sink(33, out) + } + { + source := newSource(34) + out := TaintStepTest_JsontextValueString(source) + sink(34, out) + } + { + source := newSource(35) + out := TaintStepTest_JsontextValueUnmarshalJSON(source) + sink(35, out) + } +} diff --git a/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/Strings.go b/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/Strings.go index a6510f7d01d9..ac152a84c3b5 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/Strings.go +++ b/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/Strings.go @@ -69,13 +69,13 @@ func TaintStepTest_StringsSplitSeq(sourceCQL interface{}) interface{} { func TaintStepTest_StringsFields_B0I0O0(sourceCQL interface{}) interface{} { fromString656 := sourceCQL.(string) intoString414 := strings.Fields(fromString656) - return intoString414 + return intoString414[0] } func TaintStepTest_StringsFieldsFunc_B0I0O0(sourceCQL interface{}) interface{} { fromString518 := sourceCQL.(string) intoString650 := strings.FieldsFunc(fromString518, nil) - return intoString650 + return intoString650[0] } func TaintStepTest_StringsJoin_B0I0O0(sourceCQL interface{}) interface{} { From 495b637043526b0159f72c995e52603a66f6c442 Mon Sep 17 00:00:00 2001 From: yoff Date: Tue, 8 Sep 2026 18:17:48 +0200 Subject: [PATCH 0837/2098] python: A wildcard case (`case _:`) should not be considered default as the CFG library will then order it last. Instead it is a `matchAll` --- .../semmle/python/controlflow/internal/AstNodeImpl.qll | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/python/ql/lib/semmle/python/controlflow/internal/AstNodeImpl.qll b/python/ql/lib/semmle/python/controlflow/internal/AstNodeImpl.qll index 8a6c7cf81c52..1747b6cdd1a0 100644 --- a/python/ql/lib/semmle/python/controlflow/internal/AstNodeImpl.qll +++ b/python/ql/lib/semmle/python/controlflow/internal/AstNodeImpl.qll @@ -993,9 +993,8 @@ module Ast implements AstSig { } } - /** A wildcard case (`case _:`). */ class DefaultCase extends Case { - DefaultCase() { this.isWildcard() } + DefaultCase() { none() } } /** A conditional expression (`x if cond else y`). */ @@ -1754,6 +1753,11 @@ private module Input implements InputSig1, InputSig2 { n2.isAdditional(assertStmt, assertThrowTag()) ) } + + predicate matchAll(Ast::Case c) { + // A wildcard case (`case _:`) will match all values. + c.isWildcard() + } } import Public From 2b19c84151f0964d7ed8b48766f1c96e88adea96 Mon Sep 17 00:00:00 2001 From: dtorresfgf Date: Fri, 11 Sep 2026 06:20:54 +1000 Subject: [PATCH 0838/2098] JS: recognize Fastify servers reached through chainable server methods `Fastify::server()` tracks the server from the `fastify()` invocation, but did not step through methods that configure the instance and return it, such as `withTypeProvider()` and the `set*` family. On a server built as `fastify().withTypeProvider()` the instance was therefore not recognized as a server at all, so neither the plugins registered on it nor the routes declared on it were attributed to it. The effect ran in both directions. Routes on such an instance could be missed entirely, and where they were still reported through another model, a globally registered plugin such as `@fastify/rate-limit` was not seen as guarding them, which produced false positives in `js/missing-rate-limiting`. Route-registering methods (`register`, `addHook`, and the shorthand route methods) also return the server, but they are deliberately left out: they already have a meaning in the routing model, so including them would change the shape of the routing tree rather than only how a server reference is resolved. The step is added inside the type-tracked predicate rather than to the public one, so a chained instance is still resolved when it crosses a function boundary, for example when it is returned from a factory function. A test covers that case, and it fails if the step is placed in the public predicate instead. Co-Authored-By: Claude Opus 5 --- ...-09-11-fastify-chainable-config-methods.md | 4 ++ .../semmle/javascript/frameworks/Fastify.qll | 24 +++++++++++ .../frameworks/fastify/src/fastify.js | 10 +++++ .../frameworks/fastify/tests.expected | 7 ++++ .../MissingRateLimiting.expected | 2 + .../Security/CWE-770/MissingRateLimit/tst.js | 42 +++++++++++++++++++ 6 files changed, 89 insertions(+) create mode 100644 javascript/ql/lib/change-notes/2026-09-11-fastify-chainable-config-methods.md diff --git a/javascript/ql/lib/change-notes/2026-09-11-fastify-chainable-config-methods.md b/javascript/ql/lib/change-notes/2026-09-11-fastify-chainable-config-methods.md new file mode 100644 index 000000000000..986788d62111 --- /dev/null +++ b/javascript/ql/lib/change-notes/2026-09-11-fastify-chainable-config-methods.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Fastify servers reached through a chainable configuration method, such as `fastify().withTypeProvider()` or `fastify().setValidatorCompiler(...)`, are now recognized as the same server instance. Routes registered on such an instance are now attributed to their server, which may add results for queries such as `js/missing-rate-limiting` where routes were previously not recognized at all, and remove false positives where a globally registered plugin guards them. diff --git a/javascript/ql/lib/semmle/javascript/frameworks/Fastify.qll b/javascript/ql/lib/semmle/javascript/frameworks/Fastify.qll index 26dde3fc78bd..a681bed23087 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/Fastify.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/Fastify.qll @@ -21,6 +21,25 @@ module Fastify { StandardServerDefinition() { this = DataFlow::moduleImport("fastify").getAnInvocation() } } + /** + * Gets the name of a chainable Fastify server method, that is, a configuration or + * lifecycle method that returns the same server instance it was called on, so that a + * call to it still refers to that server. + * + * Route-registering methods such as `register`, `addHook`, and the shorthand route + * methods return the server as well, but they are deliberately excluded here because + * they already have a meaning in the routing model for Fastify. + */ + private string chainableServerMethodName() { + result = + [ + "withTypeProvider", "addSchema", "addHttpMethod", "decorate", "decorateRequest", + "decorateReply", "setValidatorCompiler", "setSerializerCompiler", "setSchemaController", + "setReplySerializer", "setSchemaErrorFormatter", "setErrorHandler", "setNotFoundHandler", + "setGenReqId", "setChildLoggerFactory", "after", "ready" + ] + } + /** Gets a data flow node referring to a fastify server. */ private DataFlow::SourceNode server(DataFlow::SourceNode creation, DataFlow::TypeTracker t) { t.start() and @@ -31,6 +50,11 @@ module Fastify { t.start() and result = pluginCallback(creation).(DataFlow::FunctionNode).getParameter(0) or + // server.withTypeProvider(), server.setValidatorCompiler(...), and friends return + // the server itself, so the result of such a call still refers to it. + t.start() and + result = server(creation).getAMethodCall(chainableServerMethodName()) + or exists(DataFlow::TypeTracker t2 | result = server(creation, t2).track(t2, t)) } diff --git a/javascript/ql/test/library-tests/frameworks/fastify/src/fastify.js b/javascript/ql/test/library-tests/frameworks/fastify/src/fastify.js index 8c5264b50e8f..c65b739d726c 100644 --- a/javascript/ql/test/library-tests/frameworks/fastify/src/fastify.js +++ b/javascript/ql/test/library-tests/frameworks/fastify/src/fastify.js @@ -90,3 +90,13 @@ fastifyWithObjects4.post( request.params; } ); + +// the server is reached through a chainable configuration method, which returns the +// same instance +var fastifyChained = require("fastify")().withTypeProvider(); +fastifyChained.get( + "/", + /* handler */ (request, reply) => { + reply.send({ hello: "world" }); // response + } +); diff --git a/javascript/ql/test/library-tests/frameworks/fastify/tests.expected b/javascript/ql/test/library-tests/frameworks/fastify/tests.expected index a0f2fd1db671..e2b3b303a6ea 100644 --- a/javascript/ql/test/library-tests/frameworks/fastify/tests.expected +++ b/javascript/ql/test/library-tests/frameworks/fastify/tests.expected @@ -7,6 +7,7 @@ test_RouteSetup | src/fastify.js:63:1:70:1 | fastify ... ;\\n }\\n) | | src/fastify.js:74:1:81:1 | fastify ... ;\\n }\\n) | | src/fastify.js:85:1:92:1 | fastify ... ;\\n }\\n) | +| src/fastify.js:97:1:102:1 | fastify ... e\\n }\\n) | test_HeaderAccess | src/fastify.js:39:5:39:24 | request.headers.name | name | test_RouteHandler @@ -25,6 +26,7 @@ test_RouteHandler | src/fastify.js:65:17:69:3 | functio ... ms;\\n } | src/fastify.js:61:27:61:46 | require("fastify")() | | src/fastify.js:76:17:80:3 | functio ... ms;\\n } | src/fastify.js:72:27:72:46 | require("fastify")() | | src/fastify.js:87:17:91:3 | functio ... ms;\\n } | src/fastify.js:83:27:83:46 | require("fastify")() | +| src/fastify.js:99:17:101:3 | (reques ... nse\\n } | src/fastify.js:96:22:96:41 | require("fastify")() | test_HeaderDefinition | src/fastify.js:42:5:42:33 | reply.h ... value") | src/fastify.js:34:17:46:3 | functio ... eam\\n } | | src/fastify.js:43:5:43:36 | reply.h ... lue" }) | src/fastify.js:34:17:46:3 | functio ... eam\\n } | @@ -34,6 +36,7 @@ test_ServerDefinition | src/fastify.js:61:27:61:46 | require("fastify")() | | src/fastify.js:72:27:72:46 | require("fastify")() | | src/fastify.js:83:27:83:46 | require("fastify")() | +| src/fastify.js:96:22:96:41 | require("fastify")() | test_RedirectInvocation | src/fastify.js:44:5:44:29 | reply.r ... e, url) | src/fastify.js:34:17:46:3 | functio ... eam\\n } | test_RequestInputAccess @@ -57,6 +60,7 @@ test_ResponseSendArgument | src/fastify.js:6:12:6:29 | { hello: "world" } | src/fastify.js:5:17:7:3 | async ( ... nse\\n } | | src/fastify.js:27:16:27:33 | { hello: "world" } | src/fastify.js:26:17:28:3 | (reques ... nse\\n } | | src/fastify.js:45:16:45:22 | payload | src/fastify.js:34:17:46:3 | functio ... eam\\n } | +| src/fastify.js:100:16:100:33 | { hello: "world" } | src/fastify.js:99:17:101:3 | (reques ... nse\\n } | test_RouteSetup_getServer | src/fastify.js:3:1:8:1 | fastify ... e\\n }\\n) | src/fastify.js:1:15:1:34 | require("fastify")() | | src/fastify.js:10:1:21:2 | fastify ... > {}\\n}) | src/fastify.js:1:15:1:34 | require("fastify")() | @@ -66,6 +70,7 @@ test_RouteSetup_getServer | src/fastify.js:63:1:70:1 | fastify ... ;\\n }\\n) | src/fastify.js:61:27:61:46 | require("fastify")() | | src/fastify.js:74:1:81:1 | fastify ... ;\\n }\\n) | src/fastify.js:72:27:72:46 | require("fastify")() | | src/fastify.js:85:1:92:1 | fastify ... ;\\n }\\n) | src/fastify.js:83:27:83:46 | require("fastify")() | +| src/fastify.js:97:1:102:1 | fastify ... e\\n }\\n) | src/fastify.js:96:22:96:41 | require("fastify")() | test_HeaderDefinition_defines | src/fastify.js:42:5:42:33 | reply.h ... value") | name | value | | src/fastify.js:43:5:43:36 | reply.h ... lue" }) | name | value | @@ -85,6 +90,7 @@ test_RouteSetup_getARouteHandler | src/fastify.js:63:1:70:1 | fastify ... ;\\n }\\n) | src/fastify.js:65:17:69:3 | functio ... ms;\\n } | | src/fastify.js:74:1:81:1 | fastify ... ;\\n }\\n) | src/fastify.js:76:17:80:3 | functio ... ms;\\n } | | src/fastify.js:85:1:92:1 | fastify ... ;\\n }\\n) | src/fastify.js:87:17:91:3 | functio ... ms;\\n } | +| src/fastify.js:97:1:102:1 | fastify ... e\\n }\\n) | src/fastify.js:99:17:101:3 | (reques ... nse\\n } | test_RouteHandler_getARequestExpr | src/fastify.js:5:17:7:3 | async ( ... nse\\n } | src/fastify.js:5:24:5:30 | request | | src/fastify.js:13:28:13:55 | (reques ... ) => {} | src/fastify.js:13:29:13:35 | request | @@ -122,6 +128,7 @@ test_RouteHandler_getARequestExpr | src/fastify.js:87:17:91:3 | functio ... ms;\\n } | src/fastify.js:88:5:88:11 | request | | src/fastify.js:87:17:91:3 | functio ... ms;\\n } | src/fastify.js:89:5:89:11 | request | | src/fastify.js:87:17:91:3 | functio ... ms;\\n } | src/fastify.js:90:5:90:11 | request | +| src/fastify.js:99:17:101:3 | (reques ... nse\\n } | src/fastify.js:99:18:99:24 | request | test_HeaderDefinition_getAHeaderName | src/fastify.js:42:5:42:33 | reply.h ... value") | name | | src/fastify.js:43:5:43:36 | reply.h ... lue" }) | name | diff --git a/javascript/ql/test/query-tests/Security/CWE-770/MissingRateLimit/MissingRateLimiting.expected b/javascript/ql/test/query-tests/Security/CWE-770/MissingRateLimit/MissingRateLimiting.expected index 5e2265f64b49..b1351269aeb6 100644 --- a/javascript/ql/test/query-tests/Security/CWE-770/MissingRateLimit/MissingRateLimiting.expected +++ b/javascript/ql/test/query-tests/Security/CWE-770/MissingRateLimit/MissingRateLimiting.expected @@ -11,3 +11,5 @@ | tst.js:88:24:88:40 | expensiveHandler1 | This route handler performs $@, but is not rate-limited. | tst.js:14:40:14:46 | login() | authorization | | tst.js:111:28:111:44 | expensiveHandler1 | This route handler performs $@, but is not rate-limited. | tst.js:14:40:14:46 | login() | authorization | | tst.js:116:39:116:55 | expensiveHandler1 | This route handler performs $@, but is not rate-limited. | tst.js:14:40:14:46 | login() | authorization | +| tst.js:130:35:130:51 | expensiveHandler1 | This route handler performs $@, but is not rate-limited. | tst.js:14:40:14:46 | login() | authorization | +| tst.js:160:35:160:51 | expensiveHandler1 | This route handler performs $@, but is not rate-limited. | tst.js:14:40:14:46 | login() | authorization | diff --git a/javascript/ql/test/query-tests/Security/CWE-770/MissingRateLimit/tst.js b/javascript/ql/test/query-tests/Security/CWE-770/MissingRateLimit/tst.js index 7ff0c067fb51..3efe7908f56e 100644 --- a/javascript/ql/test/query-tests/Security/CWE-770/MissingRateLimit/tst.js +++ b/javascript/ql/test/query-tests/Security/CWE-770/MissingRateLimit/tst.js @@ -116,3 +116,45 @@ const fastifyApp3 = require('fastify')(); fastifyApp3.get('/before-rate-limit', expensiveHandler1); // $ Alert fastifyApp3.register(require('@fastify/rate-limit')); fastifyApp3.get('/after-rate-limit', expensiveHandler1); + +// the server instance is reached through a chainable configuration method, which +// returns the same instance +const fastifyApp4 = require('fastify')().withTypeProvider(); + +fastifyApp4.register(require('@fastify/rate-limit')); +fastifyApp4.get('/after-rate-limit', expensiveHandler1); + +// same, but with no rate limiter registered at all, so the route is genuinely unguarded +const fastifyApp5 = require('fastify')().withTypeProvider(); + +fastifyApp5.get('/no-rate-limit', expensiveHandler1); // $ Alert + +// several configuration methods chained together +const fastifyApp6 = require('fastify')() + .withTypeProvider() + .setValidatorCompiler(compiler) + .decorate('answer', 42); + +fastifyApp6.register(require('@fastify/rate-limit')); +fastifyApp6.get('/after-rate-limit', expensiveHandler1); + +// the chained instance is returned from a factory function, so reaching it requires +// tracking the value across the call rather than only through local references +function makeFastifyApp() { + return require('fastify')().withTypeProvider(); +} + +const fastifyApp7 = makeFastifyApp(); + +fastifyApp7.register(require('@fastify/rate-limit')); +fastifyApp7.get('/after-rate-limit', expensiveHandler1); + +// same, from a separate factory so that the server above does not share its creation +// site, and no rate limiter is registered on it +function makeUnguardedFastifyApp() { + return require('fastify')().withTypeProvider(); +} + +const fastifyApp8 = makeUnguardedFastifyApp(); + +fastifyApp8.get('/no-rate-limit', expensiveHandler1); // $ Alert From f5fa010351acb537341dd6dde30265509126fbf6 Mon Sep 17 00:00:00 2001 From: dtorresfgf Date: Fri, 11 Sep 2026 06:39:58 +1000 Subject: [PATCH 0839/2098] Add addContentTypeParser, drop after and ready, and date the change note in UTC `addContentTypeParser` returns the server, so it belongs in the list. Its type declaration says `void`, which is why it was missed: it is declared as a property of an interface type rather than as a method, so it did not look like the `set*` family. Checking the rest of the instance against the runtime rather than against the declarations then showed that `ready` never returns the server, in either of its call forms, despite the declaration saying it does, and that `after` returns it only when given a callback. Both are now excluded, which also makes the predicate exactly what its name says. `onClose` returns the server too, but it registers a hook, so it is excluded for the same reason as `addHook`. Co-Authored-By: Claude Opus 5 --- ...09-10-fastify-chainable-config-methods.md} | 0 .../semmle/javascript/frameworks/Fastify.qll | 26 ++++++++++--------- .../MissingRateLimiting.expected | 2 +- .../Security/CWE-770/MissingRateLimit/tst.js | 1 + 4 files changed, 16 insertions(+), 13 deletions(-) rename javascript/ql/lib/change-notes/{2026-09-11-fastify-chainable-config-methods.md => 2026-09-10-fastify-chainable-config-methods.md} (100%) diff --git a/javascript/ql/lib/change-notes/2026-09-11-fastify-chainable-config-methods.md b/javascript/ql/lib/change-notes/2026-09-10-fastify-chainable-config-methods.md similarity index 100% rename from javascript/ql/lib/change-notes/2026-09-11-fastify-chainable-config-methods.md rename to javascript/ql/lib/change-notes/2026-09-10-fastify-chainable-config-methods.md diff --git a/javascript/ql/lib/semmle/javascript/frameworks/Fastify.qll b/javascript/ql/lib/semmle/javascript/frameworks/Fastify.qll index a681bed23087..63b6072d8ffa 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/Fastify.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/Fastify.qll @@ -22,21 +22,23 @@ module Fastify { } /** - * Gets the name of a chainable Fastify server method, that is, a configuration or - * lifecycle method that returns the same server instance it was called on, so that a - * call to it still refers to that server. + * Gets the name of a chainable Fastify configuration method, that is, a method that + * configures the server instance and returns that same instance, so that a call to it + * still refers to the server. * - * Route-registering methods such as `register`, `addHook`, and the shorthand route - * methods return the server as well, but they are deliberately excluded here because - * they already have a meaning in the routing model for Fastify. + * Plugin, hook and route registration (`register`, `addHook`, `onClose`, and the + * shorthand route methods) returns the server as well, but is deliberately excluded + * here, because it already has a meaning in the routing model for Fastify. The + * lifecycle methods `after` and `ready` are excluded too: `after` returns the server + * only when it is given a callback, and `ready` never does. */ - private string chainableServerMethodName() { + private string chainableConfigMethodName() { result = [ - "withTypeProvider", "addSchema", "addHttpMethod", "decorate", "decorateRequest", - "decorateReply", "setValidatorCompiler", "setSerializerCompiler", "setSchemaController", - "setReplySerializer", "setSchemaErrorFormatter", "setErrorHandler", "setNotFoundHandler", - "setGenReqId", "setChildLoggerFactory", "after", "ready" + "withTypeProvider", "addSchema", "addHttpMethod", "addContentTypeParser", "decorate", + "decorateRequest", "decorateReply", "setValidatorCompiler", "setSerializerCompiler", + "setSchemaController", "setReplySerializer", "setSchemaErrorFormatter", "setErrorHandler", + "setNotFoundHandler", "setGenReqId", "setChildLoggerFactory" ] } @@ -53,7 +55,7 @@ module Fastify { // server.withTypeProvider(), server.setValidatorCompiler(...), and friends return // the server itself, so the result of such a call still refers to it. t.start() and - result = server(creation).getAMethodCall(chainableServerMethodName()) + result = server(creation).getAMethodCall(chainableConfigMethodName()) or exists(DataFlow::TypeTracker t2 | result = server(creation, t2).track(t2, t)) } diff --git a/javascript/ql/test/query-tests/Security/CWE-770/MissingRateLimit/MissingRateLimiting.expected b/javascript/ql/test/query-tests/Security/CWE-770/MissingRateLimit/MissingRateLimiting.expected index b1351269aeb6..e8e1be279447 100644 --- a/javascript/ql/test/query-tests/Security/CWE-770/MissingRateLimit/MissingRateLimiting.expected +++ b/javascript/ql/test/query-tests/Security/CWE-770/MissingRateLimit/MissingRateLimiting.expected @@ -12,4 +12,4 @@ | tst.js:111:28:111:44 | expensiveHandler1 | This route handler performs $@, but is not rate-limited. | tst.js:14:40:14:46 | login() | authorization | | tst.js:116:39:116:55 | expensiveHandler1 | This route handler performs $@, but is not rate-limited. | tst.js:14:40:14:46 | login() | authorization | | tst.js:130:35:130:51 | expensiveHandler1 | This route handler performs $@, but is not rate-limited. | tst.js:14:40:14:46 | login() | authorization | -| tst.js:160:35:160:51 | expensiveHandler1 | This route handler performs $@, but is not rate-limited. | tst.js:14:40:14:46 | login() | authorization | +| tst.js:161:35:161:51 | expensiveHandler1 | This route handler performs $@, but is not rate-limited. | tst.js:14:40:14:46 | login() | authorization | diff --git a/javascript/ql/test/query-tests/Security/CWE-770/MissingRateLimit/tst.js b/javascript/ql/test/query-tests/Security/CWE-770/MissingRateLimit/tst.js index 3efe7908f56e..7c5f1708ff6c 100644 --- a/javascript/ql/test/query-tests/Security/CWE-770/MissingRateLimit/tst.js +++ b/javascript/ql/test/query-tests/Security/CWE-770/MissingRateLimit/tst.js @@ -133,6 +133,7 @@ fastifyApp5.get('/no-rate-limit', expensiveHandler1); // $ Alert const fastifyApp6 = require('fastify')() .withTypeProvider() .setValidatorCompiler(compiler) + .addContentTypeParser('application/json', parser) .decorate('answer', 42); fastifyApp6.register(require('@fastify/rate-limit')); From e009997d0c2b59d1469962ce6a5d76893498e9e8 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 10 Sep 2026 22:41:28 +0100 Subject: [PATCH 0840/2098] Update expected test output for changed model --- .../Security/CWE-079/ReflectedXss.expected | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/go/ql/test/query-tests/Security/CWE-079/ReflectedXss.expected b/go/ql/test/query-tests/Security/CWE-079/ReflectedXss.expected index 3e593f0c2029..cee1acc74d80 100644 --- a/go/ql/test/query-tests/Security/CWE-079/ReflectedXss.expected +++ b/go/ql/test/query-tests/Security/CWE-079/ReflectedXss.expected @@ -58,9 +58,11 @@ edges | reflectedxsstest.go:51:14:51:18 | selection of URL | reflectedxsstest.go:51:14:51:26 | call to Query | provenance | Src:MaD:10 MaD:17 | | reflectedxsstest.go:51:14:51:26 | call to Query | reflectedxsstest.go:54:11:54:21 | type conversion | provenance | | | tst.go:14:15:14:20 | selection of Form | tst.go:14:15:14:36 | call to Get | provenance | Src:MaD:6 MaD:18 | -| tst.go:14:15:14:36 | call to Get | tst.go:18:32:18:32 | a | provenance | | +| tst.go:14:15:14:36 | call to Get | tst.go:17:18:17:25 | username | provenance | | +| tst.go:17:9:17:57 | slice literal [array] | tst.go:18:32:18:32 | a [array] | provenance | | +| tst.go:17:18:17:25 | username | tst.go:17:9:17:57 | slice literal [array] | provenance | | | tst.go:18:19:18:38 | call to Join | tst.go:18:12:18:39 | type conversion | provenance | | -| tst.go:18:32:18:32 | a | tst.go:18:19:18:38 | call to Join | provenance | MaD:19 | +| tst.go:18:32:18:32 | a [array] | tst.go:18:19:18:38 | call to Join | provenance | MaD:19 | | tst.go:48:14:48:19 | selection of Form | tst.go:48:14:48:34 | call to Get | provenance | Src:MaD:6 MaD:18 | | tst.go:48:14:48:34 | call to Get | tst.go:53:12:53:26 | type conversion | provenance | | | websocketXss.go:31:11:31:14 | xnet [postupdate] | websocketXss.go:32:24:32:27 | xnet | provenance | Src:MaD:5 | @@ -88,7 +90,7 @@ models | 16 | Summary: mime/multipart; Reader; true; NextPart; ; ; Argument[receiver]; ReturnValue[0]; taint; manual | | 17 | Summary: net/url; URL; true; Query; ; ; Argument[receiver]; ReturnValue; taint; manual | | 18 | Summary: net/url; Values; true; Get; ; ; Argument[receiver]; ReturnValue; taint; manual | -| 19 | Summary: strings; ; false; Join; ; ; Argument[0..1]; ReturnValue; taint; manual | +| 19 | Summary: strings; ; false; Join; ; ; Argument[0].ArrayElement; ReturnValue; taint; manual | nodes | ReflectedXss.go:11:15:11:20 | selection of Form | semmle.label | selection of Form | | ReflectedXss.go:11:15:11:36 | call to Get | semmle.label | call to Get | @@ -137,9 +139,11 @@ nodes | reflectedxsstest.go:54:11:54:21 | type conversion | semmle.label | type conversion | | tst.go:14:15:14:20 | selection of Form | semmle.label | selection of Form | | tst.go:14:15:14:36 | call to Get | semmle.label | call to Get | +| tst.go:17:9:17:57 | slice literal [array] | semmle.label | slice literal [array] | +| tst.go:17:18:17:25 | username | semmle.label | username | | tst.go:18:12:18:39 | type conversion | semmle.label | type conversion | | tst.go:18:19:18:38 | call to Join | semmle.label | call to Join | -| tst.go:18:32:18:32 | a | semmle.label | a | +| tst.go:18:32:18:32 | a [array] | semmle.label | a [array] | | tst.go:48:14:48:19 | selection of Form | semmle.label | selection of Form | | tst.go:48:14:48:34 | call to Get | semmle.label | call to Get | | tst.go:53:12:53:26 | type conversion | semmle.label | type conversion | From ec18d5c7d0b3609c2098dc784fde8edc7bb859b4 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 11 Sep 2026 00:19:30 +0100 Subject: [PATCH 0841/2098] Change "clone" models from value to taint --- go/ql/lib/ext/net.url.model.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/go/ql/lib/ext/net.url.model.yml b/go/ql/lib/ext/net.url.model.yml index 4b6d15a6d53f..ca4cf2c170f2 100644 --- a/go/ql/lib/ext/net.url.model.yml +++ b/go/ql/lib/ext/net.url.model.yml @@ -12,7 +12,7 @@ extensions: - ["net/url", "", False, "QueryUnescape", "", "", "Argument[0]", "ReturnValue[0]", "taint", "manual"] - ["net/url", "", False, "User", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["net/url", "", False, "UserPassword", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"] - - ["net/url", "URL", True, "Clone", "", "", "Argument[receiver]", "ReturnValue", "value", "manual"] + - ["net/url", "URL", True, "Clone", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] - ["net/url", "URL", True, "EscapedPath", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] - ["net/url", "URL", True, "Hostname", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] - ["net/url", "URL", True, "MarshalBinary", "", "", "Argument[receiver]", "ReturnValue[0]", "taint", "manual"] @@ -25,6 +25,6 @@ extensions: - ["net/url", "URL", True, "ResolveReference", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["net/url", "Userinfo", True, "Password", "", "", "Argument[receiver]", "ReturnValue[0]", "taint", "manual"] - ["net/url", "Userinfo", True, "Username", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] - - ["net/url", "Values", True, "Clone", "", "", "Argument[receiver]", "ReturnValue", "value", "manual"] + - ["net/url", "Values", True, "Clone", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] - ["net/url", "Values", True, "Encode", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] - ["net/url", "Values", True, "Get", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"] From 53a785121a6c7766a44cd78de4a35a0db46ef311 Mon Sep 17 00:00:00 2001 From: Jeff Martin Date: Thu, 10 Sep 2026 18:15:54 -0700 Subject: [PATCH 0842/2098] Actions: address lockfile review feedback --- actions/ql/lib/codeql/actions/Lock.qll | 1 + .../actions-lock/{ => .github/workflows}/actions.lock | 0 actions/ql/test/library-tests/actions-lock/options | 2 +- actions/ql/test/library-tests/actions-lock/test.expected | 2 +- 4 files changed, 3 insertions(+), 2 deletions(-) rename actions/ql/test/library-tests/actions-lock/{ => .github/workflows}/actions.lock (100%) diff --git a/actions/ql/lib/codeql/actions/Lock.qll b/actions/ql/lib/codeql/actions/Lock.qll index 020b097300db..b1cc14530746 100644 --- a/actions/ql/lib/codeql/actions/Lock.qll +++ b/actions/ql/lib/codeql/actions/Lock.qll @@ -9,6 +9,7 @@ private import codeql.actions.ast.internal.Yaml class ActionsLock extends YamlDocument, YamlMapping { ActionsLock() { this.getFile().getRelativePath() = ".github/workflows/actions.lock" } + pragma[nomagic] private predicate pins0(string workflowPath, string pinnedNwo, string ref) { exists(YamlSequence workflowPins, YamlScalar pinNode, YamlMapping dependency, string pin | this.lookup("workflows").(YamlMapping).lookup(workflowPath) = workflowPins and diff --git a/actions/ql/test/library-tests/actions-lock/actions.lock b/actions/ql/test/library-tests/actions-lock/.github/workflows/actions.lock similarity index 100% rename from actions/ql/test/library-tests/actions-lock/actions.lock rename to actions/ql/test/library-tests/actions-lock/.github/workflows/actions.lock diff --git a/actions/ql/test/library-tests/actions-lock/options b/actions/ql/test/library-tests/actions-lock/options index fa6fe3a34854..af54d6532407 100644 --- a/actions/ql/test/library-tests/actions-lock/options +++ b/actions/ql/test/library-tests/actions-lock/options @@ -1 +1 @@ -semmle-extractor-options: actions.lock +semmle-extractor-options: --file-type YAML .github/workflows/actions.lock diff --git a/actions/ql/test/library-tests/actions-lock/test.expected b/actions/ql/test/library-tests/actions-lock/test.expected index 128df0e9ae0e..bd9b029ccd89 100644 --- a/actions/ql/test/library-tests/actions-lock/test.expected +++ b/actions/ql/test/library-tests/actions-lock/test.expected @@ -1 +1 @@ -| actions.lock:0:0:0:0 | actions.lock | +| .github/workflows/actions.lock:0:0:0:0 | .github/workflows/actions.lock | From 5267dda1227a01244e45a1b678bdba0781e57fd8 Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 8 Sep 2026 09:54:30 +0200 Subject: [PATCH 0843/2098] unified: Add AstNode.getEnclosingCallable --- .../lib/codeql/unified/internal/ControlFlowGraph.qll | 9 +-------- unified/ql/lib/codeql/unified/internal/FacadeAst.qll | 10 ++++++++++ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll index d545c589185f..2c60994c4cd5 100644 --- a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll @@ -39,14 +39,7 @@ private module Ast implements AstSig { not skipControlFlow(result) } - Callable getEnclosingCallable(AstNode node) { - exists(AstNode parent | parent = node.getParent() | - result = parent - or - not parent instanceof Callable and - result = getEnclosingCallable(parent) - ) - } + Callable getEnclosingCallable(AstNode node) { result = node.getEnclosingCallable() } class Callable = U::Callable; diff --git a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll index dcec57f0a4ae..db32fadc8a5d 100644 --- a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll +++ b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll @@ -31,6 +31,16 @@ module Unified { result = this.getParent().getEnclosingClass() } + /** Gets the nearest callable containing this AST node. */ + Callable getEnclosingCallable() { + exists(AstNode parent | parent = this.getParent() | + result = parent + or + not parent instanceof Callable and + result = parent.getEnclosingCallable() + ) + } + /** Gets the depth of this node in the AST. The root node has a depth of 0. */ int getDepth() { not exists(this.getParent()) and result = 0 From 896a8a599dbdf21f302e5bcec76f9de32f28dafd Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 8 Sep 2026 12:56:06 +0200 Subject: [PATCH 0844/2098] unified: Update getEnclosingClass to be strict, for consistency --- unified/ql/lib/codeql/unified/internal/FacadeAst.qll | 12 +++++++----- unified/ql/lib/utils/test/TestUtils.qll | 4 ++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll index db32fadc8a5d..1cc6d6106e93 100644 --- a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll +++ b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll @@ -23,12 +23,14 @@ module Unified { ) } - /** Gets the nearest enclosing class declaration, possibly this node itself. */ + /** Gets the nearest enclosing class declaration. */ ClassLikeDeclaration getEnclosingClass() { - result = this - or - not this instanceof ClassLikeDeclaration and - result = this.getParent().getEnclosingClass() + exists(AstNode parent | parent = this.getParent() | + result = parent + or + not parent instanceof ClassLikeDeclaration and + result = parent.getEnclosingClass() + ) } /** Gets the nearest callable containing this AST node. */ diff --git a/unified/ql/lib/utils/test/TestUtils.qll b/unified/ql/lib/utils/test/TestUtils.qll index 6a7fbae3d592..15155c44758a 100644 --- a/unified/ql/lib/utils/test/TestUtils.qll +++ b/unified/ql/lib/utils/test/TestUtils.qll @@ -3,10 +3,10 @@ private import CommentUtil private import codeql.unified.internal.StaticNameBinding private string deriveClassName(ClassLikeDeclaration cls) { - not exists(cls.getParent().getEnclosingClass()) and + not exists(cls.getEnclosingClass()) and result = cls.getName() or - result = deriveClassName(cls.getParent().getEnclosingClass()) + "." + cls.getName() + result = deriveClassName(cls.getEnclosingClass()) + "." + cls.getName() } private string defaultName(NameDeclaration decl) { From 87ba367fb9ae5263fa3c23e9322078aa25a6c35e Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 8 Sep 2026 09:59:07 +0200 Subject: [PATCH 0845/2098] unified: Add LocalVariable --- .../unified/internal/LocalNameBinding.qll | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index 6fe8ace83fcf..497b800b81a9 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -6,6 +6,7 @@ private import unified private import unified as U private import codeql.namebinding.LocalNameBinding private import codeql.unified.internal.NameBindingPlugin +private import codeql.unified.internal.StaticNameBinding private module LocalNameBindingInput implements LocalNameBindingInputSig { class AstNode = U::AstNode; @@ -325,6 +326,7 @@ private module LocalNameBindingInput implements LocalNameBindingInputSig Date: Thu, 10 Sep 2026 13:21:22 +0200 Subject: [PATCH 0846/2098] unified: Extract Swift function modifiers Capture declaration modifiers on Swift functions with and without bodies, and add corpus coverage for consuming, static, and class functions. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../extractor/src/languages/swift/swift.rs | 4 ++ .../control-flow/discard-statement.output | 1 + .../corpus/swift/types/class-function.output | 57 +++++++++++++++++++ .../corpus/swift/types/class-function.swift | 3 + .../corpus/swift/types/static-function.output | 57 +++++++++++++++++++ .../corpus/swift/types/static-function.swift | 3 + 6 files changed, 125 insertions(+) create mode 100644 unified/extractor/tests/corpus/swift/types/class-function.output create mode 100644 unified/extractor/tests/corpus/swift/types/class-function.swift create mode 100644 unified/extractor/tests/corpus/swift/types/static-function.output create mode 100644 unified/extractor/tests/corpus/swift/types/static-function.swift diff --git a/unified/extractor/src/languages/swift/swift.rs b/unified/extractor/src/languages/swift/swift.rs index 960900070ba0..21a8c5009bb3 100644 --- a/unified/extractor/src/languages/swift/swift.rs +++ b/unified/extractor/src/languages/swift/swift.rs @@ -558,6 +558,7 @@ fn translation_rules() -> Vec> { // an empty `block`. rule!( (functionDecl + modifiers: _* @mods name: @name genericParameterClause: (genericParameterClause parameters: _* @type_params)? signature: (functionSignature @@ -566,6 +567,7 @@ fn translation_rules() -> Vec> { body: (codeBlock statements: _* @body)) => (function_declaration + modifier: {mods} name_node: (identifier #{name}) type_parameter: {type_params} parameter: {params} @@ -574,6 +576,7 @@ fn translation_rules() -> Vec> { ), rule!( (functionDecl + modifiers: _* @mods name: @name genericParameterClause: (genericParameterClause parameters: _* @type_params)? signature: (functionSignature @@ -581,6 +584,7 @@ fn translation_rules() -> Vec> { returnClause: (returnClause type: @ret)?)) => (function_declaration + modifier: {mods} name_node: (identifier #{name}) type_parameter: {type_params} parameter: {params} diff --git a/unified/extractor/tests/corpus/swift/control-flow/discard-statement.output b/unified/extractor/tests/corpus/swift/control-flow/discard-statement.output index 8fc2dfb9d963..c4418dba888b 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/discard-statement.output +++ b/unified/extractor/tests/corpus/swift/control-flow/discard-statement.output @@ -75,6 +75,7 @@ top_level type: unsupported_node "~Copyable" member: function_declaration + modifier: modifier "consuming" name_node: identifier "close" body: block diff --git a/unified/extractor/tests/corpus/swift/types/class-function.output b/unified/extractor/tests/corpus/swift/types/class-function.output new file mode 100644 index 000000000000..ed00913dafde --- /dev/null +++ b/unified/extractor/tests/corpus/swift/types/class-function.output @@ -0,0 +1,57 @@ +class Factory { + class func make() {} +} + +--- + +sourceFile + endOfFileToken: endOfFile + statements: + codeBlockItem + item: + classDecl + attributes: + name: identifier "Factory" + memberBlock: + memberBlock + leftBrace: { + rightBrace: } + members: + memberBlockItem + decl: + functionDecl + attributes: + body: + codeBlock + leftBrace: { + rightBrace: } + statements: + name: identifier "make" + modifiers: + declModifier + name: class + signature: + functionSignature + parameterClause: + functionParameterClause + leftParen: ( + rightParen: ) + parameters: + funcKeyword: func + modifiers: + classKeyword: class + +--- + +top_level + body: + block + stmt: + class_like_declaration + modifier: modifier "class" + name_node: identifier "Factory" + member: + function_declaration + modifier: modifier "class" + name_node: identifier "make" + body: block "class func make() {}" diff --git a/unified/extractor/tests/corpus/swift/types/class-function.swift b/unified/extractor/tests/corpus/swift/types/class-function.swift new file mode 100644 index 000000000000..d4424ab3005e --- /dev/null +++ b/unified/extractor/tests/corpus/swift/types/class-function.swift @@ -0,0 +1,3 @@ +class Factory { + class func make() {} +} diff --git a/unified/extractor/tests/corpus/swift/types/static-function.output b/unified/extractor/tests/corpus/swift/types/static-function.output new file mode 100644 index 000000000000..f610765a02eb --- /dev/null +++ b/unified/extractor/tests/corpus/swift/types/static-function.output @@ -0,0 +1,57 @@ +class Factory { + static func make() {} +} + +--- + +sourceFile + endOfFileToken: endOfFile + statements: + codeBlockItem + item: + classDecl + attributes: + name: identifier "Factory" + memberBlock: + memberBlock + leftBrace: { + rightBrace: } + members: + memberBlockItem + decl: + functionDecl + attributes: + body: + codeBlock + leftBrace: { + rightBrace: } + statements: + name: identifier "make" + modifiers: + declModifier + name: static + signature: + functionSignature + parameterClause: + functionParameterClause + leftParen: ( + rightParen: ) + parameters: + funcKeyword: func + modifiers: + classKeyword: class + +--- + +top_level + body: + block + stmt: + class_like_declaration + modifier: modifier "class" + name_node: identifier "Factory" + member: + function_declaration + modifier: modifier "static" + name_node: identifier "make" + body: block "static func make() {}" diff --git a/unified/extractor/tests/corpus/swift/types/static-function.swift b/unified/extractor/tests/corpus/swift/types/static-function.swift new file mode 100644 index 000000000000..3b70d91795cb --- /dev/null +++ b/unified/extractor/tests/corpus/swift/types/static-function.swift @@ -0,0 +1,3 @@ +class Factory { + static func make() {} +} From c339f348295f016553c5473e6051a089768ff68c Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 10 Sep 2026 13:34:04 +0200 Subject: [PATCH 0847/2098] unified: Test bodyless Swift function modifiers Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../swift/types/protocol-declaration.output | 21 +++++++++++++++++++ .../swift/types/protocol-declaration.swift | 1 + 2 files changed, 22 insertions(+) diff --git a/unified/extractor/tests/corpus/swift/types/protocol-declaration.output b/unified/extractor/tests/corpus/swift/types/protocol-declaration.output index 1521bc349b92..188333076fc5 100644 --- a/unified/extractor/tests/corpus/swift/types/protocol-declaration.output +++ b/unified/extractor/tests/corpus/swift/types/protocol-declaration.output @@ -1,5 +1,6 @@ protocol Drawable { func draw() + static func make() } --- @@ -31,6 +32,22 @@ sourceFile rightParen: ) parameters: funcKeyword: func + memberBlockItem + decl: + functionDecl + attributes: + name: identifier "make" + modifiers: + declModifier + name: static + signature: + functionSignature + parameterClause: + functionParameterClause + leftParen: ( + rightParen: ) + parameters: + funcKeyword: func modifiers: protocolKeyword: protocol @@ -47,3 +64,7 @@ top_level function_declaration name_node: identifier "draw" body: block "func draw()" + function_declaration + modifier: modifier "static" + name: identifier "make" + body: block "static func make()" diff --git a/unified/extractor/tests/corpus/swift/types/protocol-declaration.swift b/unified/extractor/tests/corpus/swift/types/protocol-declaration.swift index 030b68a60c04..417886c213de 100644 --- a/unified/extractor/tests/corpus/swift/types/protocol-declaration.swift +++ b/unified/extractor/tests/corpus/swift/types/protocol-declaration.swift @@ -1,3 +1,4 @@ protocol Drawable { func draw() + static func make() } From a83eb2205129ce01aaa2df2e98a82a2f9682f385 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Fri, 11 Sep 2026 09:05:36 +0200 Subject: [PATCH 0848/2098] unified: Refresh rebased Swift corpus output Regenerate the bodyless function modifier fixture against the updated unified AST field names from main. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../tests/corpus/swift/types/protocol-declaration.output | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/extractor/tests/corpus/swift/types/protocol-declaration.output b/unified/extractor/tests/corpus/swift/types/protocol-declaration.output index 188333076fc5..dacfae76cb34 100644 --- a/unified/extractor/tests/corpus/swift/types/protocol-declaration.output +++ b/unified/extractor/tests/corpus/swift/types/protocol-declaration.output @@ -66,5 +66,5 @@ top_level body: block "func draw()" function_declaration modifier: modifier "static" - name: identifier "make" + name_node: identifier "make" body: block "static func make()" From 2163d71312ae8877198aaf6fee9fd8878e2d9b19 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 11 Sep 2026 08:46:39 +0200 Subject: [PATCH 0849/2098] unified: Refine definition of LocalVariableDeclaration --- .../ql/lib/codeql/unified/internal/AstExtra.qll | 15 +++------------ .../codeql/unified/internal/LocalNameBinding.qll | 2 -- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/AstExtra.qll b/unified/ql/lib/codeql/unified/internal/AstExtra.qll index fea1a2490363..5e8e54faa61a 100644 --- a/unified/ql/lib/codeql/unified/internal/AstExtra.qll +++ b/unified/ql/lib/codeql/unified/internal/AstExtra.qll @@ -3,6 +3,7 @@ */ private import unified +private import codeql.unified.internal.NameBindingPlugin module Public { /** A short-circuiting logical AND expression. */ @@ -29,24 +30,14 @@ module Public { * Declaration of a local or top-level variable. */ class LocalVariableDeclaration extends VariableDeclaration { - private Block block; - - LocalVariableDeclaration() { this = block.getStmt(_) } - - /** Gets the block in which this variable is declared. */ - Block getDeclaringBlock() { result = block } + LocalVariableDeclaration() { not isStaticMember(this) and not isInstanceMember(this) } } /** * Declaration of a local or top-level function. */ class LocalFunctionDeclaration extends FunctionDeclaration { - private Block block; - - LocalFunctionDeclaration() { this = block.getStmt(_) } - - /** Gets the block in which this function is declared. */ - Block getDeclaringBlock() { result = block } + LocalFunctionDeclaration() { not isStaticMember(this) and not isInstanceMember(this) } } /** diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index 497b800b81a9..2349fb0e1e7c 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -168,8 +168,6 @@ private module LocalNameBindingInput implements LocalNameBindingInputSig Date: Wed, 9 Sep 2026 21:34:21 +0200 Subject: [PATCH 0850/2098] unified: Rename NameDeclaration -> NameBinding We used the term declaration both for the identifier and the surrounding node declaring containing one or more such identifiers (possibly nested in a pattern). It led to code like `getADeclaration().getDeclaration()`. We now use the term "binding" for identifiers in binding position, and declarations as contexts that establish the binding position. --- unified/ql/lib/codeql/Definitions.qll | 4 +- .../unified/internal/AnalysisQuality.qll | 2 +- .../unified/internal/LocalNameBinding.qll | 16 +++---- .../unified/internal/StaticNameBinding.qll | 42 +++++++++---------- .../lib/ide-contextual-queries/definitions.ql | 2 +- unified/ql/lib/utils/test/TestUtils.qll | 6 +-- .../ql/test/library-tests/definitions/test.ql | 4 +- .../library-tests/local-name-binding/test.ql | 3 +- .../library-tests/static-name-binding/test.ql | 6 +-- 9 files changed, 42 insertions(+), 43 deletions(-) diff --git a/unified/ql/lib/codeql/Definitions.qll b/unified/ql/lib/codeql/Definitions.qll index 3eb6ddcef102..941d00b425cc 100644 --- a/unified/ql/lib/codeql/Definitions.qll +++ b/unified/ql/lib/codeql/Definitions.qll @@ -9,8 +9,8 @@ private import codeql.unified.internal.StaticNameBinding * Holds if `reference` refers to `definition`. */ cached -predicate definitionOf(Identifier reference, NameDeclaration definition, string kind) { +predicate definitionOf(Identifier reference, NameBinding definition, string kind) { definition = getStaticBindingTarget(reference) and - not reference instanceof NameDeclaration and + not reference instanceof NameBinding and kind = "name" } diff --git a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll index d1568edfff80..c2c6bf66f6d5 100644 --- a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll +++ b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll @@ -44,7 +44,7 @@ module StaticNameResolutionStats implements EntityStatsSig { this = getIdentifierFromRef(ref) and not memberAccessDependsOnTypeInference(ref) ) and - not this instanceof NameDeclaration + not this instanceof NameBinding } NameBindingNode getTarget() { diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index 2349fb0e1e7c..6ea58b5cb878 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -360,13 +360,13 @@ module Public { LocalNameAccess getAnAccess() { result.getLocalName() = this } - /** Gets an identiier that declares this local name. */ - NameDeclaration getADeclaration() { result.getLocalName() = this } + /** Gets a name binding that declares this local name. */ + NameBinding getABinding() { result.getLocalName() = this } } - /** A name node that appears as the declaration site of a name, such as the `x` in `let x = 123`. */ - class NameDeclaration extends Identifier { - NameDeclaration() { LocalNameBindingInput::bindingContext(this, _, _) } + /** An identifier appearing in a name-binding position, such as the `x` in `let x = 123`. */ + class NameBinding extends Identifier { + NameBinding() { LocalNameBindingInput::bindingContext(this, _, _) } /** Gets the statement-like node declaring this name, such as a `VariableDeclaration` or `CatchClause`. */ AstNode getDeclaration() { LocalNameBindingInput::bindingContext(this, _, result) } @@ -382,7 +382,7 @@ module Public { class LocalVariable extends LocalName { LocalVariable() { exists(AstNode decl | - decl = this.getADeclaration().getDeclaration() and + decl = this.getABinding().getDeclaration() and not isInstanceMember(decl) and not isStaticMember(decl) | @@ -429,6 +429,6 @@ class PotentialLocalNameAccess extends IdentifierExpr { string getName() { result = this.getValue() } - /** Holds if this is one of the declaration sites for a name, such as the `x` in `let x = 123`. */ - predicate isDeclarationSite() { this instanceof NameDeclaration } + /** Holds if this is one of the binding sites for a name, such as the `x` in `let x = 123`. */ + predicate isBindingSite() { this instanceof NameBinding } } diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 9055e7331e7c..d1a6e96d32e8 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -139,7 +139,7 @@ private predicate isPrivateToLocalScope(AstNode binding) { member = any(ClassLikeDeclaration cls).getAMember() or member = any(TopLevel t).getBody().getAStmt() ) and - (binding instanceof NameDeclaration or binding instanceof BulkImportingPattern) and + (binding instanceof NameBinding or binding instanceof BulkImportingPattern) and any(NameBindingPlugin p).isPrivateToLocalScope(member, binding) ) } @@ -168,7 +168,7 @@ predicate readStep(NameBindingNode node1, string name, NameBindingNode node2) { ) or exists(PotentialLocalNameAccess access | - not access.isDeclarationSite() and + not access.isBindingSite() and name = access.getName() and node1 = getNodeFromUncertainScope(LocalNameBindingOutput::getAnUncertainScope(access, name)) and node2.isIdentifier(access) @@ -183,7 +183,7 @@ predicate readStep(NameBindingNode node1, string name, NameBindingNode node2) { } predicate storeStep(NameBindingNode node1, string name, NameBindingNode node2) { - exists(ClassLikeDeclaration cls, Member member, NameDeclaration nameDecl | + exists(ClassLikeDeclaration cls, Member member, NameBinding nameDecl | member = cls.getAMember() and not isPrivateToLocalScope(nameDecl) and nameDecl.getDeclaration() = member and @@ -194,7 +194,7 @@ predicate storeStep(NameBindingNode node1, string name, NameBindingNode node2) { else node2.isStaticMemberNamespace(cls) ) or - exists(TopLevel top, Stmt stmt, NameDeclaration nameDecl | + exists(TopLevel top, Stmt stmt, NameBinding nameDecl | stmt = top.getBody().getAStmt() and not isPrivateToLocalScope(nameDecl) and nameDecl.getDeclaration() = stmt and @@ -214,11 +214,11 @@ predicate storeStep(NameBindingNode node1, string name, NameBindingNode node2) { predicate valueStep(NameBindingNode node1, NameBindingNode node2) { exists(PotentialLocalNameAccess access | - access.isDeclarationSite() and + access.isBindingSite() and node1.isIdentifier(access) and node2.isLocalName(access.getLocalName()) or - not access.isDeclarationSite() and + not access.isBindingSite() and node1.isLocalName(access.getLocalName()) and node2.isIdentifier(access) ) @@ -327,7 +327,7 @@ private predicate derivedStoreReadStep(NameBindingNode node1, NameBindingNode no /** Holds if the member represented by `node` can be inherited. */ pragma[nomagic] private predicate isInheritableMemberNode(NameBindingNode node) { - exists(NameDeclaration decl | + exists(NameBinding decl | node.isIdentifier(decl) and isInheritableMember(decl.getDeclaration()) ) @@ -414,29 +414,29 @@ private predicate sameName(Identifier node1, Identifier node2) { * will be passed through. */ pragma[nomagic] -predicate isTrivialNameAlias(NameDeclaration decl) { +predicate isTrivialNameAlias(NameBinding decl) { exists(ImportDeclaration imprt | decl = getImportBindingIdentifier(imprt) and sameName(decl, getIdentifierFromRef(imprt.getImportedExpr())) ) } -private module TrackNameDeclarationInput implements TrackInputSig { +private module TrackNameBindingInput implements TrackInputSig { predicate shouldTrack(NameBindingNode node) { - exists(NameDeclaration decl | + exists(NameBinding decl | node.isIdentifier(decl) and not isTrivialNameAlias(decl) ) } } -private module TrackNameDeclaration = Track; +private module TrackNameBinding = Track; /** Gets a name-binding node that may refer to the given declaration. */ -NameBindingNode trackNameDeclaration(NameDeclaration decl) { +NameBindingNode trackNameBinding(NameBinding decl) { exists(NameBindingNode start | start.isIdentifier(decl) and - result = TrackNameDeclaration::track(start) + result = TrackNameBinding::track(start) ) } @@ -490,7 +490,7 @@ module DebugGraph { */ private module FolderHeuristic { private predicate topLevelNameDef(File file, string name, NameBindingNode node) { - exists(TopLevel top, Stmt stmt, NameDeclaration nameDecl | + exists(TopLevel top, Stmt stmt, NameBinding nameDecl | top.getFile() = file and stmt = top.getBody().getAStmt() and not isPrivateToLocalScope(nameDecl) and @@ -583,10 +583,10 @@ private module FolderHeuristic { * or as a static member. */ private predicate unqualifiedMemberAccessCand( - PotentialLocalNameAccess access, boolean instanceAccess, NameDeclaration target, + PotentialLocalNameAccess access, boolean instanceAccess, NameBinding target, ClassLikeDeclaration accessingClass ) { - not access instanceof NameDeclaration and + not access instanceof NameBinding and ( // Resolved by local scoping exists(LocalName local | @@ -628,7 +628,7 @@ private int unqualifiedMemberAccessDepth(PotentialLocalNameAccess access) { * `instanceAccess` indicates if it is an instance member or static member. */ predicate unqualifiedMemberAccess( - PotentialLocalNameAccess access, boolean instanceAccess, NameDeclaration target, + PotentialLocalNameAccess access, boolean instanceAccess, NameBinding target, ClassLikeDeclaration accessingClass ) { unqualifiedMemberAccessCand(access, instanceAccess, target, accessingClass) and @@ -640,7 +640,7 @@ predicate unqualifiedMemberAccess( */ class UnqualifiedMemberAccess extends Identifier { private boolean instanceAccess; - private NameDeclaration target; + private NameBinding target; private ClassLikeDeclaration accessingClass; UnqualifiedMemberAccess() { @@ -648,7 +648,7 @@ class UnqualifiedMemberAccess extends Identifier { } /** Gets the name declaration of the member being accessed. */ - NameDeclaration getTarget() { result = target } + NameBinding getTarget() { result = target } /** Gets the enclosing class whose (possibly inherited) member is being accessed. */ ClassLikeDeclaration getAccessingClass() { result = accessingClass } @@ -658,11 +658,11 @@ class UnqualifiedMemberAccess extends Identifier { } /** Gets the declaration being accessed by `access`, as determined by static name binding. */ -NameDeclaration getStaticBindingTarget(Identifier access) { +NameBinding getStaticBindingTarget(Identifier access) { // For unqualified accesses, use the shadowing-aware lookup result = access.(UnqualifiedMemberAccess).getTarget() or // For others, just follow the name binding graph not access instanceof UnqualifiedMemberAccess and - trackNameDeclaration(result).asIdentifier() = access + trackNameBinding(result).asIdentifier() = access } diff --git a/unified/ql/lib/ide-contextual-queries/definitions.ql b/unified/ql/lib/ide-contextual-queries/definitions.ql index f72c91bcd9dd..0d2477a83b57 100644 --- a/unified/ql/lib/ide-contextual-queries/definitions.ql +++ b/unified/ql/lib/ide-contextual-queries/definitions.ql @@ -13,7 +13,7 @@ import unified external string selectedSourceFile(); -from Identifier reference, NameDeclaration definition, string kind +from Identifier reference, NameBinding definition, string kind where definitionOf(reference, definition, kind) and reference.getLocation().getFile() = getFileBySourceArchiveName(selectedSourceFile()) diff --git a/unified/ql/lib/utils/test/TestUtils.qll b/unified/ql/lib/utils/test/TestUtils.qll index 15155c44758a..9665121e79be 100644 --- a/unified/ql/lib/utils/test/TestUtils.qll +++ b/unified/ql/lib/utils/test/TestUtils.qll @@ -9,7 +9,7 @@ private string deriveClassName(ClassLikeDeclaration cls) { result = deriveClassName(cls.getEnclosingClass()) + "." + cls.getName() } -private string defaultName(NameDeclaration decl) { +private string defaultName(NameBinding decl) { exists(ClassLikeDeclaration cls | decl.getDeclaration() = cls.getAMember() and result = deriveClassName(cls) + "." + decl.getName() @@ -19,11 +19,11 @@ private string defaultName(NameDeclaration decl) { result = decl.getName() } -private predicate declAt(NameDeclaration v, string filepath, int line) { +private predicate declAt(NameBinding v, string filepath, int line) { v.getLocation().hasLocationInfo(filepath, line, _, _, _) } -predicate nameDeclaration(NameDeclaration v, string alias) { +predicate nameBinding(NameBinding v, string alias) { exists(string filepath, int line | declAt(v, filepath, line) | keyValueCommentAt(filepath, line, "name", alias) or diff --git a/unified/ql/test/library-tests/definitions/test.ql b/unified/ql/test/library-tests/definitions/test.ql index 361a9fd6a03c..9479e756bc94 100644 --- a/unified/ql/test/library-tests/definitions/test.ql +++ b/unified/ql/test/library-tests/definitions/test.ql @@ -7,11 +7,11 @@ module DefinitionsTest implements TestSig { string getARelevantTag() { result = "definition" } predicate hasActualResult(Location location, string element, string tag, string value) { - exists(Identifier reference, NameDeclaration definition | + exists(Identifier reference, NameBinding definition | definitionOf(reference, definition, "name") and location = reference.getLocation() and element = reference.toString() and - nameDeclaration(definition, value) and + nameBinding(definition, value) and tag = "definition" ) } diff --git a/unified/ql/test/library-tests/local-name-binding/test.ql b/unified/ql/test/library-tests/local-name-binding/test.ql index e430f16ba48d..d042daacb2e5 100644 --- a/unified/ql/test/library-tests/local-name-binding/test.ql +++ b/unified/ql/test/library-tests/local-name-binding/test.ql @@ -20,8 +20,7 @@ module VariableAccessTest implements TestSig { } private PotentialLocalNameAccess getUniqueDeclarationSite(LocalName name) { - result = - unique(PotentialLocalNameAccess ac | ac.isDeclarationSite() and ac.getLocalName() = name) + result = unique(PotentialLocalNameAccess ac | ac.isBindingSite() and ac.getLocalName() = name) } predicate hasActualResult(Location location, string element, string tag, string value) { diff --git a/unified/ql/test/library-tests/static-name-binding/test.ql b/unified/ql/test/library-tests/static-name-binding/test.ql index e6dd7e64f6b3..87bcec48f4f5 100644 --- a/unified/ql/test/library-tests/static-name-binding/test.ql +++ b/unified/ql/test/library-tests/static-name-binding/test.ql @@ -7,12 +7,12 @@ module StaticDeclAccess implements TestSig { string getARelevantTag() { result = "access" } predicate hasActualResult(Location location, string element, string tag, string value) { - exists(NameDeclaration decl, Identifier access | + exists(NameBinding decl, Identifier access | decl = getStaticBindingTarget(access) and - not access instanceof NameDeclaration and + not access instanceof NameBinding and location = access.getLocation() and element = access.toString() and - nameDeclaration(decl, value) and + nameBinding(decl, value) and tag = "access" ) } From 0c8cf6db89a67bb2ce9d01c2b42ad15396798072 Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 9 Sep 2026 22:49:35 +0200 Subject: [PATCH 0851/2098] unified: Expose UnqualifiedMemberAccess --- .../unified/internal/StaticNameBinding.qll | 34 ++++++++++--------- unified/ql/lib/unified.qll | 1 + 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index d1a6e96d32e8..fade9ba6241c 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -635,26 +635,28 @@ predicate unqualifiedMemberAccess( accessingClass.getDepth() = unqualifiedMemberAccessDepth(access) } -/** - * A name node appearing in an unqualified position, referring to a member of an enclosing class. - */ -class UnqualifiedMemberAccess extends Identifier { - private boolean instanceAccess; - private NameBinding target; - private ClassLikeDeclaration accessingClass; +module Public { + /** + * A name node appearing in an unqualified position, referring to a member of an enclosing class. + */ + class UnqualifiedMemberAccess extends Identifier { + private boolean instanceAccess; + private NameBinding target; + private ClassLikeDeclaration accessingClass; - UnqualifiedMemberAccess() { - unqualifiedMemberAccess(this, instanceAccess, target, accessingClass) - } + UnqualifiedMemberAccess() { + unqualifiedMemberAccess(this, instanceAccess, target, accessingClass) + } - /** Gets the name declaration of the member being accessed. */ - NameBinding getTarget() { result = target } + /** Gets the name declaration of the member being accessed. */ + NameBinding getTarget() { result = target } - /** Gets the enclosing class whose (possibly inherited) member is being accessed. */ - ClassLikeDeclaration getAccessingClass() { result = accessingClass } + /** Gets the enclosing class whose (possibly inherited) member is being accessed. */ + ClassLikeDeclaration getAccessingClass() { result = accessingClass } - /** Holds if this is an instance access on the accessing class. */ - predicate isInstanceAccess() { instanceAccess = true } + /** Holds if this is an instance access on the accessing class. */ + predicate isInstanceAccess() { instanceAccess = true } + } } /** Gets the declaration being accessed by `access`, as determined by static name binding. */ diff --git a/unified/ql/lib/unified.qll b/unified/ql/lib/unified.qll index 033d00aa6def..8c15fee5adbb 100644 --- a/unified/ql/lib/unified.qll +++ b/unified/ql/lib/unified.qll @@ -8,3 +8,4 @@ import codeql.unified.internal.Ast::UnifiedFinal import codeql.unified.internal.AstExtra::Public import codeql.unified.internal.ControlFlowGraph import codeql.unified.internal.LocalNameBinding::Public +import codeql.unified.internal.StaticNameBinding::Public From 51f771f3c5375f32e35e364c1e6c791d62c9d132 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 10 Sep 2026 01:27:01 +0200 Subject: [PATCH 0852/2098] unified: Add some more predicates in LocalVariable --- .../ql/lib/codeql/unified/internal/LocalNameBinding.qll | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index 6ea58b5cb878..308b76bb8790 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -395,6 +395,14 @@ module Public { decl instanceof SwitchCase ) } + + /** Gets the callable containing the declaration of this local variable. */ + Callable getDeclaringCallable() { result = this.getABinding().getEnclosingCallable() } + + /** Holds if this local variable is captured, that is, it is accessed from another callable than the one declaring it. */ + predicate isCaptured() { + this.getAnAccess().getEnclosingCallable() != this.getDeclaringCallable() + } } /** An access to a locally-declared name. */ From b10e121ca89ff4d3e1b14c992cfb3c538613ca31 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 10 Sep 2026 09:01:38 +0200 Subject: [PATCH 0853/2098] unified: Declare implicit 'self' --- .../unified/internal/LocalNameBinding.qll | 30 +++++++++++++++---- .../unified/internal/NameBindingPlugin.qll | 3 ++ .../internal/NameBindingPluginSwift.qll | 6 ++++ 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index 308b76bb8790..e881adfe7d62 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -321,12 +321,16 @@ private module LocalNameBindingInput implements LocalNameBindingInputSig Date: Thu, 10 Sep 2026 09:34:25 +0200 Subject: [PATCH 0854/2098] unified: Wrap access-lookup in a reusable module This moves a handful of predicates into a module, parameterised by the 'accessCand' predicate. There are no other changes to predicates, they are just moved. This is to allow further variable-lookups at a later stage. --- .../codeql/namebinding/LocalNameBinding.qll | 126 ++++++++++-------- 1 file changed, 72 insertions(+), 54 deletions(-) diff --git a/shared/namebinding/codeql/namebinding/LocalNameBinding.qll b/shared/namebinding/codeql/namebinding/LocalNameBinding.qll index 4a9c5b61db92..a652d16f25a1 100644 --- a/shared/namebinding/codeql/namebinding/LocalNameBinding.qll +++ b/shared/namebinding/codeql/namebinding/LocalNameBinding.qll @@ -337,54 +337,89 @@ module LocalNameBinding ) } - private predicate accessCandInLookupScope(AstNode n, string name, Scope lookup) { - accessCand(n, name) and - ( - lookupStartsAt(n, lookup) - or - not lookupStartsAt(n, _) and - lookup = getEnclosingScope(n) - ) - } - - pragma[nomagic] - private predicate lookupInScope(string name, Scope lookup, Scope scope) { - accessCandInLookupScope(_, name, lookup) and - scope = lookup - or - exists(Scope mid | - lookupInScope(name, lookup, mid) and - not declInScope(name, mid) and - not isTopScope(mid) and - scope = getEnclosingScope(mid) - ) - } - private predicate declInScope(string name, AstNode scope) { declInScope(_, name, scope) or implicitDeclInScope(name, scope) } + signature predicate accessCandSig(AstNode n, string name); + /** - * Holds if `name`, when resolved from `lookup`, may resolve to one of the uncertain members of `scope`. + * Allows resolution of access candidates. + * + * This is instantiated once by the local name binding library itself in order to populate `LocalAccces`. + * It can be instantiated further by the client, to resolve additional lookups at a later evaluation stage. */ - pragma[nomagic] - private predicate lookupInUncertainScope(string name, Scope lookup, Scope scope) { - lookupInScope(name, lookup, scope) and - uncertainScope(scope) and - not declInScope(name, scope) + module ResolveAccesses { + private predicate accessCandInLookupScope(AstNode n, string name, Scope lookup) { + accessCandInput(n, name) and + ( + lookupStartsAt(n, lookup) + or + not lookupStartsAt(n, _) and + lookup = getEnclosingScope(n) + ) + } + + pragma[nomagic] + private predicate lookupInScope(string name, Scope lookup, Scope scope) { + accessCandInLookupScope(_, name, lookup) and + scope = lookup + or + exists(Scope mid | + lookupInScope(name, lookup, mid) and + not declInScope(name, mid) and + not isTopScope(mid) and + scope = getEnclosingScope(mid) + ) + } + + pragma[nomagic] + private predicate resolveInScope(string name, Scope lookup, Local l) { + exists(Scope scope | lookupInScope(name, lookup, scope) | + l = TExplicitLocal(_, name, scope) or + l = TImplicitLocal(name, scope) + ) + } + + predicate access(AstNode access, Local l) { + exists(Scope lookup, string name | + accessCandInLookupScope(access, name, lookup) and + resolveInScope(name, lookup, l) + ) + } + + /** + * Holds if `name`, when resolved from `lookup`, may resolve to one of the uncertain members of `scope`. + */ + pragma[nomagic] + private predicate lookupInUncertainScope(string name, Scope lookup, Scope scope) { + lookupInScope(name, lookup, scope) and + uncertainScope(scope) and + not declInScope(name, scope) + } + + /** + * Gets an uncertain scope in which the `accessCand` pair may resolve. + */ + AstNode getAnUncertainScope(AstNode access, string name) { + exists(Scope lookup | + accessCandInLookupScope(access, name, lookup) and + lookupInUncertainScope(name, lookup, result) + ) + } } - /** - * Gets an uncertain scope in which the `accessCand` pair may resolve. - */ - AstNode getAnUncertainScope(AstNode access, string name) { - exists(Scope lookup | - accessCandInLookupScope(access, name, lookup) and - lookupInUncertainScope(name, lookup, result) - ) + private module DefaultAccesses = ResolveAccesses; + + cached + predicate access(AstNode access, Local l) { + CachedStage::ref() and + DefaultAccesses::access(access, l) } + predicate getAnUncertainScope = DefaultAccesses::getAnUncertainScope/2; + cached private newtype TLocal = TExplicitLocal(AstNode definingNode, string name, AstNode scope) { @@ -449,23 +484,6 @@ module LocalNameBinding override Location getLocation() { result = scope.getLocation() } } - pragma[nomagic] - private predicate resolveInScope(string name, Scope lookup, Local l) { - exists(Scope scope | lookupInScope(name, lookup, scope) | - l = TExplicitLocal(_, name, scope) or - l = TImplicitLocal(name, scope) - ) - } - - cached - private predicate access(AstNode access, Local l) { - CachedStage::ref() and - exists(Scope lookup, string name | - accessCandInLookupScope(access, name, lookup) and - resolveInScope(name, lookup, l) - ) - } - /** A local access. */ final class LocalAccess extends AstNodeFinal { private Local l; From fcbf8169696bb897aa952579c59ee0333e764d14 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 10 Sep 2026 09:47:16 +0200 Subject: [PATCH 0855/2098] unified: Resolve the implicit 'self' reference to a LocalVariable --- .../unified/internal/StaticNameBinding.qll | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index fade9ba6241c..044c5d421d60 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -656,6 +656,11 @@ module Public { /** Holds if this is an instance access on the accessing class. */ predicate isInstanceAccess() { instanceAccess = true } + + /** Gets the local variable implicitly referenced as the base of this access. */ + LocalVariable getImplicitQualifierVariable() { + ResolveImplicitReceiverAccess::access(this, result) + } } } @@ -668,3 +673,24 @@ NameBinding getStaticBindingTarget(Identifier access) { not access instanceof UnqualifiedMemberAccess and trackNameBinding(result).asIdentifier() = access } + +/** + * Gets the name of the implicit receiver parameter in scope at `callable` (possibly declared by an outer callable). + * + * Note that we only propagate the name, not the LocalVariable, since capture-declarations and Swift's `guard let self` statements + * may re-introduce a new binding for `self`, which becomes the one referenced by subsequent unqualified member accesses. + */ +private string getEnclosingReceiverParameterName(Callable callable) { + result = any(NameBindingPlugin p).getImplicitReceiverParameterName(callable) + or + not exists(any(NameBindingPlugin p).getImplicitReceiverParameterName(callable)) and + result = getEnclosingReceiverParameterName(callable.getEnclosingCallable()) +} + +/** Holds if `access` contains a reference to the implicit receiver parameter `name`. */ +private predicate implicitReceiverAccess(AstNode access, string name) { + name = getEnclosingReceiverParameterName(access.(UnqualifiedMemberAccess).getEnclosingCallable()) +} + +private module ResolveImplicitReceiverAccess = + LocalNameBindingOutput::ResolveAccesses; From aca4c931176cdac99bff876972e6767f7615efab Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 11 Sep 2026 09:05:22 +0200 Subject: [PATCH 0856/2098] unified: Add local name binding test --- unified/ql/lib/utils/test/CommentUtil.qll | 2 +- .../local-name-binding/class_scope.swift | 8 +++--- .../library-tests/local-name-binding/test.ql | 27 ++++++++++++++++--- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/unified/ql/lib/utils/test/CommentUtil.qll b/unified/ql/lib/utils/test/CommentUtil.qll index bd6f887a4010..932be8671a86 100644 --- a/unified/ql/lib/utils/test/CommentUtil.qll +++ b/unified/ql/lib/utils/test/CommentUtil.qll @@ -12,7 +12,7 @@ predicate plainCommentAt(string filepath, int line, string text) { predicate keyValueCommentAt(string filepath, int line, string key, string value) { exists(string text, string regexp, string match | plainCommentAt(filepath, line, text) and - regexp = "(\\w+)=([\\w.0-9]+)" and + regexp = "([\\w.-]+)=([\\w.0-9]+)" and match = text.regexpFind(regexp, _, _) and key = match.regexpCapture(regexp, 1) and value = match.regexpCapture(regexp, 2) diff --git a/unified/ql/test/library-tests/local-name-binding/class_scope.swift b/unified/ql/test/library-tests/local-name-binding/class_scope.swift index 5e251b8e6a0d..5c20bc19cbc1 100644 --- a/unified/ql/test/library-tests/local-name-binding/class_scope.swift +++ b/unified/ql/test/library-tests/local-name-binding/class_scope.swift @@ -5,8 +5,8 @@ class A { let b: B = nil // $ access=A.B let c: C = nil // $ access=A.C } - func instance_before() { - print(instanceVar) // $ access=instanceVar + func instance_before() { // implicit-self=instance_before.self + print(instanceVar) // $ access=instanceVar implicit-qualifier=instance_before.self B(); // $ access=A.B let b: B = nil // $ access=A.B let c: C = nil // $ access=A.C @@ -25,8 +25,8 @@ class A { let c: C = nil // $ access=A.C } - func instance_after() { - print(instanceVar) // $ access=instanceVar + func instance_after() { // implicit-self=instance_after.self + print(instanceVar) // $ access=instanceVar implicit-qualifier=instance_after.self B(); // $ access=A.B let b: B = nil // $ access=A.B let c: C = nil // $ access=A.C diff --git a/unified/ql/test/library-tests/local-name-binding/test.ql b/unified/ql/test/library-tests/local-name-binding/test.ql index d042daacb2e5..122aadee6168 100644 --- a/unified/ql/test/library-tests/local-name-binding/test.ql +++ b/unified/ql/test/library-tests/local-name-binding/test.ql @@ -4,17 +4,27 @@ import utils.test.CommentUtil import codeql.unified.internal.LocalNameBinding module VariableAccessTest implements TestSig { - string getARelevantTag() { result = "access" } + string getARelevantTag() { result = ["access", "implicit-qualifier"] } additional predicate declAt(LocalName v, string filepath, int line) { v.getLocation().hasLocationInfo(filepath, line, _, _, _) } private predicate decl(LocalName v, string alias) { - exists(string filepath, int line | declAt(v, filepath, line) | - keyValueCommentAt(filepath, line, "name", alias) + exists(string filepath, int line, string tag | + declAt(v, filepath, line) and + if exists(v.getABinding()) + then + // explicit declarations must be annotated with 'name' + tag = "name" + else ( + // implicit declarations have their own tags + v.getName() = "self" and tag = "implicit-self" + ) + | + keyValueCommentAt(filepath, line, tag, alias) or - not keyValueCommentAt(filepath, line, "name", _) and + not keyValueCommentAt(filepath, line, tag, _) and alias = v.getName() ) } @@ -32,6 +42,15 @@ module VariableAccessTest implements TestSig { decl(v, value) and tag = "access" ) + or + exists(UnqualifiedMemberAccess access, LocalName v | + v = access.getImplicitQualifierVariable() and + location = access.getLocation() and + element = access.toString() and + decl(v, value) and + access.isInstanceAccess() and // For now, don't annotate receiver access in static methods. It technically exists, it's just not important yet. + tag = "implicit-qualifier" + ) } } From 7ded08c61450741c62bcb7cf7962b539102742a9 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 11 Sep 2026 09:22:14 +0200 Subject: [PATCH 0857/2098] unified: Add tests and handle capture-declaration scoping --- .../unified/internal/LocalNameBinding.qll | 5 +++ .../local-name-binding/self_access.swift | 33 +++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 unified/ql/test/library-tests/local-name-binding/self_access.swift diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index e881adfe7d62..82f9f876584e 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -168,6 +168,11 @@ private module LocalNameBindingInput implements LocalNameBindingInputSig referring to .some() if it + // has not been GC'ed yet. Swift does not allow unqualified self access here. + + print(self) // $ access=weak.self + + // Unwrap the 'self' optional to get a strong reference. + guard let self else { return } // $ access=weak.self // name=guarded.self + + print(self) // $ access=guarded.self + print(instanceField) // $ access=instanceField implicit-qualifier=guarded.self + } + } +} From c4c4b976338fc5edd3cda40c1d480b903060fcf2 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 11 Sep 2026 09:27:16 +0200 Subject: [PATCH 0858/2098] unified: Fix enclosing callable of capture declarations --- .../ql/lib/codeql/unified/internal/FacadeAst.qll | 16 +++++++++++++++- .../local-name-binding/self_access.swift | 4 ++-- .../library-tests/local-name-binding/test.ql | 10 +++++++++- .../library-tests/local-name-binding/test.swift | 4 ++-- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll index 1cc6d6106e93..ad66ed6864b9 100644 --- a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll +++ b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll @@ -33,9 +33,23 @@ module Unified { ) } + private AstNode overrideEnclosingCallableParent() { + exists(FunctionExpr func | + // Capture declarations are evaluated as part of the outer context, and + // considered to be captured by the function expression. + this = func.getACaptureDeclaration() and + result = func.getParent() + ) + } + /** Gets the nearest callable containing this AST node. */ Callable getEnclosingCallable() { - exists(AstNode parent | parent = this.getParent() | + exists(AstNode parent | + parent = this.overrideEnclosingCallableParent() + or + not exists(this.overrideEnclosingCallableParent()) and + parent = this.getParent() + | result = parent or not parent instanceof Callable and diff --git a/unified/ql/test/library-tests/local-name-binding/self_access.swift b/unified/ql/test/library-tests/local-name-binding/self_access.swift index 7eed767e2385..795d7b8bac7a 100644 --- a/unified/ql/test/library-tests/local-name-binding/self_access.swift +++ b/unified/ql/test/library-tests/local-name-binding/self_access.swift @@ -10,14 +10,14 @@ class C { } func t3() { // implicit-self=t3.self - foo(123) { [self] in // name=closure.self + foo(123) { [self] in // $ captured=closure.self // name=closure.self print(self) // $ access=closure.self print(instanceField) // $ access=instanceField implicit-qualifier=closure.self } } func t4() { // implicit-self=t4.self - foo(123) { [weak self] in // name=weak.self + foo(123) { [weak self] in // $ captured=weak.self // name=weak.self // Here, 'self' is an Option referring to .some() if it // has not been GC'ed yet. Swift does not allow unqualified self access here. diff --git a/unified/ql/test/library-tests/local-name-binding/test.ql b/unified/ql/test/library-tests/local-name-binding/test.ql index 122aadee6168..3fc1ce7b5155 100644 --- a/unified/ql/test/library-tests/local-name-binding/test.ql +++ b/unified/ql/test/library-tests/local-name-binding/test.ql @@ -4,7 +4,7 @@ import utils.test.CommentUtil import codeql.unified.internal.LocalNameBinding module VariableAccessTest implements TestSig { - string getARelevantTag() { result = ["access", "implicit-qualifier"] } + string getARelevantTag() { result = ["access", "implicit-qualifier", "captured"] } additional predicate declAt(LocalName v, string filepath, int line) { v.getLocation().hasLocationInfo(filepath, line, _, _, _) @@ -51,6 +51,14 @@ module VariableAccessTest implements TestSig { access.isInstanceAccess() and // For now, don't annotate receiver access in static methods. It technically exists, it's just not important yet. tag = "implicit-qualifier" ) + or + exists(LocalVariable v | + v.isCaptured() and + location = v.getLocation() and + element = v.toString() and + decl(v, value) and + tag = "captured" + ) } } diff --git a/unified/ql/test/library-tests/local-name-binding/test.swift b/unified/ql/test/library-tests/local-name-binding/test.swift index 23d71d8f6dcd..02558d808d4e 100644 --- a/unified/ql/test/library-tests/local-name-binding/test.swift +++ b/unified/ql/test/library-tests/local-name-binding/test.swift @@ -135,7 +135,7 @@ func t16() throws { // Closure captures func t17() { - let x = 1 // name=x1 + let x = 1 // $ captured=x1 // name=x1 let closure = { // name=closure1 print(x) // $ access=x1 } @@ -181,7 +181,7 @@ func t21() { // Nested functions func t22() { let x = 1 // name=x1 - func inner() { // name=inner1 + func inner() { // $ captured=inner1 // name=inner1 let x = 2 // name=x2 print(x) // $ access=x2 } From 4f47b891478d5fff82b842d322bb440f4840cff8 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 11 Sep 2026 09:52:35 +0200 Subject: [PATCH 0859/2098] unified: Add some missing qldoc --- shared/namebinding/codeql/namebinding/LocalNameBinding.qll | 2 ++ unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll | 3 +++ unified/ql/lib/utils/test/TestUtils.qll | 1 + 3 files changed, 6 insertions(+) diff --git a/shared/namebinding/codeql/namebinding/LocalNameBinding.qll b/shared/namebinding/codeql/namebinding/LocalNameBinding.qll index a652d16f25a1..2eaace736b1a 100644 --- a/shared/namebinding/codeql/namebinding/LocalNameBinding.qll +++ b/shared/namebinding/codeql/namebinding/LocalNameBinding.qll @@ -382,6 +382,7 @@ module LocalNameBinding ) } + /** Holds if `access` resolves to `l`. */ predicate access(AstNode access, Local l) { exists(Scope lookup, string name | accessCandInLookupScope(access, name, lookup) and @@ -412,6 +413,7 @@ module LocalNameBinding private module DefaultAccesses = ResolveAccesses; + /** Holds if `access` resolves to `l`. */ cached predicate access(AstNode access, Local l) { CachedStage::ref() and diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index 82f9f876584e..7f146d6121d9 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -367,6 +367,7 @@ module Public { /** Gets the name of this local, as a string. */ string getName() { result = super.getName() } + /** Gets an access to this entity, through its lexically scoped name. */ LocalNameAccess getAnAccess() { result.getLocalName() = this } /** Gets a name binding that declares this local name. */ @@ -458,8 +459,10 @@ module Public { * ``` */ class PotentialLocalNameAccess extends IdentifierExpr { + /** Gets the representative for the local name being accessed. */ LocalName getLocalName() { result = this.(LocalNameBindingOutput::LocalAccess).getLocal() } + /** Gets the name being accessed. */ string getName() { result = this.getValue() } /** Holds if this is one of the binding sites for a name, such as the `x` in `let x = 123`. */ diff --git a/unified/ql/lib/utils/test/TestUtils.qll b/unified/ql/lib/utils/test/TestUtils.qll index 9665121e79be..36583b9a8a34 100644 --- a/unified/ql/lib/utils/test/TestUtils.qll +++ b/unified/ql/lib/utils/test/TestUtils.qll @@ -23,6 +23,7 @@ private predicate declAt(NameBinding v, string filepath, int line) { v.getLocation().hasLocationInfo(filepath, line, _, _, _) } +/** Holds if the name-binding `v` has been assigned the given `alias` by a comment in the test code. */ predicate nameBinding(NameBinding v, string alias) { exists(string filepath, int line | declAt(v, filepath, line) | keyValueCommentAt(filepath, line, "name", alias) From 92df6d26b781a9d38a3b3e18649381296b26894c Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 11 Sep 2026 10:12:04 +0200 Subject: [PATCH 0860/2098] unified: Make access() private again This caused name clashes in other languages. --- shared/namebinding/codeql/namebinding/LocalNameBinding.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/namebinding/codeql/namebinding/LocalNameBinding.qll b/shared/namebinding/codeql/namebinding/LocalNameBinding.qll index 2eaace736b1a..27d2dfb3bf10 100644 --- a/shared/namebinding/codeql/namebinding/LocalNameBinding.qll +++ b/shared/namebinding/codeql/namebinding/LocalNameBinding.qll @@ -415,7 +415,7 @@ module LocalNameBinding /** Holds if `access` resolves to `l`. */ cached - predicate access(AstNode access, Local l) { + private predicate access(AstNode access, Local l) { CachedStage::ref() and DefaultAccesses::access(access, l) } From cb264da0ffbcc52936c3b08b64e8f0ddb2bfed1b Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 11 Sep 2026 10:16:51 +0200 Subject: [PATCH 0861/2098] unified: Add NameBinding.qll Now that StaticNameBinding also has a module called 'Public' we get conflicts when importing both. Adding a facade for importing both. --- .../codeql/unified/internal/AnalysisQuality.qll | 4 +--- .../lib/codeql/unified/internal/NameBinding.qll | 15 +++++++++++++++ unified/ql/lib/unified.qll | 3 +-- 3 files changed, 17 insertions(+), 5 deletions(-) create mode 100644 unified/ql/lib/codeql/unified/internal/NameBinding.qll diff --git a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll index c2c6bf66f6d5..986238a60594 100644 --- a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll +++ b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll @@ -1,8 +1,6 @@ private import unified private import codeql.util.ReportStats -private import codeql.unified.internal.StaticNameBinding -private import codeql.unified.internal.LocalNameBinding -private import codeql.unified.internal.NameBindingPlugin +private import codeql.unified.internal.NameBinding /** Stats about name nodes that static name binding could resolve. */ module StaticNameResolutionStats implements EntityStatsSig { diff --git a/unified/ql/lib/codeql/unified/internal/NameBinding.qll b/unified/ql/lib/codeql/unified/internal/NameBinding.qll new file mode 100644 index 000000000000..a07142de1d5f --- /dev/null +++ b/unified/ql/lib/codeql/unified/internal/NameBinding.qll @@ -0,0 +1,15 @@ +/** + * Re-exports everything from the name-binding passes, while avoiding conflicts on 'Public'. + * + * TODO: move name binding passes into a subfolder. + */ + +import StaticNameBinding +import LocalNameBinding +import NameBindingPlugin + +module Public { + // re-declare here to avoid conflicting import + import StaticNameBinding::Public + import LocalNameBinding::Public +} diff --git a/unified/ql/lib/unified.qll b/unified/ql/lib/unified.qll index 8c15fee5adbb..500de80b64f3 100644 --- a/unified/ql/lib/unified.qll +++ b/unified/ql/lib/unified.qll @@ -7,5 +7,4 @@ import codeql.files.FileSystem import codeql.unified.internal.Ast::UnifiedFinal import codeql.unified.internal.AstExtra::Public import codeql.unified.internal.ControlFlowGraph -import codeql.unified.internal.LocalNameBinding::Public -import codeql.unified.internal.StaticNameBinding::Public +import codeql.unified.internal.NameBinding::Public From 57c071f4a2fd7a85762226aa86252915ff853e28 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 11 Sep 2026 10:19:30 +0200 Subject: [PATCH 0862/2098] unified: Prefer importing the NameBinding.qll facade --- unified/ql/lib/codeql/Definitions.qll | 2 +- .../codeql/unified/internal/dev/debugLocalNameBindingGraph.ql | 2 +- .../codeql/unified/internal/dev/debugStaticNameBindingGraph.ql | 2 +- unified/ql/lib/utils/test/TestUtils.qll | 2 +- unified/ql/src/diagnostic/FilesCoveredByModuleManifest.ql | 2 +- unified/ql/src/diagnostic/StaticNameResolution.ql | 2 +- unified/ql/test/library-tests/local-name-binding/test.ql | 2 +- unified/ql/test/library-tests/static-name-binding/test.ql | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/unified/ql/lib/codeql/Definitions.qll b/unified/ql/lib/codeql/Definitions.qll index 941d00b425cc..1f6a1bbc9e81 100644 --- a/unified/ql/lib/codeql/Definitions.qll +++ b/unified/ql/lib/codeql/Definitions.qll @@ -3,7 +3,7 @@ */ private import unified -private import codeql.unified.internal.StaticNameBinding +private import codeql.unified.internal.NameBinding /** * Holds if `reference` refers to `definition`. diff --git a/unified/ql/lib/codeql/unified/internal/dev/debugLocalNameBindingGraph.ql b/unified/ql/lib/codeql/unified/internal/dev/debugLocalNameBindingGraph.ql index 71887f476f16..4c0db3a049df 100644 --- a/unified/ql/lib/codeql/unified/internal/dev/debugLocalNameBindingGraph.ql +++ b/unified/ql/lib/codeql/unified/internal/dev/debugLocalNameBindingGraph.ql @@ -6,7 +6,7 @@ */ private import unified -private import codeql.unified.internal.LocalNameBinding +private import codeql.unified.internal.NameBinding /** * Holds if `node` should be shown in the graph. diff --git a/unified/ql/lib/codeql/unified/internal/dev/debugStaticNameBindingGraph.ql b/unified/ql/lib/codeql/unified/internal/dev/debugStaticNameBindingGraph.ql index f365d3915f89..e8c97ce41852 100644 --- a/unified/ql/lib/codeql/unified/internal/dev/debugStaticNameBindingGraph.ql +++ b/unified/ql/lib/codeql/unified/internal/dev/debugStaticNameBindingGraph.ql @@ -6,7 +6,7 @@ */ private import unified -private import codeql.unified.internal.StaticNameBinding +private import codeql.unified.internal.NameBinding /** * Holds if `node` should be shown in the graph. diff --git a/unified/ql/lib/utils/test/TestUtils.qll b/unified/ql/lib/utils/test/TestUtils.qll index 36583b9a8a34..4a232e984e78 100644 --- a/unified/ql/lib/utils/test/TestUtils.qll +++ b/unified/ql/lib/utils/test/TestUtils.qll @@ -1,6 +1,6 @@ private import unified private import CommentUtil -private import codeql.unified.internal.StaticNameBinding +private import codeql.unified.internal.NameBinding private string deriveClassName(ClassLikeDeclaration cls) { not exists(cls.getEnclosingClass()) and diff --git a/unified/ql/src/diagnostic/FilesCoveredByModuleManifest.ql b/unified/ql/src/diagnostic/FilesCoveredByModuleManifest.ql index 6ac4cec641bd..ca226bedc005 100644 --- a/unified/ql/src/diagnostic/FilesCoveredByModuleManifest.ql +++ b/unified/ql/src/diagnostic/FilesCoveredByModuleManifest.ql @@ -9,7 +9,7 @@ */ import unified -import codeql.unified.internal.StaticNameBinding +import codeql.unified.internal.NameBinding import codeql.unified.internal.NameBindingPlugin import codeql.unified.internal.AnalysisQuality diff --git a/unified/ql/src/diagnostic/StaticNameResolution.ql b/unified/ql/src/diagnostic/StaticNameResolution.ql index 501c39126e54..b15516a3b7b8 100644 --- a/unified/ql/src/diagnostic/StaticNameResolution.ql +++ b/unified/ql/src/diagnostic/StaticNameResolution.ql @@ -9,7 +9,7 @@ */ import unified -import codeql.unified.internal.StaticNameBinding +import codeql.unified.internal.NameBinding import codeql.unified.internal.AnalysisQuality from StaticNameResolutionStats::Candidate c, NameBindingNode target diff --git a/unified/ql/test/library-tests/local-name-binding/test.ql b/unified/ql/test/library-tests/local-name-binding/test.ql index 3fc1ce7b5155..974322851944 100644 --- a/unified/ql/test/library-tests/local-name-binding/test.ql +++ b/unified/ql/test/library-tests/local-name-binding/test.ql @@ -1,7 +1,7 @@ import unified import utils.test.InlineExpectationsTest import utils.test.CommentUtil -import codeql.unified.internal.LocalNameBinding +import codeql.unified.internal.NameBinding module VariableAccessTest implements TestSig { string getARelevantTag() { result = ["access", "implicit-qualifier", "captured"] } diff --git a/unified/ql/test/library-tests/static-name-binding/test.ql b/unified/ql/test/library-tests/static-name-binding/test.ql index 87bcec48f4f5..c39202fe5a41 100644 --- a/unified/ql/test/library-tests/static-name-binding/test.ql +++ b/unified/ql/test/library-tests/static-name-binding/test.ql @@ -1,7 +1,7 @@ import unified import utils.test.InlineExpectationsTest import utils.test.TestUtils -import codeql.unified.internal.StaticNameBinding +import codeql.unified.internal.NameBinding module StaticDeclAccess implements TestSig { string getARelevantTag() { result = "access" } From 1229b226a534e1b20a333b90faa02ac6930ceb4b Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 11 Sep 2026 10:55:04 +0200 Subject: [PATCH 0863/2098] Fix typo in documentation comment for ResolveAccesses Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- shared/namebinding/codeql/namebinding/LocalNameBinding.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/namebinding/codeql/namebinding/LocalNameBinding.qll b/shared/namebinding/codeql/namebinding/LocalNameBinding.qll index 27d2dfb3bf10..c0c33fe1aa7c 100644 --- a/shared/namebinding/codeql/namebinding/LocalNameBinding.qll +++ b/shared/namebinding/codeql/namebinding/LocalNameBinding.qll @@ -347,7 +347,7 @@ module LocalNameBinding /** * Allows resolution of access candidates. * - * This is instantiated once by the local name binding library itself in order to populate `LocalAccces`. + * This is instantiated once by the local name binding library itself in order to populate `LocalAccess`. * It can be instantiated further by the client, to resolve additional lookups at a later evaluation stage. */ module ResolveAccesses { From 2647ab699d5f097b44f54ff14ca68028118238ca Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 14 Aug 2026 11:46:22 +0200 Subject: [PATCH 0864/2098] unified: Add string interpolation expression --- unified/extractor/ast_types.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/unified/extractor/ast_types.yml b/unified/extractor/ast_types.yml index 82b49f981180..6f929f115b0e 100644 --- a/unified/extractor/ast_types.yml +++ b/unified/extractor/ast_types.yml @@ -8,6 +8,7 @@ supertypes: - boolean_literal - string_literal - regex_literal + - string_interpolation_expr - builtin_expr - binary_expr - unary_expr @@ -129,6 +130,11 @@ named: # A regex literal regex_literal: + # A string interpolation expression. Constant parts are stored as string literals. + string_interpolation_expr: + modifier*: modifier + element*: expr + # Application of a binary operator, such as `a + b` binary_expr: left: expr From 4897af6a972e207c4878e3a0774f2b3d0bbaa83c Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 14 Aug 2026 11:46:33 +0200 Subject: [PATCH 0865/2098] unified: Regenerate QL --- .../ql/lib/codeql/unified/internal/Ast.qll | 32 +++++++++++++++++++ unified/ql/lib/unified.dbscheme | 22 +++++++++++-- 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/Ast.qll b/unified/ql/lib/codeql/unified/internal/Ast.qll index 85139e77ffb5..3de5e2ff3aad 100644 --- a/unified/ql/lib/codeql/unified/internal/Ast.qll +++ b/unified/ql/lib/codeql/unified/internal/Ast.qll @@ -1176,6 +1176,32 @@ module Unified { class Stmt extends @unified_stmt, F::AstNode { } + /** A class representing `string_interpolation_expr` nodes. */ + class StringInterpolationExpr extends @unified_string_interpolation_expr, F::Expr { + /** Gets the name of the primary QL class for this element. */ + final override string getAPrimaryQlClass() { result = "StringInterpolationExpr" } + + /** Gets the node corresponding to the field `element`. */ + final F::Expr getElement(int i) { unified_string_interpolation_expr_element(this, i, result) } + + /** Gets the node corresponding to the field `element`. */ + final F::Expr getAnElement() { result = this.getElement(_) } + + /** Gets the node corresponding to the field `modifier`. */ + final F::Modifier getModifier(int i) { + unified_string_interpolation_expr_modifier(this, i, result) + } + + /** Gets the node corresponding to the field `modifier`. */ + final F::Modifier getAModifier() { result = this.getModifier(_) } + + /** Gets a field or child node of this node. */ + final override F::AstNode getAFieldOrChild() { + unified_string_interpolation_expr_element(this, _, result) or + unified_string_interpolation_expr_modifier(this, _, result) + } + } + /** A class representing `string_literal` tokens. */ class StringLiteral extends @unified_token_string_literal, F::Expr, F::Token { /** Gets the name of the primary QL class for this element. */ @@ -1746,6 +1772,10 @@ module Unified { or result = node.(ReturnExpr).getValue() and i = -1 and name = "getValue" or + result = node.(StringInterpolationExpr).getElement(i) and name = "getElement" + or + result = node.(StringInterpolationExpr).getModifier(i) and name = "getModifier" + or result = node.(SwitchCase).getBody() and i = -1 and name = "getBody" or result = node.(SwitchCase).getModifier(i) and name = "getModifier" @@ -1951,6 +1981,8 @@ module UnifiedFinal { final class Stmt = F::Stmt; + final class StringInterpolationExpr = F::StringInterpolationExpr; + final class StringLiteral = F::StringLiteral; final class SuperExpr = F::SuperExpr; diff --git a/unified/ql/lib/unified.dbscheme b/unified/ql/lib/unified.dbscheme index 867740617449..b32deb29d367 100644 --- a/unified/ql/lib/unified.dbscheme +++ b/unified/ql/lib/unified.dbscheme @@ -443,7 +443,7 @@ unified_equality_type_constraint_def( int right: @unified_expr ref ); -@unified_expr = @unified_array_literal | @unified_assign_expr | @unified_binary_expr | @unified_block | @unified_break_expr | @unified_bulk_importing_pattern | @unified_call_expr | @unified_compound_assign_expr | @unified_conditional_pattern | @unified_continue_expr | @unified_expr_pattern | @unified_function_expr | @unified_generic_type_expr | @unified_if_expr | @unified_key_value_pair | @unified_map_literal | @unified_member_access_expr | @unified_named_pattern | @unified_or_pattern | @unified_pattern_guard_expr | @unified_return_expr | @unified_switch_expr | @unified_throw_expr | @unified_token_boolean_literal | @unified_token_builtin_expr | @unified_token_empty_expr | @unified_token_float_literal | @unified_token_identifier | @unified_token_inferred_type_expr | @unified_token_int_literal | @unified_token_regex_literal | @unified_token_string_literal | @unified_token_super_expr | @unified_token_unsupported_node | @unified_try_expr | @unified_tuple_expr | @unified_type_cast_expr | @unified_type_test_expr | @unified_unary_expr | @unified_unresolved_operator_sequence +@unified_expr = @unified_array_literal | @unified_assign_expr | @unified_binary_expr | @unified_block | @unified_break_expr | @unified_bulk_importing_pattern | @unified_call_expr | @unified_compound_assign_expr | @unified_conditional_pattern | @unified_continue_expr | @unified_expr_pattern | @unified_function_expr | @unified_generic_type_expr | @unified_if_expr | @unified_key_value_pair | @unified_map_literal | @unified_member_access_expr | @unified_named_pattern | @unified_or_pattern | @unified_pattern_guard_expr | @unified_return_expr | @unified_string_interpolation_expr | @unified_switch_expr | @unified_throw_expr | @unified_token_boolean_literal | @unified_token_builtin_expr | @unified_token_empty_expr | @unified_token_float_literal | @unified_token_identifier | @unified_token_inferred_type_expr | @unified_token_int_literal | @unified_token_regex_literal | @unified_token_string_literal | @unified_token_super_expr | @unified_token_unsupported_node | @unified_try_expr | @unified_tuple_expr | @unified_type_cast_expr | @unified_type_test_expr | @unified_unary_expr | @unified_unresolved_operator_sequence @unified_expr_or_operator = @unified_expr | @unified_token_infix_operator @@ -756,6 +756,24 @@ unified_return_expr_def( @unified_stmt = @unified_accessor_declaration | @unified_class_like_declaration | @unified_constructor_declaration | @unified_destructor_declaration | @unified_do_while_stmt | @unified_expr | @unified_for_each_stmt | @unified_function_declaration | @unified_guard_if_stmt | @unified_import_declaration | @unified_labeled_stmt | @unified_operator_syntax_declaration | @unified_type_alias_declaration | @unified_variable_declaration | @unified_while_stmt +#keyset[unified_string_interpolation_expr, index] +unified_string_interpolation_expr_element( + int unified_string_interpolation_expr: @unified_string_interpolation_expr ref, + int index: int ref, + unique int element: @unified_expr ref +); + +#keyset[unified_string_interpolation_expr, index] +unified_string_interpolation_expr_modifier( + int unified_string_interpolation_expr: @unified_string_interpolation_expr ref, + int index: int ref, + unique int modifier: @unified_token_modifier ref +); + +unified_string_interpolation_expr_def( + unique int id: @unified_string_interpolation_expr +); + #keyset[unified_switch_case, index] unified_switch_case_modifier( int unified_switch_case: @unified_switch_case ref, @@ -989,7 +1007,7 @@ unified_trivia_tokeninfo( string value: string ref ); -@unified_ast_node = @unified_accessor_declaration | @unified_argument | @unified_array_literal | @unified_assign_expr | @unified_associated_type_declaration | @unified_base_type | @unified_binary_expr | @unified_block | @unified_bound_type_constraint | @unified_break_expr | @unified_bulk_importing_pattern | @unified_call_expr | @unified_catch_clause | @unified_class_like_declaration | @unified_compound_assign_expr | @unified_conditional_pattern | @unified_constructor_declaration | @unified_continue_expr | @unified_destructor_declaration | @unified_do_while_stmt | @unified_equality_type_constraint | @unified_expr_pattern | @unified_for_each_stmt | @unified_function_declaration | @unified_function_expr | @unified_generic_type_expr | @unified_guard_if_stmt | @unified_if_expr | @unified_import_declaration | @unified_initializer_declaration | @unified_key_value_pair | @unified_labeled_stmt | @unified_map_literal | @unified_member_access_expr | @unified_named_pattern | @unified_operator_syntax_declaration | @unified_or_pattern | @unified_parameter | @unified_pattern_guard_expr | @unified_return_expr | @unified_switch_case | @unified_switch_expr | @unified_throw_expr | @unified_token | @unified_top_level | @unified_trivia_token | @unified_try_expr | @unified_tuple_expr | @unified_type_alias_declaration | @unified_type_cast_expr | @unified_type_parameter | @unified_type_test_expr | @unified_unary_expr | @unified_unresolved_operator_sequence | @unified_variable_declaration | @unified_while_stmt +@unified_ast_node = @unified_accessor_declaration | @unified_argument | @unified_array_literal | @unified_assign_expr | @unified_associated_type_declaration | @unified_base_type | @unified_binary_expr | @unified_block | @unified_bound_type_constraint | @unified_break_expr | @unified_bulk_importing_pattern | @unified_call_expr | @unified_catch_clause | @unified_class_like_declaration | @unified_compound_assign_expr | @unified_conditional_pattern | @unified_constructor_declaration | @unified_continue_expr | @unified_destructor_declaration | @unified_do_while_stmt | @unified_equality_type_constraint | @unified_expr_pattern | @unified_for_each_stmt | @unified_function_declaration | @unified_function_expr | @unified_generic_type_expr | @unified_guard_if_stmt | @unified_if_expr | @unified_import_declaration | @unified_initializer_declaration | @unified_key_value_pair | @unified_labeled_stmt | @unified_map_literal | @unified_member_access_expr | @unified_named_pattern | @unified_operator_syntax_declaration | @unified_or_pattern | @unified_parameter | @unified_pattern_guard_expr | @unified_return_expr | @unified_string_interpolation_expr | @unified_switch_case | @unified_switch_expr | @unified_throw_expr | @unified_token | @unified_top_level | @unified_trivia_token | @unified_try_expr | @unified_tuple_expr | @unified_type_alias_declaration | @unified_type_cast_expr | @unified_type_parameter | @unified_type_test_expr | @unified_unary_expr | @unified_unresolved_operator_sequence | @unified_variable_declaration | @unified_while_stmt unified_ast_node_location( unique int node: @unified_ast_node ref, From 4228e6c621ae66f82c487a7bbad82039debcef59 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 14 Aug 2026 12:54:51 +0200 Subject: [PATCH 0866/2098] unified: Add string interpolation corpus test --- .../literals/string-with-interpolation.output | 121 +++++++++++++++++- .../literals/string-with-interpolation.swift | 10 ++ 2 files changed, 130 insertions(+), 1 deletion(-) diff --git a/unified/extractor/tests/corpus/swift/literals/string-with-interpolation.output b/unified/extractor/tests/corpus/swift/literals/string-with-interpolation.output index 5207085d174c..273991dc3db6 100644 --- a/unified/extractor/tests/corpus/swift/literals/string-with-interpolation.output +++ b/unified/extractor/tests/corpus/swift/literals/string-with-interpolation.output @@ -1,5 +1,15 @@ +// Simple interpolation "hello \(name)" +// Multiple interpolations +"hello \(first) \(last)" + +// Interpolation with expression +"result: \(x + y)" + +// Plain string before and after interpolation +"prefix \(value) suffix" + --- sourceFile @@ -24,10 +34,119 @@ sourceFile baseName: identifier "name" stringSegment content: stringSegment + codeBlockItem + item: + stringLiteralExpr + closingQuote: " + openingQuote: " + segments: + stringSegment + content: stringSegment "hello " + expressionSegment + leftParen: ( + rightParen: ) + backslash: \ + expressions: + labeledExpr + expression: + declReferenceExpr + baseName: identifier "first" + stringSegment + content: stringSegment " " + expressionSegment + leftParen: ( + rightParen: ) + backslash: \ + expressions: + labeledExpr + expression: + declReferenceExpr + baseName: identifier "last" + stringSegment + content: stringSegment + codeBlockItem + item: + stringLiteralExpr + closingQuote: " + openingQuote: " + segments: + stringSegment + content: stringSegment "result: " + expressionSegment + leftParen: ( + rightParen: ) + backslash: \ + expressions: + labeledExpr + expression: + infixOperatorExpr + operator: + binaryOperatorExpr + operator: binaryOperator "+" + leftOperand: + declReferenceExpr + baseName: identifier "x" + rightOperand: + declReferenceExpr + baseName: identifier "y" + stringSegment + content: stringSegment + codeBlockItem + item: + stringLiteralExpr + closingQuote: " + openingQuote: " + segments: + stringSegment + content: stringSegment "prefix " + expressionSegment + leftParen: ( + rightParen: ) + backslash: \ + expressions: + labeledExpr + expression: + declReferenceExpr + baseName: identifier "value" + stringSegment + content: stringSegment " suffix" --- top_level body: block - stmt: string_literal "\"hello \\(name)\"" + stmt: + string_interpolation_expr + element: + string_literal "hello " + name_expr + identifier: identifier "name" + string_literal + string_interpolation_expr + element: + string_literal "hello " + name_expr + identifier: identifier "first" + string_literal " " + name_expr + identifier: identifier "last" + string_literal + string_interpolation_expr + element: + string_literal "result: " + binary_expr + left: + name_expr + identifier: identifier "x" + operator: infix_operator "+" + right: + name_expr + identifier: identifier "y" + string_literal + string_interpolation_expr + element: + string_literal "prefix " + name_expr + identifier: identifier "value" + string_literal " suffix" diff --git a/unified/extractor/tests/corpus/swift/literals/string-with-interpolation.swift b/unified/extractor/tests/corpus/swift/literals/string-with-interpolation.swift index 4c58b37b89e7..a4cbd681a367 100644 --- a/unified/extractor/tests/corpus/swift/literals/string-with-interpolation.swift +++ b/unified/extractor/tests/corpus/swift/literals/string-with-interpolation.swift @@ -1 +1,11 @@ +// Simple interpolation "hello \(name)" + +// Multiple interpolations +"hello \(first) \(last)" + +// Interpolation with expression +"result: \(x + y)" + +// Plain string before and after interpolation +"prefix \(value) suffix" From 03eb9969780b3de7fdc26e5ad7f46e8eb937bfc4 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 14 Aug 2026 13:30:45 +0200 Subject: [PATCH 0867/2098] unified: Add AST mappings for string interpolation --- .../extractor/src/languages/swift/swift.rs | 24 ++- .../literals/string-with-interpolation.output | 200 ++++++++++++++++-- .../literals/string-with-interpolation.swift | 6 + 3 files changed, 211 insertions(+), 19 deletions(-) diff --git a/unified/extractor/src/languages/swift/swift.rs b/unified/extractor/src/languages/swift/swift.rs index 960900070ba0..fdaa41ff0ba1 100644 --- a/unified/extractor/src/languages/swift/swift.rs +++ b/unified/extractor/src/languages/swift/swift.rs @@ -173,9 +173,27 @@ fn translation_rules() -> Vec> { rule!((nilLiteralExpr) @@node => expr { tree!((builtin_expr #{node})) }), - rule!((stringLiteralExpr) @@node => expr { - tree!((string_literal #{node})) - }), + rule!((simpleStringLiteralExpr) @@node => (string_literal #{node})), + // String literal with a single constant segment (for some reason not typed as simpleStringLiteralExpr) + rule!( + (stringLiteralExpr segments: (stringSegment) segments: _* @@rest) @@node + where rest.is_empty() + => + (string_literal #{node}) + ), + rule!( + (stringLiteralExpr segments: _* @segments) + => + (string_interpolation_expr element: {segments}) + ), + rule!((stringSegment content: @@content) => (string_literal #{content})), + rule!( + (expressionSegment expressions: _* @expressions) + => + (call_expr + callee: (builtin_expr "interpolation") + argument: {expressions}) + ), rule!((regexLiteralExpr) @@node => expr { tree!((regex_literal #{node})) }), diff --git a/unified/extractor/tests/corpus/swift/literals/string-with-interpolation.output b/unified/extractor/tests/corpus/swift/literals/string-with-interpolation.output index 273991dc3db6..4d8a2706c66e 100644 --- a/unified/extractor/tests/corpus/swift/literals/string-with-interpolation.output +++ b/unified/extractor/tests/corpus/swift/literals/string-with-interpolation.output @@ -10,6 +10,12 @@ // Plain string before and after interpolation "prefix \(value) suffix" +// Calls to custom DefaultStringInterpolation.appendInterpolation impls +"foo \(x, y)" +"foo \(x, y, z)" +"foo \(arg: x)" +"foo \(arg: x, arg2: y)" + --- sourceFile @@ -110,6 +116,108 @@ sourceFile baseName: identifier "value" stringSegment content: stringSegment " suffix" + codeBlockItem + item: + stringLiteralExpr + closingQuote: " + openingQuote: " + segments: + stringSegment + content: stringSegment "foo " + expressionSegment + leftParen: ( + rightParen: ) + backslash: \ + expressions: + labeledExpr + expression: + declReferenceExpr + baseName: identifier "x" + trailingComma: , + labeledExpr + expression: + declReferenceExpr + baseName: identifier "y" + stringSegment + content: stringSegment + codeBlockItem + item: + stringLiteralExpr + closingQuote: " + openingQuote: " + segments: + stringSegment + content: stringSegment "foo " + expressionSegment + leftParen: ( + rightParen: ) + backslash: \ + expressions: + labeledExpr + expression: + declReferenceExpr + baseName: identifier "x" + trailingComma: , + labeledExpr + expression: + declReferenceExpr + baseName: identifier "y" + trailingComma: , + labeledExpr + expression: + declReferenceExpr + baseName: identifier "z" + stringSegment + content: stringSegment + codeBlockItem + item: + stringLiteralExpr + closingQuote: " + openingQuote: " + segments: + stringSegment + content: stringSegment "foo " + expressionSegment + leftParen: ( + rightParen: ) + backslash: \ + expressions: + labeledExpr + colon: : + label: identifier "arg" + expression: + declReferenceExpr + baseName: identifier "x" + stringSegment + content: stringSegment + codeBlockItem + item: + stringLiteralExpr + closingQuote: " + openingQuote: " + segments: + stringSegment + content: stringSegment "foo " + expressionSegment + leftParen: ( + rightParen: ) + backslash: \ + expressions: + labeledExpr + colon: : + label: identifier "arg" + expression: + declReferenceExpr + baseName: identifier "x" + trailingComma: , + labeledExpr + colon: : + label: identifier "arg2" + expression: + declReferenceExpr + baseName: identifier "y" + stringSegment + content: stringSegment --- @@ -120,33 +228,93 @@ top_level string_interpolation_expr element: string_literal "hello " - name_expr - identifier: identifier "name" + call_expr + callee: builtin_expr "interpolation" + argument: + argument + value: identifier "name" string_literal string_interpolation_expr element: string_literal "hello " - name_expr - identifier: identifier "first" + call_expr + callee: builtin_expr "interpolation" + argument: + argument + value: identifier "first" string_literal " " - name_expr - identifier: identifier "last" + call_expr + callee: builtin_expr "interpolation" + argument: + argument + value: identifier "last" string_literal string_interpolation_expr element: string_literal "result: " - binary_expr - left: - name_expr - identifier: identifier "x" - operator: infix_operator "+" - right: - name_expr - identifier: identifier "y" + call_expr + callee: builtin_expr "interpolation" + argument: + argument + value: + binary_expr + left: identifier "x" + operator: infix_operator "+" + right: identifier "y" string_literal string_interpolation_expr element: string_literal "prefix " - name_expr - identifier: identifier "value" + call_expr + callee: builtin_expr "interpolation" + argument: + argument + value: identifier "value" string_literal " suffix" + string_interpolation_expr + element: + string_literal "foo " + call_expr + callee: builtin_expr "interpolation" + argument: + argument + value: identifier "x" + argument + value: identifier "y" + string_literal + string_interpolation_expr + element: + string_literal "foo " + call_expr + callee: builtin_expr "interpolation" + argument: + argument + value: identifier "x" + argument + value: identifier "y" + argument + value: identifier "z" + string_literal + string_interpolation_expr + element: + string_literal "foo " + call_expr + callee: builtin_expr "interpolation" + argument: + argument + name_node: identifier "arg" + value: identifier "x" + string_literal + string_interpolation_expr + element: + string_literal "foo " + call_expr + callee: builtin_expr "interpolation" + argument: + argument + name_node: identifier "arg" + value: identifier "x" + argument + name_node: identifier "arg2" + value: identifier "y" + string_literal diff --git a/unified/extractor/tests/corpus/swift/literals/string-with-interpolation.swift b/unified/extractor/tests/corpus/swift/literals/string-with-interpolation.swift index a4cbd681a367..b72a94faa00c 100644 --- a/unified/extractor/tests/corpus/swift/literals/string-with-interpolation.swift +++ b/unified/extractor/tests/corpus/swift/literals/string-with-interpolation.swift @@ -9,3 +9,9 @@ // Plain string before and after interpolation "prefix \(value) suffix" + +// Calls to custom DefaultStringInterpolation.appendInterpolation impls +"foo \(x, y)" +"foo \(x, y, z)" +"foo \(arg: x)" +"foo \(arg: x, arg2: y)" From e8440b77de421f176954a3db39611f1827c428ac Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Wed, 9 Sep 2026 13:29:58 +0200 Subject: [PATCH 0868/2098] C#: Re-factor. --- csharp/ql/lib/Linq/Helpers.qll | 169 +++++++++++++++++++++------------ 1 file changed, 110 insertions(+), 59 deletions(-) diff --git a/csharp/ql/lib/Linq/Helpers.qll b/csharp/ql/lib/Linq/Helpers.qll index 052b5fe6c2e6..43083c90a2d2 100644 --- a/csharp/ql/lib/Linq/Helpers.qll +++ b/csharp/ql/lib/Linq/Helpers.qll @@ -116,6 +116,46 @@ class ForEachStmtEnumerable extends ForEachStmt { } } +private signature predicate linqCandidateSig(Stmt s, Expr e); + +private module LinqFilterOpportunity { + predicate missed(ForEachStmtGenericEnumerable fes, Stmt s) { + s = firstStmt(fes) and + // The linq candidate expression accesses the loop variable, and the + // candidate doesn't access an in, out, or ref parameter. + exists(Expr candidate | linqCandidate(s, candidate) | + fes.getVariable().getAnAccess() = candidate.getAChildExpr*() + ) + } +} + +private module LinqMapOpportunity { + predicate missed(ForEachStmt fes, Stmt s) { + s = firstStmt(fes) and + // The linq candidate (and only the candidate) expression accesses the loop variable and the + // candidate doesn't access an in, out, or ref parameter. + exists(Expr candidate | linqCandidate(s, candidate) | + forex(VariableAccess va | va = fes.getVariable().getAnAccess() | + va = candidate.getAChildExpr*() + ) + ) + } +} + +private predicate linqAllCandidate(Stmt s, Expr e) { + s = + any(IfStmt is | + e = is.getCondition() and + not exists(is.getElse()) and // The then case of the if assigns false to something and breaks out of the loop. + exists(Assignment a, BoolLiteral bl | + a = is.getThen().getAChild*() and + bl = a.getRightOperand() and + bl.toString() = "false" + ) and + is.getThen().getAChild*() instanceof BreakStmt + ) +} + /** * Holds if `foreach` statement `fes` could be converted to a `.All()` call. * That is, the `ForEachStmt` contains a single `if` with a condition that @@ -123,21 +163,20 @@ class ForEachStmtEnumerable extends ForEachStmt { * and `break`s out of the `foreach`. */ predicate missedAllOpportunity(ForEachStmtGenericEnumerable fes) { - exists(IfStmt is | - // The loop contains an if statement with no else case, and nothing else. - is = firstStmt(fes) and - numStmts(fes) = 1 and - not exists(is.getElse()) and - // The if statement accesses the loop variable. - is.getCondition().getAChildExpr*() = fes.getVariable().getAnAccess() and - // The then case of the if assigns false to something and breaks out of the loop. - exists(Assignment a, BoolLiteral bl | - a = is.getThen().getAChild*() and - bl = a.getRightOperand() and - bl.toString() = "false" - ) and - is.getThen().getAChild*() instanceof BreakStmt - ) + // The loop contains an if statement with no else case, and nothing else. + LinqFilterOpportunity::missed(fes, _) and + numStmts(fes) = 1 +} + +private predicate linqCastCandidate(Stmt s, Expr e) { + s = + any(LocalVariableDeclStmt lvds | + exists(CastExpr ce | + ce = lvds.getAVariableDeclExpr().getInitializer() and + e = ce.getExpr() and + e instanceof LocalVariableAccess + ) + ) } /** @@ -147,14 +186,18 @@ predicate missedAllOpportunity(ForEachStmtGenericEnumerable fes) { * local variable declaration statement `s`. */ predicate missedCastOpportunity(ForEachStmtEnumerable fes, LocalVariableDeclStmt s) { - s = firstStmt(fes) and - forex(VariableAccess va | va = fes.getVariable().getAnAccess() | - va = s.getAVariableDeclExpr().getAChildExpr*() - ) and - exists(CastExpr ce | - ce = s.getAVariableDeclExpr().getInitializer() and - ce.getExpr() = fes.getVariable().getAnAccess() - ) + LinqMapOpportunity::missed(fes, s) +} + +private predicate linqOfTypeCandidate(Stmt s, Expr e) { + s = + any(LocalVariableDeclStmt lvds | + exists(AsExpr ae | + ae = lvds.getAVariableDeclExpr().getInitializer() and + e = ae.getExpr() and + e instanceof LocalVariableAccess + ) + ) } /** @@ -164,14 +207,16 @@ predicate missedCastOpportunity(ForEachStmtEnumerable fes, LocalVariableDeclStmt * is a local variable declaration statement `s`. */ predicate missedOfTypeOpportunity(ForEachStmtEnumerable fes, LocalVariableDeclStmt s) { - s = firstStmt(fes) and - forex(VariableAccess va | va = fes.getVariable().getAnAccess() | - va = s.getAVariableDeclExpr().getAChildExpr*() - ) and - exists(AsExpr ae | - ae = s.getAVariableDeclExpr().getInitializer() and - ae.getExpr() = fes.getVariable().getAnAccess() - ) + LinqMapOpportunity::missed(fes, s) +} + +private predicate linqSelectCandidate(Stmt s, Expr e) { + s = + any(LocalVariableDeclStmt lvds | + e = lvds.getAVariableDeclExpr().getInitializer() and + not e instanceof Cast and + not e.getAChildExpr*() instanceof AwaitExpr + ) } /** @@ -182,12 +227,24 @@ predicate missedOfTypeOpportunity(ForEachStmtEnumerable fes, LocalVariableDeclSt * contain an `await` expression (since `Select` does not support async lambdas). */ predicate missedSelectOpportunity(ForEachStmtGenericEnumerable fes, LocalVariableDeclStmt s) { - s = firstStmt(fes) and - forex(VariableAccess va | va = fes.getVariable().getAnAccess() | - va = s.getAVariableDeclExpr().getAChildExpr*() - ) and - not s.getAVariableDeclExpr().getInitializer() instanceof Cast and - not s.getAVariableDeclExpr().getInitializer().getAChildExpr*() instanceof AwaitExpr + LinqMapOpportunity::missed(fes, s) +} + +private predicate linqWhereCandidateCase1(Stmt s, Expr e) { + s = + any(IfStmt is | + e = is.getCondition() and + is.getThen() instanceof ContinueStmt + ) +} + +private predicate linqWhereCandidateCase2(Stmt s, Expr e) { + s = + any(IfStmt is | + e = is.getCondition() and + not exists(is.getElse()) and + not terminatesCallable(is.getThen()) + ) } /** @@ -197,20 +254,21 @@ predicate missedSelectOpportunity(ForEachStmtGenericEnumerable fes, LocalVariabl * else in the loop than the `if`. */ predicate missedWhereOpportunity(ForEachStmtGenericEnumerable fes, IfStmt is) { - // The very first thing the foreach loop does is test its iteration variable. - is = firstStmt(fes) and - exists(VariableAccess va | - va.getTarget() = fes.getVariable() and - va = is.getCondition().getAChildExpr*() - ) and - // It then either (a) continues, or (b) performs the entire body of the loop within the condition. - ( - is.getThen() instanceof ContinueStmt - or - not exists(is.getElse()) and - numStmts(fes) = 1 and - not terminatesCallable(is.getThen()) - ) + // The body of the `if` is a continue. + LinqFilterOpportunity::missed(fes, is) + or + // There's nothing else in the loop than the `if`. + LinqFilterOpportunity::missed(fes, is) and + numStmts(fes) = 1 +} + +private predicate linqFirstOrDefaultCandidate(Stmt s, Expr e) { + s = + any(IfStmt is | + e = is.getCondition() and + not exists(is.getElse()) and + not e.getAChildExpr*() instanceof AwaitExpr + ) } /** @@ -220,15 +278,8 @@ predicate missedWhereOpportunity(ForEachStmtGenericEnumerable fes, IfStmt is) { */ predicate missedFirstOrDefaultOpportunity(ForEachStmtGenericEnumerable fes, IfStmt is) { // The loop only checks whether the current element is the first match. - is = firstStmt(fes) and - not exists(is.getElse()) and + LinqFilterOpportunity::missed(fes, is) and numStmts(fes) = 1 and - // Condition relies on loop variable. - exists(VariableAccess va | - va.getTarget() = fes.getVariable() and - va = is.getCondition().getAChildExpr*() - ) and - not is.getCondition().getAChildExpr*() instanceof AwaitExpr and not fes.isAsync() and not fes.getVariable().isCaptured() and returnsLoopVariable(fes, is.getThen()) and From a61705322e3a981825c29e2abcc0741005ea4456 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 10 Sep 2026 14:12:38 +0200 Subject: [PATCH 0869/2098] C#: Remove cases where suggestion would result in capturing expressions that access in/out or ref parameters. --- csharp/ql/lib/Linq/Helpers.qll | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/csharp/ql/lib/Linq/Helpers.qll b/csharp/ql/lib/Linq/Helpers.qll index 43083c90a2d2..66ade5db5387 100644 --- a/csharp/ql/lib/Linq/Helpers.qll +++ b/csharp/ql/lib/Linq/Helpers.qll @@ -116,6 +116,14 @@ class ForEachStmtEnumerable extends ForEachStmt { } } +bindingset[e] +private predicate acceptableForLinqCapture(Expr e) { + not exists(ParameterAccess pa, Parameter p | p = pa.getTarget() | + pa = e.getAChildExpr*() and + (p.isOutOrRef() or p.isIn() or p.isReadonlyRef()) + ) +} + private signature predicate linqCandidateSig(Stmt s, Expr e); private module LinqFilterOpportunity { @@ -124,7 +132,8 @@ private module LinqFilterOpportunity { // The linq candidate expression accesses the loop variable, and the // candidate doesn't access an in, out, or ref parameter. exists(Expr candidate | linqCandidate(s, candidate) | - fes.getVariable().getAnAccess() = candidate.getAChildExpr*() + fes.getVariable().getAnAccess() = candidate.getAChildExpr*() and + acceptableForLinqCapture(candidate) ) } } @@ -137,7 +146,8 @@ private module LinqMapOpportunity { exists(Expr candidate | linqCandidate(s, candidate) | forex(VariableAccess va | va = fes.getVariable().getAnAccess() | va = candidate.getAChildExpr*() - ) + ) and + acceptableForLinqCapture(candidate) ) } } From 722a5509aa5f0abb3cf5c334468cbbdc8d631bb8 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 10 Sep 2026 14:14:34 +0200 Subject: [PATCH 0870/2098] C#: Update test expected output. --- .../Linq/MissedAllOpportunity/MissedAllOpportunity.expected | 4 ---- .../MissedFirstOrDefaultOpportunity.expected | 4 ---- .../MissedSelectOpportunity/MissedSelectOpportunity.expected | 4 ---- .../MissedWhereOpportunity/MissedWhereOpportunity.expected | 4 ---- 4 files changed, 16 deletions(-) diff --git a/csharp/ql/test/query-tests/Linq/MissedAllOpportunity/MissedAllOpportunity.expected b/csharp/ql/test/query-tests/Linq/MissedAllOpportunity/MissedAllOpportunity.expected index 67203c735f1e..b4300f8caf07 100644 --- a/csharp/ql/test/query-tests/Linq/MissedAllOpportunity/MissedAllOpportunity.expected +++ b/csharp/ql/test/query-tests/Linq/MissedAllOpportunity/MissedAllOpportunity.expected @@ -1,5 +1 @@ -#select | MissedAllOpportunity.cs:11:9:18:9 | foreach (... ... in ...) ... | This foreach loop looks as if it might be testing whether every sequence element satisfies a predicate - consider using '.All(...)'. | -| MissedAllOpportunity.cs:39:9:46:9 | foreach (... ... in ...) ... | This foreach loop looks as if it might be testing whether every sequence element satisfies a predicate - consider using '.All(...)'. | -testFailures -| MissedAllOpportunity.cs:39:9:46:9 | This foreach loop looks as if it might be testing whether every sequence element satisfies a predicate - consider using '.All(...)'. | Unexpected result: Alert | diff --git a/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.expected b/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.expected index aba54e7933cb..b4cfdff5fdd9 100644 --- a/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.expected +++ b/csharp/ql/test/query-tests/Linq/MissedFirstOrDefaultOpportunity/MissedFirstOrDefaultOpportunity.expected @@ -1,9 +1,5 @@ -#select | MissedFirstOrDefaultOpportunity.cs:10:9:14:9 | foreach (... ... in ...) ... | This foreach loop returns the first sequence element satisfying a $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | MissedFirstOrDefaultOpportunity.cs:12:17:12:91 | call to method Equals | predicate | | MissedFirstOrDefaultOpportunity.cs:22:9:28:9 | foreach (... ... in ...) ... | This foreach loop returns the first sequence element satisfying a $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | MissedFirstOrDefaultOpportunity.cs:24:17:24:25 | ... > ... | predicate | | MissedFirstOrDefaultOpportunity.cs:36:9:40:9 | foreach (... ... in ...) ... | This foreach loop returns the first sequence element satisfying a $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | MissedFirstOrDefaultOpportunity.cs:38:17:38:25 | ... > ... | predicate | | MissedFirstOrDefaultOpportunity.cs:149:9:153:9 | foreach (... ... in ...) ... | This foreach loop returns the first sequence element satisfying a $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | MissedFirstOrDefaultOpportunity.cs:151:17:151:32 | ... > ... | predicate | | MissedFirstOrDefaultOpportunity.cs:161:9:165:9 | foreach (... ... in ...) ... | This foreach loop returns the first sequence element satisfying a $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | MissedFirstOrDefaultOpportunity.cs:163:17:163:25 | ... > ... | predicate | -| MissedFirstOrDefaultOpportunity.cs:185:9:191:9 | foreach (... ... in ...) ... | This foreach loop returns the first sequence element satisfying a $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | MissedFirstOrDefaultOpportunity.cs:187:17:187:25 | ... > ... | predicate | -testFailures -| MissedFirstOrDefaultOpportunity.cs:185:9:191:9 | This foreach loop returns the first sequence element satisfying a $@ - consider finding the element explicitly using '.FirstOrDefault(...)'. | Unexpected result: Alert | diff --git a/csharp/ql/test/query-tests/Linq/MissedSelectOpportunity/MissedSelectOpportunity.expected b/csharp/ql/test/query-tests/Linq/MissedSelectOpportunity/MissedSelectOpportunity.expected index b84ec32441f4..bc6d464fa3b9 100644 --- a/csharp/ql/test/query-tests/Linq/MissedSelectOpportunity/MissedSelectOpportunity.expected +++ b/csharp/ql/test/query-tests/Linq/MissedSelectOpportunity/MissedSelectOpportunity.expected @@ -1,5 +1 @@ -#select | MissedSelectOpportunity.cs:11:9:15:9 | foreach (... ... in ...) ... | This foreach loop immediately $@ - consider mapping the sequence explicitly using '.Select(...)'. | MissedSelectOpportunity.cs:13:13:13:26 | ... ...; | maps its iteration variable to another variable | -| MissedSelectOpportunity.cs:32:9:36:9 | foreach (... ... in ...) ... | This foreach loop immediately $@ - consider mapping the sequence explicitly using '.Select(...)'. | MissedSelectOpportunity.cs:34:13:34:26 | ... ...; | maps its iteration variable to another variable | -testFailures -| MissedSelectOpportunity.cs:32:9:36:9 | This foreach loop immediately $@ - consider mapping the sequence explicitly using '.Select(...)'. | Unexpected result: Alert | diff --git a/csharp/ql/test/query-tests/Linq/MissedWhereOpportunity/MissedWhereOpportunity.expected b/csharp/ql/test/query-tests/Linq/MissedWhereOpportunity/MissedWhereOpportunity.expected index 20c2cece7605..8b9398292ef2 100644 --- a/csharp/ql/test/query-tests/Linq/MissedWhereOpportunity/MissedWhereOpportunity.expected +++ b/csharp/ql/test/query-tests/Linq/MissedWhereOpportunity/MissedWhereOpportunity.expected @@ -1,9 +1,5 @@ -#select | MissedWhereOpportunity.cs:10:9:16:9 | foreach (... ... in ...) ... | This foreach loop $@ - consider filtering the sequence explicitly using '.Where(...)'. | MissedWhereOpportunity.cs:12:17:12:26 | ... != ... | implicitly filters its target sequence | | MissedWhereOpportunity.cs:19:9:26:9 | foreach (... ... in ...) ... | This foreach loop $@ - consider filtering the sequence explicitly using '.Where(...)'. | MissedWhereOpportunity.cs:21:17:21:26 | ... == ... | implicitly filters its target sequence | | MissedWhereOpportunity.cs:45:9:52:9 | foreach (... ... in ...) ... | This foreach loop $@ - consider filtering the sequence explicitly using '.Where(...)'. | MissedWhereOpportunity.cs:47:17:47:26 | ... == ... | implicitly filters its target sequence | | MissedWhereOpportunity.cs:70:9:76:9 | foreach (... ... in ...) ... | This foreach loop $@ - consider filtering the sequence explicitly using '.Where(...)'. | MissedWhereOpportunity.cs:72:17:72:46 | ... == ... | implicitly filters its target sequence | | MissedWhereOpportunity.cs:120:9:126:9 | foreach (... ... in ...) ... | This foreach loop $@ - consider filtering the sequence explicitly using '.Where(...)'. | MissedWhereOpportunity.cs:122:17:122:46 | ... == ... | implicitly filters its target sequence | -| MissedWhereOpportunity.cs:180:9:186:9 | foreach (... ... in ...) ... | This foreach loop $@ - consider filtering the sequence explicitly using '.Where(...)'. | MissedWhereOpportunity.cs:182:17:182:26 | ... != ... | implicitly filters its target sequence | -testFailures -| MissedWhereOpportunity.cs:180:9:186:9 | This foreach loop $@ - consider filtering the sequence explicitly using '.Where(...)'. | Unexpected result: Alert | From 2a5ebb85921ffe83ed284fe89d2297765a31f15d Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 10 Sep 2026 14:55:33 +0200 Subject: [PATCH 0871/2098] C#: Add change note. --- csharp/ql/src/change-notes/2026-09-10-missed-linq-inoutref.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 csharp/ql/src/change-notes/2026-09-10-missed-linq-inoutref.md diff --git a/csharp/ql/src/change-notes/2026-09-10-missed-linq-inoutref.md b/csharp/ql/src/change-notes/2026-09-10-missed-linq-inoutref.md new file mode 100644 index 000000000000..400e0bcd2ed0 --- /dev/null +++ b/csharp/ql/src/change-notes/2026-09-10-missed-linq-inoutref.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `cs/linq/missed-*` queries no longer suggest rewrites that would capture `in`, `out`, or `ref` parameters in a lambda, fixing false-positive results for transformations that would not compile. From 277a2822f98c38161978e22c17ba2550baaa37d4 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 11 Sep 2026 11:26:23 +0200 Subject: [PATCH 0872/2098] unified: Add qltest with string interpolation --- .../test/library-tests/BasicTest/strings.swift | 5 ++++- .../test/library-tests/BasicTest/test.expected | 18 +++++++++++++++--- .../ql/test/library-tests/BasicTest/test.ql | 4 +++- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/unified/ql/test/library-tests/BasicTest/strings.swift b/unified/ql/test/library-tests/BasicTest/strings.swift index db9ae84e980b..0015521eae05 100644 --- a/unified/ql/test/library-tests/BasicTest/strings.swift +++ b/unified/ql/test/library-tests/BasicTest/strings.swift @@ -1 +1,4 @@ -let x = "hello" +let x1 = "hello" +let x2 = "hello \(123) world" +let x3 = "hello \(arg: 123) world" +let x4 = "hello \(1, 2, 3) world" diff --git a/unified/ql/test/library-tests/BasicTest/test.expected b/unified/ql/test/library-tests/BasicTest/test.expected index 0194a63380d7..e38b3e982635 100644 --- a/unified/ql/test/library-tests/BasicTest/test.expected +++ b/unified/ql/test/library-tests/BasicTest/test.expected @@ -1,7 +1,11 @@ identifier | name_expr.swift:1:5:1:5 | x | x | | name_expr.swift:1:9:1:9 | y | y | -| strings.swift:1:5:1:5 | x | x | +| strings.swift:1:5:1:6 | x1 | x1 | +| strings.swift:2:5:2:6 | x2 | x2 | +| strings.swift:3:5:3:6 | x3 | x3 | +| strings.swift:3:19:3:21 | arg | arg | +| strings.swift:4:5:4:6 | x4 | x4 | | test.swift:1:8:1:17 | Foundation | Foundation | | test.swift:1:8:1:17 | Foundation | Foundation | | test.swift:4:8:4:16 | Container | Container | @@ -151,5 +155,13 @@ identifier namedPattern | test.swift:1:1:1:17 | NamedPattern | Foundation | unsupported -stringValue -| strings.swift:1:9:1:15 | "hello" | "hello" | +rawStringValue +| strings.swift:1:10:1:16 | "hello" | "hello" | +| strings.swift:2:11:2:16 | hello | hello | +| strings.swift:2:23:2:28 | world | world | +| strings.swift:3:11:3:16 | hello | hello | +| strings.swift:3:28:3:33 | world | world | +| strings.swift:4:11:4:16 | hello | hello | +| strings.swift:4:27:4:32 | world | world | +exprStringValue +| strings.swift:1:10:1:16 | "hello" | hello | diff --git a/unified/ql/test/library-tests/BasicTest/test.ql b/unified/ql/test/library-tests/BasicTest/test.ql index 75fea1330e4a..62f5ac850e6e 100644 --- a/unified/ql/test/library-tests/BasicTest/test.ql +++ b/unified/ql/test/library-tests/BasicTest/test.ql @@ -6,4 +6,6 @@ query predicate namedPattern(NamedPattern node, string value) { value = node.get query predicate unsupported(UnsupportedNode node, string value) { value = node.getValue() } -query predicate stringValue(StringLiteral e, string value) { value = e.getValue() } +query predicate rawStringValue(StringLiteral e, string value) { value = e.getValue() } + +query predicate exprStringValue(Expr e, string value) { value = e.getStringValue() } From d9af62cf4965f81c88bf1c9963fd27ae5fbe1136 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 11 Sep 2026 11:29:41 +0200 Subject: [PATCH 0873/2098] unified: Handle string segments in Expr.getStringValue() --- unified/ql/lib/codeql/unified/internal/FacadeAst.qll | 8 +++++++- unified/ql/test/library-tests/BasicTest/test.expected | 6 ++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll index dcec57f0a4ae..77885e7c2d25 100644 --- a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll +++ b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll @@ -53,7 +53,13 @@ module Unified { string getStringValue() { // TODO: we'll want to cook the string literals extractor-side, but for now // just strip the quotes here and ignore escape sequences. - result = this.(StringLiteral).getValue().regexpCapture("\"(.*)\"", 1) + exists(string text | text = this.(StringLiteral).getValue() | + result = text.regexpCapture("\"(.*)\"", 1) + or + // Constant-segments of string interpolations are represented as string literals, but their raw text does not have quotes + not exists(text.regexpCapture("\"(.*)\"", 1)) and + result = text + ) } /** Gets the immediately-enclosing expression, skipping over intermediate sub-nodes like `Argument`, and without crossing a function boundary. */ diff --git a/unified/ql/test/library-tests/BasicTest/test.expected b/unified/ql/test/library-tests/BasicTest/test.expected index e38b3e982635..711b05c12d4c 100644 --- a/unified/ql/test/library-tests/BasicTest/test.expected +++ b/unified/ql/test/library-tests/BasicTest/test.expected @@ -165,3 +165,9 @@ rawStringValue | strings.swift:4:27:4:32 | world | world | exprStringValue | strings.swift:1:10:1:16 | "hello" | hello | +| strings.swift:2:11:2:16 | hello | hello | +| strings.swift:2:23:2:28 | world | world | +| strings.swift:3:11:3:16 | hello | hello | +| strings.swift:3:28:3:33 | world | world | +| strings.swift:4:11:4:16 | hello | hello | +| strings.swift:4:27:4:32 | world | world | From 7e365ed58b4104c39bae3bb4be0bcad34b41d450 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 11 Sep 2026 11:42:00 +0200 Subject: [PATCH 0874/2098] unified: Elaborate on getEnclosingCallable --- unified/ql/lib/codeql/unified/internal/FacadeAst.qll | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll index ad66ed6864b9..1968133e76bd 100644 --- a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll +++ b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll @@ -42,7 +42,16 @@ module Unified { ) } - /** Gets the nearest callable containing this AST node. */ + /** + * Gets the nearest callable containing this AST node. + * + * If this node is itself a callable, this gets the outer callable, not the node itself. + * + * Note that the `TopLevel` is callable, so all nodes other than the `TopLevel` itself has an enclosing callable. + * + * In some cases this predicate skips overs the syntactically-enclosing callable in order to get the callable in which + * the AST is actually evaluated (such as for capture declarations in a function expression). + */ Callable getEnclosingCallable() { exists(AstNode parent | parent = this.overrideEnclosingCallableParent() From e7772a22a60cac3a573c6910811be90d237f554d Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 11 Sep 2026 11:45:33 +0200 Subject: [PATCH 0875/2098] unified: More typo fixes --- unified/ql/lib/codeql/unified/internal/FacadeAst.qll | 2 +- unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll index 1968133e76bd..f5ad7e6b29a5 100644 --- a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll +++ b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll @@ -23,7 +23,7 @@ module Unified { ) } - /** Gets the nearest enclosing class declaration. */ + /** Gets the nearest enclosing class declaration, if any. */ ClassLikeDeclaration getEnclosingClass() { exists(AstNode parent | parent = this.getParent() | result = parent diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 044c5d421d60..230608b682f8 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -648,7 +648,7 @@ module Public { unqualifiedMemberAccess(this, instanceAccess, target, accessingClass) } - /** Gets the name declaration of the member being accessed. */ + /** Gets the name binding of the member being accessed. */ NameBinding getTarget() { result = target } /** Gets the enclosing class whose (possibly inherited) member is being accessed. */ From c5d5827b655f8d6f88e7de5a51eeec4aacf5b064 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 10 Sep 2026 15:30:52 +0200 Subject: [PATCH 0876/2098] C#: Rename Dependabot to Registry, update log messages and slightly improve some unit tests comments. --- .../DependencyManager.cs | 10 +-- .../DotNet.cs | 4 +- .../DotNetCliInvoker.cs | 8 +- .../EnvironmentVariableNames.cs | 6 +- .../FeedManager.cs | 10 +-- .../FeedManagerIO.cs | 18 ++-- ...{IDependabotProxy.cs => IRegistryProxy.cs} | 6 +- ...tion.cs => IRegistryProxyConfiguration.cs} | 10 +-- .../NugetPackageRestorer.cs | 4 +- .../{DependabotProxy.cs => RegistryProxy.cs} | 28 +++--- ...ation.cs => RegistryProxyConfiguration.cs} | 2 +- .../Semmle.Extraction.Tests/FeedManager.cs | 28 +++--- .../{DependabotProxy.cs => RegistryProxy.cs} | 85 +++++++++---------- 13 files changed, 109 insertions(+), 110 deletions(-) rename csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/{IDependabotProxy.cs => IRegistryProxy.cs} (82%) rename csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/{IDependabotProxyConfiguration.cs => IRegistryProxyConfiguration.cs} (64%) rename csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/{DependabotProxy.cs => RegistryProxy.cs} (84%) rename csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/{DependabotProxyConfiguration.cs => RegistryProxyConfiguration.cs} (87%) rename csharp/extractor/Semmle.Extraction.Tests/{DependabotProxy.cs => RegistryProxy.cs} (67%) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs index a985947c0c12..4bd0bb764a66 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs @@ -27,7 +27,7 @@ public sealed partial class DependencyManager : IDisposable, ICompilationInfoCon private readonly ILogger logger; private readonly IDiagnosticsWriter diagnosticsWriter; private readonly NugetPackageRestorer nugetPackageRestorer; - private readonly IDependabotProxy? dependabotProxy; + private readonly IRegistryProxy? registryProxy; private readonly IDotNet dotnet; private readonly FileContent fileContent; private readonly IFileProvider fileProvider; @@ -106,11 +106,11 @@ void exitCallback(int ret, string msg, bool silent) return BuildScript.Success; }).Run(SystemBuildActions.Instance, startCallback, exitCallback); - dependabotProxy = DependabotProxy.Make(logger, diagnosticsWriter, tempWorkingDirectory); + registryProxy = RegistryProxy.Make(logger, diagnosticsWriter, tempWorkingDirectory); try { - this.dotnet = DotNet.Make(logger, dotnetPath, tempWorkingDirectory, dependabotProxy); + this.dotnet = DotNet.Make(logger, dotnetPath, tempWorkingDirectory, registryProxy); runtimeLazy = new Lazy(() => new Runtime(dotnet)); } catch @@ -119,7 +119,7 @@ void exitCallback(int ret, string msg, bool silent) throw; } - nugetPackageRestorer = new NugetPackageRestorer(fileProvider, fileContent, dotnet, dependabotProxy, diagnosticsWriter, logger, this); + nugetPackageRestorer = new NugetPackageRestorer(fileProvider, fileContent, dotnet, registryProxy, diagnosticsWriter, logger, this); var dllLocations = fileProvider.Dlls.Select(x => new AssemblyLookupLocation(x)).ToHashSet(); dllLocations.UnionWith(nugetPackageRestorer.Restore()); @@ -544,7 +544,7 @@ private void AnalyseProject(FileInfo project) public void Dispose() { nugetPackageRestorer?.Dispose(); - dependabotProxy?.Dispose(); + registryProxy?.Dispose(); if (cleanupTempWorkingDirectory) { tempWorkingDirectory?.Dispose(); diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs index 340d86eb3914..babb811b25f0 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs @@ -31,11 +31,11 @@ private DotNet(IDotNetCliInvoker dotnetCliInvoker, ILogger logger, bool runDotne } } - private DotNet(ILogger logger, string? dotNetPath, TemporaryDirectory tempWorkingDirectory, IDependabotProxy? dependabotProxy) : this(new DotNetCliInvoker(logger, Path.Join(dotNetPath ?? string.Empty, "dotnet"), dependabotProxy), logger, dotNetPath is null, tempWorkingDirectory) { } + private DotNet(ILogger logger, string? dotNetPath, TemporaryDirectory tempWorkingDirectory, IRegistryProxy? registryProxy) : this(new DotNetCliInvoker(logger, Path.Join(dotNetPath ?? string.Empty, "dotnet"), registryProxy), logger, dotNetPath is null, tempWorkingDirectory) { } internal static IDotNet Make(IDotNetCliInvoker dotnetCliInvoker, ILogger logger, bool runDotnetInfo) => new DotNet(dotnetCliInvoker, logger, runDotnetInfo); - public static IDotNet Make(ILogger logger, string? dotNetPath, TemporaryDirectory tempWorkingDirectory, IDependabotProxy? dependabotProxy) => new DotNet(logger, dotNetPath, tempWorkingDirectory, dependabotProxy); + public static IDotNet Make(ILogger logger, string? dotNetPath, TemporaryDirectory tempWorkingDirectory, IRegistryProxy? registryProxy) => new DotNet(logger, dotNetPath, tempWorkingDirectory, registryProxy); private static void HandleRetryExitCode143(string dotnet, int attempt, ILogger logger) { diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNetCliInvoker.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNetCliInvoker.cs index c6f97c5f8be2..4e1a680eebf3 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNetCliInvoker.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNetCliInvoker.cs @@ -12,14 +12,14 @@ namespace Semmle.Extraction.CSharp.DependencyFetching internal sealed class DotNetCliInvoker : IDotNetCliInvoker { private readonly ILogger logger; - private readonly IDependabotProxy? proxy; + private readonly IRegistryProxy? proxy; public string Exec { get; } - public DotNetCliInvoker(ILogger logger, string exec, IDependabotProxy? dependabotProxy) + public DotNetCliInvoker(ILogger logger, string exec, IRegistryProxy? registryProxy) { this.logger = logger; - this.proxy = dependabotProxy; + this.proxy = registryProxy; this.Exec = exec; logger.LogInfo($"Using .NET CLI executable: '{Exec}'"); } @@ -46,7 +46,7 @@ private ProcessStartInfo MakeDotnetStartInfo(List args, string? workingD // Configure the proxy settings, if applicable. if (this.proxy != null) { - logger.LogDebug($"Configuring environment variables for the Dependabot proxy at {this.proxy.Address}"); + logger.LogDebug($"Configuring environment variables for the Registry proxy at {this.proxy.Address}"); startInfo.EnvironmentVariables["HTTP_PROXY"] = this.proxy.Address; startInfo.EnvironmentVariables["HTTPS_PROXY"] = this.proxy.Address; diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/EnvironmentVariableNames.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/EnvironmentVariableNames.cs index 94a87037cdbc..04bb14ea7154 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/EnvironmentVariableNames.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/EnvironmentVariableNames.cs @@ -75,17 +75,17 @@ internal static class EnvironmentVariableNames public const string DiagnosticDir = "CODEQL_EXTRACTOR_CSHARP_DIAGNOSTIC_DIR"; /// - /// Specifies the hostname of the Dependabot proxy. + /// Specifies the hostname of the Registry proxy. /// public const string ProxyHost = "CODEQL_PROXY_HOST"; /// - /// Specifies the hostname of the Dependabot proxy. + /// Specifies the hostname of the Registry proxy. /// public const string ProxyPort = "CODEQL_PROXY_PORT"; /// - /// Contains the certificate used by the Dependabot proxy. + /// Contains the certificate used by the Registry proxy. /// public const string ProxyCertificate = "CODEQL_PROXY_CA_CERTIFICATE"; diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs index aeca9c6b2a13..80c295afba46 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs @@ -89,15 +89,15 @@ internal sealed partial class FeedManager : IDisposable ///
    public ImmutableHashSet ReachableDefaultFeeds => lazyReachableDefaultFeeds.Value; - public FeedManager(ILogger logger, IDotNet dotnet, IDependabotProxy? dependabotProxy, IFileProvider fileProvider, IFeedManagerIO feedManagerIo) + public FeedManager(ILogger logger, IDotNet dotnet, IRegistryProxy? registryProxy, IFileProvider fileProvider, IFeedManagerIO feedManagerIo) { this.logger = logger; this.dotnet = dotnet; this.fileProvider = fileProvider; this.feedManagerIo = feedManagerIo; - privateRegistryFeeds = dependabotProxy?.RegistryURLs ?? []; + privateRegistryFeeds = registryProxy?.RegistryURLs ?? []; HasPrivateRegistryFeeds = privateRegistryFeeds.Count > 0; - privateRegistryBaseFeeds = dependabotProxy?.RegistryBaseURLs ?? []; + privateRegistryBaseFeeds = registryProxy?.RegistryBaseURLs ?? []; hasPrivateRegistryBaseFeeds = privateRegistryBaseFeeds.Count > 0; DefaultFeeds = hasPrivateRegistryBaseFeeds @@ -122,8 +122,8 @@ public FeedManager(ILogger logger, IDotNet dotnet, IDependabotProxy? dependabotP lazyReachableDefaultFeeds = new Lazy>(() => CheckSpecifiedFeeds(DefaultFeeds)); } - public FeedManager(ILogger logger, IDotNet dotnet, IDependabotProxy? dependabotProxy, IFileProvider fileProvider) - : this(logger, dotnet, dependabotProxy, fileProvider, new FeedManagerIO(logger, dependabotProxy)) + public FeedManager(ILogger logger, IDotNet dotnet, IRegistryProxy? registryProxy, IFileProvider fileProvider) + : this(logger, dotnet, registryProxy, fileProvider, new FeedManagerIO(logger, registryProxy)) { } diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManagerIO.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManagerIO.cs index 8e771f6037a4..4b9b6b243866 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManagerIO.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManagerIO.cs @@ -13,12 +13,12 @@ namespace Semmle.Extraction.CSharp.DependencyFetching public class FeedManagerIO : IFeedManagerIO { private readonly ILogger logger; - private readonly IDependabotProxy? dependabotProxy; + private readonly IRegistryProxy? registryProxy; - public FeedManagerIO(ILogger logger, IDependabotProxy? dependabotProxy) + public FeedManagerIO(ILogger logger, IRegistryProxy? registryProxy) { this.logger = logger; - this.dependabotProxy = dependabotProxy; + this.registryProxy = registryProxy; } public string? GetDirectoryName(string path) @@ -43,13 +43,13 @@ public bool IsFeedReachable(string feed, int timeoutMilliSeconds, int tryCount) { logger.LogInfo($"Checking if NuGet feed '{feed}' is reachable..."); - // Configure the HttpClient to be aware of the Dependabot Proxy, if used. + // Configure the HttpClient to be aware of the Registry proxy, if used. HttpClientHandler httpClientHandler = new(); - if (dependabotProxy != null) + if (registryProxy != null) { - httpClientHandler.Proxy = new WebProxy(dependabotProxy.Address); + httpClientHandler.Proxy = new WebProxy(registryProxy.Address); - if (dependabotProxy.Certificate != null) + if (registryProxy.Certificate != null) { httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, _) => { @@ -60,11 +60,11 @@ public bool IsFeedReachable(string feed, int timeoutMilliSeconds, int tryCount) : chain is null ? "chain" : "certificate"; - logger.LogWarning($"Dependabot proxy certificate validation failed due to missing {msg}"); + logger.LogWarning($"Registry proxy certificate validation failed due to missing {msg}"); return false; } chain.ChainPolicy.TrustMode = X509ChainTrustMode.CustomRootTrust; - chain.ChainPolicy.CustomTrustStore.Add(dependabotProxy.Certificate); + chain.ChainPolicy.CustomTrustStore.Add(registryProxy.Certificate); return chain.Build(cert); }; } diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDependabotProxy.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IRegistryProxy.cs similarity index 82% rename from csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDependabotProxy.cs rename to csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IRegistryProxy.cs index aafaf851e356..7ddc8f846aee 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDependabotProxy.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IRegistryProxy.cs @@ -4,10 +4,10 @@ namespace Semmle.Extraction.CSharp.DependencyFetching { - public interface IDependabotProxy : IDisposable + public interface IRegistryProxy : IDisposable { /// - /// The full address of the Dependabot proxy, if available. + /// The full address of the Registry proxy, if available. /// string Address { get; } @@ -27,7 +27,7 @@ public interface IDependabotProxy : IDisposable string? CertificatePath { get; } /// - /// The certificate used for the Dependabot proxy. + /// The certificate used for the Registry proxy. /// X509Certificate2? Certificate { get; } } diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDependabotProxyConfiguration.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IRegistryProxyConfiguration.cs similarity index 64% rename from csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDependabotProxyConfiguration.cs rename to csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IRegistryProxyConfiguration.cs index c67ee4fc39df..520edfd7fb77 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDependabotProxyConfiguration.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IRegistryProxyConfiguration.cs @@ -2,18 +2,18 @@ namespace Semmle.Extraction.CSharp.DependencyFetching { - public interface IDependabotProxyConfiguration + public interface IRegistryProxyConfiguration { - // The host of the Dependabot proxy, if available. + // The host of the Registry proxy, if available. string? Host { get; } - // The port of the Dependabot proxy, if available. + // The port of the Registry proxy, if available. string? Port { get; } - // The certificate of the Dependabot proxy, if available. + // The certificate of the Registry proxy, if available. string? Certificate { get; } - // The list of package registries that are configured for the proxy, if any. + // The list of package registries that are configured for the Registry proxy, if any. // The value of the environment variable should be a JSON array of objects, such as: // [ { "type": "nuget_feed", "url": "https://nuget.pkg.github.com/org/index.json" } ] string? RegistryURLs { get; } diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs index f62105f2b482..fee72034781f 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs @@ -32,7 +32,7 @@ public NugetPackageRestorer( IFileProvider fileProvider, FileContent fileContent, IDotNet dotnet, - IDependabotProxy? dependabotProxy, + IRegistryProxy? registryProxy, IDiagnosticsWriter diagnosticsWriter, ILogger logger, ICompilationInfoContainer compilationInfoContainer) @@ -47,7 +47,7 @@ public NugetPackageRestorer( PackageDirectory = new DependencyDirectory("packages", "package", logger); legacyPackageDirectory = new DependencyDirectory("legacypackages", "legacy package", logger); missingPackageDirectory = new DependencyDirectory("missingpackages", "missing package", logger); - feedManager = new FeedManager(logger, dotnet, dependabotProxy, fileProvider); + feedManager = new FeedManager(logger, dotnet, registryProxy, fileProvider); } public string? TryRestore(string package) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/RegistryProxy.cs similarity index 84% rename from csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs rename to csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/RegistryProxy.cs index 8229a3da1375..ea2203891e37 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/RegistryProxy.cs @@ -10,7 +10,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching { - public class DependabotProxy : IDependabotProxy + public class RegistryProxy : IRegistryProxy { /// /// Represents configurations for package registries. @@ -65,13 +65,13 @@ public class RegistryConfig public X509Certificate2? Certificate { get; private set; } - private DependabotProxy(IDependabotProxyConfiguration config, ILogger logger, TemporaryDirectory tempWorkingDirectory) + private RegistryProxy(IRegistryProxyConfiguration config, ILogger logger, TemporaryDirectory tempWorkingDirectory) { Address = $"http://{config.Host}:{config.Port}"; if (!string.IsNullOrWhiteSpace(config.Certificate)) { - var certDirPath = new DirectoryInfo(Path.Join(tempWorkingDirectory.DirInfo.FullName, ".dependabot-proxy")); + var certDirPath = new DirectoryInfo(Path.Join(tempWorkingDirectory.DirInfo.FullName, ".registry-proxy")); Directory.CreateDirectory(certDirPath.FullName); CertificatePath = Path.Join(certDirPath.FullName, "proxy.crt"); @@ -81,7 +81,7 @@ private DependabotProxy(IDependabotProxyConfiguration config, ILogger logger, Te writer.Write(config.Certificate); writer.Close(); - logger.LogInfo($"Stored Dependabot proxy certificate at {CertificatePath}"); + logger.LogInfo($"Stored Registry proxy certificate at {CertificatePath}"); Certificate = X509Certificate2.CreateFromPem(config.Certificate); } @@ -127,37 +127,37 @@ private DependabotProxy(IDependabotProxyConfiguration config, ILogger logger, Te } } - internal static IDependabotProxy? Make(ILogger logger, IDiagnosticsWriter diagnosticsWriter, TemporaryDirectory tempWorkingDirectory) + internal static IRegistryProxy? Make(ILogger logger, IDiagnosticsWriter diagnosticsWriter, TemporaryDirectory tempWorkingDirectory) { // Setting HTTP(S)_PROXY and SSL_CERT_FILE have no effect on Windows or macOS, - // but we would still end up using the Dependabot proxy to check for feed reachability. + // but we would still end up using the Registry proxy to check for feed reachability. // This would result in us discovering that the feeds are reachable, but `dotnet` would // fail to connect to them. To prevent this from happening, we do not initialise an - // instance of `DependabotProxy` on those platforms. + // instance of `RegistryProxy` on those platforms. if (SystemBuildActions.Instance.IsWindows() || SystemBuildActions.Instance.IsMacOs()) { return null; } - return Make(new DependabotProxyConfiguration(), logger, diagnosticsWriter, tempWorkingDirectory); + return Make(new RegistryProxyConfiguration(), logger, diagnosticsWriter, tempWorkingDirectory); } /// - /// Creates an instance of the Dependabot proxy using the specified configuration. + /// Creates an instance of the Registry proxy using the specified configuration. /// Returns null if the proxy cannot be created. /// This overload is exposed primarily to enable platform-independent unit testing. /// - internal static IDependabotProxy? Make( - IDependabotProxyConfiguration proxyConfig, ILogger logger, IDiagnosticsWriter diagnosticsWriter, TemporaryDirectory tempWorkingDirectory) + internal static IRegistryProxy? Make( + IRegistryProxyConfiguration proxyConfig, ILogger logger, IDiagnosticsWriter diagnosticsWriter, TemporaryDirectory tempWorkingDirectory) { if (string.IsNullOrWhiteSpace(proxyConfig.Host) || string.IsNullOrWhiteSpace(proxyConfig.Port)) { - logger.LogDebug("No Dependabot proxy credentials are configured."); + logger.LogDebug("No Registry proxy credentials are configured."); return null; } - var result = new DependabotProxy(proxyConfig, logger, tempWorkingDirectory); - logger.LogInfo($"Dependabot proxy configured at {result.Address}"); + var result = new RegistryProxy(proxyConfig, logger, tempWorkingDirectory); + logger.LogInfo($"Registry proxy configured at {result.Address}"); // Emit a diagnostic for the discovered private registries, so that it is easy // for users to see that they were picked up. diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxyConfiguration.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/RegistryProxyConfiguration.cs similarity index 87% rename from csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxyConfiguration.cs rename to csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/RegistryProxyConfiguration.cs index 2d81f94aea2c..aeb7e665b62f 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxyConfiguration.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/RegistryProxyConfiguration.cs @@ -2,7 +2,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching { - public class DependabotProxyConfiguration : IDependabotProxyConfiguration + public class RegistryProxyConfiguration : IRegistryProxyConfiguration { public string? Host { get; } = Environment.GetEnvironmentVariable(EnvironmentVariableNames.ProxyHost); diff --git a/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs b/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs index 2fdecd570954..d812f008c43b 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs @@ -9,7 +9,7 @@ namespace Semmle.Extraction.Tests { - public class DependabotProxyStub : IDependabotProxy + public class RegistryProxyStub : IRegistryProxy { public string Address { get; } = ""; public ImmutableHashSet RegistryURLs { get; } = ["https://example.com/registry1", "https://example.com/registry2"]; @@ -20,7 +20,7 @@ public class DependabotProxyStub : IDependabotProxy public void Dispose() { } } - public class DependabotProxyStubWithBaseUrls : IDependabotProxy + public class RegistryProxyStubWithBaseUrls : IRegistryProxy { public string Address { get; } = ""; public ImmutableHashSet RegistryURLs { get; } = ["https://example.com/registry1", "https://example.com/registry2", "https://example.com/base1", "https://example.com/base2"]; @@ -79,16 +79,16 @@ private static FeedManager MakeFeedManager() { var logger = new LoggerStub(); var dotnet = new DotNetStub([], [], ["E https://feed.from/config"], ["E https://feed.from/folder1", "E https://feed.from/folder2", "D https://feed.from/folder3"]); - var dependabotProxy = new DependabotProxyStub(); + var registryProxy = new RegistryProxyStub(); var fileProvider = new FileProviderStub(); var feedManagerIo = new FeedManagerIOStub(["https://example.com/registry1", "https://feed.from/folder2"]); - return new FeedManager(logger, dotnet, dependabotProxy, fileProvider, feedManagerIo); + return new FeedManager(logger, dotnet, registryProxy, fileProvider, feedManagerIo); } /// /// Verify that `FeedManager` correctly computes the explicit feeds using feeds discovered in nuget.config files and /// private registries. - /// See the initialization of `DotNetStub` and `DependabotProxyStub` in `MakeFeedManager` for the feeds configured + /// See the initialization of `DotNetStub` and `RegistryProxyStub` in `MakeFeedManager` for the feeds configured /// to be returned and classified as explicit feeds. /// [Fact] @@ -132,7 +132,7 @@ public void TestInheritedFeeds() /// /// Verify that `FeedManager` correctly computes all feeds using feeds discovered in nuget.config files, private registries, /// and the environment. - /// See the initialization of `DotNetStub` and `DependabotProxyStub` in `MakeFeedManager` for the feeds configured + /// See the initialization of `DotNetStub` and `RegistryProxyStub` in `MakeFeedManager` for the feeds configured /// to be returned and included in all feeds. /// [Fact] @@ -270,7 +270,7 @@ public void TestDefaultFeedsNugetOrg() /// /// Verify that `FeedManager` correctly computes the default feeds and reachable default feeds /// when private registries are configured to replace the default feeds. - /// See the initialization of `DependabotProxyStubWithBaseUrls` for the feeds configured to replace the default feeds. + /// See the initialization of `RegistryProxyStubWithBaseUrls` for the feeds configured to replace the default feeds. /// [Fact] public void TestDefaultFeedsPrivateRegistries() @@ -278,10 +278,10 @@ public void TestDefaultFeedsPrivateRegistries() // Setup var logger = new LoggerStub(); var dotnet = new DotNetStub([], [], [], []); - var dependabotProxy = new DependabotProxyStubWithBaseUrls(); + var registryProxy = new RegistryProxyStubWithBaseUrls(); var fileProvider = new FileProviderStub(); var feedManagerIo = new FeedManagerIOStub(["https://example.com/registry2", "https://example.com/base1"]); - var feedManager = new FeedManager(logger, dotnet, dependabotProxy, fileProvider, feedManagerIo); + var feedManager = new FeedManager(logger, dotnet, registryProxy, fileProvider, feedManagerIo); // Execute var defaultFeeds = feedManager.DefaultFeeds; @@ -312,10 +312,10 @@ public void TestNugetOrgNotReplaced() // Setup var logger = new LoggerStub(); var dotnet = new DotNetStub([], [], [], ["E https://api.nuget.org/v3/index.json"]); - var dependabotProxy = new DependabotProxyStub(); + var registryProxy = new RegistryProxyStub(); var fileProvider = new FileProviderStub(); var feedManagerIo = new FeedManagerIOStub(["https://example.com/registry2", "https://example.com/base1"]); - var feedManager = new FeedManager(logger, dotnet, dependabotProxy, fileProvider, feedManagerIo); + var feedManager = new FeedManager(logger, dotnet, registryProxy, fileProvider, feedManagerIo); // Execute var explicitFeeds = feedManager.ExplicitFeeds; @@ -337,7 +337,7 @@ public void TestNugetOrgNotReplaced() /// /// Verify that `FeedManager` correctly computes the explicit and all feeds when https://api.nuget.org/v3/index.json and /// related NuGet.org URLs are replaced by private registries configured to replace the base feeds. - /// See the initialization of `DependabotProxyStubWithBaseUrls` for the feeds configured as default replacements. + /// See the initialization of `RegistryProxyStubWithBaseUrls` for the feeds configured as default replacements. /// [Fact] public void TestNugetOrgReplacement() @@ -345,10 +345,10 @@ public void TestNugetOrgReplacement() // Setup var logger = new LoggerStub(); var dotnet = new DotNetStub([], [], ["E https://www.nuget.org/api/v2/"], ["E https://api.nuget.org/v3/index.json"]); - var dependabotProxy = new DependabotProxyStubWithBaseUrls(); + var registryProxy = new RegistryProxyStubWithBaseUrls(); var fileProvider = new FileProviderStub(); var feedManagerIo = new FeedManagerIOStub(["https://example.com/registry2", "https://example.com/base1"]); - var feedManager = new FeedManager(logger, dotnet, dependabotProxy, fileProvider, feedManagerIo); + var feedManager = new FeedManager(logger, dotnet, registryProxy, fileProvider, feedManagerIo); // Execute var explicitFeeds = feedManager.ExplicitFeeds; diff --git a/csharp/extractor/Semmle.Extraction.Tests/DependabotProxy.cs b/csharp/extractor/Semmle.Extraction.Tests/RegistryProxy.cs similarity index 67% rename from csharp/extractor/Semmle.Extraction.Tests/DependabotProxy.cs rename to csharp/extractor/Semmle.Extraction.Tests/RegistryProxy.cs index 71c3943fe8fe..e3cd1743593f 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/DependabotProxy.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/RegistryProxy.cs @@ -6,7 +6,7 @@ namespace Semmle.Extraction.Tests { - public class DependabotConfigurationStub : IDependabotProxyConfiguration + public class RegistryConfigurationStub : IRegistryProxyConfiguration { public string? Host { get; set; } public string? Port { get; set; } @@ -20,23 +20,23 @@ public void AddEntry(Semmle.Util.DiagnosticMessage entry) { } public void Dispose() { } } - public class DependabotProxyTests + public class RegistryProxyTests { private static TemporaryDirectory MakeTemporaryDirectory() { - var tmp = Path.Join(Path.GetTempPath(), "DependabotProxyTests", Guid.NewGuid().ToString()); + var tmp = Path.Join(Path.GetTempPath(), "RegistryProxyTests", Guid.NewGuid().ToString()); return new TemporaryDirectory(tmp, "testing", new LoggerStub()); } /// - /// The purpose of this test is to verify that the registry proxy correctly handles the case where the port is not specified. - /// In this case, the registry proxy should not be created. + /// Verify that the Registry proxy correctly handles the case where the port is not specified. + /// In this case, the Registry proxy should not be created. /// [Fact] - public void TestDependabotProxyNoPort() + public void TestRegistryProxyNoPort() { // Setup - var config = new DependabotConfigurationStub + var config = new RegistryConfigurationStub { Host = "localhost", Port = "", @@ -44,28 +44,28 @@ public void TestDependabotProxyNoPort() // Execute using var tempWorkingDirectory = MakeTemporaryDirectory(); - using var proxy = DependabotProxy.Make(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); + using var proxy = RegistryProxy.Make(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); // Verify Assert.Null(proxy); } /// - /// The purpose of this test is to verify that the registry proxy correctly handles the case where the host is not specified. - /// In this case, the registry proxy should not be created. + /// Verify that the Registry proxy correctly handles the case where the host is not specified. + /// In this case, the Registry proxy should not be created. /// [Fact] - public void TestDependabotProxyNoHost() + public void TestRegistryProxyNoHost() { // Setup - var config = new DependabotConfigurationStub + var config = new RegistryConfigurationStub { Port = "8080", }; // Execute using var tempWorkingDirectory = MakeTemporaryDirectory(); - using var proxy = DependabotProxy.Make(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); + using var proxy = RegistryProxy.Make(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); // Verify Assert.Null(proxy); @@ -105,14 +105,14 @@ public void TestDependabotProxyNoHost() """; /// - /// The purpose of this test is to verify that the registry proxy correctly handles the case + /// Verify that the Registry proxy correctly handles the case /// where the port, host, and certificate are specified. /// [Fact] - public void TestDependabotProxyCertificate() + public void TestRegistryProxyCertificate() { // Setup - var config = new DependabotConfigurationStub + var config = new RegistryConfigurationStub { Port = "8080", Host = "localhost", @@ -121,7 +121,7 @@ public void TestDependabotProxyCertificate() // Execute using var tempWorkingDirectory = MakeTemporaryDirectory(); - using var proxy = DependabotProxy.Make(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); + using var proxy = RegistryProxy.Make(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); // Verify Assert.NotNull(proxy); @@ -131,15 +131,15 @@ public void TestDependabotProxyCertificate() } /// - /// The purpose of this test is to verify that the registry proxy correctly handles the case - /// where the RegistryURLs environment variable is not a valid JSON list. - /// In this case, the registry proxy should be created, but the list of private registries should be empty. + /// Verify that the Registry proxy correctly handles the case where the RegistryURLs environment variable + /// is not a valid JSON list. + /// In this case, the Registry proxy should be created, but the list of private registries should be empty. /// [Fact] - public void TestDependabotRegistryUrlsParseError() + public void TestRegistryProxyUrlsParseError() { // Setup - var config = new DependabotConfigurationStub + var config = new RegistryConfigurationStub { Port = "8080", Host = "localhost", @@ -148,7 +148,7 @@ public void TestDependabotRegistryUrlsParseError() // Execute using var tempWorkingDirectory = MakeTemporaryDirectory(); - using var proxy = DependabotProxy.Make(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); + using var proxy = RegistryProxy.Make(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); // Verify Assert.NotNull(proxy); @@ -157,15 +157,15 @@ public void TestDependabotRegistryUrlsParseError() } /// - /// The purpose of this test is to verify that the registry proxy correctly handles the case - /// where the RegistryURLs environment variable is a valid JSON list with a single entry. - /// In this case, the registry proxy should be created, and the list of private registries should contain the single entry. + /// Verify that the Registry proxy correctly handles the case where the RegistryURLs environment variable + /// is a valid JSON list with a single entry. + /// In this case, the Registry proxy should be created, and the list of private registries should contain the single entry. /// [Fact] - public void TestDependabotRegistryUrlsSingle() + public void TestRegistryProxyUrlsSingle() { // Setup - var config = new DependabotConfigurationStub + var config = new RegistryConfigurationStub { Port = "8080", Host = "localhost", @@ -174,7 +174,7 @@ public void TestDependabotRegistryUrlsSingle() // Execute using var tempWorkingDirectory = MakeTemporaryDirectory(); - using var proxy = DependabotProxy.Make(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); + using var proxy = RegistryProxy.Make(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); // Verify Assert.NotNull(proxy); @@ -185,17 +185,17 @@ public void TestDependabotRegistryUrlsSingle() } /// - /// The purpose of this test is to verify that the registry proxy correctly handles the case - /// where the RegistryURLs environment variable is a valid JSON list with multiple entries, but only one of them - /// is of type "nuget_feed", which is relevant for C#. - /// In this case, the registry proxy should be created, and the list of private registries should + /// Verify that the Registry proxy correctly handles the case where the RegistryURLs environment variable + /// is a valid JSON list with multiple entries, but only one of them is of type "nuget_feed", which is + /// relevant for C#. + /// In this case, the Registry proxy should be created, and the list of private registries should /// contain only the entry of type "nuget_feed". /// [Fact] - public void TestDependabotRegistryUrls3() + public void TestRegistryProxyUrls3() { // Setup - var config = new DependabotConfigurationStub + var config = new RegistryConfigurationStub { Port = "8080", Host = "localhost", @@ -204,7 +204,7 @@ public void TestDependabotRegistryUrls3() // Execute using var tempWorkingDirectory = MakeTemporaryDirectory(); - using var proxy = DependabotProxy.Make(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); + using var proxy = RegistryProxy.Make(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); // Verify Assert.NotNull(proxy); @@ -215,17 +215,16 @@ public void TestDependabotRegistryUrls3() } /// - /// The purpose of this test is to verify that the registry proxy correctly handles the case - /// where the RegistryURLs environment variable is a valid JSON list with multiple entries and one of them - /// is configured to replace the base feeds. - /// In this case, the registry proxy should be created, and the list of private registries should contain all + /// Verify that the Registry proxy correctly handles the case where the RegistryURLs environment variable + /// is a valid JSON list with multiple entries and one of them is configured to replace the base feeds. + /// In this case, the Registry proxy should be created, and the list of private registries should contain all /// entries, while the list of base registries should contain only the entry that replaces the base feeds. /// [Fact] - public void TestDependabotRegistryUrlsReplacesBase() + public void TestRegistryProxyUrlsReplacesBase() { // Setup - var config = new DependabotConfigurationStub + var config = new RegistryConfigurationStub { Port = "8080", Host = "localhost", @@ -234,7 +233,7 @@ public void TestDependabotRegistryUrlsReplacesBase() // Execute using var tempWorkingDirectory = MakeTemporaryDirectory(); - using var proxy = DependabotProxy.Make(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); + using var proxy = RegistryProxy.Make(config, new LoggerStub(), new DiagnosticsWriterStub(), tempWorkingDirectory); // Verify Assert.NotNull(proxy); From 8add8980593d02b0e16ed508d1aa73203041a780 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Fri, 11 Sep 2026 12:53:44 +0200 Subject: [PATCH 0877/2098] C#: Address CoPilots comments. --- .../EnvironmentVariableNames.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/EnvironmentVariableNames.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/EnvironmentVariableNames.cs index 04bb14ea7154..4b1512c661f0 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/EnvironmentVariableNames.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/EnvironmentVariableNames.cs @@ -80,7 +80,7 @@ internal static class EnvironmentVariableNames public const string ProxyHost = "CODEQL_PROXY_HOST"; /// - /// Specifies the hostname of the Registry proxy. + /// Specifies the port of the Registry proxy. /// public const string ProxyPort = "CODEQL_PROXY_PORT"; From f730e9fa0f0dc4b36a8e7c8161cb483d85584681 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 11 Sep 2026 12:54:18 +0200 Subject: [PATCH 0878/2098] unified: Join on name and scope simultaneously --- shared/namebinding/codeql/namebinding/LocalNameBinding.qll | 4 ++++ unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/shared/namebinding/codeql/namebinding/LocalNameBinding.qll b/shared/namebinding/codeql/namebinding/LocalNameBinding.qll index c0c33fe1aa7c..2dd12bbc8abc 100644 --- a/shared/namebinding/codeql/namebinding/LocalNameBinding.qll +++ b/shared/namebinding/codeql/namebinding/LocalNameBinding.qll @@ -484,6 +484,10 @@ module LocalNameBinding override string getName() { result = name } override Location getLocation() { result = scope.getLocation() } + + /** Holds if this variable has the given name and scope. */ + pragma[nomagic] + predicate hasNameAndScope(string name_, AstNode scope_) { name = name_ and scope = scope_ } } /** A local access. */ diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index 7f146d6121d9..a944db724c5a 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -326,6 +326,7 @@ private module LocalNameBindingInput implements LocalNameBindingInputSig Date: Fri, 11 Sep 2026 13:13:10 +0200 Subject: [PATCH 0879/2098] unified: Handle implicit locals in AnalysisQuality.qll --- .../ql/lib/codeql/unified/internal/AnalysisQuality.qll | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll index 986238a60594..0b0dea71ee7e 100644 --- a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll +++ b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll @@ -51,6 +51,14 @@ module StaticNameResolutionStats implements EntityStatsSig { or result.isModuleScopeNode(_) and result.(NamespaceNode).ref().isIdentifier(this) + or + // Resolving to an implicitly-declared local such as "self" should count as + // as a successfully resolved name + exists(LocalName implicitLocal | + implicitLocal = this.(LocalNameAccess).getLocalName() and + not exists(implicitLocal.getABinding()) and + result.isLocalName(implicitLocal) + ) ) } From d2070cf1cf87156f749bfc6f05415be7d1a93213 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 11 Sep 2026 13:13:37 +0200 Subject: [PATCH 0880/2098] unified: Remove superfluous parens --- .../unified/internal/AnalysisQuality.qll | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll index 0b0dea71ee7e..d5eb5071176e 100644 --- a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll +++ b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll @@ -46,19 +46,17 @@ module StaticNameResolutionStats implements EntityStatsSig { } NameBindingNode getTarget() { - ( - result.asIdentifier() = getStaticBindingTarget(this) - or - result.isModuleScopeNode(_) and - result.(NamespaceNode).ref().isIdentifier(this) - or - // Resolving to an implicitly-declared local such as "self" should count as - // as a successfully resolved name - exists(LocalName implicitLocal | - implicitLocal = this.(LocalNameAccess).getLocalName() and - not exists(implicitLocal.getABinding()) and - result.isLocalName(implicitLocal) - ) + result.asIdentifier() = getStaticBindingTarget(this) + or + result.isModuleScopeNode(_) and + result.(NamespaceNode).ref().isIdentifier(this) + or + // Resolving to an implicitly-declared local such as "self" should count as + // as a successfully resolved name + exists(LocalName implicitLocal | + implicitLocal = this.(LocalNameAccess).getLocalName() and + not exists(implicitLocal.getABinding()) and + result.isLocalName(implicitLocal) ) } From e7c8469cf76e5511d75fbb8c5bf57d0f042194ff Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Fri, 11 Sep 2026 14:06:51 +0200 Subject: [PATCH 0881/2098] Unified: Add tests for explicit `self`/`Self` qualifiers --- .../explicit-instance-field-access.swift | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 unified/ql/test/library-tests/static-name-binding/explicit-instance-field-access.swift diff --git a/unified/ql/test/library-tests/static-name-binding/explicit-instance-field-access.swift b/unified/ql/test/library-tests/static-name-binding/explicit-instance-field-access.swift new file mode 100644 index 000000000000..dd150fe98e16 --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/explicit-instance-field-access.swift @@ -0,0 +1,47 @@ +private class A { + let x = 123 // name=A.instance.x + + func getX() { + return self.x // not handled by static name binding + } + + static let y = 456 // name=A.type.y + + func getY1() { + return Self.y // $ MISSING: access=A access=A.type.y + } + + static func getY2() { + return self.y // $ not handled by static name binding + } + + class func z() -> Int { // name=A.type.z + return 789 + } + + class func getZ() { + return self.z // $ not handled by static name binding + } +} + +private class B : A { // $ access=A + func getX2() { + return self.x // not handled by static name binding + } + + func getY3() { + return Self.y // $ MISSING: access=B access=A.type.y + } + + static func getY4() { + return self.y // $ not handled by static name binding + } + + class func z() -> Int { // name=B.type.z + return 789 + } + + class func getZ2() { + return self.z // $ not handled by static name binding + } +} From b0087fc294b386eb972a924ce4ade5edf0de9c38 Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 8 Sep 2026 11:33:48 +0200 Subject: [PATCH 0882/2098] unified: Fix translation of tuple expressions --- unified/extractor/src/languages/swift/swift.rs | 16 ++++++++-------- .../swift/collections/tuple-literal.output | 10 +++++++++- .../switch-expression-pattern.output | 7 ++++++- .../operators/parenthesised-expression.output | 6 +++++- .../test/library-tests/BasicTest/test.expected | 1 + 5 files changed, 29 insertions(+), 11 deletions(-) diff --git a/unified/extractor/src/languages/swift/swift.rs b/unified/extractor/src/languages/swift/swift.rs index c1e49181ea13..9185c541e454 100644 --- a/unified/extractor/src/languages/swift/swift.rs +++ b/unified/extractor/src/languages/swift/swift.rs @@ -297,14 +297,14 @@ fn translation_rules() -> Vec> { rule!((sequenceExpr elements: _* @els) => (unresolved_operator_sequence element: {els})), // Prefix unary operators (`!a`, `-x`). rule!((prefixOperatorExpr operator: @op expression: @operand) => (unary_expr operator: (prefix_operator #{op}) operand: {operand})), - // A `tupleExpr` is a tuple literal (`(a, b)`) or a parenthesised - // expression (`(x)`). For now it is kept as an opaque `tuple_expr` leaf - // (its source text); its elements are not descended into. - // - // TODO: a parenthesised single-element `tupleExpr` is really a grouping - // expression and should be elided (unwrapped to its inner expression) - // rather than modelled as a tuple. - rule!((tupleExpr) => (tuple_expr)), + // A parenthesised expression has a single tuple element; elide the + // grouping and preserve the expression itself. Actual tuple literals + // retain their translated labeled elements as `argument` children. + rule!((tupleExpr + elements: (labeledExpr label: _? @@lbl expression: @element) + elements: _* @@rest) + where rest.is_empty() && lbl.is_none() => expr { element }), + rule!((tupleExpr elements: _* @elements) => (tuple_expr element: {elements})), // A code block contains its statements directly. rule!((codeBlock statements: _* @stmts) => (block stmt: {stmts})), // ---- Properties with accessors ---- diff --git a/unified/extractor/tests/corpus/swift/collections/tuple-literal.output b/unified/extractor/tests/corpus/swift/collections/tuple-literal.output index 5d7742f744bc..4a8a54078d9c 100644 --- a/unified/extractor/tests/corpus/swift/collections/tuple-literal.output +++ b/unified/extractor/tests/corpus/swift/collections/tuple-literal.output @@ -52,4 +52,12 @@ top_level variable_declaration modifier: modifier "let" pattern: identifier "t" - value: tuple_expr "(1, \"two\", 3.0)" + value: + tuple_expr + element: + argument + value: int_literal "1" + argument + value: string_literal "\"two\"" + argument + value: float_literal "3.0" diff --git a/unified/extractor/tests/corpus/swift/control-flow/switch-expression-pattern.output b/unified/extractor/tests/corpus/swift/control-flow/switch-expression-pattern.output index 0a4fe7302b05..533f717b827e 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/switch-expression-pattern.output +++ b/unified/extractor/tests/corpus/swift/control-flow/switch-expression-pattern.output @@ -333,7 +333,12 @@ top_level member_access_expr base: inferred_type_expr "." member_name_node: identifier "inferred" - tuple_expr "(value, offset)" + tuple_expr + element: + argument + value: identifier "value" + argument + value: identifier "offset" array_literal element: identifier "value" map_literal "[key: value]" diff --git a/unified/extractor/tests/corpus/swift/operators/parenthesised-expression.output b/unified/extractor/tests/corpus/swift/operators/parenthesised-expression.output index 1c8de726f41a..33bb1599ff1a 100644 --- a/unified/extractor/tests/corpus/swift/operators/parenthesised-expression.output +++ b/unified/extractor/tests/corpus/swift/operators/parenthesised-expression.output @@ -39,6 +39,10 @@ top_level block stmt: binary_expr - left: tuple_expr "(a + b)" + left: + binary_expr + left: identifier "a" + operator: infix_operator "+" + right: identifier "b" operator: infix_operator "*" right: identifier "c" diff --git a/unified/ql/test/library-tests/BasicTest/test.expected b/unified/ql/test/library-tests/BasicTest/test.expected index 711b05c12d4c..0f5f2f95c756 100644 --- a/unified/ql/test/library-tests/BasicTest/test.expected +++ b/unified/ql/test/library-tests/BasicTest/test.expected @@ -129,6 +129,7 @@ identifier | test.swift:74:10:74:17 | isSorted | isSorted | | test.swift:74:24:74:27 | Bool | Bool | | test.swift:75:13:75:13 | i | i | +| test.swift:75:23:75:27 | count | count | | test.swift:76:16:76:19 | self | self | | test.swift:76:21:76:21 | i | i | | test.swift:76:26:76:29 | self | self | From 0e5d15dba8c4ccdf62c9612b2d8fa441d5aa98ed Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 11 Sep 2026 13:58:32 +0200 Subject: [PATCH 0883/2098] unified: Add a some tuples to BasicTest --- unified/ql/test/library-tests/BasicTest/test.expected | 10 ++++++++++ unified/ql/test/library-tests/BasicTest/test.ql | 2 ++ unified/ql/test/library-tests/BasicTest/test.swift | 4 ++++ 3 files changed, 16 insertions(+) diff --git a/unified/ql/test/library-tests/BasicTest/test.expected b/unified/ql/test/library-tests/BasicTest/test.expected index 0f5f2f95c756..5f8e2a323ad2 100644 --- a/unified/ql/test/library-tests/BasicTest/test.expected +++ b/unified/ql/test/library-tests/BasicTest/test.expected @@ -153,6 +153,9 @@ identifier | test.swift:87:31:87:36 | reduce | reduce | | test.swift:87:38:87:43 | values | values | | test.swift:87:49:87:57 | transform | transform | +| test.swift:90:5:90:9 | tuple | tuple | +| test.swift:91:5:91:10 | unary1 | unary1 | +| test.swift:92:5:92:10 | unary2 | unary2 | namedPattern | test.swift:1:1:1:17 | NamedPattern | Foundation | unsupported @@ -164,6 +167,9 @@ rawStringValue | strings.swift:3:28:3:33 | world | world | | strings.swift:4:11:4:16 | hello | hello | | strings.swift:4:27:4:32 | world | world | +| test.swift:90:17:90:23 | "hello" | "hello" | +| test.swift:91:15:91:29 | "parenthesized" | "parenthesized" | +| test.swift:92:16:92:37 | "double-parenthesized" | "double-parenthesized" | exprStringValue | strings.swift:1:10:1:16 | "hello" | hello | | strings.swift:2:11:2:16 | hello | hello | @@ -172,3 +178,7 @@ exprStringValue | strings.swift:3:28:3:33 | world | world | | strings.swift:4:11:4:16 | hello | hello | | strings.swift:4:27:4:32 | world | world | +| test.swift:90:17:90:23 | "hello" | hello | +| test.swift:91:15:91:29 | "parenthesized" | parenthesized | +| test.swift:92:16:92:37 | "double-parenthesized" | double-parenthesized | +unexpectedUnaryTuple diff --git a/unified/ql/test/library-tests/BasicTest/test.ql b/unified/ql/test/library-tests/BasicTest/test.ql index 62f5ac850e6e..fa3c26183b08 100644 --- a/unified/ql/test/library-tests/BasicTest/test.ql +++ b/unified/ql/test/library-tests/BasicTest/test.ql @@ -9,3 +9,5 @@ query predicate unsupported(UnsupportedNode node, string value) { value = node.g query predicate rawStringValue(StringLiteral e, string value) { value = e.getValue() } query predicate exprStringValue(Expr e, string value) { value = e.getStringValue() } + +query predicate unexpectedUnaryTuple(TupleExpr tuple) { count(tuple.getAnElement()) = 1 } diff --git a/unified/ql/test/library-tests/BasicTest/test.swift b/unified/ql/test/library-tests/BasicTest/test.swift index 158ef26f598b..77e95074b383 100644 --- a/unified/ql/test/library-tests/BasicTest/test.swift +++ b/unified/ql/test/library-tests/BasicTest/test.swift @@ -86,3 +86,7 @@ func combine(_ values: [T], transform: (T, T) -> T) -> T? { guard !values.isEmpty else { return nil } return values.dropFirst().reduce(values[0], transform) } + +let tuple = (1, "hello", true) +let unary1 = ("parenthesized") +let unary2 = (("double-parenthesized")) From 2d10f98b6099cec2d4dce6a2adfd14c12e3b1f69 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Fri, 11 Sep 2026 14:07:12 +0200 Subject: [PATCH 0884/2098] Unified: Resolve `Self` in static name binding --- .../ql/lib/codeql/unified/internal/NameBindingPlugin.qll | 6 ++++++ .../lib/codeql/unified/internal/NameBindingPluginSwift.qll | 2 ++ .../ql/lib/codeql/unified/internal/StaticNameBinding.qll | 6 ++++++ .../explicit-instance-field-access.swift | 4 ++-- 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll b/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll index c3173614feea..f8367f4e67f6 100644 --- a/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll +++ b/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll @@ -42,6 +42,12 @@ class NameBindingPlugin extends Unit { /** Gets the name of the implicit receiver parameter in `callable`, if it has one. */ string getImplicitReceiverParameterName(Callable callable) { none() } + + /** + * Gets the name through which static members of the enclosing class can be + * accessed, for example `Self` in Swift. + */ + string getStaticSelfName() { none() } } /** Holds if `member` is an instance member. */ diff --git a/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll b/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll index 8827d25ea453..5b5e4475bc06 100644 --- a/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll +++ b/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll @@ -44,6 +44,8 @@ class NameBindingPluginSwift extends NameBindingPlugin { callable = any(ClassLikeDeclaration cls).getAMember() and result = "self" } + + override string getStaticSelfName() { result = "Self" } } /** Holds if `node` is in a context where a bare name node should be seen as a reference rather than a declaration. */ diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 230608b682f8..e53e43a92e87 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -210,6 +210,12 @@ predicate storeStep(NameBindingNode node1, string name, NameBindingNode node2) { ) or FolderHeuristic::storeStep(node1, name, node2) + or + exists(ClassLikeDeclaration cls | + name = any(NameBindingPlugin p).getStaticSelfName() and + node1.isIdentifier(cls.getNameNode()) and + node2.isStaticMemberNamespace(cls) + ) } predicate valueStep(NameBindingNode node1, NameBindingNode node2) { diff --git a/unified/ql/test/library-tests/static-name-binding/explicit-instance-field-access.swift b/unified/ql/test/library-tests/static-name-binding/explicit-instance-field-access.swift index dd150fe98e16..1113e2a51226 100644 --- a/unified/ql/test/library-tests/static-name-binding/explicit-instance-field-access.swift +++ b/unified/ql/test/library-tests/static-name-binding/explicit-instance-field-access.swift @@ -8,7 +8,7 @@ private class A { static let y = 456 // name=A.type.y func getY1() { - return Self.y // $ MISSING: access=A access=A.type.y + return Self.y // $ access=A access=A.type.y } static func getY2() { @@ -30,7 +30,7 @@ private class B : A { // $ access=A } func getY3() { - return Self.y // $ MISSING: access=B access=A.type.y + return Self.y // $ access=B access=A.type.y } static func getY4() { From 7926c7d5c6988fedcbb9aeec0c896159ee2f63e5 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Fri, 11 Sep 2026 14:59:35 +0200 Subject: [PATCH 0885/2098] Unified: Add test for `Self` access in nested class --- .../explicit-instance-field-access.swift | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/unified/ql/test/library-tests/static-name-binding/explicit-instance-field-access.swift b/unified/ql/test/library-tests/static-name-binding/explicit-instance-field-access.swift index 1113e2a51226..732e8820533b 100644 --- a/unified/ql/test/library-tests/static-name-binding/explicit-instance-field-access.swift +++ b/unified/ql/test/library-tests/static-name-binding/explicit-instance-field-access.swift @@ -45,3 +45,11 @@ private class B : A { // $ access=A return self.z // $ not handled by static name binding } } + +private class C { + static let x = 1 + class D { + static let x = 2 + static let foo = Self.x // $ access=C.D access=C.D.x $ SPURIOUS: access=C.x + } +} From c0bc400e5e1d632d422798b9b4834bbd2ccc145f Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Fri, 11 Sep 2026 15:45:05 +0200 Subject: [PATCH 0886/2098] Address review comments --- .../lib/codeql/unified/internal/LocalNameBinding.qll | 6 ++++++ .../codeql/unified/internal/NameBindingPlugin.qll | 5 +++-- .../unified/internal/NameBindingPluginSwift.qll | 3 ++- .../codeql/unified/internal/StaticNameBinding.qll | 12 ++++++------ .../explicit-instance-field-access.swift | 2 +- 5 files changed, 18 insertions(+), 10 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index a944db724c5a..0844fe64bed9 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -333,6 +333,12 @@ private module LocalNameBindingInput implements LocalNameBindingInputSig Date: Fri, 11 Sep 2026 16:46:14 -0400 Subject: [PATCH 0887/2098] test(cpp): fix protobuf model CI failures Share standard string stubs between the protobuf and Asio fixtures and regenerate expectations for their new source locations. Add the eight missing protobuf signature expectations. --- .../dataflow/external-models/asio_streams.cpp | 19 +- .../dataflow/external-models/flow.expected | 1158 ++++++++--------- .../dataflow/external-models/protobuf.cpp | 21 +- .../dataflow/external-models/sinks.expected | 4 +- .../dataflow/external-models/sources.expected | 2 +- .../dataflow/external-models/std_string.h | 25 + .../dataflow/external-models/steps.expected | 234 ++-- .../taint-tests/test_mad-signatures.expected | 8 + 8 files changed, 737 insertions(+), 734 deletions(-) create mode 100644 cpp/ql/test/library-tests/dataflow/external-models/std_string.h diff --git a/cpp/ql/test/library-tests/dataflow/external-models/asio_streams.cpp b/cpp/ql/test/library-tests/dataflow/external-models/asio_streams.cpp index 76b2a07fc858..c6b46bf54b15 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/asio_streams.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/asio_streams.cpp @@ -1,24 +1,11 @@ // --- stub library headers --- -namespace std { - typedef unsigned long size_t; - #define SIZE_MAX 0xFFFFFFFF +#include "std_string.h" - template class allocator { - }; - - template struct char_traits { - }; - - template, class Allocator = allocator > - class basic_string { - public: - basic_string(const charT* s, const Allocator& a = Allocator()); - }; - - typedef basic_string string; +#define SIZE_MAX 0xFFFFFFFF +namespace std { class string_view { public: string_view(const char* s); diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index 47bd4c4e0877..43ab7d01c4c4 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -166,78 +166,78 @@ models | 165 | Summary: google::protobuf; MessageLite; true; SerializeToString; ; ; Argument[-1]; Argument[*0]; taint; manual | | 166 | Summary: google::protobuf; MessageLite; true; SerializeToZeroCopyStream; ; ; Argument[-1]; Argument[*0]; taint; manual | edges -| asio_streams.cpp:129:34:129:44 | read_until output argument | asio_streams.cpp:133:7:133:17 | recv_buffer | provenance | Src:MaD:56 | -| asio_streams.cpp:129:34:129:44 | read_until output argument | asio_streams.cpp:135:29:135:39 | recv_buffer | provenance | Src:MaD:56 Sink:MaD:4 | -| asio_streams.cpp:139:37:139:44 | call to source | asio_streams.cpp:140:7:140:14 | send_str | provenance | TaintFunction | -| asio_streams.cpp:139:37:139:44 | call to source | asio_streams.cpp:142:64:142:71 | *send_str | provenance | TaintFunction | -| asio_streams.cpp:142:44:142:62 | call to buffer | asio_streams.cpp:142:44:142:62 | call to buffer | provenance | | -| asio_streams.cpp:142:44:142:62 | call to buffer | asio_streams.cpp:143:7:143:17 | send_buffer | provenance | | -| asio_streams.cpp:142:44:142:62 | call to buffer | asio_streams.cpp:145:29:145:39 | send_buffer | provenance | Sink:MaD:4 | -| asio_streams.cpp:142:64:142:71 | *send_str | asio_streams.cpp:142:44:142:62 | call to buffer | provenance | MaD:120 | -| asio_streams.cpp:156:19:156:26 | call to source | asio_streams.cpp:161:24:161:27 | *host | provenance | TaintFunction | -| asio_streams.cpp:156:19:156:26 | call to source | asio_streams.cpp:162:24:162:27 | *host | provenance | TaintFunction | -| asio_streams.cpp:156:19:156:26 | call to source | asio_streams.cpp:163:24:163:27 | *host | provenance | TaintFunction | -| asio_streams.cpp:156:19:156:26 | call to source | asio_streams.cpp:164:24:164:27 | *host | provenance | TaintFunction | -| asio_streams.cpp:156:19:156:26 | call to source | asio_streams.cpp:171:34:171:37 | *host | provenance | TaintFunction | -| asio_streams.cpp:156:19:156:26 | call to source | asio_streams.cpp:172:34:172:37 | *host | provenance | TaintFunction | -| asio_streams.cpp:156:19:156:26 | call to source | asio_streams.cpp:173:34:173:37 | *host | provenance | TaintFunction | -| asio_streams.cpp:156:19:156:26 | call to source | asio_streams.cpp:174:34:174:37 | *host | provenance | TaintFunction | -| asio_streams.cpp:158:29:158:36 | call to source | asio_streams.cpp:166:24:166:32 | host_view | provenance | TaintFunction | -| asio_streams.cpp:158:29:158:36 | call to source | asio_streams.cpp:167:24:167:32 | host_view | provenance | TaintFunction | -| asio_streams.cpp:158:29:158:36 | call to source | asio_streams.cpp:168:24:168:32 | host_view | provenance | TaintFunction | -| asio_streams.cpp:158:29:158:36 | call to source | asio_streams.cpp:169:24:169:32 | host_view | provenance | TaintFunction | -| asio_streams.cpp:158:29:158:36 | call to source | asio_streams.cpp:176:34:176:42 | host_view | provenance | TaintFunction | -| asio_streams.cpp:158:29:158:36 | call to source | asio_streams.cpp:177:34:177:42 | host_view | provenance | TaintFunction | -| asio_streams.cpp:158:29:158:36 | call to source | asio_streams.cpp:178:34:178:42 | host_view | provenance | TaintFunction | -| asio_streams.cpp:158:29:158:36 | call to source | asio_streams.cpp:179:34:179:42 | host_view | provenance | TaintFunction | -| asio_streams.cpp:161:24:161:27 | *host | asio_streams.cpp:161:16:161:22 | call to resolve | provenance | MaD:112 | -| asio_streams.cpp:162:24:162:27 | *host | asio_streams.cpp:162:16:162:22 | call to resolve | provenance | MaD:113 | -| asio_streams.cpp:163:24:163:27 | *host | asio_streams.cpp:163:16:163:22 | call to resolve | provenance | MaD:114 | -| asio_streams.cpp:164:24:164:27 | *host | asio_streams.cpp:164:16:164:22 | call to resolve | provenance | MaD:115 | -| asio_streams.cpp:166:24:166:32 | host_view | asio_streams.cpp:166:16:166:22 | call to resolve | provenance | MaD:116 | -| asio_streams.cpp:167:24:167:32 | host_view | asio_streams.cpp:167:16:167:22 | call to resolve | provenance | MaD:117 | -| asio_streams.cpp:168:24:168:32 | host_view | asio_streams.cpp:168:16:168:22 | call to resolve | provenance | MaD:118 | -| asio_streams.cpp:169:24:169:32 | host_view | asio_streams.cpp:169:16:169:22 | call to resolve | provenance | MaD:119 | -| asio_streams.cpp:171:34:171:37 | *host | asio_streams.cpp:171:16:171:22 | call to resolve | provenance | MaD:104 | -| asio_streams.cpp:172:34:172:37 | *host | asio_streams.cpp:172:16:172:22 | call to resolve | provenance | MaD:105 | -| asio_streams.cpp:173:34:173:37 | *host | asio_streams.cpp:173:16:173:22 | call to resolve | provenance | MaD:106 | -| asio_streams.cpp:174:34:174:37 | *host | asio_streams.cpp:174:16:174:22 | call to resolve | provenance | MaD:107 | -| asio_streams.cpp:176:34:176:42 | host_view | asio_streams.cpp:176:16:176:22 | call to resolve | provenance | MaD:108 | -| asio_streams.cpp:177:34:177:42 | host_view | asio_streams.cpp:177:16:177:22 | call to resolve | provenance | MaD:109 | -| asio_streams.cpp:178:34:178:42 | host_view | asio_streams.cpp:178:16:178:22 | call to resolve | provenance | MaD:110 | -| asio_streams.cpp:179:34:179:42 | host_view | asio_streams.cpp:179:16:179:22 | call to resolve | provenance | MaD:111 | -| asio_streams.cpp:188:22:188:29 | call to source | asio_streams.cpp:192:30:192:36 | *service | provenance | TaintFunction | -| asio_streams.cpp:188:22:188:29 | call to source | asio_streams.cpp:193:30:193:36 | *service | provenance | TaintFunction | -| asio_streams.cpp:188:22:188:29 | call to source | asio_streams.cpp:194:30:194:36 | *service | provenance | TaintFunction | -| asio_streams.cpp:188:22:188:29 | call to source | asio_streams.cpp:195:30:195:36 | *service | provenance | TaintFunction | -| asio_streams.cpp:188:22:188:29 | call to source | asio_streams.cpp:202:40:202:46 | *service | provenance | TaintFunction | -| asio_streams.cpp:188:22:188:29 | call to source | asio_streams.cpp:203:40:203:46 | *service | provenance | TaintFunction | -| asio_streams.cpp:188:22:188:29 | call to source | asio_streams.cpp:204:40:204:46 | *service | provenance | TaintFunction | -| asio_streams.cpp:188:22:188:29 | call to source | asio_streams.cpp:205:40:205:46 | *service | provenance | TaintFunction | -| asio_streams.cpp:190:32:190:39 | call to source | asio_streams.cpp:197:35:197:46 | service_view | provenance | TaintFunction | -| asio_streams.cpp:190:32:190:39 | call to source | asio_streams.cpp:198:35:198:46 | service_view | provenance | TaintFunction | -| asio_streams.cpp:190:32:190:39 | call to source | asio_streams.cpp:199:35:199:46 | service_view | provenance | TaintFunction | -| asio_streams.cpp:190:32:190:39 | call to source | asio_streams.cpp:200:35:200:46 | service_view | provenance | TaintFunction | -| asio_streams.cpp:190:32:190:39 | call to source | asio_streams.cpp:207:45:207:56 | service_view | provenance | TaintFunction | -| asio_streams.cpp:190:32:190:39 | call to source | asio_streams.cpp:208:45:208:56 | service_view | provenance | TaintFunction | -| asio_streams.cpp:190:32:190:39 | call to source | asio_streams.cpp:209:45:209:56 | service_view | provenance | TaintFunction | -| asio_streams.cpp:190:32:190:39 | call to source | asio_streams.cpp:210:45:210:56 | service_view | provenance | TaintFunction | -| asio_streams.cpp:192:30:192:36 | *service | asio_streams.cpp:192:16:192:22 | call to resolve | provenance | MaD:112 | -| asio_streams.cpp:193:30:193:36 | *service | asio_streams.cpp:193:16:193:22 | call to resolve | provenance | MaD:113 | -| asio_streams.cpp:194:30:194:36 | *service | asio_streams.cpp:194:16:194:22 | call to resolve | provenance | MaD:114 | -| asio_streams.cpp:195:30:195:36 | *service | asio_streams.cpp:195:16:195:22 | call to resolve | provenance | MaD:115 | -| asio_streams.cpp:197:35:197:46 | service_view | asio_streams.cpp:197:16:197:22 | call to resolve | provenance | MaD:116 | -| asio_streams.cpp:198:35:198:46 | service_view | asio_streams.cpp:198:16:198:22 | call to resolve | provenance | MaD:117 | -| asio_streams.cpp:199:35:199:46 | service_view | asio_streams.cpp:199:16:199:22 | call to resolve | provenance | MaD:118 | -| asio_streams.cpp:200:35:200:46 | service_view | asio_streams.cpp:200:16:200:22 | call to resolve | provenance | MaD:119 | -| asio_streams.cpp:202:40:202:46 | *service | asio_streams.cpp:202:16:202:22 | call to resolve | provenance | MaD:104 | -| asio_streams.cpp:203:40:203:46 | *service | asio_streams.cpp:203:16:203:22 | call to resolve | provenance | MaD:105 | -| asio_streams.cpp:204:40:204:46 | *service | asio_streams.cpp:204:16:204:22 | call to resolve | provenance | MaD:106 | -| asio_streams.cpp:205:40:205:46 | *service | asio_streams.cpp:205:16:205:22 | call to resolve | provenance | MaD:107 | -| asio_streams.cpp:207:45:207:56 | service_view | asio_streams.cpp:207:16:207:22 | call to resolve | provenance | MaD:108 | -| asio_streams.cpp:208:45:208:56 | service_view | asio_streams.cpp:208:16:208:22 | call to resolve | provenance | MaD:109 | -| asio_streams.cpp:209:45:209:56 | service_view | asio_streams.cpp:209:16:209:22 | call to resolve | provenance | MaD:110 | -| asio_streams.cpp:210:45:210:56 | service_view | asio_streams.cpp:210:16:210:22 | call to resolve | provenance | MaD:111 | +| asio_streams.cpp:116:34:116:44 | read_until output argument | asio_streams.cpp:120:7:120:17 | recv_buffer | provenance | Src:MaD:56 | +| asio_streams.cpp:116:34:116:44 | read_until output argument | asio_streams.cpp:122:29:122:39 | recv_buffer | provenance | Src:MaD:56 Sink:MaD:4 | +| asio_streams.cpp:126:37:126:44 | call to source | asio_streams.cpp:127:7:127:14 | send_str | provenance | TaintFunction | +| asio_streams.cpp:126:37:126:44 | call to source | asio_streams.cpp:129:64:129:71 | *send_str | provenance | TaintFunction | +| asio_streams.cpp:129:44:129:62 | call to buffer | asio_streams.cpp:129:44:129:62 | call to buffer | provenance | | +| asio_streams.cpp:129:44:129:62 | call to buffer | asio_streams.cpp:130:7:130:17 | send_buffer | provenance | | +| asio_streams.cpp:129:44:129:62 | call to buffer | asio_streams.cpp:132:29:132:39 | send_buffer | provenance | Sink:MaD:4 | +| asio_streams.cpp:129:64:129:71 | *send_str | asio_streams.cpp:129:44:129:62 | call to buffer | provenance | MaD:120 | +| asio_streams.cpp:143:19:143:26 | call to source | asio_streams.cpp:148:24:148:27 | *host | provenance | TaintFunction | +| asio_streams.cpp:143:19:143:26 | call to source | asio_streams.cpp:149:24:149:27 | *host | provenance | TaintFunction | +| asio_streams.cpp:143:19:143:26 | call to source | asio_streams.cpp:150:24:150:27 | *host | provenance | TaintFunction | +| asio_streams.cpp:143:19:143:26 | call to source | asio_streams.cpp:151:24:151:27 | *host | provenance | TaintFunction | +| asio_streams.cpp:143:19:143:26 | call to source | asio_streams.cpp:158:34:158:37 | *host | provenance | TaintFunction | +| asio_streams.cpp:143:19:143:26 | call to source | asio_streams.cpp:159:34:159:37 | *host | provenance | TaintFunction | +| asio_streams.cpp:143:19:143:26 | call to source | asio_streams.cpp:160:34:160:37 | *host | provenance | TaintFunction | +| asio_streams.cpp:143:19:143:26 | call to source | asio_streams.cpp:161:34:161:37 | *host | provenance | TaintFunction | +| asio_streams.cpp:145:29:145:36 | call to source | asio_streams.cpp:153:24:153:32 | host_view | provenance | TaintFunction | +| asio_streams.cpp:145:29:145:36 | call to source | asio_streams.cpp:154:24:154:32 | host_view | provenance | TaintFunction | +| asio_streams.cpp:145:29:145:36 | call to source | asio_streams.cpp:155:24:155:32 | host_view | provenance | TaintFunction | +| asio_streams.cpp:145:29:145:36 | call to source | asio_streams.cpp:156:24:156:32 | host_view | provenance | TaintFunction | +| asio_streams.cpp:145:29:145:36 | call to source | asio_streams.cpp:163:34:163:42 | host_view | provenance | TaintFunction | +| asio_streams.cpp:145:29:145:36 | call to source | asio_streams.cpp:164:34:164:42 | host_view | provenance | TaintFunction | +| asio_streams.cpp:145:29:145:36 | call to source | asio_streams.cpp:165:34:165:42 | host_view | provenance | TaintFunction | +| asio_streams.cpp:145:29:145:36 | call to source | asio_streams.cpp:166:34:166:42 | host_view | provenance | TaintFunction | +| asio_streams.cpp:148:24:148:27 | *host | asio_streams.cpp:148:16:148:22 | call to resolve | provenance | MaD:112 | +| asio_streams.cpp:149:24:149:27 | *host | asio_streams.cpp:149:16:149:22 | call to resolve | provenance | MaD:113 | +| asio_streams.cpp:150:24:150:27 | *host | asio_streams.cpp:150:16:150:22 | call to resolve | provenance | MaD:114 | +| asio_streams.cpp:151:24:151:27 | *host | asio_streams.cpp:151:16:151:22 | call to resolve | provenance | MaD:115 | +| asio_streams.cpp:153:24:153:32 | host_view | asio_streams.cpp:153:16:153:22 | call to resolve | provenance | MaD:116 | +| asio_streams.cpp:154:24:154:32 | host_view | asio_streams.cpp:154:16:154:22 | call to resolve | provenance | MaD:117 | +| asio_streams.cpp:155:24:155:32 | host_view | asio_streams.cpp:155:16:155:22 | call to resolve | provenance | MaD:118 | +| asio_streams.cpp:156:24:156:32 | host_view | asio_streams.cpp:156:16:156:22 | call to resolve | provenance | MaD:119 | +| asio_streams.cpp:158:34:158:37 | *host | asio_streams.cpp:158:16:158:22 | call to resolve | provenance | MaD:104 | +| asio_streams.cpp:159:34:159:37 | *host | asio_streams.cpp:159:16:159:22 | call to resolve | provenance | MaD:105 | +| asio_streams.cpp:160:34:160:37 | *host | asio_streams.cpp:160:16:160:22 | call to resolve | provenance | MaD:106 | +| asio_streams.cpp:161:34:161:37 | *host | asio_streams.cpp:161:16:161:22 | call to resolve | provenance | MaD:107 | +| asio_streams.cpp:163:34:163:42 | host_view | asio_streams.cpp:163:16:163:22 | call to resolve | provenance | MaD:108 | +| asio_streams.cpp:164:34:164:42 | host_view | asio_streams.cpp:164:16:164:22 | call to resolve | provenance | MaD:109 | +| asio_streams.cpp:165:34:165:42 | host_view | asio_streams.cpp:165:16:165:22 | call to resolve | provenance | MaD:110 | +| asio_streams.cpp:166:34:166:42 | host_view | asio_streams.cpp:166:16:166:22 | call to resolve | provenance | MaD:111 | +| asio_streams.cpp:175:22:175:29 | call to source | asio_streams.cpp:179:30:179:36 | *service | provenance | TaintFunction | +| asio_streams.cpp:175:22:175:29 | call to source | asio_streams.cpp:180:30:180:36 | *service | provenance | TaintFunction | +| asio_streams.cpp:175:22:175:29 | call to source | asio_streams.cpp:181:30:181:36 | *service | provenance | TaintFunction | +| asio_streams.cpp:175:22:175:29 | call to source | asio_streams.cpp:182:30:182:36 | *service | provenance | TaintFunction | +| asio_streams.cpp:175:22:175:29 | call to source | asio_streams.cpp:189:40:189:46 | *service | provenance | TaintFunction | +| asio_streams.cpp:175:22:175:29 | call to source | asio_streams.cpp:190:40:190:46 | *service | provenance | TaintFunction | +| asio_streams.cpp:175:22:175:29 | call to source | asio_streams.cpp:191:40:191:46 | *service | provenance | TaintFunction | +| asio_streams.cpp:175:22:175:29 | call to source | asio_streams.cpp:192:40:192:46 | *service | provenance | TaintFunction | +| asio_streams.cpp:177:32:177:39 | call to source | asio_streams.cpp:184:35:184:46 | service_view | provenance | TaintFunction | +| asio_streams.cpp:177:32:177:39 | call to source | asio_streams.cpp:185:35:185:46 | service_view | provenance | TaintFunction | +| asio_streams.cpp:177:32:177:39 | call to source | asio_streams.cpp:186:35:186:46 | service_view | provenance | TaintFunction | +| asio_streams.cpp:177:32:177:39 | call to source | asio_streams.cpp:187:35:187:46 | service_view | provenance | TaintFunction | +| asio_streams.cpp:177:32:177:39 | call to source | asio_streams.cpp:194:45:194:56 | service_view | provenance | TaintFunction | +| asio_streams.cpp:177:32:177:39 | call to source | asio_streams.cpp:195:45:195:56 | service_view | provenance | TaintFunction | +| asio_streams.cpp:177:32:177:39 | call to source | asio_streams.cpp:196:45:196:56 | service_view | provenance | TaintFunction | +| asio_streams.cpp:177:32:177:39 | call to source | asio_streams.cpp:197:45:197:56 | service_view | provenance | TaintFunction | +| asio_streams.cpp:179:30:179:36 | *service | asio_streams.cpp:179:16:179:22 | call to resolve | provenance | MaD:112 | +| asio_streams.cpp:180:30:180:36 | *service | asio_streams.cpp:180:16:180:22 | call to resolve | provenance | MaD:113 | +| asio_streams.cpp:181:30:181:36 | *service | asio_streams.cpp:181:16:181:22 | call to resolve | provenance | MaD:114 | +| asio_streams.cpp:182:30:182:36 | *service | asio_streams.cpp:182:16:182:22 | call to resolve | provenance | MaD:115 | +| asio_streams.cpp:184:35:184:46 | service_view | asio_streams.cpp:184:16:184:22 | call to resolve | provenance | MaD:116 | +| asio_streams.cpp:185:35:185:46 | service_view | asio_streams.cpp:185:16:185:22 | call to resolve | provenance | MaD:117 | +| asio_streams.cpp:186:35:186:46 | service_view | asio_streams.cpp:186:16:186:22 | call to resolve | provenance | MaD:118 | +| asio_streams.cpp:187:35:187:46 | service_view | asio_streams.cpp:187:16:187:22 | call to resolve | provenance | MaD:119 | +| asio_streams.cpp:189:40:189:46 | *service | asio_streams.cpp:189:16:189:22 | call to resolve | provenance | MaD:104 | +| asio_streams.cpp:190:40:190:46 | *service | asio_streams.cpp:190:16:190:22 | call to resolve | provenance | MaD:105 | +| asio_streams.cpp:191:40:191:46 | *service | asio_streams.cpp:191:16:191:22 | call to resolve | provenance | MaD:106 | +| asio_streams.cpp:192:40:192:46 | *service | asio_streams.cpp:192:16:192:22 | call to resolve | provenance | MaD:107 | +| asio_streams.cpp:194:45:194:56 | service_view | asio_streams.cpp:194:16:194:22 | call to resolve | provenance | MaD:108 | +| asio_streams.cpp:195:45:195:56 | service_view | asio_streams.cpp:195:16:195:22 | call to resolve | provenance | MaD:109 | +| asio_streams.cpp:196:45:196:56 | service_view | asio_streams.cpp:196:16:196:22 | call to resolve | provenance | MaD:110 | +| asio_streams.cpp:197:45:197:56 | service_view | asio_streams.cpp:197:16:197:22 | call to resolve | provenance | MaD:111 | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:257:5:257:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:262:5:262:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:266:38:266:41 | *resp | provenance | | @@ -309,200 +309,200 @@ edges | bdlbb.cpp:94:46:94:48 | *src | bdlbb.cpp:94:37:94:40 | copy output argument | provenance | MaD:100 | | bdlbb.cpp:96:37:96:39 | copy output argument | bdlbb.cpp:97:7:97:10 | * ... | provenance | | | bdlbb.cpp:96:42:96:44 | *dst | bdlbb.cpp:96:37:96:39 | copy output argument | provenance | MaD:102 | -| protobuf.cpp:134:27:134:51 | call to source | protobuf.cpp:134:27:134:51 | call to source | provenance | | -| protobuf.cpp:134:27:134:51 | call to source | protobuf.cpp:135:22:135:25 | data | provenance | | -| protobuf.cpp:135:2:135:4 | ParseFromString output argument | protobuf.cpp:136:7:136:9 | msg | provenance | | -| protobuf.cpp:135:22:135:25 | data | protobuf.cpp:135:2:135:4 | ParseFromString output argument | provenance | MaD:141 | -| protobuf.cpp:141:20:141:37 | call to source | protobuf.cpp:141:20:141:37 | call to source | provenance | | -| protobuf.cpp:141:20:141:37 | call to source | protobuf.cpp:142:22:142:25 | *data | provenance | | -| protobuf.cpp:142:2:142:4 | ParseFromString output argument | protobuf.cpp:143:7:143:9 | msg | provenance | | -| protobuf.cpp:142:22:142:25 | *data | protobuf.cpp:142:2:142:4 | ParseFromString output argument | provenance | MaD:140 | -| protobuf.cpp:148:27:148:51 | call to source | protobuf.cpp:148:27:148:51 | call to source | provenance | | -| protobuf.cpp:148:27:148:51 | call to source | protobuf.cpp:149:29:149:32 | data | provenance | | -| protobuf.cpp:149:2:149:4 | ParsePartialFromString output argument | protobuf.cpp:150:7:150:9 | msg | provenance | | -| protobuf.cpp:149:29:149:32 | data | protobuf.cpp:149:2:149:4 | ParsePartialFromString output argument | provenance | MaD:149 | -| protobuf.cpp:155:20:155:37 | call to source | protobuf.cpp:155:20:155:37 | call to source | provenance | | -| protobuf.cpp:155:20:155:37 | call to source | protobuf.cpp:156:29:156:32 | *data | provenance | | -| protobuf.cpp:156:2:156:4 | ParsePartialFromString output argument | protobuf.cpp:157:7:157:9 | msg | provenance | | -| protobuf.cpp:156:29:156:32 | *data | protobuf.cpp:156:2:156:4 | ParsePartialFromString output argument | provenance | MaD:148 | -| protobuf.cpp:162:27:162:51 | call to source | protobuf.cpp:162:27:162:51 | call to source | provenance | | -| protobuf.cpp:162:27:162:51 | call to source | protobuf.cpp:163:22:163:25 | data | provenance | | -| protobuf.cpp:163:2:163:4 | MergeFromString output argument | protobuf.cpp:164:7:164:9 | msg | provenance | | -| protobuf.cpp:163:22:163:25 | data | protobuf.cpp:163:2:163:4 | MergeFromString output argument | provenance | MaD:129 | -| protobuf.cpp:169:20:169:37 | call to source | protobuf.cpp:169:20:169:37 | call to source | provenance | | -| protobuf.cpp:169:20:169:37 | call to source | protobuf.cpp:170:22:170:25 | *data | provenance | | -| protobuf.cpp:170:2:170:4 | MergeFromString output argument | protobuf.cpp:171:7:171:9 | msg | provenance | | -| protobuf.cpp:170:22:170:25 | *data | protobuf.cpp:170:2:170:4 | MergeFromString output argument | provenance | MaD:128 | -| protobuf.cpp:176:27:176:51 | call to source | protobuf.cpp:176:27:176:51 | call to source | provenance | | -| protobuf.cpp:176:27:176:51 | call to source | protobuf.cpp:177:29:177:32 | data | provenance | | -| protobuf.cpp:177:2:177:4 | MergePartialFromString output argument | protobuf.cpp:178:7:178:9 | msg | provenance | | -| protobuf.cpp:177:29:177:32 | data | protobuf.cpp:177:2:177:4 | MergePartialFromString output argument | provenance | MaD:134 | -| protobuf.cpp:183:20:183:37 | call to source | protobuf.cpp:183:20:183:37 | call to source | provenance | | -| protobuf.cpp:183:20:183:37 | call to source | protobuf.cpp:184:29:184:32 | *data | provenance | | -| protobuf.cpp:184:2:184:4 | MergePartialFromString output argument | protobuf.cpp:185:7:185:9 | msg | provenance | | -| protobuf.cpp:184:29:184:32 | *data | protobuf.cpp:184:2:184:4 | MergePartialFromString output argument | provenance | MaD:133 | -| protobuf.cpp:190:19:190:38 | call to source | protobuf.cpp:191:21:191:31 | *call to data | provenance | TaintFunction | -| protobuf.cpp:191:2:191:4 | ParseFromArray output argument | protobuf.cpp:192:7:192:9 | msg | provenance | | -| protobuf.cpp:191:21:191:31 | *call to data | protobuf.cpp:191:2:191:4 | ParseFromArray output argument | provenance | MaD:135 | -| protobuf.cpp:197:19:197:38 | call to source | protobuf.cpp:198:28:198:38 | *call to data | provenance | TaintFunction | -| protobuf.cpp:198:2:198:4 | ParsePartialFromArray output argument | protobuf.cpp:199:7:199:9 | msg | provenance | | -| protobuf.cpp:198:28:198:38 | *call to data | protobuf.cpp:198:2:198:4 | ParsePartialFromArray output argument | provenance | MaD:143 | -| protobuf.cpp:204:20:204:37 | call to source | protobuf.cpp:204:20:204:37 | call to source | provenance | | -| protobuf.cpp:204:20:204:37 | call to source | protobuf.cpp:205:20:205:23 | *data | provenance | | -| protobuf.cpp:205:2:205:4 | ParseFromCord output argument | protobuf.cpp:206:7:206:9 | msg | provenance | | -| protobuf.cpp:205:20:205:23 | *data | protobuf.cpp:205:2:205:4 | ParseFromCord output argument | provenance | MaD:138 | -| protobuf.cpp:211:20:211:37 | call to source | protobuf.cpp:211:20:211:37 | call to source | provenance | | -| protobuf.cpp:211:20:211:37 | call to source | protobuf.cpp:212:27:212:30 | *data | provenance | | -| protobuf.cpp:212:2:212:4 | ParsePartialFromCord output argument | protobuf.cpp:213:7:213:9 | msg | provenance | | -| protobuf.cpp:212:27:212:30 | *data | protobuf.cpp:212:2:212:4 | ParsePartialFromCord output argument | provenance | MaD:146 | -| protobuf.cpp:218:20:218:37 | call to source | protobuf.cpp:218:20:218:37 | call to source | provenance | | -| protobuf.cpp:218:20:218:37 | call to source | protobuf.cpp:219:20:219:23 | *data | provenance | | -| protobuf.cpp:219:2:219:4 | MergeFromCord output argument | protobuf.cpp:220:7:220:9 | msg | provenance | | -| protobuf.cpp:219:20:219:23 | *data | protobuf.cpp:219:2:219:4 | MergeFromCord output argument | provenance | MaD:127 | -| protobuf.cpp:225:20:225:37 | call to source | protobuf.cpp:225:20:225:37 | call to source | provenance | | -| protobuf.cpp:225:20:225:37 | call to source | protobuf.cpp:226:27:226:30 | *data | provenance | | -| protobuf.cpp:226:2:226:4 | MergePartialFromCord output argument | protobuf.cpp:227:7:227:9 | msg | provenance | | -| protobuf.cpp:226:27:226:30 | *data | protobuf.cpp:226:2:226:4 | MergePartialFromCord output argument | provenance | MaD:132 | -| protobuf.cpp:232:20:232:39 | call to source | protobuf.cpp:232:20:232:39 | call to source | provenance | | -| protobuf.cpp:232:20:232:39 | call to source | protobuf.cpp:233:23:233:25 | *& ... | provenance | | -| protobuf.cpp:233:2:233:4 | ParseFromIstream output argument | protobuf.cpp:234:7:234:9 | msg | provenance | | -| protobuf.cpp:233:23:233:25 | *& ... | protobuf.cpp:233:2:233:4 | ParseFromIstream output argument | provenance | MaD:139 | -| protobuf.cpp:239:20:239:39 | call to source | protobuf.cpp:239:20:239:39 | call to source | provenance | | -| protobuf.cpp:239:20:239:39 | call to source | protobuf.cpp:240:30:240:32 | *& ... | provenance | | -| protobuf.cpp:240:2:240:4 | ParsePartialFromIstream output argument | protobuf.cpp:241:7:241:9 | msg | provenance | | -| protobuf.cpp:240:30:240:32 | *& ... | protobuf.cpp:240:2:240:4 | ParsePartialFromIstream output argument | provenance | MaD:147 | -| protobuf.cpp:246:27:246:53 | call to source | protobuf.cpp:246:27:246:53 | call to source | provenance | | -| protobuf.cpp:246:27:246:53 | call to source | protobuf.cpp:247:30:247:32 | *& ... | provenance | | -| protobuf.cpp:247:2:247:4 | ParseFromZeroCopyStream output argument | protobuf.cpp:248:7:248:9 | msg | provenance | | -| protobuf.cpp:247:30:247:32 | *& ... | protobuf.cpp:247:2:247:4 | ParseFromZeroCopyStream output argument | provenance | MaD:142 | -| protobuf.cpp:253:27:253:53 | call to source | protobuf.cpp:253:27:253:53 | call to source | provenance | | -| protobuf.cpp:253:27:253:53 | call to source | protobuf.cpp:254:37:254:39 | *& ... | provenance | | -| protobuf.cpp:254:2:254:4 | ParsePartialFromZeroCopyStream output argument | protobuf.cpp:255:7:255:9 | msg | provenance | | -| protobuf.cpp:254:37:254:39 | *& ... | protobuf.cpp:254:2:254:4 | ParsePartialFromZeroCopyStream output argument | provenance | MaD:150 | -| protobuf.cpp:260:27:260:53 | call to source | protobuf.cpp:260:27:260:53 | call to source | provenance | | -| protobuf.cpp:260:27:260:53 | call to source | protobuf.cpp:261:37:261:39 | *& ... | provenance | | -| protobuf.cpp:261:2:261:4 | ParseFromBoundedZeroCopyStream output argument | protobuf.cpp:262:7:262:9 | msg | provenance | | -| protobuf.cpp:261:37:261:39 | *& ... | protobuf.cpp:261:2:261:4 | ParseFromBoundedZeroCopyStream output argument | provenance | MaD:136 | -| protobuf.cpp:267:27:267:53 | call to source | protobuf.cpp:267:27:267:53 | call to source | provenance | | -| protobuf.cpp:267:27:267:53 | call to source | protobuf.cpp:268:44:268:46 | *& ... | provenance | | -| protobuf.cpp:268:2:268:4 | ParsePartialFromBoundedZeroCopyStream output argument | protobuf.cpp:269:7:269:9 | msg | provenance | | -| protobuf.cpp:268:44:268:46 | *& ... | protobuf.cpp:268:2:268:4 | ParsePartialFromBoundedZeroCopyStream output argument | provenance | MaD:144 | -| protobuf.cpp:274:27:274:53 | call to source | protobuf.cpp:274:27:274:53 | call to source | provenance | | -| protobuf.cpp:274:27:274:53 | call to source | protobuf.cpp:275:37:275:39 | *& ... | provenance | | -| protobuf.cpp:275:2:275:4 | MergeFromBoundedZeroCopyStream output argument | protobuf.cpp:276:7:276:9 | msg | provenance | | -| protobuf.cpp:275:37:275:39 | *& ... | protobuf.cpp:275:2:275:4 | MergeFromBoundedZeroCopyStream output argument | provenance | MaD:125 | -| protobuf.cpp:281:27:281:53 | call to source | protobuf.cpp:281:27:281:53 | call to source | provenance | | -| protobuf.cpp:281:27:281:53 | call to source | protobuf.cpp:282:44:282:46 | *& ... | provenance | | -| protobuf.cpp:282:2:282:4 | MergePartialFromBoundedZeroCopyStream output argument | protobuf.cpp:283:7:283:9 | msg | provenance | | -| protobuf.cpp:282:44:282:46 | *& ... | protobuf.cpp:282:2:282:4 | MergePartialFromBoundedZeroCopyStream output argument | provenance | MaD:130 | -| protobuf.cpp:288:24:288:47 | call to source | protobuf.cpp:288:24:288:47 | call to source | provenance | | -| protobuf.cpp:288:24:288:47 | call to source | protobuf.cpp:289:27:289:29 | *& ... | provenance | | -| protobuf.cpp:289:2:289:4 | ParseFromCodedStream output argument | protobuf.cpp:290:7:290:9 | msg | provenance | | -| protobuf.cpp:289:27:289:29 | *& ... | protobuf.cpp:289:2:289:4 | ParseFromCodedStream output argument | provenance | MaD:137 | -| protobuf.cpp:295:24:295:47 | call to source | protobuf.cpp:295:24:295:47 | call to source | provenance | | -| protobuf.cpp:295:24:295:47 | call to source | protobuf.cpp:296:34:296:36 | *& ... | provenance | | -| protobuf.cpp:296:2:296:4 | ParsePartialFromCodedStream output argument | protobuf.cpp:297:7:297:9 | msg | provenance | | -| protobuf.cpp:296:34:296:36 | *& ... | protobuf.cpp:296:2:296:4 | ParsePartialFromCodedStream output argument | provenance | MaD:145 | -| protobuf.cpp:302:24:302:47 | call to source | protobuf.cpp:302:24:302:47 | call to source | provenance | | -| protobuf.cpp:302:24:302:47 | call to source | protobuf.cpp:303:27:303:29 | *& ... | provenance | | -| protobuf.cpp:303:2:303:4 | MergeFromCodedStream output argument | protobuf.cpp:304:7:304:9 | msg | provenance | | -| protobuf.cpp:303:27:303:29 | *& ... | protobuf.cpp:303:2:303:4 | MergeFromCodedStream output argument | provenance | MaD:126 | -| protobuf.cpp:309:24:309:47 | call to source | protobuf.cpp:309:24:309:47 | call to source | provenance | | -| protobuf.cpp:309:24:309:47 | call to source | protobuf.cpp:310:34:310:36 | *& ... | provenance | | -| protobuf.cpp:310:2:310:4 | MergePartialFromCodedStream output argument | protobuf.cpp:311:7:311:9 | msg | provenance | | -| protobuf.cpp:310:34:310:36 | *& ... | protobuf.cpp:310:2:310:4 | MergePartialFromCodedStream output argument | provenance | MaD:131 | -| protobuf.cpp:324:15:324:28 | call to source | protobuf.cpp:324:15:324:28 | call to source | provenance | | -| protobuf.cpp:324:15:324:28 | call to source | protobuf.cpp:326:2:326:4 | *msg | provenance | | -| protobuf.cpp:326:2:326:4 | *msg | protobuf.cpp:326:24:326:27 | SerializeToString output argument | provenance | MaD:165 | -| protobuf.cpp:326:24:326:27 | SerializeToString output argument | protobuf.cpp:327:7:327:9 | out | provenance | | -| protobuf.cpp:331:15:331:28 | call to source | protobuf.cpp:331:15:331:28 | call to source | provenance | | -| protobuf.cpp:331:15:331:28 | call to source | protobuf.cpp:333:2:333:4 | *msg | provenance | | -| protobuf.cpp:333:2:333:4 | *msg | protobuf.cpp:333:31:333:34 | SerializePartialToString output argument | provenance | MaD:159 | -| protobuf.cpp:333:31:333:34 | SerializePartialToString output argument | protobuf.cpp:334:7:334:9 | out | provenance | | -| protobuf.cpp:338:15:338:28 | call to source | protobuf.cpp:338:15:338:28 | call to source | provenance | | -| protobuf.cpp:338:15:338:28 | call to source | protobuf.cpp:340:2:340:4 | *msg | provenance | | -| protobuf.cpp:340:2:340:4 | *msg | protobuf.cpp:340:21:340:24 | AppendToString output argument | provenance | MaD:124 | -| protobuf.cpp:340:21:340:24 | AppendToString output argument | protobuf.cpp:341:7:341:9 | out | provenance | | -| protobuf.cpp:345:15:345:28 | call to source | protobuf.cpp:345:15:345:28 | call to source | provenance | | -| protobuf.cpp:345:15:345:28 | call to source | protobuf.cpp:347:2:347:4 | *msg | provenance | | -| protobuf.cpp:347:2:347:4 | *msg | protobuf.cpp:347:28:347:31 | AppendPartialToString output argument | provenance | MaD:122 | -| protobuf.cpp:347:28:347:31 | AppendPartialToString output argument | protobuf.cpp:348:7:348:9 | out | provenance | | -| protobuf.cpp:352:15:352:28 | call to source | protobuf.cpp:352:15:352:28 | call to source | provenance | | -| protobuf.cpp:352:15:352:28 | call to source | protobuf.cpp:354:2:354:4 | *msg | provenance | | -| protobuf.cpp:354:2:354:4 | *msg | protobuf.cpp:354:24:354:27 | SerializeToString output argument | provenance | MaD:165 | -| protobuf.cpp:354:24:354:27 | SerializeToString output argument | protobuf.cpp:355:7:355:9 | out | provenance | | -| protobuf.cpp:359:15:359:28 | call to source | protobuf.cpp:359:15:359:28 | call to source | provenance | | -| protobuf.cpp:359:15:359:28 | call to source | protobuf.cpp:361:2:361:4 | *msg | provenance | | -| protobuf.cpp:361:2:361:4 | *msg | protobuf.cpp:361:31:361:34 | SerializePartialToString output argument | provenance | MaD:159 | -| protobuf.cpp:361:31:361:34 | SerializePartialToString output argument | protobuf.cpp:362:7:362:9 | out | provenance | | -| protobuf.cpp:366:15:366:28 | call to source | protobuf.cpp:366:15:366:28 | call to source | provenance | | -| protobuf.cpp:366:15:366:28 | call to source | protobuf.cpp:368:2:368:4 | *msg | provenance | | -| protobuf.cpp:368:2:368:4 | *msg | protobuf.cpp:368:21:368:24 | AppendToString output argument | provenance | MaD:124 | -| protobuf.cpp:368:21:368:24 | AppendToString output argument | protobuf.cpp:369:7:369:9 | out | provenance | | -| protobuf.cpp:373:15:373:28 | call to source | protobuf.cpp:373:15:373:28 | call to source | provenance | | -| protobuf.cpp:373:15:373:28 | call to source | protobuf.cpp:375:2:375:4 | *msg | provenance | | -| protobuf.cpp:375:2:375:4 | *msg | protobuf.cpp:375:28:375:31 | AppendPartialToString output argument | provenance | MaD:122 | -| protobuf.cpp:375:28:375:31 | AppendPartialToString output argument | protobuf.cpp:376:7:376:9 | out | provenance | | -| protobuf.cpp:380:15:380:28 | call to source | protobuf.cpp:380:15:380:28 | call to source | provenance | | -| protobuf.cpp:380:15:380:28 | call to source | protobuf.cpp:382:2:382:4 | *msg | provenance | | -| protobuf.cpp:382:2:382:4 | *msg | protobuf.cpp:382:23:382:25 | SerializeToArray output argument | provenance | MaD:161 | -| protobuf.cpp:382:23:382:25 | SerializeToArray output argument | protobuf.cpp:383:7:383:10 | * ... | provenance | | -| protobuf.cpp:387:15:387:28 | call to source | protobuf.cpp:387:15:387:28 | call to source | provenance | | -| protobuf.cpp:387:15:387:28 | call to source | protobuf.cpp:389:2:389:4 | *msg | provenance | | -| protobuf.cpp:389:2:389:4 | *msg | protobuf.cpp:389:30:389:32 | SerializePartialToArray output argument | provenance | MaD:155 | -| protobuf.cpp:389:30:389:32 | SerializePartialToArray output argument | protobuf.cpp:390:7:390:10 | * ... | provenance | | -| protobuf.cpp:394:15:394:28 | call to source | protobuf.cpp:394:15:394:28 | call to source | provenance | | -| protobuf.cpp:394:15:394:28 | call to source | protobuf.cpp:396:2:396:4 | *msg | provenance | | -| protobuf.cpp:396:2:396:4 | *msg | protobuf.cpp:396:22:396:25 | SerializeToCord output argument | provenance | MaD:163 | -| protobuf.cpp:396:22:396:25 | SerializeToCord output argument | protobuf.cpp:397:7:397:9 | out | provenance | | -| protobuf.cpp:401:15:401:28 | call to source | protobuf.cpp:401:15:401:28 | call to source | provenance | | -| protobuf.cpp:401:15:401:28 | call to source | protobuf.cpp:403:2:403:4 | *msg | provenance | | -| protobuf.cpp:403:2:403:4 | *msg | protobuf.cpp:403:29:403:32 | SerializePartialToCord output argument | provenance | MaD:157 | -| protobuf.cpp:403:29:403:32 | SerializePartialToCord output argument | protobuf.cpp:404:7:404:9 | out | provenance | | -| protobuf.cpp:408:15:408:28 | call to source | protobuf.cpp:408:15:408:28 | call to source | provenance | | -| protobuf.cpp:408:15:408:28 | call to source | protobuf.cpp:410:2:410:4 | *msg | provenance | | -| protobuf.cpp:410:2:410:4 | *msg | protobuf.cpp:410:19:410:22 | AppendToCord output argument | provenance | MaD:123 | -| protobuf.cpp:410:19:410:22 | AppendToCord output argument | protobuf.cpp:411:7:411:9 | out | provenance | | -| protobuf.cpp:415:15:415:28 | call to source | protobuf.cpp:415:15:415:28 | call to source | provenance | | -| protobuf.cpp:415:15:415:28 | call to source | protobuf.cpp:417:2:417:4 | *msg | provenance | | -| protobuf.cpp:417:2:417:4 | *msg | protobuf.cpp:417:26:417:29 | AppendPartialToCord output argument | provenance | MaD:121 | -| protobuf.cpp:417:26:417:29 | AppendPartialToCord output argument | protobuf.cpp:418:7:418:9 | out | provenance | | -| protobuf.cpp:422:15:422:28 | call to source | protobuf.cpp:422:15:422:28 | call to source | provenance | | -| protobuf.cpp:422:15:422:28 | call to source | protobuf.cpp:424:2:424:4 | *msg | provenance | | -| protobuf.cpp:424:2:424:4 | *msg | protobuf.cpp:424:25:424:28 | SerializeToOstream output argument | provenance | MaD:164 | -| protobuf.cpp:424:25:424:28 | SerializeToOstream output argument | protobuf.cpp:425:7:425:9 | out | provenance | | -| protobuf.cpp:429:15:429:28 | call to source | protobuf.cpp:429:15:429:28 | call to source | provenance | | -| protobuf.cpp:429:15:429:28 | call to source | protobuf.cpp:431:2:431:4 | *msg | provenance | | -| protobuf.cpp:431:2:431:4 | *msg | protobuf.cpp:431:32:431:35 | SerializePartialToOstream output argument | provenance | MaD:158 | -| protobuf.cpp:431:32:431:35 | SerializePartialToOstream output argument | protobuf.cpp:432:7:432:9 | out | provenance | | -| protobuf.cpp:436:15:436:28 | call to source | protobuf.cpp:436:15:436:28 | call to source | provenance | | -| protobuf.cpp:436:15:436:28 | call to source | protobuf.cpp:438:2:438:4 | *msg | provenance | | -| protobuf.cpp:438:2:438:4 | *msg | protobuf.cpp:438:32:438:35 | SerializeToZeroCopyStream output argument | provenance | MaD:166 | -| protobuf.cpp:438:32:438:35 | SerializeToZeroCopyStream output argument | protobuf.cpp:439:7:439:9 | out | provenance | | -| protobuf.cpp:443:15:443:28 | call to source | protobuf.cpp:443:15:443:28 | call to source | provenance | | -| protobuf.cpp:443:15:443:28 | call to source | protobuf.cpp:445:2:445:4 | *msg | provenance | | -| protobuf.cpp:445:2:445:4 | *msg | protobuf.cpp:445:39:445:42 | SerializePartialToZeroCopyStream output argument | provenance | MaD:160 | -| protobuf.cpp:445:39:445:42 | SerializePartialToZeroCopyStream output argument | protobuf.cpp:446:7:446:9 | out | provenance | | -| protobuf.cpp:450:15:450:28 | call to source | protobuf.cpp:450:15:450:28 | call to source | provenance | | -| protobuf.cpp:450:15:450:28 | call to source | protobuf.cpp:452:2:452:4 | *msg | provenance | | -| protobuf.cpp:452:2:452:4 | *msg | protobuf.cpp:452:29:452:32 | SerializeToCodedStream output argument | provenance | MaD:162 | -| protobuf.cpp:452:29:452:32 | SerializeToCodedStream output argument | protobuf.cpp:453:7:453:9 | out | provenance | | -| protobuf.cpp:457:15:457:28 | call to source | protobuf.cpp:457:15:457:28 | call to source | provenance | | -| protobuf.cpp:457:15:457:28 | call to source | protobuf.cpp:459:2:459:4 | *msg | provenance | | -| protobuf.cpp:459:2:459:4 | *msg | protobuf.cpp:459:36:459:39 | SerializePartialToCodedStream output argument | provenance | MaD:156 | -| protobuf.cpp:459:36:459:39 | SerializePartialToCodedStream output argument | protobuf.cpp:460:7:460:9 | out | provenance | | -| protobuf.cpp:466:15:466:28 | call to source | protobuf.cpp:466:15:466:28 | call to source | provenance | | -| protobuf.cpp:466:15:466:28 | call to source | protobuf.cpp:467:7:467:9 | *msg | provenance | | -| protobuf.cpp:467:7:467:9 | *msg | protobuf.cpp:467:11:467:27 | call to SerializeAsString | provenance | MaD:152 | -| protobuf.cpp:471:15:471:28 | call to source | protobuf.cpp:471:15:471:28 | call to source | provenance | | -| protobuf.cpp:471:15:471:28 | call to source | protobuf.cpp:472:7:472:9 | *msg | provenance | | -| protobuf.cpp:472:7:472:9 | *msg | protobuf.cpp:472:11:472:34 | call to SerializePartialAsString | provenance | MaD:154 | -| protobuf.cpp:476:15:476:28 | call to source | protobuf.cpp:476:15:476:28 | call to source | provenance | | -| protobuf.cpp:476:15:476:28 | call to source | protobuf.cpp:477:7:477:9 | *msg | provenance | | -| protobuf.cpp:477:7:477:9 | *msg | protobuf.cpp:477:11:477:25 | call to SerializeAsCord | provenance | MaD:151 | -| protobuf.cpp:481:15:481:28 | call to source | protobuf.cpp:481:15:481:28 | call to source | provenance | | -| protobuf.cpp:481:15:481:28 | call to source | protobuf.cpp:482:7:482:9 | *msg | provenance | | -| protobuf.cpp:482:7:482:9 | *msg | protobuf.cpp:482:11:482:32 | call to SerializePartialAsCord | provenance | MaD:153 | +| protobuf.cpp:117:27:117:51 | call to source | protobuf.cpp:117:27:117:51 | call to source | provenance | | +| protobuf.cpp:117:27:117:51 | call to source | protobuf.cpp:118:22:118:25 | data | provenance | | +| protobuf.cpp:118:2:118:4 | ParseFromString output argument | protobuf.cpp:119:7:119:9 | msg | provenance | | +| protobuf.cpp:118:22:118:25 | data | protobuf.cpp:118:2:118:4 | ParseFromString output argument | provenance | MaD:141 | +| protobuf.cpp:124:20:124:37 | call to source | protobuf.cpp:124:20:124:37 | call to source | provenance | | +| protobuf.cpp:124:20:124:37 | call to source | protobuf.cpp:125:22:125:25 | *data | provenance | | +| protobuf.cpp:125:2:125:4 | ParseFromString output argument | protobuf.cpp:126:7:126:9 | msg | provenance | | +| protobuf.cpp:125:22:125:25 | *data | protobuf.cpp:125:2:125:4 | ParseFromString output argument | provenance | MaD:140 | +| protobuf.cpp:131:27:131:51 | call to source | protobuf.cpp:131:27:131:51 | call to source | provenance | | +| protobuf.cpp:131:27:131:51 | call to source | protobuf.cpp:132:29:132:32 | data | provenance | | +| protobuf.cpp:132:2:132:4 | ParsePartialFromString output argument | protobuf.cpp:133:7:133:9 | msg | provenance | | +| protobuf.cpp:132:29:132:32 | data | protobuf.cpp:132:2:132:4 | ParsePartialFromString output argument | provenance | MaD:149 | +| protobuf.cpp:138:20:138:37 | call to source | protobuf.cpp:138:20:138:37 | call to source | provenance | | +| protobuf.cpp:138:20:138:37 | call to source | protobuf.cpp:139:29:139:32 | *data | provenance | | +| protobuf.cpp:139:2:139:4 | ParsePartialFromString output argument | protobuf.cpp:140:7:140:9 | msg | provenance | | +| protobuf.cpp:139:29:139:32 | *data | protobuf.cpp:139:2:139:4 | ParsePartialFromString output argument | provenance | MaD:148 | +| protobuf.cpp:145:27:145:51 | call to source | protobuf.cpp:145:27:145:51 | call to source | provenance | | +| protobuf.cpp:145:27:145:51 | call to source | protobuf.cpp:146:22:146:25 | data | provenance | | +| protobuf.cpp:146:2:146:4 | MergeFromString output argument | protobuf.cpp:147:7:147:9 | msg | provenance | | +| protobuf.cpp:146:22:146:25 | data | protobuf.cpp:146:2:146:4 | MergeFromString output argument | provenance | MaD:129 | +| protobuf.cpp:152:20:152:37 | call to source | protobuf.cpp:152:20:152:37 | call to source | provenance | | +| protobuf.cpp:152:20:152:37 | call to source | protobuf.cpp:153:22:153:25 | *data | provenance | | +| protobuf.cpp:153:2:153:4 | MergeFromString output argument | protobuf.cpp:154:7:154:9 | msg | provenance | | +| protobuf.cpp:153:22:153:25 | *data | protobuf.cpp:153:2:153:4 | MergeFromString output argument | provenance | MaD:128 | +| protobuf.cpp:159:27:159:51 | call to source | protobuf.cpp:159:27:159:51 | call to source | provenance | | +| protobuf.cpp:159:27:159:51 | call to source | protobuf.cpp:160:29:160:32 | data | provenance | | +| protobuf.cpp:160:2:160:4 | MergePartialFromString output argument | protobuf.cpp:161:7:161:9 | msg | provenance | | +| protobuf.cpp:160:29:160:32 | data | protobuf.cpp:160:2:160:4 | MergePartialFromString output argument | provenance | MaD:134 | +| protobuf.cpp:166:20:166:37 | call to source | protobuf.cpp:166:20:166:37 | call to source | provenance | | +| protobuf.cpp:166:20:166:37 | call to source | protobuf.cpp:167:29:167:32 | *data | provenance | | +| protobuf.cpp:167:2:167:4 | MergePartialFromString output argument | protobuf.cpp:168:7:168:9 | msg | provenance | | +| protobuf.cpp:167:29:167:32 | *data | protobuf.cpp:167:2:167:4 | MergePartialFromString output argument | provenance | MaD:133 | +| protobuf.cpp:173:19:173:38 | call to source | protobuf.cpp:174:21:174:31 | *call to data | provenance | TaintFunction | +| protobuf.cpp:174:2:174:4 | ParseFromArray output argument | protobuf.cpp:175:7:175:9 | msg | provenance | | +| protobuf.cpp:174:21:174:31 | *call to data | protobuf.cpp:174:2:174:4 | ParseFromArray output argument | provenance | MaD:135 | +| protobuf.cpp:180:19:180:38 | call to source | protobuf.cpp:181:28:181:38 | *call to data | provenance | TaintFunction | +| protobuf.cpp:181:2:181:4 | ParsePartialFromArray output argument | protobuf.cpp:182:7:182:9 | msg | provenance | | +| protobuf.cpp:181:28:181:38 | *call to data | protobuf.cpp:181:2:181:4 | ParsePartialFromArray output argument | provenance | MaD:143 | +| protobuf.cpp:187:20:187:37 | call to source | protobuf.cpp:187:20:187:37 | call to source | provenance | | +| protobuf.cpp:187:20:187:37 | call to source | protobuf.cpp:188:20:188:23 | *data | provenance | | +| protobuf.cpp:188:2:188:4 | ParseFromCord output argument | protobuf.cpp:189:7:189:9 | msg | provenance | | +| protobuf.cpp:188:20:188:23 | *data | protobuf.cpp:188:2:188:4 | ParseFromCord output argument | provenance | MaD:138 | +| protobuf.cpp:194:20:194:37 | call to source | protobuf.cpp:194:20:194:37 | call to source | provenance | | +| protobuf.cpp:194:20:194:37 | call to source | protobuf.cpp:195:27:195:30 | *data | provenance | | +| protobuf.cpp:195:2:195:4 | ParsePartialFromCord output argument | protobuf.cpp:196:7:196:9 | msg | provenance | | +| protobuf.cpp:195:27:195:30 | *data | protobuf.cpp:195:2:195:4 | ParsePartialFromCord output argument | provenance | MaD:146 | +| protobuf.cpp:201:20:201:37 | call to source | protobuf.cpp:201:20:201:37 | call to source | provenance | | +| protobuf.cpp:201:20:201:37 | call to source | protobuf.cpp:202:20:202:23 | *data | provenance | | +| protobuf.cpp:202:2:202:4 | MergeFromCord output argument | protobuf.cpp:203:7:203:9 | msg | provenance | | +| protobuf.cpp:202:20:202:23 | *data | protobuf.cpp:202:2:202:4 | MergeFromCord output argument | provenance | MaD:127 | +| protobuf.cpp:208:20:208:37 | call to source | protobuf.cpp:208:20:208:37 | call to source | provenance | | +| protobuf.cpp:208:20:208:37 | call to source | protobuf.cpp:209:27:209:30 | *data | provenance | | +| protobuf.cpp:209:2:209:4 | MergePartialFromCord output argument | protobuf.cpp:210:7:210:9 | msg | provenance | | +| protobuf.cpp:209:27:209:30 | *data | protobuf.cpp:209:2:209:4 | MergePartialFromCord output argument | provenance | MaD:132 | +| protobuf.cpp:215:20:215:39 | call to source | protobuf.cpp:215:20:215:39 | call to source | provenance | | +| protobuf.cpp:215:20:215:39 | call to source | protobuf.cpp:216:23:216:25 | *& ... | provenance | | +| protobuf.cpp:216:2:216:4 | ParseFromIstream output argument | protobuf.cpp:217:7:217:9 | msg | provenance | | +| protobuf.cpp:216:23:216:25 | *& ... | protobuf.cpp:216:2:216:4 | ParseFromIstream output argument | provenance | MaD:139 | +| protobuf.cpp:222:20:222:39 | call to source | protobuf.cpp:222:20:222:39 | call to source | provenance | | +| protobuf.cpp:222:20:222:39 | call to source | protobuf.cpp:223:30:223:32 | *& ... | provenance | | +| protobuf.cpp:223:2:223:4 | ParsePartialFromIstream output argument | protobuf.cpp:224:7:224:9 | msg | provenance | | +| protobuf.cpp:223:30:223:32 | *& ... | protobuf.cpp:223:2:223:4 | ParsePartialFromIstream output argument | provenance | MaD:147 | +| protobuf.cpp:229:27:229:53 | call to source | protobuf.cpp:229:27:229:53 | call to source | provenance | | +| protobuf.cpp:229:27:229:53 | call to source | protobuf.cpp:230:30:230:32 | *& ... | provenance | | +| protobuf.cpp:230:2:230:4 | ParseFromZeroCopyStream output argument | protobuf.cpp:231:7:231:9 | msg | provenance | | +| protobuf.cpp:230:30:230:32 | *& ... | protobuf.cpp:230:2:230:4 | ParseFromZeroCopyStream output argument | provenance | MaD:142 | +| protobuf.cpp:236:27:236:53 | call to source | protobuf.cpp:236:27:236:53 | call to source | provenance | | +| protobuf.cpp:236:27:236:53 | call to source | protobuf.cpp:237:37:237:39 | *& ... | provenance | | +| protobuf.cpp:237:2:237:4 | ParsePartialFromZeroCopyStream output argument | protobuf.cpp:238:7:238:9 | msg | provenance | | +| protobuf.cpp:237:37:237:39 | *& ... | protobuf.cpp:237:2:237:4 | ParsePartialFromZeroCopyStream output argument | provenance | MaD:150 | +| protobuf.cpp:243:27:243:53 | call to source | protobuf.cpp:243:27:243:53 | call to source | provenance | | +| protobuf.cpp:243:27:243:53 | call to source | protobuf.cpp:244:37:244:39 | *& ... | provenance | | +| protobuf.cpp:244:2:244:4 | ParseFromBoundedZeroCopyStream output argument | protobuf.cpp:245:7:245:9 | msg | provenance | | +| protobuf.cpp:244:37:244:39 | *& ... | protobuf.cpp:244:2:244:4 | ParseFromBoundedZeroCopyStream output argument | provenance | MaD:136 | +| protobuf.cpp:250:27:250:53 | call to source | protobuf.cpp:250:27:250:53 | call to source | provenance | | +| protobuf.cpp:250:27:250:53 | call to source | protobuf.cpp:251:44:251:46 | *& ... | provenance | | +| protobuf.cpp:251:2:251:4 | ParsePartialFromBoundedZeroCopyStream output argument | protobuf.cpp:252:7:252:9 | msg | provenance | | +| protobuf.cpp:251:44:251:46 | *& ... | protobuf.cpp:251:2:251:4 | ParsePartialFromBoundedZeroCopyStream output argument | provenance | MaD:144 | +| protobuf.cpp:257:27:257:53 | call to source | protobuf.cpp:257:27:257:53 | call to source | provenance | | +| protobuf.cpp:257:27:257:53 | call to source | protobuf.cpp:258:37:258:39 | *& ... | provenance | | +| protobuf.cpp:258:2:258:4 | MergeFromBoundedZeroCopyStream output argument | protobuf.cpp:259:7:259:9 | msg | provenance | | +| protobuf.cpp:258:37:258:39 | *& ... | protobuf.cpp:258:2:258:4 | MergeFromBoundedZeroCopyStream output argument | provenance | MaD:125 | +| protobuf.cpp:264:27:264:53 | call to source | protobuf.cpp:264:27:264:53 | call to source | provenance | | +| protobuf.cpp:264:27:264:53 | call to source | protobuf.cpp:265:44:265:46 | *& ... | provenance | | +| protobuf.cpp:265:2:265:4 | MergePartialFromBoundedZeroCopyStream output argument | protobuf.cpp:266:7:266:9 | msg | provenance | | +| protobuf.cpp:265:44:265:46 | *& ... | protobuf.cpp:265:2:265:4 | MergePartialFromBoundedZeroCopyStream output argument | provenance | MaD:130 | +| protobuf.cpp:271:24:271:47 | call to source | protobuf.cpp:271:24:271:47 | call to source | provenance | | +| protobuf.cpp:271:24:271:47 | call to source | protobuf.cpp:272:27:272:29 | *& ... | provenance | | +| protobuf.cpp:272:2:272:4 | ParseFromCodedStream output argument | protobuf.cpp:273:7:273:9 | msg | provenance | | +| protobuf.cpp:272:27:272:29 | *& ... | protobuf.cpp:272:2:272:4 | ParseFromCodedStream output argument | provenance | MaD:137 | +| protobuf.cpp:278:24:278:47 | call to source | protobuf.cpp:278:24:278:47 | call to source | provenance | | +| protobuf.cpp:278:24:278:47 | call to source | protobuf.cpp:279:34:279:36 | *& ... | provenance | | +| protobuf.cpp:279:2:279:4 | ParsePartialFromCodedStream output argument | protobuf.cpp:280:7:280:9 | msg | provenance | | +| protobuf.cpp:279:34:279:36 | *& ... | protobuf.cpp:279:2:279:4 | ParsePartialFromCodedStream output argument | provenance | MaD:145 | +| protobuf.cpp:285:24:285:47 | call to source | protobuf.cpp:285:24:285:47 | call to source | provenance | | +| protobuf.cpp:285:24:285:47 | call to source | protobuf.cpp:286:27:286:29 | *& ... | provenance | | +| protobuf.cpp:286:2:286:4 | MergeFromCodedStream output argument | protobuf.cpp:287:7:287:9 | msg | provenance | | +| protobuf.cpp:286:27:286:29 | *& ... | protobuf.cpp:286:2:286:4 | MergeFromCodedStream output argument | provenance | MaD:126 | +| protobuf.cpp:292:24:292:47 | call to source | protobuf.cpp:292:24:292:47 | call to source | provenance | | +| protobuf.cpp:292:24:292:47 | call to source | protobuf.cpp:293:34:293:36 | *& ... | provenance | | +| protobuf.cpp:293:2:293:4 | MergePartialFromCodedStream output argument | protobuf.cpp:294:7:294:9 | msg | provenance | | +| protobuf.cpp:293:34:293:36 | *& ... | protobuf.cpp:293:2:293:4 | MergePartialFromCodedStream output argument | provenance | MaD:131 | +| protobuf.cpp:307:15:307:28 | call to source | protobuf.cpp:307:15:307:28 | call to source | provenance | | +| protobuf.cpp:307:15:307:28 | call to source | protobuf.cpp:309:2:309:4 | *msg | provenance | | +| protobuf.cpp:309:2:309:4 | *msg | protobuf.cpp:309:24:309:27 | SerializeToString output argument | provenance | MaD:165 | +| protobuf.cpp:309:24:309:27 | SerializeToString output argument | protobuf.cpp:310:7:310:9 | out | provenance | | +| protobuf.cpp:314:15:314:28 | call to source | protobuf.cpp:314:15:314:28 | call to source | provenance | | +| protobuf.cpp:314:15:314:28 | call to source | protobuf.cpp:316:2:316:4 | *msg | provenance | | +| protobuf.cpp:316:2:316:4 | *msg | protobuf.cpp:316:31:316:34 | SerializePartialToString output argument | provenance | MaD:159 | +| protobuf.cpp:316:31:316:34 | SerializePartialToString output argument | protobuf.cpp:317:7:317:9 | out | provenance | | +| protobuf.cpp:321:15:321:28 | call to source | protobuf.cpp:321:15:321:28 | call to source | provenance | | +| protobuf.cpp:321:15:321:28 | call to source | protobuf.cpp:323:2:323:4 | *msg | provenance | | +| protobuf.cpp:323:2:323:4 | *msg | protobuf.cpp:323:21:323:24 | AppendToString output argument | provenance | MaD:124 | +| protobuf.cpp:323:21:323:24 | AppendToString output argument | protobuf.cpp:324:7:324:9 | out | provenance | | +| protobuf.cpp:328:15:328:28 | call to source | protobuf.cpp:328:15:328:28 | call to source | provenance | | +| protobuf.cpp:328:15:328:28 | call to source | protobuf.cpp:330:2:330:4 | *msg | provenance | | +| protobuf.cpp:330:2:330:4 | *msg | protobuf.cpp:330:28:330:31 | AppendPartialToString output argument | provenance | MaD:122 | +| protobuf.cpp:330:28:330:31 | AppendPartialToString output argument | protobuf.cpp:331:7:331:9 | out | provenance | | +| protobuf.cpp:335:15:335:28 | call to source | protobuf.cpp:335:15:335:28 | call to source | provenance | | +| protobuf.cpp:335:15:335:28 | call to source | protobuf.cpp:337:2:337:4 | *msg | provenance | | +| protobuf.cpp:337:2:337:4 | *msg | protobuf.cpp:337:24:337:27 | SerializeToString output argument | provenance | MaD:165 | +| protobuf.cpp:337:24:337:27 | SerializeToString output argument | protobuf.cpp:338:7:338:9 | out | provenance | | +| protobuf.cpp:342:15:342:28 | call to source | protobuf.cpp:342:15:342:28 | call to source | provenance | | +| protobuf.cpp:342:15:342:28 | call to source | protobuf.cpp:344:2:344:4 | *msg | provenance | | +| protobuf.cpp:344:2:344:4 | *msg | protobuf.cpp:344:31:344:34 | SerializePartialToString output argument | provenance | MaD:159 | +| protobuf.cpp:344:31:344:34 | SerializePartialToString output argument | protobuf.cpp:345:7:345:9 | out | provenance | | +| protobuf.cpp:349:15:349:28 | call to source | protobuf.cpp:349:15:349:28 | call to source | provenance | | +| protobuf.cpp:349:15:349:28 | call to source | protobuf.cpp:351:2:351:4 | *msg | provenance | | +| protobuf.cpp:351:2:351:4 | *msg | protobuf.cpp:351:21:351:24 | AppendToString output argument | provenance | MaD:124 | +| protobuf.cpp:351:21:351:24 | AppendToString output argument | protobuf.cpp:352:7:352:9 | out | provenance | | +| protobuf.cpp:356:15:356:28 | call to source | protobuf.cpp:356:15:356:28 | call to source | provenance | | +| protobuf.cpp:356:15:356:28 | call to source | protobuf.cpp:358:2:358:4 | *msg | provenance | | +| protobuf.cpp:358:2:358:4 | *msg | protobuf.cpp:358:28:358:31 | AppendPartialToString output argument | provenance | MaD:122 | +| protobuf.cpp:358:28:358:31 | AppendPartialToString output argument | protobuf.cpp:359:7:359:9 | out | provenance | | +| protobuf.cpp:363:15:363:28 | call to source | protobuf.cpp:363:15:363:28 | call to source | provenance | | +| protobuf.cpp:363:15:363:28 | call to source | protobuf.cpp:365:2:365:4 | *msg | provenance | | +| protobuf.cpp:365:2:365:4 | *msg | protobuf.cpp:365:23:365:25 | SerializeToArray output argument | provenance | MaD:161 | +| protobuf.cpp:365:23:365:25 | SerializeToArray output argument | protobuf.cpp:366:7:366:10 | * ... | provenance | | +| protobuf.cpp:370:15:370:28 | call to source | protobuf.cpp:370:15:370:28 | call to source | provenance | | +| protobuf.cpp:370:15:370:28 | call to source | protobuf.cpp:372:2:372:4 | *msg | provenance | | +| protobuf.cpp:372:2:372:4 | *msg | protobuf.cpp:372:30:372:32 | SerializePartialToArray output argument | provenance | MaD:155 | +| protobuf.cpp:372:30:372:32 | SerializePartialToArray output argument | protobuf.cpp:373:7:373:10 | * ... | provenance | | +| protobuf.cpp:377:15:377:28 | call to source | protobuf.cpp:377:15:377:28 | call to source | provenance | | +| protobuf.cpp:377:15:377:28 | call to source | protobuf.cpp:379:2:379:4 | *msg | provenance | | +| protobuf.cpp:379:2:379:4 | *msg | protobuf.cpp:379:22:379:25 | SerializeToCord output argument | provenance | MaD:163 | +| protobuf.cpp:379:22:379:25 | SerializeToCord output argument | protobuf.cpp:380:7:380:9 | out | provenance | | +| protobuf.cpp:384:15:384:28 | call to source | protobuf.cpp:384:15:384:28 | call to source | provenance | | +| protobuf.cpp:384:15:384:28 | call to source | protobuf.cpp:386:2:386:4 | *msg | provenance | | +| protobuf.cpp:386:2:386:4 | *msg | protobuf.cpp:386:29:386:32 | SerializePartialToCord output argument | provenance | MaD:157 | +| protobuf.cpp:386:29:386:32 | SerializePartialToCord output argument | protobuf.cpp:387:7:387:9 | out | provenance | | +| protobuf.cpp:391:15:391:28 | call to source | protobuf.cpp:391:15:391:28 | call to source | provenance | | +| protobuf.cpp:391:15:391:28 | call to source | protobuf.cpp:393:2:393:4 | *msg | provenance | | +| protobuf.cpp:393:2:393:4 | *msg | protobuf.cpp:393:19:393:22 | AppendToCord output argument | provenance | MaD:123 | +| protobuf.cpp:393:19:393:22 | AppendToCord output argument | protobuf.cpp:394:7:394:9 | out | provenance | | +| protobuf.cpp:398:15:398:28 | call to source | protobuf.cpp:398:15:398:28 | call to source | provenance | | +| protobuf.cpp:398:15:398:28 | call to source | protobuf.cpp:400:2:400:4 | *msg | provenance | | +| protobuf.cpp:400:2:400:4 | *msg | protobuf.cpp:400:26:400:29 | AppendPartialToCord output argument | provenance | MaD:121 | +| protobuf.cpp:400:26:400:29 | AppendPartialToCord output argument | protobuf.cpp:401:7:401:9 | out | provenance | | +| protobuf.cpp:405:15:405:28 | call to source | protobuf.cpp:405:15:405:28 | call to source | provenance | | +| protobuf.cpp:405:15:405:28 | call to source | protobuf.cpp:407:2:407:4 | *msg | provenance | | +| protobuf.cpp:407:2:407:4 | *msg | protobuf.cpp:407:25:407:28 | SerializeToOstream output argument | provenance | MaD:164 | +| protobuf.cpp:407:25:407:28 | SerializeToOstream output argument | protobuf.cpp:408:7:408:9 | out | provenance | | +| protobuf.cpp:412:15:412:28 | call to source | protobuf.cpp:412:15:412:28 | call to source | provenance | | +| protobuf.cpp:412:15:412:28 | call to source | protobuf.cpp:414:2:414:4 | *msg | provenance | | +| protobuf.cpp:414:2:414:4 | *msg | protobuf.cpp:414:32:414:35 | SerializePartialToOstream output argument | provenance | MaD:158 | +| protobuf.cpp:414:32:414:35 | SerializePartialToOstream output argument | protobuf.cpp:415:7:415:9 | out | provenance | | +| protobuf.cpp:419:15:419:28 | call to source | protobuf.cpp:419:15:419:28 | call to source | provenance | | +| protobuf.cpp:419:15:419:28 | call to source | protobuf.cpp:421:2:421:4 | *msg | provenance | | +| protobuf.cpp:421:2:421:4 | *msg | protobuf.cpp:421:32:421:35 | SerializeToZeroCopyStream output argument | provenance | MaD:166 | +| protobuf.cpp:421:32:421:35 | SerializeToZeroCopyStream output argument | protobuf.cpp:422:7:422:9 | out | provenance | | +| protobuf.cpp:426:15:426:28 | call to source | protobuf.cpp:426:15:426:28 | call to source | provenance | | +| protobuf.cpp:426:15:426:28 | call to source | protobuf.cpp:428:2:428:4 | *msg | provenance | | +| protobuf.cpp:428:2:428:4 | *msg | protobuf.cpp:428:39:428:42 | SerializePartialToZeroCopyStream output argument | provenance | MaD:160 | +| protobuf.cpp:428:39:428:42 | SerializePartialToZeroCopyStream output argument | protobuf.cpp:429:7:429:9 | out | provenance | | +| protobuf.cpp:433:15:433:28 | call to source | protobuf.cpp:433:15:433:28 | call to source | provenance | | +| protobuf.cpp:433:15:433:28 | call to source | protobuf.cpp:435:2:435:4 | *msg | provenance | | +| protobuf.cpp:435:2:435:4 | *msg | protobuf.cpp:435:29:435:32 | SerializeToCodedStream output argument | provenance | MaD:162 | +| protobuf.cpp:435:29:435:32 | SerializeToCodedStream output argument | protobuf.cpp:436:7:436:9 | out | provenance | | +| protobuf.cpp:440:15:440:28 | call to source | protobuf.cpp:440:15:440:28 | call to source | provenance | | +| protobuf.cpp:440:15:440:28 | call to source | protobuf.cpp:442:2:442:4 | *msg | provenance | | +| protobuf.cpp:442:2:442:4 | *msg | protobuf.cpp:442:36:442:39 | SerializePartialToCodedStream output argument | provenance | MaD:156 | +| protobuf.cpp:442:36:442:39 | SerializePartialToCodedStream output argument | protobuf.cpp:443:7:443:9 | out | provenance | | +| protobuf.cpp:449:15:449:28 | call to source | protobuf.cpp:449:15:449:28 | call to source | provenance | | +| protobuf.cpp:449:15:449:28 | call to source | protobuf.cpp:450:7:450:9 | *msg | provenance | | +| protobuf.cpp:450:7:450:9 | *msg | protobuf.cpp:450:11:450:27 | call to SerializeAsString | provenance | MaD:152 | +| protobuf.cpp:454:15:454:28 | call to source | protobuf.cpp:454:15:454:28 | call to source | provenance | | +| protobuf.cpp:454:15:454:28 | call to source | protobuf.cpp:455:7:455:9 | *msg | provenance | | +| protobuf.cpp:455:7:455:9 | *msg | protobuf.cpp:455:11:455:34 | call to SerializePartialAsString | provenance | MaD:154 | +| protobuf.cpp:459:15:459:28 | call to source | protobuf.cpp:459:15:459:28 | call to source | provenance | | +| protobuf.cpp:459:15:459:28 | call to source | protobuf.cpp:460:7:460:9 | *msg | provenance | | +| protobuf.cpp:460:7:460:9 | *msg | protobuf.cpp:460:11:460:25 | call to SerializeAsCord | provenance | MaD:151 | +| protobuf.cpp:464:15:464:28 | call to source | protobuf.cpp:464:15:464:28 | call to source | provenance | | +| protobuf.cpp:464:15:464:28 | call to source | protobuf.cpp:465:7:465:9 | *msg | provenance | | +| protobuf.cpp:465:7:465:9 | *msg | protobuf.cpp:465:11:465:32 | call to SerializePartialAsCord | provenance | MaD:153 | | test.cpp:7:47:7:52 | value2 | test.cpp:7:64:7:69 | value2 | provenance | | | test.cpp:7:64:7:69 | value2 | test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | provenance | | | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:10:10:10:18 | call to ymlSource | provenance | Src:MaD:48 | @@ -846,84 +846,84 @@ edges | windows.cpp:1172:21:1172:24 | *guid | windows.cpp:1172:27:1172:29 | StringFromGUID2 output argument | provenance | MaD:76 | | windows.cpp:1172:27:1172:29 | StringFromGUID2 output argument | windows.cpp:1174:10:1174:13 | * ... | provenance | | nodes -| asio_streams.cpp:129:34:129:44 | read_until output argument | semmle.label | read_until output argument | -| asio_streams.cpp:133:7:133:17 | recv_buffer | semmle.label | recv_buffer | -| asio_streams.cpp:135:29:135:39 | recv_buffer | semmle.label | recv_buffer | -| asio_streams.cpp:139:37:139:44 | call to source | semmle.label | call to source | -| asio_streams.cpp:140:7:140:14 | send_str | semmle.label | send_str | -| asio_streams.cpp:142:44:142:62 | call to buffer | semmle.label | call to buffer | -| asio_streams.cpp:142:44:142:62 | call to buffer | semmle.label | call to buffer | -| asio_streams.cpp:142:64:142:71 | *send_str | semmle.label | *send_str | -| asio_streams.cpp:143:7:143:17 | send_buffer | semmle.label | send_buffer | -| asio_streams.cpp:145:29:145:39 | send_buffer | semmle.label | send_buffer | -| asio_streams.cpp:156:19:156:26 | call to source | semmle.label | call to source | -| asio_streams.cpp:158:29:158:36 | call to source | semmle.label | call to source | +| asio_streams.cpp:116:34:116:44 | read_until output argument | semmle.label | read_until output argument | +| asio_streams.cpp:120:7:120:17 | recv_buffer | semmle.label | recv_buffer | +| asio_streams.cpp:122:29:122:39 | recv_buffer | semmle.label | recv_buffer | +| asio_streams.cpp:126:37:126:44 | call to source | semmle.label | call to source | +| asio_streams.cpp:127:7:127:14 | send_str | semmle.label | send_str | +| asio_streams.cpp:129:44:129:62 | call to buffer | semmle.label | call to buffer | +| asio_streams.cpp:129:44:129:62 | call to buffer | semmle.label | call to buffer | +| asio_streams.cpp:129:64:129:71 | *send_str | semmle.label | *send_str | +| asio_streams.cpp:130:7:130:17 | send_buffer | semmle.label | send_buffer | +| asio_streams.cpp:132:29:132:39 | send_buffer | semmle.label | send_buffer | +| asio_streams.cpp:143:19:143:26 | call to source | semmle.label | call to source | +| asio_streams.cpp:145:29:145:36 | call to source | semmle.label | call to source | +| asio_streams.cpp:148:16:148:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:148:24:148:27 | *host | semmle.label | *host | +| asio_streams.cpp:149:16:149:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:149:24:149:27 | *host | semmle.label | *host | +| asio_streams.cpp:150:16:150:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:150:24:150:27 | *host | semmle.label | *host | +| asio_streams.cpp:151:16:151:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:151:24:151:27 | *host | semmle.label | *host | +| asio_streams.cpp:153:16:153:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:153:24:153:32 | host_view | semmle.label | host_view | +| asio_streams.cpp:154:16:154:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:154:24:154:32 | host_view | semmle.label | host_view | +| asio_streams.cpp:155:16:155:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:155:24:155:32 | host_view | semmle.label | host_view | +| asio_streams.cpp:156:16:156:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:156:24:156:32 | host_view | semmle.label | host_view | +| asio_streams.cpp:158:16:158:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:158:34:158:37 | *host | semmle.label | *host | +| asio_streams.cpp:159:16:159:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:159:34:159:37 | *host | semmle.label | *host | +| asio_streams.cpp:160:16:160:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:160:34:160:37 | *host | semmle.label | *host | | asio_streams.cpp:161:16:161:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:161:24:161:27 | *host | semmle.label | *host | -| asio_streams.cpp:162:16:162:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:162:24:162:27 | *host | semmle.label | *host | +| asio_streams.cpp:161:34:161:37 | *host | semmle.label | *host | | asio_streams.cpp:163:16:163:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:163:24:163:27 | *host | semmle.label | *host | +| asio_streams.cpp:163:34:163:42 | host_view | semmle.label | host_view | | asio_streams.cpp:164:16:164:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:164:24:164:27 | *host | semmle.label | *host | +| asio_streams.cpp:164:34:164:42 | host_view | semmle.label | host_view | +| asio_streams.cpp:165:16:165:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:165:34:165:42 | host_view | semmle.label | host_view | | asio_streams.cpp:166:16:166:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:166:24:166:32 | host_view | semmle.label | host_view | -| asio_streams.cpp:167:16:167:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:167:24:167:32 | host_view | semmle.label | host_view | -| asio_streams.cpp:168:16:168:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:168:24:168:32 | host_view | semmle.label | host_view | -| asio_streams.cpp:169:16:169:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:169:24:169:32 | host_view | semmle.label | host_view | -| asio_streams.cpp:171:16:171:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:171:34:171:37 | *host | semmle.label | *host | -| asio_streams.cpp:172:16:172:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:172:34:172:37 | *host | semmle.label | *host | -| asio_streams.cpp:173:16:173:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:173:34:173:37 | *host | semmle.label | *host | -| asio_streams.cpp:174:16:174:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:174:34:174:37 | *host | semmle.label | *host | -| asio_streams.cpp:176:16:176:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:176:34:176:42 | host_view | semmle.label | host_view | -| asio_streams.cpp:177:16:177:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:177:34:177:42 | host_view | semmle.label | host_view | -| asio_streams.cpp:178:16:178:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:178:34:178:42 | host_view | semmle.label | host_view | +| asio_streams.cpp:166:34:166:42 | host_view | semmle.label | host_view | +| asio_streams.cpp:175:22:175:29 | call to source | semmle.label | call to source | +| asio_streams.cpp:177:32:177:39 | call to source | semmle.label | call to source | | asio_streams.cpp:179:16:179:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:179:34:179:42 | host_view | semmle.label | host_view | -| asio_streams.cpp:188:22:188:29 | call to source | semmle.label | call to source | -| asio_streams.cpp:190:32:190:39 | call to source | semmle.label | call to source | +| asio_streams.cpp:179:30:179:36 | *service | semmle.label | *service | +| asio_streams.cpp:180:16:180:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:180:30:180:36 | *service | semmle.label | *service | +| asio_streams.cpp:181:16:181:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:181:30:181:36 | *service | semmle.label | *service | +| asio_streams.cpp:182:16:182:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:182:30:182:36 | *service | semmle.label | *service | +| asio_streams.cpp:184:16:184:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:184:35:184:46 | service_view | semmle.label | service_view | +| asio_streams.cpp:185:16:185:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:185:35:185:46 | service_view | semmle.label | service_view | +| asio_streams.cpp:186:16:186:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:186:35:186:46 | service_view | semmle.label | service_view | +| asio_streams.cpp:187:16:187:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:187:35:187:46 | service_view | semmle.label | service_view | +| asio_streams.cpp:189:16:189:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:189:40:189:46 | *service | semmle.label | *service | +| asio_streams.cpp:190:16:190:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:190:40:190:46 | *service | semmle.label | *service | +| asio_streams.cpp:191:16:191:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:191:40:191:46 | *service | semmle.label | *service | | asio_streams.cpp:192:16:192:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:192:30:192:36 | *service | semmle.label | *service | -| asio_streams.cpp:193:16:193:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:193:30:193:36 | *service | semmle.label | *service | +| asio_streams.cpp:192:40:192:46 | *service | semmle.label | *service | | asio_streams.cpp:194:16:194:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:194:30:194:36 | *service | semmle.label | *service | +| asio_streams.cpp:194:45:194:56 | service_view | semmle.label | service_view | | asio_streams.cpp:195:16:195:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:195:30:195:36 | *service | semmle.label | *service | +| asio_streams.cpp:195:45:195:56 | service_view | semmle.label | service_view | +| asio_streams.cpp:196:16:196:22 | call to resolve | semmle.label | call to resolve | +| asio_streams.cpp:196:45:196:56 | service_view | semmle.label | service_view | | asio_streams.cpp:197:16:197:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:197:35:197:46 | service_view | semmle.label | service_view | -| asio_streams.cpp:198:16:198:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:198:35:198:46 | service_view | semmle.label | service_view | -| asio_streams.cpp:199:16:199:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:199:35:199:46 | service_view | semmle.label | service_view | -| asio_streams.cpp:200:16:200:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:200:35:200:46 | service_view | semmle.label | service_view | -| asio_streams.cpp:202:16:202:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:202:40:202:46 | *service | semmle.label | *service | -| asio_streams.cpp:203:16:203:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:203:40:203:46 | *service | semmle.label | *service | -| asio_streams.cpp:204:16:204:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:204:40:204:46 | *service | semmle.label | *service | -| asio_streams.cpp:205:16:205:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:205:40:205:46 | *service | semmle.label | *service | -| asio_streams.cpp:207:16:207:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:207:45:207:56 | service_view | semmle.label | service_view | -| asio_streams.cpp:208:16:208:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:208:45:208:56 | service_view | semmle.label | service_view | -| asio_streams.cpp:209:16:209:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:209:45:209:56 | service_view | semmle.label | service_view | -| asio_streams.cpp:210:16:210:22 | call to resolve | semmle.label | call to resolve | -| asio_streams.cpp:210:45:210:56 | service_view | semmle.label | service_view | +| asio_streams.cpp:197:45:197:56 | service_view | semmle.label | service_view | | azure.cpp:253:48:253:60 | *call to GetBodyStream | semmle.label | *call to GetBodyStream | | azure.cpp:253:48:253:60 | call to GetBodyStream | semmle.label | call to GetBodyStream | | azure.cpp:257:5:257:8 | *resp | semmle.label | *resp | @@ -1005,250 +1005,250 @@ nodes | bdlbb.cpp:96:37:96:39 | copy output argument | semmle.label | copy output argument | | bdlbb.cpp:96:42:96:44 | *dst | semmle.label | *dst | | bdlbb.cpp:97:7:97:10 | * ... | semmle.label | * ... | -| protobuf.cpp:134:27:134:51 | call to source | semmle.label | call to source | -| protobuf.cpp:134:27:134:51 | call to source | semmle.label | call to source | -| protobuf.cpp:135:2:135:4 | ParseFromString output argument | semmle.label | ParseFromString output argument | -| protobuf.cpp:135:22:135:25 | data | semmle.label | data | -| protobuf.cpp:136:7:136:9 | msg | semmle.label | msg | -| protobuf.cpp:141:20:141:37 | call to source | semmle.label | call to source | -| protobuf.cpp:141:20:141:37 | call to source | semmle.label | call to source | -| protobuf.cpp:142:2:142:4 | ParseFromString output argument | semmle.label | ParseFromString output argument | -| protobuf.cpp:142:22:142:25 | *data | semmle.label | *data | -| protobuf.cpp:143:7:143:9 | msg | semmle.label | msg | -| protobuf.cpp:148:27:148:51 | call to source | semmle.label | call to source | -| protobuf.cpp:148:27:148:51 | call to source | semmle.label | call to source | -| protobuf.cpp:149:2:149:4 | ParsePartialFromString output argument | semmle.label | ParsePartialFromString output argument | -| protobuf.cpp:149:29:149:32 | data | semmle.label | data | -| protobuf.cpp:150:7:150:9 | msg | semmle.label | msg | -| protobuf.cpp:155:20:155:37 | call to source | semmle.label | call to source | -| protobuf.cpp:155:20:155:37 | call to source | semmle.label | call to source | -| protobuf.cpp:156:2:156:4 | ParsePartialFromString output argument | semmle.label | ParsePartialFromString output argument | -| protobuf.cpp:156:29:156:32 | *data | semmle.label | *data | -| protobuf.cpp:157:7:157:9 | msg | semmle.label | msg | -| protobuf.cpp:162:27:162:51 | call to source | semmle.label | call to source | -| protobuf.cpp:162:27:162:51 | call to source | semmle.label | call to source | -| protobuf.cpp:163:2:163:4 | MergeFromString output argument | semmle.label | MergeFromString output argument | -| protobuf.cpp:163:22:163:25 | data | semmle.label | data | -| protobuf.cpp:164:7:164:9 | msg | semmle.label | msg | -| protobuf.cpp:169:20:169:37 | call to source | semmle.label | call to source | -| protobuf.cpp:169:20:169:37 | call to source | semmle.label | call to source | -| protobuf.cpp:170:2:170:4 | MergeFromString output argument | semmle.label | MergeFromString output argument | -| protobuf.cpp:170:22:170:25 | *data | semmle.label | *data | -| protobuf.cpp:171:7:171:9 | msg | semmle.label | msg | -| protobuf.cpp:176:27:176:51 | call to source | semmle.label | call to source | -| protobuf.cpp:176:27:176:51 | call to source | semmle.label | call to source | -| protobuf.cpp:177:2:177:4 | MergePartialFromString output argument | semmle.label | MergePartialFromString output argument | -| protobuf.cpp:177:29:177:32 | data | semmle.label | data | -| protobuf.cpp:178:7:178:9 | msg | semmle.label | msg | -| protobuf.cpp:183:20:183:37 | call to source | semmle.label | call to source | -| protobuf.cpp:183:20:183:37 | call to source | semmle.label | call to source | -| protobuf.cpp:184:2:184:4 | MergePartialFromString output argument | semmle.label | MergePartialFromString output argument | -| protobuf.cpp:184:29:184:32 | *data | semmle.label | *data | -| protobuf.cpp:185:7:185:9 | msg | semmle.label | msg | -| protobuf.cpp:190:19:190:38 | call to source | semmle.label | call to source | -| protobuf.cpp:191:2:191:4 | ParseFromArray output argument | semmle.label | ParseFromArray output argument | -| protobuf.cpp:191:21:191:31 | *call to data | semmle.label | *call to data | -| protobuf.cpp:192:7:192:9 | msg | semmle.label | msg | -| protobuf.cpp:197:19:197:38 | call to source | semmle.label | call to source | -| protobuf.cpp:198:2:198:4 | ParsePartialFromArray output argument | semmle.label | ParsePartialFromArray output argument | -| protobuf.cpp:198:28:198:38 | *call to data | semmle.label | *call to data | -| protobuf.cpp:199:7:199:9 | msg | semmle.label | msg | -| protobuf.cpp:204:20:204:37 | call to source | semmle.label | call to source | -| protobuf.cpp:204:20:204:37 | call to source | semmle.label | call to source | -| protobuf.cpp:205:2:205:4 | ParseFromCord output argument | semmle.label | ParseFromCord output argument | -| protobuf.cpp:205:20:205:23 | *data | semmle.label | *data | -| protobuf.cpp:206:7:206:9 | msg | semmle.label | msg | -| protobuf.cpp:211:20:211:37 | call to source | semmle.label | call to source | -| protobuf.cpp:211:20:211:37 | call to source | semmle.label | call to source | -| protobuf.cpp:212:2:212:4 | ParsePartialFromCord output argument | semmle.label | ParsePartialFromCord output argument | -| protobuf.cpp:212:27:212:30 | *data | semmle.label | *data | -| protobuf.cpp:213:7:213:9 | msg | semmle.label | msg | -| protobuf.cpp:218:20:218:37 | call to source | semmle.label | call to source | -| protobuf.cpp:218:20:218:37 | call to source | semmle.label | call to source | -| protobuf.cpp:219:2:219:4 | MergeFromCord output argument | semmle.label | MergeFromCord output argument | -| protobuf.cpp:219:20:219:23 | *data | semmle.label | *data | -| protobuf.cpp:220:7:220:9 | msg | semmle.label | msg | -| protobuf.cpp:225:20:225:37 | call to source | semmle.label | call to source | -| protobuf.cpp:225:20:225:37 | call to source | semmle.label | call to source | -| protobuf.cpp:226:2:226:4 | MergePartialFromCord output argument | semmle.label | MergePartialFromCord output argument | -| protobuf.cpp:226:27:226:30 | *data | semmle.label | *data | -| protobuf.cpp:227:7:227:9 | msg | semmle.label | msg | -| protobuf.cpp:232:20:232:39 | call to source | semmle.label | call to source | -| protobuf.cpp:232:20:232:39 | call to source | semmle.label | call to source | -| protobuf.cpp:233:2:233:4 | ParseFromIstream output argument | semmle.label | ParseFromIstream output argument | -| protobuf.cpp:233:23:233:25 | *& ... | semmle.label | *& ... | -| protobuf.cpp:234:7:234:9 | msg | semmle.label | msg | -| protobuf.cpp:239:20:239:39 | call to source | semmle.label | call to source | -| protobuf.cpp:239:20:239:39 | call to source | semmle.label | call to source | -| protobuf.cpp:240:2:240:4 | ParsePartialFromIstream output argument | semmle.label | ParsePartialFromIstream output argument | -| protobuf.cpp:240:30:240:32 | *& ... | semmle.label | *& ... | -| protobuf.cpp:241:7:241:9 | msg | semmle.label | msg | -| protobuf.cpp:246:27:246:53 | call to source | semmle.label | call to source | -| protobuf.cpp:246:27:246:53 | call to source | semmle.label | call to source | -| protobuf.cpp:247:2:247:4 | ParseFromZeroCopyStream output argument | semmle.label | ParseFromZeroCopyStream output argument | -| protobuf.cpp:247:30:247:32 | *& ... | semmle.label | *& ... | -| protobuf.cpp:248:7:248:9 | msg | semmle.label | msg | -| protobuf.cpp:253:27:253:53 | call to source | semmle.label | call to source | -| protobuf.cpp:253:27:253:53 | call to source | semmle.label | call to source | -| protobuf.cpp:254:2:254:4 | ParsePartialFromZeroCopyStream output argument | semmle.label | ParsePartialFromZeroCopyStream output argument | -| protobuf.cpp:254:37:254:39 | *& ... | semmle.label | *& ... | -| protobuf.cpp:255:7:255:9 | msg | semmle.label | msg | -| protobuf.cpp:260:27:260:53 | call to source | semmle.label | call to source | -| protobuf.cpp:260:27:260:53 | call to source | semmle.label | call to source | -| protobuf.cpp:261:2:261:4 | ParseFromBoundedZeroCopyStream output argument | semmle.label | ParseFromBoundedZeroCopyStream output argument | -| protobuf.cpp:261:37:261:39 | *& ... | semmle.label | *& ... | -| protobuf.cpp:262:7:262:9 | msg | semmle.label | msg | -| protobuf.cpp:267:27:267:53 | call to source | semmle.label | call to source | -| protobuf.cpp:267:27:267:53 | call to source | semmle.label | call to source | -| protobuf.cpp:268:2:268:4 | ParsePartialFromBoundedZeroCopyStream output argument | semmle.label | ParsePartialFromBoundedZeroCopyStream output argument | -| protobuf.cpp:268:44:268:46 | *& ... | semmle.label | *& ... | -| protobuf.cpp:269:7:269:9 | msg | semmle.label | msg | -| protobuf.cpp:274:27:274:53 | call to source | semmle.label | call to source | -| protobuf.cpp:274:27:274:53 | call to source | semmle.label | call to source | -| protobuf.cpp:275:2:275:4 | MergeFromBoundedZeroCopyStream output argument | semmle.label | MergeFromBoundedZeroCopyStream output argument | -| protobuf.cpp:275:37:275:39 | *& ... | semmle.label | *& ... | -| protobuf.cpp:276:7:276:9 | msg | semmle.label | msg | -| protobuf.cpp:281:27:281:53 | call to source | semmle.label | call to source | -| protobuf.cpp:281:27:281:53 | call to source | semmle.label | call to source | -| protobuf.cpp:282:2:282:4 | MergePartialFromBoundedZeroCopyStream output argument | semmle.label | MergePartialFromBoundedZeroCopyStream output argument | -| protobuf.cpp:282:44:282:46 | *& ... | semmle.label | *& ... | -| protobuf.cpp:283:7:283:9 | msg | semmle.label | msg | -| protobuf.cpp:288:24:288:47 | call to source | semmle.label | call to source | -| protobuf.cpp:288:24:288:47 | call to source | semmle.label | call to source | -| protobuf.cpp:289:2:289:4 | ParseFromCodedStream output argument | semmle.label | ParseFromCodedStream output argument | -| protobuf.cpp:289:27:289:29 | *& ... | semmle.label | *& ... | -| protobuf.cpp:290:7:290:9 | msg | semmle.label | msg | -| protobuf.cpp:295:24:295:47 | call to source | semmle.label | call to source | -| protobuf.cpp:295:24:295:47 | call to source | semmle.label | call to source | -| protobuf.cpp:296:2:296:4 | ParsePartialFromCodedStream output argument | semmle.label | ParsePartialFromCodedStream output argument | -| protobuf.cpp:296:34:296:36 | *& ... | semmle.label | *& ... | -| protobuf.cpp:297:7:297:9 | msg | semmle.label | msg | -| protobuf.cpp:302:24:302:47 | call to source | semmle.label | call to source | -| protobuf.cpp:302:24:302:47 | call to source | semmle.label | call to source | -| protobuf.cpp:303:2:303:4 | MergeFromCodedStream output argument | semmle.label | MergeFromCodedStream output argument | -| protobuf.cpp:303:27:303:29 | *& ... | semmle.label | *& ... | -| protobuf.cpp:304:7:304:9 | msg | semmle.label | msg | -| protobuf.cpp:309:24:309:47 | call to source | semmle.label | call to source | -| protobuf.cpp:309:24:309:47 | call to source | semmle.label | call to source | -| protobuf.cpp:310:2:310:4 | MergePartialFromCodedStream output argument | semmle.label | MergePartialFromCodedStream output argument | -| protobuf.cpp:310:34:310:36 | *& ... | semmle.label | *& ... | -| protobuf.cpp:311:7:311:9 | msg | semmle.label | msg | -| protobuf.cpp:324:15:324:28 | call to source | semmle.label | call to source | -| protobuf.cpp:324:15:324:28 | call to source | semmle.label | call to source | -| protobuf.cpp:326:2:326:4 | *msg | semmle.label | *msg | -| protobuf.cpp:326:24:326:27 | SerializeToString output argument | semmle.label | SerializeToString output argument | -| protobuf.cpp:327:7:327:9 | out | semmle.label | out | -| protobuf.cpp:331:15:331:28 | call to source | semmle.label | call to source | -| protobuf.cpp:331:15:331:28 | call to source | semmle.label | call to source | -| protobuf.cpp:333:2:333:4 | *msg | semmle.label | *msg | -| protobuf.cpp:333:31:333:34 | SerializePartialToString output argument | semmle.label | SerializePartialToString output argument | -| protobuf.cpp:334:7:334:9 | out | semmle.label | out | -| protobuf.cpp:338:15:338:28 | call to source | semmle.label | call to source | -| protobuf.cpp:338:15:338:28 | call to source | semmle.label | call to source | -| protobuf.cpp:340:2:340:4 | *msg | semmle.label | *msg | -| protobuf.cpp:340:21:340:24 | AppendToString output argument | semmle.label | AppendToString output argument | -| protobuf.cpp:341:7:341:9 | out | semmle.label | out | -| protobuf.cpp:345:15:345:28 | call to source | semmle.label | call to source | -| protobuf.cpp:345:15:345:28 | call to source | semmle.label | call to source | -| protobuf.cpp:347:2:347:4 | *msg | semmle.label | *msg | -| protobuf.cpp:347:28:347:31 | AppendPartialToString output argument | semmle.label | AppendPartialToString output argument | -| protobuf.cpp:348:7:348:9 | out | semmle.label | out | -| protobuf.cpp:352:15:352:28 | call to source | semmle.label | call to source | -| protobuf.cpp:352:15:352:28 | call to source | semmle.label | call to source | -| protobuf.cpp:354:2:354:4 | *msg | semmle.label | *msg | -| protobuf.cpp:354:24:354:27 | SerializeToString output argument | semmle.label | SerializeToString output argument | -| protobuf.cpp:355:7:355:9 | out | semmle.label | out | -| protobuf.cpp:359:15:359:28 | call to source | semmle.label | call to source | -| protobuf.cpp:359:15:359:28 | call to source | semmle.label | call to source | -| protobuf.cpp:361:2:361:4 | *msg | semmle.label | *msg | -| protobuf.cpp:361:31:361:34 | SerializePartialToString output argument | semmle.label | SerializePartialToString output argument | -| protobuf.cpp:362:7:362:9 | out | semmle.label | out | -| protobuf.cpp:366:15:366:28 | call to source | semmle.label | call to source | -| protobuf.cpp:366:15:366:28 | call to source | semmle.label | call to source | -| protobuf.cpp:368:2:368:4 | *msg | semmle.label | *msg | -| protobuf.cpp:368:21:368:24 | AppendToString output argument | semmle.label | AppendToString output argument | -| protobuf.cpp:369:7:369:9 | out | semmle.label | out | -| protobuf.cpp:373:15:373:28 | call to source | semmle.label | call to source | -| protobuf.cpp:373:15:373:28 | call to source | semmle.label | call to source | -| protobuf.cpp:375:2:375:4 | *msg | semmle.label | *msg | -| protobuf.cpp:375:28:375:31 | AppendPartialToString output argument | semmle.label | AppendPartialToString output argument | -| protobuf.cpp:376:7:376:9 | out | semmle.label | out | -| protobuf.cpp:380:15:380:28 | call to source | semmle.label | call to source | -| protobuf.cpp:380:15:380:28 | call to source | semmle.label | call to source | -| protobuf.cpp:382:2:382:4 | *msg | semmle.label | *msg | -| protobuf.cpp:382:23:382:25 | SerializeToArray output argument | semmle.label | SerializeToArray output argument | -| protobuf.cpp:383:7:383:10 | * ... | semmle.label | * ... | -| protobuf.cpp:387:15:387:28 | call to source | semmle.label | call to source | -| protobuf.cpp:387:15:387:28 | call to source | semmle.label | call to source | -| protobuf.cpp:389:2:389:4 | *msg | semmle.label | *msg | -| protobuf.cpp:389:30:389:32 | SerializePartialToArray output argument | semmle.label | SerializePartialToArray output argument | -| protobuf.cpp:390:7:390:10 | * ... | semmle.label | * ... | -| protobuf.cpp:394:15:394:28 | call to source | semmle.label | call to source | -| protobuf.cpp:394:15:394:28 | call to source | semmle.label | call to source | -| protobuf.cpp:396:2:396:4 | *msg | semmle.label | *msg | -| protobuf.cpp:396:22:396:25 | SerializeToCord output argument | semmle.label | SerializeToCord output argument | -| protobuf.cpp:397:7:397:9 | out | semmle.label | out | -| protobuf.cpp:401:15:401:28 | call to source | semmle.label | call to source | -| protobuf.cpp:401:15:401:28 | call to source | semmle.label | call to source | -| protobuf.cpp:403:2:403:4 | *msg | semmle.label | *msg | -| protobuf.cpp:403:29:403:32 | SerializePartialToCord output argument | semmle.label | SerializePartialToCord output argument | -| protobuf.cpp:404:7:404:9 | out | semmle.label | out | -| protobuf.cpp:408:15:408:28 | call to source | semmle.label | call to source | -| protobuf.cpp:408:15:408:28 | call to source | semmle.label | call to source | -| protobuf.cpp:410:2:410:4 | *msg | semmle.label | *msg | -| protobuf.cpp:410:19:410:22 | AppendToCord output argument | semmle.label | AppendToCord output argument | -| protobuf.cpp:411:7:411:9 | out | semmle.label | out | -| protobuf.cpp:415:15:415:28 | call to source | semmle.label | call to source | -| protobuf.cpp:415:15:415:28 | call to source | semmle.label | call to source | -| protobuf.cpp:417:2:417:4 | *msg | semmle.label | *msg | -| protobuf.cpp:417:26:417:29 | AppendPartialToCord output argument | semmle.label | AppendPartialToCord output argument | -| protobuf.cpp:418:7:418:9 | out | semmle.label | out | -| protobuf.cpp:422:15:422:28 | call to source | semmle.label | call to source | -| protobuf.cpp:422:15:422:28 | call to source | semmle.label | call to source | -| protobuf.cpp:424:2:424:4 | *msg | semmle.label | *msg | -| protobuf.cpp:424:25:424:28 | SerializeToOstream output argument | semmle.label | SerializeToOstream output argument | -| protobuf.cpp:425:7:425:9 | out | semmle.label | out | -| protobuf.cpp:429:15:429:28 | call to source | semmle.label | call to source | -| protobuf.cpp:429:15:429:28 | call to source | semmle.label | call to source | -| protobuf.cpp:431:2:431:4 | *msg | semmle.label | *msg | -| protobuf.cpp:431:32:431:35 | SerializePartialToOstream output argument | semmle.label | SerializePartialToOstream output argument | -| protobuf.cpp:432:7:432:9 | out | semmle.label | out | -| protobuf.cpp:436:15:436:28 | call to source | semmle.label | call to source | -| protobuf.cpp:436:15:436:28 | call to source | semmle.label | call to source | -| protobuf.cpp:438:2:438:4 | *msg | semmle.label | *msg | -| protobuf.cpp:438:32:438:35 | SerializeToZeroCopyStream output argument | semmle.label | SerializeToZeroCopyStream output argument | -| protobuf.cpp:439:7:439:9 | out | semmle.label | out | -| protobuf.cpp:443:15:443:28 | call to source | semmle.label | call to source | -| protobuf.cpp:443:15:443:28 | call to source | semmle.label | call to source | -| protobuf.cpp:445:2:445:4 | *msg | semmle.label | *msg | -| protobuf.cpp:445:39:445:42 | SerializePartialToZeroCopyStream output argument | semmle.label | SerializePartialToZeroCopyStream output argument | -| protobuf.cpp:446:7:446:9 | out | semmle.label | out | -| protobuf.cpp:450:15:450:28 | call to source | semmle.label | call to source | -| protobuf.cpp:450:15:450:28 | call to source | semmle.label | call to source | -| protobuf.cpp:452:2:452:4 | *msg | semmle.label | *msg | -| protobuf.cpp:452:29:452:32 | SerializeToCodedStream output argument | semmle.label | SerializeToCodedStream output argument | -| protobuf.cpp:453:7:453:9 | out | semmle.label | out | -| protobuf.cpp:457:15:457:28 | call to source | semmle.label | call to source | -| protobuf.cpp:457:15:457:28 | call to source | semmle.label | call to source | -| protobuf.cpp:459:2:459:4 | *msg | semmle.label | *msg | -| protobuf.cpp:459:36:459:39 | SerializePartialToCodedStream output argument | semmle.label | SerializePartialToCodedStream output argument | -| protobuf.cpp:460:7:460:9 | out | semmle.label | out | -| protobuf.cpp:466:15:466:28 | call to source | semmle.label | call to source | -| protobuf.cpp:466:15:466:28 | call to source | semmle.label | call to source | -| protobuf.cpp:467:7:467:9 | *msg | semmle.label | *msg | -| protobuf.cpp:467:11:467:27 | call to SerializeAsString | semmle.label | call to SerializeAsString | -| protobuf.cpp:471:15:471:28 | call to source | semmle.label | call to source | -| protobuf.cpp:471:15:471:28 | call to source | semmle.label | call to source | -| protobuf.cpp:472:7:472:9 | *msg | semmle.label | *msg | -| protobuf.cpp:472:11:472:34 | call to SerializePartialAsString | semmle.label | call to SerializePartialAsString | -| protobuf.cpp:476:15:476:28 | call to source | semmle.label | call to source | -| protobuf.cpp:476:15:476:28 | call to source | semmle.label | call to source | -| protobuf.cpp:477:7:477:9 | *msg | semmle.label | *msg | -| protobuf.cpp:477:11:477:25 | call to SerializeAsCord | semmle.label | call to SerializeAsCord | -| protobuf.cpp:481:15:481:28 | call to source | semmle.label | call to source | -| protobuf.cpp:481:15:481:28 | call to source | semmle.label | call to source | -| protobuf.cpp:482:7:482:9 | *msg | semmle.label | *msg | -| protobuf.cpp:482:11:482:32 | call to SerializePartialAsCord | semmle.label | call to SerializePartialAsCord | +| protobuf.cpp:117:27:117:51 | call to source | semmle.label | call to source | +| protobuf.cpp:117:27:117:51 | call to source | semmle.label | call to source | +| protobuf.cpp:118:2:118:4 | ParseFromString output argument | semmle.label | ParseFromString output argument | +| protobuf.cpp:118:22:118:25 | data | semmle.label | data | +| protobuf.cpp:119:7:119:9 | msg | semmle.label | msg | +| protobuf.cpp:124:20:124:37 | call to source | semmle.label | call to source | +| protobuf.cpp:124:20:124:37 | call to source | semmle.label | call to source | +| protobuf.cpp:125:2:125:4 | ParseFromString output argument | semmle.label | ParseFromString output argument | +| protobuf.cpp:125:22:125:25 | *data | semmle.label | *data | +| protobuf.cpp:126:7:126:9 | msg | semmle.label | msg | +| protobuf.cpp:131:27:131:51 | call to source | semmle.label | call to source | +| protobuf.cpp:131:27:131:51 | call to source | semmle.label | call to source | +| protobuf.cpp:132:2:132:4 | ParsePartialFromString output argument | semmle.label | ParsePartialFromString output argument | +| protobuf.cpp:132:29:132:32 | data | semmle.label | data | +| protobuf.cpp:133:7:133:9 | msg | semmle.label | msg | +| protobuf.cpp:138:20:138:37 | call to source | semmle.label | call to source | +| protobuf.cpp:138:20:138:37 | call to source | semmle.label | call to source | +| protobuf.cpp:139:2:139:4 | ParsePartialFromString output argument | semmle.label | ParsePartialFromString output argument | +| protobuf.cpp:139:29:139:32 | *data | semmle.label | *data | +| protobuf.cpp:140:7:140:9 | msg | semmle.label | msg | +| protobuf.cpp:145:27:145:51 | call to source | semmle.label | call to source | +| protobuf.cpp:145:27:145:51 | call to source | semmle.label | call to source | +| protobuf.cpp:146:2:146:4 | MergeFromString output argument | semmle.label | MergeFromString output argument | +| protobuf.cpp:146:22:146:25 | data | semmle.label | data | +| protobuf.cpp:147:7:147:9 | msg | semmle.label | msg | +| protobuf.cpp:152:20:152:37 | call to source | semmle.label | call to source | +| protobuf.cpp:152:20:152:37 | call to source | semmle.label | call to source | +| protobuf.cpp:153:2:153:4 | MergeFromString output argument | semmle.label | MergeFromString output argument | +| protobuf.cpp:153:22:153:25 | *data | semmle.label | *data | +| protobuf.cpp:154:7:154:9 | msg | semmle.label | msg | +| protobuf.cpp:159:27:159:51 | call to source | semmle.label | call to source | +| protobuf.cpp:159:27:159:51 | call to source | semmle.label | call to source | +| protobuf.cpp:160:2:160:4 | MergePartialFromString output argument | semmle.label | MergePartialFromString output argument | +| protobuf.cpp:160:29:160:32 | data | semmle.label | data | +| protobuf.cpp:161:7:161:9 | msg | semmle.label | msg | +| protobuf.cpp:166:20:166:37 | call to source | semmle.label | call to source | +| protobuf.cpp:166:20:166:37 | call to source | semmle.label | call to source | +| protobuf.cpp:167:2:167:4 | MergePartialFromString output argument | semmle.label | MergePartialFromString output argument | +| protobuf.cpp:167:29:167:32 | *data | semmle.label | *data | +| protobuf.cpp:168:7:168:9 | msg | semmle.label | msg | +| protobuf.cpp:173:19:173:38 | call to source | semmle.label | call to source | +| protobuf.cpp:174:2:174:4 | ParseFromArray output argument | semmle.label | ParseFromArray output argument | +| protobuf.cpp:174:21:174:31 | *call to data | semmle.label | *call to data | +| protobuf.cpp:175:7:175:9 | msg | semmle.label | msg | +| protobuf.cpp:180:19:180:38 | call to source | semmle.label | call to source | +| protobuf.cpp:181:2:181:4 | ParsePartialFromArray output argument | semmle.label | ParsePartialFromArray output argument | +| protobuf.cpp:181:28:181:38 | *call to data | semmle.label | *call to data | +| protobuf.cpp:182:7:182:9 | msg | semmle.label | msg | +| protobuf.cpp:187:20:187:37 | call to source | semmle.label | call to source | +| protobuf.cpp:187:20:187:37 | call to source | semmle.label | call to source | +| protobuf.cpp:188:2:188:4 | ParseFromCord output argument | semmle.label | ParseFromCord output argument | +| protobuf.cpp:188:20:188:23 | *data | semmle.label | *data | +| protobuf.cpp:189:7:189:9 | msg | semmle.label | msg | +| protobuf.cpp:194:20:194:37 | call to source | semmle.label | call to source | +| protobuf.cpp:194:20:194:37 | call to source | semmle.label | call to source | +| protobuf.cpp:195:2:195:4 | ParsePartialFromCord output argument | semmle.label | ParsePartialFromCord output argument | +| protobuf.cpp:195:27:195:30 | *data | semmle.label | *data | +| protobuf.cpp:196:7:196:9 | msg | semmle.label | msg | +| protobuf.cpp:201:20:201:37 | call to source | semmle.label | call to source | +| protobuf.cpp:201:20:201:37 | call to source | semmle.label | call to source | +| protobuf.cpp:202:2:202:4 | MergeFromCord output argument | semmle.label | MergeFromCord output argument | +| protobuf.cpp:202:20:202:23 | *data | semmle.label | *data | +| protobuf.cpp:203:7:203:9 | msg | semmle.label | msg | +| protobuf.cpp:208:20:208:37 | call to source | semmle.label | call to source | +| protobuf.cpp:208:20:208:37 | call to source | semmle.label | call to source | +| protobuf.cpp:209:2:209:4 | MergePartialFromCord output argument | semmle.label | MergePartialFromCord output argument | +| protobuf.cpp:209:27:209:30 | *data | semmle.label | *data | +| protobuf.cpp:210:7:210:9 | msg | semmle.label | msg | +| protobuf.cpp:215:20:215:39 | call to source | semmle.label | call to source | +| protobuf.cpp:215:20:215:39 | call to source | semmle.label | call to source | +| protobuf.cpp:216:2:216:4 | ParseFromIstream output argument | semmle.label | ParseFromIstream output argument | +| protobuf.cpp:216:23:216:25 | *& ... | semmle.label | *& ... | +| protobuf.cpp:217:7:217:9 | msg | semmle.label | msg | +| protobuf.cpp:222:20:222:39 | call to source | semmle.label | call to source | +| protobuf.cpp:222:20:222:39 | call to source | semmle.label | call to source | +| protobuf.cpp:223:2:223:4 | ParsePartialFromIstream output argument | semmle.label | ParsePartialFromIstream output argument | +| protobuf.cpp:223:30:223:32 | *& ... | semmle.label | *& ... | +| protobuf.cpp:224:7:224:9 | msg | semmle.label | msg | +| protobuf.cpp:229:27:229:53 | call to source | semmle.label | call to source | +| protobuf.cpp:229:27:229:53 | call to source | semmle.label | call to source | +| protobuf.cpp:230:2:230:4 | ParseFromZeroCopyStream output argument | semmle.label | ParseFromZeroCopyStream output argument | +| protobuf.cpp:230:30:230:32 | *& ... | semmle.label | *& ... | +| protobuf.cpp:231:7:231:9 | msg | semmle.label | msg | +| protobuf.cpp:236:27:236:53 | call to source | semmle.label | call to source | +| protobuf.cpp:236:27:236:53 | call to source | semmle.label | call to source | +| protobuf.cpp:237:2:237:4 | ParsePartialFromZeroCopyStream output argument | semmle.label | ParsePartialFromZeroCopyStream output argument | +| protobuf.cpp:237:37:237:39 | *& ... | semmle.label | *& ... | +| protobuf.cpp:238:7:238:9 | msg | semmle.label | msg | +| protobuf.cpp:243:27:243:53 | call to source | semmle.label | call to source | +| protobuf.cpp:243:27:243:53 | call to source | semmle.label | call to source | +| protobuf.cpp:244:2:244:4 | ParseFromBoundedZeroCopyStream output argument | semmle.label | ParseFromBoundedZeroCopyStream output argument | +| protobuf.cpp:244:37:244:39 | *& ... | semmle.label | *& ... | +| protobuf.cpp:245:7:245:9 | msg | semmle.label | msg | +| protobuf.cpp:250:27:250:53 | call to source | semmle.label | call to source | +| protobuf.cpp:250:27:250:53 | call to source | semmle.label | call to source | +| protobuf.cpp:251:2:251:4 | ParsePartialFromBoundedZeroCopyStream output argument | semmle.label | ParsePartialFromBoundedZeroCopyStream output argument | +| protobuf.cpp:251:44:251:46 | *& ... | semmle.label | *& ... | +| protobuf.cpp:252:7:252:9 | msg | semmle.label | msg | +| protobuf.cpp:257:27:257:53 | call to source | semmle.label | call to source | +| protobuf.cpp:257:27:257:53 | call to source | semmle.label | call to source | +| protobuf.cpp:258:2:258:4 | MergeFromBoundedZeroCopyStream output argument | semmle.label | MergeFromBoundedZeroCopyStream output argument | +| protobuf.cpp:258:37:258:39 | *& ... | semmle.label | *& ... | +| protobuf.cpp:259:7:259:9 | msg | semmle.label | msg | +| protobuf.cpp:264:27:264:53 | call to source | semmle.label | call to source | +| protobuf.cpp:264:27:264:53 | call to source | semmle.label | call to source | +| protobuf.cpp:265:2:265:4 | MergePartialFromBoundedZeroCopyStream output argument | semmle.label | MergePartialFromBoundedZeroCopyStream output argument | +| protobuf.cpp:265:44:265:46 | *& ... | semmle.label | *& ... | +| protobuf.cpp:266:7:266:9 | msg | semmle.label | msg | +| protobuf.cpp:271:24:271:47 | call to source | semmle.label | call to source | +| protobuf.cpp:271:24:271:47 | call to source | semmle.label | call to source | +| protobuf.cpp:272:2:272:4 | ParseFromCodedStream output argument | semmle.label | ParseFromCodedStream output argument | +| protobuf.cpp:272:27:272:29 | *& ... | semmle.label | *& ... | +| protobuf.cpp:273:7:273:9 | msg | semmle.label | msg | +| protobuf.cpp:278:24:278:47 | call to source | semmle.label | call to source | +| protobuf.cpp:278:24:278:47 | call to source | semmle.label | call to source | +| protobuf.cpp:279:2:279:4 | ParsePartialFromCodedStream output argument | semmle.label | ParsePartialFromCodedStream output argument | +| protobuf.cpp:279:34:279:36 | *& ... | semmle.label | *& ... | +| protobuf.cpp:280:7:280:9 | msg | semmle.label | msg | +| protobuf.cpp:285:24:285:47 | call to source | semmle.label | call to source | +| protobuf.cpp:285:24:285:47 | call to source | semmle.label | call to source | +| protobuf.cpp:286:2:286:4 | MergeFromCodedStream output argument | semmle.label | MergeFromCodedStream output argument | +| protobuf.cpp:286:27:286:29 | *& ... | semmle.label | *& ... | +| protobuf.cpp:287:7:287:9 | msg | semmle.label | msg | +| protobuf.cpp:292:24:292:47 | call to source | semmle.label | call to source | +| protobuf.cpp:292:24:292:47 | call to source | semmle.label | call to source | +| protobuf.cpp:293:2:293:4 | MergePartialFromCodedStream output argument | semmle.label | MergePartialFromCodedStream output argument | +| protobuf.cpp:293:34:293:36 | *& ... | semmle.label | *& ... | +| protobuf.cpp:294:7:294:9 | msg | semmle.label | msg | +| protobuf.cpp:307:15:307:28 | call to source | semmle.label | call to source | +| protobuf.cpp:307:15:307:28 | call to source | semmle.label | call to source | +| protobuf.cpp:309:2:309:4 | *msg | semmle.label | *msg | +| protobuf.cpp:309:24:309:27 | SerializeToString output argument | semmle.label | SerializeToString output argument | +| protobuf.cpp:310:7:310:9 | out | semmle.label | out | +| protobuf.cpp:314:15:314:28 | call to source | semmle.label | call to source | +| protobuf.cpp:314:15:314:28 | call to source | semmle.label | call to source | +| protobuf.cpp:316:2:316:4 | *msg | semmle.label | *msg | +| protobuf.cpp:316:31:316:34 | SerializePartialToString output argument | semmle.label | SerializePartialToString output argument | +| protobuf.cpp:317:7:317:9 | out | semmle.label | out | +| protobuf.cpp:321:15:321:28 | call to source | semmle.label | call to source | +| protobuf.cpp:321:15:321:28 | call to source | semmle.label | call to source | +| protobuf.cpp:323:2:323:4 | *msg | semmle.label | *msg | +| protobuf.cpp:323:21:323:24 | AppendToString output argument | semmle.label | AppendToString output argument | +| protobuf.cpp:324:7:324:9 | out | semmle.label | out | +| protobuf.cpp:328:15:328:28 | call to source | semmle.label | call to source | +| protobuf.cpp:328:15:328:28 | call to source | semmle.label | call to source | +| protobuf.cpp:330:2:330:4 | *msg | semmle.label | *msg | +| protobuf.cpp:330:28:330:31 | AppendPartialToString output argument | semmle.label | AppendPartialToString output argument | +| protobuf.cpp:331:7:331:9 | out | semmle.label | out | +| protobuf.cpp:335:15:335:28 | call to source | semmle.label | call to source | +| protobuf.cpp:335:15:335:28 | call to source | semmle.label | call to source | +| protobuf.cpp:337:2:337:4 | *msg | semmle.label | *msg | +| protobuf.cpp:337:24:337:27 | SerializeToString output argument | semmle.label | SerializeToString output argument | +| protobuf.cpp:338:7:338:9 | out | semmle.label | out | +| protobuf.cpp:342:15:342:28 | call to source | semmle.label | call to source | +| protobuf.cpp:342:15:342:28 | call to source | semmle.label | call to source | +| protobuf.cpp:344:2:344:4 | *msg | semmle.label | *msg | +| protobuf.cpp:344:31:344:34 | SerializePartialToString output argument | semmle.label | SerializePartialToString output argument | +| protobuf.cpp:345:7:345:9 | out | semmle.label | out | +| protobuf.cpp:349:15:349:28 | call to source | semmle.label | call to source | +| protobuf.cpp:349:15:349:28 | call to source | semmle.label | call to source | +| protobuf.cpp:351:2:351:4 | *msg | semmle.label | *msg | +| protobuf.cpp:351:21:351:24 | AppendToString output argument | semmle.label | AppendToString output argument | +| protobuf.cpp:352:7:352:9 | out | semmle.label | out | +| protobuf.cpp:356:15:356:28 | call to source | semmle.label | call to source | +| protobuf.cpp:356:15:356:28 | call to source | semmle.label | call to source | +| protobuf.cpp:358:2:358:4 | *msg | semmle.label | *msg | +| protobuf.cpp:358:28:358:31 | AppendPartialToString output argument | semmle.label | AppendPartialToString output argument | +| protobuf.cpp:359:7:359:9 | out | semmle.label | out | +| protobuf.cpp:363:15:363:28 | call to source | semmle.label | call to source | +| protobuf.cpp:363:15:363:28 | call to source | semmle.label | call to source | +| protobuf.cpp:365:2:365:4 | *msg | semmle.label | *msg | +| protobuf.cpp:365:23:365:25 | SerializeToArray output argument | semmle.label | SerializeToArray output argument | +| protobuf.cpp:366:7:366:10 | * ... | semmle.label | * ... | +| protobuf.cpp:370:15:370:28 | call to source | semmle.label | call to source | +| protobuf.cpp:370:15:370:28 | call to source | semmle.label | call to source | +| protobuf.cpp:372:2:372:4 | *msg | semmle.label | *msg | +| protobuf.cpp:372:30:372:32 | SerializePartialToArray output argument | semmle.label | SerializePartialToArray output argument | +| protobuf.cpp:373:7:373:10 | * ... | semmle.label | * ... | +| protobuf.cpp:377:15:377:28 | call to source | semmle.label | call to source | +| protobuf.cpp:377:15:377:28 | call to source | semmle.label | call to source | +| protobuf.cpp:379:2:379:4 | *msg | semmle.label | *msg | +| protobuf.cpp:379:22:379:25 | SerializeToCord output argument | semmle.label | SerializeToCord output argument | +| protobuf.cpp:380:7:380:9 | out | semmle.label | out | +| protobuf.cpp:384:15:384:28 | call to source | semmle.label | call to source | +| protobuf.cpp:384:15:384:28 | call to source | semmle.label | call to source | +| protobuf.cpp:386:2:386:4 | *msg | semmle.label | *msg | +| protobuf.cpp:386:29:386:32 | SerializePartialToCord output argument | semmle.label | SerializePartialToCord output argument | +| protobuf.cpp:387:7:387:9 | out | semmle.label | out | +| protobuf.cpp:391:15:391:28 | call to source | semmle.label | call to source | +| protobuf.cpp:391:15:391:28 | call to source | semmle.label | call to source | +| protobuf.cpp:393:2:393:4 | *msg | semmle.label | *msg | +| protobuf.cpp:393:19:393:22 | AppendToCord output argument | semmle.label | AppendToCord output argument | +| protobuf.cpp:394:7:394:9 | out | semmle.label | out | +| protobuf.cpp:398:15:398:28 | call to source | semmle.label | call to source | +| protobuf.cpp:398:15:398:28 | call to source | semmle.label | call to source | +| protobuf.cpp:400:2:400:4 | *msg | semmle.label | *msg | +| protobuf.cpp:400:26:400:29 | AppendPartialToCord output argument | semmle.label | AppendPartialToCord output argument | +| protobuf.cpp:401:7:401:9 | out | semmle.label | out | +| protobuf.cpp:405:15:405:28 | call to source | semmle.label | call to source | +| protobuf.cpp:405:15:405:28 | call to source | semmle.label | call to source | +| protobuf.cpp:407:2:407:4 | *msg | semmle.label | *msg | +| protobuf.cpp:407:25:407:28 | SerializeToOstream output argument | semmle.label | SerializeToOstream output argument | +| protobuf.cpp:408:7:408:9 | out | semmle.label | out | +| protobuf.cpp:412:15:412:28 | call to source | semmle.label | call to source | +| protobuf.cpp:412:15:412:28 | call to source | semmle.label | call to source | +| protobuf.cpp:414:2:414:4 | *msg | semmle.label | *msg | +| protobuf.cpp:414:32:414:35 | SerializePartialToOstream output argument | semmle.label | SerializePartialToOstream output argument | +| protobuf.cpp:415:7:415:9 | out | semmle.label | out | +| protobuf.cpp:419:15:419:28 | call to source | semmle.label | call to source | +| protobuf.cpp:419:15:419:28 | call to source | semmle.label | call to source | +| protobuf.cpp:421:2:421:4 | *msg | semmle.label | *msg | +| protobuf.cpp:421:32:421:35 | SerializeToZeroCopyStream output argument | semmle.label | SerializeToZeroCopyStream output argument | +| protobuf.cpp:422:7:422:9 | out | semmle.label | out | +| protobuf.cpp:426:15:426:28 | call to source | semmle.label | call to source | +| protobuf.cpp:426:15:426:28 | call to source | semmle.label | call to source | +| protobuf.cpp:428:2:428:4 | *msg | semmle.label | *msg | +| protobuf.cpp:428:39:428:42 | SerializePartialToZeroCopyStream output argument | semmle.label | SerializePartialToZeroCopyStream output argument | +| protobuf.cpp:429:7:429:9 | out | semmle.label | out | +| protobuf.cpp:433:15:433:28 | call to source | semmle.label | call to source | +| protobuf.cpp:433:15:433:28 | call to source | semmle.label | call to source | +| protobuf.cpp:435:2:435:4 | *msg | semmle.label | *msg | +| protobuf.cpp:435:29:435:32 | SerializeToCodedStream output argument | semmle.label | SerializeToCodedStream output argument | +| protobuf.cpp:436:7:436:9 | out | semmle.label | out | +| protobuf.cpp:440:15:440:28 | call to source | semmle.label | call to source | +| protobuf.cpp:440:15:440:28 | call to source | semmle.label | call to source | +| protobuf.cpp:442:2:442:4 | *msg | semmle.label | *msg | +| protobuf.cpp:442:36:442:39 | SerializePartialToCodedStream output argument | semmle.label | SerializePartialToCodedStream output argument | +| protobuf.cpp:443:7:443:9 | out | semmle.label | out | +| protobuf.cpp:449:15:449:28 | call to source | semmle.label | call to source | +| protobuf.cpp:449:15:449:28 | call to source | semmle.label | call to source | +| protobuf.cpp:450:7:450:9 | *msg | semmle.label | *msg | +| protobuf.cpp:450:11:450:27 | call to SerializeAsString | semmle.label | call to SerializeAsString | +| protobuf.cpp:454:15:454:28 | call to source | semmle.label | call to source | +| protobuf.cpp:454:15:454:28 | call to source | semmle.label | call to source | +| protobuf.cpp:455:7:455:9 | *msg | semmle.label | *msg | +| protobuf.cpp:455:11:455:34 | call to SerializePartialAsString | semmle.label | call to SerializePartialAsString | +| protobuf.cpp:459:15:459:28 | call to source | semmle.label | call to source | +| protobuf.cpp:459:15:459:28 | call to source | semmle.label | call to source | +| protobuf.cpp:460:7:460:9 | *msg | semmle.label | *msg | +| protobuf.cpp:460:11:460:25 | call to SerializeAsCord | semmle.label | call to SerializeAsCord | +| protobuf.cpp:464:15:464:28 | call to source | semmle.label | call to source | +| protobuf.cpp:464:15:464:28 | call to source | semmle.label | call to source | +| protobuf.cpp:465:7:465:9 | *msg | semmle.label | *msg | +| protobuf.cpp:465:11:465:32 | call to SerializePartialAsCord | semmle.label | call to SerializePartialAsCord | | test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | semmle.label | *ymlStepGenerated_with_body | | test.cpp:7:47:7:52 | value2 | semmle.label | value2 | | test.cpp:7:64:7:69 | value2 | semmle.label | value2 | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/protobuf.cpp b/cpp/ql/test/library-tests/dataflow/external-models/protobuf.cpp index 9e2a86790381..0ee013b4b72c 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/protobuf.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/protobuf.cpp @@ -1,26 +1,9 @@ // --- stub library headers --- -namespace std { - typedef unsigned long size_t; - - template class allocator { - }; - - template struct char_traits { - }; - - template, class Allocator = allocator > - class basic_string { - public: - basic_string(); - basic_string(const charT* s, const Allocator& a = Allocator()); - const charT* data() const; - size_t size() const; - }; - - typedef basic_string string; +#include "std_string.h" +namespace std { class istream { public: istream(); diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected index f3423b983053..10e56361c20b 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected @@ -1,5 +1,5 @@ -| asio_streams.cpp:135:29:135:39 | recv_buffer | remote-sink | -| asio_streams.cpp:145:29:145:39 | send_buffer | remote-sink | +| asio_streams.cpp:122:29:122:39 | recv_buffer | remote-sink | +| asio_streams.cpp:132:29:132:39 | send_buffer | remote-sink | | test.cpp:12:10:12:10 | 0 | test-sink | | test.cpp:14:10:14:10 | x | test-sink | | test.cpp:18:10:18:10 | y | test-sink | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected index 6f1b889e2bb8..12c1b1ba4b27 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected @@ -1,4 +1,4 @@ -| asio_streams.cpp:129:34:129:44 | read_until output argument | remote | +| asio_streams.cpp:116:34:116:44 | read_until output argument | remote | | azure.cpp:253:48:253:60 | call to GetBodyStream | remote | | azure.cpp:273:52:273:61 | call to GetHeaders | remote | | azure.cpp:277:38:277:44 | call to GetBody | remote | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/std_string.h b/cpp/ql/test/library-tests/dataflow/external-models/std_string.h new file mode 100644 index 000000000000..abafc37f816e --- /dev/null +++ b/cpp/ql/test/library-tests/dataflow/external-models/std_string.h @@ -0,0 +1,25 @@ +#ifndef CODEQL_TEST_STD_STRING_H +#define CODEQL_TEST_STD_STRING_H + +namespace std { + typedef unsigned long size_t; + + template class allocator { + }; + + template struct char_traits { + }; + + template, class Allocator = allocator > + class basic_string { + public: + basic_string(); + basic_string(const charT* s, const Allocator& a = Allocator()); + const charT* data() const; + size_t size() const; + }; + + typedef basic_string string; +} + +#endif diff --git a/cpp/ql/test/library-tests/dataflow/external-models/steps.expected b/cpp/ql/test/library-tests/dataflow/external-models/steps.expected index 21db10463a30..2afe83bbaed7 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/steps.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/steps.expected @@ -1,68 +1,68 @@ -| asio_streams.cpp:142:64:142:71 | *send_str | asio_streams.cpp:142:44:142:62 | call to buffer | -| asio_streams.cpp:161:24:161:27 | *host | asio_streams.cpp:161:16:161:22 | call to resolve | -| asio_streams.cpp:161:30:161:36 | *service | asio_streams.cpp:161:16:161:22 | call to resolve | -| asio_streams.cpp:162:24:162:27 | *host | asio_streams.cpp:162:16:162:22 | call to resolve | -| asio_streams.cpp:162:30:162:36 | *service | asio_streams.cpp:162:16:162:22 | call to resolve | -| asio_streams.cpp:163:24:163:27 | *host | asio_streams.cpp:163:16:163:22 | call to resolve | -| asio_streams.cpp:163:30:163:36 | *service | asio_streams.cpp:163:16:163:22 | call to resolve | -| asio_streams.cpp:164:24:164:27 | *host | asio_streams.cpp:164:16:164:22 | call to resolve | -| asio_streams.cpp:164:30:164:36 | *service | asio_streams.cpp:164:16:164:22 | call to resolve | -| asio_streams.cpp:166:24:166:32 | host_view | asio_streams.cpp:166:16:166:22 | call to resolve | -| asio_streams.cpp:166:35:166:46 | service_view | asio_streams.cpp:166:16:166:22 | call to resolve | -| asio_streams.cpp:167:24:167:32 | host_view | asio_streams.cpp:167:16:167:22 | call to resolve | -| asio_streams.cpp:167:35:167:46 | service_view | asio_streams.cpp:167:16:167:22 | call to resolve | -| asio_streams.cpp:168:24:168:32 | host_view | asio_streams.cpp:168:16:168:22 | call to resolve | -| asio_streams.cpp:168:35:168:46 | service_view | asio_streams.cpp:168:16:168:22 | call to resolve | -| asio_streams.cpp:169:24:169:32 | host_view | asio_streams.cpp:169:16:169:22 | call to resolve | -| asio_streams.cpp:169:35:169:46 | service_view | asio_streams.cpp:169:16:169:22 | call to resolve | -| asio_streams.cpp:171:34:171:37 | *host | asio_streams.cpp:171:16:171:22 | call to resolve | -| asio_streams.cpp:171:40:171:46 | *service | asio_streams.cpp:171:16:171:22 | call to resolve | -| asio_streams.cpp:172:34:172:37 | *host | asio_streams.cpp:172:16:172:22 | call to resolve | -| asio_streams.cpp:172:40:172:46 | *service | asio_streams.cpp:172:16:172:22 | call to resolve | -| asio_streams.cpp:173:34:173:37 | *host | asio_streams.cpp:173:16:173:22 | call to resolve | -| asio_streams.cpp:173:40:173:46 | *service | asio_streams.cpp:173:16:173:22 | call to resolve | -| asio_streams.cpp:174:34:174:37 | *host | asio_streams.cpp:174:16:174:22 | call to resolve | -| asio_streams.cpp:174:40:174:46 | *service | asio_streams.cpp:174:16:174:22 | call to resolve | -| asio_streams.cpp:176:34:176:42 | host_view | asio_streams.cpp:176:16:176:22 | call to resolve | -| asio_streams.cpp:176:45:176:56 | service_view | asio_streams.cpp:176:16:176:22 | call to resolve | -| asio_streams.cpp:177:34:177:42 | host_view | asio_streams.cpp:177:16:177:22 | call to resolve | -| asio_streams.cpp:177:45:177:56 | service_view | asio_streams.cpp:177:16:177:22 | call to resolve | -| asio_streams.cpp:178:34:178:42 | host_view | asio_streams.cpp:178:16:178:22 | call to resolve | -| asio_streams.cpp:178:45:178:56 | service_view | asio_streams.cpp:178:16:178:22 | call to resolve | -| asio_streams.cpp:179:34:179:42 | host_view | asio_streams.cpp:179:16:179:22 | call to resolve | -| asio_streams.cpp:179:45:179:56 | service_view | asio_streams.cpp:179:16:179:22 | call to resolve | -| asio_streams.cpp:192:24:192:27 | *host | asio_streams.cpp:192:16:192:22 | call to resolve | -| asio_streams.cpp:192:30:192:36 | *service | asio_streams.cpp:192:16:192:22 | call to resolve | -| asio_streams.cpp:193:24:193:27 | *host | asio_streams.cpp:193:16:193:22 | call to resolve | -| asio_streams.cpp:193:30:193:36 | *service | asio_streams.cpp:193:16:193:22 | call to resolve | -| asio_streams.cpp:194:24:194:27 | *host | asio_streams.cpp:194:16:194:22 | call to resolve | -| asio_streams.cpp:194:30:194:36 | *service | asio_streams.cpp:194:16:194:22 | call to resolve | -| asio_streams.cpp:195:24:195:27 | *host | asio_streams.cpp:195:16:195:22 | call to resolve | -| asio_streams.cpp:195:30:195:36 | *service | asio_streams.cpp:195:16:195:22 | call to resolve | -| asio_streams.cpp:197:24:197:32 | host_view | asio_streams.cpp:197:16:197:22 | call to resolve | -| asio_streams.cpp:197:35:197:46 | service_view | asio_streams.cpp:197:16:197:22 | call to resolve | -| asio_streams.cpp:198:24:198:32 | host_view | asio_streams.cpp:198:16:198:22 | call to resolve | -| asio_streams.cpp:198:35:198:46 | service_view | asio_streams.cpp:198:16:198:22 | call to resolve | -| asio_streams.cpp:199:24:199:32 | host_view | asio_streams.cpp:199:16:199:22 | call to resolve | -| asio_streams.cpp:199:35:199:46 | service_view | asio_streams.cpp:199:16:199:22 | call to resolve | -| asio_streams.cpp:200:24:200:32 | host_view | asio_streams.cpp:200:16:200:22 | call to resolve | -| asio_streams.cpp:200:35:200:46 | service_view | asio_streams.cpp:200:16:200:22 | call to resolve | -| asio_streams.cpp:202:34:202:37 | *host | asio_streams.cpp:202:16:202:22 | call to resolve | -| asio_streams.cpp:202:40:202:46 | *service | asio_streams.cpp:202:16:202:22 | call to resolve | -| asio_streams.cpp:203:34:203:37 | *host | asio_streams.cpp:203:16:203:22 | call to resolve | -| asio_streams.cpp:203:40:203:46 | *service | asio_streams.cpp:203:16:203:22 | call to resolve | -| asio_streams.cpp:204:34:204:37 | *host | asio_streams.cpp:204:16:204:22 | call to resolve | -| asio_streams.cpp:204:40:204:46 | *service | asio_streams.cpp:204:16:204:22 | call to resolve | -| asio_streams.cpp:205:34:205:37 | *host | asio_streams.cpp:205:16:205:22 | call to resolve | -| asio_streams.cpp:205:40:205:46 | *service | asio_streams.cpp:205:16:205:22 | call to resolve | -| asio_streams.cpp:207:34:207:42 | host_view | asio_streams.cpp:207:16:207:22 | call to resolve | -| asio_streams.cpp:207:45:207:56 | service_view | asio_streams.cpp:207:16:207:22 | call to resolve | -| asio_streams.cpp:208:34:208:42 | host_view | asio_streams.cpp:208:16:208:22 | call to resolve | -| asio_streams.cpp:208:45:208:56 | service_view | asio_streams.cpp:208:16:208:22 | call to resolve | -| asio_streams.cpp:209:34:209:42 | host_view | asio_streams.cpp:209:16:209:22 | call to resolve | -| asio_streams.cpp:209:45:209:56 | service_view | asio_streams.cpp:209:16:209:22 | call to resolve | -| asio_streams.cpp:210:34:210:42 | host_view | asio_streams.cpp:210:16:210:22 | call to resolve | -| asio_streams.cpp:210:45:210:56 | service_view | asio_streams.cpp:210:16:210:22 | call to resolve | +| asio_streams.cpp:129:64:129:71 | *send_str | asio_streams.cpp:129:44:129:62 | call to buffer | +| asio_streams.cpp:148:24:148:27 | *host | asio_streams.cpp:148:16:148:22 | call to resolve | +| asio_streams.cpp:148:30:148:36 | *service | asio_streams.cpp:148:16:148:22 | call to resolve | +| asio_streams.cpp:149:24:149:27 | *host | asio_streams.cpp:149:16:149:22 | call to resolve | +| asio_streams.cpp:149:30:149:36 | *service | asio_streams.cpp:149:16:149:22 | call to resolve | +| asio_streams.cpp:150:24:150:27 | *host | asio_streams.cpp:150:16:150:22 | call to resolve | +| asio_streams.cpp:150:30:150:36 | *service | asio_streams.cpp:150:16:150:22 | call to resolve | +| asio_streams.cpp:151:24:151:27 | *host | asio_streams.cpp:151:16:151:22 | call to resolve | +| asio_streams.cpp:151:30:151:36 | *service | asio_streams.cpp:151:16:151:22 | call to resolve | +| asio_streams.cpp:153:24:153:32 | host_view | asio_streams.cpp:153:16:153:22 | call to resolve | +| asio_streams.cpp:153:35:153:46 | service_view | asio_streams.cpp:153:16:153:22 | call to resolve | +| asio_streams.cpp:154:24:154:32 | host_view | asio_streams.cpp:154:16:154:22 | call to resolve | +| asio_streams.cpp:154:35:154:46 | service_view | asio_streams.cpp:154:16:154:22 | call to resolve | +| asio_streams.cpp:155:24:155:32 | host_view | asio_streams.cpp:155:16:155:22 | call to resolve | +| asio_streams.cpp:155:35:155:46 | service_view | asio_streams.cpp:155:16:155:22 | call to resolve | +| asio_streams.cpp:156:24:156:32 | host_view | asio_streams.cpp:156:16:156:22 | call to resolve | +| asio_streams.cpp:156:35:156:46 | service_view | asio_streams.cpp:156:16:156:22 | call to resolve | +| asio_streams.cpp:158:34:158:37 | *host | asio_streams.cpp:158:16:158:22 | call to resolve | +| asio_streams.cpp:158:40:158:46 | *service | asio_streams.cpp:158:16:158:22 | call to resolve | +| asio_streams.cpp:159:34:159:37 | *host | asio_streams.cpp:159:16:159:22 | call to resolve | +| asio_streams.cpp:159:40:159:46 | *service | asio_streams.cpp:159:16:159:22 | call to resolve | +| asio_streams.cpp:160:34:160:37 | *host | asio_streams.cpp:160:16:160:22 | call to resolve | +| asio_streams.cpp:160:40:160:46 | *service | asio_streams.cpp:160:16:160:22 | call to resolve | +| asio_streams.cpp:161:34:161:37 | *host | asio_streams.cpp:161:16:161:22 | call to resolve | +| asio_streams.cpp:161:40:161:46 | *service | asio_streams.cpp:161:16:161:22 | call to resolve | +| asio_streams.cpp:163:34:163:42 | host_view | asio_streams.cpp:163:16:163:22 | call to resolve | +| asio_streams.cpp:163:45:163:56 | service_view | asio_streams.cpp:163:16:163:22 | call to resolve | +| asio_streams.cpp:164:34:164:42 | host_view | asio_streams.cpp:164:16:164:22 | call to resolve | +| asio_streams.cpp:164:45:164:56 | service_view | asio_streams.cpp:164:16:164:22 | call to resolve | +| asio_streams.cpp:165:34:165:42 | host_view | asio_streams.cpp:165:16:165:22 | call to resolve | +| asio_streams.cpp:165:45:165:56 | service_view | asio_streams.cpp:165:16:165:22 | call to resolve | +| asio_streams.cpp:166:34:166:42 | host_view | asio_streams.cpp:166:16:166:22 | call to resolve | +| asio_streams.cpp:166:45:166:56 | service_view | asio_streams.cpp:166:16:166:22 | call to resolve | +| asio_streams.cpp:179:24:179:27 | *host | asio_streams.cpp:179:16:179:22 | call to resolve | +| asio_streams.cpp:179:30:179:36 | *service | asio_streams.cpp:179:16:179:22 | call to resolve | +| asio_streams.cpp:180:24:180:27 | *host | asio_streams.cpp:180:16:180:22 | call to resolve | +| asio_streams.cpp:180:30:180:36 | *service | asio_streams.cpp:180:16:180:22 | call to resolve | +| asio_streams.cpp:181:24:181:27 | *host | asio_streams.cpp:181:16:181:22 | call to resolve | +| asio_streams.cpp:181:30:181:36 | *service | asio_streams.cpp:181:16:181:22 | call to resolve | +| asio_streams.cpp:182:24:182:27 | *host | asio_streams.cpp:182:16:182:22 | call to resolve | +| asio_streams.cpp:182:30:182:36 | *service | asio_streams.cpp:182:16:182:22 | call to resolve | +| asio_streams.cpp:184:24:184:32 | host_view | asio_streams.cpp:184:16:184:22 | call to resolve | +| asio_streams.cpp:184:35:184:46 | service_view | asio_streams.cpp:184:16:184:22 | call to resolve | +| asio_streams.cpp:185:24:185:32 | host_view | asio_streams.cpp:185:16:185:22 | call to resolve | +| asio_streams.cpp:185:35:185:46 | service_view | asio_streams.cpp:185:16:185:22 | call to resolve | +| asio_streams.cpp:186:24:186:32 | host_view | asio_streams.cpp:186:16:186:22 | call to resolve | +| asio_streams.cpp:186:35:186:46 | service_view | asio_streams.cpp:186:16:186:22 | call to resolve | +| asio_streams.cpp:187:24:187:32 | host_view | asio_streams.cpp:187:16:187:22 | call to resolve | +| asio_streams.cpp:187:35:187:46 | service_view | asio_streams.cpp:187:16:187:22 | call to resolve | +| asio_streams.cpp:189:34:189:37 | *host | asio_streams.cpp:189:16:189:22 | call to resolve | +| asio_streams.cpp:189:40:189:46 | *service | asio_streams.cpp:189:16:189:22 | call to resolve | +| asio_streams.cpp:190:34:190:37 | *host | asio_streams.cpp:190:16:190:22 | call to resolve | +| asio_streams.cpp:190:40:190:46 | *service | asio_streams.cpp:190:16:190:22 | call to resolve | +| asio_streams.cpp:191:34:191:37 | *host | asio_streams.cpp:191:16:191:22 | call to resolve | +| asio_streams.cpp:191:40:191:46 | *service | asio_streams.cpp:191:16:191:22 | call to resolve | +| asio_streams.cpp:192:34:192:37 | *host | asio_streams.cpp:192:16:192:22 | call to resolve | +| asio_streams.cpp:192:40:192:46 | *service | asio_streams.cpp:192:16:192:22 | call to resolve | +| asio_streams.cpp:194:34:194:42 | host_view | asio_streams.cpp:194:16:194:22 | call to resolve | +| asio_streams.cpp:194:45:194:56 | service_view | asio_streams.cpp:194:16:194:22 | call to resolve | +| asio_streams.cpp:195:34:195:42 | host_view | asio_streams.cpp:195:16:195:22 | call to resolve | +| asio_streams.cpp:195:45:195:56 | service_view | asio_streams.cpp:195:16:195:22 | call to resolve | +| asio_streams.cpp:196:34:196:42 | host_view | asio_streams.cpp:196:16:196:22 | call to resolve | +| asio_streams.cpp:196:45:196:56 | service_view | asio_streams.cpp:196:16:196:22 | call to resolve | +| asio_streams.cpp:197:34:197:42 | host_view | asio_streams.cpp:197:16:197:22 | call to resolve | +| asio_streams.cpp:197:45:197:56 | service_view | asio_streams.cpp:197:16:197:22 | call to resolve | | azure.cpp:252:79:252:98 | call to string | azure.cpp:252:62:252:99 | call to Url | | azure.cpp:257:5:257:8 | *resp | azure.cpp:257:16:257:21 | Read output argument | | azure.cpp:262:5:262:8 | *resp | azure.cpp:262:23:262:28 | ReadToCount output argument | @@ -82,58 +82,58 @@ | bdlbb.cpp:92:48:92:51 | *call to data | bdlbb.cpp:92:37:92:40 | copy output argument | | bdlbb.cpp:94:46:94:48 | *src | bdlbb.cpp:94:37:94:40 | copy output argument | | bdlbb.cpp:96:42:96:44 | *dst | bdlbb.cpp:96:37:96:39 | copy output argument | -| protobuf.cpp:135:22:135:25 | data | protobuf.cpp:135:2:135:4 | ParseFromString output argument | -| protobuf.cpp:142:22:142:25 | *data | protobuf.cpp:142:2:142:4 | ParseFromString output argument | -| protobuf.cpp:149:29:149:32 | data | protobuf.cpp:149:2:149:4 | ParsePartialFromString output argument | -| protobuf.cpp:156:29:156:32 | *data | protobuf.cpp:156:2:156:4 | ParsePartialFromString output argument | -| protobuf.cpp:163:22:163:25 | data | protobuf.cpp:163:2:163:4 | MergeFromString output argument | -| protobuf.cpp:170:22:170:25 | *data | protobuf.cpp:170:2:170:4 | MergeFromString output argument | -| protobuf.cpp:177:29:177:32 | data | protobuf.cpp:177:2:177:4 | MergePartialFromString output argument | -| protobuf.cpp:184:29:184:32 | *data | protobuf.cpp:184:2:184:4 | MergePartialFromString output argument | -| protobuf.cpp:191:21:191:31 | *call to data | protobuf.cpp:191:2:191:4 | ParseFromArray output argument | -| protobuf.cpp:198:28:198:38 | *call to data | protobuf.cpp:198:2:198:4 | ParsePartialFromArray output argument | -| protobuf.cpp:205:20:205:23 | *data | protobuf.cpp:205:2:205:4 | ParseFromCord output argument | -| protobuf.cpp:212:27:212:30 | *data | protobuf.cpp:212:2:212:4 | ParsePartialFromCord output argument | -| protobuf.cpp:219:20:219:23 | *data | protobuf.cpp:219:2:219:4 | MergeFromCord output argument | -| protobuf.cpp:226:27:226:30 | *data | protobuf.cpp:226:2:226:4 | MergePartialFromCord output argument | -| protobuf.cpp:233:23:233:25 | *& ... | protobuf.cpp:233:2:233:4 | ParseFromIstream output argument | -| protobuf.cpp:240:30:240:32 | *& ... | protobuf.cpp:240:2:240:4 | ParsePartialFromIstream output argument | -| protobuf.cpp:247:30:247:32 | *& ... | protobuf.cpp:247:2:247:4 | ParseFromZeroCopyStream output argument | -| protobuf.cpp:254:37:254:39 | *& ... | protobuf.cpp:254:2:254:4 | ParsePartialFromZeroCopyStream output argument | -| protobuf.cpp:261:37:261:39 | *& ... | protobuf.cpp:261:2:261:4 | ParseFromBoundedZeroCopyStream output argument | -| protobuf.cpp:268:44:268:46 | *& ... | protobuf.cpp:268:2:268:4 | ParsePartialFromBoundedZeroCopyStream output argument | -| protobuf.cpp:275:37:275:39 | *& ... | protobuf.cpp:275:2:275:4 | MergeFromBoundedZeroCopyStream output argument | -| protobuf.cpp:282:44:282:46 | *& ... | protobuf.cpp:282:2:282:4 | MergePartialFromBoundedZeroCopyStream output argument | -| protobuf.cpp:289:27:289:29 | *& ... | protobuf.cpp:289:2:289:4 | ParseFromCodedStream output argument | -| protobuf.cpp:296:34:296:36 | *& ... | protobuf.cpp:296:2:296:4 | ParsePartialFromCodedStream output argument | -| protobuf.cpp:303:27:303:29 | *& ... | protobuf.cpp:303:2:303:4 | MergeFromCodedStream output argument | -| protobuf.cpp:310:34:310:36 | *& ... | protobuf.cpp:310:2:310:4 | MergePartialFromCodedStream output argument | -| protobuf.cpp:317:22:317:25 | *data | protobuf.cpp:317:2:317:4 | ParseFromString output argument | -| protobuf.cpp:326:2:326:4 | *msg | protobuf.cpp:326:24:326:27 | SerializeToString output argument | -| protobuf.cpp:333:2:333:4 | *msg | protobuf.cpp:333:31:333:34 | SerializePartialToString output argument | -| protobuf.cpp:340:2:340:4 | *msg | protobuf.cpp:340:21:340:24 | AppendToString output argument | -| protobuf.cpp:347:2:347:4 | *msg | protobuf.cpp:347:28:347:31 | AppendPartialToString output argument | -| protobuf.cpp:354:2:354:4 | *msg | protobuf.cpp:354:24:354:27 | SerializeToString output argument | -| protobuf.cpp:361:2:361:4 | *msg | protobuf.cpp:361:31:361:34 | SerializePartialToString output argument | -| protobuf.cpp:368:2:368:4 | *msg | protobuf.cpp:368:21:368:24 | AppendToString output argument | -| protobuf.cpp:375:2:375:4 | *msg | protobuf.cpp:375:28:375:31 | AppendPartialToString output argument | -| protobuf.cpp:382:2:382:4 | *msg | protobuf.cpp:382:23:382:25 | SerializeToArray output argument | -| protobuf.cpp:389:2:389:4 | *msg | protobuf.cpp:389:30:389:32 | SerializePartialToArray output argument | -| protobuf.cpp:396:2:396:4 | *msg | protobuf.cpp:396:22:396:25 | SerializeToCord output argument | -| protobuf.cpp:403:2:403:4 | *msg | protobuf.cpp:403:29:403:32 | SerializePartialToCord output argument | -| protobuf.cpp:410:2:410:4 | *msg | protobuf.cpp:410:19:410:22 | AppendToCord output argument | -| protobuf.cpp:417:2:417:4 | *msg | protobuf.cpp:417:26:417:29 | AppendPartialToCord output argument | -| protobuf.cpp:424:2:424:4 | *msg | protobuf.cpp:424:25:424:28 | SerializeToOstream output argument | -| protobuf.cpp:431:2:431:4 | *msg | protobuf.cpp:431:32:431:35 | SerializePartialToOstream output argument | -| protobuf.cpp:438:2:438:4 | *msg | protobuf.cpp:438:32:438:35 | SerializeToZeroCopyStream output argument | -| protobuf.cpp:445:2:445:4 | *msg | protobuf.cpp:445:39:445:42 | SerializePartialToZeroCopyStream output argument | -| protobuf.cpp:452:2:452:4 | *msg | protobuf.cpp:452:29:452:32 | SerializeToCodedStream output argument | -| protobuf.cpp:459:2:459:4 | *msg | protobuf.cpp:459:36:459:39 | SerializePartialToCodedStream output argument | -| protobuf.cpp:467:7:467:9 | *msg | protobuf.cpp:467:11:467:27 | call to SerializeAsString | -| protobuf.cpp:472:7:472:9 | *msg | protobuf.cpp:472:11:472:34 | call to SerializePartialAsString | -| protobuf.cpp:477:7:477:9 | *msg | protobuf.cpp:477:11:477:25 | call to SerializeAsCord | -| protobuf.cpp:482:7:482:9 | *msg | protobuf.cpp:482:11:482:32 | call to SerializePartialAsCord | -| protobuf.cpp:487:7:487:9 | *msg | protobuf.cpp:487:11:487:27 | call to SerializeAsString | +| protobuf.cpp:118:22:118:25 | data | protobuf.cpp:118:2:118:4 | ParseFromString output argument | +| protobuf.cpp:125:22:125:25 | *data | protobuf.cpp:125:2:125:4 | ParseFromString output argument | +| protobuf.cpp:132:29:132:32 | data | protobuf.cpp:132:2:132:4 | ParsePartialFromString output argument | +| protobuf.cpp:139:29:139:32 | *data | protobuf.cpp:139:2:139:4 | ParsePartialFromString output argument | +| protobuf.cpp:146:22:146:25 | data | protobuf.cpp:146:2:146:4 | MergeFromString output argument | +| protobuf.cpp:153:22:153:25 | *data | protobuf.cpp:153:2:153:4 | MergeFromString output argument | +| protobuf.cpp:160:29:160:32 | data | protobuf.cpp:160:2:160:4 | MergePartialFromString output argument | +| protobuf.cpp:167:29:167:32 | *data | protobuf.cpp:167:2:167:4 | MergePartialFromString output argument | +| protobuf.cpp:174:21:174:31 | *call to data | protobuf.cpp:174:2:174:4 | ParseFromArray output argument | +| protobuf.cpp:181:28:181:38 | *call to data | protobuf.cpp:181:2:181:4 | ParsePartialFromArray output argument | +| protobuf.cpp:188:20:188:23 | *data | protobuf.cpp:188:2:188:4 | ParseFromCord output argument | +| protobuf.cpp:195:27:195:30 | *data | protobuf.cpp:195:2:195:4 | ParsePartialFromCord output argument | +| protobuf.cpp:202:20:202:23 | *data | protobuf.cpp:202:2:202:4 | MergeFromCord output argument | +| protobuf.cpp:209:27:209:30 | *data | protobuf.cpp:209:2:209:4 | MergePartialFromCord output argument | +| protobuf.cpp:216:23:216:25 | *& ... | protobuf.cpp:216:2:216:4 | ParseFromIstream output argument | +| protobuf.cpp:223:30:223:32 | *& ... | protobuf.cpp:223:2:223:4 | ParsePartialFromIstream output argument | +| protobuf.cpp:230:30:230:32 | *& ... | protobuf.cpp:230:2:230:4 | ParseFromZeroCopyStream output argument | +| protobuf.cpp:237:37:237:39 | *& ... | protobuf.cpp:237:2:237:4 | ParsePartialFromZeroCopyStream output argument | +| protobuf.cpp:244:37:244:39 | *& ... | protobuf.cpp:244:2:244:4 | ParseFromBoundedZeroCopyStream output argument | +| protobuf.cpp:251:44:251:46 | *& ... | protobuf.cpp:251:2:251:4 | ParsePartialFromBoundedZeroCopyStream output argument | +| protobuf.cpp:258:37:258:39 | *& ... | protobuf.cpp:258:2:258:4 | MergeFromBoundedZeroCopyStream output argument | +| protobuf.cpp:265:44:265:46 | *& ... | protobuf.cpp:265:2:265:4 | MergePartialFromBoundedZeroCopyStream output argument | +| protobuf.cpp:272:27:272:29 | *& ... | protobuf.cpp:272:2:272:4 | ParseFromCodedStream output argument | +| protobuf.cpp:279:34:279:36 | *& ... | protobuf.cpp:279:2:279:4 | ParsePartialFromCodedStream output argument | +| protobuf.cpp:286:27:286:29 | *& ... | protobuf.cpp:286:2:286:4 | MergeFromCodedStream output argument | +| protobuf.cpp:293:34:293:36 | *& ... | protobuf.cpp:293:2:293:4 | MergePartialFromCodedStream output argument | +| protobuf.cpp:300:22:300:25 | *data | protobuf.cpp:300:2:300:4 | ParseFromString output argument | +| protobuf.cpp:309:2:309:4 | *msg | protobuf.cpp:309:24:309:27 | SerializeToString output argument | +| protobuf.cpp:316:2:316:4 | *msg | protobuf.cpp:316:31:316:34 | SerializePartialToString output argument | +| protobuf.cpp:323:2:323:4 | *msg | protobuf.cpp:323:21:323:24 | AppendToString output argument | +| protobuf.cpp:330:2:330:4 | *msg | protobuf.cpp:330:28:330:31 | AppendPartialToString output argument | +| protobuf.cpp:337:2:337:4 | *msg | protobuf.cpp:337:24:337:27 | SerializeToString output argument | +| protobuf.cpp:344:2:344:4 | *msg | protobuf.cpp:344:31:344:34 | SerializePartialToString output argument | +| protobuf.cpp:351:2:351:4 | *msg | protobuf.cpp:351:21:351:24 | AppendToString output argument | +| protobuf.cpp:358:2:358:4 | *msg | protobuf.cpp:358:28:358:31 | AppendPartialToString output argument | +| protobuf.cpp:365:2:365:4 | *msg | protobuf.cpp:365:23:365:25 | SerializeToArray output argument | +| protobuf.cpp:372:2:372:4 | *msg | protobuf.cpp:372:30:372:32 | SerializePartialToArray output argument | +| protobuf.cpp:379:2:379:4 | *msg | protobuf.cpp:379:22:379:25 | SerializeToCord output argument | +| protobuf.cpp:386:2:386:4 | *msg | protobuf.cpp:386:29:386:32 | SerializePartialToCord output argument | +| protobuf.cpp:393:2:393:4 | *msg | protobuf.cpp:393:19:393:22 | AppendToCord output argument | +| protobuf.cpp:400:2:400:4 | *msg | protobuf.cpp:400:26:400:29 | AppendPartialToCord output argument | +| protobuf.cpp:407:2:407:4 | *msg | protobuf.cpp:407:25:407:28 | SerializeToOstream output argument | +| protobuf.cpp:414:2:414:4 | *msg | protobuf.cpp:414:32:414:35 | SerializePartialToOstream output argument | +| protobuf.cpp:421:2:421:4 | *msg | protobuf.cpp:421:32:421:35 | SerializeToZeroCopyStream output argument | +| protobuf.cpp:428:2:428:4 | *msg | protobuf.cpp:428:39:428:42 | SerializePartialToZeroCopyStream output argument | +| protobuf.cpp:435:2:435:4 | *msg | protobuf.cpp:435:29:435:32 | SerializeToCodedStream output argument | +| protobuf.cpp:442:2:442:4 | *msg | protobuf.cpp:442:36:442:39 | SerializePartialToCodedStream output argument | +| protobuf.cpp:450:7:450:9 | *msg | protobuf.cpp:450:11:450:27 | call to SerializeAsString | +| protobuf.cpp:455:7:455:9 | *msg | protobuf.cpp:455:11:455:34 | call to SerializePartialAsString | +| protobuf.cpp:460:7:460:9 | *msg | protobuf.cpp:460:11:460:25 | call to SerializeAsCord | +| protobuf.cpp:465:7:465:9 | *msg | protobuf.cpp:465:11:465:32 | call to SerializePartialAsCord | +| protobuf.cpp:470:7:470:9 | *msg | protobuf.cpp:470:11:470:27 | call to SerializeAsString | | test.cpp:17:24:17:24 | x | test.cpp:17:10:17:22 | call to ymlStepManual | | test.cpp:21:27:21:27 | x | test.cpp:21:10:21:25 | call to ymlStepGenerated | | test.cpp:25:35:25:35 | x | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/test_mad-signatures.expected b/cpp/ql/test/library-tests/dataflow/taint-tests/test_mad-signatures.expected index 65a5391a3ed0..be894ab0404b 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/test_mad-signatures.expected +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/test_mad-signatures.expected @@ -14064,6 +14064,10 @@ getSignatureParameterName | (const Command *,const size_t,const BlockSplit *,const BlockSplit *,const BlockSplit *,const uint8_t *,size_t,size_t,uint8_t,uint8_t,const ContextType *,HistogramLiteral *,HistogramCommand *,HistogramDistance *) | | BrotliBuildHistogramsWithContext | 11 | HistogramLiteral * | | (const Command *,const size_t,const BlockSplit *,const BlockSplit *,const BlockSplit *,const uint8_t *,size_t,size_t,uint8_t,uint8_t,const ContextType *,HistogramLiteral *,HistogramCommand *,HistogramDistance *) | | BrotliBuildHistogramsWithContext | 12 | HistogramCommand * | | (const Command *,const size_t,const BlockSplit *,const BlockSplit *,const BlockSplit *,const uint8_t *,size_t,size_t,uint8_t,uint8_t,const ContextType *,HistogramLiteral *,HistogramCommand *,HistogramDistance *) | | BrotliBuildHistogramsWithContext | 13 | HistogramDistance * | +| (const Cord &) | MessageLite | MergeFromString | 0 | const Cord & | +| (const Cord &) | MessageLite | MergePartialFromString | 0 | const Cord & | +| (const Cord &) | MessageLite | ParseFromString | 0 | const Cord & | +| (const Cord &) | MessageLite | ParsePartialFromString | 0 | const Cord & | | (const Curl_easy *,const connectdata *,int) | | Curl_conn_is_http2 | 0 | const Curl_easy * | | (const Curl_easy *,const connectdata *,int) | | Curl_conn_is_http2 | 1 | const connectdata * | | (const Curl_easy *,const connectdata *,int) | | Curl_conn_is_http2 | 2 | int | @@ -24746,6 +24750,10 @@ getSignatureParameterName | (string_buf *,unsigned char **,size_t *) | | _libssh2_get_string | 0 | string_buf * | | (string_buf *,unsigned char **,size_t *) | | _libssh2_get_string | 1 | unsigned char ** | | (string_buf *,unsigned char **,size_t *) | | _libssh2_get_string | 2 | size_t * | +| (string_view) | MessageLite | MergeFromString | 0 | string_view | +| (string_view) | MessageLite | MergePartialFromString | 0 | string_view | +| (string_view) | MessageLite | ParseFromString | 0 | string_view | +| (string_view) | MessageLite | ParsePartialFromString | 0 | string_view | | (string_view,string_view) | basic_resolver | resolve | 0 | string_view | | (string_view,string_view) | basic_resolver | resolve | 1 | string_view | | (string_view,string_view,error_code &) | basic_resolver | resolve | 0 | string_view | From 8d48ea17ac17a4c3742e363c7b861ac7ef6ef96b Mon Sep 17 00:00:00 2001 From: Asger F Date: Sat, 12 Sep 2026 21:21:27 +0200 Subject: [PATCH 0888/2098] unified: Add simple extension-method test --- .../static-name-binding/extensions.swift | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 unified/ql/test/library-tests/static-name-binding/extensions.swift diff --git a/unified/ql/test/library-tests/static-name-binding/extensions.swift b/unified/ql/test/library-tests/static-name-binding/extensions.swift new file mode 100644 index 000000000000..891f899883df --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/extensions.swift @@ -0,0 +1,23 @@ +class A { + func ownMethod() { + ownMethod() // $ access=A.ownMethod + extensionMethod1() // $ MISSING: access=A.extensionMethod1 + extensionMethod2() // $ MISSING: access=A.extensionMethod2 + } +} + +extension A { // $ access=A + func extensionMethod1() { // name=A.extensionMethod1 + ownMethod() // $ MISSING: access=A.ownMethod + extensionMethod1() // $ MISSING: access=A.extensionMethod1 + extensionMethod2() // $ MISSING: access=A.extensionMethod2 + } +} + +extension A { // $ access=A + func extensionMethod2() { // name=A.extensionMethod2 + ownMethod() // $ MISSING: access=A.ownMethod + extensionMethod1() // $ MISSING: access=A.extensionMethod1 + extensionMethod2() // $ MISSING: access=A.extensionMethod2 + } +} From fcda1626f9ceb7cb0d5c8443d8e8a3255ee2b787 Mon Sep 17 00:00:00 2001 From: Asger F Date: Sat, 12 Sep 2026 21:26:07 +0200 Subject: [PATCH 0889/2098] unified: Add extension_target field and use it --- unified/extractor/ast_types.yml | 1 + unified/extractor/src/languages/swift/swift.rs | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/unified/extractor/ast_types.yml b/unified/extractor/ast_types.yml index 6f929f115b0e..f1ee78f1c621 100644 --- a/unified/extractor/ast_types.yml +++ b/unified/extractor/ast_types.yml @@ -478,6 +478,7 @@ named: class_like_declaration: modifier*: modifier name_node?: identifier + extension_target?: expr type_parameter*: type_parameter type_constraint*: type_constraint base_type*: base_type diff --git a/unified/extractor/src/languages/swift/swift.rs b/unified/extractor/src/languages/swift/swift.rs index c1e49181ea13..ad690fb37a11 100644 --- a/unified/extractor/src/languages/swift/swift.rs +++ b/unified/extractor/src/languages/swift/swift.rs @@ -1274,14 +1274,14 @@ fn translation_rules() -> Vec> { (extensionDecl extensionKeyword: @kind modifiers: _* @mods - extendedType: @@name + extendedType: @extendedType inheritanceClause: (inheritanceClause inheritedTypes: (inheritedType type: @bases)*)? memberBlock: (memberBlock members: _* @members)) => (class_like_declaration modifier: (modifier #{kind}) modifier: {mods} - name_node: (identifier #{name}) + extension_target: {extendedType} base_type: {bases.into_iter().map(|ty| tree!((base_type type: {ty})))} member: {members}) ), From 6ce06bfdc59f4ac0acd233217feea9668b15502d Mon Sep 17 00:00:00 2001 From: Asger F Date: Sat, 12 Sep 2026 21:26:17 +0200 Subject: [PATCH 0890/2098] unified: Regenerate QL --- unified/ql/lib/codeql/unified/internal/Ast.qll | 10 ++++++++++ unified/ql/lib/unified.dbscheme | 5 +++++ 2 files changed, 15 insertions(+) diff --git a/unified/ql/lib/codeql/unified/internal/Ast.qll b/unified/ql/lib/codeql/unified/internal/Ast.qll index 3de5e2ff3aad..a04b93291707 100644 --- a/unified/ql/lib/codeql/unified/internal/Ast.qll +++ b/unified/ql/lib/codeql/unified/internal/Ast.qll @@ -418,6 +418,11 @@ module Unified { /** Gets the node corresponding to the field `base_type`. */ final F::BaseType getABaseType() { result = this.getBaseType(_) } + /** Gets the node corresponding to the field `extension_target`. */ + final F::Expr getExtensionTarget() { + unified_class_like_declaration_extension_target(this, result) + } + /** Gets the node corresponding to the field `member`. */ final F::Member getMember(int i) { unified_class_like_declaration_member(this, i, result) } @@ -454,6 +459,7 @@ module Unified { /** Gets a field or child node of this node. */ final override F::AstNode getAFieldOrChild() { unified_class_like_declaration_base_type(this, _, result) or + unified_class_like_declaration_extension_target(this, result) or unified_class_like_declaration_member(this, _, result) or unified_class_like_declaration_modifier(this, _, result) or unified_class_like_declaration_name_node(this, result) or @@ -1614,6 +1620,10 @@ module Unified { or result = node.(ClassLikeDeclaration).getBaseType(i) and name = "getBaseType" or + result = node.(ClassLikeDeclaration).getExtensionTarget() and + i = -1 and + name = "getExtensionTarget" + or result = node.(ClassLikeDeclaration).getMember(i) and name = "getMember" or result = node.(ClassLikeDeclaration).getModifier(i) and name = "getModifier" diff --git a/unified/ql/lib/unified.dbscheme b/unified/ql/lib/unified.dbscheme index b32deb29d367..cb0facfc1d0a 100644 --- a/unified/ql/lib/unified.dbscheme +++ b/unified/ql/lib/unified.dbscheme @@ -318,6 +318,11 @@ unified_class_like_declaration_base_type( unique int base_type: @unified_base_type ref ); +unified_class_like_declaration_extension_target( + unique int unified_class_like_declaration: @unified_class_like_declaration ref, + unique int extension_target: @unified_expr ref +); + #keyset[unified_class_like_declaration, index] unified_class_like_declaration_member( int unified_class_like_declaration: @unified_class_like_declaration ref, From 4c22372e3db0519a6c3158b6d68a41305f2ce13d Mon Sep 17 00:00:00 2001 From: Asger F Date: Sat, 12 Sep 2026 21:42:30 +0200 Subject: [PATCH 0891/2098] unified: Update test after extractor change --- unified/ql/test/library-tests/static-name-binding/test.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/unified/ql/test/library-tests/static-name-binding/test.swift b/unified/ql/test/library-tests/static-name-binding/test.swift index 0fc9ae1c42e2..a7432344eb48 100644 --- a/unified/ql/test/library-tests/static-name-binding/test.swift +++ b/unified/ql/test/library-tests/static-name-binding/test.swift @@ -68,5 +68,5 @@ protocol P { } extension H // $ access=H1 : P { } // $ access=P -extension A.B.C // $ MISSING: access=A access=A.B access=A.B.C (`A.B.C` is currently parsed as a single identifier) - : P { } // $ access=P \ No newline at end of file +extension A.B.C // $ access=A access=A.B access=A.B.C + : P { } // $ access=P From 29a33cc39a2afb6a367ebcf1fb5d3fcc77657cd3 Mon Sep 17 00:00:00 2001 From: Asger F Date: Sat, 12 Sep 2026 21:44:06 +0200 Subject: [PATCH 0892/2098] unified: Include extensions in namespace of target class --- .../unified/internal/StaticNameBinding.qll | 20 +++++++++++++++++++ .../static-name-binding/extensions.swift | 8 ++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 230608b682f8..64d417153052 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -282,6 +282,13 @@ predicate inheritanceStep(NameBindingNode supertype, NameBindingNode subtype) { ) } +predicate extensionStep(NameBindingNode extension, NameBindingNode targetClass) { + exists(ClassLikeDeclaration cls | + targetClass = getNodeFromRef(cls.getExtensionTarget()) and + extension.isStaticMemberNamespace(cls) + ) +} + signature module TrackInputSig { /** Holds if the forward-flow of `node` should be tracked. */ predicate shouldTrack(NameBindingNode node); @@ -362,6 +369,17 @@ class NamespaceNode extends NameBindingNode { /** If this is the instance namespace for a class, gets the corresponding static namespace. */ NamespaceNode toStaticNamespace() { result.toInstanceNamespace() = this } + private NamespaceNode getAnExtension1() { extensionStep(result, this.ref()) } + + /** Gets a namespace that is an extension (i.e. containing extension methods) of this node. */ + NamespaceNode getAnExtension() { + result = this.getAnExtension1() + or + // `extensionStep` connects the static namespaces of classes. + // Add the corresponding extension relation between the instance namespaces. + result = this.toStaticNamespace().getAnExtension1().toInstanceNamespace() + } + private NamespaceNode getAnInheritanceParent1() { inheritanceStep(result.ref(), this) } /** Gets a namespace from which this namespace inherits directly. */ @@ -384,6 +402,8 @@ class NamespaceNode extends NameBindingNode { not this.hasOwnMember(name) and result = this.getAnInheritanceParent().getMember(name) and isInheritableMemberNode(result) + or + result = this.getAnExtension().getMember(name) } } diff --git a/unified/ql/test/library-tests/static-name-binding/extensions.swift b/unified/ql/test/library-tests/static-name-binding/extensions.swift index 891f899883df..017dba613a5e 100644 --- a/unified/ql/test/library-tests/static-name-binding/extensions.swift +++ b/unified/ql/test/library-tests/static-name-binding/extensions.swift @@ -1,15 +1,15 @@ class A { func ownMethod() { ownMethod() // $ access=A.ownMethod - extensionMethod1() // $ MISSING: access=A.extensionMethod1 - extensionMethod2() // $ MISSING: access=A.extensionMethod2 + extensionMethod1() // $ access=A.extensionMethod1 + extensionMethod2() // $ access=A.extensionMethod2 } } extension A { // $ access=A func extensionMethod1() { // name=A.extensionMethod1 ownMethod() // $ MISSING: access=A.ownMethod - extensionMethod1() // $ MISSING: access=A.extensionMethod1 + extensionMethod1() // $ access=A.extensionMethod1 extensionMethod2() // $ MISSING: access=A.extensionMethod2 } } @@ -18,6 +18,6 @@ extension A { // $ access=A func extensionMethod2() { // name=A.extensionMethod2 ownMethod() // $ MISSING: access=A.ownMethod extensionMethod1() // $ MISSING: access=A.extensionMethod1 - extensionMethod2() // $ MISSING: access=A.extensionMethod2 + extensionMethod2() // $ access=A.extensionMethod2 } } From b60ac2503435a458b09a4b0ac836b8a58e2affe2 Mon Sep 17 00:00:00 2001 From: Asger F Date: Sat, 12 Sep 2026 21:54:56 +0200 Subject: [PATCH 0893/2098] unified: Handle unqualified member access inside extension --- .../codeql/unified/internal/StaticNameBinding.qll | 14 +++++++++++++- .../static-name-binding/extensions.swift | 8 ++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 64d417153052..59038c452949 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -596,6 +596,17 @@ private module FolderHeuristic { } } +private ClassLikeDeclaration resolveExtensionTarget(ClassLikeDeclaration cls) { + trackNameBinding(result.getNameNode()) = getNodeFromRef(cls.getExtensionTarget()) +} + +private ClassLikeDeclaration tryResolveExtensionTarget(ClassLikeDeclaration cls) { + result = resolveExtensionTarget(cls) + or + not exists(resolveExtensionTarget(cls)) and + result = cls +} + /** * Holds if `access` may resolve to `target` through the enclosing `accessingClass`. * @@ -624,7 +635,8 @@ private predicate unqualifiedMemberAccessCand( // Resolved in an uncertain scope exists(NamespaceNode namespace, string name | name = access.getName() and - accessingClass = LocalNameBindingOutput::getAnUncertainScope(access, name) + accessingClass = + tryResolveExtensionTarget(LocalNameBindingOutput::getAnUncertainScope(access, name)) | instanceAccess = true and namespace.isInstanceMemberNamespace(accessingClass) and diff --git a/unified/ql/test/library-tests/static-name-binding/extensions.swift b/unified/ql/test/library-tests/static-name-binding/extensions.swift index 017dba613a5e..af4edb95f012 100644 --- a/unified/ql/test/library-tests/static-name-binding/extensions.swift +++ b/unified/ql/test/library-tests/static-name-binding/extensions.swift @@ -8,16 +8,16 @@ class A { extension A { // $ access=A func extensionMethod1() { // name=A.extensionMethod1 - ownMethod() // $ MISSING: access=A.ownMethod + ownMethod() // $ access=A.ownMethod extensionMethod1() // $ access=A.extensionMethod1 - extensionMethod2() // $ MISSING: access=A.extensionMethod2 + extensionMethod2() // $ access=A.extensionMethod2 } } extension A { // $ access=A func extensionMethod2() { // name=A.extensionMethod2 - ownMethod() // $ MISSING: access=A.ownMethod - extensionMethod1() // $ MISSING: access=A.extensionMethod1 + ownMethod() // $ access=A.ownMethod + extensionMethod1() // $ access=A.extensionMethod1 extensionMethod2() // $ access=A.extensionMethod2 } } From 6490d2dec92723ee8a31d2b198ce2301bd0f5111 Mon Sep 17 00:00:00 2001 From: Asger F Date: Sat, 12 Sep 2026 21:59:23 +0200 Subject: [PATCH 0894/2098] unified: Add test with inheritance resolved through extension --- .../static-name-binding/extensions.swift | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/unified/ql/test/library-tests/static-name-binding/extensions.swift b/unified/ql/test/library-tests/static-name-binding/extensions.swift index af4edb95f012..7010b48fe6df 100644 --- a/unified/ql/test/library-tests/static-name-binding/extensions.swift +++ b/unified/ql/test/library-tests/static-name-binding/extensions.swift @@ -21,3 +21,17 @@ extension A { // $ access=A extensionMethod2() // $ access=A.extensionMethod2 } } + +class B { +} + +extension B { // $ access=B + class C { // name=B.C + class D {} // name=B.C.D + } +} +extension B { // $ access=B + class Nested : C { // $ access=B.C + let x : D // $ MISSING: access=B.C.D + } +} From a19545880887c3eb609a3f8130f13fdd974bf2a1 Mon Sep 17 00:00:00 2001 From: Asger F Date: Sat, 12 Sep 2026 22:01:51 +0200 Subject: [PATCH 0895/2098] unified: Ensure static namespace is available in graph Inheritance must be resolvable in the main recursive SCC, prior to unqualified member resolution. We now ensure that the static namespace of the extension target is in the local scope. Note that the instance namespace is not needed here; it is handled in unqualified lookup which is the only case where static name binding needs to worry about instance member lookups. --- unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll | 5 +++++ .../test/library-tests/static-name-binding/extensions.swift | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 59038c452949..8d1e3519a409 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -262,6 +262,11 @@ predicate valueStep(NameBindingNode node1, NameBindingNode node2) { node2 = getNodeFromRef(p.getSubPattern()) ) or + exists(ClassLikeDeclaration extension | + node1 = getNodeFromRef(extension.getExtensionTarget()) and + node2.isLocalNamespace(extension) + ) + or FolderHeuristic::valueStep(node1, node2) } diff --git a/unified/ql/test/library-tests/static-name-binding/extensions.swift b/unified/ql/test/library-tests/static-name-binding/extensions.swift index 7010b48fe6df..e0b6a0ad41c3 100644 --- a/unified/ql/test/library-tests/static-name-binding/extensions.swift +++ b/unified/ql/test/library-tests/static-name-binding/extensions.swift @@ -32,6 +32,6 @@ extension B { // $ access=B } extension B { // $ access=B class Nested : C { // $ access=B.C - let x : D // $ MISSING: access=B.C.D + let x : D // $ access=B.C.D } } From 21b5ebbd1a0016ca0b6be48b69a4f5d157aebab9 Mon Sep 17 00:00:00 2001 From: Asger F Date: Sat, 12 Sep 2026 22:03:13 +0200 Subject: [PATCH 0896/2098] unified: Add test with inheritance through extension --- .../static-name-binding/extensions.swift | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/unified/ql/test/library-tests/static-name-binding/extensions.swift b/unified/ql/test/library-tests/static-name-binding/extensions.swift index e0b6a0ad41c3..3b1a5e603c69 100644 --- a/unified/ql/test/library-tests/static-name-binding/extensions.swift +++ b/unified/ql/test/library-tests/static-name-binding/extensions.swift @@ -35,3 +35,15 @@ extension B { // $ access=B let x : D // $ access=B.C.D } } + +// Inheritance through extension +class Base { + func baseMethod() { + } +} +class X { + func xMethod() { + baseMethod() // $ access=Base.baseMethod + } +} +extension X : Base {} // $ access=X access=Base From 937d7c0533a6c6b2835a6aa0a9606ebf04f6865b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2026 03:03:49 +0000 Subject: [PATCH 0897/2098] build(deps): bump golang.org/x/tools Bumps the extractor-dependencies group in /go/extractor with 1 update: [golang.org/x/tools](https://github.com/golang/tools). Updates `golang.org/x/tools` from 0.49.0 to 0.50.0 - [Release notes](https://github.com/golang/tools/releases) - [Commits](https://github.com/golang/tools/compare/v0.49.0...v0.50.0) --- updated-dependencies: - dependency-name: golang.org/x/tools dependency-version: 0.50.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: extractor-dependencies ... Signed-off-by: dependabot[bot] --- go/extractor/go.mod | 6 +++--- go/extractor/go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go/extractor/go.mod b/go/extractor/go.mod index c255e949755d..71447628b90f 100644 --- a/go/extractor/go.mod +++ b/go/extractor/go.mod @@ -11,13 +11,13 @@ toolchain go1.27.1 require ( github.com/stretchr/testify v1.11.1 golang.org/x/mod v0.41.0 - golang.org/x/sys v0.47.0 - golang.org/x/tools v0.49.0 + golang.org/x/sys v0.48.0 + golang.org/x/tools v0.50.0 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/sync v0.22.0 // indirect + golang.org/x/sync v0.23.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go/extractor/go.sum b/go/extractor/go.sum index 8efdb012631e..b1ec90aa5b9e 100644 --- a/go/extractor/go.sum +++ b/go/extractor/go.sum @@ -8,12 +8,12 @@ github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= golang.org/x/mod v0.41.0 h1:qJmnOUb4YB+FsEuM3HcWucdZASCPGhsX6uljO6pog0c= golang.org/x/mod v0.41.0/go.mod h1:Ek9pY8RKWXwsWvd3rQiHYtMqkjSUV+s1Rj7j4H5Ur6o= -golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= -golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= -golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= -golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/tools v0.49.0 h1:3NI7VXzL9+1WZD52Dx2ttoPwD5DWrFGpl9mFZDlmisI= -golang.org/x/tools v0.49.0/go.mod h1:SJNXV9DBKT0UbdttsQjbfJlAE/q+y36++zo3uL3N0Oo= +golang.org/x/sync v0.23.0 h1:KameEIfc1IkluZyXWLn39Wd4tURc6GbCiISGiZm2bQk= +golang.org/x/sync v0.23.0/go.mod h1:sUUOizhqBxiL6pEWpqNLUiaJn1ShEbZ6BBqskPbjZm0= +golang.org/x/sys v0.48.0 h1:bbX/i/6MgT9BVLM9RT1thmxL04yeTAhbEz4SyadbXoo= +golang.org/x/sys v0.48.0/go.mod h1:hNLxWAXmnKAxqDtdwIYC4bM9oQPEecfsnNMuSxOs3og= +golang.org/x/tools v0.50.0 h1:c2ifzfcuY7L90lZ2aKd8S4K2NpASF08SZx9ZuJkHmSU= +golang.org/x/tools v0.50.0/go.mod h1:7ulVMw3831Mwi5EZD6RomGyffr4VFjuNYXf2BbCEAV0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= From 0d642e5884d66017fd6c902b2e8bf51c2f3335ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jack=20N=C3=B8rskov=20J=C3=B8rgensen?= Date: Mon, 14 Sep 2026 09:56:20 +0200 Subject: [PATCH 0898/2098] Limit wrapper call argument steps Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8390a2d1-70e3-4a01-84d3-3e5747d5da0b --- .../dataflow/internal/FunctionWrapperSteps.qll | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/FunctionWrapperSteps.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/FunctionWrapperSteps.qll index a1899f121cf7..b0426e6b4dd2 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/FunctionWrapperSteps.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/FunctionWrapperSteps.qll @@ -155,7 +155,12 @@ private DataFlow::SourceNode forwardedCalleeSource( exists(DataFlow::TypeBackTracker t2 | result = forwardedCalleeSource(call, t2).backtrack(t2, t)) } -/** Data flow into a concrete function invoked through a forwarding wrapper. */ +/** + * Data flow into a concrete function invoked through a forwarding wrapper. + * + * Only arguments with a statically known position and a corresponding non-rest parameter are + * modeled. + */ private class FunctionWrapperCallStep extends DataFlow::SharedFlowStep { DataFlow::CallNode call; DataFlow::FunctionNode wrapped; @@ -167,8 +172,11 @@ private class FunctionWrapperCallStep extends DataFlow::SharedFlowStep { override predicate step(DataFlow::Node pred, DataFlow::Node succ) { exists(int index | + // getArgument only has a result when the argument position is statically known. pred = call.getArgument(index) and - succ = wrapped.getParameter(index) + succ = wrapped.getParameter(index) and + // A rest parameter receives an array, not the argument at this index. + not succ.(DataFlow::ParameterNode).isRestParameter() ) } } From 42df5799e2cbab4dca1e154c35a2fc2507157b1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jack=20N=C3=B8rskov=20J=C3=B8rgensen?= Date: Mon, 14 Sep 2026 10:29:36 +0200 Subject: [PATCH 0899/2098] Track Hapi request aliases before property reads Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8390a2d1-70e3-4a01-84d3-3e5747d5da0b --- .../ql/lib/semmle/javascript/frameworks/Hapi.qll | 6 +++--- .../library-tests/frameworks/hapi/src/hapi.js | 6 +++++- .../library-tests/frameworks/hapi/tests.expected | 16 +++++++++++++--- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/javascript/ql/lib/semmle/javascript/frameworks/Hapi.qll b/javascript/ql/lib/semmle/javascript/frameworks/Hapi.qll index c55c857cb83e..36618bffb351 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/Hapi.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/Hapi.qll @@ -106,7 +106,7 @@ module Hapi { RouteHandler rh, string property, DataFlow::TypeTracker t ) { t.start() and - result = rh.getRequestParameter().getAPropertyRead(property) + result = rh.getARequestSource().ref().getAPropertyRead(property) or exists(DataFlow::TypeTracker t2 | result = requestInputRef(rh, property, t2).track(t2, t)) } @@ -132,7 +132,7 @@ module Hapi { // `request.payload` is an object, so prefer a property read if possible. if exists(requestInputRef(rh, "payload").getAPropertyRead()) then this = requestInputRef(rh, "payload").getAPropertyRead() - else this = rh.getRequestParameter().getAPropertyRead("payload") + else this = rh.getARequestSource().ref().getAPropertyRead("payload") ) or kind = "parameter" and @@ -140,7 +140,7 @@ module Hapi { // These are objects, so prefer a property read if possible. if exists(requestInputRef(rh, property).getAPropertyRead()) then this = requestInputRef(rh, property).getAPropertyRead() - else this = rh.getRequestParameter().getAPropertyRead(property) + else this = rh.getARequestSource().ref().getAPropertyRead(property) ) or exists(DataFlow::PropRead url | diff --git a/javascript/ql/test/library-tests/frameworks/hapi/src/hapi.js b/javascript/ql/test/library-tests/frameworks/hapi/src/hapi.js index 467c0e801595..679043b140df 100644 --- a/javascript/ql/test/library-tests/frameworks/hapi/src/hapi.js +++ b/javascript/ql/test/library-tests/frameworks/hapi/src/hapi.js @@ -20,7 +20,7 @@ server2.ext('onPreResponse', function handler3(request, reply) { // HTTP::RouteH function handler4(request, reply){ request.rawPayload; request.payload.foo; - request.query.bar; + getRequest(request).query.bar; request.url.path; request.headers.baz; request.state.token; @@ -34,3 +34,7 @@ function getHandler() { return function (req, h){} } server2.route({handler: getHandler()}); + +function getRequest(request) { + return request; +} diff --git a/javascript/ql/test/library-tests/frameworks/hapi/tests.expected b/javascript/ql/test/library-tests/frameworks/hapi/tests.expected index b896db8ed294..e9a9f95200f0 100644 --- a/javascript/ql/test/library-tests/frameworks/hapi/tests.expected +++ b/javascript/ql/test/library-tests/frameworks/hapi/tests.expected @@ -24,11 +24,16 @@ test_RequestExpr | src/hapi.js:20:19:20:25 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapi.js:21:3:21:9 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapi.js:22:3:22:9 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | -| src/hapi.js:23:3:23:9 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | +| src/hapi.js:23:3:23:21 | getRequest(request) | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | +| src/hapi.js:23:14:23:20 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapi.js:24:3:24:9 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapi.js:25:3:25:9 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapi.js:26:3:26:9 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapi.js:34:22:34:24 | req | src/hapi.js:34:12:34:30 | function (req, h){} | +| src/hapi.js:38:1:40:1 | return of function getRequest | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | +| src/hapi.js:38:21:38:27 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | +| src/hapi.js:38:21:38:27 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | +| src/hapi.js:39:10:39:16 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapiglue.js:13:32:13:38 | request | src/hapiglue.js:13:14:15:5 | functio ... n\\n } | | src/hapiglue.js:13:32:13:38 | request | src/hapiglue.js:13:14:15:5 | functio ... n\\n } | | src/hapiglue.js:14:9:14:15 | request | src/hapiglue.js:13:14:15:5 | functio ... n\\n } | @@ -102,7 +107,7 @@ test_ServerDefinition test_RequestInputAccess | src/hapi.js:21:3:21:20 | request.rawPayload | body | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapi.js:22:3:22:21 | request.payload.foo | body | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | -| src/hapi.js:23:3:23:19 | request.query.bar | parameter | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | +| src/hapi.js:23:3:23:31 | getRequ ... ery.bar | parameter | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapi.js:24:3:24:18 | request.url.path | url | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapi.js:25:3:25:21 | request.headers.baz | header | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapi.js:26:3:26:21 | request.state.token | cookie | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | @@ -174,10 +179,15 @@ test_RouteHandler_getARequestExpr | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:20:19:20:25 | request | | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:21:3:21:9 | request | | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:22:3:22:9 | request | -| src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:23:3:23:9 | request | +| src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:23:3:23:21 | getRequest(request) | +| src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:23:14:23:20 | request | | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:24:3:24:9 | request | | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:25:3:25:9 | request | | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:26:3:26:9 | request | +| src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:38:1:40:1 | return of function getRequest | +| src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:38:21:38:27 | request | +| src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:38:21:38:27 | request | +| src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:39:10:39:16 | request | | src/hapi.js:34:12:34:30 | function (req, h){} | src/hapi.js:34:22:34:24 | req | | src/hapiglue.js:13:14:15:5 | functio ... n\\n } | src/hapiglue.js:13:32:13:38 | request | | src/hapiglue.js:13:14:15:5 | functio ... n\\n } | src/hapiglue.js:13:32:13:38 | request | From 05914f2a7e6006840d699da0b2147b28c3975bc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jack=20N=C3=B8rskov=20J=C3=B8rgensen?= Date: Mon, 14 Sep 2026 11:04:24 +0200 Subject: [PATCH 0900/2098] Test Hapi payload and params aliases Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8390a2d1-70e3-4a01-84d3-3e5747d5da0b --- .../test/library-tests/frameworks/hapi/src/hapi.js | 4 ++-- .../library-tests/frameworks/hapi/tests.expected | 13 ++++++++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/javascript/ql/test/library-tests/frameworks/hapi/src/hapi.js b/javascript/ql/test/library-tests/frameworks/hapi/src/hapi.js index 679043b140df..bfc2ebe8a020 100644 --- a/javascript/ql/test/library-tests/frameworks/hapi/src/hapi.js +++ b/javascript/ql/test/library-tests/frameworks/hapi/src/hapi.js @@ -19,8 +19,8 @@ server2.ext('onPreResponse', function handler3(request, reply) { // HTTP::RouteH function handler4(request, reply){ request.rawPayload; - request.payload.foo; - getRequest(request).query.bar; + getRequest(request).payload.foo; + getRequest(request).query.bar; getRequest(request).params.bar; request.url.path; request.headers.baz; request.state.token; diff --git a/javascript/ql/test/library-tests/frameworks/hapi/tests.expected b/javascript/ql/test/library-tests/frameworks/hapi/tests.expected index e9a9f95200f0..3cb778c82595 100644 --- a/javascript/ql/test/library-tests/frameworks/hapi/tests.expected +++ b/javascript/ql/test/library-tests/frameworks/hapi/tests.expected @@ -23,9 +23,12 @@ test_RequestExpr | src/hapi.js:20:19:20:25 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapi.js:20:19:20:25 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapi.js:21:3:21:9 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | -| src/hapi.js:22:3:22:9 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | +| src/hapi.js:22:3:22:21 | getRequest(request) | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | +| src/hapi.js:22:14:22:20 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapi.js:23:3:23:21 | getRequest(request) | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapi.js:23:14:23:20 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | +| src/hapi.js:23:34:23:52 | getRequest(request) | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | +| src/hapi.js:23:45:23:51 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapi.js:24:3:24:9 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapi.js:25:3:25:9 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapi.js:26:3:26:9 | request | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | @@ -106,8 +109,9 @@ test_ServerDefinition | src/wrapped-route.js:42:10:42:26 | new Hapi.Server() | test_RequestInputAccess | src/hapi.js:21:3:21:20 | request.rawPayload | body | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | -| src/hapi.js:22:3:22:21 | request.payload.foo | body | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | +| src/hapi.js:22:3:22:33 | getRequ ... oad.foo | body | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapi.js:23:3:23:31 | getRequ ... ery.bar | parameter | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | +| src/hapi.js:23:34:23:63 | getRequ ... ams.bar | parameter | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapi.js:24:3:24:18 | request.url.path | url | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapi.js:25:3:25:21 | request.headers.baz | header | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapi.js:26:3:26:21 | request.state.token | cookie | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | @@ -178,9 +182,12 @@ test_RouteHandler_getARequestExpr | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:20:19:20:25 | request | | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:20:19:20:25 | request | | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:21:3:21:9 | request | -| src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:22:3:22:9 | request | +| src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:22:3:22:21 | getRequest(request) | +| src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:22:14:22:20 | request | | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:23:3:23:21 | getRequest(request) | | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:23:14:23:20 | request | +| src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:23:34:23:52 | getRequest(request) | +| src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:23:45:23:51 | request | | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:24:3:24:9 | request | | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:25:3:25:9 | request | | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapi.js:26:3:26:9 | request | From d33b157ba9a0796dcd24b9bd2dcdac5c01a4cc61 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 14 Sep 2026 11:14:33 +0200 Subject: [PATCH 0901/2098] C#: Address review comments. --- .../DotNetCliInvoker.cs | 2 +- .../EnvironmentVariableNames.cs | 6 ++--- .../FeedManagerIO.cs | 2 +- .../IRegistryProxy.cs | 4 +-- .../IRegistryProxyConfiguration.cs | 8 +++--- .../RegistryProxy.cs | 8 +++--- .../Semmle.Extraction.Tests/RegistryProxy.cs | 26 +++++++++---------- 7 files changed, 28 insertions(+), 28 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNetCliInvoker.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNetCliInvoker.cs index 4e1a680eebf3..384404fbc6ce 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNetCliInvoker.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNetCliInvoker.cs @@ -46,7 +46,7 @@ private ProcessStartInfo MakeDotnetStartInfo(List args, string? workingD // Configure the proxy settings, if applicable. if (this.proxy != null) { - logger.LogDebug($"Configuring environment variables for the Registry proxy at {this.proxy.Address}"); + logger.LogDebug($"Configuring environment variables for the registry proxy at {this.proxy.Address}"); startInfo.EnvironmentVariables["HTTP_PROXY"] = this.proxy.Address; startInfo.EnvironmentVariables["HTTPS_PROXY"] = this.proxy.Address; diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/EnvironmentVariableNames.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/EnvironmentVariableNames.cs index 4b1512c661f0..6b5b35ec03a3 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/EnvironmentVariableNames.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/EnvironmentVariableNames.cs @@ -75,17 +75,17 @@ internal static class EnvironmentVariableNames public const string DiagnosticDir = "CODEQL_EXTRACTOR_CSHARP_DIAGNOSTIC_DIR"; /// - /// Specifies the hostname of the Registry proxy. + /// Specifies the hostname of the registry proxy. /// public const string ProxyHost = "CODEQL_PROXY_HOST"; /// - /// Specifies the port of the Registry proxy. + /// Specifies the port of the registry proxy. /// public const string ProxyPort = "CODEQL_PROXY_PORT"; /// - /// Contains the certificate used by the Registry proxy. + /// Contains the certificate used by the registry proxy. /// public const string ProxyCertificate = "CODEQL_PROXY_CA_CERTIFICATE"; diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManagerIO.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManagerIO.cs index 4b9b6b243866..012781b23276 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManagerIO.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManagerIO.cs @@ -43,7 +43,7 @@ public bool IsFeedReachable(string feed, int timeoutMilliSeconds, int tryCount) { logger.LogInfo($"Checking if NuGet feed '{feed}' is reachable..."); - // Configure the HttpClient to be aware of the Registry proxy, if used. + // Configure the HttpClient to be aware of the registry proxy, if used. HttpClientHandler httpClientHandler = new(); if (registryProxy != null) { diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IRegistryProxy.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IRegistryProxy.cs index 7ddc8f846aee..2537ac0b4054 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IRegistryProxy.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IRegistryProxy.cs @@ -7,7 +7,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching public interface IRegistryProxy : IDisposable { /// - /// The full address of the Registry proxy, if available. + /// The full address of the registry proxy, if available. /// string Address { get; } @@ -27,7 +27,7 @@ public interface IRegistryProxy : IDisposable string? CertificatePath { get; } /// - /// The certificate used for the Registry proxy. + /// The certificate used for the registry proxy. /// X509Certificate2? Certificate { get; } } diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IRegistryProxyConfiguration.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IRegistryProxyConfiguration.cs index 520edfd7fb77..0ca48da995f0 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IRegistryProxyConfiguration.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IRegistryProxyConfiguration.cs @@ -4,16 +4,16 @@ namespace Semmle.Extraction.CSharp.DependencyFetching { public interface IRegistryProxyConfiguration { - // The host of the Registry proxy, if available. + // The host of the registry proxy, if available. string? Host { get; } - // The port of the Registry proxy, if available. + // The port of the registry proxy, if available. string? Port { get; } - // The certificate of the Registry proxy, if available. + // The certificate of the registry proxy, if available. string? Certificate { get; } - // The list of package registries that are configured for the Registry proxy, if any. + // The list of package registries that are configured for the registry proxy, if any. // The value of the environment variable should be a JSON array of objects, such as: // [ { "type": "nuget_feed", "url": "https://nuget.pkg.github.com/org/index.json" } ] string? RegistryURLs { get; } diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/RegistryProxy.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/RegistryProxy.cs index ea2203891e37..e16ea66725c7 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/RegistryProxy.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/RegistryProxy.cs @@ -81,7 +81,7 @@ private RegistryProxy(IRegistryProxyConfiguration config, ILogger logger, Tempor writer.Write(config.Certificate); writer.Close(); - logger.LogInfo($"Stored Registry proxy certificate at {CertificatePath}"); + logger.LogInfo($"Stored registry proxy certificate at {CertificatePath}"); Certificate = X509Certificate2.CreateFromPem(config.Certificate); } @@ -130,7 +130,7 @@ private RegistryProxy(IRegistryProxyConfiguration config, ILogger logger, Tempor internal static IRegistryProxy? Make(ILogger logger, IDiagnosticsWriter diagnosticsWriter, TemporaryDirectory tempWorkingDirectory) { // Setting HTTP(S)_PROXY and SSL_CERT_FILE have no effect on Windows or macOS, - // but we would still end up using the Registry proxy to check for feed reachability. + // but we would still end up using the registry proxy to check for feed reachability. // This would result in us discovering that the feeds are reachable, but `dotnet` would // fail to connect to them. To prevent this from happening, we do not initialise an // instance of `RegistryProxy` on those platforms. @@ -143,7 +143,7 @@ private RegistryProxy(IRegistryProxyConfiguration config, ILogger logger, Tempor } /// - /// Creates an instance of the Registry proxy using the specified configuration. + /// Creates an instance of the registry proxy using the specified configuration. /// Returns null if the proxy cannot be created. /// This overload is exposed primarily to enable platform-independent unit testing. /// @@ -152,7 +152,7 @@ private RegistryProxy(IRegistryProxyConfiguration config, ILogger logger, Tempor { if (string.IsNullOrWhiteSpace(proxyConfig.Host) || string.IsNullOrWhiteSpace(proxyConfig.Port)) { - logger.LogDebug("No Registry proxy credentials are configured."); + logger.LogDebug("No registry proxy credentials are configured."); return null; } diff --git a/csharp/extractor/Semmle.Extraction.Tests/RegistryProxy.cs b/csharp/extractor/Semmle.Extraction.Tests/RegistryProxy.cs index e3cd1743593f..5705077c0219 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/RegistryProxy.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/RegistryProxy.cs @@ -29,8 +29,8 @@ private static TemporaryDirectory MakeTemporaryDirectory() } /// - /// Verify that the Registry proxy correctly handles the case where the port is not specified. - /// In this case, the Registry proxy should not be created. + /// Verify that the registry proxy correctly handles the case where the port is not specified. + /// In this case, the registry proxy should not be created. /// [Fact] public void TestRegistryProxyNoPort() @@ -51,8 +51,8 @@ public void TestRegistryProxyNoPort() } /// - /// Verify that the Registry proxy correctly handles the case where the host is not specified. - /// In this case, the Registry proxy should not be created. + /// Verify that the registry proxy correctly handles the case where the host is not specified. + /// In this case, the registry proxy should not be created. /// [Fact] public void TestRegistryProxyNoHost() @@ -105,7 +105,7 @@ public void TestRegistryProxyNoHost() """; /// - /// Verify that the Registry proxy correctly handles the case + /// Verify that the registry proxy correctly handles the case /// where the port, host, and certificate are specified. /// [Fact] @@ -131,9 +131,9 @@ public void TestRegistryProxyCertificate() } /// - /// Verify that the Registry proxy correctly handles the case where the RegistryURLs environment variable + /// Verify that the registry proxy correctly handles the case where the RegistryURLs environment variable /// is not a valid JSON list. - /// In this case, the Registry proxy should be created, but the list of private registries should be empty. + /// In this case, the registry proxy should be created, but the list of private registries should be empty. /// [Fact] public void TestRegistryProxyUrlsParseError() @@ -157,9 +157,9 @@ public void TestRegistryProxyUrlsParseError() } /// - /// Verify that the Registry proxy correctly handles the case where the RegistryURLs environment variable + /// Verify that the registry proxy correctly handles the case where the RegistryURLs environment variable /// is a valid JSON list with a single entry. - /// In this case, the Registry proxy should be created, and the list of private registries should contain the single entry. + /// In this case, the registry proxy should be created, and the list of private registries should contain the single entry. /// [Fact] public void TestRegistryProxyUrlsSingle() @@ -185,10 +185,10 @@ public void TestRegistryProxyUrlsSingle() } /// - /// Verify that the Registry proxy correctly handles the case where the RegistryURLs environment variable + /// Verify that the registry proxy correctly handles the case where the RegistryURLs environment variable /// is a valid JSON list with multiple entries, but only one of them is of type "nuget_feed", which is /// relevant for C#. - /// In this case, the Registry proxy should be created, and the list of private registries should + /// In this case, the registry proxy should be created, and the list of private registries should /// contain only the entry of type "nuget_feed". /// [Fact] @@ -215,9 +215,9 @@ public void TestRegistryProxyUrls3() } /// - /// Verify that the Registry proxy correctly handles the case where the RegistryURLs environment variable + /// Verify that the registry proxy correctly handles the case where the RegistryURLs environment variable /// is a valid JSON list with multiple entries and one of them is configured to replace the base feeds. - /// In this case, the Registry proxy should be created, and the list of private registries should contain all + /// In this case, the registry proxy should be created, and the list of private registries should contain all /// entries, while the list of base registries should contain only the entry that replaces the base feeds. /// [Fact] From f6bd6e8b526355654a1e8235dec732758e9d4617 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 11 Sep 2026 14:57:46 +0200 Subject: [PATCH 0902/2098] unified: Add ExprPositions --- .../lib/codeql/unified/internal/AstExtra.qll | 21 +++--- .../codeql/unified/internal/ExprPositions.qll | 66 +++++++++++++++++++ 2 files changed, 79 insertions(+), 8 deletions(-) create mode 100644 unified/ql/lib/codeql/unified/internal/ExprPositions.qll diff --git a/unified/ql/lib/codeql/unified/internal/AstExtra.qll b/unified/ql/lib/codeql/unified/internal/AstExtra.qll index 5e8e54faa61a..64ab0262ea56 100644 --- a/unified/ql/lib/codeql/unified/internal/AstExtra.qll +++ b/unified/ql/lib/codeql/unified/internal/AstExtra.qll @@ -60,15 +60,20 @@ module Public { TopLevelStmt() { this = any(TopLevel t).getBody().getAStmt() } } + /** An identifier appearing in the context of a break/continue label, argument/parameter name, or name of a member lookup. */ + final class IdentifierLabel extends Identifier { + IdentifierLabel() { + this = any(MemberAccessExpr e).getMemberNameNode() or + this = any(Argument a).getNameNode() or + this = any(Parameter p).getExternalNameNode() or + this = any(LabeledStmt stmt).getLabelNameNode() or + this = any(BreakExpr expr).getLabelNameNode() or + this = any(ContinueExpr expr).getLabelNameNode() + } + } + /** An identifier appearing in the context of an expression, pattern, or type annotation. */ final class IdentifierExpr extends Identifier { - IdentifierExpr() { - not this = any(MemberAccessExpr e).getMemberNameNode() and - not this = any(Argument a).getNameNode() and - not this = any(Parameter p).getExternalNameNode() and - not this = any(LabeledStmt stmt).getLabelNameNode() and - not this = any(BreakExpr expr).getLabelNameNode() and - not this = any(ContinueExpr expr).getLabelNameNode() - } + IdentifierExpr() { not this instanceof IdentifierLabel } } } diff --git a/unified/ql/lib/codeql/unified/internal/ExprPositions.qll b/unified/ql/lib/codeql/unified/internal/ExprPositions.qll new file mode 100644 index 000000000000..4c38c5d241c9 --- /dev/null +++ b/unified/ql/lib/codeql/unified/internal/ExprPositions.qll @@ -0,0 +1,66 @@ +private import unified +private import NameBinding as NameBinding + +/** + * Holds if `expr` appears in the context of a type annotation. + */ +predicate isInTypeContext(Expr expr) { + expr = any(TypeCastExpr n).getType() + or + expr = any(TypeTestExpr n).getType() + or + expr = any(VariableDeclaration n).getType() + or + expr = any(FunctionDeclaration n).getReturnType() + or + expr = any(AccessorDeclaration n).getType() + or + expr = any(Parameter n).getType() + or + expr = any(TypeAliasDeclaration n).getType() + or + expr = any(BaseType n).getType() + or + expr = any(TypeParameter n).getBound() + or + expr.getParent() instanceof TypeConstraint + or + isInTypeContext(expr.getEnclosingExpr()) +} + +/** Holds if `e` appears in a name-binding position inside `declaration` */ +predicate isInBindingContext(Expr e, AstNode declaration) { + NameBinding::bindingContext(e, _, declaration) +} + +/** Holds if `e` is part of the target of `assignment`. */ +predicate isInAssignmentContext(Expr e, AstNode assignment) { + e = assignment.(AssignExpr).getTarget() + or + e = assignment.(CompoundAssignExpr).getTarget() + or + exists(TupleExpr tuple | + isInAssignmentContext(tuple, assignment) and + e = tuple.getAnElement().getValue() + ) +} + +/** + * Holds if `e` receives an incoming value because it is part of a binding pattern + * or assignment target. + */ +predicate hasIncomingValue(Expr e, AstNode declarationOrAssignment) { + isInBindingContext(e, declarationOrAssignment) + or + isInAssignmentContext(e, declarationOrAssignment) +} + +/** + * Holds if `e` evaluates to a result. + */ +predicate hasResultValue(Expr e) { + not isInTypeContext(e) and + not isInBindingContext(e, _) and + not isInAssignmentContext(e, any(AssignExpr n)) and // non-compound assignment target + not e instanceof IdentifierLabel +} From ed871524a626d418e457fde0f8bcd64caf8e94ce Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 8 Sep 2026 10:48:50 +0200 Subject: [PATCH 0903/2098] unified: Scaffold empty data flow graph with test The data flow graph has no actual edges yet --- .../unified/internal/dataflow/AllDataFlow.qll | 8 + .../unified/internal/dataflow/Content.qll | 30 +++ .../internal/dataflow/DataFlowGraph.qll | 6 + .../dataflow/DataFlowInstantiation.qll | 175 ++++++++++++++++++ .../internal/dataflow/DataFlowNode.qll | 29 +++ .../internal/dataflow/DataFlowPublic.qll | 13 ++ .../codeql/unified/internal/dataflow/Step.qll | 51 +++++ .../dataflow/TaintTrackingInstantiation.qll | 16 ++ unified/ql/lib/qlpack.yml | 1 + unified/ql/lib/unified.qll | 1 + unified/ql/lib/utils/test/InlineFlowTest.qll | 38 ++++ .../test/library-tests/dataflow/test.expected | 0 .../ql/test/library-tests/dataflow/test.ql | 3 + .../ql/test/library-tests/dataflow/test.swift | 8 + 14 files changed, 379 insertions(+) create mode 100644 unified/ql/lib/codeql/unified/internal/dataflow/AllDataFlow.qll create mode 100644 unified/ql/lib/codeql/unified/internal/dataflow/Content.qll create mode 100644 unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll create mode 100644 unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll create mode 100644 unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll create mode 100644 unified/ql/lib/codeql/unified/internal/dataflow/DataFlowPublic.qll create mode 100644 unified/ql/lib/codeql/unified/internal/dataflow/Step.qll create mode 100644 unified/ql/lib/codeql/unified/internal/dataflow/TaintTrackingInstantiation.qll create mode 100644 unified/ql/lib/utils/test/InlineFlowTest.qll create mode 100644 unified/ql/test/library-tests/dataflow/test.expected create mode 100644 unified/ql/test/library-tests/dataflow/test.ql create mode 100644 unified/ql/test/library-tests/dataflow/test.swift diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/AllDataFlow.qll b/unified/ql/lib/codeql/unified/internal/dataflow/AllDataFlow.qll new file mode 100644 index 000000000000..dda7b2e472e0 --- /dev/null +++ b/unified/ql/lib/codeql/unified/internal/dataflow/AllDataFlow.qll @@ -0,0 +1,8 @@ +/** Re-exports all the files in the internal dataflow folder (except DataFlowPublic). */ + +import Content +import DataFlowGraph +import DataFlowInstantiation +import DataFlowNode +import Step +import TaintTrackingInstantiation diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/Content.qll b/unified/ql/lib/codeql/unified/internal/dataflow/Content.qll new file mode 100644 index 000000000000..ccaf1100c36d --- /dev/null +++ b/unified/ql/lib/codeql/unified/internal/dataflow/Content.qll @@ -0,0 +1,30 @@ +private import unified +private import AllDataFlow + +private newtype TContent = TNamedMember(string name) { name = any(Identifier id).getValue() } + +class Content extends TContent { + string asNamedMember() { this = TNamedMember(result) } + + string toString() { result = this.asNamedMember() } + + Location getLocation() { none() } +} + +private newtype TContentSet = TSingleton(Content content) + +class ContentSet extends TContentSet { + Content asSingleton() { this = TSingleton(result) } + + string toString() { result = this.asSingleton().toString() } + + Location getLocation() { result = this.asSingleton().getLocation() } + + Content getAStoreContent() { result = this.asSingleton() } + + Content getAReadContent() { result = this.asSingleton() } +} + +module ContentSet { + ContentSet namedMember(string name) { result.asSingleton().asNamedMember() = name } +} diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll new file mode 100644 index 000000000000..4d5c15a4169e --- /dev/null +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll @@ -0,0 +1,6 @@ +private import unified +private import AllDataFlow + +predicate step(Node node1, Step step, Node node2) { + none() // TODO +} diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll new file mode 100644 index 000000000000..452ee18fed0b --- /dev/null +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll @@ -0,0 +1,175 @@ +private import unified +private import AllDataFlow +private import AllDataFlow as D +private import codeql.dataflow.DataFlow +private import codeql.util.Void +private import codeql.util.Unit + +module DataFlowInput implements InputSig { + class Node = D::Node; + + // + // Contents + // + class Content = D::Content; + + class ContentSet = D::ContentSet; + + class ContentApprox = Content; // TODO + + ContentApprox getContentApprox(Content c) { result = c } // TODO + + // + // Parameter, argument, return, and out nodes and their positions/kinds + // + class ParameterNode extends Node { + ParameterNode() { none() } // TODO + } + + class ArgumentNode extends Node { + ArgumentNode() { none() } // TODO + } + + class ReturnNode extends Node { + ReturnNode() { none() } // TODO + + ReturnKind getKind() { none() } // TODO + } + + class OutNode extends Node { + OutNode() { none() } // TODO + } + + class ReturnKind = Unit; + + class ParameterPosition extends Void { + ParameterPosition() { none() } // TODO + + bindingset[this] + string toString() { none() } // TODO + } + + class ArgumentPosition extends Void { + ArgumentPosition() { none() } // TODO + + bindingset[this] + string toString() { none() } // TODO + } + + predicate parameterMatch(ParameterPosition ppos, ArgumentPosition apos) { none() } // TODO + + // + // Calls and callables + // + class DataFlowCall extends Void { + Location getLocation() { none() } // TODO + + DataFlowCallable getEnclosingCallable() { none() } // TODO + } + + class DataFlowCallable = Callable; // TODO: Use newtype + + DataFlowCallable viableCallable(DataFlowCall c) { none() } // TODO + + DataFlowCallable nodeGetEnclosingCallable(Node node) { result = node.getEnclosingCallable() } + + predicate isParameterNode(ParameterNode p, DataFlowCallable c, ParameterPosition pos) { + none() // TODO + } + + predicate isArgumentNode(ArgumentNode n, DataFlowCall call, ArgumentPosition pos) { + none() // TODO + } + + OutNode getAnOutNode(DataFlowCall call, ReturnKind kind) { none() } // TODO + + // + // Post-update nodes + // + class PostUpdateNode extends Node { + PostUpdateNode() { none() } // TODO + + Node getPreUpdateNode() { none() } // TODO + } + + // + // Types + // + class DataFlowType = Unit; // TODO: track types + + class CastNode extends Node { + CastNode() { none() } // TODO + } + + DataFlowType getNodeType(Node node) { any() } // TODO + + predicate compatibleTypes(DataFlowType t1, DataFlowType t2) { any() } // TODO + + predicate typeStrongerThan(DataFlowType t1, DataFlowType t2) { any() } // TODO + + // + // Steps + // + predicate simpleLocalFlowStep(Node node1, Node node2, string model) { none() } // TODO + + predicate jumpStep(Node node1, Node node2) { none() } // TODO + + predicate readStep(Node node1, ContentSet c, Node node2) { none() } // TODO + + predicate storeStep(Node node1, ContentSet c, Node node2) { none() } // TODO + + predicate clearsContent(Node n, ContentSet c) { none() } // TODO + + predicate expectsContent(Node n, ContentSet c) { none() } // TODO + + predicate localMustFlowStep(Node node1, Node node2) { none() } // TODO + + // + // Misc + // + predicate nodeIsHidden(Node node) { none() } // TODO + + class DataFlowExpr = Expr; + + Node exprNode(DataFlowExpr e) { none() } // TODO + + predicate forceHighPrecision(Content c) { none() } // TODO + + class NodeRegion extends Void { + NodeRegion() { none() } // TODO + + predicate contains(Node n) { none() } // TODO + + string toString() { none() } // TODO + } + + predicate isUnreachableInCall(NodeRegion nr, DataFlowCall call) { none() } // TODO + + predicate allowParameterReturnInSelf(ParameterNode p) { none() } // TODO + + class LambdaCallKind extends Void { + LambdaCallKind() { none() } // TODO + + string toString() { none() } // TODO + } + + predicate lambdaCreation(Node creation, LambdaCallKind kind, DataFlowCallable c) { none() } // TODO + + predicate lambdaCall(DataFlowCall call, LambdaCallKind kind, Node receiver) { none() } // TODO + + predicate additionalLambdaFlowStep(Node nodeFrom, Node nodeTo, boolean preservesValue) { + none() // TODO + } + + predicate knownSourceModel(Node source, string model) { none() } // TODO + + predicate knownSinkModel(Node sink, string model) { none() } // TODO + + class DataFlowSecondLevelScope extends Void { + DataFlowSecondLevelScope() { none() } // TODO + + string toString() { none() } // TODO + } +} + +module DataFlowOutput = DataFlowMake; diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll new file mode 100644 index 000000000000..294c628aed15 --- /dev/null +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll @@ -0,0 +1,29 @@ +private import unified +private import AllDataFlow + +private newtype TDataFlowNode = TValueNode(Expr expr) + +/** + * A node representing something that can have a value. + */ +class Node extends TDataFlowNode { + /** Holds if this is the result of evaluating `expr`. */ + predicate isResultValue(Expr expr) { this = TValueNode(expr) } + + /** Gets the expression represented by this node. */ + Expr asExpr() { this = TValueNode(result) } + + /** + * Gets the AST node wrapped by this data flow, if any. + */ + AstNode getWrappedAstNode() { result = this.asExpr() } + + /** Get a string representation of this element. */ + string toString() { result = this.asExpr().toString() } + + /** Gets the location of this data flow node. */ + Location getLocation() { result = this.getWrappedAstNode().getLocation() } + + /** Gets the callable containing this data flow node. */ + Callable getEnclosingCallable() { result = this.getWrappedAstNode().getEnclosingCallable() } +} diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowPublic.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowPublic.qll new file mode 100644 index 000000000000..b25ca7202505 --- /dev/null +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowPublic.qll @@ -0,0 +1,13 @@ +private import unified +private import AllDataFlow +private import AllDataFlow as D + +module DataFlow { + class Node = D::Node; + + import DataFlowOutput +} + +module TaintTracking { + import TaintTrackingOutput +} diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/Step.qll b/unified/ql/lib/codeql/unified/internal/dataflow/Step.qll new file mode 100644 index 000000000000..65d2667a464e --- /dev/null +++ b/unified/ql/lib/codeql/unified/internal/dataflow/Step.qll @@ -0,0 +1,51 @@ +private import unified +private import AllDataFlow + +private newtype TStep = + TValueStep() or + TJumpStep() or + TTaintStep() or + TReadStep(ContentSet contents) or + TStoreStep(ContentSet contents) + +/** + * A type of data flow step, used during construction of the data flow graph. + */ +class Step extends TStep { + /** Holds if this represents a value-preserving step. */ + predicate value() { this = TValueStep() } + + /** Holds if this represents a value-preserving jump step (propagating across unrelated call stacks). */ + predicate jump() { this = TJumpStep() } + + /** Holds if this represents a taint-preserving step. */ + predicate taint() { this = TTaintStep() } + + /** Holds if this represents a step reading `contents`. */ + predicate read(ContentSet contents) { this = TReadStep(contents) } + + /** Holds if this represents a step reading the named member `name`. */ + pragma[nomagic] + predicate readName(string name) { this.read(ContentSet::namedMember(name)) } + + /** Holds if this represents a step storing into `contents`. */ + predicate store(ContentSet contents) { this = TStoreStep(contents) } + + /** Holds if this represents a step storing into the named member `name`. */ + pragma[nomagic] + predicate storeName(string name) { this.store(ContentSet::namedMember(name)) } + + string toString() { + this.value() and result = "value" + or + this.jump() and result = "jump" + or + this.taint() and result = "taint" + or + exists(ContentSet contents | + this.read(contents) and result = "read[" + contents + "]" + or + this.store(contents) and result = "store[" + contents + "]" + ) + } +} diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/TaintTrackingInstantiation.qll b/unified/ql/lib/codeql/unified/internal/dataflow/TaintTrackingInstantiation.qll new file mode 100644 index 000000000000..c010e42090fe --- /dev/null +++ b/unified/ql/lib/codeql/unified/internal/dataflow/TaintTrackingInstantiation.qll @@ -0,0 +1,16 @@ +private import unified +private import AllDataFlow +private import codeql.dataflow.TaintTracking + +module TaintTrackingInput implements InputSig { + predicate defaultTaintSanitizer(Node node) { none() } // TODO + + predicate defaultAdditionalTaintStep(Node src, Node sink, string model) { none() } // TODO + + bindingset[node] + predicate defaultImplicitTaintRead(Node node, ContentSet c) { none() } // TODO + + predicate speculativeTaintStep(Node src, Node sink) { none() } // TODO +} + +module TaintTrackingOutput = TaintFlowMake; diff --git a/unified/ql/lib/qlpack.yml b/unified/ql/lib/qlpack.yml index 0167b114ba96..6761ec049d71 100644 --- a/unified/ql/lib/qlpack.yml +++ b/unified/ql/lib/qlpack.yml @@ -7,6 +7,7 @@ library: true upgrades: upgrades dependencies: codeql/controlflow: ${workspace} + codeql/dataflow: ${workspace} codeql/namebinding: ${workspace} codeql/util: ${workspace} warnOnImplicitThis: true diff --git a/unified/ql/lib/unified.qll b/unified/ql/lib/unified.qll index 500de80b64f3..9729b6445812 100644 --- a/unified/ql/lib/unified.qll +++ b/unified/ql/lib/unified.qll @@ -8,3 +8,4 @@ import codeql.unified.internal.Ast::UnifiedFinal import codeql.unified.internal.AstExtra::Public import codeql.unified.internal.ControlFlowGraph import codeql.unified.internal.NameBinding::Public +import codeql.unified.internal.dataflow.DataFlowPublic diff --git a/unified/ql/lib/utils/test/InlineFlowTest.qll b/unified/ql/lib/utils/test/InlineFlowTest.qll new file mode 100644 index 000000000000..967a2446c32c --- /dev/null +++ b/unified/ql/lib/utils/test/InlineFlowTest.qll @@ -0,0 +1,38 @@ +/** + * Inline flow tests for the unified language. + * See `shared/util/codeql/dataflow/test/InlineFlowTest.qll` + */ + +private import unified +private import codeql.dataflow.test.InlineFlowTest +private import codeql.unified.internal.dataflow.AllDataFlow +private import internal.InlineExpectationsTestImpl as InlineExpectationsTestImpl + +private string getCalleeName(CallExpr call) { result = call.getCallee().(Identifier).getValue() } + +private module FlowTestImpl implements InputSig { + predicate defaultSource(DataFlow::Node source) { getCalleeName(source.asExpr()) = "source" } + + predicate defaultSink(DataFlow::Node sink) { + any(CallExpr call | getCalleeName(call) = "sink").getAnArgument().getValue() = sink.asExpr() + } + + private string getSourceArgString(DataFlow::Node src) { + defaultSource(src) and + result = src.asExpr().(CallExpr).getArgument(0).getValue().getStringValue() + } + + bindingset[src, sink] + string getArgString(DataFlow::Node src, DataFlow::Node sink) { + ( + result = getSourceArgString(src) + or + not exists(getSourceArgString(src)) and result = "" + ) and + exists(sink) + } + + predicate interpretModelForTest(QlBuiltins::ExtensionId madId, string model) { none() } +} + +import InlineFlowTestMake diff --git a/unified/ql/test/library-tests/dataflow/test.expected b/unified/ql/test/library-tests/dataflow/test.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/unified/ql/test/library-tests/dataflow/test.ql b/unified/ql/test/library-tests/dataflow/test.ql new file mode 100644 index 000000000000..ee97b8e524e9 --- /dev/null +++ b/unified/ql/test/library-tests/dataflow/test.ql @@ -0,0 +1,3 @@ +private import unified +private import utils.test.InlineFlowTest +import DefaultFlowTest diff --git a/unified/ql/test/library-tests/dataflow/test.swift b/unified/ql/test/library-tests/dataflow/test.swift new file mode 100644 index 000000000000..9212b410b098 --- /dev/null +++ b/unified/ql/test/library-tests/dataflow/test.swift @@ -0,0 +1,8 @@ +func t1() { + sink(source("t1")); // $ hasValueFlow=t1 +} + +func t2() { + sink(source("t2.1") + "blah"); // $ MISSING: hasTaintFlow=t2.1 + sink("blah" + source("t2.2")); // $ MISSING: hasTaintFlow=t2.2 +} From a35466d82808277001de99a596f81e1358789814 Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 8 Sep 2026 10:54:24 +0200 Subject: [PATCH 0904/2098] unified: Add taint through + --- .../unified/internal/dataflow/DataFlowGraph.qll | 9 ++++++++- .../internal/dataflow/DataFlowInstantiation.qll | 14 ++++++++++---- .../dataflow/TaintTrackingInstantiation.qll | 4 +++- unified/ql/test/library-tests/dataflow/test.swift | 4 ++-- 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll index 4d5c15a4169e..6b6ada08487d 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll @@ -2,5 +2,12 @@ private import unified private import AllDataFlow predicate step(Node node1, Step step, Node node2) { - none() // TODO + exists(BinaryExpr expr | + expr.getOperator().getValue() = "+" and + node1.isResultValue([expr.getLeft(), expr.getRight()]) and + step.taint() and + node2.isResultValue(expr) + ) + or + none() // Temporarily disable compilation errors from unsatisfiable types } diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll index 452ee18fed0b..91aedb4290cb 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll @@ -110,13 +110,19 @@ module DataFlowInput implements InputSig { // // Steps // - predicate simpleLocalFlowStep(Node node1, Node node2, string model) { none() } // TODO + predicate simpleLocalFlowStep(Node node1, Node node2, string model) { + step(node1, any(Step s | s.value()), node2) and model = "" + } - predicate jumpStep(Node node1, Node node2) { none() } // TODO + predicate jumpStep(Node node1, Node node2) { step(node1, any(Step s | s.jump()), node2) } - predicate readStep(Node node1, ContentSet c, Node node2) { none() } // TODO + predicate readStep(Node node1, ContentSet c, Node node2) { + step(node1, any(Step s | s.read(c)), node2) + } - predicate storeStep(Node node1, ContentSet c, Node node2) { none() } // TODO + predicate storeStep(Node node1, ContentSet c, Node node2) { + step(node1, any(Step s | s.store(c)), node2) + } predicate clearsContent(Node n, ContentSet c) { none() } // TODO diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/TaintTrackingInstantiation.qll b/unified/ql/lib/codeql/unified/internal/dataflow/TaintTrackingInstantiation.qll index c010e42090fe..ad911bc72224 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/TaintTrackingInstantiation.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/TaintTrackingInstantiation.qll @@ -5,7 +5,9 @@ private import codeql.dataflow.TaintTracking module TaintTrackingInput implements InputSig { predicate defaultTaintSanitizer(Node node) { none() } // TODO - predicate defaultAdditionalTaintStep(Node src, Node sink, string model) { none() } // TODO + predicate defaultAdditionalTaintStep(Node src, Node sink, string model) { + step(src, any(Step s | s.taint()), sink) and model = "" + } bindingset[node] predicate defaultImplicitTaintRead(Node node, ContentSet c) { none() } // TODO diff --git a/unified/ql/test/library-tests/dataflow/test.swift b/unified/ql/test/library-tests/dataflow/test.swift index 9212b410b098..b807a03dcdf2 100644 --- a/unified/ql/test/library-tests/dataflow/test.swift +++ b/unified/ql/test/library-tests/dataflow/test.swift @@ -3,6 +3,6 @@ func t1() { } func t2() { - sink(source("t2.1") + "blah"); // $ MISSING: hasTaintFlow=t2.1 - sink("blah" + source("t2.2")); // $ MISSING: hasTaintFlow=t2.2 + sink(source("t2.1") + "blah"); // $ hasTaintFlow=t2.1 + sink("blah" + source("t2.2")); // $ hasTaintFlow=t2.2 } From 75d215d6adf5af3eff3aa8287d30dbd2095fe6eb Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 8 Sep 2026 11:34:56 +0200 Subject: [PATCH 0905/2098] unified: Add basic test with tuples --- unified/ql/test/library-tests/dataflow/test.swift | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/unified/ql/test/library-tests/dataflow/test.swift b/unified/ql/test/library-tests/dataflow/test.swift index b807a03dcdf2..f59def9bfe10 100644 --- a/unified/ql/test/library-tests/dataflow/test.swift +++ b/unified/ql/test/library-tests/dataflow/test.swift @@ -6,3 +6,10 @@ func t2() { sink(source("t2.1") + "blah"); // $ hasTaintFlow=t2.1 sink("blah" + source("t2.2")); // $ hasTaintFlow=t2.2 } + +func t3() { + sink((source("t3.1"), "safe").0); // $ MISSING: hasValueFlow=t3.1 + sink((source("t3.2"), "safe").1); // no flow + sink(("safe", source("t3.3")).0); // no flow + sink(("safe", source("t3.4")).1); // $ MISSING: hasValueFlow=t3.4 +} From a1bca719206748b0d34c4946c907cc43a69eaa02 Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 8 Sep 2026 11:36:09 +0200 Subject: [PATCH 0906/2098] unified: Add steps for member access and tuples --- .../lib/codeql/unified/internal/dataflow/Content.qll | 9 ++++++++- .../unified/internal/dataflow/DataFlowGraph.qll | 12 ++++++++++++ unified/ql/test/library-tests/dataflow/test.swift | 4 ++-- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/Content.qll b/unified/ql/lib/codeql/unified/internal/dataflow/Content.qll index ccaf1100c36d..73a3d7da2c9d 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/Content.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/Content.qll @@ -1,7 +1,14 @@ private import unified private import AllDataFlow -private newtype TContent = TNamedMember(string name) { name = any(Identifier id).getValue() } +private newtype TContent = + TNamedMember(string name) { + name = any(Identifier id).getValue() + or + // Tuple elements can be accessed as named members, e.g. `tuple.0`, `tuple.1`, etc, + // so just model their elements as named members. + name = [0 .. 20].toString() + } class Content extends TContent { string asNamedMember() { this = TNamedMember(result) } diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll index 6b6ada08487d..1f55b2c5c92a 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll @@ -9,5 +9,17 @@ predicate step(Node node1, Step step, Node node2) { node2.isResultValue(expr) ) or + exists(TupleExpr expr, int i | + node1.isResultValue(expr.getElement(i).getValue()) and + step.storeName(i.toString()) and + node2.isResultValue(expr) + ) + or + exists(MemberAccessExpr expr | + node1.isResultValue(expr.getBase()) and + step.readName(expr.getMemberName()) and + node2.isResultValue(expr) + ) + or none() // Temporarily disable compilation errors from unsatisfiable types } diff --git a/unified/ql/test/library-tests/dataflow/test.swift b/unified/ql/test/library-tests/dataflow/test.swift index f59def9bfe10..bfa4df953df1 100644 --- a/unified/ql/test/library-tests/dataflow/test.swift +++ b/unified/ql/test/library-tests/dataflow/test.swift @@ -8,8 +8,8 @@ func t2() { } func t3() { - sink((source("t3.1"), "safe").0); // $ MISSING: hasValueFlow=t3.1 + sink((source("t3.1"), "safe").0); // $ hasValueFlow=t3.1 sink((source("t3.2"), "safe").1); // no flow sink(("safe", source("t3.3")).0); // no flow - sink(("safe", source("t3.4")).1); // $ MISSING: hasValueFlow=t3.4 + sink(("safe", source("t3.4")).1); // $ hasValueFlow=t3.4 } From eadbcd10a76cf599e90adc34d874d8d14f660231 Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 8 Sep 2026 11:51:12 +0200 Subject: [PATCH 0907/2098] unified: Add query for viewing data flow graph --- .../internal/dataflow/DataFlowGraph.qll | 23 +++++++++++++++++++ .../internal/dev/debugDataFlowGraph.ql | 19 +++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 unified/ql/lib/codeql/unified/internal/dev/debugDataFlowGraph.ql diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll index 1f55b2c5c92a..0151daaffcf4 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll @@ -23,3 +23,26 @@ predicate step(Node node1, Step step, Node node2) { or none() // Temporarily disable compilation errors from unsatisfiable types } + +/** Holds if `node` should be included in the debug view. */ +private signature predicate relevantNodeSig(AstNode node); + +module DebugGraph { + private predicate relevantNameBindingNode(Node node) { relevantNode(node.getWrappedAstNode()) } + + query predicate nodes(Node node, string key, string value) { + relevantNameBindingNode(node) and + key = "semmle.label" and + value = node.toString() + } + + query predicate edges(Node node1, Node node2, string key, string value) { + key = "semmle.label" and + relevantNameBindingNode(node1) and + relevantNameBindingNode(node2) and + exists(Step step | + step(node1, step, node2) and + value = step.toString() + ) + } +} diff --git a/unified/ql/lib/codeql/unified/internal/dev/debugDataFlowGraph.ql b/unified/ql/lib/codeql/unified/internal/dev/debugDataFlowGraph.ql new file mode 100644 index 000000000000..7f79b0d151e7 --- /dev/null +++ b/unified/ql/lib/codeql/unified/internal/dev/debugDataFlowGraph.ql @@ -0,0 +1,19 @@ +/** + * @name Debug data flow graph + * @description Renders the data flow graph + * @kind graph + * @id unified/debug-data-flow-graph + */ + +private import unified +private import codeql.unified.internal.dataflow.DataFlowGraph + +/** + * Holds if `node` should be shown in the graph. + */ +predicate relevantNode(AstNode node) { + // Match an ancestor node by location so its whole subtree is shown. + node.getParent*().getLocation().toString().matches("%test.swift@13:%") +} + +import DebugGraph From e8ee1318c7b5711eac3c8f786d54e30573c0ec39 Mon Sep 17 00:00:00 2001 From: Asger F Date: Sat, 12 Sep 2026 07:25:12 +0200 Subject: [PATCH 0908/2098] unified: Add incoming-value nodes --- .../internal/dataflow/DataFlowGraph.qll | 16 ++++++++++ .../internal/dataflow/DataFlowNode.qll | 30 ++++++++++++++++--- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll index 0151daaffcf4..2896dfcdb805 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll @@ -2,6 +2,18 @@ private import unified private import AllDataFlow predicate step(Node node1, Step step, Node node2) { + exists(VariableDeclaration decl | + node1.isResultValue(decl.getValue()) and + step.value() and + node2.isIncomingValue(decl.getPattern()) + ) + or + exists(AssignExpr assign | + node1.isResultValue(assign.getValue()) and + step.value() and + node2.isIncomingValue(assign.getTarget()) + ) + or exists(BinaryExpr expr | expr.getOperator().getValue() = "+" and node1.isResultValue([expr.getLeft(), expr.getRight()]) and @@ -13,6 +25,10 @@ predicate step(Node node1, Step step, Node node2) { node1.isResultValue(expr.getElement(i).getValue()) and step.storeName(i.toString()) and node2.isResultValue(expr) + or + node1.isIncomingValue(expr) and + step.readName(i.toString()) and + node2.isIncomingValue(expr.getElement(i).getValue()) ) or exists(MemberAccessExpr expr | diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll index 294c628aed15..62debf2b1f35 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll @@ -1,14 +1,29 @@ private import unified private import AllDataFlow +private import codeql.unified.internal.ExprPositions -private newtype TDataFlowNode = TValueNode(Expr expr) +private newtype TDataFlowNode = + TValueNode(Expr expr) { hasResultValue(expr) or hasIncomingValue(expr, _) } or + TStrictlyIncomingValue(Expr expr) { hasResultValue(expr) and hasIncomingValue(expr, _) } /** * A node representing something that can have a value. */ class Node extends TDataFlowNode { /** Holds if this is the result of evaluating `expr`. */ - predicate isResultValue(Expr expr) { this = TValueNode(expr) } + pragma[nomagic] + predicate isResultValue(Expr expr) { hasResultValue(expr) and this = TValueNode(expr) } + + /** Holds if this represents the value about to be assigned to `expr` or pattern-matched against `expr`. */ + pragma[nomagic] + predicate isIncomingValue(Expr expr) { + // Use the TValueNode when it is not needed for representing the result value + hasIncomingValue(expr, _) and + not hasResultValue(expr) and + this = TValueNode(expr) + or + this = TStrictlyIncomingValue(expr) + } /** Gets the expression represented by this node. */ Expr asExpr() { this = TValueNode(result) } @@ -16,10 +31,17 @@ class Node extends TDataFlowNode { /** * Gets the AST node wrapped by this data flow, if any. */ - AstNode getWrappedAstNode() { result = this.asExpr() } + AstNode getWrappedAstNode() { result = this.asExpr() or this = TStrictlyIncomingValue(result) } /** Get a string representation of this element. */ - string toString() { result = this.asExpr().toString() } + string toString() { + result = this.asExpr().toString() + or + exists(Expr expr | + this = TStrictlyIncomingValue(expr) and + result = "[incoming] " + expr.toString() + ) + } /** Gets the location of this data flow node. */ Location getLocation() { result = this.getWrappedAstNode().getLocation() } From a87414cf5a59e74ce46b1d597bd81f813415706d Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 9 Sep 2026 22:06:04 +0200 Subject: [PATCH 0909/2098] unified: CFG-insensitive variable flow --- .../internal/dataflow/DataFlowGraph.qll | 10 +++++++ .../internal/dataflow/DataFlowNode.qll | 26 ++++++++++++++++--- .../ql/test/library-tests/dataflow/test.swift | 22 ++++++++++++++++ 3 files changed, 55 insertions(+), 3 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll index 2896dfcdb805..d8a4a8bdb5ba 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll @@ -14,6 +14,16 @@ predicate step(Node node1, Step step, Node node2) { node2.isIncomingValue(assign.getTarget()) ) or + exists(LocalVariableAccess access | + node1.isLocalVariable(access.getLocalVariable()) and + step.value() and + node2.isResultValue(access) + or + node1.isIncomingValue(access) and + step.value() and + node2.isLocalVariable(access.getLocalVariable()) + ) + or exists(BinaryExpr expr | expr.getOperator().getValue() = "+" and node1.isResultValue([expr.getLeft(), expr.getRight()]) and diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll index 62debf2b1f35..9b746152461f 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll @@ -4,7 +4,8 @@ private import codeql.unified.internal.ExprPositions private newtype TDataFlowNode = TValueNode(Expr expr) { hasResultValue(expr) or hasIncomingValue(expr, _) } or - TStrictlyIncomingValue(Expr expr) { hasResultValue(expr) and hasIncomingValue(expr, _) } + TStrictlyIncomingValue(Expr expr) { hasResultValue(expr) and hasIncomingValue(expr, _) } or + TLocalVariableNode(LocalVariable v) /** * A node representing something that can have a value. @@ -25,6 +26,9 @@ class Node extends TDataFlowNode { this = TStrictlyIncomingValue(expr) } + /** Holds if this represents the value stored in the given local variable. */ + predicate isLocalVariable(LocalVariable v) { this = TLocalVariableNode(v) } + /** Gets the expression represented by this node. */ Expr asExpr() { this = TValueNode(result) } @@ -41,11 +45,27 @@ class Node extends TDataFlowNode { this = TStrictlyIncomingValue(expr) and result = "[incoming] " + expr.toString() ) + or + exists(LocalVariable v | + this.isLocalVariable(v) and + result = "[variable] " + v.toString() + ) } /** Gets the location of this data flow node. */ - Location getLocation() { result = this.getWrappedAstNode().getLocation() } + Location getLocation() { + result = this.getWrappedAstNode().getLocation() + or + exists(LocalVariable v | this.isLocalVariable(v) and result = v.getLocation()) + } /** Gets the callable containing this data flow node. */ - Callable getEnclosingCallable() { result = this.getWrappedAstNode().getEnclosingCallable() } + Callable getEnclosingCallable() { + result = this.getWrappedAstNode().getEnclosingCallable() + or + exists(LocalVariable v | + this.isLocalVariable(v) and + result = v.getABinding().getEnclosingCallable() + ) + } } diff --git a/unified/ql/test/library-tests/dataflow/test.swift b/unified/ql/test/library-tests/dataflow/test.swift index bfa4df953df1..d2b5ea1fd742 100644 --- a/unified/ql/test/library-tests/dataflow/test.swift +++ b/unified/ql/test/library-tests/dataflow/test.swift @@ -13,3 +13,25 @@ func t3() { sink(("safe", source("t3.3")).0); // no flow sink(("safe", source("t3.4")).1); // $ hasValueFlow=t3.4 } + +func t4() { + let a = source("t4.1"); + sink(a); // $ hasValueFlow=t4.1 +} + +func t5() { + let (a, b) = (source("t5.1"), "safe"); + sink(a); // $ hasValueFlow=t5.1 + sink(b); // no flow + + let (c, d) = ("safe", source("t5.2")); + sink(c); // no flow + sink(d); // $ hasValueFlow=t5.2 +} + +func t6() { + var a = source("t6.1"); + sink(a); // $ hasValueFlow=t6.1 + a = "safe"; + sink(a); // $ SPURIOUS: hasValueFlow=t6.1 +} From dfd1a508ed1785d099338e0311061e0a0aba4e73 Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 9 Sep 2026 22:21:30 +0200 Subject: [PATCH 0910/2098] unified: Add post-update nodes --- .../internal/dataflow/DataFlowGraph.qll | 8 ++++++ .../dataflow/DataFlowInstantiation.qll | 4 +-- .../internal/dataflow/DataFlowNode.qll | 27 ++++++++++++++++++- .../ql/test/library-tests/dataflow/test.swift | 25 +++++++++++++++++ 4 files changed, 61 insertions(+), 3 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll index d8a4a8bdb5ba..2463bf6af48b 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll @@ -22,6 +22,10 @@ predicate step(Node node1, Step step, Node node2) { node1.isIncomingValue(access) and step.value() and node2.isLocalVariable(access.getLocalVariable()) + or + node1.isPostUpdate(access) and + step.value() and + node2.isLocalVariable(access.getLocalVariable()) ) or exists(BinaryExpr expr | @@ -45,6 +49,10 @@ predicate step(Node node1, Step step, Node node2) { node1.isResultValue(expr.getBase()) and step.readName(expr.getMemberName()) and node2.isResultValue(expr) + or + (node1.isIncomingValue(expr) or node1.isPostUpdate(expr)) and + step.storeName(expr.getMemberName()) and + node2.isPostUpdate(expr.getBase()) ) or none() // Temporarily disable compilation errors from unsatisfiable types diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll index 91aedb4290cb..18c5424d24b5 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll @@ -87,9 +87,9 @@ module DataFlowInput implements InputSig { // Post-update nodes // class PostUpdateNode extends Node { - PostUpdateNode() { none() } // TODO + PostUpdateNode() { this = getPostUpdateNode(_) } - Node getPreUpdateNode() { none() } // TODO + Node getPreUpdateNode() { this = getPostUpdateNode(result) } } // diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll index 9b746152461f..6b1328b23f85 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll @@ -2,9 +2,17 @@ private import unified private import AllDataFlow private import codeql.unified.internal.ExprPositions +private predicate hasPostUpdate(Expr expr) { + exists(MemberAccessExpr member | + (hasIncomingValue(member, _) or hasPostUpdate(member)) and + expr = member.getBase() + ) +} + private newtype TDataFlowNode = TValueNode(Expr expr) { hasResultValue(expr) or hasIncomingValue(expr, _) } or TStrictlyIncomingValue(Expr expr) { hasResultValue(expr) and hasIncomingValue(expr, _) } or + TPostUpdateNode(Expr expr) { hasPostUpdate(expr) } or TLocalVariableNode(LocalVariable v) /** @@ -29,13 +37,20 @@ class Node extends TDataFlowNode { /** Holds if this represents the value stored in the given local variable. */ predicate isLocalVariable(LocalVariable v) { this = TLocalVariableNode(v) } + /** Holds if this represents the updated state of the value returned by `expr` after it has been mutated by the surrounding assignment or call. */ + predicate isPostUpdate(Expr expr) { this = TPostUpdateNode(expr) } + /** Gets the expression represented by this node. */ Expr asExpr() { this = TValueNode(result) } /** * Gets the AST node wrapped by this data flow, if any. */ - AstNode getWrappedAstNode() { result = this.asExpr() or this = TStrictlyIncomingValue(result) } + AstNode getWrappedAstNode() { + result = this.asExpr() or + this = TStrictlyIncomingValue(result) or + this = TPostUpdateNode(result) + } /** Get a string representation of this element. */ string toString() { @@ -44,6 +59,9 @@ class Node extends TDataFlowNode { exists(Expr expr | this = TStrictlyIncomingValue(expr) and result = "[incoming] " + expr.toString() + or + this = TPostUpdateNode(expr) and + result = "[post] " + expr.toString() ) or exists(LocalVariable v | @@ -69,3 +87,10 @@ class Node extends TDataFlowNode { ) } } + +Node getPostUpdateNode(Node pre) { + exists(Expr expr | + pre.isResultValue(expr) and + result.isPostUpdate(expr) + ) +} diff --git a/unified/ql/test/library-tests/dataflow/test.swift b/unified/ql/test/library-tests/dataflow/test.swift index d2b5ea1fd742..d5f0ac64f8f1 100644 --- a/unified/ql/test/library-tests/dataflow/test.swift +++ b/unified/ql/test/library-tests/dataflow/test.swift @@ -35,3 +35,28 @@ func t6() { a = "safe"; sink(a); // $ SPURIOUS: hasValueFlow=t6.1 } + +func t7() { + var tuple = ("safe", "safe") + tuple.0 = source("t7.1"); + sink(tuple.0); // $ hasValueFlow=t7.1 + sink(tuple.1); // no flow +} + +func t8() { + var deep_tuple = (("safe", "safe"), ("safe", "safe")) + deep_tuple.1.0 = source("t8.1"); + sink(deep_tuple); // no flow + sink(deep_tuple.0); // no flow + sink(deep_tuple.1); // no flow + sink(deep_tuple.0.1); // no flow + sink(deep_tuple.1.0); // $ hasValueFlow=t8.1 + sink(deep_tuple.1.1); // no flow +} + +func t9() { + var tuple = ("safe", "safe") + (tuple.1, _) = (source("t9.1"), source("t9.2")); + sink(tuple.0); // no flow + sink(tuple.1); // $ hasValueFlow=t9.1 +} From 707238e0f860f92e9a5da1d7a00101d9a4d8f62a Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 9 Sep 2026 23:41:20 +0200 Subject: [PATCH 0911/2098] unified: Add variable-ref nodes --- .../unified/internal/dataflow/AllDataFlow.qll | 1 + .../internal/dataflow/DataFlowGraph.qll | 17 +++++- .../internal/dataflow/DataFlowNode.qll | 60 ++++++++++++------- .../internal/dataflow/VariableRefKind.qll | 22 +++++++ 4 files changed, 77 insertions(+), 23 deletions(-) create mode 100644 unified/ql/lib/codeql/unified/internal/dataflow/VariableRefKind.qll diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/AllDataFlow.qll b/unified/ql/lib/codeql/unified/internal/dataflow/AllDataFlow.qll index dda7b2e472e0..956164fae378 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/AllDataFlow.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/AllDataFlow.qll @@ -6,3 +6,4 @@ import DataFlowInstantiation import DataFlowNode import Step import TaintTrackingInstantiation +import VariableRefKind diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll index 2463bf6af48b..81293243c88d 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll @@ -15,17 +15,28 @@ predicate step(Node node1, Step step, Node node2) { ) or exists(LocalVariableAccess access | - node1.isLocalVariable(access.getLocalVariable()) and + node1.isLocalVariableRead(access, access.getLocalVariable()) and step.value() and node2.isResultValue(access) or node1.isIncomingValue(access) and step.value() and - node2.isLocalVariable(access.getLocalVariable()) + node2.isLocalVariableWrite(access, access.getLocalVariable()) or node1.isPostUpdate(access) and step.value() and - node2.isLocalVariable(access.getLocalVariable()) + node2.isLocalVariablePostUpdate(access, access.getLocalVariable()) + ) + or + // dummy implementation: make all writes and post-updates flow to all reads + step.value() and + exists(LocalVariable v | + ( + node1.isLocalVariableWrite(_, v) + or + node1.isLocalVariablePostUpdate(_, v) + ) and + node2.isLocalVariableRead(_, v) ) or exists(BinaryExpr expr | diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll index 6b1328b23f85..baafd8a8c724 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll @@ -9,11 +9,29 @@ private predicate hasPostUpdate(Expr expr) { ) } +/** + * Holds if `expr` performs an access to `var` of the given `kind` at `cfgNode`. + */ +predicate performsVariableAccess( + Expr expr, LocalVariable var, VariableRefKind kind, ControlFlowNode cfgNode +) { + // TODO: add UnqualifiedMemberAccess here + exists(LocalVariableAccess access | var = access.getLocalVariable() and expr = access | + hasResultValue(access) and kind.isRead() and cfgNode.isAfter(expr) + or + hasIncomingValue(access, _) and kind.isWrite() and cfgNode.asExpr() = expr // TODO: use more precise CFG node + or + hasPostUpdate(access) and kind.isPostUpdate() and cfgNode.asExpr() = expr // TODO: use more precise CFG node + ) +} + private newtype TDataFlowNode = TValueNode(Expr expr) { hasResultValue(expr) or hasIncomingValue(expr, _) } or TStrictlyIncomingValue(Expr expr) { hasResultValue(expr) and hasIncomingValue(expr, _) } or TPostUpdateNode(Expr expr) { hasPostUpdate(expr) } or - TLocalVariableNode(LocalVariable v) + TLocalVariableRefNode(Expr expr, LocalVariable var, VariableRefKind kind) { + performsVariableAccess(expr, var, kind, _) + } /** * A node representing something that can have a value. @@ -34,8 +52,20 @@ class Node extends TDataFlowNode { this = TStrictlyIncomingValue(expr) } - /** Holds if this represents the value stored in the given local variable. */ - predicate isLocalVariable(LocalVariable v) { this = TLocalVariableNode(v) } + /** Holds if this represents the value read from `v` at `access`. */ + predicate isLocalVariableRead(Expr access, LocalVariable v) { + this = TLocalVariableRefNode(access, v, any(VariableRefKind k | k.isRead())) + } + + /** Holds if this represents the value written to `v` at `access`. */ + predicate isLocalVariableWrite(Expr access, LocalVariable v) { + this = TLocalVariableRefNode(access, v, any(VariableRefKind k | k.isWrite())) + } + + /** Holds if this represents the updated state of the value held in `v` after it has been mutated by the surrounding assignment or call. */ + predicate isLocalVariablePostUpdate(Expr access, LocalVariable v) { + this = TLocalVariableRefNode(access, v, any(VariableRefKind k | k.isPostUpdate())) + } /** Holds if this represents the updated state of the value returned by `expr` after it has been mutated by the surrounding assignment or call. */ predicate isPostUpdate(Expr expr) { this = TPostUpdateNode(expr) } @@ -49,7 +79,8 @@ class Node extends TDataFlowNode { AstNode getWrappedAstNode() { result = this.asExpr() or this = TStrictlyIncomingValue(result) or - this = TPostUpdateNode(result) + this = TPostUpdateNode(result) or + this = TLocalVariableRefNode(result, _, _) } /** Get a string representation of this element. */ @@ -64,28 +95,17 @@ class Node extends TDataFlowNode { result = "[post] " + expr.toString() ) or - exists(LocalVariable v | - this.isLocalVariable(v) and - result = "[variable] " + v.toString() + exists(LocalVariable v, VariableRefKind kind | + this = TLocalVariableRefNode(_, v, kind) and + result = "[variable " + kind + "] " + v.toString() ) } /** Gets the location of this data flow node. */ - Location getLocation() { - result = this.getWrappedAstNode().getLocation() - or - exists(LocalVariable v | this.isLocalVariable(v) and result = v.getLocation()) - } + Location getLocation() { result = this.getWrappedAstNode().getLocation() } /** Gets the callable containing this data flow node. */ - Callable getEnclosingCallable() { - result = this.getWrappedAstNode().getEnclosingCallable() - or - exists(LocalVariable v | - this.isLocalVariable(v) and - result = v.getABinding().getEnclosingCallable() - ) - } + Callable getEnclosingCallable() { result = this.getWrappedAstNode().getEnclosingCallable() } } Node getPostUpdateNode(Node pre) { diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/VariableRefKind.qll b/unified/ql/lib/codeql/unified/internal/dataflow/VariableRefKind.qll new file mode 100644 index 000000000000..326b517c5f52 --- /dev/null +++ b/unified/ql/lib/codeql/unified/internal/dataflow/VariableRefKind.qll @@ -0,0 +1,22 @@ +private import unified + +private newtype TVariableRefKind = + TRead() or + TWrite() or + TPostUpdate() + +class VariableRefKind extends TVariableRefKind { + predicate isRead() { this = TRead() } + + predicate isWrite() { this = TWrite() } + + predicate isPostUpdate() { this = TPostUpdate() } + + string toString() { + this.isRead() and result = "read" + or + this.isWrite() and result = "write" + or + this.isPostUpdate() and result = "post-update" + } +} From b5c2ff658edb36b8313cbd3abed44ea50991c126 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 10 Sep 2026 01:01:03 +0200 Subject: [PATCH 0912/2098] unified: Update debug graph --- .../internal/dataflow/DataFlowGraph.qll | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll index 81293243c88d..e48d724f93d4 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll @@ -73,21 +73,37 @@ predicate step(Node node1, Step step, Node node2) { private signature predicate relevantNodeSig(AstNode node); module DebugGraph { - private predicate relevantNameBindingNode(Node node) { relevantNode(node.getWrappedAstNode()) } + private Node adjacent(Node n) { + step(n, _, result) + or + step(result, _, n) + } + + private predicate relevantDataFlowNode(Node node) { + relevantNode(node.getWrappedAstNode()) + or + not exists(node.getWrappedAstNode()) and + relevantDataFlowNode(adjacent(node)) + } query predicate nodes(Node node, string key, string value) { - relevantNameBindingNode(node) and + relevantDataFlowNode(node) and key = "semmle.label" and value = node.toString() } query predicate edges(Node node1, Node node2, string key, string value) { key = "semmle.label" and - relevantNameBindingNode(node1) and - relevantNameBindingNode(node2) and - exists(Step step | - step(node1, step, node2) and - value = step.toString() + relevantDataFlowNode(node1) and + relevantDataFlowNode(node2) and + ( + exists(Step step | + step(node1, step, node2) and + value = step.toString() + ) + or + node2 = getPostUpdateNode(node1) and + value = "post-update" ) } } From d0e5d1b5b899845ec8e77a036f78494038762446 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 10 Sep 2026 08:47:35 +0200 Subject: [PATCH 0913/2098] unified: Add LocalSsa --- .../unified/internal/dataflow/AllDataFlow.qll | 1 + .../internal/dataflow/DataFlowGraph.qll | 11 --- .../dataflow/DataFlowInstantiation.qll | 4 +- .../internal/dataflow/DataFlowNode.qll | 44 ++++++++-- .../unified/internal/dataflow/LocalSsa.qll | 85 +++++++++++++++++++ .../internal/dataflow/VariableRefKind.qll | 2 +- unified/ql/lib/qlpack.yml | 1 + .../ql/test/library-tests/dataflow/test.swift | 62 +++++++++++++- 8 files changed, 189 insertions(+), 21 deletions(-) create mode 100644 unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/AllDataFlow.qll b/unified/ql/lib/codeql/unified/internal/dataflow/AllDataFlow.qll index 956164fae378..53b53956cb23 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/AllDataFlow.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/AllDataFlow.qll @@ -5,5 +5,6 @@ import DataFlowGraph import DataFlowInstantiation import DataFlowNode import Step +import LocalSsa import TaintTrackingInstantiation import VariableRefKind diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll index e48d724f93d4..dee49e4ba696 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll @@ -28,17 +28,6 @@ predicate step(Node node1, Step step, Node node2) { node2.isLocalVariablePostUpdate(access, access.getLocalVariable()) ) or - // dummy implementation: make all writes and post-updates flow to all reads - step.value() and - exists(LocalVariable v | - ( - node1.isLocalVariableWrite(_, v) - or - node1.isLocalVariablePostUpdate(_, v) - ) and - node2.isLocalVariableRead(_, v) - ) - or exists(BinaryExpr expr | expr.getOperator().getValue() = "+" and node1.isResultValue([expr.getLeft(), expr.getRight()]) and diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll index 18c5424d24b5..a51ab0cd25f9 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll @@ -112,6 +112,8 @@ module DataFlowInput implements InputSig { // predicate simpleLocalFlowStep(Node node1, Node node2, string model) { step(node1, any(Step s | s.value()), node2) and model = "" + or + localSsaStep(node1, node2, _) and model = "" } predicate jumpStep(Node node1, Node node2) { step(node1, any(Step s | s.jump()), node2) } @@ -128,7 +130,7 @@ module DataFlowInput implements InputSig { predicate expectsContent(Node n, ContentSet c) { none() } // TODO - predicate localMustFlowStep(Node node1, Node node2) { none() } // TODO + predicate localMustFlowStep(Node node1, Node node2) { localSsaMustFlowStep(node1, node2) } // TODO // // Misc diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll index baafd8a8c724..afe603912a25 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll @@ -25,13 +25,14 @@ predicate performsVariableAccess( ) } -private newtype TDataFlowNode = +newtype TDataFlowNode = TValueNode(Expr expr) { hasResultValue(expr) or hasIncomingValue(expr, _) } or TStrictlyIncomingValue(Expr expr) { hasResultValue(expr) and hasIncomingValue(expr, _) } or TPostUpdateNode(Expr expr) { hasPostUpdate(expr) } or TLocalVariableRefNode(Expr expr, LocalVariable var, VariableRefKind kind) { performsVariableAccess(expr, var, kind, _) - } + } or + TLocalSsaNode(LocalSsaDataFlowOutput::SsaNode node) /** * A node representing something that can have a value. @@ -52,19 +53,24 @@ class Node extends TDataFlowNode { this = TStrictlyIncomingValue(expr) } + /** Holds if this represents the reference to `v` at `access`. */ + predicate isLocalVariableRef(Expr access, LocalVariable v, VariableRefKind kind) { + this = TLocalVariableRefNode(access, v, kind) + } + /** Holds if this represents the value read from `v` at `access`. */ predicate isLocalVariableRead(Expr access, LocalVariable v) { - this = TLocalVariableRefNode(access, v, any(VariableRefKind k | k.isRead())) + this.isLocalVariableRef(access, v, TRead()) } /** Holds if this represents the value written to `v` at `access`. */ predicate isLocalVariableWrite(Expr access, LocalVariable v) { - this = TLocalVariableRefNode(access, v, any(VariableRefKind k | k.isWrite())) + this.isLocalVariableRef(access, v, TWrite()) } /** Holds if this represents the updated state of the value held in `v` after it has been mutated by the surrounding assignment or call. */ predicate isLocalVariablePostUpdate(Expr access, LocalVariable v) { - this = TLocalVariableRefNode(access, v, any(VariableRefKind k | k.isPostUpdate())) + this.isLocalVariableRef(access, v, TPostUpdate()) } /** Holds if this represents the updated state of the value returned by `expr` after it has been mutated by the surrounding assignment or call. */ @@ -99,13 +105,32 @@ class Node extends TDataFlowNode { this = TLocalVariableRefNode(_, v, kind) and result = "[variable " + kind + "] " + v.toString() ) + or + exists(LocalSsaDataFlowOutput::SsaNode node | + this = TLocalSsaNode(node) and + result = node.toString() + ) } /** Gets the location of this data flow node. */ - Location getLocation() { result = this.getWrappedAstNode().getLocation() } + Location getLocation() { + result = this.getWrappedAstNode().getLocation() + or + exists(LocalSsaDataFlowOutput::SsaNode node | + this = TLocalSsaNode(node) and + result = node.getLocation() + ) + } /** Gets the callable containing this data flow node. */ - Callable getEnclosingCallable() { result = this.getWrappedAstNode().getEnclosingCallable() } + Callable getEnclosingCallable() { + result = this.getWrappedAstNode().getEnclosingCallable() + or + exists(LocalSsaDataFlowOutput::SsaNode node | + this = TLocalSsaNode(node) and + result = node.getSourceVariable().getDeclaringCallable() + ) + } } Node getPostUpdateNode(Node pre) { @@ -113,4 +138,9 @@ Node getPostUpdateNode(Node pre) { pre.isResultValue(expr) and result.isPostUpdate(expr) ) + or + exists(Expr expr, LocalVariable var | + pre.isLocalVariableRead(expr, var) and + result.isLocalVariablePostUpdate(expr, var) + ) } diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll b/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll new file mode 100644 index 000000000000..d705be61550d --- /dev/null +++ b/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll @@ -0,0 +1,85 @@ +private import unified +private import unified as U +private import AllDataFlow +private import codeql.ssa.Ssa +private import codeql.util.Void + +module LocalSsaInput implements InputSig { + class SourceVariable extends LocalVariable { + SourceVariable() { not this.isCaptured() } + } + + predicate variableWrite(BasicBlock bb, int i, SourceVariable v, boolean certain) { + certain = true and + performsVariableAccess(_, v, TWrite(), bb.getNode(i)) + } + + predicate variableRead(BasicBlock bb, int i, SourceVariable v, boolean certain) { + certain = true and + performsVariableAccess(_, v, TRead(), bb.getNode(i)) + } +} + +module LocalSsaOutput = Make; + +private import LocalSsaOutput + +module LocalSsaDataFlowInput implements DataFlowIntegrationInputSig { + class Expr extends TLocalVariableRefNode { + predicate hasCfgNode(BasicBlock bb, int i) { + exists(U::Expr expr, LocalVariable var, VariableRefKind kind | + this = TLocalVariableRefNode(expr, var, kind) and + kind.isRead() and + performsVariableAccess(expr, var, kind, bb.getNode(i)) + ) + } + + string toString() { result = this.(Node).toString() } + } + + class GuardValue = Void; + + class Guard extends Void { + string toString() { none() } + + predicate hasValueBranchEdge(BasicBlock bb1, BasicBlock bb2, GuardValue val) { none() } + + predicate valueControlsBranchEdge(BasicBlock bb1, BasicBlock bb2, GuardValue val) { none() } + } + + predicate guardDirectlyControlsBlock(Guard guard, BasicBlock bb, GuardValue val) { none() } +} + +module LocalSsaDataFlowOutput = DataFlowIntegration; + +private module Ssa = LocalSsaDataFlowOutput; + +Node getNodeFromLocalSsaNode(Ssa::Node n) { + result = TLocalSsaNode(n) + or + result = n.(Ssa::ExprNode).getExpr() + or + result = getPostUpdateNode(n.(Ssa::ExprPostUpdateNode).getExpr()) + or + exists(LocalVariable v, BasicBlock bb, int i, Expr expr | + n.(Ssa::WriteDefSourceNode).getDefinition().definesAt(v, bb, i) and + performsVariableAccess(expr, v, TWrite(), bb.getNode(i)) and + result.isLocalVariableWrite(expr, v) + ) +} + +predicate localSsaStep(Node node1, Node node2, boolean isUseStep) { + exists(Ssa::Node ssa1, Ssa::Node ssa2 | + Ssa::localFlowStep(_, ssa1, ssa2, isUseStep) and + node1 = getNodeFromLocalSsaNode(ssa1) and + node2 = getNodeFromLocalSsaNode(ssa2) + ) +} + +predicate localSsaMustFlowStep(Node node1, Node node2) { + exists(Ssa::Node ssa1, Ssa::Node ssa2 | + Ssa::localMustFlowStep(_, ssa1, ssa2) and + node1 = getNodeFromLocalSsaNode(ssa1) and + node2 = getNodeFromLocalSsaNode(ssa2) + ) +} diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/VariableRefKind.qll b/unified/ql/lib/codeql/unified/internal/dataflow/VariableRefKind.qll index 326b517c5f52..1ae34f665704 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/VariableRefKind.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/VariableRefKind.qll @@ -1,6 +1,6 @@ private import unified -private newtype TVariableRefKind = +newtype TVariableRefKind = TRead() or TWrite() or TPostUpdate() diff --git a/unified/ql/lib/qlpack.yml b/unified/ql/lib/qlpack.yml index 6761ec049d71..2416cff78e94 100644 --- a/unified/ql/lib/qlpack.yml +++ b/unified/ql/lib/qlpack.yml @@ -7,6 +7,7 @@ library: true upgrades: upgrades dependencies: codeql/controlflow: ${workspace} + codeql/ssa: ${workspace} codeql/dataflow: ${workspace} codeql/namebinding: ${workspace} codeql/util: ${workspace} diff --git a/unified/ql/test/library-tests/dataflow/test.swift b/unified/ql/test/library-tests/dataflow/test.swift index d5f0ac64f8f1..c112468c629b 100644 --- a/unified/ql/test/library-tests/dataflow/test.swift +++ b/unified/ql/test/library-tests/dataflow/test.swift @@ -33,7 +33,7 @@ func t6() { var a = source("t6.1"); sink(a); // $ hasValueFlow=t6.1 a = "safe"; - sink(a); // $ SPURIOUS: hasValueFlow=t6.1 + sink(a); } func t7() { @@ -60,3 +60,63 @@ func t9() { sink(tuple.0); // no flow sink(tuple.1); // $ hasValueFlow=t9.1 } + +func t10() { + var tuple = ("safe", "safe") + sink(tuple.0); // no flow + sink(tuple.1); // no flow + + tuple.0 = source("t10.1"); + sink(tuple.0); // $ hasValueFlow=t10.1 + sink(tuple.1); // no flow + + tuple = ("safe", "safe"); + sink(tuple.0); // no flow + sink(tuple.1); // no flow +} + +func t11() { + var x = "safe"; + if (foo()) { + x = source("t11.1"); + } else { + sink(x); // no flow + } + sink(x); // $ hasValueFlow=t11.1 + + var y = "safe"; + if (foo()) { + y = source("t11.2"); + } + sink(y); // $ hasValueFlow=t11.2 + + if (foo()) { + sink(x); // $ hasValueFlow=t11.1 + sink(y); // $ hasValueFlow=t11.2 + } +} + +func t12() { + var tuple = ("safe", "safe"); + if (foo()) { + tuple.0 = source("t12.1"); + } else { + sink(tuple.0); // no flow + sink(tuple.1); // no flow + } + sink(tuple.0); // $ hasValueFlow=t12.1 + sink(tuple.1); // no flow +} + +func t13() { + var tuple = (source("t13.1"), source("t13.2")); + var (a,b) = ("safe", "safe") + if (foo()) { + (a,b) = tuple + } else { + sink(a); // no flow + sink(b); // no flow + } + sink(a); // $ hasValueFlow=t13.1 + sink(b); // $ hasValueFlow=t13.2 +} From e5efdbd74fb4d34e949aa7251dc2231177ecc5b3 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 10 Sep 2026 08:48:14 +0200 Subject: [PATCH 0914/2098] unified: Include SSA steps in debug view --- .../codeql/unified/internal/dataflow/DataFlowGraph.qll | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll index dee49e4ba696..3a20cd96d02c 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll @@ -66,6 +66,10 @@ module DebugGraph { step(n, _, result) or step(result, _, n) + or + localSsaStep(n, result, _) + or + localSsaStep(result, n, _) } private predicate relevantDataFlowNode(Node node) { @@ -91,6 +95,11 @@ module DebugGraph { value = step.toString() ) or + exists(boolean isUseStep | + localSsaStep(node1, node2, isUseStep) and + if isUseStep = true then value = "use-use" else value = "def-use" + ) + or node2 = getPostUpdateNode(node1) and value = "post-update" ) From bf3aae681f26767fe05179e5e225864c2db109e2 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 10 Sep 2026 10:23:56 +0200 Subject: [PATCH 0915/2098] unified: Handle implicit 'self' references --- .../unified/internal/StaticNameBinding.qll | 3 ++ .../internal/dataflow/DataFlowGraph.qll | 10 ++++ .../internal/dataflow/DataFlowNode.qll | 11 ++++- .../unified/internal/dataflow/LocalSsa.qll | 8 +++- .../dataflow/implicit-self.swift | 48 +++++++++++++++++++ 5 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 unified/ql/test/library-tests/dataflow/implicit-self.swift diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 38060266c258..cf8e216bd7e0 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -667,6 +667,9 @@ module Public { LocalVariable getImplicitQualifierVariable() { ResolveImplicitReceiverAccess::access(this, result) } + + /** Gets the simple name of this identifier, that is, the name of the member being accessed. */ + string getName() { result = this.getValue() } } } diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll index 3a20cd96d02c..f3cf1f8facf2 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll @@ -28,6 +28,16 @@ predicate step(Node node1, Step step, Node node2) { node2.isLocalVariablePostUpdate(access, access.getLocalVariable()) ) or + exists(UnqualifiedMemberAccess access | access.isInstanceAccess() | + node1.isLocalVariableRead(access, access.getImplicitQualifierVariable()) and + step.readName(access.getName()) and + node2.isResultValue(access) + or + (node1.isIncomingValue(access) or node1.isPostUpdate(access)) and + step.storeName(access.getName()) and + node2.isLocalVariablePostUpdate(access, access.getImplicitQualifierVariable()) + ) + or exists(BinaryExpr expr | expr.getOperator().getValue() = "+" and node1.isResultValue([expr.getLeft(), expr.getRight()]) and diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll index afe603912a25..6872e69973d5 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll @@ -15,7 +15,6 @@ private predicate hasPostUpdate(Expr expr) { predicate performsVariableAccess( Expr expr, LocalVariable var, VariableRefKind kind, ControlFlowNode cfgNode ) { - // TODO: add UnqualifiedMemberAccess here exists(LocalVariableAccess access | var = access.getLocalVariable() and expr = access | hasResultValue(access) and kind.isRead() and cfgNode.isAfter(expr) or @@ -23,6 +22,16 @@ predicate performsVariableAccess( or hasPostUpdate(access) and kind.isPostUpdate() and cfgNode.asExpr() = expr // TODO: use more precise CFG node ) + or + exists(UnqualifiedMemberAccess access | + access.isInstanceAccess() and var = access.getImplicitQualifierVariable() and expr = access + | + kind.isRead() and cfgNode.isBefore(access) + or + (hasIncomingValue(access, _) or hasPostUpdate(access)) and + kind.isPostUpdate() and + cfgNode.asExpr() = access // TODO: use more precise CFG node + ) } newtype TDataFlowNode = diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll b/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll index d705be61550d..c08eeb29a9b5 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll @@ -11,7 +11,13 @@ module LocalSsaInput implements InputSig { predicate variableWrite(BasicBlock bb, int i, SourceVariable v, boolean certain) { certain = true and - performsVariableAccess(_, v, TWrite(), bb.getNode(i)) + ( + performsVariableAccess(_, v, TWrite(), bb.getNode(i)) + or + // Add implicit initialization of all variables at index -1 before the entry block + bb.(EntryBasicBlock).getEnclosingCallable() = v.getDeclaringCallable() and + i = -1 + ) } predicate variableRead(BasicBlock bb, int i, SourceVariable v, boolean certain) { diff --git a/unified/ql/test/library-tests/dataflow/implicit-self.swift b/unified/ql/test/library-tests/dataflow/implicit-self.swift new file mode 100644 index 000000000000..61b4ab17f292 --- /dev/null +++ b/unified/ql/test/library-tests/dataflow/implicit-self.swift @@ -0,0 +1,48 @@ +class Box { + var x: String = "" +} + +class C { + var x: String = "" + var box = Box() + + func t1() { + self.x = source("t1.1"); + sink(self.x); // $ hasValueFlow=t1.1 + } + + func t2() { + x = source("t2.1"); + sink(x); // $ hasValueFlow=t2.1 + } + + func t3() { + x = source("t3.1"); + sink(self.x); // $ hasValueFlow=t3.1 + } + + func t4() { + self.x = source("t4.1"); + sink(x); // $ hasValueFlow=t4.1 + } + + func t5() { + self.box.x = source("t5.1"); + sink(self.box.x); // $ hasValueFlow=t5.1 + } + + func t6() { + box.x = source("t6.1"); + sink(box.x); // $ hasValueFlow=t6.1 + } + + func t7() { + box.x = source("t7.1"); + sink(self.box.x); // $ hasValueFlow=t7.1 + } + + func t8() { + self.box.x = source("t8.1"); + sink(box.x); // $ hasValueFlow=t8.1 + } +} From ff8e0427078077904032379eef265cab63cd0408 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 10 Sep 2026 15:29:17 +0200 Subject: [PATCH 0916/2098] unified: Add some tests with assignment-timing --- .../ql/test/library-tests/dataflow/test.swift | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/unified/ql/test/library-tests/dataflow/test.swift b/unified/ql/test/library-tests/dataflow/test.swift index c112468c629b..1fd40237559b 100644 --- a/unified/ql/test/library-tests/dataflow/test.swift +++ b/unified/ql/test/library-tests/dataflow/test.swift @@ -120,3 +120,21 @@ func t13() { sink(a); // $ hasValueFlow=t13.1 sink(b); // $ hasValueFlow=t13.2 } + +func t14() { + var a = "safe"; + a = sink(a) + source("t14.1"); // $ SPURIOUS: hasTaintFlow=t14.1 + sink(a); // $ hasTaintFlow=t14.1 +} + +func t15() { + var a = "safe"; + a += source("t15.1"); + sink(a); // $ MISSING: hasTaintFlow=t15.1 +} + +func t16() { + var a = "safe"; + a += sink(a) + source("t16.1"); + sink(a); // $ MISSING: hasTaintFlow=t16.1 +} From 098e7e074b673b62006a0a78fce6e353f6993cda Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 10 Sep 2026 01:20:37 +0200 Subject: [PATCH 0917/2098] unified: Instantiate DataFlowConsistency --- unified/ql/consistency-queries/DataFlowConsistency.ql | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 unified/ql/consistency-queries/DataFlowConsistency.ql diff --git a/unified/ql/consistency-queries/DataFlowConsistency.ql b/unified/ql/consistency-queries/DataFlowConsistency.ql new file mode 100644 index 000000000000..267abd674cb5 --- /dev/null +++ b/unified/ql/consistency-queries/DataFlowConsistency.ql @@ -0,0 +1,10 @@ +private import unified +private import codeql.unified.internal.dataflow.AllDataFlow +private import codeql.dataflow.internal.DataFlowImplConsistency + +module ConsistencyInput implements InputSig { } + +module ConsistencyOutput = + MakeConsistency; + +import ConsistencyOutput From 09cfe5d39018d32aff6f25d2adaa286bc72c2e1c Mon Sep 17 00:00:00 2001 From: Asger F Date: Mon, 14 Sep 2026 13:39:28 +0200 Subject: [PATCH 0918/2098] unified: Add flow through string interpolation --- .../lib/codeql/unified/internal/FacadeAst.qll | 3 +++ .../unified/internal/dataflow/DataFlowGraph.qll | 17 +++++++++++++++++ .../ql/test/library-tests/dataflow/test.swift | 5 +++++ 3 files changed, 25 insertions(+) diff --git a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll index 5435876b3646..54efc88a473d 100644 --- a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll +++ b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll @@ -197,5 +197,8 @@ module Unified { result = arg.getValue() ) } + + /** Gets the number of arguments passed to this call, not counting implicit arguments like receiver. */ + int getNumberOfArguments() { result = count(this.getAnArgument()) } } } diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll index f3cf1f8facf2..7f7483c06a5b 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll @@ -45,6 +45,23 @@ predicate step(Node node1, Step step, Node node2) { node2.isResultValue(expr) ) or + exists(StringInterpolationExpr expr | + node1.isResultValue(expr.getAnElement()) and + step.taint() and + node2.isResultValue(expr) + ) + or + exists(CallExpr call | + // String interpolations in Swift currently insert a call to a built-in called "interpolation". + // Add taint through plain 1-argument calls to this built-in. + call.getCallee().(BuiltinExpr).getValue() = "interpolation" and + call.getNumberOfArguments() = 1 and + not exists(call.getArgument(0).getName()) and + node1.isResultValue(call.getArgument(0).getValue()) and + step.value() and + node2.isResultValue(call) + ) + or exists(TupleExpr expr, int i | node1.isResultValue(expr.getElement(i).getValue()) and step.storeName(i.toString()) and diff --git a/unified/ql/test/library-tests/dataflow/test.swift b/unified/ql/test/library-tests/dataflow/test.swift index 1fd40237559b..132afed56490 100644 --- a/unified/ql/test/library-tests/dataflow/test.swift +++ b/unified/ql/test/library-tests/dataflow/test.swift @@ -5,6 +5,11 @@ func t1() { func t2() { sink(source("t2.1") + "blah"); // $ hasTaintFlow=t2.1 sink("blah" + source("t2.2")); // $ hasTaintFlow=t2.2 + + sink("\(source("t2.3")) blah"); // $ hasTaintFlow=t2.3 + sink("blah \(source("t2.4"))"); // $ hasTaintFlow=t2.4 + sink("blah \(source("t2.5")) blah"); // $ hasTaintFlow=t2.5 + sink("blah \(escape: source("t2.6")) blah"); // no flow } func t3() { From a03cd48a86a46fc33389dc3cf966c3b89159b97a Mon Sep 17 00:00:00 2001 From: Asger F Date: Mon, 14 Sep 2026 13:42:51 +0200 Subject: [PATCH 0919/2098] unified: Add dumb version of CleartextLogging --- unified/ql/lib/qlpack.yml | 1 + .../security/CWE-312/CleartextLogging.ql | 52 +++++++++++++++++++ .../CleartextLogging.expected | 8 +++ .../CleartextLogging/CleartextLogging.qlref | 2 + .../CleartextLoggingBad.swift | 2 + .../CleartextLoggingGood.swift | 2 + 6 files changed, 67 insertions(+) create mode 100644 unified/ql/src/queries/security/CWE-312/CleartextLogging.ql create mode 100644 unified/ql/test/query-tests/security/CWE-312/CleartextLogging/CleartextLogging.expected create mode 100644 unified/ql/test/query-tests/security/CWE-312/CleartextLogging/CleartextLogging.qlref create mode 100644 unified/ql/test/query-tests/security/CWE-312/CleartextLogging/CleartextLoggingBad.swift create mode 100644 unified/ql/test/query-tests/security/CWE-312/CleartextLogging/CleartextLoggingGood.swift diff --git a/unified/ql/lib/qlpack.yml b/unified/ql/lib/qlpack.yml index 2416cff78e94..84261b14adc7 100644 --- a/unified/ql/lib/qlpack.yml +++ b/unified/ql/lib/qlpack.yml @@ -6,6 +6,7 @@ extractor: unified library: true upgrades: upgrades dependencies: + codeql/concepts: ${workspace} codeql/controlflow: ${workspace} codeql/ssa: ${workspace} codeql/dataflow: ${workspace} diff --git a/unified/ql/src/queries/security/CWE-312/CleartextLogging.ql b/unified/ql/src/queries/security/CWE-312/CleartextLogging.ql new file mode 100644 index 000000000000..4aa751a1e91a --- /dev/null +++ b/unified/ql/src/queries/security/CWE-312/CleartextLogging.ql @@ -0,0 +1,52 @@ +/** + * @name Cleartext logging of sensitive information + * @description Logging sensitive information in plaintext can + * expose it to an attacker. + * @kind path-problem + * @problem.severity error + * @security-severity 7.5 + * @precision high + * @id unified/swift/cleartext-logging + * @tags security + * external/cwe/cwe-312 + * external/cwe/cwe-359 + * external/cwe/cwe-532 + */ + +// +// FIXME: This is a deliberately dumb and noisy version of the query used to exercise data flow early on. +// +import unified +import codeql.concepts.internal.SensitiveDataHeuristics + +private string getNameFromExpr(Expr e) { + result = e.(IdentifierExpr).getValue() + or + result = e.(MemberAccessExpr).getMemberName() +} + +module DummyConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node node) { + exists(string name | + name = getNameFromExpr(node.asExpr()) and + HeuristicNames::nameIndicatesSensitiveData(name) + ) + } + + predicate isSink(DataFlow::Node node) { + exists(CallExpr call | + getNameFromExpr(call.getCallee()).regexpMatch("(?i)(ns)?(log|warn(ing)?|error|print).*") and + node.asExpr() = call.getAnArgument().getValue() + ) + } + + predicate isBarrierIn(DataFlow::Node node) { isSource(node) } +} + +module DummyFlow = TaintTracking::Global; + +import DummyFlow::PathGraph + +from DummyFlow::PathNode source, DummyFlow::PathNode sink +where DummyFlow::flowPath(source, sink) +select sink.getNode(), source, sink, "Logging of $@", source.getNode(), "sensitive data" diff --git a/unified/ql/test/query-tests/security/CWE-312/CleartextLogging/CleartextLogging.expected b/unified/ql/test/query-tests/security/CWE-312/CleartextLogging/CleartextLogging.expected new file mode 100644 index 000000000000..cf60bed522d7 --- /dev/null +++ b/unified/ql/test/query-tests/security/CWE-312/CleartextLogging/CleartextLogging.expected @@ -0,0 +1,8 @@ +#select +| CleartextLoggingBad.swift:2:7:2:44 | StringInterpolationExpr | CleartextLoggingBad.swift:2:35:2:42 | password : unit | CleartextLoggingBad.swift:2:7:2:44 | StringInterpolationExpr | Logging of $@ | CleartextLoggingBad.swift:2:35:2:42 | password | sensitive data | +edges +| CleartextLoggingBad.swift:2:35:2:42 | password : unit | CleartextLoggingBad.swift:2:7:2:44 | StringInterpolationExpr | provenance | | +nodes +| CleartextLoggingBad.swift:2:7:2:44 | StringInterpolationExpr | semmle.label | StringInterpolationExpr | +| CleartextLoggingBad.swift:2:35:2:42 | password : unit | semmle.label | password : unit | +subpaths diff --git a/unified/ql/test/query-tests/security/CWE-312/CleartextLogging/CleartextLogging.qlref b/unified/ql/test/query-tests/security/CWE-312/CleartextLogging/CleartextLogging.qlref new file mode 100644 index 000000000000..53e950061f85 --- /dev/null +++ b/unified/ql/test/query-tests/security/CWE-312/CleartextLogging/CleartextLogging.qlref @@ -0,0 +1,2 @@ +query: queries/security/CWE-312/CleartextLogging.ql +postprocess: utils/test/InlineExpectationsTestQuery.ql diff --git a/unified/ql/test/query-tests/security/CWE-312/CleartextLogging/CleartextLoggingBad.swift b/unified/ql/test/query-tests/security/CWE-312/CleartextLogging/CleartextLoggingBad.swift new file mode 100644 index 000000000000..bb6e84d1892b --- /dev/null +++ b/unified/ql/test/query-tests/security/CWE-312/CleartextLogging/CleartextLoggingBad.swift @@ -0,0 +1,2 @@ +let password = "P@ssw0rd" +NSLog("User password changed to \(password)") // $ Alert diff --git a/unified/ql/test/query-tests/security/CWE-312/CleartextLogging/CleartextLoggingGood.swift b/unified/ql/test/query-tests/security/CWE-312/CleartextLogging/CleartextLoggingGood.swift new file mode 100644 index 000000000000..1d90ac5e5656 --- /dev/null +++ b/unified/ql/test/query-tests/security/CWE-312/CleartextLogging/CleartextLoggingGood.swift @@ -0,0 +1,2 @@ +let password = "P@ssw0rd" +NSLog("User password changed") From 2d1a99c58a408930c7c81aa7bf983f43ae8d545a Mon Sep 17 00:00:00 2001 From: Asger F Date: Mon, 14 Sep 2026 13:43:09 +0200 Subject: [PATCH 0920/2098] unified: Copy query help from old swift --- .../security/CWE-312/CleartextLogging.qhelp | 46 +++++++++++++++++++ .../CWE-312/CleartextLoggingBad.swift | 2 + .../CWE-312/CleartextLoggingGood.swift | 2 + 3 files changed, 50 insertions(+) create mode 100644 unified/ql/src/queries/security/CWE-312/CleartextLogging.qhelp create mode 100644 unified/ql/src/queries/security/CWE-312/CleartextLoggingBad.swift create mode 100644 unified/ql/src/queries/security/CWE-312/CleartextLoggingGood.swift diff --git a/unified/ql/src/queries/security/CWE-312/CleartextLogging.qhelp b/unified/ql/src/queries/security/CWE-312/CleartextLogging.qhelp new file mode 100644 index 000000000000..5959fe5ef8df --- /dev/null +++ b/unified/ql/src/queries/security/CWE-312/CleartextLogging.qhelp @@ -0,0 +1,46 @@ + + + + +

    +Attackers could gain access to sensitive information that is logged unencrypted. +

    +
    + + +

    +Always make sure to encrypt or obfuscate sensitive information before you log it. +

    + +

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

    + +

    +Be aware that external processes often store the standard output and +standard error streams of the application. This will include logged sensitive information. +

    +
    + + +

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

    + +

    +Instead, you should encrypt or obfuscate the credentials, or omit them entirely: +

    + +
    + + + +
  • M. Dowd, J. McDonald and J. Schuhm, The Art of Software Security Assessment, 1st Edition, Chapter 2 - 'Common Vulnerabilities of Encryption', p. 43. Addison Wesley, 2006.
  • +
  • M. Howard and D. LeBlanc, Writing Secure Code, 2nd Edition, Chapter 9 - 'Protecting Secret Data', p. 299. Microsoft, 2002.
  • +
  • OWASP: Password Plaintext Storage.
  • + +
    +
    diff --git a/unified/ql/src/queries/security/CWE-312/CleartextLoggingBad.swift b/unified/ql/src/queries/security/CWE-312/CleartextLoggingBad.swift new file mode 100644 index 000000000000..036001e87179 --- /dev/null +++ b/unified/ql/src/queries/security/CWE-312/CleartextLoggingBad.swift @@ -0,0 +1,2 @@ +let password = "P@ssw0rd" +NSLog("User password changed to \(password)") diff --git a/unified/ql/src/queries/security/CWE-312/CleartextLoggingGood.swift b/unified/ql/src/queries/security/CWE-312/CleartextLoggingGood.swift new file mode 100644 index 000000000000..1d90ac5e5656 --- /dev/null +++ b/unified/ql/src/queries/security/CWE-312/CleartextLoggingGood.swift @@ -0,0 +1,2 @@ +let password = "P@ssw0rd" +NSLog("User password changed") From cea09af424dd0afec26acc0e13fad6973aa1d473 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 14 Sep 2026 14:08:03 +0200 Subject: [PATCH 0921/2098] C#: Address review comments. --- csharp/ql/lib/Linq/Helpers.qll | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/csharp/ql/lib/Linq/Helpers.qll b/csharp/ql/lib/Linq/Helpers.qll index 66ade5db5387..932086cb6f8b 100644 --- a/csharp/ql/lib/Linq/Helpers.qll +++ b/csharp/ql/lib/Linq/Helpers.qll @@ -118,8 +118,10 @@ class ForEachStmtEnumerable extends ForEachStmt { bindingset[e] private predicate acceptableForLinqCapture(Expr e) { - not exists(ParameterAccess pa, Parameter p | p = pa.getTarget() | - pa = e.getAChildExpr*() and + not exists(ParameterAccess pa, Parameter p | + p = pa.getTarget() and + pa = e.getAChildExpr*() + | (p.isOutOrRef() or p.isIn() or p.isReadonlyRef()) ) } From 02564e913bcb05ed340467257ec1dd776b0693f3 Mon Sep 17 00:00:00 2001 From: Asger F Date: Mon, 14 Sep 2026 14:41:04 +0200 Subject: [PATCH 0922/2098] Add support for AssociatedTypeDeclaration return type Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- unified/ql/lib/codeql/unified/internal/ExprPositions.qll | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/unified/ql/lib/codeql/unified/internal/ExprPositions.qll b/unified/ql/lib/codeql/unified/internal/ExprPositions.qll index 4c38c5d241c9..2e64053642eb 100644 --- a/unified/ql/lib/codeql/unified/internal/ExprPositions.qll +++ b/unified/ql/lib/codeql/unified/internal/ExprPositions.qll @@ -13,6 +13,8 @@ predicate isInTypeContext(Expr expr) { or expr = any(FunctionDeclaration n).getReturnType() or + expr = any(FunctionExpr n).getReturnType() + or expr = any(AccessorDeclaration n).getType() or expr = any(Parameter n).getType() @@ -23,6 +25,8 @@ predicate isInTypeContext(Expr expr) { or expr = any(TypeParameter n).getBound() or + expr = any(AssociatedTypeDeclaration n).getBound() + or expr.getParent() instanceof TypeConstraint or isInTypeContext(expr.getEnclosingExpr()) From 4a6040c9e58f8759c494fa9b70bef8afe4c041dd Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 10 Sep 2026 15:50:37 +0200 Subject: [PATCH 0923/2098] Cfg: Add shared inline CFG test. --- .../codeql/controlflow/ControlFlowGraph.qll | 26 +- .../codeql/controlflow/test/TestCfg.qll | 419 ++++++++++++++++++ 2 files changed, 442 insertions(+), 3 deletions(-) create mode 100644 shared/controlflow/codeql/controlflow/test/TestCfg.qll diff --git a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll index 392a777d3ef4..12b142ebbffd 100644 --- a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll +++ b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll @@ -2208,13 +2208,21 @@ module Make0 Ast> { } } - module Cfg = BB::Make; + private module Cfg_ = BB::Make; - private module CfgAlias = Cfg; + module Cfg implements BB::CfgSig, TestCfg::CfgSig { + import Cfg_ - import CfgAlias + class AstNode = Ast::AstNode; + + class Callable = Ast::Callable; + } + + import Cfg_ } + private import test.TestCfg as TestCfg + private module Additional { /* * CFG printing @@ -2236,6 +2244,18 @@ module Make0 Ast> { import Pp::PrintGraph + /* + * CFG testing + */ + + private module TestInput implements TestCfg::InputSig { + AstNode getParent(AstNode node) { node = getChild(result, _) } + + predicate getEnclosingCallable = Ast::getEnclosingCallable/1; + } + + module TestCfgInline = TestCfg::Make; + /** Provides a set of consistency queries. */ module Consistency { /** Holds if the consistency query `query` has `results` results. */ diff --git a/shared/controlflow/codeql/controlflow/test/TestCfg.qll b/shared/controlflow/codeql/controlflow/test/TestCfg.qll new file mode 100644 index 000000000000..55a58e355b44 --- /dev/null +++ b/shared/controlflow/codeql/controlflow/test/TestCfg.qll @@ -0,0 +1,419 @@ +/** + * Provides query predicates for testing the CFG in an inline expectation qltest. + */ +overlay[local?] +module; + +private import codeql.controlflow.SuccessorType +private import codeql.util.Location + +signature module CfgSig { + /** An AST node. */ + class AstNode { + /** Gets a textual representation of this AST node. */ + string toString(); + + /** Gets the location of this AST node. */ + Location getLocation(); + } + + /** A callable, for example a function, method, constructor, or top-level script. */ + class Callable; + + /** A control flow node. */ + class ControlFlowNode { + /** Gets a textual representation of this control flow node. */ + string toString(); + + /** Gets the location of this control flow node. */ + Location getLocation(); + + /** Gets the basic block containing this control flow node. */ + BasicBlock getBasicBlock(); + + /** + * Holds if this is the unique control flow node that represents the + * given AST node. + */ + predicate injects(AstNode n); + + /** Gets the enclosing callable of this control flow node. */ + Callable getEnclosingCallable(); + } + + /** + * A basic block, that is, a maximal straight-line sequence of control flow nodes + * without branches or joins. + */ + class BasicBlock { + /** Gets a textual representation of this basic block. */ + string toString(); + + /** Gets the location of this basic block. */ + Location getLocation(); + + /** Gets the control flow node at a specific (zero-indexed) position in this basic block. */ + ControlFlowNode getNode(int pos); + + /** Gets an immediate successor of this basic block of a given type, if any. */ + BasicBlock getASuccessor(SuccessorType t); + + /** Gets the enclosing callable of this basic block. */ + Callable getEnclosingCallable(); + } +} + +signature class TypSig; + +signature module InputSig { + /** Gets the parent of `node`. */ + AstNode getParent(AstNode node); + + /** Gets the immediately enclosing callable that contains `node`. */ + Callable getEnclosingCallable(AstNode node); +} + +/** + * Constructs several query predicates for testing the CFG in an inline expectation qltest. + * + * The output is based on basic block slices, that is, block segments cut by line boundaries. + * Ordinary left-to-right intra-block control flow is elided, but everything else is represented. + * + * A nested module `BlockSlices` can be imported to dump all basic block slices. + */ +module Make Cfg, InputSig Input> +{ + private import Cfg + + /** Holds if `n` from `bb` starts at the given line. */ + private predicate node(int line, ControlFlowNode n, BasicBlock bb) { + n.injects(_) and + n.getLocation().getStartLine() = line and + n.getBasicBlock() = bb + } + + /** Gets the rank of `n` within the slice of `bb` at the given line. */ + private int sliceRank(int line, ControlFlowNode n, BasicBlock bb) { + n = + rank[result](ControlFlowNode n0, int i | + node(line, n0, bb) and n0 = bb.getNode(i) + | + n0 order by i + ) + } + + /** + * A direction in the location-induced AST restricted to a single line, that + * is, the tree arising from location-nesting. + * + * - `Up` and `Down` indicate location nesting. + * - `Right` indicates a non-overlapping location to the right. + * - `Id` indicates the same location. + * - `Other` most likely indicates a non-overlapping location to the left, + * but remains a catch-all for any other case. + */ + private newtype Dir = + Down() or + Up() or + Right() or + Id() or + Other() + + /** + * Holds if `n1` steps to `n2` within a basic block line slice and that the + * corresponding AST nodes are related with one being a transitive parent of + * the other. The direction in the AST is given by `dir`. + */ + private predicate astUpDownStep(ControlFlowNode n1, ControlFlowNode n2, Dir dir) { + exists(int line, BasicBlock bb, AstNode a1, AstNode a2 | + n1.injects(a1) and + n2.injects(a2) and + sliceRank(line, n1, bb) + 1 = sliceRank(line, n2, bb) + | + if Input::getParent+(a1) = a2 + then dir = Up() + else + if Input::getParent+(a2) = a1 + then dir = Down() + else none() + ) + } + + bindingset[l1, l2] + pragma[inline_late] + private predicate endsLessThan(Location l1, Location l2) { + l1.getEndLine() < l2.getEndLine() + or + l1.getEndLine() = l2.getEndLine() and + l1.getEndColumn() <= l2.getEndColumn() + } + + private predicate oneline(Location l) { l.getStartLine() = l.getEndLine() } + + /** + * Holds if `n1` steps to `n2` within a basic block line slice of `bb` at + * `line` and that the step in locations is given by `dir`. Some identical + * locations may be further resolved by peeking at the AST structure. + */ + private predicate singleLineBlockStep( + BasicBlock bb, int line, ControlFlowNode n1, ControlFlowNode n2, Dir dir + ) { + sliceRank(line, n1, bb) + 1 = sliceRank(line, n2, bb) and + exists(Location l1, Location l2 | n1.getLocation() = l1 and n2.getLocation() = l2 | + if oneline(l1) and l1.getEndColumn() < l2.getStartColumn() + then dir = Right() + else + if + l1.getStartColumn() <= l2.getStartColumn() and + endsLessThan(l2, l1) and + l1 != l2 + then dir = Down() + else + if + l2.getStartColumn() <= l1.getStartColumn() and + endsLessThan(l1, l2) and + l1 != l2 + then dir = Up() + else + if l1 != l2 + then dir = Other() + else ( + astUpDownStep(n1, n2, dir) + or + not astUpDownStep(n1, n2, _) and dir = Id() + ) + ) + } + + /** + * Holds if the `line` slice of the basic block `bb` is simple left-to-right + * evaluation order. + * + * Both pre-order and post-order traversal is allowed and allowed to be + * mixed. `Up` indicates the last part of a post-order traversal, and `Down` + * indicates the first part of a pre-order traversal, so an `Up` step + * followed by a `Down` step is inconsistent with simple left-to-right + * evaluation order. + */ + private predicate simpleLeftToRightBlock(int line, BasicBlock bb) { + node(line, _, bb) and + forall(ControlFlowNode n1, ControlFlowNode n2 | singleLineBlockStep(bb, line, n1, n2, _) | + exists(Dir dir | singleLineBlockStep(bb, line, n1, n2, dir) | + dir != Other() and + dir != Id() and + (dir = Up() implies not singleLineBlockStep(bb, line, n2, _, Down())) + ) + ) + } + + private string arrow(ControlFlowNode n) { + exists(Dir dir | singleLineBlockStep(_, _, n, _, dir) | + dir = Down() and result = " -V " + or + dir = Up() and result = " -^ " + or + dir = Right() and result = " -> " + or + dir = Id() and result = " -I " + or + dir = Other() and result = " -? " + ) + } + + module BlockSlices { + /** + * Holds if `blockSlice` is a string representation of the `line` slice of a + * basic block. `first` is the first node in the slice. + */ + query predicate blockSlice(int line, ControlFlowNode first, string blockSlice) { + exists(BasicBlock bb | + 1 = sliceRank(line, first, bb) and + blockSlice = + "'" + + strictconcat(ControlFlowNode n, int r, int i, string s | + r = sliceRank(line, n, bb) and + ( + i = 0 and s = n.toString() + or + i = 1 and s = arrow(n) + ) + | + s order by r, i + ) + "'" + ) + } + } + + final private class FinalControlFlowNode = ControlFlowNode; + + /** A `ControlFlowNode` with its location trimmed to a single line. */ + class ControlFlowNode1line extends FinalControlFlowNode { + predicate hasLocationInfo(string file, int sl, int sc, int el, int ec) { + exists(int el0, int ec0 | + super.getLocation().hasLocationInfo(file, sl, sc, el0, ec0) and + if el0 != sl then el = sl and ec = sc else (el = el0 and ec = ec0) + ) + } + } + + /** + * Holds if `blockSlice` is a string representation of a line slice of a + * basic block that does not follow simple left-to-right evaluation order. + * `first` is the first node in the slice. + */ + query predicate nonSimple(ControlFlowNode1line first, string blockSlice) { + exists(int line, BasicBlock bb | + BlockSlices::blockSlice(line, first, blockSlice) and + bb = first.getBasicBlock() and + not simpleLeftToRightBlock(line, bb) + ) + } + + /** + * Gets the rank of `n` within `bb` restricted to nodes that are canonical + * representatives of AST nodes. + */ + private int bbRank(ControlFlowNode n, BasicBlock bb) { + n = + rank[result](ControlFlowNode n0, int i | n0.injects(_) and bb.getNode(i) = n0 | n0 order by i) + } + + /** + * Holds if some AST node on `line` has a corresponding CFG node within the + * callable `c`. + */ + private predicate lineHasCfg(int line, Callable c) { + exists(ControlFlowNode n, Location loc | + n.getLocation() = loc and + loc.getStartLine() = line and + oneline(loc) and + n.injects(_) and + n.getEnclosingCallable() = c + ) + } + + /** + * Holds if `n1` and `n2` are consecutive nodes in a basic block (skipping + * over non-AST nodes), but are located on different lines, such that `n1` + * and `n2` link two line slices of a basic block. Additionally, the link is + * required to be non-trivial in the sense that it either goes backwards (the + * `lineDelta` is negative) or it skips over some lines with other CFG nodes. + */ + private predicate nonTrivialSliceLink( + int line, ControlFlowNode n1, ControlFlowNode n2, int lineDelta + ) { + line = n1.getLocation().getStartLine() and + exists(int last, BasicBlock bb | + last = sliceRank(line, n1, bb) and + not last + 1 = sliceRank(line, _, bb) and + bbRank(n1, bb) + 1 = bbRank(n2, bb) + ) and + lineDelta = n2.getLocation().getStartLine() - n1.getLocation().getStartLine() and + (lineDelta < 0 or lineHasCfg([line + 1 .. line + lineDelta - 1], n1.getEnclosingCallable())) + } + + bindingset[lineDelta] + private string ppDelta(int lineDelta) { + if lineDelta < 0 + then result = "(" + lineDelta.toString() + ")" + else result = "(+" + lineDelta.toString() + ")" + } + + /** + * Holds if the line slice ending at `n1` continues to another line slice via + * a non-trivial link. That is, it does not simply continue to the next line. + */ + query predicate bbContinues(ControlFlowNode1line n1, string link) { + exists(ControlFlowNode n2, int lineDelta | + nonTrivialSliceLink(_, n1, n2, lineDelta) and + link = "'" + n1.toString() + " goto " + n2.toString() + ppDelta(lineDelta) + "'" + ) + } + + /** + * Holds if `bb` only includes synthetic nodes, that is, no AST nodes are + * canonically represented in it. + */ + private predicate synthBlock(BasicBlock bb) { not exists(bbRank(_, bb)) } + + /** + * Holds if `bb1` transitively reaches `bb2` through a sequence of basic + * block steps where `bb2` is the only non-`synthBlock`. + */ + private predicate synthStep(BasicBlock bb1, BasicBlock bb2, string successorSuffix) { + bb1 = bb2 and successorSuffix = "" and not synthBlock(bb2) + or + exists(BasicBlock mid, SuccessorType t, string s | + synthBlock(bb1) and + bb1.getASuccessor(t) = mid and + synthStep(mid, bb2, s) and + if t instanceof DirectSuccessor + then successorSuffix = s + else successorSuffix = "," + t.toString() + s + ) + } + + /** + * Holds if there is a basic block step from `n1` to `n2` with successor + * type `t` originating at the given line. + */ + private predicate bbStep( + int line, ControlFlowNode n1, ControlFlowNode n2, SuccessorType t, string successorSuffix, + int lineDelta + ) { + exists(int last, BasicBlock bb1, BasicBlock mid, BasicBlock bb2 | + line = n1.getLocation().getStartLine() and + last = bbRank(n1, bb1) and + not last + 1 = bbRank(_, bb1) and + bb1.getASuccessor(t) = mid and + synthStep(mid, bb2, successorSuffix) and + 1 = bbRank(n2, bb2) and + lineDelta = n2.getLocation().getStartLine() - n1.getLocation().getStartLine() + ) + } + + /** + * Holds if there is a basic block step from `n1` described by `next`. + */ + query predicate bbStep(ControlFlowNode1line n1, string next) { + exists(ControlFlowNode n2, SuccessorType t, string s, int lineDelta | + bbStep(_, n1, n2, t, s, lineDelta) and + next = "'" + n1.toString() + " : " + t + s + " -> " + n2.toString() + ppDelta(lineDelta) + "'" + ) + } + + /** + * Holds if no CFG nodes exist in `c` on `line` and `a` is an AST node on + * that line. + */ + private predicate unreachable(int line, Callable c, AstNode a) { + oneline(a.getLocation()) and + a.getLocation().getStartLine() = line and + Input::getEnclosingCallable(a) = c and + not exists(ControlFlowNode n | + n.injects(_) and + oneline(n.getLocation()) and + n.getLocation().getStartLine() = line and + n.getEnclosingCallable() = c + ) + } + + /** + * Holds if no CFG nodes exist in `c` on `line` and `a` is the first AST + * node on that line. + */ + private predicate firstUnreachable(int line, Callable c, AstNode a) { + a = + min(AstNode a0, Location loc | + unreachable(line, c, a0) and loc = a0.getLocation() + | + a0 order by loc.getStartColumn(), loc.getEndColumn() + ) + } + + /** + * Holds if no CFG nodes exist in the callable of `a` on the same line as + * `a`, and `a` is the first AST node on that line. + */ + query predicate noCfg(AstNode a) { firstUnreachable(_, _, a) } +} From e09fa64689516f5e6dd7acc95f89850fada6cb2d Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Mon, 14 Sep 2026 10:35:36 +0200 Subject: [PATCH 0924/2098] Unified: Add Swift CFG test. --- .../controlflow/basicblock-slices.expected | 456 +++++++++++++ .../controlflow/basicblock-slices.ql | 2 + .../library-tests/controlflow/cfg.expected | 157 +++++ .../ql/test/library-tests/controlflow/cfg.ql | 2 + .../test/library-tests/controlflow/cfg.qlref | 2 + .../test/library-tests/controlflow/cfg.swift | 604 ++++++++++++++++++ 6 files changed, 1223 insertions(+) create mode 100644 unified/ql/test/library-tests/controlflow/basicblock-slices.expected create mode 100644 unified/ql/test/library-tests/controlflow/basicblock-slices.ql create mode 100644 unified/ql/test/library-tests/controlflow/cfg.expected create mode 100644 unified/ql/test/library-tests/controlflow/cfg.ql create mode 100644 unified/ql/test/library-tests/controlflow/cfg.qlref create mode 100644 unified/ql/test/library-tests/controlflow/cfg.swift diff --git a/unified/ql/test/library-tests/controlflow/basicblock-slices.expected b/unified/ql/test/library-tests/controlflow/basicblock-slices.expected new file mode 100644 index 000000000000..f9744225faf2 --- /dev/null +++ b/unified/ql/test/library-tests/controlflow/basicblock-slices.expected @@ -0,0 +1,456 @@ +| 1 | cfg.swift:1:1:604:2 | Block | 'Block -V VariableDeclaration -V topLevelDecl -> Int -> 0' | +| 2 | cfg.swift:2:1:2:1 | 0 | '0' | +| 3 | cfg.swift:3:1:3:12 | topLevelDecl | 'topLevelDecl -> + -> 1 -^ BinaryExpr' | +| 5 | cfg.swift:5:1:5:37 | Block | 'Block -V 0 -^ ReturnExpr' | +| 5 | cfg.swift:5:1:5:37 | FunctionDeclaration | 'FunctionDeclaration' | +| 7 | cfg.swift:7:1:7:10 | returnZero | 'returnZero -^ CallExpr' | +| 8 | cfg.swift:8:1:8:6 | Double | 'Double -> Argument -V topLevelDecl -^ CallExpr' | +| 10 | cfg.swift:10:1:13:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V MyError -^ BaseType -V Error' | +| 11 | cfg.swift:11:10:11:16 | VariableDeclaration | 'VariableDeclaration -V error1 -> VariableDeclaration -V error2' | +| 12 | cfg.swift:12:10:12:31 | ClassLikeDeclaration | 'ClassLikeDeclaration -V error3 -^ ConstructorDeclaration' | +| 12 | cfg.swift:12:17:12:25 | withParam | 'withParam -^ Block' | +| 15 | cfg.swift:15:1:17:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 15 | cfg.swift:15:13:15:13 | x | 'x -^ Block' | +| 16 | cfg.swift:16:10:16:10 | x | 'x -> == -> 0 -^ BinaryExpr -^ ReturnExpr' | +| 19 | cfg.swift:19:1:26:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 19 | cfg.swift:19:17:19:17 | x | 'x -^ Block' | +| 20 | cfg.swift:20:3:22:3 | GuardIfStmt | 'GuardIfStmt -V x -> >= -> 0 -^ BinaryExpr -> Block' | +| 21 | cfg.swift:21:11:21:17 | MyError | 'MyError -^ MemberAccessExpr -^ ThrowExpr' | +| 28 | cfg.swift:28:1:45:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 28 | cfg.swift:28:15:28:15 | x | 'x -^ Block' | +| 29 | cfg.swift:29:3:43:3 | TryExpr | 'TryExpr -V Block' | +| 30 | cfg.swift:30:9:30:18 | mightThrow | 'mightThrow -> Argument -V 0 -^ CallExpr -^ try -^ UnaryExpr' | +| 31 | cfg.swift:31:5:31:9 | print | 'print -> Argument -V "Did not throw." -^ CallExpr' | +| 32 | cfg.swift:32:10:32:19 | mightThrow | 'mightThrow -> Argument -V 0 -^ CallExpr -^ try! -^ UnaryExpr' | +| 33 | cfg.swift:33:5:33:9 | print | 'print -> Argument -V "Still did not throw." -^ CallExpr' | +| 44 | cfg.swift:44:10:44:10 | 0 | '0 -^ ReturnExpr' | +| 47 | cfg.swift:47:1:51:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 47 | cfg.swift:47:21:47:21 | s | 's -^ Block' | +| 48 | cfg.swift:48:10:50:3 | Block | 'Block' | +| 48 | cfg.swift:48:10:50:3 | FunctionExpr | 'FunctionExpr -^ ReturnExpr' | +| 49 | cfg.swift:49:12:49:12 | s | 's -> + -> "" -^ BinaryExpr -^ ReturnExpr' | +| 53 | cfg.swift:53:1:58:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 53 | cfg.swift:53:21:53:21 | x | 'x -^ Block' | +| 54 | cfg.swift:54:3:56:3 | FunctionDeclaration | 'FunctionDeclaration' | +| 54 | cfg.swift:54:10:54:10 | y | 'y -^ Block' | +| 55 | cfg.swift:55:12:55:12 | x | 'x -> + -> y -^ BinaryExpr -^ ReturnExpr' | +| 57 | cfg.swift:57:10:57:10 | f | 'f -^ ReturnExpr' | +| 60 | cfg.swift:60:1:64:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 60 | cfg.swift:60:21:60:21 | x | 'x -^ Block' | +| 61 | cfg.swift:61:10:63:3 | Block | 'Block' | +| 61 | cfg.swift:61:10:63:3 | FunctionExpr | 'FunctionExpr -^ ReturnExpr' | +| 62 | cfg.swift:62:6:62:6 | y | 'y -> x -> + -> y -^ BinaryExpr' | +| 66 | cfg.swift:66:1:70:1 | Block | 'Block' | +| 66 | cfg.swift:66:1:70:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 67 | cfg.swift:67:3:67:34 | VariableDeclaration | 'VariableDeclaration -V x1 -> createClosure1 -> Argument -V "" -^ CallExpr -^ CallExpr' | +| 68 | cfg.swift:68:3:68:35 | VariableDeclaration | 'VariableDeclaration -V x2 -> createClosure2 -> Argument -V 0 -^ CallExpr -> Argument -V 10 -^ CallExpr' | +| 69 | cfg.swift:69:3:69:35 | VariableDeclaration | 'VariableDeclaration -V x3 -> createClosure3 -> Argument -V 0 -^ CallExpr -> Argument -V 10 -^ CallExpr' | +| 72 | cfg.swift:72:1:75:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 72 | cfg.swift:72:20:72:20 | s | 's -^ Block' | +| 73 | cfg.swift:73:3:73:23 | VariableDeclaration | 'VariableDeclaration -V n -> Optional -V Int -^ GenericTypeExpr -> Int -> Argument -V s -^ CallExpr' | +| 74 | cfg.swift:74:10:74:10 | n | 'n -^ ReturnExpr' | +| 77 | cfg.swift:77:1:81:1 | Block | 'Block' | +| 77 | cfg.swift:77:1:81:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 78 | cfg.swift:78:3:78:36 | VariableDeclaration | 'VariableDeclaration -V nBang -> maybeParseInt -> Argument -V "42" -^ CallExpr -^ ! -^ UnaryExpr' | +| 79 | cfg.swift:79:3:79:31 | VariableDeclaration | 'VariableDeclaration -V n -> maybeParseInt -> Argument -V "42" -^ CallExpr' | +| 80 | cfg.swift:80:10:80:14 | nBang | 'nBang -> + -> n -^ ! -^ UnaryExpr -^ BinaryExpr -^ ReturnExpr' | +| 83 | cfg.swift:83:1:98:1 | Block | 'Block' | +| 83 | cfg.swift:83:1:98:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 84 | cfg.swift:84:3:84:15 | VariableDeclaration | 'VariableDeclaration -V temp -> 10' | +| 86 | cfg.swift:86:3:88:3 | FunctionDeclaration | 'FunctionDeclaration' | +| 86 | cfg.swift:86:12:86:12 | a | 'a -^ Block' | +| 87 | cfg.swift:87:5:87:5 | a | 'a -> a -> + -> 1 -^ BinaryExpr -^ AssignExpr' | +| 90 | cfg.swift:90:3:92:3 | FunctionDeclaration | 'FunctionDeclaration' | +| 90 | cfg.swift:90:20:90:20 | a | 'a -^ Block' | +| 91 | cfg.swift:91:5:91:5 | a | 'a -> nil -^ AssignExpr' | +| 94 | cfg.swift:94:3:94:5 | add | 'add -> Argument -V -^ CallExpr' | +| 95 | cfg.swift:95:3:95:30 | VariableDeclaration | 'VariableDeclaration -V tempOptional -> Optional -V Int -^ GenericTypeExpr -> 10' | +| 96 | cfg.swift:96:3:96:13 | addOptional | 'addOptional -> Argument -V -^ CallExpr' | +| 97 | cfg.swift:97:10:97:13 | temp | 'temp -> + -> tempOptional -^ ! -^ UnaryExpr -^ BinaryExpr -^ ReturnExpr' | +| 100 | cfg.swift:100:1:109:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V C' | +| 101 | cfg.swift:101:3:101:16 | VariableDeclaration | 'VariableDeclaration -V myInt -> Int' | +| 102 | cfg.swift:102:3:104:3 | ConstructorDeclaration | 'ConstructorDeclaration' | +| 102 | cfg.swift:102:8:102:8 | n | 'n -^ Block' | +| 103 | cfg.swift:103:5:103:9 | myInt | 'myInt -> n -^ AssignExpr' | +| 106 | cfg.swift:106:3:108:3 | Block | 'Block' | +| 106 | cfg.swift:106:3:108:3 | FunctionDeclaration | 'FunctionDeclaration' | +| 107 | cfg.swift:107:12:107:16 | myInt | 'myInt -^ ReturnExpr' | +| 111 | cfg.swift:111:1:137:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 111 | cfg.swift:111:20:111:24 | param | 'param -> inoutParam -> opt -^ Block' | +| 112 | cfg.swift:112:3:112:18 | VariableDeclaration | 'VariableDeclaration -V c -> C -> Argument -V 42 -^ CallExpr' | +| 113 | cfg.swift:113:3:113:18 | VariableDeclaration | 'VariableDeclaration -V n1 -> c -^ MemberAccessExpr' | +| 114 | cfg.swift:114:3:114:23 | VariableDeclaration | 'VariableDeclaration -V n2 -> c -^ MemberAccessExpr -^ MemberAccessExpr' | +| 115 | cfg.swift:115:3:115:23 | VariableDeclaration | 'VariableDeclaration -V n3 -> c -^ MemberAccessExpr -^ CallExpr' | +| 116 | cfg.swift:116:3:116:28 | VariableDeclaration | 'VariableDeclaration -V n4 -> c -^ MemberAccessExpr -^ MemberAccessExpr -^ CallExpr' | +| 117 | cfg.swift:117:3:117:22 | VariableDeclaration | 'VariableDeclaration -V n5 -> param -^ MemberAccessExpr' | +| 118 | cfg.swift:118:3:118:27 | VariableDeclaration | 'VariableDeclaration -V n6 -> param -^ MemberAccessExpr -^ MemberAccessExpr' | +| 120 | cfg.swift:120:3:120:32 | VariableDeclaration | 'VariableDeclaration -V n8 -> param -^ MemberAccessExpr -^ MemberAccessExpr -^ CallExpr' | +| 122 | cfg.swift:122:3:122:27 | VariableDeclaration | 'VariableDeclaration -V n9 -> inoutParam -^ MemberAccessExpr' | +| 123 | cfg.swift:123:3:123:27 | VariableDeclaration | 'VariableDeclaration -V n7 -> param -^ MemberAccessExpr -^ CallExpr' | +| 124 | cfg.swift:124:3:124:33 | VariableDeclaration | 'VariableDeclaration -V n10 -> inoutParam -^ MemberAccessExpr -^ MemberAccessExpr' | +| 125 | cfg.swift:125:3:125:33 | VariableDeclaration | 'VariableDeclaration -V n11 -> inoutParam -^ MemberAccessExpr -^ CallExpr' | +| 126 | cfg.swift:126:3:126:38 | VariableDeclaration | 'VariableDeclaration -V n12 -> inoutParam -^ MemberAccessExpr -^ MemberAccessExpr -^ CallExpr' | +| 128 | cfg.swift:128:3:128:22 | VariableDeclaration | 'VariableDeclaration -V n13 -> opt -^ ! -^ UnaryExpr -^ MemberAccessExpr' | +| 129 | cfg.swift:129:3:129:27 | VariableDeclaration | 'VariableDeclaration -V n14 -> opt -^ ! -^ UnaryExpr -^ MemberAccessExpr -^ MemberAccessExpr' | +| 130 | cfg.swift:130:3:130:27 | VariableDeclaration | 'VariableDeclaration -V n15 -> opt -^ ! -^ UnaryExpr -^ MemberAccessExpr -^ CallExpr' | +| 131 | cfg.swift:131:3:131:32 | VariableDeclaration | 'VariableDeclaration -V n16 -> opt -^ ! -^ UnaryExpr -^ MemberAccessExpr -^ MemberAccessExpr -^ CallExpr' | +| 133 | cfg.swift:133:3:133:22 | VariableDeclaration | 'VariableDeclaration -V n17 -> opt -^ MemberAccessExpr' | +| 134 | cfg.swift:134:3:134:27 | VariableDeclaration | 'VariableDeclaration -V n18 -> opt -^ MemberAccessExpr -^ MemberAccessExpr' | +| 135 | cfg.swift:135:3:135:27 | VariableDeclaration | 'VariableDeclaration -V n19 -> opt -^ MemberAccessExpr -^ CallExpr' | +| 136 | cfg.swift:136:3:136:32 | VariableDeclaration | 'VariableDeclaration -V n20 -> opt -^ MemberAccessExpr -^ MemberAccessExpr -^ CallExpr' | +| 139 | cfg.swift:139:1:166:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 139 | cfg.swift:139:15:139:15 | x | 'x -^ Block' | +| 140 | cfg.swift:140:3:141:12 | ForEachStmt | 'ForEachStmt -V 0 -> ... -> 10 -^ BinaryExpr' | +| 140 | cfg.swift:140:7:140:7 | _ | '_' | +| 141 | cfg.swift:141:9:141:12 | Block | 'Block' | +| 143 | cfg.swift:143:3:153:3 | SwitchExpr | 'SwitchExpr -V x' | +| 144 | cfg.swift:144:5:146:17 | Block | 'Block' | +| 144 | cfg.swift:144:5:146:17 | SwitchCase | 'SwitchCase -V 0 -> 1 -^ OrPattern' | +| 145 | cfg.swift:145:14:145:17 | true | 'true -^ ReturnExpr' | +| 147 | cfg.swift:147:5:150:17 | Block | 'Block' | +| 147 | cfg.swift:147:5:150:17 | SwitchCase | 'SwitchCase' | +| 147 | cfg.swift:147:10:147:10 | x | 'x -^ ConditionalPattern' | +| 148 | cfg.swift:148:9:149:17 | BinaryExpr | 'BinaryExpr -V x -> >= -> 2 -^ BinaryExpr' | +| 149 | cfg.swift:149:13:149:13 | x | 'x -> < -> 5 -^ BinaryExpr' | +| 150 | cfg.swift:150:14:150:17 | true | 'true -^ ReturnExpr' | +| 151 | cfg.swift:151:5:152:18 | SwitchCase | 'SwitchCase -V Block' | +| 152 | cfg.swift:152:14:152:18 | false | 'false -^ ReturnExpr' | +| 168 | cfg.swift:168:1:184:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 168 | cfg.swift:168:16:168:16 | x | 'x -^ Block' | +| 170 | cfg.swift:170:3:172:3 | | '' | +| 174 | cfg.swift:174:3:176:3 | | '' | +| 178 | cfg.swift:178:3:183:3 | | '' | +| 186 | cfg.swift:186:1:198:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 186 | cfg.swift:186:9:186:9 | x | 'x -^ Block' | +| 187 | cfg.swift:187:3:197:3 | IfExpr | 'IfExpr -V x -> > -> 2 -^ BinaryExpr' | +| 187 | cfg.swift:187:12:189:3 | Block | 'Block' | +| 188 | cfg.swift:188:5:188:9 | print | 'print -> Argument -V "x is greater than 2" -^ CallExpr' | +| 190 | cfg.swift:190:8:197:3 | IfExpr | 'IfExpr -V BinaryExpr -V BinaryExpr -V x -> <= -> 2 -^ BinaryExpr' | +| 191 | cfg.swift:191:13:191:13 | x | 'x -> > -> 0 -^ BinaryExpr' | +| 192 | cfg.swift:192:13:192:21 | UnaryExpr | 'UnaryExpr -V x -> == -> 5 -^ BinaryExpr' | +| 192 | cfg.swift:192:23:194:3 | Block | 'Block' | +| 193 | cfg.swift:193:5:193:9 | print | 'print -> Argument -V "x is 1" -^ CallExpr' | +| 195 | cfg.swift:195:8:197:3 | Block | 'Block' | +| 196 | cfg.swift:196:5:196:9 | print | 'print -> Argument -V "I can't guess the number" -^ CallExpr' | +| 200 | cfg.swift:200:1:205:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 200 | cfg.swift:200:9:200:9 | b | 'b -^ Block' | +| 201 | cfg.swift:201:3:203:3 | IfExpr | 'IfExpr -V b' | +| 201 | cfg.swift:201:8:203:3 | Block | 'Block' | +| 202 | cfg.swift:202:12:202:12 | 0 | '0 -^ ReturnExpr' | +| 204 | cfg.swift:204:10:204:10 | 1 | '1 -^ ReturnExpr' | +| 207 | cfg.swift:207:1:215:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 207 | cfg.swift:207:9:207:9 | x | 'x -^ Block' | +| 208 | cfg.swift:208:3:213:3 | IfExpr | 'IfExpr -V x -> < -> 0 -^ BinaryExpr' | +| 208 | cfg.swift:208:12:213:3 | Block | 'Block' | +| 209 | cfg.swift:209:5:209:5 | x | 'x -> x -? - -^ UnaryExpr -^ AssignExpr' | +| 210 | cfg.swift:210:5:212:5 | IfExpr | 'IfExpr -V x -> > -> 10 -^ BinaryExpr' | +| 210 | cfg.swift:210:15:212:5 | Block | 'Block' | +| 211 | cfg.swift:211:7:211:7 | x | 'x -> x -> - -> 1 -^ BinaryExpr -^ AssignExpr' | +| 214 | cfg.swift:214:10:214:10 | x | 'x -^ ReturnExpr' | +| 217 | cfg.swift:217:1:223:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 217 | cfg.swift:217:10:217:11 | b1 | 'b1 -> b2 -> b3 -^ Block' | +| 218 | cfg.swift:218:3:222:20 | ReturnExpr | 'ReturnExpr' | +| 218 | cfg.swift:218:10:222:20 | IfExpr | 'IfExpr -V IfExpr -V b1' | +| 219 | cfg.swift:219:13:219:14 | b2 | 'b2' | +| 220 | cfg.swift:220:13:220:14 | b3 | 'b3' | +| 221 | cfg.swift:221:9:221:18 | "b2 \|\| b3" | '"b2 \|\| b3"' | +| 222 | cfg.swift:222:9:222:20 | "!b2 \|\| !b3" | '"!b2 \|\| !b3"' | +| 225 | cfg.swift:225:1:234:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 225 | cfg.swift:225:31:225:31 | b | 'b -^ Block' | +| 226 | cfg.swift:226:3:233:3 | IfExpr | 'IfExpr -V IfExpr -V b' | +| 227 | cfg.swift:227:8:227:11 | true | 'true' | +| 228 | cfg.swift:228:7:228:10 | Bool | 'Bool -> Argument -V false -^ CallExpr' | +| 228 | cfg.swift:228:19:230:3 | Block | 'Block' | +| 229 | cfg.swift:229:12:229:14 | "b" | '"b" -^ ReturnExpr' | +| 231 | cfg.swift:231:8:233:3 | Block | 'Block' | +| 232 | cfg.swift:232:12:232:15 | "!b" | '"!b" -^ ReturnExpr' | +| 236 | cfg.swift:236:1:240:1 | Block | 'Block' | +| 236 | cfg.swift:236:1:240:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 237 | cfg.swift:237:3:239:3 | IfExpr | 'IfExpr -V UnaryExpr -V true' | +| 242 | cfg.swift:242:1:248:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 242 | cfg.swift:242:17:242:17 | b | 'b -^ Block' | +| 243 | cfg.swift:243:3:246:9 | IfExpr | 'IfExpr -V b' | +| 243 | cfg.swift:243:8:245:3 | Block | 'Block' | +| 244 | cfg.swift:244:5:244:9 | print | 'print -> Argument -V "true" -^ CallExpr' | +| 246 | cfg.swift:246:8:246:9 | Block | 'Block' | +| 247 | cfg.swift:247:3:247:7 | print | 'print -> Argument -V "done" -^ CallExpr' | +| 250 | cfg.swift:250:1:254:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 250 | cfg.swift:250:16:250:17 | b1 | 'b1 -> b2 -^ Block' | +| 251 | cfg.swift:251:3:253:3 | IfExpr | 'IfExpr -V BinaryExpr -V b1' | +| 251 | cfg.swift:251:13:251:14 | b2 | 'b2' | +| 251 | cfg.swift:251:17:253:3 | Block | 'Block' | +| 252 | cfg.swift:252:5:252:9 | print | 'print -> Argument -V "b1 or b2" -^ CallExpr' | +| 256 | cfg.swift:256:1:273:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 256 | cfg.swift:256:18:256:18 | a | 'a -> b -^ Block' | +| 257 | cfg.swift:257:3:257:15 | VariableDeclaration | 'VariableDeclaration -V c -> a -> + -> b -^ BinaryExpr' | +| 258 | cfg.swift:258:3:258:15 | VariableDeclaration | 'VariableDeclaration -V d -> a -> - -> b -^ BinaryExpr' | +| 259 | cfg.swift:259:3:259:15 | VariableDeclaration | 'VariableDeclaration -V e -> a -> * -> b -^ BinaryExpr' | +| 260 | cfg.swift:260:3:260:15 | VariableDeclaration | 'VariableDeclaration -V f -> a -> / -> b -^ BinaryExpr' | +| 261 | cfg.swift:261:3:261:15 | VariableDeclaration | 'VariableDeclaration -V g -> a -> % -> b -^ BinaryExpr' | +| 262 | cfg.swift:262:3:262:15 | VariableDeclaration | 'VariableDeclaration -V h -> a -> & -> b -^ BinaryExpr' | +| 263 | cfg.swift:263:3:263:15 | VariableDeclaration | 'VariableDeclaration -V i -> a -> \| -> b -^ BinaryExpr' | +| 264 | cfg.swift:264:3:264:15 | VariableDeclaration | 'VariableDeclaration -V j -> a -> ^ -> b -^ BinaryExpr' | +| 265 | cfg.swift:265:3:265:16 | VariableDeclaration | 'VariableDeclaration -V k -> a -> << -> b -^ BinaryExpr' | +| 266 | cfg.swift:266:3:266:16 | VariableDeclaration | 'VariableDeclaration -V l -> a -> >> -> b -^ BinaryExpr' | +| 267 | cfg.swift:267:3:267:16 | VariableDeclaration | 'VariableDeclaration -V o -> a -> == -> b -^ BinaryExpr' | +| 268 | cfg.swift:268:3:268:16 | VariableDeclaration | 'VariableDeclaration -V p -> a -> != -> b -^ BinaryExpr' | +| 269 | cfg.swift:269:3:269:15 | VariableDeclaration | 'VariableDeclaration -V q -> a -> < -> b -^ BinaryExpr' | +| 270 | cfg.swift:270:3:270:16 | VariableDeclaration | 'VariableDeclaration -V r -> a -> <= -> b -^ BinaryExpr' | +| 271 | cfg.swift:271:3:271:15 | VariableDeclaration | 'VariableDeclaration -V s -> a -> > -> b -^ BinaryExpr' | +| 272 | cfg.swift:272:3:272:16 | VariableDeclaration | 'VariableDeclaration -V t -> a -> >= -> b -^ BinaryExpr' | +| 275 | cfg.swift:275:1:277:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 275 | cfg.swift:275:25:275:25 | x | 'x -> y -^ Block' | +| 276 | cfg.swift:276:11:276:10 | | ' -> interpolation -V Argument -V x -^ CallExpr -> + -> interpolation -V Argument -V y -^ CallExpr -> is equal to -> interpolation -V Argument -V x -> + -> y -^ BinaryExpr -^ CallExpr -> and here is a zero: -> interpolation -V Argument -V returnZero -^ CallExpr -^ CallExpr -> -^ StringInterpolationExpr -^ ReturnExpr' | +| 279 | cfg.swift:279:1:310:1 | Block | 'Block' | +| 279 | cfg.swift:279:1:310:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 280 | cfg.swift:280:3:280:44 | VariableDeclaration | 'VariableDeclaration -V a -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -^ ArrayLiteral' | +| 281 | cfg.swift:281:3:281:3 | a | 'a -> Argument -V 0 -^ CallExpr -> 0 -^ AssignExpr' | +| 282 | cfg.swift:282:3:282:3 | a | 'a -> Argument -V 1 -^ CallExpr -> += -> 1 -^ CompoundAssignExpr' | +| 283 | cfg.swift:283:3:283:3 | a | 'a -> Argument -V 2 -^ CallExpr -> -= -> 1 -^ CompoundAssignExpr' | +| 284 | cfg.swift:284:3:284:3 | a | 'a -> Argument -V 3 -^ CallExpr -> *= -> 1 -^ CompoundAssignExpr' | +| 285 | cfg.swift:285:3:285:3 | a | 'a -> Argument -V 4 -^ CallExpr -> /= -> 1 -^ CompoundAssignExpr' | +| 286 | cfg.swift:286:3:286:3 | a | 'a -> Argument -V 5 -^ CallExpr -> %= -> 1 -^ CompoundAssignExpr' | +| 287 | cfg.swift:287:3:287:3 | a | 'a -> Argument -V 6 -^ CallExpr -> &= -> 1 -^ CompoundAssignExpr' | +| 288 | cfg.swift:288:3:288:3 | a | 'a -> Argument -V 7 -^ CallExpr -> \|= -> 1 -^ CompoundAssignExpr' | +| 289 | cfg.swift:289:3:289:3 | a | 'a -> Argument -V 8 -^ CallExpr -> ^= -> 1 -^ CompoundAssignExpr' | +| 290 | cfg.swift:290:3:290:3 | a | 'a -> Argument -V 9 -^ CallExpr -> <<= -> 1 -^ CompoundAssignExpr' | +| 291 | cfg.swift:291:3:291:3 | a | 'a -> Argument -V 10 -^ CallExpr -> >>= -> 1 -^ CompoundAssignExpr' | +| 293 | cfg.swift:293:3:293:49 | VariableDeclaration | 'VariableDeclaration -V tupleWithA -> Argument -V a -> Argument -V 0 -^ CallExpr -> Argument -V a -> Argument -V 1 -^ CallExpr -> Argument -V a -> Argument -V 2 -^ CallExpr -> Argument -V a -> Argument -V 3 -^ CallExpr -> Argument -V a -> Argument -V 4 -^ CallExpr -^ TupleExpr' | +| 295 | cfg.swift:295:3:295:48 | VariableDeclaration | 'VariableDeclaration -V b -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -> 11 -^ ArrayLiteral' | +| 296 | cfg.swift:296:3:296:3 | b | 'b -> Argument -V 0 -^ CallExpr -> a -> Argument -V 10 -^ CallExpr -^ AssignExpr' | +| 297 | cfg.swift:297:3:297:3 | b | 'b -> Argument -V 1 -^ CallExpr -> b -> Argument -V 0 -^ CallExpr -> + -> 1 -^ BinaryExpr -^ AssignExpr' | +| 298 | cfg.swift:298:3:298:3 | b | 'b -> Argument -V 2 -^ CallExpr -> b -> Argument -V 1 -^ CallExpr -> - -> 1 -^ BinaryExpr -^ AssignExpr' | +| 299 | cfg.swift:299:3:299:3 | b | 'b -> Argument -V 3 -^ CallExpr -> b -> Argument -V 2 -^ CallExpr -> * -> 1 -^ BinaryExpr -^ AssignExpr' | +| 300 | cfg.swift:300:3:300:3 | b | 'b -> Argument -V 4 -^ CallExpr -> b -> Argument -V 3 -^ CallExpr -> / -> 1 -^ BinaryExpr -^ AssignExpr' | +| 301 | cfg.swift:301:3:301:3 | b | 'b -> Argument -V 5 -^ CallExpr -> b -> Argument -V 4 -^ CallExpr -> % -> 1 -^ BinaryExpr -^ AssignExpr' | +| 302 | cfg.swift:302:3:302:3 | b | 'b -> Argument -V 6 -^ CallExpr -> b -> Argument -V 5 -^ CallExpr -> & -> 1 -^ BinaryExpr -^ AssignExpr' | +| 303 | cfg.swift:303:3:303:3 | b | 'b -> Argument -V 7 -^ CallExpr -> b -> Argument -V 6 -^ CallExpr -> \| -> 1 -^ BinaryExpr -^ AssignExpr' | +| 304 | cfg.swift:304:3:304:3 | b | 'b -> Argument -V 8 -^ CallExpr -> b -> Argument -V 7 -^ CallExpr -> ^ -> 1 -^ BinaryExpr -^ AssignExpr' | +| 305 | cfg.swift:305:3:305:3 | b | 'b -> Argument -V 9 -^ CallExpr -> b -> Argument -V 8 -^ CallExpr -> << -> 1 -^ BinaryExpr -^ AssignExpr' | +| 306 | cfg.swift:306:3:306:3 | b | 'b -> Argument -V 10 -^ CallExpr -> b -> Argument -V 9 -^ CallExpr -> >> -> 1 -^ BinaryExpr -^ AssignExpr' | +| 308 | cfg.swift:308:3:308:39 | VariableDeclaration | 'VariableDeclaration -V Argument -V a1 -> Argument -V a2 -> Argument -V a3 -> Argument -V a4 -> Argument -V a5 -^ TupleExpr -> tupleWithA' | +| 309 | cfg.swift:309:11:309:20 | Argument | 'Argument -V a1 -> + -> b -> Argument -V 0 -^ CallExpr -^ BinaryExpr -> Argument -V a2 -> + -> b -> Argument -V 1 -^ CallExpr -^ BinaryExpr -> Argument -V a3 -> + -> b -> Argument -V 2 -^ CallExpr -^ BinaryExpr -> Argument -V a4 -> + -> b -> Argument -V 3 -^ CallExpr -^ BinaryExpr -> Argument -V a5 -> + -> b -> Argument -V 4 -^ CallExpr -^ BinaryExpr -^ TupleExpr -^ ReturnExpr' | +| 312 | cfg.swift:312:1:317:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 312 | cfg.swift:312:12:312:12 | x | 'x -^ Block' | +| 313 | cfg.swift:313:3:316:3 | WhileStmt | 'WhileStmt' | +| 313 | cfg.swift:313:9:313:9 | x | 'x -> >= -> 0 -^ BinaryExpr' | +| 313 | cfg.swift:313:16:316:3 | Block | 'Block' | +| 314 | cfg.swift:314:5:314:9 | print | 'print -> Argument -V x -^ CallExpr' | +| 315 | cfg.swift:315:5:315:5 | x | 'x -> -= -> 1 -^ CompoundAssignExpr' | +| 319 | cfg.swift:319:1:332:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 319 | cfg.swift:319:12:319:12 | x | 'x -^ Block' | +| 320 | cfg.swift:320:3:330:3 | WhileStmt | 'WhileStmt' | +| 320 | cfg.swift:320:9:320:9 | x | 'x -> >= -> 0 -^ BinaryExpr' | +| 320 | cfg.swift:320:16:330:3 | Block | 'Block' | +| 321 | cfg.swift:321:5:321:9 | print | 'print -> Argument -V x -^ CallExpr' | +| 322 | cfg.swift:322:5:322:5 | x | 'x -> -= -> 1 -^ CompoundAssignExpr' | +| 323 | cfg.swift:323:5:328:5 | IfExpr | 'IfExpr -V x -> > -> 100 -^ BinaryExpr' | +| 323 | cfg.swift:323:16:325:5 | Block | 'Block' | +| 324 | cfg.swift:324:7:324:11 | BreakExpr | 'BreakExpr' | +| 326 | cfg.swift:326:10:328:5 | IfExpr | 'IfExpr -V x -> > -> 50 -^ BinaryExpr' | +| 326 | cfg.swift:326:20:328:5 | Block | 'Block' | +| 327 | cfg.swift:327:7:327:14 | ContinueExpr | 'ContinueExpr' | +| 329 | cfg.swift:329:5:329:9 | print | 'print -> Argument -V "Iter" -^ CallExpr' | +| 331 | cfg.swift:331:3:331:7 | print | 'print -> Argument -V "Done" -^ CallExpr' | +| 334 | cfg.swift:334:1:349:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 334 | cfg.swift:334:18:334:18 | x | 'x -^ Block' | +| 335 | cfg.swift:335:3:348:3 | LabeledStmt | 'LabeledStmt -V WhileStmt' | +| 335 | cfg.swift:335:16:335:16 | x | 'x -> >= -> 0 -^ BinaryExpr' | +| 335 | cfg.swift:335:23:348:3 | Block | 'Block' | +| 336 | cfg.swift:336:5:346:5 | LabeledStmt | 'LabeledStmt -V WhileStmt' | +| 336 | cfg.swift:336:18:336:18 | x | 'x -> >= -> 0 -^ BinaryExpr' | +| 336 | cfg.swift:336:25:346:5 | Block | 'Block' | +| 337 | cfg.swift:337:7:337:11 | print | 'print -> Argument -V x -^ CallExpr' | +| 338 | cfg.swift:338:7:338:7 | x | 'x -> -= -> 1 -^ CompoundAssignExpr' | +| 339 | cfg.swift:339:7:344:7 | IfExpr | 'IfExpr -V x -> > -> 100 -^ BinaryExpr' | +| 339 | cfg.swift:339:18:341:7 | Block | 'Block' | +| 340 | cfg.swift:340:9:340:19 | BreakExpr | 'BreakExpr' | +| 342 | cfg.swift:342:12:344:7 | IfExpr | 'IfExpr -V x -> > -> 50 -^ BinaryExpr' | +| 342 | cfg.swift:342:22:344:7 | Block | 'Block' | +| 343 | cfg.swift:343:9:343:22 | ContinueExpr | 'ContinueExpr' | +| 345 | cfg.swift:345:7:345:11 | print | 'print -> Argument -V "Iter" -^ CallExpr' | +| 347 | cfg.swift:347:5:347:9 | print | 'print -> Argument -V "Done" -^ CallExpr' | +| 351 | cfg.swift:351:1:356:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 351 | cfg.swift:351:17:351:17 | x | 'x -^ Block' | +| 352 | cfg.swift:352:3:355:16 | DoWhileStmt | 'DoWhileStmt' | +| 352 | cfg.swift:352:10:355:3 | Block | 'Block' | +| 353 | cfg.swift:353:5:353:9 | print | 'print -> Argument -V x -^ CallExpr' | +| 354 | cfg.swift:354:5:354:5 | x | 'x -> -= -> 1 -^ CompoundAssignExpr' | +| 355 | cfg.swift:355:11:355:11 | x | 'x -> >= -> 0 -^ BinaryExpr' | +| 358 | cfg.swift:358:1:363:1 | Block | 'Block' | +| 358 | cfg.swift:358:1:363:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 359 | cfg.swift:359:3:359:11 | VariableDeclaration | 'VariableDeclaration -V x -> 0' | +| 360 | cfg.swift:360:3:362:3 | WhileStmt | 'WhileStmt' | +| 360 | cfg.swift:360:9:360:9 | x | 'x -> < -> 10 -^ BinaryExpr' | +| 360 | cfg.swift:360:17:362:3 | Block | 'Block' | +| 361 | cfg.swift:361:5:361:5 | x | 'x -> += -> 1 -^ CompoundAssignExpr' | +| 365 | cfg.swift:365:1:374:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V OptionalC' | +| 366 | cfg.swift:366:3:366:11 | VariableDeclaration | 'VariableDeclaration -V c -> Optional -V C -^ GenericTypeExpr' | +| 367 | cfg.swift:367:3:369:3 | ConstructorDeclaration | 'ConstructorDeclaration' | +| 367 | cfg.swift:367:8:367:10 | arg | 'arg -^ Block' | +| 368 | cfg.swift:368:5:368:5 | c | 'c -> arg -^ AssignExpr' | +| 371 | cfg.swift:371:3:373:3 | Block | 'Block' | +| 371 | cfg.swift:371:3:373:3 | FunctionDeclaration | 'FunctionDeclaration' | +| 372 | cfg.swift:372:12:372:12 | c | 'c -^ ReturnExpr' | +| 376 | cfg.swift:376:1:378:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 376 | cfg.swift:376:19:376:19 | c | 'c -^ Block' | +| 377 | cfg.swift:377:10:377:10 | c | 'c -^ MemberAccessExpr -^ CallExpr -^ MemberAccessExpr -^ CallExpr -^ ReturnExpr' | +| 380 | cfg.swift:380:1:384:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 380 | cfg.swift:380:18:380:18 | x | 'x -> y -^ Block' | +| 381 | cfg.swift:381:10:383:3 | Block | 'Block' | +| 381 | cfg.swift:381:10:383:3 | FunctionExpr | 'FunctionExpr -^ ReturnExpr' | +| 382 | cfg.swift:382:12:382:12 | z | 'z -^ ReturnExpr' | +| 386 | cfg.swift:386:1:388:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 386 | cfg.swift:386:23:386:23 | t | 't -^ Block' | +| 387 | cfg.swift:387:10:387:10 | t | 't -^ MemberAccessExpr -> + -> t -^ MemberAccessExpr -^ BinaryExpr -> + -> t -^ MemberAccessExpr -^ BinaryExpr -> + -> Argument -V 1 -> Argument -V 2 -> Argument -V 3 -^ TupleExpr -^ MemberAccessExpr -^ BinaryExpr -^ ReturnExpr' | +| 390 | cfg.swift:390:1:394:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V Derived -^ BaseType -V C' | +| 391 | cfg.swift:391:3:393:3 | Block | 'Block' | +| 391 | cfg.swift:391:3:393:3 | ConstructorDeclaration | 'ConstructorDeclaration' | +| 392 | cfg.swift:392:5:392:9 | | ' -^ MemberAccessExpr -> Argument -V 0 -^ CallExpr' | +| 396 | cfg.swift:396:1:404:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 396 | cfg.swift:396:21:396:21 | x | 'x -^ Block' | +| 397 | cfg.swift:397:3:402:3 | TryExpr | 'TryExpr -V Block' | +| 398 | cfg.swift:398:9:398:18 | mightThrow | 'mightThrow -> Argument -V 0 -^ CallExpr -^ try -^ UnaryExpr' | +| 399 | cfg.swift:399:5:399:9 | print | 'print -> Argument -V "Did not throw." -^ CallExpr' | +| 400 | cfg.swift:400:10:400:19 | mightThrow | 'mightThrow -> Argument -V 0 -^ CallExpr -^ try! -^ UnaryExpr' | +| 401 | cfg.swift:401:5:401:9 | print | 'print -> Argument -V "Still did not throw." -^ CallExpr' | +| 403 | cfg.swift:403:10:403:10 | 0 | '0 -^ ReturnExpr' | +| 406 | cfg.swift:406:1:415:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V Structors' | +| 407 | cfg.swift:407:3:407:16 | VariableDeclaration | 'VariableDeclaration -V field -> Int' | +| 408 | cfg.swift:408:3:410:3 | Block | 'Block' | +| 408 | cfg.swift:408:3:410:3 | ConstructorDeclaration | 'ConstructorDeclaration' | +| 409 | cfg.swift:409:5:409:9 | field | 'field -> 10 -^ AssignExpr' | +| 412 | cfg.swift:412:3:414:3 | Block | 'Block' | +| 412 | cfg.swift:412:3:414:3 | DestructorDeclaration | 'DestructorDeclaration' | +| 413 | cfg.swift:413:5:413:9 | field | 'field -> 0 -^ AssignExpr' | +| 417 | cfg.swift:417:1:419:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 417 | cfg.swift:417:24:417:24 | x | 'x -> y -^ Block' | +| 418 | cfg.swift:418:10:418:25 | MapLiteral | 'MapLiteral -^ ReturnExpr' | +| 421 | cfg.swift:421:1:444:1 | Block | 'Block' | +| 421 | cfg.swift:421:1:444:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 422 | cfg.swift:422:3:427:3 | ClassLikeDeclaration | 'ClassLikeDeclaration -V MyLocalClass' | +| 423 | cfg.swift:423:5:423:14 | VariableDeclaration | 'VariableDeclaration -V x -> Int' | +| 424 | cfg.swift:424:5:426:5 | Block | 'Block' | +| 424 | cfg.swift:424:5:426:5 | ConstructorDeclaration | 'ConstructorDeclaration' | +| 425 | cfg.swift:425:7:425:7 | x | 'x -> 10 -^ AssignExpr' | +| 429 | cfg.swift:429:3:434:3 | ClassLikeDeclaration | 'ClassLikeDeclaration -V MyLocalStruct' | +| 430 | cfg.swift:430:5:430:14 | VariableDeclaration | 'VariableDeclaration -V x -> Int' | +| 431 | cfg.swift:431:5:433:5 | Block | 'Block' | +| 431 | cfg.swift:431:5:433:5 | ConstructorDeclaration | 'ConstructorDeclaration' | +| 432 | cfg.swift:432:7:432:7 | x | 'x -> 10 -^ AssignExpr' | +| 436 | cfg.swift:436:3:439:3 | ClassLikeDeclaration | 'ClassLikeDeclaration -V MyLocalEnum' | +| 437 | cfg.swift:437:10:437:10 | VariableDeclaration | 'VariableDeclaration -V A' | +| 438 | cfg.swift:438:10:438:10 | VariableDeclaration | 'VariableDeclaration -V B' | +| 441 | cfg.swift:441:3:441:22 | VariableDeclaration | 'VariableDeclaration -V myLocalVar -> Int' | +| 443 | cfg.swift:443:10:443:10 | 0 | '0 -^ ReturnExpr' | +| 446 | cfg.swift:446:1:448:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V B' | +| 447 | cfg.swift:447:3:447:13 | VariableDeclaration | 'VariableDeclaration -V x -> Int' | +| 450 | cfg.swift:450:1:454:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V A' | +| 451 | cfg.swift:451:3:451:11 | VariableDeclaration | 'VariableDeclaration -V b -> B' | +| 452 | cfg.swift:452:3:452:14 | VariableDeclaration | 'VariableDeclaration -V bs -> Array -V B -^ GenericTypeExpr' | +| 453 | cfg.swift:453:3:453:15 | VariableDeclaration | 'VariableDeclaration -V mayB -> Optional -V B -^ GenericTypeExpr' | +| 456 | cfg.swift:456:1:466:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 456 | cfg.swift:456:11:456:11 | a | 'a -^ Block' | +| 457 | cfg.swift:457:3:457:24 | VariableDeclaration | 'VariableDeclaration -V kpGet_b_x -> ' | +| 458 | cfg.swift:458:3:458:31 | VariableDeclaration | 'VariableDeclaration -V kpGet_bs_0_x -> ' | +| 459 | cfg.swift:459:3:459:37 | VariableDeclaration | 'VariableDeclaration -V kpGet_mayB_force_x -> ' | +| 460 | cfg.swift:460:3:460:31 | VariableDeclaration | 'VariableDeclaration -V kpGet_mayB_x -> ' | +| 462 | cfg.swift:462:3:462:45 | VariableDeclaration | 'VariableDeclaration -V apply_kpGet_b_x -> a -> Argument -V kpGet_b_x -^ CallExpr' | +| 463 | cfg.swift:463:3:463:51 | VariableDeclaration | 'VariableDeclaration -V apply_kpGet_bs_0_x -> a -> Argument -V kpGet_bs_0_x -^ CallExpr' | +| 464 | cfg.swift:464:3:464:63 | VariableDeclaration | 'VariableDeclaration -V apply_kpGet_mayB_force_x -> a -> Argument -V kpGet_mayB_force_x -^ CallExpr' | +| 465 | cfg.swift:465:3:465:51 | VariableDeclaration | 'VariableDeclaration -V apply_kpGet_mayB_x -> a -> Argument -V kpGet_mayB_x -^ CallExpr' | +| 468 | cfg.swift:468:1:495:1 | Block | 'Block' | +| 468 | cfg.swift:468:1:495:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 469 | cfg.swift:469:1:475:6 | | '' | +| 477 | cfg.swift:477:3:477:3 | 5 | '5' | +| 479 | cfg.swift:479:1:482:6 | | '' | +| 484 | cfg.swift:484:3:484:3 | 8 | '8' | +| 486 | cfg.swift:486:1:492:6 | | '' | +| 494 | cfg.swift:494:3:494:4 | 13 | '13' | +| 497 | cfg.swift:497:1:522:1 | Block | 'Block' | +| 497 | cfg.swift:497:1:522:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 498 | cfg.swift:498:3:498:11 | VariableDeclaration | 'VariableDeclaration -V x -> 0' | +| 500 | cfg.swift:500:3:502:3 | IfExpr | 'IfExpr -V ' | +| 500 | cfg.swift:500:30:502:3 | Block | 'Block' | +| 501 | cfg.swift:501:5:501:5 | x | 'x -> += -> 1 -^ CompoundAssignExpr' | +| 504 | cfg.swift:504:3:506:3 | IfExpr | 'IfExpr -V ' | +| 504 | cfg.swift:504:33:506:3 | Block | 'Block' | +| 505 | cfg.swift:505:5:505:5 | x | 'x -> += -> 1 -^ CompoundAssignExpr' | +| 508 | cfg.swift:508:3:510:3 | IfExpr | 'IfExpr -V ' | +| 508 | cfg.swift:508:49:510:3 | Block | 'Block' | +| 509 | cfg.swift:509:5:509:5 | x | 'x -> += -> 1 -^ CompoundAssignExpr' | +| 512 | cfg.swift:512:3:514:3 | GuardIfStmt | 'GuardIfStmt -V -> Block' | +| 513 | cfg.swift:513:5:513:5 | x | 'x -> += -> 1 -^ CompoundAssignExpr' | +| 516 | cfg.swift:516:3:519:3 | IfExpr | 'IfExpr -V BinaryExpr -V ' | +| 517 | cfg.swift:517:7:517:27 | | '' | +| 517 | cfg.swift:517:29:519:3 | Block | 'Block' | +| 518 | cfg.swift:518:5:518:5 | x | 'x -> += -> 1 -^ CompoundAssignExpr' | +| 521 | cfg.swift:521:10:521:10 | x | 'x -^ ReturnExpr' | +| 524 | cfg.swift:524:1:538:1 | Block | 'Block' | +| 524 | cfg.swift:524:1:538:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 525 | cfg.swift:525:5:533:6 | VariableDeclaration | 'VariableDeclaration -V stream -> AsyncStream -> Argument -V Int -^ MemberAccessExpr -> Argument -V . -^ MemberAccessExpr -> Argument -V 5 -^ CallExpr -> Argument -V FunctionExpr -^ CallExpr' | +| 525 | cfg.swift:525:78:533:5 | Block | 'Block' | +| 526 | cfg.swift:526:9:526:20 | continuation | 'continuation' | +| 527 | cfg.swift:527:13:527:16 | Task | 'Task -^ MemberAccessExpr -^ Argument -V FunctionExpr -^ CallExpr' | +| 527 | cfg.swift:527:27:532:13 | Block | 'Block' | +| 528 | cfg.swift:528:17:530:17 | ForEachStmt | 'ForEachStmt -V 1 -> ... -> 100 -^ BinaryExpr' | +| 528 | cfg.swift:528:21:528:21 | i | 'i -> Block' | +| 529 | cfg.swift:529:21:529:32 | continuation | 'continuation -^ MemberAccessExpr -> Argument -V i -^ CallExpr' | +| 531 | cfg.swift:531:17:531:28 | continuation | 'continuation -^ MemberAccessExpr -^ CallExpr' | +| 535 | cfg.swift:535:5:537:5 | ForEachStmt | 'ForEachStmt -V stream' | +| 535 | cfg.swift:535:19:535:19 | i | 'i -> Block' | +| 536 | cfg.swift:536:9:536:13 | print | 'print -> Argument -V i -^ CallExpr' | +| 540 | cfg.swift:540:1:544:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 540 | cfg.swift:540:24:540:24 | x | 'x -^ Block' | +| 541 | cfg.swift:541:3:543:9 | ReturnExpr | 'ReturnExpr' | +| 542 | cfg.swift:542:5:543:9 | BinaryExpr | 'BinaryExpr -V x' | +| 543 | cfg.swift:543:9:543:9 | 0 | '0' | +| 546 | cfg.swift:546:1:553:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 546 | cfg.swift:546:25:546:25 | x | 'x -^ Block' | +| 547 | cfg.swift:547:3:552:3 | IfExpr | 'IfExpr -V BinaryExpr -V x' | +| 548 | cfg.swift:548:7:548:11 | false | 'false' | +| 548 | cfg.swift:548:13:550:3 | Block | 'Block' | +| 549 | cfg.swift:549:12:549:12 | 1 | '1 -^ ReturnExpr' | +| 550 | cfg.swift:550:10:552:3 | Block | 'Block' | +| 551 | cfg.swift:551:12:551:12 | 0 | '0 -^ ReturnExpr' | +| 555 | cfg.swift:555:1:557:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 555 | cfg.swift:555:24:555:27 | expr | 'expr -^ Block' | +| 556 | cfg.swift:556:10:556:13 | expr | 'expr -^ CallExpr -^ ReturnExpr' | +| 559 | cfg.swift:559:1:561:1 | Block | 'Block' | +| 559 | cfg.swift:559:1:561:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 560 | cfg.swift:560:3:560:17 | usesAutoclosure | 'usesAutoclosure -> Argument -V 1 -^ CallExpr' | +| 565 | cfg.swift:565:1:567:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V MyProtocol' | +| 566 | cfg.swift:566:2:566:21 | Block | 'Block' | +| 566 | cfg.swift:566:2:566:21 | FunctionDeclaration | 'FunctionDeclaration' | +| 569 | cfg.swift:569:1:571:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V MyProcotolImpl -^ BaseType -V MyProtocol' | +| 570 | cfg.swift:570:2:570:34 | Block | 'Block -V 0 -^ ReturnExpr' | +| 570 | cfg.swift:570:2:570:34 | FunctionDeclaration | 'FunctionDeclaration' | +| 573 | cfg.swift:573:1:573:62 | Block | 'Block -V MyProcotolImpl -^ CallExpr -^ ReturnExpr' | +| 573 | cfg.swift:573:1:573:62 | FunctionDeclaration | 'FunctionDeclaration' | +| 574 | cfg.swift:574:1:574:70 | Block | 'Block -V MyProcotolImpl -^ CallExpr -^ ReturnExpr' | +| 574 | cfg.swift:574:1:574:70 | FunctionDeclaration | 'FunctionDeclaration' | +| 576 | cfg.swift:576:1:576:23 | FunctionDeclaration | 'FunctionDeclaration' | +| 576 | cfg.swift:576:11:576:13 | arg | 'arg -^ Block' | +| 578 | cfg.swift:578:1:583:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 578 | cfg.swift:578:30:578:30 | x | 'x -> y -^ Block' | +| 579 | cfg.swift:579:2:579:5 | sink | 'sink -> Argument -V x -^ MemberAccessExpr -^ CallExpr -^ CallExpr' | +| 580 | cfg.swift:580:2:580:5 | sink | 'sink -> Argument -V y -^ MemberAccessExpr -^ CallExpr -^ CallExpr' | +| 581 | cfg.swift:581:2:581:5 | sink | 'sink -> Argument -V getMyProtocol -^ CallExpr -^ MemberAccessExpr -^ CallExpr -^ CallExpr' | +| 582 | cfg.swift:582:2:582:5 | sink | 'sink -> Argument -V getMyProtocolImpl -^ CallExpr -^ MemberAccessExpr -^ CallExpr -^ CallExpr' | +| 585 | cfg.swift:585:1:593:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 585 | cfg.swift:585:23:585:23 | x | 'x -^ Block' | +| 586 | cfg.swift:586:3:589:3 | VariableDeclaration | 'VariableDeclaration -V a -> SwitchExpr -V x' | +| 587 | cfg.swift:587:5:587:17 | Block | 'Block -V 1' | +| 587 | cfg.swift:587:5:587:17 | SwitchCase | 'SwitchCase -V 0 -> ..< -> 5 -^ BinaryExpr' | +| 588 | cfg.swift:588:5:588:14 | SwitchCase | 'SwitchCase -V Block -V 2' | +| 590 | cfg.swift:590:3:592:18 | VariableDeclaration | 'VariableDeclaration -V b' | +| 591 | cfg.swift:591:9:592:18 | IfExpr | 'IfExpr -V x -> < -> 42 -^ BinaryExpr' | +| 591 | cfg.swift:591:21:591:25 | Block | 'Block -V 1' | +| 592 | cfg.swift:592:14:592:18 | Block | 'Block -V 2' | +| 596 | cfg.swift:596:1:598:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V ValueGenericsStruct -> TypeParameter -V N -> Int' | +| 597 | cfg.swift:597:5:597:13 | VariableDeclaration | 'VariableDeclaration -V x -> N' | +| 600 | cfg.swift:600:1:604:1 | FunctionDeclaration | 'FunctionDeclaration' | +| 600 | cfg.swift:600:36:600:40 | value | 'value -^ Block' | +| 601 | cfg.swift:601:5:601:13 | VariableDeclaration | 'VariableDeclaration -V x -> N' | +| 602 | cfg.swift:602:5:602:9 | print | 'print -> Argument -V x -^ CallExpr' | +| 603 | cfg.swift:603:5:603:5 | _ | '_ -> value -^ AssignExpr' | diff --git a/unified/ql/test/library-tests/controlflow/basicblock-slices.ql b/unified/ql/test/library-tests/controlflow/basicblock-slices.ql new file mode 100644 index 000000000000..1b57b4b5d5e2 --- /dev/null +++ b/unified/ql/test/library-tests/controlflow/basicblock-slices.ql @@ -0,0 +1,2 @@ +import unified +import ControlFlow::TestCfgInline::BlockSlices diff --git a/unified/ql/test/library-tests/controlflow/cfg.expected b/unified/ql/test/library-tests/controlflow/cfg.expected new file mode 100644 index 000000000000..fedda2b0ed23 --- /dev/null +++ b/unified/ql/test/library-tests/controlflow/cfg.expected @@ -0,0 +1,157 @@ +bbContinues +| cfg.swift:147:5:147:5 | Block | 'Block goto true(+3)' | +| cfg.swift:525:78:525:78 | Block | 'Block goto Task(+2)' | +| cfg.swift:526:9:526:20 | continuation | 'continuation goto Block(-1)' | +bbStep +| cfg.swift:140:12:140:17 | BinaryExpr | 'BinaryExpr : empty -> SwitchExpr(+3)' | +| cfg.swift:140:12:140:17 | BinaryExpr | 'BinaryExpr : non-empty -> _(+0)' | +| cfg.swift:141:9:141:12 | Block | 'Block : successor -> SwitchExpr(+2)' | +| cfg.swift:141:9:141:12 | Block | 'Block : successor -> _(-1)' | +| cfg.swift:144:5:144:5 | OrPattern | 'OrPattern : match -> Block(+0)' | +| cfg.swift:144:5:144:5 | OrPattern | 'OrPattern : no-match -> SwitchCase(+3)' | +| cfg.swift:147:10:147:10 | ConditionalPattern | 'ConditionalPattern : match -> Block(+0)' | +| cfg.swift:147:10:147:10 | ConditionalPattern | 'ConditionalPattern : no-match -> SwitchCase(+4)' | +| cfg.swift:148:10:148:15 | BinaryExpr | 'BinaryExpr : false -> x(-1)' | +| cfg.swift:148:10:148:15 | BinaryExpr | 'BinaryExpr : true -> x(+1)' | +| cfg.swift:149:13:149:17 | BinaryExpr | 'BinaryExpr : successor -> x(-2)' | +| cfg.swift:187:6:187:10 | BinaryExpr | 'BinaryExpr : false -> IfExpr(+3)' | +| cfg.swift:187:6:187:10 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | +| cfg.swift:190:11:190:16 | BinaryExpr | 'BinaryExpr : false,false,false -> Block(+5)' | +| cfg.swift:190:11:190:16 | BinaryExpr | 'BinaryExpr : true -> x(+1)' | +| cfg.swift:191:13:191:17 | BinaryExpr | 'BinaryExpr : false,false,false -> Block(+4)' | +| cfg.swift:191:13:191:17 | BinaryExpr | 'BinaryExpr : true -> UnaryExpr(+1)' | +| cfg.swift:192:15:192:20 | BinaryExpr | 'BinaryExpr : false -> Block(+0)' | +| cfg.swift:192:15:192:20 | BinaryExpr | 'BinaryExpr : true,false -> Block(+3)' | +| cfg.swift:201:6:201:6 | b | 'b : false -> 1(+3)' | +| cfg.swift:201:6:201:6 | b | 'b : true -> Block(+0)' | +| cfg.swift:208:6:208:10 | BinaryExpr | 'BinaryExpr : false -> x(+6)' | +| cfg.swift:208:6:208:10 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | +| cfg.swift:210:8:210:13 | BinaryExpr | 'BinaryExpr : false -> x(+4)' | +| cfg.swift:210:8:210:13 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | +| cfg.swift:211:7:211:15 | AssignExpr | 'AssignExpr : successor -> x(+3)' | +| cfg.swift:218:11:218:12 | b1 | 'b1 : false -> b3(+2)' | +| cfg.swift:218:11:218:12 | b1 | 'b1 : true -> b2(+1)' | +| cfg.swift:219:13:219:14 | b2 | 'b2 : false,false -> "!b2 \|\| !b3"(+3)' | +| cfg.swift:219:13:219:14 | b2 | 'b2 : true,true -> "b2 \|\| b3"(+2)' | +| cfg.swift:220:13:220:14 | b3 | 'b3 : false,false -> "!b2 \|\| !b3"(+2)' | +| cfg.swift:220:13:220:14 | b3 | 'b3 : true,true -> "b2 \|\| b3"(+1)' | +| cfg.swift:221:9:221:18 | "b2 \|\| b3" | '"b2 \|\| b3" : successor -> ReturnExpr(-3)' | +| cfg.swift:222:9:222:20 | "!b2 \|\| !b3" | '"!b2 \|\| !b3" : successor -> ReturnExpr(-4)' | +| cfg.swift:226:6:226:6 | b | 'b : false -> Bool(+2)' | +| cfg.swift:226:6:226:6 | b | 'b : true -> true(+1)' | +| cfg.swift:227:8:227:11 | true | 'true : true -> Block(+1)' | +| cfg.swift:228:7:228:17 | CallExpr | 'CallExpr : false -> Block(+3)' | +| cfg.swift:228:7:228:17 | CallExpr | 'CallExpr : true,true -> Block(+0)' | +| cfg.swift:243:6:243:6 | b | 'b : false -> Block(+3)' | +| cfg.swift:243:6:243:6 | b | 'b : true -> Block(+0)' | +| cfg.swift:244:5:244:17 | CallExpr | 'CallExpr : successor -> print(+3)' | +| cfg.swift:246:8:246:9 | Block | 'Block : successor -> print(+1)' | +| cfg.swift:251:7:251:8 | b1 | 'b1 : false -> b2(+0)' | +| cfg.swift:251:7:251:8 | b1 | 'b1 : true,true -> Block(+0)' | +| cfg.swift:251:13:251:14 | b2 | 'b2 : true,true -> Block(+0)' | +| cfg.swift:313:3:313:3 | WhileStmt | 'WhileStmt : successor -> x(+0)' | +| cfg.swift:313:9:313:14 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | +| cfg.swift:315:5:315:10 | CompoundAssignExpr | 'CompoundAssignExpr : successor -> x(-2)' | +| cfg.swift:320:3:320:3 | WhileStmt | 'WhileStmt : successor -> x(+0)' | +| cfg.swift:320:9:320:14 | BinaryExpr | 'BinaryExpr : false -> print(+11)' | +| cfg.swift:320:9:320:14 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | +| cfg.swift:323:8:323:14 | BinaryExpr | 'BinaryExpr : false -> IfExpr(+3)' | +| cfg.swift:323:8:323:14 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | +| cfg.swift:324:7:324:11 | BreakExpr | 'BreakExpr : break -> print(+7)' | +| cfg.swift:326:13:326:18 | BinaryExpr | 'BinaryExpr : false -> print(+3)' | +| cfg.swift:326:13:326:18 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | +| cfg.swift:327:7:327:14 | ContinueExpr | 'ContinueExpr : continue -> x(-7)' | +| cfg.swift:329:5:329:17 | CallExpr | 'CallExpr : successor -> x(-9)' | +| cfg.swift:335:10:335:10 | WhileStmt | 'WhileStmt : successor -> x(+0)' | +| cfg.swift:335:16:335:21 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | +| cfg.swift:336:12:336:12 | WhileStmt | 'WhileStmt : successor -> x(+0)' | +| cfg.swift:336:18:336:23 | BinaryExpr | 'BinaryExpr : false -> print(+11)' | +| cfg.swift:336:18:336:23 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | +| cfg.swift:339:10:339:16 | BinaryExpr | 'BinaryExpr : false -> IfExpr(+3)' | +| cfg.swift:339:10:339:16 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | +| cfg.swift:342:15:342:20 | BinaryExpr | 'BinaryExpr : false -> print(+3)' | +| cfg.swift:342:15:342:20 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | +| cfg.swift:343:9:343:22 | ContinueExpr | 'ContinueExpr : continue -> x(-7)' | +| cfg.swift:345:7:345:19 | CallExpr | 'CallExpr : successor -> x(-9)' | +| cfg.swift:347:5:347:17 | CallExpr | 'CallExpr : successor -> x(-12)' | +| cfg.swift:352:3:352:3 | DoWhileStmt | 'DoWhileStmt : successor -> Block(+0)' | +| cfg.swift:355:11:355:16 | BinaryExpr | 'BinaryExpr : true -> Block(-3)' | +| cfg.swift:360:3:360:3 | WhileStmt | 'WhileStmt : successor -> x(+0)' | +| cfg.swift:360:9:360:14 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | +| cfg.swift:361:5:361:10 | CompoundAssignExpr | 'CompoundAssignExpr : successor -> x(-1)' | +| cfg.swift:500:6:500:28 | | ' : false -> IfExpr(+4)' | +| cfg.swift:500:6:500:28 | | ' : true -> Block(+0)' | +| cfg.swift:501:5:501:10 | CompoundAssignExpr | 'CompoundAssignExpr : successor -> IfExpr(+3)' | +| cfg.swift:504:6:504:31 | | ' : false -> IfExpr(+4)' | +| cfg.swift:504:6:504:31 | | ' : true -> Block(+0)' | +| cfg.swift:505:5:505:10 | CompoundAssignExpr | 'CompoundAssignExpr : successor -> IfExpr(+3)' | +| cfg.swift:508:6:508:47 | | ' : false -> GuardIfStmt(+4)' | +| cfg.swift:508:6:508:47 | | ' : true -> Block(+0)' | +| cfg.swift:509:5:509:10 | CompoundAssignExpr | 'CompoundAssignExpr : successor -> GuardIfStmt(+3)' | +| cfg.swift:516:6:516:28 | | ' : false,false -> x(+5)' | +| cfg.swift:516:6:516:28 | | ' : true -> (+1)' | +| cfg.swift:517:7:517:27 | | ' : false,false -> x(+4)' | +| cfg.swift:517:7:517:27 | | ' : true -> Block(+0)' | +| cfg.swift:518:5:518:10 | CompoundAssignExpr | 'CompoundAssignExpr : successor -> x(+3)' | +| cfg.swift:528:26:528:32 | BinaryExpr | 'BinaryExpr : empty -> continuation(+3)' | +| cfg.swift:528:26:528:32 | BinaryExpr | 'BinaryExpr : non-empty -> i(+0)' | +| cfg.swift:529:21:529:41 | CallExpr | 'CallExpr : successor -> continuation(+2)' | +| cfg.swift:529:21:529:41 | CallExpr | 'CallExpr : successor -> i(-1)' | +| cfg.swift:535:24:535:29 | stream | 'stream : non-empty -> i(+0)' | +| cfg.swift:536:9:536:16 | CallExpr | 'CallExpr : successor -> i(-1)' | +| cfg.swift:542:5:542:5 | x | 'x : non-null -> ReturnExpr(-1)' | +| cfg.swift:542:5:542:5 | x | 'x : null -> 0(+1)' | +| cfg.swift:543:9:543:9 | 0 | '0 : successor -> ReturnExpr(-2)' | +| cfg.swift:547:6:547:6 | x | 'x : non-null,false -> Block(+3)' | +| cfg.swift:547:6:547:6 | x | 'x : non-null,true -> Block(+1)' | +| cfg.swift:547:6:547:6 | x | 'x : null -> false(+1)' | +| cfg.swift:548:7:548:11 | false | 'false : false -> Block(+2)' | +| cfg.swift:587:10:587:14 | BinaryExpr | 'BinaryExpr : match -> Block(+0)' | +| cfg.swift:587:10:587:14 | BinaryExpr | 'BinaryExpr : no-match -> SwitchCase(+1)' | +| cfg.swift:587:17:587:17 | 1 | '1 : successor -> VariableDeclaration(+3)' | +| cfg.swift:588:14:588:14 | 2 | '2 : successor -> VariableDeclaration(+2)' | +| cfg.swift:591:13:591:18 | BinaryExpr | 'BinaryExpr : false -> Block(+1)' | +| cfg.swift:591:13:591:18 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | +noCfg +| cfg.swift:23:9:23:9 | x | +| cfg.swift:24:5:24:42 | ThrowExpr | +| cfg.swift:35:11:35:17 | MyError | +| cfg.swift:36:5:36:12 | ReturnExpr | +| cfg.swift:37:11:37:17 | MyError | +| cfg.swift:38:5:38:20 | ReturnExpr | +| cfg.swift:39:11:39:20 | | +| cfg.swift:40:5:40:9 | print | +| cfg.swift:42:5:42:9 | print | +| cfg.swift:47:42:47:47 | String | +| cfg.swift:53:34:53:34 | _ | +| cfg.swift:60:34:60:34 | _ | +| cfg.swift:66:6:66:17 | callClosures | +| cfg.swift:77:6:77:27 | forceAndBackToOptional | +| cfg.swift:83:6:83:14 | testInOut | +| cfg.swift:106:8:106:15 | getMyInt | +| cfg.swift:146:7:146:17 | ReturnExpr | +| cfg.swift:155:3:155:5 | var | +| cfg.swift:156:6:156:8 | obj | +| cfg.swift:157:5:157:15 | ReturnExpr | +| cfg.swift:160:3:160:5 | let | +| cfg.swift:161:6:161:34 | PatternGuardExpr | +| cfg.swift:162:5:162:17 | ReturnExpr | +| cfg.swift:164:5:164:16 | ReturnExpr | +| cfg.swift:236:6:236:23 | constant_condition | +| cfg.swift:238:5:238:9 | print | +| cfg.swift:279:6:279:22 | testSubscriptExpr | +| cfg.swift:358:6:358:28 | loop_with_identity_expr | +| cfg.swift:371:8:371:18 | getOptional | +| cfg.swift:380:45:380:47 | Int | +| cfg.swift:381:13:381:13 | z | +| cfg.swift:421:6:421:22 | localDeclarations | +| cfg.swift:468:6:468:17 | testIfConfig | +| cfg.swift:497:6:497:18 | testAvailable | +| cfg.swift:524:6:524:17 | testAsyncFor | +| cfg.swift:559:6:559:20 | autoclosureTest | +nonSimple +| cfg.swift:10:1:10:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V MyError -^ BaseType -V Error' | +| cfg.swift:209:5:209:5 | x | 'x -> x -? - -^ UnaryExpr -^ AssignExpr' | +| cfg.swift:390:1:390:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V Derived -^ BaseType -V C' | +| cfg.swift:527:13:527:16 | Task | 'Task -^ MemberAccessExpr -^ Argument -V FunctionExpr -^ CallExpr' | +| cfg.swift:569:1:569:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V MyProcotolImpl -^ BaseType -V MyProtocol' | diff --git a/unified/ql/test/library-tests/controlflow/cfg.ql b/unified/ql/test/library-tests/controlflow/cfg.ql new file mode 100644 index 000000000000..e86a681954e8 --- /dev/null +++ b/unified/ql/test/library-tests/controlflow/cfg.ql @@ -0,0 +1,2 @@ +import unified +import ControlFlow::TestCfgInline diff --git a/unified/ql/test/library-tests/controlflow/cfg.qlref b/unified/ql/test/library-tests/controlflow/cfg.qlref new file mode 100644 index 000000000000..d1b031838715 --- /dev/null +++ b/unified/ql/test/library-tests/controlflow/cfg.qlref @@ -0,0 +1,2 @@ +query: cfg.ql +postprocess: utils/test/InlineExpectationsTestQuery.ql diff --git a/unified/ql/test/library-tests/controlflow/cfg.swift b/unified/ql/test/library-tests/controlflow/cfg.swift new file mode 100644 index 000000000000..db2d1cb9394d --- /dev/null +++ b/unified/ql/test/library-tests/controlflow/cfg.swift @@ -0,0 +1,604 @@ +var topLevelDecl : Int = 0 +0 +topLevelDecl + 1 + +func returnZero() -> Int { return 0 } + +returnZero() +Double(topLevelDecl) + +enum MyError: Error { // $ nonSimple='ClassLikeDeclaration -V MyError -^ BaseType -V Error' + case error1, error2 + case error3(withParam: Int) +} + +func isZero(x : Int) -> Bool { + return x == 0 +} + +func mightThrow(x : Int) throws -> Void { + guard x >= 0 else { + throw MyError.error1 + } + guard x <= 0 else { // $ noCfg + throw MyError.error3(withParam: x + 1) // $ noCfg + } +} + +func tryCatch(x : Int) -> Int { + do { + try mightThrow(x: 0) + print("Did not throw.") + try! mightThrow(x: 0) + print("Still did not throw.") + + } catch MyError.error1 , MyError.error2 where isZero(x: x) { // $ noCfg + return 0 // $ noCfg + } catch MyError.error3(let withParam) { // $ noCfg + return withParam // $ noCfg + } catch is MyError { // $ noCfg + print("MyError") // $ noCfg + } catch { + print("Unknown error \(error)") // $ noCfg + } + return 0 +} + +func createClosure1(s : String) -> () -> String { // $ noCfg + return { + return s + "" + } +} + +func createClosure2(x : Int) -> (_ : Int) -> Int { // $ noCfg + func f(y : Int) -> Int { + return x + y + } + return f +} + +func createClosure3(x : Int) -> (_ : Int) -> Int { // $ noCfg + return { + (y) -> Int in x + y + } +} + +func callClosures() { // $ noCfg + var x1 = createClosure1(s: "")() + var x2 = createClosure2(x: 0)(10) + var x3 = createClosure3(x: 0)(10) +} + +func maybeParseInt(s : String) -> Int? { + var n : Int? = Int(s) + return n +} + +func forceAndBackToOptional() -> Int? { // $ noCfg + var nBang = maybeParseInt(s:"42")! + var n = maybeParseInt(s:"42") + return nBang + n! +} + +func testInOut() -> Int { // $ noCfg + var temp = 10 + + func add(a: inout Int) { + a = a + 1 + } + + func addOptional(a: inout Int?) { + a = nil + } + + add(a:&temp) + var tempOptional : Int? = 10 + addOptional(a:&tempOptional) + return temp + tempOptional! +} + +class C { + let myInt: Int + init(n: Int) { + myInt = n + } + + func getMyInt() -> Int { // $ noCfg + return myInt + } +} + +func testMemberRef(param : C, inoutParam : inout C, opt : C?) { + let c = C(n: 42) + let n1 = c.myInt + let n2 = c.self.myInt + let n3 = c.getMyInt() + let n4 = c.self.getMyInt() + let n5 = param.myInt + let n6 = param.self.myInt + + let n8 = param.self.getMyInt() + + let n9 = inoutParam.myInt + let n7 = param.getMyInt() + let n10 = inoutParam.self.myInt + let n11 = inoutParam.getMyInt() + let n12 = inoutParam.self.getMyInt() + + let n13 = opt!.myInt + let n14 = opt!.self.myInt + let n15 = opt!.getMyInt() + let n16 = opt!.self.getMyInt() + + let n17 = opt?.myInt + let n18 = opt?.self.myInt + let n19 = opt?.getMyInt() + let n20 = opt?.self.getMyInt() +} + +func patterns(x : Int) -> Bool { + for _ in 0...10 // $ bbStep='BinaryExpr : empty -> SwitchExpr(+3)' bbStep='BinaryExpr : non-empty -> _(+0)' + { } // $ bbStep='Block : successor -> _(-1)' bbStep='Block : successor -> SwitchExpr(+2)' + + switch x { + case 0, 1: // $ bbStep='OrPattern : match -> Block(+0)' bbStep='OrPattern : no-match -> SwitchCase(+3)' + return true + return true // $ noCfg + case x where // $ bbContinues='Block goto true(+3)' bbStep='ConditionalPattern : match -> Block(+0)' bbStep='ConditionalPattern : no-match -> SwitchCase(+4)' + (x >= 2) && // $ bbStep='BinaryExpr : false -> x(-1)' bbStep='BinaryExpr : true -> x(+1)' + x < 5: // $ bbStep='BinaryExpr : successor -> x(-2)' + return true + default: + return false + } + + var obj : AnyObject = C(n: x) // $ noCfg + if obj is C { // $ noCfg + return true // $ noCfg + } + + let xOptional: Int? = x // $ noCfg + if case .some(let x) = xOptional { // $ noCfg + return x == 0 // $ noCfg + } else { + return false // $ noCfg + } +} + +func testDefer(x : inout Int) { + // Will print 1, 2, 3, 4 + defer { + print("4") + } + + defer { + print("3") + } + + defer { + print("1") + defer { + print("2") + } + } +} + +func m1(x : Int) { + if x > 2 { // $ bbStep='BinaryExpr : false -> IfExpr(+3)' bbStep='BinaryExpr : true -> Block(+0)' + print("x is greater than 2") + } + else if x <= 2 && // $ bbStep='BinaryExpr : true -> x(+1)' bbStep='BinaryExpr : false,false,false -> Block(+5)' + x > 0 && // $ bbStep='BinaryExpr : true -> UnaryExpr(+1)' bbStep='BinaryExpr : false,false,false -> Block(+4)' + !(x == 5) { // $ bbStep='BinaryExpr : false -> Block(+0)' bbStep='BinaryExpr : true,false -> Block(+3)' + print("x is 1") + } + else { + print("I can't guess the number") + } +} + +func m2(b : Bool) -> Int { + if b { // $ bbStep='b : false -> 1(+3)' bbStep='b : true -> Block(+0)' + return 0 + } + return 1 +} + +func m3(x : inout Int) -> Int { + if x < 0 { // $ bbStep='BinaryExpr : true -> Block(+0)' bbStep='BinaryExpr : false -> x(+6)' + x = -x // $ nonSimple='x -> x -? - -^ UnaryExpr -^ AssignExpr' + if x > 10 { // $ bbStep='BinaryExpr : true -> Block(+0)' bbStep='BinaryExpr : false -> x(+4)' + x = x - 1 // $ bbStep='AssignExpr : successor -> x(+3)' + } + } + return x +} + +func m4 (b1 : Bool, b2 : Bool, b3 : Bool) -> String { + return (b1 ? // $ bbStep='b1 : false -> b3(+2)' bbStep='b1 : true -> b2(+1)' + b2 : // $ bbStep='b2 : false,false -> "!b2 \|\| !b3"(+3)' bbStep='b2 : true,true -> "b2 \|\| b3"(+2)' + b3) ? // $ bbStep='b3 : false,false -> "!b2 \|\| !b3"(+2)' bbStep='b3 : true,true -> "b2 \|\| b3"(+1)' + "b2 || b3" : // $ bbStep='"b2 \|\| b3" : successor -> ReturnExpr(-3)' + "!b2 || !b3" // $ bbStep='"!b2 \|\| !b3" : successor -> ReturnExpr(-4)' +} + +func conversionsInSplitEntry (b : Bool) -> String { + if b ? // $ bbStep='b : false -> Bool(+2)' bbStep='b : true -> true(+1)' + (true) : // $ bbStep='true : true -> Block(+1)' + Bool(false) { // $ bbStep='CallExpr : true,true -> Block(+0)' bbStep='CallExpr : false -> Block(+3)' + return "b" + } + else { + return "!b" + } +} + +func constant_condition() { // $ noCfg + if !true { + print("Impossible") // $ noCfg + } +} + +func empty_else(b : Bool) { + if b { // $ bbStep='b : false -> Block(+3)' bbStep='b : true -> Block(+0)' + print("true") // $ bbStep='CallExpr : successor -> print(+3)' + } + else {} // $ bbStep='Block : successor -> print(+1)' + print("done") +} + +func disjunct (b1 : Bool, b2 : Bool) { + if (b1 || b2) { // $ bbStep='b1 : false -> b2(+0)' bbStep='b1 : true,true -> Block(+0)' bbStep='b2 : true,true -> Block(+0)' + print("b1 or b2") + } +} + +func binaryExprs(a : Int, b : Int) { + let c = a + b + let d = a - b + let e = a * b + let f = a / b + let g = a % b + let h = a & b + let i = a | b + let j = a ^ b + let k = a << b + let l = a >> b + let o = a == b + let p = a != b + let q = a < b + let r = a <= b + let s = a > b + let t = a >= b +} + +func interpolatedString(x : Int, y : Int) -> String { + return "\(x) + \(y) is equal to \(x + y) and here is a zero: \(returnZero())" +} + +func testSubscriptExpr() -> (Int, Int, Int, Int, Int) { // $ noCfg + var a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] + a[0] = 0 + a[1] += 1 + a[2] -= 1 + a[3] *= 1 + a[4] /= 1 + a[5] %= 1 + a[6] &= 1 + a[7] |= 1 + a[8] ^= 1 + a[9] <<= 1 + a[10] >>= 1 + + var tupleWithA = (a[0], a[1], a[2], a[3], a[4]) + + var b = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + b[0] = a[10] + b[1] = b[0] + 1 + b[2] = b[1] - 1 + b[3] = b[2] * 1 + b[4] = b[3] / 1 + b[5] = b[4] % 1 + b[6] = b[5] & 1 + b[7] = b[6] | 1 + b[8] = b[7] ^ 1 + b[9] = b[8] << 1 + b[10] = b[9] >> 1 + + let (a1, a2, a3, a4, a5) = tupleWithA + return (a1 + b[0], a2 + b[1], a3 + b[2], a4 + b[3], a5 + b[4]) +} + +func loop1(x : inout Int) { + while x >= 0 { // $ bbStep='WhileStmt : successor -> x(+0)' bbStep='BinaryExpr : true -> Block(+0)' + print(x) + x -= 1 // $ bbStep='CompoundAssignExpr : successor -> x(-2)' + } +} + +func loop2(x : inout Int) { + while x >= 0 { // $ bbStep='WhileStmt : successor -> x(+0)' bbStep='BinaryExpr : false -> print(+11)' bbStep='BinaryExpr : true -> Block(+0)' + print(x) + x -= 1 + if x > 100 { // $ bbStep='BinaryExpr : false -> IfExpr(+3)' bbStep='BinaryExpr : true -> Block(+0)' + break // $ bbStep='BreakExpr : break -> print(+7)' + } + else if x > 50 { // $ bbStep='BinaryExpr : false -> print(+3)' bbStep='BinaryExpr : true -> Block(+0)' + continue // $ bbStep='ContinueExpr : continue -> x(-7)' + } + print("Iter") // $ bbStep='CallExpr : successor -> x(-9)' + } + print("Done") +} + +func labeledLoop(x : inout Int) { + outer: while x >= 0 { // $ bbStep='WhileStmt : successor -> x(+0)' bbStep='BinaryExpr : true -> Block(+0)' + inner: while x >= 0 { // $ bbStep='BinaryExpr : false -> print(+11)' bbStep='WhileStmt : successor -> x(+0)' bbStep='BinaryExpr : true -> Block(+0)' + print(x) + x -= 1 + if x > 100 { // $ bbStep='BinaryExpr : false -> IfExpr(+3)' bbStep='BinaryExpr : true -> Block(+0)' + break outer + } + else if x > 50 { // $ bbStep='BinaryExpr : false -> print(+3)' bbStep='BinaryExpr : true -> Block(+0)' + continue inner // $ bbStep='ContinueExpr : continue -> x(-7)' + } + print("Iter") // $ bbStep='CallExpr : successor -> x(-9)' + } + print("Done") // $ bbStep='CallExpr : successor -> x(-12)' + } +} + +func testRepeat(x : inout Int) { + repeat { // $ bbStep='DoWhileStmt : successor -> Block(+0)' + print(x) + x -= 1 + } while x >= 0 // $ bbStep='BinaryExpr : true -> Block(-3)' +} + +func loop_with_identity_expr() { // $ noCfg + var x = 0 + while(x < 10) { // $ bbStep='WhileStmt : successor -> x(+0)' bbStep='BinaryExpr : true -> Block(+0)' + x += 1 // $ bbStep='CompoundAssignExpr : successor -> x(-1)' + } +} + +class OptionalC { + let c: C? + init(arg: C?) { + c = arg + } + + func getOptional() -> C? { // $ noCfg + return c + } +} + +func testOptional(c : OptionalC?) -> Int? { + return c?.getOptional()?.getMyInt() +} + +func testCapture(x : Int, y : Int) -> () -> Int { // $ noCfg + return { [z = x + y, t = "literal"] in // $ noCfg + return z + } +} + +func testTupleElement(t : (a: Int, Int, c: Int)) -> Int { + return t.a + t.1 + t.c + (1, 2, 3).0 +} + +class Derived : C { // $ nonSimple='ClassLikeDeclaration -V Derived -^ BaseType -V C' + init() { + super.init(n: 0) + } +} + +func doWithoutCatch(x : Int) throws -> Int { + do { + try mightThrow(x: 0) + print("Did not throw.") + try! mightThrow(x: 0) + print("Still did not throw.") + } + return 0 +} + +class Structors { + var field: Int + init() { + field = 10 + } + + deinit { + field = 0 + } +} + +func dictionaryLiteral(x: Int, y: Int) -> [String: Int] { + return ["x": x, "y": y] +} + +func localDeclarations() -> Int { // $ noCfg + class MyLocalClass { + var x: Int + init() { + x = 10 + } + } + + struct MyLocalStruct { + var x: Int + init() { + x = 10 + } + } + + enum MyLocalEnum { + case A + case B + } + + var myLocalVar : Int; + + return 0 +} + +struct B { + var x : Int +} + +struct A { + var b : B + var bs : [B] + var mayB : B? +} + +func test(a : A) { + var kpGet_b_x = \A.b.x + var kpGet_bs_0_x = \A.bs[0].x + var kpGet_mayB_force_x = \A.mayB!.x + var kpGet_mayB_x = \A.mayB?.x + + var apply_kpGet_b_x = a[keyPath: kpGet_b_x] + var apply_kpGet_bs_0_x = a[keyPath: kpGet_bs_0_x] + var apply_kpGet_mayB_force_x = a[keyPath: kpGet_mayB_force_x] + var apply_kpGet_mayB_x = a[keyPath: kpGet_mayB_x] +} + +func testIfConfig() { // $ noCfg +#if FOO + 1 + 2 +#else + 3 + 4 +#endif + + 5 + +#if BAR + 6 + 7 +#endif + + 8 + +#if FOO + 9 + 10 +#elseif true + 11 + 12 +#endif + + 13 +} + +func testAvailable() -> Int { // $ noCfg + var x = 0; + + if #available(macOS 10, *) { // $ bbStep=' : false -> IfExpr(+4)' bbStep=' : true -> Block(+0)' + x += 1 // $ bbStep='CompoundAssignExpr : successor -> IfExpr(+3)' + } + + if #available(macOS 10.13, *) { // $ bbStep=' : false -> IfExpr(+4)' bbStep=' : true -> Block(+0)' + x += 1 // $ bbStep='CompoundAssignExpr : successor -> IfExpr(+3)' + } + + if #unavailable(iOS 10, watchOS 10, macOS 10) { // $ bbStep=' : false -> GuardIfStmt(+4)' bbStep=' : true -> Block(+0)' + x += 1 // $ bbStep='CompoundAssignExpr : successor -> GuardIfStmt(+3)' + } + + guard #available(macOS 12, *) else { + x += 1 + } + + if #available(macOS 12, *), // $ bbStep=' : true -> (+1)' bbStep=' : false,false -> x(+5)' + #available(iOS 12, *) { // $ bbStep=' : false,false -> x(+4)' bbStep=' : true -> Block(+0)' + x += 1 // $ bbStep='CompoundAssignExpr : successor -> x(+3)' + } + + return x +} + +func testAsyncFor () async { // $ noCfg + var stream = AsyncStream(Int.self, bufferingPolicy: .bufferingNewest(5), { // $ bbContinues='Block goto Task(+2)' + continuation in // $ bbContinues='continuation goto Block(-1)' + Task.detached { // $ nonSimple='Task -^ MemberAccessExpr -^ Argument -V FunctionExpr -^ CallExpr' + for i in 1...100 { // $ bbStep='BinaryExpr : empty -> continuation(+3)' bbStep='BinaryExpr : non-empty -> i(+0)' + continuation.yield(i) // $ bbStep='CallExpr : successor -> continuation(+2)' bbStep='CallExpr : successor -> i(-1)' + } + continuation.finish() + } + }) + + for try await i in stream { // $ bbStep='stream : non-empty -> i(+0)' + print(i) // $ bbStep='CallExpr : successor -> i(-1)' + } +} + +func testNilCoalescing(x: Int?) -> Int { + return + x ?? // $ bbStep='x : non-null -> ReturnExpr(-1)' bbStep='x : null -> 0(+1)' + 0 // $ bbStep='0 : successor -> ReturnExpr(-2)' +} + +func testNilCoalescing2(x: Bool?) -> Int { + if x ?? // $ bbStep='x : non-null,false -> Block(+3)' bbStep='x : non-null,true -> Block(+1)' bbStep='x : null -> false(+1)' + false { // $ bbStep='false : false -> Block(+2)' + return 1 + } else { + return 0 + } +} + +func usesAutoclosure(_ expr: @autoclosure () -> Int) -> Int { + return expr() +} + +func autoclosureTest() { // $ noCfg + usesAutoclosure(1) +} + +// --- + +protocol MyProtocol { + func source() -> Int +} + +class MyProcotolImpl : MyProtocol { // $ nonSimple='ClassLikeDeclaration -V MyProcotolImpl -^ BaseType -V MyProtocol' + func source() -> Int { return 0 } +} + +func getMyProtocol() -> MyProtocol { return MyProcotolImpl() } +func getMyProtocolImpl() -> MyProcotolImpl { return MyProcotolImpl() } + +func sink(arg: Int) { } + +func testOpenExistentialExpr(x: MyProtocol, y: MyProcotolImpl) { + sink(arg: x.source()) + sink(arg: y.source()) + sink(arg: getMyProtocol().source()) + sink(arg: getMyProtocolImpl().source()) +} + +func singleStmtExpr(_ x: Int) { + let a = switch x { + case 0..<5: 1 // $ bbStep='BinaryExpr : match -> Block(+0)' bbStep='BinaryExpr : no-match -> SwitchCase(+1)' bbStep='1 : successor -> VariableDeclaration(+3)' + default: 2 // $ bbStep='2 : successor -> VariableDeclaration(+2)' + } + let b = + if (x < 42) { 1 } // $ bbStep='BinaryExpr : false -> Block(+1)' bbStep='BinaryExpr : true -> Block(+0)' + else { 2 } +} +// --- + +struct ValueGenericsStruct { + var x = N; +} + +func valueGenericsFn(_ value: ValueGenericsStruct) { + var x = N; + print(x); + _ = value; +} From d4843fa5ac0af0b6c1b94933750b9de626e55ae2 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 14 Sep 2026 15:17:08 +0200 Subject: [PATCH 0925/2098] Apply suggestion from @hvitved Co-authored-by: Tom Hvitved --- csharp/ql/lib/Linq/Helpers.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csharp/ql/lib/Linq/Helpers.qll b/csharp/ql/lib/Linq/Helpers.qll index 932086cb6f8b..1657e812c268 100644 --- a/csharp/ql/lib/Linq/Helpers.qll +++ b/csharp/ql/lib/Linq/Helpers.qll @@ -122,7 +122,7 @@ private predicate acceptableForLinqCapture(Expr e) { p = pa.getTarget() and pa = e.getAChildExpr*() | - (p.isOutOrRef() or p.isIn() or p.isReadonlyRef()) + p.isOutOrRef() or p.isIn() or p.isReadonlyRef() ) } From 281cd004170944d5734d89e5c226535029f81dfa Mon Sep 17 00:00:00 2001 From: Asger F Date: Mon, 14 Sep 2026 15:33:45 +0200 Subject: [PATCH 0926/2098] unified: Update corpus test output --- unified/extractor/tests/corpus/swift/types/extension.output | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/extractor/tests/corpus/swift/types/extension.output b/unified/extractor/tests/corpus/swift/types/extension.output index 3b0621788175..76dedcdcd909 100644 --- a/unified/extractor/tests/corpus/swift/types/extension.output +++ b/unified/extractor/tests/corpus/swift/types/extension.output @@ -70,7 +70,7 @@ top_level stmt: class_like_declaration modifier: modifier "extension" - name_node: identifier "Int" + extension_target: identifier "Int" member: function_declaration name_node: identifier "squared" From fb1456394566118bc3120a50235c3ba9d874bfc4 Mon Sep 17 00:00:00 2001 From: Asger F Date: Mon, 14 Sep 2026 15:56:52 +0200 Subject: [PATCH 0927/2098] unified: Fix comment --- unified/extractor/src/languages/swift/swift.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/unified/extractor/src/languages/swift/swift.rs b/unified/extractor/src/languages/swift/swift.rs index ad690fb37a11..4780129ba8d5 100644 --- a/unified/extractor/src/languages/swift/swift.rs +++ b/unified/extractor/src/languages/swift/swift.rs @@ -1266,10 +1266,7 @@ fn translation_rules() -> Vec> { base_type: {bases.into_iter().map(|ty| tree!((base_type type: {ty})))} member: {members}) ), - // An `extension Foo { … }` is likewise a `class_like_declaration`, named - // by the extended type. The extended type is captured opaquely (as its - // source text) so that qualified names (`extension String.Interpolation`, - // a `memberType`) name the declaration just like simple ones. + // An `extension Foo.Bar { … }` is likewise a `class_like_declaration`. rule!( (extensionDecl extensionKeyword: @kind From ffdd2a484fb6f005b4d28d56ccf53ca845afe7c9 Mon Sep 17 00:00:00 2001 From: Asger F Date: Mon, 14 Sep 2026 16:15:00 +0200 Subject: [PATCH 0928/2098] unified: Include extension steps in debug view --- unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll | 3 +++ 1 file changed, 3 insertions(+) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 8d1e3519a409..679b90b8808e 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -505,6 +505,9 @@ module DebugGraph { or inheritanceStep(node1, node2) and value = "inheritedBy" + or + extensionStep(node1, node2) and + value = "extensionOf" ) } } From e5034d974b4810e0184ec157f49c26589f0519b7 Mon Sep 17 00:00:00 2001 From: Asger F Date: Mon, 14 Sep 2026 16:16:43 +0200 Subject: [PATCH 0929/2098] unified: Update test case to be valid Swift An extension can add protocols as base, but not classes. Expanding the test a bit to target a protocol-base and also extension the protocol to add a method with a "default" implementation. --- .../static-name-binding/extensions.swift | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/unified/ql/test/library-tests/static-name-binding/extensions.swift b/unified/ql/test/library-tests/static-name-binding/extensions.swift index 3b1a5e603c69..080357c1bf4a 100644 --- a/unified/ql/test/library-tests/static-name-binding/extensions.swift +++ b/unified/ql/test/library-tests/static-name-binding/extensions.swift @@ -36,14 +36,17 @@ extension B { // $ access=B } } -// Inheritance through extension -class Base { - func baseMethod() { - } +// Protocol conformance through extension +protocol Base { + func baseMethod(); +} +extension Base { // $ access=Base + func baseMethodExt() {} // name=Base.baseMethodExt } class X { func xMethod() { baseMethod() // $ access=Base.baseMethod + baseMethodExt() // $ access=Base.baseMethodExt } } extension X : Base {} // $ access=X access=Base From 5bbae07bd21add2180346a7499243fdfea5c619c Mon Sep 17 00:00:00 2001 From: Asger F Date: Mon, 14 Sep 2026 17:17:17 +0200 Subject: [PATCH 0930/2098] unified: Add tests for missing features --- .../test/library-tests/static-name-binding/extensions.swift | 6 ++++++ .../package1/Sources/Target1/File1.swift | 6 ++++++ .../package1/Sources/Target2/File3.swift | 6 ++++++ 3 files changed, 18 insertions(+) diff --git a/unified/ql/test/library-tests/static-name-binding/extensions.swift b/unified/ql/test/library-tests/static-name-binding/extensions.swift index 080357c1bf4a..13564ac753e7 100644 --- a/unified/ql/test/library-tests/static-name-binding/extensions.swift +++ b/unified/ql/test/library-tests/static-name-binding/extensions.swift @@ -50,3 +50,9 @@ class X { } } extension X : Base {} // $ access=X access=Base + +// Type parameters of the extended type should be in scope in the extension. +class GenericExtensionTarget {} +extension GenericExtensionTarget { // $ access=GenericExtensionTarget + func useTypeParameter(_: ExtensionTypeParameter) {} // $ MISSING: access=ExtensionTypeParameter +} diff --git a/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target1/File1.swift b/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target1/File1.swift index 6e807bcf5dba..c2a289cc989a 100644 --- a/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target1/File1.swift +++ b/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target1/File1.swift @@ -1,2 +1,8 @@ let x: A; // $ access=Target1.A let y: Target2.A; // not a valid reference + +public class ScopedExtensionTarget { + func useExtensionFromUnimportedModule() { + target2ExtensionMethod() // $ SPURIOUS: access=Target1.ScopedExtensionTarget.target2ExtensionMethod + } +} diff --git a/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target2/File3.swift b/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target2/File3.swift index 8309118a867b..1247d900be40 100644 --- a/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target2/File3.swift +++ b/unified/ql/test/library-tests/static-name-binding/package1/Sources/Target2/File3.swift @@ -1,5 +1,11 @@ +import Target1 + public class A {} // name=Target2.A public class B { // name=Target2.B public class C {} // name=Target2.B.C } + +extension ScopedExtensionTarget { // $ access=ScopedExtensionTarget + func target2ExtensionMethod() {} // name=Target1.ScopedExtensionTarget.target2ExtensionMethod +} From 0d13f7f1b143016a71b196249d02fb6f9df0ffe8 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 14 Sep 2026 16:10:54 +0100 Subject: [PATCH 0931/2098] Swift: Replace dead link in .qhelp. --- swift/ql/src/queries/Security/CWE-312/CleartextLogging.qhelp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swift/ql/src/queries/Security/CWE-312/CleartextLogging.qhelp b/swift/ql/src/queries/Security/CWE-312/CleartextLogging.qhelp index 5959fe5ef8df..8de3f21878f0 100644 --- a/swift/ql/src/queries/Security/CWE-312/CleartextLogging.qhelp +++ b/swift/ql/src/queries/Security/CWE-312/CleartextLogging.qhelp @@ -40,7 +40,7 @@ Instead, you should encrypt or obfuscate the credentials, or omit them entirely:
  • M. Dowd, J. McDonald and J. Schuhm, The Art of Software Security Assessment, 1st Edition, Chapter 2 - 'Common Vulnerabilities of Encryption', p. 43. Addison Wesley, 2006.
  • M. Howard and D. LeBlanc, Writing Secure Code, 2nd Edition, Chapter 9 - 'Protecting Secret Data', p. 299. Microsoft, 2002.
  • -
  • OWASP: Password Plaintext Storage.
  • +
  • OWASP: Logging Cheat Sheet.
  • From 0b63e6060895c2c431707a063d485c84b23658e5 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 14 Sep 2026 16:22:59 +0100 Subject: [PATCH 0932/2098] Go: Replace dead link in .qhelp. --- go/ql/src/Security/CWE-312/CleartextLogging.qhelp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/ql/src/Security/CWE-312/CleartextLogging.qhelp b/go/ql/src/Security/CWE-312/CleartextLogging.qhelp index e8326e59999b..9e35d1713678 100644 --- a/go/ql/src/Security/CWE-312/CleartextLogging.qhelp +++ b/go/ql/src/Security/CWE-312/CleartextLogging.qhelp @@ -44,7 +44,7 @@ Instead, the credentials should be encrypted, obfuscated, or omitted entirely:
  • M. Dowd, J. McDonald and J. Schuhm, The Art of Software Security Assessment, 1st Edition, Chapter 2 - 'Common Vulnerabilities of Encryption', p. 43. Addison Wesley, 2006.
  • M. Howard and D. LeBlanc, Writing Secure Code, 2nd Edition, Chapter 9 - 'Protecting Secret Data', p. 299. Microsoft, 2002.
  • -
  • OWASP: Password Plaintext Storage.
  • +
  • OWASP: Logging Cheat Sheet.
  • From 3c332a39146e692028b4fadda30b8c9382af71f0 Mon Sep 17 00:00:00 2001 From: Asger F Date: Mon, 14 Sep 2026 17:43:48 +0200 Subject: [PATCH 0933/2098] Update unified/ql/src/queries/security/CWE-312/CleartextLogging.qhelp Co-authored-by: Geoffrey White <40627776+geoffw0@users.noreply.github.com> --- unified/ql/src/queries/security/CWE-312/CleartextLogging.qhelp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/ql/src/queries/security/CWE-312/CleartextLogging.qhelp b/unified/ql/src/queries/security/CWE-312/CleartextLogging.qhelp index 5959fe5ef8df..8de3f21878f0 100644 --- a/unified/ql/src/queries/security/CWE-312/CleartextLogging.qhelp +++ b/unified/ql/src/queries/security/CWE-312/CleartextLogging.qhelp @@ -40,7 +40,7 @@ Instead, you should encrypt or obfuscate the credentials, or omit them entirely:
  • M. Dowd, J. McDonald and J. Schuhm, The Art of Software Security Assessment, 1st Edition, Chapter 2 - 'Common Vulnerabilities of Encryption', p. 43. Addison Wesley, 2006.
  • M. Howard and D. LeBlanc, Writing Secure Code, 2nd Edition, Chapter 9 - 'Protecting Secret Data', p. 299. Microsoft, 2002.
  • -
  • OWASP: Password Plaintext Storage.
  • +
  • OWASP: Logging Cheat Sheet.
  • From 85d592521745ccc764abea5a4aa48057fb04e499 Mon Sep 17 00:00:00 2001 From: Jeff Martin Date: Mon, 14 Sep 2026 11:44:00 -0700 Subject: [PATCH 0934/2098] Actions tests: move integration lockfile fixture --- .../actions-lock/src/{ => .github/workflows}/actions.lock | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename actions/ql/integration-tests/actions-lock/src/{ => .github/workflows}/actions.lock (100%) diff --git a/actions/ql/integration-tests/actions-lock/src/actions.lock b/actions/ql/integration-tests/actions-lock/src/.github/workflows/actions.lock similarity index 100% rename from actions/ql/integration-tests/actions-lock/src/actions.lock rename to actions/ql/integration-tests/actions-lock/src/.github/workflows/actions.lock From 75d9457ed1b9cc64157ebd05be9b4cc05bffd9f6 Mon Sep 17 00:00:00 2001 From: AkshayK Date: Mon, 14 Sep 2026 17:26:10 -0400 Subject: [PATCH 0935/2098] C++: Model Comdb2 SQL execution sinks --- .../2026-09-14-comdb2-sql-injection.md | 4 +++ cpp/ql/lib/ext/Comdb2.model.yml | 11 +++++++ .../CWE-089/SqlTainted/SqlTainted.expected | 9 ++++++ .../CWE/CWE-089/SqlTainted/test_comdb2.c | 32 +++++++++++++++++++ 4 files changed, 56 insertions(+) create mode 100644 cpp/ql/lib/change-notes/2026-09-14-comdb2-sql-injection.md create mode 100644 cpp/ql/lib/ext/Comdb2.model.yml create mode 100644 cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/test_comdb2.c diff --git a/cpp/ql/lib/change-notes/2026-09-14-comdb2-sql-injection.md b/cpp/ql/lib/change-notes/2026-09-14-comdb2-sql-injection.md new file mode 100644 index 000000000000..a93b74541670 --- /dev/null +++ b/cpp/ql/lib/change-notes/2026-09-14-comdb2-sql-injection.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added SQL-injection sink models for the Comdb2 C API functions `cdb2_run_statement` and `cdb2_run_statement_typed`. diff --git a/cpp/ql/lib/ext/Comdb2.model.yml b/cpp/ql/lib/ext/Comdb2.model.yml new file mode 100644 index 000000000000..7edcab128ce2 --- /dev/null +++ b/cpp/ql/lib/ext/Comdb2.model.yml @@ -0,0 +1,11 @@ +# Partial model of the Comdb2 C API. +# https://bloomberg.github.io/comdb2/c_api.html +extensions: + - addsTo: + pack: codeql/cpp-all + extensible: sinkModel + data: # namespace, type, subtypes, name, signature, ext, input, kind, provenance + # Both functions interpret the second argument as SQL. The typed variant + # specifies result-column types; bound parameter values are passed separately. + - ["", "", False, "cdb2_run_statement", "", "", "Argument[*1]", "sql-injection", "manual"] + - ["", "", False, "cdb2_run_statement_typed", "", "", "Argument[*1]", "sql-injection", "manual"] diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected index 1f8441edcd61..253fe0f02e14 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected @@ -6,6 +6,8 @@ | test.c:106:24:106:29 | query1 | test.c:101:8:101:16 | gets output argument | test.c:106:24:106:29 | query1 | This argument to a SQL query function is derived from $@. | test.c:101:8:101:16 | gets output argument | user input (string read by gets) | | test.c:107:28:107:33 | query1 | test.c:101:8:101:16 | gets output argument | test.c:107:28:107:33 | query1 | This argument to a SQL query function is derived from $@. | test.c:101:8:101:16 | gets output argument | user input (string read by gets) | | test.cpp:43:27:43:33 | *access to array | test.cpp:39:27:39:30 | **argv | test.cpp:43:27:43:33 | *access to array | This argument to a SQL query function is derived from $@ and then passed to pqxx::work::exec1((unnamed parameter 0)). | test.cpp:39:27:39:30 | **argv | user input (a command-line argument) | +| test_comdb2.c:22:28:22:36 | userInput | test_comdb2.c:18:8:18:16 | gets output argument | test_comdb2.c:22:28:22:36 | userInput | This argument to a SQL query function is derived from $@. | test_comdb2.c:18:8:18:16 | gets output argument | user input (string read by gets) | +| test_comdb2.c:23:34:23:42 | userInput | test_comdb2.c:18:8:18:16 | gets output argument | test_comdb2.c:23:34:23:42 | userInput | This argument to a SQL query function is derived from $@. | test_comdb2.c:18:8:18:16 | gets output argument | user input (string read by gets) | | test_libpq.c:26:16:26:24 | userInput | test_libpq.c:23:8:23:16 | gets output argument | test_libpq.c:26:16:26:24 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:23:8:23:16 | gets output argument | user input (string read by gets) | | test_libpq.c:27:22:27:30 | userInput | test_libpq.c:23:8:23:16 | gets output argument | test_libpq.c:27:22:27:30 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:23:8:23:16 | gets output argument | user input (string read by gets) | | test_libpq.c:28:27:28:35 | userInput | test_libpq.c:23:8:23:16 | gets output argument | test_libpq.c:28:27:28:35 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:23:8:23:16 | gets output argument | user input (string read by gets) | @@ -26,6 +28,8 @@ edges | test.c:101:8:101:16 | gets output argument | test.c:106:24:106:29 | query1 | provenance | TaintFunction Sink:MaD:2 | | test.c:101:8:101:16 | gets output argument | test.c:107:28:107:33 | query1 | provenance | TaintFunction Sink:MaD:1 | | test.cpp:39:27:39:30 | **argv | test.cpp:43:27:43:33 | *access to array | provenance | | +| test_comdb2.c:18:8:18:16 | gets output argument | test_comdb2.c:22:28:22:36 | userInput | provenance | Sink:MaD:9 | +| test_comdb2.c:18:8:18:16 | gets output argument | test_comdb2.c:23:34:23:42 | userInput | provenance | Sink:MaD:10 | | test_libpq.c:23:8:23:16 | gets output argument | test_libpq.c:26:16:26:24 | userInput | provenance | Sink:MaD:3 | | test_libpq.c:23:8:23:16 | gets output argument | test_libpq.c:27:22:27:30 | userInput | provenance | Sink:MaD:4 | | test_libpq.c:23:8:23:16 | gets output argument | test_libpq.c:28:27:28:35 | userInput | provenance | Sink:MaD:5 | @@ -41,6 +45,8 @@ models | 6 | Sink: ; ; false; PQsendPrepare; ; ; Argument[*2]; sql-injection; manual | | 7 | Sink: ; ; false; PQsendQuery; ; ; Argument[*1]; sql-injection; manual | | 8 | Sink: ; ; false; PQsendQueryParams; ; ; Argument[*1]; sql-injection; manual | +| 9 | Sink: ; ; false; cdb2_run_statement; ; ; Argument[*1]; sql-injection; manual | +| 10 | Sink: ; ; false; cdb2_run_statement_typed; ; ; Argument[*1]; sql-injection; manual | nodes | test.c:14:27:14:30 | **argv | semmle.label | **argv | | test.c:15:20:15:26 | *access to array | semmle.label | *access to array | @@ -59,6 +65,9 @@ nodes | test.c:107:28:107:33 | query1 | semmle.label | query1 | | test.cpp:39:27:39:30 | **argv | semmle.label | **argv | | test.cpp:43:27:43:33 | *access to array | semmle.label | *access to array | +| test_comdb2.c:18:8:18:16 | gets output argument | semmle.label | gets output argument | +| test_comdb2.c:22:28:22:36 | userInput | semmle.label | userInput | +| test_comdb2.c:23:34:23:42 | userInput | semmle.label | userInput | | test_libpq.c:23:8:23:16 | gets output argument | semmle.label | gets output argument | | test_libpq.c:26:16:26:24 | userInput | semmle.label | userInput | | test_libpq.c:27:22:27:30 | userInput | semmle.label | userInput | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/test_comdb2.c b/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/test_comdb2.c new file mode 100644 index 000000000000..ce30e27700d6 --- /dev/null +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/test_comdb2.c @@ -0,0 +1,32 @@ +// Minimal declarations from the public Comdb2 C API: +// https://github.com/bloomberg/comdb2/blob/dfb15415b48cbe67220d76964243086051813676/cdb2api/cdb2api.h +typedef struct cdb2_hndl cdb2_hndl_tp; + +enum { CDB2_CSTRING = 3 }; + +int cdb2_run_statement(cdb2_hndl_tp *hndl, const char *sql); +int cdb2_run_statement_typed(cdb2_hndl_tp *hndl, const char *sql, int ntypes, const int *types); +int cdb2_bind_param(cdb2_hndl_tp *hndl, const char *name, int type, + const void *varaddr, int length); + +char *gets(char *s); +typedef unsigned long size_t; +size_t strlen(const char *s); + +void comdb2Tests(cdb2_hndl_tp *hndl) { + char userInput[1000]; + gets(userInput); // $ Source + int types[] = {CDB2_CSTRING}; + + // Both execution functions interpret user-controlled query text as SQL. + cdb2_run_statement(hndl, userInput); // $ Alert + cdb2_run_statement_typed(hndl, userInput, 1, types); // $ Alert + + cdb2_run_statement(hndl, "SELECT 1"); // GOOD + cdb2_run_statement_typed(hndl, "SELECT 'constant'", 1, types); // GOOD + + // Bound values are data, not SQL text, even when controlled by the user. + cdb2_bind_param(hndl, "value", CDB2_CSTRING, userInput, strlen(userInput) + 1); // GOOD + cdb2_run_statement(hndl, "SELECT @value"); // GOOD + cdb2_run_statement_typed(hndl, "SELECT @value", 1, types); // GOOD +} From c1c7f92efd30c4ea9708930a20b64b7c997517e8 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Tue, 15 Sep 2026 09:19:15 +0200 Subject: [PATCH 0936/2098] Apply batched suggestions from code review Co-authored-by: Anders Schack-Mulligen --- shared/controlflow/codeql/controlflow/test/TestCfg.qll | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shared/controlflow/codeql/controlflow/test/TestCfg.qll b/shared/controlflow/codeql/controlflow/test/TestCfg.qll index 55a58e355b44..d59fcc14fabb 100644 --- a/shared/controlflow/codeql/controlflow/test/TestCfg.qll +++ b/shared/controlflow/codeql/controlflow/test/TestCfg.qll @@ -206,7 +206,7 @@ module Make Cfg, InputSig Cfg, InputSig Date: Tue, 15 Sep 2026 09:47:58 +0200 Subject: [PATCH 0937/2098] C#: Add extraction test for .NET 11 RC1. --- .../all-platforms/dotnet_11/Program.cs | 1 + .../all-platforms/dotnet_11/dotnet_build.csproj | 10 ++++++++++ .../all-platforms/dotnet_11/global.json | 5 +++++ .../integration-tests/all-platforms/dotnet_11/test.py | 7 +++++++ 4 files changed, 23 insertions(+) create mode 100644 csharp/ql/integration-tests/all-platforms/dotnet_11/Program.cs create mode 100644 csharp/ql/integration-tests/all-platforms/dotnet_11/dotnet_build.csproj create mode 100644 csharp/ql/integration-tests/all-platforms/dotnet_11/global.json create mode 100644 csharp/ql/integration-tests/all-platforms/dotnet_11/test.py diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_11/Program.cs b/csharp/ql/integration-tests/all-platforms/dotnet_11/Program.cs new file mode 100644 index 000000000000..bd44629f7e23 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/dotnet_11/Program.cs @@ -0,0 +1 @@ +Console.WriteLine($"{string.Join(",", args)}"); diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_11/dotnet_build.csproj b/csharp/ql/integration-tests/all-platforms/dotnet_11/dotnet_build.csproj new file mode 100644 index 000000000000..5bf6c9b8cff2 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/dotnet_11/dotnet_build.csproj @@ -0,0 +1,10 @@ + + + + Exe + net11.0 + enable + enable + + + diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_11/global.json b/csharp/ql/integration-tests/all-platforms/dotnet_11/global.json new file mode 100644 index 000000000000..f79f89df7d1a --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/dotnet_11/global.json @@ -0,0 +1,5 @@ +{ + "sdk": { + "version": "11.0.100-rc.1.26425.128" + } +} diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_11/test.py b/csharp/ql/integration-tests/all-platforms/dotnet_11/test.py new file mode 100644 index 000000000000..1f1fe52a4e5e --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/dotnet_11/test.py @@ -0,0 +1,7 @@ +import pytest + +def test1(codeql, csharp): + codeql.database.create() + +def test2(codeql, csharp): + codeql.database.create(build_mode="none") From 931a836a45111789e73c49273079e23253f22d16 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Tue, 15 Sep 2026 11:32:56 +0200 Subject: [PATCH 0938/2098] Unified: Add expected inconsistencies --- .../BasicTest/CONSISTENCY/CfgConsistency.expected | 5 +++++ .../local-name-binding/CONSISTENCY/CfgConsistency.expected | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 unified/ql/test/library-tests/BasicTest/CONSISTENCY/CfgConsistency.expected create mode 100644 unified/ql/test/library-tests/local-name-binding/CONSISTENCY/CfgConsistency.expected diff --git a/unified/ql/test/library-tests/BasicTest/CONSISTENCY/CfgConsistency.expected b/unified/ql/test/library-tests/BasicTest/CONSISTENCY/CfgConsistency.expected new file mode 100644 index 000000000000..eaa376774829 --- /dev/null +++ b/unified/ql/test/library-tests/BasicTest/CONSISTENCY/CfgConsistency.expected @@ -0,0 +1,5 @@ +consistencyOverview +| deadEnd | 2 | +deadEnd +| test.swift:59:10:59:25 | Entry | +| test.swift:60:10:60:25 | Entry | diff --git a/unified/ql/test/library-tests/local-name-binding/CONSISTENCY/CfgConsistency.expected b/unified/ql/test/library-tests/local-name-binding/CONSISTENCY/CfgConsistency.expected new file mode 100644 index 000000000000..f125f6b6d4f7 --- /dev/null +++ b/unified/ql/test/library-tests/local-name-binding/CONSISTENCY/CfgConsistency.expected @@ -0,0 +1,5 @@ +consistencyOverview +| deadEnd | 2 | +deadEnd +| test.swift:341:10:341:15 | Entry | +| test.swift:342:10:342:15 | Entry | From 3415562686bb652e64104d76b7ab8d5c2def370c Mon Sep 17 00:00:00 2001 From: Anders Fugmann Date: Tue, 15 Sep 2026 11:34:38 +0200 Subject: [PATCH 0939/2098] Label external contributions Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../label-external-contributions.yml | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 .github/workflows/label-external-contributions.yml diff --git a/.github/workflows/label-external-contributions.yml b/.github/workflows/label-external-contributions.yml new file mode 100644 index 000000000000..4b396242083b --- /dev/null +++ b/.github/workflows/label-external-contributions.yml @@ -0,0 +1,62 @@ +name: Label external contributions + +on: + pull_request_target: + types: + - opened + - reopened + - ready_for_review + +permissions: {} + +jobs: + label: + if: >- + github.event.pull_request.draft == false && + github.event.pull_request.user.type == 'User' && + github.event.pull_request.author_association != 'MEMBER' && + github.event.pull_request.author_association != 'OWNER' + runs-on: ubuntu-latest + timeout-minutes: 5 + permissions: + issues: write + concurrency: + group: label-external-contribution-${{ github.event.pull_request.number }} + cancel-in-progress: false + + steps: + - name: Add external contribution label + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 + with: + github-token: ${{ github.token }} + script: | + const label = 'external-contribution'; + const pullRequest = context.payload.pull_request; + + if (pullRequest.labels.some(({ name }) => name === label)) { + return; + } + + if (context.payload.action !== 'opened') { + const events = await github.paginate( + github.rest.issues.listEvents, + { + ...context.repo, + issue_number: pullRequest.number, + per_page: 100, + }, + ); + if ( + events.some(({ event, label: eventLabel }) => + event === 'unlabeled' && eventLabel?.name === label + ) + ) { + return; + } + } + + await github.rest.issues.addLabels({ + ...context.repo, + issue_number: pullRequest.number, + labels: [label], + }); From 9ac2ff973bc10dbbcf2ec0aac4d6d303b9c05ac8 Mon Sep 17 00:00:00 2001 From: Anders Fugmann Date: Tue, 15 Sep 2026 11:46:53 +0200 Subject: [PATCH 0940/2098] Check label history for opened pull requests Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../label-external-contributions.yml | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/.github/workflows/label-external-contributions.yml b/.github/workflows/label-external-contributions.yml index 4b396242083b..6b281c0ab104 100644 --- a/.github/workflows/label-external-contributions.yml +++ b/.github/workflows/label-external-contributions.yml @@ -37,22 +37,20 @@ jobs: return; } - if (context.payload.action !== 'opened') { - const events = await github.paginate( - github.rest.issues.listEvents, - { - ...context.repo, - issue_number: pullRequest.number, - per_page: 100, - }, - ); - if ( - events.some(({ event, label: eventLabel }) => - event === 'unlabeled' && eventLabel?.name === label - ) - ) { - return; - } + const events = await github.paginate( + github.rest.issues.listEvents, + { + ...context.repo, + issue_number: pullRequest.number, + per_page: 100, + }, + ); + if ( + events.some(({ event, label: eventLabel }) => + event === 'unlabeled' && eventLabel?.name === label + ) + ) { + return; } await github.rest.issues.addLabels({ From ff448f31c16bb74af99e70faa2936b54f060ae7d Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Tue, 15 Sep 2026 12:09:55 +0200 Subject: [PATCH 0941/2098] Unified: use `link_deps` for native deps of `swift_syntax_rs` `rules_rust` deprecated C++ libraries in `deps`, warning on every build. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- unified/swift-syntax-rs/BUILD.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/swift-syntax-rs/BUILD.bazel b/unified/swift-syntax-rs/BUILD.bazel index 553226143cbb..79092fb14ad0 100644 --- a/unified/swift-syntax-rs/BUILD.bazel +++ b/unified/swift-syntax-rs/BUILD.bazel @@ -72,7 +72,7 @@ rust_library( ), edition = "2024", target_compatible_with = UNIFIED_SUPPORTED_PLATFORMS, - deps = select({ + link_deps = select({ ":static_linux_runtime": [ # Keep these in linker order; sorting them produces an invalid group. ":static_runtime_group_start", From bae1eeb358aac01a9ca6da37436b7c1c03b1f5e0 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Tue, 15 Sep 2026 12:14:18 +0200 Subject: [PATCH 0942/2098] Format `swift_syntax_rs` link deps Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- unified/swift-syntax-rs/BUILD.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/swift-syntax-rs/BUILD.bazel b/unified/swift-syntax-rs/BUILD.bazel index 79092fb14ad0..1eda8db26c1f 100644 --- a/unified/swift-syntax-rs/BUILD.bazel +++ b/unified/swift-syntax-rs/BUILD.bazel @@ -71,7 +71,6 @@ rust_library( exclude = ["src/main.rs"], ), edition = "2024", - target_compatible_with = UNIFIED_SUPPORTED_PLATFORMS, link_deps = select({ ":static_linux_runtime": [ # Keep these in linker order; sorting them produces an invalid group. @@ -87,6 +86,7 @@ rust_library( ":swift_syntax_ffi", ], }), + target_compatible_with = UNIFIED_SUPPORTED_PLATFORMS, ) # A debugging aid, for looking at the raw swift-syntax JSON for some input: From ab65fafb9b75e97fbde0635ac926f2dddf2dc4ed Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Tue, 15 Sep 2026 12:17:01 +0200 Subject: [PATCH 0943/2098] chore: update pre-commit hooks --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0f2906dab310..37bd56bb11ee 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,7 +4,7 @@ default_language_version: python: python3.12 repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v3.2.0 + rev: v6.0.0 hooks: - id: trailing-whitespace exclude: /test([^/]*)/.*$(? Date: Tue, 15 Sep 2026 10:42:35 +0200 Subject: [PATCH 0944/2098] unified: Add plugin --- .../unified/internal/dataflow/AllDataFlow.qll | 1 + .../internal/dataflow/DataFlowGraph.qll | 20 ++----------- .../internal/dataflow/DataFlowPlugin.qll | 13 +++++++++ .../internal/dataflow/DataFlowPluginSwift.qll | 29 +++++++++++++++++++ 4 files changed, 45 insertions(+), 18 deletions(-) create mode 100644 unified/ql/lib/codeql/unified/internal/dataflow/DataFlowPlugin.qll create mode 100644 unified/ql/lib/codeql/unified/internal/dataflow/DataFlowPluginSwift.qll diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/AllDataFlow.qll b/unified/ql/lib/codeql/unified/internal/dataflow/AllDataFlow.qll index 53b53956cb23..893e62d3b140 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/AllDataFlow.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/AllDataFlow.qll @@ -4,6 +4,7 @@ import Content import DataFlowGraph import DataFlowInstantiation import DataFlowNode +import DataFlowPlugin import Step import LocalSsa import TaintTrackingInstantiation diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll index 7f7483c06a5b..1edff6eea04b 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll @@ -2,6 +2,8 @@ private import unified private import AllDataFlow predicate step(Node node1, Step step, Node node2) { + any(DataFlowPlugin p).step(node1, step, node2) + or exists(VariableDeclaration decl | node1.isResultValue(decl.getValue()) and step.value() and @@ -38,30 +40,12 @@ predicate step(Node node1, Step step, Node node2) { node2.isLocalVariablePostUpdate(access, access.getImplicitQualifierVariable()) ) or - exists(BinaryExpr expr | - expr.getOperator().getValue() = "+" and - node1.isResultValue([expr.getLeft(), expr.getRight()]) and - step.taint() and - node2.isResultValue(expr) - ) - or exists(StringInterpolationExpr expr | node1.isResultValue(expr.getAnElement()) and step.taint() and node2.isResultValue(expr) ) or - exists(CallExpr call | - // String interpolations in Swift currently insert a call to a built-in called "interpolation". - // Add taint through plain 1-argument calls to this built-in. - call.getCallee().(BuiltinExpr).getValue() = "interpolation" and - call.getNumberOfArguments() = 1 and - not exists(call.getArgument(0).getName()) and - node1.isResultValue(call.getArgument(0).getValue()) and - step.value() and - node2.isResultValue(call) - ) - or exists(TupleExpr expr, int i | node1.isResultValue(expr.getElement(i).getValue()) and step.storeName(i.toString()) and diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowPlugin.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowPlugin.qll new file mode 100644 index 000000000000..7bf02b5a7524 --- /dev/null +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowPlugin.qll @@ -0,0 +1,13 @@ +/** + * Provides an interface for language-specific data flow rules. + */ + +private import unified +private import AllDataFlow +private import codeql.util.Unit +private import DataFlowPluginSwift // ensure overrides are seen + +class DataFlowPlugin extends Unit { + /** Holds if there is a language-specific step from `node1 -> step -> node2`. */ + predicate step(Node node1, Step step, Node node2) { none() } +} diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowPluginSwift.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowPluginSwift.qll new file mode 100644 index 000000000000..6cf9b5d487b8 --- /dev/null +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowPluginSwift.qll @@ -0,0 +1,29 @@ +/** + * Provides Swift-specific data flow rules. + */ + +private import unified +private import AllDataFlow + +private class SwiftDataFlowPlugin extends DataFlowPlugin { + // Note: For now we assume all code is Swift, but in the future we must restrict these rules to Swift-files + override predicate step(Node node1, Step step, Node node2) { + exists(BinaryExpr expr | + expr.getOperator().getValue() = "+" and + node1.isResultValue([expr.getLeft(), expr.getRight()]) and + step.taint() and + node2.isResultValue(expr) + ) + or + exists(CallExpr call | + // String interpolations in Swift currently insert a call to a built-in called "interpolation". + // Add taint through plain 1-argument calls to this built-in. + call.getCallee().(BuiltinExpr).getValue() = "interpolation" and + call.getNumberOfArguments() = 1 and + not exists(call.getArgument(0).getName()) and + node1.isResultValue(call.getArgument(0).getValue()) and + step.value() and + node2.isResultValue(call) + ) + } +} From 2acd6da2fef4fe70a0681bae81ef0513e50dfdcc Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 15 Sep 2026 11:15:41 +0200 Subject: [PATCH 0945/2098] unified: Add local SSA consistency-query --- unified/ql/consistency-queries/LocalSsaConsistency.ql | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 unified/ql/consistency-queries/LocalSsaConsistency.ql diff --git a/unified/ql/consistency-queries/LocalSsaConsistency.ql b/unified/ql/consistency-queries/LocalSsaConsistency.ql new file mode 100644 index 000000000000..209adfca340a --- /dev/null +++ b/unified/ql/consistency-queries/LocalSsaConsistency.ql @@ -0,0 +1,3 @@ +private import unified +private import codeql.unified.internal.dataflow.LocalSsa +import LocalSsaOutput::Consistency From 6fe1db031d99de6b27acd56d81a69b743c492f65 Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 15 Sep 2026 11:25:55 +0200 Subject: [PATCH 0946/2098] unified: Add sink calls without flow --- .../ql/test/library-tests/dataflow/implicit-self.swift | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/unified/ql/test/library-tests/dataflow/implicit-self.swift b/unified/ql/test/library-tests/dataflow/implicit-self.swift index 61b4ab17f292..8e13479d51fe 100644 --- a/unified/ql/test/library-tests/dataflow/implicit-self.swift +++ b/unified/ql/test/library-tests/dataflow/implicit-self.swift @@ -7,41 +7,49 @@ class C { var box = Box() func t1() { + sink(self.x); // no flow self.x = source("t1.1"); sink(self.x); // $ hasValueFlow=t1.1 } func t2() { + sink(x); // no flow x = source("t2.1"); sink(x); // $ hasValueFlow=t2.1 } func t3() { + sink(self.x); // no flow x = source("t3.1"); sink(self.x); // $ hasValueFlow=t3.1 } func t4() { + sink(x); // no flow self.x = source("t4.1"); sink(x); // $ hasValueFlow=t4.1 } func t5() { + sink(self.box.x); // no flow self.box.x = source("t5.1"); sink(self.box.x); // $ hasValueFlow=t5.1 } func t6() { + sink(box.x); // no flow box.x = source("t6.1"); sink(box.x); // $ hasValueFlow=t6.1 } func t7() { + sink(self.box.x); // no flow box.x = source("t7.1"); sink(self.box.x); // $ hasValueFlow=t7.1 } func t8() { + sink(box.x); // no flow self.box.x = source("t8.1"); sink(box.x); // $ hasValueFlow=t8.1 } From dea32194d0a1537a3ebf99330dd4f9c9829eba1a Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 15 Sep 2026 11:42:40 +0200 Subject: [PATCH 0947/2098] unified: Explain the "local" in "local SSA" --- unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll b/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll index c08eeb29a9b5..6b4fe6c376c1 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll @@ -1,3 +1,7 @@ +/** + * SSA for non-captured variables. + */ + private import unified private import unified as U private import AllDataFlow From 5f2b8e804a0ed1a0ea3bc2e2a02f654c4b8accf8 Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 15 Sep 2026 11:48:10 +0200 Subject: [PATCH 0948/2098] unified: Rename to TExprPostUpdateNode for clarity This is not the only kind of post-update node (there is also TLocalVariableRef of kind post-update) --- .../lib/codeql/unified/internal/dataflow/DataFlowNode.qll | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll index 6872e69973d5..bc4bec52b948 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll @@ -37,7 +37,7 @@ predicate performsVariableAccess( newtype TDataFlowNode = TValueNode(Expr expr) { hasResultValue(expr) or hasIncomingValue(expr, _) } or TStrictlyIncomingValue(Expr expr) { hasResultValue(expr) and hasIncomingValue(expr, _) } or - TPostUpdateNode(Expr expr) { hasPostUpdate(expr) } or + TExprPostUpdateNode(Expr expr) { hasPostUpdate(expr) } or TLocalVariableRefNode(Expr expr, LocalVariable var, VariableRefKind kind) { performsVariableAccess(expr, var, kind, _) } or @@ -83,7 +83,7 @@ class Node extends TDataFlowNode { } /** Holds if this represents the updated state of the value returned by `expr` after it has been mutated by the surrounding assignment or call. */ - predicate isPostUpdate(Expr expr) { this = TPostUpdateNode(expr) } + predicate isPostUpdate(Expr expr) { this = TExprPostUpdateNode(expr) } /** Gets the expression represented by this node. */ Expr asExpr() { this = TValueNode(result) } @@ -94,7 +94,7 @@ class Node extends TDataFlowNode { AstNode getWrappedAstNode() { result = this.asExpr() or this = TStrictlyIncomingValue(result) or - this = TPostUpdateNode(result) or + this = TExprPostUpdateNode(result) or this = TLocalVariableRefNode(result, _, _) } @@ -106,7 +106,7 @@ class Node extends TDataFlowNode { this = TStrictlyIncomingValue(expr) and result = "[incoming] " + expr.toString() or - this = TPostUpdateNode(expr) and + this = TExprPostUpdateNode(expr) and result = "[post] " + expr.toString() ) or From 535b215b24203c573d56279e34445a222358830c Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 15 Sep 2026 12:44:31 +0200 Subject: [PATCH 0949/2098] unified: Fill in nodeIsVisible and neverSkipInPathGraph --- .../internal/dataflow/DataFlowInstantiation.qll | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll index a51ab0cd25f9..d4b03b4b59c4 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll @@ -135,7 +135,20 @@ module DataFlowInput implements InputSig { // // Misc // - predicate nodeIsHidden(Node node) { none() } // TODO + additional predicate nodeIsVisible(Node node) { + node instanceof TValueNode + or + node instanceof TStrictlyIncomingValue + or + node instanceof TExprPostUpdateNode + } + + predicate nodeIsHidden(Node node) { not nodeIsVisible(node) } + + predicate neverSkipInPathGraph(Node n) { + n.isIncomingValue(_) or // Never skip assignment target + n.asExpr() instanceof LocalVariableAccess // Never skip a variable reference + } class DataFlowExpr = Expr; From 6f0f14a3d301bf48d75221c3199dc529aa1a2577 Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 15 Sep 2026 12:53:33 +0200 Subject: [PATCH 0950/2098] unified: Include path problem output tuples --- .../test/library-tests/dataflow/test.expected | 265 ++++++++++++++++++ .../ql/test/library-tests/dataflow/test.ql | 12 + 2 files changed, 277 insertions(+) diff --git a/unified/ql/test/library-tests/dataflow/test.expected b/unified/ql/test/library-tests/dataflow/test.expected index e69de29bb2d1..20a3141892fb 100644 --- a/unified/ql/test/library-tests/dataflow/test.expected +++ b/unified/ql/test/library-tests/dataflow/test.expected @@ -0,0 +1,265 @@ +models +edges +| implicit-self.swift:11:9:11:12 | [post] self : unit [x] : unit | implicit-self.swift:12:14:12:17 | self : unit [x] : unit | provenance | | +| implicit-self.swift:11:9:11:14 | MemberAccessExpr : unit | implicit-self.swift:11:9:11:12 | [post] self : unit [x] : unit | provenance | | +| implicit-self.swift:11:18:11:31 | CallExpr : unit | implicit-self.swift:11:9:11:14 | MemberAccessExpr : unit | provenance | | +| implicit-self.swift:12:14:12:17 | self : unit [x] : unit | implicit-self.swift:12:14:12:19 | MemberAccessExpr | provenance | | +| implicit-self.swift:17:9:17:9 | x : unit | implicit-self.swift:18:14:18:14 | x | provenance | | +| implicit-self.swift:17:13:17:26 | CallExpr : unit | implicit-self.swift:17:9:17:9 | x : unit | provenance | | +| implicit-self.swift:23:9:23:9 | x : unit | implicit-self.swift:24:14:24:17 | self : unit [x] : unit | provenance | | +| implicit-self.swift:23:13:23:26 | CallExpr : unit | implicit-self.swift:23:9:23:9 | x : unit | provenance | | +| implicit-self.swift:24:14:24:17 | self : unit [x] : unit | implicit-self.swift:24:14:24:19 | MemberAccessExpr | provenance | | +| implicit-self.swift:29:9:29:12 | [post] self : unit [x] : unit | implicit-self.swift:30:14:30:14 | x | provenance | | +| implicit-self.swift:29:9:29:14 | MemberAccessExpr : unit | implicit-self.swift:29:9:29:12 | [post] self : unit [x] : unit | provenance | | +| implicit-self.swift:29:18:29:31 | CallExpr : unit | implicit-self.swift:29:9:29:14 | MemberAccessExpr : unit | provenance | | +| implicit-self.swift:35:9:35:12 | [post] self : unit [box, x] : unit | implicit-self.swift:36:14:36:17 | self : unit [box, x] : unit | provenance | | +| implicit-self.swift:35:9:35:16 | [post] MemberAccessExpr : unit [x] : unit | implicit-self.swift:35:9:35:12 | [post] self : unit [box, x] : unit | provenance | | +| implicit-self.swift:35:9:35:18 | MemberAccessExpr : unit | implicit-self.swift:35:9:35:16 | [post] MemberAccessExpr : unit [x] : unit | provenance | | +| implicit-self.swift:35:22:35:35 | CallExpr : unit | implicit-self.swift:35:9:35:18 | MemberAccessExpr : unit | provenance | | +| implicit-self.swift:36:14:36:17 | self : unit [box, x] : unit | implicit-self.swift:36:14:36:21 | MemberAccessExpr : unit [x] : unit | provenance | | +| implicit-self.swift:36:14:36:21 | MemberAccessExpr : unit [x] : unit | implicit-self.swift:36:14:36:23 | MemberAccessExpr | provenance | | +| implicit-self.swift:41:9:41:11 | [post] box : unit [x] : unit | implicit-self.swift:42:14:42:16 | box : unit [x] : unit | provenance | | +| implicit-self.swift:41:9:41:13 | MemberAccessExpr : unit | implicit-self.swift:41:9:41:11 | [post] box : unit [x] : unit | provenance | | +| implicit-self.swift:41:17:41:30 | CallExpr : unit | implicit-self.swift:41:9:41:13 | MemberAccessExpr : unit | provenance | | +| implicit-self.swift:42:14:42:16 | box : unit [x] : unit | implicit-self.swift:42:14:42:18 | MemberAccessExpr | provenance | | +| implicit-self.swift:47:9:47:11 | [post] box : unit [x] : unit | implicit-self.swift:48:14:48:17 | self : unit [box, x] : unit | provenance | | +| implicit-self.swift:47:9:47:13 | MemberAccessExpr : unit | implicit-self.swift:47:9:47:11 | [post] box : unit [x] : unit | provenance | | +| implicit-self.swift:47:17:47:30 | CallExpr : unit | implicit-self.swift:47:9:47:13 | MemberAccessExpr : unit | provenance | | +| implicit-self.swift:48:14:48:17 | self : unit [box, x] : unit | implicit-self.swift:48:14:48:21 | MemberAccessExpr : unit [x] : unit | provenance | | +| implicit-self.swift:48:14:48:21 | MemberAccessExpr : unit [x] : unit | implicit-self.swift:48:14:48:23 | MemberAccessExpr | provenance | | +| implicit-self.swift:53:9:53:12 | [post] self : unit [box, x] : unit | implicit-self.swift:54:14:54:16 | box : unit [x] : unit | provenance | | +| implicit-self.swift:53:9:53:16 | [post] MemberAccessExpr : unit [x] : unit | implicit-self.swift:53:9:53:12 | [post] self : unit [box, x] : unit | provenance | | +| implicit-self.swift:53:9:53:18 | MemberAccessExpr : unit | implicit-self.swift:53:9:53:16 | [post] MemberAccessExpr : unit [x] : unit | provenance | | +| implicit-self.swift:53:22:53:35 | CallExpr : unit | implicit-self.swift:53:9:53:18 | MemberAccessExpr : unit | provenance | | +| implicit-self.swift:54:14:54:16 | box : unit [x] : unit | implicit-self.swift:54:14:54:18 | MemberAccessExpr | provenance | | +| test.swift:6:10:6:23 | CallExpr : unit | test.swift:6:10:6:32 | BinaryExpr | provenance | | +| test.swift:7:19:7:32 | CallExpr : unit | test.swift:7:10:7:32 | BinaryExpr | provenance | | +| test.swift:9:13:9:26 | CallExpr : unit | test.swift:9:10:9:33 | StringInterpolationExpr | provenance | | +| test.swift:10:18:10:31 | CallExpr : unit | test.swift:10:10:10:33 | StringInterpolationExpr | provenance | | +| test.swift:11:18:11:31 | CallExpr : unit | test.swift:11:10:11:38 | StringInterpolationExpr | provenance | | +| test.swift:16:10:16:33 | TupleExpr : unit [0] : unit | test.swift:16:10:16:35 | MemberAccessExpr | provenance | | +| test.swift:16:11:16:25 | CallExpr : unit | test.swift:16:10:16:33 | TupleExpr : unit [0] : unit | provenance | | +| test.swift:19:10:19:33 | TupleExpr : unit [1] : unit | test.swift:19:10:19:35 | MemberAccessExpr | provenance | | +| test.swift:19:19:19:32 | CallExpr : unit | test.swift:19:10:19:33 | TupleExpr : unit [1] : unit | provenance | | +| test.swift:23:9:23:9 | a : unit | test.swift:24:10:24:10 | a | provenance | | +| test.swift:23:13:23:26 | CallExpr : unit | test.swift:23:9:23:9 | a : unit | provenance | | +| test.swift:28:9:28:14 | TupleExpr : unit [0] : unit | test.swift:28:10:28:10 | a : unit | provenance | | +| test.swift:28:10:28:10 | a : unit | test.swift:29:10:29:10 | a | provenance | | +| test.swift:28:18:28:41 | TupleExpr : unit [0] : unit | test.swift:28:9:28:14 | TupleExpr : unit [0] : unit | provenance | | +| test.swift:28:19:28:33 | CallExpr : unit | test.swift:28:18:28:41 | TupleExpr : unit [0] : unit | provenance | | +| test.swift:32:9:32:14 | TupleExpr : unit [1] : unit | test.swift:32:13:32:13 | d : unit | provenance | | +| test.swift:32:13:32:13 | d : unit | test.swift:34:10:34:10 | d | provenance | | +| test.swift:32:18:32:41 | TupleExpr : unit [1] : unit | test.swift:32:9:32:14 | TupleExpr : unit [1] : unit | provenance | | +| test.swift:32:27:32:40 | CallExpr : unit | test.swift:32:18:32:41 | TupleExpr : unit [1] : unit | provenance | | +| test.swift:38:9:38:9 | a : unit | test.swift:39:10:39:10 | a | provenance | | +| test.swift:38:13:38:26 | CallExpr : unit | test.swift:38:9:38:9 | a : unit | provenance | | +| test.swift:46:5:46:9 | [post] tuple : unit [0] : unit | test.swift:47:10:47:14 | tuple : unit [0] : unit | provenance | | +| test.swift:46:5:46:11 | MemberAccessExpr : unit | test.swift:46:5:46:9 | [post] tuple : unit [0] : unit | provenance | | +| test.swift:46:15:46:28 | CallExpr : unit | test.swift:46:5:46:11 | MemberAccessExpr : unit | provenance | | +| test.swift:47:10:47:14 | tuple : unit [0] : unit | test.swift:47:10:47:16 | MemberAccessExpr | provenance | | +| test.swift:53:5:53:14 | [post] deep_tuple : unit [1, 0] : unit | test.swift:58:10:58:19 | deep_tuple : unit [1, 0] : unit | provenance | | +| test.swift:53:5:53:16 | [post] MemberAccessExpr : unit [0] : unit | test.swift:53:5:53:14 | [post] deep_tuple : unit [1, 0] : unit | provenance | | +| test.swift:53:5:53:18 | MemberAccessExpr : unit | test.swift:53:5:53:16 | [post] MemberAccessExpr : unit [0] : unit | provenance | | +| test.swift:53:22:53:35 | CallExpr : unit | test.swift:53:5:53:18 | MemberAccessExpr : unit | provenance | | +| test.swift:58:10:58:19 | deep_tuple : unit [1, 0] : unit | test.swift:58:10:58:21 | MemberAccessExpr : unit [0] : unit | provenance | | +| test.swift:58:10:58:21 | MemberAccessExpr : unit [0] : unit | test.swift:58:10:58:23 | MemberAccessExpr | provenance | | +| test.swift:64:5:64:16 | TupleExpr : unit [0] : unit | test.swift:64:6:64:12 | MemberAccessExpr : unit | provenance | | +| test.swift:64:6:64:10 | [post] tuple : unit [1] : unit | test.swift:66:10:66:14 | tuple : unit [1] : unit | provenance | | +| test.swift:64:6:64:12 | MemberAccessExpr : unit | test.swift:64:6:64:10 | [post] tuple : unit [1] : unit | provenance | | +| test.swift:64:20:64:51 | TupleExpr : unit [0] : unit | test.swift:64:5:64:16 | TupleExpr : unit [0] : unit | provenance | | +| test.swift:64:21:64:35 | CallExpr : unit | test.swift:64:20:64:51 | TupleExpr : unit [0] : unit | provenance | | +| test.swift:66:10:66:14 | tuple : unit [1] : unit | test.swift:66:10:66:16 | MemberAccessExpr | provenance | | +| test.swift:74:5:74:9 | [post] tuple : unit [0] : unit | test.swift:75:10:75:14 | tuple : unit [0] : unit | provenance | | +| test.swift:74:5:74:11 | MemberAccessExpr : unit | test.swift:74:5:74:9 | [post] tuple : unit [0] : unit | provenance | | +| test.swift:74:15:74:29 | CallExpr : unit | test.swift:74:5:74:11 | MemberAccessExpr : unit | provenance | | +| test.swift:75:10:75:14 | tuple : unit [0] : unit | test.swift:75:10:75:16 | MemberAccessExpr | provenance | | +| test.swift:86:9:86:9 | x : unit | test.swift:90:10:90:10 | x | provenance | | +| test.swift:86:9:86:9 | x : unit | test.swift:99:14:99:14 | x | provenance | | +| test.swift:86:13:86:27 | CallExpr : unit | test.swift:86:9:86:9 | x : unit | provenance | | +| test.swift:94:9:94:9 | y : unit | test.swift:96:10:96:10 | y | provenance | | +| test.swift:94:9:94:9 | y : unit | test.swift:100:14:100:14 | y | provenance | | +| test.swift:94:13:94:27 | CallExpr : unit | test.swift:94:9:94:9 | y : unit | provenance | | +| test.swift:107:9:107:13 | [post] tuple : unit [0] : unit | test.swift:112:10:112:14 | tuple : unit [0] : unit | provenance | | +| test.swift:107:9:107:15 | MemberAccessExpr : unit | test.swift:107:9:107:13 | [post] tuple : unit [0] : unit | provenance | | +| test.swift:107:19:107:33 | CallExpr : unit | test.swift:107:9:107:15 | MemberAccessExpr : unit | provenance | | +| test.swift:112:10:112:14 | tuple : unit [0] : unit | test.swift:112:10:112:16 | MemberAccessExpr | provenance | | +| test.swift:117:9:117:13 | tuple : unit [0] : unit | test.swift:120:17:120:21 | tuple : unit [0] : unit | provenance | | +| test.swift:117:9:117:13 | tuple : unit [1] : unit | test.swift:120:17:120:21 | tuple : unit [1] : unit | provenance | | +| test.swift:117:17:117:50 | TupleExpr : unit [0] : unit | test.swift:117:9:117:13 | tuple : unit [0] : unit | provenance | | +| test.swift:117:17:117:50 | TupleExpr : unit [1] : unit | test.swift:117:9:117:13 | tuple : unit [1] : unit | provenance | | +| test.swift:117:18:117:33 | CallExpr : unit | test.swift:117:17:117:50 | TupleExpr : unit [0] : unit | provenance | | +| test.swift:117:35:117:49 | CallExpr : unit | test.swift:117:17:117:50 | TupleExpr : unit [1] : unit | provenance | | +| test.swift:120:9:120:13 | TupleExpr : unit [0] : unit | test.swift:120:10:120:10 | a : unit | provenance | | +| test.swift:120:9:120:13 | TupleExpr : unit [1] : unit | test.swift:120:12:120:12 | b : unit | provenance | | +| test.swift:120:10:120:10 | a : unit | test.swift:125:10:125:10 | a | provenance | | +| test.swift:120:12:120:12 | b : unit | test.swift:126:10:126:10 | b | provenance | | +| test.swift:120:17:120:21 | tuple : unit [0] : unit | test.swift:120:9:120:13 | TupleExpr : unit [0] : unit | provenance | | +| test.swift:120:17:120:21 | tuple : unit [1] : unit | test.swift:120:9:120:13 | TupleExpr : unit [1] : unit | provenance | | +| test.swift:131:5:131:5 | a : unit | test.swift:131:14:131:14 | a | provenance | | +| test.swift:131:5:131:5 | a : unit | test.swift:132:10:132:10 | a | provenance | | +| test.swift:131:19:131:33 | CallExpr : unit | test.swift:131:5:131:5 | a : unit | provenance | | +nodes +| implicit-self.swift:11:9:11:12 | [post] self : unit [x] : unit | semmle.label | [post] self : unit [x] : unit | +| implicit-self.swift:11:9:11:14 | MemberAccessExpr : unit | semmle.label | MemberAccessExpr : unit | +| implicit-self.swift:11:18:11:31 | CallExpr : unit | semmle.label | CallExpr : unit | +| implicit-self.swift:12:14:12:17 | self : unit [x] : unit | semmle.label | self : unit [x] : unit | +| implicit-self.swift:12:14:12:19 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| implicit-self.swift:17:9:17:9 | x : unit | semmle.label | x : unit | +| implicit-self.swift:17:13:17:26 | CallExpr : unit | semmle.label | CallExpr : unit | +| implicit-self.swift:18:14:18:14 | x | semmle.label | x | +| implicit-self.swift:23:9:23:9 | x : unit | semmle.label | x : unit | +| implicit-self.swift:23:13:23:26 | CallExpr : unit | semmle.label | CallExpr : unit | +| implicit-self.swift:24:14:24:17 | self : unit [x] : unit | semmle.label | self : unit [x] : unit | +| implicit-self.swift:24:14:24:19 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| implicit-self.swift:29:9:29:12 | [post] self : unit [x] : unit | semmle.label | [post] self : unit [x] : unit | +| implicit-self.swift:29:9:29:14 | MemberAccessExpr : unit | semmle.label | MemberAccessExpr : unit | +| implicit-self.swift:29:18:29:31 | CallExpr : unit | semmle.label | CallExpr : unit | +| implicit-self.swift:30:14:30:14 | x | semmle.label | x | +| implicit-self.swift:35:9:35:12 | [post] self : unit [box, x] : unit | semmle.label | [post] self : unit [box, x] : unit | +| implicit-self.swift:35:9:35:16 | [post] MemberAccessExpr : unit [x] : unit | semmle.label | [post] MemberAccessExpr : unit [x] : unit | +| implicit-self.swift:35:9:35:18 | MemberAccessExpr : unit | semmle.label | MemberAccessExpr : unit | +| implicit-self.swift:35:22:35:35 | CallExpr : unit | semmle.label | CallExpr : unit | +| implicit-self.swift:36:14:36:17 | self : unit [box, x] : unit | semmle.label | self : unit [box, x] : unit | +| implicit-self.swift:36:14:36:21 | MemberAccessExpr : unit [x] : unit | semmle.label | MemberAccessExpr : unit [x] : unit | +| implicit-self.swift:36:14:36:23 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| implicit-self.swift:41:9:41:11 | [post] box : unit [x] : unit | semmle.label | [post] box : unit [x] : unit | +| implicit-self.swift:41:9:41:13 | MemberAccessExpr : unit | semmle.label | MemberAccessExpr : unit | +| implicit-self.swift:41:17:41:30 | CallExpr : unit | semmle.label | CallExpr : unit | +| implicit-self.swift:42:14:42:16 | box : unit [x] : unit | semmle.label | box : unit [x] : unit | +| implicit-self.swift:42:14:42:18 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| implicit-self.swift:47:9:47:11 | [post] box : unit [x] : unit | semmle.label | [post] box : unit [x] : unit | +| implicit-self.swift:47:9:47:13 | MemberAccessExpr : unit | semmle.label | MemberAccessExpr : unit | +| implicit-self.swift:47:17:47:30 | CallExpr : unit | semmle.label | CallExpr : unit | +| implicit-self.swift:48:14:48:17 | self : unit [box, x] : unit | semmle.label | self : unit [box, x] : unit | +| implicit-self.swift:48:14:48:21 | MemberAccessExpr : unit [x] : unit | semmle.label | MemberAccessExpr : unit [x] : unit | +| implicit-self.swift:48:14:48:23 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| implicit-self.swift:53:9:53:12 | [post] self : unit [box, x] : unit | semmle.label | [post] self : unit [box, x] : unit | +| implicit-self.swift:53:9:53:16 | [post] MemberAccessExpr : unit [x] : unit | semmle.label | [post] MemberAccessExpr : unit [x] : unit | +| implicit-self.swift:53:9:53:18 | MemberAccessExpr : unit | semmle.label | MemberAccessExpr : unit | +| implicit-self.swift:53:22:53:35 | CallExpr : unit | semmle.label | CallExpr : unit | +| implicit-self.swift:54:14:54:16 | box : unit [x] : unit | semmle.label | box : unit [x] : unit | +| implicit-self.swift:54:14:54:18 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| test.swift:2:10:2:21 | CallExpr | semmle.label | CallExpr | +| test.swift:6:10:6:23 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:6:10:6:32 | BinaryExpr | semmle.label | BinaryExpr | +| test.swift:7:10:7:32 | BinaryExpr | semmle.label | BinaryExpr | +| test.swift:7:19:7:32 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:9:10:9:33 | StringInterpolationExpr | semmle.label | StringInterpolationExpr | +| test.swift:9:13:9:26 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:10:10:10:33 | StringInterpolationExpr | semmle.label | StringInterpolationExpr | +| test.swift:10:18:10:31 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:11:10:11:38 | StringInterpolationExpr | semmle.label | StringInterpolationExpr | +| test.swift:11:18:11:31 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:16:10:16:33 | TupleExpr : unit [0] : unit | semmle.label | TupleExpr : unit [0] : unit | +| test.swift:16:10:16:35 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| test.swift:16:11:16:25 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:19:10:19:33 | TupleExpr : unit [1] : unit | semmle.label | TupleExpr : unit [1] : unit | +| test.swift:19:10:19:35 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| test.swift:19:19:19:32 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:23:9:23:9 | a : unit | semmle.label | a : unit | +| test.swift:23:13:23:26 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:24:10:24:10 | a | semmle.label | a | +| test.swift:28:9:28:14 | TupleExpr : unit [0] : unit | semmle.label | TupleExpr : unit [0] : unit | +| test.swift:28:10:28:10 | a : unit | semmle.label | a : unit | +| test.swift:28:18:28:41 | TupleExpr : unit [0] : unit | semmle.label | TupleExpr : unit [0] : unit | +| test.swift:28:19:28:33 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:29:10:29:10 | a | semmle.label | a | +| test.swift:32:9:32:14 | TupleExpr : unit [1] : unit | semmle.label | TupleExpr : unit [1] : unit | +| test.swift:32:13:32:13 | d : unit | semmle.label | d : unit | +| test.swift:32:18:32:41 | TupleExpr : unit [1] : unit | semmle.label | TupleExpr : unit [1] : unit | +| test.swift:32:27:32:40 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:34:10:34:10 | d | semmle.label | d | +| test.swift:38:9:38:9 | a : unit | semmle.label | a : unit | +| test.swift:38:13:38:26 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:39:10:39:10 | a | semmle.label | a | +| test.swift:46:5:46:9 | [post] tuple : unit [0] : unit | semmle.label | [post] tuple : unit [0] : unit | +| test.swift:46:5:46:11 | MemberAccessExpr : unit | semmle.label | MemberAccessExpr : unit | +| test.swift:46:15:46:28 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:47:10:47:14 | tuple : unit [0] : unit | semmle.label | tuple : unit [0] : unit | +| test.swift:47:10:47:16 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| test.swift:53:5:53:14 | [post] deep_tuple : unit [1, 0] : unit | semmle.label | [post] deep_tuple : unit [1, 0] : unit | +| test.swift:53:5:53:16 | [post] MemberAccessExpr : unit [0] : unit | semmle.label | [post] MemberAccessExpr : unit [0] : unit | +| test.swift:53:5:53:18 | MemberAccessExpr : unit | semmle.label | MemberAccessExpr : unit | +| test.swift:53:22:53:35 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:58:10:58:19 | deep_tuple : unit [1, 0] : unit | semmle.label | deep_tuple : unit [1, 0] : unit | +| test.swift:58:10:58:21 | MemberAccessExpr : unit [0] : unit | semmle.label | MemberAccessExpr : unit [0] : unit | +| test.swift:58:10:58:23 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| test.swift:64:5:64:16 | TupleExpr : unit [0] : unit | semmle.label | TupleExpr : unit [0] : unit | +| test.swift:64:6:64:10 | [post] tuple : unit [1] : unit | semmle.label | [post] tuple : unit [1] : unit | +| test.swift:64:6:64:12 | MemberAccessExpr : unit | semmle.label | MemberAccessExpr : unit | +| test.swift:64:20:64:51 | TupleExpr : unit [0] : unit | semmle.label | TupleExpr : unit [0] : unit | +| test.swift:64:21:64:35 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:66:10:66:14 | tuple : unit [1] : unit | semmle.label | tuple : unit [1] : unit | +| test.swift:66:10:66:16 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| test.swift:74:5:74:9 | [post] tuple : unit [0] : unit | semmle.label | [post] tuple : unit [0] : unit | +| test.swift:74:5:74:11 | MemberAccessExpr : unit | semmle.label | MemberAccessExpr : unit | +| test.swift:74:15:74:29 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:75:10:75:14 | tuple : unit [0] : unit | semmle.label | tuple : unit [0] : unit | +| test.swift:75:10:75:16 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| test.swift:86:9:86:9 | x : unit | semmle.label | x : unit | +| test.swift:86:13:86:27 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:90:10:90:10 | x | semmle.label | x | +| test.swift:94:9:94:9 | y : unit | semmle.label | y : unit | +| test.swift:94:13:94:27 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:96:10:96:10 | y | semmle.label | y | +| test.swift:99:14:99:14 | x | semmle.label | x | +| test.swift:100:14:100:14 | y | semmle.label | y | +| test.swift:107:9:107:13 | [post] tuple : unit [0] : unit | semmle.label | [post] tuple : unit [0] : unit | +| test.swift:107:9:107:15 | MemberAccessExpr : unit | semmle.label | MemberAccessExpr : unit | +| test.swift:107:19:107:33 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:112:10:112:14 | tuple : unit [0] : unit | semmle.label | tuple : unit [0] : unit | +| test.swift:112:10:112:16 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| test.swift:117:9:117:13 | tuple : unit [0] : unit | semmle.label | tuple : unit [0] : unit | +| test.swift:117:9:117:13 | tuple : unit [1] : unit | semmle.label | tuple : unit [1] : unit | +| test.swift:117:17:117:50 | TupleExpr : unit [0] : unit | semmle.label | TupleExpr : unit [0] : unit | +| test.swift:117:17:117:50 | TupleExpr : unit [1] : unit | semmle.label | TupleExpr : unit [1] : unit | +| test.swift:117:18:117:33 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:117:35:117:49 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:120:9:120:13 | TupleExpr : unit [0] : unit | semmle.label | TupleExpr : unit [0] : unit | +| test.swift:120:9:120:13 | TupleExpr : unit [1] : unit | semmle.label | TupleExpr : unit [1] : unit | +| test.swift:120:10:120:10 | a : unit | semmle.label | a : unit | +| test.swift:120:12:120:12 | b : unit | semmle.label | b : unit | +| test.swift:120:17:120:21 | tuple : unit [0] : unit | semmle.label | tuple : unit [0] : unit | +| test.swift:120:17:120:21 | tuple : unit [1] : unit | semmle.label | tuple : unit [1] : unit | +| test.swift:125:10:125:10 | a | semmle.label | a | +| test.swift:126:10:126:10 | b | semmle.label | b | +| test.swift:131:5:131:5 | a : unit | semmle.label | a : unit | +| test.swift:131:14:131:14 | a | semmle.label | a | +| test.swift:131:19:131:33 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:132:10:132:10 | a | semmle.label | a | +subpaths +testFailures +#select +| implicit-self.swift:12:14:12:19 | MemberAccessExpr | implicit-self.swift:11:18:11:31 | CallExpr : unit | implicit-self.swift:12:14:12:19 | MemberAccessExpr | $@ | implicit-self.swift:11:18:11:31 | CallExpr : unit | CallExpr : unit | +| implicit-self.swift:18:14:18:14 | x | implicit-self.swift:17:13:17:26 | CallExpr : unit | implicit-self.swift:18:14:18:14 | x | $@ | implicit-self.swift:17:13:17:26 | CallExpr : unit | CallExpr : unit | +| implicit-self.swift:24:14:24:19 | MemberAccessExpr | implicit-self.swift:23:13:23:26 | CallExpr : unit | implicit-self.swift:24:14:24:19 | MemberAccessExpr | $@ | implicit-self.swift:23:13:23:26 | CallExpr : unit | CallExpr : unit | +| implicit-self.swift:30:14:30:14 | x | implicit-self.swift:29:18:29:31 | CallExpr : unit | implicit-self.swift:30:14:30:14 | x | $@ | implicit-self.swift:29:18:29:31 | CallExpr : unit | CallExpr : unit | +| implicit-self.swift:36:14:36:23 | MemberAccessExpr | implicit-self.swift:35:22:35:35 | CallExpr : unit | implicit-self.swift:36:14:36:23 | MemberAccessExpr | $@ | implicit-self.swift:35:22:35:35 | CallExpr : unit | CallExpr : unit | +| implicit-self.swift:42:14:42:18 | MemberAccessExpr | implicit-self.swift:41:17:41:30 | CallExpr : unit | implicit-self.swift:42:14:42:18 | MemberAccessExpr | $@ | implicit-self.swift:41:17:41:30 | CallExpr : unit | CallExpr : unit | +| implicit-self.swift:48:14:48:23 | MemberAccessExpr | implicit-self.swift:47:17:47:30 | CallExpr : unit | implicit-self.swift:48:14:48:23 | MemberAccessExpr | $@ | implicit-self.swift:47:17:47:30 | CallExpr : unit | CallExpr : unit | +| implicit-self.swift:54:14:54:18 | MemberAccessExpr | implicit-self.swift:53:22:53:35 | CallExpr : unit | implicit-self.swift:54:14:54:18 | MemberAccessExpr | $@ | implicit-self.swift:53:22:53:35 | CallExpr : unit | CallExpr : unit | +| test.swift:2:10:2:21 | CallExpr | test.swift:2:10:2:21 | CallExpr | test.swift:2:10:2:21 | CallExpr | $@ | test.swift:2:10:2:21 | CallExpr | CallExpr | +| test.swift:6:10:6:32 | BinaryExpr | test.swift:6:10:6:23 | CallExpr : unit | test.swift:6:10:6:32 | BinaryExpr | $@ | test.swift:6:10:6:23 | CallExpr : unit | CallExpr : unit | +| test.swift:7:10:7:32 | BinaryExpr | test.swift:7:19:7:32 | CallExpr : unit | test.swift:7:10:7:32 | BinaryExpr | $@ | test.swift:7:19:7:32 | CallExpr : unit | CallExpr : unit | +| test.swift:9:10:9:33 | StringInterpolationExpr | test.swift:9:13:9:26 | CallExpr : unit | test.swift:9:10:9:33 | StringInterpolationExpr | $@ | test.swift:9:13:9:26 | CallExpr : unit | CallExpr : unit | +| test.swift:10:10:10:33 | StringInterpolationExpr | test.swift:10:18:10:31 | CallExpr : unit | test.swift:10:10:10:33 | StringInterpolationExpr | $@ | test.swift:10:18:10:31 | CallExpr : unit | CallExpr : unit | +| test.swift:11:10:11:38 | StringInterpolationExpr | test.swift:11:18:11:31 | CallExpr : unit | test.swift:11:10:11:38 | StringInterpolationExpr | $@ | test.swift:11:18:11:31 | CallExpr : unit | CallExpr : unit | +| test.swift:16:10:16:35 | MemberAccessExpr | test.swift:16:11:16:25 | CallExpr : unit | test.swift:16:10:16:35 | MemberAccessExpr | $@ | test.swift:16:11:16:25 | CallExpr : unit | CallExpr : unit | +| test.swift:19:10:19:35 | MemberAccessExpr | test.swift:19:19:19:32 | CallExpr : unit | test.swift:19:10:19:35 | MemberAccessExpr | $@ | test.swift:19:19:19:32 | CallExpr : unit | CallExpr : unit | +| test.swift:24:10:24:10 | a | test.swift:23:13:23:26 | CallExpr : unit | test.swift:24:10:24:10 | a | $@ | test.swift:23:13:23:26 | CallExpr : unit | CallExpr : unit | +| test.swift:29:10:29:10 | a | test.swift:28:19:28:33 | CallExpr : unit | test.swift:29:10:29:10 | a | $@ | test.swift:28:19:28:33 | CallExpr : unit | CallExpr : unit | +| test.swift:34:10:34:10 | d | test.swift:32:27:32:40 | CallExpr : unit | test.swift:34:10:34:10 | d | $@ | test.swift:32:27:32:40 | CallExpr : unit | CallExpr : unit | +| test.swift:39:10:39:10 | a | test.swift:38:13:38:26 | CallExpr : unit | test.swift:39:10:39:10 | a | $@ | test.swift:38:13:38:26 | CallExpr : unit | CallExpr : unit | +| test.swift:47:10:47:16 | MemberAccessExpr | test.swift:46:15:46:28 | CallExpr : unit | test.swift:47:10:47:16 | MemberAccessExpr | $@ | test.swift:46:15:46:28 | CallExpr : unit | CallExpr : unit | +| test.swift:58:10:58:23 | MemberAccessExpr | test.swift:53:22:53:35 | CallExpr : unit | test.swift:58:10:58:23 | MemberAccessExpr | $@ | test.swift:53:22:53:35 | CallExpr : unit | CallExpr : unit | +| test.swift:66:10:66:16 | MemberAccessExpr | test.swift:64:21:64:35 | CallExpr : unit | test.swift:66:10:66:16 | MemberAccessExpr | $@ | test.swift:64:21:64:35 | CallExpr : unit | CallExpr : unit | +| test.swift:75:10:75:16 | MemberAccessExpr | test.swift:74:15:74:29 | CallExpr : unit | test.swift:75:10:75:16 | MemberAccessExpr | $@ | test.swift:74:15:74:29 | CallExpr : unit | CallExpr : unit | +| test.swift:90:10:90:10 | x | test.swift:86:13:86:27 | CallExpr : unit | test.swift:90:10:90:10 | x | $@ | test.swift:86:13:86:27 | CallExpr : unit | CallExpr : unit | +| test.swift:96:10:96:10 | y | test.swift:94:13:94:27 | CallExpr : unit | test.swift:96:10:96:10 | y | $@ | test.swift:94:13:94:27 | CallExpr : unit | CallExpr : unit | +| test.swift:99:14:99:14 | x | test.swift:86:13:86:27 | CallExpr : unit | test.swift:99:14:99:14 | x | $@ | test.swift:86:13:86:27 | CallExpr : unit | CallExpr : unit | +| test.swift:100:14:100:14 | y | test.swift:94:13:94:27 | CallExpr : unit | test.swift:100:14:100:14 | y | $@ | test.swift:94:13:94:27 | CallExpr : unit | CallExpr : unit | +| test.swift:112:10:112:16 | MemberAccessExpr | test.swift:107:19:107:33 | CallExpr : unit | test.swift:112:10:112:16 | MemberAccessExpr | $@ | test.swift:107:19:107:33 | CallExpr : unit | CallExpr : unit | +| test.swift:125:10:125:10 | a | test.swift:117:18:117:33 | CallExpr : unit | test.swift:125:10:125:10 | a | $@ | test.swift:117:18:117:33 | CallExpr : unit | CallExpr : unit | +| test.swift:126:10:126:10 | b | test.swift:117:35:117:49 | CallExpr : unit | test.swift:126:10:126:10 | b | $@ | test.swift:117:35:117:49 | CallExpr : unit | CallExpr : unit | +| test.swift:131:14:131:14 | a | test.swift:131:19:131:33 | CallExpr : unit | test.swift:131:14:131:14 | a | $@ | test.swift:131:19:131:33 | CallExpr : unit | CallExpr : unit | +| test.swift:132:10:132:10 | a | test.swift:131:19:131:33 | CallExpr : unit | test.swift:132:10:132:10 | a | $@ | test.swift:131:19:131:33 | CallExpr : unit | CallExpr : unit | diff --git a/unified/ql/test/library-tests/dataflow/test.ql b/unified/ql/test/library-tests/dataflow/test.ql index ee97b8e524e9..eccf3ccfd79d 100644 --- a/unified/ql/test/library-tests/dataflow/test.ql +++ b/unified/ql/test/library-tests/dataflow/test.ql @@ -1,3 +1,15 @@ +/** + * @kind path-problem + * @id unified/test/library-tests/dataflow + * @severity info + * @precision low + */ + private import unified private import utils.test.InlineFlowTest import DefaultFlowTest +import TaintFlow::PathGraph + +from TaintFlow::PathNode source, TaintFlow::PathNode sink +where TaintFlow::flowPath(source, sink) +select sink, source, sink, "$@", source, source.toString() From ef5067a6a5e0492cb8fe04c78216d696b4297a27 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Tue, 15 Sep 2026 12:39:45 +0200 Subject: [PATCH 0951/2098] Cfg: Rework test. --- .../codeql/controlflow/test/TestCfg.qll | 133 +++++++++++------- .../controlflow/basicblock-slices.expected | 3 +- .../library-tests/controlflow/cfg.expected | 1 + .../test/library-tests/controlflow/cfg.swift | 2 +- 4 files changed, 83 insertions(+), 56 deletions(-) diff --git a/shared/controlflow/codeql/controlflow/test/TestCfg.qll b/shared/controlflow/codeql/controlflow/test/TestCfg.qll index d59fcc14fabb..9767688433fb 100644 --- a/shared/controlflow/codeql/controlflow/test/TestCfg.qll +++ b/shared/controlflow/codeql/controlflow/test/TestCfg.qll @@ -85,21 +85,59 @@ module Make Cfg, InputSig Cfg, InputSig Cfg, InputSig Cfg, InputSig Cfg, InputSig Cfg, InputSig Cfg, InputSig Cfg, InputSig x -> + -> y -^ BinaryExpr' | +| 62 | cfg.swift:62:6:62:6 | y | 'y' | +| 62 | cfg.swift:62:19:62:19 | x | 'x -> + -> y -^ BinaryExpr' | | 66 | cfg.swift:66:1:70:1 | Block | 'Block' | | 66 | cfg.swift:66:1:70:1 | FunctionDeclaration | 'FunctionDeclaration' | | 67 | cfg.swift:67:3:67:34 | VariableDeclaration | 'VariableDeclaration -V x1 -> createClosure1 -> Argument -V "" -^ CallExpr -^ CallExpr' | diff --git a/unified/ql/test/library-tests/controlflow/cfg.expected b/unified/ql/test/library-tests/controlflow/cfg.expected index fedda2b0ed23..675e2bbe0312 100644 --- a/unified/ql/test/library-tests/controlflow/cfg.expected +++ b/unified/ql/test/library-tests/controlflow/cfg.expected @@ -1,4 +1,5 @@ bbContinues +| cfg.swift:62:6:62:6 | y | 'y goto Block(-1)' | | cfg.swift:147:5:147:5 | Block | 'Block goto true(+3)' | | cfg.swift:525:78:525:78 | Block | 'Block goto Task(+2)' | | cfg.swift:526:9:526:20 | continuation | 'continuation goto Block(-1)' | diff --git a/unified/ql/test/library-tests/controlflow/cfg.swift b/unified/ql/test/library-tests/controlflow/cfg.swift index db2d1cb9394d..984983fc1b52 100644 --- a/unified/ql/test/library-tests/controlflow/cfg.swift +++ b/unified/ql/test/library-tests/controlflow/cfg.swift @@ -59,7 +59,7 @@ func createClosure2(x : Int) -> (_ : Int) -> Int { // $ noCfg func createClosure3(x : Int) -> (_ : Int) -> Int { // $ noCfg return { - (y) -> Int in x + y + (y) -> Int in x + y // $ bbContinues='y goto Block(-1)' } } From e6722a00ed054f621b5ae17fb676535c6e7f04ed Mon Sep 17 00:00:00 2001 From: Anders Peter Fugmann Date: Tue, 15 Sep 2026 12:59:49 +0200 Subject: [PATCH 0952/2098] Update .github/workflows/label-external-contributions.yml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Óscar San José --- .github/workflows/label-external-contributions.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/label-external-contributions.yml b/.github/workflows/label-external-contributions.yml index 6b281c0ab104..6db5dcd68501 100644 --- a/.github/workflows/label-external-contributions.yml +++ b/.github/workflows/label-external-contributions.yml @@ -11,6 +11,8 @@ permissions: {} jobs: label: + # Label non-draft PRs from personal accounts that are not owning (github) organization members or owners, + # including outside collaborators and prior contributors. GitHub organization members are excluded, and bot accounts too. if: >- github.event.pull_request.draft == false && github.event.pull_request.user.type == 'User' && From f5be54404240a048ff169d79c822696eb9bf46e0 Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 15 Sep 2026 13:23:16 +0200 Subject: [PATCH 0953/2098] unified: Test protocol method with and without implementation --- .../library-tests/static-name-binding/extensions.swift | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/unified/ql/test/library-tests/static-name-binding/extensions.swift b/unified/ql/test/library-tests/static-name-binding/extensions.swift index 13564ac753e7..0f12add91a07 100644 --- a/unified/ql/test/library-tests/static-name-binding/extensions.swift +++ b/unified/ql/test/library-tests/static-name-binding/extensions.swift @@ -39,17 +39,21 @@ extension B { // $ access=B // Protocol conformance through extension protocol Base { func baseMethod(); + func baseMethodNoImpl(); } extension Base { // $ access=Base func baseMethodExt() {} // name=Base.baseMethodExt } class X { func xMethod() { - baseMethod() // $ access=Base.baseMethod + baseMethod() // $ access=X.baseMethod + baseMethodNoImpl() // $ access=Base.baseMethodNoImpl // with no visible implementation, just resolve to the signature baseMethodExt() // $ access=Base.baseMethodExt } } -extension X : Base {} // $ access=X access=Base +extension X : Base { // $ access=X access=Base + func baseMethod() {} // name=X.baseMethod +} // Type parameters of the extended type should be in scope in the extension. class GenericExtensionTarget {} From 22ae803bc79af4a8281ec778915ba720facb3dfa Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 15 Sep 2026 13:26:19 +0200 Subject: [PATCH 0954/2098] unified: Add test for "default implementation" pattern --- .../static-name-binding/extensions.swift | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/unified/ql/test/library-tests/static-name-binding/extensions.swift b/unified/ql/test/library-tests/static-name-binding/extensions.swift index 0f12add91a07..19d666850baa 100644 --- a/unified/ql/test/library-tests/static-name-binding/extensions.swift +++ b/unified/ql/test/library-tests/static-name-binding/extensions.swift @@ -40,21 +40,35 @@ extension B { // $ access=B protocol Base { func baseMethod(); func baseMethodNoImpl(); + func baseMethodDefaultImpl(); } extension Base { // $ access=Base - func baseMethodExt() {} // name=Base.baseMethodExt + func baseMethodExt() {} // name=BaseImpl.baseMethodExt + func baseMethodDefaultImpl() {} // name=BaseImpl.baseMethodDefaultImpl } class X { func xMethod() { baseMethod() // $ access=X.baseMethod baseMethodNoImpl() // $ access=Base.baseMethodNoImpl // with no visible implementation, just resolve to the signature - baseMethodExt() // $ access=Base.baseMethodExt + baseMethodExt() // $ access=BaseImpl.baseMethodExt + baseMethodDefaultImpl() // $ access=Base.baseMethodDefaultImpl access=BaseImpl.baseMethodDefaultImpl } } extension X : Base { // $ access=X access=Base func baseMethod() {} // name=X.baseMethod } +class Y { + func yMethod() { + baseMethod() // $ access=Y.baseMethod + baseMethodDefaultImpl() // $ access=Y.baseMethodDefaultImpl + } +} +extension Y : Base { // $ access=Y access=Base + func baseMethod() {} // name=Y.baseMethod + func baseMethodDefaultImpl() {} // name=Y.baseMethodDefaultImpl +} + // Type parameters of the extended type should be in scope in the extension. class GenericExtensionTarget {} extension GenericExtensionTarget { // $ access=GenericExtensionTarget From 1b72559855dde56e7fb500804741006cafe4dfb8 Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 15 Sep 2026 13:35:36 +0200 Subject: [PATCH 0955/2098] unified: Add comment regarding local namespace in an extension --- unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll | 2 ++ 1 file changed, 2 insertions(+) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 679b90b8808e..3cab856199c1 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -262,6 +262,8 @@ predicate valueStep(NameBindingNode node1, NameBindingNode node2) { node2 = getNodeFromRef(p.getSubPattern()) ) or + // Extensions have access to the members of the entity they extend. + // TODO: The type parameters of the target type should also be in the local scope (for Swift). exists(ClassLikeDeclaration extension | node1 = getNodeFromRef(extension.getExtensionTarget()) and node2.isLocalNamespace(extension) From 11bcf844b00b4d7ab668ca3b7415a4c275374001 Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 15 Sep 2026 13:52:31 +0200 Subject: [PATCH 0956/2098] unified: Omit "unit" type from path steps --- .../unified/internal/dataflow/DataFlowInstantiation.qll | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll index d4b03b4b59c4..da5602cddd29 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll @@ -95,7 +95,10 @@ module DataFlowInput implements InputSig { // // Types // - class DataFlowType = Unit; // TODO: track types + class DataFlowType extends Unit { + // TODO: track proper types + string toString() { result = "" } // do not include "unit" type in path steps + } class CastNode extends Node { CastNode() { none() } // TODO From 838685316d24e18ac665485f8f9d4bfd648d7040 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Tue, 15 Sep 2026 11:25:50 +0200 Subject: [PATCH 0957/2098] C#: Use the zip archive on windows runners, when downloading and installing .NET. --- .../DotNet.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs index babb811b25f0..f1cae33853a1 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs @@ -280,9 +280,16 @@ private static BuildScript DownloadDotNetVersion(IBuildActions actions, ILogger getInstall = version => { var psCommand = $"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; &([scriptblock]::Create((Invoke-WebRequest -UseBasicParsing 'https://dot.net/v1/dotnet-install.ps1'))) -Version {version} -InstallDir {path}"; + var environment = new Dictionary + { + // Starting with .NET 11, the installation script uses tar by default. However, + // tar extraction fails in dotnet-install.ps1, so force the script to download + // and extract the ZIP archive instead. This workaround may be removable in the future. + {"DOTNET_INSTALL_SKIP_TAR", "1"} + }; BuildScript GetInstall(string pwsh) => - new CommandBuilder(actions). + new CommandBuilder(actions, environment: environment). RunCommand(pwsh). Argument("-NoProfile"). Argument("-ExecutionPolicy"). From 432f8c0775d90edf140ae4d12f02334f73c26919 Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 15 Sep 2026 14:16:09 +0200 Subject: [PATCH 0958/2098] unified: Add comment clarifying case with multiple targets --- .../ql/test/library-tests/static-name-binding/extensions.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/unified/ql/test/library-tests/static-name-binding/extensions.swift b/unified/ql/test/library-tests/static-name-binding/extensions.swift index 19d666850baa..35c65dcb9a89 100644 --- a/unified/ql/test/library-tests/static-name-binding/extensions.swift +++ b/unified/ql/test/library-tests/static-name-binding/extensions.swift @@ -51,9 +51,12 @@ class X { baseMethod() // $ access=X.baseMethod baseMethodNoImpl() // $ access=Base.baseMethodNoImpl // with no visible implementation, just resolve to the signature baseMethodExt() // $ access=BaseImpl.baseMethodExt + + // Static name binding may find multiple targets. Type inference should disambiguate. baseMethodDefaultImpl() // $ access=Base.baseMethodDefaultImpl access=BaseImpl.baseMethodDefaultImpl } } + extension X : Base { // $ access=X access=Base func baseMethod() {} // name=X.baseMethod } From 343459c713bd14881a5b227076a082eee8029f3c Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 15 Sep 2026 14:21:29 +0200 Subject: [PATCH 0959/2098] unified: Update expected output --- .../test/library-tests/dataflow/test.expected | 450 +++++++++--------- .../CleartextLogging.expected | 6 +- 2 files changed, 228 insertions(+), 228 deletions(-) diff --git a/unified/ql/test/library-tests/dataflow/test.expected b/unified/ql/test/library-tests/dataflow/test.expected index 20a3141892fb..f6df03922f1f 100644 --- a/unified/ql/test/library-tests/dataflow/test.expected +++ b/unified/ql/test/library-tests/dataflow/test.expected @@ -1,265 +1,265 @@ models edges -| implicit-self.swift:11:9:11:12 | [post] self : unit [x] : unit | implicit-self.swift:12:14:12:17 | self : unit [x] : unit | provenance | | -| implicit-self.swift:11:9:11:14 | MemberAccessExpr : unit | implicit-self.swift:11:9:11:12 | [post] self : unit [x] : unit | provenance | | -| implicit-self.swift:11:18:11:31 | CallExpr : unit | implicit-self.swift:11:9:11:14 | MemberAccessExpr : unit | provenance | | -| implicit-self.swift:12:14:12:17 | self : unit [x] : unit | implicit-self.swift:12:14:12:19 | MemberAccessExpr | provenance | | -| implicit-self.swift:17:9:17:9 | x : unit | implicit-self.swift:18:14:18:14 | x | provenance | | -| implicit-self.swift:17:13:17:26 | CallExpr : unit | implicit-self.swift:17:9:17:9 | x : unit | provenance | | -| implicit-self.swift:23:9:23:9 | x : unit | implicit-self.swift:24:14:24:17 | self : unit [x] : unit | provenance | | -| implicit-self.swift:23:13:23:26 | CallExpr : unit | implicit-self.swift:23:9:23:9 | x : unit | provenance | | -| implicit-self.swift:24:14:24:17 | self : unit [x] : unit | implicit-self.swift:24:14:24:19 | MemberAccessExpr | provenance | | -| implicit-self.swift:29:9:29:12 | [post] self : unit [x] : unit | implicit-self.swift:30:14:30:14 | x | provenance | | -| implicit-self.swift:29:9:29:14 | MemberAccessExpr : unit | implicit-self.swift:29:9:29:12 | [post] self : unit [x] : unit | provenance | | -| implicit-self.swift:29:18:29:31 | CallExpr : unit | implicit-self.swift:29:9:29:14 | MemberAccessExpr : unit | provenance | | -| implicit-self.swift:35:9:35:12 | [post] self : unit [box, x] : unit | implicit-self.swift:36:14:36:17 | self : unit [box, x] : unit | provenance | | -| implicit-self.swift:35:9:35:16 | [post] MemberAccessExpr : unit [x] : unit | implicit-self.swift:35:9:35:12 | [post] self : unit [box, x] : unit | provenance | | -| implicit-self.swift:35:9:35:18 | MemberAccessExpr : unit | implicit-self.swift:35:9:35:16 | [post] MemberAccessExpr : unit [x] : unit | provenance | | -| implicit-self.swift:35:22:35:35 | CallExpr : unit | implicit-self.swift:35:9:35:18 | MemberAccessExpr : unit | provenance | | -| implicit-self.swift:36:14:36:17 | self : unit [box, x] : unit | implicit-self.swift:36:14:36:21 | MemberAccessExpr : unit [x] : unit | provenance | | -| implicit-self.swift:36:14:36:21 | MemberAccessExpr : unit [x] : unit | implicit-self.swift:36:14:36:23 | MemberAccessExpr | provenance | | -| implicit-self.swift:41:9:41:11 | [post] box : unit [x] : unit | implicit-self.swift:42:14:42:16 | box : unit [x] : unit | provenance | | -| implicit-self.swift:41:9:41:13 | MemberAccessExpr : unit | implicit-self.swift:41:9:41:11 | [post] box : unit [x] : unit | provenance | | -| implicit-self.swift:41:17:41:30 | CallExpr : unit | implicit-self.swift:41:9:41:13 | MemberAccessExpr : unit | provenance | | -| implicit-self.swift:42:14:42:16 | box : unit [x] : unit | implicit-self.swift:42:14:42:18 | MemberAccessExpr | provenance | | -| implicit-self.swift:47:9:47:11 | [post] box : unit [x] : unit | implicit-self.swift:48:14:48:17 | self : unit [box, x] : unit | provenance | | -| implicit-self.swift:47:9:47:13 | MemberAccessExpr : unit | implicit-self.swift:47:9:47:11 | [post] box : unit [x] : unit | provenance | | -| implicit-self.swift:47:17:47:30 | CallExpr : unit | implicit-self.swift:47:9:47:13 | MemberAccessExpr : unit | provenance | | -| implicit-self.swift:48:14:48:17 | self : unit [box, x] : unit | implicit-self.swift:48:14:48:21 | MemberAccessExpr : unit [x] : unit | provenance | | -| implicit-self.swift:48:14:48:21 | MemberAccessExpr : unit [x] : unit | implicit-self.swift:48:14:48:23 | MemberAccessExpr | provenance | | -| implicit-self.swift:53:9:53:12 | [post] self : unit [box, x] : unit | implicit-self.swift:54:14:54:16 | box : unit [x] : unit | provenance | | -| implicit-self.swift:53:9:53:16 | [post] MemberAccessExpr : unit [x] : unit | implicit-self.swift:53:9:53:12 | [post] self : unit [box, x] : unit | provenance | | -| implicit-self.swift:53:9:53:18 | MemberAccessExpr : unit | implicit-self.swift:53:9:53:16 | [post] MemberAccessExpr : unit [x] : unit | provenance | | -| implicit-self.swift:53:22:53:35 | CallExpr : unit | implicit-self.swift:53:9:53:18 | MemberAccessExpr : unit | provenance | | -| implicit-self.swift:54:14:54:16 | box : unit [x] : unit | implicit-self.swift:54:14:54:18 | MemberAccessExpr | provenance | | -| test.swift:6:10:6:23 | CallExpr : unit | test.swift:6:10:6:32 | BinaryExpr | provenance | | -| test.swift:7:19:7:32 | CallExpr : unit | test.swift:7:10:7:32 | BinaryExpr | provenance | | -| test.swift:9:13:9:26 | CallExpr : unit | test.swift:9:10:9:33 | StringInterpolationExpr | provenance | | -| test.swift:10:18:10:31 | CallExpr : unit | test.swift:10:10:10:33 | StringInterpolationExpr | provenance | | -| test.swift:11:18:11:31 | CallExpr : unit | test.swift:11:10:11:38 | StringInterpolationExpr | provenance | | -| test.swift:16:10:16:33 | TupleExpr : unit [0] : unit | test.swift:16:10:16:35 | MemberAccessExpr | provenance | | -| test.swift:16:11:16:25 | CallExpr : unit | test.swift:16:10:16:33 | TupleExpr : unit [0] : unit | provenance | | -| test.swift:19:10:19:33 | TupleExpr : unit [1] : unit | test.swift:19:10:19:35 | MemberAccessExpr | provenance | | -| test.swift:19:19:19:32 | CallExpr : unit | test.swift:19:10:19:33 | TupleExpr : unit [1] : unit | provenance | | -| test.swift:23:9:23:9 | a : unit | test.swift:24:10:24:10 | a | provenance | | -| test.swift:23:13:23:26 | CallExpr : unit | test.swift:23:9:23:9 | a : unit | provenance | | -| test.swift:28:9:28:14 | TupleExpr : unit [0] : unit | test.swift:28:10:28:10 | a : unit | provenance | | -| test.swift:28:10:28:10 | a : unit | test.swift:29:10:29:10 | a | provenance | | -| test.swift:28:18:28:41 | TupleExpr : unit [0] : unit | test.swift:28:9:28:14 | TupleExpr : unit [0] : unit | provenance | | -| test.swift:28:19:28:33 | CallExpr : unit | test.swift:28:18:28:41 | TupleExpr : unit [0] : unit | provenance | | -| test.swift:32:9:32:14 | TupleExpr : unit [1] : unit | test.swift:32:13:32:13 | d : unit | provenance | | -| test.swift:32:13:32:13 | d : unit | test.swift:34:10:34:10 | d | provenance | | -| test.swift:32:18:32:41 | TupleExpr : unit [1] : unit | test.swift:32:9:32:14 | TupleExpr : unit [1] : unit | provenance | | -| test.swift:32:27:32:40 | CallExpr : unit | test.swift:32:18:32:41 | TupleExpr : unit [1] : unit | provenance | | -| test.swift:38:9:38:9 | a : unit | test.swift:39:10:39:10 | a | provenance | | -| test.swift:38:13:38:26 | CallExpr : unit | test.swift:38:9:38:9 | a : unit | provenance | | -| test.swift:46:5:46:9 | [post] tuple : unit [0] : unit | test.swift:47:10:47:14 | tuple : unit [0] : unit | provenance | | -| test.swift:46:5:46:11 | MemberAccessExpr : unit | test.swift:46:5:46:9 | [post] tuple : unit [0] : unit | provenance | | -| test.swift:46:15:46:28 | CallExpr : unit | test.swift:46:5:46:11 | MemberAccessExpr : unit | provenance | | -| test.swift:47:10:47:14 | tuple : unit [0] : unit | test.swift:47:10:47:16 | MemberAccessExpr | provenance | | -| test.swift:53:5:53:14 | [post] deep_tuple : unit [1, 0] : unit | test.swift:58:10:58:19 | deep_tuple : unit [1, 0] : unit | provenance | | -| test.swift:53:5:53:16 | [post] MemberAccessExpr : unit [0] : unit | test.swift:53:5:53:14 | [post] deep_tuple : unit [1, 0] : unit | provenance | | -| test.swift:53:5:53:18 | MemberAccessExpr : unit | test.swift:53:5:53:16 | [post] MemberAccessExpr : unit [0] : unit | provenance | | -| test.swift:53:22:53:35 | CallExpr : unit | test.swift:53:5:53:18 | MemberAccessExpr : unit | provenance | | -| test.swift:58:10:58:19 | deep_tuple : unit [1, 0] : unit | test.swift:58:10:58:21 | MemberAccessExpr : unit [0] : unit | provenance | | -| test.swift:58:10:58:21 | MemberAccessExpr : unit [0] : unit | test.swift:58:10:58:23 | MemberAccessExpr | provenance | | -| test.swift:64:5:64:16 | TupleExpr : unit [0] : unit | test.swift:64:6:64:12 | MemberAccessExpr : unit | provenance | | -| test.swift:64:6:64:10 | [post] tuple : unit [1] : unit | test.swift:66:10:66:14 | tuple : unit [1] : unit | provenance | | -| test.swift:64:6:64:12 | MemberAccessExpr : unit | test.swift:64:6:64:10 | [post] tuple : unit [1] : unit | provenance | | -| test.swift:64:20:64:51 | TupleExpr : unit [0] : unit | test.swift:64:5:64:16 | TupleExpr : unit [0] : unit | provenance | | -| test.swift:64:21:64:35 | CallExpr : unit | test.swift:64:20:64:51 | TupleExpr : unit [0] : unit | provenance | | -| test.swift:66:10:66:14 | tuple : unit [1] : unit | test.swift:66:10:66:16 | MemberAccessExpr | provenance | | -| test.swift:74:5:74:9 | [post] tuple : unit [0] : unit | test.swift:75:10:75:14 | tuple : unit [0] : unit | provenance | | -| test.swift:74:5:74:11 | MemberAccessExpr : unit | test.swift:74:5:74:9 | [post] tuple : unit [0] : unit | provenance | | -| test.swift:74:15:74:29 | CallExpr : unit | test.swift:74:5:74:11 | MemberAccessExpr : unit | provenance | | -| test.swift:75:10:75:14 | tuple : unit [0] : unit | test.swift:75:10:75:16 | MemberAccessExpr | provenance | | -| test.swift:86:9:86:9 | x : unit | test.swift:90:10:90:10 | x | provenance | | -| test.swift:86:9:86:9 | x : unit | test.swift:99:14:99:14 | x | provenance | | -| test.swift:86:13:86:27 | CallExpr : unit | test.swift:86:9:86:9 | x : unit | provenance | | -| test.swift:94:9:94:9 | y : unit | test.swift:96:10:96:10 | y | provenance | | -| test.swift:94:9:94:9 | y : unit | test.swift:100:14:100:14 | y | provenance | | -| test.swift:94:13:94:27 | CallExpr : unit | test.swift:94:9:94:9 | y : unit | provenance | | -| test.swift:107:9:107:13 | [post] tuple : unit [0] : unit | test.swift:112:10:112:14 | tuple : unit [0] : unit | provenance | | -| test.swift:107:9:107:15 | MemberAccessExpr : unit | test.swift:107:9:107:13 | [post] tuple : unit [0] : unit | provenance | | -| test.swift:107:19:107:33 | CallExpr : unit | test.swift:107:9:107:15 | MemberAccessExpr : unit | provenance | | -| test.swift:112:10:112:14 | tuple : unit [0] : unit | test.swift:112:10:112:16 | MemberAccessExpr | provenance | | -| test.swift:117:9:117:13 | tuple : unit [0] : unit | test.swift:120:17:120:21 | tuple : unit [0] : unit | provenance | | -| test.swift:117:9:117:13 | tuple : unit [1] : unit | test.swift:120:17:120:21 | tuple : unit [1] : unit | provenance | | -| test.swift:117:17:117:50 | TupleExpr : unit [0] : unit | test.swift:117:9:117:13 | tuple : unit [0] : unit | provenance | | -| test.swift:117:17:117:50 | TupleExpr : unit [1] : unit | test.swift:117:9:117:13 | tuple : unit [1] : unit | provenance | | -| test.swift:117:18:117:33 | CallExpr : unit | test.swift:117:17:117:50 | TupleExpr : unit [0] : unit | provenance | | -| test.swift:117:35:117:49 | CallExpr : unit | test.swift:117:17:117:50 | TupleExpr : unit [1] : unit | provenance | | -| test.swift:120:9:120:13 | TupleExpr : unit [0] : unit | test.swift:120:10:120:10 | a : unit | provenance | | -| test.swift:120:9:120:13 | TupleExpr : unit [1] : unit | test.swift:120:12:120:12 | b : unit | provenance | | -| test.swift:120:10:120:10 | a : unit | test.swift:125:10:125:10 | a | provenance | | -| test.swift:120:12:120:12 | b : unit | test.swift:126:10:126:10 | b | provenance | | -| test.swift:120:17:120:21 | tuple : unit [0] : unit | test.swift:120:9:120:13 | TupleExpr : unit [0] : unit | provenance | | -| test.swift:120:17:120:21 | tuple : unit [1] : unit | test.swift:120:9:120:13 | TupleExpr : unit [1] : unit | provenance | | -| test.swift:131:5:131:5 | a : unit | test.swift:131:14:131:14 | a | provenance | | -| test.swift:131:5:131:5 | a : unit | test.swift:132:10:132:10 | a | provenance | | -| test.swift:131:19:131:33 | CallExpr : unit | test.swift:131:5:131:5 | a : unit | provenance | | +| implicit-self.swift:11:9:11:12 | [post] self [x] | implicit-self.swift:12:14:12:17 | self [x] | provenance | | +| implicit-self.swift:11:9:11:14 | MemberAccessExpr | implicit-self.swift:11:9:11:12 | [post] self [x] | provenance | | +| implicit-self.swift:11:18:11:31 | CallExpr | implicit-self.swift:11:9:11:14 | MemberAccessExpr | provenance | | +| implicit-self.swift:12:14:12:17 | self [x] | implicit-self.swift:12:14:12:19 | MemberAccessExpr | provenance | | +| implicit-self.swift:17:9:17:9 | x | implicit-self.swift:18:14:18:14 | x | provenance | | +| implicit-self.swift:17:13:17:26 | CallExpr | implicit-self.swift:17:9:17:9 | x | provenance | | +| implicit-self.swift:23:9:23:9 | x | implicit-self.swift:24:14:24:17 | self [x] | provenance | | +| implicit-self.swift:23:13:23:26 | CallExpr | implicit-self.swift:23:9:23:9 | x | provenance | | +| implicit-self.swift:24:14:24:17 | self [x] | implicit-self.swift:24:14:24:19 | MemberAccessExpr | provenance | | +| implicit-self.swift:29:9:29:12 | [post] self [x] | implicit-self.swift:30:14:30:14 | x | provenance | | +| implicit-self.swift:29:9:29:14 | MemberAccessExpr | implicit-self.swift:29:9:29:12 | [post] self [x] | provenance | | +| implicit-self.swift:29:18:29:31 | CallExpr | implicit-self.swift:29:9:29:14 | MemberAccessExpr | provenance | | +| implicit-self.swift:35:9:35:12 | [post] self [box, x] | implicit-self.swift:36:14:36:17 | self [box, x] | provenance | | +| implicit-self.swift:35:9:35:16 | [post] MemberAccessExpr [x] | implicit-self.swift:35:9:35:12 | [post] self [box, x] | provenance | | +| implicit-self.swift:35:9:35:18 | MemberAccessExpr | implicit-self.swift:35:9:35:16 | [post] MemberAccessExpr [x] | provenance | | +| implicit-self.swift:35:22:35:35 | CallExpr | implicit-self.swift:35:9:35:18 | MemberAccessExpr | provenance | | +| implicit-self.swift:36:14:36:17 | self [box, x] | implicit-self.swift:36:14:36:21 | MemberAccessExpr [x] | provenance | | +| implicit-self.swift:36:14:36:21 | MemberAccessExpr [x] | implicit-self.swift:36:14:36:23 | MemberAccessExpr | provenance | | +| implicit-self.swift:41:9:41:11 | [post] box [x] | implicit-self.swift:42:14:42:16 | box [x] | provenance | | +| implicit-self.swift:41:9:41:13 | MemberAccessExpr | implicit-self.swift:41:9:41:11 | [post] box [x] | provenance | | +| implicit-self.swift:41:17:41:30 | CallExpr | implicit-self.swift:41:9:41:13 | MemberAccessExpr | provenance | | +| implicit-self.swift:42:14:42:16 | box [x] | implicit-self.swift:42:14:42:18 | MemberAccessExpr | provenance | | +| implicit-self.swift:47:9:47:11 | [post] box [x] | implicit-self.swift:48:14:48:17 | self [box, x] | provenance | | +| implicit-self.swift:47:9:47:13 | MemberAccessExpr | implicit-self.swift:47:9:47:11 | [post] box [x] | provenance | | +| implicit-self.swift:47:17:47:30 | CallExpr | implicit-self.swift:47:9:47:13 | MemberAccessExpr | provenance | | +| implicit-self.swift:48:14:48:17 | self [box, x] | implicit-self.swift:48:14:48:21 | MemberAccessExpr [x] | provenance | | +| implicit-self.swift:48:14:48:21 | MemberAccessExpr [x] | implicit-self.swift:48:14:48:23 | MemberAccessExpr | provenance | | +| implicit-self.swift:53:9:53:12 | [post] self [box, x] | implicit-self.swift:54:14:54:16 | box [x] | provenance | | +| implicit-self.swift:53:9:53:16 | [post] MemberAccessExpr [x] | implicit-self.swift:53:9:53:12 | [post] self [box, x] | provenance | | +| implicit-self.swift:53:9:53:18 | MemberAccessExpr | implicit-self.swift:53:9:53:16 | [post] MemberAccessExpr [x] | provenance | | +| implicit-self.swift:53:22:53:35 | CallExpr | implicit-self.swift:53:9:53:18 | MemberAccessExpr | provenance | | +| implicit-self.swift:54:14:54:16 | box [x] | implicit-self.swift:54:14:54:18 | MemberAccessExpr | provenance | | +| test.swift:6:10:6:23 | CallExpr | test.swift:6:10:6:32 | BinaryExpr | provenance | | +| test.swift:7:19:7:32 | CallExpr | test.swift:7:10:7:32 | BinaryExpr | provenance | | +| test.swift:9:13:9:26 | CallExpr | test.swift:9:10:9:33 | StringInterpolationExpr | provenance | | +| test.swift:10:18:10:31 | CallExpr | test.swift:10:10:10:33 | StringInterpolationExpr | provenance | | +| test.swift:11:18:11:31 | CallExpr | test.swift:11:10:11:38 | StringInterpolationExpr | provenance | | +| test.swift:16:10:16:33 | TupleExpr [0] | test.swift:16:10:16:35 | MemberAccessExpr | provenance | | +| test.swift:16:11:16:25 | CallExpr | test.swift:16:10:16:33 | TupleExpr [0] | provenance | | +| test.swift:19:10:19:33 | TupleExpr [1] | test.swift:19:10:19:35 | MemberAccessExpr | provenance | | +| test.swift:19:19:19:32 | CallExpr | test.swift:19:10:19:33 | TupleExpr [1] | provenance | | +| test.swift:23:9:23:9 | a | test.swift:24:10:24:10 | a | provenance | | +| test.swift:23:13:23:26 | CallExpr | test.swift:23:9:23:9 | a | provenance | | +| test.swift:28:9:28:14 | TupleExpr [0] | test.swift:28:10:28:10 | a | provenance | | +| test.swift:28:10:28:10 | a | test.swift:29:10:29:10 | a | provenance | | +| test.swift:28:18:28:41 | TupleExpr [0] | test.swift:28:9:28:14 | TupleExpr [0] | provenance | | +| test.swift:28:19:28:33 | CallExpr | test.swift:28:18:28:41 | TupleExpr [0] | provenance | | +| test.swift:32:9:32:14 | TupleExpr [1] | test.swift:32:13:32:13 | d | provenance | | +| test.swift:32:13:32:13 | d | test.swift:34:10:34:10 | d | provenance | | +| test.swift:32:18:32:41 | TupleExpr [1] | test.swift:32:9:32:14 | TupleExpr [1] | provenance | | +| test.swift:32:27:32:40 | CallExpr | test.swift:32:18:32:41 | TupleExpr [1] | provenance | | +| test.swift:38:9:38:9 | a | test.swift:39:10:39:10 | a | provenance | | +| test.swift:38:13:38:26 | CallExpr | test.swift:38:9:38:9 | a | provenance | | +| test.swift:46:5:46:9 | [post] tuple [0] | test.swift:47:10:47:14 | tuple [0] | provenance | | +| test.swift:46:5:46:11 | MemberAccessExpr | test.swift:46:5:46:9 | [post] tuple [0] | provenance | | +| test.swift:46:15:46:28 | CallExpr | test.swift:46:5:46:11 | MemberAccessExpr | provenance | | +| test.swift:47:10:47:14 | tuple [0] | test.swift:47:10:47:16 | MemberAccessExpr | provenance | | +| test.swift:53:5:53:14 | [post] deep_tuple [1, 0] | test.swift:58:10:58:19 | deep_tuple [1, 0] | provenance | | +| test.swift:53:5:53:16 | [post] MemberAccessExpr [0] | test.swift:53:5:53:14 | [post] deep_tuple [1, 0] | provenance | | +| test.swift:53:5:53:18 | MemberAccessExpr | test.swift:53:5:53:16 | [post] MemberAccessExpr [0] | provenance | | +| test.swift:53:22:53:35 | CallExpr | test.swift:53:5:53:18 | MemberAccessExpr | provenance | | +| test.swift:58:10:58:19 | deep_tuple [1, 0] | test.swift:58:10:58:21 | MemberAccessExpr [0] | provenance | | +| test.swift:58:10:58:21 | MemberAccessExpr [0] | test.swift:58:10:58:23 | MemberAccessExpr | provenance | | +| test.swift:64:5:64:16 | TupleExpr [0] | test.swift:64:6:64:12 | MemberAccessExpr | provenance | | +| test.swift:64:6:64:10 | [post] tuple [1] | test.swift:66:10:66:14 | tuple [1] | provenance | | +| test.swift:64:6:64:12 | MemberAccessExpr | test.swift:64:6:64:10 | [post] tuple [1] | provenance | | +| test.swift:64:20:64:51 | TupleExpr [0] | test.swift:64:5:64:16 | TupleExpr [0] | provenance | | +| test.swift:64:21:64:35 | CallExpr | test.swift:64:20:64:51 | TupleExpr [0] | provenance | | +| test.swift:66:10:66:14 | tuple [1] | test.swift:66:10:66:16 | MemberAccessExpr | provenance | | +| test.swift:74:5:74:9 | [post] tuple [0] | test.swift:75:10:75:14 | tuple [0] | provenance | | +| test.swift:74:5:74:11 | MemberAccessExpr | test.swift:74:5:74:9 | [post] tuple [0] | provenance | | +| test.swift:74:15:74:29 | CallExpr | test.swift:74:5:74:11 | MemberAccessExpr | provenance | | +| test.swift:75:10:75:14 | tuple [0] | test.swift:75:10:75:16 | MemberAccessExpr | provenance | | +| test.swift:86:9:86:9 | x | test.swift:90:10:90:10 | x | provenance | | +| test.swift:86:9:86:9 | x | test.swift:99:14:99:14 | x | provenance | | +| test.swift:86:13:86:27 | CallExpr | test.swift:86:9:86:9 | x | provenance | | +| test.swift:94:9:94:9 | y | test.swift:96:10:96:10 | y | provenance | | +| test.swift:94:9:94:9 | y | test.swift:100:14:100:14 | y | provenance | | +| test.swift:94:13:94:27 | CallExpr | test.swift:94:9:94:9 | y | provenance | | +| test.swift:107:9:107:13 | [post] tuple [0] | test.swift:112:10:112:14 | tuple [0] | provenance | | +| test.swift:107:9:107:15 | MemberAccessExpr | test.swift:107:9:107:13 | [post] tuple [0] | provenance | | +| test.swift:107:19:107:33 | CallExpr | test.swift:107:9:107:15 | MemberAccessExpr | provenance | | +| test.swift:112:10:112:14 | tuple [0] | test.swift:112:10:112:16 | MemberAccessExpr | provenance | | +| test.swift:117:9:117:13 | tuple [0] | test.swift:120:17:120:21 | tuple [0] | provenance | | +| test.swift:117:9:117:13 | tuple [1] | test.swift:120:17:120:21 | tuple [1] | provenance | | +| test.swift:117:17:117:50 | TupleExpr [0] | test.swift:117:9:117:13 | tuple [0] | provenance | | +| test.swift:117:17:117:50 | TupleExpr [1] | test.swift:117:9:117:13 | tuple [1] | provenance | | +| test.swift:117:18:117:33 | CallExpr | test.swift:117:17:117:50 | TupleExpr [0] | provenance | | +| test.swift:117:35:117:49 | CallExpr | test.swift:117:17:117:50 | TupleExpr [1] | provenance | | +| test.swift:120:9:120:13 | TupleExpr [0] | test.swift:120:10:120:10 | a | provenance | | +| test.swift:120:9:120:13 | TupleExpr [1] | test.swift:120:12:120:12 | b | provenance | | +| test.swift:120:10:120:10 | a | test.swift:125:10:125:10 | a | provenance | | +| test.swift:120:12:120:12 | b | test.swift:126:10:126:10 | b | provenance | | +| test.swift:120:17:120:21 | tuple [0] | test.swift:120:9:120:13 | TupleExpr [0] | provenance | | +| test.swift:120:17:120:21 | tuple [1] | test.swift:120:9:120:13 | TupleExpr [1] | provenance | | +| test.swift:131:5:131:5 | a | test.swift:131:14:131:14 | a | provenance | | +| test.swift:131:5:131:5 | a | test.swift:132:10:132:10 | a | provenance | | +| test.swift:131:19:131:33 | CallExpr | test.swift:131:5:131:5 | a | provenance | | nodes -| implicit-self.swift:11:9:11:12 | [post] self : unit [x] : unit | semmle.label | [post] self : unit [x] : unit | -| implicit-self.swift:11:9:11:14 | MemberAccessExpr : unit | semmle.label | MemberAccessExpr : unit | -| implicit-self.swift:11:18:11:31 | CallExpr : unit | semmle.label | CallExpr : unit | -| implicit-self.swift:12:14:12:17 | self : unit [x] : unit | semmle.label | self : unit [x] : unit | +| implicit-self.swift:11:9:11:12 | [post] self [x] | semmle.label | [post] self [x] | +| implicit-self.swift:11:9:11:14 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| implicit-self.swift:11:18:11:31 | CallExpr | semmle.label | CallExpr | +| implicit-self.swift:12:14:12:17 | self [x] | semmle.label | self [x] | | implicit-self.swift:12:14:12:19 | MemberAccessExpr | semmle.label | MemberAccessExpr | -| implicit-self.swift:17:9:17:9 | x : unit | semmle.label | x : unit | -| implicit-self.swift:17:13:17:26 | CallExpr : unit | semmle.label | CallExpr : unit | +| implicit-self.swift:17:9:17:9 | x | semmle.label | x | +| implicit-self.swift:17:13:17:26 | CallExpr | semmle.label | CallExpr | | implicit-self.swift:18:14:18:14 | x | semmle.label | x | -| implicit-self.swift:23:9:23:9 | x : unit | semmle.label | x : unit | -| implicit-self.swift:23:13:23:26 | CallExpr : unit | semmle.label | CallExpr : unit | -| implicit-self.swift:24:14:24:17 | self : unit [x] : unit | semmle.label | self : unit [x] : unit | +| implicit-self.swift:23:9:23:9 | x | semmle.label | x | +| implicit-self.swift:23:13:23:26 | CallExpr | semmle.label | CallExpr | +| implicit-self.swift:24:14:24:17 | self [x] | semmle.label | self [x] | | implicit-self.swift:24:14:24:19 | MemberAccessExpr | semmle.label | MemberAccessExpr | -| implicit-self.swift:29:9:29:12 | [post] self : unit [x] : unit | semmle.label | [post] self : unit [x] : unit | -| implicit-self.swift:29:9:29:14 | MemberAccessExpr : unit | semmle.label | MemberAccessExpr : unit | -| implicit-self.swift:29:18:29:31 | CallExpr : unit | semmle.label | CallExpr : unit | +| implicit-self.swift:29:9:29:12 | [post] self [x] | semmle.label | [post] self [x] | +| implicit-self.swift:29:9:29:14 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| implicit-self.swift:29:18:29:31 | CallExpr | semmle.label | CallExpr | | implicit-self.swift:30:14:30:14 | x | semmle.label | x | -| implicit-self.swift:35:9:35:12 | [post] self : unit [box, x] : unit | semmle.label | [post] self : unit [box, x] : unit | -| implicit-self.swift:35:9:35:16 | [post] MemberAccessExpr : unit [x] : unit | semmle.label | [post] MemberAccessExpr : unit [x] : unit | -| implicit-self.swift:35:9:35:18 | MemberAccessExpr : unit | semmle.label | MemberAccessExpr : unit | -| implicit-self.swift:35:22:35:35 | CallExpr : unit | semmle.label | CallExpr : unit | -| implicit-self.swift:36:14:36:17 | self : unit [box, x] : unit | semmle.label | self : unit [box, x] : unit | -| implicit-self.swift:36:14:36:21 | MemberAccessExpr : unit [x] : unit | semmle.label | MemberAccessExpr : unit [x] : unit | +| implicit-self.swift:35:9:35:12 | [post] self [box, x] | semmle.label | [post] self [box, x] | +| implicit-self.swift:35:9:35:16 | [post] MemberAccessExpr [x] | semmle.label | [post] MemberAccessExpr [x] | +| implicit-self.swift:35:9:35:18 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| implicit-self.swift:35:22:35:35 | CallExpr | semmle.label | CallExpr | +| implicit-self.swift:36:14:36:17 | self [box, x] | semmle.label | self [box, x] | +| implicit-self.swift:36:14:36:21 | MemberAccessExpr [x] | semmle.label | MemberAccessExpr [x] | | implicit-self.swift:36:14:36:23 | MemberAccessExpr | semmle.label | MemberAccessExpr | -| implicit-self.swift:41:9:41:11 | [post] box : unit [x] : unit | semmle.label | [post] box : unit [x] : unit | -| implicit-self.swift:41:9:41:13 | MemberAccessExpr : unit | semmle.label | MemberAccessExpr : unit | -| implicit-self.swift:41:17:41:30 | CallExpr : unit | semmle.label | CallExpr : unit | -| implicit-self.swift:42:14:42:16 | box : unit [x] : unit | semmle.label | box : unit [x] : unit | +| implicit-self.swift:41:9:41:11 | [post] box [x] | semmle.label | [post] box [x] | +| implicit-self.swift:41:9:41:13 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| implicit-self.swift:41:17:41:30 | CallExpr | semmle.label | CallExpr | +| implicit-self.swift:42:14:42:16 | box [x] | semmle.label | box [x] | | implicit-self.swift:42:14:42:18 | MemberAccessExpr | semmle.label | MemberAccessExpr | -| implicit-self.swift:47:9:47:11 | [post] box : unit [x] : unit | semmle.label | [post] box : unit [x] : unit | -| implicit-self.swift:47:9:47:13 | MemberAccessExpr : unit | semmle.label | MemberAccessExpr : unit | -| implicit-self.swift:47:17:47:30 | CallExpr : unit | semmle.label | CallExpr : unit | -| implicit-self.swift:48:14:48:17 | self : unit [box, x] : unit | semmle.label | self : unit [box, x] : unit | -| implicit-self.swift:48:14:48:21 | MemberAccessExpr : unit [x] : unit | semmle.label | MemberAccessExpr : unit [x] : unit | +| implicit-self.swift:47:9:47:11 | [post] box [x] | semmle.label | [post] box [x] | +| implicit-self.swift:47:9:47:13 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| implicit-self.swift:47:17:47:30 | CallExpr | semmle.label | CallExpr | +| implicit-self.swift:48:14:48:17 | self [box, x] | semmle.label | self [box, x] | +| implicit-self.swift:48:14:48:21 | MemberAccessExpr [x] | semmle.label | MemberAccessExpr [x] | | implicit-self.swift:48:14:48:23 | MemberAccessExpr | semmle.label | MemberAccessExpr | -| implicit-self.swift:53:9:53:12 | [post] self : unit [box, x] : unit | semmle.label | [post] self : unit [box, x] : unit | -| implicit-self.swift:53:9:53:16 | [post] MemberAccessExpr : unit [x] : unit | semmle.label | [post] MemberAccessExpr : unit [x] : unit | -| implicit-self.swift:53:9:53:18 | MemberAccessExpr : unit | semmle.label | MemberAccessExpr : unit | -| implicit-self.swift:53:22:53:35 | CallExpr : unit | semmle.label | CallExpr : unit | -| implicit-self.swift:54:14:54:16 | box : unit [x] : unit | semmle.label | box : unit [x] : unit | +| implicit-self.swift:53:9:53:12 | [post] self [box, x] | semmle.label | [post] self [box, x] | +| implicit-self.swift:53:9:53:16 | [post] MemberAccessExpr [x] | semmle.label | [post] MemberAccessExpr [x] | +| implicit-self.swift:53:9:53:18 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| implicit-self.swift:53:22:53:35 | CallExpr | semmle.label | CallExpr | +| implicit-self.swift:54:14:54:16 | box [x] | semmle.label | box [x] | | implicit-self.swift:54:14:54:18 | MemberAccessExpr | semmle.label | MemberAccessExpr | | test.swift:2:10:2:21 | CallExpr | semmle.label | CallExpr | -| test.swift:6:10:6:23 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:6:10:6:23 | CallExpr | semmle.label | CallExpr | | test.swift:6:10:6:32 | BinaryExpr | semmle.label | BinaryExpr | | test.swift:7:10:7:32 | BinaryExpr | semmle.label | BinaryExpr | -| test.swift:7:19:7:32 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:7:19:7:32 | CallExpr | semmle.label | CallExpr | | test.swift:9:10:9:33 | StringInterpolationExpr | semmle.label | StringInterpolationExpr | -| test.swift:9:13:9:26 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:9:13:9:26 | CallExpr | semmle.label | CallExpr | | test.swift:10:10:10:33 | StringInterpolationExpr | semmle.label | StringInterpolationExpr | -| test.swift:10:18:10:31 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:10:18:10:31 | CallExpr | semmle.label | CallExpr | | test.swift:11:10:11:38 | StringInterpolationExpr | semmle.label | StringInterpolationExpr | -| test.swift:11:18:11:31 | CallExpr : unit | semmle.label | CallExpr : unit | -| test.swift:16:10:16:33 | TupleExpr : unit [0] : unit | semmle.label | TupleExpr : unit [0] : unit | +| test.swift:11:18:11:31 | CallExpr | semmle.label | CallExpr | +| test.swift:16:10:16:33 | TupleExpr [0] | semmle.label | TupleExpr [0] | | test.swift:16:10:16:35 | MemberAccessExpr | semmle.label | MemberAccessExpr | -| test.swift:16:11:16:25 | CallExpr : unit | semmle.label | CallExpr : unit | -| test.swift:19:10:19:33 | TupleExpr : unit [1] : unit | semmle.label | TupleExpr : unit [1] : unit | +| test.swift:16:11:16:25 | CallExpr | semmle.label | CallExpr | +| test.swift:19:10:19:33 | TupleExpr [1] | semmle.label | TupleExpr [1] | | test.swift:19:10:19:35 | MemberAccessExpr | semmle.label | MemberAccessExpr | -| test.swift:19:19:19:32 | CallExpr : unit | semmle.label | CallExpr : unit | -| test.swift:23:9:23:9 | a : unit | semmle.label | a : unit | -| test.swift:23:13:23:26 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:19:19:19:32 | CallExpr | semmle.label | CallExpr | +| test.swift:23:9:23:9 | a | semmle.label | a | +| test.swift:23:13:23:26 | CallExpr | semmle.label | CallExpr | | test.swift:24:10:24:10 | a | semmle.label | a | -| test.swift:28:9:28:14 | TupleExpr : unit [0] : unit | semmle.label | TupleExpr : unit [0] : unit | -| test.swift:28:10:28:10 | a : unit | semmle.label | a : unit | -| test.swift:28:18:28:41 | TupleExpr : unit [0] : unit | semmle.label | TupleExpr : unit [0] : unit | -| test.swift:28:19:28:33 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:28:9:28:14 | TupleExpr [0] | semmle.label | TupleExpr [0] | +| test.swift:28:10:28:10 | a | semmle.label | a | +| test.swift:28:18:28:41 | TupleExpr [0] | semmle.label | TupleExpr [0] | +| test.swift:28:19:28:33 | CallExpr | semmle.label | CallExpr | | test.swift:29:10:29:10 | a | semmle.label | a | -| test.swift:32:9:32:14 | TupleExpr : unit [1] : unit | semmle.label | TupleExpr : unit [1] : unit | -| test.swift:32:13:32:13 | d : unit | semmle.label | d : unit | -| test.swift:32:18:32:41 | TupleExpr : unit [1] : unit | semmle.label | TupleExpr : unit [1] : unit | -| test.swift:32:27:32:40 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:32:9:32:14 | TupleExpr [1] | semmle.label | TupleExpr [1] | +| test.swift:32:13:32:13 | d | semmle.label | d | +| test.swift:32:18:32:41 | TupleExpr [1] | semmle.label | TupleExpr [1] | +| test.swift:32:27:32:40 | CallExpr | semmle.label | CallExpr | | test.swift:34:10:34:10 | d | semmle.label | d | -| test.swift:38:9:38:9 | a : unit | semmle.label | a : unit | -| test.swift:38:13:38:26 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:38:9:38:9 | a | semmle.label | a | +| test.swift:38:13:38:26 | CallExpr | semmle.label | CallExpr | | test.swift:39:10:39:10 | a | semmle.label | a | -| test.swift:46:5:46:9 | [post] tuple : unit [0] : unit | semmle.label | [post] tuple : unit [0] : unit | -| test.swift:46:5:46:11 | MemberAccessExpr : unit | semmle.label | MemberAccessExpr : unit | -| test.swift:46:15:46:28 | CallExpr : unit | semmle.label | CallExpr : unit | -| test.swift:47:10:47:14 | tuple : unit [0] : unit | semmle.label | tuple : unit [0] : unit | +| test.swift:46:5:46:9 | [post] tuple [0] | semmle.label | [post] tuple [0] | +| test.swift:46:5:46:11 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| test.swift:46:15:46:28 | CallExpr | semmle.label | CallExpr | +| test.swift:47:10:47:14 | tuple [0] | semmle.label | tuple [0] | | test.swift:47:10:47:16 | MemberAccessExpr | semmle.label | MemberAccessExpr | -| test.swift:53:5:53:14 | [post] deep_tuple : unit [1, 0] : unit | semmle.label | [post] deep_tuple : unit [1, 0] : unit | -| test.swift:53:5:53:16 | [post] MemberAccessExpr : unit [0] : unit | semmle.label | [post] MemberAccessExpr : unit [0] : unit | -| test.swift:53:5:53:18 | MemberAccessExpr : unit | semmle.label | MemberAccessExpr : unit | -| test.swift:53:22:53:35 | CallExpr : unit | semmle.label | CallExpr : unit | -| test.swift:58:10:58:19 | deep_tuple : unit [1, 0] : unit | semmle.label | deep_tuple : unit [1, 0] : unit | -| test.swift:58:10:58:21 | MemberAccessExpr : unit [0] : unit | semmle.label | MemberAccessExpr : unit [0] : unit | +| test.swift:53:5:53:14 | [post] deep_tuple [1, 0] | semmle.label | [post] deep_tuple [1, 0] | +| test.swift:53:5:53:16 | [post] MemberAccessExpr [0] | semmle.label | [post] MemberAccessExpr [0] | +| test.swift:53:5:53:18 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| test.swift:53:22:53:35 | CallExpr | semmle.label | CallExpr | +| test.swift:58:10:58:19 | deep_tuple [1, 0] | semmle.label | deep_tuple [1, 0] | +| test.swift:58:10:58:21 | MemberAccessExpr [0] | semmle.label | MemberAccessExpr [0] | | test.swift:58:10:58:23 | MemberAccessExpr | semmle.label | MemberAccessExpr | -| test.swift:64:5:64:16 | TupleExpr : unit [0] : unit | semmle.label | TupleExpr : unit [0] : unit | -| test.swift:64:6:64:10 | [post] tuple : unit [1] : unit | semmle.label | [post] tuple : unit [1] : unit | -| test.swift:64:6:64:12 | MemberAccessExpr : unit | semmle.label | MemberAccessExpr : unit | -| test.swift:64:20:64:51 | TupleExpr : unit [0] : unit | semmle.label | TupleExpr : unit [0] : unit | -| test.swift:64:21:64:35 | CallExpr : unit | semmle.label | CallExpr : unit | -| test.swift:66:10:66:14 | tuple : unit [1] : unit | semmle.label | tuple : unit [1] : unit | +| test.swift:64:5:64:16 | TupleExpr [0] | semmle.label | TupleExpr [0] | +| test.swift:64:6:64:10 | [post] tuple [1] | semmle.label | [post] tuple [1] | +| test.swift:64:6:64:12 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| test.swift:64:20:64:51 | TupleExpr [0] | semmle.label | TupleExpr [0] | +| test.swift:64:21:64:35 | CallExpr | semmle.label | CallExpr | +| test.swift:66:10:66:14 | tuple [1] | semmle.label | tuple [1] | | test.swift:66:10:66:16 | MemberAccessExpr | semmle.label | MemberAccessExpr | -| test.swift:74:5:74:9 | [post] tuple : unit [0] : unit | semmle.label | [post] tuple : unit [0] : unit | -| test.swift:74:5:74:11 | MemberAccessExpr : unit | semmle.label | MemberAccessExpr : unit | -| test.swift:74:15:74:29 | CallExpr : unit | semmle.label | CallExpr : unit | -| test.swift:75:10:75:14 | tuple : unit [0] : unit | semmle.label | tuple : unit [0] : unit | +| test.swift:74:5:74:9 | [post] tuple [0] | semmle.label | [post] tuple [0] | +| test.swift:74:5:74:11 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| test.swift:74:15:74:29 | CallExpr | semmle.label | CallExpr | +| test.swift:75:10:75:14 | tuple [0] | semmle.label | tuple [0] | | test.swift:75:10:75:16 | MemberAccessExpr | semmle.label | MemberAccessExpr | -| test.swift:86:9:86:9 | x : unit | semmle.label | x : unit | -| test.swift:86:13:86:27 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:86:9:86:9 | x | semmle.label | x | +| test.swift:86:13:86:27 | CallExpr | semmle.label | CallExpr | | test.swift:90:10:90:10 | x | semmle.label | x | -| test.swift:94:9:94:9 | y : unit | semmle.label | y : unit | -| test.swift:94:13:94:27 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:94:9:94:9 | y | semmle.label | y | +| test.swift:94:13:94:27 | CallExpr | semmle.label | CallExpr | | test.swift:96:10:96:10 | y | semmle.label | y | | test.swift:99:14:99:14 | x | semmle.label | x | | test.swift:100:14:100:14 | y | semmle.label | y | -| test.swift:107:9:107:13 | [post] tuple : unit [0] : unit | semmle.label | [post] tuple : unit [0] : unit | -| test.swift:107:9:107:15 | MemberAccessExpr : unit | semmle.label | MemberAccessExpr : unit | -| test.swift:107:19:107:33 | CallExpr : unit | semmle.label | CallExpr : unit | -| test.swift:112:10:112:14 | tuple : unit [0] : unit | semmle.label | tuple : unit [0] : unit | +| test.swift:107:9:107:13 | [post] tuple [0] | semmle.label | [post] tuple [0] | +| test.swift:107:9:107:15 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| test.swift:107:19:107:33 | CallExpr | semmle.label | CallExpr | +| test.swift:112:10:112:14 | tuple [0] | semmle.label | tuple [0] | | test.swift:112:10:112:16 | MemberAccessExpr | semmle.label | MemberAccessExpr | -| test.swift:117:9:117:13 | tuple : unit [0] : unit | semmle.label | tuple : unit [0] : unit | -| test.swift:117:9:117:13 | tuple : unit [1] : unit | semmle.label | tuple : unit [1] : unit | -| test.swift:117:17:117:50 | TupleExpr : unit [0] : unit | semmle.label | TupleExpr : unit [0] : unit | -| test.swift:117:17:117:50 | TupleExpr : unit [1] : unit | semmle.label | TupleExpr : unit [1] : unit | -| test.swift:117:18:117:33 | CallExpr : unit | semmle.label | CallExpr : unit | -| test.swift:117:35:117:49 | CallExpr : unit | semmle.label | CallExpr : unit | -| test.swift:120:9:120:13 | TupleExpr : unit [0] : unit | semmle.label | TupleExpr : unit [0] : unit | -| test.swift:120:9:120:13 | TupleExpr : unit [1] : unit | semmle.label | TupleExpr : unit [1] : unit | -| test.swift:120:10:120:10 | a : unit | semmle.label | a : unit | -| test.swift:120:12:120:12 | b : unit | semmle.label | b : unit | -| test.swift:120:17:120:21 | tuple : unit [0] : unit | semmle.label | tuple : unit [0] : unit | -| test.swift:120:17:120:21 | tuple : unit [1] : unit | semmle.label | tuple : unit [1] : unit | +| test.swift:117:9:117:13 | tuple [0] | semmle.label | tuple [0] | +| test.swift:117:9:117:13 | tuple [1] | semmle.label | tuple [1] | +| test.swift:117:17:117:50 | TupleExpr [0] | semmle.label | TupleExpr [0] | +| test.swift:117:17:117:50 | TupleExpr [1] | semmle.label | TupleExpr [1] | +| test.swift:117:18:117:33 | CallExpr | semmle.label | CallExpr | +| test.swift:117:35:117:49 | CallExpr | semmle.label | CallExpr | +| test.swift:120:9:120:13 | TupleExpr [0] | semmle.label | TupleExpr [0] | +| test.swift:120:9:120:13 | TupleExpr [1] | semmle.label | TupleExpr [1] | +| test.swift:120:10:120:10 | a | semmle.label | a | +| test.swift:120:12:120:12 | b | semmle.label | b | +| test.swift:120:17:120:21 | tuple [0] | semmle.label | tuple [0] | +| test.swift:120:17:120:21 | tuple [1] | semmle.label | tuple [1] | | test.swift:125:10:125:10 | a | semmle.label | a | | test.swift:126:10:126:10 | b | semmle.label | b | -| test.swift:131:5:131:5 | a : unit | semmle.label | a : unit | +| test.swift:131:5:131:5 | a | semmle.label | a | | test.swift:131:14:131:14 | a | semmle.label | a | -| test.swift:131:19:131:33 | CallExpr : unit | semmle.label | CallExpr : unit | +| test.swift:131:19:131:33 | CallExpr | semmle.label | CallExpr | | test.swift:132:10:132:10 | a | semmle.label | a | subpaths testFailures #select -| implicit-self.swift:12:14:12:19 | MemberAccessExpr | implicit-self.swift:11:18:11:31 | CallExpr : unit | implicit-self.swift:12:14:12:19 | MemberAccessExpr | $@ | implicit-self.swift:11:18:11:31 | CallExpr : unit | CallExpr : unit | -| implicit-self.swift:18:14:18:14 | x | implicit-self.swift:17:13:17:26 | CallExpr : unit | implicit-self.swift:18:14:18:14 | x | $@ | implicit-self.swift:17:13:17:26 | CallExpr : unit | CallExpr : unit | -| implicit-self.swift:24:14:24:19 | MemberAccessExpr | implicit-self.swift:23:13:23:26 | CallExpr : unit | implicit-self.swift:24:14:24:19 | MemberAccessExpr | $@ | implicit-self.swift:23:13:23:26 | CallExpr : unit | CallExpr : unit | -| implicit-self.swift:30:14:30:14 | x | implicit-self.swift:29:18:29:31 | CallExpr : unit | implicit-self.swift:30:14:30:14 | x | $@ | implicit-self.swift:29:18:29:31 | CallExpr : unit | CallExpr : unit | -| implicit-self.swift:36:14:36:23 | MemberAccessExpr | implicit-self.swift:35:22:35:35 | CallExpr : unit | implicit-self.swift:36:14:36:23 | MemberAccessExpr | $@ | implicit-self.swift:35:22:35:35 | CallExpr : unit | CallExpr : unit | -| implicit-self.swift:42:14:42:18 | MemberAccessExpr | implicit-self.swift:41:17:41:30 | CallExpr : unit | implicit-self.swift:42:14:42:18 | MemberAccessExpr | $@ | implicit-self.swift:41:17:41:30 | CallExpr : unit | CallExpr : unit | -| implicit-self.swift:48:14:48:23 | MemberAccessExpr | implicit-self.swift:47:17:47:30 | CallExpr : unit | implicit-self.swift:48:14:48:23 | MemberAccessExpr | $@ | implicit-self.swift:47:17:47:30 | CallExpr : unit | CallExpr : unit | -| implicit-self.swift:54:14:54:18 | MemberAccessExpr | implicit-self.swift:53:22:53:35 | CallExpr : unit | implicit-self.swift:54:14:54:18 | MemberAccessExpr | $@ | implicit-self.swift:53:22:53:35 | CallExpr : unit | CallExpr : unit | +| implicit-self.swift:12:14:12:19 | MemberAccessExpr | implicit-self.swift:11:18:11:31 | CallExpr | implicit-self.swift:12:14:12:19 | MemberAccessExpr | $@ | implicit-self.swift:11:18:11:31 | CallExpr | CallExpr | +| implicit-self.swift:18:14:18:14 | x | implicit-self.swift:17:13:17:26 | CallExpr | implicit-self.swift:18:14:18:14 | x | $@ | implicit-self.swift:17:13:17:26 | CallExpr | CallExpr | +| implicit-self.swift:24:14:24:19 | MemberAccessExpr | implicit-self.swift:23:13:23:26 | CallExpr | implicit-self.swift:24:14:24:19 | MemberAccessExpr | $@ | implicit-self.swift:23:13:23:26 | CallExpr | CallExpr | +| implicit-self.swift:30:14:30:14 | x | implicit-self.swift:29:18:29:31 | CallExpr | implicit-self.swift:30:14:30:14 | x | $@ | implicit-self.swift:29:18:29:31 | CallExpr | CallExpr | +| implicit-self.swift:36:14:36:23 | MemberAccessExpr | implicit-self.swift:35:22:35:35 | CallExpr | implicit-self.swift:36:14:36:23 | MemberAccessExpr | $@ | implicit-self.swift:35:22:35:35 | CallExpr | CallExpr | +| implicit-self.swift:42:14:42:18 | MemberAccessExpr | implicit-self.swift:41:17:41:30 | CallExpr | implicit-self.swift:42:14:42:18 | MemberAccessExpr | $@ | implicit-self.swift:41:17:41:30 | CallExpr | CallExpr | +| implicit-self.swift:48:14:48:23 | MemberAccessExpr | implicit-self.swift:47:17:47:30 | CallExpr | implicit-self.swift:48:14:48:23 | MemberAccessExpr | $@ | implicit-self.swift:47:17:47:30 | CallExpr | CallExpr | +| implicit-self.swift:54:14:54:18 | MemberAccessExpr | implicit-self.swift:53:22:53:35 | CallExpr | implicit-self.swift:54:14:54:18 | MemberAccessExpr | $@ | implicit-self.swift:53:22:53:35 | CallExpr | CallExpr | | test.swift:2:10:2:21 | CallExpr | test.swift:2:10:2:21 | CallExpr | test.swift:2:10:2:21 | CallExpr | $@ | test.swift:2:10:2:21 | CallExpr | CallExpr | -| test.swift:6:10:6:32 | BinaryExpr | test.swift:6:10:6:23 | CallExpr : unit | test.swift:6:10:6:32 | BinaryExpr | $@ | test.swift:6:10:6:23 | CallExpr : unit | CallExpr : unit | -| test.swift:7:10:7:32 | BinaryExpr | test.swift:7:19:7:32 | CallExpr : unit | test.swift:7:10:7:32 | BinaryExpr | $@ | test.swift:7:19:7:32 | CallExpr : unit | CallExpr : unit | -| test.swift:9:10:9:33 | StringInterpolationExpr | test.swift:9:13:9:26 | CallExpr : unit | test.swift:9:10:9:33 | StringInterpolationExpr | $@ | test.swift:9:13:9:26 | CallExpr : unit | CallExpr : unit | -| test.swift:10:10:10:33 | StringInterpolationExpr | test.swift:10:18:10:31 | CallExpr : unit | test.swift:10:10:10:33 | StringInterpolationExpr | $@ | test.swift:10:18:10:31 | CallExpr : unit | CallExpr : unit | -| test.swift:11:10:11:38 | StringInterpolationExpr | test.swift:11:18:11:31 | CallExpr : unit | test.swift:11:10:11:38 | StringInterpolationExpr | $@ | test.swift:11:18:11:31 | CallExpr : unit | CallExpr : unit | -| test.swift:16:10:16:35 | MemberAccessExpr | test.swift:16:11:16:25 | CallExpr : unit | test.swift:16:10:16:35 | MemberAccessExpr | $@ | test.swift:16:11:16:25 | CallExpr : unit | CallExpr : unit | -| test.swift:19:10:19:35 | MemberAccessExpr | test.swift:19:19:19:32 | CallExpr : unit | test.swift:19:10:19:35 | MemberAccessExpr | $@ | test.swift:19:19:19:32 | CallExpr : unit | CallExpr : unit | -| test.swift:24:10:24:10 | a | test.swift:23:13:23:26 | CallExpr : unit | test.swift:24:10:24:10 | a | $@ | test.swift:23:13:23:26 | CallExpr : unit | CallExpr : unit | -| test.swift:29:10:29:10 | a | test.swift:28:19:28:33 | CallExpr : unit | test.swift:29:10:29:10 | a | $@ | test.swift:28:19:28:33 | CallExpr : unit | CallExpr : unit | -| test.swift:34:10:34:10 | d | test.swift:32:27:32:40 | CallExpr : unit | test.swift:34:10:34:10 | d | $@ | test.swift:32:27:32:40 | CallExpr : unit | CallExpr : unit | -| test.swift:39:10:39:10 | a | test.swift:38:13:38:26 | CallExpr : unit | test.swift:39:10:39:10 | a | $@ | test.swift:38:13:38:26 | CallExpr : unit | CallExpr : unit | -| test.swift:47:10:47:16 | MemberAccessExpr | test.swift:46:15:46:28 | CallExpr : unit | test.swift:47:10:47:16 | MemberAccessExpr | $@ | test.swift:46:15:46:28 | CallExpr : unit | CallExpr : unit | -| test.swift:58:10:58:23 | MemberAccessExpr | test.swift:53:22:53:35 | CallExpr : unit | test.swift:58:10:58:23 | MemberAccessExpr | $@ | test.swift:53:22:53:35 | CallExpr : unit | CallExpr : unit | -| test.swift:66:10:66:16 | MemberAccessExpr | test.swift:64:21:64:35 | CallExpr : unit | test.swift:66:10:66:16 | MemberAccessExpr | $@ | test.swift:64:21:64:35 | CallExpr : unit | CallExpr : unit | -| test.swift:75:10:75:16 | MemberAccessExpr | test.swift:74:15:74:29 | CallExpr : unit | test.swift:75:10:75:16 | MemberAccessExpr | $@ | test.swift:74:15:74:29 | CallExpr : unit | CallExpr : unit | -| test.swift:90:10:90:10 | x | test.swift:86:13:86:27 | CallExpr : unit | test.swift:90:10:90:10 | x | $@ | test.swift:86:13:86:27 | CallExpr : unit | CallExpr : unit | -| test.swift:96:10:96:10 | y | test.swift:94:13:94:27 | CallExpr : unit | test.swift:96:10:96:10 | y | $@ | test.swift:94:13:94:27 | CallExpr : unit | CallExpr : unit | -| test.swift:99:14:99:14 | x | test.swift:86:13:86:27 | CallExpr : unit | test.swift:99:14:99:14 | x | $@ | test.swift:86:13:86:27 | CallExpr : unit | CallExpr : unit | -| test.swift:100:14:100:14 | y | test.swift:94:13:94:27 | CallExpr : unit | test.swift:100:14:100:14 | y | $@ | test.swift:94:13:94:27 | CallExpr : unit | CallExpr : unit | -| test.swift:112:10:112:16 | MemberAccessExpr | test.swift:107:19:107:33 | CallExpr : unit | test.swift:112:10:112:16 | MemberAccessExpr | $@ | test.swift:107:19:107:33 | CallExpr : unit | CallExpr : unit | -| test.swift:125:10:125:10 | a | test.swift:117:18:117:33 | CallExpr : unit | test.swift:125:10:125:10 | a | $@ | test.swift:117:18:117:33 | CallExpr : unit | CallExpr : unit | -| test.swift:126:10:126:10 | b | test.swift:117:35:117:49 | CallExpr : unit | test.swift:126:10:126:10 | b | $@ | test.swift:117:35:117:49 | CallExpr : unit | CallExpr : unit | -| test.swift:131:14:131:14 | a | test.swift:131:19:131:33 | CallExpr : unit | test.swift:131:14:131:14 | a | $@ | test.swift:131:19:131:33 | CallExpr : unit | CallExpr : unit | -| test.swift:132:10:132:10 | a | test.swift:131:19:131:33 | CallExpr : unit | test.swift:132:10:132:10 | a | $@ | test.swift:131:19:131:33 | CallExpr : unit | CallExpr : unit | +| test.swift:6:10:6:32 | BinaryExpr | test.swift:6:10:6:23 | CallExpr | test.swift:6:10:6:32 | BinaryExpr | $@ | test.swift:6:10:6:23 | CallExpr | CallExpr | +| test.swift:7:10:7:32 | BinaryExpr | test.swift:7:19:7:32 | CallExpr | test.swift:7:10:7:32 | BinaryExpr | $@ | test.swift:7:19:7:32 | CallExpr | CallExpr | +| test.swift:9:10:9:33 | StringInterpolationExpr | test.swift:9:13:9:26 | CallExpr | test.swift:9:10:9:33 | StringInterpolationExpr | $@ | test.swift:9:13:9:26 | CallExpr | CallExpr | +| test.swift:10:10:10:33 | StringInterpolationExpr | test.swift:10:18:10:31 | CallExpr | test.swift:10:10:10:33 | StringInterpolationExpr | $@ | test.swift:10:18:10:31 | CallExpr | CallExpr | +| test.swift:11:10:11:38 | StringInterpolationExpr | test.swift:11:18:11:31 | CallExpr | test.swift:11:10:11:38 | StringInterpolationExpr | $@ | test.swift:11:18:11:31 | CallExpr | CallExpr | +| test.swift:16:10:16:35 | MemberAccessExpr | test.swift:16:11:16:25 | CallExpr | test.swift:16:10:16:35 | MemberAccessExpr | $@ | test.swift:16:11:16:25 | CallExpr | CallExpr | +| test.swift:19:10:19:35 | MemberAccessExpr | test.swift:19:19:19:32 | CallExpr | test.swift:19:10:19:35 | MemberAccessExpr | $@ | test.swift:19:19:19:32 | CallExpr | CallExpr | +| test.swift:24:10:24:10 | a | test.swift:23:13:23:26 | CallExpr | test.swift:24:10:24:10 | a | $@ | test.swift:23:13:23:26 | CallExpr | CallExpr | +| test.swift:29:10:29:10 | a | test.swift:28:19:28:33 | CallExpr | test.swift:29:10:29:10 | a | $@ | test.swift:28:19:28:33 | CallExpr | CallExpr | +| test.swift:34:10:34:10 | d | test.swift:32:27:32:40 | CallExpr | test.swift:34:10:34:10 | d | $@ | test.swift:32:27:32:40 | CallExpr | CallExpr | +| test.swift:39:10:39:10 | a | test.swift:38:13:38:26 | CallExpr | test.swift:39:10:39:10 | a | $@ | test.swift:38:13:38:26 | CallExpr | CallExpr | +| test.swift:47:10:47:16 | MemberAccessExpr | test.swift:46:15:46:28 | CallExpr | test.swift:47:10:47:16 | MemberAccessExpr | $@ | test.swift:46:15:46:28 | CallExpr | CallExpr | +| test.swift:58:10:58:23 | MemberAccessExpr | test.swift:53:22:53:35 | CallExpr | test.swift:58:10:58:23 | MemberAccessExpr | $@ | test.swift:53:22:53:35 | CallExpr | CallExpr | +| test.swift:66:10:66:16 | MemberAccessExpr | test.swift:64:21:64:35 | CallExpr | test.swift:66:10:66:16 | MemberAccessExpr | $@ | test.swift:64:21:64:35 | CallExpr | CallExpr | +| test.swift:75:10:75:16 | MemberAccessExpr | test.swift:74:15:74:29 | CallExpr | test.swift:75:10:75:16 | MemberAccessExpr | $@ | test.swift:74:15:74:29 | CallExpr | CallExpr | +| test.swift:90:10:90:10 | x | test.swift:86:13:86:27 | CallExpr | test.swift:90:10:90:10 | x | $@ | test.swift:86:13:86:27 | CallExpr | CallExpr | +| test.swift:96:10:96:10 | y | test.swift:94:13:94:27 | CallExpr | test.swift:96:10:96:10 | y | $@ | test.swift:94:13:94:27 | CallExpr | CallExpr | +| test.swift:99:14:99:14 | x | test.swift:86:13:86:27 | CallExpr | test.swift:99:14:99:14 | x | $@ | test.swift:86:13:86:27 | CallExpr | CallExpr | +| test.swift:100:14:100:14 | y | test.swift:94:13:94:27 | CallExpr | test.swift:100:14:100:14 | y | $@ | test.swift:94:13:94:27 | CallExpr | CallExpr | +| test.swift:112:10:112:16 | MemberAccessExpr | test.swift:107:19:107:33 | CallExpr | test.swift:112:10:112:16 | MemberAccessExpr | $@ | test.swift:107:19:107:33 | CallExpr | CallExpr | +| test.swift:125:10:125:10 | a | test.swift:117:18:117:33 | CallExpr | test.swift:125:10:125:10 | a | $@ | test.swift:117:18:117:33 | CallExpr | CallExpr | +| test.swift:126:10:126:10 | b | test.swift:117:35:117:49 | CallExpr | test.swift:126:10:126:10 | b | $@ | test.swift:117:35:117:49 | CallExpr | CallExpr | +| test.swift:131:14:131:14 | a | test.swift:131:19:131:33 | CallExpr | test.swift:131:14:131:14 | a | $@ | test.swift:131:19:131:33 | CallExpr | CallExpr | +| test.swift:132:10:132:10 | a | test.swift:131:19:131:33 | CallExpr | test.swift:132:10:132:10 | a | $@ | test.swift:131:19:131:33 | CallExpr | CallExpr | diff --git a/unified/ql/test/query-tests/security/CWE-312/CleartextLogging/CleartextLogging.expected b/unified/ql/test/query-tests/security/CWE-312/CleartextLogging/CleartextLogging.expected index cf60bed522d7..cb3f1cb61f2f 100644 --- a/unified/ql/test/query-tests/security/CWE-312/CleartextLogging/CleartextLogging.expected +++ b/unified/ql/test/query-tests/security/CWE-312/CleartextLogging/CleartextLogging.expected @@ -1,8 +1,8 @@ #select -| CleartextLoggingBad.swift:2:7:2:44 | StringInterpolationExpr | CleartextLoggingBad.swift:2:35:2:42 | password : unit | CleartextLoggingBad.swift:2:7:2:44 | StringInterpolationExpr | Logging of $@ | CleartextLoggingBad.swift:2:35:2:42 | password | sensitive data | +| CleartextLoggingBad.swift:2:7:2:44 | StringInterpolationExpr | CleartextLoggingBad.swift:2:35:2:42 | password | CleartextLoggingBad.swift:2:7:2:44 | StringInterpolationExpr | Logging of $@ | CleartextLoggingBad.swift:2:35:2:42 | password | sensitive data | edges -| CleartextLoggingBad.swift:2:35:2:42 | password : unit | CleartextLoggingBad.swift:2:7:2:44 | StringInterpolationExpr | provenance | | +| CleartextLoggingBad.swift:2:35:2:42 | password | CleartextLoggingBad.swift:2:7:2:44 | StringInterpolationExpr | provenance | | nodes | CleartextLoggingBad.swift:2:7:2:44 | StringInterpolationExpr | semmle.label | StringInterpolationExpr | -| CleartextLoggingBad.swift:2:35:2:42 | password : unit | semmle.label | password : unit | +| CleartextLoggingBad.swift:2:35:2:42 | password | semmle.label | password | subpaths From c871161a516349e1506ccd59887cb672c5c49583 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Wed, 26 Aug 2026 09:29:25 +0200 Subject: [PATCH 0960/2098] Rust: Add type inference tests for empty arrays --- .../test/library-tests/type-inference/main.rs | 10 + .../type-inference/type-inference.expected | 203 +++++++++++------- 2 files changed, 131 insertions(+), 82 deletions(-) diff --git a/rust/ql/test/library-tests/type-inference/main.rs b/rust/ql/test/library-tests/type-inference/main.rs index eef59dab6749..9f3bcff4cce1 100644 --- a/rust/ql/test/library-tests/type-inference/main.rs +++ b/rust/ql/test/library-tests/type-inference/main.rs @@ -2800,6 +2800,15 @@ mod arg_trait_bounds { } } +fn empty_array() { + let arr1: [i32; 0] = []; // $ type=arr1@[;]:i32 + let arr2 = [true; 0]; // $ type=arr2@[;]:bool + let arr3 = []; // $ MISSING: type=arr3@[;]:i32 + + fn pin_array(arr: [T; 0], x: T) {} + pin_array(arr3, 1); // $ target=pin_array +} + fn main() { field_access::f(); // $ target=f method_impl::f(); // $ target=f @@ -2835,4 +2844,5 @@ fn main() { dyn_type::test(); // $ target=test if_expr::f(true); // $ target=f local_function::f(); // $ target=f + empty_array(); // $ target=empty_array } diff --git a/rust/ql/test/library-tests/type-inference/type-inference.expected b/rust/ql/test/library-tests/type-inference/type-inference.expected index e4f540ed9f45..6209ef5422c5 100644 --- a/rust/ql/test/library-tests/type-inference/type-inference.expected +++ b/rust/ql/test/library-tests/type-inference/type-inference.expected @@ -3994,48 +3994,64 @@ inferCertainType | main.rs:2796:15:2800:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2799:17:2799:26 | my_get(...) | | {EXTERNAL LOCATION} | bool | | main.rs:2799:24:2799:25 | &g | | {EXTERNAL LOCATION} | & | -| main.rs:2803:11:2838:1 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2804:5:2804:21 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2805:5:2805:20 | ...::f(...) | | main.rs:72:5:72:21 | Foo | -| main.rs:2806:5:2806:60 | ...::g(...) | | main.rs:72:5:72:21 | Foo | -| main.rs:2806:20:2806:38 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | -| main.rs:2806:41:2806:59 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | -| main.rs:2807:5:2807:35 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2808:5:2808:41 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2809:5:2809:45 | ...::test(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2810:5:2810:30 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2811:5:2811:21 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2812:5:2812:27 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2813:5:2813:32 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2814:5:2814:23 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2815:5:2815:36 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2803:18:2810:1 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2804:9:2804:12 | arr1 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2804:9:2804:12 | arr1 | TArray | {EXTERNAL LOCATION} | i32 | +| main.rs:2804:26:2804:27 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2805:9:2805:12 | arr2 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2805:16:2805:24 | [true; 0] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2805:17:2805:20 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2806:9:2806:12 | arr3 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2806:16:2806:17 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2808:21:2808:23 | arr | | {EXTERNAL LOCATION} | [;] | +| main.rs:2808:21:2808:23 | arr | TArray | main.rs:2808:18:2808:18 | T | +| main.rs:2808:34:2808:34 | x | | main.rs:2808:18:2808:18 | T | +| main.rs:2808:40:2808:41 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2809:5:2809:22 | pin_array(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2809:15:2809:18 | arr3 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2812:11:2848:1 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2813:5:2813:21 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2814:5:2814:20 | ...::f(...) | | main.rs:72:5:72:21 | Foo | +| main.rs:2815:5:2815:60 | ...::g(...) | | main.rs:72:5:72:21 | Foo | +| main.rs:2815:20:2815:38 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | +| main.rs:2815:41:2815:59 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | | main.rs:2816:5:2816:35 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2817:5:2817:29 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2818:5:2818:23 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2819:5:2819:24 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2820:5:2820:17 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2821:5:2821:18 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2822:5:2822:15 | ...::f(...) | | {EXTERNAL LOCATION} | dyn Future | -| main.rs:2822:5:2822:15 | ...::f(...) | dyn(Output) | {EXTERNAL LOCATION} | () | -| main.rs:2823:5:2823:19 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2824:5:2824:17 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2825:5:2825:14 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2826:5:2826:27 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2827:5:2827:15 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2828:5:2828:43 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2829:5:2829:15 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2830:5:2830:17 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2831:5:2831:28 | ...::test(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2832:5:2832:23 | ...::test(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2833:5:2833:41 | ...::test_all_patterns(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2834:5:2834:49 | ...::box_patterns(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2835:5:2835:20 | ...::test(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2836:5:2836:20 | ...::f(...) | | {EXTERNAL LOCATION} | Box | -| main.rs:2836:5:2836:20 | ...::f(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2836:5:2836:20 | ...::f(...) | T | main.rs:2564:5:2566:5 | dyn MyTrait | -| main.rs:2836:5:2836:20 | ...::f(...) | T.dyn(T) | {EXTERNAL LOCATION} | i32 | -| main.rs:2836:16:2836:19 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:2837:5:2837:23 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2817:5:2817:41 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2818:5:2818:45 | ...::test(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2819:5:2819:30 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2820:5:2820:21 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2821:5:2821:27 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2822:5:2822:32 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2823:5:2823:23 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2824:5:2824:36 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2825:5:2825:35 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2826:5:2826:29 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2827:5:2827:23 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2828:5:2828:24 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2829:5:2829:17 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2830:5:2830:18 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2831:5:2831:15 | ...::f(...) | | {EXTERNAL LOCATION} | dyn Future | +| main.rs:2831:5:2831:15 | ...::f(...) | dyn(Output) | {EXTERNAL LOCATION} | () | +| main.rs:2832:5:2832:19 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2833:5:2833:17 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2834:5:2834:14 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2835:5:2835:27 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2836:5:2836:15 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2837:5:2837:43 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2838:5:2838:15 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2839:5:2839:17 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2840:5:2840:28 | ...::test(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2841:5:2841:23 | ...::test(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2842:5:2842:41 | ...::test_all_patterns(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2843:5:2843:49 | ...::box_patterns(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2844:5:2844:20 | ...::test(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2845:5:2845:20 | ...::f(...) | | {EXTERNAL LOCATION} | Box | +| main.rs:2845:5:2845:20 | ...::f(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2845:5:2845:20 | ...::f(...) | T | main.rs:2564:5:2566:5 | dyn MyTrait | +| main.rs:2845:5:2845:20 | ...::f(...) | T.dyn(T) | {EXTERNAL LOCATION} | i32 | +| main.rs:2845:16:2845:19 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2846:5:2846:23 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2847:5:2847:17 | empty_array(...) | | {EXTERNAL LOCATION} | () | | overloading.rs:4:19:4:23 | SelfParam | | {EXTERNAL LOCATION} | & | | overloading.rs:4:19:4:23 | SelfParam | TRef | overloading.rs:2:5:11:5 | Self [trait FirstTrait] | | overloading.rs:4:34:6:9 | { ... } | | {EXTERNAL LOCATION} | bool | @@ -13037,48 +13053,71 @@ inferType | main.rs:2799:24:2799:25 | &g | TRef.T | {EXTERNAL LOCATION} | i64 | | main.rs:2799:25:2799:25 | g | | main.rs:2780:5:2780:21 | Gen | | main.rs:2799:25:2799:25 | g | T | {EXTERNAL LOCATION} | i64 | -| main.rs:2803:11:2838:1 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2804:5:2804:21 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2805:5:2805:20 | ...::f(...) | | main.rs:72:5:72:21 | Foo | -| main.rs:2806:5:2806:60 | ...::g(...) | | main.rs:72:5:72:21 | Foo | -| main.rs:2806:20:2806:38 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | -| main.rs:2806:41:2806:59 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | -| main.rs:2807:5:2807:35 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2808:5:2808:41 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2809:5:2809:45 | ...::test(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2810:5:2810:30 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2811:5:2811:21 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2812:5:2812:27 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2813:5:2813:32 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2814:5:2814:23 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2815:5:2815:36 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2803:18:2810:1 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2804:9:2804:12 | arr1 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2804:9:2804:12 | arr1 | TArray | {EXTERNAL LOCATION} | i32 | +| main.rs:2804:21:2804:21 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2804:26:2804:27 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2804:26:2804:27 | [...] | TArray | {EXTERNAL LOCATION} | i32 | +| main.rs:2805:9:2805:12 | arr2 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2805:9:2805:12 | arr2 | TArray | {EXTERNAL LOCATION} | bool | +| main.rs:2805:16:2805:24 | [true; 0] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2805:16:2805:24 | [true; 0] | TArray | {EXTERNAL LOCATION} | bool | +| main.rs:2805:17:2805:20 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2805:23:2805:23 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2806:9:2806:12 | arr3 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2806:16:2806:17 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2808:21:2808:23 | arr | | {EXTERNAL LOCATION} | [;] | +| main.rs:2808:21:2808:23 | arr | TArray | main.rs:2808:18:2808:18 | T | +| main.rs:2808:30:2808:30 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2808:34:2808:34 | x | | main.rs:2808:18:2808:18 | T | +| main.rs:2808:40:2808:41 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2809:5:2809:22 | pin_array(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2809:15:2809:18 | arr3 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2809:21:2809:21 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2812:11:2848:1 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2813:5:2813:21 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2814:5:2814:20 | ...::f(...) | | main.rs:72:5:72:21 | Foo | +| main.rs:2815:5:2815:60 | ...::g(...) | | main.rs:72:5:72:21 | Foo | +| main.rs:2815:20:2815:38 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | +| main.rs:2815:41:2815:59 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | | main.rs:2816:5:2816:35 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2817:5:2817:29 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2818:5:2818:23 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2819:5:2819:24 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2820:5:2820:17 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2821:5:2821:18 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2822:5:2822:15 | ...::f(...) | | {EXTERNAL LOCATION} | dyn Future | -| main.rs:2822:5:2822:15 | ...::f(...) | dyn(Output) | {EXTERNAL LOCATION} | () | -| main.rs:2823:5:2823:19 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2824:5:2824:17 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2825:5:2825:14 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2826:5:2826:27 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2827:5:2827:15 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2828:5:2828:43 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2829:5:2829:15 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2830:5:2830:17 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2831:5:2831:28 | ...::test(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2832:5:2832:23 | ...::test(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2833:5:2833:41 | ...::test_all_patterns(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2834:5:2834:49 | ...::box_patterns(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2835:5:2835:20 | ...::test(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2836:5:2836:20 | ...::f(...) | | {EXTERNAL LOCATION} | Box | -| main.rs:2836:5:2836:20 | ...::f(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2836:5:2836:20 | ...::f(...) | T | main.rs:2564:5:2566:5 | dyn MyTrait | -| main.rs:2836:5:2836:20 | ...::f(...) | T.dyn(T) | {EXTERNAL LOCATION} | i32 | -| main.rs:2836:16:2836:19 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:2837:5:2837:23 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2817:5:2817:41 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2818:5:2818:45 | ...::test(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2819:5:2819:30 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2820:5:2820:21 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2821:5:2821:27 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2822:5:2822:32 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2823:5:2823:23 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2824:5:2824:36 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2825:5:2825:35 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2826:5:2826:29 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2827:5:2827:23 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2828:5:2828:24 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2829:5:2829:17 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2830:5:2830:18 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2831:5:2831:15 | ...::f(...) | | {EXTERNAL LOCATION} | dyn Future | +| main.rs:2831:5:2831:15 | ...::f(...) | dyn(Output) | {EXTERNAL LOCATION} | () | +| main.rs:2832:5:2832:19 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2833:5:2833:17 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2834:5:2834:14 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2835:5:2835:27 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2836:5:2836:15 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2837:5:2837:43 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2838:5:2838:15 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2839:5:2839:17 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2840:5:2840:28 | ...::test(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2841:5:2841:23 | ...::test(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2842:5:2842:41 | ...::test_all_patterns(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2843:5:2843:49 | ...::box_patterns(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2844:5:2844:20 | ...::test(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2845:5:2845:20 | ...::f(...) | | {EXTERNAL LOCATION} | Box | +| main.rs:2845:5:2845:20 | ...::f(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2845:5:2845:20 | ...::f(...) | T | main.rs:2564:5:2566:5 | dyn MyTrait | +| main.rs:2845:5:2845:20 | ...::f(...) | T.dyn(T) | {EXTERNAL LOCATION} | i32 | +| main.rs:2845:16:2845:19 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2846:5:2846:23 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2847:5:2847:17 | empty_array(...) | | {EXTERNAL LOCATION} | () | | overloading.rs:4:19:4:23 | SelfParam | | {EXTERNAL LOCATION} | & | | overloading.rs:4:19:4:23 | SelfParam | TRef | overloading.rs:2:5:11:5 | Self [trait FirstTrait] | | overloading.rs:4:34:6:9 | { ... } | | {EXTERNAL LOCATION} | bool | From 2e94938ed76b1cbaadf90e40ec97776c342935b3 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 6 Jul 2026 15:18:03 +0200 Subject: [PATCH 0961/2098] Rust: Move logic in `TypeInference.qll` for subsequent cleaner diff --- .../internal/typeinference/TypeInference.qll | 2955 ++++++++--------- 1 file changed, 1477 insertions(+), 1478 deletions(-) diff --git a/rust/ql/lib/codeql/rust/internal/typeinference/TypeInference.qll b/rust/ql/lib/codeql/rust/internal/typeinference/TypeInference.qll index b5ed2be06f97..9ab33b314daf 100644 --- a/rust/ql/lib/codeql/rust/internal/typeinference/TypeInference.qll +++ b/rust/ql/lib/codeql/rust/internal/typeinference/TypeInference.qll @@ -768,222 +768,6 @@ private Struct getRangeType(RangeExpr re) { result instanceof RangeToInclusiveStruct } -private predicate bodyReturns(Expr body, Expr e) { - exists(ReturnExpr re, Callable c | - e = re.getExpr() and - c = re.getEnclosingCallable() and - body = c.getBody() - ) -} - -/** - * Holds if the type tree of `n1` at `prefix1` should be equal to the type tree - * of `n2` at `prefix2` and type information should propagate in both directions - * through the type equality. - */ -private predicate typeEquality(AstNode n1, TypePath prefix1, AstNode n2, TypePath prefix2) { - CertainTypeInference::certainTypeEquality(n1, prefix1, n2, prefix2) - or - prefix1.isEmpty() and - prefix2.isEmpty() and - ( - exists(LetStmt let | - let.getPat() = n1 and - let.getInitializer() = n2 - ) - or - n2 = - any(MatchExpr me | - n1 = me.getAnArm().getExpr() and - me.getNumberOfArms() = 1 - ) - or - exists(LetExpr let | - n1 = let.getScrutinee() and - n2 = let.getPat() - ) - or - exists(MatchExpr me | - n1 = me.getScrutinee() and - n2 = me.getAnArm().getPat() - ) - or - n1 = n2.(OrPat).getAPat() - or - n1 = n2.(ParenPat).getPat() - or - n1 = n2.(LiteralPat).getLiteral() - or - exists(BreakExpr break | - break.getExpr() = n1 and - break.getTarget() = n2.(LoopExpr) - ) - or - exists(AssignmentExpr be | - n1 = be.getLhs() and - n2 = be.getRhs() - ) - or - n1 = n2.(MacroExpr).getMacroCall().getMacroCallExpansion() and - not isPanicMacroCall(n2) - or - n1 = n2.(MacroPat).getMacroCall().getMacroCallExpansion() - or - bodyReturns(n1, n2) and - strictcount(Expr e | bodyReturns(n1, e)) = 1 - ) - or - n2 = - any(RefExpr re | - n1 = re.getExpr() and - prefix1.isEmpty() and - prefix2 = TypePath::singleton(inferRefExprType(re).getPositionalTypeParameter(0)) - ) - or - n2 = - any(RefPat rp | - n1 = rp.getPat() and - prefix1.isEmpty() and - exists(boolean isMutable | if rp.isMut() then isMutable = true else isMutable = false | - prefix2 = TypePath::singleton(getRefTypeParameter(isMutable)) - ) - ) - or - exists(int i, int arity | - prefix1.isEmpty() and - prefix2 = TypePath::singleton(getTupleTypeParameter(arity, i)) - | - arity = n2.(TupleExpr).getNumberOfFields() and - n1 = n2.(TupleExpr).getField(i) - or - arity = n2.(TuplePat).getTupleArity() and - n1 = n2.(TuplePat).getField(i) - ) - or - exists(BlockExpr be | - n1 = be and - n2 = be.getStmtList().getTailExpr() and - if be.isAsync() - then - prefix1 = TypePath::singleton(getDynFutureOutputTypeParameter()) and - prefix2.isEmpty() - else ( - prefix1.isEmpty() and - prefix2.isEmpty() - ) - ) - or - // an array list expression with only one element (such as `[1]`) has type from that element - n1 = - any(ArrayListExpr ale | - ale.getAnExpr() = n2 and - ale.getNumberOfExprs() = 1 - ) and - prefix1 = TypePath::singleton(getArrayTypeParameter()) and - prefix2.isEmpty() - or - // an array repeat expression (`[1; 3]`) has the type of the repeat operand - n1.(ArrayRepeatExpr).getRepeatOperand() = n2 and - prefix1 = TypePath::singleton(getArrayTypeParameter()) and - prefix2.isEmpty() -} - -/** - * Holds if `child` is a child of `parent`, and the Rust compiler applies [least - * upper bound (LUB) coercion][1] to infer the type of `parent` from the type of - * `child`. - * - * In this case, we want type information to only flow from `child` to `parent`, - * to avoid (a) either having to model LUB coercions, or (b) risk combinatorial - * explosion in inferred types. - * - * [1]: https://doc.rust-lang.org/reference/type-coercions.html#r-coerce.least-upper-bound - */ -private predicate lubCoercion(AstNode parent, AstNode child, TypePath prefix) { - child = parent.(IfExpr).getABranch() and - prefix.isEmpty() - or - parent = - any(MatchExpr me | - child = me.getAnArm().getExpr() and - me.getNumberOfArms() > 1 - ) and - prefix.isEmpty() - or - parent = - any(ArrayListExpr ale | - child = ale.getAnExpr() and - ale.getNumberOfExprs() > 1 - ) and - prefix = TypePath::singleton(getArrayTypeParameter()) - or - bodyReturns(parent, child) and - strictcount(Expr e | bodyReturns(parent, e)) > 1 and - prefix.isEmpty() - or - parent = any(ClosureExpr ce | not ce.hasRetType() and ce.getClosureBody() = child) and - prefix = closureReturnPath() - or - exists(Struct s | - child = [parent.(RangeExpr).getStart(), parent.(RangeExpr).getEnd()] and - prefix = TypePath::singleton(TTypeParamTypeParameter(s.getGenericParamList().getATypeParam())) and - s = getRangeType(parent) - ) -} - -private Type inferUnknownTypeFromAnnotation(AstNode n, TypePath path) { - inferType(n, path) = TUnknownType() and - // Normally, these are coercion sites, but in case a type is unknown we - // allow for type information to flow from the type annotation. - exists(TypeMention tm | result = tm.getTypeAt(path) | - tm = any(LetStmt let | identLetStmt(let, _, n)).getTypeRepr() - or - tm = any(ClosureExpr ce | n = ce.getBody()).getRetType().getTypeRepr() - or - tm = getReturnTypeMention(any(Function f | n = f.getBody())) - ) -} - -/** - * Holds if the type tree of `n1` at `prefix1` should be equal to the type tree - * of `n2` at `prefix2`, but type information should only propagate from `n1` to - * `n2`. - */ -private predicate typeEqualityAsymmetric(AstNode n1, TypePath prefix1, AstNode n2, TypePath prefix2) { - lubCoercion(n2, n1, prefix2) and - prefix1.isEmpty() - or - exists(AstNode mid, TypePath prefixMid, TypePath suffix | - typeEquality(n1, prefixMid, mid, prefix2) or - typeEquality(mid, prefix2, n1, prefixMid) - | - lubCoercion(mid, n2, suffix) and - not lubCoercion(mid, n1, _) and - prefix1 = prefixMid.append(suffix) - ) - or - // When `n2` is `*n1` propagate type information from a raw pointer type - // parameter at `n1`. The other direction is handled in - // `inferDereferencedExprPtrType`. - n1 = n2.(DerefExpr).getExpr() and - prefix1 = TypePath::singleton(getPtrTypeParameter()) and - prefix2.isEmpty() -} - -pragma[nomagic] -private Type inferTypeEquality(AstNode n, TypePath path) { - exists(TypePath prefix1, AstNode n2, TypePath prefix2, TypePath suffix | - result = inferType(n2, prefix2.appendInverse(suffix)) and - path = prefix1.append(suffix) - | - typeEquality(n, prefix1, n2, prefix2) - or - typeEquality(n2, prefix2, n, prefix1) - or - typeEqualityAsymmetric(n2, prefix2, n, prefix1) - ) -} - pragma[nomagic] private TupleType inferTupleRootType(AstNode n) { // `typeEquality` handles the non-root cases @@ -1081,156 +865,28 @@ private class NonAssocCallExpr extends CallExpr { } /** - * Provides functionality related to context-based typing of calls. + * Holds if the type path `path` pointing to `type` is stripped of any leading + * complex root type allowed for `self` parameters, such as `&`, `Box`, `Rc`, + * `Arc`, and `Pin`. + * + * We strip away the complex root type for performance reasons only, which will + * allow us to construct a much smaller set of candidate call targets (otherwise, + * for example _a lot_ of methods have a `self` parameter with a `&` root type). */ -private module ContextTyping { - /** - * Holds if `f` mentions type parameter `tp` at some non-return position, - * possibly via a constraint on another mentioned type parameter. - */ - pragma[nomagic] - private predicate assocFunctionMentionsTypeParameterAtNonRetPos( - ImplOrTraitItemNode i, Function f, TypeParameter tp - ) { - exists(FunctionPosition nonRetPos | - not nonRetPos.isReturn() and - not nonRetPos.isTypeQualifier() and - tp = getAssocFunctionTypeAt(f, i, nonRetPos, _) - ) +bindingset[path, type] +private predicate isComplexRootStripped(TypePath path, Type type) { + ( + path.isEmpty() and + not validSelfType(type) or - exists(TypeParameter mid | - assocFunctionMentionsTypeParameterAtNonRetPos(i, f, mid) and - tp = getATypeParameterConstraint(mid).getTypeAt(_) + exists(TypeParameter tp | + complexSelfRoot(_, tp) and + path = TypePath::singleton(tp) and + exists(type) ) - } - - /** - * Holds if the return type of the function `f` inside `i` at `path` is type - * parameter `tp`, and `tp` does not appear in the type of any parameter of - * `f`. - * - * In this case, the context in which `f` is called may be needed to infer - * the instantiation of `tp`. - * - * This covers functions like `Default::default` and `Vec::new`. - */ - pragma[nomagic] - private predicate assocFunctionReturnContextTypedAt( - ImplOrTraitItemNode i, Function f, FunctionPosition pos, TypePath path, TypeParameter tp - ) { - pos.isReturn() and - tp = getAssocFunctionTypeAt(f, i, pos, path) and - not assocFunctionMentionsTypeParameterAtNonRetPos(i, f, tp) - } - - /** - * A call where the type of the result may have to be inferred from the - * context in which the call appears, for example a call like - * `Default::default()`. - */ - abstract class ContextTypedCallCand extends AstNode { - abstract Type getTypeArgument(TypeArgumentPosition apos, TypePath path); - - predicate hasTypeArgument(TypeArgumentPosition apos) { exists(this.getTypeArgument(apos, _)) } - - /** - * Holds if this call resolves to `target` inside `i`, and the return type - * at `pos` and `path` may have to be inferred from the context. - */ - bindingset[this, i, target] - predicate hasUnknownTypeAt( - ImplOrTraitItemNode i, Function target, FunctionPosition pos, TypePath path - ) { - exists(TypeParameter tp | - assocFunctionReturnContextTypedAt(i, target, pos, path, tp) and - // check that no explicit type arguments have been supplied for `tp` - not exists(TypeArgumentPosition tapos | this.hasTypeArgument(tapos) | - exists(int j | - j = tapos.asMethodTypeArgumentPosition() and - tp = TTypeParamTypeParameter(target.getGenericParamList().getTypeParam(j)) - ) - or - TTypeParamTypeParameter(tapos.asTypeParam()) = tp - ) and - not ( - tp instanceof TSelfTypeParameter and - exists(getCallExprTypeQualifier(this, _, _)) - ) - ) - } - } - - pragma[nomagic] - private predicate hasUnknownTypeAt(AstNode n, TypePath path) { - inferType(n, path) = TUnknownType() - } - - pragma[nomagic] - private predicate hasUnknownType(AstNode n) { hasUnknownTypeAt(n, _) } - - newtype FunctionPositionKind = - SelfKind() or - ReturnKind() or - PositionalKind() - - signature Type inferCallTypeSig(AstNode n, FunctionPositionKind kind, TypePath path); - - /** - * Given a predicate `inferCallType` for inferring the type of a call at a given - * position, this module exposes the predicate `check`, which wraps the input - * predicate and checks that types are only propagated into arguments when they - * are context-typed. - */ - module CheckContextTyping { - pragma[nomagic] - private Type inferCallNonReturnType( - AstNode n, FunctionPositionKind kind, TypePath prefix, TypePath path - ) { - result = inferCallType(n, kind, path) and - hasUnknownType(n) and - kind != ReturnKind() and - prefix = path.getAPrefix() - } - - pragma[nomagic] - Type check(AstNode n, TypePath path) { - result = inferCallType(n, ReturnKind(), path) - or - exists(FunctionPositionKind kind, TypePath prefix | - result = inferCallNonReturnType(n, kind, prefix, path) and - hasUnknownTypeAt(n, prefix) - | - // Never propagate type information directly into the receiver, since its type - // must already have been known in order to resolve the call - if kind = SelfKind() then not prefix.isEmpty() else any() - ) - } - } -} - -/** - * Holds if the type path `path` pointing to `type` is stripped of any leading - * complex root type allowed for `self` parameters, such as `&`, `Box`, `Rc`, - * `Arc`, and `Pin`. - * - * We strip away the complex root type for performance reasons only, which will - * allow us to construct a much smaller set of candidate call targets (otherwise, - * for example _a lot_ of methods have a `self` parameter with a `&` root type). - */ -bindingset[path, type] -private predicate isComplexRootStripped(TypePath path, Type type) { - ( - path.isEmpty() and - not validSelfType(type) - or - exists(TypeParameter tp | - complexSelfRoot(_, tp) and - path = TypePath::singleton(tp) and - exists(type) - ) - ) and - type != TNeverType() -} + ) and + type != TNeverType() +} private newtype TBorrowKind = TNoBorrowKind() or @@ -2655,1395 +2311,1738 @@ private module AssocFunctionResolution { } } -/** - * A matching configuration for resolving types of function call expressions - * like `foo.bar(baz)` and `Foo::bar(baz)`. - */ -private module FunctionCallMatchingInput implements MatchingWithEnvironmentInputSig { - import FunctionPositionMatchingInput - - private newtype TDeclaration = - TFunctionDeclaration(ImplOrTraitItemNodeOption i, FunctionDeclaration f) { f.isFor(i) } - - final class Declaration extends TFunctionDeclaration { - ImplOrTraitItemNodeOption i; - FunctionDeclaration f; - - Declaration() { this = TFunctionDeclaration(i, f) } - - FunctionDeclaration getFunction() { result = f } - - predicate isAssocFunction(ImplOrTraitItemNode i_, Function f_) { - i_ = i.asSome() and - f_ = f - } - - TypeParameter getTypeParameter(TypeParameterPosition ppos) { - result = f.getTypeParameter(i, ppos) - } - - Type getDeclaredType(FunctionPosition pos, TypePath path) { - result = f.getParameterType(i, pos, path) - or - pos.isReturn() and - result = f.getReturnType(i, path) - } - - string toString() { - i.isNone() and result = f.toString() - or - result = f.toStringExt(i.asSome()) - } +pragma[nomagic] +private Type getFieldExprLookupType(FieldExpr fe, string name, DerefChain derefChain) { + exists(TypePath path | + result = inferType(fe.getContainer(), path) and + name = fe.getIdentifier().getText() and + isComplexRootStripped(path, result) + | + // TODO: Support full derefence chains as for method calls + path.isEmpty() and + derefChain = DerefChain::nil() + or + exists(DerefImplItemNode impl, TypeParamTypeParameter tp | + tp = impl.getFirstSelfTypeParameter() and + path.getHead() = tp and + derefChain = DerefChain::singleton(impl) + ) + ) +} - Location getLocation() { result = f.getLocation() } - } +pragma[nomagic] +private Type getTupleFieldExprLookupType(FieldExpr fe, int pos, DerefChain derefChain) { + exists(string name | + result = getFieldExprLookupType(fe, name, derefChain) and + pos = name.toInt() + ) +} - pragma[nomagic] - private TypeMention getAdditionalTypeParameterConstraint(TypeParameter tp, Declaration decl) { - result = - tp.(TypeParamTypeParameter) - .getTypeParam() - .getAdditionalTypeBound(decl.getFunction(), _) - .getTypeRepr() - } +/** Gets the root type of the reference expression `ref`. */ +pragma[nomagic] +private Type inferRefExprType(RefExpr ref) { + if ref.isRaw() + then + ref.isMut() and result instanceof PtrMutType + or + ref.isConst() and result instanceof PtrConstType + else + if ref.isMut() + then result instanceof RefMutType + else result instanceof RefSharedType +} - bindingset[decl] - TypeMention getATypeParameterConstraint(TypeParameter tp, Declaration decl) { - result = Input2::getATypeParameterConstraint(tp) and - exists(decl) +/** Gets the root type of the reference node `ref`. */ +pragma[nomagic] +private Type inferRefPatType(AstNode ref) { + exists(boolean isMut | + ref = + any(IdentPat ip | + ip.isRef() and + if ip.isMut() then isMut = true else isMut = false + ).getName() or - result = getAdditionalTypeParameterConstraint(tp, decl) - } + ref = any(RefPat rp | if rp.isMut() then isMut = true else isMut = false) + | + result = getRefType(isMut) + ) +} - class AccessEnvironment = string; +pragma[nomagic] +private Type inferTryExprType(TryExpr te, TypePath path) { + exists(TypeParam tp, TypePath path0 | + result = inferType(te.getExpr(), path0) and + path0.isCons(TTypeParamTypeParameter(tp), path) + | + tp = any(ResultEnum r).getGenericParamList().getGenericParam(0) + or + tp = any(OptionEnum o).getGenericParamList().getGenericParam(0) + ) +} - bindingset[derefChain, borrow] - private AccessEnvironment encodeDerefChainBorrow(DerefChain derefChain, BorrowKind borrow) { - result = derefChain + ";" + borrow - } +pragma[nomagic] +private StructType getStrStruct() { result = TDataType(any(Builtins::Str s)) } - bindingset[derefChainBorrow] - additional predicate decodeDerefChainBorrow( - string derefChainBorrow, DerefChain derefChain, BorrowKind borrow - ) { - exists(int i | - i = derefChainBorrow.indexOf(";") and - derefChain = derefChainBorrow.prefix(i) and - borrow.toString() = derefChainBorrow.suffix(i + 1) - ) - } +pragma[nomagic] +private Type inferLiteralType(LiteralExpr le, TypePath path, boolean certain) { + path.isEmpty() and + exists(Builtins::BuiltinType t | result = TDataType(t) | + le instanceof CharLiteralExpr and + t instanceof Builtins::Char and + certain = true + or + le = + any(NumberLiteralExpr ne | + t.getName() = ne.getSuffix() and + certain = true + or + // When a number literal has no suffix, the type may depend on the context. + // For simplicity, we assume either `i32` or `f64`. + not exists(ne.getSuffix()) and + certain = false and + ( + ne instanceof IntegerLiteralExpr and + t instanceof Builtins::I32 + or + ne instanceof FloatLiteralExpr and + t instanceof Builtins::F64 + ) + ) + or + le instanceof BooleanLiteralExpr and + t instanceof Builtins::Bool and + certain = true + ) + or + le instanceof StringLiteralExpr and + ( + path.isEmpty() and result instanceof RefSharedType + or + path = TypePath::singleton(getRefTypeParameter(false)) and + result = getStrStruct() + ) and + certain = true +} - private string noDerefChainBorrow() { - exists(DerefChain derefChain, BorrowKind borrow | - derefChain.isEmpty() and - borrow.isNoBorrow() and - result = encodeDerefChainBorrow(derefChain, borrow) - ) - } +pragma[nomagic] +private DynTraitType getFutureTraitType() { result.getTrait() instanceof FutureTrait } - abstract class Access extends ContextTyping::ContextTypedCallCand { - abstract AstNode getNodeAt(FunctionPosition pos); +pragma[nomagic] +private AssociatedTypeTypeParameter getFutureOutputTypeParameter() { + result = getAssociatedTypeTypeParameter(any(FutureTrait ft).getOutputType()) +} - bindingset[derefChainBorrow] - abstract Type getInferredType(string derefChainBorrow, FunctionPosition pos, TypePath path); +pragma[nomagic] +private DynTraitTypeParameter getDynFutureOutputTypeParameter() { + result.getTraitTypeParameter() = getFutureOutputTypeParameter() +} - abstract Declaration getTarget(string derefChainBorrow); +pragma[nomagic] +predicate isUnitBlockExpr(BlockExpr be) { + not be.getStmtList().hasTailExpr() and + not be = any(Callable c).getBody() and + not be.hasLabel() +} - /** - * Holds if the return type of this call at `path` may have to be inferred - * from the context. - */ - abstract predicate hasUnknownTypeAt(string derefChainBorrow, FunctionPosition pos, TypePath path); - } +pragma[nomagic] +private Type inferBlockExprType(BlockExpr be, TypePath path) { + // `typeEquality` handles the non-root case + if be instanceof AsyncBlockExpr + then ( + path.isEmpty() and + result = getFutureTraitType() + or + isUnitBlockExpr(be) and + path = TypePath::singleton(getDynFutureOutputTypeParameter()) and + result instanceof UnitType + ) else ( + isUnitBlockExpr(be) and + path.isEmpty() and + result instanceof UnitType + ) +} - private class AssocFunctionCallAccess extends Access instanceof AssocFunctionResolution::AssocFunctionCall - { - AssocFunctionCallAccess() { - // handled in the `OperationMatchingInput` module - not this instanceof Operation - } +pragma[nomagic] +private predicate exprHasUnitType(Expr e) { + e = any(IfExpr ie | not ie.hasElse()) + or + e instanceof WhileExpr + or + e instanceof ForExpr +} - pragma[nomagic] - override Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { - result = - this.(MethodCallExpr) - .getGenericArgList() - .getTypeArg(apos.asMethodTypeArgumentPosition()) - .(TypeMention) - .getTypeAt(path) - or - result = getCallExprTypeArgument(this, apos, path) - } +final private class AwaitTarget extends Expr { + AwaitTarget() { this = any(AwaitExpr ae).getExpr() } - override AstNode getNodeAt(FunctionPosition pos) { - result = AssocFunctionResolution::AssocFunctionCall.super.getNodeAt(pos) - } + Type getTypeAt(TypePath path) { result = inferType(this, path) } +} - pragma[nomagic] - private Type getInferredSelfType(FunctionPosition pos, string derefChainBorrow, TypePath path) { - exists(DerefChain derefChain, BorrowKind borrow | - result = super.getSelfTypeAt(pos, derefChain, borrow, path) and - derefChainBorrow = encodeDerefChainBorrow(derefChain, borrow) and - super.hasReceiverAtPos(pos) - ) - } +private module AwaitSatisfiesTypeInput implements SatisfiesTypeInputSig { + pragma[nomagic] + predicate relevantConstraint(AwaitTarget term, Type constraint) { + exists(term) and + constraint.(TraitType).getTrait() instanceof FutureTrait + } +} - pragma[nomagic] - private Type getInferredNonSelfType(FunctionPosition pos, TypePath path) { - if - // index expression `x[i]` desugars to `*x.index(i)`, so we must account for - // the implicit deref - pos.isReturn() and - this instanceof IndexExpr - then - path.isEmpty() and - result instanceof RefType - or - exists(TypePath suffix | - result = super.getTypeAt(pos, suffix) and - path = TypePath::cons(getRefTypeParameter(_), suffix) - ) - else ( - not super.hasReceiverAtPos(pos) and - result = super.getTypeAt(pos, path) - ) - } +private module AwaitSatisfiesType = SatisfiesType; - bindingset[derefChainBorrow] - override Type getInferredType(string derefChainBorrow, FunctionPosition pos, TypePath path) { - result = this.getInferredSelfType(pos, derefChainBorrow, path) - or - result = this.getInferredNonSelfType(pos, path) - } +pragma[nomagic] +private Type inferAwaitExprType(AstNode n, TypePath path) { + exists(TypePath exprPath | + AwaitSatisfiesType::satisfiesConstraint(n.(AwaitExpr).getExpr(), _, exprPath, result) and + exprPath.isCons(getFutureOutputTypeParameter(), path) + ) +} - private AssocFunctionDeclaration getTarget(ImplOrTraitItemNode i, string derefChainBorrow) { - exists(DerefChain derefChain, BorrowKind borrow | - derefChainBorrow = encodeDerefChainBorrow(derefChain, borrow) and - result = super.resolveCallTarget(i, _, derefChain, borrow) // mutual recursion; resolving method calls requires resolving types and vice versa - ) - } +/** + * Gets the root type of the array expression `ae`. + */ +pragma[nomagic] +private Type inferArrayExprType(ArrayExpr ae) { exists(ae) and result instanceof ArrayType } - override Declaration getTarget(string derefChainBorrow) { - exists(ImplOrTraitItemNode i | result.isAssocFunction(i, this.getTarget(i, derefChainBorrow))) - } +/** + * Gets the root type of the range expression `re`. + */ +pragma[nomagic] +private Type inferRangeExprType(RangeExpr re) { result = TDataType(getRangeType(re)) } - pragma[nomagic] - override predicate hasUnknownTypeAt(string derefChainBorrow, FunctionPosition pos, TypePath path) { - exists(ImplOrTraitItemNode i | - this.hasUnknownTypeAt(i, this.getTarget(i, derefChainBorrow), pos, path) - ) - or - derefChainBorrow = noDerefChainBorrow() and - forex(ImplOrTraitItemNode i, Function f | - f = CallExprImpl::getResolvedFunction(this) and - f = i.getAnAssocItem() - | - this.hasUnknownTypeAt(i, f, pos, path) - ) - } - } +pragma[nomagic] +private Type getInferredDerefType(DerefExpr de, TypePath path) { result = inferType(de, path) } - private class NonAssocFunctionCallAccess extends Access instanceof NonAssocCallExpr, - CallExprImpl::CallExprCall - { - pragma[nomagic] - override Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { - result = NonAssocCallExpr.super.getTypeArgument(apos, path) - } +pragma[nomagic] +private PtrType getInferredDerefExprPtrType(DerefExpr de) { result = inferType(de.getExpr()) } - override AstNode getNodeAt(FunctionPosition pos) { - result = NonAssocCallExpr.super.getNodeAt(pos) - } +/** + * Gets the inferred type of `n` at `path` when `n` occurs in a dereference + * expression `*n` and when `n` is known to have a raw pointer type. + * + * The other direction is handled in `typeEqualityAsymmetric`. + */ +private Type inferDereferencedExprPtrType(AstNode n, TypePath path) { + exists(DerefExpr de, PtrType type, TypePath suffix | + de.getExpr() = n and + type = getInferredDerefExprPtrType(de) and + result = getInferredDerefType(de, suffix) and + path = TypePath::cons(type.getPositionalTypeParameter(0), suffix) + ) +} - pragma[nomagic] - private Type getInferredType(FunctionPosition pos, TypePath path) { - result = super.getInferredType(pos, path) - } +/** + * A matching configuration for resolving types of deconstruction patterns like + * `let Foo { bar } = ...` or `let Some(x) = ...`. + */ +private module DeconstructionPatMatchingInput implements MatchingInputSig { + import FunctionPositionMatchingInput - bindingset[derefChainBorrow] - override Type getInferredType(string derefChainBorrow, FunctionPosition pos, TypePath path) { - exists(derefChainBorrow) and - result = this.getInferredType(pos, path) - } + class Declaration = ConstructionMatchingInput::Declaration; - pragma[nomagic] - private Declaration getTarget() { - result = - TFunctionDeclaration(ImplOrTraitItemNodeOption::none_(), - super.resolveCallTargetViaPathResolution()) - } + class Access extends Pat instanceof PathAstNode { + Access() { this instanceof TupleStructPat or this instanceof StructPat } - override Declaration getTarget(string derefChainBorrow) { - result = this.getTarget() and - derefChainBorrow = noDerefChainBorrow() - } + Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { none() } - pragma[nomagic] - override predicate hasUnknownTypeAt(string derefChainBorrow, FunctionPosition pos, TypePath path) { - derefChainBorrow = noDerefChainBorrow() and - exists(FunctionDeclaration f, TypeParameter tp | - f = super.resolveCallTargetViaPathResolution() and - pos.isReturn() and - tp = f.getReturnType(_, path) and - not tp = f.getParameterType(_, _, _) and - // check that no explicit type arguments have been supplied for `tp` - not exists(TypeArgumentPosition tapos | - this.hasTypeArgument(tapos) and - TTypeParamTypeParameter(tapos.asTypeParam()) = tp + AstNode getNodeAt(AccessPosition apos) { + this = + any(StructPat sp | + result = + sp.getPatField(pragma[only_bind_into](sp.getNthStructField(apos.asPosition()) + .getName() + .getText())).getPat() ) - ) + or + result = this.(TupleStructPat).getField(apos.asPosition()) + or + result = this and + apos.isReturn() + } + + Type getInferredType(AccessPosition apos, TypePath path) { + result = inferType(this.getNodeAt(apos), path) + or + // The struct/enum type is supplied explicitly as a type qualifier, e.g. + // `let Foo::::Variant { ... } = ...` or + // `let Option::::Some(x) = ...`. + apos.isReturn() and + result = super.getPath().(TypeMention).getTypeAt(path) } + + Declaration getTarget() { result = resolvePath(super.getPath()) } } } -private module FunctionCallMatching = MatchingWithEnvironment; +private module DeconstructionPatMatching = Matching; +/** + * Gets the type of `n` at `path`, where `n` is a pattern for a constructor, + * either a struct pattern or a tuple-struct pattern. + */ pragma[nomagic] -private Type inferFunctionCallType0( - FunctionCallMatchingInput::Access call, FunctionPosition pos, AstNode n, DerefChain derefChain, - BorrowKind borrow, TypePath path -) { - exists(TypePath path0 | - n = call.getNodeAt(pos) and - exists(string derefChainBorrow | - FunctionCallMatchingInput::decodeDerefChainBorrow(derefChainBorrow, derefChain, borrow) - | - result = FunctionCallMatching::inferAccessType(call, derefChainBorrow, pos, path0) - or - call.hasUnknownTypeAt(derefChainBorrow, pos, path0) and - result = TUnknownType() - ) - | - if - // index expression `x[i]` desugars to `*x.index(i)`, so we must account for - // the implicit deref - pos.isReturn() and - call instanceof IndexExpr - then path0.isCons(getRefTypeParameter(_), path) - else path = path0 +private Type inferDeconstructionPatType(AstNode n, TypePath path) { + exists(DeconstructionPatMatchingInput::Access a, FunctionPosition apos | + n = a.getNodeAt(apos) and + result = DeconstructionPatMatching::inferAccessType(a, apos, path) ) } +final private class ForIterableExpr extends Expr { + ForIterableExpr() { this = any(ForExpr fe).getIterable() } + + Type getTypeAt(TypePath path) { result = inferType(this, path) } +} + +private module ForIterableSatisfiesTypeInput implements SatisfiesTypeInputSig { + predicate relevantConstraint(ForIterableExpr term, Type constraint) { + exists(term) and + exists(Trait t | t = constraint.(TraitType).getTrait() | + // TODO: Remove the line below once we can handle the `impl IntoIterator for I` implementation + t instanceof IteratorTrait or + t instanceof IntoIteratorTrait + ) + } +} + pragma[nomagic] -private Type inferFunctionCallTypeNonSelf(AstNode n, FunctionPosition pos, TypePath path) { - exists(FunctionCallMatchingInput::Access call | - result = inferFunctionCallType0(call, pos, n, _, _, path) and - not call.(AssocFunctionResolution::AssocFunctionCall).hasReceiverAtPos(pos) - ) +private AssociatedTypeTypeParameter getIteratorItemTypeParameter() { + result = getAssociatedTypeTypeParameter(any(IteratorTrait t).getItemType()) } -/** - * Gets the type of `n` at `path` after applying `derefChain`, where `n` is the - * `self` argument of a method call. - * - * The predicate recursively pops the head of `derefChain` until it becomes - * empty, at which point the inferred type can be applied back to `n`. - */ pragma[nomagic] -private Type inferFunctionCallTypeSelf( - FunctionCallMatchingInput::Access call, AstNode n, DerefChain derefChain, TypePath path -) { - exists(FunctionPosition pos, BorrowKind borrow, TypePath path0 | - call.(AssocFunctionResolution::AssocFunctionCall).hasReceiverAtPos(pos) and - result = inferFunctionCallType0(call, pos, n, derefChain, borrow, path0) +private AssociatedTypeTypeParameter getIntoIteratorItemTypeParameter() { + result = getAssociatedTypeTypeParameter(any(IntoIteratorTrait t).getItemType()) +} + +private module ForIterableSatisfiesType = + SatisfiesType; + +pragma[nomagic] +private Type inferForLoopExprType(AstNode n, TypePath path) { + // type of iterable -> type of pattern (loop variable) + exists(ForExpr fe, TypePath exprPath, AssociatedTypeTypeParameter tp | + n = fe.getPat() and + ForIterableSatisfiesType::satisfiesConstraint(fe.getIterable(), _, exprPath, result) and + exprPath.isCons(tp, path) | - borrow.isNoBorrow() and - path = path0 + tp = getIntoIteratorItemTypeParameter() or - // adjust for implicit borrow - exists(TypePath prefix | - prefix = TypePath::singleton(borrow.getRefType().getPositionalTypeParameter(0)) and - path0 = prefix.appendInverse(path) - ) + // TODO: Remove once we can handle the `impl IntoIterator for I` implementation + tp = getIteratorItemTypeParameter() and + inferType(fe.getIterable()) != getArrayTypeParameter() ) - or - // adjust for implicit deref - exists( - DerefChain derefChain0, Type t0, TypePath path0, DerefImplItemNode impl, Type selfParamType, - TypePath selfPath - | - t0 = inferFunctionCallTypeSelf(call, n, derefChain0, path0) and - derefChain0.isCons(impl, derefChain) and - selfParamType = impl.resolveSelfTypeAt(selfPath) - | - result = selfParamType and - path = selfPath and - not result instanceof TypeParameter +} + +pragma[nomagic] +private Type inferClosureExprType(AstNode n, TypePath path) { + exists(ClosureExpr ce | + n = ce and + ( + path = TypePath::singleton(TDynTraitTypeParameter(_, any(FnTrait t).getTypeParam())) and + result.(TupleType).getArity() = ce.getNumberOfParams() + or + exists(TypePath path0 | + result = ce.getRetType().getTypeRepr().(TypeMention).getTypeAt(path0) and + path = closureReturnPath().append(path0) + ) + ) or - exists(TypePath pathToTypeParam, TypePath suffix | - impl.targetHasTypeParameterAt(pathToTypeParam, selfParamType) and - path0 = pathToTypeParam.appendInverse(suffix) and - result = t0 and - path = selfPath.append(suffix) + exists(Param p | + p = ce.getAParam() and + not p.hasTypeRepr() and + n = p.getPat() and + result = TUnknownType() and + path.isEmpty() ) ) } -private Type inferFunctionCallTypePreCheck( - AstNode n, ContextTyping::FunctionPositionKind kind, TypePath path -) { - exists(FunctionPosition pos | - result = inferFunctionCallTypeNonSelf(n, pos, path) and - if pos.isPosition() - then kind = ContextTyping::PositionalKind() - else kind = ContextTyping::ReturnKind() +pragma[nomagic] +private TupleType inferArgList(ArgList args, TypePath path) { + exists(CallExprImpl::DynamicCallExpr dce | + args = dce.getArgList() and + result.getArity() = dce.getNumberOfSyntacticArguments() and + path.isEmpty() + ) +} + +pragma[nomagic] +private Type inferCastExprType(CastExpr ce, TypePath path) { + result = ce.getTypeRepr().(TypeMention).getTypeAt(path) +} + +/** Holds if `n` is implicitly dereferenced and/or borrowed. */ +cached +predicate implicitDerefChainBorrow(Expr e, DerefChain derefChain, boolean borrow) { + Stages::TypeInferenceStage::ref() and + exists(BorrowKind bk | + any(AssocFunctionResolution::AssocFunctionCall afc) + .argumentHasImplicitDerefChainBorrow(e, derefChain, bk) and + if bk.isNoBorrow() then borrow = false else borrow = true ) or - exists(FunctionCallMatchingInput::Access a | - result = inferFunctionCallTypeSelf(a, n, DerefChain::nil(), path) and - if a.(AssocFunctionResolution::AssocFunctionCall).hasReceiver() - then kind = ContextTyping::SelfKind() - else kind = ContextTyping::PositionalKind() + e = + any(FieldExpr fe | + exists(resolveStructFieldExpr(fe, derefChain)) + or + exists(resolveTupleFieldExpr(fe, derefChain)) + ).getContainer() and + not derefChain.isEmpty() and + borrow = false +} + +/** + * Gets an item (function or tuple struct/variant) that `call` resolves to, if + * any. + * + * The parameter `dispatch` is `true` if and only if the resolved target is a + * trait item because a precise target could not be determined from the + * types (for instance in the presence of generics or `dyn` types) + */ +cached +Addressable resolveCallTarget(InvocationExpr call, boolean dispatch) { + dispatch = false and + result = call.(NonAssocCallExpr).resolveCallTargetViaPathResolution() + or + exists(ImplOrTraitItemNode i | + i instanceof TraitItemNode and dispatch = true + or + i instanceof ImplItemNode and dispatch = false + | + result = call.(AssocFunctionResolution::AssocFunctionCall).resolveCallTarget(i, _, _, _) and + not call instanceof CallExprImpl::DynamicCallExpr and + not i instanceof Builtins::BuiltinImpl ) } /** - * Gets the type of `n` at `path`, where `n` is either a function call or an - * argument/receiver of a function call. + * Gets the struct field that the field expression `fe` resolves to, if any. */ -private predicate inferFunctionCallType = - ContextTyping::CheckContextTyping::check/2; +cached +StructField resolveStructFieldExpr(FieldExpr fe, DerefChain derefChain) { + exists(string name, DataType ty | + ty = getFieldExprLookupType(fe, pragma[only_bind_into](name), derefChain) + | + result = ty.(StructType).getTypeItem().getStructField(pragma[only_bind_into](name)) or + result = ty.(UnionType).getTypeItem().getStructField(pragma[only_bind_into](name)) + ) +} -abstract private class Constructor extends Addressable { - final TypeParameter getTypeParameter(TypeParameterPosition ppos) { - typeParamMatchPosition(this.getTypeItem().getGenericParamList().getATypeParam(), result, ppos) +/** + * Gets the tuple field that the field expression `fe` resolves to, if any. + */ +cached +TupleField resolveTupleFieldExpr(FieldExpr fe, DerefChain derefChain) { + exists(int i | + result = + getTupleFieldExprLookupType(fe, pragma[only_bind_into](i), derefChain) + .(StructType) + .getTypeItem() + .getTupleField(pragma[only_bind_into](i)) + ) +} + +/** Provides predicates for debugging the type inference implementation. */ +private module Debug { + Locatable getRelevantLocatable() { + exists(string filepath, int startline, int startcolumn, int endline, int endcolumn | + result.getLocation().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) and + filepath.matches("%/main.rs") and + startline = 103 + ) } - abstract TypeItem getTypeItem(); + Type debugInferType(AstNode n, TypePath path) { + n = getRelevantLocatable() and + result = inferType(n, path) + } - abstract TypeRepr getParameterTypeRepr(int pos); + Addressable debugResolveCallTarget(InvocationExpr c, boolean dispatch) { + c = getRelevantLocatable() and + result = resolveCallTarget(c, dispatch) + } - Type getReturnType(TypePath path) { - result = TDataType(this.getTypeItem()) and - path.isEmpty() - or - result = TTypeParamTypeParameter(this.getTypeItem().getGenericParamList().getATypeParam()) and - path = TypePath::singleton(result) + predicate debugConditionSatisfiesConstraint( + TypeAbstraction abs, TypeMention condition, TypeMention constraint, boolean transitive + ) { + abs = getRelevantLocatable() and + Input2::conditionSatisfiesConstraint(abs, condition, constraint, transitive) } - Type getDeclaredType(FunctionPosition pos, TypePath path) { - result = this.getParameterType(pos.asPosition(), path) - or - pos.isReturn() and - result = this.getReturnType(path) + predicate debugInferShorthandSelfType(ShorthandSelfParameterMention self, TypePath path, Type t) { + self = getRelevantLocatable() and + t = self.getTypeAt(path) } - Type getParameterType(int pos, TypePath path) { - result = this.getParameterTypeRepr(pos).(TypeMention).getTypeAt(path) + predicate debugInferFunctionCallType(AstNode n, TypePath path, Type t) { + n = getRelevantLocatable() and + t = inferFunctionCallType(n, path) } -} -private class StructConstructor extends Constructor instanceof Struct { - override TypeItem getTypeItem() { result = this } + predicate debugInferConstructionType(AstNode n, TypePath path, Type t) { + n = getRelevantLocatable() and + t = inferConstructionType(n, path) + } - override TypeRepr getParameterTypeRepr(int i) { - result = [super.getTupleField(i).getTypeRepr(), super.getNthStructField(i).getTypeRepr()] + predicate debugTypeMention(TypeMention tm, TypePath path, Type type) { + tm = getRelevantLocatable() and + tm.getTypeAt(path) = type } -} -private class VariantConstructor extends Constructor instanceof Variant { - override TypeItem getTypeItem() { result = super.getEnum() } + Type debugInferAnnotatedType(AstNode n, TypePath path) { + n = getRelevantLocatable() and + result = inferAnnotatedType(n, path) + } - override TypeRepr getParameterTypeRepr(int i) { - result = [super.getTupleField(i).getTypeRepr(), super.getNthStructField(i).getTypeRepr()] + pragma[nomagic] + private int countTypesAtPath(AstNode n, TypePath path, Type t) { + t = inferType(n, path) and + result = strictcount(Type t0 | t0 = inferType(n, path)) } -} -/** - * A matching configuration for resolving types of constructions of enums and - * structs, such as `Result::Ok(42)`, `Foo { bar: 1 }` and `None`. - */ -private module ConstructionMatchingInput implements MatchingInputSig { - import FunctionPositionMatchingInput + pragma[nomagic] + private predicate atLimit(AstNode n) { + exists(TypePath path0 | exists(inferType(n, path0)) and path0.length() >= getTypePathLimit()) + } - class Declaration = Constructor; + Type debugInferTypeForNodeAtLimit(AstNode n, TypePath path) { + result = inferType(n, path) and + atLimit(n) + } - abstract class Access extends AstNode { - abstract Type getInferredType(FunctionPosition pos, TypePath path); + predicate countTypesForNodeAtLimit(AstNode n, int c) { + n = getRelevantLocatable() and + c = strictcount(Type t, TypePath path | t = debugInferTypeForNodeAtLimit(n, path)) + } - abstract Declaration getTarget(); + predicate maxTypes(AstNode n, TypePath path, Type t, int c) { + c = countTypesAtPath(n, path, t) and + c = max(countTypesAtPath(_, _, _)) + } - abstract AstNode getNodeAt(AccessPosition apos); + pragma[nomagic] + private predicate typePathLength(AstNode n, TypePath path, Type t, int len) { + t = inferType(n, path) and + len = path.length() + } + + predicate maxTypePath(AstNode n, TypePath path, Type t, int len) { + typePathLength(n, path, t, len) and + len = max(int i | typePathLength(_, _, _, i)) + } + + pragma[nomagic] + private int countTypePaths(AstNode n, TypePath path, Type t) { + t = inferType(n, path) and + result = strictcount(TypePath path0, Type t0 | t0 = inferType(n, path0)) + } + + predicate maxTypePaths(AstNode n, TypePath path, Type t, int c) { + c = countTypePaths(n, path, t) and + c = max(countTypePaths(_, _, _)) + } + + Type debugInferCertainType(AstNode n, TypePath path) { + n = getRelevantLocatable() and + result = CertainTypeInference::inferCertainType(n, path) + } + + Type debugInferCertainNonUniqueType(AstNode n, TypePath path) { + n = getRelevantLocatable() and + Consistency::nonUniqueCertainType(n, path, result) + } +} + +//////////// +// TEMPORARILY MOVED HERE +//////////// +/** + * Provides functionality related to context-based typing of calls. + */ +private module ContextTyping { + /** + * Holds if `f` mentions type parameter `tp` at some non-return position, + * possibly via a constraint on another mentioned type parameter. + */ + pragma[nomagic] + private predicate assocFunctionMentionsTypeParameterAtNonRetPos( + ImplOrTraitItemNode i, Function f, TypeParameter tp + ) { + exists(FunctionPosition nonRetPos | + not nonRetPos.isReturn() and + not nonRetPos.isTypeQualifier() and + tp = getAssocFunctionTypeAt(f, i, nonRetPos, _) + ) + or + exists(TypeParameter mid | + assocFunctionMentionsTypeParameterAtNonRetPos(i, f, mid) and + tp = getATypeParameterConstraint(mid).getTypeAt(_) + ) + } + + /** + * Holds if the return type of the function `f` inside `i` at `path` is type + * parameter `tp`, and `tp` does not appear in the type of any parameter of + * `f`. + * + * In this case, the context in which `f` is called may be needed to infer + * the instantiation of `tp`. + * + * This covers functions like `Default::default` and `Vec::new`. + */ + pragma[nomagic] + private predicate assocFunctionReturnContextTypedAt( + ImplOrTraitItemNode i, Function f, FunctionPosition pos, TypePath path, TypeParameter tp + ) { + pos.isReturn() and + tp = getAssocFunctionTypeAt(f, i, pos, path) and + not assocFunctionMentionsTypeParameterAtNonRetPos(i, f, tp) + } + /** + * A call where the type of the result may have to be inferred from the + * context in which the call appears, for example a call like + * `Default::default()`. + */ + abstract class ContextTypedCallCand extends AstNode { abstract Type getTypeArgument(TypeArgumentPosition apos, TypePath path); + predicate hasTypeArgument(TypeArgumentPosition apos) { exists(this.getTypeArgument(apos, _)) } + /** - * Holds if the return type of this construction expression at `path` may - * have to be inferred from the context. For example in `Result::Ok(42)` the - * error type has to be inferred from the context. + * Holds if this call resolves to `target` inside `i`, and the return type + * at `pos` and `path` may have to be inferred from the context. */ - pragma[nomagic] - predicate hasUnknownTypeAt(FunctionPosition pos, TypePath path) { - exists(Declaration d, TypeParameter tp | - d = this.getTarget() and - pos.isReturn() and - tp = d.getReturnType(path) and - not exists(FunctionPosition pos2 | not pos2.isReturn() and tp = d.getDeclaredType(pos2, _)) and + bindingset[this, i, target] + predicate hasUnknownTypeAt( + ImplOrTraitItemNode i, Function target, FunctionPosition pos, TypePath path + ) { + exists(TypeParameter tp | + assocFunctionReturnContextTypedAt(i, target, pos, path, tp) and // check that no explicit type arguments have been supplied for `tp` - not exists(TypeArgumentPosition tapos | - exists(this.getTypeArgument(tapos, _)) and + not exists(TypeArgumentPosition tapos | this.hasTypeArgument(tapos) | + exists(int j | + j = tapos.asMethodTypeArgumentPosition() and + tp = TTypeParamTypeParameter(target.getGenericParamList().getTypeParam(j)) + ) + or TTypeParamTypeParameter(tapos.asTypeParam()) = tp + ) and + not ( + tp instanceof TSelfTypeParameter and + exists(getCallExprTypeQualifier(this, _, _)) ) ) } } - private class NonAssocCallAccess extends Access, NonAssocCallExpr, - ContextTyping::ContextTypedCallCand - { - NonAssocCallAccess() { - this instanceof CallExprImpl::TupleStructExpr or - this instanceof CallExprImpl::TupleVariantExpr - } - - override Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { - result = NonAssocCallExpr.super.getTypeArgument(apos, path) - } + pragma[nomagic] + private predicate hasUnknownTypeAt(AstNode n, TypePath path) { + inferType(n, path) = TUnknownType() + } - override AstNode getNodeAt(AccessPosition apos) { - result = NonAssocCallExpr.super.getNodeAt(apos) - } + pragma[nomagic] + private predicate hasUnknownType(AstNode n) { hasUnknownTypeAt(n, _) } - override Type getInferredType(FunctionPosition pos, TypePath path) { - result = NonAssocCallExpr.super.getInferredType(pos, path) - } + newtype FunctionPositionKind = + SelfKind() or + ReturnKind() or + PositionalKind() - override Declaration getTarget() { result = this.resolveCallTargetViaPathResolution() } - } + signature Type inferCallTypeSig(AstNode n, FunctionPositionKind kind, TypePath path); - abstract private class StructAccess extends Access instanceof PathAstNode { + /** + * Given a predicate `inferCallType` for inferring the type of a call at a given + * position, this module exposes the predicate `check`, which wraps the input + * predicate and checks that types are only propagated into arguments when they + * are context-typed. + */ + module CheckContextTyping { pragma[nomagic] - override Type getInferredType(AccessPosition apos, TypePath path) { - result = inferType(this.getNodeAt(apos), path) + private Type inferCallNonReturnType( + AstNode n, FunctionPositionKind kind, TypePath prefix, TypePath path + ) { + result = inferCallType(n, kind, path) and + hasUnknownType(n) and + kind != ReturnKind() and + prefix = path.getAPrefix() } pragma[nomagic] - override Declaration getTarget() { result = resolvePath(super.getPath()) } - - pragma[nomagic] - override Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { - // Handle constructions that use `Self {...}` syntax - exists(TypeMention tm, TypePath path0 | - tm = super.getPath() and - result = tm.getTypeAt(path0) and - path0.isCons(TTypeParamTypeParameter(apos.asTypeParam()), path) + Type check(AstNode n, TypePath path) { + result = inferCallType(n, ReturnKind(), path) + or + exists(FunctionPositionKind kind, TypePath prefix | + result = inferCallNonReturnType(n, kind, prefix, path) and + hasUnknownTypeAt(n, prefix) + | + // Never propagate type information directly into the receiver, since its type + // must already have been known in order to resolve the call + if kind = SelfKind() then not prefix.isEmpty() else any() ) } } +} - private class StructExprAccess extends StructAccess, StructExpr { - override Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { - result = super.getTypeArgument(apos, path) - or - exists(TypePath suffix | - suffix.isCons(TTypeParamTypeParameter(apos.asTypeParam()), path) and - result = CertainTypeInference::inferCertainType(this, suffix) +private predicate bodyReturns(Expr body, Expr e) { + exists(ReturnExpr re, Callable c | + e = re.getExpr() and + c = re.getEnclosingCallable() and + body = c.getBody() + ) +} + +/** + * Holds if the type tree of `n1` at `prefix1` should be equal to the type tree + * of `n2` at `prefix2` and type information should propagate in both directions + * through the type equality. + */ +private predicate typeEquality(AstNode n1, TypePath prefix1, AstNode n2, TypePath prefix2) { + CertainTypeInference::certainTypeEquality(n1, prefix1, n2, prefix2) + or + prefix1.isEmpty() and + prefix2.isEmpty() and + ( + exists(LetStmt let | + let.getPat() = n1 and + let.getInitializer() = n2 + ) + or + n2 = + any(MatchExpr me | + n1 = me.getAnArm().getExpr() and + me.getNumberOfArms() = 1 ) - } + or + exists(LetExpr let | + n1 = let.getScrutinee() and + n2 = let.getPat() + ) + or + exists(MatchExpr me | + n1 = me.getScrutinee() and + n2 = me.getAnArm().getPat() + ) + or + n1 = n2.(OrPat).getAPat() + or + n1 = n2.(ParenPat).getPat() + or + n1 = n2.(LiteralPat).getLiteral() + or + exists(BreakExpr break | + break.getExpr() = n1 and + break.getTarget() = n2.(LoopExpr) + ) + or + exists(AssignmentExpr be | + n1 = be.getLhs() and + n2 = be.getRhs() + ) + or + n1 = n2.(MacroExpr).getMacroCall().getMacroCallExpansion() and + not isPanicMacroCall(n2) + or + n1 = n2.(MacroPat).getMacroCall().getMacroCallExpansion() + or + bodyReturns(n1, n2) and + strictcount(Expr e | bodyReturns(n1, e)) = 1 + ) + or + n2 = + any(RefExpr re | + n1 = re.getExpr() and + prefix1.isEmpty() and + prefix2 = TypePath::singleton(inferRefExprType(re).getPositionalTypeParameter(0)) + ) + or + n2 = + any(RefPat rp | + n1 = rp.getPat() and + prefix1.isEmpty() and + exists(boolean isMutable | if rp.isMut() then isMutable = true else isMutable = false | + prefix2 = TypePath::singleton(getRefTypeParameter(isMutable)) + ) + ) + or + exists(int i, int arity | + prefix1.isEmpty() and + prefix2 = TypePath::singleton(getTupleTypeParameter(arity, i)) + | + arity = n2.(TupleExpr).getNumberOfFields() and + n1 = n2.(TupleExpr).getField(i) + or + arity = n2.(TuplePat).getTupleArity() and + n1 = n2.(TuplePat).getField(i) + ) + or + exists(BlockExpr be | + n1 = be and + n2 = be.getStmtList().getTailExpr() and + if be.isAsync() + then + prefix1 = TypePath::singleton(getDynFutureOutputTypeParameter()) and + prefix2.isEmpty() + else ( + prefix1.isEmpty() and + prefix2.isEmpty() + ) + ) + or + // an array list expression with only one element (such as `[1]`) has type from that element + n1 = + any(ArrayListExpr ale | + ale.getAnExpr() = n2 and + ale.getNumberOfExprs() = 1 + ) and + prefix1 = TypePath::singleton(getArrayTypeParameter()) and + prefix2.isEmpty() + or + // an array repeat expression (`[1; 3]`) has the type of the repeat operand + n1.(ArrayRepeatExpr).getRepeatOperand() = n2 and + prefix1 = TypePath::singleton(getArrayTypeParameter()) and + prefix2.isEmpty() +} - override AstNode getNodeAt(AccessPosition apos) { - result = - this.getFieldExpr(pragma[only_bind_into](this.getNthStructField(apos.asPosition()) - .getName() - .getText())).getExpr() - or - result = this and apos.isReturn() - } - } +/** + * Holds if `child` is a child of `parent`, and the Rust compiler applies [least + * upper bound (LUB) coercion][1] to infer the type of `parent` from the type of + * `child`. + * + * In this case, we want type information to only flow from `child` to `parent`, + * to avoid (a) either having to model LUB coercions, or (b) risk combinatorial + * explosion in inferred types. + * + * [1]: https://doc.rust-lang.org/reference/type-coercions.html#r-coerce.least-upper-bound + */ +private predicate lubCoercion(AstNode parent, AstNode child, TypePath prefix) { + child = parent.(IfExpr).getABranch() and + prefix.isEmpty() + or + parent = + any(MatchExpr me | + child = me.getAnArm().getExpr() and + me.getNumberOfArms() > 1 + ) and + prefix.isEmpty() + or + parent = + any(ArrayListExpr ale | + child = ale.getAnExpr() and + ale.getNumberOfExprs() > 1 + ) and + prefix = TypePath::singleton(getArrayTypeParameter()) + or + bodyReturns(parent, child) and + strictcount(Expr e | bodyReturns(parent, e)) > 1 and + prefix.isEmpty() + or + parent = any(ClosureExpr ce | not ce.hasRetType() and ce.getClosureBody() = child) and + prefix = closureReturnPath() + or + exists(Struct s | + child = [parent.(RangeExpr).getStart(), parent.(RangeExpr).getEnd()] and + prefix = TypePath::singleton(TTypeParamTypeParameter(s.getGenericParamList().getATypeParam())) and + s = getRangeType(parent) + ) +} - /** A potential nullary struct/variant construction such as `None`. */ - private class PathExprAccess extends StructAccess, PathExpr { - PathExprAccess() { not exists(CallExpr ce | this = ce.getFunction()) } +private Type inferUnknownTypeFromAnnotation(AstNode n, TypePath path) { + inferType(n, path) = TUnknownType() and + // Normally, these are coercion sites, but in case a type is unknown we + // allow for type information to flow from the type annotation. + exists(TypeMention tm | result = tm.getTypeAt(path) | + tm = any(LetStmt let | identLetStmt(let, _, n)).getTypeRepr() + or + tm = any(ClosureExpr ce | n = ce.getBody()).getRetType().getTypeRepr() + or + tm = getReturnTypeMention(any(Function f | n = f.getBody())) + ) +} - override AstNode getNodeAt(AccessPosition apos) { result = this and apos.isReturn() } - } +/** + * Holds if the type tree of `n1` at `prefix1` should be equal to the type tree + * of `n2` at `prefix2`, but type information should only propagate from `n1` to + * `n2`. + */ +private predicate typeEqualityAsymmetric(AstNode n1, TypePath prefix1, AstNode n2, TypePath prefix2) { + lubCoercion(n2, n1, prefix2) and + prefix1.isEmpty() + or + exists(AstNode mid, TypePath prefixMid, TypePath suffix | + typeEquality(n1, prefixMid, mid, prefix2) or + typeEquality(mid, prefix2, n1, prefixMid) + | + lubCoercion(mid, n2, suffix) and + not lubCoercion(mid, n1, _) and + prefix1 = prefixMid.append(suffix) + ) + or + // When `n2` is `*n1` propagate type information from a raw pointer type + // parameter at `n1`. The other direction is handled in + // `inferDereferencedExprPtrType`. + n1 = n2.(DerefExpr).getExpr() and + prefix1 = TypePath::singleton(getPtrTypeParameter()) and + prefix2.isEmpty() } -private module ConstructionMatching = Matching; - pragma[nomagic] -private Type inferConstructionTypePreCheck( - AstNode n, ContextTyping::FunctionPositionKind kind, TypePath path -) { - exists(ConstructionMatchingInput::Access a, FunctionPosition pos | - n = a.getNodeAt(pos) and - if pos.isPosition() - then kind = ContextTyping::PositionalKind() - else kind = ContextTyping::ReturnKind() +private Type inferTypeEquality(AstNode n, TypePath path) { + exists(TypePath prefix1, AstNode n2, TypePath prefix2, TypePath suffix | + result = inferType(n2, prefix2.appendInverse(suffix)) and + path = prefix1.append(suffix) | - result = ConstructionMatching::inferAccessType(a, pos, path) + typeEquality(n, prefix1, n2, prefix2) or - a.hasUnknownTypeAt(pos, path) and - result = TUnknownType() + typeEquality(n2, prefix2, n, prefix1) + or + typeEqualityAsymmetric(n2, prefix2, n, prefix1) ) } -private predicate inferConstructionType = - ContextTyping::CheckContextTyping::check/2; - /** - * A matching configuration for resolving types of operations like `a + b`. + * A matching configuration for resolving types of function call expressions + * like `foo.bar(baz)` and `Foo::bar(baz)`. */ -private module OperationMatchingInput implements MatchingInputSig { - private import codeql.rust.elements.internal.OperationImpl::Impl as OperationImpl +private module FunctionCallMatchingInput implements MatchingWithEnvironmentInputSig { import FunctionPositionMatchingInput - class Declaration extends FunctionCallMatchingInput::Declaration { - private Method getSelfOrImpl() { - result = f - or - f.implements(result) - } + private newtype TDeclaration = + TFunctionDeclaration(ImplOrTraitItemNodeOption i, FunctionDeclaration f) { f.isFor(i) } - pragma[nomagic] - private predicate borrowsAt(FunctionPosition pos) { - exists(TraitItemNode t, string path, string method | - this.getSelfOrImpl() = t.getAssocItem(method) and - path = t.getCanonicalPath(_) and - exists(int borrows | OperationImpl::isOverloaded(_, _, path, method, borrows) | - pos.asPosition() = 0 and borrows >= 1 - or - pos.asPosition() = 1 and - borrows >= 2 - ) - ) - } + final class Declaration extends TFunctionDeclaration { + ImplOrTraitItemNodeOption i; + FunctionDeclaration f; - pragma[nomagic] - private predicate derefsReturn() { this.getSelfOrImpl() = any(DerefTrait t).getDerefFunction() } + Declaration() { this = TFunctionDeclaration(i, f) } - Type getDeclaredType(FunctionPosition pos, TypePath path) { - exists(TypePath path0 | - result = super.getDeclaredType(pos, path0) and - if - this.borrowsAt(pos) - or - pos.isReturn() and this.derefsReturn() - then path0.isCons(getRefTypeParameter(_), path) - else path0 = path - ) - } - } + FunctionDeclaration getFunction() { result = f } - class Access extends AssocFunctionResolution::OperationAssocFunctionCall { - Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { none() } + predicate isAssocFunction(ImplOrTraitItemNode i_, Function f_) { + i_ = i.asSome() and + f_ = f + } - pragma[nomagic] - Type getInferredType(FunctionPosition pos, TypePath path) { - result = inferType(this.getNodeAt(pos), path) + TypeParameter getTypeParameter(TypeParameterPosition ppos) { + result = f.getTypeParameter(i, ppos) } - Declaration getTarget() { - exists(ImplOrTraitItemNode i | - result.isAssocFunction(i, this.resolveCallTarget(i, _, _, _)) // mutual recursion - ) + Type getDeclaredType(FunctionPosition pos, TypePath path) { + result = f.getParameterType(i, pos, path) + or + pos.isReturn() and + result = f.getReturnType(i, path) } - } -} -private module OperationMatching = Matching; + string toString() { + i.isNone() and result = f.toString() + or + result = f.toStringExt(i.asSome()) + } -pragma[nomagic] -private Type inferOperationTypePreCheck( - AstNode n, ContextTyping::FunctionPositionKind kind, TypePath path -) { - exists(OperationMatchingInput::Access a, FunctionPosition pos | - n = a.getNodeAt(pos) and - result = OperationMatching::inferAccessType(a, pos, path) and - if pos.asPosition() = 0 - then kind = ContextTyping::SelfKind() - else - if pos.isPosition() - then kind = ContextTyping::PositionalKind() - else kind = ContextTyping::ReturnKind() - ) -} + Location getLocation() { result = f.getLocation() } + } -private predicate inferOperationType = - ContextTyping::CheckContextTyping::check/2; + pragma[nomagic] + private TypeMention getAdditionalTypeParameterConstraint(TypeParameter tp, Declaration decl) { + result = + tp.(TypeParamTypeParameter) + .getTypeParam() + .getAdditionalTypeBound(decl.getFunction(), _) + .getTypeRepr() + } -pragma[nomagic] -private Type getFieldExprLookupType(FieldExpr fe, string name, DerefChain derefChain) { - exists(TypePath path | - result = inferType(fe.getContainer(), path) and - name = fe.getIdentifier().getText() and - isComplexRootStripped(path, result) - | - // TODO: Support full derefence chains as for method calls - path.isEmpty() and - derefChain = DerefChain::nil() + bindingset[decl] + TypeMention getATypeParameterConstraint(TypeParameter tp, Declaration decl) { + result = Input2::getATypeParameterConstraint(tp) and + exists(decl) or - exists(DerefImplItemNode impl, TypeParamTypeParameter tp | - tp = impl.getFirstSelfTypeParameter() and - path.getHead() = tp and - derefChain = DerefChain::singleton(impl) - ) - ) -} - -pragma[nomagic] -private Type getTupleFieldExprLookupType(FieldExpr fe, int pos, DerefChain derefChain) { - exists(string name | - result = getFieldExprLookupType(fe, name, derefChain) and - pos = name.toInt() - ) -} - -/** - * A matching configuration for resolving types of field expressions like `x.field`. - */ -private module FieldExprMatchingInput implements MatchingInputSig { - private newtype TDeclarationPosition = - TSelfDeclarationPosition() or - TFieldPos() + result = getAdditionalTypeParameterConstraint(tp, decl) + } - class DeclarationPosition extends TDeclarationPosition { - predicate isSelf() { this = TSelfDeclarationPosition() } + class AccessEnvironment = string; - predicate isField() { this = TFieldPos() } + bindingset[derefChain, borrow] + private AccessEnvironment encodeDerefChainBorrow(DerefChain derefChain, BorrowKind borrow) { + result = derefChain + ";" + borrow + } - string toString() { - this.isSelf() and - result = "self" - or - this.isField() and - result = "(field)" - } + bindingset[derefChainBorrow] + additional predicate decodeDerefChainBorrow( + string derefChainBorrow, DerefChain derefChain, BorrowKind borrow + ) { + exists(int i | + i = derefChainBorrow.indexOf(";") and + derefChain = derefChainBorrow.prefix(i) and + borrow.toString() = derefChainBorrow.suffix(i + 1) + ) } - private newtype TDeclaration = - TStructFieldDecl(StructField sf) or - TTupleFieldDecl(TupleField tf) + private string noDerefChainBorrow() { + exists(DerefChain derefChain, BorrowKind borrow | + derefChain.isEmpty() and + borrow.isNoBorrow() and + result = encodeDerefChainBorrow(derefChain, borrow) + ) + } - abstract class Declaration extends TDeclaration { - TypeParameter getTypeParameter(TypeParameterPosition ppos) { none() } + abstract class Access extends ContextTyping::ContextTypedCallCand { + abstract AstNode getNodeAt(FunctionPosition pos); - abstract Type getDeclaredType(DeclarationPosition dpos, TypePath path); + bindingset[derefChainBorrow] + abstract Type getInferredType(string derefChainBorrow, FunctionPosition pos, TypePath path); - abstract string toString(); + abstract Declaration getTarget(string derefChainBorrow); - abstract Location getLocation(); + /** + * Holds if the return type of this call at `path` may have to be inferred + * from the context. + */ + abstract predicate hasUnknownTypeAt(string derefChainBorrow, FunctionPosition pos, TypePath path); } - abstract private class StructOrTupleFieldDecl extends Declaration { - abstract AstNode getAstNode(); - - abstract TypeRepr getTypeRepr(); + private class AssocFunctionCallAccess extends Access instanceof AssocFunctionResolution::AssocFunctionCall + { + AssocFunctionCallAccess() { + // handled in the `OperationMatchingInput` module + not this instanceof Operation + } - override Type getDeclaredType(DeclarationPosition dpos, TypePath path) { - dpos.isSelf() and - // no case for variants as those can only be destructured using pattern matching - exists(Struct s | this.getAstNode() = [s.getStructField(_).(AstNode), s.getTupleField(_)] | - result = TDataType(s) and - path.isEmpty() - or - result = TTypeParamTypeParameter(s.getGenericParamList().getATypeParam()) and - path = TypePath::singleton(result) - ) - or - dpos.isField() and - result = this.getTypeRepr().(TypeMention).getTypeAt(path) + pragma[nomagic] + override Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { + result = + this.(MethodCallExpr) + .getGenericArgList() + .getTypeArg(apos.asMethodTypeArgumentPosition()) + .(TypeMention) + .getTypeAt(path) + or + result = getCallExprTypeArgument(this, apos, path) } - override string toString() { result = this.getAstNode().toString() } - - override Location getLocation() { result = this.getAstNode().getLocation() } - } - - private class StructFieldDecl extends StructOrTupleFieldDecl, TStructFieldDecl { - private StructField sf; - - StructFieldDecl() { this = TStructFieldDecl(sf) } + override AstNode getNodeAt(FunctionPosition pos) { + result = AssocFunctionResolution::AssocFunctionCall.super.getNodeAt(pos) + } - override AstNode getAstNode() { result = sf } + pragma[nomagic] + private Type getInferredSelfType(FunctionPosition pos, string derefChainBorrow, TypePath path) { + exists(DerefChain derefChain, BorrowKind borrow | + result = super.getSelfTypeAt(pos, derefChain, borrow, path) and + derefChainBorrow = encodeDerefChainBorrow(derefChain, borrow) and + super.hasReceiverAtPos(pos) + ) + } - override TypeRepr getTypeRepr() { result = sf.getTypeRepr() } - } + pragma[nomagic] + private Type getInferredNonSelfType(FunctionPosition pos, TypePath path) { + if + // index expression `x[i]` desugars to `*x.index(i)`, so we must account for + // the implicit deref + pos.isReturn() and + this instanceof IndexExpr + then + path.isEmpty() and + result instanceof RefType + or + exists(TypePath suffix | + result = super.getTypeAt(pos, suffix) and + path = TypePath::cons(getRefTypeParameter(_), suffix) + ) + else ( + not super.hasReceiverAtPos(pos) and + result = super.getTypeAt(pos, path) + ) + } - private class TupleFieldDecl extends StructOrTupleFieldDecl, TTupleFieldDecl { - private TupleField tf; + bindingset[derefChainBorrow] + override Type getInferredType(string derefChainBorrow, FunctionPosition pos, TypePath path) { + result = this.getInferredSelfType(pos, derefChainBorrow, path) + or + result = this.getInferredNonSelfType(pos, path) + } - TupleFieldDecl() { this = TTupleFieldDecl(tf) } + private AssocFunctionDeclaration getTarget(ImplOrTraitItemNode i, string derefChainBorrow) { + exists(DerefChain derefChain, BorrowKind borrow | + derefChainBorrow = encodeDerefChainBorrow(derefChain, borrow) and + result = super.resolveCallTarget(i, _, derefChain, borrow) // mutual recursion; resolving method calls requires resolving types and vice versa + ) + } - override AstNode getAstNode() { result = tf } + override Declaration getTarget(string derefChainBorrow) { + exists(ImplOrTraitItemNode i | result.isAssocFunction(i, this.getTarget(i, derefChainBorrow))) + } - override TypeRepr getTypeRepr() { result = tf.getTypeRepr() } + pragma[nomagic] + override predicate hasUnknownTypeAt(string derefChainBorrow, FunctionPosition pos, TypePath path) { + exists(ImplOrTraitItemNode i | + this.hasUnknownTypeAt(i, this.getTarget(i, derefChainBorrow), pos, path) + ) + or + derefChainBorrow = noDerefChainBorrow() and + forex(ImplOrTraitItemNode i, Function f | + f = CallExprImpl::getResolvedFunction(this) and + f = i.getAnAssocItem() + | + this.hasUnknownTypeAt(i, f, pos, path) + ) + } } - class AccessPosition = DeclarationPosition; + private class NonAssocFunctionCallAccess extends Access instanceof NonAssocCallExpr, + CallExprImpl::CallExprCall + { + pragma[nomagic] + override Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { + result = NonAssocCallExpr.super.getTypeArgument(apos, path) + } - class Access extends FieldExpr { - Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { none() } + override AstNode getNodeAt(FunctionPosition pos) { + result = NonAssocCallExpr.super.getNodeAt(pos) + } - AstNode getNodeAt(AccessPosition apos) { - result = this.getContainer() and - apos.isSelf() - or - result = this and - apos.isField() + pragma[nomagic] + private Type getInferredType(FunctionPosition pos, TypePath path) { + result = super.getInferredType(pos, path) } - Type getInferredType(AccessPosition apos, TypePath path) { - exists(TypePath path0 | result = inferType(this.getNodeAt(apos), path0) | - if apos.isSelf() - then - // adjust for implicit deref - path0.isCons(getRefTypeParameter(_), path) - or - not path0.isCons(getRefTypeParameter(_), _) and - not (result instanceof RefType and path0.isEmpty()) and - path = path0 - else path = path0 - ) + bindingset[derefChainBorrow] + override Type getInferredType(string derefChainBorrow, FunctionPosition pos, TypePath path) { + exists(derefChainBorrow) and + result = this.getInferredType(pos, path) } - Declaration getTarget() { - // mutual recursion; resolving fields requires resolving types and vice versa + pragma[nomagic] + private Declaration getTarget() { result = - [ - TStructFieldDecl(resolveStructFieldExpr(this, _)).(TDeclaration), - TTupleFieldDecl(resolveTupleFieldExpr(this, _)) - ] + TFunctionDeclaration(ImplOrTraitItemNodeOption::none_(), + super.resolveCallTargetViaPathResolution()) } - } - predicate accessDeclarationPositionMatch(AccessPosition apos, DeclarationPosition dpos) { - apos = dpos + override Declaration getTarget(string derefChainBorrow) { + result = this.getTarget() and + derefChainBorrow = noDerefChainBorrow() + } + + pragma[nomagic] + override predicate hasUnknownTypeAt(string derefChainBorrow, FunctionPosition pos, TypePath path) { + derefChainBorrow = noDerefChainBorrow() and + exists(FunctionDeclaration f, TypeParameter tp | + f = super.resolveCallTargetViaPathResolution() and + pos.isReturn() and + tp = f.getReturnType(_, path) and + not tp = f.getParameterType(_, _, _) and + // check that no explicit type arguments have been supplied for `tp` + not exists(TypeArgumentPosition tapos | + this.hasTypeArgument(tapos) and + TTypeParamTypeParameter(tapos.asTypeParam()) = tp + ) + ) + } } } -private module FieldExprMatching = Matching; +private module FunctionCallMatching = MatchingWithEnvironment; -/** - * Gets the type of `n` at `path`, where `n` is either a field expression or - * the receiver of field expression call. - */ pragma[nomagic] -private Type inferFieldExprType(AstNode n, TypePath path) { - exists( - FieldExprMatchingInput::Access a, FieldExprMatchingInput::AccessPosition apos, TypePath path0 - | - n = a.getNodeAt(apos) and - result = FieldExprMatching::inferAccessType(a, apos, path0) +private Type inferFunctionCallType0( + FunctionCallMatchingInput::Access call, FunctionPosition pos, AstNode n, DerefChain derefChain, + BorrowKind borrow, TypePath path +) { + exists(TypePath path0 | + n = call.getNodeAt(pos) and + exists(string derefChainBorrow | + FunctionCallMatchingInput::decodeDerefChainBorrow(derefChainBorrow, derefChain, borrow) + | + result = FunctionCallMatching::inferAccessType(call, derefChainBorrow, pos, path0) + or + call.hasUnknownTypeAt(derefChainBorrow, pos, path0) and + result = TUnknownType() + ) | - if apos.isSelf() - then - exists(Type receiverType | receiverType = inferType(n) | - if receiverType instanceof RefType - then - // adjust for implicit deref - not path0.isCons(getRefTypeParameter(_), _) and - not (path0.isEmpty() and result instanceof RefType) and - path = TypePath::cons(getRefTypeParameter(_), path0) - else path = path0 - ) + if + // index expression `x[i]` desugars to `*x.index(i)`, so we must account for + // the implicit deref + pos.isReturn() and + call instanceof IndexExpr + then path0.isCons(getRefTypeParameter(_), path) else path = path0 ) } -/** Gets the root type of the reference expression `ref`. */ pragma[nomagic] -private Type inferRefExprType(RefExpr ref) { - if ref.isRaw() - then - ref.isMut() and result instanceof PtrMutType - or - ref.isConst() and result instanceof PtrConstType - else - if ref.isMut() - then result instanceof RefMutType - else result instanceof RefSharedType +private Type inferFunctionCallTypeNonSelf(AstNode n, FunctionPosition pos, TypePath path) { + exists(FunctionCallMatchingInput::Access call | + result = inferFunctionCallType0(call, pos, n, _, _, path) and + not call.(AssocFunctionResolution::AssocFunctionCall).hasReceiverAtPos(pos) + ) } -/** Gets the root type of the reference node `ref`. */ +/** + * Gets the type of `n` at `path` after applying `derefChain`, where `n` is the + * `self` argument of a method call. + * + * The predicate recursively pops the head of `derefChain` until it becomes + * empty, at which point the inferred type can be applied back to `n`. + */ pragma[nomagic] -private Type inferRefPatType(AstNode ref) { - exists(boolean isMut | - ref = - any(IdentPat ip | - ip.isRef() and - if ip.isMut() then isMut = true else isMut = false - ).getName() - or - ref = any(RefPat rp | if rp.isMut() then isMut = true else isMut = false) +private Type inferFunctionCallTypeSelf( + FunctionCallMatchingInput::Access call, AstNode n, DerefChain derefChain, TypePath path +) { + exists(FunctionPosition pos, BorrowKind borrow, TypePath path0 | + call.(AssocFunctionResolution::AssocFunctionCall).hasReceiverAtPos(pos) and + result = inferFunctionCallType0(call, pos, n, derefChain, borrow, path0) | - result = getRefType(isMut) + borrow.isNoBorrow() and + path = path0 + or + // adjust for implicit borrow + exists(TypePath prefix | + prefix = TypePath::singleton(borrow.getRefType().getPositionalTypeParameter(0)) and + path0 = prefix.appendInverse(path) + ) ) -} - -pragma[nomagic] -private Type inferTryExprType(TryExpr te, TypePath path) { - exists(TypeParam tp, TypePath path0 | - result = inferType(te.getExpr(), path0) and - path0.isCons(TTypeParamTypeParameter(tp), path) + or + // adjust for implicit deref + exists( + DerefChain derefChain0, Type t0, TypePath path0, DerefImplItemNode impl, Type selfParamType, + TypePath selfPath + | + t0 = inferFunctionCallTypeSelf(call, n, derefChain0, path0) and + derefChain0.isCons(impl, derefChain) and + selfParamType = impl.resolveSelfTypeAt(selfPath) | - tp = any(ResultEnum r).getGenericParamList().getGenericParam(0) + result = selfParamType and + path = selfPath and + not result instanceof TypeParameter or - tp = any(OptionEnum o).getGenericParamList().getGenericParam(0) + exists(TypePath pathToTypeParam, TypePath suffix | + impl.targetHasTypeParameterAt(pathToTypeParam, selfParamType) and + path0 = pathToTypeParam.appendInverse(suffix) and + result = t0 and + path = selfPath.append(suffix) + ) ) } -pragma[nomagic] -private StructType getStrStruct() { result = TDataType(any(Builtins::Str s)) } - -pragma[nomagic] -private Type inferLiteralType(LiteralExpr le, TypePath path, boolean certain) { - path.isEmpty() and - exists(Builtins::BuiltinType t | result = TDataType(t) | - le instanceof CharLiteralExpr and - t instanceof Builtins::Char and - certain = true - or - le = - any(NumberLiteralExpr ne | - t.getName() = ne.getSuffix() and - certain = true - or - // When a number literal has no suffix, the type may depend on the context. - // For simplicity, we assume either `i32` or `f64`. - not exists(ne.getSuffix()) and - certain = false and - ( - ne instanceof IntegerLiteralExpr and - t instanceof Builtins::I32 - or - ne instanceof FloatLiteralExpr and - t instanceof Builtins::F64 - ) - ) - or - le instanceof BooleanLiteralExpr and - t instanceof Builtins::Bool and - certain = true +private Type inferFunctionCallTypePreCheck( + AstNode n, ContextTyping::FunctionPositionKind kind, TypePath path +) { + exists(FunctionPosition pos | + result = inferFunctionCallTypeNonSelf(n, pos, path) and + if pos.isPosition() + then kind = ContextTyping::PositionalKind() + else kind = ContextTyping::ReturnKind() ) or - le instanceof StringLiteralExpr and - ( - path.isEmpty() and result instanceof RefSharedType - or - path = TypePath::singleton(getRefTypeParameter(false)) and - result = getStrStruct() - ) and - certain = true + exists(FunctionCallMatchingInput::Access a | + result = inferFunctionCallTypeSelf(a, n, DerefChain::nil(), path) and + if a.(AssocFunctionResolution::AssocFunctionCall).hasReceiver() + then kind = ContextTyping::SelfKind() + else kind = ContextTyping::PositionalKind() + ) } -pragma[nomagic] -private DynTraitType getFutureTraitType() { result.getTrait() instanceof FutureTrait } +/** + * Gets the type of `n` at `path`, where `n` is either a function call or an + * argument/receiver of a function call. + */ +private predicate inferFunctionCallType = + ContextTyping::CheckContextTyping::check/2; -pragma[nomagic] -private AssociatedTypeTypeParameter getFutureOutputTypeParameter() { - result = getAssociatedTypeTypeParameter(any(FutureTrait ft).getOutputType()) -} +abstract private class Constructor extends Addressable { + final TypeParameter getTypeParameter(TypeParameterPosition ppos) { + typeParamMatchPosition(this.getTypeItem().getGenericParamList().getATypeParam(), result, ppos) + } -pragma[nomagic] -private DynTraitTypeParameter getDynFutureOutputTypeParameter() { - result.getTraitTypeParameter() = getFutureOutputTypeParameter() -} + abstract TypeItem getTypeItem(); -pragma[nomagic] -predicate isUnitBlockExpr(BlockExpr be) { - not be.getStmtList().hasTailExpr() and - not be = any(Callable c).getBody() and - not be.hasLabel() -} + abstract TypeRepr getParameterTypeRepr(int pos); -pragma[nomagic] -private Type inferBlockExprType(BlockExpr be, TypePath path) { - // `typeEquality` handles the non-root case - if be instanceof AsyncBlockExpr - then ( - path.isEmpty() and - result = getFutureTraitType() + Type getReturnType(TypePath path) { + result = TDataType(this.getTypeItem()) and + path.isEmpty() or - isUnitBlockExpr(be) and - path = TypePath::singleton(getDynFutureOutputTypeParameter()) and - result instanceof UnitType - ) else ( - isUnitBlockExpr(be) and - path.isEmpty() and - result instanceof UnitType - ) -} - -pragma[nomagic] -private predicate exprHasUnitType(Expr e) { - e = any(IfExpr ie | not ie.hasElse()) - or - e instanceof WhileExpr - or - e instanceof ForExpr -} + result = TTypeParamTypeParameter(this.getTypeItem().getGenericParamList().getATypeParam()) and + path = TypePath::singleton(result) + } -final private class AwaitTarget extends Expr { - AwaitTarget() { this = any(AwaitExpr ae).getExpr() } + Type getDeclaredType(FunctionPosition pos, TypePath path) { + result = this.getParameterType(pos.asPosition(), path) + or + pos.isReturn() and + result = this.getReturnType(path) + } - Type getTypeAt(TypePath path) { result = inferType(this, path) } + Type getParameterType(int pos, TypePath path) { + result = this.getParameterTypeRepr(pos).(TypeMention).getTypeAt(path) + } } -private module AwaitSatisfiesTypeInput implements SatisfiesTypeInputSig { - pragma[nomagic] - predicate relevantConstraint(AwaitTarget term, Type constraint) { - exists(term) and - constraint.(TraitType).getTrait() instanceof FutureTrait +private class StructConstructor extends Constructor instanceof Struct { + override TypeItem getTypeItem() { result = this } + + override TypeRepr getParameterTypeRepr(int i) { + result = [super.getTupleField(i).getTypeRepr(), super.getNthStructField(i).getTypeRepr()] } } -private module AwaitSatisfiesType = SatisfiesType; +private class VariantConstructor extends Constructor instanceof Variant { + override TypeItem getTypeItem() { result = super.getEnum() } -pragma[nomagic] -private Type inferAwaitExprType(AstNode n, TypePath path) { - exists(TypePath exprPath | - AwaitSatisfiesType::satisfiesConstraint(n.(AwaitExpr).getExpr(), _, exprPath, result) and - exprPath.isCons(getFutureOutputTypeParameter(), path) - ) + override TypeRepr getParameterTypeRepr(int i) { + result = [super.getTupleField(i).getTypeRepr(), super.getNthStructField(i).getTypeRepr()] + } } /** - * Gets the root type of the array expression `ae`. - */ -pragma[nomagic] -private Type inferArrayExprType(ArrayExpr ae) { exists(ae) and result instanceof ArrayType } - -/** - * Gets the root type of the range expression `re`. + * A matching configuration for resolving types of constructions of enums and + * structs, such as `Result::Ok(42)`, `Foo { bar: 1 }` and `None`. */ -pragma[nomagic] -private Type inferRangeExprType(RangeExpr re) { result = TDataType(getRangeType(re)) } +private module ConstructionMatchingInput implements MatchingInputSig { + import FunctionPositionMatchingInput -pragma[nomagic] -private Type getInferredDerefType(DerefExpr de, TypePath path) { result = inferType(de, path) } + class Declaration = Constructor; -pragma[nomagic] -private PtrType getInferredDerefExprPtrType(DerefExpr de) { result = inferType(de.getExpr()) } + abstract class Access extends AstNode { + abstract Type getInferredType(FunctionPosition pos, TypePath path); -/** - * Gets the inferred type of `n` at `path` when `n` occurs in a dereference - * expression `*n` and when `n` is known to have a raw pointer type. - * - * The other direction is handled in `typeEqualityAsymmetric`. - */ -private Type inferDereferencedExprPtrType(AstNode n, TypePath path) { - exists(DerefExpr de, PtrType type, TypePath suffix | - de.getExpr() = n and - type = getInferredDerefExprPtrType(de) and - result = getInferredDerefType(de, suffix) and - path = TypePath::cons(type.getPositionalTypeParameter(0), suffix) - ) -} + abstract Declaration getTarget(); -/** - * A matching configuration for resolving types of deconstruction patterns like - * `let Foo { bar } = ...` or `let Some(x) = ...`. - */ -private module DeconstructionPatMatchingInput implements MatchingInputSig { - import FunctionPositionMatchingInput + abstract AstNode getNodeAt(AccessPosition apos); - class Declaration = ConstructionMatchingInput::Declaration; + abstract Type getTypeArgument(TypeArgumentPosition apos, TypePath path); - class Access extends Pat instanceof PathAstNode { - Access() { this instanceof TupleStructPat or this instanceof StructPat } + /** + * Holds if the return type of this construction expression at `path` may + * have to be inferred from the context. For example in `Result::Ok(42)` the + * error type has to be inferred from the context. + */ + pragma[nomagic] + predicate hasUnknownTypeAt(FunctionPosition pos, TypePath path) { + exists(Declaration d, TypeParameter tp | + d = this.getTarget() and + pos.isReturn() and + tp = d.getReturnType(path) and + not exists(FunctionPosition pos2 | not pos2.isReturn() and tp = d.getDeclaredType(pos2, _)) and + // check that no explicit type arguments have been supplied for `tp` + not exists(TypeArgumentPosition tapos | + exists(this.getTypeArgument(tapos, _)) and + TTypeParamTypeParameter(tapos.asTypeParam()) = tp + ) + ) + } + } - Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { none() } + private class NonAssocCallAccess extends Access, NonAssocCallExpr, + ContextTyping::ContextTypedCallCand + { + NonAssocCallAccess() { + this instanceof CallExprImpl::TupleStructExpr or + this instanceof CallExprImpl::TupleVariantExpr + } - AstNode getNodeAt(AccessPosition apos) { - this = - any(StructPat sp | - result = - sp.getPatField(pragma[only_bind_into](sp.getNthStructField(apos.asPosition()) - .getName() - .getText())).getPat() - ) - or - result = this.(TupleStructPat).getField(apos.asPosition()) - or - result = this and - apos.isReturn() + override Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { + result = NonAssocCallExpr.super.getTypeArgument(apos, path) } - Type getInferredType(AccessPosition apos, TypePath path) { - result = inferType(this.getNodeAt(apos), path) - or - // The struct/enum type is supplied explicitly as a type qualifier, e.g. - // `let Foo::::Variant { ... } = ...` or - // `let Option::::Some(x) = ...`. - apos.isReturn() and - result = super.getPath().(TypeMention).getTypeAt(path) + override AstNode getNodeAt(AccessPosition apos) { + result = NonAssocCallExpr.super.getNodeAt(apos) } - Declaration getTarget() { result = resolvePath(super.getPath()) } + override Type getInferredType(FunctionPosition pos, TypePath path) { + result = NonAssocCallExpr.super.getInferredType(pos, path) + } + + override Declaration getTarget() { result = this.resolveCallTargetViaPathResolution() } } -} -private module DeconstructionPatMatching = Matching; + abstract private class StructAccess extends Access instanceof PathAstNode { + pragma[nomagic] + override Type getInferredType(AccessPosition apos, TypePath path) { + result = inferType(this.getNodeAt(apos), path) + } -/** - * Gets the type of `n` at `path`, where `n` is a pattern for a constructor, - * either a struct pattern or a tuple-struct pattern. - */ -pragma[nomagic] -private Type inferDeconstructionPatType(AstNode n, TypePath path) { - exists(DeconstructionPatMatchingInput::Access a, FunctionPosition apos | - n = a.getNodeAt(apos) and - result = DeconstructionPatMatching::inferAccessType(a, apos, path) - ) -} + pragma[nomagic] + override Declaration getTarget() { result = resolvePath(super.getPath()) } -final private class ForIterableExpr extends Expr { - ForIterableExpr() { this = any(ForExpr fe).getIterable() } + pragma[nomagic] + override Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { + // Handle constructions that use `Self {...}` syntax + exists(TypeMention tm, TypePath path0 | + tm = super.getPath() and + result = tm.getTypeAt(path0) and + path0.isCons(TTypeParamTypeParameter(apos.asTypeParam()), path) + ) + } + } - Type getTypeAt(TypePath path) { result = inferType(this, path) } -} + private class StructExprAccess extends StructAccess, StructExpr { + override Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { + result = super.getTypeArgument(apos, path) + or + exists(TypePath suffix | + suffix.isCons(TTypeParamTypeParameter(apos.asTypeParam()), path) and + result = CertainTypeInference::inferCertainType(this, suffix) + ) + } -private module ForIterableSatisfiesTypeInput implements SatisfiesTypeInputSig { - predicate relevantConstraint(ForIterableExpr term, Type constraint) { - exists(term) and - exists(Trait t | t = constraint.(TraitType).getTrait() | - // TODO: Remove the line below once we can handle the `impl IntoIterator for I` implementation - t instanceof IteratorTrait or - t instanceof IntoIteratorTrait - ) + override AstNode getNodeAt(AccessPosition apos) { + result = + this.getFieldExpr(pragma[only_bind_into](this.getNthStructField(apos.asPosition()) + .getName() + .getText())).getExpr() + or + result = this and apos.isReturn() + } } -} -pragma[nomagic] -private AssociatedTypeTypeParameter getIteratorItemTypeParameter() { - result = getAssociatedTypeTypeParameter(any(IteratorTrait t).getItemType()) -} + /** A potential nullary struct/variant construction such as `None`. */ + private class PathExprAccess extends StructAccess, PathExpr { + PathExprAccess() { not exists(CallExpr ce | this = ce.getFunction()) } -pragma[nomagic] -private AssociatedTypeTypeParameter getIntoIteratorItemTypeParameter() { - result = getAssociatedTypeTypeParameter(any(IntoIteratorTrait t).getItemType()) + override AstNode getNodeAt(AccessPosition apos) { result = this and apos.isReturn() } + } } -private module ForIterableSatisfiesType = - SatisfiesType; +private module ConstructionMatching = Matching; pragma[nomagic] -private Type inferForLoopExprType(AstNode n, TypePath path) { - // type of iterable -> type of pattern (loop variable) - exists(ForExpr fe, TypePath exprPath, AssociatedTypeTypeParameter tp | - n = fe.getPat() and - ForIterableSatisfiesType::satisfiesConstraint(fe.getIterable(), _, exprPath, result) and - exprPath.isCons(tp, path) +private Type inferConstructionTypePreCheck( + AstNode n, ContextTyping::FunctionPositionKind kind, TypePath path +) { + exists(ConstructionMatchingInput::Access a, FunctionPosition pos | + n = a.getNodeAt(pos) and + if pos.isPosition() + then kind = ContextTyping::PositionalKind() + else kind = ContextTyping::ReturnKind() | - tp = getIntoIteratorItemTypeParameter() + result = ConstructionMatching::inferAccessType(a, pos, path) or - // TODO: Remove once we can handle the `impl IntoIterator for I` implementation - tp = getIteratorItemTypeParameter() and - inferType(fe.getIterable()) != getArrayTypeParameter() + a.hasUnknownTypeAt(pos, path) and + result = TUnknownType() ) } -pragma[nomagic] -private Type inferClosureExprType(AstNode n, TypePath path) { - exists(ClosureExpr ce | - n = ce and - ( - path = TypePath::singleton(TDynTraitTypeParameter(_, any(FnTrait t).getTypeParam())) and - result.(TupleType).getArity() = ce.getNumberOfParams() +private predicate inferConstructionType = + ContextTyping::CheckContextTyping::check/2; + +/** + * A matching configuration for resolving types of operations like `a + b`. + */ +private module OperationMatchingInput implements MatchingInputSig { + private import codeql.rust.elements.internal.OperationImpl::Impl as OperationImpl + import FunctionPositionMatchingInput + + class Declaration extends FunctionCallMatchingInput::Declaration { + private Method getSelfOrImpl() { + result = f or - exists(TypePath path0 | - result = ce.getRetType().getTypeRepr().(TypeMention).getTypeAt(path0) and - path = closureReturnPath().append(path0) - ) - ) - or - exists(Param p | - p = ce.getAParam() and - not p.hasTypeRepr() and - n = p.getPat() and - result = TUnknownType() and - path.isEmpty() - ) - ) -} + f.implements(result) + } -pragma[nomagic] -private TupleType inferArgList(ArgList args, TypePath path) { - exists(CallExprImpl::DynamicCallExpr dce | - args = dce.getArgList() and - result.getArity() = dce.getNumberOfSyntacticArguments() and - path.isEmpty() - ) -} + pragma[nomagic] + private predicate borrowsAt(FunctionPosition pos) { + exists(TraitItemNode t, string path, string method | + this.getSelfOrImpl() = t.getAssocItem(method) and + path = t.getCanonicalPath(_) and + exists(int borrows | OperationImpl::isOverloaded(_, _, path, method, borrows) | + pos.asPosition() = 0 and borrows >= 1 + or + pos.asPosition() = 1 and + borrows >= 2 + ) + ) + } -pragma[nomagic] -private Type inferCastExprType(CastExpr ce, TypePath path) { - result = ce.getTypeRepr().(TypeMention).getTypeAt(path) -} + pragma[nomagic] + private predicate derefsReturn() { this.getSelfOrImpl() = any(DerefTrait t).getDerefFunction() } -cached -private module Cached { - /** Holds if `n` is implicitly dereferenced and/or borrowed. */ - cached - predicate implicitDerefChainBorrow(Expr e, DerefChain derefChain, boolean borrow) { - exists(BorrowKind bk | - any(AssocFunctionResolution::AssocFunctionCall afc) - .argumentHasImplicitDerefChainBorrow(e, derefChain, bk) and - if bk.isNoBorrow() then borrow = false else borrow = true - ) - or - e = - any(FieldExpr fe | - exists(resolveStructFieldExpr(fe, derefChain)) - or - exists(resolveTupleFieldExpr(fe, derefChain)) - ).getContainer() and - not derefChain.isEmpty() and - borrow = false + Type getDeclaredType(FunctionPosition pos, TypePath path) { + exists(TypePath path0 | + result = super.getDeclaredType(pos, path0) and + if + this.borrowsAt(pos) + or + pos.isReturn() and this.derefsReturn() + then path0.isCons(getRefTypeParameter(_), path) + else path0 = path + ) + } } - /** - * Gets an item (function or tuple struct/variant) that `call` resolves to, if - * any. - * - * The parameter `dispatch` is `true` if and only if the resolved target is a - * trait item because a precise target could not be determined from the - * types (for instance in the presence of generics or `dyn` types) - */ - cached - Addressable resolveCallTarget(InvocationExpr call, boolean dispatch) { - dispatch = false and - result = call.(NonAssocCallExpr).resolveCallTargetViaPathResolution() - or - exists(ImplOrTraitItemNode i | - i instanceof TraitItemNode and dispatch = true - or - i instanceof ImplItemNode and dispatch = false - | - result = call.(AssocFunctionResolution::AssocFunctionCall).resolveCallTarget(i, _, _, _) and - not call instanceof CallExprImpl::DynamicCallExpr and - not i instanceof Builtins::BuiltinImpl - ) - } + class Access extends AssocFunctionResolution::OperationAssocFunctionCall { + Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { none() } - /** - * Gets the struct field that the field expression `fe` resolves to, if any. - */ - cached - StructField resolveStructFieldExpr(FieldExpr fe, DerefChain derefChain) { - exists(string name, DataType ty | - ty = getFieldExprLookupType(fe, pragma[only_bind_into](name), derefChain) - | - result = ty.(StructType).getTypeItem().getStructField(pragma[only_bind_into](name)) or - result = ty.(UnionType).getTypeItem().getStructField(pragma[only_bind_into](name)) - ) - } + pragma[nomagic] + Type getInferredType(FunctionPosition pos, TypePath path) { + result = inferType(this.getNodeAt(pos), path) + } - /** - * Gets the tuple field that the field expression `fe` resolves to, if any. - */ - cached - TupleField resolveTupleFieldExpr(FieldExpr fe, DerefChain derefChain) { - exists(int i | - result = - getTupleFieldExprLookupType(fe, pragma[only_bind_into](i), derefChain) - .(StructType) - .getTypeItem() - .getTupleField(pragma[only_bind_into](i)) - ) + Declaration getTarget() { + exists(ImplOrTraitItemNode i | + result.isAssocFunction(i, this.resolveCallTarget(i, _, _, _)) // mutual recursion + ) + } } +} - /** - * Gets a type at `path` that `n` infers to, if any. - * - * The type inference implementation works by computing all possible types, so - * the result is not necessarily unique. For example, in - * - * ```rust - * trait MyTrait { - * fn foo(&self) -> &Self; - * - * fn bar(&self) -> &Self { - * self.foo() - * } - * } - * - * struct MyStruct; - * - * impl MyTrait for MyStruct { - * fn foo(&self) -> &MyStruct { - * self - * } - * } - * - * fn baz() { - * let x = MyStruct; - * x.bar(); - * } - * ``` - * - * the type inference engine will roughly make the following deductions: - * - * 1. `MyStruct` has type `MyStruct`. - * 2. `x` has type `MyStruct` (via 1.). - * 3. The return type of `bar` is `&Self`. - * 3. `x.bar()` has type `&MyStruct` (via 2 and 3, by matching the implicit `Self` - * type parameter with `MyStruct`.). - * 4. The return type of `bar` is `&MyTrait`. - * 5. `x.bar()` has type `&MyTrait` (via 2 and 4). - */ - cached - Type inferType(AstNode n, TypePath path) { - Stages::TypeInferenceStage::ref() and - result = CertainTypeInference::inferCertainType(n, path) - or - // Don't propagate type information into a node which conflicts with certain - // type information. - forall(TypePath prefix | - CertainTypeInference::hasInferredCertainType(n, prefix) and - prefix.isPrefixOf(path) - | - not CertainTypeInference::certainTypeConflict(n, prefix, path, result) - ) and - ( - result = inferAssignmentOperationType(n, path) - or - result = inferTypeEquality(n, path) - or - result = inferFunctionCallType(n, path) - or - result = inferConstructionType(n, path) - or - result = inferOperationType(n, path) - or - result = inferFieldExprType(n, path) - or - result = inferTryExprType(n, path) - or - result = inferLiteralType(n, path, false) - or - result = inferAwaitExprType(n, path) - or - result = inferDereferencedExprPtrType(n, path) - or - result = inferForLoopExprType(n, path) - or - result = inferClosureExprType(n, path) - or - result = inferArgList(n, path) - or - result = inferDeconstructionPatType(n, path) - or - result = inferUnknownTypeFromAnnotation(n, path) - ) - } +private module OperationMatching = Matching; + +pragma[nomagic] +private Type inferOperationTypePreCheck( + AstNode n, ContextTyping::FunctionPositionKind kind, TypePath path +) { + exists(OperationMatchingInput::Access a, FunctionPosition pos | + n = a.getNodeAt(pos) and + result = OperationMatching::inferAccessType(a, pos, path) and + if pos.asPosition() = 0 + then kind = ContextTyping::SelfKind() + else + if pos.isPosition() + then kind = ContextTyping::PositionalKind() + else kind = ContextTyping::ReturnKind() + ) } -import Cached +private predicate inferOperationType = + ContextTyping::CheckContextTyping::check/2; /** - * Gets a type that `n` infers to, if any. + * A matching configuration for resolving types of field expressions like `x.field`. */ -Type inferType(AstNode n) { result = inferType(n, TypePath::nil()) } +private module FieldExprMatchingInput implements MatchingInputSig { + private newtype TDeclarationPosition = + TSelfDeclarationPosition() or + TFieldPos() -/** Provides predicates for debugging the type inference implementation. */ -private module Debug { - Locatable getRelevantLocatable() { - exists(string filepath, int startline, int startcolumn, int endline, int endcolumn | - result.getLocation().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) and - filepath.matches("%/main.rs") and - startline = 103 - ) - } + class DeclarationPosition extends TDeclarationPosition { + predicate isSelf() { this = TSelfDeclarationPosition() } - Type debugInferType(AstNode n, TypePath path) { - n = getRelevantLocatable() and - result = inferType(n, path) - } + predicate isField() { this = TFieldPos() } - Addressable debugResolveCallTarget(InvocationExpr c, boolean dispatch) { - c = getRelevantLocatable() and - result = resolveCallTarget(c, dispatch) + string toString() { + this.isSelf() and + result = "self" + or + this.isField() and + result = "(field)" + } } - predicate debugConditionSatisfiesConstraint( - TypeAbstraction abs, TypeMention condition, TypeMention constraint, boolean transitive - ) { - abs = getRelevantLocatable() and - Input2::conditionSatisfiesConstraint(abs, condition, constraint, transitive) - } + private newtype TDeclaration = + TStructFieldDecl(StructField sf) or + TTupleFieldDecl(TupleField tf) - predicate debugInferShorthandSelfType(ShorthandSelfParameterMention self, TypePath path, Type t) { - self = getRelevantLocatable() and - t = self.getTypeAt(path) - } + abstract class Declaration extends TDeclaration { + TypeParameter getTypeParameter(TypeParameterPosition ppos) { none() } - predicate debugInferFunctionCallType(AstNode n, TypePath path, Type t) { - n = getRelevantLocatable() and - t = inferFunctionCallType(n, path) - } + abstract Type getDeclaredType(DeclarationPosition dpos, TypePath path); - predicate debugInferConstructionType(AstNode n, TypePath path, Type t) { - n = getRelevantLocatable() and - t = inferConstructionType(n, path) - } + abstract string toString(); - predicate debugTypeMention(TypeMention tm, TypePath path, Type type) { - tm = getRelevantLocatable() and - tm.getTypeAt(path) = type + abstract Location getLocation(); } - Type debugInferAnnotatedType(AstNode n, TypePath path) { - n = getRelevantLocatable() and - result = inferAnnotatedType(n, path) - } + abstract private class StructOrTupleFieldDecl extends Declaration { + abstract AstNode getAstNode(); - pragma[nomagic] - private int countTypesAtPath(AstNode n, TypePath path, Type t) { - t = inferType(n, path) and - result = strictcount(Type t0 | t0 = inferType(n, path)) - } + abstract TypeRepr getTypeRepr(); - pragma[nomagic] - private predicate atLimit(AstNode n) { - exists(TypePath path0 | exists(inferType(n, path0)) and path0.length() >= getTypePathLimit()) - } + override Type getDeclaredType(DeclarationPosition dpos, TypePath path) { + dpos.isSelf() and + // no case for variants as those can only be destructured using pattern matching + exists(Struct s | this.getAstNode() = [s.getStructField(_).(AstNode), s.getTupleField(_)] | + result = TDataType(s) and + path.isEmpty() + or + result = TTypeParamTypeParameter(s.getGenericParamList().getATypeParam()) and + path = TypePath::singleton(result) + ) + or + dpos.isField() and + result = this.getTypeRepr().(TypeMention).getTypeAt(path) + } - Type debugInferTypeForNodeAtLimit(AstNode n, TypePath path) { - result = inferType(n, path) and - atLimit(n) - } + override string toString() { result = this.getAstNode().toString() } - predicate countTypesForNodeAtLimit(AstNode n, int c) { - n = getRelevantLocatable() and - c = strictcount(Type t, TypePath path | t = debugInferTypeForNodeAtLimit(n, path)) + override Location getLocation() { result = this.getAstNode().getLocation() } } - predicate maxTypes(AstNode n, TypePath path, Type t, int c) { - c = countTypesAtPath(n, path, t) and - c = max(countTypesAtPath(_, _, _)) - } + private class StructFieldDecl extends StructOrTupleFieldDecl, TStructFieldDecl { + private StructField sf; - pragma[nomagic] - private predicate typePathLength(AstNode n, TypePath path, Type t, int len) { - t = inferType(n, path) and - len = path.length() - } + StructFieldDecl() { this = TStructFieldDecl(sf) } - predicate maxTypePath(AstNode n, TypePath path, Type t, int len) { - typePathLength(n, path, t, len) and - len = max(int i | typePathLength(_, _, _, i)) - } + override AstNode getAstNode() { result = sf } - pragma[nomagic] - private int countTypePaths(AstNode n, TypePath path, Type t) { - t = inferType(n, path) and - result = strictcount(TypePath path0, Type t0 | t0 = inferType(n, path0)) + override TypeRepr getTypeRepr() { result = sf.getTypeRepr() } } - predicate maxTypePaths(AstNode n, TypePath path, Type t, int c) { - c = countTypePaths(n, path, t) and - c = max(countTypePaths(_, _, _)) + private class TupleFieldDecl extends StructOrTupleFieldDecl, TTupleFieldDecl { + private TupleField tf; + + TupleFieldDecl() { this = TTupleFieldDecl(tf) } + + override AstNode getAstNode() { result = tf } + + override TypeRepr getTypeRepr() { result = tf.getTypeRepr() } } - Type debugInferCertainType(AstNode n, TypePath path) { - n = getRelevantLocatable() and - result = CertainTypeInference::inferCertainType(n, path) + class AccessPosition = DeclarationPosition; + + class Access extends FieldExpr { + Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { none() } + + AstNode getNodeAt(AccessPosition apos) { + result = this.getContainer() and + apos.isSelf() + or + result = this and + apos.isField() + } + + Type getInferredType(AccessPosition apos, TypePath path) { + exists(TypePath path0 | result = inferType(this.getNodeAt(apos), path0) | + if apos.isSelf() + then + // adjust for implicit deref + path0.isCons(getRefTypeParameter(_), path) + or + not path0.isCons(getRefTypeParameter(_), _) and + not (result instanceof RefType and path0.isEmpty()) and + path = path0 + else path = path0 + ) + } + + Declaration getTarget() { + // mutual recursion; resolving fields requires resolving types and vice versa + result = + [ + TStructFieldDecl(resolveStructFieldExpr(this, _)).(TDeclaration), + TTupleFieldDecl(resolveTupleFieldExpr(this, _)) + ] + } } - Type debugInferCertainNonUniqueType(AstNode n, TypePath path) { - n = getRelevantLocatable() and - Consistency::nonUniqueCertainType(n, path, result) + predicate accessDeclarationPositionMatch(AccessPosition apos, DeclarationPosition dpos) { + apos = dpos } } + +private module FieldExprMatching = Matching; + +/** + * Gets the type of `n` at `path`, where `n` is either a field expression or + * the receiver of field expression call. + */ +pragma[nomagic] +private Type inferFieldExprType(AstNode n, TypePath path) { + exists( + FieldExprMatchingInput::Access a, FieldExprMatchingInput::AccessPosition apos, TypePath path0 + | + n = a.getNodeAt(apos) and + result = FieldExprMatching::inferAccessType(a, apos, path0) + | + if apos.isSelf() + then + exists(Type receiverType | receiverType = inferType(n) | + if receiverType instanceof RefType + then + // adjust for implicit deref + not path0.isCons(getRefTypeParameter(_), _) and + not (path0.isEmpty() and result instanceof RefType) and + path = TypePath::cons(getRefTypeParameter(_), path0) + else path = path0 + ) + else path = path0 + ) +} + +/** + * Gets a type at `path` that `n` infers to, if any. + * + * The type inference implementation works by computing all possible types, so + * the result is not necessarily unique. For example, in + * + * ```rust + * trait MyTrait { + * fn foo(&self) -> &Self; + * + * fn bar(&self) -> &Self { + * self.foo() + * } + * } + * + * struct MyStruct; + * + * impl MyTrait for MyStruct { + * fn foo(&self) -> &MyStruct { + * self + * } + * } + * + * fn baz() { + * let x = MyStruct; + * x.bar(); + * } + * ``` + * + * the type inference engine will roughly make the following deductions: + * + * 1. `MyStruct` has type `MyStruct`. + * 2. `x` has type `MyStruct` (via 1.). + * 3. The return type of `bar` is `&Self`. + * 3. `x.bar()` has type `&MyStruct` (via 2 and 3, by matching the implicit `Self` + * type parameter with `MyStruct`.). + * 4. The return type of `bar` is `&MyTrait`. + * 5. `x.bar()` has type `&MyTrait` (via 2 and 4). + */ +cached +Type inferType(AstNode n, TypePath path) { + Stages::TypeInferenceStage::ref() and + result = CertainTypeInference::inferCertainType(n, path) + or + // Don't propagate type information into a node which conflicts with certain + // type information. + forall(TypePath prefix | + CertainTypeInference::hasInferredCertainType(n, prefix) and + prefix.isPrefixOf(path) + | + not CertainTypeInference::certainTypeConflict(n, prefix, path, result) + ) and + ( + result = inferAssignmentOperationType(n, path) + or + result = inferTypeEquality(n, path) + or + result = inferFunctionCallType(n, path) + or + result = inferConstructionType(n, path) + or + result = inferOperationType(n, path) + or + result = inferFieldExprType(n, path) + or + result = inferTryExprType(n, path) + or + result = inferLiteralType(n, path, false) + or + result = inferAwaitExprType(n, path) + or + result = inferDereferencedExprPtrType(n, path) + or + result = inferForLoopExprType(n, path) + or + result = inferClosureExprType(n, path) + or + result = inferArgList(n, path) + or + result = inferDeconstructionPatType(n, path) + or + result = inferUnknownTypeFromAnnotation(n, path) + ) +} + +/** + * Gets a type that `n` infers to, if any. + */ +Type inferType(AstNode n) { result = inferType(n, TypePath::nil()) } From cbd5e9611027a6b3761610a1f6defc6596ac3d14 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 6 Jul 2026 16:24:38 +0200 Subject: [PATCH 0962/2098] Rust: Remove type inference logic for subsequent cleaner diff (does not compile) --- .../internal/typeinference/TypeInference.qll | 1196 ----------------- 1 file changed, 1196 deletions(-) diff --git a/rust/ql/lib/codeql/rust/internal/typeinference/TypeInference.qll b/rust/ql/lib/codeql/rust/internal/typeinference/TypeInference.qll index 9ab33b314daf..8eb3eff2bc4e 100644 --- a/rust/ql/lib/codeql/rust/internal/typeinference/TypeInference.qll +++ b/rust/ql/lib/codeql/rust/internal/typeinference/TypeInference.qll @@ -2850,1199 +2850,3 @@ private module Debug { Consistency::nonUniqueCertainType(n, path, result) } } - -//////////// -// TEMPORARILY MOVED HERE -//////////// -/** - * Provides functionality related to context-based typing of calls. - */ -private module ContextTyping { - /** - * Holds if `f` mentions type parameter `tp` at some non-return position, - * possibly via a constraint on another mentioned type parameter. - */ - pragma[nomagic] - private predicate assocFunctionMentionsTypeParameterAtNonRetPos( - ImplOrTraitItemNode i, Function f, TypeParameter tp - ) { - exists(FunctionPosition nonRetPos | - not nonRetPos.isReturn() and - not nonRetPos.isTypeQualifier() and - tp = getAssocFunctionTypeAt(f, i, nonRetPos, _) - ) - or - exists(TypeParameter mid | - assocFunctionMentionsTypeParameterAtNonRetPos(i, f, mid) and - tp = getATypeParameterConstraint(mid).getTypeAt(_) - ) - } - - /** - * Holds if the return type of the function `f` inside `i` at `path` is type - * parameter `tp`, and `tp` does not appear in the type of any parameter of - * `f`. - * - * In this case, the context in which `f` is called may be needed to infer - * the instantiation of `tp`. - * - * This covers functions like `Default::default` and `Vec::new`. - */ - pragma[nomagic] - private predicate assocFunctionReturnContextTypedAt( - ImplOrTraitItemNode i, Function f, FunctionPosition pos, TypePath path, TypeParameter tp - ) { - pos.isReturn() and - tp = getAssocFunctionTypeAt(f, i, pos, path) and - not assocFunctionMentionsTypeParameterAtNonRetPos(i, f, tp) - } - - /** - * A call where the type of the result may have to be inferred from the - * context in which the call appears, for example a call like - * `Default::default()`. - */ - abstract class ContextTypedCallCand extends AstNode { - abstract Type getTypeArgument(TypeArgumentPosition apos, TypePath path); - - predicate hasTypeArgument(TypeArgumentPosition apos) { exists(this.getTypeArgument(apos, _)) } - - /** - * Holds if this call resolves to `target` inside `i`, and the return type - * at `pos` and `path` may have to be inferred from the context. - */ - bindingset[this, i, target] - predicate hasUnknownTypeAt( - ImplOrTraitItemNode i, Function target, FunctionPosition pos, TypePath path - ) { - exists(TypeParameter tp | - assocFunctionReturnContextTypedAt(i, target, pos, path, tp) and - // check that no explicit type arguments have been supplied for `tp` - not exists(TypeArgumentPosition tapos | this.hasTypeArgument(tapos) | - exists(int j | - j = tapos.asMethodTypeArgumentPosition() and - tp = TTypeParamTypeParameter(target.getGenericParamList().getTypeParam(j)) - ) - or - TTypeParamTypeParameter(tapos.asTypeParam()) = tp - ) and - not ( - tp instanceof TSelfTypeParameter and - exists(getCallExprTypeQualifier(this, _, _)) - ) - ) - } - } - - pragma[nomagic] - private predicate hasUnknownTypeAt(AstNode n, TypePath path) { - inferType(n, path) = TUnknownType() - } - - pragma[nomagic] - private predicate hasUnknownType(AstNode n) { hasUnknownTypeAt(n, _) } - - newtype FunctionPositionKind = - SelfKind() or - ReturnKind() or - PositionalKind() - - signature Type inferCallTypeSig(AstNode n, FunctionPositionKind kind, TypePath path); - - /** - * Given a predicate `inferCallType` for inferring the type of a call at a given - * position, this module exposes the predicate `check`, which wraps the input - * predicate and checks that types are only propagated into arguments when they - * are context-typed. - */ - module CheckContextTyping { - pragma[nomagic] - private Type inferCallNonReturnType( - AstNode n, FunctionPositionKind kind, TypePath prefix, TypePath path - ) { - result = inferCallType(n, kind, path) and - hasUnknownType(n) and - kind != ReturnKind() and - prefix = path.getAPrefix() - } - - pragma[nomagic] - Type check(AstNode n, TypePath path) { - result = inferCallType(n, ReturnKind(), path) - or - exists(FunctionPositionKind kind, TypePath prefix | - result = inferCallNonReturnType(n, kind, prefix, path) and - hasUnknownTypeAt(n, prefix) - | - // Never propagate type information directly into the receiver, since its type - // must already have been known in order to resolve the call - if kind = SelfKind() then not prefix.isEmpty() else any() - ) - } - } -} - -private predicate bodyReturns(Expr body, Expr e) { - exists(ReturnExpr re, Callable c | - e = re.getExpr() and - c = re.getEnclosingCallable() and - body = c.getBody() - ) -} - -/** - * Holds if the type tree of `n1` at `prefix1` should be equal to the type tree - * of `n2` at `prefix2` and type information should propagate in both directions - * through the type equality. - */ -private predicate typeEquality(AstNode n1, TypePath prefix1, AstNode n2, TypePath prefix2) { - CertainTypeInference::certainTypeEquality(n1, prefix1, n2, prefix2) - or - prefix1.isEmpty() and - prefix2.isEmpty() and - ( - exists(LetStmt let | - let.getPat() = n1 and - let.getInitializer() = n2 - ) - or - n2 = - any(MatchExpr me | - n1 = me.getAnArm().getExpr() and - me.getNumberOfArms() = 1 - ) - or - exists(LetExpr let | - n1 = let.getScrutinee() and - n2 = let.getPat() - ) - or - exists(MatchExpr me | - n1 = me.getScrutinee() and - n2 = me.getAnArm().getPat() - ) - or - n1 = n2.(OrPat).getAPat() - or - n1 = n2.(ParenPat).getPat() - or - n1 = n2.(LiteralPat).getLiteral() - or - exists(BreakExpr break | - break.getExpr() = n1 and - break.getTarget() = n2.(LoopExpr) - ) - or - exists(AssignmentExpr be | - n1 = be.getLhs() and - n2 = be.getRhs() - ) - or - n1 = n2.(MacroExpr).getMacroCall().getMacroCallExpansion() and - not isPanicMacroCall(n2) - or - n1 = n2.(MacroPat).getMacroCall().getMacroCallExpansion() - or - bodyReturns(n1, n2) and - strictcount(Expr e | bodyReturns(n1, e)) = 1 - ) - or - n2 = - any(RefExpr re | - n1 = re.getExpr() and - prefix1.isEmpty() and - prefix2 = TypePath::singleton(inferRefExprType(re).getPositionalTypeParameter(0)) - ) - or - n2 = - any(RefPat rp | - n1 = rp.getPat() and - prefix1.isEmpty() and - exists(boolean isMutable | if rp.isMut() then isMutable = true else isMutable = false | - prefix2 = TypePath::singleton(getRefTypeParameter(isMutable)) - ) - ) - or - exists(int i, int arity | - prefix1.isEmpty() and - prefix2 = TypePath::singleton(getTupleTypeParameter(arity, i)) - | - arity = n2.(TupleExpr).getNumberOfFields() and - n1 = n2.(TupleExpr).getField(i) - or - arity = n2.(TuplePat).getTupleArity() and - n1 = n2.(TuplePat).getField(i) - ) - or - exists(BlockExpr be | - n1 = be and - n2 = be.getStmtList().getTailExpr() and - if be.isAsync() - then - prefix1 = TypePath::singleton(getDynFutureOutputTypeParameter()) and - prefix2.isEmpty() - else ( - prefix1.isEmpty() and - prefix2.isEmpty() - ) - ) - or - // an array list expression with only one element (such as `[1]`) has type from that element - n1 = - any(ArrayListExpr ale | - ale.getAnExpr() = n2 and - ale.getNumberOfExprs() = 1 - ) and - prefix1 = TypePath::singleton(getArrayTypeParameter()) and - prefix2.isEmpty() - or - // an array repeat expression (`[1; 3]`) has the type of the repeat operand - n1.(ArrayRepeatExpr).getRepeatOperand() = n2 and - prefix1 = TypePath::singleton(getArrayTypeParameter()) and - prefix2.isEmpty() -} - -/** - * Holds if `child` is a child of `parent`, and the Rust compiler applies [least - * upper bound (LUB) coercion][1] to infer the type of `parent` from the type of - * `child`. - * - * In this case, we want type information to only flow from `child` to `parent`, - * to avoid (a) either having to model LUB coercions, or (b) risk combinatorial - * explosion in inferred types. - * - * [1]: https://doc.rust-lang.org/reference/type-coercions.html#r-coerce.least-upper-bound - */ -private predicate lubCoercion(AstNode parent, AstNode child, TypePath prefix) { - child = parent.(IfExpr).getABranch() and - prefix.isEmpty() - or - parent = - any(MatchExpr me | - child = me.getAnArm().getExpr() and - me.getNumberOfArms() > 1 - ) and - prefix.isEmpty() - or - parent = - any(ArrayListExpr ale | - child = ale.getAnExpr() and - ale.getNumberOfExprs() > 1 - ) and - prefix = TypePath::singleton(getArrayTypeParameter()) - or - bodyReturns(parent, child) and - strictcount(Expr e | bodyReturns(parent, e)) > 1 and - prefix.isEmpty() - or - parent = any(ClosureExpr ce | not ce.hasRetType() and ce.getClosureBody() = child) and - prefix = closureReturnPath() - or - exists(Struct s | - child = [parent.(RangeExpr).getStart(), parent.(RangeExpr).getEnd()] and - prefix = TypePath::singleton(TTypeParamTypeParameter(s.getGenericParamList().getATypeParam())) and - s = getRangeType(parent) - ) -} - -private Type inferUnknownTypeFromAnnotation(AstNode n, TypePath path) { - inferType(n, path) = TUnknownType() and - // Normally, these are coercion sites, but in case a type is unknown we - // allow for type information to flow from the type annotation. - exists(TypeMention tm | result = tm.getTypeAt(path) | - tm = any(LetStmt let | identLetStmt(let, _, n)).getTypeRepr() - or - tm = any(ClosureExpr ce | n = ce.getBody()).getRetType().getTypeRepr() - or - tm = getReturnTypeMention(any(Function f | n = f.getBody())) - ) -} - -/** - * Holds if the type tree of `n1` at `prefix1` should be equal to the type tree - * of `n2` at `prefix2`, but type information should only propagate from `n1` to - * `n2`. - */ -private predicate typeEqualityAsymmetric(AstNode n1, TypePath prefix1, AstNode n2, TypePath prefix2) { - lubCoercion(n2, n1, prefix2) and - prefix1.isEmpty() - or - exists(AstNode mid, TypePath prefixMid, TypePath suffix | - typeEquality(n1, prefixMid, mid, prefix2) or - typeEquality(mid, prefix2, n1, prefixMid) - | - lubCoercion(mid, n2, suffix) and - not lubCoercion(mid, n1, _) and - prefix1 = prefixMid.append(suffix) - ) - or - // When `n2` is `*n1` propagate type information from a raw pointer type - // parameter at `n1`. The other direction is handled in - // `inferDereferencedExprPtrType`. - n1 = n2.(DerefExpr).getExpr() and - prefix1 = TypePath::singleton(getPtrTypeParameter()) and - prefix2.isEmpty() -} - -pragma[nomagic] -private Type inferTypeEquality(AstNode n, TypePath path) { - exists(TypePath prefix1, AstNode n2, TypePath prefix2, TypePath suffix | - result = inferType(n2, prefix2.appendInverse(suffix)) and - path = prefix1.append(suffix) - | - typeEquality(n, prefix1, n2, prefix2) - or - typeEquality(n2, prefix2, n, prefix1) - or - typeEqualityAsymmetric(n2, prefix2, n, prefix1) - ) -} - -/** - * A matching configuration for resolving types of function call expressions - * like `foo.bar(baz)` and `Foo::bar(baz)`. - */ -private module FunctionCallMatchingInput implements MatchingWithEnvironmentInputSig { - import FunctionPositionMatchingInput - - private newtype TDeclaration = - TFunctionDeclaration(ImplOrTraitItemNodeOption i, FunctionDeclaration f) { f.isFor(i) } - - final class Declaration extends TFunctionDeclaration { - ImplOrTraitItemNodeOption i; - FunctionDeclaration f; - - Declaration() { this = TFunctionDeclaration(i, f) } - - FunctionDeclaration getFunction() { result = f } - - predicate isAssocFunction(ImplOrTraitItemNode i_, Function f_) { - i_ = i.asSome() and - f_ = f - } - - TypeParameter getTypeParameter(TypeParameterPosition ppos) { - result = f.getTypeParameter(i, ppos) - } - - Type getDeclaredType(FunctionPosition pos, TypePath path) { - result = f.getParameterType(i, pos, path) - or - pos.isReturn() and - result = f.getReturnType(i, path) - } - - string toString() { - i.isNone() and result = f.toString() - or - result = f.toStringExt(i.asSome()) - } - - Location getLocation() { result = f.getLocation() } - } - - pragma[nomagic] - private TypeMention getAdditionalTypeParameterConstraint(TypeParameter tp, Declaration decl) { - result = - tp.(TypeParamTypeParameter) - .getTypeParam() - .getAdditionalTypeBound(decl.getFunction(), _) - .getTypeRepr() - } - - bindingset[decl] - TypeMention getATypeParameterConstraint(TypeParameter tp, Declaration decl) { - result = Input2::getATypeParameterConstraint(tp) and - exists(decl) - or - result = getAdditionalTypeParameterConstraint(tp, decl) - } - - class AccessEnvironment = string; - - bindingset[derefChain, borrow] - private AccessEnvironment encodeDerefChainBorrow(DerefChain derefChain, BorrowKind borrow) { - result = derefChain + ";" + borrow - } - - bindingset[derefChainBorrow] - additional predicate decodeDerefChainBorrow( - string derefChainBorrow, DerefChain derefChain, BorrowKind borrow - ) { - exists(int i | - i = derefChainBorrow.indexOf(";") and - derefChain = derefChainBorrow.prefix(i) and - borrow.toString() = derefChainBorrow.suffix(i + 1) - ) - } - - private string noDerefChainBorrow() { - exists(DerefChain derefChain, BorrowKind borrow | - derefChain.isEmpty() and - borrow.isNoBorrow() and - result = encodeDerefChainBorrow(derefChain, borrow) - ) - } - - abstract class Access extends ContextTyping::ContextTypedCallCand { - abstract AstNode getNodeAt(FunctionPosition pos); - - bindingset[derefChainBorrow] - abstract Type getInferredType(string derefChainBorrow, FunctionPosition pos, TypePath path); - - abstract Declaration getTarget(string derefChainBorrow); - - /** - * Holds if the return type of this call at `path` may have to be inferred - * from the context. - */ - abstract predicate hasUnknownTypeAt(string derefChainBorrow, FunctionPosition pos, TypePath path); - } - - private class AssocFunctionCallAccess extends Access instanceof AssocFunctionResolution::AssocFunctionCall - { - AssocFunctionCallAccess() { - // handled in the `OperationMatchingInput` module - not this instanceof Operation - } - - pragma[nomagic] - override Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { - result = - this.(MethodCallExpr) - .getGenericArgList() - .getTypeArg(apos.asMethodTypeArgumentPosition()) - .(TypeMention) - .getTypeAt(path) - or - result = getCallExprTypeArgument(this, apos, path) - } - - override AstNode getNodeAt(FunctionPosition pos) { - result = AssocFunctionResolution::AssocFunctionCall.super.getNodeAt(pos) - } - - pragma[nomagic] - private Type getInferredSelfType(FunctionPosition pos, string derefChainBorrow, TypePath path) { - exists(DerefChain derefChain, BorrowKind borrow | - result = super.getSelfTypeAt(pos, derefChain, borrow, path) and - derefChainBorrow = encodeDerefChainBorrow(derefChain, borrow) and - super.hasReceiverAtPos(pos) - ) - } - - pragma[nomagic] - private Type getInferredNonSelfType(FunctionPosition pos, TypePath path) { - if - // index expression `x[i]` desugars to `*x.index(i)`, so we must account for - // the implicit deref - pos.isReturn() and - this instanceof IndexExpr - then - path.isEmpty() and - result instanceof RefType - or - exists(TypePath suffix | - result = super.getTypeAt(pos, suffix) and - path = TypePath::cons(getRefTypeParameter(_), suffix) - ) - else ( - not super.hasReceiverAtPos(pos) and - result = super.getTypeAt(pos, path) - ) - } - - bindingset[derefChainBorrow] - override Type getInferredType(string derefChainBorrow, FunctionPosition pos, TypePath path) { - result = this.getInferredSelfType(pos, derefChainBorrow, path) - or - result = this.getInferredNonSelfType(pos, path) - } - - private AssocFunctionDeclaration getTarget(ImplOrTraitItemNode i, string derefChainBorrow) { - exists(DerefChain derefChain, BorrowKind borrow | - derefChainBorrow = encodeDerefChainBorrow(derefChain, borrow) and - result = super.resolveCallTarget(i, _, derefChain, borrow) // mutual recursion; resolving method calls requires resolving types and vice versa - ) - } - - override Declaration getTarget(string derefChainBorrow) { - exists(ImplOrTraitItemNode i | result.isAssocFunction(i, this.getTarget(i, derefChainBorrow))) - } - - pragma[nomagic] - override predicate hasUnknownTypeAt(string derefChainBorrow, FunctionPosition pos, TypePath path) { - exists(ImplOrTraitItemNode i | - this.hasUnknownTypeAt(i, this.getTarget(i, derefChainBorrow), pos, path) - ) - or - derefChainBorrow = noDerefChainBorrow() and - forex(ImplOrTraitItemNode i, Function f | - f = CallExprImpl::getResolvedFunction(this) and - f = i.getAnAssocItem() - | - this.hasUnknownTypeAt(i, f, pos, path) - ) - } - } - - private class NonAssocFunctionCallAccess extends Access instanceof NonAssocCallExpr, - CallExprImpl::CallExprCall - { - pragma[nomagic] - override Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { - result = NonAssocCallExpr.super.getTypeArgument(apos, path) - } - - override AstNode getNodeAt(FunctionPosition pos) { - result = NonAssocCallExpr.super.getNodeAt(pos) - } - - pragma[nomagic] - private Type getInferredType(FunctionPosition pos, TypePath path) { - result = super.getInferredType(pos, path) - } - - bindingset[derefChainBorrow] - override Type getInferredType(string derefChainBorrow, FunctionPosition pos, TypePath path) { - exists(derefChainBorrow) and - result = this.getInferredType(pos, path) - } - - pragma[nomagic] - private Declaration getTarget() { - result = - TFunctionDeclaration(ImplOrTraitItemNodeOption::none_(), - super.resolveCallTargetViaPathResolution()) - } - - override Declaration getTarget(string derefChainBorrow) { - result = this.getTarget() and - derefChainBorrow = noDerefChainBorrow() - } - - pragma[nomagic] - override predicate hasUnknownTypeAt(string derefChainBorrow, FunctionPosition pos, TypePath path) { - derefChainBorrow = noDerefChainBorrow() and - exists(FunctionDeclaration f, TypeParameter tp | - f = super.resolveCallTargetViaPathResolution() and - pos.isReturn() and - tp = f.getReturnType(_, path) and - not tp = f.getParameterType(_, _, _) and - // check that no explicit type arguments have been supplied for `tp` - not exists(TypeArgumentPosition tapos | - this.hasTypeArgument(tapos) and - TTypeParamTypeParameter(tapos.asTypeParam()) = tp - ) - ) - } - } -} - -private module FunctionCallMatching = MatchingWithEnvironment; - -pragma[nomagic] -private Type inferFunctionCallType0( - FunctionCallMatchingInput::Access call, FunctionPosition pos, AstNode n, DerefChain derefChain, - BorrowKind borrow, TypePath path -) { - exists(TypePath path0 | - n = call.getNodeAt(pos) and - exists(string derefChainBorrow | - FunctionCallMatchingInput::decodeDerefChainBorrow(derefChainBorrow, derefChain, borrow) - | - result = FunctionCallMatching::inferAccessType(call, derefChainBorrow, pos, path0) - or - call.hasUnknownTypeAt(derefChainBorrow, pos, path0) and - result = TUnknownType() - ) - | - if - // index expression `x[i]` desugars to `*x.index(i)`, so we must account for - // the implicit deref - pos.isReturn() and - call instanceof IndexExpr - then path0.isCons(getRefTypeParameter(_), path) - else path = path0 - ) -} - -pragma[nomagic] -private Type inferFunctionCallTypeNonSelf(AstNode n, FunctionPosition pos, TypePath path) { - exists(FunctionCallMatchingInput::Access call | - result = inferFunctionCallType0(call, pos, n, _, _, path) and - not call.(AssocFunctionResolution::AssocFunctionCall).hasReceiverAtPos(pos) - ) -} - -/** - * Gets the type of `n` at `path` after applying `derefChain`, where `n` is the - * `self` argument of a method call. - * - * The predicate recursively pops the head of `derefChain` until it becomes - * empty, at which point the inferred type can be applied back to `n`. - */ -pragma[nomagic] -private Type inferFunctionCallTypeSelf( - FunctionCallMatchingInput::Access call, AstNode n, DerefChain derefChain, TypePath path -) { - exists(FunctionPosition pos, BorrowKind borrow, TypePath path0 | - call.(AssocFunctionResolution::AssocFunctionCall).hasReceiverAtPos(pos) and - result = inferFunctionCallType0(call, pos, n, derefChain, borrow, path0) - | - borrow.isNoBorrow() and - path = path0 - or - // adjust for implicit borrow - exists(TypePath prefix | - prefix = TypePath::singleton(borrow.getRefType().getPositionalTypeParameter(0)) and - path0 = prefix.appendInverse(path) - ) - ) - or - // adjust for implicit deref - exists( - DerefChain derefChain0, Type t0, TypePath path0, DerefImplItemNode impl, Type selfParamType, - TypePath selfPath - | - t0 = inferFunctionCallTypeSelf(call, n, derefChain0, path0) and - derefChain0.isCons(impl, derefChain) and - selfParamType = impl.resolveSelfTypeAt(selfPath) - | - result = selfParamType and - path = selfPath and - not result instanceof TypeParameter - or - exists(TypePath pathToTypeParam, TypePath suffix | - impl.targetHasTypeParameterAt(pathToTypeParam, selfParamType) and - path0 = pathToTypeParam.appendInverse(suffix) and - result = t0 and - path = selfPath.append(suffix) - ) - ) -} - -private Type inferFunctionCallTypePreCheck( - AstNode n, ContextTyping::FunctionPositionKind kind, TypePath path -) { - exists(FunctionPosition pos | - result = inferFunctionCallTypeNonSelf(n, pos, path) and - if pos.isPosition() - then kind = ContextTyping::PositionalKind() - else kind = ContextTyping::ReturnKind() - ) - or - exists(FunctionCallMatchingInput::Access a | - result = inferFunctionCallTypeSelf(a, n, DerefChain::nil(), path) and - if a.(AssocFunctionResolution::AssocFunctionCall).hasReceiver() - then kind = ContextTyping::SelfKind() - else kind = ContextTyping::PositionalKind() - ) -} - -/** - * Gets the type of `n` at `path`, where `n` is either a function call or an - * argument/receiver of a function call. - */ -private predicate inferFunctionCallType = - ContextTyping::CheckContextTyping::check/2; - -abstract private class Constructor extends Addressable { - final TypeParameter getTypeParameter(TypeParameterPosition ppos) { - typeParamMatchPosition(this.getTypeItem().getGenericParamList().getATypeParam(), result, ppos) - } - - abstract TypeItem getTypeItem(); - - abstract TypeRepr getParameterTypeRepr(int pos); - - Type getReturnType(TypePath path) { - result = TDataType(this.getTypeItem()) and - path.isEmpty() - or - result = TTypeParamTypeParameter(this.getTypeItem().getGenericParamList().getATypeParam()) and - path = TypePath::singleton(result) - } - - Type getDeclaredType(FunctionPosition pos, TypePath path) { - result = this.getParameterType(pos.asPosition(), path) - or - pos.isReturn() and - result = this.getReturnType(path) - } - - Type getParameterType(int pos, TypePath path) { - result = this.getParameterTypeRepr(pos).(TypeMention).getTypeAt(path) - } -} - -private class StructConstructor extends Constructor instanceof Struct { - override TypeItem getTypeItem() { result = this } - - override TypeRepr getParameterTypeRepr(int i) { - result = [super.getTupleField(i).getTypeRepr(), super.getNthStructField(i).getTypeRepr()] - } -} - -private class VariantConstructor extends Constructor instanceof Variant { - override TypeItem getTypeItem() { result = super.getEnum() } - - override TypeRepr getParameterTypeRepr(int i) { - result = [super.getTupleField(i).getTypeRepr(), super.getNthStructField(i).getTypeRepr()] - } -} - -/** - * A matching configuration for resolving types of constructions of enums and - * structs, such as `Result::Ok(42)`, `Foo { bar: 1 }` and `None`. - */ -private module ConstructionMatchingInput implements MatchingInputSig { - import FunctionPositionMatchingInput - - class Declaration = Constructor; - - abstract class Access extends AstNode { - abstract Type getInferredType(FunctionPosition pos, TypePath path); - - abstract Declaration getTarget(); - - abstract AstNode getNodeAt(AccessPosition apos); - - abstract Type getTypeArgument(TypeArgumentPosition apos, TypePath path); - - /** - * Holds if the return type of this construction expression at `path` may - * have to be inferred from the context. For example in `Result::Ok(42)` the - * error type has to be inferred from the context. - */ - pragma[nomagic] - predicate hasUnknownTypeAt(FunctionPosition pos, TypePath path) { - exists(Declaration d, TypeParameter tp | - d = this.getTarget() and - pos.isReturn() and - tp = d.getReturnType(path) and - not exists(FunctionPosition pos2 | not pos2.isReturn() and tp = d.getDeclaredType(pos2, _)) and - // check that no explicit type arguments have been supplied for `tp` - not exists(TypeArgumentPosition tapos | - exists(this.getTypeArgument(tapos, _)) and - TTypeParamTypeParameter(tapos.asTypeParam()) = tp - ) - ) - } - } - - private class NonAssocCallAccess extends Access, NonAssocCallExpr, - ContextTyping::ContextTypedCallCand - { - NonAssocCallAccess() { - this instanceof CallExprImpl::TupleStructExpr or - this instanceof CallExprImpl::TupleVariantExpr - } - - override Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { - result = NonAssocCallExpr.super.getTypeArgument(apos, path) - } - - override AstNode getNodeAt(AccessPosition apos) { - result = NonAssocCallExpr.super.getNodeAt(apos) - } - - override Type getInferredType(FunctionPosition pos, TypePath path) { - result = NonAssocCallExpr.super.getInferredType(pos, path) - } - - override Declaration getTarget() { result = this.resolveCallTargetViaPathResolution() } - } - - abstract private class StructAccess extends Access instanceof PathAstNode { - pragma[nomagic] - override Type getInferredType(AccessPosition apos, TypePath path) { - result = inferType(this.getNodeAt(apos), path) - } - - pragma[nomagic] - override Declaration getTarget() { result = resolvePath(super.getPath()) } - - pragma[nomagic] - override Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { - // Handle constructions that use `Self {...}` syntax - exists(TypeMention tm, TypePath path0 | - tm = super.getPath() and - result = tm.getTypeAt(path0) and - path0.isCons(TTypeParamTypeParameter(apos.asTypeParam()), path) - ) - } - } - - private class StructExprAccess extends StructAccess, StructExpr { - override Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { - result = super.getTypeArgument(apos, path) - or - exists(TypePath suffix | - suffix.isCons(TTypeParamTypeParameter(apos.asTypeParam()), path) and - result = CertainTypeInference::inferCertainType(this, suffix) - ) - } - - override AstNode getNodeAt(AccessPosition apos) { - result = - this.getFieldExpr(pragma[only_bind_into](this.getNthStructField(apos.asPosition()) - .getName() - .getText())).getExpr() - or - result = this and apos.isReturn() - } - } - - /** A potential nullary struct/variant construction such as `None`. */ - private class PathExprAccess extends StructAccess, PathExpr { - PathExprAccess() { not exists(CallExpr ce | this = ce.getFunction()) } - - override AstNode getNodeAt(AccessPosition apos) { result = this and apos.isReturn() } - } -} - -private module ConstructionMatching = Matching; - -pragma[nomagic] -private Type inferConstructionTypePreCheck( - AstNode n, ContextTyping::FunctionPositionKind kind, TypePath path -) { - exists(ConstructionMatchingInput::Access a, FunctionPosition pos | - n = a.getNodeAt(pos) and - if pos.isPosition() - then kind = ContextTyping::PositionalKind() - else kind = ContextTyping::ReturnKind() - | - result = ConstructionMatching::inferAccessType(a, pos, path) - or - a.hasUnknownTypeAt(pos, path) and - result = TUnknownType() - ) -} - -private predicate inferConstructionType = - ContextTyping::CheckContextTyping::check/2; - -/** - * A matching configuration for resolving types of operations like `a + b`. - */ -private module OperationMatchingInput implements MatchingInputSig { - private import codeql.rust.elements.internal.OperationImpl::Impl as OperationImpl - import FunctionPositionMatchingInput - - class Declaration extends FunctionCallMatchingInput::Declaration { - private Method getSelfOrImpl() { - result = f - or - f.implements(result) - } - - pragma[nomagic] - private predicate borrowsAt(FunctionPosition pos) { - exists(TraitItemNode t, string path, string method | - this.getSelfOrImpl() = t.getAssocItem(method) and - path = t.getCanonicalPath(_) and - exists(int borrows | OperationImpl::isOverloaded(_, _, path, method, borrows) | - pos.asPosition() = 0 and borrows >= 1 - or - pos.asPosition() = 1 and - borrows >= 2 - ) - ) - } - - pragma[nomagic] - private predicate derefsReturn() { this.getSelfOrImpl() = any(DerefTrait t).getDerefFunction() } - - Type getDeclaredType(FunctionPosition pos, TypePath path) { - exists(TypePath path0 | - result = super.getDeclaredType(pos, path0) and - if - this.borrowsAt(pos) - or - pos.isReturn() and this.derefsReturn() - then path0.isCons(getRefTypeParameter(_), path) - else path0 = path - ) - } - } - - class Access extends AssocFunctionResolution::OperationAssocFunctionCall { - Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { none() } - - pragma[nomagic] - Type getInferredType(FunctionPosition pos, TypePath path) { - result = inferType(this.getNodeAt(pos), path) - } - - Declaration getTarget() { - exists(ImplOrTraitItemNode i | - result.isAssocFunction(i, this.resolveCallTarget(i, _, _, _)) // mutual recursion - ) - } - } -} - -private module OperationMatching = Matching; - -pragma[nomagic] -private Type inferOperationTypePreCheck( - AstNode n, ContextTyping::FunctionPositionKind kind, TypePath path -) { - exists(OperationMatchingInput::Access a, FunctionPosition pos | - n = a.getNodeAt(pos) and - result = OperationMatching::inferAccessType(a, pos, path) and - if pos.asPosition() = 0 - then kind = ContextTyping::SelfKind() - else - if pos.isPosition() - then kind = ContextTyping::PositionalKind() - else kind = ContextTyping::ReturnKind() - ) -} - -private predicate inferOperationType = - ContextTyping::CheckContextTyping::check/2; - -/** - * A matching configuration for resolving types of field expressions like `x.field`. - */ -private module FieldExprMatchingInput implements MatchingInputSig { - private newtype TDeclarationPosition = - TSelfDeclarationPosition() or - TFieldPos() - - class DeclarationPosition extends TDeclarationPosition { - predicate isSelf() { this = TSelfDeclarationPosition() } - - predicate isField() { this = TFieldPos() } - - string toString() { - this.isSelf() and - result = "self" - or - this.isField() and - result = "(field)" - } - } - - private newtype TDeclaration = - TStructFieldDecl(StructField sf) or - TTupleFieldDecl(TupleField tf) - - abstract class Declaration extends TDeclaration { - TypeParameter getTypeParameter(TypeParameterPosition ppos) { none() } - - abstract Type getDeclaredType(DeclarationPosition dpos, TypePath path); - - abstract string toString(); - - abstract Location getLocation(); - } - - abstract private class StructOrTupleFieldDecl extends Declaration { - abstract AstNode getAstNode(); - - abstract TypeRepr getTypeRepr(); - - override Type getDeclaredType(DeclarationPosition dpos, TypePath path) { - dpos.isSelf() and - // no case for variants as those can only be destructured using pattern matching - exists(Struct s | this.getAstNode() = [s.getStructField(_).(AstNode), s.getTupleField(_)] | - result = TDataType(s) and - path.isEmpty() - or - result = TTypeParamTypeParameter(s.getGenericParamList().getATypeParam()) and - path = TypePath::singleton(result) - ) - or - dpos.isField() and - result = this.getTypeRepr().(TypeMention).getTypeAt(path) - } - - override string toString() { result = this.getAstNode().toString() } - - override Location getLocation() { result = this.getAstNode().getLocation() } - } - - private class StructFieldDecl extends StructOrTupleFieldDecl, TStructFieldDecl { - private StructField sf; - - StructFieldDecl() { this = TStructFieldDecl(sf) } - - override AstNode getAstNode() { result = sf } - - override TypeRepr getTypeRepr() { result = sf.getTypeRepr() } - } - - private class TupleFieldDecl extends StructOrTupleFieldDecl, TTupleFieldDecl { - private TupleField tf; - - TupleFieldDecl() { this = TTupleFieldDecl(tf) } - - override AstNode getAstNode() { result = tf } - - override TypeRepr getTypeRepr() { result = tf.getTypeRepr() } - } - - class AccessPosition = DeclarationPosition; - - class Access extends FieldExpr { - Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { none() } - - AstNode getNodeAt(AccessPosition apos) { - result = this.getContainer() and - apos.isSelf() - or - result = this and - apos.isField() - } - - Type getInferredType(AccessPosition apos, TypePath path) { - exists(TypePath path0 | result = inferType(this.getNodeAt(apos), path0) | - if apos.isSelf() - then - // adjust for implicit deref - path0.isCons(getRefTypeParameter(_), path) - or - not path0.isCons(getRefTypeParameter(_), _) and - not (result instanceof RefType and path0.isEmpty()) and - path = path0 - else path = path0 - ) - } - - Declaration getTarget() { - // mutual recursion; resolving fields requires resolving types and vice versa - result = - [ - TStructFieldDecl(resolveStructFieldExpr(this, _)).(TDeclaration), - TTupleFieldDecl(resolveTupleFieldExpr(this, _)) - ] - } - } - - predicate accessDeclarationPositionMatch(AccessPosition apos, DeclarationPosition dpos) { - apos = dpos - } -} - -private module FieldExprMatching = Matching; - -/** - * Gets the type of `n` at `path`, where `n` is either a field expression or - * the receiver of field expression call. - */ -pragma[nomagic] -private Type inferFieldExprType(AstNode n, TypePath path) { - exists( - FieldExprMatchingInput::Access a, FieldExprMatchingInput::AccessPosition apos, TypePath path0 - | - n = a.getNodeAt(apos) and - result = FieldExprMatching::inferAccessType(a, apos, path0) - | - if apos.isSelf() - then - exists(Type receiverType | receiverType = inferType(n) | - if receiverType instanceof RefType - then - // adjust for implicit deref - not path0.isCons(getRefTypeParameter(_), _) and - not (path0.isEmpty() and result instanceof RefType) and - path = TypePath::cons(getRefTypeParameter(_), path0) - else path = path0 - ) - else path = path0 - ) -} - -/** - * Gets a type at `path` that `n` infers to, if any. - * - * The type inference implementation works by computing all possible types, so - * the result is not necessarily unique. For example, in - * - * ```rust - * trait MyTrait { - * fn foo(&self) -> &Self; - * - * fn bar(&self) -> &Self { - * self.foo() - * } - * } - * - * struct MyStruct; - * - * impl MyTrait for MyStruct { - * fn foo(&self) -> &MyStruct { - * self - * } - * } - * - * fn baz() { - * let x = MyStruct; - * x.bar(); - * } - * ``` - * - * the type inference engine will roughly make the following deductions: - * - * 1. `MyStruct` has type `MyStruct`. - * 2. `x` has type `MyStruct` (via 1.). - * 3. The return type of `bar` is `&Self`. - * 3. `x.bar()` has type `&MyStruct` (via 2 and 3, by matching the implicit `Self` - * type parameter with `MyStruct`.). - * 4. The return type of `bar` is `&MyTrait`. - * 5. `x.bar()` has type `&MyTrait` (via 2 and 4). - */ -cached -Type inferType(AstNode n, TypePath path) { - Stages::TypeInferenceStage::ref() and - result = CertainTypeInference::inferCertainType(n, path) - or - // Don't propagate type information into a node which conflicts with certain - // type information. - forall(TypePath prefix | - CertainTypeInference::hasInferredCertainType(n, prefix) and - prefix.isPrefixOf(path) - | - not CertainTypeInference::certainTypeConflict(n, prefix, path, result) - ) and - ( - result = inferAssignmentOperationType(n, path) - or - result = inferTypeEquality(n, path) - or - result = inferFunctionCallType(n, path) - or - result = inferConstructionType(n, path) - or - result = inferOperationType(n, path) - or - result = inferFieldExprType(n, path) - or - result = inferTryExprType(n, path) - or - result = inferLiteralType(n, path, false) - or - result = inferAwaitExprType(n, path) - or - result = inferDereferencedExprPtrType(n, path) - or - result = inferForLoopExprType(n, path) - or - result = inferClosureExprType(n, path) - or - result = inferArgList(n, path) - or - result = inferDeconstructionPatType(n, path) - or - result = inferUnknownTypeFromAnnotation(n, path) - ) -} - -/** - * Gets a type that `n` infers to, if any. - */ -Type inferType(AstNode n) { result = inferType(n, TypePath::nil()) } From 0c78aecdf912a9c2deb297af13f7837243aabecb Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 6 Jul 2026 10:12:53 +0200 Subject: [PATCH 0963/2098] Shared: Type inference 2.0 --- .../typeinference/internal/TypeInference.qll | 1805 +++++++++++++++-- shared/util/codeql/util/UnboundList.qll | 7 + 2 files changed, 1650 insertions(+), 162 deletions(-) diff --git a/shared/typeinference/codeql/typeinference/internal/TypeInference.qll b/shared/typeinference/codeql/typeinference/internal/TypeInference.qll index b90c53ebdbaa..043774f63434 100644 --- a/shared/typeinference/codeql/typeinference/internal/TypeInference.qll +++ b/shared/typeinference/codeql/typeinference/internal/TypeInference.qll @@ -1,126 +1,70 @@ /** * Provides shared functionality for computing type inference in QL. * - * The code examples in this file use C# syntax, but the concepts should carry - * over to other languages as well. + * The library is initialized in three phases: * - * The library is initialized in two phases: `Make1`, which constructs the - * `TypePath` type, and `Make2`, which (using `TypePath` in the input signature) - * constructs the `Matching` and `IsInstantiationOf` modules. + * 1. `Make1`, which takes as input a definition of atomic types (including type + * parameters) and constructs the `TypePath` type used to represent paths into + * compound types. * - * The intended use of this library is to define a predicate + * 2. `Make2`, which (using the `TypePath` type) takes as input a definition of type + * mentions as well as the type hierarchy and type constraints, and constructs the + * `Matching` and `IsInstantiationOf` modules, which are core building blocks for + * matching type instantiations against type parameters, taking the type hierarchy + * and type constraints into account. * - * ```ql - * Type inferType(AstNode n, TypePath path) - * ``` - * - * for recursively inferring the type-path-indexed types of AST nodes. For example, - * one may have a base case for literals like - * - * ```ql - * Type inferType(AstNode n, TypePath path) { - * ... - * n instanceof IntegerLiteral and - * result instanceof IntType and - * path.isEmpty() - * ... - * } - * ``` - * - * and recursive cases for local variables like - * - * ```ql - * Type inferType(AstNode n, TypePath path) { - * ... - * exists(LocalVariable v | - * // propagate type information from the initializer to any access - * n = v.getAnAccess() and - * result = inferType(v.getInitializer(), path) - * or - * // propagate type information from any access back to the initializer; note - * // that this case may not be relevant for all languages, but e.g. in Rust - * // it is - * n = v.getInitializer() and - * result = inferType(v.getAnAccess(), path) - * ) - * ... - * } - * ``` - * - * The `Matching` module is used when an AST node references a potentially generic - * declaration, where the type of the node depends on the type of some of its sub - * nodes. For example, if we have a generic method like `T Identity(T t)`, then - * the type of `Identity(42)` should be `int`, while the type of `Identity("foo")` - * should be `string`; in both cases it should _not_ be `T`. + * 3. `Make3`, which takes as input a definition of AST nodes, including common concepts + * such as calls and callables, as well as language-specific typing rules, and + * constructs the `inferType` predicate for recursively inferring the types of AST + * nodes. * - * In order to infer the type of method calls, one would define something like + * Unlike unification-based type inference, this library does directed/bottom-up type + * inference by default, but allowing for contextual/top-down type inference when + * explicitly needed. * - * ```ql - * private module MethodCallMatchingInput implements MatchingInputSig { - * private newtype TDeclarationPosition = - * TSelfDeclarationPosition() or - * TPositionalDeclarationPosition(int pos) { ... } or - * TReturnDeclarationPosition() + * For example, in order to infer the type of a conditional expression, + * `if cond { e1 } else { e2 }`, we propagate type information from either of the + * branches `e1` and `e2` into the conditional expression (for simplicity, we do not + * attempt to calculate least-upper-bound types or similar). This corresponds to the + * two bottom-up type inference rules: * - * // A position inside a method with a declared type. - * class DeclarationPosition extends TDeclarationPosition { - * ... - * } + * ```text + * e1: T + * ------------------------------- (cond-then) + * if cond { e1 } else { e2 } : T * - * class Declaration extends MethodCall { - * // Gets a type parameter at `tppos` belonging to this method. - * // - * // For example, if this method is `T Identity(T t)`, then `T` - * // is at position `0`. - * TypeParameter getTypeParameter(TypeParameterPosition tppos) { ... } * - * // Gets the declared type of this method at `dpos` and `path`. - * // - * // For example, if this method is `T Identity(T t)`, then both the - * // the return type and parameter position `0` is `T` with `path.isEmpty()`. - * Type getDeclaredType(DeclarationPosition dpos, TypePath path) { ... } - * } - * - * // A position inside a method call with an inferred type - * class AccessPosition = DeclarationPosition; + * e2: T + * ------------------------------- (cond-else) + * if cond { e1 } else { e2 } : T + * ``` * - * class Access extends MethodCall { - * AstNode getNodeAt(AccessPosition apos) { ... } + * Now, if we have a conditional expression like * - * // Gets the inferred type of the node at `apos` and `path`. - * // - * // For example, if this method call is `Identity(42)`, then the type - * // at argument position `0` is `int` with `path.isEmpty()"`. - * Type getInferredType(AccessPosition apos, TypePath path) { - * result = inferType(this.getNodeAt(apos), path) - * } + * ```rust + * if cond { 42i64 } else { Default::default() } + * ``` * - * // Gets the method that this method call resolves to. - * // - * // This will typically be defined in mutual recursion with the `inferType` - * // predicate, as we need to know the type of the receiver in order to - * // resolve calls to instance methods. - * Declaration getTarget() { ... } - * } + * where the type of `Default::default()` needs to be inferred from the context, we * - * predicate accessDeclarationPositionMatch(AccessPosition apos, DeclarationPosition dpos) { - * apos = dpos - * } - * } + * 1. conclude that the conditional has type `i64`, using the `cond-then` rule, + * 2. assign `Default::default()` the special `UnknownType` (this library has built-in + * logic for identifying calls where (parts of) the return type needs to be inferred + * from the context), and + * 3. since the `else` branch has `UnknownType`, we apply the `cond-else` rule _backwards_ + * to infer that `Default::default()` has type `i64`. * - * private module MethodCallMatching = Matching; + * Note that `UnknownType` can propagate bottom-up like any other type, which is needed + * in cases like for example * - * Type inferType(AstNode n, TypePath path) { - * ... - * exists(MethodCall mc, MethodCallMatchingInput::AccessPosition apos | - * // Some languages may want to restrict `apos` to be the return position, but in - * // e.g. Rust type information can flow out of all positions - * n = a.getNodeAt(apos) and - * result = MethodCallMatching::inferAccessType(a, apos, path) - * ) - * ... - * } + * ```rust + * let x = if cond { Default::default() } else { Default::default() }; + * let y : i64 = x; * ``` + * + * where the `UnknownType` will propagate upwards using two bottom-up steps, and the + * contextual inference will then propagate the `i64` type backwards using two + * reversed steps. */ overlay[local?] module; @@ -146,10 +90,10 @@ signature module InputSig1 { } /** - * Holds if `t` is a pseudo type. Pseudo types are skipped when checking for - * non-instantiations in `isNotInstantiationOf`. + * A pseudo type. Pseudo types are skipped when checking for non-instantiations + * in `isNotInstantiationOf`. */ - predicate isPseudoType(Type t); + class PseudoType extends Type; /** A type parameter. */ class TypeParameter extends Type; @@ -189,35 +133,6 @@ signature module InputSig1 { */ int getTypeParameterId(TypeParameter tp); - /** - * A type argument position, for example an integer. - * - * Type argument positions are used when type arguments are supplied explicitly, - * for example in a method call like `M()` the type argument `int` is at - * position `0`. - */ - bindingset[this] - class TypeArgumentPosition { - /** Gets the textual representation of this position. */ - bindingset[this] - string toString(); - } - - /** A type parameter position, for example an integer. */ - bindingset[this] - class TypeParameterPosition { - /** Gets the textual representation of this position. */ - bindingset[this] - string toString(); - } - - /** Holds if `tapos` and `tppos` match. */ - bindingset[tapos] - bindingset[tppos] - predicate typeArgumentParameterPositionMatch( - TypeArgumentPosition tapos, TypeParameterPosition tppos - ); - /** * Gets the limit on the length of type paths. Set to `none()` if there should * be no limit. @@ -647,7 +562,8 @@ module Make1 Input1> { } private Type getNonPseudoTypeAt(App app, TypePath path) { - result = app.getTypeAt(path) and not isPseudoType(result) + result = app.getTypeAt(path) and + not result instanceof PseudoType } pragma[nomagic] @@ -1258,8 +1174,8 @@ module Make1 Input1> { /** Gets the location of this declaration. */ Location getLocation(); - /** Gets the type parameter at position `tppos` of this declaration, if any. */ - TypeParameter getTypeParameter(TypeParameterPosition tppos); + /** Gets the type parameter at position `pos` of this declaration, if any. */ + TypeParameter getTypeParameter(int pos); /** * Gets the declared type of this declaration at `path` for position `dpos`. @@ -1309,13 +1225,13 @@ module Make1 Input1> { Location getLocation(); /** - * Gets the type at `path` for the type argument at position `tapos` of + * Gets the type at `path` for the type argument at position `pos` of * this access, if any. * * For example, in a method call like `M()`, `int` is an explicit * type argument at position `0`. */ - Type getTypeArgument(TypeArgumentPosition tapos, TypePath path); + Type getTypeArgument(int pos, TypePath path); /** * Gets the inferred type at `path` for the position `apos` and environment `e` @@ -1346,14 +1262,6 @@ module Make1 Input1> { module MatchingWithEnvironment { private import Input - pragma[nomagic] - private TypeParameter getDeclTypeParameter(Declaration decl, TypeArgumentPosition tapos) { - exists(TypeParameterPosition tppos | - result = decl.getTypeParameter(tppos) and - typeArgumentParameterPositionMatch(tapos, tppos) - ) - } - /** * Gets the type of the type argument at `path` in `a` that corresponds to * the type parameter `tp` in `target`, if any. @@ -1365,10 +1273,10 @@ module Make1 Input1> { bindingset[a, target] pragma[inline_late] Type getTypeArgument(Access a, Declaration target, TypeParameter tp, TypePath path) { - exists(TypeArgumentPosition tapos | - result = a.getTypeArgument(tapos, path) and - tp = getDeclTypeParameter(target, tapos) and - not isPseudoType(result) + exists(int pos | + result = a.getTypeArgument(pos, path) and + tp = target.getTypeParameter(pos) and + not result instanceof PseudoType ) } @@ -1646,8 +1554,14 @@ module Make1 Input1> { private predicate typeParameterHasConstraint( Declaration target, TypeParameter constrainedTp, TypeMention constraint ) { - constrainedTp = target.getTypeParameter(_) and - constraint = getATypeParameterConstraint(constrainedTp, target) + constraint = getATypeParameterConstraint(constrainedTp, target) and + ( + constrainedTp = target.getTypeParameter(_) + or + // a declaration may reference type parameters that are not declared on it, + // for example type parameters from the enclosing type + constrainedTp = target.getDeclaredType(_, _) + ) } /** @@ -1674,7 +1588,6 @@ module Make1 Input1> { TypeParameter tp ) { typeParameterHasConstraint(target, constrainedTp, constraint) and - tp = target.getTypeParameter(_) and tp = constraint.getTypeAt(pathToTp) and constrainedTp != tp } @@ -1691,8 +1604,12 @@ module Make1 Input1> { ) } + /** + * Holds if type parameter `tp`, which is in scope in `target`, can be matched + * to have type `t` at `path` via the inferred argument types of `a`. + */ pragma[inline] - private predicate typeMatch( + predicate typeMatch( Access a, AccessEnvironment e, Declaration target, TypePath path, Type t, TypeParameter tp ) { // A type given at the access corresponds directly to the type parameter @@ -1869,8 +1786,8 @@ module Make1 Input1> { /** Gets the location of this declaration. */ Location getLocation(); - /** Gets the type parameter at position `tppos` of this declaration, if any. */ - TypeParameter getTypeParameter(TypeParameterPosition tppos); + /** Gets the type parameter at position `pos` of this declaration, if any. */ + TypeParameter getTypeParameter(int pos); /** * Gets the declared type of this declaration at `path` for position `dpos`. @@ -1912,13 +1829,13 @@ module Make1 Input1> { Location getLocation(); /** - * Gets the type at `path` for the type argument at position `tapos` of + * Gets the type at `path` for the type argument at position `pos` of * this access, if any. * * For example, in a method call like `M()`, `int` is an explicit * type argument at position `0`. */ - Type getTypeArgument(TypeArgumentPosition tapos, TypePath path); + Type getTypeArgument(int pos, TypePath path); /** * Gets the inferred type at `path` for the position `apos` of this access. @@ -1996,5 +1913,1569 @@ module Make1 Input1> { not exists(tm.getTypeAt(TypePath::nil())) and exists(tm.getLocation()) } } + + private module Consistency2 = Consistency; + + /** + * Provides the input to `Make3`. + */ + signature module InputSig3 { + /** + * Reverse references to the cached predicates that reference + * `CachedStage::ref()`. + */ + default predicate cacheRevRef() { none() } + + /** + * This predicate must be implemented as an alias for the `inferType` predicate + * defined in this module, and is needed in order to provide default implementations + * inside this signature. + */ + Type inferTypeForDefaults(AstNode n, TypePath path); + + /** + * A special pseudo type used to represent cases where the actual type needs + * to be inferred using contextual information. For example, in + * + * ```rust + * let x = Vec::new(); + * x.push(42); + * ``` + * + * the element type of `x` is assigned an unknown type, which allows for type + * information to flow into `x` from the call to `push`. + */ + class UnknownType extends PseudoType; + + /** A boolean type. */ + class BoolType extends Type; + + /** An AST node. */ + class AstNode { + /** Gets a textual representation of this AST node. */ + string toString(); + + /** Gets the location of this AST node. */ + Location getLocation(); + } + + /** An expression. */ + class Expr extends AstNode; + + /** A cast expression. */ + class Cast extends Expr { + /** Gets the type being cast to. */ + TypeMention getType(); + } + + /** + * A switch. + */ + class Switch extends AstNode { + /** + * Gets the expression being switched on. + */ + Expr getExpr(); + + /** Gets the case at the specified (zero-based) `index`. */ + Case getCase(int index); + } + + /** A case in a switch. */ + class Case extends AstNode { + /** Gets a pattern being matched by this case. */ + AstNode getAPattern(); + + /** Gets the body of this case. */ + AstNode getBody(); + } + + /** A ternary conditional expression. */ + class ConditionalExpr extends Expr { + /** Gets the condition of this expression. */ + Expr getCondition(); + + /** Gets the true branch of this expression. */ + Expr getThen(); + + /** Gets the false branch of this expression. */ + Expr getElse(); + } + + /** A binary expression. */ + class BinaryExpr extends Expr { + /** Gets the left operand of this binary expression. */ + Expr getLeftOperand(); + + /** Gets the right operand of this binary expression. */ + Expr getRightOperand(); + } + + /** A short-circuiting logical AND expression. */ + class LogicalAndExpr extends BinaryExpr; + + /** A short-circuiting logical OR expression. */ + class LogicalOrExpr extends BinaryExpr; + + /** + * An assignment expression, either compound or simple. + * + * Examples: + * + * ``` + * x = y + * sum += element + * ``` + */ + class Assignment extends BinaryExpr; + + /** A simple assignment expression, for example `x = y`. */ + class AssignExpr extends Assignment; + + /** A parenthesized expression. */ + class ParenExpr extends Expr { + Expr getExpr(); + } + + /** + * A variable, or an entity that behaves like a variable with respect to + * type inference, for example a local variable, `const`, or `static` in Rust. + */ + class Variable { + /** Gets the AST node that defines this variable. */ + AstNode getDefiningNode(); + + /** Gets an access to this variable. */ + Expr getAnAccess(); + + /** Gets a textual representation of this variable. */ + string toString(); + + /** Gets the location of this variable. */ + Location getLocation(); + } + + /** A declaration. */ + class Declaration extends AstNode { + /** + * Gets the type at `path` of the entity that contains this declaration, if any. + * + * For example, if this declaration is a method, then the declaring type is the + * type of the class that contains the method. + * + * This type will be used to match against type qualifiers at invocations, and + * it may coincide with the types of (possibly implicit) `this`/`self` parameters, + * but in for example Rust those types can differ. + * + * Local variable declarations will not have a declaring type (but they may have + * a _declared_ type). + */ + TypeMention getDeclaringType(); + + /** + * Gets the declared type of this declaration, if any. + * + * This can for example be the type of a variable or field, or the return type of + * a function. + */ + TypeMention getType(); + } + + /** + * A declaration of one or more variables, for example a `let` statement + * in Rust. + */ + class VariableDeclaration extends Declaration { + /** + * Holds if this declaration is a coercion site, meaning that the type of the + * initializer may have to be coerced to match the pattern. + */ + predicate isCoercionSite(); + + /** + * Gets the pattern of this declaration. + * + * Any variable declared by this declaration will have its defining node in the + * pattern, for example in `let Some(x) = opt`, the defining node of `x` is under + * the `Some` pattern. + */ + AstNode getPattern(); + + /** Gets the initializer of this declaration, if any. */ + AstNode getInitializer(); + } + + /** A field. */ + class Field extends Declaration; + + /** A field access expression, for example `x.f`. */ + class FieldAccess extends Expr { + /* Gets the receiver of this field access. */ + Expr getReceiver(); + + /** Gets the field being accessed. */ + Field getField(); + } + + /** + * Gets the inferred type of the receiver of `fa` at `path`, to be used when + * propagating type information out of the field access via the field declaration. + * + * By default, this is the inferred type of `fa.getReceiver()`, but for example in + * Rust, post-processing may be needed to take implicit dereferencing into account + */ + default Type inferFieldAccessReceiverType(FieldAccess fa, TypePath path) { + result = inferTypeForDefaults(fa.getReceiver(), path) + } + + /** + * Gets the contextually inferred type of field access receiver `receiver` + * at `path`. The context used is the field being accessed, for example in + * + * ```rust + * let tuple = (Default::default(), "hello"); + * let x : i32 = tuple.0; + * ``` + * + * we will be able to infer that the type of `Default::default()` is `i32`. + * + * This predicate must be implemented using `inferFieldAccessReceiverTypeContextualDefault`, + * performing the dual post-processing of `inferFieldAccessReceiverType`. + * + * When no post-processing is needed, simply implement this predicate as + * `result = inferFieldAccessReceiverTypeContextualDefault(_, receiver, path)`. + */ + Type inferFieldAccessReceiverTypeContextual(Expr receiver, TypePath path); + + /** A node that returns a value from a callable. */ + class Return extends AstNode { + /** Gets the expression evaluating to the value being returned, if any. */ + Expr getExpr(); + } + + /** A parameter. */ + class Parameter extends VariableDeclaration; + + /** A parameterizable element, such as a function or a variant constructor. */ + class Parameterizable extends Declaration { + /** + * Gets the type parameter at position `pos` of this element, if any. + * + * This should only include type parameters declared directly on the element + * itself; any type parameters that are in scope from the declaring element + * are handled via `getDeclaringType`: + * + * ```rust + * impl MyThing { + * // ^^^^^^^^^^ declaring type of `foo`; `T` is in scope, but not a type parameter of `foo` + * fn foo(self, x: U, y: T) { ... } + * // ^ `U` is the `0`th type parameter of `foo` + * } + * ``` + */ + TypeParameter getTypeParameter(int pos); + + /** + * Gets an additional type parameter constraint for the given type parameter, + * which applies to this element. For example, in Rust, a function can apply + * additional constraints on type parameters belonging to the `impl` block + * that the function is defined in: + * + * ```rust + * impl MyThing { + * fn foo(self) where T: MyTrait { ... } + * // ^^^^^^^ additional constraint on `T` that applies to `foo` + * } + */ + TypeMention getAdditionalTypeParameterConstraint(TypeParameter tp); + + /** + * Gets the `i`th parameter of this element. + * + * This should also include (possibly implicit) `this`/`self` parameters. + */ + Parameter getParameter(int i); + } + + /** A callable. */ + class Callable extends Parameterizable { + /** Gets the body of this callable, if any. */ + AstNode getBody(); + } + + /** Gets the immediately enclosing callable that contains `node`, if any. */ + Callable getEnclosingCallable(AstNode node); + + /** + * Gets the return type of `c` at `path`. + * + * By default, this is the declared type of `c` at `path`, but in for example Rust, + * `async` functions must have their return type wrapped in a `Future` type. + */ + default Type getCallableReturnType(Callable c, TypePath path) { + result = c.getType().getTypeAt(path) + } + + /** + * A context needed for resolving invocations. + * + * For example, in Rust a context is needed to resolve method calls, because of + * implicit dereferencing and borrowing. When not needed, simply use `Unit`. + */ + bindingset[this] + class ResolutionContext { + /** Gets a textual representation of this context. */ + bindingset[this] + string toString(); + } + + /** An invocation expression, for example a call or a variant construction. */ + class Invocation extends Expr { + /** + * Gets the explicit type qualifier at `path` for this invocation, if any. + * + * When present, this type qualifier will be matched against the declaring + * type of the target. + * + * Example: + * + * ```rust + * let opt = Option::::None; + * // ^^^^^^^^^^^^^ type qualifier + * ``` + */ + Type getTypeQualifier(TypePath path); + + /** + * Gets the explicit type argument at position `pos` and `path` for this + * invocation, if any. + * + * This should only include type arguments that are supplied for type + * parameters belonging to the target of the invocation, and not type + * arguments that are part of a type qualifier (those should be handled via + * `getTypeQualifier`). + * + * Example: + * + * ```rust + * let x = Foo::::bar::(); + * // ^^^^^^^^^^ type qualifier + * // ^^^ type argument 0 + * ``` + */ + Type getTypeArgument(int pos, TypePath path); + + /** + * Gets the `i`th argument of this invocation. + * + * This should include the receiver argument for method calls. + */ + Expr getArgument(int i); + + /** + * Gets the target of this invocation in the given resolution context. + * + * This predicate may depend on the `inferType` predicate, for example, + * in order to resolve a method call one needs to know the type of the + * receiver. + */ + Parameterizable getTarget(ResolutionContext ctx); + + /** + * Gets a target (candidate) of this invocation which will be used to + * match the type qualifier of this call against type parameters of the + * declaring type of the target (candidate). + * + * Unlike `getTarget`, this predicate cannot depend on the `inferType` + * predicate. + */ + Parameterizable getATargetForTypeQualifierMatching(); + } + + /** + * Gets the inferred type of the `i`th argument of `invocation` at `path` in context + * `ctx`, to be used when propagating type information out of the invocation via the + * target. + * + * By default, this is the inferred type of `invocation.getArgument(i)`, but in for + * example Rust, post-processing may be needed to take implicit dereferencing and + * borrowing into account for the receiver type of a method call. + */ + bindingset[ctx] + default Type inferInvocationArgumentType( + Invocation invocation, ResolutionContext ctx, int i, TypePath path + ) { + result = inferTypeForDefaults(invocation.getArgument(i), path) and + exists(ctx) + } + + /** + * Gets the contextually inferred type of invocation argument `arg` at `path`. + * The context used is the target of the invocation, for example in + * + * ```rust + * let x = Vec::new(); + * x.push(42); + * ``` + * + * the `push` context allows us to infer that the type of `x` is `Vec`. + * + * This predicate must be implemented using `inferInvocationArgumentTypeContextualDefault`, + * performing the dual post-processing of `inferInvocationArgumentType`. + * + * When no post-processing is needed, simply implement this predicate as + * `result = inferInvocationArgumentTypeContextualDefault(_, _, _, arg, path)`. + */ + Type inferInvocationArgumentTypeContextual(Expr arg, TypePath path); + + /** + * Gets the inferred type of `invocation`, found by propagating type information + * out of the invocation via the target. + * + * When no post-processing is needed, simply implement this predicate as + * `result = inferInvocationTypeDefault(invocation, _, path)`. + */ + Type inferInvocationType(Invocation invocation, TypePath path); + + /** + * Gets the contextually inferred type of `invocation`, to be used when propagating + * type information out of the invocation via the declared type of the target. + * + * For example, in + * + * ```rust + * fn id(x: T) -> T { x } + * let x = Default::default(); + * let y : i32 = id(x); + * ``` + * + * knowing that the return type of `id(x)` is `i32` allows us to infer that + * the type of `x` is also `i32`. + * + * This predicate should perform the dual post-processing of `inferInvocationType`. + */ + default Type inferInvocationTypeContextual(Invocation invocation, TypePath path) { + result = inferTypeForDefaults(invocation, path) + } + + /** A closure/lambda expression. */ + class Closure extends Callable, Expr; + + /** + * A special pseudo type representing a particular closure parameter without + * a type annotation. + * + * For such parameters, we want to infer the type based on the context in which + * the closure occurs, and while we could do this by assigning the parameter the + * pseudo type `UnknownType`, this would mean that the parameter type could also + * be inferred from _within_ the closure body, which we want to avoid. + * + * There are two ways for type information to flow contextually into a closure + * parameter: (A) either by knowing the types of arguments, or (B) by knowing the + * return type. Only case B makes use of `ClosureParameterPseudoType`s. + * + * ### Case A + * + * ```rust + * let c = |x| (x, false); + * let r = c(0); + * ``` + * + * 1. `c` is assigned the type `Fn(UnknownType) -> ...`, + * 2. since `0` has type `i32`, we can infer the `c` has type `Fn(i32) -> ...`, and + * 3. using contextual inference, we conclude that `x` has type `i32`. + * + * ### Case B + * + * ```rust + * let c = |x| (x, false); + * let r: i32 = c(Default::default()).0; + * ``` + * + * 1. `x` is assigned the pseudo type `T_x`, + * 2. infer that the return type of `c` is `(T_x, bool)` and hence that `c` has type + * `Fn(...) -> (T_x, bool)`, + * 3. this enables us to detect that contextual inference is needed, so we also + * assign `c` the type `Fn(...) -> (UnknownType, bool)`, + * 4. infer that `c(Default::default()).0` must have `UnknownType`, + * 5. infer, using contextual inference, that `c` has type `Fn(...) -> (i32, bool)`, + * and finally + * 6. since `c` also has type `Fn(...) -> (T_x, bool)`, we conclude that `x` has type + * `i32` and hence that `c` has type `Fn(i32) -> (i32, bool)`. + * + * Note that steps 2, 4, and 5 are standard inference steps. + */ + class ClosureParameterPseudoType extends PseudoType { + /** Gets the closure parameter that this type represents. */ + Parameter getParameter(); + } + + /** Gets the root type of closure `c`, for example `Fn` in Rust or `Func` in C#. */ + bindingset[c] + Type getClosureType(Closure c); + + /** + * Gets the type path corresponding to closure parameter `p`. This should be + * a path into the `getClosureType(c)` type, where `c` is the closure that `p` + * belongs to. + */ + TypePath getClosureParameterTypePath(Parameter p); + + /** + * Gets the type path corresponding to the return type of closure `c`. This should be + * a path into the `getClosureType(c)` type. + */ + bindingset[c] + TypePath getClosureReturnTypePath(Closure c); + + /** + * Holds if `n1` having type `t` at `prefix1.suffix` implies that `n2` has type + * `t` at `prefix2.suffix`, for any `suffix`. + * + * Use this predicate to implement any language-specific bottom-up inference logic. + */ + predicate stepLanguageSpecific(AstNode n1, TypePath prefix1, AstNode n2, TypePath prefix2); + + /** + * Gets the inferred type of `n` at `path`. + * + * Use this predicate to implement any language-specific inference logic, but only for + * nodes where `stepLanguageSpecific` cannot be used, such as leaf nodes in the AST. + */ + Type inferTypeLanguageSpecific(AstNode n, TypePath path); + + /** + * Gets the inferred certain type of `n` at `path`. + * + * Use this predicate to implement any language-specific inference logic. + * + * Any tuples included in this predicate will also automatically be included + * in `inferTypeLanguageSpecific`; if in doubt, use `inferTypeLanguageSpecific` instead. + */ + default Type inferTypeCertainLanguageSpecific(AstNode n, TypePath path) { none() } + } + + module Make3 { + private import Input3 + + private predicate closureStep(AstNode pattern, TypePath prefix1, Closure c, TypePath prefix2) { + exists(Parameter p | + pattern = p.getPattern() and + p = c.getParameter(_) and + prefix1.isEmpty() and + prefix2 = getClosureParameterTypePath(p) + ) + } + + /** + * Provides logic for inferring certain type information. + * + * Unlike `inferType`, which may in general infer multiple types for a given node, + * `inferTypeCertain` will (ideally) only infer a single type for a given node, and + * `inferType` will not be allowed to infer types that are in conflict with known + * certain type information, which helps to avoid combinatorial explosions in the + * numbers of types inferred. + */ + private module Certain { + /** Gets the type of `n`, which has an explicit type annotation. */ + pragma[nomagic] + private Type inferAnnotatedType(AstNode n, TypePath path) { + exists(TypeMention tm | result = tm.getTypeAt(path) | + tm = n.(Cast).getType() + or + exists(VariableDeclaration decl | + tm = decl.getType() and + n = decl.getPattern() + ) + ) + or + exists(Closure c, TypePath suffix | + n = c and + result = getCallableReturnType(c, suffix) and + path = getClosureReturnTypePath(c).append(suffix) + ) + } + + predicate stepCertain(AstNode n1, TypePath prefix1, AstNode n2, TypePath prefix2) { + // language-specific inference steps are assumed to preserve certainty when + // they have a unique premise + stepLanguageSpecific(n1, prefix1, n2, prefix2) and + strictcount(AstNode n1_, TypePath prefix1_, TypePath prefix2_ | + stepLanguageSpecific(n1_, prefix1_, n2, prefix2_) + ) = 1 + or + prefix1.isEmpty() and + prefix2.isEmpty() and + ( + exists(Variable v | n1 = v.getDefiningNode() and n2 = v.getAnAccess()) + or + exists(VariableDeclaration decl | + not decl.isCoercionSite() and + n1 = decl.getInitializer() and + n2 = decl.getPattern() + ) + or + n1 = n2.(ParenExpr).getExpr() + ) + } + + pragma[nomagic] + private Type inferTypeFromStepCertain(AstNode n, TypePath path) { + exists(TypePath prefix1, AstNode n2, TypePath prefix2, TypePath suffix | + result = inferTypeCertain(n2, prefix2.appendInverse(suffix)) and + path = prefix1.append(suffix) + | + stepCertain(n2, prefix2, n, prefix1) + or + closureStep(n2, prefix2, n, prefix1) + ) + } + + /** + * Gets the inferred certain type of `n` at `prefix`, where `prefix` is a proper + * prefix of a unique bottom-up inference step for `n`. + * + * For example, if we have a rule for Rust array repeat expressions like + * + * ```text + * e : T + * -------------------- + * [e; n] : [T; n] + * ``` + * + * then this predicate allows us to infer that the root type of `[e; n]` is + * `[...; n]`, regardless of whether we are able to infer the type of `e`. + */ + pragma[nomagic] + private Type inferTypeFromStepPrefixCertain(AstNode n, TypePath prefix) { + exists(TypePath path, TypeParameter tp | + path.isSnoc(prefix, tp) and + result.getATypeParameter() = tp + | + path = + unique(TypePath path0 | + stepLanguageSpecific(_, TypePath::nil(), n, path0) + or + stepCertain(_, TypePath::nil(), n, path0) + or + closureStep(_, TypePath::nil(), n, path0) + ) + or + exists(inferTypeFromStepPrefixCertain(n, path)) + ) + } + + private Type inferLogicalOperationType(AstNode n, TypePath path) { + ( + exists(LogicalAndExpr lae | n = [lae, lae.getLeftOperand(), lae.getRightOperand()]) or + exists(LogicalOrExpr loe | n = [loe, loe.getLeftOperand(), loe.getRightOperand()]) + ) and + result instanceof BoolType and + path.isEmpty() + } + + /** Gets the inferred certain type of `n` at `path`. */ + cached + Type inferTypeCertain(AstNode n, TypePath path) { + ( + CachedStage::ref() and + result = Input3::inferTypeCertainLanguageSpecific(n, path) + or + result = inferAnnotatedType(n, path) + or + result = inferTypeFromStepCertain(n, path) + or + result = inferTypeFromStepPrefixCertain(n, path) + or + result = inferLogicalOperationType(n, path) + or + result = getClosureType(n) and + path.isEmpty() + or + infersCertainTypeAt(n, path, result.getATypeParameter()) + ) and + // type annotation may for example include unknown types, such as + // `x : Vec<_>` in Rust + not result instanceof PseudoType + } + + /** + * Holds if `n` has complete and certain type information at `path`. + */ + pragma[nomagic] + predicate hasInferredCertainType(AstNode n, TypePath path) { + exists(inferTypeCertain(n, path)) + } + + /** + * Holds if `n` has complete and certain type information at the type path + * `prefix.tp`. This entails that the type at `prefix` must be the type + * that declares `tp`. + */ + pragma[nomagic] + private predicate infersCertainTypeAt(AstNode n, TypePath prefix, TypeParameter tp) { + exists(TypePath path | + hasInferredCertainType(n, path) and + not path.isEmpty() and // implied by `isSnoc` below, but improves performance slightly + path.isSnoc(prefix, tp) + ) + } + + /** + * Holds if `n` having type `t` at `path` conflicts with certain type information + * at `prefix`. + */ + bindingset[n, prefix, path, t] + pragma[inline_late] + predicate certainTypeConflict(AstNode n, TypePath prefix, TypePath path, Type t) { + inferTypeCertain(n, path) != t + or + // If we infer that `n` has _some_ type at `T1.T2....Tn`, and we also + // know that `n` certainly has type `certainType` at `T1.T2...Ti`, `0 <= i < n`, + // then it must be the case that `T(i+1)` is a type parameter of `certainType`, + // otherwise there is a conflict. + // + // Below, `prefix` is `T1.T2...Ti` and `tp` is `T(i+1)`. + exists(TypePath suffix, TypeParameter tp, Type certainType | + path = prefix.appendInverse(suffix) and + tp = suffix.getHead() and + inferTypeCertain(n, prefix) = certainType and + not certainType.getATypeParameter() = tp + ) + } + } + + predicate inferTypeCertain = Certain::inferTypeCertain/2; + + private predicate step(AstNode n1, TypePath prefix1, AstNode n2, TypePath prefix2) { + stepLanguageSpecific(n1, prefix1, n2, prefix2) + or + Certain::stepCertain(n1, prefix1, n2, prefix2) + or + prefix1.isEmpty() and + prefix2.isEmpty() and + ( + exists(AssignExpr ae | + n1 = ae.getRightOperand() and + n2 = ae.getLeftOperand() + ) + or + exists(VariableDeclaration decl | + n1 = decl.getInitializer() and + n2 = decl.getPattern() + ) + or + exists(Switch switch | + n1 = switch.getExpr() and + n2 = switch.getCase(_).getAPattern() + ) + or + n1 = n2.(Switch).getCase(_).getBody() + or + n2 = any(ConditionalExpr ce | n1 = [ce.getThen(), ce.getElse()]) + or + exists(Return ret, Callable c | + n1 = ret.getExpr() and + c = getEnclosingCallable(ret) and + n2 = c.getBody() + ) + ) + or + exists(Closure c | + n1 = c.getBody() and + n2 = c and + prefix1.isEmpty() and + prefix2 = getClosureReturnTypePath(n2) + ) + } + + pragma[nomagic] + private Type inferTypeFromStep(AstNode n, TypePath path) { + exists(TypePath prefix1, AstNode n2, TypePath prefix2, TypePath suffix | + result = inferType(n2, prefix2.appendInverse(suffix)) and + path = prefix1.append(suffix) + | + step(n2, prefix2, n, prefix1) + or + closureStep(n2, prefix2, n, prefix1) and + // prevent closure parameter pseudo types from escaping the closure + not result.(ClosureParameterPseudoType).getParameter() = n.(Closure).getParameter(_) + ) + } + + /** + * A matching configuration for resolving types of field accesses like `x.field`. + */ + private module FieldAccessMatchingInput implements MatchingInputSig { + private newtype TDeclarationPosition = + TReceiverPosition() or + TFieldPosition() + + class DeclarationPosition extends TDeclarationPosition { + predicate isReceiver() { this = TReceiverPosition() } + + predicate isField() { this = TFieldPosition() } + + string toString() { + this.isReceiver() and + result = "receiver" + or + this.isField() and + result = "field" + } + } + + final private class FieldFinal = Field; + + class Declaration extends FieldFinal { + TypeParameter getTypeParameter(int pos) { none() } + + Type getDeclaredType(DeclarationPosition dpos, TypePath path) { + dpos.isReceiver() and + result = this.getDeclaringType().getTypeAt(path) + or + dpos.isField() and + result = this.getType().getTypeAt(path) + } + } + + class AccessPosition = DeclarationPosition; + + predicate accessDeclarationPositionMatch(AccessPosition apos, DeclarationPosition dpos) { + apos = dpos + } + + final private class FieldAccessFinal = FieldAccess; + + class Access extends FieldAccessFinal { + Type getTypeArgument(int pos, TypePath path) { none() } + + Type getInferredType(AccessPosition apos, TypePath path) { + apos.isReceiver() and + result = inferFieldAccessReceiverType(this, path) + or + apos.isField() and + result = inferType(this, path) + } + + Declaration getTarget() { result = this.getField() } + } + } + + private module FieldAccessMatching = Matching; + + pragma[nomagic] + private Type inferFieldAccessType(FieldAccess fa, TypePath path) { + exists(FieldAccessMatchingInput::DeclarationPosition pos | + result = FieldAccessMatching::inferAccessType(fa, pos, path) and + pos.isField() + ) + } + + /** + * Gets the contextually inferred type of field access receiver `receiver` + * at `path`. For more info, see the QL doc of + * `InputSig3::inferFieldAccessReceiverTypeContextual`. + */ + pragma[nomagic] + Type inferFieldAccessReceiverTypeContextualDefault( + FieldAccess fa, Expr receiver, TypePath path + ) { + exists(FieldAccessMatchingInput::DeclarationPosition pos | + result = FieldAccessMatching::inferAccessType(fa, pos, path) and + pos.isReceiver() and + receiver = fa.getReceiver() and + // `inferTypeContextualCand2` performs the proper check for contextual + // typing, but we can already rule out cases where receivers don't have + // an unknown type anywhere + ContextualTyping::hasUnknownType(receiver) + ) + } + + private Type getParameterizableReturnType(Parameterizable p, TypePath path) { + ( + result = getCallableReturnType(p, path) + or + not p instanceof Callable and + result = p.getType().getTypeAt(path) + ) + } + + final private class ParameterizableFinal = Parameterizable; + + final private class InvocationFinal = Invocation; + + /** + * A matching configuration for matching type qualifiers against type parameters + * of declaring types. + * + * While the type arguments of type qualifiers may often have to be matched + * directly against the corresponding type parameters, this need not always be the + * case. For example, in Rust, functions are not defined inside the type definitions, + * but rather inside `impl` blocks that will have their own type parameters: + * + * ```rust + * struct MyThing { ... } + * + * impl MyThing { + * fn foo(self) { ... } + * } + * + * MyThing::::foo(); + * // ^^^ should be matched against `A`, not `T` + * ``` + */ + private module InvocationTypeQualifierMatchingInput implements MatchingInputSig { + private import codeql.util.Unit + + class DeclarationPosition = Unit; + + class AccessPosition = Unit; + + predicate accessDeclarationPositionMatch(AccessPosition apos, DeclarationPosition dpos) { + apos = dpos + } + + class Declaration extends ParameterizableFinal { + Type getDeclaredType(DeclarationPosition dpos, TypePath path) { + result = this.getDeclaringType().getTypeAt(path) and + exists(dpos) + } + } + + bindingset[decl] + TypeMention getATypeParameterConstraint(TypeParameter tp, Declaration decl) { + result = Input2::getATypeParameterConstraint(tp) and + exists(decl) + or + result = decl.getAdditionalTypeParameterConstraint(tp) + } + + class Access extends InvocationFinal { + Access() { exists(this.getTypeQualifier(_)) } + + Type getInferredType(AccessPosition apos, TypePath path) { + result = this.getTypeQualifier(path) and + exists(apos) + } + + Declaration getTarget() { result = this.getATargetForTypeQualifierMatching() } + } + } + + private module InvocationTypeQualifierMatching = + Matching; + + /** + * A matching configuration for matching types of arguments against types of + * parameters. + */ + private module InvocationMatchingInput implements MatchingWithEnvironmentInputSig { + import InvocationTypeQualifierMatchingInput + + class DeclarationPosition = int; + + class AccessPosition = DeclarationPosition; + + bindingset[apos] + bindingset[dpos] + predicate accessDeclarationPositionMatch(AccessPosition apos, DeclarationPosition dpos) { + apos = dpos + } + + /** Gets the position used to represent the return type of an invocation. */ + additional int getReturnPosition() { + result = min(int i | i = 0 or exists(any(Parameterizable p).getParameter(i)) | i) - 1 + } + + private int getFirstTypeParameterPosition() { + result = min(int i | i = 0 or exists(any(Parameterizable p).getTypeParameter(i)) | i) + } + + private predicate typeQualifierMatch( + Invocation invocation, Parameterizable target, TypePath path, Type t, TypeParameter tp, + int pos + ) { + InvocationTypeQualifierMatching::typeMatch(invocation, _, target, path, t, tp) and + pos = getFirstTypeParameterPosition() - getRank(tp) - 2 + } + + class Declaration extends ParameterizableFinal { + TypeParameter getTypeParameter(int pos) { + // include type parameters that are matched via a type qualifier + typeQualifierMatch(_, this, _, _, result, pos) + or + // blanket implementations in Rust have a declaring type that is itself a + // type parameter; those should be matched against the entire type qualifier + result = this.getDeclaringType().getTypeAt(TypePath::nil()) and + pos = getFirstTypeParameterPosition() - 1 + or + result = super.getTypeParameter(pos) + } + + Type getDeclaredType(DeclarationPosition dpos, TypePath path) { + result = this.getParameter(dpos).getType().getTypeAt(path) + or + dpos = getReturnPosition() and + result = getParameterizableReturnType(this, path) + } + } + + bindingset[decl] + TypeMention getATypeParameterConstraint(TypeParameter tp, Declaration decl) { + result = InvocationTypeQualifierMatchingInput::getATypeParameterConstraint(tp, decl) + } + + class AccessEnvironment = ResolutionContext; + + class Access extends InvocationFinal { + Type getTypeArgument(int pos, TypePath path) { + // A type argument found by matching the type qualifier against the declaring + // type of the target + typeQualifierMatch(this, _, path, result, _, pos) + or + pos = getFirstTypeParameterPosition() - 1 and + result = this.getTypeQualifier(path) + or + result = super.getTypeArgument(pos, path) + } + + pragma[nomagic] + private Type getInferredReturnType(AccessPosition apos, TypePath path) { + result = inferInvocationTypeContextual(this, path) and + apos = getReturnPosition() + } + + bindingset[e] + Type getInferredType(AccessEnvironment e, AccessPosition apos, TypePath path) { + result = inferInvocationArgumentType(this, e, apos, path) + or + result = this.getInferredReturnType(apos, path) and + exists(e) + } + + Declaration getTarget(AccessEnvironment e) { result = super.getTarget(e) } + } + } + + private module InvocationMatching = MatchingWithEnvironment; + + /** + * Gets the inferred type of `invocation`, found by propagating type information + * out of the invocation via the target. For more info, see the QL doc of + * `InputSig3::inferInvocationType`. + */ + pragma[nomagic] + Type inferInvocationTypeDefault(Invocation invocation, ResolutionContext ctx, TypePath path) { + result = + InvocationMatching::inferAccessType(invocation, ctx, + InvocationMatchingInput::getReturnPosition(), path) + } + + /** + * Gets the contextually inferred type of call argument `arg` at `path`. For more info, + * see the QL doc of `InputSig3::inferInvocationArgumentTypeContextual`. + */ + pragma[nomagic] + Type inferInvocationArgumentTypeContextualDefault( + Invocation invocation, ResolutionContext ctx, int pos, Expr arg, TypePath path + ) { + arg = invocation.getArgument(pos) and + result = InvocationMatching::inferAccessType(invocation, ctx, pos, path) and + // `inferTypeContextualCand2` performs the proper check for contextual + // typing, but we can already rule out cases where arguments don't have + // an unknown type anywhere + ContextualTyping::hasUnknownType(arg) + } + + /** + * Provides logic related to contextual typing. By default, types are inferred + * bottom-up, but when AST nodes have an explicit `UnknownType`, contextual typing is + * allowed. + * + * This module identifies calls where the return type may need to be inferred from the + * context, and also implements logic for performing contextual inference. + */ + private module ContextualTyping { + pragma[nomagic] + private TypeParameter getAConstrained(TypeParameter tp) { + result = getATypeParameterConstraint(tp).getTypeAt(_) + } + + /** + * Holds if parameterizable `p` mentions type parameter `tp` at some parameter, + * possibly via a constraint on another mentioned type parameter. + */ + pragma[nomagic] + private predicate mentionsTypeParameterAtParameter(Parameterizable p, TypeParameter tp) { + tp = getAConstrained*(p.getParameter(_).getType().getTypeAt(_)) + } + + /** + * Holds if the return type of the parameterizable `p` at `path` is type parameter + * `tp`, and `tp` does not appear in the type of any parameter of `p`. + * + * In this case, the context in which `p` is called may be needed to infer + * the instantiation of `tp`. + * + * This covers functions like `Default::default` and `Vec::new` in Rust. + */ + pragma[nomagic] + private predicate parameterizableReturnContextTypedAt( + Parameterizable p, TypePath path, TypeParameter tp + ) { + tp = getParameterizableReturnType(p, path) and + not mentionsTypeParameterAtParameter(p, tp) + } + + bindingset[invocation, target] + pragma[inline_late] + private predicate hasTypeArgument( + Invocation invocation, Parameterizable target, TypeParameter tp + ) { + exists(Type t | + InvocationTypeQualifierMatching::typeMatch(invocation, _, _, _, t, tp) and + not t instanceof PseudoType + ) + or + exists(InvocationMatching::getTypeArgument(invocation, target, tp, _)) + } + + /** + * Holds if `invocation` resolves to some target where the return type at `path` + * may have to be inferred from the context. + */ + pragma[nomagic] + predicate needsContextualTyping(Invocation invocation, TypePath path) { + exists(Parameterizable target, TypeParameter tp | + target = invocation.getATargetForTypeQualifierMatching() + or + target = invocation.getTarget(_) + | + parameterizableReturnContextTypedAt(target, path, tp) and + // check that no explicit type arguments have been supplied that bind `tp` + not exists(TypeParameter supplied | + tp = getAConstrained*(supplied) and + hasTypeArgument(invocation, target, supplied) + ) + ) + } + + pragma[nomagic] + private predicate hasUnknownTypeAt(AstNode n, TypePath path) { + inferType(n, path) instanceof UnknownType + } + + pragma[nomagic] + predicate hasUnknownType(AstNode n) { hasUnknownTypeAt(n, _) } + + pragma[nomagic] + private Type inferTypeContextualCand0(AstNode n, TypePath path) { + exists(Callable c | + n = c.getBody() and + result = getCallableReturnType(c, path) + ) + or + result = inferInvocationArgumentTypeContextual(n, path) + or + result = inferFieldAccessReceiverTypeContextual(n, path) + or + // steps are reversed in contextual typing + exists(TypePath path1, AstNode n2, TypePath path2, TypePath suffix | + result = inferType(n2, path2.appendInverse(suffix)) and + path = path1.append(suffix) and + step(n, path1, n2, path2) + ) + } + + pragma[nomagic] + private Type inferTypeContextualCand1(AstNode n, TypePath prefix, TypePath path) { + result = inferTypeContextualCand0(n, path) and + hasUnknownType(n) and + prefix = path.getAPrefix() and + // no need to propagate `UnknownType`s contextually; `n` must already have an + // `UnknownType` at some prefix of `path` + not result instanceof UnknownType + } + + pragma[nomagic] + private Type inferTypeContextualCand2(AstNode n, TypePath path) { + exists(TypePath prefix | + result = inferTypeContextualCand1(n, prefix, path) and + hasUnknownTypeAt(n, prefix) + ) + } + + /** + * Holds if `n` has `UnknownType` at some prefix of non-empty path `path`, and + * contextual inference is allowed at `path`. This is the case only if `path` is + * compatible with an already inferred type (contextually or not). + */ + pragma[nomagic] + private predicate isValidContextualNonEmptyPath(AstNode n, TypePath path) { + hasUnknownType(n) and + exists(TypePath prefix, TypeParameter tp | + tp = inferType(n, prefix).getATypeParameter() and + path = TypePath::snoc(prefix, tp) + ) + } + + /** + * Gets the contextually inferred type of `n` at `path`, if any. This is only + * allowed when `n` has `UnknownType` at some prefix of `path`, and furthermore + * if `path` is non-empty, then it must be compatible with an already inferred + * type (contextually or not). + */ + pragma[nomagic] + Type inferTypeContextual(AstNode n, TypePath path) { + result = inferTypeContextualCand2(n, path) and + ( + path.isEmpty() + or + isValidContextualNonEmptyPath(n, path) + ) + } + } + + private module ClosureTyping { + pragma[nomagic] + private predicate hasClosureParameterPseudoType(AstNode n, Parameter p, TypePath path) { + // use `inferTypeCand` to also detect propagation into enclosing closure + p = inferTypeCand(n, path).(ClosureParameterPseudoType).getParameter() + } + + pragma[nomagic] + private predicate hasClosureParameterPseudoType(AstNode n) { + hasClosureParameterPseudoType(n, _, _) + } + + pragma[nomagic] + private predicate hasTypeAt(AstNode n, TypePath path) { exists(inferType(n, path)) } + + pragma[nomagic] + private predicate hasTypeAtPrefix(AstNode n, TypePath prefix, TypePath path) { + hasTypeAt(n, path) and + hasClosureParameterPseudoType(n) and + prefix = path.getAPrefix() + } + + pragma[nomagic] + private predicate hasClosureParameterPseudoType( + AstNode n, TypePath path, AstNode pattern, TypePath suffix + ) { + exists(Parameter p, TypePath prefix | + hasClosureParameterPseudoType(n, p, prefix) and + hasTypeAtPrefix(n, prefix, path) and + path = prefix.appendInverse(suffix) and + pattern = p.getPattern() + ) + } + + pragma[nomagic] + private Type inferClosureParameterTypeCand(AstNode n, TypePath path) { + result = inferType(n, path) and + hasClosureParameterPseudoType(n) + } + + private Type inferClosureParameterPseudoType(AstNode n, TypePath path) { + // The `step X` comments below refer to the steps for 'Case B' in the + // QL doc for `ClosureParameterPseudoType`. + exists(Closure c, Parameter p | p = c.getParameter(_) | + // step 1 + n = p.getPattern() and + path.isEmpty() and + not exists(p.getType()) and + result.(ClosureParameterPseudoType).getParameter() = p + or + // step 3 + hasClosureParameterPseudoType(c, p, path) and + n = c and + result instanceof UnknownType + ) + or + // step 6 + exists(AstNode n0, TypePath path0 | + hasClosureParameterPseudoType(n0, path0, n, path) and + result = inferClosureParameterTypeCand(n0, path0) and + not (path.isEmpty() and result instanceof UnknownType) + ) + } + + Type inferClosureType(AstNode n, TypePath path) { + result = inferClosureParameterPseudoType(n, path) + or + // The `step X` comments below refer to the steps for 'Case A' in the + // QL doc for `ClosureParameterPseudoType`. + exists(Closure c, Parameter p | + p = c.getParameter(_) and + not exists(p.getType()) + | + // step 1 + n = c and + path = getClosureParameterTypePath(p) and + result instanceof UnknownType + or + // step 3 + n = p.getPattern() and + result = inferType(c, getClosureParameterTypePath(p).appendInverse(path)) and + not (path.isEmpty() and result instanceof UnknownType) + ) + } + } + + private Type inferTypeCand(AstNode n, TypePath path) { + result = Input3::inferTypeLanguageSpecific(n, path) + or + result = inferTypeFromStep(n, path) + or + result = inferInvocationType(n, path) + or + result = inferFieldAccessType(n, path) + or + result = ClosureTyping::inferClosureType(n, path) + or + ( + ContextualTyping::needsContextualTyping(n, path) + or + exists(VariableDeclaration decl | + n = decl.getPattern() and + not exists(decl.getInitializer()) and + not exists(decl.getType()) and + not n = any(Parameter p).getPattern() and // closure parameters are handled in `ClosureTyping` + path.isEmpty() + ) + ) and + result instanceof UnknownType + or + result = ContextualTyping::inferTypeContextual(n, path) + } + + /** + * Gets the inferred type of `n` at `path`. + */ + cached + Type inferType(AstNode n, TypePath path) { + CachedStage::ref() and + result = inferTypeCertain(n, path) + or + result = inferTypeCand(n, path) and + // Don't propagate type information into a node which conflicts with certain + // type information. + forall(TypePath prefix | + Certain::hasInferredCertainType(n, prefix) and + prefix.isPrefixOf(path) + | + not Certain::certainTypeConflict(n, prefix, path, result) + or + // propagate closure parameter pseudo types even when there is certain information + result instanceof ClosureParameterPseudoType + ) and + // prevent closure parameter pseudo types from escaping from the closure + not result.(ClosureParameterPseudoType).getParameter() = n.(Closure).getParameter(_) + or + // If `n` has an explicitly unknown type at `prefix` and at the same time a certain + // type at `prefix.suffix`, then extend the unknown type information to any path + // extending `prefix.suffix` where there is not also certain type information + exists(TypePath prefix, TypePath suffix, Type certain, TypeParameter tp | + inferTypeCand(n, prefix) instanceof UnknownType and + certain = inferTypeCertain(n, prefix.appendInverse(suffix)) and + tp = certain.getATypeParameter() and + path = prefix.append(suffix).append(TypePath::singleton(tp)) and + not exists(inferTypeCertain(n, path)) and + result instanceof UnknownType + ) + or + infersTypeAt(n, path, result.getATypeParameter()) + } + + /** + * Holds if `n` has type information at the type path `prefix.tp`. This entails + * that the type at `prefix` must be the type that declares `tp`. + */ + pragma[nomagic] + private predicate infersTypeAt(AstNode n, TypePath prefix, TypeParameter tp) { + exists(TypePath path | + exists(inferType(n, path)) and + not path.isEmpty() and // implied by `isSnoc` below, but improves performance slightly + path.isSnoc(prefix, tp) + ) + } + + /** + * Gets the inferred root type of `n`, if any. + */ + pragma[nomagic] + Type inferType(AstNode n) { result = inferType(n, TypePath::nil()) } + + /** + * The cached stage of this module. + * + * Should not be exposed. + */ + cached + module CachedStage { + /** Reference to the cached stage of this module. */ + cached + predicate ref() { any() } + + /** Reverse references to the predicates that reference `ref()`. */ + cached + predicate revRef() { + any() + or + cacheRevRef() + or + (exists(inferTypeCertain(_, _)) implies any()) + or + (exists(inferType(_, _)) implies any()) + } + } + + /** + * Provides consistency checks, including those from `Make2::Consistency`. + */ + module Consistency { + import Consistency2 + + query predicate nonUniqueUnknownType() { strictcount(UnknownType t) > 1 } + + query predicate closureParameterPseudoTypeOverlyBroad(ClosureParameterPseudoType t) { + t.getParameter() = + any(Parameter p | + exists(p.getType()) + or + not p = any(Closure c).getParameter(_) + ) + } + + query predicate closureParameterPseudoTypeMissing(Closure c, Parameter p) { + p = c.getParameter(_) and + not exists(p.getType()) and + not p = any(ClosureParameterPseudoType t).getParameter() + } + + query predicate nonUniqueCertainType(AstNode n, TypePath path) { + strictcount(inferTypeCertain(n, path)) > 1 + } + + /** + * Checks that `Input3::inferTypeForDefaults` is an alias for `inferType`. + */ + query predicate inferTypeForDefaultsMismatch(AstNode n, TypePath path, Type t) { + inferType(n, path) = t and + not Input3::inferTypeForDefaults(n, path) = t + or + Input3::inferTypeForDefaults(n, path) = t and + not inferType(n, path) = t + } + } + + /** + * Holds if the textual representation `repr` should be used for `n` in + * `TypeTest`. + */ + signature predicate typeTestAstNodeReprSig(AstNode n, string repr); + + /** + * Provides an inline testing configuration for type inference. Each inline + * expectation is optional and of the form + * + * ``` + * {type,certainType}=[@]: + * ``` + * + * Omitting `@` means the empty type path. + * + * For example, the following expectations assert that the type of `x` is `bool` + * and that the type of `vec` is `Vec`: + * + * ```rust + * let x = true; // type=x:bool + * let vec = Vec::new(); // type=vec@Vec:bool + * vec.push(x); + * ``` + * + * Note that the annotation `type=vec:Vec`, while valid, is redundant since it + * is implied by the annotation above. + */ + module TypeTest { + string getARelevantTag() { result = ["type", "certainType"] } + + predicate hasActualResult(Location location, string element, string tag, string value) { + none() + } + + predicate hasOptionalResult(Location location, string element, string tag, string value) { + exists(AstNode n, TypePath path, Type t, string at | + location = n.getLocation() and + (if path.isEmpty() then at = "" else at = "@" + TypePath::printTypePathVerbose(path)) and + value = element + at + ":" + t.toString() and + typeTestAstNodeRepr(n, element) + | + t = inferType(n, path) and + tag = "type" + or + t = inferTypeCertain(n, path) and + tag = "certainType" + ) + } + } + + /** Provides various debugging predicates. */ + module Debug { + /** + * Holds if `n` has reached the type path limit. This is usually indicative + * of an unintended type inference explosion. + */ + pragma[nomagic] + predicate atLimit(AstNode n) { + exists(TypePath path0 | + exists(inferType(n, path0)) and path0.length() >= getTypePathLimit() + ) + } + + Type inferTypeForNodeAtLimit(AstNode n, TypePath path) { + result = inferType(n, path) and + atLimit(n) + } + + predicate countTypesForNodeAtLimit(AstNode n, int c) { + c = strictcount(Type t, TypePath path | t = inferTypeForNodeAtLimit(n, path)) + } + + pragma[nomagic] + private int countTypesAtPath(AstNode n, TypePath path, Type t) { + t = inferType(n, path) and + result = strictcount(Type t0 | t0 = inferType(n, path)) + } + + predicate maxTypes(AstNode n, TypePath path, Type t, int c) { + c = countTypesAtPath(n, path, t) and + c = max(countTypesAtPath(_, _, _)) + } + + pragma[nomagic] + private predicate typePathLength(AstNode n, TypePath path, Type t, int len) { + t = inferType(n, path) and + len = path.length() + } + + predicate maxTypePath(AstNode n, TypePath path, Type t, int len) { + typePathLength(n, path, t, len) and + len = max(int i | typePathLength(_, _, _, i)) + } + + pragma[nomagic] + private int countTypePaths(AstNode n, TypePath path, Type t) { + t = inferType(n, path) and + result = strictcount(TypePath path0, Type t0 | t0 = inferType(n, path0)) + } + + predicate maxTypePaths(AstNode n, TypePath path, Type t, int c) { + c = countTypePaths(n, path, t) and + c = max(countTypePaths(_, _, _)) + } + } + } } } diff --git a/shared/util/codeql/util/UnboundList.qll b/shared/util/codeql/util/UnboundList.qll index 6f05d6cddfc2..409116bc60b9 100644 --- a/shared/util/codeql/util/UnboundList.qll +++ b/shared/util/codeql/util/UnboundList.qll @@ -191,5 +191,12 @@ module Make Input> { */ bindingset[suffix] UnboundList cons(Element e, UnboundList suffix) { result = singleton(e).append(suffix) } + + /** + * Gets the list obtained by appending the singleton list `e` + * after `prefix`. + */ + bindingset[prefix] + UnboundList snoc(UnboundList prefix, Element e) { result = prefix.append(singleton(e)) } } } From 174a9ef5c7ba3d4e934c9b5a8576132fa540acb0 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 6 Jul 2026 10:12:40 +0200 Subject: [PATCH 0964/2098] Rust: Type inference 2.0 --- .../lib/codeql/rust/internal/CachedStages.qll | 32 +- .../typeinference/BlanketImplementation.qll | 3 +- .../typeinference/FunctionOverloading.qll | 33 +- .../internal/typeinference/FunctionType.qll | 3 +- .../rust/internal/typeinference/Type.qll | 37 +- .../internal/typeinference/TypeInference.qll | 1758 ++++++++------ .../TypeInferenceConsistency.qll | 8 +- .../internal/typeinference/TypeMention.qll | 35 +- .../PathResolutionConsistency.expected | 2 + .../TypeInferenceConsistency.expected | 4 - .../PathResolutionConsistency.expected | 1 - .../library-tests/type-inference/closure.rs | 6 +- .../type-inference/dereference.rs | 2 +- .../test/library-tests/type-inference/main.rs | 28 +- .../type-inference/overloading.rs | 2 +- .../type-inference/pattern_matching.rs | 6 +- .../type-inference/type-inference.expected | 2034 +++++++---------- .../type-inference/type-inference.ql | 30 +- 18 files changed, 1949 insertions(+), 2075 deletions(-) create mode 100644 rust/ql/test/library-tests/dataflow/models/CONSISTENCY/PathResolutionConsistency.expected delete mode 100644 rust/ql/test/library-tests/dataflow/sources/web_frameworks/CONSISTENCY/TypeInferenceConsistency.expected diff --git a/rust/ql/lib/codeql/rust/internal/CachedStages.qll b/rust/ql/lib/codeql/rust/internal/CachedStages.qll index 4e3874a9282a..020cf83188e7 100644 --- a/rust/ql/lib/codeql/rust/internal/CachedStages.qll +++ b/rust/ql/lib/codeql/rust/internal/CachedStages.qll @@ -30,6 +30,8 @@ import rust * The `backref` predicate starts with `1 = 1 or` to ensure that the predicate will be optimized down to a constant by the optimizer. */ module Stages { + private import codeql.rust.internal.typeinference.TypeInference as TypeInference + /** * The abstract syntex tree (AST) stage. */ @@ -126,35 +128,7 @@ module Stages { /** * The type inference stage. */ - cached - module TypeInferenceStage { - private import codeql.rust.internal.typeinference.Type - private import codeql.rust.internal.typeinference.TypeInference - private import codeql.rust.dataflow.internal.ModelsAsData - - /** - * Always holds. - * Ensures that a predicate is evaluated as part of the type inference stage. - */ - cached - predicate ref() { 1 = 1 } - - /** - * DO NOT USE! - * - * Contains references to each predicate that use the above `ref` predicate. - */ - cached - predicate backref() { - 1 = 1 - or - exists(Type t) - or - exists(inferType(_)) - or - mayInvokeCallback(_, _) - } - } + module TypeInferenceStage = TypeInference::CachedStage; /** * The data flow stage. diff --git a/rust/ql/lib/codeql/rust/internal/typeinference/BlanketImplementation.qll b/rust/ql/lib/codeql/rust/internal/typeinference/BlanketImplementation.qll index 7c56300f3581..68242aa41d36 100644 --- a/rust/ql/lib/codeql/rust/internal/typeinference/BlanketImplementation.qll +++ b/rust/ql/lib/codeql/rust/internal/typeinference/BlanketImplementation.qll @@ -96,8 +96,7 @@ module SatisfiesBlanketConstraint< Type getTypeAt(TypePath path) { result = at.getTypeAt(blanketPath.appendInverse(path)) and - not result = TNeverType() and - not result = TUnknownType() + not result instanceof PseudoType } string toString() { result = at.toString() + " [blanket at " + blanketPath.toString() + "]" } diff --git a/rust/ql/lib/codeql/rust/internal/typeinference/FunctionOverloading.qll b/rust/ql/lib/codeql/rust/internal/typeinference/FunctionOverloading.qll index 9af026149cc9..6f7aa7b50f33 100644 --- a/rust/ql/lib/codeql/rust/internal/typeinference/FunctionOverloading.qll +++ b/rust/ql/lib/codeql/rust/internal/typeinference/FunctionOverloading.qll @@ -166,9 +166,9 @@ predicate traitTypeParameterOccurrence( } pragma[nomagic] -private predicate functionResolutionDependsOnArgumentCand( - ImplItemNode impl, Function f, string functionName, TypeParameter traitTp, FunctionPosition pos, - TypePath path +predicate functionResolutionDependsOnArgumentCand( + ImplItemNode impl, Function f, string functionName, TypeParamTypeParameter traitTp, + FunctionPosition pos, TypePath path ) { /* * As seen in the example below, when an implementation has a sibling for a @@ -199,12 +199,14 @@ private predicate functionResolutionDependsOnArgumentCand( ) } -private predicate functionResolutionDependsOnPositionalArgumentCand( - ImplItemNode impl, Function f, string functionName, TypeParameter traitTp +pragma[nomagic] +predicate functionResolutionDependsOnPositionalArgumentCand( + ImplItemNode impl, Function f, string functionName, TypeParamTypeParameter traitTp, int pos, + TypePath path ) { - exists(FunctionPosition pos | - functionResolutionDependsOnArgumentCand(impl, f, functionName, traitTp, pos, _) and - pos.isPosition() + exists(FunctionPosition pos0 | + functionResolutionDependsOnArgumentCand(impl, f, functionName, traitTp, pos0, path) and + pos = pos0.asPosition() ) } @@ -223,7 +225,7 @@ private Type getAssocFunctionNonTypeParameterTypeAt( */ pragma[nomagic] private predicate hasEquivalentPositionalSibling( - ImplItemNode impl, ImplItemNode sibling, Function f, TypeParameter traitTp + ImplItemNode impl, ImplItemNode sibling, Function f, TypeParamTypeParameter traitTp ) { exists(string functionName, FunctionPosition pos, TypePath path | functionResolutionDependsOnArgumentCand(impl, f, functionName, traitTp, pos, path) and @@ -255,7 +257,7 @@ private predicate hasEquivalentPositionalSibling( * * `traitTp` is a type parameter of the trait being implemented by `impl`, and * we need to check that the type of `f` corresponding to `traitTp` is satisfied - * at any one of the positions `pos` in which that type occurs in `f`. + * at any one of the positions `pos` in which that type occurs at `path` in `f`. * * Type parameters that only occur in return positions are only included when * all other type parameters that occur in a positional position are insufficient @@ -283,19 +285,20 @@ private predicate hasEquivalentPositionalSibling( */ pragma[nomagic] predicate functionResolutionDependsOnArgument( - ImplItemNode impl, Function f, TypeParameter traitTp, FunctionPosition pos + ImplItemNode impl, Function f, TypeParamTypeParameter traitTp, FunctionPosition pos, TypePath path ) { exists(string functionName | - functionResolutionDependsOnArgumentCand(impl, f, functionName, traitTp, pos, _) + functionResolutionDependsOnArgumentCand(impl, f, functionName, traitTp, pos, path) | - if functionResolutionDependsOnPositionalArgumentCand(impl, f, functionName, traitTp) + if functionResolutionDependsOnPositionalArgumentCand(impl, f, functionName, traitTp, _, _) then any() else // `traitTp` only occurs in return position; check that it is indeed needed for disambiguation exists(ImplItemNode sibling | implSiblings(_, impl, sibling) and - forall(TypeParameter otherTraitTp | - functionResolutionDependsOnPositionalArgumentCand(impl, f, functionName, otherTraitTp) + forall(TypeParamTypeParameter otherTraitTp | + functionResolutionDependsOnPositionalArgumentCand(impl, f, functionName, otherTraitTp, _, + _) | hasEquivalentPositionalSibling(impl, sibling, f, otherTraitTp) ) diff --git a/rust/ql/lib/codeql/rust/internal/typeinference/FunctionType.qll b/rust/ql/lib/codeql/rust/internal/typeinference/FunctionType.qll index d128875eda7e..730be63db6a6 100644 --- a/rust/ql/lib/codeql/rust/internal/typeinference/FunctionType.qll +++ b/rust/ql/lib/codeql/rust/internal/typeinference/FunctionType.qll @@ -329,8 +329,7 @@ module ArgIsInstantiationOf { private import Type as T private import codeql.rust.elements.internal.generated.Raw @@ -37,62 +29,12 @@ private module Input1 implements InputSig1 { class Type = T::Type; - predicate isPseudoType(Type t) { - t instanceof UnknownType or - t instanceof NeverType - } + class PseudoType = T::PseudoType; class TypeParameter = T::TypeParameter; class TypeAbstraction = TA::TypeAbstraction; - class TypeArgumentPosition extends TTypeArgumentPosition { - int asMethodTypeArgumentPosition() { this = TMethodTypeArgumentPosition(result) } - - TypeParam asTypeParam() { this = TTypeParamTypeArgumentPosition(result) } - - string toString() { - result = this.asMethodTypeArgumentPosition().toString() - or - result = this.asTypeParam().toString() - } - } - - private newtype TTypeParameterPosition = - TTypeParamTypeParameterPosition(TypeParam tp) or - TImplicitTypeParameterPosition() - - class TypeParameterPosition extends TTypeParameterPosition { - TypeParam asTypeParam() { this = TTypeParamTypeParameterPosition(result) } - - /** - * Holds if this is the implicit type parameter position used to represent - * parameters that are never passed explicitly as arguments. - */ - predicate isImplicit() { this = TImplicitTypeParameterPosition() } - - string toString() { - result = this.asTypeParam().toString() - or - result = "Implicit" and this.isImplicit() - } - } - - /** Holds if `typeParam`, `param` and `ppos` all concern the same `TypeParam`. */ - additional predicate typeParamMatchPosition( - TypeParam typeParam, TypeParamTypeParameter param, TypeParameterPosition ppos - ) { - typeParam = param.getTypeParam() and typeParam = ppos.asTypeParam() - } - - bindingset[apos] - bindingset[ppos] - predicate typeArgumentParameterPositionMatch(TypeArgumentPosition apos, TypeParameterPosition ppos) { - apos.asTypeParam() = ppos.asTypeParam() - or - apos.asMethodTypeArgumentPosition() = ppos.asTypeParam().getPosition() - } - int getTypeParameterId(TypeParameter tp) { tp = rank[result](TypeParameter tp0, int kind, int id1, int id2 | @@ -272,26 +214,6 @@ private module M2 = Make2; import M2 -module Consistency { - import M2::Consistency - - private Type inferCertainTypeAdj(AstNode n, TypePath path) { - result = CertainTypeInference::inferCertainType(n, path) and - not result = TNeverType() - } - - predicate nonUniqueCertainType(AstNode n, TypePath path, Type t) { - strictcount(inferCertainTypeAdj(n, path)) > 1 and - t = inferCertainTypeAdj(n, path) and - // Suppress the inconsistency if `n` is a self parameter and the type - // mention for the self type has multiple types for a path. - not exists(ImplItemNode impl, TypePath selfTypePath | - n = impl.getAnAssocItem().(Function).getSelfParam() and - strictcount(impl.(Impl).getSelfTy().(TypeMention).getTypeAt(selfTypePath)) > 1 - ) - } -} - /** A function without a `self` parameter. */ private class NonMethodFunction extends Function { NonMethodFunction() { not this.hasSelfParam() } @@ -329,134 +251,12 @@ private class FunctionDeclaration extends Function { or this = i.asSome().getAnAssocItem() } - - TypeParam getTypeParam(ImplOrTraitItemNodeOption i) { - i = parent and - result = [this.getGenericParamList().getATypeParam(), i.asSome().getTypeParam(_)] - } - - TypeParameter getTypeParameter(ImplOrTraitItemNodeOption i, TypeParameterPosition ppos) { - typeParamMatchPosition(this.getTypeParam(i), result, ppos) - or - // For every `TypeParam` of this function, any associated types accessed on - // the type parameter are also type parameters. - ppos.isImplicit() and - result.(TypeParamAssociatedTypeTypeParameter).getTypeParam() = this.getTypeParam(i) - or - i = parent and - ( - ppos.isImplicit() and result = TSelfTypeParameter(i.asSome()) - or - ppos.isImplicit() and result.(AssociatedTypeTypeParameter).getTrait() = i.asSome() - or - ppos.isImplicit() and this = result.(ImplTraitTypeTypeParameter).getFunction() - ) - } - - pragma[nomagic] - Type getParameterType(ImplOrTraitItemNodeOption i, FunctionPosition pos, TypePath path) { - i = parent and - ( - not pos.isReturn() and - result = getAssocFunctionTypeAt(this, i.asSome(), pos, path) - or - i.isNone() and - result = this.getParam(pos.asPosition()).getTypeRepr().(TypeMention).getTypeAt(path) - ) - } - - private Type resolveRetType(ImplOrTraitItemNodeOption i, TypePath path) { - i = parent and - ( - result = - getAssocFunctionTypeAt(this, i.asSome(), any(FunctionPosition ret | ret.isReturn()), path) - or - i.isNone() and - result = getReturnTypeMention(this).getTypeAt(path) - ) - } - - Type getReturnType(ImplOrTraitItemNodeOption i, TypePath path) { - if this.isAsync() - then - i = parent and - path.isEmpty() and - result = getFutureTraitType() - or - exists(TypePath suffix | - result = this.resolveRetType(i, suffix) and - path = TypePath::cons(getDynFutureOutputTypeParameter(), suffix) - ) - else result = this.resolveRetType(i, path) - } - - string toStringExt(ImplOrTraitItemNode i) { - i = parent.asSome() and - if this = i.getAnAssocItem() - then result = this.toString() - else - result = this + " [" + [i.(Impl).getSelfTy().toString(), i.(Trait).getName().toString()] + "]" - } } private class AssocFunctionDeclaration extends FunctionDeclaration { AssocFunctionDeclaration() { this.isAssoc(_) } } -pragma[nomagic] -private TypeMention getCallExprTypeMentionArgument(CallExpr ce, TypeArgumentPosition apos) { - exists(Path p, int i | p = CallExprImpl::getFunctionPath(ce) | - apos.asTypeParam() = resolvePath(p).getTypeParam(pragma[only_bind_into](i)) and - result = getPathTypeArgument(p, pragma[only_bind_into](i)) - ) -} - -pragma[nomagic] -private Type getCallExprTypeArgument(CallExpr ce, TypeArgumentPosition apos, TypePath path) { - result = getCallExprTypeMentionArgument(ce, apos).getTypeAt(path) - or - // Handle constructions that use `Self(...)` syntax - exists(Path p, TypePath path0 | - p = CallExprImpl::getFunctionPath(ce) and - result = p.(TypeMention).getTypeAt(path0) and - path0.isCons(TTypeParamTypeParameter(apos.asTypeParam()), path) - ) -} - -/** Gets the type annotation that applies to `n`, if any. */ -private TypeMention getTypeAnnotation(AstNode n) { - exists(LetStmt let | - n = let.getPat() and - result = let.getTypeRepr() - ) - or - result = n.(SelfParam).getTypeRepr() - or - exists(Param p | - n = p.getPat() and - result = p.getTypeRepr() - ) -} - -/** Gets the type of `n`, which has an explicit type annotation. */ -pragma[nomagic] -private Type inferAnnotatedType(AstNode n, TypePath path) { - result = getTypeAnnotation(n).getTypeAt(path) - or - result = n.(ShorthandSelfParameterMention).getTypeAt(path) -} - -pragma[nomagic] -private Type inferFunctionBodyType(AstNode n, TypePath path) { - exists(Function f | - n = f.getFunctionBody() and - result = getReturnTypeMention(f).getTypeAt(path) and - not exists(ImplTraitReturnType i | i.getFunction() = f | - result = i or result = i.getATypeParameter() - ) - ) -} - /** * Holds if `me` is a call to the `panic!` macro. * @@ -468,283 +268,12 @@ private predicate isPanicMacroCall(MacroExpr me) { me.getMacroCall().resolveMacro().(MacroRules).getName().getText() = "panic" } -// Due to "binding modes" the type of the pattern is not necessarily the -// same as the type of the initializer. However, when the pattern is an -// identifier pattern, its type is guaranteed to be the same as the type of the -// initializer. -private predicate identLetStmt(LetStmt let, IdentPat lhs, Expr rhs) { - let.getPat() = lhs and - let.getInitializer() = rhs -} - -/** - * Gets the root type of a closure. - * - * We model closures as `dyn Fn` trait object types. A closure might implement - * only `Fn`, `FnMut`, or `FnOnce`. But since `Fn` is a subtrait of the others, - * giving closures the type `dyn Fn` works well in practice -- even if not - * entirely accurate. - */ -private DynTraitType closureRootType() { - result = TDynTraitType(any(FnTrait t)) // always exists because of the mention in `builtins/mentions.rs` -} - -/** Gets the path to a closure's return type. */ -private TypePath closureReturnPath() { - result = - TypePath::singleton(TDynTraitTypeParameter(any(FnTrait t), any(FnOnceTrait t).getOutputType())) -} - -/** Gets the path to a closure's `index`th parameter type, where the arity is `arity`. */ -pragma[nomagic] -private TypePath closureParameterPath(int arity, int index) { - result = - TypePath::cons(TDynTraitTypeParameter(_, any(FnTrait t).getTypeParam()), - TypePath::singleton(getTupleTypeParameter(arity, index))) -} - -/** Module for inferring certain type information. */ -module CertainTypeInference { - pragma[nomagic] - private predicate callResolvesTo(CallExpr ce, Path p, Function f) { - p = CallExprImpl::getFunctionPath(ce) and - f = resolvePath(p) - } - - pragma[nomagic] - private Type getCallExprType(CallExpr ce, Path p, FunctionDeclaration f, TypePath path) { - exists(ImplOrTraitItemNodeOption i | - callResolvesTo(ce, p, f) and - result = f.getReturnType(i, path) and - f.isDirectlyFor(i) - ) - } - - pragma[nomagic] - private Type getCertainCallExprType(CallExpr ce, Path p, TypePath tp) { - forex(Function f | callResolvesTo(ce, p, f) | result = getCallExprType(ce, p, f, tp)) - } - - pragma[nomagic] - private TypePath getPathToImplSelfTypeParam(TypeParam tp) { - exists(ImplItemNode impl | - tp = impl.getTypeParam(_) and - TTypeParamTypeParameter(tp) = impl.(Impl).getSelfTy().(TypeMention).getTypeAt(result) - ) - } - - pragma[nomagic] - private Type inferCertainCallExprType(CallExpr ce, TypePath path) { - exists(Type ty, TypePath prefix, Path p | ty = getCertainCallExprType(ce, p, prefix) | - exists(TypePath suffix, TypeParam tp | - tp = ty.(TypeParamTypeParameter).getTypeParam() and - path = prefix.append(suffix) - | - // For type parameters of the `impl` block we must resolve their - // instantiation from the path. For instance, for `impl for Foo` - // and the path `Foo::bar` we must resolve `A` to `i64`. - exists(TypePath pathToTp | - pathToTp = getPathToImplSelfTypeParam(tp) and - result = p.getQualifier().(TypeMention).getTypeAt(pathToTp.appendInverse(suffix)) - ) - or - // For type parameters of the function we must resolve their - // instantiation from the path. For instance, for `fn bar(a: A) -> A` - // and the path `bar`, we must resolve `A` to `i64`. - result = getCallExprTypeArgument(ce, TTypeParamTypeArgumentPosition(tp), suffix) - ) - or - not ty instanceof TypeParameter and - result = ty and - path = prefix - ) - } - - private Type inferCertainStructExprType(StructExpr se, TypePath path) { - result = se.getPath().(TypeMention).getTypeAt(path) - } - - private Type inferCertainStructPatType(StructPat sp, TypePath path) { - result = sp.getPath().(TypeMention).getTypeAt(path) - } - - predicate certainTypeEquality(AstNode n1, TypePath prefix1, AstNode n2, TypePath prefix2) { - prefix1.isEmpty() and - prefix2.isEmpty() and - ( - exists(Variable v | n1 = v.getAnAccess() | - n2 = v.getPat().getName() or n2 = v.getParameter().(SelfParam) - ) - or - // A `let` statement with a type annotation is a coercion site and hence - // is not a certain type equality. - exists(LetStmt let | - not let.hasTypeRepr() and - identLetStmt(let, n1, n2) - ) - or - exists(LetExpr let | - // Similarly as for let statements, we need to rule out binding modes - // changing the type. - let.getPat().(IdentPat) = n1 and - let.getScrutinee() = n2 - ) - or - n1 = n2.(ParenExpr).getExpr() - ) - or - n1 = - any(IdentPat ip | - n2 = ip.getName() and - prefix1.isEmpty() and - if ip.isRef() - then - exists(boolean isMutable | if ip.isMut() then isMutable = true else isMutable = false | - prefix2 = TypePath::singleton(getRefTypeParameter(isMutable)) - ) - else prefix2.isEmpty() - ) - or - exists(CallExprImpl::DynamicCallExpr dce, TupleType tt, int i | - n1 = dce.getArgList() and - tt.getArity() = dce.getNumberOfSyntacticArguments() and - n2 = dce.getSyntacticPositionalArgument(i) and - prefix1 = TypePath::singleton(tt.getPositionalTypeParameter(i)) and - prefix2.isEmpty() - ) - or - exists(ClosureExpr ce, int index | - n1 = ce and - n2 = ce.getParam(index).getPat() and - prefix1 = closureParameterPath(ce.getNumberOfParams(), index) and - prefix2.isEmpty() - ) - } - - pragma[nomagic] - private Type inferCertainTypeEquality(AstNode n, TypePath path) { - exists(TypePath prefix1, AstNode n2, TypePath prefix2, TypePath suffix | - result = inferCertainType(n2, prefix2.appendInverse(suffix)) and - path = prefix1.append(suffix) - | - certainTypeEquality(n, prefix1, n2, prefix2) - or - certainTypeEquality(n2, prefix2, n, prefix1) - ) - } - - /** - * Holds if `n` has complete and certain type information and if `n` has the - * resulting type at `path`. - */ - cached - Type inferCertainType(AstNode n, TypePath path) { - result = inferAnnotatedType(n, path) and - Stages::TypeInferenceStage::ref() - or - result = inferFunctionBodyType(n, path) - or - result = inferCertainCallExprType(n, path) - or - result = inferCertainTypeEquality(n, path) - or - result = inferLiteralType(n, path, true) - or - result = inferRefPatType(n) and - path.isEmpty() - or - result = inferRefExprType(n) and - path.isEmpty() - or - result = inferLogicalOperationType(n, path) - or - result = inferCertainStructExprType(n, path) - or - result = inferCertainStructPatType(n, path) - or - result = inferRangeExprType(n) and - path.isEmpty() - or - result = inferTupleRootType(n) and - path.isEmpty() - or - result = inferBlockExprType(n, path) - or - result = inferArrayExprType(n) and - path.isEmpty() - or - result = inferCastExprType(n, path) - or - exprHasUnitType(n) and - path.isEmpty() and - result instanceof UnitType - or - isPanicMacroCall(n) and - path.isEmpty() and - result instanceof NeverType - or - n instanceof ClosureExpr and - path.isEmpty() and - result = closureRootType() - or - infersCertainTypeAt(n, path, result.getATypeParameter()) - } - - /** - * Holds if `n` has complete and certain type information at the type path - * `prefix.tp`. This entails that the type at `prefix` must be the type - * that declares `tp`. - */ - pragma[nomagic] - private predicate infersCertainTypeAt(AstNode n, TypePath prefix, TypeParameter tp) { - exists(TypePath path | - exists(inferCertainType(n, path)) and - path.isSnoc(prefix, tp) - ) - } - - /** - * Holds if `n` has complete and certain type information at `path`. - */ - pragma[nomagic] - predicate hasInferredCertainType(AstNode n, TypePath path) { exists(inferCertainType(n, path)) } - - /** - * Holds if `n` having type `t` at `path` conflicts with certain type information - * at `prefix`. - */ - bindingset[n, prefix, path, t] - pragma[inline_late] - predicate certainTypeConflict(AstNode n, TypePath prefix, TypePath path, Type t) { - inferCertainType(n, path) != t - or - // If we infer that `n` has _some_ type at `T1.T2....Tn`, and we also - // know that `n` certainly has type `certainType` at `T1.T2...Ti`, `0 <= i < n`, - // then it must be the case that `T(i+1)` is a type parameter of `certainType`, - // otherwise there is a conflict. - // - // Below, `prefix` is `T1.T2...Ti` and `tp` is `T(i+1)`. - exists(TypePath suffix, TypeParameter tp, Type certainType | - path = prefix.appendInverse(suffix) and - tp = suffix.getHead() and - inferCertainType(n, prefix) = certainType and - not certainType.getATypeParameter() = tp - ) - } -} - -private Type inferLogicalOperationType(AstNode n, TypePath path) { - exists(Builtins::Bool t, BinaryLogicalOperation be | - n = [be, be.getLhs(), be.getRhs()] and - path.isEmpty() and - result = TDataType(t) - ) +private Type inferStructExprType(StructExpr se, TypePath path) { + result = se.getPath().(TypeMention).getTypeAt(path) } -private Type inferAssignmentOperationType(AstNode n, TypePath path) { - n instanceof AssignmentOperation and - path.isEmpty() and - result instanceof UnitType +private Type inferStructPatType(StructPat sp, TypePath path) { + result = sp.getPath().(TypeMention).getTypeAt(path) } pragma[nomagic] @@ -755,9 +284,6 @@ private Struct getRangeType(RangeExpr re) { re instanceof RangeToExpr and result instanceof RangeToStruct or - re instanceof RangeFullExpr and - result instanceof RangeFullStruct - or re instanceof RangeFromToExpr and result instanceof RangeStruct or @@ -768,9 +294,13 @@ private Struct getRangeType(RangeExpr re) { result instanceof RangeToInclusiveStruct } +pragma[nomagic] +private DataType inferRangeFullExprType(RangeFullExpr re) { + exists(re) and result.getTypeItem() instanceof RangeFullStruct +} + pragma[nomagic] private TupleType inferTupleRootType(AstNode n) { - // `typeEquality` handles the non-root cases result.getArity() = [n.(TupleExpr).getNumberOfFields(), n.(TuplePat).getTupleArity()] } @@ -844,23 +374,11 @@ private class NonAssocCallExpr extends CallExpr { */ ItemNode resolveCallTargetViaPathResolution() { result = CallExprImpl::getResolvedFunction(this) } - pragma[nomagic] - Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { - result = getCallExprTypeArgument(this, apos, path) - } - - AstNode getNodeAt(FunctionPosition pos) { - result = this.getSyntacticArgument(pos.asArgumentPosition()) - or - result = this and pos.isReturn() - } - - pragma[nomagic] - Type getInferredType(FunctionPosition pos, TypePath path) { - pos.isTypeQualifier() and - result = getCallExprTypeQualifier(this, path, false) - or - result = inferType(this.getNodeAt(pos), path) + Expr getArgument(int i) { + exists(ArgumentPosition pos | + i = pos.asPosition() and + result = this.getSyntacticArgument(pos) + ) } } @@ -875,17 +393,14 @@ private class NonAssocCallExpr extends CallExpr { */ bindingset[path, type] private predicate isComplexRootStripped(TypePath path, Type type) { - ( - path.isEmpty() and - not validSelfType(type) - or - exists(TypeParameter tp | - complexSelfRoot(_, tp) and - path = TypePath::singleton(tp) and - exists(type) - ) - ) and - type != TNeverType() + path.isEmpty() and + not validSelfType(type) + or + exists(TypeParameter tp | + complexSelfRoot(_, tp) and + path = TypePath::singleton(tp) and + exists(type) + ) } private newtype TBorrowKind = @@ -1354,8 +869,7 @@ private module AssocFunctionResolution { not this.hasReceiver() and exists(TypePath strippedTypePath, Type strippedType | strippedType = substituteLookupTraits(this, this.getTypeAt(selfPos, strippedTypePath)) and - strippedType != TNeverType() and - strippedType != TUnknownType() + not strippedType instanceof PseudoType | nonBlanketLikeCandidate(this, _, selfPos, _, _, strippedTypePath, strippedType) or @@ -1451,8 +965,7 @@ private module AssocFunctionResolution { FunctionPosition selfPos, DerefChain derefChain, BorrowKind borrow, TypePath path ) { result = this.getSelfTypeAt(selfPos, derefChain, borrow, path) and - result != TNeverType() and - result != TUnknownType() + not result instanceof PseudoType } pragma[nomagic] @@ -1582,6 +1095,14 @@ private module AssocFunctionResolution { ) } + pragma[nomagic] + predicate resolutionDependsOnReturnType(TypePath path) { + exists(AssocFunctionCallCand afcc | + afcc = MkAssocFunctionCallCand(this, _, _, _) and + afcc.resolutionDependsOnReturnType(path) + ) + } + /** * Holds if the argument `arg` of this call has been implicitly dereferenced * and borrowed according to `derefChain` and `borrow`, in order to be able to @@ -1692,7 +1213,7 @@ private module AssocFunctionResolution { result = this.getOperand(pos.asPosition()) } - private predicate implicitBorrowAt(FunctionPosition pos, boolean isMutable) { + predicate implicitBorrowAt(FunctionPosition pos, boolean isMutable) { exists(int borrows | this.isOverloaded(_, _, borrows) | pos.asPosition() = 0 and borrows >= 1 and @@ -2057,22 +1578,76 @@ private module AssocFunctionResolution { pragma[nomagic] AssocFunctionDeclaration resolveCallTarget(ImplOrTraitItemNode i) { result = this.resolveCallTargetCand(i) and - not FunctionOverloading::functionResolutionDependsOnArgument(i, result, _, _) + not FunctionOverloading::functionResolutionDependsOnArgument(i, result, _, _, _) or OverloadedCallArgsAreInstantiationsOf::argsAreInstantiationsOf(this, i, result) } - string toString() { - result = afc_ + " at " + selfPos_ + " [" + derefChain.toString() + "; " + borrow + "]" + pragma[nomagic] + private predicate hasUnknownTypeAtPos(int pos, TypePath path) { + exists(FunctionPosition pos0 | + inferType(afc_.getNodeAt(pos0), path) = TUnknownType() and + pos = pos0.asPosition() + ) } - Location getLocation() { result = afc_.getLocation() } - } + pragma[nomagic] + private predicate resolutionDependsOnReturnTypeCand( + ImplOrTraitItemNode i, AssocFunctionDeclaration target, TypeParameter traitTp, TypePath path + ) { + exists(FunctionPosition pos | + target = this.resolveCallTargetCand(i) and + FunctionOverloading::functionResolutionDependsOnArgument(i, target, traitTp, pos, path) and + pos.isReturn() + ) + } - /** - * Provides logic for resolving implicit `Deref::deref` calls. - */ - private module ImplicitDeref { + pragma[nomagic] + private predicate resolutionDependsOnPositionalAndReturnTypeCand( + ImplOrTraitItemNode i, AssocFunctionDeclaration target, TypePath path, int pos0, + TypePath prefix + ) { + exists(TypeParameter traitTp, TypePath path0 | + this.resolutionDependsOnReturnTypeCand(i, target, traitTp, path) and + FunctionOverloading::functionResolutionDependsOnPositionalArgumentCand(i, target, _, + traitTp, pos0, path0) and + prefix = path0.getAPrefix() + ) + } + + /** + * Holds if resolving this call requires contextual information about the + * return type at `path`. + */ + pragma[nomagic] + predicate resolutionDependsOnReturnType(TypePath path) { + exists(ImplOrTraitItemNode i, AssocFunctionDeclaration target | + exists(TypeParameter traitTp | + this.resolutionDependsOnReturnTypeCand(i, target, traitTp, path) and + not FunctionOverloading::functionResolutionDependsOnPositionalArgumentCand(i, target, _, + traitTp, _, _) + ) + or + // when `traitTp` is also mentioned in a parameter, require that typing of the + // corresponding argument also needs contextual typing + exists(int pos0, TypePath prefix | + this.resolutionDependsOnPositionalAndReturnTypeCand(i, target, path, pos0, prefix) and + this.hasUnknownTypeAtPos(pos0, prefix) + ) + ) + } + + string toString() { + result = afc_ + " at " + selfPos_ + " [" + derefChain.toString() + "; " + borrow + "]" + } + + Location getLocation() { result = afc_.getLocation() } + } + + /** + * Provides logic for resolving implicit `Deref::deref` calls. + */ + private module ImplicitDeref { private newtype TCallDerefCand = MkCallDerefCand(AssocFunctionCall afc, FunctionPosition selfPos, DerefChain derefChain) { afc.supportsAutoDerefAndBorrow() and @@ -2091,8 +1666,7 @@ private module AssocFunctionResolution { Type getTypeAt(TypePath path) { result = substituteLookupTraits(afc, afc.getSelfTypeAtNoBorrow(selfPos, derefChain, path)) and - result != TNeverType() and - result != TUnknownType() + not result instanceof PseudoType } string toString() { result = afc + " [" + derefChain.toString() + "]" } @@ -2287,7 +1861,7 @@ private module AssocFunctionResolution { ArgsAreInstantiationsOfInputSig { predicate toCheck(ImplOrTraitItemNode i, Function f, TypeParameter traitTp, FunctionPosition pos) { - FunctionOverloading::functionResolutionDependsOnArgument(i, f, traitTp, pos) + FunctionOverloading::functionResolutionDependsOnArgument(i, f, traitTp, pos, _) } class Call extends AssocFunctionCallCand { @@ -2368,18 +1942,6 @@ private Type inferRefPatType(AstNode ref) { ) } -pragma[nomagic] -private Type inferTryExprType(TryExpr te, TypePath path) { - exists(TypeParam tp, TypePath path0 | - result = inferType(te.getExpr(), path0) and - path0.isCons(TTypeParamTypeParameter(tp), path) - | - tp = any(ResultEnum r).getGenericParamList().getGenericParam(0) - or - tp = any(OptionEnum o).getGenericParamList().getGenericParam(0) - ) -} - pragma[nomagic] private StructType getStrStruct() { result = TDataType(any(Builtins::Str s)) } @@ -2440,35 +2002,36 @@ private DynTraitTypeParameter getDynFutureOutputTypeParameter() { pragma[nomagic] predicate isUnitBlockExpr(BlockExpr be) { not be.getStmtList().hasTailExpr() and - not be = any(Callable c).getBody() and + not exists(Callable c | + be = c.getBody() and + c = any(ReturnExpr re).getEnclosingCallable() + ) and not be.hasLabel() } pragma[nomagic] -private Type inferBlockExprType(BlockExpr be, TypePath path) { - // `typeEquality` handles the non-root case - if be instanceof AsyncBlockExpr - then ( - path.isEmpty() and - result = getFutureTraitType() - or - isUnitBlockExpr(be) and - path = TypePath::singleton(getDynFutureOutputTypeParameter()) and - result instanceof UnitType - ) else ( - isUnitBlockExpr(be) and - path.isEmpty() and - result instanceof UnitType - ) +private Type inferAsyncUnitBlockExprType(AsyncBlockExpr be, TypePath path) { + isUnitBlockExpr(be) and + path = TypePath::singleton(getDynFutureOutputTypeParameter()) and + result instanceof UnitType } pragma[nomagic] -private predicate exprHasUnitType(Expr e) { +private predicate exprHasUnitType(AstNode e) { e = any(IfExpr ie | not ie.hasElse()) or e instanceof WhileExpr or e instanceof ForExpr + or + e instanceof AssignmentOperation + or + e = any(BlockExpr be | isUnitBlockExpr(be) and not be.isAsync()) + or + exists(CallExprImpl::DynamicCallExpr dce | + e = dce.getArgList() and + dce.getNumberOfSyntacticArguments() = 0 + ) } final private class AwaitTarget extends Expr { @@ -2495,37 +2058,9 @@ private Type inferAwaitExprType(AstNode n, TypePath path) { ) } -/** - * Gets the root type of the array expression `ae`. - */ -pragma[nomagic] -private Type inferArrayExprType(ArrayExpr ae) { exists(ae) and result instanceof ArrayType } - -/** - * Gets the root type of the range expression `re`. - */ -pragma[nomagic] -private Type inferRangeExprType(RangeExpr re) { result = TDataType(getRangeType(re)) } - pragma[nomagic] -private Type getInferredDerefType(DerefExpr de, TypePath path) { result = inferType(de, path) } - -pragma[nomagic] -private PtrType getInferredDerefExprPtrType(DerefExpr de) { result = inferType(de.getExpr()) } - -/** - * Gets the inferred type of `n` at `path` when `n` occurs in a dereference - * expression `*n` and when `n` is known to have a raw pointer type. - * - * The other direction is handled in `typeEqualityAsymmetric`. - */ -private Type inferDereferencedExprPtrType(AstNode n, TypePath path) { - exists(DerefExpr de, PtrType type, TypePath suffix | - de.getExpr() = n and - type = getInferredDerefExprPtrType(de) and - result = getInferredDerefType(de, suffix) and - path = TypePath::cons(type.getPositionalTypeParameter(0), suffix) - ) +private Type inferEmptyArrayListExprType(ArrayListExpr ae) { + ae.getNumberOfExprs() = 0 and result instanceof ArrayType } /** @@ -2535,12 +2070,19 @@ private Type inferDereferencedExprPtrType(AstNode n, TypePath path) { private module DeconstructionPatMatchingInput implements MatchingInputSig { import FunctionPositionMatchingInput - class Declaration = ConstructionMatchingInput::Declaration; + class Declaration extends Input3::Constructor { + Type getDeclaredType(FunctionPosition pos, TypePath path) { + result = this.getParameter(pos.asPosition()).getType().getTypeAt(path) + or + pos.isReturn() and + result = this.getType().getTypeAt(path) + } + } class Access extends Pat instanceof PathAstNode { Access() { this instanceof TupleStructPat or this instanceof StructPat } - Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { none() } + Type getTypeArgument(int pos, TypePath path) { none() } AstNode getNodeAt(AccessPosition apos) { this = @@ -2631,48 +2173,10 @@ private Type inferForLoopExprType(AstNode n, TypePath path) { ) } -pragma[nomagic] -private Type inferClosureExprType(AstNode n, TypePath path) { - exists(ClosureExpr ce | - n = ce and - ( - path = TypePath::singleton(TDynTraitTypeParameter(_, any(FnTrait t).getTypeParam())) and - result.(TupleType).getArity() = ce.getNumberOfParams() - or - exists(TypePath path0 | - result = ce.getRetType().getTypeRepr().(TypeMention).getTypeAt(path0) and - path = closureReturnPath().append(path0) - ) - ) - or - exists(Param p | - p = ce.getAParam() and - not p.hasTypeRepr() and - n = p.getPat() and - result = TUnknownType() and - path.isEmpty() - ) - ) -} - -pragma[nomagic] -private TupleType inferArgList(ArgList args, TypePath path) { - exists(CallExprImpl::DynamicCallExpr dce | - args = dce.getArgList() and - result.getArity() = dce.getNumberOfSyntacticArguments() and - path.isEmpty() - ) -} - -pragma[nomagic] -private Type inferCastExprType(CastExpr ce, TypePath path) { - result = ce.getTypeRepr().(TypeMention).getTypeAt(path) -} - /** Holds if `n` is implicitly dereferenced and/or borrowed. */ cached predicate implicitDerefChainBorrow(Expr e, DerefChain derefChain, boolean borrow) { - Stages::TypeInferenceStage::ref() and + CachedStage::ref() and exists(BorrowKind bk | any(AssocFunctionResolution::AssocFunctionCall afc) .argumentHasImplicitDerefChainBorrow(e, derefChain, bk) and @@ -2699,6 +2203,7 @@ predicate implicitDerefChainBorrow(Expr e, DerefChain derefChain, boolean borrow */ cached Addressable resolveCallTarget(InvocationExpr call, boolean dispatch) { + CachedStage::ref() and dispatch = false and result = call.(NonAssocCallExpr).resolveCallTargetViaPathResolution() or @@ -2718,6 +2223,7 @@ Addressable resolveCallTarget(InvocationExpr call, boolean dispatch) { */ cached StructField resolveStructFieldExpr(FieldExpr fe, DerefChain derefChain) { + CachedStage::ref() and exists(string name, DataType ty | ty = getFieldExprLookupType(fe, pragma[only_bind_into](name), derefChain) | @@ -2731,6 +2237,7 @@ StructField resolveStructFieldExpr(FieldExpr fe, DerefChain derefChain) { */ cached TupleField resolveTupleFieldExpr(FieldExpr fe, DerefChain derefChain) { + CachedStage::ref() and exists(int i | result = getTupleFieldExprLookupType(fe, pragma[only_bind_into](i), derefChain) @@ -2740,113 +2247,978 @@ TupleField resolveTupleFieldExpr(FieldExpr fe, DerefChain derefChain) { ) } -/** Provides predicates for debugging the type inference implementation. */ -private module Debug { - Locatable getRelevantLocatable() { - exists(string filepath, int startline, int startcolumn, int endline, int endcolumn | - result.getLocation().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) and - filepath.matches("%/main.rs") and - startline = 103 - ) +private module Input3 implements InputSig3 { + private import rust as Rust + private import codeql.rust.dataflow.internal.ModelsAsData + + predicate cacheRevRef() { + (implicitDerefChainBorrow(_, _, _) implies any()) + or + (exists(resolveCallTarget(_, _)) implies any()) + or + (exists(resolveStructFieldExpr(_, _)) implies any()) + or + (exists(resolveTupleFieldExpr(_, _)) implies any()) + or + (mayInvokeCallback(_, _) implies any()) } - Type debugInferType(AstNode n, TypePath path) { - n = getRelevantLocatable() and - result = inferType(n, path) + predicate inferTypeForDefaults = M3::inferType/2; + + class UnknownType = T::UnknownType; + + class BoolType extends DataType { + BoolType() { this.getTypeItem() instanceof Builtins::Bool } } - Addressable debugResolveCallTarget(InvocationExpr c, boolean dispatch) { - c = getRelevantLocatable() and - result = resolveCallTarget(c, dispatch) + class AstNode = Rust::AstNode; + + final class Expr = ExprImpl; + + abstract private class ExprImpl extends AstNode { } + + private class ExprExpr extends ExprImpl, Rust::Expr { } + + private class ArgListExpr extends ExprImpl, ArgList { } + + class Cast extends Expr, CastExpr { + TypeMention getType() { result = this.getTypeRepr() } } - predicate debugConditionSatisfiesConstraint( - TypeAbstraction abs, TypeMention condition, TypeMention constraint, boolean transitive - ) { - abs = getRelevantLocatable() and - Input2::conditionSatisfiesConstraint(abs, condition, constraint, transitive) + class Switch extends Rust::MatchExpr { + Expr getExpr() { result = this.getScrutinee() } + + Case getCase(int index) { result = this.getArm(index) } } - predicate debugInferShorthandSelfType(ShorthandSelfParameterMention self, TypePath path, Type t) { - self = getRelevantLocatable() and - t = self.getTypeAt(path) + class Case extends Rust::MatchArm { + AstNode getAPattern() { result = this.getPat() } + + AstNode getBody() { result = this.getExpr() } } - predicate debugInferFunctionCallType(AstNode n, TypePath path, Type t) { - n = getRelevantLocatable() and - t = inferFunctionCallType(n, path) + class ConditionalExpr extends Expr instanceof IfExpr { + Expr getCondition() { result = super.getCondition() } + + Expr getThen() { result = super.getThen() } + + Expr getElse() { result = super.getElse() } } - predicate debugInferConstructionType(AstNode n, TypePath path, Type t) { - n = getRelevantLocatable() and - t = inferConstructionType(n, path) + class BinaryExpr extends Expr, Rust::BinaryExpr { + Expr getLeftOperand() { result = super.getLhs() } + + Expr getRightOperand() { result = super.getRhs() } } - predicate debugTypeMention(TypeMention tm, TypePath path, Type type) { - tm = getRelevantLocatable() and - tm.getTypeAt(path) = type + class LogicalAndExpr extends BinaryExpr, Rust::LogicalAndExpr { } + + class LogicalOrExpr extends BinaryExpr, Rust::LogicalOrExpr { } + + final class Assignment = AssignmentImpl; + + abstract private class AssignmentImpl extends BinaryExpr { } + + class AssignExpr extends AssignmentImpl, Rust::AssignmentExpr { } + + class ParenExpr extends Expr instanceof Rust::ParenExpr { + Expr getExpr() { result = super.getExpr() } } - Type debugInferAnnotatedType(AstNode n, TypePath path) { - n = getRelevantLocatable() and - result = inferAnnotatedType(n, path) + final class Declaration = DeclarationImpl; + + abstract private class DeclarationImpl extends AstNode { + abstract TypeMention getDeclaringType(); + + abstract TypeMention getType(); } - pragma[nomagic] - private int countTypesAtPath(AstNode n, TypePath path, Type t) { - t = inferType(n, path) and - result = strictcount(Type t0 | t0 = inferType(n, path)) + private newtype TVariable = + TVariableVariable(Rust::Variable v) or + TConstVariable(Const c) or + TStaticVariable(Static s) + + class Variable extends TVariable { + Rust::Variable asLocalVariable() { this = TVariableVariable(result) } + + Const asConst() { this = TConstVariable(result) } + + Static asStatic() { this = TStaticVariable(result) } + + AstNode getDefiningNode() { + result = this.asLocalVariable().getPat().getName() or + result = this.asLocalVariable().getParameter().(SelfParam) or + result = this.asConst().getName() or + result = this.asStatic().getName() + } + + Expr getAnAccess() { + result = this.asLocalVariable().getAnAccess() + or + result = this.asConst().getAnAccess() + or + result = this.asStatic().getAnAccess() + } + + string toString() { result = this.getDefiningNode().toString() } + + Location getLocation() { result = this.getDefiningNode().getLocation() } } - pragma[nomagic] - private predicate atLimit(AstNode n) { - exists(TypePath path0 | exists(inferType(n, path0)) and path0.length() >= getTypePathLimit()) + final class VariableDeclaration = VariableDeclarationImpl; + + abstract private class VariableDeclarationImpl extends DeclarationImpl { + abstract predicate isCoercionSite(); + + abstract AstNode getPattern(); + + abstract AstNode getInitializer(); + + override TypeMention getDeclaringType() { none() } } - Type debugInferTypeForNodeAtLimit(AstNode n, TypePath path) { - result = inferType(n, path) and - atLimit(n) + private class LetExprDeclaration extends VariableDeclarationImpl instanceof LetExpr { + override predicate isCoercionSite() { not super.getPat() instanceof IdentPat } + + override TypeMention getType() { none() } + + override AstNode getPattern() { result = super.getPat() } + + override AstNode getInitializer() { result = super.getScrutinee() } } - predicate countTypesForNodeAtLimit(AstNode n, int c) { - n = getRelevantLocatable() and - c = strictcount(Type t, TypePath path | t = debugInferTypeForNodeAtLimit(n, path)) + private class LetStmtDeclaration extends VariableDeclarationImpl instanceof LetStmt { + override predicate isCoercionSite() { + super.hasTypeRepr() + or + // Due to "binding modes" the type of the pattern is not necessarily the + // same as the type of the initializer. However, when the pattern is an + // identifier pattern, its type is guaranteed to be the same as the type of the + // initializer. + not super.getPat() instanceof IdentPat + } + + override TypeMention getType() { result = super.getTypeRepr() } + + override AstNode getPattern() { result = super.getPat() } + + override AstNode getInitializer() { result = LetStmt.super.getInitializer() } + } + + private class ConstDeclaration extends VariableDeclarationImpl instanceof Const { + override predicate isCoercionSite() { any() } + + override TypeMention getType() { result = super.getTypeRepr() } + + override AstNode getPattern() { result = super.getName() } + + override AstNode getInitializer() { result = super.getBody() } } - predicate maxTypes(AstNode n, TypePath path, Type t, int c) { - c = countTypesAtPath(n, path, t) and - c = max(countTypesAtPath(_, _, _)) + private class StaticDeclaration extends VariableDeclarationImpl instanceof Static { + override predicate isCoercionSite() { any() } + + override TypeMention getType() { result = super.getTypeRepr() } + + override AstNode getPattern() { result = super.getName() } + + override AstNode getInitializer() { result = super.getBody() } } - pragma[nomagic] - private predicate typePathLength(AstNode n, TypePath path, Type t, int len) { - t = inferType(n, path) and - len = path.length() + final class Field = FieldImpl; + + abstract private class FieldImpl extends DeclarationImpl { + // no case for variants as those can only be destructured using pattern matching + abstract Struct getStruct(); + + override TypeMention getDeclaringType() { result = this.getStruct() } } - predicate maxTypePath(AstNode n, TypePath path, Type t, int len) { - typePathLength(n, path, t, len) and - len = max(int i | typePathLength(_, _, _, i)) + private class StructFieldDecl extends FieldImpl instanceof StructField { + override Struct getStruct() { this = result.getAStructField() } + + override TypeMention getType() { result = StructField.super.getTypeRepr() } } - pragma[nomagic] - private int countTypePaths(AstNode n, TypePath path, Type t) { - t = inferType(n, path) and - result = strictcount(TypePath path0, Type t0 | t0 = inferType(n, path0)) + private class TupleFieldDecl extends FieldImpl instanceof TupleField { + override Struct getStruct() { this = result.getATupleField() } + + override TypeMention getType() { result = TupleField.super.getTypeRepr() } + } + + class FieldAccess extends Expr, FieldExpr { + Expr getReceiver() { result = this.getContainer() } + + Field getField() { + // mutual recursion; resolving fields requires resolving types and vice versa + result = + [ + resolveStructFieldExpr(this, _).(AstNode), + resolveTupleFieldExpr(this, _) + ] + } + } + + Type inferFieldAccessReceiverType(FieldAccess fa, TypePath path) { + exists(TypePath path0 | result = inferType(fa.getReceiver(), path0) | + // adjust for implicit deref + path0.isCons(getRefTypeParameter(_), path) + or + not path0.isCons(getRefTypeParameter(_), _) and + not (result instanceof RefType and path0.isEmpty()) and + path = path0 + ) + } + + Type inferFieldAccessReceiverTypeContextual(Expr receiver, TypePath path) { + exists(TypePath path0, Type receiverType | + result = M3::inferFieldAccessReceiverTypeContextualDefault(_, receiver, path0) and + receiverType = inferType(receiver) and + not path0.isEmpty() + | + // adjust for implicit deref + path = TypePath::cons(receiverType.(RefType).getPositionalTypeParameter(0), path0) + or + not receiverType instanceof RefType and + path = path0 + ) + } + + class Return extends ReturnExpr { + Expr getExpr() { result = super.getExpr() } + } + + final class Parameter = ParameterImpl; + + abstract private class ParameterImpl extends VariableDeclarationImpl { + override predicate isCoercionSite() { any() } // doesn't really matter, since there are no initializers/default values + + override AstNode getInitializer() { none() } + } + + private class SelfParamParameter extends ParameterImpl, SelfParam { + override AstNode getPattern() { result = this } + + override TypeMention getType() { result = getSelfParamTypeMention(this) } + } + + private class ParamParameter extends ParameterImpl, Param { + override AstNode getPattern() { result = this.getPat() } + + override TypeMention getType() { result = this.getTypeRepr() } + } + + private class TupleFieldParameter extends ParameterImpl instanceof TupleField { + override AstNode getPattern() { none() } + + override TypeMention getType() { result = super.getTypeRepr() } + } + + private class StructFieldParameter extends ParameterImpl instanceof StructField { + override AstNode getPattern() { none() } + + override TypeMention getType() { result = super.getTypeRepr() } + } + + final class Parameterizable = ParameterizableImpl; + + abstract private class ParameterizableImpl extends DeclarationImpl { + abstract TypeParameter getTypeParameter(int pos); + + abstract TypeMention getAdditionalTypeParameterConstraint(TypeParameter tp); + + abstract Parameter getParameter(int i); + } + + class Callable extends ParameterizableImpl instanceof Rust::Callable { + override TypeMention getDeclaringType() { + exists(ImplOrTraitItemNode implOrTrait | this = implOrTrait.getAnAssocItem() | + result = implOrTrait.(Impl).getSelfTy() or + result = implOrTrait.(Trait) + ) + } + + override TypeParameter getTypeParameter(int pos) { + result = TTypeParamTypeParameter(this.(Function).getGenericParamList().getTypeParam(pos)) + } + + override TypeMention getAdditionalTypeParameterConstraint(TypeParameter tp) { + result = + tp.(TypeParamTypeParameter).getTypeParam().getAdditionalTypeBound(this, _).getTypeRepr() + } + + override Parameter getParameter(int i) { + i = 0 and + result = super.getSelfParam() + or + exists(int pos | result = super.getParam(pos) | + if this instanceof Method then i = pos + 1 else i = pos + ) + } + + override TypeMention getType() { result = getReturnTypeMention(this) } + + AstNode getBody() { result = Rust::Callable.super.getBody() } + } + + Callable getEnclosingCallable(AstNode node) { result = node.getEnclosingCallable() } + + additional final class Constructor = ConstructorImpl; + + abstract private class ConstructorImpl extends ParameterizableImpl { + abstract TypeItem getTypeItem(); + + override TypeMention getDeclaringType() { result = this.getTypeItem() } + + override TypeMention getAdditionalTypeParameterConstraint(TypeParameter tp) { none() } + + override TypeParameter getTypeParameter(int pos) { + result = TTypeParamTypeParameter(this.getTypeItem().getGenericParamList().getTypeParam(pos)) + } + + override TypeMention getType() { result = this.getTypeItem() } + } + + private class StructConstructor extends ConstructorImpl instanceof Struct { + override TypeItem getTypeItem() { result = this } + + override Parameter getParameter(int i) { + result = [super.getTupleField(i).(AstNode), super.getNthStructField(i)] + } } - predicate maxTypePaths(AstNode n, TypePath path, Type t, int c) { - c = countTypePaths(n, path, t) and - c = max(countTypePaths(_, _, _)) + private class VariantConstructor extends ConstructorImpl instanceof Variant { + override TypeItem getTypeItem() { result = super.getEnum() } + + override Parameter getParameter(int i) { + result = [super.getTupleField(i).(AstNode), super.getNthStructField(i)] + } + } + + Type getCallableReturnType(Callable c, TypePath path) { + if c.(Function).isAsync() or c.(ClosureExpr).isAsync() + then + path.isEmpty() and + result = getFutureTraitType() + or + exists(TypePath suffix | + result = getReturnTypeMention(c).getTypeAt(suffix) and + path = TypePath::cons(getDynFutureOutputTypeParameter(), suffix) + ) + else result = getReturnTypeMention(c).getTypeAt(path) + } + + class ResolutionContext = string; + + bindingset[derefChain, borrow] + private ResolutionContext encodeDerefChainBorrow(DerefChain derefChain, BorrowKind borrow) { + result = derefChain + ";" + borrow } - Type debugInferCertainType(AstNode n, TypePath path) { + bindingset[derefChainBorrow] + private predicate decodeDerefChainBorrow( + string derefChainBorrow, DerefChain derefChain, BorrowKind borrow + ) { + exists(int i | + i = derefChainBorrow.indexOf(";") and + derefChain = derefChainBorrow.prefix(i) and + borrow.toString() = derefChainBorrow.suffix(i + 1) + ) + } + + private string noDerefChainBorrow() { + exists(DerefChain derefChain, BorrowKind borrow | + derefChain.isEmpty() and + borrow.isNoBorrow() and + result = encodeDerefChainBorrow(derefChain, borrow) + ) + } + + final class Invocation = InvocationImpl; + + abstract private class InvocationImpl extends Expr { + abstract Type getTypeQualifier(TypePath path); + + abstract Type getTypeArgument(int pos, TypePath path); + + abstract Expr getArgument(int i); + + abstract Parameterizable getTarget(string derefChainBorrow); + + abstract Parameterizable getATargetForTypeQualifierMatching(); + } + + pragma[nomagic] + private Type getCallExprTypeArgument(CallExpr ce, int pos, TypePath path) { + exists(Path p | + p = CallExprImpl::getFunctionPath(ce) and + result = getPathTypeArgument(p, pos).getTypeAt(path) + ) + } + + private class AssocFunctionCall extends InvocationImpl instanceof AssocFunctionResolution::AssocFunctionCall + { + override Type getTypeQualifier(TypePath path) { + result = getCallExprTypeQualifier(this, path, _) + } + + pragma[nomagic] + override Type getTypeArgument(int pos, TypePath path) { + result = getCallExprTypeArgument(this, pos, path) + or + result = + this.(MethodCallExpr).getGenericArgList().getTypeArg(pos).(TypeMention).getTypeAt(path) + } + + override Expr getArgument(int i) { + exists(FunctionPosition pos | + i = pos.asPosition() and + result = super.getNodeAt(pos) + ) + } + + pragma[nomagic] + Type getInferredSelfType(int pos, string derefChainBorrow, TypePath path) { + exists(FunctionPosition fpos, DerefChain derefChain, BorrowKind borrow | + result = super.getSelfTypeAt(fpos, derefChain, borrow, path) and + derefChainBorrow = encodeDerefChainBorrow(derefChain, borrow) and + super.hasReceiverAtPos(fpos) and + pos = fpos.asPosition() + ) + } + + pragma[nomagic] + Type getInferredNonSelfType(int pos, TypePath path) { + exists(FunctionPosition fpos | + not super.hasReceiverAtPos(fpos) and + result = super.getTypeAt(fpos, path) and + pos = fpos.asPosition() + ) + } + + override Callable getTarget(string derefChainBorrow) { + exists(DerefChain derefChain, BorrowKind borrow | + derefChainBorrow = encodeDerefChainBorrow(derefChain, borrow) and + result = super.resolveCallTarget(_, _, derefChain, borrow) // mutual recursion; resolving method calls requires resolving types and vice versa + ) + } + + override Parameterizable getATargetForTypeQualifierMatching() { + result = CallExprImpl::getResolvedFunction(this) + } + } + + private class NonAssocFunctionCall extends InvocationImpl instanceof NonAssocCallExpr, + CallExprImpl::CallExprCall + { + override Type getTypeQualifier(TypePath path) { none() } + + pragma[nomagic] + override Type getTypeArgument(int pos, TypePath path) { + result = getCallExprTypeArgument(this, pos, path) + } + + override Expr getArgument(int i) { result = NonAssocCallExpr.super.getArgument(i) } + + pragma[nomagic] + private Callable getTarget() { result = super.resolveCallTargetViaPathResolution() } + + override Callable getTarget(string derefChainBorrow) { + result = this.getTarget() and + derefChainBorrow = noDerefChainBorrow() + } + + override Parameterizable getATargetForTypeQualifierMatching() { + none() // non-assoc function calls cannot have type qualifiers + } + } + + abstract private class Construction extends InvocationImpl { + abstract Constructor getTarget(); + + override Parameterizable getTarget(string derefChainBorrow) { + result = this.getTarget() and + derefChainBorrow = noDerefChainBorrow() + } + + override Parameterizable getATargetForTypeQualifierMatching() { result = this.getTarget() } + } + + private class NonAssocCallConstruction extends Construction instanceof NonAssocCallExpr { + NonAssocCallConstruction() { + this instanceof CallExprImpl::TupleStructExpr or + this instanceof CallExprImpl::TupleVariantExpr + } + + override Type getTypeQualifier(TypePath path) { + result = CallExprImpl::getFunctionPath(this).(TypeMention).getTypeAt(path) + } + + override Type getTypeArgument(int pos, TypePath path) { none() } + + override Expr getArgument(int i) { result = NonAssocCallExpr.super.getArgument(i) } + + override Constructor getTarget() { result = super.resolveCallTargetViaPathResolution() } + } + + abstract private class StructConstruction extends Construction instanceof PathAstNode { + pragma[nomagic] + override Constructor getTarget() { result = resolvePath(super.getPath()) } + + override Type getTypeQualifier(TypePath path) { + result = super.getPath().(TypeMention).getTypeAt(path) + } + + pragma[nomagic] + override Type getTypeArgument(int pos, TypePath path) { none() } + } + + private class StructExprConstruction extends StructConstruction, StructExpr { + override Expr getArgument(int i) { + result = + this.getFieldExpr(pragma[only_bind_into](this.getNthStructField(i).getName().getText())) + .getExpr() + } + } + + /** A potential nullary struct/variant construction such as `None`. */ + private class PathExprConstruction extends StructConstruction, PathExpr { + PathExprConstruction() { not exists(CallExpr ce | this = ce.getFunction()) } + + override Expr getArgument(int i) { none() } + } + + pragma[nomagic] + private Type inferNonAssocFunctionCallArgumentType(Invocation invocation, int pos, TypePath path) { + not invocation instanceof AssocFunctionCall and + result = inferType(invocation.getArgument(pos), path) + } + + bindingset[derefChainBorrow] + Type inferInvocationArgumentType( + Invocation invocation, string derefChainBorrow, int pos, TypePath path + ) { + result = inferNonAssocFunctionCallArgumentType(invocation, pos, path) + or + invocation = + any(AssocFunctionCall afc | + result = afc.getInferredSelfType(pos, derefChainBorrow, path) + or + result = afc.getInferredNonSelfType(pos, path) + ) + } + + pragma[nomagic] + private Type inferInvocationArgumentTypeContextualDefault( + Invocation invocation, int pos, Expr arg, DerefChain derefChain, BorrowKind borrow, + TypePath path + ) { + exists(string derefChainBorrow | + decodeDerefChainBorrow(derefChainBorrow, derefChain, borrow) and + result = + M3::inferInvocationArgumentTypeContextualDefault(invocation, derefChainBorrow, pos, arg, + path) + ) + } + + /** + * Gets the type of `receiver` at `path` after applying `derefChain`, where + * `receiver` is the `self` argument of a method call. + * + * The predicate recursively pops the head of `derefChain` until it becomes + * empty, at which point the inferred type can be applied back to `receiver`. + */ + pragma[nomagic] + private Type inferInvocationSelfArgumentTypeContextual( + Invocation invocation, Expr receiver, DerefChain derefChain, TypePath path + ) { + exists(FunctionPosition pos, BorrowKind borrow, TypePath path0 | + invocation.(AssocFunctionResolution::AssocFunctionCall).hasReceiverAtPos(pos) and + result = + inferInvocationArgumentTypeContextualDefault(invocation, pos.asPosition(), receiver, + derefChain, borrow, path0) + | + borrow.isNoBorrow() and + path = path0 + or + // adjust for implicit borrow + exists(TypePath prefix | + prefix = TypePath::singleton(borrow.getRefType().getPositionalTypeParameter(0)) and + path0 = prefix.appendInverse(path) + ) + ) + or + // adjust for implicit deref + exists( + DerefChain derefChain0, Type t0, TypePath path0, DerefImplItemNode impl, Type selfParamType, + TypePath selfPath + | + t0 = inferInvocationSelfArgumentTypeContextual(invocation, receiver, derefChain0, path0) and + derefChain0.isCons(impl, derefChain) and + selfParamType = impl.resolveSelfTypeAt(selfPath) + | + result = selfParamType and + path = selfPath and + not result instanceof TypeParameter + or + exists(TypePath pathToTypeParam, TypePath suffix | + impl.targetHasTypeParameterAt(pathToTypeParam, selfParamType) and + path0 = pathToTypeParam.appendInverse(suffix) and + result = t0 and + path = selfPath.append(suffix) + ) + ) + } + + Type inferInvocationArgumentTypeContextual(Expr arg, TypePath path) { + exists(Invocation invocation, FunctionPosition pos, TypePath path0 | + result = + inferInvocationArgumentTypeContextualDefault(invocation, pos.asPosition(), arg, _, _, path0) and + not invocation.(AssocFunctionResolution::AssocFunctionCall).hasReceiverAtPos(pos) + or + pos.asPosition() = 0 and + result = inferInvocationSelfArgumentTypeContextual(invocation, arg, DerefChain::nil(), path0) and + not path0.isEmpty() + | + if invocation.(AssocFunctionResolution::OperationAssocFunctionCall).implicitBorrowAt(pos, _) + then + // adjust for implicit borrow + path0.isCons(getRefTypeParameter(_), path) + else path = path0 + ) + } + + Type inferInvocationType(Invocation invocation, TypePath path) { + exists(TypePath path0 | + result = M3::inferInvocationTypeDefault(invocation, _, path0) and + // index expression `x[i]` desugars to `*x.index(i)`, so we must account for + // the implicit deref + if invocation instanceof IndexExpr or invocation instanceof DerefExpr + then path0.isCons(getRefTypeParameter(_), path) + else path = path0 + ) + } + + Type inferInvocationTypeContextual(Invocation invocation, TypePath path) { + exists(TypePath path0 | + result = inferType(invocation, path0) and + // index expression `x[i]` desugars to `*x.index(i)`, so we must account for + // the implicit deref + if invocation instanceof IndexExpr or invocation instanceof DerefExpr + then path = TypePath::cons(getRefTypeParameter(_), path0) + else path = path0 + ) + } + + class Closure extends Expr, Callable instanceof Rust::ClosureExpr { } + + class ClosureParameterPseudoType extends T::ClosureParameterPseudoType { + Parameter getParameter() { result = this.getParam() } + } + + /** + * Gets the root type of a closure. + * + * We model closures as `dyn Fn` trait object types. A closure might implement + * only `Fn`, `FnMut`, or `FnOnce`. But since `Fn` is a subtrait of the others, + * giving closures the type `dyn Fn` works well in practice -- even if not + * entirely accurate. + */ + pragma[nomagic] + private Type closureRootType() { + result = TDynTraitType(any(FnTrait t)) // always exists because of the mention in `builtins/mentions.rs` + } + + bindingset[c] + Type getClosureType(Closure c) { + result = closureRootType() and + exists(c) + } + + /** Gets the path to a closure's `index`th parameter type, where the arity is `arity`. */ + pragma[nomagic] + private TypePath closureParameterPath(int arity, int index) { + result = + TypePath::cons(TDynTraitTypeParameter(_, any(FnTrait t).getTypeParam()), + TypePath::singleton(getTupleTypeParameter(arity, index))) + } + + TypePath getClosureParameterTypePath(Parameter p) { + exists(ClosureExpr ce, int index | + p = ce.getParam(index) and + result = closureParameterPath(ce.getNumberOfParams(), index) + ) + } + + /** Gets the path to a closure's return type. */ + pragma[nomagic] + private TypePath closureReturnPath() { + result = + TypePath::singleton(TDynTraitTypeParameter(any(FnTrait t), any(FnOnceTrait t).getOutputType())) + } + + bindingset[c] + TypePath getClosureReturnTypePath(Closure c) { + result = closureReturnPath() and + exists(c) + } + + pragma[nomagic] + private Type inferClosureArgsType(ClosureExpr ce, TypePath path) { + path = TypePath::singleton(TDynTraitTypeParameter(_, any(FnTrait t).getTypeParam())) and + result.(TupleType).getArity() = ce.getNumberOfParams() + } + + predicate stepLanguageSpecific(AstNode n1, TypePath prefix1, AstNode n2, TypePath prefix2) { + // When `n2` is `*n1` propagate type information from a raw pointer type + // parameter at `n1` (all other deref expressions are handled as calls) + n1 = n2.(DerefExpr).getExpr() and + prefix1 = TypePath::singleton(getPtrTypeParameter()) and + prefix2.isEmpty() + or + prefix1.isEmpty() and + ( + prefix2 = TypePath::singleton(getArrayTypeParameter()) and + ( + n1 = n2.(ArrayListExpr).getAnExpr() + or + n2.(ArrayRepeatExpr).getRepeatOperand() = n1 + ) + or + exists(Struct s | + n1 = [n2.(RangeExpr).getStart(), n2.(RangeExpr).getEnd()] and + prefix2 = + TypePath::singleton(TTypeParamTypeParameter(s.getGenericParamList().getATypeParam())) and + s = getRangeType(n2) + ) + or + n2 = + any(RefExpr re | + n1 = re.getExpr() and + prefix2 = TypePath::singleton(inferRefExprType(re).getPositionalTypeParameter(0)) + ) + or + exists(BlockExpr be | + n2 = be and + n1 = be.getStmtList().getTailExpr() and + if be.isAsync() + then prefix2 = TypePath::singleton(getDynFutureOutputTypeParameter()) + else prefix2.isEmpty() + ) + or + // Rust closure types like `Fn<(A, B) -> C>` are syntactic sugar for `Fn`, + // so in calls to a closure, we consider the entire argument list as a single tuple argument. + exists(CallExprImpl::DynamicCallExpr dce, TupleType tt, int i | + n1 = dce.getSyntacticPositionalArgument(i) and + n2 = dce.getArgList() and + tt.getArity() = dce.getNumberOfSyntacticArguments() and + prefix2 = TypePath::singleton(tt.getPositionalTypeParameter(i)) + ) + or + n1 = + any(IdentPat ip | + n2 = ip.getName() and + if ip.isRef() + then + exists(boolean isMutable | if ip.isMut() then isMutable = true else isMutable = false | + prefix2 = TypePath::singleton(getRefTypeParameter(isMutable)) + ) + else prefix2.isEmpty() + ) + or + prefix2.isEmpty() and + ( + n2 = n1.(OrPat).getAPat() + or + n2 = n1.(ParenPat).getPat() + or + n2 = n1.(LiteralPat).getLiteral() + or + exists(BreakExpr break | + break.getExpr() = n1 and + break.getTarget() = n2.(LoopExpr) + ) + or + n1 = n2.(MacroExpr).getMacroCall().getMacroCallExpansion() and + not isPanicMacroCall(n2) + or + n1 = n2.(MacroPat).getMacroCall().getMacroCallExpansion() + ) + ) + or + n1 = + any(RefPat rp | + n2 = rp.getPat() and + prefix2.isEmpty() and + exists(boolean isMutable | if rp.isMut() then isMutable = true else isMutable = false | + prefix1 = TypePath::singleton(getRefTypeParameter(isMutable)) + ) + ) + or + exists(int i, int arity, TypePath path | + path = TypePath::singleton(getTupleTypeParameter(arity, i)) + | + arity = n2.(TupleExpr).getNumberOfFields() and + n1 = n2.(TupleExpr).getField(i) and + prefix1.isEmpty() and + prefix2 = path + or + arity = n1.(TuplePat).getTupleArity() and + n2 = n1.(TuplePat).getField(i) and + prefix2.isEmpty() and + prefix1 = path + ) + or + exists(TypeParam tp, Enum e | + n1 = n2.(TryExpr).getExpr() and + tp = e.getGenericParamList().getGenericParam(0) and + prefix1 = TypePath::singleton(TTypeParamTypeParameter(tp)) and + prefix2.isEmpty() + | + e instanceof ResultEnum + or + e instanceof OptionEnum + ) + } + + pragma[nomagic] + private Type inferUnknownType(AstNode n, TypePath path) { + result = TUnknownType() and + ( + n.(AssocFunctionResolution::AssocFunctionCall).resolutionDependsOnReturnType(path) + or + path.isEmpty() and + isPanicMacroCall(n) + or + n.(ArrayListExpr).getNumberOfExprs() = 0 and + path = TypePath::singleton(getArrayTypeParameter()) + ) + } + + pragma[nomagic] + Type inferTypeLanguageSpecific(AstNode n, TypePath path) { + result = inferLiteralType(n, path, false) + or + result = inferAwaitExprType(n, path) + or + result = inferForLoopExprType(n, path) + or + result = inferDeconstructionPatType(n, path) + or + result = inferUnknownType(n, path) + } + + pragma[nomagic] + Type inferTypeCertainLanguageSpecific(AstNode n, TypePath path) { + result = inferLiteralType(n, path, true) + or + result = inferRefPatType(n) and + path.isEmpty() + or + result = inferStructExprType(n, path) + or + result = inferStructPatType(n, path) + or + result = inferEmptyArrayListExprType(n) and + path.isEmpty() + or + result = inferRangeFullExprType(n) and + path.isEmpty() + or + result = inferTupleRootType(n) and + path.isEmpty() + or + result = inferAsyncUnitBlockExprType(n, path) + or + exprHasUnitType(n) and + path.isEmpty() and + result instanceof UnitType + or + result = inferClosureArgsType(n, path) + } +} + +private module M3 = Make3; + +predicate inferType = M3::inferType/1; + +predicate inferType = M3::inferType/2; + +predicate inferTypeCertain = M3::inferTypeCertain/2; + +module Consistency = M3::Consistency; + +module CachedStage = M3::CachedStage; + +private predicate typeTestAstNodeRepr(AstNode n, string repr) { + repr = [n.toString(), n.(IdentPat).getName().getText()] +} + +module TypeTest implements TestSig { + private module M = M3::TypeTest; + + import M + + predicate hasOptionalResult = M::hasOptionalResult/4; +} + +/** Provides predicates for debugging the type inference implementation. */ +private module Debug { + Locatable getRelevantLocatable() { + exists(string filepath, int startline, int startcolumn, int endline, int endcolumn | + result.getLocation().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) and + filepath.matches("%/main.rs") and + startline = 103 + ) + } + + Type debugInferType(AstNode n, TypePath path) { + n = getRelevantLocatable() and + result = inferType(n, path) + } + + Addressable debugResolveCallTarget(InvocationExpr c, boolean dispatch) { + c = getRelevantLocatable() and + result = resolveCallTarget(c, dispatch) + } + + predicate debugConditionSatisfiesConstraint( + TypeAbstraction abs, TypeMention condition, TypeMention constraint, boolean transitive + ) { + abs = getRelevantLocatable() and + Input2::conditionSatisfiesConstraint(abs, condition, constraint, transitive) + } + + predicate debugInferShorthandSelfType(ShorthandSelfParameterMention self, TypePath path, Type t) { + self = getRelevantLocatable() and + t = self.getTypeAt(path) + } + + predicate debugTypeMention(TypeMention tm, TypePath path, Type type) { + tm = getRelevantLocatable() and + tm.getTypeAt(path) = type + } + + predicate atLimit = M3::Debug::atLimit/1; + + predicate inferTypeForNodeAtLimit = M3::Debug::inferTypeForNodeAtLimit/2; + + predicate countTypesForNodeAtLimit = M3::Debug::countTypesForNodeAtLimit/2; + + predicate maxTypes = M3::Debug::maxTypes/4; + + predicate maxTypePath = M3::Debug::maxTypePath/4; + + predicate maxTypePaths = M3::Debug::maxTypePaths/4; + + Type debugInferTypeCertain(AstNode n, TypePath path) { n = getRelevantLocatable() and - result = CertainTypeInference::inferCertainType(n, path) + result = inferTypeCertain(n, path) } Type debugInferCertainNonUniqueType(AstNode n, TypePath path) { n = getRelevantLocatable() and - Consistency::nonUniqueCertainType(n, path, result) + Consistency::nonUniqueCertainType(n, path) and + result = inferTypeCertain(n, path) } } diff --git a/rust/ql/lib/codeql/rust/internal/typeinference/TypeInferenceConsistency.qll b/rust/ql/lib/codeql/rust/internal/typeinference/TypeInferenceConsistency.qll index 96e0bea2f189..d21caec86513 100644 --- a/rust/ql/lib/codeql/rust/internal/typeinference/TypeInferenceConsistency.qll +++ b/rust/ql/lib/codeql/rust/internal/typeinference/TypeInferenceConsistency.qll @@ -10,11 +10,7 @@ private import TypeInference::Consistency as Consistency import TypeInference::Consistency query predicate illFormedTypeMention(TypeMention tm) { - // NOTE: We do not use `illFormedTypeMention` from the shared library as it is - // instantiated with `PreTypeMention` and we are interested in inconsistencies - // for `TypeMention`. - not exists(tm.getTypeAt(TypePath::nil())) and - exists(tm.getLocation()) and + Consistency::illFormedTypeMention(tm) and // avoid overlap with `PathTypeMention` not tm instanceof PathTypeReprMention and // known limitation for type mentions that would mention an escaping type parameter @@ -31,7 +27,7 @@ query predicate illFormedTypeMention(TypeMention tm) { } query predicate nonUniqueCertainType(AstNode n, TypePath path) { - Consistency::nonUniqueCertainType(n, path, _) and + Consistency::nonUniqueCertainType(n, path) and n.fromSource() // Only include inconsistencies in the source. } diff --git a/rust/ql/lib/codeql/rust/internal/typeinference/TypeMention.qll b/rust/ql/lib/codeql/rust/internal/typeinference/TypeMention.qll index c4650f97c34b..dd510de72e0e 100644 --- a/rust/ql/lib/codeql/rust/internal/typeinference/TypeMention.qll +++ b/rust/ql/lib/codeql/rust/internal/typeinference/TypeMention.qll @@ -601,10 +601,12 @@ private module MkTypeMention::new(); // $ target=new + let mut key_to_key = HashMap::<_, &Key>::new(); // $ target=new let mut key = &Key {}; // Initialize key2 to a reference if let Some(ref_key) = key_to_key.get(key) { // $ target=get // Below `ref_key` is implicitly dereferenced from `&&Key` to `&Key` diff --git a/rust/ql/test/library-tests/type-inference/main.rs b/rust/ql/test/library-tests/type-inference/main.rs index 9f3bcff4cce1..5c47ebe15438 100644 --- a/rust/ql/test/library-tests/type-inference/main.rs +++ b/rust/ql/test/library-tests/type-inference/main.rs @@ -1085,7 +1085,7 @@ mod option_methods { struct S; pub fn f() { - let x1 = MyOption::::new(); // $ certainType=x1@MyOption:S target=new + let x1 = MyOption::::new(); // $ type=x1@MyOption:S target=new println!("{:?}", x1); let mut x2 = MyOption::new(); // $ target=new @@ -1970,7 +1970,7 @@ mod impl_trait { impl MyTrait for S3 { fn get_a(&self) -> T { let S3(t) = self; - t.clone() + t.clone() // $ MISSING: target=clone type=t@&:T (we do not currently handle complex "binding modes") } } @@ -2416,10 +2416,10 @@ mod explicit_type_args { pub fn f() { let x1: Option> = S1::assoc_fun(); // $ certainType=x1@Option.S1:S2 target=assoc_fun - let x2 = S1::::assoc_fun(); // $ certainType=x2@Option.S1:S2 target=assoc_fun - let x3 = S3::assoc_fun(); // $ certainType=x3@Option.S1:S2 target=assoc_fun - let x4 = S1::::method(S1::default()); // $ target=method target=default certainType=x4@S1:S2 - let x5 = S3::method(S1::default()); // $ target=method target=default certainType=x5@S1:S2 + let x2 = S1::::assoc_fun(); // $ type=x2@Option.S1:S2 target=assoc_fun + let x3 = S3::assoc_fun(); // $ type=x3@Option.S1:S2 target=assoc_fun + let x4 = S1::::method(S1::default()); // $ target=method target=default type=x4@S1:S2 + let x5 = S3::method(S1::default()); // $ target=method target=default type=x5@S1:S2 let x6 = S4::(Default::default()); // $ type=x6@S4:S2 target=default let x7 = S4(S2); // $ type=x7@S4:S2 let x8 = S4(0); // $ type=x8@S4:i32 @@ -2434,8 +2434,8 @@ mod explicit_type_args { { field: S2::default(), // $ target=default }; - let x14 = foo::(Default::default()); // $ certainType=x14:i32 target=default target=foo - let x15 = S1::::default(); // $ certainType=x15@S1:S2 target=default + let x14 = foo::(Default::default()); // $ type=x14:i32 target=default target=foo + let x15 = S1::::default(); // $ type=x15@S1:S2 target=default } } @@ -2451,8 +2451,8 @@ mod tuples { } pub fn f() { - let a = S1::get_pair(); // $ target=get_pair certainType=a:(T_2) - let mut b = S1::get_pair(); // $ target=get_pair certainType=b:(T_2) + let a = S1::get_pair(); // $ target=get_pair type=a:(T_2) + let mut b = S1::get_pair(); // $ target=get_pair type=b:(T_2) let (c, d) = S1::get_pair(); // $ target=get_pair type=c:S1 type=d:S1 let (mut e, f) = S1::get_pair(); // $ target=get_pair type=e:S1 type=f:S1 let (mut g, mut h) = S1::get_pair(); // $ target=get_pair type=g:S1 type=h:S1 @@ -2550,11 +2550,11 @@ pub mod path_buf { } pub fn f() { - let path1 = Path::new(); // $ target=new certainType=path1:Path + let path1 = Path::new(); // $ target=new type=path1:Path let path2 = path1.canonicalize(); // $ target=canonicalize let path3 = path2.unwrap(); // $ target=unwrap type=path3:PathBuf - let pathbuf1 = PathBuf::new(); // $ target=new certainType=pathbuf1:PathBuf + let pathbuf1 = PathBuf::new(); // $ target=new type=pathbuf1:PathBuf let pathbuf2 = pathbuf1.canonicalize(); // $ target=canonicalize let pathbuf3 = pathbuf2.unwrap(); // $ target=unwrap type=pathbuf3:PathBuf } @@ -2754,7 +2754,7 @@ mod literal_overlap { pub fn f() -> usize { let mut x = 0; - x = x.f(); // $ target=usizef $ SPURIOUS: target=i32f + x = x.f(); // $ MISSING: target=usizef $ SPURIOUS: target=i32f x } @@ -2803,7 +2803,7 @@ mod arg_trait_bounds { fn empty_array() { let arr1: [i32; 0] = []; // $ type=arr1@[;]:i32 let arr2 = [true; 0]; // $ type=arr2@[;]:bool - let arr3 = []; // $ MISSING: type=arr3@[;]:i32 + let arr3 = []; // $ type=arr3@[;]:i32 fn pin_array(arr: [T; 0], x: T) {} pin_array(arr3, 1); // $ target=pin_array diff --git a/rust/ql/test/library-tests/type-inference/overloading.rs b/rust/ql/test/library-tests/type-inference/overloading.rs index 06353a12c8f2..2c442db4afdd 100644 --- a/rust/ql/test/library-tests/type-inference/overloading.rs +++ b/rust/ql/test/library-tests/type-inference/overloading.rs @@ -509,7 +509,7 @@ mod trait_bound_impl_overlap { fn test() { let x = S(0); - let y = call_f(x); // $ target=call_f type=y:i32 + let y = call_f(x); // $ target=call_f $ MISSING: type=y:i32 (we currently do not detect that contextual inference is needed) let z: i32 = y; let x = S(0); diff --git a/rust/ql/test/library-tests/type-inference/pattern_matching.rs b/rust/ql/test/library-tests/type-inference/pattern_matching.rs index bc85b0ee96ff..b00dfc95212d 100755 --- a/rust/ql/test/library-tests/type-inference/pattern_matching.rs +++ b/rust/ql/test/library-tests/type-inference/pattern_matching.rs @@ -779,13 +779,13 @@ pub fn patterns_in_function_parameters() { // Call the functions to use them let point = Point { x: 5, y: 10 }; - let extracted = extract_point(point); // $ target=extract_point certainType=extracted@(T_2):i32 certainType=extracted@(T_2):i32 + let extracted = extract_point(point); // $ target=extract_point type=extracted@(T_2):i32 type=extracted@(T_2):i32 let color = Color(200, 100, 50); - let red = extract_color(color); // $ target=extract_color certainType=red:u8 + let red = extract_color(color); // $ target=extract_color type=red:u8 let tuple = (42i32, 3.14f64, true); - let tuple_extracted = extract_tuple(tuple); // $ target=extract_tuple certainType=tuple_extracted@(T_2):i32 certainType=tuple_extracted@(T_2):bool + let tuple_extracted = extract_tuple(tuple); // $ target=extract_tuple type=tuple_extracted@(T_2):i32 type=tuple_extracted@(T_2):bool } #[rustfmt::skip] diff --git a/rust/ql/test/library-tests/type-inference/type-inference.expected b/rust/ql/test/library-tests/type-inference/type-inference.expected index 6209ef5422c5..1a79f6472b32 100644 --- a/rust/ql/test/library-tests/type-inference/type-inference.expected +++ b/rust/ql/test/library-tests/type-inference/type-inference.expected @@ -1,7 +1,6 @@ inferCertainType | associated_types.rs:5:15:5:18 | SelfParam | | associated_types.rs:1:1:2:21 | Wrapper | | associated_types.rs:5:15:5:18 | SelfParam | A | associated_types.rs:4:6:4:6 | A | -| associated_types.rs:5:26:7:5 | { ... } | | associated_types.rs:4:6:4:6 | A | | associated_types.rs:6:9:6:12 | self | | associated_types.rs:1:1:2:21 | Wrapper | | associated_types.rs:6:9:6:12 | self | A | associated_types.rs:4:6:4:6 | A | | associated_types.rs:23:12:23:16 | SelfParam | | {EXTERNAL LOCATION} | & | @@ -12,14 +11,12 @@ inferCertainType | associated_types.rs:26:37:26:38 | { ... } | | {EXTERNAL LOCATION} | () | | associated_types.rs:29:43:29:46 | item | | {EXTERNAL LOCATION} | & | | associated_types.rs:29:43:29:46 | item | TRef | associated_types.rs:29:11:29:40 | T | -| associated_types.rs:29:58:31:1 | { ... } | | associated_types.rs:29:8:29:8 | O | | associated_types.rs:30:5:30:8 | item | | {EXTERNAL LOCATION} | & | | associated_types.rs:30:5:30:8 | item | TRef | associated_types.rs:29:11:29:40 | T | | associated_types.rs:37:20:37:24 | SelfParam | | {EXTERNAL LOCATION} | & | | associated_types.rs:37:20:37:24 | SelfParam | TRef | associated_types.rs:33:1:38:1 | Self [trait AnotherGet] | | associated_types.rs:44:12:44:16 | SelfParam | | {EXTERNAL LOCATION} | & | | associated_types.rs:44:12:44:16 | SelfParam | TRef | associated_types.rs:10:1:11:9 | S | -| associated_types.rs:44:35:46:5 | { ... } | | associated_types.rs:16:1:17:10 | S3 | | associated_types.rs:53:20:53:24 | SelfParam | | {EXTERNAL LOCATION} | & | | associated_types.rs:53:20:53:24 | SelfParam | TRef | associated_types.rs:10:1:11:9 | S | | associated_types.rs:53:50:55:5 | { ... } | | {EXTERNAL LOCATION} | bool | @@ -27,7 +24,6 @@ inferCertainType | associated_types.rs:62:12:62:16 | SelfParam | | {EXTERNAL LOCATION} | & | | associated_types.rs:62:12:62:16 | SelfParam | TRef | associated_types.rs:1:1:2:21 | Wrapper | | associated_types.rs:62:12:62:16 | SelfParam | TRef.A | associated_types.rs:58:6:58:12 | T | -| associated_types.rs:62:35:64:5 | { ... } | | associated_types.rs:58:6:58:12 | T | | associated_types.rs:63:9:63:12 | self | | {EXTERNAL LOCATION} | & | | associated_types.rs:63:9:63:12 | self | TRef | associated_types.rs:1:1:2:21 | Wrapper | | associated_types.rs:63:9:63:12 | self | TRef.A | associated_types.rs:58:6:58:12 | T | @@ -43,30 +39,30 @@ inferCertainType | associated_types.rs:81:9:81:11 | 'a' | | {EXTERNAL LOCATION} | char | | associated_types.rs:92:15:92:18 | SelfParam | | associated_types.rs:88:5:103:5 | Self [trait MyTrait] | | associated_types.rs:94:15:94:18 | SelfParam | | associated_types.rs:88:5:103:5 | Self [trait MyTrait] | -| associated_types.rs:98:9:102:9 | { ... } | | associated_types.rs:89:9:89:28 | AssociatedType[MyTrait] | | associated_types.rs:99:13:99:16 | self | | associated_types.rs:88:5:103:5 | Self [trait MyTrait] | | associated_types.rs:109:15:109:18 | SelfParam | | associated_types.rs:10:1:11:9 | S | -| associated_types.rs:109:45:111:9 | { ... } | | associated_types.rs:16:1:17:10 | S3 | | associated_types.rs:118:15:118:18 | SelfParam | | associated_types.rs:13:1:14:10 | S2 | -| associated_types.rs:118:45:120:9 | { ... } | | associated_types.rs:1:1:2:21 | Wrapper | -| associated_types.rs:118:45:120:9 | { ... } | A | associated_types.rs:13:1:14:10 | S2 | | associated_types.rs:119:21:119:24 | self | | associated_types.rs:13:1:14:10 | S2 | | associated_types.rs:123:19:137:5 | { ... } | | {EXTERNAL LOCATION} | () | +| associated_types.rs:126:9:126:33 | MacroExpr | | {EXTERNAL LOCATION} | () | | associated_types.rs:126:18:126:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | associated_types.rs:126:18:126:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| associated_types.rs:126:18:126:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | associated_types.rs:126:18:126:32 | { ... } | | {EXTERNAL LOCATION} | () | +| associated_types.rs:126:18:126:32 | { ... } | | {EXTERNAL LOCATION} | () | +| associated_types.rs:131:9:131:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | associated_types.rs:131:18:131:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | associated_types.rs:131:18:131:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| associated_types.rs:131:18:131:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | associated_types.rs:131:18:131:26 | { ... } | | {EXTERNAL LOCATION} | () | +| associated_types.rs:131:18:131:26 | { ... } | | {EXTERNAL LOCATION} | () | +| associated_types.rs:134:9:134:33 | MacroExpr | | {EXTERNAL LOCATION} | () | | associated_types.rs:134:18:134:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | associated_types.rs:134:18:134:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| associated_types.rs:134:18:134:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | associated_types.rs:134:18:134:32 | { ... } | | {EXTERNAL LOCATION} | () | +| associated_types.rs:134:18:134:32 | { ... } | | {EXTERNAL LOCATION} | () | +| associated_types.rs:136:9:136:33 | MacroExpr | | {EXTERNAL LOCATION} | () | | associated_types.rs:136:18:136:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | associated_types.rs:136:18:136:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| associated_types.rs:136:18:136:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| associated_types.rs:136:18:136:32 | { ... } | | {EXTERNAL LOCATION} | () | | associated_types.rs:136:18:136:32 | { ... } | | {EXTERNAL LOCATION} | () | | associated_types.rs:144:9:144:9 | a | | associated_types.rs:16:1:17:10 | S3 | | associated_types.rs:145:9:145:9 | b | | {EXTERNAL LOCATION} | i32 | @@ -84,23 +80,18 @@ inferCertainType | associated_types.rs:173:17:173:21 | SelfParam | | {EXTERNAL LOCATION} | & | | associated_types.rs:173:17:173:21 | SelfParam | TRef | associated_types.rs:67:1:67:23 | Odd | | associated_types.rs:173:17:173:21 | SelfParam | TRef.OddT | {EXTERNAL LOCATION} | i32 | -| associated_types.rs:173:52:176:9 | { ... } | | {EXTERNAL LOCATION} | bool | | associated_types.rs:181:17:181:21 | SelfParam | | {EXTERNAL LOCATION} | & | | associated_types.rs:181:17:181:21 | SelfParam | TRef | associated_types.rs:67:1:67:23 | Odd | | associated_types.rs:181:17:181:21 | SelfParam | TRef.OddT | {EXTERNAL LOCATION} | bool | -| associated_types.rs:181:52:184:9 | { ... } | | {EXTERNAL LOCATION} | char | | associated_types.rs:187:19:192:5 | { ... } | | {EXTERNAL LOCATION} | () | -| associated_types.rs:188:9:188:34 | using_as(...) | | {EXTERNAL LOCATION} | () | | associated_types.rs:188:25:188:28 | true | | {EXTERNAL LOCATION} | bool | | associated_types.rs:188:31:188:33 | 'a' | | {EXTERNAL LOCATION} | char | | associated_types.rs:190:22:190:26 | 42i32 | | {EXTERNAL LOCATION} | i32 | | associated_types.rs:191:22:191:25 | true | | {EXTERNAL LOCATION} | bool | | associated_types.rs:206:20:206:20 | t | | associated_types.rs:204:17:204:17 | T | | associated_types.rs:211:20:211:20 | t | | {EXTERNAL LOCATION} | bool | -| associated_types.rs:211:45:217:9 | { ... } | | {EXTERNAL LOCATION} | i32 | | associated_types.rs:212:16:212:16 | t | | {EXTERNAL LOCATION} | bool | | associated_types.rs:222:20:222:20 | t | | {EXTERNAL LOCATION} | i32 | -| associated_types.rs:222:44:224:9 | { ... } | | {EXTERNAL LOCATION} | bool | | associated_types.rs:223:13:223:13 | t | | {EXTERNAL LOCATION} | i32 | | associated_types.rs:229:23:229:27 | SelfParam | | {EXTERNAL LOCATION} | & | | associated_types.rs:229:23:229:27 | SelfParam | TRef | associated_types.rs:10:1:11:9 | S | @@ -109,22 +100,17 @@ inferCertainType | associated_types.rs:237:19:241:5 | { ... } | | {EXTERNAL LOCATION} | () | | associated_types.rs:239:28:239:31 | true | | {EXTERNAL LOCATION} | bool | | associated_types.rs:248:30:248:34 | thing | | associated_types.rs:248:19:248:27 | T | -| associated_types.rs:248:65:250:5 | { ... } | | associated_types.rs:248:19:248:27 | T::Output[GetSet] | | associated_types.rs:249:9:249:13 | thing | | associated_types.rs:248:19:248:27 | T | | associated_types.rs:252:33:252:37 | thing | | associated_types.rs:252:22:252:30 | T | -| associated_types.rs:252:56:254:5 | { ... } | | associated_types.rs:252:22:252:30 | T::Output[GetSet] | | associated_types.rs:253:9:253:13 | thing | | associated_types.rs:252:22:252:30 | T | | associated_types.rs:256:48:256:52 | thing | | associated_types.rs:256:33:256:45 | T | | associated_types.rs:256:91:261:5 | { ... } | | {EXTERNAL LOCATION} | (T_2) | -| associated_types.rs:256:91:261:5 | { ... } | T0 | associated_types.rs:256:33:256:45 | T::Output[GetSet] | -| associated_types.rs:256:91:261:5 | { ... } | T1 | associated_types.rs:256:33:256:45 | T::AnotherOutput[AnotherGet] | | associated_types.rs:257:9:260:9 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | | associated_types.rs:258:13:258:17 | thing | | associated_types.rs:256:33:256:45 | T | | associated_types.rs:259:13:259:17 | thing | | associated_types.rs:256:33:256:45 | T | | associated_types.rs:268:20:268:24 | SelfParam | | {EXTERNAL LOCATION} | & | | associated_types.rs:268:20:268:24 | SelfParam | TRef | associated_types.rs:1:1:2:21 | Wrapper | | associated_types.rs:268:20:268:24 | SelfParam | TRef.A | associated_types.rs:264:10:264:11 | TI | -| associated_types.rs:268:41:270:9 | { ... } | | associated_types.rs:264:10:264:11 | TI::Output[GetSet] | | associated_types.rs:269:13:269:16 | self | | {EXTERNAL LOCATION} | & | | associated_types.rs:269:13:269:16 | self | TRef | associated_types.rs:1:1:2:21 | Wrapper | | associated_types.rs:269:13:269:16 | self | TRef.A | associated_types.rs:264:10:264:11 | TI | @@ -134,7 +120,6 @@ inferCertainType | associated_types.rs:286:21:286:25 | SelfParam | TRef | associated_types.rs:282:5:287:5 | Self [trait GetSetWrap] | | associated_types.rs:293:21:293:25 | SelfParam | | {EXTERNAL LOCATION} | & | | associated_types.rs:293:21:293:25 | SelfParam | TRef | associated_types.rs:10:1:11:9 | S | -| associated_types.rs:293:43:295:9 | { ... } | | associated_types.rs:10:1:11:9 | S | | associated_types.rs:303:21:303:25 | SelfParam | | {EXTERNAL LOCATION} | & | | associated_types.rs:303:21:303:25 | SelfParam | TRef | associated_types.rs:1:1:2:21 | Wrapper | | associated_types.rs:303:21:303:25 | SelfParam | TRef.A | associated_types.rs:299:10:299:11 | TI | @@ -143,7 +128,6 @@ inferCertainType | associated_types.rs:304:13:304:16 | self | TRef.A | associated_types.rs:299:10:299:11 | TI | | associated_types.rs:308:19:322:5 | { ... } | | {EXTERNAL LOCATION} | () | | associated_types.rs:311:13:314:9 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | -| associated_types.rs:314:13:314:39 | tp_assoc_from_supertrait(...) | | {EXTERNAL LOCATION} | (T_2) | | associated_types.rs:329:26:329:26 | x | | associated_types.rs:329:23:329:23 | T | | associated_types.rs:332:5:334:5 | { ... } | | {EXTERNAL LOCATION} | () | | associated_types.rs:333:18:333:18 | x | | associated_types.rs:329:23:329:23 | T | @@ -151,12 +135,14 @@ inferCertainType | associated_types.rs:340:5:344:5 | { ... } | | {EXTERNAL LOCATION} | () | | associated_types.rs:341:19:341:19 | x | | associated_types.rs:337:21:337:21 | T | | associated_types.rs:342:23:342:24 | &x | | {EXTERNAL LOCATION} | & | +| associated_types.rs:342:23:342:24 | &x | TRef | associated_types.rs:337:21:337:21 | T | | associated_types.rs:342:24:342:24 | x | | associated_types.rs:337:21:337:21 | T | | associated_types.rs:343:18:343:18 | x | | associated_types.rs:337:21:337:21 | T | | associated_types.rs:347:23:347:23 | x | | associated_types.rs:347:20:347:20 | T | | associated_types.rs:351:5:355:5 | { ... } | | {EXTERNAL LOCATION} | () | | associated_types.rs:352:19:352:19 | x | | associated_types.rs:347:20:347:20 | T | | associated_types.rs:353:23:353:24 | &x | | {EXTERNAL LOCATION} | & | +| associated_types.rs:353:23:353:24 | &x | TRef | associated_types.rs:347:20:347:20 | T | | associated_types.rs:353:24:353:24 | x | | associated_types.rs:347:20:347:20 | T | | associated_types.rs:354:18:354:18 | x | | associated_types.rs:347:20:347:20 | T | | associated_types.rs:361:17:361:21 | SelfParam | | {EXTERNAL LOCATION} | & | @@ -172,7 +158,6 @@ inferCertainType | associated_types.rs:384:23:384:27 | SelfParam | TRef | associated_types.rs:377:5:388:5 | Self [trait MyTraitAssoc2] | | associated_types.rs:384:30:384:30 | a | | associated_types.rs:384:20:384:20 | A | | associated_types.rs:384:36:384:36 | b | | associated_types.rs:384:20:384:20 | A | -| associated_types.rs:384:76:387:9 | { ... } | | associated_types.rs:378:9:378:52 | GenericAssociatedType[MyTraitAssoc2] | | associated_types.rs:385:13:385:16 | self | | {EXTERNAL LOCATION} | & | | associated_types.rs:385:13:385:16 | self | TRef | associated_types.rs:377:5:388:5 | Self [trait MyTraitAssoc2] | | associated_types.rs:385:22:385:22 | a | | associated_types.rs:384:20:384:20 | A | @@ -182,8 +167,6 @@ inferCertainType | associated_types.rs:395:19:395:23 | SelfParam | | {EXTERNAL LOCATION} | & | | associated_types.rs:395:19:395:23 | SelfParam | TRef | associated_types.rs:10:1:11:9 | S | | associated_types.rs:395:26:395:26 | a | | associated_types.rs:395:16:395:16 | A | -| associated_types.rs:395:46:397:9 | { ... } | | associated_types.rs:1:1:2:21 | Wrapper | -| associated_types.rs:395:46:397:9 | { ... } | A | associated_types.rs:395:16:395:16 | A | | associated_types.rs:396:21:396:21 | a | | associated_types.rs:395:16:395:16 | A | | associated_types.rs:400:19:407:5 | { ... } | | {EXTERNAL LOCATION} | () | | associated_types.rs:403:25:403:28 | 1i32 | | {EXTERNAL LOCATION} | i32 | @@ -197,13 +180,10 @@ inferCertainType | associated_types.rs:422:20:422:24 | SelfParam | TRef | associated_types.rs:413:5:423:5 | Self [trait TraitMultipleAssoc] | | associated_types.rs:429:21:429:25 | SelfParam | | {EXTERNAL LOCATION} | & | | associated_types.rs:429:21:429:25 | SelfParam | TRef | associated_types.rs:16:1:17:10 | S3 | -| associated_types.rs:429:34:431:9 | { ... } | | associated_types.rs:16:1:17:10 | S3 | | associated_types.rs:433:20:433:24 | SelfParam | | {EXTERNAL LOCATION} | & | | associated_types.rs:433:20:433:24 | SelfParam | TRef | associated_types.rs:16:1:17:10 | S3 | -| associated_types.rs:433:43:435:9 | { ... } | | associated_types.rs:10:1:11:9 | S | | associated_types.rs:437:20:437:24 | SelfParam | | {EXTERNAL LOCATION} | & | | associated_types.rs:437:20:437:24 | SelfParam | TRef | associated_types.rs:16:1:17:10 | S3 | -| associated_types.rs:437:43:439:9 | { ... } | | associated_types.rs:13:1:14:10 | S2 | | associated_types.rs:442:19:446:5 | { ... } | | {EXTERNAL LOCATION} | () | | associated_types.rs:454:24:454:28 | SelfParam | | {EXTERNAL LOCATION} | & | | associated_types.rs:454:24:454:28 | SelfParam | TRef | associated_types.rs:452:5:455:5 | Self [trait Subtrait] | @@ -221,7 +201,6 @@ inferCertainType | associated_types.rs:474:16:474:20 | SelfParam | | {EXTERNAL LOCATION} | & | | associated_types.rs:474:16:474:20 | SelfParam | TRef | associated_types.rs:469:5:469:24 | MyType | | associated_types.rs:474:16:474:20 | SelfParam | TRef.T | associated_types.rs:471:10:471:16 | T | -| associated_types.rs:474:39:476:9 | { ... } | | associated_types.rs:471:10:471:16 | T | | associated_types.rs:475:13:475:16 | self | | {EXTERNAL LOCATION} | & | | associated_types.rs:475:13:475:16 | self | TRef | associated_types.rs:469:5:469:24 | MyType | | associated_types.rs:475:13:475:16 | self | TRef.T | associated_types.rs:471:10:471:16 | T | @@ -230,28 +209,25 @@ inferCertainType | associated_types.rs:478:16:478:20 | SelfParam | TRef.T | associated_types.rs:471:10:471:16 | T | | associated_types.rs:478:23:478:30 | _content | | associated_types.rs:471:10:471:16 | T | | associated_types.rs:478:47:480:9 | { ... } | | {EXTERNAL LOCATION} | () | +| associated_types.rs:479:13:479:43 | MacroExpr | | {EXTERNAL LOCATION} | () | | associated_types.rs:479:22:479:42 | "Inserting content: \\n" | | {EXTERNAL LOCATION} | & | | associated_types.rs:479:22:479:42 | "Inserting content: \\n" | TRef | {EXTERNAL LOCATION} | str | -| associated_types.rs:479:22:479:42 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| associated_types.rs:479:22:479:42 | { ... } | | {EXTERNAL LOCATION} | () | | associated_types.rs:479:22:479:42 | { ... } | | {EXTERNAL LOCATION} | () | | associated_types.rs:485:24:485:28 | SelfParam | | {EXTERNAL LOCATION} | & | | associated_types.rs:485:24:485:28 | SelfParam | TRef | associated_types.rs:469:5:469:24 | MyType | | associated_types.rs:485:24:485:28 | SelfParam | TRef.T | associated_types.rs:483:10:483:16 | T | -| associated_types.rs:485:47:487:9 | { ... } | | associated_types.rs:483:10:483:16 | T | | associated_types.rs:486:15:486:18 | self | | {EXTERNAL LOCATION} | & | | associated_types.rs:486:15:486:18 | self | TRef | associated_types.rs:469:5:469:24 | MyType | | associated_types.rs:486:15:486:18 | self | TRef.T | associated_types.rs:483:10:483:16 | T | | associated_types.rs:492:24:492:28 | SelfParam | | {EXTERNAL LOCATION} | & | | associated_types.rs:492:24:492:28 | SelfParam | TRef | associated_types.rs:67:1:67:23 | Odd | | associated_types.rs:492:24:492:28 | SelfParam | TRef.OddT | {EXTERNAL LOCATION} | i32 | -| associated_types.rs:492:47:495:9 | { ... } | | {EXTERNAL LOCATION} | bool | | associated_types.rs:500:24:500:28 | SelfParam | | {EXTERNAL LOCATION} | & | | associated_types.rs:500:24:500:28 | SelfParam | TRef | associated_types.rs:67:1:67:23 | Odd | | associated_types.rs:500:24:500:28 | SelfParam | TRef.OddT | {EXTERNAL LOCATION} | bool | -| associated_types.rs:500:47:502:9 | { ... } | | {EXTERNAL LOCATION} | char | | associated_types.rs:505:33:505:36 | item | | {EXTERNAL LOCATION} | & | | associated_types.rs:505:33:505:36 | item | TRef | associated_types.rs:505:20:505:30 | T | -| associated_types.rs:505:56:507:5 | { ... } | | associated_types.rs:505:20:505:30 | T::Output[GetSet] | | associated_types.rs:506:9:506:12 | item | | {EXTERNAL LOCATION} | & | | associated_types.rs:506:9:506:12 | item | TRef | associated_types.rs:505:20:505:30 | T | | associated_types.rs:509:35:509:38 | item | | {EXTERNAL LOCATION} | & | @@ -276,9 +252,6 @@ inferCertainType | associated_types.rs:536:16:536:20 | SelfParam | | {EXTERNAL LOCATION} | & | | associated_types.rs:536:16:536:20 | SelfParam | TRef | associated_types.rs:529:5:529:20 | ST | | associated_types.rs:536:16:536:20 | SelfParam | TRef.T | associated_types.rs:531:10:531:21 | Output | -| associated_types.rs:536:39:538:9 | { ... } | | {EXTERNAL LOCATION} | Result | -| associated_types.rs:536:39:538:9 | { ... } | E | associated_types.rs:531:10:531:21 | Output | -| associated_types.rs:536:39:538:9 | { ... } | T | associated_types.rs:531:10:531:21 | Output | | associated_types.rs:537:16:537:19 | self | | {EXTERNAL LOCATION} | & | | associated_types.rs:537:16:537:19 | self | TRef | associated_types.rs:529:5:529:20 | ST | | associated_types.rs:537:16:537:19 | self | TRef.T | associated_types.rs:531:10:531:21 | Output | @@ -323,18 +296,9 @@ inferCertainType | associated_types.rs:565:19:565:19 | t | TRef.dyn(AnotherOutput) | {EXTERNAL LOCATION} | bool | | associated_types.rs:565:19:565:19 | t | TRef.dyn(Output) | {EXTERNAL LOCATION} | i32 | | associated_types.rs:569:15:578:1 | { ... } | | {EXTERNAL LOCATION} | () | -| associated_types.rs:570:5:570:48 | ...::test(...) | | {EXTERNAL LOCATION} | () | -| associated_types.rs:571:5:571:48 | ...::test(...) | | {EXTERNAL LOCATION} | () | -| associated_types.rs:572:5:572:59 | ...::test(...) | | {EXTERNAL LOCATION} | () | -| associated_types.rs:573:5:573:45 | ...::test(...) | | {EXTERNAL LOCATION} | () | -| associated_types.rs:574:5:574:35 | ...::test(...) | | {EXTERNAL LOCATION} | () | -| associated_types.rs:575:5:575:37 | ...::test(...) | | {EXTERNAL LOCATION} | () | -| associated_types.rs:576:5:576:41 | ...::test(...) | | {EXTERNAL LOCATION} | () | -| associated_types.rs:577:5:577:46 | ...::test(...) | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:15:18:15:22 | SelfParam | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:15:18:15:22 | SelfParam | TRef | blanket_impl.rs:9:5:10:14 | S2 | | blanket_impl.rs:15:42:17:9 | { ... } | | {EXTERNAL LOCATION} | & | -| blanket_impl.rs:15:42:17:9 | { ... } | TRef | blanket_impl.rs:6:5:7:14 | S1 | | blanket_impl.rs:16:13:16:15 | &S1 | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:21:19:21:23 | SelfParam | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:21:19:21:23 | SelfParam | TRef | blanket_impl.rs:20:5:22:5 | Self [trait Clone1] | @@ -342,49 +306,54 @@ inferCertainType | blanket_impl.rs:25:22:25:26 | SelfParam | TRef | blanket_impl.rs:24:5:28:5 | Self [trait Duplicatable] | | blanket_impl.rs:32:19:32:23 | SelfParam | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:32:19:32:23 | SelfParam | TRef | blanket_impl.rs:6:5:7:14 | S1 | -| blanket_impl.rs:32:34:34:9 | { ... } | | blanket_impl.rs:6:5:7:14 | S1 | | blanket_impl.rs:33:14:33:17 | self | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:33:14:33:17 | self | TRef | blanket_impl.rs:6:5:7:14 | S1 | | blanket_impl.rs:40:22:40:26 | SelfParam | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:40:22:40:26 | SelfParam | TRef | blanket_impl.rs:38:10:38:18 | T | -| blanket_impl.rs:40:37:42:9 | { ... } | | blanket_impl.rs:38:10:38:18 | T | | blanket_impl.rs:41:13:41:16 | self | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:41:13:41:16 | self | TRef | blanket_impl.rs:38:10:38:18 | T | | blanket_impl.rs:45:33:60:5 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:47:9:47:26 | MacroExpr | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:47:18:47:25 | "{x1:?}\\n" | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:47:18:47:25 | "{x1:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| blanket_impl.rs:47:18:47:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:47:18:47:25 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:47:18:47:25 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:48:18:48:22 | (...) | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:48:19:48:21 | &S1 | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:49:9:49:26 | MacroExpr | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:49:18:49:25 | "{x2:?}\\n" | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:49:18:49:25 | "{x2:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| blanket_impl.rs:49:18:49:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:49:18:49:25 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:49:18:49:25 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:51:9:51:26 | MacroExpr | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:51:18:51:25 | "{x3:?}\\n" | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:51:18:51:25 | "{x3:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| blanket_impl.rs:51:18:51:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:51:18:51:25 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:51:18:51:25 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:52:18:52:22 | (...) | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:52:19:52:21 | &S1 | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:53:9:53:26 | MacroExpr | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:53:18:53:25 | "{x4:?}\\n" | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:53:18:53:25 | "{x4:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| blanket_impl.rs:53:18:53:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:53:18:53:25 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:53:18:53:25 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:54:32:54:34 | &S1 | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:55:9:55:26 | MacroExpr | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:55:18:55:25 | "{x5:?}\\n" | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:55:18:55:25 | "{x5:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| blanket_impl.rs:55:18:55:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:55:18:55:25 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:55:18:55:25 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:57:9:57:26 | MacroExpr | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:57:18:57:25 | "{x6:?}\\n" | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:57:18:57:25 | "{x6:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| blanket_impl.rs:57:18:57:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:57:18:57:25 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:57:18:57:25 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:58:18:58:22 | (...) | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:58:19:58:21 | &S2 | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:59:9:59:26 | MacroExpr | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:59:18:59:25 | "{x7:?}\\n" | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:59:18:59:25 | "{x7:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| blanket_impl.rs:59:18:59:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:59:18:59:25 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:59:18:59:25 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:68:24:68:24 | x | | {EXTERNAL LOCATION} | i64 | | blanket_impl.rs:68:32:68:32 | y | | blanket_impl.rs:67:5:69:5 | Self [trait Trait1] | @@ -396,28 +365,28 @@ inferCertainType | blanket_impl.rs:78:13:78:13 | y | | blanket_impl.rs:64:5:65:14 | S1 | | blanket_impl.rs:84:24:84:24 | x | | {EXTERNAL LOCATION} | i64 | | blanket_impl.rs:84:32:84:32 | y | | blanket_impl.rs:82:10:82:18 | T | -| blanket_impl.rs:84:49:86:9 | { ... } | | blanket_impl.rs:82:10:82:18 | T | | blanket_impl.rs:85:28:85:28 | x | | {EXTERNAL LOCATION} | i64 | | blanket_impl.rs:85:31:85:31 | y | | blanket_impl.rs:82:10:82:18 | T | | blanket_impl.rs:89:33:98:5 | { ... } | | {EXTERNAL LOCATION} | () | -| blanket_impl.rs:90:13:90:14 | x1 | | blanket_impl.rs:64:5:65:14 | S1 | -| blanket_impl.rs:90:18:90:39 | ...::assoc_func1(...) | | blanket_impl.rs:64:5:65:14 | S1 | +| blanket_impl.rs:91:9:91:26 | MacroExpr | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:91:18:91:25 | "{x1:?}\\n" | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:91:18:91:25 | "{x1:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| blanket_impl.rs:91:18:91:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:91:18:91:25 | { ... } | | {EXTERNAL LOCATION} | () | -| blanket_impl.rs:91:20:91:21 | x1 | | blanket_impl.rs:64:5:65:14 | S1 | +| blanket_impl.rs:91:18:91:25 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:93:9:93:26 | MacroExpr | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:93:18:93:25 | "{x2:?}\\n" | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:93:18:93:25 | "{x2:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| blanket_impl.rs:93:18:93:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:93:18:93:25 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:93:18:93:25 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:95:9:95:26 | MacroExpr | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:95:18:95:25 | "{x3:?}\\n" | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:95:18:95:25 | "{x3:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| blanket_impl.rs:95:18:95:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:95:18:95:25 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:95:18:95:25 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:97:9:97:26 | MacroExpr | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:97:18:97:25 | "{x4:?}\\n" | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:97:18:97:25 | "{x4:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| blanket_impl.rs:97:18:97:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:97:18:97:25 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:97:18:97:25 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:108:22:108:26 | SelfParam | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:108:22:108:26 | SelfParam | TRef | blanket_impl.rs:107:5:109:5 | Self [trait Flag] | @@ -425,33 +394,24 @@ inferCertainType | blanket_impl.rs:112:26:112:30 | SelfParam | TRef | blanket_impl.rs:111:5:113:5 | Self [trait TryFlag] | | blanket_impl.rs:119:26:119:30 | SelfParam | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:119:26:119:30 | SelfParam | TRef | blanket_impl.rs:115:10:115:11 | Fl | -| blanket_impl.rs:119:49:121:9 | { ... } | | {EXTERNAL LOCATION} | Option | -| blanket_impl.rs:119:49:121:9 | { ... } | T | {EXTERNAL LOCATION} | bool | | blanket_impl.rs:120:18:120:21 | self | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:120:18:120:21 | self | TRef | blanket_impl.rs:115:10:115:11 | Fl | | blanket_impl.rs:126:32:126:36 | SelfParam | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:126:32:126:36 | SelfParam | TRef | blanket_impl.rs:124:5:129:5 | Self [trait TryFlagExt] | -| blanket_impl.rs:126:55:128:9 | { ... } | | {EXTERNAL LOCATION} | Option | -| blanket_impl.rs:126:55:128:9 | { ... } | T | {EXTERNAL LOCATION} | bool | | blanket_impl.rs:127:13:127:16 | self | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:127:13:127:16 | self | TRef | blanket_impl.rs:124:5:129:5 | Self [trait TryFlagExt] | | blanket_impl.rs:135:32:135:36 | SelfParam | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:135:32:135:36 | SelfParam | TRef | blanket_impl.rs:133:5:136:5 | Self [trait AnotherTryFlag] | | blanket_impl.rs:144:26:144:30 | SelfParam | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:144:26:144:30 | SelfParam | TRef | blanket_impl.rs:138:5:140:5 | MyTryFlag | -| blanket_impl.rs:144:49:146:9 | { ... } | | {EXTERNAL LOCATION} | Option | -| blanket_impl.rs:144:49:146:9 | { ... } | T | {EXTERNAL LOCATION} | bool | | blanket_impl.rs:145:18:145:21 | self | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:145:18:145:21 | self | TRef | blanket_impl.rs:138:5:140:5 | MyTryFlag | | blanket_impl.rs:155:22:155:26 | SelfParam | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:155:22:155:26 | SelfParam | TRef | blanket_impl.rs:149:5:151:5 | MyFlag | -| blanket_impl.rs:155:37:157:9 | { ... } | | {EXTERNAL LOCATION} | bool | | blanket_impl.rs:156:13:156:16 | self | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:156:13:156:16 | self | TRef | blanket_impl.rs:149:5:151:5 | MyFlag | | blanket_impl.rs:166:32:166:36 | SelfParam | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:166:32:166:36 | SelfParam | TRef | blanket_impl.rs:160:5:162:5 | MyOtherFlag | -| blanket_impl.rs:166:55:168:9 | { ... } | | {EXTERNAL LOCATION} | Option | -| blanket_impl.rs:166:55:168:9 | { ... } | T | {EXTERNAL LOCATION} | bool | | blanket_impl.rs:167:18:167:21 | self | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:167:18:167:21 | self | TRef | blanket_impl.rs:160:5:162:5 | MyOtherFlag | | blanket_impl.rs:171:15:184:5 | { ... } | | {EXTERNAL LOCATION} | () | @@ -478,18 +438,15 @@ inferCertainType | blanket_impl.rs:226:21:226:22 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:231:15:231:18 | SelfParam | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:231:15:231:18 | SelfParam | TRef | blanket_impl.rs:229:10:229:27 | T | -| blanket_impl.rs:231:21:233:9 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:232:13:232:16 | self | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:232:13:232:16 | self | TRef | blanket_impl.rs:229:10:229:27 | T | | blanket_impl.rs:238:15:238:18 | SelfParam | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:238:15:238:18 | SelfParam | TRef | {EXTERNAL LOCATION} | & | | blanket_impl.rs:238:15:238:18 | SelfParam | TRef.TRef | blanket_impl.rs:188:5:189:14 | S1 | -| blanket_impl.rs:238:21:240:9 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:239:13:239:16 | self | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:239:13:239:16 | self | TRef | {EXTERNAL LOCATION} | & | | blanket_impl.rs:239:13:239:16 | self | TRef.TRef | blanket_impl.rs:188:5:189:14 | S1 | | blanket_impl.rs:245:15:245:18 | SelfParam | | blanket_impl.rs:243:10:243:20 | T | -| blanket_impl.rs:245:21:247:9 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:246:13:246:16 | self | | blanket_impl.rs:243:10:243:20 | T | | blanket_impl.rs:252:15:252:18 | SelfParam | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:252:15:252:18 | SelfParam | TRef | blanket_impl.rs:250:10:250:10 | T | @@ -498,7 +455,9 @@ inferCertainType | blanket_impl.rs:257:18:257:22 | (...) | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:257:19:257:21 | &S1 | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:258:18:258:23 | (...) | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:258:18:258:23 | (...) | TRef | {EXTERNAL LOCATION} | & | | blanket_impl.rs:258:19:258:22 | &... | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:258:19:258:22 | &... | TRef | {EXTERNAL LOCATION} | & | | blanket_impl.rs:258:20:258:22 | &S1 | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:260:18:260:22 | (...) | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:260:19:260:21 | &S1 | | {EXTERNAL LOCATION} | & | @@ -512,23 +471,26 @@ inferCertainType | blanket_impl.rs:277:21:277:25 | SelfParam | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:277:21:277:25 | SelfParam | TRef | blanket_impl.rs:276:10:276:22 | T | | blanket_impl.rs:277:28:279:9 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:278:13:278:42 | MacroExpr | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:278:22:278:41 | "Executor::execute1\\n" | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:278:22:278:41 | "Executor::execute1\\n" | TRef | {EXTERNAL LOCATION} | str | -| blanket_impl.rs:278:22:278:41 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:278:22:278:41 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:278:22:278:41 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:281:24:281:28 | SelfParam | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:281:24:281:28 | SelfParam | TRef | blanket_impl.rs:276:10:276:22 | T | | blanket_impl.rs:281:31:281:36 | _query | | blanket_impl.rs:281:21:281:21 | E | | blanket_impl.rs:281:42:283:9 | { ... } | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:282:13:282:42 | MacroExpr | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:282:22:282:41 | "Executor::execute2\\n" | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:282:22:282:41 | "Executor::execute2\\n" | TRef | {EXTERNAL LOCATION} | str | -| blanket_impl.rs:282:22:282:41 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| blanket_impl.rs:282:22:282:41 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:282:22:282:41 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:290:16:300:5 | { ... } | | {EXTERNAL LOCATION} | () | | blanket_impl.rs:291:13:291:13 | c | | blanket_impl.rs:286:5:286:29 | MySqlConnection | | blanket_impl.rs:291:17:291:34 | MySqlConnection {...} | | blanket_impl.rs:286:5:286:29 | MySqlConnection | | blanket_impl.rs:293:9:293:9 | c | | blanket_impl.rs:286:5:286:29 | MySqlConnection | | blanket_impl.rs:294:35:294:36 | &c | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:294:35:294:36 | &c | TRef | blanket_impl.rs:286:5:286:29 | MySqlConnection | | blanket_impl.rs:294:36:294:36 | c | | blanket_impl.rs:286:5:286:29 | MySqlConnection | | blanket_impl.rs:296:9:296:9 | c | | blanket_impl.rs:286:5:286:29 | MySqlConnection | | blanket_impl.rs:296:20:296:40 | "SELECT * FROM users" | | {EXTERNAL LOCATION} | & | @@ -537,33 +499,32 @@ inferCertainType | blanket_impl.rs:297:28:297:48 | "SELECT * FROM users" | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:297:28:297:48 | "SELECT * FROM users" | TRef | {EXTERNAL LOCATION} | str | | blanket_impl.rs:298:35:298:36 | &c | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:298:35:298:36 | &c | TRef | blanket_impl.rs:286:5:286:29 | MySqlConnection | | blanket_impl.rs:298:36:298:36 | c | | blanket_impl.rs:286:5:286:29 | MySqlConnection | | blanket_impl.rs:298:39:298:59 | "SELECT * FROM users" | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:298:39:298:59 | "SELECT * FROM users" | TRef | {EXTERNAL LOCATION} | str | | blanket_impl.rs:299:43:299:44 | &c | | {EXTERNAL LOCATION} | & | +| blanket_impl.rs:299:43:299:44 | &c | TRef | blanket_impl.rs:286:5:286:29 | MySqlConnection | | blanket_impl.rs:299:44:299:44 | c | | blanket_impl.rs:286:5:286:29 | MySqlConnection | | blanket_impl.rs:299:47:299:67 | "SELECT * FROM users" | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:299:47:299:67 | "SELECT * FROM users" | TRef | {EXTERNAL LOCATION} | str | | closure.rs:4:19:31:5 | { ... } | | {EXTERNAL LOCATION} | () | | closure.rs:6:13:6:22 | my_closure | | {EXTERNAL LOCATION} | dyn Fn | | closure.rs:6:13:6:22 | my_closure | dyn(Args) | {EXTERNAL LOCATION} | (T_2) | -| closure.rs:6:13:6:22 | my_closure | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:6:13:6:22 | my_closure | dyn(Args).T1 | {EXTERNAL LOCATION} | bool | | closure.rs:6:26:6:38 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | | closure.rs:6:26:6:38 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_2) | -| closure.rs:6:26:6:38 | \|...\| ... | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:6:26:6:38 | \|...\| ... | dyn(Args).T1 | {EXTERNAL LOCATION} | bool | -| closure.rs:6:27:6:27 | a | | {EXTERNAL LOCATION} | bool | -| closure.rs:6:30:6:30 | b | | {EXTERNAL LOCATION} | bool | | closure.rs:6:33:6:33 | a | | {EXTERNAL LOCATION} | bool | | closure.rs:6:33:6:38 | ... && ... | | {EXTERNAL LOCATION} | bool | | closure.rs:6:38:6:38 | b | | {EXTERNAL LOCATION} | bool | | closure.rs:8:13:8:13 | x | | {EXTERNAL LOCATION} | i64 | | closure.rs:8:22:8:25 | 1i64 | | {EXTERNAL LOCATION} | i64 | | closure.rs:9:13:9:19 | add_one | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:9:13:9:19 | add_one | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:9:23:9:34 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:9:23:9:34 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:9:31:9:34 | 1i64 | | {EXTERNAL LOCATION} | i64 | | closure.rs:10:18:10:24 | add_one | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:10:18:10:24 | add_one | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:10:25:10:27 | ArgList | | {EXTERNAL LOCATION} | (T_1) | | closure.rs:10:25:10:27 | ArgList | T0 | {EXTERNAL LOCATION} | i64 | | closure.rs:10:26:10:26 | x | | {EXTERNAL LOCATION} | i64 | @@ -578,18 +539,30 @@ inferCertainType | closure.rs:15:18:15:25 | add_zero | | {EXTERNAL LOCATION} | dyn Fn | | closure.rs:15:18:15:25 | add_zero | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:15:18:15:25 | add_zero | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:15:26:15:28 | ArgList | | {EXTERNAL LOCATION} | (T_1) | | closure.rs:17:13:17:21 | _get_bool | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:17:13:17:21 | _get_bool | dyn(Args) | {EXTERNAL LOCATION} | () | +| closure.rs:17:13:17:21 | _get_bool | dyn(Output) | {EXTERNAL LOCATION} | bool | | closure.rs:17:25:21:9 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:17:25:21:9 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | () | +| closure.rs:17:25:21:9 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | bool | | closure.rs:24:13:24:14 | id | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:24:13:24:14 | id | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:24:18:24:22 | \|...\| b | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:24:18:24:22 | \|...\| b | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:25:18:25:19 | id | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:25:18:25:19 | id | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:25:20:25:25 | ArgList | | {EXTERNAL LOCATION} | (T_1) | | closure.rs:25:20:25:25 | ArgList | T0 | {EXTERNAL LOCATION} | bool | | closure.rs:25:21:25:24 | true | | {EXTERNAL LOCATION} | bool | | closure.rs:28:13:28:15 | id2 | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:28:13:28:15 | id2 | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:28:19:28:23 | \|...\| b | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:28:19:28:23 | \|...\| b | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:30:13:30:15 | _b2 | | {EXTERNAL LOCATION} | bool | | closure.rs:30:25:30:27 | id2 | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:30:25:30:27 | id2 | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:30:28:30:32 | ArgList | | {EXTERNAL LOCATION} | (T_1) | | closure.rs:35:44:35:44 | f | | closure.rs:35:20:35:41 | F | | closure.rs:35:50:37:5 | { ... } | | {EXTERNAL LOCATION} | () | | closure.rs:36:23:36:23 | f | | closure.rs:35:20:35:41 | F | @@ -605,34 +578,38 @@ inferCertainType | closure.rs:43:46:43:46 | f | | closure.rs:43:22:43:43 | F | | closure.rs:43:52:46:5 | { ... } | | {EXTERNAL LOCATION} | () | | closure.rs:45:9:45:9 | f | | closure.rs:43:22:43:43 | F | +| closure.rs:45:10:45:14 | ArgList | | {EXTERNAL LOCATION} | (T_1) | | closure.rs:48:39:48:39 | f | | closure.rs:48:20:48:36 | F | | closure.rs:48:45:48:45 | a | | closure.rs:48:14:48:14 | A | -| closure.rs:48:56:50:5 | { ... } | | closure.rs:48:17:48:17 | B | | closure.rs:49:9:49:9 | f | | closure.rs:48:20:48:36 | F | | closure.rs:49:10:49:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | | closure.rs:49:10:49:12 | ArgList | T0 | closure.rs:48:14:48:14 | A | | closure.rs:49:11:49:11 | a | | closure.rs:48:14:48:14 | A | | closure.rs:52:18:52:18 | f | | closure.rs:52:21:52:43 | impl ... | -| closure.rs:52:53:54:5 | { ... } | | {EXTERNAL LOCATION} | i64 | | closure.rs:53:9:53:9 | f | | closure.rs:52:21:52:43 | impl ... | +| closure.rs:53:10:53:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | | closure.rs:56:15:68:5 | { ... } | | {EXTERNAL LOCATION} | () | | closure.rs:57:13:57:13 | f | | {EXTERNAL LOCATION} | dyn Fn | | closure.rs:57:13:57:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:57:13:57:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:57:13:57:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | | closure.rs:57:17:63:9 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | | closure.rs:57:17:63:9 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:57:17:63:9 | \|...\| ... | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:57:17:63:9 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | i64 | | closure.rs:57:18:57:18 | x | | {EXTERNAL LOCATION} | bool | | closure.rs:58:16:58:16 | x | | {EXTERNAL LOCATION} | bool | | closure.rs:64:24:64:24 | f | | {EXTERNAL LOCATION} | dyn Fn | | closure.rs:64:24:64:24 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:64:24:64:24 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:64:24:64:24 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | | closure.rs:64:27:64:30 | true | | {EXTERNAL LOCATION} | bool | | closure.rs:66:13:66:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:66:13:66:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:66:17:66:25 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:67:13:67:15 | _r2 | | {EXTERNAL LOCATION} | i64 | -| closure.rs:67:19:67:30 | apply_two(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:66:17:66:25 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:67:29:67:29 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:67:29:67:29 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:72:47:72:47 | f | | closure.rs:72:20:72:40 | F | | closure.rs:72:53:74:5 | { ... } | | {EXTERNAL LOCATION} | () | | closure.rs:73:23:73:23 | f | | closure.rs:72:20:72:40 | F | @@ -648,34 +625,38 @@ inferCertainType | closure.rs:80:49:80:49 | f | | closure.rs:80:22:80:42 | F | | closure.rs:80:55:83:5 | { ... } | | {EXTERNAL LOCATION} | () | | closure.rs:82:9:82:9 | f | | closure.rs:80:22:80:42 | F | +| closure.rs:82:10:82:14 | ArgList | | {EXTERNAL LOCATION} | (T_1) | | closure.rs:85:42:85:42 | f | | closure.rs:85:20:85:35 | F | | closure.rs:85:48:85:48 | a | | closure.rs:85:14:85:14 | A | -| closure.rs:85:59:87:5 | { ... } | | closure.rs:85:17:85:17 | B | | closure.rs:86:9:86:9 | f | | closure.rs:85:20:85:35 | F | | closure.rs:86:10:86:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | | closure.rs:86:10:86:12 | ArgList | T0 | closure.rs:85:14:85:14 | A | | closure.rs:86:11:86:11 | a | | closure.rs:85:14:85:14 | A | | closure.rs:89:22:89:22 | f | | closure.rs:89:25:89:46 | impl ... | -| closure.rs:89:56:91:5 | { ... } | | {EXTERNAL LOCATION} | i64 | | closure.rs:90:9:90:9 | f | | closure.rs:89:25:89:46 | impl ... | +| closure.rs:90:10:90:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | | closure.rs:93:15:105:5 | { ... } | | {EXTERNAL LOCATION} | () | | closure.rs:94:13:94:13 | f | | {EXTERNAL LOCATION} | dyn Fn | | closure.rs:94:13:94:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:94:13:94:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:94:13:94:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | | closure.rs:94:17:100:9 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | | closure.rs:94:17:100:9 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:94:17:100:9 | \|...\| ... | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:94:17:100:9 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | i64 | | closure.rs:94:18:94:18 | x | | {EXTERNAL LOCATION} | bool | | closure.rs:95:16:95:16 | x | | {EXTERNAL LOCATION} | bool | | closure.rs:101:24:101:24 | f | | {EXTERNAL LOCATION} | dyn Fn | | closure.rs:101:24:101:24 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:101:24:101:24 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:101:24:101:24 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | | closure.rs:101:27:101:30 | true | | {EXTERNAL LOCATION} | bool | | closure.rs:103:13:103:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:103:13:103:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:103:17:103:25 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:104:13:104:15 | _r2 | | {EXTERNAL LOCATION} | i64 | -| closure.rs:104:19:104:30 | apply_two(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:103:17:103:25 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:104:29:104:29 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:104:29:104:29 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:109:40:109:40 | f | | closure.rs:109:20:109:37 | F | | closure.rs:109:46:111:5 | { ... } | | {EXTERNAL LOCATION} | () | | closure.rs:110:23:110:23 | f | | closure.rs:109:20:109:37 | F | @@ -691,39 +672,42 @@ inferCertainType | closure.rs:117:42:117:42 | f | | closure.rs:117:22:117:39 | F | | closure.rs:117:48:120:5 | { ... } | | {EXTERNAL LOCATION} | () | | closure.rs:119:9:119:9 | f | | closure.rs:117:22:117:39 | F | +| closure.rs:119:10:119:14 | ArgList | | {EXTERNAL LOCATION} | (T_1) | | closure.rs:122:35:122:35 | f | | closure.rs:122:20:122:32 | F | | closure.rs:122:41:122:41 | a | | closure.rs:122:14:122:14 | A | -| closure.rs:122:52:124:5 | { ... } | | closure.rs:122:17:122:17 | B | | closure.rs:123:9:123:9 | f | | closure.rs:122:20:122:32 | F | | closure.rs:123:10:123:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | | closure.rs:123:10:123:12 | ArgList | T0 | closure.rs:122:14:122:14 | A | | closure.rs:123:11:123:11 | a | | closure.rs:122:14:122:14 | A | | closure.rs:126:18:126:18 | f | | closure.rs:126:21:126:39 | impl ... | -| closure.rs:126:49:128:5 | { ... } | | {EXTERNAL LOCATION} | i64 | | closure.rs:127:9:127:9 | f | | closure.rs:126:21:126:39 | impl ... | +| closure.rs:127:10:127:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | | closure.rs:130:15:142:5 | { ... } | | {EXTERNAL LOCATION} | () | | closure.rs:131:13:131:13 | f | | {EXTERNAL LOCATION} | dyn Fn | | closure.rs:131:13:131:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:131:13:131:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:131:13:131:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | | closure.rs:131:17:137:9 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | | closure.rs:131:17:137:9 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:131:17:137:9 | \|...\| ... | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:131:17:137:9 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | i64 | | closure.rs:131:18:131:18 | x | | {EXTERNAL LOCATION} | bool | | closure.rs:132:16:132:16 | x | | {EXTERNAL LOCATION} | bool | | closure.rs:138:24:138:24 | f | | {EXTERNAL LOCATION} | dyn Fn | | closure.rs:138:24:138:24 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:138:24:138:24 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:138:24:138:24 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | | closure.rs:138:27:138:30 | true | | {EXTERNAL LOCATION} | bool | | closure.rs:140:13:140:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:140:13:140:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:140:17:140:25 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:141:13:141:15 | _r2 | | {EXTERNAL LOCATION} | i64 | -| closure.rs:141:19:141:30 | apply_two(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:140:17:140:25 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:141:29:141:29 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:141:29:141:29 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:146:54:146:54 | f | | {EXTERNAL LOCATION} | Box | | closure.rs:146:54:146:54 | f | A | {EXTERNAL LOCATION} | Global | | closure.rs:146:54:146:54 | f | T | closure.rs:146:26:146:51 | F | | closure.rs:146:65:146:67 | arg | | closure.rs:146:20:146:20 | A | -| closure.rs:146:78:148:5 | { ... } | | closure.rs:146:23:146:23 | B | | closure.rs:147:9:147:9 | f | | {EXTERNAL LOCATION} | Box | | closure.rs:147:9:147:9 | f | A | {EXTERNAL LOCATION} | Global | | closure.rs:147:9:147:9 | f | T | closure.rs:146:26:146:51 | F | @@ -745,8 +729,6 @@ inferCertainType | closure.rs:151:31:151:31 | f | T.dyn(Args).T0 | closure.rs:150:24:150:24 | A | | closure.rs:151:31:151:31 | f | T.dyn(Output) | closure.rs:150:27:150:27 | B | | closure.rs:151:34:151:36 | arg | | closure.rs:150:24:150:24 | A | -| closure.rs:152:31:152:53 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| closure.rs:152:31:152:53 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | | closure.rs:152:40:152:52 | \|...\| true | | {EXTERNAL LOCATION} | dyn Fn | | closure.rs:152:40:152:52 | \|...\| true | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:152:40:152:52 | \|...\| true | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | @@ -754,14 +736,12 @@ inferCertainType | closure.rs:152:49:152:52 | true | | {EXTERNAL LOCATION} | bool | | closure.rs:157:34:157:34 | f | | closure.rs:157:15:157:31 | F | | closure.rs:157:40:157:40 | a | | {EXTERNAL LOCATION} | i64 | -| closure.rs:157:55:159:5 | { ... } | | {EXTERNAL LOCATION} | i64 | | closure.rs:158:9:158:9 | f | | closure.rs:157:15:157:31 | F | | closure.rs:158:10:158:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | | closure.rs:158:10:158:12 | ArgList | T0 | {EXTERNAL LOCATION} | i64 | | closure.rs:158:11:158:11 | a | | {EXTERNAL LOCATION} | i64 | | closure.rs:161:15:161:15 | f | | closure.rs:161:18:161:36 | impl ... | | closure.rs:161:39:161:39 | a | | {EXTERNAL LOCATION} | i64 | -| closure.rs:161:54:163:5 | { ... } | | {EXTERNAL LOCATION} | i64 | | closure.rs:162:9:162:9 | f | | closure.rs:161:18:161:36 | impl ... | | closure.rs:162:10:162:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | | closure.rs:162:10:162:12 | ArgList | T0 | {EXTERNAL LOCATION} | i64 | @@ -772,7 +752,6 @@ inferCertainType | closure.rs:165:15:165:15 | f | TRef.dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | | closure.rs:165:15:165:15 | f | TRef.dyn(Output) | {EXTERNAL LOCATION} | i64 | | closure.rs:165:39:165:39 | a | | {EXTERNAL LOCATION} | i64 | -| closure.rs:165:54:167:5 | { ... } | | {EXTERNAL LOCATION} | i64 | | closure.rs:166:9:166:9 | f | | {EXTERNAL LOCATION} | & | | closure.rs:166:9:166:9 | f | TRef | {EXTERNAL LOCATION} | dyn Fn | | closure.rs:166:9:166:9 | f | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | @@ -783,7 +762,6 @@ inferCertainType | closure.rs:166:11:166:11 | a | | {EXTERNAL LOCATION} | i64 | | closure.rs:169:41:169:41 | f | | closure.rs:169:15:169:34 | F | | closure.rs:169:47:169:47 | a | | {EXTERNAL LOCATION} | i64 | -| closure.rs:169:62:171:5 | { ... } | | {EXTERNAL LOCATION} | i64 | | closure.rs:170:9:170:9 | f | | closure.rs:169:15:169:34 | F | | closure.rs:170:10:170:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | | closure.rs:170:10:170:12 | ArgList | T0 | {EXTERNAL LOCATION} | i64 | @@ -794,7 +772,6 @@ inferCertainType | closure.rs:173:15:173:15 | f | TRefMut.dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | | closure.rs:173:15:173:15 | f | TRefMut.dyn(Output) | {EXTERNAL LOCATION} | i64 | | closure.rs:173:46:173:46 | a | | {EXTERNAL LOCATION} | i64 | -| closure.rs:173:61:175:5 | { ... } | | {EXTERNAL LOCATION} | i64 | | closure.rs:174:9:174:9 | f | | {EXTERNAL LOCATION} | &mut | | closure.rs:174:9:174:9 | f | TRefMut | {EXTERNAL LOCATION} | dyn FnMut | | closure.rs:174:9:174:9 | f | TRefMut.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | @@ -805,62 +782,71 @@ inferCertainType | closure.rs:174:11:174:11 | a | | {EXTERNAL LOCATION} | i64 | | closure.rs:177:18:177:18 | f | | closure.rs:177:21:177:37 | impl ... | | closure.rs:177:40:177:40 | a | | closure.rs:177:15:177:15 | T | -| closure.rs:177:53:179:5 | { ... } | | {EXTERNAL LOCATION} | i64 | | closure.rs:178:9:178:9 | f | | closure.rs:177:21:177:37 | impl ... | | closure.rs:178:10:178:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | | closure.rs:178:10:178:12 | ArgList | T0 | closure.rs:177:15:177:15 | T | | closure.rs:178:11:178:11 | a | | closure.rs:177:15:177:15 | T | | closure.rs:181:42:181:42 | f | | closure.rs:181:18:181:35 | F | | closure.rs:181:48:181:48 | a | | closure.rs:181:15:181:15 | T | -| closure.rs:181:61:183:5 | { ... } | | {EXTERNAL LOCATION} | i64 | | closure.rs:182:9:182:9 | f | | closure.rs:181:18:181:35 | F | | closure.rs:182:10:182:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | | closure.rs:182:10:182:12 | ArgList | T0 | closure.rs:181:15:181:15 | T | | closure.rs:182:11:182:11 | a | | closure.rs:181:15:181:15 | T | | closure.rs:185:15:206:5 | { ... } | | {EXTERNAL LOCATION} | () | | closure.rs:186:13:186:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:186:13:186:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:186:17:186:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:187:13:187:14 | _r | | {EXTERNAL LOCATION} | i64 | -| closure.rs:187:18:187:32 | apply1(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:186:17:186:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:187:25:187:25 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:187:25:187:25 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:187:28:187:31 | 1i64 | | {EXTERNAL LOCATION} | i64 | | closure.rs:189:13:189:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:189:13:189:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:189:17:189:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:190:13:190:14 | _r | | {EXTERNAL LOCATION} | i64 | -| closure.rs:190:18:190:32 | apply2(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:189:17:189:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:190:25:190:25 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:190:25:190:25 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:190:28:190:31 | 2i64 | | {EXTERNAL LOCATION} | i64 | | closure.rs:192:13:192:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:192:13:192:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:192:17:192:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:193:13:193:14 | _r | | {EXTERNAL LOCATION} | i64 | -| closure.rs:193:18:193:33 | apply3(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:192:17:192:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:193:25:193:26 | &f | | {EXTERNAL LOCATION} | & | +| closure.rs:193:25:193:26 | &f | TRef | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:193:25:193:26 | &f | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:193:26:193:26 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:193:26:193:26 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:193:29:193:32 | 3i64 | | {EXTERNAL LOCATION} | i64 | | closure.rs:195:13:195:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:195:13:195:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:195:17:195:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:196:13:196:14 | _r | | {EXTERNAL LOCATION} | i64 | -| closure.rs:196:18:196:32 | apply4(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:195:17:195:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:196:25:196:25 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:196:25:196:25 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:196:28:196:31 | 4i64 | | {EXTERNAL LOCATION} | i64 | | closure.rs:198:17:198:17 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:198:17:198:17 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:198:21:198:25 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:199:13:199:14 | _r | | {EXTERNAL LOCATION} | i64 | -| closure.rs:199:18:199:37 | apply5(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:198:21:198:25 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:199:25:199:30 | &mut f | | {EXTERNAL LOCATION} | &mut | +| closure.rs:199:25:199:30 | &mut f | TRefMut | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:199:25:199:30 | &mut f | TRefMut.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:199:30:199:30 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:199:30:199:30 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:199:33:199:36 | 5i64 | | {EXTERNAL LOCATION} | i64 | | closure.rs:201:13:201:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:201:13:201:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:201:17:201:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:202:13:202:14 | _r | | {EXTERNAL LOCATION} | i64 | -| closure.rs:202:18:202:32 | apply6(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:201:17:201:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:202:25:202:25 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:202:25:202:25 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:202:28:202:31 | 6i64 | | {EXTERNAL LOCATION} | i64 | | closure.rs:204:13:204:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:204:13:204:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:204:17:204:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:205:13:205:14 | _r | | {EXTERNAL LOCATION} | i64 | -| closure.rs:205:18:205:32 | apply7(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:204:17:204:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:205:25:205:25 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:205:25:205:25 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:205:28:205:31 | 7i64 | | {EXTERNAL LOCATION} | i64 | | closure.rs:217:18:217:22 | SelfParam | | {EXTERNAL LOCATION} | & | | closure.rs:217:18:217:22 | SelfParam | TRef | closure.rs:212:5:212:19 | S | @@ -868,10 +854,11 @@ inferCertainType | closure.rs:217:42:219:9 | { ... } | | {EXTERNAL LOCATION} | & | | closure.rs:217:42:219:9 | { ... } | TRef | {EXTERNAL LOCATION} | dyn Fn | | closure.rs:217:42:219:9 | { ... } | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:217:42:219:9 | { ... } | TRef.dyn(Args).T0 | closure.rs:214:10:214:10 | T | -| closure.rs:217:42:219:9 | { ... } | TRef.dyn(Output) | {EXTERNAL LOCATION} | bool | | closure.rs:218:13:218:22 | &... | | {EXTERNAL LOCATION} | & | +| closure.rs:218:13:218:22 | &... | TRef | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:218:13:218:22 | &... | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:218:14:218:22 | \|...\| false | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:218:14:218:22 | \|...\| false | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:218:18:218:22 | false | | {EXTERNAL LOCATION} | bool | | closure.rs:222:19:248:5 | { ... } | | {EXTERNAL LOCATION} | () | | closure.rs:223:13:223:13 | x | | {EXTERNAL LOCATION} | i64 | @@ -891,17 +878,23 @@ inferCertainType | closure.rs:240:25:240:27 | ArgList | T0 | {EXTERNAL LOCATION} | i32 | | closure.rs:240:26:240:26 | x | | {EXTERNAL LOCATION} | i32 | | closure.rs:246:13:246:13 | c | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:246:13:246:13 | c | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:246:17:246:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:246:17:246:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:247:9:247:12 | (...) | | {EXTERNAL LOCATION} | & | +| closure.rs:247:9:247:12 | (...) | TRef | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:247:9:247:12 | (...) | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:247:10:247:11 | &c | | {EXTERNAL LOCATION} | & | +| closure.rs:247:10:247:11 | &c | TRef | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:247:10:247:11 | &c | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:247:11:247:11 | c | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:247:11:247:11 | c | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:247:13:247:15 | ArgList | | {EXTERNAL LOCATION} | (T_1) | | closure.rs:247:13:247:15 | ArgList | T0 | {EXTERNAL LOCATION} | i32 | | closure.rs:247:14:247:14 | x | | {EXTERNAL LOCATION} | i32 | | dereference.rs:13:14:13:18 | SelfParam | | {EXTERNAL LOCATION} | & | | dereference.rs:13:14:13:18 | SelfParam | TRef | dereference.rs:5:1:7:1 | MyIntPointer | | dereference.rs:13:29:15:5 | { ... } | | {EXTERNAL LOCATION} | & | -| dereference.rs:13:29:15:5 | { ... } | TRef | {EXTERNAL LOCATION} | i64 | | dereference.rs:14:9:14:19 | &... | | {EXTERNAL LOCATION} | & | | dereference.rs:14:10:14:13 | self | | {EXTERNAL LOCATION} | & | | dereference.rs:14:10:14:13 | self | TRef | dereference.rs:5:1:7:1 | MyIntPointer | @@ -909,7 +902,6 @@ inferCertainType | dereference.rs:26:14:26:18 | SelfParam | TRef | dereference.rs:18:1:20:1 | MySmartPointer | | dereference.rs:26:14:26:18 | SelfParam | TRef.T | dereference.rs:22:6:22:6 | T | | dereference.rs:26:27:28:5 | { ... } | | {EXTERNAL LOCATION} | & | -| dereference.rs:26:27:28:5 | { ... } | TRef | dereference.rs:22:6:22:6 | T | | dereference.rs:27:9:27:19 | &... | | {EXTERNAL LOCATION} | & | | dereference.rs:27:10:27:13 | self | | {EXTERNAL LOCATION} | & | | dereference.rs:27:10:27:13 | self | TRef | dereference.rs:18:1:20:1 | MySmartPointer | @@ -918,7 +910,6 @@ inferCertainType | dereference.rs:33:18:33:26 | SelfParam | TRefMut | dereference.rs:18:1:20:1 | MySmartPointer | | dereference.rs:33:18:33:26 | SelfParam | TRefMut.T | dereference.rs:31:6:31:6 | T | | dereference.rs:33:39:35:5 | { ... } | | {EXTERNAL LOCATION} | &mut | -| dereference.rs:33:39:35:5 | { ... } | TRefMut | dereference.rs:31:6:31:6 | T | | dereference.rs:34:9:34:23 | &mut ... | | {EXTERNAL LOCATION} | &mut | | dereference.rs:34:14:34:17 | self | | {EXTERNAL LOCATION} | &mut | | dereference.rs:34:14:34:17 | self | TRefMut | dereference.rs:18:1:20:1 | MySmartPointer | @@ -927,7 +918,6 @@ inferCertainType | dereference.rs:41:12:41:16 | SelfParam | TRef | dereference.rs:38:1:38:15 | S | | dereference.rs:41:12:41:16 | SelfParam | TRef.T | dereference.rs:40:6:40:6 | T | | dereference.rs:41:25:43:5 | { ... } | | {EXTERNAL LOCATION} | & | -| dereference.rs:41:25:43:5 | { ... } | TRef | dereference.rs:40:6:40:6 | T | | dereference.rs:42:9:42:15 | &... | | {EXTERNAL LOCATION} | & | | dereference.rs:42:10:42:13 | self | | {EXTERNAL LOCATION} | & | | dereference.rs:42:10:42:13 | self | TRef | dereference.rs:38:1:38:15 | S | @@ -960,23 +950,30 @@ inferCertainType | dereference.rs:71:17:71:18 | c3 | | dereference.rs:18:1:20:1 | MySmartPointer | | dereference.rs:74:31:86:1 | { ... } | | {EXTERNAL LOCATION} | () | | dereference.rs:76:9:76:10 | e1 | | {EXTERNAL LOCATION} | & | +| dereference.rs:76:9:76:10 | e1 | TRef | {EXTERNAL LOCATION} | char | | dereference.rs:76:14:76:17 | &'a' | | {EXTERNAL LOCATION} | & | +| dereference.rs:76:14:76:17 | &'a' | TRef | {EXTERNAL LOCATION} | char | | dereference.rs:76:15:76:17 | 'a' | | {EXTERNAL LOCATION} | char | | dereference.rs:77:15:77:16 | e1 | | {EXTERNAL LOCATION} | & | +| dereference.rs:77:15:77:16 | e1 | TRef | {EXTERNAL LOCATION} | char | | dereference.rs:80:9:80:10 | e2 | | {EXTERNAL LOCATION} | & | +| dereference.rs:80:9:80:10 | e2 | TRef | {EXTERNAL LOCATION} | char | | dereference.rs:80:14:80:17 | &'a' | | {EXTERNAL LOCATION} | & | +| dereference.rs:80:14:80:17 | &'a' | TRef | {EXTERNAL LOCATION} | char | | dereference.rs:80:15:80:17 | 'a' | | {EXTERNAL LOCATION} | char | | dereference.rs:81:16:81:17 | e2 | | {EXTERNAL LOCATION} | & | +| dereference.rs:81:16:81:17 | e2 | TRef | {EXTERNAL LOCATION} | char | | dereference.rs:84:9:84:10 | e3 | | {EXTERNAL LOCATION} | & | +| dereference.rs:84:9:84:10 | e3 | TRef | {EXTERNAL LOCATION} | i64 | | dereference.rs:84:14:84:19 | &34i64 | | {EXTERNAL LOCATION} | & | +| dereference.rs:84:14:84:19 | &34i64 | TRef | {EXTERNAL LOCATION} | i64 | | dereference.rs:84:15:84:19 | 34i64 | | {EXTERNAL LOCATION} | i64 | | dereference.rs:85:17:85:18 | e3 | | {EXTERNAL LOCATION} | & | +| dereference.rs:85:17:85:18 | e3 | TRef | {EXTERNAL LOCATION} | i64 | | dereference.rs:88:31:100:1 | { ... } | | {EXTERNAL LOCATION} | () | | dereference.rs:90:9:90:10 | g1 | | {EXTERNAL LOCATION} | Box | | dereference.rs:90:9:90:10 | g1 | A | {EXTERNAL LOCATION} | Global | | dereference.rs:90:9:90:10 | g1 | T | {EXTERNAL LOCATION} | char | -| dereference.rs:90:25:90:37 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| dereference.rs:90:25:90:37 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | | dereference.rs:90:34:90:36 | 'a' | | {EXTERNAL LOCATION} | char | | dereference.rs:91:15:91:16 | g1 | | {EXTERNAL LOCATION} | Box | | dereference.rs:91:15:91:16 | g1 | A | {EXTERNAL LOCATION} | Global | @@ -984,8 +981,6 @@ inferCertainType | dereference.rs:94:9:94:10 | g2 | | {EXTERNAL LOCATION} | Box | | dereference.rs:94:9:94:10 | g2 | A | {EXTERNAL LOCATION} | Global | | dereference.rs:94:9:94:10 | g2 | T | {EXTERNAL LOCATION} | char | -| dereference.rs:94:25:94:37 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| dereference.rs:94:25:94:37 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | | dereference.rs:94:34:94:36 | 'a' | | {EXTERNAL LOCATION} | char | | dereference.rs:95:16:95:17 | g2 | | {EXTERNAL LOCATION} | Box | | dereference.rs:95:16:95:17 | g2 | A | {EXTERNAL LOCATION} | Global | @@ -993,8 +988,6 @@ inferCertainType | dereference.rs:98:9:98:10 | g3 | | {EXTERNAL LOCATION} | Box | | dereference.rs:98:9:98:10 | g3 | A | {EXTERNAL LOCATION} | Global | | dereference.rs:98:9:98:10 | g3 | T | {EXTERNAL LOCATION} | i64 | -| dereference.rs:98:24:98:38 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| dereference.rs:98:24:98:38 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | | dereference.rs:98:33:98:37 | 34i64 | | {EXTERNAL LOCATION} | i64 | | dereference.rs:99:17:99:18 | g3 | | {EXTERNAL LOCATION} | Box | | dereference.rs:99:17:99:18 | g3 | A | {EXTERNAL LOCATION} | Global | @@ -1012,70 +1005,39 @@ inferCertainType | dereference.rs:111:13:111:45 | MySmartPointer {...} | | dereference.rs:18:1:20:1 | MySmartPointer | | dereference.rs:111:39:111:42 | 0i64 | | {EXTERNAL LOCATION} | i64 | | dereference.rs:112:14:112:14 | z | | dereference.rs:18:1:20:1 | MySmartPointer | -| dereference.rs:114:9:114:9 | v | | {EXTERNAL LOCATION} | Vec | -| dereference.rs:114:9:114:9 | v | A | {EXTERNAL LOCATION} | Global | -| dereference.rs:114:13:114:22 | ...::new(...) | | {EXTERNAL LOCATION} | Vec | -| dereference.rs:114:13:114:22 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | | dereference.rs:115:13:115:13 | x | | dereference.rs:18:1:20:1 | MySmartPointer | | dereference.rs:115:17:115:43 | MySmartPointer {...} | | dereference.rs:18:1:20:1 | MySmartPointer | -| dereference.rs:115:41:115:41 | v | | {EXTERNAL LOCATION} | Vec | -| dereference.rs:115:41:115:41 | v | A | {EXTERNAL LOCATION} | Global | | dereference.rs:116:5:116:5 | x | | dereference.rs:18:1:20:1 | MySmartPointer | | dereference.rs:143:19:151:5 | { ... } | | {EXTERNAL LOCATION} | () | -| dereference.rs:144:17:144:26 | key_to_key | | {EXTERNAL LOCATION} | HashMap | -| dereference.rs:144:17:144:26 | key_to_key | A | {EXTERNAL LOCATION} | Global | -| dereference.rs:144:17:144:26 | key_to_key | K | {EXTERNAL LOCATION} | & | -| dereference.rs:144:17:144:26 | key_to_key | K.TRef | dereference.rs:122:5:123:21 | Key | -| dereference.rs:144:17:144:26 | key_to_key | S | {EXTERNAL LOCATION} | RandomState | -| dereference.rs:144:17:144:26 | key_to_key | V | {EXTERNAL LOCATION} | & | -| dereference.rs:144:17:144:26 | key_to_key | V.TRef | dereference.rs:122:5:123:21 | Key | -| dereference.rs:144:30:144:57 | ...::new(...) | | {EXTERNAL LOCATION} | HashMap | -| dereference.rs:144:30:144:57 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| dereference.rs:144:30:144:57 | ...::new(...) | K | {EXTERNAL LOCATION} | & | -| dereference.rs:144:30:144:57 | ...::new(...) | K.TRef | dereference.rs:122:5:123:21 | Key | -| dereference.rs:144:30:144:57 | ...::new(...) | S | {EXTERNAL LOCATION} | RandomState | -| dereference.rs:144:30:144:57 | ...::new(...) | V | {EXTERNAL LOCATION} | & | -| dereference.rs:144:30:144:57 | ...::new(...) | V.TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:145:17:145:19 | key | | {EXTERNAL LOCATION} | & | +| dereference.rs:145:17:145:19 | key | TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:145:23:145:29 | &... | | {EXTERNAL LOCATION} | & | +| dereference.rs:145:23:145:29 | &... | TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:145:24:145:29 | Key {...} | | dereference.rs:122:5:123:21 | Key | | dereference.rs:146:9:149:9 | if ... {...} | | {EXTERNAL LOCATION} | () | -| dereference.rs:146:32:146:41 | key_to_key | | {EXTERNAL LOCATION} | HashMap | -| dereference.rs:146:32:146:41 | key_to_key | A | {EXTERNAL LOCATION} | Global | -| dereference.rs:146:32:146:41 | key_to_key | K | {EXTERNAL LOCATION} | & | -| dereference.rs:146:32:146:41 | key_to_key | K.TRef | dereference.rs:122:5:123:21 | Key | -| dereference.rs:146:32:146:41 | key_to_key | S | {EXTERNAL LOCATION} | RandomState | -| dereference.rs:146:32:146:41 | key_to_key | V | {EXTERNAL LOCATION} | & | -| dereference.rs:146:32:146:41 | key_to_key | V.TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:146:47:146:49 | key | | {EXTERNAL LOCATION} | & | +| dereference.rs:146:47:146:49 | key | TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:146:52:149:9 | { ... } | | {EXTERNAL LOCATION} | () | | dereference.rs:148:13:148:15 | key | | {EXTERNAL LOCATION} | & | -| dereference.rs:150:9:150:18 | key_to_key | | {EXTERNAL LOCATION} | HashMap | -| dereference.rs:150:9:150:18 | key_to_key | A | {EXTERNAL LOCATION} | Global | -| dereference.rs:150:9:150:18 | key_to_key | K | {EXTERNAL LOCATION} | & | -| dereference.rs:150:9:150:18 | key_to_key | K.TRef | dereference.rs:122:5:123:21 | Key | -| dereference.rs:150:9:150:18 | key_to_key | S | {EXTERNAL LOCATION} | RandomState | -| dereference.rs:150:9:150:18 | key_to_key | V | {EXTERNAL LOCATION} | & | -| dereference.rs:150:9:150:18 | key_to_key | V.TRef | dereference.rs:122:5:123:21 | Key | +| dereference.rs:148:13:148:15 | key | TRef | dereference.rs:122:5:123:21 | Key | +| dereference.rs:148:13:148:25 | ... = ... | | {EXTERNAL LOCATION} | () | | dereference.rs:150:27:150:29 | key | | {EXTERNAL LOCATION} | & | +| dereference.rs:150:27:150:29 | key | TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:150:32:150:34 | key | | {EXTERNAL LOCATION} | & | +| dereference.rs:150:32:150:34 | key | TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:156:16:156:19 | SelfParam | | dereference.rs:155:5:157:5 | Self [trait MyTrait1] | | dereference.rs:163:16:163:19 | SelfParam | | {EXTERNAL LOCATION} | & | | dereference.rs:163:16:163:19 | SelfParam | TRef | dereference.rs:159:5:159:13 | S | -| dereference.rs:163:27:165:9 | { ... } | | dereference.rs:159:5:159:13 | S | | dereference.rs:170:16:170:19 | SelfParam | | {EXTERNAL LOCATION} | &mut | | dereference.rs:170:16:170:19 | SelfParam | TRefMut | dereference.rs:159:5:159:13 | S | -| dereference.rs:170:29:172:9 | { ... } | | {EXTERNAL LOCATION} | i64 | | dereference.rs:176:16:176:19 | SelfParam | | dereference.rs:175:5:177:5 | Self [trait MyTrait2] | | dereference.rs:176:22:176:24 | arg | | dereference.rs:175:20:175:21 | T1 | | dereference.rs:181:16:181:19 | SelfParam | | dereference.rs:159:5:159:13 | S | | dereference.rs:181:22:181:24 | arg | | {EXTERNAL LOCATION} | & | | dereference.rs:181:22:181:24 | arg | TRef | dereference.rs:159:5:159:13 | S | -| dereference.rs:181:36:183:9 | { ... } | | dereference.rs:159:5:159:13 | S | | dereference.rs:188:16:188:19 | SelfParam | | dereference.rs:159:5:159:13 | S | | dereference.rs:188:22:188:24 | arg | | {EXTERNAL LOCATION} | &mut | | dereference.rs:188:22:188:24 | arg | TRefMut | dereference.rs:159:5:159:13 | S | -| dereference.rs:188:42:190:9 | { ... } | | {EXTERNAL LOCATION} | i64 | | dereference.rs:193:19:200:5 | { ... } | | {EXTERNAL LOCATION} | () | | dereference.rs:194:17:194:20 | (...) | | {EXTERNAL LOCATION} | & | | dereference.rs:194:18:194:19 | &S | | {EXTERNAL LOCATION} | & | @@ -1088,30 +1050,24 @@ inferCertainType | dereference.rs:213:16:213:24 | SelfParam | | {EXTERNAL LOCATION} | &mut | | dereference.rs:213:16:213:24 | SelfParam | TRefMut | dereference.rs:205:5:205:17 | Foo | | dereference.rs:213:27:215:9 | { ... } | | {EXTERNAL LOCATION} | () | +| dereference.rs:214:13:214:39 | MacroExpr | | {EXTERNAL LOCATION} | () | | dereference.rs:214:22:214:38 | "In struct impl!\\n" | | {EXTERNAL LOCATION} | & | | dereference.rs:214:22:214:38 | "In struct impl!\\n" | TRef | {EXTERNAL LOCATION} | str | -| dereference.rs:214:22:214:38 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| dereference.rs:214:22:214:38 | { ... } | | {EXTERNAL LOCATION} | () | | dereference.rs:214:22:214:38 | { ... } | | {EXTERNAL LOCATION} | () | | dereference.rs:220:16:220:20 | SelfParam | | {EXTERNAL LOCATION} | & | | dereference.rs:220:16:220:20 | SelfParam | TRef | dereference.rs:205:5:205:17 | Foo | | dereference.rs:220:23:222:9 | { ... } | | {EXTERNAL LOCATION} | () | +| dereference.rs:221:13:221:38 | MacroExpr | | {EXTERNAL LOCATION} | () | | dereference.rs:221:22:221:37 | "In trait impl!\\n" | | {EXTERNAL LOCATION} | & | | dereference.rs:221:22:221:37 | "In trait impl!\\n" | TRef | {EXTERNAL LOCATION} | str | -| dereference.rs:221:22:221:37 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| dereference.rs:221:22:221:37 | { ... } | | {EXTERNAL LOCATION} | () | | dereference.rs:221:22:221:37 | { ... } | | {EXTERNAL LOCATION} | () | | dereference.rs:225:19:228:5 | { ... } | | {EXTERNAL LOCATION} | () | | dereference.rs:226:17:226:17 | f | | dereference.rs:205:5:205:17 | Foo | | dereference.rs:226:21:226:26 | Foo {...} | | dereference.rs:205:5:205:17 | Foo | | dereference.rs:227:9:227:9 | f | | dereference.rs:205:5:205:17 | Foo | | dereference.rs:231:15:240:1 | { ... } | | {EXTERNAL LOCATION} | () | -| dereference.rs:232:5:232:38 | explicit_monomorphic_dereference(...) | | {EXTERNAL LOCATION} | () | -| dereference.rs:233:5:233:38 | explicit_polymorphic_dereference(...) | | {EXTERNAL LOCATION} | () | -| dereference.rs:234:5:234:30 | explicit_ref_dereference(...) | | {EXTERNAL LOCATION} | () | -| dereference.rs:235:5:235:30 | explicit_box_dereference(...) | | {EXTERNAL LOCATION} | () | -| dereference.rs:236:5:236:26 | implicit_dereference(...) | | {EXTERNAL LOCATION} | () | -| dereference.rs:237:5:237:41 | ...::test(...) | | {EXTERNAL LOCATION} | () | -| dereference.rs:238:5:238:26 | ...::test(...) | | {EXTERNAL LOCATION} | () | -| dereference.rs:239:5:239:34 | ...::main(...) | | {EXTERNAL LOCATION} | () | | dyn_type.rs:7:10:7:14 | SelfParam | | {EXTERNAL LOCATION} | & | | dyn_type.rs:7:10:7:14 | SelfParam | TRef | dyn_type.rs:5:1:8:1 | Self [trait MyTrait1] | | dyn_type.rs:12:12:12:16 | SelfParam | | {EXTERNAL LOCATION} | & | @@ -1120,16 +1076,13 @@ inferCertainType | dyn_type.rs:18:12:18:16 | SelfParam | TRef | dyn_type.rs:15:1:19:1 | Self [trait AssocTrait] | | dyn_type.rs:28:10:28:14 | SelfParam | | {EXTERNAL LOCATION} | & | | dyn_type.rs:28:10:28:14 | SelfParam | TRef | dyn_type.rs:21:1:24:1 | MyStruct | -| dyn_type.rs:28:27:30:5 | { ... } | | {EXTERNAL LOCATION} | String | | dyn_type.rs:29:17:29:30 | "MyTrait1: {}" | | {EXTERNAL LOCATION} | & | | dyn_type.rs:29:17:29:30 | "MyTrait1: {}" | TRef | {EXTERNAL LOCATION} | str | -| dyn_type.rs:29:17:29:42 | ...::format(...) | | {EXTERNAL LOCATION} | String | | dyn_type.rs:29:33:29:36 | self | | {EXTERNAL LOCATION} | & | | dyn_type.rs:29:33:29:36 | self | TRef | dyn_type.rs:21:1:24:1 | MyStruct | | dyn_type.rs:40:12:40:16 | SelfParam | | {EXTERNAL LOCATION} | & | | dyn_type.rs:40:12:40:16 | SelfParam | TRef | dyn_type.rs:33:1:36:1 | GenStruct | | dyn_type.rs:40:12:40:16 | SelfParam | TRef.A | dyn_type.rs:38:6:38:21 | A | -| dyn_type.rs:40:24:42:5 | { ... } | | dyn_type.rs:38:6:38:21 | A | | dyn_type.rs:41:9:41:12 | self | | {EXTERNAL LOCATION} | & | | dyn_type.rs:41:9:41:12 | self | TRef | dyn_type.rs:33:1:36:1 | GenStruct | | dyn_type.rs:41:9:41:12 | self | TRef.A | dyn_type.rs:38:6:38:21 | A | @@ -1137,8 +1090,6 @@ inferCertainType | dyn_type.rs:51:12:51:16 | SelfParam | TRef | dyn_type.rs:33:1:36:1 | GenStruct | | dyn_type.rs:51:12:51:16 | SelfParam | TRef.A | dyn_type.rs:45:6:45:8 | GGP | | dyn_type.rs:51:34:53:5 | { ... } | | {EXTERNAL LOCATION} | (T_2) | -| dyn_type.rs:51:34:53:5 | { ... } | T0 | dyn_type.rs:45:6:45:8 | GGP | -| dyn_type.rs:51:34:53:5 | { ... } | T1 | {EXTERNAL LOCATION} | bool | | dyn_type.rs:52:9:52:34 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | | dyn_type.rs:52:10:52:13 | self | | {EXTERNAL LOCATION} | & | | dyn_type.rs:52:10:52:13 | self | TRef | dyn_type.rs:33:1:36:1 | GenStruct | @@ -1146,16 +1097,9 @@ inferCertainType | dyn_type.rs:52:30:52:33 | true | | {EXTERNAL LOCATION} | bool | | dyn_type.rs:56:40:56:40 | a | | {EXTERNAL LOCATION} | & | | dyn_type.rs:56:40:56:40 | a | TRef | dyn_type.rs:56:13:56:37 | G | -| dyn_type.rs:56:52:58:1 | { ... } | | dyn_type.rs:56:10:56:10 | A | | dyn_type.rs:57:5:57:5 | a | | {EXTERNAL LOCATION} | & | | dyn_type.rs:57:5:57:5 | a | TRef | dyn_type.rs:56:13:56:37 | G | | dyn_type.rs:60:46:60:46 | a | | dyn_type.rs:60:18:60:43 | A | -| dyn_type.rs:60:78:62:1 | { ... } | | {EXTERNAL LOCATION} | Box | -| dyn_type.rs:60:78:62:1 | { ... } | A | {EXTERNAL LOCATION} | Global | -| dyn_type.rs:60:78:62:1 | { ... } | T | dyn_type.rs:10:1:13:1 | dyn GenericGet | -| dyn_type.rs:60:78:62:1 | { ... } | T.dyn(A) | dyn_type.rs:60:18:60:43 | A | -| dyn_type.rs:61:5:61:36 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| dyn_type.rs:61:5:61:36 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | | dyn_type.rs:61:14:61:35 | GenStruct {...} | | dyn_type.rs:33:1:36:1 | GenStruct | | dyn_type.rs:61:33:61:33 | a | | dyn_type.rs:60:18:60:43 | A | | dyn_type.rs:64:25:64:27 | obj | | {EXTERNAL LOCATION} | & | @@ -1174,32 +1118,17 @@ inferCertainType | dyn_type.rs:70:26:70:28 | obj | TRef | dyn_type.rs:10:1:13:1 | dyn GenericGet | | dyn_type.rs:70:26:70:28 | obj | TRef.dyn(A) | {EXTERNAL LOCATION} | String | | dyn_type.rs:73:26:76:1 | { ... } | | {EXTERNAL LOCATION} | () | -| dyn_type.rs:74:9:74:11 | obj | | {EXTERNAL LOCATION} | Box | -| dyn_type.rs:74:9:74:11 | obj | A | {EXTERNAL LOCATION} | Global | -| dyn_type.rs:74:9:74:11 | obj | T | dyn_type.rs:10:1:13:1 | dyn GenericGet | -| dyn_type.rs:74:15:74:33 | get_box_trait(...) | | {EXTERNAL LOCATION} | Box | -| dyn_type.rs:74:15:74:33 | get_box_trait(...) | A | {EXTERNAL LOCATION} | Global | -| dyn_type.rs:74:15:74:33 | get_box_trait(...) | T | dyn_type.rs:10:1:13:1 | dyn GenericGet | | dyn_type.rs:74:29:74:32 | true | | {EXTERNAL LOCATION} | bool | -| dyn_type.rs:75:21:75:23 | obj | | {EXTERNAL LOCATION} | Box | -| dyn_type.rs:75:21:75:23 | obj | A | {EXTERNAL LOCATION} | Global | -| dyn_type.rs:75:21:75:23 | obj | T | dyn_type.rs:10:1:13:1 | dyn GenericGet | | dyn_type.rs:78:24:78:24 | a | | {EXTERNAL LOCATION} | & | | dyn_type.rs:78:24:78:24 | a | TRef | dyn_type.rs:15:1:19:1 | dyn AssocTrait | | dyn_type.rs:78:24:78:24 | a | TRef.dyn(AP) | dyn_type.rs:78:21:78:21 | B | | dyn_type.rs:78:24:78:24 | a | TRef.dyn(GP) | dyn_type.rs:78:18:78:18 | A | -| dyn_type.rs:78:65:80:1 | { ... } | | {EXTERNAL LOCATION} | (T_2) | -| dyn_type.rs:78:65:80:1 | { ... } | T0 | dyn_type.rs:78:18:78:18 | A | -| dyn_type.rs:78:65:80:1 | { ... } | T1 | dyn_type.rs:78:21:78:21 | B | | dyn_type.rs:79:5:79:5 | a | | {EXTERNAL LOCATION} | & | | dyn_type.rs:79:5:79:5 | a | TRef | dyn_type.rs:15:1:19:1 | dyn AssocTrait | | dyn_type.rs:79:5:79:5 | a | TRef.dyn(AP) | dyn_type.rs:78:21:78:21 | B | | dyn_type.rs:79:5:79:5 | a | TRef.dyn(GP) | dyn_type.rs:78:18:78:18 | A | | dyn_type.rs:82:55:82:55 | a | | {EXTERNAL LOCATION} | & | | dyn_type.rs:82:55:82:55 | a | TRef | dyn_type.rs:82:20:82:52 | T | -| dyn_type.rs:82:72:84:1 | { ... } | | {EXTERNAL LOCATION} | (T_2) | -| dyn_type.rs:82:72:84:1 | { ... } | T0 | dyn_type.rs:82:14:82:14 | A | -| dyn_type.rs:82:72:84:1 | { ... } | T1 | dyn_type.rs:82:17:82:17 | B | | dyn_type.rs:83:5:83:5 | a | | {EXTERNAL LOCATION} | & | | dyn_type.rs:83:5:83:5 | a | TRef | dyn_type.rs:82:20:82:52 | T | | dyn_type.rs:86:20:86:22 | obj | | {EXTERNAL LOCATION} | & | @@ -1213,45 +1142,39 @@ inferCertainType | dyn_type.rs:90:11:90:13 | obj | TRef.dyn(AP) | {EXTERNAL LOCATION} | bool | | dyn_type.rs:90:11:90:13 | obj | TRef.dyn(GP) | {EXTERNAL LOCATION} | i64 | | dyn_type.rs:91:9:94:5 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | -| dyn_type.rs:94:9:94:26 | assoc_dyn_get(...) | | {EXTERNAL LOCATION} | (T_2) | | dyn_type.rs:94:23:94:25 | obj | | {EXTERNAL LOCATION} | & | | dyn_type.rs:94:23:94:25 | obj | TRef | dyn_type.rs:15:1:19:1 | dyn AssocTrait | | dyn_type.rs:94:23:94:25 | obj | TRef.dyn(AP) | {EXTERNAL LOCATION} | bool | | dyn_type.rs:94:23:94:25 | obj | TRef.dyn(GP) | {EXTERNAL LOCATION} | i64 | | dyn_type.rs:95:9:98:5 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | -| dyn_type.rs:98:9:98:22 | assoc_get(...) | | {EXTERNAL LOCATION} | (T_2) | | dyn_type.rs:98:19:98:21 | obj | | {EXTERNAL LOCATION} | & | | dyn_type.rs:98:19:98:21 | obj | TRef | dyn_type.rs:15:1:19:1 | dyn AssocTrait | | dyn_type.rs:98:19:98:21 | obj | TRef.dyn(AP) | {EXTERNAL LOCATION} | bool | | dyn_type.rs:98:19:98:21 | obj | TRef.dyn(GP) | {EXTERNAL LOCATION} | i64 | | dyn_type.rs:101:15:108:1 | { ... } | | {EXTERNAL LOCATION} | () | -| dyn_type.rs:102:5:102:49 | test_basic_dyn_trait(...) | | {EXTERNAL LOCATION} | () | | dyn_type.rs:102:26:102:48 | &... | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:102:26:102:48 | &... | TRef | dyn_type.rs:21:1:24:1 | MyStruct | | dyn_type.rs:102:27:102:48 | MyStruct {...} | | dyn_type.rs:21:1:24:1 | MyStruct | -| dyn_type.rs:103:5:105:6 | test_generic_dyn_trait(...) | | {EXTERNAL LOCATION} | () | | dyn_type.rs:103:28:105:5 | &... | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:103:28:105:5 | &... | TRef | dyn_type.rs:33:1:36:1 | GenStruct | | dyn_type.rs:103:29:105:5 | GenStruct {...} | | dyn_type.rs:33:1:36:1 | GenStruct | | dyn_type.rs:104:16:104:17 | "" | | {EXTERNAL LOCATION} | & | | dyn_type.rs:104:16:104:17 | "" | TRef | {EXTERNAL LOCATION} | str | -| dyn_type.rs:106:5:106:25 | test_poly_dyn_trait(...) | | {EXTERNAL LOCATION} | () | -| dyn_type.rs:107:5:107:46 | test_assoc_type(...) | | {EXTERNAL LOCATION} | () | | dyn_type.rs:107:21:107:45 | &... | | {EXTERNAL LOCATION} | & | +| dyn_type.rs:107:21:107:45 | &... | TRef | dyn_type.rs:33:1:36:1 | GenStruct | | dyn_type.rs:107:22:107:45 | GenStruct {...} | | dyn_type.rs:33:1:36:1 | GenStruct | | invalid/main.rs:8:16:8:19 | SelfParam | | invalid/main.rs:7:5:9:5 | Self [trait T1] | | invalid/main.rs:8:22:8:23 | { ... } | | {EXTERNAL LOCATION} | () | | invalid/main.rs:12:16:12:19 | SelfParam | | invalid/main.rs:11:5:15:5 | Self [trait T2] | -| invalid/main.rs:12:22:14:9 | { ... } | | {EXTERNAL LOCATION} | () | | invalid/main.rs:13:13:13:16 | self | | invalid/main.rs:11:5:15:5 | Self [trait T2] | | invalid/main.rs:25:22:25:25 | SelfParam | | invalid/main.rs:24:5:26:5 | Self [trait AddAlias] | | invalid/main.rs:25:28:25:32 | other | | invalid/main.rs:24:5:26:5 | Self [trait AddAlias] | | invalid/main.rs:29:22:29:25 | SelfParam | | invalid/main.rs:21:5:22:20 | Num | | invalid/main.rs:29:28:29:32 | other | | invalid/main.rs:21:5:22:20 | Num | -| invalid/main.rs:29:49:31:9 | { ... } | | invalid/main.rs:21:5:22:20 | Num | | invalid/main.rs:30:17:30:20 | self | | invalid/main.rs:21:5:22:20 | Num | | invalid/main.rs:30:26:30:30 | other | | invalid/main.rs:21:5:22:20 | Num | | invalid/main.rs:39:16:39:19 | SelfParam | | invalid/main.rs:35:10:35:20 | T | | invalid/main.rs:39:22:39:26 | other | | invalid/main.rs:35:10:35:20 | T | -| invalid/main.rs:39:43:41:9 | { ... } | | invalid/main.rs:35:10:35:20 | T | | invalid/main.rs:40:13:40:16 | self | | invalid/main.rs:35:10:35:20 | T | | invalid/main.rs:40:28:40:32 | other | | invalid/main.rs:35:10:35:20 | T | | invalid/main.rs:44:30:49:5 | { ... } | | {EXTERNAL LOCATION} | () | @@ -1261,26 +1184,24 @@ inferCertainType | invalid/main.rs:61:22:61:26 | SelfParam | TRef | invalid/main.rs:60:5:64:5 | Self [trait Duplicatable] | | invalid/main.rs:68:19:68:23 | SelfParam | | {EXTERNAL LOCATION} | & | | invalid/main.rs:68:19:68:23 | SelfParam | TRef | invalid/main.rs:53:5:54:14 | S1 | -| invalid/main.rs:68:34:70:9 | { ... } | | invalid/main.rs:53:5:54:14 | S1 | | invalid/main.rs:69:14:69:17 | self | | {EXTERNAL LOCATION} | & | | invalid/main.rs:69:14:69:17 | self | TRef | invalid/main.rs:53:5:54:14 | S1 | | invalid/main.rs:75:22:75:26 | SelfParam | | {EXTERNAL LOCATION} | & | | invalid/main.rs:75:22:75:26 | SelfParam | TRef | invalid/main.rs:53:5:54:14 | S1 | -| invalid/main.rs:75:37:77:9 | { ... } | | invalid/main.rs:53:5:54:14 | S1 | | invalid/main.rs:76:14:76:17 | self | | {EXTERNAL LOCATION} | & | | invalid/main.rs:76:14:76:17 | self | TRef | invalid/main.rs:53:5:54:14 | S1 | | invalid/main.rs:83:22:83:26 | SelfParam | | {EXTERNAL LOCATION} | & | | invalid/main.rs:83:22:83:26 | SelfParam | TRef | invalid/main.rs:81:10:81:18 | T | -| invalid/main.rs:83:37:85:9 | { ... } | | invalid/main.rs:81:10:81:18 | T | | invalid/main.rs:84:13:84:16 | self | | {EXTERNAL LOCATION} | & | | invalid/main.rs:84:13:84:16 | self | TRef | invalid/main.rs:81:10:81:18 | T | | invalid/main.rs:88:33:92:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:25:30:28:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:26:13:26:13 | x | | main.rs:5:5:8:5 | MyThing | | main.rs:26:17:26:32 | MyThing {...} | | main.rs:5:5:8:5 | MyThing | +| main.rs:27:9:27:29 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:27:18:27:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:27:18:27:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:27:18:27:28 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:27:18:27:28 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:27:18:27:28 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:27:26:27:26 | x | | main.rs:5:5:8:5 | MyThing | | main.rs:30:29:30:29 | x | | main.rs:16:5:19:5 | GenericThing | @@ -1288,34 +1209,38 @@ inferCertainType | main.rs:30:46:33:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:31:17:31:17 | x | | main.rs:16:5:19:5 | GenericThing | | main.rs:31:17:31:17 | x | A | {EXTERNAL LOCATION} | bool | +| main.rs:32:9:32:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:32:18:32:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:32:18:32:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:32:18:32:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:32:18:32:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:32:18:32:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:35:31:63:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:37:13:37:13 | x | | main.rs:16:5:19:5 | GenericThing | | main.rs:37:13:37:13 | x | A | main.rs:3:5:4:13 | S | | main.rs:37:17:37:42 | GenericThing::<...> {...} | | main.rs:16:5:19:5 | GenericThing | | main.rs:37:17:37:42 | GenericThing::<...> {...} | A | main.rs:3:5:4:13 | S | +| main.rs:38:9:38:29 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:38:18:38:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:38:18:38:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:38:18:38:28 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:38:18:38:28 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:38:18:38:28 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:38:26:38:26 | x | | main.rs:16:5:19:5 | GenericThing | | main.rs:38:26:38:26 | x | A | main.rs:3:5:4:13 | S | | main.rs:41:13:41:13 | y | | main.rs:16:5:19:5 | GenericThing | | main.rs:41:17:41:37 | GenericThing {...} | | main.rs:16:5:19:5 | GenericThing | +| main.rs:42:9:42:29 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:42:18:42:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:42:18:42:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:42:18:42:28 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:42:18:42:28 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:42:18:42:28 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:42:26:42:26 | x | | main.rs:16:5:19:5 | GenericThing | | main.rs:42:26:42:26 | x | A | main.rs:3:5:4:13 | S | | main.rs:46:13:46:13 | x | | main.rs:21:5:23:5 | OptionS | | main.rs:46:17:48:9 | OptionS {...} | | main.rs:21:5:23:5 | OptionS | +| main.rs:49:9:49:29 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:49:18:49:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:49:18:49:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:49:18:49:28 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:49:18:49:28 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:49:18:49:28 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:49:26:49:26 | x | | main.rs:21:5:23:5 | OptionS | | main.rs:52:13:52:13 | x | | main.rs:16:5:19:5 | GenericThing | @@ -1324,9 +1249,10 @@ inferCertainType | main.rs:52:17:54:9 | GenericThing::<...> {...} | | main.rs:16:5:19:5 | GenericThing | | main.rs:52:17:54:9 | GenericThing::<...> {...} | A | main.rs:10:5:14:5 | MyOption | | main.rs:52:17:54:9 | GenericThing::<...> {...} | A.T | main.rs:3:5:4:13 | S | +| main.rs:55:9:55:29 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:55:18:55:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:55:18:55:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:55:18:55:28 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:55:18:55:28 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:55:18:55:28 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:55:26:55:26 | x | | main.rs:16:5:19:5 | GenericThing | | main.rs:55:26:55:26 | x | A | main.rs:10:5:14:5 | MyOption | @@ -1336,15 +1262,14 @@ inferCertainType | main.rs:61:13:61:13 | a | | main.rs:10:5:14:5 | MyOption | | main.rs:61:13:61:13 | a | T | main.rs:3:5:4:13 | S | | main.rs:61:30:61:30 | x | | main.rs:16:5:19:5 | GenericThing | +| main.rs:62:9:62:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:62:18:62:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:62:18:62:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:62:18:62:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:62:18:62:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:62:18:62:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:62:26:62:26 | a | | main.rs:10:5:14:5 | MyOption | | main.rs:62:26:62:26 | a | T | main.rs:3:5:4:13 | S | | main.rs:65:16:68:5 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:66:9:66:29 | simple_field_access(...) | | {EXTERNAL LOCATION} | () | -| main.rs:67:9:67:30 | generic_field_access(...) | | {EXTERNAL LOCATION} | () | | main.rs:75:19:75:22 | SelfParam | | main.rs:72:5:72:21 | Foo | | main.rs:75:33:77:9 | { ... } | | main.rs:72:5:72:21 | Foo | | main.rs:76:13:76:16 | self | | main.rs:72:5:72:21 | Foo | @@ -1352,9 +1277,10 @@ inferCertainType | main.rs:79:32:81:9 | { ... } | | main.rs:72:5:72:21 | Foo | | main.rs:80:13:80:16 | self | | main.rs:72:5:72:21 | Foo | | main.rs:84:23:89:5 | { ... } | | main.rs:72:5:72:21 | Foo | +| main.rs:85:9:85:34 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:85:18:85:33 | "main.rs::m1::f\\n" | | {EXTERNAL LOCATION} | & | | main.rs:85:18:85:33 | "main.rs::m1::f\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:85:18:85:33 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:85:18:85:33 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:85:18:85:33 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:86:13:86:13 | x | | main.rs:72:5:72:21 | Foo | | main.rs:86:17:86:22 | Foo {...} | | main.rs:72:5:72:21 | Foo | @@ -1362,17 +1288,15 @@ inferCertainType | main.rs:88:9:88:9 | x | | main.rs:72:5:72:21 | Foo | | main.rs:91:14:91:14 | x | | main.rs:72:5:72:21 | Foo | | main.rs:91:22:91:22 | y | | main.rs:72:5:72:21 | Foo | -| main.rs:91:37:95:5 | { ... } | | main.rs:72:5:72:21 | Foo | +| main.rs:92:9:92:34 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:92:18:92:33 | "main.rs::m1::g\\n" | | {EXTERNAL LOCATION} | & | | main.rs:92:18:92:33 | "main.rs::m1::g\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:92:18:92:33 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:92:18:92:33 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:92:18:92:33 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:93:9:93:9 | x | | main.rs:72:5:72:21 | Foo | | main.rs:94:9:94:9 | y | | main.rs:72:5:72:21 | Foo | -| main.rs:102:30:105:9 | { ... } | | main.rs:99:5:99:29 | ATupleStruct | | main.rs:116:25:116:28 | SelfParam | | main.rs:115:5:117:5 | Self [trait MyTrait] | | main.rs:121:25:121:28 | SelfParam | | main.rs:110:5:113:5 | MyThing | -| main.rs:121:39:123:9 | { ... } | | {EXTERNAL LOCATION} | bool | | main.rs:122:13:122:16 | self | | main.rs:110:5:113:5 | MyThing | | main.rs:126:16:135:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:127:13:127:13 | x | | main.rs:110:5:113:5 | MyThing | @@ -1390,29 +1314,28 @@ inferCertainType | main.rs:144:25:144:29 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:144:25:144:29 | SelfParam | TRef | main.rs:142:9:147:9 | Self [trait Foo] | | main.rs:144:32:146:13 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:145:17:145:32 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:145:26:145:31 | "foo!\\n" | | {EXTERNAL LOCATION} | & | | main.rs:145:26:145:31 | "foo!\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:145:26:145:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:145:26:145:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:145:26:145:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:151:25:151:29 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:151:25:151:29 | SelfParam | TRef | main.rs:149:9:154:9 | Self [trait Bar] | | main.rs:151:32:153:13 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:152:17:152:32 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:152:26:152:31 | "bar!\\n" | | {EXTERNAL LOCATION} | & | | main.rs:152:26:152:31 | "bar!\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:152:26:152:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:152:26:152:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:152:26:152:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:163:15:184:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:165:9:168:9 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:169:9:172:9 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:173:9:176:9 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:177:9:183:9 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:181:13:181:29 | ...::a_method(...) | | {EXTERNAL LOCATION} | () | | main.rs:181:27:181:28 | &x | | {EXTERNAL LOCATION} | & | -| main.rs:182:13:182:29 | ...::a_method(...) | | {EXTERNAL LOCATION} | () | | main.rs:182:27:182:28 | &x | | {EXTERNAL LOCATION} | & | | main.rs:200:15:200:18 | SelfParam | | main.rs:188:5:191:5 | MyThing | | main.rs:200:15:200:18 | SelfParam | A | main.rs:193:5:194:14 | S1 | -| main.rs:200:27:202:9 | { ... } | | main.rs:193:5:194:14 | S1 | | main.rs:201:13:201:16 | self | | main.rs:188:5:191:5 | MyThing | | main.rs:201:13:201:16 | self | A | main.rs:193:5:194:14 | S1 | | main.rs:207:15:207:18 | SelfParam | | main.rs:188:5:191:5 | MyThing | @@ -1425,7 +1348,6 @@ inferCertainType | main.rs:208:23:208:26 | self | A | main.rs:195:5:196:14 | S2 | | main.rs:213:15:213:18 | SelfParam | | main.rs:188:5:191:5 | MyThing | | main.rs:213:15:213:18 | SelfParam | A | main.rs:212:10:212:10 | T | -| main.rs:213:26:215:9 | { ... } | | main.rs:212:10:212:10 | T | | main.rs:214:13:214:16 | self | | main.rs:188:5:191:5 | MyThing | | main.rs:214:13:214:16 | self | A | main.rs:212:10:212:10 | T | | main.rs:218:16:234:5 | { ... } | | {EXTERNAL LOCATION} | () | @@ -1433,38 +1355,44 @@ inferCertainType | main.rs:219:17:219:33 | MyThing {...} | | main.rs:188:5:191:5 | MyThing | | main.rs:220:13:220:13 | y | | main.rs:188:5:191:5 | MyThing | | main.rs:220:17:220:33 | MyThing {...} | | main.rs:188:5:191:5 | MyThing | +| main.rs:223:9:223:29 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:223:18:223:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:223:18:223:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:223:18:223:28 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:223:18:223:28 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:223:18:223:28 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:223:26:223:26 | x | | main.rs:188:5:191:5 | MyThing | +| main.rs:224:9:224:29 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:224:18:224:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:224:18:224:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:224:18:224:28 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:224:18:224:28 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:224:18:224:28 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:224:26:224:26 | y | | main.rs:188:5:191:5 | MyThing | +| main.rs:226:9:226:32 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:226:18:226:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:226:18:226:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:226:18:226:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:226:18:226:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:226:18:226:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:226:26:226:26 | x | | main.rs:188:5:191:5 | MyThing | +| main.rs:227:9:227:34 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:227:18:227:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:227:18:227:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:227:18:227:33 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:227:18:227:33 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:227:18:227:33 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:227:26:227:26 | y | | main.rs:188:5:191:5 | MyThing | | main.rs:229:13:229:13 | x | | main.rs:188:5:191:5 | MyThing | | main.rs:229:17:229:33 | MyThing {...} | | main.rs:188:5:191:5 | MyThing | | main.rs:230:13:230:13 | y | | main.rs:188:5:191:5 | MyThing | | main.rs:230:17:230:33 | MyThing {...} | | main.rs:188:5:191:5 | MyThing | +| main.rs:232:9:232:32 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:232:18:232:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:232:18:232:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:232:18:232:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:232:18:232:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:232:18:232:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:232:26:232:26 | x | | main.rs:188:5:191:5 | MyThing | +| main.rs:233:9:233:32 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:233:18:233:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:233:18:233:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:233:18:233:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:233:18:233:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:233:18:233:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:233:26:233:26 | y | | main.rs:188:5:191:5 | MyThing | | main.rs:257:15:257:18 | SelfParam | | main.rs:256:5:265:5 | Self [trait MyTrait] | @@ -1475,14 +1403,11 @@ inferCertainType | main.rs:273:16:273:19 | SelfParam | | main.rs:271:5:276:5 | Self [trait MyProduct] | | main.rs:275:16:275:19 | SelfParam | | main.rs:271:5:276:5 | Self [trait MyProduct] | | main.rs:278:43:278:43 | x | | main.rs:278:26:278:40 | T2 | -| main.rs:278:56:280:5 | { ... } | | main.rs:278:22:278:23 | T1 | | main.rs:279:9:279:9 | x | | main.rs:278:26:278:40 | T2 | | main.rs:282:71:282:71 | x | | main.rs:282:53:282:68 | T3 | -| main.rs:282:84:284:5 | { ... } | | main.rs:282:32:282:33 | T1 | | main.rs:283:9:283:9 | x | | main.rs:282:53:282:68 | T3 | | main.rs:288:15:288:18 | SelfParam | | main.rs:238:5:241:5 | MyThing | | main.rs:288:15:288:18 | SelfParam | A | main.rs:249:5:250:14 | S1 | -| main.rs:288:27:290:9 | { ... } | | main.rs:249:5:250:14 | S1 | | main.rs:289:13:289:16 | self | | main.rs:238:5:241:5 | MyThing | | main.rs:289:13:289:16 | self | A | main.rs:249:5:250:14 | S1 | | main.rs:295:15:295:18 | SelfParam | | main.rs:238:5:241:5 | MyThing | @@ -1496,27 +1421,22 @@ inferCertainType | main.rs:302:15:302:18 | SelfParam | | main.rs:238:5:241:5 | MyThing | | main.rs:302:15:302:18 | SelfParam | A | main.rs:251:5:252:14 | S2 | | main.rs:302:36:304:9 | { ... } | | main.rs:238:5:241:5 | MyThing | -| main.rs:302:36:304:9 | { ... } | A | main.rs:249:5:250:14 | S1 | | main.rs:303:13:303:29 | MyThing {...} | | main.rs:238:5:241:5 | MyThing | | main.rs:314:15:314:18 | SelfParam | | main.rs:238:5:241:5 | MyThing | | main.rs:314:15:314:18 | SelfParam | A | main.rs:253:5:254:14 | S3 | -| main.rs:314:27:316:9 | { ... } | | main.rs:309:10:309:11 | TD | | main.rs:321:15:321:18 | SelfParam | | main.rs:243:5:247:5 | MyPair | | main.rs:321:15:321:18 | SelfParam | P1 | main.rs:319:10:319:10 | I | | main.rs:321:15:321:18 | SelfParam | P2 | main.rs:249:5:250:14 | S1 | -| main.rs:321:26:323:9 | { ... } | | main.rs:319:10:319:10 | I | | main.rs:322:13:322:16 | self | | main.rs:243:5:247:5 | MyPair | | main.rs:322:13:322:16 | self | P1 | main.rs:319:10:319:10 | I | | main.rs:322:13:322:16 | self | P2 | main.rs:249:5:250:14 | S1 | | main.rs:328:15:328:18 | SelfParam | | main.rs:243:5:247:5 | MyPair | | main.rs:328:15:328:18 | SelfParam | P1 | main.rs:249:5:250:14 | S1 | | main.rs:328:15:328:18 | SelfParam | P2 | main.rs:251:5:252:14 | S2 | -| main.rs:328:27:330:9 | { ... } | | main.rs:253:5:254:14 | S3 | | main.rs:335:15:335:18 | SelfParam | | main.rs:243:5:247:5 | MyPair | | main.rs:335:15:335:18 | SelfParam | P1 | main.rs:238:5:241:5 | MyThing | | main.rs:335:15:335:18 | SelfParam | P1.A | main.rs:333:10:333:11 | TT | | main.rs:335:15:335:18 | SelfParam | P2 | main.rs:253:5:254:14 | S3 | -| main.rs:335:27:338:9 | { ... } | | main.rs:333:10:333:11 | TT | | main.rs:336:25:336:28 | self | | main.rs:243:5:247:5 | MyPair | | main.rs:336:25:336:28 | self | P1 | main.rs:238:5:241:5 | MyThing | | main.rs:336:25:336:28 | self | P1.A | main.rs:333:10:333:11 | TT | @@ -1524,53 +1444,43 @@ inferCertainType | main.rs:344:16:344:19 | SelfParam | | main.rs:243:5:247:5 | MyPair | | main.rs:344:16:344:19 | SelfParam | P1 | main.rs:342:10:342:10 | A | | main.rs:344:16:344:19 | SelfParam | P2 | main.rs:342:10:342:10 | A | -| main.rs:344:27:346:9 | { ... } | | main.rs:342:10:342:10 | A | | main.rs:345:13:345:16 | self | | main.rs:243:5:247:5 | MyPair | | main.rs:345:13:345:16 | self | P1 | main.rs:342:10:342:10 | A | | main.rs:345:13:345:16 | self | P2 | main.rs:342:10:342:10 | A | | main.rs:349:16:349:19 | SelfParam | | main.rs:243:5:247:5 | MyPair | | main.rs:349:16:349:19 | SelfParam | P1 | main.rs:342:10:342:10 | A | | main.rs:349:16:349:19 | SelfParam | P2 | main.rs:342:10:342:10 | A | -| main.rs:349:27:351:9 | { ... } | | main.rs:342:10:342:10 | A | | main.rs:350:13:350:16 | self | | main.rs:243:5:247:5 | MyPair | | main.rs:350:13:350:16 | self | P1 | main.rs:342:10:342:10 | A | | main.rs:350:13:350:16 | self | P2 | main.rs:342:10:342:10 | A | | main.rs:357:16:357:19 | SelfParam | | main.rs:243:5:247:5 | MyPair | | main.rs:357:16:357:19 | SelfParam | P1 | main.rs:251:5:252:14 | S2 | | main.rs:357:16:357:19 | SelfParam | P2 | main.rs:249:5:250:14 | S1 | -| main.rs:357:28:359:9 | { ... } | | main.rs:249:5:250:14 | S1 | | main.rs:358:13:358:16 | self | | main.rs:243:5:247:5 | MyPair | | main.rs:358:13:358:16 | self | P1 | main.rs:251:5:252:14 | S2 | | main.rs:358:13:358:16 | self | P2 | main.rs:249:5:250:14 | S1 | | main.rs:362:16:362:19 | SelfParam | | main.rs:243:5:247:5 | MyPair | | main.rs:362:16:362:19 | SelfParam | P1 | main.rs:251:5:252:14 | S2 | | main.rs:362:16:362:19 | SelfParam | P2 | main.rs:249:5:250:14 | S1 | -| main.rs:362:28:364:9 | { ... } | | main.rs:251:5:252:14 | S2 | | main.rs:363:13:363:16 | self | | main.rs:243:5:247:5 | MyPair | | main.rs:363:13:363:16 | self | P1 | main.rs:251:5:252:14 | S2 | | main.rs:363:13:363:16 | self | P2 | main.rs:249:5:250:14 | S1 | | main.rs:367:46:367:46 | p | | main.rs:367:24:367:43 | P | -| main.rs:367:58:369:5 | { ... } | | main.rs:367:16:367:17 | V1 | | main.rs:368:9:368:9 | p | | main.rs:367:24:367:43 | P | | main.rs:371:46:371:46 | p | | main.rs:371:24:371:43 | P | -| main.rs:371:58:373:5 | { ... } | | main.rs:371:20:371:21 | V2 | | main.rs:372:9:372:9 | p | | main.rs:371:24:371:43 | P | | main.rs:375:54:375:54 | p | | main.rs:243:5:247:5 | MyPair | | main.rs:375:54:375:54 | p | P1 | main.rs:375:20:375:21 | V0 | | main.rs:375:54:375:54 | p | P2 | main.rs:375:32:375:51 | P | -| main.rs:375:78:377:5 | { ... } | | main.rs:375:24:375:25 | V1 | | main.rs:376:9:376:9 | p | | main.rs:243:5:247:5 | MyPair | | main.rs:376:9:376:9 | p | P1 | main.rs:375:20:375:21 | V0 | | main.rs:376:9:376:9 | p | P2 | main.rs:375:32:375:51 | P | | main.rs:381:23:381:26 | SelfParam | | main.rs:379:5:382:5 | Self [trait ConvertTo] | | main.rs:386:23:386:26 | SelfParam | | main.rs:384:10:384:23 | T | -| main.rs:386:35:388:9 | { ... } | | main.rs:249:5:250:14 | S1 | | main.rs:387:13:387:16 | self | | main.rs:384:10:384:23 | T | | main.rs:391:41:391:45 | thing | | main.rs:391:23:391:38 | T | -| main.rs:391:57:393:5 | { ... } | | main.rs:391:19:391:20 | TS | | main.rs:392:9:392:13 | thing | | main.rs:391:23:391:38 | T | | main.rs:395:56:395:60 | thing | | main.rs:395:39:395:53 | TP | -| main.rs:395:73:398:5 | { ... } | | main.rs:249:5:250:14 | S1 | | main.rs:397:9:397:13 | thing | | main.rs:395:39:395:53 | TP | | main.rs:400:16:473:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:401:13:401:20 | thing_s1 | | main.rs:238:5:241:5 | MyThing | @@ -1579,102 +1489,118 @@ inferCertainType | main.rs:402:24:402:40 | MyThing {...} | | main.rs:238:5:241:5 | MyThing | | main.rs:403:13:403:20 | thing_s3 | | main.rs:238:5:241:5 | MyThing | | main.rs:403:24:403:40 | MyThing {...} | | main.rs:238:5:241:5 | MyThing | +| main.rs:407:9:407:39 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:407:18:407:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:407:18:407:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:407:18:407:38 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:407:18:407:38 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:407:18:407:38 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:407:26:407:33 | thing_s1 | | main.rs:238:5:241:5 | MyThing | +| main.rs:408:9:408:41 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:408:18:408:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:408:18:408:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:408:18:408:40 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:408:18:408:40 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:408:18:408:40 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:408:26:408:33 | thing_s2 | | main.rs:238:5:241:5 | MyThing | | main.rs:409:13:409:14 | s3 | | main.rs:253:5:254:14 | S3 | | main.rs:409:22:409:29 | thing_s3 | | main.rs:238:5:241:5 | MyThing | +| main.rs:410:9:410:28 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:410:18:410:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:410:18:410:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:410:18:410:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:410:18:410:27 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:410:18:410:27 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:410:26:410:27 | s3 | | main.rs:253:5:254:14 | S3 | | main.rs:412:13:412:14 | p1 | | main.rs:243:5:247:5 | MyPair | | main.rs:412:18:412:42 | MyPair {...} | | main.rs:243:5:247:5 | MyPair | +| main.rs:413:9:413:33 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:413:18:413:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:413:18:413:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:413:18:413:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:413:18:413:32 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:413:18:413:32 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:413:26:413:27 | p1 | | main.rs:243:5:247:5 | MyPair | | main.rs:415:13:415:14 | p2 | | main.rs:243:5:247:5 | MyPair | | main.rs:415:18:415:42 | MyPair {...} | | main.rs:243:5:247:5 | MyPair | +| main.rs:416:9:416:33 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:416:18:416:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:416:18:416:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:416:18:416:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:416:18:416:32 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:416:18:416:32 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:416:26:416:27 | p2 | | main.rs:243:5:247:5 | MyPair | | main.rs:418:13:418:14 | p3 | | main.rs:243:5:247:5 | MyPair | | main.rs:418:18:421:9 | MyPair {...} | | main.rs:243:5:247:5 | MyPair | | main.rs:419:17:419:33 | MyThing {...} | | main.rs:238:5:241:5 | MyThing | +| main.rs:422:9:422:33 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:422:18:422:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:422:18:422:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:422:18:422:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:422:18:422:32 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:422:18:422:32 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:422:26:422:27 | p3 | | main.rs:243:5:247:5 | MyPair | | main.rs:425:13:425:13 | a | | main.rs:243:5:247:5 | MyPair | | main.rs:425:17:425:41 | MyPair {...} | | main.rs:243:5:247:5 | MyPair | | main.rs:426:17:426:17 | a | | main.rs:243:5:247:5 | MyPair | +| main.rs:427:9:427:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:427:18:427:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:427:18:427:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:427:18:427:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:427:18:427:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:427:18:427:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:428:17:428:17 | a | | main.rs:243:5:247:5 | MyPair | +| main.rs:429:9:429:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:429:18:429:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:429:18:429:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:429:18:429:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:429:18:429:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:429:18:429:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:435:13:435:13 | b | | main.rs:243:5:247:5 | MyPair | | main.rs:435:17:435:41 | MyPair {...} | | main.rs:243:5:247:5 | MyPair | | main.rs:436:17:436:17 | b | | main.rs:243:5:247:5 | MyPair | +| main.rs:437:9:437:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:437:18:437:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:437:18:437:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:437:18:437:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:437:18:437:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:437:18:437:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:438:17:438:17 | b | | main.rs:243:5:247:5 | MyPair | +| main.rs:439:9:439:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:439:18:439:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:439:18:439:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:439:18:439:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:439:18:439:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:439:18:439:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:443:31:443:38 | thing_s1 | | main.rs:238:5:241:5 | MyThing | +| main.rs:444:9:444:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:444:18:444:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:444:18:444:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:444:18:444:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:444:18:444:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:444:18:444:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:445:31:445:38 | thing_s2 | | main.rs:238:5:241:5 | MyThing | +| main.rs:446:9:446:29 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:446:18:446:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:446:18:446:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:446:18:446:28 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:446:18:446:28 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:446:18:446:28 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:449:13:449:13 | a | | main.rs:243:5:247:5 | MyPair | | main.rs:449:17:449:41 | MyPair {...} | | main.rs:243:5:247:5 | MyPair | | main.rs:450:25:450:25 | a | | main.rs:243:5:247:5 | MyPair | +| main.rs:451:9:451:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:451:18:451:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:451:18:451:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:451:18:451:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:451:18:451:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:451:18:451:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:452:25:452:25 | a | | main.rs:243:5:247:5 | MyPair | +| main.rs:453:9:453:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:453:18:453:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:453:18:453:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:453:18:453:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:453:18:453:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:453:18:453:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:456:13:456:13 | b | | main.rs:243:5:247:5 | MyPair | | main.rs:456:17:456:41 | MyPair {...} | | main.rs:243:5:247:5 | MyPair | | main.rs:457:25:457:25 | b | | main.rs:243:5:247:5 | MyPair | +| main.rs:458:9:458:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:458:18:458:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:458:18:458:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:458:18:458:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:458:18:458:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:458:18:458:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:459:25:459:25 | b | | main.rs:243:5:247:5 | MyPair | +| main.rs:460:9:460:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:460:18:460:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:460:18:460:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:460:18:460:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:460:18:460:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:460:18:460:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:462:13:462:13 | c | | main.rs:243:5:247:5 | MyPair | | main.rs:462:17:465:9 | MyPair {...} | | main.rs:243:5:247:5 | MyPair | @@ -1690,37 +1616,42 @@ inferCertainType | main.rs:499:64:499:64 | x | | main.rs:499:45:499:61 | T | | main.rs:499:70:503:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:501:18:501:18 | x | | main.rs:499:45:499:61 | T | +| main.rs:502:9:502:28 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:502:18:502:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:502:18:502:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:502:18:502:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:502:18:502:27 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:502:18:502:27 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:505:65:505:65 | x | | main.rs:505:46:505:62 | T | | main.rs:505:71:509:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:507:18:507:18 | x | | main.rs:505:46:505:62 | T | +| main.rs:508:9:508:28 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:508:18:508:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:508:18:508:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:508:18:508:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:508:18:508:27 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:508:18:508:27 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:511:49:511:49 | x | | main.rs:511:30:511:46 | T | | main.rs:511:55:514:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:512:17:512:17 | x | | main.rs:511:30:511:46 | T | +| main.rs:513:9:513:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:513:18:513:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:513:18:513:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:513:18:513:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:513:18:513:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:513:18:513:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:516:53:516:53 | x | | main.rs:516:34:516:50 | T | | main.rs:516:59:519:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:517:17:517:17 | x | | main.rs:516:34:516:50 | T | +| main.rs:518:9:518:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:518:18:518:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:518:18:518:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:518:18:518:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:518:18:518:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:518:18:518:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:521:43:521:43 | x | | main.rs:521:40:521:40 | T | | main.rs:524:5:527:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:525:17:525:17 | x | | main.rs:521:40:521:40 | T | +| main.rs:526:9:526:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:526:18:526:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:526:18:526:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:526:18:526:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:526:18:526:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:526:18:526:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:530:16:530:19 | SelfParam | | main.rs:529:5:533:5 | Self [trait Pair] | | main.rs:532:16:532:19 | SelfParam | | main.rs:529:5:533:5 | Self [trait Pair] | @@ -1734,46 +1665,48 @@ inferCertainType | main.rs:544:70:549:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:546:18:546:18 | x | | main.rs:544:41:544:55 | T | | main.rs:547:18:547:18 | y | | main.rs:544:41:544:55 | T | +| main.rs:548:9:548:38 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:548:18:548:29 | "{:?}, {:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:548:18:548:29 | "{:?}, {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:548:18:548:37 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:548:18:548:37 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:548:18:548:37 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:551:69:551:69 | x | | main.rs:551:52:551:66 | T | | main.rs:551:75:551:75 | y | | main.rs:551:52:551:66 | T | | main.rs:551:81:556:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:553:18:553:18 | x | | main.rs:551:52:551:66 | T | | main.rs:554:18:554:18 | y | | main.rs:551:52:551:66 | T | +| main.rs:555:9:555:38 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:555:18:555:29 | "{:?}, {:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:555:18:555:29 | "{:?}, {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:555:18:555:37 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:555:18:555:37 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:555:18:555:37 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:558:50:558:50 | x | | main.rs:558:41:558:47 | T | | main.rs:558:56:558:56 | y | | main.rs:558:41:558:47 | T | | main.rs:558:62:563:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:560:18:560:18 | x | | main.rs:558:41:558:47 | T | | main.rs:561:18:561:18 | y | | main.rs:558:41:558:47 | T | +| main.rs:562:9:562:38 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:562:18:562:29 | "{:?}, {:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:562:18:562:29 | "{:?}, {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:562:18:562:37 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:562:18:562:37 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:562:18:562:37 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:565:54:565:54 | x | | main.rs:565:41:565:51 | T | | main.rs:565:60:565:60 | y | | main.rs:565:41:565:51 | T | | main.rs:565:66:570:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:567:18:567:18 | x | | main.rs:565:41:565:51 | T | | main.rs:568:18:568:18 | y | | main.rs:565:41:565:51 | T | +| main.rs:569:9:569:38 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:569:18:569:29 | "{:?}, {:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:569:18:569:29 | "{:?}, {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:569:18:569:37 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:569:18:569:37 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:569:18:569:37 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:577:18:577:22 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:577:18:577:22 | SelfParam | TRef | main.rs:574:5:578:5 | Self [trait TraitWithSelfTp] | | main.rs:580:40:580:44 | thing | | {EXTERNAL LOCATION} | & | | main.rs:580:40:580:44 | thing | TRef | main.rs:580:17:580:37 | T | -| main.rs:580:56:582:5 | { ... } | | main.rs:580:14:580:14 | A | | main.rs:581:9:581:13 | thing | | {EXTERNAL LOCATION} | & | | main.rs:581:9:581:13 | thing | TRef | main.rs:580:17:580:37 | T | | main.rs:585:44:585:48 | thing | | main.rs:585:24:585:41 | S | -| main.rs:585:61:588:5 | { ... } | | {EXTERNAL LOCATION} | i64 | | main.rs:586:19:586:23 | thing | | main.rs:585:24:585:41 | S | | main.rs:593:55:593:59 | thing | | {EXTERNAL LOCATION} | & | | main.rs:593:55:593:59 | thing | TRef | main.rs:593:25:593:52 | S | @@ -1782,8 +1715,6 @@ inferCertainType | main.rs:595:25:595:29 | thing | TRef | main.rs:593:25:593:52 | S | | main.rs:604:18:604:22 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:604:18:604:22 | SelfParam | TRef | main.rs:598:5:600:5 | MyStruct | -| main.rs:604:41:606:9 | { ... } | | {EXTERNAL LOCATION} | Option | -| main.rs:604:41:606:9 | { ... } | T | main.rs:598:5:600:5 | MyStruct | | main.rs:605:18:605:47 | MyStruct {...} | | main.rs:598:5:600:5 | MyStruct | | main.rs:605:36:605:39 | self | | {EXTERNAL LOCATION} | & | | main.rs:605:36:605:39 | self | TRef | main.rs:598:5:600:5 | MyStruct | @@ -1791,63 +1722,49 @@ inferCertainType | main.rs:612:13:612:13 | s | | main.rs:598:5:600:5 | MyStruct | | main.rs:612:17:612:37 | MyStruct {...} | | main.rs:598:5:600:5 | MyStruct | | main.rs:613:25:613:26 | &s | | {EXTERNAL LOCATION} | & | +| main.rs:613:25:613:26 | &s | TRef | main.rs:598:5:600:5 | MyStruct | | main.rs:613:26:613:26 | s | | main.rs:598:5:600:5 | MyStruct | | main.rs:629:15:629:18 | SelfParam | | main.rs:628:5:639:5 | Self [trait MyTrait] | | main.rs:631:15:631:18 | SelfParam | | main.rs:628:5:639:5 | Self [trait MyTrait] | -| main.rs:634:9:636:9 | { ... } | | main.rs:628:19:628:19 | A | | main.rs:635:13:635:16 | self | | main.rs:628:5:639:5 | Self [trait MyTrait] | | main.rs:638:18:638:18 | x | | main.rs:628:5:639:5 | Self [trait MyTrait] | | main.rs:642:15:642:18 | SelfParam | | main.rs:625:5:626:14 | S2 | -| main.rs:642:26:644:9 | { ... } | | main.rs:641:10:641:19 | T | | main.rs:646:18:646:18 | x | | main.rs:625:5:626:14 | S2 | -| main.rs:646:32:648:9 | { ... } | | main.rs:641:10:641:19 | T | | main.rs:652:15:652:18 | SelfParam | | main.rs:623:5:624:14 | S1 | -| main.rs:652:28:654:9 | { ... } | | {EXTERNAL LOCATION} | i32 | | main.rs:656:18:656:18 | x | | main.rs:623:5:624:14 | S1 | -| main.rs:656:34:658:9 | { ... } | | {EXTERNAL LOCATION} | i32 | | main.rs:663:50:663:50 | x | | main.rs:663:26:663:47 | T2 | -| main.rs:663:63:666:5 | { ... } | | main.rs:663:22:663:23 | T1 | | main.rs:664:9:664:9 | x | | main.rs:663:26:663:47 | T2 | | main.rs:665:9:665:9 | x | | main.rs:663:26:663:47 | T2 | | main.rs:667:52:667:52 | x | | main.rs:667:28:667:49 | T2 | -| main.rs:667:65:671:5 | { ... } | | main.rs:667:24:667:25 | T1 | | main.rs:668:24:668:24 | x | | main.rs:667:28:667:49 | T2 | | main.rs:670:16:670:16 | x | | main.rs:667:28:667:49 | T2 | | main.rs:672:52:672:52 | x | | main.rs:672:28:672:49 | T2 | -| main.rs:672:65:676:5 | { ... } | | main.rs:672:24:672:25 | T1 | | main.rs:673:29:673:29 | x | | main.rs:672:28:672:49 | T2 | | main.rs:675:21:675:21 | x | | main.rs:672:28:672:49 | T2 | | main.rs:677:55:677:55 | x | | main.rs:677:31:677:52 | T2 | -| main.rs:677:68:681:5 | { ... } | | main.rs:677:27:677:28 | T1 | | main.rs:678:27:678:27 | x | | main.rs:677:31:677:52 | T2 | | main.rs:680:19:680:19 | x | | main.rs:677:31:677:52 | T2 | | main.rs:682:55:682:55 | x | | main.rs:682:31:682:52 | T2 | -| main.rs:682:68:686:5 | { ... } | | main.rs:682:27:682:28 | T1 | | main.rs:683:32:683:32 | x | | main.rs:682:31:682:52 | T2 | | main.rs:685:24:685:24 | x | | main.rs:682:31:682:52 | T2 | | main.rs:690:49:690:49 | x | | main.rs:618:5:621:5 | MyThing | | main.rs:690:49:690:49 | x | T | main.rs:690:32:690:46 | T2 | -| main.rs:690:71:692:5 | { ... } | | main.rs:690:28:690:29 | T1 | | main.rs:691:9:691:9 | x | | main.rs:618:5:621:5 | MyThing | | main.rs:691:9:691:9 | x | T | main.rs:690:32:690:46 | T2 | | main.rs:693:51:693:51 | x | | main.rs:618:5:621:5 | MyThing | | main.rs:693:51:693:51 | x | T | main.rs:693:34:693:48 | T2 | -| main.rs:693:73:695:5 | { ... } | | main.rs:693:30:693:31 | T1 | | main.rs:694:16:694:16 | x | | main.rs:618:5:621:5 | MyThing | | main.rs:694:16:694:16 | x | T | main.rs:693:34:693:48 | T2 | | main.rs:696:51:696:51 | x | | main.rs:618:5:621:5 | MyThing | | main.rs:696:51:696:51 | x | T | main.rs:696:34:696:48 | T2 | -| main.rs:696:73:698:5 | { ... } | | main.rs:696:30:696:31 | T1 | | main.rs:697:21:697:21 | x | | main.rs:618:5:621:5 | MyThing | | main.rs:697:21:697:21 | x | T | main.rs:696:34:696:48 | T2 | | main.rs:701:15:701:18 | SelfParam | | main.rs:618:5:621:5 | MyThing | | main.rs:701:15:701:18 | SelfParam | T | main.rs:700:10:700:10 | T | -| main.rs:701:26:703:9 | { ... } | | main.rs:700:10:700:10 | T | | main.rs:702:13:702:16 | self | | main.rs:618:5:621:5 | MyThing | | main.rs:702:13:702:16 | self | T | main.rs:700:10:700:10 | T | | main.rs:705:18:705:18 | x | | main.rs:618:5:621:5 | MyThing | | main.rs:705:18:705:18 | x | T | main.rs:700:10:700:10 | T | -| main.rs:705:32:707:9 | { ... } | | main.rs:700:10:700:10 | T | | main.rs:706:13:706:13 | x | | main.rs:618:5:621:5 | MyThing | | main.rs:706:13:706:13 | x | T | main.rs:700:10:700:10 | T | | main.rs:712:15:712:18 | SelfParam | | main.rs:710:5:713:5 | Self [trait MyTrait2] | @@ -1865,28 +1782,32 @@ inferCertainType | main.rs:726:17:726:33 | MyThing {...} | | main.rs:618:5:621:5 | MyThing | | main.rs:727:13:727:13 | y | | main.rs:618:5:621:5 | MyThing | | main.rs:727:17:727:33 | MyThing {...} | | main.rs:618:5:621:5 | MyThing | +| main.rs:729:9:729:32 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:729:18:729:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:729:18:729:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:729:18:729:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:729:18:729:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:729:18:729:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:729:26:729:26 | x | | main.rs:618:5:621:5 | MyThing | +| main.rs:730:9:730:32 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:730:18:730:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:730:18:730:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:730:18:730:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:730:18:730:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:730:18:730:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:730:26:730:26 | y | | main.rs:618:5:621:5 | MyThing | | main.rs:732:13:732:13 | x | | main.rs:618:5:621:5 | MyThing | | main.rs:732:17:732:33 | MyThing {...} | | main.rs:618:5:621:5 | MyThing | | main.rs:733:13:733:13 | y | | main.rs:618:5:621:5 | MyThing | | main.rs:733:17:733:33 | MyThing {...} | | main.rs:618:5:621:5 | MyThing | +| main.rs:735:9:735:32 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:735:18:735:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:735:18:735:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:735:18:735:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:735:18:735:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:735:18:735:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:735:26:735:26 | x | | main.rs:618:5:621:5 | MyThing | +| main.rs:736:9:736:32 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:736:18:736:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:736:18:736:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:736:18:736:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:736:18:736:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:736:18:736:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:736:26:736:26 | y | | main.rs:618:5:621:5 | MyThing | | main.rs:738:13:738:14 | x2 | | main.rs:618:5:621:5 | MyThing | @@ -1894,54 +1815,64 @@ inferCertainType | main.rs:739:13:739:14 | y2 | | main.rs:618:5:621:5 | MyThing | | main.rs:739:18:739:34 | MyThing {...} | | main.rs:618:5:621:5 | MyThing | | main.rs:741:31:741:32 | x2 | | main.rs:618:5:621:5 | MyThing | +| main.rs:742:9:742:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:742:18:742:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:742:18:742:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:742:18:742:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:742:18:742:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:742:18:742:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:743:33:743:34 | x2 | | main.rs:618:5:621:5 | MyThing | +| main.rs:744:9:744:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:744:18:744:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:744:18:744:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:744:18:744:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:744:18:744:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:744:18:744:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:745:33:745:34 | x2 | | main.rs:618:5:621:5 | MyThing | +| main.rs:746:9:746:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:746:18:746:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:746:18:746:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:746:18:746:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:746:18:746:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:746:18:746:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:747:31:747:32 | y2 | | main.rs:618:5:621:5 | MyThing | +| main.rs:748:9:748:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:748:18:748:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:748:18:748:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:748:18:748:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:748:18:748:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:748:18:748:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:749:33:749:34 | y2 | | main.rs:618:5:621:5 | MyThing | +| main.rs:750:9:750:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:750:18:750:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:750:18:750:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:750:18:750:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:750:18:750:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:750:18:750:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:751:33:751:34 | y2 | | main.rs:618:5:621:5 | MyThing | +| main.rs:752:9:752:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:752:18:752:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:752:18:752:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:752:18:752:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:752:18:752:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:752:18:752:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:753:36:753:37 | x2 | | main.rs:618:5:621:5 | MyThing | +| main.rs:754:9:754:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:754:18:754:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:754:18:754:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:754:18:754:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:754:18:754:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:754:18:754:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:755:36:755:37 | x2 | | main.rs:618:5:621:5 | MyThing | +| main.rs:756:9:756:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:756:18:756:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:756:18:756:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:756:18:756:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:756:18:756:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:756:18:756:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:757:36:757:37 | y2 | | main.rs:618:5:621:5 | MyThing | +| main.rs:758:9:758:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:758:18:758:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:758:18:758:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:758:18:758:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:758:18:758:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:758:18:758:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:759:36:759:37 | y2 | | main.rs:618:5:621:5 | MyThing | +| main.rs:760:9:760:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:760:18:760:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:760:18:760:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:760:18:760:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:760:18:760:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:760:18:760:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:762:13:762:14 | x3 | | main.rs:618:5:621:5 | MyThing | | main.rs:762:18:764:9 | MyThing {...} | | main.rs:618:5:621:5 | MyThing | @@ -1950,130 +1881,140 @@ inferCertainType | main.rs:765:18:767:9 | MyThing {...} | | main.rs:618:5:621:5 | MyThing | | main.rs:766:16:766:32 | MyThing {...} | | main.rs:618:5:621:5 | MyThing | | main.rs:769:37:769:38 | x3 | | main.rs:618:5:621:5 | MyThing | +| main.rs:770:9:770:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:770:18:770:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:770:18:770:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:770:18:770:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:770:18:770:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:770:18:770:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:771:39:771:40 | x3 | | main.rs:618:5:621:5 | MyThing | +| main.rs:772:9:772:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:772:18:772:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:772:18:772:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:772:18:772:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:772:18:772:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:772:18:772:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:773:39:773:40 | x3 | | main.rs:618:5:621:5 | MyThing | +| main.rs:774:9:774:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:774:18:774:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:774:18:774:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:774:18:774:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:774:18:774:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:774:18:774:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:775:37:775:38 | y3 | | main.rs:618:5:621:5 | MyThing | +| main.rs:776:9:776:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:776:18:776:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:776:18:776:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:776:18:776:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:776:18:776:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:776:18:776:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:777:39:777:40 | y3 | | main.rs:618:5:621:5 | MyThing | +| main.rs:778:9:778:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:778:18:778:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:778:18:778:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:778:18:778:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:778:18:778:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:778:18:778:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:779:39:779:40 | y3 | | main.rs:618:5:621:5 | MyThing | +| main.rs:780:9:780:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:780:18:780:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:780:18:780:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:780:18:780:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:780:18:780:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:780:18:780:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:782:13:782:13 | y | | {EXTERNAL LOCATION} | i32 | | main.rs:799:15:799:18 | SelfParam | | main.rs:787:5:791:5 | MyEnum | | main.rs:799:15:799:18 | SelfParam | A | main.rs:798:10:798:10 | T | -| main.rs:799:26:804:9 | { ... } | | main.rs:798:10:798:10 | T | | main.rs:800:19:800:22 | self | | main.rs:787:5:791:5 | MyEnum | | main.rs:800:19:800:22 | self | A | main.rs:798:10:798:10 | T | | main.rs:802:17:802:32 | ...::C2 {...} | | main.rs:787:5:791:5 | MyEnum | | main.rs:807:16:813:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:809:13:809:13 | y | | main.rs:787:5:791:5 | MyEnum | | main.rs:809:17:809:36 | ...::C2 {...} | | main.rs:787:5:791:5 | MyEnum | +| main.rs:811:9:811:32 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:811:18:811:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:811:18:811:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:811:18:811:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | main.rs:811:18:811:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:811:18:811:31 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:812:9:812:32 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:812:18:812:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:812:18:812:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:812:18:812:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:812:18:812:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:812:18:812:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:812:26:812:26 | y | | main.rs:787:5:791:5 | MyEnum | | main.rs:834:15:834:18 | SelfParam | | main.rs:832:5:835:5 | Self [trait MyTrait1] | | main.rs:839:15:839:19 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:839:15:839:19 | SelfParam | TRef | main.rs:837:5:849:5 | Self [trait MyTrait2] | -| main.rs:842:9:848:9 | { ... } | | main.rs:837:20:837:22 | Tr2 | | main.rs:844:17:844:20 | self | | {EXTERNAL LOCATION} | & | | main.rs:844:17:844:20 | self | TRef | main.rs:837:5:849:5 | Self [trait MyTrait2] | | main.rs:846:27:846:30 | self | | {EXTERNAL LOCATION} | & | | main.rs:846:27:846:30 | self | TRef | main.rs:837:5:849:5 | Self [trait MyTrait2] | | main.rs:853:15:853:18 | SelfParam | | main.rs:851:5:863:5 | Self [trait MyTrait3] | -| main.rs:856:9:862:9 | { ... } | | main.rs:851:20:851:22 | Tr3 | | main.rs:858:17:858:20 | self | | main.rs:851:5:863:5 | Self [trait MyTrait3] | | main.rs:860:26:860:30 | &self | | {EXTERNAL LOCATION} | & | +| main.rs:860:26:860:30 | &self | TRef | main.rs:851:5:863:5 | Self [trait MyTrait3] | | main.rs:860:27:860:30 | self | | main.rs:851:5:863:5 | Self [trait MyTrait3] | | main.rs:867:15:867:18 | SelfParam | | main.rs:817:5:820:5 | MyThing | | main.rs:867:15:867:18 | SelfParam | A | main.rs:865:10:865:10 | T | -| main.rs:867:26:869:9 | { ... } | | main.rs:865:10:865:10 | T | | main.rs:868:13:868:16 | self | | main.rs:817:5:820:5 | MyThing | | main.rs:868:13:868:16 | self | A | main.rs:865:10:865:10 | T | | main.rs:876:15:876:18 | SelfParam | | main.rs:822:5:825:5 | MyThing2 | | main.rs:876:15:876:18 | SelfParam | A | main.rs:874:10:874:10 | T | | main.rs:876:35:878:9 | { ... } | | main.rs:817:5:820:5 | MyThing | -| main.rs:876:35:878:9 | { ... } | A | main.rs:874:10:874:10 | T | | main.rs:877:13:877:33 | MyThing {...} | | main.rs:817:5:820:5 | MyThing | | main.rs:877:26:877:29 | self | | main.rs:822:5:825:5 | MyThing2 | | main.rs:877:26:877:29 | self | A | main.rs:874:10:874:10 | T | | main.rs:885:44:885:44 | x | | main.rs:885:26:885:41 | T2 | -| main.rs:885:57:887:5 | { ... } | | main.rs:885:22:885:23 | T1 | | main.rs:886:9:886:9 | x | | main.rs:885:26:885:41 | T2 | | main.rs:889:56:889:56 | x | | main.rs:889:39:889:53 | T | | main.rs:889:62:893:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:891:17:891:17 | x | | main.rs:889:39:889:53 | T | +| main.rs:892:9:892:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:892:18:892:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:892:18:892:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:892:18:892:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:892:18:892:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:892:18:892:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:895:16:919:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:896:13:896:13 | x | | main.rs:817:5:820:5 | MyThing | | main.rs:896:17:896:33 | MyThing {...} | | main.rs:817:5:820:5 | MyThing | | main.rs:897:13:897:13 | y | | main.rs:817:5:820:5 | MyThing | | main.rs:897:17:897:33 | MyThing {...} | | main.rs:817:5:820:5 | MyThing | +| main.rs:899:9:899:32 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:899:18:899:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:899:18:899:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:899:18:899:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:899:18:899:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:899:18:899:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:899:26:899:26 | x | | main.rs:817:5:820:5 | MyThing | +| main.rs:900:9:900:32 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:900:18:900:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:900:18:900:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:900:18:900:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:900:18:900:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:900:18:900:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:900:26:900:26 | y | | main.rs:817:5:820:5 | MyThing | | main.rs:902:13:902:13 | x | | main.rs:817:5:820:5 | MyThing | | main.rs:902:17:902:33 | MyThing {...} | | main.rs:817:5:820:5 | MyThing | | main.rs:903:13:903:13 | y | | main.rs:817:5:820:5 | MyThing | | main.rs:903:17:903:33 | MyThing {...} | | main.rs:817:5:820:5 | MyThing | +| main.rs:905:9:905:32 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:905:18:905:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:905:18:905:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:905:18:905:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:905:18:905:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:905:18:905:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:905:26:905:26 | x | | main.rs:817:5:820:5 | MyThing | +| main.rs:906:9:906:32 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:906:18:906:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:906:18:906:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:906:18:906:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:906:18:906:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:906:18:906:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:906:26:906:26 | y | | main.rs:817:5:820:5 | MyThing | | main.rs:908:13:908:13 | x | | main.rs:822:5:825:5 | MyThing2 | | main.rs:908:17:908:34 | MyThing2 {...} | | main.rs:822:5:825:5 | MyThing2 | | main.rs:909:13:909:13 | y | | main.rs:822:5:825:5 | MyThing2 | | main.rs:909:17:909:34 | MyThing2 {...} | | main.rs:822:5:825:5 | MyThing2 | +| main.rs:911:9:911:32 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:911:18:911:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:911:18:911:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:911:18:911:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:911:18:911:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:911:18:911:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:911:26:911:26 | x | | main.rs:822:5:825:5 | MyThing2 | +| main.rs:912:9:912:32 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:912:18:912:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:912:18:912:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:912:18:912:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:912:18:912:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:912:18:912:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:912:26:912:26 | y | | main.rs:822:5:825:5 | MyThing2 | | main.rs:914:13:914:13 | x | | main.rs:817:5:820:5 | MyThing | @@ -2089,49 +2030,41 @@ inferCertainType | main.rs:936:9:936:9 | x | | {EXTERNAL LOCATION} | & | | main.rs:936:9:936:9 | x | TRef | main.rs:935:11:935:19 | T | | main.rs:940:17:940:20 | SelfParam | | main.rs:925:5:926:14 | S1 | -| main.rs:940:29:942:9 | { ... } | | main.rs:928:5:929:14 | S2 | | main.rs:945:21:945:21 | x | | main.rs:945:13:945:14 | T1 | -| main.rs:948:5:950:5 | { ... } | | main.rs:945:17:945:18 | T2 | | main.rs:949:9:949:9 | x | | main.rs:945:13:945:14 | T1 | | main.rs:952:16:968:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:954:9:954:32 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:954:18:954:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:954:18:954:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:954:18:954:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | main.rs:954:18:954:31 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:954:26:954:31 | id(...) | | {EXTERNAL LOCATION} | & | +| main.rs:954:18:954:31 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:954:29:954:30 | &x | | {EXTERNAL LOCATION} | & | +| main.rs:957:9:957:38 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:957:18:957:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:957:18:957:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:957:18:957:37 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | main.rs:957:18:957:37 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:957:26:957:37 | id::<...>(...) | | {EXTERNAL LOCATION} | & | -| main.rs:957:26:957:37 | id::<...>(...) | TRef | main.rs:925:5:926:14 | S1 | +| main.rs:957:18:957:37 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:957:35:957:36 | &x | | {EXTERNAL LOCATION} | & | +| main.rs:961:9:961:45 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:961:18:961:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:961:18:961:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:961:18:961:44 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | main.rs:961:18:961:44 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:961:26:961:44 | id::<...>(...) | | {EXTERNAL LOCATION} | & | -| main.rs:961:26:961:44 | id::<...>(...) | TRef | main.rs:931:5:931:25 | dyn Trait | +| main.rs:961:18:961:44 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:961:42:961:43 | &x | | {EXTERNAL LOCATION} | & | -| main.rs:964:9:964:25 | into::<...>(...) | | main.rs:928:5:929:14 | S2 | | main.rs:967:13:967:13 | y | | main.rs:928:5:929:14 | S2 | | main.rs:981:22:981:25 | SelfParam | | main.rs:972:5:978:5 | PairOption | | main.rs:981:22:981:25 | SelfParam | Fst | main.rs:980:10:980:12 | Fst | | main.rs:981:22:981:25 | SelfParam | Snd | main.rs:980:15:980:17 | Snd | -| main.rs:981:35:988:9 | { ... } | | main.rs:980:15:980:17 | Snd | | main.rs:982:19:982:22 | self | | main.rs:972:5:978:5 | PairOption | | main.rs:982:19:982:22 | self | Fst | main.rs:980:10:980:12 | Fst | | main.rs:982:19:982:22 | self | Snd | main.rs:980:15:980:17 | Snd | -| main.rs:983:43:983:82 | MacroExpr | | file://:0:0:0:0 | ! | | main.rs:983:50:983:81 | "PairNone has no second elemen... | | {EXTERNAL LOCATION} | & | | main.rs:983:50:983:81 | "PairNone has no second elemen... | TRef | {EXTERNAL LOCATION} | str | -| main.rs:983:50:983:81 | ...::panic_fmt(...) | | file://:0:0:0:0 | ! | +| main.rs:983:50:983:81 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:983:50:983:81 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:984:43:984:81 | MacroExpr | | file://:0:0:0:0 | ! | | main.rs:984:50:984:80 | "PairFst has no second element... | | {EXTERNAL LOCATION} | & | | main.rs:984:50:984:80 | "PairFst has no second element... | TRef | {EXTERNAL LOCATION} | str | -| main.rs:984:50:984:80 | ...::panic_fmt(...) | | file://:0:0:0:0 | ! | +| main.rs:984:50:984:80 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:984:50:984:80 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1012:10:1012:10 | t | | main.rs:972:5:978:5 | PairOption | | main.rs:1012:10:1012:10 | t | Fst | main.rs:994:5:995:14 | S2 | @@ -2144,17 +2077,19 @@ inferCertainType | main.rs:1013:17:1013:17 | t | Snd | main.rs:972:5:978:5 | PairOption | | main.rs:1013:17:1013:17 | t | Snd.Fst | main.rs:994:5:995:14 | S2 | | main.rs:1013:17:1013:17 | t | Snd.Snd | main.rs:997:5:998:14 | S3 | +| main.rs:1014:9:1014:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1014:18:1014:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1014:18:1014:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1014:18:1014:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1014:18:1014:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1014:18:1014:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1025:16:1045:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1027:13:1027:14 | p1 | | main.rs:972:5:978:5 | PairOption | | main.rs:1027:13:1027:14 | p1 | Fst | main.rs:991:5:992:14 | S1 | | main.rs:1027:13:1027:14 | p1 | Snd | main.rs:994:5:995:14 | S2 | +| main.rs:1028:9:1028:28 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1028:18:1028:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1028:18:1028:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1028:18:1028:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1028:18:1028:27 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1028:18:1028:27 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1028:26:1028:27 | p1 | | main.rs:972:5:978:5 | PairOption | | main.rs:1028:26:1028:27 | p1 | Fst | main.rs:991:5:992:14 | S1 | @@ -2162,32 +2097,34 @@ inferCertainType | main.rs:1031:13:1031:14 | p2 | | main.rs:972:5:978:5 | PairOption | | main.rs:1031:13:1031:14 | p2 | Fst | main.rs:991:5:992:14 | S1 | | main.rs:1031:13:1031:14 | p2 | Snd | main.rs:994:5:995:14 | S2 | +| main.rs:1032:9:1032:28 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1032:18:1032:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1032:18:1032:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1032:18:1032:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1032:18:1032:27 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1032:18:1032:27 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1032:26:1032:27 | p2 | | main.rs:972:5:978:5 | PairOption | | main.rs:1032:26:1032:27 | p2 | Fst | main.rs:991:5:992:14 | S1 | | main.rs:1032:26:1032:27 | p2 | Snd | main.rs:994:5:995:14 | S2 | | main.rs:1035:13:1035:14 | p3 | | main.rs:972:5:978:5 | PairOption | | main.rs:1035:13:1035:14 | p3 | Fst | main.rs:994:5:995:14 | S2 | +| main.rs:1036:9:1036:28 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1036:18:1036:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1036:18:1036:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1036:18:1036:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1036:18:1036:27 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1036:18:1036:27 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1036:26:1036:27 | p3 | | main.rs:972:5:978:5 | PairOption | | main.rs:1036:26:1036:27 | p3 | Fst | main.rs:994:5:995:14 | S2 | | main.rs:1039:13:1039:14 | p3 | | main.rs:972:5:978:5 | PairOption | | main.rs:1039:13:1039:14 | p3 | Fst | main.rs:994:5:995:14 | S2 | | main.rs:1039:13:1039:14 | p3 | Snd | main.rs:997:5:998:14 | S3 | +| main.rs:1040:9:1040:28 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1040:18:1040:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1040:18:1040:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1040:18:1040:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1040:18:1040:27 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1040:18:1040:27 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1040:26:1040:27 | p3 | | main.rs:972:5:978:5 | PairOption | | main.rs:1040:26:1040:27 | p3 | Fst | main.rs:994:5:995:14 | S2 | | main.rs:1040:26:1040:27 | p3 | Snd | main.rs:997:5:998:14 | S3 | -| main.rs:1042:9:1042:55 | g(...) | | {EXTERNAL LOCATION} | () | | main.rs:1044:13:1044:13 | x | | {EXTERNAL LOCATION} | Result | | main.rs:1044:13:1044:13 | x | E | main.rs:991:5:992:14 | S1 | | main.rs:1044:13:1044:13 | x | T | main.rs:1017:5:1017:34 | S4 | @@ -2209,90 +2146,72 @@ inferCertainType | main.rs:1066:16:1066:24 | SelfParam | TRefMut.T | main.rs:1064:10:1064:10 | T | | main.rs:1066:27:1066:31 | value | | main.rs:1064:10:1064:10 | T | | main.rs:1066:37:1066:38 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:1070:26:1072:9 | { ... } | | main.rs:1049:5:1053:5 | MyOption | -| main.rs:1070:26:1072:9 | { ... } | T | main.rs:1069:10:1069:10 | T | | main.rs:1076:20:1076:23 | SelfParam | | main.rs:1049:5:1053:5 | MyOption | | main.rs:1076:20:1076:23 | SelfParam | T | main.rs:1049:5:1053:5 | MyOption | | main.rs:1076:20:1076:23 | SelfParam | T.T | main.rs:1075:10:1075:10 | T | -| main.rs:1076:41:1081:9 | { ... } | | main.rs:1049:5:1053:5 | MyOption | -| main.rs:1076:41:1081:9 | { ... } | T | main.rs:1075:10:1075:10 | T | | main.rs:1077:19:1077:22 | self | | main.rs:1049:5:1053:5 | MyOption | | main.rs:1077:19:1077:22 | self | T | main.rs:1049:5:1053:5 | MyOption | | main.rs:1077:19:1077:22 | self | T.T | main.rs:1075:10:1075:10 | T | | main.rs:1087:16:1132:5 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:1088:13:1088:14 | x1 | | main.rs:1049:5:1053:5 | MyOption | -| main.rs:1088:13:1088:14 | x1 | T | main.rs:1084:5:1085:13 | S | -| main.rs:1088:18:1088:37 | ...::new(...) | | main.rs:1049:5:1053:5 | MyOption | -| main.rs:1088:18:1088:37 | ...::new(...) | T | main.rs:1084:5:1085:13 | S | +| main.rs:1089:9:1089:28 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1089:18:1089:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1089:18:1089:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1089:18:1089:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | main.rs:1089:18:1089:27 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:1089:26:1089:27 | x1 | | main.rs:1049:5:1053:5 | MyOption | -| main.rs:1089:26:1089:27 | x1 | T | main.rs:1084:5:1085:13 | S | -| main.rs:1091:17:1091:18 | x2 | | main.rs:1049:5:1053:5 | MyOption | -| main.rs:1091:22:1091:36 | ...::new(...) | | main.rs:1049:5:1053:5 | MyOption | -| main.rs:1092:9:1092:10 | x2 | | main.rs:1049:5:1053:5 | MyOption | +| main.rs:1089:18:1089:27 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1093:9:1093:28 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1093:18:1093:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1093:18:1093:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1093:18:1093:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | main.rs:1093:18:1093:27 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:1093:26:1093:27 | x2 | | main.rs:1049:5:1053:5 | MyOption | -| main.rs:1095:17:1095:18 | x3 | | main.rs:1049:5:1053:5 | MyOption | -| main.rs:1095:22:1095:36 | ...::new(...) | | main.rs:1049:5:1053:5 | MyOption | -| main.rs:1096:9:1096:10 | x3 | | main.rs:1049:5:1053:5 | MyOption | +| main.rs:1093:18:1093:27 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1097:9:1097:28 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1097:18:1097:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1097:18:1097:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1097:18:1097:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | main.rs:1097:18:1097:27 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:1097:26:1097:27 | x3 | | main.rs:1049:5:1053:5 | MyOption | -| main.rs:1099:17:1099:18 | x4 | | main.rs:1049:5:1053:5 | MyOption | -| main.rs:1099:22:1099:36 | ...::new(...) | | main.rs:1049:5:1053:5 | MyOption | -| main.rs:1100:9:1100:33 | ...::set(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1097:18:1097:27 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1100:23:1100:29 | &mut x4 | | {EXTERNAL LOCATION} | &mut | -| main.rs:1100:28:1100:29 | x4 | | main.rs:1049:5:1053:5 | MyOption | +| main.rs:1101:9:1101:28 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1101:18:1101:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1101:18:1101:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1101:18:1101:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | main.rs:1101:18:1101:27 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:1101:26:1101:27 | x4 | | main.rs:1049:5:1053:5 | MyOption | +| main.rs:1101:18:1101:27 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1104:9:1104:38 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1104:18:1104:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1104:18:1104:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1104:18:1104:37 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | main.rs:1104:18:1104:37 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1104:18:1104:37 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1107:9:1107:62 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1107:18:1107:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1107:18:1107:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1107:18:1107:61 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | main.rs:1107:18:1107:61 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:1107:26:1107:61 | ...::flatten(...) | | main.rs:1049:5:1053:5 | MyOption | -| main.rs:1107:26:1107:61 | ...::flatten(...) | T | main.rs:1084:5:1085:13 | S | +| main.rs:1107:18:1107:61 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1115:9:1115:33 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1115:18:1115:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1115:18:1115:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1115:18:1115:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1115:18:1115:32 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1115:18:1115:32 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1119:13:1119:16 | true | | {EXTERNAL LOCATION} | bool | | main.rs:1120:13:1120:17 | false | | {EXTERNAL LOCATION} | bool | +| main.rs:1122:9:1122:36 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1122:18:1122:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1122:18:1122:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1122:18:1122:35 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1122:18:1122:35 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1122:18:1122:35 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1125:30:1130:9 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1126:13:1128:13 | if ... {...} | | {EXTERNAL LOCATION} | () | | main.rs:1126:22:1128:13 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1131:9:1131:35 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1131:18:1131:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1131:18:1131:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1131:18:1131:34 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1131:18:1131:34 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1131:18:1131:34 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1149:15:1149:18 | SelfParam | | main.rs:1137:5:1138:19 | S | | main.rs:1149:15:1149:18 | SelfParam | T | main.rs:1148:10:1148:10 | T | -| main.rs:1149:26:1151:9 | { ... } | | main.rs:1148:10:1148:10 | T | | main.rs:1150:13:1150:16 | self | | main.rs:1137:5:1138:19 | S | | main.rs:1150:13:1150:16 | self | T | main.rs:1148:10:1148:10 | T | | main.rs:1153:15:1153:19 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:1153:15:1153:19 | SelfParam | TRef | main.rs:1137:5:1138:19 | S | | main.rs:1153:15:1153:19 | SelfParam | TRef.T | main.rs:1148:10:1148:10 | T | | main.rs:1153:28:1155:9 | { ... } | | {EXTERNAL LOCATION} | & | -| main.rs:1153:28:1155:9 | { ... } | TRef | main.rs:1148:10:1148:10 | T | | main.rs:1154:13:1154:19 | &... | | {EXTERNAL LOCATION} | & | | main.rs:1154:14:1154:17 | self | | {EXTERNAL LOCATION} | & | | main.rs:1154:14:1154:17 | self | TRef | main.rs:1137:5:1138:19 | S | @@ -2301,7 +2220,6 @@ inferCertainType | main.rs:1157:15:1157:25 | SelfParam | TRef | main.rs:1137:5:1138:19 | S | | main.rs:1157:15:1157:25 | SelfParam | TRef.T | main.rs:1148:10:1148:10 | T | | main.rs:1157:34:1159:9 | { ... } | | {EXTERNAL LOCATION} | & | -| main.rs:1157:34:1159:9 | { ... } | TRef | main.rs:1148:10:1148:10 | T | | main.rs:1158:13:1158:19 | &... | | {EXTERNAL LOCATION} | & | | main.rs:1158:14:1158:17 | self | | {EXTERNAL LOCATION} | & | | main.rs:1158:14:1158:17 | self | TRef | main.rs:1137:5:1138:19 | S | @@ -2312,104 +2230,115 @@ inferCertainType | main.rs:1170:29:1170:33 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:1170:29:1170:33 | SelfParam | TRef | {EXTERNAL LOCATION} | & | | main.rs:1170:29:1170:33 | SelfParam | TRef.TRef | main.rs:1143:5:1146:5 | MyInt | -| main.rs:1170:43:1172:9 | { ... } | | {EXTERNAL LOCATION} | i64 | | main.rs:1171:17:1171:20 | self | | {EXTERNAL LOCATION} | & | | main.rs:1171:17:1171:20 | self | TRef | {EXTERNAL LOCATION} | & | | main.rs:1171:17:1171:20 | self | TRef.TRef | main.rs:1143:5:1146:5 | MyInt | | main.rs:1175:33:1175:36 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:1175:33:1175:36 | SelfParam | TRef | main.rs:1143:5:1146:5 | MyInt | -| main.rs:1175:46:1177:9 | { ... } | | {EXTERNAL LOCATION} | i64 | | main.rs:1176:15:1176:18 | self | | {EXTERNAL LOCATION} | & | | main.rs:1176:15:1176:18 | self | TRef | main.rs:1143:5:1146:5 | MyInt | | main.rs:1180:16:1230:5 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1182:9:1182:33 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1182:18:1182:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1182:18:1182:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1182:18:1182:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | main.rs:1182:18:1182:32 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1182:18:1182:32 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1186:9:1186:33 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1186:18:1186:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1186:18:1186:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1186:18:1186:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | main.rs:1186:18:1186:32 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1186:18:1186:32 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1187:9:1187:33 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1187:18:1187:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1187:18:1187:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1187:18:1187:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | main.rs:1187:18:1187:32 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1187:18:1187:32 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1191:9:1191:42 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1191:18:1191:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1191:18:1191:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1191:18:1191:41 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | main.rs:1191:18:1191:41 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:1191:26:1191:41 | ...::m2(...) | | {EXTERNAL LOCATION} | & | -| main.rs:1191:26:1191:41 | ...::m2(...) | TRef | main.rs:1140:5:1141:14 | S2 | +| main.rs:1191:18:1191:41 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1191:38:1191:40 | &x3 | | {EXTERNAL LOCATION} | & | +| main.rs:1192:9:1192:42 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1192:18:1192:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1192:18:1192:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1192:18:1192:41 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | main.rs:1192:18:1192:41 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:1192:26:1192:41 | ...::m3(...) | | {EXTERNAL LOCATION} | & | -| main.rs:1192:26:1192:41 | ...::m3(...) | TRef | main.rs:1140:5:1141:14 | S2 | +| main.rs:1192:18:1192:41 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1192:38:1192:40 | &x3 | | {EXTERNAL LOCATION} | & | | main.rs:1194:13:1194:14 | x4 | | {EXTERNAL LOCATION} | & | | main.rs:1194:18:1194:23 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1196:9:1196:33 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1196:18:1196:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1196:18:1196:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1196:18:1196:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1196:18:1196:32 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1196:18:1196:32 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1196:26:1196:27 | x4 | | {EXTERNAL LOCATION} | & | +| main.rs:1197:9:1197:33 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1197:18:1197:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1197:18:1197:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1197:18:1197:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1197:18:1197:32 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1197:18:1197:32 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1197:26:1197:27 | x4 | | {EXTERNAL LOCATION} | & | | main.rs:1199:13:1199:14 | x5 | | {EXTERNAL LOCATION} | & | | main.rs:1199:18:1199:23 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1201:9:1201:33 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1201:18:1201:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1201:18:1201:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1201:18:1201:32 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1201:18:1201:32 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1201:18:1201:32 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1201:26:1201:27 | x5 | | {EXTERNAL LOCATION} | & | +| main.rs:1202:9:1202:30 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1202:18:1202:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1202:18:1202:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1202:18:1202:29 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1202:18:1202:29 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1202:18:1202:29 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1202:26:1202:27 | x5 | | {EXTERNAL LOCATION} | & | | main.rs:1204:13:1204:14 | x6 | | {EXTERNAL LOCATION} | & | | main.rs:1204:18:1204:23 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1207:9:1207:36 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1207:18:1207:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1207:18:1207:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1207:18:1207:35 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1207:18:1207:35 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1207:18:1207:35 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1207:28:1207:29 | x6 | | {EXTERNAL LOCATION} | & | | main.rs:1209:20:1209:22 | &S2 | | {EXTERNAL LOCATION} | & | +| main.rs:1213:9:1213:28 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1213:18:1213:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1213:18:1213:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1213:18:1213:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1213:18:1213:27 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1213:18:1213:27 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1215:13:1215:14 | x9 | | {EXTERNAL LOCATION} | String | | main.rs:1215:26:1215:32 | "Hello" | | {EXTERNAL LOCATION} | & | | main.rs:1215:26:1215:32 | "Hello" | TRef | {EXTERNAL LOCATION} | str | | main.rs:1219:17:1219:18 | x9 | | {EXTERNAL LOCATION} | String | | main.rs:1221:13:1221:20 | my_thing | | {EXTERNAL LOCATION} | & | +| main.rs:1221:13:1221:20 | my_thing | TRef | main.rs:1143:5:1146:5 | MyInt | | main.rs:1221:24:1221:39 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1221:24:1221:39 | &... | TRef | main.rs:1143:5:1146:5 | MyInt | | main.rs:1221:25:1221:39 | MyInt {...} | | main.rs:1143:5:1146:5 | MyInt | | main.rs:1223:17:1223:24 | my_thing | | {EXTERNAL LOCATION} | & | +| main.rs:1223:17:1223:24 | my_thing | TRef | main.rs:1143:5:1146:5 | MyInt | +| main.rs:1224:9:1224:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1224:18:1224:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1224:18:1224:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1224:18:1224:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1224:18:1224:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1224:18:1224:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1227:13:1227:20 | my_thing | | {EXTERNAL LOCATION} | & | +| main.rs:1227:13:1227:20 | my_thing | TRef | main.rs:1143:5:1146:5 | MyInt | | main.rs:1227:24:1227:39 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1227:24:1227:39 | &... | TRef | main.rs:1143:5:1146:5 | MyInt | | main.rs:1227:25:1227:39 | MyInt {...} | | main.rs:1143:5:1146:5 | MyInt | | main.rs:1228:17:1228:24 | my_thing | | {EXTERNAL LOCATION} | & | +| main.rs:1228:17:1228:24 | my_thing | TRef | main.rs:1143:5:1146:5 | MyInt | +| main.rs:1229:9:1229:27 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1229:18:1229:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1229:18:1229:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1229:18:1229:26 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1229:18:1229:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1229:18:1229:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1236:16:1236:20 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:1236:16:1236:20 | SelfParam | TRef | main.rs:1234:5:1242:5 | Self [trait MyTrait] | | main.rs:1239:16:1239:20 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:1239:16:1239:20 | SelfParam | TRef | main.rs:1234:5:1242:5 | Self [trait MyTrait] | -| main.rs:1239:32:1241:9 | { ... } | | {EXTERNAL LOCATION} | & | -| main.rs:1239:32:1241:9 | { ... } | TRef | main.rs:1234:5:1242:5 | Self [trait MyTrait] | | main.rs:1240:13:1240:16 | self | | {EXTERNAL LOCATION} | & | | main.rs:1240:13:1240:16 | self | TRef | main.rs:1234:5:1242:5 | Self [trait MyTrait] | | main.rs:1248:16:1248:20 | SelfParam | | {EXTERNAL LOCATION} | & | @@ -2442,30 +2371,56 @@ inferCertainType | main.rs:1270:13:1270:16 | self | TRef.T | main.rs:1264:10:1264:10 | T | | main.rs:1274:16:1280:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1279:15:1279:17 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1279:15:1279:17 | &... | TRef | {EXTERNAL LOCATION} | & | | main.rs:1279:16:1279:17 | &x | | {EXTERNAL LOCATION} | & | | main.rs:1290:17:1290:25 | SelfParam | | {EXTERNAL LOCATION} | &mut | | main.rs:1290:17:1290:25 | SelfParam | TRefMut | main.rs:1284:5:1287:5 | MyFlag | | main.rs:1290:28:1292:9 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1291:13:1291:16 | self | | {EXTERNAL LOCATION} | &mut | | main.rs:1291:13:1291:16 | self | TRefMut | main.rs:1284:5:1287:5 | MyFlag | +| main.rs:1291:13:1291:34 | ... = ... | | {EXTERNAL LOCATION} | () | | main.rs:1291:26:1291:29 | self | | {EXTERNAL LOCATION} | &mut | | main.rs:1291:26:1291:29 | self | TRefMut | main.rs:1284:5:1287:5 | MyFlag | | main.rs:1298:15:1298:19 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:1298:15:1298:19 | SelfParam | TRef | main.rs:1295:5:1295:13 | S | | main.rs:1298:31:1300:9 | { ... } | | {EXTERNAL LOCATION} | & | -| main.rs:1298:31:1300:9 | { ... } | TRef | main.rs:1295:5:1295:13 | S | +| main.rs:1298:31:1300:9 | { ... } | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1298:31:1300:9 | { ... } | TRef.TRef | {EXTERNAL LOCATION} | & | +| main.rs:1298:31:1300:9 | { ... } | TRef.TRef.TRef | {EXTERNAL LOCATION} | & | +| main.rs:1298:31:1300:9 | { ... } | TRef.TRef.TRef.TRef | main.rs:1295:5:1295:13 | S | | main.rs:1299:13:1299:19 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1299:13:1299:19 | &... | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1299:13:1299:19 | &... | TRef.TRef | {EXTERNAL LOCATION} | & | +| main.rs:1299:13:1299:19 | &... | TRef.TRef.TRef | {EXTERNAL LOCATION} | & | +| main.rs:1299:13:1299:19 | &... | TRef.TRef.TRef.TRef | main.rs:1295:5:1295:13 | S | | main.rs:1299:14:1299:19 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1299:14:1299:19 | &... | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1299:14:1299:19 | &... | TRef.TRef | {EXTERNAL LOCATION} | & | +| main.rs:1299:14:1299:19 | &... | TRef.TRef.TRef | main.rs:1295:5:1295:13 | S | | main.rs:1299:15:1299:19 | &self | | {EXTERNAL LOCATION} | & | -| main.rs:1299:16:1299:19 | self | | {EXTERNAL LOCATION} | & | +| main.rs:1299:15:1299:19 | &self | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1299:15:1299:19 | &self | TRef.TRef | main.rs:1295:5:1295:13 | S | +| main.rs:1299:16:1299:19 | self | | {EXTERNAL LOCATION} | & | | main.rs:1299:16:1299:19 | self | TRef | main.rs:1295:5:1295:13 | S | | main.rs:1302:15:1302:25 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:1302:15:1302:25 | SelfParam | TRef | main.rs:1295:5:1295:13 | S | | main.rs:1302:37:1304:9 | { ... } | | {EXTERNAL LOCATION} | & | -| main.rs:1302:37:1304:9 | { ... } | TRef | main.rs:1295:5:1295:13 | S | +| main.rs:1302:37:1304:9 | { ... } | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1302:37:1304:9 | { ... } | TRef.TRef | {EXTERNAL LOCATION} | & | +| main.rs:1302:37:1304:9 | { ... } | TRef.TRef.TRef | {EXTERNAL LOCATION} | & | +| main.rs:1302:37:1304:9 | { ... } | TRef.TRef.TRef.TRef | main.rs:1295:5:1295:13 | S | | main.rs:1303:13:1303:19 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1303:13:1303:19 | &... | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1303:13:1303:19 | &... | TRef.TRef | {EXTERNAL LOCATION} | & | +| main.rs:1303:13:1303:19 | &... | TRef.TRef.TRef | {EXTERNAL LOCATION} | & | +| main.rs:1303:13:1303:19 | &... | TRef.TRef.TRef.TRef | main.rs:1295:5:1295:13 | S | | main.rs:1303:14:1303:19 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1303:14:1303:19 | &... | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1303:14:1303:19 | &... | TRef.TRef | {EXTERNAL LOCATION} | & | +| main.rs:1303:14:1303:19 | &... | TRef.TRef.TRef | main.rs:1295:5:1295:13 | S | | main.rs:1303:15:1303:19 | &self | | {EXTERNAL LOCATION} | & | +| main.rs:1303:15:1303:19 | &self | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1303:15:1303:19 | &self | TRef.TRef | main.rs:1295:5:1295:13 | S | | main.rs:1303:16:1303:19 | self | | {EXTERNAL LOCATION} | & | | main.rs:1303:16:1303:19 | self | TRef | main.rs:1295:5:1295:13 | S | | main.rs:1306:15:1306:15 | x | | {EXTERNAL LOCATION} | & | @@ -2477,10 +2432,22 @@ inferCertainType | main.rs:1310:15:1310:15 | x | | {EXTERNAL LOCATION} | & | | main.rs:1310:15:1310:15 | x | TRef | main.rs:1295:5:1295:13 | S | | main.rs:1310:34:1312:9 | { ... } | | {EXTERNAL LOCATION} | & | -| main.rs:1310:34:1312:9 | { ... } | TRef | main.rs:1295:5:1295:13 | S | +| main.rs:1310:34:1312:9 | { ... } | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1310:34:1312:9 | { ... } | TRef.TRef | {EXTERNAL LOCATION} | & | +| main.rs:1310:34:1312:9 | { ... } | TRef.TRef.TRef | {EXTERNAL LOCATION} | & | +| main.rs:1310:34:1312:9 | { ... } | TRef.TRef.TRef.TRef | main.rs:1295:5:1295:13 | S | | main.rs:1311:13:1311:16 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1311:13:1311:16 | &... | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1311:13:1311:16 | &... | TRef.TRef | {EXTERNAL LOCATION} | & | +| main.rs:1311:13:1311:16 | &... | TRef.TRef.TRef | {EXTERNAL LOCATION} | & | +| main.rs:1311:13:1311:16 | &... | TRef.TRef.TRef.TRef | main.rs:1295:5:1295:13 | S | | main.rs:1311:14:1311:16 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1311:14:1311:16 | &... | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1311:14:1311:16 | &... | TRef.TRef | {EXTERNAL LOCATION} | & | +| main.rs:1311:14:1311:16 | &... | TRef.TRef.TRef | main.rs:1295:5:1295:13 | S | | main.rs:1311:15:1311:16 | &x | | {EXTERNAL LOCATION} | & | +| main.rs:1311:15:1311:16 | &x | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1311:15:1311:16 | &x | TRef.TRef | main.rs:1295:5:1295:13 | S | | main.rs:1311:16:1311:16 | x | | {EXTERNAL LOCATION} | & | | main.rs:1311:16:1311:16 | x | TRef | main.rs:1295:5:1295:13 | S | | main.rs:1315:16:1328:5 | { ... } | | {EXTERNAL LOCATION} | () | @@ -2488,78 +2455,64 @@ inferCertainType | main.rs:1316:17:1316:20 | S {...} | | main.rs:1295:5:1295:13 | S | | main.rs:1317:9:1317:9 | x | | main.rs:1295:5:1295:13 | S | | main.rs:1318:9:1318:9 | x | | main.rs:1295:5:1295:13 | S | -| main.rs:1319:9:1319:17 | ...::f3(...) | | {EXTERNAL LOCATION} | & | -| main.rs:1319:9:1319:17 | ...::f3(...) | TRef | main.rs:1295:5:1295:13 | S | | main.rs:1319:15:1319:16 | &x | | {EXTERNAL LOCATION} | & | +| main.rs:1319:15:1319:16 | &x | TRef | main.rs:1295:5:1295:13 | S | | main.rs:1319:16:1319:16 | x | | main.rs:1295:5:1295:13 | S | | main.rs:1321:19:1321:24 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1321:19:1321:24 | &... | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1321:19:1321:24 | &... | TRef.TRef | {EXTERNAL LOCATION} | bool | | main.rs:1321:20:1321:24 | &true | | {EXTERNAL LOCATION} | & | +| main.rs:1321:20:1321:24 | &true | TRef | {EXTERNAL LOCATION} | bool | | main.rs:1321:21:1321:24 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:1326:9:1326:31 | ...::flip(...) | | {EXTERNAL LOCATION} | () | | main.rs:1326:22:1326:30 | &mut flag | | {EXTERNAL LOCATION} | &mut | +| main.rs:1327:9:1327:30 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1327:18:1327:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1327:18:1327:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1327:18:1327:29 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | main.rs:1327:18:1327:29 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:1342:43:1345:5 | { ... } | | {EXTERNAL LOCATION} | Result | -| main.rs:1342:43:1345:5 | { ... } | E | main.rs:1334:5:1335:14 | S1 | -| main.rs:1342:43:1345:5 | { ... } | T | main.rs:1334:5:1335:14 | S1 | -| main.rs:1349:46:1353:5 | { ... } | | {EXTERNAL LOCATION} | Result | -| main.rs:1349:46:1353:5 | { ... } | E | main.rs:1337:5:1338:14 | S2 | -| main.rs:1349:46:1353:5 | { ... } | T | main.rs:1334:5:1335:14 | S1 | -| main.rs:1357:40:1362:5 | { ... } | | {EXTERNAL LOCATION} | Result | -| main.rs:1357:40:1362:5 | { ... } | E | main.rs:1337:5:1338:14 | S2 | -| main.rs:1357:40:1362:5 | { ... } | T | main.rs:1334:5:1335:14 | S1 | +| main.rs:1327:18:1327:29 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1360:24:1360:28 | \|...\| s | | {EXTERNAL LOCATION} | dyn Fn | +| main.rs:1360:24:1360:28 | \|...\| s | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | main.rs:1366:30:1366:34 | input | | {EXTERNAL LOCATION} | Result | | main.rs:1366:30:1366:34 | input | E | main.rs:1334:5:1335:14 | S1 | | main.rs:1366:30:1366:34 | input | T | main.rs:1366:20:1366:27 | T | -| main.rs:1366:69:1373:5 | { ... } | | {EXTERNAL LOCATION} | Result | -| main.rs:1366:69:1373:5 | { ... } | E | main.rs:1334:5:1335:14 | S1 | -| main.rs:1366:69:1373:5 | { ... } | T | main.rs:1366:20:1366:27 | T | | main.rs:1367:21:1367:25 | input | | {EXTERNAL LOCATION} | Result | | main.rs:1367:21:1367:25 | input | E | main.rs:1334:5:1335:14 | S1 | | main.rs:1367:21:1367:25 | input | T | main.rs:1366:20:1366:27 | T | | main.rs:1368:49:1371:9 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | +| main.rs:1368:49:1371:9 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| main.rs:1369:13:1369:31 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1369:22:1369:27 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1369:22:1369:27 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1369:22:1369:30 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1369:22:1369:30 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1369:22:1369:30 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1376:16:1392:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1377:9:1379:9 | if ... {...} | | {EXTERNAL LOCATION} | () | -| main.rs:1377:37:1377:52 | try_same_error(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1377:37:1377:52 | try_same_error(...) | E | main.rs:1334:5:1335:14 | S1 | -| main.rs:1377:37:1377:52 | try_same_error(...) | T | main.rs:1334:5:1335:14 | S1 | | main.rs:1377:54:1379:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1378:13:1378:36 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1378:22:1378:27 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1378:22:1378:27 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1378:22:1378:35 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1378:22:1378:35 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1378:22:1378:35 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1381:9:1383:9 | if ... {...} | | {EXTERNAL LOCATION} | () | -| main.rs:1381:37:1381:55 | try_convert_error(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1381:37:1381:55 | try_convert_error(...) | E | main.rs:1337:5:1338:14 | S2 | -| main.rs:1381:37:1381:55 | try_convert_error(...) | T | main.rs:1334:5:1335:14 | S1 | | main.rs:1381:57:1383:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1382:13:1382:36 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1382:22:1382:27 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1382:22:1382:27 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1382:22:1382:35 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1382:22:1382:35 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1382:22:1382:35 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1385:9:1387:9 | if ... {...} | | {EXTERNAL LOCATION} | () | -| main.rs:1385:37:1385:49 | try_chained(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1385:37:1385:49 | try_chained(...) | E | main.rs:1337:5:1338:14 | S2 | -| main.rs:1385:37:1385:49 | try_chained(...) | T | main.rs:1334:5:1335:14 | S1 | | main.rs:1385:51:1387:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1386:13:1386:36 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1386:22:1386:27 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1386:22:1386:27 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1386:22:1386:35 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1386:22:1386:35 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1386:22:1386:35 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1389:9:1391:9 | if ... {...} | | {EXTERNAL LOCATION} | () | -| main.rs:1389:37:1389:63 | try_complex(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:1389:37:1389:63 | try_complex(...) | E | main.rs:1334:5:1335:14 | S1 | | main.rs:1389:65:1391:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1390:13:1390:36 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:1390:22:1390:27 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:1390:22:1390:27 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:1390:22:1390:35 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:1390:22:1390:35 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1390:22:1390:35 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1396:16:1487:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1397:13:1397:13 | x | | {EXTERNAL LOCATION} | i32 | @@ -2582,103 +2535,78 @@ inferCertainType | main.rs:1414:26:1414:30 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:1414:26:1414:30 | SelfParam | TRef | {EXTERNAL LOCATION} | [;] | | main.rs:1414:26:1414:30 | SelfParam | TRef.TArray | main.rs:1413:14:1413:23 | T | -| main.rs:1414:39:1416:13 | { ... } | | {EXTERNAL LOCATION} | & | -| main.rs:1414:39:1416:13 | { ... } | TRef | main.rs:1413:14:1413:23 | T | | main.rs:1415:17:1415:20 | self | | {EXTERNAL LOCATION} | & | | main.rs:1415:17:1415:20 | self | TRef | {EXTERNAL LOCATION} | [;] | | main.rs:1415:17:1415:20 | self | TRef.TArray | main.rs:1413:14:1413:23 | T | -| main.rs:1418:31:1420:13 | { ... } | | main.rs:1413:14:1413:23 | T | | main.rs:1423:17:1423:25 | [...] | | {EXTERNAL LOCATION} | [;] | -| main.rs:1424:13:1424:13 | x | | {EXTERNAL LOCATION} | & | -| main.rs:1424:17:1424:47 | ...::my_method(...) | | {EXTERNAL LOCATION} | & | | main.rs:1424:37:1424:46 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1424:37:1424:46 | &... | TRef | {EXTERNAL LOCATION} | [;] | | main.rs:1424:38:1424:46 | [...] | | {EXTERNAL LOCATION} | [;] | -| main.rs:1425:13:1425:13 | x | | {EXTERNAL LOCATION} | i32 | -| main.rs:1425:17:1425:37 | ...::my_func(...) | | {EXTERNAL LOCATION} | i32 | | main.rs:1428:26:1428:30 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:1428:26:1428:30 | SelfParam | TRef | {EXTERNAL LOCATION} | [] | | main.rs:1428:26:1428:30 | SelfParam | TRef.TSlice | main.rs:1427:14:1427:23 | T | -| main.rs:1428:39:1430:13 | { ... } | | {EXTERNAL LOCATION} | & | -| main.rs:1428:39:1430:13 | { ... } | TRef | main.rs:1427:14:1427:23 | T | | main.rs:1429:17:1429:20 | self | | {EXTERNAL LOCATION} | & | | main.rs:1429:17:1429:20 | self | TRef | {EXTERNAL LOCATION} | [] | | main.rs:1429:17:1429:20 | self | TRef.TSlice | main.rs:1427:14:1427:23 | T | -| main.rs:1432:31:1434:13 | { ... } | | main.rs:1427:14:1427:23 | T | | main.rs:1437:13:1437:13 | s | | {EXTERNAL LOCATION} | & | | main.rs:1437:13:1437:13 | s | TRef | {EXTERNAL LOCATION} | [] | | main.rs:1437:13:1437:13 | s | TRef.TSlice | {EXTERNAL LOCATION} | i32 | | main.rs:1437:25:1437:34 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:1437:25:1437:34 | &... | TRef | {EXTERNAL LOCATION} | [;] | | main.rs:1437:26:1437:34 | [...] | | {EXTERNAL LOCATION} | [;] | | main.rs:1438:17:1438:17 | s | | {EXTERNAL LOCATION} | & | | main.rs:1438:17:1438:17 | s | TRef | {EXTERNAL LOCATION} | [] | | main.rs:1438:17:1438:17 | s | TRef.TSlice | {EXTERNAL LOCATION} | i32 | -| main.rs:1439:13:1439:13 | x | | {EXTERNAL LOCATION} | & | -| main.rs:1439:17:1439:35 | ...::my_method(...) | | {EXTERNAL LOCATION} | & | | main.rs:1439:34:1439:34 | s | | {EXTERNAL LOCATION} | & | | main.rs:1439:34:1439:34 | s | TRef | {EXTERNAL LOCATION} | [] | | main.rs:1439:34:1439:34 | s | TRef.TSlice | {EXTERNAL LOCATION} | i32 | -| main.rs:1440:13:1440:13 | x | | {EXTERNAL LOCATION} | i32 | -| main.rs:1440:17:1440:34 | ...::my_func(...) | | {EXTERNAL LOCATION} | i32 | | main.rs:1443:26:1443:30 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:1443:26:1443:30 | SelfParam | TRef | {EXTERNAL LOCATION} | (T_2) | | main.rs:1443:26:1443:30 | SelfParam | TRef.T0 | main.rs:1442:14:1442:23 | T | | main.rs:1443:26:1443:30 | SelfParam | TRef.T1 | {EXTERNAL LOCATION} | i32 | | main.rs:1443:39:1445:13 | { ... } | | {EXTERNAL LOCATION} | & | -| main.rs:1443:39:1445:13 | { ... } | TRef | main.rs:1442:14:1442:23 | T | | main.rs:1444:17:1444:23 | &... | | {EXTERNAL LOCATION} | & | | main.rs:1444:18:1444:21 | self | | {EXTERNAL LOCATION} | & | | main.rs:1444:18:1444:21 | self | TRef | {EXTERNAL LOCATION} | (T_2) | | main.rs:1444:18:1444:21 | self | TRef.T0 | main.rs:1442:14:1442:23 | T | | main.rs:1444:18:1444:21 | self | TRef.T1 | {EXTERNAL LOCATION} | i32 | -| main.rs:1447:31:1449:13 | { ... } | | main.rs:1442:14:1442:23 | T | | main.rs:1452:13:1452:13 | p | | {EXTERNAL LOCATION} | (T_2) | | main.rs:1452:17:1452:23 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | | main.rs:1453:17:1453:17 | p | | {EXTERNAL LOCATION} | (T_2) | -| main.rs:1454:13:1454:13 | x | | {EXTERNAL LOCATION} | & | -| main.rs:1454:17:1454:39 | ...::my_method(...) | | {EXTERNAL LOCATION} | & | | main.rs:1454:37:1454:38 | &p | | {EXTERNAL LOCATION} | & | +| main.rs:1454:37:1454:38 | &p | TRef | {EXTERNAL LOCATION} | (T_2) | | main.rs:1454:38:1454:38 | p | | {EXTERNAL LOCATION} | (T_2) | -| main.rs:1455:13:1455:13 | x | | {EXTERNAL LOCATION} | i32 | -| main.rs:1455:17:1455:39 | ...::my_func(...) | | {EXTERNAL LOCATION} | i32 | | main.rs:1458:26:1458:30 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:1458:26:1458:30 | SelfParam | TRef | {EXTERNAL LOCATION} | & | | main.rs:1458:26:1458:30 | SelfParam | TRef.TRef | main.rs:1457:14:1457:23 | T | -| main.rs:1458:39:1460:13 | { ... } | | {EXTERNAL LOCATION} | & | -| main.rs:1458:39:1460:13 | { ... } | TRef | main.rs:1457:14:1457:23 | T | | main.rs:1459:18:1459:21 | self | | {EXTERNAL LOCATION} | & | | main.rs:1459:18:1459:21 | self | TRef | {EXTERNAL LOCATION} | & | | main.rs:1459:18:1459:21 | self | TRef.TRef | main.rs:1457:14:1457:23 | T | -| main.rs:1462:31:1464:13 | { ... } | | main.rs:1457:14:1457:23 | T | | main.rs:1467:13:1467:13 | r | | {EXTERNAL LOCATION} | & | | main.rs:1467:17:1467:19 | &42 | | {EXTERNAL LOCATION} | & | | main.rs:1468:17:1468:17 | r | | {EXTERNAL LOCATION} | & | -| main.rs:1469:13:1469:13 | x | | {EXTERNAL LOCATION} | & | -| main.rs:1469:17:1469:35 | ...::my_method(...) | | {EXTERNAL LOCATION} | & | | main.rs:1469:33:1469:34 | &r | | {EXTERNAL LOCATION} | & | +| main.rs:1469:33:1469:34 | &r | TRef | {EXTERNAL LOCATION} | & | | main.rs:1469:34:1469:34 | r | | {EXTERNAL LOCATION} | & | -| main.rs:1470:13:1470:13 | x | | {EXTERNAL LOCATION} | i32 | -| main.rs:1470:17:1470:33 | ...::my_func(...) | | {EXTERNAL LOCATION} | i32 | | main.rs:1473:26:1473:30 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:1473:26:1473:30 | SelfParam | TRef | {EXTERNAL LOCATION} | *mut | | main.rs:1473:26:1473:30 | SelfParam | TRef.TPtrMut | main.rs:1472:14:1472:23 | T | | main.rs:1473:39:1475:13 | { ... } | | {EXTERNAL LOCATION} | & | -| main.rs:1473:39:1475:13 | { ... } | TRef | main.rs:1472:14:1472:23 | T | +| main.rs:1474:17:1474:34 | { ... } | | {EXTERNAL LOCATION} | & | | main.rs:1474:26:1474:32 | &... | | {EXTERNAL LOCATION} | & | | main.rs:1474:29:1474:32 | self | | {EXTERNAL LOCATION} | & | | main.rs:1474:29:1474:32 | self | TRef | {EXTERNAL LOCATION} | *mut | | main.rs:1474:29:1474:32 | self | TRef.TPtrMut | main.rs:1472:14:1472:23 | T | -| main.rs:1477:31:1479:13 | { ... } | | main.rs:1472:14:1472:23 | T | | main.rs:1483:13:1483:13 | p | | {EXTERNAL LOCATION} | *mut | | main.rs:1483:13:1483:13 | p | TPtrMut | {EXTERNAL LOCATION} | i32 | | main.rs:1483:27:1483:32 | &mut v | | {EXTERNAL LOCATION} | &mut | | main.rs:1484:26:1484:26 | p | | {EXTERNAL LOCATION} | *mut | | main.rs:1484:26:1484:26 | p | TPtrMut | {EXTERNAL LOCATION} | i32 | -| main.rs:1485:26:1485:48 | ...::my_method(...) | | {EXTERNAL LOCATION} | & | | main.rs:1485:46:1485:47 | &p | | {EXTERNAL LOCATION} | & | +| main.rs:1485:46:1485:47 | &p | TRef | {EXTERNAL LOCATION} | *mut | +| main.rs:1485:46:1485:47 | &p | TRef.TPtrMut | {EXTERNAL LOCATION} | i32 | | main.rs:1485:47:1485:47 | p | | {EXTERNAL LOCATION} | *mut | | main.rs:1485:47:1485:47 | p | TPtrMut | {EXTERNAL LOCATION} | i32 | -| main.rs:1486:13:1486:13 | x | | {EXTERNAL LOCATION} | i32 | -| main.rs:1486:17:1486:37 | ...::my_func(...) | | {EXTERNAL LOCATION} | i32 | | main.rs:1492:16:1504:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1493:13:1493:13 | x | | {EXTERNAL LOCATION} | bool | | main.rs:1493:17:1493:20 | true | | {EXTERNAL LOCATION} | bool | @@ -2689,7 +2617,11 @@ inferCertainType | main.rs:1494:17:1494:29 | ... \|\| ... | | {EXTERNAL LOCATION} | bool | | main.rs:1494:25:1494:29 | false | | {EXTERNAL LOCATION} | bool | | main.rs:1498:17:1500:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1499:17:1499:17 | z | | {EXTERNAL LOCATION} | () | +| main.rs:1499:21:1499:27 | (...) | | {EXTERNAL LOCATION} | () | +| main.rs:1499:22:1499:26 | ... = ... | | {EXTERNAL LOCATION} | () | | main.rs:1500:16:1502:9 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:1501:13:1501:17 | ... = ... | | {EXTERNAL LOCATION} | () | | main.rs:1517:30:1519:9 | { ... } | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1518:13:1518:31 | Vec2 {...} | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1525:16:1525:19 | SelfParam | | main.rs:1510:5:1515:5 | Vec2 | @@ -2706,9 +2638,11 @@ inferCertainType | main.rs:1535:45:1538:9 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1536:13:1536:16 | self | | {EXTERNAL LOCATION} | &mut | | main.rs:1536:13:1536:16 | self | TRefMut | main.rs:1510:5:1515:5 | Vec2 | +| main.rs:1536:13:1536:27 | ... += ... | | {EXTERNAL LOCATION} | () | | main.rs:1536:23:1536:25 | rhs | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1537:13:1537:16 | self | | {EXTERNAL LOCATION} | &mut | | main.rs:1537:13:1537:16 | self | TRefMut | main.rs:1510:5:1515:5 | Vec2 | +| main.rs:1537:13:1537:27 | ... += ... | | {EXTERNAL LOCATION} | () | | main.rs:1537:23:1537:25 | rhs | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1543:16:1543:19 | SelfParam | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1543:22:1543:24 | rhs | | main.rs:1510:5:1515:5 | Vec2 | @@ -2724,9 +2658,11 @@ inferCertainType | main.rs:1553:45:1556:9 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1554:13:1554:16 | self | | {EXTERNAL LOCATION} | &mut | | main.rs:1554:13:1554:16 | self | TRefMut | main.rs:1510:5:1515:5 | Vec2 | +| main.rs:1554:13:1554:27 | ... -= ... | | {EXTERNAL LOCATION} | () | | main.rs:1554:23:1554:25 | rhs | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1555:13:1555:16 | self | | {EXTERNAL LOCATION} | &mut | | main.rs:1555:13:1555:16 | self | TRefMut | main.rs:1510:5:1515:5 | Vec2 | +| main.rs:1555:13:1555:27 | ... -= ... | | {EXTERNAL LOCATION} | () | | main.rs:1555:23:1555:25 | rhs | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1561:16:1561:19 | SelfParam | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1561:22:1561:24 | rhs | | main.rs:1510:5:1515:5 | Vec2 | @@ -2742,9 +2678,11 @@ inferCertainType | main.rs:1570:45:1573:9 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1571:13:1571:16 | self | | {EXTERNAL LOCATION} | &mut | | main.rs:1571:13:1571:16 | self | TRefMut | main.rs:1510:5:1515:5 | Vec2 | +| main.rs:1571:13:1571:27 | ... *= ... | | {EXTERNAL LOCATION} | () | | main.rs:1571:23:1571:25 | rhs | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1572:13:1572:16 | self | | {EXTERNAL LOCATION} | &mut | | main.rs:1572:13:1572:16 | self | TRefMut | main.rs:1510:5:1515:5 | Vec2 | +| main.rs:1572:13:1572:27 | ... *= ... | | {EXTERNAL LOCATION} | () | | main.rs:1572:23:1572:25 | rhs | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1578:16:1578:19 | SelfParam | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1578:22:1578:24 | rhs | | main.rs:1510:5:1515:5 | Vec2 | @@ -2760,9 +2698,11 @@ inferCertainType | main.rs:1587:45:1590:9 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1588:13:1588:16 | self | | {EXTERNAL LOCATION} | &mut | | main.rs:1588:13:1588:16 | self | TRefMut | main.rs:1510:5:1515:5 | Vec2 | +| main.rs:1588:13:1588:27 | ... /= ... | | {EXTERNAL LOCATION} | () | | main.rs:1588:23:1588:25 | rhs | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1589:13:1589:16 | self | | {EXTERNAL LOCATION} | &mut | | main.rs:1589:13:1589:16 | self | TRefMut | main.rs:1510:5:1515:5 | Vec2 | +| main.rs:1589:13:1589:27 | ... /= ... | | {EXTERNAL LOCATION} | () | | main.rs:1589:23:1589:25 | rhs | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1595:16:1595:19 | SelfParam | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1595:22:1595:24 | rhs | | main.rs:1510:5:1515:5 | Vec2 | @@ -2778,9 +2718,11 @@ inferCertainType | main.rs:1604:45:1607:9 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1605:13:1605:16 | self | | {EXTERNAL LOCATION} | &mut | | main.rs:1605:13:1605:16 | self | TRefMut | main.rs:1510:5:1515:5 | Vec2 | +| main.rs:1605:13:1605:27 | ... %= ... | | {EXTERNAL LOCATION} | () | | main.rs:1605:23:1605:25 | rhs | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1606:13:1606:16 | self | | {EXTERNAL LOCATION} | &mut | | main.rs:1606:13:1606:16 | self | TRefMut | main.rs:1510:5:1515:5 | Vec2 | +| main.rs:1606:13:1606:27 | ... %= ... | | {EXTERNAL LOCATION} | () | | main.rs:1606:23:1606:25 | rhs | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1612:19:1612:22 | SelfParam | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1612:25:1612:27 | rhs | | main.rs:1510:5:1515:5 | Vec2 | @@ -2796,9 +2738,11 @@ inferCertainType | main.rs:1621:48:1624:9 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1622:13:1622:16 | self | | {EXTERNAL LOCATION} | &mut | | main.rs:1622:13:1622:16 | self | TRefMut | main.rs:1510:5:1515:5 | Vec2 | +| main.rs:1622:13:1622:27 | ... &= ... | | {EXTERNAL LOCATION} | () | | main.rs:1622:23:1622:25 | rhs | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1623:13:1623:16 | self | | {EXTERNAL LOCATION} | &mut | | main.rs:1623:13:1623:16 | self | TRefMut | main.rs:1510:5:1515:5 | Vec2 | +| main.rs:1623:13:1623:27 | ... &= ... | | {EXTERNAL LOCATION} | () | | main.rs:1623:23:1623:25 | rhs | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1629:18:1629:21 | SelfParam | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1629:24:1629:26 | rhs | | main.rs:1510:5:1515:5 | Vec2 | @@ -2814,9 +2758,11 @@ inferCertainType | main.rs:1638:47:1641:9 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1639:13:1639:16 | self | | {EXTERNAL LOCATION} | &mut | | main.rs:1639:13:1639:16 | self | TRefMut | main.rs:1510:5:1515:5 | Vec2 | +| main.rs:1639:13:1639:27 | ... \|= ... | | {EXTERNAL LOCATION} | () | | main.rs:1639:23:1639:25 | rhs | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1640:13:1640:16 | self | | {EXTERNAL LOCATION} | &mut | | main.rs:1640:13:1640:16 | self | TRefMut | main.rs:1510:5:1515:5 | Vec2 | +| main.rs:1640:13:1640:27 | ... \|= ... | | {EXTERNAL LOCATION} | () | | main.rs:1640:23:1640:25 | rhs | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1646:19:1646:22 | SelfParam | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1646:25:1646:27 | rhs | | main.rs:1510:5:1515:5 | Vec2 | @@ -2832,9 +2778,11 @@ inferCertainType | main.rs:1655:48:1658:9 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1656:13:1656:16 | self | | {EXTERNAL LOCATION} | &mut | | main.rs:1656:13:1656:16 | self | TRefMut | main.rs:1510:5:1515:5 | Vec2 | +| main.rs:1656:13:1656:27 | ... ^= ... | | {EXTERNAL LOCATION} | () | | main.rs:1656:23:1656:25 | rhs | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1657:13:1657:16 | self | | {EXTERNAL LOCATION} | &mut | | main.rs:1657:13:1657:16 | self | TRefMut | main.rs:1510:5:1515:5 | Vec2 | +| main.rs:1657:13:1657:27 | ... ^= ... | | {EXTERNAL LOCATION} | () | | main.rs:1657:23:1657:25 | rhs | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1663:16:1663:19 | SelfParam | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1663:22:1663:24 | rhs | | {EXTERNAL LOCATION} | u32 | @@ -2850,9 +2798,11 @@ inferCertainType | main.rs:1672:44:1675:9 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1673:13:1673:16 | self | | {EXTERNAL LOCATION} | &mut | | main.rs:1673:13:1673:16 | self | TRefMut | main.rs:1510:5:1515:5 | Vec2 | +| main.rs:1673:13:1673:26 | ... <<= ... | | {EXTERNAL LOCATION} | () | | main.rs:1673:24:1673:26 | rhs | | {EXTERNAL LOCATION} | u32 | | main.rs:1674:13:1674:16 | self | | {EXTERNAL LOCATION} | &mut | | main.rs:1674:13:1674:16 | self | TRefMut | main.rs:1510:5:1515:5 | Vec2 | +| main.rs:1674:13:1674:26 | ... <<= ... | | {EXTERNAL LOCATION} | () | | main.rs:1674:24:1674:26 | rhs | | {EXTERNAL LOCATION} | u32 | | main.rs:1680:16:1680:19 | SelfParam | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1680:22:1680:24 | rhs | | {EXTERNAL LOCATION} | u32 | @@ -2868,9 +2818,11 @@ inferCertainType | main.rs:1689:44:1692:9 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:1690:13:1690:16 | self | | {EXTERNAL LOCATION} | &mut | | main.rs:1690:13:1690:16 | self | TRefMut | main.rs:1510:5:1515:5 | Vec2 | +| main.rs:1690:13:1690:26 | ... >>= ... | | {EXTERNAL LOCATION} | () | | main.rs:1690:24:1690:26 | rhs | | {EXTERNAL LOCATION} | u32 | | main.rs:1691:13:1691:16 | self | | {EXTERNAL LOCATION} | &mut | | main.rs:1691:13:1691:16 | self | TRefMut | main.rs:1510:5:1515:5 | Vec2 | +| main.rs:1691:13:1691:26 | ... >>= ... | | {EXTERNAL LOCATION} | () | | main.rs:1691:24:1691:26 | rhs | | {EXTERNAL LOCATION} | u32 | | main.rs:1697:16:1697:19 | SelfParam | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1697:30:1702:9 | { ... } | | main.rs:1510:5:1515:5 | Vec2 | @@ -2918,8 +2870,6 @@ inferCertainType | main.rs:1726:24:1726:28 | SelfParam | TRef | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1726:31:1726:35 | other | | {EXTERNAL LOCATION} | & | | main.rs:1726:31:1726:35 | other | TRef | main.rs:1510:5:1515:5 | Vec2 | -| main.rs:1726:75:1728:9 | { ... } | | {EXTERNAL LOCATION} | Option | -| main.rs:1726:75:1728:9 | { ... } | T | {EXTERNAL LOCATION} | Ordering | | main.rs:1727:14:1727:17 | self | | {EXTERNAL LOCATION} | & | | main.rs:1727:14:1727:17 | self | TRef | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1727:23:1727:26 | self | | {EXTERNAL LOCATION} | & | @@ -2995,7 +2945,6 @@ inferCertainType | main.rs:1743:44:1743:48 | other | TRef | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1747:26:1747:26 | a | | main.rs:1747:18:1747:23 | T | | main.rs:1747:32:1747:32 | b | | main.rs:1747:18:1747:23 | T | -| main.rs:1747:51:1749:5 | { ... } | | main.rs:1747:18:1747:23 | T::Output[Add] | | main.rs:1748:9:1748:9 | a | | main.rs:1747:18:1747:23 | T | | main.rs:1748:13:1748:13 | b | | main.rs:1747:18:1747:23 | T | | main.rs:1751:16:1882:5 | { ... } | | {EXTERNAL LOCATION} | () | @@ -3026,22 +2975,27 @@ inferCertainType | main.rs:1771:17:1771:30 | i64_add_assign | | {EXTERNAL LOCATION} | i64 | | main.rs:1771:34:1771:38 | 23i64 | | {EXTERNAL LOCATION} | i64 | | main.rs:1772:9:1772:22 | i64_add_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1772:9:1772:31 | ... += ... | | {EXTERNAL LOCATION} | () | | main.rs:1772:27:1772:31 | 24i64 | | {EXTERNAL LOCATION} | i64 | | main.rs:1774:17:1774:30 | i64_sub_assign | | {EXTERNAL LOCATION} | i64 | | main.rs:1774:34:1774:38 | 25i64 | | {EXTERNAL LOCATION} | i64 | | main.rs:1775:9:1775:22 | i64_sub_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1775:9:1775:31 | ... -= ... | | {EXTERNAL LOCATION} | () | | main.rs:1775:27:1775:31 | 26i64 | | {EXTERNAL LOCATION} | i64 | | main.rs:1777:17:1777:30 | i64_mul_assign | | {EXTERNAL LOCATION} | i64 | | main.rs:1777:34:1777:38 | 27i64 | | {EXTERNAL LOCATION} | i64 | | main.rs:1778:9:1778:22 | i64_mul_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1778:9:1778:31 | ... *= ... | | {EXTERNAL LOCATION} | () | | main.rs:1778:27:1778:31 | 28i64 | | {EXTERNAL LOCATION} | i64 | | main.rs:1780:17:1780:30 | i64_div_assign | | {EXTERNAL LOCATION} | i64 | | main.rs:1780:34:1780:38 | 29i64 | | {EXTERNAL LOCATION} | i64 | | main.rs:1781:9:1781:22 | i64_div_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1781:9:1781:31 | ... /= ... | | {EXTERNAL LOCATION} | () | | main.rs:1781:27:1781:31 | 30i64 | | {EXTERNAL LOCATION} | i64 | | main.rs:1783:17:1783:30 | i64_rem_assign | | {EXTERNAL LOCATION} | i64 | | main.rs:1783:34:1783:38 | 31i64 | | {EXTERNAL LOCATION} | i64 | | main.rs:1784:9:1784:22 | i64_rem_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1784:9:1784:31 | ... %= ... | | {EXTERNAL LOCATION} | () | | main.rs:1784:27:1784:31 | 32i64 | | {EXTERNAL LOCATION} | i64 | | main.rs:1787:26:1787:30 | 33i64 | | {EXTERNAL LOCATION} | i64 | | main.rs:1787:34:1787:38 | 34i64 | | {EXTERNAL LOCATION} | i64 | @@ -3056,22 +3010,27 @@ inferCertainType | main.rs:1794:17:1794:33 | i64_bitand_assign | | {EXTERNAL LOCATION} | i64 | | main.rs:1794:37:1794:41 | 43i64 | | {EXTERNAL LOCATION} | i64 | | main.rs:1795:9:1795:25 | i64_bitand_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1795:9:1795:34 | ... &= ... | | {EXTERNAL LOCATION} | () | | main.rs:1795:30:1795:34 | 44i64 | | {EXTERNAL LOCATION} | i64 | | main.rs:1797:17:1797:32 | i64_bitor_assign | | {EXTERNAL LOCATION} | i64 | | main.rs:1797:36:1797:40 | 45i64 | | {EXTERNAL LOCATION} | i64 | | main.rs:1798:9:1798:24 | i64_bitor_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1798:9:1798:33 | ... \|= ... | | {EXTERNAL LOCATION} | () | | main.rs:1798:29:1798:33 | 46i64 | | {EXTERNAL LOCATION} | i64 | | main.rs:1800:17:1800:33 | i64_bitxor_assign | | {EXTERNAL LOCATION} | i64 | | main.rs:1800:37:1800:41 | 47i64 | | {EXTERNAL LOCATION} | i64 | | main.rs:1801:9:1801:25 | i64_bitxor_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1801:9:1801:34 | ... ^= ... | | {EXTERNAL LOCATION} | () | | main.rs:1801:30:1801:34 | 48i64 | | {EXTERNAL LOCATION} | i64 | | main.rs:1803:17:1803:30 | i64_shl_assign | | {EXTERNAL LOCATION} | i64 | | main.rs:1803:34:1803:38 | 49i64 | | {EXTERNAL LOCATION} | i64 | | main.rs:1804:9:1804:22 | i64_shl_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1804:9:1804:32 | ... <<= ... | | {EXTERNAL LOCATION} | () | | main.rs:1804:28:1804:32 | 50i64 | | {EXTERNAL LOCATION} | i64 | | main.rs:1806:17:1806:30 | i64_shr_assign | | {EXTERNAL LOCATION} | i64 | | main.rs:1806:34:1806:38 | 51i64 | | {EXTERNAL LOCATION} | i64 | | main.rs:1807:9:1807:22 | i64_shr_assign | | {EXTERNAL LOCATION} | i64 | +| main.rs:1807:9:1807:32 | ... >>= ... | | {EXTERNAL LOCATION} | () | | main.rs:1807:28:1807:32 | 52i64 | | {EXTERNAL LOCATION} | i64 | | main.rs:1809:24:1809:28 | 53i64 | | {EXTERNAL LOCATION} | i64 | | main.rs:1810:24:1810:28 | 54i64 | | {EXTERNAL LOCATION} | i64 | @@ -3104,22 +3063,27 @@ inferCertainType | main.rs:1832:17:1832:31 | vec2_add_assign | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1832:35:1832:36 | v1 | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1833:9:1833:23 | vec2_add_assign | | main.rs:1510:5:1515:5 | Vec2 | +| main.rs:1833:9:1833:29 | ... += ... | | {EXTERNAL LOCATION} | () | | main.rs:1833:28:1833:29 | v2 | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1835:17:1835:31 | vec2_sub_assign | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1835:35:1835:36 | v1 | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1836:9:1836:23 | vec2_sub_assign | | main.rs:1510:5:1515:5 | Vec2 | +| main.rs:1836:9:1836:29 | ... -= ... | | {EXTERNAL LOCATION} | () | | main.rs:1836:28:1836:29 | v2 | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1838:17:1838:31 | vec2_mul_assign | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1838:35:1838:36 | v1 | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1839:9:1839:23 | vec2_mul_assign | | main.rs:1510:5:1515:5 | Vec2 | +| main.rs:1839:9:1839:29 | ... *= ... | | {EXTERNAL LOCATION} | () | | main.rs:1839:28:1839:29 | v2 | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1841:17:1841:31 | vec2_div_assign | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1841:35:1841:36 | v1 | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1842:9:1842:23 | vec2_div_assign | | main.rs:1510:5:1515:5 | Vec2 | +| main.rs:1842:9:1842:29 | ... /= ... | | {EXTERNAL LOCATION} | () | | main.rs:1842:28:1842:29 | v2 | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1844:17:1844:31 | vec2_rem_assign | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1844:35:1844:36 | v1 | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1845:9:1845:23 | vec2_rem_assign | | main.rs:1510:5:1515:5 | Vec2 | +| main.rs:1845:9:1845:29 | ... %= ... | | {EXTERNAL LOCATION} | () | | main.rs:1845:28:1845:29 | v2 | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1848:27:1848:28 | v1 | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1848:32:1848:33 | v2 | | main.rs:1510:5:1515:5 | Vec2 | @@ -3134,22 +3098,27 @@ inferCertainType | main.rs:1855:17:1855:34 | vec2_bitand_assign | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1855:38:1855:39 | v1 | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1856:9:1856:26 | vec2_bitand_assign | | main.rs:1510:5:1515:5 | Vec2 | +| main.rs:1856:9:1856:32 | ... &= ... | | {EXTERNAL LOCATION} | () | | main.rs:1856:31:1856:32 | v2 | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1858:17:1858:33 | vec2_bitor_assign | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1858:37:1858:38 | v1 | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1859:9:1859:25 | vec2_bitor_assign | | main.rs:1510:5:1515:5 | Vec2 | +| main.rs:1859:9:1859:31 | ... \|= ... | | {EXTERNAL LOCATION} | () | | main.rs:1859:30:1859:31 | v2 | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1861:17:1861:34 | vec2_bitxor_assign | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1861:38:1861:39 | v1 | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1862:9:1862:26 | vec2_bitxor_assign | | main.rs:1510:5:1515:5 | Vec2 | +| main.rs:1862:9:1862:32 | ... ^= ... | | {EXTERNAL LOCATION} | () | | main.rs:1862:31:1862:32 | v2 | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1864:17:1864:31 | vec2_shl_assign | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1864:35:1864:36 | v1 | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1865:9:1865:23 | vec2_shl_assign | | main.rs:1510:5:1515:5 | Vec2 | +| main.rs:1865:9:1865:32 | ... <<= ... | | {EXTERNAL LOCATION} | () | | main.rs:1865:29:1865:32 | 1u32 | | {EXTERNAL LOCATION} | u32 | | main.rs:1867:17:1867:31 | vec2_shr_assign | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1867:35:1867:36 | v1 | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1868:9:1868:23 | vec2_shr_assign | | main.rs:1510:5:1515:5 | Vec2 | +| main.rs:1868:9:1868:32 | ... >>= ... | | {EXTERNAL LOCATION} | () | | main.rs:1868:29:1868:32 | 1u32 | | {EXTERNAL LOCATION} | u32 | | main.rs:1871:25:1871:26 | v1 | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1872:25:1872:26 | v1 | | main.rs:1510:5:1515:5 | Vec2 | @@ -3157,8 +3126,10 @@ inferCertainType | main.rs:1881:30:1881:48 | Vec2 {...} | | main.rs:1510:5:1515:5 | Vec2 | | main.rs:1891:18:1891:21 | SelfParam | | main.rs:1888:5:1888:14 | S1 | | main.rs:1891:24:1891:25 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:1894:25:1896:5 | { ... } | | main.rs:1888:5:1888:14 | S1 | +| main.rs:1898:41:1900:5 | { ... } | | {EXTERNAL LOCATION} | dyn Future | | main.rs:1899:9:1899:20 | { ... } | | {EXTERNAL LOCATION} | dyn Future | +| main.rs:1902:41:1904:5 | { ... } | | {EXTERNAL LOCATION} | dyn Future | +| main.rs:1902:41:1904:5 | { ... } | dyn(Output) | {EXTERNAL LOCATION} | () | | main.rs:1903:9:1903:16 | { ... } | | {EXTERNAL LOCATION} | dyn Future | | main.rs:1903:9:1903:16 | { ... } | dyn(Output) | {EXTERNAL LOCATION} | () | | main.rs:1912:13:1912:42 | SelfParam | | {EXTERNAL LOCATION} | Pin | @@ -3166,14 +3137,7 @@ inferCertainType | main.rs:1912:13:1912:42 | SelfParam | Ptr.TRefMut | main.rs:1906:5:1906:14 | S2 | | main.rs:1913:13:1913:15 | _cx | | {EXTERNAL LOCATION} | &mut | | main.rs:1913:13:1913:15 | _cx | TRefMut | {EXTERNAL LOCATION} | Context | -| main.rs:1914:44:1916:9 | { ... } | | {EXTERNAL LOCATION} | Poll | -| main.rs:1914:44:1916:9 | { ... } | T | main.rs:1888:5:1888:14 | S1 | | main.rs:1923:22:1931:5 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:1924:9:1924:12 | f1(...) | | {EXTERNAL LOCATION} | dyn Future | -| main.rs:1924:9:1924:12 | f1(...) | dyn(Output) | main.rs:1888:5:1888:14 | S1 | -| main.rs:1925:9:1925:12 | f2(...) | | main.rs:1898:16:1898:39 | impl ... | -| main.rs:1926:9:1926:12 | f3(...) | | main.rs:1902:16:1902:39 | impl ... | -| main.rs:1927:9:1927:12 | f4(...) | | main.rs:1919:16:1919:39 | impl ... | | main.rs:1929:13:1929:13 | b | | {EXTERNAL LOCATION} | dyn Future | | main.rs:1929:17:1929:28 | { ... } | | {EXTERNAL LOCATION} | dyn Future | | main.rs:1930:9:1930:9 | b | | {EXTERNAL LOCATION} | dyn Future | @@ -3193,63 +3157,30 @@ inferCertainType | main.rs:1961:18:1961:22 | SelfParam | TRef | main.rs:1960:5:1962:5 | Self [trait MyTrait] | | main.rs:1965:18:1965:22 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:1965:18:1965:22 | SelfParam | TRef | main.rs:1935:5:1936:14 | S1 | -| main.rs:1965:31:1967:9 | { ... } | | main.rs:1937:5:1937:14 | S2 | | main.rs:1971:18:1971:22 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:1971:18:1971:22 | SelfParam | TRef | main.rs:1938:5:1938:22 | S3 | | main.rs:1971:18:1971:22 | SelfParam | TRef.T3 | main.rs:1970:10:1970:17 | T | -| main.rs:1971:30:1974:9 | { ... } | | main.rs:1970:10:1970:17 | T | | main.rs:1972:25:1972:28 | self | | {EXTERNAL LOCATION} | & | | main.rs:1972:25:1972:28 | self | TRef | main.rs:1938:5:1938:22 | S3 | | main.rs:1972:25:1972:28 | self | TRef.T3 | main.rs:1970:10:1970:17 | T | | main.rs:1981:41:1981:41 | t | | main.rs:1981:26:1981:38 | B | -| main.rs:1981:52:1983:5 | { ... } | | main.rs:1981:23:1981:23 | A | | main.rs:1982:9:1982:9 | t | | main.rs:1981:26:1981:38 | B | | main.rs:1985:34:1985:34 | x | | main.rs:1985:24:1985:31 | T | -| main.rs:1985:59:1987:5 | { ... } | | main.rs:1985:43:1985:57 | impl ... | -| main.rs:1985:59:1987:5 | { ... } | impl(T) | main.rs:1985:24:1985:31 | T | | main.rs:1986:12:1986:12 | x | | main.rs:1985:24:1985:31 | T | | main.rs:1989:34:1989:34 | x | | main.rs:1989:24:1989:31 | T | -| main.rs:1989:67:1991:5 | { ... } | | {EXTERNAL LOCATION} | Option | -| main.rs:1989:67:1991:5 | { ... } | T | main.rs:1989:50:1989:64 | impl ... | -| main.rs:1989:67:1991:5 | { ... } | T.impl(T) | main.rs:1989:24:1989:31 | T | | main.rs:1990:17:1990:17 | x | | main.rs:1989:24:1989:31 | T | | main.rs:1993:34:1993:34 | x | | main.rs:1993:24:1993:31 | T | | main.rs:1993:78:1995:5 | { ... } | | {EXTERNAL LOCATION} | (T_2) | -| main.rs:1993:78:1995:5 | { ... } | T0 | main.rs:1993:44:1993:58 | impl ... | -| main.rs:1993:78:1995:5 | { ... } | T0.impl(T) | main.rs:1993:24:1993:31 | T | -| main.rs:1993:78:1995:5 | { ... } | T1 | main.rs:1993:61:1993:75 | impl ... | -| main.rs:1993:78:1995:5 | { ... } | T1.impl(T) | main.rs:1993:24:1993:31 | T | | main.rs:1994:9:1994:30 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | | main.rs:1994:13:1994:13 | x | | main.rs:1993:24:1993:31 | T | | main.rs:1994:28:1994:28 | x | | main.rs:1993:24:1993:31 | T | | main.rs:1997:26:1997:26 | t | | main.rs:1997:29:1997:43 | impl ... | -| main.rs:1997:51:1999:5 | { ... } | | main.rs:1997:23:1997:23 | A | | main.rs:1998:9:1998:9 | t | | main.rs:1997:29:1997:43 | impl ... | | main.rs:2001:16:2015:5 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2002:13:2002:13 | x | | main.rs:1956:16:1956:35 | impl ... + ... | -| main.rs:2002:17:2002:20 | f1(...) | | main.rs:1956:16:1956:35 | impl ... + ... | -| main.rs:2003:9:2003:9 | x | | main.rs:1956:16:1956:35 | impl ... + ... | -| main.rs:2004:9:2004:9 | x | | main.rs:1956:16:1956:35 | impl ... + ... | -| main.rs:2005:13:2005:13 | a | | main.rs:1977:28:1977:43 | impl ... | -| main.rs:2005:17:2005:32 | get_a_my_trait(...) | | main.rs:1977:28:1977:43 | impl ... | -| main.rs:2006:32:2006:32 | a | | main.rs:1977:28:1977:43 | impl ... | -| main.rs:2007:13:2007:13 | a | | main.rs:1977:28:1977:43 | impl ... | -| main.rs:2007:17:2007:32 | get_a_my_trait(...) | | main.rs:1977:28:1977:43 | impl ... | -| main.rs:2008:32:2008:32 | a | | main.rs:1977:28:1977:43 | impl ... | -| main.rs:2010:17:2010:35 | get_a_my_trait2(...) | | main.rs:1985:43:1985:57 | impl ... | -| main.rs:2013:17:2013:35 | get_a_my_trait3(...) | | {EXTERNAL LOCATION} | Option | -| main.rs:2013:17:2013:35 | get_a_my_trait3(...) | T | main.rs:1989:50:1989:64 | impl ... | -| main.rs:2014:17:2014:35 | get_a_my_trait4(...) | | {EXTERNAL LOCATION} | (T_2) | -| main.rs:2014:17:2014:35 | get_a_my_trait4(...) | T0 | main.rs:1993:44:1993:58 | impl ... | -| main.rs:2014:17:2014:35 | get_a_my_trait4(...) | T1 | main.rs:1993:61:1993:75 | impl ... | | main.rs:2025:16:2025:20 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:2025:16:2025:20 | SelfParam | TRef | main.rs:2021:5:2022:13 | S | -| main.rs:2025:31:2027:9 | { ... } | | main.rs:2021:5:2022:13 | S | | main.rs:2036:26:2038:9 | { ... } | | main.rs:2030:5:2033:5 | MyVec | -| main.rs:2036:26:2038:9 | { ... } | T | main.rs:2035:10:2035:10 | T | | main.rs:2037:13:2037:38 | MyVec {...} | | main.rs:2030:5:2033:5 | MyVec | -| main.rs:2037:27:2037:36 | ...::new(...) | | {EXTERNAL LOCATION} | Vec | -| main.rs:2037:27:2037:36 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | | main.rs:2040:17:2040:25 | SelfParam | | {EXTERNAL LOCATION} | &mut | | main.rs:2040:17:2040:25 | SelfParam | TRefMut | main.rs:2030:5:2033:5 | MyVec | | main.rs:2040:17:2040:25 | SelfParam | TRefMut.T | main.rs:2035:10:2035:10 | T | @@ -3264,7 +3195,6 @@ inferCertainType | main.rs:2049:18:2049:22 | SelfParam | TRef.T | main.rs:2045:10:2045:10 | T | | main.rs:2049:25:2049:29 | index | | {EXTERNAL LOCATION} | usize | | main.rs:2049:56:2051:9 | { ... } | | {EXTERNAL LOCATION} | & | -| main.rs:2049:56:2051:9 | { ... } | TRef | main.rs:2045:10:2045:10 | T | | main.rs:2050:13:2050:29 | &... | | {EXTERNAL LOCATION} | & | | main.rs:2050:14:2050:17 | self | | {EXTERNAL LOCATION} | & | | main.rs:2050:14:2050:17 | self | TRef | main.rs:2030:5:2033:5 | MyVec | @@ -3279,28 +3209,22 @@ inferCertainType | main.rs:2055:17:2055:21 | slice | TRef.TSlice | main.rs:2021:5:2022:13 | S | | main.rs:2058:37:2058:37 | a | | main.rs:2058:20:2058:34 | T | | main.rs:2058:43:2058:43 | b | | {EXTERNAL LOCATION} | usize | -| main.rs:2061:5:2063:5 | { ... } | | main.rs:2058:20:2058:34 | T::Output[Index] | | main.rs:2062:9:2062:9 | a | | main.rs:2058:20:2058:34 | T | | main.rs:2062:11:2062:11 | b | | {EXTERNAL LOCATION} | usize | | main.rs:2065:16:2076:5 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2066:17:2066:19 | vec | | main.rs:2030:5:2033:5 | MyVec | -| main.rs:2066:23:2066:34 | ...::new(...) | | main.rs:2030:5:2033:5 | MyVec | -| main.rs:2067:9:2067:11 | vec | | main.rs:2030:5:2033:5 | MyVec | -| main.rs:2068:9:2068:11 | vec | | main.rs:2030:5:2033:5 | MyVec | | main.rs:2070:13:2070:14 | xs | | {EXTERNAL LOCATION} | [;] | | main.rs:2070:13:2070:14 | xs | TArray | main.rs:2021:5:2022:13 | S | | main.rs:2070:26:2070:28 | [...] | | {EXTERNAL LOCATION} | [;] | | main.rs:2071:17:2071:18 | xs | | {EXTERNAL LOCATION} | [;] | | main.rs:2071:17:2071:18 | xs | TArray | main.rs:2021:5:2022:13 | S | -| main.rs:2073:29:2073:31 | vec | | main.rs:2030:5:2033:5 | MyVec | -| main.rs:2075:9:2075:26 | analyze_slice(...) | | {EXTERNAL LOCATION} | () | | main.rs:2075:23:2075:25 | &xs | | {EXTERNAL LOCATION} | & | +| main.rs:2075:23:2075:25 | &xs | TRef | {EXTERNAL LOCATION} | [;] | +| main.rs:2075:23:2075:25 | &xs | TRef.TArray | main.rs:2021:5:2022:13 | S | | main.rs:2075:24:2075:25 | xs | | {EXTERNAL LOCATION} | [;] | | main.rs:2075:24:2075:25 | xs | TArray | main.rs:2021:5:2022:13 | S | | main.rs:2080:16:2082:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2081:25:2081:35 | "Hello, {}" | | {EXTERNAL LOCATION} | & | | main.rs:2081:25:2081:35 | "Hello, {}" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:2081:25:2081:45 | ...::format(...) | | {EXTERNAL LOCATION} | String | | main.rs:2081:38:2081:45 | "World!" | | {EXTERNAL LOCATION} | & | | main.rs:2081:38:2081:45 | "World!" | TRef | {EXTERNAL LOCATION} | str | | main.rs:2090:19:2090:22 | SelfParam | | main.rs:2086:5:2091:5 | Self [trait MyAdd] | @@ -3312,19 +3236,15 @@ inferCertainType | main.rs:2106:19:2106:22 | SelfParam | | {EXTERNAL LOCATION} | i64 | | main.rs:2106:25:2106:29 | value | | {EXTERNAL LOCATION} | & | | main.rs:2106:25:2106:29 | value | TRef | {EXTERNAL LOCATION} | i64 | -| main.rs:2106:46:2108:9 | { ... } | | {EXTERNAL LOCATION} | i64 | | main.rs:2107:14:2107:18 | value | | {EXTERNAL LOCATION} | & | | main.rs:2107:14:2107:18 | value | TRef | {EXTERNAL LOCATION} | i64 | | main.rs:2115:19:2115:22 | SelfParam | | {EXTERNAL LOCATION} | i64 | | main.rs:2115:25:2115:29 | value | | {EXTERNAL LOCATION} | bool | -| main.rs:2115:46:2121:9 | { ... } | | {EXTERNAL LOCATION} | i64 | | main.rs:2116:16:2116:20 | value | | {EXTERNAL LOCATION} | bool | | main.rs:2130:19:2130:22 | SelfParam | | main.rs:2124:5:2124:19 | S | | main.rs:2130:19:2130:22 | SelfParam | T | main.rs:2126:10:2126:17 | T | | main.rs:2130:25:2130:29 | other | | main.rs:2124:5:2124:19 | S | | main.rs:2130:25:2130:29 | other | T | main.rs:2126:10:2126:17 | T | -| main.rs:2130:54:2132:9 | { ... } | | main.rs:2124:5:2124:19 | S | -| main.rs:2130:54:2132:9 | { ... } | T | main.rs:2126:10:2126:17 | T::Output[MyAdd] | | main.rs:2131:16:2131:19 | self | | main.rs:2124:5:2124:19 | S | | main.rs:2131:16:2131:19 | self | T | main.rs:2126:10:2126:17 | T | | main.rs:2131:31:2131:35 | other | | main.rs:2124:5:2124:19 | S | @@ -3332,8 +3252,6 @@ inferCertainType | main.rs:2139:19:2139:22 | SelfParam | | main.rs:2124:5:2124:19 | S | | main.rs:2139:19:2139:22 | SelfParam | T | main.rs:2135:10:2135:17 | T | | main.rs:2139:25:2139:29 | other | | main.rs:2135:10:2135:17 | T | -| main.rs:2139:51:2141:9 | { ... } | | main.rs:2124:5:2124:19 | S | -| main.rs:2139:51:2141:9 | { ... } | T | main.rs:2135:10:2135:17 | T::Output[MyAdd] | | main.rs:2140:16:2140:19 | self | | main.rs:2124:5:2124:19 | S | | main.rs:2140:16:2140:19 | self | T | main.rs:2135:10:2135:17 | T | | main.rs:2140:31:2140:35 | other | | main.rs:2135:10:2135:17 | T | @@ -3341,8 +3259,6 @@ inferCertainType | main.rs:2151:19:2151:22 | SelfParam | T | main.rs:2144:14:2144:14 | T | | main.rs:2151:25:2151:29 | other | | {EXTERNAL LOCATION} | & | | main.rs:2151:25:2151:29 | other | TRef | main.rs:2144:14:2144:14 | T | -| main.rs:2151:55:2153:9 | { ... } | | main.rs:2124:5:2124:19 | S | -| main.rs:2151:55:2153:9 | { ... } | T | main.rs:2144:14:2144:14 | T::Output[MyAdd] | | main.rs:2152:16:2152:19 | self | | main.rs:2124:5:2124:19 | S | | main.rs:2152:16:2152:19 | self | T | main.rs:2144:14:2144:14 | T | | main.rs:2152:31:2152:35 | other | | {EXTERNAL LOCATION} | & | @@ -3352,7 +3268,6 @@ inferCertainType | main.rs:2163:40:2165:9 | { ... } | | {EXTERNAL LOCATION} | i64 | | main.rs:2164:13:2164:17 | value | | {EXTERNAL LOCATION} | i64 | | main.rs:2170:20:2170:24 | value | | {EXTERNAL LOCATION} | bool | -| main.rs:2170:41:2176:9 | { ... } | | {EXTERNAL LOCATION} | i64 | | main.rs:2171:16:2171:20 | value | | {EXTERNAL LOCATION} | bool | | main.rs:2181:21:2181:25 | value | | main.rs:2179:19:2179:19 | T | | main.rs:2181:31:2181:31 | x | | main.rs:2179:5:2182:5 | Self [trait MyFrom2] | @@ -3367,13 +3282,10 @@ inferCertainType | main.rs:2204:15:2204:15 | x | | main.rs:2202:5:2208:5 | Self [trait MySelfTrait] | | main.rs:2207:15:2207:15 | x | | main.rs:2202:5:2208:5 | Self [trait MySelfTrait] | | main.rs:2212:15:2212:15 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2212:31:2214:9 | { ... } | | {EXTERNAL LOCATION} | i64 | | main.rs:2213:13:2213:13 | x | | {EXTERNAL LOCATION} | i64 | | main.rs:2217:15:2217:15 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2217:32:2219:9 | { ... } | | {EXTERNAL LOCATION} | i64 | | main.rs:2218:13:2218:13 | x | | {EXTERNAL LOCATION} | i64 | | main.rs:2224:15:2224:15 | x | | {EXTERNAL LOCATION} | bool | -| main.rs:2224:31:2226:9 | { ... } | | {EXTERNAL LOCATION} | i64 | | main.rs:2229:15:2229:15 | x | | {EXTERNAL LOCATION} | bool | | main.rs:2229:32:2231:9 | { ... } | | {EXTERNAL LOCATION} | bool | | main.rs:2230:13:2230:13 | x | | {EXTERNAL LOCATION} | bool | @@ -3383,6 +3295,7 @@ inferCertainType | main.rs:2236:18:2236:21 | 5i64 | | {EXTERNAL LOCATION} | i64 | | main.rs:2237:9:2237:9 | x | | {EXTERNAL LOCATION} | i64 | | main.rs:2237:18:2237:22 | &5i64 | | {EXTERNAL LOCATION} | & | +| main.rs:2237:18:2237:22 | &5i64 | TRef | {EXTERNAL LOCATION} | i64 | | main.rs:2237:19:2237:22 | 5i64 | | {EXTERNAL LOCATION} | i64 | | main.rs:2238:9:2238:9 | x | | {EXTERNAL LOCATION} | i64 | | main.rs:2238:18:2238:21 | true | | {EXTERNAL LOCATION} | bool | @@ -3392,43 +3305,30 @@ inferCertainType | main.rs:2241:24:2241:27 | 3i64 | | {EXTERNAL LOCATION} | i64 | | main.rs:2242:11:2242:14 | 1i64 | | {EXTERNAL LOCATION} | i64 | | main.rs:2242:24:2242:28 | &3i64 | | {EXTERNAL LOCATION} | & | +| main.rs:2242:24:2242:28 | &3i64 | TRef | {EXTERNAL LOCATION} | i64 | | main.rs:2242:25:2242:28 | 3i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2244:13:2244:13 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2244:17:2244:35 | ...::my_from(...) | | {EXTERNAL LOCATION} | i64 | | main.rs:2244:30:2244:34 | 73i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2245:13:2245:13 | y | | {EXTERNAL LOCATION} | i64 | -| main.rs:2245:17:2245:34 | ...::my_from(...) | | {EXTERNAL LOCATION} | i64 | | main.rs:2245:30:2245:33 | true | | {EXTERNAL LOCATION} | bool | | main.rs:2246:13:2246:13 | z | | {EXTERNAL LOCATION} | i64 | | main.rs:2246:38:2246:42 | 73i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2247:9:2247:34 | ...::my_from2(...) | | {EXTERNAL LOCATION} | () | | main.rs:2247:23:2247:27 | 73i64 | | {EXTERNAL LOCATION} | i64 | | main.rs:2247:30:2247:33 | 0i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2248:9:2248:33 | ...::my_from2(...) | | {EXTERNAL LOCATION} | () | | main.rs:2248:23:2248:26 | true | | {EXTERNAL LOCATION} | bool | | main.rs:2248:29:2248:32 | 0i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2249:9:2249:38 | ...::my_from2(...) | | {EXTERNAL LOCATION} | () | | main.rs:2249:27:2249:31 | 73i64 | | {EXTERNAL LOCATION} | i64 | | main.rs:2249:34:2249:37 | 0i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2251:9:2251:22 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | | main.rs:2251:17:2251:21 | 73i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2252:9:2252:22 | ...::f2(...) | | {EXTERNAL LOCATION} | i64 | | main.rs:2252:17:2252:21 | 73i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2253:9:2253:22 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | | main.rs:2253:18:2253:21 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:2254:9:2254:22 | ...::f2(...) | | {EXTERNAL LOCATION} | bool | | main.rs:2254:18:2254:21 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:2255:9:2255:30 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | | main.rs:2255:25:2255:29 | 73i64 | | {EXTERNAL LOCATION} | i64 | | main.rs:2256:25:2256:29 | 73i64 | | {EXTERNAL LOCATION} | i64 | -| main.rs:2257:9:2257:29 | ...::f1(...) | | {EXTERNAL LOCATION} | i64 | | main.rs:2257:25:2257:28 | true | | {EXTERNAL LOCATION} | bool | | main.rs:2258:25:2258:28 | true | | {EXTERNAL LOCATION} | bool | | main.rs:2266:26:2268:9 | { ... } | | main.rs:2263:5:2263:24 | MyCallable | | main.rs:2267:13:2267:25 | MyCallable {...} | | main.rs:2263:5:2263:24 | MyCallable | | main.rs:2270:17:2270:21 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:2270:17:2270:21 | SelfParam | TRef | main.rs:2263:5:2263:24 | MyCallable | -| main.rs:2270:31:2272:9 | { ... } | | {EXTERNAL LOCATION} | i64 | | main.rs:2275:16:2382:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2278:9:2278:29 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2278:18:2278:26 | [...] | | {EXTERNAL LOCATION} | [;] | @@ -3436,6 +3336,7 @@ inferCertainType | main.rs:2279:9:2279:44 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2279:18:2279:26 | [...] | | {EXTERNAL LOCATION} | [;] | | main.rs:2279:32:2279:40 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | +| main.rs:2279:32:2279:40 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | main.rs:2279:43:2279:44 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2280:9:2280:41 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2280:18:2280:26 | [...] | | {EXTERNAL LOCATION} | [;] | @@ -3447,10 +3348,13 @@ inferCertainType | main.rs:2283:18:2283:22 | vals1 | | {EXTERNAL LOCATION} | [;] | | main.rs:2283:24:2283:25 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2285:13:2285:17 | vals2 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2285:13:2285:17 | vals2 | TArray | {EXTERNAL LOCATION} | u16 | | main.rs:2285:21:2285:29 | [1u16; 3] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2285:21:2285:29 | [1u16; 3] | TArray | {EXTERNAL LOCATION} | u16 | | main.rs:2285:22:2285:25 | 1u16 | | {EXTERNAL LOCATION} | u16 | | main.rs:2286:9:2286:25 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2286:18:2286:22 | vals2 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2286:18:2286:22 | vals2 | TArray | {EXTERNAL LOCATION} | u16 | | main.rs:2286:24:2286:25 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2288:13:2288:17 | vals3 | | {EXTERNAL LOCATION} | [;] | | main.rs:2288:13:2288:17 | vals3 | TArray | {EXTERNAL LOCATION} | u32 | @@ -3476,10 +3380,12 @@ inferCertainType | main.rs:2294:43:2294:47 | "baz" | TRef | {EXTERNAL LOCATION} | str | | main.rs:2295:9:2295:29 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2295:18:2295:26 | &strings1 | | {EXTERNAL LOCATION} | & | +| main.rs:2295:18:2295:26 | &strings1 | TRef | {EXTERNAL LOCATION} | [;] | | main.rs:2295:19:2295:26 | strings1 | | {EXTERNAL LOCATION} | [;] | | main.rs:2295:28:2295:29 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2296:9:2296:33 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2296:18:2296:30 | &mut strings1 | | {EXTERNAL LOCATION} | &mut | +| main.rs:2296:18:2296:30 | &mut strings1 | TRefMut | {EXTERNAL LOCATION} | [;] | | main.rs:2296:23:2296:30 | strings1 | | {EXTERNAL LOCATION} | [;] | | main.rs:2296:32:2296:33 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2297:9:2297:28 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | @@ -3487,38 +3393,32 @@ inferCertainType | main.rs:2297:27:2297:28 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2299:13:2299:20 | strings2 | | {EXTERNAL LOCATION} | [;] | | main.rs:2300:9:2304:9 | [...] | | {EXTERNAL LOCATION} | [;] | -| main.rs:2301:13:2301:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | | main.rs:2301:26:2301:30 | "foo" | | {EXTERNAL LOCATION} | & | | main.rs:2301:26:2301:30 | "foo" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:2302:13:2302:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | | main.rs:2302:26:2302:30 | "bar" | | {EXTERNAL LOCATION} | & | | main.rs:2302:26:2302:30 | "bar" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:2303:13:2303:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | | main.rs:2303:26:2303:30 | "baz" | | {EXTERNAL LOCATION} | & | | main.rs:2303:26:2303:30 | "baz" | TRef | {EXTERNAL LOCATION} | str | | main.rs:2305:9:2305:28 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2305:18:2305:25 | strings2 | | {EXTERNAL LOCATION} | [;] | | main.rs:2305:27:2305:28 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2307:13:2307:20 | strings3 | | {EXTERNAL LOCATION} | & | +| main.rs:2307:13:2307:20 | strings3 | TRef | {EXTERNAL LOCATION} | [;] | | main.rs:2308:9:2312:9 | &... | | {EXTERNAL LOCATION} | & | +| main.rs:2308:9:2312:9 | &... | TRef | {EXTERNAL LOCATION} | [;] | | main.rs:2308:10:2312:9 | [...] | | {EXTERNAL LOCATION} | [;] | -| main.rs:2309:13:2309:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | | main.rs:2309:26:2309:30 | "foo" | | {EXTERNAL LOCATION} | & | | main.rs:2309:26:2309:30 | "foo" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:2310:13:2310:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | | main.rs:2310:26:2310:30 | "bar" | | {EXTERNAL LOCATION} | & | | main.rs:2310:26:2310:30 | "bar" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:2311:13:2311:31 | ...::from(...) | | {EXTERNAL LOCATION} | String | | main.rs:2311:26:2311:30 | "baz" | | {EXTERNAL LOCATION} | & | | main.rs:2311:26:2311:30 | "baz" | TRef | {EXTERNAL LOCATION} | str | | main.rs:2313:9:2313:28 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2313:18:2313:25 | strings3 | | {EXTERNAL LOCATION} | & | +| main.rs:2313:18:2313:25 | strings3 | TRef | {EXTERNAL LOCATION} | [;] | | main.rs:2313:27:2313:28 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2315:13:2315:21 | callables | | {EXTERNAL LOCATION} | [;] | | main.rs:2315:25:2315:81 | [...] | | {EXTERNAL LOCATION} | [;] | -| main.rs:2315:26:2315:42 | ...::new(...) | | main.rs:2263:5:2263:24 | MyCallable | -| main.rs:2315:45:2315:61 | ...::new(...) | | main.rs:2263:5:2263:24 | MyCallable | -| main.rs:2315:64:2315:80 | ...::new(...) | | main.rs:2263:5:2263:24 | MyCallable | | main.rs:2316:9:2320:9 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2317:12:2317:20 | callables | | {EXTERNAL LOCATION} | [;] | | main.rs:2318:9:2320:9 | { ... } | | {EXTERNAL LOCATION} | () | @@ -3527,6 +3427,7 @@ inferCertainType | main.rs:2324:24:2324:25 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2325:9:2325:29 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2325:18:2325:26 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2325:18:2325:26 | [...] | TArray | {EXTERNAL LOCATION} | Range | | main.rs:2325:19:2325:21 | 0u8 | | {EXTERNAL LOCATION} | u8 | | main.rs:2325:19:2325:25 | 0u8..10 | | {EXTERNAL LOCATION} | Range | | main.rs:2325:28:2325:29 | { ... } | | {EXTERNAL LOCATION} | () | @@ -3568,12 +3469,9 @@ inferCertainType | main.rs:2346:23:2346:26 | 1u16 | | {EXTERNAL LOCATION} | u16 | | main.rs:2347:9:2347:26 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2347:25:2347:26 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2349:13:2349:17 | vals5 | | {EXTERNAL LOCATION} | Vec | -| main.rs:2349:21:2349:43 | ...::from(...) | | {EXTERNAL LOCATION} | Vec | | main.rs:2349:31:2349:42 | [...] | | {EXTERNAL LOCATION} | [;] | | main.rs:2349:32:2349:35 | 1u32 | | {EXTERNAL LOCATION} | u32 | | main.rs:2350:9:2350:25 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2350:18:2350:22 | vals5 | | {EXTERNAL LOCATION} | Vec | | main.rs:2350:24:2350:25 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2352:13:2352:17 | vals6 | | {EXTERNAL LOCATION} | Vec | | main.rs:2352:13:2352:17 | vals6 | A | {EXTERNAL LOCATION} | Global | @@ -3587,73 +3485,34 @@ inferCertainType | main.rs:2353:18:2353:22 | vals6 | T | {EXTERNAL LOCATION} | & | | main.rs:2353:18:2353:22 | vals6 | T.TRef | {EXTERNAL LOCATION} | u64 | | main.rs:2353:24:2353:25 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2355:17:2355:21 | vals7 | | {EXTERNAL LOCATION} | Vec | -| main.rs:2355:17:2355:21 | vals7 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2355:25:2355:34 | ...::new(...) | | {EXTERNAL LOCATION} | Vec | -| main.rs:2355:25:2355:34 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2356:9:2356:13 | vals7 | | {EXTERNAL LOCATION} | Vec | -| main.rs:2356:9:2356:13 | vals7 | A | {EXTERNAL LOCATION} | Global | | main.rs:2356:20:2356:22 | 1u8 | | {EXTERNAL LOCATION} | u8 | | main.rs:2357:9:2357:25 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2357:18:2357:22 | vals7 | | {EXTERNAL LOCATION} | Vec | -| main.rs:2357:18:2357:22 | vals7 | A | {EXTERNAL LOCATION} | Global | | main.rs:2357:24:2357:25 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2361:17:2364:9 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2361:36:2364:9 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2362:13:2363:13 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2362:29:2363:13 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2366:17:2366:20 | map1 | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2366:17:2366:20 | map1 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2366:17:2366:20 | map1 | S | {EXTERNAL LOCATION} | RandomState | -| main.rs:2366:24:2366:55 | ...::new(...) | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2366:24:2366:55 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2366:24:2366:55 | ...::new(...) | S | {EXTERNAL LOCATION} | RandomState | -| main.rs:2367:9:2367:12 | map1 | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2367:9:2367:12 | map1 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2367:9:2367:12 | map1 | S | {EXTERNAL LOCATION} | RandomState | -| main.rs:2367:24:2367:38 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| main.rs:2367:24:2367:38 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | | main.rs:2367:33:2367:37 | "one" | | {EXTERNAL LOCATION} | & | | main.rs:2367:33:2367:37 | "one" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:2368:9:2368:12 | map1 | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2368:9:2368:12 | map1 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2368:9:2368:12 | map1 | S | {EXTERNAL LOCATION} | RandomState | -| main.rs:2368:24:2368:38 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| main.rs:2368:24:2368:38 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | | main.rs:2368:33:2368:37 | "two" | | {EXTERNAL LOCATION} | & | | main.rs:2368:33:2368:37 | "two" | TRef | {EXTERNAL LOCATION} | str | | main.rs:2369:9:2369:33 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2369:20:2369:23 | map1 | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2369:20:2369:23 | map1 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2369:20:2369:23 | map1 | S | {EXTERNAL LOCATION} | RandomState | | main.rs:2369:32:2369:33 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2370:9:2370:37 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2370:22:2370:25 | map1 | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2370:22:2370:25 | map1 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2370:22:2370:25 | map1 | S | {EXTERNAL LOCATION} | RandomState | | main.rs:2370:36:2370:37 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2371:9:2371:42 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2371:13:2371:24 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | -| main.rs:2371:29:2371:32 | map1 | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2371:29:2371:32 | map1 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2371:29:2371:32 | map1 | S | {EXTERNAL LOCATION} | RandomState | | main.rs:2371:41:2371:42 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2372:9:2372:36 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2372:13:2372:24 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | | main.rs:2372:29:2372:33 | &map1 | | {EXTERNAL LOCATION} | & | -| main.rs:2372:30:2372:33 | map1 | | {EXTERNAL LOCATION} | HashMap | -| main.rs:2372:30:2372:33 | map1 | A | {EXTERNAL LOCATION} | Global | -| main.rs:2372:30:2372:33 | map1 | S | {EXTERNAL LOCATION} | RandomState | | main.rs:2372:35:2372:36 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2376:17:2376:17 | a | | {EXTERNAL LOCATION} | i64 | | main.rs:2378:17:2381:9 | while ... { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2378:23:2378:23 | a | | {EXTERNAL LOCATION} | i64 | | main.rs:2379:9:2381:9 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2380:13:2380:13 | a | | {EXTERNAL LOCATION} | i64 | -| main.rs:2392:40:2394:9 | { ... } | | {EXTERNAL LOCATION} | Option | -| main.rs:2392:40:2394:9 | { ... } | T | main.rs:2386:5:2386:20 | S1 | -| main.rs:2392:40:2394:9 | { ... } | T.T | main.rs:2391:10:2391:19 | T | -| main.rs:2396:30:2398:9 | { ... } | | main.rs:2386:5:2386:20 | S1 | -| main.rs:2396:30:2398:9 | { ... } | T | main.rs:2391:10:2391:19 | T | +| main.rs:2380:13:2380:18 | ... += ... | | {EXTERNAL LOCATION} | () | | main.rs:2400:19:2400:22 | SelfParam | | main.rs:2386:5:2386:20 | S1 | | main.rs:2400:19:2400:22 | SelfParam | T | main.rs:2391:10:2391:19 | T | | main.rs:2400:33:2402:9 | { ... } | | main.rs:2386:5:2386:20 | S1 | @@ -3667,31 +3526,6 @@ inferCertainType | main.rs:2418:13:2418:14 | x1 | | {EXTERNAL LOCATION} | Option | | main.rs:2418:13:2418:14 | x1 | T | main.rs:2386:5:2386:20 | S1 | | main.rs:2418:13:2418:14 | x1 | T.T | main.rs:2388:5:2389:14 | S2 | -| main.rs:2418:34:2418:48 | ...::assoc_fun(...) | | {EXTERNAL LOCATION} | Option | -| main.rs:2418:34:2418:48 | ...::assoc_fun(...) | T | main.rs:2386:5:2386:20 | S1 | -| main.rs:2419:13:2419:14 | x2 | | {EXTERNAL LOCATION} | Option | -| main.rs:2419:13:2419:14 | x2 | T | main.rs:2386:5:2386:20 | S1 | -| main.rs:2419:13:2419:14 | x2 | T.T | main.rs:2388:5:2389:14 | S2 | -| main.rs:2419:18:2419:38 | ...::assoc_fun(...) | | {EXTERNAL LOCATION} | Option | -| main.rs:2419:18:2419:38 | ...::assoc_fun(...) | T | main.rs:2386:5:2386:20 | S1 | -| main.rs:2419:18:2419:38 | ...::assoc_fun(...) | T.T | main.rs:2388:5:2389:14 | S2 | -| main.rs:2420:13:2420:14 | x3 | | {EXTERNAL LOCATION} | Option | -| main.rs:2420:13:2420:14 | x3 | T | main.rs:2386:5:2386:20 | S1 | -| main.rs:2420:13:2420:14 | x3 | T.T | main.rs:2388:5:2389:14 | S2 | -| main.rs:2420:18:2420:32 | ...::assoc_fun(...) | | {EXTERNAL LOCATION} | Option | -| main.rs:2420:18:2420:32 | ...::assoc_fun(...) | T | main.rs:2386:5:2386:20 | S1 | -| main.rs:2420:18:2420:32 | ...::assoc_fun(...) | T.T | main.rs:2388:5:2389:14 | S2 | -| main.rs:2421:13:2421:14 | x4 | | main.rs:2386:5:2386:20 | S1 | -| main.rs:2421:13:2421:14 | x4 | T | main.rs:2388:5:2389:14 | S2 | -| main.rs:2421:18:2421:48 | ...::method(...) | | main.rs:2386:5:2386:20 | S1 | -| main.rs:2421:18:2421:48 | ...::method(...) | T | main.rs:2388:5:2389:14 | S2 | -| main.rs:2421:35:2421:47 | ...::default(...) | | main.rs:2386:5:2386:20 | S1 | -| main.rs:2422:13:2422:14 | x5 | | main.rs:2386:5:2386:20 | S1 | -| main.rs:2422:13:2422:14 | x5 | T | main.rs:2388:5:2389:14 | S2 | -| main.rs:2422:18:2422:42 | ...::method(...) | | main.rs:2386:5:2386:20 | S1 | -| main.rs:2422:18:2422:42 | ...::method(...) | T | main.rs:2388:5:2389:14 | S2 | -| main.rs:2422:29:2422:41 | ...::default(...) | | main.rs:2386:5:2386:20 | S1 | -| main.rs:2426:21:2426:33 | ...::default(...) | | main.rs:2388:5:2389:14 | S2 | | main.rs:2427:13:2427:15 | x10 | | main.rs:2409:5:2411:5 | S5 | | main.rs:2427:13:2427:15 | x10 | T5 | main.rs:2388:5:2389:14 | S2 | | main.rs:2427:19:2430:9 | S5::<...> {...} | | main.rs:2409:5:2411:5 | S5 | @@ -3702,52 +3536,16 @@ inferCertainType | main.rs:2432:19:2432:33 | S5 {...} | | main.rs:2409:5:2411:5 | S5 | | main.rs:2433:13:2433:15 | x13 | | main.rs:2409:5:2411:5 | S5 | | main.rs:2433:19:2436:9 | S5 {...} | | main.rs:2409:5:2411:5 | S5 | -| main.rs:2435:20:2435:32 | ...::default(...) | | main.rs:2388:5:2389:14 | S2 | -| main.rs:2437:13:2437:15 | x14 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2437:19:2437:48 | foo::<...>(...) | | {EXTERNAL LOCATION} | i32 | -| main.rs:2438:13:2438:15 | x15 | | main.rs:2386:5:2386:20 | S1 | -| main.rs:2438:13:2438:15 | x15 | T | main.rs:2388:5:2389:14 | S2 | -| main.rs:2438:19:2438:37 | ...::default(...) | | main.rs:2386:5:2386:20 | S1 | -| main.rs:2438:19:2438:37 | ...::default(...) | T | main.rs:2388:5:2389:14 | S2 | | main.rs:2447:35:2449:9 | { ... } | | {EXTERNAL LOCATION} | (T_2) | -| main.rs:2447:35:2449:9 | { ... } | T0 | main.rs:2443:5:2444:16 | S1 | -| main.rs:2447:35:2449:9 | { ... } | T1 | main.rs:2443:5:2444:16 | S1 | | main.rs:2448:13:2448:26 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | | main.rs:2448:14:2448:18 | S1 {...} | | main.rs:2443:5:2444:16 | S1 | | main.rs:2448:21:2448:25 | S1 {...} | | main.rs:2443:5:2444:16 | S1 | | main.rs:2450:16:2450:19 | SelfParam | | main.rs:2443:5:2444:16 | S1 | | main.rs:2450:22:2450:23 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2453:16:2487:5 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2454:13:2454:13 | a | | {EXTERNAL LOCATION} | (T_2) | -| main.rs:2454:13:2454:13 | a | T0 | main.rs:2443:5:2444:16 | S1 | -| main.rs:2454:13:2454:13 | a | T1 | main.rs:2443:5:2444:16 | S1 | -| main.rs:2454:17:2454:30 | ...::get_pair(...) | | {EXTERNAL LOCATION} | (T_2) | -| main.rs:2454:17:2454:30 | ...::get_pair(...) | T0 | main.rs:2443:5:2444:16 | S1 | -| main.rs:2454:17:2454:30 | ...::get_pair(...) | T1 | main.rs:2443:5:2444:16 | S1 | -| main.rs:2455:17:2455:17 | b | | {EXTERNAL LOCATION} | (T_2) | -| main.rs:2455:17:2455:17 | b | T0 | main.rs:2443:5:2444:16 | S1 | -| main.rs:2455:17:2455:17 | b | T1 | main.rs:2443:5:2444:16 | S1 | -| main.rs:2455:21:2455:34 | ...::get_pair(...) | | {EXTERNAL LOCATION} | (T_2) | -| main.rs:2455:21:2455:34 | ...::get_pair(...) | T0 | main.rs:2443:5:2444:16 | S1 | -| main.rs:2455:21:2455:34 | ...::get_pair(...) | T1 | main.rs:2443:5:2444:16 | S1 | | main.rs:2456:13:2456:18 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | -| main.rs:2456:22:2456:35 | ...::get_pair(...) | | {EXTERNAL LOCATION} | (T_2) | -| main.rs:2456:22:2456:35 | ...::get_pair(...) | T0 | main.rs:2443:5:2444:16 | S1 | -| main.rs:2456:22:2456:35 | ...::get_pair(...) | T1 | main.rs:2443:5:2444:16 | S1 | | main.rs:2457:13:2457:22 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | -| main.rs:2457:26:2457:39 | ...::get_pair(...) | | {EXTERNAL LOCATION} | (T_2) | -| main.rs:2457:26:2457:39 | ...::get_pair(...) | T0 | main.rs:2443:5:2444:16 | S1 | -| main.rs:2457:26:2457:39 | ...::get_pair(...) | T1 | main.rs:2443:5:2444:16 | S1 | | main.rs:2458:13:2458:26 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | -| main.rs:2458:30:2458:43 | ...::get_pair(...) | | {EXTERNAL LOCATION} | (T_2) | -| main.rs:2458:30:2458:43 | ...::get_pair(...) | T0 | main.rs:2443:5:2444:16 | S1 | -| main.rs:2458:30:2458:43 | ...::get_pair(...) | T1 | main.rs:2443:5:2444:16 | S1 | -| main.rs:2460:9:2460:9 | a | | {EXTERNAL LOCATION} | (T_2) | -| main.rs:2460:9:2460:9 | a | T0 | main.rs:2443:5:2444:16 | S1 | -| main.rs:2460:9:2460:9 | a | T1 | main.rs:2443:5:2444:16 | S1 | -| main.rs:2461:9:2461:9 | b | | {EXTERNAL LOCATION} | (T_2) | -| main.rs:2461:9:2461:9 | b | T0 | main.rs:2443:5:2444:16 | S1 | -| main.rs:2461:9:2461:9 | b | T1 | main.rs:2443:5:2444:16 | S1 | | main.rs:2474:13:2474:16 | pair | | {EXTERNAL LOCATION} | (T_2) | | main.rs:2474:20:2474:25 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | | main.rs:2475:13:2475:13 | i | | {EXTERNAL LOCATION} | i64 | @@ -3756,81 +3554,57 @@ inferCertainType | main.rs:2476:23:2476:26 | pair | | {EXTERNAL LOCATION} | (T_2) | | main.rs:2478:20:2478:25 | [...] | | {EXTERNAL LOCATION} | [;] | | main.rs:2480:13:2480:18 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | +| main.rs:2480:23:2480:42 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:2480:30:2480:41 | "unexpected" | | {EXTERNAL LOCATION} | & | | main.rs:2480:30:2480:41 | "unexpected" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:2480:30:2480:41 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | main.rs:2480:30:2480:41 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2481:18:2481:35 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:2481:25:2481:34 | "expected" | | {EXTERNAL LOCATION} | & | | main.rs:2481:25:2481:34 | "expected" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:2481:25:2481:34 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | main.rs:2481:25:2481:34 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2485:13:2485:13 | y | | {EXTERNAL LOCATION} | & | | main.rs:2485:17:2485:31 | &... | | {EXTERNAL LOCATION} | & | -| main.rs:2485:18:2485:31 | ...::get_pair(...) | | {EXTERNAL LOCATION} | (T_2) | -| main.rs:2485:18:2485:31 | ...::get_pair(...) | T0 | main.rs:2443:5:2444:16 | S1 | -| main.rs:2485:18:2485:31 | ...::get_pair(...) | T1 | main.rs:2443:5:2444:16 | S1 | | main.rs:2486:9:2486:9 | y | | {EXTERNAL LOCATION} | & | -| main.rs:2492:27:2514:5 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2493:13:2493:23 | boxed_value | | {EXTERNAL LOCATION} | Box | -| main.rs:2493:13:2493:23 | boxed_value | A | {EXTERNAL LOCATION} | Global | -| main.rs:2493:27:2493:42 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| main.rs:2493:27:2493:42 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | | main.rs:2493:36:2493:41 | 100i32 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2496:15:2496:25 | boxed_value | | {EXTERNAL LOCATION} | Box | -| main.rs:2496:15:2496:25 | boxed_value | A | {EXTERNAL LOCATION} | Global | | main.rs:2497:24:2499:13 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2498:17:2498:37 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:2498:26:2498:36 | "Boxed 100\\n" | | {EXTERNAL LOCATION} | & | | main.rs:2498:26:2498:36 | "Boxed 100\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:2498:26:2498:36 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2498:26:2498:36 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2498:26:2498:36 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2500:22:2503:13 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2502:17:2502:52 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:2502:26:2502:42 | "Boxed value: {}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:2502:26:2502:42 | "Boxed value: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:2502:26:2502:51 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | main.rs:2502:26:2502:51 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2507:13:2507:22 | nested_box | | {EXTERNAL LOCATION} | Box | -| main.rs:2507:13:2507:22 | nested_box | A | {EXTERNAL LOCATION} | Global | -| main.rs:2507:26:2507:50 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| main.rs:2507:26:2507:50 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2507:35:2507:49 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| main.rs:2507:35:2507:49 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2502:26:2502:51 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2507:44:2507:48 | 42i32 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2508:15:2508:24 | nested_box | | {EXTERNAL LOCATION} | Box | -| main.rs:2508:15:2508:24 | nested_box | A | {EXTERNAL LOCATION} | Global | | main.rs:2509:26:2512:13 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2511:17:2511:60 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:2511:26:2511:43 | "Nested boxed: {}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:2511:26:2511:43 | "Nested boxed: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:2511:26:2511:59 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2511:26:2511:59 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2511:26:2511:59 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2523:36:2525:9 | { ... } | | main.rs:2520:5:2520:22 | Path | | main.rs:2524:13:2524:19 | Path {...} | | main.rs:2520:5:2520:22 | Path | | main.rs:2527:29:2527:33 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:2527:29:2527:33 | SelfParam | TRef | main.rs:2520:5:2520:22 | Path | -| main.rs:2527:59:2529:9 | { ... } | | {EXTERNAL LOCATION} | Result | -| main.rs:2527:59:2529:9 | { ... } | E | {EXTERNAL LOCATION} | () | -| main.rs:2527:59:2529:9 | { ... } | T | main.rs:2532:5:2532:25 | PathBuf | -| main.rs:2528:16:2528:29 | ...::new(...) | | main.rs:2532:5:2532:25 | PathBuf | | main.rs:2535:39:2537:9 | { ... } | | main.rs:2532:5:2532:25 | PathBuf | | main.rs:2536:13:2536:22 | PathBuf {...} | | main.rs:2532:5:2532:25 | PathBuf | | main.rs:2545:18:2545:22 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:2545:18:2545:22 | SelfParam | TRef | main.rs:2532:5:2532:25 | PathBuf | | main.rs:2545:34:2549:9 | { ... } | | {EXTERNAL LOCATION} | & | | main.rs:2545:34:2549:9 | { ... } | TRef | main.rs:2520:5:2520:22 | Path | -| main.rs:2547:33:2547:43 | ...::new(...) | | main.rs:2520:5:2520:22 | Path | +| main.rs:2547:20:2547:23 | path | | main.rs:2520:5:2520:22 | Path | | main.rs:2548:13:2548:17 | &path | | {EXTERNAL LOCATION} | & | +| main.rs:2548:13:2548:17 | &path | TRef | main.rs:2520:5:2520:22 | Path | +| main.rs:2548:14:2548:17 | path | | main.rs:2520:5:2520:22 | Path | | main.rs:2552:16:2560:5 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2553:13:2553:17 | path1 | | main.rs:2520:5:2520:22 | Path | -| main.rs:2553:21:2553:31 | ...::new(...) | | main.rs:2520:5:2520:22 | Path | -| main.rs:2554:21:2554:25 | path1 | | main.rs:2520:5:2520:22 | Path | -| main.rs:2557:13:2557:20 | pathbuf1 | | main.rs:2532:5:2532:25 | PathBuf | -| main.rs:2557:24:2557:37 | ...::new(...) | | main.rs:2532:5:2532:25 | PathBuf | -| main.rs:2558:24:2558:31 | pathbuf1 | | main.rs:2532:5:2532:25 | PathBuf | | main.rs:2565:14:2565:18 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:2565:14:2565:18 | SelfParam | TRef | main.rs:2564:5:2566:5 | Self [trait MyTrait] | | main.rs:2572:14:2572:18 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:2572:14:2572:18 | SelfParam | TRef | main.rs:2568:5:2569:19 | S | | main.rs:2572:14:2572:18 | SelfParam | TRef.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2572:28:2574:9 | { ... } | | {EXTERNAL LOCATION} | i32 | | main.rs:2573:13:2573:16 | self | | {EXTERNAL LOCATION} | & | | main.rs:2573:13:2573:16 | self | TRef | main.rs:2568:5:2569:19 | S | | main.rs:2573:13:2573:16 | self | TRef.T | {EXTERNAL LOCATION} | i32 | @@ -3838,7 +3612,6 @@ inferCertainType | main.rs:2578:14:2578:18 | SelfParam | TRef | main.rs:2568:5:2569:19 | S | | main.rs:2578:14:2578:18 | SelfParam | TRef.T | main.rs:2568:5:2569:19 | S | | main.rs:2578:14:2578:18 | SelfParam | TRef.T.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2578:28:2580:9 | { ... } | | {EXTERNAL LOCATION} | i32 | | main.rs:2579:13:2579:16 | self | | {EXTERNAL LOCATION} | & | | main.rs:2579:13:2579:16 | self | TRef | main.rs:2568:5:2569:19 | S | | main.rs:2579:13:2579:16 | self | TRef.T | main.rs:2568:5:2569:19 | S | @@ -3846,53 +3619,40 @@ inferCertainType | main.rs:2584:15:2584:19 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:2584:15:2584:19 | SelfParam | TRef | main.rs:2568:5:2569:19 | S | | main.rs:2584:15:2584:19 | SelfParam | TRef.T | main.rs:2583:10:2583:16 | T | -| main.rs:2584:33:2586:9 | { ... } | | main.rs:2568:5:2569:19 | S | -| main.rs:2584:33:2586:9 | { ... } | T | main.rs:2568:5:2569:19 | S | -| main.rs:2584:33:2586:9 | { ... } | T.T | main.rs:2583:10:2583:16 | T | | main.rs:2585:17:2585:20 | self | | {EXTERNAL LOCATION} | & | | main.rs:2585:17:2585:20 | self | TRef | main.rs:2568:5:2569:19 | S | | main.rs:2585:17:2585:20 | self | TRef.T | main.rs:2583:10:2583:16 | T | | main.rs:2589:14:2589:14 | b | | {EXTERNAL LOCATION} | bool | -| main.rs:2589:48:2606:5 | { ... } | | {EXTERNAL LOCATION} | Box | -| main.rs:2589:48:2606:5 | { ... } | A | {EXTERNAL LOCATION} | Global | -| main.rs:2589:48:2606:5 | { ... } | T | main.rs:2564:5:2566:5 | dyn MyTrait | -| main.rs:2589:48:2606:5 | { ... } | T.dyn(T) | {EXTERNAL LOCATION} | i32 | | main.rs:2590:20:2590:20 | b | | {EXTERNAL LOCATION} | bool | | main.rs:2600:12:2600:12 | b | | {EXTERNAL LOCATION} | bool | -| main.rs:2602:13:2602:23 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| main.rs:2602:13:2602:23 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2604:13:2604:23 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| main.rs:2604:13:2604:23 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | | main.rs:2610:22:2614:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2611:18:2611:18 | x | | {EXTERNAL LOCATION} | i32 | -| main.rs:2611:33:2613:9 | { ... } | | {EXTERNAL LOCATION} | i32 | | main.rs:2612:13:2612:13 | x | | {EXTERNAL LOCATION} | i32 | | main.rs:2619:11:2619:14 | cond | | {EXTERNAL LOCATION} | bool | -| main.rs:2619:30:2627:5 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2621:13:2621:13 | a | | {EXTERNAL LOCATION} | () | +| main.rs:2621:17:2625:9 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2622:13:2624:13 | if cond {...} | | {EXTERNAL LOCATION} | () | | main.rs:2622:16:2622:19 | cond | | {EXTERNAL LOCATION} | bool | | main.rs:2622:21:2624:13 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2630:20:2637:5 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2635:9:2635:30 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:2635:18:2635:26 | "b: {:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:2635:18:2635:26 | "b: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:2635:18:2635:29 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | main.rs:2635:18:2635:29 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2639:20:2641:5 | { ... } | | {EXTERNAL LOCATION} | i32 | +| main.rs:2635:18:2635:29 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2644:11:2644:14 | cond | | {EXTERNAL LOCATION} | bool | -| main.rs:2644:30:2652:5 | { ... } | | {EXTERNAL LOCATION} | i32 | | main.rs:2645:13:2645:13 | a | | {EXTERNAL LOCATION} | () | | main.rs:2645:17:2649:9 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2646:13:2648:13 | if cond {...} | | {EXTERNAL LOCATION} | () | | main.rs:2646:16:2646:19 | cond | | {EXTERNAL LOCATION} | bool | | main.rs:2646:21:2648:13 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2650:9:2650:30 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:2650:18:2650:26 | "a: {:?}\\n" | | {EXTERNAL LOCATION} | & | | main.rs:2650:18:2650:26 | "a: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| main.rs:2650:18:2650:29 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2650:18:2650:29 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2650:18:2650:29 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2650:29:2650:29 | a | | {EXTERNAL LOCATION} | () | | main.rs:2660:14:2660:17 | SelfParam | | main.rs:2656:5:2657:13 | S | | main.rs:2660:20:2660:21 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2663:41:2665:5 | { ... } | | main.rs:2663:22:2663:31 | T | | main.rs:2667:16:2720:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2669:13:2669:13 | x | | {EXTERNAL LOCATION} | Option | | main.rs:2669:13:2669:13 | x | T | {EXTERNAL LOCATION} | i32 | @@ -3900,7 +3660,6 @@ inferCertainType | main.rs:2673:26:2673:28 | opt | T | main.rs:2673:23:2673:23 | T | | main.rs:2673:42:2673:42 | x | | main.rs:2673:23:2673:23 | T | | main.rs:2673:48:2673:49 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2676:9:2676:24 | pin_option(...) | | {EXTERNAL LOCATION} | () | | main.rs:2683:13:2683:13 | x | | main.rs:2678:9:2681:9 | MyEither | | main.rs:2683:17:2683:39 | ...::A {...} | | main.rs:2678:9:2681:9 | MyEither | | main.rs:2684:13:2684:13 | x | | main.rs:2678:9:2681:9 | MyEither | @@ -3915,7 +3674,6 @@ inferCertainType | main.rs:2687:13:2687:13 | x | T1 | {EXTERNAL LOCATION} | i32 | | main.rs:2687:17:2689:9 | ...::B::<...> {...} | | main.rs:2678:9:2681:9 | MyEither | | main.rs:2687:17:2689:9 | ...::B::<...> {...} | T1 | {EXTERNAL LOCATION} | i32 | -| main.rs:2688:20:2688:32 | ...::new(...) | | {EXTERNAL LOCATION} | String | | main.rs:2691:29:2691:29 | e | | main.rs:2678:9:2681:9 | MyEither | | main.rs:2691:29:2691:29 | e | T1 | main.rs:2691:26:2691:26 | T | | main.rs:2691:29:2691:29 | e | T2 | {EXTERNAL LOCATION} | String | @@ -3923,8 +3681,6 @@ inferCertainType | main.rs:2691:59:2691:60 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2694:13:2694:13 | x | | main.rs:2678:9:2681:9 | MyEither | | main.rs:2694:17:2696:9 | ...::B {...} | | main.rs:2678:9:2681:9 | MyEither | -| main.rs:2695:20:2695:32 | ...::new(...) | | {EXTERNAL LOCATION} | String | -| main.rs:2697:9:2697:27 | pin_my_either(...) | | {EXTERNAL LOCATION} | () | | main.rs:2697:23:2697:23 | x | | main.rs:2678:9:2681:9 | MyEither | | main.rs:2700:13:2700:13 | x | | {EXTERNAL LOCATION} | Result | | main.rs:2700:13:2700:13 | x | E | {EXTERNAL LOCATION} | String | @@ -3934,26 +3690,12 @@ inferCertainType | main.rs:2704:29:2704:31 | res | T | main.rs:2704:23:2704:23 | T | | main.rs:2704:48:2704:48 | x | | main.rs:2704:26:2704:26 | E | | main.rs:2704:54:2704:55 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2707:9:2707:28 | pin_result(...) | | {EXTERNAL LOCATION} | () | | main.rs:2707:23:2707:27 | false | | {EXTERNAL LOCATION} | bool | -| main.rs:2709:17:2709:17 | x | | {EXTERNAL LOCATION} | Vec | -| main.rs:2709:17:2709:17 | x | A | {EXTERNAL LOCATION} | Global | -| main.rs:2709:21:2709:30 | ...::new(...) | | {EXTERNAL LOCATION} | Vec | -| main.rs:2709:21:2709:30 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2710:9:2710:9 | x | | {EXTERNAL LOCATION} | Vec | -| main.rs:2710:9:2710:9 | x | A | {EXTERNAL LOCATION} | Global | -| main.rs:2713:9:2713:9 | x | | {EXTERNAL LOCATION} | Vec | -| main.rs:2713:9:2713:9 | x | A | {EXTERNAL LOCATION} | Global | -| main.rs:2716:9:2716:15 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2719:9:2719:9 | x | | {EXTERNAL LOCATION} | Vec | -| main.rs:2719:9:2719:9 | x | A | {EXTERNAL LOCATION} | Global | | main.rs:2726:14:2726:17 | SelfParam | | main.rs:2724:5:2732:5 | Self [trait MyTrait] | | main.rs:2729:14:2729:18 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:2729:14:2729:18 | SelfParam | TRef | main.rs:2724:5:2732:5 | Self [trait MyTrait] | | main.rs:2729:21:2729:25 | other | | {EXTERNAL LOCATION} | & | | main.rs:2729:21:2729:25 | other | TRef | main.rs:2724:5:2732:5 | Self [trait MyTrait] | -| main.rs:2729:44:2731:9 | { ... } | | {EXTERNAL LOCATION} | & | -| main.rs:2729:44:2731:9 | { ... } | TRef | main.rs:2724:5:2732:5 | Self [trait MyTrait] | | main.rs:2730:13:2730:16 | self | | {EXTERNAL LOCATION} | & | | main.rs:2730:13:2730:16 | self | TRef | main.rs:2724:5:2732:5 | Self [trait MyTrait] | | main.rs:2736:14:2736:17 | SelfParam | | {EXTERNAL LOCATION} | i32 | @@ -3968,7 +3710,7 @@ inferCertainType | main.rs:2750:28:2752:9 | { ... } | TRef | main.rs:2748:10:2748:10 | T | | main.rs:2751:13:2751:16 | self | | {EXTERNAL LOCATION} | & | | main.rs:2751:13:2751:16 | self | TRef | main.rs:2748:10:2748:10 | T | -| main.rs:2755:25:2759:5 | { ... } | | {EXTERNAL LOCATION} | usize | +| main.rs:2757:9:2757:17 | ... = ... | | {EXTERNAL LOCATION} | () | | main.rs:2761:12:2769:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2762:13:2762:13 | x | | {EXTERNAL LOCATION} | usize | | main.rs:2763:13:2763:13 | y | | {EXTERNAL LOCATION} | & | @@ -3981,25 +3723,24 @@ inferCertainType | main.rs:2783:22:2783:26 | SelfParam | TRef | main.rs:2782:5:2784:5 | Self [trait Container] | | main.rs:2786:34:2786:34 | c | | {EXTERNAL LOCATION} | & | | main.rs:2786:34:2786:34 | c | TRef | main.rs:2786:15:2786:31 | T | -| main.rs:2786:49:2788:5 | { ... } | | {EXTERNAL LOCATION} | bool | | main.rs:2787:9:2787:9 | c | | {EXTERNAL LOCATION} | & | | main.rs:2787:9:2787:9 | c | TRef | main.rs:2786:15:2786:31 | T | | main.rs:2791:22:2791:26 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:2791:22:2791:26 | SelfParam | TRef | main.rs:2780:5:2780:21 | Gen | | main.rs:2791:22:2791:26 | SelfParam | TRef.T | main.rs:2790:10:2790:17 | GT | -| main.rs:2791:35:2793:9 | { ... } | | main.rs:2790:10:2790:17 | GT | | main.rs:2792:13:2792:16 | self | | {EXTERNAL LOCATION} | & | | main.rs:2792:13:2792:16 | self | TRef | main.rs:2780:5:2780:21 | Gen | | main.rs:2792:13:2792:16 | self | TRef.T | main.rs:2790:10:2790:17 | GT | | main.rs:2796:15:2800:5 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2799:17:2799:26 | my_get(...) | | {EXTERNAL LOCATION} | bool | | main.rs:2799:24:2799:25 | &g | | {EXTERNAL LOCATION} | & | | main.rs:2803:18:2810:1 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2804:9:2804:12 | arr1 | | {EXTERNAL LOCATION} | [;] | | main.rs:2804:9:2804:12 | arr1 | TArray | {EXTERNAL LOCATION} | i32 | | main.rs:2804:26:2804:27 | [...] | | {EXTERNAL LOCATION} | [;] | | main.rs:2805:9:2805:12 | arr2 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2805:9:2805:12 | arr2 | TArray | {EXTERNAL LOCATION} | bool | | main.rs:2805:16:2805:24 | [true; 0] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2805:16:2805:24 | [true; 0] | TArray | {EXTERNAL LOCATION} | bool | | main.rs:2805:17:2805:20 | true | | {EXTERNAL LOCATION} | bool | | main.rs:2806:9:2806:12 | arr3 | | {EXTERNAL LOCATION} | [;] | | main.rs:2806:16:2806:17 | [...] | | {EXTERNAL LOCATION} | [;] | @@ -4007,51 +3748,11 @@ inferCertainType | main.rs:2808:21:2808:23 | arr | TArray | main.rs:2808:18:2808:18 | T | | main.rs:2808:34:2808:34 | x | | main.rs:2808:18:2808:18 | T | | main.rs:2808:40:2808:41 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2809:5:2809:22 | pin_array(...) | | {EXTERNAL LOCATION} | () | | main.rs:2809:15:2809:18 | arr3 | | {EXTERNAL LOCATION} | [;] | | main.rs:2812:11:2848:1 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2813:5:2813:21 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2814:5:2814:20 | ...::f(...) | | main.rs:72:5:72:21 | Foo | -| main.rs:2815:5:2815:60 | ...::g(...) | | main.rs:72:5:72:21 | Foo | | main.rs:2815:20:2815:38 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | | main.rs:2815:41:2815:59 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | -| main.rs:2816:5:2816:35 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2817:5:2817:41 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2818:5:2818:45 | ...::test(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2819:5:2819:30 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2820:5:2820:21 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2821:5:2821:27 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2822:5:2822:32 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2823:5:2823:23 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2824:5:2824:36 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2825:5:2825:35 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2826:5:2826:29 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2827:5:2827:23 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2828:5:2828:24 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2829:5:2829:17 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2830:5:2830:18 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2831:5:2831:15 | ...::f(...) | | {EXTERNAL LOCATION} | dyn Future | -| main.rs:2831:5:2831:15 | ...::f(...) | dyn(Output) | {EXTERNAL LOCATION} | () | -| main.rs:2832:5:2832:19 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2833:5:2833:17 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2834:5:2834:14 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2835:5:2835:27 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2836:5:2836:15 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2837:5:2837:43 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2838:5:2838:15 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2839:5:2839:17 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2840:5:2840:28 | ...::test(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2841:5:2841:23 | ...::test(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2842:5:2842:41 | ...::test_all_patterns(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2843:5:2843:49 | ...::box_patterns(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2844:5:2844:20 | ...::test(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2845:5:2845:20 | ...::f(...) | | {EXTERNAL LOCATION} | Box | -| main.rs:2845:5:2845:20 | ...::f(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2845:5:2845:20 | ...::f(...) | T | main.rs:2564:5:2566:5 | dyn MyTrait | -| main.rs:2845:5:2845:20 | ...::f(...) | T.dyn(T) | {EXTERNAL LOCATION} | i32 | | main.rs:2845:16:2845:19 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:2846:5:2846:23 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2847:5:2847:17 | empty_array(...) | | {EXTERNAL LOCATION} | () | | overloading.rs:4:19:4:23 | SelfParam | | {EXTERNAL LOCATION} | & | | overloading.rs:4:19:4:23 | SelfParam | TRef | overloading.rs:2:5:11:5 | Self [trait FirstTrait] | | overloading.rs:4:34:6:9 | { ... } | | {EXTERNAL LOCATION} | bool | @@ -4060,7 +3761,6 @@ inferCertainType | overloading.rs:8:20:8:24 | SelfParam | TRef | overloading.rs:2:5:11:5 | Self [trait FirstTrait] | | overloading.rs:14:19:14:23 | SelfParam | | {EXTERNAL LOCATION} | & | | overloading.rs:14:19:14:23 | SelfParam | TRef | overloading.rs:12:5:19:5 | Self [trait SecondTrait] | -| overloading.rs:14:33:16:9 | { ... } | | {EXTERNAL LOCATION} | i64 | | overloading.rs:18:20:18:24 | SelfParam | | {EXTERNAL LOCATION} | & | | overloading.rs:18:20:18:24 | SelfParam | TRef | overloading.rs:12:5:19:5 | Self [trait SecondTrait] | | overloading.rs:24:20:24:24 | SelfParam | | {EXTERNAL LOCATION} | & | @@ -4071,7 +3771,6 @@ inferCertainType | overloading.rs:30:13:30:16 | true | | {EXTERNAL LOCATION} | bool | | overloading.rs:35:20:35:24 | SelfParam | | {EXTERNAL LOCATION} | & | | overloading.rs:35:20:35:24 | SelfParam | TRef | overloading.rs:20:5:21:13 | S | -| overloading.rs:35:34:37:9 | { ... } | | {EXTERNAL LOCATION} | i64 | | overloading.rs:43:20:43:24 | SelfParam | | {EXTERNAL LOCATION} | & | | overloading.rs:43:20:43:24 | SelfParam | TRef | overloading.rs:40:5:40:14 | S2 | | overloading.rs:43:35:45:9 | { ... } | | {EXTERNAL LOCATION} | bool | @@ -4079,46 +3778,22 @@ inferCertainType | overloading.rs:48:31:50:9 | { ... } | | {EXTERNAL LOCATION} | bool | | overloading.rs:49:13:49:17 | false | | {EXTERNAL LOCATION} | bool | | overloading.rs:53:16:70:5 | { ... } | | {EXTERNAL LOCATION} | () | -| overloading.rs:56:13:56:15 | _b1 | | {EXTERNAL LOCATION} | bool | -| overloading.rs:56:19:56:40 | ...::method(...) | | {EXTERNAL LOCATION} | bool | | overloading.rs:56:38:56:39 | &s | | {EXTERNAL LOCATION} | & | -| overloading.rs:57:13:57:15 | _b2 | | {EXTERNAL LOCATION} | bool | -| overloading.rs:57:19:57:47 | ...::method(...) | | {EXTERNAL LOCATION} | bool | | overloading.rs:57:45:57:46 | &s | | {EXTERNAL LOCATION} | & | -| overloading.rs:58:13:58:15 | _b3 | | {EXTERNAL LOCATION} | bool | -| overloading.rs:58:19:58:64 | ...::method(...) | | {EXTERNAL LOCATION} | bool | | overloading.rs:58:45:58:63 | &... | | {EXTERNAL LOCATION} | & | -| overloading.rs:59:13:59:15 | _b4 | | {EXTERNAL LOCATION} | bool | -| overloading.rs:59:19:59:48 | ...::method2(...) | | {EXTERNAL LOCATION} | bool | | overloading.rs:59:46:59:47 | &s | | {EXTERNAL LOCATION} | & | -| overloading.rs:60:13:60:15 | _b5 | | {EXTERNAL LOCATION} | bool | -| overloading.rs:60:19:60:65 | ...::method2(...) | | {EXTERNAL LOCATION} | bool | | overloading.rs:60:46:60:64 | &... | | {EXTERNAL LOCATION} | & | -| overloading.rs:62:13:62:15 | _n1 | | {EXTERNAL LOCATION} | i64 | -| overloading.rs:62:19:62:41 | ...::method(...) | | {EXTERNAL LOCATION} | i64 | | overloading.rs:62:39:62:40 | &s | | {EXTERNAL LOCATION} | & | -| overloading.rs:63:13:63:15 | _n2 | | {EXTERNAL LOCATION} | i64 | -| overloading.rs:63:19:63:48 | ...::method(...) | | {EXTERNAL LOCATION} | i64 | | overloading.rs:63:46:63:47 | &s | | {EXTERNAL LOCATION} | & | -| overloading.rs:64:13:64:15 | _n3 | | {EXTERNAL LOCATION} | i64 | -| overloading.rs:64:19:64:65 | ...::method(...) | | {EXTERNAL LOCATION} | i64 | | overloading.rs:64:46:64:64 | &... | | {EXTERNAL LOCATION} | & | -| overloading.rs:65:13:65:15 | _n4 | | {EXTERNAL LOCATION} | i64 | -| overloading.rs:65:19:65:49 | ...::method2(...) | | {EXTERNAL LOCATION} | i64 | | overloading.rs:65:47:65:48 | &s | | {EXTERNAL LOCATION} | & | -| overloading.rs:66:13:66:15 | _n5 | | {EXTERNAL LOCATION} | i64 | -| overloading.rs:66:19:66:66 | ...::method2(...) | | {EXTERNAL LOCATION} | i64 | | overloading.rs:66:47:66:65 | &... | | {EXTERNAL LOCATION} | & | -| overloading.rs:68:9:68:37 | ...::function(...) | | {EXTERNAL LOCATION} | bool | -| overloading.rs:69:9:69:38 | ...::function(...) | | {EXTERNAL LOCATION} | bool | | overloading.rs:78:26:78:29 | SelfParam | | overloading.rs:77:5:81:5 | Self [trait OverlappingTrait] | | overloading.rs:80:28:80:31 | SelfParam | | overloading.rs:77:5:81:5 | Self [trait OverlappingTrait] | | overloading.rs:80:34:80:35 | s1 | | overloading.rs:74:5:75:14 | S1 | | overloading.rs:85:26:85:29 | SelfParam | | overloading.rs:74:5:75:14 | S1 | -| overloading.rs:85:38:87:9 | { ... } | | overloading.rs:74:5:75:14 | S1 | | overloading.rs:90:28:90:31 | SelfParam | | overloading.rs:74:5:75:14 | S1 | | overloading.rs:90:34:90:35 | s1 | | overloading.rs:74:5:75:14 | S1 | -| overloading.rs:90:48:92:9 | { ... } | | overloading.rs:74:5:75:14 | S1 | | overloading.rs:97:26:97:29 | SelfParam | | overloading.rs:74:5:75:14 | S1 | | overloading.rs:97:38:99:9 | { ... } | | overloading.rs:74:5:75:14 | S1 | | overloading.rs:98:13:98:16 | self | | overloading.rs:74:5:75:14 | S1 | @@ -4127,24 +3802,18 @@ inferCertainType | overloading.rs:103:13:103:16 | self | | overloading.rs:74:5:75:14 | S1 | | overloading.rs:111:26:111:29 | SelfParam | | overloading.rs:107:5:107:22 | S2 | | overloading.rs:111:26:111:29 | SelfParam | T2 | {EXTERNAL LOCATION} | i32 | -| overloading.rs:111:38:113:9 | { ... } | | overloading.rs:74:5:75:14 | S1 | | overloading.rs:116:28:116:31 | SelfParam | | overloading.rs:107:5:107:22 | S2 | | overloading.rs:116:28:116:31 | SelfParam | T2 | {EXTERNAL LOCATION} | i32 | -| overloading.rs:116:40:118:9 | { ... } | | overloading.rs:74:5:75:14 | S1 | | overloading.rs:123:26:123:29 | SelfParam | | overloading.rs:107:5:107:22 | S2 | | overloading.rs:123:26:123:29 | SelfParam | T2 | {EXTERNAL LOCATION} | i32 | -| overloading.rs:123:38:125:9 | { ... } | | overloading.rs:74:5:75:14 | S1 | | overloading.rs:128:28:128:31 | SelfParam | | overloading.rs:107:5:107:22 | S2 | | overloading.rs:128:28:128:31 | SelfParam | T2 | {EXTERNAL LOCATION} | i32 | | overloading.rs:128:34:128:35 | s1 | | overloading.rs:74:5:75:14 | S1 | -| overloading.rs:128:48:130:9 | { ... } | | overloading.rs:74:5:75:14 | S1 | | overloading.rs:135:26:135:29 | SelfParam | | overloading.rs:107:5:107:22 | S2 | | overloading.rs:135:26:135:29 | SelfParam | T2 | overloading.rs:74:5:75:14 | S1 | -| overloading.rs:135:38:137:9 | { ... } | | overloading.rs:74:5:75:14 | S1 | | overloading.rs:140:28:140:31 | SelfParam | | overloading.rs:107:5:107:22 | S2 | | overloading.rs:140:28:140:31 | SelfParam | T2 | overloading.rs:74:5:75:14 | S1 | | overloading.rs:140:34:140:35 | s1 | | overloading.rs:74:5:75:14 | S1 | -| overloading.rs:140:48:142:9 | { ... } | | overloading.rs:74:5:75:14 | S1 | | overloading.rs:149:14:149:18 | SelfParam | | {EXTERNAL LOCATION} | & | | overloading.rs:149:14:149:18 | SelfParam | TRef | overloading.rs:148:5:150:5 | Self [trait OverlappingTrait2] | | overloading.rs:149:21:149:21 | x | | {EXTERNAL LOCATION} | & | @@ -4181,84 +3850,81 @@ inferCertainType | overloading.rs:188:14:188:18 | SelfParam | TRef.T5 | {EXTERNAL LOCATION} | i32 | | overloading.rs:188:21:188:22 | { ... } | | {EXTERNAL LOCATION} | () | | overloading.rs:197:16:223:5 | { ... } | | {EXTERNAL LOCATION} | () | +| overloading.rs:199:9:199:43 | MacroExpr | | {EXTERNAL LOCATION} | () | | overloading.rs:199:18:199:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | overloading.rs:199:18:199:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| overloading.rs:199:18:199:42 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | overloading.rs:199:18:199:42 | { ... } | | {EXTERNAL LOCATION} | () | +| overloading.rs:199:18:199:42 | { ... } | | {EXTERNAL LOCATION} | () | +| overloading.rs:200:9:200:46 | MacroExpr | | {EXTERNAL LOCATION} | () | | overloading.rs:200:18:200:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | overloading.rs:200:18:200:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| overloading.rs:200:18:200:45 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | overloading.rs:200:18:200:45 | { ... } | | {EXTERNAL LOCATION} | () | -| overloading.rs:200:26:200:45 | ...::common_method(...) | | overloading.rs:74:5:75:14 | S1 | +| overloading.rs:200:18:200:45 | { ... } | | {EXTERNAL LOCATION} | () | +| overloading.rs:201:9:201:45 | MacroExpr | | {EXTERNAL LOCATION} | () | | overloading.rs:201:18:201:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | overloading.rs:201:18:201:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| overloading.rs:201:18:201:44 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | overloading.rs:201:18:201:44 | { ... } | | {EXTERNAL LOCATION} | () | +| overloading.rs:201:18:201:44 | { ... } | | {EXTERNAL LOCATION} | () | +| overloading.rs:202:9:202:48 | MacroExpr | | {EXTERNAL LOCATION} | () | | overloading.rs:202:18:202:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | overloading.rs:202:18:202:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| overloading.rs:202:18:202:47 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | overloading.rs:202:18:202:47 | { ... } | | {EXTERNAL LOCATION} | () | -| overloading.rs:202:26:202:47 | ...::common_method_2(...) | | overloading.rs:74:5:75:14 | S1 | +| overloading.rs:202:18:202:47 | { ... } | | {EXTERNAL LOCATION} | () | +| overloading.rs:205:9:205:43 | MacroExpr | | {EXTERNAL LOCATION} | () | | overloading.rs:205:18:205:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | overloading.rs:205:18:205:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| overloading.rs:205:18:205:42 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | overloading.rs:205:18:205:42 | { ... } | | {EXTERNAL LOCATION} | () | +| overloading.rs:205:18:205:42 | { ... } | | {EXTERNAL LOCATION} | () | +| overloading.rs:206:9:206:57 | MacroExpr | | {EXTERNAL LOCATION} | () | | overloading.rs:206:18:206:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | overloading.rs:206:18:206:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| overloading.rs:206:18:206:56 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | overloading.rs:206:18:206:56 | { ... } | | {EXTERNAL LOCATION} | () | -| overloading.rs:206:26:206:56 | ...::common_method(...) | | overloading.rs:74:5:75:14 | S1 | +| overloading.rs:206:18:206:56 | { ... } | | {EXTERNAL LOCATION} | () | +| overloading.rs:209:9:209:43 | MacroExpr | | {EXTERNAL LOCATION} | () | | overloading.rs:209:18:209:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | overloading.rs:209:18:209:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| overloading.rs:209:18:209:42 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | overloading.rs:209:18:209:42 | { ... } | | {EXTERNAL LOCATION} | () | +| overloading.rs:209:18:209:42 | { ... } | | {EXTERNAL LOCATION} | () | +| overloading.rs:210:9:210:50 | MacroExpr | | {EXTERNAL LOCATION} | () | | overloading.rs:210:18:210:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | overloading.rs:210:18:210:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| overloading.rs:210:18:210:49 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | overloading.rs:210:18:210:49 | { ... } | | {EXTERNAL LOCATION} | () | -| overloading.rs:210:26:210:49 | ...::common_method(...) | | overloading.rs:74:5:75:14 | S1 | +| overloading.rs:210:18:210:49 | { ... } | | {EXTERNAL LOCATION} | () | +| overloading.rs:211:9:211:57 | MacroExpr | | {EXTERNAL LOCATION} | () | | overloading.rs:211:18:211:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | overloading.rs:211:18:211:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| overloading.rs:211:18:211:56 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | overloading.rs:211:18:211:56 | { ... } | | {EXTERNAL LOCATION} | () | -| overloading.rs:211:26:211:56 | ...::common_method(...) | | overloading.rs:74:5:75:14 | S1 | +| overloading.rs:211:18:211:56 | { ... } | | {EXTERNAL LOCATION} | () | +| overloading.rs:214:9:214:32 | MacroExpr | | {EXTERNAL LOCATION} | () | | overloading.rs:214:18:214:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | overloading.rs:214:18:214:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| overloading.rs:214:18:214:31 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | overloading.rs:214:18:214:31 | { ... } | | {EXTERNAL LOCATION} | () | +| overloading.rs:214:18:214:31 | { ... } | | {EXTERNAL LOCATION} | () | +| overloading.rs:215:9:215:38 | MacroExpr | | {EXTERNAL LOCATION} | () | | overloading.rs:215:18:215:23 | "{:?}\\n" | | {EXTERNAL LOCATION} | & | | overloading.rs:215:18:215:23 | "{:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| overloading.rs:215:18:215:37 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | overloading.rs:215:18:215:37 | { ... } | | {EXTERNAL LOCATION} | () | -| overloading.rs:215:26:215:37 | ...::m(...) | | {EXTERNAL LOCATION} | & | -| overloading.rs:215:26:215:37 | ...::m(...) | TRef | overloading.rs:145:5:146:22 | S3 | +| overloading.rs:215:18:215:37 | { ... } | | {EXTERNAL LOCATION} | () | | overloading.rs:215:32:215:33 | &w | | {EXTERNAL LOCATION} | & | -| overloading.rs:218:9:218:18 | ...::m(...) | | {EXTERNAL LOCATION} | () | | overloading.rs:218:15:218:17 | &S4 | | {EXTERNAL LOCATION} | & | | overloading.rs:219:12:219:15 | 0i32 | | {EXTERNAL LOCATION} | i32 | -| overloading.rs:220:9:220:24 | ...::m(...) | | {EXTERNAL LOCATION} | () | | overloading.rs:220:15:220:23 | &... | | {EXTERNAL LOCATION} | & | | overloading.rs:220:19:220:22 | 0i32 | | {EXTERNAL LOCATION} | i32 | | overloading.rs:221:12:221:15 | true | | {EXTERNAL LOCATION} | bool | -| overloading.rs:222:9:222:24 | ...::m(...) | | {EXTERNAL LOCATION} | () | | overloading.rs:222:15:222:23 | &... | | {EXTERNAL LOCATION} | & | | overloading.rs:222:19:222:22 | true | | {EXTERNAL LOCATION} | bool | | overloading.rs:228:14:228:17 | SelfParam | | overloading.rs:227:5:229:5 | Self [trait Trait1] | | overloading.rs:228:20:228:20 | x | | overloading.rs:227:18:227:19 | T1 | | overloading.rs:233:14:233:17 | SelfParam | | {EXTERNAL LOCATION} | i32 | | overloading.rs:233:20:233:20 | x | | {EXTERNAL LOCATION} | i32 | -| overloading.rs:233:35:235:9 | { ... } | | {EXTERNAL LOCATION} | i32 | | overloading.rs:240:14:240:17 | SelfParam | | {EXTERNAL LOCATION} | i32 | | overloading.rs:240:20:240:20 | x | | {EXTERNAL LOCATION} | i64 | -| overloading.rs:240:35:242:9 | { ... } | | {EXTERNAL LOCATION} | i64 | | overloading.rs:246:14:246:17 | SelfParam | | overloading.rs:245:5:247:5 | Self [trait Trait2] | | overloading.rs:246:20:246:20 | x | | overloading.rs:245:18:245:19 | T1 | | overloading.rs:251:14:251:17 | SelfParam | | {EXTERNAL LOCATION} | i32 | | overloading.rs:251:20:251:20 | x | | {EXTERNAL LOCATION} | i32 | -| overloading.rs:251:35:253:9 | { ... } | | {EXTERNAL LOCATION} | i32 | | overloading.rs:258:14:258:17 | SelfParam | | {EXTERNAL LOCATION} | i32 | | overloading.rs:258:20:258:20 | x | | {EXTERNAL LOCATION} | i32 | -| overloading.rs:258:35:260:9 | { ... } | | {EXTERNAL LOCATION} | i64 | | overloading.rs:263:12:270:5 | { ... } | | {EXTERNAL LOCATION} | () | | overloading.rs:265:21:265:24 | 0i32 | | {EXTERNAL LOCATION} | i32 | | overloading.rs:266:13:266:13 | z | | {EXTERNAL LOCATION} | i32 | @@ -4266,11 +3932,9 @@ inferCertainType | overloading.rs:268:13:268:13 | z | | {EXTERNAL LOCATION} | i64 | | overloading.rs:269:13:269:13 | z | | {EXTERNAL LOCATION} | i64 | | overloading.rs:269:26:269:29 | 0i32 | | {EXTERNAL LOCATION} | i32 | -| overloading.rs:286:35:288:9 | { ... } | | {EXTERNAL LOCATION} | i32 | | overloading.rs:295:35:297:9 | { ... } | | {EXTERNAL LOCATION} | bool | | overloading.rs:296:13:296:16 | true | | {EXTERNAL LOCATION} | bool | | overloading.rs:302:14:302:14 | x | | {EXTERNAL LOCATION} | i32 | -| overloading.rs:302:29:304:9 | { ... } | | {EXTERNAL LOCATION} | i32 | | overloading.rs:309:14:309:14 | x | | {EXTERNAL LOCATION} | bool | | overloading.rs:309:31:311:9 | { ... } | | {EXTERNAL LOCATION} | bool | | overloading.rs:310:13:310:16 | true | | {EXTERNAL LOCATION} | bool | @@ -4279,36 +3943,22 @@ inferCertainType | overloading.rs:330:14:330:17 | SelfParam | | overloading.rs:327:5:331:5 | Self [trait MyTrait] | | overloading.rs:334:14:334:17 | SelfParam | | overloading.rs:325:5:325:25 | S | | overloading.rs:334:14:334:17 | SelfParam | T | {EXTERNAL LOCATION} | i64 | -| overloading.rs:334:27:336:9 | { ... } | | {EXTERNAL LOCATION} | i64 | | overloading.rs:335:13:335:16 | self | | overloading.rs:325:5:325:25 | S | | overloading.rs:335:13:335:16 | self | T | {EXTERNAL LOCATION} | i64 | | overloading.rs:338:14:338:17 | SelfParam | | overloading.rs:325:5:325:25 | S | | overloading.rs:338:14:338:17 | SelfParam | T | {EXTERNAL LOCATION} | i64 | -| overloading.rs:338:27:340:9 | { ... } | | {EXTERNAL LOCATION} | i64 | | overloading.rs:339:13:339:16 | self | | overloading.rs:325:5:325:25 | S | | overloading.rs:339:13:339:16 | self | T | {EXTERNAL LOCATION} | i64 | | overloading.rs:344:14:344:17 | SelfParam | | overloading.rs:325:5:325:25 | S | | overloading.rs:344:14:344:17 | SelfParam | T | {EXTERNAL LOCATION} | bool | -| overloading.rs:344:28:346:9 | { ... } | | {EXTERNAL LOCATION} | bool | | overloading.rs:345:13:345:16 | self | | overloading.rs:325:5:325:25 | S | | overloading.rs:345:13:345:16 | self | T | {EXTERNAL LOCATION} | bool | | overloading.rs:352:14:352:17 | SelfParam | | overloading.rs:325:5:325:25 | S | | overloading.rs:352:14:352:17 | SelfParam | T | overloading.rs:349:10:349:10 | T | -| overloading.rs:352:25:359:9 | { ... } | | overloading.rs:325:5:325:25 | S | -| overloading.rs:352:25:359:9 | { ... } | T | {EXTERNAL LOCATION} | i64 | -| overloading.rs:353:17:353:17 | x | | {EXTERNAL LOCATION} | i64 | -| overloading.rs:353:21:353:47 | ...::f(...) | | {EXTERNAL LOCATION} | i64 | -| overloading.rs:354:17:354:17 | x | | {EXTERNAL LOCATION} | i64 | -| overloading.rs:354:21:354:61 | ...::f(...) | | {EXTERNAL LOCATION} | i64 | -| overloading.rs:367:17:370:5 | { ... } | | overloading.rs:364:5:365:13 | S | | overloading.rs:378:17:378:17 | _ | | overloading.rs:364:5:365:13 | S | -| overloading.rs:378:31:380:9 | { ... } | | overloading.rs:372:5:372:14 | S1 | | overloading.rs:385:17:385:17 | _ | | overloading.rs:374:5:374:14 | S2 | -| overloading.rs:385:32:387:9 | { ... } | | overloading.rs:372:5:372:14 | S1 | | overloading.rs:392:17:392:17 | _ | | overloading.rs:364:5:365:13 | S | -| overloading.rs:392:31:394:9 | { ... } | | overloading.rs:374:5:374:14 | S2 | | overloading.rs:397:10:397:10 | b | | {EXTERNAL LOCATION} | bool | -| overloading.rs:397:25:401:5 | { ... } | | overloading.rs:372:5:372:14 | S1 | | overloading.rs:398:20:398:20 | b | | {EXTERNAL LOCATION} | bool | | overloading.rs:408:16:408:20 | SelfParam | | {EXTERNAL LOCATION} | & | | overloading.rs:408:16:408:20 | SelfParam | TRef | overloading.rs:407:5:410:5 | Self [trait Trait] | @@ -4325,12 +3975,9 @@ inferCertainType | overloading.rs:422:16:422:20 | SelfParam | | {EXTERNAL LOCATION} | & | | overloading.rs:422:16:422:20 | SelfParam | TRef | overloading.rs:405:5:405:19 | S | | overloading.rs:422:16:422:20 | SelfParam | TRef.T | {EXTERNAL LOCATION} | i32 | -| overloading.rs:422:23:426:9 | { ... } | | {EXTERNAL LOCATION} | () | -| overloading.rs:423:13:423:24 | ...::foo(...) | | {EXTERNAL LOCATION} | () | | overloading.rs:423:20:423:23 | self | | {EXTERNAL LOCATION} | & | | overloading.rs:423:20:423:23 | self | TRef | overloading.rs:405:5:405:19 | S | | overloading.rs:423:20:423:23 | self | TRef.T | {EXTERNAL LOCATION} | i32 | -| overloading.rs:424:13:424:31 | ...::foo(...) | | {EXTERNAL LOCATION} | () | | overloading.rs:424:27:424:30 | self | | {EXTERNAL LOCATION} | & | | overloading.rs:424:27:424:30 | self | TRef | overloading.rs:405:5:405:19 | S | | overloading.rs:424:27:424:30 | self | TRef.T | {EXTERNAL LOCATION} | i32 | @@ -4340,12 +3987,9 @@ inferCertainType | overloading.rs:429:16:429:20 | SelfParam | | {EXTERNAL LOCATION} | & | | overloading.rs:429:16:429:20 | SelfParam | TRef | overloading.rs:405:5:405:19 | S | | overloading.rs:429:16:429:20 | SelfParam | TRef.T | {EXTERNAL LOCATION} | i32 | -| overloading.rs:429:23:433:9 | { ... } | | {EXTERNAL LOCATION} | () | -| overloading.rs:430:13:430:24 | ...::bar(...) | | {EXTERNAL LOCATION} | () | | overloading.rs:430:20:430:23 | self | | {EXTERNAL LOCATION} | & | | overloading.rs:430:20:430:23 | self | TRef | overloading.rs:405:5:405:19 | S | | overloading.rs:430:20:430:23 | self | TRef.T | {EXTERNAL LOCATION} | i32 | -| overloading.rs:431:13:431:31 | ...::bar(...) | | {EXTERNAL LOCATION} | () | | overloading.rs:431:27:431:30 | self | | {EXTERNAL LOCATION} | & | | overloading.rs:431:27:431:30 | self | TRef | overloading.rs:405:5:405:19 | S | | overloading.rs:431:27:431:30 | self | TRef.T | {EXTERNAL LOCATION} | i32 | @@ -4355,8 +3999,6 @@ inferCertainType | overloading.rs:438:16:438:20 | SelfParam | | {EXTERNAL LOCATION} | & | | overloading.rs:438:16:438:20 | SelfParam | TRef | overloading.rs:405:5:405:19 | S | | overloading.rs:438:16:438:20 | SelfParam | TRef.T | {EXTERNAL LOCATION} | i64 | -| overloading.rs:438:23:442:9 | { ... } | | {EXTERNAL LOCATION} | () | -| overloading.rs:440:13:440:31 | ...::foo(...) | | {EXTERNAL LOCATION} | () | | overloading.rs:440:27:440:30 | self | | {EXTERNAL LOCATION} | & | | overloading.rs:440:27:440:30 | self | TRef | overloading.rs:405:5:405:19 | S | | overloading.rs:440:27:440:30 | self | TRef.T | {EXTERNAL LOCATION} | i64 | @@ -4366,8 +4008,6 @@ inferCertainType | overloading.rs:445:16:445:20 | SelfParam | | {EXTERNAL LOCATION} | & | | overloading.rs:445:16:445:20 | SelfParam | TRef | overloading.rs:405:5:405:19 | S | | overloading.rs:445:16:445:20 | SelfParam | TRef.T | {EXTERNAL LOCATION} | i64 | -| overloading.rs:445:23:449:9 | { ... } | | {EXTERNAL LOCATION} | () | -| overloading.rs:447:13:447:31 | ...::bar(...) | | {EXTERNAL LOCATION} | () | | overloading.rs:447:27:447:30 | self | | {EXTERNAL LOCATION} | & | | overloading.rs:447:27:447:30 | self | TRef | overloading.rs:405:5:405:19 | S | | overloading.rs:447:27:447:30 | self | TRef.T | {EXTERNAL LOCATION} | i64 | @@ -4382,64 +4022,57 @@ inferCertainType | overloading.rs:467:14:467:18 | SelfParam | | {EXTERNAL LOCATION} | & | | overloading.rs:467:14:467:18 | SelfParam | TRef | overloading.rs:464:5:464:19 | S | | overloading.rs:467:14:467:18 | SelfParam | TRef.T | {EXTERNAL LOCATION} | i32 | -| overloading.rs:467:28:469:9 | { ... } | | {EXTERNAL LOCATION} | i32 | | overloading.rs:473:14:473:18 | SelfParam | | {EXTERNAL LOCATION} | & | | overloading.rs:473:14:473:18 | SelfParam | TRef | overloading.rs:464:5:464:19 | S | | overloading.rs:473:14:473:18 | SelfParam | TRef.T | {EXTERNAL LOCATION} | i32 | -| overloading.rs:473:28:475:9 | { ... } | | {EXTERNAL LOCATION} | i64 | | overloading.rs:481:14:481:18 | SelfParam | | {EXTERNAL LOCATION} | & | | overloading.rs:481:14:481:18 | SelfParam | TRef | overloading.rs:464:5:464:19 | S | | overloading.rs:481:14:481:18 | SelfParam | TRef.T | {EXTERNAL LOCATION} | i32 | | overloading.rs:481:21:481:21 | x | | overloading.rs:464:5:464:19 | S | | overloading.rs:481:21:481:21 | x | T | {EXTERNAL LOCATION} | i32 | -| overloading.rs:481:48:483:9 | { ... } | | {EXTERNAL LOCATION} | i32 | | overloading.rs:489:14:489:18 | SelfParam | | {EXTERNAL LOCATION} | & | | overloading.rs:489:14:489:18 | SelfParam | TRef | overloading.rs:464:5:464:19 | S | | overloading.rs:489:14:489:18 | SelfParam | TRef.T | {EXTERNAL LOCATION} | i32 | | overloading.rs:489:21:489:21 | x | | overloading.rs:464:5:464:19 | S | | overloading.rs:489:21:489:21 | x | T | {EXTERNAL LOCATION} | i64 | -| overloading.rs:489:48:491:9 | { ... } | | {EXTERNAL LOCATION} | i64 | | overloading.rs:497:14:497:18 | SelfParam | | {EXTERNAL LOCATION} | & | | overloading.rs:497:14:497:18 | SelfParam | TRef | overloading.rs:464:5:464:19 | S | | overloading.rs:497:14:497:18 | SelfParam | TRef.T | {EXTERNAL LOCATION} | i32 | | overloading.rs:497:21:497:21 | x | | overloading.rs:464:5:464:19 | S | | overloading.rs:497:21:497:21 | x | T | {EXTERNAL LOCATION} | bool | -| overloading.rs:497:49:499:9 | { ... } | | {EXTERNAL LOCATION} | i64 | | overloading.rs:502:36:502:36 | x | | overloading.rs:502:19:502:33 | T2 | -| overloading.rs:502:49:504:5 | { ... } | | overloading.rs:502:15:502:16 | T1 | | overloading.rs:503:9:503:9 | x | | overloading.rs:502:19:502:33 | T2 | | overloading.rs:506:38:506:38 | x | | overloading.rs:506:16:506:17 | T1 | | overloading.rs:506:45:506:45 | y | | overloading.rs:506:20:506:35 | T2 | -| overloading.rs:506:66:508:5 | { ... } | | overloading.rs:506:20:506:35 | T2::Output[MyTrait2] | | overloading.rs:507:9:507:9 | y | | overloading.rs:506:20:506:35 | T2 | | overloading.rs:507:13:507:13 | x | | overloading.rs:506:16:506:17 | T1 | | overloading.rs:510:15:522:5 | { ... } | | {EXTERNAL LOCATION} | () | | overloading.rs:513:13:513:13 | z | | {EXTERNAL LOCATION} | i32 | -| overloading.rs:516:13:516:13 | y | | {EXTERNAL LOCATION} | i32 | -| overloading.rs:516:17:516:35 | call_f::<...>(...) | | {EXTERNAL LOCATION} | i32 | | overloading.rs:519:27:519:30 | 0i32 | | {EXTERNAL LOCATION} | i32 | | overloading.rs:521:27:521:30 | 0i64 | | {EXTERNAL LOCATION} | i64 | -| pattern_matching.rs:13:26:133:1 | { ... } | | {EXTERNAL LOCATION} | Option | -| pattern_matching.rs:13:26:133:1 | { ... } | T | {EXTERNAL LOCATION} | () | | pattern_matching.rs:15:5:18:5 | if ... {...} | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:15:31:18:5 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:17:9:17:26 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:17:18:17:25 | "{mesg}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:17:18:17:25 | "{mesg}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:17:18:17:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:17:18:17:25 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:17:18:17:25 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:20:23:23:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:22:13:22:30 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:22:22:22:29 | "{mesg}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:22:22:22:29 | "{mesg}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:22:22:22:29 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:22:22:22:29 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:22:22:22:29 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:24:17:24:18 | TupleExpr | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:28:5:28:22 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:28:14:28:21 | "{mesg}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:28:14:28:21 | "{mesg}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:28:14:28:21 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:28:14:28:21 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:28:14:28:21 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:30:5:30:22 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:30:14:30:21 | "{mesg}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:30:14:30:21 | "{mesg}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:30:14:30:21 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:30:14:30:21 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:30:14:30:21 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:32:9:32:14 | value2 | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:32:18:32:26 | &... | | {EXTERNAL LOCATION} | & | @@ -4447,18 +4080,20 @@ inferCertainType | pattern_matching.rs:33:12:33:22 | &... | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:33:26:33:31 | value2 | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:33:33:36:5 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:35:9:35:26 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:35:18:35:25 | "{mesg}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:35:18:35:25 | "{mesg}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:35:18:35:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:35:18:35:25 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:35:18:35:25 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:39:5:42:5 | if ... {...} | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:39:16:39:19 | mesg | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:39:30:42:5 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:40:13:40:16 | mesg | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:40:20:40:23 | mesg | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:41:9:41:26 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:41:18:41:25 | "{mesg}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:41:18:41:25 | "{mesg}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:41:18:41:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:41:18:41:25 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:41:18:41:25 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:41:20:41:23 | mesg | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:45:5:48:5 | if ... {...} | | {EXTERNAL LOCATION} | () | @@ -4466,9 +4101,10 @@ inferCertainType | pattern_matching.rs:45:36:48:5 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:46:13:46:16 | mesg | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:46:20:46:23 | mesg | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:47:9:47:26 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:47:18:47:25 | "{mesg}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:47:18:47:25 | "{mesg}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:47:18:47:25 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:47:18:47:25 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:47:18:47:25 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:47:20:47:23 | mesg | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:50:13:50:18 | value5 | | {EXTERNAL LOCATION} | & | @@ -4509,32 +4145,34 @@ inferCertainType | pattern_matching.rs:121:5:123:5 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:127:13:130:5 | if ... {...} | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:128:5:130:5 | { ... } | | {EXTERNAL LOCATION} | () | -| pattern_matching.rs:168:27:217:1 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:169:9:169:13 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:169:17:169:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:171:11:171:15 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:173:15:176:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:174:17:174:29 | literal_match | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:174:33:174:37 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:175:13:175:58 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:175:22:175:42 | "Literal pattern: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:175:22:175:42 | "Literal pattern: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:175:22:175:57 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:175:22:175:57 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:175:22:175:57 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:175:45:175:57 | literal_match | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:177:15:180:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:178:17:178:32 | negative_literal | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:178:36:178:40 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:179:13:179:62 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:179:22:179:43 | "Negative literal: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:179:22:179:43 | "Negative literal: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:179:22:179:61 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:179:22:179:61 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:179:22:179:61 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:179:46:179:61 | negative_literal | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:181:14:184:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:182:17:182:28 | zero_literal | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:182:32:182:36 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:183:13:183:54 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:183:22:183:39 | "Zero literal: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:183:22:183:39 | "Zero literal: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:183:22:183:53 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:183:22:183:53 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:183:22:183:53 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:183:42:183:53 | zero_literal | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:185:14:185:15 | { ... } | | {EXTERNAL LOCATION} | () | @@ -4544,9 +4182,10 @@ inferCertainType | pattern_matching.rs:190:17:193:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:191:17:191:24 | pi_match | | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:191:28:191:36 | float_val | | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:192:13:192:48 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:192:22:192:37 | "Pi matched: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:192:22:192:37 | "Pi matched: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:192:22:192:47 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:192:22:192:47 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:192:22:192:47 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:192:40:192:47 | pi_match | | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:194:14:194:15 | { ... } | | {EXTERNAL LOCATION} | () | @@ -4563,9 +4202,10 @@ inferCertainType | pattern_matching.rs:200:17:200:27 | hello_match | TRef | {EXTERNAL LOCATION} | str | | pattern_matching.rs:200:31:200:40 | string_val | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:200:31:200:40 | string_val | TRef | {EXTERNAL LOCATION} | str | +| pattern_matching.rs:201:13:201:55 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:201:22:201:41 | "String literal: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:201:22:201:41 | "String literal: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:201:22:201:54 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:201:22:201:54 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:201:22:201:54 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:201:44:201:54 | hello_match | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:201:44:201:54 | hello_match | TRef | {EXTERNAL LOCATION} | str | @@ -4577,124 +4217,139 @@ inferCertainType | pattern_matching.rs:208:17:211:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:209:17:209:26 | true_match | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:209:30:209:37 | bool_val | | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:210:13:210:52 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:210:22:210:39 | "True literal: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:210:22:210:39 | "True literal: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:210:22:210:51 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:210:22:210:51 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:210:22:210:51 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:210:42:210:51 | true_match | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:212:9:212:13 | false | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:212:18:215:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:213:17:213:27 | false_match | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:213:31:213:38 | bool_val | | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:214:13:214:54 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:214:22:214:40 | "False literal: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:214:22:214:40 | "False literal: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:214:22:214:53 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:214:22:214:53 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:214:22:214:53 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:214:43:214:53 | false_match | | {EXTERNAL LOCATION} | bool | -| pattern_matching.rs:219:30:277:1 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:220:9:220:13 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:220:17:220:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:223:11:223:15 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:224:14:227:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:226:13:226:59 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:226:22:226:45 | "Identifier pattern: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:226:22:226:45 | "Identifier pattern: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:226:22:226:58 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:226:22:226:58 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:226:22:226:58 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:231:11:231:16 | &value | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:231:11:231:16 | &value | TRef | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:231:12:231:16 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:232:13:232:13 | x | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:232:18:235:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:233:17:233:25 | ref_bound | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:233:29:233:29 | x | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:234:13:234:61 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:234:22:234:49 | "Reference identifier: {:?}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:234:22:234:49 | "Reference identifier: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:234:22:234:60 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:234:22:234:60 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:234:22:234:60 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:234:52:234:60 | ref_bound | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:239:13:239:25 | mutable_value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:239:29:239:33 | 10i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:240:11:240:23 | mutable_value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:241:18:245:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:243:13:243:18 | ... += ... | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:244:13:244:57 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:244:22:244:45 | "Mutable identifier: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:244:22:244:45 | "Mutable identifier: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:244:22:244:56 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:244:22:244:56 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:244:22:244:56 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:249:39:249:43 | 42i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:251:35:254:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:253:13:253:60 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:253:22:253:49 | "@ pattern with literal: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:253:22:253:49 | "@ pattern with literal: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:253:22:253:59 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:253:22:253:59 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:253:22:253:59 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:255:40:258:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:257:13:257:64 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:257:22:257:47 | "@ pattern with range: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:257:22:257:47 | "@ pattern with range: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:257:22:257:63 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:257:22:257:63 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:257:22:257:63 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:259:30:262:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:261:13:261:50 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:261:22:261:37 | "Some value: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:261:22:261:37 | "Some value: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:261:22:261:49 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:261:22:261:49 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:261:22:261:49 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:263:27:265:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:264:13:264:34 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:264:22:264:33 | "None value\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:264:22:264:33 | "None value\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:264:22:264:33 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:264:22:264:33 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:264:22:264:33 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:269:13:269:23 | ref_mut_val | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:269:27:269:30 | 5i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:270:11:270:26 | &mut ref_mut_val | | {EXTERNAL LOCATION} | &mut | +| pattern_matching.rs:270:11:270:26 | &mut ref_mut_val | TRefMut | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:270:16:270:26 | ref_mut_val | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:271:17:271:17 | x | | {EXTERNAL LOCATION} | &mut | | pattern_matching.rs:271:22:275:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:272:17:272:29 | ref_mut_bound | | {EXTERNAL LOCATION} | &mut | | pattern_matching.rs:272:33:272:33 | x | | {EXTERNAL LOCATION} | &mut | +| pattern_matching.rs:273:13:273:32 | ... += ... | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:273:15:273:27 | ref_mut_bound | | {EXTERNAL LOCATION} | &mut | +| pattern_matching.rs:274:13:274:39 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:274:22:274:38 | "Ref mut pattern\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:274:22:274:38 | "Ref mut pattern\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:274:22:274:38 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:274:22:274:38 | { ... } | | {EXTERNAL LOCATION} | () | -| pattern_matching.rs:279:28:290:1 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:274:22:274:38 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:280:9:280:13 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:280:17:280:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:282:11:282:15 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:283:15:283:40 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:283:24:283:39 | "Specific match\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:283:24:283:39 | "Specific match\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:283:24:283:39 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:283:24:283:39 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:285:14:288:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:286:17:286:32 | wildcard_context | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:286:36:286:40 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:287:13:287:66 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:287:22:287:47 | "Wildcard pattern for: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:287:22:287:47 | "Wildcard pattern for: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:287:22:287:65 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:287:22:287:65 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:287:22:287:65 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:287:50:287:65 | wildcard_context | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:292:25:324:1 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:293:9:293:13 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:293:17:293:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:295:11:295:15 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:297:19:300:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:298:17:298:31 | range_inclusive | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:298:35:298:39 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:299:13:299:60 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:299:22:299:42 | "Range inclusive: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:299:22:299:42 | "Range inclusive: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:299:22:299:59 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:299:22:299:59 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:299:22:299:59 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:299:45:299:59 | range_inclusive | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:301:17:304:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:302:17:302:26 | range_from | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:302:30:302:34 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:303:13:303:53 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:303:22:303:40 | "Range from 11: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:303:22:303:40 | "Range from 11: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:303:22:303:52 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:303:22:303:52 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:303:22:303:52 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:303:43:303:52 | range_from | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:305:17:308:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:306:17:306:34 | range_to_inclusive | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:306:38:306:42 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:307:13:307:68 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:307:22:307:47 | "Range to 0 inclusive: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:307:22:307:47 | "Range to 0 inclusive: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:307:22:307:67 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:307:22:307:67 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:307:22:307:67 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:307:50:307:67 | range_to_inclusive | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:309:14:309:15 | { ... } | | {EXTERNAL LOCATION} | () | @@ -4706,9 +4361,10 @@ inferCertainType | pattern_matching.rs:314:22:317:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:315:17:315:30 | lowercase_char | | {EXTERNAL LOCATION} | char | | pattern_matching.rs:315:34:315:41 | char_val | | {EXTERNAL LOCATION} | char | +| pattern_matching.rs:316:13:316:58 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:316:22:316:41 | "Lowercase char: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:316:22:316:41 | "Lowercase char: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:316:22:316:57 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:316:22:316:57 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:316:22:316:57 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:316:44:316:57 | lowercase_char | | {EXTERNAL LOCATION} | char | | pattern_matching.rs:318:9:318:11 | 'A' | | {EXTERNAL LOCATION} | char | @@ -4716,58 +4372,64 @@ inferCertainType | pattern_matching.rs:318:22:321:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:319:17:319:30 | uppercase_char | | {EXTERNAL LOCATION} | char | | pattern_matching.rs:319:34:319:41 | char_val | | {EXTERNAL LOCATION} | char | +| pattern_matching.rs:320:13:320:58 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:320:22:320:41 | "Uppercase char: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:320:22:320:41 | "Uppercase char: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:320:22:320:57 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:320:22:320:57 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:320:22:320:57 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:320:44:320:57 | uppercase_char | | {EXTERNAL LOCATION} | char | | pattern_matching.rs:322:14:322:15 | { ... } | | {EXTERNAL LOCATION} | () | -| pattern_matching.rs:326:29:355:1 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:327:9:327:13 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:327:17:327:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:328:13:328:25 | mutable_value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:328:29:328:33 | 10i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:331:11:331:16 | &value | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:331:11:331:16 | &value | TRef | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:331:12:331:16 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:332:9:332:11 | &42 | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:332:16:335:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:333:17:333:27 | deref_match | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:333:31:333:35 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:334:13:334:59 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:334:22:334:45 | "Dereferenced match: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:334:22:334:45 | "Dereferenced match: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:334:22:334:58 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:334:22:334:58 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:334:22:334:58 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:334:48:334:58 | deref_match | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:336:9:336:10 | &... | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:336:15:339:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:338:13:338:61 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:338:22:338:47 | "Dereferenced binding: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:338:22:338:47 | "Dereferenced binding: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:338:22:338:60 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:338:22:338:60 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:338:22:338:60 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:342:11:342:28 | &mut mutable_value | | {EXTERNAL LOCATION} | &mut | +| pattern_matching.rs:342:11:342:28 | &mut mutable_value | TRefMut | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:342:16:342:28 | mutable_value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:343:9:343:18 | &mut ... | | {EXTERNAL LOCATION} | &mut | | pattern_matching.rs:343:18:343:18 | x | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:343:23:346:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:344:17:344:29 | mut_ref_bound | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:344:33:344:33 | x | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:345:13:345:62 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:345:22:345:46 | "Mutable ref pattern: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:345:22:345:46 | "Mutable ref pattern: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:345:22:345:61 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:345:22:345:61 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:345:22:345:61 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:345:49:345:61 | mut_ref_bound | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:349:11:349:16 | &value | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:349:11:349:16 | &value | TRef | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:349:12:349:16 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:350:13:350:13 | x | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:350:18:353:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:351:17:351:27 | ref_pattern | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:351:31:351:31 | x | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:352:13:352:58 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:352:22:352:44 | "Reference pattern: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:352:22:352:44 | "Reference pattern: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:352:22:352:57 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:352:22:352:57 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:352:22:352:57 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:352:47:352:57 | ref_pattern | | {EXTERNAL LOCATION} | & | -| pattern_matching.rs:357:26:398:1 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:358:9:358:13 | point | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:358:17:358:38 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:361:11:361:15 | point | | pattern_matching.rs:135:1:140:1 | Point | @@ -4775,70 +4437,79 @@ inferCertainType | pattern_matching.rs:362:33:365:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:363:17:363:22 | origin | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:363:26:363:30 | point | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:364:13:364:50 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:364:22:364:41 | "Origin point: {:?}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:364:22:364:41 | "Origin point: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:364:22:364:49 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:364:22:364:49 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:364:22:364:49 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:364:44:364:49 | origin | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:366:9:366:25 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:366:30:370:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:368:17:368:28 | x_axis_point | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:368:32:368:36 | point | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:369:13:369:81 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:369:22:369:56 | "Point on x-axis: x={}, point=... | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:369:22:369:56 | "Point on x-axis: x={}, point=... | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:369:22:369:80 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:369:22:369:80 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:369:22:369:80 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:369:69:369:80 | x_axis_point | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:371:9:371:27 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:371:32:374:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:372:17:372:27 | ten_x_point | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:372:31:372:35 | point | | pattern_matching.rs:135:1:140:1 | Point | +| pattern_matching.rs:373:13:373:58 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:373:22:373:44 | "Point with x=10: {:?}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:373:22:373:44 | "Point with x=10: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:373:22:373:57 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:373:22:373:57 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:373:22:373:57 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:373:47:373:57 | ten_x_point | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:375:9:375:22 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:375:27:379:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:378:13:378:69 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:378:22:378:46 | "General point: ({}, {})\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:378:22:378:46 | "General point: ({}, {})\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:378:22:378:68 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:378:22:378:68 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:378:22:378:68 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:383:9:383:13 | shape | | pattern_matching.rs:145:1:150:1 | Shape | | pattern_matching.rs:383:17:386:5 | ...::Rectangle {...} | | pattern_matching.rs:145:1:150:1 | Shape | | pattern_matching.rs:387:11:387:15 | shape | | pattern_matching.rs:145:1:150:1 | Shape | | pattern_matching.rs:388:9:391:9 | ...::Rectangle {...} | | pattern_matching.rs:145:1:150:1 | Shape | | pattern_matching.rs:391:14:395:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:394:13:394:65 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:394:22:394:39 | "Rectangle: {}x{}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:394:22:394:39 | "Rectangle: {}x{}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:394:22:394:64 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:394:22:394:64 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:394:22:394:64 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:396:14:396:15 | { ... } | | {EXTERNAL LOCATION} | () | -| pattern_matching.rs:400:32:441:1 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:405:29:408:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:407:13:407:49 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:407:22:407:37 | "Pure red: {:?}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:407:22:407:37 | "Pure red: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:407:22:407:48 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:407:22:407:48 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:407:22:407:48 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:409:27:417:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:413:13:416:13 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:414:17:414:37 | "Color: ({}, {}, {})\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:414:17:414:37 | "Color: ({}, {}, {})\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:414:17:415:62 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:414:17:415:62 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:414:17:415:62 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:422:27:425:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:424:13:424:58 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:424:22:424:42 | "Reddish color: {:?}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:424:22:424:42 | "Reddish color: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:424:22:424:57 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:424:22:424:57 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:424:22:424:57 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:426:25:429:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:428:13:428:55 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:428:22:428:45 | "Any color with red: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:428:22:428:45 | "Any color with red: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:428:22:428:54 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:428:22:428:54 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:428:22:428:54 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:436:23:439:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:438:13:438:50 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:438:22:438:34 | "Wrapped: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:438:22:438:34 | "Wrapped: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:438:22:438:49 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:438:22:438:49 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:438:22:438:49 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:443:25:498:1 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:444:9:444:13 | tuple | | {EXTERNAL LOCATION} | (T_3) | @@ -4851,22 +4522,25 @@ inferCertainType | pattern_matching.rs:448:24:451:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:449:17:449:27 | exact_tuple | | {EXTERNAL LOCATION} | (T_3) | | pattern_matching.rs:449:31:449:35 | tuple | | {EXTERNAL LOCATION} | (T_3) | +| pattern_matching.rs:450:13:450:54 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:450:22:450:40 | "Exact tuple: {:?}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:450:22:450:40 | "Exact tuple: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:450:22:450:53 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:450:22:450:53 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:450:22:450:53 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:450:43:450:53 | exact_tuple | | {EXTERNAL LOCATION} | (T_3) | | pattern_matching.rs:452:9:452:17 | TuplePat | | {EXTERNAL LOCATION} | (T_3) | | pattern_matching.rs:452:22:457:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:456:13:456:80 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:456:22:456:42 | "Tuple: ({}, {}, {})\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:456:22:456:42 | "Tuple: ({}, {}, {})\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:456:22:456:79 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:456:22:456:79 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:456:22:456:79 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:461:11:461:15 | tuple | | {EXTERNAL LOCATION} | (T_3) | | pattern_matching.rs:462:24:465:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:464:13:464:54 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:464:22:464:40 | "First element: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:464:22:464:40 | "First element: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:464:22:464:53 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:464:22:464:53 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:464:22:464:53 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:469:9:469:12 | unit | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:469:16:469:17 | TupleExpr | | {EXTERNAL LOCATION} | () | @@ -4875,26 +4549,32 @@ inferCertainType | pattern_matching.rs:471:15:474:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:472:17:472:26 | unit_value | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:472:30:472:33 | unit | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:473:13:473:52 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:473:22:473:39 | "Unit value: {:?}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:473:22:473:39 | "Unit value: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:473:22:473:51 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:473:22:473:51 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:473:22:473:51 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:473:42:473:51 | unit_value | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:478:9:478:14 | single | | {EXTERNAL LOCATION} | (T_1) | +| pattern_matching.rs:478:9:478:14 | single | T0 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:478:18:478:25 | TupleExpr | | {EXTERNAL LOCATION} | (T_1) | +| pattern_matching.rs:478:18:478:25 | TupleExpr | T0 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:478:19:478:23 | 42i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:479:11:479:16 | single | | {EXTERNAL LOCATION} | (T_1) | +| pattern_matching.rs:479:11:479:16 | single | T0 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:480:9:480:12 | TuplePat | | {EXTERNAL LOCATION} | (T_1) | | pattern_matching.rs:480:17:483:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:482:13:482:61 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:482:22:482:47 | "Single element tuple: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:482:22:482:47 | "Single element tuple: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:482:22:482:60 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:482:22:482:60 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:482:22:482:60 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:487:9:487:18 | ref_tuple1 | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:487:9:487:18 | ref_tuple1 | TRef | {EXTERNAL LOCATION} | (T_2) | | pattern_matching.rs:487:9:487:18 | ref_tuple1 | TRef.T0 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:487:9:487:18 | ref_tuple1 | TRef.T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:487:35:487:41 | &... | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:487:35:487:41 | &... | TRef | {EXTERNAL LOCATION} | (T_2) | | pattern_matching.rs:487:36:487:41 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | | pattern_matching.rs:488:5:491:5 | if ... {...} | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:488:12:488:17 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | @@ -4903,41 +4583,46 @@ inferCertainType | pattern_matching.rs:488:21:488:30 | ref_tuple1 | TRef.T0 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:488:21:488:30 | ref_tuple1 | TRef.T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:488:32:491:5 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:489:9:489:28 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:489:18:489:24 | "n: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:489:18:489:24 | "n: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:489:18:489:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:489:18:489:27 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:489:18:489:27 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:490:9:490:28 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:490:18:490:24 | "m: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:490:18:490:24 | "m: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:490:18:490:27 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:490:18:490:27 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:490:18:490:27 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:494:9:494:18 | ref_tuple2 | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:494:9:494:18 | ref_tuple2 | TRef | {EXTERNAL LOCATION} | (T_2) | | pattern_matching.rs:494:9:494:18 | ref_tuple2 | TRef.T0 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:494:9:494:18 | ref_tuple2 | TRef.T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:494:35:494:41 | &... | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:494:35:494:41 | &... | TRef | {EXTERNAL LOCATION} | (T_2) | | pattern_matching.rs:494:36:494:41 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | | pattern_matching.rs:495:9:495:14 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | | pattern_matching.rs:495:18:495:27 | ref_tuple2 | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:495:18:495:27 | ref_tuple2 | TRef | {EXTERNAL LOCATION} | (T_2) | | pattern_matching.rs:495:18:495:27 | ref_tuple2 | TRef.T0 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:495:18:495:27 | ref_tuple2 | TRef.T1 | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:496:5:496:24 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:496:14:496:20 | "n: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:496:14:496:20 | "n: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:496:14:496:23 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:496:14:496:23 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:496:14:496:23 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:497:5:497:24 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:497:14:497:20 | "m: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:497:14:497:20 | "m: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:497:14:497:23 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:497:14:497:23 | { ... } | | {EXTERNAL LOCATION} | () | -| pattern_matching.rs:500:33:520:1 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:497:14:497:23 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:501:9:501:13 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:501:17:501:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:504:11:504:15 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:505:16:508:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:507:13:507:62 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:507:22:507:48 | "Parenthesized pattern: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:507:22:507:48 | "Parenthesized pattern: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:507:22:507:61 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:507:22:507:61 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:507:22:507:61 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:512:9:512:13 | tuple | | {EXTERNAL LOCATION} | (T_2) | | pattern_matching.rs:512:17:512:28 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | @@ -4946,15 +4631,16 @@ inferCertainType | pattern_matching.rs:513:11:513:15 | tuple | | {EXTERNAL LOCATION} | (T_2) | | pattern_matching.rs:514:9:514:16 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | | pattern_matching.rs:514:21:518:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:517:13:517:72 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:517:22:517:53 | "Parenthesized in tuple: {}, {... | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:517:22:517:53 | "Parenthesized in tuple: {}, {... | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:517:22:517:71 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:517:22:517:71 | { ... } | | {EXTERNAL LOCATION} | () | -| pattern_matching.rs:522:25:563:1 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:517:22:517:71 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:523:9:523:13 | slice | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:523:9:523:13 | slice | TRef | {EXTERNAL LOCATION} | [] | | pattern_matching.rs:523:9:523:13 | slice | TRef.TSlice | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:523:25:523:40 | &... | | {EXTERNAL LOCATION} | & | +| pattern_matching.rs:523:25:523:40 | &... | TRef | {EXTERNAL LOCATION} | [;] | | pattern_matching.rs:523:26:523:40 | [...] | | {EXTERNAL LOCATION} | [;] | | pattern_matching.rs:526:11:526:15 | slice | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:526:11:526:15 | slice | TRef | {EXTERNAL LOCATION} | [] | @@ -4966,89 +4652,100 @@ inferCertainType | pattern_matching.rs:528:31:528:35 | slice | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:528:31:528:35 | slice | TRef | {EXTERNAL LOCATION} | [] | | pattern_matching.rs:528:31:528:35 | slice | TRef.TSlice | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:529:13:529:54 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:529:22:529:40 | "Empty slice: {:?}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:529:22:529:40 | "Empty slice: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:529:22:529:53 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:529:22:529:53 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:529:22:529:53 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:529:43:529:53 | empty_slice | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:529:43:529:53 | empty_slice | TRef | {EXTERNAL LOCATION} | [] | | pattern_matching.rs:529:43:529:53 | empty_slice | TRef.TSlice | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:531:16:534:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:533:13:533:55 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:533:22:533:41 | "Single element: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:533:22:533:41 | "Single element: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:533:22:533:54 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:533:22:533:54 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:533:22:533:54 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:535:28:539:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:538:13:538:71 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:538:22:538:43 | "Two elements: {}, {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:538:22:538:43 | "Two elements: {}, {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:538:22:538:70 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:538:22:538:70 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:538:22:538:70 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:540:39:550:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:544:13:549:13 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:545:17:545:53 | "First: {}, last: {}, middle l... | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:545:17:545:53 | "First: {}, last: {}, middle l... | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:545:17:548:34 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:545:17:548:34 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:545:17:548:34 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:554:9:554:13 | array | | {EXTERNAL LOCATION} | [;] | | pattern_matching.rs:554:17:554:28 | [...] | | {EXTERNAL LOCATION} | [;] | | pattern_matching.rs:554:18:554:21 | 1i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:555:11:555:15 | array | | {EXTERNAL LOCATION} | [;] | | pattern_matching.rs:556:22:561:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:560:13:560:71 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:560:22:560:49 | "Array elements: {}, {}, {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:560:22:560:49 | "Array elements: {}, {}, {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:560:22:560:70 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:560:22:560:70 | { ... } | | {EXTERNAL LOCATION} | () | -| pattern_matching.rs:565:24:601:1 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:560:22:560:70 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:567:11:567:18 | CONSTANT | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:568:9:568:13 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:568:17:568:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:570:11:570:15 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:571:21:574:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:572:17:572:27 | const_match | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:572:31:572:35 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:573:13:573:57 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:573:22:573:43 | "Matches constant: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:573:22:573:43 | "Matches constant: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:573:22:573:56 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:573:22:573:56 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:573:22:573:56 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:573:46:573:56 | const_match | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:575:14:575:15 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:579:33:579:37 | 10i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:581:27:583:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:582:13:582:36 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:582:22:582:35 | "None variant\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:582:22:582:35 | "None variant\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:582:22:582:35 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:582:22:582:35 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:582:22:582:35 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:584:30:587:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:586:13:586:50 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:586:22:586:37 | "Some value: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:586:22:586:37 | "Some value: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:586:22:586:49 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:586:22:586:49 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:586:22:586:49 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:592:39:595:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:594:13:594:46 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:594:22:594:35 | "Ok value: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:594:22:594:35 | "Ok value: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:594:22:594:45 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:594:22:594:45 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:594:22:594:45 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:596:40:599:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:598:13:598:44 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:598:22:598:32 | "Error: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:598:22:598:32 | "Error: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:598:22:598:43 | ...::_print(...) | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:598:22:598:43 | { ... } | | {EXTERNAL LOCATION} | () | -| pattern_matching.rs:603:22:638:1 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:598:22:598:43 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:604:9:604:13 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:604:17:604:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:607:11:607:15 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:608:22:611:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:609:17:609:25 | small_num | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:609:29:609:33 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:610:13:610:51 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:610:22:610:39 | "Small number: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:610:22:610:39 | "Small number: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:610:22:610:50 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:610:22:610:50 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:610:22:610:50 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:610:42:610:50 | small_num | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:612:20:615:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:613:17:613:25 | round_num | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:613:29:613:33 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:614:13:614:51 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:614:22:614:39 | "Round number: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:614:22:614:39 | "Round number: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:614:22:614:50 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:614:22:614:50 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:614:22:614:50 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:614:42:614:50 | round_num | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:616:14:616:15 | { ... } | | {EXTERNAL LOCATION} | () | @@ -5058,22 +4755,23 @@ inferCertainType | pattern_matching.rs:622:9:622:29 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:622:33:622:53 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:622:58:626:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:625:13:625:63 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:625:22:625:46 | "Point on axis: ({}, {})\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:625:22:625:46 | "Point on axis: ({}, {})\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:625:22:625:62 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:625:22:625:62 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:625:22:625:62 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:627:14:627:15 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:631:11:631:15 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:632:30:635:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:633:17:633:30 | range_or_value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:633:34:633:38 | value | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:634:13:634:52 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:634:22:634:35 | "In range: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:634:22:634:35 | "In range: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:634:22:634:51 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:634:22:634:51 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:634:22:634:51 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:634:38:634:51 | range_or_value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:636:14:636:15 | { ... } | | {EXTERNAL LOCATION} | () | -| pattern_matching.rs:640:24:674:1 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:641:9:641:13 | tuple | | {EXTERNAL LOCATION} | (T_4) | | pattern_matching.rs:641:17:641:41 | TupleExpr | | {EXTERNAL LOCATION} | (T_4) | | pattern_matching.rs:641:18:641:21 | 1i32 | | {EXTERNAL LOCATION} | i32 | @@ -5082,30 +4780,34 @@ inferCertainType | pattern_matching.rs:641:38:641:40 | 4u8 | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:644:11:644:15 | tuple | | {EXTERNAL LOCATION} | (T_4) | | pattern_matching.rs:645:24:648:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:647:13:647:55 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:647:22:647:42 | "First with rest: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:647:22:647:42 | "First with rest: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:647:22:647:54 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:647:22:647:54 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:647:22:647:54 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:651:11:651:15 | tuple | | {EXTERNAL LOCATION} | (T_4) | | pattern_matching.rs:652:23:655:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:654:13:654:53 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:654:22:654:41 | "Last with rest: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:654:22:654:41 | "Last with rest: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:654:22:654:52 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:654:22:654:52 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:654:22:654:52 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:658:11:658:15 | tuple | | {EXTERNAL LOCATION} | (T_4) | | pattern_matching.rs:659:30:663:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:662:13:662:68 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:662:22:662:45 | "First and last: {}, {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:662:22:662:45 | "First and last: {}, {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:662:22:662:67 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:662:22:662:67 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:662:22:662:67 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:667:9:667:13 | point | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:667:17:667:38 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:668:11:668:15 | point | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:669:9:669:23 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:669:28:672:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:671:13:671:48 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:671:22:671:39 | "X coordinate: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:671:22:671:39 | "X coordinate: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:671:22:671:47 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:671:22:671:47 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:671:22:671:47 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:676:25:696:1 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:694:21:694:25 | 42i32 | | {EXTERNAL LOCATION} | i32 | @@ -5114,7 +4816,6 @@ inferCertainType | pattern_matching.rs:695:21:695:25 | 10i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:695:21:695:25 | 10i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:695:21:695:25 | { ... } | | {EXTERNAL LOCATION} | () | -| pattern_matching.rs:698:34:724:1 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:700:9:700:20 | complex_data | | {EXTERNAL LOCATION} | (T_2) | | pattern_matching.rs:700:24:700:79 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | | pattern_matching.rs:700:25:700:44 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | @@ -5122,23 +4823,26 @@ inferCertainType | pattern_matching.rs:704:9:704:61 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | | pattern_matching.rs:704:10:704:26 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:704:66:712:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:708:13:711:13 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:709:17:709:57 | "Complex nested: y={}, green={... | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:709:17:709:57 | "Complex nested: y={}, green={... | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:709:17:710:44 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:709:17:710:44 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:709:17:710:44 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:714:9:714:41 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | | pattern_matching.rs:714:10:714:24 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:714:45:714:71 | TuplePat | | {EXTERNAL LOCATION} | (T_2) | | pattern_matching.rs:714:46:714:67 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:714:76:717:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:716:13:716:66 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:716:22:716:50 | "Alternative complex: x={:?}\\n... | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:716:22:716:50 | "Alternative complex: x={:?}\\n... | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:716:22:716:65 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:716:22:716:65 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:716:22:716:65 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:719:18:722:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:721:13:721:63 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:721:22:721:47 | "Other complex data: {:?}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:721:22:721:47 | "Other complex data: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:721:22:721:62 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:721:22:721:62 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:721:22:721:62 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:726:37:758:1 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:728:9:728:13 | point | | pattern_matching.rs:135:1:140:1 | Point | @@ -5172,43 +4876,32 @@ inferCertainType | pattern_matching.rs:760:42:789:1 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:763:22:763:35 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:763:59:767:5 | { ... } | | {EXTERNAL LOCATION} | (T_2) | -| pattern_matching.rs:763:59:767:5 | { ... } | T0 | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:763:59:767:5 | { ... } | T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:766:9:766:26 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | | pattern_matching.rs:769:22:769:35 | Color(...) | | pattern_matching.rs:142:1:143:25 | Color | -| pattern_matching.rs:769:51:772:5 | { ... } | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:774:22:774:38 | TuplePat | | {EXTERNAL LOCATION} | (T_3) | | pattern_matching.rs:774:22:774:38 | TuplePat | T0 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:774:22:774:38 | TuplePat | T1 | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:774:22:774:38 | TuplePat | T2 | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:774:23:774:27 | first | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:774:30:774:30 | _ | | {EXTERNAL LOCATION} | f64 | +| pattern_matching.rs:774:33:774:37 | third | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:774:74:778:5 | { ... } | | {EXTERNAL LOCATION} | (T_2) | -| pattern_matching.rs:774:74:778:5 | { ... } | T0 | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:774:74:778:5 | { ... } | T1 | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:775:13:775:23 | param_first | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:775:27:775:31 | first | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:776:13:776:23 | param_third | | {EXTERNAL LOCATION} | bool | +| pattern_matching.rs:776:27:776:31 | third | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:777:9:777:34 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | +| pattern_matching.rs:777:10:777:20 | param_first | | {EXTERNAL LOCATION} | i32 | +| pattern_matching.rs:777:23:777:33 | param_third | | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:781:9:781:13 | point | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:781:17:781:37 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | -| pattern_matching.rs:782:9:782:17 | extracted | | {EXTERNAL LOCATION} | (T_2) | -| pattern_matching.rs:782:9:782:17 | extracted | T0 | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:782:9:782:17 | extracted | T1 | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:782:21:782:40 | extract_point(...) | | {EXTERNAL LOCATION} | (T_2) | -| pattern_matching.rs:782:21:782:40 | extract_point(...) | T0 | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:782:21:782:40 | extract_point(...) | T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:782:35:782:39 | point | | pattern_matching.rs:135:1:140:1 | Point | -| pattern_matching.rs:785:9:785:11 | red | | {EXTERNAL LOCATION} | u8 | -| pattern_matching.rs:785:15:785:34 | extract_color(...) | | {EXTERNAL LOCATION} | u8 | | pattern_matching.rs:787:9:787:13 | tuple | | {EXTERNAL LOCATION} | (T_3) | | pattern_matching.rs:787:17:787:38 | TupleExpr | | {EXTERNAL LOCATION} | (T_3) | | pattern_matching.rs:787:18:787:22 | 42i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:787:25:787:31 | 3.14f64 | | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:787:34:787:37 | true | | {EXTERNAL LOCATION} | bool | -| pattern_matching.rs:788:9:788:23 | tuple_extracted | | {EXTERNAL LOCATION} | (T_2) | -| pattern_matching.rs:788:9:788:23 | tuple_extracted | T0 | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:788:9:788:23 | tuple_extracted | T1 | {EXTERNAL LOCATION} | bool | -| pattern_matching.rs:788:27:788:46 | extract_tuple(...) | | {EXTERNAL LOCATION} | (T_2) | -| pattern_matching.rs:788:27:788:46 | extract_tuple(...) | T0 | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:788:27:788:46 | extract_tuple(...) | T1 | {EXTERNAL LOCATION} | bool | | pattern_matching.rs:788:41:788:45 | tuple | | {EXTERNAL LOCATION} | (T_3) | -| pattern_matching.rs:792:35:824:1 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:794:23:794:42 | (...) | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:794:23:794:42 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:794:45:794:64 | (...) | | pattern_matching.rs:135:1:140:1 | Point | @@ -5216,16 +4909,18 @@ inferCertainType | pattern_matching.rs:795:5:799:5 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:795:9:795:22 | Point {...} | | pattern_matching.rs:135:1:140:1 | Point | | pattern_matching.rs:795:34:799:5 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:798:9:798:59 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:798:18:798:42 | "Point in loop: ({}, {})\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:798:18:798:42 | "Point in loop: ({}, {})\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:798:18:798:58 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:798:18:798:58 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:798:18:798:58 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:802:39:802:43 | 42i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:803:5:806:5 | if ... {...} | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:803:50:806:5 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:805:9:805:55 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:805:18:805:44 | "If let with @ pattern: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:805:18:805:44 | "If let with @ pattern: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:805:18:805:54 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:805:18:805:54 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:805:18:805:54 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:809:13:809:17 | stack | | {EXTERNAL LOCATION} | Vec | | pattern_matching.rs:809:13:809:17 | stack | A | {EXTERNAL LOCATION} | Global | @@ -5236,132 +4931,95 @@ inferCertainType | pattern_matching.rs:810:25:810:29 | stack | A | {EXTERNAL LOCATION} | Global | | pattern_matching.rs:810:25:810:29 | stack | T | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:810:37:813:5 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:812:9:812:43 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:812:18:812:29 | "Popped: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:812:18:812:29 | "Popped: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:812:18:812:42 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:812:18:812:42 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:812:18:812:42 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:816:9:816:13 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:816:17:816:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:817:11:817:15 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:818:23:821:9 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:820:13:820:45 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:820:22:820:35 | "Positive: {}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:820:22:820:35 | "Positive: {}\\n" | TRef | {EXTERNAL LOCATION} | str | -| pattern_matching.rs:820:22:820:44 | ...::_print(...) | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:820:22:820:44 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:820:22:820:44 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:822:14:822:15 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:826:28:846:1 | { ... } | | {EXTERNAL LOCATION} | () | -| pattern_matching.rs:827:5:827:7 | f(...) | | {EXTERNAL LOCATION} | Option | -| pattern_matching.rs:827:5:827:7 | f(...) | T | {EXTERNAL LOCATION} | () | -| pattern_matching.rs:828:5:828:22 | literal_patterns(...) | | {EXTERNAL LOCATION} | () | -| pattern_matching.rs:829:5:829:25 | identifier_patterns(...) | | {EXTERNAL LOCATION} | () | -| pattern_matching.rs:830:5:830:23 | wildcard_patterns(...) | | {EXTERNAL LOCATION} | () | -| pattern_matching.rs:831:5:831:20 | range_patterns(...) | | {EXTERNAL LOCATION} | () | -| pattern_matching.rs:832:5:832:24 | reference_patterns(...) | | {EXTERNAL LOCATION} | () | -| pattern_matching.rs:833:5:833:21 | record_patterns(...) | | {EXTERNAL LOCATION} | () | -| pattern_matching.rs:834:5:834:27 | tuple_struct_patterns(...) | | {EXTERNAL LOCATION} | () | -| pattern_matching.rs:835:5:835:20 | tuple_patterns(...) | | {EXTERNAL LOCATION} | () | -| pattern_matching.rs:836:5:836:28 | parenthesized_patterns(...) | | {EXTERNAL LOCATION} | () | -| pattern_matching.rs:837:5:837:20 | slice_patterns(...) | | {EXTERNAL LOCATION} | () | -| pattern_matching.rs:838:5:838:19 | path_patterns(...) | | {EXTERNAL LOCATION} | () | -| pattern_matching.rs:839:5:839:17 | or_patterns(...) | | {EXTERNAL LOCATION} | () | -| pattern_matching.rs:840:5:840:19 | rest_patterns(...) | | {EXTERNAL LOCATION} | () | -| pattern_matching.rs:841:5:841:20 | macro_patterns(...) | | {EXTERNAL LOCATION} | () | -| pattern_matching.rs:842:5:842:29 | complex_nested_patterns(...) | | {EXTERNAL LOCATION} | () | -| pattern_matching.rs:843:5:843:32 | patterns_in_let_statements(...) | | {EXTERNAL LOCATION} | () | -| pattern_matching.rs:844:5:844:37 | patterns_in_function_parameters(...) | | {EXTERNAL LOCATION} | () | -| pattern_matching.rs:845:5:845:30 | patterns_in_control_flow(...) | | {EXTERNAL LOCATION} | () | | raw_pointer.rs:3:28:3:28 | x | | {EXTERNAL LOCATION} | *const | | raw_pointer.rs:3:28:3:28 | x | TPtrConst | {EXTERNAL LOCATION} | i32 | -| raw_pointer.rs:3:50:6:1 | { ... } | | {EXTERNAL LOCATION} | i32 | | raw_pointer.rs:4:24:4:24 | x | | {EXTERNAL LOCATION} | *const | | raw_pointer.rs:4:24:4:24 | x | TPtrConst | {EXTERNAL LOCATION} | i32 | | raw_pointer.rs:8:26:8:26 | x | | {EXTERNAL LOCATION} | *mut | | raw_pointer.rs:8:26:8:26 | x | TPtrMut | {EXTERNAL LOCATION} | bool | -| raw_pointer.rs:8:47:11:1 | { ... } | | {EXTERNAL LOCATION} | i32 | | raw_pointer.rs:9:24:9:24 | x | | {EXTERNAL LOCATION} | *mut | | raw_pointer.rs:9:24:9:24 | x | TPtrMut | {EXTERNAL LOCATION} | bool | | raw_pointer.rs:13:23:19:1 | { ... } | | {EXTERNAL LOCATION} | () | | raw_pointer.rs:14:9:14:9 | a | | {EXTERNAL LOCATION} | i64 | | raw_pointer.rs:15:9:15:9 | x | | {EXTERNAL LOCATION} | *const | +| raw_pointer.rs:15:9:15:9 | x | TPtrConst | {EXTERNAL LOCATION} | i64 | | raw_pointer.rs:15:13:15:24 | &raw const a | | {EXTERNAL LOCATION} | *const | +| raw_pointer.rs:15:13:15:24 | &raw const a | TPtrConst | {EXTERNAL LOCATION} | i64 | | raw_pointer.rs:15:24:15:24 | a | | {EXTERNAL LOCATION} | i64 | | raw_pointer.rs:16:5:18:5 | { ... } | | {EXTERNAL LOCATION} | () | | raw_pointer.rs:17:19:17:19 | x | | {EXTERNAL LOCATION} | *const | +| raw_pointer.rs:17:19:17:19 | x | TPtrConst | {EXTERNAL LOCATION} | i64 | | raw_pointer.rs:21:21:27:1 | { ... } | | {EXTERNAL LOCATION} | () | | raw_pointer.rs:22:13:22:13 | a | | {EXTERNAL LOCATION} | i32 | | raw_pointer.rs:22:17:22:21 | 10i32 | | {EXTERNAL LOCATION} | i32 | | raw_pointer.rs:23:9:23:9 | x | | {EXTERNAL LOCATION} | *mut | +| raw_pointer.rs:23:9:23:9 | x | TPtrMut | {EXTERNAL LOCATION} | i32 | | raw_pointer.rs:23:13:23:22 | &raw mut a | | {EXTERNAL LOCATION} | *mut | +| raw_pointer.rs:23:13:23:22 | &raw mut a | TPtrMut | {EXTERNAL LOCATION} | i32 | | raw_pointer.rs:23:22:23:22 | a | | {EXTERNAL LOCATION} | i32 | | raw_pointer.rs:24:5:26:5 | { ... } | | {EXTERNAL LOCATION} | () | | raw_pointer.rs:25:19:25:19 | x | | {EXTERNAL LOCATION} | *mut | +| raw_pointer.rs:25:19:25:19 | x | TPtrMut | {EXTERNAL LOCATION} | i32 | | raw_pointer.rs:29:18:29:21 | cond | | {EXTERNAL LOCATION} | bool | | raw_pointer.rs:29:30:40:1 | { ... } | | {EXTERNAL LOCATION} | () | | raw_pointer.rs:30:9:30:9 | a | | {EXTERNAL LOCATION} | i32 | | raw_pointer.rs:30:13:30:17 | 10i32 | | {EXTERNAL LOCATION} | i32 | -| raw_pointer.rs:32:9:32:19 | ptr_written | | {EXTERNAL LOCATION} | *mut | -| raw_pointer.rs:32:23:32:32 | null_mut(...) | | {EXTERNAL LOCATION} | *mut | | raw_pointer.rs:33:5:39:5 | if cond {...} | | {EXTERNAL LOCATION} | () | | raw_pointer.rs:33:8:33:11 | cond | | {EXTERNAL LOCATION} | bool | +| raw_pointer.rs:33:13:39:5 | { ... } | | {EXTERNAL LOCATION} | () | | raw_pointer.rs:34:9:38:9 | { ... } | | {EXTERNAL LOCATION} | () | -| raw_pointer.rs:36:14:36:24 | ptr_written | | {EXTERNAL LOCATION} | *mut | +| raw_pointer.rs:36:13:36:28 | ... = ... | | {EXTERNAL LOCATION} | () | | raw_pointer.rs:36:28:36:28 | a | | {EXTERNAL LOCATION} | i32 | -| raw_pointer.rs:37:23:37:33 | ptr_written | | {EXTERNAL LOCATION} | *mut | | raw_pointer.rs:42:24:42:27 | cond | | {EXTERNAL LOCATION} | bool | | raw_pointer.rs:42:36:51:1 | { ... } | | {EXTERNAL LOCATION} | () | -| raw_pointer.rs:44:9:44:16 | ptr_read | | {EXTERNAL LOCATION} | *mut | -| raw_pointer.rs:44:20:44:29 | null_mut(...) | | {EXTERNAL LOCATION} | *mut | | raw_pointer.rs:45:5:50:5 | if cond {...} | | {EXTERNAL LOCATION} | () | | raw_pointer.rs:45:8:45:11 | cond | | {EXTERNAL LOCATION} | bool | +| raw_pointer.rs:45:13:50:5 | { ... } | | {EXTERNAL LOCATION} | () | | raw_pointer.rs:46:9:49:9 | { ... } | | {EXTERNAL LOCATION} | () | | raw_pointer.rs:48:17:48:18 | _y | | {EXTERNAL LOCATION} | i64 | -| raw_pointer.rs:48:28:48:35 | ptr_read | | {EXTERNAL LOCATION} | *mut | | raw_pointer.rs:53:15:60:1 | { ... } | | {EXTERNAL LOCATION} | () | -| raw_pointer.rs:54:5:54:32 | raw_pointer_const_deref(...) | | {EXTERNAL LOCATION} | i32 | | raw_pointer.rs:54:29:54:31 | &10 | | {EXTERNAL LOCATION} | & | -| raw_pointer.rs:55:5:55:36 | raw_pointer_mut_deref(...) | | {EXTERNAL LOCATION} | i32 | | raw_pointer.rs:55:27:55:35 | &mut true | | {EXTERNAL LOCATION} | &mut | +| raw_pointer.rs:55:27:55:35 | &mut true | TRefMut | {EXTERNAL LOCATION} | bool | | raw_pointer.rs:55:32:55:35 | true | | {EXTERNAL LOCATION} | bool | -| raw_pointer.rs:56:5:56:22 | raw_const_borrow(...) | | {EXTERNAL LOCATION} | () | -| raw_pointer.rs:57:5:57:20 | raw_mut_borrow(...) | | {EXTERNAL LOCATION} | () | -| raw_pointer.rs:58:5:58:24 | raw_mut_write(...) | | {EXTERNAL LOCATION} | () | | raw_pointer.rs:58:19:58:23 | false | | {EXTERNAL LOCATION} | bool | -| raw_pointer.rs:59:5:59:30 | raw_type_from_deref(...) | | {EXTERNAL LOCATION} | () | | raw_pointer.rs:59:25:59:29 | false | | {EXTERNAL LOCATION} | bool | | regressions.rs:10:17:10:17 | s | | regressions.rs:3:5:3:23 | S | | regressions.rs:10:17:10:17 | s | T | regressions.rs:9:10:9:10 | T | -| regressions.rs:10:34:12:9 | { ... } | | {EXTERNAL LOCATION} | Option | -| regressions.rs:10:34:12:9 | { ... } | T | regressions.rs:9:10:9:10 | T | | regressions.rs:11:18:11:18 | s | | regressions.rs:3:5:3:23 | S | | regressions.rs:11:18:11:18 | s | T | regressions.rs:9:10:9:10 | T | -| regressions.rs:15:21:33:5 | { ... } | | regressions.rs:5:5:7:5 | E | -| regressions.rs:16:17:16:21 | vec_e | | {EXTERNAL LOCATION} | Vec | -| regressions.rs:16:17:16:21 | vec_e | A | {EXTERNAL LOCATION} | Global | -| regressions.rs:16:25:16:34 | ...::new(...) | | {EXTERNAL LOCATION} | Vec | -| regressions.rs:16:25:16:34 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | | regressions.rs:19:13:19:13 | e | | regressions.rs:5:5:7:5 | E | | regressions.rs:19:17:19:40 | ...::V {...} | | regressions.rs:5:5:7:5 | E | -| regressions.rs:19:29:19:38 | ...::new(...) | | {EXTERNAL LOCATION} | Vec | -| regressions.rs:19:29:19:38 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | | regressions.rs:21:9:23:9 | if ... {...} | | {EXTERNAL LOCATION} | () | | regressions.rs:21:32:23:9 | { ... } | | {EXTERNAL LOCATION} | () | -| regressions.rs:22:13:22:17 | vec_e | | {EXTERNAL LOCATION} | Vec | -| regressions.rs:22:13:22:17 | vec_e | A | {EXTERNAL LOCATION} | Global | +| regressions.rs:24:9:24:24 | ... = ... | | {EXTERNAL LOCATION} | () | | regressions.rs:24:17:24:17 | e | | regressions.rs:5:5:7:5 | E | | regressions.rs:27:17:30:9 | if ... {...} | | {EXTERNAL LOCATION} | () | -| regressions.rs:27:37:27:41 | vec_e | | {EXTERNAL LOCATION} | Vec | -| regressions.rs:27:37:27:41 | vec_e | A | {EXTERNAL LOCATION} | Global | | regressions.rs:28:9:30:9 | { ... } | | {EXTERNAL LOCATION} | () | +| regressions.rs:29:13:29:31 | ... = ... | | {EXTERNAL LOCATION} | () | | regressions.rs:48:16:48:19 | SelfParam | | regressions.rs:39:5:40:14 | S1 | | regressions.rs:48:22:48:25 | _rhs | | regressions.rs:39:5:40:14 | S1 | -| regressions.rs:48:50:50:9 | { ... } | | regressions.rs:39:5:40:14 | S1 | | regressions.rs:57:16:57:19 | SelfParam | | regressions.rs:39:5:40:14 | S1 | | regressions.rs:57:22:57:25 | _rhs | | regressions.rs:41:5:42:14 | S2 | -| regressions.rs:57:48:59:9 | { ... } | | regressions.rs:41:5:42:14 | S2 | | regressions.rs:66:16:66:19 | SelfParam | | regressions.rs:39:5:40:14 | S1 | | regressions.rs:66:22:66:26 | other | | {EXTERNAL LOCATION} | & | | regressions.rs:66:22:66:26 | other | TRef | regressions.rs:41:5:42:14 | S2 | -| regressions.rs:66:61:68:9 | { ... } | | regressions.rs:41:5:42:14 | S2 | | regressions.rs:67:22:67:25 | self | | regressions.rs:39:5:40:14 | S1 | | regressions.rs:67:29:67:33 | other | | {EXTERNAL LOCATION} | & | | regressions.rs:67:29:67:33 | other | TRef | regressions.rs:41:5:42:14 | S2 | @@ -5372,11 +5030,8 @@ inferCertainType | regressions.rs:86:34:88:9 | { ... } | | regressions.rs:85:10:85:10 | T | | regressions.rs:87:13:87:13 | s | | regressions.rs:85:10:85:10 | T | | regressions.rs:92:20:92:22 | val | | regressions.rs:91:10:91:10 | T | -| regressions.rs:92:41:94:9 | { ... } | | {EXTERNAL LOCATION} | Option | -| regressions.rs:92:41:94:9 | { ... } | T | regressions.rs:91:10:91:10 | T | | regressions.rs:93:18:93:20 | val | | regressions.rs:91:10:91:10 | T | | regressions.rs:99:22:99:22 | x | | regressions.rs:99:18:99:19 | T2 | -| regressions.rs:103:5:107:5 | { ... } | | regressions.rs:99:18:99:19 | T2 | | regressions.rs:104:33:104:33 | x | | regressions.rs:99:18:99:19 | T2 | | regressions.rs:113:14:113:17 | SelfParam | | regressions.rs:111:5:114:5 | Self [trait MyTrait] | | regressions.rs:118:14:118:17 | SelfParam | | {EXTERNAL LOCATION} | & | @@ -5389,14 +5044,8 @@ inferCertainType | regressions.rs:128:24:128:27 | self | T | regressions.rs:123:10:123:10 | T | | regressions.rs:139:17:139:17 | _ | | {EXTERNAL LOCATION} | & | | regressions.rs:139:17:139:17 | _ | TRef | regressions.rs:135:5:135:14 | S1 | -| regressions.rs:139:33:141:9 | { ... } | | regressions.rs:136:5:136:22 | S2 | -| regressions.rs:139:33:141:9 | { ... } | T2 | regressions.rs:135:5:135:14 | S1 | | regressions.rs:145:17:145:17 | t | | regressions.rs:144:10:144:10 | T | -| regressions.rs:145:31:147:9 | { ... } | | regressions.rs:136:5:136:22 | S2 | -| regressions.rs:145:31:147:9 | { ... } | T2 | regressions.rs:144:10:144:10 | T | | regressions.rs:146:16:146:16 | t | | regressions.rs:144:10:144:10 | T | -| regressions.rs:150:24:153:5 | { ... } | | regressions.rs:136:5:136:22 | S2 | -| regressions.rs:150:24:153:5 | { ... } | T2 | regressions.rs:135:5:135:14 | S1 | | regressions.rs:164:16:164:19 | SelfParam | | regressions.rs:158:5:158:19 | S | | regressions.rs:164:16:164:19 | SelfParam | T | regressions.rs:160:10:160:10 | T | | regressions.rs:164:22:164:25 | _rhs | | regressions.rs:158:5:158:19 | S | @@ -5462,10 +5111,8 @@ inferType | associated_types.rs:81:9:81:11 | 'a' | | {EXTERNAL LOCATION} | char | | associated_types.rs:92:15:92:18 | SelfParam | | associated_types.rs:88:5:103:5 | Self [trait MyTrait] | | associated_types.rs:94:15:94:18 | SelfParam | | associated_types.rs:88:5:103:5 | Self [trait MyTrait] | -| associated_types.rs:98:9:102:9 | { ... } | | associated_types.rs:89:9:89:28 | AssociatedType[MyTrait] | | associated_types.rs:99:13:99:16 | self | | associated_types.rs:88:5:103:5 | Self [trait MyTrait] | | associated_types.rs:99:13:99:21 | self.m1() | | associated_types.rs:89:9:89:28 | AssociatedType[MyTrait] | -| associated_types.rs:101:13:101:43 | ...::default(...) | | associated_types.rs:89:9:89:28 | AssociatedType[MyTrait] | | associated_types.rs:109:15:109:18 | SelfParam | | associated_types.rs:10:1:11:9 | S | | associated_types.rs:109:45:111:9 | { ... } | | associated_types.rs:16:1:17:10 | S3 | | associated_types.rs:110:13:110:14 | S3 | | associated_types.rs:16:1:17:10 | S3 | @@ -7243,30 +6890,24 @@ inferType | dereference.rs:144:17:144:26 | key_to_key | S | {EXTERNAL LOCATION} | RandomState | | dereference.rs:144:17:144:26 | key_to_key | V | {EXTERNAL LOCATION} | & | | dereference.rs:144:17:144:26 | key_to_key | V.TRef | dereference.rs:122:5:123:21 | Key | -| dereference.rs:144:30:144:57 | ...::new(...) | | {EXTERNAL LOCATION} | HashMap | -| dereference.rs:144:30:144:57 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| dereference.rs:144:30:144:57 | ...::new(...) | K | {EXTERNAL LOCATION} | & | -| dereference.rs:144:30:144:57 | ...::new(...) | K.TRef | dereference.rs:122:5:123:21 | Key | -| dereference.rs:144:30:144:57 | ...::new(...) | S | {EXTERNAL LOCATION} | RandomState | -| dereference.rs:144:30:144:57 | ...::new(...) | V | {EXTERNAL LOCATION} | & | -| dereference.rs:144:30:144:57 | ...::new(...) | V.TRef | dereference.rs:122:5:123:21 | Key | +| dereference.rs:144:30:144:54 | ...::new(...) | | {EXTERNAL LOCATION} | HashMap | +| dereference.rs:144:30:144:54 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| dereference.rs:144:30:144:54 | ...::new(...) | K | {EXTERNAL LOCATION} | & | +| dereference.rs:144:30:144:54 | ...::new(...) | K.TRef | dereference.rs:122:5:123:21 | Key | +| dereference.rs:144:30:144:54 | ...::new(...) | S | {EXTERNAL LOCATION} | RandomState | +| dereference.rs:144:30:144:54 | ...::new(...) | V | {EXTERNAL LOCATION} | & | +| dereference.rs:144:30:144:54 | ...::new(...) | V.TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:145:17:145:19 | key | | {EXTERNAL LOCATION} | & | | dereference.rs:145:17:145:19 | key | TRef | dereference.rs:122:5:123:21 | Key | -| dereference.rs:145:17:145:19 | key | TRef | {EXTERNAL LOCATION} | & | -| dereference.rs:145:17:145:19 | key | TRef.TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:145:23:145:29 | &... | | {EXTERNAL LOCATION} | & | | dereference.rs:145:23:145:29 | &... | TRef | dereference.rs:122:5:123:21 | Key | -| dereference.rs:145:23:145:29 | &... | TRef | {EXTERNAL LOCATION} | & | -| dereference.rs:145:23:145:29 | &... | TRef.TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:145:24:145:29 | Key {...} | | dereference.rs:122:5:123:21 | Key | | dereference.rs:146:9:149:9 | if ... {...} | | {EXTERNAL LOCATION} | () | | dereference.rs:146:16:146:28 | Some(...) | | {EXTERNAL LOCATION} | Option | | dereference.rs:146:16:146:28 | Some(...) | T | {EXTERNAL LOCATION} | & | -| dereference.rs:146:16:146:28 | Some(...) | T.TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:146:16:146:28 | Some(...) | T.TRef | {EXTERNAL LOCATION} | & | | dereference.rs:146:16:146:28 | Some(...) | T.TRef.TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:146:21:146:27 | ref_key | | {EXTERNAL LOCATION} | & | -| dereference.rs:146:21:146:27 | ref_key | TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:146:21:146:27 | ref_key | TRef | {EXTERNAL LOCATION} | & | | dereference.rs:146:21:146:27 | ref_key | TRef.TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:146:32:146:41 | key_to_key | | {EXTERNAL LOCATION} | HashMap | @@ -7278,21 +6919,15 @@ inferType | dereference.rs:146:32:146:41 | key_to_key | V.TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:146:32:146:50 | key_to_key.get(...) | | {EXTERNAL LOCATION} | Option | | dereference.rs:146:32:146:50 | key_to_key.get(...) | T | {EXTERNAL LOCATION} | & | -| dereference.rs:146:32:146:50 | key_to_key.get(...) | T.TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:146:32:146:50 | key_to_key.get(...) | T.TRef | {EXTERNAL LOCATION} | & | | dereference.rs:146:32:146:50 | key_to_key.get(...) | T.TRef.TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:146:47:146:49 | key | | {EXTERNAL LOCATION} | & | | dereference.rs:146:47:146:49 | key | TRef | dereference.rs:122:5:123:21 | Key | -| dereference.rs:146:47:146:49 | key | TRef | {EXTERNAL LOCATION} | & | -| dereference.rs:146:47:146:49 | key | TRef.TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:146:52:149:9 | { ... } | | {EXTERNAL LOCATION} | () | | dereference.rs:148:13:148:15 | key | | {EXTERNAL LOCATION} | & | | dereference.rs:148:13:148:15 | key | TRef | dereference.rs:122:5:123:21 | Key | -| dereference.rs:148:13:148:15 | key | TRef | {EXTERNAL LOCATION} | & | -| dereference.rs:148:13:148:15 | key | TRef.TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:148:13:148:25 | ... = ... | | {EXTERNAL LOCATION} | () | | dereference.rs:148:19:148:25 | ref_key | | {EXTERNAL LOCATION} | & | -| dereference.rs:148:19:148:25 | ref_key | TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:148:19:148:25 | ref_key | TRef | {EXTERNAL LOCATION} | & | | dereference.rs:148:19:148:25 | ref_key | TRef.TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:150:9:150:18 | key_to_key | | {EXTERNAL LOCATION} | HashMap | @@ -7305,16 +6940,10 @@ inferType | dereference.rs:150:9:150:35 | key_to_key.insert(...) | | {EXTERNAL LOCATION} | Option | | dereference.rs:150:9:150:35 | key_to_key.insert(...) | T | {EXTERNAL LOCATION} | & | | dereference.rs:150:9:150:35 | key_to_key.insert(...) | T.TRef | dereference.rs:122:5:123:21 | Key | -| dereference.rs:150:9:150:35 | key_to_key.insert(...) | T.TRef | {EXTERNAL LOCATION} | & | -| dereference.rs:150:9:150:35 | key_to_key.insert(...) | T.TRef.TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:150:27:150:29 | key | | {EXTERNAL LOCATION} | & | | dereference.rs:150:27:150:29 | key | TRef | dereference.rs:122:5:123:21 | Key | -| dereference.rs:150:27:150:29 | key | TRef | {EXTERNAL LOCATION} | & | -| dereference.rs:150:27:150:29 | key | TRef.TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:150:32:150:34 | key | | {EXTERNAL LOCATION} | & | | dereference.rs:150:32:150:34 | key | TRef | dereference.rs:122:5:123:21 | Key | -| dereference.rs:150:32:150:34 | key | TRef | {EXTERNAL LOCATION} | & | -| dereference.rs:150:32:150:34 | key | TRef.TRef | dereference.rs:122:5:123:21 | Key | | dereference.rs:156:16:156:19 | SelfParam | | dereference.rs:155:5:157:5 | Self [trait MyTrait1] | | dereference.rs:163:16:163:19 | SelfParam | | {EXTERNAL LOCATION} | & | | dereference.rs:163:16:163:19 | SelfParam | TRef | dereference.rs:159:5:159:13 | S | @@ -7322,9 +6951,8 @@ inferType | dereference.rs:164:13:164:13 | S | | dereference.rs:159:5:159:13 | S | | dereference.rs:170:16:170:19 | SelfParam | | {EXTERNAL LOCATION} | &mut | | dereference.rs:170:16:170:19 | SelfParam | TRefMut | dereference.rs:159:5:159:13 | S | -| dereference.rs:170:29:172:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:170:29:172:9 | { ... } | | {EXTERNAL LOCATION} | i32 | | dereference.rs:171:13:171:14 | 42 | | {EXTERNAL LOCATION} | i32 | -| dereference.rs:171:13:171:14 | 42 | | {EXTERNAL LOCATION} | i64 | | dereference.rs:176:16:176:19 | SelfParam | | dereference.rs:175:5:177:5 | Self [trait MyTrait2] | | dereference.rs:176:22:176:24 | arg | | dereference.rs:175:20:175:21 | T1 | | dereference.rs:181:16:181:19 | SelfParam | | dereference.rs:159:5:159:13 | S | @@ -7335,9 +6963,8 @@ inferType | dereference.rs:188:16:188:19 | SelfParam | | dereference.rs:159:5:159:13 | S | | dereference.rs:188:22:188:24 | arg | | {EXTERNAL LOCATION} | &mut | | dereference.rs:188:22:188:24 | arg | TRefMut | dereference.rs:159:5:159:13 | S | -| dereference.rs:188:42:190:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| dereference.rs:188:42:190:9 | { ... } | | {EXTERNAL LOCATION} | i32 | | dereference.rs:189:13:189:14 | 42 | | {EXTERNAL LOCATION} | i32 | -| dereference.rs:189:13:189:14 | 42 | | {EXTERNAL LOCATION} | i64 | | dereference.rs:193:19:200:5 | { ... } | | {EXTERNAL LOCATION} | () | | dereference.rs:194:13:194:13 | x | | dereference.rs:159:5:159:13 | S | | dereference.rs:194:17:194:20 | (...) | | {EXTERNAL LOCATION} | & | @@ -7454,14 +7081,12 @@ inferType | dyn_type.rs:60:46:60:46 | a | | dyn_type.rs:60:18:60:43 | A | | dyn_type.rs:60:78:62:1 | { ... } | | {EXTERNAL LOCATION} | Box | | dyn_type.rs:60:78:62:1 | { ... } | A | {EXTERNAL LOCATION} | Global | -| dyn_type.rs:60:78:62:1 | { ... } | T | dyn_type.rs:10:1:13:1 | dyn GenericGet | -| dyn_type.rs:60:78:62:1 | { ... } | T.dyn(A) | dyn_type.rs:60:18:60:43 | A | +| dyn_type.rs:60:78:62:1 | { ... } | T | dyn_type.rs:33:1:36:1 | GenStruct | +| dyn_type.rs:60:78:62:1 | { ... } | T.A | dyn_type.rs:60:18:60:43 | A | | dyn_type.rs:61:5:61:36 | ...::new(...) | | {EXTERNAL LOCATION} | Box | | dyn_type.rs:61:5:61:36 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| dyn_type.rs:61:5:61:36 | ...::new(...) | T | dyn_type.rs:10:1:13:1 | dyn GenericGet | | dyn_type.rs:61:5:61:36 | ...::new(...) | T | dyn_type.rs:33:1:36:1 | GenStruct | | dyn_type.rs:61:5:61:36 | ...::new(...) | T.A | dyn_type.rs:60:18:60:43 | A | -| dyn_type.rs:61:5:61:36 | ...::new(...) | T.dyn(A) | dyn_type.rs:60:18:60:43 | A | | dyn_type.rs:61:14:61:35 | GenStruct {...} | | dyn_type.rs:33:1:36:1 | GenStruct | | dyn_type.rs:61:14:61:35 | GenStruct {...} | A | dyn_type.rs:60:18:60:43 | A | | dyn_type.rs:61:33:61:33 | a | | dyn_type.rs:60:18:60:43 | A | @@ -8558,14 +8183,13 @@ inferType | main.rs:581:9:581:13 | thing | TRef | main.rs:580:17:580:37 | T | | main.rs:581:9:581:21 | thing.get_a() | | main.rs:580:14:580:14 | A | | main.rs:585:44:585:48 | thing | | main.rs:585:24:585:41 | S | -| main.rs:585:61:588:5 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:585:61:588:5 | { ... } | | {EXTERNAL LOCATION} | i32 | | main.rs:586:13:586:15 | _ms | | {EXTERNAL LOCATION} | Option | | main.rs:586:13:586:15 | _ms | T | main.rs:585:24:585:41 | S | | main.rs:586:19:586:23 | thing | | main.rs:585:24:585:41 | S | | main.rs:586:19:586:31 | thing.get_a() | | {EXTERNAL LOCATION} | Option | | main.rs:586:19:586:31 | thing.get_a() | T | main.rs:585:24:585:41 | S | | main.rs:587:9:587:9 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:587:9:587:9 | 0 | | {EXTERNAL LOCATION} | i64 | | main.rs:593:55:593:59 | thing | | {EXTERNAL LOCATION} | & | | main.rs:593:55:593:59 | thing | TRef | main.rs:593:25:593:52 | S | | main.rs:593:66:596:5 | { ... } | | {EXTERNAL LOCATION} | () | @@ -8968,7 +8592,6 @@ inferType | main.rs:781:17:781:26 | ...::m2(...) | | {EXTERNAL LOCATION} | i32 | | main.rs:781:24:781:25 | S1 | | main.rs:623:5:624:14 | S1 | | main.rs:782:13:782:13 | y | | {EXTERNAL LOCATION} | i32 | -| main.rs:782:22:782:31 | ...::m2(...) | | {EXTERNAL LOCATION} | i32 | | main.rs:782:29:782:30 | S2 | | main.rs:625:5:626:14 | S2 | | main.rs:799:15:799:18 | SelfParam | | main.rs:787:5:791:5 | MyEnum | | main.rs:799:15:799:18 | SelfParam | A | main.rs:798:10:798:10 | T | @@ -9021,10 +8644,8 @@ inferType | main.rs:843:16:843:16 | 3 | | {EXTERNAL LOCATION} | i32 | | main.rs:843:16:843:20 | ... > ... | | {EXTERNAL LOCATION} | bool | | main.rs:843:20:843:20 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:843:22:845:13 | { ... } | | main.rs:837:20:837:22 | Tr2 | | main.rs:844:17:844:20 | self | | {EXTERNAL LOCATION} | & | | main.rs:844:17:844:20 | self | TRef | main.rs:837:5:849:5 | Self [trait MyTrait2] | -| main.rs:844:17:844:25 | self.m1() | | main.rs:837:20:837:22 | Tr2 | | main.rs:845:20:847:13 | { ... } | | main.rs:837:20:837:22 | Tr2 | | main.rs:846:17:846:31 | ...::m1(...) | | main.rs:837:20:837:22 | Tr2 | | main.rs:846:26:846:30 | * ... | | main.rs:837:5:849:5 | Self [trait MyTrait2] | @@ -9253,7 +8874,6 @@ inferType | main.rs:981:22:981:25 | SelfParam | Fst | main.rs:980:10:980:12 | Fst | | main.rs:981:22:981:25 | SelfParam | Snd | main.rs:980:15:980:17 | Snd | | main.rs:981:35:988:9 | { ... } | | main.rs:980:15:980:17 | Snd | -| main.rs:982:13:987:13 | match self { ... } | | file://:0:0:0:0 | ! | | main.rs:982:13:987:13 | match self { ... } | | main.rs:980:15:980:17 | Snd | | main.rs:982:19:982:22 | self | | main.rs:972:5:978:5 | PairOption | | main.rs:982:19:982:22 | self | Fst | main.rs:980:10:980:12 | Fst | @@ -9261,20 +8881,18 @@ inferType | main.rs:983:17:983:38 | ...::PairNone(...) | | main.rs:972:5:978:5 | PairOption | | main.rs:983:17:983:38 | ...::PairNone(...) | Fst | main.rs:980:10:980:12 | Fst | | main.rs:983:17:983:38 | ...::PairNone(...) | Snd | main.rs:980:15:980:17 | Snd | -| main.rs:983:43:983:82 | MacroExpr | | file://:0:0:0:0 | ! | +| main.rs:983:43:983:82 | MacroExpr | | main.rs:980:15:980:17 | Snd | | main.rs:983:50:983:81 | "PairNone has no second elemen... | | {EXTERNAL LOCATION} | & | | main.rs:983:50:983:81 | "PairNone has no second elemen... | TRef | {EXTERNAL LOCATION} | str | -| main.rs:983:50:983:81 | ...::panic_fmt(...) | | file://:0:0:0:0 | ! | | main.rs:983:50:983:81 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:983:50:983:81 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:984:17:984:38 | ...::PairFst(...) | | main.rs:972:5:978:5 | PairOption | | main.rs:984:17:984:38 | ...::PairFst(...) | Fst | main.rs:980:10:980:12 | Fst | | main.rs:984:17:984:38 | ...::PairFst(...) | Snd | main.rs:980:15:980:17 | Snd | | main.rs:984:37:984:37 | _ | | main.rs:980:10:980:12 | Fst | -| main.rs:984:43:984:81 | MacroExpr | | file://:0:0:0:0 | ! | +| main.rs:984:43:984:81 | MacroExpr | | main.rs:980:15:980:17 | Snd | | main.rs:984:50:984:80 | "PairFst has no second element... | | {EXTERNAL LOCATION} | & | | main.rs:984:50:984:80 | "PairFst has no second element... | TRef | {EXTERNAL LOCATION} | str | -| main.rs:984:50:984:80 | ...::panic_fmt(...) | | file://:0:0:0:0 | ! | | main.rs:984:50:984:80 | MacroExpr | | {EXTERNAL LOCATION} | () | | main.rs:984:50:984:80 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:985:17:985:40 | ...::PairSnd(...) | | main.rs:972:5:978:5 | PairOption | @@ -9968,10 +9586,12 @@ inferType | main.rs:1298:15:1298:19 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:1298:15:1298:19 | SelfParam | TRef | main.rs:1295:5:1295:13 | S | | main.rs:1298:31:1300:9 | { ... } | | {EXTERNAL LOCATION} | & | -| main.rs:1298:31:1300:9 | { ... } | TRef | main.rs:1295:5:1295:13 | S | +| main.rs:1298:31:1300:9 | { ... } | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1298:31:1300:9 | { ... } | TRef.TRef | {EXTERNAL LOCATION} | & | +| main.rs:1298:31:1300:9 | { ... } | TRef.TRef.TRef | {EXTERNAL LOCATION} | & | +| main.rs:1298:31:1300:9 | { ... } | TRef.TRef.TRef.TRef | main.rs:1295:5:1295:13 | S | | main.rs:1299:13:1299:19 | &... | | {EXTERNAL LOCATION} | & | | main.rs:1299:13:1299:19 | &... | TRef | {EXTERNAL LOCATION} | & | -| main.rs:1299:13:1299:19 | &... | TRef | main.rs:1295:5:1295:13 | S | | main.rs:1299:13:1299:19 | &... | TRef.TRef | {EXTERNAL LOCATION} | & | | main.rs:1299:13:1299:19 | &... | TRef.TRef.TRef | {EXTERNAL LOCATION} | & | | main.rs:1299:13:1299:19 | &... | TRef.TRef.TRef.TRef | main.rs:1295:5:1295:13 | S | @@ -9987,10 +9607,12 @@ inferType | main.rs:1302:15:1302:25 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:1302:15:1302:25 | SelfParam | TRef | main.rs:1295:5:1295:13 | S | | main.rs:1302:37:1304:9 | { ... } | | {EXTERNAL LOCATION} | & | -| main.rs:1302:37:1304:9 | { ... } | TRef | main.rs:1295:5:1295:13 | S | +| main.rs:1302:37:1304:9 | { ... } | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1302:37:1304:9 | { ... } | TRef.TRef | {EXTERNAL LOCATION} | & | +| main.rs:1302:37:1304:9 | { ... } | TRef.TRef.TRef | {EXTERNAL LOCATION} | & | +| main.rs:1302:37:1304:9 | { ... } | TRef.TRef.TRef.TRef | main.rs:1295:5:1295:13 | S | | main.rs:1303:13:1303:19 | &... | | {EXTERNAL LOCATION} | & | | main.rs:1303:13:1303:19 | &... | TRef | {EXTERNAL LOCATION} | & | -| main.rs:1303:13:1303:19 | &... | TRef | main.rs:1295:5:1295:13 | S | | main.rs:1303:13:1303:19 | &... | TRef.TRef | {EXTERNAL LOCATION} | & | | main.rs:1303:13:1303:19 | &... | TRef.TRef.TRef | {EXTERNAL LOCATION} | & | | main.rs:1303:13:1303:19 | &... | TRef.TRef.TRef.TRef | main.rs:1295:5:1295:13 | S | @@ -10012,10 +9634,12 @@ inferType | main.rs:1310:15:1310:15 | x | | {EXTERNAL LOCATION} | & | | main.rs:1310:15:1310:15 | x | TRef | main.rs:1295:5:1295:13 | S | | main.rs:1310:34:1312:9 | { ... } | | {EXTERNAL LOCATION} | & | -| main.rs:1310:34:1312:9 | { ... } | TRef | main.rs:1295:5:1295:13 | S | +| main.rs:1310:34:1312:9 | { ... } | TRef | {EXTERNAL LOCATION} | & | +| main.rs:1310:34:1312:9 | { ... } | TRef.TRef | {EXTERNAL LOCATION} | & | +| main.rs:1310:34:1312:9 | { ... } | TRef.TRef.TRef | {EXTERNAL LOCATION} | & | +| main.rs:1310:34:1312:9 | { ... } | TRef.TRef.TRef.TRef | main.rs:1295:5:1295:13 | S | | main.rs:1311:13:1311:16 | &... | | {EXTERNAL LOCATION} | & | | main.rs:1311:13:1311:16 | &... | TRef | {EXTERNAL LOCATION} | & | -| main.rs:1311:13:1311:16 | &... | TRef | main.rs:1295:5:1295:13 | S | | main.rs:1311:13:1311:16 | &... | TRef.TRef | {EXTERNAL LOCATION} | & | | main.rs:1311:13:1311:16 | &... | TRef.TRef.TRef | {EXTERNAL LOCATION} | & | | main.rs:1311:13:1311:16 | &... | TRef.TRef.TRef.TRef | main.rs:1295:5:1295:13 | S | @@ -10267,13 +9891,9 @@ inferType | main.rs:1414:26:1414:30 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:1414:26:1414:30 | SelfParam | TRef | {EXTERNAL LOCATION} | [;] | | main.rs:1414:26:1414:30 | SelfParam | TRef.TArray | main.rs:1413:14:1413:23 | T | -| main.rs:1414:39:1416:13 | { ... } | | {EXTERNAL LOCATION} | & | -| main.rs:1414:39:1416:13 | { ... } | TRef | main.rs:1413:14:1413:23 | T | | main.rs:1415:17:1415:20 | self | | {EXTERNAL LOCATION} | & | | main.rs:1415:17:1415:20 | self | TRef | {EXTERNAL LOCATION} | [;] | | main.rs:1415:17:1415:20 | self | TRef.TArray | main.rs:1413:14:1413:23 | T | -| main.rs:1415:17:1415:36 | ... .unwrap() | | {EXTERNAL LOCATION} | & | -| main.rs:1415:17:1415:36 | ... .unwrap() | TRef | main.rs:1413:14:1413:23 | T | | main.rs:1415:26:1415:26 | 0 | | {EXTERNAL LOCATION} | i32 | | main.rs:1418:31:1420:13 | { ... } | | main.rs:1413:14:1413:23 | T | | main.rs:1419:17:1419:28 | ...::default(...) | | main.rs:1413:14:1413:23 | T | @@ -10306,14 +9926,12 @@ inferType | main.rs:1428:26:1428:30 | SelfParam | TRef | {EXTERNAL LOCATION} | [] | | main.rs:1428:26:1428:30 | SelfParam | TRef.TSlice | main.rs:1427:14:1427:23 | T | | main.rs:1428:39:1430:13 | { ... } | | {EXTERNAL LOCATION} | & | -| main.rs:1428:39:1430:13 | { ... } | TRef | main.rs:1427:14:1427:23 | T | | main.rs:1429:17:1429:20 | self | | {EXTERNAL LOCATION} | & | | main.rs:1429:17:1429:20 | self | TRef | {EXTERNAL LOCATION} | [] | | main.rs:1429:17:1429:20 | self | TRef.TSlice | main.rs:1427:14:1427:23 | T | | main.rs:1429:17:1429:27 | self.get(...) | | {EXTERNAL LOCATION} | Option | | main.rs:1429:17:1429:27 | self.get(...) | T | {EXTERNAL LOCATION} | & | | main.rs:1429:17:1429:36 | ... .unwrap() | | {EXTERNAL LOCATION} | & | -| main.rs:1429:17:1429:36 | ... .unwrap() | TRef | main.rs:1427:14:1427:23 | T | | main.rs:1429:26:1429:26 | 0 | | {EXTERNAL LOCATION} | i32 | | main.rs:1432:31:1434:13 | { ... } | | main.rs:1427:14:1427:23 | T | | main.rs:1433:17:1433:28 | ...::default(...) | | main.rs:1427:14:1427:23 | T | @@ -10321,10 +9939,8 @@ inferType | main.rs:1437:13:1437:13 | s | TRef | {EXTERNAL LOCATION} | [] | | main.rs:1437:13:1437:13 | s | TRef.TSlice | {EXTERNAL LOCATION} | i32 | | main.rs:1437:25:1437:34 | &... | | {EXTERNAL LOCATION} | & | -| main.rs:1437:25:1437:34 | &... | TRef | {EXTERNAL LOCATION} | [] | | main.rs:1437:25:1437:34 | &... | TRef | {EXTERNAL LOCATION} | [;] | | main.rs:1437:25:1437:34 | &... | TRef.TArray | {EXTERNAL LOCATION} | i32 | -| main.rs:1437:25:1437:34 | &... | TRef.TSlice | {EXTERNAL LOCATION} | i32 | | main.rs:1437:26:1437:34 | [...] | | {EXTERNAL LOCATION} | [;] | | main.rs:1437:26:1437:34 | [...] | TArray | {EXTERNAL LOCATION} | i32 | | main.rs:1437:27:1437:27 | 1 | | {EXTERNAL LOCATION} | i32 | @@ -11309,7 +10925,6 @@ inferType | main.rs:1971:18:1971:22 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:1971:18:1971:22 | SelfParam | TRef | main.rs:1938:5:1938:22 | S3 | | main.rs:1971:18:1971:22 | SelfParam | TRef.T3 | main.rs:1970:10:1970:17 | T | -| main.rs:1971:30:1974:9 | { ... } | | main.rs:1970:10:1970:17 | T | | main.rs:1972:17:1972:21 | S3(...) | | {EXTERNAL LOCATION} | & | | main.rs:1972:17:1972:21 | S3(...) | | main.rs:1938:5:1938:22 | S3 | | main.rs:1972:17:1972:21 | S3(...) | TRef | main.rs:1938:5:1938:22 | S3 | @@ -11317,7 +10932,6 @@ inferType | main.rs:1972:25:1972:28 | self | | {EXTERNAL LOCATION} | & | | main.rs:1972:25:1972:28 | self | TRef | main.rs:1938:5:1938:22 | S3 | | main.rs:1972:25:1972:28 | self | TRef.T3 | main.rs:1970:10:1970:17 | T | -| main.rs:1973:13:1973:21 | t.clone() | | main.rs:1970:10:1970:17 | T | | main.rs:1977:45:1979:5 | { ... } | | main.rs:1935:5:1936:14 | S1 | | main.rs:1978:9:1978:10 | S1 | | main.rs:1935:5:1936:14 | S1 | | main.rs:1981:41:1981:41 | t | | main.rs:1981:26:1981:38 | B | @@ -11325,50 +10939,38 @@ inferType | main.rs:1982:9:1982:9 | t | | main.rs:1981:26:1981:38 | B | | main.rs:1982:9:1982:17 | t.get_a() | | main.rs:1981:23:1981:23 | A | | main.rs:1985:34:1985:34 | x | | main.rs:1985:24:1985:31 | T | -| main.rs:1985:59:1987:5 | { ... } | | main.rs:1985:43:1985:57 | impl ... | -| main.rs:1985:59:1987:5 | { ... } | impl(T) | main.rs:1985:24:1985:31 | T | +| main.rs:1985:59:1987:5 | { ... } | | main.rs:1938:5:1938:22 | S3 | +| main.rs:1985:59:1987:5 | { ... } | T3 | main.rs:1985:24:1985:31 | T | | main.rs:1986:9:1986:13 | S3(...) | | main.rs:1938:5:1938:22 | S3 | -| main.rs:1986:9:1986:13 | S3(...) | | main.rs:1985:43:1985:57 | impl ... | | main.rs:1986:9:1986:13 | S3(...) | T3 | main.rs:1985:24:1985:31 | T | -| main.rs:1986:9:1986:13 | S3(...) | impl(T) | main.rs:1985:24:1985:31 | T | | main.rs:1986:12:1986:12 | x | | main.rs:1985:24:1985:31 | T | | main.rs:1989:34:1989:34 | x | | main.rs:1989:24:1989:31 | T | | main.rs:1989:67:1991:5 | { ... } | | {EXTERNAL LOCATION} | Option | -| main.rs:1989:67:1991:5 | { ... } | T | main.rs:1989:50:1989:64 | impl ... | -| main.rs:1989:67:1991:5 | { ... } | T.impl(T) | main.rs:1989:24:1989:31 | T | +| main.rs:1989:67:1991:5 | { ... } | T | main.rs:1938:5:1938:22 | S3 | +| main.rs:1989:67:1991:5 | { ... } | T.T3 | main.rs:1989:24:1989:31 | T | | main.rs:1990:9:1990:19 | Some(...) | | {EXTERNAL LOCATION} | Option | | main.rs:1990:9:1990:19 | Some(...) | T | main.rs:1938:5:1938:22 | S3 | -| main.rs:1990:9:1990:19 | Some(...) | T | main.rs:1989:50:1989:64 | impl ... | | main.rs:1990:9:1990:19 | Some(...) | T.T3 | main.rs:1989:24:1989:31 | T | -| main.rs:1990:9:1990:19 | Some(...) | T.impl(T) | main.rs:1989:24:1989:31 | T | | main.rs:1990:14:1990:18 | S3(...) | | main.rs:1938:5:1938:22 | S3 | | main.rs:1990:14:1990:18 | S3(...) | T3 | main.rs:1989:24:1989:31 | T | | main.rs:1990:17:1990:17 | x | | main.rs:1989:24:1989:31 | T | | main.rs:1993:34:1993:34 | x | | main.rs:1993:24:1993:31 | T | | main.rs:1993:78:1995:5 | { ... } | | {EXTERNAL LOCATION} | (T_2) | -| main.rs:1993:78:1995:5 | { ... } | T0 | main.rs:1993:44:1993:58 | impl ... | -| main.rs:1993:78:1995:5 | { ... } | T0.impl(T) | main.rs:1993:24:1993:31 | T | -| main.rs:1993:78:1995:5 | { ... } | T1 | main.rs:1993:61:1993:75 | impl ... | -| main.rs:1993:78:1995:5 | { ... } | T1.impl(T) | main.rs:1993:24:1993:31 | T | +| main.rs:1993:78:1995:5 | { ... } | T0 | main.rs:1938:5:1938:22 | S3 | +| main.rs:1993:78:1995:5 | { ... } | T0.T3 | main.rs:1993:24:1993:31 | T | +| main.rs:1993:78:1995:5 | { ... } | T1 | main.rs:1938:5:1938:22 | S3 | +| main.rs:1993:78:1995:5 | { ... } | T1.T3 | main.rs:1993:24:1993:31 | T | | main.rs:1994:9:1994:30 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | | main.rs:1994:9:1994:30 | TupleExpr | T0 | main.rs:1938:5:1938:22 | S3 | -| main.rs:1994:9:1994:30 | TupleExpr | T0 | main.rs:1993:44:1993:58 | impl ... | | main.rs:1994:9:1994:30 | TupleExpr | T0.T3 | main.rs:1993:24:1993:31 | T | -| main.rs:1994:9:1994:30 | TupleExpr | T0.impl(T) | main.rs:1993:24:1993:31 | T | | main.rs:1994:9:1994:30 | TupleExpr | T1 | main.rs:1938:5:1938:22 | S3 | -| main.rs:1994:9:1994:30 | TupleExpr | T1 | main.rs:1993:61:1993:75 | impl ... | | main.rs:1994:9:1994:30 | TupleExpr | T1.T3 | main.rs:1993:24:1993:31 | T | -| main.rs:1994:9:1994:30 | TupleExpr | T1.impl(T) | main.rs:1993:24:1993:31 | T | | main.rs:1994:10:1994:22 | S3(...) | | main.rs:1938:5:1938:22 | S3 | -| main.rs:1994:10:1994:22 | S3(...) | | main.rs:1993:44:1993:58 | impl ... | | main.rs:1994:10:1994:22 | S3(...) | T3 | main.rs:1993:24:1993:31 | T | -| main.rs:1994:10:1994:22 | S3(...) | impl(T) | main.rs:1993:24:1993:31 | T | | main.rs:1994:13:1994:13 | x | | main.rs:1993:24:1993:31 | T | | main.rs:1994:13:1994:21 | x.clone() | | main.rs:1993:24:1993:31 | T | | main.rs:1994:25:1994:29 | S3(...) | | main.rs:1938:5:1938:22 | S3 | -| main.rs:1994:25:1994:29 | S3(...) | | main.rs:1993:61:1993:75 | impl ... | | main.rs:1994:25:1994:29 | S3(...) | T3 | main.rs:1993:24:1993:31 | T | -| main.rs:1994:25:1994:29 | S3(...) | impl(T) | main.rs:1993:24:1993:31 | T | | main.rs:1994:28:1994:28 | x | | main.rs:1993:24:1993:31 | T | | main.rs:1997:26:1997:26 | t | | main.rs:1997:29:1997:43 | impl ... | | main.rs:1997:51:1999:5 | { ... } | | main.rs:1997:23:1997:23 | A | @@ -11536,18 +11138,13 @@ inferType | main.rs:2107:14:2107:18 | value | TRef | {EXTERNAL LOCATION} | i64 | | main.rs:2115:19:2115:22 | SelfParam | | {EXTERNAL LOCATION} | i64 | | main.rs:2115:25:2115:29 | value | | {EXTERNAL LOCATION} | bool | -| main.rs:2115:46:2121:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2115:46:2121:9 | { ... } | | {EXTERNAL LOCATION} | i32 | | main.rs:2116:13:2120:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i32 | -| main.rs:2116:13:2120:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i64 | | main.rs:2116:16:2116:20 | value | | {EXTERNAL LOCATION} | bool | | main.rs:2116:22:2118:13 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2116:22:2118:13 | { ... } | | {EXTERNAL LOCATION} | i64 | | main.rs:2117:17:2117:17 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2117:17:2117:17 | 1 | | {EXTERNAL LOCATION} | i64 | | main.rs:2118:20:2120:13 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2118:20:2120:13 | { ... } | | {EXTERNAL LOCATION} | i64 | | main.rs:2119:17:2119:17 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2119:17:2119:17 | 0 | | {EXTERNAL LOCATION} | i64 | | main.rs:2130:19:2130:22 | SelfParam | | main.rs:2124:5:2124:19 | S | | main.rs:2130:19:2130:22 | SelfParam | T | main.rs:2126:10:2126:17 | T | | main.rs:2130:25:2130:29 | other | | main.rs:2124:5:2124:19 | S | @@ -11597,18 +11194,13 @@ inferType | main.rs:2163:40:2165:9 | { ... } | | {EXTERNAL LOCATION} | i64 | | main.rs:2164:13:2164:17 | value | | {EXTERNAL LOCATION} | i64 | | main.rs:2170:20:2170:24 | value | | {EXTERNAL LOCATION} | bool | -| main.rs:2170:41:2176:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2170:41:2176:9 | { ... } | | {EXTERNAL LOCATION} | i32 | | main.rs:2171:13:2175:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i32 | -| main.rs:2171:13:2175:13 | if value {...} else {...} | | {EXTERNAL LOCATION} | i64 | | main.rs:2171:16:2171:20 | value | | {EXTERNAL LOCATION} | bool | | main.rs:2171:22:2173:13 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2171:22:2173:13 | { ... } | | {EXTERNAL LOCATION} | i64 | | main.rs:2172:17:2172:17 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2172:17:2172:17 | 1 | | {EXTERNAL LOCATION} | i64 | | main.rs:2173:20:2175:13 | { ... } | | {EXTERNAL LOCATION} | i32 | -| main.rs:2173:20:2175:13 | { ... } | | {EXTERNAL LOCATION} | i64 | | main.rs:2174:17:2174:17 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2174:17:2174:17 | 0 | | {EXTERNAL LOCATION} | i64 | | main.rs:2181:21:2181:25 | value | | main.rs:2179:19:2179:19 | T | | main.rs:2181:31:2181:31 | x | | main.rs:2179:5:2182:5 | Self [trait MyFrom2] | | main.rs:2186:21:2186:25 | value | | {EXTERNAL LOCATION} | i64 | @@ -11627,26 +11219,20 @@ inferType | main.rs:2204:15:2204:15 | x | | main.rs:2202:5:2208:5 | Self [trait MySelfTrait] | | main.rs:2207:15:2207:15 | x | | main.rs:2202:5:2208:5 | Self [trait MySelfTrait] | | main.rs:2212:15:2212:15 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2212:31:2214:9 | { ... } | | {EXTERNAL LOCATION} | i64 | | main.rs:2213:13:2213:13 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2213:13:2213:17 | ... + ... | | {EXTERNAL LOCATION} | i64 | | main.rs:2213:17:2213:17 | 1 | | {EXTERNAL LOCATION} | i32 | | main.rs:2217:15:2217:15 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2217:32:2219:9 | { ... } | | {EXTERNAL LOCATION} | i64 | | main.rs:2218:13:2218:13 | x | | {EXTERNAL LOCATION} | i64 | -| main.rs:2218:13:2218:17 | ... + ... | | {EXTERNAL LOCATION} | i64 | | main.rs:2218:17:2218:17 | 1 | | {EXTERNAL LOCATION} | i32 | | main.rs:2224:15:2224:15 | x | | {EXTERNAL LOCATION} | bool | -| main.rs:2224:31:2226:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2224:31:2226:9 | { ... } | | {EXTERNAL LOCATION} | i32 | | main.rs:2225:13:2225:13 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2225:13:2225:13 | 0 | | {EXTERNAL LOCATION} | i64 | | main.rs:2229:15:2229:15 | x | | {EXTERNAL LOCATION} | bool | | main.rs:2229:32:2231:9 | { ... } | | {EXTERNAL LOCATION} | bool | | main.rs:2230:13:2230:13 | x | | {EXTERNAL LOCATION} | bool | | main.rs:2234:16:2259:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2235:13:2235:13 | x | | {EXTERNAL LOCATION} | i64 | | main.rs:2235:22:2235:23 | 73 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2235:22:2235:23 | 73 | | {EXTERNAL LOCATION} | i64 | | main.rs:2236:9:2236:9 | x | | {EXTERNAL LOCATION} | i64 | | main.rs:2236:9:2236:22 | x.my_add(...) | | {EXTERNAL LOCATION} | i64 | | main.rs:2236:18:2236:21 | 5i64 | | {EXTERNAL LOCATION} | i64 | @@ -11722,9 +11308,8 @@ inferType | main.rs:2267:13:2267:25 | MyCallable {...} | | main.rs:2263:5:2263:24 | MyCallable | | main.rs:2270:17:2270:21 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:2270:17:2270:21 | SelfParam | TRef | main.rs:2263:5:2263:24 | MyCallable | -| main.rs:2270:31:2272:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| main.rs:2270:31:2272:9 | { ... } | | {EXTERNAL LOCATION} | i32 | | main.rs:2271:13:2271:13 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2271:13:2271:13 | 1 | | {EXTERNAL LOCATION} | i64 | | main.rs:2275:16:2382:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2278:9:2278:29 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2278:13:2278:13 | i | | {EXTERNAL LOCATION} | i32 | @@ -11770,9 +11355,7 @@ inferType | main.rs:2282:21:2282:31 | [...] | TArray | {EXTERNAL LOCATION} | u8 | | main.rs:2282:22:2282:24 | 1u8 | | {EXTERNAL LOCATION} | u8 | | main.rs:2282:27:2282:27 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2282:27:2282:27 | 2 | | {EXTERNAL LOCATION} | u8 | | main.rs:2282:30:2282:30 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2282:30:2282:30 | 3 | | {EXTERNAL LOCATION} | u8 | | main.rs:2283:9:2283:25 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2283:13:2283:13 | u | | {EXTERNAL LOCATION} | i32 | | main.rs:2283:13:2283:13 | u | | {EXTERNAL LOCATION} | u8 | @@ -11796,13 +11379,9 @@ inferType | main.rs:2288:26:2288:26 | 3 | | {EXTERNAL LOCATION} | i32 | | main.rs:2288:31:2288:39 | [...] | | {EXTERNAL LOCATION} | [;] | | main.rs:2288:31:2288:39 | [...] | TArray | {EXTERNAL LOCATION} | i32 | -| main.rs:2288:31:2288:39 | [...] | TArray | {EXTERNAL LOCATION} | u32 | | main.rs:2288:32:2288:32 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2288:32:2288:32 | 1 | | {EXTERNAL LOCATION} | u32 | | main.rs:2288:35:2288:35 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2288:35:2288:35 | 2 | | {EXTERNAL LOCATION} | u32 | | main.rs:2288:38:2288:38 | 3 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2288:38:2288:38 | 3 | | {EXTERNAL LOCATION} | u32 | | main.rs:2289:9:2289:25 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2289:13:2289:13 | u | | {EXTERNAL LOCATION} | u32 | | main.rs:2289:18:2289:22 | vals3 | | {EXTERNAL LOCATION} | [;] | @@ -11813,9 +11392,7 @@ inferType | main.rs:2291:26:2291:26 | 3 | | {EXTERNAL LOCATION} | i32 | | main.rs:2291:31:2291:36 | [1; 3] | | {EXTERNAL LOCATION} | [;] | | main.rs:2291:31:2291:36 | [1; 3] | TArray | {EXTERNAL LOCATION} | i32 | -| main.rs:2291:31:2291:36 | [1; 3] | TArray | {EXTERNAL LOCATION} | u64 | | main.rs:2291:32:2291:32 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2291:32:2291:32 | 1 | | {EXTERNAL LOCATION} | u64 | | main.rs:2291:35:2291:35 | 3 | | {EXTERNAL LOCATION} | i32 | | main.rs:2292:9:2292:25 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2292:13:2292:13 | u | | {EXTERNAL LOCATION} | u64 | @@ -11943,7 +11520,6 @@ inferType | main.rs:2325:19:2325:25 | 0u8..10 | Idx | {EXTERNAL LOCATION} | i32 | | main.rs:2325:19:2325:25 | 0u8..10 | Idx | {EXTERNAL LOCATION} | u8 | | main.rs:2325:24:2325:25 | 10 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2325:24:2325:25 | 10 | | {EXTERNAL LOCATION} | u8 | | main.rs:2325:28:2325:29 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2326:13:2326:17 | range | | {EXTERNAL LOCATION} | Range | | main.rs:2326:13:2326:17 | range | Idx | {EXTERNAL LOCATION} | i32 | @@ -11999,9 +11575,6 @@ inferType | main.rs:2343:32:2343:43 | [...] | | {EXTERNAL LOCATION} | [;] | | main.rs:2343:32:2343:43 | [...] | TArray | {EXTERNAL LOCATION} | i32 | | main.rs:2343:32:2343:43 | [...] | TArray | {EXTERNAL LOCATION} | u16 | -| main.rs:2343:32:2343:52 | ... .to_vec() | | {EXTERNAL LOCATION} | Vec | -| main.rs:2343:32:2343:52 | ... .to_vec() | A | {EXTERNAL LOCATION} | Global | -| main.rs:2343:32:2343:52 | ... .to_vec() | T | {EXTERNAL LOCATION} | u16 | | main.rs:2343:33:2343:36 | 1u16 | | {EXTERNAL LOCATION} | u16 | | main.rs:2343:39:2343:39 | 2 | | {EXTERNAL LOCATION} | i32 | | main.rs:2343:42:2343:42 | 3 | | {EXTERNAL LOCATION} | i32 | @@ -12048,10 +11621,6 @@ inferType | main.rs:2352:32:2352:43 | [...] | | {EXTERNAL LOCATION} | [;] | | main.rs:2352:32:2352:43 | [...] | TArray | {EXTERNAL LOCATION} | i32 | | main.rs:2352:32:2352:43 | [...] | TArray | {EXTERNAL LOCATION} | u64 | -| main.rs:2352:32:2352:60 | ... .collect() | | {EXTERNAL LOCATION} | Vec | -| main.rs:2352:32:2352:60 | ... .collect() | A | {EXTERNAL LOCATION} | Global | -| main.rs:2352:32:2352:60 | ... .collect() | T | {EXTERNAL LOCATION} | & | -| main.rs:2352:32:2352:60 | ... .collect() | T.TRef | {EXTERNAL LOCATION} | u64 | | main.rs:2352:33:2352:36 | 1u64 | | {EXTERNAL LOCATION} | u64 | | main.rs:2352:39:2352:39 | 2 | | {EXTERNAL LOCATION} | i32 | | main.rs:2352:42:2352:42 | 3 | | {EXTERNAL LOCATION} | i32 | @@ -12285,7 +11854,6 @@ inferType | main.rs:2372:35:2372:36 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2376:17:2376:17 | a | | {EXTERNAL LOCATION} | i64 | | main.rs:2376:26:2376:26 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2376:26:2376:26 | 0 | | {EXTERNAL LOCATION} | i64 | | main.rs:2378:13:2378:13 | _ | | {EXTERNAL LOCATION} | () | | main.rs:2378:17:2381:9 | while ... { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2378:23:2378:23 | a | | {EXTERNAL LOCATION} | i64 | @@ -12620,6 +12188,7 @@ inferType | main.rs:2545:18:2545:22 | SelfParam | TRef | main.rs:2532:5:2532:25 | PathBuf | | main.rs:2545:34:2549:9 | { ... } | | {EXTERNAL LOCATION} | & | | main.rs:2545:34:2549:9 | { ... } | TRef | main.rs:2520:5:2520:22 | Path | +| main.rs:2547:20:2547:23 | path | | main.rs:2520:5:2520:22 | Path | | main.rs:2547:33:2547:43 | ...::new(...) | | main.rs:2520:5:2520:22 | Path | | main.rs:2548:13:2548:17 | &path | | {EXTERNAL LOCATION} | & | | main.rs:2548:13:2548:17 | &path | TRef | main.rs:2520:5:2520:22 | Path | @@ -12693,8 +12262,10 @@ inferType | main.rs:2589:14:2589:14 | b | | {EXTERNAL LOCATION} | bool | | main.rs:2589:48:2606:5 | { ... } | | {EXTERNAL LOCATION} | Box | | main.rs:2589:48:2606:5 | { ... } | A | {EXTERNAL LOCATION} | Global | -| main.rs:2589:48:2606:5 | { ... } | T | main.rs:2564:5:2566:5 | dyn MyTrait | -| main.rs:2589:48:2606:5 | { ... } | T.dyn(T) | {EXTERNAL LOCATION} | i32 | +| main.rs:2589:48:2606:5 | { ... } | T | main.rs:2568:5:2569:19 | S | +| main.rs:2589:48:2606:5 | { ... } | T.T | {EXTERNAL LOCATION} | i32 | +| main.rs:2589:48:2606:5 | { ... } | T.T | main.rs:2568:5:2569:19 | S | +| main.rs:2589:48:2606:5 | { ... } | T.T.T | {EXTERNAL LOCATION} | i32 | | main.rs:2590:13:2590:13 | x | | main.rs:2568:5:2569:19 | S | | main.rs:2590:13:2590:13 | x | T | {EXTERNAL LOCATION} | i32 | | main.rs:2590:17:2595:9 | if b {...} else {...} | | main.rs:2568:5:2569:19 | S | @@ -12720,20 +12291,16 @@ inferType | main.rs:2599:19:2599:19 | 1 | | {EXTERNAL LOCATION} | i32 | | main.rs:2600:9:2605:9 | if b {...} else {...} | | {EXTERNAL LOCATION} | Box | | main.rs:2600:9:2605:9 | if b {...} else {...} | A | {EXTERNAL LOCATION} | Global | -| main.rs:2600:9:2605:9 | if b {...} else {...} | T | main.rs:2564:5:2566:5 | dyn MyTrait | | main.rs:2600:9:2605:9 | if b {...} else {...} | T | main.rs:2568:5:2569:19 | S | | main.rs:2600:9:2605:9 | if b {...} else {...} | T.T | {EXTERNAL LOCATION} | i32 | | main.rs:2600:9:2605:9 | if b {...} else {...} | T.T | main.rs:2568:5:2569:19 | S | | main.rs:2600:9:2605:9 | if b {...} else {...} | T.T.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2600:9:2605:9 | if b {...} else {...} | T.dyn(T) | {EXTERNAL LOCATION} | i32 | | main.rs:2600:12:2600:12 | b | | {EXTERNAL LOCATION} | bool | | main.rs:2600:14:2603:9 | { ... } | | {EXTERNAL LOCATION} | Box | | main.rs:2600:14:2603:9 | { ... } | A | {EXTERNAL LOCATION} | Global | -| main.rs:2600:14:2603:9 | { ... } | T | main.rs:2564:5:2566:5 | dyn MyTrait | | main.rs:2600:14:2603:9 | { ... } | T | main.rs:2568:5:2569:19 | S | | main.rs:2600:14:2603:9 | { ... } | T.T | main.rs:2568:5:2569:19 | S | | main.rs:2600:14:2603:9 | { ... } | T.T.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2600:14:2603:9 | { ... } | T.dyn(T) | {EXTERNAL LOCATION} | i32 | | main.rs:2601:17:2601:17 | x | | main.rs:2568:5:2569:19 | S | | main.rs:2601:17:2601:17 | x | T | main.rs:2568:5:2569:19 | S | | main.rs:2601:17:2601:17 | x | T.T | {EXTERNAL LOCATION} | i32 | @@ -12744,26 +12311,20 @@ inferType | main.rs:2601:21:2601:26 | x.m2() | T.T | {EXTERNAL LOCATION} | i32 | | main.rs:2602:13:2602:23 | ...::new(...) | | {EXTERNAL LOCATION} | Box | | main.rs:2602:13:2602:23 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2602:13:2602:23 | ...::new(...) | T | main.rs:2564:5:2566:5 | dyn MyTrait | | main.rs:2602:13:2602:23 | ...::new(...) | T | main.rs:2568:5:2569:19 | S | | main.rs:2602:13:2602:23 | ...::new(...) | T.T | main.rs:2568:5:2569:19 | S | | main.rs:2602:13:2602:23 | ...::new(...) | T.T.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2602:13:2602:23 | ...::new(...) | T.dyn(T) | {EXTERNAL LOCATION} | i32 | | main.rs:2602:22:2602:22 | x | | main.rs:2568:5:2569:19 | S | | main.rs:2602:22:2602:22 | x | T | main.rs:2568:5:2569:19 | S | | main.rs:2602:22:2602:22 | x | T.T | {EXTERNAL LOCATION} | i32 | | main.rs:2603:16:2605:9 | { ... } | | {EXTERNAL LOCATION} | Box | | main.rs:2603:16:2605:9 | { ... } | A | {EXTERNAL LOCATION} | Global | -| main.rs:2603:16:2605:9 | { ... } | T | main.rs:2564:5:2566:5 | dyn MyTrait | | main.rs:2603:16:2605:9 | { ... } | T | main.rs:2568:5:2569:19 | S | | main.rs:2603:16:2605:9 | { ... } | T.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2603:16:2605:9 | { ... } | T.dyn(T) | {EXTERNAL LOCATION} | i32 | | main.rs:2604:13:2604:23 | ...::new(...) | | {EXTERNAL LOCATION} | Box | | main.rs:2604:13:2604:23 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2604:13:2604:23 | ...::new(...) | T | main.rs:2564:5:2566:5 | dyn MyTrait | | main.rs:2604:13:2604:23 | ...::new(...) | T | main.rs:2568:5:2569:19 | S | | main.rs:2604:13:2604:23 | ...::new(...) | T.T | {EXTERNAL LOCATION} | i32 | -| main.rs:2604:13:2604:23 | ...::new(...) | T.dyn(T) | {EXTERNAL LOCATION} | i32 | | main.rs:2604:22:2604:22 | x | | main.rs:2568:5:2569:19 | S | | main.rs:2604:22:2604:22 | x | T | {EXTERNAL LOCATION} | i32 | | main.rs:2610:22:2614:5 | { ... } | | {EXTERNAL LOCATION} | () | @@ -12981,33 +12542,28 @@ inferType | main.rs:2750:28:2752:9 | { ... } | TRef | main.rs:2748:10:2748:10 | T | | main.rs:2751:13:2751:16 | self | | {EXTERNAL LOCATION} | & | | main.rs:2751:13:2751:16 | self | TRef | main.rs:2748:10:2748:10 | T | -| main.rs:2755:25:2759:5 | { ... } | | {EXTERNAL LOCATION} | usize | +| main.rs:2755:25:2759:5 | { ... } | | {EXTERNAL LOCATION} | i32 | | main.rs:2756:17:2756:17 | x | | {EXTERNAL LOCATION} | i32 | -| main.rs:2756:17:2756:17 | x | | {EXTERNAL LOCATION} | usize | | main.rs:2756:21:2756:21 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2756:21:2756:21 | 0 | | {EXTERNAL LOCATION} | usize | | main.rs:2757:9:2757:9 | x | | {EXTERNAL LOCATION} | i32 | -| main.rs:2757:9:2757:9 | x | | {EXTERNAL LOCATION} | usize | | main.rs:2757:9:2757:17 | ... = ... | | {EXTERNAL LOCATION} | () | | main.rs:2757:13:2757:13 | x | | {EXTERNAL LOCATION} | i32 | -| main.rs:2757:13:2757:13 | x | | {EXTERNAL LOCATION} | usize | | main.rs:2757:13:2757:17 | x.f() | | {EXTERNAL LOCATION} | i32 | -| main.rs:2757:13:2757:17 | x.f() | | {EXTERNAL LOCATION} | usize | | main.rs:2758:9:2758:9 | x | | {EXTERNAL LOCATION} | i32 | -| main.rs:2758:9:2758:9 | x | | {EXTERNAL LOCATION} | usize | | main.rs:2761:12:2769:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2762:13:2762:13 | x | | {EXTERNAL LOCATION} | usize | | main.rs:2762:24:2762:24 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2762:24:2762:24 | 0 | | {EXTERNAL LOCATION} | usize | | main.rs:2763:13:2763:13 | y | | {EXTERNAL LOCATION} | & | | main.rs:2763:13:2763:13 | y | TRef | {EXTERNAL LOCATION} | i32 | | main.rs:2763:17:2763:18 | &1 | | {EXTERNAL LOCATION} | & | | main.rs:2763:17:2763:18 | &1 | TRef | {EXTERNAL LOCATION} | i32 | | main.rs:2763:18:2763:18 | 1 | | {EXTERNAL LOCATION} | i32 | | main.rs:2764:13:2764:13 | z | | {EXTERNAL LOCATION} | & | +| main.rs:2764:13:2764:13 | z | TRef | {EXTERNAL LOCATION} | i32 | | main.rs:2764:13:2764:13 | z | TRef | {EXTERNAL LOCATION} | usize | | main.rs:2764:17:2764:17 | x | | {EXTERNAL LOCATION} | usize | | main.rs:2764:17:2764:22 | x.g(...) | | {EXTERNAL LOCATION} | & | +| main.rs:2764:17:2764:22 | x.g(...) | TRef | {EXTERNAL LOCATION} | i32 | | main.rs:2764:17:2764:22 | x.g(...) | TRef | {EXTERNAL LOCATION} | usize | | main.rs:2764:21:2764:21 | y | | {EXTERNAL LOCATION} | & | | main.rs:2764:21:2764:21 | y | TRef | {EXTERNAL LOCATION} | i32 | @@ -13015,10 +12571,11 @@ inferType | main.rs:2766:17:2766:17 | 0 | | {EXTERNAL LOCATION} | i32 | | main.rs:2767:13:2767:13 | y | | {EXTERNAL LOCATION} | usize | | main.rs:2767:24:2767:24 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2767:24:2767:24 | 1 | | {EXTERNAL LOCATION} | usize | | main.rs:2768:13:2768:13 | z | | {EXTERNAL LOCATION} | i32 | +| main.rs:2768:13:2768:13 | z | | {EXTERNAL LOCATION} | usize | | main.rs:2768:17:2768:17 | x | | {EXTERNAL LOCATION} | i32 | | main.rs:2768:17:2768:24 | x.max(...) | | {EXTERNAL LOCATION} | i32 | +| main.rs:2768:17:2768:24 | x.max(...) | | {EXTERNAL LOCATION} | usize | | main.rs:2768:23:2768:23 | y | | {EXTERNAL LOCATION} | usize | | main.rs:2783:22:2783:26 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:2783:22:2783:26 | SelfParam | TRef | main.rs:2782:5:2784:5 | Self [trait Container] | @@ -13066,7 +12623,9 @@ inferType | main.rs:2805:17:2805:20 | true | | {EXTERNAL LOCATION} | bool | | main.rs:2805:23:2805:23 | 0 | | {EXTERNAL LOCATION} | i32 | | main.rs:2806:9:2806:12 | arr3 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2806:9:2806:12 | arr3 | TArray | {EXTERNAL LOCATION} | i32 | | main.rs:2806:16:2806:17 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2806:16:2806:17 | [...] | TArray | {EXTERNAL LOCATION} | i32 | | main.rs:2808:21:2808:23 | arr | | {EXTERNAL LOCATION} | [;] | | main.rs:2808:21:2808:23 | arr | TArray | main.rs:2808:18:2808:18 | T | | main.rs:2808:30:2808:30 | 0 | | {EXTERNAL LOCATION} | i32 | @@ -13074,6 +12633,7 @@ inferType | main.rs:2808:40:2808:41 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2809:5:2809:22 | pin_array(...) | | {EXTERNAL LOCATION} | () | | main.rs:2809:15:2809:18 | arr3 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2809:15:2809:18 | arr3 | TArray | {EXTERNAL LOCATION} | i32 | | main.rs:2809:21:2809:21 | 1 | | {EXTERNAL LOCATION} | i32 | | main.rs:2812:11:2848:1 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2813:5:2813:21 | ...::f(...) | | {EXTERNAL LOCATION} | () | @@ -13126,9 +12686,8 @@ inferType | overloading.rs:8:20:8:24 | SelfParam | TRef | overloading.rs:2:5:11:5 | Self [trait FirstTrait] | | overloading.rs:14:19:14:23 | SelfParam | | {EXTERNAL LOCATION} | & | | overloading.rs:14:19:14:23 | SelfParam | TRef | overloading.rs:12:5:19:5 | Self [trait SecondTrait] | -| overloading.rs:14:33:16:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| overloading.rs:14:33:16:9 | { ... } | | {EXTERNAL LOCATION} | i32 | | overloading.rs:15:13:15:13 | 1 | | {EXTERNAL LOCATION} | i32 | -| overloading.rs:15:13:15:13 | 1 | | {EXTERNAL LOCATION} | i64 | | overloading.rs:18:20:18:24 | SelfParam | | {EXTERNAL LOCATION} | & | | overloading.rs:18:20:18:24 | SelfParam | TRef | overloading.rs:12:5:19:5 | Self [trait SecondTrait] | | overloading.rs:24:20:24:24 | SelfParam | | {EXTERNAL LOCATION} | & | @@ -13139,9 +12698,8 @@ inferType | overloading.rs:30:13:30:16 | true | | {EXTERNAL LOCATION} | bool | | overloading.rs:35:20:35:24 | SelfParam | | {EXTERNAL LOCATION} | & | | overloading.rs:35:20:35:24 | SelfParam | TRef | overloading.rs:20:5:21:13 | S | -| overloading.rs:35:34:37:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| overloading.rs:35:34:37:9 | { ... } | | {EXTERNAL LOCATION} | i32 | | overloading.rs:36:13:36:13 | 1 | | {EXTERNAL LOCATION} | i32 | -| overloading.rs:36:13:36:13 | 1 | | {EXTERNAL LOCATION} | i64 | | overloading.rs:43:20:43:24 | SelfParam | | {EXTERNAL LOCATION} | & | | overloading.rs:43:20:43:24 | SelfParam | TRef | overloading.rs:40:5:40:14 | S2 | | overloading.rs:43:35:45:9 | { ... } | | {EXTERNAL LOCATION} | bool | @@ -13441,9 +12999,8 @@ inferType | overloading.rs:234:13:234:13 | 0 | | {EXTERNAL LOCATION} | i32 | | overloading.rs:240:14:240:17 | SelfParam | | {EXTERNAL LOCATION} | i32 | | overloading.rs:240:20:240:20 | x | | {EXTERNAL LOCATION} | i64 | -| overloading.rs:240:35:242:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| overloading.rs:240:35:242:9 | { ... } | | {EXTERNAL LOCATION} | i32 | | overloading.rs:241:13:241:13 | 0 | | {EXTERNAL LOCATION} | i32 | -| overloading.rs:241:13:241:13 | 0 | | {EXTERNAL LOCATION} | i64 | | overloading.rs:246:14:246:17 | SelfParam | | overloading.rs:245:5:247:5 | Self [trait Trait2] | | overloading.rs:246:20:246:20 | x | | overloading.rs:245:18:245:19 | T1 | | overloading.rs:251:14:251:17 | SelfParam | | {EXTERNAL LOCATION} | i32 | @@ -13452,9 +13009,8 @@ inferType | overloading.rs:252:13:252:13 | 0 | | {EXTERNAL LOCATION} | i32 | | overloading.rs:258:14:258:17 | SelfParam | | {EXTERNAL LOCATION} | i32 | | overloading.rs:258:20:258:20 | x | | {EXTERNAL LOCATION} | i32 | -| overloading.rs:258:35:260:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| overloading.rs:258:35:260:9 | { ... } | | {EXTERNAL LOCATION} | i32 | | overloading.rs:259:13:259:13 | 0 | | {EXTERNAL LOCATION} | i32 | -| overloading.rs:259:13:259:13 | 0 | | {EXTERNAL LOCATION} | i64 | | overloading.rs:263:12:270:5 | { ... } | | {EXTERNAL LOCATION} | () | | overloading.rs:264:13:264:13 | x | | {EXTERNAL LOCATION} | i32 | | overloading.rs:264:17:264:17 | 0 | | {EXTERNAL LOCATION} | i32 | @@ -13517,7 +13073,7 @@ inferType | overloading.rs:352:14:352:17 | SelfParam | | overloading.rs:325:5:325:25 | S | | overloading.rs:352:14:352:17 | SelfParam | T | overloading.rs:349:10:349:10 | T | | overloading.rs:352:25:359:9 | { ... } | | overloading.rs:325:5:325:25 | S | -| overloading.rs:352:25:359:9 | { ... } | T | {EXTERNAL LOCATION} | i64 | +| overloading.rs:352:25:359:9 | { ... } | T | {EXTERNAL LOCATION} | i32 | | overloading.rs:353:17:353:17 | x | | {EXTERNAL LOCATION} | i64 | | overloading.rs:353:21:353:47 | ...::f(...) | | {EXTERNAL LOCATION} | i64 | | overloading.rs:353:26:353:46 | S(...) | | overloading.rs:325:5:325:25 | S | @@ -13545,7 +13101,6 @@ inferType | overloading.rs:357:42:357:59 | ...::default(...) | | {EXTERNAL LOCATION} | i64 | | overloading.rs:358:13:358:16 | S(...) | | overloading.rs:325:5:325:25 | S | | overloading.rs:358:13:358:16 | S(...) | T | {EXTERNAL LOCATION} | i32 | -| overloading.rs:358:13:358:16 | S(...) | T | {EXTERNAL LOCATION} | i64 | | overloading.rs:358:15:358:15 | 0 | | {EXTERNAL LOCATION} | i32 | | overloading.rs:367:17:370:5 | { ... } | | overloading.rs:364:5:365:13 | S | | overloading.rs:368:13:368:13 | x | | overloading.rs:364:5:365:13 | S | @@ -13590,7 +13145,6 @@ inferType | overloading.rs:422:16:422:20 | SelfParam | TRef | overloading.rs:405:5:405:19 | S | | overloading.rs:422:16:422:20 | SelfParam | TRef.T | {EXTERNAL LOCATION} | i32 | | overloading.rs:422:23:426:9 | { ... } | | {EXTERNAL LOCATION} | () | -| overloading.rs:423:13:423:24 | ...::foo(...) | | {EXTERNAL LOCATION} | () | | overloading.rs:423:20:423:23 | self | | {EXTERNAL LOCATION} | & | | overloading.rs:423:20:423:23 | self | TRef | overloading.rs:405:5:405:19 | S | | overloading.rs:423:20:423:23 | self | TRef.T | {EXTERNAL LOCATION} | i32 | @@ -13655,9 +13209,8 @@ inferType | overloading.rs:473:14:473:18 | SelfParam | | {EXTERNAL LOCATION} | & | | overloading.rs:473:14:473:18 | SelfParam | TRef | overloading.rs:464:5:464:19 | S | | overloading.rs:473:14:473:18 | SelfParam | TRef.T | {EXTERNAL LOCATION} | i32 | -| overloading.rs:473:28:475:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| overloading.rs:473:28:475:9 | { ... } | | {EXTERNAL LOCATION} | i32 | | overloading.rs:474:13:474:13 | 0 | | {EXTERNAL LOCATION} | i32 | -| overloading.rs:474:13:474:13 | 0 | | {EXTERNAL LOCATION} | i64 | | overloading.rs:481:14:481:18 | SelfParam | | {EXTERNAL LOCATION} | & | | overloading.rs:481:14:481:18 | SelfParam | TRef | overloading.rs:464:5:464:19 | S | | overloading.rs:481:14:481:18 | SelfParam | TRef.T | {EXTERNAL LOCATION} | i32 | @@ -13670,17 +13223,15 @@ inferType | overloading.rs:489:14:489:18 | SelfParam | TRef.T | {EXTERNAL LOCATION} | i32 | | overloading.rs:489:21:489:21 | x | | overloading.rs:464:5:464:19 | S | | overloading.rs:489:21:489:21 | x | T | {EXTERNAL LOCATION} | i64 | -| overloading.rs:489:48:491:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| overloading.rs:489:48:491:9 | { ... } | | {EXTERNAL LOCATION} | i32 | | overloading.rs:490:13:490:13 | 0 | | {EXTERNAL LOCATION} | i32 | -| overloading.rs:490:13:490:13 | 0 | | {EXTERNAL LOCATION} | i64 | | overloading.rs:497:14:497:18 | SelfParam | | {EXTERNAL LOCATION} | & | | overloading.rs:497:14:497:18 | SelfParam | TRef | overloading.rs:464:5:464:19 | S | | overloading.rs:497:14:497:18 | SelfParam | TRef.T | {EXTERNAL LOCATION} | i32 | | overloading.rs:497:21:497:21 | x | | overloading.rs:464:5:464:19 | S | | overloading.rs:497:21:497:21 | x | T | {EXTERNAL LOCATION} | bool | -| overloading.rs:497:49:499:9 | { ... } | | {EXTERNAL LOCATION} | i64 | +| overloading.rs:497:49:499:9 | { ... } | | {EXTERNAL LOCATION} | i32 | | overloading.rs:498:13:498:13 | 0 | | {EXTERNAL LOCATION} | i32 | -| overloading.rs:498:13:498:13 | 0 | | {EXTERNAL LOCATION} | i64 | | overloading.rs:502:36:502:36 | x | | overloading.rs:502:19:502:33 | T2 | | overloading.rs:502:49:504:5 | { ... } | | overloading.rs:502:15:502:16 | T1 | | overloading.rs:503:9:503:9 | x | | overloading.rs:502:19:502:33 | T2 | @@ -13697,12 +13248,9 @@ inferType | overloading.rs:511:17:511:20 | S(...) | | overloading.rs:464:5:464:19 | S | | overloading.rs:511:17:511:20 | S(...) | T | {EXTERNAL LOCATION} | i32 | | overloading.rs:511:19:511:19 | 0 | | {EXTERNAL LOCATION} | i32 | -| overloading.rs:512:13:512:13 | y | | {EXTERNAL LOCATION} | i32 | -| overloading.rs:512:17:512:25 | call_f(...) | | {EXTERNAL LOCATION} | i32 | | overloading.rs:512:24:512:24 | x | | overloading.rs:464:5:464:19 | S | | overloading.rs:512:24:512:24 | x | T | {EXTERNAL LOCATION} | i32 | | overloading.rs:513:13:513:13 | z | | {EXTERNAL LOCATION} | i32 | -| overloading.rs:513:22:513:22 | y | | {EXTERNAL LOCATION} | i32 | | overloading.rs:515:13:515:13 | x | | overloading.rs:464:5:464:19 | S | | overloading.rs:515:13:515:13 | x | T | {EXTERNAL LOCATION} | i32 | | overloading.rs:515:17:515:20 | S(...) | | overloading.rs:464:5:464:19 | S | @@ -14677,32 +14225,24 @@ inferType | pattern_matching.rs:443:25:498:1 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:444:9:444:13 | tuple | | {EXTERNAL LOCATION} | (T_3) | | pattern_matching.rs:444:9:444:13 | tuple | T0 | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:444:9:444:13 | tuple | T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:444:9:444:13 | tuple | T1 | {EXTERNAL LOCATION} | i64 | | pattern_matching.rs:444:9:444:13 | tuple | T2 | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:444:9:444:13 | tuple | T2 | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:444:17:444:36 | TupleExpr | | {EXTERNAL LOCATION} | (T_3) | | pattern_matching.rs:444:17:444:36 | TupleExpr | T0 | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:444:17:444:36 | TupleExpr | T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:444:17:444:36 | TupleExpr | T1 | {EXTERNAL LOCATION} | i64 | | pattern_matching.rs:444:17:444:36 | TupleExpr | T2 | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:444:17:444:36 | TupleExpr | T2 | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:444:18:444:21 | 1i32 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:444:24:444:27 | 2i64 | | {EXTERNAL LOCATION} | i64 | | pattern_matching.rs:444:30:444:35 | 3.0f32 | | {EXTERNAL LOCATION} | f32 | | pattern_matching.rs:447:5:458:5 | match tuple { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:447:11:447:15 | tuple | | {EXTERNAL LOCATION} | (T_3) | | pattern_matching.rs:447:11:447:15 | tuple | T0 | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:447:11:447:15 | tuple | T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:447:11:447:15 | tuple | T1 | {EXTERNAL LOCATION} | i64 | | pattern_matching.rs:447:11:447:15 | tuple | T2 | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:447:11:447:15 | tuple | T2 | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:448:9:448:19 | TuplePat | | {EXTERNAL LOCATION} | (T_3) | | pattern_matching.rs:448:9:448:19 | TuplePat | T0 | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:448:9:448:19 | TuplePat | T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:448:9:448:19 | TuplePat | T1 | {EXTERNAL LOCATION} | i64 | | pattern_matching.rs:448:9:448:19 | TuplePat | T2 | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:448:9:448:19 | TuplePat | T2 | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:448:10:448:10 | 1 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:448:13:448:13 | 2 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:448:13:448:13 | 2 | | {EXTERNAL LOCATION} | i64 | @@ -14711,16 +14251,12 @@ inferType | pattern_matching.rs:448:24:451:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:449:17:449:27 | exact_tuple | | {EXTERNAL LOCATION} | (T_3) | | pattern_matching.rs:449:17:449:27 | exact_tuple | T0 | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:449:17:449:27 | exact_tuple | T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:449:17:449:27 | exact_tuple | T1 | {EXTERNAL LOCATION} | i64 | | pattern_matching.rs:449:17:449:27 | exact_tuple | T2 | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:449:17:449:27 | exact_tuple | T2 | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:449:31:449:35 | tuple | | {EXTERNAL LOCATION} | (T_3) | | pattern_matching.rs:449:31:449:35 | tuple | T0 | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:449:31:449:35 | tuple | T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:449:31:449:35 | tuple | T1 | {EXTERNAL LOCATION} | i64 | | pattern_matching.rs:449:31:449:35 | tuple | T2 | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:449:31:449:35 | tuple | T2 | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:450:13:450:54 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:450:22:450:40 | "Exact tuple: {:?}\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:450:22:450:40 | "Exact tuple: {:?}\\n" | TRef | {EXTERNAL LOCATION} | str | @@ -14729,32 +14265,22 @@ inferType | pattern_matching.rs:450:22:450:53 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:450:43:450:53 | exact_tuple | | {EXTERNAL LOCATION} | (T_3) | | pattern_matching.rs:450:43:450:53 | exact_tuple | T0 | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:450:43:450:53 | exact_tuple | T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:450:43:450:53 | exact_tuple | T1 | {EXTERNAL LOCATION} | i64 | | pattern_matching.rs:450:43:450:53 | exact_tuple | T2 | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:450:43:450:53 | exact_tuple | T2 | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:452:9:452:17 | TuplePat | | {EXTERNAL LOCATION} | (T_3) | | pattern_matching.rs:452:9:452:17 | TuplePat | T0 | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:452:9:452:17 | TuplePat | T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:452:9:452:17 | TuplePat | T1 | {EXTERNAL LOCATION} | i64 | | pattern_matching.rs:452:9:452:17 | TuplePat | T2 | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:452:9:452:17 | TuplePat | T2 | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:452:10:452:10 | a | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:452:13:452:13 | b | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:452:13:452:13 | b | | {EXTERNAL LOCATION} | i64 | | pattern_matching.rs:452:16:452:16 | c | | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:452:16:452:16 | c | | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:452:22:457:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:453:17:453:26 | first_elem | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:453:30:453:30 | a | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:454:17:454:27 | second_elem | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:454:17:454:27 | second_elem | | {EXTERNAL LOCATION} | i64 | -| pattern_matching.rs:454:31:454:31 | b | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:454:31:454:31 | b | | {EXTERNAL LOCATION} | i64 | | pattern_matching.rs:455:17:455:26 | third_elem | | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:455:17:455:26 | third_elem | | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:455:30:455:30 | c | | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:455:30:455:30 | c | | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:456:13:456:80 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:456:22:456:42 | "Tuple: ({}, {}, {})\\n" | | {EXTERNAL LOCATION} | & | | pattern_matching.rs:456:22:456:42 | "Tuple: ({}, {}, {})\\n" | TRef | {EXTERNAL LOCATION} | str | @@ -14762,23 +14288,17 @@ inferType | pattern_matching.rs:456:22:456:79 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:456:22:456:79 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:456:45:456:54 | first_elem | | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:456:57:456:67 | second_elem | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:456:57:456:67 | second_elem | | {EXTERNAL LOCATION} | i64 | | pattern_matching.rs:456:70:456:79 | third_elem | | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:456:70:456:79 | third_elem | | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:461:5:466:5 | match tuple { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:461:11:461:15 | tuple | | {EXTERNAL LOCATION} | (T_3) | | pattern_matching.rs:461:11:461:15 | tuple | T0 | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:461:11:461:15 | tuple | T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:461:11:461:15 | tuple | T1 | {EXTERNAL LOCATION} | i64 | | pattern_matching.rs:461:11:461:15 | tuple | T2 | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:461:11:461:15 | tuple | T2 | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:462:9:462:19 | TuplePat | | {EXTERNAL LOCATION} | (T_3) | | pattern_matching.rs:462:9:462:19 | TuplePat | T0 | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:462:9:462:19 | TuplePat | T1 | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:462:9:462:19 | TuplePat | T1 | {EXTERNAL LOCATION} | i64 | | pattern_matching.rs:462:9:462:19 | TuplePat | T2 | {EXTERNAL LOCATION} | f32 | -| pattern_matching.rs:462:9:462:19 | TuplePat | T2 | {EXTERNAL LOCATION} | f64 | | pattern_matching.rs:462:24:465:9 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:464:13:464:54 | MacroExpr | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:464:22:464:40 | "First element: {}\\n" | | {EXTERNAL LOCATION} | & | @@ -14937,10 +14457,8 @@ inferType | pattern_matching.rs:523:9:523:13 | slice | TRef | {EXTERNAL LOCATION} | [] | | pattern_matching.rs:523:9:523:13 | slice | TRef.TSlice | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:523:25:523:40 | &... | | {EXTERNAL LOCATION} | & | -| pattern_matching.rs:523:25:523:40 | &... | TRef | {EXTERNAL LOCATION} | [] | | pattern_matching.rs:523:25:523:40 | &... | TRef | {EXTERNAL LOCATION} | [;] | | pattern_matching.rs:523:25:523:40 | &... | TRef.TArray | {EXTERNAL LOCATION} | i32 | -| pattern_matching.rs:523:25:523:40 | &... | TRef.TSlice | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:523:26:523:40 | [...] | | {EXTERNAL LOCATION} | [;] | | pattern_matching.rs:523:26:523:40 | [...] | TArray | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:523:27:523:27 | 1 | | {EXTERNAL LOCATION} | i32 | @@ -15021,6 +14539,7 @@ inferType | pattern_matching.rs:560:22:560:70 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:560:22:560:70 | { ... } | | {EXTERNAL LOCATION} | () | | pattern_matching.rs:565:24:601:1 | { ... } | | {EXTERNAL LOCATION} | () | +| pattern_matching.rs:567:11:567:18 | CONSTANT | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:567:27:567:28 | 42 | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:568:9:568:13 | value | | {EXTERNAL LOCATION} | i32 | | pattern_matching.rs:568:17:568:21 | 42i32 | | {EXTERNAL LOCATION} | i32 | @@ -15717,7 +15236,6 @@ inferType | raw_pointer.rs:13:23:19:1 | { ... } | | {EXTERNAL LOCATION} | () | | raw_pointer.rs:14:9:14:9 | a | | {EXTERNAL LOCATION} | i64 | | raw_pointer.rs:14:18:14:19 | 10 | | {EXTERNAL LOCATION} | i32 | -| raw_pointer.rs:14:18:14:19 | 10 | | {EXTERNAL LOCATION} | i64 | | raw_pointer.rs:15:9:15:9 | x | | {EXTERNAL LOCATION} | *const | | raw_pointer.rs:15:9:15:9 | x | TPtrConst | {EXTERNAL LOCATION} | i64 | | raw_pointer.rs:15:13:15:24 | &raw const a | | {EXTERNAL LOCATION} | *const | diff --git a/rust/ql/test/library-tests/type-inference/type-inference.ql b/rust/ql/test/library-tests/type-inference/type-inference.ql index 8dcc34ad8001..92c11c5494d0 100644 --- a/rust/ql/test/library-tests/type-inference/type-inference.ql +++ b/rust/ql/test/library-tests/type-inference/type-inference.ql @@ -12,14 +12,14 @@ private predicate relevantNode(AstNode n) { } query predicate inferCertainType(AstNode n, TypePath path, Type t) { - t = TypeInference::CertainTypeInference::inferCertainType(n, path) and - t != TUnknownType() and + t = TypeInference::inferTypeCertain(n, path) and + not t instanceof PseudoType and relevantNode(n) } query predicate inferType(AstNode n, TypePath path, Type t) { t = TypeInference::inferType(n, path) and - t != TUnknownType() and + not t instanceof PseudoType and relevantNode(n) } @@ -59,26 +59,4 @@ module ResolveTest implements TestSig { } } -module TypeTest implements TestSig { - string getARelevantTag() { result = ["type", "certainType"] } - - predicate hasActualResult(Location location, string element, string tag, string value) { none() } - - predicate hasOptionalResult(Location location, string element, string tag, string value) { - exists(AstNode n, TypePath path, Type t, string at | - t = TypeInference::inferType(n, path) and - ( - tag = "type" - or - t = TypeInference::CertainTypeInference::inferCertainType(n, path) and - tag = "certainType" - ) and - location = n.getLocation() and - (if path.isEmpty() then at = "" else at = "@" + TypePath::printTypePathVerbose(path)) and - value = element + at + ":" + t.toString() and - element = [n.toString(), n.(IdentPat).getName().getText()] - ) - } -} - -import MakeTest> +import MakeTest> From da57e1bb7fffae41f2bc398fb5aae7e050c47707 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Fri, 11 Sep 2026 14:44:42 +0200 Subject: [PATCH 0965/2098] Address review comments --- .../internal/typeinference/TypeInference.qll | 53 ++++--- .../test/library-tests/type-inference/main.rs | 1 + .../type-inference/type-inference.expected | 138 ++++++++--------- .../typeinference/internal/TypeInference.qll | 146 +++++++++--------- shared/util/codeql/util/UnboundList.qll | 6 +- 5 files changed, 175 insertions(+), 169 deletions(-) diff --git a/rust/ql/lib/codeql/rust/internal/typeinference/TypeInference.qll b/rust/ql/lib/codeql/rust/internal/typeinference/TypeInference.qll index 479e926d8561..4f1fd9a15cd1 100644 --- a/rust/ql/lib/codeql/rust/internal/typeinference/TypeInference.qll +++ b/rust/ql/lib/codeql/rust/internal/typeinference/TypeInference.qll @@ -2368,7 +2368,7 @@ private module Input3 implements InputSig3 { final class VariableDeclaration = VariableDeclarationImpl; abstract private class VariableDeclarationImpl extends DeclarationImpl { - abstract predicate isCoercionSite(); + abstract predicate preservesInitializerType(); abstract AstNode getPattern(); @@ -2378,7 +2378,7 @@ private module Input3 implements InputSig3 { } private class LetExprDeclaration extends VariableDeclarationImpl instanceof LetExpr { - override predicate isCoercionSite() { not super.getPat() instanceof IdentPat } + override predicate preservesInitializerType() { super.getPat() instanceof IdentPat } override TypeMention getType() { none() } @@ -2388,14 +2388,13 @@ private module Input3 implements InputSig3 { } private class LetStmtDeclaration extends VariableDeclarationImpl instanceof LetStmt { - override predicate isCoercionSite() { - super.hasTypeRepr() - or + override predicate preservesInitializerType() { + not super.hasTypeRepr() and // Due to "binding modes" the type of the pattern is not necessarily the // same as the type of the initializer. However, when the pattern is an // identifier pattern, its type is guaranteed to be the same as the type of the // initializer. - not super.getPat() instanceof IdentPat + super.getPat() instanceof IdentPat } override TypeMention getType() { result = super.getTypeRepr() } @@ -2406,7 +2405,7 @@ private module Input3 implements InputSig3 { } private class ConstDeclaration extends VariableDeclarationImpl instanceof Const { - override predicate isCoercionSite() { any() } + override predicate preservesInitializerType() { none() } override TypeMention getType() { result = super.getTypeRepr() } @@ -2416,7 +2415,7 @@ private module Input3 implements InputSig3 { } private class StaticDeclaration extends VariableDeclarationImpl instanceof Static { - override predicate isCoercionSite() { any() } + override predicate preservesInitializerType() { none() } override TypeMention getType() { result = super.getTypeRepr() } @@ -2491,7 +2490,7 @@ private module Input3 implements InputSig3 { final class Parameter = ParameterImpl; abstract private class ParameterImpl extends VariableDeclarationImpl { - override predicate isCoercionSite() { any() } // doesn't really matter, since there are no initializers/default values + override predicate preservesInitializerType() { none() } // doesn't really matter, since there are no initializers/default values override AstNode getInitializer() { none() } } @@ -2520,17 +2519,19 @@ private module Input3 implements InputSig3 { override TypeMention getType() { result = super.getTypeRepr() } } - final class Parameterizable = ParameterizableImpl; + final class Callable = CallableImpl; - abstract private class ParameterizableImpl extends DeclarationImpl { + abstract private class CallableImpl extends DeclarationImpl { abstract TypeParameter getTypeParameter(int pos); abstract TypeMention getAdditionalTypeParameterConstraint(TypeParameter tp); abstract Parameter getParameter(int i); + + abstract AstNode getBody(); } - class Callable extends ParameterizableImpl instanceof Rust::Callable { + private class CallableCallable extends CallableImpl instanceof Rust::Callable { override TypeMention getDeclaringType() { exists(ImplOrTraitItemNode implOrTrait | this = implOrTrait.getAnAssocItem() | result = implOrTrait.(Impl).getSelfTy() or @@ -2558,14 +2559,14 @@ private module Input3 implements InputSig3 { override TypeMention getType() { result = getReturnTypeMention(this) } - AstNode getBody() { result = Rust::Callable.super.getBody() } + override AstNode getBody() { result = Rust::Callable.super.getBody() } } Callable getEnclosingCallable(AstNode node) { result = node.getEnclosingCallable() } additional final class Constructor = ConstructorImpl; - abstract private class ConstructorImpl extends ParameterizableImpl { + abstract private class ConstructorImpl extends CallableImpl { abstract TypeItem getTypeItem(); override TypeMention getDeclaringType() { result = this.getTypeItem() } @@ -2577,6 +2578,8 @@ private module Input3 implements InputSig3 { } override TypeMention getType() { result = this.getTypeItem() } + + override AstNode getBody() { none() } } private class StructConstructor extends ConstructorImpl instanceof Struct { @@ -2596,6 +2599,8 @@ private module Input3 implements InputSig3 { } Type getCallableReturnType(Callable c, TypePath path) { + result = c.(Constructor).getType().getTypeAt(path) + or if c.(Function).isAsync() or c.(ClosureExpr).isAsync() then path.isEmpty() and @@ -2608,10 +2613,12 @@ private module Input3 implements InputSig3 { else result = getReturnTypeMention(c).getTypeAt(path) } - class ResolutionContext = string; + class InvocationResolutionContext = string; bindingset[derefChain, borrow] - private ResolutionContext encodeDerefChainBorrow(DerefChain derefChain, BorrowKind borrow) { + private InvocationResolutionContext encodeDerefChainBorrow( + DerefChain derefChain, BorrowKind borrow + ) { result = derefChain + ";" + borrow } @@ -2643,9 +2650,9 @@ private module Input3 implements InputSig3 { abstract Expr getArgument(int i); - abstract Parameterizable getTarget(string derefChainBorrow); + abstract Callable getTarget(string derefChainBorrow); - abstract Parameterizable getATargetForTypeQualifierMatching(); + abstract Callable getATargetForTypeQualifierMatching(); } pragma[nomagic] @@ -2703,7 +2710,7 @@ private module Input3 implements InputSig3 { ) } - override Parameterizable getATargetForTypeQualifierMatching() { + override Callable getATargetForTypeQualifierMatching() { result = CallExprImpl::getResolvedFunction(this) } } @@ -2728,7 +2735,7 @@ private module Input3 implements InputSig3 { derefChainBorrow = noDerefChainBorrow() } - override Parameterizable getATargetForTypeQualifierMatching() { + override Callable getATargetForTypeQualifierMatching() { none() // non-assoc function calls cannot have type qualifiers } } @@ -2736,12 +2743,12 @@ private module Input3 implements InputSig3 { abstract private class Construction extends InvocationImpl { abstract Constructor getTarget(); - override Parameterizable getTarget(string derefChainBorrow) { + override Callable getTarget(string derefChainBorrow) { result = this.getTarget() and derefChainBorrow = noDerefChainBorrow() } - override Parameterizable getATargetForTypeQualifierMatching() { result = this.getTarget() } + override Callable getATargetForTypeQualifierMatching() { result = this.getTarget() } } private class NonAssocCallConstruction extends Construction instanceof NonAssocCallExpr { @@ -3006,7 +3013,7 @@ private module Input3 implements InputSig3 { else prefix2.isEmpty() ) or - // Rust closure types like `Fn<(A, B) -> C>` are syntactic sugar for `Fn`, + // Rust closure types like `Fn(A, B) -> C` are syntactic sugar for `Fn`, // so in calls to a closure, we consider the entire argument list as a single tuple argument. exists(CallExprImpl::DynamicCallExpr dce, TupleType tt, int i | n1 = dce.getSyntacticPositionalArgument(i) and diff --git a/rust/ql/test/library-tests/type-inference/main.rs b/rust/ql/test/library-tests/type-inference/main.rs index 5c47ebe15438..fbcc3b920430 100644 --- a/rust/ql/test/library-tests/type-inference/main.rs +++ b/rust/ql/test/library-tests/type-inference/main.rs @@ -2803,6 +2803,7 @@ mod arg_trait_bounds { fn empty_array() { let arr1: [i32; 0] = []; // $ type=arr1@[;]:i32 let arr2 = [true; 0]; // $ type=arr2@[;]:bool + let arr3 = []; // $ type=arr3@[;]:i32 fn pin_array(arr: [T; 0], x: T) {} diff --git a/rust/ql/test/library-tests/type-inference/type-inference.expected b/rust/ql/test/library-tests/type-inference/type-inference.expected index 1a79f6472b32..2657692b292e 100644 --- a/rust/ql/test/library-tests/type-inference/type-inference.expected +++ b/rust/ql/test/library-tests/type-inference/type-inference.expected @@ -3733,7 +3733,7 @@ inferCertainType | main.rs:2792:13:2792:16 | self | TRef.T | main.rs:2790:10:2790:17 | GT | | main.rs:2796:15:2800:5 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2799:24:2799:25 | &g | | {EXTERNAL LOCATION} | & | -| main.rs:2803:18:2810:1 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2803:18:2811:1 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2804:9:2804:12 | arr1 | | {EXTERNAL LOCATION} | [;] | | main.rs:2804:9:2804:12 | arr1 | TArray | {EXTERNAL LOCATION} | i32 | | main.rs:2804:26:2804:27 | [...] | | {EXTERNAL LOCATION} | [;] | @@ -3742,17 +3742,17 @@ inferCertainType | main.rs:2805:16:2805:24 | [true; 0] | | {EXTERNAL LOCATION} | [;] | | main.rs:2805:16:2805:24 | [true; 0] | TArray | {EXTERNAL LOCATION} | bool | | main.rs:2805:17:2805:20 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:2806:9:2806:12 | arr3 | | {EXTERNAL LOCATION} | [;] | -| main.rs:2806:16:2806:17 | [...] | | {EXTERNAL LOCATION} | [;] | -| main.rs:2808:21:2808:23 | arr | | {EXTERNAL LOCATION} | [;] | -| main.rs:2808:21:2808:23 | arr | TArray | main.rs:2808:18:2808:18 | T | -| main.rs:2808:34:2808:34 | x | | main.rs:2808:18:2808:18 | T | -| main.rs:2808:40:2808:41 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2809:15:2809:18 | arr3 | | {EXTERNAL LOCATION} | [;] | -| main.rs:2812:11:2848:1 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2815:20:2815:38 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | -| main.rs:2815:41:2815:59 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | -| main.rs:2845:16:2845:19 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2807:9:2807:12 | arr3 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2807:16:2807:17 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2809:21:2809:23 | arr | | {EXTERNAL LOCATION} | [;] | +| main.rs:2809:21:2809:23 | arr | TArray | main.rs:2809:18:2809:18 | T | +| main.rs:2809:34:2809:34 | x | | main.rs:2809:18:2809:18 | T | +| main.rs:2809:40:2809:41 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2810:15:2810:18 | arr3 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2813:11:2849:1 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2816:20:2816:38 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | +| main.rs:2816:41:2816:59 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | +| main.rs:2846:16:2846:19 | true | | {EXTERNAL LOCATION} | bool | | overloading.rs:4:19:4:23 | SelfParam | | {EXTERNAL LOCATION} | & | | overloading.rs:4:19:4:23 | SelfParam | TRef | overloading.rs:2:5:11:5 | Self [trait FirstTrait] | | overloading.rs:4:34:6:9 | { ... } | | {EXTERNAL LOCATION} | bool | @@ -12610,7 +12610,7 @@ inferType | main.rs:2799:24:2799:25 | &g | TRef.T | {EXTERNAL LOCATION} | i64 | | main.rs:2799:25:2799:25 | g | | main.rs:2780:5:2780:21 | Gen | | main.rs:2799:25:2799:25 | g | T | {EXTERNAL LOCATION} | i64 | -| main.rs:2803:18:2810:1 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2803:18:2811:1 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2804:9:2804:12 | arr1 | | {EXTERNAL LOCATION} | [;] | | main.rs:2804:9:2804:12 | arr1 | TArray | {EXTERNAL LOCATION} | i32 | | main.rs:2804:21:2804:21 | 0 | | {EXTERNAL LOCATION} | i32 | @@ -12622,62 +12622,62 @@ inferType | main.rs:2805:16:2805:24 | [true; 0] | TArray | {EXTERNAL LOCATION} | bool | | main.rs:2805:17:2805:20 | true | | {EXTERNAL LOCATION} | bool | | main.rs:2805:23:2805:23 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2806:9:2806:12 | arr3 | | {EXTERNAL LOCATION} | [;] | -| main.rs:2806:9:2806:12 | arr3 | TArray | {EXTERNAL LOCATION} | i32 | -| main.rs:2806:16:2806:17 | [...] | | {EXTERNAL LOCATION} | [;] | -| main.rs:2806:16:2806:17 | [...] | TArray | {EXTERNAL LOCATION} | i32 | -| main.rs:2808:21:2808:23 | arr | | {EXTERNAL LOCATION} | [;] | -| main.rs:2808:21:2808:23 | arr | TArray | main.rs:2808:18:2808:18 | T | -| main.rs:2808:30:2808:30 | 0 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2808:34:2808:34 | x | | main.rs:2808:18:2808:18 | T | -| main.rs:2808:40:2808:41 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2809:5:2809:22 | pin_array(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2809:15:2809:18 | arr3 | | {EXTERNAL LOCATION} | [;] | -| main.rs:2809:15:2809:18 | arr3 | TArray | {EXTERNAL LOCATION} | i32 | -| main.rs:2809:21:2809:21 | 1 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2812:11:2848:1 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2813:5:2813:21 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2814:5:2814:20 | ...::f(...) | | main.rs:72:5:72:21 | Foo | -| main.rs:2815:5:2815:60 | ...::g(...) | | main.rs:72:5:72:21 | Foo | -| main.rs:2815:20:2815:38 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | -| main.rs:2815:41:2815:59 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | -| main.rs:2816:5:2816:35 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2817:5:2817:41 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2818:5:2818:45 | ...::test(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2819:5:2819:30 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2820:5:2820:21 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2821:5:2821:27 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2822:5:2822:32 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2823:5:2823:23 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2824:5:2824:36 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2825:5:2825:35 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2826:5:2826:29 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2827:5:2827:23 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2828:5:2828:24 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2829:5:2829:17 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2830:5:2830:18 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2831:5:2831:15 | ...::f(...) | | {EXTERNAL LOCATION} | dyn Future | -| main.rs:2831:5:2831:15 | ...::f(...) | dyn(Output) | {EXTERNAL LOCATION} | () | -| main.rs:2832:5:2832:19 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2833:5:2833:17 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2834:5:2834:14 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2835:5:2835:27 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2836:5:2836:15 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2837:5:2837:43 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2838:5:2838:15 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2839:5:2839:17 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2840:5:2840:28 | ...::test(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2841:5:2841:23 | ...::test(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2842:5:2842:41 | ...::test_all_patterns(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2843:5:2843:49 | ...::box_patterns(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2844:5:2844:20 | ...::test(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2845:5:2845:20 | ...::f(...) | | {EXTERNAL LOCATION} | Box | -| main.rs:2845:5:2845:20 | ...::f(...) | A | {EXTERNAL LOCATION} | Global | -| main.rs:2845:5:2845:20 | ...::f(...) | T | main.rs:2564:5:2566:5 | dyn MyTrait | -| main.rs:2845:5:2845:20 | ...::f(...) | T.dyn(T) | {EXTERNAL LOCATION} | i32 | -| main.rs:2845:16:2845:19 | true | | {EXTERNAL LOCATION} | bool | -| main.rs:2846:5:2846:23 | ...::f(...) | | {EXTERNAL LOCATION} | () | -| main.rs:2847:5:2847:17 | empty_array(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2807:9:2807:12 | arr3 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2807:9:2807:12 | arr3 | TArray | {EXTERNAL LOCATION} | i32 | +| main.rs:2807:16:2807:17 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2807:16:2807:17 | [...] | TArray | {EXTERNAL LOCATION} | i32 | +| main.rs:2809:21:2809:23 | arr | | {EXTERNAL LOCATION} | [;] | +| main.rs:2809:21:2809:23 | arr | TArray | main.rs:2809:18:2809:18 | T | +| main.rs:2809:30:2809:30 | 0 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2809:34:2809:34 | x | | main.rs:2809:18:2809:18 | T | +| main.rs:2809:40:2809:41 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2810:5:2810:22 | pin_array(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2810:15:2810:18 | arr3 | | {EXTERNAL LOCATION} | [;] | +| main.rs:2810:15:2810:18 | arr3 | TArray | {EXTERNAL LOCATION} | i32 | +| main.rs:2810:21:2810:21 | 1 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2813:11:2849:1 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2814:5:2814:21 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2815:5:2815:20 | ...::f(...) | | main.rs:72:5:72:21 | Foo | +| main.rs:2816:5:2816:60 | ...::g(...) | | main.rs:72:5:72:21 | Foo | +| main.rs:2816:20:2816:38 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | +| main.rs:2816:41:2816:59 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | +| main.rs:2817:5:2817:35 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2818:5:2818:41 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2819:5:2819:45 | ...::test(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2820:5:2820:30 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2821:5:2821:21 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2822:5:2822:27 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2823:5:2823:32 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2824:5:2824:23 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2825:5:2825:36 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2826:5:2826:35 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2827:5:2827:29 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2828:5:2828:23 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2829:5:2829:24 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2830:5:2830:17 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2831:5:2831:18 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2832:5:2832:15 | ...::f(...) | | {EXTERNAL LOCATION} | dyn Future | +| main.rs:2832:5:2832:15 | ...::f(...) | dyn(Output) | {EXTERNAL LOCATION} | () | +| main.rs:2833:5:2833:19 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2834:5:2834:17 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2835:5:2835:14 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2836:5:2836:27 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2837:5:2837:15 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2838:5:2838:43 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2839:5:2839:15 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2840:5:2840:17 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2841:5:2841:28 | ...::test(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2842:5:2842:23 | ...::test(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2843:5:2843:41 | ...::test_all_patterns(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2844:5:2844:49 | ...::box_patterns(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2845:5:2845:20 | ...::test(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2846:5:2846:20 | ...::f(...) | | {EXTERNAL LOCATION} | Box | +| main.rs:2846:5:2846:20 | ...::f(...) | A | {EXTERNAL LOCATION} | Global | +| main.rs:2846:5:2846:20 | ...::f(...) | T | main.rs:2564:5:2566:5 | dyn MyTrait | +| main.rs:2846:5:2846:20 | ...::f(...) | T.dyn(T) | {EXTERNAL LOCATION} | i32 | +| main.rs:2846:16:2846:19 | true | | {EXTERNAL LOCATION} | bool | +| main.rs:2847:5:2847:23 | ...::f(...) | | {EXTERNAL LOCATION} | () | +| main.rs:2848:5:2848:17 | empty_array(...) | | {EXTERNAL LOCATION} | () | | overloading.rs:4:19:4:23 | SelfParam | | {EXTERNAL LOCATION} | & | | overloading.rs:4:19:4:23 | SelfParam | TRef | overloading.rs:2:5:11:5 | Self [trait FirstTrait] | | overloading.rs:4:34:6:9 | { ... } | | {EXTERNAL LOCATION} | bool | diff --git a/shared/typeinference/codeql/typeinference/internal/TypeInference.qll b/shared/typeinference/codeql/typeinference/internal/TypeInference.qll index 043774f63434..133b8a72e5aa 100644 --- a/shared/typeinference/codeql/typeinference/internal/TypeInference.qll +++ b/shared/typeinference/codeql/typeinference/internal/TypeInference.qll @@ -59,7 +59,7 @@ * * ```rust * let x = if cond { Default::default() } else { Default::default() }; - * let y : i64 = x; + * let y: i64 = x; * ``` * * where the `UnknownType` will propagate upwards using two bottom-up steps, and the @@ -1174,8 +1174,8 @@ module Make1 Input1> { /** Gets the location of this declaration. */ Location getLocation(); - /** Gets the type parameter at position `pos` of this declaration, if any. */ - TypeParameter getTypeParameter(int pos); + /** Gets the `i`th type parameter of this declaration, if any. */ + TypeParameter getTypeParameter(int i); /** * Gets the declared type of this declaration at `path` for position `dpos`. @@ -1225,13 +1225,12 @@ module Make1 Input1> { Location getLocation(); /** - * Gets the type at `path` for the type argument at position `pos` of - * this access, if any. + * Gets the type at `path` for the `i`th type argument of this access, if any. * * For example, in a method call like `M()`, `int` is an explicit * type argument at position `0`. */ - Type getTypeArgument(int pos, TypePath path); + Type getTypeArgument(int i, TypePath path); /** * Gets the inferred type at `path` for the position `apos` and environment `e` @@ -1734,7 +1733,7 @@ module Make1 Input1> { * * fn bar>(x: T1, y: T2) {} * - * let x : i32 = ...; + * let x: i32 = ...; * let y = MyThing(Default::default()); * bar(x, y); * ``` @@ -1786,8 +1785,8 @@ module Make1 Input1> { /** Gets the location of this declaration. */ Location getLocation(); - /** Gets the type parameter at position `pos` of this declaration, if any. */ - TypeParameter getTypeParameter(int pos); + /** Gets the `i`th type parameter of this declaration, if any. */ + TypeParameter getTypeParameter(int i); /** * Gets the declared type of this declaration at `path` for position `dpos`. @@ -1829,13 +1828,12 @@ module Make1 Input1> { Location getLocation(); /** - * Gets the type at `path` for the type argument at position `pos` of - * this access, if any. + * Gets the type at `path` for the `i`th type argument of this access, if any. * * For example, in a method call like `M()`, `int` is an explicit * type argument at position `0`. */ - Type getTypeArgument(int pos, TypePath path); + Type getTypeArgument(int i, TypePath path); /** * Gets the inferred type at `path` for the position `apos` of this access. @@ -2039,7 +2037,8 @@ module Make1 Input1> { /** * A variable, or an entity that behaves like a variable with respect to - * type inference, for example a local variable, `const`, or `static` in Rust. + * type inference, for example a local variable, `const` item, or `static` + * item in Rust. */ class Variable { /** Gets the AST node that defines this variable. */ @@ -2058,14 +2057,24 @@ module Make1 Input1> { /** A declaration. */ class Declaration extends AstNode { /** - * Gets the type at `path` of the entity that contains this declaration, if any. + * Gets the type mention of the entity that contains this declaration, if any. * * For example, if this declaration is a method, then the declaring type is the * type of the class that contains the method. * - * This type will be used to match against type qualifiers at invocations, and - * it may coincide with the types of (possibly implicit) `this`/`self` parameters, - * but in for example Rust those types can differ. + * This type will be used to match against type qualifiers at invocations: + * + * ```rust + * struct MyStruct { ... } + * + * impl MyStruct { + * // ^^^^^^^^^^^ declaring type of `new` + * fn new() -> Self { ... } + * } + * + * let c = MyStruct::::new(); + * // ^^^^^^^^^^^^^ type qualifier; `C` should be matched against `B` + * ``` * * Local variable declarations will not have a declaring type (but they may have * a _declared_ type). @@ -2087,10 +2096,12 @@ module Make1 Input1> { */ class VariableDeclaration extends Declaration { /** - * Holds if this declaration is a coercion site, meaning that the type of the - * initializer may have to be coerced to match the pattern. + * Holds if the type of the initializer and the pattern are certainly the same. + * + * This need not be the case in for example Rust, where implicit coercions may + * happen. */ - predicate isCoercionSite(); + predicate preservesInitializerType(); /** * Gets the pattern of this declaration. @@ -2134,7 +2145,7 @@ module Make1 Input1> { * * ```rust * let tuple = (Default::default(), "hello"); - * let x : i32 = tuple.0; + * let x: i32 = tuple.0; * ``` * * we will be able to infer that the type of `Default::default()` is `i32`. @@ -2156,10 +2167,10 @@ module Make1 Input1> { /** A parameter. */ class Parameter extends VariableDeclaration; - /** A parameterizable element, such as a function or a variant constructor. */ - class Parameterizable extends Declaration { + /** A callable. This may include for example variant constructors. */ + class Callable extends Declaration { /** - * Gets the type parameter at position `pos` of this element, if any. + * Gets the `i`th type parameter of this element, if any. * * This should only include type parameters declared directly on the element * itself; any type parameters that are in scope from the declaring element @@ -2173,7 +2184,7 @@ module Make1 Input1> { * } * ``` */ - TypeParameter getTypeParameter(int pos); + TypeParameter getTypeParameter(int i); /** * Gets an additional type parameter constraint for the given type parameter, @@ -2195,10 +2206,7 @@ module Make1 Input1> { * This should also include (possibly implicit) `this`/`self` parameters. */ Parameter getParameter(int i); - } - /** A callable. */ - class Callable extends Parameterizable { /** Gets the body of this callable, if any. */ AstNode getBody(); } @@ -2223,7 +2231,7 @@ module Make1 Input1> { * implicit dereferencing and borrowing. When not needed, simply use `Unit`. */ bindingset[this] - class ResolutionContext { + class InvocationResolutionContext { /** Gets a textual representation of this context. */ bindingset[this] string toString(); @@ -2232,7 +2240,8 @@ module Make1 Input1> { /** An invocation expression, for example a call or a variant construction. */ class Invocation extends Expr { /** - * Gets the explicit type qualifier at `path` for this invocation, if any. + * Gets the type at `path` of the explicit type qualifier for this invocation, + * if any. * * When present, this type qualifier will be matched against the declaring * type of the target. @@ -2247,7 +2256,7 @@ module Make1 Input1> { Type getTypeQualifier(TypePath path); /** - * Gets the explicit type argument at position `pos` and `path` for this + * Gets the explicit type argument at position `i` and `path` for this * invocation, if any. * * This should only include type arguments that are supplied for type @@ -2263,7 +2272,7 @@ module Make1 Input1> { * // ^^^ type argument 0 * ``` */ - Type getTypeArgument(int pos, TypePath path); + Type getTypeArgument(int i, TypePath path); /** * Gets the `i`th argument of this invocation. @@ -2279,7 +2288,7 @@ module Make1 Input1> { * in order to resolve a method call one needs to know the type of the * receiver. */ - Parameterizable getTarget(ResolutionContext ctx); + Callable getTarget(InvocationResolutionContext ctx); /** * Gets a target (candidate) of this invocation which will be used to @@ -2289,7 +2298,7 @@ module Make1 Input1> { * Unlike `getTarget`, this predicate cannot depend on the `inferType` * predicate. */ - Parameterizable getATargetForTypeQualifierMatching(); + Callable getATargetForTypeQualifierMatching(); } /** @@ -2303,7 +2312,7 @@ module Make1 Input1> { */ bindingset[ctx] default Type inferInvocationArgumentType( - Invocation invocation, ResolutionContext ctx, int i, TypePath path + Invocation invocation, InvocationResolutionContext ctx, int i, TypePath path ) { result = inferTypeForDefaults(invocation.getArgument(i), path) and exists(ctx) @@ -2346,7 +2355,7 @@ module Make1 Input1> { * ```rust * fn id(x: T) -> T { x } * let x = Default::default(); - * let y : i32 = id(x); + * let y: i32 = id(x); * ``` * * knowing that the return type of `id(x)` is `i32` allows us to infer that @@ -2433,6 +2442,9 @@ module Make1 Input1> { * `t` at `prefix2.suffix`, for any `suffix`. * * Use this predicate to implement any language-specific bottom-up inference logic. + * + * When contextual type information is needed at `n1`, this predicate may additionally + * be applied _reversely_ as well (see an example in the module documentation). */ predicate stepLanguageSpecific(AstNode n1, TypePath prefix1, AstNode n2, TypePath prefix2); @@ -2510,7 +2522,7 @@ module Make1 Input1> { exists(Variable v | n1 = v.getDefiningNode() and n2 = v.getAnAccess()) or exists(VariableDeclaration decl | - not decl.isCoercionSite() and + decl.preservesInitializerType() and n1 = decl.getInitializer() and n2 = decl.getPattern() ) @@ -2595,7 +2607,7 @@ module Make1 Input1> { infersCertainTypeAt(n, path, result.getATypeParameter()) ) and // type annotation may for example include unknown types, such as - // `x : Vec<_>` in Rust + // `x: Vec<_>` in Rust not result instanceof PseudoType } @@ -2792,16 +2804,7 @@ module Make1 Input1> { ) } - private Type getParameterizableReturnType(Parameterizable p, TypePath path) { - ( - result = getCallableReturnType(p, path) - or - not p instanceof Callable and - result = p.getType().getTypeAt(path) - ) - } - - final private class ParameterizableFinal = Parameterizable; + final private class CallableFinal = Callable; final private class InvocationFinal = Invocation; @@ -2836,7 +2839,7 @@ module Make1 Input1> { apos = dpos } - class Declaration extends ParameterizableFinal { + class Declaration extends CallableFinal { Type getDeclaredType(DeclarationPosition dpos, TypePath path) { result = this.getDeclaringType().getTypeAt(path) and exists(dpos) @@ -2885,22 +2888,21 @@ module Make1 Input1> { /** Gets the position used to represent the return type of an invocation. */ additional int getReturnPosition() { - result = min(int i | i = 0 or exists(any(Parameterizable p).getParameter(i)) | i) - 1 + result = min(int i | i = 0 or exists(any(Callable c).getParameter(i)) | i) - 1 } private int getFirstTypeParameterPosition() { - result = min(int i | i = 0 or exists(any(Parameterizable p).getTypeParameter(i)) | i) + result = min(int i | i = 0 or exists(any(Callable c).getTypeParameter(i)) | i) } private predicate typeQualifierMatch( - Invocation invocation, Parameterizable target, TypePath path, Type t, TypeParameter tp, - int pos + Invocation invocation, Callable target, TypePath path, Type t, TypeParameter tp, int pos ) { InvocationTypeQualifierMatching::typeMatch(invocation, _, target, path, t, tp) and pos = getFirstTypeParameterPosition() - getRank(tp) - 2 } - class Declaration extends ParameterizableFinal { + class Declaration extends CallableFinal { TypeParameter getTypeParameter(int pos) { // include type parameters that are matched via a type qualifier typeQualifierMatch(_, this, _, _, result, pos) @@ -2917,7 +2919,7 @@ module Make1 Input1> { result = this.getParameter(dpos).getType().getTypeAt(path) or dpos = getReturnPosition() and - result = getParameterizableReturnType(this, path) + result = getCallableReturnType(this, path) } } @@ -2926,7 +2928,7 @@ module Make1 Input1> { result = InvocationTypeQualifierMatchingInput::getATypeParameterConstraint(tp, decl) } - class AccessEnvironment = ResolutionContext; + class AccessEnvironment = InvocationResolutionContext; class Access extends InvocationFinal { Type getTypeArgument(int pos, TypePath path) { @@ -2966,7 +2968,9 @@ module Make1 Input1> { * `InputSig3::inferInvocationType`. */ pragma[nomagic] - Type inferInvocationTypeDefault(Invocation invocation, ResolutionContext ctx, TypePath path) { + Type inferInvocationTypeDefault( + Invocation invocation, InvocationResolutionContext ctx, TypePath path + ) { result = InvocationMatching::inferAccessType(invocation, ctx, InvocationMatchingInput::getReturnPosition(), path) @@ -2978,7 +2982,7 @@ module Make1 Input1> { */ pragma[nomagic] Type inferInvocationArgumentTypeContextualDefault( - Invocation invocation, ResolutionContext ctx, int pos, Expr arg, TypePath path + Invocation invocation, InvocationResolutionContext ctx, int pos, Expr arg, TypePath path ) { arg = invocation.getArgument(pos) and result = InvocationMatching::inferAccessType(invocation, ctx, pos, path) and @@ -3003,17 +3007,17 @@ module Make1 Input1> { } /** - * Holds if parameterizable `p` mentions type parameter `tp` at some parameter, + * Holds if callable `c` mentions type parameter `tp` at some parameter, * possibly via a constraint on another mentioned type parameter. */ pragma[nomagic] - private predicate mentionsTypeParameterAtParameter(Parameterizable p, TypeParameter tp) { - tp = getAConstrained*(p.getParameter(_).getType().getTypeAt(_)) + private predicate mentionsTypeParameterAtParameter(Callable c, TypeParameter tp) { + tp = getAConstrained*(c.getParameter(_).getType().getTypeAt(_)) } /** - * Holds if the return type of the parameterizable `p` at `path` is type parameter - * `tp`, and `tp` does not appear in the type of any parameter of `p`. + * Holds if the return type of the callable `c` at `path` is type parameter + * `tp`, and `tp` does not appear in the type of any parameter of `c`. * * In this case, the context in which `p` is called may be needed to infer * the instantiation of `tp`. @@ -3021,18 +3025,14 @@ module Make1 Input1> { * This covers functions like `Default::default` and `Vec::new` in Rust. */ pragma[nomagic] - private predicate parameterizableReturnContextTypedAt( - Parameterizable p, TypePath path, TypeParameter tp - ) { - tp = getParameterizableReturnType(p, path) and - not mentionsTypeParameterAtParameter(p, tp) + private predicate callableReturnContextTypedAt(Callable c, TypePath path, TypeParameter tp) { + tp = getCallableReturnType(c, path) and + not mentionsTypeParameterAtParameter(c, tp) } bindingset[invocation, target] pragma[inline_late] - private predicate hasTypeArgument( - Invocation invocation, Parameterizable target, TypeParameter tp - ) { + private predicate hasTypeArgument(Invocation invocation, Callable target, TypeParameter tp) { exists(Type t | InvocationTypeQualifierMatching::typeMatch(invocation, _, _, _, t, tp) and not t instanceof PseudoType @@ -3047,12 +3047,12 @@ module Make1 Input1> { */ pragma[nomagic] predicate needsContextualTyping(Invocation invocation, TypePath path) { - exists(Parameterizable target, TypeParameter tp | + exists(Callable target, TypeParameter tp | target = invocation.getATargetForTypeQualifierMatching() or target = invocation.getTarget(_) | - parameterizableReturnContextTypedAt(target, path, tp) and + callableReturnContextTypedAt(target, path, tp) and // check that no explicit type arguments have been supplied that bind `tp` not exists(TypeParameter supplied | tp = getAConstrained*(supplied) and diff --git a/shared/util/codeql/util/UnboundList.qll b/shared/util/codeql/util/UnboundList.qll index 409116bc60b9..622895a6bd01 100644 --- a/shared/util/codeql/util/UnboundList.qll +++ b/shared/util/codeql/util/UnboundList.qll @@ -186,15 +186,13 @@ module Make Input> { UnboundList singleton(Element e) { result = encode(e) + "." } /** - * Gets the list obtained by appending the singleton list `e` - * onto `suffix`. + * Gets the list obtained by appending the element `e` onto `suffix`. */ bindingset[suffix] UnboundList cons(Element e, UnboundList suffix) { result = singleton(e).append(suffix) } /** - * Gets the list obtained by appending the singleton list `e` - * after `prefix`. + * Gets the list obtained by appending the element `e` after `prefix`. */ bindingset[prefix] UnboundList snoc(UnboundList prefix, Element e) { result = prefix.append(singleton(e)) } From 9e9b98815a9634d99c3fbca991cfa292d416ede5 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 14 Sep 2026 14:26:59 +0200 Subject: [PATCH 0966/2098] Address more review comments --- .../library-tests/type-inference/closure.rs | 8 + .../type-inference/type-inference.expected | 1847 +++++++++-------- .../typeinference/internal/TypeInference.qll | 54 +- 3 files changed, 1025 insertions(+), 884 deletions(-) diff --git a/rust/ql/test/library-tests/type-inference/closure.rs b/rust/ql/test/library-tests/type-inference/closure.rs index 338e72dd3668..0c28c057d28a 100644 --- a/rust/ql/test/library-tests/type-inference/closure.rs +++ b/rust/ql/test/library-tests/type-inference/closure.rs @@ -28,6 +28,14 @@ mod simple_closures { let id2 = |b| b; let arg = Default::default(); // $ target=default type=arg:bool let _b2: bool = id2(arg); // $ certainType=_b2:bool + + // The parameter type of `f1` is inferred from the argument. + let f1 = |x| (x, false); // $ type=x@Option:i32 + let _r = f1(Some(0)); // $ type=_r@(T_2).Option:i32 + + // The return type of `f2` is inferred from the type of the call expression. + let f2 = |x| (x, false); // $ type=x@Option:i32 + let _r: Option = f2(Default::default()).0; // $ fieldof=Tuple2 target=default } } diff --git a/rust/ql/test/library-tests/type-inference/type-inference.expected b/rust/ql/test/library-tests/type-inference/type-inference.expected index 2657692b292e..f855bc8089c2 100644 --- a/rust/ql/test/library-tests/type-inference/type-inference.expected +++ b/rust/ql/test/library-tests/type-inference/type-inference.expected @@ -508,7 +508,7 @@ inferCertainType | blanket_impl.rs:299:44:299:44 | c | | blanket_impl.rs:286:5:286:29 | MySqlConnection | | blanket_impl.rs:299:47:299:67 | "SELECT * FROM users" | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:299:47:299:67 | "SELECT * FROM users" | TRef | {EXTERNAL LOCATION} | str | -| closure.rs:4:19:31:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:4:19:39:5 | { ... } | | {EXTERNAL LOCATION} | () | | closure.rs:6:13:6:22 | my_closure | | {EXTERNAL LOCATION} | dyn Fn | | closure.rs:6:13:6:22 | my_closure | dyn(Args) | {EXTERNAL LOCATION} | (T_2) | | closure.rs:6:26:6:38 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | @@ -563,335 +563,355 @@ inferCertainType | closure.rs:30:25:30:27 | id2 | | {EXTERNAL LOCATION} | dyn Fn | | closure.rs:30:25:30:27 | id2 | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | | closure.rs:30:28:30:32 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:35:44:35:44 | f | | closure.rs:35:20:35:41 | F | -| closure.rs:35:50:37:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:36:23:36:23 | f | | closure.rs:35:20:35:41 | F | -| closure.rs:36:24:36:29 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:36:24:36:29 | ArgList | T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:36:25:36:28 | true | | {EXTERNAL LOCATION} | bool | -| closure.rs:39:45:39:45 | f | | closure.rs:39:28:39:42 | F | -| closure.rs:39:51:41:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:40:23:40:23 | f | | closure.rs:39:28:39:42 | F | -| closure.rs:40:24:40:29 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:40:24:40:29 | ArgList | T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:40:25:40:28 | true | | {EXTERNAL LOCATION} | bool | -| closure.rs:43:46:43:46 | f | | closure.rs:43:22:43:43 | F | -| closure.rs:43:52:46:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:45:9:45:9 | f | | closure.rs:43:22:43:43 | F | -| closure.rs:45:10:45:14 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:48:39:48:39 | f | | closure.rs:48:20:48:36 | F | -| closure.rs:48:45:48:45 | a | | closure.rs:48:14:48:14 | A | -| closure.rs:49:9:49:9 | f | | closure.rs:48:20:48:36 | F | -| closure.rs:49:10:49:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:49:10:49:12 | ArgList | T0 | closure.rs:48:14:48:14 | A | -| closure.rs:49:11:49:11 | a | | closure.rs:48:14:48:14 | A | -| closure.rs:52:18:52:18 | f | | closure.rs:52:21:52:43 | impl ... | -| closure.rs:53:9:53:9 | f | | closure.rs:52:21:52:43 | impl ... | -| closure.rs:53:10:53:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:56:15:68:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:57:13:57:13 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:57:13:57:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:57:13:57:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:57:13:57:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:57:17:63:9 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:57:17:63:9 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:57:17:63:9 | \|...\| ... | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:57:17:63:9 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:57:18:57:18 | x | | {EXTERNAL LOCATION} | bool | -| closure.rs:58:16:58:16 | x | | {EXTERNAL LOCATION} | bool | -| closure.rs:64:24:64:24 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:64:24:64:24 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:64:24:64:24 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:64:24:64:24 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:64:27:64:30 | true | | {EXTERNAL LOCATION} | bool | -| closure.rs:66:13:66:13 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:66:13:66:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:66:17:66:25 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:66:17:66:25 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:67:29:67:29 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:67:29:67:29 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:72:47:72:47 | f | | closure.rs:72:20:72:40 | F | -| closure.rs:72:53:74:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:73:23:73:23 | f | | closure.rs:72:20:72:40 | F | -| closure.rs:73:24:73:29 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:73:24:73:29 | ArgList | T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:73:25:73:28 | true | | {EXTERNAL LOCATION} | bool | -| closure.rs:76:48:76:48 | f | | closure.rs:76:28:76:41 | F | -| closure.rs:76:54:78:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:77:23:77:23 | f | | closure.rs:76:28:76:41 | F | -| closure.rs:77:24:77:29 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:77:24:77:29 | ArgList | T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:77:25:77:28 | true | | {EXTERNAL LOCATION} | bool | -| closure.rs:80:49:80:49 | f | | closure.rs:80:22:80:42 | F | -| closure.rs:80:55:83:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:82:9:82:9 | f | | closure.rs:80:22:80:42 | F | -| closure.rs:82:10:82:14 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:85:42:85:42 | f | | closure.rs:85:20:85:35 | F | -| closure.rs:85:48:85:48 | a | | closure.rs:85:14:85:14 | A | -| closure.rs:86:9:86:9 | f | | closure.rs:85:20:85:35 | F | -| closure.rs:86:10:86:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:86:10:86:12 | ArgList | T0 | closure.rs:85:14:85:14 | A | -| closure.rs:86:11:86:11 | a | | closure.rs:85:14:85:14 | A | -| closure.rs:89:22:89:22 | f | | closure.rs:89:25:89:46 | impl ... | -| closure.rs:90:9:90:9 | f | | closure.rs:89:25:89:46 | impl ... | -| closure.rs:90:10:90:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:93:15:105:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:94:13:94:13 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:94:13:94:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:94:13:94:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:94:13:94:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:94:17:100:9 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:94:17:100:9 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:94:17:100:9 | \|...\| ... | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:94:17:100:9 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:94:18:94:18 | x | | {EXTERNAL LOCATION} | bool | -| closure.rs:95:16:95:16 | x | | {EXTERNAL LOCATION} | bool | -| closure.rs:101:24:101:24 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:101:24:101:24 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:101:24:101:24 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:101:24:101:24 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:101:27:101:30 | true | | {EXTERNAL LOCATION} | bool | -| closure.rs:103:13:103:13 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:103:13:103:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:103:17:103:25 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:103:17:103:25 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:104:29:104:29 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:104:29:104:29 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:109:40:109:40 | f | | closure.rs:109:20:109:37 | F | -| closure.rs:109:46:111:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:110:23:110:23 | f | | closure.rs:109:20:109:37 | F | -| closure.rs:110:24:110:29 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:110:24:110:29 | ArgList | T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:110:25:110:28 | true | | {EXTERNAL LOCATION} | bool | -| closure.rs:113:41:113:41 | f | | closure.rs:113:28:113:38 | F | -| closure.rs:113:47:115:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:114:23:114:23 | f | | closure.rs:113:28:113:38 | F | -| closure.rs:114:24:114:29 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:114:24:114:29 | ArgList | T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:114:25:114:28 | true | | {EXTERNAL LOCATION} | bool | -| closure.rs:117:42:117:42 | f | | closure.rs:117:22:117:39 | F | -| closure.rs:117:48:120:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:119:9:119:9 | f | | closure.rs:117:22:117:39 | F | -| closure.rs:119:10:119:14 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:122:35:122:35 | f | | closure.rs:122:20:122:32 | F | -| closure.rs:122:41:122:41 | a | | closure.rs:122:14:122:14 | A | -| closure.rs:123:9:123:9 | f | | closure.rs:122:20:122:32 | F | -| closure.rs:123:10:123:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:123:10:123:12 | ArgList | T0 | closure.rs:122:14:122:14 | A | -| closure.rs:123:11:123:11 | a | | closure.rs:122:14:122:14 | A | -| closure.rs:126:18:126:18 | f | | closure.rs:126:21:126:39 | impl ... | -| closure.rs:127:9:127:9 | f | | closure.rs:126:21:126:39 | impl ... | -| closure.rs:127:10:127:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:130:15:142:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:131:13:131:13 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:131:13:131:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:131:13:131:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:131:13:131:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:131:17:137:9 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:131:17:137:9 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:131:17:137:9 | \|...\| ... | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:131:17:137:9 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:131:18:131:18 | x | | {EXTERNAL LOCATION} | bool | -| closure.rs:132:16:132:16 | x | | {EXTERNAL LOCATION} | bool | -| closure.rs:138:24:138:24 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:138:24:138:24 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:138:24:138:24 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:138:24:138:24 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:138:27:138:30 | true | | {EXTERNAL LOCATION} | bool | -| closure.rs:140:13:140:13 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:140:13:140:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:140:17:140:25 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:140:17:140:25 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:141:29:141:29 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:141:29:141:29 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:146:54:146:54 | f | | {EXTERNAL LOCATION} | Box | -| closure.rs:146:54:146:54 | f | A | {EXTERNAL LOCATION} | Global | -| closure.rs:146:54:146:54 | f | T | closure.rs:146:26:146:51 | F | -| closure.rs:146:65:146:67 | arg | | closure.rs:146:20:146:20 | A | -| closure.rs:147:9:147:9 | f | | {EXTERNAL LOCATION} | Box | -| closure.rs:147:9:147:9 | f | A | {EXTERNAL LOCATION} | Global | -| closure.rs:147:9:147:9 | f | T | closure.rs:146:26:146:51 | F | -| closure.rs:147:10:147:14 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:147:10:147:14 | ArgList | T0 | closure.rs:146:20:146:20 | A | -| closure.rs:147:11:147:13 | arg | | closure.rs:146:20:146:20 | A | -| closure.rs:150:30:150:30 | f | | {EXTERNAL LOCATION} | Box | -| closure.rs:150:30:150:30 | f | A | {EXTERNAL LOCATION} | Global | -| closure.rs:150:30:150:30 | f | T | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:150:30:150:30 | f | T.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:150:30:150:30 | f | T.dyn(Args).T0 | closure.rs:150:24:150:24 | A | -| closure.rs:150:30:150:30 | f | T.dyn(Output) | closure.rs:150:27:150:27 | B | -| closure.rs:150:58:150:60 | arg | | closure.rs:150:24:150:24 | A | -| closure.rs:150:66:153:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:151:31:151:31 | f | | {EXTERNAL LOCATION} | Box | -| closure.rs:151:31:151:31 | f | A | {EXTERNAL LOCATION} | Global | -| closure.rs:151:31:151:31 | f | T | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:151:31:151:31 | f | T.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:151:31:151:31 | f | T.dyn(Args).T0 | closure.rs:150:24:150:24 | A | -| closure.rs:151:31:151:31 | f | T.dyn(Output) | closure.rs:150:27:150:27 | B | -| closure.rs:151:34:151:36 | arg | | closure.rs:150:24:150:24 | A | -| closure.rs:152:40:152:52 | \|...\| true | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:152:40:152:52 | \|...\| true | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:152:40:152:52 | \|...\| true | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:152:41:152:41 | _ | | {EXTERNAL LOCATION} | i64 | -| closure.rs:152:49:152:52 | true | | {EXTERNAL LOCATION} | bool | -| closure.rs:157:34:157:34 | f | | closure.rs:157:15:157:31 | F | -| closure.rs:157:40:157:40 | a | | {EXTERNAL LOCATION} | i64 | -| closure.rs:158:9:158:9 | f | | closure.rs:157:15:157:31 | F | -| closure.rs:158:10:158:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:158:10:158:12 | ArgList | T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:158:11:158:11 | a | | {EXTERNAL LOCATION} | i64 | -| closure.rs:161:15:161:15 | f | | closure.rs:161:18:161:36 | impl ... | -| closure.rs:161:39:161:39 | a | | {EXTERNAL LOCATION} | i64 | -| closure.rs:162:9:162:9 | f | | closure.rs:161:18:161:36 | impl ... | -| closure.rs:162:10:162:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:162:10:162:12 | ArgList | T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:162:11:162:11 | a | | {EXTERNAL LOCATION} | i64 | -| closure.rs:165:15:165:15 | f | | {EXTERNAL LOCATION} | & | -| closure.rs:165:15:165:15 | f | TRef | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:165:15:165:15 | f | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:165:15:165:15 | f | TRef.dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:165:15:165:15 | f | TRef.dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:165:39:165:39 | a | | {EXTERNAL LOCATION} | i64 | -| closure.rs:166:9:166:9 | f | | {EXTERNAL LOCATION} | & | -| closure.rs:166:9:166:9 | f | TRef | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:166:9:166:9 | f | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:166:9:166:9 | f | TRef.dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:166:9:166:9 | f | TRef.dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:33:13:33:14 | f1 | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:33:13:33:14 | f1 | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:33:18:33:31 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:33:18:33:31 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:33:22:33:31 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | +| closure.rs:33:26:33:30 | false | | {EXTERNAL LOCATION} | bool | +| closure.rs:34:18:34:19 | f1 | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:34:18:34:19 | f1 | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:34:20:34:28 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:37:13:37:14 | f2 | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:37:13:37:14 | f2 | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:37:18:37:31 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:37:18:37:31 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:37:22:37:31 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | +| closure.rs:37:26:37:30 | false | | {EXTERNAL LOCATION} | bool | +| closure.rs:38:13:38:14 | _r | | {EXTERNAL LOCATION} | Option | +| closure.rs:38:13:38:14 | _r | T | {EXTERNAL LOCATION} | i32 | +| closure.rs:38:31:38:32 | f2 | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:38:31:38:32 | f2 | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:38:33:38:52 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:43:44:43:44 | f | | closure.rs:43:20:43:41 | F | +| closure.rs:43:50:45:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:44:23:44:23 | f | | closure.rs:43:20:43:41 | F | +| closure.rs:44:24:44:29 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:44:24:44:29 | ArgList | T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:44:25:44:28 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:47:45:47:45 | f | | closure.rs:47:28:47:42 | F | +| closure.rs:47:51:49:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:48:23:48:23 | f | | closure.rs:47:28:47:42 | F | +| closure.rs:48:24:48:29 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:48:24:48:29 | ArgList | T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:48:25:48:28 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:51:46:51:46 | f | | closure.rs:51:22:51:43 | F | +| closure.rs:51:52:54:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:53:9:53:9 | f | | closure.rs:51:22:51:43 | F | +| closure.rs:53:10:53:14 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:56:39:56:39 | f | | closure.rs:56:20:56:36 | F | +| closure.rs:56:45:56:45 | a | | closure.rs:56:14:56:14 | A | +| closure.rs:57:9:57:9 | f | | closure.rs:56:20:56:36 | F | +| closure.rs:57:10:57:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:57:10:57:12 | ArgList | T0 | closure.rs:56:14:56:14 | A | +| closure.rs:57:11:57:11 | a | | closure.rs:56:14:56:14 | A | +| closure.rs:60:18:60:18 | f | | closure.rs:60:21:60:43 | impl ... | +| closure.rs:61:9:61:9 | f | | closure.rs:60:21:60:43 | impl ... | +| closure.rs:61:10:61:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:64:15:76:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:65:13:65:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:65:13:65:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:65:13:65:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:65:13:65:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:65:17:71:9 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:65:17:71:9 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:65:17:71:9 | \|...\| ... | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:65:17:71:9 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:65:18:65:18 | x | | {EXTERNAL LOCATION} | bool | +| closure.rs:66:16:66:16 | x | | {EXTERNAL LOCATION} | bool | +| closure.rs:72:24:72:24 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:72:24:72:24 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:72:24:72:24 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:72:24:72:24 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:72:27:72:30 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:74:13:74:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:74:13:74:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:74:17:74:25 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:74:17:74:25 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:75:29:75:29 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:75:29:75:29 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:80:47:80:47 | f | | closure.rs:80:20:80:40 | F | +| closure.rs:80:53:82:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:81:23:81:23 | f | | closure.rs:80:20:80:40 | F | +| closure.rs:81:24:81:29 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:81:24:81:29 | ArgList | T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:81:25:81:28 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:84:48:84:48 | f | | closure.rs:84:28:84:41 | F | +| closure.rs:84:54:86:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:85:23:85:23 | f | | closure.rs:84:28:84:41 | F | +| closure.rs:85:24:85:29 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:85:24:85:29 | ArgList | T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:85:25:85:28 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:88:49:88:49 | f | | closure.rs:88:22:88:42 | F | +| closure.rs:88:55:91:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:90:9:90:9 | f | | closure.rs:88:22:88:42 | F | +| closure.rs:90:10:90:14 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:93:42:93:42 | f | | closure.rs:93:20:93:35 | F | +| closure.rs:93:48:93:48 | a | | closure.rs:93:14:93:14 | A | +| closure.rs:94:9:94:9 | f | | closure.rs:93:20:93:35 | F | +| closure.rs:94:10:94:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:94:10:94:12 | ArgList | T0 | closure.rs:93:14:93:14 | A | +| closure.rs:94:11:94:11 | a | | closure.rs:93:14:93:14 | A | +| closure.rs:97:22:97:22 | f | | closure.rs:97:25:97:46 | impl ... | +| closure.rs:98:9:98:9 | f | | closure.rs:97:25:97:46 | impl ... | +| closure.rs:98:10:98:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:101:15:113:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:102:13:102:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:102:13:102:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:102:13:102:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:102:13:102:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:102:17:108:9 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:102:17:108:9 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:102:17:108:9 | \|...\| ... | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:102:17:108:9 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:102:18:102:18 | x | | {EXTERNAL LOCATION} | bool | +| closure.rs:103:16:103:16 | x | | {EXTERNAL LOCATION} | bool | +| closure.rs:109:24:109:24 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:109:24:109:24 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:109:24:109:24 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:109:24:109:24 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:109:27:109:30 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:111:13:111:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:111:13:111:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:111:17:111:25 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:111:17:111:25 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:112:29:112:29 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:112:29:112:29 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:117:40:117:40 | f | | closure.rs:117:20:117:37 | F | +| closure.rs:117:46:119:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:118:23:118:23 | f | | closure.rs:117:20:117:37 | F | +| closure.rs:118:24:118:29 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:118:24:118:29 | ArgList | T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:118:25:118:28 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:121:41:121:41 | f | | closure.rs:121:28:121:38 | F | +| closure.rs:121:47:123:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:122:23:122:23 | f | | closure.rs:121:28:121:38 | F | +| closure.rs:122:24:122:29 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:122:24:122:29 | ArgList | T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:122:25:122:28 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:125:42:125:42 | f | | closure.rs:125:22:125:39 | F | +| closure.rs:125:48:128:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:127:9:127:9 | f | | closure.rs:125:22:125:39 | F | +| closure.rs:127:10:127:14 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:130:35:130:35 | f | | closure.rs:130:20:130:32 | F | +| closure.rs:130:41:130:41 | a | | closure.rs:130:14:130:14 | A | +| closure.rs:131:9:131:9 | f | | closure.rs:130:20:130:32 | F | +| closure.rs:131:10:131:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:131:10:131:12 | ArgList | T0 | closure.rs:130:14:130:14 | A | +| closure.rs:131:11:131:11 | a | | closure.rs:130:14:130:14 | A | +| closure.rs:134:18:134:18 | f | | closure.rs:134:21:134:39 | impl ... | +| closure.rs:135:9:135:9 | f | | closure.rs:134:21:134:39 | impl ... | +| closure.rs:135:10:135:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:138:15:150:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:139:13:139:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:139:13:139:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:139:13:139:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:139:13:139:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:139:17:145:9 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:139:17:145:9 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:139:17:145:9 | \|...\| ... | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:139:17:145:9 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:139:18:139:18 | x | | {EXTERNAL LOCATION} | bool | +| closure.rs:140:16:140:16 | x | | {EXTERNAL LOCATION} | bool | +| closure.rs:146:24:146:24 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:146:24:146:24 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:146:24:146:24 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:146:24:146:24 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:146:27:146:30 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:148:13:148:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:148:13:148:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:148:17:148:25 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:148:17:148:25 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:149:29:149:29 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:149:29:149:29 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:154:54:154:54 | f | | {EXTERNAL LOCATION} | Box | +| closure.rs:154:54:154:54 | f | A | {EXTERNAL LOCATION} | Global | +| closure.rs:154:54:154:54 | f | T | closure.rs:154:26:154:51 | F | +| closure.rs:154:65:154:67 | arg | | closure.rs:154:20:154:20 | A | +| closure.rs:155:9:155:9 | f | | {EXTERNAL LOCATION} | Box | +| closure.rs:155:9:155:9 | f | A | {EXTERNAL LOCATION} | Global | +| closure.rs:155:9:155:9 | f | T | closure.rs:154:26:154:51 | F | +| closure.rs:155:10:155:14 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:155:10:155:14 | ArgList | T0 | closure.rs:154:20:154:20 | A | +| closure.rs:155:11:155:13 | arg | | closure.rs:154:20:154:20 | A | +| closure.rs:158:30:158:30 | f | | {EXTERNAL LOCATION} | Box | +| closure.rs:158:30:158:30 | f | A | {EXTERNAL LOCATION} | Global | +| closure.rs:158:30:158:30 | f | T | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:158:30:158:30 | f | T.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:158:30:158:30 | f | T.dyn(Args).T0 | closure.rs:158:24:158:24 | A | +| closure.rs:158:30:158:30 | f | T.dyn(Output) | closure.rs:158:27:158:27 | B | +| closure.rs:158:58:158:60 | arg | | closure.rs:158:24:158:24 | A | +| closure.rs:158:66:161:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:159:31:159:31 | f | | {EXTERNAL LOCATION} | Box | +| closure.rs:159:31:159:31 | f | A | {EXTERNAL LOCATION} | Global | +| closure.rs:159:31:159:31 | f | T | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:159:31:159:31 | f | T.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:159:31:159:31 | f | T.dyn(Args).T0 | closure.rs:158:24:158:24 | A | +| closure.rs:159:31:159:31 | f | T.dyn(Output) | closure.rs:158:27:158:27 | B | +| closure.rs:159:34:159:36 | arg | | closure.rs:158:24:158:24 | A | +| closure.rs:160:40:160:52 | \|...\| true | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:160:40:160:52 | \|...\| true | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:160:40:160:52 | \|...\| true | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:160:41:160:41 | _ | | {EXTERNAL LOCATION} | i64 | +| closure.rs:160:49:160:52 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:165:34:165:34 | f | | closure.rs:165:15:165:31 | F | +| closure.rs:165:40:165:40 | a | | {EXTERNAL LOCATION} | i64 | +| closure.rs:166:9:166:9 | f | | closure.rs:165:15:165:31 | F | | closure.rs:166:10:166:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | | closure.rs:166:10:166:12 | ArgList | T0 | {EXTERNAL LOCATION} | i64 | | closure.rs:166:11:166:11 | a | | {EXTERNAL LOCATION} | i64 | -| closure.rs:169:41:169:41 | f | | closure.rs:169:15:169:34 | F | -| closure.rs:169:47:169:47 | a | | {EXTERNAL LOCATION} | i64 | -| closure.rs:170:9:170:9 | f | | closure.rs:169:15:169:34 | F | +| closure.rs:169:15:169:15 | f | | closure.rs:169:18:169:36 | impl ... | +| closure.rs:169:39:169:39 | a | | {EXTERNAL LOCATION} | i64 | +| closure.rs:170:9:170:9 | f | | closure.rs:169:18:169:36 | impl ... | | closure.rs:170:10:170:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | | closure.rs:170:10:170:12 | ArgList | T0 | {EXTERNAL LOCATION} | i64 | | closure.rs:170:11:170:11 | a | | {EXTERNAL LOCATION} | i64 | -| closure.rs:173:15:173:15 | f | | {EXTERNAL LOCATION} | &mut | -| closure.rs:173:15:173:15 | f | TRefMut | {EXTERNAL LOCATION} | dyn FnMut | -| closure.rs:173:15:173:15 | f | TRefMut.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:173:15:173:15 | f | TRefMut.dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:173:15:173:15 | f | TRefMut.dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:173:46:173:46 | a | | {EXTERNAL LOCATION} | i64 | -| closure.rs:174:9:174:9 | f | | {EXTERNAL LOCATION} | &mut | -| closure.rs:174:9:174:9 | f | TRefMut | {EXTERNAL LOCATION} | dyn FnMut | -| closure.rs:174:9:174:9 | f | TRefMut.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:174:9:174:9 | f | TRefMut.dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:174:9:174:9 | f | TRefMut.dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:173:15:173:15 | f | | {EXTERNAL LOCATION} | & | +| closure.rs:173:15:173:15 | f | TRef | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:173:15:173:15 | f | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:173:15:173:15 | f | TRef.dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:173:15:173:15 | f | TRef.dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:173:39:173:39 | a | | {EXTERNAL LOCATION} | i64 | +| closure.rs:174:9:174:9 | f | | {EXTERNAL LOCATION} | & | +| closure.rs:174:9:174:9 | f | TRef | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:174:9:174:9 | f | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:174:9:174:9 | f | TRef.dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:174:9:174:9 | f | TRef.dyn(Output) | {EXTERNAL LOCATION} | i64 | | closure.rs:174:10:174:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | | closure.rs:174:10:174:12 | ArgList | T0 | {EXTERNAL LOCATION} | i64 | | closure.rs:174:11:174:11 | a | | {EXTERNAL LOCATION} | i64 | -| closure.rs:177:18:177:18 | f | | closure.rs:177:21:177:37 | impl ... | -| closure.rs:177:40:177:40 | a | | closure.rs:177:15:177:15 | T | -| closure.rs:178:9:178:9 | f | | closure.rs:177:21:177:37 | impl ... | +| closure.rs:177:41:177:41 | f | | closure.rs:177:15:177:34 | F | +| closure.rs:177:47:177:47 | a | | {EXTERNAL LOCATION} | i64 | +| closure.rs:178:9:178:9 | f | | closure.rs:177:15:177:34 | F | | closure.rs:178:10:178:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:178:10:178:12 | ArgList | T0 | closure.rs:177:15:177:15 | T | -| closure.rs:178:11:178:11 | a | | closure.rs:177:15:177:15 | T | -| closure.rs:181:42:181:42 | f | | closure.rs:181:18:181:35 | F | -| closure.rs:181:48:181:48 | a | | closure.rs:181:15:181:15 | T | -| closure.rs:182:9:182:9 | f | | closure.rs:181:18:181:35 | F | +| closure.rs:178:10:178:12 | ArgList | T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:178:11:178:11 | a | | {EXTERNAL LOCATION} | i64 | +| closure.rs:181:15:181:15 | f | | {EXTERNAL LOCATION} | &mut | +| closure.rs:181:15:181:15 | f | TRefMut | {EXTERNAL LOCATION} | dyn FnMut | +| closure.rs:181:15:181:15 | f | TRefMut.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:181:15:181:15 | f | TRefMut.dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:181:15:181:15 | f | TRefMut.dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:181:46:181:46 | a | | {EXTERNAL LOCATION} | i64 | +| closure.rs:182:9:182:9 | f | | {EXTERNAL LOCATION} | &mut | +| closure.rs:182:9:182:9 | f | TRefMut | {EXTERNAL LOCATION} | dyn FnMut | +| closure.rs:182:9:182:9 | f | TRefMut.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:182:9:182:9 | f | TRefMut.dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:182:9:182:9 | f | TRefMut.dyn(Output) | {EXTERNAL LOCATION} | i64 | | closure.rs:182:10:182:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:182:10:182:12 | ArgList | T0 | closure.rs:181:15:181:15 | T | -| closure.rs:182:11:182:11 | a | | closure.rs:181:15:181:15 | T | -| closure.rs:185:15:206:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:186:13:186:13 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:186:13:186:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:186:17:186:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:186:17:186:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:187:25:187:25 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:187:25:187:25 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:187:28:187:31 | 1i64 | | {EXTERNAL LOCATION} | i64 | -| closure.rs:189:13:189:13 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:189:13:189:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:189:17:189:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:189:17:189:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:190:25:190:25 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:190:25:190:25 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:190:28:190:31 | 2i64 | | {EXTERNAL LOCATION} | i64 | -| closure.rs:192:13:192:13 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:192:13:192:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:192:17:192:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:192:17:192:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:193:25:193:26 | &f | | {EXTERNAL LOCATION} | & | -| closure.rs:193:25:193:26 | &f | TRef | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:193:25:193:26 | &f | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:193:26:193:26 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:193:26:193:26 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:193:29:193:32 | 3i64 | | {EXTERNAL LOCATION} | i64 | -| closure.rs:195:13:195:13 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:195:13:195:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:195:17:195:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:195:17:195:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:196:25:196:25 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:196:25:196:25 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:196:28:196:31 | 4i64 | | {EXTERNAL LOCATION} | i64 | -| closure.rs:198:17:198:17 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:198:17:198:17 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:198:21:198:25 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:198:21:198:25 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:199:25:199:30 | &mut f | | {EXTERNAL LOCATION} | &mut | -| closure.rs:199:25:199:30 | &mut f | TRefMut | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:199:25:199:30 | &mut f | TRefMut.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:199:30:199:30 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:199:30:199:30 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:199:33:199:36 | 5i64 | | {EXTERNAL LOCATION} | i64 | -| closure.rs:201:13:201:13 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:201:13:201:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:201:17:201:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:201:17:201:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:202:25:202:25 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:202:25:202:25 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:202:28:202:31 | 6i64 | | {EXTERNAL LOCATION} | i64 | -| closure.rs:204:13:204:13 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:204:13:204:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:204:17:204:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:204:17:204:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:205:25:205:25 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:205:25:205:25 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:205:28:205:31 | 7i64 | | {EXTERNAL LOCATION} | i64 | -| closure.rs:217:18:217:22 | SelfParam | | {EXTERNAL LOCATION} | & | -| closure.rs:217:18:217:22 | SelfParam | TRef | closure.rs:212:5:212:19 | S | -| closure.rs:217:18:217:22 | SelfParam | TRef.T | closure.rs:214:10:214:10 | T | -| closure.rs:217:42:219:9 | { ... } | | {EXTERNAL LOCATION} | & | -| closure.rs:217:42:219:9 | { ... } | TRef | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:217:42:219:9 | { ... } | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:218:13:218:22 | &... | | {EXTERNAL LOCATION} | & | -| closure.rs:218:13:218:22 | &... | TRef | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:218:13:218:22 | &... | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:218:14:218:22 | \|...\| false | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:218:14:218:22 | \|...\| false | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:218:18:218:22 | false | | {EXTERNAL LOCATION} | bool | -| closure.rs:222:19:248:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:223:13:223:13 | x | | {EXTERNAL LOCATION} | i64 | -| closure.rs:223:17:223:20 | 0i64 | | {EXTERNAL LOCATION} | i64 | -| closure.rs:226:21:226:23 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:226:21:226:23 | ArgList | T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:226:22:226:22 | x | | {EXTERNAL LOCATION} | i64 | -| closure.rs:228:13:228:13 | x | | {EXTERNAL LOCATION} | i32 | -| closure.rs:228:17:228:20 | 0i32 | | {EXTERNAL LOCATION} | i32 | -| closure.rs:231:21:231:23 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:231:21:231:23 | ArgList | T0 | {EXTERNAL LOCATION} | i32 | -| closure.rs:231:22:231:22 | x | | {EXTERNAL LOCATION} | i32 | -| closure.rs:232:13:232:17 | s_ref | | {EXTERNAL LOCATION} | & | -| closure.rs:232:21:232:22 | &s | | {EXTERNAL LOCATION} | & | -| closure.rs:240:20:240:24 | s_ref | | {EXTERNAL LOCATION} | & | -| closure.rs:240:25:240:27 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:240:25:240:27 | ArgList | T0 | {EXTERNAL LOCATION} | i32 | -| closure.rs:240:26:240:26 | x | | {EXTERNAL LOCATION} | i32 | -| closure.rs:246:13:246:13 | c | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:246:13:246:13 | c | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:246:17:246:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:246:17:246:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:247:9:247:12 | (...) | | {EXTERNAL LOCATION} | & | -| closure.rs:247:9:247:12 | (...) | TRef | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:247:9:247:12 | (...) | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:247:10:247:11 | &c | | {EXTERNAL LOCATION} | & | -| closure.rs:247:10:247:11 | &c | TRef | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:247:10:247:11 | &c | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:247:11:247:11 | c | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:247:11:247:11 | c | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:247:13:247:15 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:247:13:247:15 | ArgList | T0 | {EXTERNAL LOCATION} | i32 | -| closure.rs:247:14:247:14 | x | | {EXTERNAL LOCATION} | i32 | +| closure.rs:182:10:182:12 | ArgList | T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:182:11:182:11 | a | | {EXTERNAL LOCATION} | i64 | +| closure.rs:185:18:185:18 | f | | closure.rs:185:21:185:37 | impl ... | +| closure.rs:185:40:185:40 | a | | closure.rs:185:15:185:15 | T | +| closure.rs:186:9:186:9 | f | | closure.rs:185:21:185:37 | impl ... | +| closure.rs:186:10:186:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:186:10:186:12 | ArgList | T0 | closure.rs:185:15:185:15 | T | +| closure.rs:186:11:186:11 | a | | closure.rs:185:15:185:15 | T | +| closure.rs:189:42:189:42 | f | | closure.rs:189:18:189:35 | F | +| closure.rs:189:48:189:48 | a | | closure.rs:189:15:189:15 | T | +| closure.rs:190:9:190:9 | f | | closure.rs:189:18:189:35 | F | +| closure.rs:190:10:190:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:190:10:190:12 | ArgList | T0 | closure.rs:189:15:189:15 | T | +| closure.rs:190:11:190:11 | a | | closure.rs:189:15:189:15 | T | +| closure.rs:193:15:214:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:194:13:194:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:194:13:194:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:194:17:194:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:194:17:194:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:195:25:195:25 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:195:25:195:25 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:195:28:195:31 | 1i64 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:197:13:197:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:197:13:197:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:197:17:197:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:197:17:197:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:198:25:198:25 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:198:25:198:25 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:198:28:198:31 | 2i64 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:200:13:200:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:200:13:200:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:200:17:200:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:200:17:200:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:201:25:201:26 | &f | | {EXTERNAL LOCATION} | & | +| closure.rs:201:25:201:26 | &f | TRef | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:201:25:201:26 | &f | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:201:26:201:26 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:201:26:201:26 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:201:29:201:32 | 3i64 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:203:13:203:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:203:13:203:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:203:17:203:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:203:17:203:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:204:25:204:25 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:204:25:204:25 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:204:28:204:31 | 4i64 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:206:17:206:17 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:206:17:206:17 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:206:21:206:25 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:206:21:206:25 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:207:25:207:30 | &mut f | | {EXTERNAL LOCATION} | &mut | +| closure.rs:207:25:207:30 | &mut f | TRefMut | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:207:25:207:30 | &mut f | TRefMut.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:207:30:207:30 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:207:30:207:30 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:207:33:207:36 | 5i64 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:209:13:209:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:209:13:209:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:209:17:209:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:209:17:209:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:210:25:210:25 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:210:25:210:25 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:210:28:210:31 | 6i64 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:212:13:212:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:212:13:212:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:212:17:212:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:212:17:212:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:213:25:213:25 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:213:25:213:25 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:213:28:213:31 | 7i64 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:225:18:225:22 | SelfParam | | {EXTERNAL LOCATION} | & | +| closure.rs:225:18:225:22 | SelfParam | TRef | closure.rs:220:5:220:19 | S | +| closure.rs:225:18:225:22 | SelfParam | TRef.T | closure.rs:222:10:222:10 | T | +| closure.rs:225:42:227:9 | { ... } | | {EXTERNAL LOCATION} | & | +| closure.rs:225:42:227:9 | { ... } | TRef | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:225:42:227:9 | { ... } | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:226:13:226:22 | &... | | {EXTERNAL LOCATION} | & | +| closure.rs:226:13:226:22 | &... | TRef | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:226:13:226:22 | &... | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:226:14:226:22 | \|...\| false | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:226:14:226:22 | \|...\| false | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:226:18:226:22 | false | | {EXTERNAL LOCATION} | bool | +| closure.rs:230:19:256:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:231:13:231:13 | x | | {EXTERNAL LOCATION} | i64 | +| closure.rs:231:17:231:20 | 0i64 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:234:21:234:23 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:234:21:234:23 | ArgList | T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:234:22:234:22 | x | | {EXTERNAL LOCATION} | i64 | +| closure.rs:236:13:236:13 | x | | {EXTERNAL LOCATION} | i32 | +| closure.rs:236:17:236:20 | 0i32 | | {EXTERNAL LOCATION} | i32 | +| closure.rs:239:21:239:23 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:239:21:239:23 | ArgList | T0 | {EXTERNAL LOCATION} | i32 | +| closure.rs:239:22:239:22 | x | | {EXTERNAL LOCATION} | i32 | +| closure.rs:240:13:240:17 | s_ref | | {EXTERNAL LOCATION} | & | +| closure.rs:240:21:240:22 | &s | | {EXTERNAL LOCATION} | & | +| closure.rs:248:20:248:24 | s_ref | | {EXTERNAL LOCATION} | & | +| closure.rs:248:25:248:27 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:248:25:248:27 | ArgList | T0 | {EXTERNAL LOCATION} | i32 | +| closure.rs:248:26:248:26 | x | | {EXTERNAL LOCATION} | i32 | +| closure.rs:254:13:254:13 | c | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:254:13:254:13 | c | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:254:17:254:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:254:17:254:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:255:9:255:12 | (...) | | {EXTERNAL LOCATION} | & | +| closure.rs:255:9:255:12 | (...) | TRef | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:255:9:255:12 | (...) | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:255:10:255:11 | &c | | {EXTERNAL LOCATION} | & | +| closure.rs:255:10:255:11 | &c | TRef | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:255:10:255:11 | &c | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:255:11:255:11 | c | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:255:11:255:11 | c | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:255:13:255:15 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:255:13:255:15 | ArgList | T0 | {EXTERNAL LOCATION} | i32 | +| closure.rs:255:14:255:14 | x | | {EXTERNAL LOCATION} | i32 | | dereference.rs:13:14:13:18 | SelfParam | | {EXTERNAL LOCATION} | & | | dereference.rs:13:14:13:18 | SelfParam | TRef | dereference.rs:5:1:7:1 | MyIntPointer | | dereference.rs:13:29:15:5 | { ... } | | {EXTERNAL LOCATION} | & | @@ -5983,7 +6003,7 @@ inferType | blanket_impl.rs:299:44:299:44 | c | | blanket_impl.rs:286:5:286:29 | MySqlConnection | | blanket_impl.rs:299:47:299:67 | "SELECT * FROM users" | | {EXTERNAL LOCATION} | & | | blanket_impl.rs:299:47:299:67 | "SELECT * FROM users" | TRef | {EXTERNAL LOCATION} | str | -| closure.rs:4:19:31:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:4:19:39:5 | { ... } | | {EXTERNAL LOCATION} | () | | closure.rs:6:13:6:22 | my_closure | | {EXTERNAL LOCATION} | dyn Fn | | closure.rs:6:13:6:22 | my_closure | dyn(Args) | {EXTERNAL LOCATION} | (T_2) | | closure.rs:6:13:6:22 | my_closure | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | @@ -6093,570 +6113,663 @@ inferType | closure.rs:30:28:30:32 | ArgList | | {EXTERNAL LOCATION} | (T_1) | | closure.rs:30:28:30:32 | ArgList | T0 | {EXTERNAL LOCATION} | bool | | closure.rs:30:29:30:31 | arg | | {EXTERNAL LOCATION} | bool | -| closure.rs:35:44:35:44 | f | | closure.rs:35:20:35:41 | F | -| closure.rs:35:50:37:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:36:13:36:19 | _return | | {EXTERNAL LOCATION} | i64 | -| closure.rs:36:23:36:23 | f | | closure.rs:35:20:35:41 | F | -| closure.rs:36:23:36:29 | f(...) | | {EXTERNAL LOCATION} | i64 | -| closure.rs:36:24:36:29 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:36:24:36:29 | ArgList | T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:36:25:36:28 | true | | {EXTERNAL LOCATION} | bool | -| closure.rs:39:45:39:45 | f | | closure.rs:39:28:39:42 | F | -| closure.rs:39:51:41:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:40:13:40:19 | _return | | {EXTERNAL LOCATION} | () | -| closure.rs:40:23:40:23 | f | | closure.rs:39:28:39:42 | F | -| closure.rs:40:23:40:29 | f(...) | | {EXTERNAL LOCATION} | () | -| closure.rs:40:24:40:29 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:40:24:40:29 | ArgList | T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:40:25:40:28 | true | | {EXTERNAL LOCATION} | bool | -| closure.rs:43:46:43:46 | f | | closure.rs:43:22:43:43 | F | -| closure.rs:43:52:46:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:44:13:44:15 | arg | | {EXTERNAL LOCATION} | bool | -| closure.rs:44:19:44:36 | ...::default(...) | | {EXTERNAL LOCATION} | bool | -| closure.rs:45:9:45:9 | f | | closure.rs:43:22:43:43 | F | -| closure.rs:45:9:45:14 | f(...) | | {EXTERNAL LOCATION} | i64 | -| closure.rs:45:10:45:14 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:45:10:45:14 | ArgList | T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:45:11:45:13 | arg | | {EXTERNAL LOCATION} | bool | -| closure.rs:48:39:48:39 | f | | closure.rs:48:20:48:36 | F | -| closure.rs:48:45:48:45 | a | | closure.rs:48:14:48:14 | A | -| closure.rs:48:56:50:5 | { ... } | | closure.rs:48:17:48:17 | B | -| closure.rs:49:9:49:9 | f | | closure.rs:48:20:48:36 | F | -| closure.rs:49:9:49:12 | f(...) | | closure.rs:48:17:48:17 | B | -| closure.rs:49:10:49:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:49:10:49:12 | ArgList | T0 | closure.rs:48:14:48:14 | A | -| closure.rs:49:11:49:11 | a | | closure.rs:48:14:48:14 | A | -| closure.rs:52:18:52:18 | f | | closure.rs:52:21:52:43 | impl ... | -| closure.rs:52:53:54:5 | { ... } | | {EXTERNAL LOCATION} | i64 | -| closure.rs:53:9:53:9 | f | | closure.rs:52:21:52:43 | impl ... | -| closure.rs:53:9:53:12 | f(...) | | {EXTERNAL LOCATION} | i64 | -| closure.rs:53:10:53:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:53:10:53:12 | ArgList | T0 | {EXTERNAL LOCATION} | i32 | -| closure.rs:53:11:53:11 | 2 | | {EXTERNAL LOCATION} | i32 | -| closure.rs:56:15:68:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:57:13:57:13 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:57:13:57:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:57:13:57:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:57:13:57:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:57:17:63:9 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:57:17:63:9 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:57:17:63:9 | \|...\| ... | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:57:17:63:9 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:57:18:57:18 | x | | {EXTERNAL LOCATION} | bool | -| closure.rs:57:34:63:9 | { ... } | | {EXTERNAL LOCATION} | i32 | -| closure.rs:58:13:62:13 | if x {...} else {...} | | {EXTERNAL LOCATION} | i32 | -| closure.rs:58:16:58:16 | x | | {EXTERNAL LOCATION} | bool | -| closure.rs:58:18:60:13 | { ... } | | {EXTERNAL LOCATION} | i32 | -| closure.rs:59:17:59:17 | 1 | | {EXTERNAL LOCATION} | i32 | -| closure.rs:60:20:62:13 | { ... } | | {EXTERNAL LOCATION} | i32 | -| closure.rs:61:17:61:17 | 0 | | {EXTERNAL LOCATION} | i32 | -| closure.rs:64:13:64:14 | _r | | {EXTERNAL LOCATION} | i64 | -| closure.rs:64:18:64:31 | apply(...) | | {EXTERNAL LOCATION} | i64 | -| closure.rs:64:24:64:24 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:64:24:64:24 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:64:24:64:24 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:64:24:64:24 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:64:27:64:30 | true | | {EXTERNAL LOCATION} | bool | -| closure.rs:66:13:66:13 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:66:13:66:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:66:13:66:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:66:17:66:25 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:66:17:66:25 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:66:17:66:25 | \|...\| ... | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:66:18:66:18 | x | | {EXTERNAL LOCATION} | i64 | -| closure.rs:66:21:66:21 | x | | {EXTERNAL LOCATION} | i64 | -| closure.rs:66:25:66:25 | 1 | | {EXTERNAL LOCATION} | i32 | -| closure.rs:67:13:67:15 | _r2 | | {EXTERNAL LOCATION} | i64 | -| closure.rs:67:19:67:30 | apply_two(...) | | {EXTERNAL LOCATION} | i64 | -| closure.rs:67:29:67:29 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:67:29:67:29 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:67:29:67:29 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:72:47:72:47 | f | | closure.rs:72:20:72:40 | F | -| closure.rs:72:53:74:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:73:13:73:19 | _return | | {EXTERNAL LOCATION} | i64 | -| closure.rs:73:23:73:23 | f | | closure.rs:72:20:72:40 | F | -| closure.rs:73:23:73:29 | f(...) | | {EXTERNAL LOCATION} | i64 | -| closure.rs:73:24:73:29 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:73:24:73:29 | ArgList | T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:73:25:73:28 | true | | {EXTERNAL LOCATION} | bool | -| closure.rs:76:48:76:48 | f | | closure.rs:76:28:76:41 | F | -| closure.rs:76:54:78:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:77:13:77:19 | _return | | {EXTERNAL LOCATION} | () | -| closure.rs:77:23:77:23 | f | | closure.rs:76:28:76:41 | F | -| closure.rs:77:23:77:29 | f(...) | | {EXTERNAL LOCATION} | () | -| closure.rs:77:24:77:29 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:77:24:77:29 | ArgList | T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:77:25:77:28 | true | | {EXTERNAL LOCATION} | bool | -| closure.rs:80:49:80:49 | f | | closure.rs:80:22:80:42 | F | -| closure.rs:80:55:83:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:81:13:81:15 | arg | | {EXTERNAL LOCATION} | bool | -| closure.rs:81:19:81:36 | ...::default(...) | | {EXTERNAL LOCATION} | bool | -| closure.rs:82:9:82:9 | f | | closure.rs:80:22:80:42 | F | -| closure.rs:82:9:82:14 | f(...) | | {EXTERNAL LOCATION} | i64 | -| closure.rs:82:10:82:14 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:82:10:82:14 | ArgList | T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:82:11:82:13 | arg | | {EXTERNAL LOCATION} | bool | -| closure.rs:85:42:85:42 | f | | closure.rs:85:20:85:35 | F | -| closure.rs:85:48:85:48 | a | | closure.rs:85:14:85:14 | A | -| closure.rs:85:59:87:5 | { ... } | | closure.rs:85:17:85:17 | B | -| closure.rs:86:9:86:9 | f | | closure.rs:85:20:85:35 | F | -| closure.rs:86:9:86:12 | f(...) | | closure.rs:85:17:85:17 | B | -| closure.rs:86:10:86:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:86:10:86:12 | ArgList | T0 | closure.rs:85:14:85:14 | A | -| closure.rs:86:11:86:11 | a | | closure.rs:85:14:85:14 | A | -| closure.rs:89:22:89:22 | f | | closure.rs:89:25:89:46 | impl ... | -| closure.rs:89:56:91:5 | { ... } | | {EXTERNAL LOCATION} | i64 | -| closure.rs:90:9:90:9 | f | | closure.rs:89:25:89:46 | impl ... | -| closure.rs:90:9:90:12 | f(...) | | {EXTERNAL LOCATION} | i64 | -| closure.rs:90:10:90:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:90:10:90:12 | ArgList | T0 | {EXTERNAL LOCATION} | i32 | -| closure.rs:90:11:90:11 | 2 | | {EXTERNAL LOCATION} | i32 | -| closure.rs:93:15:105:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:94:13:94:13 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:94:13:94:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:94:13:94:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:94:13:94:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:94:17:100:9 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:94:17:100:9 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:94:17:100:9 | \|...\| ... | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:94:17:100:9 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:94:18:94:18 | x | | {EXTERNAL LOCATION} | bool | -| closure.rs:94:34:100:9 | { ... } | | {EXTERNAL LOCATION} | i32 | -| closure.rs:95:13:99:13 | if x {...} else {...} | | {EXTERNAL LOCATION} | i32 | -| closure.rs:95:16:95:16 | x | | {EXTERNAL LOCATION} | bool | -| closure.rs:95:18:97:13 | { ... } | | {EXTERNAL LOCATION} | i32 | -| closure.rs:96:17:96:17 | 1 | | {EXTERNAL LOCATION} | i32 | -| closure.rs:97:20:99:13 | { ... } | | {EXTERNAL LOCATION} | i32 | -| closure.rs:98:17:98:17 | 0 | | {EXTERNAL LOCATION} | i32 | -| closure.rs:101:13:101:14 | _r | | {EXTERNAL LOCATION} | i64 | -| closure.rs:101:18:101:31 | apply(...) | | {EXTERNAL LOCATION} | i64 | -| closure.rs:101:24:101:24 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:101:24:101:24 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:101:24:101:24 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:101:24:101:24 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:101:27:101:30 | true | | {EXTERNAL LOCATION} | bool | -| closure.rs:103:13:103:13 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:103:13:103:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:103:13:103:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:103:17:103:25 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:103:17:103:25 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:103:17:103:25 | \|...\| ... | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:103:18:103:18 | x | | {EXTERNAL LOCATION} | i64 | -| closure.rs:103:21:103:21 | x | | {EXTERNAL LOCATION} | i64 | -| closure.rs:103:25:103:25 | 1 | | {EXTERNAL LOCATION} | i32 | -| closure.rs:104:13:104:15 | _r2 | | {EXTERNAL LOCATION} | i64 | -| closure.rs:104:19:104:30 | apply_two(...) | | {EXTERNAL LOCATION} | i64 | -| closure.rs:104:29:104:29 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:104:29:104:29 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:104:29:104:29 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:109:40:109:40 | f | | closure.rs:109:20:109:37 | F | -| closure.rs:109:46:111:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:110:13:110:19 | _return | | {EXTERNAL LOCATION} | i64 | -| closure.rs:110:23:110:23 | f | | closure.rs:109:20:109:37 | F | -| closure.rs:110:23:110:29 | f(...) | | {EXTERNAL LOCATION} | i64 | -| closure.rs:110:24:110:29 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:110:24:110:29 | ArgList | T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:110:25:110:28 | true | | {EXTERNAL LOCATION} | bool | -| closure.rs:113:41:113:41 | f | | closure.rs:113:28:113:38 | F | -| closure.rs:113:47:115:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:114:13:114:19 | _return | | {EXTERNAL LOCATION} | () | -| closure.rs:114:23:114:23 | f | | closure.rs:113:28:113:38 | F | -| closure.rs:114:23:114:29 | f(...) | | {EXTERNAL LOCATION} | () | -| closure.rs:114:24:114:29 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:114:24:114:29 | ArgList | T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:114:25:114:28 | true | | {EXTERNAL LOCATION} | bool | -| closure.rs:117:42:117:42 | f | | closure.rs:117:22:117:39 | F | -| closure.rs:117:48:120:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:118:13:118:15 | arg | | {EXTERNAL LOCATION} | bool | -| closure.rs:118:19:118:36 | ...::default(...) | | {EXTERNAL LOCATION} | bool | -| closure.rs:119:9:119:9 | f | | closure.rs:117:22:117:39 | F | -| closure.rs:119:9:119:14 | f(...) | | {EXTERNAL LOCATION} | i64 | -| closure.rs:119:10:119:14 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:119:10:119:14 | ArgList | T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:119:11:119:13 | arg | | {EXTERNAL LOCATION} | bool | -| closure.rs:122:35:122:35 | f | | closure.rs:122:20:122:32 | F | -| closure.rs:122:41:122:41 | a | | closure.rs:122:14:122:14 | A | -| closure.rs:122:52:124:5 | { ... } | | closure.rs:122:17:122:17 | B | -| closure.rs:123:9:123:9 | f | | closure.rs:122:20:122:32 | F | -| closure.rs:123:9:123:12 | f(...) | | closure.rs:122:17:122:17 | B | -| closure.rs:123:10:123:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:123:10:123:12 | ArgList | T0 | closure.rs:122:14:122:14 | A | -| closure.rs:123:11:123:11 | a | | closure.rs:122:14:122:14 | A | -| closure.rs:126:18:126:18 | f | | closure.rs:126:21:126:39 | impl ... | -| closure.rs:126:49:128:5 | { ... } | | {EXTERNAL LOCATION} | i64 | -| closure.rs:127:9:127:9 | f | | closure.rs:126:21:126:39 | impl ... | -| closure.rs:127:9:127:12 | f(...) | | {EXTERNAL LOCATION} | i64 | -| closure.rs:127:10:127:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:127:10:127:12 | ArgList | T0 | {EXTERNAL LOCATION} | i32 | -| closure.rs:127:11:127:11 | 2 | | {EXTERNAL LOCATION} | i32 | -| closure.rs:130:15:142:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:131:13:131:13 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:131:13:131:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:131:13:131:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:131:13:131:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:131:17:137:9 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:131:17:137:9 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:131:17:137:9 | \|...\| ... | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:131:17:137:9 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:131:18:131:18 | x | | {EXTERNAL LOCATION} | bool | -| closure.rs:131:34:137:9 | { ... } | | {EXTERNAL LOCATION} | i32 | -| closure.rs:132:13:136:13 | if x {...} else {...} | | {EXTERNAL LOCATION} | i32 | -| closure.rs:132:16:132:16 | x | | {EXTERNAL LOCATION} | bool | -| closure.rs:132:18:134:13 | { ... } | | {EXTERNAL LOCATION} | i32 | -| closure.rs:133:17:133:17 | 1 | | {EXTERNAL LOCATION} | i32 | -| closure.rs:134:20:136:13 | { ... } | | {EXTERNAL LOCATION} | i32 | -| closure.rs:135:17:135:17 | 0 | | {EXTERNAL LOCATION} | i32 | -| closure.rs:138:13:138:14 | _r | | {EXTERNAL LOCATION} | i64 | -| closure.rs:138:18:138:31 | apply(...) | | {EXTERNAL LOCATION} | i64 | -| closure.rs:138:24:138:24 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:138:24:138:24 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:138:24:138:24 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | -| closure.rs:138:24:138:24 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:138:27:138:30 | true | | {EXTERNAL LOCATION} | bool | -| closure.rs:140:13:140:13 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:140:13:140:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:140:13:140:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:140:17:140:25 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:140:17:140:25 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:140:17:140:25 | \|...\| ... | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:140:18:140:18 | x | | {EXTERNAL LOCATION} | i64 | -| closure.rs:140:21:140:21 | x | | {EXTERNAL LOCATION} | i64 | -| closure.rs:140:25:140:25 | 1 | | {EXTERNAL LOCATION} | i32 | -| closure.rs:141:13:141:15 | _r2 | | {EXTERNAL LOCATION} | i64 | -| closure.rs:141:19:141:30 | apply_two(...) | | {EXTERNAL LOCATION} | i64 | -| closure.rs:141:29:141:29 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:141:29:141:29 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:141:29:141:29 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:146:54:146:54 | f | | {EXTERNAL LOCATION} | Box | -| closure.rs:146:54:146:54 | f | A | {EXTERNAL LOCATION} | Global | -| closure.rs:146:54:146:54 | f | T | closure.rs:146:26:146:51 | F | -| closure.rs:146:65:146:67 | arg | | closure.rs:146:20:146:20 | A | -| closure.rs:146:78:148:5 | { ... } | | closure.rs:146:23:146:23 | B | -| closure.rs:147:9:147:9 | f | | {EXTERNAL LOCATION} | Box | -| closure.rs:147:9:147:9 | f | A | {EXTERNAL LOCATION} | Global | -| closure.rs:147:9:147:9 | f | T | closure.rs:146:26:146:51 | F | -| closure.rs:147:9:147:14 | f(...) | | closure.rs:146:23:146:23 | B | -| closure.rs:147:10:147:14 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:147:10:147:14 | ArgList | T0 | closure.rs:146:20:146:20 | A | -| closure.rs:147:11:147:13 | arg | | closure.rs:146:20:146:20 | A | -| closure.rs:150:30:150:30 | f | | {EXTERNAL LOCATION} | Box | -| closure.rs:150:30:150:30 | f | A | {EXTERNAL LOCATION} | Global | -| closure.rs:150:30:150:30 | f | T | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:150:30:150:30 | f | T.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:150:30:150:30 | f | T.dyn(Args).T0 | closure.rs:150:24:150:24 | A | -| closure.rs:150:30:150:30 | f | T.dyn(Output) | closure.rs:150:27:150:27 | B | -| closure.rs:150:58:150:60 | arg | | closure.rs:150:24:150:24 | A | -| closure.rs:150:66:153:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:151:13:151:15 | _r1 | | closure.rs:150:27:150:27 | B | -| closure.rs:151:19:151:37 | apply_boxed(...) | | closure.rs:150:27:150:27 | B | -| closure.rs:151:31:151:31 | f | | {EXTERNAL LOCATION} | Box | -| closure.rs:151:31:151:31 | f | A | {EXTERNAL LOCATION} | Global | -| closure.rs:151:31:151:31 | f | T | {EXTERNAL LOCATION} | dyn FnOnce | -| closure.rs:151:31:151:31 | f | T.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:151:31:151:31 | f | T.dyn(Args).T0 | closure.rs:150:24:150:24 | A | -| closure.rs:151:31:151:31 | f | T.dyn(Output) | closure.rs:150:27:150:27 | B | -| closure.rs:151:34:151:36 | arg | | closure.rs:150:24:150:24 | A | -| closure.rs:152:13:152:15 | _r2 | | {EXTERNAL LOCATION} | bool | -| closure.rs:152:19:152:57 | apply_boxed(...) | | {EXTERNAL LOCATION} | bool | -| closure.rs:152:31:152:53 | ...::new(...) | | {EXTERNAL LOCATION} | Box | -| closure.rs:152:31:152:53 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | -| closure.rs:152:31:152:53 | ...::new(...) | T | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:152:31:152:53 | ...::new(...) | T.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:152:31:152:53 | ...::new(...) | T.dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:152:31:152:53 | ...::new(...) | T.dyn(Output) | {EXTERNAL LOCATION} | bool | -| closure.rs:152:40:152:52 | \|...\| true | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:152:40:152:52 | \|...\| true | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:152:40:152:52 | \|...\| true | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:152:40:152:52 | \|...\| true | dyn(Output) | {EXTERNAL LOCATION} | bool | -| closure.rs:152:41:152:41 | _ | | {EXTERNAL LOCATION} | i64 | -| closure.rs:152:49:152:52 | true | | {EXTERNAL LOCATION} | bool | -| closure.rs:152:56:152:56 | 3 | | {EXTERNAL LOCATION} | i32 | -| closure.rs:157:34:157:34 | f | | closure.rs:157:15:157:31 | F | -| closure.rs:157:40:157:40 | a | | {EXTERNAL LOCATION} | i64 | -| closure.rs:157:55:159:5 | { ... } | | {EXTERNAL LOCATION} | i64 | -| closure.rs:158:9:158:9 | f | | closure.rs:157:15:157:31 | F | -| closure.rs:158:9:158:12 | f(...) | | {EXTERNAL LOCATION} | i64 | -| closure.rs:158:10:158:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:158:10:158:12 | ArgList | T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:158:11:158:11 | a | | {EXTERNAL LOCATION} | i64 | -| closure.rs:161:15:161:15 | f | | closure.rs:161:18:161:36 | impl ... | -| closure.rs:161:39:161:39 | a | | {EXTERNAL LOCATION} | i64 | -| closure.rs:161:54:163:5 | { ... } | | {EXTERNAL LOCATION} | i64 | -| closure.rs:162:9:162:9 | f | | closure.rs:161:18:161:36 | impl ... | -| closure.rs:162:9:162:12 | f(...) | | {EXTERNAL LOCATION} | i64 | -| closure.rs:162:10:162:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:162:10:162:12 | ArgList | T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:162:11:162:11 | a | | {EXTERNAL LOCATION} | i64 | -| closure.rs:165:15:165:15 | f | | {EXTERNAL LOCATION} | & | -| closure.rs:165:15:165:15 | f | TRef | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:165:15:165:15 | f | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:165:15:165:15 | f | TRef.dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:165:15:165:15 | f | TRef.dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:165:39:165:39 | a | | {EXTERNAL LOCATION} | i64 | -| closure.rs:165:54:167:5 | { ... } | | {EXTERNAL LOCATION} | i64 | -| closure.rs:166:9:166:9 | f | | {EXTERNAL LOCATION} | & | -| closure.rs:166:9:166:9 | f | TRef | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:166:9:166:9 | f | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:166:9:166:9 | f | TRef.dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:166:9:166:9 | f | TRef.dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:33:13:33:14 | f1 | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:33:13:33:14 | f1 | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:33:13:33:14 | f1 | dyn(Args).T0 | {EXTERNAL LOCATION} | Option | +| closure.rs:33:13:33:14 | f1 | dyn(Args).T0.T | {EXTERNAL LOCATION} | i32 | +| closure.rs:33:13:33:14 | f1 | dyn(Output) | {EXTERNAL LOCATION} | (T_2) | +| closure.rs:33:13:33:14 | f1 | dyn(Output).T0 | {EXTERNAL LOCATION} | Option | +| closure.rs:33:13:33:14 | f1 | dyn(Output).T0.T | {EXTERNAL LOCATION} | i32 | +| closure.rs:33:13:33:14 | f1 | dyn(Output).T1 | {EXTERNAL LOCATION} | bool | +| closure.rs:33:18:33:31 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:33:18:33:31 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:33:18:33:31 | \|...\| ... | dyn(Args).T0 | {EXTERNAL LOCATION} | Option | +| closure.rs:33:18:33:31 | \|...\| ... | dyn(Args).T0.T | {EXTERNAL LOCATION} | i32 | +| closure.rs:33:18:33:31 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | (T_2) | +| closure.rs:33:18:33:31 | \|...\| ... | dyn(Output).T0 | {EXTERNAL LOCATION} | Option | +| closure.rs:33:18:33:31 | \|...\| ... | dyn(Output).T0.T | {EXTERNAL LOCATION} | i32 | +| closure.rs:33:18:33:31 | \|...\| ... | dyn(Output).T1 | {EXTERNAL LOCATION} | bool | +| closure.rs:33:19:33:19 | x | | {EXTERNAL LOCATION} | Option | +| closure.rs:33:19:33:19 | x | T | {EXTERNAL LOCATION} | i32 | +| closure.rs:33:22:33:31 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | +| closure.rs:33:22:33:31 | TupleExpr | T0 | {EXTERNAL LOCATION} | Option | +| closure.rs:33:22:33:31 | TupleExpr | T0.T | {EXTERNAL LOCATION} | i32 | +| closure.rs:33:22:33:31 | TupleExpr | T1 | {EXTERNAL LOCATION} | bool | +| closure.rs:33:23:33:23 | x | | {EXTERNAL LOCATION} | Option | +| closure.rs:33:23:33:23 | x | T | {EXTERNAL LOCATION} | i32 | +| closure.rs:33:26:33:30 | false | | {EXTERNAL LOCATION} | bool | +| closure.rs:34:13:34:14 | _r | | {EXTERNAL LOCATION} | (T_2) | +| closure.rs:34:13:34:14 | _r | T0 | {EXTERNAL LOCATION} | Option | +| closure.rs:34:13:34:14 | _r | T0.T | {EXTERNAL LOCATION} | i32 | +| closure.rs:34:13:34:14 | _r | T1 | {EXTERNAL LOCATION} | bool | +| closure.rs:34:18:34:19 | f1 | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:34:18:34:19 | f1 | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:34:18:34:19 | f1 | dyn(Args).T0 | {EXTERNAL LOCATION} | Option | +| closure.rs:34:18:34:19 | f1 | dyn(Args).T0.T | {EXTERNAL LOCATION} | i32 | +| closure.rs:34:18:34:19 | f1 | dyn(Output) | {EXTERNAL LOCATION} | (T_2) | +| closure.rs:34:18:34:19 | f1 | dyn(Output).T0 | {EXTERNAL LOCATION} | Option | +| closure.rs:34:18:34:19 | f1 | dyn(Output).T0.T | {EXTERNAL LOCATION} | i32 | +| closure.rs:34:18:34:19 | f1 | dyn(Output).T1 | {EXTERNAL LOCATION} | bool | +| closure.rs:34:18:34:28 | f1(...) | | {EXTERNAL LOCATION} | (T_2) | +| closure.rs:34:18:34:28 | f1(...) | T0 | {EXTERNAL LOCATION} | Option | +| closure.rs:34:18:34:28 | f1(...) | T0.T | {EXTERNAL LOCATION} | i32 | +| closure.rs:34:18:34:28 | f1(...) | T1 | {EXTERNAL LOCATION} | bool | +| closure.rs:34:20:34:28 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:34:20:34:28 | ArgList | T0 | {EXTERNAL LOCATION} | Option | +| closure.rs:34:20:34:28 | ArgList | T0.T | {EXTERNAL LOCATION} | i32 | +| closure.rs:34:21:34:27 | Some(...) | | {EXTERNAL LOCATION} | Option | +| closure.rs:34:21:34:27 | Some(...) | T | {EXTERNAL LOCATION} | i32 | +| closure.rs:34:26:34:26 | 0 | | {EXTERNAL LOCATION} | i32 | +| closure.rs:37:13:37:14 | f2 | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:37:13:37:14 | f2 | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:37:13:37:14 | f2 | dyn(Args).T0 | {EXTERNAL LOCATION} | Option | +| closure.rs:37:13:37:14 | f2 | dyn(Args).T0.T | {EXTERNAL LOCATION} | i32 | +| closure.rs:37:13:37:14 | f2 | dyn(Output) | {EXTERNAL LOCATION} | (T_2) | +| closure.rs:37:13:37:14 | f2 | dyn(Output).T0 | {EXTERNAL LOCATION} | Option | +| closure.rs:37:13:37:14 | f2 | dyn(Output).T0.T | {EXTERNAL LOCATION} | i32 | +| closure.rs:37:13:37:14 | f2 | dyn(Output).T1 | {EXTERNAL LOCATION} | bool | +| closure.rs:37:18:37:31 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:37:18:37:31 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:37:18:37:31 | \|...\| ... | dyn(Args).T0 | {EXTERNAL LOCATION} | Option | +| closure.rs:37:18:37:31 | \|...\| ... | dyn(Args).T0.T | {EXTERNAL LOCATION} | i32 | +| closure.rs:37:18:37:31 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | (T_2) | +| closure.rs:37:18:37:31 | \|...\| ... | dyn(Output).T0 | {EXTERNAL LOCATION} | Option | +| closure.rs:37:18:37:31 | \|...\| ... | dyn(Output).T0.T | {EXTERNAL LOCATION} | i32 | +| closure.rs:37:18:37:31 | \|...\| ... | dyn(Output).T1 | {EXTERNAL LOCATION} | bool | +| closure.rs:37:19:37:19 | x | | {EXTERNAL LOCATION} | Option | +| closure.rs:37:19:37:19 | x | T | {EXTERNAL LOCATION} | i32 | +| closure.rs:37:22:37:31 | TupleExpr | | {EXTERNAL LOCATION} | (T_2) | +| closure.rs:37:22:37:31 | TupleExpr | T0 | {EXTERNAL LOCATION} | Option | +| closure.rs:37:22:37:31 | TupleExpr | T0.T | {EXTERNAL LOCATION} | i32 | +| closure.rs:37:22:37:31 | TupleExpr | T1 | {EXTERNAL LOCATION} | bool | +| closure.rs:37:23:37:23 | x | | {EXTERNAL LOCATION} | Option | +| closure.rs:37:23:37:23 | x | T | {EXTERNAL LOCATION} | i32 | +| closure.rs:37:26:37:30 | false | | {EXTERNAL LOCATION} | bool | +| closure.rs:38:13:38:14 | _r | | {EXTERNAL LOCATION} | Option | +| closure.rs:38:13:38:14 | _r | T | {EXTERNAL LOCATION} | i32 | +| closure.rs:38:31:38:32 | f2 | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:38:31:38:32 | f2 | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:38:31:38:32 | f2 | dyn(Args).T0 | {EXTERNAL LOCATION} | Option | +| closure.rs:38:31:38:32 | f2 | dyn(Args).T0.T | {EXTERNAL LOCATION} | i32 | +| closure.rs:38:31:38:32 | f2 | dyn(Output) | {EXTERNAL LOCATION} | (T_2) | +| closure.rs:38:31:38:32 | f2 | dyn(Output).T0 | {EXTERNAL LOCATION} | Option | +| closure.rs:38:31:38:32 | f2 | dyn(Output).T0.T | {EXTERNAL LOCATION} | i32 | +| closure.rs:38:31:38:32 | f2 | dyn(Output).T1 | {EXTERNAL LOCATION} | bool | +| closure.rs:38:31:38:52 | f2(...) | | {EXTERNAL LOCATION} | (T_2) | +| closure.rs:38:31:38:52 | f2(...) | T0 | {EXTERNAL LOCATION} | Option | +| closure.rs:38:31:38:52 | f2(...) | T0.T | {EXTERNAL LOCATION} | i32 | +| closure.rs:38:31:38:52 | f2(...) | T1 | {EXTERNAL LOCATION} | bool | +| closure.rs:38:31:38:54 | ... .0 | | {EXTERNAL LOCATION} | Option | +| closure.rs:38:31:38:54 | ... .0 | T | {EXTERNAL LOCATION} | i32 | +| closure.rs:38:33:38:52 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:38:33:38:52 | ArgList | T0 | {EXTERNAL LOCATION} | Option | +| closure.rs:38:33:38:52 | ArgList | T0.T | {EXTERNAL LOCATION} | i32 | +| closure.rs:38:34:38:51 | ...::default(...) | | {EXTERNAL LOCATION} | Option | +| closure.rs:38:34:38:51 | ...::default(...) | T | {EXTERNAL LOCATION} | i32 | +| closure.rs:43:44:43:44 | f | | closure.rs:43:20:43:41 | F | +| closure.rs:43:50:45:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:44:13:44:19 | _return | | {EXTERNAL LOCATION} | i64 | +| closure.rs:44:23:44:23 | f | | closure.rs:43:20:43:41 | F | +| closure.rs:44:23:44:29 | f(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:44:24:44:29 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:44:24:44:29 | ArgList | T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:44:25:44:28 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:47:45:47:45 | f | | closure.rs:47:28:47:42 | F | +| closure.rs:47:51:49:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:48:13:48:19 | _return | | {EXTERNAL LOCATION} | () | +| closure.rs:48:23:48:23 | f | | closure.rs:47:28:47:42 | F | +| closure.rs:48:23:48:29 | f(...) | | {EXTERNAL LOCATION} | () | +| closure.rs:48:24:48:29 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:48:24:48:29 | ArgList | T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:48:25:48:28 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:51:46:51:46 | f | | closure.rs:51:22:51:43 | F | +| closure.rs:51:52:54:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:52:13:52:15 | arg | | {EXTERNAL LOCATION} | bool | +| closure.rs:52:19:52:36 | ...::default(...) | | {EXTERNAL LOCATION} | bool | +| closure.rs:53:9:53:9 | f | | closure.rs:51:22:51:43 | F | +| closure.rs:53:9:53:14 | f(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:53:10:53:14 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:53:10:53:14 | ArgList | T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:53:11:53:13 | arg | | {EXTERNAL LOCATION} | bool | +| closure.rs:56:39:56:39 | f | | closure.rs:56:20:56:36 | F | +| closure.rs:56:45:56:45 | a | | closure.rs:56:14:56:14 | A | +| closure.rs:56:56:58:5 | { ... } | | closure.rs:56:17:56:17 | B | +| closure.rs:57:9:57:9 | f | | closure.rs:56:20:56:36 | F | +| closure.rs:57:9:57:12 | f(...) | | closure.rs:56:17:56:17 | B | +| closure.rs:57:10:57:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:57:10:57:12 | ArgList | T0 | closure.rs:56:14:56:14 | A | +| closure.rs:57:11:57:11 | a | | closure.rs:56:14:56:14 | A | +| closure.rs:60:18:60:18 | f | | closure.rs:60:21:60:43 | impl ... | +| closure.rs:60:53:62:5 | { ... } | | {EXTERNAL LOCATION} | i64 | +| closure.rs:61:9:61:9 | f | | closure.rs:60:21:60:43 | impl ... | +| closure.rs:61:9:61:12 | f(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:61:10:61:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:61:10:61:12 | ArgList | T0 | {EXTERNAL LOCATION} | i32 | +| closure.rs:61:11:61:11 | 2 | | {EXTERNAL LOCATION} | i32 | +| closure.rs:64:15:76:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:65:13:65:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:65:13:65:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:65:13:65:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:65:13:65:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:65:17:71:9 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:65:17:71:9 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:65:17:71:9 | \|...\| ... | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:65:17:71:9 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:65:18:65:18 | x | | {EXTERNAL LOCATION} | bool | +| closure.rs:65:34:71:9 | { ... } | | {EXTERNAL LOCATION} | i32 | +| closure.rs:66:13:70:13 | if x {...} else {...} | | {EXTERNAL LOCATION} | i32 | +| closure.rs:66:16:66:16 | x | | {EXTERNAL LOCATION} | bool | +| closure.rs:66:18:68:13 | { ... } | | {EXTERNAL LOCATION} | i32 | +| closure.rs:67:17:67:17 | 1 | | {EXTERNAL LOCATION} | i32 | +| closure.rs:68:20:70:13 | { ... } | | {EXTERNAL LOCATION} | i32 | +| closure.rs:69:17:69:17 | 0 | | {EXTERNAL LOCATION} | i32 | +| closure.rs:72:13:72:14 | _r | | {EXTERNAL LOCATION} | i64 | +| closure.rs:72:18:72:31 | apply(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:72:24:72:24 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:72:24:72:24 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:72:24:72:24 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:72:24:72:24 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:72:27:72:30 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:74:13:74:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:74:13:74:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:74:13:74:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:74:17:74:25 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:74:17:74:25 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:74:17:74:25 | \|...\| ... | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:74:18:74:18 | x | | {EXTERNAL LOCATION} | i64 | +| closure.rs:74:21:74:21 | x | | {EXTERNAL LOCATION} | i64 | +| closure.rs:74:25:74:25 | 1 | | {EXTERNAL LOCATION} | i32 | +| closure.rs:75:13:75:15 | _r2 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:75:19:75:30 | apply_two(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:75:29:75:29 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:75:29:75:29 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:75:29:75:29 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:80:47:80:47 | f | | closure.rs:80:20:80:40 | F | +| closure.rs:80:53:82:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:81:13:81:19 | _return | | {EXTERNAL LOCATION} | i64 | +| closure.rs:81:23:81:23 | f | | closure.rs:80:20:80:40 | F | +| closure.rs:81:23:81:29 | f(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:81:24:81:29 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:81:24:81:29 | ArgList | T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:81:25:81:28 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:84:48:84:48 | f | | closure.rs:84:28:84:41 | F | +| closure.rs:84:54:86:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:85:13:85:19 | _return | | {EXTERNAL LOCATION} | () | +| closure.rs:85:23:85:23 | f | | closure.rs:84:28:84:41 | F | +| closure.rs:85:23:85:29 | f(...) | | {EXTERNAL LOCATION} | () | +| closure.rs:85:24:85:29 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:85:24:85:29 | ArgList | T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:85:25:85:28 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:88:49:88:49 | f | | closure.rs:88:22:88:42 | F | +| closure.rs:88:55:91:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:89:13:89:15 | arg | | {EXTERNAL LOCATION} | bool | +| closure.rs:89:19:89:36 | ...::default(...) | | {EXTERNAL LOCATION} | bool | +| closure.rs:90:9:90:9 | f | | closure.rs:88:22:88:42 | F | +| closure.rs:90:9:90:14 | f(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:90:10:90:14 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:90:10:90:14 | ArgList | T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:90:11:90:13 | arg | | {EXTERNAL LOCATION} | bool | +| closure.rs:93:42:93:42 | f | | closure.rs:93:20:93:35 | F | +| closure.rs:93:48:93:48 | a | | closure.rs:93:14:93:14 | A | +| closure.rs:93:59:95:5 | { ... } | | closure.rs:93:17:93:17 | B | +| closure.rs:94:9:94:9 | f | | closure.rs:93:20:93:35 | F | +| closure.rs:94:9:94:12 | f(...) | | closure.rs:93:17:93:17 | B | +| closure.rs:94:10:94:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:94:10:94:12 | ArgList | T0 | closure.rs:93:14:93:14 | A | +| closure.rs:94:11:94:11 | a | | closure.rs:93:14:93:14 | A | +| closure.rs:97:22:97:22 | f | | closure.rs:97:25:97:46 | impl ... | +| closure.rs:97:56:99:5 | { ... } | | {EXTERNAL LOCATION} | i64 | +| closure.rs:98:9:98:9 | f | | closure.rs:97:25:97:46 | impl ... | +| closure.rs:98:9:98:12 | f(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:98:10:98:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:98:10:98:12 | ArgList | T0 | {EXTERNAL LOCATION} | i32 | +| closure.rs:98:11:98:11 | 2 | | {EXTERNAL LOCATION} | i32 | +| closure.rs:101:15:113:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:102:13:102:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:102:13:102:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:102:13:102:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:102:13:102:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:102:17:108:9 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:102:17:108:9 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:102:17:108:9 | \|...\| ... | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:102:17:108:9 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:102:18:102:18 | x | | {EXTERNAL LOCATION} | bool | +| closure.rs:102:34:108:9 | { ... } | | {EXTERNAL LOCATION} | i32 | +| closure.rs:103:13:107:13 | if x {...} else {...} | | {EXTERNAL LOCATION} | i32 | +| closure.rs:103:16:103:16 | x | | {EXTERNAL LOCATION} | bool | +| closure.rs:103:18:105:13 | { ... } | | {EXTERNAL LOCATION} | i32 | +| closure.rs:104:17:104:17 | 1 | | {EXTERNAL LOCATION} | i32 | +| closure.rs:105:20:107:13 | { ... } | | {EXTERNAL LOCATION} | i32 | +| closure.rs:106:17:106:17 | 0 | | {EXTERNAL LOCATION} | i32 | +| closure.rs:109:13:109:14 | _r | | {EXTERNAL LOCATION} | i64 | +| closure.rs:109:18:109:31 | apply(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:109:24:109:24 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:109:24:109:24 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:109:24:109:24 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:109:24:109:24 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:109:27:109:30 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:111:13:111:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:111:13:111:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:111:13:111:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:111:17:111:25 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:111:17:111:25 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:111:17:111:25 | \|...\| ... | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:111:18:111:18 | x | | {EXTERNAL LOCATION} | i64 | +| closure.rs:111:21:111:21 | x | | {EXTERNAL LOCATION} | i64 | +| closure.rs:111:25:111:25 | 1 | | {EXTERNAL LOCATION} | i32 | +| closure.rs:112:13:112:15 | _r2 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:112:19:112:30 | apply_two(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:112:29:112:29 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:112:29:112:29 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:112:29:112:29 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:117:40:117:40 | f | | closure.rs:117:20:117:37 | F | +| closure.rs:117:46:119:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:118:13:118:19 | _return | | {EXTERNAL LOCATION} | i64 | +| closure.rs:118:23:118:23 | f | | closure.rs:117:20:117:37 | F | +| closure.rs:118:23:118:29 | f(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:118:24:118:29 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:118:24:118:29 | ArgList | T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:118:25:118:28 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:121:41:121:41 | f | | closure.rs:121:28:121:38 | F | +| closure.rs:121:47:123:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:122:13:122:19 | _return | | {EXTERNAL LOCATION} | () | +| closure.rs:122:23:122:23 | f | | closure.rs:121:28:121:38 | F | +| closure.rs:122:23:122:29 | f(...) | | {EXTERNAL LOCATION} | () | +| closure.rs:122:24:122:29 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:122:24:122:29 | ArgList | T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:122:25:122:28 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:125:42:125:42 | f | | closure.rs:125:22:125:39 | F | +| closure.rs:125:48:128:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:126:13:126:15 | arg | | {EXTERNAL LOCATION} | bool | +| closure.rs:126:19:126:36 | ...::default(...) | | {EXTERNAL LOCATION} | bool | +| closure.rs:127:9:127:9 | f | | closure.rs:125:22:125:39 | F | +| closure.rs:127:9:127:14 | f(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:127:10:127:14 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:127:10:127:14 | ArgList | T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:127:11:127:13 | arg | | {EXTERNAL LOCATION} | bool | +| closure.rs:130:35:130:35 | f | | closure.rs:130:20:130:32 | F | +| closure.rs:130:41:130:41 | a | | closure.rs:130:14:130:14 | A | +| closure.rs:130:52:132:5 | { ... } | | closure.rs:130:17:130:17 | B | +| closure.rs:131:9:131:9 | f | | closure.rs:130:20:130:32 | F | +| closure.rs:131:9:131:12 | f(...) | | closure.rs:130:17:130:17 | B | +| closure.rs:131:10:131:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:131:10:131:12 | ArgList | T0 | closure.rs:130:14:130:14 | A | +| closure.rs:131:11:131:11 | a | | closure.rs:130:14:130:14 | A | +| closure.rs:134:18:134:18 | f | | closure.rs:134:21:134:39 | impl ... | +| closure.rs:134:49:136:5 | { ... } | | {EXTERNAL LOCATION} | i64 | +| closure.rs:135:9:135:9 | f | | closure.rs:134:21:134:39 | impl ... | +| closure.rs:135:9:135:12 | f(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:135:10:135:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:135:10:135:12 | ArgList | T0 | {EXTERNAL LOCATION} | i32 | +| closure.rs:135:11:135:11 | 2 | | {EXTERNAL LOCATION} | i32 | +| closure.rs:138:15:150:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:139:13:139:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:139:13:139:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:139:13:139:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:139:13:139:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:139:17:145:9 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:139:17:145:9 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:139:17:145:9 | \|...\| ... | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:139:17:145:9 | \|...\| ... | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:139:18:139:18 | x | | {EXTERNAL LOCATION} | bool | +| closure.rs:139:34:145:9 | { ... } | | {EXTERNAL LOCATION} | i32 | +| closure.rs:140:13:144:13 | if x {...} else {...} | | {EXTERNAL LOCATION} | i32 | +| closure.rs:140:16:140:16 | x | | {EXTERNAL LOCATION} | bool | +| closure.rs:140:18:142:13 | { ... } | | {EXTERNAL LOCATION} | i32 | +| closure.rs:141:17:141:17 | 1 | | {EXTERNAL LOCATION} | i32 | +| closure.rs:142:20:144:13 | { ... } | | {EXTERNAL LOCATION} | i32 | +| closure.rs:143:17:143:17 | 0 | | {EXTERNAL LOCATION} | i32 | +| closure.rs:146:13:146:14 | _r | | {EXTERNAL LOCATION} | i64 | +| closure.rs:146:18:146:31 | apply(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:146:24:146:24 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:146:24:146:24 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:146:24:146:24 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | bool | +| closure.rs:146:24:146:24 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:146:27:146:30 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:148:13:148:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:148:13:148:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:148:13:148:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:148:17:148:25 | \|...\| ... | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:148:17:148:25 | \|...\| ... | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:148:17:148:25 | \|...\| ... | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:148:18:148:18 | x | | {EXTERNAL LOCATION} | i64 | +| closure.rs:148:21:148:21 | x | | {EXTERNAL LOCATION} | i64 | +| closure.rs:148:25:148:25 | 1 | | {EXTERNAL LOCATION} | i32 | +| closure.rs:149:13:149:15 | _r2 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:149:19:149:30 | apply_two(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:149:29:149:29 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:149:29:149:29 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:149:29:149:29 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:154:54:154:54 | f | | {EXTERNAL LOCATION} | Box | +| closure.rs:154:54:154:54 | f | A | {EXTERNAL LOCATION} | Global | +| closure.rs:154:54:154:54 | f | T | closure.rs:154:26:154:51 | F | +| closure.rs:154:65:154:67 | arg | | closure.rs:154:20:154:20 | A | +| closure.rs:154:78:156:5 | { ... } | | closure.rs:154:23:154:23 | B | +| closure.rs:155:9:155:9 | f | | {EXTERNAL LOCATION} | Box | +| closure.rs:155:9:155:9 | f | A | {EXTERNAL LOCATION} | Global | +| closure.rs:155:9:155:9 | f | T | closure.rs:154:26:154:51 | F | +| closure.rs:155:9:155:14 | f(...) | | closure.rs:154:23:154:23 | B | +| closure.rs:155:10:155:14 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:155:10:155:14 | ArgList | T0 | closure.rs:154:20:154:20 | A | +| closure.rs:155:11:155:13 | arg | | closure.rs:154:20:154:20 | A | +| closure.rs:158:30:158:30 | f | | {EXTERNAL LOCATION} | Box | +| closure.rs:158:30:158:30 | f | A | {EXTERNAL LOCATION} | Global | +| closure.rs:158:30:158:30 | f | T | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:158:30:158:30 | f | T.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:158:30:158:30 | f | T.dyn(Args).T0 | closure.rs:158:24:158:24 | A | +| closure.rs:158:30:158:30 | f | T.dyn(Output) | closure.rs:158:27:158:27 | B | +| closure.rs:158:58:158:60 | arg | | closure.rs:158:24:158:24 | A | +| closure.rs:158:66:161:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:159:13:159:15 | _r1 | | closure.rs:158:27:158:27 | B | +| closure.rs:159:19:159:37 | apply_boxed(...) | | closure.rs:158:27:158:27 | B | +| closure.rs:159:31:159:31 | f | | {EXTERNAL LOCATION} | Box | +| closure.rs:159:31:159:31 | f | A | {EXTERNAL LOCATION} | Global | +| closure.rs:159:31:159:31 | f | T | {EXTERNAL LOCATION} | dyn FnOnce | +| closure.rs:159:31:159:31 | f | T.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:159:31:159:31 | f | T.dyn(Args).T0 | closure.rs:158:24:158:24 | A | +| closure.rs:159:31:159:31 | f | T.dyn(Output) | closure.rs:158:27:158:27 | B | +| closure.rs:159:34:159:36 | arg | | closure.rs:158:24:158:24 | A | +| closure.rs:160:13:160:15 | _r2 | | {EXTERNAL LOCATION} | bool | +| closure.rs:160:19:160:57 | apply_boxed(...) | | {EXTERNAL LOCATION} | bool | +| closure.rs:160:31:160:53 | ...::new(...) | | {EXTERNAL LOCATION} | Box | +| closure.rs:160:31:160:53 | ...::new(...) | A | {EXTERNAL LOCATION} | Global | +| closure.rs:160:31:160:53 | ...::new(...) | T | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:160:31:160:53 | ...::new(...) | T.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:160:31:160:53 | ...::new(...) | T.dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:160:31:160:53 | ...::new(...) | T.dyn(Output) | {EXTERNAL LOCATION} | bool | +| closure.rs:160:40:160:52 | \|...\| true | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:160:40:160:52 | \|...\| true | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:160:40:160:52 | \|...\| true | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:160:40:160:52 | \|...\| true | dyn(Output) | {EXTERNAL LOCATION} | bool | +| closure.rs:160:41:160:41 | _ | | {EXTERNAL LOCATION} | i64 | +| closure.rs:160:49:160:52 | true | | {EXTERNAL LOCATION} | bool | +| closure.rs:160:56:160:56 | 3 | | {EXTERNAL LOCATION} | i32 | +| closure.rs:165:34:165:34 | f | | closure.rs:165:15:165:31 | F | +| closure.rs:165:40:165:40 | a | | {EXTERNAL LOCATION} | i64 | +| closure.rs:165:55:167:5 | { ... } | | {EXTERNAL LOCATION} | i64 | +| closure.rs:166:9:166:9 | f | | closure.rs:165:15:165:31 | F | | closure.rs:166:9:166:12 | f(...) | | {EXTERNAL LOCATION} | i64 | | closure.rs:166:10:166:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | | closure.rs:166:10:166:12 | ArgList | T0 | {EXTERNAL LOCATION} | i64 | | closure.rs:166:11:166:11 | a | | {EXTERNAL LOCATION} | i64 | -| closure.rs:169:41:169:41 | f | | closure.rs:169:15:169:34 | F | -| closure.rs:169:47:169:47 | a | | {EXTERNAL LOCATION} | i64 | -| closure.rs:169:62:171:5 | { ... } | | {EXTERNAL LOCATION} | i64 | -| closure.rs:170:9:170:9 | f | | closure.rs:169:15:169:34 | F | +| closure.rs:169:15:169:15 | f | | closure.rs:169:18:169:36 | impl ... | +| closure.rs:169:39:169:39 | a | | {EXTERNAL LOCATION} | i64 | +| closure.rs:169:54:171:5 | { ... } | | {EXTERNAL LOCATION} | i64 | +| closure.rs:170:9:170:9 | f | | closure.rs:169:18:169:36 | impl ... | | closure.rs:170:9:170:12 | f(...) | | {EXTERNAL LOCATION} | i64 | | closure.rs:170:10:170:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | | closure.rs:170:10:170:12 | ArgList | T0 | {EXTERNAL LOCATION} | i64 | | closure.rs:170:11:170:11 | a | | {EXTERNAL LOCATION} | i64 | -| closure.rs:173:15:173:15 | f | | {EXTERNAL LOCATION} | &mut | -| closure.rs:173:15:173:15 | f | TRefMut | {EXTERNAL LOCATION} | dyn FnMut | -| closure.rs:173:15:173:15 | f | TRefMut.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:173:15:173:15 | f | TRefMut.dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:173:15:173:15 | f | TRefMut.dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:173:46:173:46 | a | | {EXTERNAL LOCATION} | i64 | -| closure.rs:173:61:175:5 | { ... } | | {EXTERNAL LOCATION} | i64 | -| closure.rs:174:9:174:9 | f | | {EXTERNAL LOCATION} | &mut | -| closure.rs:174:9:174:9 | f | TRefMut | {EXTERNAL LOCATION} | dyn FnMut | -| closure.rs:174:9:174:9 | f | TRefMut.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:174:9:174:9 | f | TRefMut.dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:174:9:174:9 | f | TRefMut.dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:173:15:173:15 | f | | {EXTERNAL LOCATION} | & | +| closure.rs:173:15:173:15 | f | TRef | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:173:15:173:15 | f | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:173:15:173:15 | f | TRef.dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:173:15:173:15 | f | TRef.dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:173:39:173:39 | a | | {EXTERNAL LOCATION} | i64 | +| closure.rs:173:54:175:5 | { ... } | | {EXTERNAL LOCATION} | i64 | +| closure.rs:174:9:174:9 | f | | {EXTERNAL LOCATION} | & | +| closure.rs:174:9:174:9 | f | TRef | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:174:9:174:9 | f | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:174:9:174:9 | f | TRef.dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:174:9:174:9 | f | TRef.dyn(Output) | {EXTERNAL LOCATION} | i64 | | closure.rs:174:9:174:12 | f(...) | | {EXTERNAL LOCATION} | i64 | | closure.rs:174:10:174:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | | closure.rs:174:10:174:12 | ArgList | T0 | {EXTERNAL LOCATION} | i64 | | closure.rs:174:11:174:11 | a | | {EXTERNAL LOCATION} | i64 | -| closure.rs:177:18:177:18 | f | | closure.rs:177:21:177:37 | impl ... | -| closure.rs:177:40:177:40 | a | | closure.rs:177:15:177:15 | T | -| closure.rs:177:53:179:5 | { ... } | | {EXTERNAL LOCATION} | i64 | -| closure.rs:178:9:178:9 | f | | closure.rs:177:21:177:37 | impl ... | +| closure.rs:177:41:177:41 | f | | closure.rs:177:15:177:34 | F | +| closure.rs:177:47:177:47 | a | | {EXTERNAL LOCATION} | i64 | +| closure.rs:177:62:179:5 | { ... } | | {EXTERNAL LOCATION} | i64 | +| closure.rs:178:9:178:9 | f | | closure.rs:177:15:177:34 | F | | closure.rs:178:9:178:12 | f(...) | | {EXTERNAL LOCATION} | i64 | | closure.rs:178:10:178:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:178:10:178:12 | ArgList | T0 | closure.rs:177:15:177:15 | T | -| closure.rs:178:11:178:11 | a | | closure.rs:177:15:177:15 | T | -| closure.rs:181:42:181:42 | f | | closure.rs:181:18:181:35 | F | -| closure.rs:181:48:181:48 | a | | closure.rs:181:15:181:15 | T | +| closure.rs:178:10:178:12 | ArgList | T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:178:11:178:11 | a | | {EXTERNAL LOCATION} | i64 | +| closure.rs:181:15:181:15 | f | | {EXTERNAL LOCATION} | &mut | +| closure.rs:181:15:181:15 | f | TRefMut | {EXTERNAL LOCATION} | dyn FnMut | +| closure.rs:181:15:181:15 | f | TRefMut.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:181:15:181:15 | f | TRefMut.dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:181:15:181:15 | f | TRefMut.dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:181:46:181:46 | a | | {EXTERNAL LOCATION} | i64 | | closure.rs:181:61:183:5 | { ... } | | {EXTERNAL LOCATION} | i64 | -| closure.rs:182:9:182:9 | f | | closure.rs:181:18:181:35 | F | +| closure.rs:182:9:182:9 | f | | {EXTERNAL LOCATION} | &mut | +| closure.rs:182:9:182:9 | f | TRefMut | {EXTERNAL LOCATION} | dyn FnMut | +| closure.rs:182:9:182:9 | f | TRefMut.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:182:9:182:9 | f | TRefMut.dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:182:9:182:9 | f | TRefMut.dyn(Output) | {EXTERNAL LOCATION} | i64 | | closure.rs:182:9:182:12 | f(...) | | {EXTERNAL LOCATION} | i64 | | closure.rs:182:10:182:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:182:10:182:12 | ArgList | T0 | closure.rs:181:15:181:15 | T | -| closure.rs:182:11:182:11 | a | | closure.rs:181:15:181:15 | T | -| closure.rs:185:15:206:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:186:13:186:13 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:186:13:186:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:186:13:186:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:186:13:186:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:186:17:186:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:186:17:186:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:186:17:186:21 | \|...\| x | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:186:17:186:21 | \|...\| x | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:186:18:186:18 | x | | {EXTERNAL LOCATION} | i64 | -| closure.rs:186:21:186:21 | x | | {EXTERNAL LOCATION} | i64 | -| closure.rs:187:13:187:14 | _r | | {EXTERNAL LOCATION} | i64 | -| closure.rs:187:18:187:32 | apply1(...) | | {EXTERNAL LOCATION} | i64 | -| closure.rs:187:25:187:25 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:187:25:187:25 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:187:25:187:25 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:187:25:187:25 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:187:28:187:31 | 1i64 | | {EXTERNAL LOCATION} | i64 | -| closure.rs:189:13:189:13 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:189:13:189:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:189:13:189:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:189:13:189:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:189:17:189:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:189:17:189:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:189:17:189:21 | \|...\| x | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:189:17:189:21 | \|...\| x | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:189:18:189:18 | x | | {EXTERNAL LOCATION} | i64 | -| closure.rs:189:21:189:21 | x | | {EXTERNAL LOCATION} | i64 | -| closure.rs:190:13:190:14 | _r | | {EXTERNAL LOCATION} | i64 | -| closure.rs:190:18:190:32 | apply2(...) | | {EXTERNAL LOCATION} | i64 | -| closure.rs:190:25:190:25 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:190:25:190:25 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:190:25:190:25 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:190:25:190:25 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:190:28:190:31 | 2i64 | | {EXTERNAL LOCATION} | i64 | -| closure.rs:192:13:192:13 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:192:13:192:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:192:13:192:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:192:13:192:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:192:17:192:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:192:17:192:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:192:17:192:21 | \|...\| x | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:192:17:192:21 | \|...\| x | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:192:18:192:18 | x | | {EXTERNAL LOCATION} | i64 | -| closure.rs:192:21:192:21 | x | | {EXTERNAL LOCATION} | i64 | -| closure.rs:193:13:193:14 | _r | | {EXTERNAL LOCATION} | i64 | -| closure.rs:193:18:193:33 | apply3(...) | | {EXTERNAL LOCATION} | i64 | -| closure.rs:193:25:193:26 | &f | | {EXTERNAL LOCATION} | & | -| closure.rs:193:25:193:26 | &f | TRef | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:193:25:193:26 | &f | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:193:25:193:26 | &f | TRef.dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:193:25:193:26 | &f | TRef.dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:193:26:193:26 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:193:26:193:26 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:193:26:193:26 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:193:26:193:26 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:193:29:193:32 | 3i64 | | {EXTERNAL LOCATION} | i64 | -| closure.rs:195:13:195:13 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:195:13:195:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:195:13:195:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:195:13:195:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:195:17:195:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:195:17:195:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:195:17:195:21 | \|...\| x | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:195:17:195:21 | \|...\| x | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:195:18:195:18 | x | | {EXTERNAL LOCATION} | i64 | -| closure.rs:195:21:195:21 | x | | {EXTERNAL LOCATION} | i64 | -| closure.rs:196:13:196:14 | _r | | {EXTERNAL LOCATION} | i64 | -| closure.rs:196:18:196:32 | apply4(...) | | {EXTERNAL LOCATION} | i64 | -| closure.rs:196:25:196:25 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:196:25:196:25 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:196:25:196:25 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:196:25:196:25 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:196:28:196:31 | 4i64 | | {EXTERNAL LOCATION} | i64 | -| closure.rs:198:17:198:17 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:198:17:198:17 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:198:21:198:25 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:198:21:198:25 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:199:13:199:14 | _r | | {EXTERNAL LOCATION} | i64 | -| closure.rs:199:18:199:37 | apply5(...) | | {EXTERNAL LOCATION} | i64 | -| closure.rs:199:25:199:30 | &mut f | | {EXTERNAL LOCATION} | &mut | -| closure.rs:199:25:199:30 | &mut f | TRefMut | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:199:25:199:30 | &mut f | TRefMut.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:199:30:199:30 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:199:30:199:30 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:199:33:199:36 | 5i64 | | {EXTERNAL LOCATION} | i64 | -| closure.rs:201:13:201:13 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:201:13:201:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:201:13:201:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:201:13:201:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:201:17:201:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:201:17:201:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:201:17:201:21 | \|...\| x | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:201:17:201:21 | \|...\| x | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:201:18:201:18 | x | | {EXTERNAL LOCATION} | i64 | -| closure.rs:201:21:201:21 | x | | {EXTERNAL LOCATION} | i64 | -| closure.rs:202:13:202:14 | _r | | {EXTERNAL LOCATION} | i64 | -| closure.rs:202:18:202:32 | apply6(...) | | {EXTERNAL LOCATION} | i64 | -| closure.rs:202:25:202:25 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:202:25:202:25 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:202:25:202:25 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:202:25:202:25 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:202:28:202:31 | 6i64 | | {EXTERNAL LOCATION} | i64 | -| closure.rs:204:13:204:13 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:204:13:204:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:204:13:204:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:204:13:204:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:204:17:204:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:204:17:204:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:204:17:204:21 | \|...\| x | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:204:17:204:21 | \|...\| x | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:204:18:204:18 | x | | {EXTERNAL LOCATION} | i64 | -| closure.rs:204:21:204:21 | x | | {EXTERNAL LOCATION} | i64 | -| closure.rs:205:13:205:14 | _r | | {EXTERNAL LOCATION} | i64 | -| closure.rs:205:18:205:32 | apply7(...) | | {EXTERNAL LOCATION} | i64 | -| closure.rs:205:25:205:25 | f | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:205:25:205:25 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:205:25:205:25 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:205:25:205:25 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | -| closure.rs:205:28:205:31 | 7i64 | | {EXTERNAL LOCATION} | i64 | -| closure.rs:217:18:217:22 | SelfParam | | {EXTERNAL LOCATION} | & | -| closure.rs:217:18:217:22 | SelfParam | TRef | closure.rs:212:5:212:19 | S | -| closure.rs:217:18:217:22 | SelfParam | TRef.T | closure.rs:214:10:214:10 | T | -| closure.rs:217:42:219:9 | { ... } | | {EXTERNAL LOCATION} | & | -| closure.rs:217:42:219:9 | { ... } | TRef | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:217:42:219:9 | { ... } | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:217:42:219:9 | { ... } | TRef.dyn(Args).T0 | closure.rs:214:10:214:10 | T | -| closure.rs:217:42:219:9 | { ... } | TRef.dyn(Output) | {EXTERNAL LOCATION} | bool | -| closure.rs:218:13:218:22 | &... | | {EXTERNAL LOCATION} | & | -| closure.rs:218:13:218:22 | &... | TRef | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:218:13:218:22 | &... | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:218:13:218:22 | &... | TRef.dyn(Args).T0 | closure.rs:214:10:214:10 | T | -| closure.rs:218:13:218:22 | &... | TRef.dyn(Output) | {EXTERNAL LOCATION} | bool | -| closure.rs:218:14:218:22 | \|...\| false | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:218:14:218:22 | \|...\| false | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:218:14:218:22 | \|...\| false | dyn(Args).T0 | closure.rs:214:10:214:10 | T | -| closure.rs:218:14:218:22 | \|...\| false | dyn(Output) | {EXTERNAL LOCATION} | bool | -| closure.rs:218:15:218:15 | _ | | closure.rs:214:10:214:10 | T | -| closure.rs:218:18:218:22 | false | | {EXTERNAL LOCATION} | bool | -| closure.rs:222:19:248:5 | { ... } | | {EXTERNAL LOCATION} | () | -| closure.rs:223:13:223:13 | x | | {EXTERNAL LOCATION} | i64 | -| closure.rs:223:17:223:20 | 0i64 | | {EXTERNAL LOCATION} | i64 | -| closure.rs:224:13:224:13 | v | | {EXTERNAL LOCATION} | i64 | -| closure.rs:224:17:224:34 | ...::default(...) | | {EXTERNAL LOCATION} | i64 | -| closure.rs:225:13:225:13 | s | | closure.rs:212:5:212:19 | S | -| closure.rs:225:13:225:13 | s | T | {EXTERNAL LOCATION} | i64 | -| closure.rs:225:17:225:20 | S(...) | | closure.rs:212:5:212:19 | S | -| closure.rs:225:17:225:20 | S(...) | T | {EXTERNAL LOCATION} | i64 | -| closure.rs:225:19:225:19 | v | | {EXTERNAL LOCATION} | i64 | -| closure.rs:226:13:226:16 | _ret | | {EXTERNAL LOCATION} | bool | -| closure.rs:226:20:226:20 | s | | closure.rs:212:5:212:19 | S | -| closure.rs:226:20:226:20 | s | T | {EXTERNAL LOCATION} | i64 | -| closure.rs:226:20:226:23 | s(...) | | {EXTERNAL LOCATION} | bool | -| closure.rs:226:21:226:23 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:226:21:226:23 | ArgList | T0 | {EXTERNAL LOCATION} | i64 | -| closure.rs:226:22:226:22 | x | | {EXTERNAL LOCATION} | i64 | -| closure.rs:228:13:228:13 | x | | {EXTERNAL LOCATION} | i32 | -| closure.rs:228:17:228:20 | 0i32 | | {EXTERNAL LOCATION} | i32 | -| closure.rs:229:13:229:13 | v | | {EXTERNAL LOCATION} | i32 | -| closure.rs:229:17:229:34 | ...::default(...) | | {EXTERNAL LOCATION} | i32 | -| closure.rs:230:13:230:13 | s | | closure.rs:212:5:212:19 | S | -| closure.rs:230:13:230:13 | s | T | {EXTERNAL LOCATION} | i32 | -| closure.rs:230:17:230:20 | S(...) | | closure.rs:212:5:212:19 | S | -| closure.rs:230:17:230:20 | S(...) | T | {EXTERNAL LOCATION} | i32 | -| closure.rs:230:19:230:19 | v | | {EXTERNAL LOCATION} | i32 | -| closure.rs:231:13:231:16 | _ret | | {EXTERNAL LOCATION} | bool | -| closure.rs:231:20:231:20 | s | | closure.rs:212:5:212:19 | S | -| closure.rs:231:20:231:20 | s | T | {EXTERNAL LOCATION} | i32 | -| closure.rs:231:20:231:23 | s(...) | | {EXTERNAL LOCATION} | bool | -| closure.rs:231:21:231:23 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:231:21:231:23 | ArgList | T0 | {EXTERNAL LOCATION} | i32 | -| closure.rs:231:22:231:22 | x | | {EXTERNAL LOCATION} | i32 | -| closure.rs:232:13:232:17 | s_ref | | {EXTERNAL LOCATION} | & | -| closure.rs:232:13:232:17 | s_ref | TRef | closure.rs:212:5:212:19 | S | -| closure.rs:232:13:232:17 | s_ref | TRef.T | {EXTERNAL LOCATION} | i32 | -| closure.rs:232:21:232:22 | &s | | {EXTERNAL LOCATION} | & | -| closure.rs:232:21:232:22 | &s | TRef | closure.rs:212:5:212:19 | S | -| closure.rs:232:21:232:22 | &s | TRef.T | {EXTERNAL LOCATION} | i32 | -| closure.rs:232:22:232:22 | s | | closure.rs:212:5:212:19 | S | -| closure.rs:232:22:232:22 | s | T | {EXTERNAL LOCATION} | i32 | -| closure.rs:240:20:240:24 | s_ref | | {EXTERNAL LOCATION} | & | -| closure.rs:240:20:240:24 | s_ref | TRef | closure.rs:212:5:212:19 | S | -| closure.rs:240:20:240:24 | s_ref | TRef.T | {EXTERNAL LOCATION} | i32 | -| closure.rs:240:25:240:27 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:240:25:240:27 | ArgList | T0 | {EXTERNAL LOCATION} | i32 | -| closure.rs:240:26:240:26 | x | | {EXTERNAL LOCATION} | i32 | -| closure.rs:246:13:246:13 | c | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:246:13:246:13 | c | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:246:13:246:13 | c | dyn(Args).T0 | {EXTERNAL LOCATION} | i32 | -| closure.rs:246:13:246:13 | c | dyn(Output) | {EXTERNAL LOCATION} | i32 | -| closure.rs:246:17:246:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:246:17:246:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:246:17:246:21 | \|...\| x | dyn(Args).T0 | {EXTERNAL LOCATION} | i32 | -| closure.rs:246:17:246:21 | \|...\| x | dyn(Output) | {EXTERNAL LOCATION} | i32 | -| closure.rs:246:18:246:18 | x | | {EXTERNAL LOCATION} | i32 | -| closure.rs:246:21:246:21 | x | | {EXTERNAL LOCATION} | i32 | -| closure.rs:247:9:247:12 | (...) | | {EXTERNAL LOCATION} | & | -| closure.rs:247:9:247:12 | (...) | TRef | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:247:9:247:12 | (...) | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:247:9:247:12 | (...) | TRef.dyn(Args).T0 | {EXTERNAL LOCATION} | i32 | -| closure.rs:247:9:247:12 | (...) | TRef.dyn(Output) | {EXTERNAL LOCATION} | i32 | -| closure.rs:247:9:247:15 | ...(...) | | {EXTERNAL LOCATION} | i32 | -| closure.rs:247:10:247:11 | &c | | {EXTERNAL LOCATION} | & | -| closure.rs:247:10:247:11 | &c | TRef | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:247:10:247:11 | &c | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:247:10:247:11 | &c | TRef.dyn(Args).T0 | {EXTERNAL LOCATION} | i32 | -| closure.rs:247:10:247:11 | &c | TRef.dyn(Output) | {EXTERNAL LOCATION} | i32 | -| closure.rs:247:11:247:11 | c | | {EXTERNAL LOCATION} | dyn Fn | -| closure.rs:247:11:247:11 | c | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:247:11:247:11 | c | dyn(Args).T0 | {EXTERNAL LOCATION} | i32 | -| closure.rs:247:11:247:11 | c | dyn(Output) | {EXTERNAL LOCATION} | i32 | -| closure.rs:247:13:247:15 | ArgList | | {EXTERNAL LOCATION} | (T_1) | -| closure.rs:247:13:247:15 | ArgList | T0 | {EXTERNAL LOCATION} | i32 | -| closure.rs:247:14:247:14 | x | | {EXTERNAL LOCATION} | i32 | +| closure.rs:182:10:182:12 | ArgList | T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:182:11:182:11 | a | | {EXTERNAL LOCATION} | i64 | +| closure.rs:185:18:185:18 | f | | closure.rs:185:21:185:37 | impl ... | +| closure.rs:185:40:185:40 | a | | closure.rs:185:15:185:15 | T | +| closure.rs:185:53:187:5 | { ... } | | {EXTERNAL LOCATION} | i64 | +| closure.rs:186:9:186:9 | f | | closure.rs:185:21:185:37 | impl ... | +| closure.rs:186:9:186:12 | f(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:186:10:186:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:186:10:186:12 | ArgList | T0 | closure.rs:185:15:185:15 | T | +| closure.rs:186:11:186:11 | a | | closure.rs:185:15:185:15 | T | +| closure.rs:189:42:189:42 | f | | closure.rs:189:18:189:35 | F | +| closure.rs:189:48:189:48 | a | | closure.rs:189:15:189:15 | T | +| closure.rs:189:61:191:5 | { ... } | | {EXTERNAL LOCATION} | i64 | +| closure.rs:190:9:190:9 | f | | closure.rs:189:18:189:35 | F | +| closure.rs:190:9:190:12 | f(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:190:10:190:12 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:190:10:190:12 | ArgList | T0 | closure.rs:189:15:189:15 | T | +| closure.rs:190:11:190:11 | a | | closure.rs:189:15:189:15 | T | +| closure.rs:193:15:214:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:194:13:194:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:194:13:194:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:194:13:194:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:194:13:194:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:194:17:194:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:194:17:194:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:194:17:194:21 | \|...\| x | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:194:17:194:21 | \|...\| x | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:194:18:194:18 | x | | {EXTERNAL LOCATION} | i64 | +| closure.rs:194:21:194:21 | x | | {EXTERNAL LOCATION} | i64 | +| closure.rs:195:13:195:14 | _r | | {EXTERNAL LOCATION} | i64 | +| closure.rs:195:18:195:32 | apply1(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:195:25:195:25 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:195:25:195:25 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:195:25:195:25 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:195:25:195:25 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:195:28:195:31 | 1i64 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:197:13:197:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:197:13:197:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:197:13:197:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:197:13:197:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:197:17:197:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:197:17:197:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:197:17:197:21 | \|...\| x | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:197:17:197:21 | \|...\| x | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:197:18:197:18 | x | | {EXTERNAL LOCATION} | i64 | +| closure.rs:197:21:197:21 | x | | {EXTERNAL LOCATION} | i64 | +| closure.rs:198:13:198:14 | _r | | {EXTERNAL LOCATION} | i64 | +| closure.rs:198:18:198:32 | apply2(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:198:25:198:25 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:198:25:198:25 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:198:25:198:25 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:198:25:198:25 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:198:28:198:31 | 2i64 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:200:13:200:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:200:13:200:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:200:13:200:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:200:13:200:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:200:17:200:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:200:17:200:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:200:17:200:21 | \|...\| x | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:200:17:200:21 | \|...\| x | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:200:18:200:18 | x | | {EXTERNAL LOCATION} | i64 | +| closure.rs:200:21:200:21 | x | | {EXTERNAL LOCATION} | i64 | +| closure.rs:201:13:201:14 | _r | | {EXTERNAL LOCATION} | i64 | +| closure.rs:201:18:201:33 | apply3(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:201:25:201:26 | &f | | {EXTERNAL LOCATION} | & | +| closure.rs:201:25:201:26 | &f | TRef | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:201:25:201:26 | &f | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:201:25:201:26 | &f | TRef.dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:201:25:201:26 | &f | TRef.dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:201:26:201:26 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:201:26:201:26 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:201:26:201:26 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:201:26:201:26 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:201:29:201:32 | 3i64 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:203:13:203:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:203:13:203:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:203:13:203:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:203:13:203:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:203:17:203:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:203:17:203:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:203:17:203:21 | \|...\| x | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:203:17:203:21 | \|...\| x | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:203:18:203:18 | x | | {EXTERNAL LOCATION} | i64 | +| closure.rs:203:21:203:21 | x | | {EXTERNAL LOCATION} | i64 | +| closure.rs:204:13:204:14 | _r | | {EXTERNAL LOCATION} | i64 | +| closure.rs:204:18:204:32 | apply4(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:204:25:204:25 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:204:25:204:25 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:204:25:204:25 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:204:25:204:25 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:204:28:204:31 | 4i64 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:206:17:206:17 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:206:17:206:17 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:206:21:206:25 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:206:21:206:25 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:207:13:207:14 | _r | | {EXTERNAL LOCATION} | i64 | +| closure.rs:207:18:207:37 | apply5(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:207:25:207:30 | &mut f | | {EXTERNAL LOCATION} | &mut | +| closure.rs:207:25:207:30 | &mut f | TRefMut | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:207:25:207:30 | &mut f | TRefMut.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:207:30:207:30 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:207:30:207:30 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:207:33:207:36 | 5i64 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:209:13:209:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:209:13:209:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:209:13:209:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:209:13:209:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:209:17:209:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:209:17:209:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:209:17:209:21 | \|...\| x | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:209:17:209:21 | \|...\| x | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:209:18:209:18 | x | | {EXTERNAL LOCATION} | i64 | +| closure.rs:209:21:209:21 | x | | {EXTERNAL LOCATION} | i64 | +| closure.rs:210:13:210:14 | _r | | {EXTERNAL LOCATION} | i64 | +| closure.rs:210:18:210:32 | apply6(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:210:25:210:25 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:210:25:210:25 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:210:25:210:25 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:210:25:210:25 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:210:28:210:31 | 6i64 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:212:13:212:13 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:212:13:212:13 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:212:13:212:13 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:212:13:212:13 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:212:17:212:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:212:17:212:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:212:17:212:21 | \|...\| x | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:212:17:212:21 | \|...\| x | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:212:18:212:18 | x | | {EXTERNAL LOCATION} | i64 | +| closure.rs:212:21:212:21 | x | | {EXTERNAL LOCATION} | i64 | +| closure.rs:213:13:213:14 | _r | | {EXTERNAL LOCATION} | i64 | +| closure.rs:213:18:213:32 | apply7(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:213:25:213:25 | f | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:213:25:213:25 | f | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:213:25:213:25 | f | dyn(Args).T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:213:25:213:25 | f | dyn(Output) | {EXTERNAL LOCATION} | i64 | +| closure.rs:213:28:213:31 | 7i64 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:225:18:225:22 | SelfParam | | {EXTERNAL LOCATION} | & | +| closure.rs:225:18:225:22 | SelfParam | TRef | closure.rs:220:5:220:19 | S | +| closure.rs:225:18:225:22 | SelfParam | TRef.T | closure.rs:222:10:222:10 | T | +| closure.rs:225:42:227:9 | { ... } | | {EXTERNAL LOCATION} | & | +| closure.rs:225:42:227:9 | { ... } | TRef | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:225:42:227:9 | { ... } | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:225:42:227:9 | { ... } | TRef.dyn(Args).T0 | closure.rs:222:10:222:10 | T | +| closure.rs:225:42:227:9 | { ... } | TRef.dyn(Output) | {EXTERNAL LOCATION} | bool | +| closure.rs:226:13:226:22 | &... | | {EXTERNAL LOCATION} | & | +| closure.rs:226:13:226:22 | &... | TRef | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:226:13:226:22 | &... | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:226:13:226:22 | &... | TRef.dyn(Args).T0 | closure.rs:222:10:222:10 | T | +| closure.rs:226:13:226:22 | &... | TRef.dyn(Output) | {EXTERNAL LOCATION} | bool | +| closure.rs:226:14:226:22 | \|...\| false | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:226:14:226:22 | \|...\| false | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:226:14:226:22 | \|...\| false | dyn(Args).T0 | closure.rs:222:10:222:10 | T | +| closure.rs:226:14:226:22 | \|...\| false | dyn(Output) | {EXTERNAL LOCATION} | bool | +| closure.rs:226:15:226:15 | _ | | closure.rs:222:10:222:10 | T | +| closure.rs:226:18:226:22 | false | | {EXTERNAL LOCATION} | bool | +| closure.rs:230:19:256:5 | { ... } | | {EXTERNAL LOCATION} | () | +| closure.rs:231:13:231:13 | x | | {EXTERNAL LOCATION} | i64 | +| closure.rs:231:17:231:20 | 0i64 | | {EXTERNAL LOCATION} | i64 | +| closure.rs:232:13:232:13 | v | | {EXTERNAL LOCATION} | i64 | +| closure.rs:232:17:232:34 | ...::default(...) | | {EXTERNAL LOCATION} | i64 | +| closure.rs:233:13:233:13 | s | | closure.rs:220:5:220:19 | S | +| closure.rs:233:13:233:13 | s | T | {EXTERNAL LOCATION} | i64 | +| closure.rs:233:17:233:20 | S(...) | | closure.rs:220:5:220:19 | S | +| closure.rs:233:17:233:20 | S(...) | T | {EXTERNAL LOCATION} | i64 | +| closure.rs:233:19:233:19 | v | | {EXTERNAL LOCATION} | i64 | +| closure.rs:234:13:234:16 | _ret | | {EXTERNAL LOCATION} | bool | +| closure.rs:234:20:234:20 | s | | closure.rs:220:5:220:19 | S | +| closure.rs:234:20:234:20 | s | T | {EXTERNAL LOCATION} | i64 | +| closure.rs:234:20:234:23 | s(...) | | {EXTERNAL LOCATION} | bool | +| closure.rs:234:21:234:23 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:234:21:234:23 | ArgList | T0 | {EXTERNAL LOCATION} | i64 | +| closure.rs:234:22:234:22 | x | | {EXTERNAL LOCATION} | i64 | +| closure.rs:236:13:236:13 | x | | {EXTERNAL LOCATION} | i32 | +| closure.rs:236:17:236:20 | 0i32 | | {EXTERNAL LOCATION} | i32 | +| closure.rs:237:13:237:13 | v | | {EXTERNAL LOCATION} | i32 | +| closure.rs:237:17:237:34 | ...::default(...) | | {EXTERNAL LOCATION} | i32 | +| closure.rs:238:13:238:13 | s | | closure.rs:220:5:220:19 | S | +| closure.rs:238:13:238:13 | s | T | {EXTERNAL LOCATION} | i32 | +| closure.rs:238:17:238:20 | S(...) | | closure.rs:220:5:220:19 | S | +| closure.rs:238:17:238:20 | S(...) | T | {EXTERNAL LOCATION} | i32 | +| closure.rs:238:19:238:19 | v | | {EXTERNAL LOCATION} | i32 | +| closure.rs:239:13:239:16 | _ret | | {EXTERNAL LOCATION} | bool | +| closure.rs:239:20:239:20 | s | | closure.rs:220:5:220:19 | S | +| closure.rs:239:20:239:20 | s | T | {EXTERNAL LOCATION} | i32 | +| closure.rs:239:20:239:23 | s(...) | | {EXTERNAL LOCATION} | bool | +| closure.rs:239:21:239:23 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:239:21:239:23 | ArgList | T0 | {EXTERNAL LOCATION} | i32 | +| closure.rs:239:22:239:22 | x | | {EXTERNAL LOCATION} | i32 | +| closure.rs:240:13:240:17 | s_ref | | {EXTERNAL LOCATION} | & | +| closure.rs:240:13:240:17 | s_ref | TRef | closure.rs:220:5:220:19 | S | +| closure.rs:240:13:240:17 | s_ref | TRef.T | {EXTERNAL LOCATION} | i32 | +| closure.rs:240:21:240:22 | &s | | {EXTERNAL LOCATION} | & | +| closure.rs:240:21:240:22 | &s | TRef | closure.rs:220:5:220:19 | S | +| closure.rs:240:21:240:22 | &s | TRef.T | {EXTERNAL LOCATION} | i32 | +| closure.rs:240:22:240:22 | s | | closure.rs:220:5:220:19 | S | +| closure.rs:240:22:240:22 | s | T | {EXTERNAL LOCATION} | i32 | +| closure.rs:248:20:248:24 | s_ref | | {EXTERNAL LOCATION} | & | +| closure.rs:248:20:248:24 | s_ref | TRef | closure.rs:220:5:220:19 | S | +| closure.rs:248:20:248:24 | s_ref | TRef.T | {EXTERNAL LOCATION} | i32 | +| closure.rs:248:25:248:27 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:248:25:248:27 | ArgList | T0 | {EXTERNAL LOCATION} | i32 | +| closure.rs:248:26:248:26 | x | | {EXTERNAL LOCATION} | i32 | +| closure.rs:254:13:254:13 | c | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:254:13:254:13 | c | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:254:13:254:13 | c | dyn(Args).T0 | {EXTERNAL LOCATION} | i32 | +| closure.rs:254:13:254:13 | c | dyn(Output) | {EXTERNAL LOCATION} | i32 | +| closure.rs:254:17:254:21 | \|...\| x | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:254:17:254:21 | \|...\| x | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:254:17:254:21 | \|...\| x | dyn(Args).T0 | {EXTERNAL LOCATION} | i32 | +| closure.rs:254:17:254:21 | \|...\| x | dyn(Output) | {EXTERNAL LOCATION} | i32 | +| closure.rs:254:18:254:18 | x | | {EXTERNAL LOCATION} | i32 | +| closure.rs:254:21:254:21 | x | | {EXTERNAL LOCATION} | i32 | +| closure.rs:255:9:255:12 | (...) | | {EXTERNAL LOCATION} | & | +| closure.rs:255:9:255:12 | (...) | TRef | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:255:9:255:12 | (...) | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:255:9:255:12 | (...) | TRef.dyn(Args).T0 | {EXTERNAL LOCATION} | i32 | +| closure.rs:255:9:255:12 | (...) | TRef.dyn(Output) | {EXTERNAL LOCATION} | i32 | +| closure.rs:255:9:255:15 | ...(...) | | {EXTERNAL LOCATION} | i32 | +| closure.rs:255:10:255:11 | &c | | {EXTERNAL LOCATION} | & | +| closure.rs:255:10:255:11 | &c | TRef | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:255:10:255:11 | &c | TRef.dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:255:10:255:11 | &c | TRef.dyn(Args).T0 | {EXTERNAL LOCATION} | i32 | +| closure.rs:255:10:255:11 | &c | TRef.dyn(Output) | {EXTERNAL LOCATION} | i32 | +| closure.rs:255:11:255:11 | c | | {EXTERNAL LOCATION} | dyn Fn | +| closure.rs:255:11:255:11 | c | dyn(Args) | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:255:11:255:11 | c | dyn(Args).T0 | {EXTERNAL LOCATION} | i32 | +| closure.rs:255:11:255:11 | c | dyn(Output) | {EXTERNAL LOCATION} | i32 | +| closure.rs:255:13:255:15 | ArgList | | {EXTERNAL LOCATION} | (T_1) | +| closure.rs:255:13:255:15 | ArgList | T0 | {EXTERNAL LOCATION} | i32 | +| closure.rs:255:14:255:14 | x | | {EXTERNAL LOCATION} | i32 | | dereference.rs:13:14:13:18 | SelfParam | | {EXTERNAL LOCATION} | & | | dereference.rs:13:14:13:18 | SelfParam | TRef | dereference.rs:5:1:7:1 | MyIntPointer | | dereference.rs:13:29:15:5 | { ... } | | {EXTERNAL LOCATION} | & | diff --git a/shared/typeinference/codeql/typeinference/internal/TypeInference.qll b/shared/typeinference/codeql/typeinference/internal/TypeInference.qll index 133b8a72e5aa..fc1b17c482b2 100644 --- a/shared/typeinference/codeql/typeinference/internal/TypeInference.qll +++ b/shared/typeinference/codeql/typeinference/internal/TypeInference.qll @@ -2403,13 +2403,13 @@ module Make1 Input1> { * * 1. `x` is assigned the pseudo type `T_x`, * 2. infer that the return type of `c` is `(T_x, bool)` and hence that `c` has type - * `Fn(...) -> (T_x, bool)`, + * `Fn(T_x) -> (T_x, bool)`, * 3. this enables us to detect that contextual inference is needed, so we also - * assign `c` the type `Fn(...) -> (UnknownType, bool)`, + * assign `c` the type `Fn(T_x) -> (UnknownType, bool)`, * 4. infer that `c(Default::default()).0` must have `UnknownType`, - * 5. infer, using contextual inference, that `c` has type `Fn(...) -> (i32, bool)`, + * 5. infer, using contextual inference, that `c` has type `Fn(T_x) -> (i32, bool)`, * and finally - * 6. since `c` also has type `Fn(...) -> (T_x, bool)`, we conclude that `x` has type + * 6. since `c` also has type `Fn(T_x) -> (T_x, bool)`, we conclude that `x` has type * `i32` and hence that `c` has type `Fn(i32) -> (i32, bool)`. * * Note that steps 2, 4, and 5 are standard inference steps. @@ -2439,7 +2439,8 @@ module Make1 Input1> { /** * Holds if `n1` having type `t` at `prefix1.suffix` implies that `n2` has type - * `t` at `prefix2.suffix`, for any `suffix`. + * `t` at `prefix2.suffix`, for any `suffix`. The converse should also hold, but + * only when `n1` already has an inferred type that matches `prefix1`. * * Use this predicate to implement any language-specific bottom-up inference logic. * @@ -3138,8 +3139,12 @@ module Make1 Input1> { } private module ClosureTyping { + /** + * Holds if `n` at `path` has a closure parameter pseudo type + * corresponding to closure parameter `p`. + */ pragma[nomagic] - private predicate hasClosureParameterPseudoType(AstNode n, Parameter p, TypePath path) { + private predicate hasClosureParameterPseudoType(AstNode n, TypePath path, Parameter p) { // use `inferTypeCand` to also detect propagation into enclosing closure p = inferTypeCand(n, path).(ClosureParameterPseudoType).getParameter() } @@ -3149,22 +3154,26 @@ module Make1 Input1> { hasClosureParameterPseudoType(n, _, _) } - pragma[nomagic] - private predicate hasTypeAt(AstNode n, TypePath path) { exists(inferType(n, path)) } - pragma[nomagic] private predicate hasTypeAtPrefix(AstNode n, TypePath prefix, TypePath path) { - hasTypeAt(n, path) and + hasInferredType(n, path) and hasClosureParameterPseudoType(n) and prefix = path.getAPrefix() } + /** + * Holds if `n` has a closure parameter pseudo type for the parameter + * with pattern `pattern` at `prefix`, where `path = prefix.suffix`. + * + * This means that the parameter pattern can be inferred to have type + * `t` at `suffix` when `n` also has inferred type `t` at `path`. + */ pragma[nomagic] - private predicate hasClosureParameterPseudoType( + private predicate hasClosureParameterPseudoTypeAtPrefix( AstNode n, TypePath path, AstNode pattern, TypePath suffix ) { exists(Parameter p, TypePath prefix | - hasClosureParameterPseudoType(n, p, prefix) and + hasClosureParameterPseudoType(n, prefix, p) and hasTypeAtPrefix(n, prefix, path) and path = prefix.appendInverse(suffix) and pattern = p.getPattern() @@ -3184,18 +3193,17 @@ module Make1 Input1> { // step 1 n = p.getPattern() and path.isEmpty() and - not exists(p.getType()) and result.(ClosureParameterPseudoType).getParameter() = p or // step 3 - hasClosureParameterPseudoType(c, p, path) and + hasClosureParameterPseudoType(c, path, p) and n = c and result instanceof UnknownType ) or // step 6 exists(AstNode n0, TypePath path0 | - hasClosureParameterPseudoType(n0, path0, n, path) and + hasClosureParameterPseudoTypeAtPrefix(n0, path0, n, path) and result = inferClosureParameterTypeCand(n0, path0) and not (path.isEmpty() and result instanceof UnknownType) ) @@ -3223,6 +3231,12 @@ module Make1 Input1> { } } + /** + * Gets an inferred candidate type of `n` at `path`. + * + * The type is only a candidate because it may later be filtered away, for + * example if it conflicts with certain type information. + */ private Type inferTypeCand(AstNode n, TypePath path) { result = Input3::inferTypeLanguageSpecific(n, path) or @@ -3288,6 +3302,12 @@ module Make1 Input1> { infersTypeAt(n, path, result.getATypeParameter()) } + /** + * Holds if `n` has type information at `path`. + */ + pragma[nomagic] + predicate hasInferredType(AstNode n, TypePath path) { exists(inferType(n, path)) } + /** * Holds if `n` has type information at the type path `prefix.tp`. This entails * that the type at `prefix` must be the type that declares `tp`. @@ -3295,7 +3315,7 @@ module Make1 Input1> { pragma[nomagic] private predicate infersTypeAt(AstNode n, TypePath prefix, TypeParameter tp) { exists(TypePath path | - exists(inferType(n, path)) and + hasInferredType(n, path) and not path.isEmpty() and // implied by `isSnoc` below, but improves performance slightly path.isSnoc(prefix, tp) ) @@ -3430,7 +3450,7 @@ module Make1 Input1> { pragma[nomagic] predicate atLimit(AstNode n) { exists(TypePath path0 | - exists(inferType(n, path0)) and path0.length() >= getTypePathLimit() + hasInferredType(n, path0) and path0.length() >= getTypePathLimit() ) } From edfe5f32142b72e8ec3945ce20804d5965f04bac Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Tue, 15 Sep 2026 09:15:58 +0200 Subject: [PATCH 0967/2098] Elaborate QL doc for `stepLanguageSpecific` --- .../typeinference/internal/TypeInference.qll | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/shared/typeinference/codeql/typeinference/internal/TypeInference.qll b/shared/typeinference/codeql/typeinference/internal/TypeInference.qll index fc1b17c482b2..399e5d818c87 100644 --- a/shared/typeinference/codeql/typeinference/internal/TypeInference.qll +++ b/shared/typeinference/codeql/typeinference/internal/TypeInference.qll @@ -2444,8 +2444,21 @@ module Make1 Input1> { * * Use this predicate to implement any language-specific bottom-up inference logic. * - * When contextual type information is needed at `n1`, this predicate may additionally - * be applied _reversely_ as well (see an example in the module documentation). + * For example, in Rust one may implement the following two rules for the `?` operator: + * + * ```text + * x : Option x : Result + * ----------------- -------------------- + * x? : T x? : T + * ``` + * + * The rules examplify how the converse only holds when `n1` already has an inferred type + * that matches `prefix1`; knowing that `x?` has type `i32` does not necessarily imply that + * `x` has type `Option` or `Result`, we can only conclude this if we know + * that `x` has root type `Option` or `Result`, respectively. + * + * When contextual type information is needed at `n1`, this predicate may be applied + * _reversely_ (see an example in the module documentation). */ predicate stepLanguageSpecific(AstNode n1, TypePath prefix1, AstNode n2, TypePath prefix2); From 212ceede37a629886eddef5ea7f0775f58c7abcd Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Tue, 15 Sep 2026 14:59:30 +0200 Subject: [PATCH 0968/2098] Rust: Do not infer any types for `!`-typed expressions --- .../lib/codeql/rust/internal/typeinference/TypeInference.qll | 3 --- rust/ql/lib/codeql/rust/internal/typeinference/TypeMention.qll | 2 +- .../test/library-tests/type-inference/type-inference.expected | 2 -- 3 files changed, 1 insertion(+), 6 deletions(-) diff --git a/rust/ql/lib/codeql/rust/internal/typeinference/TypeInference.qll b/rust/ql/lib/codeql/rust/internal/typeinference/TypeInference.qll index 4f1fd9a15cd1..d591c947e124 100644 --- a/rust/ql/lib/codeql/rust/internal/typeinference/TypeInference.qll +++ b/rust/ql/lib/codeql/rust/internal/typeinference/TypeInference.qll @@ -3094,9 +3094,6 @@ private module Input3 implements InputSig3 { ( n.(AssocFunctionResolution::AssocFunctionCall).resolutionDependsOnReturnType(path) or - path.isEmpty() and - isPanicMacroCall(n) - or n.(ArrayListExpr).getNumberOfExprs() = 0 and path = TypePath::singleton(getArrayTypeParameter()) ) diff --git a/rust/ql/lib/codeql/rust/internal/typeinference/TypeMention.qll b/rust/ql/lib/codeql/rust/internal/typeinference/TypeMention.qll index dd510de72e0e..b124e6405d87 100644 --- a/rust/ql/lib/codeql/rust/internal/typeinference/TypeMention.qll +++ b/rust/ql/lib/codeql/rust/internal/typeinference/TypeMention.qll @@ -678,7 +678,7 @@ private module MkTypeMention Date: Tue, 11 Aug 2026 14:13:47 +0100 Subject: [PATCH 0969/2098] Align old CFG node strings with shared library --- go/ql/lib/semmle/go/controlflow/IR.qll | 69 +- .../snippets/fieldwrite.expected | 2 +- .../example-tests/snippets/typeinfo.expected | 2 +- .../example-tests/snippets/varwrite.expected | 2 +- .../CONSISTENCY/DataFlowConsistency.expected | 8 +- .../CWE-285/PamAuthBypass.expected | 2 +- .../CONSISTENCY/DataFlowConsistency.expected | 6 +- .../CONSISTENCY/DataFlowConsistency.expected | 4 +- .../CONSISTENCY/DataFlowConsistency.expected | 18 +- .../CWE-369/DivideByZero.expected | 24 +- .../CONSISTENCY/DataFlowConsistency.expected | 70 +- .../DecompressionBombs.expected | 134 +- .../CWE-74/DsnInjectionLocal.expected | 14 +- .../CONSISTENCY/DataFlowConsistency.expected | 24 +- .../CONSISTENCY/DataFlowConsistency.expected | 12 +- .../CONSISTENCY/DataFlowConsistency.expected | 14 +- go/ql/test/experimental/CWE-918/SSRF.expected | 12 +- .../CONSISTENCY/DataFlowConsistency.expected | 28 +- .../CONSISTENCY/DataFlowConsistency.expected | 2 +- .../test/extractor-tests/go1.17/CFG.expected | 42 +- .../library-tests/semmle/go/IR/test.expected | 20 +- .../semmle/go/Scopes/EntityWrite.expected | 10 +- .../CONSISTENCY/DataFlowConsistency.expected | 16 +- .../go/concepts/Regexp/RegexpPattern.expected | 6 +- .../ControlFlowNode_getASuccessor.expected | 1228 ++++++++--------- .../CONSISTENCY/DataFlowConsistency.expected | 10 +- .../dataflow/ExternalTaintFlow/srcs.expected | 6 +- .../dataflow/ExternalTaintFlow/steps.expected | 4 +- .../dataflow/ExternalValueFlow/srcs.expected | 6 +- .../dataflow/ExternalValueFlow/steps.expected | 4 +- .../dataflow/FlowSteps/LocalFlowStep.expected | 202 +-- .../FlowSteps/LocalTaintStep.expected | 88 +- .../FunctionInput_getEntryNode.expected | 16 +- .../FunctionInput_getExitNode.expected | 2 +- .../FunctionOutput_getEntryNode.expected | 12 +- .../FunctionOutput_getExitNode.expected | 8 +- .../FunctionOutput_isResult_int.expected | 8 +- .../GlobalValueNumber.expected | 28 +- .../go/dataflow/HiddenNodes/test.expected | 6 +- .../Nodes/BinaryOperationNodes.expected | 2 +- .../Nodes/CallNode_getResult_int.expected | 4 +- .../go/dataflow/Nodes/ResultNode.expected | 4 +- .../go/dataflow/Nodes/resultParameters.go | 8 +- .../go/dataflow/PostUpdateNodes/test.expected | 6 +- .../PromotedFields/LocalFlowStep.expected | 128 +- .../ReadsAndWrites/readsElement.expected | 2 +- .../ReadsAndWrites/readsField.expected | 2 +- .../ReadsAndWrites/readsMethod.expected | 2 +- .../ReadsAndWrites/writesElement.expected | 6 +- .../ReadsAndWrites/writesField.expected | 6 +- .../semmle/go/dataflow/SSA/DefUse.expected | 38 +- .../go/dataflow/SSA/SsaDefinition.expected | 62 +- .../go/dataflow/SSA/SsaWithFields.expected | 62 +- .../semmle/go/dataflow/SSA/VarDefs.expected | 108 +- .../semmle/go/dataflow/SSA/VarUses.expected | 8 +- .../CONSISTENCY/DataFlowConsistency.expected | 2 +- .../CONSISTENCY/DataFlowConsistency.expected | 2 +- .../CONSISTENCY/DataFlowConsistency.expected | 22 +- .../go/frameworks/Beego/ReflectedXss.expected | 90 +- .../CONSISTENCY/DataFlowConsistency.expected | 2 +- .../CONSISTENCY/DataFlowConsistency.expected | 2 +- .../go/frameworks/Echo/ReflectedXss.expected | 42 +- .../CONSISTENCY/DataFlowConsistency.expected | 40 +- .../Fasthttp/RemoteFlowSources.expected | 8 + .../CONSISTENCY/DataFlowConsistency.expected | 8 +- .../semmle/go/frameworks/Gin/Gin.expected | 16 +- .../CONSISTENCY/DataFlowConsistency.expected | 18 +- .../frameworks/Gorestful/gorestful.expected | 12 +- .../CONSISTENCY/DataFlowConsistency.expected | 34 +- .../CONSISTENCY/DataFlowConsistency.expected | 220 +-- .../go/frameworks/Revel/OpenRedirect.expected | 10 +- .../semmle/go/frameworks/Revel/Revel.go | 2 +- .../CONSISTENCY/DataFlowConsistency.expected | 2 +- .../CONSISTENCY/DataFlowConsistency.expected | 4 +- .../frameworks/TaintSteps/TaintStep.expected | 64 +- .../CONSISTENCY/DataFlowConsistency.expected | 146 +- .../frameworks/Twirp/RequestForgery.expected | 6 +- .../CONSISTENCY/DataFlowConsistency.expected | 2 +- .../go/frameworks/WebSocket/Read.expected | 8 +- .../WebSocket/RemoteFlowSources.expected | 8 +- .../CONSISTENCY/DataFlowConsistency.expected | 18 +- .../frameworks/XNetHtml/ReflectedXss.expected | 44 +- .../frameworks/XNetHtml/SqlInjection.expected | 6 +- .../semmle/go/frameworks/Yaml/yaml.go | 6 +- .../security/SafeUrlFlow/SafeUrlFlow.expected | 6 +- .../MissingErrorCheck.expected | 4 +- .../UnhandledCloseWritableHandle.expected | 50 +- .../DeadStoreOfField.expected | 2 +- .../DeadStoreOfLocal.expected | 58 +- .../CONSISTENCY/DataFlowConsistency.expected | 8 +- .../CONSISTENCY/DataFlowConsistency.expected | 4 +- .../CONSISTENCY/DataFlowConsistency.expected | 2 +- .../Security/CWE-022/TaintedPath.expected | 6 +- .../Security/CWE-022/ZipSlip.expected | 46 +- .../CONSISTENCY/DataFlowConsistency.expected | 20 +- .../CWE-078/CommandInjection.expected | 16 +- .../Security/CWE-078/StoredCommand.expected | 6 +- .../CONSISTENCY/DataFlowConsistency.expected | 34 +- .../Security/CWE-079/ReflectedXss.expected | 46 +- .../Security/CWE-079/StoredXss.expected | 6 +- .../CONSISTENCY/DataFlowConsistency.expected | 30 +- .../Security/CWE-089/SqlInjection.expected | 36 +- .../Security/CWE-089/StringBreak.expected | 18 +- .../CONSISTENCY/DataFlowConsistency.expected | 20 +- .../CWE-190/AllocationSizeOverflow.expected | 52 +- .../CONSISTENCY/DataFlowConsistency.expected | 4 +- .../DisabledCertificateCheck.expected | 8 +- .../CONSISTENCY/DataFlowConsistency.expected | 40 +- .../CWE-312/CleartextLogging.expected | 172 +-- .../CWE-322/InsecureHostKeyCallback.expected | 4 +- .../CWE-327/BrokenCryptoAlgorithm.expected | 56 +- .../CONSISTENCY/DataFlowConsistency.expected | 4 +- .../CONSISTENCY/DataFlowConsistency.expected | 8 +- .../CWE-347/MissingJwtSignatureCheck.expected | 6 +- .../BadRedirectCheck.expected | 36 +- .../CONSISTENCY/DataFlowConsistency.expected | 4 +- .../CONSISTENCY/DataFlowConsistency.expected | 48 +- .../OpenUrlRedirect/OpenUrlRedirect.expected | 80 +- .../CONSISTENCY/DataFlowConsistency.expected | 2 +- .../CONSISTENCY/DataFlowConsistency.expected | 24 +- .../CONSISTENCY/DataFlowConsistency.expected | 10 +- .../UncontrolledAllocationSize.expected | 6 +- .../CONSISTENCY/DataFlowConsistency.expected | 8 +- .../Security/CWE-918/RequestForgery.expected | 6 +- 124 files changed, 2247 insertions(+), 2210 deletions(-) diff --git a/go/ql/lib/semmle/go/controlflow/IR.qll b/go/ql/lib/semmle/go/controlflow/IR.qll index a4c730041082..a47f9c9ff155 100644 --- a/go/ql/lib/semmle/go/controlflow/IR.qll +++ b/go/ql/lib/semmle/go/controlflow/IR.qll @@ -360,9 +360,9 @@ module IR { override ControlFlow::Root getRoot() { result.isRootOf(e) } - override string toString() { result = "implicit read of field " + field.toString() } + override string toString() { result = "implicit-field:" + index + " " + e } - override Location getLocation() { result = e.getBase().getLocation() } + override Location getLocation() { result = e.getLocation() } } /** @@ -482,7 +482,7 @@ module IR { override ControlFlow::Root getRoot() { result.isRootOf(elt) } - override string toString() { result = "init of " + elt } + override string toString() { result = "lit-init " + elt } override Location getLocation() { result = elt.getLocation() } } @@ -673,9 +673,9 @@ module IR { override ControlFlow::Root getRoot() { result.isRootOf(assgn) } - override string toString() { result = "assignment to " + this.getLhs() } + override string toString() { result = "assign:" + i + " " + assgn } - override Location getLocation() { result = this.getLhs().getLocation() } + override Location getLocation() { result = assgn.getLocation() } } /** An instruction computing the value of the right-hand side of a compound assignment. */ @@ -691,7 +691,7 @@ module IR { override ControlFlow::Root getRoot() { result.isRootOf(assgn) } - override string toString() { result = assgn.toString() } + override string toString() { result = "compound-rhs " + assgn } override Location getLocation() { result = assgn.getLocation() } } @@ -771,7 +771,7 @@ module IR { override ControlFlow::Root getRoot() { result.isRootOf(s) } - override string toString() { result = s + "[" + i + "]" } + override string toString() { result = "extract:" + i + " " + s } override Location getLocation() { result = s.getLocation() } } @@ -815,9 +815,28 @@ module IR { override predicate isPlatformIndependentConstant() { any() } - override string toString() { result = "zero value for " + v } + override string toString() { + exists(ValueSpec spec, int i | + spec.getNameExpr(i) = v.getDeclaration() and + result = "zero-init:" + i + " " + spec + ) + or + exists(ResultVariable res, FuncDef fd, int i | + v = res and + res = fd.getResultVar(i) and + result = "result-zero-init:" + i + " " + fd.getBody() + ) + } - override Location getLocation() { result = v.getDeclaration().getLocation() } + override Location getLocation() { + exists(ValueSpec spec, int i | + spec.getNameExpr(i) = v.getDeclaration() and result = spec.getLocation() + ) + or + exists(ResultVariable res, FuncDef fd | + v = res and res = fd.getAResultVar() and result = fd.getBody().getLocation() + ) + } } /** @@ -898,7 +917,7 @@ module IR { override ControlFlow::Root getRoot() { result.isRootOf(ids) } - override string toString() { result = "rhs of " + ids } + override string toString() { result = "incdec-rhs " + ids } override Location getLocation() { result = ids.getLocation() } } @@ -991,9 +1010,9 @@ module IR { override ControlFlow::Root getRoot() { var = result.(FuncDef).getAResultVar() } - override string toString() { result = "implicit write of " + var } + override string toString() { result = "result-write:" + i + " " + ret.getReturnStmt() } - override Location getLocation() { result = ret.getResult(i).getLocation() } + override Location getLocation() { result = ret.getReturnStmt().getLocation() } } /** @@ -1011,9 +1030,15 @@ module IR { override ControlFlow::Root getRoot() { var = result.(FuncDef).getAResultVar() } - override string toString() { result = "implicit read of " + var } + override string toString() { + exists(FuncDef fd, int i | + var = fd.getResultVar(i) and result = "result-read:" + i + " " + fd.getBody() + ) + } - override Location getLocation() { result = var.getDeclaration().getLocation() } + override Location getLocation() { + exists(FuncDef fd | var = fd.getAResultVar() | result = fd.getBody().getLocation()) + } } /** @@ -1058,7 +1083,7 @@ module IR { override ControlFlow::Root getRoot() { result = parm.getFunction() } - override string toString() { result = "initialization of " + parm } + override string toString() { result = parm.toString() } override Location getLocation() { result = parm.getDeclaration().getLocation() } } @@ -1075,7 +1100,7 @@ module IR { override ControlFlow::Root getRoot() { result = parm.getFunction() } - override string toString() { result = "argument corresponding to " + parm } + override string toString() { result = parm.toString() } override Location getLocation() { result = parm.getDeclaration().getLocation() } } @@ -1092,9 +1117,13 @@ module IR { override ControlFlow::Root getRoot() { result = res.getFunction() } - override string toString() { result = "initialization of " + res } + override string toString() { + exists(FuncDef fd, int i | + res = fd.getResultVar(i) and result = "result-init:" + i + " " + fd.getBody() + ) + } - override Location getLocation() { result = res.getDeclaration().getLocation() } + override Location getLocation() { result = res.getFunction().getBody().getLocation() } } /** @@ -1168,7 +1197,7 @@ module IR { override string toString() { result = "case " + cc.getExpr(i) } - override Location getLocation() { result = cc.getExpr(i).getLocation() } + override Location getLocation() { result = cc.getLocation() } } /** @@ -1293,7 +1322,7 @@ module IR { override ControlFlow::Root getRoot() { result.isRootOf(e) } - override string toString() { result = "implicit dereference" } + override string toString() { result = "implicit-deref " + e } override Location getLocation() { result = e.getLocation() } } diff --git a/go/ql/test/example-tests/snippets/fieldwrite.expected b/go/ql/test/example-tests/snippets/fieldwrite.expected index 26c7f7b90f81..2819dac1c658 100644 --- a/go/ql/test/example-tests/snippets/fieldwrite.expected +++ b/go/ql/test/example-tests/snippets/fieldwrite.expected @@ -1 +1 @@ -| main.go:23:3:23:13 | assignment to field Status | main.go:23:17:23:21 | "200" | +| main.go:23:3:23:21 | assign:0 ... = ... | main.go:23:17:23:21 | "200" | diff --git a/go/ql/test/example-tests/snippets/typeinfo.expected b/go/ql/test/example-tests/snippets/typeinfo.expected index c3a0ff5dacb2..692838d50e98 100644 --- a/go/ql/test/example-tests/snippets/typeinfo.expected +++ b/go/ql/test/example-tests/snippets/typeinfo.expected @@ -3,6 +3,6 @@ | file://:0:0:0:0 | [summary param] -1 in Write | | file://:0:0:0:0 | [summary param] -1 in WriteProxy | | main.go:18:12:18:14 | SSA def(req) | -| main.go:18:12:18:14 | argument corresponding to req | +| main.go:18:12:18:14 | req | | main.go:20:5:20:7 | req | | main.go:20:5:20:7 | req [postupdate] | diff --git a/go/ql/test/example-tests/snippets/varwrite.expected b/go/ql/test/example-tests/snippets/varwrite.expected index b2c06e76a27b..8b35595f4a82 100644 --- a/go/ql/test/example-tests/snippets/varwrite.expected +++ b/go/ql/test/example-tests/snippets/varwrite.expected @@ -1 +1 @@ -| main.go:29:2:29:4 | assignment to err | main.go:29:9:29:31 | call to test1 | +| main.go:29:2:29:31 | assign:0 ... := ... | main.go:29:9:29:31 | call to test1 | diff --git a/go/ql/test/experimental/CWE-203/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/experimental/CWE-203/CONSISTENCY/DataFlowConsistency.expected index 0bd77bfcaa2d..cabe6568e9c0 100644 --- a/go/ql/test/experimental/CWE-203/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/experimental/CWE-203/CONSISTENCY/DataFlowConsistency.expected @@ -1,5 +1,5 @@ reverseRead -| timing.go:15:18:15:20 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| timing.go:28:18:28:20 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| timing.go:41:18:41:20 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| timing.go:53:18:53:20 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| timing.go:15:18:15:20 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| timing.go:28:18:28:20 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| timing.go:41:18:41:20 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| timing.go:53:18:53:20 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/experimental/CWE-285/PamAuthBypass.expected b/go/ql/test/experimental/CWE-285/PamAuthBypass.expected index 23441b3361e5..f7bc883d2d5b 100644 --- a/go/ql/test/experimental/CWE-285/PamAuthBypass.expected +++ b/go/ql/test/experimental/CWE-285/PamAuthBypass.expected @@ -1 +1 @@ -| main.go:10:2:12:3 | ... := ...[0] | This Pam transaction may not be secure. | \ No newline at end of file +| main.go:10:2:12:3 | extract:0 ... := ... | This Pam transaction may not be secure. | diff --git a/go/ql/test/experimental/CWE-287/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/experimental/CWE-287/CONSISTENCY/DataFlowConsistency.expected index c77e608378d5..a45a61725b92 100644 --- a/go/ql/test/experimental/CWE-287/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/experimental/CWE-287/CONSISTENCY/DataFlowConsistency.expected @@ -1,4 +1,4 @@ reverseRead -| ImproperLdapAuth.go:18:18:18:20 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| ImproperLdapAuth.go:39:18:39:20 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| ImproperLdapAuth.go:64:18:64:20 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| ImproperLdapAuth.go:18:18:18:20 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| ImproperLdapAuth.go:39:18:39:20 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| ImproperLdapAuth.go:64:18:64:20 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/experimental/CWE-321-V2/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/experimental/CWE-321-V2/CONSISTENCY/DataFlowConsistency.expected index 3a9dc0286509..00934dd30c49 100644 --- a/go/ql/test/experimental/CWE-321-V2/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/experimental/CWE-321-V2/CONSISTENCY/DataFlowConsistency.expected @@ -1,3 +1,3 @@ reverseRead -| go-jose.v3.go:16:17:16:17 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| golang-jwt-v5.go:22:17:22:17 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| go-jose.v3.go:16:17:16:17 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| golang-jwt-v5.go:22:17:22:17 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/experimental/CWE-369/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/experimental/CWE-369/CONSISTENCY/DataFlowConsistency.expected index d2ae8651ea5e..2c48b7b383c9 100644 --- a/go/ql/test/experimental/CWE-369/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/experimental/CWE-369/CONSISTENCY/DataFlowConsistency.expected @@ -1,10 +1,10 @@ reverseRead -| DivideByZero.go:10:12:10:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| DivideByZero.go:17:12:17:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| DivideByZero.go:24:12:24:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| DivideByZero.go:31:12:31:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| DivideByZero.go:38:12:38:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| DivideByZero.go:45:12:45:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| DivideByZero.go:54:12:54:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| DivideByZero.go:63:12:63:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| DivideByZero.go:72:12:72:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| DivideByZero.go:10:12:10:12 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| DivideByZero.go:17:12:17:12 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| DivideByZero.go:24:12:24:12 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| DivideByZero.go:31:12:31:12 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| DivideByZero.go:38:12:38:12 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| DivideByZero.go:45:12:45:12 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| DivideByZero.go:54:12:54:12 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| DivideByZero.go:63:12:63:12 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| DivideByZero.go:72:12:72:12 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/experimental/CWE-369/DivideByZero.expected b/go/ql/test/experimental/CWE-369/DivideByZero.expected index 01211d9d107a..7f206a30c8a4 100644 --- a/go/ql/test/experimental/CWE-369/DivideByZero.expected +++ b/go/ql/test/experimental/CWE-369/DivideByZero.expected @@ -8,23 +8,23 @@ edges | DivideByZero.go:10:12:10:16 | selection of URL | DivideByZero.go:10:12:10:24 | call to Query | provenance | Src:MaD:1 MaD:2 | | DivideByZero.go:10:12:10:24 | call to Query | DivideByZero.go:11:27:11:32 | param1 | provenance | | -| DivideByZero.go:11:2:11:33 | ... := ...[0] | DivideByZero.go:12:16:12:20 | value | provenance | | -| DivideByZero.go:11:27:11:32 | param1 | DivideByZero.go:11:2:11:33 | ... := ...[0] | provenance | Config | +| DivideByZero.go:11:2:11:33 | extract:0 ... := ... | DivideByZero.go:12:16:12:20 | value | provenance | | +| DivideByZero.go:11:27:11:32 | param1 | DivideByZero.go:11:2:11:33 | extract:0 ... := ... | provenance | Config | | DivideByZero.go:17:12:17:16 | selection of URL | DivideByZero.go:17:12:17:24 | call to Query | provenance | Src:MaD:1 MaD:2 | | DivideByZero.go:17:12:17:24 | call to Query | DivideByZero.go:18:11:18:24 | type conversion | provenance | | | DivideByZero.go:18:11:18:24 | type conversion | DivideByZero.go:19:16:19:20 | value | provenance | | | DivideByZero.go:24:12:24:16 | selection of URL | DivideByZero.go:24:12:24:24 | call to Query | provenance | Src:MaD:1 MaD:2 | | DivideByZero.go:24:12:24:24 | call to Query | DivideByZero.go:25:31:25:36 | param1 | provenance | | -| DivideByZero.go:25:2:25:45 | ... := ...[0] | DivideByZero.go:26:16:26:20 | value | provenance | | -| DivideByZero.go:25:31:25:36 | param1 | DivideByZero.go:25:2:25:45 | ... := ...[0] | provenance | Config | +| DivideByZero.go:25:2:25:45 | extract:0 ... := ... | DivideByZero.go:26:16:26:20 | value | provenance | | +| DivideByZero.go:25:31:25:36 | param1 | DivideByZero.go:25:2:25:45 | extract:0 ... := ... | provenance | Config | | DivideByZero.go:31:12:31:16 | selection of URL | DivideByZero.go:31:12:31:24 | call to Query | provenance | Src:MaD:1 MaD:2 | | DivideByZero.go:31:12:31:24 | call to Query | DivideByZero.go:32:33:32:38 | param1 | provenance | | -| DivideByZero.go:32:2:32:43 | ... := ...[0] | DivideByZero.go:33:16:33:20 | value | provenance | | -| DivideByZero.go:32:33:32:38 | param1 | DivideByZero.go:32:2:32:43 | ... := ...[0] | provenance | Config | +| DivideByZero.go:32:2:32:43 | extract:0 ... := ... | DivideByZero.go:33:16:33:20 | value | provenance | | +| DivideByZero.go:32:33:32:38 | param1 | DivideByZero.go:32:2:32:43 | extract:0 ... := ... | provenance | Config | | DivideByZero.go:38:12:38:16 | selection of URL | DivideByZero.go:38:12:38:24 | call to Query | provenance | Src:MaD:1 MaD:2 | | DivideByZero.go:38:12:38:24 | call to Query | DivideByZero.go:39:32:39:37 | param1 | provenance | | -| DivideByZero.go:39:2:39:46 | ... := ...[0] | DivideByZero.go:40:16:40:20 | value | provenance | | -| DivideByZero.go:39:32:39:37 | param1 | DivideByZero.go:39:2:39:46 | ... := ...[0] | provenance | Config | +| DivideByZero.go:39:2:39:46 | extract:0 ... := ... | DivideByZero.go:40:16:40:20 | value | provenance | | +| DivideByZero.go:39:32:39:37 | param1 | DivideByZero.go:39:2:39:46 | extract:0 ... := ... | provenance | Config | | DivideByZero.go:54:12:54:16 | selection of URL | DivideByZero.go:54:12:54:24 | call to Query | provenance | Src:MaD:1 MaD:2 | | DivideByZero.go:54:12:54:24 | call to Query | DivideByZero.go:55:11:55:24 | type conversion | provenance | | | DivideByZero.go:55:11:55:24 | type conversion | DivideByZero.go:57:17:57:21 | value | provenance | | @@ -34,7 +34,7 @@ models nodes | DivideByZero.go:10:12:10:16 | selection of URL | semmle.label | selection of URL | | DivideByZero.go:10:12:10:24 | call to Query | semmle.label | call to Query | -| DivideByZero.go:11:2:11:33 | ... := ...[0] | semmle.label | ... := ...[0] | +| DivideByZero.go:11:2:11:33 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | DivideByZero.go:11:27:11:32 | param1 | semmle.label | param1 | | DivideByZero.go:12:16:12:20 | value | semmle.label | value | | DivideByZero.go:17:12:17:16 | selection of URL | semmle.label | selection of URL | @@ -43,17 +43,17 @@ nodes | DivideByZero.go:19:16:19:20 | value | semmle.label | value | | DivideByZero.go:24:12:24:16 | selection of URL | semmle.label | selection of URL | | DivideByZero.go:24:12:24:24 | call to Query | semmle.label | call to Query | -| DivideByZero.go:25:2:25:45 | ... := ...[0] | semmle.label | ... := ...[0] | +| DivideByZero.go:25:2:25:45 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | DivideByZero.go:25:31:25:36 | param1 | semmle.label | param1 | | DivideByZero.go:26:16:26:20 | value | semmle.label | value | | DivideByZero.go:31:12:31:16 | selection of URL | semmle.label | selection of URL | | DivideByZero.go:31:12:31:24 | call to Query | semmle.label | call to Query | -| DivideByZero.go:32:2:32:43 | ... := ...[0] | semmle.label | ... := ...[0] | +| DivideByZero.go:32:2:32:43 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | DivideByZero.go:32:33:32:38 | param1 | semmle.label | param1 | | DivideByZero.go:33:16:33:20 | value | semmle.label | value | | DivideByZero.go:38:12:38:16 | selection of URL | semmle.label | selection of URL | | DivideByZero.go:38:12:38:24 | call to Query | semmle.label | call to Query | -| DivideByZero.go:39:2:39:46 | ... := ...[0] | semmle.label | ... := ...[0] | +| DivideByZero.go:39:2:39:46 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | DivideByZero.go:39:32:39:37 | param1 | semmle.label | param1 | | DivideByZero.go:40:16:40:20 | value | semmle.label | value | | DivideByZero.go:54:12:54:16 | selection of URL | semmle.label | selection of URL | diff --git a/go/ql/test/experimental/CWE-522-DecompressionBombs/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/experimental/CWE-522-DecompressionBombs/CONSISTENCY/DataFlowConsistency.expected index 455781c6b15b..3cb5d9567bf5 100644 --- a/go/ql/test/experimental/CWE-522-DecompressionBombs/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/experimental/CWE-522-DecompressionBombs/CONSISTENCY/DataFlowConsistency.expected @@ -1,36 +1,36 @@ reverseRead -| test.go:60:15:60:21 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:61:24:61:30 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:62:13:62:19 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:63:17:63:23 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:64:8:64:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:65:12:65:18 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:66:8:66:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:67:12:67:18 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:68:17:68:23 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:69:21:69:27 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:70:13:70:19 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:71:17:71:23 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:72:16:72:22 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:73:20:73:26 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:74:7:74:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:75:11:75:17 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:76:9:76:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:77:13:77:19 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:78:18:78:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:79:22:79:28 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:80:5:80:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:81:9:81:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:82:7:82:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:83:11:83:17 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:84:15:84:21 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:85:16:85:22 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:86:20:86:26 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:87:16:87:22 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:88:20:88:26 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:89:17:89:23 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:90:21:90:27 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:91:15:91:21 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:92:19:92:25 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:93:5:93:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:94:9:94:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:60:15:60:21 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:61:24:61:30 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:62:13:62:19 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:63:17:63:23 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:64:8:64:14 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:65:12:65:18 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:66:8:66:14 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:67:12:67:18 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:68:17:68:23 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:69:21:69:27 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:70:13:70:19 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:71:17:71:23 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:72:16:72:22 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:73:20:73:26 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:74:7:74:13 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:75:11:75:17 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:76:9:76:15 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:77:13:77:19 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:78:18:78:24 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:79:22:79:28 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:80:5:80:11 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:81:9:81:15 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:82:7:82:13 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:83:11:83:17 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:84:15:84:21 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:85:16:85:22 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:86:20:86:26 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:87:16:87:22 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:88:20:88:26 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:89:17:89:23 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:90:21:90:27 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:91:15:91:21 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:92:19:92:25 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:93:5:93:11 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:94:9:94:15 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/experimental/CWE-522-DecompressionBombs/DecompressionBombs.expected b/go/ql/test/experimental/CWE-522-DecompressionBombs/DecompressionBombs.expected index c770dc825d71..2fea1cfd6d75 100644 --- a/go/ql/test/experimental/CWE-522-DecompressionBombs/DecompressionBombs.expected +++ b/go/ql/test/experimental/CWE-522-DecompressionBombs/DecompressionBombs.expected @@ -68,35 +68,35 @@ edges | test.go:91:15:91:26 | selection of Body | test.go:555:19:555:22 | SSA def(file) | provenance | Src:MaD:1 | | test.go:93:5:93:16 | selection of Body | test.go:580:9:580:12 | SSA def(file) | provenance | Src:MaD:1 | | test.go:128:20:128:27 | SSA def(filename) | test.go:130:33:130:40 | filename | provenance | | -| test.go:130:2:130:41 | ... := ...[0] | test.go:132:12:132:12 | f | provenance | | -| test.go:130:33:130:40 | filename | test.go:130:2:130:41 | ... := ...[0] | provenance | Config | +| test.go:130:2:130:41 | extract:0 ... := ... | test.go:132:12:132:12 | f | provenance | | +| test.go:130:33:130:40 | filename | test.go:130:2:130:41 | extract:0 ... := ... | provenance | Config | | test.go:130:33:130:40 | filename | test.go:143:51:143:58 | filename | provenance | | -| test.go:132:3:132:19 | ... := ...[0] | test.go:134:37:134:38 | rc | provenance | | -| test.go:132:12:132:12 | f | test.go:132:3:132:19 | ... := ...[0] | provenance | MaD:4 | -| test.go:143:2:143:59 | ... := ...[0] | test.go:145:12:145:12 | f | provenance | | -| test.go:143:51:143:58 | filename | test.go:143:2:143:59 | ... := ...[0] | provenance | Config | +| test.go:132:3:132:19 | extract:0 ... := ... | test.go:134:37:134:38 | rc | provenance | | +| test.go:132:12:132:12 | f | test.go:132:3:132:19 | extract:0 ... := ... | provenance | MaD:4 | +| test.go:143:2:143:59 | extract:0 ... := ... | test.go:145:12:145:12 | f | provenance | | +| test.go:143:51:143:58 | filename | test.go:143:2:143:59 | extract:0 ... := ... | provenance | Config | | test.go:145:12:145:12 | f | test.go:145:12:145:19 | call to Open | provenance | Config | | test.go:145:12:145:19 | call to Open | test.go:147:37:147:38 | rc | provenance | | | test.go:158:19:158:22 | SSA def(file) | test.go:159:25:159:28 | file | provenance | | -| test.go:159:2:159:29 | ... := ...[0] | test.go:160:48:160:52 | file1 | provenance | | -| test.go:159:25:159:28 | file | test.go:159:2:159:29 | ... := ...[0] | provenance | MaD:6 | -| test.go:160:2:160:69 | ... := ...[0] | test.go:163:26:163:29 | file | provenance | | -| test.go:160:32:160:53 | call to NewReader | test.go:160:2:160:69 | ... := ...[0] | provenance | Config | +| test.go:159:2:159:29 | extract:0 ... := ... | test.go:160:48:160:52 | file1 | provenance | | +| test.go:159:25:159:28 | file | test.go:159:2:159:29 | extract:0 ... := ... | provenance | MaD:6 | +| test.go:160:2:160:69 | extract:0 ... := ... | test.go:163:26:163:29 | file | provenance | | +| test.go:160:32:160:53 | call to NewReader | test.go:160:2:160:69 | extract:0 ... := ... | provenance | Config | | test.go:160:48:160:52 | file1 | test.go:160:32:160:53 | call to NewReader | provenance | MaD:5 | -| test.go:163:3:163:36 | ... := ...[0] | test.go:164:36:164:51 | fileReaderCloser | provenance | | -| test.go:163:26:163:29 | file | test.go:163:3:163:36 | ... := ...[0] | provenance | MaD:4 | +| test.go:163:3:163:36 | extract:0 ... := ... | test.go:164:36:164:51 | fileReaderCloser | provenance | | +| test.go:163:26:163:29 | file | test.go:163:3:163:36 | extract:0 ... := ... | provenance | MaD:4 | | test.go:169:28:169:31 | SSA def(file) | test.go:170:25:170:28 | file | provenance | | -| test.go:170:2:170:29 | ... := ...[0] | test.go:171:57:171:61 | file2 | provenance | | -| test.go:170:25:170:28 | file | test.go:170:2:170:29 | ... := ...[0] | provenance | MaD:6 | -| test.go:171:2:171:78 | ... := ...[0] | test.go:175:26:175:29 | file | provenance | | -| test.go:171:41:171:62 | call to NewReader | test.go:171:2:171:78 | ... := ...[0] | provenance | Config | +| test.go:170:2:170:29 | extract:0 ... := ... | test.go:171:57:171:61 | file2 | provenance | | +| test.go:170:25:170:28 | file | test.go:170:2:170:29 | extract:0 ... := ... | provenance | MaD:6 | +| test.go:171:2:171:78 | extract:0 ... := ... | test.go:175:26:175:29 | file | provenance | | +| test.go:171:41:171:62 | call to NewReader | test.go:171:2:171:78 | extract:0 ... := ... | provenance | Config | | test.go:171:57:171:61 | file2 | test.go:171:41:171:62 | call to NewReader | provenance | MaD:5 | | test.go:175:26:175:29 | file | test.go:175:26:175:36 | call to Open | provenance | Config | | test.go:175:26:175:36 | call to Open | test.go:176:36:176:51 | fileReaderCloser | provenance | | | test.go:181:17:181:20 | SSA def(file) | test.go:184:41:184:44 | file | provenance | | -| test.go:184:2:184:73 | ... := ...[0] | test.go:186:2:186:12 | bzip2Reader | provenance | | -| test.go:184:2:184:73 | ... := ...[0] | test.go:187:26:187:36 | bzip2Reader | provenance | | -| test.go:184:41:184:44 | file | test.go:184:2:184:73 | ... := ...[0] | provenance | Config | +| test.go:184:2:184:73 | extract:0 ... := ... | test.go:186:2:186:12 | bzip2Reader | provenance | | +| test.go:184:2:184:73 | extract:0 ... := ... | test.go:187:26:187:36 | bzip2Reader | provenance | | +| test.go:184:41:184:44 | file | test.go:184:2:184:73 | extract:0 ... := ... | provenance | Config | | test.go:187:12:187:37 | call to NewReader | test.go:189:18:189:24 | tarRead | provenance | | | test.go:187:26:187:36 | bzip2Reader | test.go:187:12:187:37 | call to NewReader | provenance | MaD:3 | | test.go:189:18:189:24 | tarRead | test.go:611:22:611:28 | SSA def(tarRead) | provenance | | @@ -122,23 +122,23 @@ edges | test.go:264:26:264:36 | flateReader | test.go:264:12:264:37 | call to NewReader | provenance | MaD:3 | | test.go:266:18:266:24 | tarRead | test.go:611:22:611:28 | SSA def(tarRead) | provenance | | | test.go:283:17:283:20 | SSA def(file) | test.go:286:41:286:44 | file | provenance | | -| test.go:286:2:286:73 | ... := ...[0] | test.go:288:2:288:12 | flateReader | provenance | | -| test.go:286:2:286:73 | ... := ...[0] | test.go:289:26:289:36 | flateReader | provenance | | -| test.go:286:41:286:44 | file | test.go:286:2:286:73 | ... := ...[0] | provenance | Config | +| test.go:286:2:286:73 | extract:0 ... := ... | test.go:288:2:288:12 | flateReader | provenance | | +| test.go:286:2:286:73 | extract:0 ... := ... | test.go:289:26:289:36 | flateReader | provenance | | +| test.go:286:41:286:44 | file | test.go:286:2:286:73 | extract:0 ... := ... | provenance | Config | | test.go:289:12:289:37 | call to NewReader | test.go:291:18:291:24 | tarRead | provenance | | | test.go:289:26:289:36 | flateReader | test.go:289:12:289:37 | call to NewReader | provenance | MaD:3 | | test.go:291:18:291:24 | tarRead | test.go:611:22:611:28 | SSA def(tarRead) | provenance | | | test.go:308:20:308:23 | SSA def(file) | test.go:311:43:311:46 | file | provenance | | -| test.go:311:2:311:47 | ... := ...[0] | test.go:313:2:313:11 | zlibReader | provenance | | -| test.go:311:2:311:47 | ... := ...[0] | test.go:314:26:314:35 | zlibReader | provenance | | -| test.go:311:43:311:46 | file | test.go:311:2:311:47 | ... := ...[0] | provenance | Config | +| test.go:311:2:311:47 | extract:0 ... := ... | test.go:313:2:313:11 | zlibReader | provenance | | +| test.go:311:2:311:47 | extract:0 ... := ... | test.go:314:26:314:35 | zlibReader | provenance | | +| test.go:311:43:311:46 | file | test.go:311:2:311:47 | extract:0 ... := ... | provenance | Config | | test.go:314:12:314:36 | call to NewReader | test.go:316:18:316:24 | tarRead | provenance | | | test.go:314:26:314:35 | zlibReader | test.go:314:12:314:36 | call to NewReader | provenance | MaD:3 | | test.go:316:18:316:24 | tarRead | test.go:611:22:611:28 | SSA def(tarRead) | provenance | | | test.go:333:11:333:14 | SSA def(file) | test.go:336:34:336:37 | file | provenance | | -| test.go:336:2:336:38 | ... := ...[0] | test.go:338:2:338:11 | zlibReader | provenance | | -| test.go:336:2:336:38 | ... := ...[0] | test.go:339:26:339:35 | zlibReader | provenance | | -| test.go:336:34:336:37 | file | test.go:336:2:336:38 | ... := ...[0] | provenance | Config | +| test.go:336:2:336:38 | extract:0 ... := ... | test.go:338:2:338:11 | zlibReader | provenance | | +| test.go:336:2:336:38 | extract:0 ... := ... | test.go:339:26:339:35 | zlibReader | provenance | | +| test.go:336:34:336:37 | file | test.go:336:2:336:38 | extract:0 ... := ... | provenance | Config | | test.go:339:12:339:36 | call to NewReader | test.go:341:18:341:24 | tarRead | provenance | | | test.go:339:26:339:35 | zlibReader | test.go:339:12:339:36 | call to NewReader | provenance | MaD:3 | | test.go:341:18:341:24 | tarRead | test.go:611:22:611:28 | SSA def(tarRead) | provenance | | @@ -169,38 +169,38 @@ edges | test.go:421:26:421:33 | s2Reader | test.go:421:12:421:34 | call to NewReader | provenance | MaD:3 | | test.go:423:18:423:24 | tarRead | test.go:611:22:611:28 | SSA def(tarRead) | provenance | | | test.go:440:19:440:21 | SSA def(src) | test.go:441:34:441:36 | src | provenance | | -| test.go:441:2:441:37 | ... := ...[0] | test.go:444:12:444:32 | type conversion | provenance | | -| test.go:441:34:441:36 | src | test.go:441:2:441:37 | ... := ...[0] | provenance | Config | +| test.go:441:2:441:37 | extract:0 ... := ... | test.go:444:12:444:32 | type conversion | provenance | | +| test.go:441:34:441:36 | src | test.go:441:2:441:37 | extract:0 ... := ... | provenance | Config | | test.go:444:12:444:32 | type conversion | test.go:445:23:445:28 | newSrc | provenance | | | test.go:447:11:447:14 | SSA def(file) | test.go:450:34:450:37 | file | provenance | | -| test.go:450:2:450:38 | ... := ...[0] | test.go:452:2:452:11 | gzipReader | provenance | | -| test.go:450:2:450:38 | ... := ...[0] | test.go:453:26:453:35 | gzipReader | provenance | | -| test.go:450:34:450:37 | file | test.go:450:2:450:38 | ... := ...[0] | provenance | Config | +| test.go:450:2:450:38 | extract:0 ... := ... | test.go:452:2:452:11 | gzipReader | provenance | | +| test.go:450:2:450:38 | extract:0 ... := ... | test.go:453:26:453:35 | gzipReader | provenance | | +| test.go:450:34:450:37 | file | test.go:450:2:450:38 | extract:0 ... := ... | provenance | Config | | test.go:453:12:453:36 | call to NewReader | test.go:455:18:455:24 | tarRead | provenance | | | test.go:453:26:453:35 | gzipReader | test.go:453:12:453:36 | call to NewReader | provenance | MaD:3 | | test.go:455:18:455:24 | tarRead | test.go:611:22:611:28 | SSA def(tarRead) | provenance | | | test.go:472:20:472:23 | SSA def(file) | test.go:475:43:475:46 | file | provenance | | -| test.go:475:2:475:47 | ... := ...[0] | test.go:477:2:477:11 | gzipReader | provenance | | -| test.go:475:2:475:47 | ... := ...[0] | test.go:479:2:479:11 | gzipReader | provenance | | -| test.go:475:2:475:47 | ... := ...[0] | test.go:480:26:480:35 | gzipReader | provenance | | -| test.go:475:43:475:46 | file | test.go:475:2:475:47 | ... := ...[0] | provenance | Config | +| test.go:475:2:475:47 | extract:0 ... := ... | test.go:477:2:477:11 | gzipReader | provenance | | +| test.go:475:2:475:47 | extract:0 ... := ... | test.go:479:2:479:11 | gzipReader | provenance | | +| test.go:475:2:475:47 | extract:0 ... := ... | test.go:480:26:480:35 | gzipReader | provenance | | +| test.go:475:43:475:46 | file | test.go:475:2:475:47 | extract:0 ... := ... | provenance | Config | | test.go:480:12:480:36 | call to NewReader | test.go:482:18:482:24 | tarRead | provenance | | | test.go:480:26:480:35 | gzipReader | test.go:480:12:480:36 | call to NewReader | provenance | MaD:3 | | test.go:482:18:482:24 | tarRead | test.go:611:22:611:28 | SSA def(tarRead) | provenance | | | test.go:499:20:499:23 | SSA def(file) | test.go:502:45:502:48 | file | provenance | | -| test.go:502:2:502:49 | ... := ...[0] | test.go:504:2:504:12 | pgzipReader | provenance | | -| test.go:502:2:502:49 | ... := ...[0] | test.go:506:2:506:12 | pgzipReader | provenance | | -| test.go:502:2:502:49 | ... := ...[0] | test.go:507:26:507:36 | pgzipReader | provenance | | -| test.go:502:45:502:48 | file | test.go:502:2:502:49 | ... := ...[0] | provenance | Config | +| test.go:502:2:502:49 | extract:0 ... := ... | test.go:504:2:504:12 | pgzipReader | provenance | | +| test.go:502:2:502:49 | extract:0 ... := ... | test.go:506:2:506:12 | pgzipReader | provenance | | +| test.go:502:2:502:49 | extract:0 ... := ... | test.go:507:26:507:36 | pgzipReader | provenance | | +| test.go:502:45:502:48 | file | test.go:502:2:502:49 | extract:0 ... := ... | provenance | Config | | test.go:507:12:507:37 | call to NewReader | test.go:509:18:509:24 | tarRead | provenance | | | test.go:507:26:507:36 | pgzipReader | test.go:507:12:507:37 | call to NewReader | provenance | MaD:3 | | test.go:509:18:509:24 | tarRead | test.go:611:22:611:28 | SSA def(tarRead) | provenance | | | test.go:526:21:526:24 | SSA def(file) | test.go:529:43:529:46 | file | provenance | | -| test.go:529:2:529:47 | ... := ...[0] | test.go:531:2:531:11 | zstdReader | provenance | | -| test.go:529:2:529:47 | ... := ...[0] | test.go:533:2:533:11 | zstdReader | provenance | | -| test.go:529:2:529:47 | ... := ...[0] | test.go:535:2:535:11 | zstdReader | provenance | | -| test.go:529:2:529:47 | ... := ...[0] | test.go:536:26:536:35 | zstdReader | provenance | | -| test.go:529:43:529:46 | file | test.go:529:2:529:47 | ... := ...[0] | provenance | Config | +| test.go:529:2:529:47 | extract:0 ... := ... | test.go:531:2:531:11 | zstdReader | provenance | | +| test.go:529:2:529:47 | extract:0 ... := ... | test.go:533:2:533:11 | zstdReader | provenance | | +| test.go:529:2:529:47 | extract:0 ... := ... | test.go:535:2:535:11 | zstdReader | provenance | | +| test.go:529:2:529:47 | extract:0 ... := ... | test.go:536:26:536:35 | zstdReader | provenance | | +| test.go:529:43:529:46 | file | test.go:529:2:529:47 | extract:0 ... := ... | provenance | Config | | test.go:536:12:536:36 | call to NewReader | test.go:538:18:538:24 | tarRead | provenance | | | test.go:536:26:536:35 | zstdReader | test.go:536:12:536:36 | call to NewReader | provenance | MaD:3 | | test.go:538:18:538:24 | tarRead | test.go:611:22:611:28 | SSA def(tarRead) | provenance | | @@ -212,9 +212,9 @@ edges | test.go:561:26:561:35 | zstdReader | test.go:561:12:561:36 | call to NewReader | provenance | MaD:3 | | test.go:563:18:563:24 | tarRead | test.go:611:22:611:28 | SSA def(tarRead) | provenance | | | test.go:580:9:580:12 | SSA def(file) | test.go:583:30:583:33 | file | provenance | | -| test.go:583:2:583:34 | ... := ...[0] | test.go:585:2:585:9 | xzReader | provenance | | -| test.go:583:2:583:34 | ... := ...[0] | test.go:586:26:586:33 | xzReader | provenance | | -| test.go:583:30:583:33 | file | test.go:583:2:583:34 | ... := ...[0] | provenance | Config | +| test.go:583:2:583:34 | extract:0 ... := ... | test.go:585:2:585:9 | xzReader | provenance | | +| test.go:583:2:583:34 | extract:0 ... := ... | test.go:586:26:586:33 | xzReader | provenance | | +| test.go:583:30:583:33 | file | test.go:583:2:583:34 | extract:0 ... := ... | provenance | Config | | test.go:586:12:586:34 | call to NewReader | test.go:589:18:589:24 | tarRead | provenance | | | test.go:586:12:586:34 | call to NewReader | test.go:590:19:590:25 | tarRead | provenance | | | test.go:586:26:586:33 | xzReader | test.go:586:12:586:34 | call to NewReader | provenance | MaD:3 | @@ -259,36 +259,36 @@ nodes | test.go:91:15:91:26 | selection of Body | semmle.label | selection of Body | | test.go:93:5:93:16 | selection of Body | semmle.label | selection of Body | | test.go:128:20:128:27 | SSA def(filename) | semmle.label | SSA def(filename) | -| test.go:130:2:130:41 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:130:2:130:41 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:130:33:130:40 | filename | semmle.label | filename | -| test.go:132:3:132:19 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:132:3:132:19 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:132:12:132:12 | f | semmle.label | f | | test.go:134:37:134:38 | rc | semmle.label | rc | -| test.go:143:2:143:59 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:143:2:143:59 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:143:51:143:58 | filename | semmle.label | filename | | test.go:145:12:145:12 | f | semmle.label | f | | test.go:145:12:145:19 | call to Open | semmle.label | call to Open | | test.go:147:37:147:38 | rc | semmle.label | rc | | test.go:158:19:158:22 | SSA def(file) | semmle.label | SSA def(file) | -| test.go:159:2:159:29 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:159:2:159:29 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:159:25:159:28 | file | semmle.label | file | -| test.go:160:2:160:69 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:160:2:160:69 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:160:32:160:53 | call to NewReader | semmle.label | call to NewReader | | test.go:160:48:160:52 | file1 | semmle.label | file1 | -| test.go:163:3:163:36 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:163:3:163:36 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:163:26:163:29 | file | semmle.label | file | | test.go:164:36:164:51 | fileReaderCloser | semmle.label | fileReaderCloser | | test.go:169:28:169:31 | SSA def(file) | semmle.label | SSA def(file) | -| test.go:170:2:170:29 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:170:2:170:29 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:170:25:170:28 | file | semmle.label | file | -| test.go:171:2:171:78 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:171:2:171:78 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:171:41:171:62 | call to NewReader | semmle.label | call to NewReader | | test.go:171:57:171:61 | file2 | semmle.label | file2 | | test.go:175:26:175:29 | file | semmle.label | file | | test.go:175:26:175:36 | call to Open | semmle.label | call to Open | | test.go:176:36:176:51 | fileReaderCloser | semmle.label | fileReaderCloser | | test.go:181:17:181:20 | SSA def(file) | semmle.label | SSA def(file) | -| test.go:184:2:184:73 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:184:2:184:73 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:184:41:184:44 | file | semmle.label | file | | test.go:186:2:186:12 | bzip2Reader | semmle.label | bzip2Reader | | test.go:187:12:187:37 | call to NewReader | semmle.label | call to NewReader | @@ -316,21 +316,21 @@ nodes | test.go:264:26:264:36 | flateReader | semmle.label | flateReader | | test.go:266:18:266:24 | tarRead | semmle.label | tarRead | | test.go:283:17:283:20 | SSA def(file) | semmle.label | SSA def(file) | -| test.go:286:2:286:73 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:286:2:286:73 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:286:41:286:44 | file | semmle.label | file | | test.go:288:2:288:12 | flateReader | semmle.label | flateReader | | test.go:289:12:289:37 | call to NewReader | semmle.label | call to NewReader | | test.go:289:26:289:36 | flateReader | semmle.label | flateReader | | test.go:291:18:291:24 | tarRead | semmle.label | tarRead | | test.go:308:20:308:23 | SSA def(file) | semmle.label | SSA def(file) | -| test.go:311:2:311:47 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:311:2:311:47 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:311:43:311:46 | file | semmle.label | file | | test.go:313:2:313:11 | zlibReader | semmle.label | zlibReader | | test.go:314:12:314:36 | call to NewReader | semmle.label | call to NewReader | | test.go:314:26:314:35 | zlibReader | semmle.label | zlibReader | | test.go:316:18:316:24 | tarRead | semmle.label | tarRead | | test.go:333:11:333:14 | SSA def(file) | semmle.label | SSA def(file) | -| test.go:336:2:336:38 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:336:2:336:38 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:336:34:336:37 | file | semmle.label | file | | test.go:338:2:338:11 | zlibReader | semmle.label | zlibReader | | test.go:339:12:339:36 | call to NewReader | semmle.label | call to NewReader | @@ -363,19 +363,19 @@ nodes | test.go:421:26:421:33 | s2Reader | semmle.label | s2Reader | | test.go:423:18:423:24 | tarRead | semmle.label | tarRead | | test.go:440:19:440:21 | SSA def(src) | semmle.label | SSA def(src) | -| test.go:441:2:441:37 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:441:2:441:37 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:441:34:441:36 | src | semmle.label | src | | test.go:444:12:444:32 | type conversion | semmle.label | type conversion | | test.go:445:23:445:28 | newSrc | semmle.label | newSrc | | test.go:447:11:447:14 | SSA def(file) | semmle.label | SSA def(file) | -| test.go:450:2:450:38 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:450:2:450:38 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:450:34:450:37 | file | semmle.label | file | | test.go:452:2:452:11 | gzipReader | semmle.label | gzipReader | | test.go:453:12:453:36 | call to NewReader | semmle.label | call to NewReader | | test.go:453:26:453:35 | gzipReader | semmle.label | gzipReader | | test.go:455:18:455:24 | tarRead | semmle.label | tarRead | | test.go:472:20:472:23 | SSA def(file) | semmle.label | SSA def(file) | -| test.go:475:2:475:47 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:475:2:475:47 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:475:43:475:46 | file | semmle.label | file | | test.go:477:2:477:11 | gzipReader | semmle.label | gzipReader | | test.go:479:2:479:11 | gzipReader | semmle.label | gzipReader | @@ -383,7 +383,7 @@ nodes | test.go:480:26:480:35 | gzipReader | semmle.label | gzipReader | | test.go:482:18:482:24 | tarRead | semmle.label | tarRead | | test.go:499:20:499:23 | SSA def(file) | semmle.label | SSA def(file) | -| test.go:502:2:502:49 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:502:2:502:49 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:502:45:502:48 | file | semmle.label | file | | test.go:504:2:504:12 | pgzipReader | semmle.label | pgzipReader | | test.go:506:2:506:12 | pgzipReader | semmle.label | pgzipReader | @@ -391,7 +391,7 @@ nodes | test.go:507:26:507:36 | pgzipReader | semmle.label | pgzipReader | | test.go:509:18:509:24 | tarRead | semmle.label | tarRead | | test.go:526:21:526:24 | SSA def(file) | semmle.label | SSA def(file) | -| test.go:529:2:529:47 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:529:2:529:47 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:529:43:529:46 | file | semmle.label | file | | test.go:531:2:531:11 | zstdReader | semmle.label | zstdReader | | test.go:533:2:533:11 | zstdReader | semmle.label | zstdReader | @@ -407,7 +407,7 @@ nodes | test.go:561:26:561:35 | zstdReader | semmle.label | zstdReader | | test.go:563:18:563:24 | tarRead | semmle.label | tarRead | | test.go:580:9:580:12 | SSA def(file) | semmle.label | SSA def(file) | -| test.go:583:2:583:34 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:583:2:583:34 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:583:30:583:33 | file | semmle.label | file | | test.go:585:2:585:9 | xzReader | semmle.label | xzReader | | test.go:586:12:586:34 | call to NewReader | semmle.label | call to NewReader | diff --git a/go/ql/test/experimental/CWE-74/DsnInjectionLocal.expected b/go/ql/test/experimental/CWE-74/DsnInjectionLocal.expected index 4b26395c8e7c..1a938af237c2 100644 --- a/go/ql/test/experimental/CWE-74/DsnInjectionLocal.expected +++ b/go/ql/test/experimental/CWE-74/DsnInjectionLocal.expected @@ -8,14 +8,14 @@ edges | Dsn.go:28:102:28:109 | index expression | Dsn.go:28:11:28:110 | []type{args} [array] | provenance | | | Dsn.go:28:102:28:109 | index expression | Dsn.go:28:11:28:110 | call to Sprintf | provenance | FunctionModel | | Dsn.go:63:9:63:11 | cfg [postupdate] [pointer] | Dsn.go:67:102:67:104 | cfg [pointer] | provenance | | -| Dsn.go:63:9:63:11 | implicit dereference [postupdate] | Dsn.go:63:9:63:11 | cfg [postupdate] [pointer] | provenance | | -| Dsn.go:63:9:63:11 | implicit dereference [postupdate] | Dsn.go:67:102:67:108 | selection of dsn | provenance | | +| Dsn.go:63:9:63:11 | implicit-deref cfg [postupdate] | Dsn.go:63:9:63:11 | cfg [postupdate] [pointer] | provenance | | +| Dsn.go:63:9:63:11 | implicit-deref cfg [postupdate] | Dsn.go:67:102:67:108 | selection of dsn | provenance | | | Dsn.go:63:19:63:25 | selection of Args | Dsn.go:63:19:63:29 | slice expression | provenance | Src:MaD:1 | -| Dsn.go:63:19:63:29 | slice expression | Dsn.go:63:9:63:11 | implicit dereference [postupdate] | provenance | FunctionModel | +| Dsn.go:63:19:63:29 | slice expression | Dsn.go:63:9:63:11 | implicit-deref cfg [postupdate] | provenance | FunctionModel | | Dsn.go:67:11:67:109 | []type{args} [array] | Dsn.go:67:11:67:109 | call to Sprintf | provenance | MaD:2 | | Dsn.go:67:11:67:109 | call to Sprintf | Dsn.go:68:29:68:33 | dbDSN | provenance | | -| Dsn.go:67:102:67:104 | cfg [pointer] | Dsn.go:67:102:67:104 | implicit dereference | provenance | | -| Dsn.go:67:102:67:104 | implicit dereference | Dsn.go:67:102:67:108 | selection of dsn | provenance | | +| Dsn.go:67:102:67:104 | cfg [pointer] | Dsn.go:67:102:67:104 | implicit-deref cfg | provenance | | +| Dsn.go:67:102:67:104 | implicit-deref cfg | Dsn.go:67:102:67:108 | selection of dsn | provenance | | | Dsn.go:67:102:67:108 | selection of dsn | Dsn.go:67:11:67:109 | []type{args} [array] | provenance | | | Dsn.go:67:102:67:108 | selection of dsn | Dsn.go:67:11:67:109 | call to Sprintf | provenance | FunctionModel | models @@ -28,13 +28,13 @@ nodes | Dsn.go:28:102:28:109 | index expression | semmle.label | index expression | | Dsn.go:29:29:29:33 | dbDSN | semmle.label | dbDSN | | Dsn.go:63:9:63:11 | cfg [postupdate] [pointer] | semmle.label | cfg [postupdate] [pointer] | -| Dsn.go:63:9:63:11 | implicit dereference [postupdate] | semmle.label | implicit dereference [postupdate] | +| Dsn.go:63:9:63:11 | implicit-deref cfg [postupdate] | semmle.label | implicit-deref cfg [postupdate] | | Dsn.go:63:19:63:25 | selection of Args | semmle.label | selection of Args | | Dsn.go:63:19:63:29 | slice expression | semmle.label | slice expression | | Dsn.go:67:11:67:109 | []type{args} [array] | semmle.label | []type{args} [array] | | Dsn.go:67:11:67:109 | call to Sprintf | semmle.label | call to Sprintf | | Dsn.go:67:102:67:104 | cfg [pointer] | semmle.label | cfg [pointer] | -| Dsn.go:67:102:67:104 | implicit dereference | semmle.label | implicit dereference | +| Dsn.go:67:102:67:104 | implicit-deref cfg | semmle.label | implicit-deref cfg | | Dsn.go:67:102:67:108 | selection of dsn | semmle.label | selection of dsn | | Dsn.go:68:29:68:33 | dbDSN | semmle.label | dbDSN | subpaths diff --git a/go/ql/test/experimental/CWE-807/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/experimental/CWE-807/CONSISTENCY/DataFlowConsistency.expected index 0b244f8f0333..f230dfa91685 100644 --- a/go/ql/test/experimental/CWE-807/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/experimental/CWE-807/CONSISTENCY/DataFlowConsistency.expected @@ -1,13 +1,13 @@ reverseRead -| SensitiveConditionBypassBad.go:7:5:7:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| condition.go:16:5:16:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| condition.go:25:5:25:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| condition.go:34:5:34:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| condition.go:41:5:41:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| condition.go:41:35:41:35 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| condition.go:49:5:49:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| condition.go:56:5:56:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| condition.go:63:5:63:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| condition.go:70:5:70:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| condition.go:77:5:77:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| condition.go:84:5:84:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| SensitiveConditionBypassBad.go:7:5:7:5 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| condition.go:16:5:16:5 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| condition.go:25:5:25:5 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| condition.go:34:5:34:5 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| condition.go:41:5:41:5 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| condition.go:41:35:41:35 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| condition.go:49:5:49:5 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| condition.go:56:5:56:5 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| condition.go:63:5:63:5 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| condition.go:70:5:70:5 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| condition.go:77:5:77:5 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| condition.go:84:5:84:5 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/experimental/CWE-840/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/experimental/CWE-840/CONSISTENCY/DataFlowConsistency.expected index b2cb9694e61c..fedb34fec073 100644 --- a/go/ql/test/experimental/CWE-840/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/experimental/CWE-840/CONSISTENCY/DataFlowConsistency.expected @@ -1,7 +1,7 @@ reverseRead -| ConditionalBypassBad.go:9:5:9:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| ConditionalBypassGood.go:9:5:9:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| condition.go:9:5:9:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| condition.go:16:5:16:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| condition.go:16:41:16:41 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| condition.go:23:5:23:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| ConditionalBypassBad.go:9:5:9:5 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| ConditionalBypassGood.go:9:5:9:5 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| condition.go:9:5:9:5 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| condition.go:16:5:16:5 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| condition.go:16:41:16:41 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| condition.go:23:5:23:5 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/experimental/CWE-918/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/experimental/CWE-918/CONSISTENCY/DataFlowConsistency.expected index 082a5e7bd31c..8b2cc46f5851 100644 --- a/go/ql/test/experimental/CWE-918/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/experimental/CWE-918/CONSISTENCY/DataFlowConsistency.expected @@ -1,8 +1,8 @@ reverseRead -| builtin.go:115:31:115:31 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| builtin.go:124:32:124:32 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| builtin.go:133:54:133:54 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| builtin.go:142:55:142:55 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| new-tests.go:62:31:62:33 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| new-tests.go:78:18:78:20 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| new-tests.go:81:37:81:39 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| builtin.go:115:31:115:31 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| builtin.go:124:32:124:32 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| builtin.go:133:54:133:54 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| builtin.go:142:55:142:55 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| new-tests.go:62:31:62:33 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| new-tests.go:78:18:78:20 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| new-tests.go:81:37:81:39 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/experimental/CWE-918/SSRF.expected b/go/ql/test/experimental/CWE-918/SSRF.expected index 5c8d1832ac19..28f5e2ca18bf 100644 --- a/go/ql/test/experimental/CWE-918/SSRF.expected +++ b/go/ql/test/experimental/CWE-918/SSRF.expected @@ -24,9 +24,9 @@ edges | builtin.go:112:21:112:31 | call to Referer | builtin.go:115:15:115:28 | untrustedInput | provenance | Src:MaD:8 | | builtin.go:130:21:130:31 | call to Referer | builtin.go:133:38:133:51 | untrustedInput | provenance | Src:MaD:8 | | builtin.go:151:16:151:36 | call to FormValue | builtin.go:154:13:154:22 | unsafehost | provenance | Src:MaD:7 | -| builtin.go:154:2:154:4 | implicit dereference [postupdate] | builtin.go:154:2:154:4 | url [postupdate] | provenance | | +| builtin.go:154:2:154:4 | implicit-deref url [postupdate] | builtin.go:154:2:154:4 | url [postupdate] | provenance | | | builtin.go:154:2:154:4 | url [postupdate] | builtin.go:156:21:156:23 | url | provenance | | -| builtin.go:154:13:154:22 | unsafehost | builtin.go:154:2:154:4 | implicit dereference [postupdate] | provenance | Config | +| builtin.go:154:13:154:22 | unsafehost | builtin.go:154:2:154:4 | implicit-deref url [postupdate] | provenance | Config | | builtin.go:154:13:154:22 | unsafehost | builtin.go:154:2:154:4 | url [postupdate] | provenance | Config | | builtin.go:156:21:156:23 | url | builtin.go:156:21:156:32 | call to String | provenance | MaD:12 | | new-tests.go:26:26:26:30 | &... [postupdate] | new-tests.go:31:48:31:56 | selection of word | provenance | Src:MaD:3 | @@ -43,8 +43,8 @@ edges | new-tests.go:35:49:35:57 | selection of word | new-tests.go:35:12:35:58 | call to Sprintf | provenance | FunctionModel | | new-tests.go:39:18:39:30 | call to Param | new-tests.go:47:11:47:46 | ...+... | provenance | Src:MaD:1 | | new-tests.go:49:18:49:30 | call to Query | new-tests.go:50:11:50:46 | ...+... | provenance | Src:MaD:2 | -| new-tests.go:62:2:62:39 | ... := ...[0] | new-tests.go:63:17:63:23 | reqBody | provenance | | -| new-tests.go:62:31:62:38 | selection of Body | new-tests.go:62:2:62:39 | ... := ...[0] | provenance | Src:MaD:6 MaD:13 | +| new-tests.go:62:2:62:39 | extract:0 ... := ... | new-tests.go:63:17:63:23 | reqBody | provenance | | +| new-tests.go:62:31:62:38 | selection of Body | new-tests.go:62:2:62:39 | extract:0 ... := ... | provenance | Src:MaD:6 MaD:13 | | new-tests.go:63:17:63:23 | reqBody | new-tests.go:63:26:63:30 | &... [postupdate] | provenance | MaD:10 | | new-tests.go:63:26:63:30 | &... [postupdate] | new-tests.go:68:48:68:56 | selection of word | provenance | | | new-tests.go:63:26:63:30 | &... [postupdate] | new-tests.go:69:48:69:56 | selection of safe | provenance | | @@ -95,7 +95,7 @@ nodes | builtin.go:130:21:130:31 | call to Referer | semmle.label | call to Referer | | builtin.go:133:38:133:51 | untrustedInput | semmle.label | untrustedInput | | builtin.go:151:16:151:36 | call to FormValue | semmle.label | call to FormValue | -| builtin.go:154:2:154:4 | implicit dereference [postupdate] | semmle.label | implicit dereference [postupdate] | +| builtin.go:154:2:154:4 | implicit-deref url [postupdate] | semmle.label | implicit-deref url [postupdate] | | builtin.go:154:2:154:4 | url [postupdate] | semmle.label | url [postupdate] | | builtin.go:154:13:154:22 | unsafehost | semmle.label | unsafehost | | builtin.go:156:21:156:23 | url | semmle.label | url | @@ -114,7 +114,7 @@ nodes | new-tests.go:47:11:47:46 | ...+... | semmle.label | ...+... | | new-tests.go:49:18:49:30 | call to Query | semmle.label | call to Query | | new-tests.go:50:11:50:46 | ...+... | semmle.label | ...+... | -| new-tests.go:62:2:62:39 | ... := ...[0] | semmle.label | ... := ...[0] | +| new-tests.go:62:2:62:39 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | new-tests.go:62:31:62:38 | selection of Body | semmle.label | selection of Body | | new-tests.go:63:17:63:23 | reqBody | semmle.label | reqBody | | new-tests.go:63:26:63:30 | &... [postupdate] | semmle.label | &... [postupdate] | diff --git a/go/ql/test/experimental/CWE-942/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/experimental/CWE-942/CONSISTENCY/DataFlowConsistency.expected index 736ff52258ff..2bd9c1d6185a 100644 --- a/go/ql/test/experimental/CWE-942/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/experimental/CWE-942/CONSISTENCY/DataFlowConsistency.expected @@ -1,15 +1,15 @@ reverseRead -| CorsMisconfiguration.go:52:14:52:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| CorsMisconfiguration.go:59:14:59:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| CorsMisconfiguration.go:66:17:66:19 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| CorsMisconfiguration.go:74:14:74:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| CorsMisconfiguration.go:81:14:81:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| CorsMisconfiguration.go:88:14:88:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| CorsMisconfiguration.go:101:14:101:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| CorsMisconfiguration.go:112:14:112:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| CorsMisconfiguration.go:126:15:126:17 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| CorsMisconfiguration.go:141:14:141:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| CorsMisconfiguration.go:156:14:156:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| CorsMisconfiguration.go:170:14:170:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| CorsMisconfiguration.go:194:17:194:19 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| CorsMisconfiguration.go:206:14:206:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| CorsMisconfiguration.go:52:14:52:16 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| CorsMisconfiguration.go:59:14:59:16 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| CorsMisconfiguration.go:66:17:66:19 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| CorsMisconfiguration.go:74:14:74:16 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| CorsMisconfiguration.go:81:14:81:16 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| CorsMisconfiguration.go:88:14:88:16 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| CorsMisconfiguration.go:101:14:101:16 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| CorsMisconfiguration.go:112:14:112:16 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| CorsMisconfiguration.go:126:15:126:17 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| CorsMisconfiguration.go:141:14:141:16 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| CorsMisconfiguration.go:156:14:156:16 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| CorsMisconfiguration.go:170:14:170:16 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| CorsMisconfiguration.go:194:17:194:19 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| CorsMisconfiguration.go:206:14:206:16 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/experimental/frameworks/CleverGo/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/experimental/frameworks/CleverGo/CONSISTENCY/DataFlowConsistency.expected index f2a42c6dbedd..d3f4571abef8 100644 --- a/go/ql/test/experimental/frameworks/CleverGo/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/experimental/frameworks/CleverGo/CONSISTENCY/DataFlowConsistency.expected @@ -1,2 +1,2 @@ reverseRead -| RemoteSources.go:98:9:98:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| RemoteSources.go:98:9:98:24 | implicit-deref structContext409 | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/extractor-tests/go1.17/CFG.expected b/go/ql/test/extractor-tests/go1.17/CFG.expected index 55c46adec789..8cce0bb26576 100644 --- a/go/ql/test/extractor-tests/go1.17/CFG.expected +++ b/go/ql/test/extractor-tests/go1.17/CFG.expected @@ -2,60 +2,60 @@ nodes edges | conversions.go:0:0:0:0 | entry | conversions.go:3:1:3:15 | skip | | conversions.go:3:1:3:15 | skip | conversions.go:5:6:5:8 | skip | -| conversions.go:5:1:5:29 | entry | conversions.go:5:10:5:10 | argument corresponding to _ | +| conversions.go:5:1:5:29 | entry | conversions.go:5:10:5:10 | _ | | conversions.go:5:1:5:29 | function declaration | conversions.go:7:6:7:9 | skip | | conversions.go:5:6:5:8 | skip | conversions.go:5:1:5:29 | function declaration | -| conversions.go:5:10:5:10 | argument corresponding to _ | conversions.go:5:10:5:10 | initialization of _ | -| conversions.go:5:10:5:10 | initialization of _ | conversions.go:5:28:5:29 | skip | +| conversions.go:5:10:5:10 | _ | conversions.go:5:10:5:10 | _ | +| conversions.go:5:10:5:10 | _ | conversions.go:5:28:5:29 | skip | | conversions.go:5:28:5:29 | skip | conversions.go:5:1:5:29 | exit | | conversions.go:7:1:26:1 | entry | conversions.go:8:6:8:6 | skip | | conversions.go:7:1:26:1 | function declaration | conversions.go:0:0:0:0 | exit | | conversions.go:7:6:7:9 | skip | conversions.go:7:1:26:1 | function declaration | -| conversions.go:8:6:8:6 | assignment to a | conversions.go:10:2:10:2 | skip | -| conversions.go:8:6:8:6 | skip | conversions.go:8:6:8:6 | zero value for a | -| conversions.go:8:6:8:6 | zero value for a | conversions.go:8:6:8:6 | assignment to a | -| conversions.go:10:2:10:2 | assignment to b | conversions.go:11:2:11:4 | use | +| conversions.go:8:6:8:6 | skip | conversions.go:8:6:8:21 | zero-init:0 value declaration specifier | +| conversions.go:8:6:8:21 | assign:0 value declaration specifier | conversions.go:10:2:10:2 | skip | +| conversions.go:8:6:8:21 | zero-init:0 value declaration specifier | conversions.go:8:6:8:21 | assign:0 value declaration specifier | | conversions.go:10:2:10:2 | skip | conversions.go:10:7:10:16 | selection of Add | +| conversions.go:10:2:10:23 | assign:0 ... := ... | conversions.go:11:2:11:4 | use | | conversions.go:10:7:10:16 | selection of Add | conversions.go:10:18:10:18 | a | -| conversions.go:10:7:10:23 | call to Add | conversions.go:10:2:10:2 | assignment to b | +| conversions.go:10:7:10:23 | call to Add | conversions.go:10:2:10:23 | assign:0 ... := ... | | conversions.go:10:18:10:18 | a | conversions.go:10:21:10:22 | 10 | | conversions.go:10:21:10:22 | 10 | conversions.go:10:7:10:23 | call to Add | | conversions.go:11:2:11:4 | use | conversions.go:11:6:11:6 | b | | conversions.go:11:2:11:7 | call to use | conversions.go:7:1:26:1 | exit | | conversions.go:11:2:11:7 | call to use | conversions.go:13:6:13:8 | skip | | conversions.go:11:6:11:6 | b | conversions.go:11:2:11:7 | call to use | -| conversions.go:13:6:13:8 | assignment to arr | conversions.go:14:2:14:6 | skip | -| conversions.go:13:6:13:8 | skip | conversions.go:13:6:13:8 | zero value for arr | -| conversions.go:13:6:13:8 | zero value for arr | conversions.go:13:6:13:8 | assignment to arr | -| conversions.go:14:2:14:6 | assignment to slice | conversions.go:17:2:17:4 | skip | +| conversions.go:13:6:13:8 | skip | conversions.go:13:6:13:13 | zero-init:0 value declaration specifier | +| conversions.go:13:6:13:13 | assign:0 value declaration specifier | conversions.go:14:2:14:6 | skip | +| conversions.go:13:6:13:13 | zero-init:0 value declaration specifier | conversions.go:13:6:13:13 | assign:0 value declaration specifier | | conversions.go:14:2:14:6 | skip | conversions.go:14:11:14:22 | selection of Slice | +| conversions.go:14:2:14:31 | assign:0 ... := ... | conversions.go:17:2:17:4 | skip | | conversions.go:14:11:14:22 | selection of Slice | conversions.go:14:24:14:26 | arr | -| conversions.go:14:11:14:31 | call to Slice | conversions.go:14:2:14:6 | assignment to slice | +| conversions.go:14:11:14:31 | call to Slice | conversions.go:14:2:14:31 | assign:0 ... := ... | | conversions.go:14:24:14:26 | arr | conversions.go:14:29:14:30 | 20 | | conversions.go:14:29:14:30 | 20 | conversions.go:14:11:14:31 | call to Slice | -| conversions.go:17:2:17:4 | assignment to ptr | conversions.go:18:2:18:4 | use | | conversions.go:17:2:17:4 | skip | conversions.go:17:20:17:24 | slice | +| conversions.go:17:2:17:25 | assign:0 ... := ... | conversions.go:18:2:18:4 | use | | conversions.go:17:9:17:25 | type conversion | conversions.go:7:1:26:1 | exit | -| conversions.go:17:9:17:25 | type conversion | conversions.go:17:2:17:4 | assignment to ptr | +| conversions.go:17:9:17:25 | type conversion | conversions.go:17:2:17:25 | assign:0 ... := ... | | conversions.go:17:20:17:24 | slice | conversions.go:17:9:17:25 | type conversion | | conversions.go:18:2:18:4 | use | conversions.go:18:6:18:8 | ptr | | conversions.go:18:2:18:9 | call to use | conversions.go:7:1:26:1 | exit | | conversions.go:18:2:18:9 | call to use | conversions.go:21:2:21:4 | skip | | conversions.go:18:6:18:8 | ptr | conversions.go:18:2:18:9 | call to use | -| conversions.go:21:2:21:4 | assignment to str | conversions.go:22:2:22:6 | skip | | conversions.go:21:2:21:4 | skip | conversions.go:21:9:21:18 | "a string" | -| conversions.go:21:9:21:18 | "a string" | conversions.go:21:2:21:4 | assignment to str | -| conversions.go:22:2:22:6 | assignment to bytes | conversions.go:23:2:23:4 | use | +| conversions.go:21:2:21:18 | assign:0 ... := ... | conversions.go:22:2:22:6 | skip | +| conversions.go:21:9:21:18 | "a string" | conversions.go:21:2:21:18 | assign:0 ... := ... | | conversions.go:22:2:22:6 | skip | conversions.go:22:18:22:20 | str | -| conversions.go:22:11:22:21 | type conversion | conversions.go:22:2:22:6 | assignment to bytes | +| conversions.go:22:2:22:21 | assign:0 ... := ... | conversions.go:23:2:23:4 | use | +| conversions.go:22:11:22:21 | type conversion | conversions.go:22:2:22:21 | assign:0 ... := ... | | conversions.go:22:18:22:20 | str | conversions.go:22:11:22:21 | type conversion | | conversions.go:23:2:23:4 | use | conversions.go:23:6:23:10 | bytes | | conversions.go:23:2:23:11 | call to use | conversions.go:7:1:26:1 | exit | | conversions.go:23:2:23:11 | call to use | conversions.go:24:2:24:6 | skip | | conversions.go:23:6:23:10 | bytes | conversions.go:23:2:23:11 | call to use | -| conversions.go:24:2:24:6 | assignment to runes | conversions.go:25:2:25:4 | use | | conversions.go:24:2:24:6 | skip | conversions.go:24:18:24:20 | str | -| conversions.go:24:11:24:21 | type conversion | conversions.go:24:2:24:6 | assignment to runes | +| conversions.go:24:2:24:21 | assign:0 ... := ... | conversions.go:25:2:25:4 | use | +| conversions.go:24:11:24:21 | type conversion | conversions.go:24:2:24:21 | assign:0 ... := ... | | conversions.go:24:18:24:20 | str | conversions.go:24:11:24:21 | type conversion | | conversions.go:25:2:25:4 | use | conversions.go:25:6:25:10 | runes | | conversions.go:25:2:25:11 | call to use | conversions.go:7:1:26:1 | exit | diff --git a/go/ql/test/library-tests/semmle/go/IR/test.expected b/go/ql/test/library-tests/semmle/go/IR/test.expected index c42cdaa9932f..1895e51b6fa4 100644 --- a/go/ql/test/library-tests/semmle/go/IR/test.expected +++ b/go/ql/test/library-tests/semmle/go/IR/test.expected @@ -1,10 +1,10 @@ -| test.go:9:2:9:16 | ... := ...[0] | test.go:9:13:9:16 | <-... | 0 | file://:0:0:0:0 | bool | -| test.go:9:2:9:16 | ... := ...[1] | test.go:9:13:9:16 | <-... | 1 | file://:0:0:0:0 | bool | -| test.go:15:2:15:20 | ... := ...[0] | test.go:15:13:15:20 | index expression | 0 | file://:0:0:0:0 | string | -| test.go:15:2:15:20 | ... := ...[1] | test.go:15:13:15:20 | index expression | 1 | file://:0:0:0:0 | bool | -| test.go:21:2:21:22 | ... := ...[0] | test.go:21:13:21:22 | type assertion | 0 | file://:0:0:0:0 | string | -| test.go:21:2:21:22 | ... := ...[1] | test.go:21:13:21:22 | type assertion | 1 | file://:0:0:0:0 | bool | -| test.go:29:2:29:7 | call to f[0] | test.go:29:4:29:6 | call to g | 0 | file://:0:0:0:0 | int | -| test.go:29:2:29:7 | call to f[1] | test.go:29:4:29:6 | call to g | 1 | file://:0:0:0:0 | int | -| test.go:33:2:33:7 | call to f[0] | test.go:33:4:33:6 | call to v | 0 | file://:0:0:0:0 | int | -| test.go:33:2:33:7 | call to f[1] | test.go:33:4:33:6 | call to v | 1 | file://:0:0:0:0 | int | +| test.go:9:2:9:16 | extract:0 ... := ... | test.go:9:13:9:16 | <-... | 0 | file://:0:0:0:0 | bool | +| test.go:9:2:9:16 | extract:1 ... := ... | test.go:9:13:9:16 | <-... | 1 | file://:0:0:0:0 | bool | +| test.go:15:2:15:20 | extract:0 ... := ... | test.go:15:13:15:20 | index expression | 0 | file://:0:0:0:0 | string | +| test.go:15:2:15:20 | extract:1 ... := ... | test.go:15:13:15:20 | index expression | 1 | file://:0:0:0:0 | bool | +| test.go:21:2:21:22 | extract:0 ... := ... | test.go:21:13:21:22 | type assertion | 0 | file://:0:0:0:0 | string | +| test.go:21:2:21:22 | extract:1 ... := ... | test.go:21:13:21:22 | type assertion | 1 | file://:0:0:0:0 | bool | +| test.go:29:2:29:7 | extract:0 call to f | test.go:29:4:29:6 | call to g | 0 | file://:0:0:0:0 | int | +| test.go:29:2:29:7 | extract:1 call to f | test.go:29:4:29:6 | call to g | 1 | file://:0:0:0:0 | int | +| test.go:33:2:33:7 | extract:0 call to f | test.go:33:4:33:6 | call to v | 0 | file://:0:0:0:0 | int | +| test.go:33:2:33:7 | extract:1 call to f | test.go:33:4:33:6 | call to v | 1 | file://:0:0:0:0 | int | diff --git a/go/ql/test/library-tests/semmle/go/Scopes/EntityWrite.expected b/go/ql/test/library-tests/semmle/go/Scopes/EntityWrite.expected index 843922048a07..ed3af2c6ddff 100644 --- a/go/ql/test/library-tests/semmle/go/Scopes/EntityWrite.expected +++ b/go/ql/test/library-tests/semmle/go/Scopes/EntityWrite.expected @@ -1,6 +1,6 @@ | main.go:6:2:6:2 | x | main.go:24:2:24:9 | increment statement | -| main.go:13:7:13:10 | recv | main.go:13:7:13:10 | initialization of recv | -| main.go:17:10:17:10 | x | main.go:17:10:17:10 | initialization of x | -| main.go:17:26:17:26 | y | main.go:17:26:17:26 | initialization of y | -| main.go:23:7:23:10 | recv | main.go:23:7:23:10 | initialization of recv | -| types.go:33:22:33:22 | a | types.go:33:22:33:22 | initialization of a | +| main.go:13:7:13:10 | recv | main.go:13:7:13:10 | recv | +| main.go:17:10:17:10 | x | main.go:17:10:17:10 | x | +| main.go:17:26:17:26 | y | main.go:17:26:17:26 | y | +| main.go:23:7:23:10 | recv | main.go:23:7:23:10 | recv | +| types.go:33:22:33:22 | a | types.go:33:22:33:22 | a | diff --git a/go/ql/test/library-tests/semmle/go/concepts/HTTP/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/concepts/HTTP/CONSISTENCY/DataFlowConsistency.expected index ded5f21e3e6a..56f4c17d2240 100644 --- a/go/ql/test/library-tests/semmle/go/concepts/HTTP/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/concepts/HTTP/CONSISTENCY/DataFlowConsistency.expected @@ -1,9 +1,9 @@ reverseRead -| main.go:49:2:49:4 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| main.go:50:2:50:4 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| main.go:58:2:58:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| main.go:63:49:63:49 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| server.go:8:6:8:6 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| server.go:9:6:9:6 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| server.go:10:6:10:6 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| server.go:13:6:13:6 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| main.go:49:2:49:4 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| main.go:50:2:50:4 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| main.go:58:2:58:5 | implicit-deref resp | Origin of readStep is missing a PostUpdateNode. | +| main.go:63:49:63:49 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| server.go:8:6:8:6 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| server.go:9:6:9:6 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| server.go:10:6:10:6 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| server.go:13:6:13:6 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/concepts/Regexp/RegexpPattern.expected b/go/ql/test/library-tests/semmle/go/concepts/Regexp/RegexpPattern.expected index 63adab35d7b6..7019de4934ed 100644 --- a/go/ql/test/library-tests/semmle/go/concepts/Regexp/RegexpPattern.expected +++ b/go/ql/test/library-tests/semmle/go/concepts/Regexp/RegexpPattern.expected @@ -1,10 +1,10 @@ | stdlib.go:10:15:10:17 | "a" | a | stdlib.go:10:15:10:17 | "a" | | stdlib.go:12:21:12:39 | `(^\|\\n)repository=` | (^\|\\n)repository= | stdlib.go:12:21:12:39 | `(^\|\\n)repository=` | | stdlib.go:13:21:13:24 | "ab" | ab | stdlib.go:13:21:13:24 | "ab" | -| stdlib.go:15:26:15:39 | "[so]me\|regex" | [so]me\|regex | stdlib.go:15:2:15:40 | ... := ...[0] | +| stdlib.go:15:26:15:39 | "[so]me\|regex" | [so]me\|regex | stdlib.go:15:2:15:40 | extract:0 ... := ... | | stdlib.go:15:26:15:39 | "[so]me\|regex" | [so]me\|regex | stdlib.go:15:26:15:39 | "[so]me\|regex" | -| stdlib.go:16:30:16:37 | "posix?" | posix? | stdlib.go:16:2:16:3 | SSA def(re) | -| stdlib.go:16:30:16:37 | "posix?" | posix? | stdlib.go:16:2:16:38 | ... = ...[0] | +| stdlib.go:16:30:16:37 | "posix?" | posix? | stdlib.go:16:2:16:38 | SSA def(re) | +| stdlib.go:16:30:16:37 | "posix?" | posix? | stdlib.go:16:2:16:38 | extract:0 ... = ... | | stdlib.go:16:30:16:37 | "posix?" | posix? | stdlib.go:16:30:16:37 | "posix?" | | stdlib.go:16:30:16:37 | "posix?" | posix? | stdlib.go:17:2:17:3 | re | | stdlib.go:16:30:16:37 | "posix?" | posix? | stdlib.go:21:2:21:3 | re | diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected index 3768d015167e..a999a416df12 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected @@ -1,25 +1,25 @@ | DuplicateSwitchCase.go:0:0:0:0 | entry | DuplicateSwitchCase.go:3:6:3:15 | skip | -| DuplicateSwitchCase.go:3:1:12:1 | entry | DuplicateSwitchCase.go:3:17:3:19 | argument corresponding to msg | +| DuplicateSwitchCase.go:3:1:12:1 | entry | DuplicateSwitchCase.go:3:17:3:19 | msg | | DuplicateSwitchCase.go:3:1:12:1 | function declaration | DuplicateSwitchCase.go:14:6:14:10 | skip | | DuplicateSwitchCase.go:3:6:3:15 | skip | DuplicateSwitchCase.go:3:1:12:1 | function declaration | -| DuplicateSwitchCase.go:3:17:3:19 | argument corresponding to msg | DuplicateSwitchCase.go:3:17:3:19 | initialization of msg | -| DuplicateSwitchCase.go:3:17:3:19 | initialization of msg | DuplicateSwitchCase.go:4:2:11:2 | true | +| DuplicateSwitchCase.go:3:17:3:19 | msg | DuplicateSwitchCase.go:3:17:3:19 | msg | +| DuplicateSwitchCase.go:3:17:3:19 | msg | DuplicateSwitchCase.go:4:2:11:2 | true | | DuplicateSwitchCase.go:4:2:11:2 | true | DuplicateSwitchCase.go:5:7:5:9 | msg | +| DuplicateSwitchCase.go:5:2:6:9 | case ...==... | DuplicateSwitchCase.go:5:7:5:20 | ...==... is false | +| DuplicateSwitchCase.go:5:2:6:9 | case ...==... | DuplicateSwitchCase.go:5:7:5:20 | ...==... is true | | DuplicateSwitchCase.go:5:7:5:9 | msg | DuplicateSwitchCase.go:5:14:5:20 | "start" | -| DuplicateSwitchCase.go:5:7:5:20 | ...==... | DuplicateSwitchCase.go:5:7:5:20 | case ...==... | +| DuplicateSwitchCase.go:5:7:5:20 | ...==... | DuplicateSwitchCase.go:5:2:6:9 | case ...==... | | DuplicateSwitchCase.go:5:7:5:20 | ...==... is false | DuplicateSwitchCase.go:7:7:7:9 | msg | | DuplicateSwitchCase.go:5:7:5:20 | ...==... is true | DuplicateSwitchCase.go:6:3:6:7 | start | -| DuplicateSwitchCase.go:5:7:5:20 | case ...==... | DuplicateSwitchCase.go:5:7:5:20 | ...==... is false | -| DuplicateSwitchCase.go:5:7:5:20 | case ...==... | DuplicateSwitchCase.go:5:7:5:20 | ...==... is true | | DuplicateSwitchCase.go:5:14:5:20 | "start" | DuplicateSwitchCase.go:5:7:5:20 | ...==... | | DuplicateSwitchCase.go:6:3:6:7 | start | DuplicateSwitchCase.go:6:3:6:9 | call to start | | DuplicateSwitchCase.go:6:3:6:9 | call to start | DuplicateSwitchCase.go:3:1:12:1 | exit | +| DuplicateSwitchCase.go:7:2:8:8 | case ...==... | DuplicateSwitchCase.go:7:7:7:20 | ...==... is false | +| DuplicateSwitchCase.go:7:2:8:8 | case ...==... | DuplicateSwitchCase.go:7:7:7:20 | ...==... is true | | DuplicateSwitchCase.go:7:7:7:9 | msg | DuplicateSwitchCase.go:7:14:7:20 | "start" | -| DuplicateSwitchCase.go:7:7:7:20 | ...==... | DuplicateSwitchCase.go:7:7:7:20 | case ...==... | +| DuplicateSwitchCase.go:7:7:7:20 | ...==... | DuplicateSwitchCase.go:7:2:8:8 | case ...==... | | DuplicateSwitchCase.go:7:7:7:20 | ...==... is false | DuplicateSwitchCase.go:10:3:10:7 | panic | | DuplicateSwitchCase.go:7:7:7:20 | ...==... is true | DuplicateSwitchCase.go:8:3:8:6 | stop | -| DuplicateSwitchCase.go:7:7:7:20 | case ...==... | DuplicateSwitchCase.go:7:7:7:20 | ...==... is false | -| DuplicateSwitchCase.go:7:7:7:20 | case ...==... | DuplicateSwitchCase.go:7:7:7:20 | ...==... is true | | DuplicateSwitchCase.go:7:14:7:20 | "start" | DuplicateSwitchCase.go:7:7:7:20 | ...==... | | DuplicateSwitchCase.go:8:3:8:6 | stop | DuplicateSwitchCase.go:8:3:8:8 | call to stop | | DuplicateSwitchCase.go:8:3:8:8 | call to stop | DuplicateSwitchCase.go:3:1:12:1 | exit | @@ -37,30 +37,30 @@ | epilogues.go:0:0:0:0 | entry | epilogues.go:3:1:3:12 | skip | | epilogues.go:3:1:3:12 | skip | epilogues.go:8:1:10:1 | skip | | epilogues.go:8:1:10:1 | skip | epilogues.go:12:21:12:23 | skip | -| epilogues.go:12:1:14:1 | entry | epilogues.go:12:7:12:7 | argument corresponding to l | +| epilogues.go:12:1:14:1 | entry | epilogues.go:12:7:12:7 | l | | epilogues.go:12:1:14:1 | function declaration | epilogues.go:16:20:16:27 | skip | -| epilogues.go:12:7:12:7 | argument corresponding to l | epilogues.go:12:7:12:7 | initialization of l | -| epilogues.go:12:7:12:7 | initialization of l | epilogues.go:12:25:12:27 | argument corresponding to msg | +| epilogues.go:12:7:12:7 | l | epilogues.go:12:7:12:7 | l | +| epilogues.go:12:7:12:7 | l | epilogues.go:12:25:12:27 | msg | | epilogues.go:12:21:12:23 | skip | epilogues.go:12:1:14:1 | function declaration | -| epilogues.go:12:25:12:27 | argument corresponding to msg | epilogues.go:12:25:12:27 | initialization of msg | -| epilogues.go:12:25:12:27 | initialization of msg | epilogues.go:12:37:12:40 | argument corresponding to code | -| epilogues.go:12:37:12:40 | argument corresponding to code | epilogues.go:12:37:12:40 | initialization of code | -| epilogues.go:12:37:12:40 | initialization of code | epilogues.go:13:2:13:12 | selection of Println | +| epilogues.go:12:25:12:27 | msg | epilogues.go:12:25:12:27 | msg | +| epilogues.go:12:25:12:27 | msg | epilogues.go:12:37:12:40 | code | +| epilogues.go:12:37:12:40 | code | epilogues.go:12:37:12:40 | code | +| epilogues.go:12:37:12:40 | code | epilogues.go:13:2:13:12 | selection of Println | | epilogues.go:13:2:13:12 | selection of Println | epilogues.go:13:14:13:14 | l | | epilogues.go:13:2:13:33 | call to Println | epilogues.go:12:1:14:1 | exit | -| epilogues.go:13:14:13:14 | implicit dereference | epilogues.go:12:1:14:1 | exit | -| epilogues.go:13:14:13:14 | implicit dereference | epilogues.go:13:14:13:21 | selection of prefix | -| epilogues.go:13:14:13:14 | l | epilogues.go:13:14:13:14 | implicit dereference | +| epilogues.go:13:14:13:14 | implicit-deref l | epilogues.go:12:1:14:1 | exit | +| epilogues.go:13:14:13:14 | implicit-deref l | epilogues.go:13:14:13:21 | selection of prefix | +| epilogues.go:13:14:13:14 | l | epilogues.go:13:14:13:14 | implicit-deref l | | epilogues.go:13:14:13:21 | selection of prefix | epilogues.go:13:24:13:26 | msg | | epilogues.go:13:24:13:26 | msg | epilogues.go:13:29:13:32 | code | | epilogues.go:13:29:13:32 | code | epilogues.go:13:2:13:33 | call to Println | -| epilogues.go:16:1:18:1 | entry | epilogues.go:16:7:16:7 | argument corresponding to l | +| epilogues.go:16:1:18:1 | entry | epilogues.go:16:7:16:7 | l | | epilogues.go:16:1:18:1 | function declaration | epilogues.go:23:6:23:15 | skip | -| epilogues.go:16:7:16:7 | argument corresponding to l | epilogues.go:16:7:16:7 | initialization of l | -| epilogues.go:16:7:16:7 | initialization of l | epilogues.go:16:29:16:31 | argument corresponding to msg | +| epilogues.go:16:7:16:7 | l | epilogues.go:16:7:16:7 | l | +| epilogues.go:16:7:16:7 | l | epilogues.go:16:29:16:31 | msg | | epilogues.go:16:20:16:27 | skip | epilogues.go:16:1:18:1 | function declaration | -| epilogues.go:16:29:16:31 | argument corresponding to msg | epilogues.go:16:29:16:31 | initialization of msg | -| epilogues.go:16:29:16:31 | initialization of msg | epilogues.go:17:2:17:12 | selection of Println | +| epilogues.go:16:29:16:31 | msg | epilogues.go:16:29:16:31 | msg | +| epilogues.go:16:29:16:31 | msg | epilogues.go:17:2:17:12 | selection of Println | | epilogues.go:17:2:17:12 | selection of Println | epilogues.go:17:14:17:14 | l | | epilogues.go:17:2:17:27 | call to Println | epilogues.go:16:1:18:1 | exit | | epilogues.go:17:14:17:14 | l | epilogues.go:17:14:17:21 | selection of prefix | @@ -69,10 +69,10 @@ | epilogues.go:23:1:27:1 | entry | epilogues.go:24:5:24:5 | skip | | epilogues.go:23:1:27:1 | function declaration | epilogues.go:31:6:31:13 | skip | | epilogues.go:23:6:23:15 | skip | epilogues.go:23:1:27:1 | function declaration | -| epilogues.go:24:5:24:5 | assignment to r | epilogues.go:24:21:24:21 | r | | epilogues.go:24:5:24:5 | skip | epilogues.go:24:10:24:16 | recover | +| epilogues.go:24:5:24:18 | assign:0 ... := ... | epilogues.go:24:21:24:21 | r | | epilogues.go:24:10:24:16 | recover | epilogues.go:24:10:24:18 | call to recover | -| epilogues.go:24:10:24:18 | call to recover | epilogues.go:24:5:24:5 | assignment to r | +| epilogues.go:24:10:24:18 | call to recover | epilogues.go:24:5:24:18 | assign:0 ... := ... | | epilogues.go:24:21:24:21 | r | epilogues.go:24:26:24:28 | nil | | epilogues.go:24:21:24:28 | ...!=... | epilogues.go:23:1:27:1 | exit | | epilogues.go:24:21:24:28 | ...!=... | epilogues.go:24:21:24:28 | ...!=... is false | @@ -84,11 +84,11 @@ | epilogues.go:25:3:25:30 | call to Println | epilogues.go:23:1:27:1 | exit | | epilogues.go:25:15:25:26 | "recovered:" | epilogues.go:25:29:25:29 | r | | epilogues.go:25:29:25:29 | r | epilogues.go:25:3:25:30 | call to Println | -| epilogues.go:31:1:33:1 | entry | epilogues.go:31:15:31:15 | argument corresponding to x | +| epilogues.go:31:1:33:1 | entry | epilogues.go:31:15:31:15 | x | | epilogues.go:31:1:33:1 | function declaration | epilogues.go:36:6:36:12 | skip | | epilogues.go:31:6:31:13 | skip | epilogues.go:31:1:33:1 | function declaration | -| epilogues.go:31:15:31:15 | argument corresponding to x | epilogues.go:31:15:31:15 | initialization of x | -| epilogues.go:31:15:31:15 | initialization of x | epilogues.go:32:9:32:9 | x | +| epilogues.go:31:15:31:15 | x | epilogues.go:31:15:31:15 | x | +| epilogues.go:31:15:31:15 | x | epilogues.go:32:9:32:9 | x | | epilogues.go:32:2:32:13 | return statement | epilogues.go:31:1:33:1 | exit | | epilogues.go:32:9:32:9 | x | epilogues.go:32:13:32:13 | 2 | | epilogues.go:32:9:32:13 | ...*... | epilogues.go:32:2:32:13 | return statement | @@ -99,54 +99,54 @@ | epilogues.go:37:2:37:12 | selection of Println | epilogues.go:37:14:37:19 | "void" | | epilogues.go:37:2:37:20 | call to Println | epilogues.go:36:1:38:1 | exit | | epilogues.go:37:14:37:19 | "void" | epilogues.go:37:2:37:20 | call to Println | -| epilogues.go:42:1:48:1 | entry | epilogues.go:42:20:42:20 | argument corresponding to x | +| epilogues.go:42:1:48:1 | entry | epilogues.go:42:20:42:20 | x | | epilogues.go:42:1:48:1 | function declaration | epilogues.go:51:6:51:21 | skip | | epilogues.go:42:6:42:18 | skip | epilogues.go:42:1:48:1 | function declaration | -| epilogues.go:42:20:42:20 | argument corresponding to x | epilogues.go:42:20:42:20 | initialization of x | -| epilogues.go:42:20:42:20 | initialization of x | epilogues.go:42:28:42:33 | zero value for result | -| epilogues.go:42:28:42:33 | implicit read of result | epilogues.go:42:40:42:42 | implicit read of err | -| epilogues.go:42:28:42:33 | initialization of result | epilogues.go:42:40:42:42 | zero value for err | -| epilogues.go:42:28:42:33 | zero value for result | epilogues.go:42:28:42:33 | initialization of result | -| epilogues.go:42:40:42:42 | implicit read of err | epilogues.go:42:1:48:1 | exit | -| epilogues.go:42:40:42:42 | initialization of err | epilogues.go:43:5:43:5 | x | -| epilogues.go:42:40:42:42 | zero value for err | epilogues.go:42:40:42:42 | initialization of err | +| epilogues.go:42:20:42:20 | x | epilogues.go:42:20:42:20 | x | +| epilogues.go:42:20:42:20 | x | epilogues.go:42:51:48:1 | result-zero-init:0 block statement | +| epilogues.go:42:51:48:1 | result-init:0 block statement | epilogues.go:42:51:48:1 | result-zero-init:1 block statement | +| epilogues.go:42:51:48:1 | result-init:1 block statement | epilogues.go:43:5:43:5 | x | +| epilogues.go:42:51:48:1 | result-read:0 block statement | epilogues.go:42:51:48:1 | result-read:1 block statement | +| epilogues.go:42:51:48:1 | result-read:1 block statement | epilogues.go:42:1:48:1 | exit | +| epilogues.go:42:51:48:1 | result-zero-init:0 block statement | epilogues.go:42:51:48:1 | result-init:0 block statement | +| epilogues.go:42:51:48:1 | result-zero-init:1 block statement | epilogues.go:42:51:48:1 | result-init:1 block statement | | epilogues.go:43:5:43:5 | x | epilogues.go:43:9:43:9 | 0 | | epilogues.go:43:5:43:9 | ...<... | epilogues.go:43:5:43:9 | ...<... is false | | epilogues.go:43:5:43:9 | ...<... | epilogues.go:43:5:43:9 | ...<... is true | | epilogues.go:43:5:43:9 | ...<... is false | epilogues.go:47:9:47:9 | x | | epilogues.go:43:5:43:9 | ...<... is true | epilogues.go:44:3:44:8 | skip | | epilogues.go:43:9:43:9 | 0 | epilogues.go:43:5:43:9 | ...<... | -| epilogues.go:44:3:44:8 | assignment to result | epilogues.go:45:3:45:8 | return statement | | epilogues.go:44:3:44:8 | skip | epilogues.go:44:13:44:13 | x | -| epilogues.go:44:12:44:13 | -... | epilogues.go:44:3:44:8 | assignment to result | +| epilogues.go:44:3:44:13 | assign:0 ... = ... | epilogues.go:45:3:45:8 | return statement | +| epilogues.go:44:12:44:13 | -... | epilogues.go:44:3:44:13 | assign:0 ... = ... | | epilogues.go:44:13:44:13 | x | epilogues.go:44:12:44:13 | -... | -| epilogues.go:45:3:45:8 | return statement | epilogues.go:42:28:42:33 | implicit read of result | -| epilogues.go:47:2:47:14 | return statement | epilogues.go:42:28:42:33 | implicit read of result | -| epilogues.go:47:9:47:9 | implicit write of result | epilogues.go:47:12:47:14 | nil | -| epilogues.go:47:9:47:9 | x | epilogues.go:47:9:47:9 | implicit write of result | -| epilogues.go:47:12:47:14 | implicit write of err | epilogues.go:47:2:47:14 | return statement | -| epilogues.go:47:12:47:14 | nil | epilogues.go:47:12:47:14 | implicit write of err | -| epilogues.go:51:1:54:1 | entry | epilogues.go:51:23:51:23 | argument corresponding to x | +| epilogues.go:45:3:45:8 | return statement | epilogues.go:42:51:48:1 | result-read:0 block statement | +| epilogues.go:47:2:47:14 | result-write:0 return statement | epilogues.go:47:12:47:14 | nil | +| epilogues.go:47:2:47:14 | result-write:1 return statement | epilogues.go:47:2:47:14 | return statement | +| epilogues.go:47:2:47:14 | return statement | epilogues.go:42:51:48:1 | result-read:0 block statement | +| epilogues.go:47:9:47:9 | x | epilogues.go:47:2:47:14 | result-write:0 return statement | +| epilogues.go:47:12:47:14 | nil | epilogues.go:47:2:47:14 | result-write:1 return statement | +| epilogues.go:51:1:54:1 | entry | epilogues.go:51:23:51:23 | x | | epilogues.go:51:1:54:1 | function declaration | epilogues.go:59:6:59:25 | skip | | epilogues.go:51:6:51:21 | skip | epilogues.go:51:1:54:1 | function declaration | -| epilogues.go:51:23:51:23 | argument corresponding to x | epilogues.go:51:23:51:23 | initialization of x | -| epilogues.go:51:23:51:23 | initialization of x | epilogues.go:51:31:51:31 | zero value for n | -| epilogues.go:51:31:51:31 | implicit read of n | epilogues.go:51:1:54:1 | exit | -| epilogues.go:51:31:51:31 | initialization of n | epilogues.go:52:2:52:2 | skip | -| epilogues.go:51:31:51:31 | zero value for n | epilogues.go:51:31:51:31 | initialization of n | -| epilogues.go:52:2:52:2 | assignment to n | epilogues.go:53:2:53:7 | return statement | +| epilogues.go:51:23:51:23 | x | epilogues.go:51:23:51:23 | x | +| epilogues.go:51:23:51:23 | x | epilogues.go:51:38:54:1 | result-zero-init:0 block statement | +| epilogues.go:51:38:54:1 | result-init:0 block statement | epilogues.go:52:2:52:2 | skip | +| epilogues.go:51:38:54:1 | result-read:0 block statement | epilogues.go:51:1:54:1 | exit | +| epilogues.go:51:38:54:1 | result-zero-init:0 block statement | epilogues.go:51:38:54:1 | result-init:0 block statement | | epilogues.go:52:2:52:2 | skip | epilogues.go:52:6:52:6 | x | +| epilogues.go:52:2:52:10 | assign:0 ... = ... | epilogues.go:53:2:53:7 | return statement | | epilogues.go:52:6:52:6 | x | epilogues.go:52:10:52:10 | 1 | -| epilogues.go:52:6:52:10 | ...+... | epilogues.go:52:2:52:2 | assignment to n | +| epilogues.go:52:6:52:10 | ...+... | epilogues.go:52:2:52:10 | assign:0 ... = ... | | epilogues.go:52:10:52:10 | 1 | epilogues.go:52:6:52:10 | ...+... | -| epilogues.go:53:2:53:7 | return statement | epilogues.go:51:31:51:31 | implicit read of n | -| epilogues.go:59:1:62:1 | entry | epilogues.go:59:27:59:27 | argument corresponding to l | +| epilogues.go:53:2:53:7 | return statement | epilogues.go:51:38:54:1 | result-read:0 block statement | +| epilogues.go:59:1:62:1 | entry | epilogues.go:59:27:59:27 | l | | epilogues.go:59:1:62:1 | function declaration | epilogues.go:66:6:66:26 | skip | | epilogues.go:59:6:59:25 | skip | epilogues.go:59:1:62:1 | function declaration | -| epilogues.go:59:27:59:27 | argument corresponding to l | epilogues.go:59:27:59:27 | initialization of l | -| epilogues.go:59:27:59:27 | initialization of l | epilogues.go:59:41:59:45 | argument corresponding to items | -| epilogues.go:59:41:59:45 | argument corresponding to items | epilogues.go:59:41:59:45 | initialization of items | -| epilogues.go:59:41:59:45 | initialization of items | epilogues.go:60:8:60:8 | l | +| epilogues.go:59:27:59:27 | l | epilogues.go:59:27:59:27 | l | +| epilogues.go:59:27:59:27 | l | epilogues.go:59:41:59:45 | items | +| epilogues.go:59:41:59:45 | items | epilogues.go:59:41:59:45 | items | +| epilogues.go:59:41:59:45 | items | epilogues.go:60:8:60:8 | l | | epilogues.go:60:2:60:33 | defer statement | epilogues.go:61:2:61:12 | selection of Println | | epilogues.go:60:8:60:8 | l | epilogues.go:60:8:60:12 | selection of log | | epilogues.go:60:8:60:12 | selection of log | epilogues.go:60:14:60:20 | "count" | @@ -161,16 +161,16 @@ | epilogues.go:61:28:61:30 | len | epilogues.go:61:32:61:36 | items | | epilogues.go:61:28:61:37 | call to len | epilogues.go:61:2:61:38 | call to Println | | epilogues.go:61:32:61:36 | items | epilogues.go:61:28:61:37 | call to len | -| epilogues.go:66:1:71:1 | entry | epilogues.go:66:28:66:33 | argument corresponding to prefix | +| epilogues.go:66:1:71:1 | entry | epilogues.go:66:28:66:33 | prefix | | epilogues.go:66:1:71:1 | function declaration | epilogues.go:77:6:77:20 | skip | | epilogues.go:66:6:66:26 | skip | epilogues.go:66:1:71:1 | function declaration | -| epilogues.go:66:28:66:33 | argument corresponding to prefix | epilogues.go:66:28:66:33 | initialization of prefix | -| epilogues.go:66:28:66:33 | initialization of prefix | epilogues.go:67:2:67:2 | skip | -| epilogues.go:67:2:67:2 | assignment to l | epilogues.go:68:8:68:8 | l | +| epilogues.go:66:28:66:33 | prefix | epilogues.go:66:28:66:33 | prefix | +| epilogues.go:66:28:66:33 | prefix | epilogues.go:67:2:67:2 | skip | | epilogues.go:67:2:67:2 | skip | epilogues.go:67:7:67:31 | struct literal | +| epilogues.go:67:2:67:31 | assign:0 ... := ... | epilogues.go:68:8:68:8 | l | | epilogues.go:67:7:67:31 | struct literal | epilogues.go:67:25:67:30 | prefix | -| epilogues.go:67:17:67:30 | init of key-value pair | epilogues.go:67:2:67:2 | assignment to l | -| epilogues.go:67:25:67:30 | prefix | epilogues.go:67:17:67:30 | init of key-value pair | +| epilogues.go:67:17:67:30 | lit-init key-value pair | epilogues.go:67:2:67:31 | assign:0 ... := ... | +| epilogues.go:67:25:67:30 | prefix | epilogues.go:67:17:67:30 | lit-init key-value pair | | epilogues.go:68:2:68:24 | defer statement | epilogues.go:69:10:69:10 | l | | epilogues.go:68:8:68:8 | l | epilogues.go:68:8:68:17 | selection of logValue | | epilogues.go:68:8:68:17 | selection of logValue | epilogues.go:68:19:68:23 | "bye" | @@ -186,19 +186,19 @@ | epilogues.go:70:2:70:12 | selection of Println | epilogues.go:70:14:70:19 | "body" | | epilogues.go:70:2:70:20 | call to Println | epilogues.go:69:8:69:25 | call to log | | epilogues.go:70:14:70:19 | "body" | epilogues.go:70:2:70:20 | call to Println | -| epilogues.go:77:1:82:1 | entry | epilogues.go:77:22:77:22 | argument corresponding to x | +| epilogues.go:77:1:82:1 | entry | epilogues.go:77:22:77:22 | x | | epilogues.go:77:1:82:1 | function declaration | epilogues.go:87:6:87:20 | skip | | epilogues.go:77:6:77:20 | skip | epilogues.go:77:1:82:1 | function declaration | -| epilogues.go:77:22:77:22 | argument corresponding to x | epilogues.go:77:22:77:22 | initialization of x | -| epilogues.go:77:22:77:22 | initialization of x | epilogues.go:78:8:80:2 | function literal | +| epilogues.go:77:22:77:22 | x | epilogues.go:77:22:77:22 | x | +| epilogues.go:77:22:77:22 | x | epilogues.go:78:8:80:2 | function literal | | epilogues.go:78:2:80:15 | defer statement | epilogues.go:81:2:81:12 | selection of Println | -| epilogues.go:78:8:80:2 | entry | epilogues.go:78:13:78:17 | argument corresponding to label | +| epilogues.go:78:8:80:2 | entry | epilogues.go:78:13:78:17 | label | | epilogues.go:78:8:80:2 | function literal | epilogues.go:80:4:80:9 | "done" | | epilogues.go:78:8:80:15 | function call | epilogues.go:77:1:82:1 | exit | -| epilogues.go:78:13:78:17 | argument corresponding to label | epilogues.go:78:13:78:17 | initialization of label | -| epilogues.go:78:13:78:17 | initialization of label | epilogues.go:78:27:78:27 | argument corresponding to n | -| epilogues.go:78:27:78:27 | argument corresponding to n | epilogues.go:78:27:78:27 | initialization of n | -| epilogues.go:78:27:78:27 | initialization of n | epilogues.go:79:3:79:13 | selection of Println | +| epilogues.go:78:13:78:17 | label | epilogues.go:78:13:78:17 | label | +| epilogues.go:78:13:78:17 | label | epilogues.go:78:27:78:27 | n | +| epilogues.go:78:27:78:27 | n | epilogues.go:78:27:78:27 | n | +| epilogues.go:78:27:78:27 | n | epilogues.go:79:3:79:13 | selection of Println | | epilogues.go:79:3:79:13 | selection of Println | epilogues.go:79:15:79:19 | label | | epilogues.go:79:3:79:23 | call to Println | epilogues.go:78:8:80:2 | exit | | epilogues.go:79:15:79:19 | label | epilogues.go:79:22:79:22 | n | @@ -211,23 +211,23 @@ | epilogues.go:81:2:81:23 | call to Println | epilogues.go:78:8:80:15 | function call | | epilogues.go:81:14:81:19 | "body" | epilogues.go:81:22:81:22 | x | | epilogues.go:81:22:81:22 | x | epilogues.go:81:2:81:23 | call to Println | -| epilogues.go:87:1:98:1 | entry | epilogues.go:87:22:87:22 | argument corresponding to x | +| epilogues.go:87:1:98:1 | entry | epilogues.go:87:22:87:22 | x | | epilogues.go:87:1:98:1 | function declaration | epilogues.go:102:6:102:24 | skip | | epilogues.go:87:6:87:20 | skip | epilogues.go:87:1:98:1 | function declaration | -| epilogues.go:87:22:87:22 | argument corresponding to x | epilogues.go:87:22:87:22 | initialization of x | -| epilogues.go:87:22:87:22 | initialization of x | epilogues.go:87:30:87:35 | zero value for result | -| epilogues.go:87:30:87:35 | implicit read of result | epilogues.go:87:1:98:1 | exit | -| epilogues.go:87:30:87:35 | initialization of result | epilogues.go:88:8:92:2 | function literal | -| epilogues.go:87:30:87:35 | zero value for result | epilogues.go:87:30:87:35 | initialization of result | +| epilogues.go:87:22:87:22 | x | epilogues.go:87:22:87:22 | x | +| epilogues.go:87:22:87:22 | x | epilogues.go:87:42:98:1 | result-zero-init:0 block statement | +| epilogues.go:87:42:98:1 | result-init:0 block statement | epilogues.go:88:8:92:2 | function literal | +| epilogues.go:87:42:98:1 | result-read:0 block statement | epilogues.go:87:1:98:1 | exit | +| epilogues.go:87:42:98:1 | result-zero-init:0 block statement | epilogues.go:87:42:98:1 | result-init:0 block statement | | epilogues.go:88:2:92:4 | defer statement | epilogues.go:93:5:93:5 | x | | epilogues.go:88:8:92:2 | entry | epilogues.go:89:6:89:6 | skip | | epilogues.go:88:8:92:2 | function literal | epilogues.go:88:2:92:4 | defer statement | | epilogues.go:88:8:92:4 | function call | epilogues.go:87:1:98:1 | exit | -| epilogues.go:88:8:92:4 | function call | epilogues.go:87:30:87:35 | implicit read of result | -| epilogues.go:89:6:89:6 | assignment to r | epilogues.go:89:22:89:22 | r | +| epilogues.go:88:8:92:4 | function call | epilogues.go:87:42:98:1 | result-read:0 block statement | | epilogues.go:89:6:89:6 | skip | epilogues.go:89:11:89:17 | recover | +| epilogues.go:89:6:89:19 | assign:0 ... := ... | epilogues.go:89:22:89:22 | r | | epilogues.go:89:11:89:17 | recover | epilogues.go:89:11:89:19 | call to recover | -| epilogues.go:89:11:89:19 | call to recover | epilogues.go:89:6:89:6 | assignment to r | +| epilogues.go:89:11:89:19 | call to recover | epilogues.go:89:6:89:19 | assign:0 ... := ... | | epilogues.go:89:22:89:22 | r | epilogues.go:89:27:89:29 | nil | | epilogues.go:89:22:89:29 | ...!=... | epilogues.go:88:8:92:2 | exit | | epilogues.go:89:22:89:29 | ...!=... | epilogues.go:89:22:89:29 | ...!=... is false | @@ -235,9 +235,9 @@ | epilogues.go:89:22:89:29 | ...!=... is false | epilogues.go:88:8:92:2 | exit | | epilogues.go:89:22:89:29 | ...!=... is true | epilogues.go:90:4:90:9 | skip | | epilogues.go:89:27:89:29 | nil | epilogues.go:89:22:89:29 | ...!=... | -| epilogues.go:90:4:90:9 | assignment to result | epilogues.go:88:8:92:2 | exit | | epilogues.go:90:4:90:9 | skip | epilogues.go:90:13:90:14 | -... | -| epilogues.go:90:13:90:14 | -... | epilogues.go:90:4:90:9 | assignment to result | +| epilogues.go:90:4:90:14 | assign:0 ... = ... | epilogues.go:88:8:92:2 | exit | +| epilogues.go:90:13:90:14 | -... | epilogues.go:90:4:90:14 | assign:0 ... = ... | | epilogues.go:93:5:93:5 | x | epilogues.go:93:9:93:9 | 0 | | epilogues.go:93:5:93:9 | ...<... | epilogues.go:93:5:93:9 | ...<... is false | | epilogues.go:93:5:93:9 | ...<... | epilogues.go:93:5:93:9 | ...<... is true | @@ -247,29 +247,29 @@ | epilogues.go:94:3:94:7 | panic | epilogues.go:94:9:94:13 | "neg" | | epilogues.go:94:3:94:14 | call to panic | epilogues.go:88:8:92:4 | function call | | epilogues.go:94:9:94:13 | "neg" | epilogues.go:94:3:94:14 | call to panic | -| epilogues.go:96:2:96:7 | assignment to result | epilogues.go:97:9:97:14 | result | | epilogues.go:96:2:96:7 | skip | epilogues.go:96:11:96:11 | x | +| epilogues.go:96:2:96:15 | assign:0 ... = ... | epilogues.go:97:9:97:14 | result | | epilogues.go:96:11:96:11 | x | epilogues.go:96:15:96:15 | x | -| epilogues.go:96:11:96:15 | ...*... | epilogues.go:96:2:96:7 | assignment to result | +| epilogues.go:96:11:96:15 | ...*... | epilogues.go:96:2:96:15 | assign:0 ... = ... | | epilogues.go:96:15:96:15 | x | epilogues.go:96:11:96:15 | ...*... | +| epilogues.go:97:2:97:14 | result-write:0 return statement | epilogues.go:97:2:97:14 | return statement | | epilogues.go:97:2:97:14 | return statement | epilogues.go:88:8:92:4 | function call | -| epilogues.go:97:9:97:14 | implicit write of result | epilogues.go:97:2:97:14 | return statement | -| epilogues.go:97:9:97:14 | result | epilogues.go:97:9:97:14 | implicit write of result | -| epilogues.go:102:1:110:1 | entry | epilogues.go:102:26:102:26 | argument corresponding to x | +| epilogues.go:97:9:97:14 | result | epilogues.go:97:2:97:14 | result-write:0 return statement | +| epilogues.go:102:1:110:1 | entry | epilogues.go:102:26:102:26 | x | | epilogues.go:102:1:110:1 | function declaration | epilogues.go:115:6:115:22 | skip | | epilogues.go:102:6:102:24 | skip | epilogues.go:102:1:110:1 | function declaration | -| epilogues.go:102:26:102:26 | argument corresponding to x | epilogues.go:102:26:102:26 | initialization of x | -| epilogues.go:102:26:102:26 | initialization of x | epilogues.go:102:34:102:35 | zero value for ok | -| epilogues.go:102:34:102:35 | implicit read of ok | epilogues.go:102:43:102:43 | implicit read of n | -| epilogues.go:102:34:102:35 | initialization of ok | epilogues.go:102:43:102:43 | zero value for n | -| epilogues.go:102:34:102:35 | zero value for ok | epilogues.go:102:34:102:35 | initialization of ok | -| epilogues.go:102:43:102:43 | implicit read of n | epilogues.go:102:1:110:1 | exit | -| epilogues.go:102:43:102:43 | initialization of n | epilogues.go:103:8:103:17 | epiRecover | -| epilogues.go:102:43:102:43 | zero value for n | epilogues.go:102:43:102:43 | initialization of n | +| epilogues.go:102:26:102:26 | x | epilogues.go:102:26:102:26 | x | +| epilogues.go:102:26:102:26 | x | epilogues.go:102:50:110:1 | result-zero-init:0 block statement | +| epilogues.go:102:50:110:1 | result-init:0 block statement | epilogues.go:102:50:110:1 | result-zero-init:1 block statement | +| epilogues.go:102:50:110:1 | result-init:1 block statement | epilogues.go:103:8:103:17 | epiRecover | +| epilogues.go:102:50:110:1 | result-read:0 block statement | epilogues.go:102:50:110:1 | result-read:1 block statement | +| epilogues.go:102:50:110:1 | result-read:1 block statement | epilogues.go:102:1:110:1 | exit | +| epilogues.go:102:50:110:1 | result-zero-init:0 block statement | epilogues.go:102:50:110:1 | result-init:0 block statement | +| epilogues.go:102:50:110:1 | result-zero-init:1 block statement | epilogues.go:102:50:110:1 | result-init:1 block statement | | epilogues.go:103:2:103:19 | defer statement | epilogues.go:104:5:104:5 | x | | epilogues.go:103:8:103:17 | epiRecover | epilogues.go:103:2:103:19 | defer statement | | epilogues.go:103:8:103:19 | call to epiRecover | epilogues.go:102:1:110:1 | exit | -| epilogues.go:103:8:103:19 | call to epiRecover | epilogues.go:102:34:102:35 | implicit read of ok | +| epilogues.go:103:8:103:19 | call to epiRecover | epilogues.go:102:50:110:1 | result-read:0 block statement | | epilogues.go:104:5:104:5 | x | epilogues.go:104:10:104:10 | 0 | | epilogues.go:104:5:104:10 | ...==... | epilogues.go:104:5:104:10 | ...==... is false | | epilogues.go:104:5:104:10 | ...==... | epilogues.go:104:5:104:10 | ...==... is true | @@ -277,12 +277,12 @@ | epilogues.go:104:5:104:10 | ...==... is true | epilogues.go:105:3:105:8 | return statement | | epilogues.go:104:10:104:10 | 0 | epilogues.go:104:5:104:10 | ...==... | | epilogues.go:105:3:105:8 | return statement | epilogues.go:103:8:103:19 | call to epiRecover | -| epilogues.go:107:2:107:2 | assignment to n | epilogues.go:108:2:108:3 | skip | | epilogues.go:107:2:107:2 | skip | epilogues.go:107:6:107:6 | x | -| epilogues.go:107:6:107:6 | x | epilogues.go:107:2:107:2 | assignment to n | -| epilogues.go:108:2:108:3 | assignment to ok | epilogues.go:109:2:109:7 | return statement | +| epilogues.go:107:2:107:6 | assign:0 ... = ... | epilogues.go:108:2:108:3 | skip | +| epilogues.go:107:6:107:6 | x | epilogues.go:107:2:107:6 | assign:0 ... = ... | | epilogues.go:108:2:108:3 | skip | epilogues.go:108:7:108:10 | true | -| epilogues.go:108:7:108:10 | true | epilogues.go:108:2:108:3 | assignment to ok | +| epilogues.go:108:2:108:10 | assign:0 ... = ... | epilogues.go:109:2:109:7 | return statement | +| epilogues.go:108:7:108:10 | true | epilogues.go:108:2:108:10 | assign:0 ... = ... | | epilogues.go:109:2:109:7 | return statement | epilogues.go:103:8:103:19 | call to epiRecover | | epilogues.go:115:1:118:1 | entry | epilogues.go:116:8:116:17 | epiRecover | | epilogues.go:115:1:118:1 | function declaration | epilogues.go:0:0:0:0 | exit | @@ -296,33 +296,33 @@ | equalitytests.go:0:0:0:0 | entry | equalitytests.go:3:1:5:1 | skip | | equalitytests.go:3:1:5:1 | skip | equalitytests.go:7:1:9:1 | skip | | equalitytests.go:7:1:9:1 | skip | equalitytests.go:11:6:11:18 | skip | -| equalitytests.go:11:1:13:1 | entry | equalitytests.go:11:20:11:21 | argument corresponding to i1 | +| equalitytests.go:11:1:13:1 | entry | equalitytests.go:11:20:11:21 | i1 | | equalitytests.go:11:1:13:1 | function declaration | equalitytests.go:0:0:0:0 | exit | | equalitytests.go:11:6:11:18 | skip | equalitytests.go:11:1:13:1 | function declaration | -| equalitytests.go:11:20:11:21 | argument corresponding to i1 | equalitytests.go:11:20:11:21 | initialization of i1 | -| equalitytests.go:11:20:11:21 | initialization of i1 | equalitytests.go:11:28:11:29 | argument corresponding to i2 | -| equalitytests.go:11:28:11:29 | argument corresponding to i2 | equalitytests.go:11:28:11:29 | initialization of i2 | -| equalitytests.go:11:28:11:29 | initialization of i2 | equalitytests.go:11:36:11:37 | argument corresponding to e1 | -| equalitytests.go:11:36:11:37 | argument corresponding to e1 | equalitytests.go:11:36:11:37 | initialization of e1 | -| equalitytests.go:11:36:11:37 | initialization of e1 | equalitytests.go:11:46:11:47 | argument corresponding to e2 | -| equalitytests.go:11:46:11:47 | argument corresponding to e2 | equalitytests.go:11:46:11:47 | initialization of e2 | -| equalitytests.go:11:46:11:47 | initialization of e2 | equalitytests.go:11:56:11:57 | argument corresponding to s1 | -| equalitytests.go:11:56:11:57 | argument corresponding to s1 | equalitytests.go:11:56:11:57 | initialization of s1 | -| equalitytests.go:11:56:11:57 | initialization of s1 | equalitytests.go:11:83:11:84 | argument corresponding to s2 | -| equalitytests.go:11:83:11:84 | argument corresponding to s2 | equalitytests.go:11:83:11:84 | initialization of s2 | -| equalitytests.go:11:83:11:84 | initialization of s2 | equalitytests.go:11:110:11:111 | argument corresponding to s3 | -| equalitytests.go:11:110:11:111 | argument corresponding to s3 | equalitytests.go:11:110:11:111 | initialization of s3 | -| equalitytests.go:11:110:11:111 | initialization of s3 | equalitytests.go:11:134:11:135 | argument corresponding to s4 | -| equalitytests.go:11:134:11:135 | argument corresponding to s4 | equalitytests.go:11:134:11:135 | initialization of s4 | -| equalitytests.go:11:134:11:135 | initialization of s4 | equalitytests.go:11:158:11:159 | argument corresponding to a1 | -| equalitytests.go:11:158:11:159 | argument corresponding to a1 | equalitytests.go:11:158:11:159 | initialization of a1 | -| equalitytests.go:11:158:11:159 | initialization of a1 | equalitytests.go:11:171:11:172 | argument corresponding to a2 | -| equalitytests.go:11:171:11:172 | argument corresponding to a2 | equalitytests.go:11:171:11:172 | initialization of a2 | -| equalitytests.go:11:171:11:172 | initialization of a2 | equalitytests.go:11:184:11:185 | argument corresponding to a3 | -| equalitytests.go:11:184:11:185 | argument corresponding to a3 | equalitytests.go:11:184:11:185 | initialization of a3 | -| equalitytests.go:11:184:11:185 | initialization of a3 | equalitytests.go:11:195:11:196 | argument corresponding to a4 | -| equalitytests.go:11:195:11:196 | argument corresponding to a4 | equalitytests.go:11:195:11:196 | initialization of a4 | -| equalitytests.go:11:195:11:196 | initialization of a4 | equalitytests.go:12:9:12:10 | i1 | +| equalitytests.go:11:20:11:21 | i1 | equalitytests.go:11:20:11:21 | i1 | +| equalitytests.go:11:20:11:21 | i1 | equalitytests.go:11:28:11:29 | i2 | +| equalitytests.go:11:28:11:29 | i2 | equalitytests.go:11:28:11:29 | i2 | +| equalitytests.go:11:28:11:29 | i2 | equalitytests.go:11:36:11:37 | e1 | +| equalitytests.go:11:36:11:37 | e1 | equalitytests.go:11:36:11:37 | e1 | +| equalitytests.go:11:36:11:37 | e1 | equalitytests.go:11:46:11:47 | e2 | +| equalitytests.go:11:46:11:47 | e2 | equalitytests.go:11:46:11:47 | e2 | +| equalitytests.go:11:46:11:47 | e2 | equalitytests.go:11:56:11:57 | s1 | +| equalitytests.go:11:56:11:57 | s1 | equalitytests.go:11:56:11:57 | s1 | +| equalitytests.go:11:56:11:57 | s1 | equalitytests.go:11:83:11:84 | s2 | +| equalitytests.go:11:83:11:84 | s2 | equalitytests.go:11:83:11:84 | s2 | +| equalitytests.go:11:83:11:84 | s2 | equalitytests.go:11:110:11:111 | s3 | +| equalitytests.go:11:110:11:111 | s3 | equalitytests.go:11:110:11:111 | s3 | +| equalitytests.go:11:110:11:111 | s3 | equalitytests.go:11:134:11:135 | s4 | +| equalitytests.go:11:134:11:135 | s4 | equalitytests.go:11:134:11:135 | s4 | +| equalitytests.go:11:134:11:135 | s4 | equalitytests.go:11:158:11:159 | a1 | +| equalitytests.go:11:158:11:159 | a1 | equalitytests.go:11:158:11:159 | a1 | +| equalitytests.go:11:158:11:159 | a1 | equalitytests.go:11:171:11:172 | a2 | +| equalitytests.go:11:171:11:172 | a2 | equalitytests.go:11:171:11:172 | a2 | +| equalitytests.go:11:171:11:172 | a2 | equalitytests.go:11:184:11:185 | a3 | +| equalitytests.go:11:184:11:185 | a3 | equalitytests.go:11:184:11:185 | a3 | +| equalitytests.go:11:184:11:185 | a3 | equalitytests.go:11:195:11:196 | a4 | +| equalitytests.go:11:195:11:196 | a4 | equalitytests.go:11:195:11:196 | a4 | +| equalitytests.go:11:195:11:196 | a4 | equalitytests.go:12:9:12:10 | i1 | | equalitytests.go:12:2:12:76 | return statement | equalitytests.go:11:1:13:1 | exit | | equalitytests.go:12:9:12:10 | i1 | equalitytests.go:12:15:12:16 | i2 | | equalitytests.go:12:9:12:16 | ...==... | equalitytests.go:12:9:12:16 | ...==... is false | @@ -368,35 +368,35 @@ | exprs.go:5:1:26:1 | entry | exprs.go:6:6:6:6 | skip | | exprs.go:5:1:26:1 | function declaration | exprs.go:28:6:28:10 | skip | | exprs.go:5:6:5:9 | skip | exprs.go:5:1:26:1 | function declaration | -| exprs.go:6:6:6:6 | assignment to i | exprs.go:6:9:6:9 | assignment to j | | exprs.go:6:6:6:6 | skip | exprs.go:6:9:6:9 | skip | -| exprs.go:6:9:6:9 | assignment to j | exprs.go:7:6:7:6 | skip | +| exprs.go:6:6:6:26 | assign:0 value declaration specifier | exprs.go:6:6:6:26 | assign:1 value declaration specifier | +| exprs.go:6:6:6:26 | assign:1 value declaration specifier | exprs.go:7:6:7:6 | skip | | exprs.go:6:9:6:9 | skip | exprs.go:6:13:6:13 | 0 | | exprs.go:6:13:6:13 | 0 | exprs.go:6:16:6:26 | ...+... | -| exprs.go:6:16:6:26 | ...+... | exprs.go:6:6:6:6 | assignment to i | -| exprs.go:7:6:7:6 | assignment to k | exprs.go:8:2:8:2 | skip | +| exprs.go:6:16:6:26 | ...+... | exprs.go:6:6:6:26 | assign:0 value declaration specifier | | exprs.go:7:6:7:6 | skip | exprs.go:7:10:7:10 | i | +| exprs.go:7:6:7:16 | assign:0 value declaration specifier | exprs.go:8:2:8:2 | skip | | exprs.go:7:10:7:10 | i | exprs.go:7:14:7:14 | 2 | -| exprs.go:7:10:7:16 | ...+... | exprs.go:7:6:7:6 | assignment to k | +| exprs.go:7:10:7:16 | ...+... | exprs.go:7:6:7:16 | assign:0 value declaration specifier | | exprs.go:7:14:7:14 | 2 | exprs.go:7:16:7:16 | j | | exprs.go:7:14:7:16 | ...*... | exprs.go:7:10:7:16 | ...+... | | exprs.go:7:16:7:16 | j | exprs.go:7:14:7:16 | ...*... | -| exprs.go:8:2:8:2 | assignment to s | exprs.go:9:2:9:3 | skip | | exprs.go:8:2:8:2 | skip | exprs.go:8:7:8:12 | "k = " | +| exprs.go:8:2:8:24 | assign:0 ... := ... | exprs.go:9:2:9:3 | skip | | exprs.go:8:7:8:12 | "k = " | exprs.go:8:23:8:23 | k | -| exprs.go:8:7:8:24 | ...+... | exprs.go:8:2:8:2 | assignment to s | +| exprs.go:8:7:8:24 | ...+... | exprs.go:8:2:8:24 | assign:0 ... := ... | | exprs.go:8:16:8:24 | type conversion | exprs.go:8:7:8:24 | ...+... | | exprs.go:8:23:8:23 | k | exprs.go:8:16:8:24 | type conversion | -| exprs.go:9:2:9:3 | assignment to fn | exprs.go:10:2:10:8 | skip | | exprs.go:9:2:9:3 | skip | exprs.go:9:8:9:61 | function literal | -| exprs.go:9:8:9:61 | entry | exprs.go:9:13:9:13 | argument corresponding to a | -| exprs.go:9:8:9:61 | function literal | exprs.go:9:2:9:3 | assignment to fn | -| exprs.go:9:13:9:13 | argument corresponding to a | exprs.go:9:13:9:13 | initialization of a | -| exprs.go:9:13:9:13 | initialization of a | exprs.go:9:16:9:16 | argument corresponding to b | -| exprs.go:9:16:9:16 | argument corresponding to b | exprs.go:9:16:9:16 | initialization of b | -| exprs.go:9:16:9:16 | initialization of b | exprs.go:9:23:9:23 | argument corresponding to z | -| exprs.go:9:23:9:23 | argument corresponding to z | exprs.go:9:23:9:23 | initialization of z | -| exprs.go:9:23:9:23 | initialization of z | exprs.go:9:48:9:48 | a | +| exprs.go:9:2:9:61 | assign:0 ... := ... | exprs.go:10:2:10:8 | skip | +| exprs.go:9:8:9:61 | entry | exprs.go:9:13:9:13 | a | +| exprs.go:9:8:9:61 | function literal | exprs.go:9:2:9:61 | assign:0 ... := ... | +| exprs.go:9:13:9:13 | a | exprs.go:9:13:9:13 | a | +| exprs.go:9:13:9:13 | a | exprs.go:9:16:9:16 | b | +| exprs.go:9:16:9:16 | b | exprs.go:9:16:9:16 | b | +| exprs.go:9:16:9:16 | b | exprs.go:9:23:9:23 | z | +| exprs.go:9:23:9:23 | z | exprs.go:9:23:9:23 | z | +| exprs.go:9:23:9:23 | z | exprs.go:9:48:9:48 | a | | exprs.go:9:41:9:59 | return statement | exprs.go:9:8:9:61 | exit | | exprs.go:9:48:9:48 | a | exprs.go:9:50:9:50 | b | | exprs.go:9:48:9:50 | ...*... | exprs.go:9:58:9:58 | z | @@ -404,148 +404,148 @@ | exprs.go:9:50:9:50 | b | exprs.go:9:48:9:50 | ...*... | | exprs.go:9:54:9:59 | type conversion | exprs.go:9:48:9:59 | ...<... | | exprs.go:9:58:9:58 | z | exprs.go:9:54:9:59 | type conversion | -| exprs.go:10:2:10:8 | assignment to struct1 | exprs.go:11:2:11:8 | skip | | exprs.go:10:2:10:8 | skip | exprs.go:10:13:10:32 | struct literal | -| exprs.go:10:13:10:32 | struct literal | exprs.go:10:2:10:8 | assignment to struct1 | -| exprs.go:11:2:11:8 | assignment to struct2 | exprs.go:15:2:15:8 | skip | +| exprs.go:10:2:10:32 | assign:0 ... := ... | exprs.go:11:2:11:8 | skip | +| exprs.go:10:13:10:32 | struct literal | exprs.go:10:2:10:32 | assign:0 ... := ... | | exprs.go:11:2:11:8 | skip | exprs.go:11:13:14:21 | struct literal | +| exprs.go:11:2:14:21 | assign:0 ... := ... | exprs.go:15:2:15:8 | skip | | exprs.go:11:13:14:21 | struct literal | exprs.go:14:4:14:4 | k | -| exprs.go:14:4:14:4 | init of k | exprs.go:14:7:14:8 | fn | -| exprs.go:14:4:14:4 | k | exprs.go:14:4:14:4 | init of k | +| exprs.go:14:4:14:4 | k | exprs.go:14:4:14:4 | lit-init k | +| exprs.go:14:4:14:4 | lit-init k | exprs.go:14:7:14:8 | fn | | exprs.go:14:7:14:8 | fn | exprs.go:14:10:14:10 | i | | exprs.go:14:7:14:20 | call to fn | exprs.go:5:1:26:1 | exit | -| exprs.go:14:7:14:20 | call to fn | exprs.go:14:7:14:20 | init of call to fn | -| exprs.go:14:7:14:20 | init of call to fn | exprs.go:11:2:11:8 | assignment to struct2 | +| exprs.go:14:7:14:20 | call to fn | exprs.go:14:7:14:20 | lit-init call to fn | +| exprs.go:14:7:14:20 | lit-init call to fn | exprs.go:11:2:14:21 | assign:0 ... := ... | | exprs.go:14:10:14:10 | i | exprs.go:14:13:14:13 | j | | exprs.go:14:13:14:13 | j | exprs.go:14:16:14:19 | .../... | | exprs.go:14:16:14:19 | .../... | exprs.go:14:7:14:20 | call to fn | -| exprs.go:15:2:15:8 | assignment to struct3 | exprs.go:16:2:16:5 | skip | | exprs.go:15:2:15:8 | skip | exprs.go:15:13:15:58 | struct literal | +| exprs.go:15:2:15:58 | assign:0 ... := ... | exprs.go:16:2:16:5 | skip | | exprs.go:15:13:15:58 | struct literal | exprs.go:15:35:15:41 | struct1 | -| exprs.go:15:32:15:43 | init of key-value pair | exprs.go:15:49:15:55 | struct2 | +| exprs.go:15:32:15:43 | lit-init key-value pair | exprs.go:15:49:15:55 | struct2 | | exprs.go:15:35:15:41 | struct1 | exprs.go:15:35:15:43 | selection of x | -| exprs.go:15:35:15:43 | selection of x | exprs.go:15:32:15:43 | init of key-value pair | -| exprs.go:15:46:15:57 | init of key-value pair | exprs.go:15:2:15:8 | assignment to struct3 | +| exprs.go:15:35:15:43 | selection of x | exprs.go:15:32:15:43 | lit-init key-value pair | +| exprs.go:15:46:15:57 | lit-init key-value pair | exprs.go:15:2:15:58 | assign:0 ... := ... | | exprs.go:15:49:15:55 | struct2 | exprs.go:15:49:15:57 | selection of x | -| exprs.go:15:49:15:57 | selection of x | exprs.go:15:46:15:57 | init of key-value pair | -| exprs.go:16:2:16:5 | assignment to arr1 | exprs.go:17:2:17:5 | skip | +| exprs.go:15:49:15:57 | selection of x | exprs.go:15:46:15:57 | lit-init key-value pair | | exprs.go:16:2:16:5 | skip | exprs.go:16:10:16:26 | array literal | +| exprs.go:16:2:16:26 | assign:0 ... := ... | exprs.go:17:2:17:5 | skip | | exprs.go:16:10:16:26 | array literal | exprs.go:16:17:16:25 | element index | | exprs.go:16:17:16:23 | struct3 | exprs.go:16:17:16:25 | selection of x | | exprs.go:16:17:16:25 | element index | exprs.go:16:17:16:23 | struct3 | -| exprs.go:16:17:16:25 | init of selection of x | exprs.go:16:2:16:5 | assignment to arr1 | -| exprs.go:16:17:16:25 | selection of x | exprs.go:16:17:16:25 | init of selection of x | -| exprs.go:17:2:17:5 | assignment to arr2 | exprs.go:18:2:18:4 | skip | +| exprs.go:16:17:16:25 | lit-init selection of x | exprs.go:16:2:16:26 | assign:0 ... := ... | +| exprs.go:16:17:16:25 | selection of x | exprs.go:16:17:16:25 | lit-init selection of x | | exprs.go:17:2:17:5 | skip | exprs.go:17:10:17:40 | array literal | +| exprs.go:17:2:17:40 | assign:0 ... := ... | exprs.go:18:2:18:4 | skip | | exprs.go:17:10:17:40 | array literal | exprs.go:17:19:17:27 | element index | | exprs.go:17:19:17:25 | struct3 | exprs.go:17:19:17:27 | selection of x | | exprs.go:17:19:17:27 | element index | exprs.go:17:19:17:25 | struct3 | -| exprs.go:17:19:17:27 | init of selection of x | exprs.go:17:30:17:30 | 2 | -| exprs.go:17:19:17:27 | selection of x | exprs.go:17:19:17:27 | init of selection of x | +| exprs.go:17:19:17:27 | lit-init selection of x | exprs.go:17:30:17:30 | 2 | +| exprs.go:17:19:17:27 | selection of x | exprs.go:17:19:17:27 | lit-init selection of x | | exprs.go:17:30:17:30 | 2 | exprs.go:17:33:17:36 | arr1 | -| exprs.go:17:30:17:39 | init of key-value pair | exprs.go:17:2:17:5 | assignment to arr2 | +| exprs.go:17:30:17:39 | lit-init key-value pair | exprs.go:17:2:17:40 | assign:0 ... := ... | | exprs.go:17:33:17:36 | arr1 | exprs.go:17:38:17:38 | 0 | | exprs.go:17:33:17:39 | index expression | exprs.go:5:1:26:1 | exit | -| exprs.go:17:33:17:39 | index expression | exprs.go:17:30:17:39 | init of key-value pair | +| exprs.go:17:33:17:39 | index expression | exprs.go:17:30:17:39 | lit-init key-value pair | | exprs.go:17:38:17:38 | 0 | exprs.go:17:33:17:39 | index expression | -| exprs.go:18:2:18:4 | assignment to slc | exprs.go:19:2:19:3 | skip | | exprs.go:18:2:18:4 | skip | exprs.go:18:9:18:22 | slice literal | +| exprs.go:18:2:18:22 | assign:0 ... := ... | exprs.go:19:2:19:3 | skip | | exprs.go:18:9:18:22 | slice literal | exprs.go:18:18:18:18 | element index | | exprs.go:18:18:18:18 | element index | exprs.go:18:18:18:18 | s | -| exprs.go:18:18:18:18 | init of s | exprs.go:18:21:18:21 | element index | -| exprs.go:18:18:18:18 | s | exprs.go:18:18:18:18 | init of s | +| exprs.go:18:18:18:18 | lit-init s | exprs.go:18:21:18:21 | element index | +| exprs.go:18:18:18:18 | s | exprs.go:18:18:18:18 | lit-init s | | exprs.go:18:21:18:21 | element index | exprs.go:18:21:18:21 | s | -| exprs.go:18:21:18:21 | init of s | exprs.go:18:2:18:4 | assignment to slc | -| exprs.go:18:21:18:21 | s | exprs.go:18:21:18:21 | init of s | -| exprs.go:19:2:19:3 | assignment to mp | exprs.go:20:2:20:5 | skip | +| exprs.go:18:21:18:21 | lit-init s | exprs.go:18:2:18:22 | assign:0 ... := ... | +| exprs.go:18:21:18:21 | s | exprs.go:18:21:18:21 | lit-init s | | exprs.go:19:2:19:3 | skip | exprs.go:19:8:19:38 | map literal | +| exprs.go:19:2:19:38 | assign:0 ... := ... | exprs.go:20:2:20:5 | skip | | exprs.go:19:8:19:38 | map literal | exprs.go:19:23:19:25 | slc | | exprs.go:19:23:19:25 | slc | exprs.go:19:27:19:27 | 0 | | exprs.go:19:23:19:28 | index expression | exprs.go:5:1:26:1 | exit | | exprs.go:19:23:19:28 | index expression | exprs.go:19:31:19:34 | arr2 | -| exprs.go:19:23:19:37 | init of key-value pair | exprs.go:19:2:19:3 | assignment to mp | +| exprs.go:19:23:19:37 | lit-init key-value pair | exprs.go:19:2:19:38 | assign:0 ... := ... | | exprs.go:19:27:19:27 | 0 | exprs.go:19:23:19:28 | index expression | | exprs.go:19:31:19:34 | arr2 | exprs.go:19:36:19:36 | 1 | | exprs.go:19:31:19:37 | index expression | exprs.go:5:1:26:1 | exit | -| exprs.go:19:31:19:37 | index expression | exprs.go:19:23:19:37 | init of key-value pair | +| exprs.go:19:31:19:37 | index expression | exprs.go:19:23:19:37 | lit-init key-value pair | | exprs.go:19:36:19:36 | 1 | exprs.go:19:31:19:37 | index expression | -| exprs.go:20:2:20:5 | assignment to slc2 | exprs.go:21:2:21:5 | skip | | exprs.go:20:2:20:5 | skip | exprs.go:20:10:20:12 | slc | +| exprs.go:20:2:20:19 | assign:0 ... := ... | exprs.go:21:2:21:5 | skip | | exprs.go:20:10:20:12 | slc | exprs.go:20:14:20:14 | 1 | | exprs.go:20:10:20:19 | slice expression | exprs.go:5:1:26:1 | exit | -| exprs.go:20:10:20:19 | slice expression | exprs.go:20:2:20:5 | assignment to slc2 | +| exprs.go:20:10:20:19 | slice expression | exprs.go:20:2:20:19 | assign:0 ... := ... | | exprs.go:20:14:20:14 | 1 | exprs.go:20:16:20:16 | 2 | | exprs.go:20:16:20:16 | 2 | exprs.go:20:18:20:18 | 3 | | exprs.go:20:18:20:18 | 3 | exprs.go:20:10:20:19 | slice expression | -| exprs.go:21:2:21:5 | assignment to slc3 | exprs.go:22:2:22:5 | skip | | exprs.go:21:2:21:5 | skip | exprs.go:21:10:21:13 | slc2 | +| exprs.go:21:2:21:19 | assign:0 ... := ... | exprs.go:22:2:22:5 | skip | | exprs.go:21:10:21:13 | slc2 | exprs.go:21:10:21:19 | 0 | | exprs.go:21:10:21:19 | 0 | exprs.go:21:16:21:16 | 2 | | exprs.go:21:10:21:19 | slice expression | exprs.go:5:1:26:1 | exit | -| exprs.go:21:10:21:19 | slice expression | exprs.go:21:2:21:5 | assignment to slc3 | +| exprs.go:21:10:21:19 | slice expression | exprs.go:21:2:21:19 | assign:0 ... := ... | | exprs.go:21:16:21:16 | 2 | exprs.go:21:18:21:18 | 3 | | exprs.go:21:18:21:18 | 3 | exprs.go:21:10:21:19 | slice expression | -| exprs.go:22:2:22:5 | assignment to slc4 | exprs.go:23:2:23:5 | skip | | exprs.go:22:2:22:5 | skip | exprs.go:22:10:22:13 | slc3 | +| exprs.go:22:2:22:18 | assign:0 ... := ... | exprs.go:23:2:23:5 | skip | | exprs.go:22:10:22:13 | slc3 | exprs.go:22:15:22:15 | 0 | | exprs.go:22:10:22:18 | cap | exprs.go:22:10:22:18 | slice expression | | exprs.go:22:10:22:18 | slice expression | exprs.go:5:1:26:1 | exit | -| exprs.go:22:10:22:18 | slice expression | exprs.go:22:2:22:5 | assignment to slc4 | +| exprs.go:22:10:22:18 | slice expression | exprs.go:22:2:22:18 | assign:0 ... := ... | | exprs.go:22:15:22:15 | 0 | exprs.go:22:17:22:17 | 2 | | exprs.go:22:17:22:17 | 2 | exprs.go:22:10:22:18 | cap | -| exprs.go:23:2:23:5 | assignment to slc5 | exprs.go:24:2:24:5 | skip | | exprs.go:23:2:23:5 | skip | exprs.go:23:10:23:13 | slc4 | +| exprs.go:23:2:23:17 | assign:0 ... := ... | exprs.go:24:2:24:5 | skip | | exprs.go:23:10:23:13 | slc4 | exprs.go:23:15:23:15 | 0 | | exprs.go:23:10:23:17 | cap | exprs.go:23:10:23:17 | slice expression | | exprs.go:23:10:23:17 | len | exprs.go:23:10:23:17 | cap | | exprs.go:23:10:23:17 | slice expression | exprs.go:5:1:26:1 | exit | -| exprs.go:23:10:23:17 | slice expression | exprs.go:23:2:23:5 | assignment to slc5 | +| exprs.go:23:10:23:17 | slice expression | exprs.go:23:2:23:17 | assign:0 ... := ... | | exprs.go:23:15:23:15 | 0 | exprs.go:23:10:23:17 | len | -| exprs.go:24:2:24:5 | assignment to slc6 | exprs.go:25:9:25:34 | struct literal | | exprs.go:24:2:24:5 | skip | exprs.go:24:10:24:13 | slc5 | +| exprs.go:24:2:24:17 | assign:0 ... := ... | exprs.go:25:9:25:34 | struct literal | | exprs.go:24:10:24:13 | slc5 | exprs.go:24:10:24:17 | 0 | | exprs.go:24:10:24:17 | 0 | exprs.go:24:16:24:16 | 2 | | exprs.go:24:10:24:17 | cap | exprs.go:24:10:24:17 | slice expression | | exprs.go:24:10:24:17 | slice expression | exprs.go:5:1:26:1 | exit | -| exprs.go:24:10:24:17 | slice expression | exprs.go:24:2:24:5 | assignment to slc6 | +| exprs.go:24:10:24:17 | slice expression | exprs.go:24:2:24:17 | assign:0 ... := ... | | exprs.go:24:16:24:16 | 2 | exprs.go:24:10:24:17 | cap | | exprs.go:25:2:25:34 | return statement | exprs.go:5:1:26:1 | exit | | exprs.go:25:9:25:34 | struct literal | exprs.go:25:15:25:16 | mp | | exprs.go:25:15:25:16 | mp | exprs.go:25:18:25:18 | s | | exprs.go:25:15:25:19 | index expression | exprs.go:5:1:26:1 | exit | -| exprs.go:25:15:25:19 | index expression | exprs.go:25:15:25:19 | init of index expression | -| exprs.go:25:15:25:19 | init of index expression | exprs.go:25:22:25:24 | len | +| exprs.go:25:15:25:19 | index expression | exprs.go:25:15:25:19 | lit-init index expression | +| exprs.go:25:15:25:19 | lit-init index expression | exprs.go:25:22:25:24 | len | | exprs.go:25:18:25:18 | s | exprs.go:25:15:25:19 | index expression | | exprs.go:25:22:25:24 | len | exprs.go:25:26:25:29 | slc6 | -| exprs.go:25:22:25:33 | call to len | exprs.go:25:22:25:33 | init of call to len | -| exprs.go:25:22:25:33 | init of call to len | exprs.go:25:2:25:34 | return statement | +| exprs.go:25:22:25:33 | call to len | exprs.go:25:22:25:33 | lit-init call to len | +| exprs.go:25:22:25:33 | lit-init call to len | exprs.go:25:2:25:34 | return statement | | exprs.go:25:26:25:29 | slc6 | exprs.go:25:31:25:31 | 0 | | exprs.go:25:26:25:32 | index expression | exprs.go:5:1:26:1 | exit | | exprs.go:25:26:25:32 | index expression | exprs.go:25:22:25:33 | call to len | | exprs.go:25:31:25:31 | 0 | exprs.go:25:26:25:32 | index expression | -| exprs.go:28:1:30:1 | entry | exprs.go:28:12:28:14 | argument corresponding to arg | +| exprs.go:28:1:30:1 | entry | exprs.go:28:12:28:14 | arg | | exprs.go:28:1:30:1 | function declaration | exprs.go:32:6:32:10 | skip | | exprs.go:28:6:28:10 | skip | exprs.go:28:1:30:1 | function declaration | -| exprs.go:28:12:28:14 | argument corresponding to arg | exprs.go:28:12:28:14 | initialization of arg | -| exprs.go:28:12:28:14 | initialization of arg | exprs.go:29:9:29:11 | arg | +| exprs.go:28:12:28:14 | arg | exprs.go:28:12:28:14 | arg | +| exprs.go:28:12:28:14 | arg | exprs.go:29:9:29:11 | arg | | exprs.go:29:2:29:21 | return statement | exprs.go:28:1:30:1 | exit | | exprs.go:29:9:29:11 | arg | exprs.go:29:9:29:19 | type assertion | | exprs.go:29:9:29:19 | type assertion | exprs.go:28:1:30:1 | exit | | exprs.go:29:9:29:19 | type assertion | exprs.go:29:9:29:21 | selection of x | | exprs.go:29:9:29:21 | selection of x | exprs.go:29:2:29:21 | return statement | -| exprs.go:32:1:37:1 | entry | exprs.go:32:12:32:14 | argument corresponding to arg | +| exprs.go:32:1:37:1 | entry | exprs.go:32:12:32:14 | arg | | exprs.go:32:1:37:1 | function declaration | exprs.go:39:6:39:10 | skip | | exprs.go:32:6:32:10 | skip | exprs.go:32:1:37:1 | function declaration | -| exprs.go:32:12:32:14 | argument corresponding to arg | exprs.go:32:12:32:14 | initialization of arg | -| exprs.go:32:12:32:14 | initialization of arg | exprs.go:33:5:33:5 | skip | -| exprs.go:33:5:33:5 | assignment to p | exprs.go:33:5:33:24 | ... := ...[1] | +| exprs.go:32:12:32:14 | arg | exprs.go:32:12:32:14 | arg | +| exprs.go:32:12:32:14 | arg | exprs.go:33:5:33:5 | skip | | exprs.go:33:5:33:5 | skip | exprs.go:33:8:33:9 | skip | -| exprs.go:33:5:33:24 | ... := ...[0] | exprs.go:33:5:33:5 | assignment to p | -| exprs.go:33:5:33:24 | ... := ...[1] | exprs.go:33:8:33:9 | assignment to ok | -| exprs.go:33:8:33:9 | assignment to ok | exprs.go:33:27:33:28 | ok | +| exprs.go:33:5:33:24 | assign:0 ... := ... | exprs.go:33:5:33:24 | extract:1 ... := ... | +| exprs.go:33:5:33:24 | assign:1 ... := ... | exprs.go:33:27:33:28 | ok | +| exprs.go:33:5:33:24 | extract:0 ... := ... | exprs.go:33:5:33:24 | assign:0 ... := ... | +| exprs.go:33:5:33:24 | extract:1 ... := ... | exprs.go:33:5:33:24 | assign:1 ... := ... | | exprs.go:33:8:33:9 | skip | exprs.go:33:14:33:16 | arg | | exprs.go:33:14:33:16 | arg | exprs.go:33:14:33:24 | type assertion | -| exprs.go:33:14:33:24 | type assertion | exprs.go:33:5:33:24 | ... := ...[0] | +| exprs.go:33:14:33:24 | type assertion | exprs.go:33:5:33:24 | extract:0 ... := ... | | exprs.go:33:27:33:28 | ok | exprs.go:33:27:33:28 | ok is false | | exprs.go:33:27:33:28 | ok | exprs.go:33:27:33:28 | ok is true | | exprs.go:33:27:33:28 | ok is false | exprs.go:36:9:36:10 | -... | @@ -555,25 +555,25 @@ | exprs.go:34:10:34:12 | selection of x | exprs.go:34:3:34:12 | return statement | | exprs.go:36:2:36:10 | return statement | exprs.go:32:1:37:1 | exit | | exprs.go:36:9:36:10 | -... | exprs.go:36:2:36:10 | return statement | -| exprs.go:39:1:47:1 | entry | exprs.go:39:12:39:14 | argument corresponding to arg | +| exprs.go:39:1:47:1 | entry | exprs.go:39:12:39:14 | arg | | exprs.go:39:1:47:1 | function declaration | exprs.go:49:6:49:8 | skip | | exprs.go:39:6:39:10 | skip | exprs.go:39:1:47:1 | function declaration | -| exprs.go:39:12:39:14 | argument corresponding to arg | exprs.go:39:12:39:14 | initialization of arg | -| exprs.go:39:12:39:14 | initialization of arg | exprs.go:40:6:40:6 | skip | -| exprs.go:40:6:40:6 | assignment to p | exprs.go:41:6:41:7 | skip | -| exprs.go:40:6:40:6 | skip | exprs.go:40:6:40:6 | zero value for p | -| exprs.go:40:6:40:6 | zero value for p | exprs.go:40:6:40:6 | assignment to p | -| exprs.go:41:6:41:7 | assignment to ok | exprs.go:42:2:42:2 | skip | -| exprs.go:41:6:41:7 | skip | exprs.go:41:6:41:7 | zero value for ok | -| exprs.go:41:6:41:7 | zero value for ok | exprs.go:41:6:41:7 | assignment to ok | -| exprs.go:42:2:42:2 | assignment to p | exprs.go:42:2:42:20 | ... = ...[1] | +| exprs.go:39:12:39:14 | arg | exprs.go:39:12:39:14 | arg | +| exprs.go:39:12:39:14 | arg | exprs.go:40:6:40:6 | skip | +| exprs.go:40:6:40:6 | skip | exprs.go:40:6:40:12 | zero-init:0 value declaration specifier | +| exprs.go:40:6:40:12 | assign:0 value declaration specifier | exprs.go:41:6:41:7 | skip | +| exprs.go:40:6:40:12 | zero-init:0 value declaration specifier | exprs.go:40:6:40:12 | assign:0 value declaration specifier | +| exprs.go:41:6:41:7 | skip | exprs.go:41:6:41:12 | zero-init:0 value declaration specifier | +| exprs.go:41:6:41:12 | assign:0 value declaration specifier | exprs.go:42:2:42:2 | skip | +| exprs.go:41:6:41:12 | zero-init:0 value declaration specifier | exprs.go:41:6:41:12 | assign:0 value declaration specifier | | exprs.go:42:2:42:2 | skip | exprs.go:42:5:42:6 | skip | -| exprs.go:42:2:42:20 | ... = ...[0] | exprs.go:42:2:42:2 | assignment to p | -| exprs.go:42:2:42:20 | ... = ...[1] | exprs.go:42:5:42:6 | assignment to ok | -| exprs.go:42:5:42:6 | assignment to ok | exprs.go:43:5:43:6 | ok | +| exprs.go:42:2:42:20 | assign:0 ... = ... | exprs.go:42:2:42:20 | extract:1 ... = ... | +| exprs.go:42:2:42:20 | assign:1 ... = ... | exprs.go:43:5:43:6 | ok | +| exprs.go:42:2:42:20 | extract:0 ... = ... | exprs.go:42:2:42:20 | assign:0 ... = ... | +| exprs.go:42:2:42:20 | extract:1 ... = ... | exprs.go:42:2:42:20 | assign:1 ... = ... | | exprs.go:42:5:42:6 | skip | exprs.go:42:10:42:12 | arg | | exprs.go:42:10:42:12 | arg | exprs.go:42:10:42:20 | type assertion | -| exprs.go:42:10:42:20 | type assertion | exprs.go:42:2:42:20 | ... = ...[0] | +| exprs.go:42:10:42:20 | type assertion | exprs.go:42:2:42:20 | extract:0 ... = ... | | exprs.go:43:5:43:6 | ok | exprs.go:43:5:43:6 | ok is false | | exprs.go:43:5:43:6 | ok | exprs.go:43:5:43:6 | ok is true | | exprs.go:43:5:43:6 | ok is false | exprs.go:46:9:46:10 | -... | @@ -583,17 +583,17 @@ | exprs.go:44:10:44:12 | selection of x | exprs.go:44:3:44:12 | return statement | | exprs.go:46:2:46:10 | return statement | exprs.go:39:1:47:1 | exit | | exprs.go:46:9:46:10 | -... | exprs.go:46:2:46:10 | return statement | -| exprs.go:49:1:54:1 | entry | exprs.go:49:10:49:11 | argument corresponding to xs | +| exprs.go:49:1:54:1 | entry | exprs.go:49:10:49:11 | xs | | exprs.go:49:1:54:1 | function declaration | exprs.go:56:6:56:9 | skip | | exprs.go:49:6:49:8 | skip | exprs.go:49:1:54:1 | function declaration | -| exprs.go:49:10:49:11 | argument corresponding to xs | exprs.go:49:10:49:11 | initialization of xs | -| exprs.go:49:10:49:11 | initialization of xs | exprs.go:49:21:49:23 | zero value for res | -| exprs.go:49:21:49:23 | implicit read of res | exprs.go:49:1:54:1 | exit | -| exprs.go:49:21:49:23 | initialization of res | exprs.go:50:6:50:6 | skip | -| exprs.go:49:21:49:23 | zero value for res | exprs.go:49:21:49:23 | initialization of res | -| exprs.go:50:6:50:6 | assignment to i | exprs.go:50:14:50:14 | i | +| exprs.go:49:10:49:11 | xs | exprs.go:49:10:49:11 | xs | +| exprs.go:49:10:49:11 | xs | exprs.go:49:30:54:1 | result-zero-init:0 block statement | +| exprs.go:49:30:54:1 | result-init:0 block statement | exprs.go:50:6:50:6 | skip | +| exprs.go:49:30:54:1 | result-read:0 block statement | exprs.go:49:1:54:1 | exit | +| exprs.go:49:30:54:1 | result-zero-init:0 block statement | exprs.go:49:30:54:1 | result-init:0 block statement | | exprs.go:50:6:50:6 | skip | exprs.go:50:11:50:11 | 0 | -| exprs.go:50:11:50:11 | 0 | exprs.go:50:6:50:6 | assignment to i | +| exprs.go:50:6:50:11 | assign:0 ... := ... | exprs.go:50:14:50:14 | i | +| exprs.go:50:11:50:11 | 0 | exprs.go:50:6:50:11 | assign:0 ... := ... | | exprs.go:50:14:50:14 | i | exprs.go:50:18:50:20 | len | | exprs.go:50:14:50:24 | ...<... | exprs.go:50:14:50:24 | ...<... is false | | exprs.go:50:14:50:24 | ...<... | exprs.go:50:14:50:24 | ...<... is true | @@ -603,22 +603,22 @@ | exprs.go:50:18:50:24 | call to len | exprs.go:50:14:50:24 | ...<... | | exprs.go:50:22:50:23 | xs | exprs.go:50:18:50:24 | call to len | | exprs.go:50:27:50:27 | i | exprs.go:50:27:50:29 | 1 | -| exprs.go:50:27:50:29 | 1 | exprs.go:50:27:50:29 | rhs of increment statement | +| exprs.go:50:27:50:29 | 1 | exprs.go:50:27:50:29 | incdec-rhs increment statement | +| exprs.go:50:27:50:29 | incdec-rhs increment statement | exprs.go:50:27:50:29 | increment statement | | exprs.go:50:27:50:29 | increment statement | exprs.go:50:14:50:14 | i | -| exprs.go:50:27:50:29 | rhs of increment statement | exprs.go:50:27:50:29 | increment statement | -| exprs.go:51:3:51:5 | assignment to res | exprs.go:50:27:50:27 | i | | exprs.go:51:3:51:5 | res | exprs.go:51:10:51:11 | xs | -| exprs.go:51:3:51:14 | ... += ... | exprs.go:51:3:51:5 | assignment to res | +| exprs.go:51:3:51:14 | assign:0 ... += ... | exprs.go:50:27:50:27 | i | +| exprs.go:51:3:51:14 | compound-rhs ... += ... | exprs.go:51:3:51:14 | assign:0 ... += ... | | exprs.go:51:10:51:11 | xs | exprs.go:51:13:51:13 | i | | exprs.go:51:10:51:14 | index expression | exprs.go:49:1:54:1 | exit | -| exprs.go:51:10:51:14 | index expression | exprs.go:51:3:51:14 | ... += ... | +| exprs.go:51:10:51:14 | index expression | exprs.go:51:3:51:14 | compound-rhs ... += ... | | exprs.go:51:13:51:13 | i | exprs.go:51:10:51:14 | index expression | -| exprs.go:53:2:53:7 | return statement | exprs.go:49:21:49:23 | implicit read of res | -| exprs.go:56:1:58:1 | entry | exprs.go:56:11:56:12 | argument corresponding to xs | +| exprs.go:53:2:53:7 | return statement | exprs.go:49:30:54:1 | result-read:0 block statement | +| exprs.go:56:1:58:1 | entry | exprs.go:56:11:56:12 | xs | | exprs.go:56:1:58:1 | function declaration | exprs.go:60:6:60:9 | skip | | exprs.go:56:6:56:9 | skip | exprs.go:56:1:58:1 | function declaration | -| exprs.go:56:11:56:12 | argument corresponding to xs | exprs.go:56:11:56:12 | initialization of xs | -| exprs.go:56:11:56:12 | initialization of xs | exprs.go:57:9:57:11 | sum | +| exprs.go:56:11:56:12 | xs | exprs.go:56:11:56:12 | xs | +| exprs.go:56:11:56:12 | xs | exprs.go:57:9:57:11 | sum | | exprs.go:57:2:57:15 | return statement | exprs.go:56:1:58:1 | exit | | exprs.go:57:9:57:11 | sum | exprs.go:57:13:57:14 | xs | | exprs.go:57:9:57:15 | call to sum | exprs.go:56:1:58:1 | exit | @@ -629,38 +629,38 @@ | exprs.go:60:6:60:9 | skip | exprs.go:60:1:62:1 | function declaration | | exprs.go:61:2:61:22 | return statement | exprs.go:60:1:62:1 | exit | | exprs.go:61:9:61:22 | slice literal | exprs.go:61:15:61:15 | element index | -| exprs.go:61:15:61:15 | 1 | exprs.go:61:15:61:15 | init of 1 | +| exprs.go:61:15:61:15 | 1 | exprs.go:61:15:61:15 | lit-init 1 | | exprs.go:61:15:61:15 | element index | exprs.go:61:15:61:15 | 1 | -| exprs.go:61:15:61:15 | init of 1 | exprs.go:61:18:61:18 | element index | -| exprs.go:61:18:61:18 | 2 | exprs.go:61:18:61:18 | init of 2 | +| exprs.go:61:15:61:15 | lit-init 1 | exprs.go:61:18:61:18 | element index | +| exprs.go:61:18:61:18 | 2 | exprs.go:61:18:61:18 | lit-init 2 | | exprs.go:61:18:61:18 | element index | exprs.go:61:18:61:18 | 2 | -| exprs.go:61:18:61:18 | init of 2 | exprs.go:61:21:61:21 | element index | -| exprs.go:61:21:61:21 | 3 | exprs.go:61:21:61:21 | init of 3 | +| exprs.go:61:18:61:18 | lit-init 2 | exprs.go:61:21:61:21 | element index | +| exprs.go:61:21:61:21 | 3 | exprs.go:61:21:61:21 | lit-init 3 | | exprs.go:61:21:61:21 | element index | exprs.go:61:21:61:21 | 3 | -| exprs.go:61:21:61:21 | init of 3 | exprs.go:61:2:61:22 | return statement | -| exprs.go:64:5:64:5 | assignment to s | exprs.go:65:5:65:6 | skip | +| exprs.go:61:21:61:21 | lit-init 3 | exprs.go:61:2:61:22 | return statement | | exprs.go:64:5:64:5 | skip | exprs.go:64:9:64:11 | sum | +| exprs.go:64:5:64:19 | assign:0 value declaration specifier | exprs.go:65:5:65:6 | skip | | exprs.go:64:9:64:11 | sum | exprs.go:64:13:64:16 | ints | | exprs.go:64:9:64:19 | call to sum | exprs.go:0:0:0:0 | exit | -| exprs.go:64:9:64:19 | call to sum | exprs.go:64:5:64:5 | assignment to s | +| exprs.go:64:9:64:19 | call to sum | exprs.go:64:5:64:19 | assign:0 value declaration specifier | | exprs.go:64:13:64:16 | ints | exprs.go:64:13:64:18 | call to ints | | exprs.go:64:13:64:18 | call to ints | exprs.go:0:0:0:0 | exit | | exprs.go:64:13:64:18 | call to ints | exprs.go:64:9:64:19 | call to sum | -| exprs.go:65:5:65:6 | assignment to s2 | exprs.go:67:6:67:8 | skip | | exprs.go:65:5:65:6 | skip | exprs.go:65:10:65:13 | sum2 | +| exprs.go:65:5:65:24 | assign:0 value declaration specifier | exprs.go:67:6:67:8 | skip | | exprs.go:65:10:65:13 | sum2 | exprs.go:65:15:65:18 | ints | | exprs.go:65:10:65:24 | call to sum2 | exprs.go:0:0:0:0 | exit | -| exprs.go:65:10:65:24 | call to sum2 | exprs.go:65:5:65:6 | assignment to s2 | +| exprs.go:65:10:65:24 | call to sum2 | exprs.go:65:5:65:24 | assign:0 value declaration specifier | | exprs.go:65:15:65:18 | ints | exprs.go:65:15:65:20 | call to ints | | exprs.go:65:15:65:20 | call to ints | exprs.go:0:0:0:0 | exit | | exprs.go:65:15:65:20 | call to ints | exprs.go:65:10:65:24 | call to sum2 | -| exprs.go:67:1:69:1 | entry | exprs.go:67:10:67:10 | argument corresponding to x | +| exprs.go:67:1:69:1 | entry | exprs.go:67:10:67:10 | x | | exprs.go:67:1:69:1 | function declaration | exprs.go:71:6:71:8 | skip | | exprs.go:67:6:67:8 | skip | exprs.go:67:1:69:1 | function declaration | -| exprs.go:67:10:67:10 | argument corresponding to x | exprs.go:67:10:67:10 | initialization of x | -| exprs.go:67:10:67:10 | initialization of x | exprs.go:67:13:67:13 | argument corresponding to y | -| exprs.go:67:13:67:13 | argument corresponding to y | exprs.go:67:13:67:13 | initialization of y | -| exprs.go:67:13:67:13 | initialization of y | exprs.go:68:9:68:9 | x | +| exprs.go:67:10:67:10 | x | exprs.go:67:10:67:10 | x | +| exprs.go:67:10:67:10 | x | exprs.go:67:13:67:13 | y | +| exprs.go:67:13:67:13 | y | exprs.go:67:13:67:13 | y | +| exprs.go:67:13:67:13 | y | exprs.go:68:9:68:9 | x | | exprs.go:68:2:68:13 | return statement | exprs.go:67:1:69:1 | exit | | exprs.go:68:9:68:9 | x | exprs.go:68:13:68:13 | y | | exprs.go:68:9:68:13 | ...+... | exprs.go:68:2:68:13 | return statement | @@ -671,25 +671,25 @@ | exprs.go:72:2:72:12 | return statement | exprs.go:71:1:73:1 | exit | | exprs.go:72:9:72:9 | 1 | exprs.go:72:12:72:12 | 2 | | exprs.go:72:12:72:12 | 2 | exprs.go:72:2:72:12 | return statement | -| exprs.go:75:5:75:6 | assignment to s3 | exprs.go:77:6:77:10 | skip | | exprs.go:75:5:75:6 | skip | exprs.go:75:10:75:12 | add | +| exprs.go:75:5:75:19 | assign:0 value declaration specifier | exprs.go:77:6:77:10 | skip | | exprs.go:75:10:75:12 | add | exprs.go:75:14:75:16 | gen | | exprs.go:75:10:75:19 | call to add | exprs.go:0:0:0:0 | exit | -| exprs.go:75:10:75:19 | call to add | exprs.go:75:5:75:6 | assignment to s3 | -| exprs.go:75:10:75:19 | call to add[0] | exprs.go:75:10:75:19 | call to add[1] | -| exprs.go:75:10:75:19 | call to add[1] | exprs.go:75:10:75:19 | call to add | +| exprs.go:75:10:75:19 | call to add | exprs.go:75:5:75:19 | assign:0 value declaration specifier | +| exprs.go:75:10:75:19 | extract:0 call to add | exprs.go:75:10:75:19 | extract:1 call to add | +| exprs.go:75:10:75:19 | extract:1 call to add | exprs.go:75:10:75:19 | call to add | | exprs.go:75:14:75:16 | gen | exprs.go:75:14:75:18 | call to gen | | exprs.go:75:14:75:18 | call to gen | exprs.go:0:0:0:0 | exit | -| exprs.go:75:14:75:18 | call to gen | exprs.go:75:10:75:19 | call to add[0] | -| exprs.go:77:1:79:1 | entry | exprs.go:77:12:77:12 | argument corresponding to x | +| exprs.go:75:14:75:18 | call to gen | exprs.go:75:10:75:19 | extract:0 call to add | +| exprs.go:77:1:79:1 | entry | exprs.go:77:12:77:12 | x | | exprs.go:77:1:79:1 | function declaration | exprs.go:81:6:81:16 | skip | | exprs.go:77:6:77:10 | skip | exprs.go:77:1:79:1 | function declaration | -| exprs.go:77:12:77:12 | argument corresponding to x | exprs.go:77:12:77:12 | initialization of x | -| exprs.go:77:12:77:12 | initialization of x | exprs.go:77:15:77:15 | argument corresponding to y | -| exprs.go:77:15:77:15 | argument corresponding to y | exprs.go:77:15:77:15 | initialization of y | -| exprs.go:77:15:77:15 | initialization of y | exprs.go:77:18:77:18 | argument corresponding to z | -| exprs.go:77:18:77:18 | argument corresponding to z | exprs.go:77:18:77:18 | initialization of z | -| exprs.go:77:18:77:18 | initialization of z | exprs.go:78:11:78:11 | x | +| exprs.go:77:12:77:12 | x | exprs.go:77:12:77:12 | x | +| exprs.go:77:12:77:12 | x | exprs.go:77:15:77:15 | y | +| exprs.go:77:15:77:15 | y | exprs.go:77:15:77:15 | y | +| exprs.go:77:15:77:15 | y | exprs.go:77:18:77:18 | z | +| exprs.go:77:18:77:18 | z | exprs.go:77:18:77:18 | z | +| exprs.go:77:18:77:18 | z | exprs.go:78:11:78:11 | x | | exprs.go:78:2:78:22 | return statement | exprs.go:77:1:79:1 | exit | | exprs.go:78:9:78:17 | !... | exprs.go:78:9:78:17 | !... is false | | exprs.go:78:9:78:17 | !... | exprs.go:78:9:78:17 | !... is true | @@ -703,18 +703,18 @@ | exprs.go:78:11:78:16 | ...&&... | exprs.go:78:9:78:17 | !... | | exprs.go:78:16:78:16 | y | exprs.go:78:11:78:16 | ...&&... | | exprs.go:78:22:78:22 | z | exprs.go:78:9:78:22 | ...\|\|... | -| exprs.go:81:1:87:1 | entry | exprs.go:81:18:81:19 | argument corresponding to ch | +| exprs.go:81:1:87:1 | entry | exprs.go:81:18:81:19 | ch | | exprs.go:81:1:87:1 | function declaration | exprs.go:89:7:89:9 | skip | | exprs.go:81:6:81:16 | skip | exprs.go:81:1:87:1 | function declaration | -| exprs.go:81:18:81:19 | argument corresponding to ch | exprs.go:81:18:81:19 | initialization of ch | -| exprs.go:81:18:81:19 | initialization of ch | exprs.go:82:2:82:4 | skip | -| exprs.go:82:2:82:4 | assignment to val | exprs.go:82:2:82:16 | ... := ...[1] | +| exprs.go:81:18:81:19 | ch | exprs.go:81:18:81:19 | ch | +| exprs.go:81:18:81:19 | ch | exprs.go:82:2:82:4 | skip | | exprs.go:82:2:82:4 | skip | exprs.go:82:7:82:8 | skip | -| exprs.go:82:2:82:16 | ... := ...[0] | exprs.go:82:2:82:4 | assignment to val | -| exprs.go:82:2:82:16 | ... := ...[1] | exprs.go:82:7:82:8 | assignment to ok | -| exprs.go:82:7:82:8 | assignment to ok | exprs.go:83:5:83:6 | ok | +| exprs.go:82:2:82:16 | assign:0 ... := ... | exprs.go:82:2:82:16 | extract:1 ... := ... | +| exprs.go:82:2:82:16 | assign:1 ... := ... | exprs.go:83:5:83:6 | ok | +| exprs.go:82:2:82:16 | extract:0 ... := ... | exprs.go:82:2:82:16 | assign:0 ... := ... | +| exprs.go:82:2:82:16 | extract:1 ... := ... | exprs.go:82:2:82:16 | assign:1 ... := ... | | exprs.go:82:7:82:8 | skip | exprs.go:82:15:82:16 | ch | -| exprs.go:82:13:82:16 | <-... | exprs.go:82:2:82:16 | ... := ...[0] | +| exprs.go:82:13:82:16 | <-... | exprs.go:82:2:82:16 | extract:0 ... := ... | | exprs.go:82:15:82:16 | ch | exprs.go:82:13:82:16 | <-... | | exprs.go:83:5:83:6 | ok | exprs.go:83:5:83:6 | ok is false | | exprs.go:83:5:83:6 | ok | exprs.go:83:5:83:6 | ok is true | @@ -725,24 +725,24 @@ | exprs.go:86:2:86:6 | panic | exprs.go:86:8:86:17 | "No value" | | exprs.go:86:2:86:18 | call to panic | exprs.go:81:1:87:1 | exit | | exprs.go:86:8:86:17 | "No value" | exprs.go:86:2:86:18 | call to panic | -| exprs.go:89:7:89:9 | assignment to one | exprs.go:91:5:91:5 | skip | | exprs.go:89:7:89:9 | skip | exprs.go:89:13:89:13 | 1 | -| exprs.go:89:13:89:13 | 1 | exprs.go:89:7:89:9 | assignment to one | -| exprs.go:91:5:91:5 | assignment to a | exprs.go:93:6:93:11 | skip | +| exprs.go:89:7:89:13 | assign:0 value declaration specifier | exprs.go:91:5:91:5 | skip | +| exprs.go:89:13:89:13 | 1 | exprs.go:89:7:89:13 | assign:0 value declaration specifier | | exprs.go:91:5:91:5 | skip | exprs.go:91:9:91:25 | slice literal | +| exprs.go:91:5:91:25 | assign:0 value declaration specifier | exprs.go:93:6:93:11 | skip | | exprs.go:91:9:91:25 | slice literal | exprs.go:91:15:91:21 | ...+... | | exprs.go:91:15:91:21 | ...+... | exprs.go:91:24:91:24 | 2 | -| exprs.go:91:15:91:24 | init of key-value pair | exprs.go:91:5:91:5 | assignment to a | -| exprs.go:91:24:91:24 | 2 | exprs.go:91:15:91:24 | init of key-value pair | -| exprs.go:93:1:95:1 | entry | exprs.go:93:13:93:13 | argument corresponding to x | +| exprs.go:91:15:91:24 | lit-init key-value pair | exprs.go:91:5:91:25 | assign:0 value declaration specifier | +| exprs.go:91:24:91:24 | 2 | exprs.go:91:15:91:24 | lit-init key-value pair | +| exprs.go:93:1:95:1 | entry | exprs.go:93:13:93:13 | x | | exprs.go:93:1:95:1 | function declaration | exprs.go:0:0:0:0 | exit | | exprs.go:93:6:93:11 | skip | exprs.go:93:1:95:1 | function declaration | -| exprs.go:93:13:93:13 | argument corresponding to x | exprs.go:93:13:93:13 | initialization of x | -| exprs.go:93:13:93:13 | initialization of x | exprs.go:93:16:93:16 | argument corresponding to y | -| exprs.go:93:16:93:16 | argument corresponding to y | exprs.go:93:16:93:16 | initialization of y | -| exprs.go:93:16:93:16 | initialization of y | exprs.go:93:19:93:19 | argument corresponding to z | -| exprs.go:93:19:93:19 | argument corresponding to z | exprs.go:93:19:93:19 | initialization of z | -| exprs.go:93:19:93:19 | initialization of z | exprs.go:94:10:94:10 | x | +| exprs.go:93:13:93:13 | x | exprs.go:93:13:93:13 | x | +| exprs.go:93:13:93:13 | x | exprs.go:93:16:93:16 | y | +| exprs.go:93:16:93:16 | y | exprs.go:93:16:93:16 | y | +| exprs.go:93:16:93:16 | y | exprs.go:93:19:93:19 | z | +| exprs.go:93:19:93:19 | z | exprs.go:93:19:93:19 | z | +| exprs.go:93:19:93:19 | z | exprs.go:94:10:94:10 | x | | exprs.go:94:2:94:21 | return statement | exprs.go:93:1:95:1 | exit | | exprs.go:94:9:94:16 | (...) is false | exprs.go:94:21:94:21 | z | | exprs.go:94:9:94:16 | (...) is true | exprs.go:94:9:94:21 | ...\|\|... | @@ -756,103 +756,103 @@ | exprs.go:94:21:94:21 | z | exprs.go:94:9:94:21 | ...\|\|... | | generic.go:0:0:0:0 | entry | generic.go:3:1:5:1 | skip | | generic.go:3:1:5:1 | skip | generic.go:7:28:7:35 | skip | -| generic.go:7:1:7:55 | entry | generic.go:7:7:7:7 | argument corresponding to g | +| generic.go:7:1:7:55 | entry | generic.go:7:7:7:7 | g | | generic.go:7:1:7:55 | function declaration | generic.go:9:1:12:1 | skip | -| generic.go:7:7:7:7 | argument corresponding to g | generic.go:7:7:7:7 | initialization of g | -| generic.go:7:7:7:7 | initialization of g | generic.go:7:37:7:37 | argument corresponding to u | +| generic.go:7:7:7:7 | g | generic.go:7:7:7:7 | g | +| generic.go:7:7:7:7 | g | generic.go:7:37:7:37 | u | | generic.go:7:28:7:35 | skip | generic.go:7:1:7:55 | function declaration | -| generic.go:7:37:7:37 | argument corresponding to u | generic.go:7:37:7:37 | initialization of u | -| generic.go:7:37:7:37 | initialization of u | generic.go:7:53:7:53 | u | +| generic.go:7:37:7:37 | u | generic.go:7:37:7:37 | u | +| generic.go:7:37:7:37 | u | generic.go:7:53:7:53 | u | | generic.go:7:46:7:53 | return statement | generic.go:7:1:7:55 | exit | | generic.go:7:53:7:53 | u | generic.go:7:46:7:53 | return statement | | generic.go:9:1:12:1 | skip | generic.go:14:31:14:39 | skip | -| generic.go:14:1:14:59 | entry | generic.go:14:7:14:7 | argument corresponding to g | +| generic.go:14:1:14:59 | entry | generic.go:14:7:14:7 | g | | generic.go:14:1:14:59 | function declaration | generic.go:16:6:16:21 | skip | -| generic.go:14:7:14:7 | argument corresponding to g | generic.go:14:7:14:7 | initialization of g | -| generic.go:14:7:14:7 | initialization of g | generic.go:14:41:14:41 | argument corresponding to u | +| generic.go:14:7:14:7 | g | generic.go:14:7:14:7 | g | +| generic.go:14:7:14:7 | g | generic.go:14:41:14:41 | u | | generic.go:14:31:14:39 | skip | generic.go:14:1:14:59 | function declaration | -| generic.go:14:41:14:41 | argument corresponding to u | generic.go:14:41:14:41 | initialization of u | -| generic.go:14:41:14:41 | initialization of u | generic.go:14:57:14:57 | u | +| generic.go:14:41:14:41 | u | generic.go:14:41:14:41 | u | +| generic.go:14:41:14:41 | u | generic.go:14:57:14:57 | u | | generic.go:14:50:14:57 | return statement | generic.go:14:1:14:59 | exit | | generic.go:14:57:14:57 | u | generic.go:14:50:14:57 | return statement | -| generic.go:16:1:18:1 | entry | generic.go:16:30:16:30 | argument corresponding to t | +| generic.go:16:1:18:1 | entry | generic.go:16:30:16:30 | t | | generic.go:16:1:18:1 | function declaration | generic.go:20:6:20:21 | skip | | generic.go:16:6:16:21 | skip | generic.go:16:1:18:1 | function declaration | -| generic.go:16:30:16:30 | argument corresponding to t | generic.go:16:30:16:30 | initialization of t | -| generic.go:16:30:16:30 | initialization of t | generic.go:17:9:17:9 | t | +| generic.go:16:30:16:30 | t | generic.go:16:30:16:30 | t | +| generic.go:16:30:16:30 | t | generic.go:17:9:17:9 | t | | generic.go:17:2:17:9 | return statement | generic.go:16:1:18:1 | exit | | generic.go:17:9:17:9 | t | generic.go:17:2:17:9 | return statement | -| generic.go:20:1:22:1 | entry | generic.go:20:33:20:33 | argument corresponding to s | +| generic.go:20:1:22:1 | entry | generic.go:20:33:20:33 | s | | generic.go:20:1:22:1 | function declaration | generic.go:24:6:24:12 | skip | | generic.go:20:6:20:21 | skip | generic.go:20:1:22:1 | function declaration | -| generic.go:20:33:20:33 | argument corresponding to s | generic.go:20:33:20:33 | initialization of s | -| generic.go:20:33:20:33 | initialization of s | generic.go:20:38:20:38 | argument corresponding to t | -| generic.go:20:38:20:38 | argument corresponding to t | generic.go:20:38:20:38 | initialization of t | -| generic.go:20:38:20:38 | initialization of t | generic.go:21:9:21:9 | s | +| generic.go:20:33:20:33 | s | generic.go:20:33:20:33 | s | +| generic.go:20:33:20:33 | s | generic.go:20:38:20:38 | t | +| generic.go:20:38:20:38 | t | generic.go:20:38:20:38 | t | +| generic.go:20:38:20:38 | t | generic.go:21:9:21:9 | s | | generic.go:21:2:21:12 | return statement | generic.go:20:1:22:1 | exit | | generic.go:21:9:21:9 | s | generic.go:21:12:21:12 | t | | generic.go:21:12:21:12 | t | generic.go:21:2:21:12 | return statement | | generic.go:24:1:35:1 | entry | generic.go:25:2:25:4 | skip | | generic.go:24:1:35:1 | function declaration | generic.go:0:0:0:0 | exit | | generic.go:24:6:24:12 | skip | generic.go:24:1:35:1 | function declaration | -| generic.go:25:2:25:4 | assignment to gs1 | generic.go:26:2:26:2 | skip | | generic.go:25:2:25:4 | skip | generic.go:25:9:25:35 | struct literal | +| generic.go:25:2:25:35 | assign:0 ... := ... | generic.go:26:2:26:2 | skip | | generic.go:25:9:25:35 | struct literal | generic.go:25:32:25:34 | "x" | -| generic.go:25:32:25:34 | "x" | generic.go:25:32:25:34 | init of "x" | -| generic.go:25:32:25:34 | init of "x" | generic.go:25:2:25:4 | assignment to gs1 | -| generic.go:26:2:26:2 | assignment to a | generic.go:27:2:27:4 | skip | +| generic.go:25:32:25:34 | "x" | generic.go:25:32:25:34 | lit-init "x" | +| generic.go:25:32:25:34 | lit-init "x" | generic.go:25:2:25:35 | assign:0 ... := ... | | generic.go:26:2:26:2 | skip | generic.go:26:7:26:9 | gs1 | +| generic.go:26:2:26:27 | assign:0 ... := ... | generic.go:27:2:27:4 | skip | | generic.go:26:7:26:9 | gs1 | generic.go:26:7:26:18 | selection of Identity | | generic.go:26:7:26:18 | selection of Identity | generic.go:26:20:26:26 | "hello" | | generic.go:26:7:26:27 | call to Identity | generic.go:24:1:35:1 | exit | -| generic.go:26:7:26:27 | call to Identity | generic.go:26:2:26:2 | assignment to a | +| generic.go:26:7:26:27 | call to Identity | generic.go:26:2:26:27 | assign:0 ... := ... | | generic.go:26:20:26:26 | "hello" | generic.go:26:7:26:27 | call to Identity | -| generic.go:27:2:27:4 | assignment to gs2 | generic.go:28:2:28:2 | skip | | generic.go:27:2:27:4 | skip | generic.go:27:9:27:48 | struct literal | +| generic.go:27:2:27:48 | assign:0 ... := ... | generic.go:28:2:28:2 | skip | | generic.go:27:9:27:48 | struct literal | generic.go:27:40:27:42 | "y" | -| generic.go:27:40:27:42 | "y" | generic.go:27:40:27:42 | init of "y" | -| generic.go:27:40:27:42 | init of "y" | generic.go:27:45:27:47 | "z" | -| generic.go:27:45:27:47 | "z" | generic.go:27:45:27:47 | init of "z" | -| generic.go:27:45:27:47 | init of "z" | generic.go:27:2:27:4 | assignment to gs2 | -| generic.go:28:2:28:2 | assignment to b | generic.go:29:2:29:2 | skip | +| generic.go:27:40:27:42 | "y" | generic.go:27:40:27:42 | lit-init "y" | +| generic.go:27:40:27:42 | lit-init "y" | generic.go:27:45:27:47 | "z" | +| generic.go:27:45:27:47 | "z" | generic.go:27:45:27:47 | lit-init "z" | +| generic.go:27:45:27:47 | lit-init "z" | generic.go:27:2:27:48 | assign:0 ... := ... | | generic.go:28:2:28:2 | skip | generic.go:28:7:28:9 | gs2 | +| generic.go:28:2:28:22 | assign:0 ... := ... | generic.go:29:2:29:2 | skip | | generic.go:28:7:28:9 | gs2 | generic.go:28:7:28:19 | selection of Identity1 | | generic.go:28:7:28:19 | selection of Identity1 | generic.go:28:21:28:21 | a | | generic.go:28:7:28:22 | call to Identity1 | generic.go:24:1:35:1 | exit | -| generic.go:28:7:28:22 | call to Identity1 | generic.go:28:2:28:2 | assignment to b | +| generic.go:28:7:28:22 | call to Identity1 | generic.go:28:2:28:22 | assign:0 ... := ... | | generic.go:28:21:28:21 | a | generic.go:28:7:28:22 | call to Identity1 | -| generic.go:29:2:29:2 | assignment to c | generic.go:30:2:30:2 | skip | | generic.go:29:2:29:2 | skip | generic.go:29:7:29:22 | genericIdentity1 | +| generic.go:29:2:29:33 | assign:0 ... := ... | generic.go:30:2:30:2 | skip | | generic.go:29:7:29:22 | genericIdentity1 | generic.go:29:32:29:32 | b | | generic.go:29:7:29:33 | call to genericIdentity1 | generic.go:24:1:35:1 | exit | -| generic.go:29:7:29:33 | call to genericIdentity1 | generic.go:29:2:29:2 | assignment to c | +| generic.go:29:7:29:33 | call to genericIdentity1 | generic.go:29:2:29:33 | assign:0 ... := ... | | generic.go:29:32:29:32 | b | generic.go:29:7:29:33 | call to genericIdentity1 | -| generic.go:30:2:30:2 | assignment to d | generic.go:31:2:31:2 | skip | | generic.go:30:2:30:2 | skip | generic.go:30:7:30:22 | genericIdentity1 | +| generic.go:30:2:30:25 | assign:0 ... := ... | generic.go:31:2:31:2 | skip | | generic.go:30:7:30:22 | genericIdentity1 | generic.go:30:24:30:24 | c | | generic.go:30:7:30:25 | call to genericIdentity1 | generic.go:24:1:35:1 | exit | -| generic.go:30:7:30:25 | call to genericIdentity1 | generic.go:30:2:30:2 | assignment to d | +| generic.go:30:7:30:25 | call to genericIdentity1 | generic.go:30:2:30:25 | assign:0 ... := ... | | generic.go:30:24:30:24 | c | generic.go:30:7:30:25 | call to genericIdentity1 | -| generic.go:31:2:31:2 | assignment to e | generic.go:31:2:31:53 | ... := ...[1] | | generic.go:31:2:31:2 | skip | generic.go:31:5:31:5 | skip | -| generic.go:31:2:31:53 | ... := ...[0] | generic.go:31:2:31:2 | assignment to e | -| generic.go:31:2:31:53 | ... := ...[1] | generic.go:31:5:31:5 | assignment to f | -| generic.go:31:5:31:5 | assignment to f | generic.go:32:2:32:2 | skip | +| generic.go:31:2:31:53 | assign:0 ... := ... | generic.go:31:2:31:53 | extract:1 ... := ... | +| generic.go:31:2:31:53 | assign:1 ... := ... | generic.go:32:2:32:2 | skip | +| generic.go:31:2:31:53 | extract:0 ... := ... | generic.go:31:2:31:53 | assign:0 ... := ... | +| generic.go:31:2:31:53 | extract:1 ... := ... | generic.go:31:2:31:53 | assign:1 ... := ... | | generic.go:31:5:31:5 | skip | generic.go:31:10:31:25 | genericIdentity2 | | generic.go:31:10:31:25 | genericIdentity2 | generic.go:31:43:31:43 | d | | generic.go:31:10:31:53 | call to genericIdentity2 | generic.go:24:1:35:1 | exit | -| generic.go:31:10:31:53 | call to genericIdentity2 | generic.go:31:2:31:53 | ... := ...[0] | +| generic.go:31:10:31:53 | call to genericIdentity2 | generic.go:31:2:31:53 | extract:0 ... := ... | | generic.go:31:43:31:43 | d | generic.go:31:46:31:52 | "hello" | | generic.go:31:46:31:52 | "hello" | generic.go:31:10:31:53 | call to genericIdentity2 | -| generic.go:32:2:32:2 | assignment to g | generic.go:32:2:32:31 | ... := ...[1] | | generic.go:32:2:32:2 | skip | generic.go:32:5:32:5 | skip | -| generic.go:32:2:32:31 | ... := ...[0] | generic.go:32:2:32:2 | assignment to g | -| generic.go:32:2:32:31 | ... := ...[1] | generic.go:32:5:32:5 | assignment to h | -| generic.go:32:5:32:5 | assignment to h | generic.go:33:2:33:2 | skip | +| generic.go:32:2:32:31 | assign:0 ... := ... | generic.go:32:2:32:31 | extract:1 ... := ... | +| generic.go:32:2:32:31 | assign:1 ... := ... | generic.go:33:2:33:2 | skip | +| generic.go:32:2:32:31 | extract:0 ... := ... | generic.go:32:2:32:31 | assign:0 ... := ... | +| generic.go:32:2:32:31 | extract:1 ... := ... | generic.go:32:2:32:31 | assign:1 ... := ... | | generic.go:32:5:32:5 | skip | generic.go:32:10:32:25 | genericIdentity2 | | generic.go:32:10:32:25 | genericIdentity2 | generic.go:32:27:32:27 | e | | generic.go:32:10:32:31 | call to genericIdentity2 | generic.go:24:1:35:1 | exit | -| generic.go:32:10:32:31 | call to genericIdentity2 | generic.go:32:2:32:31 | ... := ...[0] | +| generic.go:32:10:32:31 | call to genericIdentity2 | generic.go:32:2:32:31 | extract:0 ... := ... | | generic.go:32:27:32:27 | e | generic.go:32:30:32:30 | f | | generic.go:32:30:32:30 | f | generic.go:32:10:32:31 | call to genericIdentity2 | | generic.go:33:2:33:2 | skip | generic.go:33:6:33:6 | g | @@ -861,9 +861,9 @@ | generic.go:34:6:34:6 | h | generic.go:24:1:35:1 | exit | | hello.go:0:0:0:0 | entry | hello.go:3:1:3:12 | skip | | hello.go:3:1:3:12 | skip | hello.go:5:7:5:13 | skip | -| hello.go:5:7:5:13 | assignment to message | hello.go:7:6:7:13 | skip | | hello.go:5:7:5:13 | skip | hello.go:5:17:5:31 | "Hello, world!" | -| hello.go:5:17:5:31 | "Hello, world!" | hello.go:5:7:5:13 | assignment to message | +| hello.go:5:7:5:31 | assign:0 value declaration specifier | hello.go:7:6:7:13 | skip | +| hello.go:5:17:5:31 | "Hello, world!" | hello.go:5:7:5:31 | assign:0 value declaration specifier | | hello.go:7:1:9:1 | entry | hello.go:8:2:8:12 | selection of Println | | hello.go:7:1:9:1 | function declaration | hello.go:0:0:0:0 | exit | | hello.go:7:6:7:13 | skip | hello.go:7:1:9:1 | function declaration | @@ -884,12 +884,12 @@ | main.go:12:1:24:1 | entry | main.go:13:6:13:6 | skip | | main.go:12:1:24:1 | function declaration | main.go:26:6:26:8 | skip | | main.go:12:6:12:9 | skip | main.go:12:1:24:1 | function declaration | -| main.go:13:6:13:6 | assignment to x | main.go:14:2:14:2 | skip | -| main.go:13:6:13:6 | skip | main.go:13:6:13:6 | zero value for x | -| main.go:13:6:13:6 | zero value for x | main.go:13:6:13:6 | assignment to x | -| main.go:14:2:14:2 | assignment to y | main.go:15:2:15:10 | selection of Print | +| main.go:13:6:13:6 | skip | main.go:13:6:13:10 | zero-init:0 value declaration specifier | +| main.go:13:6:13:10 | assign:0 value declaration specifier | main.go:14:2:14:2 | skip | +| main.go:13:6:13:10 | zero-init:0 value declaration specifier | main.go:13:6:13:10 | assign:0 value declaration specifier | | main.go:14:2:14:2 | skip | main.go:14:7:14:8 | 23 | -| main.go:14:7:14:8 | 23 | main.go:14:2:14:2 | assignment to y | +| main.go:14:2:14:8 | assign:0 ... := ... | main.go:15:2:15:10 | selection of Print | +| main.go:14:7:14:8 | 23 | main.go:14:2:14:8 | assign:0 ... := ... | | main.go:15:2:15:10 | selection of Print | main.go:15:12:15:12 | x | | main.go:15:2:15:16 | call to Print | main.go:12:1:24:1 | exit | | main.go:15:2:15:16 | call to Print | main.go:16:5:16:8 | cond | @@ -901,10 +901,10 @@ | main.go:16:5:16:10 | call to cond | main.go:16:5:16:10 | call to cond is true | | main.go:16:5:16:10 | call to cond is false | main.go:19:2:19:10 | selection of Print | | main.go:16:5:16:10 | call to cond is true | main.go:17:3:17:3 | y | -| main.go:17:3:17:3 | assignment to y | main.go:19:2:19:10 | selection of Print | | main.go:17:3:17:3 | y | main.go:17:8:17:9 | 19 | -| main.go:17:3:17:9 | ... += ... | main.go:17:3:17:3 | assignment to y | -| main.go:17:8:17:9 | 19 | main.go:17:3:17:9 | ... += ... | +| main.go:17:3:17:9 | assign:0 ... += ... | main.go:19:2:19:10 | selection of Print | +| main.go:17:3:17:9 | compound-rhs ... += ... | main.go:17:3:17:9 | assign:0 ... += ... | +| main.go:17:8:17:9 | 19 | main.go:17:3:17:9 | compound-rhs ... += ... | | main.go:19:2:19:10 | selection of Print | main.go:19:12:19:12 | x | | main.go:19:2:19:16 | call to Print | main.go:12:1:24:1 | exit | | main.go:19:2:19:16 | call to Print | main.go:20:5:20:8 | cond | @@ -916,59 +916,59 @@ | main.go:20:5:20:10 | call to cond | main.go:20:5:20:10 | call to cond is true | | main.go:20:5:20:10 | call to cond is false | main.go:23:2:23:10 | selection of Print | | main.go:20:5:20:10 | call to cond is true | main.go:21:3:21:3 | skip | -| main.go:21:3:21:3 | assignment to x | main.go:23:2:23:10 | selection of Print | | main.go:21:3:21:3 | skip | main.go:21:7:21:7 | y | -| main.go:21:7:21:7 | y | main.go:21:3:21:3 | assignment to x | +| main.go:21:3:21:7 | assign:0 ... = ... | main.go:23:2:23:10 | selection of Print | +| main.go:21:7:21:7 | y | main.go:21:3:21:7 | assign:0 ... = ... | | main.go:23:2:23:10 | selection of Print | main.go:23:12:23:12 | x | | main.go:23:2:23:16 | call to Print | main.go:12:1:24:1 | exit | | main.go:23:12:23:12 | x | main.go:23:15:23:15 | y | | main.go:23:15:23:15 | y | main.go:23:2:23:16 | call to Print | -| main.go:26:1:32:1 | entry | main.go:26:10:26:10 | argument corresponding to x | +| main.go:26:1:32:1 | entry | main.go:26:10:26:10 | x | | main.go:26:1:32:1 | function declaration | main.go:34:6:34:9 | skip | | main.go:26:6:26:8 | skip | main.go:26:1:32:1 | function declaration | -| main.go:26:10:26:10 | argument corresponding to x | main.go:26:10:26:10 | initialization of x | -| main.go:26:10:26:10 | initialization of x | main.go:27:2:27:2 | skip | -| main.go:27:2:27:2 | assignment to a | main.go:27:5:27:5 | assignment to b | +| main.go:26:10:26:10 | x | main.go:26:10:26:10 | x | +| main.go:26:10:26:10 | x | main.go:27:2:27:2 | skip | | main.go:27:2:27:2 | skip | main.go:27:5:27:5 | skip | -| main.go:27:5:27:5 | assignment to b | main.go:28:5:28:8 | cond | +| main.go:27:2:27:13 | assign:0 ... := ... | main.go:27:2:27:13 | assign:1 ... := ... | +| main.go:27:2:27:13 | assign:1 ... := ... | main.go:28:5:28:8 | cond | | main.go:27:5:27:5 | skip | main.go:27:10:27:10 | x | | main.go:27:10:27:10 | x | main.go:27:13:27:13 | 0 | -| main.go:27:13:27:13 | 0 | main.go:27:2:27:2 | assignment to a | +| main.go:27:13:27:13 | 0 | main.go:27:2:27:13 | assign:0 ... := ... | | main.go:28:5:28:8 | cond | main.go:28:5:28:10 | call to cond | | main.go:28:5:28:10 | call to cond | main.go:26:1:32:1 | exit | | main.go:28:5:28:10 | call to cond | main.go:28:5:28:10 | call to cond is false | | main.go:28:5:28:10 | call to cond | main.go:28:5:28:10 | call to cond is true | | main.go:28:5:28:10 | call to cond is false | main.go:31:9:31:9 | a | | main.go:28:5:28:10 | call to cond is true | main.go:29:3:29:3 | skip | -| main.go:29:3:29:3 | assignment to a | main.go:29:6:29:6 | assignment to b | | main.go:29:3:29:3 | skip | main.go:29:6:29:6 | skip | -| main.go:29:6:29:6 | assignment to b | main.go:31:9:31:9 | a | +| main.go:29:3:29:13 | assign:0 ... = ... | main.go:29:3:29:13 | assign:1 ... = ... | +| main.go:29:3:29:13 | assign:1 ... = ... | main.go:31:9:31:9 | a | | main.go:29:6:29:6 | skip | main.go:29:10:29:10 | b | | main.go:29:10:29:10 | b | main.go:29:13:29:13 | a | -| main.go:29:13:29:13 | a | main.go:29:3:29:3 | assignment to a | +| main.go:29:13:29:13 | a | main.go:29:3:29:13 | assign:0 ... = ... | | main.go:31:2:31:12 | return statement | main.go:26:1:32:1 | exit | | main.go:31:9:31:9 | a | main.go:31:12:31:12 | b | | main.go:31:12:31:12 | b | main.go:31:2:31:12 | return statement | -| main.go:34:1:36:1 | entry | main.go:34:11:34:11 | argument corresponding to x | +| main.go:34:1:36:1 | entry | main.go:34:11:34:11 | x | | main.go:34:1:36:1 | function declaration | main.go:38:6:38:8 | skip | | main.go:34:6:34:9 | skip | main.go:34:1:36:1 | function declaration | -| main.go:34:11:34:11 | argument corresponding to x | main.go:34:11:34:11 | initialization of x | -| main.go:34:11:34:11 | initialization of x | main.go:35:3:35:3 | x | -| main.go:35:2:35:3 | assignment to star expression | main.go:34:1:36:1 | exit | +| main.go:34:11:34:11 | x | main.go:34:11:34:11 | x | +| main.go:34:11:34:11 | x | main.go:35:3:35:3 | x | | main.go:35:2:35:3 | star expression | main.go:34:1:36:1 | exit | | main.go:35:2:35:3 | star expression | main.go:35:8:35:9 | 19 | -| main.go:35:2:35:9 | ... += ... | main.go:35:2:35:3 | assignment to star expression | +| main.go:35:2:35:9 | assign:0 ... += ... | main.go:34:1:36:1 | exit | +| main.go:35:2:35:9 | compound-rhs ... += ... | main.go:35:2:35:9 | assign:0 ... += ... | | main.go:35:3:35:3 | x | main.go:35:2:35:3 | star expression | -| main.go:35:8:35:9 | 19 | main.go:35:2:35:9 | ... += ... | +| main.go:35:8:35:9 | 19 | main.go:35:2:35:9 | compound-rhs ... += ... | | main.go:38:1:45:1 | entry | main.go:39:2:39:2 | skip | | main.go:38:1:45:1 | function declaration | main.go:47:6:47:8 | skip | | main.go:38:6:38:8 | skip | main.go:38:1:45:1 | function declaration | -| main.go:39:2:39:2 | assignment to x | main.go:40:2:40:4 | skip | | main.go:39:2:39:2 | skip | main.go:39:7:39:8 | 23 | -| main.go:39:7:39:8 | 23 | main.go:39:2:39:2 | assignment to x | -| main.go:40:2:40:4 | assignment to ptr | main.go:41:5:41:8 | cond | +| main.go:39:2:39:8 | assign:0 ... := ... | main.go:40:2:40:4 | skip | +| main.go:39:7:39:8 | 23 | main.go:39:2:39:8 | assign:0 ... := ... | | main.go:40:2:40:4 | skip | main.go:40:10:40:10 | x | -| main.go:40:9:40:10 | &... | main.go:40:2:40:4 | assignment to ptr | +| main.go:40:2:40:10 | assign:0 ... := ... | main.go:41:5:41:8 | cond | +| main.go:40:9:40:10 | &... | main.go:40:2:40:10 | assign:0 ... := ... | | main.go:40:10:40:10 | x | main.go:40:9:40:10 | &... | | main.go:41:5:41:8 | cond | main.go:41:5:41:10 | call to cond | | main.go:41:5:41:10 | call to cond | main.go:38:1:45:1 | exit | @@ -983,76 +983,76 @@ | main.go:44:2:44:10 | selection of Print | main.go:44:12:44:12 | x | | main.go:44:2:44:13 | call to Print | main.go:38:1:45:1 | exit | | main.go:44:12:44:12 | x | main.go:44:2:44:13 | call to Print | -| main.go:47:1:50:1 | entry | main.go:47:13:47:18 | zero value for result | +| main.go:47:1:50:1 | entry | main.go:47:25:50:1 | result-zero-init:0 block statement | | main.go:47:1:50:1 | function declaration | main.go:52:6:52:9 | skip | | main.go:47:6:47:8 | skip | main.go:47:1:50:1 | function declaration | -| main.go:47:13:47:18 | implicit read of result | main.go:47:1:50:1 | exit | -| main.go:47:13:47:18 | initialization of result | main.go:48:2:48:7 | skip | -| main.go:47:13:47:18 | zero value for result | main.go:47:13:47:18 | initialization of result | -| main.go:48:2:48:7 | assignment to result | main.go:49:2:49:7 | return statement | +| main.go:47:25:50:1 | result-init:0 block statement | main.go:48:2:48:7 | skip | +| main.go:47:25:50:1 | result-read:0 block statement | main.go:47:1:50:1 | exit | +| main.go:47:25:50:1 | result-zero-init:0 block statement | main.go:47:25:50:1 | result-init:0 block statement | | main.go:48:2:48:7 | skip | main.go:48:11:48:12 | 42 | -| main.go:48:11:48:12 | 42 | main.go:48:2:48:7 | assignment to result | -| main.go:49:2:49:7 | return statement | main.go:47:13:47:18 | implicit read of result | -| main.go:52:1:54:1 | entry | main.go:52:14:52:19 | zero value for result | +| main.go:48:2:48:12 | assign:0 ... = ... | main.go:49:2:49:7 | return statement | +| main.go:48:11:48:12 | 42 | main.go:48:2:48:12 | assign:0 ... = ... | +| main.go:49:2:49:7 | return statement | main.go:47:25:50:1 | result-read:0 block statement | +| main.go:52:1:54:1 | entry | main.go:52:26:54:1 | result-zero-init:0 block statement | | main.go:52:1:54:1 | function declaration | main.go:56:6:56:9 | skip | | main.go:52:6:52:9 | skip | main.go:52:1:54:1 | function declaration | -| main.go:52:14:52:19 | implicit read of result | main.go:52:1:54:1 | exit | -| main.go:52:14:52:19 | initialization of result | main.go:53:2:53:7 | return statement | -| main.go:52:14:52:19 | zero value for result | main.go:52:14:52:19 | initialization of result | -| main.go:53:2:53:7 | return statement | main.go:52:14:52:19 | implicit read of result | -| main.go:56:1:64:1 | entry | main.go:56:11:56:18 | argument corresponding to selector | +| main.go:52:26:54:1 | result-init:0 block statement | main.go:53:2:53:7 | return statement | +| main.go:52:26:54:1 | result-read:0 block statement | main.go:52:1:54:1 | exit | +| main.go:52:26:54:1 | result-zero-init:0 block statement | main.go:52:26:54:1 | result-init:0 block statement | +| main.go:53:2:53:7 | return statement | main.go:52:26:54:1 | result-read:0 block statement | +| main.go:56:1:64:1 | entry | main.go:56:11:56:18 | selector | | main.go:56:1:64:1 | function declaration | main.go:66:6:66:10 | skip | | main.go:56:6:56:9 | skip | main.go:56:1:64:1 | function declaration | -| main.go:56:11:56:18 | argument corresponding to selector | main.go:56:11:56:18 | initialization of selector | -| main.go:56:11:56:18 | initialization of selector | main.go:56:26:56:31 | zero value for result | -| main.go:56:26:56:31 | implicit read of result | main.go:56:1:64:1 | exit | -| main.go:56:26:56:31 | initialization of result | main.go:57:2:57:7 | skip | -| main.go:56:26:56:31 | zero value for result | main.go:56:26:56:31 | initialization of result | -| main.go:57:2:57:7 | assignment to result | main.go:58:5:58:12 | selector | +| main.go:56:11:56:18 | selector | main.go:56:11:56:18 | selector | +| main.go:56:11:56:18 | selector | main.go:56:38:64:1 | result-zero-init:0 block statement | +| main.go:56:38:64:1 | result-init:0 block statement | main.go:57:2:57:7 | skip | +| main.go:56:38:64:1 | result-read:0 block statement | main.go:56:1:64:1 | exit | +| main.go:56:38:64:1 | result-zero-init:0 block statement | main.go:56:38:64:1 | result-init:0 block statement | | main.go:57:2:57:7 | skip | main.go:57:11:57:11 | 0 | -| main.go:57:11:57:11 | 0 | main.go:57:2:57:7 | assignment to result | +| main.go:57:2:57:11 | assign:0 ... = ... | main.go:58:5:58:12 | selector | +| main.go:57:11:57:11 | 0 | main.go:57:2:57:11 | assign:0 ... = ... | | main.go:58:5:58:12 | selector | main.go:58:17:58:17 | 1 | | main.go:58:5:58:17 | ...==... | main.go:58:5:58:17 | ...==... is false | | main.go:58:5:58:17 | ...==... | main.go:58:5:58:17 | ...==... is true | | main.go:58:5:58:17 | ...==... is false | main.go:61:3:61:8 | skip | | main.go:58:5:58:17 | ...==... is true | main.go:59:10:59:10 | 1 | | main.go:58:17:58:17 | 1 | main.go:58:5:58:17 | ...==... | -| main.go:59:3:59:10 | return statement | main.go:56:26:56:31 | implicit read of result | -| main.go:59:10:59:10 | 1 | main.go:59:10:59:10 | implicit write of result | -| main.go:59:10:59:10 | implicit write of result | main.go:59:3:59:10 | return statement | -| main.go:61:3:61:8 | assignment to result | main.go:63:2:63:7 | return statement | +| main.go:59:3:59:10 | result-write:0 return statement | main.go:59:3:59:10 | return statement | +| main.go:59:3:59:10 | return statement | main.go:56:38:64:1 | result-read:0 block statement | +| main.go:59:10:59:10 | 1 | main.go:59:3:59:10 | result-write:0 return statement | | main.go:61:3:61:8 | skip | main.go:61:12:61:12 | 2 | -| main.go:61:12:61:12 | 2 | main.go:61:3:61:8 | assignment to result | -| main.go:63:2:63:7 | return statement | main.go:56:26:56:31 | implicit read of result | +| main.go:61:3:61:12 | assign:0 ... = ... | main.go:63:2:63:7 | return statement | +| main.go:61:12:61:12 | 2 | main.go:61:3:61:12 | assign:0 ... = ... | +| main.go:63:2:63:7 | return statement | main.go:56:38:64:1 | result-read:0 block statement | | main.go:66:1:90:1 | entry | main.go:67:6:67:6 | skip | | main.go:66:1:90:1 | function declaration | main.go:92:6:92:13 | skip | | main.go:66:6:66:10 | skip | main.go:66:1:90:1 | function declaration | -| main.go:67:6:67:6 | assignment to x | main.go:68:6:68:9 | cond | -| main.go:67:6:67:6 | skip | main.go:67:6:67:6 | zero value for x | -| main.go:67:6:67:6 | zero value for x | main.go:67:6:67:6 | assignment to x | +| main.go:67:6:67:6 | skip | main.go:67:6:67:10 | zero-init:0 value declaration specifier | +| main.go:67:6:67:10 | assign:0 value declaration specifier | main.go:68:6:68:9 | cond | +| main.go:67:6:67:10 | zero-init:0 value declaration specifier | main.go:67:6:67:10 | assign:0 value declaration specifier | | main.go:68:6:68:9 | cond | main.go:68:6:68:11 | call to cond | | main.go:68:6:68:11 | call to cond | main.go:66:1:90:1 | exit | | main.go:68:6:68:11 | call to cond | main.go:68:6:68:11 | call to cond is false | | main.go:68:6:68:11 | call to cond | main.go:68:6:68:11 | call to cond is true | | main.go:68:6:68:11 | call to cond is false | main.go:71:2:71:10 | selection of Print | | main.go:68:6:68:11 | call to cond is true | main.go:69:3:69:3 | skip | -| main.go:69:3:69:3 | assignment to x | main.go:68:6:68:9 | cond | | main.go:69:3:69:3 | skip | main.go:69:7:69:7 | 2 | -| main.go:69:7:69:7 | 2 | main.go:69:3:69:3 | assignment to x | +| main.go:69:3:69:7 | assign:0 ... = ... | main.go:68:6:68:9 | cond | +| main.go:69:7:69:7 | 2 | main.go:69:3:69:7 | assign:0 ... = ... | | main.go:71:2:71:10 | selection of Print | main.go:71:12:71:12 | x | | main.go:71:2:71:13 | call to Print | main.go:66:1:90:1 | exit | | main.go:71:2:71:13 | call to Print | main.go:73:2:73:2 | skip | | main.go:71:12:71:12 | x | main.go:71:2:71:13 | call to Print | -| main.go:73:2:73:2 | assignment to y | main.go:74:6:74:6 | skip | | main.go:73:2:73:2 | skip | main.go:73:7:73:7 | 1 | -| main.go:73:7:73:7 | 1 | main.go:73:2:73:2 | assignment to y | -| main.go:74:6:74:6 | assignment to i | main.go:75:6:75:9 | cond | +| main.go:73:2:73:7 | assign:0 ... := ... | main.go:74:6:74:6 | skip | +| main.go:73:7:73:7 | 1 | main.go:73:2:73:7 | assign:0 ... := ... | | main.go:74:6:74:6 | skip | main.go:74:11:74:11 | 0 | -| main.go:74:11:74:11 | 0 | main.go:74:6:74:6 | assignment to i | +| main.go:74:6:74:11 | assign:0 ... := ... | main.go:75:6:75:9 | cond | +| main.go:74:11:74:11 | 0 | main.go:74:6:74:11 | assign:0 ... := ... | | main.go:74:16:74:16 | i | main.go:74:16:74:18 | 1 | -| main.go:74:16:74:18 | 1 | main.go:74:16:74:18 | rhs of increment statement | +| main.go:74:16:74:18 | 1 | main.go:74:16:74:18 | incdec-rhs increment statement | +| main.go:74:16:74:18 | incdec-rhs increment statement | main.go:74:16:74:18 | increment statement | | main.go:74:16:74:18 | increment statement | main.go:75:6:75:9 | cond | -| main.go:74:16:74:18 | rhs of increment statement | main.go:74:16:74:18 | increment statement | | main.go:75:6:75:9 | cond | main.go:75:6:75:11 | call to cond | | main.go:75:6:75:11 | call to cond | main.go:66:1:90:1 | exit | | main.go:75:6:75:11 | call to cond | main.go:75:6:75:11 | call to cond is false | @@ -1060,26 +1060,26 @@ | main.go:75:6:75:11 | call to cond is false | main.go:78:3:78:3 | skip | | main.go:75:6:75:11 | call to cond is true | main.go:76:4:76:8 | skip | | main.go:76:4:76:8 | skip | main.go:80:2:80:10 | selection of Print | -| main.go:78:3:78:3 | assignment to y | main.go:74:16:74:16 | i | | main.go:78:3:78:3 | skip | main.go:78:7:78:7 | 2 | -| main.go:78:7:78:7 | 2 | main.go:78:3:78:3 | assignment to y | +| main.go:78:3:78:7 | assign:0 ... = ... | main.go:74:16:74:16 | i | +| main.go:78:7:78:7 | 2 | main.go:78:3:78:7 | assign:0 ... = ... | | main.go:80:2:80:10 | selection of Print | main.go:80:12:80:12 | y | | main.go:80:2:80:13 | call to Print | main.go:66:1:90:1 | exit | | main.go:80:2:80:13 | call to Print | main.go:82:2:82:2 | skip | | main.go:80:12:80:12 | y | main.go:80:2:80:13 | call to Print | -| main.go:82:2:82:2 | assignment to z | main.go:83:6:83:6 | skip | | main.go:82:2:82:2 | skip | main.go:82:7:82:7 | 1 | -| main.go:82:7:82:7 | 1 | main.go:82:2:82:2 | assignment to z | -| main.go:83:6:83:6 | assignment to i | main.go:84:3:84:3 | skip | +| main.go:82:2:82:7 | assign:0 ... := ... | main.go:83:6:83:6 | skip | +| main.go:82:7:82:7 | 1 | main.go:82:2:82:7 | assign:0 ... := ... | | main.go:83:6:83:6 | skip | main.go:83:11:83:11 | 0 | -| main.go:83:11:83:11 | 0 | main.go:83:6:83:6 | assignment to i | +| main.go:83:6:83:11 | assign:0 ... := ... | main.go:84:3:84:3 | skip | +| main.go:83:11:83:11 | 0 | main.go:83:6:83:11 | assign:0 ... := ... | | main.go:83:16:83:16 | i | main.go:83:16:83:18 | 1 | -| main.go:83:16:83:18 | 1 | main.go:83:16:83:18 | rhs of increment statement | +| main.go:83:16:83:18 | 1 | main.go:83:16:83:18 | incdec-rhs increment statement | +| main.go:83:16:83:18 | incdec-rhs increment statement | main.go:83:16:83:18 | increment statement | | main.go:83:16:83:18 | increment statement | main.go:84:3:84:3 | skip | -| main.go:83:16:83:18 | rhs of increment statement | main.go:83:16:83:18 | increment statement | -| main.go:84:3:84:3 | assignment to z | main.go:85:6:85:9 | cond | | main.go:84:3:84:3 | skip | main.go:84:7:84:7 | 2 | -| main.go:84:7:84:7 | 2 | main.go:84:3:84:3 | assignment to z | +| main.go:84:3:84:7 | assign:0 ... = ... | main.go:85:6:85:9 | cond | +| main.go:84:7:84:7 | 2 | main.go:84:3:84:7 | assign:0 ... = ... | | main.go:85:6:85:9 | cond | main.go:85:6:85:11 | call to cond | | main.go:85:6:85:11 | call to cond | main.go:66:1:90:1 | exit | | main.go:85:6:85:11 | call to cond | main.go:85:6:85:11 | call to cond is false | @@ -1090,54 +1090,54 @@ | main.go:89:2:89:10 | selection of Print | main.go:89:12:89:12 | z | | main.go:89:2:89:13 | call to Print | main.go:66:1:90:1 | exit | | main.go:89:12:89:12 | z | main.go:89:2:89:13 | call to Print | -| main.go:92:1:96:1 | entry | main.go:92:18:92:18 | zero value for a | +| main.go:92:1:96:1 | entry | main.go:92:36:96:1 | result-zero-init:0 block statement | | main.go:92:1:96:1 | function declaration | main.go:98:6:98:23 | skip | | main.go:92:6:92:13 | skip | main.go:92:1:96:1 | function declaration | -| main.go:92:18:92:18 | implicit read of a | main.go:92:25:92:25 | implicit read of b | -| main.go:92:18:92:18 | initialization of a | main.go:92:25:92:25 | zero value for b | -| main.go:92:18:92:18 | zero value for a | main.go:92:18:92:18 | initialization of a | -| main.go:92:25:92:25 | implicit read of b | main.go:92:1:96:1 | exit | -| main.go:92:25:92:25 | initialization of b | main.go:93:2:93:2 | skip | -| main.go:92:25:92:25 | zero value for b | main.go:92:25:92:25 | initialization of b | -| main.go:93:2:93:2 | assignment to x | main.go:94:2:94:2 | skip | +| main.go:92:36:96:1 | result-init:0 block statement | main.go:92:36:96:1 | result-zero-init:1 block statement | +| main.go:92:36:96:1 | result-init:1 block statement | main.go:93:2:93:2 | skip | +| main.go:92:36:96:1 | result-read:0 block statement | main.go:92:36:96:1 | result-read:1 block statement | +| main.go:92:36:96:1 | result-read:1 block statement | main.go:92:1:96:1 | exit | +| main.go:92:36:96:1 | result-zero-init:0 block statement | main.go:92:36:96:1 | result-init:0 block statement | +| main.go:92:36:96:1 | result-zero-init:1 block statement | main.go:92:36:96:1 | result-init:1 block statement | | main.go:93:2:93:2 | skip | main.go:93:7:93:8 | 23 | -| main.go:93:7:93:8 | 23 | main.go:93:2:93:2 | assignment to x | -| main.go:94:2:94:2 | assignment to x | main.go:94:5:94:5 | assignment to a | +| main.go:93:2:93:8 | assign:0 ... := ... | main.go:94:2:94:2 | skip | +| main.go:93:7:93:8 | 23 | main.go:93:2:93:8 | assign:0 ... := ... | | main.go:94:2:94:2 | skip | main.go:94:5:94:5 | skip | -| main.go:94:5:94:5 | assignment to a | main.go:95:2:95:7 | return statement | +| main.go:94:2:94:15 | assign:0 ... = ... | main.go:94:2:94:15 | assign:1 ... = ... | +| main.go:94:2:94:15 | assign:1 ... = ... | main.go:95:2:95:7 | return statement | | main.go:94:5:94:5 | skip | main.go:94:9:94:9 | x | | main.go:94:9:94:9 | x | main.go:94:11:94:12 | 19 | | main.go:94:9:94:12 | ...+... | main.go:94:15:94:15 | x | | main.go:94:11:94:12 | 19 | main.go:94:9:94:12 | ...+... | -| main.go:94:15:94:15 | x | main.go:94:2:94:2 | assignment to x | -| main.go:95:2:95:7 | return statement | main.go:92:18:92:18 | implicit read of a | -| main.go:98:1:106:1 | entry | main.go:98:25:98:25 | argument corresponding to x | +| main.go:94:15:94:15 | x | main.go:94:2:94:15 | assign:0 ... = ... | +| main.go:95:2:95:7 | return statement | main.go:92:36:96:1 | result-read:0 block statement | +| main.go:98:1:106:1 | entry | main.go:98:25:98:25 | x | | main.go:98:1:106:1 | function declaration | main.go:0:0:0:0 | exit | | main.go:98:6:98:23 | skip | main.go:98:1:106:1 | function declaration | -| main.go:98:25:98:25 | argument corresponding to x | main.go:98:25:98:25 | initialization of x | -| main.go:98:25:98:25 | initialization of x | main.go:99:2:99:2 | skip | -| main.go:99:2:99:2 | assignment to a | main.go:99:5:99:5 | assignment to b | +| main.go:98:25:98:25 | x | main.go:98:25:98:25 | x | +| main.go:98:25:98:25 | x | main.go:99:2:99:2 | skip | | main.go:99:2:99:2 | skip | main.go:99:5:99:5 | skip | -| main.go:99:5:99:5 | assignment to b | main.go:100:5:100:8 | cond | +| main.go:99:2:99:13 | assign:0 ... := ... | main.go:99:2:99:13 | assign:1 ... := ... | +| main.go:99:2:99:13 | assign:1 ... := ... | main.go:100:5:100:8 | cond | | main.go:99:5:99:5 | skip | main.go:99:10:99:10 | x | | main.go:99:10:99:10 | x | main.go:99:13:99:13 | 0 | -| main.go:99:13:99:13 | 0 | main.go:99:2:99:2 | assignment to a | +| main.go:99:13:99:13 | 0 | main.go:99:2:99:13 | assign:0 ... := ... | | main.go:100:5:100:8 | cond | main.go:100:5:100:10 | call to cond | | main.go:100:5:100:10 | call to cond | main.go:98:1:106:1 | exit | | main.go:100:5:100:10 | call to cond | main.go:100:5:100:10 | call to cond is false | | main.go:100:5:100:10 | call to cond | main.go:100:5:100:10 | call to cond is true | | main.go:100:5:100:10 | call to cond is false | main.go:103:3:103:3 | skip | | main.go:100:5:100:10 | call to cond is true | main.go:101:3:101:3 | skip | -| main.go:101:3:101:3 | assignment to a | main.go:105:9:105:9 | a | | main.go:101:3:101:3 | skip | main.go:101:6:101:6 | skip | +| main.go:101:3:101:13 | assign:0 ... = ... | main.go:105:9:105:9 | a | | main.go:101:6:101:6 | skip | main.go:101:10:101:10 | b | | main.go:101:10:101:10 | b | main.go:101:13:101:13 | a | -| main.go:101:13:101:13 | a | main.go:101:3:101:3 | assignment to a | +| main.go:101:13:101:13 | a | main.go:101:3:101:13 | assign:0 ... = ... | | main.go:103:3:103:3 | skip | main.go:103:6:103:6 | skip | -| main.go:103:6:103:6 | assignment to b | main.go:105:9:105:9 | a | +| main.go:103:3:103:13 | assign:1 ... = ... | main.go:105:9:105:9 | a | | main.go:103:6:103:6 | skip | main.go:103:10:103:10 | b | | main.go:103:10:103:10 | b | main.go:103:13:103:13 | a | -| main.go:103:13:103:13 | a | main.go:103:6:103:6 | assignment to b | +| main.go:103:13:103:13 | a | main.go:103:3:103:13 | assign:1 ... = ... | | main.go:105:2:105:12 | return statement | main.go:98:1:106:1 | exit | | main.go:105:9:105:9 | a | main.go:105:12:105:12 | b | | main.go:105:12:105:12 | b | main.go:105:2:105:12 | return statement | @@ -1149,11 +1149,11 @@ | noretfunctions.go:9:2:9:8 | selection of Exit | noretfunctions.go:9:10:9:10 | 1 | | noretfunctions.go:9:2:9:11 | call to Exit | noretfunctions.go:8:1:10:1 | exit | | noretfunctions.go:9:10:9:10 | 1 | noretfunctions.go:9:2:9:11 | call to Exit | -| noretfunctions.go:12:1:16:1 | entry | noretfunctions.go:12:13:12:13 | argument corresponding to x | +| noretfunctions.go:12:1:16:1 | entry | noretfunctions.go:12:13:12:13 | x | | noretfunctions.go:12:1:16:1 | function declaration | noretfunctions.go:18:6:18:12 | skip | | noretfunctions.go:12:6:12:11 | skip | noretfunctions.go:12:1:16:1 | function declaration | -| noretfunctions.go:12:13:12:13 | argument corresponding to x | noretfunctions.go:12:13:12:13 | initialization of x | -| noretfunctions.go:12:13:12:13 | initialization of x | noretfunctions.go:13:5:13:5 | x | +| noretfunctions.go:12:13:12:13 | x | noretfunctions.go:12:13:12:13 | x | +| noretfunctions.go:12:13:12:13 | x | noretfunctions.go:13:5:13:5 | x | | noretfunctions.go:13:5:13:5 | x | noretfunctions.go:13:10:13:10 | 0 | | noretfunctions.go:13:5:13:10 | ...!=... | noretfunctions.go:13:5:13:10 | ...!=... is false | | noretfunctions.go:13:5:13:10 | ...!=... | noretfunctions.go:13:5:13:10 | ...!=... is true | @@ -1199,30 +1199,30 @@ | stmts2.go:9:1:13:1 | function declaration | stmts2.go:15:6:15:11 | skip | | stmts2.go:9:6:9:11 | skip | stmts2.go:9:1:13:1 | function declaration | | stmts2.go:10:2:10:2 | skip | stmts2.go:10:5:10:5 | skip | -| stmts2.go:10:2:10:14 | ... := ...[0] | stmts2.go:10:2:10:14 | ... := ...[1] | -| stmts2.go:10:2:10:14 | ... := ...[1] | stmts2.go:10:5:10:5 | assignment to x | -| stmts2.go:10:5:10:5 | assignment to x | stmts2.go:11:6:11:6 | skip | +| stmts2.go:10:2:10:14 | assign:1 ... := ... | stmts2.go:11:6:11:6 | skip | +| stmts2.go:10:2:10:14 | extract:0 ... := ... | stmts2.go:10:2:10:14 | extract:1 ... := ... | +| stmts2.go:10:2:10:14 | extract:1 ... := ... | stmts2.go:10:2:10:14 | assign:1 ... := ... | | stmts2.go:10:5:10:5 | skip | stmts2.go:10:10:10:12 | gen | | stmts2.go:10:10:10:12 | gen | stmts2.go:10:10:10:14 | call to gen | | stmts2.go:10:10:10:14 | call to gen | stmts2.go:9:1:13:1 | exit | -| stmts2.go:10:10:10:14 | call to gen | stmts2.go:10:2:10:14 | ... := ...[0] | +| stmts2.go:10:10:10:14 | call to gen | stmts2.go:10:2:10:14 | extract:0 ... := ... | | stmts2.go:11:6:11:6 | skip | stmts2.go:11:9:11:9 | skip | -| stmts2.go:11:6:11:17 | value declaration specifier[0] | stmts2.go:11:6:11:17 | value declaration specifier[1] | -| stmts2.go:11:6:11:17 | value declaration specifier[1] | stmts2.go:11:9:11:9 | assignment to y | -| stmts2.go:11:9:11:9 | assignment to y | stmts2.go:12:9:12:9 | x | +| stmts2.go:11:6:11:17 | assign:1 value declaration specifier | stmts2.go:12:9:12:9 | x | +| stmts2.go:11:6:11:17 | extract:0 value declaration specifier | stmts2.go:11:6:11:17 | extract:1 value declaration specifier | +| stmts2.go:11:6:11:17 | extract:1 value declaration specifier | stmts2.go:11:6:11:17 | assign:1 value declaration specifier | | stmts2.go:11:9:11:9 | skip | stmts2.go:11:13:11:15 | gen | | stmts2.go:11:13:11:15 | gen | stmts2.go:11:13:11:17 | call to gen | | stmts2.go:11:13:11:17 | call to gen | stmts2.go:9:1:13:1 | exit | -| stmts2.go:11:13:11:17 | call to gen | stmts2.go:11:6:11:17 | value declaration specifier[0] | +| stmts2.go:11:13:11:17 | call to gen | stmts2.go:11:6:11:17 | extract:0 value declaration specifier | | stmts2.go:12:2:12:13 | return statement | stmts2.go:9:1:13:1 | exit | | stmts2.go:12:9:12:9 | x | stmts2.go:12:13:12:13 | y | | stmts2.go:12:9:12:13 | ...+... | stmts2.go:12:2:12:13 | return statement | | stmts2.go:12:13:12:13 | y | stmts2.go:12:9:12:13 | ...+... | -| stmts2.go:15:1:28:1 | entry | stmts2.go:15:13:15:14 | argument corresponding to ch | +| stmts2.go:15:1:28:1 | entry | stmts2.go:15:13:15:14 | ch | | stmts2.go:15:1:28:1 | function declaration | stmts2.go:30:6:30:12 | skip | | stmts2.go:15:6:15:11 | skip | stmts2.go:15:1:28:1 | function declaration | -| stmts2.go:15:13:15:14 | argument corresponding to ch | stmts2.go:15:13:15:14 | initialization of ch | -| stmts2.go:15:13:15:14 | initialization of ch | stmts2.go:17:13:17:14 | ch | +| stmts2.go:15:13:15:14 | ch | stmts2.go:15:13:15:14 | ch | +| stmts2.go:15:13:15:14 | ch | stmts2.go:17:13:17:14 | ch | | stmts2.go:16:2:26:2 | select statement | stmts2.go:17:11:17:14 | <-... | | stmts2.go:16:2:26:2 | select statement | stmts2.go:18:15:18:18 | <-... | | stmts2.go:16:2:26:2 | select statement | stmts2.go:20:15:20:18 | <-... | @@ -1231,20 +1231,20 @@ | stmts2.go:17:7:17:7 | skip | stmts2.go:17:2:17:15 | skip | | stmts2.go:17:11:17:14 | <-... | stmts2.go:17:7:17:7 | skip | | stmts2.go:17:13:17:14 | ch | stmts2.go:18:17:18:18 | ch | -| stmts2.go:18:7:18:7 | assignment to x | stmts2.go:18:7:18:18 | ... := ...[1] | | stmts2.go:18:7:18:7 | skip | stmts2.go:18:10:18:10 | skip | -| stmts2.go:18:7:18:18 | ... := ...[0] | stmts2.go:18:7:18:7 | assignment to x | -| stmts2.go:18:7:18:18 | ... := ...[1] | stmts2.go:19:10:19:10 | x | -| stmts2.go:18:10:18:10 | skip | stmts2.go:18:7:18:18 | ... := ...[0] | +| stmts2.go:18:7:18:18 | assign:0 ... := ... | stmts2.go:18:7:18:18 | extract:1 ... := ... | +| stmts2.go:18:7:18:18 | extract:0 ... := ... | stmts2.go:18:7:18:18 | assign:0 ... := ... | +| stmts2.go:18:7:18:18 | extract:1 ... := ... | stmts2.go:19:10:19:10 | x | +| stmts2.go:18:10:18:10 | skip | stmts2.go:18:7:18:18 | extract:0 ... := ... | | stmts2.go:18:15:18:18 | <-... | stmts2.go:18:7:18:7 | skip | | stmts2.go:18:17:18:18 | ch | stmts2.go:20:17:20:18 | ch | | stmts2.go:19:3:19:10 | return statement | stmts2.go:15:1:28:1 | exit | | stmts2.go:19:10:19:10 | x | stmts2.go:19:3:19:10 | return statement | | stmts2.go:20:7:20:7 | skip | stmts2.go:20:10:20:10 | skip | -| stmts2.go:20:7:20:18 | ... := ...[0] | stmts2.go:20:7:20:18 | ... := ...[1] | -| stmts2.go:20:7:20:18 | ... := ...[1] | stmts2.go:20:10:20:10 | assignment to y | -| stmts2.go:20:10:20:10 | assignment to y | stmts2.go:21:6:21:6 | y | -| stmts2.go:20:10:20:10 | skip | stmts2.go:20:7:20:18 | ... := ...[0] | +| stmts2.go:20:7:20:18 | assign:1 ... := ... | stmts2.go:21:6:21:6 | y | +| stmts2.go:20:7:20:18 | extract:0 ... := ... | stmts2.go:20:7:20:18 | extract:1 ... := ... | +| stmts2.go:20:7:20:18 | extract:1 ... := ... | stmts2.go:20:7:20:18 | assign:1 ... := ... | +| stmts2.go:20:10:20:10 | skip | stmts2.go:20:7:20:18 | extract:0 ... := ... | | stmts2.go:20:15:20:18 | <-... | stmts2.go:20:7:20:7 | skip | | stmts2.go:20:17:20:18 | ch | stmts2.go:25:16:25:17 | ch | | stmts2.go:21:6:21:6 | y | stmts2.go:21:6:21:6 | y is false | @@ -1256,9 +1256,9 @@ | stmts2.go:24:10:24:10 | 0 | stmts2.go:24:3:24:10 | return statement | | stmts2.go:25:2:25:18 | skip | stmts2.go:27:9:27:9 | 1 | | stmts2.go:25:7:25:7 | skip | stmts2.go:25:10:25:10 | skip | -| stmts2.go:25:7:25:17 | ... = ...[0] | stmts2.go:25:7:25:17 | ... = ...[1] | -| stmts2.go:25:7:25:17 | ... = ...[1] | stmts2.go:25:2:25:18 | skip | -| stmts2.go:25:10:25:10 | skip | stmts2.go:25:7:25:17 | ... = ...[0] | +| stmts2.go:25:7:25:17 | extract:0 ... = ... | stmts2.go:25:7:25:17 | extract:1 ... = ... | +| stmts2.go:25:7:25:17 | extract:1 ... = ... | stmts2.go:25:2:25:18 | skip | +| stmts2.go:25:10:25:10 | skip | stmts2.go:25:7:25:17 | extract:0 ... = ... | | stmts2.go:25:14:25:17 | <-... | stmts2.go:25:7:25:7 | skip | | stmts2.go:25:16:25:17 | ch | stmts2.go:16:2:26:2 | select statement | | stmts2.go:27:2:27:9 | return statement | stmts2.go:15:1:28:1 | exit | @@ -1266,22 +1266,22 @@ | stmts2.go:30:1:34:1 | entry | stmts2.go:31:2:31:2 | skip | | stmts2.go:30:1:34:1 | function declaration | stmts2.go:0:0:0:0 | exit | | stmts2.go:30:6:30:12 | skip | stmts2.go:30:1:34:1 | function declaration | -| stmts2.go:31:2:31:2 | assignment to x | stmts2.go:31:2:31:14 | ... := ...[1] | | stmts2.go:31:2:31:2 | skip | stmts2.go:31:5:31:5 | skip | -| stmts2.go:31:2:31:14 | ... := ...[0] | stmts2.go:31:2:31:2 | assignment to x | -| stmts2.go:31:2:31:14 | ... := ...[1] | stmts2.go:32:6:32:6 | skip | +| stmts2.go:31:2:31:14 | assign:0 ... := ... | stmts2.go:31:2:31:14 | extract:1 ... := ... | +| stmts2.go:31:2:31:14 | extract:0 ... := ... | stmts2.go:31:2:31:14 | assign:0 ... := ... | +| stmts2.go:31:2:31:14 | extract:1 ... := ... | stmts2.go:32:6:32:6 | skip | | stmts2.go:31:5:31:5 | skip | stmts2.go:31:10:31:12 | gen | | stmts2.go:31:10:31:12 | gen | stmts2.go:31:10:31:14 | call to gen | | stmts2.go:31:10:31:14 | call to gen | stmts2.go:30:1:34:1 | exit | -| stmts2.go:31:10:31:14 | call to gen | stmts2.go:31:2:31:14 | ... := ...[0] | -| stmts2.go:32:6:32:6 | assignment to y | stmts2.go:32:6:32:17 | value declaration specifier[1] | +| stmts2.go:31:10:31:14 | call to gen | stmts2.go:31:2:31:14 | extract:0 ... := ... | | stmts2.go:32:6:32:6 | skip | stmts2.go:32:9:32:9 | skip | -| stmts2.go:32:6:32:17 | value declaration specifier[0] | stmts2.go:32:6:32:6 | assignment to y | -| stmts2.go:32:6:32:17 | value declaration specifier[1] | stmts2.go:33:9:33:9 | x | +| stmts2.go:32:6:32:17 | assign:0 value declaration specifier | stmts2.go:32:6:32:17 | extract:1 value declaration specifier | +| stmts2.go:32:6:32:17 | extract:0 value declaration specifier | stmts2.go:32:6:32:17 | assign:0 value declaration specifier | +| stmts2.go:32:6:32:17 | extract:1 value declaration specifier | stmts2.go:33:9:33:9 | x | | stmts2.go:32:9:32:9 | skip | stmts2.go:32:13:32:15 | gen | | stmts2.go:32:13:32:15 | gen | stmts2.go:32:13:32:17 | call to gen | | stmts2.go:32:13:32:17 | call to gen | stmts2.go:30:1:34:1 | exit | -| stmts2.go:32:13:32:17 | call to gen | stmts2.go:32:6:32:17 | value declaration specifier[0] | +| stmts2.go:32:13:32:17 | call to gen | stmts2.go:32:6:32:17 | extract:0 value declaration specifier | | stmts2.go:33:2:33:13 | return statement | stmts2.go:30:1:34:1 | exit | | stmts2.go:33:9:33:9 | x | stmts2.go:33:13:33:13 | y | | stmts2.go:33:9:33:13 | ...+... | stmts2.go:33:2:33:13 | return statement | @@ -1291,54 +1291,54 @@ | stmts3.go:5:1:12:1 | entry | stmts3.go:7:3:7:5 | skip | | stmts3.go:5:1:12:1 | function declaration | stmts3.go:14:6:14:11 | skip | | stmts3.go:5:6:5:11 | skip | stmts3.go:5:1:12:1 | function declaration | -| stmts3.go:7:3:7:5 | assignment to red | stmts3.go:8:3:8:7 | skip | | stmts3.go:7:3:7:5 | skip | stmts3.go:7:9:7:12 | iota | -| stmts3.go:7:9:7:12 | iota | stmts3.go:7:3:7:5 | assignment to red | -| stmts3.go:8:3:8:7 | assignment to green | stmts3.go:9:3:9:6 | skip | -| stmts3.go:8:3:8:7 | skip | stmts3.go:8:3:8:7 | zero value for green | -| stmts3.go:8:3:8:7 | zero value for green | stmts3.go:8:3:8:7 | assignment to green | -| stmts3.go:9:3:9:6 | assignment to blue | stmts3.go:11:9:11:26 | ...-... | -| stmts3.go:9:3:9:6 | skip | stmts3.go:9:3:9:6 | zero value for blue | -| stmts3.go:9:3:9:6 | zero value for blue | stmts3.go:9:3:9:6 | assignment to blue | +| stmts3.go:7:3:7:12 | assign:0 value declaration specifier | stmts3.go:8:3:8:7 | skip | +| stmts3.go:7:9:7:12 | iota | stmts3.go:7:3:7:12 | assign:0 value declaration specifier | +| stmts3.go:8:3:8:7 | assign:0 value declaration specifier | stmts3.go:9:3:9:6 | skip | +| stmts3.go:8:3:8:7 | skip | stmts3.go:8:3:8:7 | zero-init:0 value declaration specifier | +| stmts3.go:8:3:8:7 | zero-init:0 value declaration specifier | stmts3.go:8:3:8:7 | assign:0 value declaration specifier | +| stmts3.go:9:3:9:6 | assign:0 value declaration specifier | stmts3.go:11:9:11:26 | ...-... | +| stmts3.go:9:3:9:6 | skip | stmts3.go:9:3:9:6 | zero-init:0 value declaration specifier | +| stmts3.go:9:3:9:6 | zero-init:0 value declaration specifier | stmts3.go:9:3:9:6 | assign:0 value declaration specifier | | stmts3.go:11:2:11:26 | return statement | stmts3.go:5:1:12:1 | exit | | stmts3.go:11:9:11:26 | ...-... | stmts3.go:11:2:11:26 | return statement | -| stmts3.go:14:1:16:1 | entry | stmts3.go:14:13:14:13 | argument corresponding to x | +| stmts3.go:14:1:16:1 | entry | stmts3.go:14:13:14:13 | x | | stmts3.go:14:1:16:1 | function declaration | stmts3.go:18:6:18:11 | skip | | stmts3.go:14:6:14:11 | skip | stmts3.go:14:1:16:1 | function declaration | -| stmts3.go:14:13:14:13 | argument corresponding to x | stmts3.go:14:13:14:13 | initialization of x | -| stmts3.go:14:13:14:13 | initialization of x | stmts3.go:15:3:15:3 | x | -| stmts3.go:15:2:15:3 | assignment to star expression | stmts3.go:14:1:16:1 | exit | +| stmts3.go:14:13:14:13 | x | stmts3.go:14:13:14:13 | x | +| stmts3.go:14:13:14:13 | x | stmts3.go:15:3:15:3 | x | | stmts3.go:15:2:15:3 | skip | stmts3.go:14:1:16:1 | exit | | stmts3.go:15:2:15:3 | skip | stmts3.go:15:7:15:8 | 42 | +| stmts3.go:15:2:15:8 | assign:0 ... = ... | stmts3.go:14:1:16:1 | exit | | stmts3.go:15:3:15:3 | x | stmts3.go:15:2:15:3 | skip | -| stmts3.go:15:7:15:8 | 42 | stmts3.go:15:2:15:3 | assignment to star expression | +| stmts3.go:15:7:15:8 | 42 | stmts3.go:15:2:15:8 | assign:0 ... = ... | | stmts3.go:18:1:20:1 | entry | stmts3.go:19:2:19:11 | skip | | stmts3.go:18:1:20:1 | function declaration | stmts3.go:0:0:0:0 | exit | | stmts3.go:18:6:18:11 | skip | stmts3.go:18:1:20:1 | function declaration | -| stmts3.go:19:2:19:11 | assignment to Usage | stmts3.go:18:1:20:1 | exit | | stmts3.go:19:2:19:11 | skip | stmts3.go:19:15:19:23 | function literal | +| stmts3.go:19:2:19:23 | assign:0 ... = ... | stmts3.go:18:1:20:1 | exit | | stmts3.go:19:15:19:23 | entry | stmts3.go:19:22:19:23 | skip | -| stmts3.go:19:15:19:23 | function literal | stmts3.go:19:2:19:11 | assignment to Usage | +| stmts3.go:19:15:19:23 | function literal | stmts3.go:19:2:19:23 | assign:0 ... = ... | | stmts3.go:19:22:19:23 | skip | stmts3.go:19:15:19:23 | exit | | stmts4.go:0:0:0:0 | entry | stmts4.go:3:5:3:5 | skip | -| stmts4.go:3:5:3:5 | skip | stmts4.go:3:5:3:5 | zero value for _ | -| stmts4.go:3:5:3:5 | zero value for _ | stmts4.go:5:6:5:11 | skip | +| stmts4.go:3:5:3:5 | skip | stmts4.go:3:5:3:9 | zero-init:0 value declaration specifier | +| stmts4.go:3:5:3:9 | zero-init:0 value declaration specifier | stmts4.go:5:6:5:11 | skip | | stmts4.go:5:1:5:26 | function declaration | stmts4.go:0:0:0:0 | exit | | stmts4.go:5:6:5:11 | skip | stmts4.go:5:1:5:26 | function declaration | | stmts5.go:0:0:0:0 | entry | stmts5.go:3:1:5:1 | skip | | stmts5.go:3:1:5:1 | skip | stmts5.go:7:17:7:20 | skip | -| stmts5.go:7:1:9:1 | entry | stmts5.go:7:7:7:8 | argument corresponding to me | +| stmts5.go:7:1:9:1 | entry | stmts5.go:7:7:7:8 | me | | stmts5.go:7:1:9:1 | function declaration | stmts5.go:11:14:11:16 | skip | -| stmts5.go:7:7:7:8 | argument corresponding to me | stmts5.go:7:7:7:8 | initialization of me | -| stmts5.go:7:7:7:8 | initialization of me | stmts5.go:7:22:7:26 | argument corresponding to other | +| stmts5.go:7:7:7:8 | me | stmts5.go:7:7:7:8 | me | +| stmts5.go:7:7:7:8 | me | stmts5.go:7:22:7:26 | other | | stmts5.go:7:17:7:20 | skip | stmts5.go:7:1:9:1 | function declaration | -| stmts5.go:7:22:7:26 | argument corresponding to other | stmts5.go:7:22:7:26 | initialization of other | -| stmts5.go:7:22:7:26 | initialization of other | stmts5.go:8:2:8:3 | me | +| stmts5.go:7:22:7:26 | other | stmts5.go:7:22:7:26 | other | +| stmts5.go:7:22:7:26 | other | stmts5.go:8:2:8:3 | me | | stmts5.go:8:2:8:3 | me | stmts5.go:8:2:8:7 | selection of val | -| stmts5.go:8:2:8:7 | assignment to field val | stmts5.go:7:1:9:1 | exit | | stmts5.go:8:2:8:7 | selection of val | stmts5.go:8:12:8:16 | other | -| stmts5.go:8:2:8:16 | ... += ... | stmts5.go:8:2:8:7 | assignment to field val | -| stmts5.go:8:12:8:16 | other | stmts5.go:8:2:8:16 | ... += ... | +| stmts5.go:8:2:8:16 | assign:0 ... += ... | stmts5.go:7:1:9:1 | exit | +| stmts5.go:8:2:8:16 | compound-rhs ... += ... | stmts5.go:8:2:8:16 | assign:0 ... += ... | +| stmts5.go:8:12:8:16 | other | stmts5.go:8:2:8:16 | compound-rhs ... += ... | | stmts5.go:11:1:12:1 | entry | stmts5.go:11:20:12:1 | skip | | stmts5.go:11:1:12:1 | function declaration | stmts5.go:0:0:0:0 | exit | | stmts5.go:11:14:11:16 | skip | stmts5.go:11:1:12:1 | function declaration | @@ -1358,10 +1358,10 @@ | stmts7.go:5:1:8:1 | entry | stmts7.go:6:2:6:5 | skip | | stmts7.go:5:1:8:1 | function declaration | stmts7.go:10:6:10:15 | skip | | stmts7.go:5:6:5:17 | skip | stmts7.go:5:1:8:1 | function declaration | -| stmts7.go:6:2:6:5 | assignment to blah | stmts7.go:7:2:7:12 | selection of Println | | stmts7.go:6:2:6:5 | skip | stmts7.go:6:10:6:16 | recover | +| stmts7.go:6:2:6:18 | assign:0 ... := ... | stmts7.go:7:2:7:12 | selection of Println | | stmts7.go:6:10:6:16 | recover | stmts7.go:6:10:6:18 | call to recover | -| stmts7.go:6:10:6:18 | call to recover | stmts7.go:6:2:6:5 | assignment to blah | +| stmts7.go:6:10:6:18 | call to recover | stmts7.go:6:2:6:18 | assign:0 ... := ... | | stmts7.go:7:2:7:12 | selection of Println | stmts7.go:7:14:7:26 | "recovered: " | | stmts7.go:7:2:7:33 | call to Println | stmts7.go:5:1:8:1 | exit | | stmts7.go:7:14:7:26 | "recovered: " | stmts7.go:7:29:7:32 | blah | @@ -1376,31 +1376,31 @@ | stmts7.go:12:2:12:10 | call to panic | stmts7.go:11:8:11:21 | call to recoverPanic | | stmts7.go:12:8:12:9 | "" | stmts7.go:12:2:12:10 | call to panic | | stmts7.go:15:1:17:1 | skip | stmts7.go:19:26:19:28 | skip | -| stmts7.go:19:1:21:1 | entry | stmts7.go:19:7:19:13 | argument corresponding to methods | +| stmts7.go:19:1:21:1 | entry | stmts7.go:19:7:19:13 | methods | | stmts7.go:19:1:21:1 | function declaration | stmts7.go:23:6:23:14 | skip | -| stmts7.go:19:7:19:13 | argument corresponding to methods | stmts7.go:19:7:19:13 | initialization of methods | -| stmts7.go:19:7:19:13 | initialization of methods | stmts7.go:20:2:20:8 | methods | +| stmts7.go:19:7:19:13 | methods | stmts7.go:19:7:19:13 | methods | +| stmts7.go:19:7:19:13 | methods | stmts7.go:20:2:20:8 | methods | | stmts7.go:19:26:19:28 | skip | stmts7.go:19:1:21:1 | function declaration | -| stmts7.go:20:2:20:8 | implicit dereference | stmts7.go:19:1:21:1 | exit | -| stmts7.go:20:2:20:8 | implicit dereference | stmts7.go:20:2:20:11 | selection of fn | -| stmts7.go:20:2:20:8 | methods | stmts7.go:20:2:20:8 | implicit dereference | +| stmts7.go:20:2:20:8 | implicit-deref methods | stmts7.go:19:1:21:1 | exit | +| stmts7.go:20:2:20:8 | implicit-deref methods | stmts7.go:20:2:20:11 | selection of fn | +| stmts7.go:20:2:20:8 | methods | stmts7.go:20:2:20:8 | implicit-deref methods | | stmts7.go:20:2:20:11 | selection of fn | stmts7.go:20:2:20:13 | call to fn | | stmts7.go:20:2:20:13 | call to fn | stmts7.go:19:1:21:1 | exit | -| stmts7.go:23:1:28:1 | entry | stmts7.go:23:16:23:23 | argument corresponding to callback | +| stmts7.go:23:1:28:1 | entry | stmts7.go:23:16:23:23 | callback | | stmts7.go:23:1:28:1 | function declaration | stmts7.go:0:0:0:0 | exit | | stmts7.go:23:6:23:14 | skip | stmts7.go:23:1:28:1 | function declaration | -| stmts7.go:23:16:23:23 | argument corresponding to callback | stmts7.go:23:16:23:23 | initialization of callback | -| stmts7.go:23:16:23:23 | initialization of callback | stmts7.go:24:8:24:15 | callback | +| stmts7.go:23:16:23:23 | callback | stmts7.go:23:16:23:23 | callback | +| stmts7.go:23:16:23:23 | callback | stmts7.go:24:8:24:15 | callback | | stmts7.go:24:2:24:20 | defer statement | stmts7.go:25:10:25:17 | callback | | stmts7.go:24:8:24:15 | callback | stmts7.go:24:8:24:18 | selection of fn | | stmts7.go:24:8:24:18 | selection of fn | stmts7.go:24:2:24:20 | defer statement | | stmts7.go:24:8:24:20 | call to fn | stmts7.go:23:1:28:1 | exit | | stmts7.go:25:2:25:23 | defer statement | stmts7.go:26:2:26:12 | selection of Println | -| stmts7.go:25:8:25:18 | implicit dereference | stmts7.go:24:8:24:20 | call to fn | -| stmts7.go:25:8:25:18 | implicit dereference | stmts7.go:25:8:25:21 | selection of fn | +| stmts7.go:25:8:25:18 | implicit-deref (...) | stmts7.go:24:8:24:20 | call to fn | +| stmts7.go:25:8:25:18 | implicit-deref (...) | stmts7.go:25:8:25:21 | selection of fn | | stmts7.go:25:8:25:21 | selection of fn | stmts7.go:25:2:25:23 | defer statement | | stmts7.go:25:8:25:23 | call to fn | stmts7.go:24:8:24:20 | call to fn | -| stmts7.go:25:9:25:17 | &... | stmts7.go:25:8:25:18 | implicit dereference | +| stmts7.go:25:9:25:17 | &... | stmts7.go:25:8:25:18 | implicit-deref (...) | | stmts7.go:25:10:25:17 | callback | stmts7.go:25:9:25:17 | &... | | stmts7.go:26:2:26:12 | selection of Println | stmts7.go:26:14:26:30 | "print something" | | stmts7.go:26:2:26:31 | call to Println | stmts7.go:25:8:25:23 | call to fn | @@ -1409,20 +1409,20 @@ | stmts7.go:27:2:27:13 | return statement | stmts7.go:25:8:25:23 | call to fn | | stmts7.go:27:9:27:13 | false | stmts7.go:27:2:27:13 | return statement | | stmts8.go:0:0:0:0 | entry | stmts8.go:3:6:3:11 | skip | -| stmts8.go:3:1:7:1 | entry | stmts8.go:3:13:3:13 | argument corresponding to x | +| stmts8.go:3:1:7:1 | entry | stmts8.go:3:13:3:13 | x | | stmts8.go:3:1:7:1 | function declaration | stmts8.go:9:6:9:12 | skip | | stmts8.go:3:6:3:11 | skip | stmts8.go:3:1:7:1 | function declaration | -| stmts8.go:3:13:3:13 | argument corresponding to x | stmts8.go:3:13:3:13 | initialization of x | -| stmts8.go:3:13:3:13 | initialization of x | stmts8.go:4:2:4:2 | skip | -| stmts8.go:4:2:4:2 | assignment to y | stmts8.go:5:2:5:2 | skip | +| stmts8.go:3:13:3:13 | x | stmts8.go:3:13:3:13 | x | +| stmts8.go:3:13:3:13 | x | stmts8.go:4:2:4:2 | skip | | stmts8.go:4:2:4:2 | skip | stmts8.go:4:7:4:7 | x | +| stmts8.go:4:2:4:12 | assign:0 ... := ... | stmts8.go:5:2:5:2 | skip | | stmts8.go:4:7:4:7 | x | stmts8.go:4:12:4:12 | 5 | -| stmts8.go:4:7:4:12 | ...>>... | stmts8.go:4:2:4:2 | assignment to y | +| stmts8.go:4:7:4:12 | ...>>... | stmts8.go:4:2:4:12 | assign:0 ... := ... | | stmts8.go:4:12:4:12 | 5 | stmts8.go:4:7:4:12 | ...>>... | -| stmts8.go:5:2:5:2 | assignment to z | stmts8.go:6:9:6:9 | z | | stmts8.go:5:2:5:2 | skip | stmts8.go:5:7:5:7 | x | +| stmts8.go:5:2:5:13 | assign:0 ... := ... | stmts8.go:6:9:6:9 | z | | stmts8.go:5:7:5:7 | x | stmts8.go:5:12:5:12 | 1 | -| stmts8.go:5:7:5:13 | ...%... | stmts8.go:5:2:5:2 | assignment to z | +| stmts8.go:5:7:5:13 | ...%... | stmts8.go:5:2:5:13 | assign:0 ... := ... | | stmts8.go:5:12:5:12 | 1 | stmts8.go:5:7:5:13 | ...%... | | stmts8.go:6:2:6:17 | return statement | stmts8.go:3:1:7:1 | exit | | stmts8.go:6:9:6:9 | z | stmts8.go:6:12:6:12 | y | @@ -1442,11 +1442,11 @@ | stmts8.go:13:9:13:13 | false | stmts8.go:13:2:13:13 | return statement | | stmts.go:0:0:0:0 | entry | stmts.go:3:1:3:12 | skip | | stmts.go:3:1:3:12 | skip | stmts.go:10:6:10:10 | skip | -| stmts.go:10:1:43:1 | entry | stmts.go:10:12:10:12 | argument corresponding to b | +| stmts.go:10:1:43:1 | entry | stmts.go:10:12:10:12 | b | | stmts.go:10:1:43:1 | function declaration | stmts.go:46:6:46:10 | skip | | stmts.go:10:6:10:10 | skip | stmts.go:10:1:43:1 | function declaration | -| stmts.go:10:12:10:12 | argument corresponding to b | stmts.go:10:12:10:12 | initialization of b | -| stmts.go:10:12:10:12 | initialization of b | stmts.go:12:7:12:7 | b | +| stmts.go:10:12:10:12 | b | stmts.go:10:12:10:12 | b | +| stmts.go:10:12:10:12 | b | stmts.go:12:7:12:7 | b | | stmts.go:12:6:12:7 | !... | stmts.go:12:6:12:7 | !... is false | | stmts.go:12:6:12:7 | !... | stmts.go:12:6:12:7 | !... is true | | stmts.go:12:6:12:7 | !... is false | stmts.go:15:3:16:3 | skip | @@ -1462,9 +1462,9 @@ | stmts.go:23:6:23:9 | true | stmts.go:23:6:23:9 | true is true | | stmts.go:23:6:23:9 | true is false | stmts.go:39:2:39:2 | skip | | stmts.go:23:6:23:9 | true is true | stmts.go:24:7:24:7 | skip | -| stmts.go:24:7:24:7 | assignment to i | stmts.go:24:15:24:15 | i | | stmts.go:24:7:24:7 | skip | stmts.go:24:12:24:12 | 0 | -| stmts.go:24:12:24:12 | 0 | stmts.go:24:7:24:7 | assignment to i | +| stmts.go:24:7:24:12 | assign:0 ... := ... | stmts.go:24:15:24:15 | i | +| stmts.go:24:12:24:12 | 0 | stmts.go:24:7:24:12 | assign:0 ... := ... | | stmts.go:24:15:24:15 | i | stmts.go:24:19:24:20 | 10 | | stmts.go:24:15:24:20 | ...<... | stmts.go:24:15:24:20 | ...<... is false | | stmts.go:24:15:24:20 | ...<... | stmts.go:24:15:24:20 | ...<... is true | @@ -1472,13 +1472,13 @@ | stmts.go:24:15:24:20 | ...<... is true | stmts.go:25:7:25:7 | skip | | stmts.go:24:19:24:20 | 10 | stmts.go:24:15:24:20 | ...<... | | stmts.go:24:23:24:23 | i | stmts.go:24:23:24:25 | 1 | -| stmts.go:24:23:24:25 | 1 | stmts.go:24:23:24:25 | rhs of increment statement | +| stmts.go:24:23:24:25 | 1 | stmts.go:24:23:24:25 | incdec-rhs increment statement | +| stmts.go:24:23:24:25 | incdec-rhs increment statement | stmts.go:24:23:24:25 | increment statement | | stmts.go:24:23:24:25 | increment statement | stmts.go:24:15:24:15 | i | -| stmts.go:24:23:24:25 | rhs of increment statement | stmts.go:24:23:24:25 | increment statement | -| stmts.go:25:7:25:7 | assignment to j | stmts.go:25:19:25:19 | j | | stmts.go:25:7:25:7 | skip | stmts.go:25:12:25:12 | i | +| stmts.go:25:7:25:16 | assign:0 ... := ... | stmts.go:25:19:25:19 | j | | stmts.go:25:12:25:12 | i | stmts.go:25:16:25:16 | 1 | -| stmts.go:25:12:25:16 | ...-... | stmts.go:25:7:25:7 | assignment to j | +| stmts.go:25:12:25:16 | ...-... | stmts.go:25:7:25:16 | assign:0 ... := ... | | stmts.go:25:16:25:16 | 1 | stmts.go:25:12:25:16 | ...-... | | stmts.go:25:19:25:19 | j | stmts.go:25:23:25:23 | 5 | | stmts.go:25:19:25:23 | ...>... | stmts.go:25:19:25:23 | ...>... is false | @@ -1509,27 +1509,27 @@ | stmts.go:31:19:31:19 | 4 | stmts.go:31:14:31:19 | ...>=... | | stmts.go:32:5:32:14 | skip | stmts.go:23:6:23:9 | true | | stmts.go:34:5:34:12 | skip | stmts.go:24:23:24:23 | i | -| stmts.go:39:2:39:2 | assignment to k | stmts.go:41:3:41:12 | skip | | stmts.go:39:2:39:2 | skip | stmts.go:39:7:39:7 | 9 | -| stmts.go:39:7:39:7 | 9 | stmts.go:39:2:39:2 | assignment to k | +| stmts.go:39:2:39:7 | assign:0 ... := ... | stmts.go:41:3:41:12 | skip | +| stmts.go:39:7:39:7 | 9 | stmts.go:39:2:39:7 | assign:0 ... := ... | | stmts.go:40:10:40:10 | k | stmts.go:40:10:40:12 | 1 | -| stmts.go:40:10:40:12 | 1 | stmts.go:40:10:40:12 | rhs of increment statement | +| stmts.go:40:10:40:12 | 1 | stmts.go:40:10:40:12 | incdec-rhs increment statement | +| stmts.go:40:10:40:12 | incdec-rhs increment statement | stmts.go:40:10:40:12 | increment statement | | stmts.go:40:10:40:12 | increment statement | stmts.go:41:3:41:12 | skip | -| stmts.go:40:10:40:12 | rhs of increment statement | stmts.go:40:10:40:12 | increment statement | | stmts.go:41:3:41:12 | skip | stmts.go:23:6:23:9 | true | -| stmts.go:46:1:62:1 | entry | stmts.go:46:12:46:14 | argument corresponding to ch1 | +| stmts.go:46:1:62:1 | entry | stmts.go:46:12:46:14 | ch1 | | stmts.go:46:1:62:1 | function declaration | stmts.go:65:6:65:10 | skip | | stmts.go:46:6:46:10 | skip | stmts.go:46:1:62:1 | function declaration | -| stmts.go:46:12:46:14 | argument corresponding to ch1 | stmts.go:46:12:46:14 | initialization of ch1 | -| stmts.go:46:12:46:14 | initialization of ch1 | stmts.go:46:26:46:28 | argument corresponding to ch2 | -| stmts.go:46:26:46:28 | argument corresponding to ch2 | stmts.go:46:26:46:28 | initialization of ch2 | -| stmts.go:46:26:46:28 | initialization of ch2 | stmts.go:47:6:47:6 | skip | -| stmts.go:47:6:47:6 | assignment to a | stmts.go:48:6:48:6 | skip | -| stmts.go:47:6:47:6 | skip | stmts.go:47:6:47:6 | zero value for a | -| stmts.go:47:6:47:6 | zero value for a | stmts.go:47:6:47:6 | assignment to a | -| stmts.go:48:6:48:6 | assignment to w | stmts.go:51:9:51:11 | ch1 | -| stmts.go:48:6:48:6 | skip | stmts.go:48:6:48:6 | zero value for w | -| stmts.go:48:6:48:6 | zero value for w | stmts.go:48:6:48:6 | assignment to w | +| stmts.go:46:12:46:14 | ch1 | stmts.go:46:12:46:14 | ch1 | +| stmts.go:46:12:46:14 | ch1 | stmts.go:46:26:46:28 | ch2 | +| stmts.go:46:26:46:28 | ch2 | stmts.go:46:26:46:28 | ch2 | +| stmts.go:46:26:46:28 | ch2 | stmts.go:47:6:47:6 | skip | +| stmts.go:47:6:47:6 | skip | stmts.go:47:6:47:17 | zero-init:0 value declaration specifier | +| stmts.go:47:6:47:17 | assign:0 value declaration specifier | stmts.go:48:6:48:6 | skip | +| stmts.go:47:6:47:17 | zero-init:0 value declaration specifier | stmts.go:47:6:47:17 | assign:0 value declaration specifier | +| stmts.go:48:6:48:6 | skip | stmts.go:48:6:48:11 | zero-init:0 value declaration specifier | +| stmts.go:48:6:48:11 | assign:0 value declaration specifier | stmts.go:51:9:51:11 | ch1 | +| stmts.go:48:6:48:11 | zero-init:0 value declaration specifier | stmts.go:48:6:48:11 | assign:0 value declaration specifier | | stmts.go:50:2:59:2 | select statement | stmts.go:51:7:51:11 | <-... | | stmts.go:50:2:59:2 | select statement | stmts.go:53:17:53:21 | <-... | | stmts.go:50:2:59:2 | select statement | stmts.go:57:3:57:13 | selection of Println | @@ -1541,14 +1541,14 @@ | stmts.go:52:3:52:31 | call to Println | stmts.go:61:2:61:10 | select statement | | stmts.go:52:15:52:30 | "Heard from ch1" | stmts.go:52:3:52:31 | call to Println | | stmts.go:53:7:53:7 | a | stmts.go:53:9:53:9 | 0 | -| stmts.go:53:7:53:10 | assignment to element | stmts.go:53:7:53:21 | ... = ...[1] | | stmts.go:53:7:53:10 | skip | stmts.go:46:1:62:1 | exit | | stmts.go:53:7:53:10 | skip | stmts.go:53:13:53:13 | skip | -| stmts.go:53:7:53:21 | ... = ...[0] | stmts.go:53:7:53:10 | assignment to element | -| stmts.go:53:7:53:21 | ... = ...[1] | stmts.go:53:13:53:13 | assignment to w | +| stmts.go:53:7:53:21 | assign:0 ... = ... | stmts.go:53:7:53:21 | extract:1 ... = ... | +| stmts.go:53:7:53:21 | assign:1 ... = ... | stmts.go:54:3:54:13 | selection of Println | +| stmts.go:53:7:53:21 | extract:0 ... = ... | stmts.go:53:7:53:21 | assign:0 ... = ... | +| stmts.go:53:7:53:21 | extract:1 ... = ... | stmts.go:53:7:53:21 | assign:1 ... = ... | | stmts.go:53:9:53:9 | 0 | stmts.go:53:7:53:10 | skip | -| stmts.go:53:13:53:13 | assignment to w | stmts.go:54:3:54:13 | selection of Println | -| stmts.go:53:13:53:13 | skip | stmts.go:53:7:53:21 | ... = ...[0] | +| stmts.go:53:13:53:13 | skip | stmts.go:53:7:53:21 | extract:0 ... = ... | | stmts.go:53:17:53:21 | <-... | stmts.go:53:7:53:7 | a | | stmts.go:53:19:53:21 | ch2 | stmts.go:58:7:58:9 | ch1 | | stmts.go:54:3:54:13 | selection of Println | stmts.go:54:15:54:15 | a | @@ -1567,11 +1567,11 @@ | stmts.go:58:7:58:15 | send statement | stmts.go:46:1:62:1 | exit | | stmts.go:58:7:58:15 | send statement | stmts.go:58:2:58:16 | skip | | stmts.go:58:14:58:15 | 42 | stmts.go:50:2:59:2 | select statement | -| stmts.go:65:1:72:1 | entry | stmts.go:65:12:65:12 | argument corresponding to x | +| stmts.go:65:1:72:1 | entry | stmts.go:65:12:65:12 | x | | stmts.go:65:1:72:1 | function declaration | stmts.go:75:6:75:10 | skip | | stmts.go:65:6:65:10 | skip | stmts.go:65:1:72:1 | function declaration | -| stmts.go:65:12:65:12 | argument corresponding to x | stmts.go:65:12:65:12 | initialization of x | -| stmts.go:65:12:65:12 | initialization of x | stmts.go:66:5:66:5 | x | +| stmts.go:65:12:65:12 | x | stmts.go:65:12:65:12 | x | +| stmts.go:65:12:65:12 | x | stmts.go:66:5:66:5 | x | | stmts.go:66:5:66:5 | x | stmts.go:66:9:66:9 | 0 | | stmts.go:66:5:66:9 | ...>... | stmts.go:66:5:66:9 | ...>... is false | | stmts.go:66:5:66:9 | ...>... | stmts.go:66:5:66:9 | ...>... is true | @@ -1596,15 +1596,15 @@ | stmts.go:71:2:71:10 | return statement | stmts.go:67:9:67:35 | function call | | stmts.go:71:2:71:10 | return statement | stmts.go:69:9:69:36 | function call | | stmts.go:71:9:71:10 | 42 | stmts.go:71:2:71:10 | return statement | -| stmts.go:75:1:109:1 | entry | stmts.go:75:12:75:12 | argument corresponding to x | +| stmts.go:75:1:109:1 | entry | stmts.go:75:12:75:12 | x | | stmts.go:75:1:109:1 | function declaration | stmts.go:112:6:112:10 | skip | | stmts.go:75:6:75:10 | skip | stmts.go:75:1:109:1 | function declaration | -| stmts.go:75:12:75:12 | argument corresponding to x | stmts.go:75:12:75:12 | initialization of x | -| stmts.go:75:12:75:12 | initialization of x | stmts.go:76:9:76:9 | x | +| stmts.go:75:12:75:12 | x | stmts.go:75:12:75:12 | x | +| stmts.go:75:12:75:12 | x | stmts.go:76:9:76:9 | x | | stmts.go:76:9:76:9 | x | stmts.go:79:9:79:9 | skip | -| stmts.go:79:9:79:9 | assignment to y | stmts.go:79:17:79:17 | y | | stmts.go:79:9:79:9 | skip | stmts.go:79:14:79:14 | x | -| stmts.go:79:14:79:14 | x | stmts.go:79:9:79:9 | assignment to y | +| stmts.go:79:9:79:14 | assign:0 ... := ... | stmts.go:79:17:79:17 | y | +| stmts.go:79:14:79:14 | x | stmts.go:79:9:79:14 | assign:0 ... := ... | | stmts.go:79:17:79:17 | y | stmts.go:79:21:79:22 | 19 | | stmts.go:79:17:79:22 | ...-... | stmts.go:81:3:81:7 | test5 | | stmts.go:79:21:79:22 | 19 | stmts.go:79:17:79:22 | ...-... | @@ -1613,65 +1613,65 @@ | stmts.go:81:9:81:13 | false | stmts.go:81:3:81:14 | call to test5 | | stmts.go:84:9:84:9 | x | stmts.go:85:7:85:7 | 1 | | stmts.go:84:9:84:9 | x | stmts.go:90:9:90:9 | x | +| stmts.go:85:2:85:8 | case 1 | stmts.go:85:2:85:8 | skip | +| stmts.go:85:2:85:8 | case 1 | stmts.go:86:7:86:7 | 2 | | stmts.go:85:2:85:8 | skip | stmts.go:90:9:90:9 | x | -| stmts.go:85:7:85:7 | 1 | stmts.go:85:7:85:7 | case 1 | -| stmts.go:85:7:85:7 | case 1 | stmts.go:85:2:85:8 | skip | -| stmts.go:85:7:85:7 | case 1 | stmts.go:86:7:86:7 | 2 | -| stmts.go:86:7:86:7 | 2 | stmts.go:86:7:86:7 | case 2 | -| stmts.go:86:7:86:7 | case 2 | stmts.go:86:10:86:10 | 3 | -| stmts.go:86:7:86:7 | case 2 | stmts.go:87:3:87:7 | test5 | -| stmts.go:86:10:86:10 | 3 | stmts.go:86:10:86:10 | case 3 | -| stmts.go:86:10:86:10 | case 3 | stmts.go:87:3:87:7 | test5 | -| stmts.go:86:10:86:10 | case 3 | stmts.go:90:9:90:9 | x | +| stmts.go:85:7:85:7 | 1 | stmts.go:85:2:85:8 | case 1 | +| stmts.go:86:2:87:13 | case 2 | stmts.go:86:10:86:10 | 3 | +| stmts.go:86:2:87:13 | case 2 | stmts.go:87:3:87:7 | test5 | +| stmts.go:86:2:87:13 | case 3 | stmts.go:87:3:87:7 | test5 | +| stmts.go:86:2:87:13 | case 3 | stmts.go:90:9:90:9 | x | +| stmts.go:86:7:86:7 | 2 | stmts.go:86:2:87:13 | case 2 | +| stmts.go:86:10:86:10 | 3 | stmts.go:86:2:87:13 | case 3 | | stmts.go:87:3:87:7 | test5 | stmts.go:87:9:87:12 | true | | stmts.go:87:9:87:12 | true | stmts.go:87:3:87:13 | call to test5 | | stmts.go:90:9:90:9 | x | stmts.go:91:7:91:7 | 1 | | stmts.go:90:9:90:9 | x | stmts.go:98:9:98:9 | x | -| stmts.go:91:7:91:7 | 1 | stmts.go:91:7:91:7 | case 1 | -| stmts.go:91:7:91:7 | case 1 | stmts.go:92:3:92:7 | test5 | -| stmts.go:91:7:91:7 | case 1 | stmts.go:94:7:94:11 | ...-... | +| stmts.go:91:2:93:13 | case 1 | stmts.go:92:3:92:7 | test5 | +| stmts.go:91:2:93:13 | case 1 | stmts.go:94:7:94:11 | ...-... | +| stmts.go:91:7:91:7 | 1 | stmts.go:91:2:93:13 | case 1 | | stmts.go:92:3:92:7 | test5 | stmts.go:92:9:92:13 | false | | stmts.go:92:9:92:13 | false | stmts.go:92:3:92:14 | call to test5 | | stmts.go:93:3:93:13 | skip | stmts.go:95:3:95:7 | test5 | -| stmts.go:94:7:94:11 | ...-... | stmts.go:94:7:94:11 | case ...-... | -| stmts.go:94:7:94:11 | case ...-... | stmts.go:95:3:95:7 | test5 | -| stmts.go:94:7:94:11 | case ...-... | stmts.go:98:9:98:9 | x | +| stmts.go:94:2:95:13 | case ...-... | stmts.go:95:3:95:7 | test5 | +| stmts.go:94:2:95:13 | case ...-... | stmts.go:98:9:98:9 | x | +| stmts.go:94:7:94:11 | ...-... | stmts.go:94:2:95:13 | case ...-... | | stmts.go:95:3:95:7 | test5 | stmts.go:95:9:95:12 | true | | stmts.go:95:9:95:12 | true | stmts.go:95:3:95:13 | call to test5 | | stmts.go:98:9:98:9 | x | stmts.go:100:7:100:7 | 2 | | stmts.go:99:2:99:9 | skip | stmts.go:104:2:108:2 | true | -| stmts.go:100:7:100:7 | 2 | stmts.go:100:7:100:7 | case 2 | -| stmts.go:100:7:100:7 | case 2 | stmts.go:99:2:99:9 | skip | -| stmts.go:100:7:100:7 | case 2 | stmts.go:101:3:101:7 | test5 | +| stmts.go:100:2:101:13 | case 2 | stmts.go:99:2:99:9 | skip | +| stmts.go:100:2:101:13 | case 2 | stmts.go:101:3:101:7 | test5 | +| stmts.go:100:7:100:7 | 2 | stmts.go:100:2:101:13 | case 2 | | stmts.go:101:3:101:7 | test5 | stmts.go:101:9:101:12 | true | | stmts.go:101:9:101:12 | true | stmts.go:101:3:101:13 | call to test5 | | stmts.go:104:2:108:2 | true | stmts.go:107:7:107:10 | true | -| stmts.go:107:7:107:10 | case true | stmts.go:107:7:107:10 | true is false | -| stmts.go:107:7:107:10 | case true | stmts.go:107:7:107:10 | true is true | -| stmts.go:107:7:107:10 | true | stmts.go:107:7:107:10 | case true | +| stmts.go:107:2:107:11 | case true | stmts.go:107:7:107:10 | true is false | +| stmts.go:107:2:107:11 | case true | stmts.go:107:7:107:10 | true is true | +| stmts.go:107:7:107:10 | true | stmts.go:107:2:107:11 | case true | | stmts.go:107:7:107:10 | true is false | stmts.go:106:3:106:7 | skip | | stmts.go:107:7:107:10 | true is true | stmts.go:107:2:107:11 | skip | -| stmts.go:112:1:137:1 | entry | stmts.go:112:12:112:12 | argument corresponding to x | +| stmts.go:112:1:137:1 | entry | stmts.go:112:12:112:12 | x | | stmts.go:112:1:137:1 | function declaration | stmts.go:140:6:140:11 | skip | | stmts.go:112:6:112:10 | skip | stmts.go:112:1:137:1 | function declaration | -| stmts.go:112:12:112:12 | argument corresponding to x | stmts.go:112:12:112:12 | initialization of x | -| stmts.go:112:12:112:12 | initialization of x | stmts.go:113:9:113:9 | skip | -| stmts.go:113:9:113:9 | assignment to y | stmts.go:114:7:114:11 | case error | +| stmts.go:112:12:112:12 | x | stmts.go:112:12:112:12 | x | +| stmts.go:112:12:112:12 | x | stmts.go:113:9:113:9 | skip | | stmts.go:113:9:113:9 | skip | stmts.go:113:14:113:14 | x | +| stmts.go:113:9:113:21 | assign:0 ... := ... | stmts.go:114:2:115:16 | case error | | stmts.go:113:14:113:14 | x | stmts.go:113:14:113:21 | type assertion | -| stmts.go:113:14:113:21 | type assertion | stmts.go:113:9:113:9 | assignment to y | +| stmts.go:113:14:113:21 | type assertion | stmts.go:113:9:113:21 | assign:0 ... := ... | +| stmts.go:114:2:115:16 | case error | stmts.go:114:2:115:16 | case string | +| stmts.go:114:2:115:16 | case error | stmts.go:114:2:115:16 | implicit type switch variable declaration | +| stmts.go:114:2:115:16 | case string | stmts.go:114:2:115:16 | implicit type switch variable declaration | +| stmts.go:114:2:115:16 | case string | stmts.go:116:2:118:14 | case float32 | | stmts.go:114:2:115:16 | implicit type switch variable declaration | stmts.go:115:3:115:13 | selection of Println | -| stmts.go:114:7:114:11 | case error | stmts.go:114:2:115:16 | implicit type switch variable declaration | -| stmts.go:114:7:114:11 | case error | stmts.go:114:14:114:19 | case string | -| stmts.go:114:14:114:19 | case string | stmts.go:114:2:115:16 | implicit type switch variable declaration | -| stmts.go:114:14:114:19 | case string | stmts.go:116:7:116:13 | case float32 | | stmts.go:115:3:115:13 | selection of Println | stmts.go:115:15:115:15 | y | | stmts.go:115:3:115:16 | call to Println | stmts.go:112:1:137:1 | exit | | stmts.go:115:3:115:16 | call to Println | stmts.go:123:9:123:9 | skip | | stmts.go:115:15:115:15 | y | stmts.go:115:3:115:16 | call to Println | +| stmts.go:116:2:118:14 | case float32 | stmts.go:116:2:118:14 | implicit type switch variable declaration | +| stmts.go:116:2:118:14 | case float32 | stmts.go:119:2:120:7 | implicit type switch variable declaration | | stmts.go:116:2:118:14 | implicit type switch variable declaration | stmts.go:117:3:117:7 | test5 | -| stmts.go:116:7:116:13 | case float32 | stmts.go:116:2:118:14 | implicit type switch variable declaration | -| stmts.go:116:7:116:13 | case float32 | stmts.go:119:2:120:7 | implicit type switch variable declaration | | stmts.go:117:3:117:7 | test5 | stmts.go:117:9:117:12 | true | | stmts.go:117:3:117:13 | call to test5 | stmts.go:112:1:137:1 | exit | | stmts.go:117:9:117:12 | true | stmts.go:117:3:117:13 | call to test5 | @@ -1680,21 +1680,21 @@ | stmts.go:119:2:120:7 | implicit type switch variable declaration | stmts.go:120:3:120:3 | skip | | stmts.go:120:3:120:3 | skip | stmts.go:120:7:120:7 | y | | stmts.go:120:7:120:7 | y | stmts.go:123:9:123:9 | skip | -| stmts.go:123:9:123:9 | assignment to y | stmts.go:123:17:123:17 | y | | stmts.go:123:9:123:9 | skip | stmts.go:123:14:123:14 | x | -| stmts.go:123:14:123:14 | x | stmts.go:123:9:123:9 | assignment to y | +| stmts.go:123:9:123:14 | assign:0 ... := ... | stmts.go:123:17:123:17 | y | +| stmts.go:123:14:123:14 | x | stmts.go:123:9:123:14 | assign:0 ... := ... | | stmts.go:123:17:123:17 | y | stmts.go:123:17:123:24 | type assertion | -| stmts.go:123:17:123:24 | type assertion | stmts.go:124:7:124:11 | case error | -| stmts.go:124:7:124:11 | case error | stmts.go:124:14:124:19 | case string | -| stmts.go:124:7:124:11 | case error | stmts.go:125:3:125:13 | selection of Println | -| stmts.go:124:14:124:19 | case string | stmts.go:125:3:125:13 | selection of Println | -| stmts.go:124:14:124:19 | case string | stmts.go:126:7:126:13 | case float32 | +| stmts.go:123:17:123:24 | type assertion | stmts.go:124:2:125:16 | case error | +| stmts.go:124:2:125:16 | case error | stmts.go:124:2:125:16 | case string | +| stmts.go:124:2:125:16 | case error | stmts.go:125:3:125:13 | selection of Println | +| stmts.go:124:2:125:16 | case string | stmts.go:125:3:125:13 | selection of Println | +| stmts.go:124:2:125:16 | case string | stmts.go:126:2:128:14 | case float32 | | stmts.go:125:3:125:13 | selection of Println | stmts.go:125:15:125:15 | y | | stmts.go:125:3:125:16 | call to Println | stmts.go:112:1:137:1 | exit | | stmts.go:125:3:125:16 | call to Println | stmts.go:133:9:133:9 | skip | | stmts.go:125:15:125:15 | y | stmts.go:125:3:125:16 | call to Println | -| stmts.go:126:7:126:13 | case float32 | stmts.go:127:3:127:7 | test5 | -| stmts.go:126:7:126:13 | case float32 | stmts.go:130:3:130:3 | skip | +| stmts.go:126:2:128:14 | case float32 | stmts.go:127:3:127:7 | test5 | +| stmts.go:126:2:128:14 | case float32 | stmts.go:130:3:130:3 | skip | | stmts.go:127:3:127:7 | test5 | stmts.go:127:9:127:12 | true | | stmts.go:127:3:127:13 | call to test5 | stmts.go:112:1:137:1 | exit | | stmts.go:127:9:127:12 | true | stmts.go:127:3:127:13 | call to test5 | @@ -1702,29 +1702,29 @@ | stmts.go:128:9:128:13 | false | stmts.go:128:3:128:14 | call to test5 | | stmts.go:130:3:130:3 | skip | stmts.go:130:7:130:7 | y | | stmts.go:130:7:130:7 | y | stmts.go:133:9:133:9 | skip | -| stmts.go:133:9:133:9 | assignment to y | stmts.go:133:17:133:17 | y | | stmts.go:133:9:133:9 | skip | stmts.go:133:14:133:14 | x | -| stmts.go:133:14:133:14 | x | stmts.go:133:9:133:9 | assignment to y | +| stmts.go:133:9:133:14 | assign:0 ... := ... | stmts.go:133:17:133:17 | y | +| stmts.go:133:14:133:14 | x | stmts.go:133:9:133:14 | assign:0 ... := ... | | stmts.go:133:17:133:17 | y | stmts.go:133:17:133:24 | type assertion | | stmts.go:133:17:133:24 | type assertion | stmts.go:135:3:135:7 | test5 | | stmts.go:135:3:135:7 | test5 | stmts.go:135:9:135:13 | false | | stmts.go:135:3:135:14 | call to test5 | stmts.go:112:1:137:1 | exit | | stmts.go:135:9:135:13 | false | stmts.go:135:3:135:14 | call to test5 | -| stmts.go:140:1:142:1 | entry | stmts.go:140:13:140:13 | argument corresponding to f | +| stmts.go:140:1:142:1 | entry | stmts.go:140:13:140:13 | f | | stmts.go:140:1:142:1 | function declaration | stmts.go:145:6:145:11 | skip | | stmts.go:140:6:140:11 | skip | stmts.go:140:1:142:1 | function declaration | -| stmts.go:140:13:140:13 | argument corresponding to f | stmts.go:140:13:140:13 | initialization of f | -| stmts.go:140:13:140:13 | initialization of f | stmts.go:141:5:141:5 | f | +| stmts.go:140:13:140:13 | f | stmts.go:140:13:140:13 | f | +| stmts.go:140:13:140:13 | f | stmts.go:141:5:141:5 | f | | stmts.go:141:2:141:7 | go statement | stmts.go:140:1:142:1 | exit | | stmts.go:141:5:141:5 | f | stmts.go:141:2:141:7 | go statement | -| stmts.go:145:1:159:1 | entry | stmts.go:145:13:145:14 | argument corresponding to xs | +| stmts.go:145:1:159:1 | entry | stmts.go:145:13:145:14 | xs | | stmts.go:145:1:159:1 | function declaration | stmts.go:0:0:0:0 | exit | | stmts.go:145:6:145:11 | skip | stmts.go:145:1:159:1 | function declaration | -| stmts.go:145:13:145:14 | argument corresponding to xs | stmts.go:145:13:145:14 | initialization of xs | -| stmts.go:145:13:145:14 | initialization of xs | stmts.go:146:17:146:18 | xs | -| stmts.go:146:2:151:2 | range statement[0] | stmts.go:146:6:146:6 | assignment to x | -| stmts.go:146:6:146:6 | assignment to x | stmts.go:147:6:147:6 | x | -| stmts.go:146:6:146:6 | skip | stmts.go:146:2:151:2 | range statement[0] | +| stmts.go:145:13:145:14 | xs | stmts.go:145:13:145:14 | xs | +| stmts.go:145:13:145:14 | xs | stmts.go:146:17:146:18 | xs | +| stmts.go:146:2:151:2 | assign:0 range statement | stmts.go:147:6:147:6 | x | +| stmts.go:146:2:151:2 | extract:0 range statement | stmts.go:146:2:151:2 | assign:0 range statement | +| stmts.go:146:6:146:6 | skip | stmts.go:146:2:151:2 | extract:0 range statement | | stmts.go:146:17:146:18 | next key-value pair in range | stmts.go:146:6:146:6 | skip | | stmts.go:146:17:146:18 | next key-value pair in range | stmts.go:153:20:153:21 | xs | | stmts.go:146:17:146:18 | xs | stmts.go:146:17:146:18 | next key-value pair in range | @@ -1739,12 +1739,12 @@ | stmts.go:150:3:150:14 | call to Print | stmts.go:145:1:159:1 | exit | | stmts.go:150:3:150:14 | call to Print | stmts.go:146:17:146:18 | next key-value pair in range | | stmts.go:150:13:150:13 | x | stmts.go:150:3:150:14 | call to Print | -| stmts.go:153:2:155:2 | range statement[0] | stmts.go:153:2:155:2 | range statement[1] | -| stmts.go:153:2:155:2 | range statement[1] | stmts.go:153:6:153:6 | assignment to i | -| stmts.go:153:6:153:6 | assignment to i | stmts.go:153:9:153:9 | assignment to v | +| stmts.go:153:2:155:2 | assign:0 range statement | stmts.go:153:2:155:2 | assign:1 range statement | +| stmts.go:153:2:155:2 | assign:1 range statement | stmts.go:154:3:154:11 | selection of Print | +| stmts.go:153:2:155:2 | extract:0 range statement | stmts.go:153:2:155:2 | extract:1 range statement | +| stmts.go:153:2:155:2 | extract:1 range statement | stmts.go:153:2:155:2 | assign:0 range statement | | stmts.go:153:6:153:6 | skip | stmts.go:153:9:153:9 | skip | -| stmts.go:153:9:153:9 | assignment to v | stmts.go:154:3:154:11 | selection of Print | -| stmts.go:153:9:153:9 | skip | stmts.go:153:2:155:2 | range statement[0] | +| stmts.go:153:9:153:9 | skip | stmts.go:153:2:155:2 | extract:0 range statement | | stmts.go:153:20:153:21 | next key-value pair in range | stmts.go:153:6:153:6 | skip | | stmts.go:153:20:153:21 | next key-value pair in range | stmts.go:157:12:157:13 | xs | | stmts.go:153:20:153:21 | xs | stmts.go:153:20:153:21 | next key-value pair in range | @@ -1758,57 +1758,57 @@ | stmts.go:157:12:157:13 | xs | stmts.go:157:12:157:13 | next key-value pair in range | | stmts.go:157:15:158:2 | skip | stmts.go:157:12:157:13 | next key-value pair in range | | tst.go:0:0:0:0 | entry | tst.go:3:6:3:10 | skip | -| tst.go:3:1:12:1 | entry | tst.go:3:12:3:12 | argument corresponding to x | +| tst.go:3:1:12:1 | entry | tst.go:3:12:3:12 | x | | tst.go:3:1:12:1 | function declaration | tst.go:14:6:14:11 | skip | | tst.go:3:6:3:10 | skip | tst.go:3:1:12:1 | function declaration | -| tst.go:3:12:3:12 | argument corresponding to x | tst.go:3:12:3:12 | initialization of x | -| tst.go:3:12:3:12 | initialization of x | tst.go:4:2:11:2 | true | +| tst.go:3:12:3:12 | x | tst.go:3:12:3:12 | x | +| tst.go:3:12:3:12 | x | tst.go:4:2:11:2 | true | | tst.go:4:2:11:2 | true | tst.go:5:7:5:7 | x | +| tst.go:5:2:5:13 | case ...<... | tst.go:5:7:5:12 | ...<... is false | +| tst.go:5:2:5:13 | case ...<... | tst.go:5:7:5:12 | ...<... is true | | tst.go:5:2:5:13 | skip | tst.go:3:1:12:1 | exit | | tst.go:5:7:5:7 | x | tst.go:5:11:5:12 | 23 | -| tst.go:5:7:5:12 | ...<... | tst.go:5:7:5:12 | case ...<... | +| tst.go:5:7:5:12 | ...<... | tst.go:5:2:5:13 | case ...<... | | tst.go:5:7:5:12 | ...<... is false | tst.go:7:7:7:7 | x | | tst.go:5:7:5:12 | ...<... is true | tst.go:5:2:5:13 | skip | -| tst.go:5:7:5:12 | case ...<... | tst.go:5:7:5:12 | ...<... is false | -| tst.go:5:7:5:12 | case ...<... | tst.go:5:7:5:12 | ...<... is true | | tst.go:5:11:5:12 | 23 | tst.go:5:7:5:12 | ...<... | +| tst.go:7:2:7:13 | case ...<... | tst.go:7:7:7:12 | ...<... is false | +| tst.go:7:2:7:13 | case ...<... | tst.go:7:7:7:12 | ...<... is true | | tst.go:7:2:7:13 | skip | tst.go:3:1:12:1 | exit | | tst.go:7:7:7:7 | x | tst.go:7:11:7:12 | 42 | -| tst.go:7:7:7:12 | ...<... | tst.go:7:7:7:12 | case ...<... | +| tst.go:7:7:7:12 | ...<... | tst.go:7:2:7:13 | case ...<... | | tst.go:7:7:7:12 | ...<... is false | tst.go:9:7:9:7 | x | | tst.go:7:7:7:12 | ...<... is true | tst.go:7:2:7:13 | skip | -| tst.go:7:7:7:12 | case ...<... | tst.go:7:7:7:12 | ...<... is false | -| tst.go:7:7:7:12 | case ...<... | tst.go:7:7:7:12 | ...<... is true | | tst.go:7:11:7:12 | 42 | tst.go:7:7:7:12 | ...<... | +| tst.go:9:2:9:13 | case ...<... | tst.go:9:7:9:12 | ...<... is false | +| tst.go:9:2:9:13 | case ...<... | tst.go:9:7:9:12 | ...<... is true | | tst.go:9:2:9:13 | skip | tst.go:3:1:12:1 | exit | | tst.go:9:7:9:7 | x | tst.go:9:11:9:12 | 23 | -| tst.go:9:7:9:12 | ...<... | tst.go:9:7:9:12 | case ...<... | +| tst.go:9:7:9:12 | ...<... | tst.go:9:2:9:13 | case ...<... | | tst.go:9:7:9:12 | ...<... is false | tst.go:3:1:12:1 | exit | | tst.go:9:7:9:12 | ...<... is true | tst.go:9:2:9:13 | skip | -| tst.go:9:7:9:12 | case ...<... | tst.go:9:7:9:12 | ...<... is false | -| tst.go:9:7:9:12 | case ...<... | tst.go:9:7:9:12 | ...<... is true | | tst.go:9:11:9:12 | 23 | tst.go:9:7:9:12 | ...<... | -| tst.go:14:1:21:1 | entry | tst.go:14:13:14:17 | argument corresponding to value | +| tst.go:14:1:21:1 | entry | tst.go:14:13:14:17 | value | | tst.go:14:1:21:1 | function declaration | tst.go:23:6:23:11 | skip | | tst.go:14:6:14:11 | skip | tst.go:14:1:21:1 | function declaration | -| tst.go:14:13:14:17 | argument corresponding to value | tst.go:14:13:14:17 | initialization of value | -| tst.go:14:13:14:17 | initialization of value | tst.go:15:2:20:2 | true | +| tst.go:14:13:14:17 | value | tst.go:14:13:14:17 | value | +| tst.go:14:13:14:17 | value | tst.go:15:2:20:2 | true | | tst.go:15:2:20:2 | true | tst.go:16:7:16:11 | value | +| tst.go:16:2:16:34 | case ...<... | tst.go:16:7:16:33 | ...<... is false | +| tst.go:16:2:16:34 | case ...<... | tst.go:16:7:16:33 | ...<... is true | | tst.go:16:2:16:34 | skip | tst.go:14:1:21:1 | exit | | tst.go:16:7:16:11 | value | tst.go:16:15:16:33 | ...*... | -| tst.go:16:7:16:33 | ...<... | tst.go:16:7:16:33 | case ...<... | +| tst.go:16:7:16:33 | ...<... | tst.go:16:2:16:34 | case ...<... | | tst.go:16:7:16:33 | ...<... is false | tst.go:18:7:18:11 | value | | tst.go:16:7:16:33 | ...<... is true | tst.go:16:2:16:34 | skip | -| tst.go:16:7:16:33 | case ...<... | tst.go:16:7:16:33 | ...<... is false | -| tst.go:16:7:16:33 | case ...<... | tst.go:16:7:16:33 | ...<... is true | | tst.go:16:15:16:33 | ...*... | tst.go:16:7:16:33 | ...<... | +| tst.go:18:2:18:39 | case ...<... | tst.go:18:7:18:38 | ...<... is false | +| tst.go:18:2:18:39 | case ...<... | tst.go:18:7:18:38 | ...<... is true | | tst.go:18:2:18:39 | skip | tst.go:14:1:21:1 | exit | | tst.go:18:7:18:11 | value | tst.go:18:15:18:38 | ...*... | -| tst.go:18:7:18:38 | ...<... | tst.go:18:7:18:38 | case ...<... | +| tst.go:18:7:18:38 | ...<... | tst.go:18:2:18:39 | case ...<... | | tst.go:18:7:18:38 | ...<... is false | tst.go:14:1:21:1 | exit | | tst.go:18:7:18:38 | ...<... is true | tst.go:18:2:18:39 | skip | -| tst.go:18:7:18:38 | case ...<... | tst.go:18:7:18:38 | ...<... is false | -| tst.go:18:7:18:38 | case ...<... | tst.go:18:7:18:38 | ...<... is true | | tst.go:18:15:18:38 | ...*... | tst.go:18:7:18:38 | ...<... | | tst.go:23:1:26:1 | entry | tst.go:24:2:25:2 | true | | tst.go:23:1:26:1 | function declaration | tst.go:28:6:28:11 | skip | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/DefaultTaintSanitizer/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/dataflow/DefaultTaintSanitizer/CONSISTENCY/DataFlowConsistency.expected index cf59277a48b3..c1715caa6ec3 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/DefaultTaintSanitizer/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/DefaultTaintSanitizer/CONSISTENCY/DataFlowConsistency.expected @@ -1,6 +1,6 @@ reverseRead -| Builtin.go:7:2:7:10 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Builtin.go:13:2:13:10 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Builtin.go:22:2:22:10 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Builtin.go:32:2:32:10 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Builtin.go:39:2:39:10 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Builtin.go:7:2:7:10 | implicit-deref sourceReq | Origin of readStep is missing a PostUpdateNode. | +| Builtin.go:13:2:13:10 | implicit-deref sourceReq | Origin of readStep is missing a PostUpdateNode. | +| Builtin.go:22:2:22:10 | implicit-deref sourceReq | Origin of readStep is missing a PostUpdateNode. | +| Builtin.go:32:2:32:10 | implicit-deref sourceReq | Origin of readStep is missing a PostUpdateNode. | +| Builtin.go:39:2:39:10 | implicit-deref sourceReq | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalTaintFlow/srcs.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalTaintFlow/srcs.expected index dac989575507..f446be1e266b 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalTaintFlow/srcs.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalTaintFlow/srcs.expected @@ -4,9 +4,9 @@ invalidModelRow | test.go:40:8:40:15 | call to Src2 | qltest | | test.go:40:8:40:15 | call to Src2 | qltest-w-subtypes | | test.go:41:8:41:16 | call to Src2 | qltest-w-subtypes | -| test.go:42:2:42:21 | ... = ...[0] | qltest | -| test.go:42:2:42:21 | ... = ...[1] | qltest-w-subtypes | -| test.go:43:2:43:22 | ... = ...[1] | qltest-w-subtypes | +| test.go:42:2:42:21 | extract:0 ... = ... | qltest | +| test.go:42:2:42:21 | extract:1 ... = ... | qltest-w-subtypes | +| test.go:43:2:43:22 | extract:1 ... = ... | qltest-w-subtypes | | test.go:44:11:44:13 | arg [postupdate] | qltest-arg | | test.go:59:9:59:16 | call to Src1 | qltest | | test.go:102:46:102:53 | call to Src1 | qltest | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalTaintFlow/steps.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalTaintFlow/steps.expected index 97a1cc49261a..b27341d3b8fb 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalTaintFlow/steps.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalTaintFlow/steps.expected @@ -1,14 +1,14 @@ invalidModelRow #select | test.go:17:23:17:25 | arg | test.go:17:10:17:26 | call to StepArgRes | -| test.go:18:27:18:29 | arg | test.go:18:2:18:30 | ... = ...[1] | +| test.go:18:27:18:29 | arg | test.go:18:2:18:30 | extract:1 ... = ... | | test.go:19:15:19:17 | arg | test.go:19:20:19:23 | arg1 [postupdate] | | test.go:21:16:21:18 | arg | test.go:21:2:21:2 | t [postupdate] | | test.go:22:10:22:10 | t | test.go:22:10:22:24 | call to StepQualRes | | test.go:23:2:23:2 | t | test.go:23:16:23:18 | arg [postupdate] | | test.go:24:32:24:34 | arg | test.go:24:10:24:35 | call to StepArgResNoQual | | test.go:61:25:61:27 | src | test.go:61:12:61:28 | call to StepArgRes | -| test.go:64:29:64:31 | src | test.go:64:2:64:32 | ... := ...[1] | +| test.go:64:29:64:31 | src | test.go:64:2:64:32 | extract:1 ... := ... | | test.go:68:15:68:17 | src | test.go:68:20:68:25 | taint3 [postupdate] | | test.go:76:21:76:23 | src | test.go:76:2:76:7 | taint4 [postupdate] | | test.go:79:13:79:25 | type assertion | test.go:79:12:79:40 | call to StepQualRes | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalValueFlow/srcs.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalValueFlow/srcs.expected index 87ca46d4c131..6e8870b33803 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalValueFlow/srcs.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalValueFlow/srcs.expected @@ -4,9 +4,9 @@ invalidModelRow | test.go:40:8:40:15 | call to Src2 | qltest | | test.go:40:8:40:15 | call to Src2 | qltest-w-subtypes | | test.go:41:8:41:16 | call to Src2 | qltest-w-subtypes | -| test.go:42:2:42:21 | ... = ...[0] | qltest | -| test.go:42:2:42:21 | ... = ...[1] | qltest-w-subtypes | -| test.go:43:2:43:22 | ... = ...[1] | qltest-w-subtypes | +| test.go:42:2:42:21 | extract:0 ... = ... | qltest | +| test.go:42:2:42:21 | extract:1 ... = ... | qltest-w-subtypes | +| test.go:43:2:43:22 | extract:1 ... = ... | qltest-w-subtypes | | test.go:44:11:44:13 | arg [postupdate] | qltest-arg | | test.go:59:9:59:16 | call to Src1 | qltest | | test.go:102:46:102:53 | call to Src1 | qltest | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalValueFlow/steps.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalValueFlow/steps.expected index eb52daa42537..83861e4d9f8d 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalValueFlow/steps.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalValueFlow/steps.expected @@ -1,14 +1,14 @@ invalidModelRow #select | test.go:17:23:17:25 | arg | test.go:17:10:17:26 | call to StepArgRes | -| test.go:18:27:18:29 | arg | test.go:18:2:18:30 | ... = ...[1] | +| test.go:18:27:18:29 | arg | test.go:18:2:18:30 | extract:1 ... = ... | | test.go:19:15:19:17 | arg | test.go:19:20:19:23 | arg1 [postupdate] | | test.go:21:16:21:18 | arg | test.go:21:2:21:2 | t [postupdate] | | test.go:22:10:22:10 | t | test.go:22:10:22:24 | call to StepQualRes | | test.go:23:2:23:2 | t | test.go:23:16:23:18 | arg [postupdate] | | test.go:24:32:24:34 | arg | test.go:24:10:24:35 | call to StepArgResNoQual | | test.go:61:25:61:27 | src | test.go:61:12:61:28 | call to StepArgRes | -| test.go:64:29:64:31 | src | test.go:64:2:64:32 | ... := ...[1] | +| test.go:64:29:64:31 | src | test.go:64:2:64:32 | extract:1 ... := ... | | test.go:68:15:68:17 | src | test.go:68:20:68:25 | taint3 [postupdate] | | test.go:76:21:76:23 | src | test.go:76:2:76:7 | taint4 [postupdate] | | test.go:79:13:79:25 | type assertion | test.go:79:12:79:40 | call to StepQualRes | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalFlowStep.expected b/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalFlowStep.expected index 0f34d6589170..b05db19a4183 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalFlowStep.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalFlowStep.expected @@ -1,169 +1,169 @@ | main.go:3:12:3:12 | SSA def(x) | main.go:5:5:5:5 | x | -| main.go:3:12:3:12 | argument corresponding to x | main.go:3:12:3:12 | SSA def(x) | +| main.go:3:12:3:12 | x | main.go:3:12:3:12 | SSA def(x) | | main.go:3:19:3:20 | SSA def(fn) | main.go:10:24:10:25 | fn | -| main.go:3:19:3:20 | argument corresponding to fn | main.go:3:19:3:20 | SSA def(fn) | +| main.go:3:19:3:20 | fn | main.go:3:19:3:20 | SSA def(fn) | | main.go:5:5:5:5 | x | main.go:6:7:6:7 | x | | main.go:5:5:5:5 | x | main.go:8:8:8:8 | x | -| main.go:6:3:6:3 | SSA def(y) | main.go:10:12:10:12 | y | -| main.go:6:7:6:7 | x | main.go:6:3:6:3 | SSA def(y) | +| main.go:6:3:6:7 | SSA def(y) | main.go:10:12:10:12 | y | +| main.go:6:7:6:7 | x | main.go:6:3:6:7 | SSA def(y) | | main.go:6:7:6:7 | x | main.go:10:7:10:7 | x | -| main.go:8:3:8:3 | SSA def(y) | main.go:10:12:10:12 | y | -| main.go:8:7:8:8 | -... | main.go:8:3:8:3 | SSA def(y) | +| main.go:8:3:8:8 | SSA def(y) | main.go:10:12:10:12 | y | +| main.go:8:7:8:8 | -... | main.go:8:3:8:8 | SSA def(y) | | main.go:8:8:8:8 | x | main.go:10:7:10:7 | x | -| main.go:10:2:10:2 | SSA def(z) | main.go:11:14:11:14 | z | +| main.go:10:2:10:27 | SSA def(z) | main.go:11:14:11:14 | z | | main.go:10:7:10:7 | x | main.go:10:22:10:22 | x | | main.go:10:7:10:12 | ...<=... | main.go:10:7:10:27 | ...&&... | -| main.go:10:7:10:27 | ...&&... | main.go:10:2:10:2 | SSA def(z) | +| main.go:10:7:10:27 | ...&&... | main.go:10:2:10:27 | SSA def(z) | | main.go:10:12:10:12 | y | main.go:10:17:10:17 | y | | main.go:10:17:10:27 | ...>=... | main.go:10:7:10:27 | ...&&... | | main.go:11:14:11:14 | z | main.go:11:9:11:15 | type conversion | -| main.go:15:9:15:9 | 0 | main.go:15:2:15:4 | SSA def(acc) | +| main.go:15:9:15:9 | 0 | main.go:15:2:15:9 | SSA def(acc) | | main.go:16:9:19:2 | SSA def(acc) | main.go:17:3:17:5 | acc | | main.go:17:3:17:7 | SSA def(acc) | main.go:18:10:18:12 | acc | -| main.go:17:3:17:7 | rhs of increment statement | main.go:17:3:17:7 | SSA def(acc) | +| main.go:17:3:17:7 | incdec-rhs increment statement | main.go:17:3:17:7 | SSA def(acc) | | main.go:22:12:22:12 | SSA def(b) | main.go:23:5:23:5 | b | -| main.go:22:12:22:12 | argument corresponding to b | main.go:22:12:22:12 | SSA def(b) | +| main.go:22:12:22:12 | b | main.go:22:12:22:12 | SSA def(b) | | main.go:22:20:22:20 | SSA def(x) | main.go:24:10:24:10 | x | | main.go:22:20:22:20 | SSA def(x) | main.go:26:11:26:11 | x | -| main.go:22:20:22:20 | argument corresponding to x | main.go:22:20:22:20 | SSA def(x) | +| main.go:22:20:22:20 | x | main.go:22:20:22:20 | SSA def(x) | | main.go:24:10:24:10 | x | main.go:24:10:24:19 | type assertion | -| main.go:26:2:26:2 | SSA def(n) | main.go:27:11:27:11 | n | -| main.go:26:2:26:17 | ... := ...[0] | main.go:26:2:26:2 | SSA def(n) | -| main.go:26:2:26:17 | ... := ...[1] | main.go:26:5:26:6 | SSA def(ok) | -| main.go:26:5:26:6 | SSA def(ok) | main.go:27:5:27:6 | ok | -| main.go:26:11:26:11 | x | main.go:26:2:26:17 | ... := ...[0] | -| main.go:38:2:38:2 | SSA def(s) | main.go:39:15:39:15 | s | -| main.go:38:7:38:20 | slice literal | main.go:38:2:38:2 | SSA def(s) | -| main.go:38:7:38:20 | slice literal [postupdate] | main.go:38:2:38:2 | SSA def(s) | -| main.go:39:2:39:3 | SSA def(s1) | main.go:40:18:40:19 | s1 | -| main.go:39:8:39:25 | call to append | main.go:39:2:39:3 | SSA def(s1) | +| main.go:26:2:26:17 | SSA def(n) | main.go:27:11:27:11 | n | +| main.go:26:2:26:17 | SSA def(ok) | main.go:27:5:27:6 | ok | +| main.go:26:2:26:17 | extract:0 ... := ... | main.go:26:2:26:17 | SSA def(n) | +| main.go:26:2:26:17 | extract:1 ... := ... | main.go:26:2:26:17 | SSA def(ok) | +| main.go:26:11:26:11 | x | main.go:26:2:26:17 | extract:0 ... := ... | +| main.go:38:2:38:20 | SSA def(s) | main.go:39:15:39:15 | s | +| main.go:38:7:38:20 | slice literal | main.go:38:2:38:20 | SSA def(s) | +| main.go:38:7:38:20 | slice literal [postupdate] | main.go:38:2:38:20 | SSA def(s) | +| main.go:39:2:39:25 | SSA def(s1) | main.go:40:18:40:19 | s1 | +| main.go:39:8:39:25 | call to append | main.go:39:2:39:25 | SSA def(s1) | | main.go:39:15:39:15 | s | main.go:40:15:40:15 | s | | main.go:39:15:39:15 | s [postupdate] | main.go:40:15:40:15 | s | -| main.go:40:2:40:3 | SSA def(s2) | main.go:43:9:43:10 | s2 | -| main.go:40:8:40:23 | call to append | main.go:40:2:40:3 | SSA def(s2) | +| main.go:40:2:40:23 | SSA def(s2) | main.go:43:9:43:10 | s2 | +| main.go:40:8:40:23 | call to append | main.go:40:2:40:23 | SSA def(s2) | | main.go:40:15:40:15 | s | main.go:42:7:42:7 | s | | main.go:40:15:40:15 | s [postupdate] | main.go:42:7:42:7 | s | -| main.go:41:2:41:3 | SSA def(s4) | main.go:42:10:42:11 | s4 | -| main.go:41:8:41:21 | call to make | main.go:41:2:41:3 | SSA def(s4) | +| main.go:41:2:41:21 | SSA def(s4) | main.go:42:10:42:11 | s4 | +| main.go:41:8:41:21 | call to make | main.go:41:2:41:21 | SSA def(s4) | | main.go:46:13:46:14 | SSA def(xs) | main.go:47:20:47:21 | xs | -| main.go:46:13:46:14 | argument corresponding to xs | main.go:46:13:46:14 | SSA def(xs) | -| main.go:46:24:46:27 | SSA def(keys) | main.go:46:24:46:27 | implicit read of keys | -| main.go:46:24:46:27 | SSA def(keys) | main.go:49:3:49:6 | keys | -| main.go:46:24:46:27 | zero value for keys | main.go:46:24:46:27 | SSA def(keys) | -| main.go:46:34:46:37 | SSA def(vals) | main.go:46:34:46:37 | implicit read of vals | -| main.go:46:34:46:37 | SSA def(vals) | main.go:48:3:48:6 | vals | -| main.go:46:34:46:37 | zero value for vals | main.go:46:34:46:37 | SSA def(vals) | -| main.go:47:2:50:2 | range statement[0] | main.go:47:6:47:6 | SSA def(k) | -| main.go:47:2:50:2 | range statement[1] | main.go:47:9:47:9 | SSA def(v) | -| main.go:47:6:47:6 | SSA def(k) | main.go:49:11:49:11 | k | -| main.go:47:9:47:9 | SSA def(v) | main.go:48:11:48:11 | v | -| main.go:48:3:48:6 | SSA def(vals) | main.go:46:34:46:37 | implicit read of vals | -| main.go:48:3:48:6 | SSA def(vals) | main.go:48:3:48:6 | vals | -| main.go:48:3:48:11 | ... += ... | main.go:48:3:48:6 | SSA def(vals) | -| main.go:49:3:49:6 | SSA def(keys) | main.go:46:24:46:27 | implicit read of keys | -| main.go:49:3:49:6 | SSA def(keys) | main.go:49:3:49:6 | keys | -| main.go:49:3:49:11 | ... += ... | main.go:49:3:49:6 | SSA def(keys) | -| main.go:55:6:55:7 | SSA def(ch) | main.go:56:2:56:3 | ch | -| main.go:55:6:55:7 | zero value for ch | main.go:55:6:55:7 | SSA def(ch) | +| main.go:46:13:46:14 | xs | main.go:46:13:46:14 | SSA def(xs) | +| main.go:46:44:52:1 | SSA def(keys) | main.go:46:44:52:1 | result-read:0 block statement | +| main.go:46:44:52:1 | SSA def(keys) | main.go:49:3:49:6 | keys | +| main.go:46:44:52:1 | SSA def(vals) | main.go:46:44:52:1 | result-read:1 block statement | +| main.go:46:44:52:1 | SSA def(vals) | main.go:48:3:48:6 | vals | +| main.go:46:44:52:1 | result-zero-init:0 block statement | main.go:46:44:52:1 | SSA def(keys) | +| main.go:46:44:52:1 | result-zero-init:1 block statement | main.go:46:44:52:1 | SSA def(vals) | +| main.go:47:2:50:2 | SSA def(k) | main.go:49:11:49:11 | k | +| main.go:47:2:50:2 | SSA def(v) | main.go:48:11:48:11 | v | +| main.go:47:2:50:2 | extract:0 range statement | main.go:47:2:50:2 | SSA def(k) | +| main.go:47:2:50:2 | extract:1 range statement | main.go:47:2:50:2 | SSA def(v) | +| main.go:48:3:48:11 | SSA def(vals) | main.go:46:44:52:1 | result-read:1 block statement | +| main.go:48:3:48:11 | SSA def(vals) | main.go:48:3:48:6 | vals | +| main.go:48:3:48:11 | compound-rhs ... += ... | main.go:48:3:48:11 | SSA def(vals) | +| main.go:49:3:49:11 | SSA def(keys) | main.go:46:44:52:1 | result-read:0 block statement | +| main.go:49:3:49:11 | SSA def(keys) | main.go:49:3:49:6 | keys | +| main.go:49:3:49:11 | compound-rhs ... += ... | main.go:49:3:49:11 | SSA def(keys) | +| main.go:55:6:55:17 | SSA def(ch) | main.go:56:2:56:3 | ch | +| main.go:55:6:55:17 | zero-init:0 value declaration specifier | main.go:55:6:55:17 | SSA def(ch) | | main.go:56:2:56:3 | ch | main.go:57:4:57:5 | ch | | main.go:56:2:56:3 | ch [postupdate] | main.go:57:4:57:5 | ch | -| main.go:61:2:61:2 | SSA def(x) | main.go:64:11:64:11 | x | -| main.go:61:7:61:7 | 1 | main.go:61:2:61:2 | SSA def(x) | -| main.go:62:2:62:2 | SSA def(y) | main.go:64:14:64:14 | y | -| main.go:62:7:62:7 | 2 | main.go:62:2:62:2 | SSA def(y) | -| main.go:63:2:63:2 | SSA def(z) | main.go:64:17:64:17 | z | -| main.go:63:7:63:7 | 3 | main.go:63:2:63:2 | SSA def(z) | -| main.go:64:2:64:2 | SSA def(a) | main.go:66:9:66:9 | a | -| main.go:64:7:64:18 | call to min | main.go:64:2:64:2 | SSA def(a) | +| main.go:61:2:61:7 | SSA def(x) | main.go:64:11:64:11 | x | +| main.go:61:7:61:7 | 1 | main.go:61:2:61:7 | SSA def(x) | +| main.go:62:2:62:7 | SSA def(y) | main.go:64:14:64:14 | y | +| main.go:62:7:62:7 | 2 | main.go:62:2:62:7 | SSA def(y) | +| main.go:63:2:63:7 | SSA def(z) | main.go:64:17:64:17 | z | +| main.go:63:7:63:7 | 3 | main.go:63:2:63:7 | SSA def(z) | +| main.go:64:2:64:18 | SSA def(a) | main.go:66:9:66:9 | a | +| main.go:64:7:64:18 | call to min | main.go:64:2:64:18 | SSA def(a) | | main.go:64:11:64:11 | x | main.go:64:7:64:18 | call to min | | main.go:64:11:64:11 | x | main.go:65:11:65:11 | x | | main.go:64:14:64:14 | y | main.go:64:7:64:18 | call to min | | main.go:64:14:64:14 | y | main.go:65:14:65:14 | y | | main.go:64:17:64:17 | z | main.go:64:7:64:18 | call to min | | main.go:64:17:64:17 | z | main.go:65:17:65:17 | z | -| main.go:65:2:65:2 | SSA def(b) | main.go:66:12:66:12 | b | -| main.go:65:7:65:18 | call to max | main.go:65:2:65:2 | SSA def(b) | +| main.go:65:2:65:18 | SSA def(b) | main.go:66:12:66:12 | b | +| main.go:65:7:65:18 | call to max | main.go:65:2:65:18 | SSA def(b) | | main.go:65:11:65:11 | x | main.go:65:7:65:18 | call to max | | main.go:65:14:65:14 | y | main.go:65:7:65:18 | call to max | | main.go:65:17:65:17 | z | main.go:65:7:65:18 | call to max | | strings.go:8:12:8:12 | SSA def(s) | strings.go:9:24:9:24 | s | -| strings.go:8:12:8:12 | argument corresponding to s | strings.go:8:12:8:12 | SSA def(s) | -| strings.go:9:2:9:3 | SSA def(s2) | strings.go:11:20:11:21 | s2 | -| strings.go:9:8:9:38 | call to Replace | strings.go:9:2:9:3 | SSA def(s2) | +| strings.go:8:12:8:12 | s | strings.go:8:12:8:12 | SSA def(s) | +| strings.go:9:2:9:38 | SSA def(s2) | strings.go:11:20:11:21 | s2 | +| strings.go:9:8:9:38 | call to Replace | strings.go:9:2:9:38 | SSA def(s2) | | strings.go:9:24:9:24 | s | strings.go:10:27:10:27 | s | -| strings.go:10:2:10:3 | SSA def(s3) | strings.go:11:24:11:25 | s3 | -| strings.go:10:8:10:42 | call to ReplaceAll | strings.go:10:2:10:3 | SSA def(s3) | +| strings.go:10:2:10:42 | SSA def(s3) | strings.go:11:24:11:25 | s3 | +| strings.go:10:8:10:42 | call to ReplaceAll | strings.go:10:2:10:42 | SSA def(s3) | | strings.go:11:20:11:21 | s2 | strings.go:11:48:11:49 | s2 | | strings.go:11:24:11:25 | s3 | strings.go:11:67:11:68 | s3 | | url.go:8:12:8:12 | SSA def(b) | url.go:11:5:11:5 | b | -| url.go:8:12:8:12 | argument corresponding to b | url.go:8:12:8:12 | SSA def(b) | +| url.go:8:12:8:12 | b | url.go:8:12:8:12 | SSA def(b) | | url.go:8:20:8:20 | SSA def(s) | url.go:12:46:12:46 | s | | url.go:8:20:8:20 | SSA def(s) | url.go:14:48:14:48 | s | -| url.go:8:20:8:20 | argument corresponding to s | url.go:8:20:8:20 | SSA def(s) | -| url.go:12:3:12:5 | SSA def(res) | url.go:19:9:19:11 | res | -| url.go:12:3:12:48 | ... = ...[0] | url.go:12:3:12:5 | SSA def(res) | -| url.go:12:3:12:48 | ... = ...[1] | url.go:12:8:12:10 | SSA def(err) | -| url.go:12:8:12:10 | SSA def(err) | url.go:16:5:16:7 | err | -| url.go:14:3:14:5 | SSA def(res) | url.go:19:9:19:11 | res | -| url.go:14:3:14:50 | ... = ...[0] | url.go:14:3:14:5 | SSA def(res) | -| url.go:14:3:14:50 | ... = ...[1] | url.go:14:8:14:10 | SSA def(err) | -| url.go:14:8:14:10 | SSA def(err) | url.go:16:5:16:7 | err | +| url.go:8:20:8:20 | s | url.go:8:20:8:20 | SSA def(s) | +| url.go:12:3:12:48 | SSA def(err) | url.go:16:5:16:7 | err | +| url.go:12:3:12:48 | SSA def(res) | url.go:19:9:19:11 | res | +| url.go:12:3:12:48 | extract:0 ... = ... | url.go:12:3:12:48 | SSA def(res) | +| url.go:12:3:12:48 | extract:1 ... = ... | url.go:12:3:12:48 | SSA def(err) | +| url.go:14:3:14:50 | SSA def(err) | url.go:16:5:16:7 | err | +| url.go:14:3:14:50 | SSA def(res) | url.go:19:9:19:11 | res | +| url.go:14:3:14:50 | extract:0 ... = ... | url.go:14:3:14:50 | SSA def(res) | +| url.go:14:3:14:50 | extract:1 ... = ... | url.go:14:3:14:50 | SSA def(err) | | url.go:22:12:22:12 | SSA def(i) | url.go:24:5:24:5 | i | -| url.go:22:12:22:12 | argument corresponding to i | url.go:22:12:22:12 | SSA def(i) | +| url.go:22:12:22:12 | i | url.go:22:12:22:12 | SSA def(i) | | url.go:22:19:22:19 | SSA def(s) | url.go:23:20:23:20 | s | -| url.go:22:19:22:19 | argument corresponding to s | url.go:22:19:22:19 | SSA def(s) | -| url.go:23:2:23:2 | SSA def(u) | url.go:25:10:25:10 | u | -| url.go:23:2:23:21 | ... := ...[0] | url.go:23:2:23:2 | SSA def(u) | +| url.go:22:19:22:19 | s | url.go:22:19:22:19 | SSA def(s) | +| url.go:23:2:23:21 | SSA def(u) | url.go:25:10:25:10 | u | +| url.go:23:2:23:21 | extract:0 ... := ... | url.go:23:2:23:21 | SSA def(u) | | url.go:23:20:23:20 | s | url.go:27:29:27:29 | s | -| url.go:27:2:27:2 | SSA def(u) | url.go:28:14:28:14 | u | -| url.go:27:2:27:30 | ... = ...[0] | url.go:27:2:27:2 | SSA def(u) | +| url.go:27:2:27:30 | SSA def(u) | url.go:28:14:28:14 | u | +| url.go:27:2:27:30 | extract:0 ... = ... | url.go:27:2:27:30 | SSA def(u) | | url.go:28:14:28:14 | u | url.go:29:14:29:14 | u | | url.go:28:14:28:14 | u [postupdate] | url.go:29:14:29:14 | u | | url.go:29:14:29:14 | u | url.go:30:11:30:11 | u | | url.go:29:14:29:14 | u [postupdate] | url.go:30:11:30:11 | u | -| url.go:30:2:30:3 | SSA def(bs) | url.go:31:14:31:15 | bs | -| url.go:30:2:30:27 | ... := ...[0] | url.go:30:2:30:3 | SSA def(bs) | +| url.go:30:2:30:27 | SSA def(bs) | url.go:31:14:31:15 | bs | +| url.go:30:2:30:27 | extract:0 ... := ... | url.go:30:2:30:27 | SSA def(bs) | | url.go:30:11:30:11 | u | url.go:32:9:32:9 | u | | url.go:30:11:30:11 | u [postupdate] | url.go:32:9:32:9 | u | -| url.go:32:2:32:2 | SSA def(u) | url.go:33:14:33:14 | u | -| url.go:32:2:32:23 | ... = ...[0] | url.go:32:2:32:2 | SSA def(u) | +| url.go:32:2:32:23 | SSA def(u) | url.go:33:14:33:14 | u | +| url.go:32:2:32:23 | extract:0 ... = ... | url.go:32:2:32:23 | SSA def(u) | | url.go:33:14:33:14 | u | url.go:34:14:34:14 | u | | url.go:33:14:33:14 | u [postupdate] | url.go:34:14:34:14 | u | | url.go:34:14:34:14 | u | url.go:35:14:35:14 | u | | url.go:34:14:34:14 | u [postupdate] | url.go:35:14:35:14 | u | | url.go:35:14:35:14 | u | url.go:36:6:36:6 | u | | url.go:35:14:35:14 | u [postupdate] | url.go:36:6:36:6 | u | -| url.go:36:2:36:2 | SSA def(u) | url.go:37:9:37:9 | u | +| url.go:36:2:36:26 | SSA def(u) | url.go:37:9:37:9 | u | | url.go:36:6:36:6 | u | url.go:36:25:36:25 | u | | url.go:36:6:36:6 | u [postupdate] | url.go:36:25:36:25 | u | -| url.go:36:6:36:26 | call to ResolveReference | url.go:36:2:36:2 | SSA def(u) | -| url.go:42:2:42:3 | SSA def(ui) | url.go:43:11:43:12 | ui | -| url.go:42:7:42:38 | call to UserPassword | url.go:42:2:42:3 | SSA def(ui) | -| url.go:43:2:43:3 | SSA def(pw) | url.go:44:14:44:15 | pw | -| url.go:43:2:43:23 | ... := ...[0] | url.go:43:2:43:3 | SSA def(pw) | +| url.go:36:6:36:26 | call to ResolveReference | url.go:36:2:36:26 | SSA def(u) | +| url.go:42:2:42:38 | SSA def(ui) | url.go:43:11:43:12 | ui | +| url.go:42:7:42:38 | call to UserPassword | url.go:42:2:42:38 | SSA def(ui) | +| url.go:43:2:43:23 | SSA def(pw) | url.go:44:14:44:15 | pw | +| url.go:43:2:43:23 | extract:0 ... := ... | url.go:43:2:43:23 | SSA def(pw) | | url.go:43:11:43:12 | ui | url.go:45:14:45:15 | ui | | url.go:43:11:43:12 | ui [postupdate] | url.go:45:14:45:15 | ui | | url.go:45:14:45:15 | ui | url.go:46:9:46:10 | ui | | url.go:45:14:45:15 | ui [postupdate] | url.go:46:9:46:10 | ui | | url.go:49:12:49:12 | SSA def(q) | url.go:50:25:50:25 | q | -| url.go:49:12:49:12 | argument corresponding to q | url.go:49:12:49:12 | SSA def(q) | -| url.go:50:2:50:2 | SSA def(v) | url.go:51:14:51:14 | v | -| url.go:50:2:50:26 | ... := ...[0] | url.go:50:2:50:2 | SSA def(v) | +| url.go:49:12:49:12 | q | url.go:49:12:49:12 | SSA def(q) | +| url.go:50:2:50:26 | SSA def(v) | url.go:51:14:51:14 | v | +| url.go:50:2:50:26 | extract:0 ... := ... | url.go:50:2:50:26 | SSA def(v) | | url.go:51:14:51:14 | v | url.go:52:14:52:14 | v | | url.go:51:14:51:14 | v [postupdate] | url.go:52:14:52:14 | v | | url.go:52:14:52:14 | v | url.go:53:9:53:9 | v | | url.go:52:14:52:14 | v [postupdate] | url.go:53:9:53:9 | v | | url.go:56:12:56:12 | SSA def(q) | url.go:57:29:57:29 | q | -| url.go:56:12:56:12 | argument corresponding to q | url.go:56:12:56:12 | SSA def(q) | -| url.go:57:2:57:8 | SSA def(joined1) | url.go:58:38:58:44 | joined1 | -| url.go:57:2:57:39 | ... := ...[0] | url.go:57:2:57:8 | SSA def(joined1) | -| url.go:58:2:58:8 | SSA def(joined2) | url.go:59:24:59:30 | joined2 | -| url.go:58:2:58:45 | ... := ...[0] | url.go:58:2:58:8 | SSA def(joined2) | -| url.go:59:2:59:6 | SSA def(asUrl) | url.go:60:15:60:19 | asUrl | -| url.go:59:2:59:31 | ... := ...[0] | url.go:59:2:59:6 | SSA def(asUrl) | -| url.go:60:2:60:10 | SSA def(joinedUrl) | url.go:61:9:61:17 | joinedUrl | -| url.go:60:15:60:37 | call to JoinPath | url.go:60:2:60:10 | SSA def(joinedUrl) | +| url.go:56:12:56:12 | q | url.go:56:12:56:12 | SSA def(q) | +| url.go:57:2:57:39 | SSA def(joined1) | url.go:58:38:58:44 | joined1 | +| url.go:57:2:57:39 | extract:0 ... := ... | url.go:57:2:57:39 | SSA def(joined1) | +| url.go:58:2:58:45 | SSA def(joined2) | url.go:59:24:59:30 | joined2 | +| url.go:58:2:58:45 | extract:0 ... := ... | url.go:58:2:58:45 | SSA def(joined2) | +| url.go:59:2:59:31 | SSA def(asUrl) | url.go:60:15:60:19 | asUrl | +| url.go:59:2:59:31 | extract:0 ... := ... | url.go:59:2:59:31 | SSA def(asUrl) | +| url.go:60:2:60:37 | SSA def(joinedUrl) | url.go:61:9:61:17 | joinedUrl | +| url.go:60:15:60:37 | call to JoinPath | url.go:60:2:60:37 | SSA def(joinedUrl) | | url.go:64:13:64:13 | SSA def(q) | url.go:66:27:66:27 | q | -| url.go:64:13:64:13 | argument corresponding to q | url.go:64:13:64:13 | SSA def(q) | -| url.go:65:2:65:9 | SSA def(cleanUrl) | url.go:66:9:66:16 | cleanUrl | -| url.go:65:2:65:48 | ... := ...[0] | url.go:65:2:65:9 | SSA def(cleanUrl) | +| url.go:64:13:64:13 | q | url.go:64:13:64:13 | SSA def(q) | +| url.go:65:2:65:48 | SSA def(cleanUrl) | url.go:66:9:66:16 | cleanUrl | +| url.go:65:2:65:48 | extract:0 ... := ... | url.go:65:2:65:48 | SSA def(cleanUrl) | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalTaintStep.expected b/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalTaintStep.expected index 667845624969..2eb946ed07df 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalTaintStep.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalTaintStep.expected @@ -1,5 +1,5 @@ -| main.go:26:11:26:17 | type assertion | main.go:26:2:26:17 | ... := ...[0] | -| main.go:26:11:26:17 | type assertion | main.go:26:2:26:17 | ... := ...[1] | +| main.go:26:11:26:17 | type assertion | main.go:26:2:26:17 | extract:0 ... := ... | +| main.go:26:11:26:17 | type assertion | main.go:26:2:26:17 | extract:1 ... := ... | | main.go:38:13:38:13 | 1 | main.go:38:7:38:20 | slice literal | | main.go:38:16:38:16 | 2 | main.go:38:7:38:20 | slice literal | | main.go:38:19:38:19 | 3 | main.go:38:7:38:20 | slice literal | @@ -8,9 +8,9 @@ | main.go:40:15:40:15 | s | main.go:40:8:40:23 | call to append | | main.go:40:18:40:19 | s1 | main.go:40:8:40:23 | call to append | | main.go:42:10:42:11 | s4 | main.go:42:7:42:7 | s [postupdate] | -| main.go:47:20:47:21 | next key-value pair in range | main.go:47:2:50:2 | range statement[0] | -| main.go:47:20:47:21 | next key-value pair in range | main.go:47:2:50:2 | range statement[1] | -| main.go:47:20:47:21 | xs | main.go:47:2:50:2 | range statement[1] | +| main.go:47:20:47:21 | next key-value pair in range | main.go:47:2:50:2 | extract:0 range statement | +| main.go:47:20:47:21 | next key-value pair in range | main.go:47:2:50:2 | extract:1 range statement | +| main.go:47:20:47:21 | xs | main.go:47:2:50:2 | extract:1 range statement | | strings.go:9:24:9:24 | s | strings.go:9:8:9:38 | call to Replace | | strings.go:9:32:9:34 | "_" | strings.go:9:8:9:38 | call to Replace | | strings.go:10:27:10:27 | s | strings.go:10:8:10:42 | call to ReplaceAll | @@ -24,29 +24,29 @@ | strings.go:11:48:11:49 | s2 | strings.go:11:30:11:50 | call to Sprintf | | strings.go:11:54:11:69 | call to Sprintln | strings.go:11:9:11:69 | ...+... | | strings.go:11:67:11:68 | s3 | strings.go:11:54:11:69 | call to Sprintln | -| url.go:12:14:12:48 | call to PathUnescape | url.go:12:3:12:48 | ... = ...[0] | -| url.go:12:14:12:48 | call to PathUnescape | url.go:12:3:12:48 | ... = ...[1] | -| url.go:12:31:12:47 | call to PathEscape | url.go:12:3:12:48 | ... = ...[0] | +| url.go:12:14:12:48 | call to PathUnescape | url.go:12:3:12:48 | extract:0 ... = ... | +| url.go:12:14:12:48 | call to PathUnescape | url.go:12:3:12:48 | extract:1 ... = ... | +| url.go:12:31:12:47 | call to PathEscape | url.go:12:3:12:48 | extract:0 ... = ... | | url.go:12:46:12:46 | s | url.go:12:31:12:47 | call to PathEscape | -| url.go:14:14:14:50 | call to QueryUnescape | url.go:14:3:14:50 | ... = ...[0] | -| url.go:14:14:14:50 | call to QueryUnescape | url.go:14:3:14:50 | ... = ...[1] | -| url.go:14:32:14:49 | call to QueryEscape | url.go:14:3:14:50 | ... = ...[0] | +| url.go:14:14:14:50 | call to QueryUnescape | url.go:14:3:14:50 | extract:0 ... = ... | +| url.go:14:14:14:50 | call to QueryUnescape | url.go:14:3:14:50 | extract:1 ... = ... | +| url.go:14:32:14:49 | call to QueryEscape | url.go:14:3:14:50 | extract:0 ... = ... | | url.go:14:48:14:48 | s | url.go:14:32:14:49 | call to QueryEscape | -| url.go:23:10:23:21 | call to Parse | url.go:23:2:23:21 | ... := ...[0] | -| url.go:23:10:23:21 | call to Parse | url.go:23:2:23:21 | ... := ...[1] | -| url.go:23:20:23:20 | s | url.go:23:2:23:21 | ... := ...[0] | -| url.go:27:9:27:30 | call to ParseRequestURI | url.go:27:2:27:30 | ... = ...[0] | -| url.go:27:9:27:30 | call to ParseRequestURI | url.go:27:2:27:30 | ... = ...[1] | -| url.go:27:29:27:29 | s | url.go:27:2:27:30 | ... = ...[0] | +| url.go:23:10:23:21 | call to Parse | url.go:23:2:23:21 | extract:0 ... := ... | +| url.go:23:10:23:21 | call to Parse | url.go:23:2:23:21 | extract:1 ... := ... | +| url.go:23:20:23:20 | s | url.go:23:2:23:21 | extract:0 ... := ... | +| url.go:27:9:27:30 | call to ParseRequestURI | url.go:27:2:27:30 | extract:0 ... = ... | +| url.go:27:9:27:30 | call to ParseRequestURI | url.go:27:2:27:30 | extract:1 ... = ... | +| url.go:27:29:27:29 | s | url.go:27:2:27:30 | extract:0 ... = ... | | url.go:28:14:28:14 | u | url.go:28:14:28:28 | call to EscapedPath | | url.go:29:14:29:14 | u | url.go:29:14:29:25 | call to Hostname | -| url.go:30:11:30:11 | u | url.go:30:2:30:27 | ... := ...[0] | -| url.go:30:11:30:27 | call to MarshalBinary | url.go:30:2:30:27 | ... := ...[0] | -| url.go:30:11:30:27 | call to MarshalBinary | url.go:30:2:30:27 | ... := ...[1] | -| url.go:32:9:32:9 | u | url.go:32:2:32:23 | ... = ...[0] | -| url.go:32:9:32:23 | call to Parse | url.go:32:2:32:23 | ... = ...[0] | -| url.go:32:9:32:23 | call to Parse | url.go:32:2:32:23 | ... = ...[1] | -| url.go:32:17:32:22 | "/foo" | url.go:32:2:32:23 | ... = ...[0] | +| url.go:30:11:30:11 | u | url.go:30:2:30:27 | extract:0 ... := ... | +| url.go:30:11:30:27 | call to MarshalBinary | url.go:30:2:30:27 | extract:0 ... := ... | +| url.go:30:11:30:27 | call to MarshalBinary | url.go:30:2:30:27 | extract:1 ... := ... | +| url.go:32:9:32:9 | u | url.go:32:2:32:23 | extract:0 ... = ... | +| url.go:32:9:32:23 | call to Parse | url.go:32:2:32:23 | extract:0 ... = ... | +| url.go:32:9:32:23 | call to Parse | url.go:32:2:32:23 | extract:1 ... = ... | +| url.go:32:17:32:22 | "/foo" | url.go:32:2:32:23 | extract:0 ... = ... | | url.go:33:14:33:14 | u | url.go:33:14:33:21 | call to Port | | url.go:34:14:34:14 | u | url.go:34:14:34:22 | call to Query | | url.go:35:14:35:14 | u | url.go:35:14:35:27 | call to RequestURI | @@ -55,30 +55,30 @@ | url.go:41:17:41:20 | "me" | url.go:41:8:41:21 | call to User | | url.go:42:24:42:27 | "me" | url.go:42:7:42:38 | call to UserPassword | | url.go:42:30:42:37 | "secret" | url.go:42:7:42:38 | call to UserPassword | -| url.go:43:11:43:12 | ui | url.go:43:2:43:23 | ... := ...[0] | -| url.go:43:11:43:23 | call to Password | url.go:43:2:43:23 | ... := ...[0] | -| url.go:43:11:43:23 | call to Password | url.go:43:2:43:23 | ... := ...[1] | +| url.go:43:11:43:12 | ui | url.go:43:2:43:23 | extract:0 ... := ... | +| url.go:43:11:43:23 | call to Password | url.go:43:2:43:23 | extract:0 ... := ... | +| url.go:43:11:43:23 | call to Password | url.go:43:2:43:23 | extract:1 ... := ... | | url.go:45:14:45:15 | ui | url.go:45:14:45:26 | call to Username | -| url.go:50:10:50:26 | call to ParseQuery | url.go:50:2:50:26 | ... := ...[0] | -| url.go:50:10:50:26 | call to ParseQuery | url.go:50:2:50:26 | ... := ...[1] | -| url.go:50:25:50:25 | q | url.go:50:2:50:26 | ... := ...[0] | +| url.go:50:10:50:26 | call to ParseQuery | url.go:50:2:50:26 | extract:0 ... := ... | +| url.go:50:10:50:26 | call to ParseQuery | url.go:50:2:50:26 | extract:1 ... := ... | +| url.go:50:25:50:25 | q | url.go:50:2:50:26 | extract:0 ... := ... | | url.go:51:14:51:14 | v | url.go:51:14:51:23 | call to Encode | | url.go:52:14:52:14 | v | url.go:52:14:52:26 | call to Get | -| url.go:57:16:57:39 | call to JoinPath | url.go:57:2:57:39 | ... := ...[0] | -| url.go:57:16:57:39 | call to JoinPath | url.go:57:2:57:39 | ... := ...[1] | -| url.go:57:29:57:29 | q | url.go:57:2:57:39 | ... := ...[0] | -| url.go:57:32:57:38 | "clean" | url.go:57:2:57:39 | ... := ...[0] | -| url.go:58:16:58:45 | call to JoinPath | url.go:58:2:58:45 | ... := ...[0] | -| url.go:58:16:58:45 | call to JoinPath | url.go:58:2:58:45 | ... := ...[1] | -| url.go:58:29:58:35 | "clean" | url.go:58:2:58:45 | ... := ...[0] | -| url.go:58:38:58:44 | joined1 | url.go:58:2:58:45 | ... := ...[0] | -| url.go:59:14:59:31 | call to Parse | url.go:59:2:59:31 | ... := ...[0] | -| url.go:59:14:59:31 | call to Parse | url.go:59:2:59:31 | ... := ...[1] | -| url.go:59:24:59:30 | joined2 | url.go:59:2:59:31 | ... := ...[0] | +| url.go:57:16:57:39 | call to JoinPath | url.go:57:2:57:39 | extract:0 ... := ... | +| url.go:57:16:57:39 | call to JoinPath | url.go:57:2:57:39 | extract:1 ... := ... | +| url.go:57:29:57:29 | q | url.go:57:2:57:39 | extract:0 ... := ... | +| url.go:57:32:57:38 | "clean" | url.go:57:2:57:39 | extract:0 ... := ... | +| url.go:58:16:58:45 | call to JoinPath | url.go:58:2:58:45 | extract:0 ... := ... | +| url.go:58:16:58:45 | call to JoinPath | url.go:58:2:58:45 | extract:1 ... := ... | +| url.go:58:29:58:35 | "clean" | url.go:58:2:58:45 | extract:0 ... := ... | +| url.go:58:38:58:44 | joined1 | url.go:58:2:58:45 | extract:0 ... := ... | +| url.go:59:14:59:31 | call to Parse | url.go:59:2:59:31 | extract:0 ... := ... | +| url.go:59:14:59:31 | call to Parse | url.go:59:2:59:31 | extract:1 ... := ... | +| url.go:59:24:59:30 | joined2 | url.go:59:2:59:31 | extract:0 ... := ... | | url.go:60:15:60:19 | asUrl | url.go:60:15:60:37 | call to JoinPath | | url.go:60:30:60:36 | "clean" | url.go:60:15:60:37 | call to JoinPath | -| url.go:65:17:65:48 | call to Parse | url.go:65:2:65:48 | ... := ...[0] | -| url.go:65:17:65:48 | call to Parse | url.go:65:2:65:48 | ... := ...[1] | -| url.go:65:27:65:47 | "http://harmless.org" | url.go:65:2:65:48 | ... := ...[0] | +| url.go:65:17:65:48 | call to Parse | url.go:65:2:65:48 | extract:0 ... := ... | +| url.go:65:17:65:48 | call to Parse | url.go:65:2:65:48 | extract:1 ... := ... | +| url.go:65:27:65:47 | "http://harmless.org" | url.go:65:2:65:48 | extract:0 ... := ... | | url.go:66:9:66:16 | cleanUrl | url.go:66:9:66:28 | call to JoinPath | | url.go:66:27:66:27 | q | url.go:66:9:66:28 | call to JoinPath | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionInput_getEntryNode.expected b/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionInput_getEntryNode.expected index a64298b64442..c66a1334a178 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionInput_getEntryNode.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionInput_getEntryNode.expected @@ -25,15 +25,15 @@ | result | main.go:53:2:53:22 | call to op2 | main.go:53:2:53:22 | call to op2 | | result | main.go:53:14:53:21 | call to bump | main.go:53:14:53:21 | call to bump | | result | tst2.go:10:9:10:26 | call to NewEncoder | tst2.go:10:9:10:26 | call to NewEncoder | -| result | tst2.go:10:9:10:39 | call to Encode | tst2.go:10:2:10:4 | SSA def(err) | -| result | tst.go:9:17:9:33 | call to new | tst.go:9:2:9:12 | SSA def(bytesBuffer) | +| result | tst2.go:10:9:10:39 | call to Encode | tst2.go:10:2:10:39 | SSA def(err) | +| result | tst.go:9:17:9:33 | call to new | tst.go:9:2:9:33 | SSA def(bytesBuffer) | | result 0 | main.go:51:2:51:14 | call to op | main.go:51:2:51:14 | call to op | | result 0 | main.go:53:2:53:22 | call to op2 | main.go:53:2:53:22 | call to op2 | | result 0 | main.go:53:14:53:21 | call to bump | main.go:53:14:53:21 | call to bump | -| result 0 | main.go:54:10:54:15 | call to test | main.go:54:2:54:2 | SSA def(x) | -| result 0 | main.go:56:9:56:15 | call to test2 | main.go:56:2:56:2 | SSA def(x) | +| result 0 | main.go:54:10:54:15 | call to test | main.go:54:2:54:15 | SSA def(x) | +| result 0 | main.go:56:9:56:15 | call to test2 | main.go:56:2:56:15 | SSA def(x) | | result 0 | tst2.go:10:9:10:26 | call to NewEncoder | tst2.go:10:9:10:26 | call to NewEncoder | -| result 0 | tst2.go:10:9:10:39 | call to Encode | tst2.go:10:2:10:4 | SSA def(err) | -| result 0 | tst.go:9:17:9:33 | call to new | tst.go:9:2:9:12 | SSA def(bytesBuffer) | -| result 1 | main.go:54:10:54:15 | call to test | main.go:54:5:54:5 | SSA def(y) | -| result 1 | main.go:56:9:56:15 | call to test2 | main.go:56:5:56:5 | SSA def(y) | +| result 0 | tst2.go:10:9:10:39 | call to Encode | tst2.go:10:2:10:39 | SSA def(err) | +| result 0 | tst.go:9:17:9:33 | call to new | tst.go:9:2:9:33 | SSA def(bytesBuffer) | +| result 1 | main.go:54:10:54:15 | call to test | main.go:54:2:54:15 | SSA def(y) | +| result 1 | main.go:56:9:56:15 | call to test2 | main.go:56:2:56:15 | SSA def(y) | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionInput_getExitNode.expected b/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionInput_getExitNode.expected index b101ce537fca..c62d1a1fc231 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionInput_getExitNode.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionInput_getExitNode.expected @@ -4,7 +4,7 @@ | parameter 0 | reset.go:8:1:16:1 | function declaration | reset.go:8:27:8:27 | SSA def(r) | | parameter 0 | tst2.go:8:1:12:1 | function declaration | tst2.go:8:12:8:15 | SSA def(data) | | parameter 0 | tst.go:8:1:11:1 | function declaration | tst.go:8:12:8:17 | SSA def(reader) | -| parameter 0 | tst.go:13:1:13:25 | function declaration | tst.go:13:12:13:13 | initialization of xs | +| parameter 0 | tst.go:13:1:13:25 | function declaration | tst.go:13:12:13:13 | xs | | parameter 0 | tst.go:15:1:19:1 | function declaration | tst.go:15:12:15:12 | SSA def(x) | | parameter 1 | main.go:5:1:11:1 | function declaration | main.go:5:20:5:20 | SSA def(x) | | parameter 1 | main.go:13:1:20:1 | function declaration | main.go:13:21:13:21 | SSA def(x) | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionOutput_getEntryNode.expected b/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionOutput_getEntryNode.expected index 263a9298413a..5af08e798829 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionOutput_getEntryNode.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionOutput_getEntryNode.expected @@ -1,22 +1,22 @@ | result | main.go:5:1:11:1 | function declaration | main.go:7:10:7:14 | ...+... | | result | main.go:5:1:11:1 | function declaration | main.go:9:10:9:14 | ...-... | -| result | main.go:13:1:20:1 | function declaration | main.go:13:36:13:38 | zero value for res | +| result | main.go:13:1:20:1 | function declaration | main.go:13:45:20:1 | result-zero-init:0 block statement | | result | main.go:13:1:20:1 | function declaration | main.go:15:9:15:13 | ...+... | | result | main.go:13:1:20:1 | function declaration | main.go:17:10:17:14 | ...-... | | result | main.go:26:1:29:1 | function declaration | main.go:28:9:28:15 | selection of count | | result | reset.go:8:1:16:1 | function declaration | reset.go:15:9:15:12 | sink | | result 0 | main.go:31:1:33:1 | function declaration | main.go:32:9:32:10 | 23 | -| result 0 | main.go:35:1:38:1 | function declaration | main.go:35:15:35:15 | zero value for x | +| result 0 | main.go:35:1:38:1 | function declaration | main.go:35:29:38:1 | result-zero-init:0 block statement | | result 0 | main.go:35:1:38:1 | function declaration | main.go:36:13:36:14 | 23 | -| result 0 | main.go:40:1:48:1 | function declaration | main.go:40:21:40:23 | zero value for int | +| result 0 | main.go:40:1:48:1 | function declaration | main.go:40:33:48:1 | result-zero-init:0 block statement | | result 0 | main.go:40:1:48:1 | function declaration | main.go:45:10:45:10 | 0 | | result 0 | main.go:40:1:48:1 | function declaration | main.go:47:9:47:9 | 0 | | result 0 | tst2.go:8:1:12:1 | function declaration | tst2.go:11:9:11:9 | w | | result 1 | main.go:31:1:33:1 | function declaration | main.go:32:13:32:14 | 42 | -| result 1 | main.go:35:1:38:1 | function declaration | main.go:35:22:35:22 | zero value for y | +| result 1 | main.go:35:1:38:1 | function declaration | main.go:35:29:38:1 | result-zero-init:1 block statement | | result 1 | main.go:35:1:38:1 | function declaration | main.go:36:9:36:10 | 42 | -| result 1 | main.go:40:1:48:1 | function declaration | main.go:40:26:40:26 | zero value for y | -| result 1 | main.go:40:1:48:1 | function declaration | main.go:42:3:42:5 | rhs of increment statement | +| result 1 | main.go:40:1:48:1 | function declaration | main.go:40:33:48:1 | result-zero-init:1 block statement | +| result 1 | main.go:40:1:48:1 | function declaration | main.go:42:3:42:5 | incdec-rhs increment statement | | result 1 | main.go:40:1:48:1 | function declaration | main.go:45:13:45:13 | 1 | | result 1 | main.go:40:1:48:1 | function declaration | main.go:47:12:47:12 | 4 | | result 1 | tst2.go:8:1:12:1 | function declaration | tst2.go:11:12:11:14 | err | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionOutput_getExitNode.expected b/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionOutput_getExitNode.expected index eebf68d92d4a..9d2fdaf117e0 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionOutput_getExitNode.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionOutput_getExitNode.expected @@ -17,10 +17,10 @@ | result 0 | main.go:51:2:51:14 | call to op | main.go:51:2:51:14 | call to op | | result 0 | main.go:53:2:53:22 | call to op2 | main.go:53:2:53:22 | call to op2 | | result 0 | main.go:53:14:53:21 | call to bump | main.go:53:14:53:21 | call to bump | -| result 0 | main.go:54:10:54:15 | call to test | main.go:54:2:54:15 | ... := ...[0] | -| result 0 | main.go:56:9:56:15 | call to test2 | main.go:56:2:56:15 | ... = ...[0] | +| result 0 | main.go:54:10:54:15 | call to test | main.go:54:2:54:15 | extract:0 ... := ... | +| result 0 | main.go:56:9:56:15 | call to test2 | main.go:56:2:56:15 | extract:0 ... = ... | | result 0 | tst2.go:10:9:10:26 | call to NewEncoder | tst2.go:10:9:10:26 | call to NewEncoder | | result 0 | tst2.go:10:9:10:39 | call to Encode | tst2.go:10:9:10:39 | call to Encode | | result 0 | tst.go:9:17:9:33 | call to new | tst.go:9:17:9:33 | call to new | -| result 1 | main.go:54:10:54:15 | call to test | main.go:54:2:54:15 | ... := ...[1] | -| result 1 | main.go:56:9:56:15 | call to test2 | main.go:56:2:56:15 | ... = ...[1] | +| result 1 | main.go:54:10:54:15 | call to test | main.go:54:2:54:15 | extract:1 ... := ... | +| result 1 | main.go:56:9:56:15 | call to test2 | main.go:56:2:56:15 | extract:1 ... = ... | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionOutput_isResult_int.expected b/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionOutput_isResult_int.expected index 61f029031c67..071afdc13858 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionOutput_isResult_int.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionOutput_isResult_int.expected @@ -4,10 +4,10 @@ | main.go:53:2:53:22 | call to op2 | main.go:53:2:53:22 | call to op2 | 0 | result 0 | | main.go:53:14:53:21 | call to bump | main.go:53:14:53:21 | call to bump | 0 | result | | main.go:53:14:53:21 | call to bump | main.go:53:14:53:21 | call to bump | 0 | result 0 | -| main.go:54:10:54:15 | call to test | main.go:54:2:54:15 | ... := ...[0] | 0 | result 0 | -| main.go:54:10:54:15 | call to test | main.go:54:2:54:15 | ... := ...[1] | 1 | result 1 | -| main.go:56:9:56:15 | call to test2 | main.go:56:2:56:15 | ... = ...[0] | 0 | result 0 | -| main.go:56:9:56:15 | call to test2 | main.go:56:2:56:15 | ... = ...[1] | 1 | result 1 | +| main.go:54:10:54:15 | call to test | main.go:54:2:54:15 | extract:0 ... := ... | 0 | result 0 | +| main.go:54:10:54:15 | call to test | main.go:54:2:54:15 | extract:1 ... := ... | 1 | result 1 | +| main.go:56:9:56:15 | call to test2 | main.go:56:2:56:15 | extract:0 ... = ... | 0 | result 0 | +| main.go:56:9:56:15 | call to test2 | main.go:56:2:56:15 | extract:1 ... = ... | 1 | result 1 | | tst2.go:10:9:10:26 | call to NewEncoder | tst2.go:10:9:10:26 | call to NewEncoder | 0 | result | | tst2.go:10:9:10:26 | call to NewEncoder | tst2.go:10:9:10:26 | call to NewEncoder | 0 | result 0 | | tst2.go:10:9:10:39 | call to Encode | tst2.go:10:9:10:39 | call to Encode | 0 | result | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/GlobalValueNumber.expected b/go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/GlobalValueNumber.expected index 287a7f735f24..1ba4a7674da3 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/GlobalValueNumber.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/GlobalValueNumber.expected @@ -1,39 +1,39 @@ | main.go:6:2:6:5 | 1 | main.go:14:7:14:7 | 1 | -| main.go:10:2:10:2 | SSA def(x) | main.go:10:7:10:7 | 0 | +| main.go:10:2:10:7 | SSA def(x) | main.go:10:7:10:7 | 0 | | main.go:10:7:10:7 | 0 | main.go:10:7:10:7 | 0 | -| main.go:11:6:11:6 | SSA def(y) | main.go:10:7:10:7 | 0 | -| main.go:11:6:11:6 | zero value for y | main.go:10:7:10:7 | 0 | +| main.go:11:6:11:10 | SSA def(y) | main.go:10:7:10:7 | 0 | +| main.go:11:6:11:10 | zero-init:0 value declaration specifier | main.go:10:7:10:7 | 0 | | main.go:12:2:12:18 | call to Println | main.go:12:2:12:18 | call to Println | | main.go:12:14:12:14 | x | main.go:10:7:10:7 | 0 | | main.go:12:17:12:17 | y | main.go:10:7:10:7 | 0 | -| main.go:14:2:14:2 | SSA def(z) | main.go:14:7:14:7 | 1 | +| main.go:14:2:14:7 | SSA def(z) | main.go:14:7:14:7 | 1 | | main.go:14:7:14:7 | 1 | main.go:14:7:14:7 | 1 | | main.go:15:2:15:9 | call to bump | main.go:15:2:15:9 | call to bump | | main.go:16:2:16:21 | call to Println | main.go:16:2:16:21 | call to Println | | main.go:16:14:16:14 | x | main.go:10:7:10:7 | 0 | | main.go:16:17:16:17 | y | main.go:10:7:10:7 | 0 | -| main.go:18:2:18:3 | SSA def(ss) | main.go:18:8:18:24 | call to make | +| main.go:18:2:18:24 | SSA def(ss) | main.go:18:8:18:24 | call to make | | main.go:18:8:18:24 | call to make | main.go:18:8:18:24 | call to make | | main.go:18:23:18:23 | 3 | main.go:18:23:18:23 | 3 | | main.go:19:5:19:5 | 2 | main.go:19:5:19:5 | 2 | | main.go:19:10:19:24 | "Hello, world!" | main.go:19:10:19:24 | "Hello, world!" | | main.go:20:2:20:16 | call to Println | main.go:20:2:20:16 | call to Println | -| main.go:23:14:23:16 | implicit read of res | main.go:24:8:24:8 | 4 | -| main.go:23:14:23:16 | zero value for res | main.go:10:7:10:7 | 0 | -| main.go:24:2:24:4 | SSA def(res) | main.go:24:8:24:8 | 4 | +| main.go:23:23:26:1 | result-read:0 block statement | main.go:24:8:24:8 | 4 | +| main.go:23:23:26:1 | result-zero-init:0 block statement | main.go:10:7:10:7 | 0 | +| main.go:24:2:24:8 | SSA def(res) | main.go:24:8:24:8 | 4 | | main.go:24:8:24:8 | 4 | main.go:24:8:24:8 | 4 | -| main.go:28:15:28:17 | implicit read of res | main.go:30:9:30:9 | 6 | -| main.go:28:15:28:17 | zero value for res | main.go:10:7:10:7 | 0 | +| main.go:28:24:31:1 | result-read:0 block statement | main.go:30:9:30:9 | 6 | +| main.go:28:24:31:1 | result-zero-init:0 block statement | main.go:10:7:10:7 | 0 | | main.go:29:8:29:8 | 5 | main.go:29:8:29:8 | 5 | +| main.go:30:2:30:9 | SSA def(res) | main.go:30:9:30:9 | 6 | | main.go:30:9:30:9 | 6 | main.go:30:9:30:9 | 6 | -| main.go:30:9:30:9 | SSA def(res) | main.go:30:9:30:9 | 6 | -| main.go:33:15:33:17 | zero value for res | main.go:10:7:10:7 | 0 | +| main.go:33:24:39:1 | result-zero-init:0 block statement | main.go:10:7:10:7 | 0 | | main.go:34:8:34:8 | 7 | main.go:34:8:34:8 | 7 | | main.go:35:8:37:4 | function call | main.go:35:8:37:4 | function call | -| main.go:36:3:36:5 | SSA def(res) | main.go:36:9:36:9 | 8 | +| main.go:36:3:36:9 | SSA def(res) | main.go:36:9:36:9 | 8 | | main.go:36:9:36:9 | 8 | main.go:36:9:36:9 | 8 | +| main.go:38:2:38:9 | SSA def(res) | main.go:38:9:38:9 | 9 | | main.go:38:9:38:9 | 9 | main.go:38:9:38:9 | 9 | -| main.go:38:9:38:9 | SSA def(res) | main.go:38:9:38:9 | 9 | | regressions.go:5:11:5:31 | call to Sizeof | regressions.go:5:11:5:31 | call to Sizeof | | regressions.go:7:11:7:15 | false | regressions.go:7:11:7:15 | false | | regressions.go:9:11:9:12 | !... | regressions.go:11:11:11:14 | true | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/HiddenNodes/test.expected b/go/ql/test/library-tests/semmle/go/dataflow/HiddenNodes/test.expected index 13aa3515962b..3b1674900dd0 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/HiddenNodes/test.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/HiddenNodes/test.expected @@ -2,11 +2,11 @@ models | 1 | Summary: archive/tar; ; false; FileInfoHeader; ; ; Argument[0]; ReturnValue[0]; taint; manual | edges | test.go:14:8:14:15 | call to source | test.go:15:34:15:35 | fi | provenance | | -| test.go:15:2:15:44 | ... := ...[0] | test.go:16:7:16:12 | header | provenance | | -| test.go:15:34:15:35 | fi | test.go:15:2:15:44 | ... := ...[0] | provenance | MaD:1 | +| test.go:15:2:15:44 | extract:0 ... := ... | test.go:16:7:16:12 | header | provenance | | +| test.go:15:34:15:35 | fi | test.go:15:2:15:44 | extract:0 ... := ... | provenance | MaD:1 | nodes | test.go:14:8:14:15 | call to source | semmle.label | call to source | -| test.go:15:2:15:44 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:15:2:15:44 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:15:34:15:35 | fi | semmle.label | fi | | test.go:16:7:16:12 | header | semmle.label | header | subpaths diff --git a/go/ql/test/library-tests/semmle/go/dataflow/Nodes/BinaryOperationNodes.expected b/go/ql/test/library-tests/semmle/go/dataflow/Nodes/BinaryOperationNodes.expected index 9315b269125d..4ae78d28fdb2 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/Nodes/BinaryOperationNodes.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/Nodes/BinaryOperationNodes.expected @@ -1,6 +1,6 @@ | main.go:7:14:7:24 | ...+... | + | main.go:7:14:7:14 | x | main.go:7:19:7:23 | ...+... | | main.go:7:19:7:23 | ...+... | + | main.go:7:19:7:19 | y | main.go:7:23:7:23 | z | | main.go:10:14:10:18 | ...+... | + | main.go:10:14:10:14 | x | main.go:10:18:10:18 | y | -| main.go:17:2:17:13 | ... += ... | + | main.go:17:2:17:6 | index expression | main.go:17:11:17:13 | "!" | +| main.go:17:2:17:13 | compound-rhs ... += ... | + | main.go:17:2:17:6 | index expression | main.go:17:11:17:13 | "!" | | resultParameters.go:4:5:4:17 | ...==... | == | resultParameters.go:4:5:4:12 | selector | resultParameters.go:4:17:4:17 | 0 | | resultParameters.go:23:5:23:17 | ...==... | == | resultParameters.go:23:5:23:12 | selector | resultParameters.go:23:17:23:17 | 1 | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/Nodes/CallNode_getResult_int.expected b/go/ql/test/library-tests/semmle/go/dataflow/Nodes/CallNode_getResult_int.expected index 6c9465eeaf47..9e8955199329 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/Nodes/CallNode_getResult_int.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/Nodes/CallNode_getResult_int.expected @@ -1,3 +1,3 @@ -| main.go:9:9:9:14 | call to test | 0 | main.go:9:2:9:14 | ... = ...[0] | -| main.go:9:9:9:14 | call to test | 1 | main.go:9:2:9:14 | ... = ...[1] | +| main.go:9:9:9:14 | call to test | 0 | main.go:9:2:9:14 | extract:0 ... = ... | +| main.go:9:9:9:14 | call to test | 1 | main.go:9:2:9:14 | extract:1 ... = ... | | main.go:14:8:14:24 | call to make | 0 | main.go:14:8:14:24 | call to make | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/Nodes/ResultNode.expected b/go/ql/test/library-tests/semmle/go/dataflow/Nodes/ResultNode.expected index 093fcdbdae13..ca4d2fc9dd8d 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/Nodes/ResultNode.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/Nodes/ResultNode.expected @@ -4,5 +4,5 @@ | resultParameters.go:9:10:9:10 | 1 | Result node with index 0 | | resultParameters.go:11:10:11:10 | 2 | Result node with index 0 | | resultParameters.go:13:9:13:9 | 3 | Result node with index 0 | -| resultParameters.go:16:26:16:26 | implicit read of r | Result node with index 0 | -| resultParameters.go:21:38:21:38 | implicit read of r | Result node with index 0 | +| resultParameters.go:16:33:19:1 | result-read:0 block statement | Result node with index 0 | +| resultParameters.go:21:45:27:1 | result-read:0 block statement | Result node with index 0 | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/Nodes/resultParameters.go b/go/ql/test/library-tests/semmle/go/dataflow/Nodes/resultParameters.go index c404b8199142..60ae1462687e 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/Nodes/resultParameters.go +++ b/go/ql/test/library-tests/semmle/go/dataflow/Nodes/resultParameters.go @@ -13,15 +13,15 @@ func multipleReturns(selector int) int { return 3 // $ Alert[result-node] } -func resultParameter1() (r int) { // $ Alert[result-node] // implicit reads of result parameters are located at the result parameter declaration +func resultParameter1() (r int) { r = 0 return -} +} // $ Alert[result-node] // implicit reads of result parameters use the function body's location -func resultParameter2(selector int) (r int) { // $ Alert[result-node] // implicit reads of result parameters are located at the result parameter declaration +func resultParameter2(selector int) (r int) { r = 0 if selector == 1 { return 1 } return -} +} // $ Alert[result-node] // implicit reads of result parameters use the function body's location diff --git a/go/ql/test/library-tests/semmle/go/dataflow/PostUpdateNodes/test.expected b/go/ql/test/library-tests/semmle/go/dataflow/PostUpdateNodes/test.expected index d29d11627b0f..f0d15090e67f 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/PostUpdateNodes/test.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/PostUpdateNodes/test.expected @@ -10,12 +10,12 @@ | test.go:25:2:25:2 | a | test.go:25:2:25:2 | a [postupdate] | | test.go:25:2:25:5 | selection of bs | test.go:25:2:25:5 | selection of bs [postupdate] | | test.go:25:2:25:8 | index expression | test.go:25:2:25:8 | index expression [postupdate] | -| test.go:25:2:25:13 | implicit dereference | test.go:25:2:25:13 | implicit dereference [postupdate] | +| test.go:25:2:25:13 | implicit-deref selection of cptr | test.go:25:2:25:13 | implicit-deref selection of cptr [postupdate] | | test.go:25:2:25:13 | selection of cptr | test.go:25:2:25:13 | selection of cptr [postupdate] | | test.go:26:2:26:2 | a | test.go:26:2:26:2 | a [postupdate] | -| test.go:26:2:26:7 | implicit dereference | test.go:26:2:26:7 | implicit dereference [postupdate] | +| test.go:26:2:26:7 | implicit-deref selection of bptr | test.go:26:2:26:7 | implicit-deref selection of bptr [postupdate] | | test.go:26:2:26:7 | selection of bptr | test.go:26:2:26:7 | selection of bptr [postupdate] | -| test.go:26:2:26:12 | implicit dereference | test.go:26:2:26:12 | implicit dereference [postupdate] | +| test.go:26:2:26:12 | implicit-deref selection of cptr | test.go:26:2:26:12 | implicit-deref selection of cptr [postupdate] | | test.go:26:2:26:12 | selection of cptr | test.go:26:2:26:12 | selection of cptr [postupdate] | | test.go:28:7:28:10 | struct literal | test.go:28:7:28:10 | struct literal [postupdate] | | test.go:29:2:29:2 | c | test.go:29:2:29:2 | c [postupdate] | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/PromotedFields/LocalFlowStep.expected b/go/ql/test/library-tests/semmle/go/dataflow/PromotedFields/LocalFlowStep.expected index 950a3a5ae987..c08f17177ac2 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/PromotedFields/LocalFlowStep.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/PromotedFields/LocalFlowStep.expected @@ -1,132 +1,132 @@ -| main.go:22:2:22:6 | SSA def(outer) | main.go:25:7:25:11 | outer | -| main.go:22:11:24:2 | struct literal | main.go:22:2:22:6 | SSA def(outer) | -| main.go:22:11:24:2 | struct literal [postupdate] | main.go:22:2:22:6 | SSA def(outer) | +| main.go:22:2:24:2 | SSA def(outer) | main.go:25:7:25:11 | outer | +| main.go:22:11:24:2 | struct literal | main.go:22:2:24:2 | SSA def(outer) | +| main.go:22:11:24:2 | struct literal [postupdate] | main.go:22:2:24:2 | SSA def(outer) | | main.go:25:7:25:11 | outer | main.go:26:7:26:11 | outer | | main.go:26:7:26:11 | outer | main.go:27:7:27:11 | outer | | main.go:27:7:27:11 | outer | main.go:28:7:28:11 | outer | -| main.go:30:2:30:7 | SSA def(outerp) | main.go:33:7:33:12 | outerp | -| main.go:30:12:32:2 | &... | main.go:30:2:30:7 | SSA def(outerp) | -| main.go:30:12:32:2 | &... [postupdate] | main.go:30:2:30:7 | SSA def(outerp) | +| main.go:30:2:32:2 | SSA def(outerp) | main.go:33:7:33:12 | outerp | +| main.go:30:12:32:2 | &... | main.go:30:2:32:2 | SSA def(outerp) | +| main.go:30:12:32:2 | &... [postupdate] | main.go:30:2:32:2 | SSA def(outerp) | | main.go:33:7:33:12 | outerp | main.go:34:7:34:12 | outerp | | main.go:33:7:33:12 | outerp [postupdate] | main.go:34:7:34:12 | outerp | | main.go:34:7:34:12 | outerp | main.go:35:7:35:12 | outerp | | main.go:34:7:34:12 | outerp [postupdate] | main.go:35:7:35:12 | outerp | | main.go:35:7:35:12 | outerp | main.go:36:7:36:12 | outerp | | main.go:35:7:35:12 | outerp [postupdate] | main.go:36:7:36:12 | outerp | -| main.go:40:2:40:6 | SSA def(outer) | main.go:41:7:41:11 | outer | -| main.go:40:11:40:40 | struct literal | main.go:40:2:40:6 | SSA def(outer) | -| main.go:40:11:40:40 | struct literal [postupdate] | main.go:40:2:40:6 | SSA def(outer) | +| main.go:40:2:40:40 | SSA def(outer) | main.go:41:7:41:11 | outer | +| main.go:40:11:40:40 | struct literal | main.go:40:2:40:40 | SSA def(outer) | +| main.go:40:11:40:40 | struct literal [postupdate] | main.go:40:2:40:40 | SSA def(outer) | | main.go:41:7:41:11 | outer | main.go:42:7:42:11 | outer | | main.go:42:7:42:11 | outer | main.go:43:7:43:11 | outer | | main.go:43:7:43:11 | outer | main.go:44:7:44:11 | outer | -| main.go:46:2:46:7 | SSA def(outerp) | main.go:47:7:47:12 | outerp | -| main.go:46:12:46:42 | &... | main.go:46:2:46:7 | SSA def(outerp) | -| main.go:46:12:46:42 | &... [postupdate] | main.go:46:2:46:7 | SSA def(outerp) | +| main.go:46:2:46:42 | SSA def(outerp) | main.go:47:7:47:12 | outerp | +| main.go:46:12:46:42 | &... | main.go:46:2:46:42 | SSA def(outerp) | +| main.go:46:12:46:42 | &... [postupdate] | main.go:46:2:46:42 | SSA def(outerp) | | main.go:47:7:47:12 | outerp | main.go:48:7:48:12 | outerp | | main.go:47:7:47:12 | outerp [postupdate] | main.go:48:7:48:12 | outerp | | main.go:48:7:48:12 | outerp | main.go:49:7:49:12 | outerp | | main.go:48:7:48:12 | outerp [postupdate] | main.go:49:7:49:12 | outerp | | main.go:49:7:49:12 | outerp | main.go:50:7:50:12 | outerp | | main.go:49:7:49:12 | outerp [postupdate] | main.go:50:7:50:12 | outerp | -| main.go:54:2:54:6 | SSA def(inner) | main.go:55:19:55:23 | inner | -| main.go:54:11:54:25 | struct literal | main.go:54:2:54:6 | SSA def(inner) | -| main.go:54:11:54:25 | struct literal [postupdate] | main.go:54:2:54:6 | SSA def(inner) | -| main.go:55:2:55:7 | SSA def(middle) | main.go:56:17:56:22 | middle | -| main.go:55:12:55:24 | struct literal | main.go:55:2:55:7 | SSA def(middle) | -| main.go:55:12:55:24 | struct literal [postupdate] | main.go:55:2:55:7 | SSA def(middle) | -| main.go:56:2:56:6 | SSA def(outer) | main.go:57:7:57:11 | outer | -| main.go:56:11:56:23 | struct literal | main.go:56:2:56:6 | SSA def(outer) | -| main.go:56:11:56:23 | struct literal [postupdate] | main.go:56:2:56:6 | SSA def(outer) | +| main.go:54:2:54:25 | SSA def(inner) | main.go:55:19:55:23 | inner | +| main.go:54:11:54:25 | struct literal | main.go:54:2:54:25 | SSA def(inner) | +| main.go:54:11:54:25 | struct literal [postupdate] | main.go:54:2:54:25 | SSA def(inner) | +| main.go:55:2:55:24 | SSA def(middle) | main.go:56:17:56:22 | middle | +| main.go:55:12:55:24 | struct literal | main.go:55:2:55:24 | SSA def(middle) | +| main.go:55:12:55:24 | struct literal [postupdate] | main.go:55:2:55:24 | SSA def(middle) | +| main.go:56:2:56:23 | SSA def(outer) | main.go:57:7:57:11 | outer | +| main.go:56:11:56:23 | struct literal | main.go:56:2:56:23 | SSA def(outer) | +| main.go:56:11:56:23 | struct literal [postupdate] | main.go:56:2:56:23 | SSA def(outer) | | main.go:57:7:57:11 | outer | main.go:58:7:58:11 | outer | | main.go:58:7:58:11 | outer | main.go:59:7:59:11 | outer | | main.go:59:7:59:11 | outer | main.go:60:7:60:11 | outer | -| main.go:62:2:62:7 | SSA def(innerp) | main.go:63:20:63:25 | innerp | -| main.go:62:12:62:26 | struct literal | main.go:62:2:62:7 | SSA def(innerp) | -| main.go:62:12:62:26 | struct literal [postupdate] | main.go:62:2:62:7 | SSA def(innerp) | -| main.go:63:2:63:8 | SSA def(middlep) | main.go:64:18:64:24 | middlep | -| main.go:63:13:63:26 | struct literal | main.go:63:2:63:8 | SSA def(middlep) | -| main.go:63:13:63:26 | struct literal [postupdate] | main.go:63:2:63:8 | SSA def(middlep) | -| main.go:64:2:64:7 | SSA def(outerp) | main.go:65:7:65:12 | outerp | -| main.go:64:12:64:25 | struct literal | main.go:64:2:64:7 | SSA def(outerp) | -| main.go:64:12:64:25 | struct literal [postupdate] | main.go:64:2:64:7 | SSA def(outerp) | +| main.go:62:2:62:26 | SSA def(innerp) | main.go:63:20:63:25 | innerp | +| main.go:62:12:62:26 | struct literal | main.go:62:2:62:26 | SSA def(innerp) | +| main.go:62:12:62:26 | struct literal [postupdate] | main.go:62:2:62:26 | SSA def(innerp) | +| main.go:63:2:63:26 | SSA def(middlep) | main.go:64:18:64:24 | middlep | +| main.go:63:13:63:26 | struct literal | main.go:63:2:63:26 | SSA def(middlep) | +| main.go:63:13:63:26 | struct literal [postupdate] | main.go:63:2:63:26 | SSA def(middlep) | +| main.go:64:2:64:25 | SSA def(outerp) | main.go:65:7:65:12 | outerp | +| main.go:64:12:64:25 | struct literal | main.go:64:2:64:25 | SSA def(outerp) | +| main.go:64:12:64:25 | struct literal [postupdate] | main.go:64:2:64:25 | SSA def(outerp) | | main.go:65:7:65:12 | outerp | main.go:66:7:66:12 | outerp | | main.go:66:7:66:12 | outerp | main.go:67:7:67:12 | outerp | | main.go:67:7:67:12 | outerp | main.go:68:7:68:12 | outerp | -| main.go:72:2:72:6 | SSA def(inner) | main.go:73:26:73:30 | inner | -| main.go:72:11:72:25 | struct literal | main.go:72:2:72:6 | SSA def(inner) | -| main.go:72:11:72:25 | struct literal [postupdate] | main.go:72:2:72:6 | SSA def(inner) | -| main.go:73:2:73:7 | SSA def(middle) | main.go:74:25:74:30 | middle | -| main.go:73:12:73:31 | struct literal | main.go:73:2:73:7 | SSA def(middle) | -| main.go:73:12:73:31 | struct literal [postupdate] | main.go:73:2:73:7 | SSA def(middle) | -| main.go:74:2:74:6 | SSA def(outer) | main.go:75:7:75:11 | outer | -| main.go:74:11:74:31 | struct literal | main.go:74:2:74:6 | SSA def(outer) | -| main.go:74:11:74:31 | struct literal [postupdate] | main.go:74:2:74:6 | SSA def(outer) | +| main.go:72:2:72:25 | SSA def(inner) | main.go:73:26:73:30 | inner | +| main.go:72:11:72:25 | struct literal | main.go:72:2:72:25 | SSA def(inner) | +| main.go:72:11:72:25 | struct literal [postupdate] | main.go:72:2:72:25 | SSA def(inner) | +| main.go:73:2:73:31 | SSA def(middle) | main.go:74:25:74:30 | middle | +| main.go:73:12:73:31 | struct literal | main.go:73:2:73:31 | SSA def(middle) | +| main.go:73:12:73:31 | struct literal [postupdate] | main.go:73:2:73:31 | SSA def(middle) | +| main.go:74:2:74:31 | SSA def(outer) | main.go:75:7:75:11 | outer | +| main.go:74:11:74:31 | struct literal | main.go:74:2:74:31 | SSA def(outer) | +| main.go:74:11:74:31 | struct literal [postupdate] | main.go:74:2:74:31 | SSA def(outer) | | main.go:75:7:75:11 | outer | main.go:76:7:76:11 | outer | | main.go:76:7:76:11 | outer | main.go:77:7:77:11 | outer | | main.go:77:7:77:11 | outer | main.go:78:7:78:11 | outer | -| main.go:80:2:80:7 | SSA def(innerp) | main.go:81:27:81:32 | innerp | -| main.go:80:12:80:26 | struct literal | main.go:80:2:80:7 | SSA def(innerp) | -| main.go:80:12:80:26 | struct literal [postupdate] | main.go:80:2:80:7 | SSA def(innerp) | -| main.go:81:2:81:8 | SSA def(middlep) | main.go:82:26:82:32 | middlep | -| main.go:81:13:81:33 | struct literal | main.go:81:2:81:8 | SSA def(middlep) | -| main.go:81:13:81:33 | struct literal [postupdate] | main.go:81:2:81:8 | SSA def(middlep) | -| main.go:82:2:82:7 | SSA def(outerp) | main.go:83:7:83:12 | outerp | -| main.go:82:12:82:33 | struct literal | main.go:82:2:82:7 | SSA def(outerp) | -| main.go:82:12:82:33 | struct literal [postupdate] | main.go:82:2:82:7 | SSA def(outerp) | +| main.go:80:2:80:26 | SSA def(innerp) | main.go:81:27:81:32 | innerp | +| main.go:80:12:80:26 | struct literal | main.go:80:2:80:26 | SSA def(innerp) | +| main.go:80:12:80:26 | struct literal [postupdate] | main.go:80:2:80:26 | SSA def(innerp) | +| main.go:81:2:81:33 | SSA def(middlep) | main.go:82:26:82:32 | middlep | +| main.go:81:13:81:33 | struct literal | main.go:81:2:81:33 | SSA def(middlep) | +| main.go:81:13:81:33 | struct literal [postupdate] | main.go:81:2:81:33 | SSA def(middlep) | +| main.go:82:2:82:33 | SSA def(outerp) | main.go:83:7:83:12 | outerp | +| main.go:82:12:82:33 | struct literal | main.go:82:2:82:33 | SSA def(outerp) | +| main.go:82:12:82:33 | struct literal [postupdate] | main.go:82:2:82:33 | SSA def(outerp) | | main.go:83:7:83:12 | outerp | main.go:84:7:84:12 | outerp | | main.go:84:7:84:12 | outerp | main.go:85:7:85:12 | outerp | | main.go:85:7:85:12 | outerp | main.go:86:7:86:12 | outerp | -| main.go:90:6:90:10 | SSA def(outer) | main.go:91:2:91:6 | outer | -| main.go:90:6:90:10 | zero value for outer | main.go:90:6:90:10 | SSA def(outer) | +| main.go:90:6:90:16 | SSA def(outer) | main.go:91:2:91:6 | outer | +| main.go:90:6:90:16 | zero-init:0 value declaration specifier | main.go:90:6:90:16 | SSA def(outer) | | main.go:91:2:91:6 | outer | main.go:92:7:92:11 | outer | | main.go:91:2:91:6 | outer [postupdate] | main.go:92:7:92:11 | outer | | main.go:92:7:92:11 | outer | main.go:93:7:93:11 | outer | | main.go:93:7:93:11 | outer | main.go:94:7:94:11 | outer | | main.go:94:7:94:11 | outer | main.go:95:7:95:11 | outer | -| main.go:97:6:97:11 | SSA def(outerp) | main.go:98:2:98:7 | outerp | -| main.go:97:6:97:11 | zero value for outerp | main.go:97:6:97:11 | SSA def(outerp) | +| main.go:97:6:97:17 | SSA def(outerp) | main.go:98:2:98:7 | outerp | +| main.go:97:6:97:17 | zero-init:0 value declaration specifier | main.go:97:6:97:17 | SSA def(outerp) | | main.go:98:2:98:7 | outerp | main.go:99:7:99:12 | outerp | | main.go:98:2:98:7 | outerp [postupdate] | main.go:99:7:99:12 | outerp | | main.go:99:7:99:12 | outerp | main.go:100:7:100:12 | outerp | | main.go:100:7:100:12 | outerp | main.go:101:7:101:12 | outerp | | main.go:101:7:101:12 | outerp | main.go:102:7:102:12 | outerp | -| main.go:106:6:106:10 | SSA def(outer) | main.go:107:2:107:6 | outer | -| main.go:106:6:106:10 | zero value for outer | main.go:106:6:106:10 | SSA def(outer) | +| main.go:106:6:106:16 | SSA def(outer) | main.go:107:2:107:6 | outer | +| main.go:106:6:106:16 | zero-init:0 value declaration specifier | main.go:106:6:106:16 | SSA def(outer) | | main.go:107:2:107:6 | outer | main.go:108:7:108:11 | outer | | main.go:107:2:107:6 | outer [postupdate] | main.go:108:7:108:11 | outer | | main.go:108:7:108:11 | outer | main.go:109:7:109:11 | outer | | main.go:109:7:109:11 | outer | main.go:110:7:110:11 | outer | | main.go:110:7:110:11 | outer | main.go:111:7:111:11 | outer | -| main.go:113:6:113:11 | SSA def(outerp) | main.go:114:2:114:7 | outerp | -| main.go:113:6:113:11 | zero value for outerp | main.go:113:6:113:11 | SSA def(outerp) | +| main.go:113:6:113:17 | SSA def(outerp) | main.go:114:2:114:7 | outerp | +| main.go:113:6:113:17 | zero-init:0 value declaration specifier | main.go:113:6:113:17 | SSA def(outerp) | | main.go:114:2:114:7 | outerp | main.go:115:7:115:12 | outerp | | main.go:114:2:114:7 | outerp [postupdate] | main.go:115:7:115:12 | outerp | | main.go:115:7:115:12 | outerp | main.go:116:7:116:12 | outerp | | main.go:116:7:116:12 | outerp | main.go:117:7:117:12 | outerp | | main.go:117:7:117:12 | outerp | main.go:118:7:118:12 | outerp | -| main.go:122:6:122:10 | SSA def(outer) | main.go:123:2:123:6 | outer | -| main.go:122:6:122:10 | zero value for outer | main.go:122:6:122:10 | SSA def(outer) | +| main.go:122:6:122:16 | SSA def(outer) | main.go:123:2:123:6 | outer | +| main.go:122:6:122:16 | zero-init:0 value declaration specifier | main.go:122:6:122:16 | SSA def(outer) | | main.go:123:2:123:6 | outer | main.go:124:7:124:11 | outer | | main.go:123:2:123:6 | outer [postupdate] | main.go:124:7:124:11 | outer | | main.go:124:7:124:11 | outer | main.go:125:7:125:11 | outer | | main.go:125:7:125:11 | outer | main.go:126:7:126:11 | outer | | main.go:126:7:126:11 | outer | main.go:127:7:127:11 | outer | -| main.go:129:6:129:11 | SSA def(outerp) | main.go:130:2:130:7 | outerp | -| main.go:129:6:129:11 | zero value for outerp | main.go:129:6:129:11 | SSA def(outerp) | +| main.go:129:6:129:17 | SSA def(outerp) | main.go:130:2:130:7 | outerp | +| main.go:129:6:129:17 | zero-init:0 value declaration specifier | main.go:129:6:129:17 | SSA def(outerp) | | main.go:130:2:130:7 | outerp | main.go:131:7:131:12 | outerp | | main.go:130:2:130:7 | outerp [postupdate] | main.go:131:7:131:12 | outerp | | main.go:131:7:131:12 | outerp | main.go:132:7:132:12 | outerp | | main.go:132:7:132:12 | outerp | main.go:133:7:133:12 | outerp | | main.go:133:7:133:12 | outerp | main.go:134:7:134:12 | outerp | -| main.go:138:6:138:10 | SSA def(outer) | main.go:139:2:139:6 | outer | -| main.go:138:6:138:10 | zero value for outer | main.go:138:6:138:10 | SSA def(outer) | +| main.go:138:6:138:16 | SSA def(outer) | main.go:139:2:139:6 | outer | +| main.go:138:6:138:16 | zero-init:0 value declaration specifier | main.go:138:6:138:16 | SSA def(outer) | | main.go:139:2:139:6 | outer | main.go:140:7:140:11 | outer | | main.go:139:2:139:6 | outer [postupdate] | main.go:140:7:140:11 | outer | | main.go:140:7:140:11 | outer | main.go:141:7:141:11 | outer | | main.go:141:7:141:11 | outer | main.go:142:7:142:11 | outer | | main.go:142:7:142:11 | outer | main.go:143:7:143:11 | outer | -| main.go:145:6:145:11 | SSA def(outerp) | main.go:146:2:146:7 | outerp | -| main.go:145:6:145:11 | zero value for outerp | main.go:145:6:145:11 | SSA def(outerp) | +| main.go:145:6:145:17 | SSA def(outerp) | main.go:146:2:146:7 | outerp | +| main.go:145:6:145:17 | zero-init:0 value declaration specifier | main.go:145:6:145:17 | SSA def(outerp) | | main.go:146:2:146:7 | outerp | main.go:147:7:147:12 | outerp | | main.go:146:2:146:7 | outerp [postupdate] | main.go:147:7:147:12 | outerp | | main.go:147:7:147:12 | outerp | main.go:148:7:148:12 | outerp | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ReadsAndWrites/readsElement.expected b/go/ql/test/library-tests/semmle/go/dataflow/ReadsAndWrites/readsElement.expected index 640c0dec2676..df6a0b049b60 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ReadsAndWrites/readsElement.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ReadsAndWrites/readsElement.expected @@ -1,3 +1,3 @@ | tst.go:19:10:19:14 | index expression | tst.go:19:10:19:11 | xs | tst.go:19:13:19:13 | 1 | -| tst.go:20:10:20:14 | index expression | tst.go:20:10:20:11 | implicit dereference | tst.go:20:13:20:13 | 1 | +| tst.go:20:10:20:14 | index expression | tst.go:20:10:20:11 | implicit-deref ps | tst.go:20:13:20:13 | 1 | | tst.go:20:10:20:14 | index expression | tst.go:20:10:20:11 | ps | tst.go:20:13:20:13 | 1 | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ReadsAndWrites/readsField.expected b/go/ql/test/library-tests/semmle/go/dataflow/ReadsAndWrites/readsField.expected index 683117030c76..3dbbdc221e8d 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ReadsAndWrites/readsField.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ReadsAndWrites/readsField.expected @@ -1,4 +1,4 @@ -| tst.go:8:8:8:10 | selection of f | tst.go:8:8:8:8 | implicit dereference | tst.go:4:2:4:2 | f | +| tst.go:8:8:8:10 | selection of f | tst.go:8:8:8:8 | implicit-deref t | tst.go:4:2:4:2 | f | | tst.go:8:8:8:10 | selection of f | tst.go:8:8:8:8 | t | tst.go:4:2:4:2 | f | | tst.go:13:9:13:11 | selection of f | tst.go:13:9:13:9 | t | tst.go:4:2:4:2 | f | | tst.go:17:8:17:10 | selection of f | tst.go:17:8:17:8 | x | tst.go:4:2:4:2 | f | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ReadsAndWrites/readsMethod.expected b/go/ql/test/library-tests/semmle/go/dataflow/ReadsAndWrites/readsMethod.expected index 1909e3257452..0a948af2cd23 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ReadsAndWrites/readsMethod.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ReadsAndWrites/readsMethod.expected @@ -1,3 +1,3 @@ -| tst.go:9:9:9:13 | selection of get | tst.go:9:9:9:9 | implicit dereference | tst.go:12:12:12:14 | get | +| tst.go:9:9:9:13 | selection of get | tst.go:9:9:9:9 | implicit-deref t | tst.go:12:12:12:14 | get | | tst.go:9:9:9:13 | selection of get | tst.go:9:9:9:9 | t | tst.go:12:12:12:14 | get | | tst.go:18:2:18:7 | selection of bump | tst.go:18:2:18:2 | x | tst.go:7:13:7:16 | bump | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ReadsAndWrites/writesElement.expected b/go/ql/test/library-tests/semmle/go/dataflow/ReadsAndWrites/writesElement.expected index 44792aa3d299..23cfd9b6acab 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ReadsAndWrites/writesElement.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ReadsAndWrites/writesElement.expected @@ -1,3 +1,3 @@ -| tst.go:19:2:19:6 | assignment to element | tst.go:19:2:19:3 | xs [postupdate] | tst.go:19:5:19:5 | 0 | tst.go:19:10:19:14 | index expression | -| tst.go:20:2:20:6 | assignment to element | tst.go:20:2:20:3 | implicit dereference [postupdate] | tst.go:20:5:20:5 | 0 | tst.go:20:10:20:14 | index expression | -| tst.go:20:2:20:6 | assignment to element | tst.go:20:2:20:3 | ps [postupdate] | tst.go:20:5:20:5 | 0 | tst.go:20:10:20:14 | index expression | +| tst.go:19:2:19:14 | assign:0 ... = ... | tst.go:19:2:19:3 | xs [postupdate] | tst.go:19:5:19:5 | 0 | tst.go:19:10:19:14 | index expression | +| tst.go:20:2:20:14 | assign:0 ... = ... | tst.go:20:2:20:3 | implicit-deref ps [postupdate] | tst.go:20:5:20:5 | 0 | tst.go:20:10:20:14 | index expression | +| tst.go:20:2:20:14 | assign:0 ... = ... | tst.go:20:2:20:3 | ps [postupdate] | tst.go:20:5:20:5 | 0 | tst.go:20:10:20:14 | index expression | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ReadsAndWrites/writesField.expected b/go/ql/test/library-tests/semmle/go/dataflow/ReadsAndWrites/writesField.expected index 7862b2d61b3d..414a82acfc95 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ReadsAndWrites/writesField.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ReadsAndWrites/writesField.expected @@ -1,3 +1,3 @@ -| tst.go:8:2:8:4 | assignment to field f | tst.go:8:2:8:2 | implicit dereference [postupdate] | tst.go:4:2:4:2 | f | tst.go:8:8:8:14 | ...+... | -| tst.go:8:2:8:4 | assignment to field f | tst.go:8:2:8:2 | t [postupdate] | tst.go:4:2:4:2 | f | tst.go:8:8:8:14 | ...+... | -| tst.go:17:2:17:4 | assignment to field f | tst.go:17:2:17:2 | x [postupdate] | tst.go:4:2:4:2 | f | tst.go:17:8:17:14 | ...+... | +| tst.go:8:2:8:14 | assign:0 ... = ... | tst.go:8:2:8:2 | implicit-deref t [postupdate] | tst.go:4:2:4:2 | f | tst.go:8:8:8:14 | ...+... | +| tst.go:8:2:8:14 | assign:0 ... = ... | tst.go:8:2:8:2 | t [postupdate] | tst.go:4:2:4:2 | f | tst.go:8:8:8:14 | ...+... | +| tst.go:17:2:17:14 | assign:0 ... = ... | tst.go:17:2:17:2 | x [postupdate] | tst.go:4:2:4:2 | f | tst.go:17:8:17:14 | ...+... | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/SSA/DefUse.expected b/go/ql/test/library-tests/semmle/go/dataflow/SSA/DefUse.expected index 775eff4a49e5..6c019cb0f278 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/SSA/DefUse.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/SSA/DefUse.expected @@ -1,40 +1,40 @@ -| main.go:15:12:15:12 | x | main.go:13:6:13:6 | SSA def(x) | main.go:13:6:13:6 | x | -| main.go:15:15:15:15 | y | main.go:14:2:14:2 | SSA def(y) | main.go:14:2:14:2 | y | -| main.go:17:3:17:3 | y | main.go:14:2:14:2 | SSA def(y) | main.go:14:2:14:2 | y | -| main.go:19:12:19:12 | x | main.go:13:6:13:6 | SSA def(x) | main.go:13:6:13:6 | x | +| main.go:15:12:15:12 | x | main.go:13:6:13:10 | SSA def(x) | main.go:13:6:13:6 | x | +| main.go:15:15:15:15 | y | main.go:14:2:14:8 | SSA def(y) | main.go:14:2:14:2 | y | +| main.go:17:3:17:3 | y | main.go:14:2:14:8 | SSA def(y) | main.go:14:2:14:2 | y | +| main.go:19:12:19:12 | x | main.go:13:6:13:10 | SSA def(x) | main.go:13:6:13:6 | x | | main.go:19:15:19:15 | y | main.go:19:2:19:10 | SSA phi(y) | main.go:14:2:14:2 | y | | main.go:21:7:21:7 | y | main.go:19:2:19:10 | SSA phi(y) | main.go:14:2:14:2 | y | | main.go:23:12:23:12 | x | main.go:23:2:23:10 | SSA phi(x) | main.go:13:6:13:6 | x | | main.go:23:15:23:15 | y | main.go:19:2:19:10 | SSA phi(y) | main.go:14:2:14:2 | y | | main.go:27:10:27:10 | x | main.go:26:10:26:10 | SSA def(x) | main.go:26:10:26:10 | x | -| main.go:29:10:29:10 | b | main.go:27:5:27:5 | SSA def(b) | main.go:27:5:27:5 | b | -| main.go:29:13:29:13 | a | main.go:27:2:27:2 | SSA def(a) | main.go:27:2:27:2 | a | +| main.go:29:10:29:10 | b | main.go:27:2:27:13 | SSA def(b) | main.go:27:5:27:5 | b | +| main.go:29:13:29:13 | a | main.go:27:2:27:13 | SSA def(a) | main.go:27:2:27:2 | a | | main.go:31:9:31:9 | a | main.go:31:9:31:9 | SSA phi(a) | main.go:27:2:27:2 | a | | main.go:31:12:31:12 | b | main.go:31:9:31:9 | SSA phi(b) | main.go:27:5:27:5 | b | | main.go:35:3:35:3 | x | main.go:34:11:34:11 | SSA def(x) | main.go:34:11:34:11 | x | -| main.go:40:10:40:10 | x | main.go:39:2:39:2 | SSA def(x) | main.go:39:2:39:2 | x | -| main.go:42:8:42:10 | ptr | main.go:40:2:40:4 | SSA def(ptr) | main.go:40:2:40:4 | ptr | -| main.go:44:12:44:12 | x | main.go:39:2:39:2 | SSA def(x) | main.go:39:2:39:2 | x | -| main.go:47:13:47:18 | implicit read of result | main.go:48:2:48:7 | SSA def(result) | main.go:47:13:47:18 | result | -| main.go:52:14:52:19 | implicit read of result | main.go:52:14:52:19 | SSA def(result) | main.go:52:14:52:19 | result | +| main.go:40:10:40:10 | x | main.go:39:2:39:8 | SSA def(x) | main.go:39:2:39:2 | x | +| main.go:42:8:42:10 | ptr | main.go:40:2:40:10 | SSA def(ptr) | main.go:40:2:40:4 | ptr | +| main.go:44:12:44:12 | x | main.go:39:2:39:8 | SSA def(x) | main.go:39:2:39:2 | x | +| main.go:47:25:50:1 | result-read:0 block statement | main.go:48:2:48:12 | SSA def(result) | main.go:47:13:47:18 | result | +| main.go:52:26:54:1 | result-read:0 block statement | main.go:52:26:54:1 | SSA def(result) | main.go:52:14:52:19 | result | | main.go:61:12:61:12 | x | main.go:58:6:58:9 | SSA phi(x) | main.go:57:6:57:6 | x | | main.go:64:16:64:16 | i | main.go:65:6:65:9 | SSA phi(i) | main.go:64:6:64:6 | i | | main.go:70:12:70:12 | y | main.go:65:6:65:9 | SSA phi(y) | main.go:63:2:63:2 | y | | main.go:73:16:73:16 | i | main.go:74:3:74:3 | SSA phi(i) | main.go:73:6:73:6 | i | -| main.go:79:12:79:12 | z | main.go:74:3:74:3 | SSA def(z) | main.go:72:2:72:2 | z | -| main.go:82:18:82:18 | implicit read of a | main.go:84:5:84:5 | SSA def(a) | main.go:82:18:82:18 | a | -| main.go:82:25:82:25 | implicit read of b | main.go:82:25:82:25 | SSA def(b) | main.go:82:25:82:25 | b | -| main.go:84:9:84:9 | x | main.go:83:2:83:2 | SSA def(x) | main.go:83:2:83:2 | x | -| main.go:84:15:84:15 | x | main.go:83:2:83:2 | SSA def(x) | main.go:83:2:83:2 | x | +| main.go:79:12:79:12 | z | main.go:74:3:74:7 | SSA def(z) | main.go:72:2:72:2 | z | +| main.go:82:36:86:1 | result-read:0 block statement | main.go:84:2:84:15 | SSA def(a) | main.go:82:18:82:18 | a | +| main.go:82:36:86:1 | result-read:1 block statement | main.go:82:36:86:1 | SSA def(b) | main.go:82:25:82:25 | b | +| main.go:84:9:84:9 | x | main.go:83:2:83:8 | SSA def(x) | main.go:83:2:83:2 | x | +| main.go:84:15:84:15 | x | main.go:83:2:83:8 | SSA def(x) | main.go:83:2:83:2 | x | | main.go:97:2:97:8 | wrapper | main.go:95:22:95:28 | SSA def(wrapper) | main.go:95:22:95:28 | wrapper | | main.go:100:9:100:9 | x | main.go:97:2:99:3 | SSA def(x) | main.go:96:2:96:2 | x | | main.go:105:2:105:8 | wrapper | main.go:103:20:103:26 | SSA def(wrapper) | main.go:103:20:103:26 | wrapper | | main.go:106:8:106:8 | x | main.go:105:16:108:2 | SSA def(x) | main.go:104:2:104:2 | x | -| main.go:107:7:107:7 | y | main.go:106:3:106:3 | SSA def(y) | main.go:106:3:106:3 | y | -| main.go:109:9:109:9 | x | main.go:104:2:104:2 | SSA def(x) | main.go:104:2:104:2 | x | +| main.go:107:7:107:7 | y | main.go:106:3:106:8 | SSA def(y) | main.go:106:3:106:3 | y | +| main.go:109:9:109:9 | x | main.go:104:2:104:7 | SSA def(x) | main.go:104:2:104:2 | x | | main.go:114:2:114:8 | wrapper | main.go:112:29:112:35 | SSA def(wrapper) | main.go:112:29:112:35 | wrapper | | main.go:115:8:115:8 | x | main.go:114:16:117:2 | SSA def(x) | main.go:113:2:113:2 | x | -| main.go:116:7:116:7 | y | main.go:115:3:115:3 | SSA def(y) | main.go:115:3:115:3 | y | +| main.go:116:7:116:7 | y | main.go:115:3:115:12 | SSA def(y) | main.go:115:3:115:3 | y | | main.go:118:9:118:9 | x | main.go:114:2:117:3 | SSA def(x) | main.go:113:2:113:2 | x | | main.go:135:2:135:2 | p | main.go:135:2:135:2 | SSA phi(p) | main.go:128:6:128:6 | p | | main.go:137:12:137:12 | p | main.go:135:2:135:2 | SSA phi(p) | main.go:128:6:128:6 | p | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/SSA/SsaDefinition.expected b/go/ql/test/library-tests/semmle/go/dataflow/SSA/SsaDefinition.expected index 3ff2faf872c4..37943a0f2646 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/SSA/SsaDefinition.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/SSA/SsaDefinition.expected @@ -1,51 +1,51 @@ -| main.go:13:6:13:6 | SSA def(x) | -| main.go:14:2:14:2 | SSA def(y) | -| main.go:17:3:17:3 | SSA def(y) | +| main.go:13:6:13:10 | SSA def(x) | +| main.go:14:2:14:8 | SSA def(y) | +| main.go:17:3:17:9 | SSA def(y) | | main.go:19:2:19:10 | SSA phi(y) | -| main.go:21:3:21:3 | SSA def(x) | +| main.go:21:3:21:7 | SSA def(x) | | main.go:23:2:23:10 | SSA phi(x) | | main.go:26:10:26:10 | SSA def(x) | -| main.go:27:2:27:2 | SSA def(a) | -| main.go:27:5:27:5 | SSA def(b) | -| main.go:29:3:29:3 | SSA def(a) | -| main.go:29:6:29:6 | SSA def(b) | +| main.go:27:2:27:13 | SSA def(a) | +| main.go:27:2:27:13 | SSA def(b) | +| main.go:29:3:29:13 | SSA def(a) | +| main.go:29:3:29:13 | SSA def(b) | | main.go:31:9:31:9 | SSA phi(a) | | main.go:31:9:31:9 | SSA phi(b) | | main.go:34:11:34:11 | SSA def(x) | -| main.go:39:2:39:2 | SSA def(x) | -| main.go:40:2:40:4 | SSA def(ptr) | -| main.go:48:2:48:7 | SSA def(result) | -| main.go:52:14:52:19 | SSA def(result) | -| main.go:57:6:57:6 | SSA def(x) | +| main.go:39:2:39:8 | SSA def(x) | +| main.go:40:2:40:10 | SSA def(ptr) | +| main.go:48:2:48:12 | SSA def(result) | +| main.go:52:26:54:1 | SSA def(result) | +| main.go:57:6:57:10 | SSA def(x) | | main.go:58:6:58:9 | SSA phi(x) | -| main.go:59:3:59:3 | SSA def(x) | -| main.go:63:2:63:2 | SSA def(y) | -| main.go:64:6:64:6 | SSA def(i) | +| main.go:59:3:59:7 | SSA def(x) | +| main.go:63:2:63:7 | SSA def(y) | +| main.go:64:6:64:11 | SSA def(i) | | main.go:64:16:64:18 | SSA def(i) | | main.go:65:6:65:9 | SSA phi(i) | | main.go:65:6:65:9 | SSA phi(y) | -| main.go:68:3:68:3 | SSA def(y) | -| main.go:73:6:73:6 | SSA def(i) | +| main.go:68:3:68:7 | SSA def(y) | +| main.go:73:6:73:11 | SSA def(i) | | main.go:73:16:73:18 | SSA def(i) | -| main.go:74:3:74:3 | SSA def(z) | | main.go:74:3:74:3 | SSA phi(i) | -| main.go:82:25:82:25 | SSA def(b) | -| main.go:83:2:83:2 | SSA def(x) | -| main.go:84:5:84:5 | SSA def(a) | +| main.go:74:3:74:7 | SSA def(z) | +| main.go:82:36:86:1 | SSA def(b) | +| main.go:83:2:83:8 | SSA def(x) | +| main.go:84:2:84:15 | SSA def(a) | | main.go:95:22:95:28 | SSA def(wrapper) | -| main.go:96:2:96:2 | SSA def(x) | +| main.go:96:2:96:7 | SSA def(x) | | main.go:97:2:99:3 | SSA def(x) | -| main.go:98:3:98:3 | SSA def(x) | +| main.go:98:3:98:7 | SSA def(x) | | main.go:103:20:103:26 | SSA def(wrapper) | -| main.go:104:2:104:2 | SSA def(x) | +| main.go:104:2:104:7 | SSA def(x) | | main.go:105:16:108:2 | SSA def(x) | -| main.go:106:3:106:3 | SSA def(y) | +| main.go:106:3:106:8 | SSA def(y) | | main.go:112:29:112:35 | SSA def(wrapper) | -| main.go:113:2:113:2 | SSA def(x) | +| main.go:113:2:113:7 | SSA def(x) | | main.go:114:2:117:3 | SSA def(x) | | main.go:114:16:117:2 | SSA def(x) | -| main.go:115:3:115:3 | SSA def(y) | -| main.go:116:3:116:3 | SSA def(x) | -| main.go:130:3:130:3 | SSA def(p) | -| main.go:132:3:132:3 | SSA def(p) | +| main.go:115:3:115:12 | SSA def(y) | +| main.go:116:3:116:7 | SSA def(x) | +| main.go:130:3:130:24 | SSA def(p) | +| main.go:132:3:132:24 | SSA def(p) | | main.go:135:2:135:2 | SSA phi(p) | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/SSA/SsaWithFields.expected b/go/ql/test/library-tests/semmle/go/dataflow/SSA/SsaWithFields.expected index 2c43f05257aa..4925c1039000 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/SSA/SsaWithFields.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/SSA/SsaWithFields.expected @@ -1,56 +1,56 @@ -| main.go:13:6:13:6 | (SSA def(x)) | x | -| main.go:14:2:14:2 | (SSA def(y)) | y | -| main.go:17:3:17:3 | (SSA def(y)) | y | +| main.go:13:6:13:10 | (SSA def(x)) | x | +| main.go:14:2:14:8 | (SSA def(y)) | y | +| main.go:17:3:17:9 | (SSA def(y)) | y | | main.go:19:2:19:10 | (SSA phi(y)) | y | -| main.go:21:3:21:3 | (SSA def(x)) | x | +| main.go:21:3:21:7 | (SSA def(x)) | x | | main.go:23:2:23:10 | (SSA phi(x)) | x | | main.go:26:10:26:10 | (SSA def(x)) | x | -| main.go:27:2:27:2 | (SSA def(a)) | a | -| main.go:27:5:27:5 | (SSA def(b)) | b | -| main.go:29:3:29:3 | (SSA def(a)) | a | -| main.go:29:6:29:6 | (SSA def(b)) | b | +| main.go:27:2:27:13 | (SSA def(a)) | a | +| main.go:27:2:27:13 | (SSA def(b)) | b | +| main.go:29:3:29:13 | (SSA def(a)) | a | +| main.go:29:3:29:13 | (SSA def(b)) | b | | main.go:31:9:31:9 | (SSA phi(a)) | a | | main.go:31:9:31:9 | (SSA phi(b)) | b | | main.go:34:11:34:11 | (SSA def(x)) | x | -| main.go:39:2:39:2 | (SSA def(x)) | x | -| main.go:40:2:40:4 | (SSA def(ptr)) | ptr | -| main.go:48:2:48:7 | (SSA def(result)) | result | -| main.go:52:14:52:19 | (SSA def(result)) | result | -| main.go:57:6:57:6 | (SSA def(x)) | x | +| main.go:39:2:39:8 | (SSA def(x)) | x | +| main.go:40:2:40:10 | (SSA def(ptr)) | ptr | +| main.go:48:2:48:12 | (SSA def(result)) | result | +| main.go:52:26:54:1 | (SSA def(result)) | result | +| main.go:57:6:57:10 | (SSA def(x)) | x | | main.go:58:6:58:9 | (SSA phi(x)) | x | -| main.go:59:3:59:3 | (SSA def(x)) | x | -| main.go:63:2:63:2 | (SSA def(y)) | y | -| main.go:64:6:64:6 | (SSA def(i)) | i | +| main.go:59:3:59:7 | (SSA def(x)) | x | +| main.go:63:2:63:7 | (SSA def(y)) | y | +| main.go:64:6:64:11 | (SSA def(i)) | i | | main.go:64:16:64:18 | (SSA def(i)) | i | | main.go:65:6:65:9 | (SSA phi(i)) | i | | main.go:65:6:65:9 | (SSA phi(y)) | y | -| main.go:68:3:68:3 | (SSA def(y)) | y | -| main.go:73:6:73:6 | (SSA def(i)) | i | +| main.go:68:3:68:7 | (SSA def(y)) | y | +| main.go:73:6:73:11 | (SSA def(i)) | i | | main.go:73:16:73:18 | (SSA def(i)) | i | -| main.go:74:3:74:3 | (SSA def(z)) | z | | main.go:74:3:74:3 | (SSA phi(i)) | i | -| main.go:82:25:82:25 | (SSA def(b)) | b | -| main.go:83:2:83:2 | (SSA def(x)) | x | -| main.go:84:5:84:5 | (SSA def(a)) | a | +| main.go:74:3:74:7 | (SSA def(z)) | z | +| main.go:82:36:86:1 | (SSA def(b)) | b | +| main.go:83:2:83:8 | (SSA def(x)) | x | +| main.go:84:2:84:15 | (SSA def(a)) | a | | main.go:95:22:95:28 | (SSA def(wrapper)) | wrapper | | main.go:95:22:95:28 | (SSA def(wrapper)).s | wrapper.s | -| main.go:96:2:96:2 | (SSA def(x)) | x | +| main.go:96:2:96:7 | (SSA def(x)) | x | | main.go:97:2:99:3 | (SSA def(x)) | x | -| main.go:98:3:98:3 | (SSA def(x)) | x | +| main.go:98:3:98:7 | (SSA def(x)) | x | | main.go:103:20:103:26 | (SSA def(wrapper)) | wrapper | | main.go:103:20:103:26 | (SSA def(wrapper)).s | wrapper.s | -| main.go:104:2:104:2 | (SSA def(x)) | x | +| main.go:104:2:104:7 | (SSA def(x)) | x | | main.go:105:16:108:2 | (SSA def(x)) | x | -| main.go:106:3:106:3 | (SSA def(y)) | y | +| main.go:106:3:106:8 | (SSA def(y)) | y | | main.go:112:29:112:35 | (SSA def(wrapper)) | wrapper | | main.go:112:29:112:35 | (SSA def(wrapper)).s | wrapper.s | -| main.go:113:2:113:2 | (SSA def(x)) | x | +| main.go:113:2:113:7 | (SSA def(x)) | x | | main.go:114:2:117:3 | (SSA def(x)) | x | | main.go:114:16:117:2 | (SSA def(x)) | x | -| main.go:115:3:115:3 | (SSA def(y)) | y | -| main.go:116:3:116:3 | (SSA def(x)) | x | -| main.go:130:3:130:3 | (SSA def(p)) | p | -| main.go:132:3:132:3 | (SSA def(p)) | p | +| main.go:115:3:115:12 | (SSA def(y)) | y | +| main.go:116:3:116:7 | (SSA def(x)) | x | +| main.go:130:3:130:24 | (SSA def(p)) | p | +| main.go:132:3:132:24 | (SSA def(p)) | p | | main.go:135:2:135:2 | (SSA phi(p)) | p | | main.go:135:2:135:2 | (SSA phi(p)).a | p.a | | main.go:135:2:135:2 | (SSA phi(p)).b | p.b | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarDefs.expected b/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarDefs.expected index 6149ddfbb54a..80297cd40b9e 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarDefs.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarDefs.expected @@ -1,54 +1,54 @@ -| main.go:13:6:13:6 | assignment to x | main.go:13:6:13:6 | x | main.go:13:6:13:6 | zero value for x | -| main.go:14:2:14:2 | assignment to y | main.go:14:2:14:2 | y | main.go:14:7:14:8 | 23 | -| main.go:17:3:17:3 | assignment to y | main.go:14:2:14:2 | y | main.go:17:3:17:9 | ... += ... | -| main.go:21:3:21:3 | assignment to x | main.go:13:6:13:6 | x | main.go:21:7:21:7 | y | -| main.go:26:10:26:10 | initialization of x | main.go:26:10:26:10 | x | main.go:26:10:26:10 | argument corresponding to x | -| main.go:27:2:27:2 | assignment to a | main.go:27:2:27:2 | a | main.go:27:10:27:10 | x | -| main.go:27:5:27:5 | assignment to b | main.go:27:5:27:5 | b | main.go:27:13:27:13 | 0 | -| main.go:29:3:29:3 | assignment to a | main.go:27:2:27:2 | a | main.go:29:10:29:10 | b | -| main.go:29:6:29:6 | assignment to b | main.go:27:5:27:5 | b | main.go:29:13:29:13 | a | -| main.go:34:11:34:11 | initialization of x | main.go:34:11:34:11 | x | main.go:34:11:34:11 | argument corresponding to x | -| main.go:39:2:39:2 | assignment to x | main.go:39:2:39:2 | x | main.go:39:7:39:8 | 23 | -| main.go:40:2:40:4 | assignment to ptr | main.go:40:2:40:4 | ptr | main.go:40:9:40:10 | &... | -| main.go:47:13:47:18 | initialization of result | main.go:47:13:47:18 | result | main.go:47:13:47:18 | zero value for result | -| main.go:48:2:48:7 | assignment to result | main.go:47:13:47:18 | result | main.go:48:11:48:12 | 42 | -| main.go:52:14:52:19 | initialization of result | main.go:52:14:52:19 | result | main.go:52:14:52:19 | zero value for result | -| main.go:57:6:57:6 | assignment to x | main.go:57:6:57:6 | x | main.go:57:6:57:6 | zero value for x | -| main.go:59:3:59:3 | assignment to x | main.go:57:6:57:6 | x | main.go:59:7:59:7 | 2 | -| main.go:63:2:63:2 | assignment to y | main.go:63:2:63:2 | y | main.go:63:7:63:7 | 1 | -| main.go:64:6:64:6 | assignment to i | main.go:64:6:64:6 | i | main.go:64:11:64:11 | 0 | -| main.go:64:16:64:18 | increment statement | main.go:64:6:64:6 | i | main.go:64:16:64:18 | rhs of increment statement | -| main.go:68:3:68:3 | assignment to y | main.go:63:2:63:2 | y | main.go:68:7:68:7 | 2 | -| main.go:72:2:72:2 | assignment to z | main.go:72:2:72:2 | z | main.go:72:7:72:7 | 1 | -| main.go:73:6:73:6 | assignment to i | main.go:73:6:73:6 | i | main.go:73:11:73:11 | 0 | -| main.go:73:16:73:18 | increment statement | main.go:73:6:73:6 | i | main.go:73:16:73:18 | rhs of increment statement | -| main.go:74:3:74:3 | assignment to z | main.go:72:2:72:2 | z | main.go:74:7:74:7 | 2 | -| main.go:82:18:82:18 | initialization of a | main.go:82:18:82:18 | a | main.go:82:18:82:18 | zero value for a | -| main.go:82:25:82:25 | initialization of b | main.go:82:25:82:25 | b | main.go:82:25:82:25 | zero value for b | -| main.go:83:2:83:2 | assignment to x | main.go:83:2:83:2 | x | main.go:83:7:83:8 | 23 | -| main.go:84:2:84:2 | assignment to x | main.go:83:2:83:2 | x | main.go:84:9:84:12 | ...+... | -| main.go:84:5:84:5 | assignment to a | main.go:82:18:82:18 | a | main.go:84:15:84:15 | x | -| main.go:93:15:93:16 | initialization of cb | main.go:93:15:93:16 | cb | main.go:93:15:93:16 | argument corresponding to cb | -| main.go:95:22:95:28 | initialization of wrapper | main.go:95:22:95:28 | wrapper | main.go:95:22:95:28 | argument corresponding to wrapper | -| main.go:96:2:96:2 | assignment to x | main.go:96:2:96:2 | x | main.go:96:7:96:7 | 0 | -| main.go:98:3:98:3 | assignment to x | main.go:96:2:96:2 | x | main.go:98:7:98:7 | 1 | -| main.go:103:20:103:26 | initialization of wrapper | main.go:103:20:103:26 | wrapper | main.go:103:20:103:26 | argument corresponding to wrapper | -| main.go:104:2:104:2 | assignment to x | main.go:104:2:104:2 | x | main.go:104:7:104:7 | 0 | -| main.go:106:3:106:3 | assignment to y | main.go:106:3:106:3 | y | main.go:106:8:106:8 | x | -| main.go:112:29:112:35 | initialization of wrapper | main.go:112:29:112:35 | wrapper | main.go:112:29:112:35 | argument corresponding to wrapper | -| main.go:113:2:113:2 | assignment to x | main.go:113:2:113:2 | x | main.go:113:7:113:7 | 0 | -| main.go:115:3:115:3 | assignment to y | main.go:115:3:115:3 | y | main.go:115:8:115:12 | ...+... | -| main.go:116:3:116:3 | assignment to x | main.go:113:2:113:2 | x | main.go:116:7:116:7 | y | -| main.go:128:6:128:6 | assignment to p | main.go:128:6:128:6 | p | main.go:128:6:128:6 | zero value for p | -| main.go:130:3:130:3 | assignment to p | main.go:128:6:128:6 | p | main.go:130:7:130:24 | struct literal | -| main.go:130:9:130:9 | init of 2 | main.go:122:2:122:2 | a | main.go:130:9:130:9 | 2 | -| main.go:130:12:130:18 | init of struct literal | main.go:123:2:123:2 | b | main.go:130:12:130:18 | struct literal | -| main.go:130:14:130:14 | init of 1 | main.go:89:2:89:2 | a | main.go:130:14:130:14 | 1 | -| main.go:130:17:130:17 | init of 5 | main.go:90:2:90:2 | b | main.go:130:17:130:17 | 5 | -| main.go:130:21:130:23 | init of 'n' | main.go:124:2:124:2 | c | main.go:130:21:130:23 | 'n' | -| main.go:132:3:132:3 | assignment to p | main.go:128:6:128:6 | p | main.go:132:7:132:24 | struct literal | -| main.go:132:9:132:9 | init of 3 | main.go:122:2:122:2 | a | main.go:132:9:132:9 | 3 | -| main.go:132:12:132:18 | init of struct literal | main.go:123:2:123:2 | b | main.go:132:12:132:18 | struct literal | -| main.go:132:14:132:14 | init of 4 | main.go:89:2:89:2 | a | main.go:132:14:132:14 | 4 | -| main.go:132:17:132:17 | init of 5 | main.go:90:2:90:2 | b | main.go:132:17:132:17 | 5 | -| main.go:132:21:132:23 | init of '2' | main.go:124:2:124:2 | c | main.go:132:21:132:23 | '2' | +| main.go:13:6:13:10 | assign:0 value declaration specifier | main.go:13:6:13:6 | x | main.go:13:6:13:10 | zero-init:0 value declaration specifier | +| main.go:14:2:14:8 | assign:0 ... := ... | main.go:14:2:14:2 | y | main.go:14:7:14:8 | 23 | +| main.go:17:3:17:9 | assign:0 ... += ... | main.go:14:2:14:2 | y | main.go:17:3:17:9 | compound-rhs ... += ... | +| main.go:21:3:21:7 | assign:0 ... = ... | main.go:13:6:13:6 | x | main.go:21:7:21:7 | y | +| main.go:26:10:26:10 | x | main.go:26:10:26:10 | x | main.go:26:10:26:10 | x | +| main.go:27:2:27:13 | assign:0 ... := ... | main.go:27:2:27:2 | a | main.go:27:10:27:10 | x | +| main.go:27:2:27:13 | assign:1 ... := ... | main.go:27:5:27:5 | b | main.go:27:13:27:13 | 0 | +| main.go:29:3:29:13 | assign:0 ... = ... | main.go:27:2:27:2 | a | main.go:29:10:29:10 | b | +| main.go:29:3:29:13 | assign:1 ... = ... | main.go:27:5:27:5 | b | main.go:29:13:29:13 | a | +| main.go:34:11:34:11 | x | main.go:34:11:34:11 | x | main.go:34:11:34:11 | x | +| main.go:39:2:39:8 | assign:0 ... := ... | main.go:39:2:39:2 | x | main.go:39:7:39:8 | 23 | +| main.go:40:2:40:10 | assign:0 ... := ... | main.go:40:2:40:4 | ptr | main.go:40:9:40:10 | &... | +| main.go:47:25:50:1 | result-init:0 block statement | main.go:47:13:47:18 | result | main.go:47:25:50:1 | result-zero-init:0 block statement | +| main.go:48:2:48:12 | assign:0 ... = ... | main.go:47:13:47:18 | result | main.go:48:11:48:12 | 42 | +| main.go:52:26:54:1 | result-init:0 block statement | main.go:52:14:52:19 | result | main.go:52:26:54:1 | result-zero-init:0 block statement | +| main.go:57:6:57:10 | assign:0 value declaration specifier | main.go:57:6:57:6 | x | main.go:57:6:57:10 | zero-init:0 value declaration specifier | +| main.go:59:3:59:7 | assign:0 ... = ... | main.go:57:6:57:6 | x | main.go:59:7:59:7 | 2 | +| main.go:63:2:63:7 | assign:0 ... := ... | main.go:63:2:63:2 | y | main.go:63:7:63:7 | 1 | +| main.go:64:6:64:11 | assign:0 ... := ... | main.go:64:6:64:6 | i | main.go:64:11:64:11 | 0 | +| main.go:64:16:64:18 | increment statement | main.go:64:6:64:6 | i | main.go:64:16:64:18 | incdec-rhs increment statement | +| main.go:68:3:68:7 | assign:0 ... = ... | main.go:63:2:63:2 | y | main.go:68:7:68:7 | 2 | +| main.go:72:2:72:7 | assign:0 ... := ... | main.go:72:2:72:2 | z | main.go:72:7:72:7 | 1 | +| main.go:73:6:73:11 | assign:0 ... := ... | main.go:73:6:73:6 | i | main.go:73:11:73:11 | 0 | +| main.go:73:16:73:18 | increment statement | main.go:73:6:73:6 | i | main.go:73:16:73:18 | incdec-rhs increment statement | +| main.go:74:3:74:7 | assign:0 ... = ... | main.go:72:2:72:2 | z | main.go:74:7:74:7 | 2 | +| main.go:82:36:86:1 | result-init:0 block statement | main.go:82:18:82:18 | a | main.go:82:36:86:1 | result-zero-init:0 block statement | +| main.go:82:36:86:1 | result-init:1 block statement | main.go:82:25:82:25 | b | main.go:82:36:86:1 | result-zero-init:1 block statement | +| main.go:83:2:83:8 | assign:0 ... := ... | main.go:83:2:83:2 | x | main.go:83:7:83:8 | 23 | +| main.go:84:2:84:15 | assign:0 ... = ... | main.go:83:2:83:2 | x | main.go:84:9:84:12 | ...+... | +| main.go:84:2:84:15 | assign:1 ... = ... | main.go:82:18:82:18 | a | main.go:84:15:84:15 | x | +| main.go:93:15:93:16 | cb | main.go:93:15:93:16 | cb | main.go:93:15:93:16 | cb | +| main.go:95:22:95:28 | wrapper | main.go:95:22:95:28 | wrapper | main.go:95:22:95:28 | wrapper | +| main.go:96:2:96:7 | assign:0 ... := ... | main.go:96:2:96:2 | x | main.go:96:7:96:7 | 0 | +| main.go:98:3:98:7 | assign:0 ... = ... | main.go:96:2:96:2 | x | main.go:98:7:98:7 | 1 | +| main.go:103:20:103:26 | wrapper | main.go:103:20:103:26 | wrapper | main.go:103:20:103:26 | wrapper | +| main.go:104:2:104:7 | assign:0 ... := ... | main.go:104:2:104:2 | x | main.go:104:7:104:7 | 0 | +| main.go:106:3:106:8 | assign:0 ... := ... | main.go:106:3:106:3 | y | main.go:106:8:106:8 | x | +| main.go:112:29:112:35 | wrapper | main.go:112:29:112:35 | wrapper | main.go:112:29:112:35 | wrapper | +| main.go:113:2:113:7 | assign:0 ... := ... | main.go:113:2:113:2 | x | main.go:113:7:113:7 | 0 | +| main.go:115:3:115:12 | assign:0 ... := ... | main.go:115:3:115:3 | y | main.go:115:8:115:12 | ...+... | +| main.go:116:3:116:7 | assign:0 ... = ... | main.go:113:2:113:2 | x | main.go:116:7:116:7 | y | +| main.go:128:6:128:8 | assign:0 value declaration specifier | main.go:128:6:128:6 | p | main.go:128:6:128:8 | zero-init:0 value declaration specifier | +| main.go:130:3:130:24 | assign:0 ... = ... | main.go:128:6:128:6 | p | main.go:130:7:130:24 | struct literal | +| main.go:130:9:130:9 | lit-init 2 | main.go:122:2:122:2 | a | main.go:130:9:130:9 | 2 | +| main.go:130:12:130:18 | lit-init struct literal | main.go:123:2:123:2 | b | main.go:130:12:130:18 | struct literal | +| main.go:130:14:130:14 | lit-init 1 | main.go:89:2:89:2 | a | main.go:130:14:130:14 | 1 | +| main.go:130:17:130:17 | lit-init 5 | main.go:90:2:90:2 | b | main.go:130:17:130:17 | 5 | +| main.go:130:21:130:23 | lit-init 'n' | main.go:124:2:124:2 | c | main.go:130:21:130:23 | 'n' | +| main.go:132:3:132:24 | assign:0 ... = ... | main.go:128:6:128:6 | p | main.go:132:7:132:24 | struct literal | +| main.go:132:9:132:9 | lit-init 3 | main.go:122:2:122:2 | a | main.go:132:9:132:9 | 3 | +| main.go:132:12:132:18 | lit-init struct literal | main.go:123:2:123:2 | b | main.go:132:12:132:18 | struct literal | +| main.go:132:14:132:14 | lit-init 4 | main.go:89:2:89:2 | a | main.go:132:14:132:14 | 4 | +| main.go:132:17:132:17 | lit-init 5 | main.go:90:2:90:2 | b | main.go:132:17:132:17 | 5 | +| main.go:132:21:132:23 | lit-init '2' | main.go:124:2:124:2 | c | main.go:132:21:132:23 | '2' | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarUses.expected b/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarUses.expected index 2e6b3c855c36..5a37307af191 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarUses.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarUses.expected @@ -15,15 +15,15 @@ | main.go:40:10:40:10 | x | main.go:39:2:39:2 | x | | main.go:42:8:42:10 | ptr | main.go:40:2:40:4 | ptr | | main.go:44:12:44:12 | x | main.go:39:2:39:2 | x | -| main.go:47:13:47:18 | implicit read of result | main.go:47:13:47:18 | result | -| main.go:52:14:52:19 | implicit read of result | main.go:52:14:52:19 | result | +| main.go:47:25:50:1 | result-read:0 block statement | main.go:47:13:47:18 | result | +| main.go:52:26:54:1 | result-read:0 block statement | main.go:52:14:52:19 | result | | main.go:61:12:61:12 | x | main.go:57:6:57:6 | x | | main.go:64:16:64:16 | i | main.go:64:6:64:6 | i | | main.go:70:12:70:12 | y | main.go:63:2:63:2 | y | | main.go:73:16:73:16 | i | main.go:73:6:73:6 | i | | main.go:79:12:79:12 | z | main.go:72:2:72:2 | z | -| main.go:82:18:82:18 | implicit read of a | main.go:82:18:82:18 | a | -| main.go:82:25:82:25 | implicit read of b | main.go:82:25:82:25 | b | +| main.go:82:36:86:1 | result-read:0 block statement | main.go:82:18:82:18 | a | +| main.go:82:36:86:1 | result-read:1 block statement | main.go:82:25:82:25 | b | | main.go:84:9:84:9 | x | main.go:83:2:83:2 | x | | main.go:84:15:84:15 | x | main.go:83:2:83:2 | x | | main.go:97:2:97:8 | wrapper | main.go:95:22:95:28 | wrapper | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ThreatModels/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/dataflow/ThreatModels/CONSISTENCY/DataFlowConsistency.expected index b1b3608ee058..0a79232575c2 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ThreatModels/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ThreatModels/CONSISTENCY/DataFlowConsistency.expected @@ -1,2 +1,2 @@ reverseRead -| test.go:32:11:32:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:32:11:32:11 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Afero/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/Afero/CONSISTENCY/DataFlowConsistency.expected index daba79d62f03..40a0dda55e33 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Afero/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Afero/CONSISTENCY/DataFlowConsistency.expected @@ -1,2 +1,2 @@ reverseRead -| test.go:19:14:19:20 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:19:14:19:20 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Beego/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/Beego/CONSISTENCY/DataFlowConsistency.expected index 42b10a988b50..fe63cabf552a 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Beego/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Beego/CONSISTENCY/DataFlowConsistency.expected @@ -1,16 +1,16 @@ reverseRead -| test.go:142:3:142:9 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:143:3:143:9 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:143:23:143:29 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:208:18:208:20 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:208:18:208:28 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:142:3:142:9 | implicit-deref context | Origin of readStep is missing a PostUpdateNode. | +| test.go:143:3:143:9 | implicit-deref context | Origin of readStep is missing a PostUpdateNode. | +| test.go:143:23:143:29 | implicit-deref context | Origin of readStep is missing a PostUpdateNode. | +| test.go:208:18:208:20 | implicit-deref ctx | Origin of readStep is missing a PostUpdateNode. | +| test.go:208:18:208:28 | implicit-deref selection of Request | Origin of readStep is missing a PostUpdateNode. | | test.go:229:21:229:25 | files | Origin of readStep is missing a PostUpdateNode. | -| test.go:259:2:259:2 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:270:37:270:37 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:259:2:259:2 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | +| test.go:270:37:270:37 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | | test.go:283:44:283:48 | files | Origin of readStep is missing a PostUpdateNode. | | test.go:297:51:297:62 | genericFiles | Origin of readStep is missing a PostUpdateNode. | | test.go:298:54:298:62 | untainted | Origin of readStep is missing a PostUpdateNode. | -| test.go:317:13:317:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:318:20:318:22 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:324:17:324:19 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:324:17:324:25 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:317:13:317:15 | implicit-deref ctx | Origin of readStep is missing a PostUpdateNode. | +| test.go:318:20:318:22 | implicit-deref ctx | Origin of readStep is missing a PostUpdateNode. | +| test.go:324:17:324:19 | implicit-deref ctx | Origin of readStep is missing a PostUpdateNode. | +| test.go:324:17:324:25 | implicit-deref selection of Input | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Beego/ReflectedXss.expected b/go/ql/test/library-tests/semmle/go/frameworks/Beego/ReflectedXss.expected index be8ae2ec2fa4..f88de8721b0b 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Beego/ReflectedXss.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Beego/ReflectedXss.expected @@ -24,9 +24,9 @@ | test.go:204:14:204:55 | type conversion | test.go:199:15:199:26 | call to Data | test.go:204:14:204:55 | type conversion | Cross-site scripting vulnerability due to $@. | test.go:199:15:199:26 | call to Data | user-provided value | test.go:0:0:0:0 | test.go | | | test.go:205:14:205:59 | type conversion | test.go:199:15:199:26 | call to Data | test.go:205:14:205:59 | type conversion | Cross-site scripting vulnerability due to $@. | test.go:199:15:199:26 | call to Data | user-provided value | test.go:0:0:0:0 | test.go | | | test.go:209:14:209:28 | type conversion | test.go:208:18:208:33 | selection of Form | test.go:209:14:209:28 | type conversion | Cross-site scripting vulnerability due to $@. | test.go:208:18:208:33 | selection of Form | user-provided value | test.go:0:0:0:0 | test.go | | -| test.go:224:14:224:32 | type conversion | test.go:223:2:223:34 | ... := ...[1] | test.go:224:14:224:32 | type conversion | Cross-site scripting vulnerability due to $@. | test.go:223:2:223:34 | ... := ...[1] | user-provided value | test.go:0:0:0:0 | test.go | | -| test.go:226:14:226:20 | content | test.go:223:2:223:34 | ... := ...[0] | test.go:226:14:226:20 | content | Cross-site scripting vulnerability due to $@. | test.go:223:2:223:34 | ... := ...[0] | user-provided value | test.go:0:0:0:0 | test.go | | -| test.go:229:14:229:38 | type conversion | test.go:228:2:228:40 | ... := ...[0] | test.go:229:14:229:38 | type conversion | Cross-site scripting vulnerability due to $@. | test.go:228:2:228:40 | ... := ...[0] | user-provided value | test.go:0:0:0:0 | test.go | | +| test.go:224:14:224:32 | type conversion | test.go:223:2:223:34 | extract:1 ... := ... | test.go:224:14:224:32 | type conversion | Cross-site scripting vulnerability due to $@. | test.go:223:2:223:34 | extract:1 ... := ... | user-provided value | test.go:0:0:0:0 | test.go | | +| test.go:226:14:226:20 | content | test.go:223:2:223:34 | extract:0 ... := ... | test.go:226:14:226:20 | content | Cross-site scripting vulnerability due to $@. | test.go:223:2:223:34 | extract:0 ... := ... | user-provided value | test.go:0:0:0:0 | test.go | | +| test.go:229:14:229:38 | type conversion | test.go:228:2:228:40 | extract:0 ... := ... | test.go:229:14:229:38 | type conversion | Cross-site scripting vulnerability due to $@. | test.go:228:2:228:40 | extract:0 ... := ... | user-provided value | test.go:0:0:0:0 | test.go | | | test.go:232:14:232:22 | type conversion | test.go:231:7:231:28 | call to GetString | test.go:232:14:232:22 | type conversion | Cross-site scripting vulnerability due to $@. | test.go:231:7:231:28 | call to GetString | user-provided value | test.go:0:0:0:0 | test.go | | | test.go:235:14:235:26 | type conversion | test.go:234:8:234:35 | call to GetStrings | test.go:235:14:235:26 | type conversion | Cross-site scripting vulnerability due to $@. | test.go:234:8:234:35 | call to GetStrings | user-provided value | test.go:0:0:0:0 | test.go | | | test.go:238:14:238:27 | type conversion | test.go:237:9:237:17 | call to Input | test.go:238:14:238:27 | type conversion | Cross-site scripting vulnerability due to $@. | test.go:237:9:237:17 | call to Input | user-provided value | test.go:0:0:0:0 | test.go | | @@ -36,20 +36,20 @@ | test.go:264:16:264:37 | call to GetCookie | test.go:264:16:264:37 | call to GetCookie | test.go:264:16:264:37 | call to GetCookie | Cross-site scripting vulnerability due to $@. | test.go:264:16:264:37 | call to GetCookie | user-provided value | test.go:0:0:0:0 | test.go | | | test.go:265:15:265:41 | call to GetCookie | test.go:265:15:265:41 | call to GetCookie | test.go:265:15:265:41 | call to GetCookie | Cross-site scripting vulnerability due to $@. | test.go:265:15:265:41 | call to GetCookie | user-provided value | test.go:0:0:0:0 | test.go | | | test.go:270:55:270:84 | type conversion | test.go:270:62:270:83 | call to GetCookie | test.go:270:55:270:84 | type conversion | Cross-site scripting vulnerability due to $@. | test.go:270:62:270:83 | call to GetCookie | user-provided value | test.go:0:0:0:0 | test.go | | -| test.go:283:21:283:61 | call to GetDisplayString | test.go:275:2:275:40 | ... := ...[0] | test.go:283:21:283:61 | call to GetDisplayString | Cross-site scripting vulnerability due to $@. | test.go:275:2:275:40 | ... := ...[0] | user-provided value | test.go:0:0:0:0 | test.go | | -| test.go:284:21:284:92 | selection of Filename | test.go:275:2:275:40 | ... := ...[0] | test.go:284:21:284:92 | selection of Filename | Cross-site scripting vulnerability due to $@. | test.go:275:2:275:40 | ... := ...[0] | user-provided value | test.go:0:0:0:0 | test.go | | -| test.go:285:21:285:96 | selection of Filename | test.go:275:2:275:40 | ... := ...[0] | test.go:285:21:285:96 | selection of Filename | Cross-site scripting vulnerability due to $@. | test.go:275:2:275:40 | ... := ...[0] | user-provided value | test.go:0:0:0:0 | test.go | | -| test.go:290:3:292:80 | selection of Filename | test.go:275:2:275:40 | ... := ...[0] | test.go:290:3:292:80 | selection of Filename | Cross-site scripting vulnerability due to $@. | test.go:275:2:275:40 | ... := ...[0] | user-provided value | test.go:0:0:0:0 | test.go | | -| test.go:293:21:293:101 | selection of Filename | test.go:275:2:275:40 | ... := ...[0] | test.go:293:21:293:101 | selection of Filename | Cross-site scripting vulnerability due to $@. | test.go:275:2:275:40 | ... := ...[0] | user-provided value | test.go:0:0:0:0 | test.go | | -| test.go:294:21:294:101 | selection of Filename | test.go:275:2:275:40 | ... := ...[0] | test.go:294:21:294:101 | selection of Filename | Cross-site scripting vulnerability due to $@. | test.go:275:2:275:40 | ... := ...[0] | user-provided value | test.go:0:0:0:0 | test.go | | -| test.go:295:21:295:97 | selection of Filename | test.go:275:2:275:40 | ... := ...[0] | test.go:295:21:295:97 | selection of Filename | Cross-site scripting vulnerability due to $@. | test.go:275:2:275:40 | ... := ...[0] | user-provided value | test.go:0:0:0:0 | test.go | | -| test.go:296:21:296:97 | selection of Filename | test.go:275:2:275:40 | ... := ...[0] | test.go:296:21:296:97 | selection of Filename | Cross-site scripting vulnerability due to $@. | test.go:275:2:275:40 | ... := ...[0] | user-provided value | test.go:0:0:0:0 | test.go | | -| test.go:297:21:297:102 | selection of Filename | test.go:275:2:275:40 | ... := ...[0] | test.go:297:21:297:102 | selection of Filename | Cross-site scripting vulnerability due to $@. | test.go:275:2:275:40 | ... := ...[0] | user-provided value | test.go:0:0:0:0 | test.go | | -| test.go:298:21:298:102 | selection of Filename | test.go:275:2:275:40 | ... := ...[0] | test.go:298:21:298:102 | selection of Filename | Cross-site scripting vulnerability due to $@. | test.go:275:2:275:40 | ... := ...[0] | user-provided value | test.go:0:0:0:0 | test.go | | -| test.go:299:21:299:82 | selection of Filename | test.go:275:2:275:40 | ... := ...[0] | test.go:299:21:299:82 | selection of Filename | Cross-site scripting vulnerability due to $@. | test.go:275:2:275:40 | ... := ...[0] | user-provided value | test.go:0:0:0:0 | test.go | | -| test.go:301:21:301:133 | selection of Filename | test.go:275:2:275:40 | ... := ...[0] | test.go:301:21:301:133 | selection of Filename | Cross-site scripting vulnerability due to $@. | test.go:275:2:275:40 | ... := ...[0] | user-provided value | test.go:0:0:0:0 | test.go | | -| test.go:302:21:302:88 | selection of Filename | test.go:275:2:275:40 | ... := ...[0] | test.go:302:21:302:88 | selection of Filename | Cross-site scripting vulnerability due to $@. | test.go:275:2:275:40 | ... := ...[0] | user-provided value | test.go:0:0:0:0 | test.go | | -| test.go:303:21:303:87 | selection of Filename | test.go:275:2:275:40 | ... := ...[0] | test.go:303:21:303:87 | selection of Filename | Cross-site scripting vulnerability due to $@. | test.go:275:2:275:40 | ... := ...[0] | user-provided value | test.go:0:0:0:0 | test.go | | +| test.go:283:21:283:61 | call to GetDisplayString | test.go:275:2:275:40 | extract:0 ... := ... | test.go:283:21:283:61 | call to GetDisplayString | Cross-site scripting vulnerability due to $@. | test.go:275:2:275:40 | extract:0 ... := ... | user-provided value | test.go:0:0:0:0 | test.go | | +| test.go:284:21:284:92 | selection of Filename | test.go:275:2:275:40 | extract:0 ... := ... | test.go:284:21:284:92 | selection of Filename | Cross-site scripting vulnerability due to $@. | test.go:275:2:275:40 | extract:0 ... := ... | user-provided value | test.go:0:0:0:0 | test.go | | +| test.go:285:21:285:96 | selection of Filename | test.go:275:2:275:40 | extract:0 ... := ... | test.go:285:21:285:96 | selection of Filename | Cross-site scripting vulnerability due to $@. | test.go:275:2:275:40 | extract:0 ... := ... | user-provided value | test.go:0:0:0:0 | test.go | | +| test.go:290:3:292:80 | selection of Filename | test.go:275:2:275:40 | extract:0 ... := ... | test.go:290:3:292:80 | selection of Filename | Cross-site scripting vulnerability due to $@. | test.go:275:2:275:40 | extract:0 ... := ... | user-provided value | test.go:0:0:0:0 | test.go | | +| test.go:293:21:293:101 | selection of Filename | test.go:275:2:275:40 | extract:0 ... := ... | test.go:293:21:293:101 | selection of Filename | Cross-site scripting vulnerability due to $@. | test.go:275:2:275:40 | extract:0 ... := ... | user-provided value | test.go:0:0:0:0 | test.go | | +| test.go:294:21:294:101 | selection of Filename | test.go:275:2:275:40 | extract:0 ... := ... | test.go:294:21:294:101 | selection of Filename | Cross-site scripting vulnerability due to $@. | test.go:275:2:275:40 | extract:0 ... := ... | user-provided value | test.go:0:0:0:0 | test.go | | +| test.go:295:21:295:97 | selection of Filename | test.go:275:2:275:40 | extract:0 ... := ... | test.go:295:21:295:97 | selection of Filename | Cross-site scripting vulnerability due to $@. | test.go:275:2:275:40 | extract:0 ... := ... | user-provided value | test.go:0:0:0:0 | test.go | | +| test.go:296:21:296:97 | selection of Filename | test.go:275:2:275:40 | extract:0 ... := ... | test.go:296:21:296:97 | selection of Filename | Cross-site scripting vulnerability due to $@. | test.go:275:2:275:40 | extract:0 ... := ... | user-provided value | test.go:0:0:0:0 | test.go | | +| test.go:297:21:297:102 | selection of Filename | test.go:275:2:275:40 | extract:0 ... := ... | test.go:297:21:297:102 | selection of Filename | Cross-site scripting vulnerability due to $@. | test.go:275:2:275:40 | extract:0 ... := ... | user-provided value | test.go:0:0:0:0 | test.go | | +| test.go:298:21:298:102 | selection of Filename | test.go:275:2:275:40 | extract:0 ... := ... | test.go:298:21:298:102 | selection of Filename | Cross-site scripting vulnerability due to $@. | test.go:275:2:275:40 | extract:0 ... := ... | user-provided value | test.go:0:0:0:0 | test.go | | +| test.go:299:21:299:82 | selection of Filename | test.go:275:2:275:40 | extract:0 ... := ... | test.go:299:21:299:82 | selection of Filename | Cross-site scripting vulnerability due to $@. | test.go:275:2:275:40 | extract:0 ... := ... | user-provided value | test.go:0:0:0:0 | test.go | | +| test.go:301:21:301:133 | selection of Filename | test.go:275:2:275:40 | extract:0 ... := ... | test.go:301:21:301:133 | selection of Filename | Cross-site scripting vulnerability due to $@. | test.go:275:2:275:40 | extract:0 ... := ... | user-provided value | test.go:0:0:0:0 | test.go | | +| test.go:302:21:302:88 | selection of Filename | test.go:275:2:275:40 | extract:0 ... := ... | test.go:302:21:302:88 | selection of Filename | Cross-site scripting vulnerability due to $@. | test.go:275:2:275:40 | extract:0 ... := ... | user-provided value | test.go:0:0:0:0 | test.go | | +| test.go:303:21:303:87 | selection of Filename | test.go:275:2:275:40 | extract:0 ... := ... | test.go:303:21:303:87 | selection of Filename | Cross-site scripting vulnerability due to $@. | test.go:275:2:275:40 | extract:0 ... := ... | user-provided value | test.go:0:0:0:0 | test.go | | | test.go:311:21:311:48 | type assertion | test.go:309:15:309:36 | call to GetString | test.go:311:21:311:48 | type assertion | Cross-site scripting vulnerability due to $@. | test.go:309:15:309:36 | call to GetString | user-provided value | test.go:0:0:0:0 | test.go | | | test.go:312:21:312:52 | type assertion | test.go:309:15:309:36 | call to GetString | test.go:312:21:312:52 | type assertion | Cross-site scripting vulnerability due to $@. | test.go:309:15:309:36 | call to GetString | user-provided value | test.go:0:0:0:0 | test.go | | edges @@ -81,19 +81,19 @@ edges | test.go:200:36:200:53 | type assertion | test.go:200:21:200:54 | call to HTML2str | provenance | MaD:35 | | test.go:201:21:201:57 | call to Htmlunquote | test.go:201:14:201:58 | type conversion | provenance | | | test.go:201:39:201:56 | type assertion | test.go:201:21:201:57 | call to Htmlunquote | provenance | MaD:36 | -| test.go:202:2:202:68 | ... := ...[0] | test.go:203:14:203:28 | type assertion | provenance | | -| test.go:202:28:202:56 | type assertion | test.go:202:2:202:68 | ... := ...[0] | provenance | MaD:37 | +| test.go:202:2:202:68 | extract:0 ... := ... | test.go:203:14:203:28 | type assertion | provenance | | +| test.go:202:28:202:56 | type assertion | test.go:202:2:202:68 | extract:0 ... := ... | provenance | MaD:37 | | test.go:204:21:204:54 | call to Str2html | test.go:204:14:204:55 | type conversion | provenance | | | test.go:204:36:204:53 | type assertion | test.go:204:21:204:54 | call to Str2html | provenance | MaD:39 | | test.go:205:21:205:58 | call to Substr | test.go:205:14:205:59 | type conversion | provenance | | | test.go:205:34:205:51 | type assertion | test.go:205:21:205:58 | call to Substr | provenance | MaD:40 | | test.go:208:18:208:33 | selection of Form | test.go:208:36:208:36 | s [postupdate] | provenance | Src:MaD:21 MaD:38 | | test.go:208:36:208:36 | s [postupdate] | test.go:209:14:209:28 | type conversion | provenance | | -| test.go:223:2:223:34 | ... := ...[0] | test.go:225:31:225:31 | f | provenance | Src:MaD:15 | -| test.go:223:2:223:34 | ... := ...[1] | test.go:224:14:224:32 | type conversion | provenance | Src:MaD:15 | -| test.go:225:2:225:32 | ... := ...[0] | test.go:226:14:226:20 | content | provenance | | -| test.go:225:31:225:31 | f | test.go:225:2:225:32 | ... := ...[0] | provenance | MaD:41 | -| test.go:228:2:228:40 | ... := ...[0] | test.go:229:14:229:38 | type conversion | provenance | Src:MaD:16 | +| test.go:223:2:223:34 | extract:0 ... := ... | test.go:225:31:225:31 | f | provenance | Src:MaD:15 | +| test.go:223:2:223:34 | extract:1 ... := ... | test.go:224:14:224:32 | type conversion | provenance | Src:MaD:15 | +| test.go:225:2:225:32 | extract:0 ... := ... | test.go:226:14:226:20 | content | provenance | | +| test.go:225:31:225:31 | f | test.go:225:2:225:32 | extract:0 ... := ... | provenance | MaD:41 | +| test.go:228:2:228:40 | extract:0 ... := ... | test.go:229:14:229:38 | type conversion | provenance | Src:MaD:16 | | test.go:231:7:231:28 | call to GetString | test.go:232:14:232:22 | type conversion | provenance | Src:MaD:17 | | test.go:234:8:234:35 | call to GetStrings | test.go:235:14:235:26 | type conversion | provenance | Src:MaD:18 | | test.go:237:9:237:17 | call to Input | test.go:238:14:238:27 | type conversion | provenance | Src:MaD:19 | @@ -101,21 +101,21 @@ edges | test.go:246:15:246:36 | call to GetString | test.go:249:21:249:29 | untrusted | provenance | Src:MaD:17 | | test.go:259:23:259:44 | call to GetCookie | test.go:259:16:259:45 | type conversion | provenance | Src:MaD:14 | | test.go:270:62:270:83 | call to GetCookie | test.go:270:55:270:84 | type conversion | provenance | Src:MaD:14 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:278:21:278:28 | index expression | provenance | Src:MaD:16 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:283:44:283:60 | selection of Filename | provenance | Src:MaD:16 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:284:38:284:49 | genericFiles | provenance | Src:MaD:16 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:285:37:285:48 | genericFiles | provenance | Src:MaD:16 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:291:4:291:15 | genericFiles | provenance | Src:MaD:16 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:293:42:293:53 | genericFiles | provenance | Src:MaD:16 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:294:53:294:64 | genericFiles | provenance | Src:MaD:16 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:295:38:295:49 | genericFiles | provenance | Src:MaD:16 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:296:49:296:60 | genericFiles | provenance | Src:MaD:16 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:297:51:297:65 | index expression | provenance | Src:MaD:16 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:298:36:298:47 | genericFiles | provenance | Src:MaD:16 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:299:37:299:48 | genericFiles | provenance | Src:MaD:16 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:301:39:301:50 | genericFiles | provenance | Src:MaD:16 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:302:40:302:51 | genericFiles | provenance | Src:MaD:16 | -| test.go:275:2:275:40 | ... := ...[0] | test.go:303:39:303:50 | genericFiles | provenance | Src:MaD:16 | +| test.go:275:2:275:40 | extract:0 ... := ... | test.go:278:21:278:28 | index expression | provenance | Src:MaD:16 | +| test.go:275:2:275:40 | extract:0 ... := ... | test.go:283:44:283:60 | selection of Filename | provenance | Src:MaD:16 | +| test.go:275:2:275:40 | extract:0 ... := ... | test.go:284:38:284:49 | genericFiles | provenance | Src:MaD:16 | +| test.go:275:2:275:40 | extract:0 ... := ... | test.go:285:37:285:48 | genericFiles | provenance | Src:MaD:16 | +| test.go:275:2:275:40 | extract:0 ... := ... | test.go:291:4:291:15 | genericFiles | provenance | Src:MaD:16 | +| test.go:275:2:275:40 | extract:0 ... := ... | test.go:293:42:293:53 | genericFiles | provenance | Src:MaD:16 | +| test.go:275:2:275:40 | extract:0 ... := ... | test.go:294:53:294:64 | genericFiles | provenance | Src:MaD:16 | +| test.go:275:2:275:40 | extract:0 ... := ... | test.go:295:38:295:49 | genericFiles | provenance | Src:MaD:16 | +| test.go:275:2:275:40 | extract:0 ... := ... | test.go:296:49:296:60 | genericFiles | provenance | Src:MaD:16 | +| test.go:275:2:275:40 | extract:0 ... := ... | test.go:297:51:297:65 | index expression | provenance | Src:MaD:16 | +| test.go:275:2:275:40 | extract:0 ... := ... | test.go:298:36:298:47 | genericFiles | provenance | Src:MaD:16 | +| test.go:275:2:275:40 | extract:0 ... := ... | test.go:299:37:299:48 | genericFiles | provenance | Src:MaD:16 | +| test.go:275:2:275:40 | extract:0 ... := ... | test.go:301:39:301:50 | genericFiles | provenance | Src:MaD:16 | +| test.go:275:2:275:40 | extract:0 ... := ... | test.go:302:40:302:51 | genericFiles | provenance | Src:MaD:16 | +| test.go:275:2:275:40 | extract:0 ... := ... | test.go:303:39:303:50 | genericFiles | provenance | Src:MaD:16 | | test.go:278:3:278:14 | genericFiles [postupdate] [array] | test.go:297:51:297:62 | genericFiles [array] | provenance | | | test.go:278:21:278:28 | index expression | test.go:278:3:278:14 | genericFiles [postupdate] [array] | provenance | | | test.go:283:44:283:60 | selection of Filename | test.go:283:21:283:61 | call to GetDisplayString | provenance | FunctionModel | @@ -240,7 +240,7 @@ nodes | test.go:201:14:201:58 | type conversion | semmle.label | type conversion | | test.go:201:21:201:57 | call to Htmlunquote | semmle.label | call to Htmlunquote | | test.go:201:39:201:56 | type assertion | semmle.label | type assertion | -| test.go:202:2:202:68 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:202:2:202:68 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:202:28:202:56 | type assertion | semmle.label | type assertion | | test.go:203:14:203:28 | type assertion | semmle.label | type assertion | | test.go:204:14:204:55 | type conversion | semmle.label | type conversion | @@ -252,13 +252,13 @@ nodes | test.go:208:18:208:33 | selection of Form | semmle.label | selection of Form | | test.go:208:36:208:36 | s [postupdate] | semmle.label | s [postupdate] | | test.go:209:14:209:28 | type conversion | semmle.label | type conversion | -| test.go:223:2:223:34 | ... := ...[0] | semmle.label | ... := ...[0] | -| test.go:223:2:223:34 | ... := ...[1] | semmle.label | ... := ...[1] | +| test.go:223:2:223:34 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | +| test.go:223:2:223:34 | extract:1 ... := ... | semmle.label | extract:1 ... := ... | | test.go:224:14:224:32 | type conversion | semmle.label | type conversion | -| test.go:225:2:225:32 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:225:2:225:32 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:225:31:225:31 | f | semmle.label | f | | test.go:226:14:226:20 | content | semmle.label | content | -| test.go:228:2:228:40 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:228:2:228:40 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:229:14:229:38 | type conversion | semmle.label | type conversion | | test.go:231:7:231:28 | call to GetString | semmle.label | call to GetString | | test.go:232:14:232:22 | type conversion | semmle.label | type conversion | @@ -276,7 +276,7 @@ nodes | test.go:265:15:265:41 | call to GetCookie | semmle.label | call to GetCookie | | test.go:270:55:270:84 | type conversion | semmle.label | type conversion | | test.go:270:62:270:83 | call to GetCookie | semmle.label | call to GetCookie | -| test.go:275:2:275:40 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:275:2:275:40 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:278:3:278:14 | genericFiles [postupdate] [array] | semmle.label | genericFiles [postupdate] [array] | | test.go:278:21:278:28 | index expression | semmle.label | index expression | | test.go:283:21:283:61 | call to GetDisplayString | semmle.label | call to GetDisplayString | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Chi/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/Chi/CONSISTENCY/DataFlowConsistency.expected index e87bbb9cdee9..4bd409e41d29 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Chi/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Chi/CONSISTENCY/DataFlowConsistency.expected @@ -1,2 +1,2 @@ reverseRead -| test.go:13:12:13:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:13:12:13:12 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Echo/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/Echo/CONSISTENCY/DataFlowConsistency.expected index 1765ea137674..01ec84e742c6 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Echo/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Echo/CONSISTENCY/DataFlowConsistency.expected @@ -1,4 +1,4 @@ reverseRead | test.go:89:16:89:22 | cookies | Origin of readStep is missing a PostUpdateNode. | -| test.go:193:10:193:22 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:193:10:193:22 | implicit-deref call to Request | Origin of readStep is missing a PostUpdateNode. | | test.go:216:20:216:26 | cookies | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Echo/ReflectedXss.expected b/go/ql/test/library-tests/semmle/go/frameworks/Echo/ReflectedXss.expected index 4e885d284d48..c13bbc39ec8a 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Echo/ReflectedXss.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Echo/ReflectedXss.expected @@ -5,11 +5,11 @@ | test.go:34:16:34:20 | param | test.go:33:11:33:27 | call to QueryParams | test.go:34:16:34:20 | param | Cross-site scripting vulnerability due to $@. | test.go:33:11:33:27 | call to QueryParams | user-provided value | test.go:0:0:0:0 | test.go | | | test.go:40:16:40:19 | qstr | test.go:39:10:39:26 | call to QueryString | test.go:40:16:40:19 | qstr | Cross-site scripting vulnerability due to $@. | test.go:39:10:39:26 | call to QueryString | user-provided value | test.go:0:0:0:0 | test.go | | | test.go:46:16:46:18 | val | test.go:45:9:45:34 | call to FormValue | test.go:46:16:46:18 | val | Cross-site scripting vulnerability due to $@. | test.go:45:9:45:34 | call to FormValue | user-provided value | test.go:0:0:0:0 | test.go | | -| test.go:52:16:52:37 | index expression | test.go:51:2:51:30 | ... := ...[0] | test.go:52:16:52:37 | index expression | Cross-site scripting vulnerability due to $@. | test.go:51:2:51:30 | ... := ...[0] | user-provided value | test.go:0:0:0:0 | test.go | | -| test.go:61:20:61:25 | buffer | test.go:57:2:57:46 | ... := ...[0] | test.go:61:20:61:25 | buffer | Cross-site scripting vulnerability due to $@. | test.go:57:2:57:46 | ... := ...[0] | user-provided value | test.go:0:0:0:0 | test.go | | -| test.go:67:16:67:41 | index expression | test.go:66:2:66:31 | ... := ...[0] | test.go:67:16:67:41 | index expression | Cross-site scripting vulnerability due to $@. | test.go:66:2:66:31 | ... := ...[0] | user-provided value | test.go:0:0:0:0 | test.go | | -| test.go:77:20:77:25 | buffer | test.go:72:2:72:31 | ... := ...[0] | test.go:77:20:77:25 | buffer | Cross-site scripting vulnerability due to $@. | test.go:72:2:72:31 | ... := ...[0] | user-provided value | test.go:0:0:0:0 | test.go | | -| test.go:83:16:83:24 | selection of Value | test.go:82:2:82:32 | ... := ...[0] | test.go:83:16:83:24 | selection of Value | Cross-site scripting vulnerability due to $@. | test.go:82:2:82:32 | ... := ...[0] | user-provided value | test.go:0:0:0:0 | test.go | | +| test.go:52:16:52:37 | index expression | test.go:51:2:51:30 | extract:0 ... := ... | test.go:52:16:52:37 | index expression | Cross-site scripting vulnerability due to $@. | test.go:51:2:51:30 | extract:0 ... := ... | user-provided value | test.go:0:0:0:0 | test.go | | +| test.go:61:20:61:25 | buffer | test.go:57:2:57:46 | extract:0 ... := ... | test.go:61:20:61:25 | buffer | Cross-site scripting vulnerability due to $@. | test.go:57:2:57:46 | extract:0 ... := ... | user-provided value | test.go:0:0:0:0 | test.go | | +| test.go:67:16:67:41 | index expression | test.go:66:2:66:31 | extract:0 ... := ... | test.go:67:16:67:41 | index expression | Cross-site scripting vulnerability due to $@. | test.go:66:2:66:31 | extract:0 ... := ... | user-provided value | test.go:0:0:0:0 | test.go | | +| test.go:77:20:77:25 | buffer | test.go:72:2:72:31 | extract:0 ... := ... | test.go:77:20:77:25 | buffer | Cross-site scripting vulnerability due to $@. | test.go:72:2:72:31 | extract:0 ... := ... | user-provided value | test.go:0:0:0:0 | test.go | | +| test.go:83:16:83:24 | selection of Value | test.go:82:2:82:32 | extract:0 ... := ... | test.go:83:16:83:24 | selection of Value | Cross-site scripting vulnerability due to $@. | test.go:82:2:82:32 | extract:0 ... := ... | user-provided value | test.go:0:0:0:0 | test.go | | | test.go:89:16:89:31 | selection of Value | test.go:88:13:88:25 | call to Cookies | test.go:89:16:89:31 | selection of Value | Cross-site scripting vulnerability due to $@. | test.go:88:13:88:25 | call to Cookies | user-provided value | test.go:0:0:0:0 | test.go | | | test.go:100:16:100:21 | selection of s | test.go:99:11:99:15 | &... [postupdate] | test.go:100:16:100:21 | selection of s | Cross-site scripting vulnerability due to $@. | test.go:99:11:99:15 | &... [postupdate] | user-provided value | test.go:0:0:0:0 | test.go | | | test.go:114:16:114:42 | type assertion | test.go:113:21:113:42 | call to Param | test.go:114:16:114:42 | type assertion | Cross-site scripting vulnerability due to $@. | test.go:113:21:113:42 | call to Param | user-provided value | test.go:0:0:0:0 | test.go | | @@ -25,23 +25,23 @@ edges | test.go:33:11:33:27 | call to QueryParams | test.go:34:16:34:20 | param | provenance | Src:MaD:11 | | test.go:39:10:39:26 | call to QueryString | test.go:40:16:40:19 | qstr | provenance | Src:MaD:12 | | test.go:45:9:45:34 | call to FormValue | test.go:46:16:46:18 | val | provenance | Src:MaD:6 | -| test.go:51:2:51:30 | ... := ...[0] | test.go:52:16:52:37 | index expression | provenance | Src:MaD:5 | -| test.go:57:2:57:46 | ... := ...[0] | test.go:58:13:58:22 | fileHeader | provenance | Src:MaD:4 | -| test.go:58:2:58:29 | ... := ...[0] | test.go:60:2:60:5 | file | provenance | | -| test.go:58:13:58:22 | fileHeader | test.go:58:2:58:29 | ... := ...[0] | provenance | MaD:17 | +| test.go:51:2:51:30 | extract:0 ... := ... | test.go:52:16:52:37 | index expression | provenance | Src:MaD:5 | +| test.go:57:2:57:46 | extract:0 ... := ... | test.go:58:13:58:22 | fileHeader | provenance | Src:MaD:4 | +| test.go:58:2:58:29 | extract:0 ... := ... | test.go:60:2:60:5 | file | provenance | | +| test.go:58:13:58:22 | fileHeader | test.go:58:2:58:29 | extract:0 ... := ... | provenance | MaD:17 | | test.go:60:2:60:5 | file | test.go:60:12:60:17 | buffer [postupdate] | provenance | MaD:15 | | test.go:60:2:60:5 | file | test.go:60:12:60:17 | buffer [postupdate] | provenance | MaD:16 | | test.go:60:2:60:5 | file | test.go:60:12:60:17 | buffer [postupdate] | provenance | MaD:18 | | test.go:60:12:60:17 | buffer [postupdate] | test.go:61:20:61:25 | buffer | provenance | | -| test.go:66:2:66:31 | ... := ...[0] | test.go:67:16:67:41 | index expression | provenance | Src:MaD:7 | -| test.go:72:2:72:31 | ... := ...[0] | test.go:74:13:74:22 | fileHeader | provenance | Src:MaD:7 | -| test.go:74:2:74:29 | ... := ...[0] | test.go:76:2:76:5 | file | provenance | | -| test.go:74:13:74:22 | fileHeader | test.go:74:2:74:29 | ... := ...[0] | provenance | MaD:17 | +| test.go:66:2:66:31 | extract:0 ... := ... | test.go:67:16:67:41 | index expression | provenance | Src:MaD:7 | +| test.go:72:2:72:31 | extract:0 ... := ... | test.go:74:13:74:22 | fileHeader | provenance | Src:MaD:7 | +| test.go:74:2:74:29 | extract:0 ... := ... | test.go:76:2:76:5 | file | provenance | | +| test.go:74:13:74:22 | fileHeader | test.go:74:2:74:29 | extract:0 ... := ... | provenance | MaD:17 | | test.go:76:2:76:5 | file | test.go:76:12:76:17 | buffer [postupdate] | provenance | MaD:15 | | test.go:76:2:76:5 | file | test.go:76:12:76:17 | buffer [postupdate] | provenance | MaD:16 | | test.go:76:2:76:5 | file | test.go:76:12:76:17 | buffer [postupdate] | provenance | MaD:18 | | test.go:76:12:76:17 | buffer [postupdate] | test.go:77:20:77:25 | buffer | provenance | | -| test.go:82:2:82:32 | ... := ...[0] | test.go:83:16:83:24 | selection of Value | provenance | Src:MaD:2 | +| test.go:82:2:82:32 | extract:0 ... := ... | test.go:83:16:83:24 | selection of Value | provenance | Src:MaD:2 | | test.go:88:13:88:25 | call to Cookies | test.go:89:16:89:31 | selection of Value | provenance | Src:MaD:3 | | test.go:99:11:99:15 | &... [postupdate] | test.go:100:16:100:21 | selection of s | provenance | Src:MaD:1 | | test.go:113:2:113:4 | ctx [postupdate] | test.go:114:16:114:18 | ctx | provenance | | @@ -88,23 +88,23 @@ nodes | test.go:40:16:40:19 | qstr | semmle.label | qstr | | test.go:45:9:45:34 | call to FormValue | semmle.label | call to FormValue | | test.go:46:16:46:18 | val | semmle.label | val | -| test.go:51:2:51:30 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:51:2:51:30 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:52:16:52:37 | index expression | semmle.label | index expression | -| test.go:57:2:57:46 | ... := ...[0] | semmle.label | ... := ...[0] | -| test.go:58:2:58:29 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:57:2:57:46 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | +| test.go:58:2:58:29 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:58:13:58:22 | fileHeader | semmle.label | fileHeader | | test.go:60:2:60:5 | file | semmle.label | file | | test.go:60:12:60:17 | buffer [postupdate] | semmle.label | buffer [postupdate] | | test.go:61:20:61:25 | buffer | semmle.label | buffer | -| test.go:66:2:66:31 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:66:2:66:31 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:67:16:67:41 | index expression | semmle.label | index expression | -| test.go:72:2:72:31 | ... := ...[0] | semmle.label | ... := ...[0] | -| test.go:74:2:74:29 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:72:2:72:31 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | +| test.go:74:2:74:29 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:74:13:74:22 | fileHeader | semmle.label | fileHeader | | test.go:76:2:76:5 | file | semmle.label | file | | test.go:76:12:76:17 | buffer [postupdate] | semmle.label | buffer [postupdate] | | test.go:77:20:77:25 | buffer | semmle.label | buffer | -| test.go:82:2:82:32 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:82:2:82:32 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:83:16:83:24 | selection of Value | semmle.label | selection of Value | | test.go:88:13:88:25 | call to Cookies | semmle.label | call to Cookies | | test.go:89:16:89:31 | selection of Value | semmle.label | selection of Value | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/CONSISTENCY/DataFlowConsistency.expected index b57f285e1425..ce16ef565303 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/CONSISTENCY/DataFlowConsistency.expected @@ -1,22 +1,22 @@ reverseRead | fasthttp.go:75:28:75:35 | lbclient | Origin of readStep is missing a PostUpdateNode. | -| fasthttp.go:102:7:102:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| fasthttp.go:162:3:162:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| fasthttp.go:163:3:163:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| fasthttp.go:164:3:164:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| fasthttp.go:165:15:165:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| fasthttp.go:166:15:166:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| fasthttp.go:167:15:167:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| fasthttp.go:168:15:168:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| fasthttp.go:170:3:170:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| fasthttp.go:172:3:172:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| fasthttp.go:173:3:173:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| fasthttp.go:174:3:174:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| fasthttp.go:175:3:175:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| fasthttp.go:183:3:183:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| fasthttp.go:184:3:184:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| fasthttp.go:185:16:185:25 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| fasthttp.go:194:3:194:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| fasthttp.go:195:3:195:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| fasthttp.go:196:3:196:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| fasthttp.go:197:3:197:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:102:7:102:16 | implicit-deref requestCtx | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:162:3:162:12 | implicit-deref requestCtx | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:163:3:163:12 | implicit-deref requestCtx | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:164:3:164:12 | implicit-deref requestCtx | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:165:15:165:24 | implicit-deref requestCtx | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:166:15:166:24 | implicit-deref requestCtx | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:167:15:167:24 | implicit-deref requestCtx | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:168:15:168:24 | implicit-deref requestCtx | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:170:3:170:12 | implicit-deref requestCtx | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:172:3:172:12 | implicit-deref requestCtx | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:173:3:173:12 | implicit-deref requestCtx | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:174:3:174:12 | implicit-deref requestCtx | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:175:3:175:12 | implicit-deref requestCtx | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:183:3:183:12 | implicit-deref requestCtx | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:184:3:184:12 | implicit-deref requestCtx | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:185:16:185:25 | implicit-deref requestCtx | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:194:3:194:12 | implicit-deref requestCtx | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:195:3:195:12 | implicit-deref requestCtx | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:196:3:196:12 | implicit-deref requestCtx | Origin of readStep is missing a PostUpdateNode. | +| fasthttp.go:197:3:197:12 | implicit-deref requestCtx | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/RemoteFlowSources.expected b/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/RemoteFlowSources.expected index e69de29bb2d1..3ff8fb45938f 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/RemoteFlowSources.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/RemoteFlowSources.expected @@ -0,0 +1,8 @@ +| fasthttp.go:165:3:165:45 | extract:0 ... := ... | Unexpected result: RemoteFlowSource="extract:0 ... := ..." | +| fasthttp.go:165:53:165:89 | comment | Missing result: RemoteFlowSource="... := ...[0]" | +| fasthttp.go:166:3:166:46 | extract:0 ... := ... | Unexpected result: RemoteFlowSource="extract:0 ... := ..." | +| fasthttp.go:166:53:166:89 | comment | Missing result: RemoteFlowSource="... := ...[0]" | +| fasthttp.go:167:3:167:47 | extract:0 ... := ... | Unexpected result: RemoteFlowSource="extract:0 ... := ..." | +| fasthttp.go:167:53:167:89 | comment | Missing result: RemoteFlowSource="... := ...[0]" | +| fasthttp.go:168:3:168:51 | extract:0 ... := ... | Unexpected result: RemoteFlowSource="extract:0 ... := ..." | +| fasthttp.go:168:53:168:89 | comment | Missing result: RemoteFlowSource="... := ...[0]" | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Gin/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/Gin/CONSISTENCY/DataFlowConsistency.expected index d430ebd33f51..a3358c49ec11 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Gin/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Gin/CONSISTENCY/DataFlowConsistency.expected @@ -1,5 +1,5 @@ reverseRead -| Gin.go:26:18:26:18 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Gin.go:26:28:26:28 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Gin.go:158:10:158:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Gin.go:162:13:162:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Gin.go:26:18:26:18 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | +| Gin.go:26:28:26:28 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | +| Gin.go:158:10:158:12 | implicit-deref ctx | Origin of readStep is missing a PostUpdateNode. | +| Gin.go:162:13:162:15 | implicit-deref ctx | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Gin/Gin.expected b/go/ql/test/library-tests/semmle/go/frameworks/Gin/Gin.expected index 071bf34cd7e0..46239a3c3394 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Gin/Gin.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Gin/Gin.expected @@ -7,18 +7,18 @@ | Gin.go:58:10:58:25 | call to Param | | Gin.go:62:10:62:34 | call to GetStringSlice | | Gin.go:66:10:66:29 | call to GetString | -| Gin.go:70:3:70:28 | ... := ...[0] | +| Gin.go:70:3:70:28 | extract:0 ... := ... | | Gin.go:74:10:74:23 | call to ClientIP | | Gin.go:78:10:78:26 | call to ContentType | -| Gin.go:82:3:82:29 | ... := ...[0] | -| Gin.go:86:3:86:36 | ... := ...[0] | -| Gin.go:90:3:90:31 | ... := ...[0] | -| Gin.go:94:3:94:39 | ... := ...[0] | -| Gin.go:98:3:98:34 | ... := ...[0] | +| Gin.go:82:3:82:29 | extract:0 ... := ... | +| Gin.go:86:3:86:36 | extract:0 ... := ... | +| Gin.go:90:3:90:31 | extract:0 ... := ... | +| Gin.go:94:3:94:39 | extract:0 ... := ... | +| Gin.go:98:3:98:34 | extract:0 ... := ... | | Gin.go:102:10:102:52 | call to DefaultPostForm | | Gin.go:106:10:106:49 | call to DefaultQuery | -| Gin.go:110:3:110:37 | ... := ...[0] | -| Gin.go:114:3:114:34 | ... := ...[0] | +| Gin.go:110:3:110:37 | extract:0 ... := ... | +| Gin.go:114:3:114:34 | extract:0 ... := ... | | Gin.go:118:10:118:32 | call to GetStringMap | | Gin.go:122:10:122:38 | call to GetStringMapString | | Gin.go:126:10:126:43 | call to GetStringMapStringSlice | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/GoMicro/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/GoMicro/CONSISTENCY/DataFlowConsistency.expected index 0bbe91ae77ed..d3172f5635cb 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/GoMicro/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/GoMicro/CONSISTENCY/DataFlowConsistency.expected @@ -3,12 +3,12 @@ reverseRead | proto/Hello.pb.go:47:9:47:39 | file_proto_Hello_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | | proto/Hello.pb.go:81:10:81:40 | file_proto_Hello_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | | proto/Hello.pb.go:94:9:94:39 | file_proto_Hello_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | -| proto/Hello.pb.go:169:13:169:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| proto/Hello.pb.go:171:13:171:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| proto/Hello.pb.go:173:13:173:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| proto/Hello.pb.go:181:13:181:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| proto/Hello.pb.go:183:13:183:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| proto/Hello.pb.go:185:13:185:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| proto/Hello.pb.micro.go:55:9:55:9 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| proto/Hello.pb.micro.go:57:9:57:9 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| proto/Hello.pb.micro.go:86:9:86:9 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| proto/Hello.pb.go:169:13:169:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| proto/Hello.pb.go:171:13:171:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| proto/Hello.pb.go:173:13:173:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| proto/Hello.pb.go:181:13:181:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| proto/Hello.pb.go:183:13:183:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| proto/Hello.pb.go:185:13:185:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| proto/Hello.pb.micro.go:55:9:55:9 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | +| proto/Hello.pb.micro.go:57:9:57:9 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | +| proto/Hello.pb.micro.go:86:9:86:9 | implicit-deref h | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Gorestful/gorestful.expected b/go/ql/test/library-tests/semmle/go/frameworks/Gorestful/gorestful.expected index 0af67462f7c2..b17e65d31ec7 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Gorestful/gorestful.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Gorestful/gorestful.expected @@ -6,18 +6,18 @@ models | 5 | Source: github.com/emicklei/go-restful; Request; true; ReadEntity; ; ; Argument[0]; remote; manual | edges | gorestful.go:15:15:15:44 | call to QueryParameters | gorestful.go:15:15:15:47 | index expression | provenance | Src:MaD:4 Sink:MaD:1 | -| gorestful.go:17:2:17:39 | ... := ...[0] | gorestful.go:18:15:18:17 | val | provenance | Src:MaD:2 Sink:MaD:1 | +| gorestful.go:17:2:17:39 | extract:0 ... := ... | gorestful.go:18:15:18:17 | val | provenance | Src:MaD:2 Sink:MaD:1 | | gorestful.go:21:15:21:38 | call to PathParameters | gorestful.go:21:15:21:45 | index expression | provenance | Src:MaD:3 Sink:MaD:1 | | gorestful.go:23:21:23:24 | &... [postupdate] | gorestful.go:24:15:24:21 | selection of cmd | provenance | Src:MaD:5 Sink:MaD:1 | | gorestful_v2.go:15:15:15:44 | call to QueryParameters | gorestful_v2.go:15:15:15:47 | index expression | provenance | Src:MaD:4 Sink:MaD:1 | -| gorestful_v2.go:17:2:17:39 | ... := ...[0] | gorestful_v2.go:18:15:18:17 | val | provenance | Src:MaD:2 Sink:MaD:1 | +| gorestful_v2.go:17:2:17:39 | extract:0 ... := ... | gorestful_v2.go:18:15:18:17 | val | provenance | Src:MaD:2 Sink:MaD:1 | | gorestful_v2.go:21:15:21:38 | call to PathParameters | gorestful_v2.go:21:15:21:45 | index expression | provenance | Src:MaD:3 Sink:MaD:1 | | gorestful_v2.go:23:21:23:24 | &... [postupdate] | gorestful_v2.go:24:15:24:21 | selection of cmd | provenance | Src:MaD:5 Sink:MaD:1 | nodes | gorestful.go:15:15:15:44 | call to QueryParameters | semmle.label | call to QueryParameters | | gorestful.go:15:15:15:47 | index expression | semmle.label | index expression | | gorestful.go:16:15:16:43 | call to QueryParameter | semmle.label | call to QueryParameter | -| gorestful.go:17:2:17:39 | ... := ...[0] | semmle.label | ... := ...[0] | +| gorestful.go:17:2:17:39 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | gorestful.go:18:15:18:17 | val | semmle.label | val | | gorestful.go:19:15:19:44 | call to HeaderParameter | semmle.label | call to HeaderParameter | | gorestful.go:20:15:20:42 | call to PathParameter | semmle.label | call to PathParameter | @@ -28,7 +28,7 @@ nodes | gorestful_v2.go:15:15:15:44 | call to QueryParameters | semmle.label | call to QueryParameters | | gorestful_v2.go:15:15:15:47 | index expression | semmle.label | index expression | | gorestful_v2.go:16:15:16:43 | call to QueryParameter | semmle.label | call to QueryParameter | -| gorestful_v2.go:17:2:17:39 | ... := ...[0] | semmle.label | ... := ...[0] | +| gorestful_v2.go:17:2:17:39 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | gorestful_v2.go:18:15:18:17 | val | semmle.label | val | | gorestful_v2.go:19:15:19:44 | call to HeaderParameter | semmle.label | call to HeaderParameter | | gorestful_v2.go:20:15:20:42 | call to PathParameter | semmle.label | call to PathParameter | @@ -41,14 +41,14 @@ invalidModelRow #select | gorestful.go:15:15:15:47 | index expression | gorestful.go:15:15:15:44 | call to QueryParameters | gorestful.go:15:15:15:47 | index expression | This command depends on $@. | gorestful.go:15:15:15:44 | call to QueryParameters | a user-provided value | | gorestful.go:16:15:16:43 | call to QueryParameter | gorestful.go:16:15:16:43 | call to QueryParameter | gorestful.go:16:15:16:43 | call to QueryParameter | This command depends on $@. | gorestful.go:16:15:16:43 | call to QueryParameter | a user-provided value | -| gorestful.go:18:15:18:17 | val | gorestful.go:17:2:17:39 | ... := ...[0] | gorestful.go:18:15:18:17 | val | This command depends on $@. | gorestful.go:17:2:17:39 | ... := ...[0] | a user-provided value | +| gorestful.go:18:15:18:17 | val | gorestful.go:17:2:17:39 | extract:0 ... := ... | gorestful.go:18:15:18:17 | val | This command depends on $@. | gorestful.go:17:2:17:39 | extract:0 ... := ... | a user-provided value | | gorestful.go:19:15:19:44 | call to HeaderParameter | gorestful.go:19:15:19:44 | call to HeaderParameter | gorestful.go:19:15:19:44 | call to HeaderParameter | This command depends on $@. | gorestful.go:19:15:19:44 | call to HeaderParameter | a user-provided value | | gorestful.go:20:15:20:42 | call to PathParameter | gorestful.go:20:15:20:42 | call to PathParameter | gorestful.go:20:15:20:42 | call to PathParameter | This command depends on $@. | gorestful.go:20:15:20:42 | call to PathParameter | a user-provided value | | gorestful.go:21:15:21:45 | index expression | gorestful.go:21:15:21:38 | call to PathParameters | gorestful.go:21:15:21:45 | index expression | This command depends on $@. | gorestful.go:21:15:21:38 | call to PathParameters | a user-provided value | | gorestful.go:24:15:24:21 | selection of cmd | gorestful.go:23:21:23:24 | &... [postupdate] | gorestful.go:24:15:24:21 | selection of cmd | This command depends on $@. | gorestful.go:23:21:23:24 | &... [postupdate] | a user-provided value | | gorestful_v2.go:15:15:15:47 | index expression | gorestful_v2.go:15:15:15:44 | call to QueryParameters | gorestful_v2.go:15:15:15:47 | index expression | This command depends on $@. | gorestful_v2.go:15:15:15:44 | call to QueryParameters | a user-provided value | | gorestful_v2.go:16:15:16:43 | call to QueryParameter | gorestful_v2.go:16:15:16:43 | call to QueryParameter | gorestful_v2.go:16:15:16:43 | call to QueryParameter | This command depends on $@. | gorestful_v2.go:16:15:16:43 | call to QueryParameter | a user-provided value | -| gorestful_v2.go:18:15:18:17 | val | gorestful_v2.go:17:2:17:39 | ... := ...[0] | gorestful_v2.go:18:15:18:17 | val | This command depends on $@. | gorestful_v2.go:17:2:17:39 | ... := ...[0] | a user-provided value | +| gorestful_v2.go:18:15:18:17 | val | gorestful_v2.go:17:2:17:39 | extract:0 ... := ... | gorestful_v2.go:18:15:18:17 | val | This command depends on $@. | gorestful_v2.go:17:2:17:39 | extract:0 ... := ... | a user-provided value | | gorestful_v2.go:19:15:19:44 | call to HeaderParameter | gorestful_v2.go:19:15:19:44 | call to HeaderParameter | gorestful_v2.go:19:15:19:44 | call to HeaderParameter | This command depends on $@. | gorestful_v2.go:19:15:19:44 | call to HeaderParameter | a user-provided value | | gorestful_v2.go:20:15:20:42 | call to PathParameter | gorestful_v2.go:20:15:20:42 | call to PathParameter | gorestful_v2.go:20:15:20:42 | call to PathParameter | This command depends on $@. | gorestful_v2.go:20:15:20:42 | call to PathParameter | a user-provided value | | gorestful_v2.go:21:15:21:45 | index expression | gorestful_v2.go:21:15:21:38 | call to PathParameters | gorestful_v2.go:21:15:21:45 | index expression | This command depends on $@. | gorestful_v2.go:21:15:21:38 | call to PathParameters | a user-provided value | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Protobuf/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/Protobuf/CONSISTENCY/DataFlowConsistency.expected index b69ab06bee15..91e28a8114e8 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Protobuf/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Protobuf/CONSISTENCY/DataFlowConsistency.expected @@ -7,26 +7,26 @@ reverseRead | protos/query/query.pb.go:169:9:169:33 | file_query_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | | protos/query/query.pb.go:204:10:204:34 | file_query_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | | protos/query/query.pb.go:217:9:217:33 | file_query_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | -| protos/query/query.pb.go:318:13:318:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| protos/query/query.pb.go:320:13:320:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| protos/query/query.pb.go:322:13:322:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| protos/query/query.pb.go:330:13:330:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| protos/query/query.pb.go:332:13:332:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| protos/query/query.pb.go:334:13:334:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| protos/query/query.pb.go:342:13:342:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| protos/query/query.pb.go:344:13:344:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| protos/query/query.pb.go:346:13:346:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| testDeprecatedApi.go:74:24:74:28 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| testDeprecatedApi.go:85:24:85:28 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:318:13:318:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:320:13:320:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:322:13:322:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:330:13:330:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:332:13:332:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:334:13:334:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:342:13:342:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:344:13:344:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:346:13:346:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| testDeprecatedApi.go:74:24:74:28 | implicit-deref query | Origin of readStep is missing a PostUpdateNode. | +| testDeprecatedApi.go:85:24:85:28 | implicit-deref query | Origin of readStep is missing a PostUpdateNode. | | testDeprecatedApi.go:98:13:98:24 | selection of Alerts | Origin of readStep is missing a PostUpdateNode. | -| testDeprecatedApi.go:124:12:124:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| testDeprecatedApi.go:167:12:167:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| testDeprecatedApi.go:124:12:124:16 | implicit-deref query | Origin of readStep is missing a PostUpdateNode. | +| testDeprecatedApi.go:167:12:167:16 | implicit-deref query | Origin of readStep is missing a PostUpdateNode. | | testDeprecatedApi.go:176:24:176:28 | query | Origin of readStep is missing a PostUpdateNode. | | testModernApi.go:94:12:94:21 | serialized | Origin of readStep is missing a PostUpdateNode. | -| testModernApi.go:102:24:102:28 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| testModernApi.go:113:24:113:28 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| testModernApi.go:102:24:102:28 | implicit-deref query | Origin of readStep is missing a PostUpdateNode. | +| testModernApi.go:113:24:113:28 | implicit-deref query | Origin of readStep is missing a PostUpdateNode. | | testModernApi.go:126:13:126:24 | selection of Alerts | Origin of readStep is missing a PostUpdateNode. | -| testModernApi.go:162:12:162:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| testModernApi.go:162:12:162:16 | implicit-deref query | Origin of readStep is missing a PostUpdateNode. | | testModernApi.go:186:12:186:21 | serialized | Origin of readStep is missing a PostUpdateNode. | -| testModernApi.go:224:12:224:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| testModernApi.go:224:12:224:16 | implicit-deref query | Origin of readStep is missing a PostUpdateNode. | | testModernApi.go:233:24:233:28 | query | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Revel/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/Revel/CONSISTENCY/DataFlowConsistency.expected index 999379f92981..c6c4611752d8 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Revel/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Revel/CONSISTENCY/DataFlowConsistency.expected @@ -1,114 +1,114 @@ reverseRead -| EndToEnd.go:31:35:31:35 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| EndToEnd.go:31:35:31:42 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| EndToEnd.go:37:18:37:18 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| EndToEnd.go:37:18:37:25 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| EndToEnd.go:45:18:45:18 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| EndToEnd.go:45:18:45:25 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| EndToEnd.go:52:20:52:20 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| EndToEnd.go:52:20:52:27 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| EndToEnd.go:59:18:59:18 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| EndToEnd.go:59:18:59:25 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| EndToEnd.go:65:26:65:26 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| EndToEnd.go:65:26:65:33 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| EndToEnd.go:70:22:70:22 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| EndToEnd.go:70:22:70:29 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| EndToEnd.go:75:22:75:22 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| EndToEnd.go:75:22:75:29 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| EndToEnd.go:80:35:80:35 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| EndToEnd.go:80:35:80:42 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| EndToEnd.go:85:22:85:22 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| EndToEnd.go:85:22:85:29 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| EndToEnd.go:90:21:90:21 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| EndToEnd.go:90:21:90:28 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| EndToEnd.go:95:20:95:20 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| EndToEnd.go:95:20:95:27 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:26:7:26:7 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:27:7:27:7 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:27:7:27:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:30:2:30:2 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:33:7:33:7 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:37:7:37:7 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:37:7:37:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:38:24:38:24 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:42:7:42:7 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:43:24:43:24 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:47:7:47:7 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:51:7:51:7 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:52:7:52:7 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:56:7:56:7 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:31:35:31:42 | implicit-deref selection of Params | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:31:35:31:42 | implicit-field:1 selection of Params | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:37:18:37:25 | implicit-deref selection of Params | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:37:18:37:25 | implicit-field:1 selection of Params | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:45:18:45:25 | implicit-deref selection of Params | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:45:18:45:25 | implicit-field:1 selection of Params | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:52:20:52:27 | implicit-deref selection of Params | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:52:20:52:27 | implicit-field:1 selection of Params | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:59:18:59:25 | implicit-deref selection of Params | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:59:18:59:25 | implicit-field:1 selection of Params | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:65:26:65:33 | implicit-deref selection of Params | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:65:26:65:33 | implicit-field:1 selection of Params | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:70:22:70:29 | implicit-deref selection of Params | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:70:22:70:29 | implicit-field:1 selection of Params | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:75:22:75:29 | implicit-deref selection of Params | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:75:22:75:29 | implicit-field:1 selection of Params | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:80:35:80:42 | implicit-deref selection of Params | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:80:35:80:42 | implicit-field:1 selection of Params | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:85:22:85:29 | implicit-deref selection of Params | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:85:22:85:29 | implicit-field:1 selection of Params | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:90:21:90:28 | implicit-deref selection of Params | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:90:21:90:28 | implicit-field:1 selection of Params | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:95:20:95:27 | implicit-deref selection of Params | Origin of readStep is missing a PostUpdateNode. | +| EndToEnd.go:95:20:95:27 | implicit-field:1 selection of Params | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:26:7:26:14 | implicit-field:1 selection of Params | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:27:7:27:14 | implicit-deref selection of Params | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:27:7:27:14 | implicit-field:1 selection of Params | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:30:2:30:9 | implicit-field:1 selection of Params | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:33:7:33:15 | implicit-field:1 selection of Request | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:37:7:37:14 | implicit-deref selection of Params | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:37:7:37:14 | implicit-field:1 selection of Params | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:38:24:38:32 | implicit-field:1 selection of Request | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:42:7:42:14 | implicit-field:1 selection of Params | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:43:24:43:32 | implicit-field:1 selection of Request | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:47:7:47:14 | implicit-field:1 selection of Params | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:51:7:51:14 | implicit-field:1 selection of Params | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:52:7:52:15 | implicit-field:1 selection of Request | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:56:7:56:14 | implicit-field:1 selection of Params | Origin of readStep is missing a PostUpdateNode. | | Revel.go:56:7:56:27 | index expression | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:60:7:60:7 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:60:7:60:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:63:2:63:2 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:70:22:70:22 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:75:7:75:7 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:76:7:76:7 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:77:7:77:7 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:77:7:77:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:78:7:78:7 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:79:7:79:7 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:80:7:80:7 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:82:13:82:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:85:13:85:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:88:13:88:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:60:7:60:14 | implicit-deref selection of Params | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:60:7:60:14 | implicit-field:1 selection of Params | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:63:2:63:9 | implicit-field:1 selection of Params | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:70:22:70:29 | implicit-field:1 selection of Params | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:75:7:75:7 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:76:7:76:7 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:77:7:77:7 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:77:7:77:15 | implicit-deref selection of Request | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:78:7:78:7 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:79:7:79:7 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:80:7:80:7 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:82:13:82:13 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:85:13:85:13 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:88:13:88:13 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | | Revel.go:89:7:89:28 | index expression | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:91:7:91:7 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:91:7:91:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:91:7:91:7 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:91:7:91:15 | implicit-deref selection of Request | Origin of readStep is missing a PostUpdateNode. | | Revel.go:91:7:91:41 | index expression | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:93:28:93:28 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:96:15:96:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:99:7:99:7 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:101:7:101:7 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:103:15:103:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:109:7:109:7 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:111:7:111:7 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:116:2:116:2 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:116:2:116:10 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:120:2:120:2 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:120:2:120:10 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:125:13:125:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:125:13:125:21 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:128:14:128:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:128:14:128:22 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| Revel.go:133:13:133:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/controllers/app.go:34:2:34:2 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/controllers/app.go:47:2:47:2 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/controllers/app.go:56:2:56:2 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/controllers/app.go:57:2:57:2 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/controllers/app.go:59:16:59:16 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/controllers/app.go:61:5:61:5 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/controllers/app.go:62:3:62:3 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/controllers/app.go:68:2:68:2 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/controllers/app.go:79:5:79:5 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/controllers/app.go:81:5:81:5 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/controllers/app.go:83:4:83:4 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/controllers/app.go:89:2:89:2 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/controllers/app.go:95:10:95:10 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/controllers/hotels.go:44:3:44:3 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/controllers/hotels.go:51:2:51:2 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/controllers/hotels.go:143:26:143:26 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/controllers/hotels.go:144:2:144:2 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/controllers/hotels.go:146:2:146:2 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/controllers/hotels.go:148:5:148:5 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/controllers/hotels.go:149:3:149:3 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/controllers/hotels.go:153:2:153:2 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/controllers/hotels.go:166:19:166:19 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/controllers/hotels.go:168:5:168:5 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/controllers/hotels.go:168:33:168:33 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/controllers/hotels.go:169:3:169:3 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/controllers/hotels.go:174:5:174:5 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/controllers/hotels.go:175:3:175:3 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:93:28:93:28 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:96:15:96:15 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:99:7:99:7 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:101:7:101:7 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:103:15:103:15 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:109:7:109:7 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:111:7:111:7 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:116:2:116:2 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:116:2:116:10 | implicit-deref selection of Request | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:120:2:120:2 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:120:2:120:10 | implicit-deref selection of Request | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:125:13:125:13 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:125:13:125:21 | implicit-deref selection of Request | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:128:14:128:14 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:128:14:128:22 | implicit-deref selection of Request | Origin of readStep is missing a PostUpdateNode. | +| Revel.go:133:13:133:13 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/app.go:34:2:34:10 | implicit-field:1 selection of Session | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/app.go:47:2:47:8 | implicit-field:1 selection of Flash | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/app.go:56:2:56:13 | implicit-field:1 selection of Validation | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/app.go:57:2:57:13 | implicit-field:1 selection of Validation | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/app.go:59:16:59:27 | implicit-field:1 selection of Validation | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/app.go:61:5:61:16 | implicit-field:1 selection of Validation | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/app.go:62:3:62:14 | implicit-field:1 selection of Validation | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/app.go:68:2:68:8 | implicit-field:1 selection of Flash | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/app.go:79:5:79:13 | implicit-field:1 selection of Session | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/app.go:81:5:81:13 | implicit-field:1 selection of Session | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/app.go:83:4:83:10 | implicit-field:1 selection of Flash | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/app.go:89:2:89:8 | implicit-field:1 selection of Flash | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/app.go:95:10:95:18 | implicit-field:1 selection of Session | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/hotels.go:44:3:44:9 | implicit-field:1 selection of Flash | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/hotels.go:51:2:51:6 | implicit-field:1 selection of Log | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/hotels.go:143:26:143:37 | implicit-field:1 selection of Validation | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/hotels.go:144:2:144:13 | implicit-field:1 selection of Validation | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/hotels.go:146:2:146:13 | implicit-field:1 selection of Validation | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/hotels.go:148:5:148:16 | implicit-field:1 selection of Validation | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/hotels.go:149:3:149:14 | implicit-field:1 selection of Validation | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/hotels.go:153:2:153:8 | implicit-field:1 selection of Flash | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/hotels.go:166:19:166:30 | implicit-field:1 selection of Validation | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/hotels.go:168:5:168:16 | implicit-field:1 selection of Validation | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/hotels.go:168:33:168:40 | implicit-field:1 selection of Params | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/hotels.go:169:3:169:14 | implicit-field:1 selection of Validation | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/hotels.go:174:5:174:12 | implicit-field:1 selection of Params | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/hotels.go:175:3:175:9 | implicit-field:1 selection of Flash | Origin of readStep is missing a PostUpdateNode. | | examples/booking/app/controllers/hotels.go:176:4:176:10 | booking | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/controllers/hotels.go:184:2:184:2 | implicit read of field Controller | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/init.go:36:44:36:44 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/init.go:40:49:40:49 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/init.go:52:2:52:2 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/init.go:52:2:52:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/init.go:53:2:53:2 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/init.go:53:2:53:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/init.go:54:2:54:2 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/init.go:54:2:54:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/controllers/hotels.go:184:2:184:8 | implicit-field:1 selection of Flash | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/init.go:36:44:36:44 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/init.go:40:49:40:49 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/init.go:52:2:52:2 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/init.go:52:2:52:11 | implicit-deref selection of Response | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/init.go:53:2:53:2 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/init.go:53:2:53:11 | implicit-deref selection of Response | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/init.go:54:2:54:2 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/init.go:54:2:54:11 | implicit-deref selection of Response | Origin of readStep is missing a PostUpdateNode. | | examples/booking/app/models/booking.go:33:13:33:19 | booking | Origin of readStep is missing a PostUpdateNode. | | examples/booking/app/models/booking.go:34:13:34:19 | booking | Origin of readStep is missing a PostUpdateNode. | | examples/booking/app/models/booking.go:35:13:35:19 | booking | Origin of readStep is missing a PostUpdateNode. | @@ -121,7 +121,7 @@ reverseRead | examples/booking/app/models/booking.go:69:3:69:3 | b | Origin of readStep is missing a PostUpdateNode. | | examples/booking/app/models/booking.go:73:39:73:39 | b | Origin of readStep is missing a PostUpdateNode. | | examples/booking/app/models/booking.go:73:47:73:47 | b | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/models/booking.go:81:13:81:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/models/booking.go:82:14:82:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/models/booking.go:83:17:83:17 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| examples/booking/app/models/booking.go:84:18:84:18 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/models/booking.go:81:13:81:13 | implicit-deref b | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/models/booking.go:82:14:82:14 | implicit-deref b | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/models/booking.go:83:17:83:17 | implicit-deref b | Origin of readStep is missing a PostUpdateNode. | +| examples/booking/app/models/booking.go:84:18:84:18 | implicit-deref b | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Revel/OpenRedirect.expected b/go/ql/test/library-tests/semmle/go/frameworks/Revel/OpenRedirect.expected index 3c889cd177cb..5868cd8c3e7b 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Revel/OpenRedirect.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Revel/OpenRedirect.expected @@ -1,17 +1,17 @@ #select | EndToEnd.go:95:20:95:49 | call to Get | EndToEnd.go:95:20:95:27 | selection of Params | EndToEnd.go:95:20:95:49 | call to Get | This path to an untrusted URL redirection depends on a $@. | EndToEnd.go:95:20:95:27 | selection of Params | user-provided value | edges -| EndToEnd.go:95:20:95:27 | implicit dereference | EndToEnd.go:95:20:95:27 | selection of Params [postupdate] | provenance | Config | -| EndToEnd.go:95:20:95:27 | implicit dereference | EndToEnd.go:95:20:95:32 | selection of Form | provenance | Config | -| EndToEnd.go:95:20:95:27 | selection of Params | EndToEnd.go:95:20:95:27 | implicit dereference | provenance | Src:MaD:2 Config | +| EndToEnd.go:95:20:95:27 | implicit-deref selection of Params | EndToEnd.go:95:20:95:27 | selection of Params [postupdate] | provenance | Config | +| EndToEnd.go:95:20:95:27 | implicit-deref selection of Params | EndToEnd.go:95:20:95:32 | selection of Form | provenance | Config | +| EndToEnd.go:95:20:95:27 | selection of Params | EndToEnd.go:95:20:95:27 | implicit-deref selection of Params | provenance | Src:MaD:2 Config | | EndToEnd.go:95:20:95:27 | selection of Params | EndToEnd.go:95:20:95:32 | selection of Form | provenance | Src:MaD:2 Config | -| EndToEnd.go:95:20:95:27 | selection of Params [postupdate] | EndToEnd.go:95:20:95:27 | implicit dereference | provenance | Config | +| EndToEnd.go:95:20:95:27 | selection of Params [postupdate] | EndToEnd.go:95:20:95:27 | implicit-deref selection of Params | provenance | Config | | EndToEnd.go:95:20:95:32 | selection of Form | EndToEnd.go:95:20:95:49 | call to Get | provenance | Config Sink:MaD:1 | models | 1 | Sink: group:revel; Controller; true; Redirect; ; ; Argument[0]; url-redirection; manual | | 2 | Source: group:revel; Controller; true; Params; ; ; ; remote; manual | nodes -| EndToEnd.go:95:20:95:27 | implicit dereference | semmle.label | implicit dereference | +| EndToEnd.go:95:20:95:27 | implicit-deref selection of Params | semmle.label | implicit-deref selection of Params | | EndToEnd.go:95:20:95:27 | selection of Params | semmle.label | selection of Params | | EndToEnd.go:95:20:95:27 | selection of Params [postupdate] | semmle.label | selection of Params [postupdate] | | EndToEnd.go:95:20:95:32 | selection of Form | semmle.label | selection of Form | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Revel/Revel.go b/go/ql/test/library-tests/semmle/go/frameworks/Revel/Revel.go index 219e1dddb4c9..c1a2cc72d9e2 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Revel/Revel.go +++ b/go/ql/test/library-tests/semmle/go/frameworks/Revel/Revel.go @@ -64,7 +64,7 @@ func (c myAppController) accessingParamsJSONIsUnsafe() { sink(val2["name"].(string)) } -func (c myAppController) rawRead() { // $ responsebody='argument corresponding to c' +func (c myAppController) rawRead() { // $ responsebody='c' c.ViewArgs["Foo"] = "

    raw HTML

    " // $ responsebody='"

    raw HTML

    "' c.ViewArgs["Bar"] = "

    not raw HTML

    " c.ViewArgs["Foo"] = c.Params.Query // $ responsebody='selection of Query' Alert[go/reflected-xss] diff --git a/go/ql/test/library-tests/semmle/go/frameworks/SystemCommandExecutors/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/SystemCommandExecutors/CONSISTENCY/DataFlowConsistency.expected index c7680b2b6ca1..22b7e84f85e2 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/SystemCommandExecutors/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/SystemCommandExecutors/CONSISTENCY/DataFlowConsistency.expected @@ -1,2 +1,2 @@ reverseRead -| SystemCommandExecutors.go:25:12:25:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| SystemCommandExecutors.go:25:12:25:14 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/TaintSteps/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/TaintSteps/CONSISTENCY/DataFlowConsistency.expected index f07ffbe60cfe..716050b1f160 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/TaintSteps/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/TaintSteps/CONSISTENCY/DataFlowConsistency.expected @@ -1,3 +1,3 @@ reverseRead -| main.go:28:2:28:4 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| main.go:34:2:34:4 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| main.go:28:2:28:4 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| main.go:34:2:34:4 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/TaintSteps/TaintStep.expected b/go/ql/test/library-tests/semmle/go/frameworks/TaintSteps/TaintStep.expected index cfbbc771f777..98381fa1ed1c 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/TaintSteps/TaintStep.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/TaintSteps/TaintStep.expected @@ -1,12 +1,12 @@ invalidModelRow #select -| crypto.go:9:14:9:31 | call to NewCipher | crypto.go:9:2:9:31 | ... := ...[0] | -| crypto.go:9:14:9:31 | call to NewCipher | crypto.go:9:2:9:31 | ... := ...[1] | -| crypto.go:10:15:10:34 | call to NewGCM | crypto.go:10:2:10:34 | ... := ...[0] | -| crypto.go:10:15:10:34 | call to NewGCM | crypto.go:10:2:10:34 | ... := ...[1] | -| crypto.go:11:18:11:57 | call to Open | crypto.go:11:2:11:57 | ... := ...[0] | -| crypto.go:11:18:11:57 | call to Open | crypto.go:11:2:11:57 | ... := ...[1] | -| crypto.go:11:42:11:51 | ciphertext | crypto.go:11:2:11:57 | ... := ...[0] | +| crypto.go:9:14:9:31 | call to NewCipher | crypto.go:9:2:9:31 | extract:0 ... := ... | +| crypto.go:9:14:9:31 | call to NewCipher | crypto.go:9:2:9:31 | extract:1 ... := ... | +| crypto.go:10:15:10:34 | call to NewGCM | crypto.go:10:2:10:34 | extract:0 ... := ... | +| crypto.go:10:15:10:34 | call to NewGCM | crypto.go:10:2:10:34 | extract:1 ... := ... | +| crypto.go:11:18:11:57 | call to Open | crypto.go:11:2:11:57 | extract:0 ... := ... | +| crypto.go:11:18:11:57 | call to Open | crypto.go:11:2:11:57 | extract:1 ... := ... | +| crypto.go:11:42:11:51 | ciphertext | crypto.go:11:2:11:57 | extract:0 ... := ... | | io.go:14:31:14:43 | "some string" | io.go:14:13:14:44 | call to NewReader | | io.go:16:23:16:27 | &... | io.go:16:24:16:27 | buf1 [postupdate] | | io.go:16:23:16:27 | &... [postupdate] | io.go:16:24:16:27 | buf1 [postupdate] | @@ -31,9 +31,9 @@ invalidModelRow | io.go:33:20:33:23 | buf1 | io.go:33:19:33:23 | &... | | io.go:33:20:33:23 | buf1 [postupdate] | io.go:33:19:33:23 | &... | | io.go:35:16:35:21 | reader | io.go:35:12:35:13 | w2 [postupdate] | -| io.go:39:11:39:19 | call to Pipe | io.go:39:3:39:19 | ... := ...[0] | -| io.go:39:11:39:19 | call to Pipe | io.go:39:3:39:19 | ... := ...[1] | -| io.go:40:14:40:14 | w [postupdate] | io.go:39:3:39:19 | ... := ...[0] | +| io.go:39:11:39:19 | call to Pipe | io.go:39:3:39:19 | extract:0 ... := ... | +| io.go:39:11:39:19 | call to Pipe | io.go:39:3:39:19 | extract:1 ... := ... | +| io.go:40:14:40:14 | w [postupdate] | io.go:39:3:39:19 | extract:0 ... := ... | | io.go:40:17:40:31 | "some string\\n" | io.go:40:14:40:14 | w [postupdate] | | io.go:43:16:43:16 | r | io.go:43:3:43:5 | buf [postupdate] | | io.go:44:13:44:15 | buf | io.go:44:13:44:24 | call to String | @@ -74,35 +74,35 @@ invalidModelRow | io.go:101:26:101:38 | "some string" | io.go:101:8:101:39 | call to NewReader | | io.go:102:3:102:3 | r | io.go:102:13:102:21 | selection of Stdout [postupdate] | | io.go:108:30:108:42 | "some string" | io.go:108:12:108:43 | call to NewReader | -| io.go:109:12:109:33 | call to ReadAll | io.go:109:2:109:33 | ... := ...[0] | -| io.go:109:12:109:33 | call to ReadAll | io.go:109:2:109:33 | ... := ...[1] | -| io.go:109:27:109:32 | reader | io.go:109:2:109:33 | ... := ...[0] | +| io.go:109:12:109:33 | call to ReadAll | io.go:109:2:109:33 | extract:0 ... := ... | +| io.go:109:12:109:33 | call to ReadAll | io.go:109:2:109:33 | extract:1 ... := ... | +| io.go:109:27:109:32 | reader | io.go:109:2:109:33 | extract:0 ... := ... | | io.go:110:18:110:20 | buf | io.go:110:2:110:10 | selection of Stdout [postupdate] | -| main.go:11:12:11:26 | call to Marshal | main.go:11:2:11:26 | ... := ...[0] | -| main.go:11:12:11:26 | call to Marshal | main.go:11:2:11:26 | ... := ...[1] | -| main.go:11:25:11:25 | v | main.go:11:2:11:26 | ... := ...[0] | -| main.go:13:14:13:52 | call to MarshalIndent | main.go:13:2:13:52 | ... := ...[0] | -| main.go:13:14:13:52 | call to MarshalIndent | main.go:13:2:13:52 | ... := ...[1] | -| main.go:13:33:13:33 | v | main.go:13:2:13:52 | ... := ...[0] | -| main.go:13:36:13:45 | "/*JSON*/" | main.go:13:2:13:52 | ... := ...[0] | -| main.go:13:48:13:51 | " " | main.go:13:2:13:52 | ... := ...[0] | +| main.go:11:12:11:26 | call to Marshal | main.go:11:2:11:26 | extract:0 ... := ... | +| main.go:11:12:11:26 | call to Marshal | main.go:11:2:11:26 | extract:1 ... := ... | +| main.go:11:25:11:25 | v | main.go:11:2:11:26 | extract:0 ... := ... | +| main.go:13:14:13:52 | call to MarshalIndent | main.go:13:2:13:52 | extract:0 ... := ... | +| main.go:13:14:13:52 | call to MarshalIndent | main.go:13:2:13:52 | extract:1 ... := ... | +| main.go:13:33:13:33 | v | main.go:13:2:13:52 | extract:0 ... := ... | +| main.go:13:36:13:45 | "/*JSON*/" | main.go:13:2:13:52 | extract:0 ... := ... | +| main.go:13:48:13:51 | " " | main.go:13:2:13:52 | extract:0 ... := ... | | main.go:14:25:14:25 | b | main.go:14:9:14:41 | slice literal | | main.go:14:28:14:30 | err | main.go:14:9:14:41 | slice literal | | main.go:14:33:14:34 | b2 | main.go:14:9:14:41 | slice literal | | main.go:14:37:14:40 | err2 | main.go:14:9:14:41 | slice literal | -| main.go:19:18:19:42 | call to DecodeString | main.go:19:2:19:42 | ... := ...[0] | -| main.go:19:18:19:42 | call to DecodeString | main.go:19:2:19:42 | ... := ...[1] | -| main.go:19:35:19:41 | encoded | main.go:19:2:19:42 | ... := ...[0] | +| main.go:19:18:19:42 | call to DecodeString | main.go:19:2:19:42 | extract:0 ... := ... | +| main.go:19:18:19:42 | call to DecodeString | main.go:19:2:19:42 | extract:1 ... := ... | +| main.go:19:35:19:41 | encoded | main.go:19:2:19:42 | extract:0 ... := ... | | main.go:23:25:23:31 | decoded | main.go:23:9:23:48 | slice literal | | main.go:23:34:23:36 | err | main.go:23:9:23:48 | slice literal | | main.go:23:39:23:47 | reEncoded | main.go:23:9:23:48 | slice literal | -| main.go:28:2:28:4 | implicit dereference | main.go:28:2:28:4 | req [postupdate] | -| main.go:28:2:28:4 | implicit dereference | main.go:28:2:28:9 | selection of Body | -| main.go:28:2:28:4 | req | main.go:28:2:28:4 | implicit dereference | -| main.go:28:2:28:4 | req [postupdate] | main.go:28:2:28:4 | implicit dereference | +| main.go:28:2:28:4 | implicit-deref req | main.go:28:2:28:4 | req [postupdate] | +| main.go:28:2:28:4 | implicit-deref req | main.go:28:2:28:9 | selection of Body | +| main.go:28:2:28:4 | req | main.go:28:2:28:4 | implicit-deref req | +| main.go:28:2:28:4 | req [postupdate] | main.go:28:2:28:4 | implicit-deref req | | main.go:28:2:28:9 | selection of Body | main.go:28:16:28:16 | b [postupdate] | -| main.go:34:2:34:4 | implicit dereference | main.go:34:2:34:4 | req [postupdate] | -| main.go:34:2:34:4 | implicit dereference | main.go:34:2:34:9 | selection of Body | -| main.go:34:2:34:4 | req | main.go:34:2:34:4 | implicit dereference | -| main.go:34:2:34:4 | req [postupdate] | main.go:34:2:34:4 | implicit dereference | +| main.go:34:2:34:4 | implicit-deref req | main.go:34:2:34:4 | req [postupdate] | +| main.go:34:2:34:4 | implicit-deref req | main.go:34:2:34:9 | selection of Body | +| main.go:34:2:34:4 | req | main.go:34:2:34:4 | implicit-deref req | +| main.go:34:2:34:4 | req [postupdate] | main.go:34:2:34:4 | implicit-deref req | | main.go:34:2:34:9 | selection of Body | main.go:34:16:34:16 | b [postupdate] | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Twirp/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/Twirp/CONSISTENCY/DataFlowConsistency.expected index d4e53cf33a9a..71165fc94b07 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Twirp/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Twirp/CONSISTENCY/DataFlowConsistency.expected @@ -7,91 +7,91 @@ reverseRead | rpc/notes/service.pb.go:155:9:155:45 | file_rpc_notes_service_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | | rpc/notes/service.pb.go:182:10:182:46 | file_rpc_notes_service_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | | rpc/notes/service.pb.go:195:9:195:45 | file_rpc_notes_service_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.pb.go:297:13:297:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.pb.go:299:13:299:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.pb.go:301:13:301:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.pb.go:309:13:309:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.pb.go:311:13:311:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.pb.go:313:13:313:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.pb.go:321:13:321:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.pb.go:323:13:323:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.pb.go:325:13:325:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.pb.go:333:13:333:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.pb.go:335:13:335:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.pb.go:337:13:337:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.pb.go:297:13:297:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.pb.go:299:13:299:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.pb.go:301:13:301:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.pb.go:309:13:309:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.pb.go:311:13:311:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.pb.go:313:13:313:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.pb.go:321:13:321:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.pb.go:323:13:323:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.pb.go:325:13:325:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.pb.go:333:13:333:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.pb.go:335:13:335:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.pb.go:337:13:337:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | | rpc/notes/service.twirp.go:82:40:82:49 | clientOpts | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:118:37:118:37 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:118:37:118:37 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | | rpc/notes/service.twirp.go:118:47:118:52 | selection of opts | Origin of readStep is missing a PostUpdateNode. | | rpc/notes/service.twirp.go:124:24:124:29 | selection of opts | Origin of readStep is missing a PostUpdateNode. | | rpc/notes/service.twirp.go:128:34:128:39 | selection of opts | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:164:37:164:37 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:164:37:164:37 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | | rpc/notes/service.twirp.go:164:47:164:52 | selection of opts | Origin of readStep is missing a PostUpdateNode. | | rpc/notes/service.twirp.go:170:24:170:29 | selection of opts | Origin of readStep is missing a PostUpdateNode. | | rpc/notes/service.twirp.go:174:34:174:39 | selection of opts | Origin of readStep is missing a PostUpdateNode. | | rpc/notes/service.twirp.go:221:40:221:49 | clientOpts | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:257:33:257:33 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:257:33:257:33 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | | rpc/notes/service.twirp.go:257:43:257:48 | selection of opts | Origin of readStep is missing a PostUpdateNode. | | rpc/notes/service.twirp.go:263:24:263:29 | selection of opts | Origin of readStep is missing a PostUpdateNode. | | rpc/notes/service.twirp.go:267:34:267:39 | selection of opts | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:303:33:303:33 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:303:33:303:33 | implicit-deref c | Origin of readStep is missing a PostUpdateNode. | | rpc/notes/service.twirp.go:303:43:303:48 | selection of opts | Origin of readStep is missing a PostUpdateNode. | | rpc/notes/service.twirp.go:309:24:309:29 | selection of opts | Origin of readStep is missing a PostUpdateNode. | | rpc/notes/service.twirp.go:313:34:313:39 | selection of opts | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:350:45:350:54 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:360:29:360:29 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:389:38:389:38 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:397:58:397:60 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:402:47:402:49 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:404:48:404:50 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:405:58:405:60 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:409:95:409:97 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:410:58:410:60 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:422:48:422:50 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:423:58:423:60 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:429:12:429:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:440:53:440:55 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:441:43:441:45 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:449:36:449:36 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:455:23:455:25 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:477:13:477:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:494:41:494:41 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:507:34:507:34 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:524:24:524:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:526:24:526:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:532:36:532:36 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:538:25:538:27 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:558:13:558:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:575:41:575:41 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:588:34:588:34 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:603:24:603:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:605:24:605:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:609:12:609:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:620:53:620:55 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:621:43:621:45 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:629:36:629:36 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:635:23:635:25 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:657:13:657:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:674:41:674:41 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:687:34:687:34 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:704:24:704:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:706:24:706:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:712:36:712:36 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:718:25:718:27 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:738:13:738:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:755:41:755:41 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:768:34:768:34 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:783:24:783:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:785:24:785:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:350:45:350:54 | implicit-deref serverOpts | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:360:29:360:29 | implicit-deref s | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:389:38:389:38 | implicit-deref s | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:397:58:397:60 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:402:47:402:49 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:404:48:404:50 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:405:58:405:60 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:409:95:409:97 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:410:58:410:60 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:422:48:422:50 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:423:58:423:60 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:429:12:429:14 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:440:53:440:55 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:441:43:441:45 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:449:36:449:36 | implicit-deref s | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:455:23:455:25 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:477:13:477:13 | implicit-deref s | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:494:41:494:41 | implicit-deref s | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:507:34:507:34 | implicit-deref s | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:524:24:524:24 | implicit-deref s | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:526:24:526:24 | implicit-deref s | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:532:36:532:36 | implicit-deref s | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:538:25:538:27 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:558:13:558:13 | implicit-deref s | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:575:41:575:41 | implicit-deref s | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:588:34:588:34 | implicit-deref s | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:603:24:603:24 | implicit-deref s | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:605:24:605:24 | implicit-deref s | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:609:12:609:14 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:620:53:620:55 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:621:43:621:45 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:629:36:629:36 | implicit-deref s | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:635:23:635:25 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:657:13:657:13 | implicit-deref s | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:674:41:674:41 | implicit-deref s | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:687:34:687:34 | implicit-deref s | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:704:24:704:24 | implicit-deref s | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:706:24:706:24 | implicit-deref s | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:712:36:712:36 | implicit-deref s | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:718:25:718:27 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:738:13:738:13 | implicit-deref s | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:755:41:755:41 | implicit-deref s | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:768:34:768:34 | implicit-deref s | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:783:24:783:24 | implicit-deref s | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:785:24:785:24 | implicit-deref s | Origin of readStep is missing a PostUpdateNode. | | rpc/notes/service.twirp.go:969:8:969:13 | copied | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:984:2:984:4 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:985:2:985:4 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:986:2:986:4 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:1032:15:1032:18 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:1037:35:1037:38 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:1116:66:1116:66 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:1159:98:1159:98 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:1227:21:1227:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:1237:35:1237:38 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:1278:11:1278:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| rpc/notes/service.twirp.go:1292:23:1292:26 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| server/main.go:33:19:33:19 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:984:2:984:4 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:985:2:985:4 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:986:2:986:4 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:1032:15:1032:18 | implicit-deref resp | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:1037:35:1037:38 | implicit-deref resp | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:1116:66:1116:66 | implicit-deref e | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:1159:98:1159:98 | implicit-deref e | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:1227:21:1227:24 | implicit-deref resp | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:1237:35:1237:38 | implicit-deref resp | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:1278:11:1278:14 | implicit-deref resp | Origin of readStep is missing a PostUpdateNode. | +| rpc/notes/service.twirp.go:1292:23:1292:26 | implicit-deref resp | Origin of readStep is missing a PostUpdateNode. | +| server/main.go:33:19:33:19 | implicit-deref s | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Twirp/RequestForgery.expected b/go/ql/test/library-tests/semmle/go/frameworks/Twirp/RequestForgery.expected index a50f131a747c..483cd2702ca6 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Twirp/RequestForgery.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Twirp/RequestForgery.expected @@ -4,8 +4,8 @@ edges | client/main.go:16:35:16:78 | &... | server/main.go:19:56:19:61 | SSA def(params) | provenance | | | client/main.go:16:35:16:78 | &... [postupdate] | client/main.go:16:35:16:78 | &... | provenance | | -| rpc/notes/service.twirp.go:538:2:538:33 | ... := ...[0] | rpc/notes/service.twirp.go:544:27:544:29 | buf | provenance | | -| rpc/notes/service.twirp.go:538:25:538:32 | selection of Body | rpc/notes/service.twirp.go:538:2:538:33 | ... := ...[0] | provenance | Src:MaD:1 MaD:3 | +| rpc/notes/service.twirp.go:538:2:538:33 | extract:0 ... := ... | rpc/notes/service.twirp.go:544:27:544:29 | buf | provenance | | +| rpc/notes/service.twirp.go:538:25:538:32 | selection of Body | rpc/notes/service.twirp.go:538:2:538:33 | extract:0 ... := ... | provenance | Src:MaD:1 MaD:3 | | rpc/notes/service.twirp.go:544:27:544:29 | buf | rpc/notes/service.twirp.go:544:32:544:41 | reqContent [postupdate] | provenance | MaD:2 | | rpc/notes/service.twirp.go:544:32:544:41 | reqContent [postupdate] | rpc/notes/service.twirp.go:574:2:577:2 | SSA def(reqContent) | provenance | | | rpc/notes/service.twirp.go:574:2:577:2 | SSA def(reqContent) | rpc/notes/service.twirp.go:576:35:576:44 | reqContent | provenance | | @@ -21,7 +21,7 @@ models nodes | client/main.go:16:35:16:78 | &... | semmle.label | &... | | client/main.go:16:35:16:78 | &... [postupdate] | semmle.label | &... [postupdate] | -| rpc/notes/service.twirp.go:538:2:538:33 | ... := ...[0] | semmle.label | ... := ...[0] | +| rpc/notes/service.twirp.go:538:2:538:33 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | rpc/notes/service.twirp.go:538:25:538:32 | selection of Body | semmle.label | selection of Body | | rpc/notes/service.twirp.go:544:27:544:29 | buf | semmle.label | buf | | rpc/notes/service.twirp.go:544:32:544:41 | reqContent [postupdate] | semmle.label | reqContent [postupdate] | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/WebSocket/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/WebSocket/CONSISTENCY/DataFlowConsistency.expected index ace7b23eded1..980efad53219 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/WebSocket/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/WebSocket/CONSISTENCY/DataFlowConsistency.expected @@ -1,2 +1,2 @@ reverseRead -| WebSocketReadWrite.go:27:9:27:9 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| WebSocketReadWrite.go:27:9:27:9 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/WebSocket/Read.expected b/go/ql/test/library-tests/semmle/go/frameworks/WebSocket/Read.expected index 4c4bd0743d24..0eea39ca3ae4 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/WebSocket/Read.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/WebSocket/Read.expected @@ -1,8 +1,8 @@ | WebSocketReadWrite.go:32:11:32:14 | xnet [postupdate] | | WebSocketReadWrite.go:36:21:36:25 | xnet2 [postupdate] | -| WebSocketReadWrite.go:41:3:41:40 | ... := ...[1] | -| WebSocketReadWrite.go:44:3:44:48 | ... := ...[1] | +| WebSocketReadWrite.go:41:3:41:40 | extract:1 ... := ... | +| WebSocketReadWrite.go:44:3:44:48 | extract:1 ... := ... | | WebSocketReadWrite.go:52:26:52:35 | gorillaMsg [postupdate] | | WebSocketReadWrite.go:56:17:56:24 | gorilla2 [postupdate] | -| WebSocketReadWrite.go:61:3:61:38 | ... := ...[1] | -| WebSocketReadWrite.go:67:3:67:36 | ... := ...[0] | +| WebSocketReadWrite.go:61:3:61:38 | extract:1 ... := ... | +| WebSocketReadWrite.go:67:3:67:36 | extract:0 ... := ... | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/WebSocket/RemoteFlowSources.expected b/go/ql/test/library-tests/semmle/go/frameworks/WebSocket/RemoteFlowSources.expected index e0c1603ff2e9..17d1e7adaf4b 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/WebSocket/RemoteFlowSources.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/WebSocket/RemoteFlowSources.expected @@ -1,9 +1,9 @@ | WebSocketReadWrite.go:27:9:27:16 | selection of Header | | WebSocketReadWrite.go:32:11:32:14 | xnet [postupdate] | | WebSocketReadWrite.go:36:21:36:25 | xnet2 [postupdate] | -| WebSocketReadWrite.go:41:3:41:40 | ... := ...[1] | -| WebSocketReadWrite.go:44:3:44:48 | ... := ...[1] | +| WebSocketReadWrite.go:41:3:41:40 | extract:1 ... := ... | +| WebSocketReadWrite.go:44:3:44:48 | extract:1 ... := ... | | WebSocketReadWrite.go:52:26:52:35 | gorillaMsg [postupdate] | | WebSocketReadWrite.go:56:17:56:24 | gorilla2 [postupdate] | -| WebSocketReadWrite.go:61:3:61:38 | ... := ...[1] | -| WebSocketReadWrite.go:67:3:67:36 | ... := ...[0] | +| WebSocketReadWrite.go:61:3:61:38 | extract:1 ... := ... | +| WebSocketReadWrite.go:67:3:67:36 | extract:0 ... := ... | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/XNetHtml/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/XNetHtml/CONSISTENCY/DataFlowConsistency.expected index e938aa2ca923..5cdc979ed6b1 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/XNetHtml/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/XNetHtml/CONSISTENCY/DataFlowConsistency.expected @@ -1,12 +1,12 @@ reverseRead -| test.go:12:12:12:18 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:17:24:17:30 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:20:36:20:42 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:23:33:23:39 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:12:12:12:18 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:17:24:17:30 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:20:36:20:42 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:23:33:23:39 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | | test.go:24:22:24:26 | nodes | Origin of readStep is missing a PostUpdateNode. | -| test.go:26:45:26:51 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:26:45:26:51 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | | test.go:27:22:27:27 | nodes2 | Origin of readStep is missing a PostUpdateNode. | -| test.go:31:33:31:39 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:39:49:39:55 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:43:31:43:37 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| test.go:48:32:48:38 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| test.go:31:33:31:39 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:39:49:39:55 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:43:31:43:37 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| test.go:48:32:48:38 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/XNetHtml/ReflectedXss.expected b/go/ql/test/library-tests/semmle/go/frameworks/XNetHtml/ReflectedXss.expected index 17c74de55552..8cd9603077e7 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/XNetHtml/ReflectedXss.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/XNetHtml/ReflectedXss.expected @@ -19,15 +19,15 @@ edges | test.go:12:12:12:44 | call to Get | test.go:15:42:15:47 | param1 | provenance | | | test.go:15:22:15:48 | call to UnescapeString | test.go:15:15:15:49 | type conversion | provenance | | | test.go:15:42:15:47 | param1 | test.go:15:22:15:48 | call to UnescapeString | provenance | MaD:9 | -| test.go:17:2:17:36 | ... := ...[0] | test.go:18:15:18:31 | type conversion | provenance | | -| test.go:17:2:17:36 | ... := ...[0] | test.go:29:22:29:25 | node | provenance | | -| test.go:17:24:17:35 | selection of Body | test.go:17:2:17:36 | ... := ...[0] | provenance | Src:MaD:1 MaD:5 | -| test.go:20:2:20:48 | ... := ...[0] | test.go:21:15:21:32 | type conversion | provenance | | -| test.go:20:36:20:47 | selection of Body | test.go:20:2:20:48 | ... := ...[0] | provenance | Src:MaD:1 MaD:8 | -| test.go:23:2:23:50 | ... := ...[0] | test.go:24:15:24:35 | type conversion | provenance | | -| test.go:23:33:23:44 | selection of Body | test.go:23:2:23:50 | ... := ...[0] | provenance | Src:MaD:1 MaD:6 | -| test.go:26:2:26:62 | ... := ...[0] | test.go:27:15:27:36 | type conversion | provenance | | -| test.go:26:45:26:56 | selection of Body | test.go:26:2:26:62 | ... := ...[0] | provenance | Src:MaD:1 MaD:7 | +| test.go:17:2:17:36 | extract:0 ... := ... | test.go:18:15:18:31 | type conversion | provenance | | +| test.go:17:2:17:36 | extract:0 ... := ... | test.go:29:22:29:25 | node | provenance | | +| test.go:17:24:17:35 | selection of Body | test.go:17:2:17:36 | extract:0 ... := ... | provenance | Src:MaD:1 MaD:5 | +| test.go:20:2:20:48 | extract:0 ... := ... | test.go:21:15:21:32 | type conversion | provenance | | +| test.go:20:36:20:47 | selection of Body | test.go:20:2:20:48 | extract:0 ... := ... | provenance | Src:MaD:1 MaD:8 | +| test.go:23:2:23:50 | extract:0 ... := ... | test.go:24:15:24:35 | type conversion | provenance | | +| test.go:23:33:23:44 | selection of Body | test.go:23:2:23:50 | extract:0 ... := ... | provenance | Src:MaD:1 MaD:6 | +| test.go:26:2:26:62 | extract:0 ... := ... | test.go:27:15:27:36 | type conversion | provenance | | +| test.go:26:45:26:56 | selection of Body | test.go:26:2:26:62 | extract:0 ... := ... | provenance | Src:MaD:1 MaD:7 | | test.go:31:15:31:45 | call to NewTokenizer | test.go:32:15:32:23 | tokenizer | provenance | | | test.go:31:15:31:45 | call to NewTokenizer | test.go:33:15:33:23 | tokenizer | provenance | | | test.go:31:15:31:45 | call to NewTokenizer | test.go:34:17:34:25 | tokenizer | provenance | | @@ -36,24 +36,24 @@ edges | test.go:31:33:31:44 | selection of Body | test.go:31:15:31:45 | call to NewTokenizer | provenance | Src:MaD:1 MaD:3 | | test.go:32:15:32:23 | tokenizer | test.go:32:15:32:34 | call to Buffered | provenance | MaD:12 | | test.go:33:15:33:23 | tokenizer | test.go:33:15:33:29 | call to Raw | provenance | MaD:13 | -| test.go:34:2:34:35 | ... := ...[1] | test.go:35:15:35:19 | value | provenance | | -| test.go:34:17:34:25 | tokenizer | test.go:34:2:34:35 | ... := ...[1] | provenance | MaD:14 | +| test.go:34:2:34:35 | extract:1 ... := ... | test.go:35:15:35:19 | value | provenance | | +| test.go:34:17:34:25 | tokenizer | test.go:34:2:34:35 | extract:1 ... := ... | provenance | MaD:14 | | test.go:36:15:36:23 | tokenizer | test.go:36:15:36:30 | call to Text | provenance | MaD:15 | | test.go:37:22:37:30 | tokenizer | test.go:37:22:37:38 | call to Token | provenance | MaD:16 | | test.go:37:22:37:38 | call to Token | test.go:37:15:37:44 | type conversion | provenance | | | test.go:39:23:39:77 | call to NewTokenizerFragment | test.go:40:15:40:31 | tokenizerFragment | provenance | | | test.go:39:49:39:60 | selection of Body | test.go:39:23:39:77 | call to NewTokenizerFragment | provenance | Src:MaD:1 MaD:4 | | test.go:40:15:40:31 | tokenizerFragment | test.go:40:15:40:42 | call to Buffered | provenance | MaD:12 | -| test.go:43:2:43:43 | ... := ...[0] | test.go:44:24:44:34 | taintedNode | provenance | | -| test.go:43:31:43:42 | selection of Body | test.go:43:2:43:43 | ... := ...[0] | provenance | Src:MaD:1 MaD:5 | +| test.go:43:2:43:43 | extract:0 ... := ... | test.go:44:24:44:34 | taintedNode | provenance | | +| test.go:43:31:43:42 | selection of Body | test.go:43:2:43:43 | extract:0 ... := ... | provenance | Src:MaD:1 MaD:5 | | test.go:44:2:44:10 | cleanNode [postupdate] | test.go:45:22:45:31 | &... | provenance | | | test.go:44:2:44:10 | cleanNode [postupdate] | test.go:45:23:45:31 | cleanNode | provenance | | | test.go:44:24:44:34 | taintedNode | test.go:44:2:44:10 | cleanNode [postupdate] | provenance | MaD:10 | | test.go:45:22:45:31 | &... [pointer] | test.go:45:22:45:31 | &... | provenance | | | test.go:45:23:45:31 | cleanNode | test.go:45:22:45:31 | &... | provenance | | | test.go:45:23:45:31 | cleanNode | test.go:45:22:45:31 | &... [pointer] | provenance | | -| test.go:48:2:48:44 | ... := ...[0] | test.go:49:26:49:37 | taintedNode2 | provenance | | -| test.go:48:32:48:43 | selection of Body | test.go:48:2:48:44 | ... := ...[0] | provenance | Src:MaD:1 MaD:5 | +| test.go:48:2:48:44 | extract:0 ... := ... | test.go:49:26:49:37 | taintedNode2 | provenance | | +| test.go:48:32:48:43 | selection of Body | test.go:48:2:48:44 | extract:0 ... := ... | provenance | Src:MaD:1 MaD:5 | | test.go:49:2:49:11 | cleanNode2 [postupdate] | test.go:50:22:50:32 | &... | provenance | | | test.go:49:2:49:11 | cleanNode2 [postupdate] | test.go:50:23:50:32 | cleanNode2 | provenance | | | test.go:49:26:49:37 | taintedNode2 | test.go:49:2:49:11 | cleanNode2 [postupdate] | provenance | MaD:11 | @@ -86,16 +86,16 @@ nodes | test.go:15:15:15:49 | type conversion | semmle.label | type conversion | | test.go:15:22:15:48 | call to UnescapeString | semmle.label | call to UnescapeString | | test.go:15:42:15:47 | param1 | semmle.label | param1 | -| test.go:17:2:17:36 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:17:2:17:36 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:17:24:17:35 | selection of Body | semmle.label | selection of Body | | test.go:18:15:18:31 | type conversion | semmle.label | type conversion | -| test.go:20:2:20:48 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:20:2:20:48 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:20:36:20:47 | selection of Body | semmle.label | selection of Body | | test.go:21:15:21:32 | type conversion | semmle.label | type conversion | -| test.go:23:2:23:50 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:23:2:23:50 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:23:33:23:44 | selection of Body | semmle.label | selection of Body | | test.go:24:15:24:35 | type conversion | semmle.label | type conversion | -| test.go:26:2:26:62 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:26:2:26:62 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:26:45:26:56 | selection of Body | semmle.label | selection of Body | | test.go:27:15:27:36 | type conversion | semmle.label | type conversion | | test.go:29:22:29:25 | node | semmle.label | node | @@ -105,7 +105,7 @@ nodes | test.go:32:15:32:34 | call to Buffered | semmle.label | call to Buffered | | test.go:33:15:33:23 | tokenizer | semmle.label | tokenizer | | test.go:33:15:33:29 | call to Raw | semmle.label | call to Raw | -| test.go:34:2:34:35 | ... := ...[1] | semmle.label | ... := ...[1] | +| test.go:34:2:34:35 | extract:1 ... := ... | semmle.label | extract:1 ... := ... | | test.go:34:17:34:25 | tokenizer | semmle.label | tokenizer | | test.go:35:15:35:19 | value | semmle.label | value | | test.go:36:15:36:23 | tokenizer | semmle.label | tokenizer | @@ -117,14 +117,14 @@ nodes | test.go:39:49:39:60 | selection of Body | semmle.label | selection of Body | | test.go:40:15:40:31 | tokenizerFragment | semmle.label | tokenizerFragment | | test.go:40:15:40:42 | call to Buffered | semmle.label | call to Buffered | -| test.go:43:2:43:43 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:43:2:43:43 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:43:31:43:42 | selection of Body | semmle.label | selection of Body | | test.go:44:2:44:10 | cleanNode [postupdate] | semmle.label | cleanNode [postupdate] | | test.go:44:24:44:34 | taintedNode | semmle.label | taintedNode | | test.go:45:22:45:31 | &... | semmle.label | &... | | test.go:45:22:45:31 | &... [pointer] | semmle.label | &... [pointer] | | test.go:45:23:45:31 | cleanNode | semmle.label | cleanNode | -| test.go:48:2:48:44 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:48:2:48:44 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:48:32:48:43 | selection of Body | semmle.label | selection of Body | | test.go:49:2:49:11 | cleanNode2 [postupdate] | semmle.label | cleanNode2 [postupdate] | | test.go:49:26:49:37 | taintedNode2 | semmle.label | taintedNode2 | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/XNetHtml/SqlInjection.expected b/go/ql/test/library-tests/semmle/go/frameworks/XNetHtml/SqlInjection.expected index 8b2f05c297f8..6a229e1f37df 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/XNetHtml/SqlInjection.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/XNetHtml/SqlInjection.expected @@ -1,14 +1,14 @@ #select -| test.go:57:11:57:41 | call to EscapeString | test.go:56:2:56:42 | ... := ...[0] | test.go:57:11:57:41 | call to EscapeString | This query depends on a $@. | test.go:56:2:56:42 | ... := ...[0] | user-provided value | +| test.go:57:11:57:41 | call to EscapeString | test.go:56:2:56:42 | extract:0 ... := ... | test.go:57:11:57:41 | call to EscapeString | This query depends on a $@. | test.go:56:2:56:42 | extract:0 ... := ... | user-provided value | edges -| test.go:56:2:56:42 | ... := ...[0] | test.go:57:29:57:40 | selection of Value | provenance | Src:MaD:2 | +| test.go:56:2:56:42 | extract:0 ... := ... | test.go:57:29:57:40 | selection of Value | provenance | Src:MaD:2 | | test.go:57:29:57:40 | selection of Value | test.go:57:11:57:41 | call to EscapeString | provenance | MaD:3 Sink:MaD:1 | models | 1 | Sink: database/sql; DB; true; Query; ; ; Argument[0]; sql-injection; manual | | 2 | Source: net/http; Request; true; Cookie; ; ; ReturnValue[0]; remote; manual | | 3 | Summary: golang.org/x/net/html; ; false; EscapeString; ; ; Argument[0]; ReturnValue; taint; manual | nodes -| test.go:56:2:56:42 | ... := ...[0] | semmle.label | ... := ...[0] | +| test.go:56:2:56:42 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | test.go:57:11:57:41 | call to EscapeString | semmle.label | call to EscapeString | | test.go:57:29:57:40 | selection of Value | semmle.label | selection of Value | subpaths diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Yaml/yaml.go b/go/ql/test/library-tests/semmle/go/frameworks/Yaml/yaml.go index 388d884f38b7..68b2c657d748 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Yaml/yaml.go +++ b/go/ql/test/library-tests/semmle/go/frameworks/Yaml/yaml.go @@ -12,10 +12,10 @@ func main() { var in, out interface{} var inb []byte - out, _ = yaml1.Marshal(in) // $ marshaler="yaml: in -> ... = ...[0]" ttfnmodelstep="in -> ... = ...[0]" + out, _ = yaml1.Marshal(in) // $ marshaler="yaml: in -> extract:0 ... = ..." ttfnmodelstep="in -> extract:0 ... = ..." yaml1.Unmarshal(inb, out) // $ unmarshaler="yaml: inb -> out [postupdate]" ttfnmodelstep="inb -> out [postupdate]" - out, _ = yaml2.Marshal(in) // $ marshaler="yaml: in -> ... = ...[0]" ttfnmodelstep="in -> ... = ...[0]" + out, _ = yaml2.Marshal(in) // $ marshaler="yaml: in -> extract:0 ... = ..." ttfnmodelstep="in -> extract:0 ... = ..." yaml2.Unmarshal(inb, out) // $ unmarshaler="yaml: inb -> out [postupdate]" ttfnmodelstep="inb -> out [postupdate]" yaml2.UnmarshalStrict(inb, out) // $ unmarshaler="yaml: inb -> out [postupdate]" ttfnmodelstep="inb -> out [postupdate]" @@ -27,7 +27,7 @@ func main() { e := yaml2.NewEncoder(w) // $ ttfnmodelstep="SSA def(e) -> w [postupdate]" e.Encode(in) // $ ttfnmodelstep="in -> e [postupdate]" - out, _ = yaml3.Marshal(in) // $ marshaler="yaml: in -> ... = ...[0]" ttfnmodelstep="in -> ... = ...[0]" + out, _ = yaml3.Marshal(in) // $ marshaler="yaml: in -> extract:0 ... = ..." ttfnmodelstep="in -> extract:0 ... = ..." yaml3.Unmarshal(inb, out) // $ unmarshaler="yaml: inb -> out [postupdate]" ttfnmodelstep="inb -> out [postupdate]" d1 := yaml3.NewDecoder(r) // $ ttfnmodelstep="r -> call to NewDecoder" diff --git a/go/ql/test/library-tests/semmle/go/security/SafeUrlFlow/SafeUrlFlow.expected b/go/ql/test/library-tests/semmle/go/security/SafeUrlFlow/SafeUrlFlow.expected index c2f82841d83c..e15f4207b6c1 100644 --- a/go/ql/test/library-tests/semmle/go/security/SafeUrlFlow/SafeUrlFlow.expected +++ b/go/ql/test/library-tests/semmle/go/security/SafeUrlFlow/SafeUrlFlow.expected @@ -56,9 +56,9 @@ edges | SafeUrlFlow.go:74:70:74:76 | safeURL | SafeUrlFlow.go:74:70:74:85 | call to String | provenance | MaD:3 | | SafeUrlFlow.go:78:40:78:46 | safeURL | SafeUrlFlow.go:78:40:78:55 | call to String | provenance | MaD:3 | | SafeUrlFlow.go:84:14:84:21 | selection of Host | SafeUrlFlow.go:87:19:87:26 | safeHost | provenance | | -| SafeUrlFlow.go:87:2:87:10 | implicit dereference [postupdate] | SafeUrlFlow.go:87:2:87:10 | targetURL [postupdate] | provenance | | +| SafeUrlFlow.go:87:2:87:10 | implicit-deref targetURL [postupdate] | SafeUrlFlow.go:87:2:87:10 | targetURL [postupdate] | provenance | | | SafeUrlFlow.go:87:2:87:10 | targetURL [postupdate] | SafeUrlFlow.go:89:24:89:32 | targetURL | provenance | | -| SafeUrlFlow.go:87:19:87:26 | safeHost | SafeUrlFlow.go:87:2:87:10 | implicit dereference [postupdate] | provenance | Config | +| SafeUrlFlow.go:87:19:87:26 | safeHost | SafeUrlFlow.go:87:2:87:10 | implicit-deref targetURL [postupdate] | provenance | Config | | SafeUrlFlow.go:87:19:87:26 | safeHost | SafeUrlFlow.go:87:2:87:10 | targetURL [postupdate] | provenance | Config | | SafeUrlFlow.go:89:24:89:32 | targetURL | SafeUrlFlow.go:89:24:89:41 | call to String | provenance | MaD:3 Sink:MaD:1 | | SafeUrlFlow.go:96:13:96:19 | selection of URL | SafeUrlFlow.go:105:11:105:23 | reconstructed | provenance | Src:MaD:2 | @@ -108,7 +108,7 @@ nodes | SafeUrlFlow.go:78:40:78:46 | safeURL | semmle.label | safeURL | | SafeUrlFlow.go:78:40:78:55 | call to String | semmle.label | call to String | | SafeUrlFlow.go:84:14:84:21 | selection of Host | semmle.label | selection of Host | -| SafeUrlFlow.go:87:2:87:10 | implicit dereference [postupdate] | semmle.label | implicit dereference [postupdate] | +| SafeUrlFlow.go:87:2:87:10 | implicit-deref targetURL [postupdate] | semmle.label | implicit-deref targetURL [postupdate] | | SafeUrlFlow.go:87:2:87:10 | targetURL [postupdate] | semmle.label | targetURL [postupdate] | | SafeUrlFlow.go:87:19:87:26 | safeHost | semmle.label | safeHost | | SafeUrlFlow.go:89:24:89:32 | targetURL | semmle.label | targetURL | diff --git a/go/ql/test/query-tests/InconsistentCode/MissingErrorCheck/MissingErrorCheck.expected b/go/ql/test/query-tests/InconsistentCode/MissingErrorCheck/MissingErrorCheck.expected index 9db748ebabd0..acd73e5a79ef 100644 --- a/go/ql/test/query-tests/InconsistentCode/MissingErrorCheck/MissingErrorCheck.expected +++ b/go/ql/test/query-tests/InconsistentCode/MissingErrorCheck/MissingErrorCheck.expected @@ -1,2 +1,2 @@ -| tests.go:61:30:61:35 | result | $@ may be nil at this dereference because $@ may not have been checked. | tests.go:59:2:59:7 | SSA def(result) | result | tests.go:59:10:59:12 | SSA def(err) | err | -| tests.go:243:27:243:32 | result | $@ may be nil at this dereference because $@ may not have been checked. | tests.go:241:2:241:7 | SSA def(result) | result | tests.go:241:10:241:12 | SSA def(err) | err | +| tests.go:61:30:61:35 | result | $@ may be nil at this dereference because $@ may not have been checked. | tests.go:59:2:59:30 | SSA def(result) | result | tests.go:59:2:59:30 | SSA def(err) | err | +| tests.go:243:27:243:32 | result | $@ may be nil at this dereference because $@ may not have been checked. | tests.go:241:2:241:37 | SSA def(result) | result | tests.go:241:2:241:37 | SSA def(err) | err | diff --git a/go/ql/test/query-tests/InconsistentCode/UnhandledCloseWritableHandle/UnhandledCloseWritableHandle.expected b/go/ql/test/query-tests/InconsistentCode/UnhandledCloseWritableHandle/UnhandledCloseWritableHandle.expected index 5ded10ee1bde..4fe3c754a5a5 100644 --- a/go/ql/test/query-tests/InconsistentCode/UnhandledCloseWritableHandle/UnhandledCloseWritableHandle.expected +++ b/go/ql/test/query-tests/InconsistentCode/UnhandledCloseWritableHandle/UnhandledCloseWritableHandle.expected @@ -1,30 +1,30 @@ #select -| tests.go:10:8:10:8 | f | tests.go:32:5:32:78 | ... := ...[0] | tests.go:10:8:10:8 | f | File handle may be writable as a result of data flow from a $@ and closing it may result in data loss upon failure, which is not handled explicitly. | tests.go:32:15:32:78 | call to OpenFile | call to OpenFile | -| tests.go:10:8:10:8 | f | tests.go:46:5:46:76 | ... := ...[0] | tests.go:10:8:10:8 | f | File handle may be writable as a result of data flow from a $@ and closing it may result in data loss upon failure, which is not handled explicitly. | tests.go:46:15:46:76 | call to OpenFile | call to OpenFile | -| tests.go:15:3:15:3 | f | tests.go:32:5:32:78 | ... := ...[0] | tests.go:15:3:15:3 | f | File handle may be writable as a result of data flow from a $@ and closing it may result in data loss upon failure, which is not handled explicitly. | tests.go:32:15:32:78 | call to OpenFile | call to OpenFile | -| tests.go:15:3:15:3 | f | tests.go:46:5:46:76 | ... := ...[0] | tests.go:15:3:15:3 | f | File handle may be writable as a result of data flow from a $@ and closing it may result in data loss upon failure, which is not handled explicitly. | tests.go:46:15:46:76 | call to OpenFile | call to OpenFile | -| tests.go:57:3:57:3 | f | tests.go:55:5:55:78 | ... := ...[0] | tests.go:57:3:57:3 | f | File handle may be writable as a result of data flow from a $@ and closing it may result in data loss upon failure, which is not handled explicitly. | tests.go:55:15:55:78 | call to OpenFile | call to OpenFile | -| tests.go:69:3:69:3 | f | tests.go:67:5:67:76 | ... := ...[0] | tests.go:69:3:69:3 | f | File handle may be writable as a result of data flow from a $@ and closing it may result in data loss upon failure, which is not handled explicitly. | tests.go:67:15:67:76 | call to OpenFile | call to OpenFile | -| tests.go:126:9:126:9 | f | tests.go:124:5:124:78 | ... := ...[0] | tests.go:126:9:126:9 | f | File handle may be writable as a result of data flow from a $@ and closing it may result in data loss upon failure, which is not handled explicitly. | tests.go:124:15:124:78 | call to OpenFile | call to OpenFile | -| tests.go:145:3:145:3 | f | tests.go:141:5:141:78 | ... := ...[0] | tests.go:145:3:145:3 | f | File handle may be writable as a result of data flow from a $@ and closing it may result in data loss upon failure, which is not handled explicitly. | tests.go:141:15:141:78 | call to OpenFile | call to OpenFile | -| tests.go:166:8:166:8 | f | tests.go:162:2:162:74 | ... := ...[0] | tests.go:166:8:166:8 | f | File handle may be writable as a result of data flow from a $@ and closing it may result in data loss upon failure, which is not handled explicitly. | tests.go:162:12:162:74 | call to OpenFile | call to OpenFile | +| tests.go:10:8:10:8 | f | tests.go:32:5:32:78 | extract:0 ... := ... | tests.go:10:8:10:8 | f | File handle may be writable as a result of data flow from a $@ and closing it may result in data loss upon failure, which is not handled explicitly. | tests.go:32:15:32:78 | call to OpenFile | call to OpenFile | +| tests.go:10:8:10:8 | f | tests.go:46:5:46:76 | extract:0 ... := ... | tests.go:10:8:10:8 | f | File handle may be writable as a result of data flow from a $@ and closing it may result in data loss upon failure, which is not handled explicitly. | tests.go:46:15:46:76 | call to OpenFile | call to OpenFile | +| tests.go:15:3:15:3 | f | tests.go:32:5:32:78 | extract:0 ... := ... | tests.go:15:3:15:3 | f | File handle may be writable as a result of data flow from a $@ and closing it may result in data loss upon failure, which is not handled explicitly. | tests.go:32:15:32:78 | call to OpenFile | call to OpenFile | +| tests.go:15:3:15:3 | f | tests.go:46:5:46:76 | extract:0 ... := ... | tests.go:15:3:15:3 | f | File handle may be writable as a result of data flow from a $@ and closing it may result in data loss upon failure, which is not handled explicitly. | tests.go:46:15:46:76 | call to OpenFile | call to OpenFile | +| tests.go:57:3:57:3 | f | tests.go:55:5:55:78 | extract:0 ... := ... | tests.go:57:3:57:3 | f | File handle may be writable as a result of data flow from a $@ and closing it may result in data loss upon failure, which is not handled explicitly. | tests.go:55:15:55:78 | call to OpenFile | call to OpenFile | +| tests.go:69:3:69:3 | f | tests.go:67:5:67:76 | extract:0 ... := ... | tests.go:69:3:69:3 | f | File handle may be writable as a result of data flow from a $@ and closing it may result in data loss upon failure, which is not handled explicitly. | tests.go:67:15:67:76 | call to OpenFile | call to OpenFile | +| tests.go:126:9:126:9 | f | tests.go:124:5:124:78 | extract:0 ... := ... | tests.go:126:9:126:9 | f | File handle may be writable as a result of data flow from a $@ and closing it may result in data loss upon failure, which is not handled explicitly. | tests.go:124:15:124:78 | call to OpenFile | call to OpenFile | +| tests.go:145:3:145:3 | f | tests.go:141:5:141:78 | extract:0 ... := ... | tests.go:145:3:145:3 | f | File handle may be writable as a result of data flow from a $@ and closing it may result in data loss upon failure, which is not handled explicitly. | tests.go:141:15:141:78 | call to OpenFile | call to OpenFile | +| tests.go:166:8:166:8 | f | tests.go:162:2:162:74 | extract:0 ... := ... | tests.go:166:8:166:8 | f | File handle may be writable as a result of data flow from a $@ and closing it may result in data loss upon failure, which is not handled explicitly. | tests.go:162:12:162:74 | call to OpenFile | call to OpenFile | edges | tests.go:9:24:9:24 | SSA def(f) | tests.go:10:8:10:8 | f | provenance | | | tests.go:13:32:13:32 | SSA def(f) | tests.go:14:13:16:2 | SSA def(f) | provenance | | | tests.go:14:13:16:2 | SSA def(f) | tests.go:15:3:15:3 | f | provenance | | -| tests.go:32:5:32:78 | ... := ...[0] | tests.go:33:21:33:21 | f | provenance | Src:MaD:1 | -| tests.go:32:5:32:78 | ... := ...[0] | tests.go:34:29:34:29 | f | provenance | Src:MaD:1 | +| tests.go:32:5:32:78 | extract:0 ... := ... | tests.go:33:21:33:21 | f | provenance | Src:MaD:1 | +| tests.go:32:5:32:78 | extract:0 ... := ... | tests.go:34:29:34:29 | f | provenance | Src:MaD:1 | | tests.go:33:21:33:21 | f | tests.go:9:24:9:24 | SSA def(f) | provenance | | | tests.go:34:29:34:29 | f | tests.go:13:32:13:32 | SSA def(f) | provenance | | -| tests.go:46:5:46:76 | ... := ...[0] | tests.go:47:21:47:21 | f | provenance | Src:MaD:1 | -| tests.go:46:5:46:76 | ... := ...[0] | tests.go:48:29:48:29 | f | provenance | Src:MaD:1 | +| tests.go:46:5:46:76 | extract:0 ... := ... | tests.go:47:21:47:21 | f | provenance | Src:MaD:1 | +| tests.go:46:5:46:76 | extract:0 ... := ... | tests.go:48:29:48:29 | f | provenance | Src:MaD:1 | | tests.go:47:21:47:21 | f | tests.go:9:24:9:24 | SSA def(f) | provenance | | | tests.go:48:29:48:29 | f | tests.go:13:32:13:32 | SSA def(f) | provenance | | -| tests.go:55:5:55:78 | ... := ...[0] | tests.go:57:3:57:3 | f | provenance | Src:MaD:1 | -| tests.go:67:5:67:76 | ... := ...[0] | tests.go:69:3:69:3 | f | provenance | Src:MaD:1 | -| tests.go:124:5:124:78 | ... := ...[0] | tests.go:126:9:126:9 | f | provenance | Src:MaD:1 | -| tests.go:141:5:141:78 | ... := ...[0] | tests.go:145:3:145:3 | f | provenance | Src:MaD:1 | -| tests.go:162:2:162:74 | ... := ...[0] | tests.go:166:8:166:8 | f | provenance | Src:MaD:1 | +| tests.go:55:5:55:78 | extract:0 ... := ... | tests.go:57:3:57:3 | f | provenance | Src:MaD:1 | +| tests.go:67:5:67:76 | extract:0 ... := ... | tests.go:69:3:69:3 | f | provenance | Src:MaD:1 | +| tests.go:124:5:124:78 | extract:0 ... := ... | tests.go:126:9:126:9 | f | provenance | Src:MaD:1 | +| tests.go:141:5:141:78 | extract:0 ... := ... | tests.go:145:3:145:3 | f | provenance | Src:MaD:1 | +| tests.go:162:2:162:74 | extract:0 ... := ... | tests.go:166:8:166:8 | f | provenance | Src:MaD:1 | models | 1 | Source: os; ; false; OpenFile; ; ; ReturnValue[0]; file; manual | nodes @@ -33,20 +33,20 @@ nodes | tests.go:13:32:13:32 | SSA def(f) | semmle.label | SSA def(f) | | tests.go:14:13:16:2 | SSA def(f) | semmle.label | SSA def(f) | | tests.go:15:3:15:3 | f | semmle.label | f | -| tests.go:32:5:32:78 | ... := ...[0] | semmle.label | ... := ...[0] | +| tests.go:32:5:32:78 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | tests.go:33:21:33:21 | f | semmle.label | f | | tests.go:34:29:34:29 | f | semmle.label | f | -| tests.go:46:5:46:76 | ... := ...[0] | semmle.label | ... := ...[0] | +| tests.go:46:5:46:76 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | tests.go:47:21:47:21 | f | semmle.label | f | | tests.go:48:29:48:29 | f | semmle.label | f | -| tests.go:55:5:55:78 | ... := ...[0] | semmle.label | ... := ...[0] | +| tests.go:55:5:55:78 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | tests.go:57:3:57:3 | f | semmle.label | f | -| tests.go:67:5:67:76 | ... := ...[0] | semmle.label | ... := ...[0] | +| tests.go:67:5:67:76 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | tests.go:69:3:69:3 | f | semmle.label | f | -| tests.go:124:5:124:78 | ... := ...[0] | semmle.label | ... := ...[0] | +| tests.go:124:5:124:78 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | tests.go:126:9:126:9 | f | semmle.label | f | -| tests.go:141:5:141:78 | ... := ...[0] | semmle.label | ... := ...[0] | +| tests.go:141:5:141:78 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | tests.go:145:3:145:3 | f | semmle.label | f | -| tests.go:162:2:162:74 | ... := ...[0] | semmle.label | ... := ...[0] | +| tests.go:162:2:162:74 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | tests.go:166:8:166:8 | f | semmle.label | f | subpaths diff --git a/go/ql/test/query-tests/RedundantCode/DeadStoreOfField/DeadStoreOfField.expected b/go/ql/test/query-tests/RedundantCode/DeadStoreOfField/DeadStoreOfField.expected index 68935b96eca4..1041d7138f7d 100644 --- a/go/ql/test/query-tests/RedundantCode/DeadStoreOfField/DeadStoreOfField.expected +++ b/go/ql/test/query-tests/RedundantCode/DeadStoreOfField/DeadStoreOfField.expected @@ -1 +1 @@ -| DeadStoreOfField.go:8:2:8:6 | assignment to field val | This assignment to val is useless since its value is never read. | +| DeadStoreOfField.go:8:2:8:10 | assign:0 ... = ... | This assignment to val is useless since its value is never read. | diff --git a/go/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/DeadStoreOfLocal.expected b/go/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/DeadStoreOfLocal.expected index 5b2010251ef7..a2a04d01188a 100644 --- a/go/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/DeadStoreOfLocal.expected +++ b/go/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/DeadStoreOfLocal.expected @@ -1,30 +1,30 @@ -| main.go:25:2:25:2 | assignment to x | This definition of x is never used. | -| testdata.go:32:2:32:2 | assignment to x | This definition of x is never used. | -| testdata.go:37:2:37:2 | assignment to x | This definition of x is never used. | -| testdata.go:61:2:61:2 | assignment to x | This definition of x is never used. | -| testdata.go:67:2:67:2 | assignment to x | This definition of x is never used. | -| testdata.go:99:2:99:2 | assignment to x | This definition of x is never used. | -| testdata.go:101:3:101:3 | assignment to x | This definition of x is never used. | -| testdata.go:108:2:108:2 | assignment to x | This definition of x is never used. | -| testdata.go:110:3:110:3 | assignment to x | This definition of x is never used. | -| testdata.go:128:2:128:2 | assignment to x | This definition of x is never used. | -| testdata.go:130:3:130:3 | assignment to x | This definition of x is never used. | -| testdata.go:131:3:131:3 | assignment to x | This definition of x is never used. | -| testdata.go:134:3:134:3 | assignment to x | This definition of x is never used. | -| testdata.go:143:3:143:3 | assignment to x | This definition of x is never used. | -| testdata.go:164:3:164:3 | assignment to x | This definition of x is never used. | -| testdata.go:172:3:172:3 | assignment to x | This definition of x is never used. | +| main.go:25:2:25:16 | assign:0 ... = ... | This definition of x is never used. | +| testdata.go:32:2:32:16 | assign:0 ... = ... | This definition of x is never used. | +| testdata.go:37:2:37:16 | assign:0 ... = ... | This definition of x is never used. | +| testdata.go:61:2:61:18 | assign:0 ... := ... | This definition of x is never used. | +| testdata.go:67:2:67:17 | assign:0 ... := ... | This definition of x is never used. | +| testdata.go:99:2:99:17 | assign:0 ... := ... | This definition of x is never used. | +| testdata.go:101:3:101:17 | assign:0 ... = ... | This definition of x is never used. | +| testdata.go:108:2:108:17 | assign:0 ... := ... | This definition of x is never used. | +| testdata.go:110:3:110:17 | assign:0 ... = ... | This definition of x is never used. | +| testdata.go:128:2:128:17 | assign:0 ... := ... | This definition of x is never used. | +| testdata.go:130:3:130:17 | assign:0 ... = ... | This definition of x is never used. | +| testdata.go:131:3:131:17 | assign:0 ... = ... | This definition of x is never used. | +| testdata.go:134:3:134:17 | assign:0 ... = ... | This definition of x is never used. | +| testdata.go:143:3:143:17 | assign:0 ... = ... | This definition of x is never used. | +| testdata.go:164:3:164:17 | assign:0 ... = ... | This definition of x is never used. | +| testdata.go:172:3:172:18 | assign:0 ... += ... | This definition of x is never used. | | testdata.go:180:3:180:5 | increment statement | This definition of x is never used. | -| testdata.go:201:2:201:2 | assignment to x | This definition of x is never used. | -| testdata.go:262:2:262:2 | assignment to x | This definition of x is never used. | -| testdata.go:268:2:268:2 | assignment to x | This definition of x is never used. | -| testdata.go:309:2:309:2 | assignment to a | This definition of a is never used. | -| testdata.go:321:2:321:2 | assignment to a | This definition of a is never used. | -| testdata.go:387:3:387:3 | assignment to x | This definition of x is never used. | -| testdata.go:432:3:432:3 | assignment to x | This definition of x is never used. | -| testdata.go:434:3:434:3 | assignment to x | This definition of x is never used. | -| testdata.go:441:2:441:2 | assignment to x | This definition of x is never used. | -| testdata.go:488:3:488:3 | assignment to x | This definition of x is never used. | -| testdata.go:542:3:542:3 | assignment to x | This definition of x is never used. | -| testdata.go:580:4:580:4 | assignment to x | This definition of x is never used. | -| testdata.go:629:3:629:4 | assignment to v1 | This definition of v1 is never used. | +| testdata.go:201:2:201:24 | assign:0 ... = ... | This definition of x is never used. | +| testdata.go:262:2:262:16 | assign:0 ... = ... | This definition of x is never used. | +| testdata.go:268:2:268:16 | assign:0 ... = ... | This definition of x is never used. | +| testdata.go:309:2:309:7 | assign:0 ... /= ... | This definition of a is never used. | +| testdata.go:321:2:321:7 | assign:0 ... %= ... | This definition of a is never used. | +| testdata.go:387:3:387:17 | assign:0 ... = ... | This definition of x is never used. | +| testdata.go:432:3:432:17 | assign:0 ... = ... | This definition of x is never used. | +| testdata.go:434:3:434:17 | assign:0 ... = ... | This definition of x is never used. | +| testdata.go:441:2:441:17 | assign:0 ... := ... | This definition of x is never used. | +| testdata.go:488:3:488:17 | assign:0 ... = ... | This definition of x is never used. | +| testdata.go:542:3:542:17 | assign:0 ... = ... | This definition of x is never used. | +| testdata.go:580:4:580:18 | assign:0 ... = ... | This definition of x is never used. | +| testdata.go:629:3:629:16 | assign:0 ... = ... | This definition of v1 is never used. | diff --git a/go/ql/test/query-tests/Security/CWE-020/IncompleteHostnameRegexp/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-020/IncompleteHostnameRegexp/CONSISTENCY/DataFlowConsistency.expected index 1861fe5d2b9d..5290b84ea889 100644 --- a/go/ql/test/query-tests/Security/CWE-020/IncompleteHostnameRegexp/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/query-tests/Security/CWE-020/IncompleteHostnameRegexp/CONSISTENCY/DataFlowConsistency.expected @@ -1,5 +1,5 @@ reverseRead -| IncompleteHostnameRegexp.go:12:42:12:44 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| IncompleteHostnameRegexpGood2.go:12:42:12:44 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| IncompleteHostnameRegexpGood.go:12:42:12:44 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| main.go:18:57:18:57 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| IncompleteHostnameRegexp.go:12:42:12:44 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| IncompleteHostnameRegexpGood2.go:12:42:12:44 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| IncompleteHostnameRegexpGood.go:12:42:12:44 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| main.go:18:57:18:57 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-020/MissingRegexpAnchor/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-020/MissingRegexpAnchor/CONSISTENCY/DataFlowConsistency.expected index a9e0caae7699..16052a78564a 100644 --- a/go/ql/test/query-tests/Security/CWE-020/MissingRegexpAnchor/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/query-tests/Security/CWE-020/MissingRegexpAnchor/CONSISTENCY/DataFlowConsistency.expected @@ -1,3 +1,3 @@ reverseRead -| MissingRegexpAnchor.go:12:42:12:44 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| MissingRegexpAnchorGood.go:12:42:12:44 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| MissingRegexpAnchor.go:12:42:12:44 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| MissingRegexpAnchorGood.go:12:42:12:44 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-022/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-022/CONSISTENCY/DataFlowConsistency.expected index 69de1fc20fd4..9f47590b9448 100644 --- a/go/ql/test/query-tests/Security/CWE-022/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/query-tests/Security/CWE-022/CONSISTENCY/DataFlowConsistency.expected @@ -1,3 +1,3 @@ reverseRead -| TaintedPath.go:15:18:15:18 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| TaintedPath.go:15:18:15:18 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | | TaintedPath.go:84:28:84:32 | files | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-022/TaintedPath.expected b/go/ql/test/query-tests/Security/CWE-022/TaintedPath.expected index 851ed3533ae9..ecb64813d4c4 100644 --- a/go/ql/test/query-tests/Security/CWE-022/TaintedPath.expected +++ b/go/ql/test/query-tests/Security/CWE-022/TaintedPath.expected @@ -12,8 +12,8 @@ edges | TaintedPath.go:22:57:22:68 | tainted_path | TaintedPath.go:26:63:26:74 | tainted_path | provenance | | | TaintedPath.go:22:57:22:68 | tainted_path | TaintedPath.go:43:29:43:40 | tainted_path | provenance | Sink:MaD:1 | | TaintedPath.go:22:57:22:68 | tainted_path | TaintedPath.go:74:39:74:56 | ...+... | provenance | | -| TaintedPath.go:26:2:26:75 | ... := ...[0] | TaintedPath.go:27:28:27:45 | sanitized_filepath | provenance | Sink:MaD:1 | -| TaintedPath.go:26:63:26:74 | tainted_path | TaintedPath.go:26:2:26:75 | ... := ...[0] | provenance | MaD:4 | +| TaintedPath.go:26:2:26:75 | extract:0 ... := ... | TaintedPath.go:27:28:27:45 | sanitized_filepath | provenance | Sink:MaD:1 | +| TaintedPath.go:26:63:26:74 | tainted_path | TaintedPath.go:26:2:26:75 | extract:0 ... := ... | provenance | MaD:4 | | TaintedPath.go:74:39:74:56 | ...+... | TaintedPath.go:74:28:74:57 | call to Clean | provenance | MaD:5 Sink:MaD:1 | models | 1 | Sink: io/ioutil; ; false; ReadFile; ; ; Argument[0]; path-injection; manual | @@ -27,7 +27,7 @@ nodes | TaintedPath.go:18:29:18:40 | tainted_path | semmle.label | tainted_path | | TaintedPath.go:22:28:22:69 | call to Join | semmle.label | call to Join | | TaintedPath.go:22:57:22:68 | tainted_path | semmle.label | tainted_path | -| TaintedPath.go:26:2:26:75 | ... := ...[0] | semmle.label | ... := ...[0] | +| TaintedPath.go:26:2:26:75 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | TaintedPath.go:26:63:26:74 | tainted_path | semmle.label | tainted_path | | TaintedPath.go:27:28:27:45 | sanitized_filepath | semmle.label | sanitized_filepath | | TaintedPath.go:43:29:43:40 | tainted_path | semmle.label | tainted_path | diff --git a/go/ql/test/query-tests/Security/CWE-022/ZipSlip.expected b/go/ql/test/query-tests/Security/CWE-022/ZipSlip.expected index 88f1666af3b9..27e6349070c4 100644 --- a/go/ql/test/query-tests/Security/CWE-022/ZipSlip.expected +++ b/go/ql/test/query-tests/Security/CWE-022/ZipSlip.expected @@ -1,27 +1,27 @@ #select -| UnsafeUnzipSymlinkGood.go:72:3:72:25 | ... := ...[0] | UnsafeUnzipSymlinkGood.go:72:3:72:25 | ... := ...[0] | UnsafeUnzipSymlinkGood.go:61:31:61:62 | call to Join | Unsanitized archive entry, which may contain '..', is used in a $@. | UnsafeUnzipSymlinkGood.go:61:31:61:62 | call to Join | file system operation | -| ZipSlip.go:11:2:15:2 | range statement[1] | ZipSlip.go:11:2:15:2 | range statement[1] | ZipSlip.go:14:20:14:20 | p | Unsanitized archive entry, which may contain '..', is used in a $@. | ZipSlip.go:14:20:14:20 | p | file system operation | -| tarslip.go:15:2:15:30 | ... := ...[0] | tarslip.go:15:2:15:30 | ... := ...[0] | tarslip.go:16:14:16:34 | call to Dir | Unsanitized archive entry, which may contain '..', is used in a $@. | tarslip.go:16:14:16:34 | call to Dir | file system operation | -| tst.go:23:2:43:2 | range statement[1] | tst.go:23:2:43:2 | range statement[1] | tst.go:27:21:27:48 | call to Join | Unsanitized archive entry, which may contain '..', is used in a $@. | tst.go:27:21:27:48 | call to Join | file system operation | -| tst.go:23:2:43:2 | range statement[1] | tst.go:23:2:43:2 | range statement[1] | tst.go:29:20:29:23 | path | Unsanitized archive entry, which may contain '..', is used in a $@. | tst.go:29:20:29:23 | path | file system operation | -| tst.go:23:2:43:2 | range statement[1] | tst.go:23:2:43:2 | range statement[1] | tst.go:31:21:31:24 | path | Unsanitized archive entry, which may contain '..', is used in a $@. | tst.go:31:21:31:24 | path | file system operation | +| UnsafeUnzipSymlinkGood.go:72:3:72:25 | extract:0 ... := ... | UnsafeUnzipSymlinkGood.go:72:3:72:25 | extract:0 ... := ... | UnsafeUnzipSymlinkGood.go:61:31:61:62 | call to Join | Unsanitized archive entry, which may contain '..', is used in a $@. | UnsafeUnzipSymlinkGood.go:61:31:61:62 | call to Join | file system operation | +| ZipSlip.go:11:2:15:2 | extract:1 range statement | ZipSlip.go:11:2:15:2 | extract:1 range statement | ZipSlip.go:14:20:14:20 | p | Unsanitized archive entry, which may contain '..', is used in a $@. | ZipSlip.go:14:20:14:20 | p | file system operation | +| tarslip.go:15:2:15:30 | extract:0 ... := ... | tarslip.go:15:2:15:30 | extract:0 ... := ... | tarslip.go:16:14:16:34 | call to Dir | Unsanitized archive entry, which may contain '..', is used in a $@. | tarslip.go:16:14:16:34 | call to Dir | file system operation | +| tst.go:23:2:43:2 | extract:1 range statement | tst.go:23:2:43:2 | extract:1 range statement | tst.go:27:21:27:48 | call to Join | Unsanitized archive entry, which may contain '..', is used in a $@. | tst.go:27:21:27:48 | call to Join | file system operation | +| tst.go:23:2:43:2 | extract:1 range statement | tst.go:23:2:43:2 | extract:1 range statement | tst.go:29:20:29:23 | path | Unsanitized archive entry, which may contain '..', is used in a $@. | tst.go:29:20:29:23 | path | file system operation | +| tst.go:23:2:43:2 | extract:1 range statement | tst.go:23:2:43:2 | extract:1 range statement | tst.go:31:21:31:24 | path | Unsanitized archive entry, which may contain '..', is used in a $@. | tst.go:31:21:31:24 | path | file system operation | edges | UnsafeUnzipSymlinkGood.go:52:24:52:32 | SSA def(candidate) | UnsafeUnzipSymlinkGood.go:61:53:61:61 | candidate | provenance | | | UnsafeUnzipSymlinkGood.go:61:53:61:61 | candidate | UnsafeUnzipSymlinkGood.go:61:31:61:62 | call to Join | provenance | FunctionModel Sink:MaD:3 | -| UnsafeUnzipSymlinkGood.go:72:3:72:25 | ... := ...[0] | UnsafeUnzipSymlinkGood.go:76:24:76:38 | selection of Linkname | provenance | | -| UnsafeUnzipSymlinkGood.go:72:3:72:25 | ... := ...[0] | UnsafeUnzipSymlinkGood.go:76:70:76:80 | selection of Name | provenance | | +| UnsafeUnzipSymlinkGood.go:72:3:72:25 | extract:0 ... := ... | UnsafeUnzipSymlinkGood.go:76:24:76:38 | selection of Linkname | provenance | | +| UnsafeUnzipSymlinkGood.go:72:3:72:25 | extract:0 ... := ... | UnsafeUnzipSymlinkGood.go:76:70:76:80 | selection of Name | provenance | | | UnsafeUnzipSymlinkGood.go:76:24:76:38 | selection of Linkname | UnsafeUnzipSymlinkGood.go:52:24:52:32 | SSA def(candidate) | provenance | | | UnsafeUnzipSymlinkGood.go:76:70:76:80 | selection of Name | UnsafeUnzipSymlinkGood.go:52:24:52:32 | SSA def(candidate) | provenance | | -| ZipSlip.go:11:2:15:2 | range statement[1] | ZipSlip.go:12:24:12:29 | selection of Name | provenance | | -| ZipSlip.go:12:3:12:30 | ... := ...[0] | ZipSlip.go:14:20:14:20 | p | provenance | Sink:MaD:1 | -| ZipSlip.go:12:24:12:29 | selection of Name | ZipSlip.go:12:3:12:30 | ... := ...[0] | provenance | MaD:4 | -| tarslip.go:15:2:15:30 | ... := ...[0] | tarslip.go:16:23:16:33 | selection of Name | provenance | | +| ZipSlip.go:11:2:15:2 | extract:1 range statement | ZipSlip.go:12:24:12:29 | selection of Name | provenance | | +| ZipSlip.go:12:3:12:30 | extract:0 ... := ... | ZipSlip.go:14:20:14:20 | p | provenance | Sink:MaD:1 | +| ZipSlip.go:12:24:12:29 | selection of Name | ZipSlip.go:12:3:12:30 | extract:0 ... := ... | provenance | MaD:4 | +| tarslip.go:15:2:15:30 | extract:0 ... := ... | tarslip.go:16:23:16:33 | selection of Name | provenance | | | tarslip.go:16:23:16:33 | selection of Name | tarslip.go:16:14:16:34 | call to Dir | provenance | MaD:6 Sink:MaD:2 | -| tst.go:23:2:43:2 | range statement[1] | tst.go:25:38:25:41 | path | provenance | | -| tst.go:23:2:43:2 | range statement[1] | tst.go:29:20:29:23 | path | provenance | Sink:MaD:1 | -| tst.go:23:2:43:2 | range statement[1] | tst.go:31:21:31:24 | path | provenance | Sink:MaD:1 | -| tst.go:25:3:25:42 | ... := ...[0] | tst.go:27:41:27:47 | relpath | provenance | | -| tst.go:25:38:25:41 | path | tst.go:25:3:25:42 | ... := ...[0] | provenance | MaD:5 | +| tst.go:23:2:43:2 | extract:1 range statement | tst.go:25:38:25:41 | path | provenance | | +| tst.go:23:2:43:2 | extract:1 range statement | tst.go:29:20:29:23 | path | provenance | Sink:MaD:1 | +| tst.go:23:2:43:2 | extract:1 range statement | tst.go:31:21:31:24 | path | provenance | Sink:MaD:1 | +| tst.go:25:3:25:42 | extract:0 ... := ... | tst.go:27:41:27:47 | relpath | provenance | | +| tst.go:25:38:25:41 | path | tst.go:25:3:25:42 | extract:0 ... := ... | provenance | MaD:5 | | tst.go:27:41:27:47 | relpath | tst.go:27:21:27:48 | call to Join | provenance | FunctionModel Sink:MaD:1 | models | 1 | Sink: io/ioutil; ; false; WriteFile; ; ; Argument[0]; path-injection; manual | @@ -34,18 +34,18 @@ nodes | UnsafeUnzipSymlinkGood.go:52:24:52:32 | SSA def(candidate) | semmle.label | SSA def(candidate) | | UnsafeUnzipSymlinkGood.go:61:31:61:62 | call to Join | semmle.label | call to Join | | UnsafeUnzipSymlinkGood.go:61:53:61:61 | candidate | semmle.label | candidate | -| UnsafeUnzipSymlinkGood.go:72:3:72:25 | ... := ...[0] | semmle.label | ... := ...[0] | +| UnsafeUnzipSymlinkGood.go:72:3:72:25 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | UnsafeUnzipSymlinkGood.go:76:24:76:38 | selection of Linkname | semmle.label | selection of Linkname | | UnsafeUnzipSymlinkGood.go:76:70:76:80 | selection of Name | semmle.label | selection of Name | -| ZipSlip.go:11:2:15:2 | range statement[1] | semmle.label | range statement[1] | -| ZipSlip.go:12:3:12:30 | ... := ...[0] | semmle.label | ... := ...[0] | +| ZipSlip.go:11:2:15:2 | extract:1 range statement | semmle.label | extract:1 range statement | +| ZipSlip.go:12:3:12:30 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | ZipSlip.go:12:24:12:29 | selection of Name | semmle.label | selection of Name | | ZipSlip.go:14:20:14:20 | p | semmle.label | p | -| tarslip.go:15:2:15:30 | ... := ...[0] | semmle.label | ... := ...[0] | +| tarslip.go:15:2:15:30 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | tarslip.go:16:14:16:34 | call to Dir | semmle.label | call to Dir | | tarslip.go:16:23:16:33 | selection of Name | semmle.label | selection of Name | -| tst.go:23:2:43:2 | range statement[1] | semmle.label | range statement[1] | -| tst.go:25:3:25:42 | ... := ...[0] | semmle.label | ... := ...[0] | +| tst.go:23:2:43:2 | extract:1 range statement | semmle.label | extract:1 range statement | +| tst.go:25:3:25:42 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | tst.go:25:38:25:41 | path | semmle.label | path | | tst.go:27:21:27:48 | call to Join | semmle.label | call to Join | | tst.go:27:41:27:47 | relpath | semmle.label | relpath | diff --git a/go/ql/test/query-tests/Security/CWE-078/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-078/CONSISTENCY/DataFlowConsistency.expected index 51645e40047a..4a35d9f88b96 100644 --- a/go/ql/test/query-tests/Security/CWE-078/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/query-tests/Security/CWE-078/CONSISTENCY/DataFlowConsistency.expected @@ -1,11 +1,11 @@ reverseRead -| ArgumentInjection.go:9:10:9:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| CommandInjection2.go:13:15:13:17 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| CommandInjection2.go:21:15:21:17 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| CommandInjection2.go:41:15:41:17 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| CommandInjection.go:9:13:9:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| GitSubcommands.go:11:13:11:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| GitSubcommands.go:22:13:22:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| GitSubcommands.go:33:13:33:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| SanitizingDoubleDash.go:9:13:9:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| SanitizingDoubleDash.go:92:13:92:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| ArgumentInjection.go:9:10:9:12 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| CommandInjection2.go:13:15:13:17 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| CommandInjection2.go:21:15:21:17 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| CommandInjection2.go:41:15:41:17 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| CommandInjection.go:9:13:9:15 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| GitSubcommands.go:11:13:11:15 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| GitSubcommands.go:22:13:22:15 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| GitSubcommands.go:33:13:33:15 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| SanitizingDoubleDash.go:9:13:9:15 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| SanitizingDoubleDash.go:92:13:92:15 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-078/CommandInjection.expected b/go/ql/test/query-tests/Security/CWE-078/CommandInjection.expected index b029c6d2b849..2c0e30f02e47 100644 --- a/go/ql/test/query-tests/Security/CWE-078/CommandInjection.expected +++ b/go/ql/test/query-tests/Security/CWE-078/CommandInjection.expected @@ -48,14 +48,14 @@ edges | GitSubcommands.go:11:13:11:27 | call to Query | GitSubcommands.go:17:36:17:42 | tainted | provenance | | | GitSubcommands.go:33:13:33:19 | selection of URL | GitSubcommands.go:33:13:33:27 | call to Query | provenance | Src:MaD:2 MaD:7 | | GitSubcommands.go:33:13:33:27 | call to Query | GitSubcommands.go:38:32:38:38 | tainted | provenance | | -| SanitizingDoubleDash.go:9:2:9:8 | SSA def(tainted) | SanitizingDoubleDash.go:13:25:13:31 | tainted | provenance | | -| SanitizingDoubleDash.go:9:2:9:8 | SSA def(tainted) | SanitizingDoubleDash.go:14:23:14:33 | slice expression | provenance | | -| SanitizingDoubleDash.go:9:2:9:8 | SSA def(tainted) | SanitizingDoubleDash.go:39:31:39:37 | tainted | provenance | Config | -| SanitizingDoubleDash.go:9:2:9:8 | SSA def(tainted) | SanitizingDoubleDash.go:52:24:52:30 | tainted | provenance | Config | -| SanitizingDoubleDash.go:9:2:9:8 | SSA def(tainted) | SanitizingDoubleDash.go:68:31:68:37 | tainted | provenance | Config | -| SanitizingDoubleDash.go:9:2:9:8 | SSA def(tainted) | SanitizingDoubleDash.go:80:23:80:29 | tainted | provenance | Config | +| SanitizingDoubleDash.go:9:2:9:37 | SSA def(tainted) | SanitizingDoubleDash.go:13:25:13:31 | tainted | provenance | | +| SanitizingDoubleDash.go:9:2:9:37 | SSA def(tainted) | SanitizingDoubleDash.go:14:23:14:33 | slice expression | provenance | | +| SanitizingDoubleDash.go:9:2:9:37 | SSA def(tainted) | SanitizingDoubleDash.go:39:31:39:37 | tainted | provenance | Config | +| SanitizingDoubleDash.go:9:2:9:37 | SSA def(tainted) | SanitizingDoubleDash.go:52:24:52:30 | tainted | provenance | Config | +| SanitizingDoubleDash.go:9:2:9:37 | SSA def(tainted) | SanitizingDoubleDash.go:68:31:68:37 | tainted | provenance | Config | +| SanitizingDoubleDash.go:9:2:9:37 | SSA def(tainted) | SanitizingDoubleDash.go:80:23:80:29 | tainted | provenance | Config | | SanitizingDoubleDash.go:9:13:9:19 | selection of URL | SanitizingDoubleDash.go:9:13:9:27 | call to Query | provenance | Src:MaD:2 MaD:7 | -| SanitizingDoubleDash.go:9:13:9:27 | call to Query | SanitizingDoubleDash.go:9:2:9:8 | SSA def(tainted) | provenance | | +| SanitizingDoubleDash.go:9:13:9:27 | call to Query | SanitizingDoubleDash.go:9:2:9:37 | SSA def(tainted) | provenance | | | SanitizingDoubleDash.go:13:15:13:32 | array literal [array] | SanitizingDoubleDash.go:14:23:14:30 | arrayLit [array] | provenance | | | SanitizingDoubleDash.go:13:25:13:31 | tainted | SanitizingDoubleDash.go:13:15:13:32 | array literal [array] | provenance | | | SanitizingDoubleDash.go:14:23:14:30 | arrayLit [array] | SanitizingDoubleDash.go:14:23:14:33 | slice element node | provenance | | @@ -181,7 +181,7 @@ nodes | GitSubcommands.go:33:13:33:19 | selection of URL | semmle.label | selection of URL | | GitSubcommands.go:33:13:33:27 | call to Query | semmle.label | call to Query | | GitSubcommands.go:38:32:38:38 | tainted | semmle.label | tainted | -| SanitizingDoubleDash.go:9:2:9:8 | SSA def(tainted) | semmle.label | SSA def(tainted) | +| SanitizingDoubleDash.go:9:2:9:37 | SSA def(tainted) | semmle.label | SSA def(tainted) | | SanitizingDoubleDash.go:9:13:9:19 | selection of URL | semmle.label | selection of URL | | SanitizingDoubleDash.go:9:13:9:27 | call to Query | semmle.label | call to Query | | SanitizingDoubleDash.go:13:15:13:32 | array literal [array] | semmle.label | array literal [array] | diff --git a/go/ql/test/query-tests/Security/CWE-078/StoredCommand.expected b/go/ql/test/query-tests/Security/CWE-078/StoredCommand.expected index 809f5c20976b..d7f1ecd08652 100644 --- a/go/ql/test/query-tests/Security/CWE-078/StoredCommand.expected +++ b/go/ql/test/query-tests/Security/CWE-078/StoredCommand.expected @@ -1,14 +1,14 @@ #select -| StoredCommand.go:14:22:14:28 | cmdName | StoredCommand.go:11:2:11:27 | ... := ...[0] | StoredCommand.go:14:22:14:28 | cmdName | This command depends on a $@. | StoredCommand.go:11:2:11:27 | ... := ...[0] | stored value | +| StoredCommand.go:14:22:14:28 | cmdName | StoredCommand.go:11:2:11:27 | extract:0 ... := ... | StoredCommand.go:14:22:14:28 | cmdName | This command depends on a $@. | StoredCommand.go:11:2:11:27 | extract:0 ... := ... | stored value | edges -| StoredCommand.go:11:2:11:27 | ... := ...[0] | StoredCommand.go:13:2:13:5 | rows | provenance | Src:MaD:2 | +| StoredCommand.go:11:2:11:27 | extract:0 ... := ... | StoredCommand.go:13:2:13:5 | rows | provenance | Src:MaD:2 | | StoredCommand.go:13:2:13:5 | rows | StoredCommand.go:13:12:13:19 | &... [postupdate] | provenance | FunctionModel | | StoredCommand.go:13:12:13:19 | &... [postupdate] | StoredCommand.go:14:22:14:28 | cmdName | provenance | Sink:MaD:1 | models | 1 | Sink: os/exec; ; false; Command; ; ; Argument[0]; command-injection; manual | | 2 | Source: database/sql; DB; true; Query; ; ; ReturnValue[0]; database; manual | nodes -| StoredCommand.go:11:2:11:27 | ... := ...[0] | semmle.label | ... := ...[0] | +| StoredCommand.go:11:2:11:27 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | StoredCommand.go:13:2:13:5 | rows | semmle.label | rows | | StoredCommand.go:13:12:13:19 | &... [postupdate] | semmle.label | &... [postupdate] | | StoredCommand.go:14:22:14:28 | cmdName | semmle.label | cmdName | diff --git a/go/ql/test/query-tests/Security/CWE-079/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-079/CONSISTENCY/DataFlowConsistency.expected index 0b22e7c6251b..4c53dfb2b800 100644 --- a/go/ql/test/query-tests/Security/CWE-079/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/query-tests/Security/CWE-079/CONSISTENCY/DataFlowConsistency.expected @@ -1,21 +1,21 @@ reverseRead -| HtmlTemplateEscapingBypassXss.go:99:9:99:9 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| ReflectedXss.go:11:15:11:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| ReflectedXssGood.go:15:15:15:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| contenttype.go:11:11:11:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| contenttype.go:25:11:25:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| contenttype.go:39:11:39:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| contenttype.go:49:11:49:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| contenttype.go:61:11:61:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| contenttype.go:71:11:71:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| contenttype.go:86:11:86:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| contenttype.go:98:11:98:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| contenttype.go:111:11:111:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| HtmlTemplateEscapingBypassXss.go:99:9:99:9 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| ReflectedXss.go:11:15:11:15 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| ReflectedXssGood.go:15:15:15:15 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| contenttype.go:11:11:11:11 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| contenttype.go:25:11:25:11 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| contenttype.go:39:11:39:11 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| contenttype.go:49:11:49:11 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| contenttype.go:61:11:61:11 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| contenttype.go:71:11:71:11 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| contenttype.go:86:11:86:11 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| contenttype.go:98:11:98:11 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| contenttype.go:111:11:111:11 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | | reflectedxsstest.go:15:13:15:13 | r | Origin of readStep is missing a PostUpdateNode. | | reflectedxsstest.go:21:13:21:13 | r | Origin of readStep is missing a PostUpdateNode. | | reflectedxsstest.go:51:14:51:14 | r | Origin of readStep is missing a PostUpdateNode. | -| tst.go:14:15:14:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| tst.go:33:15:33:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| tst.go:48:14:48:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| tst.go:66:15:66:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| websocketXss.go:26:9:26:9 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| tst.go:14:15:14:15 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| tst.go:33:15:33:15 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| tst.go:48:14:48:14 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| tst.go:66:15:66:15 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| websocketXss.go:26:9:26:9 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-079/ReflectedXss.expected b/go/ql/test/query-tests/Security/CWE-079/ReflectedXss.expected index cee1acc74d80..d388a119214f 100644 --- a/go/ql/test/query-tests/Security/CWE-079/ReflectedXss.expected +++ b/go/ql/test/query-tests/Security/CWE-079/ReflectedXss.expected @@ -6,19 +6,19 @@ | contenttype.go:79:11:79:14 | data | contenttype.go:73:10:73:28 | call to FormValue | contenttype.go:79:11:79:14 | data | Cross-site scripting vulnerability due to $@. | contenttype.go:73:10:73:28 | call to FormValue | user-provided value | contenttype.go:0:0:0:0 | contenttype.go | | | contenttype.go:91:4:91:7 | data | contenttype.go:88:10:88:28 | call to FormValue | contenttype.go:91:4:91:7 | data | Cross-site scripting vulnerability due to $@. | contenttype.go:88:10:88:28 | call to FormValue | user-provided value | contenttype.go:0:0:0:0 | contenttype.go | | | contenttype.go:114:50:114:53 | data | contenttype.go:113:10:113:28 | call to FormValue | contenttype.go:114:50:114:53 | data | Cross-site scripting vulnerability due to $@. | contenttype.go:113:10:113:28 | call to FormValue | user-provided value | contenttype.go:0:0:0:0 | contenttype.go | | -| reflectedxsstest.go:33:10:33:57 | type conversion | reflectedxsstest.go:30:2:30:44 | ... := ...[0] | reflectedxsstest.go:33:10:33:57 | type conversion | Cross-site scripting vulnerability due to $@. | reflectedxsstest.go:30:2:30:44 | ... := ...[0] | user-provided value | reflectedxsstest.go:0:0:0:0 | reflectedxsstest.go | | -| reflectedxsstest.go:34:10:34:62 | type conversion | reflectedxsstest.go:30:2:30:44 | ... := ...[1] | reflectedxsstest.go:34:10:34:62 | type conversion | Cross-site scripting vulnerability due to $@. | reflectedxsstest.go:30:2:30:44 | ... := ...[1] | user-provided value | reflectedxsstest.go:0:0:0:0 | reflectedxsstest.go | | -| reflectedxsstest.go:44:10:44:55 | type conversion | reflectedxsstest.go:38:2:38:35 | ... := ...[0] | reflectedxsstest.go:44:10:44:55 | type conversion | Cross-site scripting vulnerability due to $@. | reflectedxsstest.go:38:2:38:35 | ... := ...[0] | user-provided value | reflectedxsstest.go:0:0:0:0 | reflectedxsstest.go | | -| reflectedxsstest.go:45:10:45:18 | byteSlice | reflectedxsstest.go:38:2:38:35 | ... := ...[0] | reflectedxsstest.go:45:10:45:18 | byteSlice | Cross-site scripting vulnerability due to $@. | reflectedxsstest.go:38:2:38:35 | ... := ...[0] | user-provided value | reflectedxsstest.go:0:0:0:0 | reflectedxsstest.go | | +| reflectedxsstest.go:33:10:33:57 | type conversion | reflectedxsstest.go:30:2:30:44 | extract:0 ... := ... | reflectedxsstest.go:33:10:33:57 | type conversion | Cross-site scripting vulnerability due to $@. | reflectedxsstest.go:30:2:30:44 | extract:0 ... := ... | user-provided value | reflectedxsstest.go:0:0:0:0 | reflectedxsstest.go | | +| reflectedxsstest.go:34:10:34:62 | type conversion | reflectedxsstest.go:30:2:30:44 | extract:1 ... := ... | reflectedxsstest.go:34:10:34:62 | type conversion | Cross-site scripting vulnerability due to $@. | reflectedxsstest.go:30:2:30:44 | extract:1 ... := ... | user-provided value | reflectedxsstest.go:0:0:0:0 | reflectedxsstest.go | | +| reflectedxsstest.go:44:10:44:55 | type conversion | reflectedxsstest.go:38:2:38:35 | extract:0 ... := ... | reflectedxsstest.go:44:10:44:55 | type conversion | Cross-site scripting vulnerability due to $@. | reflectedxsstest.go:38:2:38:35 | extract:0 ... := ... | user-provided value | reflectedxsstest.go:0:0:0:0 | reflectedxsstest.go | | +| reflectedxsstest.go:45:10:45:18 | byteSlice | reflectedxsstest.go:38:2:38:35 | extract:0 ... := ... | reflectedxsstest.go:45:10:45:18 | byteSlice | Cross-site scripting vulnerability due to $@. | reflectedxsstest.go:38:2:38:35 | extract:0 ... := ... | user-provided value | reflectedxsstest.go:0:0:0:0 | reflectedxsstest.go | | | reflectedxsstest.go:54:11:54:21 | type conversion | reflectedxsstest.go:51:14:51:18 | selection of URL | reflectedxsstest.go:54:11:54:21 | type conversion | Cross-site scripting vulnerability due to $@. | reflectedxsstest.go:51:14:51:18 | selection of URL | user-provided value | reflectedxsstest.go:0:0:0:0 | reflectedxsstest.go | | | tst.go:18:12:18:39 | type conversion | tst.go:14:15:14:20 | selection of Form | tst.go:18:12:18:39 | type conversion | Cross-site scripting vulnerability due to $@. | tst.go:14:15:14:20 | selection of Form | user-provided value | tst.go:0:0:0:0 | tst.go | | | tst.go:53:12:53:26 | type conversion | tst.go:48:14:48:19 | selection of Form | tst.go:53:12:53:26 | type conversion | Cross-site scripting vulnerability due to $@. | tst.go:48:14:48:19 | selection of Form | user-provided value | tst.go:0:0:0:0 | tst.go | | | websocketXss.go:32:24:32:27 | xnet | websocketXss.go:31:11:31:14 | xnet [postupdate] | websocketXss.go:32:24:32:27 | xnet | Cross-site scripting vulnerability due to $@. | websocketXss.go:31:11:31:14 | xnet [postupdate] | user-provided value | websocketXss.go:0:0:0:0 | websocketXss.go | | | websocketXss.go:36:24:36:28 | xnet2 | websocketXss.go:35:21:35:25 | xnet2 [postupdate] | websocketXss.go:36:24:36:28 | xnet2 | Cross-site scripting vulnerability due to $@. | websocketXss.go:35:21:35:25 | xnet2 [postupdate] | user-provided value | websocketXss.go:0:0:0:0 | websocketXss.go | | -| websocketXss.go:41:24:41:29 | nhooyr | websocketXss.go:40:3:40:40 | ... := ...[1] | websocketXss.go:41:24:41:29 | nhooyr | Cross-site scripting vulnerability due to $@. | websocketXss.go:40:3:40:40 | ... := ...[1] | user-provided value | websocketXss.go:0:0:0:0 | websocketXss.go | | +| websocketXss.go:41:24:41:29 | nhooyr | websocketXss.go:40:3:40:40 | extract:1 ... := ... | websocketXss.go:41:24:41:29 | nhooyr | Cross-site scripting vulnerability due to $@. | websocketXss.go:40:3:40:40 | extract:1 ... := ... | user-provided value | websocketXss.go:0:0:0:0 | websocketXss.go | | | websocketXss.go:48:24:48:33 | gorillaMsg | websocketXss.go:47:26:47:35 | gorillaMsg [postupdate] | websocketXss.go:48:24:48:33 | gorillaMsg | Cross-site scripting vulnerability due to $@. | websocketXss.go:47:26:47:35 | gorillaMsg [postupdate] | user-provided value | websocketXss.go:0:0:0:0 | websocketXss.go | | | websocketXss.go:52:24:52:31 | gorilla2 | websocketXss.go:51:17:51:24 | gorilla2 [postupdate] | websocketXss.go:52:24:52:31 | gorilla2 | Cross-site scripting vulnerability due to $@. | websocketXss.go:51:17:51:24 | gorilla2 [postupdate] | user-provided value | websocketXss.go:0:0:0:0 | websocketXss.go | | -| websocketXss.go:55:24:55:31 | gorilla3 | websocketXss.go:54:3:54:38 | ... := ...[1] | websocketXss.go:55:24:55:31 | gorilla3 | Cross-site scripting vulnerability due to $@. | websocketXss.go:54:3:54:38 | ... := ...[1] | user-provided value | websocketXss.go:0:0:0:0 | websocketXss.go | | +| websocketXss.go:55:24:55:31 | gorilla3 | websocketXss.go:54:3:54:38 | extract:1 ... := ... | websocketXss.go:55:24:55:31 | gorilla3 | Cross-site scripting vulnerability due to $@. | websocketXss.go:54:3:54:38 | extract:1 ... := ... | user-provided value | websocketXss.go:0:0:0:0 | websocketXss.go | | edges | ReflectedXss.go:11:15:11:20 | selection of Form | ReflectedXss.go:11:15:11:36 | call to Get | provenance | Src:MaD:6 MaD:18 | | ReflectedXss.go:11:15:11:36 | call to Get | ReflectedXss.go:14:44:14:51 | username | provenance | | @@ -30,10 +30,10 @@ edges | contenttype.go:73:10:73:28 | call to FormValue | contenttype.go:79:11:79:14 | data | provenance | Src:MaD:8 | | contenttype.go:88:10:88:28 | call to FormValue | contenttype.go:91:4:91:7 | data | provenance | Src:MaD:8 | | contenttype.go:113:10:113:28 | call to FormValue | contenttype.go:114:50:114:53 | data | provenance | Src:MaD:8 | -| reflectedxsstest.go:30:2:30:44 | ... := ...[0] | reflectedxsstest.go:31:30:31:33 | file | provenance | Src:MaD:7 | -| reflectedxsstest.go:30:2:30:44 | ... := ...[1] | reflectedxsstest.go:34:46:34:60 | selection of Filename | provenance | Src:MaD:7 | -| reflectedxsstest.go:31:2:31:34 | ... := ...[0] | reflectedxsstest.go:32:48:32:54 | content | provenance | | -| reflectedxsstest.go:31:30:31:33 | file | reflectedxsstest.go:31:2:31:34 | ... := ...[0] | provenance | MaD:13 | +| reflectedxsstest.go:30:2:30:44 | extract:0 ... := ... | reflectedxsstest.go:31:30:31:33 | file | provenance | Src:MaD:7 | +| reflectedxsstest.go:30:2:30:44 | extract:1 ... := ... | reflectedxsstest.go:34:46:34:60 | selection of Filename | provenance | Src:MaD:7 | +| reflectedxsstest.go:31:2:31:34 | extract:0 ... := ... | reflectedxsstest.go:32:48:32:54 | content | provenance | | +| reflectedxsstest.go:31:30:31:33 | file | reflectedxsstest.go:31:2:31:34 | extract:0 ... := ... | provenance | MaD:13 | | reflectedxsstest.go:32:48:32:54 | content | reflectedxsstest.go:33:49:33:55 | content | provenance | | | reflectedxsstest.go:33:17:33:56 | []type{args} [array] | reflectedxsstest.go:33:17:33:56 | call to Sprintf | provenance | MaD:12 | | reflectedxsstest.go:33:17:33:56 | call to Sprintf | reflectedxsstest.go:33:10:33:57 | type conversion | provenance | | @@ -43,10 +43,10 @@ edges | reflectedxsstest.go:34:17:34:61 | call to Sprintf | reflectedxsstest.go:34:10:34:62 | type conversion | provenance | | | reflectedxsstest.go:34:46:34:60 | selection of Filename | reflectedxsstest.go:34:17:34:61 | []type{args} [array] | provenance | | | reflectedxsstest.go:34:46:34:60 | selection of Filename | reflectedxsstest.go:34:17:34:61 | call to Sprintf | provenance | FunctionModel | -| reflectedxsstest.go:38:2:38:35 | ... := ...[0] | reflectedxsstest.go:39:16:39:21 | reader | provenance | Src:MaD:9 | -| reflectedxsstest.go:39:2:39:32 | ... := ...[0] | reflectedxsstest.go:40:14:40:17 | part | provenance | | -| reflectedxsstest.go:39:2:39:32 | ... := ...[0] | reflectedxsstest.go:42:2:42:5 | part | provenance | | -| reflectedxsstest.go:39:16:39:21 | reader | reflectedxsstest.go:39:2:39:32 | ... := ...[0] | provenance | MaD:16 | +| reflectedxsstest.go:38:2:38:35 | extract:0 ... := ... | reflectedxsstest.go:39:16:39:21 | reader | provenance | Src:MaD:9 | +| reflectedxsstest.go:39:2:39:32 | extract:0 ... := ... | reflectedxsstest.go:40:14:40:17 | part | provenance | | +| reflectedxsstest.go:39:2:39:32 | extract:0 ... := ... | reflectedxsstest.go:42:2:42:5 | part | provenance | | +| reflectedxsstest.go:39:16:39:21 | reader | reflectedxsstest.go:39:2:39:32 | extract:0 ... := ... | provenance | MaD:16 | | reflectedxsstest.go:40:14:40:17 | part | reflectedxsstest.go:40:14:40:28 | call to FileName | provenance | MaD:15 | | reflectedxsstest.go:40:14:40:28 | call to FileName | reflectedxsstest.go:44:46:44:53 | partName | provenance | | | reflectedxsstest.go:42:2:42:5 | part | reflectedxsstest.go:42:12:42:20 | byteSlice [postupdate] | provenance | MaD:14 | @@ -67,10 +67,10 @@ edges | tst.go:48:14:48:34 | call to Get | tst.go:53:12:53:26 | type conversion | provenance | | | websocketXss.go:31:11:31:14 | xnet [postupdate] | websocketXss.go:32:24:32:27 | xnet | provenance | Src:MaD:5 | | websocketXss.go:35:21:35:25 | xnet2 [postupdate] | websocketXss.go:36:24:36:28 | xnet2 | provenance | Src:MaD:4 | -| websocketXss.go:40:3:40:40 | ... := ...[1] | websocketXss.go:41:24:41:29 | nhooyr | provenance | Src:MaD:11 | +| websocketXss.go:40:3:40:40 | extract:1 ... := ... | websocketXss.go:41:24:41:29 | nhooyr | provenance | Src:MaD:11 | | websocketXss.go:47:26:47:35 | gorillaMsg [postupdate] | websocketXss.go:48:24:48:33 | gorillaMsg | provenance | Src:MaD:1 | | websocketXss.go:51:17:51:24 | gorilla2 [postupdate] | websocketXss.go:52:24:52:31 | gorilla2 | provenance | Src:MaD:2 | -| websocketXss.go:54:3:54:38 | ... := ...[1] | websocketXss.go:55:24:55:31 | gorilla3 | provenance | Src:MaD:3 | +| websocketXss.go:54:3:54:38 | extract:1 ... := ... | websocketXss.go:55:24:55:31 | gorilla3 | provenance | Src:MaD:3 | models | 1 | Source: github.com/gorilla/websocket; ; false; ReadJSON; ; ; Argument[1]; remote; manual | | 2 | Source: github.com/gorilla/websocket; Conn; true; ReadJSON; ; ; Argument[0]; remote; manual | @@ -109,9 +109,9 @@ nodes | contenttype.go:91:4:91:7 | data | semmle.label | data | | contenttype.go:113:10:113:28 | call to FormValue | semmle.label | call to FormValue | | contenttype.go:114:50:114:53 | data | semmle.label | data | -| reflectedxsstest.go:30:2:30:44 | ... := ...[0] | semmle.label | ... := ...[0] | -| reflectedxsstest.go:30:2:30:44 | ... := ...[1] | semmle.label | ... := ...[1] | -| reflectedxsstest.go:31:2:31:34 | ... := ...[0] | semmle.label | ... := ...[0] | +| reflectedxsstest.go:30:2:30:44 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | +| reflectedxsstest.go:30:2:30:44 | extract:1 ... := ... | semmle.label | extract:1 ... := ... | +| reflectedxsstest.go:31:2:31:34 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | reflectedxsstest.go:31:30:31:33 | file | semmle.label | file | | reflectedxsstest.go:32:48:32:54 | content | semmle.label | content | | reflectedxsstest.go:33:10:33:57 | type conversion | semmle.label | type conversion | @@ -122,8 +122,8 @@ nodes | reflectedxsstest.go:34:17:34:61 | []type{args} [array] | semmle.label | []type{args} [array] | | reflectedxsstest.go:34:17:34:61 | call to Sprintf | semmle.label | call to Sprintf | | reflectedxsstest.go:34:46:34:60 | selection of Filename | semmle.label | selection of Filename | -| reflectedxsstest.go:38:2:38:35 | ... := ...[0] | semmle.label | ... := ...[0] | -| reflectedxsstest.go:39:2:39:32 | ... := ...[0] | semmle.label | ... := ...[0] | +| reflectedxsstest.go:38:2:38:35 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | +| reflectedxsstest.go:39:2:39:32 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | reflectedxsstest.go:39:16:39:21 | reader | semmle.label | reader | | reflectedxsstest.go:40:14:40:17 | part | semmle.label | part | | reflectedxsstest.go:40:14:40:28 | call to FileName | semmle.label | call to FileName | @@ -151,12 +151,12 @@ nodes | websocketXss.go:32:24:32:27 | xnet | semmle.label | xnet | | websocketXss.go:35:21:35:25 | xnet2 [postupdate] | semmle.label | xnet2 [postupdate] | | websocketXss.go:36:24:36:28 | xnet2 | semmle.label | xnet2 | -| websocketXss.go:40:3:40:40 | ... := ...[1] | semmle.label | ... := ...[1] | +| websocketXss.go:40:3:40:40 | extract:1 ... := ... | semmle.label | extract:1 ... := ... | | websocketXss.go:41:24:41:29 | nhooyr | semmle.label | nhooyr | | websocketXss.go:47:26:47:35 | gorillaMsg [postupdate] | semmle.label | gorillaMsg [postupdate] | | websocketXss.go:48:24:48:33 | gorillaMsg | semmle.label | gorillaMsg | | websocketXss.go:51:17:51:24 | gorilla2 [postupdate] | semmle.label | gorilla2 [postupdate] | | websocketXss.go:52:24:52:31 | gorilla2 | semmle.label | gorilla2 | -| websocketXss.go:54:3:54:38 | ... := ...[1] | semmle.label | ... := ...[1] | +| websocketXss.go:54:3:54:38 | extract:1 ... := ... | semmle.label | extract:1 ... := ... | | websocketXss.go:55:24:55:31 | gorilla3 | semmle.label | gorilla3 | subpaths diff --git a/go/ql/test/query-tests/Security/CWE-079/StoredXss.expected b/go/ql/test/query-tests/Security/CWE-079/StoredXss.expected index cde1a866c755..50284f8e6d4d 100644 --- a/go/ql/test/query-tests/Security/CWE-079/StoredXss.expected +++ b/go/ql/test/query-tests/Security/CWE-079/StoredXss.expected @@ -1,10 +1,10 @@ #select | StoredXss.go:13:21:13:36 | ...+... | StoredXss.go:13:21:13:31 | call to Name | StoredXss.go:13:21:13:36 | ...+... | Stored cross-site scripting vulnerability due to $@. | StoredXss.go:13:21:13:31 | call to Name | stored value | -| stored.go:30:22:30:25 | name | stored.go:18:3:18:28 | ... := ...[0] | stored.go:30:22:30:25 | name | Stored cross-site scripting vulnerability due to $@. | stored.go:18:3:18:28 | ... := ...[0] | stored value | +| stored.go:30:22:30:25 | name | stored.go:18:3:18:28 | extract:0 ... := ... | stored.go:30:22:30:25 | name | Stored cross-site scripting vulnerability due to $@. | stored.go:18:3:18:28 | extract:0 ... := ... | stored value | | stored.go:61:22:61:25 | path | stored.go:59:30:59:33 | SSA def(path) | stored.go:61:22:61:25 | path | Stored cross-site scripting vulnerability due to $@. | stored.go:59:30:59:33 | SSA def(path) | stored value | edges | StoredXss.go:13:21:13:31 | call to Name | StoredXss.go:13:21:13:36 | ...+... | provenance | | -| stored.go:18:3:18:28 | ... := ...[0] | stored.go:25:14:25:17 | rows | provenance | Src:MaD:1 | +| stored.go:18:3:18:28 | extract:0 ... := ... | stored.go:25:14:25:17 | rows | provenance | Src:MaD:1 | | stored.go:25:14:25:17 | rows | stored.go:25:29:25:33 | &... [postupdate] | provenance | FunctionModel | | stored.go:25:29:25:33 | &... [postupdate] | stored.go:30:22:30:25 | name | provenance | | | stored.go:59:30:59:33 | SSA def(path) | stored.go:61:22:61:25 | path | provenance | | @@ -13,7 +13,7 @@ models nodes | StoredXss.go:13:21:13:31 | call to Name | semmle.label | call to Name | | StoredXss.go:13:21:13:36 | ...+... | semmle.label | ...+... | -| stored.go:18:3:18:28 | ... := ...[0] | semmle.label | ... := ...[0] | +| stored.go:18:3:18:28 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | stored.go:25:14:25:17 | rows | semmle.label | rows | | stored.go:25:29:25:33 | &... [postupdate] | semmle.label | &... [postupdate] | | stored.go:30:22:30:25 | name | semmle.label | name | diff --git a/go/ql/test/query-tests/Security/CWE-089/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-089/CONSISTENCY/DataFlowConsistency.expected index bb9cf32663a7..3ec923eb2391 100644 --- a/go/ql/test/query-tests/Security/CWE-089/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/query-tests/Security/CWE-089/CONSISTENCY/DataFlowConsistency.expected @@ -1,23 +1,23 @@ reverseRead -| SqlInjection.go:11:3:11:5 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| SqlInjection.go:11:3:11:5 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | | SqlInjection.go:11:3:11:17 | call to Query | Origin of readStep is missing a PostUpdateNode. | -| SqlInjectionGood.go:10:14:10:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| SqlInjectionGood.go:10:14:10:16 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | | SqlInjectionGood.go:10:14:10:28 | call to Query | Origin of readStep is missing a PostUpdateNode. | -| issue48.go:17:25:17:27 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| issue48.go:17:25:17:27 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | | issue48.go:21:3:21:21 | RequestDataFromJson | Origin of readStep is missing a PostUpdateNode. | -| issue48.go:27:26:27:28 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| issue48.go:27:26:27:28 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | | issue48.go:31:3:31:22 | RequestDataFromJson2 | Origin of readStep is missing a PostUpdateNode. | -| issue48.go:37:24:37:26 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| issue48.go:37:24:37:26 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | | issue48.go:40:3:40:22 | RequestDataFromJson3 | Origin of readStep is missing a PostUpdateNode. | -| main.go:15:63:15:63 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| main.go:15:63:15:63 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | | main.go:15:63:15:75 | call to Query | Origin of readStep is missing a PostUpdateNode. | -| main.go:16:63:16:63 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| main.go:30:13:30:15 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| main.go:34:3:34:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| main.go:40:25:40:27 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| main.go:43:3:43:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| main.go:49:28:49:30 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| main.go:52:3:52:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| main.go:58:28:58:30 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| main.go:16:63:16:63 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| main.go:30:13:30:15 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| main.go:34:3:34:13 | implicit-deref RequestData | Origin of readStep is missing a PostUpdateNode. | +| main.go:40:25:40:27 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| main.go:43:3:43:13 | implicit-deref RequestData | Origin of readStep is missing a PostUpdateNode. | +| main.go:49:28:49:30 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| main.go:52:3:52:13 | implicit-deref RequestData | Origin of readStep is missing a PostUpdateNode. | +| main.go:58:28:58:30 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | | main.go:61:4:61:15 | star expression | Origin of readStep is missing a PostUpdateNode. | -| main.go:68:18:68:20 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| main.go:68:18:68:20 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-089/SqlInjection.expected b/go/ql/test/query-tests/Security/CWE-089/SqlInjection.expected index e8c6848b5695..70037706cfd8 100644 --- a/go/ql/test/query-tests/Security/CWE-089/SqlInjection.expected +++ b/go/ql/test/query-tests/Security/CWE-089/SqlInjection.expected @@ -31,16 +31,16 @@ edges | SqlInjection.go:11:3:11:17 | call to Query | SqlInjection.go:11:3:11:29 | index expression | provenance | | | SqlInjection.go:11:3:11:29 | index expression | SqlInjection.go:10:7:11:30 | []type{args} [array] | provenance | | | SqlInjection.go:11:3:11:29 | index expression | SqlInjection.go:10:7:11:30 | call to Sprintf | provenance | FunctionModel | -| issue48.go:17:2:17:33 | ... := ...[0] | issue48.go:18:17:18:17 | b | provenance | | -| issue48.go:17:25:17:32 | selection of Body | issue48.go:17:2:17:33 | ... := ...[0] | provenance | Src:MaD:17 MaD:24 | +| issue48.go:17:2:17:33 | extract:0 ... := ... | issue48.go:18:17:18:17 | b | provenance | | +| issue48.go:17:25:17:32 | selection of Body | issue48.go:17:2:17:33 | extract:0 ... := ... | provenance | Src:MaD:17 MaD:24 | | issue48.go:18:17:18:17 | b | issue48.go:18:20:18:39 | &... [postupdate] | provenance | MaD:22 | | issue48.go:18:20:18:39 | &... [postupdate] | issue48.go:21:3:21:33 | index expression | provenance | | | issue48.go:20:8:21:34 | []type{args} [array] | issue48.go:20:8:21:34 | call to Sprintf | provenance | MaD:23 | | issue48.go:20:8:21:34 | call to Sprintf | issue48.go:22:11:22:12 | q3 | provenance | Sink:MaD:1 | | issue48.go:21:3:21:33 | index expression | issue48.go:20:8:21:34 | []type{args} [array] | provenance | | | issue48.go:21:3:21:33 | index expression | issue48.go:20:8:21:34 | call to Sprintf | provenance | FunctionModel | -| issue48.go:27:2:27:34 | ... := ...[0] | issue48.go:28:17:28:18 | b2 | provenance | | -| issue48.go:27:26:27:33 | selection of Body | issue48.go:27:2:27:34 | ... := ...[0] | provenance | Src:MaD:17 MaD:24 | +| issue48.go:27:2:27:34 | extract:0 ... := ... | issue48.go:28:17:28:18 | b2 | provenance | | +| issue48.go:27:26:27:33 | selection of Body | issue48.go:27:2:27:34 | extract:0 ... := ... | provenance | Src:MaD:17 MaD:24 | | issue48.go:28:17:28:18 | b2 | issue48.go:28:21:28:41 | &... [postupdate] | provenance | MaD:22 | | issue48.go:28:21:28:41 | &... [postupdate] | issue48.go:31:3:31:31 | selection of Category | provenance | | | issue48.go:30:8:31:32 | []type{args} [array] | issue48.go:30:8:31:32 | call to Sprintf | provenance | MaD:23 | @@ -72,19 +72,19 @@ edges | main.go:30:13:30:39 | index expression | main.go:28:18:31:2 | struct literal [Category] | provenance | | | main.go:33:7:34:23 | []type{args} [array] | main.go:33:7:34:23 | call to Sprintf | provenance | MaD:23 | | main.go:33:7:34:23 | call to Sprintf | main.go:35:11:35:11 | q | provenance | Sink:MaD:1 | -| main.go:34:3:34:13 | RequestData [pointer, Category] | main.go:34:3:34:13 | implicit dereference [Category] | provenance | | -| main.go:34:3:34:13 | implicit dereference [Category] | main.go:34:3:34:22 | selection of Category | provenance | | +| main.go:34:3:34:13 | RequestData [pointer, Category] | main.go:34:3:34:13 | implicit-deref RequestData [Category] | provenance | | +| main.go:34:3:34:13 | implicit-deref RequestData [Category] | main.go:34:3:34:22 | selection of Category | provenance | | | main.go:34:3:34:22 | selection of Category | main.go:33:7:34:23 | []type{args} [array] | provenance | | | main.go:34:3:34:22 | selection of Category | main.go:33:7:34:23 | call to Sprintf | provenance | FunctionModel | | main.go:40:2:40:12 | RequestData [postupdate] [pointer, Category] | main.go:43:3:43:13 | RequestData [pointer, Category] | provenance | | -| main.go:40:2:40:12 | implicit dereference [postupdate] [Category] | main.go:40:2:40:12 | RequestData [postupdate] [pointer, Category] | provenance | | +| main.go:40:2:40:12 | implicit-deref RequestData [postupdate] [Category] | main.go:40:2:40:12 | RequestData [postupdate] [pointer, Category] | provenance | | | main.go:40:25:40:31 | selection of URL | main.go:40:25:40:39 | call to Query | provenance | Src:MaD:21 MaD:26 | | main.go:40:25:40:39 | call to Query | main.go:40:25:40:51 | index expression | provenance | | -| main.go:40:25:40:51 | index expression | main.go:40:2:40:12 | implicit dereference [postupdate] [Category] | provenance | | +| main.go:40:25:40:51 | index expression | main.go:40:2:40:12 | implicit-deref RequestData [postupdate] [Category] | provenance | | | main.go:42:7:43:23 | []type{args} [array] | main.go:42:7:43:23 | call to Sprintf | provenance | MaD:23 | | main.go:42:7:43:23 | call to Sprintf | main.go:44:11:44:11 | q | provenance | Sink:MaD:1 | -| main.go:43:3:43:13 | RequestData [pointer, Category] | main.go:43:3:43:13 | implicit dereference [Category] | provenance | | -| main.go:43:3:43:13 | implicit dereference [Category] | main.go:43:3:43:22 | selection of Category | provenance | | +| main.go:43:3:43:13 | RequestData [pointer, Category] | main.go:43:3:43:13 | implicit-deref RequestData [Category] | provenance | | +| main.go:43:3:43:13 | implicit-deref RequestData [Category] | main.go:43:3:43:22 | selection of Category | provenance | | | main.go:43:3:43:22 | selection of Category | main.go:42:7:43:23 | []type{args} [array] | provenance | | | main.go:43:3:43:22 | selection of Category | main.go:42:7:43:23 | call to Sprintf | provenance | FunctionModel | | main.go:49:3:49:14 | star expression [postupdate] [Category] | main.go:49:4:49:14 | RequestData [postupdate] [pointer, Category] | provenance | | @@ -94,8 +94,8 @@ edges | main.go:49:28:49:54 | index expression | main.go:49:3:49:14 | star expression [postupdate] [Category] | provenance | | | main.go:51:7:52:23 | []type{args} [array] | main.go:51:7:52:23 | call to Sprintf | provenance | MaD:23 | | main.go:51:7:52:23 | call to Sprintf | main.go:53:11:53:11 | q | provenance | Sink:MaD:1 | -| main.go:52:3:52:13 | RequestData [pointer, Category] | main.go:52:3:52:13 | implicit dereference [Category] | provenance | | -| main.go:52:3:52:13 | implicit dereference [Category] | main.go:52:3:52:22 | selection of Category | provenance | | +| main.go:52:3:52:13 | RequestData [pointer, Category] | main.go:52:3:52:13 | implicit-deref RequestData [Category] | provenance | | +| main.go:52:3:52:13 | implicit-deref RequestData [Category] | main.go:52:3:52:22 | selection of Category | provenance | | | main.go:52:3:52:22 | selection of Category | main.go:51:7:52:23 | []type{args} [array] | provenance | | | main.go:52:3:52:22 | selection of Category | main.go:51:7:52:23 | call to Sprintf | provenance | FunctionModel | | main.go:58:3:58:14 | star expression [postupdate] [Category] | main.go:58:4:58:14 | RequestData [postupdate] [pointer, Category] | provenance | | @@ -161,7 +161,7 @@ nodes | SqlInjection.go:11:3:11:17 | call to Query | semmle.label | call to Query | | SqlInjection.go:11:3:11:29 | index expression | semmle.label | index expression | | SqlInjection.go:12:11:12:11 | q | semmle.label | q | -| issue48.go:17:2:17:33 | ... := ...[0] | semmle.label | ... := ...[0] | +| issue48.go:17:2:17:33 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | issue48.go:17:25:17:32 | selection of Body | semmle.label | selection of Body | | issue48.go:18:17:18:17 | b | semmle.label | b | | issue48.go:18:20:18:39 | &... [postupdate] | semmle.label | &... [postupdate] | @@ -169,7 +169,7 @@ nodes | issue48.go:20:8:21:34 | call to Sprintf | semmle.label | call to Sprintf | | issue48.go:21:3:21:33 | index expression | semmle.label | index expression | | issue48.go:22:11:22:12 | q3 | semmle.label | q3 | -| issue48.go:27:2:27:34 | ... := ...[0] | semmle.label | ... := ...[0] | +| issue48.go:27:2:27:34 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | issue48.go:27:26:27:33 | selection of Body | semmle.label | selection of Body | | issue48.go:28:17:28:18 | b2 | semmle.label | b2 | | issue48.go:28:21:28:41 | &... [postupdate] | semmle.label | &... [postupdate] | @@ -204,18 +204,18 @@ nodes | main.go:33:7:34:23 | []type{args} [array] | semmle.label | []type{args} [array] | | main.go:33:7:34:23 | call to Sprintf | semmle.label | call to Sprintf | | main.go:34:3:34:13 | RequestData [pointer, Category] | semmle.label | RequestData [pointer, Category] | -| main.go:34:3:34:13 | implicit dereference [Category] | semmle.label | implicit dereference [Category] | +| main.go:34:3:34:13 | implicit-deref RequestData [Category] | semmle.label | implicit-deref RequestData [Category] | | main.go:34:3:34:22 | selection of Category | semmle.label | selection of Category | | main.go:35:11:35:11 | q | semmle.label | q | | main.go:40:2:40:12 | RequestData [postupdate] [pointer, Category] | semmle.label | RequestData [postupdate] [pointer, Category] | -| main.go:40:2:40:12 | implicit dereference [postupdate] [Category] | semmle.label | implicit dereference [postupdate] [Category] | +| main.go:40:2:40:12 | implicit-deref RequestData [postupdate] [Category] | semmle.label | implicit-deref RequestData [postupdate] [Category] | | main.go:40:25:40:31 | selection of URL | semmle.label | selection of URL | | main.go:40:25:40:39 | call to Query | semmle.label | call to Query | | main.go:40:25:40:51 | index expression | semmle.label | index expression | | main.go:42:7:43:23 | []type{args} [array] | semmle.label | []type{args} [array] | | main.go:42:7:43:23 | call to Sprintf | semmle.label | call to Sprintf | | main.go:43:3:43:13 | RequestData [pointer, Category] | semmle.label | RequestData [pointer, Category] | -| main.go:43:3:43:13 | implicit dereference [Category] | semmle.label | implicit dereference [Category] | +| main.go:43:3:43:13 | implicit-deref RequestData [Category] | semmle.label | implicit-deref RequestData [Category] | | main.go:43:3:43:22 | selection of Category | semmle.label | selection of Category | | main.go:44:11:44:11 | q | semmle.label | q | | main.go:49:3:49:14 | star expression [postupdate] [Category] | semmle.label | star expression [postupdate] [Category] | @@ -226,7 +226,7 @@ nodes | main.go:51:7:52:23 | []type{args} [array] | semmle.label | []type{args} [array] | | main.go:51:7:52:23 | call to Sprintf | semmle.label | call to Sprintf | | main.go:52:3:52:13 | RequestData [pointer, Category] | semmle.label | RequestData [pointer, Category] | -| main.go:52:3:52:13 | implicit dereference [Category] | semmle.label | implicit dereference [Category] | +| main.go:52:3:52:13 | implicit-deref RequestData [Category] | semmle.label | implicit-deref RequestData [Category] | | main.go:52:3:52:22 | selection of Category | semmle.label | selection of Category | | main.go:53:11:53:11 | q | semmle.label | q | | main.go:58:3:58:14 | star expression [postupdate] [Category] | semmle.label | star expression [postupdate] [Category] | diff --git a/go/ql/test/query-tests/Security/CWE-089/StringBreak.expected b/go/ql/test/query-tests/Security/CWE-089/StringBreak.expected index 63caa73d596d..31d7ff8622c8 100644 --- a/go/ql/test/query-tests/Security/CWE-089/StringBreak.expected +++ b/go/ql/test/query-tests/Security/CWE-089/StringBreak.expected @@ -1,25 +1,25 @@ #select -| StringBreak.go:15:47:15:57 | versionJSON | StringBreak.go:11:2:11:40 | ... := ...[0] | StringBreak.go:15:47:15:57 | versionJSON | If this $@ contains a single quote, it could break out of the enclosing quotes. | StringBreak.go:11:2:11:40 | ... := ...[0] | JSON value | -| StringBreakMismatched.go:18:26:18:32 | escaped | StringBreakMismatched.go:13:2:13:40 | ... := ...[0] | StringBreakMismatched.go:18:26:18:32 | escaped | If this $@ contains a single quote, it could break out of the enclosing quotes. | StringBreakMismatched.go:13:2:13:40 | ... := ...[0] | JSON value | -| StringBreakMismatched.go:30:27:30:33 | escaped | StringBreakMismatched.go:25:2:25:40 | ... := ...[0] | StringBreakMismatched.go:30:27:30:33 | escaped | If this $@ contains a double quote, it could break out of the enclosing quotes. | StringBreakMismatched.go:25:2:25:40 | ... := ...[0] | JSON value | +| StringBreak.go:15:47:15:57 | versionJSON | StringBreak.go:11:2:11:40 | extract:0 ... := ... | StringBreak.go:15:47:15:57 | versionJSON | If this $@ contains a single quote, it could break out of the enclosing quotes. | StringBreak.go:11:2:11:40 | extract:0 ... := ... | JSON value | +| StringBreakMismatched.go:18:26:18:32 | escaped | StringBreakMismatched.go:13:2:13:40 | extract:0 ... := ... | StringBreakMismatched.go:18:26:18:32 | escaped | If this $@ contains a single quote, it could break out of the enclosing quotes. | StringBreakMismatched.go:13:2:13:40 | extract:0 ... := ... | JSON value | +| StringBreakMismatched.go:30:27:30:33 | escaped | StringBreakMismatched.go:25:2:25:40 | extract:0 ... := ... | StringBreakMismatched.go:30:27:30:33 | escaped | If this $@ contains a double quote, it could break out of the enclosing quotes. | StringBreakMismatched.go:25:2:25:40 | extract:0 ... := ... | JSON value | edges -| StringBreak.go:11:2:11:40 | ... := ...[0] | StringBreak.go:15:47:15:57 | versionJSON | provenance | | -| StringBreakMismatched.go:13:2:13:40 | ... := ...[0] | StringBreakMismatched.go:14:29:14:47 | type conversion | provenance | | +| StringBreak.go:11:2:11:40 | extract:0 ... := ... | StringBreak.go:15:47:15:57 | versionJSON | provenance | | +| StringBreakMismatched.go:13:2:13:40 | extract:0 ... := ... | StringBreakMismatched.go:14:29:14:47 | type conversion | provenance | | | StringBreakMismatched.go:14:13:14:62 | call to Replace | StringBreakMismatched.go:18:26:18:32 | escaped | provenance | | | StringBreakMismatched.go:14:29:14:47 | type conversion | StringBreakMismatched.go:14:13:14:62 | call to Replace | provenance | MaD:1 | -| StringBreakMismatched.go:25:2:25:40 | ... := ...[0] | StringBreakMismatched.go:26:29:26:47 | type conversion | provenance | | +| StringBreakMismatched.go:25:2:25:40 | extract:0 ... := ... | StringBreakMismatched.go:26:29:26:47 | type conversion | provenance | | | StringBreakMismatched.go:26:13:26:61 | call to Replace | StringBreakMismatched.go:30:27:30:33 | escaped | provenance | | | StringBreakMismatched.go:26:29:26:47 | type conversion | StringBreakMismatched.go:26:13:26:61 | call to Replace | provenance | MaD:1 | models | 1 | Summary: strings; ; false; Replace; ; ; Argument[0]; ReturnValue; taint; manual | nodes -| StringBreak.go:11:2:11:40 | ... := ...[0] | semmle.label | ... := ...[0] | +| StringBreak.go:11:2:11:40 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | StringBreak.go:15:47:15:57 | versionJSON | semmle.label | versionJSON | -| StringBreakMismatched.go:13:2:13:40 | ... := ...[0] | semmle.label | ... := ...[0] | +| StringBreakMismatched.go:13:2:13:40 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | StringBreakMismatched.go:14:13:14:62 | call to Replace | semmle.label | call to Replace | | StringBreakMismatched.go:14:29:14:47 | type conversion | semmle.label | type conversion | | StringBreakMismatched.go:18:26:18:32 | escaped | semmle.label | escaped | -| StringBreakMismatched.go:25:2:25:40 | ... := ...[0] | semmle.label | ... := ...[0] | +| StringBreakMismatched.go:25:2:25:40 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | StringBreakMismatched.go:26:13:26:61 | call to Replace | semmle.label | call to Replace | | StringBreakMismatched.go:26:29:26:47 | type conversion | semmle.label | type conversion | | StringBreakMismatched.go:30:27:30:33 | escaped | semmle.label | escaped | diff --git a/go/ql/test/query-tests/Security/CWE-117/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-117/CONSISTENCY/DataFlowConsistency.expected index a683e9691675..f519d603e82e 100644 --- a/go/ql/test/query-tests/Security/CWE-117/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/query-tests/Security/CWE-117/CONSISTENCY/DataFlowConsistency.expected @@ -1,11 +1,11 @@ reverseRead -| LogInjection.go:32:14:32:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| LogInjection.go:33:14:33:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| LogInjection.go:34:18:34:20 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| LogInjection.go:35:14:35:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| LogInjection.go:551:14:551:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| LogInjection.go:559:14:559:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| LogInjection.go:567:14:567:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| LogInjection.go:602:14:602:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| LogInjection.go:603:14:603:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| LogInjection.go:828:12:828:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| LogInjection.go:32:14:32:16 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| LogInjection.go:33:14:33:16 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| LogInjection.go:34:18:34:20 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| LogInjection.go:35:14:35:16 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| LogInjection.go:551:14:551:16 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| LogInjection.go:559:14:559:16 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| LogInjection.go:567:14:567:16 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| LogInjection.go:602:14:602:16 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| LogInjection.go:603:14:603:16 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| LogInjection.go:828:12:828:14 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-190/AllocationSizeOverflow.expected b/go/ql/test/query-tests/Security/CWE-190/AllocationSizeOverflow.expected index ec1835a6f8ac..f21d5dd184b8 100644 --- a/go/ql/test/query-tests/Security/CWE-190/AllocationSizeOverflow.expected +++ b/go/ql/test/query-tests/Security/CWE-190/AllocationSizeOverflow.expected @@ -1,22 +1,22 @@ #select -| AllocationSizeOverflow.go:10:10:10:22 | call to len | AllocationSizeOverflow.go:6:2:6:33 | ... := ...[0] | AllocationSizeOverflow.go:10:10:10:22 | call to len | This operation, which is used in an $@, involves a $@ and might overflow. | AllocationSizeOverflow.go:11:25:11:28 | size | allocation | AllocationSizeOverflow.go:6:2:6:33 | ... := ...[0] | potentially large value | -| tst2.go:10:22:10:30 | call to len | tst2.go:9:2:9:37 | ... := ...[0] | tst2.go:10:22:10:30 | call to len | This operation, which is used in an $@, involves a $@ and might overflow. | tst2.go:10:22:10:32 | ...+... | allocation | tst2.go:9:2:9:37 | ... := ...[0] | potentially large value | -| tst2.go:15:22:15:30 | call to len | tst2.go:14:2:14:29 | ... := ...[0] | tst2.go:15:22:15:30 | call to len | This operation, which is used in an $@, involves a $@ and might overflow. | tst2.go:15:22:15:32 | ...+... | allocation | tst2.go:14:2:14:29 | ... := ...[0] | potentially large value | -| tst3.go:7:22:7:34 | call to len | tst3.go:6:2:6:31 | ... := ...[0] | tst3.go:7:22:7:34 | call to len | This operation, which is used in an $@, involves a $@ and might overflow. | tst3.go:7:22:7:36 | ...+... | allocation | tst3.go:6:2:6:31 | ... := ...[0] | potentially large value | -| tst3.go:24:16:24:28 | call to len | tst3.go:6:2:6:31 | ... := ...[0] | tst3.go:24:16:24:28 | call to len | This operation, which is used in an $@, involves a $@ and might overflow. | tst3.go:27:24:27:32 | newlength | allocation | tst3.go:6:2:6:31 | ... := ...[0] | potentially large value | -| tst3.go:32:16:32:28 | call to len | tst3.go:6:2:6:31 | ... := ...[0] | tst3.go:32:16:32:28 | call to len | This operation, which is used in an $@, involves a $@ and might overflow. | tst3.go:36:23:36:31 | newlength | allocation | tst3.go:6:2:6:31 | ... := ...[0] | potentially large value | -| tst.go:15:22:15:34 | call to len | tst.go:14:2:14:30 | ... = ...[0] | tst.go:15:22:15:34 | call to len | This operation, which is used in an $@, involves a $@ and might overflow. | tst.go:15:22:15:36 | ...+... | allocation | tst.go:14:2:14:30 | ... = ...[0] | potentially large value | -| tst.go:21:22:21:34 | call to len | tst.go:20:2:20:31 | ... = ...[0] | tst.go:21:22:21:34 | call to len | This operation, which is used in an $@, involves a $@ and might overflow. | tst.go:21:22:21:36 | ...+... | allocation | tst.go:20:2:20:31 | ... = ...[0] | potentially large value | -| tst.go:27:26:27:38 | call to len | tst.go:26:2:26:31 | ... = ...[0] | tst.go:27:26:27:38 | call to len | This operation, which is used in an $@, involves a $@ and might overflow. | tst.go:27:26:27:40 | ...+... | allocation | tst.go:26:2:26:31 | ... = ...[0] | potentially large value | -| tst.go:35:22:35:34 | call to len | tst.go:34:2:34:30 | ... = ...[0] | tst.go:35:22:35:34 | call to len | This operation, which is used in an $@, involves a $@ and might overflow. | tst.go:35:22:35:36 | ...+... | allocation | tst.go:34:2:34:30 | ... = ...[0] | potentially large value | +| AllocationSizeOverflow.go:10:10:10:22 | call to len | AllocationSizeOverflow.go:6:2:6:33 | extract:0 ... := ... | AllocationSizeOverflow.go:10:10:10:22 | call to len | This operation, which is used in an $@, involves a $@ and might overflow. | AllocationSizeOverflow.go:11:25:11:28 | size | allocation | AllocationSizeOverflow.go:6:2:6:33 | extract:0 ... := ... | potentially large value | +| tst2.go:10:22:10:30 | call to len | tst2.go:9:2:9:37 | extract:0 ... := ... | tst2.go:10:22:10:30 | call to len | This operation, which is used in an $@, involves a $@ and might overflow. | tst2.go:10:22:10:32 | ...+... | allocation | tst2.go:9:2:9:37 | extract:0 ... := ... | potentially large value | +| tst2.go:15:22:15:30 | call to len | tst2.go:14:2:14:29 | extract:0 ... := ... | tst2.go:15:22:15:30 | call to len | This operation, which is used in an $@, involves a $@ and might overflow. | tst2.go:15:22:15:32 | ...+... | allocation | tst2.go:14:2:14:29 | extract:0 ... := ... | potentially large value | +| tst3.go:7:22:7:34 | call to len | tst3.go:6:2:6:31 | extract:0 ... := ... | tst3.go:7:22:7:34 | call to len | This operation, which is used in an $@, involves a $@ and might overflow. | tst3.go:7:22:7:36 | ...+... | allocation | tst3.go:6:2:6:31 | extract:0 ... := ... | potentially large value | +| tst3.go:24:16:24:28 | call to len | tst3.go:6:2:6:31 | extract:0 ... := ... | tst3.go:24:16:24:28 | call to len | This operation, which is used in an $@, involves a $@ and might overflow. | tst3.go:27:24:27:32 | newlength | allocation | tst3.go:6:2:6:31 | extract:0 ... := ... | potentially large value | +| tst3.go:32:16:32:28 | call to len | tst3.go:6:2:6:31 | extract:0 ... := ... | tst3.go:32:16:32:28 | call to len | This operation, which is used in an $@, involves a $@ and might overflow. | tst3.go:36:23:36:31 | newlength | allocation | tst3.go:6:2:6:31 | extract:0 ... := ... | potentially large value | +| tst.go:15:22:15:34 | call to len | tst.go:14:2:14:30 | extract:0 ... = ... | tst.go:15:22:15:34 | call to len | This operation, which is used in an $@, involves a $@ and might overflow. | tst.go:15:22:15:36 | ...+... | allocation | tst.go:14:2:14:30 | extract:0 ... = ... | potentially large value | +| tst.go:21:22:21:34 | call to len | tst.go:20:2:20:31 | extract:0 ... = ... | tst.go:21:22:21:34 | call to len | This operation, which is used in an $@, involves a $@ and might overflow. | tst.go:21:22:21:36 | ...+... | allocation | tst.go:20:2:20:31 | extract:0 ... = ... | potentially large value | +| tst.go:27:26:27:38 | call to len | tst.go:26:2:26:31 | extract:0 ... = ... | tst.go:27:26:27:38 | call to len | This operation, which is used in an $@, involves a $@ and might overflow. | tst.go:27:26:27:40 | ...+... | allocation | tst.go:26:2:26:31 | extract:0 ... = ... | potentially large value | +| tst.go:35:22:35:34 | call to len | tst.go:34:2:34:30 | extract:0 ... = ... | tst.go:35:22:35:34 | call to len | This operation, which is used in an $@, involves a $@ and might overflow. | tst.go:35:22:35:36 | ...+... | allocation | tst.go:34:2:34:30 | extract:0 ... = ... | potentially large value | edges -| AllocationSizeOverflow.go:6:2:6:33 | ... := ...[0] | AllocationSizeOverflow.go:10:14:10:21 | jsonData | provenance | | +| AllocationSizeOverflow.go:6:2:6:33 | extract:0 ... := ... | AllocationSizeOverflow.go:10:14:10:21 | jsonData | provenance | | | AllocationSizeOverflow.go:10:14:10:21 | jsonData | AllocationSizeOverflow.go:10:10:10:22 | call to len | provenance | Config | -| tst2.go:9:2:9:37 | ... := ...[0] | tst2.go:10:26:10:29 | data | provenance | Src:MaD:1 | +| tst2.go:9:2:9:37 | extract:0 ... := ... | tst2.go:10:26:10:29 | data | provenance | Src:MaD:1 | | tst2.go:10:26:10:29 | data | tst2.go:10:22:10:30 | call to len | provenance | Config | -| tst2.go:14:2:14:29 | ... := ...[0] | tst2.go:15:26:15:29 | data | provenance | | +| tst2.go:14:2:14:29 | extract:0 ... := ... | tst2.go:15:26:15:29 | data | provenance | | | tst2.go:15:26:15:29 | data | tst2.go:15:22:15:30 | call to len | provenance | Config | -| tst3.go:6:2:6:31 | ... := ...[0] | tst3.go:7:26:7:33 | jsonData | provenance | | +| tst3.go:6:2:6:31 | extract:0 ... := ... | tst3.go:7:26:7:33 | jsonData | provenance | | | tst3.go:7:26:7:33 | jsonData | tst3.go:7:22:7:34 | call to len | provenance | Config | | tst3.go:7:26:7:33 | jsonData | tst3.go:9:32:9:39 | jsonData | provenance | | | tst3.go:9:32:9:39 | jsonData | tst3.go:11:9:11:16 | jsonData | provenance | | @@ -25,27 +25,27 @@ edges | tst3.go:24:20:24:27 | jsonData | tst3.go:24:16:24:28 | call to len | provenance | Config | | tst3.go:24:20:24:27 | jsonData | tst3.go:32:20:32:27 | jsonData | provenance | | | tst3.go:32:20:32:27 | jsonData | tst3.go:32:16:32:28 | call to len | provenance | Config | -| tst.go:14:2:14:30 | ... = ...[0] | tst.go:15:26:15:33 | jsonData | provenance | | +| tst.go:14:2:14:30 | extract:0 ... = ... | tst.go:15:26:15:33 | jsonData | provenance | | | tst.go:15:26:15:33 | jsonData | tst.go:15:22:15:34 | call to len | provenance | Config | -| tst.go:20:2:20:31 | ... = ...[0] | tst.go:21:26:21:33 | jsonData | provenance | | +| tst.go:20:2:20:31 | extract:0 ... = ... | tst.go:21:26:21:33 | jsonData | provenance | | | tst.go:21:26:21:33 | jsonData | tst.go:21:22:21:34 | call to len | provenance | Config | -| tst.go:26:2:26:31 | ... = ...[0] | tst.go:27:30:27:37 | jsonData | provenance | | +| tst.go:26:2:26:31 | extract:0 ... = ... | tst.go:27:30:27:37 | jsonData | provenance | | | tst.go:27:30:27:37 | jsonData | tst.go:27:26:27:38 | call to len | provenance | Config | -| tst.go:34:2:34:30 | ... = ...[0] | tst.go:35:26:35:33 | jsonData | provenance | | +| tst.go:34:2:34:30 | extract:0 ... = ... | tst.go:35:26:35:33 | jsonData | provenance | | | tst.go:35:26:35:33 | jsonData | tst.go:35:22:35:34 | call to len | provenance | Config | models | 1 | Source: io/ioutil; ; false; ReadFile; ; ; ReturnValue[0]; file; manual | nodes -| AllocationSizeOverflow.go:6:2:6:33 | ... := ...[0] | semmle.label | ... := ...[0] | +| AllocationSizeOverflow.go:6:2:6:33 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | AllocationSizeOverflow.go:10:10:10:22 | call to len | semmle.label | call to len | | AllocationSizeOverflow.go:10:14:10:21 | jsonData | semmle.label | jsonData | -| tst2.go:9:2:9:37 | ... := ...[0] | semmle.label | ... := ...[0] | +| tst2.go:9:2:9:37 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | tst2.go:10:22:10:30 | call to len | semmle.label | call to len | | tst2.go:10:26:10:29 | data | semmle.label | data | -| tst2.go:14:2:14:29 | ... := ...[0] | semmle.label | ... := ...[0] | +| tst2.go:14:2:14:29 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | tst2.go:15:22:15:30 | call to len | semmle.label | call to len | | tst2.go:15:26:15:29 | data | semmle.label | data | -| tst3.go:6:2:6:31 | ... := ...[0] | semmle.label | ... := ...[0] | +| tst3.go:6:2:6:31 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | tst3.go:7:22:7:34 | call to len | semmle.label | call to len | | tst3.go:7:26:7:33 | jsonData | semmle.label | jsonData | | tst3.go:9:32:9:39 | jsonData | semmle.label | jsonData | @@ -55,16 +55,16 @@ nodes | tst3.go:24:20:24:27 | jsonData | semmle.label | jsonData | | tst3.go:32:16:32:28 | call to len | semmle.label | call to len | | tst3.go:32:20:32:27 | jsonData | semmle.label | jsonData | -| tst.go:14:2:14:30 | ... = ...[0] | semmle.label | ... = ...[0] | +| tst.go:14:2:14:30 | extract:0 ... = ... | semmle.label | extract:0 ... = ... | | tst.go:15:22:15:34 | call to len | semmle.label | call to len | | tst.go:15:26:15:33 | jsonData | semmle.label | jsonData | -| tst.go:20:2:20:31 | ... = ...[0] | semmle.label | ... = ...[0] | +| tst.go:20:2:20:31 | extract:0 ... = ... | semmle.label | extract:0 ... = ... | | tst.go:21:22:21:34 | call to len | semmle.label | call to len | | tst.go:21:26:21:33 | jsonData | semmle.label | jsonData | -| tst.go:26:2:26:31 | ... = ...[0] | semmle.label | ... = ...[0] | +| tst.go:26:2:26:31 | extract:0 ... = ... | semmle.label | extract:0 ... = ... | | tst.go:27:26:27:38 | call to len | semmle.label | call to len | | tst.go:27:30:27:37 | jsonData | semmle.label | jsonData | -| tst.go:34:2:34:30 | ... = ...[0] | semmle.label | ... = ...[0] | +| tst.go:34:2:34:30 | extract:0 ... = ... | semmle.label | extract:0 ... = ... | | tst.go:35:22:35:34 | call to len | semmle.label | call to len | | tst.go:35:26:35:33 | jsonData | semmle.label | jsonData | subpaths diff --git a/go/ql/test/query-tests/Security/CWE-190/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-190/CONSISTENCY/DataFlowConsistency.expected index 26d6a7eec8e5..5d9da2284549 100644 --- a/go/ql/test/query-tests/Security/CWE-190/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/query-tests/Security/CWE-190/CONSISTENCY/DataFlowConsistency.expected @@ -1,3 +1,3 @@ reverseRead -| array_vs_contents.go:16:25:16:31 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| array_vs_contents.go:33:25:33:31 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| array_vs_contents.go:16:25:16:31 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | +| array_vs_contents.go:33:25:33:31 | implicit-deref request | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-295/DisabledCertificateCheck/DisabledCertificateCheck.expected b/go/ql/test/query-tests/Security/CWE-295/DisabledCertificateCheck/DisabledCertificateCheck.expected index 6e7de24be8e5..fc99e821181f 100644 --- a/go/ql/test/query-tests/Security/CWE-295/DisabledCertificateCheck/DisabledCertificateCheck.expected +++ b/go/ql/test/query-tests/Security/CWE-295/DisabledCertificateCheck/DisabledCertificateCheck.expected @@ -1,4 +1,4 @@ -| DisabledCertificateCheck.go:10:32:10:55 | init of key-value pair | InsecureSkipVerify should not be used in production code. | -| main.go:9:2:9:23 | assignment to field InsecureSkipVerify | InsecureSkipVerify should not be used in production code. | -| main.go:57:21:57:44 | init of key-value pair | InsecureSkipVerify should not be used in production code. | -| main.go:62:32:62:55 | init of key-value pair | InsecureSkipVerify should not be used in production code. | +| DisabledCertificateCheck.go:10:32:10:55 | lit-init key-value pair | InsecureSkipVerify should not be used in production code. | +| main.go:9:2:9:30 | assign:0 ... = ... | InsecureSkipVerify should not be used in production code. | +| main.go:57:21:57:44 | lit-init key-value pair | InsecureSkipVerify should not be used in production code. | +| main.go:62:32:62:55 | lit-init key-value pair | InsecureSkipVerify should not be used in production code. | diff --git a/go/ql/test/query-tests/Security/CWE-312/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-312/CONSISTENCY/DataFlowConsistency.expected index 9161b6f3eb9c..12cd207a4e09 100644 --- a/go/ql/test/query-tests/Security/CWE-312/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/query-tests/Security/CWE-312/CONSISTENCY/DataFlowConsistency.expected @@ -1,12 +1,12 @@ reverseRead -| CleartextLogging.go:11:11:11:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| CleartextLogging.go:12:9:12:9 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| CleartextLoggingGood.go:12:11:12:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| CleartextLoggingGood.go:13:9:13:9 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| CleartextLoggingGood.go:25:14:25:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| klog.go:27:13:27:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| CleartextLogging.go:11:11:11:11 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| CleartextLogging.go:12:9:12:9 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| CleartextLoggingGood.go:12:11:12:11 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| CleartextLoggingGood.go:13:9:13:9 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| CleartextLoggingGood.go:25:14:25:14 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| klog.go:27:13:27:13 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | | klog.go:28:13:28:20 | selection of Header | Origin of readStep is missing a PostUpdateNode. | -| klog.go:29:13:29:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| klog.go:29:13:29:13 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | | protos/query/query.pb.go:58:9:58:34 | file_query_proto_enumTypes | Origin of readStep is missing a PostUpdateNode. | | protos/query/query.pb.go:62:10:62:35 | file_query_proto_enumTypes | Origin of readStep is missing a PostUpdateNode. | | protos/query/query.pb.go:88:10:88:34 | file_query_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | @@ -15,17 +15,17 @@ reverseRead | protos/query/query.pb.go:169:9:169:33 | file_query_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | | protos/query/query.pb.go:204:10:204:34 | file_query_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | | protos/query/query.pb.go:217:9:217:33 | file_query_proto_msgTypes | Origin of readStep is missing a PostUpdateNode. | -| protos/query/query.pb.go:318:13:318:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| protos/query/query.pb.go:320:13:320:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| protos/query/query.pb.go:322:13:322:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| protos/query/query.pb.go:330:13:330:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| protos/query/query.pb.go:332:13:332:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| protos/query/query.pb.go:334:13:334:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| protos/query/query.pb.go:342:13:342:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| protos/query/query.pb.go:344:13:344:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| protos/query/query.pb.go:346:13:346:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| server1.go:11:11:11:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| server1.go:13:11:13:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:318:13:318:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:320:13:320:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:322:13:322:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:330:13:330:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:332:13:332:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:334:13:334:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:342:13:342:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:344:13:344:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| protos/query/query.pb.go:346:13:346:13 | implicit-deref v | Origin of readStep is missing a PostUpdateNode. | +| server1.go:11:11:11:11 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| server1.go:13:11:13:11 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | | server1.go:14:11:14:14 | vals | Origin of readStep is missing a PostUpdateNode. | -| server1.go:17:41:17:41 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| server1.go:21:46:21:46 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| server1.go:17:41:17:41 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| server1.go:21:46:21:46 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-312/CleartextLogging.expected b/go/ql/test/query-tests/Security/CWE-312/CleartextLogging.expected index 7a195352f395..51bb2c0dd4bd 100644 --- a/go/ql/test/query-tests/Security/CWE-312/CleartextLogging.expected +++ b/go/ql/test/query-tests/Security/CWE-312/CleartextLogging.expected @@ -1,80 +1,80 @@ #select | klog.go:23:15:23:20 | header | klog.go:21:30:21:37 | selection of Header | klog.go:23:15:23:20 | header | $@ flows to a logging call. | klog.go:21:30:21:37 | selection of Header | Sensitive data returned by HTTP request headers | | klog.go:29:13:29:41 | call to Get | klog.go:29:13:29:20 | selection of Header | klog.go:29:13:29:41 | call to Get | $@ flows to a logging call. | klog.go:29:13:29:20 | selection of Header | Sensitive data returned by HTTP request headers | -| main.go:19:12:19:19 | password | main.go:17:2:17:9 | SSA def(password) | main.go:19:12:19:19 | password | $@ flows to a logging call. | main.go:17:2:17:9 | SSA def(password) | Sensitive data returned by an access to password | -| main.go:20:19:20:26 | password | main.go:17:2:17:9 | SSA def(password) | main.go:20:19:20:26 | password | $@ flows to a logging call. | main.go:17:2:17:9 | SSA def(password) | Sensitive data returned by an access to password | -| main.go:21:13:21:20 | password | main.go:17:2:17:9 | SSA def(password) | main.go:21:13:21:20 | password | $@ flows to a logging call. | main.go:17:2:17:9 | SSA def(password) | Sensitive data returned by an access to password | -| main.go:22:14:22:21 | password | main.go:17:2:17:9 | SSA def(password) | main.go:22:14:22:21 | password | $@ flows to a logging call. | main.go:17:2:17:9 | SSA def(password) | Sensitive data returned by an access to password | -| main.go:24:13:24:20 | password | main.go:17:2:17:9 | SSA def(password) | main.go:24:13:24:20 | password | $@ flows to a logging call. | main.go:17:2:17:9 | SSA def(password) | Sensitive data returned by an access to password | -| main.go:27:20:27:27 | password | main.go:17:2:17:9 | SSA def(password) | main.go:27:20:27:27 | password | $@ flows to a logging call. | main.go:17:2:17:9 | SSA def(password) | Sensitive data returned by an access to password | -| main.go:30:14:30:21 | password | main.go:17:2:17:9 | SSA def(password) | main.go:30:14:30:21 | password | $@ flows to a logging call. | main.go:17:2:17:9 | SSA def(password) | Sensitive data returned by an access to password | -| main.go:33:15:33:22 | password | main.go:17:2:17:9 | SSA def(password) | main.go:33:15:33:22 | password | $@ flows to a logging call. | main.go:17:2:17:9 | SSA def(password) | Sensitive data returned by an access to password | -| main.go:36:13:36:20 | password | main.go:17:2:17:9 | SSA def(password) | main.go:36:13:36:20 | password | $@ flows to a logging call. | main.go:17:2:17:9 | SSA def(password) | Sensitive data returned by an access to password | -| main.go:39:20:39:27 | password | main.go:17:2:17:9 | SSA def(password) | main.go:39:20:39:27 | password | $@ flows to a logging call. | main.go:17:2:17:9 | SSA def(password) | Sensitive data returned by an access to password | -| main.go:42:14:42:21 | password | main.go:17:2:17:9 | SSA def(password) | main.go:42:14:42:21 | password | $@ flows to a logging call. | main.go:17:2:17:9 | SSA def(password) | Sensitive data returned by an access to password | -| main.go:45:15:45:22 | password | main.go:17:2:17:9 | SSA def(password) | main.go:45:15:45:22 | password | $@ flows to a logging call. | main.go:17:2:17:9 | SSA def(password) | Sensitive data returned by an access to password | -| main.go:47:16:47:23 | password | main.go:17:2:17:9 | SSA def(password) | main.go:47:16:47:23 | password | $@ flows to a logging call. | main.go:17:2:17:9 | SSA def(password) | Sensitive data returned by an access to password | -| main.go:51:10:51:17 | password | main.go:17:2:17:9 | SSA def(password) | main.go:51:10:51:17 | password | $@ flows to a logging call. | main.go:17:2:17:9 | SSA def(password) | Sensitive data returned by an access to password | -| main.go:52:17:52:24 | password | main.go:17:2:17:9 | SSA def(password) | main.go:52:17:52:24 | password | $@ flows to a logging call. | main.go:17:2:17:9 | SSA def(password) | Sensitive data returned by an access to password | -| main.go:53:11:53:18 | password | main.go:17:2:17:9 | SSA def(password) | main.go:53:11:53:18 | password | $@ flows to a logging call. | main.go:17:2:17:9 | SSA def(password) | Sensitive data returned by an access to password | -| main.go:54:12:54:19 | password | main.go:17:2:17:9 | SSA def(password) | main.go:54:12:54:19 | password | $@ flows to a logging call. | main.go:17:2:17:9 | SSA def(password) | Sensitive data returned by an access to password | -| main.go:56:11:56:18 | password | main.go:17:2:17:9 | SSA def(password) | main.go:56:11:56:18 | password | $@ flows to a logging call. | main.go:17:2:17:9 | SSA def(password) | Sensitive data returned by an access to password | -| main.go:59:18:59:25 | password | main.go:17:2:17:9 | SSA def(password) | main.go:59:18:59:25 | password | $@ flows to a logging call. | main.go:17:2:17:9 | SSA def(password) | Sensitive data returned by an access to password | -| main.go:62:12:62:19 | password | main.go:17:2:17:9 | SSA def(password) | main.go:62:12:62:19 | password | $@ flows to a logging call. | main.go:17:2:17:9 | SSA def(password) | Sensitive data returned by an access to password | -| main.go:65:13:65:20 | password | main.go:17:2:17:9 | SSA def(password) | main.go:65:13:65:20 | password | $@ flows to a logging call. | main.go:17:2:17:9 | SSA def(password) | Sensitive data returned by an access to password | -| main.go:68:11:68:18 | password | main.go:17:2:17:9 | SSA def(password) | main.go:68:11:68:18 | password | $@ flows to a logging call. | main.go:17:2:17:9 | SSA def(password) | Sensitive data returned by an access to password | -| main.go:71:18:71:25 | password | main.go:17:2:17:9 | SSA def(password) | main.go:71:18:71:25 | password | $@ flows to a logging call. | main.go:17:2:17:9 | SSA def(password) | Sensitive data returned by an access to password | -| main.go:74:12:74:19 | password | main.go:17:2:17:9 | SSA def(password) | main.go:74:12:74:19 | password | $@ flows to a logging call. | main.go:17:2:17:9 | SSA def(password) | Sensitive data returned by an access to password | -| main.go:77:13:77:20 | password | main.go:17:2:17:9 | SSA def(password) | main.go:77:13:77:20 | password | $@ flows to a logging call. | main.go:17:2:17:9 | SSA def(password) | Sensitive data returned by an access to password | -| main.go:79:14:79:21 | password | main.go:17:2:17:9 | SSA def(password) | main.go:79:14:79:21 | password | $@ flows to a logging call. | main.go:17:2:17:9 | SSA def(password) | Sensitive data returned by an access to password | -| main.go:82:12:82:19 | password | main.go:17:2:17:9 | SSA def(password) | main.go:82:12:82:19 | password | $@ flows to a logging call. | main.go:17:2:17:9 | SSA def(password) | Sensitive data returned by an access to password | -| main.go:83:17:83:24 | password | main.go:17:2:17:9 | SSA def(password) | main.go:83:17:83:24 | password | $@ flows to a logging call. | main.go:17:2:17:9 | SSA def(password) | Sensitive data returned by an access to password | -| main.go:87:29:87:34 | fields | main.go:17:2:17:9 | SSA def(password) | main.go:87:29:87:34 | fields | $@ flows to a logging call. | main.go:17:2:17:9 | SSA def(password) | Sensitive data returned by an access to password | -| main.go:90:35:90:42 | password | main.go:17:2:17:9 | SSA def(password) | main.go:90:35:90:42 | password | $@ flows to a logging call. | main.go:17:2:17:9 | SSA def(password) | Sensitive data returned by an access to password | -| overrides.go:13:14:13:23 | call to String | overrides.go:8:2:8:9 | SSA def(password) | overrides.go:13:14:13:23 | call to String | $@ flows to a logging call. | overrides.go:8:2:8:9 | SSA def(password) | Sensitive data returned by an access to password | -| passwords.go:9:14:9:14 | x | passwords.go:21:2:21:9 | SSA def(password) | passwords.go:9:14:9:14 | x | $@ flows to a logging call. | passwords.go:21:2:21:9 | SSA def(password) | Sensitive data returned by an access to password | -| passwords.go:25:14:25:21 | password | passwords.go:21:2:21:9 | SSA def(password) | passwords.go:25:14:25:21 | password | $@ flows to a logging call. | passwords.go:21:2:21:9 | SSA def(password) | Sensitive data returned by an access to password | +| main.go:19:12:19:19 | password | main.go:17:2:17:23 | SSA def(password) | main.go:19:12:19:19 | password | $@ flows to a logging call. | main.go:17:2:17:23 | SSA def(password) | Sensitive data returned by an access to password | +| main.go:20:19:20:26 | password | main.go:17:2:17:23 | SSA def(password) | main.go:20:19:20:26 | password | $@ flows to a logging call. | main.go:17:2:17:23 | SSA def(password) | Sensitive data returned by an access to password | +| main.go:21:13:21:20 | password | main.go:17:2:17:23 | SSA def(password) | main.go:21:13:21:20 | password | $@ flows to a logging call. | main.go:17:2:17:23 | SSA def(password) | Sensitive data returned by an access to password | +| main.go:22:14:22:21 | password | main.go:17:2:17:23 | SSA def(password) | main.go:22:14:22:21 | password | $@ flows to a logging call. | main.go:17:2:17:23 | SSA def(password) | Sensitive data returned by an access to password | +| main.go:24:13:24:20 | password | main.go:17:2:17:23 | SSA def(password) | main.go:24:13:24:20 | password | $@ flows to a logging call. | main.go:17:2:17:23 | SSA def(password) | Sensitive data returned by an access to password | +| main.go:27:20:27:27 | password | main.go:17:2:17:23 | SSA def(password) | main.go:27:20:27:27 | password | $@ flows to a logging call. | main.go:17:2:17:23 | SSA def(password) | Sensitive data returned by an access to password | +| main.go:30:14:30:21 | password | main.go:17:2:17:23 | SSA def(password) | main.go:30:14:30:21 | password | $@ flows to a logging call. | main.go:17:2:17:23 | SSA def(password) | Sensitive data returned by an access to password | +| main.go:33:15:33:22 | password | main.go:17:2:17:23 | SSA def(password) | main.go:33:15:33:22 | password | $@ flows to a logging call. | main.go:17:2:17:23 | SSA def(password) | Sensitive data returned by an access to password | +| main.go:36:13:36:20 | password | main.go:17:2:17:23 | SSA def(password) | main.go:36:13:36:20 | password | $@ flows to a logging call. | main.go:17:2:17:23 | SSA def(password) | Sensitive data returned by an access to password | +| main.go:39:20:39:27 | password | main.go:17:2:17:23 | SSA def(password) | main.go:39:20:39:27 | password | $@ flows to a logging call. | main.go:17:2:17:23 | SSA def(password) | Sensitive data returned by an access to password | +| main.go:42:14:42:21 | password | main.go:17:2:17:23 | SSA def(password) | main.go:42:14:42:21 | password | $@ flows to a logging call. | main.go:17:2:17:23 | SSA def(password) | Sensitive data returned by an access to password | +| main.go:45:15:45:22 | password | main.go:17:2:17:23 | SSA def(password) | main.go:45:15:45:22 | password | $@ flows to a logging call. | main.go:17:2:17:23 | SSA def(password) | Sensitive data returned by an access to password | +| main.go:47:16:47:23 | password | main.go:17:2:17:23 | SSA def(password) | main.go:47:16:47:23 | password | $@ flows to a logging call. | main.go:17:2:17:23 | SSA def(password) | Sensitive data returned by an access to password | +| main.go:51:10:51:17 | password | main.go:17:2:17:23 | SSA def(password) | main.go:51:10:51:17 | password | $@ flows to a logging call. | main.go:17:2:17:23 | SSA def(password) | Sensitive data returned by an access to password | +| main.go:52:17:52:24 | password | main.go:17:2:17:23 | SSA def(password) | main.go:52:17:52:24 | password | $@ flows to a logging call. | main.go:17:2:17:23 | SSA def(password) | Sensitive data returned by an access to password | +| main.go:53:11:53:18 | password | main.go:17:2:17:23 | SSA def(password) | main.go:53:11:53:18 | password | $@ flows to a logging call. | main.go:17:2:17:23 | SSA def(password) | Sensitive data returned by an access to password | +| main.go:54:12:54:19 | password | main.go:17:2:17:23 | SSA def(password) | main.go:54:12:54:19 | password | $@ flows to a logging call. | main.go:17:2:17:23 | SSA def(password) | Sensitive data returned by an access to password | +| main.go:56:11:56:18 | password | main.go:17:2:17:23 | SSA def(password) | main.go:56:11:56:18 | password | $@ flows to a logging call. | main.go:17:2:17:23 | SSA def(password) | Sensitive data returned by an access to password | +| main.go:59:18:59:25 | password | main.go:17:2:17:23 | SSA def(password) | main.go:59:18:59:25 | password | $@ flows to a logging call. | main.go:17:2:17:23 | SSA def(password) | Sensitive data returned by an access to password | +| main.go:62:12:62:19 | password | main.go:17:2:17:23 | SSA def(password) | main.go:62:12:62:19 | password | $@ flows to a logging call. | main.go:17:2:17:23 | SSA def(password) | Sensitive data returned by an access to password | +| main.go:65:13:65:20 | password | main.go:17:2:17:23 | SSA def(password) | main.go:65:13:65:20 | password | $@ flows to a logging call. | main.go:17:2:17:23 | SSA def(password) | Sensitive data returned by an access to password | +| main.go:68:11:68:18 | password | main.go:17:2:17:23 | SSA def(password) | main.go:68:11:68:18 | password | $@ flows to a logging call. | main.go:17:2:17:23 | SSA def(password) | Sensitive data returned by an access to password | +| main.go:71:18:71:25 | password | main.go:17:2:17:23 | SSA def(password) | main.go:71:18:71:25 | password | $@ flows to a logging call. | main.go:17:2:17:23 | SSA def(password) | Sensitive data returned by an access to password | +| main.go:74:12:74:19 | password | main.go:17:2:17:23 | SSA def(password) | main.go:74:12:74:19 | password | $@ flows to a logging call. | main.go:17:2:17:23 | SSA def(password) | Sensitive data returned by an access to password | +| main.go:77:13:77:20 | password | main.go:17:2:17:23 | SSA def(password) | main.go:77:13:77:20 | password | $@ flows to a logging call. | main.go:17:2:17:23 | SSA def(password) | Sensitive data returned by an access to password | +| main.go:79:14:79:21 | password | main.go:17:2:17:23 | SSA def(password) | main.go:79:14:79:21 | password | $@ flows to a logging call. | main.go:17:2:17:23 | SSA def(password) | Sensitive data returned by an access to password | +| main.go:82:12:82:19 | password | main.go:17:2:17:23 | SSA def(password) | main.go:82:12:82:19 | password | $@ flows to a logging call. | main.go:17:2:17:23 | SSA def(password) | Sensitive data returned by an access to password | +| main.go:83:17:83:24 | password | main.go:17:2:17:23 | SSA def(password) | main.go:83:17:83:24 | password | $@ flows to a logging call. | main.go:17:2:17:23 | SSA def(password) | Sensitive data returned by an access to password | +| main.go:87:29:87:34 | fields | main.go:17:2:17:23 | SSA def(password) | main.go:87:29:87:34 | fields | $@ flows to a logging call. | main.go:17:2:17:23 | SSA def(password) | Sensitive data returned by an access to password | +| main.go:90:35:90:42 | password | main.go:17:2:17:23 | SSA def(password) | main.go:90:35:90:42 | password | $@ flows to a logging call. | main.go:17:2:17:23 | SSA def(password) | Sensitive data returned by an access to password | +| overrides.go:13:14:13:23 | call to String | overrides.go:8:2:8:40 | SSA def(password) | overrides.go:13:14:13:23 | call to String | $@ flows to a logging call. | overrides.go:8:2:8:40 | SSA def(password) | Sensitive data returned by an access to password | +| passwords.go:9:14:9:14 | x | passwords.go:21:2:21:23 | SSA def(password) | passwords.go:9:14:9:14 | x | $@ flows to a logging call. | passwords.go:21:2:21:23 | SSA def(password) | Sensitive data returned by an access to password | +| passwords.go:25:14:25:21 | password | passwords.go:21:2:21:23 | SSA def(password) | passwords.go:25:14:25:21 | password | $@ flows to a logging call. | passwords.go:21:2:21:23 | SSA def(password) | Sensitive data returned by an access to password | | passwords.go:26:14:26:23 | selection of password | passwords.go:26:14:26:23 | selection of password | passwords.go:26:14:26:23 | selection of password | $@ flows to a logging call. | passwords.go:26:14:26:23 | selection of password | Sensitive data returned by an access to password | | passwords.go:27:14:27:26 | call to getPassword | passwords.go:27:14:27:26 | call to getPassword | passwords.go:27:14:27:26 | call to getPassword | $@ flows to a logging call. | passwords.go:27:14:27:26 | call to getPassword | Sensitive data returned by a call to getPassword | | passwords.go:28:14:28:28 | call to getPassword | passwords.go:28:14:28:28 | call to getPassword | passwords.go:28:14:28:28 | call to getPassword | $@ flows to a logging call. | passwords.go:28:14:28:28 | call to getPassword | Sensitive data returned by a call to getPassword | -| passwords.go:33:13:33:20 | password | passwords.go:21:2:21:9 | SSA def(password) | passwords.go:33:13:33:20 | password | $@ flows to a logging call. | passwords.go:21:2:21:9 | SSA def(password) | Sensitive data returned by an access to password | -| passwords.go:36:14:36:35 | ...+... | passwords.go:21:2:21:9 | SSA def(password) | passwords.go:36:14:36:35 | ...+... | $@ flows to a logging call. | passwords.go:21:2:21:9 | SSA def(password) | Sensitive data returned by an access to password | +| passwords.go:33:13:33:20 | password | passwords.go:21:2:21:23 | SSA def(password) | passwords.go:33:13:33:20 | password | $@ flows to a logging call. | passwords.go:21:2:21:23 | SSA def(password) | Sensitive data returned by an access to password | +| passwords.go:36:14:36:35 | ...+... | passwords.go:21:2:21:23 | SSA def(password) | passwords.go:36:14:36:35 | ...+... | $@ flows to a logging call. | passwords.go:21:2:21:23 | SSA def(password) | Sensitive data returned by an access to password | | passwords.go:41:14:41:17 | obj1 | passwords.go:39:13:39:13 | x | passwords.go:41:14:41:17 | obj1 | $@ flows to a logging call. | passwords.go:39:13:39:13 | x | Sensitive data returned by an access to password | -| passwords.go:46:14:46:17 | obj2 | passwords.go:21:2:21:9 | SSA def(password) | passwords.go:46:14:46:17 | obj2 | $@ flows to a logging call. | passwords.go:21:2:21:9 | SSA def(password) | Sensitive data returned by an access to password | -| passwords.go:53:14:53:27 | fixed_password | passwords.go:52:2:52:15 | SSA def(fixed_password) | passwords.go:53:14:53:27 | fixed_password | $@ flows to a logging call. | passwords.go:52:2:52:15 | SSA def(fixed_password) | Sensitive data returned by an access to fixed_password | +| passwords.go:46:14:46:17 | obj2 | passwords.go:21:2:21:23 | SSA def(password) | passwords.go:46:14:46:17 | obj2 | $@ flows to a logging call. | passwords.go:21:2:21:23 | SSA def(password) | Sensitive data returned by an access to password | +| passwords.go:53:14:53:27 | fixed_password | passwords.go:52:2:52:44 | SSA def(fixed_password) | passwords.go:53:14:53:27 | fixed_password | $@ flows to a logging call. | passwords.go:52:2:52:44 | SSA def(fixed_password) | Sensitive data returned by an access to fixed_password | | passwords.go:91:14:91:26 | utilityObject | passwords.go:89:16:89:36 | call to make | passwords.go:91:14:91:26 | utilityObject | $@ flows to a logging call. | passwords.go:89:16:89:36 | call to make | Sensitive data returned by an access to passwordSet | -| passwords.go:94:23:94:28 | secret | passwords.go:21:2:21:9 | SSA def(password) | passwords.go:94:23:94:28 | secret | $@ flows to a logging call. | passwords.go:21:2:21:9 | SSA def(password) | Sensitive data returned by an access to password | -| passwords.go:104:15:104:40 | ...+... | passwords.go:21:2:21:9 | SSA def(password) | passwords.go:104:15:104:40 | ...+... | $@ flows to a logging call. | passwords.go:21:2:21:9 | SSA def(password) | Sensitive data returned by an access to password | -| passwords.go:110:16:110:41 | ...+... | passwords.go:21:2:21:9 | SSA def(password) | passwords.go:110:16:110:41 | ...+... | $@ flows to a logging call. | passwords.go:21:2:21:9 | SSA def(password) | Sensitive data returned by an access to password | -| passwords.go:115:15:115:40 | ...+... | passwords.go:21:2:21:9 | SSA def(password) | passwords.go:115:15:115:40 | ...+... | $@ flows to a logging call. | passwords.go:21:2:21:9 | SSA def(password) | Sensitive data returned by an access to password | -| passwords.go:119:14:119:45 | ...+... | passwords.go:118:6:118:14 | SSA def(password1) | passwords.go:119:14:119:45 | ...+... | $@ flows to a logging call. | passwords.go:118:6:118:14 | SSA def(password1) | Sensitive data returned by an access to password1 | -| passwords.go:129:14:129:19 | config | passwords.go:21:2:21:9 | SSA def(password) | passwords.go:129:14:129:19 | config | $@ flows to a logging call. | passwords.go:21:2:21:9 | SSA def(password) | Sensitive data returned by an access to password | +| passwords.go:94:23:94:28 | secret | passwords.go:21:2:21:23 | SSA def(password) | passwords.go:94:23:94:28 | secret | $@ flows to a logging call. | passwords.go:21:2:21:23 | SSA def(password) | Sensitive data returned by an access to password | +| passwords.go:104:15:104:40 | ...+... | passwords.go:21:2:21:23 | SSA def(password) | passwords.go:104:15:104:40 | ...+... | $@ flows to a logging call. | passwords.go:21:2:21:23 | SSA def(password) | Sensitive data returned by an access to password | +| passwords.go:110:16:110:41 | ...+... | passwords.go:21:2:21:23 | SSA def(password) | passwords.go:110:16:110:41 | ...+... | $@ flows to a logging call. | passwords.go:21:2:21:23 | SSA def(password) | Sensitive data returned by an access to password | +| passwords.go:115:15:115:40 | ...+... | passwords.go:21:2:21:23 | SSA def(password) | passwords.go:115:15:115:40 | ...+... | $@ flows to a logging call. | passwords.go:21:2:21:23 | SSA def(password) | Sensitive data returned by an access to password | +| passwords.go:119:14:119:45 | ...+... | passwords.go:118:6:118:50 | SSA def(password1) | passwords.go:119:14:119:45 | ...+... | $@ flows to a logging call. | passwords.go:118:6:118:50 | SSA def(password1) | Sensitive data returned by an access to password1 | +| passwords.go:129:14:129:19 | config | passwords.go:21:2:21:23 | SSA def(password) | passwords.go:129:14:129:19 | config | $@ flows to a logging call. | passwords.go:21:2:21:23 | SSA def(password) | Sensitive data returned by an access to password | | passwords.go:129:14:129:19 | config | passwords.go:123:13:123:14 | x3 | passwords.go:129:14:129:19 | config | $@ flows to a logging call. | passwords.go:123:13:123:14 | x3 | Sensitive data returned by an access to password | | passwords.go:129:14:129:19 | config | passwords.go:126:13:126:25 | call to getPassword | passwords.go:129:14:129:19 | config | $@ flows to a logging call. | passwords.go:126:13:126:25 | call to getPassword | Sensitive data returned by a call to getPassword | -| passwords.go:130:14:130:21 | selection of x | passwords.go:21:2:21:9 | SSA def(password) | passwords.go:130:14:130:21 | selection of x | $@ flows to a logging call. | passwords.go:21:2:21:9 | SSA def(password) | Sensitive data returned by an access to password | +| passwords.go:130:14:130:21 | selection of x | passwords.go:21:2:21:23 | SSA def(password) | passwords.go:130:14:130:21 | selection of x | $@ flows to a logging call. | passwords.go:21:2:21:23 | SSA def(password) | Sensitive data returned by an access to password | | passwords.go:131:14:131:21 | selection of y | passwords.go:126:13:126:25 | call to getPassword | passwords.go:131:14:131:21 | selection of y | $@ flows to a logging call. | passwords.go:126:13:126:25 | call to getPassword | Sensitive data returned by a call to getPassword | -| protobuf.go:14:14:14:35 | call to GetDescription | protobuf.go:9:2:9:9 | SSA def(password) | protobuf.go:14:14:14:35 | call to GetDescription | $@ flows to a logging call. | protobuf.go:9:2:9:9 | SSA def(password) | Sensitive data returned by an access to password | +| protobuf.go:14:14:14:35 | call to GetDescription | protobuf.go:9:2:9:23 | SSA def(password) | protobuf.go:14:14:14:35 | call to GetDescription | $@ flows to a logging call. | protobuf.go:9:2:9:23 | SSA def(password) | Sensitive data returned by an access to password | edges -| klog.go:21:3:26:3 | range statement[1] | klog.go:22:27:22:33 | headers | provenance | | -| klog.go:21:30:21:37 | selection of Header | klog.go:21:3:26:3 | range statement[1] | provenance | Src:MaD:11 Config | -| klog.go:22:4:25:4 | range statement[1] | klog.go:23:15:23:20 | header | provenance | | -| klog.go:22:27:22:33 | headers | klog.go:22:4:25:4 | range statement[1] | provenance | Config | +| klog.go:21:3:26:3 | extract:1 range statement | klog.go:22:27:22:33 | headers | provenance | | +| klog.go:21:30:21:37 | selection of Header | klog.go:21:3:26:3 | extract:1 range statement | provenance | Src:MaD:11 Config | +| klog.go:22:4:25:4 | extract:1 range statement | klog.go:23:15:23:20 | header | provenance | | +| klog.go:22:27:22:33 | headers | klog.go:22:4:25:4 | extract:1 range statement | provenance | Config | | klog.go:29:13:29:20 | selection of Header | klog.go:29:13:29:41 | call to Get | provenance | Src:MaD:11 Config | -| main.go:17:2:17:9 | SSA def(password) | main.go:19:12:19:19 | password | provenance | | -| main.go:17:2:17:9 | SSA def(password) | main.go:20:19:20:26 | password | provenance | | -| main.go:17:2:17:9 | SSA def(password) | main.go:21:13:21:20 | password | provenance | Sink:MaD:6 | -| main.go:17:2:17:9 | SSA def(password) | main.go:22:14:22:21 | password | provenance | | -| main.go:17:2:17:9 | SSA def(password) | main.go:24:13:24:20 | password | provenance | | -| main.go:17:2:17:9 | SSA def(password) | main.go:27:20:27:27 | password | provenance | | -| main.go:17:2:17:9 | SSA def(password) | main.go:30:14:30:21 | password | provenance | Sink:MaD:3 | -| main.go:17:2:17:9 | SSA def(password) | main.go:33:15:33:22 | password | provenance | | -| main.go:17:2:17:9 | SSA def(password) | main.go:36:13:36:20 | password | provenance | | -| main.go:17:2:17:9 | SSA def(password) | main.go:39:20:39:27 | password | provenance | | -| main.go:17:2:17:9 | SSA def(password) | main.go:42:14:42:21 | password | provenance | Sink:MaD:5 | -| main.go:17:2:17:9 | SSA def(password) | main.go:45:15:45:22 | password | provenance | | -| main.go:17:2:17:9 | SSA def(password) | main.go:47:16:47:23 | password | provenance | Sink:MaD:4 | -| main.go:17:2:17:9 | SSA def(password) | main.go:51:10:51:17 | password | provenance | | -| main.go:17:2:17:9 | SSA def(password) | main.go:51:10:51:17 | password | provenance | | +| main.go:17:2:17:23 | SSA def(password) | main.go:19:12:19:19 | password | provenance | | +| main.go:17:2:17:23 | SSA def(password) | main.go:20:19:20:26 | password | provenance | | +| main.go:17:2:17:23 | SSA def(password) | main.go:21:13:21:20 | password | provenance | Sink:MaD:6 | +| main.go:17:2:17:23 | SSA def(password) | main.go:22:14:22:21 | password | provenance | | +| main.go:17:2:17:23 | SSA def(password) | main.go:24:13:24:20 | password | provenance | | +| main.go:17:2:17:23 | SSA def(password) | main.go:27:20:27:27 | password | provenance | | +| main.go:17:2:17:23 | SSA def(password) | main.go:30:14:30:21 | password | provenance | Sink:MaD:3 | +| main.go:17:2:17:23 | SSA def(password) | main.go:33:15:33:22 | password | provenance | | +| main.go:17:2:17:23 | SSA def(password) | main.go:36:13:36:20 | password | provenance | | +| main.go:17:2:17:23 | SSA def(password) | main.go:39:20:39:27 | password | provenance | | +| main.go:17:2:17:23 | SSA def(password) | main.go:42:14:42:21 | password | provenance | Sink:MaD:5 | +| main.go:17:2:17:23 | SSA def(password) | main.go:45:15:45:22 | password | provenance | | +| main.go:17:2:17:23 | SSA def(password) | main.go:47:16:47:23 | password | provenance | Sink:MaD:4 | +| main.go:17:2:17:23 | SSA def(password) | main.go:51:10:51:17 | password | provenance | | +| main.go:17:2:17:23 | SSA def(password) | main.go:51:10:51:17 | password | provenance | | | main.go:51:10:51:17 | password | main.go:52:17:52:24 | password | provenance | | | main.go:51:10:51:17 | password | main.go:52:17:52:24 | password | provenance | | | main.go:52:17:52:24 | password | main.go:53:11:53:18 | password | provenance | | @@ -97,13 +97,13 @@ edges | main.go:86:2:86:7 | fields [postupdate] | main.go:87:29:87:34 | fields | provenance | Sink:MaD:2 | | main.go:86:19:86:26 | password | main.go:86:2:86:7 | fields [postupdate] | provenance | Config | | main.go:86:19:86:26 | password | main.go:90:35:90:42 | password | provenance | Sink:MaD:1 | -| overrides.go:8:2:8:9 | SSA def(password) | overrides.go:9:9:9:16 | password | provenance | | +| overrides.go:8:2:8:40 | SSA def(password) | overrides.go:9:9:9:16 | password | provenance | | | overrides.go:9:9:9:16 | password | overrides.go:13:14:13:23 | call to String | provenance | | | passwords.go:8:12:8:12 | SSA def(x) | passwords.go:9:14:9:14 | x | provenance | | -| passwords.go:21:2:21:9 | SSA def(password) | passwords.go:25:14:25:21 | password | provenance | | -| passwords.go:21:2:21:9 | SSA def(password) | passwords.go:30:8:30:15 | password | provenance | | -| passwords.go:21:2:21:9 | SSA def(password) | passwords.go:33:13:33:20 | password | provenance | | -| passwords.go:21:2:21:9 | SSA def(password) | passwords.go:36:28:36:35 | password | provenance | | +| passwords.go:21:2:21:23 | SSA def(password) | passwords.go:25:14:25:21 | password | provenance | | +| passwords.go:21:2:21:23 | SSA def(password) | passwords.go:30:8:30:15 | password | provenance | | +| passwords.go:21:2:21:23 | SSA def(password) | passwords.go:33:13:33:20 | password | provenance | | +| passwords.go:21:2:21:23 | SSA def(password) | passwords.go:36:28:36:35 | password | provenance | | | passwords.go:30:8:30:15 | password | passwords.go:8:12:8:12 | SSA def(x) | provenance | | | passwords.go:36:28:36:35 | password | passwords.go:36:14:36:35 | ...+... | provenance | Config | | passwords.go:36:28:36:35 | password | passwords.go:44:6:44:13 | password | provenance | | @@ -117,7 +117,7 @@ edges | passwords.go:50:11:50:18 | password | passwords.go:110:34:110:41 | password | provenance | | | passwords.go:50:11:50:18 | password | passwords.go:115:33:115:40 | password | provenance | | | passwords.go:50:11:50:18 | password | passwords.go:125:13:125:20 | password | provenance | | -| passwords.go:52:2:52:15 | SSA def(fixed_password) | passwords.go:53:14:53:27 | fixed_password | provenance | | +| passwords.go:52:2:52:44 | SSA def(fixed_password) | passwords.go:53:14:53:27 | fixed_password | provenance | | | passwords.go:88:19:90:2 | struct literal | passwords.go:91:14:91:26 | utilityObject | provenance | | | passwords.go:89:16:89:36 | call to make | passwords.go:88:19:90:2 | struct literal | provenance | Config | | passwords.go:104:33:104:40 | password | passwords.go:104:15:104:40 | ...+... | provenance | Config | @@ -129,7 +129,7 @@ edges | passwords.go:110:34:110:41 | password | passwords.go:125:13:125:20 | password | provenance | | | passwords.go:115:33:115:40 | password | passwords.go:115:15:115:40 | ...+... | provenance | Config | | passwords.go:115:33:115:40 | password | passwords.go:125:13:125:20 | password | provenance | | -| passwords.go:118:6:118:14 | SSA def(password1) | passwords.go:119:28:119:36 | password1 | provenance | | +| passwords.go:118:6:118:50 | SSA def(password1) | passwords.go:119:28:119:36 | password1 | provenance | | | passwords.go:119:28:119:36 | password1 | passwords.go:119:28:119:45 | call to String | provenance | Config | | passwords.go:119:28:119:45 | call to String | passwords.go:119:14:119:45 | ...+... | provenance | Config | | passwords.go:122:12:127:2 | struct literal | passwords.go:129:14:129:19 | config | provenance | | @@ -142,15 +142,15 @@ edges | passwords.go:126:13:126:25 | call to getPassword | passwords.go:122:12:127:2 | struct literal [y] | provenance | | | passwords.go:130:14:130:19 | config [x] | passwords.go:130:14:130:21 | selection of x | provenance | | | passwords.go:131:14:131:19 | config [y] | passwords.go:131:14:131:21 | selection of y | provenance | | -| protobuf.go:9:2:9:9 | SSA def(password) | protobuf.go:12:22:12:29 | password | provenance | | -| protobuf.go:12:2:12:6 | implicit dereference [postupdate] [Description] | protobuf.go:12:2:12:6 | query [postupdate] [pointer, Description] | provenance | | +| protobuf.go:9:2:9:23 | SSA def(password) | protobuf.go:12:22:12:29 | password | provenance | | +| protobuf.go:12:2:12:6 | implicit-deref query [postupdate] [Description] | protobuf.go:12:2:12:6 | query [postupdate] [pointer, Description] | provenance | | | protobuf.go:12:2:12:6 | query [postupdate] [pointer, Description] | protobuf.go:14:14:14:18 | query [pointer, Description] | provenance | | -| protobuf.go:12:22:12:29 | password | protobuf.go:12:2:12:6 | implicit dereference [postupdate] [Description] | provenance | | +| protobuf.go:12:22:12:29 | password | protobuf.go:12:2:12:6 | implicit-deref query [postupdate] [Description] | provenance | | | protobuf.go:14:14:14:18 | query [pointer, Description] | protobuf.go:14:14:14:35 | call to GetDescription | provenance | | | protobuf.go:14:14:14:18 | query [pointer, Description] | protos/query/query.pb.go:117:7:117:7 | SSA def(x) [pointer, Description] | provenance | | | protos/query/query.pb.go:117:7:117:7 | SSA def(x) [pointer, Description] | protos/query/query.pb.go:119:10:119:10 | x [pointer, Description] | provenance | | -| protos/query/query.pb.go:119:10:119:10 | implicit dereference [Description] | protos/query/query.pb.go:119:10:119:22 | selection of Description | provenance | | -| protos/query/query.pb.go:119:10:119:10 | x [pointer, Description] | protos/query/query.pb.go:119:10:119:10 | implicit dereference [Description] | provenance | | +| protos/query/query.pb.go:119:10:119:10 | implicit-deref x [Description] | protos/query/query.pb.go:119:10:119:22 | selection of Description | provenance | | +| protos/query/query.pb.go:119:10:119:10 | x [pointer, Description] | protos/query/query.pb.go:119:10:119:10 | implicit-deref x [Description] | provenance | | models | 1 | Sink: group:logrus; ; false; WithField; ; ; Argument[0..1]; log-injection; manual | | 2 | Sink: group:logrus; ; false; WithFields; ; ; Argument[0]; log-injection; manual | @@ -164,14 +164,14 @@ models | 10 | Sink: log; Logger; true; Printf; ; ; Argument[0..1]; log-injection; manual | | 11 | Source: net/http; Request; true; Header; ; ; ; remote; manual | nodes -| klog.go:21:3:26:3 | range statement[1] | semmle.label | range statement[1] | +| klog.go:21:3:26:3 | extract:1 range statement | semmle.label | extract:1 range statement | | klog.go:21:30:21:37 | selection of Header | semmle.label | selection of Header | -| klog.go:22:4:25:4 | range statement[1] | semmle.label | range statement[1] | +| klog.go:22:4:25:4 | extract:1 range statement | semmle.label | extract:1 range statement | | klog.go:22:27:22:33 | headers | semmle.label | headers | | klog.go:23:15:23:20 | header | semmle.label | header | | klog.go:29:13:29:20 | selection of Header | semmle.label | selection of Header | | klog.go:29:13:29:41 | call to Get | semmle.label | call to Get | -| main.go:17:2:17:9 | SSA def(password) | semmle.label | SSA def(password) | +| main.go:17:2:17:23 | SSA def(password) | semmle.label | SSA def(password) | | main.go:19:12:19:19 | password | semmle.label | password | | main.go:20:19:20:26 | password | semmle.label | password | | main.go:21:13:21:20 | password | semmle.label | password | @@ -209,12 +209,12 @@ nodes | main.go:86:19:86:26 | password | semmle.label | password | | main.go:87:29:87:34 | fields | semmle.label | fields | | main.go:90:35:90:42 | password | semmle.label | password | -| overrides.go:8:2:8:9 | SSA def(password) | semmle.label | SSA def(password) | +| overrides.go:8:2:8:40 | SSA def(password) | semmle.label | SSA def(password) | | overrides.go:9:9:9:16 | password | semmle.label | password | | overrides.go:13:14:13:23 | call to String | semmle.label | call to String | | passwords.go:8:12:8:12 | SSA def(x) | semmle.label | SSA def(x) | | passwords.go:9:14:9:14 | x | semmle.label | x | -| passwords.go:21:2:21:9 | SSA def(password) | semmle.label | SSA def(password) | +| passwords.go:21:2:21:23 | SSA def(password) | semmle.label | SSA def(password) | | passwords.go:25:14:25:21 | password | semmle.label | password | | passwords.go:26:14:26:23 | selection of password | semmle.label | selection of password | | passwords.go:27:14:27:26 | call to getPassword | semmle.label | call to getPassword | @@ -230,7 +230,7 @@ nodes | passwords.go:44:6:44:13 | password | semmle.label | password | | passwords.go:46:14:46:17 | obj2 | semmle.label | obj2 | | passwords.go:50:11:50:18 | password | semmle.label | password | -| passwords.go:52:2:52:15 | SSA def(fixed_password) | semmle.label | SSA def(fixed_password) | +| passwords.go:52:2:52:44 | SSA def(fixed_password) | semmle.label | SSA def(fixed_password) | | passwords.go:53:14:53:27 | fixed_password | semmle.label | fixed_password | | passwords.go:88:19:90:2 | struct literal | semmle.label | struct literal | | passwords.go:89:16:89:36 | call to make | semmle.label | call to make | @@ -242,7 +242,7 @@ nodes | passwords.go:110:34:110:41 | password | semmle.label | password | | passwords.go:115:15:115:40 | ...+... | semmle.label | ...+... | | passwords.go:115:33:115:40 | password | semmle.label | password | -| passwords.go:118:6:118:14 | SSA def(password1) | semmle.label | SSA def(password1) | +| passwords.go:118:6:118:50 | SSA def(password1) | semmle.label | SSA def(password1) | | passwords.go:119:14:119:45 | ...+... | semmle.label | ...+... | | passwords.go:119:28:119:36 | password1 | semmle.label | password1 | | passwords.go:119:28:119:45 | call to String | semmle.label | call to String | @@ -257,14 +257,14 @@ nodes | passwords.go:130:14:130:21 | selection of x | semmle.label | selection of x | | passwords.go:131:14:131:19 | config [y] | semmle.label | config [y] | | passwords.go:131:14:131:21 | selection of y | semmle.label | selection of y | -| protobuf.go:9:2:9:9 | SSA def(password) | semmle.label | SSA def(password) | -| protobuf.go:12:2:12:6 | implicit dereference [postupdate] [Description] | semmle.label | implicit dereference [postupdate] [Description] | +| protobuf.go:9:2:9:23 | SSA def(password) | semmle.label | SSA def(password) | +| protobuf.go:12:2:12:6 | implicit-deref query [postupdate] [Description] | semmle.label | implicit-deref query [postupdate] [Description] | | protobuf.go:12:2:12:6 | query [postupdate] [pointer, Description] | semmle.label | query [postupdate] [pointer, Description] | | protobuf.go:12:22:12:29 | password | semmle.label | password | | protobuf.go:14:14:14:18 | query [pointer, Description] | semmle.label | query [pointer, Description] | | protobuf.go:14:14:14:35 | call to GetDescription | semmle.label | call to GetDescription | | protos/query/query.pb.go:117:7:117:7 | SSA def(x) [pointer, Description] | semmle.label | SSA def(x) [pointer, Description] | -| protos/query/query.pb.go:119:10:119:10 | implicit dereference [Description] | semmle.label | implicit dereference [Description] | +| protos/query/query.pb.go:119:10:119:10 | implicit-deref x [Description] | semmle.label | implicit-deref x [Description] | | protos/query/query.pb.go:119:10:119:10 | x [pointer, Description] | semmle.label | x [pointer, Description] | | protos/query/query.pb.go:119:10:119:22 | selection of Description | semmle.label | selection of Description | subpaths diff --git a/go/ql/test/query-tests/Security/CWE-322/InsecureHostKeyCallback.expected b/go/ql/test/query-tests/Security/CWE-322/InsecureHostKeyCallback.expected index 0f0bc8bf2591..130e2a6781f3 100644 --- a/go/ql/test/query-tests/Security/CWE-322/InsecureHostKeyCallback.expected +++ b/go/ql/test/query-tests/Security/CWE-322/InsecureHostKeyCallback.expected @@ -10,7 +10,7 @@ edges | InsecureHostKeyCallbackExample.go:45:3:47:3 | function literal | InsecureHostKeyCallbackExample.go:52:20:52:48 | type conversion | provenance | | | InsecureHostKeyCallbackExample.go:58:39:58:46 | SSA def(callback) | InsecureHostKeyCallbackExample.go:62:20:62:27 | callback | provenance | | | InsecureHostKeyCallbackExample.go:68:48:68:55 | SSA def(callback) | InsecureHostKeyCallbackExample.go:78:28:78:35 | callback | provenance | | -| InsecureHostKeyCallbackExample.go:94:3:94:43 | ... := ...[0] | InsecureHostKeyCallbackExample.go:95:28:95:35 | callback | provenance | | +| InsecureHostKeyCallbackExample.go:94:3:94:43 | extract:0 ... := ... | InsecureHostKeyCallbackExample.go:95:28:95:35 | callback | provenance | | | InsecureHostKeyCallbackExample.go:102:22:105:4 | type conversion | InsecureHostKeyCallbackExample.go:107:35:107:50 | insecureCallback | provenance | | | InsecureHostKeyCallbackExample.go:103:3:105:3 | function literal | InsecureHostKeyCallbackExample.go:102:22:105:4 | type conversion | provenance | | | InsecureHostKeyCallbackExample.go:107:35:107:50 | insecureCallback | InsecureHostKeyCallbackExample.go:58:39:58:46 | SSA def(callback) | provenance | | @@ -35,7 +35,7 @@ nodes | InsecureHostKeyCallbackExample.go:76:28:76:54 | call to InsecureIgnoreHostKey | semmle.label | call to InsecureIgnoreHostKey | | InsecureHostKeyCallbackExample.go:78:28:78:35 | callback | semmle.label | callback | | InsecureHostKeyCallbackExample.go:92:28:92:54 | call to InsecureIgnoreHostKey | semmle.label | call to InsecureIgnoreHostKey | -| InsecureHostKeyCallbackExample.go:94:3:94:43 | ... := ...[0] | semmle.label | ... := ...[0] | +| InsecureHostKeyCallbackExample.go:94:3:94:43 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | InsecureHostKeyCallbackExample.go:95:28:95:35 | callback | semmle.label | callback | | InsecureHostKeyCallbackExample.go:102:22:105:4 | type conversion | semmle.label | type conversion | | InsecureHostKeyCallbackExample.go:103:3:105:3 | function literal | semmle.label | function literal | diff --git a/go/ql/test/query-tests/Security/CWE-327/BrokenCryptoAlgorithm.expected b/go/ql/test/query-tests/Security/CWE-327/BrokenCryptoAlgorithm.expected index 00eb67fea0ba..17c258a601bd 100644 --- a/go/ql/test/query-tests/Security/CWE-327/BrokenCryptoAlgorithm.expected +++ b/go/ql/test/query-tests/Security/CWE-327/BrokenCryptoAlgorithm.expected @@ -1,29 +1,29 @@ -| encryption.go:30:2:30:36 | call to Encrypt | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | ... := ...[0] | The cryptographic algorithm DES | -| encryption.go:34:2:34:42 | call to Seal | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | ... := ...[0] | The cryptographic algorithm DES | -| encryption.go:38:2:38:42 | call to Seal | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | ... := ...[0] | The cryptographic algorithm DES | -| encryption.go:42:2:42:42 | call to Seal | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | ... := ...[0] | The cryptographic algorithm DES | -| encryption.go:46:2:46:42 | call to Seal | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | ... := ...[0] | The cryptographic algorithm DES | -| encryption.go:50:2:50:47 | call to CryptBlocks | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | ... := ...[0] | The cryptographic algorithm DES | -| encryption.go:54:2:54:45 | call to XORKeyStream | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | ... := ...[0] | The cryptographic algorithm DES | -| encryption.go:56:22:56:91 | struct literal | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | ... := ...[0] | The cryptographic algorithm DES | -| encryption.go:59:21:59:68 | &... [postupdate] | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | ... := ...[0] | The cryptographic algorithm DES | -| encryption.go:59:22:59:68 | struct literal | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | ... := ...[0] | The cryptographic algorithm DES | -| encryption.go:59:22:59:68 | struct literal [postupdate] | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | ... := ...[0] | The cryptographic algorithm DES | -| encryption.go:60:10:60:24 | ctrStreamWriter [postupdate] | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | ... := ...[0] | The cryptographic algorithm DES | -| encryption.go:65:2:65:45 | call to XORKeyStream | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | ... := ...[0] | The cryptographic algorithm DES | -| encryption.go:69:2:69:45 | call to XORKeyStream | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | ... := ...[0] | The cryptographic algorithm DES | -| encryption.go:76:2:76:32 | call to Encrypt | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | ... := ...[0] | The cryptographic algorithm TRIPLEDES | -| encryption.go:80:2:80:38 | call to Seal | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | ... := ...[0] | The cryptographic algorithm TRIPLEDES | -| encryption.go:84:2:84:38 | call to Seal | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | ... := ...[0] | The cryptographic algorithm TRIPLEDES | -| encryption.go:88:2:88:42 | call to Seal | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | ... := ...[0] | The cryptographic algorithm TRIPLEDES | -| encryption.go:92:2:92:42 | call to Seal | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | ... := ...[0] | The cryptographic algorithm TRIPLEDES | -| encryption.go:96:2:96:43 | call to CryptBlocks | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | ... := ...[0] | The cryptographic algorithm TRIPLEDES | -| encryption.go:100:2:100:41 | call to XORKeyStream | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | ... := ...[0] | The cryptographic algorithm TRIPLEDES | -| encryption.go:102:22:102:87 | struct literal | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | ... := ...[0] | The cryptographic algorithm TRIPLEDES | -| encryption.go:105:21:105:68 | &... [postupdate] | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | ... := ...[0] | The cryptographic algorithm TRIPLEDES | -| encryption.go:105:22:105:68 | struct literal | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | ... := ...[0] | The cryptographic algorithm TRIPLEDES | -| encryption.go:105:22:105:68 | struct literal [postupdate] | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | ... := ...[0] | The cryptographic algorithm TRIPLEDES | -| encryption.go:106:10:106:24 | ctrStreamWriter [postupdate] | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | ... := ...[0] | The cryptographic algorithm TRIPLEDES | -| encryption.go:111:2:111:45 | call to XORKeyStream | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | ... := ...[0] | The cryptographic algorithm TRIPLEDES | -| encryption.go:115:2:115:45 | call to XORKeyStream | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | ... := ...[0] | The cryptographic algorithm TRIPLEDES | +| encryption.go:30:2:30:36 | call to Encrypt | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | extract:0 ... := ... | The cryptographic algorithm DES | +| encryption.go:34:2:34:42 | call to Seal | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | extract:0 ... := ... | The cryptographic algorithm DES | +| encryption.go:38:2:38:42 | call to Seal | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | extract:0 ... := ... | The cryptographic algorithm DES | +| encryption.go:42:2:42:42 | call to Seal | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | extract:0 ... := ... | The cryptographic algorithm DES | +| encryption.go:46:2:46:42 | call to Seal | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | extract:0 ... := ... | The cryptographic algorithm DES | +| encryption.go:50:2:50:47 | call to CryptBlocks | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | extract:0 ... := ... | The cryptographic algorithm DES | +| encryption.go:54:2:54:45 | call to XORKeyStream | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | extract:0 ... := ... | The cryptographic algorithm DES | +| encryption.go:56:22:56:91 | struct literal | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | extract:0 ... := ... | The cryptographic algorithm DES | +| encryption.go:59:21:59:68 | &... [postupdate] | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | extract:0 ... := ... | The cryptographic algorithm DES | +| encryption.go:59:22:59:68 | struct literal | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | extract:0 ... := ... | The cryptographic algorithm DES | +| encryption.go:59:22:59:68 | struct literal [postupdate] | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | extract:0 ... := ... | The cryptographic algorithm DES | +| encryption.go:60:10:60:24 | ctrStreamWriter [postupdate] | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | extract:0 ... := ... | The cryptographic algorithm DES | +| encryption.go:65:2:65:45 | call to XORKeyStream | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | extract:0 ... := ... | The cryptographic algorithm DES | +| encryption.go:69:2:69:45 | call to XORKeyStream | $@ is broken or weak, and should not be used. | encryption.go:28:2:28:31 | extract:0 ... := ... | The cryptographic algorithm DES | +| encryption.go:76:2:76:32 | call to Encrypt | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | extract:0 ... := ... | The cryptographic algorithm TRIPLEDES | +| encryption.go:80:2:80:38 | call to Seal | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | extract:0 ... := ... | The cryptographic algorithm TRIPLEDES | +| encryption.go:84:2:84:38 | call to Seal | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | extract:0 ... := ... | The cryptographic algorithm TRIPLEDES | +| encryption.go:88:2:88:42 | call to Seal | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | extract:0 ... := ... | The cryptographic algorithm TRIPLEDES | +| encryption.go:92:2:92:42 | call to Seal | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | extract:0 ... := ... | The cryptographic algorithm TRIPLEDES | +| encryption.go:96:2:96:43 | call to CryptBlocks | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | extract:0 ... := ... | The cryptographic algorithm TRIPLEDES | +| encryption.go:100:2:100:41 | call to XORKeyStream | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | extract:0 ... := ... | The cryptographic algorithm TRIPLEDES | +| encryption.go:102:22:102:87 | struct literal | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | extract:0 ... := ... | The cryptographic algorithm TRIPLEDES | +| encryption.go:105:21:105:68 | &... [postupdate] | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | extract:0 ... := ... | The cryptographic algorithm TRIPLEDES | +| encryption.go:105:22:105:68 | struct literal | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | extract:0 ... := ... | The cryptographic algorithm TRIPLEDES | +| encryption.go:105:22:105:68 | struct literal [postupdate] | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | extract:0 ... := ... | The cryptographic algorithm TRIPLEDES | +| encryption.go:106:10:106:24 | ctrStreamWriter [postupdate] | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | extract:0 ... := ... | The cryptographic algorithm TRIPLEDES | +| encryption.go:111:2:111:45 | call to XORKeyStream | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | extract:0 ... := ... | The cryptographic algorithm TRIPLEDES | +| encryption.go:115:2:115:45 | call to XORKeyStream | $@ is broken or weak, and should not be used. | encryption.go:74:2:74:40 | extract:0 ... := ... | The cryptographic algorithm TRIPLEDES | | encryption.go:166:2:166:33 | call to XORKeyStream | $@ is broken or weak, and should not be used. | encryption.go:166:2:166:33 | call to XORKeyStream | The cryptographic algorithm RC4 | diff --git a/go/ql/test/query-tests/Security/CWE-327/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-327/CONSISTENCY/DataFlowConsistency.expected index 95bea8fef591..256f53d2e623 100644 --- a/go/ql/test/query-tests/Security/CWE-327/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/query-tests/Security/CWE-327/CONSISTENCY/DataFlowConsistency.expected @@ -1,4 +1,4 @@ reverseRead -| UnsafeTLS.go:329:32:329:37 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| UnsafeTLS.go:336:33:336:38 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| UnsafeTLS.go:329:32:329:37 | implicit-deref config | Origin of readStep is missing a PostUpdateNode. | +| UnsafeTLS.go:336:33:336:38 | implicit-deref config | Origin of readStep is missing a PostUpdateNode. | | UnsafeTLS.go:353:40:353:45 | suites | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-347/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-347/CONSISTENCY/DataFlowConsistency.expected index 922af8fad2eb..d5809621a06e 100644 --- a/go/ql/test/query-tests/Security/CWE-347/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/query-tests/Security/CWE-347/CONSISTENCY/DataFlowConsistency.expected @@ -1,5 +1,5 @@ reverseRead -| go-jose.v3.go:19:17:19:17 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| go-jose.v3.go:25:16:25:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| golang-jwt-v5.go:22:17:22:17 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| golang-jwt-v5.go:28:16:28:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| go-jose.v3.go:19:17:19:17 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| go-jose.v3.go:25:16:25:16 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| golang-jwt-v5.go:22:17:22:17 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| golang-jwt-v5.go:28:16:28:16 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-347/MissingJwtSignatureCheck.expected b/go/ql/test/query-tests/Security/CWE-347/MissingJwtSignatureCheck.expected index c1f41d118e76..7eafa2b87aa2 100644 --- a/go/ql/test/query-tests/Security/CWE-347/MissingJwtSignatureCheck.expected +++ b/go/ql/test/query-tests/Security/CWE-347/MissingJwtSignatureCheck.expected @@ -7,8 +7,8 @@ edges | go-jose.v3.go:25:16:25:47 | call to Get | go-jose.v3.go:26:15:26:25 | signedToken | provenance | | | go-jose.v3.go:26:15:26:25 | signedToken | go-jose.v3.go:29:19:29:29 | SSA def(signedToken) | provenance | | | go-jose.v3.go:29:19:29:29 | SSA def(signedToken) | go-jose.v3.go:31:37:31:47 | signedToken | provenance | | -| go-jose.v3.go:31:2:31:48 | ... := ...[0] | go-jose.v3.go:33:12:33:23 | DecodedToken | provenance | Sink:MaD:2 | -| go-jose.v3.go:31:37:31:47 | signedToken | go-jose.v3.go:31:2:31:48 | ... := ...[0] | provenance | MaD:4 | +| go-jose.v3.go:31:2:31:48 | extract:0 ... := ... | go-jose.v3.go:33:12:33:23 | DecodedToken | provenance | Sink:MaD:2 | +| go-jose.v3.go:31:37:31:47 | signedToken | go-jose.v3.go:31:2:31:48 | extract:0 ... := ... | provenance | MaD:4 | | golang-jwt-v5.go:28:16:28:20 | selection of URL | golang-jwt-v5.go:28:16:28:28 | call to Query | provenance | Src:MaD:3 MaD:5 | | golang-jwt-v5.go:28:16:28:28 | call to Query | golang-jwt-v5.go:28:16:28:47 | call to Get | provenance | MaD:6 | | golang-jwt-v5.go:28:16:28:47 | call to Get | golang-jwt-v5.go:29:25:29:35 | signedToken | provenance | | @@ -27,7 +27,7 @@ nodes | go-jose.v3.go:25:16:25:47 | call to Get | semmle.label | call to Get | | go-jose.v3.go:26:15:26:25 | signedToken | semmle.label | signedToken | | go-jose.v3.go:29:19:29:29 | SSA def(signedToken) | semmle.label | SSA def(signedToken) | -| go-jose.v3.go:31:2:31:48 | ... := ...[0] | semmle.label | ... := ...[0] | +| go-jose.v3.go:31:2:31:48 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | go-jose.v3.go:31:37:31:47 | signedToken | semmle.label | signedToken | | go-jose.v3.go:33:12:33:23 | DecodedToken | semmle.label | DecodedToken | | golang-jwt-v5.go:28:16:28:20 | selection of URL | semmle.label | selection of URL | diff --git a/go/ql/test/query-tests/Security/CWE-601/BadRedirectCheck/BadRedirectCheck.expected b/go/ql/test/query-tests/Security/CWE-601/BadRedirectCheck/BadRedirectCheck.expected index 9135bafbf54e..8fb1a305e550 100644 --- a/go/ql/test/query-tests/Security/CWE-601/BadRedirectCheck/BadRedirectCheck.expected +++ b/go/ql/test/query-tests/Security/CWE-601/BadRedirectCheck/BadRedirectCheck.expected @@ -1,30 +1,30 @@ #select -| BadRedirectCheck.go:4:23:4:37 | ...==... | BadRedirectCheck.go:3:18:3:22 | argument corresponding to redir | main.go:11:25:11:45 | call to sanitizeUrl | This is a check that $@, which flows into a $@, has a leading slash, but not that it does not have '/' or '\\' in its second position. | BadRedirectCheck.go:3:18:3:22 | argument corresponding to redir | this value | main.go:11:25:11:45 | call to sanitizeUrl | redirect | -| BadRedirectCheck.go:4:23:4:37 | ...==... | main.go:10:18:10:25 | argument corresponding to redirect | main.go:11:25:11:45 | call to sanitizeUrl | This is a check that $@, which flows into a $@, has a leading slash, but not that it does not have '/' or '\\' in its second position. | main.go:10:18:10:25 | argument corresponding to redirect | this value | main.go:11:25:11:45 | call to sanitizeUrl | redirect | -| cves.go:11:26:11:38 | ...==... | cves.go:14:23:14:25 | argument corresponding to url | cves.go:16:26:16:28 | url | This is a check that $@, which flows into a $@, has a leading slash, but not that it does not have '/' or '\\' in its second position. | cves.go:14:23:14:25 | argument corresponding to url | this value | cves.go:16:26:16:28 | url | redirect | +| BadRedirectCheck.go:4:23:4:37 | ...==... | BadRedirectCheck.go:3:18:3:22 | redir | main.go:11:25:11:45 | call to sanitizeUrl | This is a check that $@, which flows into a $@, has a leading slash, but not that it does not have '/' or '\\' in its second position. | BadRedirectCheck.go:3:18:3:22 | redir | this value | main.go:11:25:11:45 | call to sanitizeUrl | redirect | +| BadRedirectCheck.go:4:23:4:37 | ...==... | main.go:10:18:10:25 | redirect | main.go:11:25:11:45 | call to sanitizeUrl | This is a check that $@, which flows into a $@, has a leading slash, but not that it does not have '/' or '\\' in its second position. | main.go:10:18:10:25 | redirect | this value | main.go:11:25:11:45 | call to sanitizeUrl | redirect | +| cves.go:11:26:11:38 | ...==... | cves.go:14:23:14:25 | url | cves.go:16:26:16:28 | url | This is a check that $@, which flows into a $@, has a leading slash, but not that it does not have '/' or '\\' in its second position. | cves.go:14:23:14:25 | url | this value | cves.go:16:26:16:28 | url | redirect | | cves.go:34:6:34:37 | call to HasPrefix | cves.go:33:14:33:34 | call to Get | cves.go:37:25:37:32 | redirect | This is a check that $@, which flows into a $@, has a leading slash, but not that it does not have '/' or '\\' in its second position. | cves.go:33:14:33:34 | call to Get | this value | cves.go:37:25:37:32 | redirect | redirect | | cves.go:42:6:42:37 | call to HasPrefix | cves.go:41:14:41:34 | call to Get | cves.go:45:25:45:32 | redirect | This is a check that $@, which flows into a $@, has a leading slash, but not that it does not have '/' or '\\' in its second position. | cves.go:41:14:41:34 | call to Get | this value | cves.go:45:25:45:32 | redirect | redirect | -| main.go:25:7:25:38 | call to HasPrefix | main.go:32:24:32:26 | argument corresponding to url | main.go:34:26:34:28 | url | This is a check that $@, which flows into a $@, has a leading slash, but not that it does not have '/' or '\\' in its second position. | main.go:32:24:32:26 | argument corresponding to url | this value | main.go:34:26:34:28 | url | redirect | -| main.go:69:5:69:22 | ...!=... | main.go:68:17:68:24 | argument corresponding to redirect | main.go:77:25:77:39 | call to getTarget1 | This is a check that $@, which flows into a $@, has a leading slash, but not that it does not have '/' or '\\' in its second position. | main.go:68:17:68:24 | argument corresponding to redirect | this value | main.go:77:25:77:39 | call to getTarget1 | redirect | -| main.go:69:5:69:22 | ...!=... | main.go:76:19:76:21 | argument corresponding to url | main.go:77:25:77:39 | call to getTarget1 | This is a check that $@, which flows into a $@, has a leading slash, but not that it does not have '/' or '\\' in its second position. | main.go:76:19:76:21 | argument corresponding to url | this value | main.go:77:25:77:39 | call to getTarget1 | redirect | +| main.go:25:7:25:38 | call to HasPrefix | main.go:32:24:32:26 | url | main.go:34:26:34:28 | url | This is a check that $@, which flows into a $@, has a leading slash, but not that it does not have '/' or '\\' in its second position. | main.go:32:24:32:26 | url | this value | main.go:34:26:34:28 | url | redirect | +| main.go:69:5:69:22 | ...!=... | main.go:68:17:68:24 | redirect | main.go:77:25:77:39 | call to getTarget1 | This is a check that $@, which flows into a $@, has a leading slash, but not that it does not have '/' or '\\' in its second position. | main.go:68:17:68:24 | redirect | this value | main.go:77:25:77:39 | call to getTarget1 | redirect | +| main.go:69:5:69:22 | ...!=... | main.go:76:19:76:21 | url | main.go:77:25:77:39 | call to getTarget1 | This is a check that $@, which flows into a $@, has a leading slash, but not that it does not have '/' or '\\' in its second position. | main.go:76:19:76:21 | url | this value | main.go:77:25:77:39 | call to getTarget1 | redirect | | main.go:83:5:83:20 | ...!=... | main.go:87:9:87:14 | selection of Path | main.go:91:25:91:39 | call to getTarget2 | This is a check that $@, which flows into a $@, has a leading slash, but not that it does not have '/' or '\\' in its second position. | main.go:87:9:87:14 | selection of Path | this value | main.go:91:25:91:39 | call to getTarget2 | redirect | edges | BadRedirectCheck.go:3:18:3:22 | SSA def(redir) | BadRedirectCheck.go:5:10:5:14 | redir | provenance | | -| BadRedirectCheck.go:3:18:3:22 | argument corresponding to redir | BadRedirectCheck.go:5:10:5:14 | redir | provenance | | +| BadRedirectCheck.go:3:18:3:22 | redir | BadRedirectCheck.go:5:10:5:14 | redir | provenance | | | BadRedirectCheck.go:5:10:5:14 | redir | main.go:11:25:11:45 | call to sanitizeUrl | provenance | Sink:MaD:1 | -| cves.go:14:23:14:25 | argument corresponding to url | cves.go:16:26:16:28 | url | provenance | Sink:MaD:1 | +| cves.go:14:23:14:25 | url | cves.go:16:26:16:28 | url | provenance | Sink:MaD:1 | | cves.go:33:14:33:34 | call to Get | cves.go:37:25:37:32 | redirect | provenance | Sink:MaD:1 | | cves.go:41:14:41:34 | call to Get | cves.go:45:25:45:32 | redirect | provenance | Sink:MaD:1 | -| main.go:10:18:10:25 | argument corresponding to redirect | main.go:11:37:11:44 | redirect | provenance | | +| main.go:10:18:10:25 | redirect | main.go:11:37:11:44 | redirect | provenance | | | main.go:11:37:11:44 | redirect | BadRedirectCheck.go:3:18:3:22 | SSA def(redir) | provenance | | | main.go:11:37:11:44 | redirect | main.go:11:25:11:45 | call to sanitizeUrl | provenance | Sink:MaD:1 | -| main.go:32:24:32:26 | argument corresponding to url | main.go:34:26:34:28 | url | provenance | Sink:MaD:1 | +| main.go:32:24:32:26 | url | main.go:34:26:34:28 | url | provenance | Sink:MaD:1 | | main.go:68:17:68:24 | SSA def(redirect) | main.go:73:20:73:27 | redirect | provenance | | -| main.go:68:17:68:24 | argument corresponding to redirect | main.go:73:20:73:27 | redirect | provenance | | +| main.go:68:17:68:24 | redirect | main.go:73:20:73:27 | redirect | provenance | | | main.go:73:9:73:28 | call to Clean | main.go:77:25:77:39 | call to getTarget1 | provenance | Sink:MaD:1 | | main.go:73:20:73:27 | redirect | main.go:73:9:73:28 | call to Clean | provenance | MaD:2 | | main.go:73:20:73:27 | redirect | main.go:73:9:73:28 | call to Clean | provenance | MaD:2 | -| main.go:76:19:76:21 | argument corresponding to url | main.go:77:36:77:38 | url | provenance | | +| main.go:76:19:76:21 | url | main.go:77:36:77:38 | url | provenance | | | main.go:77:36:77:38 | url | main.go:68:17:68:24 | SSA def(redirect) | provenance | | | main.go:77:36:77:38 | url | main.go:77:25:77:39 | call to getTarget1 | provenance | MaD:2 Sink:MaD:1 | | main.go:87:9:87:14 | selection of Path | main.go:91:25:91:39 | call to getTarget2 | provenance | Sink:MaD:1 | @@ -33,27 +33,27 @@ models | 2 | Summary: path; ; false; Clean; ; ; Argument[0]; ReturnValue; taint; manual | nodes | BadRedirectCheck.go:3:18:3:22 | SSA def(redir) | semmle.label | SSA def(redir) | -| BadRedirectCheck.go:3:18:3:22 | argument corresponding to redir | semmle.label | argument corresponding to redir | +| BadRedirectCheck.go:3:18:3:22 | redir | semmle.label | redir | | BadRedirectCheck.go:5:10:5:14 | redir | semmle.label | redir | | BadRedirectCheck.go:5:10:5:14 | redir | semmle.label | redir | -| cves.go:14:23:14:25 | argument corresponding to url | semmle.label | argument corresponding to url | +| cves.go:14:23:14:25 | url | semmle.label | url | | cves.go:16:26:16:28 | url | semmle.label | url | | cves.go:33:14:33:34 | call to Get | semmle.label | call to Get | | cves.go:37:25:37:32 | redirect | semmle.label | redirect | | cves.go:41:14:41:34 | call to Get | semmle.label | call to Get | | cves.go:45:25:45:32 | redirect | semmle.label | redirect | -| main.go:10:18:10:25 | argument corresponding to redirect | semmle.label | argument corresponding to redirect | +| main.go:10:18:10:25 | redirect | semmle.label | redirect | | main.go:11:25:11:45 | call to sanitizeUrl | semmle.label | call to sanitizeUrl | | main.go:11:37:11:44 | redirect | semmle.label | redirect | -| main.go:32:24:32:26 | argument corresponding to url | semmle.label | argument corresponding to url | +| main.go:32:24:32:26 | url | semmle.label | url | | main.go:34:26:34:28 | url | semmle.label | url | | main.go:68:17:68:24 | SSA def(redirect) | semmle.label | SSA def(redirect) | -| main.go:68:17:68:24 | argument corresponding to redirect | semmle.label | argument corresponding to redirect | +| main.go:68:17:68:24 | redirect | semmle.label | redirect | | main.go:73:9:73:28 | call to Clean | semmle.label | call to Clean | | main.go:73:9:73:28 | call to Clean | semmle.label | call to Clean | | main.go:73:20:73:27 | redirect | semmle.label | redirect | | main.go:73:20:73:27 | redirect | semmle.label | redirect | -| main.go:76:19:76:21 | argument corresponding to url | semmle.label | argument corresponding to url | +| main.go:76:19:76:21 | url | semmle.label | url | | main.go:77:25:77:39 | call to getTarget1 | semmle.label | call to getTarget1 | | main.go:77:36:77:38 | url | semmle.label | url | | main.go:87:9:87:14 | selection of Path | semmle.label | selection of Path | diff --git a/go/ql/test/query-tests/Security/CWE-601/BadRedirectCheck/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-601/BadRedirectCheck/CONSISTENCY/DataFlowConsistency.expected index d6381960485e..9068ee79a7d5 100644 --- a/go/ql/test/query-tests/Security/CWE-601/BadRedirectCheck/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/query-tests/Security/CWE-601/BadRedirectCheck/CONSISTENCY/DataFlowConsistency.expected @@ -1,3 +1,3 @@ reverseRead -| cves.go:33:14:33:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| cves.go:41:14:41:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| cves.go:33:14:33:16 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | +| cves.go:41:14:41:16 | implicit-deref req | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-601/OpenUrlRedirect/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-601/OpenUrlRedirect/CONSISTENCY/DataFlowConsistency.expected index f05017daafda..fda76dcac5af 100644 --- a/go/ql/test/query-tests/Security/CWE-601/OpenUrlRedirect/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/query-tests/Security/CWE-601/OpenUrlRedirect/CONSISTENCY/DataFlowConsistency.expected @@ -1,26 +1,26 @@ reverseRead -| OpenUrlRedirect.go:10:23:10:23 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| OpenUrlRedirectGood.go:12:16:12:16 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| stdlib.go:13:13:13:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| stdlib.go:22:13:22:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| stdlib.go:33:13:33:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| stdlib.go:48:13:48:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| stdlib.go:56:13:56:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| stdlib.go:68:13:68:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| stdlib.go:77:13:77:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| stdlib.go:85:13:85:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| stdlib.go:93:13:93:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| stdlib.go:102:13:102:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| stdlib.go:115:6:115:6 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| stdlib.go:117:24:117:24 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| stdlib.go:126:13:126:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| stdlib.go:138:13:138:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| stdlib.go:150:13:150:13 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| stdlib.go:163:11:163:11 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| stdlib.go:176:6:176:6 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| stdlib.go:177:35:177:35 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| stdlib.go:220:3:220:3 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| stdlib.go:226:23:226:23 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| stdlib.go:227:23:227:23 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| stdlib.go:228:23:228:23 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| OpenUrlRedirect.go:10:23:10:23 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| OpenUrlRedirectGood.go:12:16:12:16 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:13:13:13:13 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:22:13:22:13 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:33:13:33:13 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:48:13:48:13 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:56:13:56:13 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:68:13:68:13 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:77:13:77:13 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:85:13:85:13 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:93:13:93:13 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:102:13:102:13 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:115:6:115:6 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:117:24:117:24 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:126:13:126:13 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:138:13:138:13 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:150:13:150:13 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:163:11:163:11 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:176:6:176:6 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:177:35:177:35 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:220:3:220:3 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:226:23:226:23 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:227:23:227:23 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| stdlib.go:228:23:228:23 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | | stdlib.go:232:23:232:33 | call to Cookies | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-601/OpenUrlRedirect/OpenUrlRedirect.expected b/go/ql/test/query-tests/Security/CWE-601/OpenUrlRedirect/OpenUrlRedirect.expected index d9f24369ca2a..650341884f1a 100644 --- a/go/ql/test/query-tests/Security/CWE-601/OpenUrlRedirect/OpenUrlRedirect.expected +++ b/go/ql/test/query-tests/Security/CWE-601/OpenUrlRedirect/OpenUrlRedirect.expected @@ -30,16 +30,16 @@ edges | stdlib.go:71:23:71:37 | ...+... | stdlib.go:71:23:71:40 | ...+... | provenance | Config Sink:MaD:1 | | stdlib.go:93:13:93:18 | selection of Form | stdlib.go:93:13:93:32 | call to Get | provenance | Src:MaD:2 Config | | stdlib.go:93:13:93:32 | call to Get | stdlib.go:94:3:94:8 | target | provenance | | -| stdlib.go:94:3:94:8 | target | stdlib.go:94:3:94:25 | ... += ... | provenance | Config | -| stdlib.go:94:3:94:25 | ... += ... | stdlib.go:96:23:96:28 | target | provenance | Sink:MaD:1 | -| stdlib.go:116:4:116:4 | implicit dereference [postupdate] [URL] | stdlib.go:116:4:116:4 | r [postupdate] [pointer, URL] | provenance | | +| stdlib.go:94:3:94:8 | target | stdlib.go:94:3:94:25 | compound-rhs ... += ... | provenance | Config | +| stdlib.go:94:3:94:25 | compound-rhs ... += ... | stdlib.go:96:23:96:28 | target | provenance | Sink:MaD:1 | +| stdlib.go:116:4:116:4 | implicit-deref r [postupdate] [URL] | stdlib.go:116:4:116:4 | r [postupdate] [pointer, URL] | provenance | | | stdlib.go:116:4:116:4 | r [postupdate] [pointer, URL] | stdlib.go:117:24:117:24 | r [pointer, URL] | provenance | | -| stdlib.go:116:4:116:8 | implicit dereference | stdlib.go:116:4:116:8 | selection of URL [postupdate] | provenance | Config | -| stdlib.go:116:4:116:8 | selection of URL | stdlib.go:116:4:116:8 | implicit dereference | provenance | Src:MaD:4 Config | -| stdlib.go:116:4:116:8 | selection of URL [postupdate] | stdlib.go:116:4:116:4 | implicit dereference [postupdate] [URL] | provenance | | -| stdlib.go:116:4:116:8 | selection of URL [postupdate] | stdlib.go:116:4:116:8 | implicit dereference | provenance | Config | -| stdlib.go:117:24:117:24 | implicit dereference [URL] | stdlib.go:117:24:117:28 | selection of URL | provenance | | -| stdlib.go:117:24:117:24 | r [pointer, URL] | stdlib.go:117:24:117:24 | implicit dereference [URL] | provenance | | +| stdlib.go:116:4:116:8 | implicit-deref selection of URL | stdlib.go:116:4:116:8 | selection of URL [postupdate] | provenance | Config | +| stdlib.go:116:4:116:8 | selection of URL | stdlib.go:116:4:116:8 | implicit-deref selection of URL | provenance | Src:MaD:4 Config | +| stdlib.go:116:4:116:8 | selection of URL [postupdate] | stdlib.go:116:4:116:4 | implicit-deref r [postupdate] [URL] | provenance | | +| stdlib.go:116:4:116:8 | selection of URL [postupdate] | stdlib.go:116:4:116:8 | implicit-deref selection of URL | provenance | Config | +| stdlib.go:117:24:117:24 | implicit-deref r [URL] | stdlib.go:117:24:117:28 | selection of URL | provenance | | +| stdlib.go:117:24:117:24 | r [pointer, URL] | stdlib.go:117:24:117:24 | implicit-deref r [URL] | provenance | | | stdlib.go:117:24:117:28 | selection of URL | stdlib.go:117:24:117:37 | call to String | provenance | Src:MaD:4 Config Sink:MaD:1 | | stdlib.go:150:13:150:18 | selection of Form | stdlib.go:150:13:150:32 | call to Get | provenance | Src:MaD:2 Config | | stdlib.go:150:13:150:32 | call to Get | stdlib.go:156:23:156:28 | target | provenance | Sink:MaD:1 | @@ -51,42 +51,42 @@ edges | stdlib.go:177:35:177:39 | selection of URL | stdlib.go:177:35:177:52 | call to RequestURI | provenance | Src:MaD:4 Config | | stdlib.go:177:35:177:52 | call to RequestURI | stdlib.go:177:24:177:52 | ...+... | provenance | Config Sink:MaD:1 | | stdlib.go:186:13:186:33 | call to FormValue | stdlib.go:188:23:188:28 | target | provenance | Src:MaD:3 Sink:MaD:1 | -| stdlib.go:194:3:194:57 | ... := ...[0] | stdlib.go:196:23:196:28 | target | provenance | | -| stdlib.go:194:36:194:56 | call to FormValue | stdlib.go:194:3:194:57 | ... := ...[0] | provenance | Src:MaD:3 Config | -| stdlib.go:196:23:196:28 | implicit dereference | stdlib.go:196:23:196:28 | target [postupdate] | provenance | Config | -| stdlib.go:196:23:196:28 | implicit dereference | stdlib.go:196:23:196:33 | selection of Path | provenance | Config Sink:MaD:1 | -| stdlib.go:196:23:196:28 | target | stdlib.go:196:23:196:28 | implicit dereference | provenance | Config | +| stdlib.go:194:3:194:57 | extract:0 ... := ... | stdlib.go:196:23:196:28 | target | provenance | | +| stdlib.go:194:36:194:56 | call to FormValue | stdlib.go:194:3:194:57 | extract:0 ... := ... | provenance | Src:MaD:3 Config | +| stdlib.go:196:23:196:28 | implicit-deref target | stdlib.go:196:23:196:28 | target [postupdate] | provenance | Config | +| stdlib.go:196:23:196:28 | implicit-deref target | stdlib.go:196:23:196:33 | selection of Path | provenance | Config Sink:MaD:1 | +| stdlib.go:196:23:196:28 | target | stdlib.go:196:23:196:28 | implicit-deref target | provenance | Config | | stdlib.go:196:23:196:28 | target | stdlib.go:196:23:196:33 | selection of Path | provenance | Config Sink:MaD:1 | | stdlib.go:196:23:196:28 | target | stdlib.go:198:23:198:28 | target | provenance | | -| stdlib.go:196:23:196:28 | target [postupdate] | stdlib.go:196:23:196:28 | implicit dereference | provenance | Config | +| stdlib.go:196:23:196:28 | target [postupdate] | stdlib.go:196:23:196:28 | implicit-deref target | provenance | Config | | stdlib.go:196:23:196:28 | target [postupdate] | stdlib.go:198:23:198:28 | target | provenance | | | stdlib.go:198:23:198:28 | target | stdlib.go:198:23:198:42 | call to EscapedPath | provenance | Config Sink:MaD:1 | -| stdlib.go:210:3:210:3 | implicit dereference [postupdate] | stdlib.go:210:3:210:3 | u [postupdate] | provenance | Config | -| stdlib.go:210:3:210:3 | implicit dereference [postupdate] | stdlib.go:210:3:210:3 | u [postupdate] [pointer] | provenance | | +| stdlib.go:210:3:210:3 | implicit-deref u [postupdate] | stdlib.go:210:3:210:3 | u [postupdate] | provenance | Config | +| stdlib.go:210:3:210:3 | implicit-deref u [postupdate] | stdlib.go:210:3:210:3 | u [postupdate] [pointer] | provenance | | | stdlib.go:210:3:210:3 | u [postupdate] | stdlib.go:212:23:212:23 | u | provenance | | | stdlib.go:210:3:210:3 | u [postupdate] [pointer] | stdlib.go:212:23:212:23 | u [pointer] | provenance | | -| stdlib.go:210:12:210:30 | call to FormValue | stdlib.go:210:3:210:3 | implicit dereference [postupdate] | provenance | Src:MaD:3 Config | +| stdlib.go:210:12:210:30 | call to FormValue | stdlib.go:210:3:210:3 | implicit-deref u [postupdate] | provenance | Src:MaD:3 Config | | stdlib.go:210:12:210:30 | call to FormValue | stdlib.go:210:3:210:3 | u [postupdate] | provenance | Src:MaD:3 Config | -| stdlib.go:212:23:212:23 | implicit dereference | stdlib.go:212:23:212:23 | u [postupdate] | provenance | Config | -| stdlib.go:212:23:212:23 | implicit dereference | stdlib.go:212:23:212:28 | selection of Path | provenance | Config Sink:MaD:1 | -| stdlib.go:212:23:212:23 | u | stdlib.go:212:23:212:23 | implicit dereference | provenance | Config | +| stdlib.go:212:23:212:23 | implicit-deref u | stdlib.go:212:23:212:23 | u [postupdate] | provenance | Config | +| stdlib.go:212:23:212:23 | implicit-deref u | stdlib.go:212:23:212:28 | selection of Path | provenance | Config Sink:MaD:1 | +| stdlib.go:212:23:212:23 | u | stdlib.go:212:23:212:23 | implicit-deref u | provenance | Config | | stdlib.go:212:23:212:23 | u | stdlib.go:212:23:212:28 | selection of Path | provenance | Config Sink:MaD:1 | | stdlib.go:212:23:212:23 | u | stdlib.go:214:23:214:23 | u | provenance | | -| stdlib.go:212:23:212:23 | u [pointer] | stdlib.go:212:23:212:23 | implicit dereference | provenance | | -| stdlib.go:212:23:212:23 | u [postupdate] | stdlib.go:212:23:212:23 | implicit dereference | provenance | Config | +| stdlib.go:212:23:212:23 | u [pointer] | stdlib.go:212:23:212:23 | implicit-deref u | provenance | | +| stdlib.go:212:23:212:23 | u [postupdate] | stdlib.go:212:23:212:23 | implicit-deref u | provenance | Config | | stdlib.go:212:23:212:23 | u [postupdate] | stdlib.go:214:23:214:23 | u | provenance | | | stdlib.go:214:23:214:23 | u | stdlib.go:214:23:214:32 | call to String | provenance | Config Sink:MaD:1 | -| stdlib.go:257:3:257:3 | implicit dereference [postupdate] | stdlib.go:257:3:257:3 | u [postupdate] | provenance | Config | -| stdlib.go:257:3:257:3 | implicit dereference [postupdate] | stdlib.go:257:3:257:3 | u [postupdate] [pointer] | provenance | | +| stdlib.go:257:3:257:3 | implicit-deref u [postupdate] | stdlib.go:257:3:257:3 | u [postupdate] | provenance | Config | +| stdlib.go:257:3:257:3 | implicit-deref u [postupdate] | stdlib.go:257:3:257:3 | u [postupdate] [pointer] | provenance | | | stdlib.go:257:3:257:3 | u [postupdate] | stdlib.go:260:3:260:3 | u | provenance | | | stdlib.go:257:3:257:3 | u [postupdate] [pointer] | stdlib.go:260:3:260:3 | u [pointer] | provenance | | -| stdlib.go:257:12:257:30 | call to FormValue | stdlib.go:257:3:257:3 | implicit dereference [postupdate] | provenance | Src:MaD:3 Config | +| stdlib.go:257:12:257:30 | call to FormValue | stdlib.go:257:3:257:3 | implicit-deref u [postupdate] | provenance | Src:MaD:3 Config | | stdlib.go:257:12:257:30 | call to FormValue | stdlib.go:257:3:257:3 | u [postupdate] | provenance | Src:MaD:3 Config | -| stdlib.go:260:3:260:3 | implicit dereference | stdlib.go:260:3:260:3 | u [postupdate] | provenance | Config | -| stdlib.go:260:3:260:3 | u | stdlib.go:260:3:260:3 | implicit dereference | provenance | Config | +| stdlib.go:260:3:260:3 | implicit-deref u | stdlib.go:260:3:260:3 | u [postupdate] | provenance | Config | +| stdlib.go:260:3:260:3 | u | stdlib.go:260:3:260:3 | implicit-deref u | provenance | Config | | stdlib.go:260:3:260:3 | u | stdlib.go:261:23:261:23 | u | provenance | | -| stdlib.go:260:3:260:3 | u [pointer] | stdlib.go:260:3:260:3 | implicit dereference | provenance | | -| stdlib.go:260:3:260:3 | u [postupdate] | stdlib.go:260:3:260:3 | implicit dereference | provenance | Config | +| stdlib.go:260:3:260:3 | u [pointer] | stdlib.go:260:3:260:3 | implicit-deref u | provenance | | +| stdlib.go:260:3:260:3 | u [postupdate] | stdlib.go:260:3:260:3 | implicit-deref u | provenance | Config | | stdlib.go:260:3:260:3 | u [postupdate] | stdlib.go:261:23:261:23 | u | provenance | | | stdlib.go:261:23:261:23 | u | stdlib.go:261:23:261:32 | call to String | provenance | Config Sink:MaD:1 | models @@ -118,14 +118,14 @@ nodes | stdlib.go:93:13:93:18 | selection of Form | semmle.label | selection of Form | | stdlib.go:93:13:93:32 | call to Get | semmle.label | call to Get | | stdlib.go:94:3:94:8 | target | semmle.label | target | -| stdlib.go:94:3:94:25 | ... += ... | semmle.label | ... += ... | +| stdlib.go:94:3:94:25 | compound-rhs ... += ... | semmle.label | compound-rhs ... += ... | | stdlib.go:96:23:96:28 | target | semmle.label | target | -| stdlib.go:116:4:116:4 | implicit dereference [postupdate] [URL] | semmle.label | implicit dereference [postupdate] [URL] | +| stdlib.go:116:4:116:4 | implicit-deref r [postupdate] [URL] | semmle.label | implicit-deref r [postupdate] [URL] | | stdlib.go:116:4:116:4 | r [postupdate] [pointer, URL] | semmle.label | r [postupdate] [pointer, URL] | -| stdlib.go:116:4:116:8 | implicit dereference | semmle.label | implicit dereference | +| stdlib.go:116:4:116:8 | implicit-deref selection of URL | semmle.label | implicit-deref selection of URL | | stdlib.go:116:4:116:8 | selection of URL | semmle.label | selection of URL | | stdlib.go:116:4:116:8 | selection of URL [postupdate] | semmle.label | selection of URL [postupdate] | -| stdlib.go:117:24:117:24 | implicit dereference [URL] | semmle.label | implicit dereference [URL] | +| stdlib.go:117:24:117:24 | implicit-deref r [URL] | semmle.label | implicit-deref r [URL] | | stdlib.go:117:24:117:24 | r [pointer, URL] | semmle.label | r [pointer, URL] | | stdlib.go:117:24:117:28 | selection of URL | semmle.label | selection of URL | | stdlib.go:117:24:117:37 | call to String | semmle.label | call to String | @@ -142,30 +142,30 @@ nodes | stdlib.go:177:35:177:52 | call to RequestURI | semmle.label | call to RequestURI | | stdlib.go:186:13:186:33 | call to FormValue | semmle.label | call to FormValue | | stdlib.go:188:23:188:28 | target | semmle.label | target | -| stdlib.go:194:3:194:57 | ... := ...[0] | semmle.label | ... := ...[0] | +| stdlib.go:194:3:194:57 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | stdlib.go:194:36:194:56 | call to FormValue | semmle.label | call to FormValue | -| stdlib.go:196:23:196:28 | implicit dereference | semmle.label | implicit dereference | +| stdlib.go:196:23:196:28 | implicit-deref target | semmle.label | implicit-deref target | | stdlib.go:196:23:196:28 | target | semmle.label | target | | stdlib.go:196:23:196:28 | target [postupdate] | semmle.label | target [postupdate] | | stdlib.go:196:23:196:33 | selection of Path | semmle.label | selection of Path | | stdlib.go:198:23:198:28 | target | semmle.label | target | | stdlib.go:198:23:198:42 | call to EscapedPath | semmle.label | call to EscapedPath | -| stdlib.go:210:3:210:3 | implicit dereference [postupdate] | semmle.label | implicit dereference [postupdate] | +| stdlib.go:210:3:210:3 | implicit-deref u [postupdate] | semmle.label | implicit-deref u [postupdate] | | stdlib.go:210:3:210:3 | u [postupdate] | semmle.label | u [postupdate] | | stdlib.go:210:3:210:3 | u [postupdate] [pointer] | semmle.label | u [postupdate] [pointer] | | stdlib.go:210:12:210:30 | call to FormValue | semmle.label | call to FormValue | -| stdlib.go:212:23:212:23 | implicit dereference | semmle.label | implicit dereference | +| stdlib.go:212:23:212:23 | implicit-deref u | semmle.label | implicit-deref u | | stdlib.go:212:23:212:23 | u | semmle.label | u | | stdlib.go:212:23:212:23 | u [pointer] | semmle.label | u [pointer] | | stdlib.go:212:23:212:23 | u [postupdate] | semmle.label | u [postupdate] | | stdlib.go:212:23:212:28 | selection of Path | semmle.label | selection of Path | | stdlib.go:214:23:214:23 | u | semmle.label | u | | stdlib.go:214:23:214:32 | call to String | semmle.label | call to String | -| stdlib.go:257:3:257:3 | implicit dereference [postupdate] | semmle.label | implicit dereference [postupdate] | +| stdlib.go:257:3:257:3 | implicit-deref u [postupdate] | semmle.label | implicit-deref u [postupdate] | | stdlib.go:257:3:257:3 | u [postupdate] | semmle.label | u [postupdate] | | stdlib.go:257:3:257:3 | u [postupdate] [pointer] | semmle.label | u [postupdate] [pointer] | | stdlib.go:257:12:257:30 | call to FormValue | semmle.label | call to FormValue | -| stdlib.go:260:3:260:3 | implicit dereference | semmle.label | implicit dereference | +| stdlib.go:260:3:260:3 | implicit-deref u | semmle.label | implicit-deref u | | stdlib.go:260:3:260:3 | u | semmle.label | u | | stdlib.go:260:3:260:3 | u [pointer] | semmle.label | u [pointer] | | stdlib.go:260:3:260:3 | u [postupdate] | semmle.label | u [postupdate] | diff --git a/go/ql/test/query-tests/Security/CWE-640/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-640/CONSISTENCY/DataFlowConsistency.expected index f3510be5f6c8..e2b722b16382 100644 --- a/go/ql/test/query-tests/Security/CWE-640/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/query-tests/Security/CWE-640/CONSISTENCY/DataFlowConsistency.expected @@ -1,2 +1,2 @@ reverseRead -| EmailBad.go:9:10:9:10 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| EmailBad.go:9:10:9:10 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-643/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-643/CONSISTENCY/DataFlowConsistency.expected index 001bad6c8fc1..7df0be09a4b8 100644 --- a/go/ql/test/query-tests/Security/CWE-643/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/query-tests/Security/CWE-643/CONSISTENCY/DataFlowConsistency.expected @@ -1,13 +1,13 @@ reverseRead -| XPathInjection.go:13:14:13:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| tst.go:35:14:35:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| tst.go:46:14:46:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| tst.go:57:14:57:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| tst.go:72:14:72:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| tst.go:83:14:83:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| tst.go:92:14:92:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| tst.go:93:14:93:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| tst.go:106:14:106:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| tst.go:115:14:115:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| tst.go:116:14:116:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| tst.go:139:14:139:14 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| XPathInjection.go:13:14:13:14 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| tst.go:35:14:35:14 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| tst.go:46:14:46:14 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| tst.go:57:14:57:14 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| tst.go:72:14:72:14 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| tst.go:83:14:83:14 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| tst.go:92:14:92:14 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| tst.go:93:14:93:14 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| tst.go:106:14:106:14 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| tst.go:115:14:115:14 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| tst.go:116:14:116:14 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| tst.go:139:14:139:14 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-770/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-770/CONSISTENCY/DataFlowConsistency.expected index 215578883b20..bea886c155e3 100644 --- a/go/ql/test/query-tests/Security/CWE-770/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/query-tests/Security/CWE-770/CONSISTENCY/DataFlowConsistency.expected @@ -1,6 +1,6 @@ reverseRead -| UncontrolledAllocationSizeBad.go:11:12:11:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| UncontrolledAllocationSizeGood.go:11:12:11:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| UncontrolledAllocationSizeGood.go:32:12:32:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| UncontrolledAllocationSizeGood.go:52:12:52:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| UncontrolledAllocationSizeGood.go:73:12:73:12 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| UncontrolledAllocationSizeBad.go:11:12:11:12 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| UncontrolledAllocationSizeGood.go:11:12:11:12 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| UncontrolledAllocationSizeGood.go:32:12:32:12 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| UncontrolledAllocationSizeGood.go:52:12:52:12 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| UncontrolledAllocationSizeGood.go:73:12:73:12 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-770/UncontrolledAllocationSize.expected b/go/ql/test/query-tests/Security/CWE-770/UncontrolledAllocationSize.expected index bdcf83b8935f..22005b1ac6e9 100644 --- a/go/ql/test/query-tests/Security/CWE-770/UncontrolledAllocationSize.expected +++ b/go/ql/test/query-tests/Security/CWE-770/UncontrolledAllocationSize.expected @@ -5,8 +5,8 @@ edges | UncontrolledAllocationSizeBad.go:11:12:11:24 | call to Query | UncontrolledAllocationSizeBad.go:13:15:13:20 | source | provenance | | | UncontrolledAllocationSizeBad.go:13:15:13:20 | source | UncontrolledAllocationSizeBad.go:13:15:13:29 | call to Get | provenance | MaD:3 | | UncontrolledAllocationSizeBad.go:13:15:13:29 | call to Get | UncontrolledAllocationSizeBad.go:14:28:14:36 | sourceStr | provenance | | -| UncontrolledAllocationSizeBad.go:14:2:14:37 | ... := ...[0] | UncontrolledAllocationSizeBad.go:20:27:20:30 | sink | provenance | | -| UncontrolledAllocationSizeBad.go:14:28:14:36 | sourceStr | UncontrolledAllocationSizeBad.go:14:2:14:37 | ... := ...[0] | provenance | Config | +| UncontrolledAllocationSizeBad.go:14:2:14:37 | extract:0 ... := ... | UncontrolledAllocationSizeBad.go:20:27:20:30 | sink | provenance | | +| UncontrolledAllocationSizeBad.go:14:28:14:36 | sourceStr | UncontrolledAllocationSizeBad.go:14:2:14:37 | extract:0 ... := ... | provenance | Config | models | 1 | Source: net/http; Request; true; URL; ; ; ; remote; manual | | 2 | Summary: net/url; URL; true; Query; ; ; Argument[receiver]; ReturnValue; taint; manual | @@ -16,7 +16,7 @@ nodes | UncontrolledAllocationSizeBad.go:11:12:11:24 | call to Query | semmle.label | call to Query | | UncontrolledAllocationSizeBad.go:13:15:13:20 | source | semmle.label | source | | UncontrolledAllocationSizeBad.go:13:15:13:29 | call to Get | semmle.label | call to Get | -| UncontrolledAllocationSizeBad.go:14:2:14:37 | ... := ...[0] | semmle.label | ... := ...[0] | +| UncontrolledAllocationSizeBad.go:14:2:14:37 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | UncontrolledAllocationSizeBad.go:14:28:14:36 | sourceStr | semmle.label | sourceStr | | UncontrolledAllocationSizeBad.go:20:27:20:30 | sink | semmle.label | sink | subpaths diff --git a/go/ql/test/query-tests/Security/CWE-918/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/query-tests/Security/CWE-918/CONSISTENCY/DataFlowConsistency.expected index cb71c6569c58..53fc71eeb543 100644 --- a/go/ql/test/query-tests/Security/CWE-918/CONSISTENCY/DataFlowConsistency.expected +++ b/go/ql/test/query-tests/Security/CWE-918/CONSISTENCY/DataFlowConsistency.expected @@ -1,5 +1,5 @@ reverseRead -| websocket.go:110:31:110:31 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| websocket.go:120:32:120:32 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| websocket.go:129:54:129:54 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | -| websocket.go:139:55:139:55 | implicit dereference | Origin of readStep is missing a PostUpdateNode. | +| websocket.go:110:31:110:31 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| websocket.go:120:32:120:32 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| websocket.go:129:54:129:54 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | +| websocket.go:139:55:139:55 | implicit-deref r | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/Security/CWE-918/RequestForgery.expected b/go/ql/test/query-tests/Security/CWE-918/RequestForgery.expected index 15b0e179e983..9dfdcd278a4e 100644 --- a/go/ql/test/query-tests/Security/CWE-918/RequestForgery.expected +++ b/go/ql/test/query-tests/Security/CWE-918/RequestForgery.expected @@ -37,9 +37,9 @@ edges | tst.go:11:13:11:35 | call to FormValue | tst.go:39:11:39:29 | ...+... | provenance | Src:MaD:1 | | tst.go:11:13:11:35 | call to FormValue | tst.go:41:11:41:40 | ...+... | provenance | Src:MaD:1 | | tst.go:11:13:11:35 | call to FormValue | tst.go:48:11:48:18 | tainted2 | provenance | Src:MaD:1 | -| tst.go:48:2:48:2 | implicit dereference [postupdate] | tst.go:48:2:48:2 | u [postupdate] | provenance | | +| tst.go:48:2:48:2 | implicit-deref u [postupdate] | tst.go:48:2:48:2 | u [postupdate] | provenance | | | tst.go:48:2:48:2 | u [postupdate] | tst.go:49:11:49:11 | u | provenance | | -| tst.go:48:11:48:18 | tainted2 | tst.go:48:2:48:2 | implicit dereference [postupdate] | provenance | Config | +| tst.go:48:11:48:18 | tainted2 | tst.go:48:2:48:2 | implicit-deref u [postupdate] | provenance | Config | | tst.go:48:11:48:18 | tainted2 | tst.go:48:2:48:2 | u [postupdate] | provenance | Config | | tst.go:49:11:49:11 | u | tst.go:49:11:49:20 | call to String | provenance | MaD:3 | | websocket.go:60:21:60:31 | call to Referer | websocket.go:65:27:65:40 | untrustedInput | provenance | Src:MaD:2 | @@ -71,7 +71,7 @@ nodes | tst.go:37:18:37:24 | tainted | semmle.label | tainted | | tst.go:39:11:39:29 | ...+... | semmle.label | ...+... | | tst.go:41:11:41:40 | ...+... | semmle.label | ...+... | -| tst.go:48:2:48:2 | implicit dereference [postupdate] | semmle.label | implicit dereference [postupdate] | +| tst.go:48:2:48:2 | implicit-deref u [postupdate] | semmle.label | implicit-deref u [postupdate] | | tst.go:48:2:48:2 | u [postupdate] | semmle.label | u [postupdate] | | tst.go:48:11:48:18 | tainted2 | semmle.label | tainted2 | | tst.go:49:11:49:11 | u | semmle.label | u | From 2daa7ed6af142d841e760aa636cc59175642e2e2 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 12 Aug 2026 19:39:39 +0100 Subject: [PATCH 0970/2098] Improve redundant recover test coverage --- .../test/query-tests/RedundantCode/RedundantRecover/tst.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/go/ql/test/query-tests/RedundantCode/RedundantRecover/tst.go b/go/ql/test/query-tests/RedundantCode/RedundantRecover/tst.go index c9bebbd4bfe4..e136cd9dff50 100644 --- a/go/ql/test/query-tests/RedundantCode/RedundantRecover/tst.go +++ b/go/ql/test/query-tests/RedundantCode/RedundantRecover/tst.go @@ -3,16 +3,16 @@ package main import "fmt" func callRecover3() { - // This will have no effect because panics do not propagate down the stack, - // only back up the stack + // This has no effect because recover is only effective when called directly + // by a deferred function while its caller is panicking. if recover() != nil { // $ Alert fmt.Printf("recovered") } } func fun3() { - panic("3") callRecover3() + panic("3") } func callRecover4() { From b82db671fd0c0b53d146d2752b0b506788d4db9a Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 13 Aug 2026 13:30:00 +0100 Subject: [PATCH 0971/2098] More tests for non-returning functions --- .../ControlFlowNode_getASuccessor.expected | 160 ++++++++++++------ .../ControlFlowGraph/NoretFunctions.expected | 3 +- .../go/controlflow/ControlFlowGraph/stmts7.go | 29 +++- 3 files changed, 135 insertions(+), 57 deletions(-) diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected index a999a416df12..be4ee63f46eb 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected @@ -1353,61 +1353,111 @@ | stmts6.go:5:3:5:11 | return statement | stmts6.go:3:1:8:1 | exit | | stmts6.go:5:10:5:11 | 42 | stmts6.go:5:3:5:11 | return statement | | stmts6.go:7:9:7:10 | 23 | stmts6.go:7:2:7:10 | return statement | -| stmts7.go:0:0:0:0 | entry | stmts7.go:3:1:3:12 | skip | -| stmts7.go:3:1:3:12 | skip | stmts7.go:5:6:5:17 | skip | -| stmts7.go:5:1:8:1 | entry | stmts7.go:6:2:6:5 | skip | -| stmts7.go:5:1:8:1 | function declaration | stmts7.go:10:6:10:15 | skip | -| stmts7.go:5:6:5:17 | skip | stmts7.go:5:1:8:1 | function declaration | -| stmts7.go:6:2:6:5 | skip | stmts7.go:6:10:6:16 | recover | -| stmts7.go:6:2:6:18 | assign:0 ... := ... | stmts7.go:7:2:7:12 | selection of Println | -| stmts7.go:6:10:6:16 | recover | stmts7.go:6:10:6:18 | call to recover | -| stmts7.go:6:10:6:18 | call to recover | stmts7.go:6:2:6:18 | assign:0 ... := ... | -| stmts7.go:7:2:7:12 | selection of Println | stmts7.go:7:14:7:26 | "recovered: " | -| stmts7.go:7:2:7:33 | call to Println | stmts7.go:5:1:8:1 | exit | -| stmts7.go:7:14:7:26 | "recovered: " | stmts7.go:7:29:7:32 | blah | -| stmts7.go:7:29:7:32 | blah | stmts7.go:7:2:7:33 | call to Println | -| stmts7.go:10:1:13:1 | entry | stmts7.go:11:8:11:19 | recoverPanic | -| stmts7.go:10:1:13:1 | function declaration | stmts7.go:15:1:17:1 | skip | -| stmts7.go:10:6:10:15 | skip | stmts7.go:10:1:13:1 | function declaration | -| stmts7.go:11:2:11:21 | defer statement | stmts7.go:12:2:12:6 | panic | -| stmts7.go:11:8:11:19 | recoverPanic | stmts7.go:11:2:11:21 | defer statement | -| stmts7.go:11:8:11:21 | call to recoverPanic | stmts7.go:10:1:13:1 | exit | -| stmts7.go:12:2:12:6 | panic | stmts7.go:12:8:12:9 | "" | -| stmts7.go:12:2:12:10 | call to panic | stmts7.go:11:8:11:21 | call to recoverPanic | -| stmts7.go:12:8:12:9 | "" | stmts7.go:12:2:12:10 | call to panic | -| stmts7.go:15:1:17:1 | skip | stmts7.go:19:26:19:28 | skip | -| stmts7.go:19:1:21:1 | entry | stmts7.go:19:7:19:13 | methods | -| stmts7.go:19:1:21:1 | function declaration | stmts7.go:23:6:23:14 | skip | -| stmts7.go:19:7:19:13 | methods | stmts7.go:19:7:19:13 | methods | -| stmts7.go:19:7:19:13 | methods | stmts7.go:20:2:20:8 | methods | -| stmts7.go:19:26:19:28 | skip | stmts7.go:19:1:21:1 | function declaration | -| stmts7.go:20:2:20:8 | implicit-deref methods | stmts7.go:19:1:21:1 | exit | -| stmts7.go:20:2:20:8 | implicit-deref methods | stmts7.go:20:2:20:11 | selection of fn | -| stmts7.go:20:2:20:8 | methods | stmts7.go:20:2:20:8 | implicit-deref methods | -| stmts7.go:20:2:20:11 | selection of fn | stmts7.go:20:2:20:13 | call to fn | -| stmts7.go:20:2:20:13 | call to fn | stmts7.go:19:1:21:1 | exit | -| stmts7.go:23:1:28:1 | entry | stmts7.go:23:16:23:23 | callback | -| stmts7.go:23:1:28:1 | function declaration | stmts7.go:0:0:0:0 | exit | -| stmts7.go:23:6:23:14 | skip | stmts7.go:23:1:28:1 | function declaration | -| stmts7.go:23:16:23:23 | callback | stmts7.go:23:16:23:23 | callback | -| stmts7.go:23:16:23:23 | callback | stmts7.go:24:8:24:15 | callback | -| stmts7.go:24:2:24:20 | defer statement | stmts7.go:25:10:25:17 | callback | -| stmts7.go:24:8:24:15 | callback | stmts7.go:24:8:24:18 | selection of fn | -| stmts7.go:24:8:24:18 | selection of fn | stmts7.go:24:2:24:20 | defer statement | -| stmts7.go:24:8:24:20 | call to fn | stmts7.go:23:1:28:1 | exit | -| stmts7.go:25:2:25:23 | defer statement | stmts7.go:26:2:26:12 | selection of Println | -| stmts7.go:25:8:25:18 | implicit-deref (...) | stmts7.go:24:8:24:20 | call to fn | -| stmts7.go:25:8:25:18 | implicit-deref (...) | stmts7.go:25:8:25:21 | selection of fn | -| stmts7.go:25:8:25:21 | selection of fn | stmts7.go:25:2:25:23 | defer statement | -| stmts7.go:25:8:25:23 | call to fn | stmts7.go:24:8:24:20 | call to fn | -| stmts7.go:25:9:25:17 | &... | stmts7.go:25:8:25:18 | implicit-deref (...) | -| stmts7.go:25:10:25:17 | callback | stmts7.go:25:9:25:17 | &... | -| stmts7.go:26:2:26:12 | selection of Println | stmts7.go:26:14:26:30 | "print something" | -| stmts7.go:26:2:26:31 | call to Println | stmts7.go:25:8:25:23 | call to fn | -| stmts7.go:26:2:26:31 | call to Println | stmts7.go:27:9:27:13 | false | -| stmts7.go:26:14:26:30 | "print something" | stmts7.go:26:2:26:31 | call to Println | -| stmts7.go:27:2:27:13 | return statement | stmts7.go:25:8:25:23 | call to fn | -| stmts7.go:27:9:27:13 | false | stmts7.go:27:2:27:13 | return statement | +| stmts7.go:0:0:0:0 | entry | stmts7.go:3:1:6:1 | skip | +| stmts7.go:3:1:6:1 | skip | stmts7.go:8:6:8:17 | skip | +| stmts7.go:8:1:11:1 | entry | stmts7.go:9:2:9:5 | skip | +| stmts7.go:8:1:11:1 | function declaration | stmts7.go:13:6:13:15 | skip | +| stmts7.go:8:6:8:17 | skip | stmts7.go:8:1:11:1 | function declaration | +| stmts7.go:9:2:9:5 | skip | stmts7.go:9:10:9:16 | recover | +| stmts7.go:9:2:9:18 | assign:0 ... := ... | stmts7.go:10:2:10:12 | selection of Println | +| stmts7.go:9:10:9:16 | recover | stmts7.go:9:10:9:18 | call to recover | +| stmts7.go:9:10:9:18 | call to recover | stmts7.go:9:2:9:18 | assign:0 ... := ... | +| stmts7.go:10:2:10:12 | selection of Println | stmts7.go:10:14:10:26 | "recovered: " | +| stmts7.go:10:2:10:33 | call to Println | stmts7.go:8:1:11:1 | exit | +| stmts7.go:10:14:10:26 | "recovered: " | stmts7.go:10:29:10:32 | blah | +| stmts7.go:10:29:10:32 | blah | stmts7.go:10:2:10:33 | call to Println | +| stmts7.go:13:1:16:1 | entry | stmts7.go:14:8:14:19 | recoverPanic | +| stmts7.go:13:1:16:1 | function declaration | stmts7.go:18:1:20:1 | skip | +| stmts7.go:13:6:13:15 | skip | stmts7.go:13:1:16:1 | function declaration | +| stmts7.go:14:2:14:21 | defer statement | stmts7.go:15:2:15:6 | panic | +| stmts7.go:14:8:14:19 | recoverPanic | stmts7.go:14:2:14:21 | defer statement | +| stmts7.go:14:8:14:21 | call to recoverPanic | stmts7.go:13:1:16:1 | exit | +| stmts7.go:15:2:15:6 | panic | stmts7.go:15:8:15:9 | "" | +| stmts7.go:15:2:15:10 | call to panic | stmts7.go:14:8:14:21 | call to recoverPanic | +| stmts7.go:15:8:15:9 | "" | stmts7.go:15:2:15:10 | call to panic | +| stmts7.go:18:1:20:1 | skip | stmts7.go:22:26:22:28 | skip | +| stmts7.go:22:1:24:1 | entry | stmts7.go:22:7:22:13 | methods | +| stmts7.go:22:1:24:1 | function declaration | stmts7.go:26:6:26:14 | skip | +| stmts7.go:22:7:22:13 | methods | stmts7.go:22:7:22:13 | methods | +| stmts7.go:22:7:22:13 | methods | stmts7.go:23:2:23:8 | methods | +| stmts7.go:22:26:22:28 | skip | stmts7.go:22:1:24:1 | function declaration | +| stmts7.go:23:2:23:8 | implicit-deref methods | stmts7.go:22:1:24:1 | exit | +| stmts7.go:23:2:23:8 | implicit-deref methods | stmts7.go:23:2:23:11 | selection of fn | +| stmts7.go:23:2:23:8 | methods | stmts7.go:23:2:23:8 | implicit-deref methods | +| stmts7.go:23:2:23:11 | selection of fn | stmts7.go:23:2:23:13 | call to fn | +| stmts7.go:23:2:23:13 | call to fn | stmts7.go:22:1:24:1 | exit | +| stmts7.go:26:1:31:1 | entry | stmts7.go:26:16:26:23 | callback | +| stmts7.go:26:1:31:1 | function declaration | stmts7.go:33:6:33:20 | skip | +| stmts7.go:26:6:26:14 | skip | stmts7.go:26:1:31:1 | function declaration | +| stmts7.go:26:16:26:23 | callback | stmts7.go:26:16:26:23 | callback | +| stmts7.go:26:16:26:23 | callback | stmts7.go:27:8:27:15 | callback | +| stmts7.go:27:2:27:20 | defer statement | stmts7.go:28:10:28:17 | callback | +| stmts7.go:27:8:27:15 | callback | stmts7.go:27:8:27:18 | selection of fn | +| stmts7.go:27:8:27:18 | selection of fn | stmts7.go:27:2:27:20 | defer statement | +| stmts7.go:27:8:27:20 | call to fn | stmts7.go:26:1:31:1 | exit | +| stmts7.go:28:2:28:23 | defer statement | stmts7.go:29:2:29:12 | selection of Println | +| stmts7.go:28:8:28:18 | implicit-deref (...) | stmts7.go:27:8:27:20 | call to fn | +| stmts7.go:28:8:28:18 | implicit-deref (...) | stmts7.go:28:8:28:21 | selection of fn | +| stmts7.go:28:8:28:21 | selection of fn | stmts7.go:28:2:28:23 | defer statement | +| stmts7.go:28:8:28:23 | call to fn | stmts7.go:27:8:27:20 | call to fn | +| stmts7.go:28:9:28:17 | &... | stmts7.go:28:8:28:18 | implicit-deref (...) | +| stmts7.go:28:10:28:17 | callback | stmts7.go:28:9:28:17 | &... | +| stmts7.go:29:2:29:12 | selection of Println | stmts7.go:29:14:29:30 | "print something" | +| stmts7.go:29:2:29:31 | call to Println | stmts7.go:28:8:28:23 | call to fn | +| stmts7.go:29:2:29:31 | call to Println | stmts7.go:30:9:30:13 | false | +| stmts7.go:29:14:29:30 | "print something" | stmts7.go:29:2:29:31 | call to Println | +| stmts7.go:30:2:30:13 | return statement | stmts7.go:28:8:28:23 | call to fn | +| stmts7.go:30:9:30:13 | false | stmts7.go:30:2:30:13 | return statement | +| stmts7.go:33:1:36:1 | entry | stmts7.go:34:8:34:19 | recoverPanic | +| stmts7.go:33:1:36:1 | function declaration | stmts7.go:38:6:38:18 | skip | +| stmts7.go:33:6:33:20 | skip | stmts7.go:33:1:36:1 | function declaration | +| stmts7.go:34:2:34:21 | defer statement | stmts7.go:35:2:35:8 | selection of Exit | +| stmts7.go:34:8:34:19 | recoverPanic | stmts7.go:34:2:34:21 | defer statement | +| stmts7.go:34:8:34:21 | call to recoverPanic | stmts7.go:33:1:36:1 | exit | +| stmts7.go:35:2:35:8 | selection of Exit | stmts7.go:35:10:35:10 | 1 | +| stmts7.go:35:2:35:11 | call to Exit | stmts7.go:34:8:34:21 | call to recoverPanic | +| stmts7.go:35:10:35:10 | 1 | stmts7.go:35:2:35:11 | call to Exit | +| stmts7.go:38:1:41:1 | entry | stmts7.go:39:8:39:19 | recoverPanic | +| stmts7.go:38:1:41:1 | function declaration | stmts7.go:43:6:43:23 | skip | +| stmts7.go:38:6:38:18 | skip | stmts7.go:38:1:41:1 | function declaration | +| stmts7.go:39:2:39:21 | defer statement | stmts7.go:40:8:40:12 | panic | +| stmts7.go:39:8:39:19 | recoverPanic | stmts7.go:39:2:39:21 | defer statement | +| stmts7.go:39:8:39:21 | call to recoverPanic | stmts7.go:38:1:41:1 | exit | +| stmts7.go:40:2:40:30 | defer statement | stmts7.go:40:8:40:30 | call to panic | +| stmts7.go:40:8:40:12 | panic | stmts7.go:40:14:40:29 | "deferred panic" | +| stmts7.go:40:8:40:30 | call to panic | stmts7.go:39:8:39:21 | call to recoverPanic | +| stmts7.go:40:14:40:29 | "deferred panic" | stmts7.go:40:2:40:30 | defer statement | +| stmts7.go:43:1:45:1 | entry | stmts7.go:44:8:44:12 | panic | +| stmts7.go:43:1:45:1 | function declaration | stmts7.go:47:6:47:31 | skip | +| stmts7.go:43:6:43:23 | skip | stmts7.go:43:1:45:1 | function declaration | +| stmts7.go:44:2:44:36 | defer statement | stmts7.go:44:8:44:36 | call to panic | +| stmts7.go:44:8:44:12 | panic | stmts7.go:44:14:44:35 | "final deferred panic" | +| stmts7.go:44:8:44:36 | call to panic | stmts7.go:43:1:45:1 | exit | +| stmts7.go:44:14:44:35 | "final deferred panic" | stmts7.go:44:2:44:36 | defer statement | +| stmts7.go:47:1:50:1 | entry | stmts7.go:48:8:48:19 | recoverPanic | +| stmts7.go:47:1:50:1 | function declaration | stmts7.go:52:6:52:29 | skip | +| stmts7.go:47:6:47:31 | skip | stmts7.go:47:1:50:1 | function declaration | +| stmts7.go:48:2:48:21 | defer statement | stmts7.go:49:8:49:14 | selection of Exit | +| stmts7.go:48:8:48:19 | recoverPanic | stmts7.go:48:2:48:21 | defer statement | +| stmts7.go:48:8:48:21 | call to recoverPanic | stmts7.go:47:1:50:1 | exit | +| stmts7.go:49:2:49:17 | defer statement | stmts7.go:49:8:49:17 | call to Exit | +| stmts7.go:49:8:49:14 | selection of Exit | stmts7.go:49:16:49:16 | 1 | +| stmts7.go:49:8:49:17 | call to Exit | stmts7.go:48:8:48:21 | call to recoverPanic | +| stmts7.go:49:16:49:16 | 1 | stmts7.go:49:2:49:17 | defer statement | +| stmts7.go:52:1:55:1 | entry | stmts7.go:52:31:52:36 | values | +| stmts7.go:52:1:55:1 | function declaration | stmts7.go:0:0:0:0 | exit | +| stmts7.go:52:6:52:29 | skip | stmts7.go:52:1:55:1 | function declaration | +| stmts7.go:52:31:52:36 | values | stmts7.go:52:31:52:36 | values | +| stmts7.go:52:31:52:36 | values | stmts7.go:52:45:52:49 | index | +| stmts7.go:52:45:52:49 | index | stmts7.go:52:45:52:49 | index | +| stmts7.go:52:45:52:49 | index | stmts7.go:53:8:53:19 | recoverPanic | +| stmts7.go:53:2:53:21 | defer statement | stmts7.go:54:2:54:2 | skip | +| stmts7.go:53:8:53:19 | recoverPanic | stmts7.go:53:2:53:21 | defer statement | +| stmts7.go:53:8:53:21 | call to recoverPanic | stmts7.go:52:1:55:1 | exit | +| stmts7.go:54:2:54:2 | skip | stmts7.go:54:6:54:11 | values | +| stmts7.go:54:6:54:11 | values | stmts7.go:54:13:54:17 | index | +| stmts7.go:54:6:54:18 | index expression | stmts7.go:53:8:53:21 | call to recoverPanic | +| stmts7.go:54:13:54:17 | index | stmts7.go:54:6:54:18 | index expression | | stmts8.go:0:0:0:0 | entry | stmts8.go:3:6:3:11 | skip | | stmts8.go:3:1:7:1 | entry | stmts8.go:3:13:3:13 | x | | stmts8.go:3:1:7:1 | function declaration | stmts8.go:9:6:9:12 | skip | diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/NoretFunctions.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/NoretFunctions.expected index 2715352ef253..331aaa893254 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/NoretFunctions.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/NoretFunctions.expected @@ -16,7 +16,8 @@ | noretfunctions.go:8:6:8:12 | isNoRet | github.com/github/codeql-go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph.isNoRet | | noretfunctions.go:20:6:20:22 | noRetUsesLogFatal | github.com/github/codeql-go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph.noRetUsesLogFatal | | noretfunctions.go:24:6:24:23 | noRetUsesLogFatalf | github.com/github/codeql-go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph.noRetUsesLogFatalf | -| stmts7.go:10:6:10:15 | canRecover | github.com/github/codeql-go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph.canRecover | +| stmts7.go:13:6:13:15 | canRecover | github.com/github/codeql-go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph.canRecover | +| stmts7.go:33:6:33:20 | deferBeforeExit | github.com/github/codeql-go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph.deferBeforeExit | | stmts.go:10:6:10:10 | test5 | github.com/github/codeql-go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph.test5 | | stmts.go:46:6:46:10 | test6 | github.com/github/codeql-go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph.test6 | | stmts.go:112:6:112:10 | test9 | github.com/github/codeql-go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph.test9 | diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/stmts7.go b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/stmts7.go index f44b8d53a0d5..c7686f331cd0 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/stmts7.go +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/stmts7.go @@ -1,6 +1,9 @@ package main -import "fmt" +import ( + "fmt" + "os" +) func recoverPanic() { blah := recover() @@ -26,3 +29,27 @@ func defertest(callback Callback) bool { fmt.Println("print something") return false } + +func deferBeforeExit() { + defer recoverPanic() + os.Exit(1) +} + +func deferredPanic() { + defer recoverPanic() + defer panic("deferred panic") +} + +func finalDeferredPanic() { + defer panic("final deferred panic") +} + +func deferredExitStopsRemaining() { + defer recoverPanic() + defer os.Exit(1) +} + +func deferBeforePossiblePanic(values []int, index int) { + defer recoverPanic() + _ = values[index] +} From 62f2b42854779da553a6bbbed8b0601ecac6b0ee Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Mon, 13 Jul 2026 13:11:04 +0100 Subject: [PATCH 0972/2098] Test semantic invalid types in notype test --- go/ql/test/library-tests/semmle/go/Types/notype.ql | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/go/ql/test/library-tests/semmle/go/Types/notype.ql b/go/ql/test/library-tests/semmle/go/Types/notype.ql index 9c781d2bff23..9845f6129303 100644 --- a/go/ql/test/library-tests/semmle/go/Types/notype.ql +++ b/go/ql/test/library-tests/semmle/go/Types/notype.ql @@ -4,5 +4,7 @@ from Expr e where // filter out expressions that don't have any semantics exists(DataFlow::exprNode(e)) and - not type_of(e, _) + // no type was extracted for the expression, and it has no synthesized type either + not type_of(e, _) and + e.getType() instanceof InvalidType select e, e.getType() From 9c749eb12dbe4af65e54c913a269ef95c3752b42 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 13 Aug 2026 14:32:45 +0100 Subject: [PATCH 0973/2098] Make KeyValueExpr have the same type as its value --- go/ql/lib/semmle/go/Expr.qll | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/go/ql/lib/semmle/go/Expr.qll b/go/ql/lib/semmle/go/Expr.qll index 9a8481a2dcc8..d9b4dcff5667 100644 --- a/go/ql/lib/semmle/go/Expr.qll +++ b/go/ql/lib/semmle/go/Expr.qll @@ -971,6 +971,18 @@ class KeyValueExpr extends @keyvalueexpr, Expr { /** Gets the composite literal to which this key-value pair belongs. */ CompositeLit getLiteral() { this = result.getElement(_) } + /** + * Gets the type of this key-value pair. + * + * The Go type checker does not assign a type to key-value pairs, so we use the + * type of the value, which is the value that flows through this node. + */ + override Type getType() { + type_of(this, result) + or + not type_of(this, _) and result = this.getValue().getType() + } + override string toString() { result = "key-value pair" } override string getAPrimaryQlClass() { result = "KeyValueExpr" } From 2200bfa051ce7b826fdf8959365929cea8bed251 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 13 Aug 2026 14:21:58 +0100 Subject: [PATCH 0974/2098] Change mayReturnNormally to mustNotReturnNormally --- go/ql/lib/semmle/go/Concepts.qll | 2 +- go/ql/lib/semmle/go/Scopes.qll | 15 +++++++++++++-- go/ql/lib/semmle/go/frameworks/Glog.qll | 2 +- go/ql/lib/semmle/go/frameworks/Logrus.qll | 4 ++-- go/ql/lib/semmle/go/frameworks/Zap.qll | 2 +- go/ql/lib/semmle/go/frameworks/stdlib/Log.qll | 2 +- go/ql/lib/semmle/go/frameworks/stdlib/Os.qll | 2 +- 7 files changed, 20 insertions(+), 9 deletions(-) diff --git a/go/ql/lib/semmle/go/Concepts.qll b/go/ql/lib/semmle/go/Concepts.qll index 302149149520..1194b2051f5a 100644 --- a/go/ql/lib/semmle/go/Concepts.qll +++ b/go/ql/lib/semmle/go/Concepts.qll @@ -431,7 +431,7 @@ private class HeuristicLoggerFunction extends Method { ) } - override predicate mayReturnNormally() { logFunctionPrefix != "Fatal" } + override predicate mustNotReturnNormally() { logFunctionPrefix = "Fatal" } override predicate mustPanic() { logFunctionPrefix = "Panic" } } diff --git a/go/ql/lib/semmle/go/Scopes.qll b/go/ql/lib/semmle/go/Scopes.qll index 9f18290fb011..735dbe80d590 100644 --- a/go/ql/lib/semmle/go/Scopes.qll +++ b/go/ql/lib/semmle/go/Scopes.qll @@ -437,11 +437,12 @@ class Function extends ValueEntity, @functionobject { * This predicate is an over-approximation: it may hold for functions that can never * return normally, but it never fails to hold for functions that can. * - * Note this is declared here and not in `DeclaredFunction` so that library models can override this - * by extending `Function` rather than having to remember to extend `DeclaredFunction`. + * Library models should not override this predicate; override `mustNotReturnNormally` + * instead, so that the control-flow graph construction can take the model into account. */ predicate mayReturnNormally() { not this.mustPanic() and + not this.mustNotReturnNormally() and (ControlFlow::mayReturnNormally(this.getFuncDecl()) or not exists(this.getBody())) } @@ -461,6 +462,16 @@ class Function extends ValueEntity, @functionobject { */ predicate mustPanic() { none() } + /** + * Holds if calling this function never returns normally (for example because it + * always panics, exits the process, or loops forever). + * + * Unlike `mayReturnNormally`, this predicate must be defined without reference to + * the control-flow graph, so that it can be used during CFG construction to + * suppress normal-flow successors of calls to this function. + */ + predicate mustNotReturnNormally() { none() } + /** Gets the number of parameters of this function. */ int getNumParameter() { result = this.getType().(SignatureType).getNumParameter() } diff --git a/go/ql/lib/semmle/go/frameworks/Glog.qll b/go/ql/lib/semmle/go/frameworks/Glog.qll index 9715cc910733..eb7210fd36d8 100644 --- a/go/ql/lib/semmle/go/frameworks/Glog.qll +++ b/go/ql/lib/semmle/go/frameworks/Glog.qll @@ -59,7 +59,7 @@ module Glog { /** Holds if this function takes a format string. */ predicate formatter() { format = "f" } - override predicate mayReturnNormally() { level != "Fatal" and level != "Exit" } + override predicate mustNotReturnNormally() { level = "Fatal" or level = "Exit" } } private class StringFormatter extends StringOps::Formatting::Range instanceof GlogFunction { diff --git a/go/ql/lib/semmle/go/frameworks/Logrus.qll b/go/ql/lib/semmle/go/frameworks/Logrus.qll index 069764318d57..e124fd477293 100644 --- a/go/ql/lib/semmle/go/frameworks/Logrus.qll +++ b/go/ql/lib/semmle/go/frameworks/Logrus.qll @@ -29,8 +29,8 @@ module Logrus { ) } - override predicate mayReturnNormally() { - not exists(string level, string suffix | level = ["Fatal", "Panic"] | + override predicate mustNotReturnNormally() { + exists(string level, string suffix | level = ["Fatal", "Panic"] | this.getName() = level + suffix ) } diff --git a/go/ql/lib/semmle/go/frameworks/Zap.qll b/go/ql/lib/semmle/go/frameworks/Zap.qll index cf0abcd9336e..95947d22116e 100644 --- a/go/ql/lib/semmle/go/frameworks/Zap.qll +++ b/go/ql/lib/semmle/go/frameworks/Zap.qll @@ -54,7 +54,7 @@ module Zap { this.hasQualifiedName(packagePath(), "SugaredLogger", "Fatal" + getSuffix()) } - override predicate mayReturnNormally() { none() } + override predicate mustNotReturnNormally() { any() } } /** A Zap logging function which always panics. */ diff --git a/go/ql/lib/semmle/go/frameworks/stdlib/Log.qll b/go/ql/lib/semmle/go/frameworks/stdlib/Log.qll index 1ff1a4b320fa..fece3cbab9ae 100644 --- a/go/ql/lib/semmle/go/frameworks/stdlib/Log.qll +++ b/go/ql/lib/semmle/go/frameworks/stdlib/Log.qll @@ -44,7 +44,7 @@ module Log { ) } - override predicate mayReturnNormally() { none() } + override predicate mustNotReturnNormally() { any() } } /** A log function which must panic. */ diff --git a/go/ql/lib/semmle/go/frameworks/stdlib/Os.qll b/go/ql/lib/semmle/go/frameworks/stdlib/Os.qll index 0a633de08c82..6a3550e1cbd4 100644 --- a/go/ql/lib/semmle/go/frameworks/stdlib/Os.qll +++ b/go/ql/lib/semmle/go/frameworks/stdlib/Os.qll @@ -12,7 +12,7 @@ module Os { private class Exit extends Function { Exit() { this.hasQualifiedName("os", "Exit") } - override predicate mayReturnNormally() { none() } + override predicate mustNotReturnNormally() { any() } } // These models are not implemented using Models-as-Data because they represent reverse flow. From af19ef34792fba42e8fd37dba3c900336dc100a0 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 13 Aug 2026 13:20:45 +0100 Subject: [PATCH 0975/2098] Distinguish panic and exit in logrus --- go/ql/lib/semmle/go/frameworks/Logrus.qll | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/go/ql/lib/semmle/go/frameworks/Logrus.qll b/go/ql/lib/semmle/go/frameworks/Logrus.qll index e124fd477293..9e370209d032 100644 --- a/go/ql/lib/semmle/go/frameworks/Logrus.qll +++ b/go/ql/lib/semmle/go/frameworks/Logrus.qll @@ -29,11 +29,9 @@ module Logrus { ) } - override predicate mustNotReturnNormally() { - exists(string level, string suffix | level = ["Fatal", "Panic"] | - this.getName() = level + suffix - ) - } + override predicate mustNotReturnNormally() { this.getName() = "Fatal" + any(string suffix) } + + override predicate mustPanic() { this.getName() = "Panic" + any(string suffix) } } private class StringFormatters extends StringOps::Formatting::Range instanceof LogFunction { From 304ec854c2dce8714f0bc20757481ed08be92747 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 13 Aug 2026 13:21:13 +0100 Subject: [PATCH 0976/2098] Model `logrus.Exit` like `os.Exit` --- go/ql/lib/semmle/go/frameworks/Logrus.qll | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/go/ql/lib/semmle/go/frameworks/Logrus.qll b/go/ql/lib/semmle/go/frameworks/Logrus.qll index 9e370209d032..c3e3a1051acf 100644 --- a/go/ql/lib/semmle/go/frameworks/Logrus.qll +++ b/go/ql/lib/semmle/go/frameworks/Logrus.qll @@ -44,4 +44,11 @@ module Logrus { override int getFormatStringIndex() { result = argOffset } } + + /** The `Exit` function, which ends the process. */ + private class Exit extends Function { + Exit() { this.hasQualifiedName(packagePath(), "Exit") } + + override predicate mustNotReturnNormally() { any() } + } } From a772b428f6d271010efbb10d6d24cabaaeeb8d85 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Tue, 14 Jul 2026 13:21:55 +0100 Subject: [PATCH 0977/2098] Update two queries so alert locations don't change --- go/ql/lib/semmle/go/controlflow/IR.qll | 3 + go/ql/src/RedundantCode/DeadStoreOfField.ql | 10 +- go/ql/src/RedundantCode/DeadStoreOfLocal.ql | 12 +- .../DeadStoreOfField.expected | 4 +- .../DeadStoreOfField/writetargets.go | 37 +++++ .../DeadStoreOfLocal.expected | 72 ++++++---- .../DeadStoreOfLocal/writetargets.go | 135 ++++++++++++++++++ 7 files changed, 236 insertions(+), 37 deletions(-) create mode 100644 go/ql/test/query-tests/RedundantCode/DeadStoreOfField/writetargets.go create mode 100644 go/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/writetargets.go diff --git a/go/ql/lib/semmle/go/controlflow/IR.qll b/go/ql/lib/semmle/go/controlflow/IR.qll index a47f9c9ff155..5c5dce255bcb 100644 --- a/go/ql/lib/semmle/go/controlflow/IR.qll +++ b/go/ql/lib/semmle/go/controlflow/IR.qll @@ -1338,6 +1338,9 @@ module IR { /** Gets the write instruction of which this is the target. */ WriteInstruction getWrite() { result = w } + /** Gets the left-hand side expression being written to, if any. */ + Expr getExpr() { this = MkLhs(_, result) } + /** Gets the name of the variable or field being written to, if any. */ string getName() { none() } diff --git a/go/ql/src/RedundantCode/DeadStoreOfField.ql b/go/ql/src/RedundantCode/DeadStoreOfField.ql index 4a971343823b..fbe0fcf04c2e 100644 --- a/go/ql/src/RedundantCode/DeadStoreOfField.ql +++ b/go/ql/src/RedundantCode/DeadStoreOfField.ql @@ -86,7 +86,7 @@ Type getTypeEmbeddedViaPointer(Type t) { result = getEmbeddedType*(getEmbeddedType(getEmbeddedType*(t), true)) } -from Write w, LocalVariable v, Field f +from Write w, LocalVariable v, Field f, Expr lhs where // `w` writes `f` on `v` w.writesFieldPreUpdate(v.getARead(), f, _) and @@ -97,5 +97,9 @@ where // exclude escaping `v`; there may be reads in other functions not exists(Read r | r.reads(v) | escapes(r)) and // exclude fields promoted through an embedded pointer type - not f = getTypeEmbeddedViaPointer(v.getType()).getField(_) -select w, "This assignment to " + f + " is useless since its value is never read." + not f = getTypeEmbeddedViaPointer(v.getType()).getField(_) and + // Report the assigned field expression rather than the whole write instruction. A field write + // `v.f = ...` always has an explicit left-hand side expression (the `v.f` selector), so this + // does not drop any results. + lhs = w.getLhs().getExpr() +select lhs, "This assignment to " + f + " is useless since its value is never read." diff --git a/go/ql/src/RedundantCode/DeadStoreOfLocal.ql b/go/ql/src/RedundantCode/DeadStoreOfLocal.ql index 3e3642f92db1..2086d0de0531 100644 --- a/go/ql/src/RedundantCode/DeadStoreOfLocal.ql +++ b/go/ql/src/RedundantCode/DeadStoreOfLocal.ql @@ -29,7 +29,7 @@ predicate isSimple(IR::Instruction nd) { nd instanceof IR::ReadArgumentInstruction } -from IR::Instruction def, SsaSourceVariable target, IR::Instruction rhs +from IR::WriteInstruction def, SsaSourceVariable target, IR::Instruction rhs, Expr lhs where def.writes(target, rhs) and not exists(SsaExplicitDefinition ssa | ssa.getInstruction() = def) and @@ -40,5 +40,11 @@ where // exclude variables that are not used at all exists(target.getAReference()) and // exclude variables with indirect references - not target.mayHaveIndirectReferences() -select def, "This definition of " + target + " is never used." + not target.mayHaveIndirectReferences() and + // Report the assigned variable rather than the whole write instruction. A write to an + // `SsaSourceVariable` that survives the `SsaExplicitDefinition` exclusion above always has an + // explicit left-hand side expression (writes without one, such as result-variable writes at a + // `return`, are `SsaExplicitDefinition`s and so are already excluded), so this does not drop + // any results. + lhs = def.getLhs().getExpr() +select lhs, "This definition of " + target + " is never used." diff --git a/go/ql/test/query-tests/RedundantCode/DeadStoreOfField/DeadStoreOfField.expected b/go/ql/test/query-tests/RedundantCode/DeadStoreOfField/DeadStoreOfField.expected index 1041d7138f7d..476154a69fa5 100644 --- a/go/ql/test/query-tests/RedundantCode/DeadStoreOfField/DeadStoreOfField.expected +++ b/go/ql/test/query-tests/RedundantCode/DeadStoreOfField/DeadStoreOfField.expected @@ -1 +1,3 @@ -| DeadStoreOfField.go:8:2:8:10 | assign:0 ... = ... | This assignment to val is useless since its value is never read. | +| DeadStoreOfField.go:8:2:8:6 | selection of val | This assignment to val is useless since its value is never read. | +| writetargets.go:18:2:18:4 | selection of a | This assignment to a is useless since its value is never read. | +| writetargets.go:23:2:23:4 | selection of c | This assignment to c is useless since its value is never read. | diff --git a/go/ql/test/query-tests/RedundantCode/DeadStoreOfField/writetargets.go b/go/ql/test/query-tests/RedundantCode/DeadStoreOfField/writetargets.go new file mode 100644 index 000000000000..25d4630bfb47 --- /dev/null +++ b/go/ql/test/query-tests/RedundantCode/DeadStoreOfField/writetargets.go @@ -0,0 +1,37 @@ +package main + +// Field-write target variations for go/useless-assignment-to-field, exercising +// the FieldTarget write target with different selector-expression shapes. + +type wtInner struct { + a int + b int +} + +type wtEmbed struct { + wtInner + c int +} + +// direct field write on a value copy (dead) +func wtDirect(v wtInner) { + v.a = 0 // $ Alert +} + +// non-embedded field write on a value copy (dead) +func wtOwnField(v wtEmbed) { + v.c = 0 // $ Alert +} + +// The query only reports direct `v.f` writes, so writes whose base is itself a +// field access are not flagged, even though they are also dead. + +// explicitly-qualified embedded field write on a value copy (not flagged) +func wtNested(v wtEmbed) { + v.wtInner.b = 0 // OK +} + +// promoted (value-embedded) field write on a value copy (not flagged) +func wtPromoted(v wtEmbed) { + v.a = 0 // OK +} diff --git a/go/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/DeadStoreOfLocal.expected b/go/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/DeadStoreOfLocal.expected index a2a04d01188a..a2cba0d5dc92 100644 --- a/go/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/DeadStoreOfLocal.expected +++ b/go/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/DeadStoreOfLocal.expected @@ -1,30 +1,42 @@ -| main.go:25:2:25:16 | assign:0 ... = ... | This definition of x is never used. | -| testdata.go:32:2:32:16 | assign:0 ... = ... | This definition of x is never used. | -| testdata.go:37:2:37:16 | assign:0 ... = ... | This definition of x is never used. | -| testdata.go:61:2:61:18 | assign:0 ... := ... | This definition of x is never used. | -| testdata.go:67:2:67:17 | assign:0 ... := ... | This definition of x is never used. | -| testdata.go:99:2:99:17 | assign:0 ... := ... | This definition of x is never used. | -| testdata.go:101:3:101:17 | assign:0 ... = ... | This definition of x is never used. | -| testdata.go:108:2:108:17 | assign:0 ... := ... | This definition of x is never used. | -| testdata.go:110:3:110:17 | assign:0 ... = ... | This definition of x is never used. | -| testdata.go:128:2:128:17 | assign:0 ... := ... | This definition of x is never used. | -| testdata.go:130:3:130:17 | assign:0 ... = ... | This definition of x is never used. | -| testdata.go:131:3:131:17 | assign:0 ... = ... | This definition of x is never used. | -| testdata.go:134:3:134:17 | assign:0 ... = ... | This definition of x is never used. | -| testdata.go:143:3:143:17 | assign:0 ... = ... | This definition of x is never used. | -| testdata.go:164:3:164:17 | assign:0 ... = ... | This definition of x is never used. | -| testdata.go:172:3:172:18 | assign:0 ... += ... | This definition of x is never used. | -| testdata.go:180:3:180:5 | increment statement | This definition of x is never used. | -| testdata.go:201:2:201:24 | assign:0 ... = ... | This definition of x is never used. | -| testdata.go:262:2:262:16 | assign:0 ... = ... | This definition of x is never used. | -| testdata.go:268:2:268:16 | assign:0 ... = ... | This definition of x is never used. | -| testdata.go:309:2:309:7 | assign:0 ... /= ... | This definition of a is never used. | -| testdata.go:321:2:321:7 | assign:0 ... %= ... | This definition of a is never used. | -| testdata.go:387:3:387:17 | assign:0 ... = ... | This definition of x is never used. | -| testdata.go:432:3:432:17 | assign:0 ... = ... | This definition of x is never used. | -| testdata.go:434:3:434:17 | assign:0 ... = ... | This definition of x is never used. | -| testdata.go:441:2:441:17 | assign:0 ... := ... | This definition of x is never used. | -| testdata.go:488:3:488:17 | assign:0 ... = ... | This definition of x is never used. | -| testdata.go:542:3:542:17 | assign:0 ... = ... | This definition of x is never used. | -| testdata.go:580:4:580:18 | assign:0 ... = ... | This definition of x is never used. | -| testdata.go:629:3:629:16 | assign:0 ... = ... | This definition of v1 is never used. | +| main.go:25:2:25:2 | x | This definition of x is never used. | +| testdata.go:32:2:32:2 | x | This definition of x is never used. | +| testdata.go:37:2:37:2 | x | This definition of x is never used. | +| testdata.go:61:2:61:2 | x | This definition of x is never used. | +| testdata.go:67:2:67:2 | x | This definition of x is never used. | +| testdata.go:99:2:99:2 | x | This definition of x is never used. | +| testdata.go:101:3:101:3 | x | This definition of x is never used. | +| testdata.go:108:2:108:2 | x | This definition of x is never used. | +| testdata.go:110:3:110:3 | x | This definition of x is never used. | +| testdata.go:128:2:128:2 | x | This definition of x is never used. | +| testdata.go:130:3:130:3 | x | This definition of x is never used. | +| testdata.go:131:3:131:3 | x | This definition of x is never used. | +| testdata.go:134:3:134:3 | x | This definition of x is never used. | +| testdata.go:143:3:143:3 | x | This definition of x is never used. | +| testdata.go:164:3:164:3 | x | This definition of x is never used. | +| testdata.go:172:3:172:3 | x | This definition of x is never used. | +| testdata.go:180:3:180:3 | x | This definition of x is never used. | +| testdata.go:201:2:201:2 | x | This definition of x is never used. | +| testdata.go:262:2:262:2 | x | This definition of x is never used. | +| testdata.go:268:2:268:2 | x | This definition of x is never used. | +| testdata.go:309:2:309:2 | a | This definition of a is never used. | +| testdata.go:321:2:321:2 | a | This definition of a is never used. | +| testdata.go:387:3:387:3 | x | This definition of x is never used. | +| testdata.go:432:3:432:3 | x | This definition of x is never used. | +| testdata.go:434:3:434:3 | x | This definition of x is never used. | +| testdata.go:441:2:441:2 | x | This definition of x is never used. | +| testdata.go:488:3:488:3 | x | This definition of x is never used. | +| testdata.go:542:3:542:3 | x | This definition of x is never used. | +| testdata.go:580:4:580:4 | x | This definition of x is never used. | +| testdata.go:629:3:629:4 | v1 | This definition of v1 is never used. | +| writetargets.go:20:2:20:2 | x | This definition of x is never used. | +| writetargets.go:27:2:27:2 | x | This definition of x is never used. | +| writetargets.go:34:6:34:6 | x | This definition of x is never used. | +| writetargets.go:41:2:41:2 | x | This definition of x is never used. | +| writetargets.go:48:2:48:2 | x | This definition of x is never used. | +| writetargets.go:55:2:55:2 | x | This definition of x is never used. | +| writetargets.go:62:2:62:2 | x | This definition of x is never used. | +| writetargets.go:71:2:71:2 | x | This definition of x is never used. | +| writetargets.go:79:2:79:2 | v | This definition of v is never used. | +| writetargets.go:87:2:87:2 | v | This definition of v is never used. | +| writetargets.go:95:9:95:9 | v | This definition of v is never used. | +| writetargets.go:105:2:105:2 | r | This definition of r is never used. | diff --git a/go/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/writetargets.go b/go/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/writetargets.go new file mode 100644 index 000000000000..a7d707cfc8ea --- /dev/null +++ b/go/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/writetargets.go @@ -0,0 +1,135 @@ +package p + +// Examples exercising each kind of IR write target, to check that +// `go/useless-assignment-to-local` reports the assigned variable for every kind +// and correctly ignores writes that do not define a local variable. + +func wtTwoInts() (int, int) { return deadStore(), deadStore() } + +func wtMap() map[string]int { return nil } + +func wtIface() interface{} { return nil } + +type wtStruct struct{ f int } + +// --- Write targets that define a local variable (can be flagged) --- + +// simple assignment (assign / VarOrConstTarget) +func wtAssign() { + var x int + x = deadStore() // $ Alert + x = deadStore() + _ = x +} + +// short variable declaration (assign) +func wtShortDecl() { + x := deadStore() // $ Alert + x = deadStore() + _ = x +} + +// var declaration with initializer (assign via ValueSpec) +func wtVarDecl() { + var x = deadStore() // $ Alert + x = deadStore() + _ = x +} + +// compound assignment (compound-rhs) +func wtCompound(x int) int { + x += deadStore() // $ Alert + x = deadStore() + return x +} + +// increment (compound-rhs on an IncDecStmt) +func wtIncrement(x int) int { + x++ // $ Alert + x = deadStore() + return x +} + +// decrement (compound-rhs on an IncDecStmt) +func wtDecrement(x int) int { + x-- // $ Alert + x = deadStore() + return x +} + +// tuple destructuring in a short declaration (extract) +func wtExtractShortDecl() { + x, y := wtTwoInts() // $ Alert + x = deadStore() + _ = x + _ = y +} + +// tuple destructuring in an assignment (extract) +func wtExtractAssign() { + var x, y int + x, y = wtTwoInts() // $ Alert + x = deadStore() + _ = x + _ = y +} + +// map access with comma-ok (extract) +func wtExtractMapCommaOk() { + v, ok := wtMap()["k"] // $ Alert + v = deadStore() + _ = v + _ = ok +} + +// type assertion with comma-ok (extract) +func wtExtractTypeAssert() { + v, ok := wtIface().(int) // $ Alert + v = deadStore() + _ = v + _ = ok +} + +// range key/value (extract on a RangeElementExpr) +func wtExtractRange(xs []int) { + for i, v := range xs { // $ Alert + v = deadStore() + _ = i + _ = v + } +} + +// assignment to a named result (VarOrConstTarget), dead because it is +// overwritten by the value in the `return` statement +func wtNamedResult() (r int) { + r = deadStore() // $ Alert + return deadStore() +} + +// --- Write targets that do not define a local variable (never flagged here) --- + +// field write (FieldTarget) - covered by go/useless-assignment-to-field +func wtField(s *wtStruct) { + s.f = deadStore() + s.f = deadStore() + _ = s.f +} + +// element write (ElementTarget) +func wtElement(xs []int) { + xs[0] = deadStore() + xs[0] = deadStore() + _ = xs[0] +} + +// pointer dereference write (PointerTarget) +func wtPointer(p *int) { + *p = deadStore() + *p = deadStore() + _ = *p +} + +// composite literal element (MkLiteralElementTarget) +func wtLiteralElement() { + _ = []int{deadStore(), deadStore()} +} From 171046a03369394eee0a87777f8000ce7b675da6 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 13 Aug 2026 14:14:57 +0100 Subject: [PATCH 0978/2098] Make synthetic RangeElementExpr during extraction --- .../exprs.ql | 31 + .../go.dbscheme | 563 +++++++++++++++++ .../has_location.ql | 23 + .../old.dbscheme | 564 ++++++++++++++++++ .../upgrade.properties | 4 + go/extractor/dbscheme/tables.go | 6 + go/extractor/extractor.go | 14 +- go/ql/lib/go.dbscheme | 3 +- go/ql/lib/semmle/go/Stmt.qll | 35 +- .../go.dbscheme | 564 ++++++++++++++++++ .../old.dbscheme | 563 +++++++++++++++++ .../upgrade.properties | 2 + .../semmle/go/PrintAst/PrintAst.expected | 23 +- .../PrintAst/PrintAstExcludeComments.expected | 23 +- 14 files changed, 2393 insertions(+), 25 deletions(-) create mode 100644 go/downgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/exprs.ql create mode 100644 go/downgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/go.dbscheme create mode 100644 go/downgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/has_location.ql create mode 100644 go/downgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/old.dbscheme create mode 100644 go/downgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/upgrade.properties create mode 100644 go/ql/lib/upgrades/5ff5325d274ae4f86defa195577bc7c1370b72fa/go.dbscheme create mode 100644 go/ql/lib/upgrades/5ff5325d274ae4f86defa195577bc7c1370b72fa/old.dbscheme create mode 100644 go/ql/lib/upgrades/5ff5325d274ae4f86defa195577bc7c1370b72fa/upgrade.properties diff --git a/go/downgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/exprs.ql b/go/downgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/exprs.ql new file mode 100644 index 000000000000..80911bb7a6b8 --- /dev/null +++ b/go/downgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/exprs.ql @@ -0,0 +1,31 @@ +class Expr_ extends @expr { + string toString() { result = "Expr" } +} + +class ExprParent_ extends @exprparent { + string toString() { result = "ExprParent" } +} + +// The schema for exprs is: +// +// exprs(unique int id: @expr, +// int kind: int ref, +// int parent: @exprparent ref, +// int idx: int ref); +// +// `@rangeelementexpr` (kind 55) is a synthesized node that groups the loop +// variables (the key and value) of a `range` statement. To downgrade we remove +// those nodes and reparent their children (the key and value expressions) +// directly onto the `range` statement, at the same indices. +from Expr_ id, int kind, ExprParent_ newparent, int idx +where + exists(ExprParent_ parent | exprs(id, kind, parent, idx) and kind != 55 | + // A key or value grouped by a range element node: reparent it onto the + // range statement (the range element node's own parent). + exists(Expr_ pe | pe = parent and exprs(pe, 55, newparent, _)) + or + // Any other expression keeps its parent unchanged. + not exists(Expr_ pe | pe = parent and exprs(pe, 55, _, _)) and + newparent = parent + ) +select id, kind, newparent, idx diff --git a/go/downgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/go.dbscheme b/go/downgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/go.dbscheme new file mode 100644 index 000000000000..5ff5325d274a --- /dev/null +++ b/go/downgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/go.dbscheme @@ -0,0 +1,563 @@ +/** Auto-generated dbscheme; do not edit. Run `make gen` in directory `go/` to regenerate. */ + + +/** Duplicate code **/ + +duplicateCode( + unique int id : @duplication, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +similarCode( + unique int id : @similarity, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +@duplication_or_similarity = @duplication | @similarity; + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref); + +/** External data **/ + +externalData( + int id : @externalDataElement, + varchar(900) path : string ref, + int column: int ref, + varchar(900) value : string ref +); + +snapshotDate(unique date snapshotDate : date ref); + +sourceLocationPrefix(varchar(900) prefix : string ref); + +/** Overlay support **/ + +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +overlayChangedFiles( + string path: string ref +); + + +/* + * XML Files + */ + +xmlEncoding( + unique int id: @file ref, + string encoding: string ref +); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +compilations(unique int id: @compilation, string cwd: string ref); + +#keyset[id, num] +compilation_args(int id: @compilation ref, int num: int ref, string arg: string ref); + +#keyset[id, num, kind] +compilation_time(int id: @compilation ref, int num: int ref, int kind: int ref, float secs: float ref); + +diagnostic_for(unique int diagnostic: @diagnostic ref, int compilation: @compilation ref, int file_number: int ref, int file_number_diagnostic_number: int ref); + +compilation_finished(unique int id: @compilation ref, float cpu_seconds: float ref, float elapsed_seconds: float ref); + +#keyset[id, num] +compilation_compiling_files(int id: @compilation ref, int num: int ref, int file: @file ref); + +diagnostics(unique int id: @diagnostic, int severity: int ref, string error_tag: string ref, string error_message: string ref, + string full_error_message: string ref, int location: @location ref); + +locations_default(unique int id: @location_default, int file: @file ref, int beginLine: int ref, int beginColumn: int ref, + int endLine: int ref, int endColumn: int ref); + +numlines(int element_id: @sourceline ref, int num_lines: int ref, int num_code: int ref, int num_comment: int ref); + +files(unique int id: @file, string name: string ref); + +folders(unique int id: @folder, string name: string ref); + +containerparent(int parent: @container ref, unique int child: @container ref); + +has_location(unique int locatable: @locatable ref, int location: @location ref); + +#keyset[parent, idx] +comment_groups(unique int id: @comment_group, int parent: @file ref, int idx: int ref); + +comments(unique int id: @comment, int kind: int ref, int parent: @comment_group ref, int idx: int ref, string text: string ref); + +doc_comments(unique int node: @documentable ref, int comment: @comment_group ref); + +#keyset[parent, idx] +exprs(unique int id: @expr, int kind: int ref, int parent: @exprparent ref, int idx: int ref); + +literals(unique int expr: @expr ref, string value: string ref, string raw: string ref); + +constvalues(unique int expr: @expr ref, string value: string ref, string exact: string ref); + +fields(unique int id: @field, int parent: @fieldparent ref, int idx: int ref); + +typeparamdecls(unique int id: @typeparamdecl, int parent: @typeparamdeclparent ref, int idx: int ref); + +#keyset[parent, idx] +stmts(unique int id: @stmt, int kind: int ref, int parent: @stmtparent ref, int idx: int ref); + +#keyset[parent, idx] +decls(unique int id: @decl, int kind: int ref, int parent: @declparent ref, int idx: int ref); + +#keyset[parent, idx] +specs(unique int id: @spec, int kind: int ref, int parent: @gendecl ref, int idx: int ref); + +scopes(unique int id: @scope, int kind: int ref); + +scopenesting(unique int inner: @scope ref, int outer: @scope ref); + +scopenodes(unique int node: @scopenode ref, int scope: @localscope ref); + +objects(unique int id: @object, int kind: int ref, string name: string ref); + +objectscopes(unique int object: @object ref, int scope: @scope ref); + +objecttypes(unique int object: @object ref, int tp: @type ref); + +methodreceivers(unique int method: @object ref, int receiver: @object ref); + +fieldstructs(unique int field: @object ref, int struct: @structtype ref); + +methodhosts(int method: @object ref, int host: @definedtype ref); + +defs(int ident: @ident ref, int object: @object ref); + +uses(int ident: @ident ref, int object: @object ref); + +types(unique int id: @type, int kind: int ref); + +type_of(unique int expr: @expr ref, int tp: @type ref); + +typename(unique int tp: @type ref, string name: string ref); + +key_type(unique int map: @maptype ref, int tp: @type ref); + +element_type(unique int container: @containertype ref, int tp: @type ref); + +base_type(unique int ptr: @pointertype ref, int tp: @type ref); + +underlying_type(unique int defined: @definedtype ref, int tp: @type ref); + +#keyset[parent, index] +component_types(int parent: @compositetype ref, int index: int ref, string name: string ref, int tp: @type ref); + +#keyset[parent, index] +struct_tags(int parent: @structtype ref, int index: int ref, string tag: string ref); + +#keyset[interface, index] +interface_private_method_ids(int interface: @interfacetype ref, int index: int ref, string id: string ref); + +array_length(unique int tp: @arraytype ref, string len: string ref); + +type_objects(unique int tp: @type ref, int object: @object ref); + +packages(unique int id: @package, string name: string ref, string path: string ref, int scope: @packagescope ref); + +#keyset[parent, idx] +modexprs(unique int id: @modexpr, int kind: int ref, int parent: @modexprparent ref, int idx: int ref); + +#keyset[parent, idx] +modtokens(string token: string ref, int parent: @modexpr ref, int idx: int ref); + +#keyset[package, idx] +errors(unique int id: @error, int kind: int ref, string msg: string ref, string rawpos: string ref, + string file: string ref, int line: int ref, int col: int ref, int package: @package ref, int idx: int ref); + +has_ellipsis(int id: @callorconversionexpr ref); + +variadic(int id: @signaturetype ref); + +#keyset[parent, idx, is_from_recv] +typeparam(unique int tp: @typeparamtype ref, string name: string ref, + int bound: @compositetype ref, int parent: @typeparamparentobject ref, int idx: int ref, boolean is_from_recv: boolean ref); + +@container = @file | @folder; + +@locatable = @xmllocatable | @node | @localscope; + +@node = @documentable | @exprparent | @modexprparent | @fieldparent | @stmtparent | @declparent | @typeparamdeclparent + | @scopenode | @comment_group | @comment; + +@documentable = @file | @field | @typeparamdecl | @spec | @gendecl | @funcdecl | @modexpr; + +@exprparent = @funcdef | @file | @expr | @field | @stmt | @decl | @typeparamdecl | @spec; + +@modexprparent = @file | @modexpr; + +@fieldparent = @decl | @structtypeexpr | @functypeexpr | @interfacetypeexpr; + +@stmtparent = @funcdef | @stmt | @decl; + +@declparent = @file | @declstmt; + +@typeparamdeclparent = @funcdecl | @typespec; + +@funcdef = @funclit | @funcdecl; + +@scopenode = @file | @functypeexpr | @blockstmt | @ifstmt | @caseclause | @switchstmt | @commclause | @loopstmt; + +@location = @location_default; + +@sourceline = @locatable; + +case @comment.kind of + 0 = @slashslashcomment +| 1 = @slashstarcomment; + +case @expr.kind of + 0 = @badexpr +| 1 = @ident +| 2 = @ellipsis +| 3 = @intlit +| 4 = @floatlit +| 5 = @imaglit +| 6 = @charlit +| 7 = @stringlit +| 8 = @funclit +| 9 = @compositelit +| 10 = @parenexpr +| 11 = @selectorexpr +| 12 = @indexexpr +| 13 = @genericfunctioninstantiationexpr +| 14 = @generictypeinstantiationexpr +| 15 = @sliceexpr +| 16 = @typeassertexpr +| 17 = @callorconversionexpr +| 18 = @starexpr +| 19 = @keyvalueexpr +| 20 = @arraytypeexpr +| 21 = @structtypeexpr +| 22 = @functypeexpr +| 23 = @interfacetypeexpr +| 24 = @maptypeexpr +| 25 = @typesetliteralexpr +| 26 = @plusexpr +| 27 = @minusexpr +| 28 = @notexpr +| 29 = @complementexpr +| 30 = @derefexpr +| 31 = @addressexpr +| 32 = @arrowexpr +| 33 = @lorexpr +| 34 = @landexpr +| 35 = @eqlexpr +| 36 = @neqexpr +| 37 = @lssexpr +| 38 = @leqexpr +| 39 = @gtrexpr +| 40 = @geqexpr +| 41 = @addexpr +| 42 = @subexpr +| 43 = @orexpr +| 44 = @xorexpr +| 45 = @mulexpr +| 46 = @quoexpr +| 47 = @remexpr +| 48 = @shlexpr +| 49 = @shrexpr +| 50 = @andexpr +| 51 = @andnotexpr +| 52 = @sendchantypeexpr +| 53 = @recvchantypeexpr +| 54 = @sendrcvchantypeexpr; + +@basiclit = @intlit | @floatlit | @imaglit | @charlit | @stringlit; + +@operatorexpr = @logicalexpr | @arithmeticexpr | @bitwiseexpr | @unaryexpr | @binaryexpr; + +@logicalexpr = @logicalunaryexpr | @logicalbinaryexpr; + +@arithmeticexpr = @arithmeticunaryexpr | @arithmeticbinaryexpr; + +@bitwiseexpr = @bitwiseunaryexpr | @bitwisebinaryexpr; + +@unaryexpr = @logicalunaryexpr | @bitwiseunaryexpr | @arithmeticunaryexpr | @derefexpr | @addressexpr | @arrowexpr; + +@logicalunaryexpr = @notexpr; + +@bitwiseunaryexpr = @complementexpr; + +@arithmeticunaryexpr = @plusexpr | @minusexpr; + +@binaryexpr = @logicalbinaryexpr | @bitwisebinaryexpr | @arithmeticbinaryexpr | @comparison; + +@logicalbinaryexpr = @lorexpr | @landexpr; + +@bitwisebinaryexpr = @shiftexpr | @orexpr | @xorexpr | @andexpr | @andnotexpr; + +@arithmeticbinaryexpr = @addexpr | @subexpr | @mulexpr | @quoexpr | @remexpr; + +@shiftexpr = @shlexpr | @shrexpr; + +@comparison = @equalitytest | @relationalcomparison; + +@equalitytest = @eqlexpr | @neqexpr; + +@relationalcomparison = @lssexpr | @leqexpr | @gtrexpr | @geqexpr; + +@chantypeexpr = @sendchantypeexpr | @recvchantypeexpr | @sendrcvchantypeexpr; + +case @stmt.kind of + 0 = @badstmt +| 1 = @declstmt +| 2 = @emptystmt +| 3 = @labeledstmt +| 4 = @exprstmt +| 5 = @sendstmt +| 6 = @incstmt +| 7 = @decstmt +| 8 = @gostmt +| 9 = @deferstmt +| 10 = @returnstmt +| 11 = @breakstmt +| 12 = @continuestmt +| 13 = @gotostmt +| 14 = @fallthroughstmt +| 15 = @blockstmt +| 16 = @ifstmt +| 17 = @caseclause +| 18 = @exprswitchstmt +| 19 = @typeswitchstmt +| 20 = @commclause +| 21 = @selectstmt +| 22 = @forstmt +| 23 = @rangestmt +| 24 = @assignstmt +| 25 = @definestmt +| 26 = @addassignstmt +| 27 = @subassignstmt +| 28 = @mulassignstmt +| 29 = @quoassignstmt +| 30 = @remassignstmt +| 31 = @andassignstmt +| 32 = @orassignstmt +| 33 = @xorassignstmt +| 34 = @shlassignstmt +| 35 = @shrassignstmt +| 36 = @andnotassignstmt; + +@incdecstmt = @incstmt | @decstmt; + +@assignment = @simpleassignstmt | @compoundassignstmt; + +@simpleassignstmt = @assignstmt | @definestmt; + +@compoundassignstmt = @addassignstmt | @subassignstmt | @mulassignstmt | @quoassignstmt | @remassignstmt + | @andassignstmt | @orassignstmt | @xorassignstmt | @shlassignstmt | @shrassignstmt | @andnotassignstmt; + +@branchstmt = @breakstmt | @continuestmt | @gotostmt | @fallthroughstmt; + +@switchstmt = @exprswitchstmt | @typeswitchstmt; + +@loopstmt = @forstmt | @rangestmt; + +case @decl.kind of + 0 = @baddecl +| 1 = @importdecl +| 2 = @constdecl +| 3 = @typedecl +| 4 = @vardecl +| 5 = @funcdecl; + +@gendecl = @importdecl | @constdecl | @typedecl | @vardecl; + +case @spec.kind of + 0 = @importspec +| 1 = @valuespec +| 2 = @typedefspec +| 3 = @aliasspec; + +@typespec = @typedefspec | @aliasspec; + +case @object.kind of + 0 = @pkgobject +| 1 = @decltypeobject +| 2 = @builtintypeobject +| 3 = @declconstobject +| 4 = @builtinconstobject +| 5 = @declvarobject +| 6 = @declfunctionobject +| 7 = @builtinfunctionobject +| 8 = @labelobject; + +@typeparamparentobject = @decltypeobject | @declfunctionobject; + +@declobject = @decltypeobject | @declconstobject | @declvarobject | @declfunctionobject; + +@builtinobject = @builtintypeobject | @builtinconstobject | @builtinfunctionobject; + +@typeobject = @decltypeobject | @builtintypeobject; + +@valueobject = @constobject | @varobject | @functionobject; + +@constobject = @declconstobject | @builtinconstobject; + +@varobject = @declvarobject; + +@functionobject = @declfunctionobject | @builtinfunctionobject; + +case @scope.kind of + 0 = @universescope +| 1 = @packagescope +| 2 = @localscope; + +case @type.kind of + 0 = @invalidtype +| 1 = @boolexprtype +| 2 = @inttype +| 3 = @int8type +| 4 = @int16type +| 5 = @int32type +| 6 = @int64type +| 7 = @uinttype +| 8 = @uint8type +| 9 = @uint16type +| 10 = @uint32type +| 11 = @uint64type +| 12 = @uintptrtype +| 13 = @float32type +| 14 = @float64type +| 15 = @complex64type +| 16 = @complex128type +| 17 = @stringexprtype +| 18 = @unsafepointertype +| 19 = @boolliteraltype +| 20 = @intliteraltype +| 21 = @runeliteraltype +| 22 = @floatliteraltype +| 23 = @complexliteraltype +| 24 = @stringliteraltype +| 25 = @nilliteraltype +| 26 = @typeparamtype +| 27 = @arraytype +| 28 = @slicetype +| 29 = @structtype +| 30 = @pointertype +| 31 = @interfacetype +| 32 = @tupletype +| 33 = @signaturetype +| 34 = @maptype +| 35 = @sendchantype +| 36 = @recvchantype +| 37 = @sendrcvchantype +| 38 = @definedtype +| 39 = @typesetliteraltype; + +@basictype = @booltype | @numerictype | @stringtype | @literaltype | @invalidtype | @unsafepointertype; + +@booltype = @boolexprtype | @boolliteraltype; + +@numerictype = @integertype | @floattype | @complextype; + +@integertype = @signedintegertype | @unsignedintegertype; + +@signedintegertype = @inttype | @int8type | @int16type | @int32type | @int64type | @intliteraltype | @runeliteraltype; + +@unsignedintegertype = @uinttype | @uint8type | @uint16type | @uint32type | @uint64type | @uintptrtype; + +@floattype = @float32type | @float64type | @floatliteraltype; + +@complextype = @complex64type | @complex128type | @complexliteraltype; + +@stringtype = @stringexprtype | @stringliteraltype; + +@literaltype = @boolliteraltype | @intliteraltype | @runeliteraltype | @floatliteraltype | @complexliteraltype + | @stringliteraltype | @nilliteraltype; + +@compositetype = @typeparamtype | @containertype | @structtype | @pointertype | @interfacetype | @tupletype + | @signaturetype | @definedtype | @typesetliteraltype; + +@containertype = @arraytype | @slicetype | @maptype | @chantype; + +@chantype = @sendchantype | @recvchantype | @sendrcvchantype; + +case @modexpr.kind of + 0 = @modcommentblock +| 1 = @modline +| 2 = @modlineblock +| 3 = @modlparen +| 4 = @modrparen; + +case @error.kind of + 0 = @unknownerror +| 1 = @listerror +| 2 = @parseerror +| 3 = @typeerror; + diff --git a/go/downgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/has_location.ql b/go/downgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/has_location.ql new file mode 100644 index 000000000000..34dda880ebd1 --- /dev/null +++ b/go/downgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/has_location.ql @@ -0,0 +1,23 @@ +class Locatable_ extends @locatable { + string toString() { result = "Locatable" } +} + +class Location_ extends @location { + string toString() { result = "Location" } +} + +class Expr_ extends @expr { + string toString() { result = "Expr" } +} + +// The schema for has_location is: +// +// has_location(unique int locatable: @locatable ref, int location: @location ref); +// +// The synthesized `@rangeelementexpr` nodes (kind 55) are removed by the +// accompanying `exprs` downgrade, so their locations must be removed too. +from Locatable_ locatable, Location_ location +where + has_location(locatable, location) and + not exists(Expr_ e | e = locatable and exprs(e, 55, _, _)) +select locatable, location diff --git a/go/downgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/old.dbscheme b/go/downgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/old.dbscheme new file mode 100644 index 000000000000..d0e7336b491e --- /dev/null +++ b/go/downgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/old.dbscheme @@ -0,0 +1,564 @@ +/** Auto-generated dbscheme; do not edit. Run `make gen` in directory `go/` to regenerate. */ + + +/** Duplicate code **/ + +duplicateCode( + unique int id : @duplication, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +similarCode( + unique int id : @similarity, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +@duplication_or_similarity = @duplication | @similarity; + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref); + +/** External data **/ + +externalData( + int id : @externalDataElement, + varchar(900) path : string ref, + int column: int ref, + varchar(900) value : string ref +); + +snapshotDate(unique date snapshotDate : date ref); + +sourceLocationPrefix(varchar(900) prefix : string ref); + +/** Overlay support **/ + +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +overlayChangedFiles( + string path: string ref +); + + +/* + * XML Files + */ + +xmlEncoding( + unique int id: @file ref, + string encoding: string ref +); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +compilations(unique int id: @compilation, string cwd: string ref); + +#keyset[id, num] +compilation_args(int id: @compilation ref, int num: int ref, string arg: string ref); + +#keyset[id, num, kind] +compilation_time(int id: @compilation ref, int num: int ref, int kind: int ref, float secs: float ref); + +diagnostic_for(unique int diagnostic: @diagnostic ref, int compilation: @compilation ref, int file_number: int ref, int file_number_diagnostic_number: int ref); + +compilation_finished(unique int id: @compilation ref, float cpu_seconds: float ref, float elapsed_seconds: float ref); + +#keyset[id, num] +compilation_compiling_files(int id: @compilation ref, int num: int ref, int file: @file ref); + +diagnostics(unique int id: @diagnostic, int severity: int ref, string error_tag: string ref, string error_message: string ref, + string full_error_message: string ref, int location: @location ref); + +locations_default(unique int id: @location_default, int file: @file ref, int beginLine: int ref, int beginColumn: int ref, + int endLine: int ref, int endColumn: int ref); + +numlines(int element_id: @sourceline ref, int num_lines: int ref, int num_code: int ref, int num_comment: int ref); + +files(unique int id: @file, string name: string ref); + +folders(unique int id: @folder, string name: string ref); + +containerparent(int parent: @container ref, unique int child: @container ref); + +has_location(unique int locatable: @locatable ref, int location: @location ref); + +#keyset[parent, idx] +comment_groups(unique int id: @comment_group, int parent: @file ref, int idx: int ref); + +comments(unique int id: @comment, int kind: int ref, int parent: @comment_group ref, int idx: int ref, string text: string ref); + +doc_comments(unique int node: @documentable ref, int comment: @comment_group ref); + +#keyset[parent, idx] +exprs(unique int id: @expr, int kind: int ref, int parent: @exprparent ref, int idx: int ref); + +literals(unique int expr: @expr ref, string value: string ref, string raw: string ref); + +constvalues(unique int expr: @expr ref, string value: string ref, string exact: string ref); + +fields(unique int id: @field, int parent: @fieldparent ref, int idx: int ref); + +typeparamdecls(unique int id: @typeparamdecl, int parent: @typeparamdeclparent ref, int idx: int ref); + +#keyset[parent, idx] +stmts(unique int id: @stmt, int kind: int ref, int parent: @stmtparent ref, int idx: int ref); + +#keyset[parent, idx] +decls(unique int id: @decl, int kind: int ref, int parent: @declparent ref, int idx: int ref); + +#keyset[parent, idx] +specs(unique int id: @spec, int kind: int ref, int parent: @gendecl ref, int idx: int ref); + +scopes(unique int id: @scope, int kind: int ref); + +scopenesting(unique int inner: @scope ref, int outer: @scope ref); + +scopenodes(unique int node: @scopenode ref, int scope: @localscope ref); + +objects(unique int id: @object, int kind: int ref, string name: string ref); + +objectscopes(unique int object: @object ref, int scope: @scope ref); + +objecttypes(unique int object: @object ref, int tp: @type ref); + +methodreceivers(unique int method: @object ref, int receiver: @object ref); + +fieldstructs(unique int field: @object ref, int struct: @structtype ref); + +methodhosts(int method: @object ref, int host: @definedtype ref); + +defs(int ident: @ident ref, int object: @object ref); + +uses(int ident: @ident ref, int object: @object ref); + +types(unique int id: @type, int kind: int ref); + +type_of(unique int expr: @expr ref, int tp: @type ref); + +typename(unique int tp: @type ref, string name: string ref); + +key_type(unique int map: @maptype ref, int tp: @type ref); + +element_type(unique int container: @containertype ref, int tp: @type ref); + +base_type(unique int ptr: @pointertype ref, int tp: @type ref); + +underlying_type(unique int defined: @definedtype ref, int tp: @type ref); + +#keyset[parent, index] +component_types(int parent: @compositetype ref, int index: int ref, string name: string ref, int tp: @type ref); + +#keyset[parent, index] +struct_tags(int parent: @structtype ref, int index: int ref, string tag: string ref); + +#keyset[interface, index] +interface_private_method_ids(int interface: @interfacetype ref, int index: int ref, string id: string ref); + +array_length(unique int tp: @arraytype ref, string len: string ref); + +type_objects(unique int tp: @type ref, int object: @object ref); + +packages(unique int id: @package, string name: string ref, string path: string ref, int scope: @packagescope ref); + +#keyset[parent, idx] +modexprs(unique int id: @modexpr, int kind: int ref, int parent: @modexprparent ref, int idx: int ref); + +#keyset[parent, idx] +modtokens(string token: string ref, int parent: @modexpr ref, int idx: int ref); + +#keyset[package, idx] +errors(unique int id: @error, int kind: int ref, string msg: string ref, string rawpos: string ref, + string file: string ref, int line: int ref, int col: int ref, int package: @package ref, int idx: int ref); + +has_ellipsis(int id: @callorconversionexpr ref); + +variadic(int id: @signaturetype ref); + +#keyset[parent, idx, is_from_recv] +typeparam(unique int tp: @typeparamtype ref, string name: string ref, + int bound: @compositetype ref, int parent: @typeparamparentobject ref, int idx: int ref, boolean is_from_recv: boolean ref); + +@container = @file | @folder; + +@locatable = @xmllocatable | @node | @localscope; + +@node = @documentable | @exprparent | @modexprparent | @fieldparent | @stmtparent | @declparent | @typeparamdeclparent + | @scopenode | @comment_group | @comment; + +@documentable = @file | @field | @typeparamdecl | @spec | @gendecl | @funcdecl | @modexpr; + +@exprparent = @funcdef | @file | @expr | @field | @stmt | @decl | @typeparamdecl | @spec; + +@modexprparent = @file | @modexpr; + +@fieldparent = @decl | @structtypeexpr | @functypeexpr | @interfacetypeexpr; + +@stmtparent = @funcdef | @stmt | @decl; + +@declparent = @file | @declstmt; + +@typeparamdeclparent = @funcdecl | @typespec; + +@funcdef = @funclit | @funcdecl; + +@scopenode = @file | @functypeexpr | @blockstmt | @ifstmt | @caseclause | @switchstmt | @commclause | @loopstmt; + +@location = @location_default; + +@sourceline = @locatable; + +case @comment.kind of + 0 = @slashslashcomment +| 1 = @slashstarcomment; + +case @expr.kind of + 0 = @badexpr +| 1 = @ident +| 2 = @ellipsis +| 3 = @intlit +| 4 = @floatlit +| 5 = @imaglit +| 6 = @charlit +| 7 = @stringlit +| 8 = @funclit +| 9 = @compositelit +| 10 = @parenexpr +| 11 = @selectorexpr +| 12 = @indexexpr +| 13 = @genericfunctioninstantiationexpr +| 14 = @generictypeinstantiationexpr +| 15 = @sliceexpr +| 16 = @typeassertexpr +| 17 = @callorconversionexpr +| 18 = @starexpr +| 19 = @keyvalueexpr +| 20 = @arraytypeexpr +| 21 = @structtypeexpr +| 22 = @functypeexpr +| 23 = @interfacetypeexpr +| 24 = @maptypeexpr +| 25 = @typesetliteralexpr +| 26 = @plusexpr +| 27 = @minusexpr +| 28 = @notexpr +| 29 = @complementexpr +| 30 = @derefexpr +| 31 = @addressexpr +| 32 = @arrowexpr +| 33 = @lorexpr +| 34 = @landexpr +| 35 = @eqlexpr +| 36 = @neqexpr +| 37 = @lssexpr +| 38 = @leqexpr +| 39 = @gtrexpr +| 40 = @geqexpr +| 41 = @addexpr +| 42 = @subexpr +| 43 = @orexpr +| 44 = @xorexpr +| 45 = @mulexpr +| 46 = @quoexpr +| 47 = @remexpr +| 48 = @shlexpr +| 49 = @shrexpr +| 50 = @andexpr +| 51 = @andnotexpr +| 52 = @sendchantypeexpr +| 53 = @recvchantypeexpr +| 54 = @sendrcvchantypeexpr +| 55 = @rangeelementexpr; + +@basiclit = @intlit | @floatlit | @imaglit | @charlit | @stringlit; + +@operatorexpr = @logicalexpr | @arithmeticexpr | @bitwiseexpr | @unaryexpr | @binaryexpr; + +@logicalexpr = @logicalunaryexpr | @logicalbinaryexpr; + +@arithmeticexpr = @arithmeticunaryexpr | @arithmeticbinaryexpr; + +@bitwiseexpr = @bitwiseunaryexpr | @bitwisebinaryexpr; + +@unaryexpr = @logicalunaryexpr | @bitwiseunaryexpr | @arithmeticunaryexpr | @derefexpr | @addressexpr | @arrowexpr; + +@logicalunaryexpr = @notexpr; + +@bitwiseunaryexpr = @complementexpr; + +@arithmeticunaryexpr = @plusexpr | @minusexpr; + +@binaryexpr = @logicalbinaryexpr | @bitwisebinaryexpr | @arithmeticbinaryexpr | @comparison; + +@logicalbinaryexpr = @lorexpr | @landexpr; + +@bitwisebinaryexpr = @shiftexpr | @orexpr | @xorexpr | @andexpr | @andnotexpr; + +@arithmeticbinaryexpr = @addexpr | @subexpr | @mulexpr | @quoexpr | @remexpr; + +@shiftexpr = @shlexpr | @shrexpr; + +@comparison = @equalitytest | @relationalcomparison; + +@equalitytest = @eqlexpr | @neqexpr; + +@relationalcomparison = @lssexpr | @leqexpr | @gtrexpr | @geqexpr; + +@chantypeexpr = @sendchantypeexpr | @recvchantypeexpr | @sendrcvchantypeexpr; + +case @stmt.kind of + 0 = @badstmt +| 1 = @declstmt +| 2 = @emptystmt +| 3 = @labeledstmt +| 4 = @exprstmt +| 5 = @sendstmt +| 6 = @incstmt +| 7 = @decstmt +| 8 = @gostmt +| 9 = @deferstmt +| 10 = @returnstmt +| 11 = @breakstmt +| 12 = @continuestmt +| 13 = @gotostmt +| 14 = @fallthroughstmt +| 15 = @blockstmt +| 16 = @ifstmt +| 17 = @caseclause +| 18 = @exprswitchstmt +| 19 = @typeswitchstmt +| 20 = @commclause +| 21 = @selectstmt +| 22 = @forstmt +| 23 = @rangestmt +| 24 = @assignstmt +| 25 = @definestmt +| 26 = @addassignstmt +| 27 = @subassignstmt +| 28 = @mulassignstmt +| 29 = @quoassignstmt +| 30 = @remassignstmt +| 31 = @andassignstmt +| 32 = @orassignstmt +| 33 = @xorassignstmt +| 34 = @shlassignstmt +| 35 = @shrassignstmt +| 36 = @andnotassignstmt; + +@incdecstmt = @incstmt | @decstmt; + +@assignment = @simpleassignstmt | @compoundassignstmt; + +@simpleassignstmt = @assignstmt | @definestmt; + +@compoundassignstmt = @addassignstmt | @subassignstmt | @mulassignstmt | @quoassignstmt | @remassignstmt + | @andassignstmt | @orassignstmt | @xorassignstmt | @shlassignstmt | @shrassignstmt | @andnotassignstmt; + +@branchstmt = @breakstmt | @continuestmt | @gotostmt | @fallthroughstmt; + +@switchstmt = @exprswitchstmt | @typeswitchstmt; + +@loopstmt = @forstmt | @rangestmt; + +case @decl.kind of + 0 = @baddecl +| 1 = @importdecl +| 2 = @constdecl +| 3 = @typedecl +| 4 = @vardecl +| 5 = @funcdecl; + +@gendecl = @importdecl | @constdecl | @typedecl | @vardecl; + +case @spec.kind of + 0 = @importspec +| 1 = @valuespec +| 2 = @typedefspec +| 3 = @aliasspec; + +@typespec = @typedefspec | @aliasspec; + +case @object.kind of + 0 = @pkgobject +| 1 = @decltypeobject +| 2 = @builtintypeobject +| 3 = @declconstobject +| 4 = @builtinconstobject +| 5 = @declvarobject +| 6 = @declfunctionobject +| 7 = @builtinfunctionobject +| 8 = @labelobject; + +@typeparamparentobject = @decltypeobject | @declfunctionobject; + +@declobject = @decltypeobject | @declconstobject | @declvarobject | @declfunctionobject; + +@builtinobject = @builtintypeobject | @builtinconstobject | @builtinfunctionobject; + +@typeobject = @decltypeobject | @builtintypeobject; + +@valueobject = @constobject | @varobject | @functionobject; + +@constobject = @declconstobject | @builtinconstobject; + +@varobject = @declvarobject; + +@functionobject = @declfunctionobject | @builtinfunctionobject; + +case @scope.kind of + 0 = @universescope +| 1 = @packagescope +| 2 = @localscope; + +case @type.kind of + 0 = @invalidtype +| 1 = @boolexprtype +| 2 = @inttype +| 3 = @int8type +| 4 = @int16type +| 5 = @int32type +| 6 = @int64type +| 7 = @uinttype +| 8 = @uint8type +| 9 = @uint16type +| 10 = @uint32type +| 11 = @uint64type +| 12 = @uintptrtype +| 13 = @float32type +| 14 = @float64type +| 15 = @complex64type +| 16 = @complex128type +| 17 = @stringexprtype +| 18 = @unsafepointertype +| 19 = @boolliteraltype +| 20 = @intliteraltype +| 21 = @runeliteraltype +| 22 = @floatliteraltype +| 23 = @complexliteraltype +| 24 = @stringliteraltype +| 25 = @nilliteraltype +| 26 = @typeparamtype +| 27 = @arraytype +| 28 = @slicetype +| 29 = @structtype +| 30 = @pointertype +| 31 = @interfacetype +| 32 = @tupletype +| 33 = @signaturetype +| 34 = @maptype +| 35 = @sendchantype +| 36 = @recvchantype +| 37 = @sendrcvchantype +| 38 = @definedtype +| 39 = @typesetliteraltype; + +@basictype = @booltype | @numerictype | @stringtype | @literaltype | @invalidtype | @unsafepointertype; + +@booltype = @boolexprtype | @boolliteraltype; + +@numerictype = @integertype | @floattype | @complextype; + +@integertype = @signedintegertype | @unsignedintegertype; + +@signedintegertype = @inttype | @int8type | @int16type | @int32type | @int64type | @intliteraltype | @runeliteraltype; + +@unsignedintegertype = @uinttype | @uint8type | @uint16type | @uint32type | @uint64type | @uintptrtype; + +@floattype = @float32type | @float64type | @floatliteraltype; + +@complextype = @complex64type | @complex128type | @complexliteraltype; + +@stringtype = @stringexprtype | @stringliteraltype; + +@literaltype = @boolliteraltype | @intliteraltype | @runeliteraltype | @floatliteraltype | @complexliteraltype + | @stringliteraltype | @nilliteraltype; + +@compositetype = @typeparamtype | @containertype | @structtype | @pointertype | @interfacetype | @tupletype + | @signaturetype | @definedtype | @typesetliteraltype; + +@containertype = @arraytype | @slicetype | @maptype | @chantype; + +@chantype = @sendchantype | @recvchantype | @sendrcvchantype; + +case @modexpr.kind of + 0 = @modcommentblock +| 1 = @modline +| 2 = @modlineblock +| 3 = @modlparen +| 4 = @modrparen; + +case @error.kind of + 0 = @unknownerror +| 1 = @listerror +| 2 = @parseerror +| 3 = @typeerror; + diff --git a/go/downgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/upgrade.properties b/go/downgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/upgrade.properties new file mode 100644 index 000000000000..abaabbd305de --- /dev/null +++ b/go/downgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/upgrade.properties @@ -0,0 +1,4 @@ +description: Remove @rangeelementexpr, reparenting range loop variables onto the range statement +compatibility: full +exprs.rel: run exprs.qlo +has_location.rel: run has_location.qlo diff --git a/go/extractor/dbscheme/tables.go b/go/extractor/dbscheme/tables.go index b72c33795182..04dbdf40ba65 100644 --- a/go/extractor/dbscheme/tables.go +++ b/go/extractor/dbscheme/tables.go @@ -532,6 +532,12 @@ var ChanTypeExprs = map[ast.ChanDir]*BranchType{ ast.SEND | ast.RECV: ExprKind.NewBranch("@sendrcvchantypeexpr", ChanTypeExpr), } +// RangeElementExpr is the type of the synthesized node representing the loop +// variables (key and value) bound by a `range` statement. It groups the key and +// value expressions into a single "tuple pattern" target, mirroring how other +// languages present a single variable node for a `foreach` loop. +var RangeElementExpr = ExprKind.NewBranch("@rangeelementexpr") + // StmtKind is a case type for distinguishing different kinds of statement AST nodes var StmtKind = NewCaseType(StmtType, "kind") diff --git a/go/extractor/extractor.go b/go/extractor/extractor.go index fe798bc9f406..2aec8cc37e4b 100644 --- a/go/extractor/extractor.go +++ b/go/extractor/extractor.go @@ -1428,8 +1428,18 @@ func extractStmt(tw *trap.Writer, stmt ast.Stmt, parent trap.Label, idx int) { emitScopeNodeInfo(tw, stmt, lbl) case *ast.RangeStmt: kind = dbscheme.RangeStmtType.Index() - extractExpr(tw, stmt.Key, lbl, 0, false) - extractExpr(tw, stmt.Value, lbl, 1, false) + // Synthesize a "range element" node that groups the loop variables (the + // key and value) into a single target. This mirrors how other languages + // present a single loop-variable node for a `foreach` loop and lets the + // shared control-flow library drive the destructuring through this node. + patternLbl := tw.Labeler.FreshID() + dbscheme.ExprsTable.Emit(tw, patternLbl, dbscheme.RangeElementExpr.Index(), lbl, 0) + // The range element node uses the location of the whole range statement, + // so that the destructuring control-flow and data-flow nodes derived from + // it keep the same location they had before this node was introduced. + extractNodeLocation(tw, stmt, patternLbl) + extractExpr(tw, stmt.Key, patternLbl, 0, false) + extractExpr(tw, stmt.Value, patternLbl, 1, false) extractExpr(tw, stmt.X, lbl, 2, false) extractStmt(tw, stmt.Body, lbl, 3) emitScopeNodeInfo(tw, stmt, lbl) diff --git a/go/ql/lib/go.dbscheme b/go/ql/lib/go.dbscheme index 5ff5325d274a..d0e7336b491e 100644 --- a/go/ql/lib/go.dbscheme +++ b/go/ql/lib/go.dbscheme @@ -336,7 +336,8 @@ case @expr.kind of | 51 = @andnotexpr | 52 = @sendchantypeexpr | 53 = @recvchantypeexpr -| 54 = @sendrcvchantypeexpr; +| 54 = @sendrcvchantypeexpr +| 55 = @rangeelementexpr; @basiclit = @intlit | @floatlit | @imaglit | @charlit | @stringlit; diff --git a/go/ql/lib/semmle/go/Stmt.qll b/go/ql/lib/semmle/go/Stmt.qll index aa6fe7c24de9..82152db980db 100644 --- a/go/ql/lib/semmle/go/Stmt.qll +++ b/go/ql/lib/semmle/go/Stmt.qll @@ -1148,11 +1148,14 @@ class ForStmt extends @forstmt, LoopStmt { * ``` */ class RangeStmt extends @rangestmt, LoopStmt { + /** Gets the synthesized node grouping the loop variables of this `range` statement. */ + RangeElementExpr getPattern() { result = this.getChildExpr(0) } + /** Gets the expression denoting the key of this `range` statement. */ - Expr getKey() { result = this.getChildExpr(0) } + Expr getKey() { result = this.getPattern().getKey() } /** Get the expression denoting the value of this `range` statement. */ - Expr getValue() { result = this.getChildExpr(1) } + Expr getValue() { result = this.getPattern().getValue() } /** Gets the domain of this `range` statement. */ Expr getDomain() { result = this.getChildExpr(2) } @@ -1165,3 +1168,31 @@ class RangeStmt extends @rangestmt, LoopStmt { override string getAPrimaryQlClass() { result = "RangeStmt" } } + +/** + * A synthesized node grouping the loop variables (key and value) bound by a + * `range` statement. + * + * This node acts as the single target of the destructuring performed on each + * iteration of the loop, so that a `range` statement can be modelled with a + * single loop-variable node in the same way as a `foreach` loop in other + * languages. It is present for every `range` statement, even when no loop + * variables are bound (as in `for range x`). + */ +class RangeElementExpr extends @rangeelementexpr, Expr { + /** Gets the `range` statement that this node belongs to. */ + RangeStmt getRangeStmt() { result = this.getParent() } + + /** Gets the expression denoting the key of the `range` statement. */ + Expr getKey() { result = this.getChildExpr(0) } + + /** Gets the expression denoting the value of the `range` statement. */ + Expr getValue() { result = this.getChildExpr(1) } + + /** Gets the domain of the `range` statement. */ + Expr getDomain() { result = this.getRangeStmt().getDomain() } + + override string toString() { result = "range element" } + + override string getAPrimaryQlClass() { result = "RangeElementExpr" } +} diff --git a/go/ql/lib/upgrades/5ff5325d274ae4f86defa195577bc7c1370b72fa/go.dbscheme b/go/ql/lib/upgrades/5ff5325d274ae4f86defa195577bc7c1370b72fa/go.dbscheme new file mode 100644 index 000000000000..d0e7336b491e --- /dev/null +++ b/go/ql/lib/upgrades/5ff5325d274ae4f86defa195577bc7c1370b72fa/go.dbscheme @@ -0,0 +1,564 @@ +/** Auto-generated dbscheme; do not edit. Run `make gen` in directory `go/` to regenerate. */ + + +/** Duplicate code **/ + +duplicateCode( + unique int id : @duplication, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +similarCode( + unique int id : @similarity, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +@duplication_or_similarity = @duplication | @similarity; + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref); + +/** External data **/ + +externalData( + int id : @externalDataElement, + varchar(900) path : string ref, + int column: int ref, + varchar(900) value : string ref +); + +snapshotDate(unique date snapshotDate : date ref); + +sourceLocationPrefix(varchar(900) prefix : string ref); + +/** Overlay support **/ + +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +overlayChangedFiles( + string path: string ref +); + + +/* + * XML Files + */ + +xmlEncoding( + unique int id: @file ref, + string encoding: string ref +); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +compilations(unique int id: @compilation, string cwd: string ref); + +#keyset[id, num] +compilation_args(int id: @compilation ref, int num: int ref, string arg: string ref); + +#keyset[id, num, kind] +compilation_time(int id: @compilation ref, int num: int ref, int kind: int ref, float secs: float ref); + +diagnostic_for(unique int diagnostic: @diagnostic ref, int compilation: @compilation ref, int file_number: int ref, int file_number_diagnostic_number: int ref); + +compilation_finished(unique int id: @compilation ref, float cpu_seconds: float ref, float elapsed_seconds: float ref); + +#keyset[id, num] +compilation_compiling_files(int id: @compilation ref, int num: int ref, int file: @file ref); + +diagnostics(unique int id: @diagnostic, int severity: int ref, string error_tag: string ref, string error_message: string ref, + string full_error_message: string ref, int location: @location ref); + +locations_default(unique int id: @location_default, int file: @file ref, int beginLine: int ref, int beginColumn: int ref, + int endLine: int ref, int endColumn: int ref); + +numlines(int element_id: @sourceline ref, int num_lines: int ref, int num_code: int ref, int num_comment: int ref); + +files(unique int id: @file, string name: string ref); + +folders(unique int id: @folder, string name: string ref); + +containerparent(int parent: @container ref, unique int child: @container ref); + +has_location(unique int locatable: @locatable ref, int location: @location ref); + +#keyset[parent, idx] +comment_groups(unique int id: @comment_group, int parent: @file ref, int idx: int ref); + +comments(unique int id: @comment, int kind: int ref, int parent: @comment_group ref, int idx: int ref, string text: string ref); + +doc_comments(unique int node: @documentable ref, int comment: @comment_group ref); + +#keyset[parent, idx] +exprs(unique int id: @expr, int kind: int ref, int parent: @exprparent ref, int idx: int ref); + +literals(unique int expr: @expr ref, string value: string ref, string raw: string ref); + +constvalues(unique int expr: @expr ref, string value: string ref, string exact: string ref); + +fields(unique int id: @field, int parent: @fieldparent ref, int idx: int ref); + +typeparamdecls(unique int id: @typeparamdecl, int parent: @typeparamdeclparent ref, int idx: int ref); + +#keyset[parent, idx] +stmts(unique int id: @stmt, int kind: int ref, int parent: @stmtparent ref, int idx: int ref); + +#keyset[parent, idx] +decls(unique int id: @decl, int kind: int ref, int parent: @declparent ref, int idx: int ref); + +#keyset[parent, idx] +specs(unique int id: @spec, int kind: int ref, int parent: @gendecl ref, int idx: int ref); + +scopes(unique int id: @scope, int kind: int ref); + +scopenesting(unique int inner: @scope ref, int outer: @scope ref); + +scopenodes(unique int node: @scopenode ref, int scope: @localscope ref); + +objects(unique int id: @object, int kind: int ref, string name: string ref); + +objectscopes(unique int object: @object ref, int scope: @scope ref); + +objecttypes(unique int object: @object ref, int tp: @type ref); + +methodreceivers(unique int method: @object ref, int receiver: @object ref); + +fieldstructs(unique int field: @object ref, int struct: @structtype ref); + +methodhosts(int method: @object ref, int host: @definedtype ref); + +defs(int ident: @ident ref, int object: @object ref); + +uses(int ident: @ident ref, int object: @object ref); + +types(unique int id: @type, int kind: int ref); + +type_of(unique int expr: @expr ref, int tp: @type ref); + +typename(unique int tp: @type ref, string name: string ref); + +key_type(unique int map: @maptype ref, int tp: @type ref); + +element_type(unique int container: @containertype ref, int tp: @type ref); + +base_type(unique int ptr: @pointertype ref, int tp: @type ref); + +underlying_type(unique int defined: @definedtype ref, int tp: @type ref); + +#keyset[parent, index] +component_types(int parent: @compositetype ref, int index: int ref, string name: string ref, int tp: @type ref); + +#keyset[parent, index] +struct_tags(int parent: @structtype ref, int index: int ref, string tag: string ref); + +#keyset[interface, index] +interface_private_method_ids(int interface: @interfacetype ref, int index: int ref, string id: string ref); + +array_length(unique int tp: @arraytype ref, string len: string ref); + +type_objects(unique int tp: @type ref, int object: @object ref); + +packages(unique int id: @package, string name: string ref, string path: string ref, int scope: @packagescope ref); + +#keyset[parent, idx] +modexprs(unique int id: @modexpr, int kind: int ref, int parent: @modexprparent ref, int idx: int ref); + +#keyset[parent, idx] +modtokens(string token: string ref, int parent: @modexpr ref, int idx: int ref); + +#keyset[package, idx] +errors(unique int id: @error, int kind: int ref, string msg: string ref, string rawpos: string ref, + string file: string ref, int line: int ref, int col: int ref, int package: @package ref, int idx: int ref); + +has_ellipsis(int id: @callorconversionexpr ref); + +variadic(int id: @signaturetype ref); + +#keyset[parent, idx, is_from_recv] +typeparam(unique int tp: @typeparamtype ref, string name: string ref, + int bound: @compositetype ref, int parent: @typeparamparentobject ref, int idx: int ref, boolean is_from_recv: boolean ref); + +@container = @file | @folder; + +@locatable = @xmllocatable | @node | @localscope; + +@node = @documentable | @exprparent | @modexprparent | @fieldparent | @stmtparent | @declparent | @typeparamdeclparent + | @scopenode | @comment_group | @comment; + +@documentable = @file | @field | @typeparamdecl | @spec | @gendecl | @funcdecl | @modexpr; + +@exprparent = @funcdef | @file | @expr | @field | @stmt | @decl | @typeparamdecl | @spec; + +@modexprparent = @file | @modexpr; + +@fieldparent = @decl | @structtypeexpr | @functypeexpr | @interfacetypeexpr; + +@stmtparent = @funcdef | @stmt | @decl; + +@declparent = @file | @declstmt; + +@typeparamdeclparent = @funcdecl | @typespec; + +@funcdef = @funclit | @funcdecl; + +@scopenode = @file | @functypeexpr | @blockstmt | @ifstmt | @caseclause | @switchstmt | @commclause | @loopstmt; + +@location = @location_default; + +@sourceline = @locatable; + +case @comment.kind of + 0 = @slashslashcomment +| 1 = @slashstarcomment; + +case @expr.kind of + 0 = @badexpr +| 1 = @ident +| 2 = @ellipsis +| 3 = @intlit +| 4 = @floatlit +| 5 = @imaglit +| 6 = @charlit +| 7 = @stringlit +| 8 = @funclit +| 9 = @compositelit +| 10 = @parenexpr +| 11 = @selectorexpr +| 12 = @indexexpr +| 13 = @genericfunctioninstantiationexpr +| 14 = @generictypeinstantiationexpr +| 15 = @sliceexpr +| 16 = @typeassertexpr +| 17 = @callorconversionexpr +| 18 = @starexpr +| 19 = @keyvalueexpr +| 20 = @arraytypeexpr +| 21 = @structtypeexpr +| 22 = @functypeexpr +| 23 = @interfacetypeexpr +| 24 = @maptypeexpr +| 25 = @typesetliteralexpr +| 26 = @plusexpr +| 27 = @minusexpr +| 28 = @notexpr +| 29 = @complementexpr +| 30 = @derefexpr +| 31 = @addressexpr +| 32 = @arrowexpr +| 33 = @lorexpr +| 34 = @landexpr +| 35 = @eqlexpr +| 36 = @neqexpr +| 37 = @lssexpr +| 38 = @leqexpr +| 39 = @gtrexpr +| 40 = @geqexpr +| 41 = @addexpr +| 42 = @subexpr +| 43 = @orexpr +| 44 = @xorexpr +| 45 = @mulexpr +| 46 = @quoexpr +| 47 = @remexpr +| 48 = @shlexpr +| 49 = @shrexpr +| 50 = @andexpr +| 51 = @andnotexpr +| 52 = @sendchantypeexpr +| 53 = @recvchantypeexpr +| 54 = @sendrcvchantypeexpr +| 55 = @rangeelementexpr; + +@basiclit = @intlit | @floatlit | @imaglit | @charlit | @stringlit; + +@operatorexpr = @logicalexpr | @arithmeticexpr | @bitwiseexpr | @unaryexpr | @binaryexpr; + +@logicalexpr = @logicalunaryexpr | @logicalbinaryexpr; + +@arithmeticexpr = @arithmeticunaryexpr | @arithmeticbinaryexpr; + +@bitwiseexpr = @bitwiseunaryexpr | @bitwisebinaryexpr; + +@unaryexpr = @logicalunaryexpr | @bitwiseunaryexpr | @arithmeticunaryexpr | @derefexpr | @addressexpr | @arrowexpr; + +@logicalunaryexpr = @notexpr; + +@bitwiseunaryexpr = @complementexpr; + +@arithmeticunaryexpr = @plusexpr | @minusexpr; + +@binaryexpr = @logicalbinaryexpr | @bitwisebinaryexpr | @arithmeticbinaryexpr | @comparison; + +@logicalbinaryexpr = @lorexpr | @landexpr; + +@bitwisebinaryexpr = @shiftexpr | @orexpr | @xorexpr | @andexpr | @andnotexpr; + +@arithmeticbinaryexpr = @addexpr | @subexpr | @mulexpr | @quoexpr | @remexpr; + +@shiftexpr = @shlexpr | @shrexpr; + +@comparison = @equalitytest | @relationalcomparison; + +@equalitytest = @eqlexpr | @neqexpr; + +@relationalcomparison = @lssexpr | @leqexpr | @gtrexpr | @geqexpr; + +@chantypeexpr = @sendchantypeexpr | @recvchantypeexpr | @sendrcvchantypeexpr; + +case @stmt.kind of + 0 = @badstmt +| 1 = @declstmt +| 2 = @emptystmt +| 3 = @labeledstmt +| 4 = @exprstmt +| 5 = @sendstmt +| 6 = @incstmt +| 7 = @decstmt +| 8 = @gostmt +| 9 = @deferstmt +| 10 = @returnstmt +| 11 = @breakstmt +| 12 = @continuestmt +| 13 = @gotostmt +| 14 = @fallthroughstmt +| 15 = @blockstmt +| 16 = @ifstmt +| 17 = @caseclause +| 18 = @exprswitchstmt +| 19 = @typeswitchstmt +| 20 = @commclause +| 21 = @selectstmt +| 22 = @forstmt +| 23 = @rangestmt +| 24 = @assignstmt +| 25 = @definestmt +| 26 = @addassignstmt +| 27 = @subassignstmt +| 28 = @mulassignstmt +| 29 = @quoassignstmt +| 30 = @remassignstmt +| 31 = @andassignstmt +| 32 = @orassignstmt +| 33 = @xorassignstmt +| 34 = @shlassignstmt +| 35 = @shrassignstmt +| 36 = @andnotassignstmt; + +@incdecstmt = @incstmt | @decstmt; + +@assignment = @simpleassignstmt | @compoundassignstmt; + +@simpleassignstmt = @assignstmt | @definestmt; + +@compoundassignstmt = @addassignstmt | @subassignstmt | @mulassignstmt | @quoassignstmt | @remassignstmt + | @andassignstmt | @orassignstmt | @xorassignstmt | @shlassignstmt | @shrassignstmt | @andnotassignstmt; + +@branchstmt = @breakstmt | @continuestmt | @gotostmt | @fallthroughstmt; + +@switchstmt = @exprswitchstmt | @typeswitchstmt; + +@loopstmt = @forstmt | @rangestmt; + +case @decl.kind of + 0 = @baddecl +| 1 = @importdecl +| 2 = @constdecl +| 3 = @typedecl +| 4 = @vardecl +| 5 = @funcdecl; + +@gendecl = @importdecl | @constdecl | @typedecl | @vardecl; + +case @spec.kind of + 0 = @importspec +| 1 = @valuespec +| 2 = @typedefspec +| 3 = @aliasspec; + +@typespec = @typedefspec | @aliasspec; + +case @object.kind of + 0 = @pkgobject +| 1 = @decltypeobject +| 2 = @builtintypeobject +| 3 = @declconstobject +| 4 = @builtinconstobject +| 5 = @declvarobject +| 6 = @declfunctionobject +| 7 = @builtinfunctionobject +| 8 = @labelobject; + +@typeparamparentobject = @decltypeobject | @declfunctionobject; + +@declobject = @decltypeobject | @declconstobject | @declvarobject | @declfunctionobject; + +@builtinobject = @builtintypeobject | @builtinconstobject | @builtinfunctionobject; + +@typeobject = @decltypeobject | @builtintypeobject; + +@valueobject = @constobject | @varobject | @functionobject; + +@constobject = @declconstobject | @builtinconstobject; + +@varobject = @declvarobject; + +@functionobject = @declfunctionobject | @builtinfunctionobject; + +case @scope.kind of + 0 = @universescope +| 1 = @packagescope +| 2 = @localscope; + +case @type.kind of + 0 = @invalidtype +| 1 = @boolexprtype +| 2 = @inttype +| 3 = @int8type +| 4 = @int16type +| 5 = @int32type +| 6 = @int64type +| 7 = @uinttype +| 8 = @uint8type +| 9 = @uint16type +| 10 = @uint32type +| 11 = @uint64type +| 12 = @uintptrtype +| 13 = @float32type +| 14 = @float64type +| 15 = @complex64type +| 16 = @complex128type +| 17 = @stringexprtype +| 18 = @unsafepointertype +| 19 = @boolliteraltype +| 20 = @intliteraltype +| 21 = @runeliteraltype +| 22 = @floatliteraltype +| 23 = @complexliteraltype +| 24 = @stringliteraltype +| 25 = @nilliteraltype +| 26 = @typeparamtype +| 27 = @arraytype +| 28 = @slicetype +| 29 = @structtype +| 30 = @pointertype +| 31 = @interfacetype +| 32 = @tupletype +| 33 = @signaturetype +| 34 = @maptype +| 35 = @sendchantype +| 36 = @recvchantype +| 37 = @sendrcvchantype +| 38 = @definedtype +| 39 = @typesetliteraltype; + +@basictype = @booltype | @numerictype | @stringtype | @literaltype | @invalidtype | @unsafepointertype; + +@booltype = @boolexprtype | @boolliteraltype; + +@numerictype = @integertype | @floattype | @complextype; + +@integertype = @signedintegertype | @unsignedintegertype; + +@signedintegertype = @inttype | @int8type | @int16type | @int32type | @int64type | @intliteraltype | @runeliteraltype; + +@unsignedintegertype = @uinttype | @uint8type | @uint16type | @uint32type | @uint64type | @uintptrtype; + +@floattype = @float32type | @float64type | @floatliteraltype; + +@complextype = @complex64type | @complex128type | @complexliteraltype; + +@stringtype = @stringexprtype | @stringliteraltype; + +@literaltype = @boolliteraltype | @intliteraltype | @runeliteraltype | @floatliteraltype | @complexliteraltype + | @stringliteraltype | @nilliteraltype; + +@compositetype = @typeparamtype | @containertype | @structtype | @pointertype | @interfacetype | @tupletype + | @signaturetype | @definedtype | @typesetliteraltype; + +@containertype = @arraytype | @slicetype | @maptype | @chantype; + +@chantype = @sendchantype | @recvchantype | @sendrcvchantype; + +case @modexpr.kind of + 0 = @modcommentblock +| 1 = @modline +| 2 = @modlineblock +| 3 = @modlparen +| 4 = @modrparen; + +case @error.kind of + 0 = @unknownerror +| 1 = @listerror +| 2 = @parseerror +| 3 = @typeerror; + diff --git a/go/ql/lib/upgrades/5ff5325d274ae4f86defa195577bc7c1370b72fa/old.dbscheme b/go/ql/lib/upgrades/5ff5325d274ae4f86defa195577bc7c1370b72fa/old.dbscheme new file mode 100644 index 000000000000..5ff5325d274a --- /dev/null +++ b/go/ql/lib/upgrades/5ff5325d274ae4f86defa195577bc7c1370b72fa/old.dbscheme @@ -0,0 +1,563 @@ +/** Auto-generated dbscheme; do not edit. Run `make gen` in directory `go/` to regenerate. */ + + +/** Duplicate code **/ + +duplicateCode( + unique int id : @duplication, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +similarCode( + unique int id : @similarity, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +@duplication_or_similarity = @duplication | @similarity; + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref); + +/** External data **/ + +externalData( + int id : @externalDataElement, + varchar(900) path : string ref, + int column: int ref, + varchar(900) value : string ref +); + +snapshotDate(unique date snapshotDate : date ref); + +sourceLocationPrefix(varchar(900) prefix : string ref); + +/** Overlay support **/ + +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +overlayChangedFiles( + string path: string ref +); + + +/* + * XML Files + */ + +xmlEncoding( + unique int id: @file ref, + string encoding: string ref +); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +compilations(unique int id: @compilation, string cwd: string ref); + +#keyset[id, num] +compilation_args(int id: @compilation ref, int num: int ref, string arg: string ref); + +#keyset[id, num, kind] +compilation_time(int id: @compilation ref, int num: int ref, int kind: int ref, float secs: float ref); + +diagnostic_for(unique int diagnostic: @diagnostic ref, int compilation: @compilation ref, int file_number: int ref, int file_number_diagnostic_number: int ref); + +compilation_finished(unique int id: @compilation ref, float cpu_seconds: float ref, float elapsed_seconds: float ref); + +#keyset[id, num] +compilation_compiling_files(int id: @compilation ref, int num: int ref, int file: @file ref); + +diagnostics(unique int id: @diagnostic, int severity: int ref, string error_tag: string ref, string error_message: string ref, + string full_error_message: string ref, int location: @location ref); + +locations_default(unique int id: @location_default, int file: @file ref, int beginLine: int ref, int beginColumn: int ref, + int endLine: int ref, int endColumn: int ref); + +numlines(int element_id: @sourceline ref, int num_lines: int ref, int num_code: int ref, int num_comment: int ref); + +files(unique int id: @file, string name: string ref); + +folders(unique int id: @folder, string name: string ref); + +containerparent(int parent: @container ref, unique int child: @container ref); + +has_location(unique int locatable: @locatable ref, int location: @location ref); + +#keyset[parent, idx] +comment_groups(unique int id: @comment_group, int parent: @file ref, int idx: int ref); + +comments(unique int id: @comment, int kind: int ref, int parent: @comment_group ref, int idx: int ref, string text: string ref); + +doc_comments(unique int node: @documentable ref, int comment: @comment_group ref); + +#keyset[parent, idx] +exprs(unique int id: @expr, int kind: int ref, int parent: @exprparent ref, int idx: int ref); + +literals(unique int expr: @expr ref, string value: string ref, string raw: string ref); + +constvalues(unique int expr: @expr ref, string value: string ref, string exact: string ref); + +fields(unique int id: @field, int parent: @fieldparent ref, int idx: int ref); + +typeparamdecls(unique int id: @typeparamdecl, int parent: @typeparamdeclparent ref, int idx: int ref); + +#keyset[parent, idx] +stmts(unique int id: @stmt, int kind: int ref, int parent: @stmtparent ref, int idx: int ref); + +#keyset[parent, idx] +decls(unique int id: @decl, int kind: int ref, int parent: @declparent ref, int idx: int ref); + +#keyset[parent, idx] +specs(unique int id: @spec, int kind: int ref, int parent: @gendecl ref, int idx: int ref); + +scopes(unique int id: @scope, int kind: int ref); + +scopenesting(unique int inner: @scope ref, int outer: @scope ref); + +scopenodes(unique int node: @scopenode ref, int scope: @localscope ref); + +objects(unique int id: @object, int kind: int ref, string name: string ref); + +objectscopes(unique int object: @object ref, int scope: @scope ref); + +objecttypes(unique int object: @object ref, int tp: @type ref); + +methodreceivers(unique int method: @object ref, int receiver: @object ref); + +fieldstructs(unique int field: @object ref, int struct: @structtype ref); + +methodhosts(int method: @object ref, int host: @definedtype ref); + +defs(int ident: @ident ref, int object: @object ref); + +uses(int ident: @ident ref, int object: @object ref); + +types(unique int id: @type, int kind: int ref); + +type_of(unique int expr: @expr ref, int tp: @type ref); + +typename(unique int tp: @type ref, string name: string ref); + +key_type(unique int map: @maptype ref, int tp: @type ref); + +element_type(unique int container: @containertype ref, int tp: @type ref); + +base_type(unique int ptr: @pointertype ref, int tp: @type ref); + +underlying_type(unique int defined: @definedtype ref, int tp: @type ref); + +#keyset[parent, index] +component_types(int parent: @compositetype ref, int index: int ref, string name: string ref, int tp: @type ref); + +#keyset[parent, index] +struct_tags(int parent: @structtype ref, int index: int ref, string tag: string ref); + +#keyset[interface, index] +interface_private_method_ids(int interface: @interfacetype ref, int index: int ref, string id: string ref); + +array_length(unique int tp: @arraytype ref, string len: string ref); + +type_objects(unique int tp: @type ref, int object: @object ref); + +packages(unique int id: @package, string name: string ref, string path: string ref, int scope: @packagescope ref); + +#keyset[parent, idx] +modexprs(unique int id: @modexpr, int kind: int ref, int parent: @modexprparent ref, int idx: int ref); + +#keyset[parent, idx] +modtokens(string token: string ref, int parent: @modexpr ref, int idx: int ref); + +#keyset[package, idx] +errors(unique int id: @error, int kind: int ref, string msg: string ref, string rawpos: string ref, + string file: string ref, int line: int ref, int col: int ref, int package: @package ref, int idx: int ref); + +has_ellipsis(int id: @callorconversionexpr ref); + +variadic(int id: @signaturetype ref); + +#keyset[parent, idx, is_from_recv] +typeparam(unique int tp: @typeparamtype ref, string name: string ref, + int bound: @compositetype ref, int parent: @typeparamparentobject ref, int idx: int ref, boolean is_from_recv: boolean ref); + +@container = @file | @folder; + +@locatable = @xmllocatable | @node | @localscope; + +@node = @documentable | @exprparent | @modexprparent | @fieldparent | @stmtparent | @declparent | @typeparamdeclparent + | @scopenode | @comment_group | @comment; + +@documentable = @file | @field | @typeparamdecl | @spec | @gendecl | @funcdecl | @modexpr; + +@exprparent = @funcdef | @file | @expr | @field | @stmt | @decl | @typeparamdecl | @spec; + +@modexprparent = @file | @modexpr; + +@fieldparent = @decl | @structtypeexpr | @functypeexpr | @interfacetypeexpr; + +@stmtparent = @funcdef | @stmt | @decl; + +@declparent = @file | @declstmt; + +@typeparamdeclparent = @funcdecl | @typespec; + +@funcdef = @funclit | @funcdecl; + +@scopenode = @file | @functypeexpr | @blockstmt | @ifstmt | @caseclause | @switchstmt | @commclause | @loopstmt; + +@location = @location_default; + +@sourceline = @locatable; + +case @comment.kind of + 0 = @slashslashcomment +| 1 = @slashstarcomment; + +case @expr.kind of + 0 = @badexpr +| 1 = @ident +| 2 = @ellipsis +| 3 = @intlit +| 4 = @floatlit +| 5 = @imaglit +| 6 = @charlit +| 7 = @stringlit +| 8 = @funclit +| 9 = @compositelit +| 10 = @parenexpr +| 11 = @selectorexpr +| 12 = @indexexpr +| 13 = @genericfunctioninstantiationexpr +| 14 = @generictypeinstantiationexpr +| 15 = @sliceexpr +| 16 = @typeassertexpr +| 17 = @callorconversionexpr +| 18 = @starexpr +| 19 = @keyvalueexpr +| 20 = @arraytypeexpr +| 21 = @structtypeexpr +| 22 = @functypeexpr +| 23 = @interfacetypeexpr +| 24 = @maptypeexpr +| 25 = @typesetliteralexpr +| 26 = @plusexpr +| 27 = @minusexpr +| 28 = @notexpr +| 29 = @complementexpr +| 30 = @derefexpr +| 31 = @addressexpr +| 32 = @arrowexpr +| 33 = @lorexpr +| 34 = @landexpr +| 35 = @eqlexpr +| 36 = @neqexpr +| 37 = @lssexpr +| 38 = @leqexpr +| 39 = @gtrexpr +| 40 = @geqexpr +| 41 = @addexpr +| 42 = @subexpr +| 43 = @orexpr +| 44 = @xorexpr +| 45 = @mulexpr +| 46 = @quoexpr +| 47 = @remexpr +| 48 = @shlexpr +| 49 = @shrexpr +| 50 = @andexpr +| 51 = @andnotexpr +| 52 = @sendchantypeexpr +| 53 = @recvchantypeexpr +| 54 = @sendrcvchantypeexpr; + +@basiclit = @intlit | @floatlit | @imaglit | @charlit | @stringlit; + +@operatorexpr = @logicalexpr | @arithmeticexpr | @bitwiseexpr | @unaryexpr | @binaryexpr; + +@logicalexpr = @logicalunaryexpr | @logicalbinaryexpr; + +@arithmeticexpr = @arithmeticunaryexpr | @arithmeticbinaryexpr; + +@bitwiseexpr = @bitwiseunaryexpr | @bitwisebinaryexpr; + +@unaryexpr = @logicalunaryexpr | @bitwiseunaryexpr | @arithmeticunaryexpr | @derefexpr | @addressexpr | @arrowexpr; + +@logicalunaryexpr = @notexpr; + +@bitwiseunaryexpr = @complementexpr; + +@arithmeticunaryexpr = @plusexpr | @minusexpr; + +@binaryexpr = @logicalbinaryexpr | @bitwisebinaryexpr | @arithmeticbinaryexpr | @comparison; + +@logicalbinaryexpr = @lorexpr | @landexpr; + +@bitwisebinaryexpr = @shiftexpr | @orexpr | @xorexpr | @andexpr | @andnotexpr; + +@arithmeticbinaryexpr = @addexpr | @subexpr | @mulexpr | @quoexpr | @remexpr; + +@shiftexpr = @shlexpr | @shrexpr; + +@comparison = @equalitytest | @relationalcomparison; + +@equalitytest = @eqlexpr | @neqexpr; + +@relationalcomparison = @lssexpr | @leqexpr | @gtrexpr | @geqexpr; + +@chantypeexpr = @sendchantypeexpr | @recvchantypeexpr | @sendrcvchantypeexpr; + +case @stmt.kind of + 0 = @badstmt +| 1 = @declstmt +| 2 = @emptystmt +| 3 = @labeledstmt +| 4 = @exprstmt +| 5 = @sendstmt +| 6 = @incstmt +| 7 = @decstmt +| 8 = @gostmt +| 9 = @deferstmt +| 10 = @returnstmt +| 11 = @breakstmt +| 12 = @continuestmt +| 13 = @gotostmt +| 14 = @fallthroughstmt +| 15 = @blockstmt +| 16 = @ifstmt +| 17 = @caseclause +| 18 = @exprswitchstmt +| 19 = @typeswitchstmt +| 20 = @commclause +| 21 = @selectstmt +| 22 = @forstmt +| 23 = @rangestmt +| 24 = @assignstmt +| 25 = @definestmt +| 26 = @addassignstmt +| 27 = @subassignstmt +| 28 = @mulassignstmt +| 29 = @quoassignstmt +| 30 = @remassignstmt +| 31 = @andassignstmt +| 32 = @orassignstmt +| 33 = @xorassignstmt +| 34 = @shlassignstmt +| 35 = @shrassignstmt +| 36 = @andnotassignstmt; + +@incdecstmt = @incstmt | @decstmt; + +@assignment = @simpleassignstmt | @compoundassignstmt; + +@simpleassignstmt = @assignstmt | @definestmt; + +@compoundassignstmt = @addassignstmt | @subassignstmt | @mulassignstmt | @quoassignstmt | @remassignstmt + | @andassignstmt | @orassignstmt | @xorassignstmt | @shlassignstmt | @shrassignstmt | @andnotassignstmt; + +@branchstmt = @breakstmt | @continuestmt | @gotostmt | @fallthroughstmt; + +@switchstmt = @exprswitchstmt | @typeswitchstmt; + +@loopstmt = @forstmt | @rangestmt; + +case @decl.kind of + 0 = @baddecl +| 1 = @importdecl +| 2 = @constdecl +| 3 = @typedecl +| 4 = @vardecl +| 5 = @funcdecl; + +@gendecl = @importdecl | @constdecl | @typedecl | @vardecl; + +case @spec.kind of + 0 = @importspec +| 1 = @valuespec +| 2 = @typedefspec +| 3 = @aliasspec; + +@typespec = @typedefspec | @aliasspec; + +case @object.kind of + 0 = @pkgobject +| 1 = @decltypeobject +| 2 = @builtintypeobject +| 3 = @declconstobject +| 4 = @builtinconstobject +| 5 = @declvarobject +| 6 = @declfunctionobject +| 7 = @builtinfunctionobject +| 8 = @labelobject; + +@typeparamparentobject = @decltypeobject | @declfunctionobject; + +@declobject = @decltypeobject | @declconstobject | @declvarobject | @declfunctionobject; + +@builtinobject = @builtintypeobject | @builtinconstobject | @builtinfunctionobject; + +@typeobject = @decltypeobject | @builtintypeobject; + +@valueobject = @constobject | @varobject | @functionobject; + +@constobject = @declconstobject | @builtinconstobject; + +@varobject = @declvarobject; + +@functionobject = @declfunctionobject | @builtinfunctionobject; + +case @scope.kind of + 0 = @universescope +| 1 = @packagescope +| 2 = @localscope; + +case @type.kind of + 0 = @invalidtype +| 1 = @boolexprtype +| 2 = @inttype +| 3 = @int8type +| 4 = @int16type +| 5 = @int32type +| 6 = @int64type +| 7 = @uinttype +| 8 = @uint8type +| 9 = @uint16type +| 10 = @uint32type +| 11 = @uint64type +| 12 = @uintptrtype +| 13 = @float32type +| 14 = @float64type +| 15 = @complex64type +| 16 = @complex128type +| 17 = @stringexprtype +| 18 = @unsafepointertype +| 19 = @boolliteraltype +| 20 = @intliteraltype +| 21 = @runeliteraltype +| 22 = @floatliteraltype +| 23 = @complexliteraltype +| 24 = @stringliteraltype +| 25 = @nilliteraltype +| 26 = @typeparamtype +| 27 = @arraytype +| 28 = @slicetype +| 29 = @structtype +| 30 = @pointertype +| 31 = @interfacetype +| 32 = @tupletype +| 33 = @signaturetype +| 34 = @maptype +| 35 = @sendchantype +| 36 = @recvchantype +| 37 = @sendrcvchantype +| 38 = @definedtype +| 39 = @typesetliteraltype; + +@basictype = @booltype | @numerictype | @stringtype | @literaltype | @invalidtype | @unsafepointertype; + +@booltype = @boolexprtype | @boolliteraltype; + +@numerictype = @integertype | @floattype | @complextype; + +@integertype = @signedintegertype | @unsignedintegertype; + +@signedintegertype = @inttype | @int8type | @int16type | @int32type | @int64type | @intliteraltype | @runeliteraltype; + +@unsignedintegertype = @uinttype | @uint8type | @uint16type | @uint32type | @uint64type | @uintptrtype; + +@floattype = @float32type | @float64type | @floatliteraltype; + +@complextype = @complex64type | @complex128type | @complexliteraltype; + +@stringtype = @stringexprtype | @stringliteraltype; + +@literaltype = @boolliteraltype | @intliteraltype | @runeliteraltype | @floatliteraltype | @complexliteraltype + | @stringliteraltype | @nilliteraltype; + +@compositetype = @typeparamtype | @containertype | @structtype | @pointertype | @interfacetype | @tupletype + | @signaturetype | @definedtype | @typesetliteraltype; + +@containertype = @arraytype | @slicetype | @maptype | @chantype; + +@chantype = @sendchantype | @recvchantype | @sendrcvchantype; + +case @modexpr.kind of + 0 = @modcommentblock +| 1 = @modline +| 2 = @modlineblock +| 3 = @modlparen +| 4 = @modrparen; + +case @error.kind of + 0 = @unknownerror +| 1 = @listerror +| 2 = @parseerror +| 3 = @typeerror; + diff --git a/go/ql/lib/upgrades/5ff5325d274ae4f86defa195577bc7c1370b72fa/upgrade.properties b/go/ql/lib/upgrades/5ff5325d274ae4f86defa195577bc7c1370b72fa/upgrade.properties new file mode 100644 index 000000000000..768d62bb215d --- /dev/null +++ b/go/ql/lib/upgrades/5ff5325d274ae4f86defa195577bc7c1370b72fa/upgrade.properties @@ -0,0 +1,2 @@ +description: Add @rangeelementexpr, grouping the loop variables of a range statement +compatibility: partial diff --git a/go/ql/test/library-tests/semmle/go/PrintAst/PrintAst.expected b/go/ql/test/library-tests/semmle/go/PrintAst/PrintAst.expected index 66aa26430633..ddd012611356 100644 --- a/go/ql/test/library-tests/semmle/go/PrintAst/PrintAst.expected +++ b/go/ql/test/library-tests/semmle/go/PrintAst/PrintAst.expected @@ -547,8 +547,9 @@ input.go: # 133| Type = []int # 133| 2: [BlockStmt] block statement # 134| 0: [RangeStmt] range statement -# 134| 0: [Ident, VariableName] x -# 134| Type = int +# 134| 0: [RangeElementExpr] range element +# 134| 0: [Ident, VariableName] x +# 134| Type = int # 134| 1: [Ident, VariableName] xs # 134| Type = []int # 134| 2: [BlockStmt] block statement @@ -573,13 +574,14 @@ input.go: # 138| 1: [Ident, VariableName] x # 138| Type = int # 141| 1: [RangeStmt] range statement -# 141| 0: [Ident, VariableName] i -# 141| Type = int -# 141| 1: [Ident, VariableName] v -# 141| Type = int -# 141| 2: [Ident, VariableName] xs +# 141| 0: [RangeElementExpr] range element +# 141| 0: [Ident, VariableName] i +# 141| Type = int +# 141| 1: [Ident, VariableName] v +# 141| Type = int +# 141| 1: [Ident, VariableName] xs # 141| Type = []int -# 141| 3: [BlockStmt] block statement +# 141| 2: [BlockStmt] block statement # 142| 0: [ExprStmt] expression statement # 142| 0: [CallExpr] call to Print # 142| Type = (int, error) @@ -593,9 +595,10 @@ input.go: # 142| 2: [Ident, VariableName] v # 142| Type = int # 145| 2: [RangeStmt] range statement -# 145| 0: [Ident, VariableName] xs +# 145| 0: [RangeElementExpr] range element +# 145| 1: [Ident, VariableName] xs # 145| Type = []int -# 145| 1: [BlockStmt] block statement +# 145| 2: [BlockStmt] block statement other.go: # 0| [GoFile] other.go # 1| package: [Ident] main diff --git a/go/ql/test/library-tests/semmle/go/PrintAst/PrintAstExcludeComments.expected b/go/ql/test/library-tests/semmle/go/PrintAst/PrintAstExcludeComments.expected index 099aa4e6144f..c25ff250f785 100644 --- a/go/ql/test/library-tests/semmle/go/PrintAst/PrintAstExcludeComments.expected +++ b/go/ql/test/library-tests/semmle/go/PrintAst/PrintAstExcludeComments.expected @@ -527,8 +527,9 @@ input.go: # 133| Type = []int # 133| 2: [BlockStmt] block statement # 134| 0: [RangeStmt] range statement -# 134| 0: [Ident, VariableName] x -# 134| Type = int +# 134| 0: [RangeElementExpr] range element +# 134| 0: [Ident, VariableName] x +# 134| Type = int # 134| 1: [Ident, VariableName] xs # 134| Type = []int # 134| 2: [BlockStmt] block statement @@ -553,13 +554,14 @@ input.go: # 138| 1: [Ident, VariableName] x # 138| Type = int # 141| 1: [RangeStmt] range statement -# 141| 0: [Ident, VariableName] i -# 141| Type = int -# 141| 1: [Ident, VariableName] v -# 141| Type = int -# 141| 2: [Ident, VariableName] xs +# 141| 0: [RangeElementExpr] range element +# 141| 0: [Ident, VariableName] i +# 141| Type = int +# 141| 1: [Ident, VariableName] v +# 141| Type = int +# 141| 1: [Ident, VariableName] xs # 141| Type = []int -# 141| 3: [BlockStmt] block statement +# 141| 2: [BlockStmt] block statement # 142| 0: [ExprStmt] expression statement # 142| 0: [CallExpr] call to Print # 142| Type = (int, error) @@ -573,9 +575,10 @@ input.go: # 142| 2: [Ident, VariableName] v # 142| Type = int # 145| 2: [RangeStmt] range statement -# 145| 0: [Ident, VariableName] xs +# 145| 0: [RangeElementExpr] range element +# 145| 1: [Ident, VariableName] xs # 145| Type = []int -# 145| 1: [BlockStmt] block statement +# 145| 2: [BlockStmt] block statement other.go: # 0| [GoFile] other.go # 1| package: [Ident] main From 1f64f1074e9c2ffaff1a92b02b02990455a2693c Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 13 Aug 2026 14:48:24 +0100 Subject: [PATCH 0979/2098] Switch to using shared CFG library --- go/ql/lib/semmle/go/PrintAst.qll | 2 +- .../lib/semmle/go/controlflow/BasicBlocks.qll | 59 +- .../go/controlflow/ControlFlowGraph.qll | 143 +- .../go/controlflow/ControlFlowGraphImpl.qll | 2133 ------ .../go/controlflow/ControlFlowGraphShared.qll | 1734 +++++ go/ql/lib/semmle/go/controlflow/IR.qll | 1009 ++- go/ql/lib/semmle/go/dataflow/SsaImpl.qll | 7 +- .../go/dataflow/internal/DataFlowNodes.qll | 7 +- .../dataflow/internal/TaintTrackingUtil.qll | 18 +- go/ql/lib/semmle/go/frameworks/Revel.qll | 2 +- go/ql/src/RedundantCode/DeadStoreOfLocal.ql | 2 +- .../src/RedundantCode/UnreachableStatement.ql | 50 +- .../test/extractor-tests/go1.17/CFG.expected | 206 +- .../ControlFlowNode_getASuccessor.expected | 5938 ++++++++++++----- .../ControlFlowGraph/NoretFunctions.expected | 5 +- .../dataflow/FlowSteps/LocalFlowStep.expected | 10 +- .../FlowSteps/LocalTaintStep.expected | 6 +- .../GlobalValueNumber.expected | 8 +- .../semmle/go/dataflow/SSA/DefUse.expected | 28 +- .../go/dataflow/SSA/SsaDefinition.expected | 18 +- .../go/dataflow/SSA/SsaWithFields.expected | 26 +- .../CONSISTENCY/DataFlowConsistency.expected | 2 - .../RedundantRecover.expected | 2 +- .../Security/CWE-022/ZipSlip.expected | 20 +- .../CWE-312/CleartextLogging.expected | 12 +- .../codeql/controlflow/ControlFlowGraph.qll | 343 +- 26 files changed, 7102 insertions(+), 4688 deletions(-) delete mode 100644 go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll create mode 100644 go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll delete mode 100644 go/ql/test/library-tests/semmle/go/dataflow/VarArgs/CONSISTENCY/DataFlowConsistency.expected diff --git a/go/ql/lib/semmle/go/PrintAst.qll b/go/ql/lib/semmle/go/PrintAst.qll index 6ea5fcc39719..c7c9bb5b4b7e 100644 --- a/go/ql/lib/semmle/go/PrintAst.qll +++ b/go/ql/lib/semmle/go/PrintAst.qll @@ -1,7 +1,7 @@ /** * Provides queries to pretty-print a Go AST as a graph. */ -overlay[local] +overlay[local?] module; import go diff --git a/go/ql/lib/semmle/go/controlflow/BasicBlocks.qll b/go/ql/lib/semmle/go/controlflow/BasicBlocks.qll index 9bb92bb7d460..81d56e6711cf 100644 --- a/go/ql/lib/semmle/go/controlflow/BasicBlocks.qll +++ b/go/ql/lib/semmle/go/controlflow/BasicBlocks.qll @@ -5,66 +5,27 @@ overlay[local] module; import go -private import ControlFlowGraphImpl -private import codeql.controlflow.BasicBlock as BB -private import codeql.controlflow.SuccessorType +private import ControlFlowGraphShared -private module Input implements BB::InputSig { - /** A delineated part of the AST with its own CFG. */ - class CfgScope = ControlFlow::Root; +/** A basic block in the control-flow graph. */ +class BasicBlock = CfgImpl::Cfg::BasicBlock; - /** The class of control flow nodes. */ - class Node = ControlFlowNode; - - /** Gets the CFG scope in which this node occurs. */ - CfgScope nodeGetCfgScope(Node node) { node.getRoot() = result } - - /** Gets an immediate successor of this node. */ - Node nodeGetASuccessor(Node node, SuccessorType t) { - result = node.getASuccessor() and - ( - not result instanceof ControlFlow::ConditionGuardNode and t instanceof DirectSuccessor - or - t.(BooleanSuccessor).getValue() = result.(ControlFlow::ConditionGuardNode).getOutcome() - ) - } - - /** - * Holds if `node` represents an entry node to be used when calculating - * dominance. - */ - predicate nodeIsDominanceEntry(Node node) { node instanceof EntryNode } - - /** - * Holds if `node` represents an exit node to be used when calculating - * post dominance. - */ - predicate nodeIsPostDominanceExit(Node node) { node instanceof ExitNode } -} - -module Cfg = BB::Make; - -class BasicBlock = Cfg::BasicBlock; - -class EntryBasicBlock = Cfg::EntryBasicBlock; - -cached -private predicate reachableBB(BasicBlock bb) { - bb instanceof EntryBasicBlock - or - exists(BasicBlock predBB | predBB.getASuccessor(_) = bb | reachableBB(predBB)) -} +/** An entry basic block. */ +class EntryBasicBlock = CfgImpl::Cfg::EntryBasicBlock; /** * A basic block that is reachable from an entry basic block. + * + * Since the shared CFG library only creates nodes for reachable code, + * all basic blocks are reachable by construction. */ class ReachableBasicBlock extends BasicBlock { - ReachableBasicBlock() { reachableBB(this) } + ReachableBasicBlock() { any() } } /** * A reachable basic block with more than one predecessor. */ class ReachableJoinBlock extends ReachableBasicBlock { - ReachableJoinBlock() { this.getFirstNode().isJoin() } + ReachableJoinBlock() { this.getFirstNode().(ControlFlow::Node).isJoin() } } diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll index 77bb94d89f8c..80ee4e06ce4d 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll @@ -1,17 +1,22 @@ /** - * Provides classes for working with a CFG-based program representation. + * Provides the public API for working with Go's control-flow graph. */ overlay[local] module; import go -private import ControlFlowGraphImpl +private import ControlFlowGraphShared +private import codeql.controlflow.SuccessorType -/** Provides helper predicates for mapping btween CFG nodes and the AST. */ +/** Provides helper predicates for mapping between CFG nodes and the AST. */ module ControlFlow { /** A file or function with which a CFG is associated. */ class Root extends AstNode { - Root() { exists(this.(File).getADecl()) or exists(this.(FuncDef).getBody()) } + Root() { + exists(this.(FuncDef).getBody()) + or + exists(this.(File).getADecl()) + } /** Holds if `nd` belongs to this file or function. */ predicate isRootOf(AstNode nd) { @@ -29,22 +34,15 @@ module ControlFlow { } /** - * A node in the intra-procedural control-flow graph of a Go function or file. + * A node in the control-flow graph of a Go file or function. * * Nodes correspond to expressions and statements that compute a value or perform * an operation (as opposed to providing syntactic structure or type information). * - * There are also synthetic entry and exit nodes for each Go function and file - * that mark the beginning and the end, respectively, of the execution of the - * function and the loading of the file. + * There are also synthetic entry and exit nodes for each Go file or function + * that mark the beginning and the end, respectively, of its execution. */ - class Node extends TControlFlowNode { - /** Gets a node that directly follows this one in the control-flow graph. */ - Node getASuccessor() { result = CFG::succ(this) } - - /** Gets a node that directly precedes this one in the control-flow graph. */ - Node getAPredecessor() { this = result.getASuccessor() } - + class Node extends CfgImpl::ControlFlowNode { /** Holds if this is a node with more than one successor. */ predicate isBranch() { strictcount(this.getASuccessor()) > 1 } @@ -52,22 +50,23 @@ module ControlFlow { predicate isJoin() { strictcount(this.getAPredecessor()) > 1 } /** Holds if this is the first control-flow node in `subtree`. */ - predicate isFirstNodeOf(AstNode subtree) { CFG::firstNode(subtree, this) } - - /** Holds if this node is the (unique) entry node of a function or file. */ - predicate isEntryNode() { this instanceof MkEntryNode } + predicate isFirstNodeOf(AstNode subtree) { + this.isBefore(subtree) + or + this.injects(subtree) + } - /** Holds if this node is the (unique) exit node of a function or file. */ - predicate isExitNode() { this instanceof MkExitNode } + /** Holds if this node is the unique entry node of a file or function. */ + predicate isEntryNode() { this instanceof CfgImpl::ControlFlow::EntryNode } - /** Gets the basic block to which this node belongs. */ - BasicBlock getBasicBlock() { result.getANode() = this } + /** Holds if this node is the unique exit node of a file or function. */ + predicate isExitNode() { this instanceof CfgImpl::ControlFlow::ExitNode } /** Holds if this node dominates `dominee` in the control-flow graph. */ overlay[caller?] pragma[inline] predicate dominatesNode(ControlFlow::Node dominee) { - exists(ReachableBasicBlock thisbb, ReachableBasicBlock dbb, int i, int j | + exists(CfgImpl::Cfg::BasicBlock thisbb, CfgImpl::Cfg::BasicBlock dbb, int i, int j | this = thisbb.getNode(i) and dominee = dbb.getNode(j) | thisbb.strictlyDominates(dbb) @@ -76,19 +75,14 @@ module ControlFlow { ) } - /** Gets the innermost function or file to which this node belongs. */ - Root getRoot() { none() } - - /** Gets the file to which this node belongs. */ - File getFile() { result = this.getLocation().getFile() } - /** - * Gets a textual representation of this control flow node. + * Gets the innermost function to which this node belongs, or the file if + * it is not inside a function. */ - string toString() { result = "control-flow node" } + Root getRoot() { result = this.getEnclosingCallable() } - /** Gets the source location for this element. */ - Location getLocation() { none() } + /** Gets the file to which this node belongs. */ + File getFile() { result = this.getLocation().getFile() } /** * DEPRECATED: Use `getLocation()` instead. @@ -113,6 +107,26 @@ module ControlFlow { } } + /** A synthetic entry node for a function or a file. */ + class EntryNode extends Node instanceof CfgImpl::ControlFlow::EntryNode { } + + /** A synthetic exit node for a function or a file. */ + class ExitNode extends Node instanceof CfgImpl::ControlFlow::ExitNode { } + + private predicate isConditionGuardRoot(Expr expr) { + expr = any(LogicalBinaryExpr lbe).getLeftOperand() + or + expr = any(ForStmt fs).getCond() + or + expr = any(IfStmt is).getCond() + or + isExpressionlessSwitchCaseCondition(expr) + } + + private predicate isExpressionlessSwitchCaseCondition(Expr expr) { + expr = any(ExpressionSwitchStmt ess | not exists(ess.getExpr())).getACase().getAnExpr() + } + /** * A control-flow node that initializes or updates the value of a constant, a variable, * a field, or an (array, slice, or map) element. @@ -172,7 +186,7 @@ module ControlFlow { exists(IR::FieldTarget trg | trg = super.getLhs() | ( trg.getBase() = base or - trg.getBase() = MkImplicitDeref(base.(IR::EvalInstruction).getExpr()) + trg.getBase() = IR::implicitDerefInstruction(base.(IR::EvalInstruction).getExpr()) ) and trg.getField() = f and super.getRhs() = rhs @@ -220,7 +234,7 @@ module ControlFlow { exists(IR::ElementTarget trg | trg = super.getLhs() | ( trg.getBase() = base or - trg.getBase() = MkImplicitDeref(base.(IR::EvalInstruction).getExpr()) + trg.getBase() = IR::implicitDerefInstruction(base.(IR::EvalInstruction).getExpr()) ) and trg.getIndex() = index and super.getRhs() = rhs @@ -250,11 +264,24 @@ module ControlFlow { * A control-flow node recording the fact that a certain expression has a known * Boolean value at this point in the program. */ - class ConditionGuardNode extends IR::Instruction, MkConditionGuardNode { + class ConditionGuardNode extends IR::Instruction { Expr cond; boolean outcome; - ConditionGuardNode() { this = MkConditionGuardNode(cond, outcome) } + ConditionGuardNode() { + isConditionGuardRoot(cond) and + this.isAfterTrue(cond) and + outcome = true + or + isConditionGuardRoot(cond) and + this.isAfterFalse(cond) and + outcome = false + or + isExpressionlessSwitchCaseCondition(cond) and + exists(MatchingSuccessor successor | + this.isAfterValue(cond, successor) and outcome = successor.getValue() + ) + } private predicate ensuresAux(Expr expr, boolean b) { expr = cond and b = outcome @@ -320,21 +347,17 @@ module ControlFlow { boolean getOutcome() { result = outcome } override Root getRoot() { result.isRootOf(cond) } - - override string toString() { result = cond + " is " + outcome } - - override Location getLocation() { result = cond.getLocation() } } /** - * Gets the entry node of function or file `root`. + * Gets the entry node of file or function `root`. */ - Node entryNode(Root root) { result = MkEntryNode(root) } + EntryNode entryNode(Root root) { result.getEnclosingCallable() = root } /** - * Gets the exit node of function or file `root`. + * Gets the exit node of file or function `root`. */ - Node exitNode(Root root) { result = MkExitNode(root) } + ExitNode exitNode(Root root) { result.getEnclosingCallable() = root } /** * Holds if the function `f` may return without panicking, exiting the process, or looping forever. @@ -342,17 +365,35 @@ module ControlFlow { * This is defined conservatively, and so may also hold of a function that in fact * cannot return normally, but never fails to hold of a function that can return normally. */ - predicate mayReturnNormally(FuncDecl f) { CFG::mayReturnNormally(f.getBody()) } + predicate mayReturnNormally(FuncDecl f) { + exists(CfgImpl::ControlFlow::NormalExitNode exit | + exit.getEnclosingCallable() = f and + exists(exit.getAPredecessor()) + ) + } /** - * Holds if `pred` is the node for the case `testExpr` in an expression - * switch statement which is switching on `switchExpr`, and `succ` is the - * node to be executed next if the case test succeeds. + * Holds if `pred` is the node reached when a case of the expression switch + * statement switching on `switchExpr` matches, `testExpr` is one of that + * case's test expressions, and `succ` is the node to be executed next when + * the case matches. + * + * In the control-flow graph the individual case test expressions of a case + * clause all funnel into a single "matched" node for the clause, from which + * control transfers to the case body. Hence `pred` is that shared matched + * node, and the same `(pred, succ)` pair is reported once per test + * expression `testExpr` of the clause. */ predicate isSwitchCaseTestPassingEdge( ControlFlow::Node pred, ControlFlow::Node succ, Expr switchExpr, Expr testExpr ) { - CFG::isSwitchCaseTestPassingEdge(pred, succ, switchExpr, testExpr) + exists(ExpressionSwitchStmt ess, CaseClause cc, int i | + ess.getExpr() = switchExpr and + cc = ess.getACase() and + testExpr = cc.getExpr(i) and + pred.isAfter(cc) and + succ.isFirstNodeOf(cc.getStmt(0)) + ) } } diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll deleted file mode 100644 index a26ab3adaf5f..000000000000 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll +++ /dev/null @@ -1,2133 +0,0 @@ -/** - * INTERNAL: Analyses should use module `ControlFlowGraph` instead. - * - * Provides predicates for building intra-procedural CFGs. - */ -overlay[local] -module; - -import go - -/** A block statement that is not the body of a `switch` or `select` statement. */ -class PlainBlock extends BlockStmt { - PlainBlock() { - not this = any(SwitchStmt sw).getBody() and not this = any(SelectStmt sel).getBody() - } -} - -private predicate notBlankIdent(Expr e) { not e instanceof BlankIdent } - -private predicate pureLvalue(ReferenceExpr e) { not e.isRvalue() } - -/** - * Holds if `e` is a branch condition, including the LHS of a short-circuiting binary operator. - */ -private predicate isCondRoot(Expr e) { - e = any(LogicalBinaryExpr lbe).getLeftOperand() - or - e = any(ForStmt fs).getCond() - or - e = any(IfStmt is).getCond() - or - e = any(ExpressionSwitchStmt ess | not exists(ess.getExpr())).getACase().getAnExpr() -} - -/** - * Holds if `e` is a branch condition or part of a logical binary expression contributing to a - * branch condition. - * - * For example, in `v := (x && y) || (z && w)`, `x` and `(x && y)` and `z` are branch conditions - * (`isCondRoot` holds of them), whereas this predicate also holds of `y` (contributes to condition - * `x && y`) but not of `w` (contributes to the value `v`, but not to any branch condition). - * - * In the context `if (x && y) || (z && w)` then the whole `(x && y) || (z && w)` is a branch condition - * as well as `x` and `(x && y)` and `z` as previously, and this predicate holds of all their - * subexpressions. - */ -private predicate isCond(Expr e) { - isCondRoot(e) or - e = any(LogicalBinaryExpr lbe | isCond(lbe)).getRightOperand() or - e = any(ParenExpr par | isCond(par)).getExpr() -} - -/** - * Holds if `e` implicitly reads the embedded field `implicitField`. - * - * The `index` is the distance from the promoted field. For example, if `A` contains an embedded - * field `B`, `B` contains an embedded field `C` and `C` contains the non-embedded field `x`. - * Then `a.x` implicitly reads `C` with index 1 and `B` with index 2. - */ -private predicate implicitFieldSelectionForField(PromotedSelector e, int index, Field implicitField) { - exists(StructType baseType, PromotedField child, int implicitFieldDepth | - baseType = e.getSelectedStructType() and - ( - e.refersTo(child) - or - implicitFieldSelectionForField(e, implicitFieldDepth + 1, child) - ) - | - child = baseType.getFieldOfEmbedded(implicitField, _, implicitFieldDepth + 1, _) and - exists(PromotedField explicitField, int explicitFieldDepth | - e.refersTo(explicitField) and baseType.getFieldAtDepth(_, explicitFieldDepth) = explicitField - | - index = explicitFieldDepth - implicitFieldDepth - ) - ) -} - -private predicate implicitFieldSelectionForMethod(PromotedSelector e, int index, Field implicitField) { - exists(StructType baseType, PromotedMethod method, int mDepth, int implicitFieldDepth | - baseType = e.getSelectedStructType() and - e.refersTo(method) and - baseType.getMethodAtDepth(_, mDepth) = method and - index = mDepth - implicitFieldDepth - | - method = baseType.getMethodOfEmbedded(implicitField, _, implicitFieldDepth + 1) - or - exists(PromotedField child | - child = baseType.getFieldOfEmbedded(implicitField, _, implicitFieldDepth + 1, _) and - implicitFieldSelectionForMethod(e, implicitFieldDepth + 1, child) - ) - ) -} - -/** - * A node in the intra-procedural control-flow graph of a Go function or file. - * - * There are two kinds of control-flow nodes: - * - * 1. Instructions: these are nodes that correspond to expressions and statements - * that compute a value or perform an operation (as opposed to providing syntactic - * structure or type information). - * 2. Synthetic nodes: - * - Entry and exit nodes for each Go function and file that mark the beginning and the end, - * respectively, of the execution of the function and the loading of the file; - * - Skip nodes that are semantic no-ops, but make CFG construction easier. - */ -cached -newtype TControlFlowNode = - /** - * A control-flow node that represents the evaluation of an expression. - */ - MkExprNode(Expr e) { CFG::hasEvaluationNode(e) } or - /** - * A control-flow node that represents the initialization of an element of a composite literal. - */ - MkLiteralElementInitNode(Expr e) { e = any(CompositeLit lit).getAnElement() } or - /** - * A control-flow node that represents the implicit index of an element in a slice or array literal. - */ - MkImplicitLiteralElementIndex(Expr e) { - exists(CompositeLit lit | not lit instanceof StructLit | - e = lit.getAnElement() and - not e instanceof KeyValueExpr - ) - } or - /** - * A control-flow node that represents a (single) assignment. - * - * Assignments with multiple left-hand sides are split up into multiple assignment nodes, - * one for each left-hand side. Assignments to `_` are not represented in the control-flow graph. - */ - MkAssignNode(AstNode assgn, int i) { - // the `i`th assignment in a (possibly multi-)assignment - notBlankIdent(assgn.(Assignment).getLhs(i)) - or - // the `i`th name declared in a (possibly multi-)declaration specifier - notBlankIdent(assgn.(ValueSpec).getNameExpr(i)) - or - // the assignment to the "key" variable in a `range` statement - notBlankIdent(assgn.(RangeStmt).getKey()) and i = 0 - or - // the assignment to the "value" variable in a `range` statement - notBlankIdent(assgn.(RangeStmt).getValue()) and i = 1 - } or - /** - * A control-flow node that represents the implicit right-hand side of a compound assignment. - * - * For example, the compound assignment `x += 1` has an implicit right-hand side `x + 1`. - */ - MkCompoundAssignRhsNode(CompoundAssignStmt assgn) or - /** - * A control-flow node that represents the `i`th component of a tuple expression `s`. - */ - MkExtractNode(AstNode s, int i) { - // in an assignment `x, y, z = tuple` - exists(Assignment assgn | - s = assgn and - exists(assgn.getRhs()) and - assgn.getNumLhs() > 1 and - exists(assgn.getLhs(i)) - ) - or - // in a declaration `var x, y, z = tuple` - exists(ValueSpec spec | - s = spec and - exists(spec.getInit()) and - spec.getNumName() > 1 and - exists(spec.getNameExpr(i)) - ) - or - // in a `range` statement - exists(RangeStmt rs | s = rs | - exists(rs.getKey()) and i = 0 - or - exists(rs.getValue()) and i = 1 - ) - or - // in a return statement `return f()` where `f` has multiple return values - exists(ReturnStmt ret, SignatureType rettp | - s = ret and - // the return statement has a single expression - exists(ret.getExpr()) and - // but the enclosing function has multiple results - rettp = ret.getEnclosingFunction().getType() and - rettp.getNumResult() > 1 and - exists(rettp.getResultType(i)) - ) - or - // in a call `f(g())` where `g` has multiple return values - exists(CallExpr outer, CallExpr inner | s = outer | - inner = outer.getArgument(0).stripParens() and - outer.getNumArgument() = 1 and - exists(inner.getType().(TupleType).getComponentType(i)) - ) - } or - /** - * A control-flow node that represents the zero value to which a variable without an initializer - * expression is initialized. - */ - MkZeroInitNode(ValueEntity v) { - exists(ValueSpec spec | - not exists(spec.getAnInit()) and - spec.getNameExpr(_) = v.getDeclaration() - ) - or - exists(v.(ResultVariable).getFunction().getBody()) - } or - /** - * A control-flow node that represents a function declaration. - */ - MkFuncDeclNode(FuncDecl fd) or - /** - * A control-flow node that represents a `defer` statement. - */ - MkDeferNode(DeferStmt def) or - /** - * A control-flow node that represents a `go` statement. - */ - MkGoNode(GoStmt go) or - /** - * A control-flow node that represents the fact that `e` is known to evaluate to - * `outcome`. - */ - MkConditionGuardNode(Expr e, Boolean outcome) { isCondRoot(e) } or - /** - * A control-flow node that represents an increment or decrement statement. - */ - MkIncDecNode(IncDecStmt ids) or - /** - * A control-flow node that represents the implicit right-hand side of an increment or decrement statement. - */ - MkIncDecRhs(IncDecStmt ids) or - /** - * A control-flow node that represents the implicit operand 1 of an increment or decrement statement. - */ - MkImplicitOne(IncDecStmt ids) or - /** - * A control-flow node that represents a return from a function. - */ - MkReturnNode(ReturnStmt ret) or - /** - * A control-flow node that represents the implicit write to a named result variable in a return statement. - */ - MkResultWriteNode(ResultVariable var, int i, ReturnStmt ret) { - ret.getEnclosingFunction().getResultVar(i) = var and - exists(ret.getAnExpr()) - } or - /** - * A control-flow node that represents the implicit read of a named result variable upon returning from - * a function (after any deferred calls have been executed). - */ - MkResultReadNode(ResultVariable var) or - /** - * A control-flow node that represents a no-op. - * - * These control-flow nodes correspond to Go statements that have no runtime semantics other than potentially - * influencing control flow: the branching statements `continue`, `break`, `fallthrough` and `goto`; empty - * blocks; empty statements; and import and type declarations. - */ - MkSkipNode(AstNode skip) { - skip instanceof BranchStmt - or - skip instanceof EmptyStmt - or - skip.(PlainBlock).getNumStmt() = 0 - or - skip instanceof ImportDecl - or - skip instanceof TypeDecl - or - pureLvalue(skip) - or - skip.(CaseClause).getNumStmt() = 0 - or - skip.(CommClause).getNumStmt() = 0 - } or - /** - * A control-flow node that represents a `select` operation. - */ - MkSelectNode(SelectStmt sel) or - /** - * A control-flow node that represents a `send` operation. - */ - MkSendNode(SendStmt send) or - /** - * A control-flow node that represents the initialization of a parameter to its corresponding argument. - */ - MkParameterInit(Parameter parm) { exists(parm.getFunction().getBody()) } or - /** - * A control-flow node that represents the argument corresponding to a parameter. - */ - MkArgumentNode(Parameter parm) { exists(parm.getFunction().getBody()) } or - /** - * A control-flow node that represents the initialization of a result variable to its zero value. - */ - MkResultInit(ResultVariable rv) { exists(rv.getFunction().getBody()) } or - /** - * A control-flow node that represents the operation of retrieving the next (key, value) pair in a - * `range` statement, if any. - */ - MkNextNode(RangeStmt rs) or - /** - * A control-flow node that represents the implicit `true` expression in `switch { ... }`. - */ - MkImplicitTrue(ExpressionSwitchStmt stmt) { not exists(stmt.getExpr()) } or - /** - * A control-flow node that represents the implicit comparison or type check performed by - * the `i`th expression of a case clause `cc`. - */ - MkCaseCheckNode(CaseClause cc, int i) { exists(cc.getExpr(i)) } or - /** - * A control-flow node that represents the implicit declaration of the - * variable `lv` in case clause `cc` and its assignment of the value - * `switchExpr` from the guard. This only occurs in case clauses in a type - * switch statement which declares a variable in its guard. - */ - MkTypeSwitchImplicitVariable(CaseClause cc, LocalVariable lv, Expr switchExpr) { - exists(TypeSwitchStmt ts, DefineStmt ds | ds = ts.getAssign() | - cc = ts.getACase() and - lv = cc.getImplicitlyDeclaredVariable() and - switchExpr = ds.getRhs().(TypeAssertExpr).getExpr() - ) - } or - /** - * A control-flow node that represents the implicit lower bound of a slice expression. - */ - MkImplicitLowerSliceBound(SliceExpr sl) { not exists(sl.getLow()) } or - /** - * A control-flow node that represents the implicit upper bound of a simple slice expression. - */ - MkImplicitUpperSliceBound(SliceExpr sl) { not exists(sl.getHigh()) } or - /** - * A control-flow node that represents the implicit max bound of a simple slice expression. - */ - MkImplicitMaxSliceBound(SliceExpr sl) { not exists(sl.getMax()) } or - /** - * A control-flow node that represents the implicit dereference of the base in a field/method - * access, element access, or slice expression. - */ - MkImplicitDeref(Expr e) { - e.getType().getUnderlyingType() instanceof PointerType and - ( - exists(SelectorExpr sel | e = sel.getBase() | - // field accesses through a pointer always implicitly dereference - sel = any(Field f).getAReference() - or - // method accesses only dereference if the receiver is _not_ a pointer - exists(Method m, Type tp | - sel = m.getAReference() and - tp = m.getReceiver().getType().getUnderlyingType() and - not tp instanceof PointerType - ) - ) - or - e = any(IndexExpr ie).getBase() - or - e = any(SliceExpr se).getBase() - ) - } or - /** - * A control-flow node that represents the implicit selection of a field when - * accessing a promoted field. - * - * If that field has a pointer type then this control-flow node also - * represents an implicit dereference of it. - */ - MkImplicitFieldSelection(PromotedSelector e, int i, Field implicitField) { - implicitFieldSelectionForField(e, i, implicitField) or - implicitFieldSelectionForMethod(e, i, implicitField) - } or - /** - * A control-flow node that represents the start of the execution of a function or file. - */ - MkEntryNode(ControlFlow::Root root) or - /** - * A control-flow node that represents the end of the execution of a function or file. - */ - MkExitNode(ControlFlow::Root root) - -/** A representation of the target of a write. */ -newtype TWriteTarget = - /** A write target that is represented explicitly in the AST. */ - MkLhs(TControlFlowNode write, Expr lhs) { - exists(AstNode assgn, int i | write = MkAssignNode(assgn, i) | - lhs = assgn.(Assignment).getLhs(i).stripParens() - or - lhs = assgn.(ValueSpec).getNameExpr(i) - or - exists(RangeStmt rs | rs = assgn | - i = 0 and lhs = rs.getKey().stripParens() - or - i = 1 and lhs = rs.getValue().stripParens() - ) - ) - or - exists(IncDecStmt ids | write = MkIncDecNode(ids) | lhs = ids.getOperand().stripParens()) - or - exists(Parameter parm | write = MkParameterInit(parm) | lhs = parm.getDeclaration()) - or - exists(ResultVariable res | write = MkResultInit(res) | lhs = res.getDeclaration()) - } or - /** A write target for an element in a compound literal, viewed as a field write. */ - MkLiteralElementTarget(MkLiteralElementInitNode elt) or - /** A write target for a returned expression, viewed as a write to the corresponding result variable. */ - MkResultWriteTarget(MkResultWriteNode w) - -/** - * A control-flow node that represents a no-op. - * - * These control-flow nodes correspond to Go statements that have no runtime semantics other than - * potentially influencing control flow: the branching statements `continue`, `break`, - * `fallthrough` and `goto`; empty blocks; empty statements; and import and type declarations. - */ -class SkipNode extends ControlFlow::Node, MkSkipNode { - AstNode skip; - - SkipNode() { this = MkSkipNode(skip) } - - override ControlFlow::Root getRoot() { result.isRootOf(skip) } - - override string toString() { result = "skip" } - - override Location getLocation() { result = skip.getLocation() } -} - -/** - * A control-flow node that represents the start of the execution of a function or file. - */ -class EntryNode extends ControlFlow::Node, MkEntryNode { - ControlFlow::Root root; - - EntryNode() { this = MkEntryNode(root) } - - override ControlFlow::Root getRoot() { result = root } - - override string toString() { result = "entry" } - - override Location getLocation() { result = root.getLocation() } -} - -/** - * A control-flow node that represents the end of the execution of a function or file. - */ -class ExitNode extends ControlFlow::Node, MkExitNode { - ControlFlow::Root root; - - ExitNode() { this = MkExitNode(root) } - - override ControlFlow::Root getRoot() { result = root } - - override string toString() { result = "exit" } - - override Location getLocation() { result = root.getLocation() } -} - -/** - * Provides classes and predicates for computing the control-flow graph. - */ -cached -module CFG { - /** - * The target of a branch statement, which is either the label of a labeled statement or - * the special target `""` referring to the innermost enclosing loop or `switch`. - */ - private class BranchTarget extends string { - BranchTarget() { this = any(LabeledStmt ls).getLabel() or this = "" } - } - - private module BranchTarget { - /** Holds if this is the target of branch statement `stmt` or the label of compound statement `stmt`. */ - BranchTarget of(Stmt stmt) { - exists(BranchStmt bs | bs = stmt | - result = bs.getLabel() - or - not exists(bs.getLabel()) and result = "" - ) - or - exists(LabeledStmt ls | stmt = ls.getStmt() | result = ls.getLabel()) - or - (stmt instanceof LoopStmt or stmt instanceof SwitchStmt or stmt instanceof SelectStmt) and - result = "" - } - } - - private newtype TCompletion = - /** A completion indicating that an expression or statement was evaluated successfully. */ - Done() or - /** - * A completion indicating that an expression was successfully evaluated to Boolean value `b`. - * - * Note that many Boolean expressions are modeled as having completion `Done()` instead. - * Completion `Bool` is only used in contexts where the Boolean value can be determined. - */ - Bool(boolean b) { b = true or b = false } or - /** - * A completion indicating that execution of a (compound) statement ended with a `break` - * statement targeting the given label. - */ - Break(BranchTarget lbl) or - /** - * A completion indicating that execution of a (compound) statement ended with a `continue` - * statement targeting the given label. - */ - Continue(BranchTarget lbl) or - /** - * A completion indicating that execution of a (compound) statement ended with a `fallthrough` - * statement. - */ - Fallthrough() or - /** - * A completion indicating that execution of a (compound) statement ended with a `return` - * statement. - */ - Return() or - /** - * A completion indicating that execution of a statement or expression may have ended with - * a panic being raised. - */ - Panic() - - private Completion normalCompletion() { result.isNormal() } - - private class Completion extends TCompletion { - predicate isNormal() { this = Done() or this = Bool(_) } - - Boolean getOutcome() { this = Done() or this = Bool(result) } - - string toString() { - this = Done() and result = "normal" - or - exists(boolean b | this = Bool(b) | result = b.toString()) - or - exists(BranchTarget lbl | - this = Break(lbl) and result = "break " + lbl - or - this = Continue(lbl) and result = "continue " + lbl - ) - or - this = Fallthrough() and result = "fallthrough" - or - this = Return() and result = "return" - or - this = Panic() and result = "panic" - } - } - - /** - * Holds if `e` should have an evaluation node in the control-flow graph. - * - * Excluded expressions include those not evaluated at runtime (e.g. identifiers, type expressions) - * and some logical expressions that are expressed as control-flow edges rather than having a specific - * evaluation node. - */ - cached - predicate hasEvaluationNode(Expr e) { - // exclude expressions that do not denote a value - not e instanceof TypeExpr and - not e = any(FieldDecl f).getTag() and - not e instanceof KeyValueExpr and - not e = any(SelectorExpr sel).getSelector() and - not e = any(StructLit sl).getKey(_) and - not (e instanceof Ident and not e instanceof ReferenceExpr) and - not (e instanceof SelectorExpr and not e instanceof ReferenceExpr) and - not pureLvalue(e) and - // exclude parentheses, which are purely concrete syntax, and some logical binary expressions - // whose evaluation is implied by control-flow edges without requiring an evaluation node. - not isControlFlowStructural(e) and - // exclude expressions that are not evaluated at runtime - not e = any(ImportSpec is).getPathExpr() and - not e.getParent*() = any(ArrayTypeExpr ate).getLength() and - // sub-expressions of constant expressions are not evaluated (even if they don't look constant - // themselves) - not constRoot(e.getParent+()) - } - - /** - * Holds if `e` is an expression that purely serves grouping or control-flow purposes. - * - * Examples include parenthesized expressions and short-circuiting Boolean expressions used within - * a branch condition (`if` or `for` condition, or as part of a larger boolean expression, e.g. - * in `(x && y) || z`, the `&&` subexpression matches this predicate). - */ - private predicate isControlFlowStructural(Expr e) { - // Some logical binary operators do not need an evaluation node - // (for example, in `if x && y`, we evaluate `x` and then branch straight to either `y` or the - // `else` block, so there is no control-flow step where `x && y` is specifically calculated) - e instanceof LogicalBinaryExpr and - isCond(e) - or - // Purely concrete-syntactic structural expression: - e instanceof ParenExpr - } - - /** - * Gets a constant root, that is, an expression that is constant but whose parent expression is not. - * - * As an exception to the latter, for a control-flow structural expression such as `(c1)` or `c1 && c2` - * where `cn` are constants we still consider the `cn`s to be a constant roots, even though their parent - * expression is also constant. - */ - private predicate constRoot(Expr root) { - exists(Expr c | - c.isConst() and - not c.getParent().(Expr).isConst() and - root = stripStructural(c) - ) - } - - /** - * Strips off any control-flow structural components from `e`. - */ - private Expr stripStructural(Expr e) { - if isControlFlowStructural(e) then result = stripStructural(e.getAChildExpr()) else result = e - } - - private class ControlFlowTree extends AstNode { - predicate firstNode(ControlFlow::Node first) { none() } - - predicate lastNode(ControlFlow::Node last, Completion cmpl) { - // propagate abnormal completion from children - lastNode(this.getAChild(), last, cmpl) and - not cmpl.isNormal() - } - - /** - * Holds if `succ` is a successor of `pred`, ignoring the execution of any - * deferred functions when a function ends. - */ - pragma[nomagic] - predicate succ0(ControlFlow::Node pred, ControlFlow::Node succ) { - exists(int i | - lastNode(this.getChildTreeRanked(i), pred, normalCompletion()) and - firstNode(this.getChildTreeRanked(i + 1), succ) - ) - } - - /** Holds if `succ` is a successor of `pred`. */ - predicate succ(ControlFlow::Node pred, ControlFlow::Node succ) { this.succ0(pred, succ) } - - final ControlFlowTree getChildTreeRanked(int i) { - exists(int j | - result = this.getChildTree(j) and - j = rank[i + 1](int k | exists(this.getChildTree(k))) - ) - } - - ControlFlowTree getFirstChildTree() { result = this.getChildTreeRanked(0) } - - ControlFlowTree getLastChildTree() { - result = max(ControlFlowTree ch, int j | ch = this.getChildTree(j) | ch order by j) - } - - ControlFlowTree getChildTree(int i) { none() } - } - - private class AtomicTree extends ControlFlowTree { - ControlFlow::Node nd; - Completion cmpl; - - AtomicTree() { - exists(Expr e | - e = this and - e.isConst() and - nd = mkExprOrSkipNode(this) - | - if e.isPlatformIndependentConstant() and exists(e.getBoolValue()) - then cmpl = Bool(e.getBoolValue()) - else cmpl = Done() - ) - or - this instanceof Ident and - not this.(Expr).isConst() and - nd = mkExprOrSkipNode(this) and - cmpl = Done() - or - this instanceof BreakStmt and - nd = MkSkipNode(this) and - cmpl = Break(BranchTarget::of(this)) - or - this instanceof ContinueStmt and - nd = MkSkipNode(this) and - cmpl = Continue(BranchTarget::of(this)) - or - this instanceof Decl and - nd = MkSkipNode(this) and - cmpl = Done() - or - this instanceof EmptyStmt and - nd = MkSkipNode(this) and - cmpl = Done() - or - this instanceof FallthroughStmt and - nd = MkSkipNode(this) and - cmpl = Fallthrough() - or - this instanceof FuncLit and - nd = MkExprNode(this) and - cmpl = Done() - or - this instanceof PlainBlock and - nd = MkSkipNode(this) and - cmpl = Done() - or - this instanceof SelectorExpr and - not this.(SelectorExpr).getBase() instanceof ValueExpr and - nd = mkExprOrSkipNode(this) and - cmpl = Done() - or - this instanceof GenericFunctionInstantiationExpr and - nd = MkExprNode(this) and - cmpl = Done() - } - - override predicate firstNode(ControlFlow::Node first) { first = nd } - - override predicate lastNode(ControlFlow::Node last, Completion c) { last = nd and c = cmpl } - } - - abstract private class PostOrderTree extends ControlFlowTree { - abstract ControlFlow::Node getNode(); - - Completion getCompletion() { result = Done() } - - override predicate firstNode(ControlFlow::Node first) { - firstNode(this.getFirstChildTree(), first) - or - not exists(this.getChildTree(_)) and - first = this.getNode() - } - - override predicate lastNode(ControlFlow::Node last, Completion cmpl) { - super.lastNode(last, cmpl) - or - last = this.getNode() and cmpl = this.getCompletion() - } - - pragma[nomagic] - override predicate succ0(ControlFlow::Node pred, ControlFlow::Node succ) { - super.succ0(pred, succ) - or - lastNode(this.getLastChildTree(), pred, normalCompletion()) and - succ = this.getNode() - } - } - - abstract private class PreOrderTree extends ControlFlowTree { - abstract ControlFlow::Node getNode(); - - override predicate firstNode(ControlFlow::Node first) { first = this.getNode() } - - override predicate lastNode(ControlFlow::Node last, Completion cmpl) { - super.lastNode(last, cmpl) - or - lastNode(this.getLastChildTree(), last, cmpl) - or - not exists(this.getChildTree(_)) and - last = this.getNode() and - cmpl = Done() - } - - pragma[nomagic] - override predicate succ0(ControlFlow::Node pred, ControlFlow::Node succ) { - super.succ0(pred, succ) - or - pred = this.getNode() and - firstNode(this.getFirstChildTree(), succ) - } - } - - private class WrapperTree extends ControlFlowTree { - WrapperTree() { - this instanceof ConstDecl or - this instanceof DeclStmt or - this instanceof ExprStmt or - this instanceof KeyValueExpr or - this instanceof LabeledStmt or - this instanceof ParenExpr or - this instanceof PlainBlock or - this instanceof VarDecl - } - - override predicate firstNode(ControlFlow::Node first) { - firstNode(this.getFirstChildTree(), first) - } - - override predicate lastNode(ControlFlow::Node last, Completion cmpl) { - super.lastNode(last, cmpl) - or - lastNode(this.getLastChildTree(), last, cmpl) - or - exists(LoopStmt ls | this = ls.getBody() | - lastNode(this, last, Continue(BranchTarget::of(ls))) and - cmpl = Done() - ) - } - - override ControlFlowTree getChildTree(int i) { - i = 0 and result = this.(DeclStmt).getDecl() - or - i = 0 and result = this.(ExprStmt).getExpr() - or - result = this.(GenDecl).getSpec(i) - or - exists(KeyValueExpr kv | kv = this | - not kv.getLiteral() instanceof StructLit and - i = 0 and - result = kv.getKey() - or - i = 1 and result = kv.getValue() - ) - or - i = 0 and result = this.(LabeledStmt).getStmt() - or - i = 0 and result = this.(ParenExpr).getExpr() - or - result = this.(PlainBlock).getStmt(i) - } - } - - private class AssignmentTree extends ControlFlowTree { - AssignmentTree() { - this instanceof Assignment or - this instanceof ValueSpec - } - - Expr getLhs(int i) { - result = this.(Assignment).getLhs(i) or - result = this.(ValueSpec).getNameExpr(i) - } - - int getNumLhs() { - result = this.(Assignment).getNumLhs() or - result = this.(ValueSpec).getNumName() - } - - Expr getRhs(int i) { - result = this.(Assignment).getRhs(i) or - result = this.(ValueSpec).getInit(i) - } - - int getNumRhs() { - result = this.(Assignment).getNumRhs() or - result = this.(ValueSpec).getNumInit() - } - - predicate isExtractingAssign() { this.getNumRhs() = 1 and this.getNumLhs() > 1 } - - override predicate firstNode(ControlFlow::Node first) { - not this instanceof RecvStmt and - firstNode(this.getLhs(0), first) - } - - override predicate lastNode(ControlFlow::Node last, Completion cmpl) { - ControlFlowTree.super.lastNode(last, cmpl) - or - ( - last = max(int i | | this.epilogueNode(i) order by i) - or - not exists(this.epilogueNode(_)) and - lastNode(this.getLastSubExprInEvalOrder(), last, normalCompletion()) - ) and - cmpl = Done() - } - - pragma[nomagic] - override predicate succ0(ControlFlow::Node pred, ControlFlow::Node succ) { - ControlFlowTree.super.succ0(pred, succ) - or - exists(int i | lastNode(this.getLhs(i), pred, normalCompletion()) | - firstNode(this.getLhs(i + 1), succ) - or - not this instanceof RecvStmt and - i = this.getNumLhs() - 1 and - ( - firstNode(this.getRhs(0), succ) - or - not exists(this.getRhs(_)) and - succ = this.epilogueNodeRanked(0) - ) - ) - or - exists(int i | - lastNode(this.getRhs(i), pred, normalCompletion()) and - firstNode(this.getRhs(i + 1), succ) - ) - or - not this instanceof RecvStmt and - lastNode(this.getRhs(this.getNumRhs() - 1), pred, normalCompletion()) and - succ = this.epilogueNodeRanked(0) - or - exists(int i | - pred = this.epilogueNodeRanked(i) and - succ = this.epilogueNodeRanked(i + 1) - ) - } - - ControlFlow::Node epilogueNodeRanked(int i) { - exists(int j | - result = this.epilogueNode(j) and - j = rank[i + 1](int k | exists(this.epilogueNode(k))) - ) - } - - private Expr getSubExprInEvalOrder(int evalOrder) { - if evalOrder < this.getNumLhs() - then result = this.getLhs(evalOrder) - else result = this.getRhs(evalOrder - this.getNumLhs()) - } - - private Expr getLastSubExprInEvalOrder() { - result = max(int i | | this.getSubExprInEvalOrder(i) order by i) - } - - private ControlFlow::Node epilogueNode(int i) { - i = -1 and - result = MkCompoundAssignRhsNode(this) - or - exists(int j | - result = MkExtractNode(this, j) and - i = 2 * j - or - result = MkZeroInitNode(any(ValueEntity v | this.getLhs(j) = v.getDeclaration())) and - i = 2 * j - or - result = MkAssignNode(this, j) and - i = 2 * j + 1 - ) - } - } - - private class BinaryExprTree extends PostOrderTree, BinaryExpr { - override ControlFlow::Node getNode() { result = MkExprNode(this) } - - private predicate equalityTestMayPanic() { - this instanceof EqualityTestExpr and - exists(Type t | - t = this.getAnOperand().getType().getUnderlyingType() and - ( - t instanceof InterfaceType or // panic due to comparison of incomparable interface values - t instanceof StructType or // may contain an interface-typed field - t instanceof ArrayType // may be an array of interface values - ) - ) - } - - override Completion getCompletion() { - result = PostOrderTree.super.getCompletion() - or - // runtime panic due to division by zero or comparison of incomparable interface values - (this instanceof DivExpr or this.equalityTestMayPanic()) and - not this.(Expr).isConst() and - result = Panic() - } - - override ControlFlowTree getChildTree(int i) { - i = 0 and result = this.getLeftOperand() - or - i = 1 and result = this.getRightOperand() - } - } - - private class LogicalBinaryExprTree extends BinaryExprTree, LogicalBinaryExpr { - boolean shortCircuit; - - LogicalBinaryExprTree() { - this instanceof LandExpr and shortCircuit = false - or - this instanceof LorExpr and shortCircuit = true - } - - private ControlFlow::Node getGuard(boolean outcome) { - result = MkConditionGuardNode(this.getLeftOperand(), outcome) - } - - override predicate lastNode(ControlFlow::Node last, Completion cmpl) { - lastNode(this.getAnOperand(), last, cmpl) and - not cmpl.isNormal() - or - if isCond(this) - then ( - last = this.getGuard(shortCircuit) and - cmpl = Bool(shortCircuit) - or - lastNode(this.getRightOperand(), last, cmpl) - ) else ( - last = MkExprNode(this) and - cmpl = Done() - ) - } - - pragma[nomagic] - override predicate succ0(ControlFlow::Node pred, ControlFlow::Node succ) { - exists(Completion lcmpl | - lastNode(this.getLeftOperand(), pred, lcmpl) and - succ = this.getGuard(lcmpl.getOutcome()) - ) - or - pred = this.getGuard(shortCircuit.booleanNot()) and - firstNode(this.getRightOperand(), succ) - or - not isCond(this) and - ( - pred = this.getGuard(shortCircuit) and - succ = MkExprNode(this) - or - exists(Completion rcmpl | - lastNode(this.getRightOperand(), pred, rcmpl) and - rcmpl.isNormal() and - succ = MkExprNode(this) - ) - ) - } - } - - private class CallExprTree extends PostOrderTree, CallExpr { - private predicate isSpecial() { - this = any(DeferStmt defer).getCall() or - this = any(GoStmt go).getCall() - } - - override ControlFlow::Node getNode() { - not this.isSpecial() and - result = MkExprNode(this) - } - - override Completion getCompletion() { - (not exists(this.getTarget()) or this.getTarget().mayReturnNormally()) and - result = Done() - or - (not exists(this.getTarget()) or this.getTarget().mayPanic()) and - result = Panic() - } - - override ControlFlowTree getChildTree(int i) { - i = 0 and result = this.getCalleeExpr() - or - result = this.getArgument(i - 1) and - // calls to `make` and `new` can have type expressions as arguments - not result instanceof TypeExpr - } - - pragma[nomagic] - override predicate succ0(ControlFlow::Node pred, ControlFlow::Node succ) { - // interpose implicit argument destructuring nodes between last argument - // and call itself; this is for cases like `f(g())` where `g` has multiple - // results - exists(ControlFlow::Node mid | PostOrderTree.super.succ0(pred, mid) | - if mid = this.getNode() then succ = this.getEpilogueNode(0) else succ = mid - ) - or - exists(int i | - pred = this.getEpilogueNode(i) and - succ = this.getEpilogueNode(i + 1) - ) - } - - private ControlFlow::Node getEpilogueNode(int i) { - result = MkExtractNode(this, i) - or - i = max(int j | exists(MkExtractNode(this, j))) + 1 and - result = this.getNode() - or - not exists(MkExtractNode(this, _)) and - i = 0 and - result = this.getNode() - } - - override predicate lastNode(ControlFlow::Node last, Completion cmpl) { - PostOrderTree.super.lastNode(last, cmpl) - or - this.isSpecial() and - lastNode(this.getLastChildTree(), last, cmpl) - } - } - - private class CaseClauseTree extends ControlFlowTree, CaseClause { - private ControlFlow::Node getExprStart(int i) { - firstNode(this.getExpr(i), result) - or - this.getExpr(i) instanceof TypeExpr and - result = MkCaseCheckNode(this, i) - } - - ControlFlow::Node getExprEnd(int i, Boolean outcome) { - exists(Expr e | e = this.getExpr(i) | - result = MkConditionGuardNode(e, outcome) - or - not exists(MkConditionGuardNode(e, _)) and - result = MkCaseCheckNode(this, i) - ) - } - - private ControlFlow::Node getBodyStart() { - firstNode(this.getStmt(0), result) or result = MkSkipNode(this) - } - - override predicate firstNode(ControlFlow::Node first) { - first = this.getExprStart(0) - or - not exists(this.getAnExpr()) and - first = MkTypeSwitchImplicitVariable(this, _, _) - or - not exists(this.getAnExpr()) and - not exists(MkTypeSwitchImplicitVariable(this, _, _)) and - first = this.getBodyStart() - } - - override predicate lastNode(ControlFlow::Node last, Completion cmpl) { - ControlFlowTree.super.lastNode(last, cmpl) - or - // TODO: shouldn't be here - last = this.getExprEnd(this.getNumExpr() - 1, false) and - cmpl = Bool(false) - or - last = MkSkipNode(this) and - cmpl = Done() - or - lastNode(this.getStmt(this.getNumStmt() - 1), last, cmpl) - } - - pragma[nomagic] - override predicate succ0(ControlFlow::Node pred, ControlFlow::Node succ) { - ControlFlowTree.super.succ0(pred, succ) - or - pred = MkTypeSwitchImplicitVariable(this, _, _) and - succ = this.getBodyStart() - or - exists(int i | - lastNode(this.getExpr(i), pred, normalCompletion()) and - succ = MkCaseCheckNode(this, i) - or - // visit guard node if there is one - pred = MkCaseCheckNode(this, i) and - succ = this.getExprEnd(i, _) and - succ != pred // this avoids self-loops if there isn't a guard node - or - pred = this.getExprEnd(i, false) and - succ = this.getExprStart(i + 1) - or - this.isPassingEdge(i, pred, succ, _) - ) - } - - predicate isPassingEdge(int i, ControlFlow::Node pred, ControlFlow::Node succ, Expr testExpr) { - pred = this.getExprEnd(i, true) and - testExpr = this.getExpr(i) and - ( - succ = MkTypeSwitchImplicitVariable(this, _, _) - or - not exists(MkTypeSwitchImplicitVariable(this, _, _)) and - succ = this.getBodyStart() - ) - } - - override ControlFlowTree getChildTree(int i) { result = this.getStmt(i) } - } - - private class CommClauseTree extends ControlFlowTree, CommClause { - override predicate firstNode(ControlFlow::Node first) { firstNode(this.getComm(), first) } - - override predicate lastNode(ControlFlow::Node last, Completion cmpl) { - ControlFlowTree.super.lastNode(last, cmpl) - or - last = MkSkipNode(this) and - cmpl = Done() - or - lastNode(this.getStmt(this.getNumStmt() - 1), last, cmpl) - } - - override ControlFlowTree getChildTree(int i) { result = this.getStmt(i) } - } - - private class CompositeLiteralTree extends ControlFlowTree, CompositeLit { - private ControlFlow::Node getElementInit(int i) { - result = MkLiteralElementInitNode(this.getElement(i)) - } - - private ControlFlow::Node getElementStart(int i) { - exists(Expr elt | elt = this.getElement(i) | - result = MkImplicitLiteralElementIndex(elt) - or - (elt instanceof KeyValueExpr or this instanceof StructLit) and - firstNode(this.getElement(i), result) - ) - } - - override predicate firstNode(ControlFlow::Node first) { first = MkExprNode(this) } - - override predicate lastNode(ControlFlow::Node last, Completion cmpl) { - ControlFlowTree.super.lastNode(last, cmpl) - or - last = this.getElementInit(this.getNumElement() - 1) and - cmpl = Done() - or - not exists(this.getElement(_)) and - last = MkExprNode(this) and - cmpl = Done() - } - - pragma[nomagic] - override predicate succ0(ControlFlow::Node pred, ControlFlow::Node succ) { - this.firstNode(pred) and - succ = this.getElementStart(0) - or - exists(int i | - pred = MkImplicitLiteralElementIndex(this.getElement(i)) and - firstNode(this.getElement(i), succ) - or - lastNode(this.getElement(i), pred, normalCompletion()) and - succ = this.getElementInit(i) - or - pred = this.getElementInit(i) and - succ = this.getElementStart(i + 1) - ) - } - } - - private class ConversionExprTree extends PostOrderTree, ConversionExpr { - override Completion getCompletion() { - // conversions of a slice to an array pointer are the only kind that may panic - this.getType().(PointerType).getBaseType() instanceof ArrayType and - result = Panic() - or - result = Done() - } - - override ControlFlow::Node getNode() { result = MkExprNode(this) } - - override ControlFlowTree getChildTree(int i) { i = 0 and result = this.getOperand() } - } - - private class DeferStmtTree extends PostOrderTree, DeferStmt { - override ControlFlow::Node getNode() { result = MkDeferNode(this) } - - override ControlFlowTree getChildTree(int i) { i = 0 and result = this.getCall() } - } - - private class FuncDeclTree extends PostOrderTree, FuncDecl { - override ControlFlow::Node getNode() { result = MkFuncDeclNode(this) } - - override ControlFlowTree getChildTree(int i) { i = 0 and result = this.getNameExpr() } - - override predicate lastNode(ControlFlow::Node last, Completion cmpl) { - // override to prevent panic propagation out of function declarations - last = this.getNode() and cmpl = Done() - } - } - - private class GoStmtTree extends PostOrderTree, GoStmt { - override ControlFlow::Node getNode() { result = MkGoNode(this) } - - override ControlFlowTree getChildTree(int i) { i = 0 and result = this.getCall() } - } - - private class IfStmtTree extends ControlFlowTree, IfStmt { - private ControlFlow::Node getGuard(boolean outcome) { - result = MkConditionGuardNode(this.getCond(), outcome) - } - - override predicate firstNode(ControlFlow::Node first) { - firstNode(this.getInit(), first) - or - not exists(this.getInit()) and - firstNode(this.getCond(), first) - } - - override predicate lastNode(ControlFlow::Node last, Completion cmpl) { - ControlFlowTree.super.lastNode(last, cmpl) - or - lastNode(this.getThen(), last, cmpl) - or - lastNode(this.getElse(), last, cmpl) - or - not exists(this.getElse()) and - last = this.getGuard(false) and - cmpl = Done() - } - - pragma[nomagic] - override predicate succ0(ControlFlow::Node pred, ControlFlow::Node succ) { - lastNode(this.getInit(), pred, normalCompletion()) and - firstNode(this.getCond(), succ) - or - exists(Completion condCmpl | - lastNode(this.getCond(), pred, condCmpl) and - succ = MkConditionGuardNode(this.getCond(), condCmpl.getOutcome()) - ) - or - pred = this.getGuard(true) and - firstNode(this.getThen(), succ) - or - pred = this.getGuard(false) and - firstNode(this.getElse(), succ) - } - } - - private class IndexExprTree extends ControlFlowTree, IndexExpr { - override predicate firstNode(ControlFlow::Node first) { firstNode(this.getBase(), first) } - - override predicate lastNode(ControlFlow::Node last, Completion cmpl) { - ControlFlowTree.super.lastNode(last, cmpl) - or - // panic due to `nil` dereference - last = MkImplicitDeref(this.getBase()) and - cmpl = Panic() - or - last = mkExprOrSkipNode(this) and - (cmpl = Done() or cmpl = Panic()) - } - - pragma[nomagic] - override predicate succ0(ControlFlow::Node pred, ControlFlow::Node succ) { - lastNode(this.getBase(), pred, normalCompletion()) and - ( - succ = MkImplicitDeref(this.getBase()) - or - not exists(MkImplicitDeref(this.getBase())) and - firstNode(this.getIndex(), succ) - ) - or - pred = MkImplicitDeref(this.getBase()) and - firstNode(this.getIndex(), succ) - or - lastNode(this.getIndex(), pred, normalCompletion()) and - succ = mkExprOrSkipNode(this) - } - } - - private class LoopTree extends ControlFlowTree, LoopStmt { - BranchTarget getLabel() { result = BranchTarget::of(this) } - - override predicate lastNode(ControlFlow::Node last, Completion cmpl) { - exists(Completion inner | lastNode(this.getBody(), last, inner) and not inner.isNormal() | - if inner = Break(this.getLabel()) - then cmpl = Done() - else ( - not inner = Continue(this.getLabel()) and - cmpl = inner - ) - ) - } - } - - private class FileTree extends ControlFlowTree, File { - FileTree() { exists(this.getADecl()) } - - override predicate lastNode(ControlFlow::Node last, Completion cmpl) { none() } - - pragma[nomagic] - override predicate succ0(ControlFlow::Node pred, ControlFlow::Node succ) { - ControlFlowTree.super.succ0(pred, succ) - or - pred = MkEntryNode(this) and - firstNode(this.getDecl(0), succ) - or - exists(int i, Completion inner | lastNode(this.getDecl(i), pred, inner) | - not inner.isNormal() - or - i = this.getNumDecl() - 1 - ) and - succ = MkExitNode(this) - } - - override ControlFlowTree getChildTree(int i) { result = this.getDecl(i) } - } - - private class ForTree extends LoopTree, ForStmt { - private ControlFlow::Node getGuard(boolean outcome) { - result = MkConditionGuardNode(this.getCond(), outcome) - } - - override predicate firstNode(ControlFlow::Node first) { - firstNode(this.getFirstChildTree(), first) - } - - override predicate lastNode(ControlFlow::Node last, Completion cmpl) { - LoopTree.super.lastNode(last, cmpl) - or - lastNode(this.getInit(), last, cmpl) and - not cmpl.isNormal() - or - lastNode(this.getCond(), last, cmpl) and - not cmpl.isNormal() - or - lastNode(this.getPost(), last, cmpl) and - not cmpl.isNormal() - or - last = this.getGuard(false) and - cmpl = Done() - } - - override ControlFlowTree getChildTree(int i) { - i = 0 and result = this.getInit() - or - i = 1 and result = this.getCond() - or - i = 2 and result = this.getBody() - or - i = 3 and result = this.getPost() - or - i = 4 and result = this.getCond() - or - i = 5 and result = this.getBody() - } - - pragma[nomagic] - override predicate succ0(ControlFlow::Node pred, ControlFlow::Node succ) { - exists(int i, ControlFlowTree predTree, Completion cmpl | - predTree = this.getChildTreeRanked(i) and - lastNode(predTree, pred, cmpl) and - cmpl.isNormal() - | - if predTree = this.getCond() - then succ = this.getGuard(cmpl.getOutcome()) - else firstNode(this.getChildTreeRanked(i + 1), succ) - ) - or - pred = this.getGuard(true) and - firstNode(this.getBody(), succ) - } - } - - private class FuncDefTree extends ControlFlowTree, FuncDef { - FuncDefTree() { exists(this.getBody()) } - - pragma[noinline] - private MkEntryNode getEntry() { result = MkEntryNode(this) } - - private Parameter getParameterRanked(int i) { - result = rank[i + 1](Parameter p, int j | p = this.getParameter(j) | p order by j) - } - - private ControlFlow::Node getPrologueNode(int i) { - i = -1 and result = this.getEntry() - or - exists(int numParm, int numRes | - numParm = count(this.getParameter(_)) and - numRes = count(this.getResultVar(_)) - | - exists(int j, Parameter p | p = this.getParameterRanked(j) | - i = 2 * j and result = MkArgumentNode(p) - or - i = 2 * j + 1 and result = MkParameterInit(p) - ) - or - exists(int j, ResultVariable v | v = this.getResultVar(j) | - i = 2 * numParm + 2 * j and - result = MkZeroInitNode(v) - or - i = 2 * numParm + 2 * j + 1 and - result = MkResultInit(v) - ) - or - i = 2 * numParm + 2 * numRes and - firstNode(this.getBody(), result) - ) - } - - private ControlFlow::Node getEpilogueNode(int i) { - result = MkResultReadNode(this.getResultVar(i)) - or - i = count(this.getAResultVar()) and - result = MkExitNode(this) - } - - pragma[noinline] - private predicate firstDefer(ControlFlow::Node nd) { - exists(DeferStmt defer | - nd = MkExprNode(defer.getCall()) and - // `defer` can be the first `defer` statement executed - // there is always a predecessor node because the `defer`'s call is always - // evaluated before the defer statement itself - MkDeferNode(defer) = succ0(notDeferSucc0*(this.getEntry())) - ) - } - - override predicate lastNode(ControlFlow::Node last, Completion cmpl) { none() } - - pragma[nomagic] - override predicate succ0(ControlFlow::Node pred, ControlFlow::Node succ) { - exists(int i | - pred = this.getPrologueNode(i) and - succ = this.getPrologueNode(i + 1) - ) - or - exists(GotoStmt goto, LabeledStmt ls | - pred = MkSkipNode(goto) and - this = goto.getEnclosingFunction() and - this = ls.getEnclosingFunction() and - goto.getLabel() = ls.getLabel() and - firstNode(ls, succ) - ) - or - exists(int i | - pred = this.getEpilogueNode(i) and - succ = this.getEpilogueNode(i + 1) - ) - } - - override predicate succ(ControlFlow::Node pred, ControlFlow::Node succ) { - this.succ0(pred, succ) - or - exists(Completion cmpl | - lastNode(this.getBody(), pred, cmpl) and - // last node of function body can be reached without going through a `defer` statement - pred = notDeferSucc0*(this.getEntry()) - | - // panic goes directly to exit, non-panic reads result variables first - if cmpl = Panic() then succ = MkExitNode(this) else succ = this.getEpilogueNode(0) - ) - or - lastNode(this.getBody(), pred, _) and - exists(DeferStmt defer | defer = this.getADeferStmt() | - succ = MkExprNode(defer.getCall()) and - // the last `DeferStmt` executed before pred is this `defer` - pred = notDeferSucc0*(MkDeferNode(defer)) - ) - or - exists(DeferStmt predDefer, DeferStmt succDefer | - predDefer = this.getADeferStmt() and - succDefer = this.getADeferStmt() - | - // reversed because `defer`s are executed in LIFO order - MkDeferNode(predDefer) = nextDefer(MkDeferNode(succDefer)) and - pred = MkExprNode(predDefer.getCall()) and - succ = MkExprNode(succDefer.getCall()) - ) - or - this.firstDefer(pred) and - ( - // conservatively assume that we might either panic (and hence skip the result reads) - // or not - succ = MkExitNode(this) - or - succ = this.getEpilogueNode(0) - ) - } - } - - private class GotoTree extends ControlFlowTree, GotoStmt { - override predicate firstNode(ControlFlow::Node first) { first = MkSkipNode(this) } - } - - private class IncDecTree extends ControlFlowTree, IncDecStmt { - override predicate firstNode(ControlFlow::Node first) { firstNode(this.getOperand(), first) } - - override predicate lastNode(ControlFlow::Node last, Completion cmpl) { - ControlFlowTree.super.lastNode(last, cmpl) - or - last = MkIncDecNode(this) and - cmpl = Done() - } - - pragma[nomagic] - override predicate succ0(ControlFlow::Node pred, ControlFlow::Node succ) { - lastNode(this.getOperand(), pred, normalCompletion()) and - succ = MkImplicitOne(this) - or - pred = MkImplicitOne(this) and - succ = MkIncDecRhs(this) - or - pred = MkIncDecRhs(this) and - succ = MkIncDecNode(this) - } - } - - private class RangeTree extends LoopTree, RangeStmt { - override predicate firstNode(ControlFlow::Node first) { firstNode(this.getDomain(), first) } - - override predicate lastNode(ControlFlow::Node last, Completion cmpl) { - LoopTree.super.lastNode(last, cmpl) - or - last = MkNextNode(this) and - cmpl = Done() - or - lastNode(this.getKey(), last, cmpl) and - not cmpl.isNormal() - or - lastNode(this.getValue(), last, cmpl) and - not cmpl.isNormal() - or - lastNode(this.getDomain(), last, cmpl) and - not cmpl.isNormal() - } - - pragma[nomagic] - override predicate succ0(ControlFlow::Node pred, ControlFlow::Node succ) { - lastNode(this.getDomain(), pred, normalCompletion()) and - succ = MkNextNode(this) - or - pred = MkNextNode(this) and - ( - firstNode(this.getKey(), succ) - or - not exists(this.getKey()) and - firstNode(this.getBody(), succ) - ) - or - lastNode(this.getKey(), pred, normalCompletion()) and - ( - firstNode(this.getValue(), succ) - or - not exists(this.getValue()) and - succ = MkExtractNode(this, 0) - ) - or - lastNode(this.getValue(), pred, normalCompletion()) and - succ = MkExtractNode(this, 0) - or - pred = MkExtractNode(this, 0) and - ( - if exists(this.getValue()) - then succ = MkExtractNode(this, 1) - else - if exists(MkAssignNode(this, 0)) - then succ = MkAssignNode(this, 0) - else - if exists(MkAssignNode(this, 1)) - then succ = MkAssignNode(this, 1) - else firstNode(this.getBody(), succ) - ) - or - pred = MkExtractNode(this, 1) and - ( - if exists(MkAssignNode(this, 0)) - then succ = MkAssignNode(this, 0) - else - if exists(MkAssignNode(this, 1)) - then succ = MkAssignNode(this, 1) - else firstNode(this.getBody(), succ) - ) - or - pred = MkAssignNode(this, 0) and - ( - if exists(MkAssignNode(this, 1)) - then succ = MkAssignNode(this, 1) - else firstNode(this.getBody(), succ) - ) - or - pred = MkAssignNode(this, 1) and - firstNode(this.getBody(), succ) - or - exists(Completion inner | - lastNode(this.getBody(), pred, inner) and - (inner.isNormal() or inner = Continue(BranchTarget::of(this))) and - succ = MkNextNode(this) - ) - } - } - - private class RecvStmtTree extends ControlFlowTree, RecvStmt { - override predicate firstNode(ControlFlow::Node first) { - firstNode(this.getExpr().getOperand(), first) - } - } - - private class ReturnStmtTree extends PostOrderTree, ReturnStmt { - override ControlFlow::Node getNode() { result = MkReturnNode(this) } - - override Completion getCompletion() { result = Return() } - - pragma[nomagic] - override predicate succ0(ControlFlow::Node pred, ControlFlow::Node succ) { - exists(int i | - lastNode(this.getExpr(i), pred, normalCompletion()) and - succ = this.complete(i) - or - pred = MkExtractNode(this, i) and - succ = this.after(i) - or - pred = MkResultWriteNode(_, i, this) and - succ = this.next(i) - ) - } - - private ControlFlow::Node complete(int i) { - result = MkExtractNode(this, i) - or - not exists(MkExtractNode(this, _)) and - result = this.after(i) - } - - private ControlFlow::Node after(int i) { - result = MkResultWriteNode(_, i, this) - or - not exists(MkResultWriteNode(_, i, this)) and - result = this.next(i) - } - - private ControlFlow::Node next(int i) { - firstNode(this.getExpr(i + 1), result) - or - exists(MkExtractNode(this, _)) and - result = this.complete(i + 1) - or - i + 1 = this.getEnclosingFunction().getType().getNumResult() and - result = this.getNode() - } - - override ControlFlowTree getChildTree(int i) { result = this.getExpr(i) } - } - - private class SelectStmtTree extends ControlFlowTree, SelectStmt { - private BranchTarget getLabel() { result = BranchTarget::of(this) } - - override predicate firstNode(ControlFlow::Node first) { - firstNode(this.getNonDefaultCommClause(0), first) - or - this.getNumNonDefaultCommClause() = 0 and - first = MkSelectNode(this) - } - - override predicate lastNode(ControlFlow::Node last, Completion cmpl) { - exists(Completion inner | lastNode(this.getACommClause(), last, inner) | - if inner = Break(this.getLabel()) then cmpl = Done() else cmpl = inner - ) - } - - pragma[nomagic] - override predicate succ0(ControlFlow::Node pred, ControlFlow::Node succ) { - ControlFlowTree.super.succ0(pred, succ) - or - exists(CommClause cc, int i, Stmt comm | - cc = this.getNonDefaultCommClause(i) and - comm = cc.getComm() and - ( - comm instanceof RecvStmt and - lastNode(comm.(RecvStmt).getExpr().getOperand(), pred, normalCompletion()) - or - comm instanceof SendStmt and - lastNode(comm.(SendStmt).getValue(), pred, normalCompletion()) - ) - | - firstNode(this.getNonDefaultCommClause(i + 1), succ) - or - i = this.getNumNonDefaultCommClause() - 1 and - succ = MkSelectNode(this) - ) - or - pred = MkSelectNode(this) and - exists(CommClause cc, Stmt comm | - cc = this.getNonDefaultCommClause(_) and comm = cc.getComm() - | - comm instanceof RecvStmt and - succ = MkExprNode(comm.(RecvStmt).getExpr()) - or - comm instanceof SendStmt and - succ = MkSendNode(comm) - ) - or - pred = MkSelectNode(this) and - exists(CommClause cc | cc = this.getDefaultCommClause() | - firstNode(cc.getStmt(0), succ) - or - succ = MkSkipNode(cc) - ) - or - exists(CommClause cc, RecvStmt recv | cc = this.getCommClause(_) and recv = cc.getComm() | - pred = MkExprNode(recv.getExpr()) and - ( - firstNode(recv.getLhs(0), succ) - or - not exists(recv.getLhs(0)) and - (firstNode(cc.getStmt(0), succ) or succ = MkSkipNode(cc)) - ) - or - lastNode(recv.getLhs(0), pred, normalCompletion()) and - not exists(recv.getLhs(1)) and - ( - succ = MkAssignNode(recv, 0) - or - not exists(MkAssignNode(recv, 0)) and - (firstNode(cc.getStmt(0), succ) or succ = MkSkipNode(cc)) - ) - or - lastNode(recv.getLhs(1), pred, normalCompletion()) and - succ = MkExtractNode(recv, 0) - or - ( - pred = MkAssignNode(recv, 0) and - not exists(MkExtractNode(recv, 1)) - or - pred = MkExtractNode(recv, 1) and - not exists(MkAssignNode(recv, 1)) - or - pred = MkAssignNode(recv, 1) - ) and - (firstNode(cc.getStmt(0), succ) or succ = MkSkipNode(cc)) - ) - or - exists(CommClause cc, SendStmt ss | - cc = this.getCommClause(_) and - ss = cc.getComm() and - pred = MkSendNode(ss) - | - firstNode(cc.getStmt(0), succ) - or - succ = MkSkipNode(cc) - ) - } - } - - private class SelectorExprTree extends ControlFlowTree, SelectorExpr { - SelectorExprTree() { this.getBase() instanceof ValueExpr } - - override predicate firstNode(ControlFlow::Node first) { firstNode(this.getBase(), first) } - - override predicate lastNode(ControlFlow::Node last, Completion cmpl) { - ControlFlowTree.super.lastNode(last, cmpl) - or - // panic due to `nil` dereference - last = MkImplicitDeref(this.getBase()) and - cmpl = Panic() - or - last = mkExprOrSkipNode(this) and - cmpl = Done() - } - - pragma[nomagic] - override predicate succ0(ControlFlow::Node pred, ControlFlow::Node succ) { - exists(int i | pred = this.getStepWithRank(i) and succ = this.getStepWithRank(i + 1)) - } - - private ControlFlow::Node getStepOrdered(int i) { - i = -2 and lastNode(this.getBase(), result, normalCompletion()) - or - i = -1 and result = MkImplicitDeref(this.getBase()) - or - exists(int maxIndex | - maxIndex = max(int k | k = 0 or exists(MkImplicitFieldSelection(this, k, _))) - | - result = MkImplicitFieldSelection(this, maxIndex - i, _) - or - i = maxIndex and - result = mkExprOrSkipNode(this) - ) - } - - private ControlFlow::Node getStepWithRank(int i) { - exists(int j | - result = this.getStepOrdered(j) and - j = rank[i + 1](int k | exists(this.getStepOrdered(k))) - ) - } - } - - private class SendStmtTree extends ControlFlowTree, SendStmt { - override predicate firstNode(ControlFlow::Node first) { firstNode(this.getChannel(), first) } - - override predicate lastNode(ControlFlow::Node last, Completion cmpl) { - ControlFlowTree.super.lastNode(last, cmpl) - or - last = MkSendNode(this) and - (cmpl = Done() or cmpl = Panic()) - } - - pragma[nomagic] - override predicate succ0(ControlFlow::Node pred, ControlFlow::Node succ) { - ControlFlowTree.super.succ0(pred, succ) - or - not this = any(CommClause cc).getComm() and - lastNode(this.getValue(), pred, normalCompletion()) and - succ = MkSendNode(this) - } - - override ControlFlowTree getChildTree(int i) { - i = 0 and result = this.getChannel() - or - i = 1 and result = this.getValue() - } - } - - private class SliceExprTree extends ControlFlowTree, SliceExpr { - override predicate firstNode(ControlFlow::Node first) { firstNode(this.getBase(), first) } - - override predicate lastNode(ControlFlow::Node last, Completion cmpl) { - ControlFlowTree.super.lastNode(last, cmpl) - or - // panic due to `nil` dereference - last = MkImplicitDeref(this.getBase()) and - cmpl = Panic() - or - last = MkExprNode(this) and - (cmpl = Done() or cmpl = Panic()) - } - - pragma[nomagic] - override predicate succ0(ControlFlow::Node pred, ControlFlow::Node succ) { - ControlFlowTree.super.succ0(pred, succ) - or - lastNode(this.getBase(), pred, normalCompletion()) and - ( - succ = MkImplicitDeref(this.getBase()) - or - not exists(MkImplicitDeref(this.getBase())) and - (firstNode(this.getLow(), succ) or succ = MkImplicitLowerSliceBound(this)) - ) - or - pred = MkImplicitDeref(this.getBase()) and - (firstNode(this.getLow(), succ) or succ = MkImplicitLowerSliceBound(this)) - or - (lastNode(this.getLow(), pred, normalCompletion()) or pred = MkImplicitLowerSliceBound(this)) and - (firstNode(this.getHigh(), succ) or succ = MkImplicitUpperSliceBound(this)) - or - (lastNode(this.getHigh(), pred, normalCompletion()) or pred = MkImplicitUpperSliceBound(this)) and - (firstNode(this.getMax(), succ) or succ = MkImplicitMaxSliceBound(this)) - or - (lastNode(this.getMax(), pred, normalCompletion()) or pred = MkImplicitMaxSliceBound(this)) and - succ = MkExprNode(this) - } - } - - private class StarExprTree extends PostOrderTree, StarExpr { - override ControlFlow::Node getNode() { result = mkExprOrSkipNode(this) } - - override Completion getCompletion() { result = Done() or result = Panic() } - - override ControlFlowTree getChildTree(int i) { i = 0 and result = this.getBase() } - } - - private class SwitchTree extends ControlFlowTree, SwitchStmt { - override predicate firstNode(ControlFlow::Node first) { - firstNode(this.getInit(), first) - or - not exists(this.getInit()) and - ( - firstNode(this.(ExpressionSwitchStmt).getExpr(), first) - or - first = MkImplicitTrue(this) - or - firstNode(this.(TypeSwitchStmt).getTest(), first) - ) - } - - override predicate lastNode(ControlFlow::Node last, Completion cmpl) { - lastNode(this.getInit(), last, cmpl) and - not cmpl.isNormal() - or - ( - lastNode(this.(ExpressionSwitchStmt).getExpr(), last, cmpl) - or - lastNode(this.(TypeSwitchStmt).getTest(), last, cmpl) - ) and - ( - not cmpl.isNormal() - or - not exists(this.getDefault()) - ) - or - last = MkImplicitTrue(this) and - cmpl = Bool(true) and - this.getNumCase() = 0 - or - exists(CaseClause cc, int i, Completion inner | - cc = this.getCase(i) and lastNode(cc, last, inner) - | - not exists(this.getDefault()) and - i = this.getNumCase() - 1 and - last = cc.(CaseClauseTree).getExprEnd(cc.getNumExpr() - 1, false) and - inner.isNormal() and - cmpl = inner - or - not last = cc.(CaseClauseTree).getExprEnd(_, _) and - inner.isNormal() and - cmpl = inner - or - if inner = Break(BranchTarget::of(this)) - then cmpl = Done() - else ( - not inner.isNormal() and inner != Fallthrough() and cmpl = inner - ) - ) - } - - pragma[nomagic] - override predicate succ0(ControlFlow::Node pred, ControlFlow::Node succ) { - ControlFlowTree.super.succ0(pred, succ) - or - lastNode(this.getInit(), pred, normalCompletion()) and - ( - firstNode(this.(ExpressionSwitchStmt).getExpr(), succ) or - succ = MkImplicitTrue(this) or - firstNode(this.(TypeSwitchStmt).getTest(), succ) - ) - or - ( - lastNode(this.(ExpressionSwitchStmt).getExpr(), pred, normalCompletion()) or - pred = MkImplicitTrue(this) or - lastNode(this.(TypeSwitchStmt).getTest(), pred, normalCompletion()) - ) and - ( - firstNode(this.getNonDefaultCase(0), succ) - or - not exists(this.getANonDefaultCase()) and - firstNode(this.getDefault(), succ) - ) - or - exists(CaseClause cc, int i | - cc = this.getNonDefaultCase(i) and - lastNode(cc, pred, normalCompletion()) and - pred = cc.(CaseClauseTree).getExprEnd(_, false) - | - firstNode(this.getNonDefaultCase(i + 1), succ) - or - i = this.getNumNonDefaultCase() - 1 and - firstNode(this.getDefault(), succ) - ) - or - exists(CaseClause cc, int i, CaseClause next | - cc = this.getCase(i) and - lastNode(cc, pred, Fallthrough()) and - next = this.getCase(i + 1) - | - firstNode(next.getStmt(0), succ) - or - succ = MkSkipNode(next) - ) - } - } - - private class TypeAssertTree extends PostOrderTree, TypeAssertExpr { - override ControlFlow::Node getNode() { result = MkExprNode(this) } - - override Completion getCompletion() { - result = Done() - or - // panic due to type mismatch, but not if the assertion appears in an assignment or - // initialization with two variables or a type-switch - not exists(Assignment assgn | assgn.getNumLhs() = 2 and this = assgn.getRhs().stripParens()) and - not exists(ValueSpec vs | vs.getNumName() = 2 and this = vs.getInit().stripParens()) and - not exists(TypeSwitchStmt ts | this = ts.getExpr()) and - result = Panic() - } - - override ControlFlowTree getChildTree(int i) { i = 0 and result = this.getExpr() } - } - - private class UnaryExprTree extends ControlFlowTree, UnaryExpr { - override predicate firstNode(ControlFlow::Node first) { firstNode(this.getOperand(), first) } - - override predicate lastNode(ControlFlow::Node last, Completion cmpl) { - last = MkExprNode(this) and - ( - cmpl = Done() - or - this instanceof DerefExpr and cmpl = Panic() - ) - } - - pragma[nomagic] - override predicate succ0(ControlFlow::Node pred, ControlFlow::Node succ) { - ControlFlowTree.super.succ0(pred, succ) - or - not this = any(RecvStmt recv).getExpr() and - lastNode(this.getOperand(), pred, normalCompletion()) and - succ = MkExprNode(this) - } - } - - private ControlFlow::Node mkExprOrSkipNode(Expr e) { - result = MkExprNode(e) or - result = MkSkipNode(e) - } - - /** Holds if evaluation of `root` may start at `first`. */ - cached - predicate firstNode(ControlFlowTree root, ControlFlow::Node first) { root.firstNode(first) } - - /** Holds if evaluation of `root` may complete normally after `last`. */ - cached - predicate lastNode(ControlFlowTree root, ControlFlow::Node last) { - lastNode(root, last, normalCompletion()) - } - - private predicate lastNode(ControlFlowTree root, ControlFlow::Node last, Completion cmpl) { - root.lastNode(last, cmpl) - } - - /** Gets a successor of `nd` that is not a `defer` node */ - private ControlFlow::Node notDeferSucc0(ControlFlow::Node nd) { - not result = MkDeferNode(_) and - result = succ0(nd) - } - - /** Gets `defer` statements that can be the first defer statement after `nd` in the CFG */ - private ControlFlow::Node nextDefer(ControlFlow::Node nd) { - nd = MkDeferNode(_) and - result = MkDeferNode(_) and - ( - result = succ0(nd) - or - result = succ0(notDeferSucc0+(nd)) - ) - } - - /** - * Holds if the function `f` may return without panicking, exiting the process, or looping forever. - * - * This is defined conservatively, and so may also hold of a function that in fact - * cannot return normally, but never fails to hold of a function that can return normally. - */ - cached - predicate mayReturnNormally(ControlFlowTree root) { - exists(Completion cmpl | lastNode(root, _, cmpl) and cmpl != Panic()) - } - - /** - * Holds if `pred` is the node for the case `testExpr` in an expression - * switch statement which is switching on `switchExpr`, and `succ` is the - * node to be executed next if the case test succeeds. - */ - cached - predicate isSwitchCaseTestPassingEdge( - ControlFlow::Node pred, ControlFlow::Node succ, Expr switchExpr, Expr testExpr - ) { - exists(ExpressionSwitchStmt ess | ess.getExpr() = switchExpr | - ess.getACase().(CaseClauseTree).isPassingEdge(_, pred, succ, testExpr) - ) - } - - /** - * Gets a successor of `nd`, that is, a node that is executed after `nd`, - * ignoring the execution of any deferred functions when a function ends. - */ - pragma[nomagic] - private ControlFlow::Node succ0(ControlFlow::Node nd) { - any(ControlFlowTree tree).succ0(nd, result) - } - - /** Gets a successor of `nd`, that is, a node that is executed after `nd`. */ - cached - ControlFlow::Node succ(ControlFlow::Node nd) { any(ControlFlowTree tree).succ(nd, result) } -} diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll new file mode 100644 index 000000000000..1a2f5207d29e --- /dev/null +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll @@ -0,0 +1,1734 @@ +/** + * Provides the shared CFG library instantiation for Go. + */ +overlay[local] +module; + +private import codeql.controlflow.ControlFlowGraph as CfgLib +private import codeql.controlflow.SuccessorType +private import codeql.util.Void + +/** Contains the shared CFG library instantiation for Go. */ +module CfgImpl { + private import go as Go + + private module Cfg0 = CfgLib::Make0; + + private module Cfg1 = Cfg0::Make1; + + private module Cfg2 = Cfg1::Make2; + + private import Cfg0 + private import Cfg1 + private import Cfg2 + import Public + + /** Holds if `e` has an implicit field selection at `index` for `implicitField`. */ + predicate implicitFieldSelection(Go::AstNode e, int index, Go::Field implicitField) { + Input::implicitFieldSelection(e, index, implicitField) + } + + /** Provides an implementation of the AST signature for Go. */ + private module Ast implements CfgLib::AstSig { + class AstNode = Go::AstNode; + + private predicate skipCfg(AstNode e) { + e instanceof Go::TypeExpr and not e instanceof Go::FuncTypeExpr + or + e = any(Go::FieldDecl f).getTag() + or + e instanceof Go::KeyValueExpr and not e = any(Go::CompositeLit lit).getAnElement() + or + e = any(Go::SelectorExpr sel).getSelector() + or + e = any(Go::StructLit sl).getKey(_) + or + e instanceof Go::Ident and not e instanceof Go::ReferenceExpr + or + e instanceof Go::SelectorExpr and not e instanceof Go::ReferenceExpr + or + e instanceof Go::ReferenceExpr and + not e.(Go::ReferenceExpr).isRvalue() and + not e instanceof Go::SelectorExpr and + not e = any(Go::SelectorExpr sel).getBase() and + not e instanceof Go::IndexExpr and + not e = any(Go::IndexExpr idx).getBase() and + not e = any(Go::IndexExpr idx).getIndex() + or + e instanceof Go::CommentGroup + or + e instanceof Go::Comment + or + e = any(Go::ImportSpec is).getPathExpr() + or + e.getParent*() = any(Go::ArrayTypeExpr ate).getLength() + or + // The body block of a switch (expression or type) is transparent: the + // shared switch model wires control flow directly from the switch to its + // case clauses (in control-flow order) and between cases, so the + // enclosing block must not introduce its own nodes or default + // left-to-right sequencing of the case clauses. + e = any(Go::SwitchStmt sw).getBody() + or + // The test statement of a type switch (`y := x.(type)` or the bare + // `x.(type)` expression statement) is transparent: the shared switch + // model evaluates the underlying type-assertion expression directly as + // the switch expression (see `Switch.getExpr`), so the wrapping + // statement must not introduce its own assignment or expression nodes. + e = any(Go::TypeSwitchStmt ts).getTest() + } + + AstNode getChild(AstNode n, int index) { + ( + not n instanceof Go::FuncDef and + not skipCfg(n) and + result = n.getChild(index) + or + // The body block of a switch (expression or type) is transparent (see + // `skipCfg`), so it is not itself a child and contributes no children. + // Expose the case clauses directly as children of the switch instead, + // so that the AST child chain stays connected for abrupt-completion + // propagation (e.g. a panicking call in a case body reaching the + // enclosing function's exceptional exit). + result = n.(Go::SwitchStmt).getBody().getChild(index) + or + // The type-switch test statement is transparent (see `skipCfg`), so + // expose the underlying type-assertion expression directly as a child + // of the type switch, keeping the AST child chain connected. + result = n.(Go::TypeSwitchStmt).getExpr() and index = 1 + ) and + not skipCfg(result) + } + + class Callable extends AstNode { + Callable() { + exists(this.(Go::FuncDef).getBody()) + or + exists(this.(Go::File).getADecl()) + } + } + + AstNode callableGetBody(Callable c) { + result = c.(Go::FuncDef).getBody() + or + result = c.(Go::File) + } + + class Parameter extends AstNode { + Parameter() { this = any(Go::Parameter p).getDeclaration() } + + AstNode getPattern() { result = this } + + Expr getDefaultValue() { none() } + } + + Parameter callableGetParameter(Callable c, int index) { + result = c.(Go::FuncDef).getParameter(index).getDeclaration() + } + + Callable getEnclosingCallable(AstNode node) { + result = node.getEnclosingFunction() + or + not exists(node.getEnclosingFunction()) and + result = node.getFile() + } + + class Stmt = Go::Stmt; + + class Expr = Go::Expr; + + class BlockStmt extends Go::BlockStmt { + BlockStmt() { + not this = any(Go::SwitchStmt sw).getBody() and + not this = any(Go::SelectStmt sel).getBody() + } + + override Stmt getStmt(int n) { result = Go::BlockStmt.super.getStmt(n) } + + Stmt getLastStmt() { + exists(int last | result = this.getStmt(last) and not exists(this.getStmt(last + 1))) + } + } + + class ExprStmt extends Stmt instanceof Go::ExprStmt { + // The `x.(type)` test statement of a type switch is transparent (see + // `skipCfg`): the shared switch model evaluates the underlying + // type-assertion expression directly as the switch expression. It must + // therefore not be treated as an ordinary expression statement, whose + // value would otherwise be propagated from the expression to the + // statement (creating a spurious flow into the transparent wrapper). + ExprStmt() { not this = any(Go::TypeSwitchStmt ts).getTest() } + + Expr getExpr() { result = Go::ExprStmt.super.getExpr() } + } + + class IfStmt extends Stmt { + IfStmt() { this instanceof Go::IfStmt } + + Expr getCondition() { result = this.(Go::IfStmt).getCond() } + + Stmt getThen() { result = this.(Go::IfStmt).getThen() } + + Stmt getElse() { result = this.(Go::IfStmt).getElse() } + } + + AstNode getIfInit(IfStmt ifstmt) { result = ifstmt.(Go::IfStmt).getInit() } + + class LoopStmt extends Stmt { + LoopStmt() { this instanceof Go::LoopStmt } + + Stmt getBody() { result = this.(Go::LoopStmt).getBody() } + } + + class WhileStmt extends LoopStmt { + WhileStmt() { none() } + + Expr getCondition() { none() } + } + + class DoStmt extends LoopStmt { + DoStmt() { none() } + + Expr getCondition() { none() } + } + + class UntilStmt extends LoopStmt { + UntilStmt() { none() } + + Expr getCondition() { none() } + } + + class ForStmt extends LoopStmt { + ForStmt() { this instanceof Go::ForStmt } + + AstNode getInit(int index) { index = 0 and result = this.(Go::ForStmt).getInit() } + + Expr getCondition() { result = this.(Go::ForStmt).getCond() } + + AstNode getUpdate(int index) { index = 0 and result = this.(Go::ForStmt).getPost() } + } + + class ForeachStmt extends LoopStmt { + ForeachStmt() { this instanceof Go::RangeStmt } + + // Go's `range` statement binds its key and value by destructuring the + // current element. The extractor synthesizes a single "range element" + // node grouping the key and value (see `Go::RangeElementExpr`), which we + // present here as the loop variable. The shared library routes control + // flow into and out of this node, and Go wires the destructuring through + // it (see `rangeStmtStep`). + Expr getVariable() { result = this.(Go::RangeStmt).getPattern() } + + Expr getCollection() { result = this.(Go::RangeStmt).getDomain() } + } + + class BreakStmt = Go::BreakStmt; + + class ContinueStmt = Go::ContinueStmt; + + class GotoStmt = Go::GotoStmt; + + class ReturnStmt extends Go::ReturnStmt { + override Expr getExpr() { result = Go::ReturnStmt.super.getExpr() } + } + + class Throw extends AstNode { + Throw() { none() } + + Expr getExpr() { none() } + } + + class TryStmt extends Stmt { + TryStmt() { none() } + + AstNode getBody(int index) { none() } + + CatchClause getCatch(int index) { none() } + + Stmt getFinally() { none() } + } + + class CatchClause extends AstNode { + CatchClause() { none() } + + AstNode getPattern() { none() } + + AstNode getVariable() { none() } + + Expr getCondition() { none() } + + Stmt getBody() { none() } + } + + class Switch extends AstNode { + Switch() { this instanceof Go::SwitchStmt } + + Expr getExpr() { + result = this.(Go::ExpressionSwitchStmt).getExpr() + or + // For a type switch the "switch expression" is the type-assertion + // expression `x.(type)`; evaluating it directly (rather than the + // wrapping `y := x.(type)` statement) lets the shared switch model + // drive the per-case type tests. + result = this.(Go::TypeSwitchStmt).getExpr() + } + + Case getCase(int index) { result = this.(Go::SwitchStmt).getCase(index) } + + Stmt getStmt(int index) { + // Go nests each case clause's body statements under the clause rather + // than in a flat list, so we expose a flattened view in which every + // case clause is immediately followed by its own body statements. This + // lets the shared library compute the body of a case as the statements + // between it and the next clause. + result = + rank[index + 1](Go::Stmt s, int caseIdx, int inner | + switchFlatItem(this, s, caseIdx, inner) + | + s order by caseIdx, inner + ) + } + } + + class Case extends AstNode { + Case() { this = any(Go::SwitchStmt sw).getACase() } + + AstNode getPattern(int index) { result = this.(Go::CaseClause).getExpr(index) } + + Expr getGuard() { none() } + + AstNode getBody() { none() } + } + + class DefaultCase extends Case { + DefaultCase() { not exists(this.(Go::CaseClause).getAnExpr()) } + } + + /** Gets the initializer of `switch` statement `switch`, if any. */ + AstNode getSwitchInit(Switch switch) { result = switch.(Go::SwitchStmt).getInit() } + + /** + * Go has no implicit fall-through between case clauses; a case that runs to + * the end of its body breaks out of the switch. Fall-through only happens + * when the case body ends with an explicit `fallthrough` statement, in + * which case control transfers to the next case clause's body (in source + * order). The shared library models this by chaining the body of such a + * case to the body of the following case. + */ + predicate fallsThrough(Case c) { + c.(Go::CaseClause).getStmt(max(int i | exists(c.(Go::CaseClause).getStmt(i)))) instanceof + Go::FallthroughStmt + } + + /** + * Holds if `s` is the flattened body element at position (`caseIdx`, + * `inner`) of switch `sw`: either the `caseIdx`-th case clause itself (with + * `inner` = -1) or its `inner`-th body statement. + */ + private predicate switchFlatItem(Go::SwitchStmt sw, Go::Stmt s, int caseIdx, int inner) { + s = sw.getCase(caseIdx) and inner = -1 + or + s = sw.getCase(caseIdx).getStmt(inner) + } + + class ConditionalExpr extends Expr { + ConditionalExpr() { none() } + + Expr getCondition() { none() } + + Expr getThen() { none() } + + Expr getElse() { none() } + } + + class BinaryExpr = Go::BinaryExpr; + + class LogicalAndExpr = Go::LandExpr; + + class LogicalOrExpr = Go::LorExpr; + + class NullCoalescingExpr extends BinaryExpr { + NullCoalescingExpr() { none() } + } + + class UnaryExpr = Go::UnaryExpr; + + class LogicalNotExpr = Go::NotExpr; + + class BooleanLiteral extends Expr { + boolean val; + + BooleanLiteral() { + this.(Go::Ident).getName() = "true" and val = true + or + this.(Go::Ident).getName() = "false" and val = false + } + + boolean getValue() { result = val } + } + + class Assignment extends BinaryExpr { + Assignment() { none() } + } + + class AssignExpr extends Assignment { + AssignExpr() { none() } + } + + class CompoundAssignment extends Assignment { + CompoundAssignment() { none() } + } + + class AssignLogicalAndExpr extends CompoundAssignment { + AssignLogicalAndExpr() { none() } + } + + class AssignLogicalOrExpr extends CompoundAssignment { + AssignLogicalOrExpr() { none() } + } + + class AssignNullCoalescingExpr extends CompoundAssignment { + AssignNullCoalescingExpr() { none() } + } + + class PatternMatchExpr extends Expr { + PatternMatchExpr() { none() } + + Expr getExpr() { none() } + + AstNode getPattern() { none() } + } + } + + /** The Input module implementing InputSig1 and InputSig2 for Go. */ + private module Input implements Cfg0::InputSig1, Cfg1::InputSig2 { + predicate cfgCachedStageRef() { CfgCachedStage::ref() } + + class CallableContext = Void; + + class Label extends string { + Label() { this = any(Go::LabeledStmt ls).getLabel() } + + string toString() { result = this } + } + + predicate hasLabel(Ast::AstNode n, Label l) { + // A statement carries the label of every `LabeledStmt` that wraps it. + // This is recursive because Go allows stacked labels (`L1: L2: stmt`), + // which the extractor represents as nested `LabeledStmt`s, so a single + // statement may have several labels. + exists(Go::LabeledStmt ls | n = ls.getStmt() | l = ls.getLabel() or hasLabel(ls, l)) + or + // The `LabeledStmt` wrapper itself also carries its label. Blocks contain + // the wrapper (not the inner statement) as a direct child, so the shared + // library's block-level `goto` target resolution -- which looks for a + // labelled statement that is a direct child of a block -- matches on the + // wrapper. + l = n.(Go::LabeledStmt).getLabel() + or + l = n.(Go::BreakStmt).getLabel() + or + l = n.(Go::ContinueStmt).getLabel() + or + // A `goto` statement carries its target label, so that the shared + // library's `beginAbruptCompletion` produces a *labelled* goto completion + // (matching the target label) rather than an unlabelled one. + l = n.(Go::GotoStmt).getLabel() + } + + predicate preOrderExpr(Ast::Expr e) { + // The call of a `defer` statement is not invoked at the statement + // itself; its callee and arguments are evaluated in place, but the call + // is only invoked later, at function exit (modelled by the `defer-invoke` + // node and `deferExitStep`). Marking it as pre-order means no in-order + // "invocation" node (and hence no inline exceptional-exit edge) is + // created at the `defer` statement. + e = any(Go::DeferStmt s).getCall() + or + // Parenthesized expressions are value-transparent (via `propagatesValue`) + // and should not get an in-order evaluation node. Marking them as + // pre-order prevents the shared library from auto-computing + // `postOrInOrder` for them (which would create an unreachable In node). + e instanceof Go::ParenExpr + } + + predicate propagatesValue(Ast::AstNode child, Ast::AstNode parent) { + child = parent.(Go::ParenExpr).getExpr() + } + + predicate postOrInOrder(Ast::AstNode n) { + // Leaf value expressions: these have no CFG children, so the shared + // library's default (which only makes expressions *with* children + // post-order) would otherwise treat them as simple leaf nodes with no + // in-order value node. + n instanceof Go::ReferenceExpr + or + n instanceof Go::BasicLit + or + n instanceof Go::FuncLit + or + // An empty composite literal (e.g. `T{}`) has no CFG children, so it too + // needs an explicit in-order (allocation) node. + n instanceof Go::CompositeLit + or + // Statements/declarations that compute a value or perform an operation and + // are not among the statements the shared library makes post-order by + // default. + n instanceof Go::DeferStmt + or + n instanceof Go::GoStmt + or + n instanceof Go::SelectStmt + or + n instanceof Go::SendStmt + or + n instanceof Go::IncDecStmt + or + n instanceof Go::FuncDecl + } + + predicate additionalNode(Ast::AstNode n, string tag, NormalSuccessor t) { + t instanceof DirectSuccessor and + ( + // Assignment write nodes: one per LHS + exists(int i | + ( + notBlankIdent(n.(Go::Assignment).getLhs(i)) and + // The `y := x.(type)` test statement of a type switch is transparent + // (see `skipCfg`): the per-case implicit variables are written at the + // case match nodes (see `IR::TypeSwitchImplicitVariableInstruction`), + // so the guard itself emits no assignment write node. + not n = any(Go::TypeSwitchStmt ts).getAssign() + or + notBlankIdent(n.(Go::ValueSpec).getNameExpr(i)) + or + notBlankIdent(n.(Go::RangeElementExpr).getKey()) and i = 0 + or + notBlankIdent(n.(Go::RangeElementExpr).getValue()) and i = 1 + ) and + tag = "assign:" + i.toString() + ) + or + // Get the next key-value pair produced by a `range` statement. + n instanceof Go::RangeElementExpr and tag = "next" + or + // Compound assignment implicit RHS + n instanceof Go::CompoundAssignStmt and tag = "compound-rhs" + or + // Tuple extraction nodes + exists(int i | + extractNodeCondition(n, i) and + tag = "extract:" + i.toString() + ) + or + // Zero initialization (on the ValueSpec) + exists(int i, Go::ValueSpec spec | + n = spec and + not exists(spec.getAnInit()) and + exists(spec.getNameExpr(i)) and + tag = "zero-init:" + i.toString() + ) + or + // Increment/decrement implicit operations + n instanceof Go::IncDecStmt and tag = "implicit-one" + or + n instanceof Go::IncDecStmt and tag = "incdec-rhs" + or + // Result write nodes in return statements + exists(int i, Go::ReturnStmt ret | + n = ret and + exists(ret.getEnclosingFunction().getResultVar(i)) and + exists(ret.getAnExpr()) and + tag = "result-write:" + i.toString() + ) + or + // Result read nodes (on the function body) + exists(int i, Go::FuncDef fd | + n = fd.getBody() and + exists(fd.getBody()) and + exists(fd.getResultVar(i)) and + tag = "result-read:" + i.toString() + ) + or + // Result variable init (on the function body) + exists(int i, Go::FuncDef fd | + n = fd.getBody() and + exists(fd.getBody()) and + exists(fd.getResultVar(i)) and + tag = "result-init:" + i.toString() + ) + or + // Result variable zero init (on the function body) + exists(int i, Go::FuncDef fd | + n = fd.getBody() and + exists(fd.getBody()) and + exists(fd.getResultVar(i)) and + exists(fd.getResultVar(i).(Go::ResultVariable).getFunction().getBody()) and + tag = "result-zero-init:" + i.toString() + ) + or + // Implicit deref + implicitDerefCondition(n) and tag = "implicit-deref" + or + // Implicit slice bounds + n instanceof Go::SliceExpr and + not exists(n.(Go::SliceExpr).getLow()) and + tag = "implicit-low" + or + n instanceof Go::SliceExpr and + not exists(n.(Go::SliceExpr).getHigh()) and + tag = "implicit-high" + or + n instanceof Go::SliceExpr and + not exists(n.(Go::SliceExpr).getMax()) and + tag = "implicit-max" + or + // Literal element initialization + n = any(Go::CompositeLit lit).getAnElement() and + tag = "lit-init" + or + // Implicit literal element index + exists(Go::CompositeLit lit | + not lit instanceof Go::StructLit and + n = lit.getAnElement() and + not n instanceof Go::KeyValueExpr and + tag = "lit-index" + ) + or + // Implicit field selection for promoted fields + exists(int i, Go::Field implicitField | + implicitFieldSelection(n, i, implicitField) and + tag = "implicit-field:" + i.toString() + ) + or + // Deferred-call invocation node, placed at function exit by `deferExitStep` + n = any(Go::DeferStmt s).getCall() and tag = "defer-invoke" + ) + } + + /** Helper: condition for MkExtractNode */ + private predicate extractNodeCondition(Ast::AstNode s, int i) { + exists(Go::Assignment assgn | + s = assgn and + exists(assgn.getRhs()) and + assgn.getNumLhs() > 1 and + exists(assgn.getLhs(i)) + ) + or + exists(Go::ValueSpec spec | + s = spec and + exists(spec.getInit()) and + spec.getNumName() > 1 and + exists(spec.getNameExpr(i)) + ) + or + exists(Go::RangeElementExpr p | s = p | + exists(p.getKey()) and i = 0 + or + exists(p.getValue()) and i = 1 + ) + or + exists(Go::ReturnStmt ret, Go::SignatureType rettp | + s = ret and + exists(ret.getExpr()) and + rettp = ret.getEnclosingFunction().getType() and + rettp.getNumResult() > 1 and + exists(rettp.getResultType(i)) + ) + or + exists(Go::CallExpr outer, Go::CallExpr inner | s = outer | + inner = outer.getArgument(0).stripParens() and + outer.getNumArgument() = 1 and + exists(inner.getType().(Go::TupleType).getComponentType(i)) + ) + } + + /** Helper: condition for implicit dereference */ + private predicate implicitDerefCondition(Ast::AstNode e) { + e.(Go::Expr).getType().getUnderlyingType() instanceof Go::PointerType and + ( + exists(Go::SelectorExpr sel | e = sel.getBase() | + sel = any(Go::Field f).getAReference() + or + exists(Go::Method m, Go::Type tp | + sel = m.getAReference() and + tp = m.getReceiver().getType().getUnderlyingType() and + not tp instanceof Go::PointerType + ) + ) + or + e = any(Go::IndexExpr ie).getBase() + or + e = any(Go::SliceExpr se).getBase() + ) + } + + /** Helper: blank identifier check */ + private predicate notBlankIdent(Go::Expr e) { not e instanceof Go::BlankIdent } + + /** Helper: implicit field selection for promoted selectors */ + additional predicate implicitFieldSelection(Ast::AstNode e, int index, Go::Field implicitField) { + exists(Go::StructType baseType, Go::PromotedField child, int implicitFieldDepth | + baseType = e.(Go::PromotedSelector).getSelectedStructType() and + ( + e.(Go::PromotedSelector).refersTo(child) + or + implicitFieldSelection(e, implicitFieldDepth + 1, child) + ) + | + child = baseType.getFieldOfEmbedded(implicitField, _, implicitFieldDepth + 1, _) and + exists(Go::PromotedField explicitField, int explicitFieldDepth | + e.(Go::PromotedSelector).refersTo(explicitField) and + baseType.getFieldAtDepth(_, explicitFieldDepth) = explicitField + | + index = explicitFieldDepth - implicitFieldDepth + ) + ) + or + exists( + Go::StructType baseType, Go::PromotedMethod method, int mDepth, int implicitFieldDepth + | + baseType = e.(Go::PromotedSelector).getSelectedStructType() and + e.(Go::PromotedSelector).refersTo(method) and + baseType.getMethodAtDepth(_, mDepth) = method and + index = mDepth - implicitFieldDepth + | + method = baseType.getMethodOfEmbedded(implicitField, _, implicitFieldDepth + 1) + or + exists(Go::PromotedField child | + child = baseType.getFieldOfEmbedded(implicitField, _, implicitFieldDepth + 1, _) and + implicitFieldSelection(e, implicitFieldDepth + 1, child) + ) + ) + } + + predicate beginAbruptCompletion( + Ast::AstNode ast, PreControlFlowNode n, AbruptCompletion c, boolean always + ) { + ast instanceof Go::CallExpr and + ( + not exists(ast.(Go::CallExpr).getTarget()) or + ast.(Go::CallExpr).getTarget().mayPanic() + ) and + (n.isIn(ast) or n.isAdditional(ast, "defer-invoke")) and + c.asSimpleAbruptCompletion() instanceof ExceptionSuccessor and + always = false + or + // Calls to functions that never return normally (e.g. `os.Exit`, `log.Fatal`, + // `panic`) must suppress normal flow past the call site. We emit an `always` + // exception completion so that the shared library's default In->After step + // is suppressed. + ast instanceof Go::CallExpr and + exists(Go::Function target | target = ast.(Go::CallExpr).getTarget() | + target.mustPanic() or target.mustNotReturnNormally() + ) and + (n.isIn(ast) or n.isAdditional(ast, "defer-invoke")) and + c.asSimpleAbruptCompletion() instanceof ExceptionSuccessor and + always = true + or + ast instanceof Go::DivExpr and + not ast.(Go::Expr).isConst() and + n.isIn(ast) and + c.asSimpleAbruptCompletion() instanceof ExceptionSuccessor and + always = false + or + ast instanceof Go::DerefExpr and + n.isIn(ast) and + c.asSimpleAbruptCompletion() instanceof ExceptionSuccessor and + always = false + or + ast instanceof Go::TypeAssertExpr and + not exists(Go::Assignment assgn | + assgn.getNumLhs() = 2 and ast = assgn.getRhs().stripParens() + ) and + not exists(Go::ValueSpec vs | vs.getNumName() = 2 and ast = vs.getInit().stripParens()) and + not exists(Go::TypeSwitchStmt ts | ast = ts.getExpr()) and + n.isIn(ast) and + c.asSimpleAbruptCompletion() instanceof ExceptionSuccessor and + always = false + or + ast instanceof Go::IndexExpr and + n.isIn(ast) and + c.asSimpleAbruptCompletion() instanceof ExceptionSuccessor and + always = false + or + ast instanceof Go::ConversionExpr and + ast.(Go::ConversionExpr).getType().(Go::PointerType).getBaseType() instanceof Go::ArrayType and + n.isIn(ast) and + c.asSimpleAbruptCompletion() instanceof ExceptionSuccessor and + always = false + } + + predicate endAbruptCompletion(Ast::AstNode ast, PreControlFlowNode n, AbruptCompletion c) { + exists(Go::LabeledStmt lbl | + ast = lbl.getStmt() and + n.isAfter(lbl) and + c.getSuccessorType() instanceof BreakSuccessor and + c.hasLabel(lbl.getLabel()) + ) + or + // A `break` in a communication clause body terminates the enclosing + // `select` statement, continuing after it. This mirrors the shared + // library's handling of `break` in a `switch` case body, but `select` is + // modelled language-specifically (it is not a `Switch`), so the break + // must be caught here. The break completion bubbles up the AST until it + // reaches a top-level statement of the comm clause body, at which point + // flow resumes after the `select`. An unlabeled `break` targets the + // innermost enclosing construct; a labeled `break` only targets this + // `select` if it (or a `LabeledStmt` wrapping it) carries that label. + exists(Go::SelectStmt sel, Go::CommClause cc | + cc = sel.getACommClause() and + ast = cc.getStmt(_) and + n.isAfter(sel) and + c.getSuccessorType() instanceof BreakSuccessor + | + not c.hasLabel(_) + or + exists(Label l | c.hasLabel(l) and hasLabel(sel, l)) + ) + or + exists(Go::FuncDef fd | + ast = fd.getBody() and + not funcHasDefer(fd) and + c.getSuccessorType() instanceof ReturnSuccessor and + // If the function has result variables, route the return completion + // through the result-read epilogue before reaching the function exit. + exists(fd.getResultVar(0)) and + n.isAdditional(fd.getBody(), "result-read:0") + ) + } + + predicate overridesCallableEndAbruptCompletion(Ast::Callable c, AbruptCompletion completion) { + // For functions with result variables, the library's default routing of a + // `return` straight to the normal exit node is suppressed so that the + // return is instead caught by `endAbruptCompletion` above and routed + // through the result-read epilogue. + // + // For functions containing `defer` statements, the default routing is + // likewise suppressed so that returns are routed through the deferred-call + // epilogue (see `deferExitStep`) instead. + (exists(c.(Go::FuncDef).getResultVar(0)) or funcHasDefer(c.(Go::FuncDef))) and + completion.getSuccessorType() instanceof ReturnSuccessor + } + + predicate overridesAbruptCompletionEdge( + PreControlFlowNode source, PreControlFlowNode target, AbruptCompletion completion + ) { + completion.getSuccessorType() instanceof ExceptionSuccessor and + isExceptionalExitNode(target) and + exists(PreControlFlowNode nextDefer | + deferExitStep(source, nextDefer, _) and deferInvoke(nextDefer, _) + ) + } + + predicate callableExitStep(PreControlFlowNode n, Ast::Callable c, boolean normal) { + // The last result-read node of the epilogue steps to the normal exit node. + exists(Go::FuncDef fd, int j | fd = c | + normal = true and + exists(fd.getResultVar(j)) and + not exists(fd.getResultVar(j + 1)) and + n.isAdditional(fd.getBody(), "result-read:" + j.toString()) + ) + } + + /** Holds if `fd` contains at least one `defer` statement. */ + private predicate funcHasDefer(Go::FuncDef fd) { + exists(Go::DeferStmt s | s.getEnclosingFunction() = fd) + } + + /** + * Holds if `n` is the registration node of `defer` statement `s` (the + * post-order node of the statement, reached once its call's arguments have + * been evaluated). + * + * This uses the reachability-free `isInOrderNode` rather than `n.isIn(s)` + * because it is referenced under negation by `succBeforeNextDeferRegistration`, and must + * therefore not depend on `reachable`. + */ + private predicate deferRegistration(PreControlFlowNode n, Go::DeferStmt s) { + isInOrderNode(n, s) + } + + /** + * Holds if `n` is the deferred-invocation node for `defer` statement `s`, + * which models the deferred call running at function exit. + */ + private predicate deferInvoke(PreControlFlowNode n, Go::DeferStmt s) { + n.isAdditional(s.getCall(), "defer-invoke") + } + + /** Holds if invoking deferred call `s` may return normally. */ + private predicate deferInvocationMayReturnNormally(Go::DeferStmt s) { + not exists(Go::Function target | target = s.getCall().getTarget() | + target.mustPanic() or target.mustNotReturnNormally() + ) + } + + /** Holds if invoking deferred call `s` terminates without panic unwinding. */ + private predicate deferInvocationStopsUnwinding(Go::DeferStmt s) { + exists(Go::Function target | target = s.getCall().getTarget() | + target.mustNotReturnNormally() and not target.mustPanic() + ) + } + + /** + * Gets a defer-free successor of `n` that is not a `defer` registration + * node. Walking this relation from a node stops at the next registration + * node, which is how the reachability gate for deferred calls is computed. + * + * This is typed over `PreControlFlowNode` and uses `succIgnoringDeferExit` + * so that it does not depend on `reachable` (which would otherwise create a + * non-monotonic cycle through `deferExitStep`). + */ + private PreControlFlowNode succBeforeNextDeferRegistration(PreControlFlowNode n) { + succIgnoringDeferExit(n, result, _) and + not deferRegistration(result, _) + } + + /** Gets a node reachable from `start` over `succBeforeNextDeferRegistration`, reflexively. */ + private PreControlFlowNode reachableBeforeNextDeferRegistration(PreControlFlowNode start) { + result = start + or + result = succBeforeNextDeferRegistration(reachableBeforeNextDeferRegistration(start)) + } + + /** Gets the entry node of `fd`. */ + private PreControlFlowNode funcEntry(Go::FuncDef fd) { + result.(EntryNodeImpl).getEnclosingCallable() = fd + } + + /** + * Holds if `s` can be the first `defer` statement registered in `fd`, and + * hence the last to run: its registration node is reachable from the entry + * node without passing through another registration node. + */ + private predicate firstRegisteredDefer(Go::DeferStmt s, Go::FuncDef fd) { + s.getEnclosingFunction() = fd and + exists(PreControlFlowNode reg, PreControlFlowNode m | + deferRegistration(reg, s) and + m = reachableBeforeNextDeferRegistration(funcEntry(fd)) and + succIgnoringDeferExit(m, reg, _) + ) + } + + /** + * Holds if the registration node of `laterRegistered` is the next registration + * node reachable from the registration node of `earlierRegistered`. The later + * registration therefore runs immediately before the earlier one (deferred calls + * run in last-in-first-out order). + */ + private predicate nextRegisteredDefer( + Go::DeferStmt laterRegistered, Go::DeferStmt earlierRegistered + ) { + exists( + PreControlFlowNode laterRegistration, PreControlFlowNode earlierRegistration, + PreControlFlowNode m + | + deferRegistration(laterRegistration, laterRegistered) and + deferRegistration(earlierRegistration, earlierRegistered) and + m = reachableBeforeNextDeferRegistration(earlierRegistration) and + succIgnoringDeferExit(m, laterRegistration, _) + ) + } + + /** + * Holds if `n` is a normal-exit predecessor of `fd`: a `return` statement + * node, or the fall-through node after the body. + */ + private predicate normalExitPred(PreControlFlowNode n, Go::FuncDef fd) { + exists(Go::ReturnStmt ret | ret.getEnclosingFunction() = fd and n.isIn(ret)) + or + n.isAfter(fd.getBody()) + } + + /** + * Holds if `n` is an exceptional-exit predecessor of `fd`: the in-order + * node of an operation that may panic. In Go, deferred functions run on + * panic, so these nodes must also enter the deferred-call chain. Other + * nonreturning calls, such as `os.Exit`, do not run deferred functions. + */ + private predicate exceptionalExitPred(PreControlFlowNode n, Go::FuncDef fd) { + exists(Ast::AstNode ast, AbruptCompletion c | + ast.getEnclosingFunction() = fd and + n.isIn(ast) and + beginAbruptCompletion(ast, n, c, false) and + c.getSuccessorType() instanceof ExceptionSuccessor and + not exists(Go::CallExpr call | + ast = call and + call.getTarget().mustNotReturnNormally() and + not call.getTarget().mustPanic() + ) + ) + } + + /** + * Holds if, after running its deferred calls, `fd` should continue at + * `target` on a normal exit. For functions with result variables this is + * the start of the result-read epilogue; otherwise it is the normal exit + * node directly. + */ + private predicate deferChainExitTarget(Go::FuncDef fd, PreControlFlowNode target) { + exists(fd.getResultVar(0)) and target.isAdditional(fd.getBody(), "result-read:0") + or + not exists(fd.getResultVar(_)) and + target.(NormalExitNodeImpl).getEnclosingCallable() = fd + } + + predicate deferExitStep( + PreControlFlowNode n1, PreControlFlowNode n2, SuccessorType successorType + ) { + exists(Go::FuncDef fd | funcHasDefer(fd) | + successorType instanceof DirectSuccessor and + ( + // (a) an exit predecessor with no active defer flows straight to the exit target + normalExitPred(n1, fd) and + n1 = reachableBeforeNextDeferRegistration(funcEntry(fd)) and + deferChainExitTarget(fd, n2) + or + // (b) an exit predecessor flows to the invocation of the last-registered active defer + exists(Go::DeferStmt d, PreControlFlowNode reg | + deferRegistration(reg, d) and + d.getEnclosingFunction() = fd and + normalExitPred(n1, fd) and + n1 = reachableBeforeNextDeferRegistration(reg) and + deferInvoke(n2, d) + ) + or + // (c) deferred invocations chain in last-in-first-out order + exists(Go::DeferStmt laterRegistered, Go::DeferStmt earlierRegistered | + laterRegistered.getEnclosingFunction() = fd and + nextRegisteredDefer(laterRegistered, earlierRegistered) and + not deferInvocationStopsUnwinding(laterRegistered) and + deferInvoke(n1, laterRegistered) and + deferInvoke(n2, earlierRegistered) + ) + or + // (d) the invocation of the first-registered (last to run) defer flows to the exit target + exists(Go::DeferStmt firstD | + firstRegisteredDefer(firstD, fd) and + deferInvocationMayReturnNormally(firstD) and + deferInvoke(n1, firstD) and + deferChainExitTarget(fd, n2) + ) + ) + or + // (e) a possible panic with active defers flows to the last-registered active defer + successorType instanceof ExceptionSuccessor and + exists(Go::DeferStmt d, PreControlFlowNode reg | + deferRegistration(reg, d) and + d.getEnclosingFunction() = fd and + exceptionalExitPred(n1, fd) and + n1 = reachableBeforeNextDeferRegistration(reg) and + deferInvoke(n2, d) + ) + ) + } + + predicate overridesCallableBodyExit(Ast::Callable c) { funcHasDefer(c.(Go::FuncDef)) } + + predicate overridesDefaultControlFlow(Ast::AstNode ast) { + exists(Go::SelectStmt sel, Go::RecvStmt recv | + recv = sel.getACommClause().getComm() and + (ast = recv or ast = recv.getExpr()) + ) + or + exists(Go::SelectStmt sel, Go::SendStmt send | + send = sel.getACommClause().getComm() and ast = send + ) + } + + predicate preservesDefaultControlFlow(Ast::AstNode ast) { + ast = any(Go::FuncDef fd | hasFuncDefPrologue(fd)).getBody() + or + exists(getFirstEpilogueTag(ast)) + } + + predicate overridesDefaultControlFlowStep( + Ast::AstNode ast, PreControlFlowNode source, PreControlFlowNode target + ) { + ast = any(Go::FuncDef fd | hasFuncDefPrologue(fd)).getBody() and source.isBefore(ast) + or + exists(getFirstEpilogueTag(ast)) and + ( + source.isAfter(getLastRankedChild(ast)) + or + not exists(getRankedChild(ast, _)) and source.isBefore(ast) + ) and + (target.isIn(ast) or target.isAfter(ast)) + } + + predicate step(PreControlFlowNode n1, PreControlFlowNode n2) { + rangeStmtStep(n1, n2) or + selectStmtStep(n1, n2) or + deferStmtStep(n1, n2) or + goStmtStep(n1, n2) or + assignmentStep(n1, n2) or + incDecStep(n1, n2) or + returnStep(n1, n2) or + callExprStep(n1, n2) or + indexExprStep(n1, n2) or + sliceExprStep(n1, n2) or + selectorExprStep(n1, n2) or + compositeLitStep(n1, n2) or + sendStmtStep(n1, n2) or + funcDefStep(n1, n2) + } + + /** + * Gets the non-skipped child of `parent` at rank `rnk` (1-based). + * This mimics the shared library's getRankedChild but for use in explicit steps. + */ + private Ast::AstNode getRankedChild(Ast::AstNode parent, int rnk) { + result = rank[rnk](Ast::AstNode c, int ix | c = Ast::getChild(parent, ix) | c order by ix) + } + + /** Gets the last non-skipped child of `parent`, or fails if none. */ + private Ast::AstNode getLastRankedChild(Ast::AstNode parent) { + exists(int i | + result = getRankedChild(parent, i) and + not exists(getRankedChild(parent, i + 1)) + ) + } + + /** Routes between consecutive epilogue nodes of `parent`. */ + private predicate epilogueSequenceStep( + Ast::AstNode parent, PreControlFlowNode n1, PreControlFlowNode n2 + ) { + exists(string tag1, string tag2 | + epilogueTagSucc(parent, tag1, tag2) and + n1.isAdditional(parent, tag1) and + n2.isAdditional(parent, tag2) + ) + } + + /** Routes into and between the epilogue nodes of `parent`. */ + private predicate epilogueStep(Ast::AstNode parent, PreControlFlowNode n1, PreControlFlowNode n2) { + n1.isAfter(getLastRankedChild(parent)) and + n2.isAdditional(parent, getFirstEpilogueTag(parent)) + or + not exists(getRankedChild(parent, _)) and + n1.isBefore(parent) and + n2.isAdditional(parent, getFirstEpilogueTag(parent)) + or + epilogueSequenceStep(parent, n1, n2) + } + + /** + * Assignment flow: routes through LHS/RHS children, then through + * additional nodes for compound-rhs, extract, zero-init, and assign + * operations. + */ + private predicate assignmentStep(PreControlFlowNode n1, PreControlFlowNode n2) { + exists(Ast::AstNode assgn | + assgn instanceof Go::Assignment and + not assgn instanceof Go::RecvStmt and + // The `y := x.(type)` test statement of a type switch is transparent + // (see `skipCfg`); the shared switch model evaluates the underlying + // type-assertion expression directly, so this statement has no + // assignment flow of its own. + not assgn = any(Go::TypeSwitchStmt ts).getAssign() + or + assgn instanceof Go::ValueSpec + | + epilogueStep(assgn, n1, n2) + or + // Last epilogue → after the assignment + n1.isAdditional(assgn, getLastEpilogueTag(assgn)) and + n2.isAfter(assgn) + ) + } + + /** Gets a tuple-extraction epilogue tag and its order. */ + private string getExtractionEpilogueTag(Ast::AstNode node, int ord) { + exists(int i | + extractNodeCondition(node, i) and + result = "extract:" + i.toString() and + ord = 2 * i + ) + } + + /** Gets an assignment epilogue tag and its order. */ + private string getAssignmentEpilogueTag(Ast::AstNode assgn, int ord) { + // Compound RHS comes first + assgn instanceof Go::CompoundAssignStmt and + ord = -1 and + result = "compound-rhs" + or + exists(int j | + ( + exists(Go::ValueSpec spec | + assgn = spec and + not exists(spec.getAnInit()) and + exists(spec.getNameExpr(j)) and + result = "zero-init:" + j.toString() and + ord = 2 * j + ) + or + ( + notBlankIdent(assgn.(Go::Assignment).getLhs(j)) + or + notBlankIdent(assgn.(Go::ValueSpec).getNameExpr(j)) + or + notBlankIdent(assgn.(Go::RangeElementExpr).getKey()) and j = 0 + or + notBlankIdent(assgn.(Go::RangeElementExpr).getValue()) and j = 1 + ) and + result = "assign:" + j.toString() and + ord = 2 * j + 1 + ) + ) + } + + /** Gets a result-write epilogue tag and its order. */ + private string getResultWriteEpilogueTag(Ast::AstNode node, int ord) { + exists(int i, Go::ReturnStmt ret, Go::ResultVariable rv | + node = ret and + ret.getEnclosingFunction().getResultVar(i) = rv and + exists(ret.getAnExpr()) and + result = "result-write:" + i.toString() and + ord = 2 * i + 1 + ) + } + + /** Gets an epilogue tag and its order. */ + private string getEpilogueTag(Ast::AstNode node, int ord) { + result = getExtractionEpilogueTag(node, ord) + or + result = getAssignmentEpilogueTag(node, ord) + or + result = getResultWriteEpilogueTag(node, ord) + } + + private string getRankedEpilogueTag(Ast::AstNode node, int rnk) { + result = + rank[rnk](string tag, int ord | + tag = getEpilogueTag(node, ord) and + exists(tag) + | + tag order by ord + ) + } + + private string getFirstEpilogueTag(Ast::AstNode node) { result = getRankedEpilogueTag(node, 1) } + + private string getLastEpilogueTag(Ast::AstNode node) { + exists(int i | + result = getRankedEpilogueTag(node, i) and + not exists(getRankedEpilogueTag(node, i + 1)) + ) + } + + private predicate epilogueTagSucc(Ast::AstNode node, string tag1, string tag2) { + exists(int i | + tag1 = getRankedEpilogueTag(node, i) and + tag2 = getRankedEpilogueTag(node, i + 1) + ) + } + + /** + * Increment/decrement: operand → implicit-one → incdec-rhs → In(stmt) + * (IncDecStmt is in postOrInOrder, so In(stmt) is its evaluation point) + */ + private predicate incDecStep(PreControlFlowNode n1, PreControlFlowNode n2) { + exists(Go::IncDecStmt s | + // Before → Before operand + n1.isBefore(s) and n2.isBefore(s.getOperand()) + or + // After operand → implicit-one + n1.isAfter(s.getOperand()) and n2.isAdditional(s, "implicit-one") + or + // implicit-one → incdec-rhs + n1.isAdditional(s, "implicit-one") and n2.isAdditional(s, "incdec-rhs") + or + // incdec-rhs → In(stmt) (the assignment itself) + n1.isAdditional(s, "incdec-rhs") and n2.isIn(s) + or + // In(stmt) → After(stmt) + n1.isIn(s) and n2.isAfter(s) + ) + } + + /** + * Return statement: evaluate expressions, extract tuples, write results, + * then the return node. + */ + private predicate returnStep(PreControlFlowNode n1, PreControlFlowNode n2) { + exists(Go::ReturnStmt ret | + epilogueStep(ret, n1, n2) + or + // Last return epilogue → return node + n1.isAdditional(ret, getLastEpilogueTag(ret)) and + n2.isIn(ret) + ) + } + + /** + * Call with spread arguments, e.g. `f(g())` where the inner call `g` + * returns multiple results that are passed as the arguments of the outer + * call `f`: evaluate the children (callee and inner call), extract each + * tuple element of the inner call's result, then invoke the outer call. + * + * The tuple-extraction nodes are additional nodes (see + * `extractNodeCondition`); without wiring them into the control flow they + * would be unreachable and pruned, breaking data flow through `f(g())`. + */ + private predicate callExprStep(PreControlFlowNode n1, PreControlFlowNode n2) { + exists(Go::CallExpr call | + // Restrict to ordinary invoked calls; the calls of `defer`/`go` + // statements are evaluated in place but invoked later / concurrently, + // and are handled by `deferStmtStep`/`goStmtStep` instead. + not call = any(Go::DeferStmt s).getCall() and + not call = any(Go::GoStmt s).getCall() and + extractNodeCondition(call, _) + | + epilogueStep(call, n1, n2) + or + // Last tuple-extraction node → the call's invocation node + n1.isAdditional(call, getLastEpilogueTag(call)) and n2.isIn(call) + or + // Invocation node → after the call (unless the call never returns normally) + n1.isIn(call) and + n2.isAfter(call) and + not beginAbruptCompletion(call, n1, _, true) + ) + } + + /** + * Index expression: base → implicit-deref? → index → In(indexExpr) + */ + private predicate indexExprStep(PreControlFlowNode n1, PreControlFlowNode n2) { + exists(Go::IndexExpr ie | + implicitDerefCondition(ie.getBase()) and + ( + n1.isBefore(ie) and n2.isBefore(ie.getBase()) + or + n1.isAfter(ie.getBase()) and n2.isAdditional(ie.getBase(), "implicit-deref") + or + n1.isAdditional(ie.getBase(), "implicit-deref") and n2.isBefore(ie.getIndex()) + or + n1.isAfter(ie.getIndex()) and n2.isIn(ie) + or + n1.isIn(ie) and n2.isAfter(ie) + ) + ) + } + + /** + * Slice expression: base → implicit-deref? → low/implicit-low → + * high/implicit-high → max/implicit-max → In(sliceExpr) + */ + private predicate sliceExprStep(PreControlFlowNode n1, PreControlFlowNode n2) { + exists(Go::SliceExpr se | + (implicitDerefCondition(se.getBase()) or exists(se.getLow()) or not exists(se.getLow())) and + ( + n1.isBefore(se) and n2.isBefore(se.getBase()) + or + // After base → implicit deref or low/implicit-low + n1.isAfter(se.getBase()) and + ( + if implicitDerefCondition(se.getBase()) + then n2.isAdditional(se.getBase(), "implicit-deref") + else + if exists(se.getLow()) + then n2.isBefore(se.getLow()) + else n2.isAdditional(se, "implicit-low") + ) + or + n1.isAdditional(se.getBase(), "implicit-deref") and + ( + if exists(se.getLow()) + then n2.isBefore(se.getLow()) + else n2.isAdditional(se, "implicit-low") + ) + or + (n1.isAfter(se.getLow()) or n1.isAdditional(se, "implicit-low")) and + ( + if exists(se.getHigh()) + then n2.isBefore(se.getHigh()) + else n2.isAdditional(se, "implicit-high") + ) + or + (n1.isAfter(se.getHigh()) or n1.isAdditional(se, "implicit-high")) and + ( + if exists(se.getMax()) + then n2.isBefore(se.getMax()) + else n2.isAdditional(se, "implicit-max") + ) + or + (n1.isAfter(se.getMax()) or n1.isAdditional(se, "implicit-max")) and + n2.isIn(se) + or + n1.isIn(se) and n2.isAfter(se) + ) + ) + } + + /** + * Selector expression with value base: base → implicit-deref? → + * implicit-field-selections → In(selector) + */ + private predicate selectorExprStep(PreControlFlowNode n1, PreControlFlowNode n2) { + exists(Go::SelectorExpr sel | + sel.getBase() instanceof Go::ValueExpr and + ( + implicitDerefCondition(sel.getBase()) or + exists(Go::Field f | sel = f.getAReference()) or + implicitFieldSelection(sel, _, _) + ) and + ( + n1.isBefore(sel) and n2.isBefore(sel.getBase()) + or + // After base (no implicit-deref) → first implicit-field or In(sel) + n1.isAfter(sel.getBase()) and + not implicitDerefCondition(sel.getBase()) and + ( + // Has implicit field reads: go to outermost (highest index) + exists(int maxIdx | + maxIdx = max(int i | implicitFieldSelection(sel, i, _)) and + n2.isAdditional(sel, "implicit-field:" + maxIdx.toString()) + ) + or + // No implicit field reads: go directly to In(sel) + not implicitFieldSelection(sel, _, _) and n2.isIn(sel) + ) + or + // After base (has implicit-deref) → implicit-deref node + n1.isAfter(sel.getBase()) and + implicitDerefCondition(sel.getBase()) and + n2.isAdditional(sel.getBase(), "implicit-deref") + or + // After implicit-deref → first implicit-field or In(sel) + n1.isAdditional(sel.getBase(), "implicit-deref") and + ( + exists(int maxIdx | + maxIdx = max(int i | implicitFieldSelection(sel, i, _)) and + n2.isAdditional(sel, "implicit-field:" + maxIdx.toString()) + ) + or + not implicitFieldSelection(sel, _, _) and n2.isIn(sel) + ) + or + // Between implicit field reads: descend from index i to i-1 + exists(int i | + i > 1 and + implicitFieldSelection(sel, i, _) and + implicitFieldSelection(sel, i - 1, _) and + n1.isAdditional(sel, "implicit-field:" + i.toString()) and + n2.isAdditional(sel, "implicit-field:" + (i - 1).toString()) + ) + or + // Last implicit field read (index 1) → In(sel) + implicitFieldSelection(sel, 1, _) and + n1.isAdditional(sel, "implicit-field:1") and + n2.isIn(sel) + or + n1.isIn(sel) and n2.isAfter(sel) + ) + ) + } + + /** + * Composite literal: In(lit) → element-init chain → After(lit) + * CompositeLit evaluates the literal (allocation) first (pre-order), + * then initializes elements. + */ + private predicate compositeLitStep(PreControlFlowNode n1, PreControlFlowNode n2) { + exists(Go::CompositeLit lit | + // Before → In (the literal allocation) + n1.isBefore(lit) and n2.isIn(lit) + or + // In → first element, or After if no elements + n1.isIn(lit) and + ( + n2.isBefore(lit.getElement(0)) + or + not exists(lit.getElement(_)) and n2.isAfter(lit) + ) + or + // After element → optional lit-index → lit-init → next element or After + exists(int i | + n1.isAfter(lit.getElement(i)) and + ( + n2.isAdditional(lit.getElement(i), "lit-index") + or + not exists(PreControlFlowNode idx | idx.isAdditional(lit.getElement(i), "lit-index")) and + n2.isAdditional(lit.getElement(i), "lit-init") + ) + or + n1.isAdditional(lit.getElement(i), "lit-index") and + n2.isAdditional(lit.getElement(i), "lit-init") + or + n1.isAdditional(lit.getElement(i), "lit-init") and + ( + n2.isBefore(lit.getElement(i + 1)) + or + not exists(lit.getElement(i + 1)) and n2.isAfter(lit) + ) + ) + ) + } + + /** + * Send statement (outside select): channel → value → In(send) + */ + private predicate sendStmtStep(PreControlFlowNode n1, PreControlFlowNode n2) { + exists(Go::SendStmt s | not s = any(Go::CommClause cc).getComm() | + n1.isBefore(s) and n2.isBefore(s.getChannel()) + or + n1.isAfter(s.getChannel()) and n2.isBefore(s.getValue()) + or + n1.isAfter(s.getValue()) and n2.isIn(s) + or + n1.isIn(s) and n2.isAfter(s) + ) + } + + private predicate rangeStmtStep(PreControlFlowNode n1, PreControlFlowNode n2) { + exists(Go::RangeElementExpr p | + // The shared `ForeachStmt` model owns the loop skeleton (testing the + // domain for emptiness, the `[LoopHeader]` join/branch point, and the + // loop exit) and routes control flow into `Before(p)` and out of + // `After(p)`, where `p` is the synthesized "range element" loop + // variable. Here we get the next key-value pair and destructure it into + // the key/value variables using the shared extract/assign epilogue + // machinery. + n1.isBefore(p) and n2.isAdditional(p, "next") + or + n1.isAdditional(p, "next") and + ( + exists(getFirstEpilogueTag(p)) and + n2.isAdditional(p, getFirstEpilogueTag(p)) + or + not exists(getFirstEpilogueTag(p)) and n2.isAfter(p) + ) + or + epilogueSequenceStep(p, n1, n2) + or + n1.isAdditional(p, getLastEpilogueTag(p)) and n2.isAfter(p) + ) + } + + private predicate commClauseBodyStart( + Go::SelectStmt sel, Go::CommClause cc, PreControlFlowNode n + ) { + n.isBefore(cc.getStmt(0)) + or + not exists(cc.getStmt(0)) and n.isAfter(sel) + } + + private predicate selectCommPrepStart(Go::CommClause cc, PreControlFlowNode n) { + exists(Go::RecvStmt recv | recv = cc.getComm() | n.isBefore(recv.getExpr().getOperand())) + or + exists(Go::SendStmt send | send = cc.getComm() | n.isBefore(send.getChannel())) + } + + private predicate selectCommPrepEnd(Go::CommClause cc, PreControlFlowNode n) { + exists(Go::RecvStmt recv | recv = cc.getComm() | n.isAfter(recv.getExpr().getOperand())) + or + exists(Go::SendStmt send | send = cc.getComm() | n.isAfter(send.getValue())) + } + + private predicate selectCommPrepStep( + Go::CommClause cc, PreControlFlowNode n1, PreControlFlowNode n2 + ) { + exists(Go::SendStmt send | send = cc.getComm() | + n1.isAfter(send.getChannel()) and n2.isBefore(send.getValue()) + ) + } + + /** + * Holds if there is a control-flow step from `n1` to `n2` for the + * communication operation of a comm clause of `sel` that has been selected. + * + * The channel operands (and, for a send, the value) of every clause are + * evaluated up front in the prep phase (see `selectCommPrepStart` and + * friends), and the `select` then non-deterministically dispatches to one + * clause via `In(sel) -> Before(cc)`. The communication node itself + * (`In(recv.getExpr())` for a receive, `In(send)` for a send) is therefore + * only reached through that dispatch, never by ordinary left-to-right + * evaluation of the clause. + * + * Default sequencing for the communication statements is suppressed by + * `overridesDefaultControlFlow` above, so the communication can only be + * reached through the select dispatch. + */ + private predicate selectedCommStep( + Go::SelectStmt sel, PreControlFlowNode n1, PreControlFlowNode n2 + ) { + exists(Go::SendStmt send | send = sel.getACommClause().getComm() | + // The send communication happens at `In(send)`; flow then continues to + // the clause body via `selectStmtStep`. + n1.isIn(send) and n2.isAfter(send) + ) + } + + private predicate selectRecvStmtStep( + Go::SelectStmt sel, Go::CommClause cc, Go::RecvStmt recv, PreControlFlowNode n1, + PreControlFlowNode n2 + ) { + cc = sel.getACommClause() and + recv = cc.getComm() and + ( + n1.isIn(recv.getExpr()) and + ( + n2.isBefore(recv.getLhs(0)) + or + not exists(recv.getLhs(0)) and commClauseBodyStart(sel, cc, n2) + ) + or + exists(int j | n1.isAfter(recv.getLhs(j)) and n2.isBefore(recv.getLhs(j + 1))) + or + exists(int last | exists(recv.getLhs(last)) and not exists(recv.getLhs(last + 1)) | + n1.isAfter(recv.getLhs(last)) and + n2.isAdditional(recv, getFirstEpilogueTag(recv)) + ) + or + exists(int last | exists(recv.getLhs(last)) and not exists(recv.getLhs(last + 1)) | + not exists(getFirstEpilogueTag(recv)) and + n1.isAfter(recv.getLhs(last)) and + commClauseBodyStart(sel, cc, n2) + ) + or + epilogueSequenceStep(recv, n1, n2) + or + n1.isAdditional(recv, getLastEpilogueTag(recv)) and + commClauseBodyStart(sel, cc, n2) + ) + } + + private predicate selectStmtStep(PreControlFlowNode n1, PreControlFlowNode n2) { + exists(Go::SelectStmt sel | + selectedCommStep(sel, n1, n2) + or + n1.isBefore(sel) and + ( + selectCommPrepStart(sel.getNonDefaultCommClause(0), n2) + or + not exists(sel.getNonDefaultCommClause(0)) and n2.isIn(sel) + ) + or + exists(Go::CommClause cc, int i | cc = sel.getNonDefaultCommClause(i) | + selectCommPrepStep(cc, n1, n2) + or + selectCommPrepEnd(cc, n1) and + ( + selectCommPrepStart(sel.getNonDefaultCommClause(i + 1), n2) + or + not exists(sel.getNonDefaultCommClause(i + 1)) and n2.isIn(sel) + ) + ) + or + n1.isIn(sel) and + exists(Go::CommClause cc | sel.getACommClause() = cc | n2.isBefore(cc)) + or + exists(Go::CommClause cc | sel.getACommClause() = cc | + n1.isBefore(cc) and + ( + n2.isIn(cc.getComm().(Go::RecvStmt).getExpr()) + or + n2.isIn(cc.getComm().(Go::SendStmt)) + or + not exists(cc.getComm()) and commClauseBodyStart(sel, cc, n2) + ) + or + exists(Go::RecvStmt recv | selectRecvStmtStep(sel, cc, recv, n1, n2)) + or + n1.isAfter(cc.getComm().(Go::SendStmt)) and commClauseBodyStart(sel, cc, n2) + or + exists(int j | n1.isAfter(cc.getStmt(j)) and n2.isBefore(cc.getStmt(j + 1))) + or + exists(int last | + last = max(int j | exists(cc.getStmt(j))) and + n1.isAfter(cc.getStmt(last)) and + n2.isAfter(sel) + ) + ) + ) + } + + private predicate deferStmtStep(PreControlFlowNode n1, PreControlFlowNode n2) { + exists(Go::DeferStmt s | + n1.isBefore(s) and n2.isBefore(s.getCall()) + or + n1.isAfter(s.getCall()) and n2.isIn(s) + or + n1.isIn(s) and n2.isAfter(s) + ) + } + + private predicate goStmtStep(PreControlFlowNode n1, PreControlFlowNode n2) { + exists(Go::GoStmt s | + n1.isBefore(s) and n2.isBefore(s.getCall()) + or + n1.isAfter(s.getCall()) and n2.isIn(s) + or + n1.isIn(s) and n2.isAfter(s) + ) + } + + /** + * Function definition prologue and epilogue: + * - Prologue: parameters are modelled as native CFG nodes by the shared + * library (Entry → param → ... → Before(body)). The remaining + * prologue on Before(body) zero-initializes any named result + * variables: result-zero-init:0 → result-init:0 → ... → first statement. + * - Epilogue: return → result-read:0 → result-read:1 → ... → result-read:last + * + * The last result-read node goes to `NormalExit(fd)` via the shared + * library's `callableExitStep` hook. + */ + private predicate hasFuncDefPrologue(Go::FuncDef fd) { exists(fd.getResultVar(_)) } + + private predicate funcDefBodyStart(Go::FuncDef fd, PreControlFlowNode n) { + n.isBefore(getRankedChild(fd.getBody(), 1)) + or + not exists(getRankedChild(fd.getBody(), _)) and + n.isAfter(fd.getBody()) and + // When Before(body) and After(body) are the same node (the shared library's + // "simple leaf node" optimization merges them for empty bodies without + // additional nodes), don't generate Before→After as it would be a self-loop. + // The callable exit mechanism already routes After(body) → NormalExit. + not n.isBefore(fd.getBody()) + } + + private predicate funcDefStep(PreControlFlowNode n1, PreControlFlowNode n2) { + exists(Go::FuncDef fd | exists(fd.getBody()) | + // Before(body) → first result-var zero-init node. Parameters are + // modelled as native CFG nodes by the shared library and route + // Entry → param → ... → Before(body) ahead of this point; the + // no-result-variable case (Before(body) → first statement) is handled + // by the shared library's default control flow. + n1.isBefore(fd.getBody()) and + exists(fd.getResultVar(0)) and + n2.isAdditional(fd.getBody(), "result-zero-init:0") + or + // result-zero-init:j → result-init:j (for each result variable) + exists(int j | exists(fd.getResultVar(j)) | + n1.isAdditional(fd.getBody(), "result-zero-init:" + j.toString()) and + n2.isAdditional(fd.getBody(), "result-init:" + j.toString()) + ) + or + // result-init:j → next: result-zero-init:(j+1), or Before(body) + exists(int j | exists(fd.getResultVar(j)) | + n1.isAdditional(fd.getBody(), "result-init:" + j.toString()) and + ( + // Next result var exists + exists(fd.getResultVar(j + 1)) and + n2.isAdditional(fd.getBody(), "result-zero-init:" + (j + 1).toString()) + or + // No next result var: go to Before(body) + not exists(fd.getResultVar(j + 1)) and + funcDefBodyStart(fd, n2) + ) + ) + or + // result-read:j → result-read:(j+1); the last result-read node steps to + // the normal exit node via the `callableExitStep` hook. + exists(int j | exists(fd.getResultVar(j + 1)) | + n1.isAdditional(fd.getBody(), "result-read:" + j.toString()) and + n2.isAdditional(fd.getBody(), "result-read:" + (j + 1).toString()) + ) + ) + } + } +} diff --git a/go/ql/lib/semmle/go/controlflow/IR.qll b/go/ql/lib/semmle/go/controlflow/IR.qll index 5c5dce255bcb..f64d8c6072b2 100644 --- a/go/ql/lib/semmle/go/controlflow/IR.qll +++ b/go/ql/lib/semmle/go/controlflow/IR.qll @@ -7,52 +7,112 @@ * structure or type information). * * Each instruction is also a control-flow node, but there are control-flow nodes that are not - * instructions (synthetic entry and exit nodes, as well as no-op skip nodes). + * instructions (synthetic entry and exit nodes, as well as before/after nodes). */ overlay[local] module; import go -private import semmle.go.controlflow.ControlFlowGraphImpl +private import ControlFlowGraphShared +private import codeql.controlflow.SuccessorType /** Provides predicates and classes for working with IR constructs. */ module IR { + /** + * Holds if `e` is in a boolean conditional context, meaning its evaluation + * is split across branch successors rather than producing a single value. + * + * This mirrors the conditions under which the shared CFG library creates + * `TAfterValueNode`s instead of a single `TAfterNode` (see + * `inConditionalContext` in `shared/controlflow/.../ControlFlowGraph.qll`), + * restricted to the Go-relevant cases that affect `NotExpr` and + * `LogicalBinaryExpr`. + */ + private predicate isInBooleanCondContext(Expr e) { + e = any(IfStmt s).getCond() + or + e = any(ForStmt s).getCond() + or + exists(ExpressionSwitchStmt ess | + not exists(ess.getExpr()) and e = ess.getACase().(CaseClause).getExpr(_) + ) + or + e = any(LogicalBinaryExpr be | isInBooleanCondContext(be)).getAnOperand() + or + e = any(NotExpr ne | isInBooleanCondContext(ne)).getOperand() + or + e = any(ParenExpr pe | isInBooleanCondContext(pe)).getExpr() + } + + /** + * Holds if `n` is the control-flow node representing a successful match of + * the type-switch case clause `cc` that implicitly declares a variable. + * + * This node dominates the case body and is where the implicit per-case + * variable declaration/assignment is materialised (see + * `TypeSwitchImplicitVariableInstruction`). + */ + private predicate typeSwitchCaseMatch(ControlFlow::Node n, CaseClause cc) { + cc = any(TypeSwitchStmt ts).getACase() and + exists(cc.getImplicitlyDeclaredVariable()) and + n.isAfterValue(cc, any(MatchingSuccessor t | t.isMatch())) + } + + /** + * Holds if `n` is a genuine boolean condition-guard node: an "after" node + * that records exactly one of the true/false outcomes of a boolean + * condition. + * + * The shared CFG library's `isAfterTrue`/`isAfterFalse` are deliberately + * permissive when used for step-endpoint matching: a plain "after" node (or + * a merged leaf node) satisfies both of them. A real guard node is + * distinguished by satisfying exactly one of them. + */ + private predicate isConditionGuardNode(ControlFlow::Node n) { + n.isAfterTrue(_) and not n.isAfterFalse(_) + or + n.isAfterFalse(_) and not n.isAfterTrue(_) + or + exists(Expr condition, MatchingSuccessor successor | + condition = + any(ExpressionSwitchStmt switch | not exists(switch.getExpr())).getACase().getAnExpr() and + n.isAfterValue(condition, successor) + ) + } + /** * An IR instruction. */ class Instruction extends ControlFlow::Node { Instruction() { - this instanceof MkExprNode or - this instanceof MkLiteralElementInitNode or - this instanceof MkImplicitLiteralElementIndex or - this instanceof MkAssignNode or - this instanceof MkCompoundAssignRhsNode or - this instanceof MkExtractNode or - this instanceof MkZeroInitNode or - this instanceof MkFuncDeclNode or - this instanceof MkDeferNode or - this instanceof MkGoNode or - this instanceof MkConditionGuardNode or - this instanceof MkIncDecNode or - this instanceof MkIncDecRhs or - this instanceof MkImplicitOne or - this instanceof MkReturnNode or - this instanceof MkResultWriteNode or - this instanceof MkResultReadNode or - this instanceof MkSelectNode or - this instanceof MkSendNode or - this instanceof MkParameterInit or - this instanceof MkArgumentNode or - this instanceof MkResultInit or - this instanceof MkNextNode or - this instanceof MkImplicitTrue or - this instanceof MkCaseCheckNode or - this instanceof MkTypeSwitchImplicitVariable or - this instanceof MkImplicitLowerSliceBound or - this instanceof MkImplicitUpperSliceBound or - this instanceof MkImplicitMaxSliceBound or - this instanceof MkImplicitDeref or - this instanceof MkImplicitFieldSelection + this.isIn(_) + or + this.isAdditional(_, _) + or + isConditionGuardNode(this) + or + // The successful-match node of a type-switch case that binds an implicit + // variable hosts that variable's declaration/assignment (see + // `TypeSwitchImplicitVariableInstruction`). + typeSwitchCaseMatch(this, _) + or + // `NotExpr` and `LogicalBinaryExpr` are not in `postOrInOrder`, so they + // have no `isIn` node. When such an expression is not in a conditional + // context (so it has a single combined after-node rather than per-branch + // value-after-nodes), use that after-node as the value-producing + // instruction. In conditional contexts the value is already split + // across branches and the `ConditionGuardInstruction` for each branch + // captures the outcome, so no separate value instruction is needed. + exists(Expr e | + (e instanceof NotExpr or e instanceof LogicalBinaryExpr) and + not isInBooleanCondContext(e) and + this.isAfter(e) + ) + or + // A named parameter is represented by a single CFG node (the merged + // "before"/"after" leaf node for its declaration), which hosts the + // initialization write (see `InitParameterInstruction`). + this.isBefore(any(FuncDef fd).getParameter(_).getDeclaration()) } /** Holds if this instruction reads the value of variable or constant `v`. */ @@ -120,78 +180,95 @@ module IR { /** Gets a textual representation of the kind of this instruction. */ string getInsnKind() { - this instanceof MkExprNode and result = "expression" + this instanceof EvalInstruction and result = "expression" or - this instanceof MkLiteralElementInitNode and result = "element init" + this instanceof InitLiteralComponentInstruction and result = "element init" or - this instanceof MkImplicitLiteralElementIndex and result = "element index" + this instanceof ImplicitLiteralElementIndexInstruction and result = "element index" or - this instanceof MkAssignNode and result = "assignment" + this instanceof AssignInstruction and result = "assignment" or - this instanceof MkCompoundAssignRhsNode and result = "right-hand side of compound assignment" + this instanceof EvalCompoundAssignRhsInstruction and + result = "right-hand side of compound assignment" or - this instanceof MkExtractNode and result = "tuple element extraction" + this instanceof ExtractTupleElementInstruction and result = "tuple element extraction" or - this instanceof MkZeroInitNode and result = "zero value" + this instanceof EvalImplicitInitInstruction and result = "zero value" or - this instanceof MkFuncDeclNode and result = "function declaration" + this instanceof DeclareFunctionInstruction and result = "function declaration" or - this instanceof MkDeferNode and result = "defer" + this instanceof DeferInstruction and result = "defer" or - this instanceof MkGoNode and result = "go" + this instanceof GoInstruction and result = "go" or - this instanceof MkConditionGuardNode and result = "condition guard" + this instanceof ConditionGuardInstruction and result = "condition guard" or - this instanceof MkIncDecNode and result = "increment/decrement" + this instanceof IncDecInstruction and result = "increment/decrement" or - this instanceof MkIncDecRhs and result = "right-hand side of increment/decrement" + this instanceof EvalIncDecRhsInstruction and + result = "right-hand side of increment/decrement" or - this instanceof MkImplicitOne and result = "implicit 1" + this instanceof EvalImplicitOneInstruction and result = "implicit 1" or - this instanceof MkReturnNode and result = "return" + this instanceof ReturnInstruction and result = "return" or - this instanceof MkResultWriteNode and result = "result write" + this instanceof WriteResultInstruction and result = "result write" or - this instanceof MkResultReadNode and result = "result read" + this instanceof ReadResultInstruction and result = "result read" or - this instanceof MkSelectNode and result = "select" + this instanceof InitParameterInstruction and result = "parameter initialization" or - this instanceof MkSendNode and result = "send" + this instanceof InitResultInstruction and result = "result initialization" or - this instanceof MkParameterInit and result = "parameter initialization" + this instanceof GetNextEntryInstruction and result = "next key-value pair" or - this instanceof MkArgumentNode and result = "argument" + this instanceof EvalImplicitTrueInstruction and result = "implicit true" or - this instanceof MkResultInit and result = "result initialization" + this instanceof CaseInstruction and result = "case" or - this instanceof MkNextNode and result = "next key-value pair" - or - this instanceof MkImplicitTrue and result = "implicit true" - or - this instanceof MkCaseCheckNode and result = "case" - or - this instanceof MkTypeSwitchImplicitVariable and + this instanceof TypeSwitchImplicitVariableInstruction and result = "type switch implicit variable declaration" or - this instanceof MkImplicitLowerSliceBound and result = "implicit lower bound" + this instanceof EvalImplicitLowerSliceBoundInstruction and result = "implicit lower bound" or - this instanceof MkImplicitUpperSliceBound and result = "implicit upper bound" + this instanceof EvalImplicitUpperSliceBoundInstruction and result = "implicit upper bound" or - this instanceof MkImplicitMaxSliceBound and result = "implicit maximum" + this instanceof EvalImplicitMaxSliceBoundInstruction and result = "implicit maximum" or - this instanceof MkImplicitDeref and result = "implicit dereference" + this instanceof EvalImplicitDerefInstruction and result = "implicit dereference" or - this instanceof MkImplicitFieldSelection and result = "implicit field selection" + this instanceof ImplicitFieldReadInstruction and result = "implicit field selection" } } + /** A condition guard instruction, representing a known boolean outcome for a condition. */ + private class ConditionGuardInstruction extends Instruction { + ConditionGuardInstruction() { isConditionGuardNode(this) } + } + /** * An IR instruction representing the evaluation of an expression. */ - class EvalInstruction extends Instruction, MkExprNode { + class EvalInstruction extends Instruction { Expr e; - EvalInstruction() { this = MkExprNode(e) } + EvalInstruction() { + this.isIn(e) + or + // The call of a `defer` statement is pre-order (it has no in-order + // "invocation" node at the statement), so its value is produced by the + // `defer-invoke` node that models the call at function exit. + this.isAdditional(e, "defer-invoke") + or + // `NotExpr` and `LogicalBinaryExpr` are not in `postOrInOrder`, so they + // don't have an `isIn` node. Only use the after-node when the + // expression is not in a conditional context; otherwise the value is + // split across `TAfterValueNode`s per branch and should not be exposed + // as a single value-producing instruction. + (e instanceof NotExpr or e instanceof LogicalBinaryExpr) and + not isInBooleanCondContext(e) and + this.isAfter(e) + } /** Gets the expression underlying this instruction. */ Expr getExpr() { result = e } @@ -217,10 +294,6 @@ module IR { override predicate isConst() { e.isConst() } override predicate isPlatformIndependentConstant() { e.isPlatformIndependentConstant() } - - override string toString() { result = e.toString() } - - override Location getLocation() { result = e.getLocation() } } /** @@ -236,17 +309,13 @@ module IR { or this instanceof ReadResultInstruction or - this instanceof MkImplicitFieldSelection + this instanceof ImplicitFieldReadInstruction } } /** * Gets the effective base of a selector, index or slice expression, taking implicit dereferences * and implicit field reads into account. - * - * For a selector expression `b.f`, this could be the implicit dereference `*b`, or the implicit - * field access `b.Embedded` if the field `f` is promoted from an embedded type `Embedded`, or a - * combination of both `*(b.Embedded)`, or simply `b` if neither case applies. */ private Instruction selectorBase(Expr e) { exists(ImplicitFieldReadInstruction fri | fri.getSelectorExpr() = e and fri.getIndex() = 1 | @@ -261,17 +330,15 @@ module IR { or base = e.(SliceExpr).getBase() | - result = MkImplicitDeref(base) + result = implicitDerefInstruction(base) or - not exists(MkImplicitDeref(base)) and + not exists(implicitDerefInstruction(base)) and result = evalExprInstruction(base) ) } /** * An IR instruction that reads a component from a composite object. - * - * This is either a field of a struct, or an element of an array, map, slice or string. */ class ComponentReadInstruction extends ReadInstruction { ComponentReadInstruction() { @@ -282,7 +349,7 @@ module IR { not e.(SelectorExpr).getSelector() = any(Method method).getAReference() ) or - this instanceof MkImplicitFieldSelection + this instanceof ImplicitFieldReadInstruction } /** Gets the instruction computing the base value on which the field or element is read. */ @@ -295,9 +362,6 @@ module IR { /** * An IR instruction that reads the value of a field. - * - * On databases with incomplete type information, method expressions may sometimes be - * misclassified as field reads. */ class FieldReadInstruction extends ComponentReadInstruction { SelectorExpr e; @@ -309,7 +373,9 @@ module IR { index = 0 and field.getAReference() = e.getSelector() or - this = MkImplicitFieldSelection(e, index, field) + this.(ImplicitFieldReadInstruction).getSelectorExpr() = e and + this.(ImplicitFieldReadInstruction).getIndex() = index and + this.(ImplicitFieldReadInstruction).getField() = field } /** Gets the `SelectorExpr` of this field read. */ @@ -332,9 +398,9 @@ module IR { fri.getSelectorExpr() = e and fri.getIndex() = pragma[only_bind_into](index + 1) ) and ( - result = MkImplicitDeref(e.getBase()) + result = implicitDerefInstruction(e.getBase()) or - not exists(MkImplicitDeref(e.getBase())) and + not exists(implicitDerefInstruction(e.getBase())) and result = evalExprInstruction(e.getBase()) ) } @@ -345,24 +411,51 @@ module IR { } /** - * An IR instruction for an implicit field read as part of reading a - * promoted field. - * - * If the field that is being implicitly read has a pointer type then this - * instruction represents an implicit dereference of it. + * An IR instruction for an implicit field read as part of reading a promoted field. */ - class ImplicitFieldReadInstruction extends FieldReadInstruction, MkImplicitFieldSelection { - ImplicitFieldReadInstruction() { this = MkImplicitFieldSelection(e, index, field) } + class ImplicitFieldReadInstruction extends Instruction { + SelectorExpr sel; + int idx; + Field fld; + + ImplicitFieldReadInstruction() { + this.isAdditional(sel, "implicit-field:" + idx.toString()) and + CfgImpl::implicitFieldSelection(sel, idx, fld) + } - override predicate reads(ValueEntity v) { v = field } + /** Gets the `SelectorExpr` for which this is an implicit field read. */ + SelectorExpr getSelectorExpr() { result = sel } - override Type getResultType() { result = lookThroughPointerType(field.getType()) } + /** Gets the index of this implicit field read. */ + int getIndex() { result = idx } - override ControlFlow::Root getRoot() { result.isRootOf(e) } + /** Gets the field being read. */ + Field getField() { result = fld } + + /** Gets the instruction computing the base value on which the field is read. */ + Instruction getBaseInstruction() { + exists(ImplicitFieldReadInstruction fri | + fri.getSelectorExpr() = sel and fri.getIndex() = pragma[only_bind_into](idx + 1) + | + result = fri + ) + or + not exists(ImplicitFieldReadInstruction fri | + fri.getSelectorExpr() = sel and fri.getIndex() = pragma[only_bind_into](idx + 1) + ) and + ( + result = implicitDerefInstruction(sel.getBase()) + or + not exists(implicitDerefInstruction(sel.getBase())) and + result = evalExprInstruction(sel.getBase()) + ) + } - override string toString() { result = "implicit-field:" + index + " " + e } + override predicate reads(ValueEntity v) { v = fld } - override Location getLocation() { result = e.getLocation() } + override Type getResultType() { result = lookThroughPointerType(fld.getType()) } + + override ControlFlow::Root getRoot() { result.isRootOf(sel) } } /** @@ -463,28 +556,26 @@ module IR { /** * An IR instruction that initializes a component of a composite literal. */ - class InitLiteralComponentInstruction extends WriteInstruction, MkLiteralElementInitNode { + class InitLiteralComponentInstruction extends WriteInstruction { CompositeLit lit; - int i; + int litIdx; Expr elt; InitLiteralComponentInstruction() { - this = MkLiteralElementInitNode(elt) and elt = lit.getElement(i) + this.isAdditional(elt, "lit-init") and + elt = lit.getElement(litIdx) } /** Gets the instruction allocating the composite literal. */ Instruction getBase() { result = evalExprInstruction(lit) } override Instruction getRhs() { - result = evalExprInstruction(elt) or + not elt instanceof KeyValueExpr and result = evalExprInstruction(elt) + or result = evalExprInstruction(elt.(KeyValueExpr).getValue()) } override ControlFlow::Root getRoot() { result.isRootOf(elt) } - - override string toString() { result = "lit-init " + elt } - - override Location getLocation() { result = elt.getLocation() } } /** @@ -498,7 +589,7 @@ module IR { string getFieldName() { if elt instanceof KeyValueExpr then result = elt.(KeyValueExpr).getKey().(Ident).getName() - else pragma[only_bind_out](lit.getStructType()).hasOwnField(i, result, _, _) + else pragma[only_bind_out](lit.getStructType()).hasOwnField(litIdx, result, _, _) } /** Gets the initialized field. */ @@ -527,34 +618,26 @@ module IR { Instruction getIndex() { result = evalExprInstruction(elt.(KeyValueExpr).getKey()) or - result = MkImplicitLiteralElementIndex(elt) + result.(ImplicitLiteralElementIndexInstruction).isAdditional(elt, "lit-index") } } - /** - * An IR instruction that initializes an element of an array literal. - */ + /** An IR instruction that initializes an element of an array literal. */ class InitLiteralArrayElementInstruction extends InitLiteralElementInstruction { override ArrayType literalType; } - /** - * An IR instruction that initializes an element of a slice literal. - */ + /** An IR instruction that initializes an element of a slice literal. */ class InitLiteralSliceElementInstruction extends InitLiteralElementInstruction { override SliceType literalType; } - /** - * An IR instruction that initializes an element of a map literal. - */ + /** An IR instruction that initializes an element of a map literal. */ class InitLiteralMapElementInstruction extends InitLiteralElementInstruction { override MapType literalType; } - /** - * An IR instruction that writes to a field. - */ + /** An IR instruction that writes to a field. */ class FieldWriteInstruction extends WriteInstruction { override FieldTarget lhs; @@ -565,43 +648,35 @@ module IR { Field getField() { result = lhs.getField() } override predicate writesField(Instruction base, Field f, Instruction rhs) { - this.getBase() = base and - this.getField() = f and - this.getRhs() = rhs + this.getBase() = base and this.getField() = f and this.getRhs() = rhs } } - /** - * An IR instruction that writes to an element of an array, slice, or map. - */ + /** An IR instruction that writes to an element of an array, slice, or map. */ class ElementWriteInstruction extends WriteInstruction { override ElementTarget lhs; - /** Gets the instruction computing the base value on which the field is written. */ + /** Gets the instruction computing the base value on which the element is written. */ Instruction getBase() { result = lhs.getBase() } /** Gets the instruction computing the element index being written. */ Instruction getIndex() { result = lhs.getIndex() } override predicate writesElement(Instruction base, Instruction index) { - this.getBase() = base and - this.getIndex() = index + this.getBase() = base and this.getIndex() = index } } - /** Holds if `lit` does not specify any explicit keys. */ private predicate noExplicitKeys(CompositeLit lit) { not lit.getAnElement() instanceof KeyValueExpr } - /** Gets the index of the `i`th element in (array or slice) literal `lit`. */ private int getElementIndex(CompositeLit lit, int i) { ( lit.getType().getUnderlyingType() instanceof ArrayType or lit.getType().getUnderlyingType() instanceof SliceType ) and exists(Expr elt | elt = lit.getElement(i) | - // short-circuit computation for literals without any explicit keys noExplicitKeys(lit) and result = i or result = elt.(KeyValueExpr).getKey().getIntValue() @@ -618,10 +693,10 @@ module IR { /** * An IR instruction computing the implicit index of an element in an array or slice literal. */ - class ImplicitLiteralElementIndexInstruction extends Instruction, MkImplicitLiteralElementIndex { + class ImplicitLiteralElementIndexInstruction extends Instruction { Expr elt; - ImplicitLiteralElementIndexInstruction() { this = MkImplicitLiteralElementIndex(elt) } + ImplicitLiteralElementIndexInstruction() { this.isAdditional(elt, "lit-index") } override Type getResultType() { result instanceof IntType } @@ -638,20 +713,25 @@ module IR { override predicate isPlatformIndependentConstant() { any() } override predicate isConst() { any() } - - override string toString() { result = "element index" } - - override Location getLocation() { result = elt.getLocation() } } /** * An instruction assigning to a variable or field. */ - class AssignInstruction extends WriteInstruction, MkAssignNode { + class AssignInstruction extends WriteInstruction { AstNode assgn; int i; - AssignInstruction() { this = MkAssignNode(assgn, i) } + AssignInstruction() { + this.isAdditional(assgn, "assign:" + i.toString()) and + ( + exists(assgn.(Assignment).getLhs(i)) + or + exists(assgn.(ValueSpec).getNameExpr(i)) + or + assgn instanceof RangeElementExpr and i in [0, 1] + ) + } override Instruction getRhs() { exists(SimpleAssignStmt a | a = assgn | @@ -663,51 +743,63 @@ module IR { spec.getNumName() = spec.getNumInit() and result = evalExprInstruction(spec.getInit(i)) or - result = MkZeroInitNode(any(ValueEntity v | spec.getNameExpr(i) = v.getDeclaration())) + result = + implicitInitInstruction(any(ValueEntity v | spec.getNameExpr(i) = v.getDeclaration())) ) or - result = MkCompoundAssignRhsNode(assgn) + result.(EvalCompoundAssignRhsInstruction).isAdditional(assgn, "compound-rhs") or - result = MkExtractNode(assgn, i) + result.(ExtractTupleElementInstruction).isAdditional(assgn, "extract:" + i.toString()) } override ControlFlow::Root getRoot() { result.isRootOf(assgn) } - - override string toString() { result = "assign:" + i + " " + assgn } - - override Location getLocation() { result = assgn.getLocation() } } - /** An instruction computing the value of the right-hand side of a compound assignment. */ - class EvalCompoundAssignRhsInstruction extends Instruction, MkCompoundAssignRhsNode { + /** + * An instruction that computes the (implicit) right-hand side of a compound assignment. + */ + class EvalCompoundAssignRhsInstruction extends Instruction { CompoundAssignStmt assgn; - EvalCompoundAssignRhsInstruction() { this = MkCompoundAssignRhsNode(assgn) } + EvalCompoundAssignRhsInstruction() { this.isAdditional(assgn, "compound-rhs") } - /** Gets the underlying assignment of this instruction. */ + /** Gets the corresponding compound assignment statement. */ CompoundAssignStmt getAssignment() { result = assgn } override Type getResultType() { result = assgn.getRhs().getType() } override ControlFlow::Root getRoot() { result.isRootOf(assgn) } - - override string toString() { result = "compound-rhs " + assgn } - - override Location getLocation() { result = assgn.getLocation() } } - /** - * An instruction selecting one of multiple values returned by a function, or either the key - * or the value of the iterator in a range loop, or the result or success value from a type - * assertion. - */ - class ExtractTupleElementInstruction extends Instruction, MkExtractNode { + /** An instruction extracting a component of a tuple value. */ + class ExtractTupleElementInstruction extends Instruction { AstNode s; int i; - ExtractTupleElementInstruction() { this = MkExtractNode(s, i) } + ExtractTupleElementInstruction() { + this.isAdditional(s, "extract:" + i.toString()) and + ( + exists(s.(Assignment).getLhs(i)) + or + exists(s.(ValueSpec).getNameExpr(i)) + or + s instanceof RangeElementExpr and i in [0, 1] + or + exists(s.(ReturnStmt).getEnclosingFunction().getType().(SignatureType).getResultType(i)) + or + exists( + s.(CallExpr) + .getArgument(0) + .stripParens() + .(CallExpr) + .getType() + .(TupleType) + .getComponentType(i) + ) + ) + } - /** Gets the instruction computing the tuple value from which one value is extracted. */ + /** Gets the instruction computing the tuple value from which the element is extracted. */ Instruction getBase() { exists(Expr baseExpr | baseExpr = s.(Assignment).getRhs() or @@ -716,14 +808,14 @@ module IR { result = evalExprInstruction(baseExpr) ) or - result = MkNextNode(s) + result.(GetNextEntryInstruction).isAdditional(s, "next") or result = evalExprInstruction(s.(ReturnStmt).getExpr()) or result = evalExprInstruction(s.(CallExpr).getArgument(0).stripParens()) } - /** Holds if this extracts the `idx`th value of the result of `base`. */ + /** Holds if this instruction extracts element `idx` from the tuple `base`. */ predicate extractsElement(Instruction base, int idx) { base = this.getBase() and idx = i } override Type getResultType() { @@ -731,58 +823,60 @@ module IR { result = e.getType().(TupleType).getComponentType(pragma[only_bind_into](i)) ) or - exists(Type rangeType | rangeType = s.(RangeStmt).getDomain().getType().getUnderlyingType() | + exists(Type rangeType | + rangeType = s.(RangeElementExpr).getDomain().getType().getUnderlyingType() + | exists(Type baseType | baseType = rangeType.(ArrayType).getElementType() or baseType = rangeType.(PointerType).getBaseType().getUnderlyingType().(ArrayType).getElementType() or baseType = rangeType.(SliceType).getElementType() | - i = 0 and - result instanceof IntType + i = 0 and result instanceof IntType or - i = 1 and - result = baseType + i = 1 and result = baseType ) or rangeType instanceof StringType and ( - i = 0 and - result instanceof IntType + i = 0 and result instanceof IntType or result = Builtin::rune().getType() ) or exists(MapType map | map = rangeType | - i = 0 and - result = map.getKeyType() + i = 0 and result = map.getKeyType() or - i = 1 and - result = map.getValueType() + i = 1 and result = map.getValueType() ) or - i = 0 and - result = rangeType.(RecvChanType).getElementType() + i = 0 and result = rangeType.(RecvChanType).getElementType() or - i = 0 and - result = rangeType.(SendRecvChanType).getElementType() + i = 0 and result = rangeType.(SendRecvChanType).getElementType() ) } override ControlFlow::Root getRoot() { result.isRootOf(s) } - - override string toString() { result = "extract:" + i + " " + s } - - override Location getLocation() { result = s.getLocation() } } /** - * An instruction that computes the zero value for a variable or constant. + * An instruction that computes the zero value to which a variable without an initializer + * expression is initialized. */ - class EvalImplicitInitInstruction extends Instruction, MkZeroInitNode { + class EvalImplicitInitInstruction extends Instruction { ValueEntity v; - EvalImplicitInitInstruction() { this = MkZeroInitNode(v) } + EvalImplicitInitInstruction() { + exists(ValueSpec spec, int idx | + this.isAdditional(spec, "zero-init:" + idx.toString()) and + spec.getNameExpr(idx) = v.getDeclaration() + ) + or + exists(FuncDef fd, int idx | + this.isAdditional(fd.getBody(), "result-zero-init:" + idx.toString()) and + v = fd.getResultVar(idx) + ) + } override Type getResultType() { result = v.getType() } @@ -814,101 +908,56 @@ module IR { override predicate isConst() { any() } override predicate isPlatformIndependentConstant() { any() } - - override string toString() { - exists(ValueSpec spec, int i | - spec.getNameExpr(i) = v.getDeclaration() and - result = "zero-init:" + i + " " + spec - ) - or - exists(ResultVariable res, FuncDef fd, int i | - v = res and - res = fd.getResultVar(i) and - result = "result-zero-init:" + i + " " + fd.getBody() - ) - } - - override Location getLocation() { - exists(ValueSpec spec, int i | - spec.getNameExpr(i) = v.getDeclaration() and result = spec.getLocation() - ) - or - exists(ResultVariable res, FuncDef fd | - v = res and res = fd.getAResultVar() and result = fd.getBody().getLocation() - ) - } } - /** - * An instruction that corresponds to the declaration of a function. - */ - class DeclareFunctionInstruction extends Instruction, MkFuncDeclNode { + /** An instruction that declares a function. */ + class DeclareFunctionInstruction extends Instruction { FuncDecl fd; - DeclareFunctionInstruction() { this = MkFuncDeclNode(fd) } + DeclareFunctionInstruction() { this.isIn(fd) } override Type getResultType() { result = fd.getType() } - - override string toString() { result = fd.toString() } - - override Location getLocation() { result = fd.getLocation() } } - /** - * An instruction that corresponds to a `defer` statement. - */ - class DeferInstruction extends Instruction, MkDeferNode { + /** An instruction that corresponds to a `defer` statement. */ + class DeferInstruction extends Instruction { DeferStmt defer; - DeferInstruction() { this = MkDeferNode(defer) } + DeferInstruction() { this.isIn(defer) } override ControlFlow::Root getRoot() { result.isRootOf(defer) } - - override string toString() { result = defer.toString() } - - override Location getLocation() { result = defer.getLocation() } } - /** - * An instruction that corresponds to a `go` statement. - */ - class GoInstruction extends Instruction, MkGoNode { + /** An instruction that corresponds to a `go` statement. */ + class GoInstruction extends Instruction { GoStmt go; - GoInstruction() { this = MkGoNode(go) } + GoInstruction() { this.isIn(go) } override ControlFlow::Root getRoot() { result.isRootOf(go) } - - override string toString() { result = go.toString() } - - override Location getLocation() { result = go.getLocation() } } - /** - * An instruction that corresponds to an increment or decrement statement. - */ - class IncDecInstruction extends WriteInstruction, MkIncDecNode { + /** An instruction that corresponds to an increment or decrement statement. */ + class IncDecInstruction extends WriteInstruction { IncDecStmt ids; - IncDecInstruction() { this = MkIncDecNode(ids) } + IncDecInstruction() { this.isIn(ids) } - override Instruction getRhs() { result = MkIncDecRhs(ids) } + override Instruction getRhs() { + result.(EvalIncDecRhsInstruction).isAdditional(ids, "incdec-rhs") + } override ControlFlow::Root getRoot() { result.isRootOf(ids) } - - override string toString() { result = ids.toString() } - - override Location getLocation() { result = ids.getLocation() } } /** * An instruction that computes the (implicit) right-hand side of an increment or * decrement statement. */ - class EvalIncDecRhsInstruction extends Instruction, MkIncDecRhs { + class EvalIncDecRhsInstruction extends Instruction { IncDecStmt ids; - EvalIncDecRhsInstruction() { this = MkIncDecRhs(ids) } + EvalIncDecRhsInstruction() { this.isAdditional(ids, "incdec-rhs") } /** Gets the corresponding increment or decrement statement. */ IncDecStmt getStmt() { result = ids } @@ -916,19 +965,13 @@ module IR { override Type getResultType() { result = ids.getOperand().getType() } override ControlFlow::Root getRoot() { result.isRootOf(ids) } - - override string toString() { result = "incdec-rhs " + ids } - - override Location getLocation() { result = ids.getLocation() } } - /** - * An instruction computing the implicit operand `1` in an increment or decrement statement. - */ - class EvalImplicitOneInstruction extends Instruction, MkImplicitOne { + /** An instruction computing the implicit operand `1` in an increment or decrement statement. */ + class EvalImplicitOneInstruction extends Instruction { IncDecStmt ids; - EvalImplicitOneInstruction() { this = MkImplicitOne(ids) } + EvalImplicitOneInstruction() { this.isAdditional(ids, "implicit-one") } /** Gets the corresponding increment or decrement statement. */ IncDecStmt getStmt() { result = ids } @@ -944,25 +987,23 @@ module IR { override predicate isConst() { any() } override predicate isPlatformIndependentConstant() { any() } - - override string toString() { result = "1" } - - override Location getLocation() { result = ids.getLocation() } } - /** - * An instruction corresponding to a return from a function. - */ - class ReturnInstruction extends Instruction, MkReturnNode { + /** An instruction corresponding to a return from a function. */ + class ReturnInstruction extends Instruction { ReturnStmt ret; - ReturnInstruction() { this = MkReturnNode(ret) } + ReturnInstruction() { this.isIn(ret) } /** Gets the corresponding `ReturnStmt`. */ ReturnStmt getReturnStmt() { result = ret } /** Holds if this statement returns multiple results. */ - predicate returnsMultipleResults() { exists(MkExtractNode(ret, _)) or ret.getNumExpr() > 1 } + predicate returnsMultipleResults() { + exists(ExtractTupleElementInstruction ext | ext.isAdditional(ret, _)) + or + ret.getNumExpr() > 1 + } /** Gets the instruction whose result is the (unique) result returned by this statement. */ Instruction getResult() { @@ -972,36 +1013,34 @@ module IR { /** Gets the instruction whose result is the `i`th result returned by this statement. */ Instruction getResult(int i) { - result = MkExtractNode(ret, i) + result.isAdditional(ret, _) and + result.(ExtractTupleElementInstruction).extractsElement(_, i) or - not exists(MkExtractNode(ret, _)) and + not exists(ExtractTupleElementInstruction ext | ext.isAdditional(ret, _)) and result = evalExprInstruction(ret.getExpr(i)) } override ControlFlow::Root getRoot() { result.isRootOf(ret) } - - override string toString() { result = ret.toString() } - - override Location getLocation() { result = ret.getLocation() } } /** * An instruction that represents the implicit assignment to a result variable * performed by a return statement. */ - class WriteResultInstruction extends WriteInstruction, MkResultWriteNode { + class WriteResultInstruction extends WriteInstruction { ResultVariable var; - int i; - ReturnInstruction ret; + int idx; + ReturnStmt retStmt; WriteResultInstruction() { - exists(ReturnStmt retstmt | - this = MkResultWriteNode(var, i, retstmt) and - ret = MkReturnNode(retstmt) - ) + this.isAdditional(retStmt, "result-write:" + idx.toString()) and + var = retStmt.getEnclosingFunction().getResultVar(idx) and + exists(retStmt.getAnExpr()) } - override Instruction getRhs() { result = ret.getResult(i) } + private ReturnInstruction getReturnInstruction() { result.getReturnStmt() = retStmt } + + override Instruction getRhs() { result = this.getReturnInstruction().getResult(idx) } /** Gets the result variable being assigned. */ ResultVariable getResultVariable() { result = var } @@ -1009,150 +1048,88 @@ module IR { override Type getResultType() { result = var.getType() } override ControlFlow::Root getRoot() { var = result.(FuncDef).getAResultVar() } - - override string toString() { result = "result-write:" + i + " " + ret.getReturnStmt() } - - override Location getLocation() { result = ret.getReturnStmt().getLocation() } } /** * An instruction that reads the final value of a result variable upon returning * from a function. */ - class ReadResultInstruction extends Instruction, MkResultReadNode { + class ReadResultInstruction extends Instruction { ResultVariable var; + int idx; + FuncDef fd; - ReadResultInstruction() { this = MkResultReadNode(var) } + ReadResultInstruction() { + this.isAdditional(fd.getBody(), "result-read:" + idx.toString()) and + var = fd.getResultVar(idx) + } override predicate reads(ValueEntity v) { v = var } override Type getResultType() { result = var.getType() } override ControlFlow::Root getRoot() { var = result.(FuncDef).getAResultVar() } - - override string toString() { - exists(FuncDef fd, int i | - var = fd.getResultVar(i) and result = "result-read:" + i + " " + fd.getBody() - ) - } - - override Location getLocation() { - exists(FuncDef fd | var = fd.getAResultVar() | result = fd.getBody().getLocation()) - } - } - - /** - * An instruction corresponding to a `select` statement. - */ - class SelectInstruction extends Instruction, MkSelectNode { - SelectStmt sel; - - SelectInstruction() { this = MkSelectNode(sel) } - - override ControlFlow::Root getRoot() { result.isRootOf(sel) } - - override string toString() { result = sel.toString() } - - override Location getLocation() { result = sel.getLocation() } } - /** - * An instruction corresponding to a send statement. - */ - class SendInstruction extends Instruction, MkSendNode { - SendStmt send; - - SendInstruction() { this = MkSendNode(send) } - - override ControlFlow::Root getRoot() { result.isRootOf(send) } - - override string toString() { result = send.toString() } - - override Location getLocation() { result = send.getLocation() } - } - - /** - * An instruction initializing a parameter to the corresponding argument. - */ - class InitParameterInstruction extends WriteInstruction, MkParameterInit { + /** An instruction initializing a parameter to the corresponding argument. */ + class InitParameterInstruction extends WriteInstruction { Parameter parm; + int idx; + FuncDef fd; - InitParameterInstruction() { this = MkParameterInit(parm) } - - override Instruction getRhs() { result = MkArgumentNode(parm) } - - override ControlFlow::Root getRoot() { result = parm.getFunction() } - - override string toString() { result = parm.toString() } - - override Location getLocation() { result = parm.getDeclaration().getLocation() } - } - - /** - * An instruction reading the value of a function argument. - */ - class ReadArgumentInstruction extends Instruction, MkArgumentNode { - Parameter parm; + InitParameterInstruction() { + this.isBefore(parm.getDeclaration()) and + parm = fd.getParameter(idx) + } - ReadArgumentInstruction() { this = MkArgumentNode(parm) } + override Instruction getRhs() { result = this } override Type getResultType() { result = parm.getType() } override ControlFlow::Root getRoot() { result = parm.getFunction() } - - override string toString() { result = parm.toString() } - - override Location getLocation() { result = parm.getDeclaration().getLocation() } } - /** - * An instruction initializing a result variable to its zero value. - */ - class InitResultInstruction extends WriteInstruction, MkResultInit { + /** An instruction initializing a result variable to its zero value. */ + class InitResultInstruction extends WriteInstruction { ResultVariable res; + int idx; + FuncDef fd; - InitResultInstruction() { this = MkResultInit(res) } - - override Instruction getRhs() { result = MkZeroInitNode(res) } - - override ControlFlow::Root getRoot() { result = res.getFunction() } + InitResultInstruction() { + this.isAdditional(fd.getBody(), "result-init:" + idx.toString()) and + res = fd.getResultVar(idx) + } - override string toString() { - exists(FuncDef fd, int i | - res = fd.getResultVar(i) and result = "result-init:" + i + " " + fd.getBody() - ) + override Instruction getRhs() { + result + .(EvalImplicitInitInstruction) + .isAdditional(fd.getBody(), "result-zero-init:" + idx.toString()) } - override Location getLocation() { result = res.getFunction().getBody().getLocation() } + override ControlFlow::Root getRoot() { result = res.getFunction() } } - /** - * An instruction that gets the next key-value pair in a range loop. - */ - class GetNextEntryInstruction extends Instruction, MkNextNode { - RangeStmt rs; + /** An instruction that gets the next key-value pair in a range loop. */ + class GetNextEntryInstruction extends Instruction { + RangeElementExpr p; - GetNextEntryInstruction() { this = MkNextNode(rs) } + GetNextEntryInstruction() { this.isAdditional(p, "next") } /** * Gets the instruction computing the value whose key-value pairs this instruction reads. */ - Instruction getDomain() { result = evalExprInstruction(rs.getDomain()) } - - override ControlFlow::Root getRoot() { result.isRootOf(rs) } + Instruction getDomain() { result = evalExprInstruction(p.getDomain()) } - override string toString() { result = "next key-value pair in range" } - - override Location getLocation() { result = rs.getDomain().getLocation() } + override ControlFlow::Root getRoot() { result.isRootOf(p.getRangeStmt()) } } /** * An instruction computing the implicit `true` value in an expression-less `switch` statement. */ - class EvalImplicitTrueInstruction extends Instruction, MkImplicitTrue { - Stmt stmt; + class EvalImplicitTrueInstruction extends Instruction { + ExpressionSwitchStmt stmt; - EvalImplicitTrueInstruction() { this = MkImplicitTrue(stmt) } + EvalImplicitTrueInstruction() { this.isAdditional(stmt, "implicit-true") } override Type getResultType() { result instanceof BoolType } @@ -1165,91 +1142,46 @@ module IR { override predicate isConst() { any() } override predicate isPlatformIndependentConstant() { any() } - - override string toString() { result = "true" } - - override Location getLocation() { result = stmt.getLocation() } } /** * An instruction corresponding to the implicit comparison or type check performed by an * expression in a `case` clause. - * - * For example, consider this `switch` statement: - * - * ```go - * switch x { - * case 2, y+1: - * ... - * } - * ``` - * - * The expressions `2` and `y+1` are implicitly compared to `x`. These comparisons are - * represented by case instructions. */ - class CaseInstruction extends Instruction, MkCaseCheckNode { + class CaseInstruction extends Instruction { CaseClause cc; int i; - CaseInstruction() { this = MkCaseCheckNode(cc, i) } + CaseInstruction() { + this.isAdditional(cc, "case-check:" + i.toString()) and + exists(cc.getExpr(i)) + } override ControlFlow::Root getRoot() { result.isRootOf(cc) } - - override string toString() { result = "case " + cc.getExpr(i) } - - override Location getLocation() { result = cc.getLocation() } } /** - * An instruction corresponding to the implicit declaration of the variable - * `lv` in case clause `cc` and its assignment of the value `switchExpr` from - * the guard. This only occurs in case clauses in a type switch statement - * which declares a variable in its guard. - * - * For example, consider this type switch statement: - * - * ```go - * switch y := x.(type) { - * case Type1: - * f(y) - * ... - * } - * ``` - * - * The `y` inside the case clause is actually a local variable with type - * `Type1` that is implicitly declared at the top of the case clause. In - * default clauses and case clauses which list more than one type, the type - * of the implicitly declared variable is the type of `switchExpr`. + * An instruction corresponding to the implicit declaration and assignment of a variable + * in a type switch case clause. */ - class TypeSwitchImplicitVariableInstruction extends Instruction, MkTypeSwitchImplicitVariable { + class TypeSwitchImplicitVariableInstruction extends Instruction { CaseClause cc; - LocalVariable lv; - Expr switchExpr; - TypeSwitchImplicitVariableInstruction() { - this = MkTypeSwitchImplicitVariable(cc, lv, switchExpr) - } + TypeSwitchImplicitVariableInstruction() { typeSwitchCaseMatch(this, cc) } override predicate writes(ValueEntity v, Instruction rhs) { - v = lv and - rhs = evalExprInstruction(switchExpr) + v = cc.getImplicitlyDeclaredVariable() and + exists(TypeSwitchStmt ts | cc = ts.getACase() | rhs = evalExprInstruction(ts.getExpr())) } override ControlFlow::Root getRoot() { result.isRootOf(cc) } - - override string toString() { result = "implicit type switch variable declaration" } - - override Location getLocation() { result = cc.getLocation() } } - /** - * An instruction computing the implicit lower slice bound of zero in a slice expression without - * an explicit lower bound. - */ - class EvalImplicitLowerSliceBoundInstruction extends Instruction, MkImplicitLowerSliceBound { + /** An instruction computing the implicit lower bound of a slice expression. */ + class EvalImplicitLowerSliceBoundInstruction extends Instruction { SliceExpr slice; - EvalImplicitLowerSliceBoundInstruction() { this = MkImplicitLowerSliceBound(slice) } + EvalImplicitLowerSliceBoundInstruction() { this.isAdditional(slice, "implicit-low") } override Type getResultType() { result instanceof IntType } @@ -1262,56 +1194,38 @@ module IR { override predicate isConst() { any() } override predicate isPlatformIndependentConstant() { any() } - - override string toString() { result = "0" } - - override Location getLocation() { result = slice.getLocation() } } - /** - * An instruction computing the implicit upper slice bound in a slice expression without an - * explicit upper bound. - */ - class EvalImplicitUpperSliceBoundInstruction extends Instruction, MkImplicitUpperSliceBound { + /** An instruction computing the implicit upper bound of a slice expression. */ + class EvalImplicitUpperSliceBoundInstruction extends Instruction { SliceExpr slice; - EvalImplicitUpperSliceBoundInstruction() { this = MkImplicitUpperSliceBound(slice) } + EvalImplicitUpperSliceBoundInstruction() { this.isAdditional(slice, "implicit-high") } override ControlFlow::Root getRoot() { result.isRootOf(slice) } override Type getResultType() { result instanceof IntType } - - override string toString() { result = "len" } - - override Location getLocation() { result = slice.getLocation() } } - /** - * An instruction computing the implicit maximum slice bound in a slice expression without an - * explicit maximum bound. - */ - class EvalImplicitMaxSliceBoundInstruction extends Instruction, MkImplicitMaxSliceBound { + /** An instruction computing the implicit maximum bound of a slice expression. */ + class EvalImplicitMaxSliceBoundInstruction extends Instruction { SliceExpr slice; - EvalImplicitMaxSliceBoundInstruction() { this = MkImplicitMaxSliceBound(slice) } + EvalImplicitMaxSliceBoundInstruction() { this.isAdditional(slice, "implicit-max") } override ControlFlow::Root getRoot() { result.isRootOf(slice) } override Type getResultType() { result instanceof IntType } - - override string toString() { result = "cap" } - - override Location getLocation() { result = slice.getLocation() } } /** - * An instruction implicitly dereferencing the base in a field or method reference through a - * pointer, or the base in an element or slice reference through a pointer. + * An instruction computing the implicit dereference of a pointer used as the base of a field + * or method access, element access, or slice expression. */ - class EvalImplicitDerefInstruction extends Instruction, MkImplicitDeref { + class EvalImplicitDerefInstruction extends Instruction { Expr e; - EvalImplicitDerefInstruction() { this = MkImplicitDeref(e) } + EvalImplicitDerefInstruction() { this.isAdditional(e, "implicit-deref") } /** Gets the operand that is being dereferenced. */ Expr getOperand() { result = e } @@ -1321,12 +1235,55 @@ module IR { } override ControlFlow::Root getRoot() { result.isRootOf(e) } - - override string toString() { result = "implicit-deref " + e } - - override Location getLocation() { result = e.getLocation() } } + /** A representation of the target of a write instruction. */ + newtype TWriteTarget = + /** A left-hand side of an assignment. */ + MkLhs(ControlFlow::Node write, Expr lhs) { + exists(AstNode assgn, int i | write.isAdditional(assgn, "assign:" + i.toString()) | + lhs = assgn.(Assignment).getLhs(i).stripParens() + or + lhs = assgn.(ValueSpec).getNameExpr(i) + or + exists(RangeElementExpr p | p = assgn | + i = 0 and lhs = p.getKey().stripParens() + or + i = 1 and lhs = p.getValue().stripParens() + ) + ) + or + exists(IncDecStmt ids | write.isIn(ids) | lhs = ids.getOperand().stripParens()) + or + exists(FuncDef fd, int idx | + write.isBefore(fd.getParameter(idx).getDeclaration()) and + lhs = fd.getParameter(idx).getDeclaration() + ) + or + exists(FuncDef fd, int idx | + write.isAdditional(fd.getBody(), "result-init:" + idx.toString()) and + lhs = fd.getResultVar(idx).getDeclaration() + ) + } or + /** A composite literal element target. */ + MkLiteralElementTarget(ControlFlow::Node write) { + write.isAdditional(any(CompositeLit lit).getAnElement(), "lit-init") + } or + /** + * A result variable write target. Parameterized by `ControlFlow::Node` + * rather than `WriteResultInstruction` to avoid a circular dependency: + * `WriteResultInstruction extends WriteInstruction` needs + * `MkResultWriteTarget(this)` to hold, which would in turn require + * `this` to already be a `WriteResultInstruction`. + */ + MkResultWriteTarget(ControlFlow::Node w) { + exists(ReturnStmt ret, int idx | + w.isAdditional(ret, "result-write:" + idx.toString()) and + exists(ret.getEnclosingFunction().getResultVar(idx)) and + exists(ret.getAnExpr()) + ) + } + /** A representation of the target of a write instruction. */ class WriteTarget extends TWriteTarget { ControlFlow::Node w; @@ -1362,10 +1319,6 @@ module IR { * DEPRECATED: Use `getLocation()` instead. * * Holds if this element is at the specified location. - * The location spans column `startcolumn` of line `startline` to - * column `endcolumn` of line `endline` in file `filepath`. - * For more information, see - * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). */ deprecated predicate hasLocationInfo( string filepath, int startline, int startcolumn, int endline, int endcolumn @@ -1427,10 +1380,6 @@ module IR { /** Gets the constant this refers to, if any. */ Constant getConstant() { this.refersTo(result) } - - override string toString() { result = this.getName() } - - override Location getLocation() { result = loc.getLocation() } } /** A reference to a field, used as the target of a write. */ @@ -1448,7 +1397,7 @@ module IR { result = w.(InitLiteralStructFieldInstruction).getBase() } - /** Get the type of the base of this field access, that is, the type that contains the field. */ + /** Gets the type of the base of this field access, that is, the type that contains the field. */ Type getBaseType() { result = this.getBase().getResultType() } override predicate refersTo(ValueEntity e) { @@ -1461,24 +1410,10 @@ module IR { /** Gets the field this refers to, if it can be determined. */ Field getField() { this.refersTo(result) } - - override string toString() { - exists(SelectorExpr sel | this = MkLhs(_, sel) | - result = "field " + sel.getSelector().getName() - ) - or - result = "field " + w.(InitLiteralStructFieldInstruction).getFieldName() - } - - override Location getLocation() { - exists(SelectorExpr sel | this = MkLhs(_, sel) | result = sel.getLocation()) - or - result = w.(InitLiteralStructFieldInstruction).getLocation() - } } /** - * A reference to an element of an array, slice or map, used as the target of a write. + * A reference to an element of an array, slice, or map, used as the target of a write. */ class ElementTarget extends WriteTarget { ElementTarget() { @@ -1500,14 +1435,6 @@ module IR { or result = w.(InitLiteralElementInstruction).getIndex() } - - override string toString() { result = "element" } - - override Location getLocation() { - exists(IndexExpr idx | this = MkLhs(_, idx) | result = idx.getLocation()) - or - result = w.(InitLiteralElementInstruction).getLocation() - } } /** @@ -1527,66 +1454,84 @@ module IR { result = evalExprInstruction(base) ) } - - override string toString() { result = lhs.toString() } - - override Location getLocation() { result = lhs.getLocation() } } /** * Gets the (final) instruction computing the value of `e`. - * - * Note that some expressions (such as type expressions or labels) have no corresponding - * instruction, so this predicate is undefined for them. - * - * Short-circuiting expressions that are purely used for control flow (meaning that their - * value is not stored in a variable or used to compute the value of a non-shortcircuiting - * expression) do not have a final instruction either. */ Instruction evalExprInstruction(Expr e) { - result = MkExprNode(e) or + result.(EvalInstruction).getExpr() = e + or result = evalExprInstruction(e.(ParenExpr).getExpr()) } /** * Gets the instruction corresponding to the initialization of `r`. */ - InitParameterInstruction initRecvInstruction(ReceiverVariable r) { result = MkParameterInit(r) } + InitParameterInstruction initRecvInstruction(ReceiverVariable r) { + exists(FuncDef fd, int i | + fd.getParameter(i) = r and result.isBefore(fd.getParameter(i).getDeclaration()) + ) + } /** * Gets the instruction corresponding to the initialization of `p`. */ - InitParameterInstruction initParamInstruction(Parameter p) { result = MkParameterInit(p) } + InitParameterInstruction initParamInstruction(Parameter p) { + exists(FuncDef fd, int i | + fd.getParameter(i) = p and result.isBefore(fd.getParameter(i).getDeclaration()) + ) + } /** * Gets the instruction corresponding to the `i`th assignment happening at * `assgn` (0-based). */ - AssignInstruction assignInstruction(Assignment assgn, int i) { result = MkAssignNode(assgn, i) } + AssignInstruction assignInstruction(Assignment assgn, int i) { + result.isAdditional(assgn, "assign:" + i.toString()) and + exists(assgn.getLhs(i)) + } /** * Gets the instruction corresponding to the `i`th initialization happening * at `spec` (0-based). */ - AssignInstruction initInstruction(ValueSpec spec, int i) { result = MkAssignNode(spec, i) } + AssignInstruction initInstruction(ValueSpec spec, int i) { + result.isAdditional(spec, "assign:" + i.toString()) and + exists(spec.getNameExpr(i)) + } /** * Gets the instruction corresponding to the assignment of the key variable * of range statement `rs`. */ - AssignInstruction assignKeyInstruction(RangeStmt rs) { result = MkAssignNode(rs, 0) } + AssignInstruction assignKeyInstruction(RangeStmt rs) { + result.isAdditional(rs.getPattern(), "assign:0") + } /** * Gets the instruction corresponding to the assignment of the value variable * of range statement `rs`. */ - AssignInstruction assignValueInstruction(RangeStmt rs) { result = MkAssignNode(rs, 1) } + AssignInstruction assignValueInstruction(RangeStmt rs) { + result.isAdditional(rs.getPattern(), "assign:1") + } /** * Gets the instruction corresponding to the implicit initialization of `v` * to its zero value. */ - EvalImplicitInitInstruction implicitInitInstruction(ValueEntity v) { result = MkZeroInitNode(v) } + EvalImplicitInitInstruction implicitInitInstruction(ValueEntity v) { + exists(ValueSpec spec, int i | + spec.getNameExpr(i) = v.getDeclaration() and + result.isAdditional(spec, "zero-init:" + i.toString()) + ) + or + exists(FuncDef fd, int i | + fd.getResultVar(i) = v and + result.isAdditional(fd.getBody(), "result-zero-init:" + i.toString()) + ) + } /** * Gets the instruction corresponding to the extraction of the `idx`th element @@ -1600,28 +1545,30 @@ module IR { * Gets the instruction corresponding to the implicit lower bound of slice `e`, if any. */ EvalImplicitLowerSliceBoundInstruction implicitLowerSliceBoundInstruction(SliceExpr e) { - result = MkImplicitLowerSliceBound(e) + result.isAdditional(e, "implicit-low") } /** * Gets the instruction corresponding to the implicit upper bound of slice `e`, if any. */ EvalImplicitUpperSliceBoundInstruction implicitUpperSliceBoundInstruction(SliceExpr e) { - result = MkImplicitUpperSliceBound(e) + result.isAdditional(e, "implicit-high") } /** * Gets the instruction corresponding to the implicit maximum bound of slice `e`, if any. */ EvalImplicitMaxSliceBoundInstruction implicitMaxSliceBoundInstruction(SliceExpr e) { - result = MkImplicitMaxSliceBound(e) + result.isAdditional(e, "implicit-max") } /** * Gets the implicit dereference instruction for `e`, where `e` is a pointer used as the base * in a field/method access, element access, or slice expression. */ - EvalImplicitDerefInstruction implicitDerefInstruction(Expr e) { result = MkImplicitDeref(e) } + EvalImplicitDerefInstruction implicitDerefInstruction(Expr e) { + result.isAdditional(e, "implicit-deref") + } /** Gets the base of `insn`, if `insn` is an implicit field read. */ Instruction lookThroughImplicitFieldRead(Instruction insn) { diff --git a/go/ql/lib/semmle/go/dataflow/SsaImpl.qll b/go/ql/lib/semmle/go/dataflow/SsaImpl.qll index f4f62ab9f1d9..9b875d3974ba 100644 --- a/go/ql/lib/semmle/go/dataflow/SsaImpl.qll +++ b/go/ql/lib/semmle/go/dataflow/SsaImpl.qll @@ -9,6 +9,7 @@ module; import go private import codeql.ssa.Ssa as SsaImplCommon private import semmle.go.controlflow.BasicBlocks as BasicBlocks +private import semmle.go.controlflow.ControlFlowGraphShared private class BasicBlock = BasicBlocks::BasicBlock; @@ -38,7 +39,7 @@ private module Internal { /** Holds if the `i`th node of `bb` in function `f` is an entry node. */ private predicate entryNode(FuncDef f, BasicBlock bb, int i) { f = bb.getScope() and - bb.getNode(i).isEntryNode() + bb.getNode(i).(ControlFlow::Node).isEntryNode() } /** @@ -110,7 +111,7 @@ private module Internal { v.isCaptured() and exists(FuncDef f | f = bb.getScope() and - bb.getLastNode().isExitNode() and + bb.getLastNode().(ControlFlow::Node).isExitNode() and i = bb.length() - 1 and certain = false | @@ -126,7 +127,7 @@ private module Internal { } import Internal -import SsaImplCommon::Make as Impl +import SsaImplCommon::Make as Impl final class Definition = Impl::Definition; diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll index 247f535e6fad..655192e84713 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll @@ -13,7 +13,10 @@ private newtype TNode = MkInstructionNode(IR::Instruction insn) or MkSsaNode(SsaDefinition ssa) or MkGlobalFunctionNode(Function f) or - MkImplicitVarargsSlice(CallExpr c) { c.hasImplicitVarargs() } or + MkImplicitVarargsSlice(IR::EvalInstruction ins) { + // We only use CallExprs with an EvalInstruction to guarantee reachability. + ins.getExpr().(CallExpr).hasImplicitVarargs() + } or MkSliceElementNode(SliceExpr se) or MkFlowSummaryNode(FlowSummaryImpl::Private::SummaryNode sn) or MkDefaultPostUpdateNode(IR::Instruction insn) { insnHasPostUpdateNode(insn) } @@ -430,7 +433,7 @@ module Public { class ImplicitVarargsSlice extends Node, MkImplicitVarargsSlice { CallNode call; - ImplicitVarargsSlice() { this = MkImplicitVarargsSlice(call.getCall()) } + ImplicitVarargsSlice() { this = MkImplicitVarargsSlice(call.asInstruction()) } override ControlFlow::Root getRoot() { result = call.getRoot() } diff --git a/go/ql/lib/semmle/go/dataflow/internal/TaintTrackingUtil.qll b/go/ql/lib/semmle/go/dataflow/internal/TaintTrackingUtil.qll index 4b04c84fc856..50b35d14364d 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/TaintTrackingUtil.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/TaintTrackingUtil.qll @@ -340,10 +340,22 @@ private ControlFlow::Node getANonTestPassingPredecessor( ) { isPossibleInputNode(inputNode, succ.getRoot()) and result = succ.getAPredecessor() and - not exists(Expr testExpr, DataFlow::Node switchExprNode | + not exists(DataFlow::Node switchExprNode | flowsToSwitchExpression(inputNode, switchExprNode) and - ControlFlow::isSwitchCaseTestPassingEdge(result, succ, switchExprNode.asExpr(), testExpr) and - testExpr.isConst() + // The case body is reachable only by matching a constant: at least one of + // the case's test expressions is constant, and none of them is + // non-constant. (All test expressions of a case share the same matched + // edge `result -> succ`, so a case mixing constant and non-constant tests + // must not be treated as a constant-only match.) + exists(Expr testExpr | + ControlFlow::isSwitchCaseTestPassingEdge(result, succ, switchExprNode.asExpr(), testExpr) and + testExpr.isConst() + ) and + not exists(Expr nonConstTestExpr | + ControlFlow::isSwitchCaseTestPassingEdge(result, succ, switchExprNode.asExpr(), + nonConstTestExpr) and + not nonConstTestExpr.isConst() + ) ) } diff --git a/go/ql/lib/semmle/go/frameworks/Revel.qll b/go/ql/lib/semmle/go/frameworks/Revel.qll index c6250c2f8a51..085db1d2b0a8 100644 --- a/go/ql/lib/semmle/go/frameworks/Revel.qll +++ b/go/ql/lib/semmle/go/frameworks/Revel.qll @@ -154,7 +154,7 @@ module Revel { private IR::EvalInstruction skipImplicitFieldReads(IR::Instruction insn) { result = insn or - result = skipImplicitFieldReads(insn.(IR::ImplicitFieldReadInstruction).getBase()) + result = skipImplicitFieldReads(insn.(IR::ImplicitFieldReadInstruction).getBaseInstruction()) } /** A call to `Controller.Render`. */ diff --git a/go/ql/src/RedundantCode/DeadStoreOfLocal.ql b/go/ql/src/RedundantCode/DeadStoreOfLocal.ql index 2086d0de0531..7a523926f498 100644 --- a/go/ql/src/RedundantCode/DeadStoreOfLocal.ql +++ b/go/ql/src/RedundantCode/DeadStoreOfLocal.ql @@ -26,7 +26,7 @@ predicate isSimple(IR::Instruction nd) { nd = IR::implicitInitInstruction(_) or // don't flag parameters - nd instanceof IR::ReadArgumentInstruction + nd instanceof IR::InitParameterInstruction } from IR::WriteInstruction def, SsaSourceVariable target, IR::Instruction rhs, Expr lhs diff --git a/go/ql/src/RedundantCode/UnreachableStatement.ql b/go/ql/src/RedundantCode/UnreachableStatement.ql index 12b035049e9e..e2fd82201cf9 100644 --- a/go/ql/src/RedundantCode/UnreachableStatement.ql +++ b/go/ql/src/RedundantCode/UnreachableStatement.ql @@ -14,11 +14,36 @@ import go -ControlFlow::Node nonGuardPredecessor(ControlFlow::Node nd) { - exists(ControlFlow::Node pred | pred = nd.getAPredecessor() | - if pred instanceof ControlFlow::ConditionGuardNode - then result = nonGuardPredecessor(pred) - else result = pred +/** + * Holds if `s` is reachable, that is, the control-flow graph contains a node for it. + * + * The shared control-flow library does not create control-flow nodes for dead code, so an + * unreachable statement has no first control-flow node. + */ +predicate isReachable(Stmt s) { exists(s.getFirstControlFlowNode()) } + +/** Gets the statement immediately preceding `s` in a statement list, if any. */ +Stmt getPreviousStmt(Stmt s) { + exists(BlockStmt b, int i | s = b.getStmt(i) and result = b.getStmt(i - 1)) + or + exists(CaseClause c, int i | s = c.getStmt(i) and result = c.getStmt(i - 1)) + or + exists(CommClause c, int i | s = c.getStmt(i) and result = c.getStmt(i - 1)) +} + +/** + * Holds if `s` is unreachable but the code that would precede it in the control-flow graph is + * reachable, so that `s` is the first unreachable statement in a run of dead code. + */ +predicate firstUnreachableStmt(Stmt s) { + not isReachable(s) and + not s instanceof EmptyStmt and + ( + // a statement whose preceding statement in the same list is reachable + isReachable(getPreviousStmt(s)) + or + // the post statement of a `for` loop whose body is entered + exists(ForStmt f | s = f.getPost() and isReachable(f.getBody().getAStmt())) ) } @@ -63,18 +88,13 @@ predicate allowlist(Stmt s) { forall(Expr retval | retval = ret.getAnExpr() | isAllowedReturnValue(retval)) ) or - // statements in an `if false { ... }` and similar - exists(IfStmt is, ControlFlow::ConditionGuardNode iffalse, Expr cond, boolean b | - iffalse.getCondition() = is.getCond() and - iffalse = s.getFirstControlFlowNode().getAPredecessor() and - cond.getBoolValue() = b and - iffalse.ensures(DataFlow::exprNode(cond), b.booleanNot()) - ) + // statements deliberately made unreachable by a constant condition, such as the code + // following `if true { return }` + exists(getPreviousStmt(s).(IfStmt).getCond().getBoolValue()) } -from Stmt s, ControlFlow::Node fst +from Stmt s where - fst = s.getFirstControlFlowNode() and - not exists(nonGuardPredecessor(fst)) and + firstUnreachableStmt(s) and not allowlist(s) select s, "This statement is unreachable." diff --git a/go/ql/test/extractor-tests/go1.17/CFG.expected b/go/ql/test/extractor-tests/go1.17/CFG.expected index 8cce0bb26576..40eec15bfe0d 100644 --- a/go/ql/test/extractor-tests/go1.17/CFG.expected +++ b/go/ql/test/extractor-tests/go1.17/CFG.expected @@ -1,64 +1,154 @@ nodes edges -| conversions.go:0:0:0:0 | entry | conversions.go:3:1:3:15 | skip | -| conversions.go:3:1:3:15 | skip | conversions.go:5:6:5:8 | skip | -| conversions.go:5:1:5:29 | entry | conversions.go:5:10:5:10 | _ | -| conversions.go:5:1:5:29 | function declaration | conversions.go:7:6:7:9 | skip | -| conversions.go:5:6:5:8 | skip | conversions.go:5:1:5:29 | function declaration | -| conversions.go:5:10:5:10 | _ | conversions.go:5:10:5:10 | _ | -| conversions.go:5:10:5:10 | _ | conversions.go:5:28:5:29 | skip | -| conversions.go:5:28:5:29 | skip | conversions.go:5:1:5:29 | exit | -| conversions.go:7:1:26:1 | entry | conversions.go:8:6:8:6 | skip | -| conversions.go:7:1:26:1 | function declaration | conversions.go:0:0:0:0 | exit | -| conversions.go:7:6:7:9 | skip | conversions.go:7:1:26:1 | function declaration | -| conversions.go:8:6:8:6 | skip | conversions.go:8:6:8:21 | zero-init:0 value declaration specifier | -| conversions.go:8:6:8:21 | assign:0 value declaration specifier | conversions.go:10:2:10:2 | skip | +| conversions.go:0:0:0:0 | After conversions.go | conversions.go:0:0:0:0 | Normal Exit | +| conversions.go:0:0:0:0 | Entry | conversions.go:0:0:0:0 | conversions.go | +| conversions.go:0:0:0:0 | Normal Exit | conversions.go:0:0:0:0 | Exit | +| conversions.go:0:0:0:0 | conversions.go | conversions.go:3:1:3:15 | import declaration | +| conversions.go:3:1:3:15 | After import declaration | conversions.go:5:1:5:29 | Before function declaration | +| conversions.go:3:1:3:15 | import declaration | conversions.go:3:8:3:15 | import specifier | +| conversions.go:3:8:3:15 | import specifier | conversions.go:3:1:3:15 | After import declaration | +| conversions.go:5:1:5:29 | After function declaration | conversions.go:7:1:26:1 | Before function declaration | +| conversions.go:5:1:5:29 | Before function declaration | conversions.go:5:1:5:29 | function declaration | +| conversions.go:5:1:5:29 | Entry | conversions.go:5:10:5:10 | _ | +| conversions.go:5:1:5:29 | Normal Exit | conversions.go:5:1:5:29 | Exit | +| conversions.go:5:1:5:29 | function declaration | conversions.go:5:1:5:29 | After function declaration | +| conversions.go:5:10:5:10 | _ | conversions.go:5:28:5:29 | block statement | +| conversions.go:5:28:5:29 | block statement | conversions.go:5:1:5:29 | Normal Exit | +| conversions.go:7:1:26:1 | After function declaration | conversions.go:0:0:0:0 | After conversions.go | +| conversions.go:7:1:26:1 | Before function declaration | conversions.go:7:1:26:1 | function declaration | +| conversions.go:7:1:26:1 | Entry | conversions.go:7:13:26:1 | block statement | +| conversions.go:7:1:26:1 | Exceptional Exit | conversions.go:7:1:26:1 | Exit | +| conversions.go:7:1:26:1 | Normal Exit | conversions.go:7:1:26:1 | Exit | +| conversions.go:7:1:26:1 | function declaration | conversions.go:7:1:26:1 | After function declaration | +| conversions.go:7:13:26:1 | After block statement | conversions.go:7:1:26:1 | Normal Exit | +| conversions.go:7:13:26:1 | block statement | conversions.go:8:2:8:21 | declaration statement | +| conversions.go:8:2:8:21 | After declaration statement | conversions.go:10:2:10:23 | ... := ... | +| conversions.go:8:2:8:21 | After variable declaration | conversions.go:8:2:8:21 | After declaration statement | +| conversions.go:8:2:8:21 | declaration statement | conversions.go:8:2:8:21 | variable declaration | +| conversions.go:8:2:8:21 | variable declaration | conversions.go:8:6:8:21 | value declaration specifier | +| conversions.go:8:6:8:21 | After value declaration specifier | conversions.go:8:2:8:21 | After variable declaration | +| conversions.go:8:6:8:21 | assign:0 value declaration specifier | conversions.go:8:6:8:21 | After value declaration specifier | +| conversions.go:8:6:8:21 | value declaration specifier | conversions.go:8:6:8:21 | zero-init:0 value declaration specifier | | conversions.go:8:6:8:21 | zero-init:0 value declaration specifier | conversions.go:8:6:8:21 | assign:0 value declaration specifier | -| conversions.go:10:2:10:2 | skip | conversions.go:10:7:10:16 | selection of Add | -| conversions.go:10:2:10:23 | assign:0 ... := ... | conversions.go:11:2:11:4 | use | -| conversions.go:10:7:10:16 | selection of Add | conversions.go:10:18:10:18 | a | -| conversions.go:10:7:10:23 | call to Add | conversions.go:10:2:10:23 | assign:0 ... := ... | -| conversions.go:10:18:10:18 | a | conversions.go:10:21:10:22 | 10 | -| conversions.go:10:21:10:22 | 10 | conversions.go:10:7:10:23 | call to Add | -| conversions.go:11:2:11:4 | use | conversions.go:11:6:11:6 | b | -| conversions.go:11:2:11:7 | call to use | conversions.go:7:1:26:1 | exit | -| conversions.go:11:2:11:7 | call to use | conversions.go:13:6:13:8 | skip | -| conversions.go:11:6:11:6 | b | conversions.go:11:2:11:7 | call to use | -| conversions.go:13:6:13:8 | skip | conversions.go:13:6:13:13 | zero-init:0 value declaration specifier | -| conversions.go:13:6:13:13 | assign:0 value declaration specifier | conversions.go:14:2:14:6 | skip | +| conversions.go:10:2:10:23 | ... := ... | conversions.go:10:7:10:23 | Before call to Add | +| conversions.go:10:2:10:23 | After ... := ... | conversions.go:11:2:11:7 | expression statement | +| conversions.go:10:2:10:23 | assign:0 ... := ... | conversions.go:10:2:10:23 | After ... := ... | +| conversions.go:10:7:10:16 | After selection of Add | conversions.go:10:18:10:18 | Before a | +| conversions.go:10:7:10:16 | Before selection of Add | conversions.go:10:7:10:16 | selection of Add | +| conversions.go:10:7:10:16 | selection of Add | conversions.go:10:7:10:16 | After selection of Add | +| conversions.go:10:7:10:23 | After call to Add | conversions.go:10:2:10:23 | assign:0 ... := ... | +| conversions.go:10:7:10:23 | Before call to Add | conversions.go:10:7:10:16 | Before selection of Add | +| conversions.go:10:7:10:23 | call to Add | conversions.go:10:7:10:23 | After call to Add | +| conversions.go:10:18:10:18 | After a | conversions.go:10:21:10:22 | Before 10 | +| conversions.go:10:18:10:18 | Before a | conversions.go:10:18:10:18 | a | +| conversions.go:10:18:10:18 | a | conversions.go:10:18:10:18 | After a | +| conversions.go:10:21:10:22 | 10 | conversions.go:10:21:10:22 | After 10 | +| conversions.go:10:21:10:22 | After 10 | conversions.go:10:7:10:23 | call to Add | +| conversions.go:10:21:10:22 | Before 10 | conversions.go:10:21:10:22 | 10 | +| conversions.go:11:2:11:4 | After use | conversions.go:11:6:11:6 | Before b | +| conversions.go:11:2:11:4 | Before use | conversions.go:11:2:11:4 | use | +| conversions.go:11:2:11:4 | use | conversions.go:11:2:11:4 | After use | +| conversions.go:11:2:11:7 | After call to use | conversions.go:11:2:11:7 | After expression statement | +| conversions.go:11:2:11:7 | After expression statement | conversions.go:13:2:13:13 | declaration statement | +| conversions.go:11:2:11:7 | Before call to use | conversions.go:11:2:11:4 | Before use | +| conversions.go:11:2:11:7 | call to use | conversions.go:7:1:26:1 | Exceptional Exit | +| conversions.go:11:2:11:7 | call to use | conversions.go:11:2:11:7 | After call to use | +| conversions.go:11:2:11:7 | expression statement | conversions.go:11:2:11:7 | Before call to use | +| conversions.go:11:6:11:6 | After b | conversions.go:11:2:11:7 | call to use | +| conversions.go:11:6:11:6 | Before b | conversions.go:11:6:11:6 | b | +| conversions.go:11:6:11:6 | b | conversions.go:11:6:11:6 | After b | +| conversions.go:13:2:13:13 | After declaration statement | conversions.go:14:2:14:31 | ... := ... | +| conversions.go:13:2:13:13 | After variable declaration | conversions.go:13:2:13:13 | After declaration statement | +| conversions.go:13:2:13:13 | declaration statement | conversions.go:13:2:13:13 | variable declaration | +| conversions.go:13:2:13:13 | variable declaration | conversions.go:13:6:13:13 | value declaration specifier | +| conversions.go:13:6:13:13 | After value declaration specifier | conversions.go:13:2:13:13 | After variable declaration | +| conversions.go:13:6:13:13 | assign:0 value declaration specifier | conversions.go:13:6:13:13 | After value declaration specifier | +| conversions.go:13:6:13:13 | value declaration specifier | conversions.go:13:6:13:13 | zero-init:0 value declaration specifier | | conversions.go:13:6:13:13 | zero-init:0 value declaration specifier | conversions.go:13:6:13:13 | assign:0 value declaration specifier | -| conversions.go:14:2:14:6 | skip | conversions.go:14:11:14:22 | selection of Slice | -| conversions.go:14:2:14:31 | assign:0 ... := ... | conversions.go:17:2:17:4 | skip | -| conversions.go:14:11:14:22 | selection of Slice | conversions.go:14:24:14:26 | arr | -| conversions.go:14:11:14:31 | call to Slice | conversions.go:14:2:14:31 | assign:0 ... := ... | -| conversions.go:14:24:14:26 | arr | conversions.go:14:29:14:30 | 20 | -| conversions.go:14:29:14:30 | 20 | conversions.go:14:11:14:31 | call to Slice | -| conversions.go:17:2:17:4 | skip | conversions.go:17:20:17:24 | slice | -| conversions.go:17:2:17:25 | assign:0 ... := ... | conversions.go:18:2:18:4 | use | -| conversions.go:17:9:17:25 | type conversion | conversions.go:7:1:26:1 | exit | -| conversions.go:17:9:17:25 | type conversion | conversions.go:17:2:17:25 | assign:0 ... := ... | -| conversions.go:17:20:17:24 | slice | conversions.go:17:9:17:25 | type conversion | -| conversions.go:18:2:18:4 | use | conversions.go:18:6:18:8 | ptr | -| conversions.go:18:2:18:9 | call to use | conversions.go:7:1:26:1 | exit | -| conversions.go:18:2:18:9 | call to use | conversions.go:21:2:21:4 | skip | -| conversions.go:18:6:18:8 | ptr | conversions.go:18:2:18:9 | call to use | -| conversions.go:21:2:21:4 | skip | conversions.go:21:9:21:18 | "a string" | -| conversions.go:21:2:21:18 | assign:0 ... := ... | conversions.go:22:2:22:6 | skip | -| conversions.go:21:9:21:18 | "a string" | conversions.go:21:2:21:18 | assign:0 ... := ... | -| conversions.go:22:2:22:6 | skip | conversions.go:22:18:22:20 | str | -| conversions.go:22:2:22:21 | assign:0 ... := ... | conversions.go:23:2:23:4 | use | -| conversions.go:22:11:22:21 | type conversion | conversions.go:22:2:22:21 | assign:0 ... := ... | -| conversions.go:22:18:22:20 | str | conversions.go:22:11:22:21 | type conversion | -| conversions.go:23:2:23:4 | use | conversions.go:23:6:23:10 | bytes | -| conversions.go:23:2:23:11 | call to use | conversions.go:7:1:26:1 | exit | -| conversions.go:23:2:23:11 | call to use | conversions.go:24:2:24:6 | skip | -| conversions.go:23:6:23:10 | bytes | conversions.go:23:2:23:11 | call to use | -| conversions.go:24:2:24:6 | skip | conversions.go:24:18:24:20 | str | -| conversions.go:24:2:24:21 | assign:0 ... := ... | conversions.go:25:2:25:4 | use | -| conversions.go:24:11:24:21 | type conversion | conversions.go:24:2:24:21 | assign:0 ... := ... | -| conversions.go:24:18:24:20 | str | conversions.go:24:11:24:21 | type conversion | -| conversions.go:25:2:25:4 | use | conversions.go:25:6:25:10 | runes | -| conversions.go:25:2:25:11 | call to use | conversions.go:7:1:26:1 | exit | -| conversions.go:25:6:25:10 | runes | conversions.go:25:2:25:11 | call to use | +| conversions.go:14:2:14:31 | ... := ... | conversions.go:14:11:14:31 | Before call to Slice | +| conversions.go:14:2:14:31 | After ... := ... | conversions.go:17:2:17:25 | ... := ... | +| conversions.go:14:2:14:31 | assign:0 ... := ... | conversions.go:14:2:14:31 | After ... := ... | +| conversions.go:14:11:14:22 | After selection of Slice | conversions.go:14:24:14:26 | Before arr | +| conversions.go:14:11:14:22 | Before selection of Slice | conversions.go:14:11:14:22 | selection of Slice | +| conversions.go:14:11:14:22 | selection of Slice | conversions.go:14:11:14:22 | After selection of Slice | +| conversions.go:14:11:14:31 | After call to Slice | conversions.go:14:2:14:31 | assign:0 ... := ... | +| conversions.go:14:11:14:31 | Before call to Slice | conversions.go:14:11:14:22 | Before selection of Slice | +| conversions.go:14:11:14:31 | call to Slice | conversions.go:14:11:14:31 | After call to Slice | +| conversions.go:14:24:14:26 | After arr | conversions.go:14:29:14:30 | Before 20 | +| conversions.go:14:24:14:26 | Before arr | conversions.go:14:24:14:26 | arr | +| conversions.go:14:24:14:26 | arr | conversions.go:14:24:14:26 | After arr | +| conversions.go:14:29:14:30 | 20 | conversions.go:14:29:14:30 | After 20 | +| conversions.go:14:29:14:30 | After 20 | conversions.go:14:11:14:31 | call to Slice | +| conversions.go:14:29:14:30 | Before 20 | conversions.go:14:29:14:30 | 20 | +| conversions.go:17:2:17:25 | ... := ... | conversions.go:17:9:17:25 | Before type conversion | +| conversions.go:17:2:17:25 | After ... := ... | conversions.go:18:2:18:9 | expression statement | +| conversions.go:17:2:17:25 | assign:0 ... := ... | conversions.go:17:2:17:25 | After ... := ... | +| conversions.go:17:9:17:25 | After type conversion | conversions.go:17:2:17:25 | assign:0 ... := ... | +| conversions.go:17:9:17:25 | Before type conversion | conversions.go:17:20:17:24 | Before slice | +| conversions.go:17:9:17:25 | type conversion | conversions.go:7:1:26:1 | Exceptional Exit | +| conversions.go:17:9:17:25 | type conversion | conversions.go:17:9:17:25 | After type conversion | +| conversions.go:17:20:17:24 | After slice | conversions.go:17:9:17:25 | type conversion | +| conversions.go:17:20:17:24 | Before slice | conversions.go:17:20:17:24 | slice | +| conversions.go:17:20:17:24 | slice | conversions.go:17:20:17:24 | After slice | +| conversions.go:18:2:18:4 | After use | conversions.go:18:6:18:8 | Before ptr | +| conversions.go:18:2:18:4 | Before use | conversions.go:18:2:18:4 | use | +| conversions.go:18:2:18:4 | use | conversions.go:18:2:18:4 | After use | +| conversions.go:18:2:18:9 | After call to use | conversions.go:18:2:18:9 | After expression statement | +| conversions.go:18:2:18:9 | After expression statement | conversions.go:21:2:21:18 | ... := ... | +| conversions.go:18:2:18:9 | Before call to use | conversions.go:18:2:18:4 | Before use | +| conversions.go:18:2:18:9 | call to use | conversions.go:7:1:26:1 | Exceptional Exit | +| conversions.go:18:2:18:9 | call to use | conversions.go:18:2:18:9 | After call to use | +| conversions.go:18:2:18:9 | expression statement | conversions.go:18:2:18:9 | Before call to use | +| conversions.go:18:6:18:8 | After ptr | conversions.go:18:2:18:9 | call to use | +| conversions.go:18:6:18:8 | Before ptr | conversions.go:18:6:18:8 | ptr | +| conversions.go:18:6:18:8 | ptr | conversions.go:18:6:18:8 | After ptr | +| conversions.go:21:2:21:18 | ... := ... | conversions.go:21:9:21:18 | Before "a string" | +| conversions.go:21:2:21:18 | After ... := ... | conversions.go:22:2:22:21 | ... := ... | +| conversions.go:21:2:21:18 | assign:0 ... := ... | conversions.go:21:2:21:18 | After ... := ... | +| conversions.go:21:9:21:18 | "a string" | conversions.go:21:9:21:18 | After "a string" | +| conversions.go:21:9:21:18 | After "a string" | conversions.go:21:2:21:18 | assign:0 ... := ... | +| conversions.go:21:9:21:18 | Before "a string" | conversions.go:21:9:21:18 | "a string" | +| conversions.go:22:2:22:21 | ... := ... | conversions.go:22:11:22:21 | Before type conversion | +| conversions.go:22:2:22:21 | After ... := ... | conversions.go:23:2:23:11 | expression statement | +| conversions.go:22:2:22:21 | assign:0 ... := ... | conversions.go:22:2:22:21 | After ... := ... | +| conversions.go:22:11:22:21 | After type conversion | conversions.go:22:2:22:21 | assign:0 ... := ... | +| conversions.go:22:11:22:21 | Before type conversion | conversions.go:22:18:22:20 | Before str | +| conversions.go:22:11:22:21 | type conversion | conversions.go:22:11:22:21 | After type conversion | +| conversions.go:22:18:22:20 | After str | conversions.go:22:11:22:21 | type conversion | +| conversions.go:22:18:22:20 | Before str | conversions.go:22:18:22:20 | str | +| conversions.go:22:18:22:20 | str | conversions.go:22:18:22:20 | After str | +| conversions.go:23:2:23:4 | After use | conversions.go:23:6:23:10 | Before bytes | +| conversions.go:23:2:23:4 | Before use | conversions.go:23:2:23:4 | use | +| conversions.go:23:2:23:4 | use | conversions.go:23:2:23:4 | After use | +| conversions.go:23:2:23:11 | After call to use | conversions.go:23:2:23:11 | After expression statement | +| conversions.go:23:2:23:11 | After expression statement | conversions.go:24:2:24:21 | ... := ... | +| conversions.go:23:2:23:11 | Before call to use | conversions.go:23:2:23:4 | Before use | +| conversions.go:23:2:23:11 | call to use | conversions.go:7:1:26:1 | Exceptional Exit | +| conversions.go:23:2:23:11 | call to use | conversions.go:23:2:23:11 | After call to use | +| conversions.go:23:2:23:11 | expression statement | conversions.go:23:2:23:11 | Before call to use | +| conversions.go:23:6:23:10 | After bytes | conversions.go:23:2:23:11 | call to use | +| conversions.go:23:6:23:10 | Before bytes | conversions.go:23:6:23:10 | bytes | +| conversions.go:23:6:23:10 | bytes | conversions.go:23:6:23:10 | After bytes | +| conversions.go:24:2:24:21 | ... := ... | conversions.go:24:11:24:21 | Before type conversion | +| conversions.go:24:2:24:21 | After ... := ... | conversions.go:25:2:25:11 | expression statement | +| conversions.go:24:2:24:21 | assign:0 ... := ... | conversions.go:24:2:24:21 | After ... := ... | +| conversions.go:24:11:24:21 | After type conversion | conversions.go:24:2:24:21 | assign:0 ... := ... | +| conversions.go:24:11:24:21 | Before type conversion | conversions.go:24:18:24:20 | Before str | +| conversions.go:24:11:24:21 | type conversion | conversions.go:24:11:24:21 | After type conversion | +| conversions.go:24:18:24:20 | After str | conversions.go:24:11:24:21 | type conversion | +| conversions.go:24:18:24:20 | Before str | conversions.go:24:18:24:20 | str | +| conversions.go:24:18:24:20 | str | conversions.go:24:18:24:20 | After str | +| conversions.go:25:2:25:4 | After use | conversions.go:25:6:25:10 | Before runes | +| conversions.go:25:2:25:4 | Before use | conversions.go:25:2:25:4 | use | +| conversions.go:25:2:25:4 | use | conversions.go:25:2:25:4 | After use | +| conversions.go:25:2:25:11 | After call to use | conversions.go:25:2:25:11 | After expression statement | +| conversions.go:25:2:25:11 | After expression statement | conversions.go:7:13:26:1 | After block statement | +| conversions.go:25:2:25:11 | Before call to use | conversions.go:25:2:25:4 | Before use | +| conversions.go:25:2:25:11 | call to use | conversions.go:7:1:26:1 | Exceptional Exit | +| conversions.go:25:2:25:11 | call to use | conversions.go:25:2:25:11 | After call to use | +| conversions.go:25:2:25:11 | expression statement | conversions.go:25:2:25:11 | Before call to use | +| conversions.go:25:6:25:10 | After runes | conversions.go:25:2:25:11 | call to use | +| conversions.go:25:6:25:10 | Before runes | conversions.go:25:6:25:10 | runes | +| conversions.go:25:6:25:10 | runes | conversions.go:25:6:25:10 | After runes | #select | | diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected index be4ee63f46eb..4f790e0f29b6 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected @@ -1,1871 +1,4299 @@ -| DuplicateSwitchCase.go:0:0:0:0 | entry | DuplicateSwitchCase.go:3:6:3:15 | skip | -| DuplicateSwitchCase.go:3:1:12:1 | entry | DuplicateSwitchCase.go:3:17:3:19 | msg | -| DuplicateSwitchCase.go:3:1:12:1 | function declaration | DuplicateSwitchCase.go:14:6:14:10 | skip | -| DuplicateSwitchCase.go:3:6:3:15 | skip | DuplicateSwitchCase.go:3:1:12:1 | function declaration | -| DuplicateSwitchCase.go:3:17:3:19 | msg | DuplicateSwitchCase.go:3:17:3:19 | msg | -| DuplicateSwitchCase.go:3:17:3:19 | msg | DuplicateSwitchCase.go:4:2:11:2 | true | -| DuplicateSwitchCase.go:4:2:11:2 | true | DuplicateSwitchCase.go:5:7:5:9 | msg | -| DuplicateSwitchCase.go:5:2:6:9 | case ...==... | DuplicateSwitchCase.go:5:7:5:20 | ...==... is false | -| DuplicateSwitchCase.go:5:2:6:9 | case ...==... | DuplicateSwitchCase.go:5:7:5:20 | ...==... is true | -| DuplicateSwitchCase.go:5:7:5:9 | msg | DuplicateSwitchCase.go:5:14:5:20 | "start" | -| DuplicateSwitchCase.go:5:7:5:20 | ...==... | DuplicateSwitchCase.go:5:2:6:9 | case ...==... | -| DuplicateSwitchCase.go:5:7:5:20 | ...==... is false | DuplicateSwitchCase.go:7:7:7:9 | msg | -| DuplicateSwitchCase.go:5:7:5:20 | ...==... is true | DuplicateSwitchCase.go:6:3:6:7 | start | -| DuplicateSwitchCase.go:5:14:5:20 | "start" | DuplicateSwitchCase.go:5:7:5:20 | ...==... | -| DuplicateSwitchCase.go:6:3:6:7 | start | DuplicateSwitchCase.go:6:3:6:9 | call to start | -| DuplicateSwitchCase.go:6:3:6:9 | call to start | DuplicateSwitchCase.go:3:1:12:1 | exit | -| DuplicateSwitchCase.go:7:2:8:8 | case ...==... | DuplicateSwitchCase.go:7:7:7:20 | ...==... is false | -| DuplicateSwitchCase.go:7:2:8:8 | case ...==... | DuplicateSwitchCase.go:7:7:7:20 | ...==... is true | -| DuplicateSwitchCase.go:7:7:7:9 | msg | DuplicateSwitchCase.go:7:14:7:20 | "start" | -| DuplicateSwitchCase.go:7:7:7:20 | ...==... | DuplicateSwitchCase.go:7:2:8:8 | case ...==... | -| DuplicateSwitchCase.go:7:7:7:20 | ...==... is false | DuplicateSwitchCase.go:10:3:10:7 | panic | -| DuplicateSwitchCase.go:7:7:7:20 | ...==... is true | DuplicateSwitchCase.go:8:3:8:6 | stop | -| DuplicateSwitchCase.go:7:14:7:20 | "start" | DuplicateSwitchCase.go:7:7:7:20 | ...==... | -| DuplicateSwitchCase.go:8:3:8:6 | stop | DuplicateSwitchCase.go:8:3:8:8 | call to stop | -| DuplicateSwitchCase.go:8:3:8:8 | call to stop | DuplicateSwitchCase.go:3:1:12:1 | exit | -| DuplicateSwitchCase.go:10:3:10:7 | panic | DuplicateSwitchCase.go:10:9:10:33 | "Message not understood." | -| DuplicateSwitchCase.go:10:3:10:34 | call to panic | DuplicateSwitchCase.go:3:1:12:1 | exit | -| DuplicateSwitchCase.go:10:9:10:33 | "Message not understood." | DuplicateSwitchCase.go:10:3:10:34 | call to panic | -| DuplicateSwitchCase.go:14:1:14:15 | entry | DuplicateSwitchCase.go:14:14:14:15 | skip | -| DuplicateSwitchCase.go:14:1:14:15 | function declaration | DuplicateSwitchCase.go:16:6:16:9 | skip | -| DuplicateSwitchCase.go:14:6:14:10 | skip | DuplicateSwitchCase.go:14:1:14:15 | function declaration | -| DuplicateSwitchCase.go:14:14:14:15 | skip | DuplicateSwitchCase.go:14:1:14:15 | exit | -| DuplicateSwitchCase.go:16:1:16:14 | entry | DuplicateSwitchCase.go:16:13:16:14 | skip | -| DuplicateSwitchCase.go:16:1:16:14 | function declaration | DuplicateSwitchCase.go:0:0:0:0 | exit | -| DuplicateSwitchCase.go:16:6:16:9 | skip | DuplicateSwitchCase.go:16:1:16:14 | function declaration | -| DuplicateSwitchCase.go:16:13:16:14 | skip | DuplicateSwitchCase.go:16:1:16:14 | exit | -| epilogues.go:0:0:0:0 | entry | epilogues.go:3:1:3:12 | skip | -| epilogues.go:3:1:3:12 | skip | epilogues.go:8:1:10:1 | skip | -| epilogues.go:8:1:10:1 | skip | epilogues.go:12:21:12:23 | skip | -| epilogues.go:12:1:14:1 | entry | epilogues.go:12:7:12:7 | l | -| epilogues.go:12:1:14:1 | function declaration | epilogues.go:16:20:16:27 | skip | -| epilogues.go:12:7:12:7 | l | epilogues.go:12:7:12:7 | l | +| DuplicateSwitchCase.go:0:0:0:0 | After DuplicateSwitchCase.go | DuplicateSwitchCase.go:0:0:0:0 | Normal Exit | +| DuplicateSwitchCase.go:0:0:0:0 | DuplicateSwitchCase.go | DuplicateSwitchCase.go:3:1:12:1 | Before function declaration | +| DuplicateSwitchCase.go:0:0:0:0 | Entry | DuplicateSwitchCase.go:0:0:0:0 | DuplicateSwitchCase.go | +| DuplicateSwitchCase.go:0:0:0:0 | Normal Exit | DuplicateSwitchCase.go:0:0:0:0 | Exit | +| DuplicateSwitchCase.go:3:1:12:1 | After function declaration | DuplicateSwitchCase.go:14:1:14:15 | Before function declaration | +| DuplicateSwitchCase.go:3:1:12:1 | Before function declaration | DuplicateSwitchCase.go:3:1:12:1 | function declaration | +| DuplicateSwitchCase.go:3:1:12:1 | Entry | DuplicateSwitchCase.go:3:17:3:19 | msg | +| DuplicateSwitchCase.go:3:1:12:1 | Exceptional Exit | DuplicateSwitchCase.go:3:1:12:1 | Exit | +| DuplicateSwitchCase.go:3:1:12:1 | Normal Exit | DuplicateSwitchCase.go:3:1:12:1 | Exit | +| DuplicateSwitchCase.go:3:1:12:1 | function declaration | DuplicateSwitchCase.go:3:1:12:1 | After function declaration | +| DuplicateSwitchCase.go:3:17:3:19 | msg | DuplicateSwitchCase.go:3:29:12:1 | block statement | +| DuplicateSwitchCase.go:3:29:12:1 | After block statement | DuplicateSwitchCase.go:3:1:12:1 | Normal Exit | +| DuplicateSwitchCase.go:3:29:12:1 | block statement | DuplicateSwitchCase.go:4:2:11:2 | expression-switch statement | +| DuplicateSwitchCase.go:4:2:11:2 | After expression-switch statement | DuplicateSwitchCase.go:3:29:12:1 | After block statement | +| DuplicateSwitchCase.go:4:2:11:2 | expression-switch statement | DuplicateSwitchCase.go:5:2:6:9 | case clause | +| DuplicateSwitchCase.go:5:2:6:9 | After case clause [match] | DuplicateSwitchCase.go:6:3:6:9 | expression statement | +| DuplicateSwitchCase.go:5:2:6:9 | After case clause [no-match] | DuplicateSwitchCase.go:7:2:8:8 | case clause | +| DuplicateSwitchCase.go:5:2:6:9 | case clause | DuplicateSwitchCase.go:5:7:5:20 | Before ...==... | +| DuplicateSwitchCase.go:5:7:5:9 | After msg | DuplicateSwitchCase.go:5:14:5:20 | Before "start" | +| DuplicateSwitchCase.go:5:7:5:9 | Before msg | DuplicateSwitchCase.go:5:7:5:9 | msg | +| DuplicateSwitchCase.go:5:7:5:9 | msg | DuplicateSwitchCase.go:5:7:5:9 | After msg | +| DuplicateSwitchCase.go:5:7:5:20 | ...==... | DuplicateSwitchCase.go:5:7:5:20 | After ...==... [match] | +| DuplicateSwitchCase.go:5:7:5:20 | ...==... | DuplicateSwitchCase.go:5:7:5:20 | After ...==... [no-match] | +| DuplicateSwitchCase.go:5:7:5:20 | After ...==... [match] | DuplicateSwitchCase.go:5:2:6:9 | After case clause [match] | +| DuplicateSwitchCase.go:5:7:5:20 | After ...==... [no-match] | DuplicateSwitchCase.go:5:2:6:9 | After case clause [no-match] | +| DuplicateSwitchCase.go:5:7:5:20 | Before ...==... | DuplicateSwitchCase.go:5:7:5:9 | Before msg | +| DuplicateSwitchCase.go:5:14:5:20 | "start" | DuplicateSwitchCase.go:5:14:5:20 | After "start" | +| DuplicateSwitchCase.go:5:14:5:20 | After "start" | DuplicateSwitchCase.go:5:7:5:20 | ...==... | +| DuplicateSwitchCase.go:5:14:5:20 | Before "start" | DuplicateSwitchCase.go:5:14:5:20 | "start" | +| DuplicateSwitchCase.go:6:3:6:7 | After start | DuplicateSwitchCase.go:6:3:6:9 | call to start | +| DuplicateSwitchCase.go:6:3:6:7 | Before start | DuplicateSwitchCase.go:6:3:6:7 | start | +| DuplicateSwitchCase.go:6:3:6:7 | start | DuplicateSwitchCase.go:6:3:6:7 | After start | +| DuplicateSwitchCase.go:6:3:6:9 | After call to start | DuplicateSwitchCase.go:6:3:6:9 | After expression statement | +| DuplicateSwitchCase.go:6:3:6:9 | After expression statement | DuplicateSwitchCase.go:4:2:11:2 | After expression-switch statement | +| DuplicateSwitchCase.go:6:3:6:9 | Before call to start | DuplicateSwitchCase.go:6:3:6:7 | Before start | +| DuplicateSwitchCase.go:6:3:6:9 | call to start | DuplicateSwitchCase.go:3:1:12:1 | Exceptional Exit | +| DuplicateSwitchCase.go:6:3:6:9 | call to start | DuplicateSwitchCase.go:6:3:6:9 | After call to start | +| DuplicateSwitchCase.go:6:3:6:9 | expression statement | DuplicateSwitchCase.go:6:3:6:9 | Before call to start | +| DuplicateSwitchCase.go:7:2:8:8 | After case clause [match] | DuplicateSwitchCase.go:8:3:8:8 | expression statement | +| DuplicateSwitchCase.go:7:2:8:8 | After case clause [no-match] | DuplicateSwitchCase.go:9:2:10:34 | case clause | +| DuplicateSwitchCase.go:7:2:8:8 | case clause | DuplicateSwitchCase.go:7:7:7:20 | Before ...==... | +| DuplicateSwitchCase.go:7:7:7:9 | After msg | DuplicateSwitchCase.go:7:14:7:20 | Before "start" | +| DuplicateSwitchCase.go:7:7:7:9 | Before msg | DuplicateSwitchCase.go:7:7:7:9 | msg | +| DuplicateSwitchCase.go:7:7:7:9 | msg | DuplicateSwitchCase.go:7:7:7:9 | After msg | +| DuplicateSwitchCase.go:7:7:7:20 | ...==... | DuplicateSwitchCase.go:7:7:7:20 | After ...==... [match] | +| DuplicateSwitchCase.go:7:7:7:20 | ...==... | DuplicateSwitchCase.go:7:7:7:20 | After ...==... [no-match] | +| DuplicateSwitchCase.go:7:7:7:20 | After ...==... [match] | DuplicateSwitchCase.go:7:2:8:8 | After case clause [match] | +| DuplicateSwitchCase.go:7:7:7:20 | After ...==... [no-match] | DuplicateSwitchCase.go:7:2:8:8 | After case clause [no-match] | +| DuplicateSwitchCase.go:7:7:7:20 | Before ...==... | DuplicateSwitchCase.go:7:7:7:9 | Before msg | +| DuplicateSwitchCase.go:7:14:7:20 | "start" | DuplicateSwitchCase.go:7:14:7:20 | After "start" | +| DuplicateSwitchCase.go:7:14:7:20 | After "start" | DuplicateSwitchCase.go:7:7:7:20 | ...==... | +| DuplicateSwitchCase.go:7:14:7:20 | Before "start" | DuplicateSwitchCase.go:7:14:7:20 | "start" | +| DuplicateSwitchCase.go:8:3:8:6 | After stop | DuplicateSwitchCase.go:8:3:8:8 | call to stop | +| DuplicateSwitchCase.go:8:3:8:6 | Before stop | DuplicateSwitchCase.go:8:3:8:6 | stop | +| DuplicateSwitchCase.go:8:3:8:6 | stop | DuplicateSwitchCase.go:8:3:8:6 | After stop | +| DuplicateSwitchCase.go:8:3:8:8 | After call to stop | DuplicateSwitchCase.go:8:3:8:8 | After expression statement | +| DuplicateSwitchCase.go:8:3:8:8 | After expression statement | DuplicateSwitchCase.go:4:2:11:2 | After expression-switch statement | +| DuplicateSwitchCase.go:8:3:8:8 | Before call to stop | DuplicateSwitchCase.go:8:3:8:6 | Before stop | +| DuplicateSwitchCase.go:8:3:8:8 | call to stop | DuplicateSwitchCase.go:3:1:12:1 | Exceptional Exit | +| DuplicateSwitchCase.go:8:3:8:8 | call to stop | DuplicateSwitchCase.go:8:3:8:8 | After call to stop | +| DuplicateSwitchCase.go:8:3:8:8 | expression statement | DuplicateSwitchCase.go:8:3:8:8 | Before call to stop | +| DuplicateSwitchCase.go:9:2:10:34 | After case clause [match] | DuplicateSwitchCase.go:10:3:10:34 | expression statement | +| DuplicateSwitchCase.go:9:2:10:34 | case clause | DuplicateSwitchCase.go:9:2:10:34 | After case clause [match] | +| DuplicateSwitchCase.go:10:3:10:7 | After panic | DuplicateSwitchCase.go:10:9:10:33 | Before "Message not understood." | +| DuplicateSwitchCase.go:10:3:10:7 | Before panic | DuplicateSwitchCase.go:10:3:10:7 | panic | +| DuplicateSwitchCase.go:10:3:10:7 | panic | DuplicateSwitchCase.go:10:3:10:7 | After panic | +| DuplicateSwitchCase.go:10:3:10:34 | Before call to panic | DuplicateSwitchCase.go:10:3:10:7 | Before panic | +| DuplicateSwitchCase.go:10:3:10:34 | call to panic | DuplicateSwitchCase.go:3:1:12:1 | Exceptional Exit | +| DuplicateSwitchCase.go:10:3:10:34 | expression statement | DuplicateSwitchCase.go:10:3:10:34 | Before call to panic | +| DuplicateSwitchCase.go:10:9:10:33 | "Message not understood." | DuplicateSwitchCase.go:10:9:10:33 | After "Message not understood." | +| DuplicateSwitchCase.go:10:9:10:33 | After "Message not understood." | DuplicateSwitchCase.go:10:3:10:34 | call to panic | +| DuplicateSwitchCase.go:10:9:10:33 | Before "Message not understood." | DuplicateSwitchCase.go:10:9:10:33 | "Message not understood." | +| DuplicateSwitchCase.go:14:1:14:15 | After function declaration | DuplicateSwitchCase.go:16:1:16:14 | Before function declaration | +| DuplicateSwitchCase.go:14:1:14:15 | Before function declaration | DuplicateSwitchCase.go:14:1:14:15 | function declaration | +| DuplicateSwitchCase.go:14:1:14:15 | Entry | DuplicateSwitchCase.go:14:14:14:15 | block statement | +| DuplicateSwitchCase.go:14:1:14:15 | Normal Exit | DuplicateSwitchCase.go:14:1:14:15 | Exit | +| DuplicateSwitchCase.go:14:1:14:15 | function declaration | DuplicateSwitchCase.go:14:1:14:15 | After function declaration | +| DuplicateSwitchCase.go:14:14:14:15 | block statement | DuplicateSwitchCase.go:14:1:14:15 | Normal Exit | +| DuplicateSwitchCase.go:16:1:16:14 | After function declaration | DuplicateSwitchCase.go:0:0:0:0 | After DuplicateSwitchCase.go | +| DuplicateSwitchCase.go:16:1:16:14 | Before function declaration | DuplicateSwitchCase.go:16:1:16:14 | function declaration | +| DuplicateSwitchCase.go:16:1:16:14 | Entry | DuplicateSwitchCase.go:16:13:16:14 | block statement | +| DuplicateSwitchCase.go:16:1:16:14 | Normal Exit | DuplicateSwitchCase.go:16:1:16:14 | Exit | +| DuplicateSwitchCase.go:16:1:16:14 | function declaration | DuplicateSwitchCase.go:16:1:16:14 | After function declaration | +| DuplicateSwitchCase.go:16:13:16:14 | block statement | DuplicateSwitchCase.go:16:1:16:14 | Normal Exit | +| epilogues.go:0:0:0:0 | After epilogues.go | epilogues.go:0:0:0:0 | Normal Exit | +| epilogues.go:0:0:0:0 | Entry | epilogues.go:0:0:0:0 | epilogues.go | +| epilogues.go:0:0:0:0 | Normal Exit | epilogues.go:0:0:0:0 | Exit | +| epilogues.go:0:0:0:0 | epilogues.go | epilogues.go:3:1:3:12 | import declaration | +| epilogues.go:3:1:3:12 | After import declaration | epilogues.go:8:1:10:1 | type declaration | +| epilogues.go:3:1:3:12 | import declaration | epilogues.go:3:8:3:12 | import specifier | +| epilogues.go:3:8:3:12 | import specifier | epilogues.go:3:1:3:12 | After import declaration | +| epilogues.go:8:1:10:1 | After type declaration | epilogues.go:12:1:14:1 | Before function declaration | +| epilogues.go:8:1:10:1 | type declaration | epilogues.go:8:6:10:1 | type declaration specifier | +| epilogues.go:8:6:10:1 | type declaration specifier | epilogues.go:8:1:10:1 | After type declaration | +| epilogues.go:12:1:14:1 | After function declaration | epilogues.go:16:1:18:1 | Before function declaration | +| epilogues.go:12:1:14:1 | Before function declaration | epilogues.go:12:1:14:1 | function declaration | +| epilogues.go:12:1:14:1 | Entry | epilogues.go:12:7:12:7 | l | +| epilogues.go:12:1:14:1 | Exceptional Exit | epilogues.go:12:1:14:1 | Exit | +| epilogues.go:12:1:14:1 | Normal Exit | epilogues.go:12:1:14:1 | Exit | +| epilogues.go:12:1:14:1 | function declaration | epilogues.go:12:1:14:1 | After function declaration | | epilogues.go:12:7:12:7 | l | epilogues.go:12:25:12:27 | msg | -| epilogues.go:12:21:12:23 | skip | epilogues.go:12:1:14:1 | function declaration | -| epilogues.go:12:25:12:27 | msg | epilogues.go:12:25:12:27 | msg | | epilogues.go:12:25:12:27 | msg | epilogues.go:12:37:12:40 | code | -| epilogues.go:12:37:12:40 | code | epilogues.go:12:37:12:40 | code | -| epilogues.go:12:37:12:40 | code | epilogues.go:13:2:13:12 | selection of Println | -| epilogues.go:13:2:13:12 | selection of Println | epilogues.go:13:14:13:14 | l | -| epilogues.go:13:2:13:33 | call to Println | epilogues.go:12:1:14:1 | exit | -| epilogues.go:13:14:13:14 | implicit-deref l | epilogues.go:12:1:14:1 | exit | +| epilogues.go:12:37:12:40 | code | epilogues.go:12:47:14:1 | block statement | +| epilogues.go:12:47:14:1 | After block statement | epilogues.go:12:1:14:1 | Normal Exit | +| epilogues.go:12:47:14:1 | block statement | epilogues.go:13:2:13:33 | expression statement | +| epilogues.go:13:2:13:12 | After selection of Println | epilogues.go:13:14:13:21 | Before selection of prefix | +| epilogues.go:13:2:13:12 | Before selection of Println | epilogues.go:13:2:13:12 | selection of Println | +| epilogues.go:13:2:13:12 | selection of Println | epilogues.go:13:2:13:12 | After selection of Println | +| epilogues.go:13:2:13:33 | After call to Println | epilogues.go:13:2:13:33 | After expression statement | +| epilogues.go:13:2:13:33 | After expression statement | epilogues.go:12:47:14:1 | After block statement | +| epilogues.go:13:2:13:33 | Before call to Println | epilogues.go:13:2:13:12 | Before selection of Println | +| epilogues.go:13:2:13:33 | call to Println | epilogues.go:12:1:14:1 | Exceptional Exit | +| epilogues.go:13:2:13:33 | call to Println | epilogues.go:13:2:13:33 | After call to Println | +| epilogues.go:13:2:13:33 | expression statement | epilogues.go:13:2:13:33 | Before call to Println | +| epilogues.go:13:14:13:14 | After l | epilogues.go:13:14:13:14 | implicit-deref l | +| epilogues.go:13:14:13:14 | Before l | epilogues.go:13:14:13:14 | l | | epilogues.go:13:14:13:14 | implicit-deref l | epilogues.go:13:14:13:21 | selection of prefix | -| epilogues.go:13:14:13:14 | l | epilogues.go:13:14:13:14 | implicit-deref l | -| epilogues.go:13:14:13:21 | selection of prefix | epilogues.go:13:24:13:26 | msg | -| epilogues.go:13:24:13:26 | msg | epilogues.go:13:29:13:32 | code | -| epilogues.go:13:29:13:32 | code | epilogues.go:13:2:13:33 | call to Println | -| epilogues.go:16:1:18:1 | entry | epilogues.go:16:7:16:7 | l | -| epilogues.go:16:1:18:1 | function declaration | epilogues.go:23:6:23:15 | skip | -| epilogues.go:16:7:16:7 | l | epilogues.go:16:7:16:7 | l | +| epilogues.go:13:14:13:14 | l | epilogues.go:13:14:13:14 | After l | +| epilogues.go:13:14:13:21 | After selection of prefix | epilogues.go:13:24:13:26 | Before msg | +| epilogues.go:13:14:13:21 | Before selection of prefix | epilogues.go:13:14:13:14 | Before l | +| epilogues.go:13:14:13:21 | selection of prefix | epilogues.go:13:14:13:21 | After selection of prefix | +| epilogues.go:13:24:13:26 | After msg | epilogues.go:13:29:13:32 | Before code | +| epilogues.go:13:24:13:26 | Before msg | epilogues.go:13:24:13:26 | msg | +| epilogues.go:13:24:13:26 | msg | epilogues.go:13:24:13:26 | After msg | +| epilogues.go:13:29:13:32 | After code | epilogues.go:13:2:13:33 | call to Println | +| epilogues.go:13:29:13:32 | Before code | epilogues.go:13:29:13:32 | code | +| epilogues.go:13:29:13:32 | code | epilogues.go:13:29:13:32 | After code | +| epilogues.go:16:1:18:1 | After function declaration | epilogues.go:23:1:27:1 | Before function declaration | +| epilogues.go:16:1:18:1 | Before function declaration | epilogues.go:16:1:18:1 | function declaration | +| epilogues.go:16:1:18:1 | Entry | epilogues.go:16:7:16:7 | l | +| epilogues.go:16:1:18:1 | Exceptional Exit | epilogues.go:16:1:18:1 | Exit | +| epilogues.go:16:1:18:1 | Normal Exit | epilogues.go:16:1:18:1 | Exit | +| epilogues.go:16:1:18:1 | function declaration | epilogues.go:16:1:18:1 | After function declaration | | epilogues.go:16:7:16:7 | l | epilogues.go:16:29:16:31 | msg | -| epilogues.go:16:20:16:27 | skip | epilogues.go:16:1:18:1 | function declaration | -| epilogues.go:16:29:16:31 | msg | epilogues.go:16:29:16:31 | msg | -| epilogues.go:16:29:16:31 | msg | epilogues.go:17:2:17:12 | selection of Println | -| epilogues.go:17:2:17:12 | selection of Println | epilogues.go:17:14:17:14 | l | -| epilogues.go:17:2:17:27 | call to Println | epilogues.go:16:1:18:1 | exit | -| epilogues.go:17:14:17:14 | l | epilogues.go:17:14:17:21 | selection of prefix | -| epilogues.go:17:14:17:21 | selection of prefix | epilogues.go:17:24:17:26 | msg | -| epilogues.go:17:24:17:26 | msg | epilogues.go:17:2:17:27 | call to Println | -| epilogues.go:23:1:27:1 | entry | epilogues.go:24:5:24:5 | skip | -| epilogues.go:23:1:27:1 | function declaration | epilogues.go:31:6:31:13 | skip | -| epilogues.go:23:6:23:15 | skip | epilogues.go:23:1:27:1 | function declaration | -| epilogues.go:24:5:24:5 | skip | epilogues.go:24:10:24:16 | recover | -| epilogues.go:24:5:24:18 | assign:0 ... := ... | epilogues.go:24:21:24:21 | r | -| epilogues.go:24:10:24:16 | recover | epilogues.go:24:10:24:18 | call to recover | -| epilogues.go:24:10:24:18 | call to recover | epilogues.go:24:5:24:18 | assign:0 ... := ... | -| epilogues.go:24:21:24:21 | r | epilogues.go:24:26:24:28 | nil | -| epilogues.go:24:21:24:28 | ...!=... | epilogues.go:23:1:27:1 | exit | -| epilogues.go:24:21:24:28 | ...!=... | epilogues.go:24:21:24:28 | ...!=... is false | -| epilogues.go:24:21:24:28 | ...!=... | epilogues.go:24:21:24:28 | ...!=... is true | -| epilogues.go:24:21:24:28 | ...!=... is false | epilogues.go:23:1:27:1 | exit | -| epilogues.go:24:21:24:28 | ...!=... is true | epilogues.go:25:3:25:13 | selection of Println | -| epilogues.go:24:26:24:28 | nil | epilogues.go:24:21:24:28 | ...!=... | -| epilogues.go:25:3:25:13 | selection of Println | epilogues.go:25:15:25:26 | "recovered:" | -| epilogues.go:25:3:25:30 | call to Println | epilogues.go:23:1:27:1 | exit | -| epilogues.go:25:15:25:26 | "recovered:" | epilogues.go:25:29:25:29 | r | -| epilogues.go:25:29:25:29 | r | epilogues.go:25:3:25:30 | call to Println | -| epilogues.go:31:1:33:1 | entry | epilogues.go:31:15:31:15 | x | -| epilogues.go:31:1:33:1 | function declaration | epilogues.go:36:6:36:12 | skip | -| epilogues.go:31:6:31:13 | skip | epilogues.go:31:1:33:1 | function declaration | -| epilogues.go:31:15:31:15 | x | epilogues.go:31:15:31:15 | x | -| epilogues.go:31:15:31:15 | x | epilogues.go:32:9:32:9 | x | -| epilogues.go:32:2:32:13 | return statement | epilogues.go:31:1:33:1 | exit | -| epilogues.go:32:9:32:9 | x | epilogues.go:32:13:32:13 | 2 | -| epilogues.go:32:9:32:13 | ...*... | epilogues.go:32:2:32:13 | return statement | -| epilogues.go:32:13:32:13 | 2 | epilogues.go:32:9:32:13 | ...*... | -| epilogues.go:36:1:38:1 | entry | epilogues.go:37:2:37:12 | selection of Println | -| epilogues.go:36:1:38:1 | function declaration | epilogues.go:42:6:42:18 | skip | -| epilogues.go:36:6:36:12 | skip | epilogues.go:36:1:38:1 | function declaration | -| epilogues.go:37:2:37:12 | selection of Println | epilogues.go:37:14:37:19 | "void" | -| epilogues.go:37:2:37:20 | call to Println | epilogues.go:36:1:38:1 | exit | -| epilogues.go:37:14:37:19 | "void" | epilogues.go:37:2:37:20 | call to Println | -| epilogues.go:42:1:48:1 | entry | epilogues.go:42:20:42:20 | x | -| epilogues.go:42:1:48:1 | function declaration | epilogues.go:51:6:51:21 | skip | -| epilogues.go:42:6:42:18 | skip | epilogues.go:42:1:48:1 | function declaration | -| epilogues.go:42:20:42:20 | x | epilogues.go:42:20:42:20 | x | -| epilogues.go:42:20:42:20 | x | epilogues.go:42:51:48:1 | result-zero-init:0 block statement | +| epilogues.go:16:29:16:31 | msg | epilogues.go:16:41:18:1 | block statement | +| epilogues.go:16:41:18:1 | After block statement | epilogues.go:16:1:18:1 | Normal Exit | +| epilogues.go:16:41:18:1 | block statement | epilogues.go:17:2:17:27 | expression statement | +| epilogues.go:17:2:17:12 | After selection of Println | epilogues.go:17:14:17:21 | Before selection of prefix | +| epilogues.go:17:2:17:12 | Before selection of Println | epilogues.go:17:2:17:12 | selection of Println | +| epilogues.go:17:2:17:12 | selection of Println | epilogues.go:17:2:17:12 | After selection of Println | +| epilogues.go:17:2:17:27 | After call to Println | epilogues.go:17:2:17:27 | After expression statement | +| epilogues.go:17:2:17:27 | After expression statement | epilogues.go:16:41:18:1 | After block statement | +| epilogues.go:17:2:17:27 | Before call to Println | epilogues.go:17:2:17:12 | Before selection of Println | +| epilogues.go:17:2:17:27 | call to Println | epilogues.go:16:1:18:1 | Exceptional Exit | +| epilogues.go:17:2:17:27 | call to Println | epilogues.go:17:2:17:27 | After call to Println | +| epilogues.go:17:2:17:27 | expression statement | epilogues.go:17:2:17:27 | Before call to Println | +| epilogues.go:17:14:17:14 | After l | epilogues.go:17:14:17:21 | selection of prefix | +| epilogues.go:17:14:17:14 | Before l | epilogues.go:17:14:17:14 | l | +| epilogues.go:17:14:17:14 | l | epilogues.go:17:14:17:14 | After l | +| epilogues.go:17:14:17:21 | After selection of prefix | epilogues.go:17:24:17:26 | Before msg | +| epilogues.go:17:14:17:21 | Before selection of prefix | epilogues.go:17:14:17:14 | Before l | +| epilogues.go:17:14:17:21 | selection of prefix | epilogues.go:17:14:17:21 | After selection of prefix | +| epilogues.go:17:24:17:26 | After msg | epilogues.go:17:2:17:27 | call to Println | +| epilogues.go:17:24:17:26 | Before msg | epilogues.go:17:24:17:26 | msg | +| epilogues.go:17:24:17:26 | msg | epilogues.go:17:24:17:26 | After msg | +| epilogues.go:23:1:27:1 | After function declaration | epilogues.go:31:1:33:1 | Before function declaration | +| epilogues.go:23:1:27:1 | Before function declaration | epilogues.go:23:1:27:1 | function declaration | +| epilogues.go:23:1:27:1 | Entry | epilogues.go:23:19:27:1 | block statement | +| epilogues.go:23:1:27:1 | Exceptional Exit | epilogues.go:23:1:27:1 | Exit | +| epilogues.go:23:1:27:1 | Normal Exit | epilogues.go:23:1:27:1 | Exit | +| epilogues.go:23:1:27:1 | function declaration | epilogues.go:23:1:27:1 | After function declaration | +| epilogues.go:23:19:27:1 | After block statement | epilogues.go:23:1:27:1 | Normal Exit | +| epilogues.go:23:19:27:1 | block statement | epilogues.go:24:2:26:2 | if statement | +| epilogues.go:24:2:26:2 | After if statement | epilogues.go:23:19:27:1 | After block statement | +| epilogues.go:24:2:26:2 | if statement | epilogues.go:24:5:24:18 | ... := ... | +| epilogues.go:24:5:24:18 | ... := ... | epilogues.go:24:10:24:18 | Before call to recover | +| epilogues.go:24:5:24:18 | After ... := ... | epilogues.go:24:21:24:28 | Before ...!=... | +| epilogues.go:24:5:24:18 | assign:0 ... := ... | epilogues.go:24:5:24:18 | After ... := ... | +| epilogues.go:24:10:24:16 | After recover | epilogues.go:24:10:24:18 | call to recover | +| epilogues.go:24:10:24:16 | Before recover | epilogues.go:24:10:24:16 | recover | +| epilogues.go:24:10:24:16 | recover | epilogues.go:24:10:24:16 | After recover | +| epilogues.go:24:10:24:18 | After call to recover | epilogues.go:24:5:24:18 | assign:0 ... := ... | +| epilogues.go:24:10:24:18 | Before call to recover | epilogues.go:24:10:24:16 | Before recover | +| epilogues.go:24:10:24:18 | call to recover | epilogues.go:24:10:24:18 | After call to recover | +| epilogues.go:24:21:24:21 | After r | epilogues.go:24:26:24:28 | Before nil | +| epilogues.go:24:21:24:21 | Before r | epilogues.go:24:21:24:21 | r | +| epilogues.go:24:21:24:21 | r | epilogues.go:24:21:24:21 | After r | +| epilogues.go:24:21:24:28 | ...!=... | epilogues.go:24:21:24:28 | After ...!=... [false] | +| epilogues.go:24:21:24:28 | ...!=... | epilogues.go:24:21:24:28 | After ...!=... [true] | +| epilogues.go:24:21:24:28 | After ...!=... [false] | epilogues.go:24:2:26:2 | After if statement | +| epilogues.go:24:21:24:28 | After ...!=... [true] | epilogues.go:24:30:26:2 | block statement | +| epilogues.go:24:21:24:28 | Before ...!=... | epilogues.go:24:21:24:21 | Before r | +| epilogues.go:24:26:24:28 | After nil | epilogues.go:24:21:24:28 | ...!=... | +| epilogues.go:24:26:24:28 | Before nil | epilogues.go:24:26:24:28 | nil | +| epilogues.go:24:26:24:28 | nil | epilogues.go:24:26:24:28 | After nil | +| epilogues.go:24:30:26:2 | After block statement | epilogues.go:24:2:26:2 | After if statement | +| epilogues.go:24:30:26:2 | block statement | epilogues.go:25:3:25:30 | expression statement | +| epilogues.go:25:3:25:13 | After selection of Println | epilogues.go:25:15:25:26 | Before "recovered:" | +| epilogues.go:25:3:25:13 | Before selection of Println | epilogues.go:25:3:25:13 | selection of Println | +| epilogues.go:25:3:25:13 | selection of Println | epilogues.go:25:3:25:13 | After selection of Println | +| epilogues.go:25:3:25:30 | After call to Println | epilogues.go:25:3:25:30 | After expression statement | +| epilogues.go:25:3:25:30 | After expression statement | epilogues.go:24:30:26:2 | After block statement | +| epilogues.go:25:3:25:30 | Before call to Println | epilogues.go:25:3:25:13 | Before selection of Println | +| epilogues.go:25:3:25:30 | call to Println | epilogues.go:23:1:27:1 | Exceptional Exit | +| epilogues.go:25:3:25:30 | call to Println | epilogues.go:25:3:25:30 | After call to Println | +| epilogues.go:25:3:25:30 | expression statement | epilogues.go:25:3:25:30 | Before call to Println | +| epilogues.go:25:15:25:26 | "recovered:" | epilogues.go:25:15:25:26 | After "recovered:" | +| epilogues.go:25:15:25:26 | After "recovered:" | epilogues.go:25:29:25:29 | Before r | +| epilogues.go:25:15:25:26 | Before "recovered:" | epilogues.go:25:15:25:26 | "recovered:" | +| epilogues.go:25:29:25:29 | After r | epilogues.go:25:3:25:30 | call to Println | +| epilogues.go:25:29:25:29 | Before r | epilogues.go:25:29:25:29 | r | +| epilogues.go:25:29:25:29 | r | epilogues.go:25:29:25:29 | After r | +| epilogues.go:31:1:33:1 | After function declaration | epilogues.go:36:1:38:1 | Before function declaration | +| epilogues.go:31:1:33:1 | Before function declaration | epilogues.go:31:1:33:1 | function declaration | +| epilogues.go:31:1:33:1 | Entry | epilogues.go:31:15:31:15 | x | +| epilogues.go:31:1:33:1 | Normal Exit | epilogues.go:31:1:33:1 | Exit | +| epilogues.go:31:1:33:1 | function declaration | epilogues.go:31:1:33:1 | After function declaration | +| epilogues.go:31:15:31:15 | x | epilogues.go:31:26:33:1 | block statement | +| epilogues.go:31:26:33:1 | block statement | epilogues.go:32:2:32:13 | Before return statement | +| epilogues.go:32:2:32:13 | Before return statement | epilogues.go:32:9:32:13 | Before ...*... | +| epilogues.go:32:2:32:13 | return statement | epilogues.go:31:1:33:1 | Normal Exit | +| epilogues.go:32:9:32:9 | After x | epilogues.go:32:13:32:13 | Before 2 | +| epilogues.go:32:9:32:9 | Before x | epilogues.go:32:9:32:9 | x | +| epilogues.go:32:9:32:9 | x | epilogues.go:32:9:32:9 | After x | +| epilogues.go:32:9:32:13 | ...*... | epilogues.go:32:9:32:13 | After ...*... | +| epilogues.go:32:9:32:13 | After ...*... | epilogues.go:32:2:32:13 | return statement | +| epilogues.go:32:9:32:13 | Before ...*... | epilogues.go:32:9:32:9 | Before x | +| epilogues.go:32:13:32:13 | 2 | epilogues.go:32:13:32:13 | After 2 | +| epilogues.go:32:13:32:13 | After 2 | epilogues.go:32:9:32:13 | ...*... | +| epilogues.go:32:13:32:13 | Before 2 | epilogues.go:32:13:32:13 | 2 | +| epilogues.go:36:1:38:1 | After function declaration | epilogues.go:42:1:48:1 | Before function declaration | +| epilogues.go:36:1:38:1 | Before function declaration | epilogues.go:36:1:38:1 | function declaration | +| epilogues.go:36:1:38:1 | Entry | epilogues.go:36:16:38:1 | block statement | +| epilogues.go:36:1:38:1 | Exceptional Exit | epilogues.go:36:1:38:1 | Exit | +| epilogues.go:36:1:38:1 | Normal Exit | epilogues.go:36:1:38:1 | Exit | +| epilogues.go:36:1:38:1 | function declaration | epilogues.go:36:1:38:1 | After function declaration | +| epilogues.go:36:16:38:1 | After block statement | epilogues.go:36:1:38:1 | Normal Exit | +| epilogues.go:36:16:38:1 | block statement | epilogues.go:37:2:37:20 | expression statement | +| epilogues.go:37:2:37:12 | After selection of Println | epilogues.go:37:14:37:19 | Before "void" | +| epilogues.go:37:2:37:12 | Before selection of Println | epilogues.go:37:2:37:12 | selection of Println | +| epilogues.go:37:2:37:12 | selection of Println | epilogues.go:37:2:37:12 | After selection of Println | +| epilogues.go:37:2:37:20 | After call to Println | epilogues.go:37:2:37:20 | After expression statement | +| epilogues.go:37:2:37:20 | After expression statement | epilogues.go:36:16:38:1 | After block statement | +| epilogues.go:37:2:37:20 | Before call to Println | epilogues.go:37:2:37:12 | Before selection of Println | +| epilogues.go:37:2:37:20 | call to Println | epilogues.go:36:1:38:1 | Exceptional Exit | +| epilogues.go:37:2:37:20 | call to Println | epilogues.go:37:2:37:20 | After call to Println | +| epilogues.go:37:2:37:20 | expression statement | epilogues.go:37:2:37:20 | Before call to Println | +| epilogues.go:37:14:37:19 | "void" | epilogues.go:37:14:37:19 | After "void" | +| epilogues.go:37:14:37:19 | After "void" | epilogues.go:37:2:37:20 | call to Println | +| epilogues.go:37:14:37:19 | Before "void" | epilogues.go:37:14:37:19 | "void" | +| epilogues.go:42:1:48:1 | After function declaration | epilogues.go:51:1:54:1 | Before function declaration | +| epilogues.go:42:1:48:1 | Before function declaration | epilogues.go:42:1:48:1 | function declaration | +| epilogues.go:42:1:48:1 | Entry | epilogues.go:42:20:42:20 | x | +| epilogues.go:42:1:48:1 | Normal Exit | epilogues.go:42:1:48:1 | Exit | +| epilogues.go:42:1:48:1 | function declaration | epilogues.go:42:1:48:1 | After function declaration | +| epilogues.go:42:20:42:20 | x | epilogues.go:42:51:48:1 | block statement | +| epilogues.go:42:51:48:1 | block statement | epilogues.go:42:51:48:1 | result-zero-init:0 block statement | | epilogues.go:42:51:48:1 | result-init:0 block statement | epilogues.go:42:51:48:1 | result-zero-init:1 block statement | -| epilogues.go:42:51:48:1 | result-init:1 block statement | epilogues.go:43:5:43:5 | x | +| epilogues.go:42:51:48:1 | result-init:1 block statement | epilogues.go:43:2:46:2 | if statement | | epilogues.go:42:51:48:1 | result-read:0 block statement | epilogues.go:42:51:48:1 | result-read:1 block statement | -| epilogues.go:42:51:48:1 | result-read:1 block statement | epilogues.go:42:1:48:1 | exit | +| epilogues.go:42:51:48:1 | result-read:1 block statement | epilogues.go:42:1:48:1 | Normal Exit | | epilogues.go:42:51:48:1 | result-zero-init:0 block statement | epilogues.go:42:51:48:1 | result-init:0 block statement | | epilogues.go:42:51:48:1 | result-zero-init:1 block statement | epilogues.go:42:51:48:1 | result-init:1 block statement | -| epilogues.go:43:5:43:5 | x | epilogues.go:43:9:43:9 | 0 | -| epilogues.go:43:5:43:9 | ...<... | epilogues.go:43:5:43:9 | ...<... is false | -| epilogues.go:43:5:43:9 | ...<... | epilogues.go:43:5:43:9 | ...<... is true | -| epilogues.go:43:5:43:9 | ...<... is false | epilogues.go:47:9:47:9 | x | -| epilogues.go:43:5:43:9 | ...<... is true | epilogues.go:44:3:44:8 | skip | -| epilogues.go:43:9:43:9 | 0 | epilogues.go:43:5:43:9 | ...<... | -| epilogues.go:44:3:44:8 | skip | epilogues.go:44:13:44:13 | x | -| epilogues.go:44:3:44:13 | assign:0 ... = ... | epilogues.go:45:3:45:8 | return statement | -| epilogues.go:44:12:44:13 | -... | epilogues.go:44:3:44:13 | assign:0 ... = ... | -| epilogues.go:44:13:44:13 | x | epilogues.go:44:12:44:13 | -... | +| epilogues.go:43:2:46:2 | After if statement | epilogues.go:47:2:47:14 | Before return statement | +| epilogues.go:43:2:46:2 | if statement | epilogues.go:43:5:43:9 | Before ...<... | +| epilogues.go:43:5:43:5 | After x | epilogues.go:43:9:43:9 | Before 0 | +| epilogues.go:43:5:43:5 | Before x | epilogues.go:43:5:43:5 | x | +| epilogues.go:43:5:43:5 | x | epilogues.go:43:5:43:5 | After x | +| epilogues.go:43:5:43:9 | ...<... | epilogues.go:43:5:43:9 | After ...<... [false] | +| epilogues.go:43:5:43:9 | ...<... | epilogues.go:43:5:43:9 | After ...<... [true] | +| epilogues.go:43:5:43:9 | After ...<... [false] | epilogues.go:43:2:46:2 | After if statement | +| epilogues.go:43:5:43:9 | After ...<... [true] | epilogues.go:43:11:46:2 | block statement | +| epilogues.go:43:5:43:9 | Before ...<... | epilogues.go:43:5:43:5 | Before x | +| epilogues.go:43:9:43:9 | 0 | epilogues.go:43:9:43:9 | After 0 | +| epilogues.go:43:9:43:9 | After 0 | epilogues.go:43:5:43:9 | ...<... | +| epilogues.go:43:9:43:9 | Before 0 | epilogues.go:43:9:43:9 | 0 | +| epilogues.go:43:11:46:2 | block statement | epilogues.go:44:3:44:13 | ... = ... | +| epilogues.go:44:3:44:13 | ... = ... | epilogues.go:44:12:44:13 | Before -... | +| epilogues.go:44:3:44:13 | After ... = ... | epilogues.go:45:3:45:8 | Before return statement | +| epilogues.go:44:3:44:13 | assign:0 ... = ... | epilogues.go:44:3:44:13 | After ... = ... | +| epilogues.go:44:12:44:13 | -... | epilogues.go:44:12:44:13 | After -... | +| epilogues.go:44:12:44:13 | After -... | epilogues.go:44:3:44:13 | assign:0 ... = ... | +| epilogues.go:44:12:44:13 | Before -... | epilogues.go:44:13:44:13 | Before x | +| epilogues.go:44:13:44:13 | After x | epilogues.go:44:12:44:13 | -... | +| epilogues.go:44:13:44:13 | Before x | epilogues.go:44:13:44:13 | x | +| epilogues.go:44:13:44:13 | x | epilogues.go:44:13:44:13 | After x | +| epilogues.go:45:3:45:8 | Before return statement | epilogues.go:45:3:45:8 | return statement | | epilogues.go:45:3:45:8 | return statement | epilogues.go:42:51:48:1 | result-read:0 block statement | -| epilogues.go:47:2:47:14 | result-write:0 return statement | epilogues.go:47:12:47:14 | nil | +| epilogues.go:47:2:47:14 | Before return statement | epilogues.go:47:9:47:9 | Before x | +| epilogues.go:47:2:47:14 | result-write:0 return statement | epilogues.go:47:2:47:14 | result-write:1 return statement | | epilogues.go:47:2:47:14 | result-write:1 return statement | epilogues.go:47:2:47:14 | return statement | | epilogues.go:47:2:47:14 | return statement | epilogues.go:42:51:48:1 | result-read:0 block statement | -| epilogues.go:47:9:47:9 | x | epilogues.go:47:2:47:14 | result-write:0 return statement | -| epilogues.go:47:12:47:14 | nil | epilogues.go:47:2:47:14 | result-write:1 return statement | -| epilogues.go:51:1:54:1 | entry | epilogues.go:51:23:51:23 | x | -| epilogues.go:51:1:54:1 | function declaration | epilogues.go:59:6:59:25 | skip | -| epilogues.go:51:6:51:21 | skip | epilogues.go:51:1:54:1 | function declaration | -| epilogues.go:51:23:51:23 | x | epilogues.go:51:23:51:23 | x | -| epilogues.go:51:23:51:23 | x | epilogues.go:51:38:54:1 | result-zero-init:0 block statement | -| epilogues.go:51:38:54:1 | result-init:0 block statement | epilogues.go:52:2:52:2 | skip | -| epilogues.go:51:38:54:1 | result-read:0 block statement | epilogues.go:51:1:54:1 | exit | +| epilogues.go:47:9:47:9 | After x | epilogues.go:47:12:47:14 | Before nil | +| epilogues.go:47:9:47:9 | Before x | epilogues.go:47:9:47:9 | x | +| epilogues.go:47:9:47:9 | x | epilogues.go:47:9:47:9 | After x | +| epilogues.go:47:12:47:14 | After nil | epilogues.go:47:2:47:14 | result-write:0 return statement | +| epilogues.go:47:12:47:14 | Before nil | epilogues.go:47:12:47:14 | nil | +| epilogues.go:47:12:47:14 | nil | epilogues.go:47:12:47:14 | After nil | +| epilogues.go:51:1:54:1 | After function declaration | epilogues.go:59:1:62:1 | Before function declaration | +| epilogues.go:51:1:54:1 | Before function declaration | epilogues.go:51:1:54:1 | function declaration | +| epilogues.go:51:1:54:1 | Entry | epilogues.go:51:23:51:23 | x | +| epilogues.go:51:1:54:1 | Normal Exit | epilogues.go:51:1:54:1 | Exit | +| epilogues.go:51:1:54:1 | function declaration | epilogues.go:51:1:54:1 | After function declaration | +| epilogues.go:51:23:51:23 | x | epilogues.go:51:38:54:1 | block statement | +| epilogues.go:51:38:54:1 | block statement | epilogues.go:51:38:54:1 | result-zero-init:0 block statement | +| epilogues.go:51:38:54:1 | result-init:0 block statement | epilogues.go:52:2:52:10 | ... = ... | +| epilogues.go:51:38:54:1 | result-read:0 block statement | epilogues.go:51:1:54:1 | Normal Exit | | epilogues.go:51:38:54:1 | result-zero-init:0 block statement | epilogues.go:51:38:54:1 | result-init:0 block statement | -| epilogues.go:52:2:52:2 | skip | epilogues.go:52:6:52:6 | x | -| epilogues.go:52:2:52:10 | assign:0 ... = ... | epilogues.go:53:2:53:7 | return statement | -| epilogues.go:52:6:52:6 | x | epilogues.go:52:10:52:10 | 1 | -| epilogues.go:52:6:52:10 | ...+... | epilogues.go:52:2:52:10 | assign:0 ... = ... | -| epilogues.go:52:10:52:10 | 1 | epilogues.go:52:6:52:10 | ...+... | +| epilogues.go:52:2:52:10 | ... = ... | epilogues.go:52:6:52:10 | Before ...+... | +| epilogues.go:52:2:52:10 | After ... = ... | epilogues.go:53:2:53:7 | Before return statement | +| epilogues.go:52:2:52:10 | assign:0 ... = ... | epilogues.go:52:2:52:10 | After ... = ... | +| epilogues.go:52:6:52:6 | After x | epilogues.go:52:10:52:10 | Before 1 | +| epilogues.go:52:6:52:6 | Before x | epilogues.go:52:6:52:6 | x | +| epilogues.go:52:6:52:6 | x | epilogues.go:52:6:52:6 | After x | +| epilogues.go:52:6:52:10 | ...+... | epilogues.go:52:6:52:10 | After ...+... | +| epilogues.go:52:6:52:10 | After ...+... | epilogues.go:52:2:52:10 | assign:0 ... = ... | +| epilogues.go:52:6:52:10 | Before ...+... | epilogues.go:52:6:52:6 | Before x | +| epilogues.go:52:10:52:10 | 1 | epilogues.go:52:10:52:10 | After 1 | +| epilogues.go:52:10:52:10 | After 1 | epilogues.go:52:6:52:10 | ...+... | +| epilogues.go:52:10:52:10 | Before 1 | epilogues.go:52:10:52:10 | 1 | +| epilogues.go:53:2:53:7 | Before return statement | epilogues.go:53:2:53:7 | return statement | | epilogues.go:53:2:53:7 | return statement | epilogues.go:51:38:54:1 | result-read:0 block statement | -| epilogues.go:59:1:62:1 | entry | epilogues.go:59:27:59:27 | l | -| epilogues.go:59:1:62:1 | function declaration | epilogues.go:66:6:66:26 | skip | -| epilogues.go:59:6:59:25 | skip | epilogues.go:59:1:62:1 | function declaration | -| epilogues.go:59:27:59:27 | l | epilogues.go:59:27:59:27 | l | +| epilogues.go:59:1:62:1 | After function declaration | epilogues.go:66:1:71:1 | Before function declaration | +| epilogues.go:59:1:62:1 | Before function declaration | epilogues.go:59:1:62:1 | function declaration | +| epilogues.go:59:1:62:1 | Entry | epilogues.go:59:27:59:27 | l | +| epilogues.go:59:1:62:1 | Exceptional Exit | epilogues.go:59:1:62:1 | Exit | +| epilogues.go:59:1:62:1 | Normal Exit | epilogues.go:59:1:62:1 | Exit | +| epilogues.go:59:1:62:1 | function declaration | epilogues.go:59:1:62:1 | After function declaration | | epilogues.go:59:27:59:27 | l | epilogues.go:59:41:59:45 | items | -| epilogues.go:59:41:59:45 | items | epilogues.go:59:41:59:45 | items | -| epilogues.go:59:41:59:45 | items | epilogues.go:60:8:60:8 | l | -| epilogues.go:60:2:60:33 | defer statement | epilogues.go:61:2:61:12 | selection of Println | -| epilogues.go:60:8:60:8 | l | epilogues.go:60:8:60:12 | selection of log | -| epilogues.go:60:8:60:12 | selection of log | epilogues.go:60:14:60:20 | "count" | -| epilogues.go:60:8:60:33 | call to log | epilogues.go:59:1:62:1 | exit | -| epilogues.go:60:14:60:20 | "count" | epilogues.go:60:23:60:25 | len | -| epilogues.go:60:23:60:25 | len | epilogues.go:60:27:60:31 | items | -| epilogues.go:60:23:60:32 | call to len | epilogues.go:60:2:60:33 | defer statement | -| epilogues.go:60:27:60:31 | items | epilogues.go:60:23:60:32 | call to len | -| epilogues.go:61:2:61:12 | selection of Println | epilogues.go:61:14:61:25 | "processing" | -| epilogues.go:61:2:61:38 | call to Println | epilogues.go:60:8:60:33 | call to log | -| epilogues.go:61:14:61:25 | "processing" | epilogues.go:61:28:61:30 | len | -| epilogues.go:61:28:61:30 | len | epilogues.go:61:32:61:36 | items | -| epilogues.go:61:28:61:37 | call to len | epilogues.go:61:2:61:38 | call to Println | -| epilogues.go:61:32:61:36 | items | epilogues.go:61:28:61:37 | call to len | -| epilogues.go:66:1:71:1 | entry | epilogues.go:66:28:66:33 | prefix | -| epilogues.go:66:1:71:1 | function declaration | epilogues.go:77:6:77:20 | skip | -| epilogues.go:66:6:66:26 | skip | epilogues.go:66:1:71:1 | function declaration | -| epilogues.go:66:28:66:33 | prefix | epilogues.go:66:28:66:33 | prefix | -| epilogues.go:66:28:66:33 | prefix | epilogues.go:67:2:67:2 | skip | -| epilogues.go:67:2:67:2 | skip | epilogues.go:67:7:67:31 | struct literal | -| epilogues.go:67:2:67:31 | assign:0 ... := ... | epilogues.go:68:8:68:8 | l | -| epilogues.go:67:7:67:31 | struct literal | epilogues.go:67:25:67:30 | prefix | -| epilogues.go:67:17:67:30 | lit-init key-value pair | epilogues.go:67:2:67:31 | assign:0 ... := ... | -| epilogues.go:67:25:67:30 | prefix | epilogues.go:67:17:67:30 | lit-init key-value pair | -| epilogues.go:68:2:68:24 | defer statement | epilogues.go:69:10:69:10 | l | -| epilogues.go:68:8:68:8 | l | epilogues.go:68:8:68:17 | selection of logValue | -| epilogues.go:68:8:68:17 | selection of logValue | epilogues.go:68:19:68:23 | "bye" | -| epilogues.go:68:8:68:24 | call to logValue | epilogues.go:66:1:71:1 | exit | -| epilogues.go:68:19:68:23 | "bye" | epilogues.go:68:2:68:24 | defer statement | -| epilogues.go:69:2:69:25 | defer statement | epilogues.go:70:2:70:12 | selection of Println | -| epilogues.go:69:8:69:15 | selection of log | epilogues.go:69:17:69:21 | "ptr" | -| epilogues.go:69:8:69:25 | call to log | epilogues.go:68:8:68:24 | call to logValue | -| epilogues.go:69:9:69:10 | &... | epilogues.go:69:8:69:15 | selection of log | -| epilogues.go:69:10:69:10 | l | epilogues.go:69:9:69:10 | &... | -| epilogues.go:69:17:69:21 | "ptr" | epilogues.go:69:24:69:24 | 7 | -| epilogues.go:69:24:69:24 | 7 | epilogues.go:69:2:69:25 | defer statement | -| epilogues.go:70:2:70:12 | selection of Println | epilogues.go:70:14:70:19 | "body" | -| epilogues.go:70:2:70:20 | call to Println | epilogues.go:69:8:69:25 | call to log | -| epilogues.go:70:14:70:19 | "body" | epilogues.go:70:2:70:20 | call to Println | -| epilogues.go:77:1:82:1 | entry | epilogues.go:77:22:77:22 | x | -| epilogues.go:77:1:82:1 | function declaration | epilogues.go:87:6:87:20 | skip | -| epilogues.go:77:6:77:20 | skip | epilogues.go:77:1:82:1 | function declaration | -| epilogues.go:77:22:77:22 | x | epilogues.go:77:22:77:22 | x | -| epilogues.go:77:22:77:22 | x | epilogues.go:78:8:80:2 | function literal | -| epilogues.go:78:2:80:15 | defer statement | epilogues.go:81:2:81:12 | selection of Println | -| epilogues.go:78:8:80:2 | entry | epilogues.go:78:13:78:17 | label | -| epilogues.go:78:8:80:2 | function literal | epilogues.go:80:4:80:9 | "done" | -| epilogues.go:78:8:80:15 | function call | epilogues.go:77:1:82:1 | exit | -| epilogues.go:78:13:78:17 | label | epilogues.go:78:13:78:17 | label | +| epilogues.go:59:41:59:45 | items | epilogues.go:59:54:62:1 | block statement | +| epilogues.go:59:54:62:1 | After block statement | epilogues.go:60:8:60:33 | defer-invoke call to log | +| epilogues.go:59:54:62:1 | block statement | epilogues.go:60:2:60:33 | Before defer statement | +| epilogues.go:60:2:60:33 | After defer statement | epilogues.go:61:2:61:38 | expression statement | +| epilogues.go:60:2:60:33 | Before defer statement | epilogues.go:60:8:60:33 | call to log | +| epilogues.go:60:2:60:33 | defer statement | epilogues.go:60:2:60:33 | After defer statement | +| epilogues.go:60:8:60:8 | After l | epilogues.go:60:8:60:12 | selection of log | +| epilogues.go:60:8:60:8 | Before l | epilogues.go:60:8:60:8 | l | +| epilogues.go:60:8:60:8 | l | epilogues.go:60:8:60:8 | After l | +| epilogues.go:60:8:60:12 | After selection of log | epilogues.go:60:14:60:20 | Before "count" | +| epilogues.go:60:8:60:12 | Before selection of log | epilogues.go:60:8:60:8 | Before l | +| epilogues.go:60:8:60:12 | selection of log | epilogues.go:60:8:60:12 | After selection of log | +| epilogues.go:60:8:60:33 | After call to log | epilogues.go:60:2:60:33 | defer statement | +| epilogues.go:60:8:60:33 | call to log | epilogues.go:60:8:60:12 | Before selection of log | +| epilogues.go:60:8:60:33 | defer-invoke call to log | epilogues.go:59:1:62:1 | Exceptional Exit | +| epilogues.go:60:8:60:33 | defer-invoke call to log | epilogues.go:59:1:62:1 | Normal Exit | +| epilogues.go:60:14:60:20 | "count" | epilogues.go:60:14:60:20 | After "count" | +| epilogues.go:60:14:60:20 | After "count" | epilogues.go:60:23:60:32 | Before call to len | +| epilogues.go:60:14:60:20 | Before "count" | epilogues.go:60:14:60:20 | "count" | +| epilogues.go:60:23:60:25 | After len | epilogues.go:60:27:60:31 | Before items | +| epilogues.go:60:23:60:25 | Before len | epilogues.go:60:23:60:25 | len | +| epilogues.go:60:23:60:25 | len | epilogues.go:60:23:60:25 | After len | +| epilogues.go:60:23:60:32 | After call to len | epilogues.go:60:8:60:33 | After call to log | +| epilogues.go:60:23:60:32 | Before call to len | epilogues.go:60:23:60:25 | Before len | +| epilogues.go:60:23:60:32 | call to len | epilogues.go:60:23:60:32 | After call to len | +| epilogues.go:60:27:60:31 | After items | epilogues.go:60:23:60:32 | call to len | +| epilogues.go:60:27:60:31 | Before items | epilogues.go:60:27:60:31 | items | +| epilogues.go:60:27:60:31 | items | epilogues.go:60:27:60:31 | After items | +| epilogues.go:61:2:61:12 | After selection of Println | epilogues.go:61:14:61:25 | Before "processing" | +| epilogues.go:61:2:61:12 | Before selection of Println | epilogues.go:61:2:61:12 | selection of Println | +| epilogues.go:61:2:61:12 | selection of Println | epilogues.go:61:2:61:12 | After selection of Println | +| epilogues.go:61:2:61:38 | After call to Println | epilogues.go:61:2:61:38 | After expression statement | +| epilogues.go:61:2:61:38 | After expression statement | epilogues.go:59:54:62:1 | After block statement | +| epilogues.go:61:2:61:38 | Before call to Println | epilogues.go:61:2:61:12 | Before selection of Println | +| epilogues.go:61:2:61:38 | call to Println | epilogues.go:60:8:60:33 | defer-invoke call to log | +| epilogues.go:61:2:61:38 | call to Println | epilogues.go:61:2:61:38 | After call to Println | +| epilogues.go:61:2:61:38 | expression statement | epilogues.go:61:2:61:38 | Before call to Println | +| epilogues.go:61:14:61:25 | "processing" | epilogues.go:61:14:61:25 | After "processing" | +| epilogues.go:61:14:61:25 | After "processing" | epilogues.go:61:28:61:37 | Before call to len | +| epilogues.go:61:14:61:25 | Before "processing" | epilogues.go:61:14:61:25 | "processing" | +| epilogues.go:61:28:61:30 | After len | epilogues.go:61:32:61:36 | Before items | +| epilogues.go:61:28:61:30 | Before len | epilogues.go:61:28:61:30 | len | +| epilogues.go:61:28:61:30 | len | epilogues.go:61:28:61:30 | After len | +| epilogues.go:61:28:61:37 | After call to len | epilogues.go:61:2:61:38 | call to Println | +| epilogues.go:61:28:61:37 | Before call to len | epilogues.go:61:28:61:30 | Before len | +| epilogues.go:61:28:61:37 | call to len | epilogues.go:61:28:61:37 | After call to len | +| epilogues.go:61:32:61:36 | After items | epilogues.go:61:28:61:37 | call to len | +| epilogues.go:61:32:61:36 | Before items | epilogues.go:61:32:61:36 | items | +| epilogues.go:61:32:61:36 | items | epilogues.go:61:32:61:36 | After items | +| epilogues.go:66:1:71:1 | After function declaration | epilogues.go:77:1:82:1 | Before function declaration | +| epilogues.go:66:1:71:1 | Before function declaration | epilogues.go:66:1:71:1 | function declaration | +| epilogues.go:66:1:71:1 | Entry | epilogues.go:66:28:66:33 | prefix | +| epilogues.go:66:1:71:1 | Exceptional Exit | epilogues.go:66:1:71:1 | Exit | +| epilogues.go:66:1:71:1 | Normal Exit | epilogues.go:66:1:71:1 | Exit | +| epilogues.go:66:1:71:1 | function declaration | epilogues.go:66:1:71:1 | After function declaration | +| epilogues.go:66:28:66:33 | prefix | epilogues.go:66:43:71:1 | block statement | +| epilogues.go:66:43:71:1 | After block statement | epilogues.go:69:8:69:25 | defer-invoke call to log | +| epilogues.go:66:43:71:1 | block statement | epilogues.go:67:2:67:31 | ... := ... | +| epilogues.go:67:2:67:31 | ... := ... | epilogues.go:67:7:67:31 | Before struct literal | +| epilogues.go:67:2:67:31 | After ... := ... | epilogues.go:68:2:68:24 | Before defer statement | +| epilogues.go:67:2:67:31 | assign:0 ... := ... | epilogues.go:67:2:67:31 | After ... := ... | +| epilogues.go:67:7:67:31 | After struct literal | epilogues.go:67:2:67:31 | assign:0 ... := ... | +| epilogues.go:67:7:67:31 | Before struct literal | epilogues.go:67:7:67:31 | struct literal | +| epilogues.go:67:7:67:31 | struct literal | epilogues.go:67:17:67:30 | Before key-value pair | +| epilogues.go:67:17:67:30 | After key-value pair | epilogues.go:67:17:67:30 | lit-init key-value pair | +| epilogues.go:67:17:67:30 | Before key-value pair | epilogues.go:67:25:67:30 | Before prefix | +| epilogues.go:67:17:67:30 | key-value pair | epilogues.go:67:17:67:30 | After key-value pair | +| epilogues.go:67:17:67:30 | lit-init key-value pair | epilogues.go:67:7:67:31 | After struct literal | +| epilogues.go:67:25:67:30 | After prefix | epilogues.go:67:17:67:30 | key-value pair | +| epilogues.go:67:25:67:30 | Before prefix | epilogues.go:67:25:67:30 | prefix | +| epilogues.go:67:25:67:30 | prefix | epilogues.go:67:25:67:30 | After prefix | +| epilogues.go:68:2:68:24 | After defer statement | epilogues.go:69:2:69:25 | Before defer statement | +| epilogues.go:68:2:68:24 | Before defer statement | epilogues.go:68:8:68:24 | call to logValue | +| epilogues.go:68:2:68:24 | defer statement | epilogues.go:68:2:68:24 | After defer statement | +| epilogues.go:68:8:68:8 | After l | epilogues.go:68:8:68:17 | selection of logValue | +| epilogues.go:68:8:68:8 | Before l | epilogues.go:68:8:68:8 | l | +| epilogues.go:68:8:68:8 | l | epilogues.go:68:8:68:8 | After l | +| epilogues.go:68:8:68:17 | After selection of logValue | epilogues.go:68:19:68:23 | Before "bye" | +| epilogues.go:68:8:68:17 | Before selection of logValue | epilogues.go:68:8:68:8 | Before l | +| epilogues.go:68:8:68:17 | selection of logValue | epilogues.go:68:8:68:17 | After selection of logValue | +| epilogues.go:68:8:68:24 | After call to logValue | epilogues.go:68:2:68:24 | defer statement | +| epilogues.go:68:8:68:24 | call to logValue | epilogues.go:68:8:68:17 | Before selection of logValue | +| epilogues.go:68:8:68:24 | defer-invoke call to logValue | epilogues.go:66:1:71:1 | Exceptional Exit | +| epilogues.go:68:8:68:24 | defer-invoke call to logValue | epilogues.go:66:1:71:1 | Normal Exit | +| epilogues.go:68:19:68:23 | "bye" | epilogues.go:68:19:68:23 | After "bye" | +| epilogues.go:68:19:68:23 | After "bye" | epilogues.go:68:8:68:24 | After call to logValue | +| epilogues.go:68:19:68:23 | Before "bye" | epilogues.go:68:19:68:23 | "bye" | +| epilogues.go:69:2:69:25 | After defer statement | epilogues.go:70:2:70:20 | expression statement | +| epilogues.go:69:2:69:25 | Before defer statement | epilogues.go:69:8:69:25 | call to log | +| epilogues.go:69:2:69:25 | defer statement | epilogues.go:69:2:69:25 | After defer statement | +| epilogues.go:69:8:69:11 | (...) | epilogues.go:69:9:69:10 | Before &... | +| epilogues.go:69:8:69:11 | After (...) | epilogues.go:69:8:69:15 | selection of log | +| epilogues.go:69:8:69:15 | After selection of log | epilogues.go:69:17:69:21 | Before "ptr" | +| epilogues.go:69:8:69:15 | Before selection of log | epilogues.go:69:8:69:11 | (...) | +| epilogues.go:69:8:69:15 | selection of log | epilogues.go:69:8:69:15 | After selection of log | +| epilogues.go:69:8:69:25 | After call to log | epilogues.go:69:2:69:25 | defer statement | +| epilogues.go:69:8:69:25 | call to log | epilogues.go:69:8:69:15 | Before selection of log | +| epilogues.go:69:8:69:25 | defer-invoke call to log | epilogues.go:68:8:68:24 | defer-invoke call to logValue | +| epilogues.go:69:9:69:10 | &... | epilogues.go:69:9:69:10 | After &... | +| epilogues.go:69:9:69:10 | After &... | epilogues.go:69:8:69:11 | After (...) | +| epilogues.go:69:9:69:10 | Before &... | epilogues.go:69:10:69:10 | Before l | +| epilogues.go:69:10:69:10 | After l | epilogues.go:69:9:69:10 | &... | +| epilogues.go:69:10:69:10 | Before l | epilogues.go:69:10:69:10 | l | +| epilogues.go:69:10:69:10 | l | epilogues.go:69:10:69:10 | After l | +| epilogues.go:69:17:69:21 | "ptr" | epilogues.go:69:17:69:21 | After "ptr" | +| epilogues.go:69:17:69:21 | After "ptr" | epilogues.go:69:24:69:24 | Before 7 | +| epilogues.go:69:17:69:21 | Before "ptr" | epilogues.go:69:17:69:21 | "ptr" | +| epilogues.go:69:24:69:24 | 7 | epilogues.go:69:24:69:24 | After 7 | +| epilogues.go:69:24:69:24 | After 7 | epilogues.go:69:8:69:25 | After call to log | +| epilogues.go:69:24:69:24 | Before 7 | epilogues.go:69:24:69:24 | 7 | +| epilogues.go:70:2:70:12 | After selection of Println | epilogues.go:70:14:70:19 | Before "body" | +| epilogues.go:70:2:70:12 | Before selection of Println | epilogues.go:70:2:70:12 | selection of Println | +| epilogues.go:70:2:70:12 | selection of Println | epilogues.go:70:2:70:12 | After selection of Println | +| epilogues.go:70:2:70:20 | After call to Println | epilogues.go:70:2:70:20 | After expression statement | +| epilogues.go:70:2:70:20 | After expression statement | epilogues.go:66:43:71:1 | After block statement | +| epilogues.go:70:2:70:20 | Before call to Println | epilogues.go:70:2:70:12 | Before selection of Println | +| epilogues.go:70:2:70:20 | call to Println | epilogues.go:69:8:69:25 | defer-invoke call to log | +| epilogues.go:70:2:70:20 | call to Println | epilogues.go:70:2:70:20 | After call to Println | +| epilogues.go:70:2:70:20 | expression statement | epilogues.go:70:2:70:20 | Before call to Println | +| epilogues.go:70:14:70:19 | "body" | epilogues.go:70:14:70:19 | After "body" | +| epilogues.go:70:14:70:19 | After "body" | epilogues.go:70:2:70:20 | call to Println | +| epilogues.go:70:14:70:19 | Before "body" | epilogues.go:70:14:70:19 | "body" | +| epilogues.go:77:1:82:1 | After function declaration | epilogues.go:87:1:98:1 | Before function declaration | +| epilogues.go:77:1:82:1 | Before function declaration | epilogues.go:77:1:82:1 | function declaration | +| epilogues.go:77:1:82:1 | Entry | epilogues.go:77:22:77:22 | x | +| epilogues.go:77:1:82:1 | Exceptional Exit | epilogues.go:77:1:82:1 | Exit | +| epilogues.go:77:1:82:1 | Normal Exit | epilogues.go:77:1:82:1 | Exit | +| epilogues.go:77:1:82:1 | function declaration | epilogues.go:77:1:82:1 | After function declaration | +| epilogues.go:77:22:77:22 | x | epilogues.go:77:29:82:1 | block statement | +| epilogues.go:77:29:82:1 | After block statement | epilogues.go:78:8:80:15 | defer-invoke function call | +| epilogues.go:77:29:82:1 | block statement | epilogues.go:78:2:80:15 | Before defer statement | +| epilogues.go:78:2:80:15 | After defer statement | epilogues.go:81:2:81:23 | expression statement | +| epilogues.go:78:2:80:15 | Before defer statement | epilogues.go:78:8:80:15 | function call | +| epilogues.go:78:2:80:15 | defer statement | epilogues.go:78:2:80:15 | After defer statement | +| epilogues.go:78:8:80:2 | After function literal | epilogues.go:80:4:80:9 | Before "done" | +| epilogues.go:78:8:80:2 | Before function literal | epilogues.go:78:8:80:2 | function literal | +| epilogues.go:78:8:80:2 | Entry | epilogues.go:78:13:78:17 | label | +| epilogues.go:78:8:80:2 | Exceptional Exit | epilogues.go:78:8:80:2 | Exit | +| epilogues.go:78:8:80:2 | Normal Exit | epilogues.go:78:8:80:2 | Exit | +| epilogues.go:78:8:80:2 | function literal | epilogues.go:78:8:80:2 | After function literal | +| epilogues.go:78:8:80:15 | After function call | epilogues.go:78:2:80:15 | defer statement | +| epilogues.go:78:8:80:15 | defer-invoke function call | epilogues.go:77:1:82:1 | Exceptional Exit | +| epilogues.go:78:8:80:15 | defer-invoke function call | epilogues.go:77:1:82:1 | Normal Exit | +| epilogues.go:78:8:80:15 | function call | epilogues.go:78:8:80:2 | Before function literal | | epilogues.go:78:13:78:17 | label | epilogues.go:78:27:78:27 | n | -| epilogues.go:78:27:78:27 | n | epilogues.go:78:27:78:27 | n | -| epilogues.go:78:27:78:27 | n | epilogues.go:79:3:79:13 | selection of Println | -| epilogues.go:79:3:79:13 | selection of Println | epilogues.go:79:15:79:19 | label | -| epilogues.go:79:3:79:23 | call to Println | epilogues.go:78:8:80:2 | exit | -| epilogues.go:79:15:79:19 | label | epilogues.go:79:22:79:22 | n | -| epilogues.go:79:22:79:22 | n | epilogues.go:79:3:79:23 | call to Println | -| epilogues.go:80:4:80:9 | "done" | epilogues.go:80:12:80:12 | x | -| epilogues.go:80:12:80:12 | x | epilogues.go:80:14:80:14 | 1 | -| epilogues.go:80:12:80:14 | ...+... | epilogues.go:78:2:80:15 | defer statement | -| epilogues.go:80:14:80:14 | 1 | epilogues.go:80:12:80:14 | ...+... | -| epilogues.go:81:2:81:12 | selection of Println | epilogues.go:81:14:81:19 | "body" | -| epilogues.go:81:2:81:23 | call to Println | epilogues.go:78:8:80:15 | function call | -| epilogues.go:81:14:81:19 | "body" | epilogues.go:81:22:81:22 | x | -| epilogues.go:81:22:81:22 | x | epilogues.go:81:2:81:23 | call to Println | -| epilogues.go:87:1:98:1 | entry | epilogues.go:87:22:87:22 | x | -| epilogues.go:87:1:98:1 | function declaration | epilogues.go:102:6:102:24 | skip | -| epilogues.go:87:6:87:20 | skip | epilogues.go:87:1:98:1 | function declaration | -| epilogues.go:87:22:87:22 | x | epilogues.go:87:22:87:22 | x | -| epilogues.go:87:22:87:22 | x | epilogues.go:87:42:98:1 | result-zero-init:0 block statement | -| epilogues.go:87:42:98:1 | result-init:0 block statement | epilogues.go:88:8:92:2 | function literal | -| epilogues.go:87:42:98:1 | result-read:0 block statement | epilogues.go:87:1:98:1 | exit | +| epilogues.go:78:27:78:27 | n | epilogues.go:78:34:80:2 | block statement | +| epilogues.go:78:34:80:2 | After block statement | epilogues.go:78:8:80:2 | Normal Exit | +| epilogues.go:78:34:80:2 | block statement | epilogues.go:79:3:79:23 | expression statement | +| epilogues.go:79:3:79:13 | After selection of Println | epilogues.go:79:15:79:19 | Before label | +| epilogues.go:79:3:79:13 | Before selection of Println | epilogues.go:79:3:79:13 | selection of Println | +| epilogues.go:79:3:79:13 | selection of Println | epilogues.go:79:3:79:13 | After selection of Println | +| epilogues.go:79:3:79:23 | After call to Println | epilogues.go:79:3:79:23 | After expression statement | +| epilogues.go:79:3:79:23 | After expression statement | epilogues.go:78:34:80:2 | After block statement | +| epilogues.go:79:3:79:23 | Before call to Println | epilogues.go:79:3:79:13 | Before selection of Println | +| epilogues.go:79:3:79:23 | call to Println | epilogues.go:78:8:80:2 | Exceptional Exit | +| epilogues.go:79:3:79:23 | call to Println | epilogues.go:79:3:79:23 | After call to Println | +| epilogues.go:79:3:79:23 | expression statement | epilogues.go:79:3:79:23 | Before call to Println | +| epilogues.go:79:15:79:19 | After label | epilogues.go:79:22:79:22 | Before n | +| epilogues.go:79:15:79:19 | Before label | epilogues.go:79:15:79:19 | label | +| epilogues.go:79:15:79:19 | label | epilogues.go:79:15:79:19 | After label | +| epilogues.go:79:22:79:22 | After n | epilogues.go:79:3:79:23 | call to Println | +| epilogues.go:79:22:79:22 | Before n | epilogues.go:79:22:79:22 | n | +| epilogues.go:79:22:79:22 | n | epilogues.go:79:22:79:22 | After n | +| epilogues.go:80:4:80:9 | "done" | epilogues.go:80:4:80:9 | After "done" | +| epilogues.go:80:4:80:9 | After "done" | epilogues.go:80:12:80:14 | Before ...+... | +| epilogues.go:80:4:80:9 | Before "done" | epilogues.go:80:4:80:9 | "done" | +| epilogues.go:80:12:80:12 | After x | epilogues.go:80:14:80:14 | Before 1 | +| epilogues.go:80:12:80:12 | Before x | epilogues.go:80:12:80:12 | x | +| epilogues.go:80:12:80:12 | x | epilogues.go:80:12:80:12 | After x | +| epilogues.go:80:12:80:14 | ...+... | epilogues.go:80:12:80:14 | After ...+... | +| epilogues.go:80:12:80:14 | After ...+... | epilogues.go:78:8:80:15 | After function call | +| epilogues.go:80:12:80:14 | Before ...+... | epilogues.go:80:12:80:12 | Before x | +| epilogues.go:80:14:80:14 | 1 | epilogues.go:80:14:80:14 | After 1 | +| epilogues.go:80:14:80:14 | After 1 | epilogues.go:80:12:80:14 | ...+... | +| epilogues.go:80:14:80:14 | Before 1 | epilogues.go:80:14:80:14 | 1 | +| epilogues.go:81:2:81:12 | After selection of Println | epilogues.go:81:14:81:19 | Before "body" | +| epilogues.go:81:2:81:12 | Before selection of Println | epilogues.go:81:2:81:12 | selection of Println | +| epilogues.go:81:2:81:12 | selection of Println | epilogues.go:81:2:81:12 | After selection of Println | +| epilogues.go:81:2:81:23 | After call to Println | epilogues.go:81:2:81:23 | After expression statement | +| epilogues.go:81:2:81:23 | After expression statement | epilogues.go:77:29:82:1 | After block statement | +| epilogues.go:81:2:81:23 | Before call to Println | epilogues.go:81:2:81:12 | Before selection of Println | +| epilogues.go:81:2:81:23 | call to Println | epilogues.go:78:8:80:15 | defer-invoke function call | +| epilogues.go:81:2:81:23 | call to Println | epilogues.go:81:2:81:23 | After call to Println | +| epilogues.go:81:2:81:23 | expression statement | epilogues.go:81:2:81:23 | Before call to Println | +| epilogues.go:81:14:81:19 | "body" | epilogues.go:81:14:81:19 | After "body" | +| epilogues.go:81:14:81:19 | After "body" | epilogues.go:81:22:81:22 | Before x | +| epilogues.go:81:14:81:19 | Before "body" | epilogues.go:81:14:81:19 | "body" | +| epilogues.go:81:22:81:22 | After x | epilogues.go:81:2:81:23 | call to Println | +| epilogues.go:81:22:81:22 | Before x | epilogues.go:81:22:81:22 | x | +| epilogues.go:81:22:81:22 | x | epilogues.go:81:22:81:22 | After x | +| epilogues.go:87:1:98:1 | After function declaration | epilogues.go:102:1:110:1 | Before function declaration | +| epilogues.go:87:1:98:1 | Before function declaration | epilogues.go:87:1:98:1 | function declaration | +| epilogues.go:87:1:98:1 | Entry | epilogues.go:87:22:87:22 | x | +| epilogues.go:87:1:98:1 | Exceptional Exit | epilogues.go:87:1:98:1 | Exit | +| epilogues.go:87:1:98:1 | Normal Exit | epilogues.go:87:1:98:1 | Exit | +| epilogues.go:87:1:98:1 | function declaration | epilogues.go:87:1:98:1 | After function declaration | +| epilogues.go:87:22:87:22 | x | epilogues.go:87:42:98:1 | block statement | +| epilogues.go:87:42:98:1 | block statement | epilogues.go:87:42:98:1 | result-zero-init:0 block statement | +| epilogues.go:87:42:98:1 | result-init:0 block statement | epilogues.go:88:2:92:4 | Before defer statement | +| epilogues.go:87:42:98:1 | result-read:0 block statement | epilogues.go:87:1:98:1 | Normal Exit | | epilogues.go:87:42:98:1 | result-zero-init:0 block statement | epilogues.go:87:42:98:1 | result-init:0 block statement | -| epilogues.go:88:2:92:4 | defer statement | epilogues.go:93:5:93:5 | x | -| epilogues.go:88:8:92:2 | entry | epilogues.go:89:6:89:6 | skip | -| epilogues.go:88:8:92:2 | function literal | epilogues.go:88:2:92:4 | defer statement | -| epilogues.go:88:8:92:4 | function call | epilogues.go:87:1:98:1 | exit | -| epilogues.go:88:8:92:4 | function call | epilogues.go:87:42:98:1 | result-read:0 block statement | -| epilogues.go:89:6:89:6 | skip | epilogues.go:89:11:89:17 | recover | -| epilogues.go:89:6:89:19 | assign:0 ... := ... | epilogues.go:89:22:89:22 | r | -| epilogues.go:89:11:89:17 | recover | epilogues.go:89:11:89:19 | call to recover | -| epilogues.go:89:11:89:19 | call to recover | epilogues.go:89:6:89:19 | assign:0 ... := ... | -| epilogues.go:89:22:89:22 | r | epilogues.go:89:27:89:29 | nil | -| epilogues.go:89:22:89:29 | ...!=... | epilogues.go:88:8:92:2 | exit | -| epilogues.go:89:22:89:29 | ...!=... | epilogues.go:89:22:89:29 | ...!=... is false | -| epilogues.go:89:22:89:29 | ...!=... | epilogues.go:89:22:89:29 | ...!=... is true | -| epilogues.go:89:22:89:29 | ...!=... is false | epilogues.go:88:8:92:2 | exit | -| epilogues.go:89:22:89:29 | ...!=... is true | epilogues.go:90:4:90:9 | skip | -| epilogues.go:89:27:89:29 | nil | epilogues.go:89:22:89:29 | ...!=... | -| epilogues.go:90:4:90:9 | skip | epilogues.go:90:13:90:14 | -... | -| epilogues.go:90:4:90:14 | assign:0 ... = ... | epilogues.go:88:8:92:2 | exit | -| epilogues.go:90:13:90:14 | -... | epilogues.go:90:4:90:14 | assign:0 ... = ... | -| epilogues.go:93:5:93:5 | x | epilogues.go:93:9:93:9 | 0 | -| epilogues.go:93:5:93:9 | ...<... | epilogues.go:93:5:93:9 | ...<... is false | -| epilogues.go:93:5:93:9 | ...<... | epilogues.go:93:5:93:9 | ...<... is true | -| epilogues.go:93:5:93:9 | ...<... is false | epilogues.go:96:2:96:7 | skip | -| epilogues.go:93:5:93:9 | ...<... is true | epilogues.go:94:3:94:7 | panic | -| epilogues.go:93:9:93:9 | 0 | epilogues.go:93:5:93:9 | ...<... | -| epilogues.go:94:3:94:7 | panic | epilogues.go:94:9:94:13 | "neg" | -| epilogues.go:94:3:94:14 | call to panic | epilogues.go:88:8:92:4 | function call | -| epilogues.go:94:9:94:13 | "neg" | epilogues.go:94:3:94:14 | call to panic | -| epilogues.go:96:2:96:7 | skip | epilogues.go:96:11:96:11 | x | -| epilogues.go:96:2:96:15 | assign:0 ... = ... | epilogues.go:97:9:97:14 | result | -| epilogues.go:96:11:96:11 | x | epilogues.go:96:15:96:15 | x | -| epilogues.go:96:11:96:15 | ...*... | epilogues.go:96:2:96:15 | assign:0 ... = ... | -| epilogues.go:96:15:96:15 | x | epilogues.go:96:11:96:15 | ...*... | +| epilogues.go:88:2:92:4 | After defer statement | epilogues.go:93:2:95:2 | if statement | +| epilogues.go:88:2:92:4 | Before defer statement | epilogues.go:88:8:92:4 | function call | +| epilogues.go:88:2:92:4 | defer statement | epilogues.go:88:2:92:4 | After defer statement | +| epilogues.go:88:8:92:2 | After function literal | epilogues.go:88:8:92:4 | After function call | +| epilogues.go:88:8:92:2 | Before function literal | epilogues.go:88:8:92:2 | function literal | +| epilogues.go:88:8:92:2 | Entry | epilogues.go:88:15:92:2 | block statement | +| epilogues.go:88:8:92:2 | Normal Exit | epilogues.go:88:8:92:2 | Exit | +| epilogues.go:88:8:92:2 | function literal | epilogues.go:88:8:92:2 | After function literal | +| epilogues.go:88:8:92:4 | After function call | epilogues.go:88:2:92:4 | defer statement | +| epilogues.go:88:8:92:4 | defer-invoke function call | epilogues.go:87:1:98:1 | Exceptional Exit | +| epilogues.go:88:8:92:4 | defer-invoke function call | epilogues.go:87:42:98:1 | result-read:0 block statement | +| epilogues.go:88:8:92:4 | function call | epilogues.go:88:8:92:2 | Before function literal | +| epilogues.go:88:15:92:2 | After block statement | epilogues.go:88:8:92:2 | Normal Exit | +| epilogues.go:88:15:92:2 | block statement | epilogues.go:89:3:91:3 | if statement | +| epilogues.go:89:3:91:3 | After if statement | epilogues.go:88:15:92:2 | After block statement | +| epilogues.go:89:3:91:3 | if statement | epilogues.go:89:6:89:19 | ... := ... | +| epilogues.go:89:6:89:19 | ... := ... | epilogues.go:89:11:89:19 | Before call to recover | +| epilogues.go:89:6:89:19 | After ... := ... | epilogues.go:89:22:89:29 | Before ...!=... | +| epilogues.go:89:6:89:19 | assign:0 ... := ... | epilogues.go:89:6:89:19 | After ... := ... | +| epilogues.go:89:11:89:17 | After recover | epilogues.go:89:11:89:19 | call to recover | +| epilogues.go:89:11:89:17 | Before recover | epilogues.go:89:11:89:17 | recover | +| epilogues.go:89:11:89:17 | recover | epilogues.go:89:11:89:17 | After recover | +| epilogues.go:89:11:89:19 | After call to recover | epilogues.go:89:6:89:19 | assign:0 ... := ... | +| epilogues.go:89:11:89:19 | Before call to recover | epilogues.go:89:11:89:17 | Before recover | +| epilogues.go:89:11:89:19 | call to recover | epilogues.go:89:11:89:19 | After call to recover | +| epilogues.go:89:22:89:22 | After r | epilogues.go:89:27:89:29 | Before nil | +| epilogues.go:89:22:89:22 | Before r | epilogues.go:89:22:89:22 | r | +| epilogues.go:89:22:89:22 | r | epilogues.go:89:22:89:22 | After r | +| epilogues.go:89:22:89:29 | ...!=... | epilogues.go:89:22:89:29 | After ...!=... [false] | +| epilogues.go:89:22:89:29 | ...!=... | epilogues.go:89:22:89:29 | After ...!=... [true] | +| epilogues.go:89:22:89:29 | After ...!=... [false] | epilogues.go:89:3:91:3 | After if statement | +| epilogues.go:89:22:89:29 | After ...!=... [true] | epilogues.go:89:31:91:3 | block statement | +| epilogues.go:89:22:89:29 | Before ...!=... | epilogues.go:89:22:89:22 | Before r | +| epilogues.go:89:27:89:29 | After nil | epilogues.go:89:22:89:29 | ...!=... | +| epilogues.go:89:27:89:29 | Before nil | epilogues.go:89:27:89:29 | nil | +| epilogues.go:89:27:89:29 | nil | epilogues.go:89:27:89:29 | After nil | +| epilogues.go:89:31:91:3 | After block statement | epilogues.go:89:3:91:3 | After if statement | +| epilogues.go:89:31:91:3 | block statement | epilogues.go:90:4:90:14 | ... = ... | +| epilogues.go:90:4:90:14 | ... = ... | epilogues.go:90:13:90:14 | Before -... | +| epilogues.go:90:4:90:14 | After ... = ... | epilogues.go:89:31:91:3 | After block statement | +| epilogues.go:90:4:90:14 | assign:0 ... = ... | epilogues.go:90:4:90:14 | After ... = ... | +| epilogues.go:90:13:90:14 | -... | epilogues.go:90:13:90:14 | After -... | +| epilogues.go:90:13:90:14 | After -... | epilogues.go:90:4:90:14 | assign:0 ... = ... | +| epilogues.go:90:13:90:14 | Before -... | epilogues.go:90:14:90:14 | Before 1 | +| epilogues.go:90:14:90:14 | 1 | epilogues.go:90:14:90:14 | After 1 | +| epilogues.go:90:14:90:14 | After 1 | epilogues.go:90:13:90:14 | -... | +| epilogues.go:90:14:90:14 | Before 1 | epilogues.go:90:14:90:14 | 1 | +| epilogues.go:93:2:95:2 | After if statement | epilogues.go:96:2:96:15 | ... = ... | +| epilogues.go:93:2:95:2 | if statement | epilogues.go:93:5:93:9 | Before ...<... | +| epilogues.go:93:5:93:5 | After x | epilogues.go:93:9:93:9 | Before 0 | +| epilogues.go:93:5:93:5 | Before x | epilogues.go:93:5:93:5 | x | +| epilogues.go:93:5:93:5 | x | epilogues.go:93:5:93:5 | After x | +| epilogues.go:93:5:93:9 | ...<... | epilogues.go:93:5:93:9 | After ...<... [false] | +| epilogues.go:93:5:93:9 | ...<... | epilogues.go:93:5:93:9 | After ...<... [true] | +| epilogues.go:93:5:93:9 | After ...<... [false] | epilogues.go:93:2:95:2 | After if statement | +| epilogues.go:93:5:93:9 | After ...<... [true] | epilogues.go:93:11:95:2 | block statement | +| epilogues.go:93:5:93:9 | Before ...<... | epilogues.go:93:5:93:5 | Before x | +| epilogues.go:93:9:93:9 | 0 | epilogues.go:93:9:93:9 | After 0 | +| epilogues.go:93:9:93:9 | After 0 | epilogues.go:93:5:93:9 | ...<... | +| epilogues.go:93:9:93:9 | Before 0 | epilogues.go:93:9:93:9 | 0 | +| epilogues.go:93:11:95:2 | block statement | epilogues.go:94:3:94:14 | expression statement | +| epilogues.go:94:3:94:7 | After panic | epilogues.go:94:9:94:13 | Before "neg" | +| epilogues.go:94:3:94:7 | Before panic | epilogues.go:94:3:94:7 | panic | +| epilogues.go:94:3:94:7 | panic | epilogues.go:94:3:94:7 | After panic | +| epilogues.go:94:3:94:14 | Before call to panic | epilogues.go:94:3:94:7 | Before panic | +| epilogues.go:94:3:94:14 | call to panic | epilogues.go:88:8:92:4 | defer-invoke function call | +| epilogues.go:94:3:94:14 | expression statement | epilogues.go:94:3:94:14 | Before call to panic | +| epilogues.go:94:9:94:13 | "neg" | epilogues.go:94:9:94:13 | After "neg" | +| epilogues.go:94:9:94:13 | After "neg" | epilogues.go:94:3:94:14 | call to panic | +| epilogues.go:94:9:94:13 | Before "neg" | epilogues.go:94:9:94:13 | "neg" | +| epilogues.go:96:2:96:15 | ... = ... | epilogues.go:96:11:96:15 | Before ...*... | +| epilogues.go:96:2:96:15 | After ... = ... | epilogues.go:97:2:97:14 | Before return statement | +| epilogues.go:96:2:96:15 | assign:0 ... = ... | epilogues.go:96:2:96:15 | After ... = ... | +| epilogues.go:96:11:96:11 | After x | epilogues.go:96:15:96:15 | Before x | +| epilogues.go:96:11:96:11 | Before x | epilogues.go:96:11:96:11 | x | +| epilogues.go:96:11:96:11 | x | epilogues.go:96:11:96:11 | After x | +| epilogues.go:96:11:96:15 | ...*... | epilogues.go:96:11:96:15 | After ...*... | +| epilogues.go:96:11:96:15 | After ...*... | epilogues.go:96:2:96:15 | assign:0 ... = ... | +| epilogues.go:96:11:96:15 | Before ...*... | epilogues.go:96:11:96:11 | Before x | +| epilogues.go:96:15:96:15 | After x | epilogues.go:96:11:96:15 | ...*... | +| epilogues.go:96:15:96:15 | Before x | epilogues.go:96:15:96:15 | x | +| epilogues.go:96:15:96:15 | x | epilogues.go:96:15:96:15 | After x | +| epilogues.go:97:2:97:14 | Before return statement | epilogues.go:97:9:97:14 | Before result | | epilogues.go:97:2:97:14 | result-write:0 return statement | epilogues.go:97:2:97:14 | return statement | -| epilogues.go:97:2:97:14 | return statement | epilogues.go:88:8:92:4 | function call | -| epilogues.go:97:9:97:14 | result | epilogues.go:97:2:97:14 | result-write:0 return statement | -| epilogues.go:102:1:110:1 | entry | epilogues.go:102:26:102:26 | x | -| epilogues.go:102:1:110:1 | function declaration | epilogues.go:115:6:115:22 | skip | -| epilogues.go:102:6:102:24 | skip | epilogues.go:102:1:110:1 | function declaration | -| epilogues.go:102:26:102:26 | x | epilogues.go:102:26:102:26 | x | -| epilogues.go:102:26:102:26 | x | epilogues.go:102:50:110:1 | result-zero-init:0 block statement | +| epilogues.go:97:2:97:14 | return statement | epilogues.go:88:8:92:4 | defer-invoke function call | +| epilogues.go:97:9:97:14 | After result | epilogues.go:97:2:97:14 | result-write:0 return statement | +| epilogues.go:97:9:97:14 | Before result | epilogues.go:97:9:97:14 | result | +| epilogues.go:97:9:97:14 | result | epilogues.go:97:9:97:14 | After result | +| epilogues.go:102:1:110:1 | After function declaration | epilogues.go:115:1:118:1 | Before function declaration | +| epilogues.go:102:1:110:1 | Before function declaration | epilogues.go:102:1:110:1 | function declaration | +| epilogues.go:102:1:110:1 | Entry | epilogues.go:102:26:102:26 | x | +| epilogues.go:102:1:110:1 | Exceptional Exit | epilogues.go:102:1:110:1 | Exit | +| epilogues.go:102:1:110:1 | Normal Exit | epilogues.go:102:1:110:1 | Exit | +| epilogues.go:102:1:110:1 | function declaration | epilogues.go:102:1:110:1 | After function declaration | +| epilogues.go:102:26:102:26 | x | epilogues.go:102:50:110:1 | block statement | +| epilogues.go:102:50:110:1 | block statement | epilogues.go:102:50:110:1 | result-zero-init:0 block statement | | epilogues.go:102:50:110:1 | result-init:0 block statement | epilogues.go:102:50:110:1 | result-zero-init:1 block statement | -| epilogues.go:102:50:110:1 | result-init:1 block statement | epilogues.go:103:8:103:17 | epiRecover | +| epilogues.go:102:50:110:1 | result-init:1 block statement | epilogues.go:103:2:103:19 | Before defer statement | | epilogues.go:102:50:110:1 | result-read:0 block statement | epilogues.go:102:50:110:1 | result-read:1 block statement | -| epilogues.go:102:50:110:1 | result-read:1 block statement | epilogues.go:102:1:110:1 | exit | +| epilogues.go:102:50:110:1 | result-read:1 block statement | epilogues.go:102:1:110:1 | Normal Exit | | epilogues.go:102:50:110:1 | result-zero-init:0 block statement | epilogues.go:102:50:110:1 | result-init:0 block statement | | epilogues.go:102:50:110:1 | result-zero-init:1 block statement | epilogues.go:102:50:110:1 | result-init:1 block statement | -| epilogues.go:103:2:103:19 | defer statement | epilogues.go:104:5:104:5 | x | -| epilogues.go:103:8:103:17 | epiRecover | epilogues.go:103:2:103:19 | defer statement | -| epilogues.go:103:8:103:19 | call to epiRecover | epilogues.go:102:1:110:1 | exit | -| epilogues.go:103:8:103:19 | call to epiRecover | epilogues.go:102:50:110:1 | result-read:0 block statement | -| epilogues.go:104:5:104:5 | x | epilogues.go:104:10:104:10 | 0 | -| epilogues.go:104:5:104:10 | ...==... | epilogues.go:104:5:104:10 | ...==... is false | -| epilogues.go:104:5:104:10 | ...==... | epilogues.go:104:5:104:10 | ...==... is true | -| epilogues.go:104:5:104:10 | ...==... is false | epilogues.go:107:2:107:2 | skip | -| epilogues.go:104:5:104:10 | ...==... is true | epilogues.go:105:3:105:8 | return statement | -| epilogues.go:104:10:104:10 | 0 | epilogues.go:104:5:104:10 | ...==... | -| epilogues.go:105:3:105:8 | return statement | epilogues.go:103:8:103:19 | call to epiRecover | -| epilogues.go:107:2:107:2 | skip | epilogues.go:107:6:107:6 | x | -| epilogues.go:107:2:107:6 | assign:0 ... = ... | epilogues.go:108:2:108:3 | skip | -| epilogues.go:107:6:107:6 | x | epilogues.go:107:2:107:6 | assign:0 ... = ... | -| epilogues.go:108:2:108:3 | skip | epilogues.go:108:7:108:10 | true | -| epilogues.go:108:2:108:10 | assign:0 ... = ... | epilogues.go:109:2:109:7 | return statement | -| epilogues.go:108:7:108:10 | true | epilogues.go:108:2:108:10 | assign:0 ... = ... | -| epilogues.go:109:2:109:7 | return statement | epilogues.go:103:8:103:19 | call to epiRecover | -| epilogues.go:115:1:118:1 | entry | epilogues.go:116:8:116:17 | epiRecover | -| epilogues.go:115:1:118:1 | function declaration | epilogues.go:0:0:0:0 | exit | -| epilogues.go:115:6:115:22 | skip | epilogues.go:115:1:118:1 | function declaration | -| epilogues.go:116:2:116:19 | defer statement | epilogues.go:117:2:117:6 | panic | -| epilogues.go:116:8:116:17 | epiRecover | epilogues.go:116:2:116:19 | defer statement | -| epilogues.go:116:8:116:19 | call to epiRecover | epilogues.go:115:1:118:1 | exit | -| epilogues.go:117:2:117:6 | panic | epilogues.go:117:8:117:13 | "boom" | -| epilogues.go:117:2:117:14 | call to panic | epilogues.go:116:8:116:19 | call to epiRecover | -| epilogues.go:117:8:117:13 | "boom" | epilogues.go:117:2:117:14 | call to panic | -| equalitytests.go:0:0:0:0 | entry | equalitytests.go:3:1:5:1 | skip | -| equalitytests.go:3:1:5:1 | skip | equalitytests.go:7:1:9:1 | skip | -| equalitytests.go:7:1:9:1 | skip | equalitytests.go:11:6:11:18 | skip | -| equalitytests.go:11:1:13:1 | entry | equalitytests.go:11:20:11:21 | i1 | -| equalitytests.go:11:1:13:1 | function declaration | equalitytests.go:0:0:0:0 | exit | -| equalitytests.go:11:6:11:18 | skip | equalitytests.go:11:1:13:1 | function declaration | -| equalitytests.go:11:20:11:21 | i1 | equalitytests.go:11:20:11:21 | i1 | +| epilogues.go:103:2:103:19 | After defer statement | epilogues.go:104:2:106:2 | if statement | +| epilogues.go:103:2:103:19 | Before defer statement | epilogues.go:103:8:103:19 | call to epiRecover | +| epilogues.go:103:2:103:19 | defer statement | epilogues.go:103:2:103:19 | After defer statement | +| epilogues.go:103:8:103:17 | After epiRecover | epilogues.go:103:8:103:19 | After call to epiRecover | +| epilogues.go:103:8:103:17 | Before epiRecover | epilogues.go:103:8:103:17 | epiRecover | +| epilogues.go:103:8:103:17 | epiRecover | epilogues.go:103:8:103:17 | After epiRecover | +| epilogues.go:103:8:103:19 | After call to epiRecover | epilogues.go:103:2:103:19 | defer statement | +| epilogues.go:103:8:103:19 | call to epiRecover | epilogues.go:103:8:103:17 | Before epiRecover | +| epilogues.go:103:8:103:19 | defer-invoke call to epiRecover | epilogues.go:102:1:110:1 | Exceptional Exit | +| epilogues.go:103:8:103:19 | defer-invoke call to epiRecover | epilogues.go:102:50:110:1 | result-read:0 block statement | +| epilogues.go:104:2:106:2 | After if statement | epilogues.go:107:2:107:6 | ... = ... | +| epilogues.go:104:2:106:2 | if statement | epilogues.go:104:5:104:10 | Before ...==... | +| epilogues.go:104:5:104:5 | After x | epilogues.go:104:10:104:10 | Before 0 | +| epilogues.go:104:5:104:5 | Before x | epilogues.go:104:5:104:5 | x | +| epilogues.go:104:5:104:5 | x | epilogues.go:104:5:104:5 | After x | +| epilogues.go:104:5:104:10 | ...==... | epilogues.go:104:5:104:10 | After ...==... [false] | +| epilogues.go:104:5:104:10 | ...==... | epilogues.go:104:5:104:10 | After ...==... [true] | +| epilogues.go:104:5:104:10 | After ...==... [false] | epilogues.go:104:2:106:2 | After if statement | +| epilogues.go:104:5:104:10 | After ...==... [true] | epilogues.go:104:12:106:2 | block statement | +| epilogues.go:104:5:104:10 | Before ...==... | epilogues.go:104:5:104:5 | Before x | +| epilogues.go:104:10:104:10 | 0 | epilogues.go:104:10:104:10 | After 0 | +| epilogues.go:104:10:104:10 | After 0 | epilogues.go:104:5:104:10 | ...==... | +| epilogues.go:104:10:104:10 | Before 0 | epilogues.go:104:10:104:10 | 0 | +| epilogues.go:104:12:106:2 | block statement | epilogues.go:105:3:105:8 | Before return statement | +| epilogues.go:105:3:105:8 | Before return statement | epilogues.go:105:3:105:8 | return statement | +| epilogues.go:105:3:105:8 | return statement | epilogues.go:103:8:103:19 | defer-invoke call to epiRecover | +| epilogues.go:107:2:107:6 | ... = ... | epilogues.go:107:6:107:6 | Before x | +| epilogues.go:107:2:107:6 | After ... = ... | epilogues.go:108:2:108:10 | ... = ... | +| epilogues.go:107:2:107:6 | assign:0 ... = ... | epilogues.go:107:2:107:6 | After ... = ... | +| epilogues.go:107:6:107:6 | After x | epilogues.go:107:2:107:6 | assign:0 ... = ... | +| epilogues.go:107:6:107:6 | Before x | epilogues.go:107:6:107:6 | x | +| epilogues.go:107:6:107:6 | x | epilogues.go:107:6:107:6 | After x | +| epilogues.go:108:2:108:10 | ... = ... | epilogues.go:108:7:108:10 | Before true | +| epilogues.go:108:2:108:10 | After ... = ... | epilogues.go:109:2:109:7 | Before return statement | +| epilogues.go:108:2:108:10 | assign:0 ... = ... | epilogues.go:108:2:108:10 | After ... = ... | +| epilogues.go:108:7:108:10 | After true | epilogues.go:108:2:108:10 | assign:0 ... = ... | +| epilogues.go:108:7:108:10 | Before true | epilogues.go:108:7:108:10 | true | +| epilogues.go:108:7:108:10 | true | epilogues.go:108:7:108:10 | After true | +| epilogues.go:109:2:109:7 | Before return statement | epilogues.go:109:2:109:7 | return statement | +| epilogues.go:109:2:109:7 | return statement | epilogues.go:103:8:103:19 | defer-invoke call to epiRecover | +| epilogues.go:115:1:118:1 | After function declaration | epilogues.go:0:0:0:0 | After epilogues.go | +| epilogues.go:115:1:118:1 | Before function declaration | epilogues.go:115:1:118:1 | function declaration | +| epilogues.go:115:1:118:1 | Entry | epilogues.go:115:26:118:1 | block statement | +| epilogues.go:115:1:118:1 | Exceptional Exit | epilogues.go:115:1:118:1 | Exit | +| epilogues.go:115:1:118:1 | Normal Exit | epilogues.go:115:1:118:1 | Exit | +| epilogues.go:115:1:118:1 | function declaration | epilogues.go:115:1:118:1 | After function declaration | +| epilogues.go:115:26:118:1 | block statement | epilogues.go:116:2:116:19 | Before defer statement | +| epilogues.go:116:2:116:19 | After defer statement | epilogues.go:117:2:117:14 | expression statement | +| epilogues.go:116:2:116:19 | Before defer statement | epilogues.go:116:8:116:19 | call to epiRecover | +| epilogues.go:116:2:116:19 | defer statement | epilogues.go:116:2:116:19 | After defer statement | +| epilogues.go:116:8:116:17 | After epiRecover | epilogues.go:116:8:116:19 | After call to epiRecover | +| epilogues.go:116:8:116:17 | Before epiRecover | epilogues.go:116:8:116:17 | epiRecover | +| epilogues.go:116:8:116:17 | epiRecover | epilogues.go:116:8:116:17 | After epiRecover | +| epilogues.go:116:8:116:19 | After call to epiRecover | epilogues.go:116:2:116:19 | defer statement | +| epilogues.go:116:8:116:19 | call to epiRecover | epilogues.go:116:8:116:17 | Before epiRecover | +| epilogues.go:116:8:116:19 | defer-invoke call to epiRecover | epilogues.go:115:1:118:1 | Exceptional Exit | +| epilogues.go:116:8:116:19 | defer-invoke call to epiRecover | epilogues.go:115:1:118:1 | Normal Exit | +| epilogues.go:117:2:117:6 | After panic | epilogues.go:117:8:117:13 | Before "boom" | +| epilogues.go:117:2:117:6 | Before panic | epilogues.go:117:2:117:6 | panic | +| epilogues.go:117:2:117:6 | panic | epilogues.go:117:2:117:6 | After panic | +| epilogues.go:117:2:117:14 | Before call to panic | epilogues.go:117:2:117:6 | Before panic | +| epilogues.go:117:2:117:14 | call to panic | epilogues.go:116:8:116:19 | defer-invoke call to epiRecover | +| epilogues.go:117:2:117:14 | expression statement | epilogues.go:117:2:117:14 | Before call to panic | +| epilogues.go:117:8:117:13 | "boom" | epilogues.go:117:8:117:13 | After "boom" | +| epilogues.go:117:8:117:13 | After "boom" | epilogues.go:117:2:117:14 | call to panic | +| epilogues.go:117:8:117:13 | Before "boom" | epilogues.go:117:8:117:13 | "boom" | +| equalitytests.go:0:0:0:0 | After equalitytests.go | equalitytests.go:0:0:0:0 | Normal Exit | +| equalitytests.go:0:0:0:0 | Entry | equalitytests.go:0:0:0:0 | equalitytests.go | +| equalitytests.go:0:0:0:0 | Normal Exit | equalitytests.go:0:0:0:0 | Exit | +| equalitytests.go:0:0:0:0 | equalitytests.go | equalitytests.go:3:1:5:1 | type declaration | +| equalitytests.go:3:1:5:1 | After type declaration | equalitytests.go:7:1:9:1 | type declaration | +| equalitytests.go:3:1:5:1 | type declaration | equalitytests.go:3:6:5:1 | type declaration specifier | +| equalitytests.go:3:6:5:1 | type declaration specifier | equalitytests.go:3:1:5:1 | After type declaration | +| equalitytests.go:7:1:9:1 | After type declaration | equalitytests.go:11:1:13:1 | Before function declaration | +| equalitytests.go:7:1:9:1 | type declaration | equalitytests.go:7:6:9:1 | type declaration specifier | +| equalitytests.go:7:6:9:1 | type declaration specifier | equalitytests.go:7:1:9:1 | After type declaration | +| equalitytests.go:11:1:13:1 | After function declaration | equalitytests.go:0:0:0:0 | After equalitytests.go | +| equalitytests.go:11:1:13:1 | Before function declaration | equalitytests.go:11:1:13:1 | function declaration | +| equalitytests.go:11:1:13:1 | Entry | equalitytests.go:11:20:11:21 | i1 | +| equalitytests.go:11:1:13:1 | Normal Exit | equalitytests.go:11:1:13:1 | Exit | +| equalitytests.go:11:1:13:1 | function declaration | equalitytests.go:11:1:13:1 | After function declaration | | equalitytests.go:11:20:11:21 | i1 | equalitytests.go:11:28:11:29 | i2 | -| equalitytests.go:11:28:11:29 | i2 | equalitytests.go:11:28:11:29 | i2 | | equalitytests.go:11:28:11:29 | i2 | equalitytests.go:11:36:11:37 | e1 | -| equalitytests.go:11:36:11:37 | e1 | equalitytests.go:11:36:11:37 | e1 | | equalitytests.go:11:36:11:37 | e1 | equalitytests.go:11:46:11:47 | e2 | -| equalitytests.go:11:46:11:47 | e2 | equalitytests.go:11:46:11:47 | e2 | | equalitytests.go:11:46:11:47 | e2 | equalitytests.go:11:56:11:57 | s1 | -| equalitytests.go:11:56:11:57 | s1 | equalitytests.go:11:56:11:57 | s1 | | equalitytests.go:11:56:11:57 | s1 | equalitytests.go:11:83:11:84 | s2 | -| equalitytests.go:11:83:11:84 | s2 | equalitytests.go:11:83:11:84 | s2 | | equalitytests.go:11:83:11:84 | s2 | equalitytests.go:11:110:11:111 | s3 | -| equalitytests.go:11:110:11:111 | s3 | equalitytests.go:11:110:11:111 | s3 | | equalitytests.go:11:110:11:111 | s3 | equalitytests.go:11:134:11:135 | s4 | -| equalitytests.go:11:134:11:135 | s4 | equalitytests.go:11:134:11:135 | s4 | | equalitytests.go:11:134:11:135 | s4 | equalitytests.go:11:158:11:159 | a1 | -| equalitytests.go:11:158:11:159 | a1 | equalitytests.go:11:158:11:159 | a1 | | equalitytests.go:11:158:11:159 | a1 | equalitytests.go:11:171:11:172 | a2 | -| equalitytests.go:11:171:11:172 | a2 | equalitytests.go:11:171:11:172 | a2 | | equalitytests.go:11:171:11:172 | a2 | equalitytests.go:11:184:11:185 | a3 | -| equalitytests.go:11:184:11:185 | a3 | equalitytests.go:11:184:11:185 | a3 | | equalitytests.go:11:184:11:185 | a3 | equalitytests.go:11:195:11:196 | a4 | -| equalitytests.go:11:195:11:196 | a4 | equalitytests.go:11:195:11:196 | a4 | -| equalitytests.go:11:195:11:196 | a4 | equalitytests.go:12:9:12:10 | i1 | -| equalitytests.go:12:2:12:76 | return statement | equalitytests.go:11:1:13:1 | exit | -| equalitytests.go:12:9:12:10 | i1 | equalitytests.go:12:15:12:16 | i2 | -| equalitytests.go:12:9:12:16 | ...==... | equalitytests.go:12:9:12:16 | ...==... is false | -| equalitytests.go:12:9:12:16 | ...==... | equalitytests.go:12:9:12:16 | ...==... is true | -| equalitytests.go:12:9:12:16 | ...==... is false | equalitytests.go:12:9:12:28 | ...&&... is false | -| equalitytests.go:12:9:12:16 | ...==... is true | equalitytests.go:12:21:12:22 | e1 | -| equalitytests.go:12:9:12:28 | ...&&... is false | equalitytests.go:12:9:12:40 | ...&&... is false | -| equalitytests.go:12:9:12:28 | ...&&... is true | equalitytests.go:12:33:12:34 | s1 | -| equalitytests.go:12:9:12:40 | ...&&... is false | equalitytests.go:12:9:12:52 | ...&&... is false | -| equalitytests.go:12:9:12:40 | ...&&... is true | equalitytests.go:12:45:12:46 | s3 | -| equalitytests.go:12:9:12:52 | ...&&... is false | equalitytests.go:12:9:12:64 | ...&&... is false | -| equalitytests.go:12:9:12:52 | ...&&... is true | equalitytests.go:12:57:12:58 | a1 | -| equalitytests.go:12:9:12:64 | ...&&... is false | equalitytests.go:12:9:12:76 | ...&&... | -| equalitytests.go:12:9:12:64 | ...&&... is true | equalitytests.go:12:69:12:70 | a3 | -| equalitytests.go:12:9:12:76 | ...&&... | equalitytests.go:12:2:12:76 | return statement | -| equalitytests.go:12:15:12:16 | i2 | equalitytests.go:12:9:12:16 | ...==... | -| equalitytests.go:12:21:12:22 | e1 | equalitytests.go:12:27:12:28 | e2 | -| equalitytests.go:12:21:12:28 | ...==... | equalitytests.go:11:1:13:1 | exit | -| equalitytests.go:12:21:12:28 | ...==... | equalitytests.go:12:9:12:28 | ...&&... is false | -| equalitytests.go:12:21:12:28 | ...==... | equalitytests.go:12:9:12:28 | ...&&... is true | -| equalitytests.go:12:27:12:28 | e2 | equalitytests.go:12:21:12:28 | ...==... | -| equalitytests.go:12:33:12:34 | s1 | equalitytests.go:12:39:12:40 | s2 | -| equalitytests.go:12:33:12:40 | ...==... | equalitytests.go:11:1:13:1 | exit | -| equalitytests.go:12:33:12:40 | ...==... | equalitytests.go:12:9:12:40 | ...&&... is false | -| equalitytests.go:12:33:12:40 | ...==... | equalitytests.go:12:9:12:40 | ...&&... is true | -| equalitytests.go:12:39:12:40 | s2 | equalitytests.go:12:33:12:40 | ...==... | -| equalitytests.go:12:45:12:46 | s3 | equalitytests.go:12:51:12:52 | s4 | -| equalitytests.go:12:45:12:52 | ...==... | equalitytests.go:11:1:13:1 | exit | -| equalitytests.go:12:45:12:52 | ...==... | equalitytests.go:12:9:12:52 | ...&&... is false | -| equalitytests.go:12:45:12:52 | ...==... | equalitytests.go:12:9:12:52 | ...&&... is true | -| equalitytests.go:12:51:12:52 | s4 | equalitytests.go:12:45:12:52 | ...==... | -| equalitytests.go:12:57:12:58 | a1 | equalitytests.go:12:63:12:64 | a2 | -| equalitytests.go:12:57:12:64 | ...==... | equalitytests.go:11:1:13:1 | exit | -| equalitytests.go:12:57:12:64 | ...==... | equalitytests.go:12:9:12:64 | ...&&... is false | -| equalitytests.go:12:57:12:64 | ...==... | equalitytests.go:12:9:12:64 | ...&&... is true | -| equalitytests.go:12:63:12:64 | a2 | equalitytests.go:12:57:12:64 | ...==... | -| equalitytests.go:12:69:12:70 | a3 | equalitytests.go:12:75:12:76 | a4 | -| equalitytests.go:12:69:12:76 | ...==... | equalitytests.go:11:1:13:1 | exit | -| equalitytests.go:12:69:12:76 | ...==... | equalitytests.go:12:9:12:76 | ...&&... | -| equalitytests.go:12:75:12:76 | a4 | equalitytests.go:12:69:12:76 | ...==... | -| exprs.go:0:0:0:0 | entry | exprs.go:3:1:3:29 | skip | -| exprs.go:3:1:3:29 | skip | exprs.go:5:6:5:9 | skip | -| exprs.go:5:1:26:1 | entry | exprs.go:6:6:6:6 | skip | -| exprs.go:5:1:26:1 | function declaration | exprs.go:28:6:28:10 | skip | -| exprs.go:5:6:5:9 | skip | exprs.go:5:1:26:1 | function declaration | -| exprs.go:6:6:6:6 | skip | exprs.go:6:9:6:9 | skip | +| equalitytests.go:11:195:11:196 | a4 | equalitytests.go:11:211:13:1 | block statement | +| equalitytests.go:11:211:13:1 | block statement | equalitytests.go:12:2:12:76 | Before return statement | +| equalitytests.go:12:2:12:76 | Before return statement | equalitytests.go:12:9:12:76 | ...&&... | +| equalitytests.go:12:2:12:76 | return statement | equalitytests.go:11:1:13:1 | Normal Exit | +| equalitytests.go:12:9:12:10 | After i1 | equalitytests.go:12:15:12:16 | Before i2 | +| equalitytests.go:12:9:12:10 | Before i1 | equalitytests.go:12:9:12:10 | i1 | +| equalitytests.go:12:9:12:10 | i1 | equalitytests.go:12:9:12:10 | After i1 | +| equalitytests.go:12:9:12:16 | ...==... | equalitytests.go:12:9:12:16 | After ...==... [false] | +| equalitytests.go:12:9:12:16 | ...==... | equalitytests.go:12:9:12:16 | After ...==... [true] | +| equalitytests.go:12:9:12:16 | After ...==... [false] | equalitytests.go:12:9:12:28 | After ...&&... [false] | +| equalitytests.go:12:9:12:16 | After ...==... [true] | equalitytests.go:12:21:12:28 | Before ...==... | +| equalitytests.go:12:9:12:16 | Before ...==... | equalitytests.go:12:9:12:10 | Before i1 | +| equalitytests.go:12:9:12:28 | ...&&... | equalitytests.go:12:9:12:16 | Before ...==... | +| equalitytests.go:12:9:12:28 | After ...&&... [false] | equalitytests.go:12:9:12:40 | After ...&&... [false] | +| equalitytests.go:12:9:12:28 | After ...&&... [true] | equalitytests.go:12:33:12:40 | Before ...==... | +| equalitytests.go:12:9:12:40 | ...&&... | equalitytests.go:12:9:12:28 | ...&&... | +| equalitytests.go:12:9:12:40 | After ...&&... [false] | equalitytests.go:12:9:12:52 | After ...&&... [false] | +| equalitytests.go:12:9:12:40 | After ...&&... [true] | equalitytests.go:12:45:12:52 | Before ...==... | +| equalitytests.go:12:9:12:52 | ...&&... | equalitytests.go:12:9:12:40 | ...&&... | +| equalitytests.go:12:9:12:52 | After ...&&... [false] | equalitytests.go:12:9:12:64 | After ...&&... [false] | +| equalitytests.go:12:9:12:52 | After ...&&... [true] | equalitytests.go:12:57:12:64 | Before ...==... | +| equalitytests.go:12:9:12:64 | ...&&... | equalitytests.go:12:9:12:52 | ...&&... | +| equalitytests.go:12:9:12:64 | After ...&&... [false] | equalitytests.go:12:9:12:76 | After ...&&... | +| equalitytests.go:12:9:12:64 | After ...&&... [true] | equalitytests.go:12:69:12:76 | Before ...==... | +| equalitytests.go:12:9:12:76 | ...&&... | equalitytests.go:12:9:12:64 | ...&&... | +| equalitytests.go:12:9:12:76 | After ...&&... | equalitytests.go:12:2:12:76 | return statement | +| equalitytests.go:12:15:12:16 | After i2 | equalitytests.go:12:9:12:16 | ...==... | +| equalitytests.go:12:15:12:16 | Before i2 | equalitytests.go:12:15:12:16 | i2 | +| equalitytests.go:12:15:12:16 | i2 | equalitytests.go:12:15:12:16 | After i2 | +| equalitytests.go:12:21:12:22 | After e1 | equalitytests.go:12:27:12:28 | Before e2 | +| equalitytests.go:12:21:12:22 | Before e1 | equalitytests.go:12:21:12:22 | e1 | +| equalitytests.go:12:21:12:22 | e1 | equalitytests.go:12:21:12:22 | After e1 | +| equalitytests.go:12:21:12:28 | ...==... | equalitytests.go:12:21:12:28 | After ...==... [false] | +| equalitytests.go:12:21:12:28 | ...==... | equalitytests.go:12:21:12:28 | After ...==... [true] | +| equalitytests.go:12:21:12:28 | After ...==... [false] | equalitytests.go:12:9:12:28 | After ...&&... [false] | +| equalitytests.go:12:21:12:28 | After ...==... [true] | equalitytests.go:12:9:12:28 | After ...&&... [true] | +| equalitytests.go:12:21:12:28 | Before ...==... | equalitytests.go:12:21:12:22 | Before e1 | +| equalitytests.go:12:27:12:28 | After e2 | equalitytests.go:12:21:12:28 | ...==... | +| equalitytests.go:12:27:12:28 | Before e2 | equalitytests.go:12:27:12:28 | e2 | +| equalitytests.go:12:27:12:28 | e2 | equalitytests.go:12:27:12:28 | After e2 | +| equalitytests.go:12:33:12:34 | After s1 | equalitytests.go:12:39:12:40 | Before s2 | +| equalitytests.go:12:33:12:34 | Before s1 | equalitytests.go:12:33:12:34 | s1 | +| equalitytests.go:12:33:12:34 | s1 | equalitytests.go:12:33:12:34 | After s1 | +| equalitytests.go:12:33:12:40 | ...==... | equalitytests.go:12:33:12:40 | After ...==... [false] | +| equalitytests.go:12:33:12:40 | ...==... | equalitytests.go:12:33:12:40 | After ...==... [true] | +| equalitytests.go:12:33:12:40 | After ...==... [false] | equalitytests.go:12:9:12:40 | After ...&&... [false] | +| equalitytests.go:12:33:12:40 | After ...==... [true] | equalitytests.go:12:9:12:40 | After ...&&... [true] | +| equalitytests.go:12:33:12:40 | Before ...==... | equalitytests.go:12:33:12:34 | Before s1 | +| equalitytests.go:12:39:12:40 | After s2 | equalitytests.go:12:33:12:40 | ...==... | +| equalitytests.go:12:39:12:40 | Before s2 | equalitytests.go:12:39:12:40 | s2 | +| equalitytests.go:12:39:12:40 | s2 | equalitytests.go:12:39:12:40 | After s2 | +| equalitytests.go:12:45:12:46 | After s3 | equalitytests.go:12:51:12:52 | Before s4 | +| equalitytests.go:12:45:12:46 | Before s3 | equalitytests.go:12:45:12:46 | s3 | +| equalitytests.go:12:45:12:46 | s3 | equalitytests.go:12:45:12:46 | After s3 | +| equalitytests.go:12:45:12:52 | ...==... | equalitytests.go:12:45:12:52 | After ...==... [false] | +| equalitytests.go:12:45:12:52 | ...==... | equalitytests.go:12:45:12:52 | After ...==... [true] | +| equalitytests.go:12:45:12:52 | After ...==... [false] | equalitytests.go:12:9:12:52 | After ...&&... [false] | +| equalitytests.go:12:45:12:52 | After ...==... [true] | equalitytests.go:12:9:12:52 | After ...&&... [true] | +| equalitytests.go:12:45:12:52 | Before ...==... | equalitytests.go:12:45:12:46 | Before s3 | +| equalitytests.go:12:51:12:52 | After s4 | equalitytests.go:12:45:12:52 | ...==... | +| equalitytests.go:12:51:12:52 | Before s4 | equalitytests.go:12:51:12:52 | s4 | +| equalitytests.go:12:51:12:52 | s4 | equalitytests.go:12:51:12:52 | After s4 | +| equalitytests.go:12:57:12:58 | After a1 | equalitytests.go:12:63:12:64 | Before a2 | +| equalitytests.go:12:57:12:58 | Before a1 | equalitytests.go:12:57:12:58 | a1 | +| equalitytests.go:12:57:12:58 | a1 | equalitytests.go:12:57:12:58 | After a1 | +| equalitytests.go:12:57:12:64 | ...==... | equalitytests.go:12:57:12:64 | After ...==... [false] | +| equalitytests.go:12:57:12:64 | ...==... | equalitytests.go:12:57:12:64 | After ...==... [true] | +| equalitytests.go:12:57:12:64 | After ...==... [false] | equalitytests.go:12:9:12:64 | After ...&&... [false] | +| equalitytests.go:12:57:12:64 | After ...==... [true] | equalitytests.go:12:9:12:64 | After ...&&... [true] | +| equalitytests.go:12:57:12:64 | Before ...==... | equalitytests.go:12:57:12:58 | Before a1 | +| equalitytests.go:12:63:12:64 | After a2 | equalitytests.go:12:57:12:64 | ...==... | +| equalitytests.go:12:63:12:64 | Before a2 | equalitytests.go:12:63:12:64 | a2 | +| equalitytests.go:12:63:12:64 | a2 | equalitytests.go:12:63:12:64 | After a2 | +| equalitytests.go:12:69:12:70 | After a3 | equalitytests.go:12:75:12:76 | Before a4 | +| equalitytests.go:12:69:12:70 | Before a3 | equalitytests.go:12:69:12:70 | a3 | +| equalitytests.go:12:69:12:70 | a3 | equalitytests.go:12:69:12:70 | After a3 | +| equalitytests.go:12:69:12:76 | ...==... | equalitytests.go:12:69:12:76 | After ...==... | +| equalitytests.go:12:69:12:76 | After ...==... | equalitytests.go:12:9:12:76 | After ...&&... | +| equalitytests.go:12:69:12:76 | Before ...==... | equalitytests.go:12:69:12:70 | Before a3 | +| equalitytests.go:12:75:12:76 | After a4 | equalitytests.go:12:69:12:76 | ...==... | +| equalitytests.go:12:75:12:76 | Before a4 | equalitytests.go:12:75:12:76 | a4 | +| equalitytests.go:12:75:12:76 | a4 | equalitytests.go:12:75:12:76 | After a4 | +| exprs.go:0:0:0:0 | After exprs.go | exprs.go:0:0:0:0 | Normal Exit | +| exprs.go:0:0:0:0 | Entry | exprs.go:0:0:0:0 | exprs.go | +| exprs.go:0:0:0:0 | Exceptional Exit | exprs.go:0:0:0:0 | Exit | +| exprs.go:0:0:0:0 | Normal Exit | exprs.go:0:0:0:0 | Exit | +| exprs.go:0:0:0:0 | exprs.go | exprs.go:3:1:3:29 | type declaration | +| exprs.go:3:1:3:29 | After type declaration | exprs.go:5:1:26:1 | Before function declaration | +| exprs.go:3:1:3:29 | type declaration | exprs.go:3:6:3:29 | type declaration specifier | +| exprs.go:3:6:3:29 | type declaration specifier | exprs.go:3:1:3:29 | After type declaration | +| exprs.go:5:1:26:1 | After function declaration | exprs.go:28:1:30:1 | Before function declaration | +| exprs.go:5:1:26:1 | Before function declaration | exprs.go:5:1:26:1 | function declaration | +| exprs.go:5:1:26:1 | Entry | exprs.go:5:19:26:1 | block statement | +| exprs.go:5:1:26:1 | Exceptional Exit | exprs.go:5:1:26:1 | Exit | +| exprs.go:5:1:26:1 | Normal Exit | exprs.go:5:1:26:1 | Exit | +| exprs.go:5:1:26:1 | function declaration | exprs.go:5:1:26:1 | After function declaration | +| exprs.go:5:19:26:1 | block statement | exprs.go:6:2:6:26 | declaration statement | +| exprs.go:6:2:6:26 | After declaration statement | exprs.go:7:2:7:16 | declaration statement | +| exprs.go:6:2:6:26 | After variable declaration | exprs.go:6:2:6:26 | After declaration statement | +| exprs.go:6:2:6:26 | declaration statement | exprs.go:6:2:6:26 | variable declaration | +| exprs.go:6:2:6:26 | variable declaration | exprs.go:6:6:6:26 | value declaration specifier | +| exprs.go:6:6:6:26 | After value declaration specifier | exprs.go:6:2:6:26 | After variable declaration | | exprs.go:6:6:6:26 | assign:0 value declaration specifier | exprs.go:6:6:6:26 | assign:1 value declaration specifier | -| exprs.go:6:6:6:26 | assign:1 value declaration specifier | exprs.go:7:6:7:6 | skip | -| exprs.go:6:9:6:9 | skip | exprs.go:6:13:6:13 | 0 | -| exprs.go:6:13:6:13 | 0 | exprs.go:6:16:6:26 | ...+... | -| exprs.go:6:16:6:26 | ...+... | exprs.go:6:6:6:26 | assign:0 value declaration specifier | -| exprs.go:7:6:7:6 | skip | exprs.go:7:10:7:10 | i | -| exprs.go:7:6:7:16 | assign:0 value declaration specifier | exprs.go:8:2:8:2 | skip | -| exprs.go:7:10:7:10 | i | exprs.go:7:14:7:14 | 2 | -| exprs.go:7:10:7:16 | ...+... | exprs.go:7:6:7:16 | assign:0 value declaration specifier | -| exprs.go:7:14:7:14 | 2 | exprs.go:7:16:7:16 | j | -| exprs.go:7:14:7:16 | ...*... | exprs.go:7:10:7:16 | ...+... | -| exprs.go:7:16:7:16 | j | exprs.go:7:14:7:16 | ...*... | -| exprs.go:8:2:8:2 | skip | exprs.go:8:7:8:12 | "k = " | -| exprs.go:8:2:8:24 | assign:0 ... := ... | exprs.go:9:2:9:3 | skip | -| exprs.go:8:7:8:12 | "k = " | exprs.go:8:23:8:23 | k | -| exprs.go:8:7:8:24 | ...+... | exprs.go:8:2:8:24 | assign:0 ... := ... | -| exprs.go:8:16:8:24 | type conversion | exprs.go:8:7:8:24 | ...+... | -| exprs.go:8:23:8:23 | k | exprs.go:8:16:8:24 | type conversion | -| exprs.go:9:2:9:3 | skip | exprs.go:9:8:9:61 | function literal | -| exprs.go:9:2:9:61 | assign:0 ... := ... | exprs.go:10:2:10:8 | skip | -| exprs.go:9:8:9:61 | entry | exprs.go:9:13:9:13 | a | -| exprs.go:9:8:9:61 | function literal | exprs.go:9:2:9:61 | assign:0 ... := ... | -| exprs.go:9:13:9:13 | a | exprs.go:9:13:9:13 | a | +| exprs.go:6:6:6:26 | assign:1 value declaration specifier | exprs.go:6:6:6:26 | After value declaration specifier | +| exprs.go:6:6:6:26 | value declaration specifier | exprs.go:6:13:6:13 | Before 0 | +| exprs.go:6:13:6:13 | 0 | exprs.go:6:13:6:13 | After 0 | +| exprs.go:6:13:6:13 | After 0 | exprs.go:6:16:6:26 | Before ...+... | +| exprs.go:6:13:6:13 | Before 0 | exprs.go:6:13:6:13 | 0 | +| exprs.go:6:16:6:16 | 1 | exprs.go:6:16:6:16 | After 1 | +| exprs.go:6:16:6:16 | After 1 | exprs.go:6:20:6:26 | (...) | +| exprs.go:6:16:6:16 | Before 1 | exprs.go:6:16:6:16 | 1 | +| exprs.go:6:16:6:26 | ...+... | exprs.go:6:16:6:26 | After ...+... | +| exprs.go:6:16:6:26 | After ...+... | exprs.go:6:6:6:26 | assign:0 value declaration specifier | +| exprs.go:6:16:6:26 | Before ...+... | exprs.go:6:16:6:16 | Before 1 | +| exprs.go:6:20:6:26 | (...) | exprs.go:6:21:6:25 | Before ...+... | +| exprs.go:6:20:6:26 | After (...) | exprs.go:6:16:6:26 | ...+... | +| exprs.go:6:21:6:21 | 2 | exprs.go:6:21:6:21 | After 2 | +| exprs.go:6:21:6:21 | After 2 | exprs.go:6:25:6:25 | Before 3 | +| exprs.go:6:21:6:21 | Before 2 | exprs.go:6:21:6:21 | 2 | +| exprs.go:6:21:6:25 | ...+... | exprs.go:6:21:6:25 | After ...+... | +| exprs.go:6:21:6:25 | After ...+... | exprs.go:6:20:6:26 | After (...) | +| exprs.go:6:21:6:25 | Before ...+... | exprs.go:6:21:6:21 | Before 2 | +| exprs.go:6:25:6:25 | 3 | exprs.go:6:25:6:25 | After 3 | +| exprs.go:6:25:6:25 | After 3 | exprs.go:6:21:6:25 | ...+... | +| exprs.go:6:25:6:25 | Before 3 | exprs.go:6:25:6:25 | 3 | +| exprs.go:7:2:7:16 | After declaration statement | exprs.go:8:2:8:24 | ... := ... | +| exprs.go:7:2:7:16 | After variable declaration | exprs.go:7:2:7:16 | After declaration statement | +| exprs.go:7:2:7:16 | declaration statement | exprs.go:7:2:7:16 | variable declaration | +| exprs.go:7:2:7:16 | variable declaration | exprs.go:7:6:7:16 | value declaration specifier | +| exprs.go:7:6:7:16 | After value declaration specifier | exprs.go:7:2:7:16 | After variable declaration | +| exprs.go:7:6:7:16 | assign:0 value declaration specifier | exprs.go:7:6:7:16 | After value declaration specifier | +| exprs.go:7:6:7:16 | value declaration specifier | exprs.go:7:10:7:16 | Before ...+... | +| exprs.go:7:10:7:10 | After i | exprs.go:7:14:7:16 | Before ...*... | +| exprs.go:7:10:7:10 | Before i | exprs.go:7:10:7:10 | i | +| exprs.go:7:10:7:10 | i | exprs.go:7:10:7:10 | After i | +| exprs.go:7:10:7:16 | ...+... | exprs.go:7:10:7:16 | After ...+... | +| exprs.go:7:10:7:16 | After ...+... | exprs.go:7:6:7:16 | assign:0 value declaration specifier | +| exprs.go:7:10:7:16 | Before ...+... | exprs.go:7:10:7:10 | Before i | +| exprs.go:7:14:7:14 | 2 | exprs.go:7:14:7:14 | After 2 | +| exprs.go:7:14:7:14 | After 2 | exprs.go:7:16:7:16 | Before j | +| exprs.go:7:14:7:14 | Before 2 | exprs.go:7:14:7:14 | 2 | +| exprs.go:7:14:7:16 | ...*... | exprs.go:7:14:7:16 | After ...*... | +| exprs.go:7:14:7:16 | After ...*... | exprs.go:7:10:7:16 | ...+... | +| exprs.go:7:14:7:16 | Before ...*... | exprs.go:7:14:7:14 | Before 2 | +| exprs.go:7:16:7:16 | After j | exprs.go:7:14:7:16 | ...*... | +| exprs.go:7:16:7:16 | Before j | exprs.go:7:16:7:16 | j | +| exprs.go:7:16:7:16 | j | exprs.go:7:16:7:16 | After j | +| exprs.go:8:2:8:24 | ... := ... | exprs.go:8:7:8:24 | Before ...+... | +| exprs.go:8:2:8:24 | After ... := ... | exprs.go:9:2:9:61 | ... := ... | +| exprs.go:8:2:8:24 | assign:0 ... := ... | exprs.go:8:2:8:24 | After ... := ... | +| exprs.go:8:7:8:12 | "k = " | exprs.go:8:7:8:12 | After "k = " | +| exprs.go:8:7:8:12 | After "k = " | exprs.go:8:16:8:24 | Before type conversion | +| exprs.go:8:7:8:12 | Before "k = " | exprs.go:8:7:8:12 | "k = " | +| exprs.go:8:7:8:24 | ...+... | exprs.go:8:7:8:24 | After ...+... | +| exprs.go:8:7:8:24 | After ...+... | exprs.go:8:2:8:24 | assign:0 ... := ... | +| exprs.go:8:7:8:24 | Before ...+... | exprs.go:8:7:8:12 | Before "k = " | +| exprs.go:8:16:8:24 | After type conversion | exprs.go:8:7:8:24 | ...+... | +| exprs.go:8:16:8:24 | Before type conversion | exprs.go:8:23:8:23 | Before k | +| exprs.go:8:16:8:24 | type conversion | exprs.go:8:16:8:24 | After type conversion | +| exprs.go:8:23:8:23 | After k | exprs.go:8:16:8:24 | type conversion | +| exprs.go:8:23:8:23 | Before k | exprs.go:8:23:8:23 | k | +| exprs.go:8:23:8:23 | k | exprs.go:8:23:8:23 | After k | +| exprs.go:9:2:9:61 | ... := ... | exprs.go:9:8:9:61 | Before function literal | +| exprs.go:9:2:9:61 | After ... := ... | exprs.go:10:2:10:32 | ... := ... | +| exprs.go:9:2:9:61 | assign:0 ... := ... | exprs.go:9:2:9:61 | After ... := ... | +| exprs.go:9:8:9:61 | After function literal | exprs.go:9:2:9:61 | assign:0 ... := ... | +| exprs.go:9:8:9:61 | Before function literal | exprs.go:9:8:9:61 | function literal | +| exprs.go:9:8:9:61 | Entry | exprs.go:9:13:9:13 | a | +| exprs.go:9:8:9:61 | Normal Exit | exprs.go:9:8:9:61 | Exit | +| exprs.go:9:8:9:61 | function literal | exprs.go:9:8:9:61 | After function literal | | exprs.go:9:13:9:13 | a | exprs.go:9:16:9:16 | b | -| exprs.go:9:16:9:16 | b | exprs.go:9:16:9:16 | b | | exprs.go:9:16:9:16 | b | exprs.go:9:23:9:23 | z | -| exprs.go:9:23:9:23 | z | exprs.go:9:23:9:23 | z | -| exprs.go:9:23:9:23 | z | exprs.go:9:48:9:48 | a | -| exprs.go:9:41:9:59 | return statement | exprs.go:9:8:9:61 | exit | -| exprs.go:9:48:9:48 | a | exprs.go:9:50:9:50 | b | -| exprs.go:9:48:9:50 | ...*... | exprs.go:9:58:9:58 | z | -| exprs.go:9:48:9:59 | ...<... | exprs.go:9:41:9:59 | return statement | -| exprs.go:9:50:9:50 | b | exprs.go:9:48:9:50 | ...*... | -| exprs.go:9:54:9:59 | type conversion | exprs.go:9:48:9:59 | ...<... | -| exprs.go:9:58:9:58 | z | exprs.go:9:54:9:59 | type conversion | -| exprs.go:10:2:10:8 | skip | exprs.go:10:13:10:32 | struct literal | -| exprs.go:10:2:10:32 | assign:0 ... := ... | exprs.go:11:2:11:8 | skip | -| exprs.go:10:13:10:32 | struct literal | exprs.go:10:2:10:32 | assign:0 ... := ... | -| exprs.go:11:2:11:8 | skip | exprs.go:11:13:14:21 | struct literal | -| exprs.go:11:2:14:21 | assign:0 ... := ... | exprs.go:15:2:15:8 | skip | -| exprs.go:11:13:14:21 | struct literal | exprs.go:14:4:14:4 | k | -| exprs.go:14:4:14:4 | k | exprs.go:14:4:14:4 | lit-init k | -| exprs.go:14:4:14:4 | lit-init k | exprs.go:14:7:14:8 | fn | -| exprs.go:14:7:14:8 | fn | exprs.go:14:10:14:10 | i | -| exprs.go:14:7:14:20 | call to fn | exprs.go:5:1:26:1 | exit | -| exprs.go:14:7:14:20 | call to fn | exprs.go:14:7:14:20 | lit-init call to fn | -| exprs.go:14:7:14:20 | lit-init call to fn | exprs.go:11:2:14:21 | assign:0 ... := ... | -| exprs.go:14:10:14:10 | i | exprs.go:14:13:14:13 | j | -| exprs.go:14:13:14:13 | j | exprs.go:14:16:14:19 | .../... | -| exprs.go:14:16:14:19 | .../... | exprs.go:14:7:14:20 | call to fn | -| exprs.go:15:2:15:8 | skip | exprs.go:15:13:15:58 | struct literal | -| exprs.go:15:2:15:58 | assign:0 ... := ... | exprs.go:16:2:16:5 | skip | -| exprs.go:15:13:15:58 | struct literal | exprs.go:15:35:15:41 | struct1 | -| exprs.go:15:32:15:43 | lit-init key-value pair | exprs.go:15:49:15:55 | struct2 | -| exprs.go:15:35:15:41 | struct1 | exprs.go:15:35:15:43 | selection of x | -| exprs.go:15:35:15:43 | selection of x | exprs.go:15:32:15:43 | lit-init key-value pair | -| exprs.go:15:46:15:57 | lit-init key-value pair | exprs.go:15:2:15:58 | assign:0 ... := ... | -| exprs.go:15:49:15:55 | struct2 | exprs.go:15:49:15:57 | selection of x | -| exprs.go:15:49:15:57 | selection of x | exprs.go:15:46:15:57 | lit-init key-value pair | -| exprs.go:16:2:16:5 | skip | exprs.go:16:10:16:26 | array literal | -| exprs.go:16:2:16:26 | assign:0 ... := ... | exprs.go:17:2:17:5 | skip | -| exprs.go:16:10:16:26 | array literal | exprs.go:16:17:16:25 | element index | -| exprs.go:16:17:16:23 | struct3 | exprs.go:16:17:16:25 | selection of x | -| exprs.go:16:17:16:25 | element index | exprs.go:16:17:16:23 | struct3 | -| exprs.go:16:17:16:25 | lit-init selection of x | exprs.go:16:2:16:26 | assign:0 ... := ... | -| exprs.go:16:17:16:25 | selection of x | exprs.go:16:17:16:25 | lit-init selection of x | -| exprs.go:17:2:17:5 | skip | exprs.go:17:10:17:40 | array literal | -| exprs.go:17:2:17:40 | assign:0 ... := ... | exprs.go:18:2:18:4 | skip | -| exprs.go:17:10:17:40 | array literal | exprs.go:17:19:17:27 | element index | -| exprs.go:17:19:17:25 | struct3 | exprs.go:17:19:17:27 | selection of x | -| exprs.go:17:19:17:27 | element index | exprs.go:17:19:17:25 | struct3 | -| exprs.go:17:19:17:27 | lit-init selection of x | exprs.go:17:30:17:30 | 2 | -| exprs.go:17:19:17:27 | selection of x | exprs.go:17:19:17:27 | lit-init selection of x | -| exprs.go:17:30:17:30 | 2 | exprs.go:17:33:17:36 | arr1 | -| exprs.go:17:30:17:39 | lit-init key-value pair | exprs.go:17:2:17:40 | assign:0 ... := ... | -| exprs.go:17:33:17:36 | arr1 | exprs.go:17:38:17:38 | 0 | -| exprs.go:17:33:17:39 | index expression | exprs.go:5:1:26:1 | exit | -| exprs.go:17:33:17:39 | index expression | exprs.go:17:30:17:39 | lit-init key-value pair | -| exprs.go:17:38:17:38 | 0 | exprs.go:17:33:17:39 | index expression | -| exprs.go:18:2:18:4 | skip | exprs.go:18:9:18:22 | slice literal | -| exprs.go:18:2:18:22 | assign:0 ... := ... | exprs.go:19:2:19:3 | skip | -| exprs.go:18:9:18:22 | slice literal | exprs.go:18:18:18:18 | element index | -| exprs.go:18:18:18:18 | element index | exprs.go:18:18:18:18 | s | -| exprs.go:18:18:18:18 | lit-init s | exprs.go:18:21:18:21 | element index | -| exprs.go:18:18:18:18 | s | exprs.go:18:18:18:18 | lit-init s | -| exprs.go:18:21:18:21 | element index | exprs.go:18:21:18:21 | s | -| exprs.go:18:21:18:21 | lit-init s | exprs.go:18:2:18:22 | assign:0 ... := ... | -| exprs.go:18:21:18:21 | s | exprs.go:18:21:18:21 | lit-init s | -| exprs.go:19:2:19:3 | skip | exprs.go:19:8:19:38 | map literal | -| exprs.go:19:2:19:38 | assign:0 ... := ... | exprs.go:20:2:20:5 | skip | -| exprs.go:19:8:19:38 | map literal | exprs.go:19:23:19:25 | slc | -| exprs.go:19:23:19:25 | slc | exprs.go:19:27:19:27 | 0 | -| exprs.go:19:23:19:28 | index expression | exprs.go:5:1:26:1 | exit | -| exprs.go:19:23:19:28 | index expression | exprs.go:19:31:19:34 | arr2 | -| exprs.go:19:23:19:37 | lit-init key-value pair | exprs.go:19:2:19:38 | assign:0 ... := ... | -| exprs.go:19:27:19:27 | 0 | exprs.go:19:23:19:28 | index expression | -| exprs.go:19:31:19:34 | arr2 | exprs.go:19:36:19:36 | 1 | -| exprs.go:19:31:19:37 | index expression | exprs.go:5:1:26:1 | exit | -| exprs.go:19:31:19:37 | index expression | exprs.go:19:23:19:37 | lit-init key-value pair | -| exprs.go:19:36:19:36 | 1 | exprs.go:19:31:19:37 | index expression | -| exprs.go:20:2:20:5 | skip | exprs.go:20:10:20:12 | slc | -| exprs.go:20:2:20:19 | assign:0 ... := ... | exprs.go:21:2:21:5 | skip | -| exprs.go:20:10:20:12 | slc | exprs.go:20:14:20:14 | 1 | -| exprs.go:20:10:20:19 | slice expression | exprs.go:5:1:26:1 | exit | -| exprs.go:20:10:20:19 | slice expression | exprs.go:20:2:20:19 | assign:0 ... := ... | -| exprs.go:20:14:20:14 | 1 | exprs.go:20:16:20:16 | 2 | -| exprs.go:20:16:20:16 | 2 | exprs.go:20:18:20:18 | 3 | -| exprs.go:20:18:20:18 | 3 | exprs.go:20:10:20:19 | slice expression | -| exprs.go:21:2:21:5 | skip | exprs.go:21:10:21:13 | slc2 | -| exprs.go:21:2:21:19 | assign:0 ... := ... | exprs.go:22:2:22:5 | skip | -| exprs.go:21:10:21:13 | slc2 | exprs.go:21:10:21:19 | 0 | -| exprs.go:21:10:21:19 | 0 | exprs.go:21:16:21:16 | 2 | -| exprs.go:21:10:21:19 | slice expression | exprs.go:5:1:26:1 | exit | -| exprs.go:21:10:21:19 | slice expression | exprs.go:21:2:21:19 | assign:0 ... := ... | -| exprs.go:21:16:21:16 | 2 | exprs.go:21:18:21:18 | 3 | -| exprs.go:21:18:21:18 | 3 | exprs.go:21:10:21:19 | slice expression | -| exprs.go:22:2:22:5 | skip | exprs.go:22:10:22:13 | slc3 | -| exprs.go:22:2:22:18 | assign:0 ... := ... | exprs.go:23:2:23:5 | skip | -| exprs.go:22:10:22:13 | slc3 | exprs.go:22:15:22:15 | 0 | -| exprs.go:22:10:22:18 | cap | exprs.go:22:10:22:18 | slice expression | -| exprs.go:22:10:22:18 | slice expression | exprs.go:5:1:26:1 | exit | -| exprs.go:22:10:22:18 | slice expression | exprs.go:22:2:22:18 | assign:0 ... := ... | -| exprs.go:22:15:22:15 | 0 | exprs.go:22:17:22:17 | 2 | -| exprs.go:22:17:22:17 | 2 | exprs.go:22:10:22:18 | cap | -| exprs.go:23:2:23:5 | skip | exprs.go:23:10:23:13 | slc4 | -| exprs.go:23:2:23:17 | assign:0 ... := ... | exprs.go:24:2:24:5 | skip | -| exprs.go:23:10:23:13 | slc4 | exprs.go:23:15:23:15 | 0 | -| exprs.go:23:10:23:17 | cap | exprs.go:23:10:23:17 | slice expression | -| exprs.go:23:10:23:17 | len | exprs.go:23:10:23:17 | cap | -| exprs.go:23:10:23:17 | slice expression | exprs.go:5:1:26:1 | exit | -| exprs.go:23:10:23:17 | slice expression | exprs.go:23:2:23:17 | assign:0 ... := ... | -| exprs.go:23:15:23:15 | 0 | exprs.go:23:10:23:17 | len | -| exprs.go:24:2:24:5 | skip | exprs.go:24:10:24:13 | slc5 | -| exprs.go:24:2:24:17 | assign:0 ... := ... | exprs.go:25:9:25:34 | struct literal | -| exprs.go:24:10:24:13 | slc5 | exprs.go:24:10:24:17 | 0 | -| exprs.go:24:10:24:17 | 0 | exprs.go:24:16:24:16 | 2 | -| exprs.go:24:10:24:17 | cap | exprs.go:24:10:24:17 | slice expression | -| exprs.go:24:10:24:17 | slice expression | exprs.go:5:1:26:1 | exit | -| exprs.go:24:10:24:17 | slice expression | exprs.go:24:2:24:17 | assign:0 ... := ... | -| exprs.go:24:16:24:16 | 2 | exprs.go:24:10:24:17 | cap | -| exprs.go:25:2:25:34 | return statement | exprs.go:5:1:26:1 | exit | -| exprs.go:25:9:25:34 | struct literal | exprs.go:25:15:25:16 | mp | -| exprs.go:25:15:25:16 | mp | exprs.go:25:18:25:18 | s | -| exprs.go:25:15:25:19 | index expression | exprs.go:5:1:26:1 | exit | -| exprs.go:25:15:25:19 | index expression | exprs.go:25:15:25:19 | lit-init index expression | -| exprs.go:25:15:25:19 | lit-init index expression | exprs.go:25:22:25:24 | len | -| exprs.go:25:18:25:18 | s | exprs.go:25:15:25:19 | index expression | -| exprs.go:25:22:25:24 | len | exprs.go:25:26:25:29 | slc6 | -| exprs.go:25:22:25:33 | call to len | exprs.go:25:22:25:33 | lit-init call to len | -| exprs.go:25:22:25:33 | lit-init call to len | exprs.go:25:2:25:34 | return statement | -| exprs.go:25:26:25:29 | slc6 | exprs.go:25:31:25:31 | 0 | -| exprs.go:25:26:25:32 | index expression | exprs.go:5:1:26:1 | exit | -| exprs.go:25:26:25:32 | index expression | exprs.go:25:22:25:33 | call to len | -| exprs.go:25:31:25:31 | 0 | exprs.go:25:26:25:32 | index expression | -| exprs.go:28:1:30:1 | entry | exprs.go:28:12:28:14 | arg | -| exprs.go:28:1:30:1 | function declaration | exprs.go:32:6:32:10 | skip | -| exprs.go:28:6:28:10 | skip | exprs.go:28:1:30:1 | function declaration | -| exprs.go:28:12:28:14 | arg | exprs.go:28:12:28:14 | arg | -| exprs.go:28:12:28:14 | arg | exprs.go:29:9:29:11 | arg | -| exprs.go:29:2:29:21 | return statement | exprs.go:28:1:30:1 | exit | -| exprs.go:29:9:29:11 | arg | exprs.go:29:9:29:19 | type assertion | -| exprs.go:29:9:29:19 | type assertion | exprs.go:28:1:30:1 | exit | -| exprs.go:29:9:29:19 | type assertion | exprs.go:29:9:29:21 | selection of x | -| exprs.go:29:9:29:21 | selection of x | exprs.go:29:2:29:21 | return statement | -| exprs.go:32:1:37:1 | entry | exprs.go:32:12:32:14 | arg | -| exprs.go:32:1:37:1 | function declaration | exprs.go:39:6:39:10 | skip | -| exprs.go:32:6:32:10 | skip | exprs.go:32:1:37:1 | function declaration | -| exprs.go:32:12:32:14 | arg | exprs.go:32:12:32:14 | arg | -| exprs.go:32:12:32:14 | arg | exprs.go:33:5:33:5 | skip | -| exprs.go:33:5:33:5 | skip | exprs.go:33:8:33:9 | skip | +| exprs.go:9:23:9:23 | z | exprs.go:9:39:9:61 | block statement | +| exprs.go:9:39:9:61 | block statement | exprs.go:9:41:9:59 | Before return statement | +| exprs.go:9:41:9:59 | Before return statement | exprs.go:9:48:9:59 | Before ...<... | +| exprs.go:9:41:9:59 | return statement | exprs.go:9:8:9:61 | Normal Exit | +| exprs.go:9:48:9:48 | After a | exprs.go:9:50:9:50 | Before b | +| exprs.go:9:48:9:48 | Before a | exprs.go:9:48:9:48 | a | +| exprs.go:9:48:9:48 | a | exprs.go:9:48:9:48 | After a | +| exprs.go:9:48:9:50 | ...*... | exprs.go:9:48:9:50 | After ...*... | +| exprs.go:9:48:9:50 | After ...*... | exprs.go:9:54:9:59 | Before type conversion | +| exprs.go:9:48:9:50 | Before ...*... | exprs.go:9:48:9:48 | Before a | +| exprs.go:9:48:9:59 | ...<... | exprs.go:9:48:9:59 | After ...<... | +| exprs.go:9:48:9:59 | After ...<... | exprs.go:9:41:9:59 | return statement | +| exprs.go:9:48:9:59 | Before ...<... | exprs.go:9:48:9:50 | Before ...*... | +| exprs.go:9:50:9:50 | After b | exprs.go:9:48:9:50 | ...*... | +| exprs.go:9:50:9:50 | Before b | exprs.go:9:50:9:50 | b | +| exprs.go:9:50:9:50 | b | exprs.go:9:50:9:50 | After b | +| exprs.go:9:54:9:59 | After type conversion | exprs.go:9:48:9:59 | ...<... | +| exprs.go:9:54:9:59 | Before type conversion | exprs.go:9:58:9:58 | Before z | +| exprs.go:9:54:9:59 | type conversion | exprs.go:9:54:9:59 | After type conversion | +| exprs.go:9:58:9:58 | After z | exprs.go:9:54:9:59 | type conversion | +| exprs.go:9:58:9:58 | Before z | exprs.go:9:58:9:58 | z | +| exprs.go:9:58:9:58 | z | exprs.go:9:58:9:58 | After z | +| exprs.go:10:2:10:32 | ... := ... | exprs.go:10:13:10:32 | Before struct literal | +| exprs.go:10:2:10:32 | After ... := ... | exprs.go:11:2:14:21 | ... := ... | +| exprs.go:10:2:10:32 | assign:0 ... := ... | exprs.go:10:2:10:32 | After ... := ... | +| exprs.go:10:13:10:32 | After struct literal | exprs.go:10:2:10:32 | assign:0 ... := ... | +| exprs.go:10:13:10:32 | Before struct literal | exprs.go:10:13:10:32 | struct literal | +| exprs.go:10:13:10:32 | struct literal | exprs.go:10:13:10:32 | After struct literal | +| exprs.go:11:2:14:21 | ... := ... | exprs.go:11:13:14:21 | Before struct literal | +| exprs.go:11:2:14:21 | After ... := ... | exprs.go:15:2:15:58 | ... := ... | +| exprs.go:11:2:14:21 | assign:0 ... := ... | exprs.go:11:2:14:21 | After ... := ... | +| exprs.go:11:13:14:21 | After struct literal | exprs.go:11:2:14:21 | assign:0 ... := ... | +| exprs.go:11:13:14:21 | Before struct literal | exprs.go:11:13:14:21 | struct literal | +| exprs.go:11:13:14:21 | struct literal | exprs.go:14:4:14:4 | Before k | +| exprs.go:14:4:14:4 | After k | exprs.go:14:4:14:4 | lit-init k | +| exprs.go:14:4:14:4 | Before k | exprs.go:14:4:14:4 | k | +| exprs.go:14:4:14:4 | k | exprs.go:14:4:14:4 | After k | +| exprs.go:14:4:14:4 | lit-init k | exprs.go:14:7:14:20 | Before call to fn | +| exprs.go:14:7:14:8 | After fn | exprs.go:14:10:14:10 | Before i | +| exprs.go:14:7:14:8 | Before fn | exprs.go:14:7:14:8 | fn | +| exprs.go:14:7:14:8 | fn | exprs.go:14:7:14:8 | After fn | +| exprs.go:14:7:14:20 | After call to fn | exprs.go:14:7:14:20 | lit-init call to fn | +| exprs.go:14:7:14:20 | Before call to fn | exprs.go:14:7:14:8 | Before fn | +| exprs.go:14:7:14:20 | call to fn | exprs.go:5:1:26:1 | Exceptional Exit | +| exprs.go:14:7:14:20 | call to fn | exprs.go:14:7:14:20 | After call to fn | +| exprs.go:14:7:14:20 | lit-init call to fn | exprs.go:11:13:14:21 | After struct literal | +| exprs.go:14:10:14:10 | After i | exprs.go:14:13:14:13 | Before j | +| exprs.go:14:10:14:10 | Before i | exprs.go:14:10:14:10 | i | +| exprs.go:14:10:14:10 | i | exprs.go:14:10:14:10 | After i | +| exprs.go:14:13:14:13 | After j | exprs.go:14:16:14:19 | Before .../... | +| exprs.go:14:13:14:13 | Before j | exprs.go:14:13:14:13 | j | +| exprs.go:14:13:14:13 | j | exprs.go:14:13:14:13 | After j | +| exprs.go:14:16:14:16 | 3 | exprs.go:14:16:14:16 | After 3 | +| exprs.go:14:16:14:16 | After 3 | exprs.go:14:18:14:19 | Before 14 | +| exprs.go:14:16:14:16 | Before 3 | exprs.go:14:16:14:16 | 3 | +| exprs.go:14:16:14:19 | .../... | exprs.go:14:16:14:19 | After .../... | +| exprs.go:14:16:14:19 | After .../... | exprs.go:14:7:14:20 | call to fn | +| exprs.go:14:16:14:19 | Before .../... | exprs.go:14:16:14:16 | Before 3 | +| exprs.go:14:18:14:19 | 14 | exprs.go:14:18:14:19 | After 14 | +| exprs.go:14:18:14:19 | After 14 | exprs.go:14:16:14:19 | .../... | +| exprs.go:14:18:14:19 | Before 14 | exprs.go:14:18:14:19 | 14 | +| exprs.go:15:2:15:58 | ... := ... | exprs.go:15:13:15:58 | Before struct literal | +| exprs.go:15:2:15:58 | After ... := ... | exprs.go:16:2:16:26 | ... := ... | +| exprs.go:15:2:15:58 | assign:0 ... := ... | exprs.go:15:2:15:58 | After ... := ... | +| exprs.go:15:13:15:58 | After struct literal | exprs.go:15:2:15:58 | assign:0 ... := ... | +| exprs.go:15:13:15:58 | Before struct literal | exprs.go:15:13:15:58 | struct literal | +| exprs.go:15:13:15:58 | struct literal | exprs.go:15:32:15:43 | Before key-value pair | +| exprs.go:15:32:15:43 | After key-value pair | exprs.go:15:32:15:43 | lit-init key-value pair | +| exprs.go:15:32:15:43 | Before key-value pair | exprs.go:15:35:15:43 | Before selection of x | +| exprs.go:15:32:15:43 | key-value pair | exprs.go:15:32:15:43 | After key-value pair | +| exprs.go:15:32:15:43 | lit-init key-value pair | exprs.go:15:46:15:57 | Before key-value pair | +| exprs.go:15:35:15:41 | After struct1 | exprs.go:15:35:15:43 | selection of x | +| exprs.go:15:35:15:41 | Before struct1 | exprs.go:15:35:15:41 | struct1 | +| exprs.go:15:35:15:41 | struct1 | exprs.go:15:35:15:41 | After struct1 | +| exprs.go:15:35:15:43 | After selection of x | exprs.go:15:32:15:43 | key-value pair | +| exprs.go:15:35:15:43 | Before selection of x | exprs.go:15:35:15:41 | Before struct1 | +| exprs.go:15:35:15:43 | selection of x | exprs.go:15:35:15:43 | After selection of x | +| exprs.go:15:46:15:57 | After key-value pair | exprs.go:15:46:15:57 | lit-init key-value pair | +| exprs.go:15:46:15:57 | Before key-value pair | exprs.go:15:49:15:57 | Before selection of x | +| exprs.go:15:46:15:57 | key-value pair | exprs.go:15:46:15:57 | After key-value pair | +| exprs.go:15:46:15:57 | lit-init key-value pair | exprs.go:15:13:15:58 | After struct literal | +| exprs.go:15:49:15:55 | After struct2 | exprs.go:15:49:15:57 | selection of x | +| exprs.go:15:49:15:55 | Before struct2 | exprs.go:15:49:15:55 | struct2 | +| exprs.go:15:49:15:55 | struct2 | exprs.go:15:49:15:55 | After struct2 | +| exprs.go:15:49:15:57 | After selection of x | exprs.go:15:46:15:57 | key-value pair | +| exprs.go:15:49:15:57 | Before selection of x | exprs.go:15:49:15:55 | Before struct2 | +| exprs.go:15:49:15:57 | selection of x | exprs.go:15:49:15:57 | After selection of x | +| exprs.go:16:2:16:26 | ... := ... | exprs.go:16:10:16:26 | Before array literal | +| exprs.go:16:2:16:26 | After ... := ... | exprs.go:17:2:17:40 | ... := ... | +| exprs.go:16:2:16:26 | assign:0 ... := ... | exprs.go:16:2:16:26 | After ... := ... | +| exprs.go:16:10:16:26 | After array literal | exprs.go:16:2:16:26 | assign:0 ... := ... | +| exprs.go:16:10:16:26 | Before array literal | exprs.go:16:10:16:26 | array literal | +| exprs.go:16:10:16:26 | array literal | exprs.go:16:17:16:25 | Before selection of x | +| exprs.go:16:17:16:23 | After struct3 | exprs.go:16:17:16:25 | selection of x | +| exprs.go:16:17:16:23 | Before struct3 | exprs.go:16:17:16:23 | struct3 | +| exprs.go:16:17:16:23 | struct3 | exprs.go:16:17:16:23 | After struct3 | +| exprs.go:16:17:16:25 | After selection of x | exprs.go:16:17:16:25 | lit-index selection of x | +| exprs.go:16:17:16:25 | Before selection of x | exprs.go:16:17:16:23 | Before struct3 | +| exprs.go:16:17:16:25 | lit-index selection of x | exprs.go:16:17:16:25 | lit-init selection of x | +| exprs.go:16:17:16:25 | lit-init selection of x | exprs.go:16:10:16:26 | After array literal | +| exprs.go:16:17:16:25 | selection of x | exprs.go:16:17:16:25 | After selection of x | +| exprs.go:17:2:17:40 | ... := ... | exprs.go:17:10:17:40 | Before array literal | +| exprs.go:17:2:17:40 | After ... := ... | exprs.go:18:2:18:22 | ... := ... | +| exprs.go:17:2:17:40 | assign:0 ... := ... | exprs.go:17:2:17:40 | After ... := ... | +| exprs.go:17:10:17:40 | After array literal | exprs.go:17:2:17:40 | assign:0 ... := ... | +| exprs.go:17:10:17:40 | Before array literal | exprs.go:17:10:17:40 | array literal | +| exprs.go:17:10:17:40 | array literal | exprs.go:17:19:17:27 | Before selection of x | +| exprs.go:17:19:17:25 | After struct3 | exprs.go:17:19:17:27 | selection of x | +| exprs.go:17:19:17:25 | Before struct3 | exprs.go:17:19:17:25 | struct3 | +| exprs.go:17:19:17:25 | struct3 | exprs.go:17:19:17:25 | After struct3 | +| exprs.go:17:19:17:27 | After selection of x | exprs.go:17:19:17:27 | lit-index selection of x | +| exprs.go:17:19:17:27 | Before selection of x | exprs.go:17:19:17:25 | Before struct3 | +| exprs.go:17:19:17:27 | lit-index selection of x | exprs.go:17:19:17:27 | lit-init selection of x | +| exprs.go:17:19:17:27 | lit-init selection of x | exprs.go:17:30:17:39 | Before key-value pair | +| exprs.go:17:19:17:27 | selection of x | exprs.go:17:19:17:27 | After selection of x | +| exprs.go:17:30:17:30 | 2 | exprs.go:17:30:17:30 | After 2 | +| exprs.go:17:30:17:30 | After 2 | exprs.go:17:33:17:39 | Before index expression | +| exprs.go:17:30:17:30 | Before 2 | exprs.go:17:30:17:30 | 2 | +| exprs.go:17:30:17:39 | After key-value pair | exprs.go:17:30:17:39 | lit-init key-value pair | +| exprs.go:17:30:17:39 | Before key-value pair | exprs.go:17:30:17:30 | Before 2 | +| exprs.go:17:30:17:39 | key-value pair | exprs.go:17:30:17:39 | After key-value pair | +| exprs.go:17:30:17:39 | lit-init key-value pair | exprs.go:17:10:17:40 | After array literal | +| exprs.go:17:33:17:36 | After arr1 | exprs.go:17:38:17:38 | Before 0 | +| exprs.go:17:33:17:36 | Before arr1 | exprs.go:17:33:17:36 | arr1 | +| exprs.go:17:33:17:36 | arr1 | exprs.go:17:33:17:36 | After arr1 | +| exprs.go:17:33:17:39 | After index expression | exprs.go:17:30:17:39 | key-value pair | +| exprs.go:17:33:17:39 | Before index expression | exprs.go:17:33:17:36 | Before arr1 | +| exprs.go:17:33:17:39 | index expression | exprs.go:5:1:26:1 | Exceptional Exit | +| exprs.go:17:33:17:39 | index expression | exprs.go:17:33:17:39 | After index expression | +| exprs.go:17:38:17:38 | 0 | exprs.go:17:38:17:38 | After 0 | +| exprs.go:17:38:17:38 | After 0 | exprs.go:17:33:17:39 | index expression | +| exprs.go:17:38:17:38 | Before 0 | exprs.go:17:38:17:38 | 0 | +| exprs.go:18:2:18:22 | ... := ... | exprs.go:18:9:18:22 | Before slice literal | +| exprs.go:18:2:18:22 | After ... := ... | exprs.go:19:2:19:38 | ... := ... | +| exprs.go:18:2:18:22 | assign:0 ... := ... | exprs.go:18:2:18:22 | After ... := ... | +| exprs.go:18:9:18:22 | After slice literal | exprs.go:18:2:18:22 | assign:0 ... := ... | +| exprs.go:18:9:18:22 | Before slice literal | exprs.go:18:9:18:22 | slice literal | +| exprs.go:18:9:18:22 | slice literal | exprs.go:18:18:18:18 | Before s | +| exprs.go:18:18:18:18 | After s | exprs.go:18:18:18:18 | lit-index s | +| exprs.go:18:18:18:18 | Before s | exprs.go:18:18:18:18 | s | +| exprs.go:18:18:18:18 | lit-index s | exprs.go:18:18:18:18 | lit-init s | +| exprs.go:18:18:18:18 | lit-init s | exprs.go:18:21:18:21 | Before s | +| exprs.go:18:18:18:18 | s | exprs.go:18:18:18:18 | After s | +| exprs.go:18:21:18:21 | After s | exprs.go:18:21:18:21 | lit-index s | +| exprs.go:18:21:18:21 | Before s | exprs.go:18:21:18:21 | s | +| exprs.go:18:21:18:21 | lit-index s | exprs.go:18:21:18:21 | lit-init s | +| exprs.go:18:21:18:21 | lit-init s | exprs.go:18:9:18:22 | After slice literal | +| exprs.go:18:21:18:21 | s | exprs.go:18:21:18:21 | After s | +| exprs.go:19:2:19:38 | ... := ... | exprs.go:19:8:19:38 | Before map literal | +| exprs.go:19:2:19:38 | After ... := ... | exprs.go:20:2:20:19 | ... := ... | +| exprs.go:19:2:19:38 | assign:0 ... := ... | exprs.go:19:2:19:38 | After ... := ... | +| exprs.go:19:8:19:38 | After map literal | exprs.go:19:2:19:38 | assign:0 ... := ... | +| exprs.go:19:8:19:38 | Before map literal | exprs.go:19:8:19:38 | map literal | +| exprs.go:19:8:19:38 | map literal | exprs.go:19:23:19:37 | Before key-value pair | +| exprs.go:19:23:19:25 | After slc | exprs.go:19:27:19:27 | Before 0 | +| exprs.go:19:23:19:25 | Before slc | exprs.go:19:23:19:25 | slc | +| exprs.go:19:23:19:25 | slc | exprs.go:19:23:19:25 | After slc | +| exprs.go:19:23:19:28 | After index expression | exprs.go:19:31:19:37 | Before index expression | +| exprs.go:19:23:19:28 | Before index expression | exprs.go:19:23:19:25 | Before slc | +| exprs.go:19:23:19:28 | index expression | exprs.go:5:1:26:1 | Exceptional Exit | +| exprs.go:19:23:19:28 | index expression | exprs.go:19:23:19:28 | After index expression | +| exprs.go:19:23:19:37 | After key-value pair | exprs.go:19:23:19:37 | lit-init key-value pair | +| exprs.go:19:23:19:37 | Before key-value pair | exprs.go:19:23:19:28 | Before index expression | +| exprs.go:19:23:19:37 | key-value pair | exprs.go:19:23:19:37 | After key-value pair | +| exprs.go:19:23:19:37 | lit-init key-value pair | exprs.go:19:8:19:38 | After map literal | +| exprs.go:19:27:19:27 | 0 | exprs.go:19:27:19:27 | After 0 | +| exprs.go:19:27:19:27 | After 0 | exprs.go:19:23:19:28 | index expression | +| exprs.go:19:27:19:27 | Before 0 | exprs.go:19:27:19:27 | 0 | +| exprs.go:19:31:19:34 | After arr2 | exprs.go:19:36:19:36 | Before 1 | +| exprs.go:19:31:19:34 | Before arr2 | exprs.go:19:31:19:34 | arr2 | +| exprs.go:19:31:19:34 | arr2 | exprs.go:19:31:19:34 | After arr2 | +| exprs.go:19:31:19:37 | After index expression | exprs.go:19:23:19:37 | key-value pair | +| exprs.go:19:31:19:37 | Before index expression | exprs.go:19:31:19:34 | Before arr2 | +| exprs.go:19:31:19:37 | index expression | exprs.go:5:1:26:1 | Exceptional Exit | +| exprs.go:19:31:19:37 | index expression | exprs.go:19:31:19:37 | After index expression | +| exprs.go:19:36:19:36 | 1 | exprs.go:19:36:19:36 | After 1 | +| exprs.go:19:36:19:36 | After 1 | exprs.go:19:31:19:37 | index expression | +| exprs.go:19:36:19:36 | Before 1 | exprs.go:19:36:19:36 | 1 | +| exprs.go:20:2:20:19 | ... := ... | exprs.go:20:10:20:19 | Before slice expression | +| exprs.go:20:2:20:19 | After ... := ... | exprs.go:21:2:21:19 | ... := ... | +| exprs.go:20:2:20:19 | assign:0 ... := ... | exprs.go:20:2:20:19 | After ... := ... | +| exprs.go:20:10:20:12 | After slc | exprs.go:20:14:20:14 | Before 1 | +| exprs.go:20:10:20:12 | Before slc | exprs.go:20:10:20:12 | slc | +| exprs.go:20:10:20:12 | slc | exprs.go:20:10:20:12 | After slc | +| exprs.go:20:10:20:19 | After slice expression | exprs.go:20:2:20:19 | assign:0 ... := ... | +| exprs.go:20:10:20:19 | Before slice expression | exprs.go:20:10:20:12 | Before slc | +| exprs.go:20:10:20:19 | slice expression | exprs.go:20:10:20:19 | After slice expression | +| exprs.go:20:14:20:14 | 1 | exprs.go:20:14:20:14 | After 1 | +| exprs.go:20:14:20:14 | After 1 | exprs.go:20:16:20:16 | Before 2 | +| exprs.go:20:14:20:14 | Before 1 | exprs.go:20:14:20:14 | 1 | +| exprs.go:20:16:20:16 | 2 | exprs.go:20:16:20:16 | After 2 | +| exprs.go:20:16:20:16 | After 2 | exprs.go:20:18:20:18 | Before 3 | +| exprs.go:20:16:20:16 | Before 2 | exprs.go:20:16:20:16 | 2 | +| exprs.go:20:18:20:18 | 3 | exprs.go:20:18:20:18 | After 3 | +| exprs.go:20:18:20:18 | After 3 | exprs.go:20:10:20:19 | slice expression | +| exprs.go:20:18:20:18 | Before 3 | exprs.go:20:18:20:18 | 3 | +| exprs.go:21:2:21:19 | ... := ... | exprs.go:21:10:21:19 | Before slice expression | +| exprs.go:21:2:21:19 | After ... := ... | exprs.go:22:2:22:18 | ... := ... | +| exprs.go:21:2:21:19 | assign:0 ... := ... | exprs.go:21:2:21:19 | After ... := ... | +| exprs.go:21:10:21:13 | After slc2 | exprs.go:21:10:21:19 | implicit-low slice expression | +| exprs.go:21:10:21:13 | Before slc2 | exprs.go:21:10:21:13 | slc2 | +| exprs.go:21:10:21:13 | slc2 | exprs.go:21:10:21:13 | After slc2 | +| exprs.go:21:10:21:19 | After slice expression | exprs.go:21:2:21:19 | assign:0 ... := ... | +| exprs.go:21:10:21:19 | Before slice expression | exprs.go:21:10:21:13 | Before slc2 | +| exprs.go:21:10:21:19 | implicit-low slice expression | exprs.go:21:16:21:16 | Before 2 | +| exprs.go:21:10:21:19 | slice expression | exprs.go:21:10:21:19 | After slice expression | +| exprs.go:21:16:21:16 | 2 | exprs.go:21:16:21:16 | After 2 | +| exprs.go:21:16:21:16 | After 2 | exprs.go:21:18:21:18 | Before 3 | +| exprs.go:21:16:21:16 | Before 2 | exprs.go:21:16:21:16 | 2 | +| exprs.go:21:18:21:18 | 3 | exprs.go:21:18:21:18 | After 3 | +| exprs.go:21:18:21:18 | After 3 | exprs.go:21:10:21:19 | slice expression | +| exprs.go:21:18:21:18 | Before 3 | exprs.go:21:18:21:18 | 3 | +| exprs.go:22:2:22:18 | ... := ... | exprs.go:22:10:22:18 | Before slice expression | +| exprs.go:22:2:22:18 | After ... := ... | exprs.go:23:2:23:17 | ... := ... | +| exprs.go:22:2:22:18 | assign:0 ... := ... | exprs.go:22:2:22:18 | After ... := ... | +| exprs.go:22:10:22:13 | After slc3 | exprs.go:22:15:22:15 | Before 0 | +| exprs.go:22:10:22:13 | Before slc3 | exprs.go:22:10:22:13 | slc3 | +| exprs.go:22:10:22:13 | slc3 | exprs.go:22:10:22:13 | After slc3 | +| exprs.go:22:10:22:18 | After slice expression | exprs.go:22:2:22:18 | assign:0 ... := ... | +| exprs.go:22:10:22:18 | Before slice expression | exprs.go:22:10:22:13 | Before slc3 | +| exprs.go:22:10:22:18 | implicit-max slice expression | exprs.go:22:10:22:18 | slice expression | +| exprs.go:22:10:22:18 | slice expression | exprs.go:22:10:22:18 | After slice expression | +| exprs.go:22:15:22:15 | 0 | exprs.go:22:15:22:15 | After 0 | +| exprs.go:22:15:22:15 | After 0 | exprs.go:22:17:22:17 | Before 2 | +| exprs.go:22:15:22:15 | Before 0 | exprs.go:22:15:22:15 | 0 | +| exprs.go:22:17:22:17 | 2 | exprs.go:22:17:22:17 | After 2 | +| exprs.go:22:17:22:17 | After 2 | exprs.go:22:10:22:18 | implicit-max slice expression | +| exprs.go:22:17:22:17 | Before 2 | exprs.go:22:17:22:17 | 2 | +| exprs.go:23:2:23:17 | ... := ... | exprs.go:23:10:23:17 | Before slice expression | +| exprs.go:23:2:23:17 | After ... := ... | exprs.go:24:2:24:17 | ... := ... | +| exprs.go:23:2:23:17 | assign:0 ... := ... | exprs.go:23:2:23:17 | After ... := ... | +| exprs.go:23:10:23:13 | After slc4 | exprs.go:23:15:23:15 | Before 0 | +| exprs.go:23:10:23:13 | Before slc4 | exprs.go:23:10:23:13 | slc4 | +| exprs.go:23:10:23:13 | slc4 | exprs.go:23:10:23:13 | After slc4 | +| exprs.go:23:10:23:17 | After slice expression | exprs.go:23:2:23:17 | assign:0 ... := ... | +| exprs.go:23:10:23:17 | Before slice expression | exprs.go:23:10:23:13 | Before slc4 | +| exprs.go:23:10:23:17 | implicit-high slice expression | exprs.go:23:10:23:17 | implicit-max slice expression | +| exprs.go:23:10:23:17 | implicit-max slice expression | exprs.go:23:10:23:17 | slice expression | +| exprs.go:23:10:23:17 | slice expression | exprs.go:23:10:23:17 | After slice expression | +| exprs.go:23:15:23:15 | 0 | exprs.go:23:15:23:15 | After 0 | +| exprs.go:23:15:23:15 | After 0 | exprs.go:23:10:23:17 | implicit-high slice expression | +| exprs.go:23:15:23:15 | Before 0 | exprs.go:23:15:23:15 | 0 | +| exprs.go:24:2:24:17 | ... := ... | exprs.go:24:10:24:17 | Before slice expression | +| exprs.go:24:2:24:17 | After ... := ... | exprs.go:25:2:25:34 | Before return statement | +| exprs.go:24:2:24:17 | assign:0 ... := ... | exprs.go:24:2:24:17 | After ... := ... | +| exprs.go:24:10:24:13 | After slc5 | exprs.go:24:10:24:17 | implicit-low slice expression | +| exprs.go:24:10:24:13 | Before slc5 | exprs.go:24:10:24:13 | slc5 | +| exprs.go:24:10:24:13 | slc5 | exprs.go:24:10:24:13 | After slc5 | +| exprs.go:24:10:24:17 | After slice expression | exprs.go:24:2:24:17 | assign:0 ... := ... | +| exprs.go:24:10:24:17 | Before slice expression | exprs.go:24:10:24:13 | Before slc5 | +| exprs.go:24:10:24:17 | implicit-low slice expression | exprs.go:24:16:24:16 | Before 2 | +| exprs.go:24:10:24:17 | implicit-max slice expression | exprs.go:24:10:24:17 | slice expression | +| exprs.go:24:10:24:17 | slice expression | exprs.go:24:10:24:17 | After slice expression | +| exprs.go:24:16:24:16 | 2 | exprs.go:24:16:24:16 | After 2 | +| exprs.go:24:16:24:16 | After 2 | exprs.go:24:10:24:17 | implicit-max slice expression | +| exprs.go:24:16:24:16 | Before 2 | exprs.go:24:16:24:16 | 2 | +| exprs.go:25:2:25:34 | Before return statement | exprs.go:25:9:25:34 | Before struct literal | +| exprs.go:25:2:25:34 | return statement | exprs.go:5:1:26:1 | Normal Exit | +| exprs.go:25:9:25:34 | After struct literal | exprs.go:25:2:25:34 | return statement | +| exprs.go:25:9:25:34 | Before struct literal | exprs.go:25:9:25:34 | struct literal | +| exprs.go:25:9:25:34 | struct literal | exprs.go:25:15:25:19 | Before index expression | +| exprs.go:25:15:25:16 | After mp | exprs.go:25:18:25:18 | Before s | +| exprs.go:25:15:25:16 | Before mp | exprs.go:25:15:25:16 | mp | +| exprs.go:25:15:25:16 | mp | exprs.go:25:15:25:16 | After mp | +| exprs.go:25:15:25:19 | After index expression | exprs.go:25:15:25:19 | lit-init index expression | +| exprs.go:25:15:25:19 | Before index expression | exprs.go:25:15:25:16 | Before mp | +| exprs.go:25:15:25:19 | index expression | exprs.go:5:1:26:1 | Exceptional Exit | +| exprs.go:25:15:25:19 | index expression | exprs.go:25:15:25:19 | After index expression | +| exprs.go:25:15:25:19 | lit-init index expression | exprs.go:25:22:25:33 | Before call to len | +| exprs.go:25:18:25:18 | After s | exprs.go:25:15:25:19 | index expression | +| exprs.go:25:18:25:18 | Before s | exprs.go:25:18:25:18 | s | +| exprs.go:25:18:25:18 | s | exprs.go:25:18:25:18 | After s | +| exprs.go:25:22:25:24 | After len | exprs.go:25:26:25:32 | Before index expression | +| exprs.go:25:22:25:24 | Before len | exprs.go:25:22:25:24 | len | +| exprs.go:25:22:25:24 | len | exprs.go:25:22:25:24 | After len | +| exprs.go:25:22:25:33 | After call to len | exprs.go:25:22:25:33 | lit-init call to len | +| exprs.go:25:22:25:33 | Before call to len | exprs.go:25:22:25:24 | Before len | +| exprs.go:25:22:25:33 | call to len | exprs.go:25:22:25:33 | After call to len | +| exprs.go:25:22:25:33 | lit-init call to len | exprs.go:25:9:25:34 | After struct literal | +| exprs.go:25:26:25:29 | After slc6 | exprs.go:25:31:25:31 | Before 0 | +| exprs.go:25:26:25:29 | Before slc6 | exprs.go:25:26:25:29 | slc6 | +| exprs.go:25:26:25:29 | slc6 | exprs.go:25:26:25:29 | After slc6 | +| exprs.go:25:26:25:32 | After index expression | exprs.go:25:22:25:33 | call to len | +| exprs.go:25:26:25:32 | Before index expression | exprs.go:25:26:25:29 | Before slc6 | +| exprs.go:25:26:25:32 | index expression | exprs.go:5:1:26:1 | Exceptional Exit | +| exprs.go:25:26:25:32 | index expression | exprs.go:25:26:25:32 | After index expression | +| exprs.go:25:31:25:31 | 0 | exprs.go:25:31:25:31 | After 0 | +| exprs.go:25:31:25:31 | After 0 | exprs.go:25:26:25:32 | index expression | +| exprs.go:25:31:25:31 | Before 0 | exprs.go:25:31:25:31 | 0 | +| exprs.go:28:1:30:1 | After function declaration | exprs.go:32:1:37:1 | Before function declaration | +| exprs.go:28:1:30:1 | Before function declaration | exprs.go:28:1:30:1 | function declaration | +| exprs.go:28:1:30:1 | Entry | exprs.go:28:12:28:14 | arg | +| exprs.go:28:1:30:1 | Exceptional Exit | exprs.go:28:1:30:1 | Exit | +| exprs.go:28:1:30:1 | Normal Exit | exprs.go:28:1:30:1 | Exit | +| exprs.go:28:1:30:1 | function declaration | exprs.go:28:1:30:1 | After function declaration | +| exprs.go:28:12:28:14 | arg | exprs.go:28:33:30:1 | block statement | +| exprs.go:28:33:30:1 | block statement | exprs.go:29:2:29:21 | Before return statement | +| exprs.go:29:2:29:21 | Before return statement | exprs.go:29:9:29:21 | Before selection of x | +| exprs.go:29:2:29:21 | return statement | exprs.go:28:1:30:1 | Normal Exit | +| exprs.go:29:9:29:11 | After arg | exprs.go:29:9:29:19 | type assertion | +| exprs.go:29:9:29:11 | Before arg | exprs.go:29:9:29:11 | arg | +| exprs.go:29:9:29:11 | arg | exprs.go:29:9:29:11 | After arg | +| exprs.go:29:9:29:19 | After type assertion | exprs.go:29:9:29:21 | selection of x | +| exprs.go:29:9:29:19 | Before type assertion | exprs.go:29:9:29:11 | Before arg | +| exprs.go:29:9:29:19 | type assertion | exprs.go:28:1:30:1 | Exceptional Exit | +| exprs.go:29:9:29:19 | type assertion | exprs.go:29:9:29:19 | After type assertion | +| exprs.go:29:9:29:21 | After selection of x | exprs.go:29:2:29:21 | return statement | +| exprs.go:29:9:29:21 | Before selection of x | exprs.go:29:9:29:19 | Before type assertion | +| exprs.go:29:9:29:21 | selection of x | exprs.go:29:9:29:21 | After selection of x | +| exprs.go:32:1:37:1 | After function declaration | exprs.go:39:1:47:1 | Before function declaration | +| exprs.go:32:1:37:1 | Before function declaration | exprs.go:32:1:37:1 | function declaration | +| exprs.go:32:1:37:1 | Entry | exprs.go:32:12:32:14 | arg | +| exprs.go:32:1:37:1 | Normal Exit | exprs.go:32:1:37:1 | Exit | +| exprs.go:32:1:37:1 | function declaration | exprs.go:32:1:37:1 | After function declaration | +| exprs.go:32:12:32:14 | arg | exprs.go:32:33:37:1 | block statement | +| exprs.go:32:33:37:1 | block statement | exprs.go:33:2:35:2 | if statement | +| exprs.go:33:2:35:2 | After if statement | exprs.go:36:2:36:10 | Before return statement | +| exprs.go:33:2:35:2 | if statement | exprs.go:33:5:33:24 | ... := ... | +| exprs.go:33:5:33:24 | ... := ... | exprs.go:33:14:33:24 | Before type assertion | +| exprs.go:33:5:33:24 | After ... := ... | exprs.go:33:27:33:28 | Before ok | | exprs.go:33:5:33:24 | assign:0 ... := ... | exprs.go:33:5:33:24 | extract:1 ... := ... | -| exprs.go:33:5:33:24 | assign:1 ... := ... | exprs.go:33:27:33:28 | ok | +| exprs.go:33:5:33:24 | assign:1 ... := ... | exprs.go:33:5:33:24 | After ... := ... | | exprs.go:33:5:33:24 | extract:0 ... := ... | exprs.go:33:5:33:24 | assign:0 ... := ... | | exprs.go:33:5:33:24 | extract:1 ... := ... | exprs.go:33:5:33:24 | assign:1 ... := ... | -| exprs.go:33:8:33:9 | skip | exprs.go:33:14:33:16 | arg | -| exprs.go:33:14:33:16 | arg | exprs.go:33:14:33:24 | type assertion | -| exprs.go:33:14:33:24 | type assertion | exprs.go:33:5:33:24 | extract:0 ... := ... | -| exprs.go:33:27:33:28 | ok | exprs.go:33:27:33:28 | ok is false | -| exprs.go:33:27:33:28 | ok | exprs.go:33:27:33:28 | ok is true | -| exprs.go:33:27:33:28 | ok is false | exprs.go:36:9:36:10 | -... | -| exprs.go:33:27:33:28 | ok is true | exprs.go:34:10:34:10 | p | -| exprs.go:34:3:34:12 | return statement | exprs.go:32:1:37:1 | exit | -| exprs.go:34:10:34:10 | p | exprs.go:34:10:34:12 | selection of x | -| exprs.go:34:10:34:12 | selection of x | exprs.go:34:3:34:12 | return statement | -| exprs.go:36:2:36:10 | return statement | exprs.go:32:1:37:1 | exit | -| exprs.go:36:9:36:10 | -... | exprs.go:36:2:36:10 | return statement | -| exprs.go:39:1:47:1 | entry | exprs.go:39:12:39:14 | arg | -| exprs.go:39:1:47:1 | function declaration | exprs.go:49:6:49:8 | skip | -| exprs.go:39:6:39:10 | skip | exprs.go:39:1:47:1 | function declaration | -| exprs.go:39:12:39:14 | arg | exprs.go:39:12:39:14 | arg | -| exprs.go:39:12:39:14 | arg | exprs.go:40:6:40:6 | skip | -| exprs.go:40:6:40:6 | skip | exprs.go:40:6:40:12 | zero-init:0 value declaration specifier | -| exprs.go:40:6:40:12 | assign:0 value declaration specifier | exprs.go:41:6:41:7 | skip | +| exprs.go:33:14:33:16 | After arg | exprs.go:33:14:33:24 | type assertion | +| exprs.go:33:14:33:16 | Before arg | exprs.go:33:14:33:16 | arg | +| exprs.go:33:14:33:16 | arg | exprs.go:33:14:33:16 | After arg | +| exprs.go:33:14:33:24 | After type assertion | exprs.go:33:5:33:24 | extract:0 ... := ... | +| exprs.go:33:14:33:24 | Before type assertion | exprs.go:33:14:33:16 | Before arg | +| exprs.go:33:14:33:24 | type assertion | exprs.go:33:14:33:24 | After type assertion | +| exprs.go:33:27:33:28 | After ok [false] | exprs.go:33:2:35:2 | After if statement | +| exprs.go:33:27:33:28 | After ok [true] | exprs.go:33:30:35:2 | block statement | +| exprs.go:33:27:33:28 | Before ok | exprs.go:33:27:33:28 | ok | +| exprs.go:33:27:33:28 | ok | exprs.go:33:27:33:28 | After ok [false] | +| exprs.go:33:27:33:28 | ok | exprs.go:33:27:33:28 | After ok [true] | +| exprs.go:33:30:35:2 | block statement | exprs.go:34:3:34:12 | Before return statement | +| exprs.go:34:3:34:12 | Before return statement | exprs.go:34:10:34:12 | Before selection of x | +| exprs.go:34:3:34:12 | return statement | exprs.go:32:1:37:1 | Normal Exit | +| exprs.go:34:10:34:10 | After p | exprs.go:34:10:34:12 | selection of x | +| exprs.go:34:10:34:10 | Before p | exprs.go:34:10:34:10 | p | +| exprs.go:34:10:34:10 | p | exprs.go:34:10:34:10 | After p | +| exprs.go:34:10:34:12 | After selection of x | exprs.go:34:3:34:12 | return statement | +| exprs.go:34:10:34:12 | Before selection of x | exprs.go:34:10:34:10 | Before p | +| exprs.go:34:10:34:12 | selection of x | exprs.go:34:10:34:12 | After selection of x | +| exprs.go:36:2:36:10 | Before return statement | exprs.go:36:9:36:10 | Before -... | +| exprs.go:36:2:36:10 | return statement | exprs.go:32:1:37:1 | Normal Exit | +| exprs.go:36:9:36:10 | -... | exprs.go:36:9:36:10 | After -... | +| exprs.go:36:9:36:10 | After -... | exprs.go:36:2:36:10 | return statement | +| exprs.go:36:9:36:10 | Before -... | exprs.go:36:10:36:10 | Before 1 | +| exprs.go:36:10:36:10 | 1 | exprs.go:36:10:36:10 | After 1 | +| exprs.go:36:10:36:10 | After 1 | exprs.go:36:9:36:10 | -... | +| exprs.go:36:10:36:10 | Before 1 | exprs.go:36:10:36:10 | 1 | +| exprs.go:39:1:47:1 | After function declaration | exprs.go:49:1:54:1 | Before function declaration | +| exprs.go:39:1:47:1 | Before function declaration | exprs.go:39:1:47:1 | function declaration | +| exprs.go:39:1:47:1 | Entry | exprs.go:39:12:39:14 | arg | +| exprs.go:39:1:47:1 | Normal Exit | exprs.go:39:1:47:1 | Exit | +| exprs.go:39:1:47:1 | function declaration | exprs.go:39:1:47:1 | After function declaration | +| exprs.go:39:12:39:14 | arg | exprs.go:39:33:47:1 | block statement | +| exprs.go:39:33:47:1 | block statement | exprs.go:40:2:40:12 | declaration statement | +| exprs.go:40:2:40:12 | After declaration statement | exprs.go:41:2:41:12 | declaration statement | +| exprs.go:40:2:40:12 | After variable declaration | exprs.go:40:2:40:12 | After declaration statement | +| exprs.go:40:2:40:12 | declaration statement | exprs.go:40:2:40:12 | variable declaration | +| exprs.go:40:2:40:12 | variable declaration | exprs.go:40:6:40:12 | value declaration specifier | +| exprs.go:40:6:40:12 | After value declaration specifier | exprs.go:40:2:40:12 | After variable declaration | +| exprs.go:40:6:40:12 | assign:0 value declaration specifier | exprs.go:40:6:40:12 | After value declaration specifier | +| exprs.go:40:6:40:12 | value declaration specifier | exprs.go:40:6:40:12 | zero-init:0 value declaration specifier | | exprs.go:40:6:40:12 | zero-init:0 value declaration specifier | exprs.go:40:6:40:12 | assign:0 value declaration specifier | -| exprs.go:41:6:41:7 | skip | exprs.go:41:6:41:12 | zero-init:0 value declaration specifier | -| exprs.go:41:6:41:12 | assign:0 value declaration specifier | exprs.go:42:2:42:2 | skip | +| exprs.go:41:2:41:12 | After declaration statement | exprs.go:42:2:42:20 | ... = ... | +| exprs.go:41:2:41:12 | After variable declaration | exprs.go:41:2:41:12 | After declaration statement | +| exprs.go:41:2:41:12 | declaration statement | exprs.go:41:2:41:12 | variable declaration | +| exprs.go:41:2:41:12 | variable declaration | exprs.go:41:6:41:12 | value declaration specifier | +| exprs.go:41:6:41:12 | After value declaration specifier | exprs.go:41:2:41:12 | After variable declaration | +| exprs.go:41:6:41:12 | assign:0 value declaration specifier | exprs.go:41:6:41:12 | After value declaration specifier | +| exprs.go:41:6:41:12 | value declaration specifier | exprs.go:41:6:41:12 | zero-init:0 value declaration specifier | | exprs.go:41:6:41:12 | zero-init:0 value declaration specifier | exprs.go:41:6:41:12 | assign:0 value declaration specifier | -| exprs.go:42:2:42:2 | skip | exprs.go:42:5:42:6 | skip | +| exprs.go:42:2:42:20 | ... = ... | exprs.go:42:10:42:20 | Before type assertion | +| exprs.go:42:2:42:20 | After ... = ... | exprs.go:43:2:45:2 | if statement | | exprs.go:42:2:42:20 | assign:0 ... = ... | exprs.go:42:2:42:20 | extract:1 ... = ... | -| exprs.go:42:2:42:20 | assign:1 ... = ... | exprs.go:43:5:43:6 | ok | +| exprs.go:42:2:42:20 | assign:1 ... = ... | exprs.go:42:2:42:20 | After ... = ... | | exprs.go:42:2:42:20 | extract:0 ... = ... | exprs.go:42:2:42:20 | assign:0 ... = ... | | exprs.go:42:2:42:20 | extract:1 ... = ... | exprs.go:42:2:42:20 | assign:1 ... = ... | -| exprs.go:42:5:42:6 | skip | exprs.go:42:10:42:12 | arg | -| exprs.go:42:10:42:12 | arg | exprs.go:42:10:42:20 | type assertion | -| exprs.go:42:10:42:20 | type assertion | exprs.go:42:2:42:20 | extract:0 ... = ... | -| exprs.go:43:5:43:6 | ok | exprs.go:43:5:43:6 | ok is false | -| exprs.go:43:5:43:6 | ok | exprs.go:43:5:43:6 | ok is true | -| exprs.go:43:5:43:6 | ok is false | exprs.go:46:9:46:10 | -... | -| exprs.go:43:5:43:6 | ok is true | exprs.go:44:10:44:10 | p | -| exprs.go:44:3:44:12 | return statement | exprs.go:39:1:47:1 | exit | -| exprs.go:44:10:44:10 | p | exprs.go:44:10:44:12 | selection of x | -| exprs.go:44:10:44:12 | selection of x | exprs.go:44:3:44:12 | return statement | -| exprs.go:46:2:46:10 | return statement | exprs.go:39:1:47:1 | exit | -| exprs.go:46:9:46:10 | -... | exprs.go:46:2:46:10 | return statement | -| exprs.go:49:1:54:1 | entry | exprs.go:49:10:49:11 | xs | -| exprs.go:49:1:54:1 | function declaration | exprs.go:56:6:56:9 | skip | -| exprs.go:49:6:49:8 | skip | exprs.go:49:1:54:1 | function declaration | -| exprs.go:49:10:49:11 | xs | exprs.go:49:10:49:11 | xs | -| exprs.go:49:10:49:11 | xs | exprs.go:49:30:54:1 | result-zero-init:0 block statement | -| exprs.go:49:30:54:1 | result-init:0 block statement | exprs.go:50:6:50:6 | skip | -| exprs.go:49:30:54:1 | result-read:0 block statement | exprs.go:49:1:54:1 | exit | +| exprs.go:42:10:42:12 | After arg | exprs.go:42:10:42:20 | type assertion | +| exprs.go:42:10:42:12 | Before arg | exprs.go:42:10:42:12 | arg | +| exprs.go:42:10:42:12 | arg | exprs.go:42:10:42:12 | After arg | +| exprs.go:42:10:42:20 | After type assertion | exprs.go:42:2:42:20 | extract:0 ... = ... | +| exprs.go:42:10:42:20 | Before type assertion | exprs.go:42:10:42:12 | Before arg | +| exprs.go:42:10:42:20 | type assertion | exprs.go:42:10:42:20 | After type assertion | +| exprs.go:43:2:45:2 | After if statement | exprs.go:46:2:46:10 | Before return statement | +| exprs.go:43:2:45:2 | if statement | exprs.go:43:5:43:6 | Before ok | +| exprs.go:43:5:43:6 | After ok [false] | exprs.go:43:2:45:2 | After if statement | +| exprs.go:43:5:43:6 | After ok [true] | exprs.go:43:8:45:2 | block statement | +| exprs.go:43:5:43:6 | Before ok | exprs.go:43:5:43:6 | ok | +| exprs.go:43:5:43:6 | ok | exprs.go:43:5:43:6 | After ok [false] | +| exprs.go:43:5:43:6 | ok | exprs.go:43:5:43:6 | After ok [true] | +| exprs.go:43:8:45:2 | block statement | exprs.go:44:3:44:12 | Before return statement | +| exprs.go:44:3:44:12 | Before return statement | exprs.go:44:10:44:12 | Before selection of x | +| exprs.go:44:3:44:12 | return statement | exprs.go:39:1:47:1 | Normal Exit | +| exprs.go:44:10:44:10 | After p | exprs.go:44:10:44:12 | selection of x | +| exprs.go:44:10:44:10 | Before p | exprs.go:44:10:44:10 | p | +| exprs.go:44:10:44:10 | p | exprs.go:44:10:44:10 | After p | +| exprs.go:44:10:44:12 | After selection of x | exprs.go:44:3:44:12 | return statement | +| exprs.go:44:10:44:12 | Before selection of x | exprs.go:44:10:44:10 | Before p | +| exprs.go:44:10:44:12 | selection of x | exprs.go:44:10:44:12 | After selection of x | +| exprs.go:46:2:46:10 | Before return statement | exprs.go:46:9:46:10 | Before -... | +| exprs.go:46:2:46:10 | return statement | exprs.go:39:1:47:1 | Normal Exit | +| exprs.go:46:9:46:10 | -... | exprs.go:46:9:46:10 | After -... | +| exprs.go:46:9:46:10 | After -... | exprs.go:46:2:46:10 | return statement | +| exprs.go:46:9:46:10 | Before -... | exprs.go:46:10:46:10 | Before 1 | +| exprs.go:46:10:46:10 | 1 | exprs.go:46:10:46:10 | After 1 | +| exprs.go:46:10:46:10 | After 1 | exprs.go:46:9:46:10 | -... | +| exprs.go:46:10:46:10 | Before 1 | exprs.go:46:10:46:10 | 1 | +| exprs.go:49:1:54:1 | After function declaration | exprs.go:56:1:58:1 | Before function declaration | +| exprs.go:49:1:54:1 | Before function declaration | exprs.go:49:1:54:1 | function declaration | +| exprs.go:49:1:54:1 | Entry | exprs.go:49:10:49:11 | xs | +| exprs.go:49:1:54:1 | Exceptional Exit | exprs.go:49:1:54:1 | Exit | +| exprs.go:49:1:54:1 | Normal Exit | exprs.go:49:1:54:1 | Exit | +| exprs.go:49:1:54:1 | function declaration | exprs.go:49:1:54:1 | After function declaration | +| exprs.go:49:10:49:11 | xs | exprs.go:49:30:54:1 | block statement | +| exprs.go:49:30:54:1 | block statement | exprs.go:49:30:54:1 | result-zero-init:0 block statement | +| exprs.go:49:30:54:1 | result-init:0 block statement | exprs.go:50:2:52:2 | for statement | +| exprs.go:49:30:54:1 | result-read:0 block statement | exprs.go:49:1:54:1 | Normal Exit | | exprs.go:49:30:54:1 | result-zero-init:0 block statement | exprs.go:49:30:54:1 | result-init:0 block statement | -| exprs.go:50:6:50:6 | skip | exprs.go:50:11:50:11 | 0 | -| exprs.go:50:6:50:11 | assign:0 ... := ... | exprs.go:50:14:50:14 | i | -| exprs.go:50:11:50:11 | 0 | exprs.go:50:6:50:11 | assign:0 ... := ... | -| exprs.go:50:14:50:14 | i | exprs.go:50:18:50:20 | len | -| exprs.go:50:14:50:24 | ...<... | exprs.go:50:14:50:24 | ...<... is false | -| exprs.go:50:14:50:24 | ...<... | exprs.go:50:14:50:24 | ...<... is true | -| exprs.go:50:14:50:24 | ...<... is false | exprs.go:53:2:53:7 | return statement | -| exprs.go:50:14:50:24 | ...<... is true | exprs.go:51:3:51:5 | res | -| exprs.go:50:18:50:20 | len | exprs.go:50:22:50:23 | xs | -| exprs.go:50:18:50:24 | call to len | exprs.go:50:14:50:24 | ...<... | -| exprs.go:50:22:50:23 | xs | exprs.go:50:18:50:24 | call to len | -| exprs.go:50:27:50:27 | i | exprs.go:50:27:50:29 | 1 | -| exprs.go:50:27:50:29 | 1 | exprs.go:50:27:50:29 | incdec-rhs increment statement | +| exprs.go:50:2:52:2 | After for statement | exprs.go:53:2:53:7 | Before return statement | +| exprs.go:50:2:52:2 | [LoopHeader] for statement | exprs.go:50:27:50:29 | Before increment statement | +| exprs.go:50:2:52:2 | for statement | exprs.go:50:6:50:11 | ... := ... | +| exprs.go:50:6:50:11 | ... := ... | exprs.go:50:11:50:11 | Before 0 | +| exprs.go:50:6:50:11 | After ... := ... | exprs.go:50:14:50:24 | Before ...<... | +| exprs.go:50:6:50:11 | assign:0 ... := ... | exprs.go:50:6:50:11 | After ... := ... | +| exprs.go:50:11:50:11 | 0 | exprs.go:50:11:50:11 | After 0 | +| exprs.go:50:11:50:11 | After 0 | exprs.go:50:6:50:11 | assign:0 ... := ... | +| exprs.go:50:11:50:11 | Before 0 | exprs.go:50:11:50:11 | 0 | +| exprs.go:50:14:50:14 | After i | exprs.go:50:18:50:24 | Before call to len | +| exprs.go:50:14:50:14 | Before i | exprs.go:50:14:50:14 | i | +| exprs.go:50:14:50:14 | i | exprs.go:50:14:50:14 | After i | +| exprs.go:50:14:50:24 | ...<... | exprs.go:50:14:50:24 | After ...<... [false] | +| exprs.go:50:14:50:24 | ...<... | exprs.go:50:14:50:24 | After ...<... [true] | +| exprs.go:50:14:50:24 | After ...<... [false] | exprs.go:50:2:52:2 | After for statement | +| exprs.go:50:14:50:24 | After ...<... [true] | exprs.go:50:31:52:2 | block statement | +| exprs.go:50:14:50:24 | Before ...<... | exprs.go:50:14:50:14 | Before i | +| exprs.go:50:18:50:20 | After len | exprs.go:50:22:50:23 | Before xs | +| exprs.go:50:18:50:20 | Before len | exprs.go:50:18:50:20 | len | +| exprs.go:50:18:50:20 | len | exprs.go:50:18:50:20 | After len | +| exprs.go:50:18:50:24 | After call to len | exprs.go:50:14:50:24 | ...<... | +| exprs.go:50:18:50:24 | Before call to len | exprs.go:50:18:50:20 | Before len | +| exprs.go:50:18:50:24 | call to len | exprs.go:50:18:50:24 | After call to len | +| exprs.go:50:22:50:23 | After xs | exprs.go:50:18:50:24 | call to len | +| exprs.go:50:22:50:23 | Before xs | exprs.go:50:22:50:23 | xs | +| exprs.go:50:22:50:23 | xs | exprs.go:50:22:50:23 | After xs | +| exprs.go:50:27:50:27 | After i | exprs.go:50:27:50:29 | implicit-one increment statement | +| exprs.go:50:27:50:27 | Before i | exprs.go:50:27:50:27 | i | +| exprs.go:50:27:50:27 | i | exprs.go:50:27:50:27 | After i | +| exprs.go:50:27:50:29 | After increment statement | exprs.go:50:14:50:24 | Before ...<... | +| exprs.go:50:27:50:29 | Before increment statement | exprs.go:50:27:50:27 | Before i | +| exprs.go:50:27:50:29 | implicit-one increment statement | exprs.go:50:27:50:29 | incdec-rhs increment statement | | exprs.go:50:27:50:29 | incdec-rhs increment statement | exprs.go:50:27:50:29 | increment statement | -| exprs.go:50:27:50:29 | increment statement | exprs.go:50:14:50:14 | i | -| exprs.go:51:3:51:5 | res | exprs.go:51:10:51:11 | xs | -| exprs.go:51:3:51:14 | assign:0 ... += ... | exprs.go:50:27:50:27 | i | +| exprs.go:50:27:50:29 | increment statement | exprs.go:50:27:50:29 | After increment statement | +| exprs.go:50:31:52:2 | After block statement | exprs.go:50:2:52:2 | [LoopHeader] for statement | +| exprs.go:50:31:52:2 | block statement | exprs.go:51:3:51:14 | ... += ... | +| exprs.go:51:3:51:5 | After res | exprs.go:51:10:51:14 | Before index expression | +| exprs.go:51:3:51:5 | Before res | exprs.go:51:3:51:5 | res | +| exprs.go:51:3:51:5 | res | exprs.go:51:3:51:5 | After res | +| exprs.go:51:3:51:14 | ... += ... | exprs.go:51:3:51:5 | Before res | +| exprs.go:51:3:51:14 | After ... += ... | exprs.go:50:31:52:2 | After block statement | +| exprs.go:51:3:51:14 | assign:0 ... += ... | exprs.go:51:3:51:14 | After ... += ... | | exprs.go:51:3:51:14 | compound-rhs ... += ... | exprs.go:51:3:51:14 | assign:0 ... += ... | -| exprs.go:51:10:51:11 | xs | exprs.go:51:13:51:13 | i | -| exprs.go:51:10:51:14 | index expression | exprs.go:49:1:54:1 | exit | -| exprs.go:51:10:51:14 | index expression | exprs.go:51:3:51:14 | compound-rhs ... += ... | -| exprs.go:51:13:51:13 | i | exprs.go:51:10:51:14 | index expression | +| exprs.go:51:10:51:11 | After xs | exprs.go:51:13:51:13 | Before i | +| exprs.go:51:10:51:11 | Before xs | exprs.go:51:10:51:11 | xs | +| exprs.go:51:10:51:11 | xs | exprs.go:51:10:51:11 | After xs | +| exprs.go:51:10:51:14 | After index expression | exprs.go:51:3:51:14 | compound-rhs ... += ... | +| exprs.go:51:10:51:14 | Before index expression | exprs.go:51:10:51:11 | Before xs | +| exprs.go:51:10:51:14 | index expression | exprs.go:49:1:54:1 | Exceptional Exit | +| exprs.go:51:10:51:14 | index expression | exprs.go:51:10:51:14 | After index expression | +| exprs.go:51:13:51:13 | After i | exprs.go:51:10:51:14 | index expression | +| exprs.go:51:13:51:13 | Before i | exprs.go:51:13:51:13 | i | +| exprs.go:51:13:51:13 | i | exprs.go:51:13:51:13 | After i | +| exprs.go:53:2:53:7 | Before return statement | exprs.go:53:2:53:7 | return statement | | exprs.go:53:2:53:7 | return statement | exprs.go:49:30:54:1 | result-read:0 block statement | -| exprs.go:56:1:58:1 | entry | exprs.go:56:11:56:12 | xs | -| exprs.go:56:1:58:1 | function declaration | exprs.go:60:6:60:9 | skip | -| exprs.go:56:6:56:9 | skip | exprs.go:56:1:58:1 | function declaration | -| exprs.go:56:11:56:12 | xs | exprs.go:56:11:56:12 | xs | -| exprs.go:56:11:56:12 | xs | exprs.go:57:9:57:11 | sum | -| exprs.go:57:2:57:15 | return statement | exprs.go:56:1:58:1 | exit | -| exprs.go:57:9:57:11 | sum | exprs.go:57:13:57:14 | xs | -| exprs.go:57:9:57:15 | call to sum | exprs.go:56:1:58:1 | exit | -| exprs.go:57:9:57:15 | call to sum | exprs.go:57:2:57:15 | return statement | -| exprs.go:57:13:57:14 | xs | exprs.go:57:9:57:15 | call to sum | -| exprs.go:60:1:62:1 | entry | exprs.go:61:9:61:22 | slice literal | -| exprs.go:60:1:62:1 | function declaration | exprs.go:64:5:64:5 | skip | -| exprs.go:60:6:60:9 | skip | exprs.go:60:1:62:1 | function declaration | -| exprs.go:61:2:61:22 | return statement | exprs.go:60:1:62:1 | exit | -| exprs.go:61:9:61:22 | slice literal | exprs.go:61:15:61:15 | element index | -| exprs.go:61:15:61:15 | 1 | exprs.go:61:15:61:15 | lit-init 1 | -| exprs.go:61:15:61:15 | element index | exprs.go:61:15:61:15 | 1 | -| exprs.go:61:15:61:15 | lit-init 1 | exprs.go:61:18:61:18 | element index | -| exprs.go:61:18:61:18 | 2 | exprs.go:61:18:61:18 | lit-init 2 | -| exprs.go:61:18:61:18 | element index | exprs.go:61:18:61:18 | 2 | -| exprs.go:61:18:61:18 | lit-init 2 | exprs.go:61:21:61:21 | element index | -| exprs.go:61:21:61:21 | 3 | exprs.go:61:21:61:21 | lit-init 3 | -| exprs.go:61:21:61:21 | element index | exprs.go:61:21:61:21 | 3 | -| exprs.go:61:21:61:21 | lit-init 3 | exprs.go:61:2:61:22 | return statement | -| exprs.go:64:5:64:5 | skip | exprs.go:64:9:64:11 | sum | -| exprs.go:64:5:64:19 | assign:0 value declaration specifier | exprs.go:65:5:65:6 | skip | -| exprs.go:64:9:64:11 | sum | exprs.go:64:13:64:16 | ints | -| exprs.go:64:9:64:19 | call to sum | exprs.go:0:0:0:0 | exit | -| exprs.go:64:9:64:19 | call to sum | exprs.go:64:5:64:19 | assign:0 value declaration specifier | -| exprs.go:64:13:64:16 | ints | exprs.go:64:13:64:18 | call to ints | -| exprs.go:64:13:64:18 | call to ints | exprs.go:0:0:0:0 | exit | -| exprs.go:64:13:64:18 | call to ints | exprs.go:64:9:64:19 | call to sum | -| exprs.go:65:5:65:6 | skip | exprs.go:65:10:65:13 | sum2 | -| exprs.go:65:5:65:24 | assign:0 value declaration specifier | exprs.go:67:6:67:8 | skip | -| exprs.go:65:10:65:13 | sum2 | exprs.go:65:15:65:18 | ints | -| exprs.go:65:10:65:24 | call to sum2 | exprs.go:0:0:0:0 | exit | -| exprs.go:65:10:65:24 | call to sum2 | exprs.go:65:5:65:24 | assign:0 value declaration specifier | -| exprs.go:65:15:65:18 | ints | exprs.go:65:15:65:20 | call to ints | -| exprs.go:65:15:65:20 | call to ints | exprs.go:0:0:0:0 | exit | -| exprs.go:65:15:65:20 | call to ints | exprs.go:65:10:65:24 | call to sum2 | -| exprs.go:67:1:69:1 | entry | exprs.go:67:10:67:10 | x | -| exprs.go:67:1:69:1 | function declaration | exprs.go:71:6:71:8 | skip | -| exprs.go:67:6:67:8 | skip | exprs.go:67:1:69:1 | function declaration | -| exprs.go:67:10:67:10 | x | exprs.go:67:10:67:10 | x | +| exprs.go:56:1:58:1 | After function declaration | exprs.go:60:1:62:1 | Before function declaration | +| exprs.go:56:1:58:1 | Before function declaration | exprs.go:56:1:58:1 | function declaration | +| exprs.go:56:1:58:1 | Entry | exprs.go:56:11:56:12 | xs | +| exprs.go:56:1:58:1 | Exceptional Exit | exprs.go:56:1:58:1 | Exit | +| exprs.go:56:1:58:1 | Normal Exit | exprs.go:56:1:58:1 | Exit | +| exprs.go:56:1:58:1 | function declaration | exprs.go:56:1:58:1 | After function declaration | +| exprs.go:56:11:56:12 | xs | exprs.go:56:26:58:1 | block statement | +| exprs.go:56:26:58:1 | block statement | exprs.go:57:2:57:15 | Before return statement | +| exprs.go:57:2:57:15 | Before return statement | exprs.go:57:9:57:15 | Before call to sum | +| exprs.go:57:2:57:15 | return statement | exprs.go:56:1:58:1 | Normal Exit | +| exprs.go:57:9:57:11 | After sum | exprs.go:57:13:57:14 | Before xs | +| exprs.go:57:9:57:11 | Before sum | exprs.go:57:9:57:11 | sum | +| exprs.go:57:9:57:11 | sum | exprs.go:57:9:57:11 | After sum | +| exprs.go:57:9:57:15 | After call to sum | exprs.go:57:2:57:15 | return statement | +| exprs.go:57:9:57:15 | Before call to sum | exprs.go:57:9:57:11 | Before sum | +| exprs.go:57:9:57:15 | call to sum | exprs.go:56:1:58:1 | Exceptional Exit | +| exprs.go:57:9:57:15 | call to sum | exprs.go:57:9:57:15 | After call to sum | +| exprs.go:57:13:57:14 | After xs | exprs.go:57:9:57:15 | call to sum | +| exprs.go:57:13:57:14 | Before xs | exprs.go:57:13:57:14 | xs | +| exprs.go:57:13:57:14 | xs | exprs.go:57:13:57:14 | After xs | +| exprs.go:60:1:62:1 | After function declaration | exprs.go:64:1:64:19 | variable declaration | +| exprs.go:60:1:62:1 | Before function declaration | exprs.go:60:1:62:1 | function declaration | +| exprs.go:60:1:62:1 | Entry | exprs.go:60:19:62:1 | block statement | +| exprs.go:60:1:62:1 | Normal Exit | exprs.go:60:1:62:1 | Exit | +| exprs.go:60:1:62:1 | function declaration | exprs.go:60:1:62:1 | After function declaration | +| exprs.go:60:19:62:1 | block statement | exprs.go:61:2:61:22 | Before return statement | +| exprs.go:61:2:61:22 | Before return statement | exprs.go:61:9:61:22 | Before slice literal | +| exprs.go:61:2:61:22 | return statement | exprs.go:60:1:62:1 | Normal Exit | +| exprs.go:61:9:61:22 | After slice literal | exprs.go:61:2:61:22 | return statement | +| exprs.go:61:9:61:22 | Before slice literal | exprs.go:61:9:61:22 | slice literal | +| exprs.go:61:9:61:22 | slice literal | exprs.go:61:15:61:15 | Before 1 | +| exprs.go:61:15:61:15 | 1 | exprs.go:61:15:61:15 | After 1 | +| exprs.go:61:15:61:15 | After 1 | exprs.go:61:15:61:15 | lit-index 1 | +| exprs.go:61:15:61:15 | Before 1 | exprs.go:61:15:61:15 | 1 | +| exprs.go:61:15:61:15 | lit-index 1 | exprs.go:61:15:61:15 | lit-init 1 | +| exprs.go:61:15:61:15 | lit-init 1 | exprs.go:61:18:61:18 | Before 2 | +| exprs.go:61:18:61:18 | 2 | exprs.go:61:18:61:18 | After 2 | +| exprs.go:61:18:61:18 | After 2 | exprs.go:61:18:61:18 | lit-index 2 | +| exprs.go:61:18:61:18 | Before 2 | exprs.go:61:18:61:18 | 2 | +| exprs.go:61:18:61:18 | lit-index 2 | exprs.go:61:18:61:18 | lit-init 2 | +| exprs.go:61:18:61:18 | lit-init 2 | exprs.go:61:21:61:21 | Before 3 | +| exprs.go:61:21:61:21 | 3 | exprs.go:61:21:61:21 | After 3 | +| exprs.go:61:21:61:21 | After 3 | exprs.go:61:21:61:21 | lit-index 3 | +| exprs.go:61:21:61:21 | Before 3 | exprs.go:61:21:61:21 | 3 | +| exprs.go:61:21:61:21 | lit-index 3 | exprs.go:61:21:61:21 | lit-init 3 | +| exprs.go:61:21:61:21 | lit-init 3 | exprs.go:61:9:61:22 | After slice literal | +| exprs.go:64:1:64:19 | After variable declaration | exprs.go:65:1:65:24 | variable declaration | +| exprs.go:64:1:64:19 | variable declaration | exprs.go:64:5:64:19 | value declaration specifier | +| exprs.go:64:5:64:19 | After value declaration specifier | exprs.go:64:1:64:19 | After variable declaration | +| exprs.go:64:5:64:19 | assign:0 value declaration specifier | exprs.go:64:5:64:19 | After value declaration specifier | +| exprs.go:64:5:64:19 | value declaration specifier | exprs.go:64:9:64:19 | Before call to sum | +| exprs.go:64:9:64:11 | After sum | exprs.go:64:13:64:18 | Before call to ints | +| exprs.go:64:9:64:11 | Before sum | exprs.go:64:9:64:11 | sum | +| exprs.go:64:9:64:11 | sum | exprs.go:64:9:64:11 | After sum | +| exprs.go:64:9:64:19 | After call to sum | exprs.go:64:5:64:19 | assign:0 value declaration specifier | +| exprs.go:64:9:64:19 | Before call to sum | exprs.go:64:9:64:11 | Before sum | +| exprs.go:64:9:64:19 | call to sum | exprs.go:0:0:0:0 | Exceptional Exit | +| exprs.go:64:9:64:19 | call to sum | exprs.go:64:9:64:19 | After call to sum | +| exprs.go:64:13:64:16 | After ints | exprs.go:64:13:64:18 | call to ints | +| exprs.go:64:13:64:16 | Before ints | exprs.go:64:13:64:16 | ints | +| exprs.go:64:13:64:16 | ints | exprs.go:64:13:64:16 | After ints | +| exprs.go:64:13:64:18 | After call to ints | exprs.go:64:9:64:19 | call to sum | +| exprs.go:64:13:64:18 | Before call to ints | exprs.go:64:13:64:16 | Before ints | +| exprs.go:64:13:64:18 | call to ints | exprs.go:0:0:0:0 | Exceptional Exit | +| exprs.go:64:13:64:18 | call to ints | exprs.go:64:13:64:18 | After call to ints | +| exprs.go:65:1:65:24 | After variable declaration | exprs.go:67:1:69:1 | Before function declaration | +| exprs.go:65:1:65:24 | variable declaration | exprs.go:65:5:65:24 | value declaration specifier | +| exprs.go:65:5:65:24 | After value declaration specifier | exprs.go:65:1:65:24 | After variable declaration | +| exprs.go:65:5:65:24 | assign:0 value declaration specifier | exprs.go:65:5:65:24 | After value declaration specifier | +| exprs.go:65:5:65:24 | value declaration specifier | exprs.go:65:10:65:24 | Before call to sum2 | +| exprs.go:65:10:65:13 | After sum2 | exprs.go:65:15:65:20 | Before call to ints | +| exprs.go:65:10:65:13 | Before sum2 | exprs.go:65:10:65:13 | sum2 | +| exprs.go:65:10:65:13 | sum2 | exprs.go:65:10:65:13 | After sum2 | +| exprs.go:65:10:65:24 | After call to sum2 | exprs.go:65:5:65:24 | assign:0 value declaration specifier | +| exprs.go:65:10:65:24 | Before call to sum2 | exprs.go:65:10:65:13 | Before sum2 | +| exprs.go:65:10:65:24 | call to sum2 | exprs.go:0:0:0:0 | Exceptional Exit | +| exprs.go:65:10:65:24 | call to sum2 | exprs.go:65:10:65:24 | After call to sum2 | +| exprs.go:65:15:65:18 | After ints | exprs.go:65:15:65:20 | call to ints | +| exprs.go:65:15:65:18 | Before ints | exprs.go:65:15:65:18 | ints | +| exprs.go:65:15:65:18 | ints | exprs.go:65:15:65:18 | After ints | +| exprs.go:65:15:65:20 | After call to ints | exprs.go:65:10:65:24 | call to sum2 | +| exprs.go:65:15:65:20 | Before call to ints | exprs.go:65:15:65:18 | Before ints | +| exprs.go:65:15:65:20 | call to ints | exprs.go:0:0:0:0 | Exceptional Exit | +| exprs.go:65:15:65:20 | call to ints | exprs.go:65:15:65:20 | After call to ints | +| exprs.go:67:1:69:1 | After function declaration | exprs.go:71:1:73:1 | Before function declaration | +| exprs.go:67:1:69:1 | Before function declaration | exprs.go:67:1:69:1 | function declaration | +| exprs.go:67:1:69:1 | Entry | exprs.go:67:10:67:10 | x | +| exprs.go:67:1:69:1 | Normal Exit | exprs.go:67:1:69:1 | Exit | +| exprs.go:67:1:69:1 | function declaration | exprs.go:67:1:69:1 | After function declaration | | exprs.go:67:10:67:10 | x | exprs.go:67:13:67:13 | y | -| exprs.go:67:13:67:13 | y | exprs.go:67:13:67:13 | y | -| exprs.go:67:13:67:13 | y | exprs.go:68:9:68:9 | x | -| exprs.go:68:2:68:13 | return statement | exprs.go:67:1:69:1 | exit | -| exprs.go:68:9:68:9 | x | exprs.go:68:13:68:13 | y | -| exprs.go:68:9:68:13 | ...+... | exprs.go:68:2:68:13 | return statement | -| exprs.go:68:13:68:13 | y | exprs.go:68:9:68:13 | ...+... | -| exprs.go:71:1:73:1 | entry | exprs.go:72:9:72:9 | 1 | -| exprs.go:71:1:73:1 | function declaration | exprs.go:75:5:75:6 | skip | -| exprs.go:71:6:71:8 | skip | exprs.go:71:1:73:1 | function declaration | -| exprs.go:72:2:72:12 | return statement | exprs.go:71:1:73:1 | exit | -| exprs.go:72:9:72:9 | 1 | exprs.go:72:12:72:12 | 2 | -| exprs.go:72:12:72:12 | 2 | exprs.go:72:2:72:12 | return statement | -| exprs.go:75:5:75:6 | skip | exprs.go:75:10:75:12 | add | -| exprs.go:75:5:75:19 | assign:0 value declaration specifier | exprs.go:77:6:77:10 | skip | -| exprs.go:75:10:75:12 | add | exprs.go:75:14:75:16 | gen | -| exprs.go:75:10:75:19 | call to add | exprs.go:0:0:0:0 | exit | -| exprs.go:75:10:75:19 | call to add | exprs.go:75:5:75:19 | assign:0 value declaration specifier | +| exprs.go:67:13:67:13 | y | exprs.go:67:24:69:1 | block statement | +| exprs.go:67:24:69:1 | block statement | exprs.go:68:2:68:13 | Before return statement | +| exprs.go:68:2:68:13 | Before return statement | exprs.go:68:9:68:13 | Before ...+... | +| exprs.go:68:2:68:13 | return statement | exprs.go:67:1:69:1 | Normal Exit | +| exprs.go:68:9:68:9 | After x | exprs.go:68:13:68:13 | Before y | +| exprs.go:68:9:68:9 | Before x | exprs.go:68:9:68:9 | x | +| exprs.go:68:9:68:9 | x | exprs.go:68:9:68:9 | After x | +| exprs.go:68:9:68:13 | ...+... | exprs.go:68:9:68:13 | After ...+... | +| exprs.go:68:9:68:13 | After ...+... | exprs.go:68:2:68:13 | return statement | +| exprs.go:68:9:68:13 | Before ...+... | exprs.go:68:9:68:9 | Before x | +| exprs.go:68:13:68:13 | After y | exprs.go:68:9:68:13 | ...+... | +| exprs.go:68:13:68:13 | Before y | exprs.go:68:13:68:13 | y | +| exprs.go:68:13:68:13 | y | exprs.go:68:13:68:13 | After y | +| exprs.go:71:1:73:1 | After function declaration | exprs.go:75:1:75:19 | variable declaration | +| exprs.go:71:1:73:1 | Before function declaration | exprs.go:71:1:73:1 | function declaration | +| exprs.go:71:1:73:1 | Entry | exprs.go:71:23:73:1 | block statement | +| exprs.go:71:1:73:1 | Normal Exit | exprs.go:71:1:73:1 | Exit | +| exprs.go:71:1:73:1 | function declaration | exprs.go:71:1:73:1 | After function declaration | +| exprs.go:71:23:73:1 | block statement | exprs.go:72:2:72:12 | Before return statement | +| exprs.go:72:2:72:12 | Before return statement | exprs.go:72:9:72:9 | Before 1 | +| exprs.go:72:2:72:12 | return statement | exprs.go:71:1:73:1 | Normal Exit | +| exprs.go:72:9:72:9 | 1 | exprs.go:72:9:72:9 | After 1 | +| exprs.go:72:9:72:9 | After 1 | exprs.go:72:12:72:12 | Before 2 | +| exprs.go:72:9:72:9 | Before 1 | exprs.go:72:9:72:9 | 1 | +| exprs.go:72:12:72:12 | 2 | exprs.go:72:12:72:12 | After 2 | +| exprs.go:72:12:72:12 | After 2 | exprs.go:72:2:72:12 | return statement | +| exprs.go:72:12:72:12 | Before 2 | exprs.go:72:12:72:12 | 2 | +| exprs.go:75:1:75:19 | After variable declaration | exprs.go:77:1:79:1 | Before function declaration | +| exprs.go:75:1:75:19 | variable declaration | exprs.go:75:5:75:19 | value declaration specifier | +| exprs.go:75:5:75:19 | After value declaration specifier | exprs.go:75:1:75:19 | After variable declaration | +| exprs.go:75:5:75:19 | assign:0 value declaration specifier | exprs.go:75:5:75:19 | After value declaration specifier | +| exprs.go:75:5:75:19 | value declaration specifier | exprs.go:75:10:75:19 | Before call to add | +| exprs.go:75:10:75:12 | After add | exprs.go:75:14:75:18 | Before call to gen | +| exprs.go:75:10:75:12 | Before add | exprs.go:75:10:75:12 | add | +| exprs.go:75:10:75:12 | add | exprs.go:75:10:75:12 | After add | +| exprs.go:75:10:75:19 | After call to add | exprs.go:75:5:75:19 | assign:0 value declaration specifier | +| exprs.go:75:10:75:19 | Before call to add | exprs.go:75:10:75:12 | Before add | +| exprs.go:75:10:75:19 | call to add | exprs.go:0:0:0:0 | Exceptional Exit | +| exprs.go:75:10:75:19 | call to add | exprs.go:75:10:75:19 | After call to add | | exprs.go:75:10:75:19 | extract:0 call to add | exprs.go:75:10:75:19 | extract:1 call to add | | exprs.go:75:10:75:19 | extract:1 call to add | exprs.go:75:10:75:19 | call to add | -| exprs.go:75:14:75:16 | gen | exprs.go:75:14:75:18 | call to gen | -| exprs.go:75:14:75:18 | call to gen | exprs.go:0:0:0:0 | exit | -| exprs.go:75:14:75:18 | call to gen | exprs.go:75:10:75:19 | extract:0 call to add | -| exprs.go:77:1:79:1 | entry | exprs.go:77:12:77:12 | x | -| exprs.go:77:1:79:1 | function declaration | exprs.go:81:6:81:16 | skip | -| exprs.go:77:6:77:10 | skip | exprs.go:77:1:79:1 | function declaration | -| exprs.go:77:12:77:12 | x | exprs.go:77:12:77:12 | x | +| exprs.go:75:14:75:16 | After gen | exprs.go:75:14:75:18 | call to gen | +| exprs.go:75:14:75:16 | Before gen | exprs.go:75:14:75:16 | gen | +| exprs.go:75:14:75:16 | gen | exprs.go:75:14:75:16 | After gen | +| exprs.go:75:14:75:18 | After call to gen | exprs.go:75:10:75:19 | extract:0 call to add | +| exprs.go:75:14:75:18 | Before call to gen | exprs.go:75:14:75:16 | Before gen | +| exprs.go:75:14:75:18 | call to gen | exprs.go:0:0:0:0 | Exceptional Exit | +| exprs.go:75:14:75:18 | call to gen | exprs.go:75:14:75:18 | After call to gen | +| exprs.go:77:1:79:1 | After function declaration | exprs.go:81:1:87:1 | Before function declaration | +| exprs.go:77:1:79:1 | Before function declaration | exprs.go:77:1:79:1 | function declaration | +| exprs.go:77:1:79:1 | Entry | exprs.go:77:12:77:12 | x | +| exprs.go:77:1:79:1 | Normal Exit | exprs.go:77:1:79:1 | Exit | +| exprs.go:77:1:79:1 | function declaration | exprs.go:77:1:79:1 | After function declaration | | exprs.go:77:12:77:12 | x | exprs.go:77:15:77:15 | y | -| exprs.go:77:15:77:15 | y | exprs.go:77:15:77:15 | y | | exprs.go:77:15:77:15 | y | exprs.go:77:18:77:18 | z | -| exprs.go:77:18:77:18 | z | exprs.go:77:18:77:18 | z | -| exprs.go:77:18:77:18 | z | exprs.go:78:11:78:11 | x | -| exprs.go:78:2:78:22 | return statement | exprs.go:77:1:79:1 | exit | -| exprs.go:78:9:78:17 | !... | exprs.go:78:9:78:17 | !... is false | -| exprs.go:78:9:78:17 | !... | exprs.go:78:9:78:17 | !... is true | -| exprs.go:78:9:78:17 | !... is false | exprs.go:78:22:78:22 | z | -| exprs.go:78:9:78:17 | !... is true | exprs.go:78:9:78:22 | ...\|\|... | -| exprs.go:78:9:78:22 | ...\|\|... | exprs.go:78:2:78:22 | return statement | -| exprs.go:78:11:78:11 | x | exprs.go:78:11:78:11 | x is false | -| exprs.go:78:11:78:11 | x | exprs.go:78:11:78:11 | x is true | -| exprs.go:78:11:78:11 | x is false | exprs.go:78:11:78:16 | ...&&... | -| exprs.go:78:11:78:11 | x is true | exprs.go:78:16:78:16 | y | -| exprs.go:78:11:78:16 | ...&&... | exprs.go:78:9:78:17 | !... | -| exprs.go:78:16:78:16 | y | exprs.go:78:11:78:16 | ...&&... | -| exprs.go:78:22:78:22 | z | exprs.go:78:9:78:22 | ...\|\|... | -| exprs.go:81:1:87:1 | entry | exprs.go:81:18:81:19 | ch | -| exprs.go:81:1:87:1 | function declaration | exprs.go:89:7:89:9 | skip | -| exprs.go:81:6:81:16 | skip | exprs.go:81:1:87:1 | function declaration | -| exprs.go:81:18:81:19 | ch | exprs.go:81:18:81:19 | ch | -| exprs.go:81:18:81:19 | ch | exprs.go:82:2:82:4 | skip | -| exprs.go:82:2:82:4 | skip | exprs.go:82:7:82:8 | skip | +| exprs.go:77:18:77:18 | z | exprs.go:77:31:79:1 | block statement | +| exprs.go:77:31:79:1 | block statement | exprs.go:78:2:78:22 | Before return statement | +| exprs.go:78:2:78:22 | Before return statement | exprs.go:78:9:78:22 | ...\|\|... | +| exprs.go:78:2:78:22 | return statement | exprs.go:77:1:79:1 | Normal Exit | +| exprs.go:78:9:78:17 | !... | exprs.go:78:10:78:17 | (...) | +| exprs.go:78:9:78:17 | After !... [false] | exprs.go:78:22:78:22 | Before z | +| exprs.go:78:9:78:17 | After !... [true] | exprs.go:78:9:78:22 | After ...\|\|... | +| exprs.go:78:9:78:22 | ...\|\|... | exprs.go:78:9:78:17 | !... | +| exprs.go:78:9:78:22 | After ...\|\|... | exprs.go:78:2:78:22 | return statement | +| exprs.go:78:10:78:17 | (...) | exprs.go:78:11:78:16 | ...&&... | +| exprs.go:78:10:78:17 | After (...) [false] | exprs.go:78:9:78:17 | After !... [true] | +| exprs.go:78:10:78:17 | After (...) [true] | exprs.go:78:9:78:17 | After !... [false] | +| exprs.go:78:11:78:11 | After x [false] | exprs.go:78:11:78:16 | After ...&&... [false] | +| exprs.go:78:11:78:11 | After x [true] | exprs.go:78:16:78:16 | Before y | +| exprs.go:78:11:78:11 | Before x | exprs.go:78:11:78:11 | x | +| exprs.go:78:11:78:11 | x | exprs.go:78:11:78:11 | After x [false] | +| exprs.go:78:11:78:11 | x | exprs.go:78:11:78:11 | After x [true] | +| exprs.go:78:11:78:16 | ...&&... | exprs.go:78:11:78:11 | Before x | +| exprs.go:78:11:78:16 | After ...&&... [false] | exprs.go:78:10:78:17 | After (...) [false] | +| exprs.go:78:11:78:16 | After ...&&... [true] | exprs.go:78:10:78:17 | After (...) [true] | +| exprs.go:78:16:78:16 | After y [false] | exprs.go:78:11:78:16 | After ...&&... [false] | +| exprs.go:78:16:78:16 | After y [true] | exprs.go:78:11:78:16 | After ...&&... [true] | +| exprs.go:78:16:78:16 | Before y | exprs.go:78:16:78:16 | y | +| exprs.go:78:16:78:16 | y | exprs.go:78:16:78:16 | After y [false] | +| exprs.go:78:16:78:16 | y | exprs.go:78:16:78:16 | After y [true] | +| exprs.go:78:22:78:22 | After z | exprs.go:78:9:78:22 | After ...\|\|... | +| exprs.go:78:22:78:22 | Before z | exprs.go:78:22:78:22 | z | +| exprs.go:78:22:78:22 | z | exprs.go:78:22:78:22 | After z | +| exprs.go:81:1:87:1 | After function declaration | exprs.go:89:1:89:13 | constant declaration | +| exprs.go:81:1:87:1 | Before function declaration | exprs.go:81:1:87:1 | function declaration | +| exprs.go:81:1:87:1 | Entry | exprs.go:81:18:81:19 | ch | +| exprs.go:81:1:87:1 | Exceptional Exit | exprs.go:81:1:87:1 | Exit | +| exprs.go:81:1:87:1 | Normal Exit | exprs.go:81:1:87:1 | Exit | +| exprs.go:81:1:87:1 | function declaration | exprs.go:81:1:87:1 | After function declaration | +| exprs.go:81:18:81:19 | ch | exprs.go:81:35:87:1 | block statement | +| exprs.go:81:35:87:1 | block statement | exprs.go:82:2:82:16 | ... := ... | +| exprs.go:82:2:82:16 | ... := ... | exprs.go:82:13:82:16 | Before <-... | +| exprs.go:82:2:82:16 | After ... := ... | exprs.go:83:2:85:2 | if statement | | exprs.go:82:2:82:16 | assign:0 ... := ... | exprs.go:82:2:82:16 | extract:1 ... := ... | -| exprs.go:82:2:82:16 | assign:1 ... := ... | exprs.go:83:5:83:6 | ok | +| exprs.go:82:2:82:16 | assign:1 ... := ... | exprs.go:82:2:82:16 | After ... := ... | | exprs.go:82:2:82:16 | extract:0 ... := ... | exprs.go:82:2:82:16 | assign:0 ... := ... | | exprs.go:82:2:82:16 | extract:1 ... := ... | exprs.go:82:2:82:16 | assign:1 ... := ... | -| exprs.go:82:7:82:8 | skip | exprs.go:82:15:82:16 | ch | -| exprs.go:82:13:82:16 | <-... | exprs.go:82:2:82:16 | extract:0 ... := ... | -| exprs.go:82:15:82:16 | ch | exprs.go:82:13:82:16 | <-... | -| exprs.go:83:5:83:6 | ok | exprs.go:83:5:83:6 | ok is false | -| exprs.go:83:5:83:6 | ok | exprs.go:83:5:83:6 | ok is true | -| exprs.go:83:5:83:6 | ok is false | exprs.go:86:2:86:6 | panic | -| exprs.go:83:5:83:6 | ok is true | exprs.go:84:10:84:12 | val | -| exprs.go:84:3:84:12 | return statement | exprs.go:81:1:87:1 | exit | -| exprs.go:84:10:84:12 | val | exprs.go:84:3:84:12 | return statement | -| exprs.go:86:2:86:6 | panic | exprs.go:86:8:86:17 | "No value" | -| exprs.go:86:2:86:18 | call to panic | exprs.go:81:1:87:1 | exit | -| exprs.go:86:8:86:17 | "No value" | exprs.go:86:2:86:18 | call to panic | -| exprs.go:89:7:89:9 | skip | exprs.go:89:13:89:13 | 1 | -| exprs.go:89:7:89:13 | assign:0 value declaration specifier | exprs.go:91:5:91:5 | skip | -| exprs.go:89:13:89:13 | 1 | exprs.go:89:7:89:13 | assign:0 value declaration specifier | -| exprs.go:91:5:91:5 | skip | exprs.go:91:9:91:25 | slice literal | -| exprs.go:91:5:91:25 | assign:0 value declaration specifier | exprs.go:93:6:93:11 | skip | -| exprs.go:91:9:91:25 | slice literal | exprs.go:91:15:91:21 | ...+... | -| exprs.go:91:15:91:21 | ...+... | exprs.go:91:24:91:24 | 2 | -| exprs.go:91:15:91:24 | lit-init key-value pair | exprs.go:91:5:91:25 | assign:0 value declaration specifier | -| exprs.go:91:24:91:24 | 2 | exprs.go:91:15:91:24 | lit-init key-value pair | -| exprs.go:93:1:95:1 | entry | exprs.go:93:13:93:13 | x | -| exprs.go:93:1:95:1 | function declaration | exprs.go:0:0:0:0 | exit | -| exprs.go:93:6:93:11 | skip | exprs.go:93:1:95:1 | function declaration | -| exprs.go:93:13:93:13 | x | exprs.go:93:13:93:13 | x | +| exprs.go:82:13:82:16 | <-... | exprs.go:82:13:82:16 | After <-... | +| exprs.go:82:13:82:16 | After <-... | exprs.go:82:2:82:16 | extract:0 ... := ... | +| exprs.go:82:13:82:16 | Before <-... | exprs.go:82:15:82:16 | Before ch | +| exprs.go:82:15:82:16 | After ch | exprs.go:82:13:82:16 | <-... | +| exprs.go:82:15:82:16 | Before ch | exprs.go:82:15:82:16 | ch | +| exprs.go:82:15:82:16 | ch | exprs.go:82:15:82:16 | After ch | +| exprs.go:83:2:85:2 | After if statement | exprs.go:86:2:86:18 | expression statement | +| exprs.go:83:2:85:2 | if statement | exprs.go:83:5:83:6 | Before ok | +| exprs.go:83:5:83:6 | After ok [false] | exprs.go:83:2:85:2 | After if statement | +| exprs.go:83:5:83:6 | After ok [true] | exprs.go:83:8:85:2 | block statement | +| exprs.go:83:5:83:6 | Before ok | exprs.go:83:5:83:6 | ok | +| exprs.go:83:5:83:6 | ok | exprs.go:83:5:83:6 | After ok [false] | +| exprs.go:83:5:83:6 | ok | exprs.go:83:5:83:6 | After ok [true] | +| exprs.go:83:8:85:2 | block statement | exprs.go:84:3:84:12 | Before return statement | +| exprs.go:84:3:84:12 | Before return statement | exprs.go:84:10:84:12 | Before val | +| exprs.go:84:3:84:12 | return statement | exprs.go:81:1:87:1 | Normal Exit | +| exprs.go:84:10:84:12 | After val | exprs.go:84:3:84:12 | return statement | +| exprs.go:84:10:84:12 | Before val | exprs.go:84:10:84:12 | val | +| exprs.go:84:10:84:12 | val | exprs.go:84:10:84:12 | After val | +| exprs.go:86:2:86:6 | After panic | exprs.go:86:8:86:17 | Before "No value" | +| exprs.go:86:2:86:6 | Before panic | exprs.go:86:2:86:6 | panic | +| exprs.go:86:2:86:6 | panic | exprs.go:86:2:86:6 | After panic | +| exprs.go:86:2:86:18 | Before call to panic | exprs.go:86:2:86:6 | Before panic | +| exprs.go:86:2:86:18 | call to panic | exprs.go:81:1:87:1 | Exceptional Exit | +| exprs.go:86:2:86:18 | expression statement | exprs.go:86:2:86:18 | Before call to panic | +| exprs.go:86:8:86:17 | "No value" | exprs.go:86:8:86:17 | After "No value" | +| exprs.go:86:8:86:17 | After "No value" | exprs.go:86:2:86:18 | call to panic | +| exprs.go:86:8:86:17 | Before "No value" | exprs.go:86:8:86:17 | "No value" | +| exprs.go:89:1:89:13 | After constant declaration | exprs.go:91:1:91:25 | variable declaration | +| exprs.go:89:1:89:13 | constant declaration | exprs.go:89:7:89:13 | value declaration specifier | +| exprs.go:89:7:89:13 | After value declaration specifier | exprs.go:89:1:89:13 | After constant declaration | +| exprs.go:89:7:89:13 | assign:0 value declaration specifier | exprs.go:89:7:89:13 | After value declaration specifier | +| exprs.go:89:7:89:13 | value declaration specifier | exprs.go:89:13:89:13 | Before 1 | +| exprs.go:89:13:89:13 | 1 | exprs.go:89:13:89:13 | After 1 | +| exprs.go:89:13:89:13 | After 1 | exprs.go:89:7:89:13 | assign:0 value declaration specifier | +| exprs.go:89:13:89:13 | Before 1 | exprs.go:89:13:89:13 | 1 | +| exprs.go:91:1:91:25 | After variable declaration | exprs.go:93:1:95:1 | Before function declaration | +| exprs.go:91:1:91:25 | variable declaration | exprs.go:91:5:91:25 | value declaration specifier | +| exprs.go:91:5:91:25 | After value declaration specifier | exprs.go:91:1:91:25 | After variable declaration | +| exprs.go:91:5:91:25 | assign:0 value declaration specifier | exprs.go:91:5:91:25 | After value declaration specifier | +| exprs.go:91:5:91:25 | value declaration specifier | exprs.go:91:9:91:25 | Before slice literal | +| exprs.go:91:9:91:25 | After slice literal | exprs.go:91:5:91:25 | assign:0 value declaration specifier | +| exprs.go:91:9:91:25 | Before slice literal | exprs.go:91:9:91:25 | slice literal | +| exprs.go:91:9:91:25 | slice literal | exprs.go:91:15:91:24 | Before key-value pair | +| exprs.go:91:15:91:15 | 0 | exprs.go:91:15:91:15 | After 0 | +| exprs.go:91:15:91:15 | After 0 | exprs.go:91:19:91:21 | Before one | +| exprs.go:91:15:91:15 | Before 0 | exprs.go:91:15:91:15 | 0 | +| exprs.go:91:15:91:21 | ...+... | exprs.go:91:15:91:21 | After ...+... | +| exprs.go:91:15:91:21 | After ...+... | exprs.go:91:24:91:24 | Before 2 | +| exprs.go:91:15:91:21 | Before ...+... | exprs.go:91:15:91:15 | Before 0 | +| exprs.go:91:15:91:24 | After key-value pair | exprs.go:91:15:91:24 | lit-init key-value pair | +| exprs.go:91:15:91:24 | Before key-value pair | exprs.go:91:15:91:21 | Before ...+... | +| exprs.go:91:15:91:24 | key-value pair | exprs.go:91:15:91:24 | After key-value pair | +| exprs.go:91:15:91:24 | lit-init key-value pair | exprs.go:91:9:91:25 | After slice literal | +| exprs.go:91:19:91:21 | After one | exprs.go:91:15:91:21 | ...+... | +| exprs.go:91:19:91:21 | Before one | exprs.go:91:19:91:21 | one | +| exprs.go:91:19:91:21 | one | exprs.go:91:19:91:21 | After one | +| exprs.go:91:24:91:24 | 2 | exprs.go:91:24:91:24 | After 2 | +| exprs.go:91:24:91:24 | After 2 | exprs.go:91:15:91:24 | key-value pair | +| exprs.go:91:24:91:24 | Before 2 | exprs.go:91:24:91:24 | 2 | +| exprs.go:93:1:95:1 | After function declaration | exprs.go:0:0:0:0 | After exprs.go | +| exprs.go:93:1:95:1 | Before function declaration | exprs.go:93:1:95:1 | function declaration | +| exprs.go:93:1:95:1 | Entry | exprs.go:93:13:93:13 | x | +| exprs.go:93:1:95:1 | Normal Exit | exprs.go:93:1:95:1 | Exit | +| exprs.go:93:1:95:1 | function declaration | exprs.go:93:1:95:1 | After function declaration | | exprs.go:93:13:93:13 | x | exprs.go:93:16:93:16 | y | -| exprs.go:93:16:93:16 | y | exprs.go:93:16:93:16 | y | | exprs.go:93:16:93:16 | y | exprs.go:93:19:93:19 | z | -| exprs.go:93:19:93:19 | z | exprs.go:93:19:93:19 | z | -| exprs.go:93:19:93:19 | z | exprs.go:94:10:94:10 | x | -| exprs.go:94:2:94:21 | return statement | exprs.go:93:1:95:1 | exit | -| exprs.go:94:9:94:16 | (...) is false | exprs.go:94:21:94:21 | z | -| exprs.go:94:9:94:16 | (...) is true | exprs.go:94:9:94:21 | ...\|\|... | -| exprs.go:94:9:94:21 | ...\|\|... | exprs.go:94:2:94:21 | return statement | -| exprs.go:94:10:94:10 | x | exprs.go:94:10:94:10 | x is false | -| exprs.go:94:10:94:10 | x | exprs.go:94:10:94:10 | x is true | -| exprs.go:94:10:94:10 | x is false | exprs.go:94:9:94:16 | (...) is false | -| exprs.go:94:10:94:10 | x is true | exprs.go:94:15:94:15 | y | -| exprs.go:94:15:94:15 | y | exprs.go:94:9:94:16 | (...) is false | -| exprs.go:94:15:94:15 | y | exprs.go:94:9:94:16 | (...) is true | -| exprs.go:94:21:94:21 | z | exprs.go:94:9:94:21 | ...\|\|... | -| generic.go:0:0:0:0 | entry | generic.go:3:1:5:1 | skip | -| generic.go:3:1:5:1 | skip | generic.go:7:28:7:35 | skip | -| generic.go:7:1:7:55 | entry | generic.go:7:7:7:7 | g | -| generic.go:7:1:7:55 | function declaration | generic.go:9:1:12:1 | skip | -| generic.go:7:7:7:7 | g | generic.go:7:7:7:7 | g | +| exprs.go:93:19:93:19 | z | exprs.go:93:32:95:1 | block statement | +| exprs.go:93:32:95:1 | block statement | exprs.go:94:2:94:21 | Before return statement | +| exprs.go:94:2:94:21 | Before return statement | exprs.go:94:9:94:21 | ...\|\|... | +| exprs.go:94:2:94:21 | return statement | exprs.go:93:1:95:1 | Normal Exit | +| exprs.go:94:9:94:16 | (...) | exprs.go:94:10:94:15 | ...&&... | +| exprs.go:94:9:94:16 | After (...) [false] | exprs.go:94:21:94:21 | Before z | +| exprs.go:94:9:94:16 | After (...) [true] | exprs.go:94:9:94:21 | After ...\|\|... | +| exprs.go:94:9:94:21 | ...\|\|... | exprs.go:94:9:94:16 | (...) | +| exprs.go:94:9:94:21 | After ...\|\|... | exprs.go:94:2:94:21 | return statement | +| exprs.go:94:10:94:10 | After x [false] | exprs.go:94:10:94:15 | After ...&&... [false] | +| exprs.go:94:10:94:10 | After x [true] | exprs.go:94:15:94:15 | Before y | +| exprs.go:94:10:94:10 | Before x | exprs.go:94:10:94:10 | x | +| exprs.go:94:10:94:10 | x | exprs.go:94:10:94:10 | After x [false] | +| exprs.go:94:10:94:10 | x | exprs.go:94:10:94:10 | After x [true] | +| exprs.go:94:10:94:15 | ...&&... | exprs.go:94:10:94:10 | Before x | +| exprs.go:94:10:94:15 | After ...&&... [false] | exprs.go:94:9:94:16 | After (...) [false] | +| exprs.go:94:10:94:15 | After ...&&... [true] | exprs.go:94:9:94:16 | After (...) [true] | +| exprs.go:94:15:94:15 | After y [false] | exprs.go:94:10:94:15 | After ...&&... [false] | +| exprs.go:94:15:94:15 | After y [true] | exprs.go:94:10:94:15 | After ...&&... [true] | +| exprs.go:94:15:94:15 | Before y | exprs.go:94:15:94:15 | y | +| exprs.go:94:15:94:15 | y | exprs.go:94:15:94:15 | After y [false] | +| exprs.go:94:15:94:15 | y | exprs.go:94:15:94:15 | After y [true] | +| exprs.go:94:21:94:21 | After z | exprs.go:94:9:94:21 | After ...\|\|... | +| exprs.go:94:21:94:21 | Before z | exprs.go:94:21:94:21 | z | +| exprs.go:94:21:94:21 | z | exprs.go:94:21:94:21 | After z | +| generic.go:0:0:0:0 | After generic.go | generic.go:0:0:0:0 | Normal Exit | +| generic.go:0:0:0:0 | Entry | generic.go:0:0:0:0 | generic.go | +| generic.go:0:0:0:0 | Normal Exit | generic.go:0:0:0:0 | Exit | +| generic.go:0:0:0:0 | generic.go | generic.go:3:1:5:1 | type declaration | +| generic.go:3:1:5:1 | After type declaration | generic.go:7:1:7:55 | Before function declaration | +| generic.go:3:1:5:1 | type declaration | generic.go:3:6:5:1 | type declaration specifier | +| generic.go:3:6:5:1 | type declaration specifier | generic.go:3:1:5:1 | After type declaration | +| generic.go:7:1:7:55 | After function declaration | generic.go:9:1:12:1 | type declaration | +| generic.go:7:1:7:55 | Before function declaration | generic.go:7:1:7:55 | function declaration | +| generic.go:7:1:7:55 | Entry | generic.go:7:7:7:7 | g | +| generic.go:7:1:7:55 | Normal Exit | generic.go:7:1:7:55 | Exit | +| generic.go:7:1:7:55 | function declaration | generic.go:7:1:7:55 | After function declaration | | generic.go:7:7:7:7 | g | generic.go:7:37:7:37 | u | -| generic.go:7:28:7:35 | skip | generic.go:7:1:7:55 | function declaration | -| generic.go:7:37:7:37 | u | generic.go:7:37:7:37 | u | -| generic.go:7:37:7:37 | u | generic.go:7:53:7:53 | u | -| generic.go:7:46:7:53 | return statement | generic.go:7:1:7:55 | exit | -| generic.go:7:53:7:53 | u | generic.go:7:46:7:53 | return statement | -| generic.go:9:1:12:1 | skip | generic.go:14:31:14:39 | skip | -| generic.go:14:1:14:59 | entry | generic.go:14:7:14:7 | g | -| generic.go:14:1:14:59 | function declaration | generic.go:16:6:16:21 | skip | -| generic.go:14:7:14:7 | g | generic.go:14:7:14:7 | g | +| generic.go:7:37:7:37 | u | generic.go:7:44:7:55 | block statement | +| generic.go:7:44:7:55 | block statement | generic.go:7:46:7:53 | Before return statement | +| generic.go:7:46:7:53 | Before return statement | generic.go:7:53:7:53 | Before u | +| generic.go:7:46:7:53 | return statement | generic.go:7:1:7:55 | Normal Exit | +| generic.go:7:53:7:53 | After u | generic.go:7:46:7:53 | return statement | +| generic.go:7:53:7:53 | Before u | generic.go:7:53:7:53 | u | +| generic.go:7:53:7:53 | u | generic.go:7:53:7:53 | After u | +| generic.go:9:1:12:1 | After type declaration | generic.go:14:1:14:59 | Before function declaration | +| generic.go:9:1:12:1 | type declaration | generic.go:9:6:12:1 | type declaration specifier | +| generic.go:9:6:12:1 | type declaration specifier | generic.go:9:1:12:1 | After type declaration | +| generic.go:14:1:14:59 | After function declaration | generic.go:16:1:18:1 | Before function declaration | +| generic.go:14:1:14:59 | Before function declaration | generic.go:14:1:14:59 | function declaration | +| generic.go:14:1:14:59 | Entry | generic.go:14:7:14:7 | g | +| generic.go:14:1:14:59 | Normal Exit | generic.go:14:1:14:59 | Exit | +| generic.go:14:1:14:59 | function declaration | generic.go:14:1:14:59 | After function declaration | | generic.go:14:7:14:7 | g | generic.go:14:41:14:41 | u | -| generic.go:14:31:14:39 | skip | generic.go:14:1:14:59 | function declaration | -| generic.go:14:41:14:41 | u | generic.go:14:41:14:41 | u | -| generic.go:14:41:14:41 | u | generic.go:14:57:14:57 | u | -| generic.go:14:50:14:57 | return statement | generic.go:14:1:14:59 | exit | -| generic.go:14:57:14:57 | u | generic.go:14:50:14:57 | return statement | -| generic.go:16:1:18:1 | entry | generic.go:16:30:16:30 | t | -| generic.go:16:1:18:1 | function declaration | generic.go:20:6:20:21 | skip | -| generic.go:16:6:16:21 | skip | generic.go:16:1:18:1 | function declaration | -| generic.go:16:30:16:30 | t | generic.go:16:30:16:30 | t | -| generic.go:16:30:16:30 | t | generic.go:17:9:17:9 | t | -| generic.go:17:2:17:9 | return statement | generic.go:16:1:18:1 | exit | -| generic.go:17:9:17:9 | t | generic.go:17:2:17:9 | return statement | -| generic.go:20:1:22:1 | entry | generic.go:20:33:20:33 | s | -| generic.go:20:1:22:1 | function declaration | generic.go:24:6:24:12 | skip | -| generic.go:20:6:20:21 | skip | generic.go:20:1:22:1 | function declaration | -| generic.go:20:33:20:33 | s | generic.go:20:33:20:33 | s | +| generic.go:14:41:14:41 | u | generic.go:14:48:14:59 | block statement | +| generic.go:14:48:14:59 | block statement | generic.go:14:50:14:57 | Before return statement | +| generic.go:14:50:14:57 | Before return statement | generic.go:14:57:14:57 | Before u | +| generic.go:14:50:14:57 | return statement | generic.go:14:1:14:59 | Normal Exit | +| generic.go:14:57:14:57 | After u | generic.go:14:50:14:57 | return statement | +| generic.go:14:57:14:57 | Before u | generic.go:14:57:14:57 | u | +| generic.go:14:57:14:57 | u | generic.go:14:57:14:57 | After u | +| generic.go:16:1:18:1 | After function declaration | generic.go:20:1:22:1 | Before function declaration | +| generic.go:16:1:18:1 | Before function declaration | generic.go:16:1:18:1 | function declaration | +| generic.go:16:1:18:1 | Entry | generic.go:16:30:16:30 | t | +| generic.go:16:1:18:1 | Normal Exit | generic.go:16:1:18:1 | Exit | +| generic.go:16:1:18:1 | function declaration | generic.go:16:1:18:1 | After function declaration | +| generic.go:16:30:16:30 | t | generic.go:16:37:18:1 | block statement | +| generic.go:16:37:18:1 | block statement | generic.go:17:2:17:9 | Before return statement | +| generic.go:17:2:17:9 | Before return statement | generic.go:17:9:17:9 | Before t | +| generic.go:17:2:17:9 | return statement | generic.go:16:1:18:1 | Normal Exit | +| generic.go:17:9:17:9 | After t | generic.go:17:2:17:9 | return statement | +| generic.go:17:9:17:9 | Before t | generic.go:17:9:17:9 | t | +| generic.go:17:9:17:9 | t | generic.go:17:9:17:9 | After t | +| generic.go:20:1:22:1 | After function declaration | generic.go:24:1:35:1 | Before function declaration | +| generic.go:20:1:22:1 | Before function declaration | generic.go:20:1:22:1 | function declaration | +| generic.go:20:1:22:1 | Entry | generic.go:20:33:20:33 | s | +| generic.go:20:1:22:1 | Normal Exit | generic.go:20:1:22:1 | Exit | +| generic.go:20:1:22:1 | function declaration | generic.go:20:1:22:1 | After function declaration | | generic.go:20:33:20:33 | s | generic.go:20:38:20:38 | t | -| generic.go:20:38:20:38 | t | generic.go:20:38:20:38 | t | -| generic.go:20:38:20:38 | t | generic.go:21:9:21:9 | s | -| generic.go:21:2:21:12 | return statement | generic.go:20:1:22:1 | exit | -| generic.go:21:9:21:9 | s | generic.go:21:12:21:12 | t | -| generic.go:21:12:21:12 | t | generic.go:21:2:21:12 | return statement | -| generic.go:24:1:35:1 | entry | generic.go:25:2:25:4 | skip | -| generic.go:24:1:35:1 | function declaration | generic.go:0:0:0:0 | exit | -| generic.go:24:6:24:12 | skip | generic.go:24:1:35:1 | function declaration | -| generic.go:25:2:25:4 | skip | generic.go:25:9:25:35 | struct literal | -| generic.go:25:2:25:35 | assign:0 ... := ... | generic.go:26:2:26:2 | skip | -| generic.go:25:9:25:35 | struct literal | generic.go:25:32:25:34 | "x" | -| generic.go:25:32:25:34 | "x" | generic.go:25:32:25:34 | lit-init "x" | -| generic.go:25:32:25:34 | lit-init "x" | generic.go:25:2:25:35 | assign:0 ... := ... | -| generic.go:26:2:26:2 | skip | generic.go:26:7:26:9 | gs1 | -| generic.go:26:2:26:27 | assign:0 ... := ... | generic.go:27:2:27:4 | skip | -| generic.go:26:7:26:9 | gs1 | generic.go:26:7:26:18 | selection of Identity | -| generic.go:26:7:26:18 | selection of Identity | generic.go:26:20:26:26 | "hello" | -| generic.go:26:7:26:27 | call to Identity | generic.go:24:1:35:1 | exit | -| generic.go:26:7:26:27 | call to Identity | generic.go:26:2:26:27 | assign:0 ... := ... | -| generic.go:26:20:26:26 | "hello" | generic.go:26:7:26:27 | call to Identity | -| generic.go:27:2:27:4 | skip | generic.go:27:9:27:48 | struct literal | -| generic.go:27:2:27:48 | assign:0 ... := ... | generic.go:28:2:28:2 | skip | -| generic.go:27:9:27:48 | struct literal | generic.go:27:40:27:42 | "y" | -| generic.go:27:40:27:42 | "y" | generic.go:27:40:27:42 | lit-init "y" | -| generic.go:27:40:27:42 | lit-init "y" | generic.go:27:45:27:47 | "z" | -| generic.go:27:45:27:47 | "z" | generic.go:27:45:27:47 | lit-init "z" | -| generic.go:27:45:27:47 | lit-init "z" | generic.go:27:2:27:48 | assign:0 ... := ... | -| generic.go:28:2:28:2 | skip | generic.go:28:7:28:9 | gs2 | -| generic.go:28:2:28:22 | assign:0 ... := ... | generic.go:29:2:29:2 | skip | -| generic.go:28:7:28:9 | gs2 | generic.go:28:7:28:19 | selection of Identity1 | -| generic.go:28:7:28:19 | selection of Identity1 | generic.go:28:21:28:21 | a | -| generic.go:28:7:28:22 | call to Identity1 | generic.go:24:1:35:1 | exit | -| generic.go:28:7:28:22 | call to Identity1 | generic.go:28:2:28:22 | assign:0 ... := ... | -| generic.go:28:21:28:21 | a | generic.go:28:7:28:22 | call to Identity1 | -| generic.go:29:2:29:2 | skip | generic.go:29:7:29:22 | genericIdentity1 | -| generic.go:29:2:29:33 | assign:0 ... := ... | generic.go:30:2:30:2 | skip | -| generic.go:29:7:29:22 | genericIdentity1 | generic.go:29:32:29:32 | b | -| generic.go:29:7:29:33 | call to genericIdentity1 | generic.go:24:1:35:1 | exit | -| generic.go:29:7:29:33 | call to genericIdentity1 | generic.go:29:2:29:33 | assign:0 ... := ... | -| generic.go:29:32:29:32 | b | generic.go:29:7:29:33 | call to genericIdentity1 | -| generic.go:30:2:30:2 | skip | generic.go:30:7:30:22 | genericIdentity1 | -| generic.go:30:2:30:25 | assign:0 ... := ... | generic.go:31:2:31:2 | skip | -| generic.go:30:7:30:22 | genericIdentity1 | generic.go:30:24:30:24 | c | -| generic.go:30:7:30:25 | call to genericIdentity1 | generic.go:24:1:35:1 | exit | -| generic.go:30:7:30:25 | call to genericIdentity1 | generic.go:30:2:30:25 | assign:0 ... := ... | -| generic.go:30:24:30:24 | c | generic.go:30:7:30:25 | call to genericIdentity1 | -| generic.go:31:2:31:2 | skip | generic.go:31:5:31:5 | skip | +| generic.go:20:38:20:38 | t | generic.go:20:50:22:1 | block statement | +| generic.go:20:50:22:1 | block statement | generic.go:21:2:21:12 | Before return statement | +| generic.go:21:2:21:12 | Before return statement | generic.go:21:9:21:9 | Before s | +| generic.go:21:2:21:12 | return statement | generic.go:20:1:22:1 | Normal Exit | +| generic.go:21:9:21:9 | After s | generic.go:21:12:21:12 | Before t | +| generic.go:21:9:21:9 | Before s | generic.go:21:9:21:9 | s | +| generic.go:21:9:21:9 | s | generic.go:21:9:21:9 | After s | +| generic.go:21:12:21:12 | After t | generic.go:21:2:21:12 | return statement | +| generic.go:21:12:21:12 | Before t | generic.go:21:12:21:12 | t | +| generic.go:21:12:21:12 | t | generic.go:21:12:21:12 | After t | +| generic.go:24:1:35:1 | After function declaration | generic.go:0:0:0:0 | After generic.go | +| generic.go:24:1:35:1 | Before function declaration | generic.go:24:1:35:1 | function declaration | +| generic.go:24:1:35:1 | Entry | generic.go:24:16:35:1 | block statement | +| generic.go:24:1:35:1 | Exceptional Exit | generic.go:24:1:35:1 | Exit | +| generic.go:24:1:35:1 | Normal Exit | generic.go:24:1:35:1 | Exit | +| generic.go:24:1:35:1 | function declaration | generic.go:24:1:35:1 | After function declaration | +| generic.go:24:16:35:1 | After block statement | generic.go:24:1:35:1 | Normal Exit | +| generic.go:24:16:35:1 | block statement | generic.go:25:2:25:35 | ... := ... | +| generic.go:25:2:25:35 | ... := ... | generic.go:25:9:25:35 | Before struct literal | +| generic.go:25:2:25:35 | After ... := ... | generic.go:26:2:26:27 | ... := ... | +| generic.go:25:2:25:35 | assign:0 ... := ... | generic.go:25:2:25:35 | After ... := ... | +| generic.go:25:9:25:35 | After struct literal | generic.go:25:2:25:35 | assign:0 ... := ... | +| generic.go:25:9:25:35 | Before struct literal | generic.go:25:9:25:35 | struct literal | +| generic.go:25:9:25:35 | struct literal | generic.go:25:32:25:34 | Before "x" | +| generic.go:25:32:25:34 | "x" | generic.go:25:32:25:34 | After "x" | +| generic.go:25:32:25:34 | After "x" | generic.go:25:32:25:34 | lit-init "x" | +| generic.go:25:32:25:34 | Before "x" | generic.go:25:32:25:34 | "x" | +| generic.go:25:32:25:34 | lit-init "x" | generic.go:25:9:25:35 | After struct literal | +| generic.go:26:2:26:27 | ... := ... | generic.go:26:7:26:27 | Before call to Identity | +| generic.go:26:2:26:27 | After ... := ... | generic.go:27:2:27:48 | ... := ... | +| generic.go:26:2:26:27 | assign:0 ... := ... | generic.go:26:2:26:27 | After ... := ... | +| generic.go:26:7:26:9 | After gs1 | generic.go:26:7:26:18 | selection of Identity | +| generic.go:26:7:26:9 | Before gs1 | generic.go:26:7:26:9 | gs1 | +| generic.go:26:7:26:9 | gs1 | generic.go:26:7:26:9 | After gs1 | +| generic.go:26:7:26:18 | After selection of Identity | generic.go:26:20:26:26 | Before "hello" | +| generic.go:26:7:26:18 | Before selection of Identity | generic.go:26:7:26:9 | Before gs1 | +| generic.go:26:7:26:18 | selection of Identity | generic.go:26:7:26:18 | After selection of Identity | +| generic.go:26:7:26:27 | After call to Identity | generic.go:26:2:26:27 | assign:0 ... := ... | +| generic.go:26:7:26:27 | Before call to Identity | generic.go:26:7:26:18 | Before selection of Identity | +| generic.go:26:7:26:27 | call to Identity | generic.go:24:1:35:1 | Exceptional Exit | +| generic.go:26:7:26:27 | call to Identity | generic.go:26:7:26:27 | After call to Identity | +| generic.go:26:20:26:26 | "hello" | generic.go:26:20:26:26 | After "hello" | +| generic.go:26:20:26:26 | After "hello" | generic.go:26:7:26:27 | call to Identity | +| generic.go:26:20:26:26 | Before "hello" | generic.go:26:20:26:26 | "hello" | +| generic.go:27:2:27:48 | ... := ... | generic.go:27:9:27:48 | Before struct literal | +| generic.go:27:2:27:48 | After ... := ... | generic.go:28:2:28:22 | ... := ... | +| generic.go:27:2:27:48 | assign:0 ... := ... | generic.go:27:2:27:48 | After ... := ... | +| generic.go:27:9:27:48 | After struct literal | generic.go:27:2:27:48 | assign:0 ... := ... | +| generic.go:27:9:27:48 | Before struct literal | generic.go:27:9:27:48 | struct literal | +| generic.go:27:9:27:48 | struct literal | generic.go:27:40:27:42 | Before "y" | +| generic.go:27:40:27:42 | "y" | generic.go:27:40:27:42 | After "y" | +| generic.go:27:40:27:42 | After "y" | generic.go:27:40:27:42 | lit-init "y" | +| generic.go:27:40:27:42 | Before "y" | generic.go:27:40:27:42 | "y" | +| generic.go:27:40:27:42 | lit-init "y" | generic.go:27:45:27:47 | Before "z" | +| generic.go:27:45:27:47 | "z" | generic.go:27:45:27:47 | After "z" | +| generic.go:27:45:27:47 | After "z" | generic.go:27:45:27:47 | lit-init "z" | +| generic.go:27:45:27:47 | Before "z" | generic.go:27:45:27:47 | "z" | +| generic.go:27:45:27:47 | lit-init "z" | generic.go:27:9:27:48 | After struct literal | +| generic.go:28:2:28:22 | ... := ... | generic.go:28:7:28:22 | Before call to Identity1 | +| generic.go:28:2:28:22 | After ... := ... | generic.go:29:2:29:33 | ... := ... | +| generic.go:28:2:28:22 | assign:0 ... := ... | generic.go:28:2:28:22 | After ... := ... | +| generic.go:28:7:28:9 | After gs2 | generic.go:28:7:28:19 | selection of Identity1 | +| generic.go:28:7:28:9 | Before gs2 | generic.go:28:7:28:9 | gs2 | +| generic.go:28:7:28:9 | gs2 | generic.go:28:7:28:9 | After gs2 | +| generic.go:28:7:28:19 | After selection of Identity1 | generic.go:28:21:28:21 | Before a | +| generic.go:28:7:28:19 | Before selection of Identity1 | generic.go:28:7:28:9 | Before gs2 | +| generic.go:28:7:28:19 | selection of Identity1 | generic.go:28:7:28:19 | After selection of Identity1 | +| generic.go:28:7:28:22 | After call to Identity1 | generic.go:28:2:28:22 | assign:0 ... := ... | +| generic.go:28:7:28:22 | Before call to Identity1 | generic.go:28:7:28:19 | Before selection of Identity1 | +| generic.go:28:7:28:22 | call to Identity1 | generic.go:24:1:35:1 | Exceptional Exit | +| generic.go:28:7:28:22 | call to Identity1 | generic.go:28:7:28:22 | After call to Identity1 | +| generic.go:28:21:28:21 | After a | generic.go:28:7:28:22 | call to Identity1 | +| generic.go:28:21:28:21 | Before a | generic.go:28:21:28:21 | a | +| generic.go:28:21:28:21 | a | generic.go:28:21:28:21 | After a | +| generic.go:29:2:29:33 | ... := ... | generic.go:29:7:29:33 | Before call to genericIdentity1 | +| generic.go:29:2:29:33 | After ... := ... | generic.go:30:2:30:25 | ... := ... | +| generic.go:29:2:29:33 | assign:0 ... := ... | generic.go:29:2:29:33 | After ... := ... | +| generic.go:29:7:29:22 | After genericIdentity1 | generic.go:29:7:29:30 | generic function instantiation expression | +| generic.go:29:7:29:22 | Before genericIdentity1 | generic.go:29:7:29:22 | genericIdentity1 | +| generic.go:29:7:29:22 | genericIdentity1 | generic.go:29:7:29:22 | After genericIdentity1 | +| generic.go:29:7:29:30 | After generic function instantiation expression | generic.go:29:32:29:32 | Before b | +| generic.go:29:7:29:30 | Before generic function instantiation expression | generic.go:29:7:29:22 | Before genericIdentity1 | +| generic.go:29:7:29:30 | generic function instantiation expression | generic.go:29:7:29:30 | After generic function instantiation expression | +| generic.go:29:7:29:33 | After call to genericIdentity1 | generic.go:29:2:29:33 | assign:0 ... := ... | +| generic.go:29:7:29:33 | Before call to genericIdentity1 | generic.go:29:7:29:30 | Before generic function instantiation expression | +| generic.go:29:7:29:33 | call to genericIdentity1 | generic.go:24:1:35:1 | Exceptional Exit | +| generic.go:29:7:29:33 | call to genericIdentity1 | generic.go:29:7:29:33 | After call to genericIdentity1 | +| generic.go:29:32:29:32 | After b | generic.go:29:7:29:33 | call to genericIdentity1 | +| generic.go:29:32:29:32 | Before b | generic.go:29:32:29:32 | b | +| generic.go:29:32:29:32 | b | generic.go:29:32:29:32 | After b | +| generic.go:30:2:30:25 | ... := ... | generic.go:30:7:30:25 | Before call to genericIdentity1 | +| generic.go:30:2:30:25 | After ... := ... | generic.go:31:2:31:53 | ... := ... | +| generic.go:30:2:30:25 | assign:0 ... := ... | generic.go:30:2:30:25 | After ... := ... | +| generic.go:30:7:30:22 | After genericIdentity1 | generic.go:30:24:30:24 | Before c | +| generic.go:30:7:30:22 | Before genericIdentity1 | generic.go:30:7:30:22 | genericIdentity1 | +| generic.go:30:7:30:22 | genericIdentity1 | generic.go:30:7:30:22 | After genericIdentity1 | +| generic.go:30:7:30:25 | After call to genericIdentity1 | generic.go:30:2:30:25 | assign:0 ... := ... | +| generic.go:30:7:30:25 | Before call to genericIdentity1 | generic.go:30:7:30:22 | Before genericIdentity1 | +| generic.go:30:7:30:25 | call to genericIdentity1 | generic.go:24:1:35:1 | Exceptional Exit | +| generic.go:30:7:30:25 | call to genericIdentity1 | generic.go:30:7:30:25 | After call to genericIdentity1 | +| generic.go:30:24:30:24 | After c | generic.go:30:7:30:25 | call to genericIdentity1 | +| generic.go:30:24:30:24 | Before c | generic.go:30:24:30:24 | c | +| generic.go:30:24:30:24 | c | generic.go:30:24:30:24 | After c | +| generic.go:31:2:31:53 | ... := ... | generic.go:31:10:31:53 | Before call to genericIdentity2 | +| generic.go:31:2:31:53 | After ... := ... | generic.go:32:2:32:31 | ... := ... | | generic.go:31:2:31:53 | assign:0 ... := ... | generic.go:31:2:31:53 | extract:1 ... := ... | -| generic.go:31:2:31:53 | assign:1 ... := ... | generic.go:32:2:32:2 | skip | +| generic.go:31:2:31:53 | assign:1 ... := ... | generic.go:31:2:31:53 | After ... := ... | | generic.go:31:2:31:53 | extract:0 ... := ... | generic.go:31:2:31:53 | assign:0 ... := ... | | generic.go:31:2:31:53 | extract:1 ... := ... | generic.go:31:2:31:53 | assign:1 ... := ... | -| generic.go:31:5:31:5 | skip | generic.go:31:10:31:25 | genericIdentity2 | -| generic.go:31:10:31:25 | genericIdentity2 | generic.go:31:43:31:43 | d | -| generic.go:31:10:31:53 | call to genericIdentity2 | generic.go:24:1:35:1 | exit | -| generic.go:31:10:31:53 | call to genericIdentity2 | generic.go:31:2:31:53 | extract:0 ... := ... | -| generic.go:31:43:31:43 | d | generic.go:31:46:31:52 | "hello" | -| generic.go:31:46:31:52 | "hello" | generic.go:31:10:31:53 | call to genericIdentity2 | -| generic.go:32:2:32:2 | skip | generic.go:32:5:32:5 | skip | +| generic.go:31:10:31:25 | After genericIdentity2 | generic.go:31:10:31:41 | generic function instantiation expression | +| generic.go:31:10:31:25 | Before genericIdentity2 | generic.go:31:10:31:25 | genericIdentity2 | +| generic.go:31:10:31:25 | genericIdentity2 | generic.go:31:10:31:25 | After genericIdentity2 | +| generic.go:31:10:31:41 | After generic function instantiation expression | generic.go:31:43:31:43 | Before d | +| generic.go:31:10:31:41 | Before generic function instantiation expression | generic.go:31:10:31:25 | Before genericIdentity2 | +| generic.go:31:10:31:41 | generic function instantiation expression | generic.go:31:10:31:41 | After generic function instantiation expression | +| generic.go:31:10:31:53 | After call to genericIdentity2 | generic.go:31:2:31:53 | extract:0 ... := ... | +| generic.go:31:10:31:53 | Before call to genericIdentity2 | generic.go:31:10:31:41 | Before generic function instantiation expression | +| generic.go:31:10:31:53 | call to genericIdentity2 | generic.go:24:1:35:1 | Exceptional Exit | +| generic.go:31:10:31:53 | call to genericIdentity2 | generic.go:31:10:31:53 | After call to genericIdentity2 | +| generic.go:31:43:31:43 | After d | generic.go:31:46:31:52 | Before "hello" | +| generic.go:31:43:31:43 | Before d | generic.go:31:43:31:43 | d | +| generic.go:31:43:31:43 | d | generic.go:31:43:31:43 | After d | +| generic.go:31:46:31:52 | "hello" | generic.go:31:46:31:52 | After "hello" | +| generic.go:31:46:31:52 | After "hello" | generic.go:31:10:31:53 | call to genericIdentity2 | +| generic.go:31:46:31:52 | Before "hello" | generic.go:31:46:31:52 | "hello" | +| generic.go:32:2:32:31 | ... := ... | generic.go:32:10:32:31 | Before call to genericIdentity2 | +| generic.go:32:2:32:31 | After ... := ... | generic.go:33:2:33:6 | ... = ... | | generic.go:32:2:32:31 | assign:0 ... := ... | generic.go:32:2:32:31 | extract:1 ... := ... | -| generic.go:32:2:32:31 | assign:1 ... := ... | generic.go:33:2:33:2 | skip | +| generic.go:32:2:32:31 | assign:1 ... := ... | generic.go:32:2:32:31 | After ... := ... | | generic.go:32:2:32:31 | extract:0 ... := ... | generic.go:32:2:32:31 | assign:0 ... := ... | | generic.go:32:2:32:31 | extract:1 ... := ... | generic.go:32:2:32:31 | assign:1 ... := ... | -| generic.go:32:5:32:5 | skip | generic.go:32:10:32:25 | genericIdentity2 | -| generic.go:32:10:32:25 | genericIdentity2 | generic.go:32:27:32:27 | e | -| generic.go:32:10:32:31 | call to genericIdentity2 | generic.go:24:1:35:1 | exit | -| generic.go:32:10:32:31 | call to genericIdentity2 | generic.go:32:2:32:31 | extract:0 ... := ... | -| generic.go:32:27:32:27 | e | generic.go:32:30:32:30 | f | -| generic.go:32:30:32:30 | f | generic.go:32:10:32:31 | call to genericIdentity2 | -| generic.go:33:2:33:2 | skip | generic.go:33:6:33:6 | g | -| generic.go:33:6:33:6 | g | generic.go:34:2:34:2 | skip | -| generic.go:34:2:34:2 | skip | generic.go:34:6:34:6 | h | -| generic.go:34:6:34:6 | h | generic.go:24:1:35:1 | exit | -| hello.go:0:0:0:0 | entry | hello.go:3:1:3:12 | skip | -| hello.go:3:1:3:12 | skip | hello.go:5:7:5:13 | skip | -| hello.go:5:7:5:13 | skip | hello.go:5:17:5:31 | "Hello, world!" | -| hello.go:5:7:5:31 | assign:0 value declaration specifier | hello.go:7:6:7:13 | skip | -| hello.go:5:17:5:31 | "Hello, world!" | hello.go:5:7:5:31 | assign:0 value declaration specifier | -| hello.go:7:1:9:1 | entry | hello.go:8:2:8:12 | selection of Println | -| hello.go:7:1:9:1 | function declaration | hello.go:0:0:0:0 | exit | -| hello.go:7:6:7:13 | skip | hello.go:7:1:9:1 | function declaration | -| hello.go:8:2:8:12 | selection of Println | hello.go:8:14:8:20 | message | -| hello.go:8:2:8:21 | call to Println | hello.go:7:1:9:1 | exit | -| hello.go:8:14:8:20 | message | hello.go:8:2:8:21 | call to Println | -| main.go:0:0:0:0 | entry | main.go:3:1:6:1 | skip | -| main.go:3:1:6:1 | skip | main.go:8:6:8:9 | skip | -| main.go:8:1:10:1 | entry | main.go:9:9:9:20 | selection of Float64 | -| main.go:8:1:10:1 | function declaration | main.go:12:6:12:9 | skip | -| main.go:8:6:8:9 | skip | main.go:8:1:10:1 | function declaration | -| main.go:9:2:9:29 | return statement | main.go:8:1:10:1 | exit | -| main.go:9:9:9:20 | selection of Float64 | main.go:9:9:9:22 | call to Float64 | -| main.go:9:9:9:22 | call to Float64 | main.go:8:1:10:1 | exit | -| main.go:9:9:9:22 | call to Float64 | main.go:9:27:9:29 | 0.5 | -| main.go:9:9:9:29 | ...>=... | main.go:9:2:9:29 | return statement | -| main.go:9:27:9:29 | 0.5 | main.go:9:9:9:29 | ...>=... | -| main.go:12:1:24:1 | entry | main.go:13:6:13:6 | skip | -| main.go:12:1:24:1 | function declaration | main.go:26:6:26:8 | skip | -| main.go:12:6:12:9 | skip | main.go:12:1:24:1 | function declaration | -| main.go:13:6:13:6 | skip | main.go:13:6:13:10 | zero-init:0 value declaration specifier | -| main.go:13:6:13:10 | assign:0 value declaration specifier | main.go:14:2:14:2 | skip | +| generic.go:32:10:32:25 | After genericIdentity2 | generic.go:32:27:32:27 | Before e | +| generic.go:32:10:32:25 | Before genericIdentity2 | generic.go:32:10:32:25 | genericIdentity2 | +| generic.go:32:10:32:25 | genericIdentity2 | generic.go:32:10:32:25 | After genericIdentity2 | +| generic.go:32:10:32:31 | After call to genericIdentity2 | generic.go:32:2:32:31 | extract:0 ... := ... | +| generic.go:32:10:32:31 | Before call to genericIdentity2 | generic.go:32:10:32:25 | Before genericIdentity2 | +| generic.go:32:10:32:31 | call to genericIdentity2 | generic.go:24:1:35:1 | Exceptional Exit | +| generic.go:32:10:32:31 | call to genericIdentity2 | generic.go:32:10:32:31 | After call to genericIdentity2 | +| generic.go:32:27:32:27 | After e | generic.go:32:30:32:30 | Before f | +| generic.go:32:27:32:27 | Before e | generic.go:32:27:32:27 | e | +| generic.go:32:27:32:27 | e | generic.go:32:27:32:27 | After e | +| generic.go:32:30:32:30 | After f | generic.go:32:10:32:31 | call to genericIdentity2 | +| generic.go:32:30:32:30 | Before f | generic.go:32:30:32:30 | f | +| generic.go:32:30:32:30 | f | generic.go:32:30:32:30 | After f | +| generic.go:33:2:33:6 | ... = ... | generic.go:33:6:33:6 | Before g | +| generic.go:33:2:33:6 | After ... = ... | generic.go:34:2:34:6 | ... = ... | +| generic.go:33:6:33:6 | After g | generic.go:33:2:33:6 | After ... = ... | +| generic.go:33:6:33:6 | Before g | generic.go:33:6:33:6 | g | +| generic.go:33:6:33:6 | g | generic.go:33:6:33:6 | After g | +| generic.go:34:2:34:6 | ... = ... | generic.go:34:6:34:6 | Before h | +| generic.go:34:2:34:6 | After ... = ... | generic.go:24:16:35:1 | After block statement | +| generic.go:34:6:34:6 | After h | generic.go:34:2:34:6 | After ... = ... | +| generic.go:34:6:34:6 | Before h | generic.go:34:6:34:6 | h | +| generic.go:34:6:34:6 | h | generic.go:34:6:34:6 | After h | +| hello.go:0:0:0:0 | After hello.go | hello.go:0:0:0:0 | Normal Exit | +| hello.go:0:0:0:0 | Entry | hello.go:0:0:0:0 | hello.go | +| hello.go:0:0:0:0 | Normal Exit | hello.go:0:0:0:0 | Exit | +| hello.go:0:0:0:0 | hello.go | hello.go:3:1:3:12 | import declaration | +| hello.go:3:1:3:12 | After import declaration | hello.go:5:1:5:31 | constant declaration | +| hello.go:3:1:3:12 | import declaration | hello.go:3:8:3:12 | import specifier | +| hello.go:3:8:3:12 | import specifier | hello.go:3:1:3:12 | After import declaration | +| hello.go:5:1:5:31 | After constant declaration | hello.go:7:1:9:1 | Before function declaration | +| hello.go:5:1:5:31 | constant declaration | hello.go:5:7:5:31 | value declaration specifier | +| hello.go:5:7:5:31 | After value declaration specifier | hello.go:5:1:5:31 | After constant declaration | +| hello.go:5:7:5:31 | assign:0 value declaration specifier | hello.go:5:7:5:31 | After value declaration specifier | +| hello.go:5:7:5:31 | value declaration specifier | hello.go:5:17:5:31 | Before "Hello, world!" | +| hello.go:5:17:5:31 | "Hello, world!" | hello.go:5:17:5:31 | After "Hello, world!" | +| hello.go:5:17:5:31 | After "Hello, world!" | hello.go:5:7:5:31 | assign:0 value declaration specifier | +| hello.go:5:17:5:31 | Before "Hello, world!" | hello.go:5:17:5:31 | "Hello, world!" | +| hello.go:7:1:9:1 | After function declaration | hello.go:0:0:0:0 | After hello.go | +| hello.go:7:1:9:1 | Before function declaration | hello.go:7:1:9:1 | function declaration | +| hello.go:7:1:9:1 | Entry | hello.go:7:17:9:1 | block statement | +| hello.go:7:1:9:1 | Exceptional Exit | hello.go:7:1:9:1 | Exit | +| hello.go:7:1:9:1 | Normal Exit | hello.go:7:1:9:1 | Exit | +| hello.go:7:1:9:1 | function declaration | hello.go:7:1:9:1 | After function declaration | +| hello.go:7:17:9:1 | After block statement | hello.go:7:1:9:1 | Normal Exit | +| hello.go:7:17:9:1 | block statement | hello.go:8:2:8:21 | expression statement | +| hello.go:8:2:8:12 | After selection of Println | hello.go:8:14:8:20 | Before message | +| hello.go:8:2:8:12 | Before selection of Println | hello.go:8:2:8:12 | selection of Println | +| hello.go:8:2:8:12 | selection of Println | hello.go:8:2:8:12 | After selection of Println | +| hello.go:8:2:8:21 | After call to Println | hello.go:8:2:8:21 | After expression statement | +| hello.go:8:2:8:21 | After expression statement | hello.go:7:17:9:1 | After block statement | +| hello.go:8:2:8:21 | Before call to Println | hello.go:8:2:8:12 | Before selection of Println | +| hello.go:8:2:8:21 | call to Println | hello.go:7:1:9:1 | Exceptional Exit | +| hello.go:8:2:8:21 | call to Println | hello.go:8:2:8:21 | After call to Println | +| hello.go:8:2:8:21 | expression statement | hello.go:8:2:8:21 | Before call to Println | +| hello.go:8:14:8:20 | After message | hello.go:8:2:8:21 | call to Println | +| hello.go:8:14:8:20 | Before message | hello.go:8:14:8:20 | message | +| hello.go:8:14:8:20 | message | hello.go:8:14:8:20 | After message | +| main.go:0:0:0:0 | After main.go | main.go:0:0:0:0 | Normal Exit | +| main.go:0:0:0:0 | Entry | main.go:0:0:0:0 | main.go | +| main.go:0:0:0:0 | Normal Exit | main.go:0:0:0:0 | Exit | +| main.go:0:0:0:0 | main.go | main.go:3:1:6:1 | import declaration | +| main.go:3:1:6:1 | After import declaration | main.go:8:1:10:1 | Before function declaration | +| main.go:3:1:6:1 | import declaration | main.go:4:2:4:6 | import specifier | +| main.go:4:2:4:6 | import specifier | main.go:5:2:5:12 | import specifier | +| main.go:5:2:5:12 | import specifier | main.go:3:1:6:1 | After import declaration | +| main.go:8:1:10:1 | After function declaration | main.go:12:1:24:1 | Before function declaration | +| main.go:8:1:10:1 | Before function declaration | main.go:8:1:10:1 | function declaration | +| main.go:8:1:10:1 | Entry | main.go:8:18:10:1 | block statement | +| main.go:8:1:10:1 | Exceptional Exit | main.go:8:1:10:1 | Exit | +| main.go:8:1:10:1 | Normal Exit | main.go:8:1:10:1 | Exit | +| main.go:8:1:10:1 | function declaration | main.go:8:1:10:1 | After function declaration | +| main.go:8:18:10:1 | block statement | main.go:9:2:9:29 | Before return statement | +| main.go:9:2:9:29 | Before return statement | main.go:9:9:9:29 | Before ...>=... | +| main.go:9:2:9:29 | return statement | main.go:8:1:10:1 | Normal Exit | +| main.go:9:9:9:20 | After selection of Float64 | main.go:9:9:9:22 | call to Float64 | +| main.go:9:9:9:20 | Before selection of Float64 | main.go:9:9:9:20 | selection of Float64 | +| main.go:9:9:9:20 | selection of Float64 | main.go:9:9:9:20 | After selection of Float64 | +| main.go:9:9:9:22 | After call to Float64 | main.go:9:27:9:29 | Before 0.5 | +| main.go:9:9:9:22 | Before call to Float64 | main.go:9:9:9:20 | Before selection of Float64 | +| main.go:9:9:9:22 | call to Float64 | main.go:8:1:10:1 | Exceptional Exit | +| main.go:9:9:9:22 | call to Float64 | main.go:9:9:9:22 | After call to Float64 | +| main.go:9:9:9:29 | ...>=... | main.go:9:9:9:29 | After ...>=... | +| main.go:9:9:9:29 | After ...>=... | main.go:9:2:9:29 | return statement | +| main.go:9:9:9:29 | Before ...>=... | main.go:9:9:9:22 | Before call to Float64 | +| main.go:9:27:9:29 | 0.5 | main.go:9:27:9:29 | After 0.5 | +| main.go:9:27:9:29 | After 0.5 | main.go:9:9:9:29 | ...>=... | +| main.go:9:27:9:29 | Before 0.5 | main.go:9:27:9:29 | 0.5 | +| main.go:12:1:24:1 | After function declaration | main.go:26:1:32:1 | Before function declaration | +| main.go:12:1:24:1 | Before function declaration | main.go:12:1:24:1 | function declaration | +| main.go:12:1:24:1 | Entry | main.go:12:13:24:1 | block statement | +| main.go:12:1:24:1 | Exceptional Exit | main.go:12:1:24:1 | Exit | +| main.go:12:1:24:1 | Normal Exit | main.go:12:1:24:1 | Exit | +| main.go:12:1:24:1 | function declaration | main.go:12:1:24:1 | After function declaration | +| main.go:12:13:24:1 | After block statement | main.go:12:1:24:1 | Normal Exit | +| main.go:12:13:24:1 | block statement | main.go:13:2:13:10 | declaration statement | +| main.go:13:2:13:10 | After declaration statement | main.go:14:2:14:8 | ... := ... | +| main.go:13:2:13:10 | After variable declaration | main.go:13:2:13:10 | After declaration statement | +| main.go:13:2:13:10 | declaration statement | main.go:13:2:13:10 | variable declaration | +| main.go:13:2:13:10 | variable declaration | main.go:13:6:13:10 | value declaration specifier | +| main.go:13:6:13:10 | After value declaration specifier | main.go:13:2:13:10 | After variable declaration | +| main.go:13:6:13:10 | assign:0 value declaration specifier | main.go:13:6:13:10 | After value declaration specifier | +| main.go:13:6:13:10 | value declaration specifier | main.go:13:6:13:10 | zero-init:0 value declaration specifier | | main.go:13:6:13:10 | zero-init:0 value declaration specifier | main.go:13:6:13:10 | assign:0 value declaration specifier | -| main.go:14:2:14:2 | skip | main.go:14:7:14:8 | 23 | -| main.go:14:2:14:8 | assign:0 ... := ... | main.go:15:2:15:10 | selection of Print | -| main.go:14:7:14:8 | 23 | main.go:14:2:14:8 | assign:0 ... := ... | -| main.go:15:2:15:10 | selection of Print | main.go:15:12:15:12 | x | -| main.go:15:2:15:16 | call to Print | main.go:12:1:24:1 | exit | -| main.go:15:2:15:16 | call to Print | main.go:16:5:16:8 | cond | -| main.go:15:12:15:12 | x | main.go:15:15:15:15 | y | -| main.go:15:15:15:15 | y | main.go:15:2:15:16 | call to Print | -| main.go:16:5:16:8 | cond | main.go:16:5:16:10 | call to cond | -| main.go:16:5:16:10 | call to cond | main.go:12:1:24:1 | exit | -| main.go:16:5:16:10 | call to cond | main.go:16:5:16:10 | call to cond is false | -| main.go:16:5:16:10 | call to cond | main.go:16:5:16:10 | call to cond is true | -| main.go:16:5:16:10 | call to cond is false | main.go:19:2:19:10 | selection of Print | -| main.go:16:5:16:10 | call to cond is true | main.go:17:3:17:3 | y | -| main.go:17:3:17:3 | y | main.go:17:8:17:9 | 19 | -| main.go:17:3:17:9 | assign:0 ... += ... | main.go:19:2:19:10 | selection of Print | +| main.go:14:2:14:8 | ... := ... | main.go:14:7:14:8 | Before 23 | +| main.go:14:2:14:8 | After ... := ... | main.go:15:2:15:16 | expression statement | +| main.go:14:2:14:8 | assign:0 ... := ... | main.go:14:2:14:8 | After ... := ... | +| main.go:14:7:14:8 | 23 | main.go:14:7:14:8 | After 23 | +| main.go:14:7:14:8 | After 23 | main.go:14:2:14:8 | assign:0 ... := ... | +| main.go:14:7:14:8 | Before 23 | main.go:14:7:14:8 | 23 | +| main.go:15:2:15:10 | After selection of Print | main.go:15:12:15:12 | Before x | +| main.go:15:2:15:10 | Before selection of Print | main.go:15:2:15:10 | selection of Print | +| main.go:15:2:15:10 | selection of Print | main.go:15:2:15:10 | After selection of Print | +| main.go:15:2:15:16 | After call to Print | main.go:15:2:15:16 | After expression statement | +| main.go:15:2:15:16 | After expression statement | main.go:16:2:18:2 | if statement | +| main.go:15:2:15:16 | Before call to Print | main.go:15:2:15:10 | Before selection of Print | +| main.go:15:2:15:16 | call to Print | main.go:12:1:24:1 | Exceptional Exit | +| main.go:15:2:15:16 | call to Print | main.go:15:2:15:16 | After call to Print | +| main.go:15:2:15:16 | expression statement | main.go:15:2:15:16 | Before call to Print | +| main.go:15:12:15:12 | After x | main.go:15:15:15:15 | Before y | +| main.go:15:12:15:12 | Before x | main.go:15:12:15:12 | x | +| main.go:15:12:15:12 | x | main.go:15:12:15:12 | After x | +| main.go:15:15:15:15 | After y | main.go:15:2:15:16 | call to Print | +| main.go:15:15:15:15 | Before y | main.go:15:15:15:15 | y | +| main.go:15:15:15:15 | y | main.go:15:15:15:15 | After y | +| main.go:16:2:18:2 | After if statement | main.go:19:2:19:16 | expression statement | +| main.go:16:2:18:2 | if statement | main.go:16:5:16:10 | Before call to cond | +| main.go:16:5:16:8 | After cond | main.go:16:5:16:10 | call to cond | +| main.go:16:5:16:8 | Before cond | main.go:16:5:16:8 | cond | +| main.go:16:5:16:8 | cond | main.go:16:5:16:8 | After cond | +| main.go:16:5:16:10 | After call to cond [false] | main.go:16:2:18:2 | After if statement | +| main.go:16:5:16:10 | After call to cond [true] | main.go:16:12:18:2 | block statement | +| main.go:16:5:16:10 | Before call to cond | main.go:16:5:16:8 | Before cond | +| main.go:16:5:16:10 | call to cond | main.go:12:1:24:1 | Exceptional Exit | +| main.go:16:5:16:10 | call to cond | main.go:16:5:16:10 | After call to cond [false] | +| main.go:16:5:16:10 | call to cond | main.go:16:5:16:10 | After call to cond [true] | +| main.go:16:12:18:2 | After block statement | main.go:16:2:18:2 | After if statement | +| main.go:16:12:18:2 | block statement | main.go:17:3:17:9 | ... += ... | +| main.go:17:3:17:3 | After y | main.go:17:8:17:9 | Before 19 | +| main.go:17:3:17:3 | Before y | main.go:17:3:17:3 | y | +| main.go:17:3:17:3 | y | main.go:17:3:17:3 | After y | +| main.go:17:3:17:9 | ... += ... | main.go:17:3:17:3 | Before y | +| main.go:17:3:17:9 | After ... += ... | main.go:16:12:18:2 | After block statement | +| main.go:17:3:17:9 | assign:0 ... += ... | main.go:17:3:17:9 | After ... += ... | | main.go:17:3:17:9 | compound-rhs ... += ... | main.go:17:3:17:9 | assign:0 ... += ... | -| main.go:17:8:17:9 | 19 | main.go:17:3:17:9 | compound-rhs ... += ... | -| main.go:19:2:19:10 | selection of Print | main.go:19:12:19:12 | x | -| main.go:19:2:19:16 | call to Print | main.go:12:1:24:1 | exit | -| main.go:19:2:19:16 | call to Print | main.go:20:5:20:8 | cond | -| main.go:19:12:19:12 | x | main.go:19:15:19:15 | y | -| main.go:19:15:19:15 | y | main.go:19:2:19:16 | call to Print | -| main.go:20:5:20:8 | cond | main.go:20:5:20:10 | call to cond | -| main.go:20:5:20:10 | call to cond | main.go:12:1:24:1 | exit | -| main.go:20:5:20:10 | call to cond | main.go:20:5:20:10 | call to cond is false | -| main.go:20:5:20:10 | call to cond | main.go:20:5:20:10 | call to cond is true | -| main.go:20:5:20:10 | call to cond is false | main.go:23:2:23:10 | selection of Print | -| main.go:20:5:20:10 | call to cond is true | main.go:21:3:21:3 | skip | -| main.go:21:3:21:3 | skip | main.go:21:7:21:7 | y | -| main.go:21:3:21:7 | assign:0 ... = ... | main.go:23:2:23:10 | selection of Print | -| main.go:21:7:21:7 | y | main.go:21:3:21:7 | assign:0 ... = ... | -| main.go:23:2:23:10 | selection of Print | main.go:23:12:23:12 | x | -| main.go:23:2:23:16 | call to Print | main.go:12:1:24:1 | exit | -| main.go:23:12:23:12 | x | main.go:23:15:23:15 | y | -| main.go:23:15:23:15 | y | main.go:23:2:23:16 | call to Print | -| main.go:26:1:32:1 | entry | main.go:26:10:26:10 | x | -| main.go:26:1:32:1 | function declaration | main.go:34:6:34:9 | skip | -| main.go:26:6:26:8 | skip | main.go:26:1:32:1 | function declaration | -| main.go:26:10:26:10 | x | main.go:26:10:26:10 | x | -| main.go:26:10:26:10 | x | main.go:27:2:27:2 | skip | -| main.go:27:2:27:2 | skip | main.go:27:5:27:5 | skip | +| main.go:17:8:17:9 | 19 | main.go:17:8:17:9 | After 19 | +| main.go:17:8:17:9 | After 19 | main.go:17:3:17:9 | compound-rhs ... += ... | +| main.go:17:8:17:9 | Before 19 | main.go:17:8:17:9 | 19 | +| main.go:19:2:19:10 | After selection of Print | main.go:19:12:19:12 | Before x | +| main.go:19:2:19:10 | Before selection of Print | main.go:19:2:19:10 | selection of Print | +| main.go:19:2:19:10 | selection of Print | main.go:19:2:19:10 | After selection of Print | +| main.go:19:2:19:16 | After call to Print | main.go:19:2:19:16 | After expression statement | +| main.go:19:2:19:16 | After expression statement | main.go:20:2:22:2 | if statement | +| main.go:19:2:19:16 | Before call to Print | main.go:19:2:19:10 | Before selection of Print | +| main.go:19:2:19:16 | call to Print | main.go:12:1:24:1 | Exceptional Exit | +| main.go:19:2:19:16 | call to Print | main.go:19:2:19:16 | After call to Print | +| main.go:19:2:19:16 | expression statement | main.go:19:2:19:16 | Before call to Print | +| main.go:19:12:19:12 | After x | main.go:19:15:19:15 | Before y | +| main.go:19:12:19:12 | Before x | main.go:19:12:19:12 | x | +| main.go:19:12:19:12 | x | main.go:19:12:19:12 | After x | +| main.go:19:15:19:15 | After y | main.go:19:2:19:16 | call to Print | +| main.go:19:15:19:15 | Before y | main.go:19:15:19:15 | y | +| main.go:19:15:19:15 | y | main.go:19:15:19:15 | After y | +| main.go:20:2:22:2 | After if statement | main.go:23:2:23:16 | expression statement | +| main.go:20:2:22:2 | if statement | main.go:20:5:20:10 | Before call to cond | +| main.go:20:5:20:8 | After cond | main.go:20:5:20:10 | call to cond | +| main.go:20:5:20:8 | Before cond | main.go:20:5:20:8 | cond | +| main.go:20:5:20:8 | cond | main.go:20:5:20:8 | After cond | +| main.go:20:5:20:10 | After call to cond [false] | main.go:20:2:22:2 | After if statement | +| main.go:20:5:20:10 | After call to cond [true] | main.go:20:12:22:2 | block statement | +| main.go:20:5:20:10 | Before call to cond | main.go:20:5:20:8 | Before cond | +| main.go:20:5:20:10 | call to cond | main.go:12:1:24:1 | Exceptional Exit | +| main.go:20:5:20:10 | call to cond | main.go:20:5:20:10 | After call to cond [false] | +| main.go:20:5:20:10 | call to cond | main.go:20:5:20:10 | After call to cond [true] | +| main.go:20:12:22:2 | After block statement | main.go:20:2:22:2 | After if statement | +| main.go:20:12:22:2 | block statement | main.go:21:3:21:7 | ... = ... | +| main.go:21:3:21:7 | ... = ... | main.go:21:7:21:7 | Before y | +| main.go:21:3:21:7 | After ... = ... | main.go:20:12:22:2 | After block statement | +| main.go:21:3:21:7 | assign:0 ... = ... | main.go:21:3:21:7 | After ... = ... | +| main.go:21:7:21:7 | After y | main.go:21:3:21:7 | assign:0 ... = ... | +| main.go:21:7:21:7 | Before y | main.go:21:7:21:7 | y | +| main.go:21:7:21:7 | y | main.go:21:7:21:7 | After y | +| main.go:23:2:23:10 | After selection of Print | main.go:23:12:23:12 | Before x | +| main.go:23:2:23:10 | Before selection of Print | main.go:23:2:23:10 | selection of Print | +| main.go:23:2:23:10 | selection of Print | main.go:23:2:23:10 | After selection of Print | +| main.go:23:2:23:16 | After call to Print | main.go:23:2:23:16 | After expression statement | +| main.go:23:2:23:16 | After expression statement | main.go:12:13:24:1 | After block statement | +| main.go:23:2:23:16 | Before call to Print | main.go:23:2:23:10 | Before selection of Print | +| main.go:23:2:23:16 | call to Print | main.go:12:1:24:1 | Exceptional Exit | +| main.go:23:2:23:16 | call to Print | main.go:23:2:23:16 | After call to Print | +| main.go:23:2:23:16 | expression statement | main.go:23:2:23:16 | Before call to Print | +| main.go:23:12:23:12 | After x | main.go:23:15:23:15 | Before y | +| main.go:23:12:23:12 | Before x | main.go:23:12:23:12 | x | +| main.go:23:12:23:12 | x | main.go:23:12:23:12 | After x | +| main.go:23:15:23:15 | After y | main.go:23:2:23:16 | call to Print | +| main.go:23:15:23:15 | Before y | main.go:23:15:23:15 | y | +| main.go:23:15:23:15 | y | main.go:23:15:23:15 | After y | +| main.go:26:1:32:1 | After function declaration | main.go:34:1:36:1 | Before function declaration | +| main.go:26:1:32:1 | Before function declaration | main.go:26:1:32:1 | function declaration | +| main.go:26:1:32:1 | Entry | main.go:26:10:26:10 | x | +| main.go:26:1:32:1 | Exceptional Exit | main.go:26:1:32:1 | Exit | +| main.go:26:1:32:1 | Normal Exit | main.go:26:1:32:1 | Exit | +| main.go:26:1:32:1 | function declaration | main.go:26:1:32:1 | After function declaration | +| main.go:26:10:26:10 | x | main.go:26:28:32:1 | block statement | +| main.go:26:28:32:1 | block statement | main.go:27:2:27:13 | ... := ... | +| main.go:27:2:27:13 | ... := ... | main.go:27:10:27:10 | Before x | +| main.go:27:2:27:13 | After ... := ... | main.go:28:2:30:2 | if statement | | main.go:27:2:27:13 | assign:0 ... := ... | main.go:27:2:27:13 | assign:1 ... := ... | -| main.go:27:2:27:13 | assign:1 ... := ... | main.go:28:5:28:8 | cond | -| main.go:27:5:27:5 | skip | main.go:27:10:27:10 | x | -| main.go:27:10:27:10 | x | main.go:27:13:27:13 | 0 | -| main.go:27:13:27:13 | 0 | main.go:27:2:27:13 | assign:0 ... := ... | -| main.go:28:5:28:8 | cond | main.go:28:5:28:10 | call to cond | -| main.go:28:5:28:10 | call to cond | main.go:26:1:32:1 | exit | -| main.go:28:5:28:10 | call to cond | main.go:28:5:28:10 | call to cond is false | -| main.go:28:5:28:10 | call to cond | main.go:28:5:28:10 | call to cond is true | -| main.go:28:5:28:10 | call to cond is false | main.go:31:9:31:9 | a | -| main.go:28:5:28:10 | call to cond is true | main.go:29:3:29:3 | skip | -| main.go:29:3:29:3 | skip | main.go:29:6:29:6 | skip | +| main.go:27:2:27:13 | assign:1 ... := ... | main.go:27:2:27:13 | After ... := ... | +| main.go:27:10:27:10 | After x | main.go:27:13:27:13 | Before 0 | +| main.go:27:10:27:10 | Before x | main.go:27:10:27:10 | x | +| main.go:27:10:27:10 | x | main.go:27:10:27:10 | After x | +| main.go:27:13:27:13 | 0 | main.go:27:13:27:13 | After 0 | +| main.go:27:13:27:13 | After 0 | main.go:27:2:27:13 | assign:0 ... := ... | +| main.go:27:13:27:13 | Before 0 | main.go:27:13:27:13 | 0 | +| main.go:28:2:30:2 | After if statement | main.go:31:2:31:12 | Before return statement | +| main.go:28:2:30:2 | if statement | main.go:28:5:28:10 | Before call to cond | +| main.go:28:5:28:8 | After cond | main.go:28:5:28:10 | call to cond | +| main.go:28:5:28:8 | Before cond | main.go:28:5:28:8 | cond | +| main.go:28:5:28:8 | cond | main.go:28:5:28:8 | After cond | +| main.go:28:5:28:10 | After call to cond [false] | main.go:28:2:30:2 | After if statement | +| main.go:28:5:28:10 | After call to cond [true] | main.go:28:12:30:2 | block statement | +| main.go:28:5:28:10 | Before call to cond | main.go:28:5:28:8 | Before cond | +| main.go:28:5:28:10 | call to cond | main.go:26:1:32:1 | Exceptional Exit | +| main.go:28:5:28:10 | call to cond | main.go:28:5:28:10 | After call to cond [false] | +| main.go:28:5:28:10 | call to cond | main.go:28:5:28:10 | After call to cond [true] | +| main.go:28:12:30:2 | After block statement | main.go:28:2:30:2 | After if statement | +| main.go:28:12:30:2 | block statement | main.go:29:3:29:13 | ... = ... | +| main.go:29:3:29:13 | ... = ... | main.go:29:10:29:10 | Before b | +| main.go:29:3:29:13 | After ... = ... | main.go:28:12:30:2 | After block statement | | main.go:29:3:29:13 | assign:0 ... = ... | main.go:29:3:29:13 | assign:1 ... = ... | -| main.go:29:3:29:13 | assign:1 ... = ... | main.go:31:9:31:9 | a | -| main.go:29:6:29:6 | skip | main.go:29:10:29:10 | b | -| main.go:29:10:29:10 | b | main.go:29:13:29:13 | a | -| main.go:29:13:29:13 | a | main.go:29:3:29:13 | assign:0 ... = ... | -| main.go:31:2:31:12 | return statement | main.go:26:1:32:1 | exit | -| main.go:31:9:31:9 | a | main.go:31:12:31:12 | b | -| main.go:31:12:31:12 | b | main.go:31:2:31:12 | return statement | -| main.go:34:1:36:1 | entry | main.go:34:11:34:11 | x | -| main.go:34:1:36:1 | function declaration | main.go:38:6:38:8 | skip | -| main.go:34:6:34:9 | skip | main.go:34:1:36:1 | function declaration | -| main.go:34:11:34:11 | x | main.go:34:11:34:11 | x | -| main.go:34:11:34:11 | x | main.go:35:3:35:3 | x | -| main.go:35:2:35:3 | star expression | main.go:34:1:36:1 | exit | -| main.go:35:2:35:3 | star expression | main.go:35:8:35:9 | 19 | -| main.go:35:2:35:9 | assign:0 ... += ... | main.go:34:1:36:1 | exit | +| main.go:29:3:29:13 | assign:1 ... = ... | main.go:29:3:29:13 | After ... = ... | +| main.go:29:10:29:10 | After b | main.go:29:13:29:13 | Before a | +| main.go:29:10:29:10 | Before b | main.go:29:10:29:10 | b | +| main.go:29:10:29:10 | b | main.go:29:10:29:10 | After b | +| main.go:29:13:29:13 | After a | main.go:29:3:29:13 | assign:0 ... = ... | +| main.go:29:13:29:13 | Before a | main.go:29:13:29:13 | a | +| main.go:29:13:29:13 | a | main.go:29:13:29:13 | After a | +| main.go:31:2:31:12 | Before return statement | main.go:31:9:31:9 | Before a | +| main.go:31:2:31:12 | return statement | main.go:26:1:32:1 | Normal Exit | +| main.go:31:9:31:9 | After a | main.go:31:12:31:12 | Before b | +| main.go:31:9:31:9 | Before a | main.go:31:9:31:9 | a | +| main.go:31:9:31:9 | a | main.go:31:9:31:9 | After a | +| main.go:31:12:31:12 | After b | main.go:31:2:31:12 | return statement | +| main.go:31:12:31:12 | Before b | main.go:31:12:31:12 | b | +| main.go:31:12:31:12 | b | main.go:31:12:31:12 | After b | +| main.go:34:1:36:1 | After function declaration | main.go:38:1:45:1 | Before function declaration | +| main.go:34:1:36:1 | Before function declaration | main.go:34:1:36:1 | function declaration | +| main.go:34:1:36:1 | Entry | main.go:34:11:34:11 | x | +| main.go:34:1:36:1 | Normal Exit | main.go:34:1:36:1 | Exit | +| main.go:34:1:36:1 | function declaration | main.go:34:1:36:1 | After function declaration | +| main.go:34:11:34:11 | x | main.go:34:19:36:1 | block statement | +| main.go:34:19:36:1 | After block statement | main.go:34:1:36:1 | Normal Exit | +| main.go:34:19:36:1 | block statement | main.go:35:2:35:9 | ... += ... | +| main.go:35:2:35:3 | After star expression | main.go:35:8:35:9 | Before 19 | +| main.go:35:2:35:3 | Before star expression | main.go:35:3:35:3 | Before x | +| main.go:35:2:35:3 | star expression | main.go:35:2:35:3 | After star expression | +| main.go:35:2:35:9 | ... += ... | main.go:35:2:35:3 | Before star expression | +| main.go:35:2:35:9 | After ... += ... | main.go:34:19:36:1 | After block statement | +| main.go:35:2:35:9 | assign:0 ... += ... | main.go:35:2:35:9 | After ... += ... | | main.go:35:2:35:9 | compound-rhs ... += ... | main.go:35:2:35:9 | assign:0 ... += ... | -| main.go:35:3:35:3 | x | main.go:35:2:35:3 | star expression | -| main.go:35:8:35:9 | 19 | main.go:35:2:35:9 | compound-rhs ... += ... | -| main.go:38:1:45:1 | entry | main.go:39:2:39:2 | skip | -| main.go:38:1:45:1 | function declaration | main.go:47:6:47:8 | skip | -| main.go:38:6:38:8 | skip | main.go:38:1:45:1 | function declaration | -| main.go:39:2:39:2 | skip | main.go:39:7:39:8 | 23 | -| main.go:39:2:39:8 | assign:0 ... := ... | main.go:40:2:40:4 | skip | -| main.go:39:7:39:8 | 23 | main.go:39:2:39:8 | assign:0 ... := ... | -| main.go:40:2:40:4 | skip | main.go:40:10:40:10 | x | -| main.go:40:2:40:10 | assign:0 ... := ... | main.go:41:5:41:8 | cond | -| main.go:40:9:40:10 | &... | main.go:40:2:40:10 | assign:0 ... := ... | -| main.go:40:10:40:10 | x | main.go:40:9:40:10 | &... | -| main.go:41:5:41:8 | cond | main.go:41:5:41:10 | call to cond | -| main.go:41:5:41:10 | call to cond | main.go:38:1:45:1 | exit | -| main.go:41:5:41:10 | call to cond | main.go:41:5:41:10 | call to cond is false | -| main.go:41:5:41:10 | call to cond | main.go:41:5:41:10 | call to cond is true | -| main.go:41:5:41:10 | call to cond is false | main.go:44:2:44:10 | selection of Print | -| main.go:41:5:41:10 | call to cond is true | main.go:42:3:42:6 | bump | -| main.go:42:3:42:6 | bump | main.go:42:8:42:10 | ptr | -| main.go:42:3:42:11 | call to bump | main.go:38:1:45:1 | exit | -| main.go:42:3:42:11 | call to bump | main.go:44:2:44:10 | selection of Print | -| main.go:42:8:42:10 | ptr | main.go:42:3:42:11 | call to bump | -| main.go:44:2:44:10 | selection of Print | main.go:44:12:44:12 | x | -| main.go:44:2:44:13 | call to Print | main.go:38:1:45:1 | exit | -| main.go:44:12:44:12 | x | main.go:44:2:44:13 | call to Print | -| main.go:47:1:50:1 | entry | main.go:47:25:50:1 | result-zero-init:0 block statement | -| main.go:47:1:50:1 | function declaration | main.go:52:6:52:9 | skip | -| main.go:47:6:47:8 | skip | main.go:47:1:50:1 | function declaration | -| main.go:47:25:50:1 | result-init:0 block statement | main.go:48:2:48:7 | skip | -| main.go:47:25:50:1 | result-read:0 block statement | main.go:47:1:50:1 | exit | +| main.go:35:3:35:3 | After x | main.go:35:2:35:3 | star expression | +| main.go:35:3:35:3 | Before x | main.go:35:3:35:3 | x | +| main.go:35:3:35:3 | x | main.go:35:3:35:3 | After x | +| main.go:35:8:35:9 | 19 | main.go:35:8:35:9 | After 19 | +| main.go:35:8:35:9 | After 19 | main.go:35:2:35:9 | compound-rhs ... += ... | +| main.go:35:8:35:9 | Before 19 | main.go:35:8:35:9 | 19 | +| main.go:38:1:45:1 | After function declaration | main.go:47:1:50:1 | Before function declaration | +| main.go:38:1:45:1 | Before function declaration | main.go:38:1:45:1 | function declaration | +| main.go:38:1:45:1 | Entry | main.go:38:12:45:1 | block statement | +| main.go:38:1:45:1 | Exceptional Exit | main.go:38:1:45:1 | Exit | +| main.go:38:1:45:1 | Normal Exit | main.go:38:1:45:1 | Exit | +| main.go:38:1:45:1 | function declaration | main.go:38:1:45:1 | After function declaration | +| main.go:38:12:45:1 | After block statement | main.go:38:1:45:1 | Normal Exit | +| main.go:38:12:45:1 | block statement | main.go:39:2:39:8 | ... := ... | +| main.go:39:2:39:8 | ... := ... | main.go:39:7:39:8 | Before 23 | +| main.go:39:2:39:8 | After ... := ... | main.go:40:2:40:10 | ... := ... | +| main.go:39:2:39:8 | assign:0 ... := ... | main.go:39:2:39:8 | After ... := ... | +| main.go:39:7:39:8 | 23 | main.go:39:7:39:8 | After 23 | +| main.go:39:7:39:8 | After 23 | main.go:39:2:39:8 | assign:0 ... := ... | +| main.go:39:7:39:8 | Before 23 | main.go:39:7:39:8 | 23 | +| main.go:40:2:40:10 | ... := ... | main.go:40:9:40:10 | Before &... | +| main.go:40:2:40:10 | After ... := ... | main.go:41:2:43:2 | if statement | +| main.go:40:2:40:10 | assign:0 ... := ... | main.go:40:2:40:10 | After ... := ... | +| main.go:40:9:40:10 | &... | main.go:40:9:40:10 | After &... | +| main.go:40:9:40:10 | After &... | main.go:40:2:40:10 | assign:0 ... := ... | +| main.go:40:9:40:10 | Before &... | main.go:40:10:40:10 | Before x | +| main.go:40:10:40:10 | After x | main.go:40:9:40:10 | &... | +| main.go:40:10:40:10 | Before x | main.go:40:10:40:10 | x | +| main.go:40:10:40:10 | x | main.go:40:10:40:10 | After x | +| main.go:41:2:43:2 | After if statement | main.go:44:2:44:13 | expression statement | +| main.go:41:2:43:2 | if statement | main.go:41:5:41:10 | Before call to cond | +| main.go:41:5:41:8 | After cond | main.go:41:5:41:10 | call to cond | +| main.go:41:5:41:8 | Before cond | main.go:41:5:41:8 | cond | +| main.go:41:5:41:8 | cond | main.go:41:5:41:8 | After cond | +| main.go:41:5:41:10 | After call to cond [false] | main.go:41:2:43:2 | After if statement | +| main.go:41:5:41:10 | After call to cond [true] | main.go:41:12:43:2 | block statement | +| main.go:41:5:41:10 | Before call to cond | main.go:41:5:41:8 | Before cond | +| main.go:41:5:41:10 | call to cond | main.go:38:1:45:1 | Exceptional Exit | +| main.go:41:5:41:10 | call to cond | main.go:41:5:41:10 | After call to cond [false] | +| main.go:41:5:41:10 | call to cond | main.go:41:5:41:10 | After call to cond [true] | +| main.go:41:12:43:2 | After block statement | main.go:41:2:43:2 | After if statement | +| main.go:41:12:43:2 | block statement | main.go:42:3:42:11 | expression statement | +| main.go:42:3:42:6 | After bump | main.go:42:8:42:10 | Before ptr | +| main.go:42:3:42:6 | Before bump | main.go:42:3:42:6 | bump | +| main.go:42:3:42:6 | bump | main.go:42:3:42:6 | After bump | +| main.go:42:3:42:11 | After call to bump | main.go:42:3:42:11 | After expression statement | +| main.go:42:3:42:11 | After expression statement | main.go:41:12:43:2 | After block statement | +| main.go:42:3:42:11 | Before call to bump | main.go:42:3:42:6 | Before bump | +| main.go:42:3:42:11 | call to bump | main.go:38:1:45:1 | Exceptional Exit | +| main.go:42:3:42:11 | call to bump | main.go:42:3:42:11 | After call to bump | +| main.go:42:3:42:11 | expression statement | main.go:42:3:42:11 | Before call to bump | +| main.go:42:8:42:10 | After ptr | main.go:42:3:42:11 | call to bump | +| main.go:42:8:42:10 | Before ptr | main.go:42:8:42:10 | ptr | +| main.go:42:8:42:10 | ptr | main.go:42:8:42:10 | After ptr | +| main.go:44:2:44:10 | After selection of Print | main.go:44:12:44:12 | Before x | +| main.go:44:2:44:10 | Before selection of Print | main.go:44:2:44:10 | selection of Print | +| main.go:44:2:44:10 | selection of Print | main.go:44:2:44:10 | After selection of Print | +| main.go:44:2:44:13 | After call to Print | main.go:44:2:44:13 | After expression statement | +| main.go:44:2:44:13 | After expression statement | main.go:38:12:45:1 | After block statement | +| main.go:44:2:44:13 | Before call to Print | main.go:44:2:44:10 | Before selection of Print | +| main.go:44:2:44:13 | call to Print | main.go:38:1:45:1 | Exceptional Exit | +| main.go:44:2:44:13 | call to Print | main.go:44:2:44:13 | After call to Print | +| main.go:44:2:44:13 | expression statement | main.go:44:2:44:13 | Before call to Print | +| main.go:44:12:44:12 | After x | main.go:44:2:44:13 | call to Print | +| main.go:44:12:44:12 | Before x | main.go:44:12:44:12 | x | +| main.go:44:12:44:12 | x | main.go:44:12:44:12 | After x | +| main.go:47:1:50:1 | After function declaration | main.go:52:1:54:1 | Before function declaration | +| main.go:47:1:50:1 | Before function declaration | main.go:47:1:50:1 | function declaration | +| main.go:47:1:50:1 | Entry | main.go:47:25:50:1 | block statement | +| main.go:47:1:50:1 | Normal Exit | main.go:47:1:50:1 | Exit | +| main.go:47:1:50:1 | function declaration | main.go:47:1:50:1 | After function declaration | +| main.go:47:25:50:1 | block statement | main.go:47:25:50:1 | result-zero-init:0 block statement | +| main.go:47:25:50:1 | result-init:0 block statement | main.go:48:2:48:12 | ... = ... | +| main.go:47:25:50:1 | result-read:0 block statement | main.go:47:1:50:1 | Normal Exit | | main.go:47:25:50:1 | result-zero-init:0 block statement | main.go:47:25:50:1 | result-init:0 block statement | -| main.go:48:2:48:7 | skip | main.go:48:11:48:12 | 42 | -| main.go:48:2:48:12 | assign:0 ... = ... | main.go:49:2:49:7 | return statement | -| main.go:48:11:48:12 | 42 | main.go:48:2:48:12 | assign:0 ... = ... | +| main.go:48:2:48:12 | ... = ... | main.go:48:11:48:12 | Before 42 | +| main.go:48:2:48:12 | After ... = ... | main.go:49:2:49:7 | Before return statement | +| main.go:48:2:48:12 | assign:0 ... = ... | main.go:48:2:48:12 | After ... = ... | +| main.go:48:11:48:12 | 42 | main.go:48:11:48:12 | After 42 | +| main.go:48:11:48:12 | After 42 | main.go:48:2:48:12 | assign:0 ... = ... | +| main.go:48:11:48:12 | Before 42 | main.go:48:11:48:12 | 42 | +| main.go:49:2:49:7 | Before return statement | main.go:49:2:49:7 | return statement | | main.go:49:2:49:7 | return statement | main.go:47:25:50:1 | result-read:0 block statement | -| main.go:52:1:54:1 | entry | main.go:52:26:54:1 | result-zero-init:0 block statement | -| main.go:52:1:54:1 | function declaration | main.go:56:6:56:9 | skip | -| main.go:52:6:52:9 | skip | main.go:52:1:54:1 | function declaration | -| main.go:52:26:54:1 | result-init:0 block statement | main.go:53:2:53:7 | return statement | -| main.go:52:26:54:1 | result-read:0 block statement | main.go:52:1:54:1 | exit | +| main.go:52:1:54:1 | After function declaration | main.go:56:1:64:1 | Before function declaration | +| main.go:52:1:54:1 | Before function declaration | main.go:52:1:54:1 | function declaration | +| main.go:52:1:54:1 | Entry | main.go:52:26:54:1 | block statement | +| main.go:52:1:54:1 | Normal Exit | main.go:52:1:54:1 | Exit | +| main.go:52:1:54:1 | function declaration | main.go:52:1:54:1 | After function declaration | +| main.go:52:26:54:1 | block statement | main.go:52:26:54:1 | result-zero-init:0 block statement | +| main.go:52:26:54:1 | result-init:0 block statement | main.go:53:2:53:7 | Before return statement | +| main.go:52:26:54:1 | result-read:0 block statement | main.go:52:1:54:1 | Normal Exit | | main.go:52:26:54:1 | result-zero-init:0 block statement | main.go:52:26:54:1 | result-init:0 block statement | +| main.go:53:2:53:7 | Before return statement | main.go:53:2:53:7 | return statement | | main.go:53:2:53:7 | return statement | main.go:52:26:54:1 | result-read:0 block statement | -| main.go:56:1:64:1 | entry | main.go:56:11:56:18 | selector | -| main.go:56:1:64:1 | function declaration | main.go:66:6:66:10 | skip | -| main.go:56:6:56:9 | skip | main.go:56:1:64:1 | function declaration | -| main.go:56:11:56:18 | selector | main.go:56:11:56:18 | selector | -| main.go:56:11:56:18 | selector | main.go:56:38:64:1 | result-zero-init:0 block statement | -| main.go:56:38:64:1 | result-init:0 block statement | main.go:57:2:57:7 | skip | -| main.go:56:38:64:1 | result-read:0 block statement | main.go:56:1:64:1 | exit | +| main.go:56:1:64:1 | After function declaration | main.go:66:1:90:1 | Before function declaration | +| main.go:56:1:64:1 | Before function declaration | main.go:56:1:64:1 | function declaration | +| main.go:56:1:64:1 | Entry | main.go:56:11:56:18 | selector | +| main.go:56:1:64:1 | Normal Exit | main.go:56:1:64:1 | Exit | +| main.go:56:1:64:1 | function declaration | main.go:56:1:64:1 | After function declaration | +| main.go:56:11:56:18 | selector | main.go:56:38:64:1 | block statement | +| main.go:56:38:64:1 | block statement | main.go:56:38:64:1 | result-zero-init:0 block statement | +| main.go:56:38:64:1 | result-init:0 block statement | main.go:57:2:57:11 | ... = ... | +| main.go:56:38:64:1 | result-read:0 block statement | main.go:56:1:64:1 | Normal Exit | | main.go:56:38:64:1 | result-zero-init:0 block statement | main.go:56:38:64:1 | result-init:0 block statement | -| main.go:57:2:57:7 | skip | main.go:57:11:57:11 | 0 | -| main.go:57:2:57:11 | assign:0 ... = ... | main.go:58:5:58:12 | selector | -| main.go:57:11:57:11 | 0 | main.go:57:2:57:11 | assign:0 ... = ... | -| main.go:58:5:58:12 | selector | main.go:58:17:58:17 | 1 | -| main.go:58:5:58:17 | ...==... | main.go:58:5:58:17 | ...==... is false | -| main.go:58:5:58:17 | ...==... | main.go:58:5:58:17 | ...==... is true | -| main.go:58:5:58:17 | ...==... is false | main.go:61:3:61:8 | skip | -| main.go:58:5:58:17 | ...==... is true | main.go:59:10:59:10 | 1 | -| main.go:58:17:58:17 | 1 | main.go:58:5:58:17 | ...==... | +| main.go:57:2:57:11 | ... = ... | main.go:57:11:57:11 | Before 0 | +| main.go:57:2:57:11 | After ... = ... | main.go:58:2:62:2 | if statement | +| main.go:57:2:57:11 | assign:0 ... = ... | main.go:57:2:57:11 | After ... = ... | +| main.go:57:11:57:11 | 0 | main.go:57:11:57:11 | After 0 | +| main.go:57:11:57:11 | After 0 | main.go:57:2:57:11 | assign:0 ... = ... | +| main.go:57:11:57:11 | Before 0 | main.go:57:11:57:11 | 0 | +| main.go:58:2:62:2 | After if statement | main.go:63:2:63:7 | Before return statement | +| main.go:58:2:62:2 | if statement | main.go:58:5:58:17 | Before ...==... | +| main.go:58:5:58:12 | After selector | main.go:58:17:58:17 | Before 1 | +| main.go:58:5:58:12 | Before selector | main.go:58:5:58:12 | selector | +| main.go:58:5:58:12 | selector | main.go:58:5:58:12 | After selector | +| main.go:58:5:58:17 | ...==... | main.go:58:5:58:17 | After ...==... [false] | +| main.go:58:5:58:17 | ...==... | main.go:58:5:58:17 | After ...==... [true] | +| main.go:58:5:58:17 | After ...==... [false] | main.go:60:9:62:2 | block statement | +| main.go:58:5:58:17 | After ...==... [true] | main.go:58:19:60:2 | block statement | +| main.go:58:5:58:17 | Before ...==... | main.go:58:5:58:12 | Before selector | +| main.go:58:17:58:17 | 1 | main.go:58:17:58:17 | After 1 | +| main.go:58:17:58:17 | After 1 | main.go:58:5:58:17 | ...==... | +| main.go:58:17:58:17 | Before 1 | main.go:58:17:58:17 | 1 | +| main.go:58:19:60:2 | block statement | main.go:59:3:59:10 | Before return statement | +| main.go:59:3:59:10 | Before return statement | main.go:59:10:59:10 | Before 1 | | main.go:59:3:59:10 | result-write:0 return statement | main.go:59:3:59:10 | return statement | | main.go:59:3:59:10 | return statement | main.go:56:38:64:1 | result-read:0 block statement | -| main.go:59:10:59:10 | 1 | main.go:59:3:59:10 | result-write:0 return statement | -| main.go:61:3:61:8 | skip | main.go:61:12:61:12 | 2 | -| main.go:61:3:61:12 | assign:0 ... = ... | main.go:63:2:63:7 | return statement | -| main.go:61:12:61:12 | 2 | main.go:61:3:61:12 | assign:0 ... = ... | +| main.go:59:10:59:10 | 1 | main.go:59:10:59:10 | After 1 | +| main.go:59:10:59:10 | After 1 | main.go:59:3:59:10 | result-write:0 return statement | +| main.go:59:10:59:10 | Before 1 | main.go:59:10:59:10 | 1 | +| main.go:60:9:62:2 | After block statement | main.go:58:2:62:2 | After if statement | +| main.go:60:9:62:2 | block statement | main.go:61:3:61:12 | ... = ... | +| main.go:61:3:61:12 | ... = ... | main.go:61:12:61:12 | Before 2 | +| main.go:61:3:61:12 | After ... = ... | main.go:60:9:62:2 | After block statement | +| main.go:61:3:61:12 | assign:0 ... = ... | main.go:61:3:61:12 | After ... = ... | +| main.go:61:12:61:12 | 2 | main.go:61:12:61:12 | After 2 | +| main.go:61:12:61:12 | After 2 | main.go:61:3:61:12 | assign:0 ... = ... | +| main.go:61:12:61:12 | Before 2 | main.go:61:12:61:12 | 2 | +| main.go:63:2:63:7 | Before return statement | main.go:63:2:63:7 | return statement | | main.go:63:2:63:7 | return statement | main.go:56:38:64:1 | result-read:0 block statement | -| main.go:66:1:90:1 | entry | main.go:67:6:67:6 | skip | -| main.go:66:1:90:1 | function declaration | main.go:92:6:92:13 | skip | -| main.go:66:6:66:10 | skip | main.go:66:1:90:1 | function declaration | -| main.go:67:6:67:6 | skip | main.go:67:6:67:10 | zero-init:0 value declaration specifier | -| main.go:67:6:67:10 | assign:0 value declaration specifier | main.go:68:6:68:9 | cond | +| main.go:66:1:90:1 | After function declaration | main.go:92:1:96:1 | Before function declaration | +| main.go:66:1:90:1 | Before function declaration | main.go:66:1:90:1 | function declaration | +| main.go:66:1:90:1 | Entry | main.go:66:14:90:1 | block statement | +| main.go:66:1:90:1 | Exceptional Exit | main.go:66:1:90:1 | Exit | +| main.go:66:1:90:1 | Normal Exit | main.go:66:1:90:1 | Exit | +| main.go:66:1:90:1 | function declaration | main.go:66:1:90:1 | After function declaration | +| main.go:66:14:90:1 | After block statement | main.go:66:1:90:1 | Normal Exit | +| main.go:66:14:90:1 | block statement | main.go:67:2:67:10 | declaration statement | +| main.go:67:2:67:10 | After declaration statement | main.go:68:2:70:2 | for statement | +| main.go:67:2:67:10 | After variable declaration | main.go:67:2:67:10 | After declaration statement | +| main.go:67:2:67:10 | declaration statement | main.go:67:2:67:10 | variable declaration | +| main.go:67:2:67:10 | variable declaration | main.go:67:6:67:10 | value declaration specifier | +| main.go:67:6:67:10 | After value declaration specifier | main.go:67:2:67:10 | After variable declaration | +| main.go:67:6:67:10 | assign:0 value declaration specifier | main.go:67:6:67:10 | After value declaration specifier | +| main.go:67:6:67:10 | value declaration specifier | main.go:67:6:67:10 | zero-init:0 value declaration specifier | | main.go:67:6:67:10 | zero-init:0 value declaration specifier | main.go:67:6:67:10 | assign:0 value declaration specifier | -| main.go:68:6:68:9 | cond | main.go:68:6:68:11 | call to cond | -| main.go:68:6:68:11 | call to cond | main.go:66:1:90:1 | exit | -| main.go:68:6:68:11 | call to cond | main.go:68:6:68:11 | call to cond is false | -| main.go:68:6:68:11 | call to cond | main.go:68:6:68:11 | call to cond is true | -| main.go:68:6:68:11 | call to cond is false | main.go:71:2:71:10 | selection of Print | -| main.go:68:6:68:11 | call to cond is true | main.go:69:3:69:3 | skip | -| main.go:69:3:69:3 | skip | main.go:69:7:69:7 | 2 | -| main.go:69:3:69:7 | assign:0 ... = ... | main.go:68:6:68:9 | cond | -| main.go:69:7:69:7 | 2 | main.go:69:3:69:7 | assign:0 ... = ... | -| main.go:71:2:71:10 | selection of Print | main.go:71:12:71:12 | x | -| main.go:71:2:71:13 | call to Print | main.go:66:1:90:1 | exit | -| main.go:71:2:71:13 | call to Print | main.go:73:2:73:2 | skip | -| main.go:71:12:71:12 | x | main.go:71:2:71:13 | call to Print | -| main.go:73:2:73:2 | skip | main.go:73:7:73:7 | 1 | -| main.go:73:2:73:7 | assign:0 ... := ... | main.go:74:6:74:6 | skip | -| main.go:73:7:73:7 | 1 | main.go:73:2:73:7 | assign:0 ... := ... | -| main.go:74:6:74:6 | skip | main.go:74:11:74:11 | 0 | -| main.go:74:6:74:11 | assign:0 ... := ... | main.go:75:6:75:9 | cond | -| main.go:74:11:74:11 | 0 | main.go:74:6:74:11 | assign:0 ... := ... | -| main.go:74:16:74:16 | i | main.go:74:16:74:18 | 1 | -| main.go:74:16:74:18 | 1 | main.go:74:16:74:18 | incdec-rhs increment statement | +| main.go:68:2:70:2 | After for statement | main.go:71:2:71:13 | expression statement | +| main.go:68:2:70:2 | [LoopHeader] for statement | main.go:68:6:68:11 | Before call to cond | +| main.go:68:2:70:2 | for statement | main.go:68:6:68:11 | Before call to cond | +| main.go:68:6:68:9 | After cond | main.go:68:6:68:11 | call to cond | +| main.go:68:6:68:9 | Before cond | main.go:68:6:68:9 | cond | +| main.go:68:6:68:9 | cond | main.go:68:6:68:9 | After cond | +| main.go:68:6:68:11 | After call to cond [false] | main.go:68:2:70:2 | After for statement | +| main.go:68:6:68:11 | After call to cond [true] | main.go:68:13:70:2 | block statement | +| main.go:68:6:68:11 | Before call to cond | main.go:68:6:68:9 | Before cond | +| main.go:68:6:68:11 | call to cond | main.go:66:1:90:1 | Exceptional Exit | +| main.go:68:6:68:11 | call to cond | main.go:68:6:68:11 | After call to cond [false] | +| main.go:68:6:68:11 | call to cond | main.go:68:6:68:11 | After call to cond [true] | +| main.go:68:13:70:2 | After block statement | main.go:68:2:70:2 | [LoopHeader] for statement | +| main.go:68:13:70:2 | block statement | main.go:69:3:69:7 | ... = ... | +| main.go:69:3:69:7 | ... = ... | main.go:69:7:69:7 | Before 2 | +| main.go:69:3:69:7 | After ... = ... | main.go:68:13:70:2 | After block statement | +| main.go:69:3:69:7 | assign:0 ... = ... | main.go:69:3:69:7 | After ... = ... | +| main.go:69:7:69:7 | 2 | main.go:69:7:69:7 | After 2 | +| main.go:69:7:69:7 | After 2 | main.go:69:3:69:7 | assign:0 ... = ... | +| main.go:69:7:69:7 | Before 2 | main.go:69:7:69:7 | 2 | +| main.go:71:2:71:10 | After selection of Print | main.go:71:12:71:12 | Before x | +| main.go:71:2:71:10 | Before selection of Print | main.go:71:2:71:10 | selection of Print | +| main.go:71:2:71:10 | selection of Print | main.go:71:2:71:10 | After selection of Print | +| main.go:71:2:71:13 | After call to Print | main.go:71:2:71:13 | After expression statement | +| main.go:71:2:71:13 | After expression statement | main.go:73:2:73:7 | ... := ... | +| main.go:71:2:71:13 | Before call to Print | main.go:71:2:71:10 | Before selection of Print | +| main.go:71:2:71:13 | call to Print | main.go:66:1:90:1 | Exceptional Exit | +| main.go:71:2:71:13 | call to Print | main.go:71:2:71:13 | After call to Print | +| main.go:71:2:71:13 | expression statement | main.go:71:2:71:13 | Before call to Print | +| main.go:71:12:71:12 | After x | main.go:71:2:71:13 | call to Print | +| main.go:71:12:71:12 | Before x | main.go:71:12:71:12 | x | +| main.go:71:12:71:12 | x | main.go:71:12:71:12 | After x | +| main.go:73:2:73:7 | ... := ... | main.go:73:7:73:7 | Before 1 | +| main.go:73:2:73:7 | After ... := ... | main.go:74:2:79:2 | for statement | +| main.go:73:2:73:7 | assign:0 ... := ... | main.go:73:2:73:7 | After ... := ... | +| main.go:73:7:73:7 | 1 | main.go:73:7:73:7 | After 1 | +| main.go:73:7:73:7 | After 1 | main.go:73:2:73:7 | assign:0 ... := ... | +| main.go:73:7:73:7 | Before 1 | main.go:73:7:73:7 | 1 | +| main.go:74:2:79:2 | After for statement | main.go:80:2:80:13 | expression statement | +| main.go:74:2:79:2 | [LoopHeader] for statement | main.go:74:16:74:18 | Before increment statement | +| main.go:74:2:79:2 | for statement | main.go:74:6:74:11 | ... := ... | +| main.go:74:6:74:11 | ... := ... | main.go:74:11:74:11 | Before 0 | +| main.go:74:6:74:11 | After ... := ... | main.go:74:20:79:2 | block statement | +| main.go:74:6:74:11 | assign:0 ... := ... | main.go:74:6:74:11 | After ... := ... | +| main.go:74:11:74:11 | 0 | main.go:74:11:74:11 | After 0 | +| main.go:74:11:74:11 | After 0 | main.go:74:6:74:11 | assign:0 ... := ... | +| main.go:74:11:74:11 | Before 0 | main.go:74:11:74:11 | 0 | +| main.go:74:16:74:16 | After i | main.go:74:16:74:18 | implicit-one increment statement | +| main.go:74:16:74:16 | Before i | main.go:74:16:74:16 | i | +| main.go:74:16:74:16 | i | main.go:74:16:74:16 | After i | +| main.go:74:16:74:18 | After increment statement | main.go:74:20:79:2 | block statement | +| main.go:74:16:74:18 | Before increment statement | main.go:74:16:74:16 | Before i | +| main.go:74:16:74:18 | implicit-one increment statement | main.go:74:16:74:18 | incdec-rhs increment statement | | main.go:74:16:74:18 | incdec-rhs increment statement | main.go:74:16:74:18 | increment statement | -| main.go:74:16:74:18 | increment statement | main.go:75:6:75:9 | cond | -| main.go:75:6:75:9 | cond | main.go:75:6:75:11 | call to cond | -| main.go:75:6:75:11 | call to cond | main.go:66:1:90:1 | exit | -| main.go:75:6:75:11 | call to cond | main.go:75:6:75:11 | call to cond is false | -| main.go:75:6:75:11 | call to cond | main.go:75:6:75:11 | call to cond is true | -| main.go:75:6:75:11 | call to cond is false | main.go:78:3:78:3 | skip | -| main.go:75:6:75:11 | call to cond is true | main.go:76:4:76:8 | skip | -| main.go:76:4:76:8 | skip | main.go:80:2:80:10 | selection of Print | -| main.go:78:3:78:3 | skip | main.go:78:7:78:7 | 2 | -| main.go:78:3:78:7 | assign:0 ... = ... | main.go:74:16:74:16 | i | -| main.go:78:7:78:7 | 2 | main.go:78:3:78:7 | assign:0 ... = ... | -| main.go:80:2:80:10 | selection of Print | main.go:80:12:80:12 | y | -| main.go:80:2:80:13 | call to Print | main.go:66:1:90:1 | exit | -| main.go:80:2:80:13 | call to Print | main.go:82:2:82:2 | skip | -| main.go:80:12:80:12 | y | main.go:80:2:80:13 | call to Print | -| main.go:82:2:82:2 | skip | main.go:82:7:82:7 | 1 | -| main.go:82:2:82:7 | assign:0 ... := ... | main.go:83:6:83:6 | skip | -| main.go:82:7:82:7 | 1 | main.go:82:2:82:7 | assign:0 ... := ... | -| main.go:83:6:83:6 | skip | main.go:83:11:83:11 | 0 | -| main.go:83:6:83:11 | assign:0 ... := ... | main.go:84:3:84:3 | skip | -| main.go:83:11:83:11 | 0 | main.go:83:6:83:11 | assign:0 ... := ... | -| main.go:83:16:83:16 | i | main.go:83:16:83:18 | 1 | -| main.go:83:16:83:18 | 1 | main.go:83:16:83:18 | incdec-rhs increment statement | +| main.go:74:16:74:18 | increment statement | main.go:74:16:74:18 | After increment statement | +| main.go:74:20:79:2 | After block statement | main.go:74:2:79:2 | [LoopHeader] for statement | +| main.go:74:20:79:2 | block statement | main.go:75:3:77:3 | if statement | +| main.go:75:3:77:3 | After if statement | main.go:78:3:78:7 | ... = ... | +| main.go:75:3:77:3 | if statement | main.go:75:6:75:11 | Before call to cond | +| main.go:75:6:75:9 | After cond | main.go:75:6:75:11 | call to cond | +| main.go:75:6:75:9 | Before cond | main.go:75:6:75:9 | cond | +| main.go:75:6:75:9 | cond | main.go:75:6:75:9 | After cond | +| main.go:75:6:75:11 | After call to cond [false] | main.go:75:3:77:3 | After if statement | +| main.go:75:6:75:11 | After call to cond [true] | main.go:75:13:77:3 | block statement | +| main.go:75:6:75:11 | Before call to cond | main.go:75:6:75:9 | Before cond | +| main.go:75:6:75:11 | call to cond | main.go:66:1:90:1 | Exceptional Exit | +| main.go:75:6:75:11 | call to cond | main.go:75:6:75:11 | After call to cond [false] | +| main.go:75:6:75:11 | call to cond | main.go:75:6:75:11 | After call to cond [true] | +| main.go:75:13:77:3 | block statement | main.go:76:4:76:8 | Before break statement | +| main.go:76:4:76:8 | Before break statement | main.go:76:4:76:8 | break statement | +| main.go:76:4:76:8 | break statement | main.go:74:2:79:2 | After for statement | +| main.go:78:3:78:7 | ... = ... | main.go:78:7:78:7 | Before 2 | +| main.go:78:3:78:7 | After ... = ... | main.go:74:20:79:2 | After block statement | +| main.go:78:3:78:7 | assign:0 ... = ... | main.go:78:3:78:7 | After ... = ... | +| main.go:78:7:78:7 | 2 | main.go:78:7:78:7 | After 2 | +| main.go:78:7:78:7 | After 2 | main.go:78:3:78:7 | assign:0 ... = ... | +| main.go:78:7:78:7 | Before 2 | main.go:78:7:78:7 | 2 | +| main.go:80:2:80:10 | After selection of Print | main.go:80:12:80:12 | Before y | +| main.go:80:2:80:10 | Before selection of Print | main.go:80:2:80:10 | selection of Print | +| main.go:80:2:80:10 | selection of Print | main.go:80:2:80:10 | After selection of Print | +| main.go:80:2:80:13 | After call to Print | main.go:80:2:80:13 | After expression statement | +| main.go:80:2:80:13 | After expression statement | main.go:82:2:82:7 | ... := ... | +| main.go:80:2:80:13 | Before call to Print | main.go:80:2:80:10 | Before selection of Print | +| main.go:80:2:80:13 | call to Print | main.go:66:1:90:1 | Exceptional Exit | +| main.go:80:2:80:13 | call to Print | main.go:80:2:80:13 | After call to Print | +| main.go:80:2:80:13 | expression statement | main.go:80:2:80:13 | Before call to Print | +| main.go:80:12:80:12 | After y | main.go:80:2:80:13 | call to Print | +| main.go:80:12:80:12 | Before y | main.go:80:12:80:12 | y | +| main.go:80:12:80:12 | y | main.go:80:12:80:12 | After y | +| main.go:82:2:82:7 | ... := ... | main.go:82:7:82:7 | Before 1 | +| main.go:82:2:82:7 | After ... := ... | main.go:83:2:88:2 | for statement | +| main.go:82:2:82:7 | assign:0 ... := ... | main.go:82:2:82:7 | After ... := ... | +| main.go:82:7:82:7 | 1 | main.go:82:7:82:7 | After 1 | +| main.go:82:7:82:7 | After 1 | main.go:82:2:82:7 | assign:0 ... := ... | +| main.go:82:7:82:7 | Before 1 | main.go:82:7:82:7 | 1 | +| main.go:83:2:88:2 | After for statement | main.go:89:2:89:13 | expression statement | +| main.go:83:2:88:2 | [LoopHeader] for statement | main.go:83:16:83:18 | Before increment statement | +| main.go:83:2:88:2 | for statement | main.go:83:6:83:11 | ... := ... | +| main.go:83:6:83:11 | ... := ... | main.go:83:11:83:11 | Before 0 | +| main.go:83:6:83:11 | After ... := ... | main.go:83:20:88:2 | block statement | +| main.go:83:6:83:11 | assign:0 ... := ... | main.go:83:6:83:11 | After ... := ... | +| main.go:83:11:83:11 | 0 | main.go:83:11:83:11 | After 0 | +| main.go:83:11:83:11 | After 0 | main.go:83:6:83:11 | assign:0 ... := ... | +| main.go:83:11:83:11 | Before 0 | main.go:83:11:83:11 | 0 | +| main.go:83:16:83:16 | After i | main.go:83:16:83:18 | implicit-one increment statement | +| main.go:83:16:83:16 | Before i | main.go:83:16:83:16 | i | +| main.go:83:16:83:16 | i | main.go:83:16:83:16 | After i | +| main.go:83:16:83:18 | After increment statement | main.go:83:20:88:2 | block statement | +| main.go:83:16:83:18 | Before increment statement | main.go:83:16:83:16 | Before i | +| main.go:83:16:83:18 | implicit-one increment statement | main.go:83:16:83:18 | incdec-rhs increment statement | | main.go:83:16:83:18 | incdec-rhs increment statement | main.go:83:16:83:18 | increment statement | -| main.go:83:16:83:18 | increment statement | main.go:84:3:84:3 | skip | -| main.go:84:3:84:3 | skip | main.go:84:7:84:7 | 2 | -| main.go:84:3:84:7 | assign:0 ... = ... | main.go:85:6:85:9 | cond | -| main.go:84:7:84:7 | 2 | main.go:84:3:84:7 | assign:0 ... = ... | -| main.go:85:6:85:9 | cond | main.go:85:6:85:11 | call to cond | -| main.go:85:6:85:11 | call to cond | main.go:66:1:90:1 | exit | -| main.go:85:6:85:11 | call to cond | main.go:85:6:85:11 | call to cond is false | -| main.go:85:6:85:11 | call to cond | main.go:85:6:85:11 | call to cond is true | -| main.go:85:6:85:11 | call to cond is false | main.go:83:16:83:16 | i | -| main.go:85:6:85:11 | call to cond is true | main.go:86:4:86:8 | skip | -| main.go:86:4:86:8 | skip | main.go:89:2:89:10 | selection of Print | -| main.go:89:2:89:10 | selection of Print | main.go:89:12:89:12 | z | -| main.go:89:2:89:13 | call to Print | main.go:66:1:90:1 | exit | -| main.go:89:12:89:12 | z | main.go:89:2:89:13 | call to Print | -| main.go:92:1:96:1 | entry | main.go:92:36:96:1 | result-zero-init:0 block statement | -| main.go:92:1:96:1 | function declaration | main.go:98:6:98:23 | skip | -| main.go:92:6:92:13 | skip | main.go:92:1:96:1 | function declaration | +| main.go:83:16:83:18 | increment statement | main.go:83:16:83:18 | After increment statement | +| main.go:83:20:88:2 | After block statement | main.go:83:2:88:2 | [LoopHeader] for statement | +| main.go:83:20:88:2 | block statement | main.go:84:3:84:7 | ... = ... | +| main.go:84:3:84:7 | ... = ... | main.go:84:7:84:7 | Before 2 | +| main.go:84:3:84:7 | After ... = ... | main.go:85:3:87:3 | if statement | +| main.go:84:3:84:7 | assign:0 ... = ... | main.go:84:3:84:7 | After ... = ... | +| main.go:84:7:84:7 | 2 | main.go:84:7:84:7 | After 2 | +| main.go:84:7:84:7 | After 2 | main.go:84:3:84:7 | assign:0 ... = ... | +| main.go:84:7:84:7 | Before 2 | main.go:84:7:84:7 | 2 | +| main.go:85:3:87:3 | After if statement | main.go:83:20:88:2 | After block statement | +| main.go:85:3:87:3 | if statement | main.go:85:6:85:11 | Before call to cond | +| main.go:85:6:85:9 | After cond | main.go:85:6:85:11 | call to cond | +| main.go:85:6:85:9 | Before cond | main.go:85:6:85:9 | cond | +| main.go:85:6:85:9 | cond | main.go:85:6:85:9 | After cond | +| main.go:85:6:85:11 | After call to cond [false] | main.go:85:3:87:3 | After if statement | +| main.go:85:6:85:11 | After call to cond [true] | main.go:85:13:87:3 | block statement | +| main.go:85:6:85:11 | Before call to cond | main.go:85:6:85:9 | Before cond | +| main.go:85:6:85:11 | call to cond | main.go:66:1:90:1 | Exceptional Exit | +| main.go:85:6:85:11 | call to cond | main.go:85:6:85:11 | After call to cond [false] | +| main.go:85:6:85:11 | call to cond | main.go:85:6:85:11 | After call to cond [true] | +| main.go:85:13:87:3 | block statement | main.go:86:4:86:8 | Before break statement | +| main.go:86:4:86:8 | Before break statement | main.go:86:4:86:8 | break statement | +| main.go:86:4:86:8 | break statement | main.go:83:2:88:2 | After for statement | +| main.go:89:2:89:10 | After selection of Print | main.go:89:12:89:12 | Before z | +| main.go:89:2:89:10 | Before selection of Print | main.go:89:2:89:10 | selection of Print | +| main.go:89:2:89:10 | selection of Print | main.go:89:2:89:10 | After selection of Print | +| main.go:89:2:89:13 | After call to Print | main.go:89:2:89:13 | After expression statement | +| main.go:89:2:89:13 | After expression statement | main.go:66:14:90:1 | After block statement | +| main.go:89:2:89:13 | Before call to Print | main.go:89:2:89:10 | Before selection of Print | +| main.go:89:2:89:13 | call to Print | main.go:66:1:90:1 | Exceptional Exit | +| main.go:89:2:89:13 | call to Print | main.go:89:2:89:13 | After call to Print | +| main.go:89:2:89:13 | expression statement | main.go:89:2:89:13 | Before call to Print | +| main.go:89:12:89:12 | After z | main.go:89:2:89:13 | call to Print | +| main.go:89:12:89:12 | Before z | main.go:89:12:89:12 | z | +| main.go:89:12:89:12 | z | main.go:89:12:89:12 | After z | +| main.go:92:1:96:1 | After function declaration | main.go:98:1:106:1 | Before function declaration | +| main.go:92:1:96:1 | Before function declaration | main.go:92:1:96:1 | function declaration | +| main.go:92:1:96:1 | Entry | main.go:92:36:96:1 | block statement | +| main.go:92:1:96:1 | Normal Exit | main.go:92:1:96:1 | Exit | +| main.go:92:1:96:1 | function declaration | main.go:92:1:96:1 | After function declaration | +| main.go:92:36:96:1 | block statement | main.go:92:36:96:1 | result-zero-init:0 block statement | | main.go:92:36:96:1 | result-init:0 block statement | main.go:92:36:96:1 | result-zero-init:1 block statement | -| main.go:92:36:96:1 | result-init:1 block statement | main.go:93:2:93:2 | skip | +| main.go:92:36:96:1 | result-init:1 block statement | main.go:93:2:93:8 | ... := ... | | main.go:92:36:96:1 | result-read:0 block statement | main.go:92:36:96:1 | result-read:1 block statement | -| main.go:92:36:96:1 | result-read:1 block statement | main.go:92:1:96:1 | exit | +| main.go:92:36:96:1 | result-read:1 block statement | main.go:92:1:96:1 | Normal Exit | | main.go:92:36:96:1 | result-zero-init:0 block statement | main.go:92:36:96:1 | result-init:0 block statement | | main.go:92:36:96:1 | result-zero-init:1 block statement | main.go:92:36:96:1 | result-init:1 block statement | -| main.go:93:2:93:2 | skip | main.go:93:7:93:8 | 23 | -| main.go:93:2:93:8 | assign:0 ... := ... | main.go:94:2:94:2 | skip | -| main.go:93:7:93:8 | 23 | main.go:93:2:93:8 | assign:0 ... := ... | -| main.go:94:2:94:2 | skip | main.go:94:5:94:5 | skip | +| main.go:93:2:93:8 | ... := ... | main.go:93:7:93:8 | Before 23 | +| main.go:93:2:93:8 | After ... := ... | main.go:94:2:94:15 | ... = ... | +| main.go:93:2:93:8 | assign:0 ... := ... | main.go:93:2:93:8 | After ... := ... | +| main.go:93:7:93:8 | 23 | main.go:93:7:93:8 | After 23 | +| main.go:93:7:93:8 | After 23 | main.go:93:2:93:8 | assign:0 ... := ... | +| main.go:93:7:93:8 | Before 23 | main.go:93:7:93:8 | 23 | +| main.go:94:2:94:15 | ... = ... | main.go:94:9:94:12 | Before ...+... | +| main.go:94:2:94:15 | After ... = ... | main.go:95:2:95:7 | Before return statement | | main.go:94:2:94:15 | assign:0 ... = ... | main.go:94:2:94:15 | assign:1 ... = ... | -| main.go:94:2:94:15 | assign:1 ... = ... | main.go:95:2:95:7 | return statement | -| main.go:94:5:94:5 | skip | main.go:94:9:94:9 | x | -| main.go:94:9:94:9 | x | main.go:94:11:94:12 | 19 | -| main.go:94:9:94:12 | ...+... | main.go:94:15:94:15 | x | -| main.go:94:11:94:12 | 19 | main.go:94:9:94:12 | ...+... | -| main.go:94:15:94:15 | x | main.go:94:2:94:15 | assign:0 ... = ... | +| main.go:94:2:94:15 | assign:1 ... = ... | main.go:94:2:94:15 | After ... = ... | +| main.go:94:9:94:9 | After x | main.go:94:11:94:12 | Before 19 | +| main.go:94:9:94:9 | Before x | main.go:94:9:94:9 | x | +| main.go:94:9:94:9 | x | main.go:94:9:94:9 | After x | +| main.go:94:9:94:12 | ...+... | main.go:94:9:94:12 | After ...+... | +| main.go:94:9:94:12 | After ...+... | main.go:94:15:94:15 | Before x | +| main.go:94:9:94:12 | Before ...+... | main.go:94:9:94:9 | Before x | +| main.go:94:11:94:12 | 19 | main.go:94:11:94:12 | After 19 | +| main.go:94:11:94:12 | After 19 | main.go:94:9:94:12 | ...+... | +| main.go:94:11:94:12 | Before 19 | main.go:94:11:94:12 | 19 | +| main.go:94:15:94:15 | After x | main.go:94:2:94:15 | assign:0 ... = ... | +| main.go:94:15:94:15 | Before x | main.go:94:15:94:15 | x | +| main.go:94:15:94:15 | x | main.go:94:15:94:15 | After x | +| main.go:95:2:95:7 | Before return statement | main.go:95:2:95:7 | return statement | | main.go:95:2:95:7 | return statement | main.go:92:36:96:1 | result-read:0 block statement | -| main.go:98:1:106:1 | entry | main.go:98:25:98:25 | x | -| main.go:98:1:106:1 | function declaration | main.go:0:0:0:0 | exit | -| main.go:98:6:98:23 | skip | main.go:98:1:106:1 | function declaration | -| main.go:98:25:98:25 | x | main.go:98:25:98:25 | x | -| main.go:98:25:98:25 | x | main.go:99:2:99:2 | skip | -| main.go:99:2:99:2 | skip | main.go:99:5:99:5 | skip | +| main.go:98:1:106:1 | After function declaration | main.go:0:0:0:0 | After main.go | +| main.go:98:1:106:1 | Before function declaration | main.go:98:1:106:1 | function declaration | +| main.go:98:1:106:1 | Entry | main.go:98:25:98:25 | x | +| main.go:98:1:106:1 | Exceptional Exit | main.go:98:1:106:1 | Exit | +| main.go:98:1:106:1 | Normal Exit | main.go:98:1:106:1 | Exit | +| main.go:98:1:106:1 | function declaration | main.go:98:1:106:1 | After function declaration | +| main.go:98:25:98:25 | x | main.go:98:43:106:1 | block statement | +| main.go:98:43:106:1 | block statement | main.go:99:2:99:13 | ... := ... | +| main.go:99:2:99:13 | ... := ... | main.go:99:10:99:10 | Before x | +| main.go:99:2:99:13 | After ... := ... | main.go:100:2:104:2 | if statement | | main.go:99:2:99:13 | assign:0 ... := ... | main.go:99:2:99:13 | assign:1 ... := ... | -| main.go:99:2:99:13 | assign:1 ... := ... | main.go:100:5:100:8 | cond | -| main.go:99:5:99:5 | skip | main.go:99:10:99:10 | x | -| main.go:99:10:99:10 | x | main.go:99:13:99:13 | 0 | -| main.go:99:13:99:13 | 0 | main.go:99:2:99:13 | assign:0 ... := ... | -| main.go:100:5:100:8 | cond | main.go:100:5:100:10 | call to cond | -| main.go:100:5:100:10 | call to cond | main.go:98:1:106:1 | exit | -| main.go:100:5:100:10 | call to cond | main.go:100:5:100:10 | call to cond is false | -| main.go:100:5:100:10 | call to cond | main.go:100:5:100:10 | call to cond is true | -| main.go:100:5:100:10 | call to cond is false | main.go:103:3:103:3 | skip | -| main.go:100:5:100:10 | call to cond is true | main.go:101:3:101:3 | skip | -| main.go:101:3:101:3 | skip | main.go:101:6:101:6 | skip | -| main.go:101:3:101:13 | assign:0 ... = ... | main.go:105:9:105:9 | a | -| main.go:101:6:101:6 | skip | main.go:101:10:101:10 | b | -| main.go:101:10:101:10 | b | main.go:101:13:101:13 | a | -| main.go:101:13:101:13 | a | main.go:101:3:101:13 | assign:0 ... = ... | -| main.go:103:3:103:3 | skip | main.go:103:6:103:6 | skip | -| main.go:103:3:103:13 | assign:1 ... = ... | main.go:105:9:105:9 | a | -| main.go:103:6:103:6 | skip | main.go:103:10:103:10 | b | -| main.go:103:10:103:10 | b | main.go:103:13:103:13 | a | -| main.go:103:13:103:13 | a | main.go:103:3:103:13 | assign:1 ... = ... | -| main.go:105:2:105:12 | return statement | main.go:98:1:106:1 | exit | -| main.go:105:9:105:9 | a | main.go:105:12:105:12 | b | -| main.go:105:12:105:12 | b | main.go:105:2:105:12 | return statement | -| noretfunctions.go:0:0:0:0 | entry | noretfunctions.go:3:1:6:1 | skip | -| noretfunctions.go:3:1:6:1 | skip | noretfunctions.go:8:6:8:12 | skip | -| noretfunctions.go:8:1:10:1 | entry | noretfunctions.go:9:2:9:8 | selection of Exit | -| noretfunctions.go:8:1:10:1 | function declaration | noretfunctions.go:12:6:12:11 | skip | -| noretfunctions.go:8:6:8:12 | skip | noretfunctions.go:8:1:10:1 | function declaration | -| noretfunctions.go:9:2:9:8 | selection of Exit | noretfunctions.go:9:10:9:10 | 1 | -| noretfunctions.go:9:2:9:11 | call to Exit | noretfunctions.go:8:1:10:1 | exit | -| noretfunctions.go:9:10:9:10 | 1 | noretfunctions.go:9:2:9:11 | call to Exit | -| noretfunctions.go:12:1:16:1 | entry | noretfunctions.go:12:13:12:13 | x | -| noretfunctions.go:12:1:16:1 | function declaration | noretfunctions.go:18:6:18:12 | skip | -| noretfunctions.go:12:6:12:11 | skip | noretfunctions.go:12:1:16:1 | function declaration | -| noretfunctions.go:12:13:12:13 | x | noretfunctions.go:12:13:12:13 | x | -| noretfunctions.go:12:13:12:13 | x | noretfunctions.go:13:5:13:5 | x | -| noretfunctions.go:13:5:13:5 | x | noretfunctions.go:13:10:13:10 | 0 | -| noretfunctions.go:13:5:13:10 | ...!=... | noretfunctions.go:13:5:13:10 | ...!=... is false | -| noretfunctions.go:13:5:13:10 | ...!=... | noretfunctions.go:13:5:13:10 | ...!=... is true | -| noretfunctions.go:13:5:13:10 | ...!=... is false | noretfunctions.go:12:1:16:1 | exit | -| noretfunctions.go:13:5:13:10 | ...!=... is true | noretfunctions.go:14:3:14:9 | selection of Exit | -| noretfunctions.go:13:10:13:10 | 0 | noretfunctions.go:13:5:13:10 | ...!=... | -| noretfunctions.go:14:3:14:9 | selection of Exit | noretfunctions.go:14:11:14:11 | x | -| noretfunctions.go:14:3:14:12 | call to Exit | noretfunctions.go:12:1:16:1 | exit | -| noretfunctions.go:14:11:14:11 | x | noretfunctions.go:14:3:14:12 | call to Exit | -| noretfunctions.go:18:1:18:17 | entry | noretfunctions.go:18:16:18:17 | skip | -| noretfunctions.go:18:1:18:17 | function declaration | noretfunctions.go:20:6:20:22 | skip | -| noretfunctions.go:18:6:18:12 | skip | noretfunctions.go:18:1:18:17 | function declaration | -| noretfunctions.go:18:16:18:17 | skip | noretfunctions.go:18:1:18:17 | exit | -| noretfunctions.go:20:1:22:1 | entry | noretfunctions.go:21:2:21:10 | selection of Fatal | -| noretfunctions.go:20:1:22:1 | function declaration | noretfunctions.go:24:6:24:23 | skip | -| noretfunctions.go:20:6:20:22 | skip | noretfunctions.go:20:1:22:1 | function declaration | -| noretfunctions.go:21:2:21:10 | selection of Fatal | noretfunctions.go:21:12:21:18 | "Oh no" | -| noretfunctions.go:21:2:21:19 | call to Fatal | noretfunctions.go:20:1:22:1 | exit | -| noretfunctions.go:21:12:21:18 | "Oh no" | noretfunctions.go:21:2:21:19 | call to Fatal | -| noretfunctions.go:24:1:26:1 | entry | noretfunctions.go:25:2:25:11 | selection of Fatalf | -| noretfunctions.go:24:1:26:1 | function declaration | noretfunctions.go:0:0:0:0 | exit | -| noretfunctions.go:24:6:24:23 | skip | noretfunctions.go:24:1:26:1 | function declaration | -| noretfunctions.go:25:2:25:11 | selection of Fatalf | noretfunctions.go:25:13:25:30 | "It's as I feared" | -| noretfunctions.go:25:2:25:31 | call to Fatalf | noretfunctions.go:24:1:26:1 | exit | -| noretfunctions.go:25:13:25:30 | "It's as I feared" | noretfunctions.go:25:2:25:31 | call to Fatalf | -| stmts2.go:0:0:0:0 | entry | stmts2.go:3:6:3:11 | skip | -| stmts2.go:3:1:7:1 | entry | stmts2.go:4:2:4:2 | skip | -| stmts2.go:3:1:7:1 | function declaration | stmts2.go:9:6:9:11 | skip | -| stmts2.go:3:6:3:11 | skip | stmts2.go:3:1:7:1 | function declaration | -| stmts2.go:4:2:4:2 | skip | stmts2.go:4:6:4:10 | test7 | -| stmts2.go:4:6:4:10 | test7 | stmts2.go:4:12:4:12 | 0 | -| stmts2.go:4:6:4:13 | call to test7 | stmts2.go:3:1:7:1 | exit | -| stmts2.go:4:6:4:13 | call to test7 | stmts2.go:5:6:5:6 | skip | -| stmts2.go:4:12:4:12 | 0 | stmts2.go:4:6:4:13 | call to test7 | -| stmts2.go:5:6:5:6 | skip | stmts2.go:5:10:5:14 | test7 | -| stmts2.go:5:10:5:14 | test7 | stmts2.go:5:16:5:16 | 1 | -| stmts2.go:5:10:5:17 | call to test7 | stmts2.go:3:1:7:1 | exit | -| stmts2.go:5:10:5:17 | call to test7 | stmts2.go:6:9:6:9 | 2 | -| stmts2.go:5:16:5:16 | 1 | stmts2.go:5:10:5:17 | call to test7 | -| stmts2.go:6:2:6:9 | return statement | stmts2.go:3:1:7:1 | exit | -| stmts2.go:6:9:6:9 | 2 | stmts2.go:6:2:6:9 | return statement | -| stmts2.go:9:1:13:1 | entry | stmts2.go:10:2:10:2 | skip | -| stmts2.go:9:1:13:1 | function declaration | stmts2.go:15:6:15:11 | skip | -| stmts2.go:9:6:9:11 | skip | stmts2.go:9:1:13:1 | function declaration | -| stmts2.go:10:2:10:2 | skip | stmts2.go:10:5:10:5 | skip | -| stmts2.go:10:2:10:14 | assign:1 ... := ... | stmts2.go:11:6:11:6 | skip | +| main.go:99:2:99:13 | assign:1 ... := ... | main.go:99:2:99:13 | After ... := ... | +| main.go:99:10:99:10 | After x | main.go:99:13:99:13 | Before 0 | +| main.go:99:10:99:10 | Before x | main.go:99:10:99:10 | x | +| main.go:99:10:99:10 | x | main.go:99:10:99:10 | After x | +| main.go:99:13:99:13 | 0 | main.go:99:13:99:13 | After 0 | +| main.go:99:13:99:13 | After 0 | main.go:99:2:99:13 | assign:0 ... := ... | +| main.go:99:13:99:13 | Before 0 | main.go:99:13:99:13 | 0 | +| main.go:100:2:104:2 | After if statement | main.go:105:2:105:12 | Before return statement | +| main.go:100:2:104:2 | if statement | main.go:100:5:100:10 | Before call to cond | +| main.go:100:5:100:8 | After cond | main.go:100:5:100:10 | call to cond | +| main.go:100:5:100:8 | Before cond | main.go:100:5:100:8 | cond | +| main.go:100:5:100:8 | cond | main.go:100:5:100:8 | After cond | +| main.go:100:5:100:10 | After call to cond [false] | main.go:102:9:104:2 | block statement | +| main.go:100:5:100:10 | After call to cond [true] | main.go:100:12:102:2 | block statement | +| main.go:100:5:100:10 | Before call to cond | main.go:100:5:100:8 | Before cond | +| main.go:100:5:100:10 | call to cond | main.go:98:1:106:1 | Exceptional Exit | +| main.go:100:5:100:10 | call to cond | main.go:100:5:100:10 | After call to cond [false] | +| main.go:100:5:100:10 | call to cond | main.go:100:5:100:10 | After call to cond [true] | +| main.go:100:12:102:2 | After block statement | main.go:100:2:104:2 | After if statement | +| main.go:100:12:102:2 | block statement | main.go:101:3:101:13 | ... = ... | +| main.go:101:3:101:13 | ... = ... | main.go:101:10:101:10 | Before b | +| main.go:101:3:101:13 | After ... = ... | main.go:100:12:102:2 | After block statement | +| main.go:101:3:101:13 | assign:0 ... = ... | main.go:101:3:101:13 | After ... = ... | +| main.go:101:10:101:10 | After b | main.go:101:13:101:13 | Before a | +| main.go:101:10:101:10 | Before b | main.go:101:10:101:10 | b | +| main.go:101:10:101:10 | b | main.go:101:10:101:10 | After b | +| main.go:101:13:101:13 | After a | main.go:101:3:101:13 | assign:0 ... = ... | +| main.go:101:13:101:13 | Before a | main.go:101:13:101:13 | a | +| main.go:101:13:101:13 | a | main.go:101:13:101:13 | After a | +| main.go:102:9:104:2 | After block statement | main.go:100:2:104:2 | After if statement | +| main.go:102:9:104:2 | block statement | main.go:103:3:103:13 | ... = ... | +| main.go:103:3:103:13 | ... = ... | main.go:103:10:103:10 | Before b | +| main.go:103:3:103:13 | After ... = ... | main.go:102:9:104:2 | After block statement | +| main.go:103:3:103:13 | assign:1 ... = ... | main.go:103:3:103:13 | After ... = ... | +| main.go:103:10:103:10 | After b | main.go:103:13:103:13 | Before a | +| main.go:103:10:103:10 | Before b | main.go:103:10:103:10 | b | +| main.go:103:10:103:10 | b | main.go:103:10:103:10 | After b | +| main.go:103:13:103:13 | After a | main.go:103:3:103:13 | assign:1 ... = ... | +| main.go:103:13:103:13 | Before a | main.go:103:13:103:13 | a | +| main.go:103:13:103:13 | a | main.go:103:13:103:13 | After a | +| main.go:105:2:105:12 | Before return statement | main.go:105:9:105:9 | Before a | +| main.go:105:2:105:12 | return statement | main.go:98:1:106:1 | Normal Exit | +| main.go:105:9:105:9 | After a | main.go:105:12:105:12 | Before b | +| main.go:105:9:105:9 | Before a | main.go:105:9:105:9 | a | +| main.go:105:9:105:9 | a | main.go:105:9:105:9 | After a | +| main.go:105:12:105:12 | After b | main.go:105:2:105:12 | return statement | +| main.go:105:12:105:12 | Before b | main.go:105:12:105:12 | b | +| main.go:105:12:105:12 | b | main.go:105:12:105:12 | After b | +| noretfunctions.go:0:0:0:0 | After noretfunctions.go | noretfunctions.go:0:0:0:0 | Normal Exit | +| noretfunctions.go:0:0:0:0 | Entry | noretfunctions.go:0:0:0:0 | noretfunctions.go | +| noretfunctions.go:0:0:0:0 | Normal Exit | noretfunctions.go:0:0:0:0 | Exit | +| noretfunctions.go:0:0:0:0 | noretfunctions.go | noretfunctions.go:3:1:6:1 | import declaration | +| noretfunctions.go:3:1:6:1 | After import declaration | noretfunctions.go:8:1:10:1 | Before function declaration | +| noretfunctions.go:3:1:6:1 | import declaration | noretfunctions.go:4:2:4:6 | import specifier | +| noretfunctions.go:4:2:4:6 | import specifier | noretfunctions.go:5:2:5:5 | import specifier | +| noretfunctions.go:5:2:5:5 | import specifier | noretfunctions.go:3:1:6:1 | After import declaration | +| noretfunctions.go:8:1:10:1 | After function declaration | noretfunctions.go:12:1:16:1 | Before function declaration | +| noretfunctions.go:8:1:10:1 | Before function declaration | noretfunctions.go:8:1:10:1 | function declaration | +| noretfunctions.go:8:1:10:1 | Entry | noretfunctions.go:8:16:10:1 | block statement | +| noretfunctions.go:8:1:10:1 | Exceptional Exit | noretfunctions.go:8:1:10:1 | Exit | +| noretfunctions.go:8:1:10:1 | function declaration | noretfunctions.go:8:1:10:1 | After function declaration | +| noretfunctions.go:8:16:10:1 | block statement | noretfunctions.go:9:2:9:11 | expression statement | +| noretfunctions.go:9:2:9:8 | After selection of Exit | noretfunctions.go:9:10:9:10 | Before 1 | +| noretfunctions.go:9:2:9:8 | Before selection of Exit | noretfunctions.go:9:2:9:8 | selection of Exit | +| noretfunctions.go:9:2:9:8 | selection of Exit | noretfunctions.go:9:2:9:8 | After selection of Exit | +| noretfunctions.go:9:2:9:11 | Before call to Exit | noretfunctions.go:9:2:9:8 | Before selection of Exit | +| noretfunctions.go:9:2:9:11 | call to Exit | noretfunctions.go:8:1:10:1 | Exceptional Exit | +| noretfunctions.go:9:2:9:11 | expression statement | noretfunctions.go:9:2:9:11 | Before call to Exit | +| noretfunctions.go:9:10:9:10 | 1 | noretfunctions.go:9:10:9:10 | After 1 | +| noretfunctions.go:9:10:9:10 | After 1 | noretfunctions.go:9:2:9:11 | call to Exit | +| noretfunctions.go:9:10:9:10 | Before 1 | noretfunctions.go:9:10:9:10 | 1 | +| noretfunctions.go:12:1:16:1 | After function declaration | noretfunctions.go:18:1:18:17 | Before function declaration | +| noretfunctions.go:12:1:16:1 | Before function declaration | noretfunctions.go:12:1:16:1 | function declaration | +| noretfunctions.go:12:1:16:1 | Entry | noretfunctions.go:12:13:12:13 | x | +| noretfunctions.go:12:1:16:1 | Exceptional Exit | noretfunctions.go:12:1:16:1 | Exit | +| noretfunctions.go:12:1:16:1 | Normal Exit | noretfunctions.go:12:1:16:1 | Exit | +| noretfunctions.go:12:1:16:1 | function declaration | noretfunctions.go:12:1:16:1 | After function declaration | +| noretfunctions.go:12:13:12:13 | x | noretfunctions.go:12:20:16:1 | block statement | +| noretfunctions.go:12:20:16:1 | After block statement | noretfunctions.go:12:1:16:1 | Normal Exit | +| noretfunctions.go:12:20:16:1 | block statement | noretfunctions.go:13:2:15:2 | if statement | +| noretfunctions.go:13:2:15:2 | After if statement | noretfunctions.go:12:20:16:1 | After block statement | +| noretfunctions.go:13:2:15:2 | if statement | noretfunctions.go:13:5:13:10 | Before ...!=... | +| noretfunctions.go:13:5:13:5 | After x | noretfunctions.go:13:10:13:10 | Before 0 | +| noretfunctions.go:13:5:13:5 | Before x | noretfunctions.go:13:5:13:5 | x | +| noretfunctions.go:13:5:13:5 | x | noretfunctions.go:13:5:13:5 | After x | +| noretfunctions.go:13:5:13:10 | ...!=... | noretfunctions.go:13:5:13:10 | After ...!=... [false] | +| noretfunctions.go:13:5:13:10 | ...!=... | noretfunctions.go:13:5:13:10 | After ...!=... [true] | +| noretfunctions.go:13:5:13:10 | After ...!=... [false] | noretfunctions.go:13:2:15:2 | After if statement | +| noretfunctions.go:13:5:13:10 | After ...!=... [true] | noretfunctions.go:13:12:15:2 | block statement | +| noretfunctions.go:13:5:13:10 | Before ...!=... | noretfunctions.go:13:5:13:5 | Before x | +| noretfunctions.go:13:10:13:10 | 0 | noretfunctions.go:13:10:13:10 | After 0 | +| noretfunctions.go:13:10:13:10 | After 0 | noretfunctions.go:13:5:13:10 | ...!=... | +| noretfunctions.go:13:10:13:10 | Before 0 | noretfunctions.go:13:10:13:10 | 0 | +| noretfunctions.go:13:12:15:2 | block statement | noretfunctions.go:14:3:14:12 | expression statement | +| noretfunctions.go:14:3:14:9 | After selection of Exit | noretfunctions.go:14:11:14:11 | Before x | +| noretfunctions.go:14:3:14:9 | Before selection of Exit | noretfunctions.go:14:3:14:9 | selection of Exit | +| noretfunctions.go:14:3:14:9 | selection of Exit | noretfunctions.go:14:3:14:9 | After selection of Exit | +| noretfunctions.go:14:3:14:12 | Before call to Exit | noretfunctions.go:14:3:14:9 | Before selection of Exit | +| noretfunctions.go:14:3:14:12 | call to Exit | noretfunctions.go:12:1:16:1 | Exceptional Exit | +| noretfunctions.go:14:3:14:12 | expression statement | noretfunctions.go:14:3:14:12 | Before call to Exit | +| noretfunctions.go:14:11:14:11 | After x | noretfunctions.go:14:3:14:12 | call to Exit | +| noretfunctions.go:14:11:14:11 | Before x | noretfunctions.go:14:11:14:11 | x | +| noretfunctions.go:14:11:14:11 | x | noretfunctions.go:14:11:14:11 | After x | +| noretfunctions.go:18:1:18:17 | After function declaration | noretfunctions.go:20:1:22:1 | Before function declaration | +| noretfunctions.go:18:1:18:17 | Before function declaration | noretfunctions.go:18:1:18:17 | function declaration | +| noretfunctions.go:18:1:18:17 | Entry | noretfunctions.go:18:16:18:17 | block statement | +| noretfunctions.go:18:1:18:17 | Normal Exit | noretfunctions.go:18:1:18:17 | Exit | +| noretfunctions.go:18:1:18:17 | function declaration | noretfunctions.go:18:1:18:17 | After function declaration | +| noretfunctions.go:18:16:18:17 | block statement | noretfunctions.go:18:1:18:17 | Normal Exit | +| noretfunctions.go:20:1:22:1 | After function declaration | noretfunctions.go:24:1:26:1 | Before function declaration | +| noretfunctions.go:20:1:22:1 | Before function declaration | noretfunctions.go:20:1:22:1 | function declaration | +| noretfunctions.go:20:1:22:1 | Entry | noretfunctions.go:20:26:22:1 | block statement | +| noretfunctions.go:20:1:22:1 | Exceptional Exit | noretfunctions.go:20:1:22:1 | Exit | +| noretfunctions.go:20:1:22:1 | function declaration | noretfunctions.go:20:1:22:1 | After function declaration | +| noretfunctions.go:20:26:22:1 | block statement | noretfunctions.go:21:2:21:19 | expression statement | +| noretfunctions.go:21:2:21:10 | After selection of Fatal | noretfunctions.go:21:12:21:18 | Before "Oh no" | +| noretfunctions.go:21:2:21:10 | Before selection of Fatal | noretfunctions.go:21:2:21:10 | selection of Fatal | +| noretfunctions.go:21:2:21:10 | selection of Fatal | noretfunctions.go:21:2:21:10 | After selection of Fatal | +| noretfunctions.go:21:2:21:19 | Before call to Fatal | noretfunctions.go:21:2:21:10 | Before selection of Fatal | +| noretfunctions.go:21:2:21:19 | call to Fatal | noretfunctions.go:20:1:22:1 | Exceptional Exit | +| noretfunctions.go:21:2:21:19 | expression statement | noretfunctions.go:21:2:21:19 | Before call to Fatal | +| noretfunctions.go:21:12:21:18 | "Oh no" | noretfunctions.go:21:12:21:18 | After "Oh no" | +| noretfunctions.go:21:12:21:18 | After "Oh no" | noretfunctions.go:21:2:21:19 | call to Fatal | +| noretfunctions.go:21:12:21:18 | Before "Oh no" | noretfunctions.go:21:12:21:18 | "Oh no" | +| noretfunctions.go:24:1:26:1 | After function declaration | noretfunctions.go:0:0:0:0 | After noretfunctions.go | +| noretfunctions.go:24:1:26:1 | Before function declaration | noretfunctions.go:24:1:26:1 | function declaration | +| noretfunctions.go:24:1:26:1 | Entry | noretfunctions.go:24:27:26:1 | block statement | +| noretfunctions.go:24:1:26:1 | Exceptional Exit | noretfunctions.go:24:1:26:1 | Exit | +| noretfunctions.go:24:1:26:1 | function declaration | noretfunctions.go:24:1:26:1 | After function declaration | +| noretfunctions.go:24:27:26:1 | block statement | noretfunctions.go:25:2:25:31 | expression statement | +| noretfunctions.go:25:2:25:11 | After selection of Fatalf | noretfunctions.go:25:13:25:30 | Before "It's as I feared" | +| noretfunctions.go:25:2:25:11 | Before selection of Fatalf | noretfunctions.go:25:2:25:11 | selection of Fatalf | +| noretfunctions.go:25:2:25:11 | selection of Fatalf | noretfunctions.go:25:2:25:11 | After selection of Fatalf | +| noretfunctions.go:25:2:25:31 | Before call to Fatalf | noretfunctions.go:25:2:25:11 | Before selection of Fatalf | +| noretfunctions.go:25:2:25:31 | call to Fatalf | noretfunctions.go:24:1:26:1 | Exceptional Exit | +| noretfunctions.go:25:2:25:31 | expression statement | noretfunctions.go:25:2:25:31 | Before call to Fatalf | +| noretfunctions.go:25:13:25:30 | "It's as I feared" | noretfunctions.go:25:13:25:30 | After "It's as I feared" | +| noretfunctions.go:25:13:25:30 | After "It's as I feared" | noretfunctions.go:25:2:25:31 | call to Fatalf | +| noretfunctions.go:25:13:25:30 | Before "It's as I feared" | noretfunctions.go:25:13:25:30 | "It's as I feared" | +| stmts2.go:0:0:0:0 | After stmts2.go | stmts2.go:0:0:0:0 | Normal Exit | +| stmts2.go:0:0:0:0 | Entry | stmts2.go:0:0:0:0 | stmts2.go | +| stmts2.go:0:0:0:0 | Normal Exit | stmts2.go:0:0:0:0 | Exit | +| stmts2.go:0:0:0:0 | stmts2.go | stmts2.go:3:1:7:1 | Before function declaration | +| stmts2.go:3:1:7:1 | After function declaration | stmts2.go:9:1:13:1 | Before function declaration | +| stmts2.go:3:1:7:1 | Before function declaration | stmts2.go:3:1:7:1 | function declaration | +| stmts2.go:3:1:7:1 | Entry | stmts2.go:3:19:7:1 | block statement | +| stmts2.go:3:1:7:1 | Exceptional Exit | stmts2.go:3:1:7:1 | Exit | +| stmts2.go:3:1:7:1 | Normal Exit | stmts2.go:3:1:7:1 | Exit | +| stmts2.go:3:1:7:1 | function declaration | stmts2.go:3:1:7:1 | After function declaration | +| stmts2.go:3:19:7:1 | block statement | stmts2.go:4:2:4:13 | ... = ... | +| stmts2.go:4:2:4:13 | ... = ... | stmts2.go:4:6:4:13 | Before call to test7 | +| stmts2.go:4:2:4:13 | After ... = ... | stmts2.go:5:2:5:17 | declaration statement | +| stmts2.go:4:6:4:10 | After test7 | stmts2.go:4:12:4:12 | Before 0 | +| stmts2.go:4:6:4:10 | Before test7 | stmts2.go:4:6:4:10 | test7 | +| stmts2.go:4:6:4:10 | test7 | stmts2.go:4:6:4:10 | After test7 | +| stmts2.go:4:6:4:13 | After call to test7 | stmts2.go:4:2:4:13 | After ... = ... | +| stmts2.go:4:6:4:13 | Before call to test7 | stmts2.go:4:6:4:10 | Before test7 | +| stmts2.go:4:6:4:13 | call to test7 | stmts2.go:3:1:7:1 | Exceptional Exit | +| stmts2.go:4:6:4:13 | call to test7 | stmts2.go:4:6:4:13 | After call to test7 | +| stmts2.go:4:12:4:12 | 0 | stmts2.go:4:12:4:12 | After 0 | +| stmts2.go:4:12:4:12 | After 0 | stmts2.go:4:6:4:13 | call to test7 | +| stmts2.go:4:12:4:12 | Before 0 | stmts2.go:4:12:4:12 | 0 | +| stmts2.go:5:2:5:17 | After declaration statement | stmts2.go:6:2:6:9 | Before return statement | +| stmts2.go:5:2:5:17 | After variable declaration | stmts2.go:5:2:5:17 | After declaration statement | +| stmts2.go:5:2:5:17 | declaration statement | stmts2.go:5:2:5:17 | variable declaration | +| stmts2.go:5:2:5:17 | variable declaration | stmts2.go:5:6:5:17 | value declaration specifier | +| stmts2.go:5:6:5:17 | After value declaration specifier | stmts2.go:5:2:5:17 | After variable declaration | +| stmts2.go:5:6:5:17 | value declaration specifier | stmts2.go:5:10:5:17 | Before call to test7 | +| stmts2.go:5:10:5:14 | After test7 | stmts2.go:5:16:5:16 | Before 1 | +| stmts2.go:5:10:5:14 | Before test7 | stmts2.go:5:10:5:14 | test7 | +| stmts2.go:5:10:5:14 | test7 | stmts2.go:5:10:5:14 | After test7 | +| stmts2.go:5:10:5:17 | After call to test7 | stmts2.go:5:6:5:17 | After value declaration specifier | +| stmts2.go:5:10:5:17 | Before call to test7 | stmts2.go:5:10:5:14 | Before test7 | +| stmts2.go:5:10:5:17 | call to test7 | stmts2.go:3:1:7:1 | Exceptional Exit | +| stmts2.go:5:10:5:17 | call to test7 | stmts2.go:5:10:5:17 | After call to test7 | +| stmts2.go:5:16:5:16 | 1 | stmts2.go:5:16:5:16 | After 1 | +| stmts2.go:5:16:5:16 | After 1 | stmts2.go:5:10:5:17 | call to test7 | +| stmts2.go:5:16:5:16 | Before 1 | stmts2.go:5:16:5:16 | 1 | +| stmts2.go:6:2:6:9 | Before return statement | stmts2.go:6:9:6:9 | Before 2 | +| stmts2.go:6:2:6:9 | return statement | stmts2.go:3:1:7:1 | Normal Exit | +| stmts2.go:6:9:6:9 | 2 | stmts2.go:6:9:6:9 | After 2 | +| stmts2.go:6:9:6:9 | After 2 | stmts2.go:6:2:6:9 | return statement | +| stmts2.go:6:9:6:9 | Before 2 | stmts2.go:6:9:6:9 | 2 | +| stmts2.go:9:1:13:1 | After function declaration | stmts2.go:15:1:28:1 | Before function declaration | +| stmts2.go:9:1:13:1 | Before function declaration | stmts2.go:9:1:13:1 | function declaration | +| stmts2.go:9:1:13:1 | Entry | stmts2.go:9:19:13:1 | block statement | +| stmts2.go:9:1:13:1 | Exceptional Exit | stmts2.go:9:1:13:1 | Exit | +| stmts2.go:9:1:13:1 | Normal Exit | stmts2.go:9:1:13:1 | Exit | +| stmts2.go:9:1:13:1 | function declaration | stmts2.go:9:1:13:1 | After function declaration | +| stmts2.go:9:19:13:1 | block statement | stmts2.go:10:2:10:14 | ... := ... | +| stmts2.go:10:2:10:14 | ... := ... | stmts2.go:10:10:10:14 | Before call to gen | +| stmts2.go:10:2:10:14 | After ... := ... | stmts2.go:11:2:11:17 | declaration statement | +| stmts2.go:10:2:10:14 | assign:1 ... := ... | stmts2.go:10:2:10:14 | After ... := ... | | stmts2.go:10:2:10:14 | extract:0 ... := ... | stmts2.go:10:2:10:14 | extract:1 ... := ... | | stmts2.go:10:2:10:14 | extract:1 ... := ... | stmts2.go:10:2:10:14 | assign:1 ... := ... | -| stmts2.go:10:5:10:5 | skip | stmts2.go:10:10:10:12 | gen | -| stmts2.go:10:10:10:12 | gen | stmts2.go:10:10:10:14 | call to gen | -| stmts2.go:10:10:10:14 | call to gen | stmts2.go:9:1:13:1 | exit | -| stmts2.go:10:10:10:14 | call to gen | stmts2.go:10:2:10:14 | extract:0 ... := ... | -| stmts2.go:11:6:11:6 | skip | stmts2.go:11:9:11:9 | skip | -| stmts2.go:11:6:11:17 | assign:1 value declaration specifier | stmts2.go:12:9:12:9 | x | +| stmts2.go:10:10:10:12 | After gen | stmts2.go:10:10:10:14 | call to gen | +| stmts2.go:10:10:10:12 | Before gen | stmts2.go:10:10:10:12 | gen | +| stmts2.go:10:10:10:12 | gen | stmts2.go:10:10:10:12 | After gen | +| stmts2.go:10:10:10:14 | After call to gen | stmts2.go:10:2:10:14 | extract:0 ... := ... | +| stmts2.go:10:10:10:14 | Before call to gen | stmts2.go:10:10:10:12 | Before gen | +| stmts2.go:10:10:10:14 | call to gen | stmts2.go:9:1:13:1 | Exceptional Exit | +| stmts2.go:10:10:10:14 | call to gen | stmts2.go:10:10:10:14 | After call to gen | +| stmts2.go:11:2:11:17 | After declaration statement | stmts2.go:12:2:12:13 | Before return statement | +| stmts2.go:11:2:11:17 | After variable declaration | stmts2.go:11:2:11:17 | After declaration statement | +| stmts2.go:11:2:11:17 | declaration statement | stmts2.go:11:2:11:17 | variable declaration | +| stmts2.go:11:2:11:17 | variable declaration | stmts2.go:11:6:11:17 | value declaration specifier | +| stmts2.go:11:6:11:17 | After value declaration specifier | stmts2.go:11:2:11:17 | After variable declaration | +| stmts2.go:11:6:11:17 | assign:1 value declaration specifier | stmts2.go:11:6:11:17 | After value declaration specifier | | stmts2.go:11:6:11:17 | extract:0 value declaration specifier | stmts2.go:11:6:11:17 | extract:1 value declaration specifier | | stmts2.go:11:6:11:17 | extract:1 value declaration specifier | stmts2.go:11:6:11:17 | assign:1 value declaration specifier | -| stmts2.go:11:9:11:9 | skip | stmts2.go:11:13:11:15 | gen | -| stmts2.go:11:13:11:15 | gen | stmts2.go:11:13:11:17 | call to gen | -| stmts2.go:11:13:11:17 | call to gen | stmts2.go:9:1:13:1 | exit | -| stmts2.go:11:13:11:17 | call to gen | stmts2.go:11:6:11:17 | extract:0 value declaration specifier | -| stmts2.go:12:2:12:13 | return statement | stmts2.go:9:1:13:1 | exit | -| stmts2.go:12:9:12:9 | x | stmts2.go:12:13:12:13 | y | -| stmts2.go:12:9:12:13 | ...+... | stmts2.go:12:2:12:13 | return statement | -| stmts2.go:12:13:12:13 | y | stmts2.go:12:9:12:13 | ...+... | -| stmts2.go:15:1:28:1 | entry | stmts2.go:15:13:15:14 | ch | -| stmts2.go:15:1:28:1 | function declaration | stmts2.go:30:6:30:12 | skip | -| stmts2.go:15:6:15:11 | skip | stmts2.go:15:1:28:1 | function declaration | -| stmts2.go:15:13:15:14 | ch | stmts2.go:15:13:15:14 | ch | -| stmts2.go:15:13:15:14 | ch | stmts2.go:17:13:17:14 | ch | -| stmts2.go:16:2:26:2 | select statement | stmts2.go:17:11:17:14 | <-... | -| stmts2.go:16:2:26:2 | select statement | stmts2.go:18:15:18:18 | <-... | -| stmts2.go:16:2:26:2 | select statement | stmts2.go:20:15:20:18 | <-... | -| stmts2.go:16:2:26:2 | select statement | stmts2.go:25:14:25:17 | <-... | -| stmts2.go:17:2:17:15 | skip | stmts2.go:27:9:27:9 | 1 | -| stmts2.go:17:7:17:7 | skip | stmts2.go:17:2:17:15 | skip | -| stmts2.go:17:11:17:14 | <-... | stmts2.go:17:7:17:7 | skip | -| stmts2.go:17:13:17:14 | ch | stmts2.go:18:17:18:18 | ch | -| stmts2.go:18:7:18:7 | skip | stmts2.go:18:10:18:10 | skip | +| stmts2.go:11:6:11:17 | value declaration specifier | stmts2.go:11:13:11:17 | Before call to gen | +| stmts2.go:11:13:11:15 | After gen | stmts2.go:11:13:11:17 | call to gen | +| stmts2.go:11:13:11:15 | Before gen | stmts2.go:11:13:11:15 | gen | +| stmts2.go:11:13:11:15 | gen | stmts2.go:11:13:11:15 | After gen | +| stmts2.go:11:13:11:17 | After call to gen | stmts2.go:11:6:11:17 | extract:0 value declaration specifier | +| stmts2.go:11:13:11:17 | Before call to gen | stmts2.go:11:13:11:15 | Before gen | +| stmts2.go:11:13:11:17 | call to gen | stmts2.go:9:1:13:1 | Exceptional Exit | +| stmts2.go:11:13:11:17 | call to gen | stmts2.go:11:13:11:17 | After call to gen | +| stmts2.go:12:2:12:13 | Before return statement | stmts2.go:12:9:12:13 | Before ...+... | +| stmts2.go:12:2:12:13 | return statement | stmts2.go:9:1:13:1 | Normal Exit | +| stmts2.go:12:9:12:9 | After x | stmts2.go:12:13:12:13 | Before y | +| stmts2.go:12:9:12:9 | Before x | stmts2.go:12:9:12:9 | x | +| stmts2.go:12:9:12:9 | x | stmts2.go:12:9:12:9 | After x | +| stmts2.go:12:9:12:13 | ...+... | stmts2.go:12:9:12:13 | After ...+... | +| stmts2.go:12:9:12:13 | After ...+... | stmts2.go:12:2:12:13 | return statement | +| stmts2.go:12:9:12:13 | Before ...+... | stmts2.go:12:9:12:9 | Before x | +| stmts2.go:12:13:12:13 | After y | stmts2.go:12:9:12:13 | ...+... | +| stmts2.go:12:13:12:13 | Before y | stmts2.go:12:13:12:13 | y | +| stmts2.go:12:13:12:13 | y | stmts2.go:12:13:12:13 | After y | +| stmts2.go:15:1:28:1 | After function declaration | stmts2.go:30:1:34:1 | Before function declaration | +| stmts2.go:15:1:28:1 | Before function declaration | stmts2.go:15:1:28:1 | function declaration | +| stmts2.go:15:1:28:1 | Entry | stmts2.go:15:13:15:14 | ch | +| stmts2.go:15:1:28:1 | Normal Exit | stmts2.go:15:1:28:1 | Exit | +| stmts2.go:15:1:28:1 | function declaration | stmts2.go:15:1:28:1 | After function declaration | +| stmts2.go:15:13:15:14 | ch | stmts2.go:15:30:28:1 | block statement | +| stmts2.go:15:30:28:1 | block statement | stmts2.go:16:2:26:2 | Before select statement | +| stmts2.go:16:2:26:2 | After select statement | stmts2.go:27:2:27:9 | Before return statement | +| stmts2.go:16:2:26:2 | Before select statement | stmts2.go:17:13:17:14 | Before ch | +| stmts2.go:16:2:26:2 | select statement | stmts2.go:17:2:17:15 | comm clause | +| stmts2.go:16:2:26:2 | select statement | stmts2.go:18:2:19:10 | comm clause | +| stmts2.go:16:2:26:2 | select statement | stmts2.go:20:2:24:10 | comm clause | +| stmts2.go:16:2:26:2 | select statement | stmts2.go:25:2:25:18 | comm clause | +| stmts2.go:17:2:17:15 | comm clause | stmts2.go:17:11:17:14 | <-... | +| stmts2.go:17:7:17:7 | After _ | stmts2.go:16:2:26:2 | After select statement | +| stmts2.go:17:7:17:7 | Before _ | stmts2.go:17:7:17:7 | _ | +| stmts2.go:17:7:17:7 | _ | stmts2.go:17:7:17:7 | After _ | +| stmts2.go:17:11:17:14 | <-... | stmts2.go:17:7:17:7 | Before _ | +| stmts2.go:17:13:17:14 | After ch | stmts2.go:18:17:18:18 | Before ch | +| stmts2.go:17:13:17:14 | Before ch | stmts2.go:17:13:17:14 | ch | +| stmts2.go:17:13:17:14 | ch | stmts2.go:17:13:17:14 | After ch | +| stmts2.go:18:2:19:10 | comm clause | stmts2.go:18:15:18:18 | <-... | +| stmts2.go:18:7:18:7 | After x | stmts2.go:18:10:18:10 | Before _ | +| stmts2.go:18:7:18:7 | Before x | stmts2.go:18:7:18:7 | x | +| stmts2.go:18:7:18:7 | x | stmts2.go:18:7:18:7 | After x | | stmts2.go:18:7:18:18 | assign:0 ... := ... | stmts2.go:18:7:18:18 | extract:1 ... := ... | | stmts2.go:18:7:18:18 | extract:0 ... := ... | stmts2.go:18:7:18:18 | assign:0 ... := ... | -| stmts2.go:18:7:18:18 | extract:1 ... := ... | stmts2.go:19:10:19:10 | x | -| stmts2.go:18:10:18:10 | skip | stmts2.go:18:7:18:18 | extract:0 ... := ... | -| stmts2.go:18:15:18:18 | <-... | stmts2.go:18:7:18:7 | skip | -| stmts2.go:18:17:18:18 | ch | stmts2.go:20:17:20:18 | ch | -| stmts2.go:19:3:19:10 | return statement | stmts2.go:15:1:28:1 | exit | -| stmts2.go:19:10:19:10 | x | stmts2.go:19:3:19:10 | return statement | -| stmts2.go:20:7:20:7 | skip | stmts2.go:20:10:20:10 | skip | -| stmts2.go:20:7:20:18 | assign:1 ... := ... | stmts2.go:21:6:21:6 | y | +| stmts2.go:18:7:18:18 | extract:1 ... := ... | stmts2.go:19:3:19:10 | Before return statement | +| stmts2.go:18:10:18:10 | After _ | stmts2.go:18:7:18:18 | extract:0 ... := ... | +| stmts2.go:18:10:18:10 | Before _ | stmts2.go:18:10:18:10 | _ | +| stmts2.go:18:10:18:10 | _ | stmts2.go:18:10:18:10 | After _ | +| stmts2.go:18:15:18:18 | <-... | stmts2.go:18:7:18:7 | Before x | +| stmts2.go:18:17:18:18 | After ch | stmts2.go:20:17:20:18 | Before ch | +| stmts2.go:18:17:18:18 | Before ch | stmts2.go:18:17:18:18 | ch | +| stmts2.go:18:17:18:18 | ch | stmts2.go:18:17:18:18 | After ch | +| stmts2.go:19:3:19:10 | Before return statement | stmts2.go:19:10:19:10 | Before x | +| stmts2.go:19:3:19:10 | return statement | stmts2.go:15:1:28:1 | Normal Exit | +| stmts2.go:19:10:19:10 | After x | stmts2.go:19:3:19:10 | return statement | +| stmts2.go:19:10:19:10 | Before x | stmts2.go:19:10:19:10 | x | +| stmts2.go:19:10:19:10 | x | stmts2.go:19:10:19:10 | After x | +| stmts2.go:20:2:24:10 | comm clause | stmts2.go:20:15:20:18 | <-... | +| stmts2.go:20:7:20:7 | After _ | stmts2.go:20:10:20:10 | Before y | +| stmts2.go:20:7:20:7 | Before _ | stmts2.go:20:7:20:7 | _ | +| stmts2.go:20:7:20:7 | _ | stmts2.go:20:7:20:7 | After _ | +| stmts2.go:20:7:20:18 | assign:1 ... := ... | stmts2.go:21:3:23:3 | if statement | | stmts2.go:20:7:20:18 | extract:0 ... := ... | stmts2.go:20:7:20:18 | extract:1 ... := ... | | stmts2.go:20:7:20:18 | extract:1 ... := ... | stmts2.go:20:7:20:18 | assign:1 ... := ... | -| stmts2.go:20:10:20:10 | skip | stmts2.go:20:7:20:18 | extract:0 ... := ... | -| stmts2.go:20:15:20:18 | <-... | stmts2.go:20:7:20:7 | skip | -| stmts2.go:20:17:20:18 | ch | stmts2.go:25:16:25:17 | ch | -| stmts2.go:21:6:21:6 | y | stmts2.go:21:6:21:6 | y is false | -| stmts2.go:21:6:21:6 | y | stmts2.go:21:6:21:6 | y is true | -| stmts2.go:21:6:21:6 | y is false | stmts2.go:24:10:24:10 | 0 | -| stmts2.go:21:6:21:6 | y is true | stmts2.go:22:4:22:8 | skip | -| stmts2.go:22:4:22:8 | skip | stmts2.go:27:9:27:9 | 1 | -| stmts2.go:24:3:24:10 | return statement | stmts2.go:15:1:28:1 | exit | -| stmts2.go:24:10:24:10 | 0 | stmts2.go:24:3:24:10 | return statement | -| stmts2.go:25:2:25:18 | skip | stmts2.go:27:9:27:9 | 1 | -| stmts2.go:25:7:25:7 | skip | stmts2.go:25:10:25:10 | skip | +| stmts2.go:20:10:20:10 | After y | stmts2.go:20:7:20:18 | extract:0 ... := ... | +| stmts2.go:20:10:20:10 | Before y | stmts2.go:20:10:20:10 | y | +| stmts2.go:20:10:20:10 | y | stmts2.go:20:10:20:10 | After y | +| stmts2.go:20:15:20:18 | <-... | stmts2.go:20:7:20:7 | Before _ | +| stmts2.go:20:17:20:18 | After ch | stmts2.go:25:16:25:17 | Before ch | +| stmts2.go:20:17:20:18 | Before ch | stmts2.go:20:17:20:18 | ch | +| stmts2.go:20:17:20:18 | ch | stmts2.go:20:17:20:18 | After ch | +| stmts2.go:21:3:23:3 | After if statement | stmts2.go:24:3:24:10 | Before return statement | +| stmts2.go:21:3:23:3 | if statement | stmts2.go:21:6:21:6 | Before y | +| stmts2.go:21:6:21:6 | After y [false] | stmts2.go:21:3:23:3 | After if statement | +| stmts2.go:21:6:21:6 | After y [true] | stmts2.go:21:8:23:3 | block statement | +| stmts2.go:21:6:21:6 | Before y | stmts2.go:21:6:21:6 | y | +| stmts2.go:21:6:21:6 | y | stmts2.go:21:6:21:6 | After y [false] | +| stmts2.go:21:6:21:6 | y | stmts2.go:21:6:21:6 | After y [true] | +| stmts2.go:21:8:23:3 | block statement | stmts2.go:22:4:22:8 | Before break statement | +| stmts2.go:22:4:22:8 | Before break statement | stmts2.go:22:4:22:8 | break statement | +| stmts2.go:22:4:22:8 | break statement | stmts2.go:16:2:26:2 | After select statement | +| stmts2.go:24:3:24:10 | Before return statement | stmts2.go:24:10:24:10 | Before 0 | +| stmts2.go:24:3:24:10 | return statement | stmts2.go:15:1:28:1 | Normal Exit | +| stmts2.go:24:10:24:10 | 0 | stmts2.go:24:10:24:10 | After 0 | +| stmts2.go:24:10:24:10 | After 0 | stmts2.go:24:3:24:10 | return statement | +| stmts2.go:24:10:24:10 | Before 0 | stmts2.go:24:10:24:10 | 0 | +| stmts2.go:25:2:25:18 | comm clause | stmts2.go:25:14:25:17 | <-... | +| stmts2.go:25:7:25:7 | After _ | stmts2.go:25:10:25:10 | Before _ | +| stmts2.go:25:7:25:7 | Before _ | stmts2.go:25:7:25:7 | _ | +| stmts2.go:25:7:25:7 | _ | stmts2.go:25:7:25:7 | After _ | | stmts2.go:25:7:25:17 | extract:0 ... = ... | stmts2.go:25:7:25:17 | extract:1 ... = ... | -| stmts2.go:25:7:25:17 | extract:1 ... = ... | stmts2.go:25:2:25:18 | skip | -| stmts2.go:25:10:25:10 | skip | stmts2.go:25:7:25:17 | extract:0 ... = ... | -| stmts2.go:25:14:25:17 | <-... | stmts2.go:25:7:25:7 | skip | -| stmts2.go:25:16:25:17 | ch | stmts2.go:16:2:26:2 | select statement | -| stmts2.go:27:2:27:9 | return statement | stmts2.go:15:1:28:1 | exit | -| stmts2.go:27:9:27:9 | 1 | stmts2.go:27:2:27:9 | return statement | -| stmts2.go:30:1:34:1 | entry | stmts2.go:31:2:31:2 | skip | -| stmts2.go:30:1:34:1 | function declaration | stmts2.go:0:0:0:0 | exit | -| stmts2.go:30:6:30:12 | skip | stmts2.go:30:1:34:1 | function declaration | -| stmts2.go:31:2:31:2 | skip | stmts2.go:31:5:31:5 | skip | +| stmts2.go:25:7:25:17 | extract:1 ... = ... | stmts2.go:16:2:26:2 | After select statement | +| stmts2.go:25:10:25:10 | After _ | stmts2.go:25:7:25:17 | extract:0 ... = ... | +| stmts2.go:25:10:25:10 | Before _ | stmts2.go:25:10:25:10 | _ | +| stmts2.go:25:10:25:10 | _ | stmts2.go:25:10:25:10 | After _ | +| stmts2.go:25:14:25:17 | <-... | stmts2.go:25:7:25:7 | Before _ | +| stmts2.go:25:16:25:17 | After ch | stmts2.go:16:2:26:2 | select statement | +| stmts2.go:25:16:25:17 | Before ch | stmts2.go:25:16:25:17 | ch | +| stmts2.go:25:16:25:17 | ch | stmts2.go:25:16:25:17 | After ch | +| stmts2.go:27:2:27:9 | Before return statement | stmts2.go:27:9:27:9 | Before 1 | +| stmts2.go:27:2:27:9 | return statement | stmts2.go:15:1:28:1 | Normal Exit | +| stmts2.go:27:9:27:9 | 1 | stmts2.go:27:9:27:9 | After 1 | +| stmts2.go:27:9:27:9 | After 1 | stmts2.go:27:2:27:9 | return statement | +| stmts2.go:27:9:27:9 | Before 1 | stmts2.go:27:9:27:9 | 1 | +| stmts2.go:30:1:34:1 | After function declaration | stmts2.go:0:0:0:0 | After stmts2.go | +| stmts2.go:30:1:34:1 | Before function declaration | stmts2.go:30:1:34:1 | function declaration | +| stmts2.go:30:1:34:1 | Entry | stmts2.go:30:20:34:1 | block statement | +| stmts2.go:30:1:34:1 | Exceptional Exit | stmts2.go:30:1:34:1 | Exit | +| stmts2.go:30:1:34:1 | Normal Exit | stmts2.go:30:1:34:1 | Exit | +| stmts2.go:30:1:34:1 | function declaration | stmts2.go:30:1:34:1 | After function declaration | +| stmts2.go:30:20:34:1 | block statement | stmts2.go:31:2:31:14 | ... := ... | +| stmts2.go:31:2:31:14 | ... := ... | stmts2.go:31:10:31:14 | Before call to gen | +| stmts2.go:31:2:31:14 | After ... := ... | stmts2.go:32:2:32:17 | declaration statement | | stmts2.go:31:2:31:14 | assign:0 ... := ... | stmts2.go:31:2:31:14 | extract:1 ... := ... | | stmts2.go:31:2:31:14 | extract:0 ... := ... | stmts2.go:31:2:31:14 | assign:0 ... := ... | -| stmts2.go:31:2:31:14 | extract:1 ... := ... | stmts2.go:32:6:32:6 | skip | -| stmts2.go:31:5:31:5 | skip | stmts2.go:31:10:31:12 | gen | -| stmts2.go:31:10:31:12 | gen | stmts2.go:31:10:31:14 | call to gen | -| stmts2.go:31:10:31:14 | call to gen | stmts2.go:30:1:34:1 | exit | -| stmts2.go:31:10:31:14 | call to gen | stmts2.go:31:2:31:14 | extract:0 ... := ... | -| stmts2.go:32:6:32:6 | skip | stmts2.go:32:9:32:9 | skip | +| stmts2.go:31:2:31:14 | extract:1 ... := ... | stmts2.go:31:2:31:14 | After ... := ... | +| stmts2.go:31:10:31:12 | After gen | stmts2.go:31:10:31:14 | call to gen | +| stmts2.go:31:10:31:12 | Before gen | stmts2.go:31:10:31:12 | gen | +| stmts2.go:31:10:31:12 | gen | stmts2.go:31:10:31:12 | After gen | +| stmts2.go:31:10:31:14 | After call to gen | stmts2.go:31:2:31:14 | extract:0 ... := ... | +| stmts2.go:31:10:31:14 | Before call to gen | stmts2.go:31:10:31:12 | Before gen | +| stmts2.go:31:10:31:14 | call to gen | stmts2.go:30:1:34:1 | Exceptional Exit | +| stmts2.go:31:10:31:14 | call to gen | stmts2.go:31:10:31:14 | After call to gen | +| stmts2.go:32:2:32:17 | After declaration statement | stmts2.go:33:2:33:13 | Before return statement | +| stmts2.go:32:2:32:17 | After variable declaration | stmts2.go:32:2:32:17 | After declaration statement | +| stmts2.go:32:2:32:17 | declaration statement | stmts2.go:32:2:32:17 | variable declaration | +| stmts2.go:32:2:32:17 | variable declaration | stmts2.go:32:6:32:17 | value declaration specifier | +| stmts2.go:32:6:32:17 | After value declaration specifier | stmts2.go:32:2:32:17 | After variable declaration | | stmts2.go:32:6:32:17 | assign:0 value declaration specifier | stmts2.go:32:6:32:17 | extract:1 value declaration specifier | | stmts2.go:32:6:32:17 | extract:0 value declaration specifier | stmts2.go:32:6:32:17 | assign:0 value declaration specifier | -| stmts2.go:32:6:32:17 | extract:1 value declaration specifier | stmts2.go:33:9:33:9 | x | -| stmts2.go:32:9:32:9 | skip | stmts2.go:32:13:32:15 | gen | -| stmts2.go:32:13:32:15 | gen | stmts2.go:32:13:32:17 | call to gen | -| stmts2.go:32:13:32:17 | call to gen | stmts2.go:30:1:34:1 | exit | -| stmts2.go:32:13:32:17 | call to gen | stmts2.go:32:6:32:17 | extract:0 value declaration specifier | -| stmts2.go:33:2:33:13 | return statement | stmts2.go:30:1:34:1 | exit | -| stmts2.go:33:9:33:9 | x | stmts2.go:33:13:33:13 | y | -| stmts2.go:33:9:33:13 | ...+... | stmts2.go:33:2:33:13 | return statement | -| stmts2.go:33:13:33:13 | y | stmts2.go:33:9:33:13 | ...+... | -| stmts3.go:0:0:0:0 | entry | stmts3.go:3:1:3:13 | skip | -| stmts3.go:3:1:3:13 | skip | stmts3.go:5:6:5:11 | skip | -| stmts3.go:5:1:12:1 | entry | stmts3.go:7:3:7:5 | skip | -| stmts3.go:5:1:12:1 | function declaration | stmts3.go:14:6:14:11 | skip | -| stmts3.go:5:6:5:11 | skip | stmts3.go:5:1:12:1 | function declaration | -| stmts3.go:7:3:7:5 | skip | stmts3.go:7:9:7:12 | iota | -| stmts3.go:7:3:7:12 | assign:0 value declaration specifier | stmts3.go:8:3:8:7 | skip | -| stmts3.go:7:9:7:12 | iota | stmts3.go:7:3:7:12 | assign:0 value declaration specifier | -| stmts3.go:8:3:8:7 | assign:0 value declaration specifier | stmts3.go:9:3:9:6 | skip | -| stmts3.go:8:3:8:7 | skip | stmts3.go:8:3:8:7 | zero-init:0 value declaration specifier | +| stmts2.go:32:6:32:17 | extract:1 value declaration specifier | stmts2.go:32:6:32:17 | After value declaration specifier | +| stmts2.go:32:6:32:17 | value declaration specifier | stmts2.go:32:13:32:17 | Before call to gen | +| stmts2.go:32:13:32:15 | After gen | stmts2.go:32:13:32:17 | call to gen | +| stmts2.go:32:13:32:15 | Before gen | stmts2.go:32:13:32:15 | gen | +| stmts2.go:32:13:32:15 | gen | stmts2.go:32:13:32:15 | After gen | +| stmts2.go:32:13:32:17 | After call to gen | stmts2.go:32:6:32:17 | extract:0 value declaration specifier | +| stmts2.go:32:13:32:17 | Before call to gen | stmts2.go:32:13:32:15 | Before gen | +| stmts2.go:32:13:32:17 | call to gen | stmts2.go:30:1:34:1 | Exceptional Exit | +| stmts2.go:32:13:32:17 | call to gen | stmts2.go:32:13:32:17 | After call to gen | +| stmts2.go:33:2:33:13 | Before return statement | stmts2.go:33:9:33:13 | Before ...+... | +| stmts2.go:33:2:33:13 | return statement | stmts2.go:30:1:34:1 | Normal Exit | +| stmts2.go:33:9:33:9 | After x | stmts2.go:33:13:33:13 | Before y | +| stmts2.go:33:9:33:9 | Before x | stmts2.go:33:9:33:9 | x | +| stmts2.go:33:9:33:9 | x | stmts2.go:33:9:33:9 | After x | +| stmts2.go:33:9:33:13 | ...+... | stmts2.go:33:9:33:13 | After ...+... | +| stmts2.go:33:9:33:13 | After ...+... | stmts2.go:33:2:33:13 | return statement | +| stmts2.go:33:9:33:13 | Before ...+... | stmts2.go:33:9:33:9 | Before x | +| stmts2.go:33:13:33:13 | After y | stmts2.go:33:9:33:13 | ...+... | +| stmts2.go:33:13:33:13 | Before y | stmts2.go:33:13:33:13 | y | +| stmts2.go:33:13:33:13 | y | stmts2.go:33:13:33:13 | After y | +| stmts3.go:0:0:0:0 | After stmts3.go | stmts3.go:0:0:0:0 | Normal Exit | +| stmts3.go:0:0:0:0 | Entry | stmts3.go:0:0:0:0 | stmts3.go | +| stmts3.go:0:0:0:0 | Normal Exit | stmts3.go:0:0:0:0 | Exit | +| stmts3.go:0:0:0:0 | stmts3.go | stmts3.go:3:1:3:13 | import declaration | +| stmts3.go:3:1:3:13 | After import declaration | stmts3.go:5:1:12:1 | Before function declaration | +| stmts3.go:3:1:3:13 | import declaration | stmts3.go:3:8:3:13 | import specifier | +| stmts3.go:3:8:3:13 | import specifier | stmts3.go:3:1:3:13 | After import declaration | +| stmts3.go:5:1:12:1 | After function declaration | stmts3.go:14:1:16:1 | Before function declaration | +| stmts3.go:5:1:12:1 | Before function declaration | stmts3.go:5:1:12:1 | function declaration | +| stmts3.go:5:1:12:1 | Entry | stmts3.go:5:19:12:1 | block statement | +| stmts3.go:5:1:12:1 | Normal Exit | stmts3.go:5:1:12:1 | Exit | +| stmts3.go:5:1:12:1 | function declaration | stmts3.go:5:1:12:1 | After function declaration | +| stmts3.go:5:19:12:1 | block statement | stmts3.go:6:2:10:2 | declaration statement | +| stmts3.go:6:2:10:2 | After constant declaration | stmts3.go:6:2:10:2 | After declaration statement | +| stmts3.go:6:2:10:2 | After declaration statement | stmts3.go:11:2:11:26 | Before return statement | +| stmts3.go:6:2:10:2 | constant declaration | stmts3.go:7:3:7:12 | value declaration specifier | +| stmts3.go:6:2:10:2 | declaration statement | stmts3.go:6:2:10:2 | constant declaration | +| stmts3.go:7:3:7:12 | After value declaration specifier | stmts3.go:8:3:8:7 | value declaration specifier | +| stmts3.go:7:3:7:12 | assign:0 value declaration specifier | stmts3.go:7:3:7:12 | After value declaration specifier | +| stmts3.go:7:3:7:12 | value declaration specifier | stmts3.go:7:9:7:12 | Before iota | +| stmts3.go:7:9:7:12 | After iota | stmts3.go:7:3:7:12 | assign:0 value declaration specifier | +| stmts3.go:7:9:7:12 | Before iota | stmts3.go:7:9:7:12 | iota | +| stmts3.go:7:9:7:12 | iota | stmts3.go:7:9:7:12 | After iota | +| stmts3.go:8:3:8:7 | After value declaration specifier | stmts3.go:9:3:9:6 | value declaration specifier | +| stmts3.go:8:3:8:7 | assign:0 value declaration specifier | stmts3.go:8:3:8:7 | After value declaration specifier | +| stmts3.go:8:3:8:7 | value declaration specifier | stmts3.go:8:3:8:7 | zero-init:0 value declaration specifier | | stmts3.go:8:3:8:7 | zero-init:0 value declaration specifier | stmts3.go:8:3:8:7 | assign:0 value declaration specifier | -| stmts3.go:9:3:9:6 | assign:0 value declaration specifier | stmts3.go:11:9:11:26 | ...-... | -| stmts3.go:9:3:9:6 | skip | stmts3.go:9:3:9:6 | zero-init:0 value declaration specifier | +| stmts3.go:9:3:9:6 | After value declaration specifier | stmts3.go:6:2:10:2 | After constant declaration | +| stmts3.go:9:3:9:6 | assign:0 value declaration specifier | stmts3.go:9:3:9:6 | After value declaration specifier | +| stmts3.go:9:3:9:6 | value declaration specifier | stmts3.go:9:3:9:6 | zero-init:0 value declaration specifier | | stmts3.go:9:3:9:6 | zero-init:0 value declaration specifier | stmts3.go:9:3:9:6 | assign:0 value declaration specifier | -| stmts3.go:11:2:11:26 | return statement | stmts3.go:5:1:12:1 | exit | -| stmts3.go:11:9:11:26 | ...-... | stmts3.go:11:2:11:26 | return statement | -| stmts3.go:14:1:16:1 | entry | stmts3.go:14:13:14:13 | x | -| stmts3.go:14:1:16:1 | function declaration | stmts3.go:18:6:18:11 | skip | -| stmts3.go:14:6:14:11 | skip | stmts3.go:14:1:16:1 | function declaration | -| stmts3.go:14:13:14:13 | x | stmts3.go:14:13:14:13 | x | -| stmts3.go:14:13:14:13 | x | stmts3.go:15:3:15:3 | x | -| stmts3.go:15:2:15:3 | skip | stmts3.go:14:1:16:1 | exit | -| stmts3.go:15:2:15:3 | skip | stmts3.go:15:7:15:8 | 42 | -| stmts3.go:15:2:15:8 | assign:0 ... = ... | stmts3.go:14:1:16:1 | exit | -| stmts3.go:15:3:15:3 | x | stmts3.go:15:2:15:3 | skip | -| stmts3.go:15:7:15:8 | 42 | stmts3.go:15:2:15:8 | assign:0 ... = ... | -| stmts3.go:18:1:20:1 | entry | stmts3.go:19:2:19:11 | skip | -| stmts3.go:18:1:20:1 | function declaration | stmts3.go:0:0:0:0 | exit | -| stmts3.go:18:6:18:11 | skip | stmts3.go:18:1:20:1 | function declaration | -| stmts3.go:19:2:19:11 | skip | stmts3.go:19:15:19:23 | function literal | -| stmts3.go:19:2:19:23 | assign:0 ... = ... | stmts3.go:18:1:20:1 | exit | -| stmts3.go:19:15:19:23 | entry | stmts3.go:19:22:19:23 | skip | -| stmts3.go:19:15:19:23 | function literal | stmts3.go:19:2:19:23 | assign:0 ... = ... | -| stmts3.go:19:22:19:23 | skip | stmts3.go:19:15:19:23 | exit | -| stmts4.go:0:0:0:0 | entry | stmts4.go:3:5:3:5 | skip | -| stmts4.go:3:5:3:5 | skip | stmts4.go:3:5:3:9 | zero-init:0 value declaration specifier | -| stmts4.go:3:5:3:9 | zero-init:0 value declaration specifier | stmts4.go:5:6:5:11 | skip | -| stmts4.go:5:1:5:26 | function declaration | stmts4.go:0:0:0:0 | exit | -| stmts4.go:5:6:5:11 | skip | stmts4.go:5:1:5:26 | function declaration | -| stmts5.go:0:0:0:0 | entry | stmts5.go:3:1:5:1 | skip | -| stmts5.go:3:1:5:1 | skip | stmts5.go:7:17:7:20 | skip | -| stmts5.go:7:1:9:1 | entry | stmts5.go:7:7:7:8 | me | -| stmts5.go:7:1:9:1 | function declaration | stmts5.go:11:14:11:16 | skip | -| stmts5.go:7:7:7:8 | me | stmts5.go:7:7:7:8 | me | +| stmts3.go:11:2:11:26 | Before return statement | stmts3.go:11:9:11:26 | Before ...-... | +| stmts3.go:11:2:11:26 | return statement | stmts3.go:5:1:12:1 | Normal Exit | +| stmts3.go:11:9:11:11 | After red | stmts3.go:11:15:11:19 | Before green | +| stmts3.go:11:9:11:11 | Before red | stmts3.go:11:9:11:11 | red | +| stmts3.go:11:9:11:11 | red | stmts3.go:11:9:11:11 | After red | +| stmts3.go:11:9:11:19 | ...+... | stmts3.go:11:9:11:19 | After ...+... | +| stmts3.go:11:9:11:19 | After ...+... | stmts3.go:11:23:11:26 | Before blue | +| stmts3.go:11:9:11:19 | Before ...+... | stmts3.go:11:9:11:11 | Before red | +| stmts3.go:11:9:11:26 | ...-... | stmts3.go:11:9:11:26 | After ...-... | +| stmts3.go:11:9:11:26 | After ...-... | stmts3.go:11:2:11:26 | return statement | +| stmts3.go:11:9:11:26 | Before ...-... | stmts3.go:11:9:11:19 | Before ...+... | +| stmts3.go:11:15:11:19 | After green | stmts3.go:11:9:11:19 | ...+... | +| stmts3.go:11:15:11:19 | Before green | stmts3.go:11:15:11:19 | green | +| stmts3.go:11:15:11:19 | green | stmts3.go:11:15:11:19 | After green | +| stmts3.go:11:23:11:26 | After blue | stmts3.go:11:9:11:26 | ...-... | +| stmts3.go:11:23:11:26 | Before blue | stmts3.go:11:23:11:26 | blue | +| stmts3.go:11:23:11:26 | blue | stmts3.go:11:23:11:26 | After blue | +| stmts3.go:14:1:16:1 | After function declaration | stmts3.go:18:1:20:1 | Before function declaration | +| stmts3.go:14:1:16:1 | Before function declaration | stmts3.go:14:1:16:1 | function declaration | +| stmts3.go:14:1:16:1 | Entry | stmts3.go:14:13:14:13 | x | +| stmts3.go:14:1:16:1 | Normal Exit | stmts3.go:14:1:16:1 | Exit | +| stmts3.go:14:1:16:1 | function declaration | stmts3.go:14:1:16:1 | After function declaration | +| stmts3.go:14:13:14:13 | x | stmts3.go:14:21:16:1 | block statement | +| stmts3.go:14:21:16:1 | After block statement | stmts3.go:14:1:16:1 | Normal Exit | +| stmts3.go:14:21:16:1 | block statement | stmts3.go:15:2:15:8 | ... = ... | +| stmts3.go:15:2:15:8 | ... = ... | stmts3.go:15:7:15:8 | Before 42 | +| stmts3.go:15:2:15:8 | After ... = ... | stmts3.go:14:21:16:1 | After block statement | +| stmts3.go:15:2:15:8 | assign:0 ... = ... | stmts3.go:15:2:15:8 | After ... = ... | +| stmts3.go:15:7:15:8 | 42 | stmts3.go:15:7:15:8 | After 42 | +| stmts3.go:15:7:15:8 | After 42 | stmts3.go:15:2:15:8 | assign:0 ... = ... | +| stmts3.go:15:7:15:8 | Before 42 | stmts3.go:15:7:15:8 | 42 | +| stmts3.go:18:1:20:1 | After function declaration | stmts3.go:0:0:0:0 | After stmts3.go | +| stmts3.go:18:1:20:1 | Before function declaration | stmts3.go:18:1:20:1 | function declaration | +| stmts3.go:18:1:20:1 | Entry | stmts3.go:18:15:20:1 | block statement | +| stmts3.go:18:1:20:1 | Normal Exit | stmts3.go:18:1:20:1 | Exit | +| stmts3.go:18:1:20:1 | function declaration | stmts3.go:18:1:20:1 | After function declaration | +| stmts3.go:18:15:20:1 | After block statement | stmts3.go:18:1:20:1 | Normal Exit | +| stmts3.go:18:15:20:1 | block statement | stmts3.go:19:2:19:23 | ... = ... | +| stmts3.go:19:2:19:11 | After selection of Usage | stmts3.go:19:15:19:23 | Before function literal | +| stmts3.go:19:2:19:11 | Before selection of Usage | stmts3.go:19:2:19:11 | selection of Usage | +| stmts3.go:19:2:19:11 | selection of Usage | stmts3.go:19:2:19:11 | After selection of Usage | +| stmts3.go:19:2:19:23 | ... = ... | stmts3.go:19:2:19:11 | Before selection of Usage | +| stmts3.go:19:2:19:23 | After ... = ... | stmts3.go:18:15:20:1 | After block statement | +| stmts3.go:19:2:19:23 | assign:0 ... = ... | stmts3.go:19:2:19:23 | After ... = ... | +| stmts3.go:19:15:19:23 | After function literal | stmts3.go:19:2:19:23 | assign:0 ... = ... | +| stmts3.go:19:15:19:23 | Before function literal | stmts3.go:19:15:19:23 | function literal | +| stmts3.go:19:15:19:23 | Entry | stmts3.go:19:22:19:23 | block statement | +| stmts3.go:19:15:19:23 | Normal Exit | stmts3.go:19:15:19:23 | Exit | +| stmts3.go:19:15:19:23 | function literal | stmts3.go:19:15:19:23 | After function literal | +| stmts3.go:19:22:19:23 | block statement | stmts3.go:19:15:19:23 | Normal Exit | +| stmts4.go:0:0:0:0 | After stmts4.go | stmts4.go:0:0:0:0 | Normal Exit | +| stmts4.go:0:0:0:0 | Entry | stmts4.go:0:0:0:0 | stmts4.go | +| stmts4.go:0:0:0:0 | Normal Exit | stmts4.go:0:0:0:0 | Exit | +| stmts4.go:0:0:0:0 | stmts4.go | stmts4.go:3:1:3:9 | variable declaration | +| stmts4.go:3:1:3:9 | After variable declaration | stmts4.go:5:1:5:26 | Before function declaration | +| stmts4.go:3:1:3:9 | variable declaration | stmts4.go:3:5:3:9 | value declaration specifier | +| stmts4.go:3:5:3:9 | After value declaration specifier | stmts4.go:3:1:3:9 | After variable declaration | +| stmts4.go:3:5:3:9 | value declaration specifier | stmts4.go:3:5:3:9 | zero-init:0 value declaration specifier | +| stmts4.go:3:5:3:9 | zero-init:0 value declaration specifier | stmts4.go:3:5:3:9 | After value declaration specifier | +| stmts4.go:5:1:5:26 | After function declaration | stmts4.go:0:0:0:0 | After stmts4.go | +| stmts4.go:5:1:5:26 | Before function declaration | stmts4.go:5:1:5:26 | function declaration | +| stmts4.go:5:1:5:26 | function declaration | stmts4.go:5:1:5:26 | After function declaration | +| stmts5.go:0:0:0:0 | After stmts5.go | stmts5.go:0:0:0:0 | Normal Exit | +| stmts5.go:0:0:0:0 | Entry | stmts5.go:0:0:0:0 | stmts5.go | +| stmts5.go:0:0:0:0 | Normal Exit | stmts5.go:0:0:0:0 | Exit | +| stmts5.go:0:0:0:0 | stmts5.go | stmts5.go:3:1:5:1 | type declaration | +| stmts5.go:3:1:5:1 | After type declaration | stmts5.go:7:1:9:1 | Before function declaration | +| stmts5.go:3:1:5:1 | type declaration | stmts5.go:3:6:5:1 | type declaration specifier | +| stmts5.go:3:6:5:1 | type declaration specifier | stmts5.go:3:1:5:1 | After type declaration | +| stmts5.go:7:1:9:1 | After function declaration | stmts5.go:11:1:12:1 | Before function declaration | +| stmts5.go:7:1:9:1 | Before function declaration | stmts5.go:7:1:9:1 | function declaration | +| stmts5.go:7:1:9:1 | Entry | stmts5.go:7:7:7:8 | me | +| stmts5.go:7:1:9:1 | Normal Exit | stmts5.go:7:1:9:1 | Exit | +| stmts5.go:7:1:9:1 | function declaration | stmts5.go:7:1:9:1 | After function declaration | | stmts5.go:7:7:7:8 | me | stmts5.go:7:22:7:26 | other | -| stmts5.go:7:17:7:20 | skip | stmts5.go:7:1:9:1 | function declaration | -| stmts5.go:7:22:7:26 | other | stmts5.go:7:22:7:26 | other | -| stmts5.go:7:22:7:26 | other | stmts5.go:8:2:8:3 | me | -| stmts5.go:8:2:8:3 | me | stmts5.go:8:2:8:7 | selection of val | -| stmts5.go:8:2:8:7 | selection of val | stmts5.go:8:12:8:16 | other | -| stmts5.go:8:2:8:16 | assign:0 ... += ... | stmts5.go:7:1:9:1 | exit | +| stmts5.go:7:22:7:26 | other | stmts5.go:7:33:9:1 | block statement | +| stmts5.go:7:33:9:1 | After block statement | stmts5.go:7:1:9:1 | Normal Exit | +| stmts5.go:7:33:9:1 | block statement | stmts5.go:8:2:8:16 | ... += ... | +| stmts5.go:8:2:8:3 | After me | stmts5.go:8:2:8:7 | selection of val | +| stmts5.go:8:2:8:3 | Before me | stmts5.go:8:2:8:3 | me | +| stmts5.go:8:2:8:3 | me | stmts5.go:8:2:8:3 | After me | +| stmts5.go:8:2:8:7 | After selection of val | stmts5.go:8:12:8:16 | Before other | +| stmts5.go:8:2:8:7 | Before selection of val | stmts5.go:8:2:8:3 | Before me | +| stmts5.go:8:2:8:7 | selection of val | stmts5.go:8:2:8:7 | After selection of val | +| stmts5.go:8:2:8:16 | ... += ... | stmts5.go:8:2:8:7 | Before selection of val | +| stmts5.go:8:2:8:16 | After ... += ... | stmts5.go:7:33:9:1 | After block statement | +| stmts5.go:8:2:8:16 | assign:0 ... += ... | stmts5.go:8:2:8:16 | After ... += ... | | stmts5.go:8:2:8:16 | compound-rhs ... += ... | stmts5.go:8:2:8:16 | assign:0 ... += ... | -| stmts5.go:8:12:8:16 | other | stmts5.go:8:2:8:16 | compound-rhs ... += ... | -| stmts5.go:11:1:12:1 | entry | stmts5.go:11:20:12:1 | skip | -| stmts5.go:11:1:12:1 | function declaration | stmts5.go:0:0:0:0 | exit | -| stmts5.go:11:14:11:16 | skip | stmts5.go:11:1:12:1 | function declaration | -| stmts5.go:11:20:12:1 | skip | stmts5.go:11:1:12:1 | exit | -| stmts6.go:0:0:0:0 | entry | stmts6.go:3:6:3:11 | skip | -| stmts6.go:3:1:8:1 | entry | stmts6.go:4:5:4:8 | true | -| stmts6.go:3:1:8:1 | function declaration | stmts6.go:0:0:0:0 | exit | -| stmts6.go:3:6:3:11 | skip | stmts6.go:3:1:8:1 | function declaration | -| stmts6.go:4:5:4:8 | true | stmts6.go:4:5:4:8 | true is true | -| stmts6.go:4:5:4:8 | true is false | stmts6.go:7:9:7:10 | 23 | -| stmts6.go:4:5:4:8 | true is true | stmts6.go:5:10:5:11 | 42 | -| stmts6.go:5:3:5:11 | return statement | stmts6.go:3:1:8:1 | exit | -| stmts6.go:5:10:5:11 | 42 | stmts6.go:5:3:5:11 | return statement | -| stmts6.go:7:9:7:10 | 23 | stmts6.go:7:2:7:10 | return statement | -| stmts7.go:0:0:0:0 | entry | stmts7.go:3:1:6:1 | skip | -| stmts7.go:3:1:6:1 | skip | stmts7.go:8:6:8:17 | skip | -| stmts7.go:8:1:11:1 | entry | stmts7.go:9:2:9:5 | skip | -| stmts7.go:8:1:11:1 | function declaration | stmts7.go:13:6:13:15 | skip | -| stmts7.go:8:6:8:17 | skip | stmts7.go:8:1:11:1 | function declaration | -| stmts7.go:9:2:9:5 | skip | stmts7.go:9:10:9:16 | recover | -| stmts7.go:9:2:9:18 | assign:0 ... := ... | stmts7.go:10:2:10:12 | selection of Println | -| stmts7.go:9:10:9:16 | recover | stmts7.go:9:10:9:18 | call to recover | -| stmts7.go:9:10:9:18 | call to recover | stmts7.go:9:2:9:18 | assign:0 ... := ... | -| stmts7.go:10:2:10:12 | selection of Println | stmts7.go:10:14:10:26 | "recovered: " | -| stmts7.go:10:2:10:33 | call to Println | stmts7.go:8:1:11:1 | exit | -| stmts7.go:10:14:10:26 | "recovered: " | stmts7.go:10:29:10:32 | blah | -| stmts7.go:10:29:10:32 | blah | stmts7.go:10:2:10:33 | call to Println | -| stmts7.go:13:1:16:1 | entry | stmts7.go:14:8:14:19 | recoverPanic | -| stmts7.go:13:1:16:1 | function declaration | stmts7.go:18:1:20:1 | skip | -| stmts7.go:13:6:13:15 | skip | stmts7.go:13:1:16:1 | function declaration | -| stmts7.go:14:2:14:21 | defer statement | stmts7.go:15:2:15:6 | panic | -| stmts7.go:14:8:14:19 | recoverPanic | stmts7.go:14:2:14:21 | defer statement | -| stmts7.go:14:8:14:21 | call to recoverPanic | stmts7.go:13:1:16:1 | exit | -| stmts7.go:15:2:15:6 | panic | stmts7.go:15:8:15:9 | "" | -| stmts7.go:15:2:15:10 | call to panic | stmts7.go:14:8:14:21 | call to recoverPanic | -| stmts7.go:15:8:15:9 | "" | stmts7.go:15:2:15:10 | call to panic | -| stmts7.go:18:1:20:1 | skip | stmts7.go:22:26:22:28 | skip | -| stmts7.go:22:1:24:1 | entry | stmts7.go:22:7:22:13 | methods | -| stmts7.go:22:1:24:1 | function declaration | stmts7.go:26:6:26:14 | skip | -| stmts7.go:22:7:22:13 | methods | stmts7.go:22:7:22:13 | methods | -| stmts7.go:22:7:22:13 | methods | stmts7.go:23:2:23:8 | methods | -| stmts7.go:22:26:22:28 | skip | stmts7.go:22:1:24:1 | function declaration | -| stmts7.go:23:2:23:8 | implicit-deref methods | stmts7.go:22:1:24:1 | exit | +| stmts5.go:8:12:8:16 | After other | stmts5.go:8:2:8:16 | compound-rhs ... += ... | +| stmts5.go:8:12:8:16 | Before other | stmts5.go:8:12:8:16 | other | +| stmts5.go:8:12:8:16 | other | stmts5.go:8:12:8:16 | After other | +| stmts5.go:11:1:12:1 | After function declaration | stmts5.go:0:0:0:0 | After stmts5.go | +| stmts5.go:11:1:12:1 | Before function declaration | stmts5.go:11:1:12:1 | function declaration | +| stmts5.go:11:1:12:1 | Entry | stmts5.go:11:20:12:1 | block statement | +| stmts5.go:11:1:12:1 | Normal Exit | stmts5.go:11:1:12:1 | Exit | +| stmts5.go:11:1:12:1 | function declaration | stmts5.go:11:1:12:1 | After function declaration | +| stmts5.go:11:20:12:1 | block statement | stmts5.go:11:1:12:1 | Normal Exit | +| stmts6.go:0:0:0:0 | After stmts6.go | stmts6.go:0:0:0:0 | Normal Exit | +| stmts6.go:0:0:0:0 | Entry | stmts6.go:0:0:0:0 | stmts6.go | +| stmts6.go:0:0:0:0 | Normal Exit | stmts6.go:0:0:0:0 | Exit | +| stmts6.go:0:0:0:0 | stmts6.go | stmts6.go:3:1:8:1 | Before function declaration | +| stmts6.go:3:1:8:1 | After function declaration | stmts6.go:0:0:0:0 | After stmts6.go | +| stmts6.go:3:1:8:1 | Before function declaration | stmts6.go:3:1:8:1 | function declaration | +| stmts6.go:3:1:8:1 | Entry | stmts6.go:3:19:8:1 | block statement | +| stmts6.go:3:1:8:1 | Normal Exit | stmts6.go:3:1:8:1 | Exit | +| stmts6.go:3:1:8:1 | function declaration | stmts6.go:3:1:8:1 | After function declaration | +| stmts6.go:3:19:8:1 | block statement | stmts6.go:4:2:6:2 | if statement | +| stmts6.go:4:2:6:2 | if statement | stmts6.go:4:5:4:8 | Before true | +| stmts6.go:4:5:4:8 | After true [true] | stmts6.go:4:10:6:2 | block statement | +| stmts6.go:4:5:4:8 | Before true | stmts6.go:4:5:4:8 | true | +| stmts6.go:4:5:4:8 | true | stmts6.go:4:5:4:8 | After true [true] | +| stmts6.go:4:10:6:2 | block statement | stmts6.go:5:3:5:11 | Before return statement | +| stmts6.go:5:3:5:11 | Before return statement | stmts6.go:5:10:5:11 | Before 42 | +| stmts6.go:5:3:5:11 | return statement | stmts6.go:3:1:8:1 | Normal Exit | +| stmts6.go:5:10:5:11 | 42 | stmts6.go:5:10:5:11 | After 42 | +| stmts6.go:5:10:5:11 | After 42 | stmts6.go:5:3:5:11 | return statement | +| stmts6.go:5:10:5:11 | Before 42 | stmts6.go:5:10:5:11 | 42 | +| stmts7.go:0:0:0:0 | After stmts7.go | stmts7.go:0:0:0:0 | Normal Exit | +| stmts7.go:0:0:0:0 | Entry | stmts7.go:0:0:0:0 | stmts7.go | +| stmts7.go:0:0:0:0 | Normal Exit | stmts7.go:0:0:0:0 | Exit | +| stmts7.go:0:0:0:0 | stmts7.go | stmts7.go:3:1:6:1 | import declaration | +| stmts7.go:3:1:6:1 | After import declaration | stmts7.go:8:1:11:1 | Before function declaration | +| stmts7.go:3:1:6:1 | import declaration | stmts7.go:4:2:4:6 | import specifier | +| stmts7.go:4:2:4:6 | import specifier | stmts7.go:5:2:5:5 | import specifier | +| stmts7.go:5:2:5:5 | import specifier | stmts7.go:3:1:6:1 | After import declaration | +| stmts7.go:8:1:11:1 | After function declaration | stmts7.go:13:1:16:1 | Before function declaration | +| stmts7.go:8:1:11:1 | Before function declaration | stmts7.go:8:1:11:1 | function declaration | +| stmts7.go:8:1:11:1 | Entry | stmts7.go:8:21:11:1 | block statement | +| stmts7.go:8:1:11:1 | Exceptional Exit | stmts7.go:8:1:11:1 | Exit | +| stmts7.go:8:1:11:1 | Normal Exit | stmts7.go:8:1:11:1 | Exit | +| stmts7.go:8:1:11:1 | function declaration | stmts7.go:8:1:11:1 | After function declaration | +| stmts7.go:8:21:11:1 | After block statement | stmts7.go:8:1:11:1 | Normal Exit | +| stmts7.go:8:21:11:1 | block statement | stmts7.go:9:2:9:18 | ... := ... | +| stmts7.go:9:2:9:18 | ... := ... | stmts7.go:9:10:9:18 | Before call to recover | +| stmts7.go:9:2:9:18 | After ... := ... | stmts7.go:10:2:10:33 | expression statement | +| stmts7.go:9:2:9:18 | assign:0 ... := ... | stmts7.go:9:2:9:18 | After ... := ... | +| stmts7.go:9:10:9:16 | After recover | stmts7.go:9:10:9:18 | call to recover | +| stmts7.go:9:10:9:16 | Before recover | stmts7.go:9:10:9:16 | recover | +| stmts7.go:9:10:9:16 | recover | stmts7.go:9:10:9:16 | After recover | +| stmts7.go:9:10:9:18 | After call to recover | stmts7.go:9:2:9:18 | assign:0 ... := ... | +| stmts7.go:9:10:9:18 | Before call to recover | stmts7.go:9:10:9:16 | Before recover | +| stmts7.go:9:10:9:18 | call to recover | stmts7.go:9:10:9:18 | After call to recover | +| stmts7.go:10:2:10:12 | After selection of Println | stmts7.go:10:14:10:26 | Before "recovered: " | +| stmts7.go:10:2:10:12 | Before selection of Println | stmts7.go:10:2:10:12 | selection of Println | +| stmts7.go:10:2:10:12 | selection of Println | stmts7.go:10:2:10:12 | After selection of Println | +| stmts7.go:10:2:10:33 | After call to Println | stmts7.go:10:2:10:33 | After expression statement | +| stmts7.go:10:2:10:33 | After expression statement | stmts7.go:8:21:11:1 | After block statement | +| stmts7.go:10:2:10:33 | Before call to Println | stmts7.go:10:2:10:12 | Before selection of Println | +| stmts7.go:10:2:10:33 | call to Println | stmts7.go:8:1:11:1 | Exceptional Exit | +| stmts7.go:10:2:10:33 | call to Println | stmts7.go:10:2:10:33 | After call to Println | +| stmts7.go:10:2:10:33 | expression statement | stmts7.go:10:2:10:33 | Before call to Println | +| stmts7.go:10:14:10:26 | "recovered: " | stmts7.go:10:14:10:26 | After "recovered: " | +| stmts7.go:10:14:10:26 | After "recovered: " | stmts7.go:10:29:10:32 | Before blah | +| stmts7.go:10:14:10:26 | Before "recovered: " | stmts7.go:10:14:10:26 | "recovered: " | +| stmts7.go:10:29:10:32 | After blah | stmts7.go:10:2:10:33 | call to Println | +| stmts7.go:10:29:10:32 | Before blah | stmts7.go:10:29:10:32 | blah | +| stmts7.go:10:29:10:32 | blah | stmts7.go:10:29:10:32 | After blah | +| stmts7.go:13:1:16:1 | After function declaration | stmts7.go:18:1:20:1 | type declaration | +| stmts7.go:13:1:16:1 | Before function declaration | stmts7.go:13:1:16:1 | function declaration | +| stmts7.go:13:1:16:1 | Entry | stmts7.go:13:19:16:1 | block statement | +| stmts7.go:13:1:16:1 | Exceptional Exit | stmts7.go:13:1:16:1 | Exit | +| stmts7.go:13:1:16:1 | Normal Exit | stmts7.go:13:1:16:1 | Exit | +| stmts7.go:13:1:16:1 | function declaration | stmts7.go:13:1:16:1 | After function declaration | +| stmts7.go:13:19:16:1 | block statement | stmts7.go:14:2:14:21 | Before defer statement | +| stmts7.go:14:2:14:21 | After defer statement | stmts7.go:15:2:15:10 | expression statement | +| stmts7.go:14:2:14:21 | Before defer statement | stmts7.go:14:8:14:21 | call to recoverPanic | +| stmts7.go:14:2:14:21 | defer statement | stmts7.go:14:2:14:21 | After defer statement | +| stmts7.go:14:8:14:19 | After recoverPanic | stmts7.go:14:8:14:21 | After call to recoverPanic | +| stmts7.go:14:8:14:19 | Before recoverPanic | stmts7.go:14:8:14:19 | recoverPanic | +| stmts7.go:14:8:14:19 | recoverPanic | stmts7.go:14:8:14:19 | After recoverPanic | +| stmts7.go:14:8:14:21 | After call to recoverPanic | stmts7.go:14:2:14:21 | defer statement | +| stmts7.go:14:8:14:21 | call to recoverPanic | stmts7.go:14:8:14:19 | Before recoverPanic | +| stmts7.go:14:8:14:21 | defer-invoke call to recoverPanic | stmts7.go:13:1:16:1 | Exceptional Exit | +| stmts7.go:14:8:14:21 | defer-invoke call to recoverPanic | stmts7.go:13:1:16:1 | Normal Exit | +| stmts7.go:15:2:15:6 | After panic | stmts7.go:15:8:15:9 | Before "" | +| stmts7.go:15:2:15:6 | Before panic | stmts7.go:15:2:15:6 | panic | +| stmts7.go:15:2:15:6 | panic | stmts7.go:15:2:15:6 | After panic | +| stmts7.go:15:2:15:10 | Before call to panic | stmts7.go:15:2:15:6 | Before panic | +| stmts7.go:15:2:15:10 | call to panic | stmts7.go:14:8:14:21 | defer-invoke call to recoverPanic | +| stmts7.go:15:2:15:10 | expression statement | stmts7.go:15:2:15:10 | Before call to panic | +| stmts7.go:15:8:15:9 | "" | stmts7.go:15:8:15:9 | After "" | +| stmts7.go:15:8:15:9 | After "" | stmts7.go:15:2:15:10 | call to panic | +| stmts7.go:15:8:15:9 | Before "" | stmts7.go:15:8:15:9 | "" | +| stmts7.go:18:1:20:1 | After type declaration | stmts7.go:22:1:24:1 | Before function declaration | +| stmts7.go:18:1:20:1 | type declaration | stmts7.go:18:6:20:1 | type declaration specifier | +| stmts7.go:18:6:20:1 | type declaration specifier | stmts7.go:18:1:20:1 | After type declaration | +| stmts7.go:22:1:24:1 | After function declaration | stmts7.go:26:1:31:1 | Before function declaration | +| stmts7.go:22:1:24:1 | Before function declaration | stmts7.go:22:1:24:1 | function declaration | +| stmts7.go:22:1:24:1 | Entry | stmts7.go:22:7:22:13 | methods | +| stmts7.go:22:1:24:1 | Exceptional Exit | stmts7.go:22:1:24:1 | Exit | +| stmts7.go:22:1:24:1 | Normal Exit | stmts7.go:22:1:24:1 | Exit | +| stmts7.go:22:1:24:1 | function declaration | stmts7.go:22:1:24:1 | After function declaration | +| stmts7.go:22:7:22:13 | methods | stmts7.go:22:32:24:1 | block statement | +| stmts7.go:22:32:24:1 | After block statement | stmts7.go:22:1:24:1 | Normal Exit | +| stmts7.go:22:32:24:1 | block statement | stmts7.go:23:2:23:13 | expression statement | +| stmts7.go:23:2:23:8 | After methods | stmts7.go:23:2:23:8 | implicit-deref methods | +| stmts7.go:23:2:23:8 | Before methods | stmts7.go:23:2:23:8 | methods | | stmts7.go:23:2:23:8 | implicit-deref methods | stmts7.go:23:2:23:11 | selection of fn | -| stmts7.go:23:2:23:8 | methods | stmts7.go:23:2:23:8 | implicit-deref methods | -| stmts7.go:23:2:23:11 | selection of fn | stmts7.go:23:2:23:13 | call to fn | -| stmts7.go:23:2:23:13 | call to fn | stmts7.go:22:1:24:1 | exit | -| stmts7.go:26:1:31:1 | entry | stmts7.go:26:16:26:23 | callback | -| stmts7.go:26:1:31:1 | function declaration | stmts7.go:33:6:33:20 | skip | -| stmts7.go:26:6:26:14 | skip | stmts7.go:26:1:31:1 | function declaration | -| stmts7.go:26:16:26:23 | callback | stmts7.go:26:16:26:23 | callback | -| stmts7.go:26:16:26:23 | callback | stmts7.go:27:8:27:15 | callback | -| stmts7.go:27:2:27:20 | defer statement | stmts7.go:28:10:28:17 | callback | -| stmts7.go:27:8:27:15 | callback | stmts7.go:27:8:27:18 | selection of fn | -| stmts7.go:27:8:27:18 | selection of fn | stmts7.go:27:2:27:20 | defer statement | -| stmts7.go:27:8:27:20 | call to fn | stmts7.go:26:1:31:1 | exit | -| stmts7.go:28:2:28:23 | defer statement | stmts7.go:29:2:29:12 | selection of Println | -| stmts7.go:28:8:28:18 | implicit-deref (...) | stmts7.go:27:8:27:20 | call to fn | +| stmts7.go:23:2:23:8 | methods | stmts7.go:23:2:23:8 | After methods | +| stmts7.go:23:2:23:11 | After selection of fn | stmts7.go:23:2:23:13 | call to fn | +| stmts7.go:23:2:23:11 | Before selection of fn | stmts7.go:23:2:23:8 | Before methods | +| stmts7.go:23:2:23:11 | selection of fn | stmts7.go:23:2:23:11 | After selection of fn | +| stmts7.go:23:2:23:13 | After call to fn | stmts7.go:23:2:23:13 | After expression statement | +| stmts7.go:23:2:23:13 | After expression statement | stmts7.go:22:32:24:1 | After block statement | +| stmts7.go:23:2:23:13 | Before call to fn | stmts7.go:23:2:23:11 | Before selection of fn | +| stmts7.go:23:2:23:13 | call to fn | stmts7.go:22:1:24:1 | Exceptional Exit | +| stmts7.go:23:2:23:13 | call to fn | stmts7.go:23:2:23:13 | After call to fn | +| stmts7.go:23:2:23:13 | expression statement | stmts7.go:23:2:23:13 | Before call to fn | +| stmts7.go:26:1:31:1 | After function declaration | stmts7.go:33:1:36:1 | Before function declaration | +| stmts7.go:26:1:31:1 | Before function declaration | stmts7.go:26:1:31:1 | function declaration | +| stmts7.go:26:1:31:1 | Entry | stmts7.go:26:16:26:23 | callback | +| stmts7.go:26:1:31:1 | Exceptional Exit | stmts7.go:26:1:31:1 | Exit | +| stmts7.go:26:1:31:1 | Normal Exit | stmts7.go:26:1:31:1 | Exit | +| stmts7.go:26:1:31:1 | function declaration | stmts7.go:26:1:31:1 | After function declaration | +| stmts7.go:26:16:26:23 | callback | stmts7.go:26:40:31:1 | block statement | +| stmts7.go:26:40:31:1 | block statement | stmts7.go:27:2:27:20 | Before defer statement | +| stmts7.go:27:2:27:20 | After defer statement | stmts7.go:28:2:28:23 | Before defer statement | +| stmts7.go:27:2:27:20 | Before defer statement | stmts7.go:27:8:27:20 | call to fn | +| stmts7.go:27:2:27:20 | defer statement | stmts7.go:27:2:27:20 | After defer statement | +| stmts7.go:27:8:27:15 | After callback | stmts7.go:27:8:27:18 | selection of fn | +| stmts7.go:27:8:27:15 | Before callback | stmts7.go:27:8:27:15 | callback | +| stmts7.go:27:8:27:15 | callback | stmts7.go:27:8:27:15 | After callback | +| stmts7.go:27:8:27:18 | After selection of fn | stmts7.go:27:8:27:20 | After call to fn | +| stmts7.go:27:8:27:18 | Before selection of fn | stmts7.go:27:8:27:15 | Before callback | +| stmts7.go:27:8:27:18 | selection of fn | stmts7.go:27:8:27:18 | After selection of fn | +| stmts7.go:27:8:27:20 | After call to fn | stmts7.go:27:2:27:20 | defer statement | +| stmts7.go:27:8:27:20 | call to fn | stmts7.go:27:8:27:18 | Before selection of fn | +| stmts7.go:27:8:27:20 | defer-invoke call to fn | stmts7.go:26:1:31:1 | Exceptional Exit | +| stmts7.go:27:8:27:20 | defer-invoke call to fn | stmts7.go:26:1:31:1 | Normal Exit | +| stmts7.go:28:2:28:23 | After defer statement | stmts7.go:29:2:29:31 | expression statement | +| stmts7.go:28:2:28:23 | Before defer statement | stmts7.go:28:8:28:23 | call to fn | +| stmts7.go:28:2:28:23 | defer statement | stmts7.go:28:2:28:23 | After defer statement | +| stmts7.go:28:8:28:18 | (...) | stmts7.go:28:9:28:17 | Before &... | +| stmts7.go:28:8:28:18 | After (...) | stmts7.go:28:8:28:18 | implicit-deref (...) | | stmts7.go:28:8:28:18 | implicit-deref (...) | stmts7.go:28:8:28:21 | selection of fn | -| stmts7.go:28:8:28:21 | selection of fn | stmts7.go:28:2:28:23 | defer statement | -| stmts7.go:28:8:28:23 | call to fn | stmts7.go:27:8:27:20 | call to fn | -| stmts7.go:28:9:28:17 | &... | stmts7.go:28:8:28:18 | implicit-deref (...) | -| stmts7.go:28:10:28:17 | callback | stmts7.go:28:9:28:17 | &... | -| stmts7.go:29:2:29:12 | selection of Println | stmts7.go:29:14:29:30 | "print something" | -| stmts7.go:29:2:29:31 | call to Println | stmts7.go:28:8:28:23 | call to fn | -| stmts7.go:29:2:29:31 | call to Println | stmts7.go:30:9:30:13 | false | -| stmts7.go:29:14:29:30 | "print something" | stmts7.go:29:2:29:31 | call to Println | -| stmts7.go:30:2:30:13 | return statement | stmts7.go:28:8:28:23 | call to fn | -| stmts7.go:30:9:30:13 | false | stmts7.go:30:2:30:13 | return statement | -| stmts7.go:33:1:36:1 | entry | stmts7.go:34:8:34:19 | recoverPanic | -| stmts7.go:33:1:36:1 | function declaration | stmts7.go:38:6:38:18 | skip | -| stmts7.go:33:6:33:20 | skip | stmts7.go:33:1:36:1 | function declaration | -| stmts7.go:34:2:34:21 | defer statement | stmts7.go:35:2:35:8 | selection of Exit | -| stmts7.go:34:8:34:19 | recoverPanic | stmts7.go:34:2:34:21 | defer statement | -| stmts7.go:34:8:34:21 | call to recoverPanic | stmts7.go:33:1:36:1 | exit | -| stmts7.go:35:2:35:8 | selection of Exit | stmts7.go:35:10:35:10 | 1 | -| stmts7.go:35:2:35:11 | call to Exit | stmts7.go:34:8:34:21 | call to recoverPanic | -| stmts7.go:35:10:35:10 | 1 | stmts7.go:35:2:35:11 | call to Exit | -| stmts7.go:38:1:41:1 | entry | stmts7.go:39:8:39:19 | recoverPanic | -| stmts7.go:38:1:41:1 | function declaration | stmts7.go:43:6:43:23 | skip | -| stmts7.go:38:6:38:18 | skip | stmts7.go:38:1:41:1 | function declaration | -| stmts7.go:39:2:39:21 | defer statement | stmts7.go:40:8:40:12 | panic | -| stmts7.go:39:8:39:19 | recoverPanic | stmts7.go:39:2:39:21 | defer statement | -| stmts7.go:39:8:39:21 | call to recoverPanic | stmts7.go:38:1:41:1 | exit | -| stmts7.go:40:2:40:30 | defer statement | stmts7.go:40:8:40:30 | call to panic | -| stmts7.go:40:8:40:12 | panic | stmts7.go:40:14:40:29 | "deferred panic" | -| stmts7.go:40:8:40:30 | call to panic | stmts7.go:39:8:39:21 | call to recoverPanic | -| stmts7.go:40:14:40:29 | "deferred panic" | stmts7.go:40:2:40:30 | defer statement | -| stmts7.go:43:1:45:1 | entry | stmts7.go:44:8:44:12 | panic | -| stmts7.go:43:1:45:1 | function declaration | stmts7.go:47:6:47:31 | skip | -| stmts7.go:43:6:43:23 | skip | stmts7.go:43:1:45:1 | function declaration | -| stmts7.go:44:2:44:36 | defer statement | stmts7.go:44:8:44:36 | call to panic | -| stmts7.go:44:8:44:12 | panic | stmts7.go:44:14:44:35 | "final deferred panic" | -| stmts7.go:44:8:44:36 | call to panic | stmts7.go:43:1:45:1 | exit | -| stmts7.go:44:14:44:35 | "final deferred panic" | stmts7.go:44:2:44:36 | defer statement | -| stmts7.go:47:1:50:1 | entry | stmts7.go:48:8:48:19 | recoverPanic | -| stmts7.go:47:1:50:1 | function declaration | stmts7.go:52:6:52:29 | skip | -| stmts7.go:47:6:47:31 | skip | stmts7.go:47:1:50:1 | function declaration | -| stmts7.go:48:2:48:21 | defer statement | stmts7.go:49:8:49:14 | selection of Exit | -| stmts7.go:48:8:48:19 | recoverPanic | stmts7.go:48:2:48:21 | defer statement | -| stmts7.go:48:8:48:21 | call to recoverPanic | stmts7.go:47:1:50:1 | exit | -| stmts7.go:49:2:49:17 | defer statement | stmts7.go:49:8:49:17 | call to Exit | -| stmts7.go:49:8:49:14 | selection of Exit | stmts7.go:49:16:49:16 | 1 | -| stmts7.go:49:8:49:17 | call to Exit | stmts7.go:48:8:48:21 | call to recoverPanic | -| stmts7.go:49:16:49:16 | 1 | stmts7.go:49:2:49:17 | defer statement | -| stmts7.go:52:1:55:1 | entry | stmts7.go:52:31:52:36 | values | -| stmts7.go:52:1:55:1 | function declaration | stmts7.go:0:0:0:0 | exit | -| stmts7.go:52:6:52:29 | skip | stmts7.go:52:1:55:1 | function declaration | -| stmts7.go:52:31:52:36 | values | stmts7.go:52:31:52:36 | values | +| stmts7.go:28:8:28:21 | After selection of fn | stmts7.go:28:8:28:23 | After call to fn | +| stmts7.go:28:8:28:21 | Before selection of fn | stmts7.go:28:8:28:18 | (...) | +| stmts7.go:28:8:28:21 | selection of fn | stmts7.go:28:8:28:21 | After selection of fn | +| stmts7.go:28:8:28:23 | After call to fn | stmts7.go:28:2:28:23 | defer statement | +| stmts7.go:28:8:28:23 | call to fn | stmts7.go:28:8:28:21 | Before selection of fn | +| stmts7.go:28:8:28:23 | defer-invoke call to fn | stmts7.go:27:8:27:20 | defer-invoke call to fn | +| stmts7.go:28:9:28:17 | &... | stmts7.go:28:9:28:17 | After &... | +| stmts7.go:28:9:28:17 | After &... | stmts7.go:28:8:28:18 | After (...) | +| stmts7.go:28:9:28:17 | Before &... | stmts7.go:28:10:28:17 | Before callback | +| stmts7.go:28:10:28:17 | After callback | stmts7.go:28:9:28:17 | &... | +| stmts7.go:28:10:28:17 | Before callback | stmts7.go:28:10:28:17 | callback | +| stmts7.go:28:10:28:17 | callback | stmts7.go:28:10:28:17 | After callback | +| stmts7.go:29:2:29:12 | After selection of Println | stmts7.go:29:14:29:30 | Before "print something" | +| stmts7.go:29:2:29:12 | Before selection of Println | stmts7.go:29:2:29:12 | selection of Println | +| stmts7.go:29:2:29:12 | selection of Println | stmts7.go:29:2:29:12 | After selection of Println | +| stmts7.go:29:2:29:31 | After call to Println | stmts7.go:29:2:29:31 | After expression statement | +| stmts7.go:29:2:29:31 | After expression statement | stmts7.go:30:2:30:13 | Before return statement | +| stmts7.go:29:2:29:31 | Before call to Println | stmts7.go:29:2:29:12 | Before selection of Println | +| stmts7.go:29:2:29:31 | call to Println | stmts7.go:28:8:28:23 | defer-invoke call to fn | +| stmts7.go:29:2:29:31 | call to Println | stmts7.go:29:2:29:31 | After call to Println | +| stmts7.go:29:2:29:31 | expression statement | stmts7.go:29:2:29:31 | Before call to Println | +| stmts7.go:29:14:29:30 | "print something" | stmts7.go:29:14:29:30 | After "print something" | +| stmts7.go:29:14:29:30 | After "print something" | stmts7.go:29:2:29:31 | call to Println | +| stmts7.go:29:14:29:30 | Before "print something" | stmts7.go:29:14:29:30 | "print something" | +| stmts7.go:30:2:30:13 | Before return statement | stmts7.go:30:9:30:13 | Before false | +| stmts7.go:30:2:30:13 | return statement | stmts7.go:28:8:28:23 | defer-invoke call to fn | +| stmts7.go:30:9:30:13 | After false | stmts7.go:30:2:30:13 | return statement | +| stmts7.go:30:9:30:13 | Before false | stmts7.go:30:9:30:13 | false | +| stmts7.go:30:9:30:13 | false | stmts7.go:30:9:30:13 | After false | +| stmts7.go:33:1:36:1 | After function declaration | stmts7.go:38:1:41:1 | Before function declaration | +| stmts7.go:33:1:36:1 | Before function declaration | stmts7.go:33:1:36:1 | function declaration | +| stmts7.go:33:1:36:1 | Entry | stmts7.go:33:24:36:1 | block statement | +| stmts7.go:33:1:36:1 | Exceptional Exit | stmts7.go:33:1:36:1 | Exit | +| stmts7.go:33:1:36:1 | function declaration | stmts7.go:33:1:36:1 | After function declaration | +| stmts7.go:33:24:36:1 | block statement | stmts7.go:34:2:34:21 | Before defer statement | +| stmts7.go:34:2:34:21 | After defer statement | stmts7.go:35:2:35:11 | expression statement | +| stmts7.go:34:2:34:21 | Before defer statement | stmts7.go:34:8:34:21 | call to recoverPanic | +| stmts7.go:34:2:34:21 | defer statement | stmts7.go:34:2:34:21 | After defer statement | +| stmts7.go:34:8:34:19 | After recoverPanic | stmts7.go:34:8:34:21 | After call to recoverPanic | +| stmts7.go:34:8:34:19 | Before recoverPanic | stmts7.go:34:8:34:19 | recoverPanic | +| stmts7.go:34:8:34:19 | recoverPanic | stmts7.go:34:8:34:19 | After recoverPanic | +| stmts7.go:34:8:34:21 | After call to recoverPanic | stmts7.go:34:2:34:21 | defer statement | +| stmts7.go:34:8:34:21 | call to recoverPanic | stmts7.go:34:8:34:19 | Before recoverPanic | +| stmts7.go:35:2:35:8 | After selection of Exit | stmts7.go:35:10:35:10 | Before 1 | +| stmts7.go:35:2:35:8 | Before selection of Exit | stmts7.go:35:2:35:8 | selection of Exit | +| stmts7.go:35:2:35:8 | selection of Exit | stmts7.go:35:2:35:8 | After selection of Exit | +| stmts7.go:35:2:35:11 | Before call to Exit | stmts7.go:35:2:35:8 | Before selection of Exit | +| stmts7.go:35:2:35:11 | call to Exit | stmts7.go:33:1:36:1 | Exceptional Exit | +| stmts7.go:35:2:35:11 | expression statement | stmts7.go:35:2:35:11 | Before call to Exit | +| stmts7.go:35:10:35:10 | 1 | stmts7.go:35:10:35:10 | After 1 | +| stmts7.go:35:10:35:10 | After 1 | stmts7.go:35:2:35:11 | call to Exit | +| stmts7.go:35:10:35:10 | Before 1 | stmts7.go:35:10:35:10 | 1 | +| stmts7.go:38:1:41:1 | After function declaration | stmts7.go:43:1:45:1 | Before function declaration | +| stmts7.go:38:1:41:1 | Before function declaration | stmts7.go:38:1:41:1 | function declaration | +| stmts7.go:38:1:41:1 | Entry | stmts7.go:38:22:41:1 | block statement | +| stmts7.go:38:1:41:1 | Exceptional Exit | stmts7.go:38:1:41:1 | Exit | +| stmts7.go:38:1:41:1 | Normal Exit | stmts7.go:38:1:41:1 | Exit | +| stmts7.go:38:1:41:1 | function declaration | stmts7.go:38:1:41:1 | After function declaration | +| stmts7.go:38:22:41:1 | After block statement | stmts7.go:40:8:40:30 | defer-invoke call to panic | +| stmts7.go:38:22:41:1 | block statement | stmts7.go:39:2:39:21 | Before defer statement | +| stmts7.go:39:2:39:21 | After defer statement | stmts7.go:40:2:40:30 | Before defer statement | +| stmts7.go:39:2:39:21 | Before defer statement | stmts7.go:39:8:39:21 | call to recoverPanic | +| stmts7.go:39:2:39:21 | defer statement | stmts7.go:39:2:39:21 | After defer statement | +| stmts7.go:39:8:39:19 | After recoverPanic | stmts7.go:39:8:39:21 | After call to recoverPanic | +| stmts7.go:39:8:39:19 | Before recoverPanic | stmts7.go:39:8:39:19 | recoverPanic | +| stmts7.go:39:8:39:19 | recoverPanic | stmts7.go:39:8:39:19 | After recoverPanic | +| stmts7.go:39:8:39:21 | After call to recoverPanic | stmts7.go:39:2:39:21 | defer statement | +| stmts7.go:39:8:39:21 | call to recoverPanic | stmts7.go:39:8:39:19 | Before recoverPanic | +| stmts7.go:39:8:39:21 | defer-invoke call to recoverPanic | stmts7.go:38:1:41:1 | Exceptional Exit | +| stmts7.go:39:8:39:21 | defer-invoke call to recoverPanic | stmts7.go:38:1:41:1 | Normal Exit | +| stmts7.go:40:2:40:30 | After defer statement | stmts7.go:38:22:41:1 | After block statement | +| stmts7.go:40:2:40:30 | Before defer statement | stmts7.go:40:8:40:30 | call to panic | +| stmts7.go:40:2:40:30 | defer statement | stmts7.go:40:2:40:30 | After defer statement | +| stmts7.go:40:8:40:12 | After panic | stmts7.go:40:14:40:29 | Before "deferred panic" | +| stmts7.go:40:8:40:12 | Before panic | stmts7.go:40:8:40:12 | panic | +| stmts7.go:40:8:40:12 | panic | stmts7.go:40:8:40:12 | After panic | +| stmts7.go:40:8:40:30 | After call to panic | stmts7.go:40:2:40:30 | defer statement | +| stmts7.go:40:8:40:30 | call to panic | stmts7.go:40:8:40:12 | Before panic | +| stmts7.go:40:8:40:30 | defer-invoke call to panic | stmts7.go:39:8:39:21 | defer-invoke call to recoverPanic | +| stmts7.go:40:14:40:29 | "deferred panic" | stmts7.go:40:14:40:29 | After "deferred panic" | +| stmts7.go:40:14:40:29 | After "deferred panic" | stmts7.go:40:8:40:30 | After call to panic | +| stmts7.go:40:14:40:29 | Before "deferred panic" | stmts7.go:40:14:40:29 | "deferred panic" | +| stmts7.go:43:1:45:1 | After function declaration | stmts7.go:47:1:50:1 | Before function declaration | +| stmts7.go:43:1:45:1 | Before function declaration | stmts7.go:43:1:45:1 | function declaration | +| stmts7.go:43:1:45:1 | Entry | stmts7.go:43:27:45:1 | block statement | +| stmts7.go:43:1:45:1 | Exceptional Exit | stmts7.go:43:1:45:1 | Exit | +| stmts7.go:43:1:45:1 | function declaration | stmts7.go:43:1:45:1 | After function declaration | +| stmts7.go:43:27:45:1 | After block statement | stmts7.go:44:8:44:36 | defer-invoke call to panic | +| stmts7.go:43:27:45:1 | block statement | stmts7.go:44:2:44:36 | Before defer statement | +| stmts7.go:44:2:44:36 | After defer statement | stmts7.go:43:27:45:1 | After block statement | +| stmts7.go:44:2:44:36 | Before defer statement | stmts7.go:44:8:44:36 | call to panic | +| stmts7.go:44:2:44:36 | defer statement | stmts7.go:44:2:44:36 | After defer statement | +| stmts7.go:44:8:44:12 | After panic | stmts7.go:44:14:44:35 | Before "final deferred panic" | +| stmts7.go:44:8:44:12 | Before panic | stmts7.go:44:8:44:12 | panic | +| stmts7.go:44:8:44:12 | panic | stmts7.go:44:8:44:12 | After panic | +| stmts7.go:44:8:44:36 | After call to panic | stmts7.go:44:2:44:36 | defer statement | +| stmts7.go:44:8:44:36 | call to panic | stmts7.go:44:8:44:12 | Before panic | +| stmts7.go:44:8:44:36 | defer-invoke call to panic | stmts7.go:43:1:45:1 | Exceptional Exit | +| stmts7.go:44:14:44:35 | "final deferred panic" | stmts7.go:44:14:44:35 | After "final deferred panic" | +| stmts7.go:44:14:44:35 | After "final deferred panic" | stmts7.go:44:8:44:36 | After call to panic | +| stmts7.go:44:14:44:35 | Before "final deferred panic" | stmts7.go:44:14:44:35 | "final deferred panic" | +| stmts7.go:47:1:50:1 | After function declaration | stmts7.go:52:1:55:1 | Before function declaration | +| stmts7.go:47:1:50:1 | Before function declaration | stmts7.go:47:1:50:1 | function declaration | +| stmts7.go:47:1:50:1 | Entry | stmts7.go:47:35:50:1 | block statement | +| stmts7.go:47:1:50:1 | Exceptional Exit | stmts7.go:47:1:50:1 | Exit | +| stmts7.go:47:1:50:1 | function declaration | stmts7.go:47:1:50:1 | After function declaration | +| stmts7.go:47:35:50:1 | After block statement | stmts7.go:49:8:49:17 | defer-invoke call to Exit | +| stmts7.go:47:35:50:1 | block statement | stmts7.go:48:2:48:21 | Before defer statement | +| stmts7.go:48:2:48:21 | After defer statement | stmts7.go:49:2:49:17 | Before defer statement | +| stmts7.go:48:2:48:21 | Before defer statement | stmts7.go:48:8:48:21 | call to recoverPanic | +| stmts7.go:48:2:48:21 | defer statement | stmts7.go:48:2:48:21 | After defer statement | +| stmts7.go:48:8:48:19 | After recoverPanic | stmts7.go:48:8:48:21 | After call to recoverPanic | +| stmts7.go:48:8:48:19 | Before recoverPanic | stmts7.go:48:8:48:19 | recoverPanic | +| stmts7.go:48:8:48:19 | recoverPanic | stmts7.go:48:8:48:19 | After recoverPanic | +| stmts7.go:48:8:48:21 | After call to recoverPanic | stmts7.go:48:2:48:21 | defer statement | +| stmts7.go:48:8:48:21 | call to recoverPanic | stmts7.go:48:8:48:19 | Before recoverPanic | +| stmts7.go:49:2:49:17 | After defer statement | stmts7.go:47:35:50:1 | After block statement | +| stmts7.go:49:2:49:17 | Before defer statement | stmts7.go:49:8:49:17 | call to Exit | +| stmts7.go:49:2:49:17 | defer statement | stmts7.go:49:2:49:17 | After defer statement | +| stmts7.go:49:8:49:14 | After selection of Exit | stmts7.go:49:16:49:16 | Before 1 | +| stmts7.go:49:8:49:14 | Before selection of Exit | stmts7.go:49:8:49:14 | selection of Exit | +| stmts7.go:49:8:49:14 | selection of Exit | stmts7.go:49:8:49:14 | After selection of Exit | +| stmts7.go:49:8:49:17 | After call to Exit | stmts7.go:49:2:49:17 | defer statement | +| stmts7.go:49:8:49:17 | call to Exit | stmts7.go:49:8:49:14 | Before selection of Exit | +| stmts7.go:49:8:49:17 | defer-invoke call to Exit | stmts7.go:47:1:50:1 | Exceptional Exit | +| stmts7.go:49:16:49:16 | 1 | stmts7.go:49:16:49:16 | After 1 | +| stmts7.go:49:16:49:16 | After 1 | stmts7.go:49:8:49:17 | After call to Exit | +| stmts7.go:49:16:49:16 | Before 1 | stmts7.go:49:16:49:16 | 1 | +| stmts7.go:52:1:55:1 | After function declaration | stmts7.go:0:0:0:0 | After stmts7.go | +| stmts7.go:52:1:55:1 | Before function declaration | stmts7.go:52:1:55:1 | function declaration | +| stmts7.go:52:1:55:1 | Entry | stmts7.go:52:31:52:36 | values | +| stmts7.go:52:1:55:1 | Exceptional Exit | stmts7.go:52:1:55:1 | Exit | +| stmts7.go:52:1:55:1 | Normal Exit | stmts7.go:52:1:55:1 | Exit | +| stmts7.go:52:1:55:1 | function declaration | stmts7.go:52:1:55:1 | After function declaration | | stmts7.go:52:31:52:36 | values | stmts7.go:52:45:52:49 | index | -| stmts7.go:52:45:52:49 | index | stmts7.go:52:45:52:49 | index | -| stmts7.go:52:45:52:49 | index | stmts7.go:53:8:53:19 | recoverPanic | -| stmts7.go:53:2:53:21 | defer statement | stmts7.go:54:2:54:2 | skip | -| stmts7.go:53:8:53:19 | recoverPanic | stmts7.go:53:2:53:21 | defer statement | -| stmts7.go:53:8:53:21 | call to recoverPanic | stmts7.go:52:1:55:1 | exit | -| stmts7.go:54:2:54:2 | skip | stmts7.go:54:6:54:11 | values | -| stmts7.go:54:6:54:11 | values | stmts7.go:54:13:54:17 | index | -| stmts7.go:54:6:54:18 | index expression | stmts7.go:53:8:53:21 | call to recoverPanic | -| stmts7.go:54:13:54:17 | index | stmts7.go:54:6:54:18 | index expression | -| stmts8.go:0:0:0:0 | entry | stmts8.go:3:6:3:11 | skip | -| stmts8.go:3:1:7:1 | entry | stmts8.go:3:13:3:13 | x | -| stmts8.go:3:1:7:1 | function declaration | stmts8.go:9:6:9:12 | skip | -| stmts8.go:3:6:3:11 | skip | stmts8.go:3:1:7:1 | function declaration | -| stmts8.go:3:13:3:13 | x | stmts8.go:3:13:3:13 | x | -| stmts8.go:3:13:3:13 | x | stmts8.go:4:2:4:2 | skip | -| stmts8.go:4:2:4:2 | skip | stmts8.go:4:7:4:7 | x | -| stmts8.go:4:2:4:12 | assign:0 ... := ... | stmts8.go:5:2:5:2 | skip | -| stmts8.go:4:7:4:7 | x | stmts8.go:4:12:4:12 | 5 | -| stmts8.go:4:7:4:12 | ...>>... | stmts8.go:4:2:4:12 | assign:0 ... := ... | -| stmts8.go:4:12:4:12 | 5 | stmts8.go:4:7:4:12 | ...>>... | -| stmts8.go:5:2:5:2 | skip | stmts8.go:5:7:5:7 | x | -| stmts8.go:5:2:5:13 | assign:0 ... := ... | stmts8.go:6:9:6:9 | z | -| stmts8.go:5:7:5:7 | x | stmts8.go:5:12:5:12 | 1 | -| stmts8.go:5:7:5:13 | ...%... | stmts8.go:5:2:5:13 | assign:0 ... := ... | -| stmts8.go:5:12:5:12 | 1 | stmts8.go:5:7:5:13 | ...%... | -| stmts8.go:6:2:6:17 | return statement | stmts8.go:3:1:7:1 | exit | -| stmts8.go:6:9:6:9 | z | stmts8.go:6:12:6:12 | y | -| stmts8.go:6:12:6:12 | y | stmts8.go:6:16:6:17 | 13 | -| stmts8.go:6:12:6:17 | ...%... | stmts8.go:6:2:6:17 | return statement | -| stmts8.go:6:16:6:17 | 13 | stmts8.go:6:12:6:17 | ...%... | -| stmts8.go:9:1:14:1 | entry | stmts8.go:10:5:10:9 | linux | -| stmts8.go:9:1:14:1 | function declaration | stmts8.go:0:0:0:0 | exit | -| stmts8.go:9:6:9:12 | skip | stmts8.go:9:1:14:1 | function declaration | -| stmts8.go:10:5:10:9 | linux | stmts8.go:10:5:10:9 | linux is false | -| stmts8.go:10:5:10:9 | linux | stmts8.go:10:5:10:9 | linux is true | -| stmts8.go:10:5:10:9 | linux is false | stmts8.go:13:9:13:13 | false | -| stmts8.go:10:5:10:9 | linux is true | stmts8.go:11:10:11:13 | true | -| stmts8.go:11:3:11:13 | return statement | stmts8.go:9:1:14:1 | exit | -| stmts8.go:11:10:11:13 | true | stmts8.go:11:3:11:13 | return statement | -| stmts8.go:13:2:13:13 | return statement | stmts8.go:9:1:14:1 | exit | -| stmts8.go:13:9:13:13 | false | stmts8.go:13:2:13:13 | return statement | -| stmts.go:0:0:0:0 | entry | stmts.go:3:1:3:12 | skip | -| stmts.go:3:1:3:12 | skip | stmts.go:10:6:10:10 | skip | -| stmts.go:10:1:43:1 | entry | stmts.go:10:12:10:12 | b | -| stmts.go:10:1:43:1 | function declaration | stmts.go:46:6:46:10 | skip | -| stmts.go:10:6:10:10 | skip | stmts.go:10:1:43:1 | function declaration | -| stmts.go:10:12:10:12 | b | stmts.go:10:12:10:12 | b | -| stmts.go:10:12:10:12 | b | stmts.go:12:7:12:7 | b | -| stmts.go:12:6:12:7 | !... | stmts.go:12:6:12:7 | !... is false | -| stmts.go:12:6:12:7 | !... | stmts.go:12:6:12:7 | !... is true | -| stmts.go:12:6:12:7 | !... is false | stmts.go:15:3:16:3 | skip | -| stmts.go:12:6:12:7 | !... is true | stmts.go:13:4:13:13 | skip | -| stmts.go:12:7:12:7 | b | stmts.go:12:6:12:7 | !... | -| stmts.go:13:4:13:13 | skip | stmts.go:23:6:23:9 | true | -| stmts.go:15:3:16:3 | skip | stmts.go:17:3:17:3 | skip | -| stmts.go:17:3:17:3 | skip | stmts.go:20:2:20:12 | selection of Println | -| stmts.go:20:2:20:12 | selection of Println | stmts.go:20:14:20:17 | "Hi" | -| stmts.go:20:2:20:18 | call to Println | stmts.go:10:1:43:1 | exit | -| stmts.go:20:2:20:18 | call to Println | stmts.go:23:6:23:9 | true | -| stmts.go:20:14:20:17 | "Hi" | stmts.go:20:2:20:18 | call to Println | -| stmts.go:23:6:23:9 | true | stmts.go:23:6:23:9 | true is true | -| stmts.go:23:6:23:9 | true is false | stmts.go:39:2:39:2 | skip | -| stmts.go:23:6:23:9 | true is true | stmts.go:24:7:24:7 | skip | -| stmts.go:24:7:24:7 | skip | stmts.go:24:12:24:12 | 0 | -| stmts.go:24:7:24:12 | assign:0 ... := ... | stmts.go:24:15:24:15 | i | -| stmts.go:24:12:24:12 | 0 | stmts.go:24:7:24:12 | assign:0 ... := ... | -| stmts.go:24:15:24:15 | i | stmts.go:24:19:24:20 | 10 | -| stmts.go:24:15:24:20 | ...<... | stmts.go:24:15:24:20 | ...<... is false | -| stmts.go:24:15:24:20 | ...<... | stmts.go:24:15:24:20 | ...<... is true | -| stmts.go:24:15:24:20 | ...<... is false | stmts.go:23:6:23:9 | true | -| stmts.go:24:15:24:20 | ...<... is true | stmts.go:25:7:25:7 | skip | -| stmts.go:24:19:24:20 | 10 | stmts.go:24:15:24:20 | ...<... | -| stmts.go:24:23:24:23 | i | stmts.go:24:23:24:25 | 1 | -| stmts.go:24:23:24:25 | 1 | stmts.go:24:23:24:25 | incdec-rhs increment statement | +| stmts7.go:52:45:52:49 | index | stmts7.go:52:56:55:1 | block statement | +| stmts7.go:52:56:55:1 | After block statement | stmts7.go:53:8:53:21 | defer-invoke call to recoverPanic | +| stmts7.go:52:56:55:1 | block statement | stmts7.go:53:2:53:21 | Before defer statement | +| stmts7.go:53:2:53:21 | After defer statement | stmts7.go:54:2:54:18 | ... = ... | +| stmts7.go:53:2:53:21 | Before defer statement | stmts7.go:53:8:53:21 | call to recoverPanic | +| stmts7.go:53:2:53:21 | defer statement | stmts7.go:53:2:53:21 | After defer statement | +| stmts7.go:53:8:53:19 | After recoverPanic | stmts7.go:53:8:53:21 | After call to recoverPanic | +| stmts7.go:53:8:53:19 | Before recoverPanic | stmts7.go:53:8:53:19 | recoverPanic | +| stmts7.go:53:8:53:19 | recoverPanic | stmts7.go:53:8:53:19 | After recoverPanic | +| stmts7.go:53:8:53:21 | After call to recoverPanic | stmts7.go:53:2:53:21 | defer statement | +| stmts7.go:53:8:53:21 | call to recoverPanic | stmts7.go:53:8:53:19 | Before recoverPanic | +| stmts7.go:53:8:53:21 | defer-invoke call to recoverPanic | stmts7.go:52:1:55:1 | Exceptional Exit | +| stmts7.go:53:8:53:21 | defer-invoke call to recoverPanic | stmts7.go:52:1:55:1 | Normal Exit | +| stmts7.go:54:2:54:18 | ... = ... | stmts7.go:54:6:54:18 | Before index expression | +| stmts7.go:54:2:54:18 | After ... = ... | stmts7.go:52:56:55:1 | After block statement | +| stmts7.go:54:6:54:11 | After values | stmts7.go:54:13:54:17 | Before index | +| stmts7.go:54:6:54:11 | Before values | stmts7.go:54:6:54:11 | values | +| stmts7.go:54:6:54:11 | values | stmts7.go:54:6:54:11 | After values | +| stmts7.go:54:6:54:18 | After index expression | stmts7.go:54:2:54:18 | After ... = ... | +| stmts7.go:54:6:54:18 | Before index expression | stmts7.go:54:6:54:11 | Before values | +| stmts7.go:54:6:54:18 | index expression | stmts7.go:53:8:53:21 | defer-invoke call to recoverPanic | +| stmts7.go:54:6:54:18 | index expression | stmts7.go:54:6:54:18 | After index expression | +| stmts7.go:54:13:54:17 | After index | stmts7.go:54:6:54:18 | index expression | +| stmts7.go:54:13:54:17 | Before index | stmts7.go:54:13:54:17 | index | +| stmts7.go:54:13:54:17 | index | stmts7.go:54:13:54:17 | After index | +| stmts8.go:0:0:0:0 | After stmts8.go | stmts8.go:0:0:0:0 | Normal Exit | +| stmts8.go:0:0:0:0 | Entry | stmts8.go:0:0:0:0 | stmts8.go | +| stmts8.go:0:0:0:0 | Normal Exit | stmts8.go:0:0:0:0 | Exit | +| stmts8.go:0:0:0:0 | stmts8.go | stmts8.go:3:1:7:1 | Before function declaration | +| stmts8.go:3:1:7:1 | After function declaration | stmts8.go:9:1:14:1 | Before function declaration | +| stmts8.go:3:1:7:1 | Before function declaration | stmts8.go:3:1:7:1 | function declaration | +| stmts8.go:3:1:7:1 | Entry | stmts8.go:3:13:3:13 | x | +| stmts8.go:3:1:7:1 | Normal Exit | stmts8.go:3:1:7:1 | Exit | +| stmts8.go:3:1:7:1 | function declaration | stmts8.go:3:1:7:1 | After function declaration | +| stmts8.go:3:13:3:13 | x | stmts8.go:3:31:7:1 | block statement | +| stmts8.go:3:31:7:1 | block statement | stmts8.go:4:2:4:12 | ... := ... | +| stmts8.go:4:2:4:12 | ... := ... | stmts8.go:4:7:4:12 | Before ...>>... | +| stmts8.go:4:2:4:12 | After ... := ... | stmts8.go:5:2:5:13 | ... := ... | +| stmts8.go:4:2:4:12 | assign:0 ... := ... | stmts8.go:4:2:4:12 | After ... := ... | +| stmts8.go:4:7:4:7 | After x | stmts8.go:4:12:4:12 | Before 5 | +| stmts8.go:4:7:4:7 | Before x | stmts8.go:4:7:4:7 | x | +| stmts8.go:4:7:4:7 | x | stmts8.go:4:7:4:7 | After x | +| stmts8.go:4:7:4:12 | ...>>... | stmts8.go:4:7:4:12 | After ...>>... | +| stmts8.go:4:7:4:12 | After ...>>... | stmts8.go:4:2:4:12 | assign:0 ... := ... | +| stmts8.go:4:7:4:12 | Before ...>>... | stmts8.go:4:7:4:7 | Before x | +| stmts8.go:4:12:4:12 | 5 | stmts8.go:4:12:4:12 | After 5 | +| stmts8.go:4:12:4:12 | After 5 | stmts8.go:4:7:4:12 | ...>>... | +| stmts8.go:4:12:4:12 | Before 5 | stmts8.go:4:12:4:12 | 5 | +| stmts8.go:5:2:5:13 | ... := ... | stmts8.go:5:7:5:13 | Before ...%... | +| stmts8.go:5:2:5:13 | After ... := ... | stmts8.go:6:2:6:17 | Before return statement | +| stmts8.go:5:2:5:13 | assign:0 ... := ... | stmts8.go:5:2:5:13 | After ... := ... | +| stmts8.go:5:7:5:7 | After x | stmts8.go:5:11:5:13 | (...) | +| stmts8.go:5:7:5:7 | Before x | stmts8.go:5:7:5:7 | x | +| stmts8.go:5:7:5:7 | x | stmts8.go:5:7:5:7 | After x | +| stmts8.go:5:7:5:13 | ...%... | stmts8.go:5:7:5:13 | After ...%... | +| stmts8.go:5:7:5:13 | After ...%... | stmts8.go:5:2:5:13 | assign:0 ... := ... | +| stmts8.go:5:7:5:13 | Before ...%... | stmts8.go:5:7:5:7 | Before x | +| stmts8.go:5:11:5:13 | (...) | stmts8.go:5:12:5:12 | Before 1 | +| stmts8.go:5:11:5:13 | After (...) | stmts8.go:5:7:5:13 | ...%... | +| stmts8.go:5:12:5:12 | 1 | stmts8.go:5:12:5:12 | After 1 | +| stmts8.go:5:12:5:12 | After 1 | stmts8.go:5:11:5:13 | After (...) | +| stmts8.go:5:12:5:12 | Before 1 | stmts8.go:5:12:5:12 | 1 | +| stmts8.go:6:2:6:17 | Before return statement | stmts8.go:6:9:6:9 | Before z | +| stmts8.go:6:2:6:17 | return statement | stmts8.go:3:1:7:1 | Normal Exit | +| stmts8.go:6:9:6:9 | After z | stmts8.go:6:12:6:17 | Before ...%... | +| stmts8.go:6:9:6:9 | Before z | stmts8.go:6:9:6:9 | z | +| stmts8.go:6:9:6:9 | z | stmts8.go:6:9:6:9 | After z | +| stmts8.go:6:12:6:12 | After y | stmts8.go:6:16:6:17 | Before 13 | +| stmts8.go:6:12:6:12 | Before y | stmts8.go:6:12:6:12 | y | +| stmts8.go:6:12:6:12 | y | stmts8.go:6:12:6:12 | After y | +| stmts8.go:6:12:6:17 | ...%... | stmts8.go:6:12:6:17 | After ...%... | +| stmts8.go:6:12:6:17 | After ...%... | stmts8.go:6:2:6:17 | return statement | +| stmts8.go:6:12:6:17 | Before ...%... | stmts8.go:6:12:6:12 | Before y | +| stmts8.go:6:16:6:17 | 13 | stmts8.go:6:16:6:17 | After 13 | +| stmts8.go:6:16:6:17 | After 13 | stmts8.go:6:12:6:17 | ...%... | +| stmts8.go:6:16:6:17 | Before 13 | stmts8.go:6:16:6:17 | 13 | +| stmts8.go:9:1:14:1 | After function declaration | stmts8.go:0:0:0:0 | After stmts8.go | +| stmts8.go:9:1:14:1 | Before function declaration | stmts8.go:9:1:14:1 | function declaration | +| stmts8.go:9:1:14:1 | Entry | stmts8.go:9:21:14:1 | block statement | +| stmts8.go:9:1:14:1 | Normal Exit | stmts8.go:9:1:14:1 | Exit | +| stmts8.go:9:1:14:1 | function declaration | stmts8.go:9:1:14:1 | After function declaration | +| stmts8.go:9:21:14:1 | block statement | stmts8.go:10:2:12:2 | if statement | +| stmts8.go:10:2:12:2 | After if statement | stmts8.go:13:2:13:13 | Before return statement | +| stmts8.go:10:2:12:2 | if statement | stmts8.go:10:5:10:9 | Before linux | +| stmts8.go:10:5:10:9 | After linux [false] | stmts8.go:10:2:12:2 | After if statement | +| stmts8.go:10:5:10:9 | After linux [true] | stmts8.go:10:11:12:2 | block statement | +| stmts8.go:10:5:10:9 | Before linux | stmts8.go:10:5:10:9 | linux | +| stmts8.go:10:5:10:9 | linux | stmts8.go:10:5:10:9 | After linux [false] | +| stmts8.go:10:5:10:9 | linux | stmts8.go:10:5:10:9 | After linux [true] | +| stmts8.go:10:11:12:2 | block statement | stmts8.go:11:3:11:13 | Before return statement | +| stmts8.go:11:3:11:13 | Before return statement | stmts8.go:11:10:11:13 | Before true | +| stmts8.go:11:3:11:13 | return statement | stmts8.go:9:1:14:1 | Normal Exit | +| stmts8.go:11:10:11:13 | After true | stmts8.go:11:3:11:13 | return statement | +| stmts8.go:11:10:11:13 | Before true | stmts8.go:11:10:11:13 | true | +| stmts8.go:11:10:11:13 | true | stmts8.go:11:10:11:13 | After true | +| stmts8.go:13:2:13:13 | Before return statement | stmts8.go:13:9:13:13 | Before false | +| stmts8.go:13:2:13:13 | return statement | stmts8.go:9:1:14:1 | Normal Exit | +| stmts8.go:13:9:13:13 | After false | stmts8.go:13:2:13:13 | return statement | +| stmts8.go:13:9:13:13 | Before false | stmts8.go:13:9:13:13 | false | +| stmts8.go:13:9:13:13 | false | stmts8.go:13:9:13:13 | After false | +| stmts.go:0:0:0:0 | After stmts.go | stmts.go:0:0:0:0 | Normal Exit | +| stmts.go:0:0:0:0 | Entry | stmts.go:0:0:0:0 | stmts.go | +| stmts.go:0:0:0:0 | Normal Exit | stmts.go:0:0:0:0 | Exit | +| stmts.go:0:0:0:0 | stmts.go | stmts.go:3:1:3:12 | import declaration | +| stmts.go:3:1:3:12 | After import declaration | stmts.go:10:1:43:1 | Before function declaration | +| stmts.go:3:1:3:12 | import declaration | stmts.go:3:8:3:12 | import specifier | +| stmts.go:3:8:3:12 | import specifier | stmts.go:3:1:3:12 | After import declaration | +| stmts.go:10:1:43:1 | After function declaration | stmts.go:46:1:62:1 | Before function declaration | +| stmts.go:10:1:43:1 | Before function declaration | stmts.go:10:1:43:1 | function declaration | +| stmts.go:10:1:43:1 | Entry | stmts.go:10:12:10:12 | b | +| stmts.go:10:1:43:1 | Exceptional Exit | stmts.go:10:1:43:1 | Exit | +| stmts.go:10:1:43:1 | function declaration | stmts.go:10:1:43:1 | After function declaration | +| stmts.go:10:12:10:12 | b | stmts.go:10:20:43:1 | block statement | +| stmts.go:10:20:43:1 | block statement | stmts.go:11:2:18:2 | block statement | +| stmts.go:11:2:18:2 | After block statement | stmts.go:20:2:20:18 | expression statement | +| stmts.go:11:2:18:2 | block statement | stmts.go:12:3:14:3 | if statement | +| stmts.go:12:3:14:3 | After if statement | stmts.go:15:3:16:3 | block statement | +| stmts.go:12:3:14:3 | if statement | stmts.go:12:6:12:7 | !... | +| stmts.go:12:6:12:7 | !... | stmts.go:12:7:12:7 | Before b | +| stmts.go:12:6:12:7 | After !... [false] | stmts.go:12:3:14:3 | After if statement | +| stmts.go:12:6:12:7 | After !... [true] | stmts.go:12:9:14:3 | block statement | +| stmts.go:12:7:12:7 | After b [false] | stmts.go:12:6:12:7 | After !... [true] | +| stmts.go:12:7:12:7 | After b [true] | stmts.go:12:6:12:7 | After !... [false] | +| stmts.go:12:7:12:7 | Before b | stmts.go:12:7:12:7 | b | +| stmts.go:12:7:12:7 | b | stmts.go:12:7:12:7 | After b [false] | +| stmts.go:12:7:12:7 | b | stmts.go:12:7:12:7 | After b [true] | +| stmts.go:12:9:14:3 | block statement | stmts.go:13:4:13:13 | Before goto statement | +| stmts.go:13:4:13:13 | Before goto statement | stmts.go:13:4:13:13 | goto statement | +| stmts.go:13:4:13:13 | goto statement | stmts.go:22:1:37:2 | labeled statement | +| stmts.go:15:3:16:3 | block statement | stmts.go:17:3:17:3 | empty statement | +| stmts.go:17:3:17:3 | empty statement | stmts.go:11:2:18:2 | After block statement | +| stmts.go:20:2:20:12 | After selection of Println | stmts.go:20:14:20:17 | Before "Hi" | +| stmts.go:20:2:20:12 | Before selection of Println | stmts.go:20:2:20:12 | selection of Println | +| stmts.go:20:2:20:12 | selection of Println | stmts.go:20:2:20:12 | After selection of Println | +| stmts.go:20:2:20:18 | After call to Println | stmts.go:20:2:20:18 | After expression statement | +| stmts.go:20:2:20:18 | After expression statement | stmts.go:22:1:37:2 | labeled statement | +| stmts.go:20:2:20:18 | Before call to Println | stmts.go:20:2:20:12 | Before selection of Println | +| stmts.go:20:2:20:18 | call to Println | stmts.go:10:1:43:1 | Exceptional Exit | +| stmts.go:20:2:20:18 | call to Println | stmts.go:20:2:20:18 | After call to Println | +| stmts.go:20:2:20:18 | expression statement | stmts.go:20:2:20:18 | Before call to Println | +| stmts.go:20:14:20:17 | "Hi" | stmts.go:20:14:20:17 | After "Hi" | +| stmts.go:20:14:20:17 | After "Hi" | stmts.go:20:2:20:18 | call to Println | +| stmts.go:20:14:20:17 | Before "Hi" | stmts.go:20:14:20:17 | "Hi" | +| stmts.go:22:1:37:2 | After labeled statement | stmts.go:39:2:39:7 | ... := ... | +| stmts.go:22:1:37:2 | labeled statement | stmts.go:23:2:37:2 | for statement | +| stmts.go:23:2:37:2 | After for statement | stmts.go:22:1:37:2 | After labeled statement | +| stmts.go:23:2:37:2 | [LoopHeader] for statement | stmts.go:23:6:23:9 | Before true | +| stmts.go:23:2:37:2 | for statement | stmts.go:23:6:23:9 | Before true | +| stmts.go:23:6:23:9 | After true [true] | stmts.go:23:11:37:2 | block statement | +| stmts.go:23:6:23:9 | Before true | stmts.go:23:6:23:9 | true | +| stmts.go:23:6:23:9 | true | stmts.go:23:6:23:9 | After true [true] | +| stmts.go:23:11:37:2 | After block statement | stmts.go:23:2:37:2 | [LoopHeader] for statement | +| stmts.go:23:11:37:2 | block statement | stmts.go:24:3:36:3 | for statement | +| stmts.go:24:3:36:3 | After for statement | stmts.go:23:11:37:2 | After block statement | +| stmts.go:24:3:36:3 | [LoopHeader] for statement | stmts.go:24:23:24:25 | Before increment statement | +| stmts.go:24:3:36:3 | for statement | stmts.go:24:7:24:12 | ... := ... | +| stmts.go:24:7:24:12 | ... := ... | stmts.go:24:12:24:12 | Before 0 | +| stmts.go:24:7:24:12 | After ... := ... | stmts.go:24:15:24:20 | Before ...<... | +| stmts.go:24:7:24:12 | assign:0 ... := ... | stmts.go:24:7:24:12 | After ... := ... | +| stmts.go:24:12:24:12 | 0 | stmts.go:24:12:24:12 | After 0 | +| stmts.go:24:12:24:12 | After 0 | stmts.go:24:7:24:12 | assign:0 ... := ... | +| stmts.go:24:12:24:12 | Before 0 | stmts.go:24:12:24:12 | 0 | +| stmts.go:24:15:24:15 | After i | stmts.go:24:19:24:20 | Before 10 | +| stmts.go:24:15:24:15 | Before i | stmts.go:24:15:24:15 | i | +| stmts.go:24:15:24:15 | i | stmts.go:24:15:24:15 | After i | +| stmts.go:24:15:24:20 | ...<... | stmts.go:24:15:24:20 | After ...<... [false] | +| stmts.go:24:15:24:20 | ...<... | stmts.go:24:15:24:20 | After ...<... [true] | +| stmts.go:24:15:24:20 | After ...<... [false] | stmts.go:24:3:36:3 | After for statement | +| stmts.go:24:15:24:20 | After ...<... [true] | stmts.go:24:27:36:3 | block statement | +| stmts.go:24:15:24:20 | Before ...<... | stmts.go:24:15:24:15 | Before i | +| stmts.go:24:19:24:20 | 10 | stmts.go:24:19:24:20 | After 10 | +| stmts.go:24:19:24:20 | After 10 | stmts.go:24:15:24:20 | ...<... | +| stmts.go:24:19:24:20 | Before 10 | stmts.go:24:19:24:20 | 10 | +| stmts.go:24:23:24:23 | After i | stmts.go:24:23:24:25 | implicit-one increment statement | +| stmts.go:24:23:24:23 | Before i | stmts.go:24:23:24:23 | i | +| stmts.go:24:23:24:23 | i | stmts.go:24:23:24:23 | After i | +| stmts.go:24:23:24:25 | After increment statement | stmts.go:24:15:24:20 | Before ...<... | +| stmts.go:24:23:24:25 | Before increment statement | stmts.go:24:23:24:23 | Before i | +| stmts.go:24:23:24:25 | implicit-one increment statement | stmts.go:24:23:24:25 | incdec-rhs increment statement | | stmts.go:24:23:24:25 | incdec-rhs increment statement | stmts.go:24:23:24:25 | increment statement | -| stmts.go:24:23:24:25 | increment statement | stmts.go:24:15:24:15 | i | -| stmts.go:25:7:25:7 | skip | stmts.go:25:12:25:12 | i | -| stmts.go:25:7:25:16 | assign:0 ... := ... | stmts.go:25:19:25:19 | j | -| stmts.go:25:12:25:12 | i | stmts.go:25:16:25:16 | 1 | -| stmts.go:25:12:25:16 | ...-... | stmts.go:25:7:25:16 | assign:0 ... := ... | -| stmts.go:25:16:25:16 | 1 | stmts.go:25:12:25:16 | ...-... | -| stmts.go:25:19:25:19 | j | stmts.go:25:23:25:23 | 5 | -| stmts.go:25:19:25:23 | ...>... | stmts.go:25:19:25:23 | ...>... is false | -| stmts.go:25:19:25:23 | ...>... | stmts.go:25:19:25:23 | ...>... is true | -| stmts.go:25:19:25:23 | ...>... is false | stmts.go:27:14:27:14 | i | -| stmts.go:25:19:25:23 | ...>... is true | stmts.go:26:5:26:15 | skip | -| stmts.go:25:23:25:23 | 5 | stmts.go:25:19:25:23 | ...>... | -| stmts.go:26:5:26:15 | skip | stmts.go:39:2:39:2 | skip | -| stmts.go:27:14:27:14 | i | stmts.go:27:18:27:18 | 3 | -| stmts.go:27:14:27:18 | ...<... | stmts.go:27:14:27:18 | ...<... is false | -| stmts.go:27:14:27:18 | ...<... | stmts.go:27:14:27:18 | ...<... is true | -| stmts.go:27:14:27:18 | ...<... is false | stmts.go:29:14:29:14 | i | -| stmts.go:27:14:27:18 | ...<... is true | stmts.go:28:5:28:9 | skip | -| stmts.go:27:18:27:18 | 3 | stmts.go:27:14:27:18 | ...<... | -| stmts.go:28:5:28:9 | skip | stmts.go:23:6:23:9 | true | -| stmts.go:29:14:29:14 | i | stmts.go:29:19:29:19 | 9 | -| stmts.go:29:14:29:19 | ...!=... | stmts.go:29:14:29:19 | ...!=... is false | -| stmts.go:29:14:29:19 | ...!=... | stmts.go:29:14:29:19 | ...!=... is true | -| stmts.go:29:14:29:19 | ...!=... is false | stmts.go:31:14:31:14 | i | -| stmts.go:29:14:29:19 | ...!=... is true | stmts.go:30:5:30:18 | skip | -| stmts.go:29:19:29:19 | 9 | stmts.go:29:14:29:19 | ...!=... | -| stmts.go:30:5:30:18 | skip | stmts.go:23:6:23:9 | true | -| stmts.go:31:14:31:14 | i | stmts.go:31:19:31:19 | 4 | -| stmts.go:31:14:31:19 | ...>=... | stmts.go:31:14:31:19 | ...>=... is false | -| stmts.go:31:14:31:19 | ...>=... | stmts.go:31:14:31:19 | ...>=... is true | -| stmts.go:31:14:31:19 | ...>=... is false | stmts.go:34:5:34:12 | skip | -| stmts.go:31:14:31:19 | ...>=... is true | stmts.go:32:5:32:14 | skip | -| stmts.go:31:19:31:19 | 4 | stmts.go:31:14:31:19 | ...>=... | -| stmts.go:32:5:32:14 | skip | stmts.go:23:6:23:9 | true | -| stmts.go:34:5:34:12 | skip | stmts.go:24:23:24:23 | i | -| stmts.go:39:2:39:2 | skip | stmts.go:39:7:39:7 | 9 | -| stmts.go:39:2:39:7 | assign:0 ... := ... | stmts.go:41:3:41:12 | skip | -| stmts.go:39:7:39:7 | 9 | stmts.go:39:2:39:7 | assign:0 ... := ... | -| stmts.go:40:10:40:10 | k | stmts.go:40:10:40:12 | 1 | -| stmts.go:40:10:40:12 | 1 | stmts.go:40:10:40:12 | incdec-rhs increment statement | -| stmts.go:40:10:40:12 | incdec-rhs increment statement | stmts.go:40:10:40:12 | increment statement | -| stmts.go:40:10:40:12 | increment statement | stmts.go:41:3:41:12 | skip | -| stmts.go:41:3:41:12 | skip | stmts.go:23:6:23:9 | true | -| stmts.go:46:1:62:1 | entry | stmts.go:46:12:46:14 | ch1 | -| stmts.go:46:1:62:1 | function declaration | stmts.go:65:6:65:10 | skip | -| stmts.go:46:6:46:10 | skip | stmts.go:46:1:62:1 | function declaration | -| stmts.go:46:12:46:14 | ch1 | stmts.go:46:12:46:14 | ch1 | +| stmts.go:24:23:24:25 | increment statement | stmts.go:24:23:24:25 | After increment statement | +| stmts.go:24:27:36:3 | block statement | stmts.go:25:4:35:4 | if statement | +| stmts.go:25:4:35:4 | if statement | stmts.go:25:7:25:16 | ... := ... | +| stmts.go:25:7:25:16 | ... := ... | stmts.go:25:12:25:16 | Before ...-... | +| stmts.go:25:7:25:16 | After ... := ... | stmts.go:25:19:25:23 | Before ...>... | +| stmts.go:25:7:25:16 | assign:0 ... := ... | stmts.go:25:7:25:16 | After ... := ... | +| stmts.go:25:12:25:12 | After i | stmts.go:25:16:25:16 | Before 1 | +| stmts.go:25:12:25:12 | Before i | stmts.go:25:12:25:12 | i | +| stmts.go:25:12:25:12 | i | stmts.go:25:12:25:12 | After i | +| stmts.go:25:12:25:16 | ...-... | stmts.go:25:12:25:16 | After ...-... | +| stmts.go:25:12:25:16 | After ...-... | stmts.go:25:7:25:16 | assign:0 ... := ... | +| stmts.go:25:12:25:16 | Before ...-... | stmts.go:25:12:25:12 | Before i | +| stmts.go:25:16:25:16 | 1 | stmts.go:25:16:25:16 | After 1 | +| stmts.go:25:16:25:16 | After 1 | stmts.go:25:12:25:16 | ...-... | +| stmts.go:25:16:25:16 | Before 1 | stmts.go:25:16:25:16 | 1 | +| stmts.go:25:19:25:19 | After j | stmts.go:25:23:25:23 | Before 5 | +| stmts.go:25:19:25:19 | Before j | stmts.go:25:19:25:19 | j | +| stmts.go:25:19:25:19 | j | stmts.go:25:19:25:19 | After j | +| stmts.go:25:19:25:23 | ...>... | stmts.go:25:19:25:23 | After ...>... [false] | +| stmts.go:25:19:25:23 | ...>... | stmts.go:25:19:25:23 | After ...>... [true] | +| stmts.go:25:19:25:23 | After ...>... [false] | stmts.go:27:11:35:4 | if statement | +| stmts.go:25:19:25:23 | After ...>... [true] | stmts.go:25:25:27:4 | block statement | +| stmts.go:25:19:25:23 | Before ...>... | stmts.go:25:19:25:19 | Before j | +| stmts.go:25:23:25:23 | 5 | stmts.go:25:23:25:23 | After 5 | +| stmts.go:25:23:25:23 | After 5 | stmts.go:25:19:25:23 | ...>... | +| stmts.go:25:23:25:23 | Before 5 | stmts.go:25:23:25:23 | 5 | +| stmts.go:25:25:27:4 | block statement | stmts.go:26:5:26:15 | Before break statement | +| stmts.go:26:5:26:15 | Before break statement | stmts.go:26:5:26:15 | break statement | +| stmts.go:26:5:26:15 | break statement | stmts.go:23:2:37:2 | After for statement | +| stmts.go:27:11:35:4 | if statement | stmts.go:27:14:27:18 | Before ...<... | +| stmts.go:27:14:27:14 | After i | stmts.go:27:18:27:18 | Before 3 | +| stmts.go:27:14:27:14 | Before i | stmts.go:27:14:27:14 | i | +| stmts.go:27:14:27:14 | i | stmts.go:27:14:27:14 | After i | +| stmts.go:27:14:27:18 | ...<... | stmts.go:27:14:27:18 | After ...<... [false] | +| stmts.go:27:14:27:18 | ...<... | stmts.go:27:14:27:18 | After ...<... [true] | +| stmts.go:27:14:27:18 | After ...<... [false] | stmts.go:29:11:35:4 | if statement | +| stmts.go:27:14:27:18 | After ...<... [true] | stmts.go:27:20:29:4 | block statement | +| stmts.go:27:14:27:18 | Before ...<... | stmts.go:27:14:27:14 | Before i | +| stmts.go:27:18:27:18 | 3 | stmts.go:27:18:27:18 | After 3 | +| stmts.go:27:18:27:18 | After 3 | stmts.go:27:14:27:18 | ...<... | +| stmts.go:27:18:27:18 | Before 3 | stmts.go:27:18:27:18 | 3 | +| stmts.go:27:20:29:4 | block statement | stmts.go:28:5:28:9 | Before break statement | +| stmts.go:28:5:28:9 | Before break statement | stmts.go:28:5:28:9 | break statement | +| stmts.go:28:5:28:9 | break statement | stmts.go:24:3:36:3 | After for statement | +| stmts.go:29:11:35:4 | if statement | stmts.go:29:14:29:19 | Before ...!=... | +| stmts.go:29:14:29:14 | After i | stmts.go:29:19:29:19 | Before 9 | +| stmts.go:29:14:29:14 | Before i | stmts.go:29:14:29:14 | i | +| stmts.go:29:14:29:14 | i | stmts.go:29:14:29:14 | After i | +| stmts.go:29:14:29:19 | ...!=... | stmts.go:29:14:29:19 | After ...!=... [false] | +| stmts.go:29:14:29:19 | ...!=... | stmts.go:29:14:29:19 | After ...!=... [true] | +| stmts.go:29:14:29:19 | After ...!=... [false] | stmts.go:31:11:35:4 | if statement | +| stmts.go:29:14:29:19 | After ...!=... [true] | stmts.go:29:21:31:4 | block statement | +| stmts.go:29:14:29:19 | Before ...!=... | stmts.go:29:14:29:14 | Before i | +| stmts.go:29:19:29:19 | 9 | stmts.go:29:19:29:19 | After 9 | +| stmts.go:29:19:29:19 | After 9 | stmts.go:29:14:29:19 | ...!=... | +| stmts.go:29:19:29:19 | Before 9 | stmts.go:29:19:29:19 | 9 | +| stmts.go:29:21:31:4 | block statement | stmts.go:30:5:30:18 | Before continue statement | +| stmts.go:30:5:30:18 | Before continue statement | stmts.go:30:5:30:18 | continue statement | +| stmts.go:30:5:30:18 | continue statement | stmts.go:23:2:37:2 | [LoopHeader] for statement | +| stmts.go:31:11:35:4 | if statement | stmts.go:31:14:31:19 | Before ...>=... | +| stmts.go:31:14:31:14 | After i | stmts.go:31:19:31:19 | Before 4 | +| stmts.go:31:14:31:14 | Before i | stmts.go:31:14:31:14 | i | +| stmts.go:31:14:31:14 | i | stmts.go:31:14:31:14 | After i | +| stmts.go:31:14:31:19 | ...>=... | stmts.go:31:14:31:19 | After ...>=... [false] | +| stmts.go:31:14:31:19 | ...>=... | stmts.go:31:14:31:19 | After ...>=... [true] | +| stmts.go:31:14:31:19 | After ...>=... [false] | stmts.go:33:11:35:4 | block statement | +| stmts.go:31:14:31:19 | After ...>=... [true] | stmts.go:31:21:33:4 | block statement | +| stmts.go:31:14:31:19 | Before ...>=... | stmts.go:31:14:31:14 | Before i | +| stmts.go:31:19:31:19 | 4 | stmts.go:31:19:31:19 | After 4 | +| stmts.go:31:19:31:19 | After 4 | stmts.go:31:14:31:19 | ...>=... | +| stmts.go:31:19:31:19 | Before 4 | stmts.go:31:19:31:19 | 4 | +| stmts.go:31:21:33:4 | block statement | stmts.go:32:5:32:14 | Before goto statement | +| stmts.go:32:5:32:14 | Before goto statement | stmts.go:32:5:32:14 | goto statement | +| stmts.go:32:5:32:14 | goto statement | stmts.go:22:1:37:2 | labeled statement | +| stmts.go:33:11:35:4 | block statement | stmts.go:34:5:34:12 | Before continue statement | +| stmts.go:34:5:34:12 | Before continue statement | stmts.go:34:5:34:12 | continue statement | +| stmts.go:34:5:34:12 | continue statement | stmts.go:24:3:36:3 | [LoopHeader] for statement | +| stmts.go:39:2:39:7 | ... := ... | stmts.go:39:7:39:7 | Before 9 | +| stmts.go:39:2:39:7 | After ... := ... | stmts.go:40:2:42:2 | for statement | +| stmts.go:39:2:39:7 | assign:0 ... := ... | stmts.go:39:2:39:7 | After ... := ... | +| stmts.go:39:7:39:7 | 9 | stmts.go:39:7:39:7 | After 9 | +| stmts.go:39:7:39:7 | After 9 | stmts.go:39:2:39:7 | assign:0 ... := ... | +| stmts.go:39:7:39:7 | Before 9 | stmts.go:39:7:39:7 | 9 | +| stmts.go:40:2:42:2 | for statement | stmts.go:40:14:42:2 | block statement | +| stmts.go:40:14:42:2 | block statement | stmts.go:41:3:41:12 | Before goto statement | +| stmts.go:41:3:41:12 | Before goto statement | stmts.go:41:3:41:12 | goto statement | +| stmts.go:41:3:41:12 | goto statement | stmts.go:22:1:37:2 | labeled statement | +| stmts.go:46:1:62:1 | After function declaration | stmts.go:65:1:72:1 | Before function declaration | +| stmts.go:46:1:62:1 | Before function declaration | stmts.go:46:1:62:1 | function declaration | +| stmts.go:46:1:62:1 | Entry | stmts.go:46:12:46:14 | ch1 | +| stmts.go:46:1:62:1 | Exceptional Exit | stmts.go:46:1:62:1 | Exit | +| stmts.go:46:1:62:1 | function declaration | stmts.go:46:1:62:1 | After function declaration | | stmts.go:46:12:46:14 | ch1 | stmts.go:46:26:46:28 | ch2 | -| stmts.go:46:26:46:28 | ch2 | stmts.go:46:26:46:28 | ch2 | -| stmts.go:46:26:46:28 | ch2 | stmts.go:47:6:47:6 | skip | -| stmts.go:47:6:47:6 | skip | stmts.go:47:6:47:17 | zero-init:0 value declaration specifier | -| stmts.go:47:6:47:17 | assign:0 value declaration specifier | stmts.go:48:6:48:6 | skip | +| stmts.go:46:26:46:28 | ch2 | stmts.go:46:44:62:1 | block statement | +| stmts.go:46:44:62:1 | block statement | stmts.go:47:2:47:17 | declaration statement | +| stmts.go:47:2:47:17 | After declaration statement | stmts.go:48:2:48:11 | declaration statement | +| stmts.go:47:2:47:17 | After variable declaration | stmts.go:47:2:47:17 | After declaration statement | +| stmts.go:47:2:47:17 | declaration statement | stmts.go:47:2:47:17 | variable declaration | +| stmts.go:47:2:47:17 | variable declaration | stmts.go:47:6:47:17 | value declaration specifier | +| stmts.go:47:6:47:17 | After value declaration specifier | stmts.go:47:2:47:17 | After variable declaration | +| stmts.go:47:6:47:17 | assign:0 value declaration specifier | stmts.go:47:6:47:17 | After value declaration specifier | +| stmts.go:47:6:47:17 | value declaration specifier | stmts.go:47:6:47:17 | zero-init:0 value declaration specifier | | stmts.go:47:6:47:17 | zero-init:0 value declaration specifier | stmts.go:47:6:47:17 | assign:0 value declaration specifier | -| stmts.go:48:6:48:6 | skip | stmts.go:48:6:48:11 | zero-init:0 value declaration specifier | -| stmts.go:48:6:48:11 | assign:0 value declaration specifier | stmts.go:51:9:51:11 | ch1 | +| stmts.go:48:2:48:11 | After declaration statement | stmts.go:50:2:59:2 | Before select statement | +| stmts.go:48:2:48:11 | After variable declaration | stmts.go:48:2:48:11 | After declaration statement | +| stmts.go:48:2:48:11 | declaration statement | stmts.go:48:2:48:11 | variable declaration | +| stmts.go:48:2:48:11 | variable declaration | stmts.go:48:6:48:11 | value declaration specifier | +| stmts.go:48:6:48:11 | After value declaration specifier | stmts.go:48:2:48:11 | After variable declaration | +| stmts.go:48:6:48:11 | assign:0 value declaration specifier | stmts.go:48:6:48:11 | After value declaration specifier | +| stmts.go:48:6:48:11 | value declaration specifier | stmts.go:48:6:48:11 | zero-init:0 value declaration specifier | | stmts.go:48:6:48:11 | zero-init:0 value declaration specifier | stmts.go:48:6:48:11 | assign:0 value declaration specifier | -| stmts.go:50:2:59:2 | select statement | stmts.go:51:7:51:11 | <-... | -| stmts.go:50:2:59:2 | select statement | stmts.go:53:17:53:21 | <-... | -| stmts.go:50:2:59:2 | select statement | stmts.go:57:3:57:13 | selection of Println | -| stmts.go:50:2:59:2 | select statement | stmts.go:58:7:58:15 | send statement | -| stmts.go:51:7:51:11 | <-... | stmts.go:52:3:52:13 | selection of Println | -| stmts.go:51:9:51:11 | ch1 | stmts.go:53:19:53:21 | ch2 | -| stmts.go:52:3:52:13 | selection of Println | stmts.go:52:15:52:30 | "Heard from ch1" | -| stmts.go:52:3:52:31 | call to Println | stmts.go:46:1:62:1 | exit | -| stmts.go:52:3:52:31 | call to Println | stmts.go:61:2:61:10 | select statement | -| stmts.go:52:15:52:30 | "Heard from ch1" | stmts.go:52:3:52:31 | call to Println | -| stmts.go:53:7:53:7 | a | stmts.go:53:9:53:9 | 0 | -| stmts.go:53:7:53:10 | skip | stmts.go:46:1:62:1 | exit | -| stmts.go:53:7:53:10 | skip | stmts.go:53:13:53:13 | skip | +| stmts.go:50:2:59:2 | After select statement | stmts.go:61:2:61:10 | Before select statement | +| stmts.go:50:2:59:2 | Before select statement | stmts.go:51:9:51:11 | Before ch1 | +| stmts.go:50:2:59:2 | select statement | stmts.go:51:2:52:31 | comm clause | +| stmts.go:50:2:59:2 | select statement | stmts.go:53:2:55:16 | comm clause | +| stmts.go:50:2:59:2 | select statement | stmts.go:56:2:57:15 | comm clause | +| stmts.go:50:2:59:2 | select statement | stmts.go:58:2:58:16 | comm clause | +| stmts.go:51:2:52:31 | comm clause | stmts.go:51:7:51:11 | <-... | +| stmts.go:51:7:51:11 | <-... | stmts.go:52:3:52:31 | expression statement | +| stmts.go:51:9:51:11 | After ch1 | stmts.go:53:19:53:21 | Before ch2 | +| stmts.go:51:9:51:11 | Before ch1 | stmts.go:51:9:51:11 | ch1 | +| stmts.go:51:9:51:11 | ch1 | stmts.go:51:9:51:11 | After ch1 | +| stmts.go:52:3:52:13 | After selection of Println | stmts.go:52:15:52:30 | Before "Heard from ch1" | +| stmts.go:52:3:52:13 | Before selection of Println | stmts.go:52:3:52:13 | selection of Println | +| stmts.go:52:3:52:13 | selection of Println | stmts.go:52:3:52:13 | After selection of Println | +| stmts.go:52:3:52:31 | After call to Println | stmts.go:52:3:52:31 | After expression statement | +| stmts.go:52:3:52:31 | After expression statement | stmts.go:50:2:59:2 | After select statement | +| stmts.go:52:3:52:31 | Before call to Println | stmts.go:52:3:52:13 | Before selection of Println | +| stmts.go:52:3:52:31 | call to Println | stmts.go:46:1:62:1 | Exceptional Exit | +| stmts.go:52:3:52:31 | call to Println | stmts.go:52:3:52:31 | After call to Println | +| stmts.go:52:3:52:31 | expression statement | stmts.go:52:3:52:31 | Before call to Println | +| stmts.go:52:15:52:30 | "Heard from ch1" | stmts.go:52:15:52:30 | After "Heard from ch1" | +| stmts.go:52:15:52:30 | After "Heard from ch1" | stmts.go:52:3:52:31 | call to Println | +| stmts.go:52:15:52:30 | Before "Heard from ch1" | stmts.go:52:15:52:30 | "Heard from ch1" | +| stmts.go:53:2:55:16 | comm clause | stmts.go:53:17:53:21 | <-... | +| stmts.go:53:7:53:7 | After a | stmts.go:53:9:53:9 | Before 0 | +| stmts.go:53:7:53:7 | Before a | stmts.go:53:7:53:7 | a | +| stmts.go:53:7:53:7 | a | stmts.go:53:7:53:7 | After a | +| stmts.go:53:7:53:10 | After index expression | stmts.go:53:13:53:13 | Before w | +| stmts.go:53:7:53:10 | Before index expression | stmts.go:53:7:53:7 | Before a | +| stmts.go:53:7:53:10 | index expression | stmts.go:46:1:62:1 | Exceptional Exit | +| stmts.go:53:7:53:10 | index expression | stmts.go:53:7:53:10 | After index expression | | stmts.go:53:7:53:21 | assign:0 ... = ... | stmts.go:53:7:53:21 | extract:1 ... = ... | -| stmts.go:53:7:53:21 | assign:1 ... = ... | stmts.go:54:3:54:13 | selection of Println | +| stmts.go:53:7:53:21 | assign:1 ... = ... | stmts.go:54:3:54:16 | expression statement | | stmts.go:53:7:53:21 | extract:0 ... = ... | stmts.go:53:7:53:21 | assign:0 ... = ... | | stmts.go:53:7:53:21 | extract:1 ... = ... | stmts.go:53:7:53:21 | assign:1 ... = ... | -| stmts.go:53:9:53:9 | 0 | stmts.go:53:7:53:10 | skip | -| stmts.go:53:13:53:13 | skip | stmts.go:53:7:53:21 | extract:0 ... = ... | -| stmts.go:53:17:53:21 | <-... | stmts.go:53:7:53:7 | a | -| stmts.go:53:19:53:21 | ch2 | stmts.go:58:7:58:9 | ch1 | -| stmts.go:54:3:54:13 | selection of Println | stmts.go:54:15:54:15 | a | -| stmts.go:54:3:54:16 | call to Println | stmts.go:46:1:62:1 | exit | -| stmts.go:54:3:54:16 | call to Println | stmts.go:55:3:55:13 | selection of Println | -| stmts.go:54:15:54:15 | a | stmts.go:54:3:54:16 | call to Println | -| stmts.go:55:3:55:13 | selection of Println | stmts.go:55:15:55:15 | w | -| stmts.go:55:3:55:16 | call to Println | stmts.go:46:1:62:1 | exit | -| stmts.go:55:3:55:16 | call to Println | stmts.go:61:2:61:10 | select statement | -| stmts.go:55:15:55:15 | w | stmts.go:55:3:55:16 | call to Println | -| stmts.go:57:3:57:13 | selection of Println | stmts.go:57:3:57:15 | call to Println | -| stmts.go:57:3:57:15 | call to Println | stmts.go:46:1:62:1 | exit | -| stmts.go:57:3:57:15 | call to Println | stmts.go:61:2:61:10 | select statement | -| stmts.go:58:2:58:16 | skip | stmts.go:61:2:61:10 | select statement | -| stmts.go:58:7:58:9 | ch1 | stmts.go:58:14:58:15 | 42 | -| stmts.go:58:7:58:15 | send statement | stmts.go:46:1:62:1 | exit | -| stmts.go:58:7:58:15 | send statement | stmts.go:58:2:58:16 | skip | -| stmts.go:58:14:58:15 | 42 | stmts.go:50:2:59:2 | select statement | -| stmts.go:65:1:72:1 | entry | stmts.go:65:12:65:12 | x | -| stmts.go:65:1:72:1 | function declaration | stmts.go:75:6:75:10 | skip | -| stmts.go:65:6:65:10 | skip | stmts.go:65:1:72:1 | function declaration | -| stmts.go:65:12:65:12 | x | stmts.go:65:12:65:12 | x | -| stmts.go:65:12:65:12 | x | stmts.go:66:5:66:5 | x | -| stmts.go:66:5:66:5 | x | stmts.go:66:9:66:9 | 0 | -| stmts.go:66:5:66:9 | ...>... | stmts.go:66:5:66:9 | ...>... is false | -| stmts.go:66:5:66:9 | ...>... | stmts.go:66:5:66:9 | ...>... is true | -| stmts.go:66:5:66:9 | ...>... is false | stmts.go:69:9:69:34 | function literal | -| stmts.go:66:5:66:9 | ...>... is true | stmts.go:67:9:67:33 | function literal | -| stmts.go:66:9:66:9 | 0 | stmts.go:66:5:66:9 | ...>... | -| stmts.go:67:3:67:35 | defer statement | stmts.go:71:9:71:10 | 42 | -| stmts.go:67:9:67:33 | entry | stmts.go:67:18:67:28 | selection of Println | -| stmts.go:67:9:67:33 | function literal | stmts.go:67:3:67:35 | defer statement | -| stmts.go:67:9:67:35 | function call | stmts.go:65:1:72:1 | exit | -| stmts.go:67:18:67:28 | selection of Println | stmts.go:67:30:67:30 | x | -| stmts.go:67:18:67:31 | call to Println | stmts.go:67:9:67:33 | exit | -| stmts.go:67:30:67:30 | x | stmts.go:67:18:67:31 | call to Println | -| stmts.go:69:3:69:36 | defer statement | stmts.go:71:9:71:10 | 42 | -| stmts.go:69:9:69:34 | entry | stmts.go:69:18:69:28 | selection of Println | -| stmts.go:69:9:69:34 | function literal | stmts.go:69:3:69:36 | defer statement | -| stmts.go:69:9:69:36 | function call | stmts.go:65:1:72:1 | exit | -| stmts.go:69:18:69:28 | selection of Println | stmts.go:69:31:69:31 | x | -| stmts.go:69:18:69:32 | call to Println | stmts.go:69:9:69:34 | exit | -| stmts.go:69:30:69:31 | -... | stmts.go:69:18:69:32 | call to Println | -| stmts.go:69:31:69:31 | x | stmts.go:69:30:69:31 | -... | -| stmts.go:71:2:71:10 | return statement | stmts.go:67:9:67:35 | function call | -| stmts.go:71:2:71:10 | return statement | stmts.go:69:9:69:36 | function call | -| stmts.go:71:9:71:10 | 42 | stmts.go:71:2:71:10 | return statement | -| stmts.go:75:1:109:1 | entry | stmts.go:75:12:75:12 | x | -| stmts.go:75:1:109:1 | function declaration | stmts.go:112:6:112:10 | skip | -| stmts.go:75:6:75:10 | skip | stmts.go:75:1:109:1 | function declaration | -| stmts.go:75:12:75:12 | x | stmts.go:75:12:75:12 | x | -| stmts.go:75:12:75:12 | x | stmts.go:76:9:76:9 | x | -| stmts.go:76:9:76:9 | x | stmts.go:79:9:79:9 | skip | -| stmts.go:79:9:79:9 | skip | stmts.go:79:14:79:14 | x | -| stmts.go:79:9:79:14 | assign:0 ... := ... | stmts.go:79:17:79:17 | y | -| stmts.go:79:14:79:14 | x | stmts.go:79:9:79:14 | assign:0 ... := ... | -| stmts.go:79:17:79:17 | y | stmts.go:79:21:79:22 | 19 | -| stmts.go:79:17:79:22 | ...-... | stmts.go:81:3:81:7 | test5 | -| stmts.go:79:21:79:22 | 19 | stmts.go:79:17:79:22 | ...-... | -| stmts.go:81:3:81:7 | test5 | stmts.go:81:9:81:13 | false | -| stmts.go:81:3:81:14 | call to test5 | stmts.go:75:1:109:1 | exit | -| stmts.go:81:9:81:13 | false | stmts.go:81:3:81:14 | call to test5 | -| stmts.go:84:9:84:9 | x | stmts.go:85:7:85:7 | 1 | -| stmts.go:84:9:84:9 | x | stmts.go:90:9:90:9 | x | -| stmts.go:85:2:85:8 | case 1 | stmts.go:85:2:85:8 | skip | -| stmts.go:85:2:85:8 | case 1 | stmts.go:86:7:86:7 | 2 | -| stmts.go:85:2:85:8 | skip | stmts.go:90:9:90:9 | x | -| stmts.go:85:7:85:7 | 1 | stmts.go:85:2:85:8 | case 1 | -| stmts.go:86:2:87:13 | case 2 | stmts.go:86:10:86:10 | 3 | -| stmts.go:86:2:87:13 | case 2 | stmts.go:87:3:87:7 | test5 | -| stmts.go:86:2:87:13 | case 3 | stmts.go:87:3:87:7 | test5 | -| stmts.go:86:2:87:13 | case 3 | stmts.go:90:9:90:9 | x | -| stmts.go:86:7:86:7 | 2 | stmts.go:86:2:87:13 | case 2 | -| stmts.go:86:10:86:10 | 3 | stmts.go:86:2:87:13 | case 3 | -| stmts.go:87:3:87:7 | test5 | stmts.go:87:9:87:12 | true | -| stmts.go:87:9:87:12 | true | stmts.go:87:3:87:13 | call to test5 | -| stmts.go:90:9:90:9 | x | stmts.go:91:7:91:7 | 1 | -| stmts.go:90:9:90:9 | x | stmts.go:98:9:98:9 | x | -| stmts.go:91:2:93:13 | case 1 | stmts.go:92:3:92:7 | test5 | -| stmts.go:91:2:93:13 | case 1 | stmts.go:94:7:94:11 | ...-... | -| stmts.go:91:7:91:7 | 1 | stmts.go:91:2:93:13 | case 1 | -| stmts.go:92:3:92:7 | test5 | stmts.go:92:9:92:13 | false | -| stmts.go:92:9:92:13 | false | stmts.go:92:3:92:14 | call to test5 | -| stmts.go:93:3:93:13 | skip | stmts.go:95:3:95:7 | test5 | -| stmts.go:94:2:95:13 | case ...-... | stmts.go:95:3:95:7 | test5 | -| stmts.go:94:2:95:13 | case ...-... | stmts.go:98:9:98:9 | x | -| stmts.go:94:7:94:11 | ...-... | stmts.go:94:2:95:13 | case ...-... | -| stmts.go:95:3:95:7 | test5 | stmts.go:95:9:95:12 | true | -| stmts.go:95:9:95:12 | true | stmts.go:95:3:95:13 | call to test5 | -| stmts.go:98:9:98:9 | x | stmts.go:100:7:100:7 | 2 | -| stmts.go:99:2:99:9 | skip | stmts.go:104:2:108:2 | true | -| stmts.go:100:2:101:13 | case 2 | stmts.go:99:2:99:9 | skip | -| stmts.go:100:2:101:13 | case 2 | stmts.go:101:3:101:7 | test5 | -| stmts.go:100:7:100:7 | 2 | stmts.go:100:2:101:13 | case 2 | -| stmts.go:101:3:101:7 | test5 | stmts.go:101:9:101:12 | true | -| stmts.go:101:9:101:12 | true | stmts.go:101:3:101:13 | call to test5 | -| stmts.go:104:2:108:2 | true | stmts.go:107:7:107:10 | true | -| stmts.go:107:2:107:11 | case true | stmts.go:107:7:107:10 | true is false | -| stmts.go:107:2:107:11 | case true | stmts.go:107:7:107:10 | true is true | -| stmts.go:107:7:107:10 | true | stmts.go:107:2:107:11 | case true | -| stmts.go:107:7:107:10 | true is false | stmts.go:106:3:106:7 | skip | -| stmts.go:107:7:107:10 | true is true | stmts.go:107:2:107:11 | skip | -| stmts.go:112:1:137:1 | entry | stmts.go:112:12:112:12 | x | -| stmts.go:112:1:137:1 | function declaration | stmts.go:140:6:140:11 | skip | -| stmts.go:112:6:112:10 | skip | stmts.go:112:1:137:1 | function declaration | -| stmts.go:112:12:112:12 | x | stmts.go:112:12:112:12 | x | -| stmts.go:112:12:112:12 | x | stmts.go:113:9:113:9 | skip | -| stmts.go:113:9:113:9 | skip | stmts.go:113:14:113:14 | x | -| stmts.go:113:9:113:21 | assign:0 ... := ... | stmts.go:114:2:115:16 | case error | -| stmts.go:113:14:113:14 | x | stmts.go:113:14:113:21 | type assertion | -| stmts.go:113:14:113:21 | type assertion | stmts.go:113:9:113:21 | assign:0 ... := ... | -| stmts.go:114:2:115:16 | case error | stmts.go:114:2:115:16 | case string | -| stmts.go:114:2:115:16 | case error | stmts.go:114:2:115:16 | implicit type switch variable declaration | -| stmts.go:114:2:115:16 | case string | stmts.go:114:2:115:16 | implicit type switch variable declaration | -| stmts.go:114:2:115:16 | case string | stmts.go:116:2:118:14 | case float32 | -| stmts.go:114:2:115:16 | implicit type switch variable declaration | stmts.go:115:3:115:13 | selection of Println | -| stmts.go:115:3:115:13 | selection of Println | stmts.go:115:15:115:15 | y | -| stmts.go:115:3:115:16 | call to Println | stmts.go:112:1:137:1 | exit | -| stmts.go:115:3:115:16 | call to Println | stmts.go:123:9:123:9 | skip | -| stmts.go:115:15:115:15 | y | stmts.go:115:3:115:16 | call to Println | -| stmts.go:116:2:118:14 | case float32 | stmts.go:116:2:118:14 | implicit type switch variable declaration | -| stmts.go:116:2:118:14 | case float32 | stmts.go:119:2:120:7 | implicit type switch variable declaration | -| stmts.go:116:2:118:14 | implicit type switch variable declaration | stmts.go:117:3:117:7 | test5 | -| stmts.go:117:3:117:7 | test5 | stmts.go:117:9:117:12 | true | -| stmts.go:117:3:117:13 | call to test5 | stmts.go:112:1:137:1 | exit | -| stmts.go:117:9:117:12 | true | stmts.go:117:3:117:13 | call to test5 | -| stmts.go:118:3:118:7 | test5 | stmts.go:118:9:118:13 | false | -| stmts.go:118:9:118:13 | false | stmts.go:118:3:118:14 | call to test5 | -| stmts.go:119:2:120:7 | implicit type switch variable declaration | stmts.go:120:3:120:3 | skip | -| stmts.go:120:3:120:3 | skip | stmts.go:120:7:120:7 | y | -| stmts.go:120:7:120:7 | y | stmts.go:123:9:123:9 | skip | -| stmts.go:123:9:123:9 | skip | stmts.go:123:14:123:14 | x | -| stmts.go:123:9:123:14 | assign:0 ... := ... | stmts.go:123:17:123:17 | y | -| stmts.go:123:14:123:14 | x | stmts.go:123:9:123:14 | assign:0 ... := ... | -| stmts.go:123:17:123:17 | y | stmts.go:123:17:123:24 | type assertion | -| stmts.go:123:17:123:24 | type assertion | stmts.go:124:2:125:16 | case error | -| stmts.go:124:2:125:16 | case error | stmts.go:124:2:125:16 | case string | -| stmts.go:124:2:125:16 | case error | stmts.go:125:3:125:13 | selection of Println | -| stmts.go:124:2:125:16 | case string | stmts.go:125:3:125:13 | selection of Println | -| stmts.go:124:2:125:16 | case string | stmts.go:126:2:128:14 | case float32 | -| stmts.go:125:3:125:13 | selection of Println | stmts.go:125:15:125:15 | y | -| stmts.go:125:3:125:16 | call to Println | stmts.go:112:1:137:1 | exit | -| stmts.go:125:3:125:16 | call to Println | stmts.go:133:9:133:9 | skip | -| stmts.go:125:15:125:15 | y | stmts.go:125:3:125:16 | call to Println | -| stmts.go:126:2:128:14 | case float32 | stmts.go:127:3:127:7 | test5 | -| stmts.go:126:2:128:14 | case float32 | stmts.go:130:3:130:3 | skip | -| stmts.go:127:3:127:7 | test5 | stmts.go:127:9:127:12 | true | -| stmts.go:127:3:127:13 | call to test5 | stmts.go:112:1:137:1 | exit | -| stmts.go:127:9:127:12 | true | stmts.go:127:3:127:13 | call to test5 | -| stmts.go:128:3:128:7 | test5 | stmts.go:128:9:128:13 | false | -| stmts.go:128:9:128:13 | false | stmts.go:128:3:128:14 | call to test5 | -| stmts.go:130:3:130:3 | skip | stmts.go:130:7:130:7 | y | -| stmts.go:130:7:130:7 | y | stmts.go:133:9:133:9 | skip | -| stmts.go:133:9:133:9 | skip | stmts.go:133:14:133:14 | x | -| stmts.go:133:9:133:14 | assign:0 ... := ... | stmts.go:133:17:133:17 | y | -| stmts.go:133:14:133:14 | x | stmts.go:133:9:133:14 | assign:0 ... := ... | -| stmts.go:133:17:133:17 | y | stmts.go:133:17:133:24 | type assertion | -| stmts.go:133:17:133:24 | type assertion | stmts.go:135:3:135:7 | test5 | -| stmts.go:135:3:135:7 | test5 | stmts.go:135:9:135:13 | false | -| stmts.go:135:3:135:14 | call to test5 | stmts.go:112:1:137:1 | exit | -| stmts.go:135:9:135:13 | false | stmts.go:135:3:135:14 | call to test5 | -| stmts.go:140:1:142:1 | entry | stmts.go:140:13:140:13 | f | -| stmts.go:140:1:142:1 | function declaration | stmts.go:145:6:145:11 | skip | -| stmts.go:140:6:140:11 | skip | stmts.go:140:1:142:1 | function declaration | -| stmts.go:140:13:140:13 | f | stmts.go:140:13:140:13 | f | -| stmts.go:140:13:140:13 | f | stmts.go:141:5:141:5 | f | -| stmts.go:141:2:141:7 | go statement | stmts.go:140:1:142:1 | exit | -| stmts.go:141:5:141:5 | f | stmts.go:141:2:141:7 | go statement | -| stmts.go:145:1:159:1 | entry | stmts.go:145:13:145:14 | xs | -| stmts.go:145:1:159:1 | function declaration | stmts.go:0:0:0:0 | exit | -| stmts.go:145:6:145:11 | skip | stmts.go:145:1:159:1 | function declaration | -| stmts.go:145:13:145:14 | xs | stmts.go:145:13:145:14 | xs | -| stmts.go:145:13:145:14 | xs | stmts.go:146:17:146:18 | xs | -| stmts.go:146:2:151:2 | assign:0 range statement | stmts.go:147:6:147:6 | x | -| stmts.go:146:2:151:2 | extract:0 range statement | stmts.go:146:2:151:2 | assign:0 range statement | -| stmts.go:146:6:146:6 | skip | stmts.go:146:2:151:2 | extract:0 range statement | -| stmts.go:146:17:146:18 | next key-value pair in range | stmts.go:146:6:146:6 | skip | -| stmts.go:146:17:146:18 | next key-value pair in range | stmts.go:153:20:153:21 | xs | -| stmts.go:146:17:146:18 | xs | stmts.go:146:17:146:18 | next key-value pair in range | -| stmts.go:147:6:147:6 | x | stmts.go:147:10:147:10 | 5 | -| stmts.go:147:6:147:10 | ...>... | stmts.go:147:6:147:10 | ...>... is false | -| stmts.go:147:6:147:10 | ...>... | stmts.go:147:6:147:10 | ...>... is true | -| stmts.go:147:6:147:10 | ...>... is false | stmts.go:150:3:150:11 | selection of Print | -| stmts.go:147:6:147:10 | ...>... is true | stmts.go:148:4:148:11 | skip | -| stmts.go:147:10:147:10 | 5 | stmts.go:147:6:147:10 | ...>... | -| stmts.go:148:4:148:11 | skip | stmts.go:146:17:146:18 | next key-value pair in range | -| stmts.go:150:3:150:11 | selection of Print | stmts.go:150:13:150:13 | x | -| stmts.go:150:3:150:14 | call to Print | stmts.go:145:1:159:1 | exit | -| stmts.go:150:3:150:14 | call to Print | stmts.go:146:17:146:18 | next key-value pair in range | -| stmts.go:150:13:150:13 | x | stmts.go:150:3:150:14 | call to Print | -| stmts.go:153:2:155:2 | assign:0 range statement | stmts.go:153:2:155:2 | assign:1 range statement | -| stmts.go:153:2:155:2 | assign:1 range statement | stmts.go:154:3:154:11 | selection of Print | -| stmts.go:153:2:155:2 | extract:0 range statement | stmts.go:153:2:155:2 | extract:1 range statement | -| stmts.go:153:2:155:2 | extract:1 range statement | stmts.go:153:2:155:2 | assign:0 range statement | -| stmts.go:153:6:153:6 | skip | stmts.go:153:9:153:9 | skip | -| stmts.go:153:9:153:9 | skip | stmts.go:153:2:155:2 | extract:0 range statement | -| stmts.go:153:20:153:21 | next key-value pair in range | stmts.go:153:6:153:6 | skip | -| stmts.go:153:20:153:21 | next key-value pair in range | stmts.go:157:12:157:13 | xs | -| stmts.go:153:20:153:21 | xs | stmts.go:153:20:153:21 | next key-value pair in range | -| stmts.go:154:3:154:11 | selection of Print | stmts.go:154:13:154:13 | i | -| stmts.go:154:3:154:17 | call to Print | stmts.go:145:1:159:1 | exit | -| stmts.go:154:3:154:17 | call to Print | stmts.go:153:20:153:21 | next key-value pair in range | -| stmts.go:154:13:154:13 | i | stmts.go:154:16:154:16 | v | -| stmts.go:154:16:154:16 | v | stmts.go:154:3:154:17 | call to Print | -| stmts.go:157:12:157:13 | next key-value pair in range | stmts.go:145:1:159:1 | exit | -| stmts.go:157:12:157:13 | next key-value pair in range | stmts.go:157:15:158:2 | skip | -| stmts.go:157:12:157:13 | xs | stmts.go:157:12:157:13 | next key-value pair in range | -| stmts.go:157:15:158:2 | skip | stmts.go:157:12:157:13 | next key-value pair in range | -| tst.go:0:0:0:0 | entry | tst.go:3:6:3:10 | skip | -| tst.go:3:1:12:1 | entry | tst.go:3:12:3:12 | x | -| tst.go:3:1:12:1 | function declaration | tst.go:14:6:14:11 | skip | -| tst.go:3:6:3:10 | skip | tst.go:3:1:12:1 | function declaration | -| tst.go:3:12:3:12 | x | tst.go:3:12:3:12 | x | -| tst.go:3:12:3:12 | x | tst.go:4:2:11:2 | true | -| tst.go:4:2:11:2 | true | tst.go:5:7:5:7 | x | -| tst.go:5:2:5:13 | case ...<... | tst.go:5:7:5:12 | ...<... is false | -| tst.go:5:2:5:13 | case ...<... | tst.go:5:7:5:12 | ...<... is true | -| tst.go:5:2:5:13 | skip | tst.go:3:1:12:1 | exit | -| tst.go:5:7:5:7 | x | tst.go:5:11:5:12 | 23 | -| tst.go:5:7:5:12 | ...<... | tst.go:5:2:5:13 | case ...<... | -| tst.go:5:7:5:12 | ...<... is false | tst.go:7:7:7:7 | x | -| tst.go:5:7:5:12 | ...<... is true | tst.go:5:2:5:13 | skip | -| tst.go:5:11:5:12 | 23 | tst.go:5:7:5:12 | ...<... | -| tst.go:7:2:7:13 | case ...<... | tst.go:7:7:7:12 | ...<... is false | -| tst.go:7:2:7:13 | case ...<... | tst.go:7:7:7:12 | ...<... is true | -| tst.go:7:2:7:13 | skip | tst.go:3:1:12:1 | exit | -| tst.go:7:7:7:7 | x | tst.go:7:11:7:12 | 42 | -| tst.go:7:7:7:12 | ...<... | tst.go:7:2:7:13 | case ...<... | -| tst.go:7:7:7:12 | ...<... is false | tst.go:9:7:9:7 | x | -| tst.go:7:7:7:12 | ...<... is true | tst.go:7:2:7:13 | skip | -| tst.go:7:11:7:12 | 42 | tst.go:7:7:7:12 | ...<... | -| tst.go:9:2:9:13 | case ...<... | tst.go:9:7:9:12 | ...<... is false | -| tst.go:9:2:9:13 | case ...<... | tst.go:9:7:9:12 | ...<... is true | -| tst.go:9:2:9:13 | skip | tst.go:3:1:12:1 | exit | -| tst.go:9:7:9:7 | x | tst.go:9:11:9:12 | 23 | -| tst.go:9:7:9:12 | ...<... | tst.go:9:2:9:13 | case ...<... | -| tst.go:9:7:9:12 | ...<... is false | tst.go:3:1:12:1 | exit | -| tst.go:9:7:9:12 | ...<... is true | tst.go:9:2:9:13 | skip | -| tst.go:9:11:9:12 | 23 | tst.go:9:7:9:12 | ...<... | -| tst.go:14:1:21:1 | entry | tst.go:14:13:14:17 | value | -| tst.go:14:1:21:1 | function declaration | tst.go:23:6:23:11 | skip | -| tst.go:14:6:14:11 | skip | tst.go:14:1:21:1 | function declaration | -| tst.go:14:13:14:17 | value | tst.go:14:13:14:17 | value | -| tst.go:14:13:14:17 | value | tst.go:15:2:20:2 | true | -| tst.go:15:2:20:2 | true | tst.go:16:7:16:11 | value | -| tst.go:16:2:16:34 | case ...<... | tst.go:16:7:16:33 | ...<... is false | -| tst.go:16:2:16:34 | case ...<... | tst.go:16:7:16:33 | ...<... is true | -| tst.go:16:2:16:34 | skip | tst.go:14:1:21:1 | exit | -| tst.go:16:7:16:11 | value | tst.go:16:15:16:33 | ...*... | -| tst.go:16:7:16:33 | ...<... | tst.go:16:2:16:34 | case ...<... | -| tst.go:16:7:16:33 | ...<... is false | tst.go:18:7:18:11 | value | -| tst.go:16:7:16:33 | ...<... is true | tst.go:16:2:16:34 | skip | -| tst.go:16:15:16:33 | ...*... | tst.go:16:7:16:33 | ...<... | -| tst.go:18:2:18:39 | case ...<... | tst.go:18:7:18:38 | ...<... is false | -| tst.go:18:2:18:39 | case ...<... | tst.go:18:7:18:38 | ...<... is true | -| tst.go:18:2:18:39 | skip | tst.go:14:1:21:1 | exit | -| tst.go:18:7:18:11 | value | tst.go:18:15:18:38 | ...*... | -| tst.go:18:7:18:38 | ...<... | tst.go:18:2:18:39 | case ...<... | -| tst.go:18:7:18:38 | ...<... is false | tst.go:14:1:21:1 | exit | -| tst.go:18:7:18:38 | ...<... is true | tst.go:18:2:18:39 | skip | -| tst.go:18:15:18:38 | ...*... | tst.go:18:7:18:38 | ...<... | -| tst.go:23:1:26:1 | entry | tst.go:24:2:25:2 | true | -| tst.go:23:1:26:1 | function declaration | tst.go:28:6:28:11 | skip | -| tst.go:23:6:23:11 | skip | tst.go:23:1:26:1 | function declaration | -| tst.go:24:2:25:2 | true | tst.go:23:1:26:1 | exit | -| tst.go:28:1:32:1 | entry | tst.go:29:2:31:2 | true | -| tst.go:28:1:32:1 | function declaration | tst.go:0:0:0:0 | exit | -| tst.go:28:6:28:11 | skip | tst.go:28:1:32:1 | function declaration | -| tst.go:29:2:31:2 | true | tst.go:30:2:30:9 | skip | -| tst.go:30:2:30:9 | skip | tst.go:28:1:32:1 | exit | +| stmts.go:53:9:53:9 | 0 | stmts.go:53:9:53:9 | After 0 | +| stmts.go:53:9:53:9 | After 0 | stmts.go:53:7:53:10 | index expression | +| stmts.go:53:9:53:9 | Before 0 | stmts.go:53:9:53:9 | 0 | +| stmts.go:53:13:53:13 | After w | stmts.go:53:7:53:21 | extract:0 ... = ... | +| stmts.go:53:13:53:13 | Before w | stmts.go:53:13:53:13 | w | +| stmts.go:53:13:53:13 | w | stmts.go:53:13:53:13 | After w | +| stmts.go:53:17:53:21 | <-... | stmts.go:53:7:53:10 | Before index expression | +| stmts.go:53:19:53:21 | After ch2 | stmts.go:58:7:58:9 | Before ch1 | +| stmts.go:53:19:53:21 | Before ch2 | stmts.go:53:19:53:21 | ch2 | +| stmts.go:53:19:53:21 | ch2 | stmts.go:53:19:53:21 | After ch2 | +| stmts.go:54:3:54:13 | After selection of Println | stmts.go:54:15:54:15 | Before a | +| stmts.go:54:3:54:13 | Before selection of Println | stmts.go:54:3:54:13 | selection of Println | +| stmts.go:54:3:54:13 | selection of Println | stmts.go:54:3:54:13 | After selection of Println | +| stmts.go:54:3:54:16 | After call to Println | stmts.go:54:3:54:16 | After expression statement | +| stmts.go:54:3:54:16 | After expression statement | stmts.go:55:3:55:16 | expression statement | +| stmts.go:54:3:54:16 | Before call to Println | stmts.go:54:3:54:13 | Before selection of Println | +| stmts.go:54:3:54:16 | call to Println | stmts.go:46:1:62:1 | Exceptional Exit | +| stmts.go:54:3:54:16 | call to Println | stmts.go:54:3:54:16 | After call to Println | +| stmts.go:54:3:54:16 | expression statement | stmts.go:54:3:54:16 | Before call to Println | +| stmts.go:54:15:54:15 | After a | stmts.go:54:3:54:16 | call to Println | +| stmts.go:54:15:54:15 | Before a | stmts.go:54:15:54:15 | a | +| stmts.go:54:15:54:15 | a | stmts.go:54:15:54:15 | After a | +| stmts.go:55:3:55:13 | After selection of Println | stmts.go:55:15:55:15 | Before w | +| stmts.go:55:3:55:13 | Before selection of Println | stmts.go:55:3:55:13 | selection of Println | +| stmts.go:55:3:55:13 | selection of Println | stmts.go:55:3:55:13 | After selection of Println | +| stmts.go:55:3:55:16 | After call to Println | stmts.go:55:3:55:16 | After expression statement | +| stmts.go:55:3:55:16 | After expression statement | stmts.go:50:2:59:2 | After select statement | +| stmts.go:55:3:55:16 | Before call to Println | stmts.go:55:3:55:13 | Before selection of Println | +| stmts.go:55:3:55:16 | call to Println | stmts.go:46:1:62:1 | Exceptional Exit | +| stmts.go:55:3:55:16 | call to Println | stmts.go:55:3:55:16 | After call to Println | +| stmts.go:55:3:55:16 | expression statement | stmts.go:55:3:55:16 | Before call to Println | +| stmts.go:55:15:55:15 | After w | stmts.go:55:3:55:16 | call to Println | +| stmts.go:55:15:55:15 | Before w | stmts.go:55:15:55:15 | w | +| stmts.go:55:15:55:15 | w | stmts.go:55:15:55:15 | After w | +| stmts.go:56:2:57:15 | comm clause | stmts.go:57:3:57:15 | expression statement | +| stmts.go:57:3:57:13 | After selection of Println | stmts.go:57:3:57:15 | call to Println | +| stmts.go:57:3:57:13 | Before selection of Println | stmts.go:57:3:57:13 | selection of Println | +| stmts.go:57:3:57:13 | selection of Println | stmts.go:57:3:57:13 | After selection of Println | +| stmts.go:57:3:57:15 | After call to Println | stmts.go:57:3:57:15 | After expression statement | +| stmts.go:57:3:57:15 | After expression statement | stmts.go:50:2:59:2 | After select statement | +| stmts.go:57:3:57:15 | Before call to Println | stmts.go:57:3:57:13 | Before selection of Println | +| stmts.go:57:3:57:15 | call to Println | stmts.go:46:1:62:1 | Exceptional Exit | +| stmts.go:57:3:57:15 | call to Println | stmts.go:57:3:57:15 | After call to Println | +| stmts.go:57:3:57:15 | expression statement | stmts.go:57:3:57:15 | Before call to Println | +| stmts.go:58:2:58:16 | comm clause | stmts.go:58:7:58:15 | send statement | +| stmts.go:58:7:58:9 | After ch1 | stmts.go:58:14:58:15 | Before 42 | +| stmts.go:58:7:58:9 | Before ch1 | stmts.go:58:7:58:9 | ch1 | +| stmts.go:58:7:58:9 | ch1 | stmts.go:58:7:58:9 | After ch1 | +| stmts.go:58:7:58:15 | After send statement | stmts.go:50:2:59:2 | After select statement | +| stmts.go:58:7:58:15 | send statement | stmts.go:58:7:58:15 | After send statement | +| stmts.go:58:14:58:15 | 42 | stmts.go:58:14:58:15 | After 42 | +| stmts.go:58:14:58:15 | After 42 | stmts.go:50:2:59:2 | select statement | +| stmts.go:58:14:58:15 | Before 42 | stmts.go:58:14:58:15 | 42 | +| stmts.go:61:2:61:10 | Before select statement | stmts.go:61:2:61:10 | select statement | +| stmts.go:65:1:72:1 | After function declaration | stmts.go:75:1:109:1 | Before function declaration | +| stmts.go:65:1:72:1 | Before function declaration | stmts.go:65:1:72:1 | function declaration | +| stmts.go:65:1:72:1 | Entry | stmts.go:65:12:65:12 | x | +| stmts.go:65:1:72:1 | Exceptional Exit | stmts.go:65:1:72:1 | Exit | +| stmts.go:65:1:72:1 | Normal Exit | stmts.go:65:1:72:1 | Exit | +| stmts.go:65:1:72:1 | function declaration | stmts.go:65:1:72:1 | After function declaration | +| stmts.go:65:12:65:12 | x | stmts.go:65:23:72:1 | block statement | +| stmts.go:65:23:72:1 | block statement | stmts.go:66:2:70:2 | if statement | +| stmts.go:66:2:70:2 | After if statement | stmts.go:71:2:71:10 | Before return statement | +| stmts.go:66:2:70:2 | if statement | stmts.go:66:5:66:9 | Before ...>... | +| stmts.go:66:5:66:5 | After x | stmts.go:66:9:66:9 | Before 0 | +| stmts.go:66:5:66:5 | Before x | stmts.go:66:5:66:5 | x | +| stmts.go:66:5:66:5 | x | stmts.go:66:5:66:5 | After x | +| stmts.go:66:5:66:9 | ...>... | stmts.go:66:5:66:9 | After ...>... [false] | +| stmts.go:66:5:66:9 | ...>... | stmts.go:66:5:66:9 | After ...>... [true] | +| stmts.go:66:5:66:9 | After ...>... [false] | stmts.go:68:9:70:2 | block statement | +| stmts.go:66:5:66:9 | After ...>... [true] | stmts.go:66:11:68:2 | block statement | +| stmts.go:66:5:66:9 | Before ...>... | stmts.go:66:5:66:5 | Before x | +| stmts.go:66:9:66:9 | 0 | stmts.go:66:9:66:9 | After 0 | +| stmts.go:66:9:66:9 | After 0 | stmts.go:66:5:66:9 | ...>... | +| stmts.go:66:9:66:9 | Before 0 | stmts.go:66:9:66:9 | 0 | +| stmts.go:66:11:68:2 | After block statement | stmts.go:66:2:70:2 | After if statement | +| stmts.go:66:11:68:2 | block statement | stmts.go:67:3:67:35 | Before defer statement | +| stmts.go:67:3:67:35 | After defer statement | stmts.go:66:11:68:2 | After block statement | +| stmts.go:67:3:67:35 | Before defer statement | stmts.go:67:9:67:35 | function call | +| stmts.go:67:3:67:35 | defer statement | stmts.go:67:3:67:35 | After defer statement | +| stmts.go:67:9:67:33 | After function literal | stmts.go:67:9:67:35 | After function call | +| stmts.go:67:9:67:33 | Before function literal | stmts.go:67:9:67:33 | function literal | +| stmts.go:67:9:67:33 | Entry | stmts.go:67:16:67:33 | block statement | +| stmts.go:67:9:67:33 | Exceptional Exit | stmts.go:67:9:67:33 | Exit | +| stmts.go:67:9:67:33 | Normal Exit | stmts.go:67:9:67:33 | Exit | +| stmts.go:67:9:67:33 | function literal | stmts.go:67:9:67:33 | After function literal | +| stmts.go:67:9:67:35 | After function call | stmts.go:67:3:67:35 | defer statement | +| stmts.go:67:9:67:35 | defer-invoke function call | stmts.go:65:1:72:1 | Exceptional Exit | +| stmts.go:67:9:67:35 | defer-invoke function call | stmts.go:65:1:72:1 | Normal Exit | +| stmts.go:67:9:67:35 | function call | stmts.go:67:9:67:33 | Before function literal | +| stmts.go:67:16:67:33 | After block statement | stmts.go:67:9:67:33 | Normal Exit | +| stmts.go:67:16:67:33 | block statement | stmts.go:67:18:67:31 | expression statement | +| stmts.go:67:18:67:28 | After selection of Println | stmts.go:67:30:67:30 | Before x | +| stmts.go:67:18:67:28 | Before selection of Println | stmts.go:67:18:67:28 | selection of Println | +| stmts.go:67:18:67:28 | selection of Println | stmts.go:67:18:67:28 | After selection of Println | +| stmts.go:67:18:67:31 | After call to Println | stmts.go:67:18:67:31 | After expression statement | +| stmts.go:67:18:67:31 | After expression statement | stmts.go:67:16:67:33 | After block statement | +| stmts.go:67:18:67:31 | Before call to Println | stmts.go:67:18:67:28 | Before selection of Println | +| stmts.go:67:18:67:31 | call to Println | stmts.go:67:9:67:33 | Exceptional Exit | +| stmts.go:67:18:67:31 | call to Println | stmts.go:67:18:67:31 | After call to Println | +| stmts.go:67:18:67:31 | expression statement | stmts.go:67:18:67:31 | Before call to Println | +| stmts.go:67:30:67:30 | After x | stmts.go:67:18:67:31 | call to Println | +| stmts.go:67:30:67:30 | Before x | stmts.go:67:30:67:30 | x | +| stmts.go:67:30:67:30 | x | stmts.go:67:30:67:30 | After x | +| stmts.go:68:9:70:2 | After block statement | stmts.go:66:2:70:2 | After if statement | +| stmts.go:68:9:70:2 | block statement | stmts.go:69:3:69:36 | Before defer statement | +| stmts.go:69:3:69:36 | After defer statement | stmts.go:68:9:70:2 | After block statement | +| stmts.go:69:3:69:36 | Before defer statement | stmts.go:69:9:69:36 | function call | +| stmts.go:69:3:69:36 | defer statement | stmts.go:69:3:69:36 | After defer statement | +| stmts.go:69:9:69:34 | After function literal | stmts.go:69:9:69:36 | After function call | +| stmts.go:69:9:69:34 | Before function literal | stmts.go:69:9:69:34 | function literal | +| stmts.go:69:9:69:34 | Entry | stmts.go:69:16:69:34 | block statement | +| stmts.go:69:9:69:34 | Exceptional Exit | stmts.go:69:9:69:34 | Exit | +| stmts.go:69:9:69:34 | Normal Exit | stmts.go:69:9:69:34 | Exit | +| stmts.go:69:9:69:34 | function literal | stmts.go:69:9:69:34 | After function literal | +| stmts.go:69:9:69:36 | After function call | stmts.go:69:3:69:36 | defer statement | +| stmts.go:69:9:69:36 | defer-invoke function call | stmts.go:65:1:72:1 | Exceptional Exit | +| stmts.go:69:9:69:36 | defer-invoke function call | stmts.go:65:1:72:1 | Normal Exit | +| stmts.go:69:9:69:36 | function call | stmts.go:69:9:69:34 | Before function literal | +| stmts.go:69:16:69:34 | After block statement | stmts.go:69:9:69:34 | Normal Exit | +| stmts.go:69:16:69:34 | block statement | stmts.go:69:18:69:32 | expression statement | +| stmts.go:69:18:69:28 | After selection of Println | stmts.go:69:30:69:31 | Before -... | +| stmts.go:69:18:69:28 | Before selection of Println | stmts.go:69:18:69:28 | selection of Println | +| stmts.go:69:18:69:28 | selection of Println | stmts.go:69:18:69:28 | After selection of Println | +| stmts.go:69:18:69:32 | After call to Println | stmts.go:69:18:69:32 | After expression statement | +| stmts.go:69:18:69:32 | After expression statement | stmts.go:69:16:69:34 | After block statement | +| stmts.go:69:18:69:32 | Before call to Println | stmts.go:69:18:69:28 | Before selection of Println | +| stmts.go:69:18:69:32 | call to Println | stmts.go:69:9:69:34 | Exceptional Exit | +| stmts.go:69:18:69:32 | call to Println | stmts.go:69:18:69:32 | After call to Println | +| stmts.go:69:18:69:32 | expression statement | stmts.go:69:18:69:32 | Before call to Println | +| stmts.go:69:30:69:31 | -... | stmts.go:69:30:69:31 | After -... | +| stmts.go:69:30:69:31 | After -... | stmts.go:69:18:69:32 | call to Println | +| stmts.go:69:30:69:31 | Before -... | stmts.go:69:31:69:31 | Before x | +| stmts.go:69:31:69:31 | After x | stmts.go:69:30:69:31 | -... | +| stmts.go:69:31:69:31 | Before x | stmts.go:69:31:69:31 | x | +| stmts.go:69:31:69:31 | x | stmts.go:69:31:69:31 | After x | +| stmts.go:71:2:71:10 | Before return statement | stmts.go:71:9:71:10 | Before 42 | +| stmts.go:71:2:71:10 | return statement | stmts.go:67:9:67:35 | defer-invoke function call | +| stmts.go:71:2:71:10 | return statement | stmts.go:69:9:69:36 | defer-invoke function call | +| stmts.go:71:9:71:10 | 42 | stmts.go:71:9:71:10 | After 42 | +| stmts.go:71:9:71:10 | After 42 | stmts.go:71:2:71:10 | return statement | +| stmts.go:71:9:71:10 | Before 42 | stmts.go:71:9:71:10 | 42 | +| stmts.go:75:1:109:1 | After function declaration | stmts.go:112:1:137:1 | Before function declaration | +| stmts.go:75:1:109:1 | Before function declaration | stmts.go:75:1:109:1 | function declaration | +| stmts.go:75:1:109:1 | Entry | stmts.go:75:12:75:12 | x | +| stmts.go:75:1:109:1 | Exceptional Exit | stmts.go:75:1:109:1 | Exit | +| stmts.go:75:1:109:1 | Normal Exit | stmts.go:75:1:109:1 | Exit | +| stmts.go:75:1:109:1 | function declaration | stmts.go:75:1:109:1 | After function declaration | +| stmts.go:75:12:75:12 | x | stmts.go:75:19:109:1 | block statement | +| stmts.go:75:19:109:1 | After block statement | stmts.go:75:1:109:1 | Normal Exit | +| stmts.go:75:19:109:1 | block statement | stmts.go:76:2:77:2 | expression-switch statement | +| stmts.go:76:2:77:2 | After expression-switch statement | stmts.go:79:2:82:2 | expression-switch statement | +| stmts.go:76:2:77:2 | expression-switch statement | stmts.go:76:9:76:9 | Before x | +| stmts.go:76:9:76:9 | After x | stmts.go:76:2:77:2 | After expression-switch statement | +| stmts.go:76:9:76:9 | Before x | stmts.go:76:9:76:9 | x | +| stmts.go:76:9:76:9 | x | stmts.go:76:9:76:9 | After x | +| stmts.go:79:2:82:2 | After expression-switch statement | stmts.go:84:2:88:2 | expression-switch statement | +| stmts.go:79:2:82:2 | expression-switch statement | stmts.go:79:9:79:14 | ... := ... | +| stmts.go:79:9:79:14 | ... := ... | stmts.go:79:14:79:14 | Before x | +| stmts.go:79:9:79:14 | After ... := ... | stmts.go:79:17:79:22 | Before ...-... | +| stmts.go:79:9:79:14 | assign:0 ... := ... | stmts.go:79:9:79:14 | After ... := ... | +| stmts.go:79:14:79:14 | After x | stmts.go:79:9:79:14 | assign:0 ... := ... | +| stmts.go:79:14:79:14 | Before x | stmts.go:79:14:79:14 | x | +| stmts.go:79:14:79:14 | x | stmts.go:79:14:79:14 | After x | +| stmts.go:79:17:79:17 | After y | stmts.go:79:21:79:22 | Before 19 | +| stmts.go:79:17:79:17 | Before y | stmts.go:79:17:79:17 | y | +| stmts.go:79:17:79:17 | y | stmts.go:79:17:79:17 | After y | +| stmts.go:79:17:79:22 | ...-... | stmts.go:79:17:79:22 | After ...-... | +| stmts.go:79:17:79:22 | After ...-... | stmts.go:80:2:81:14 | case clause | +| stmts.go:79:17:79:22 | Before ...-... | stmts.go:79:17:79:17 | Before y | +| stmts.go:79:21:79:22 | 19 | stmts.go:79:21:79:22 | After 19 | +| stmts.go:79:21:79:22 | After 19 | stmts.go:79:17:79:22 | ...-... | +| stmts.go:79:21:79:22 | Before 19 | stmts.go:79:21:79:22 | 19 | +| stmts.go:80:2:81:14 | After case clause [match] | stmts.go:81:3:81:14 | expression statement | +| stmts.go:80:2:81:14 | case clause | stmts.go:80:2:81:14 | After case clause [match] | +| stmts.go:81:3:81:7 | After test5 | stmts.go:81:9:81:13 | Before false | +| stmts.go:81:3:81:7 | Before test5 | stmts.go:81:3:81:7 | test5 | +| stmts.go:81:3:81:7 | test5 | stmts.go:81:3:81:7 | After test5 | +| stmts.go:81:3:81:14 | After call to test5 | stmts.go:81:3:81:14 | After expression statement | +| stmts.go:81:3:81:14 | After expression statement | stmts.go:79:2:82:2 | After expression-switch statement | +| stmts.go:81:3:81:14 | Before call to test5 | stmts.go:81:3:81:7 | Before test5 | +| stmts.go:81:3:81:14 | call to test5 | stmts.go:75:1:109:1 | Exceptional Exit | +| stmts.go:81:3:81:14 | call to test5 | stmts.go:81:3:81:14 | After call to test5 | +| stmts.go:81:3:81:14 | expression statement | stmts.go:81:3:81:14 | Before call to test5 | +| stmts.go:81:9:81:13 | After false | stmts.go:81:3:81:14 | call to test5 | +| stmts.go:81:9:81:13 | Before false | stmts.go:81:9:81:13 | false | +| stmts.go:81:9:81:13 | false | stmts.go:81:9:81:13 | After false | +| stmts.go:84:2:88:2 | After expression-switch statement | stmts.go:90:2:96:2 | expression-switch statement | +| stmts.go:84:2:88:2 | expression-switch statement | stmts.go:84:9:84:9 | Before x | +| stmts.go:84:9:84:9 | After x | stmts.go:85:2:85:8 | case clause | +| stmts.go:84:9:84:9 | Before x | stmts.go:84:9:84:9 | x | +| stmts.go:84:9:84:9 | x | stmts.go:84:9:84:9 | After x | +| stmts.go:85:2:85:8 | After case clause [match] | stmts.go:84:2:88:2 | After expression-switch statement | +| stmts.go:85:2:85:8 | After case clause [no-match] | stmts.go:86:2:87:13 | case clause | +| stmts.go:85:2:85:8 | case clause | stmts.go:85:7:85:7 | Before 1 | +| stmts.go:85:7:85:7 | 1 | stmts.go:85:7:85:7 | After 1 [match] | +| stmts.go:85:7:85:7 | 1 | stmts.go:85:7:85:7 | After 1 [no-match] | +| stmts.go:85:7:85:7 | After 1 [match] | stmts.go:85:2:85:8 | After case clause [match] | +| stmts.go:85:7:85:7 | After 1 [no-match] | stmts.go:85:2:85:8 | After case clause [no-match] | +| stmts.go:85:7:85:7 | Before 1 | stmts.go:85:7:85:7 | 1 | +| stmts.go:86:2:87:13 | After case clause [match] | stmts.go:87:3:87:13 | expression statement | +| stmts.go:86:2:87:13 | After case clause [no-match] | stmts.go:84:2:88:2 | After expression-switch statement | +| stmts.go:86:2:87:13 | case clause | stmts.go:86:7:86:7 | Before 2 | +| stmts.go:86:7:86:7 | 2 | stmts.go:86:7:86:7 | After 2 [match] | +| stmts.go:86:7:86:7 | 2 | stmts.go:86:7:86:7 | After 2 [no-match] | +| stmts.go:86:7:86:7 | After 2 [match] | stmts.go:86:2:87:13 | After case clause [match] | +| stmts.go:86:7:86:7 | After 2 [no-match] | stmts.go:86:10:86:10 | Before 3 | +| stmts.go:86:7:86:7 | Before 2 | stmts.go:86:7:86:7 | 2 | +| stmts.go:86:10:86:10 | 3 | stmts.go:86:10:86:10 | After 3 [match] | +| stmts.go:86:10:86:10 | 3 | stmts.go:86:10:86:10 | After 3 [no-match] | +| stmts.go:86:10:86:10 | After 3 [match] | stmts.go:86:2:87:13 | After case clause [match] | +| stmts.go:86:10:86:10 | After 3 [no-match] | stmts.go:86:2:87:13 | After case clause [no-match] | +| stmts.go:86:10:86:10 | Before 3 | stmts.go:86:10:86:10 | 3 | +| stmts.go:87:3:87:7 | After test5 | stmts.go:87:9:87:12 | Before true | +| stmts.go:87:3:87:7 | Before test5 | stmts.go:87:3:87:7 | test5 | +| stmts.go:87:3:87:7 | test5 | stmts.go:87:3:87:7 | After test5 | +| stmts.go:87:3:87:13 | After call to test5 | stmts.go:87:3:87:13 | After expression statement | +| stmts.go:87:3:87:13 | After expression statement | stmts.go:84:2:88:2 | After expression-switch statement | +| stmts.go:87:3:87:13 | Before call to test5 | stmts.go:87:3:87:7 | Before test5 | +| stmts.go:87:3:87:13 | call to test5 | stmts.go:75:1:109:1 | Exceptional Exit | +| stmts.go:87:3:87:13 | call to test5 | stmts.go:87:3:87:13 | After call to test5 | +| stmts.go:87:3:87:13 | expression statement | stmts.go:87:3:87:13 | Before call to test5 | +| stmts.go:87:9:87:12 | After true | stmts.go:87:3:87:13 | call to test5 | +| stmts.go:87:9:87:12 | Before true | stmts.go:87:9:87:12 | true | +| stmts.go:87:9:87:12 | true | stmts.go:87:9:87:12 | After true | +| stmts.go:90:2:96:2 | After expression-switch statement | stmts.go:98:2:102:2 | expression-switch statement | +| stmts.go:90:2:96:2 | expression-switch statement | stmts.go:90:9:90:9 | Before x | +| stmts.go:90:9:90:9 | After x | stmts.go:91:2:93:13 | case clause | +| stmts.go:90:9:90:9 | Before x | stmts.go:90:9:90:9 | x | +| stmts.go:90:9:90:9 | x | stmts.go:90:9:90:9 | After x | +| stmts.go:91:2:93:13 | After case clause [match] | stmts.go:92:3:92:14 | expression statement | +| stmts.go:91:2:93:13 | After case clause [no-match] | stmts.go:94:2:95:13 | case clause | +| stmts.go:91:2:93:13 | case clause | stmts.go:91:7:91:7 | Before 1 | +| stmts.go:91:7:91:7 | 1 | stmts.go:91:7:91:7 | After 1 [match] | +| stmts.go:91:7:91:7 | 1 | stmts.go:91:7:91:7 | After 1 [no-match] | +| stmts.go:91:7:91:7 | After 1 [match] | stmts.go:91:2:93:13 | After case clause [match] | +| stmts.go:91:7:91:7 | After 1 [no-match] | stmts.go:91:2:93:13 | After case clause [no-match] | +| stmts.go:91:7:91:7 | Before 1 | stmts.go:91:7:91:7 | 1 | +| stmts.go:92:3:92:7 | After test5 | stmts.go:92:9:92:13 | Before false | +| stmts.go:92:3:92:7 | Before test5 | stmts.go:92:3:92:7 | test5 | +| stmts.go:92:3:92:7 | test5 | stmts.go:92:3:92:7 | After test5 | +| stmts.go:92:3:92:14 | After call to test5 | stmts.go:92:3:92:14 | After expression statement | +| stmts.go:92:3:92:14 | After expression statement | stmts.go:93:3:93:13 | fallthrough statement | +| stmts.go:92:3:92:14 | Before call to test5 | stmts.go:92:3:92:7 | Before test5 | +| stmts.go:92:3:92:14 | call to test5 | stmts.go:75:1:109:1 | Exceptional Exit | +| stmts.go:92:3:92:14 | call to test5 | stmts.go:92:3:92:14 | After call to test5 | +| stmts.go:92:3:92:14 | expression statement | stmts.go:92:3:92:14 | Before call to test5 | +| stmts.go:92:9:92:13 | After false | stmts.go:92:3:92:14 | call to test5 | +| stmts.go:92:9:92:13 | Before false | stmts.go:92:9:92:13 | false | +| stmts.go:92:9:92:13 | false | stmts.go:92:9:92:13 | After false | +| stmts.go:93:3:93:13 | fallthrough statement | stmts.go:95:3:95:13 | expression statement | +| stmts.go:94:2:95:13 | After case clause [match] | stmts.go:95:3:95:13 | expression statement | +| stmts.go:94:2:95:13 | After case clause [no-match] | stmts.go:90:2:96:2 | After expression-switch statement | +| stmts.go:94:2:95:13 | case clause | stmts.go:94:7:94:11 | Before ...-... | +| stmts.go:94:7:94:7 | 2 | stmts.go:94:7:94:7 | After 2 | +| stmts.go:94:7:94:7 | After 2 | stmts.go:94:11:94:11 | Before 5 | +| stmts.go:94:7:94:7 | Before 2 | stmts.go:94:7:94:7 | 2 | +| stmts.go:94:7:94:11 | ...-... | stmts.go:94:7:94:11 | After ...-... [match] | +| stmts.go:94:7:94:11 | ...-... | stmts.go:94:7:94:11 | After ...-... [no-match] | +| stmts.go:94:7:94:11 | After ...-... [match] | stmts.go:94:2:95:13 | After case clause [match] | +| stmts.go:94:7:94:11 | After ...-... [no-match] | stmts.go:94:2:95:13 | After case clause [no-match] | +| stmts.go:94:7:94:11 | Before ...-... | stmts.go:94:7:94:7 | Before 2 | +| stmts.go:94:11:94:11 | 5 | stmts.go:94:11:94:11 | After 5 | +| stmts.go:94:11:94:11 | After 5 | stmts.go:94:7:94:11 | ...-... | +| stmts.go:94:11:94:11 | Before 5 | stmts.go:94:11:94:11 | 5 | +| stmts.go:95:3:95:7 | After test5 | stmts.go:95:9:95:12 | Before true | +| stmts.go:95:3:95:7 | Before test5 | stmts.go:95:3:95:7 | test5 | +| stmts.go:95:3:95:7 | test5 | stmts.go:95:3:95:7 | After test5 | +| stmts.go:95:3:95:13 | After call to test5 | stmts.go:95:3:95:13 | After expression statement | +| stmts.go:95:3:95:13 | After expression statement | stmts.go:90:2:96:2 | After expression-switch statement | +| stmts.go:95:3:95:13 | Before call to test5 | stmts.go:95:3:95:7 | Before test5 | +| stmts.go:95:3:95:13 | call to test5 | stmts.go:75:1:109:1 | Exceptional Exit | +| stmts.go:95:3:95:13 | call to test5 | stmts.go:95:3:95:13 | After call to test5 | +| stmts.go:95:3:95:13 | expression statement | stmts.go:95:3:95:13 | Before call to test5 | +| stmts.go:95:9:95:12 | After true | stmts.go:95:3:95:13 | call to test5 | +| stmts.go:95:9:95:12 | Before true | stmts.go:95:9:95:12 | true | +| stmts.go:95:9:95:12 | true | stmts.go:95:9:95:12 | After true | +| stmts.go:98:2:102:2 | After expression-switch statement | stmts.go:104:2:108:2 | expression-switch statement | +| stmts.go:98:2:102:2 | expression-switch statement | stmts.go:98:9:98:9 | Before x | +| stmts.go:98:9:98:9 | After x | stmts.go:100:2:101:13 | case clause | +| stmts.go:98:9:98:9 | Before x | stmts.go:98:9:98:9 | x | +| stmts.go:98:9:98:9 | x | stmts.go:98:9:98:9 | After x | +| stmts.go:99:2:99:9 | After case clause [match] | stmts.go:98:2:102:2 | After expression-switch statement | +| stmts.go:99:2:99:9 | case clause | stmts.go:99:2:99:9 | After case clause [match] | +| stmts.go:100:2:101:13 | After case clause [match] | stmts.go:101:3:101:13 | expression statement | +| stmts.go:100:2:101:13 | After case clause [no-match] | stmts.go:99:2:99:9 | case clause | +| stmts.go:100:2:101:13 | case clause | stmts.go:100:7:100:7 | Before 2 | +| stmts.go:100:7:100:7 | 2 | stmts.go:100:7:100:7 | After 2 [match] | +| stmts.go:100:7:100:7 | 2 | stmts.go:100:7:100:7 | After 2 [no-match] | +| stmts.go:100:7:100:7 | After 2 [match] | stmts.go:100:2:101:13 | After case clause [match] | +| stmts.go:100:7:100:7 | After 2 [no-match] | stmts.go:100:2:101:13 | After case clause [no-match] | +| stmts.go:100:7:100:7 | Before 2 | stmts.go:100:7:100:7 | 2 | +| stmts.go:101:3:101:7 | After test5 | stmts.go:101:9:101:12 | Before true | +| stmts.go:101:3:101:7 | Before test5 | stmts.go:101:3:101:7 | test5 | +| stmts.go:101:3:101:7 | test5 | stmts.go:101:3:101:7 | After test5 | +| stmts.go:101:3:101:13 | After call to test5 | stmts.go:101:3:101:13 | After expression statement | +| stmts.go:101:3:101:13 | After expression statement | stmts.go:98:2:102:2 | After expression-switch statement | +| stmts.go:101:3:101:13 | Before call to test5 | stmts.go:101:3:101:7 | Before test5 | +| stmts.go:101:3:101:13 | call to test5 | stmts.go:75:1:109:1 | Exceptional Exit | +| stmts.go:101:3:101:13 | call to test5 | stmts.go:101:3:101:13 | After call to test5 | +| stmts.go:101:3:101:13 | expression statement | stmts.go:101:3:101:13 | Before call to test5 | +| stmts.go:101:9:101:12 | After true | stmts.go:101:3:101:13 | call to test5 | +| stmts.go:101:9:101:12 | Before true | stmts.go:101:9:101:12 | true | +| stmts.go:101:9:101:12 | true | stmts.go:101:9:101:12 | After true | +| stmts.go:104:2:108:2 | After expression-switch statement | stmts.go:75:19:109:1 | After block statement | +| stmts.go:104:2:108:2 | expression-switch statement | stmts.go:107:2:107:11 | case clause | +| stmts.go:105:2:106:7 | After case clause [match] | stmts.go:106:3:106:7 | Before break statement | +| stmts.go:105:2:106:7 | case clause | stmts.go:105:2:106:7 | After case clause [match] | +| stmts.go:106:3:106:7 | Before break statement | stmts.go:106:3:106:7 | break statement | +| stmts.go:106:3:106:7 | break statement | stmts.go:104:2:108:2 | After expression-switch statement | +| stmts.go:107:2:107:11 | After case clause [match] | stmts.go:104:2:108:2 | After expression-switch statement | +| stmts.go:107:2:107:11 | After case clause [no-match] | stmts.go:105:2:106:7 | case clause | +| stmts.go:107:2:107:11 | case clause | stmts.go:107:7:107:10 | Before true | +| stmts.go:107:7:107:10 | After true [match] | stmts.go:107:2:107:11 | After case clause [match] | +| stmts.go:107:7:107:10 | After true [no-match] | stmts.go:107:2:107:11 | After case clause [no-match] | +| stmts.go:107:7:107:10 | Before true | stmts.go:107:7:107:10 | true | +| stmts.go:107:7:107:10 | true | stmts.go:107:7:107:10 | After true [match] | +| stmts.go:107:7:107:10 | true | stmts.go:107:7:107:10 | After true [no-match] | +| stmts.go:112:1:137:1 | After function declaration | stmts.go:140:1:142:1 | Before function declaration | +| stmts.go:112:1:137:1 | Before function declaration | stmts.go:112:1:137:1 | function declaration | +| stmts.go:112:1:137:1 | Entry | stmts.go:112:12:112:12 | x | +| stmts.go:112:1:137:1 | Exceptional Exit | stmts.go:112:1:137:1 | Exit | +| stmts.go:112:1:137:1 | Normal Exit | stmts.go:112:1:137:1 | Exit | +| stmts.go:112:1:137:1 | function declaration | stmts.go:112:1:137:1 | After function declaration | +| stmts.go:112:12:112:12 | x | stmts.go:112:27:137:1 | block statement | +| stmts.go:112:27:137:1 | After block statement | stmts.go:112:1:137:1 | Normal Exit | +| stmts.go:112:27:137:1 | block statement | stmts.go:113:2:121:2 | type-switch statement | +| stmts.go:113:2:121:2 | After type-switch statement | stmts.go:123:2:131:2 | type-switch statement | +| stmts.go:113:2:121:2 | type-switch statement | stmts.go:113:14:113:21 | Before type assertion | +| stmts.go:113:14:113:14 | After x | stmts.go:113:14:113:21 | type assertion | +| stmts.go:113:14:113:14 | Before x | stmts.go:113:14:113:14 | x | +| stmts.go:113:14:113:14 | x | stmts.go:113:14:113:14 | After x | +| stmts.go:113:14:113:21 | After type assertion | stmts.go:114:2:115:16 | case clause | +| stmts.go:113:14:113:21 | Before type assertion | stmts.go:113:14:113:14 | Before x | +| stmts.go:113:14:113:21 | type assertion | stmts.go:113:14:113:21 | After type assertion | +| stmts.go:114:2:115:16 | After case clause [match] | stmts.go:115:3:115:16 | expression statement | +| stmts.go:114:2:115:16 | After case clause [no-match] | stmts.go:116:2:118:14 | case clause | +| stmts.go:114:2:115:16 | case clause | stmts.go:114:7:114:11 | error | +| stmts.go:114:7:114:11 | After error [match] | stmts.go:114:2:115:16 | After case clause [match] | +| stmts.go:114:7:114:11 | After error [no-match] | stmts.go:114:14:114:19 | string | +| stmts.go:114:7:114:11 | error | stmts.go:114:7:114:11 | After error [match] | +| stmts.go:114:7:114:11 | error | stmts.go:114:7:114:11 | After error [no-match] | +| stmts.go:114:14:114:19 | After string [match] | stmts.go:114:2:115:16 | After case clause [match] | +| stmts.go:114:14:114:19 | After string [no-match] | stmts.go:114:2:115:16 | After case clause [no-match] | +| stmts.go:114:14:114:19 | string | stmts.go:114:14:114:19 | After string [match] | +| stmts.go:114:14:114:19 | string | stmts.go:114:14:114:19 | After string [no-match] | +| stmts.go:115:3:115:13 | After selection of Println | stmts.go:115:15:115:15 | Before y | +| stmts.go:115:3:115:13 | Before selection of Println | stmts.go:115:3:115:13 | selection of Println | +| stmts.go:115:3:115:13 | selection of Println | stmts.go:115:3:115:13 | After selection of Println | +| stmts.go:115:3:115:16 | After call to Println | stmts.go:115:3:115:16 | After expression statement | +| stmts.go:115:3:115:16 | After expression statement | stmts.go:113:2:121:2 | After type-switch statement | +| stmts.go:115:3:115:16 | Before call to Println | stmts.go:115:3:115:13 | Before selection of Println | +| stmts.go:115:3:115:16 | call to Println | stmts.go:112:1:137:1 | Exceptional Exit | +| stmts.go:115:3:115:16 | call to Println | stmts.go:115:3:115:16 | After call to Println | +| stmts.go:115:3:115:16 | expression statement | stmts.go:115:3:115:16 | Before call to Println | +| stmts.go:115:15:115:15 | After y | stmts.go:115:3:115:16 | call to Println | +| stmts.go:115:15:115:15 | Before y | stmts.go:115:15:115:15 | y | +| stmts.go:115:15:115:15 | y | stmts.go:115:15:115:15 | After y | +| stmts.go:116:2:118:14 | After case clause [match] | stmts.go:117:3:117:13 | expression statement | +| stmts.go:116:2:118:14 | After case clause [no-match] | stmts.go:119:2:120:7 | case clause | +| stmts.go:116:2:118:14 | case clause | stmts.go:116:7:116:13 | float32 | +| stmts.go:116:7:116:13 | After float32 [match] | stmts.go:116:2:118:14 | After case clause [match] | +| stmts.go:116:7:116:13 | After float32 [no-match] | stmts.go:116:2:118:14 | After case clause [no-match] | +| stmts.go:116:7:116:13 | float32 | stmts.go:116:7:116:13 | After float32 [match] | +| stmts.go:116:7:116:13 | float32 | stmts.go:116:7:116:13 | After float32 [no-match] | +| stmts.go:117:3:117:7 | After test5 | stmts.go:117:9:117:12 | Before true | +| stmts.go:117:3:117:7 | Before test5 | stmts.go:117:3:117:7 | test5 | +| stmts.go:117:3:117:7 | test5 | stmts.go:117:3:117:7 | After test5 | +| stmts.go:117:3:117:13 | After call to test5 | stmts.go:117:3:117:13 | After expression statement | +| stmts.go:117:3:117:13 | After expression statement | stmts.go:118:3:118:14 | expression statement | +| stmts.go:117:3:117:13 | Before call to test5 | stmts.go:117:3:117:7 | Before test5 | +| stmts.go:117:3:117:13 | call to test5 | stmts.go:112:1:137:1 | Exceptional Exit | +| stmts.go:117:3:117:13 | call to test5 | stmts.go:117:3:117:13 | After call to test5 | +| stmts.go:117:3:117:13 | expression statement | stmts.go:117:3:117:13 | Before call to test5 | +| stmts.go:117:9:117:12 | After true | stmts.go:117:3:117:13 | call to test5 | +| stmts.go:117:9:117:12 | Before true | stmts.go:117:9:117:12 | true | +| stmts.go:117:9:117:12 | true | stmts.go:117:9:117:12 | After true | +| stmts.go:118:3:118:7 | After test5 | stmts.go:118:9:118:13 | Before false | +| stmts.go:118:3:118:7 | Before test5 | stmts.go:118:3:118:7 | test5 | +| stmts.go:118:3:118:7 | test5 | stmts.go:118:3:118:7 | After test5 | +| stmts.go:118:3:118:14 | After call to test5 | stmts.go:118:3:118:14 | After expression statement | +| stmts.go:118:3:118:14 | After expression statement | stmts.go:113:2:121:2 | After type-switch statement | +| stmts.go:118:3:118:14 | Before call to test5 | stmts.go:118:3:118:7 | Before test5 | +| stmts.go:118:3:118:14 | call to test5 | stmts.go:112:1:137:1 | Exceptional Exit | +| stmts.go:118:3:118:14 | call to test5 | stmts.go:118:3:118:14 | After call to test5 | +| stmts.go:118:3:118:14 | expression statement | stmts.go:118:3:118:14 | Before call to test5 | +| stmts.go:118:9:118:13 | After false | stmts.go:118:3:118:14 | call to test5 | +| stmts.go:118:9:118:13 | Before false | stmts.go:118:9:118:13 | false | +| stmts.go:118:9:118:13 | false | stmts.go:118:9:118:13 | After false | +| stmts.go:119:2:120:7 | After case clause [match] | stmts.go:120:3:120:7 | ... = ... | +| stmts.go:119:2:120:7 | case clause | stmts.go:119:2:120:7 | After case clause [match] | +| stmts.go:120:3:120:7 | ... = ... | stmts.go:120:7:120:7 | Before y | +| stmts.go:120:3:120:7 | After ... = ... | stmts.go:113:2:121:2 | After type-switch statement | +| stmts.go:120:7:120:7 | After y | stmts.go:120:3:120:7 | After ... = ... | +| stmts.go:120:7:120:7 | Before y | stmts.go:120:7:120:7 | y | +| stmts.go:120:7:120:7 | y | stmts.go:120:7:120:7 | After y | +| stmts.go:123:2:131:2 | After type-switch statement | stmts.go:133:2:136:2 | type-switch statement | +| stmts.go:123:2:131:2 | type-switch statement | stmts.go:123:9:123:14 | ... := ... | +| stmts.go:123:9:123:14 | ... := ... | stmts.go:123:14:123:14 | Before x | +| stmts.go:123:9:123:14 | After ... := ... | stmts.go:123:17:123:24 | Before type assertion | +| stmts.go:123:9:123:14 | assign:0 ... := ... | stmts.go:123:9:123:14 | After ... := ... | +| stmts.go:123:14:123:14 | After x | stmts.go:123:9:123:14 | assign:0 ... := ... | +| stmts.go:123:14:123:14 | Before x | stmts.go:123:14:123:14 | x | +| stmts.go:123:14:123:14 | x | stmts.go:123:14:123:14 | After x | +| stmts.go:123:17:123:17 | After y | stmts.go:123:17:123:24 | type assertion | +| stmts.go:123:17:123:17 | Before y | stmts.go:123:17:123:17 | y | +| stmts.go:123:17:123:17 | y | stmts.go:123:17:123:17 | After y | +| stmts.go:123:17:123:24 | After type assertion | stmts.go:124:2:125:16 | case clause | +| stmts.go:123:17:123:24 | Before type assertion | stmts.go:123:17:123:17 | Before y | +| stmts.go:123:17:123:24 | type assertion | stmts.go:123:17:123:24 | After type assertion | +| stmts.go:124:2:125:16 | After case clause [match] | stmts.go:125:3:125:16 | expression statement | +| stmts.go:124:2:125:16 | After case clause [no-match] | stmts.go:126:2:128:14 | case clause | +| stmts.go:124:2:125:16 | case clause | stmts.go:124:7:124:11 | error | +| stmts.go:124:7:124:11 | After error [match] | stmts.go:124:2:125:16 | After case clause [match] | +| stmts.go:124:7:124:11 | After error [no-match] | stmts.go:124:14:124:19 | string | +| stmts.go:124:7:124:11 | error | stmts.go:124:7:124:11 | After error [match] | +| stmts.go:124:7:124:11 | error | stmts.go:124:7:124:11 | After error [no-match] | +| stmts.go:124:14:124:19 | After string [match] | stmts.go:124:2:125:16 | After case clause [match] | +| stmts.go:124:14:124:19 | After string [no-match] | stmts.go:124:2:125:16 | After case clause [no-match] | +| stmts.go:124:14:124:19 | string | stmts.go:124:14:124:19 | After string [match] | +| stmts.go:124:14:124:19 | string | stmts.go:124:14:124:19 | After string [no-match] | +| stmts.go:125:3:125:13 | After selection of Println | stmts.go:125:15:125:15 | Before y | +| stmts.go:125:3:125:13 | Before selection of Println | stmts.go:125:3:125:13 | selection of Println | +| stmts.go:125:3:125:13 | selection of Println | stmts.go:125:3:125:13 | After selection of Println | +| stmts.go:125:3:125:16 | After call to Println | stmts.go:125:3:125:16 | After expression statement | +| stmts.go:125:3:125:16 | After expression statement | stmts.go:123:2:131:2 | After type-switch statement | +| stmts.go:125:3:125:16 | Before call to Println | stmts.go:125:3:125:13 | Before selection of Println | +| stmts.go:125:3:125:16 | call to Println | stmts.go:112:1:137:1 | Exceptional Exit | +| stmts.go:125:3:125:16 | call to Println | stmts.go:125:3:125:16 | After call to Println | +| stmts.go:125:3:125:16 | expression statement | stmts.go:125:3:125:16 | Before call to Println | +| stmts.go:125:15:125:15 | After y | stmts.go:125:3:125:16 | call to Println | +| stmts.go:125:15:125:15 | Before y | stmts.go:125:15:125:15 | y | +| stmts.go:125:15:125:15 | y | stmts.go:125:15:125:15 | After y | +| stmts.go:126:2:128:14 | After case clause [match] | stmts.go:127:3:127:13 | expression statement | +| stmts.go:126:2:128:14 | After case clause [no-match] | stmts.go:129:2:130:7 | case clause | +| stmts.go:126:2:128:14 | case clause | stmts.go:126:7:126:13 | float32 | +| stmts.go:126:7:126:13 | After float32 [match] | stmts.go:126:2:128:14 | After case clause [match] | +| stmts.go:126:7:126:13 | After float32 [no-match] | stmts.go:126:2:128:14 | After case clause [no-match] | +| stmts.go:126:7:126:13 | float32 | stmts.go:126:7:126:13 | After float32 [match] | +| stmts.go:126:7:126:13 | float32 | stmts.go:126:7:126:13 | After float32 [no-match] | +| stmts.go:127:3:127:7 | After test5 | stmts.go:127:9:127:12 | Before true | +| stmts.go:127:3:127:7 | Before test5 | stmts.go:127:3:127:7 | test5 | +| stmts.go:127:3:127:7 | test5 | stmts.go:127:3:127:7 | After test5 | +| stmts.go:127:3:127:13 | After call to test5 | stmts.go:127:3:127:13 | After expression statement | +| stmts.go:127:3:127:13 | After expression statement | stmts.go:128:3:128:14 | expression statement | +| stmts.go:127:3:127:13 | Before call to test5 | stmts.go:127:3:127:7 | Before test5 | +| stmts.go:127:3:127:13 | call to test5 | stmts.go:112:1:137:1 | Exceptional Exit | +| stmts.go:127:3:127:13 | call to test5 | stmts.go:127:3:127:13 | After call to test5 | +| stmts.go:127:3:127:13 | expression statement | stmts.go:127:3:127:13 | Before call to test5 | +| stmts.go:127:9:127:12 | After true | stmts.go:127:3:127:13 | call to test5 | +| stmts.go:127:9:127:12 | Before true | stmts.go:127:9:127:12 | true | +| stmts.go:127:9:127:12 | true | stmts.go:127:9:127:12 | After true | +| stmts.go:128:3:128:7 | After test5 | stmts.go:128:9:128:13 | Before false | +| stmts.go:128:3:128:7 | Before test5 | stmts.go:128:3:128:7 | test5 | +| stmts.go:128:3:128:7 | test5 | stmts.go:128:3:128:7 | After test5 | +| stmts.go:128:3:128:14 | After call to test5 | stmts.go:128:3:128:14 | After expression statement | +| stmts.go:128:3:128:14 | After expression statement | stmts.go:123:2:131:2 | After type-switch statement | +| stmts.go:128:3:128:14 | Before call to test5 | stmts.go:128:3:128:7 | Before test5 | +| stmts.go:128:3:128:14 | call to test5 | stmts.go:112:1:137:1 | Exceptional Exit | +| stmts.go:128:3:128:14 | call to test5 | stmts.go:128:3:128:14 | After call to test5 | +| stmts.go:128:3:128:14 | expression statement | stmts.go:128:3:128:14 | Before call to test5 | +| stmts.go:128:9:128:13 | After false | stmts.go:128:3:128:14 | call to test5 | +| stmts.go:128:9:128:13 | Before false | stmts.go:128:9:128:13 | false | +| stmts.go:128:9:128:13 | false | stmts.go:128:9:128:13 | After false | +| stmts.go:129:2:130:7 | After case clause [match] | stmts.go:130:3:130:7 | ... = ... | +| stmts.go:129:2:130:7 | case clause | stmts.go:129:2:130:7 | After case clause [match] | +| stmts.go:130:3:130:7 | ... = ... | stmts.go:130:7:130:7 | Before y | +| stmts.go:130:3:130:7 | After ... = ... | stmts.go:123:2:131:2 | After type-switch statement | +| stmts.go:130:7:130:7 | After y | stmts.go:130:3:130:7 | After ... = ... | +| stmts.go:130:7:130:7 | Before y | stmts.go:130:7:130:7 | y | +| stmts.go:130:7:130:7 | y | stmts.go:130:7:130:7 | After y | +| stmts.go:133:2:136:2 | After type-switch statement | stmts.go:112:27:137:1 | After block statement | +| stmts.go:133:2:136:2 | type-switch statement | stmts.go:133:9:133:14 | ... := ... | +| stmts.go:133:9:133:14 | ... := ... | stmts.go:133:14:133:14 | Before x | +| stmts.go:133:9:133:14 | After ... := ... | stmts.go:133:17:133:24 | Before type assertion | +| stmts.go:133:9:133:14 | assign:0 ... := ... | stmts.go:133:9:133:14 | After ... := ... | +| stmts.go:133:14:133:14 | After x | stmts.go:133:9:133:14 | assign:0 ... := ... | +| stmts.go:133:14:133:14 | Before x | stmts.go:133:14:133:14 | x | +| stmts.go:133:14:133:14 | x | stmts.go:133:14:133:14 | After x | +| stmts.go:133:17:133:17 | After y | stmts.go:133:17:133:24 | type assertion | +| stmts.go:133:17:133:17 | Before y | stmts.go:133:17:133:17 | y | +| stmts.go:133:17:133:17 | y | stmts.go:133:17:133:17 | After y | +| stmts.go:133:17:133:24 | After type assertion | stmts.go:134:2:135:14 | case clause | +| stmts.go:133:17:133:24 | Before type assertion | stmts.go:133:17:133:17 | Before y | +| stmts.go:133:17:133:24 | type assertion | stmts.go:133:17:133:24 | After type assertion | +| stmts.go:134:2:135:14 | After case clause [match] | stmts.go:135:3:135:14 | expression statement | +| stmts.go:134:2:135:14 | case clause | stmts.go:134:2:135:14 | After case clause [match] | +| stmts.go:135:3:135:7 | After test5 | stmts.go:135:9:135:13 | Before false | +| stmts.go:135:3:135:7 | Before test5 | stmts.go:135:3:135:7 | test5 | +| stmts.go:135:3:135:7 | test5 | stmts.go:135:3:135:7 | After test5 | +| stmts.go:135:3:135:14 | After call to test5 | stmts.go:135:3:135:14 | After expression statement | +| stmts.go:135:3:135:14 | After expression statement | stmts.go:133:2:136:2 | After type-switch statement | +| stmts.go:135:3:135:14 | Before call to test5 | stmts.go:135:3:135:7 | Before test5 | +| stmts.go:135:3:135:14 | call to test5 | stmts.go:112:1:137:1 | Exceptional Exit | +| stmts.go:135:3:135:14 | call to test5 | stmts.go:135:3:135:14 | After call to test5 | +| stmts.go:135:3:135:14 | expression statement | stmts.go:135:3:135:14 | Before call to test5 | +| stmts.go:135:9:135:13 | After false | stmts.go:135:3:135:14 | call to test5 | +| stmts.go:135:9:135:13 | Before false | stmts.go:135:9:135:13 | false | +| stmts.go:135:9:135:13 | false | stmts.go:135:9:135:13 | After false | +| stmts.go:140:1:142:1 | After function declaration | stmts.go:145:1:159:1 | Before function declaration | +| stmts.go:140:1:142:1 | Before function declaration | stmts.go:140:1:142:1 | function declaration | +| stmts.go:140:1:142:1 | Entry | stmts.go:140:13:140:13 | f | +| stmts.go:140:1:142:1 | Exceptional Exit | stmts.go:140:1:142:1 | Exit | +| stmts.go:140:1:142:1 | Normal Exit | stmts.go:140:1:142:1 | Exit | +| stmts.go:140:1:142:1 | function declaration | stmts.go:140:1:142:1 | After function declaration | +| stmts.go:140:13:140:13 | f | stmts.go:140:23:142:1 | block statement | +| stmts.go:140:23:142:1 | After block statement | stmts.go:140:1:142:1 | Normal Exit | +| stmts.go:140:23:142:1 | block statement | stmts.go:141:2:141:7 | Before go statement | +| stmts.go:141:2:141:7 | After go statement | stmts.go:140:23:142:1 | After block statement | +| stmts.go:141:2:141:7 | Before go statement | stmts.go:141:5:141:7 | Before call to f | +| stmts.go:141:2:141:7 | go statement | stmts.go:141:2:141:7 | After go statement | +| stmts.go:141:5:141:5 | After f | stmts.go:141:5:141:7 | call to f | +| stmts.go:141:5:141:5 | Before f | stmts.go:141:5:141:5 | f | +| stmts.go:141:5:141:5 | f | stmts.go:141:5:141:5 | After f | +| stmts.go:141:5:141:7 | After call to f | stmts.go:141:2:141:7 | go statement | +| stmts.go:141:5:141:7 | Before call to f | stmts.go:141:5:141:5 | Before f | +| stmts.go:141:5:141:7 | call to f | stmts.go:140:1:142:1 | Exceptional Exit | +| stmts.go:141:5:141:7 | call to f | stmts.go:141:5:141:7 | After call to f | +| stmts.go:145:1:159:1 | After function declaration | stmts.go:0:0:0:0 | After stmts.go | +| stmts.go:145:1:159:1 | Before function declaration | stmts.go:145:1:159:1 | function declaration | +| stmts.go:145:1:159:1 | Entry | stmts.go:145:13:145:14 | xs | +| stmts.go:145:1:159:1 | Exceptional Exit | stmts.go:145:1:159:1 | Exit | +| stmts.go:145:1:159:1 | Normal Exit | stmts.go:145:1:159:1 | Exit | +| stmts.go:145:1:159:1 | function declaration | stmts.go:145:1:159:1 | After function declaration | +| stmts.go:145:13:145:14 | xs | stmts.go:145:23:159:1 | block statement | +| stmts.go:145:23:159:1 | After block statement | stmts.go:145:1:159:1 | Normal Exit | +| stmts.go:145:23:159:1 | block statement | stmts.go:146:2:151:2 | range statement | +| stmts.go:146:2:151:2 | After range element | stmts.go:146:20:151:2 | block statement | +| stmts.go:146:2:151:2 | After range statement | stmts.go:153:2:155:2 | range statement | +| stmts.go:146:2:151:2 | [LoopHeader] range statement | stmts.go:146:2:151:2 | After range statement | +| stmts.go:146:2:151:2 | [LoopHeader] range statement | stmts.go:146:2:151:2 | range element | +| stmts.go:146:2:151:2 | assign:0 range element | stmts.go:146:2:151:2 | After range element | +| stmts.go:146:2:151:2 | extract:0 range element | stmts.go:146:2:151:2 | assign:0 range element | +| stmts.go:146:2:151:2 | next range element | stmts.go:146:2:151:2 | extract:0 range element | +| stmts.go:146:2:151:2 | range element | stmts.go:146:2:151:2 | next range element | +| stmts.go:146:2:151:2 | range statement | stmts.go:146:17:146:18 | Before xs | +| stmts.go:146:17:146:18 | After xs [empty] | stmts.go:146:2:151:2 | After range statement | +| stmts.go:146:17:146:18 | After xs [non-empty] | stmts.go:146:2:151:2 | range element | +| stmts.go:146:17:146:18 | Before xs | stmts.go:146:17:146:18 | xs | +| stmts.go:146:17:146:18 | xs | stmts.go:146:17:146:18 | After xs [empty] | +| stmts.go:146:17:146:18 | xs | stmts.go:146:17:146:18 | After xs [non-empty] | +| stmts.go:146:20:151:2 | After block statement | stmts.go:146:2:151:2 | [LoopHeader] range statement | +| stmts.go:146:20:151:2 | block statement | stmts.go:147:3:149:3 | if statement | +| stmts.go:147:3:149:3 | After if statement | stmts.go:150:3:150:14 | expression statement | +| stmts.go:147:3:149:3 | if statement | stmts.go:147:6:147:10 | Before ...>... | +| stmts.go:147:6:147:6 | After x | stmts.go:147:10:147:10 | Before 5 | +| stmts.go:147:6:147:6 | Before x | stmts.go:147:6:147:6 | x | +| stmts.go:147:6:147:6 | x | stmts.go:147:6:147:6 | After x | +| stmts.go:147:6:147:10 | ...>... | stmts.go:147:6:147:10 | After ...>... [false] | +| stmts.go:147:6:147:10 | ...>... | stmts.go:147:6:147:10 | After ...>... [true] | +| stmts.go:147:6:147:10 | After ...>... [false] | stmts.go:147:3:149:3 | After if statement | +| stmts.go:147:6:147:10 | After ...>... [true] | stmts.go:147:12:149:3 | block statement | +| stmts.go:147:6:147:10 | Before ...>... | stmts.go:147:6:147:6 | Before x | +| stmts.go:147:10:147:10 | 5 | stmts.go:147:10:147:10 | After 5 | +| stmts.go:147:10:147:10 | After 5 | stmts.go:147:6:147:10 | ...>... | +| stmts.go:147:10:147:10 | Before 5 | stmts.go:147:10:147:10 | 5 | +| stmts.go:147:12:149:3 | block statement | stmts.go:148:4:148:11 | Before continue statement | +| stmts.go:148:4:148:11 | Before continue statement | stmts.go:148:4:148:11 | continue statement | +| stmts.go:148:4:148:11 | continue statement | stmts.go:146:2:151:2 | [LoopHeader] range statement | +| stmts.go:150:3:150:11 | After selection of Print | stmts.go:150:13:150:13 | Before x | +| stmts.go:150:3:150:11 | Before selection of Print | stmts.go:150:3:150:11 | selection of Print | +| stmts.go:150:3:150:11 | selection of Print | stmts.go:150:3:150:11 | After selection of Print | +| stmts.go:150:3:150:14 | After call to Print | stmts.go:150:3:150:14 | After expression statement | +| stmts.go:150:3:150:14 | After expression statement | stmts.go:146:20:151:2 | After block statement | +| stmts.go:150:3:150:14 | Before call to Print | stmts.go:150:3:150:11 | Before selection of Print | +| stmts.go:150:3:150:14 | call to Print | stmts.go:145:1:159:1 | Exceptional Exit | +| stmts.go:150:3:150:14 | call to Print | stmts.go:150:3:150:14 | After call to Print | +| stmts.go:150:3:150:14 | expression statement | stmts.go:150:3:150:14 | Before call to Print | +| stmts.go:150:13:150:13 | After x | stmts.go:150:3:150:14 | call to Print | +| stmts.go:150:13:150:13 | Before x | stmts.go:150:13:150:13 | x | +| stmts.go:150:13:150:13 | x | stmts.go:150:13:150:13 | After x | +| stmts.go:153:2:155:2 | After range element | stmts.go:153:23:155:2 | block statement | +| stmts.go:153:2:155:2 | After range statement | stmts.go:157:2:158:2 | range statement | +| stmts.go:153:2:155:2 | [LoopHeader] range statement | stmts.go:153:2:155:2 | After range statement | +| stmts.go:153:2:155:2 | [LoopHeader] range statement | stmts.go:153:2:155:2 | range element | +| stmts.go:153:2:155:2 | assign:0 range element | stmts.go:153:2:155:2 | extract:1 range element | +| stmts.go:153:2:155:2 | assign:1 range element | stmts.go:153:2:155:2 | After range element | +| stmts.go:153:2:155:2 | extract:0 range element | stmts.go:153:2:155:2 | assign:0 range element | +| stmts.go:153:2:155:2 | extract:1 range element | stmts.go:153:2:155:2 | assign:1 range element | +| stmts.go:153:2:155:2 | next range element | stmts.go:153:2:155:2 | extract:0 range element | +| stmts.go:153:2:155:2 | range element | stmts.go:153:2:155:2 | next range element | +| stmts.go:153:2:155:2 | range statement | stmts.go:153:20:153:21 | Before xs | +| stmts.go:153:20:153:21 | After xs [empty] | stmts.go:153:2:155:2 | After range statement | +| stmts.go:153:20:153:21 | After xs [non-empty] | stmts.go:153:2:155:2 | range element | +| stmts.go:153:20:153:21 | Before xs | stmts.go:153:20:153:21 | xs | +| stmts.go:153:20:153:21 | xs | stmts.go:153:20:153:21 | After xs [empty] | +| stmts.go:153:20:153:21 | xs | stmts.go:153:20:153:21 | After xs [non-empty] | +| stmts.go:153:23:155:2 | After block statement | stmts.go:153:2:155:2 | [LoopHeader] range statement | +| stmts.go:153:23:155:2 | block statement | stmts.go:154:3:154:17 | expression statement | +| stmts.go:154:3:154:11 | After selection of Print | stmts.go:154:13:154:13 | Before i | +| stmts.go:154:3:154:11 | Before selection of Print | stmts.go:154:3:154:11 | selection of Print | +| stmts.go:154:3:154:11 | selection of Print | stmts.go:154:3:154:11 | After selection of Print | +| stmts.go:154:3:154:17 | After call to Print | stmts.go:154:3:154:17 | After expression statement | +| stmts.go:154:3:154:17 | After expression statement | stmts.go:153:23:155:2 | After block statement | +| stmts.go:154:3:154:17 | Before call to Print | stmts.go:154:3:154:11 | Before selection of Print | +| stmts.go:154:3:154:17 | call to Print | stmts.go:145:1:159:1 | Exceptional Exit | +| stmts.go:154:3:154:17 | call to Print | stmts.go:154:3:154:17 | After call to Print | +| stmts.go:154:3:154:17 | expression statement | stmts.go:154:3:154:17 | Before call to Print | +| stmts.go:154:13:154:13 | After i | stmts.go:154:16:154:16 | Before v | +| stmts.go:154:13:154:13 | Before i | stmts.go:154:13:154:13 | i | +| stmts.go:154:13:154:13 | i | stmts.go:154:13:154:13 | After i | +| stmts.go:154:16:154:16 | After v | stmts.go:154:3:154:17 | call to Print | +| stmts.go:154:16:154:16 | Before v | stmts.go:154:16:154:16 | v | +| stmts.go:154:16:154:16 | v | stmts.go:154:16:154:16 | After v | +| stmts.go:157:2:158:2 | After range element | stmts.go:157:15:158:2 | block statement | +| stmts.go:157:2:158:2 | After range statement | stmts.go:145:23:159:1 | After block statement | +| stmts.go:157:2:158:2 | [LoopHeader] range statement | stmts.go:157:2:158:2 | After range statement | +| stmts.go:157:2:158:2 | [LoopHeader] range statement | stmts.go:157:2:158:2 | range element | +| stmts.go:157:2:158:2 | next range element | stmts.go:157:2:158:2 | After range element | +| stmts.go:157:2:158:2 | range element | stmts.go:157:2:158:2 | next range element | +| stmts.go:157:2:158:2 | range statement | stmts.go:157:12:157:13 | Before xs | +| stmts.go:157:12:157:13 | After xs [empty] | stmts.go:157:2:158:2 | After range statement | +| stmts.go:157:12:157:13 | After xs [non-empty] | stmts.go:157:2:158:2 | range element | +| stmts.go:157:12:157:13 | Before xs | stmts.go:157:12:157:13 | xs | +| stmts.go:157:12:157:13 | xs | stmts.go:157:12:157:13 | After xs [empty] | +| stmts.go:157:12:157:13 | xs | stmts.go:157:12:157:13 | After xs [non-empty] | +| stmts.go:157:15:158:2 | block statement | stmts.go:157:2:158:2 | [LoopHeader] range statement | +| tst.go:0:0:0:0 | After tst.go | tst.go:0:0:0:0 | Normal Exit | +| tst.go:0:0:0:0 | Entry | tst.go:0:0:0:0 | tst.go | +| tst.go:0:0:0:0 | Normal Exit | tst.go:0:0:0:0 | Exit | +| tst.go:0:0:0:0 | tst.go | tst.go:3:1:12:1 | Before function declaration | +| tst.go:3:1:12:1 | After function declaration | tst.go:14:1:21:1 | Before function declaration | +| tst.go:3:1:12:1 | Before function declaration | tst.go:3:1:12:1 | function declaration | +| tst.go:3:1:12:1 | Entry | tst.go:3:12:3:12 | x | +| tst.go:3:1:12:1 | Normal Exit | tst.go:3:1:12:1 | Exit | +| tst.go:3:1:12:1 | function declaration | tst.go:3:1:12:1 | After function declaration | +| tst.go:3:12:3:12 | x | tst.go:3:19:12:1 | block statement | +| tst.go:3:19:12:1 | After block statement | tst.go:3:1:12:1 | Normal Exit | +| tst.go:3:19:12:1 | block statement | tst.go:4:2:11:2 | expression-switch statement | +| tst.go:4:2:11:2 | After expression-switch statement | tst.go:3:19:12:1 | After block statement | +| tst.go:4:2:11:2 | expression-switch statement | tst.go:5:2:5:13 | case clause | +| tst.go:5:2:5:13 | After case clause [match] | tst.go:4:2:11:2 | After expression-switch statement | +| tst.go:5:2:5:13 | After case clause [no-match] | tst.go:7:2:7:13 | case clause | +| tst.go:5:2:5:13 | case clause | tst.go:5:7:5:12 | Before ...<... | +| tst.go:5:7:5:7 | After x | tst.go:5:11:5:12 | Before 23 | +| tst.go:5:7:5:7 | Before x | tst.go:5:7:5:7 | x | +| tst.go:5:7:5:7 | x | tst.go:5:7:5:7 | After x | +| tst.go:5:7:5:12 | ...<... | tst.go:5:7:5:12 | After ...<... [match] | +| tst.go:5:7:5:12 | ...<... | tst.go:5:7:5:12 | After ...<... [no-match] | +| tst.go:5:7:5:12 | After ...<... [match] | tst.go:5:2:5:13 | After case clause [match] | +| tst.go:5:7:5:12 | After ...<... [no-match] | tst.go:5:2:5:13 | After case clause [no-match] | +| tst.go:5:7:5:12 | Before ...<... | tst.go:5:7:5:7 | Before x | +| tst.go:5:11:5:12 | 23 | tst.go:5:11:5:12 | After 23 | +| tst.go:5:11:5:12 | After 23 | tst.go:5:7:5:12 | ...<... | +| tst.go:5:11:5:12 | Before 23 | tst.go:5:11:5:12 | 23 | +| tst.go:7:2:7:13 | After case clause [match] | tst.go:4:2:11:2 | After expression-switch statement | +| tst.go:7:2:7:13 | After case clause [no-match] | tst.go:9:2:9:13 | case clause | +| tst.go:7:2:7:13 | case clause | tst.go:7:7:7:12 | Before ...<... | +| tst.go:7:7:7:7 | After x | tst.go:7:11:7:12 | Before 42 | +| tst.go:7:7:7:7 | Before x | tst.go:7:7:7:7 | x | +| tst.go:7:7:7:7 | x | tst.go:7:7:7:7 | After x | +| tst.go:7:7:7:12 | ...<... | tst.go:7:7:7:12 | After ...<... [match] | +| tst.go:7:7:7:12 | ...<... | tst.go:7:7:7:12 | After ...<... [no-match] | +| tst.go:7:7:7:12 | After ...<... [match] | tst.go:7:2:7:13 | After case clause [match] | +| tst.go:7:7:7:12 | After ...<... [no-match] | tst.go:7:2:7:13 | After case clause [no-match] | +| tst.go:7:7:7:12 | Before ...<... | tst.go:7:7:7:7 | Before x | +| tst.go:7:11:7:12 | 42 | tst.go:7:11:7:12 | After 42 | +| tst.go:7:11:7:12 | After 42 | tst.go:7:7:7:12 | ...<... | +| tst.go:7:11:7:12 | Before 42 | tst.go:7:11:7:12 | 42 | +| tst.go:9:2:9:13 | After case clause [match] | tst.go:4:2:11:2 | After expression-switch statement | +| tst.go:9:2:9:13 | After case clause [no-match] | tst.go:4:2:11:2 | After expression-switch statement | +| tst.go:9:2:9:13 | case clause | tst.go:9:7:9:12 | Before ...<... | +| tst.go:9:7:9:7 | After x | tst.go:9:11:9:12 | Before 23 | +| tst.go:9:7:9:7 | Before x | tst.go:9:7:9:7 | x | +| tst.go:9:7:9:7 | x | tst.go:9:7:9:7 | After x | +| tst.go:9:7:9:12 | ...<... | tst.go:9:7:9:12 | After ...<... [match] | +| tst.go:9:7:9:12 | ...<... | tst.go:9:7:9:12 | After ...<... [no-match] | +| tst.go:9:7:9:12 | After ...<... [match] | tst.go:9:2:9:13 | After case clause [match] | +| tst.go:9:7:9:12 | After ...<... [no-match] | tst.go:9:2:9:13 | After case clause [no-match] | +| tst.go:9:7:9:12 | Before ...<... | tst.go:9:7:9:7 | Before x | +| tst.go:9:11:9:12 | 23 | tst.go:9:11:9:12 | After 23 | +| tst.go:9:11:9:12 | After 23 | tst.go:9:7:9:12 | ...<... | +| tst.go:9:11:9:12 | Before 23 | tst.go:9:11:9:12 | 23 | +| tst.go:14:1:21:1 | After function declaration | tst.go:23:1:26:1 | Before function declaration | +| tst.go:14:1:21:1 | Before function declaration | tst.go:14:1:21:1 | function declaration | +| tst.go:14:1:21:1 | Entry | tst.go:14:13:14:17 | value | +| tst.go:14:1:21:1 | Normal Exit | tst.go:14:1:21:1 | Exit | +| tst.go:14:1:21:1 | function declaration | tst.go:14:1:21:1 | After function declaration | +| tst.go:14:13:14:17 | value | tst.go:14:26:21:1 | block statement | +| tst.go:14:26:21:1 | After block statement | tst.go:14:1:21:1 | Normal Exit | +| tst.go:14:26:21:1 | block statement | tst.go:15:2:20:2 | expression-switch statement | +| tst.go:15:2:20:2 | After expression-switch statement | tst.go:14:26:21:1 | After block statement | +| tst.go:15:2:20:2 | expression-switch statement | tst.go:16:2:16:34 | case clause | +| tst.go:16:2:16:34 | After case clause [match] | tst.go:15:2:20:2 | After expression-switch statement | +| tst.go:16:2:16:34 | After case clause [no-match] | tst.go:18:2:18:39 | case clause | +| tst.go:16:2:16:34 | case clause | tst.go:16:7:16:33 | Before ...<... | +| tst.go:16:7:16:11 | After value | tst.go:16:15:16:33 | Before ...*... | +| tst.go:16:7:16:11 | Before value | tst.go:16:7:16:11 | value | +| tst.go:16:7:16:11 | value | tst.go:16:7:16:11 | After value | +| tst.go:16:7:16:33 | ...<... | tst.go:16:7:16:33 | After ...<... [match] | +| tst.go:16:7:16:33 | ...<... | tst.go:16:7:16:33 | After ...<... [no-match] | +| tst.go:16:7:16:33 | After ...<... [match] | tst.go:16:2:16:34 | After case clause [match] | +| tst.go:16:7:16:33 | After ...<... [no-match] | tst.go:16:2:16:34 | After case clause [no-match] | +| tst.go:16:7:16:33 | Before ...<... | tst.go:16:7:16:11 | Before value | +| tst.go:16:15:16:18 | 1024 | tst.go:16:15:16:18 | After 1024 | +| tst.go:16:15:16:18 | After 1024 | tst.go:16:20:16:23 | Before 1024 | +| tst.go:16:15:16:18 | Before 1024 | tst.go:16:15:16:18 | 1024 | +| tst.go:16:15:16:23 | ...*... | tst.go:16:15:16:23 | After ...*... | +| tst.go:16:15:16:23 | After ...*... | tst.go:16:25:16:28 | Before 1024 | +| tst.go:16:15:16:23 | Before ...*... | tst.go:16:15:16:18 | Before 1024 | +| tst.go:16:15:16:28 | ...*... | tst.go:16:15:16:28 | After ...*... | +| tst.go:16:15:16:28 | After ...*... | tst.go:16:30:16:33 | Before 1024 | +| tst.go:16:15:16:28 | Before ...*... | tst.go:16:15:16:23 | Before ...*... | +| tst.go:16:15:16:33 | ...*... | tst.go:16:15:16:33 | After ...*... | +| tst.go:16:15:16:33 | After ...*... | tst.go:16:7:16:33 | ...<... | +| tst.go:16:15:16:33 | Before ...*... | tst.go:16:15:16:28 | Before ...*... | +| tst.go:16:20:16:23 | 1024 | tst.go:16:20:16:23 | After 1024 | +| tst.go:16:20:16:23 | After 1024 | tst.go:16:15:16:23 | ...*... | +| tst.go:16:20:16:23 | Before 1024 | tst.go:16:20:16:23 | 1024 | +| tst.go:16:25:16:28 | 1024 | tst.go:16:25:16:28 | After 1024 | +| tst.go:16:25:16:28 | After 1024 | tst.go:16:15:16:28 | ...*... | +| tst.go:16:25:16:28 | Before 1024 | tst.go:16:25:16:28 | 1024 | +| tst.go:16:30:16:33 | 1024 | tst.go:16:30:16:33 | After 1024 | +| tst.go:16:30:16:33 | After 1024 | tst.go:16:15:16:33 | ...*... | +| tst.go:16:30:16:33 | Before 1024 | tst.go:16:30:16:33 | 1024 | +| tst.go:18:2:18:39 | After case clause [match] | tst.go:15:2:20:2 | After expression-switch statement | +| tst.go:18:2:18:39 | After case clause [no-match] | tst.go:15:2:20:2 | After expression-switch statement | +| tst.go:18:2:18:39 | case clause | tst.go:18:7:18:38 | Before ...<... | +| tst.go:18:7:18:11 | After value | tst.go:18:15:18:38 | Before ...*... | +| tst.go:18:7:18:11 | Before value | tst.go:18:7:18:11 | value | +| tst.go:18:7:18:11 | value | tst.go:18:7:18:11 | After value | +| tst.go:18:7:18:38 | ...<... | tst.go:18:7:18:38 | After ...<... [match] | +| tst.go:18:7:18:38 | ...<... | tst.go:18:7:18:38 | After ...<... [no-match] | +| tst.go:18:7:18:38 | After ...<... [match] | tst.go:18:2:18:39 | After case clause [match] | +| tst.go:18:7:18:38 | After ...<... [no-match] | tst.go:18:2:18:39 | After case clause [no-match] | +| tst.go:18:7:18:38 | Before ...<... | tst.go:18:7:18:11 | Before value | +| tst.go:18:15:18:18 | 1024 | tst.go:18:15:18:18 | After 1024 | +| tst.go:18:15:18:18 | After 1024 | tst.go:18:20:18:23 | Before 1024 | +| tst.go:18:15:18:18 | Before 1024 | tst.go:18:15:18:18 | 1024 | +| tst.go:18:15:18:23 | ...*... | tst.go:18:15:18:23 | After ...*... | +| tst.go:18:15:18:23 | After ...*... | tst.go:18:25:18:28 | Before 1024 | +| tst.go:18:15:18:23 | Before ...*... | tst.go:18:15:18:18 | Before 1024 | +| tst.go:18:15:18:28 | ...*... | tst.go:18:15:18:28 | After ...*... | +| tst.go:18:15:18:28 | After ...*... | tst.go:18:30:18:33 | Before 1024 | +| tst.go:18:15:18:28 | Before ...*... | tst.go:18:15:18:23 | Before ...*... | +| tst.go:18:15:18:33 | ...*... | tst.go:18:15:18:33 | After ...*... | +| tst.go:18:15:18:33 | After ...*... | tst.go:18:35:18:38 | Before 1024 | +| tst.go:18:15:18:33 | Before ...*... | tst.go:18:15:18:28 | Before ...*... | +| tst.go:18:15:18:38 | ...*... | tst.go:18:15:18:38 | After ...*... | +| tst.go:18:15:18:38 | After ...*... | tst.go:18:7:18:38 | ...<... | +| tst.go:18:15:18:38 | Before ...*... | tst.go:18:15:18:33 | Before ...*... | +| tst.go:18:20:18:23 | 1024 | tst.go:18:20:18:23 | After 1024 | +| tst.go:18:20:18:23 | After 1024 | tst.go:18:15:18:23 | ...*... | +| tst.go:18:20:18:23 | Before 1024 | tst.go:18:20:18:23 | 1024 | +| tst.go:18:25:18:28 | 1024 | tst.go:18:25:18:28 | After 1024 | +| tst.go:18:25:18:28 | After 1024 | tst.go:18:15:18:28 | ...*... | +| tst.go:18:25:18:28 | Before 1024 | tst.go:18:25:18:28 | 1024 | +| tst.go:18:30:18:33 | 1024 | tst.go:18:30:18:33 | After 1024 | +| tst.go:18:30:18:33 | After 1024 | tst.go:18:15:18:33 | ...*... | +| tst.go:18:30:18:33 | Before 1024 | tst.go:18:30:18:33 | 1024 | +| tst.go:18:35:18:38 | 1024 | tst.go:18:35:18:38 | After 1024 | +| tst.go:18:35:18:38 | After 1024 | tst.go:18:15:18:38 | ...*... | +| tst.go:18:35:18:38 | Before 1024 | tst.go:18:35:18:38 | 1024 | +| tst.go:23:1:26:1 | After function declaration | tst.go:28:1:32:1 | Before function declaration | +| tst.go:23:1:26:1 | Before function declaration | tst.go:23:1:26:1 | function declaration | +| tst.go:23:1:26:1 | Entry | tst.go:23:15:26:1 | block statement | +| tst.go:23:1:26:1 | Normal Exit | tst.go:23:1:26:1 | Exit | +| tst.go:23:1:26:1 | function declaration | tst.go:23:1:26:1 | After function declaration | +| tst.go:23:15:26:1 | After block statement | tst.go:23:1:26:1 | Normal Exit | +| tst.go:23:15:26:1 | block statement | tst.go:24:2:25:2 | expression-switch statement | +| tst.go:24:2:25:2 | After expression-switch statement | tst.go:23:15:26:1 | After block statement | +| tst.go:24:2:25:2 | expression-switch statement | tst.go:24:2:25:2 | After expression-switch statement | +| tst.go:28:1:32:1 | After function declaration | tst.go:0:0:0:0 | After tst.go | +| tst.go:28:1:32:1 | Before function declaration | tst.go:28:1:32:1 | function declaration | +| tst.go:28:1:32:1 | Entry | tst.go:28:15:32:1 | block statement | +| tst.go:28:1:32:1 | Normal Exit | tst.go:28:1:32:1 | Exit | +| tst.go:28:1:32:1 | function declaration | tst.go:28:1:32:1 | After function declaration | +| tst.go:28:15:32:1 | After block statement | tst.go:28:1:32:1 | Normal Exit | +| tst.go:28:15:32:1 | block statement | tst.go:29:2:31:2 | expression-switch statement | +| tst.go:29:2:31:2 | After expression-switch statement | tst.go:28:15:32:1 | After block statement | +| tst.go:29:2:31:2 | expression-switch statement | tst.go:30:2:30:9 | case clause | +| tst.go:30:2:30:9 | After case clause [match] | tst.go:29:2:31:2 | After expression-switch statement | +| tst.go:30:2:30:9 | case clause | tst.go:30:2:30:9 | After case clause [match] | diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/NoretFunctions.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/NoretFunctions.expected index 331aaa893254..52306e9a9878 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/NoretFunctions.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/NoretFunctions.expected @@ -1,4 +1,3 @@ -| epilogues.go:115:6:115:22 | epiRecoverUnnamed | github.com/github/codeql-go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph.epiRecoverUnnamed | | file://:0:0:0:0 | Exit | os.Exit | | file://:0:0:0:0 | Fatal | log.Fatal | | file://:0:0:0:0 | Fatal | log.Logger.Fatal | @@ -16,8 +15,8 @@ | noretfunctions.go:8:6:8:12 | isNoRet | github.com/github/codeql-go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph.isNoRet | | noretfunctions.go:20:6:20:22 | noRetUsesLogFatal | github.com/github/codeql-go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph.noRetUsesLogFatal | | noretfunctions.go:24:6:24:23 | noRetUsesLogFatalf | github.com/github/codeql-go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph.noRetUsesLogFatalf | -| stmts7.go:13:6:13:15 | canRecover | github.com/github/codeql-go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph.canRecover | | stmts7.go:33:6:33:20 | deferBeforeExit | github.com/github/codeql-go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph.deferBeforeExit | +| stmts7.go:43:6:43:23 | finalDeferredPanic | github.com/github/codeql-go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph.finalDeferredPanic | +| stmts7.go:47:6:47:31 | deferredExitStopsRemaining | github.com/github/codeql-go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph.deferredExitStopsRemaining | | stmts.go:10:6:10:10 | test5 | github.com/github/codeql-go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph.test5 | | stmts.go:46:6:46:10 | test6 | github.com/github/codeql-go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph.test6 | -| stmts.go:112:6:112:10 | test9 | github.com/github/codeql-go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph.test9 | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalFlowStep.expected b/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalFlowStep.expected index b05db19a4183..193904c72e1e 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalFlowStep.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalFlowStep.expected @@ -12,10 +12,10 @@ | main.go:8:8:8:8 | x | main.go:10:7:10:7 | x | | main.go:10:2:10:27 | SSA def(z) | main.go:11:14:11:14 | z | | main.go:10:7:10:7 | x | main.go:10:22:10:22 | x | -| main.go:10:7:10:12 | ...<=... | main.go:10:7:10:27 | ...&&... | -| main.go:10:7:10:27 | ...&&... | main.go:10:2:10:27 | SSA def(z) | +| main.go:10:7:10:12 | ...<=... | main.go:10:7:10:27 | After ...&&... | +| main.go:10:7:10:27 | After ...&&... | main.go:10:2:10:27 | SSA def(z) | | main.go:10:12:10:12 | y | main.go:10:17:10:17 | y | -| main.go:10:17:10:27 | ...>=... | main.go:10:7:10:27 | ...&&... | +| main.go:10:17:10:27 | ...>=... | main.go:10:7:10:27 | After ...&&... | | main.go:11:14:11:14 | z | main.go:11:9:11:15 | type conversion | | main.go:15:9:15:9 | 0 | main.go:15:2:15:9 | SSA def(acc) | | main.go:16:9:19:2 | SSA def(acc) | main.go:17:3:17:5 | acc | @@ -55,8 +55,8 @@ | main.go:46:44:52:1 | result-zero-init:1 block statement | main.go:46:44:52:1 | SSA def(vals) | | main.go:47:2:50:2 | SSA def(k) | main.go:49:11:49:11 | k | | main.go:47:2:50:2 | SSA def(v) | main.go:48:11:48:11 | v | -| main.go:47:2:50:2 | extract:0 range statement | main.go:47:2:50:2 | SSA def(k) | -| main.go:47:2:50:2 | extract:1 range statement | main.go:47:2:50:2 | SSA def(v) | +| main.go:47:2:50:2 | extract:0 range element | main.go:47:2:50:2 | SSA def(k) | +| main.go:47:2:50:2 | extract:1 range element | main.go:47:2:50:2 | SSA def(v) | | main.go:48:3:48:11 | SSA def(vals) | main.go:46:44:52:1 | result-read:1 block statement | | main.go:48:3:48:11 | SSA def(vals) | main.go:48:3:48:6 | vals | | main.go:48:3:48:11 | compound-rhs ... += ... | main.go:48:3:48:11 | SSA def(vals) | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalTaintStep.expected b/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalTaintStep.expected index 2eb946ed07df..4ace99a0ab2c 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalTaintStep.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalTaintStep.expected @@ -8,9 +8,9 @@ | main.go:40:15:40:15 | s | main.go:40:8:40:23 | call to append | | main.go:40:18:40:19 | s1 | main.go:40:8:40:23 | call to append | | main.go:42:10:42:11 | s4 | main.go:42:7:42:7 | s [postupdate] | -| main.go:47:20:47:21 | next key-value pair in range | main.go:47:2:50:2 | extract:0 range statement | -| main.go:47:20:47:21 | next key-value pair in range | main.go:47:2:50:2 | extract:1 range statement | -| main.go:47:20:47:21 | xs | main.go:47:2:50:2 | extract:1 range statement | +| main.go:47:2:50:2 | next range element | main.go:47:2:50:2 | extract:0 range element | +| main.go:47:2:50:2 | next range element | main.go:47:2:50:2 | extract:1 range element | +| main.go:47:20:47:21 | xs | main.go:47:2:50:2 | extract:1 range element | | strings.go:9:24:9:24 | s | strings.go:9:8:9:38 | call to Replace | | strings.go:9:32:9:34 | "_" | strings.go:9:8:9:38 | call to Replace | | strings.go:10:27:10:27 | s | strings.go:10:8:10:42 | call to ReplaceAll | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/GlobalValueNumber.expected b/go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/GlobalValueNumber.expected index 1ba4a7674da3..57e27adb79f7 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/GlobalValueNumber.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/GlobalValueNumber.expected @@ -1,4 +1,4 @@ -| main.go:6:2:6:5 | 1 | main.go:14:7:14:7 | 1 | +| main.go:6:2:6:5 | implicit-one increment statement | main.go:14:7:14:7 | 1 | | main.go:10:2:10:7 | SSA def(x) | main.go:10:7:10:7 | 0 | | main.go:10:7:10:7 | 0 | main.go:10:7:10:7 | 0 | | main.go:11:6:11:10 | SSA def(y) | main.go:10:7:10:7 | 0 | @@ -29,14 +29,16 @@ | main.go:30:9:30:9 | 6 | main.go:30:9:30:9 | 6 | | main.go:33:24:39:1 | result-zero-init:0 block statement | main.go:10:7:10:7 | 0 | | main.go:34:8:34:8 | 7 | main.go:34:8:34:8 | 7 | -| main.go:35:8:37:4 | function call | main.go:35:8:37:4 | function call | +| main.go:35:8:37:4 | defer-invoke function call | main.go:35:8:37:4 | function call | | main.go:36:3:36:9 | SSA def(res) | main.go:36:9:36:9 | 8 | | main.go:36:9:36:9 | 8 | main.go:36:9:36:9 | 8 | | main.go:38:2:38:9 | SSA def(res) | main.go:38:9:38:9 | 9 | | main.go:38:9:38:9 | 9 | main.go:38:9:38:9 | 9 | | regressions.go:5:11:5:31 | call to Sizeof | regressions.go:5:11:5:31 | call to Sizeof | +| regressions.go:5:25:5:30 | call to test | regressions.go:5:25:5:30 | call to test | | regressions.go:7:11:7:15 | false | regressions.go:7:11:7:15 | false | -| regressions.go:9:11:9:12 | !... | regressions.go:11:11:11:14 | true | +| regressions.go:9:11:9:12 | After !... | regressions.go:11:11:11:14 | true | +| regressions.go:9:12:9:12 | d | regressions.go:7:11:7:15 | false | | regressions.go:11:11:11:14 | true | regressions.go:11:11:11:14 | true | | regressions.go:30:9:30:22 | call to getPayload | regressions.go:30:9:30:22 | call to getPayload | | regressions.go:30:26:30:39 | call to getPayload | regressions.go:30:26:30:39 | call to getPayload | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/SSA/DefUse.expected b/go/ql/test/library-tests/semmle/go/dataflow/SSA/DefUse.expected index 6c019cb0f278..17be1f70f90c 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/SSA/DefUse.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/SSA/DefUse.expected @@ -2,25 +2,25 @@ | main.go:15:15:15:15 | y | main.go:14:2:14:8 | SSA def(y) | main.go:14:2:14:2 | y | | main.go:17:3:17:3 | y | main.go:14:2:14:8 | SSA def(y) | main.go:14:2:14:2 | y | | main.go:19:12:19:12 | x | main.go:13:6:13:10 | SSA def(x) | main.go:13:6:13:6 | x | -| main.go:19:15:19:15 | y | main.go:19:2:19:10 | SSA phi(y) | main.go:14:2:14:2 | y | -| main.go:21:7:21:7 | y | main.go:19:2:19:10 | SSA phi(y) | main.go:14:2:14:2 | y | -| main.go:23:12:23:12 | x | main.go:23:2:23:10 | SSA phi(x) | main.go:13:6:13:6 | x | -| main.go:23:15:23:15 | y | main.go:19:2:19:10 | SSA phi(y) | main.go:14:2:14:2 | y | +| main.go:19:15:19:15 | y | main.go:16:2:18:2 | SSA phi(y) | main.go:14:2:14:2 | y | +| main.go:21:7:21:7 | y | main.go:16:2:18:2 | SSA phi(y) | main.go:14:2:14:2 | y | +| main.go:23:12:23:12 | x | main.go:20:2:22:2 | SSA phi(x) | main.go:13:6:13:6 | x | +| main.go:23:15:23:15 | y | main.go:16:2:18:2 | SSA phi(y) | main.go:14:2:14:2 | y | | main.go:27:10:27:10 | x | main.go:26:10:26:10 | SSA def(x) | main.go:26:10:26:10 | x | | main.go:29:10:29:10 | b | main.go:27:2:27:13 | SSA def(b) | main.go:27:5:27:5 | b | | main.go:29:13:29:13 | a | main.go:27:2:27:13 | SSA def(a) | main.go:27:2:27:2 | a | -| main.go:31:9:31:9 | a | main.go:31:9:31:9 | SSA phi(a) | main.go:27:2:27:2 | a | -| main.go:31:12:31:12 | b | main.go:31:9:31:9 | SSA phi(b) | main.go:27:5:27:5 | b | +| main.go:31:9:31:9 | a | main.go:28:2:30:2 | SSA phi(a) | main.go:27:2:27:2 | a | +| main.go:31:12:31:12 | b | main.go:28:2:30:2 | SSA phi(b) | main.go:27:5:27:5 | b | | main.go:35:3:35:3 | x | main.go:34:11:34:11 | SSA def(x) | main.go:34:11:34:11 | x | | main.go:40:10:40:10 | x | main.go:39:2:39:8 | SSA def(x) | main.go:39:2:39:2 | x | | main.go:42:8:42:10 | ptr | main.go:40:2:40:10 | SSA def(ptr) | main.go:40:2:40:4 | ptr | | main.go:44:12:44:12 | x | main.go:39:2:39:8 | SSA def(x) | main.go:39:2:39:2 | x | | main.go:47:25:50:1 | result-read:0 block statement | main.go:48:2:48:12 | SSA def(result) | main.go:47:13:47:18 | result | | main.go:52:26:54:1 | result-read:0 block statement | main.go:52:26:54:1 | SSA def(result) | main.go:52:14:52:19 | result | -| main.go:61:12:61:12 | x | main.go:58:6:58:9 | SSA phi(x) | main.go:57:6:57:6 | x | -| main.go:64:16:64:16 | i | main.go:65:6:65:9 | SSA phi(i) | main.go:64:6:64:6 | i | -| main.go:70:12:70:12 | y | main.go:65:6:65:9 | SSA phi(y) | main.go:63:2:63:2 | y | -| main.go:73:16:73:16 | i | main.go:74:3:74:3 | SSA phi(i) | main.go:73:6:73:6 | i | +| main.go:61:12:61:12 | x | main.go:58:6:58:11 | SSA phi(x) | main.go:57:6:57:6 | x | +| main.go:64:16:64:16 | i | main.go:64:20:69:2 | SSA phi(i) | main.go:64:6:64:6 | i | +| main.go:70:12:70:12 | y | main.go:64:20:69:2 | SSA phi(y) | main.go:63:2:63:2 | y | +| main.go:73:16:73:16 | i | main.go:73:20:78:2 | SSA phi(i) | main.go:73:6:73:6 | i | | main.go:79:12:79:12 | z | main.go:74:3:74:7 | SSA def(z) | main.go:72:2:72:2 | z | | main.go:82:36:86:1 | result-read:0 block statement | main.go:84:2:84:15 | SSA def(a) | main.go:82:18:82:18 | a | | main.go:82:36:86:1 | result-read:1 block statement | main.go:82:36:86:1 | SSA def(b) | main.go:82:25:82:25 | b | @@ -36,7 +36,7 @@ | main.go:115:8:115:8 | x | main.go:114:16:117:2 | SSA def(x) | main.go:113:2:113:2 | x | | main.go:116:7:116:7 | y | main.go:115:3:115:12 | SSA def(y) | main.go:115:3:115:3 | y | | main.go:118:9:118:9 | x | main.go:114:2:117:3 | SSA def(x) | main.go:113:2:113:2 | x | -| main.go:135:2:135:2 | p | main.go:135:2:135:2 | SSA phi(p) | main.go:128:6:128:6 | p | -| main.go:137:12:137:12 | p | main.go:135:2:135:2 | SSA phi(p) | main.go:128:6:128:6 | p | -| main.go:137:17:137:17 | p | main.go:135:2:135:2 | SSA phi(p) | main.go:128:6:128:6 | p | -| main.go:137:24:137:24 | p | main.go:135:2:135:2 | SSA phi(p) | main.go:128:6:128:6 | p | +| main.go:135:2:135:2 | p | main.go:129:2:133:2 | SSA phi(p) | main.go:128:6:128:6 | p | +| main.go:137:12:137:12 | p | main.go:129:2:133:2 | SSA phi(p) | main.go:128:6:128:6 | p | +| main.go:137:17:137:17 | p | main.go:129:2:133:2 | SSA phi(p) | main.go:128:6:128:6 | p | +| main.go:137:24:137:24 | p | main.go:129:2:133:2 | SSA phi(p) | main.go:128:6:128:6 | p | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/SSA/SsaDefinition.expected b/go/ql/test/library-tests/semmle/go/dataflow/SSA/SsaDefinition.expected index 37943a0f2646..0345f6c5b70a 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/SSA/SsaDefinition.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/SSA/SsaDefinition.expected @@ -1,33 +1,33 @@ | main.go:13:6:13:10 | SSA def(x) | | main.go:14:2:14:8 | SSA def(y) | +| main.go:16:2:18:2 | SSA phi(y) | | main.go:17:3:17:9 | SSA def(y) | -| main.go:19:2:19:10 | SSA phi(y) | +| main.go:20:2:22:2 | SSA phi(x) | | main.go:21:3:21:7 | SSA def(x) | -| main.go:23:2:23:10 | SSA phi(x) | | main.go:26:10:26:10 | SSA def(x) | | main.go:27:2:27:13 | SSA def(a) | | main.go:27:2:27:13 | SSA def(b) | +| main.go:28:2:30:2 | SSA phi(a) | +| main.go:28:2:30:2 | SSA phi(b) | | main.go:29:3:29:13 | SSA def(a) | | main.go:29:3:29:13 | SSA def(b) | -| main.go:31:9:31:9 | SSA phi(a) | -| main.go:31:9:31:9 | SSA phi(b) | | main.go:34:11:34:11 | SSA def(x) | | main.go:39:2:39:8 | SSA def(x) | | main.go:40:2:40:10 | SSA def(ptr) | | main.go:48:2:48:12 | SSA def(result) | | main.go:52:26:54:1 | SSA def(result) | | main.go:57:6:57:10 | SSA def(x) | -| main.go:58:6:58:9 | SSA phi(x) | +| main.go:58:6:58:11 | SSA phi(x) | | main.go:59:3:59:7 | SSA def(x) | | main.go:63:2:63:7 | SSA def(y) | | main.go:64:6:64:11 | SSA def(i) | | main.go:64:16:64:18 | SSA def(i) | -| main.go:65:6:65:9 | SSA phi(i) | -| main.go:65:6:65:9 | SSA phi(y) | +| main.go:64:20:69:2 | SSA phi(i) | +| main.go:64:20:69:2 | SSA phi(y) | | main.go:68:3:68:7 | SSA def(y) | | main.go:73:6:73:11 | SSA def(i) | | main.go:73:16:73:18 | SSA def(i) | -| main.go:74:3:74:3 | SSA phi(i) | +| main.go:73:20:78:2 | SSA phi(i) | | main.go:74:3:74:7 | SSA def(z) | | main.go:82:36:86:1 | SSA def(b) | | main.go:83:2:83:8 | SSA def(x) | @@ -46,6 +46,6 @@ | main.go:114:16:117:2 | SSA def(x) | | main.go:115:3:115:12 | SSA def(y) | | main.go:116:3:116:7 | SSA def(x) | +| main.go:129:2:133:2 | SSA phi(p) | | main.go:130:3:130:24 | SSA def(p) | | main.go:132:3:132:24 | SSA def(p) | -| main.go:135:2:135:2 | SSA phi(p) | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/SSA/SsaWithFields.expected b/go/ql/test/library-tests/semmle/go/dataflow/SSA/SsaWithFields.expected index 4925c1039000..f00640593538 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/SSA/SsaWithFields.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/SSA/SsaWithFields.expected @@ -1,33 +1,33 @@ | main.go:13:6:13:10 | (SSA def(x)) | x | | main.go:14:2:14:8 | (SSA def(y)) | y | +| main.go:16:2:18:2 | (SSA phi(y)) | y | | main.go:17:3:17:9 | (SSA def(y)) | y | -| main.go:19:2:19:10 | (SSA phi(y)) | y | +| main.go:20:2:22:2 | (SSA phi(x)) | x | | main.go:21:3:21:7 | (SSA def(x)) | x | -| main.go:23:2:23:10 | (SSA phi(x)) | x | | main.go:26:10:26:10 | (SSA def(x)) | x | | main.go:27:2:27:13 | (SSA def(a)) | a | | main.go:27:2:27:13 | (SSA def(b)) | b | +| main.go:28:2:30:2 | (SSA phi(a)) | a | +| main.go:28:2:30:2 | (SSA phi(b)) | b | | main.go:29:3:29:13 | (SSA def(a)) | a | | main.go:29:3:29:13 | (SSA def(b)) | b | -| main.go:31:9:31:9 | (SSA phi(a)) | a | -| main.go:31:9:31:9 | (SSA phi(b)) | b | | main.go:34:11:34:11 | (SSA def(x)) | x | | main.go:39:2:39:8 | (SSA def(x)) | x | | main.go:40:2:40:10 | (SSA def(ptr)) | ptr | | main.go:48:2:48:12 | (SSA def(result)) | result | | main.go:52:26:54:1 | (SSA def(result)) | result | | main.go:57:6:57:10 | (SSA def(x)) | x | -| main.go:58:6:58:9 | (SSA phi(x)) | x | +| main.go:58:6:58:11 | (SSA phi(x)) | x | | main.go:59:3:59:7 | (SSA def(x)) | x | | main.go:63:2:63:7 | (SSA def(y)) | y | | main.go:64:6:64:11 | (SSA def(i)) | i | | main.go:64:16:64:18 | (SSA def(i)) | i | -| main.go:65:6:65:9 | (SSA phi(i)) | i | -| main.go:65:6:65:9 | (SSA phi(y)) | y | +| main.go:64:20:69:2 | (SSA phi(i)) | i | +| main.go:64:20:69:2 | (SSA phi(y)) | y | | main.go:68:3:68:7 | (SSA def(y)) | y | | main.go:73:6:73:11 | (SSA def(i)) | i | | main.go:73:16:73:18 | (SSA def(i)) | i | -| main.go:74:3:74:3 | (SSA phi(i)) | i | +| main.go:73:20:78:2 | (SSA phi(i)) | i | | main.go:74:3:74:7 | (SSA def(z)) | z | | main.go:82:36:86:1 | (SSA def(b)) | b | | main.go:83:2:83:8 | (SSA def(x)) | x | @@ -49,10 +49,10 @@ | main.go:114:16:117:2 | (SSA def(x)) | x | | main.go:115:3:115:12 | (SSA def(y)) | y | | main.go:116:3:116:7 | (SSA def(x)) | x | +| main.go:129:2:133:2 | (SSA phi(p)) | p | +| main.go:129:2:133:2 | (SSA phi(p)).a | p.a | +| main.go:129:2:133:2 | (SSA phi(p)).b | p.b | +| main.go:129:2:133:2 | (SSA phi(p)).b.a | p.b.a | +| main.go:129:2:133:2 | (SSA phi(p)).c | p.c | | main.go:130:3:130:24 | (SSA def(p)) | p | | main.go:132:3:132:24 | (SSA def(p)) | p | -| main.go:135:2:135:2 | (SSA phi(p)) | p | -| main.go:135:2:135:2 | (SSA phi(p)).a | p.a | -| main.go:135:2:135:2 | (SSA phi(p)).b | p.b | -| main.go:135:2:135:2 | (SSA phi(p)).b.a | p.b.a | -| main.go:135:2:135:2 | (SSA phi(p)).c | p.c | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/VarArgs/CONSISTENCY/DataFlowConsistency.expected b/go/ql/test/library-tests/semmle/go/dataflow/VarArgs/CONSISTENCY/DataFlowConsistency.expected deleted file mode 100644 index 95848ba942a8..000000000000 --- a/go/ql/test/library-tests/semmle/go/dataflow/VarArgs/CONSISTENCY/DataFlowConsistency.expected +++ /dev/null @@ -1,2 +0,0 @@ -reverseRead -| main.go:23:3:23:5 | out | Origin of readStep is missing a PostUpdateNode. | diff --git a/go/ql/test/query-tests/RedundantCode/RedundantRecover/RedundantRecover.expected b/go/ql/test/query-tests/RedundantCode/RedundantRecover/RedundantRecover.expected index fdc175c8cf0f..07295232067a 100644 --- a/go/ql/test/query-tests/RedundantCode/RedundantRecover/RedundantRecover.expected +++ b/go/ql/test/query-tests/RedundantCode/RedundantRecover/RedundantRecover.expected @@ -1,3 +1,3 @@ | RedundantRecover1.go:6:5:6:13 | call to recover | This call to 'recover' has no effect because $@ is never called using a defer statement. | RedundantRecover1.go:5:1:9:1 | function declaration | the enclosing function | -| RedundantRecover2.go:4:8:4:16 | call to recover | Deferred calls to 'recover' have no effect. | RedundantRecover2.go:3:1:6:1 | function declaration | the enclosing function | +| RedundantRecover2.go:4:8:4:16 | defer-invoke call to recover | Deferred calls to 'recover' have no effect. | RedundantRecover2.go:3:1:6:1 | function declaration | the enclosing function | | tst.go:8:5:8:13 | call to recover | This call to 'recover' has no effect because $@ is never called using a defer statement. | tst.go:5:1:11:1 | function declaration | the enclosing function | diff --git a/go/ql/test/query-tests/Security/CWE-022/ZipSlip.expected b/go/ql/test/query-tests/Security/CWE-022/ZipSlip.expected index 27e6349070c4..6ed511869f75 100644 --- a/go/ql/test/query-tests/Security/CWE-022/ZipSlip.expected +++ b/go/ql/test/query-tests/Security/CWE-022/ZipSlip.expected @@ -1,10 +1,10 @@ #select | UnsafeUnzipSymlinkGood.go:72:3:72:25 | extract:0 ... := ... | UnsafeUnzipSymlinkGood.go:72:3:72:25 | extract:0 ... := ... | UnsafeUnzipSymlinkGood.go:61:31:61:62 | call to Join | Unsanitized archive entry, which may contain '..', is used in a $@. | UnsafeUnzipSymlinkGood.go:61:31:61:62 | call to Join | file system operation | -| ZipSlip.go:11:2:15:2 | extract:1 range statement | ZipSlip.go:11:2:15:2 | extract:1 range statement | ZipSlip.go:14:20:14:20 | p | Unsanitized archive entry, which may contain '..', is used in a $@. | ZipSlip.go:14:20:14:20 | p | file system operation | +| ZipSlip.go:11:2:15:2 | extract:1 range element | ZipSlip.go:11:2:15:2 | extract:1 range element | ZipSlip.go:14:20:14:20 | p | Unsanitized archive entry, which may contain '..', is used in a $@. | ZipSlip.go:14:20:14:20 | p | file system operation | | tarslip.go:15:2:15:30 | extract:0 ... := ... | tarslip.go:15:2:15:30 | extract:0 ... := ... | tarslip.go:16:14:16:34 | call to Dir | Unsanitized archive entry, which may contain '..', is used in a $@. | tarslip.go:16:14:16:34 | call to Dir | file system operation | -| tst.go:23:2:43:2 | extract:1 range statement | tst.go:23:2:43:2 | extract:1 range statement | tst.go:27:21:27:48 | call to Join | Unsanitized archive entry, which may contain '..', is used in a $@. | tst.go:27:21:27:48 | call to Join | file system operation | -| tst.go:23:2:43:2 | extract:1 range statement | tst.go:23:2:43:2 | extract:1 range statement | tst.go:29:20:29:23 | path | Unsanitized archive entry, which may contain '..', is used in a $@. | tst.go:29:20:29:23 | path | file system operation | -| tst.go:23:2:43:2 | extract:1 range statement | tst.go:23:2:43:2 | extract:1 range statement | tst.go:31:21:31:24 | path | Unsanitized archive entry, which may contain '..', is used in a $@. | tst.go:31:21:31:24 | path | file system operation | +| tst.go:23:2:43:2 | extract:1 range element | tst.go:23:2:43:2 | extract:1 range element | tst.go:27:21:27:48 | call to Join | Unsanitized archive entry, which may contain '..', is used in a $@. | tst.go:27:21:27:48 | call to Join | file system operation | +| tst.go:23:2:43:2 | extract:1 range element | tst.go:23:2:43:2 | extract:1 range element | tst.go:29:20:29:23 | path | Unsanitized archive entry, which may contain '..', is used in a $@. | tst.go:29:20:29:23 | path | file system operation | +| tst.go:23:2:43:2 | extract:1 range element | tst.go:23:2:43:2 | extract:1 range element | tst.go:31:21:31:24 | path | Unsanitized archive entry, which may contain '..', is used in a $@. | tst.go:31:21:31:24 | path | file system operation | edges | UnsafeUnzipSymlinkGood.go:52:24:52:32 | SSA def(candidate) | UnsafeUnzipSymlinkGood.go:61:53:61:61 | candidate | provenance | | | UnsafeUnzipSymlinkGood.go:61:53:61:61 | candidate | UnsafeUnzipSymlinkGood.go:61:31:61:62 | call to Join | provenance | FunctionModel Sink:MaD:3 | @@ -12,14 +12,14 @@ edges | UnsafeUnzipSymlinkGood.go:72:3:72:25 | extract:0 ... := ... | UnsafeUnzipSymlinkGood.go:76:70:76:80 | selection of Name | provenance | | | UnsafeUnzipSymlinkGood.go:76:24:76:38 | selection of Linkname | UnsafeUnzipSymlinkGood.go:52:24:52:32 | SSA def(candidate) | provenance | | | UnsafeUnzipSymlinkGood.go:76:70:76:80 | selection of Name | UnsafeUnzipSymlinkGood.go:52:24:52:32 | SSA def(candidate) | provenance | | -| ZipSlip.go:11:2:15:2 | extract:1 range statement | ZipSlip.go:12:24:12:29 | selection of Name | provenance | | +| ZipSlip.go:11:2:15:2 | extract:1 range element | ZipSlip.go:12:24:12:29 | selection of Name | provenance | | | ZipSlip.go:12:3:12:30 | extract:0 ... := ... | ZipSlip.go:14:20:14:20 | p | provenance | Sink:MaD:1 | | ZipSlip.go:12:24:12:29 | selection of Name | ZipSlip.go:12:3:12:30 | extract:0 ... := ... | provenance | MaD:4 | | tarslip.go:15:2:15:30 | extract:0 ... := ... | tarslip.go:16:23:16:33 | selection of Name | provenance | | | tarslip.go:16:23:16:33 | selection of Name | tarslip.go:16:14:16:34 | call to Dir | provenance | MaD:6 Sink:MaD:2 | -| tst.go:23:2:43:2 | extract:1 range statement | tst.go:25:38:25:41 | path | provenance | | -| tst.go:23:2:43:2 | extract:1 range statement | tst.go:29:20:29:23 | path | provenance | Sink:MaD:1 | -| tst.go:23:2:43:2 | extract:1 range statement | tst.go:31:21:31:24 | path | provenance | Sink:MaD:1 | +| tst.go:23:2:43:2 | extract:1 range element | tst.go:25:38:25:41 | path | provenance | | +| tst.go:23:2:43:2 | extract:1 range element | tst.go:29:20:29:23 | path | provenance | Sink:MaD:1 | +| tst.go:23:2:43:2 | extract:1 range element | tst.go:31:21:31:24 | path | provenance | Sink:MaD:1 | | tst.go:25:3:25:42 | extract:0 ... := ... | tst.go:27:41:27:47 | relpath | provenance | | | tst.go:25:38:25:41 | path | tst.go:25:3:25:42 | extract:0 ... := ... | provenance | MaD:5 | | tst.go:27:41:27:47 | relpath | tst.go:27:21:27:48 | call to Join | provenance | FunctionModel Sink:MaD:1 | @@ -37,14 +37,14 @@ nodes | UnsafeUnzipSymlinkGood.go:72:3:72:25 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | UnsafeUnzipSymlinkGood.go:76:24:76:38 | selection of Linkname | semmle.label | selection of Linkname | | UnsafeUnzipSymlinkGood.go:76:70:76:80 | selection of Name | semmle.label | selection of Name | -| ZipSlip.go:11:2:15:2 | extract:1 range statement | semmle.label | extract:1 range statement | +| ZipSlip.go:11:2:15:2 | extract:1 range element | semmle.label | extract:1 range element | | ZipSlip.go:12:3:12:30 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | ZipSlip.go:12:24:12:29 | selection of Name | semmle.label | selection of Name | | ZipSlip.go:14:20:14:20 | p | semmle.label | p | | tarslip.go:15:2:15:30 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | tarslip.go:16:14:16:34 | call to Dir | semmle.label | call to Dir | | tarslip.go:16:23:16:33 | selection of Name | semmle.label | selection of Name | -| tst.go:23:2:43:2 | extract:1 range statement | semmle.label | extract:1 range statement | +| tst.go:23:2:43:2 | extract:1 range element | semmle.label | extract:1 range element | | tst.go:25:3:25:42 | extract:0 ... := ... | semmle.label | extract:0 ... := ... | | tst.go:25:38:25:41 | path | semmle.label | path | | tst.go:27:21:27:48 | call to Join | semmle.label | call to Join | diff --git a/go/ql/test/query-tests/Security/CWE-312/CleartextLogging.expected b/go/ql/test/query-tests/Security/CWE-312/CleartextLogging.expected index 51bb2c0dd4bd..c81e0ed61412 100644 --- a/go/ql/test/query-tests/Security/CWE-312/CleartextLogging.expected +++ b/go/ql/test/query-tests/Security/CWE-312/CleartextLogging.expected @@ -55,10 +55,10 @@ | passwords.go:131:14:131:21 | selection of y | passwords.go:126:13:126:25 | call to getPassword | passwords.go:131:14:131:21 | selection of y | $@ flows to a logging call. | passwords.go:126:13:126:25 | call to getPassword | Sensitive data returned by a call to getPassword | | protobuf.go:14:14:14:35 | call to GetDescription | protobuf.go:9:2:9:23 | SSA def(password) | protobuf.go:14:14:14:35 | call to GetDescription | $@ flows to a logging call. | protobuf.go:9:2:9:23 | SSA def(password) | Sensitive data returned by an access to password | edges -| klog.go:21:3:26:3 | extract:1 range statement | klog.go:22:27:22:33 | headers | provenance | | -| klog.go:21:30:21:37 | selection of Header | klog.go:21:3:26:3 | extract:1 range statement | provenance | Src:MaD:11 Config | -| klog.go:22:4:25:4 | extract:1 range statement | klog.go:23:15:23:20 | header | provenance | | -| klog.go:22:27:22:33 | headers | klog.go:22:4:25:4 | extract:1 range statement | provenance | Config | +| klog.go:21:3:26:3 | extract:1 range element | klog.go:22:27:22:33 | headers | provenance | | +| klog.go:21:30:21:37 | selection of Header | klog.go:21:3:26:3 | extract:1 range element | provenance | Src:MaD:11 Config | +| klog.go:22:4:25:4 | extract:1 range element | klog.go:23:15:23:20 | header | provenance | | +| klog.go:22:27:22:33 | headers | klog.go:22:4:25:4 | extract:1 range element | provenance | Config | | klog.go:29:13:29:20 | selection of Header | klog.go:29:13:29:41 | call to Get | provenance | Src:MaD:11 Config | | main.go:17:2:17:23 | SSA def(password) | main.go:19:12:19:19 | password | provenance | | | main.go:17:2:17:23 | SSA def(password) | main.go:20:19:20:26 | password | provenance | | @@ -164,9 +164,9 @@ models | 10 | Sink: log; Logger; true; Printf; ; ; Argument[0..1]; log-injection; manual | | 11 | Source: net/http; Request; true; Header; ; ; ; remote; manual | nodes -| klog.go:21:3:26:3 | extract:1 range statement | semmle.label | extract:1 range statement | +| klog.go:21:3:26:3 | extract:1 range element | semmle.label | extract:1 range element | | klog.go:21:30:21:37 | selection of Header | semmle.label | selection of Header | -| klog.go:22:4:25:4 | extract:1 range statement | semmle.label | extract:1 range statement | +| klog.go:22:4:25:4 | extract:1 range element | semmle.label | extract:1 range element | | klog.go:22:27:22:33 | headers | semmle.label | headers | | klog.go:23:15:23:20 | header | semmle.label | header | | klog.go:29:13:29:20 | selection of Header | semmle.label | selection of Header | diff --git a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll index 12b142ebbffd..dd6510eeeaa3 100644 --- a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll +++ b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll @@ -284,6 +284,14 @@ signature module AstSig { Stmt getStmt(int index); } + /** + * Gets the initializer of `switch` statement `switch`, if any. + * + * Only some languages (e.g. Go) support an initializer that is evaluated + * before the switch expression. + */ + default AstNode getSwitchInit(Switch switch) { none() } + /** A case in a switch. */ class Case extends AstNode { /** Gets the pattern being matched by this case at the specified (zero-based) `index`. */ @@ -677,7 +685,12 @@ module Make0 Ast> { not exists(getChild(n, _)) and not postOrInOrder(n) and not additionalNode(n, _, _) and - not inConditionalContext(n, _) + not inConditionalContext(n, _) and + // A switch is a branching construct with an explicit step from its + // "before" node to its "after" node, so it must keep distinct before and + // after nodes even when it has no children (e.g. an empty `switch {}`). + // Merging them would otherwise turn that step into a spurious self-loop. + not n instanceof Switch } private string catchClauseEmptyBodyTag() { result = "[CatchClauseEmptyBody]" } @@ -1017,6 +1030,27 @@ module Make0 Ast> { */ final class PreControlFlowNode = NodeImpl; + /** + * Holds if `n` is the in-order or post-order control flow node for `ast`. + * + * Unlike the `PreControlFlowNode.isIn` member predicate, this is computed + * structurally (directly from the underlying node representation) and so + * does not give rise to a dependency on node reachability. It is intended + * for languages implementing `Input2::deferExitStep`, whose definition must + * not depend on `reachable` (see `succIgnoringDeferExit`); such languages + * can use this to identify nodes inside a negation without introducing a + * non-monotonic cycle. + */ + predicate isInOrderNode(PreControlFlowNode n, AstNode ast) { n = TAstNode(ast) } + + /** + * Holds if `n` is the exceptional exit node for a callable. + * + * This is computed structurally so that it can be used while constructing + * the CFG without introducing a dependency on node reachability. + */ + predicate isExceptionalExitNode(PreControlFlowNode n) { n = TAnnotatedExitNode(_, false) } + private class BeforeNode extends NodeImpl, TBeforeNode { private AstNode n; @@ -1088,7 +1122,7 @@ module Make0 Ast> { } /** The `PreControlFlowNode` at the entry point of a callable. */ - final private class EntryNodeImpl extends NodeImpl, TEntryNode { + final class EntryNodeImpl extends NodeImpl, TEntryNode { private Callable c; EntryNodeImpl() { this = TEntryNode(c) } @@ -1189,7 +1223,7 @@ module Make0 Ast> { signature module InputSig2 { /** * Holds if `ast` may result in an abrupt completion `c` originating at - * `n`. The boolean `always` indicates whether the abrupt completion + * `n`. The boolean `always` indicates whether the abrupt completion * always occurs or whether `n` may also terminate normally. * * This predicate is only relevant for AST constructs that are not already @@ -1208,6 +1242,135 @@ module Make0 Ast> { */ predicate endAbruptCompletion(AstNode ast, PreControlFlowNode n, AbruptCompletion c); + /** + * Holds if the language-specific implementation takes over the catching + * of the abrupt completion `completion` at the boundary of callable `c`. + * + * When this holds, the library's default routing of `completion` to the + * normal or exceptional exit node of `c` is suppressed, and the language + * is then responsible for catching `completion` itself via + * `endAbruptCompletion` (for example, to interpose a function epilogue + * such as Go's deferred calls between a `return` and the normal exit + * node). + * + * The default implementation does not override any completions, leaving + * the standard behaviour intact. + */ + default predicate overridesCallableEndAbruptCompletion(Callable c, AbruptCompletion completion) { + none() + } + + /** + * Holds if the language-specific implementation replaces the edge from + * `source` to `target` for abrupt completion `completion` originating + * at `source`. + * + * This is useful when whether an abrupt completion is intercepted + * depends on its source, for example when Go routes a panic through the + * deferred calls that are active at that source. The language is + * responsible for providing the replacement control-flow edge. + * + * The default implementation does not override any edges. + */ + default predicate overridesAbruptCompletionEdge( + PreControlFlowNode source, PreControlFlowNode target, AbruptCompletion completion + ) { + none() + } + + /** + * Holds if `n` steps directly to the normal exit node (`normal = true`) + * or the exceptional exit node (`normal = false`) of callable `c`. + * + * By default the only node that reaches a callable's normal exit is the + * "after" node of its body. This predicate lets a language route the tail + * of a function epilogue (such as Go's result-read or deferred-call nodes) + * to the appropriate exit node, which is useful when the body cannot + * terminate normally (e.g. it always ends in a `return`) and therefore has + * no "after" node to anchor the epilogue on. + * + * The default implementation adds no such steps. + */ + default predicate callableExitStep(PreControlFlowNode n, Callable c, boolean normal) { + none() + } + + /** + * Holds if the language-specific implementation takes over the routing of + * the normal fall-through from callable `c`'s body to its normal exit + * node. + * + * When this holds, the library's default edge from the "after" node of + * `c`'s body to the normal exit node is suppressed, and the language is + * responsible for routing the fall-through to the normal exit itself (for + * example, to interpose a function-exit epilogue such as Go's deferred + * calls). This complements `callableExitStep`, which the language can use + * to add the replacement edge into the normal exit node. + * + * The default implementation does not override any fall-through edges. + */ + default predicate overridesCallableBodyExit(Callable c) { none() } + + /** + * Holds if there is a local non-abrupt step from `n1` to `n2` that forms + * part of a function-exit epilogue whose placement depends on + * reachability (such as Go's deferred calls, which run at function exit in + * last-in-first-out order, gated by whether their registration is + * reachable on the path to a given exit). + * + * Edges added here are included in the final control flow graph exactly + * like ordinary `step` edges, but they are *excluded* when the library + * computes the defer-free reachability exposed through + * `getASuccessorIgnoringDeferredExit`. This lets a language compute the + * reachability gate without observing the epilogue edges it is in the + * process of defining, avoiding a circularity. + * + * Each `deferExitStep` edge must be disjoint from every other `step` edge + * (i.e. a pair `(n1, n2)` that is a `deferExitStep` must not also arise + * from `step`), so that the defer-free reachability is well defined. + * + * The default implementation adds no such steps. + */ + default predicate deferExitStep(PreControlFlowNode n1, PreControlFlowNode n2, SuccessorType t) { + none() + } + + /** + * Holds if the language-specific implementation provides all control flow + * for `ast`, suppressing the default left-to-right evaluation steps. + * + * This is useful when the language-specific entry point for `ast` is not + * an edge from its "before" node, so the presence of an explicit step + * cannot itself suppress the default control flow. + */ + default predicate overridesDefaultControlFlow(AstNode ast) { none() } + + /** + * Holds if the shared library should preserve its default left-to-right + * control flow for `ast` even though the language provides an explicit + * step from its "before" node. + * + * The default implementation preserves the existing behaviour: an + * explicit step from the "before" node suppresses all default steps. + */ + default predicate preservesDefaultControlFlow(AstNode ast) { none() } + + /** + * Holds if the language-specific implementation replaces the default + * control-flow step from `source` to `target` for `ast`. + * + * This predicate is only consulted when default control flow is enabled + * for `ast`. The language is responsible for providing any replacement + * step. + * + * The default implementation does not override any steps. + */ + default predicate overridesDefaultControlFlowStep( + AstNode ast, PreControlFlowNode source, PreControlFlowNode target + ) { + none() + } + /** * Holds if there is a local non-abrupt step from `n1` to `n2`. * @@ -1283,7 +1446,8 @@ module Make0 Ast> { Input2::endAbruptCompletion(ast, n, c) or exists(Callable callable | - callableHasBodyPart(callable, ast) or callableHasParamDefault(callable, ast) + not Input2::overridesCallableEndAbruptCompletion(callable, c) and + (callableHasBodyPart(callable, ast) or callableHasParamDefault(callable, ast)) | c.getSuccessorType() instanceof ReturnSuccessor and n.(NormalExitNodeImpl).getEnclosingCallable() = callable @@ -1472,6 +1636,22 @@ module Make0 Ast> { /** Holds if there is a local non-abrupt step from `n1` to `n2`. */ private predicate explicitStep(PreControlFlowNode n1, PreControlFlowNode n2) { + explicitStepCommon(n1, n2) + or + Input2::deferExitStep(n1, n2, _) + } + + /** + * Holds if there is a local non-abrupt step from `n1` to `n2`, excluding + * the reachability-dependent function-exit epilogue edges contributed by + * `Input2::deferExitStep`. + * + * This is the basis for the defer-free reachability exposed through + * `getASuccessorIgnoringDeferredExit`, and it must not depend on + * `deferExitStep` (so that a language can compute the reachability gate + * for its `deferExitStep` edges without circularity). + */ + private predicate explicitStepCommon(PreControlFlowNode n1, PreControlFlowNode n2) { Input2::step(n1, n2) or exists(Callable c | @@ -1496,8 +1676,15 @@ module Make0 Ast> { ) or n1.isAfter(getBodyExit(c)) and + n2.(NormalExitNodeImpl).getEnclosingCallable() = c and + not Input2::overridesCallableBodyExit(c) + or + Input2::callableExitStep(n1, c, true) and n2.(NormalExitNodeImpl).getEnclosingCallable() = c or + Input2::callableExitStep(n1, c, false) and + n2.(ExceptionalExitNodeImpl).getEnclosingCallable() = c + or n1.(AnnotatedExitNodeImpl).getEnclosingCallable() = c and n2.(ExitNodeImpl).getEnclosingCallable() = c ) @@ -1583,6 +1770,26 @@ module Make0 Ast> { n2.isAfterValue(pme, any(BooleanSuccessor s | s.getValue() = true)) ) or + exists(PatternMatchExpr pme | + n1.isBefore(pme) and + n2.isBefore(pme.getExpr()) + or + n1.isAfter(pme.getExpr()) and + n2.isIn(pme) + or + n1.isIn(pme) and + n2.isAfterValue(pme, any(BooleanSuccessor s | s.getValue() = false)) + or + n1.isIn(pme) and + n2.isAdditional(pme, patternMatchTrueTag()) + or + n1.isAdditional(pme, patternMatchTrueTag()) and + n2.isBefore(pme.getPattern()) + or + n1.isAfter(pme.getPattern()) and + n2.isAfterValue(pme, any(BooleanSuccessor s | s.getValue() = true)) + ) + or exists(IfStmt ifstmt | n1.isBefore(ifstmt) and ( @@ -1829,11 +2036,25 @@ module Make0 Ast> { not exists(getRankedCaseCfgOrder(switch, _)) and firstCase.isAfter(switch) | n1.isBefore(switch) and - n2.isBefore(switch.getExpr()) + ( + n2.isBefore(getSwitchInit(switch)) + or + not exists(getSwitchInit(switch)) and + ( + n2.isBefore(switch.getExpr()) + or + not exists(switch.getExpr()) and + n2 = firstCase + ) + ) or - n1.isBefore(switch) and - not exists(switch.getExpr()) and - n2 = firstCase + n1.isAfter(getSwitchInit(switch)) and + ( + n2.isBefore(switch.getExpr()) + or + not exists(switch.getExpr()) and + n2 = firstCase + ) or n1.isAfter(switch.getExpr()) and n2 = firstCase @@ -1901,10 +2122,20 @@ module Make0 Ast> { /** * Holds if `ast` does not have explicitly defined control flow steps * and therefore should use default left-to-right evaluation. + * + * This uses `explicitStepCommon` rather than `explicitStep` so that it + * does not depend on `Input2::deferExitStep` (whose edges never originate + * from a "before" node, so the two agree on `before` nodes anyway). This + * keeps the defer-free reachability independent of `deferExitStep`. */ private predicate defaultCfg(AstNode ast) { hasCfg(ast) and - not explicitStep(any(PreControlFlowNode n | n.isBefore(ast)), _) + not Input2::overridesDefaultControlFlow(ast) and + ( + Input2::preservesDefaultControlFlow(ast) + or + not explicitStepCommon(any(PreControlFlowNode n | n.isBefore(ast)), _) + ) } private module ChildDenseRankInput implements DenseRankInputSig1 { @@ -1925,8 +2156,11 @@ module Make0 Ast> { * an `AstNode` that does not otherwise have explicitly defined control * flow. */ - private predicate defaultStep(PreControlFlowNode n1, PreControlFlowNode n2) { - exists(AstNode ast | defaultCfg(ast) | + private predicate defaultStepCandidate( + AstNode ast, PreControlFlowNode n1, PreControlFlowNode n2 + ) { + defaultCfg(ast) and + ( n1.isBefore(ast) and n2.isBefore(getRankedChild(ast, 1)) or @@ -1953,11 +2187,30 @@ module Make0 Ast> { ) } + /** + * Holds if `n1` to `n2` is a default left-to-right evaluation step for + * an `AstNode` that is not overridden by the language implementation. + */ + private predicate defaultStep(PreControlFlowNode n1, PreControlFlowNode n2) { + exists(AstNode ast | + defaultStepCandidate(ast, n1, n2) and + not Input2::overridesDefaultControlFlowStep(ast, n1, n2) + ) + } + /** Holds if there is a local non-abrupt step from `n1` to `n2`. */ private predicate step(PreControlFlowNode n1, PreControlFlowNode n2) { explicitStep(n1, n2) or defaultStep(n1, n2) } + /** + * Holds if there is a local non-abrupt step from `n1` to `n2`, excluding + * the function-exit epilogue edges contributed by `Input2::deferExitStep`. + */ + private predicate stepIgnoringDeferExit(PreControlFlowNode n1, PreControlFlowNode n2) { + explicitStepCommon(n1, n2) or defaultStep(n1, n2) + } + /** * Holds if the execution of `ast` may result in an abrupt completion * `c` originating at `last`. @@ -1990,17 +2243,22 @@ module Make0 Ast> { } private predicate preSucc(PreControlFlowNode n1, PreControlFlowNode n2, SuccessorType t) { - step(n1, n2) and n2 = TAfterValueNode(_, t) + Input2::deferExitStep(n1, n2, t) + or + stepIgnoringDeferExit(n1, n2) and n2 = TAfterValueNode(_, t) or - step(n1, n2) and n2.(AdditionalNode).getSuccessorType() = t + stepIgnoringDeferExit(n1, n2) and n2.(AdditionalNode).getSuccessorType() = t or - step(n1, n2) and + stepIgnoringDeferExit(n1, n2) and not n2 instanceof AfterValueNode and not n2 instanceof AdditionalNode and t instanceof DirectSuccessor or exists(AstNode ast, AbruptCompletion c | - last(ast, n1, c) and endAbruptCompletion(ast, n2, c) and t = c.getSuccessorType() + last(ast, n1, c) and + endAbruptCompletion(ast, n2, c) and + not Input2::overridesAbruptCompletionEdge(n1, n2, c) and + t = c.getSuccessorType() ) } @@ -2019,6 +2277,45 @@ module Make0 Ast> { preSucc(n1, n2, t) } + /** + * Holds if `n2` is a normal successor of `n1` of type `t`, computed over + * the defer-free step relation `stepIgnoringDeferExit` (i.e. ignoring the + * epilogue edges added through `Input2::deferExitStep`). + * + * Abrupt-completion edges are deliberately omitted: this relation only + * needs to expose the normal control flow used to compute a language's + * reachability gate for its `deferExitStep` edges. + */ + private predicate preSuccIgnoringDeferExit( + PreControlFlowNode n1, PreControlFlowNode n2, SuccessorType t + ) { + stepIgnoringDeferExit(n1, n2) and n2 = TAfterValueNode(_, t) + or + stepIgnoringDeferExit(n1, n2) and n2.(AdditionalNode).getSuccessorType() = t + or + stepIgnoringDeferExit(n1, n2) and + not n2 instanceof AfterValueNode and + not n2 instanceof AdditionalNode and + t instanceof DirectSuccessor + } + + /** + * Holds if `n2` is a successor of `n1` of type `t`, ignoring the + * epilogue edges added through `Input2::deferExitStep`. + * + * This exposes the defer-free reachability that a language needs in order + * to compute the reachability gate for its `deferExitStep` edges without + * observing those edges. It is typed over `PreControlFlowNode` (rather + * than the reachability-restricted `ControlFlowNode`) so that a language + * can use it to compute `deferExitStep` without a non-monotonic cycle + * through `reachable`. + */ + cached + predicate succIgnoringDeferExit(PreControlFlowNode n1, PreControlFlowNode n2, SuccessorType t) { + Input1::cfgCachedStageRef() and + preSuccIgnoringDeferExit(n1, n2, t) + } + /** The cached stage of the control flow graph. */ cached module CfgCachedStage { @@ -2033,7 +2330,8 @@ module Make0 Ast> { (simpleLeafNode(_) implies any()) and (exists(TBeforeNode(_)) implies any()) and (reachable(_) implies any()) and - (succ(_, _, _) implies any()) + (succ(_, _, _) implies any()) and + (succIgnoringDeferExit(_, _, _) implies any()) } } @@ -2057,6 +2355,19 @@ module Make0 Ast> { /** Gets an immediate successor of this node, if this is not an `ExitNode`. */ ControlFlowNode getASuccessor() { result = this.getASuccessor(_) } + /** + * Gets an immediate successor of this node, ignoring the + * reachability-dependent function-exit epilogue edges added through + * `deferExitStep` (such as Go's deferred calls). + * + * This is intended for languages that need to compute reachability + * before those epilogue edges are added; it should not be used as a + * general successor relation. + */ + ControlFlowNode getASuccessorIgnoringDeferredExit() { + succIgnoringDeferExit(this, result, _) + } + /** Gets an immediate predecessor of this node, if this is not an `EntryNode`. */ ControlFlowNode getAPredecessor() { result.getASuccessor() = this } From 30a048837e37bb0dcbc5bf00bd2889819b9559cc Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 13 May 2026 14:34:35 +0100 Subject: [PATCH 0980/2098] Add go/print-cfg --- go/ql/lib/printCfg.ql | 53 +++++++++++++++++++ .../go/controlflow/ControlFlowGraph.qll | 2 + .../go/controlflow/ControlFlowGraphShared.qll | 2 + 3 files changed, 57 insertions(+) create mode 100644 go/ql/lib/printCfg.ql diff --git a/go/ql/lib/printCfg.ql b/go/ql/lib/printCfg.ql new file mode 100644 index 000000000000..cd12a635c009 --- /dev/null +++ b/go/ql/lib/printCfg.ql @@ -0,0 +1,53 @@ +/** + * @name Print CFG + * @description Produces a representation of a file's Control Flow Graph. + * This query is used by the VS Code extension. + * @id go/print-cfg + * @kind graph + * @tags ide-contextual-queries/print-cfg + */ + +import go +import semmle.go.controlflow.ControlFlowGraph +private import semmle.go.controlflow.ControlFlowGraphShared + +external string selectedSourceFile(); + +private predicate selectedSourceFileAlias = selectedSourceFile/0; + +external int selectedSourceLine(); + +private predicate selectedSourceLineAlias = selectedSourceLine/0; + +external int selectedSourceColumn(); + +private predicate selectedSourceColumnAlias = selectedSourceColumn/0; + +module ViewCfgQueryInput implements CfgImpl::ControlFlow::ViewCfgQueryInputSig { + predicate selectedSourceFile = selectedSourceFileAlias/0; + + predicate selectedSourceLine = selectedSourceLineAlias/0; + + predicate selectedSourceColumn = selectedSourceColumnAlias/0; + + predicate cfgScopeSpan( + CfgScope scope, File file, int startLine, int startColumn, int endLine, int endColumn + ) { + file = scope.getFile() and + scope.getLocation().getStartLine() = startLine and + scope.getLocation().getStartColumn() = startColumn and + exists(Location loc | + loc.getEndLine() = endLine and + loc.getEndColumn() = endColumn and + loc = scope.(FuncDef).getBody().getLocation() + ) + or + file = scope.(File) and + startLine = 1 and + startColumn = 1 and + endLine = file.getNumberOfLines() and + endColumn = 999999 + } +} + +import CfgImpl::ControlFlow::ViewCfgQuery diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll index 80ee4e06ce4d..2e44d68c9ac7 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll @@ -399,4 +399,6 @@ module ControlFlow { class ControlFlowNode = ControlFlow::Node; +class CfgScope = CfgImpl::CfgScope; + class Write = ControlFlow::WriteNode; diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll index 1a2f5207d29e..ae1f940d0174 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll @@ -23,6 +23,8 @@ module CfgImpl { private import Cfg2 import Public + class CfgScope = Ast::Callable; + /** Holds if `e` has an implicit field selection at `index` for `implicitField`. */ predicate implicitFieldSelection(Go::AstNode e, int index, Go::Field implicitField) { Input::implicitFieldSelection(e, index, implicitField) From e7000abe0dd42b732dbd38a9a09bff9906f9c942 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Mon, 1 Jun 2026 23:18:57 +0100 Subject: [PATCH 0981/2098] Add Go CFG consistency query --- go/ql/consistency-queries/CfgConsistency.ql | 3 +++ .../CONSISTENCY/CfgConsistency.expected | 10 +++++++ .../CONSISTENCY/CfgConsistency.expected | 12 +++++++++ .../CONSISTENCY/CfgConsistency.expected | 12 +++++++++ .../CONSISTENCY/CfgConsistency.expected | 26 +++++++++++++++++++ .../CONSISTENCY/CfgConsistency.expected | 5 ++++ .../CONSISTENCY/CfgConsistency.expected | 0 .../CONSISTENCY/CfgConsistency.expected | 5 ++++ .../CONSISTENCY/CfgConsistency.expected | 9 +++++++ .../CONSISTENCY/CfgConsistency.expected | 13 ++++++++++ .../CONSISTENCY/CfgConsistency.expected | 12 +++++++++ .../CONSISTENCY/CfgConsistency.expected | 6 +++++ 12 files changed, 113 insertions(+) create mode 100644 go/ql/consistency-queries/CfgConsistency.ql create mode 100644 go/ql/test/experimental/InconsistentCode/CONSISTENCY/CfgConsistency.expected create mode 100644 go/ql/test/experimental/Unsafe/CONSISTENCY/CfgConsistency.expected create mode 100644 go/ql/test/library-tests/semmle/go/PrintAst/CONSISTENCY/CfgConsistency.expected create mode 100644 go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CONSISTENCY/CfgConsistency.expected create mode 100644 go/ql/test/library-tests/semmle/go/dataflow/SliceExpressions/CONSISTENCY/CfgConsistency.expected create mode 100644 go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/CONSISTENCY/CfgConsistency.expected create mode 100644 go/ql/test/library-tests/semmle/go/frameworks/Protobuf/CONSISTENCY/CfgConsistency.expected create mode 100644 go/ql/test/query-tests/InconsistentCode/UnhandledCloseWritableHandle/CONSISTENCY/CfgConsistency.expected create mode 100644 go/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/CONSISTENCY/CfgConsistency.expected create mode 100644 go/ql/test/query-tests/RedundantCode/UnreachableStatement/CONSISTENCY/CfgConsistency.expected create mode 100644 go/ql/test/query-tests/Security/CWE-089/CONSISTENCY/CfgConsistency.expected diff --git a/go/ql/consistency-queries/CfgConsistency.ql b/go/ql/consistency-queries/CfgConsistency.ql new file mode 100644 index 000000000000..bcde1f95c305 --- /dev/null +++ b/go/ql/consistency-queries/CfgConsistency.ql @@ -0,0 +1,3 @@ +import go +private import semmle.go.controlflow.ControlFlowGraphShared +import CfgImpl::ControlFlow::Consistency diff --git a/go/ql/test/experimental/InconsistentCode/CONSISTENCY/CfgConsistency.expected b/go/ql/test/experimental/InconsistentCode/CONSISTENCY/CfgConsistency.expected new file mode 100644 index 000000000000..d615482c8a8f --- /dev/null +++ b/go/ql/test/experimental/InconsistentCode/CONSISTENCY/CfgConsistency.expected @@ -0,0 +1,10 @@ +consistencyOverview +| multipleSuccessors | 4 | +| selfLoop | 1 | +multipleSuccessors +| DeferInLoop.go:5:36:14:1 | After block statement | successor | DeferInLoop.go:5:1:14:1 | Normal Exit | +| DeferInLoop.go:5:36:14:1 | After block statement | successor | DeferInLoop.go:8:9:8:20 | defer-invoke call to Close | +| DeferInLoop.go:8:9:8:20 | defer-invoke call to Close | successor | DeferInLoop.go:5:1:14:1 | Normal Exit | +| DeferInLoop.go:8:9:8:20 | defer-invoke call to Close | successor | DeferInLoop.go:8:9:8:20 | defer-invoke call to Close | +selfLoop +| DeferInLoop.go:8:9:8:20 | defer-invoke call to Close | successor | diff --git a/go/ql/test/experimental/Unsafe/CONSISTENCY/CfgConsistency.expected b/go/ql/test/experimental/Unsafe/CONSISTENCY/CfgConsistency.expected new file mode 100644 index 000000000000..a3879fa1b37d --- /dev/null +++ b/go/ql/test/experimental/Unsafe/CONSISTENCY/CfgConsistency.expected @@ -0,0 +1,12 @@ +consistencyOverview +| missingInNodeForPostOrInOrder | 9 | +missingInNodeForPostOrInOrder +| WrongUsageOfUnsafe.go:19:21:19:27 | (...) | +| WrongUsageOfUnsafe.go:36:21:36:27 | (...) | +| WrongUsageOfUnsafe.go:57:21:57:27 | (...) | +| WrongUsageOfUnsafe.go:79:21:79:30 | (...) | +| WrongUsageOfUnsafe.go:113:21:113:30 | (...) | +| WrongUsageOfUnsafe.go:131:21:131:30 | (...) | +| WrongUsageOfUnsafe.go:151:21:151:30 | (...) | +| WrongUsageOfUnsafe.go:169:25:169:34 | (...) | +| WrongUsageOfUnsafe.go:191:21:191:30 | (...) | diff --git a/go/ql/test/library-tests/semmle/go/PrintAst/CONSISTENCY/CfgConsistency.expected b/go/ql/test/library-tests/semmle/go/PrintAst/CONSISTENCY/CfgConsistency.expected new file mode 100644 index 000000000000..da8fa4817da9 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/PrintAst/CONSISTENCY/CfgConsistency.expected @@ -0,0 +1,12 @@ +consistencyOverview +| deadEnd | 1 | +| multipleSuccessors | 6 | +deadEnd +| input.go:61:2:61:10 | select statement | +multipleSuccessors +| input.go:50:2:59:2 | select statement | successor | input.go:51:2:52:31 | comm clause | +| input.go:50:2:59:2 | select statement | successor | input.go:53:2:55:16 | comm clause | +| input.go:50:2:59:2 | select statement | successor | input.go:56:2:57:15 | comm clause | +| input.go:50:2:59:2 | select statement | successor | input.go:58:2:58:16 | comm clause | +| input.go:71:2:71:10 | return statement | successor | input.go:67:9:67:35 | defer-invoke function call | +| input.go:71:2:71:10 | return statement | successor | input.go:69:9:69:36 | defer-invoke function call | diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CONSISTENCY/CfgConsistency.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CONSISTENCY/CfgConsistency.expected new file mode 100644 index 000000000000..200e3625d6ed --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CONSISTENCY/CfgConsistency.expected @@ -0,0 +1,26 @@ +consistencyOverview +| deadEnd | 1 | +| multipleSuccessors | 20 | +deadEnd +| stmts.go:61:2:61:10 | select statement | +multipleSuccessors +| epilogues.go:61:2:61:38 | call to Println | successor | epilogues.go:60:8:60:33 | defer-invoke call to log | +| epilogues.go:61:2:61:38 | call to Println | successor | epilogues.go:61:2:61:38 | After call to Println | +| epilogues.go:70:2:70:20 | call to Println | successor | epilogues.go:69:8:69:25 | defer-invoke call to log | +| epilogues.go:70:2:70:20 | call to Println | successor | epilogues.go:70:2:70:20 | After call to Println | +| epilogues.go:81:2:81:23 | call to Println | successor | epilogues.go:78:8:80:15 | defer-invoke function call | +| epilogues.go:81:2:81:23 | call to Println | successor | epilogues.go:81:2:81:23 | After call to Println | +| stmts2.go:16:2:26:2 | select statement | successor | stmts2.go:17:2:17:15 | comm clause | +| stmts2.go:16:2:26:2 | select statement | successor | stmts2.go:18:2:19:10 | comm clause | +| stmts2.go:16:2:26:2 | select statement | successor | stmts2.go:20:2:24:10 | comm clause | +| stmts2.go:16:2:26:2 | select statement | successor | stmts2.go:25:2:25:18 | comm clause | +| stmts7.go:29:2:29:31 | call to Println | successor | stmts7.go:28:8:28:23 | defer-invoke call to fn | +| stmts7.go:29:2:29:31 | call to Println | successor | stmts7.go:29:2:29:31 | After call to Println | +| stmts7.go:54:6:54:18 | index expression | successor | stmts7.go:53:8:53:21 | defer-invoke call to recoverPanic | +| stmts7.go:54:6:54:18 | index expression | successor | stmts7.go:54:6:54:18 | After index expression | +| stmts.go:50:2:59:2 | select statement | successor | stmts.go:51:2:52:31 | comm clause | +| stmts.go:50:2:59:2 | select statement | successor | stmts.go:53:2:55:16 | comm clause | +| stmts.go:50:2:59:2 | select statement | successor | stmts.go:56:2:57:15 | comm clause | +| stmts.go:50:2:59:2 | select statement | successor | stmts.go:58:2:58:16 | comm clause | +| stmts.go:71:2:71:10 | return statement | successor | stmts.go:67:9:67:35 | defer-invoke function call | +| stmts.go:71:2:71:10 | return statement | successor | stmts.go:69:9:69:36 | defer-invoke function call | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/SliceExpressions/CONSISTENCY/CfgConsistency.expected b/go/ql/test/library-tests/semmle/go/dataflow/SliceExpressions/CONSISTENCY/CfgConsistency.expected new file mode 100644 index 000000000000..25cf4726d273 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/SliceExpressions/CONSISTENCY/CfgConsistency.expected @@ -0,0 +1,5 @@ +consistencyOverview +| missingInNodeForPostOrInOrder | 2 | +missingInNodeForPostOrInOrder +| main.go:40:2:40:8 | (...) | +| main.go:41:11:41:17 | (...) | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/CONSISTENCY/CfgConsistency.expected b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/CONSISTENCY/CfgConsistency.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Protobuf/CONSISTENCY/CfgConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/Protobuf/CONSISTENCY/CfgConsistency.expected new file mode 100644 index 000000000000..74975ed06775 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/frameworks/Protobuf/CONSISTENCY/CfgConsistency.expected @@ -0,0 +1,5 @@ +consistencyOverview +| missingInNodeForPostOrInOrder | 2 | +missingInNodeForPostOrInOrder +| testDeprecatedApi.go:169:13:169:20 | (...) | +| testModernApi.go:226:13:226:20 | (...) | diff --git a/go/ql/test/query-tests/InconsistentCode/UnhandledCloseWritableHandle/CONSISTENCY/CfgConsistency.expected b/go/ql/test/query-tests/InconsistentCode/UnhandledCloseWritableHandle/CONSISTENCY/CfgConsistency.expected new file mode 100644 index 000000000000..5d575b21805f --- /dev/null +++ b/go/ql/test/query-tests/InconsistentCode/UnhandledCloseWritableHandle/CONSISTENCY/CfgConsistency.expected @@ -0,0 +1,9 @@ +consistencyOverview +| multipleSuccessors | 6 | +multipleSuccessors +| tests.go:94:30:105:1 | After block statement | successor | tests.go:94:1:105:1 | Normal Exit | +| tests.go:94:30:105:1 | After block statement | successor | tests.go:99:9:99:17 | defer-invoke call to Close | +| tests.go:107:31:120:1 | After block statement | successor | tests.go:107:1:120:1 | Normal Exit | +| tests.go:107:31:120:1 | After block statement | successor | tests.go:112:9:112:17 | defer-invoke call to Close | +| tests.go:122:46:137:1 | After block statement | successor | tests.go:122:1:137:1 | Normal Exit | +| tests.go:122:46:137:1 | After block statement | successor | tests.go:126:9:126:17 | defer-invoke call to Close | diff --git a/go/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/CONSISTENCY/CfgConsistency.expected b/go/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/CONSISTENCY/CfgConsistency.expected new file mode 100644 index 000000000000..b77a8bf15ea0 --- /dev/null +++ b/go/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/CONSISTENCY/CfgConsistency.expected @@ -0,0 +1,13 @@ +consistencyOverview +| multipleSuccessors | 10 | +multipleSuccessors +| testdata.go:418:2:423:2 | select statement | successor | testdata.go:419:2:420:7 | comm clause | +| testdata.go:418:2:423:2 | select statement | successor | testdata.go:421:2:422:7 | comm clause | +| testdata.go:430:2:437:2 | select statement | successor | testdata.go:431:2:432:17 | comm clause | +| testdata.go:430:2:437:2 | select statement | successor | testdata.go:433:2:434:17 | comm clause | +| testdata.go:430:2:437:2 | select statement | successor | testdata.go:435:2:436:7 | comm clause | +| testdata.go:443:2:450:2 | select statement | successor | testdata.go:444:2:445:7 | comm clause | +| testdata.go:443:2:450:2 | select statement | successor | testdata.go:446:2:447:7 | comm clause | +| testdata.go:443:2:450:2 | select statement | successor | testdata.go:448:2:449:7 | comm clause | +| testdata.go:457:2:462:2 | select statement | successor | testdata.go:458:2:459:7 | comm clause | +| testdata.go:457:2:462:2 | select statement | successor | testdata.go:460:2:461:7 | comm clause | diff --git a/go/ql/test/query-tests/RedundantCode/UnreachableStatement/CONSISTENCY/CfgConsistency.expected b/go/ql/test/query-tests/RedundantCode/UnreachableStatement/CONSISTENCY/CfgConsistency.expected new file mode 100644 index 000000000000..15227b6e59b4 --- /dev/null +++ b/go/ql/test/query-tests/RedundantCode/UnreachableStatement/CONSISTENCY/CfgConsistency.expected @@ -0,0 +1,12 @@ +consistencyOverview +| deadEnd | 9 | +deadEnd +| main.go:17:2:17:10 | select statement | +| main.go:109:2:109:10 | select statement | +| main.go:115:2:115:10 | select statement | +| main.go:126:2:126:10 | select statement | +| main.go:132:2:132:10 | select statement | +| main.go:138:2:138:10 | select statement | +| main.go:145:2:145:10 | select statement | +| main.go:151:2:151:10 | select statement | +| main.go:157:2:157:10 | select statement | diff --git a/go/ql/test/query-tests/Security/CWE-089/CONSISTENCY/CfgConsistency.expected b/go/ql/test/query-tests/Security/CWE-089/CONSISTENCY/CfgConsistency.expected new file mode 100644 index 000000000000..5b87c646a3b5 --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-089/CONSISTENCY/CfgConsistency.expected @@ -0,0 +1,6 @@ +consistencyOverview +| missingInNodeForPostOrInOrder | 3 | +missingInNodeForPostOrInOrder +| main.go:49:2:49:15 | (...) | +| main.go:58:2:58:15 | (...) | +| main.go:61:3:61:16 | (...) | From 0bd998f82f1dc8c0272c08fd5f1e641c0881cab4 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 10 Jul 2026 01:00:55 +0100 Subject: [PATCH 0982/2098] fold implicit-one operand into incdec-rhs instruction Increment/decrement statements previously produced three control-flow nodes: an 'implicit-one' node for the constant 1, an 'incdec-rhs' node for the 'operand + 1' value, and the write node. The implicit-one node existed only to serve as the right operand of the increment's binary operation model. Remove the implicit-one node, modelling the implicit constant 1 directly on the incdec-rhs instruction. This saves one CFG node per inc/dec. The inc/dec disjunct of BinaryOperationNode is dropped as well; it only fed string-concatenation taint (impossible for ++/--) and GVN of a synthetic node, so no data-flow results are lost. --- .../go/controlflow/ControlFlowGraphShared.qll | 17 +++++++------ go/ql/lib/semmle/go/controlflow/IR.qll | 24 ------------------- .../go/dataflow/internal/DataFlowNodes.qll | 9 ------- .../ControlFlowNode_getASuccessor.expected | 12 ++++------ .../GlobalValueNumber.expected | 1 - 5 files changed, 12 insertions(+), 51 deletions(-) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll index ae1f940d0174..f54141b7c381 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll @@ -531,9 +531,7 @@ module CfgImpl { tag = "zero-init:" + i.toString() ) or - // Increment/decrement implicit operations - n instanceof Go::IncDecStmt and tag = "implicit-one" - or + // Increment/decrement implicit right-hand side (the `operand + 1` value) n instanceof Go::IncDecStmt and tag = "incdec-rhs" or // Result write nodes in return statements @@ -1228,19 +1226,20 @@ module CfgImpl { } /** - * Increment/decrement: operand → implicit-one → incdec-rhs → In(stmt) + * Increment/decrement: operand → incdec-rhs → In(stmt) * (IncDecStmt is in postOrInOrder, so In(stmt) is its evaluation point) + * + * The implicit constant `1` operand of the `operand + 1` computation is + * modelled directly on the `incdec-rhs` instruction rather than as its own + * control-flow node. */ private predicate incDecStep(PreControlFlowNode n1, PreControlFlowNode n2) { exists(Go::IncDecStmt s | // Before → Before operand n1.isBefore(s) and n2.isBefore(s.getOperand()) or - // After operand → implicit-one - n1.isAfter(s.getOperand()) and n2.isAdditional(s, "implicit-one") - or - // implicit-one → incdec-rhs - n1.isAdditional(s, "implicit-one") and n2.isAdditional(s, "incdec-rhs") + // After operand → incdec-rhs + n1.isAfter(s.getOperand()) and n2.isAdditional(s, "incdec-rhs") or // incdec-rhs → In(stmt) (the assignment itself) n1.isAdditional(s, "incdec-rhs") and n2.isIn(s) diff --git a/go/ql/lib/semmle/go/controlflow/IR.qll b/go/ql/lib/semmle/go/controlflow/IR.qll index f64d8c6072b2..d3fb8079475f 100644 --- a/go/ql/lib/semmle/go/controlflow/IR.qll +++ b/go/ql/lib/semmle/go/controlflow/IR.qll @@ -208,8 +208,6 @@ module IR { this instanceof EvalIncDecRhsInstruction and result = "right-hand side of increment/decrement" or - this instanceof EvalImplicitOneInstruction and result = "implicit 1" - or this instanceof ReturnInstruction and result = "return" or this instanceof WriteResultInstruction and result = "result write" @@ -967,28 +965,6 @@ module IR { override ControlFlow::Root getRoot() { result.isRootOf(ids) } } - /** An instruction computing the implicit operand `1` in an increment or decrement statement. */ - class EvalImplicitOneInstruction extends Instruction { - IncDecStmt ids; - - EvalImplicitOneInstruction() { this.isAdditional(ids, "implicit-one") } - - /** Gets the corresponding increment or decrement statement. */ - IncDecStmt getStmt() { result = ids } - - override Type getResultType() { result = ids.getOperand().getType() } - - override ControlFlow::Root getRoot() { result.isRootOf(ids) } - - override int getIntValue() { result = 1 } - - override string getExactValue() { result = "1" } - - override predicate isConst() { any() } - - override predicate isPlatformIndependentConstant() { any() } - } - /** An instruction corresponding to a return from a function. */ class ReturnInstruction extends Instruction { ReturnStmt ret; diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll index 655192e84713..ff609e008dff 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll @@ -1127,15 +1127,6 @@ module Public { right = DataFlow::exprNode(assgn.getRhs()) and op = o.substring(0, o.length() - 1) ) - or - exists(IR::EvalIncDecRhsInstruction rhs, IncDecStmt ids | - rhs = this.asInstruction() and ids = rhs.getStmt() - | - left = DataFlow::exprNode(ids.getOperand()) and - right = - DataFlow::instructionNode(any(IR::EvalImplicitOneInstruction one | one.getStmt() = ids)) and - op = ids.getOperator().charAt(0) - ) } /** Holds if this operation may have observable side effects. */ diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected index 4f790e0f29b6..19f2a3530164 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected @@ -1332,12 +1332,11 @@ | exprs.go:50:22:50:23 | After xs | exprs.go:50:18:50:24 | call to len | | exprs.go:50:22:50:23 | Before xs | exprs.go:50:22:50:23 | xs | | exprs.go:50:22:50:23 | xs | exprs.go:50:22:50:23 | After xs | -| exprs.go:50:27:50:27 | After i | exprs.go:50:27:50:29 | implicit-one increment statement | +| exprs.go:50:27:50:27 | After i | exprs.go:50:27:50:29 | incdec-rhs increment statement | | exprs.go:50:27:50:27 | Before i | exprs.go:50:27:50:27 | i | | exprs.go:50:27:50:27 | i | exprs.go:50:27:50:27 | After i | | exprs.go:50:27:50:29 | After increment statement | exprs.go:50:14:50:24 | Before ...<... | | exprs.go:50:27:50:29 | Before increment statement | exprs.go:50:27:50:27 | Before i | -| exprs.go:50:27:50:29 | implicit-one increment statement | exprs.go:50:27:50:29 | incdec-rhs increment statement | | exprs.go:50:27:50:29 | incdec-rhs increment statement | exprs.go:50:27:50:29 | increment statement | | exprs.go:50:27:50:29 | increment statement | exprs.go:50:27:50:29 | After increment statement | | exprs.go:50:31:52:2 | After block statement | exprs.go:50:2:52:2 | [LoopHeader] for statement | @@ -2289,12 +2288,11 @@ | main.go:74:11:74:11 | 0 | main.go:74:11:74:11 | After 0 | | main.go:74:11:74:11 | After 0 | main.go:74:6:74:11 | assign:0 ... := ... | | main.go:74:11:74:11 | Before 0 | main.go:74:11:74:11 | 0 | -| main.go:74:16:74:16 | After i | main.go:74:16:74:18 | implicit-one increment statement | +| main.go:74:16:74:16 | After i | main.go:74:16:74:18 | incdec-rhs increment statement | | main.go:74:16:74:16 | Before i | main.go:74:16:74:16 | i | | main.go:74:16:74:16 | i | main.go:74:16:74:16 | After i | | main.go:74:16:74:18 | After increment statement | main.go:74:20:79:2 | block statement | | main.go:74:16:74:18 | Before increment statement | main.go:74:16:74:16 | Before i | -| main.go:74:16:74:18 | implicit-one increment statement | main.go:74:16:74:18 | incdec-rhs increment statement | | main.go:74:16:74:18 | incdec-rhs increment statement | main.go:74:16:74:18 | increment statement | | main.go:74:16:74:18 | increment statement | main.go:74:16:74:18 | After increment statement | | main.go:74:20:79:2 | After block statement | main.go:74:2:79:2 | [LoopHeader] for statement | @@ -2346,12 +2344,11 @@ | main.go:83:11:83:11 | 0 | main.go:83:11:83:11 | After 0 | | main.go:83:11:83:11 | After 0 | main.go:83:6:83:11 | assign:0 ... := ... | | main.go:83:11:83:11 | Before 0 | main.go:83:11:83:11 | 0 | -| main.go:83:16:83:16 | After i | main.go:83:16:83:18 | implicit-one increment statement | +| main.go:83:16:83:16 | After i | main.go:83:16:83:18 | incdec-rhs increment statement | | main.go:83:16:83:16 | Before i | main.go:83:16:83:16 | i | | main.go:83:16:83:16 | i | main.go:83:16:83:16 | After i | | main.go:83:16:83:18 | After increment statement | main.go:83:20:88:2 | block statement | | main.go:83:16:83:18 | Before increment statement | main.go:83:16:83:16 | Before i | -| main.go:83:16:83:18 | implicit-one increment statement | main.go:83:16:83:18 | incdec-rhs increment statement | | main.go:83:16:83:18 | incdec-rhs increment statement | main.go:83:16:83:18 | increment statement | | main.go:83:16:83:18 | increment statement | main.go:83:16:83:18 | After increment statement | | main.go:83:20:88:2 | After block statement | main.go:83:2:88:2 | [LoopHeader] for statement | @@ -3371,12 +3368,11 @@ | stmts.go:24:19:24:20 | 10 | stmts.go:24:19:24:20 | After 10 | | stmts.go:24:19:24:20 | After 10 | stmts.go:24:15:24:20 | ...<... | | stmts.go:24:19:24:20 | Before 10 | stmts.go:24:19:24:20 | 10 | -| stmts.go:24:23:24:23 | After i | stmts.go:24:23:24:25 | implicit-one increment statement | +| stmts.go:24:23:24:23 | After i | stmts.go:24:23:24:25 | incdec-rhs increment statement | | stmts.go:24:23:24:23 | Before i | stmts.go:24:23:24:23 | i | | stmts.go:24:23:24:23 | i | stmts.go:24:23:24:23 | After i | | stmts.go:24:23:24:25 | After increment statement | stmts.go:24:15:24:20 | Before ...<... | | stmts.go:24:23:24:25 | Before increment statement | stmts.go:24:23:24:23 | Before i | -| stmts.go:24:23:24:25 | implicit-one increment statement | stmts.go:24:23:24:25 | incdec-rhs increment statement | | stmts.go:24:23:24:25 | incdec-rhs increment statement | stmts.go:24:23:24:25 | increment statement | | stmts.go:24:23:24:25 | increment statement | stmts.go:24:23:24:25 | After increment statement | | stmts.go:24:27:36:3 | block statement | stmts.go:25:4:35:4 | if statement | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/GlobalValueNumber.expected b/go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/GlobalValueNumber.expected index 57e27adb79f7..ded6eb10316c 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/GlobalValueNumber.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/GlobalValueNumber.expected @@ -1,4 +1,3 @@ -| main.go:6:2:6:5 | implicit-one increment statement | main.go:14:7:14:7 | 1 | | main.go:10:2:10:7 | SSA def(x) | main.go:10:7:10:7 | 0 | | main.go:10:7:10:7 | 0 | main.go:10:7:10:7 | 0 | | main.go:11:6:11:10 | SSA def(y) | main.go:10:7:10:7 | 0 | From dee1d8cc9d1fd9d94e2ea9c7e4ffc2f4a5a74569 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 10 Jul 2026 01:12:29 +0100 Subject: [PATCH 0983/2098] fold compound-assign write into the compound-rhs instruction A compound assignment (`x += y`) previously produced two sequential control-flow nodes: a 'compound-rhs' node computing the binary operation `x + y`, followed by an 'assign:0' write node storing the result. Make the compound-rhs instruction itself perform the write (it becomes a WriteInstruction whose right-hand side is its own value), and stop emitting the separate assign:0 node for compound assignments. This saves one CFG node per compound assignment while preserving the BinaryOperationNode model (so string-concatenation taint through `s += ...` still holds) and SSA semantics (the def value is the binary operation). --- .../go/controlflow/ControlFlowGraphShared.qll | 10 +++++++++- go/ql/lib/semmle/go/controlflow/IR.qll | 14 ++++++++++---- .../ControlFlowNode_getASuccessor.expected | 12 ++++-------- .../semmle/go/dataflow/SSA/VarDefs.expected | 2 +- 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll index f54141b7c381..193b4ea2e416 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll @@ -496,6 +496,11 @@ module CfgImpl { exists(int i | ( notBlankIdent(n.(Go::Assignment).getLhs(i)) and + // A compound assignment (`x += y`) folds its write into the + // `compound-rhs` binary-operation instruction rather than emitting a + // separate `assign:i` write node (see + // `IR::EvalCompoundAssignRhsInstruction`). + not n instanceof Go::CompoundAssignStmt and // The `y := x.(type)` test statement of a type switch is transparent // (see `skipCfg`): the per-case implicit variables are written at the // case match nodes (see `IR::TypeSwitchImplicitVariableInstruction`), @@ -1165,7 +1170,10 @@ module CfgImpl { ) or ( - notBlankIdent(assgn.(Go::Assignment).getLhs(j)) + notBlankIdent(assgn.(Go::Assignment).getLhs(j)) and + // Compound assignments fold their write into `compound-rhs` (ord -1) + // above, so they emit no separate `assign:j` node. + not assgn instanceof Go::CompoundAssignStmt or notBlankIdent(assgn.(Go::ValueSpec).getNameExpr(j)) or diff --git a/go/ql/lib/semmle/go/controlflow/IR.qll b/go/ql/lib/semmle/go/controlflow/IR.qll index d3fb8079475f..cae74302349f 100644 --- a/go/ql/lib/semmle/go/controlflow/IR.qll +++ b/go/ql/lib/semmle/go/controlflow/IR.qll @@ -745,8 +745,6 @@ module IR { implicitInitInstruction(any(ValueEntity v | spec.getNameExpr(i) = v.getDeclaration())) ) or - result.(EvalCompoundAssignRhsInstruction).isAdditional(assgn, "compound-rhs") - or result.(ExtractTupleElementInstruction).isAdditional(assgn, "extract:" + i.toString()) } @@ -754,9 +752,11 @@ module IR { } /** - * An instruction that computes the (implicit) right-hand side of a compound assignment. + * An instruction that computes the (implicit) right-hand side of a compound assignment, + * such as the `x + y` in `x += y`, and writes the resulting value to the assignment's + * left-hand side. */ - class EvalCompoundAssignRhsInstruction extends Instruction { + class EvalCompoundAssignRhsInstruction extends WriteInstruction { CompoundAssignStmt assgn; EvalCompoundAssignRhsInstruction() { this.isAdditional(assgn, "compound-rhs") } @@ -764,6 +764,8 @@ module IR { /** Gets the corresponding compound assignment statement. */ CompoundAssignStmt getAssignment() { result = assgn } + override Instruction getRhs() { result = this } + override Type getResultType() { result = assgn.getRhs().getType() } override ControlFlow::Root getRoot() { result.isRootOf(assgn) } @@ -1231,6 +1233,10 @@ module IR { or exists(IncDecStmt ids | write.isIn(ids) | lhs = ids.getOperand().stripParens()) or + exists(CompoundAssignStmt ca | write.isAdditional(ca, "compound-rhs") | + lhs = ca.getLhs().stripParens() + ) + or exists(FuncDef fd, int idx | write.isBefore(fd.getParameter(idx).getDeclaration()) and lhs = fd.getParameter(idx).getDeclaration() diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected index 19f2a3530164..32a9e344c7ad 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected @@ -1346,8 +1346,7 @@ | exprs.go:51:3:51:5 | res | exprs.go:51:3:51:5 | After res | | exprs.go:51:3:51:14 | ... += ... | exprs.go:51:3:51:5 | Before res | | exprs.go:51:3:51:14 | After ... += ... | exprs.go:50:31:52:2 | After block statement | -| exprs.go:51:3:51:14 | assign:0 ... += ... | exprs.go:51:3:51:14 | After ... += ... | -| exprs.go:51:3:51:14 | compound-rhs ... += ... | exprs.go:51:3:51:14 | assign:0 ... += ... | +| exprs.go:51:3:51:14 | compound-rhs ... += ... | exprs.go:51:3:51:14 | After ... += ... | | exprs.go:51:10:51:11 | After xs | exprs.go:51:13:51:13 | Before i | | exprs.go:51:10:51:11 | Before xs | exprs.go:51:10:51:11 | xs | | exprs.go:51:10:51:11 | xs | exprs.go:51:10:51:11 | After xs | @@ -1967,8 +1966,7 @@ | main.go:17:3:17:3 | y | main.go:17:3:17:3 | After y | | main.go:17:3:17:9 | ... += ... | main.go:17:3:17:3 | Before y | | main.go:17:3:17:9 | After ... += ... | main.go:16:12:18:2 | After block statement | -| main.go:17:3:17:9 | assign:0 ... += ... | main.go:17:3:17:9 | After ... += ... | -| main.go:17:3:17:9 | compound-rhs ... += ... | main.go:17:3:17:9 | assign:0 ... += ... | +| main.go:17:3:17:9 | compound-rhs ... += ... | main.go:17:3:17:9 | After ... += ... | | main.go:17:8:17:9 | 19 | main.go:17:8:17:9 | After 19 | | main.go:17:8:17:9 | After 19 | main.go:17:3:17:9 | compound-rhs ... += ... | | main.go:17:8:17:9 | Before 19 | main.go:17:8:17:9 | 19 | @@ -2083,8 +2081,7 @@ | main.go:35:2:35:3 | star expression | main.go:35:2:35:3 | After star expression | | main.go:35:2:35:9 | ... += ... | main.go:35:2:35:3 | Before star expression | | main.go:35:2:35:9 | After ... += ... | main.go:34:19:36:1 | After block statement | -| main.go:35:2:35:9 | assign:0 ... += ... | main.go:35:2:35:9 | After ... += ... | -| main.go:35:2:35:9 | compound-rhs ... += ... | main.go:35:2:35:9 | assign:0 ... += ... | +| main.go:35:2:35:9 | compound-rhs ... += ... | main.go:35:2:35:9 | After ... += ... | | main.go:35:3:35:3 | After x | main.go:35:2:35:3 | star expression | | main.go:35:3:35:3 | Before x | main.go:35:3:35:3 | x | | main.go:35:3:35:3 | x | main.go:35:3:35:3 | After x | @@ -2911,8 +2908,7 @@ | stmts5.go:8:2:8:7 | selection of val | stmts5.go:8:2:8:7 | After selection of val | | stmts5.go:8:2:8:16 | ... += ... | stmts5.go:8:2:8:7 | Before selection of val | | stmts5.go:8:2:8:16 | After ... += ... | stmts5.go:7:33:9:1 | After block statement | -| stmts5.go:8:2:8:16 | assign:0 ... += ... | stmts5.go:8:2:8:16 | After ... += ... | -| stmts5.go:8:2:8:16 | compound-rhs ... += ... | stmts5.go:8:2:8:16 | assign:0 ... += ... | +| stmts5.go:8:2:8:16 | compound-rhs ... += ... | stmts5.go:8:2:8:16 | After ... += ... | | stmts5.go:8:12:8:16 | After other | stmts5.go:8:2:8:16 | compound-rhs ... += ... | | stmts5.go:8:12:8:16 | Before other | stmts5.go:8:12:8:16 | other | | stmts5.go:8:12:8:16 | other | stmts5.go:8:12:8:16 | After other | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarDefs.expected b/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarDefs.expected index 80297cd40b9e..d280aa1ac14e 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarDefs.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarDefs.expected @@ -1,6 +1,6 @@ | main.go:13:6:13:10 | assign:0 value declaration specifier | main.go:13:6:13:6 | x | main.go:13:6:13:10 | zero-init:0 value declaration specifier | | main.go:14:2:14:8 | assign:0 ... := ... | main.go:14:2:14:2 | y | main.go:14:7:14:8 | 23 | -| main.go:17:3:17:9 | assign:0 ... += ... | main.go:14:2:14:2 | y | main.go:17:3:17:9 | compound-rhs ... += ... | +| main.go:17:3:17:9 | compound-rhs ... += ... | main.go:14:2:14:2 | y | main.go:17:3:17:9 | compound-rhs ... += ... | | main.go:21:3:21:7 | assign:0 ... = ... | main.go:13:6:13:6 | x | main.go:21:7:21:7 | y | | main.go:26:10:26:10 | x | main.go:26:10:26:10 | x | main.go:26:10:26:10 | x | | main.go:27:2:27:13 | assign:0 ... := ... | main.go:27:2:27:2 | a | main.go:27:10:27:10 | x | From 2c77287ead8a0eba93ae8ed0a7f43a1675c3e4a3 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 10 Jul 2026 01:22:43 +0100 Subject: [PATCH 0984/2098] drop implicit slice-bound nodes A slice expression with omitted bounds (e.g. `s[:]`, `s[a:]`, `s[:b]`) previously created up to three synthetic control-flow nodes: implicit-low (constant 0), implicit-high (length) and implicit-max (capacity). These carried no data-flow value beyond the implicit lower bound of 0. Stop emitting these nodes: control flow now skips directly to the next present bound (or the slice evaluation). SliceInstruction.getLow/getHigh/ getMax return only explicit bounds. The one consumer of the implicit lower bound, StringOps' HasPrefix_Substring, now treats an absent lower bound as 0. No data-flow or StringOps results change. --- go/ql/lib/semmle/go/StringOps.qll | 3 +- .../go/controlflow/ControlFlowGraphShared.qll | 108 +++++++++--------- go/ql/lib/semmle/go/controlflow/IR.qll | 89 +-------------- .../ControlFlowNode_getASuccessor.expected | 16 +-- 4 files changed, 67 insertions(+), 149 deletions(-) diff --git a/go/ql/lib/semmle/go/StringOps.qll b/go/ql/lib/semmle/go/StringOps.qll index 6af2946f95c5..3c646d7c9413 100644 --- a/go/ql/lib/semmle/go/StringOps.qll +++ b/go/ql/lib/semmle/go/StringOps.qll @@ -147,7 +147,8 @@ module StringOps { HasPrefix_Substring() { this.eq(_, slice, substring) and - slice.getLow().getIntValue() = 0 and + // An omitted lower bound (`x[:len(y)]`) is implicitly `0`. + (not exists(slice.getLow()) or slice.getLow().getIntValue() = 0) and ( exists(DataFlow::CallNode len | len = Builtin::len().getACall() and diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll index 193b4ea2e416..6efdd14635e5 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll @@ -575,19 +575,6 @@ module CfgImpl { // Implicit deref implicitDerefCondition(n) and tag = "implicit-deref" or - // Implicit slice bounds - n instanceof Go::SliceExpr and - not exists(n.(Go::SliceExpr).getLow()) and - tag = "implicit-low" - or - n instanceof Go::SliceExpr and - not exists(n.(Go::SliceExpr).getHigh()) and - tag = "implicit-high" - or - n instanceof Go::SliceExpr and - not exists(n.(Go::SliceExpr).getMax()) and - tag = "implicit-max" - or // Literal element initialization n = any(Go::CompositeLit lit).getAnElement() and tag = "lit-init" @@ -1323,52 +1310,65 @@ module CfgImpl { } /** - * Slice expression: base → implicit-deref? → low/implicit-low → - * high/implicit-high → max/implicit-max → In(sliceExpr) + * Gets the bound expression of slice `se` at position `r` (`0` = low, + * `1` = high, `2` = max), if it is present. + */ + private Go::Expr sliceBoundExpr(Go::SliceExpr se, int r) { + r = 0 and result = se.getLow() + or + r = 1 and result = se.getHigh() + or + r = 2 and result = se.getMax() + } + + /** + * Holds if, having finished evaluating the slice component at position `p` + * (`-1` = base, `0` = low, `1` = high, `2` = max), `n2` is the control-flow + * node to execute next: the next present bound in `low, high, max` order, or + * the slice evaluation node `In(se)` if no further bound is present. + * + * Implicit (omitted) bounds have no control-flow node of their own, so + * control simply skips over them. + */ + bindingset[p] + private predicate sliceNext(Go::SliceExpr se, int p, PreControlFlowNode n2) { + exists(int q | q = min(int r | r > p and exists(sliceBoundExpr(se, r)) | r) | + n2.isBefore(sliceBoundExpr(se, q)) + ) + or + not exists(int r | r > p and exists(sliceBoundExpr(se, r))) and + n2.isIn(se) + } + + /** + * Slice expression: base → implicit-deref? → low? → high? → max? → In(sliceExpr). + * + * Missing (implicit) bounds have no control-flow node of their own; the + * implicit lower bound of `0` is modelled as a constant on the + * `SliceInstruction` rather than as a separate node. */ private predicate sliceExprStep(PreControlFlowNode n1, PreControlFlowNode n2) { exists(Go::SliceExpr se | - (implicitDerefCondition(se.getBase()) or exists(se.getLow()) or not exists(se.getLow())) and + n1.isBefore(se) and n2.isBefore(se.getBase()) + or + // After base → implicit deref, or (if none) the first present bound / slice eval + n1.isAfter(se.getBase()) and ( - n1.isBefore(se) and n2.isBefore(se.getBase()) - or - // After base → implicit deref or low/implicit-low - n1.isAfter(se.getBase()) and - ( - if implicitDerefCondition(se.getBase()) - then n2.isAdditional(se.getBase(), "implicit-deref") - else - if exists(se.getLow()) - then n2.isBefore(se.getLow()) - else n2.isAdditional(se, "implicit-low") - ) - or - n1.isAdditional(se.getBase(), "implicit-deref") and - ( - if exists(se.getLow()) - then n2.isBefore(se.getLow()) - else n2.isAdditional(se, "implicit-low") - ) - or - (n1.isAfter(se.getLow()) or n1.isAdditional(se, "implicit-low")) and - ( - if exists(se.getHigh()) - then n2.isBefore(se.getHigh()) - else n2.isAdditional(se, "implicit-high") - ) - or - (n1.isAfter(se.getHigh()) or n1.isAdditional(se, "implicit-high")) and - ( - if exists(se.getMax()) - then n2.isBefore(se.getMax()) - else n2.isAdditional(se, "implicit-max") - ) - or - (n1.isAfter(se.getMax()) or n1.isAdditional(se, "implicit-max")) and - n2.isIn(se) - or - n1.isIn(se) and n2.isAfter(se) + if implicitDerefCondition(se.getBase()) + then n2.isAdditional(se.getBase(), "implicit-deref") + else sliceNext(se, -1, n2) ) + or + n1.isAdditional(se.getBase(), "implicit-deref") and sliceNext(se, -1, n2) + or + // After a present bound → the next present bound / slice eval + n1.isAfter(se.getLow()) and sliceNext(se, 0, n2) + or + n1.isAfter(se.getHigh()) and sliceNext(se, 1, n2) + or + n1.isAfter(se.getMax()) and sliceNext(se, 2, n2) + or + n1.isIn(se) and n2.isAfter(se) ) } diff --git a/go/ql/lib/semmle/go/controlflow/IR.qll b/go/ql/lib/semmle/go/controlflow/IR.qll index cae74302349f..252c9b0bf859 100644 --- a/go/ql/lib/semmle/go/controlflow/IR.qll +++ b/go/ql/lib/semmle/go/controlflow/IR.qll @@ -227,12 +227,6 @@ module IR { this instanceof TypeSwitchImplicitVariableInstruction and result = "type switch implicit variable declaration" or - this instanceof EvalImplicitLowerSliceBoundInstruction and result = "implicit lower bound" - or - this instanceof EvalImplicitUpperSliceBoundInstruction and result = "implicit upper bound" - or - this instanceof EvalImplicitMaxSliceBoundInstruction and result = "implicit maximum" - or this instanceof EvalImplicitDerefInstruction and result = "implicit dereference" or this instanceof ImplicitFieldReadInstruction and result = "implicit field selection" @@ -499,23 +493,14 @@ module IR { /** Gets the instruction computing the base value from which the slice is constructed. */ Instruction getBase() { result = selectorBase(e) } - /** Gets the instruction computing the lower bound of the slice. */ - Instruction getLow() { - result = evalExprInstruction(e.getLow()) or - result = implicitLowerSliceBoundInstruction(e) - } + /** Gets the instruction computing the lower bound of the slice, if it is explicit. */ + Instruction getLow() { result = evalExprInstruction(e.getLow()) } - /** Gets the instruction computing the upper bound of the slice. */ - Instruction getHigh() { - result = evalExprInstruction(e.getHigh()) or - result = implicitUpperSliceBoundInstruction(e) - } + /** Gets the instruction computing the upper bound of the slice, if it is explicit. */ + Instruction getHigh() { result = evalExprInstruction(e.getHigh()) } - /** Gets the instruction computing the capacity of the slice. */ - Instruction getMax() { - result = evalExprInstruction(e.getMax()) or - result = implicitMaxSliceBoundInstruction(e) - } + /** Gets the instruction computing the capacity of the slice, if it is explicit. */ + Instruction getMax() { result = evalExprInstruction(e.getMax()) } } /** @@ -1155,47 +1140,6 @@ module IR { override ControlFlow::Root getRoot() { result.isRootOf(cc) } } - /** An instruction computing the implicit lower bound of a slice expression. */ - class EvalImplicitLowerSliceBoundInstruction extends Instruction { - SliceExpr slice; - - EvalImplicitLowerSliceBoundInstruction() { this.isAdditional(slice, "implicit-low") } - - override Type getResultType() { result instanceof IntType } - - override ControlFlow::Root getRoot() { result.isRootOf(slice) } - - override int getIntValue() { result = 0 } - - override string getExactValue() { result = "0" } - - override predicate isConst() { any() } - - override predicate isPlatformIndependentConstant() { any() } - } - - /** An instruction computing the implicit upper bound of a slice expression. */ - class EvalImplicitUpperSliceBoundInstruction extends Instruction { - SliceExpr slice; - - EvalImplicitUpperSliceBoundInstruction() { this.isAdditional(slice, "implicit-high") } - - override ControlFlow::Root getRoot() { result.isRootOf(slice) } - - override Type getResultType() { result instanceof IntType } - } - - /** An instruction computing the implicit maximum bound of a slice expression. */ - class EvalImplicitMaxSliceBoundInstruction extends Instruction { - SliceExpr slice; - - EvalImplicitMaxSliceBoundInstruction() { this.isAdditional(slice, "implicit-max") } - - override ControlFlow::Root getRoot() { result.isRootOf(slice) } - - override Type getResultType() { result instanceof IntType } - } - /** * An instruction computing the implicit dereference of a pointer used as the base of a field * or method access, element access, or slice expression. @@ -1523,27 +1467,6 @@ module IR { result.extractsElement(base, idx) } - /** - * Gets the instruction corresponding to the implicit lower bound of slice `e`, if any. - */ - EvalImplicitLowerSliceBoundInstruction implicitLowerSliceBoundInstruction(SliceExpr e) { - result.isAdditional(e, "implicit-low") - } - - /** - * Gets the instruction corresponding to the implicit upper bound of slice `e`, if any. - */ - EvalImplicitUpperSliceBoundInstruction implicitUpperSliceBoundInstruction(SliceExpr e) { - result.isAdditional(e, "implicit-high") - } - - /** - * Gets the instruction corresponding to the implicit maximum bound of slice `e`, if any. - */ - EvalImplicitMaxSliceBoundInstruction implicitMaxSliceBoundInstruction(SliceExpr e) { - result.isAdditional(e, "implicit-max") - } - /** * Gets the implicit dereference instruction for `e`, where `e` is a pointer used as the base * in a field/method access, element access, or slice expression. diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected index 32a9e344c7ad..ab2ee46a24e6 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected @@ -1083,12 +1083,11 @@ | exprs.go:21:2:21:19 | ... := ... | exprs.go:21:10:21:19 | Before slice expression | | exprs.go:21:2:21:19 | After ... := ... | exprs.go:22:2:22:18 | ... := ... | | exprs.go:21:2:21:19 | assign:0 ... := ... | exprs.go:21:2:21:19 | After ... := ... | -| exprs.go:21:10:21:13 | After slc2 | exprs.go:21:10:21:19 | implicit-low slice expression | +| exprs.go:21:10:21:13 | After slc2 | exprs.go:21:16:21:16 | Before 2 | | exprs.go:21:10:21:13 | Before slc2 | exprs.go:21:10:21:13 | slc2 | | exprs.go:21:10:21:13 | slc2 | exprs.go:21:10:21:13 | After slc2 | | exprs.go:21:10:21:19 | After slice expression | exprs.go:21:2:21:19 | assign:0 ... := ... | | exprs.go:21:10:21:19 | Before slice expression | exprs.go:21:10:21:13 | Before slc2 | -| exprs.go:21:10:21:19 | implicit-low slice expression | exprs.go:21:16:21:16 | Before 2 | | exprs.go:21:10:21:19 | slice expression | exprs.go:21:10:21:19 | After slice expression | | exprs.go:21:16:21:16 | 2 | exprs.go:21:16:21:16 | After 2 | | exprs.go:21:16:21:16 | After 2 | exprs.go:21:18:21:18 | Before 3 | @@ -1104,13 +1103,12 @@ | exprs.go:22:10:22:13 | slc3 | exprs.go:22:10:22:13 | After slc3 | | exprs.go:22:10:22:18 | After slice expression | exprs.go:22:2:22:18 | assign:0 ... := ... | | exprs.go:22:10:22:18 | Before slice expression | exprs.go:22:10:22:13 | Before slc3 | -| exprs.go:22:10:22:18 | implicit-max slice expression | exprs.go:22:10:22:18 | slice expression | | exprs.go:22:10:22:18 | slice expression | exprs.go:22:10:22:18 | After slice expression | | exprs.go:22:15:22:15 | 0 | exprs.go:22:15:22:15 | After 0 | | exprs.go:22:15:22:15 | After 0 | exprs.go:22:17:22:17 | Before 2 | | exprs.go:22:15:22:15 | Before 0 | exprs.go:22:15:22:15 | 0 | | exprs.go:22:17:22:17 | 2 | exprs.go:22:17:22:17 | After 2 | -| exprs.go:22:17:22:17 | After 2 | exprs.go:22:10:22:18 | implicit-max slice expression | +| exprs.go:22:17:22:17 | After 2 | exprs.go:22:10:22:18 | slice expression | | exprs.go:22:17:22:17 | Before 2 | exprs.go:22:17:22:17 | 2 | | exprs.go:23:2:23:17 | ... := ... | exprs.go:23:10:23:17 | Before slice expression | | exprs.go:23:2:23:17 | After ... := ... | exprs.go:24:2:24:17 | ... := ... | @@ -1120,25 +1118,21 @@ | exprs.go:23:10:23:13 | slc4 | exprs.go:23:10:23:13 | After slc4 | | exprs.go:23:10:23:17 | After slice expression | exprs.go:23:2:23:17 | assign:0 ... := ... | | exprs.go:23:10:23:17 | Before slice expression | exprs.go:23:10:23:13 | Before slc4 | -| exprs.go:23:10:23:17 | implicit-high slice expression | exprs.go:23:10:23:17 | implicit-max slice expression | -| exprs.go:23:10:23:17 | implicit-max slice expression | exprs.go:23:10:23:17 | slice expression | | exprs.go:23:10:23:17 | slice expression | exprs.go:23:10:23:17 | After slice expression | | exprs.go:23:15:23:15 | 0 | exprs.go:23:15:23:15 | After 0 | -| exprs.go:23:15:23:15 | After 0 | exprs.go:23:10:23:17 | implicit-high slice expression | +| exprs.go:23:15:23:15 | After 0 | exprs.go:23:10:23:17 | slice expression | | exprs.go:23:15:23:15 | Before 0 | exprs.go:23:15:23:15 | 0 | | exprs.go:24:2:24:17 | ... := ... | exprs.go:24:10:24:17 | Before slice expression | | exprs.go:24:2:24:17 | After ... := ... | exprs.go:25:2:25:34 | Before return statement | | exprs.go:24:2:24:17 | assign:0 ... := ... | exprs.go:24:2:24:17 | After ... := ... | -| exprs.go:24:10:24:13 | After slc5 | exprs.go:24:10:24:17 | implicit-low slice expression | +| exprs.go:24:10:24:13 | After slc5 | exprs.go:24:16:24:16 | Before 2 | | exprs.go:24:10:24:13 | Before slc5 | exprs.go:24:10:24:13 | slc5 | | exprs.go:24:10:24:13 | slc5 | exprs.go:24:10:24:13 | After slc5 | | exprs.go:24:10:24:17 | After slice expression | exprs.go:24:2:24:17 | assign:0 ... := ... | | exprs.go:24:10:24:17 | Before slice expression | exprs.go:24:10:24:13 | Before slc5 | -| exprs.go:24:10:24:17 | implicit-low slice expression | exprs.go:24:16:24:16 | Before 2 | -| exprs.go:24:10:24:17 | implicit-max slice expression | exprs.go:24:10:24:17 | slice expression | | exprs.go:24:10:24:17 | slice expression | exprs.go:24:10:24:17 | After slice expression | | exprs.go:24:16:24:16 | 2 | exprs.go:24:16:24:16 | After 2 | -| exprs.go:24:16:24:16 | After 2 | exprs.go:24:10:24:17 | implicit-max slice expression | +| exprs.go:24:16:24:16 | After 2 | exprs.go:24:10:24:17 | slice expression | | exprs.go:24:16:24:16 | Before 2 | exprs.go:24:16:24:16 | 2 | | exprs.go:25:2:25:34 | Before return statement | exprs.go:25:9:25:34 | Before struct literal | | exprs.go:25:2:25:34 | return statement | exprs.go:5:1:26:1 | Normal Exit | From 16b2eaa7ab13208362cf23f7ebecbd51e22df183 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 10 Jul 2026 08:01:25 +0100 Subject: [PATCH 0985/2098] Merge 'result-init' node into 'result-zero-init' A named result variable previously created two additional nodes: 'result-zero-init:i' computing the zero value, and 'result-init:i' writing that value into the result variable. The result-init node existed only to write the value already computed by result-zero-init. Make the result-zero-init instruction perform the write itself (InitResultInstruction is now keyed on result-zero-init with its own value as RHS) and drop the separate result-init node. All zero-value constant semantics stay on the same node, so GVN and constant analysis are unchanged; the only data-flow change is the SSA def relabeling (result-init -> result-zero-init) with no flow loss. --- .../go/controlflow/ControlFlowGraphShared.qll | 24 ++++--------- go/ql/lib/semmle/go/controlflow/IR.qll | 20 +++++------ .../ControlFlowNode_getASuccessor.expected | 36 +++++++------------ .../semmle/go/dataflow/SSA/VarDefs.expected | 8 ++--- 4 files changed, 33 insertions(+), 55 deletions(-) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll index 6efdd14635e5..ab4ec7490944 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll @@ -555,15 +555,9 @@ module CfgImpl { tag = "result-read:" + i.toString() ) or - // Result variable init (on the function body) - exists(int i, Go::FuncDef fd | - n = fd.getBody() and - exists(fd.getBody()) and - exists(fd.getResultVar(i)) and - tag = "result-init:" + i.toString() - ) - or - // Result variable zero init (on the function body) + // Result variable zero init + init (on the function body). This single + // node computes the zero value and writes it to the result variable (see + // `IR::InitResultInstruction`). exists(int i, Go::FuncDef fd | n = fd.getBody() and exists(fd.getBody()) and @@ -1680,7 +1674,7 @@ module CfgImpl { * - Prologue: parameters are modelled as native CFG nodes by the shared * library (Entry → param → ... → Before(body)). The remaining * prologue on Before(body) zero-initializes any named result - * variables: result-zero-init:0 → result-init:0 → ... → first statement. + * variables: result-zero-init:0 → result-zero-init:1 → ... → first statement. * - Epilogue: return → result-read:0 → result-read:1 → ... → result-read:last * * The last result-read node goes to `NormalExit(fd)` via the shared @@ -1711,15 +1705,11 @@ module CfgImpl { exists(fd.getResultVar(0)) and n2.isAdditional(fd.getBody(), "result-zero-init:0") or - // result-zero-init:j → result-init:j (for each result variable) + // result-zero-init:j → next: result-zero-init:(j+1), or Before(body). + // The zero-init node also writes the result variable (see + // `IR::InitResultInstruction`), so there is no separate result-init node. exists(int j | exists(fd.getResultVar(j)) | n1.isAdditional(fd.getBody(), "result-zero-init:" + j.toString()) and - n2.isAdditional(fd.getBody(), "result-init:" + j.toString()) - ) - or - // result-init:j → next: result-zero-init:(j+1), or Before(body) - exists(int j | exists(fd.getResultVar(j)) | - n1.isAdditional(fd.getBody(), "result-init:" + j.toString()) and ( // Next result var exists exists(fd.getResultVar(j + 1)) and diff --git a/go/ql/lib/semmle/go/controlflow/IR.qll b/go/ql/lib/semmle/go/controlflow/IR.qll index 252c9b0bf859..64b3dd123400 100644 --- a/go/ql/lib/semmle/go/controlflow/IR.qll +++ b/go/ql/lib/semmle/go/controlflow/IR.qll @@ -216,8 +216,6 @@ module IR { or this instanceof InitParameterInstruction and result = "parameter initialization" or - this instanceof InitResultInstruction and result = "result initialization" - or this instanceof GetNextEntryInstruction and result = "next key-value pair" or this instanceof EvalImplicitTrueInstruction and result = "implicit true" @@ -1052,22 +1050,24 @@ module IR { override ControlFlow::Root getRoot() { result = parm.getFunction() } } - /** An instruction initializing a result variable to its zero value. */ + /** + * An instruction initializing a result variable to its zero value. + * + * This is the same node as the `EvalImplicitInitInstruction` that computes the + * zero value: the zero-value instruction performs the write of the result + * variable directly, rather than feeding a separate write node. + */ class InitResultInstruction extends WriteInstruction { ResultVariable res; int idx; FuncDef fd; InitResultInstruction() { - this.isAdditional(fd.getBody(), "result-init:" + idx.toString()) and + this.isAdditional(fd.getBody(), "result-zero-init:" + idx.toString()) and res = fd.getResultVar(idx) } - override Instruction getRhs() { - result - .(EvalImplicitInitInstruction) - .isAdditional(fd.getBody(), "result-zero-init:" + idx.toString()) - } + override Instruction getRhs() { result = this } override ControlFlow::Root getRoot() { result = res.getFunction() } } @@ -1187,7 +1187,7 @@ module IR { ) or exists(FuncDef fd, int idx | - write.isAdditional(fd.getBody(), "result-init:" + idx.toString()) and + write.isAdditional(fd.getBody(), "result-zero-init:" + idx.toString()) and lhs = fd.getResultVar(idx).getDeclaration() ) } or diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected index ab2ee46a24e6..2ff5b99f0465 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected @@ -245,12 +245,10 @@ | epilogues.go:42:1:48:1 | function declaration | epilogues.go:42:1:48:1 | After function declaration | | epilogues.go:42:20:42:20 | x | epilogues.go:42:51:48:1 | block statement | | epilogues.go:42:51:48:1 | block statement | epilogues.go:42:51:48:1 | result-zero-init:0 block statement | -| epilogues.go:42:51:48:1 | result-init:0 block statement | epilogues.go:42:51:48:1 | result-zero-init:1 block statement | -| epilogues.go:42:51:48:1 | result-init:1 block statement | epilogues.go:43:2:46:2 | if statement | | epilogues.go:42:51:48:1 | result-read:0 block statement | epilogues.go:42:51:48:1 | result-read:1 block statement | | epilogues.go:42:51:48:1 | result-read:1 block statement | epilogues.go:42:1:48:1 | Normal Exit | -| epilogues.go:42:51:48:1 | result-zero-init:0 block statement | epilogues.go:42:51:48:1 | result-init:0 block statement | -| epilogues.go:42:51:48:1 | result-zero-init:1 block statement | epilogues.go:42:51:48:1 | result-init:1 block statement | +| epilogues.go:42:51:48:1 | result-zero-init:0 block statement | epilogues.go:42:51:48:1 | result-zero-init:1 block statement | +| epilogues.go:42:51:48:1 | result-zero-init:1 block statement | epilogues.go:43:2:46:2 | if statement | | epilogues.go:43:2:46:2 | After if statement | epilogues.go:47:2:47:14 | Before return statement | | epilogues.go:43:2:46:2 | if statement | epilogues.go:43:5:43:9 | Before ...<... | | epilogues.go:43:5:43:5 | After x | epilogues.go:43:9:43:9 | Before 0 | @@ -293,9 +291,8 @@ | epilogues.go:51:1:54:1 | function declaration | epilogues.go:51:1:54:1 | After function declaration | | epilogues.go:51:23:51:23 | x | epilogues.go:51:38:54:1 | block statement | | epilogues.go:51:38:54:1 | block statement | epilogues.go:51:38:54:1 | result-zero-init:0 block statement | -| epilogues.go:51:38:54:1 | result-init:0 block statement | epilogues.go:52:2:52:10 | ... = ... | | epilogues.go:51:38:54:1 | result-read:0 block statement | epilogues.go:51:1:54:1 | Normal Exit | -| epilogues.go:51:38:54:1 | result-zero-init:0 block statement | epilogues.go:51:38:54:1 | result-init:0 block statement | +| epilogues.go:51:38:54:1 | result-zero-init:0 block statement | epilogues.go:52:2:52:10 | ... = ... | | epilogues.go:52:2:52:10 | ... = ... | epilogues.go:52:6:52:10 | Before ...+... | | epilogues.go:52:2:52:10 | After ... = ... | epilogues.go:53:2:53:7 | Before return statement | | epilogues.go:52:2:52:10 | assign:0 ... = ... | epilogues.go:52:2:52:10 | After ... = ... | @@ -515,9 +512,8 @@ | epilogues.go:87:1:98:1 | function declaration | epilogues.go:87:1:98:1 | After function declaration | | epilogues.go:87:22:87:22 | x | epilogues.go:87:42:98:1 | block statement | | epilogues.go:87:42:98:1 | block statement | epilogues.go:87:42:98:1 | result-zero-init:0 block statement | -| epilogues.go:87:42:98:1 | result-init:0 block statement | epilogues.go:88:2:92:4 | Before defer statement | | epilogues.go:87:42:98:1 | result-read:0 block statement | epilogues.go:87:1:98:1 | Normal Exit | -| epilogues.go:87:42:98:1 | result-zero-init:0 block statement | epilogues.go:87:42:98:1 | result-init:0 block statement | +| epilogues.go:87:42:98:1 | result-zero-init:0 block statement | epilogues.go:88:2:92:4 | Before defer statement | | epilogues.go:88:2:92:4 | After defer statement | epilogues.go:93:2:95:2 | if statement | | epilogues.go:88:2:92:4 | Before defer statement | epilogues.go:88:8:92:4 | function call | | epilogues.go:88:2:92:4 | defer statement | epilogues.go:88:2:92:4 | After defer statement | @@ -614,12 +610,10 @@ | epilogues.go:102:1:110:1 | function declaration | epilogues.go:102:1:110:1 | After function declaration | | epilogues.go:102:26:102:26 | x | epilogues.go:102:50:110:1 | block statement | | epilogues.go:102:50:110:1 | block statement | epilogues.go:102:50:110:1 | result-zero-init:0 block statement | -| epilogues.go:102:50:110:1 | result-init:0 block statement | epilogues.go:102:50:110:1 | result-zero-init:1 block statement | -| epilogues.go:102:50:110:1 | result-init:1 block statement | epilogues.go:103:2:103:19 | Before defer statement | | epilogues.go:102:50:110:1 | result-read:0 block statement | epilogues.go:102:50:110:1 | result-read:1 block statement | | epilogues.go:102:50:110:1 | result-read:1 block statement | epilogues.go:102:1:110:1 | Normal Exit | -| epilogues.go:102:50:110:1 | result-zero-init:0 block statement | epilogues.go:102:50:110:1 | result-init:0 block statement | -| epilogues.go:102:50:110:1 | result-zero-init:1 block statement | epilogues.go:102:50:110:1 | result-init:1 block statement | +| epilogues.go:102:50:110:1 | result-zero-init:0 block statement | epilogues.go:102:50:110:1 | result-zero-init:1 block statement | +| epilogues.go:102:50:110:1 | result-zero-init:1 block statement | epilogues.go:103:2:103:19 | Before defer statement | | epilogues.go:103:2:103:19 | After defer statement | epilogues.go:104:2:106:2 | if statement | | epilogues.go:103:2:103:19 | Before defer statement | epilogues.go:103:8:103:19 | call to epiRecover | | epilogues.go:103:2:103:19 | defer statement | epilogues.go:103:2:103:19 | After defer statement | @@ -1297,9 +1291,8 @@ | exprs.go:49:1:54:1 | function declaration | exprs.go:49:1:54:1 | After function declaration | | exprs.go:49:10:49:11 | xs | exprs.go:49:30:54:1 | block statement | | exprs.go:49:30:54:1 | block statement | exprs.go:49:30:54:1 | result-zero-init:0 block statement | -| exprs.go:49:30:54:1 | result-init:0 block statement | exprs.go:50:2:52:2 | for statement | | exprs.go:49:30:54:1 | result-read:0 block statement | exprs.go:49:1:54:1 | Normal Exit | -| exprs.go:49:30:54:1 | result-zero-init:0 block statement | exprs.go:49:30:54:1 | result-init:0 block statement | +| exprs.go:49:30:54:1 | result-zero-init:0 block statement | exprs.go:50:2:52:2 | for statement | | exprs.go:50:2:52:2 | After for statement | exprs.go:53:2:53:7 | Before return statement | | exprs.go:50:2:52:2 | [LoopHeader] for statement | exprs.go:50:27:50:29 | Before increment statement | | exprs.go:50:2:52:2 | for statement | exprs.go:50:6:50:11 | ... := ... | @@ -2148,9 +2141,8 @@ | main.go:47:1:50:1 | Normal Exit | main.go:47:1:50:1 | Exit | | main.go:47:1:50:1 | function declaration | main.go:47:1:50:1 | After function declaration | | main.go:47:25:50:1 | block statement | main.go:47:25:50:1 | result-zero-init:0 block statement | -| main.go:47:25:50:1 | result-init:0 block statement | main.go:48:2:48:12 | ... = ... | | main.go:47:25:50:1 | result-read:0 block statement | main.go:47:1:50:1 | Normal Exit | -| main.go:47:25:50:1 | result-zero-init:0 block statement | main.go:47:25:50:1 | result-init:0 block statement | +| main.go:47:25:50:1 | result-zero-init:0 block statement | main.go:48:2:48:12 | ... = ... | | main.go:48:2:48:12 | ... = ... | main.go:48:11:48:12 | Before 42 | | main.go:48:2:48:12 | After ... = ... | main.go:49:2:49:7 | Before return statement | | main.go:48:2:48:12 | assign:0 ... = ... | main.go:48:2:48:12 | After ... = ... | @@ -2165,9 +2157,8 @@ | main.go:52:1:54:1 | Normal Exit | main.go:52:1:54:1 | Exit | | main.go:52:1:54:1 | function declaration | main.go:52:1:54:1 | After function declaration | | main.go:52:26:54:1 | block statement | main.go:52:26:54:1 | result-zero-init:0 block statement | -| main.go:52:26:54:1 | result-init:0 block statement | main.go:53:2:53:7 | Before return statement | | main.go:52:26:54:1 | result-read:0 block statement | main.go:52:1:54:1 | Normal Exit | -| main.go:52:26:54:1 | result-zero-init:0 block statement | main.go:52:26:54:1 | result-init:0 block statement | +| main.go:52:26:54:1 | result-zero-init:0 block statement | main.go:53:2:53:7 | Before return statement | | main.go:53:2:53:7 | Before return statement | main.go:53:2:53:7 | return statement | | main.go:53:2:53:7 | return statement | main.go:52:26:54:1 | result-read:0 block statement | | main.go:56:1:64:1 | After function declaration | main.go:66:1:90:1 | Before function declaration | @@ -2177,9 +2168,8 @@ | main.go:56:1:64:1 | function declaration | main.go:56:1:64:1 | After function declaration | | main.go:56:11:56:18 | selector | main.go:56:38:64:1 | block statement | | main.go:56:38:64:1 | block statement | main.go:56:38:64:1 | result-zero-init:0 block statement | -| main.go:56:38:64:1 | result-init:0 block statement | main.go:57:2:57:11 | ... = ... | | main.go:56:38:64:1 | result-read:0 block statement | main.go:56:1:64:1 | Normal Exit | -| main.go:56:38:64:1 | result-zero-init:0 block statement | main.go:56:38:64:1 | result-init:0 block statement | +| main.go:56:38:64:1 | result-zero-init:0 block statement | main.go:57:2:57:11 | ... = ... | | main.go:57:2:57:11 | ... = ... | main.go:57:11:57:11 | Before 0 | | main.go:57:2:57:11 | After ... = ... | main.go:58:2:62:2 | if statement | | main.go:57:2:57:11 | assign:0 ... = ... | main.go:57:2:57:11 | After ... = ... | @@ -2382,12 +2372,10 @@ | main.go:92:1:96:1 | Normal Exit | main.go:92:1:96:1 | Exit | | main.go:92:1:96:1 | function declaration | main.go:92:1:96:1 | After function declaration | | main.go:92:36:96:1 | block statement | main.go:92:36:96:1 | result-zero-init:0 block statement | -| main.go:92:36:96:1 | result-init:0 block statement | main.go:92:36:96:1 | result-zero-init:1 block statement | -| main.go:92:36:96:1 | result-init:1 block statement | main.go:93:2:93:8 | ... := ... | | main.go:92:36:96:1 | result-read:0 block statement | main.go:92:36:96:1 | result-read:1 block statement | | main.go:92:36:96:1 | result-read:1 block statement | main.go:92:1:96:1 | Normal Exit | -| main.go:92:36:96:1 | result-zero-init:0 block statement | main.go:92:36:96:1 | result-init:0 block statement | -| main.go:92:36:96:1 | result-zero-init:1 block statement | main.go:92:36:96:1 | result-init:1 block statement | +| main.go:92:36:96:1 | result-zero-init:0 block statement | main.go:92:36:96:1 | result-zero-init:1 block statement | +| main.go:92:36:96:1 | result-zero-init:1 block statement | main.go:93:2:93:8 | ... := ... | | main.go:93:2:93:8 | ... := ... | main.go:93:7:93:8 | Before 23 | | main.go:93:2:93:8 | After ... := ... | main.go:94:2:94:15 | ... = ... | | main.go:93:2:93:8 | assign:0 ... := ... | main.go:93:2:93:8 | After ... := ... | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarDefs.expected b/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarDefs.expected index d280aa1ac14e..4d2c5fd7c461 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarDefs.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarDefs.expected @@ -10,9 +10,9 @@ | main.go:34:11:34:11 | x | main.go:34:11:34:11 | x | main.go:34:11:34:11 | x | | main.go:39:2:39:8 | assign:0 ... := ... | main.go:39:2:39:2 | x | main.go:39:7:39:8 | 23 | | main.go:40:2:40:10 | assign:0 ... := ... | main.go:40:2:40:4 | ptr | main.go:40:9:40:10 | &... | -| main.go:47:25:50:1 | result-init:0 block statement | main.go:47:13:47:18 | result | main.go:47:25:50:1 | result-zero-init:0 block statement | +| main.go:47:25:50:1 | result-zero-init:0 block statement | main.go:47:13:47:18 | result | main.go:47:25:50:1 | result-zero-init:0 block statement | | main.go:48:2:48:12 | assign:0 ... = ... | main.go:47:13:47:18 | result | main.go:48:11:48:12 | 42 | -| main.go:52:26:54:1 | result-init:0 block statement | main.go:52:14:52:19 | result | main.go:52:26:54:1 | result-zero-init:0 block statement | +| main.go:52:26:54:1 | result-zero-init:0 block statement | main.go:52:14:52:19 | result | main.go:52:26:54:1 | result-zero-init:0 block statement | | main.go:57:6:57:10 | assign:0 value declaration specifier | main.go:57:6:57:6 | x | main.go:57:6:57:10 | zero-init:0 value declaration specifier | | main.go:59:3:59:7 | assign:0 ... = ... | main.go:57:6:57:6 | x | main.go:59:7:59:7 | 2 | | main.go:63:2:63:7 | assign:0 ... := ... | main.go:63:2:63:2 | y | main.go:63:7:63:7 | 1 | @@ -23,8 +23,8 @@ | main.go:73:6:73:11 | assign:0 ... := ... | main.go:73:6:73:6 | i | main.go:73:11:73:11 | 0 | | main.go:73:16:73:18 | increment statement | main.go:73:6:73:6 | i | main.go:73:16:73:18 | incdec-rhs increment statement | | main.go:74:3:74:7 | assign:0 ... = ... | main.go:72:2:72:2 | z | main.go:74:7:74:7 | 2 | -| main.go:82:36:86:1 | result-init:0 block statement | main.go:82:18:82:18 | a | main.go:82:36:86:1 | result-zero-init:0 block statement | -| main.go:82:36:86:1 | result-init:1 block statement | main.go:82:25:82:25 | b | main.go:82:36:86:1 | result-zero-init:1 block statement | +| main.go:82:36:86:1 | result-zero-init:0 block statement | main.go:82:18:82:18 | a | main.go:82:36:86:1 | result-zero-init:0 block statement | +| main.go:82:36:86:1 | result-zero-init:1 block statement | main.go:82:25:82:25 | b | main.go:82:36:86:1 | result-zero-init:1 block statement | | main.go:83:2:83:8 | assign:0 ... := ... | main.go:83:2:83:2 | x | main.go:83:7:83:8 | 23 | | main.go:84:2:84:15 | assign:0 ... = ... | main.go:83:2:83:2 | x | main.go:84:9:84:12 | ...+... | | main.go:84:2:84:15 | assign:1 ... = ... | main.go:82:18:82:18 | a | main.go:84:15:84:15 | x | From 16b9560be0e82ad22dd129497fa51f1622331403 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 10 Jul 2026 08:16:05 +0100 Subject: [PATCH 0986/2098] Fold implicit literal element index into the lit-init node A positional element of an array or slice literal (e.g. the elements of []T{a, b}) previously created a 'lit-index' node holding its implicit index constant (0, 1, ...), in addition to the 'lit-init' write node. Array and slice content flow is index-insensitive (the store step ignores the element index), map literals always use explicit keys, and literal bases are not tracked by VariableWithFields, so the implicit index value is never actually consumed. Drop the 'lit-index' node and let the lit-init instruction act as its own opaque index. All 100 data-flow library tests pass unchanged, confirming no content-flow loss. --- .../go/controlflow/ControlFlowGraphShared.qll | 21 ++----- go/ql/lib/semmle/go/controlflow/IR.qll | 56 ++----------------- .../ControlFlowNode_getASuccessor.expected | 21 +++---- 3 files changed, 16 insertions(+), 82 deletions(-) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll index ab4ec7490944..f9e61fac5354 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll @@ -573,14 +573,6 @@ module CfgImpl { n = any(Go::CompositeLit lit).getAnElement() and tag = "lit-init" or - // Implicit literal element index - exists(Go::CompositeLit lit | - not lit instanceof Go::StructLit and - n = lit.getAnElement() and - not n instanceof Go::KeyValueExpr and - tag = "lit-index" - ) - or // Implicit field selection for promoted fields exists(int i, Go::Field implicitField | implicitFieldSelection(n, i, implicitField) and @@ -1448,17 +1440,12 @@ module CfgImpl { not exists(lit.getElement(_)) and n2.isAfter(lit) ) or - // After element → optional lit-index → lit-init → next element or After + // After element → lit-init → next element or After. + // Positional array/slice elements have an implicit index that is + // modelled on the `lit-init` instruction itself (see + // `IR::InitLiteralElementInstruction`) rather than as a separate node. exists(int i | n1.isAfter(lit.getElement(i)) and - ( - n2.isAdditional(lit.getElement(i), "lit-index") - or - not exists(PreControlFlowNode idx | idx.isAdditional(lit.getElement(i), "lit-index")) and - n2.isAdditional(lit.getElement(i), "lit-init") - ) - or - n1.isAdditional(lit.getElement(i), "lit-index") and n2.isAdditional(lit.getElement(i), "lit-init") or n1.isAdditional(lit.getElement(i), "lit-init") and diff --git a/go/ql/lib/semmle/go/controlflow/IR.qll b/go/ql/lib/semmle/go/controlflow/IR.qll index 64b3dd123400..0be9d68d64e8 100644 --- a/go/ql/lib/semmle/go/controlflow/IR.qll +++ b/go/ql/lib/semmle/go/controlflow/IR.qll @@ -184,8 +184,6 @@ module IR { or this instanceof InitLiteralComponentInstruction and result = "element init" or - this instanceof ImplicitLiteralElementIndexInstruction and result = "element index" - or this instanceof AssignInstruction and result = "assignment" or this instanceof EvalCompoundAssignRhsInstruction and @@ -599,7 +597,11 @@ module IR { Instruction getIndex() { result = evalExprInstruction(elt.(KeyValueExpr).getKey()) or - result.(ImplicitLiteralElementIndexInstruction).isAdditional(elt, "lit-index") + // A positional array/slice element has an implicit index. Array/slice + // content flow is index-insensitive, so rather than materialise a + // separate index node the element-init instruction acts as its own + // (opaque) index. + not elt instanceof KeyValueExpr and result = this } } @@ -648,54 +650,6 @@ module IR { } } - private predicate noExplicitKeys(CompositeLit lit) { - not lit.getAnElement() instanceof KeyValueExpr - } - - private int getElementIndex(CompositeLit lit, int i) { - ( - lit.getType().getUnderlyingType() instanceof ArrayType or - lit.getType().getUnderlyingType() instanceof SliceType - ) and - exists(Expr elt | elt = lit.getElement(i) | - noExplicitKeys(lit) and result = i - or - result = elt.(KeyValueExpr).getKey().getIntValue() - or - not elt instanceof KeyValueExpr and - ( - i = 0 and result = 0 - or - result = getElementIndex(lit, i - 1) + 1 - ) - ) - } - - /** - * An IR instruction computing the implicit index of an element in an array or slice literal. - */ - class ImplicitLiteralElementIndexInstruction extends Instruction { - Expr elt; - - ImplicitLiteralElementIndexInstruction() { this.isAdditional(elt, "lit-index") } - - override Type getResultType() { result instanceof IntType } - - override ControlFlow::Root getRoot() { result.isRootOf(elt) } - - override int getIntValue() { - exists(CompositeLit lit, int i | elt = lit.getElement(i) | result = getElementIndex(lit, i)) - } - - override string getStringValue() { none() } - - override string getExactValue() { result = this.getIntValue().toString() } - - override predicate isPlatformIndependentConstant() { any() } - - override predicate isConst() { any() } - } - /** * An instruction assigning to a variable or field. */ diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected index 2ff5b99f0465..ccc5ee7661d5 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected @@ -974,9 +974,8 @@ | exprs.go:16:17:16:23 | After struct3 | exprs.go:16:17:16:25 | selection of x | | exprs.go:16:17:16:23 | Before struct3 | exprs.go:16:17:16:23 | struct3 | | exprs.go:16:17:16:23 | struct3 | exprs.go:16:17:16:23 | After struct3 | -| exprs.go:16:17:16:25 | After selection of x | exprs.go:16:17:16:25 | lit-index selection of x | +| exprs.go:16:17:16:25 | After selection of x | exprs.go:16:17:16:25 | lit-init selection of x | | exprs.go:16:17:16:25 | Before selection of x | exprs.go:16:17:16:23 | Before struct3 | -| exprs.go:16:17:16:25 | lit-index selection of x | exprs.go:16:17:16:25 | lit-init selection of x | | exprs.go:16:17:16:25 | lit-init selection of x | exprs.go:16:10:16:26 | After array literal | | exprs.go:16:17:16:25 | selection of x | exprs.go:16:17:16:25 | After selection of x | | exprs.go:17:2:17:40 | ... := ... | exprs.go:17:10:17:40 | Before array literal | @@ -988,9 +987,8 @@ | exprs.go:17:19:17:25 | After struct3 | exprs.go:17:19:17:27 | selection of x | | exprs.go:17:19:17:25 | Before struct3 | exprs.go:17:19:17:25 | struct3 | | exprs.go:17:19:17:25 | struct3 | exprs.go:17:19:17:25 | After struct3 | -| exprs.go:17:19:17:27 | After selection of x | exprs.go:17:19:17:27 | lit-index selection of x | +| exprs.go:17:19:17:27 | After selection of x | exprs.go:17:19:17:27 | lit-init selection of x | | exprs.go:17:19:17:27 | Before selection of x | exprs.go:17:19:17:25 | Before struct3 | -| exprs.go:17:19:17:27 | lit-index selection of x | exprs.go:17:19:17:27 | lit-init selection of x | | exprs.go:17:19:17:27 | lit-init selection of x | exprs.go:17:30:17:39 | Before key-value pair | | exprs.go:17:19:17:27 | selection of x | exprs.go:17:19:17:27 | After selection of x | | exprs.go:17:30:17:30 | 2 | exprs.go:17:30:17:30 | After 2 | @@ -1016,14 +1014,12 @@ | exprs.go:18:9:18:22 | After slice literal | exprs.go:18:2:18:22 | assign:0 ... := ... | | exprs.go:18:9:18:22 | Before slice literal | exprs.go:18:9:18:22 | slice literal | | exprs.go:18:9:18:22 | slice literal | exprs.go:18:18:18:18 | Before s | -| exprs.go:18:18:18:18 | After s | exprs.go:18:18:18:18 | lit-index s | +| exprs.go:18:18:18:18 | After s | exprs.go:18:18:18:18 | lit-init s | | exprs.go:18:18:18:18 | Before s | exprs.go:18:18:18:18 | s | -| exprs.go:18:18:18:18 | lit-index s | exprs.go:18:18:18:18 | lit-init s | | exprs.go:18:18:18:18 | lit-init s | exprs.go:18:21:18:21 | Before s | | exprs.go:18:18:18:18 | s | exprs.go:18:18:18:18 | After s | -| exprs.go:18:21:18:21 | After s | exprs.go:18:21:18:21 | lit-index s | +| exprs.go:18:21:18:21 | After s | exprs.go:18:21:18:21 | lit-init s | | exprs.go:18:21:18:21 | Before s | exprs.go:18:21:18:21 | s | -| exprs.go:18:21:18:21 | lit-index s | exprs.go:18:21:18:21 | lit-init s | | exprs.go:18:21:18:21 | lit-init s | exprs.go:18:9:18:22 | After slice literal | | exprs.go:18:21:18:21 | s | exprs.go:18:21:18:21 | After s | | exprs.go:19:2:19:38 | ... := ... | exprs.go:19:8:19:38 | Before map literal | @@ -1378,19 +1374,16 @@ | exprs.go:61:9:61:22 | Before slice literal | exprs.go:61:9:61:22 | slice literal | | exprs.go:61:9:61:22 | slice literal | exprs.go:61:15:61:15 | Before 1 | | exprs.go:61:15:61:15 | 1 | exprs.go:61:15:61:15 | After 1 | -| exprs.go:61:15:61:15 | After 1 | exprs.go:61:15:61:15 | lit-index 1 | +| exprs.go:61:15:61:15 | After 1 | exprs.go:61:15:61:15 | lit-init 1 | | exprs.go:61:15:61:15 | Before 1 | exprs.go:61:15:61:15 | 1 | -| exprs.go:61:15:61:15 | lit-index 1 | exprs.go:61:15:61:15 | lit-init 1 | | exprs.go:61:15:61:15 | lit-init 1 | exprs.go:61:18:61:18 | Before 2 | | exprs.go:61:18:61:18 | 2 | exprs.go:61:18:61:18 | After 2 | -| exprs.go:61:18:61:18 | After 2 | exprs.go:61:18:61:18 | lit-index 2 | +| exprs.go:61:18:61:18 | After 2 | exprs.go:61:18:61:18 | lit-init 2 | | exprs.go:61:18:61:18 | Before 2 | exprs.go:61:18:61:18 | 2 | -| exprs.go:61:18:61:18 | lit-index 2 | exprs.go:61:18:61:18 | lit-init 2 | | exprs.go:61:18:61:18 | lit-init 2 | exprs.go:61:21:61:21 | Before 3 | | exprs.go:61:21:61:21 | 3 | exprs.go:61:21:61:21 | After 3 | -| exprs.go:61:21:61:21 | After 3 | exprs.go:61:21:61:21 | lit-index 3 | +| exprs.go:61:21:61:21 | After 3 | exprs.go:61:21:61:21 | lit-init 3 | | exprs.go:61:21:61:21 | Before 3 | exprs.go:61:21:61:21 | 3 | -| exprs.go:61:21:61:21 | lit-index 3 | exprs.go:61:21:61:21 | lit-init 3 | | exprs.go:61:21:61:21 | lit-init 3 | exprs.go:61:9:61:22 | After slice literal | | exprs.go:64:1:64:19 | After variable declaration | exprs.go:65:1:65:24 | variable declaration | | exprs.go:64:1:64:19 | variable declaration | exprs.go:64:5:64:19 | value declaration specifier | From 5383fe8647db7aa04644dec1566be3cef3f84283 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 10 Jul 2026 17:03:53 +0100 Subject: [PATCH 0987/2098] Fold uninitialised var-decl zero-init and write into one node --- .../go/controlflow/ControlFlowGraphShared.qll | 11 ++++-- go/ql/lib/semmle/go/controlflow/IR.qll | 36 ++++++++++++++++--- .../test/extractor-tests/go1.17/CFG.expected | 6 ++-- .../ControlFlowNode_getASuccessor.expected | 24 +++++-------- .../semmle/go/dataflow/SSA/VarDefs.expected | 6 ++-- 5 files changed, 54 insertions(+), 29 deletions(-) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll index f9e61fac5354..8b7a08360858 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll @@ -507,7 +507,11 @@ module CfgImpl { // so the guard itself emits no assignment write node. not n = any(Go::TypeSwitchStmt ts).getAssign() or - notBlankIdent(n.(Go::ValueSpec).getNameExpr(i)) + // A `ValueSpec` without an initializer is written by its `zero-init` + // node directly (see `IR::InitVariableInstruction`), so only specs + // *with* an initializer emit an `assign` write node. + notBlankIdent(n.(Go::ValueSpec).getNameExpr(i)) and + exists(n.(Go::ValueSpec).getAnInit()) or notBlankIdent(n.(Go::RangeElementExpr).getKey()) and i = 0 or @@ -1148,7 +1152,10 @@ module CfgImpl { // above, so they emit no separate `assign:j` node. not assgn instanceof Go::CompoundAssignStmt or - notBlankIdent(assgn.(Go::ValueSpec).getNameExpr(j)) + // A `ValueSpec` without an initializer is written by its `zero-init` + // node directly, so only specs *with* an initializer emit `assign:j`. + notBlankIdent(assgn.(Go::ValueSpec).getNameExpr(j)) and + exists(assgn.(Go::ValueSpec).getAnInit()) or notBlankIdent(assgn.(Go::RangeElementExpr).getKey()) and j = 0 or diff --git a/go/ql/lib/semmle/go/controlflow/IR.qll b/go/ql/lib/semmle/go/controlflow/IR.qll index 0be9d68d64e8..c85290657267 100644 --- a/go/ql/lib/semmle/go/controlflow/IR.qll +++ b/go/ql/lib/semmle/go/controlflow/IR.qll @@ -662,7 +662,11 @@ module IR { ( exists(assgn.(Assignment).getLhs(i)) or - exists(assgn.(ValueSpec).getNameExpr(i)) + // A `ValueSpec` without an initializer (`var x int`) is written by its + // `zero-init` node directly (see `InitVariableInstruction`), so only + // specs *with* an initializer produce an `assign` node. + exists(assgn.(ValueSpec).getNameExpr(i)) and + exists(assgn.(ValueSpec).getAnInit()) or assgn instanceof RangeElementExpr and i in [0, 1] ) @@ -677,9 +681,6 @@ module IR { exists(ValueSpec spec | spec = assgn | spec.getNumName() = spec.getNumInit() and result = evalExprInstruction(spec.getInit(i)) - or - result = - implicitInitInstruction(any(ValueEntity v | spec.getNameExpr(i) = v.getDeclaration())) ) or result.(ExtractTupleElementInstruction).isAdditional(assgn, "extract:" + i.toString()) @@ -1026,6 +1027,28 @@ module IR { override ControlFlow::Root getRoot() { result = res.getFunction() } } + /** + * An instruction initializing a variable declared without an initializer + * (`var x int`) to its zero value. + * + * This is the same node as the `EvalImplicitInitInstruction` that computes the + * zero value: the zero-value instruction performs the write of the variable + * directly, rather than feeding a separate write node. + */ + class InitVariableInstruction extends WriteInstruction { + ValueSpec spec; + int idx; + + InitVariableInstruction() { + this.isAdditional(spec, "zero-init:" + idx.toString()) and + exists(spec.getNameExpr(idx)) + } + + override Instruction getRhs() { result = this } + + override ControlFlow::Root getRoot() { result.isRootOf(spec) } + } + /** An instruction that gets the next key-value pair in a range loop. */ class GetNextEntryInstruction extends Instruction { RangeElementExpr p; @@ -1144,6 +1167,11 @@ module IR { write.isAdditional(fd.getBody(), "result-zero-init:" + idx.toString()) and lhs = fd.getResultVar(idx).getDeclaration() ) + or + exists(ValueSpec spec, int idx | + write.isAdditional(spec, "zero-init:" + idx.toString()) and + lhs = spec.getNameExpr(idx) + ) } or /** A composite literal element target. */ MkLiteralElementTarget(ControlFlow::Node write) { diff --git a/go/ql/test/extractor-tests/go1.17/CFG.expected b/go/ql/test/extractor-tests/go1.17/CFG.expected index 40eec15bfe0d..ebe0da07d68f 100644 --- a/go/ql/test/extractor-tests/go1.17/CFG.expected +++ b/go/ql/test/extractor-tests/go1.17/CFG.expected @@ -27,9 +27,8 @@ edges | conversions.go:8:2:8:21 | declaration statement | conversions.go:8:2:8:21 | variable declaration | | conversions.go:8:2:8:21 | variable declaration | conversions.go:8:6:8:21 | value declaration specifier | | conversions.go:8:6:8:21 | After value declaration specifier | conversions.go:8:2:8:21 | After variable declaration | -| conversions.go:8:6:8:21 | assign:0 value declaration specifier | conversions.go:8:6:8:21 | After value declaration specifier | | conversions.go:8:6:8:21 | value declaration specifier | conversions.go:8:6:8:21 | zero-init:0 value declaration specifier | -| conversions.go:8:6:8:21 | zero-init:0 value declaration specifier | conversions.go:8:6:8:21 | assign:0 value declaration specifier | +| conversions.go:8:6:8:21 | zero-init:0 value declaration specifier | conversions.go:8:6:8:21 | After value declaration specifier | | conversions.go:10:2:10:23 | ... := ... | conversions.go:10:7:10:23 | Before call to Add | | conversions.go:10:2:10:23 | After ... := ... | conversions.go:11:2:11:7 | expression statement | | conversions.go:10:2:10:23 | assign:0 ... := ... | conversions.go:10:2:10:23 | After ... := ... | @@ -62,9 +61,8 @@ edges | conversions.go:13:2:13:13 | declaration statement | conversions.go:13:2:13:13 | variable declaration | | conversions.go:13:2:13:13 | variable declaration | conversions.go:13:6:13:13 | value declaration specifier | | conversions.go:13:6:13:13 | After value declaration specifier | conversions.go:13:2:13:13 | After variable declaration | -| conversions.go:13:6:13:13 | assign:0 value declaration specifier | conversions.go:13:6:13:13 | After value declaration specifier | | conversions.go:13:6:13:13 | value declaration specifier | conversions.go:13:6:13:13 | zero-init:0 value declaration specifier | -| conversions.go:13:6:13:13 | zero-init:0 value declaration specifier | conversions.go:13:6:13:13 | assign:0 value declaration specifier | +| conversions.go:13:6:13:13 | zero-init:0 value declaration specifier | conversions.go:13:6:13:13 | After value declaration specifier | | conversions.go:14:2:14:31 | ... := ... | conversions.go:14:11:14:31 | Before call to Slice | | conversions.go:14:2:14:31 | After ... := ... | conversions.go:17:2:17:25 | ... := ... | | conversions.go:14:2:14:31 | assign:0 ... := ... | conversions.go:14:2:14:31 | After ... := ... | diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected index ccc5ee7661d5..c76c29ff38ec 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected @@ -1232,17 +1232,15 @@ | exprs.go:40:2:40:12 | declaration statement | exprs.go:40:2:40:12 | variable declaration | | exprs.go:40:2:40:12 | variable declaration | exprs.go:40:6:40:12 | value declaration specifier | | exprs.go:40:6:40:12 | After value declaration specifier | exprs.go:40:2:40:12 | After variable declaration | -| exprs.go:40:6:40:12 | assign:0 value declaration specifier | exprs.go:40:6:40:12 | After value declaration specifier | | exprs.go:40:6:40:12 | value declaration specifier | exprs.go:40:6:40:12 | zero-init:0 value declaration specifier | -| exprs.go:40:6:40:12 | zero-init:0 value declaration specifier | exprs.go:40:6:40:12 | assign:0 value declaration specifier | +| exprs.go:40:6:40:12 | zero-init:0 value declaration specifier | exprs.go:40:6:40:12 | After value declaration specifier | | exprs.go:41:2:41:12 | After declaration statement | exprs.go:42:2:42:20 | ... = ... | | exprs.go:41:2:41:12 | After variable declaration | exprs.go:41:2:41:12 | After declaration statement | | exprs.go:41:2:41:12 | declaration statement | exprs.go:41:2:41:12 | variable declaration | | exprs.go:41:2:41:12 | variable declaration | exprs.go:41:6:41:12 | value declaration specifier | | exprs.go:41:6:41:12 | After value declaration specifier | exprs.go:41:2:41:12 | After variable declaration | -| exprs.go:41:6:41:12 | assign:0 value declaration specifier | exprs.go:41:6:41:12 | After value declaration specifier | | exprs.go:41:6:41:12 | value declaration specifier | exprs.go:41:6:41:12 | zero-init:0 value declaration specifier | -| exprs.go:41:6:41:12 | zero-init:0 value declaration specifier | exprs.go:41:6:41:12 | assign:0 value declaration specifier | +| exprs.go:41:6:41:12 | zero-init:0 value declaration specifier | exprs.go:41:6:41:12 | After value declaration specifier | | exprs.go:42:2:42:20 | ... = ... | exprs.go:42:10:42:20 | Before type assertion | | exprs.go:42:2:42:20 | After ... = ... | exprs.go:43:2:45:2 | if statement | | exprs.go:42:2:42:20 | assign:0 ... = ... | exprs.go:42:2:42:20 | extract:1 ... = ... | @@ -1904,9 +1902,8 @@ | main.go:13:2:13:10 | declaration statement | main.go:13:2:13:10 | variable declaration | | main.go:13:2:13:10 | variable declaration | main.go:13:6:13:10 | value declaration specifier | | main.go:13:6:13:10 | After value declaration specifier | main.go:13:2:13:10 | After variable declaration | -| main.go:13:6:13:10 | assign:0 value declaration specifier | main.go:13:6:13:10 | After value declaration specifier | | main.go:13:6:13:10 | value declaration specifier | main.go:13:6:13:10 | zero-init:0 value declaration specifier | -| main.go:13:6:13:10 | zero-init:0 value declaration specifier | main.go:13:6:13:10 | assign:0 value declaration specifier | +| main.go:13:6:13:10 | zero-init:0 value declaration specifier | main.go:13:6:13:10 | After value declaration specifier | | main.go:14:2:14:8 | ... := ... | main.go:14:7:14:8 | Before 23 | | main.go:14:2:14:8 | After ... := ... | main.go:15:2:15:16 | expression statement | | main.go:14:2:14:8 | assign:0 ... := ... | main.go:14:2:14:8 | After ... := ... | @@ -2212,9 +2209,8 @@ | main.go:67:2:67:10 | declaration statement | main.go:67:2:67:10 | variable declaration | | main.go:67:2:67:10 | variable declaration | main.go:67:6:67:10 | value declaration specifier | | main.go:67:6:67:10 | After value declaration specifier | main.go:67:2:67:10 | After variable declaration | -| main.go:67:6:67:10 | assign:0 value declaration specifier | main.go:67:6:67:10 | After value declaration specifier | | main.go:67:6:67:10 | value declaration specifier | main.go:67:6:67:10 | zero-init:0 value declaration specifier | -| main.go:67:6:67:10 | zero-init:0 value declaration specifier | main.go:67:6:67:10 | assign:0 value declaration specifier | +| main.go:67:6:67:10 | zero-init:0 value declaration specifier | main.go:67:6:67:10 | After value declaration specifier | | main.go:68:2:70:2 | After for statement | main.go:71:2:71:13 | expression statement | | main.go:68:2:70:2 | [LoopHeader] for statement | main.go:68:6:68:11 | Before call to cond | | main.go:68:2:70:2 | for statement | main.go:68:6:68:11 | Before call to cond | @@ -2790,13 +2786,11 @@ | stmts3.go:7:9:7:12 | Before iota | stmts3.go:7:9:7:12 | iota | | stmts3.go:7:9:7:12 | iota | stmts3.go:7:9:7:12 | After iota | | stmts3.go:8:3:8:7 | After value declaration specifier | stmts3.go:9:3:9:6 | value declaration specifier | -| stmts3.go:8:3:8:7 | assign:0 value declaration specifier | stmts3.go:8:3:8:7 | After value declaration specifier | | stmts3.go:8:3:8:7 | value declaration specifier | stmts3.go:8:3:8:7 | zero-init:0 value declaration specifier | -| stmts3.go:8:3:8:7 | zero-init:0 value declaration specifier | stmts3.go:8:3:8:7 | assign:0 value declaration specifier | +| stmts3.go:8:3:8:7 | zero-init:0 value declaration specifier | stmts3.go:8:3:8:7 | After value declaration specifier | | stmts3.go:9:3:9:6 | After value declaration specifier | stmts3.go:6:2:10:2 | After constant declaration | -| stmts3.go:9:3:9:6 | assign:0 value declaration specifier | stmts3.go:9:3:9:6 | After value declaration specifier | | stmts3.go:9:3:9:6 | value declaration specifier | stmts3.go:9:3:9:6 | zero-init:0 value declaration specifier | -| stmts3.go:9:3:9:6 | zero-init:0 value declaration specifier | stmts3.go:9:3:9:6 | assign:0 value declaration specifier | +| stmts3.go:9:3:9:6 | zero-init:0 value declaration specifier | stmts3.go:9:3:9:6 | After value declaration specifier | | stmts3.go:11:2:11:26 | Before return statement | stmts3.go:11:9:11:26 | Before ...-... | | stmts3.go:11:2:11:26 | return statement | stmts3.go:5:1:12:1 | Normal Exit | | stmts3.go:11:9:11:11 | After red | stmts3.go:11:15:11:19 | Before green | @@ -3445,17 +3439,15 @@ | stmts.go:47:2:47:17 | declaration statement | stmts.go:47:2:47:17 | variable declaration | | stmts.go:47:2:47:17 | variable declaration | stmts.go:47:6:47:17 | value declaration specifier | | stmts.go:47:6:47:17 | After value declaration specifier | stmts.go:47:2:47:17 | After variable declaration | -| stmts.go:47:6:47:17 | assign:0 value declaration specifier | stmts.go:47:6:47:17 | After value declaration specifier | | stmts.go:47:6:47:17 | value declaration specifier | stmts.go:47:6:47:17 | zero-init:0 value declaration specifier | -| stmts.go:47:6:47:17 | zero-init:0 value declaration specifier | stmts.go:47:6:47:17 | assign:0 value declaration specifier | +| stmts.go:47:6:47:17 | zero-init:0 value declaration specifier | stmts.go:47:6:47:17 | After value declaration specifier | | stmts.go:48:2:48:11 | After declaration statement | stmts.go:50:2:59:2 | Before select statement | | stmts.go:48:2:48:11 | After variable declaration | stmts.go:48:2:48:11 | After declaration statement | | stmts.go:48:2:48:11 | declaration statement | stmts.go:48:2:48:11 | variable declaration | | stmts.go:48:2:48:11 | variable declaration | stmts.go:48:6:48:11 | value declaration specifier | | stmts.go:48:6:48:11 | After value declaration specifier | stmts.go:48:2:48:11 | After variable declaration | -| stmts.go:48:6:48:11 | assign:0 value declaration specifier | stmts.go:48:6:48:11 | After value declaration specifier | | stmts.go:48:6:48:11 | value declaration specifier | stmts.go:48:6:48:11 | zero-init:0 value declaration specifier | -| stmts.go:48:6:48:11 | zero-init:0 value declaration specifier | stmts.go:48:6:48:11 | assign:0 value declaration specifier | +| stmts.go:48:6:48:11 | zero-init:0 value declaration specifier | stmts.go:48:6:48:11 | After value declaration specifier | | stmts.go:50:2:59:2 | After select statement | stmts.go:61:2:61:10 | Before select statement | | stmts.go:50:2:59:2 | Before select statement | stmts.go:51:9:51:11 | Before ch1 | | stmts.go:50:2:59:2 | select statement | stmts.go:51:2:52:31 | comm clause | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarDefs.expected b/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarDefs.expected index 4d2c5fd7c461..c5cf617d7523 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarDefs.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarDefs.expected @@ -1,4 +1,4 @@ -| main.go:13:6:13:10 | assign:0 value declaration specifier | main.go:13:6:13:6 | x | main.go:13:6:13:10 | zero-init:0 value declaration specifier | +| main.go:13:6:13:10 | zero-init:0 value declaration specifier | main.go:13:6:13:6 | x | main.go:13:6:13:10 | zero-init:0 value declaration specifier | | main.go:14:2:14:8 | assign:0 ... := ... | main.go:14:2:14:2 | y | main.go:14:7:14:8 | 23 | | main.go:17:3:17:9 | compound-rhs ... += ... | main.go:14:2:14:2 | y | main.go:17:3:17:9 | compound-rhs ... += ... | | main.go:21:3:21:7 | assign:0 ... = ... | main.go:13:6:13:6 | x | main.go:21:7:21:7 | y | @@ -13,7 +13,7 @@ | main.go:47:25:50:1 | result-zero-init:0 block statement | main.go:47:13:47:18 | result | main.go:47:25:50:1 | result-zero-init:0 block statement | | main.go:48:2:48:12 | assign:0 ... = ... | main.go:47:13:47:18 | result | main.go:48:11:48:12 | 42 | | main.go:52:26:54:1 | result-zero-init:0 block statement | main.go:52:14:52:19 | result | main.go:52:26:54:1 | result-zero-init:0 block statement | -| main.go:57:6:57:10 | assign:0 value declaration specifier | main.go:57:6:57:6 | x | main.go:57:6:57:10 | zero-init:0 value declaration specifier | +| main.go:57:6:57:10 | zero-init:0 value declaration specifier | main.go:57:6:57:6 | x | main.go:57:6:57:10 | zero-init:0 value declaration specifier | | main.go:59:3:59:7 | assign:0 ... = ... | main.go:57:6:57:6 | x | main.go:59:7:59:7 | 2 | | main.go:63:2:63:7 | assign:0 ... := ... | main.go:63:2:63:2 | y | main.go:63:7:63:7 | 1 | | main.go:64:6:64:11 | assign:0 ... := ... | main.go:64:6:64:6 | i | main.go:64:11:64:11 | 0 | @@ -39,7 +39,7 @@ | main.go:113:2:113:7 | assign:0 ... := ... | main.go:113:2:113:2 | x | main.go:113:7:113:7 | 0 | | main.go:115:3:115:12 | assign:0 ... := ... | main.go:115:3:115:3 | y | main.go:115:8:115:12 | ...+... | | main.go:116:3:116:7 | assign:0 ... = ... | main.go:113:2:113:2 | x | main.go:116:7:116:7 | y | -| main.go:128:6:128:8 | assign:0 value declaration specifier | main.go:128:6:128:6 | p | main.go:128:6:128:8 | zero-init:0 value declaration specifier | +| main.go:128:6:128:8 | zero-init:0 value declaration specifier | main.go:128:6:128:6 | p | main.go:128:6:128:8 | zero-init:0 value declaration specifier | | main.go:130:3:130:24 | assign:0 ... = ... | main.go:128:6:128:6 | p | main.go:130:7:130:24 | struct literal | | main.go:130:9:130:9 | lit-init 2 | main.go:122:2:122:2 | a | main.go:130:9:130:9 | 2 | | main.go:130:12:130:18 | lit-init struct literal | main.go:123:2:123:2 | b | main.go:130:12:130:18 | struct literal | From 857f549b87b39de2aa1763a03d0ec8303dc98131 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 10 Jul 2026 17:05:41 +0100 Subject: [PATCH 0988/2098] Fold tuple-destructuring extract and write into one node --- .../go/controlflow/ControlFlowGraphShared.qll | 33 +++++----- go/ql/lib/semmle/go/controlflow/IR.qll | 42 ++++++++++--- .../ControlFlowNode_getASuccessor.expected | 63 +++++++------------ 3 files changed, 73 insertions(+), 65 deletions(-) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll index 8b7a08360858..bbe37ed4afbe 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll @@ -505,17 +505,19 @@ module CfgImpl { // (see `skipCfg`): the per-case implicit variables are written at the // case match nodes (see `IR::TypeSwitchImplicitVariableInstruction`), // so the guard itself emits no assignment write node. - not n = any(Go::TypeSwitchStmt ts).getAssign() + not n = any(Go::TypeSwitchStmt ts).getAssign() and + // A tuple-destructuring assignment (`x, y = f()`) folds its per-target + // write into the `extract` node (see `IR::ExtractWriteInstruction`). + not extractNodeCondition(n, i) or // A `ValueSpec` without an initializer is written by its `zero-init` - // node directly (see `IR::InitVariableInstruction`), so only specs - // *with* an initializer emit an `assign` write node. + // node directly (see `IR::InitVariableInstruction`), and a + // tuple-destructuring declaration (`var x, y = f()`) is written by its + // `extract` node; only specs with a per-name initializer emit + // `assign:i`. notBlankIdent(n.(Go::ValueSpec).getNameExpr(i)) and - exists(n.(Go::ValueSpec).getAnInit()) - or - notBlankIdent(n.(Go::RangeElementExpr).getKey()) and i = 0 - or - notBlankIdent(n.(Go::RangeElementExpr).getValue()) and i = 1 + exists(n.(Go::ValueSpec).getAnInit()) and + not extractNodeCondition(n, i) ) and tag = "assign:" + i.toString() ) @@ -1150,16 +1152,17 @@ module CfgImpl { notBlankIdent(assgn.(Go::Assignment).getLhs(j)) and // Compound assignments fold their write into `compound-rhs` (ord -1) // above, so they emit no separate `assign:j` node. - not assgn instanceof Go::CompoundAssignStmt + not assgn instanceof Go::CompoundAssignStmt and + // Tuple-destructuring targets are written by their `extract` node. + not extractNodeCondition(assgn, j) or // A `ValueSpec` without an initializer is written by its `zero-init` - // node directly, so only specs *with* an initializer emit `assign:j`. + // node directly, and a tuple-destructuring declaration by its + // `extract` node, so only specs with a per-name initializer emit + // `assign:j`. notBlankIdent(assgn.(Go::ValueSpec).getNameExpr(j)) and - exists(assgn.(Go::ValueSpec).getAnInit()) - or - notBlankIdent(assgn.(Go::RangeElementExpr).getKey()) and j = 0 - or - notBlankIdent(assgn.(Go::RangeElementExpr).getValue()) and j = 1 + exists(assgn.(Go::ValueSpec).getAnInit()) and + not extractNodeCondition(assgn, j) ) and result = "assign:" + j.toString() and ord = 2 * j + 1 diff --git a/go/ql/lib/semmle/go/controlflow/IR.qll b/go/ql/lib/semmle/go/controlflow/IR.qll index c85290657267..d3559f3bb1ad 100644 --- a/go/ql/lib/semmle/go/controlflow/IR.qll +++ b/go/ql/lib/semmle/go/controlflow/IR.qll @@ -667,8 +667,6 @@ module IR { // specs *with* an initializer produce an `assign` node. exists(assgn.(ValueSpec).getNameExpr(i)) and exists(assgn.(ValueSpec).getAnInit()) - or - assgn instanceof RangeElementExpr and i in [0, 1] ) } @@ -682,8 +680,6 @@ module IR { spec.getNumName() = spec.getNumInit() and result = evalExprInstruction(spec.getInit(i)) ) - or - result.(ExtractTupleElementInstruction).isAdditional(assgn, "extract:" + i.toString()) } override ControlFlow::Root getRoot() { result.isRootOf(assgn) } @@ -797,6 +793,19 @@ module IR { override ControlFlow::Root getRoot() { result.isRootOf(s) } } + /** + * An `ExtractTupleElementInstruction` that also writes the extracted component + * to a left-hand side, as in a tuple-destructuring assignment (`x, y = f()`), + * a multi-variable declaration (`var x, y = f()`), or a `range` statement + * (`k, v := range m`). + * + * The extraction node performs the write directly, rather than feeding a + * separate `assign` node. + */ + class ExtractWriteInstruction extends WriteInstruction, ExtractTupleElementInstruction { + override Instruction getRhs() { result = this } + } + /** * An instruction that computes the zero value to which a variable without an initializer * expression is initialized. @@ -1172,6 +1181,23 @@ module IR { write.isAdditional(spec, "zero-init:" + idx.toString()) and lhs = spec.getNameExpr(idx) ) + or + // A tuple-destructuring `extract` node writes its component directly (see + // `ExtractWriteInstruction`); blank-identifier targets are not written. + exists(AstNode assgn, int i | write.isAdditional(assgn, "extract:" + i.toString()) | + ( + lhs = assgn.(Assignment).getLhs(i).stripParens() + or + lhs = assgn.(ValueSpec).getNameExpr(i) + or + exists(RangeElementExpr p | p = assgn | + i = 0 and lhs = p.getKey().stripParens() + or + i = 1 and lhs = p.getValue().stripParens() + ) + ) and + not lhs instanceof BlankIdent + ) } or /** A composite literal element target. */ MkLiteralElementTarget(ControlFlow::Node write) { @@ -1413,16 +1439,16 @@ module IR { * Gets the instruction corresponding to the assignment of the key variable * of range statement `rs`. */ - AssignInstruction assignKeyInstruction(RangeStmt rs) { - result.isAdditional(rs.getPattern(), "assign:0") + ExtractWriteInstruction assignKeyInstruction(RangeStmt rs) { + result.isAdditional(rs.getPattern(), "extract:0") } /** * Gets the instruction corresponding to the assignment of the value variable * of range statement `rs`. */ - AssignInstruction assignValueInstruction(RangeStmt rs) { - result.isAdditional(rs.getPattern(), "assign:1") + ExtractWriteInstruction assignValueInstruction(RangeStmt rs) { + result.isAdditional(rs.getPattern(), "extract:1") } /** diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected index c76c29ff38ec..ac8f4adc8e25 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected @@ -1188,10 +1188,8 @@ | exprs.go:33:2:35:2 | if statement | exprs.go:33:5:33:24 | ... := ... | | exprs.go:33:5:33:24 | ... := ... | exprs.go:33:14:33:24 | Before type assertion | | exprs.go:33:5:33:24 | After ... := ... | exprs.go:33:27:33:28 | Before ok | -| exprs.go:33:5:33:24 | assign:0 ... := ... | exprs.go:33:5:33:24 | extract:1 ... := ... | -| exprs.go:33:5:33:24 | assign:1 ... := ... | exprs.go:33:5:33:24 | After ... := ... | -| exprs.go:33:5:33:24 | extract:0 ... := ... | exprs.go:33:5:33:24 | assign:0 ... := ... | -| exprs.go:33:5:33:24 | extract:1 ... := ... | exprs.go:33:5:33:24 | assign:1 ... := ... | +| exprs.go:33:5:33:24 | extract:0 ... := ... | exprs.go:33:5:33:24 | extract:1 ... := ... | +| exprs.go:33:5:33:24 | extract:1 ... := ... | exprs.go:33:5:33:24 | After ... := ... | | exprs.go:33:14:33:16 | After arg | exprs.go:33:14:33:24 | type assertion | | exprs.go:33:14:33:16 | Before arg | exprs.go:33:14:33:16 | arg | | exprs.go:33:14:33:16 | arg | exprs.go:33:14:33:16 | After arg | @@ -1243,10 +1241,8 @@ | exprs.go:41:6:41:12 | zero-init:0 value declaration specifier | exprs.go:41:6:41:12 | After value declaration specifier | | exprs.go:42:2:42:20 | ... = ... | exprs.go:42:10:42:20 | Before type assertion | | exprs.go:42:2:42:20 | After ... = ... | exprs.go:43:2:45:2 | if statement | -| exprs.go:42:2:42:20 | assign:0 ... = ... | exprs.go:42:2:42:20 | extract:1 ... = ... | -| exprs.go:42:2:42:20 | assign:1 ... = ... | exprs.go:42:2:42:20 | After ... = ... | -| exprs.go:42:2:42:20 | extract:0 ... = ... | exprs.go:42:2:42:20 | assign:0 ... = ... | -| exprs.go:42:2:42:20 | extract:1 ... = ... | exprs.go:42:2:42:20 | assign:1 ... = ... | +| exprs.go:42:2:42:20 | extract:0 ... = ... | exprs.go:42:2:42:20 | extract:1 ... = ... | +| exprs.go:42:2:42:20 | extract:1 ... = ... | exprs.go:42:2:42:20 | After ... = ... | | exprs.go:42:10:42:12 | After arg | exprs.go:42:10:42:20 | type assertion | | exprs.go:42:10:42:12 | Before arg | exprs.go:42:10:42:12 | arg | | exprs.go:42:10:42:12 | arg | exprs.go:42:10:42:12 | After arg | @@ -1520,10 +1516,8 @@ | exprs.go:81:35:87:1 | block statement | exprs.go:82:2:82:16 | ... := ... | | exprs.go:82:2:82:16 | ... := ... | exprs.go:82:13:82:16 | Before <-... | | exprs.go:82:2:82:16 | After ... := ... | exprs.go:83:2:85:2 | if statement | -| exprs.go:82:2:82:16 | assign:0 ... := ... | exprs.go:82:2:82:16 | extract:1 ... := ... | -| exprs.go:82:2:82:16 | assign:1 ... := ... | exprs.go:82:2:82:16 | After ... := ... | -| exprs.go:82:2:82:16 | extract:0 ... := ... | exprs.go:82:2:82:16 | assign:0 ... := ... | -| exprs.go:82:2:82:16 | extract:1 ... := ... | exprs.go:82:2:82:16 | assign:1 ... := ... | +| exprs.go:82:2:82:16 | extract:0 ... := ... | exprs.go:82:2:82:16 | extract:1 ... := ... | +| exprs.go:82:2:82:16 | extract:1 ... := ... | exprs.go:82:2:82:16 | After ... := ... | | exprs.go:82:13:82:16 | <-... | exprs.go:82:13:82:16 | After <-... | | exprs.go:82:13:82:16 | After <-... | exprs.go:82:2:82:16 | extract:0 ... := ... | | exprs.go:82:13:82:16 | Before <-... | exprs.go:82:15:82:16 | Before ch | @@ -1775,10 +1769,8 @@ | generic.go:30:24:30:24 | c | generic.go:30:24:30:24 | After c | | generic.go:31:2:31:53 | ... := ... | generic.go:31:10:31:53 | Before call to genericIdentity2 | | generic.go:31:2:31:53 | After ... := ... | generic.go:32:2:32:31 | ... := ... | -| generic.go:31:2:31:53 | assign:0 ... := ... | generic.go:31:2:31:53 | extract:1 ... := ... | -| generic.go:31:2:31:53 | assign:1 ... := ... | generic.go:31:2:31:53 | After ... := ... | -| generic.go:31:2:31:53 | extract:0 ... := ... | generic.go:31:2:31:53 | assign:0 ... := ... | -| generic.go:31:2:31:53 | extract:1 ... := ... | generic.go:31:2:31:53 | assign:1 ... := ... | +| generic.go:31:2:31:53 | extract:0 ... := ... | generic.go:31:2:31:53 | extract:1 ... := ... | +| generic.go:31:2:31:53 | extract:1 ... := ... | generic.go:31:2:31:53 | After ... := ... | | generic.go:31:10:31:25 | After genericIdentity2 | generic.go:31:10:31:41 | generic function instantiation expression | | generic.go:31:10:31:25 | Before genericIdentity2 | generic.go:31:10:31:25 | genericIdentity2 | | generic.go:31:10:31:25 | genericIdentity2 | generic.go:31:10:31:25 | After genericIdentity2 | @@ -1797,10 +1789,8 @@ | generic.go:31:46:31:52 | Before "hello" | generic.go:31:46:31:52 | "hello" | | generic.go:32:2:32:31 | ... := ... | generic.go:32:10:32:31 | Before call to genericIdentity2 | | generic.go:32:2:32:31 | After ... := ... | generic.go:33:2:33:6 | ... = ... | -| generic.go:32:2:32:31 | assign:0 ... := ... | generic.go:32:2:32:31 | extract:1 ... := ... | -| generic.go:32:2:32:31 | assign:1 ... := ... | generic.go:32:2:32:31 | After ... := ... | -| generic.go:32:2:32:31 | extract:0 ... := ... | generic.go:32:2:32:31 | assign:0 ... := ... | -| generic.go:32:2:32:31 | extract:1 ... := ... | generic.go:32:2:32:31 | assign:1 ... := ... | +| generic.go:32:2:32:31 | extract:0 ... := ... | generic.go:32:2:32:31 | extract:1 ... := ... | +| generic.go:32:2:32:31 | extract:1 ... := ... | generic.go:32:2:32:31 | After ... := ... | | generic.go:32:10:32:25 | After genericIdentity2 | generic.go:32:27:32:27 | Before e | | generic.go:32:10:32:25 | Before genericIdentity2 | generic.go:32:10:32:25 | genericIdentity2 | | generic.go:32:10:32:25 | genericIdentity2 | generic.go:32:10:32:25 | After genericIdentity2 | @@ -2592,9 +2582,8 @@ | stmts2.go:9:19:13:1 | block statement | stmts2.go:10:2:10:14 | ... := ... | | stmts2.go:10:2:10:14 | ... := ... | stmts2.go:10:10:10:14 | Before call to gen | | stmts2.go:10:2:10:14 | After ... := ... | stmts2.go:11:2:11:17 | declaration statement | -| stmts2.go:10:2:10:14 | assign:1 ... := ... | stmts2.go:10:2:10:14 | After ... := ... | | stmts2.go:10:2:10:14 | extract:0 ... := ... | stmts2.go:10:2:10:14 | extract:1 ... := ... | -| stmts2.go:10:2:10:14 | extract:1 ... := ... | stmts2.go:10:2:10:14 | assign:1 ... := ... | +| stmts2.go:10:2:10:14 | extract:1 ... := ... | stmts2.go:10:2:10:14 | After ... := ... | | stmts2.go:10:10:10:12 | After gen | stmts2.go:10:10:10:14 | call to gen | | stmts2.go:10:10:10:12 | Before gen | stmts2.go:10:10:10:12 | gen | | stmts2.go:10:10:10:12 | gen | stmts2.go:10:10:10:12 | After gen | @@ -2607,9 +2596,8 @@ | stmts2.go:11:2:11:17 | declaration statement | stmts2.go:11:2:11:17 | variable declaration | | stmts2.go:11:2:11:17 | variable declaration | stmts2.go:11:6:11:17 | value declaration specifier | | stmts2.go:11:6:11:17 | After value declaration specifier | stmts2.go:11:2:11:17 | After variable declaration | -| stmts2.go:11:6:11:17 | assign:1 value declaration specifier | stmts2.go:11:6:11:17 | After value declaration specifier | | stmts2.go:11:6:11:17 | extract:0 value declaration specifier | stmts2.go:11:6:11:17 | extract:1 value declaration specifier | -| stmts2.go:11:6:11:17 | extract:1 value declaration specifier | stmts2.go:11:6:11:17 | assign:1 value declaration specifier | +| stmts2.go:11:6:11:17 | extract:1 value declaration specifier | stmts2.go:11:6:11:17 | After value declaration specifier | | stmts2.go:11:6:11:17 | value declaration specifier | stmts2.go:11:13:11:17 | Before call to gen | | stmts2.go:11:13:11:15 | After gen | stmts2.go:11:13:11:17 | call to gen | | stmts2.go:11:13:11:15 | Before gen | stmts2.go:11:13:11:15 | gen | @@ -2654,8 +2642,7 @@ | stmts2.go:18:7:18:7 | After x | stmts2.go:18:10:18:10 | Before _ | | stmts2.go:18:7:18:7 | Before x | stmts2.go:18:7:18:7 | x | | stmts2.go:18:7:18:7 | x | stmts2.go:18:7:18:7 | After x | -| stmts2.go:18:7:18:18 | assign:0 ... := ... | stmts2.go:18:7:18:18 | extract:1 ... := ... | -| stmts2.go:18:7:18:18 | extract:0 ... := ... | stmts2.go:18:7:18:18 | assign:0 ... := ... | +| stmts2.go:18:7:18:18 | extract:0 ... := ... | stmts2.go:18:7:18:18 | extract:1 ... := ... | | stmts2.go:18:7:18:18 | extract:1 ... := ... | stmts2.go:19:3:19:10 | Before return statement | | stmts2.go:18:10:18:10 | After _ | stmts2.go:18:7:18:18 | extract:0 ... := ... | | stmts2.go:18:10:18:10 | Before _ | stmts2.go:18:10:18:10 | _ | @@ -2673,9 +2660,8 @@ | stmts2.go:20:7:20:7 | After _ | stmts2.go:20:10:20:10 | Before y | | stmts2.go:20:7:20:7 | Before _ | stmts2.go:20:7:20:7 | _ | | stmts2.go:20:7:20:7 | _ | stmts2.go:20:7:20:7 | After _ | -| stmts2.go:20:7:20:18 | assign:1 ... := ... | stmts2.go:21:3:23:3 | if statement | | stmts2.go:20:7:20:18 | extract:0 ... := ... | stmts2.go:20:7:20:18 | extract:1 ... := ... | -| stmts2.go:20:7:20:18 | extract:1 ... := ... | stmts2.go:20:7:20:18 | assign:1 ... := ... | +| stmts2.go:20:7:20:18 | extract:1 ... := ... | stmts2.go:21:3:23:3 | if statement | | stmts2.go:20:10:20:10 | After y | stmts2.go:20:7:20:18 | extract:0 ... := ... | | stmts2.go:20:10:20:10 | Before y | stmts2.go:20:10:20:10 | y | | stmts2.go:20:10:20:10 | y | stmts2.go:20:10:20:10 | After y | @@ -2725,8 +2711,7 @@ | stmts2.go:30:20:34:1 | block statement | stmts2.go:31:2:31:14 | ... := ... | | stmts2.go:31:2:31:14 | ... := ... | stmts2.go:31:10:31:14 | Before call to gen | | stmts2.go:31:2:31:14 | After ... := ... | stmts2.go:32:2:32:17 | declaration statement | -| stmts2.go:31:2:31:14 | assign:0 ... := ... | stmts2.go:31:2:31:14 | extract:1 ... := ... | -| stmts2.go:31:2:31:14 | extract:0 ... := ... | stmts2.go:31:2:31:14 | assign:0 ... := ... | +| stmts2.go:31:2:31:14 | extract:0 ... := ... | stmts2.go:31:2:31:14 | extract:1 ... := ... | | stmts2.go:31:2:31:14 | extract:1 ... := ... | stmts2.go:31:2:31:14 | After ... := ... | | stmts2.go:31:10:31:12 | After gen | stmts2.go:31:10:31:14 | call to gen | | stmts2.go:31:10:31:12 | Before gen | stmts2.go:31:10:31:12 | gen | @@ -2740,8 +2725,7 @@ | stmts2.go:32:2:32:17 | declaration statement | stmts2.go:32:2:32:17 | variable declaration | | stmts2.go:32:2:32:17 | variable declaration | stmts2.go:32:6:32:17 | value declaration specifier | | stmts2.go:32:6:32:17 | After value declaration specifier | stmts2.go:32:2:32:17 | After variable declaration | -| stmts2.go:32:6:32:17 | assign:0 value declaration specifier | stmts2.go:32:6:32:17 | extract:1 value declaration specifier | -| stmts2.go:32:6:32:17 | extract:0 value declaration specifier | stmts2.go:32:6:32:17 | assign:0 value declaration specifier | +| stmts2.go:32:6:32:17 | extract:0 value declaration specifier | stmts2.go:32:6:32:17 | extract:1 value declaration specifier | | stmts2.go:32:6:32:17 | extract:1 value declaration specifier | stmts2.go:32:6:32:17 | After value declaration specifier | | stmts2.go:32:6:32:17 | value declaration specifier | stmts2.go:32:13:32:17 | Before call to gen | | stmts2.go:32:13:32:15 | After gen | stmts2.go:32:13:32:17 | call to gen | @@ -3479,10 +3463,8 @@ | stmts.go:53:7:53:10 | Before index expression | stmts.go:53:7:53:7 | Before a | | stmts.go:53:7:53:10 | index expression | stmts.go:46:1:62:1 | Exceptional Exit | | stmts.go:53:7:53:10 | index expression | stmts.go:53:7:53:10 | After index expression | -| stmts.go:53:7:53:21 | assign:0 ... = ... | stmts.go:53:7:53:21 | extract:1 ... = ... | -| stmts.go:53:7:53:21 | assign:1 ... = ... | stmts.go:54:3:54:16 | expression statement | -| stmts.go:53:7:53:21 | extract:0 ... = ... | stmts.go:53:7:53:21 | assign:0 ... = ... | -| stmts.go:53:7:53:21 | extract:1 ... = ... | stmts.go:53:7:53:21 | assign:1 ... = ... | +| stmts.go:53:7:53:21 | extract:0 ... = ... | stmts.go:53:7:53:21 | extract:1 ... = ... | +| stmts.go:53:7:53:21 | extract:1 ... = ... | stmts.go:54:3:54:16 | expression statement | | stmts.go:53:9:53:9 | 0 | stmts.go:53:9:53:9 | After 0 | | stmts.go:53:9:53:9 | After 0 | stmts.go:53:7:53:10 | index expression | | stmts.go:53:9:53:9 | Before 0 | stmts.go:53:9:53:9 | 0 | @@ -4014,8 +3996,7 @@ | stmts.go:146:2:151:2 | After range statement | stmts.go:153:2:155:2 | range statement | | stmts.go:146:2:151:2 | [LoopHeader] range statement | stmts.go:146:2:151:2 | After range statement | | stmts.go:146:2:151:2 | [LoopHeader] range statement | stmts.go:146:2:151:2 | range element | -| stmts.go:146:2:151:2 | assign:0 range element | stmts.go:146:2:151:2 | After range element | -| stmts.go:146:2:151:2 | extract:0 range element | stmts.go:146:2:151:2 | assign:0 range element | +| stmts.go:146:2:151:2 | extract:0 range element | stmts.go:146:2:151:2 | After range element | | stmts.go:146:2:151:2 | next range element | stmts.go:146:2:151:2 | extract:0 range element | | stmts.go:146:2:151:2 | range element | stmts.go:146:2:151:2 | next range element | | stmts.go:146:2:151:2 | range statement | stmts.go:146:17:146:18 | Before xs | @@ -4058,10 +4039,8 @@ | stmts.go:153:2:155:2 | After range statement | stmts.go:157:2:158:2 | range statement | | stmts.go:153:2:155:2 | [LoopHeader] range statement | stmts.go:153:2:155:2 | After range statement | | stmts.go:153:2:155:2 | [LoopHeader] range statement | stmts.go:153:2:155:2 | range element | -| stmts.go:153:2:155:2 | assign:0 range element | stmts.go:153:2:155:2 | extract:1 range element | -| stmts.go:153:2:155:2 | assign:1 range element | stmts.go:153:2:155:2 | After range element | -| stmts.go:153:2:155:2 | extract:0 range element | stmts.go:153:2:155:2 | assign:0 range element | -| stmts.go:153:2:155:2 | extract:1 range element | stmts.go:153:2:155:2 | assign:1 range element | +| stmts.go:153:2:155:2 | extract:0 range element | stmts.go:153:2:155:2 | extract:1 range element | +| stmts.go:153:2:155:2 | extract:1 range element | stmts.go:153:2:155:2 | After range element | | stmts.go:153:2:155:2 | next range element | stmts.go:153:2:155:2 | extract:0 range element | | stmts.go:153:2:155:2 | range element | stmts.go:153:2:155:2 | next range element | | stmts.go:153:2:155:2 | range statement | stmts.go:153:20:153:21 | Before xs | From 00815e99021e0823987cb05c5b9669ffd921a976 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 10 Jul 2026 23:39:13 +0100 Subject: [PATCH 0989/2098] Unify result-zero-init and zero-init node kinds --- .../go/controlflow/ControlFlowGraphShared.qll | 21 ++++--- go/ql/lib/semmle/go/controlflow/IR.qll | 63 ++++--------------- .../ControlFlowNode_getASuccessor.expected | 42 ++++++------- .../dataflow/FlowSteps/LocalFlowStep.expected | 4 +- .../FunctionOutput_getEntryNode.expected | 10 +-- .../GlobalValueNumber.expected | 6 +- .../semmle/go/dataflow/SSA/VarDefs.expected | 8 +-- 7 files changed, 58 insertions(+), 96 deletions(-) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll index bbe37ed4afbe..b3ee4f612c24 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll @@ -511,7 +511,7 @@ module CfgImpl { not extractNodeCondition(n, i) or // A `ValueSpec` without an initializer is written by its `zero-init` - // node directly (see `IR::InitVariableInstruction`), and a + // node directly (see `IR::EvalImplicitInitInstruction`), and a // tuple-destructuring declaration (`var x, y = f()`) is written by its // `extract` node; only specs with a per-name initializer emit // `assign:i`. @@ -561,15 +561,16 @@ module CfgImpl { tag = "result-read:" + i.toString() ) or - // Result variable zero init + init (on the function body). This single + // Result-variable zero-initialization (on the function body). This single // node computes the zero value and writes it to the result variable (see - // `IR::InitResultInstruction`). + // `IR::EvalImplicitInitInstruction`); it is the same kind of node as the + // `zero-init` of an uninitialised local variable. exists(int i, Go::FuncDef fd | n = fd.getBody() and exists(fd.getBody()) and exists(fd.getResultVar(i)) and exists(fd.getResultVar(i).(Go::ResultVariable).getFunction().getBody()) and - tag = "result-zero-init:" + i.toString() + tag = "zero-init:" + i.toString() ) or // Implicit deref @@ -1671,7 +1672,7 @@ module CfgImpl { * - Prologue: parameters are modelled as native CFG nodes by the shared * library (Entry → param → ... → Before(body)). The remaining * prologue on Before(body) zero-initializes any named result - * variables: result-zero-init:0 → result-zero-init:1 → ... → first statement. + * variables: zero-init:0 → zero-init:1 → ... → first statement. * - Epilogue: return → result-read:0 → result-read:1 → ... → result-read:last * * The last result-read node goes to `NormalExit(fd)` via the shared @@ -1700,17 +1701,17 @@ module CfgImpl { // by the shared library's default control flow. n1.isBefore(fd.getBody()) and exists(fd.getResultVar(0)) and - n2.isAdditional(fd.getBody(), "result-zero-init:0") + n2.isAdditional(fd.getBody(), "zero-init:0") or - // result-zero-init:j → next: result-zero-init:(j+1), or Before(body). + // zero-init:j → next: zero-init:(j+1), or Before(body). // The zero-init node also writes the result variable (see - // `IR::InitResultInstruction`), so there is no separate result-init node. + // `IR::EvalImplicitInitInstruction`), so there is no separate result-init node. exists(int j | exists(fd.getResultVar(j)) | - n1.isAdditional(fd.getBody(), "result-zero-init:" + j.toString()) and + n1.isAdditional(fd.getBody(), "zero-init:" + j.toString()) and ( // Next result var exists exists(fd.getResultVar(j + 1)) and - n2.isAdditional(fd.getBody(), "result-zero-init:" + (j + 1).toString()) + n2.isAdditional(fd.getBody(), "zero-init:" + (j + 1).toString()) or // No next result var: go to Before(body) not exists(fd.getResultVar(j + 1)) and diff --git a/go/ql/lib/semmle/go/controlflow/IR.qll b/go/ql/lib/semmle/go/controlflow/IR.qll index d3559f3bb1ad..c15764e38748 100644 --- a/go/ql/lib/semmle/go/controlflow/IR.qll +++ b/go/ql/lib/semmle/go/controlflow/IR.qll @@ -663,7 +663,7 @@ module IR { exists(assgn.(Assignment).getLhs(i)) or // A `ValueSpec` without an initializer (`var x int`) is written by its - // `zero-init` node directly (see `InitVariableInstruction`), so only + // `zero-init` node directly (see `EvalImplicitInitInstruction`), so only // specs *with* an initializer produce an `assign` node. exists(assgn.(ValueSpec).getNameExpr(i)) and exists(assgn.(ValueSpec).getAnInit()) @@ -807,10 +807,13 @@ module IR { } /** - * An instruction that computes the zero value to which a variable without an initializer - * expression is initialized. + * An instruction initializing a variable declared without an initializer + * (a local `var x int`, or a named function result) to its zero value. + * + * The zero-value instruction performs the write of the variable directly, + * rather than feeding a separate write node. */ - class EvalImplicitInitInstruction extends Instruction { + class EvalImplicitInitInstruction extends WriteInstruction { ValueEntity v; EvalImplicitInitInstruction() { @@ -820,11 +823,13 @@ module IR { ) or exists(FuncDef fd, int idx | - this.isAdditional(fd.getBody(), "result-zero-init:" + idx.toString()) and + this.isAdditional(fd.getBody(), "zero-init:" + idx.toString()) and v = fd.getResultVar(idx) ) } + override Instruction getRhs() { result = this } + override Type getResultType() { result = v.getType() } override ControlFlow::Root getRoot() { result.isRootOf(v.getDeclaration()) } @@ -1014,50 +1019,6 @@ module IR { override ControlFlow::Root getRoot() { result = parm.getFunction() } } - /** - * An instruction initializing a result variable to its zero value. - * - * This is the same node as the `EvalImplicitInitInstruction` that computes the - * zero value: the zero-value instruction performs the write of the result - * variable directly, rather than feeding a separate write node. - */ - class InitResultInstruction extends WriteInstruction { - ResultVariable res; - int idx; - FuncDef fd; - - InitResultInstruction() { - this.isAdditional(fd.getBody(), "result-zero-init:" + idx.toString()) and - res = fd.getResultVar(idx) - } - - override Instruction getRhs() { result = this } - - override ControlFlow::Root getRoot() { result = res.getFunction() } - } - - /** - * An instruction initializing a variable declared without an initializer - * (`var x int`) to its zero value. - * - * This is the same node as the `EvalImplicitInitInstruction` that computes the - * zero value: the zero-value instruction performs the write of the variable - * directly, rather than feeding a separate write node. - */ - class InitVariableInstruction extends WriteInstruction { - ValueSpec spec; - int idx; - - InitVariableInstruction() { - this.isAdditional(spec, "zero-init:" + idx.toString()) and - exists(spec.getNameExpr(idx)) - } - - override Instruction getRhs() { result = this } - - override ControlFlow::Root getRoot() { result.isRootOf(spec) } - } - /** An instruction that gets the next key-value pair in a range loop. */ class GetNextEntryInstruction extends Instruction { RangeElementExpr p; @@ -1173,7 +1134,7 @@ module IR { ) or exists(FuncDef fd, int idx | - write.isAdditional(fd.getBody(), "result-zero-init:" + idx.toString()) and + write.isAdditional(fd.getBody(), "zero-init:" + idx.toString()) and lhs = fd.getResultVar(idx).getDeclaration() ) or @@ -1463,7 +1424,7 @@ module IR { or exists(FuncDef fd, int i | fd.getResultVar(i) = v and - result.isAdditional(fd.getBody(), "result-zero-init:" + i.toString()) + result.isAdditional(fd.getBody(), "zero-init:" + i.toString()) ) } diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected index ac8f4adc8e25..2ea98f62c312 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected @@ -244,11 +244,11 @@ | epilogues.go:42:1:48:1 | Normal Exit | epilogues.go:42:1:48:1 | Exit | | epilogues.go:42:1:48:1 | function declaration | epilogues.go:42:1:48:1 | After function declaration | | epilogues.go:42:20:42:20 | x | epilogues.go:42:51:48:1 | block statement | -| epilogues.go:42:51:48:1 | block statement | epilogues.go:42:51:48:1 | result-zero-init:0 block statement | +| epilogues.go:42:51:48:1 | block statement | epilogues.go:42:51:48:1 | zero-init:0 block statement | | epilogues.go:42:51:48:1 | result-read:0 block statement | epilogues.go:42:51:48:1 | result-read:1 block statement | | epilogues.go:42:51:48:1 | result-read:1 block statement | epilogues.go:42:1:48:1 | Normal Exit | -| epilogues.go:42:51:48:1 | result-zero-init:0 block statement | epilogues.go:42:51:48:1 | result-zero-init:1 block statement | -| epilogues.go:42:51:48:1 | result-zero-init:1 block statement | epilogues.go:43:2:46:2 | if statement | +| epilogues.go:42:51:48:1 | zero-init:0 block statement | epilogues.go:42:51:48:1 | zero-init:1 block statement | +| epilogues.go:42:51:48:1 | zero-init:1 block statement | epilogues.go:43:2:46:2 | if statement | | epilogues.go:43:2:46:2 | After if statement | epilogues.go:47:2:47:14 | Before return statement | | epilogues.go:43:2:46:2 | if statement | epilogues.go:43:5:43:9 | Before ...<... | | epilogues.go:43:5:43:5 | After x | epilogues.go:43:9:43:9 | Before 0 | @@ -290,9 +290,9 @@ | epilogues.go:51:1:54:1 | Normal Exit | epilogues.go:51:1:54:1 | Exit | | epilogues.go:51:1:54:1 | function declaration | epilogues.go:51:1:54:1 | After function declaration | | epilogues.go:51:23:51:23 | x | epilogues.go:51:38:54:1 | block statement | -| epilogues.go:51:38:54:1 | block statement | epilogues.go:51:38:54:1 | result-zero-init:0 block statement | +| epilogues.go:51:38:54:1 | block statement | epilogues.go:51:38:54:1 | zero-init:0 block statement | | epilogues.go:51:38:54:1 | result-read:0 block statement | epilogues.go:51:1:54:1 | Normal Exit | -| epilogues.go:51:38:54:1 | result-zero-init:0 block statement | epilogues.go:52:2:52:10 | ... = ... | +| epilogues.go:51:38:54:1 | zero-init:0 block statement | epilogues.go:52:2:52:10 | ... = ... | | epilogues.go:52:2:52:10 | ... = ... | epilogues.go:52:6:52:10 | Before ...+... | | epilogues.go:52:2:52:10 | After ... = ... | epilogues.go:53:2:53:7 | Before return statement | | epilogues.go:52:2:52:10 | assign:0 ... = ... | epilogues.go:52:2:52:10 | After ... = ... | @@ -511,9 +511,9 @@ | epilogues.go:87:1:98:1 | Normal Exit | epilogues.go:87:1:98:1 | Exit | | epilogues.go:87:1:98:1 | function declaration | epilogues.go:87:1:98:1 | After function declaration | | epilogues.go:87:22:87:22 | x | epilogues.go:87:42:98:1 | block statement | -| epilogues.go:87:42:98:1 | block statement | epilogues.go:87:42:98:1 | result-zero-init:0 block statement | +| epilogues.go:87:42:98:1 | block statement | epilogues.go:87:42:98:1 | zero-init:0 block statement | | epilogues.go:87:42:98:1 | result-read:0 block statement | epilogues.go:87:1:98:1 | Normal Exit | -| epilogues.go:87:42:98:1 | result-zero-init:0 block statement | epilogues.go:88:2:92:4 | Before defer statement | +| epilogues.go:87:42:98:1 | zero-init:0 block statement | epilogues.go:88:2:92:4 | Before defer statement | | epilogues.go:88:2:92:4 | After defer statement | epilogues.go:93:2:95:2 | if statement | | epilogues.go:88:2:92:4 | Before defer statement | epilogues.go:88:8:92:4 | function call | | epilogues.go:88:2:92:4 | defer statement | epilogues.go:88:2:92:4 | After defer statement | @@ -609,11 +609,11 @@ | epilogues.go:102:1:110:1 | Normal Exit | epilogues.go:102:1:110:1 | Exit | | epilogues.go:102:1:110:1 | function declaration | epilogues.go:102:1:110:1 | After function declaration | | epilogues.go:102:26:102:26 | x | epilogues.go:102:50:110:1 | block statement | -| epilogues.go:102:50:110:1 | block statement | epilogues.go:102:50:110:1 | result-zero-init:0 block statement | +| epilogues.go:102:50:110:1 | block statement | epilogues.go:102:50:110:1 | zero-init:0 block statement | | epilogues.go:102:50:110:1 | result-read:0 block statement | epilogues.go:102:50:110:1 | result-read:1 block statement | | epilogues.go:102:50:110:1 | result-read:1 block statement | epilogues.go:102:1:110:1 | Normal Exit | -| epilogues.go:102:50:110:1 | result-zero-init:0 block statement | epilogues.go:102:50:110:1 | result-zero-init:1 block statement | -| epilogues.go:102:50:110:1 | result-zero-init:1 block statement | epilogues.go:103:2:103:19 | Before defer statement | +| epilogues.go:102:50:110:1 | zero-init:0 block statement | epilogues.go:102:50:110:1 | zero-init:1 block statement | +| epilogues.go:102:50:110:1 | zero-init:1 block statement | epilogues.go:103:2:103:19 | Before defer statement | | epilogues.go:103:2:103:19 | After defer statement | epilogues.go:104:2:106:2 | if statement | | epilogues.go:103:2:103:19 | Before defer statement | epilogues.go:103:8:103:19 | call to epiRecover | | epilogues.go:103:2:103:19 | defer statement | epilogues.go:103:2:103:19 | After defer statement | @@ -1280,9 +1280,9 @@ | exprs.go:49:1:54:1 | Normal Exit | exprs.go:49:1:54:1 | Exit | | exprs.go:49:1:54:1 | function declaration | exprs.go:49:1:54:1 | After function declaration | | exprs.go:49:10:49:11 | xs | exprs.go:49:30:54:1 | block statement | -| exprs.go:49:30:54:1 | block statement | exprs.go:49:30:54:1 | result-zero-init:0 block statement | +| exprs.go:49:30:54:1 | block statement | exprs.go:49:30:54:1 | zero-init:0 block statement | | exprs.go:49:30:54:1 | result-read:0 block statement | exprs.go:49:1:54:1 | Normal Exit | -| exprs.go:49:30:54:1 | result-zero-init:0 block statement | exprs.go:50:2:52:2 | for statement | +| exprs.go:49:30:54:1 | zero-init:0 block statement | exprs.go:50:2:52:2 | for statement | | exprs.go:50:2:52:2 | After for statement | exprs.go:53:2:53:7 | Before return statement | | exprs.go:50:2:52:2 | [LoopHeader] for statement | exprs.go:50:27:50:29 | Before increment statement | | exprs.go:50:2:52:2 | for statement | exprs.go:50:6:50:11 | ... := ... | @@ -2120,9 +2120,9 @@ | main.go:47:1:50:1 | Entry | main.go:47:25:50:1 | block statement | | main.go:47:1:50:1 | Normal Exit | main.go:47:1:50:1 | Exit | | main.go:47:1:50:1 | function declaration | main.go:47:1:50:1 | After function declaration | -| main.go:47:25:50:1 | block statement | main.go:47:25:50:1 | result-zero-init:0 block statement | +| main.go:47:25:50:1 | block statement | main.go:47:25:50:1 | zero-init:0 block statement | | main.go:47:25:50:1 | result-read:0 block statement | main.go:47:1:50:1 | Normal Exit | -| main.go:47:25:50:1 | result-zero-init:0 block statement | main.go:48:2:48:12 | ... = ... | +| main.go:47:25:50:1 | zero-init:0 block statement | main.go:48:2:48:12 | ... = ... | | main.go:48:2:48:12 | ... = ... | main.go:48:11:48:12 | Before 42 | | main.go:48:2:48:12 | After ... = ... | main.go:49:2:49:7 | Before return statement | | main.go:48:2:48:12 | assign:0 ... = ... | main.go:48:2:48:12 | After ... = ... | @@ -2136,9 +2136,9 @@ | main.go:52:1:54:1 | Entry | main.go:52:26:54:1 | block statement | | main.go:52:1:54:1 | Normal Exit | main.go:52:1:54:1 | Exit | | main.go:52:1:54:1 | function declaration | main.go:52:1:54:1 | After function declaration | -| main.go:52:26:54:1 | block statement | main.go:52:26:54:1 | result-zero-init:0 block statement | +| main.go:52:26:54:1 | block statement | main.go:52:26:54:1 | zero-init:0 block statement | | main.go:52:26:54:1 | result-read:0 block statement | main.go:52:1:54:1 | Normal Exit | -| main.go:52:26:54:1 | result-zero-init:0 block statement | main.go:53:2:53:7 | Before return statement | +| main.go:52:26:54:1 | zero-init:0 block statement | main.go:53:2:53:7 | Before return statement | | main.go:53:2:53:7 | Before return statement | main.go:53:2:53:7 | return statement | | main.go:53:2:53:7 | return statement | main.go:52:26:54:1 | result-read:0 block statement | | main.go:56:1:64:1 | After function declaration | main.go:66:1:90:1 | Before function declaration | @@ -2147,9 +2147,9 @@ | main.go:56:1:64:1 | Normal Exit | main.go:56:1:64:1 | Exit | | main.go:56:1:64:1 | function declaration | main.go:56:1:64:1 | After function declaration | | main.go:56:11:56:18 | selector | main.go:56:38:64:1 | block statement | -| main.go:56:38:64:1 | block statement | main.go:56:38:64:1 | result-zero-init:0 block statement | +| main.go:56:38:64:1 | block statement | main.go:56:38:64:1 | zero-init:0 block statement | | main.go:56:38:64:1 | result-read:0 block statement | main.go:56:1:64:1 | Normal Exit | -| main.go:56:38:64:1 | result-zero-init:0 block statement | main.go:57:2:57:11 | ... = ... | +| main.go:56:38:64:1 | zero-init:0 block statement | main.go:57:2:57:11 | ... = ... | | main.go:57:2:57:11 | ... = ... | main.go:57:11:57:11 | Before 0 | | main.go:57:2:57:11 | After ... = ... | main.go:58:2:62:2 | if statement | | main.go:57:2:57:11 | assign:0 ... = ... | main.go:57:2:57:11 | After ... = ... | @@ -2350,11 +2350,11 @@ | main.go:92:1:96:1 | Entry | main.go:92:36:96:1 | block statement | | main.go:92:1:96:1 | Normal Exit | main.go:92:1:96:1 | Exit | | main.go:92:1:96:1 | function declaration | main.go:92:1:96:1 | After function declaration | -| main.go:92:36:96:1 | block statement | main.go:92:36:96:1 | result-zero-init:0 block statement | +| main.go:92:36:96:1 | block statement | main.go:92:36:96:1 | zero-init:0 block statement | | main.go:92:36:96:1 | result-read:0 block statement | main.go:92:36:96:1 | result-read:1 block statement | | main.go:92:36:96:1 | result-read:1 block statement | main.go:92:1:96:1 | Normal Exit | -| main.go:92:36:96:1 | result-zero-init:0 block statement | main.go:92:36:96:1 | result-zero-init:1 block statement | -| main.go:92:36:96:1 | result-zero-init:1 block statement | main.go:93:2:93:8 | ... := ... | +| main.go:92:36:96:1 | zero-init:0 block statement | main.go:92:36:96:1 | zero-init:1 block statement | +| main.go:92:36:96:1 | zero-init:1 block statement | main.go:93:2:93:8 | ... := ... | | main.go:93:2:93:8 | ... := ... | main.go:93:7:93:8 | Before 23 | | main.go:93:2:93:8 | After ... := ... | main.go:94:2:94:15 | ... = ... | | main.go:93:2:93:8 | assign:0 ... := ... | main.go:93:2:93:8 | After ... := ... | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalFlowStep.expected b/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalFlowStep.expected index 193904c72e1e..a845c957a9f5 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalFlowStep.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalFlowStep.expected @@ -51,8 +51,8 @@ | main.go:46:44:52:1 | SSA def(keys) | main.go:49:3:49:6 | keys | | main.go:46:44:52:1 | SSA def(vals) | main.go:46:44:52:1 | result-read:1 block statement | | main.go:46:44:52:1 | SSA def(vals) | main.go:48:3:48:6 | vals | -| main.go:46:44:52:1 | result-zero-init:0 block statement | main.go:46:44:52:1 | SSA def(keys) | -| main.go:46:44:52:1 | result-zero-init:1 block statement | main.go:46:44:52:1 | SSA def(vals) | +| main.go:46:44:52:1 | zero-init:0 block statement | main.go:46:44:52:1 | SSA def(keys) | +| main.go:46:44:52:1 | zero-init:1 block statement | main.go:46:44:52:1 | SSA def(vals) | | main.go:47:2:50:2 | SSA def(k) | main.go:49:11:49:11 | k | | main.go:47:2:50:2 | SSA def(v) | main.go:48:11:48:11 | v | | main.go:47:2:50:2 | extract:0 range element | main.go:47:2:50:2 | SSA def(k) | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionOutput_getEntryNode.expected b/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionOutput_getEntryNode.expected index 5af08e798829..b95a3cda3f74 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionOutput_getEntryNode.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionOutput_getEntryNode.expected @@ -1,21 +1,21 @@ | result | main.go:5:1:11:1 | function declaration | main.go:7:10:7:14 | ...+... | | result | main.go:5:1:11:1 | function declaration | main.go:9:10:9:14 | ...-... | -| result | main.go:13:1:20:1 | function declaration | main.go:13:45:20:1 | result-zero-init:0 block statement | +| result | main.go:13:1:20:1 | function declaration | main.go:13:45:20:1 | zero-init:0 block statement | | result | main.go:13:1:20:1 | function declaration | main.go:15:9:15:13 | ...+... | | result | main.go:13:1:20:1 | function declaration | main.go:17:10:17:14 | ...-... | | result | main.go:26:1:29:1 | function declaration | main.go:28:9:28:15 | selection of count | | result | reset.go:8:1:16:1 | function declaration | reset.go:15:9:15:12 | sink | | result 0 | main.go:31:1:33:1 | function declaration | main.go:32:9:32:10 | 23 | -| result 0 | main.go:35:1:38:1 | function declaration | main.go:35:29:38:1 | result-zero-init:0 block statement | +| result 0 | main.go:35:1:38:1 | function declaration | main.go:35:29:38:1 | zero-init:0 block statement | | result 0 | main.go:35:1:38:1 | function declaration | main.go:36:13:36:14 | 23 | -| result 0 | main.go:40:1:48:1 | function declaration | main.go:40:33:48:1 | result-zero-init:0 block statement | +| result 0 | main.go:40:1:48:1 | function declaration | main.go:40:33:48:1 | zero-init:0 block statement | | result 0 | main.go:40:1:48:1 | function declaration | main.go:45:10:45:10 | 0 | | result 0 | main.go:40:1:48:1 | function declaration | main.go:47:9:47:9 | 0 | | result 0 | tst2.go:8:1:12:1 | function declaration | tst2.go:11:9:11:9 | w | | result 1 | main.go:31:1:33:1 | function declaration | main.go:32:13:32:14 | 42 | -| result 1 | main.go:35:1:38:1 | function declaration | main.go:35:29:38:1 | result-zero-init:1 block statement | +| result 1 | main.go:35:1:38:1 | function declaration | main.go:35:29:38:1 | zero-init:1 block statement | | result 1 | main.go:35:1:38:1 | function declaration | main.go:36:9:36:10 | 42 | -| result 1 | main.go:40:1:48:1 | function declaration | main.go:40:33:48:1 | result-zero-init:1 block statement | +| result 1 | main.go:40:1:48:1 | function declaration | main.go:40:33:48:1 | zero-init:1 block statement | | result 1 | main.go:40:1:48:1 | function declaration | main.go:42:3:42:5 | incdec-rhs increment statement | | result 1 | main.go:40:1:48:1 | function declaration | main.go:45:13:45:13 | 1 | | result 1 | main.go:40:1:48:1 | function declaration | main.go:47:12:47:12 | 4 | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/GlobalValueNumber.expected b/go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/GlobalValueNumber.expected index ded6eb10316c..228e8e629179 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/GlobalValueNumber.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/GlobalValueNumber.expected @@ -18,15 +18,15 @@ | main.go:19:10:19:24 | "Hello, world!" | main.go:19:10:19:24 | "Hello, world!" | | main.go:20:2:20:16 | call to Println | main.go:20:2:20:16 | call to Println | | main.go:23:23:26:1 | result-read:0 block statement | main.go:24:8:24:8 | 4 | -| main.go:23:23:26:1 | result-zero-init:0 block statement | main.go:10:7:10:7 | 0 | +| main.go:23:23:26:1 | zero-init:0 block statement | main.go:10:7:10:7 | 0 | | main.go:24:2:24:8 | SSA def(res) | main.go:24:8:24:8 | 4 | | main.go:24:8:24:8 | 4 | main.go:24:8:24:8 | 4 | | main.go:28:24:31:1 | result-read:0 block statement | main.go:30:9:30:9 | 6 | -| main.go:28:24:31:1 | result-zero-init:0 block statement | main.go:10:7:10:7 | 0 | +| main.go:28:24:31:1 | zero-init:0 block statement | main.go:10:7:10:7 | 0 | | main.go:29:8:29:8 | 5 | main.go:29:8:29:8 | 5 | | main.go:30:2:30:9 | SSA def(res) | main.go:30:9:30:9 | 6 | | main.go:30:9:30:9 | 6 | main.go:30:9:30:9 | 6 | -| main.go:33:24:39:1 | result-zero-init:0 block statement | main.go:10:7:10:7 | 0 | +| main.go:33:24:39:1 | zero-init:0 block statement | main.go:10:7:10:7 | 0 | | main.go:34:8:34:8 | 7 | main.go:34:8:34:8 | 7 | | main.go:35:8:37:4 | defer-invoke function call | main.go:35:8:37:4 | function call | | main.go:36:3:36:9 | SSA def(res) | main.go:36:9:36:9 | 8 | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarDefs.expected b/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarDefs.expected index c5cf617d7523..6d1529ba9dc4 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarDefs.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarDefs.expected @@ -10,9 +10,9 @@ | main.go:34:11:34:11 | x | main.go:34:11:34:11 | x | main.go:34:11:34:11 | x | | main.go:39:2:39:8 | assign:0 ... := ... | main.go:39:2:39:2 | x | main.go:39:7:39:8 | 23 | | main.go:40:2:40:10 | assign:0 ... := ... | main.go:40:2:40:4 | ptr | main.go:40:9:40:10 | &... | -| main.go:47:25:50:1 | result-zero-init:0 block statement | main.go:47:13:47:18 | result | main.go:47:25:50:1 | result-zero-init:0 block statement | +| main.go:47:25:50:1 | zero-init:0 block statement | main.go:47:13:47:18 | result | main.go:47:25:50:1 | zero-init:0 block statement | | main.go:48:2:48:12 | assign:0 ... = ... | main.go:47:13:47:18 | result | main.go:48:11:48:12 | 42 | -| main.go:52:26:54:1 | result-zero-init:0 block statement | main.go:52:14:52:19 | result | main.go:52:26:54:1 | result-zero-init:0 block statement | +| main.go:52:26:54:1 | zero-init:0 block statement | main.go:52:14:52:19 | result | main.go:52:26:54:1 | zero-init:0 block statement | | main.go:57:6:57:10 | zero-init:0 value declaration specifier | main.go:57:6:57:6 | x | main.go:57:6:57:10 | zero-init:0 value declaration specifier | | main.go:59:3:59:7 | assign:0 ... = ... | main.go:57:6:57:6 | x | main.go:59:7:59:7 | 2 | | main.go:63:2:63:7 | assign:0 ... := ... | main.go:63:2:63:2 | y | main.go:63:7:63:7 | 1 | @@ -23,8 +23,8 @@ | main.go:73:6:73:11 | assign:0 ... := ... | main.go:73:6:73:6 | i | main.go:73:11:73:11 | 0 | | main.go:73:16:73:18 | increment statement | main.go:73:6:73:6 | i | main.go:73:16:73:18 | incdec-rhs increment statement | | main.go:74:3:74:7 | assign:0 ... = ... | main.go:72:2:72:2 | z | main.go:74:7:74:7 | 2 | -| main.go:82:36:86:1 | result-zero-init:0 block statement | main.go:82:18:82:18 | a | main.go:82:36:86:1 | result-zero-init:0 block statement | -| main.go:82:36:86:1 | result-zero-init:1 block statement | main.go:82:25:82:25 | b | main.go:82:36:86:1 | result-zero-init:1 block statement | +| main.go:82:36:86:1 | zero-init:0 block statement | main.go:82:18:82:18 | a | main.go:82:36:86:1 | zero-init:0 block statement | +| main.go:82:36:86:1 | zero-init:1 block statement | main.go:82:25:82:25 | b | main.go:82:36:86:1 | zero-init:1 block statement | | main.go:83:2:83:8 | assign:0 ... := ... | main.go:83:2:83:2 | x | main.go:83:7:83:8 | 23 | | main.go:84:2:84:15 | assign:0 ... = ... | main.go:83:2:83:2 | x | main.go:84:9:84:12 | ...+... | | main.go:84:2:84:15 | assign:1 ... = ... | main.go:82:18:82:18 | a | main.go:84:15:84:15 | x | From cf6bf47286dac9e321848c25a2293d4e0df5a07e Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Sat, 11 Jul 2026 00:01:14 +0100 Subject: [PATCH 0990/2098] Simplify zero-init code after unifying result-zero-init --- .../go/controlflow/ControlFlowGraphShared.qll | 1 - go/ql/lib/semmle/go/controlflow/IR.qll | 29 +++++++------------ 2 files changed, 10 insertions(+), 20 deletions(-) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll index b3ee4f612c24..b25d2b709236 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll @@ -569,7 +569,6 @@ module CfgImpl { n = fd.getBody() and exists(fd.getBody()) and exists(fd.getResultVar(i)) and - exists(fd.getResultVar(i).(Go::ResultVariable).getFunction().getBody()) and tag = "zero-init:" + i.toString() ) or diff --git a/go/ql/lib/semmle/go/controlflow/IR.qll b/go/ql/lib/semmle/go/controlflow/IR.qll index c15764e38748..4f6ab88f5aa4 100644 --- a/go/ql/lib/semmle/go/controlflow/IR.qll +++ b/go/ql/lib/semmle/go/controlflow/IR.qll @@ -830,6 +830,9 @@ module IR { override Instruction getRhs() { result = this } + /** Gets the variable (a local or a named result) being zero-initialized. */ + ValueEntity getVariable() { result = v } + override Type getResultType() { result = v.getType() } override ControlFlow::Root getRoot() { result.isRootOf(v.getDeclaration()) } @@ -1133,14 +1136,12 @@ module IR { lhs = fd.getParameter(idx).getDeclaration() ) or - exists(FuncDef fd, int idx | - write.isAdditional(fd.getBody(), "zero-init:" + idx.toString()) and - lhs = fd.getResultVar(idx).getDeclaration() - ) - or - exists(ValueSpec spec, int idx | - write.isAdditional(spec, "zero-init:" + idx.toString()) and - lhs = spec.getNameExpr(idx) + // The `zero-init` node writes the variable it initializes: a named + // function result or a local declared without an initializer. + exists(int idx, AstNode an | write.isAdditional(an, "zero-init:" + idx.toString()) | + an = any(FuncDef fd | lhs = fd.getResultVar(idx).getDeclaration()).getBody() + or + an = any(ValueSpec spec | lhs = spec.getNameExpr(idx)) ) or // A tuple-destructuring `extract` node writes its component directly (see @@ -1416,17 +1417,7 @@ module IR { * Gets the instruction corresponding to the implicit initialization of `v` * to its zero value. */ - EvalImplicitInitInstruction implicitInitInstruction(ValueEntity v) { - exists(ValueSpec spec, int i | - spec.getNameExpr(i) = v.getDeclaration() and - result.isAdditional(spec, "zero-init:" + i.toString()) - ) - or - exists(FuncDef fd, int i | - fd.getResultVar(i) = v and - result.isAdditional(fd.getBody(), "zero-init:" + i.toString()) - ) - } + EvalImplicitInitInstruction implicitInitInstruction(ValueEntity v) { result.getVariable() = v } /** * Gets the instruction corresponding to the extraction of the `idx`th element From 8f90962ffcac51bed3f9ace21ccf02bf621b640c Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 10 Jul 2026 23:52:04 +0100 Subject: [PATCH 0991/2098] Unify incdec-rhs into the compound-rhs node kind --- .../go/controlflow/ControlFlowGraphShared.qll | 29 ++++---- go/ql/lib/semmle/go/controlflow/IR.qll | 72 +++++++------------ .../IntegerOverflow/RangeAnalysis.qll | 22 +++--- .../semmle/go/Scopes/EntityWrite.expected | 2 +- .../ControlFlowNode_getASuccessor.expected | 36 +++++----- .../dataflow/FlowSteps/LocalFlowStep.expected | 2 +- .../FunctionOutput_getEntryNode.expected | 2 +- .../semmle/go/dataflow/SSA/VarDefs.expected | 4 +- 8 files changed, 71 insertions(+), 98 deletions(-) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll index b25d2b709236..baa9ddd5772b 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll @@ -484,8 +484,6 @@ module CfgImpl { or n instanceof Go::SendStmt or - n instanceof Go::IncDecStmt - or n instanceof Go::FuncDecl } @@ -542,8 +540,10 @@ module CfgImpl { tag = "zero-init:" + i.toString() ) or - // Increment/decrement implicit right-hand side (the `operand + 1` value) - n instanceof Go::IncDecStmt and tag = "incdec-rhs" + // Increment/decrement: a single node computes `operand + 1` (or `- 1`) + // and writes it back, modelled the same as a compound assignment's + // `compound-rhs` node (see `IR::EvalCompoundAssignRhsInstruction`). + n instanceof Go::IncDecStmt and tag = "compound-rhs" or // Result write nodes in return statements exists(int i, Go::ReturnStmt ret | @@ -1217,26 +1217,23 @@ module CfgImpl { } /** - * Increment/decrement: operand → incdec-rhs → In(stmt) - * (IncDecStmt is in postOrInOrder, so In(stmt) is its evaluation point) + * Increment/decrement: operand → compound-rhs → After(stmt). * - * The implicit constant `1` operand of the `operand + 1` computation is - * modelled directly on the `incdec-rhs` instruction rather than as its own - * control-flow node. + * `x++` is modelled just like the compound assignment `x += 1`: a single + * `compound-rhs` node computes the updated value and writes it back to the + * operand (see `IR::EvalCompoundAssignRhsInstruction`). The implicit constant + * `1` is modelled directly on that node rather than as its own node. */ private predicate incDecStep(PreControlFlowNode n1, PreControlFlowNode n2) { exists(Go::IncDecStmt s | // Before → Before operand n1.isBefore(s) and n2.isBefore(s.getOperand()) or - // After operand → incdec-rhs - n1.isAfter(s.getOperand()) and n2.isAdditional(s, "incdec-rhs") - or - // incdec-rhs → In(stmt) (the assignment itself) - n1.isAdditional(s, "incdec-rhs") and n2.isIn(s) + // After operand → compound-rhs (the update value + write) + n1.isAfter(s.getOperand()) and n2.isAdditional(s, "compound-rhs") or - // In(stmt) → After(stmt) - n1.isIn(s) and n2.isAfter(s) + // compound-rhs → After(stmt) + n1.isAdditional(s, "compound-rhs") and n2.isAfter(s) ) } diff --git a/go/ql/lib/semmle/go/controlflow/IR.qll b/go/ql/lib/semmle/go/controlflow/IR.qll index 4f6ab88f5aa4..b2df80a7664d 100644 --- a/go/ql/lib/semmle/go/controlflow/IR.qll +++ b/go/ql/lib/semmle/go/controlflow/IR.qll @@ -201,11 +201,6 @@ module IR { or this instanceof ConditionGuardInstruction and result = "condition guard" or - this instanceof IncDecInstruction and result = "increment/decrement" - or - this instanceof EvalIncDecRhsInstruction and - result = "right-hand side of increment/decrement" - or this instanceof ReturnInstruction and result = "return" or this instanceof WriteResultInstruction and result = "result write" @@ -686,23 +681,36 @@ module IR { } /** - * An instruction that computes the (implicit) right-hand side of a compound assignment, - * such as the `x + y` in `x += y`, and writes the resulting value to the assignment's - * left-hand side. + * An instruction that computes the (implicit) right-hand side of a compound + * assignment (the `x + y` in `x += y`) or an increment/decrement (the + * `x + 1` in `x++`), and writes the resulting value to the left-hand side. */ class EvalCompoundAssignRhsInstruction extends WriteInstruction { - CompoundAssignStmt assgn; + AstNode s; + + EvalCompoundAssignRhsInstruction() { + this.isAdditional(s, "compound-rhs") and + (s instanceof CompoundAssignStmt or s instanceof IncDecStmt) + } - EvalCompoundAssignRhsInstruction() { this.isAdditional(assgn, "compound-rhs") } + /** Gets the corresponding compound assignment statement, if it is one. */ + CompoundAssignStmt getAssignment() { result = s } - /** Gets the corresponding compound assignment statement. */ - CompoundAssignStmt getAssignment() { result = assgn } + /** + * Gets the corresponding compound assignment (`x += y`) or increment/decrement + * (`x++`, `x--`) statement. + */ + AstNode getStmt() { result = s } override Instruction getRhs() { result = this } - override Type getResultType() { result = assgn.getRhs().getType() } + override Type getResultType() { + result = s.(CompoundAssignStmt).getRhs().getType() + or + result = s.(IncDecStmt).getOperand().getType() + } - override ControlFlow::Root getRoot() { result.isRootOf(assgn) } + override ControlFlow::Root getRoot() { result.isRootOf(s) } } /** An instruction extracting a component of a tuple value. */ @@ -892,36 +900,6 @@ module IR { override ControlFlow::Root getRoot() { result.isRootOf(go) } } - /** An instruction that corresponds to an increment or decrement statement. */ - class IncDecInstruction extends WriteInstruction { - IncDecStmt ids; - - IncDecInstruction() { this.isIn(ids) } - - override Instruction getRhs() { - result.(EvalIncDecRhsInstruction).isAdditional(ids, "incdec-rhs") - } - - override ControlFlow::Root getRoot() { result.isRootOf(ids) } - } - - /** - * An instruction that computes the (implicit) right-hand side of an increment or - * decrement statement. - */ - class EvalIncDecRhsInstruction extends Instruction { - IncDecStmt ids; - - EvalIncDecRhsInstruction() { this.isAdditional(ids, "incdec-rhs") } - - /** Gets the corresponding increment or decrement statement. */ - IncDecStmt getStmt() { result = ids } - - override Type getResultType() { result = ids.getOperand().getType() } - - override ControlFlow::Root getRoot() { result.isRootOf(ids) } - } - /** An instruction corresponding to a return from a function. */ class ReturnInstruction extends Instruction { ReturnStmt ret; @@ -1125,12 +1103,14 @@ module IR { ) ) or - exists(IncDecStmt ids | write.isIn(ids) | lhs = ids.getOperand().stripParens()) - or exists(CompoundAssignStmt ca | write.isAdditional(ca, "compound-rhs") | lhs = ca.getLhs().stripParens() ) or + exists(IncDecStmt ids | write.isAdditional(ids, "compound-rhs") | + lhs = ids.getOperand().stripParens() + ) + or exists(FuncDef fd, int idx | write.isBefore(fd.getParameter(idx).getDeclaration()) and lhs = fd.getParameter(idx).getDeclaration() diff --git a/go/ql/src/experimental/IntegerOverflow/RangeAnalysis.qll b/go/ql/src/experimental/IntegerOverflow/RangeAnalysis.qll index f3f4c15f0085..5a53342b8aff 100644 --- a/go/ql/src/experimental/IntegerOverflow/RangeAnalysis.qll +++ b/go/ql/src/experimental/IntegerOverflow/RangeAnalysis.qll @@ -389,12 +389,13 @@ float getAnSsaUpperBound(SsaDefinition def) { ) else //SSA definition corresponding to an `IncDecStmt` - if explicitDef.getInstruction() instanceof IR::IncDecInstruction + if + explicitDef.getInstruction().(IR::EvalCompoundAssignRhsInstruction).getStmt() instanceof + IncDecStmt then - exists(IncDecStmt incOrDec, IR::IncDecInstruction instr, float exprLB | - instr = explicitDef.getInstruction() and + exists(IncDecStmt incOrDec, float exprLB | + explicitDef.getInstruction().(IR::EvalCompoundAssignRhsInstruction).getStmt() = incOrDec and exprLB = getAnUpperBound(incOrDec.getOperand()) and - instr.getRhs().(IR::EvalIncDecRhsInstruction).getStmt() = incOrDec and ( //IncStmt(x++) exists(IncStmt inc | @@ -475,12 +476,13 @@ float getAnSsaLowerBound(SsaDefinition def) { ) else //IncDecStmt - if explicitDef.getInstruction() instanceof IR::IncDecInstruction + if + explicitDef.getInstruction().(IR::EvalCompoundAssignRhsInstruction).getStmt() instanceof + IncDecStmt then - exists(IncDecStmt incOrDec, IR::IncDecInstruction instr, float exprLB | - instr = explicitDef.getInstruction() and + exists(IncDecStmt incOrDec, float exprLB | + explicitDef.getInstruction().(IR::EvalCompoundAssignRhsInstruction).getStmt() = incOrDec and exprLB = getALowerBound(incOrDec.getOperand()) and - instr.getRhs().(IR::EvalIncDecRhsInstruction).getStmt() = incOrDec and ( //IncStmt(x++) exists(IncStmt inc | @@ -550,9 +552,7 @@ predicate ssaDependsOnSsa(SsaDefinition nextDef, SsaDefinition prevDef) { nextDef .(SsaExplicitDefinition) .getInstruction() - .(IR::IncDecInstruction) - .getRhs() - .(IR::EvalIncDecRhsInstruction) + .(IR::EvalCompoundAssignRhsInstruction) .getStmt() = incDec and ssaDependsOnExpr(prevDef, incDec.getOperand()) ) diff --git a/go/ql/test/library-tests/semmle/go/Scopes/EntityWrite.expected b/go/ql/test/library-tests/semmle/go/Scopes/EntityWrite.expected index ed3af2c6ddff..93d3a7f405db 100644 --- a/go/ql/test/library-tests/semmle/go/Scopes/EntityWrite.expected +++ b/go/ql/test/library-tests/semmle/go/Scopes/EntityWrite.expected @@ -1,4 +1,4 @@ -| main.go:6:2:6:2 | x | main.go:24:2:24:9 | increment statement | +| main.go:6:2:6:2 | x | main.go:24:2:24:9 | compound-rhs increment statement | | main.go:13:7:13:10 | recv | main.go:13:7:13:10 | recv | | main.go:17:10:17:10 | x | main.go:17:10:17:10 | x | | main.go:17:26:17:26 | y | main.go:17:26:17:26 | y | diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected index 2ea98f62c312..58a20e1e4d0f 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected @@ -1284,7 +1284,7 @@ | exprs.go:49:30:54:1 | result-read:0 block statement | exprs.go:49:1:54:1 | Normal Exit | | exprs.go:49:30:54:1 | zero-init:0 block statement | exprs.go:50:2:52:2 | for statement | | exprs.go:50:2:52:2 | After for statement | exprs.go:53:2:53:7 | Before return statement | -| exprs.go:50:2:52:2 | [LoopHeader] for statement | exprs.go:50:27:50:29 | Before increment statement | +| exprs.go:50:2:52:2 | [LoopHeader] for statement | exprs.go:50:27:50:29 | increment statement | | exprs.go:50:2:52:2 | for statement | exprs.go:50:6:50:11 | ... := ... | | exprs.go:50:6:50:11 | ... := ... | exprs.go:50:11:50:11 | Before 0 | | exprs.go:50:6:50:11 | After ... := ... | exprs.go:50:14:50:24 | Before ...<... | @@ -1309,13 +1309,12 @@ | exprs.go:50:22:50:23 | After xs | exprs.go:50:18:50:24 | call to len | | exprs.go:50:22:50:23 | Before xs | exprs.go:50:22:50:23 | xs | | exprs.go:50:22:50:23 | xs | exprs.go:50:22:50:23 | After xs | -| exprs.go:50:27:50:27 | After i | exprs.go:50:27:50:29 | incdec-rhs increment statement | +| exprs.go:50:27:50:27 | After i | exprs.go:50:27:50:29 | compound-rhs increment statement | | exprs.go:50:27:50:27 | Before i | exprs.go:50:27:50:27 | i | | exprs.go:50:27:50:27 | i | exprs.go:50:27:50:27 | After i | | exprs.go:50:27:50:29 | After increment statement | exprs.go:50:14:50:24 | Before ...<... | -| exprs.go:50:27:50:29 | Before increment statement | exprs.go:50:27:50:27 | Before i | -| exprs.go:50:27:50:29 | incdec-rhs increment statement | exprs.go:50:27:50:29 | increment statement | -| exprs.go:50:27:50:29 | increment statement | exprs.go:50:27:50:29 | After increment statement | +| exprs.go:50:27:50:29 | compound-rhs increment statement | exprs.go:50:27:50:29 | After increment statement | +| exprs.go:50:27:50:29 | increment statement | exprs.go:50:27:50:27 | Before i | | exprs.go:50:31:52:2 | After block statement | exprs.go:50:2:52:2 | [LoopHeader] for statement | | exprs.go:50:31:52:2 | block statement | exprs.go:51:3:51:14 | ... += ... | | exprs.go:51:3:51:5 | After res | exprs.go:51:10:51:14 | Before index expression | @@ -2240,7 +2239,7 @@ | main.go:73:7:73:7 | After 1 | main.go:73:2:73:7 | assign:0 ... := ... | | main.go:73:7:73:7 | Before 1 | main.go:73:7:73:7 | 1 | | main.go:74:2:79:2 | After for statement | main.go:80:2:80:13 | expression statement | -| main.go:74:2:79:2 | [LoopHeader] for statement | main.go:74:16:74:18 | Before increment statement | +| main.go:74:2:79:2 | [LoopHeader] for statement | main.go:74:16:74:18 | increment statement | | main.go:74:2:79:2 | for statement | main.go:74:6:74:11 | ... := ... | | main.go:74:6:74:11 | ... := ... | main.go:74:11:74:11 | Before 0 | | main.go:74:6:74:11 | After ... := ... | main.go:74:20:79:2 | block statement | @@ -2248,13 +2247,12 @@ | main.go:74:11:74:11 | 0 | main.go:74:11:74:11 | After 0 | | main.go:74:11:74:11 | After 0 | main.go:74:6:74:11 | assign:0 ... := ... | | main.go:74:11:74:11 | Before 0 | main.go:74:11:74:11 | 0 | -| main.go:74:16:74:16 | After i | main.go:74:16:74:18 | incdec-rhs increment statement | +| main.go:74:16:74:16 | After i | main.go:74:16:74:18 | compound-rhs increment statement | | main.go:74:16:74:16 | Before i | main.go:74:16:74:16 | i | | main.go:74:16:74:16 | i | main.go:74:16:74:16 | After i | | main.go:74:16:74:18 | After increment statement | main.go:74:20:79:2 | block statement | -| main.go:74:16:74:18 | Before increment statement | main.go:74:16:74:16 | Before i | -| main.go:74:16:74:18 | incdec-rhs increment statement | main.go:74:16:74:18 | increment statement | -| main.go:74:16:74:18 | increment statement | main.go:74:16:74:18 | After increment statement | +| main.go:74:16:74:18 | compound-rhs increment statement | main.go:74:16:74:18 | After increment statement | +| main.go:74:16:74:18 | increment statement | main.go:74:16:74:16 | Before i | | main.go:74:20:79:2 | After block statement | main.go:74:2:79:2 | [LoopHeader] for statement | | main.go:74:20:79:2 | block statement | main.go:75:3:77:3 | if statement | | main.go:75:3:77:3 | After if statement | main.go:78:3:78:7 | ... = ... | @@ -2296,7 +2294,7 @@ | main.go:82:7:82:7 | After 1 | main.go:82:2:82:7 | assign:0 ... := ... | | main.go:82:7:82:7 | Before 1 | main.go:82:7:82:7 | 1 | | main.go:83:2:88:2 | After for statement | main.go:89:2:89:13 | expression statement | -| main.go:83:2:88:2 | [LoopHeader] for statement | main.go:83:16:83:18 | Before increment statement | +| main.go:83:2:88:2 | [LoopHeader] for statement | main.go:83:16:83:18 | increment statement | | main.go:83:2:88:2 | for statement | main.go:83:6:83:11 | ... := ... | | main.go:83:6:83:11 | ... := ... | main.go:83:11:83:11 | Before 0 | | main.go:83:6:83:11 | After ... := ... | main.go:83:20:88:2 | block statement | @@ -2304,13 +2302,12 @@ | main.go:83:11:83:11 | 0 | main.go:83:11:83:11 | After 0 | | main.go:83:11:83:11 | After 0 | main.go:83:6:83:11 | assign:0 ... := ... | | main.go:83:11:83:11 | Before 0 | main.go:83:11:83:11 | 0 | -| main.go:83:16:83:16 | After i | main.go:83:16:83:18 | incdec-rhs increment statement | +| main.go:83:16:83:16 | After i | main.go:83:16:83:18 | compound-rhs increment statement | | main.go:83:16:83:16 | Before i | main.go:83:16:83:16 | i | | main.go:83:16:83:16 | i | main.go:83:16:83:16 | After i | | main.go:83:16:83:18 | After increment statement | main.go:83:20:88:2 | block statement | -| main.go:83:16:83:18 | Before increment statement | main.go:83:16:83:16 | Before i | -| main.go:83:16:83:18 | incdec-rhs increment statement | main.go:83:16:83:18 | increment statement | -| main.go:83:16:83:18 | increment statement | main.go:83:16:83:18 | After increment statement | +| main.go:83:16:83:18 | compound-rhs increment statement | main.go:83:16:83:18 | After increment statement | +| main.go:83:16:83:18 | increment statement | main.go:83:16:83:16 | Before i | | main.go:83:20:88:2 | After block statement | main.go:83:2:88:2 | [LoopHeader] for statement | | main.go:83:20:88:2 | block statement | main.go:84:3:84:7 | ... = ... | | main.go:84:3:84:7 | ... = ... | main.go:84:7:84:7 | Before 2 | @@ -3298,7 +3295,7 @@ | stmts.go:23:11:37:2 | After block statement | stmts.go:23:2:37:2 | [LoopHeader] for statement | | stmts.go:23:11:37:2 | block statement | stmts.go:24:3:36:3 | for statement | | stmts.go:24:3:36:3 | After for statement | stmts.go:23:11:37:2 | After block statement | -| stmts.go:24:3:36:3 | [LoopHeader] for statement | stmts.go:24:23:24:25 | Before increment statement | +| stmts.go:24:3:36:3 | [LoopHeader] for statement | stmts.go:24:23:24:25 | increment statement | | stmts.go:24:3:36:3 | for statement | stmts.go:24:7:24:12 | ... := ... | | stmts.go:24:7:24:12 | ... := ... | stmts.go:24:12:24:12 | Before 0 | | stmts.go:24:7:24:12 | After ... := ... | stmts.go:24:15:24:20 | Before ...<... | @@ -3317,13 +3314,12 @@ | stmts.go:24:19:24:20 | 10 | stmts.go:24:19:24:20 | After 10 | | stmts.go:24:19:24:20 | After 10 | stmts.go:24:15:24:20 | ...<... | | stmts.go:24:19:24:20 | Before 10 | stmts.go:24:19:24:20 | 10 | -| stmts.go:24:23:24:23 | After i | stmts.go:24:23:24:25 | incdec-rhs increment statement | +| stmts.go:24:23:24:23 | After i | stmts.go:24:23:24:25 | compound-rhs increment statement | | stmts.go:24:23:24:23 | Before i | stmts.go:24:23:24:23 | i | | stmts.go:24:23:24:23 | i | stmts.go:24:23:24:23 | After i | | stmts.go:24:23:24:25 | After increment statement | stmts.go:24:15:24:20 | Before ...<... | -| stmts.go:24:23:24:25 | Before increment statement | stmts.go:24:23:24:23 | Before i | -| stmts.go:24:23:24:25 | incdec-rhs increment statement | stmts.go:24:23:24:25 | increment statement | -| stmts.go:24:23:24:25 | increment statement | stmts.go:24:23:24:25 | After increment statement | +| stmts.go:24:23:24:25 | compound-rhs increment statement | stmts.go:24:23:24:25 | After increment statement | +| stmts.go:24:23:24:25 | increment statement | stmts.go:24:23:24:23 | Before i | | stmts.go:24:27:36:3 | block statement | stmts.go:25:4:35:4 | if statement | | stmts.go:25:4:35:4 | if statement | stmts.go:25:7:25:16 | ... := ... | | stmts.go:25:7:25:16 | ... := ... | stmts.go:25:12:25:16 | Before ...-... | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalFlowStep.expected b/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalFlowStep.expected index a845c957a9f5..e615561bc816 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalFlowStep.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalFlowStep.expected @@ -20,7 +20,7 @@ | main.go:15:9:15:9 | 0 | main.go:15:2:15:9 | SSA def(acc) | | main.go:16:9:19:2 | SSA def(acc) | main.go:17:3:17:5 | acc | | main.go:17:3:17:7 | SSA def(acc) | main.go:18:10:18:12 | acc | -| main.go:17:3:17:7 | incdec-rhs increment statement | main.go:17:3:17:7 | SSA def(acc) | +| main.go:17:3:17:7 | compound-rhs increment statement | main.go:17:3:17:7 | SSA def(acc) | | main.go:22:12:22:12 | SSA def(b) | main.go:23:5:23:5 | b | | main.go:22:12:22:12 | b | main.go:22:12:22:12 | SSA def(b) | | main.go:22:20:22:20 | SSA def(x) | main.go:24:10:24:10 | x | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionOutput_getEntryNode.expected b/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionOutput_getEntryNode.expected index b95a3cda3f74..6a386f44a9c0 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionOutput_getEntryNode.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionOutput_getEntryNode.expected @@ -16,7 +16,7 @@ | result 1 | main.go:35:1:38:1 | function declaration | main.go:35:29:38:1 | zero-init:1 block statement | | result 1 | main.go:35:1:38:1 | function declaration | main.go:36:9:36:10 | 42 | | result 1 | main.go:40:1:48:1 | function declaration | main.go:40:33:48:1 | zero-init:1 block statement | -| result 1 | main.go:40:1:48:1 | function declaration | main.go:42:3:42:5 | incdec-rhs increment statement | +| result 1 | main.go:40:1:48:1 | function declaration | main.go:42:3:42:5 | compound-rhs increment statement | | result 1 | main.go:40:1:48:1 | function declaration | main.go:45:13:45:13 | 1 | | result 1 | main.go:40:1:48:1 | function declaration | main.go:47:12:47:12 | 4 | | result 1 | tst2.go:8:1:12:1 | function declaration | tst2.go:11:12:11:14 | err | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarDefs.expected b/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarDefs.expected index 6d1529ba9dc4..155b0d602058 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarDefs.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarDefs.expected @@ -17,11 +17,11 @@ | main.go:59:3:59:7 | assign:0 ... = ... | main.go:57:6:57:6 | x | main.go:59:7:59:7 | 2 | | main.go:63:2:63:7 | assign:0 ... := ... | main.go:63:2:63:2 | y | main.go:63:7:63:7 | 1 | | main.go:64:6:64:11 | assign:0 ... := ... | main.go:64:6:64:6 | i | main.go:64:11:64:11 | 0 | -| main.go:64:16:64:18 | increment statement | main.go:64:6:64:6 | i | main.go:64:16:64:18 | incdec-rhs increment statement | +| main.go:64:16:64:18 | compound-rhs increment statement | main.go:64:6:64:6 | i | main.go:64:16:64:18 | compound-rhs increment statement | | main.go:68:3:68:7 | assign:0 ... = ... | main.go:63:2:63:2 | y | main.go:68:7:68:7 | 2 | | main.go:72:2:72:7 | assign:0 ... := ... | main.go:72:2:72:2 | z | main.go:72:7:72:7 | 1 | | main.go:73:6:73:11 | assign:0 ... := ... | main.go:73:6:73:6 | i | main.go:73:11:73:11 | 0 | -| main.go:73:16:73:18 | increment statement | main.go:73:6:73:6 | i | main.go:73:16:73:18 | incdec-rhs increment statement | +| main.go:73:16:73:18 | compound-rhs increment statement | main.go:73:6:73:6 | i | main.go:73:16:73:18 | compound-rhs increment statement | | main.go:74:3:74:7 | assign:0 ... = ... | main.go:72:2:72:2 | z | main.go:74:7:74:7 | 2 | | main.go:82:36:86:1 | zero-init:0 block statement | main.go:82:18:82:18 | a | main.go:82:36:86:1 | zero-init:0 block statement | | main.go:82:36:86:1 | zero-init:1 block statement | main.go:82:25:82:25 | b | main.go:82:36:86:1 | zero-init:1 block statement | From 59c55341b3543e0b322ea7b395107e45ff94efd8 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Mon, 13 Jul 2026 17:23:38 +0100 Subject: [PATCH 0992/2098] No CFG nodes for subexprs of const exprs In Go, sub-expressions of a constant expression are folded at compile time and never evaluated at runtime, so they shouldn't get evaluation nodes. --- .../go/controlflow/ControlFlowGraphShared.qll | 44 ++++++- go/ql/lib/semmle/go/controlflow/IR.qll | 14 ++- .../CONSISTENCY/CfgConsistency.expected | 12 +- .../ControlFlowNode_getASuccessor.expected | 115 ++---------------- .../GlobalValueNumber.expected | 4 +- 5 files changed, 62 insertions(+), 127 deletions(-) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll index baa9ddd5772b..fa0c01d17a7c 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll @@ -30,6 +30,21 @@ module CfgImpl { Input::implicitFieldSelection(e, index, implicitField) } + /** + * Holds if `root` is a constant root: a constant expression (with any + * enclosing parentheses stripped) whose parent expression is not itself + * constant. The strict sub-expressions of a constant root are folded at + * compile time and are not evaluated at run time, so they get no evaluation + * node; the constant root itself is evaluated as a single leaf value. + */ + private predicate constantRoot(Go::Expr root) { + exists(Go::Expr c | + c.isConst() and + not c.getParent().(Go::Expr).isConst() and + root = c.stripParens() + ) + } + /** Provides an implementation of the AST signature for Go. */ private module Ast implements CfgLib::AstSig { class AstNode = Go::AstNode; @@ -78,6 +93,10 @@ module CfgImpl { // the switch expression (see `Switch.getExpr`), so the wrapping // statement must not introduce its own assignment or expression nodes. e = any(Go::TypeSwitchStmt ts).getTest() + or + // The strict sub-expressions of a constant expression are not evaluated + // at run time, so they must not get their own evaluation nodes. + constantRoot(e.(Go::Expr).getParent+()) } AstNode getChild(AstNode n, int index) { @@ -345,9 +364,19 @@ module CfgImpl { class BinaryExpr = Go::BinaryExpr; - class LogicalAndExpr = Go::LandExpr; + // Constant short-circuiting operators are folded at compile time and their + // operands are not evaluated at run time, so they are not treated as + // logical operators here (which would give their operands their own + // evaluation nodes via `getLeftOperand`/`getRightOperand`/`getOperand`, + // bypassing `skipCfg`). Instead they are handled as constant-root leaf + // value nodes (see `postOrInOrder`). + class LogicalAndExpr extends Go::LandExpr { + LogicalAndExpr() { not this.isConst() } + } - class LogicalOrExpr = Go::LorExpr; + class LogicalOrExpr extends Go::LorExpr { + LogicalOrExpr() { not this.isConst() } + } class NullCoalescingExpr extends BinaryExpr { NullCoalescingExpr() { none() } @@ -355,7 +384,9 @@ module CfgImpl { class UnaryExpr = Go::UnaryExpr; - class LogicalNotExpr = Go::NotExpr; + class LogicalNotExpr extends Go::NotExpr { + LogicalNotExpr() { not this.isConst() } + } class BooleanLiteral extends Expr { boolean val; @@ -473,6 +504,13 @@ module CfgImpl { // needs an explicit in-order (allocation) node. n instanceof Go::CompositeLit or + // A constant expression is folded at compile time and its sub-expressions + // are not evaluated (they are pruned by `skipCfg`), so the constant root + // has no CFG children. It therefore needs an explicit in-order node to + // remain a single value-producing leaf (e.g. `unsafe.Sizeof(test())`, + // `1 << 10`, or `!d` for constant `d`). + constantRoot(n) + or // Statements/declarations that compute a value or perform an operation and // are not among the statements the shared library makes post-order by // default. diff --git a/go/ql/lib/semmle/go/controlflow/IR.qll b/go/ql/lib/semmle/go/controlflow/IR.qll index b2df80a7664d..13e6e5e84739 100644 --- a/go/ql/lib/semmle/go/controlflow/IR.qll +++ b/go/ql/lib/semmle/go/controlflow/IR.qll @@ -243,12 +243,16 @@ module IR { // `defer-invoke` node that models the call at function exit. this.isAdditional(e, "defer-invoke") or - // `NotExpr` and `LogicalBinaryExpr` are not in `postOrInOrder`, so they - // don't have an `isIn` node. Only use the after-node when the - // expression is not in a conditional context; otherwise the value is - // split across `TAfterValueNode`s per branch and should not be exposed - // as a single value-producing instruction. + // Non-constant `NotExpr` and `LogicalBinaryExpr` are not in + // `postOrInOrder`, so they don't have an `isIn` node; their value is + // produced by the after-node. (Constant ones are folded and get a leaf + // `isIn` node via `constRoot`, handled by the first disjunct above, so + // they are excluded here to avoid a duplicate value node.) Only use the + // after-node when the expression is not in a conditional context; + // otherwise the value is split across `TAfterValueNode`s per branch and + // should not be exposed as a single value-producing instruction. (e instanceof NotExpr or e instanceof LogicalBinaryExpr) and + not e.isConst() and not isInBooleanCondContext(e) and this.isAfter(e) } diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CONSISTENCY/CfgConsistency.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CONSISTENCY/CfgConsistency.expected index 200e3625d6ed..76635561eb92 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CONSISTENCY/CfgConsistency.expected @@ -1,23 +1,13 @@ consistencyOverview | deadEnd | 1 | -| multipleSuccessors | 20 | +| multipleSuccessors | 10 | deadEnd | stmts.go:61:2:61:10 | select statement | multipleSuccessors -| epilogues.go:61:2:61:38 | call to Println | successor | epilogues.go:60:8:60:33 | defer-invoke call to log | -| epilogues.go:61:2:61:38 | call to Println | successor | epilogues.go:61:2:61:38 | After call to Println | -| epilogues.go:70:2:70:20 | call to Println | successor | epilogues.go:69:8:69:25 | defer-invoke call to log | -| epilogues.go:70:2:70:20 | call to Println | successor | epilogues.go:70:2:70:20 | After call to Println | -| epilogues.go:81:2:81:23 | call to Println | successor | epilogues.go:78:8:80:15 | defer-invoke function call | -| epilogues.go:81:2:81:23 | call to Println | successor | epilogues.go:81:2:81:23 | After call to Println | | stmts2.go:16:2:26:2 | select statement | successor | stmts2.go:17:2:17:15 | comm clause | | stmts2.go:16:2:26:2 | select statement | successor | stmts2.go:18:2:19:10 | comm clause | | stmts2.go:16:2:26:2 | select statement | successor | stmts2.go:20:2:24:10 | comm clause | | stmts2.go:16:2:26:2 | select statement | successor | stmts2.go:25:2:25:18 | comm clause | -| stmts7.go:29:2:29:31 | call to Println | successor | stmts7.go:28:8:28:23 | defer-invoke call to fn | -| stmts7.go:29:2:29:31 | call to Println | successor | stmts7.go:29:2:29:31 | After call to Println | -| stmts7.go:54:6:54:18 | index expression | successor | stmts7.go:53:8:53:21 | defer-invoke call to recoverPanic | -| stmts7.go:54:6:54:18 | index expression | successor | stmts7.go:54:6:54:18 | After index expression | | stmts.go:50:2:59:2 | select statement | successor | stmts.go:51:2:52:31 | comm clause | | stmts.go:50:2:59:2 | select statement | successor | stmts.go:53:2:55:16 | comm clause | | stmts.go:50:2:59:2 | select statement | successor | stmts.go:56:2:57:15 | comm clause | diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected index 58a20e1e4d0f..518094ea2883 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected @@ -557,10 +557,7 @@ | epilogues.go:90:4:90:14 | assign:0 ... = ... | epilogues.go:90:4:90:14 | After ... = ... | | epilogues.go:90:13:90:14 | -... | epilogues.go:90:13:90:14 | After -... | | epilogues.go:90:13:90:14 | After -... | epilogues.go:90:4:90:14 | assign:0 ... = ... | -| epilogues.go:90:13:90:14 | Before -... | epilogues.go:90:14:90:14 | Before 1 | -| epilogues.go:90:14:90:14 | 1 | epilogues.go:90:14:90:14 | After 1 | -| epilogues.go:90:14:90:14 | After 1 | epilogues.go:90:13:90:14 | -... | -| epilogues.go:90:14:90:14 | Before 1 | epilogues.go:90:14:90:14 | 1 | +| epilogues.go:90:13:90:14 | Before -... | epilogues.go:90:13:90:14 | -... | | epilogues.go:93:2:95:2 | After if statement | epilogues.go:96:2:96:15 | ... = ... | | epilogues.go:93:2:95:2 | if statement | epilogues.go:93:5:93:9 | Before ...<... | | epilogues.go:93:5:93:5 | After x | epilogues.go:93:9:93:9 | Before 0 | @@ -814,23 +811,9 @@ | exprs.go:6:13:6:13 | 0 | exprs.go:6:13:6:13 | After 0 | | exprs.go:6:13:6:13 | After 0 | exprs.go:6:16:6:26 | Before ...+... | | exprs.go:6:13:6:13 | Before 0 | exprs.go:6:13:6:13 | 0 | -| exprs.go:6:16:6:16 | 1 | exprs.go:6:16:6:16 | After 1 | -| exprs.go:6:16:6:16 | After 1 | exprs.go:6:20:6:26 | (...) | -| exprs.go:6:16:6:16 | Before 1 | exprs.go:6:16:6:16 | 1 | | exprs.go:6:16:6:26 | ...+... | exprs.go:6:16:6:26 | After ...+... | | exprs.go:6:16:6:26 | After ...+... | exprs.go:6:6:6:26 | assign:0 value declaration specifier | -| exprs.go:6:16:6:26 | Before ...+... | exprs.go:6:16:6:16 | Before 1 | -| exprs.go:6:20:6:26 | (...) | exprs.go:6:21:6:25 | Before ...+... | -| exprs.go:6:20:6:26 | After (...) | exprs.go:6:16:6:26 | ...+... | -| exprs.go:6:21:6:21 | 2 | exprs.go:6:21:6:21 | After 2 | -| exprs.go:6:21:6:21 | After 2 | exprs.go:6:25:6:25 | Before 3 | -| exprs.go:6:21:6:21 | Before 2 | exprs.go:6:21:6:21 | 2 | -| exprs.go:6:21:6:25 | ...+... | exprs.go:6:21:6:25 | After ...+... | -| exprs.go:6:21:6:25 | After ...+... | exprs.go:6:20:6:26 | After (...) | -| exprs.go:6:21:6:25 | Before ...+... | exprs.go:6:21:6:21 | Before 2 | -| exprs.go:6:25:6:25 | 3 | exprs.go:6:25:6:25 | After 3 | -| exprs.go:6:25:6:25 | After 3 | exprs.go:6:21:6:25 | ...+... | -| exprs.go:6:25:6:25 | Before 3 | exprs.go:6:25:6:25 | 3 | +| exprs.go:6:16:6:26 | Before ...+... | exprs.go:6:16:6:26 | ...+... | | exprs.go:7:2:7:16 | After declaration statement | exprs.go:8:2:8:24 | ... := ... | | exprs.go:7:2:7:16 | After variable declaration | exprs.go:7:2:7:16 | After declaration statement | | exprs.go:7:2:7:16 | declaration statement | exprs.go:7:2:7:16 | variable declaration | @@ -930,15 +913,9 @@ | exprs.go:14:13:14:13 | After j | exprs.go:14:16:14:19 | Before .../... | | exprs.go:14:13:14:13 | Before j | exprs.go:14:13:14:13 | j | | exprs.go:14:13:14:13 | j | exprs.go:14:13:14:13 | After j | -| exprs.go:14:16:14:16 | 3 | exprs.go:14:16:14:16 | After 3 | -| exprs.go:14:16:14:16 | After 3 | exprs.go:14:18:14:19 | Before 14 | -| exprs.go:14:16:14:16 | Before 3 | exprs.go:14:16:14:16 | 3 | | exprs.go:14:16:14:19 | .../... | exprs.go:14:16:14:19 | After .../... | | exprs.go:14:16:14:19 | After .../... | exprs.go:14:7:14:20 | call to fn | -| exprs.go:14:16:14:19 | Before .../... | exprs.go:14:16:14:16 | Before 3 | -| exprs.go:14:18:14:19 | 14 | exprs.go:14:18:14:19 | After 14 | -| exprs.go:14:18:14:19 | After 14 | exprs.go:14:16:14:19 | .../... | -| exprs.go:14:18:14:19 | Before 14 | exprs.go:14:18:14:19 | 14 | +| exprs.go:14:16:14:19 | Before .../... | exprs.go:14:16:14:19 | .../... | | exprs.go:15:2:15:58 | ... := ... | exprs.go:15:13:15:58 | Before struct literal | | exprs.go:15:2:15:58 | After ... := ... | exprs.go:16:2:16:26 | ... := ... | | exprs.go:15:2:15:58 | assign:0 ... := ... | exprs.go:15:2:15:58 | After ... := ... | @@ -1214,10 +1191,7 @@ | exprs.go:36:2:36:10 | return statement | exprs.go:32:1:37:1 | Normal Exit | | exprs.go:36:9:36:10 | -... | exprs.go:36:9:36:10 | After -... | | exprs.go:36:9:36:10 | After -... | exprs.go:36:2:36:10 | return statement | -| exprs.go:36:9:36:10 | Before -... | exprs.go:36:10:36:10 | Before 1 | -| exprs.go:36:10:36:10 | 1 | exprs.go:36:10:36:10 | After 1 | -| exprs.go:36:10:36:10 | After 1 | exprs.go:36:9:36:10 | -... | -| exprs.go:36:10:36:10 | Before 1 | exprs.go:36:10:36:10 | 1 | +| exprs.go:36:9:36:10 | Before -... | exprs.go:36:9:36:10 | -... | | exprs.go:39:1:47:1 | After function declaration | exprs.go:49:1:54:1 | Before function declaration | | exprs.go:39:1:47:1 | Before function declaration | exprs.go:39:1:47:1 | function declaration | | exprs.go:39:1:47:1 | Entry | exprs.go:39:12:39:14 | arg | @@ -1269,10 +1243,7 @@ | exprs.go:46:2:46:10 | return statement | exprs.go:39:1:47:1 | Normal Exit | | exprs.go:46:9:46:10 | -... | exprs.go:46:9:46:10 | After -... | | exprs.go:46:9:46:10 | After -... | exprs.go:46:2:46:10 | return statement | -| exprs.go:46:9:46:10 | Before -... | exprs.go:46:10:46:10 | Before 1 | -| exprs.go:46:10:46:10 | 1 | exprs.go:46:10:46:10 | After 1 | -| exprs.go:46:10:46:10 | After 1 | exprs.go:46:9:46:10 | -... | -| exprs.go:46:10:46:10 | Before 1 | exprs.go:46:10:46:10 | 1 | +| exprs.go:46:9:46:10 | Before -... | exprs.go:46:9:46:10 | -... | | exprs.go:49:1:54:1 | After function declaration | exprs.go:56:1:58:1 | Before function declaration | | exprs.go:49:1:54:1 | Before function declaration | exprs.go:49:1:54:1 | function declaration | | exprs.go:49:1:54:1 | Entry | exprs.go:49:10:49:11 | xs | @@ -1561,19 +1532,13 @@ | exprs.go:91:9:91:25 | After slice literal | exprs.go:91:5:91:25 | assign:0 value declaration specifier | | exprs.go:91:9:91:25 | Before slice literal | exprs.go:91:9:91:25 | slice literal | | exprs.go:91:9:91:25 | slice literal | exprs.go:91:15:91:24 | Before key-value pair | -| exprs.go:91:15:91:15 | 0 | exprs.go:91:15:91:15 | After 0 | -| exprs.go:91:15:91:15 | After 0 | exprs.go:91:19:91:21 | Before one | -| exprs.go:91:15:91:15 | Before 0 | exprs.go:91:15:91:15 | 0 | | exprs.go:91:15:91:21 | ...+... | exprs.go:91:15:91:21 | After ...+... | | exprs.go:91:15:91:21 | After ...+... | exprs.go:91:24:91:24 | Before 2 | -| exprs.go:91:15:91:21 | Before ...+... | exprs.go:91:15:91:15 | Before 0 | +| exprs.go:91:15:91:21 | Before ...+... | exprs.go:91:15:91:21 | ...+... | | exprs.go:91:15:91:24 | After key-value pair | exprs.go:91:15:91:24 | lit-init key-value pair | | exprs.go:91:15:91:24 | Before key-value pair | exprs.go:91:15:91:21 | Before ...+... | | exprs.go:91:15:91:24 | key-value pair | exprs.go:91:15:91:24 | After key-value pair | | exprs.go:91:15:91:24 | lit-init key-value pair | exprs.go:91:9:91:25 | After slice literal | -| exprs.go:91:19:91:21 | After one | exprs.go:91:15:91:21 | ...+... | -| exprs.go:91:19:91:21 | Before one | exprs.go:91:19:91:21 | one | -| exprs.go:91:19:91:21 | one | exprs.go:91:19:91:21 | After one | | exprs.go:91:24:91:24 | 2 | exprs.go:91:24:91:24 | After 2 | | exprs.go:91:24:91:24 | After 2 | exprs.go:91:15:91:24 | key-value pair | | exprs.go:91:24:91:24 | Before 2 | exprs.go:91:24:91:24 | 2 | @@ -2774,21 +2739,9 @@ | stmts3.go:9:3:9:6 | zero-init:0 value declaration specifier | stmts3.go:9:3:9:6 | After value declaration specifier | | stmts3.go:11:2:11:26 | Before return statement | stmts3.go:11:9:11:26 | Before ...-... | | stmts3.go:11:2:11:26 | return statement | stmts3.go:5:1:12:1 | Normal Exit | -| stmts3.go:11:9:11:11 | After red | stmts3.go:11:15:11:19 | Before green | -| stmts3.go:11:9:11:11 | Before red | stmts3.go:11:9:11:11 | red | -| stmts3.go:11:9:11:11 | red | stmts3.go:11:9:11:11 | After red | -| stmts3.go:11:9:11:19 | ...+... | stmts3.go:11:9:11:19 | After ...+... | -| stmts3.go:11:9:11:19 | After ...+... | stmts3.go:11:23:11:26 | Before blue | -| stmts3.go:11:9:11:19 | Before ...+... | stmts3.go:11:9:11:11 | Before red | | stmts3.go:11:9:11:26 | ...-... | stmts3.go:11:9:11:26 | After ...-... | | stmts3.go:11:9:11:26 | After ...-... | stmts3.go:11:2:11:26 | return statement | -| stmts3.go:11:9:11:26 | Before ...-... | stmts3.go:11:9:11:19 | Before ...+... | -| stmts3.go:11:15:11:19 | After green | stmts3.go:11:9:11:19 | ...+... | -| stmts3.go:11:15:11:19 | Before green | stmts3.go:11:15:11:19 | green | -| stmts3.go:11:15:11:19 | green | stmts3.go:11:15:11:19 | After green | -| stmts3.go:11:23:11:26 | After blue | stmts3.go:11:9:11:26 | ...-... | -| stmts3.go:11:23:11:26 | Before blue | stmts3.go:11:23:11:26 | blue | -| stmts3.go:11:23:11:26 | blue | stmts3.go:11:23:11:26 | After blue | +| stmts3.go:11:9:11:26 | Before ...-... | stmts3.go:11:9:11:26 | ...-... | | stmts3.go:14:1:16:1 | After function declaration | stmts3.go:18:1:20:1 | Before function declaration | | stmts3.go:14:1:16:1 | Before function declaration | stmts3.go:14:1:16:1 | function declaration | | stmts3.go:14:1:16:1 | Entry | stmts3.go:14:13:14:13 | x | @@ -3715,17 +3668,11 @@ | stmts.go:94:2:95:13 | After case clause [match] | stmts.go:95:3:95:13 | expression statement | | stmts.go:94:2:95:13 | After case clause [no-match] | stmts.go:90:2:96:2 | After expression-switch statement | | stmts.go:94:2:95:13 | case clause | stmts.go:94:7:94:11 | Before ...-... | -| stmts.go:94:7:94:7 | 2 | stmts.go:94:7:94:7 | After 2 | -| stmts.go:94:7:94:7 | After 2 | stmts.go:94:11:94:11 | Before 5 | -| stmts.go:94:7:94:7 | Before 2 | stmts.go:94:7:94:7 | 2 | | stmts.go:94:7:94:11 | ...-... | stmts.go:94:7:94:11 | After ...-... [match] | | stmts.go:94:7:94:11 | ...-... | stmts.go:94:7:94:11 | After ...-... [no-match] | | stmts.go:94:7:94:11 | After ...-... [match] | stmts.go:94:2:95:13 | After case clause [match] | | stmts.go:94:7:94:11 | After ...-... [no-match] | stmts.go:94:2:95:13 | After case clause [no-match] | -| stmts.go:94:7:94:11 | Before ...-... | stmts.go:94:7:94:7 | Before 2 | -| stmts.go:94:11:94:11 | 5 | stmts.go:94:11:94:11 | After 5 | -| stmts.go:94:11:94:11 | After 5 | stmts.go:94:7:94:11 | ...-... | -| stmts.go:94:11:94:11 | Before 5 | stmts.go:94:11:94:11 | 5 | +| stmts.go:94:7:94:11 | Before ...-... | stmts.go:94:7:94:11 | ...-... | | stmts.go:95:3:95:7 | After test5 | stmts.go:95:9:95:12 | Before true | | stmts.go:95:3:95:7 | Before test5 | stmts.go:95:3:95:7 | test5 | | stmts.go:95:3:95:7 | test5 | stmts.go:95:3:95:7 | After test5 | @@ -4152,27 +4099,9 @@ | tst.go:16:7:16:33 | After ...<... [match] | tst.go:16:2:16:34 | After case clause [match] | | tst.go:16:7:16:33 | After ...<... [no-match] | tst.go:16:2:16:34 | After case clause [no-match] | | tst.go:16:7:16:33 | Before ...<... | tst.go:16:7:16:11 | Before value | -| tst.go:16:15:16:18 | 1024 | tst.go:16:15:16:18 | After 1024 | -| tst.go:16:15:16:18 | After 1024 | tst.go:16:20:16:23 | Before 1024 | -| tst.go:16:15:16:18 | Before 1024 | tst.go:16:15:16:18 | 1024 | -| tst.go:16:15:16:23 | ...*... | tst.go:16:15:16:23 | After ...*... | -| tst.go:16:15:16:23 | After ...*... | tst.go:16:25:16:28 | Before 1024 | -| tst.go:16:15:16:23 | Before ...*... | tst.go:16:15:16:18 | Before 1024 | -| tst.go:16:15:16:28 | ...*... | tst.go:16:15:16:28 | After ...*... | -| tst.go:16:15:16:28 | After ...*... | tst.go:16:30:16:33 | Before 1024 | -| tst.go:16:15:16:28 | Before ...*... | tst.go:16:15:16:23 | Before ...*... | | tst.go:16:15:16:33 | ...*... | tst.go:16:15:16:33 | After ...*... | | tst.go:16:15:16:33 | After ...*... | tst.go:16:7:16:33 | ...<... | -| tst.go:16:15:16:33 | Before ...*... | tst.go:16:15:16:28 | Before ...*... | -| tst.go:16:20:16:23 | 1024 | tst.go:16:20:16:23 | After 1024 | -| tst.go:16:20:16:23 | After 1024 | tst.go:16:15:16:23 | ...*... | -| tst.go:16:20:16:23 | Before 1024 | tst.go:16:20:16:23 | 1024 | -| tst.go:16:25:16:28 | 1024 | tst.go:16:25:16:28 | After 1024 | -| tst.go:16:25:16:28 | After 1024 | tst.go:16:15:16:28 | ...*... | -| tst.go:16:25:16:28 | Before 1024 | tst.go:16:25:16:28 | 1024 | -| tst.go:16:30:16:33 | 1024 | tst.go:16:30:16:33 | After 1024 | -| tst.go:16:30:16:33 | After 1024 | tst.go:16:15:16:33 | ...*... | -| tst.go:16:30:16:33 | Before 1024 | tst.go:16:30:16:33 | 1024 | +| tst.go:16:15:16:33 | Before ...*... | tst.go:16:15:16:33 | ...*... | | tst.go:18:2:18:39 | After case clause [match] | tst.go:15:2:20:2 | After expression-switch statement | | tst.go:18:2:18:39 | After case clause [no-match] | tst.go:15:2:20:2 | After expression-switch statement | | tst.go:18:2:18:39 | case clause | tst.go:18:7:18:38 | Before ...<... | @@ -4184,33 +4113,9 @@ | tst.go:18:7:18:38 | After ...<... [match] | tst.go:18:2:18:39 | After case clause [match] | | tst.go:18:7:18:38 | After ...<... [no-match] | tst.go:18:2:18:39 | After case clause [no-match] | | tst.go:18:7:18:38 | Before ...<... | tst.go:18:7:18:11 | Before value | -| tst.go:18:15:18:18 | 1024 | tst.go:18:15:18:18 | After 1024 | -| tst.go:18:15:18:18 | After 1024 | tst.go:18:20:18:23 | Before 1024 | -| tst.go:18:15:18:18 | Before 1024 | tst.go:18:15:18:18 | 1024 | -| tst.go:18:15:18:23 | ...*... | tst.go:18:15:18:23 | After ...*... | -| tst.go:18:15:18:23 | After ...*... | tst.go:18:25:18:28 | Before 1024 | -| tst.go:18:15:18:23 | Before ...*... | tst.go:18:15:18:18 | Before 1024 | -| tst.go:18:15:18:28 | ...*... | tst.go:18:15:18:28 | After ...*... | -| tst.go:18:15:18:28 | After ...*... | tst.go:18:30:18:33 | Before 1024 | -| tst.go:18:15:18:28 | Before ...*... | tst.go:18:15:18:23 | Before ...*... | -| tst.go:18:15:18:33 | ...*... | tst.go:18:15:18:33 | After ...*... | -| tst.go:18:15:18:33 | After ...*... | tst.go:18:35:18:38 | Before 1024 | -| tst.go:18:15:18:33 | Before ...*... | tst.go:18:15:18:28 | Before ...*... | | tst.go:18:15:18:38 | ...*... | tst.go:18:15:18:38 | After ...*... | | tst.go:18:15:18:38 | After ...*... | tst.go:18:7:18:38 | ...<... | -| tst.go:18:15:18:38 | Before ...*... | tst.go:18:15:18:33 | Before ...*... | -| tst.go:18:20:18:23 | 1024 | tst.go:18:20:18:23 | After 1024 | -| tst.go:18:20:18:23 | After 1024 | tst.go:18:15:18:23 | ...*... | -| tst.go:18:20:18:23 | Before 1024 | tst.go:18:20:18:23 | 1024 | -| tst.go:18:25:18:28 | 1024 | tst.go:18:25:18:28 | After 1024 | -| tst.go:18:25:18:28 | After 1024 | tst.go:18:15:18:28 | ...*... | -| tst.go:18:25:18:28 | Before 1024 | tst.go:18:25:18:28 | 1024 | -| tst.go:18:30:18:33 | 1024 | tst.go:18:30:18:33 | After 1024 | -| tst.go:18:30:18:33 | After 1024 | tst.go:18:15:18:33 | ...*... | -| tst.go:18:30:18:33 | Before 1024 | tst.go:18:30:18:33 | 1024 | -| tst.go:18:35:18:38 | 1024 | tst.go:18:35:18:38 | After 1024 | -| tst.go:18:35:18:38 | After 1024 | tst.go:18:15:18:38 | ...*... | -| tst.go:18:35:18:38 | Before 1024 | tst.go:18:35:18:38 | 1024 | +| tst.go:18:15:18:38 | Before ...*... | tst.go:18:15:18:38 | ...*... | | tst.go:23:1:26:1 | After function declaration | tst.go:28:1:32:1 | Before function declaration | | tst.go:23:1:26:1 | Before function declaration | tst.go:23:1:26:1 | function declaration | | tst.go:23:1:26:1 | Entry | tst.go:23:15:26:1 | block statement | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/GlobalValueNumber.expected b/go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/GlobalValueNumber.expected index 228e8e629179..b8d5333c8411 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/GlobalValueNumber.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/GlobalValueNumber.expected @@ -34,10 +34,8 @@ | main.go:38:2:38:9 | SSA def(res) | main.go:38:9:38:9 | 9 | | main.go:38:9:38:9 | 9 | main.go:38:9:38:9 | 9 | | regressions.go:5:11:5:31 | call to Sizeof | regressions.go:5:11:5:31 | call to Sizeof | -| regressions.go:5:25:5:30 | call to test | regressions.go:5:25:5:30 | call to test | | regressions.go:7:11:7:15 | false | regressions.go:7:11:7:15 | false | -| regressions.go:9:11:9:12 | After !... | regressions.go:11:11:11:14 | true | -| regressions.go:9:12:9:12 | d | regressions.go:7:11:7:15 | false | +| regressions.go:9:11:9:12 | !... | regressions.go:11:11:11:14 | true | | regressions.go:11:11:11:14 | true | regressions.go:11:11:11:14 | true | | regressions.go:30:9:30:22 | call to getPayload | regressions.go:30:9:30:22 | call to getPayload | | regressions.go:30:26:30:39 | call to getPayload | regressions.go:30:26:30:39 | call to getPayload | From 9b523f2b654d1892633ee57a91d42f8f081310b7 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 13 Aug 2026 15:54:13 +0100 Subject: [PATCH 0993/2098] Add change note --- go/ql/lib/change-notes/2026-08-13-cfg.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 go/ql/lib/change-notes/2026-08-13-cfg.md diff --git a/go/ql/lib/change-notes/2026-08-13-cfg.md b/go/ql/lib/change-notes/2026-08-13-cfg.md new file mode 100644 index 000000000000..46a7c60828f9 --- /dev/null +++ b/go/ql/lib/change-notes/2026-08-13-cfg.md @@ -0,0 +1,23 @@ +--- +category: breaking +--- +* The Go control flow graph (CFG) implementation has been completely rewritten + to use the shared CFG library. The CFG now includes additional nodes to more + accurately represent certain constructs, including assignments, function + parameters and results, range statements, and deferred calls. The CFG now + only includes nodes that are reachable from the entry point. Basic blocks are + also now constructed directly from the shared CFG. Existing code that relies + on specific CFG nodes, edges, locations, textual representations, or basic + block boundaries may need to be updated. Additionally, the following API + changes have been made: + - `BasicBlocks::Cfg` has been removed. `BasicBlock` now directly uses the + basic-block implementation provided by the shared CFG library. + - `ControlFlow::EntryNode` and `ControlFlow::ExitNode` have been added, and + `ControlFlow::entryNode` and `ControlFlow::exitNode` now return these more + specific types. + - Several IR instruction classes have been removed or consolidated, including + `ReadArgumentInstruction`, `InitResultInstruction`, `IncDecInstruction`, + `EvalIncDecRhsInstruction`, `EvalImplicitOneInstruction`, + `SelectInstruction`, and `SendInstruction`. + - `EvalCompoundAssignRhsInstruction` and `EvalImplicitInitInstruction` now + directly represent their associated writes. From 6df859532e3bc7bf32349fb4e0627c00acc150c6 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Tue, 18 Aug 2026 13:06:26 +0100 Subject: [PATCH 0994/2098] Replace IfStmt.getCond with IfStmt.getCondition --- go/ql/lib/semmle/go/Stmt.qll | 7 +++++-- go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll | 2 +- go/ql/lib/semmle/go/controlflow/IR.qll | 2 +- go/ql/src/RedundantCode/DuplicateBranches.ql | 2 +- go/ql/src/RedundantCode/DuplicateCondition.ql | 2 +- go/ql/src/RedundantCode/UnreachableStatement.ql | 2 +- go/ql/src/experimental/CWE-942/CorsMisconfiguration.ql | 4 ++-- 7 files changed, 12 insertions(+), 9 deletions(-) diff --git a/go/ql/lib/semmle/go/Stmt.qll b/go/ql/lib/semmle/go/Stmt.qll index 82152db980db..566c2cc26875 100644 --- a/go/ql/lib/semmle/go/Stmt.qll +++ b/go/ql/lib/semmle/go/Stmt.qll @@ -710,8 +710,11 @@ class IfStmt extends @ifstmt, Stmt, ScopeNode { /** Gets the init statement of this `if` statement, if any. */ Stmt getInit() { result = this.getChildStmt(0) } + /** DEPRECATED: Use `getCondition` instead. */ + deprecated Expr getCond() { result = this.getCondition() } + /** Gets the condition of this `if` statement. */ - Expr getCond() { result = this.getChildExpr(1) } + Expr getCondition() { result = this.getChildExpr(1) } /** Gets the "then" branch of this `if` statement. */ BlockStmt getThen() { result = this.getChildStmt(2) } @@ -721,7 +724,7 @@ class IfStmt extends @ifstmt, Stmt, ScopeNode { override predicate mayHaveSideEffects() { this.getInit().mayHaveSideEffects() or - this.getCond().mayHaveSideEffects() or + this.getCondition().mayHaveSideEffects() or this.getThen().mayHaveSideEffects() or this.getElse().mayHaveSideEffects() } diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll index 2e44d68c9ac7..b5aa4e98383b 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll @@ -118,7 +118,7 @@ module ControlFlow { or expr = any(ForStmt fs).getCond() or - expr = any(IfStmt is).getCond() + expr = any(IfStmt is).getCondition() or isExpressionlessSwitchCaseCondition(expr) } diff --git a/go/ql/lib/semmle/go/controlflow/IR.qll b/go/ql/lib/semmle/go/controlflow/IR.qll index 13e6e5e84739..cb7186cdd6fe 100644 --- a/go/ql/lib/semmle/go/controlflow/IR.qll +++ b/go/ql/lib/semmle/go/controlflow/IR.qll @@ -29,7 +29,7 @@ module IR { * `LogicalBinaryExpr`. */ private predicate isInBooleanCondContext(Expr e) { - e = any(IfStmt s).getCond() + e = any(IfStmt s).getCondition() or e = any(ForStmt s).getCond() or diff --git a/go/ql/src/RedundantCode/DuplicateBranches.ql b/go/ql/src/RedundantCode/DuplicateBranches.ql index 589aa55246cd..0640fc8fcbbc 100644 --- a/go/ql/src/RedundantCode/DuplicateBranches.ql +++ b/go/ql/src/RedundantCode/DuplicateBranches.ql @@ -23,4 +23,4 @@ where thenBranch = is.getThen() and elseBranch = is.getElse() and thenBranch.hash() = elseBranch.hash() -select is.getCond(), "The 'then' and 'else' branches of this if statement are identical." +select is.getCondition(), "The 'then' and 'else' branches of this if statement are identical." diff --git a/go/ql/src/RedundantCode/DuplicateCondition.ql b/go/ql/src/RedundantCode/DuplicateCondition.ql index e0ea97980438..9a256d0519f7 100644 --- a/go/ql/src/RedundantCode/DuplicateCondition.ql +++ b/go/ql/src/RedundantCode/DuplicateCondition.ql @@ -16,7 +16,7 @@ import go /** Gets the `i`th condition in the `if`-`else if` chain starting at `stmt`. */ Expr getCondition(IfStmt stmt, int i) { - i = 0 and result = stmt.getCond() + i = 0 and result = stmt.getCondition() or exists(IfStmt elsif | elsif = stmt.getElse() | not exists(elsif.getInit()) and diff --git a/go/ql/src/RedundantCode/UnreachableStatement.ql b/go/ql/src/RedundantCode/UnreachableStatement.ql index e2fd82201cf9..68df01215919 100644 --- a/go/ql/src/RedundantCode/UnreachableStatement.ql +++ b/go/ql/src/RedundantCode/UnreachableStatement.ql @@ -90,7 +90,7 @@ predicate allowlist(Stmt s) { or // statements deliberately made unreachable by a constant condition, such as the code // following `if true { return }` - exists(getPreviousStmt(s).(IfStmt).getCond().getBoolValue()) + exists(getPreviousStmt(s).(IfStmt).getCondition().getBoolValue()) } from Stmt s diff --git a/go/ql/src/experimental/CWE-942/CorsMisconfiguration.ql b/go/ql/src/experimental/CWE-942/CorsMisconfiguration.ql index 342f1addfe06..d0ef8514d5f9 100644 --- a/go/ql/src/experimental/CWE-942/CorsMisconfiguration.ql +++ b/go/ql/src/experimental/CWE-942/CorsMisconfiguration.ql @@ -176,7 +176,7 @@ module FromUntrustedConfig implements DataFlow::ConfigSig { additional predicate isSinkCgn(DataFlow::Node sink, ControlFlow::ConditionGuardNode cgn) { exists(IfStmt ifs | exists(Expr operand | - operand = ifs.getCond().getAChildExpr*() and + operand = ifs.getCondition().getAChildExpr*() and ( exists(DataFlow::CallExpr call | call = operand | call.getTarget().hasQualifiedName("strings", "HasSuffix") and @@ -202,7 +202,7 @@ module FromUntrustedConfig implements DataFlow::ConfigSig { ) ) | - cgn.getCondition() = ifs.getCond() + cgn.getCondition() = ifs.getCondition() ) } } From 864e10a73cc3a0fc75f04d1376dd305aeac26879 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Tue, 18 Aug 2026 14:30:44 +0100 Subject: [PATCH 0995/2098] Address review comments --- go/ql/examples/snippets/emptythen.ql | 2 +- go/ql/lib/semmle/go/Stmt.qll | 4 +- .../go/controlflow/ControlFlowGraph.qll | 6 +-- .../go/controlflow/ControlFlowGraphShared.qll | 44 ++++--------------- .../codeql/controlflow/ControlFlowGraph.qll | 43 +----------------- 5 files changed, 13 insertions(+), 86 deletions(-) diff --git a/go/ql/examples/snippets/emptythen.ql b/go/ql/examples/snippets/emptythen.ql index 97a810e388c1..0973a791dd7f 100644 --- a/go/ql/examples/snippets/emptythen.ql +++ b/go/ql/examples/snippets/emptythen.ql @@ -14,5 +14,5 @@ import go from IfStmt i -where i.getThen().getNumStmt() = 0 +where i.getThen().(BlockStmt).getNumStmt() = 0 select i diff --git a/go/ql/lib/semmle/go/Stmt.qll b/go/ql/lib/semmle/go/Stmt.qll index 566c2cc26875..c7dca9dc2d13 100644 --- a/go/ql/lib/semmle/go/Stmt.qll +++ b/go/ql/lib/semmle/go/Stmt.qll @@ -717,7 +717,7 @@ class IfStmt extends @ifstmt, Stmt, ScopeNode { Expr getCondition() { result = this.getChildExpr(1) } /** Gets the "then" branch of this `if` statement. */ - BlockStmt getThen() { result = this.getChildStmt(2) } + Stmt getThen() { result = this.getChildStmt(2) } /** Gets the "else" branch of this `if` statement, if any. */ Stmt getElse() { result = this.getChildStmt(3) } @@ -1085,7 +1085,7 @@ class SelectStmt extends @selectstmt, Stmt { */ class LoopStmt extends @loopstmt, Stmt, ScopeNode { /** Gets the body of this loop. */ - BlockStmt getBody() { none() } + Stmt getBody() { none() } } /** diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll index b5aa4e98383b..83e8f8de14b8 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll @@ -50,11 +50,7 @@ module ControlFlow { predicate isJoin() { strictcount(this.getAPredecessor()) > 1 } /** Holds if this is the first control-flow node in `subtree`. */ - predicate isFirstNodeOf(AstNode subtree) { - this.isBefore(subtree) - or - this.injects(subtree) - } + predicate isFirstNodeOf(AstNode subtree) { this.isBefore(subtree) } /** Holds if this node is the unique entry node of a file or function. */ predicate isEntryNode() { this instanceof CfgImpl::ControlFlow::EntryNode } diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll index fa0c01d17a7c..70d9c2145601 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll @@ -164,8 +164,6 @@ module CfgImpl { not this = any(Go::SelectStmt sel).getBody() } - override Stmt getStmt(int n) { result = Go::BlockStmt.super.getStmt(n) } - Stmt getLastStmt() { exists(int last | result = this.getStmt(last) and not exists(this.getStmt(last + 1))) } @@ -183,23 +181,11 @@ module CfgImpl { Expr getExpr() { result = Go::ExprStmt.super.getExpr() } } - class IfStmt extends Stmt { - IfStmt() { this instanceof Go::IfStmt } - - Expr getCondition() { result = this.(Go::IfStmt).getCond() } - - Stmt getThen() { result = this.(Go::IfStmt).getThen() } - - Stmt getElse() { result = this.(Go::IfStmt).getElse() } - } + class IfStmt = Go::IfStmt; AstNode getIfInit(IfStmt ifstmt) { result = ifstmt.(Go::IfStmt).getInit() } - class LoopStmt extends Stmt { - LoopStmt() { this instanceof Go::LoopStmt } - - Stmt getBody() { result = this.(Go::LoopStmt).getBody() } - } + class LoopStmt = Go::LoopStmt; class WhileStmt extends LoopStmt { WhileStmt() { none() } @@ -219,9 +205,7 @@ module CfgImpl { Expr getCondition() { none() } } - class ForStmt extends LoopStmt { - ForStmt() { this instanceof Go::ForStmt } - + class ForStmt extends LoopStmt instanceof Go::ForStmt { AstNode getInit(int index) { index = 0 and result = this.(Go::ForStmt).getInit() } Expr getCondition() { result = this.(Go::ForStmt).getCond() } @@ -229,9 +213,7 @@ module CfgImpl { AstNode getUpdate(int index) { index = 0 and result = this.(Go::ForStmt).getPost() } } - class ForeachStmt extends LoopStmt { - ForeachStmt() { this instanceof Go::RangeStmt } - + class ForeachStmt extends LoopStmt instanceof Go::RangeStmt { // Go's `range` statement binds its key and value by destructuring the // current element. The extractor synthesizes a single "range element" // node grouping the key and value (see `Go::RangeElementExpr`), which we @@ -249,9 +231,7 @@ module CfgImpl { class GotoStmt = Go::GotoStmt; - class ReturnStmt extends Go::ReturnStmt { - override Expr getExpr() { result = Go::ReturnStmt.super.getExpr() } - } + class ReturnStmt = Go::ReturnStmt; class Throw extends AstNode { Throw() { none() } @@ -281,9 +261,7 @@ module CfgImpl { Stmt getBody() { none() } } - class Switch extends AstNode { - Switch() { this instanceof Go::SwitchStmt } - + class Switch extends AstNode instanceof Go::SwitchStmt { Expr getExpr() { result = this.(Go::ExpressionSwitchStmt).getExpr() or @@ -837,7 +815,7 @@ module CfgImpl { PreControlFlowNode source, PreControlFlowNode target, AbruptCompletion completion ) { completion.getSuccessorType() instanceof ExceptionSuccessor and - isExceptionalExitNode(target) and + target instanceof ExceptionalExitNodeImpl and exists(PreControlFlowNode nextDefer | deferExitStep(source, nextDefer, _) and deferInvoke(nextDefer, _) ) @@ -862,14 +840,8 @@ module CfgImpl { * Holds if `n` is the registration node of `defer` statement `s` (the * post-order node of the statement, reached once its call's arguments have * been evaluated). - * - * This uses the reachability-free `isInOrderNode` rather than `n.isIn(s)` - * because it is referenced under negation by `succBeforeNextDeferRegistration`, and must - * therefore not depend on `reachable`. */ - private predicate deferRegistration(PreControlFlowNode n, Go::DeferStmt s) { - isInOrderNode(n, s) - } + private predicate deferRegistration(PreControlFlowNode n, Go::DeferStmt s) { n.isIn(s) } /** * Holds if `n` is the deferred-invocation node for `defer` statement `s`, diff --git a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll index dd6510eeeaa3..54dfb5c6e127 100644 --- a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll +++ b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll @@ -1030,27 +1030,6 @@ module Make0 Ast> { */ final class PreControlFlowNode = NodeImpl; - /** - * Holds if `n` is the in-order or post-order control flow node for `ast`. - * - * Unlike the `PreControlFlowNode.isIn` member predicate, this is computed - * structurally (directly from the underlying node representation) and so - * does not give rise to a dependency on node reachability. It is intended - * for languages implementing `Input2::deferExitStep`, whose definition must - * not depend on `reachable` (see `succIgnoringDeferExit`); such languages - * can use this to identify nodes inside a negation without introducing a - * non-monotonic cycle. - */ - predicate isInOrderNode(PreControlFlowNode n, AstNode ast) { n = TAstNode(ast) } - - /** - * Holds if `n` is the exceptional exit node for a callable. - * - * This is computed structurally so that it can be used while constructing - * the CFG without introducing a dependency on node reachability. - */ - predicate isExceptionalExitNode(PreControlFlowNode n) { n = TAnnotatedExitNode(_, false) } - private class BeforeNode extends NodeImpl, TBeforeNode { private AstNode n; @@ -1166,7 +1145,7 @@ module Make0 Ast> { } /** A control flow node indicating exceptional termination of a callable. */ - final private class ExceptionalExitNodeImpl extends AnnotatedExitNodeImpl { + final class ExceptionalExitNodeImpl extends AnnotatedExitNodeImpl { ExceptionalExitNodeImpl() { this = TAnnotatedExitNode(_, false) } } @@ -1770,26 +1749,6 @@ module Make0 Ast> { n2.isAfterValue(pme, any(BooleanSuccessor s | s.getValue() = true)) ) or - exists(PatternMatchExpr pme | - n1.isBefore(pme) and - n2.isBefore(pme.getExpr()) - or - n1.isAfter(pme.getExpr()) and - n2.isIn(pme) - or - n1.isIn(pme) and - n2.isAfterValue(pme, any(BooleanSuccessor s | s.getValue() = false)) - or - n1.isIn(pme) and - n2.isAdditional(pme, patternMatchTrueTag()) - or - n1.isAdditional(pme, patternMatchTrueTag()) and - n2.isBefore(pme.getPattern()) - or - n1.isAfter(pme.getPattern()) and - n2.isAfterValue(pme, any(BooleanSuccessor s | s.getValue() = true)) - ) - or exists(IfStmt ifstmt | n1.isBefore(ifstmt) and ( From b66ccd845e186e9c8ff7f37bcfb0ca695cfa16c9 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 19 Aug 2026 10:29:10 +0100 Subject: [PATCH 0996/2098] Add defer CFG edge-case tests --- .../ControlFlowNode_getASuccessor.expected | 177 +++++++++++++++++- .../go/controlflow/ControlFlowGraph/stmts7.go | 30 +++ 2 files changed, 206 insertions(+), 1 deletion(-) diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected index 518094ea2883..c5b2cac91aa2 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected @@ -3087,7 +3087,7 @@ | stmts7.go:49:16:49:16 | 1 | stmts7.go:49:16:49:16 | After 1 | | stmts7.go:49:16:49:16 | After 1 | stmts7.go:49:8:49:17 | After call to Exit | | stmts7.go:49:16:49:16 | Before 1 | stmts7.go:49:16:49:16 | 1 | -| stmts7.go:52:1:55:1 | After function declaration | stmts7.go:0:0:0:0 | After stmts7.go | +| stmts7.go:52:1:55:1 | After function declaration | stmts7.go:57:1:62:1 | Before function declaration | | stmts7.go:52:1:55:1 | Before function declaration | stmts7.go:52:1:55:1 | function declaration | | stmts7.go:52:1:55:1 | Entry | stmts7.go:52:31:52:36 | values | | stmts7.go:52:1:55:1 | Exceptional Exit | stmts7.go:52:1:55:1 | Exit | @@ -3119,6 +3119,181 @@ | stmts7.go:54:13:54:17 | After index | stmts7.go:54:6:54:18 | index expression | | stmts7.go:54:13:54:17 | Before index | stmts7.go:54:13:54:17 | index | | stmts7.go:54:13:54:17 | index | stmts7.go:54:13:54:17 | After index | +| stmts7.go:57:1:62:1 | After function declaration | stmts7.go:64:1:68:1 | Before function declaration | +| stmts7.go:57:1:62:1 | Before function declaration | stmts7.go:57:1:62:1 | function declaration | +| stmts7.go:57:1:62:1 | Entry | stmts7.go:57:23:57:30 | register | +| stmts7.go:57:1:62:1 | Exceptional Exit | stmts7.go:57:1:62:1 | Exit | +| stmts7.go:57:1:62:1 | Normal Exit | stmts7.go:57:1:62:1 | Exit | +| stmts7.go:57:1:62:1 | function declaration | stmts7.go:57:1:62:1 | After function declaration | +| stmts7.go:57:23:57:30 | register | stmts7.go:57:38:62:1 | block statement | +| stmts7.go:57:38:62:1 | After block statement | stmts7.go:57:1:62:1 | Normal Exit | +| stmts7.go:57:38:62:1 | After block statement | stmts7.go:59:9:59:22 | defer-invoke call to recoverPanic | +| stmts7.go:57:38:62:1 | block statement | stmts7.go:58:2:60:2 | if statement | +| stmts7.go:58:2:60:2 | After if statement | stmts7.go:61:2:61:20 | expression statement | +| stmts7.go:58:2:60:2 | if statement | stmts7.go:58:5:58:12 | Before register | +| stmts7.go:58:5:58:12 | After register [false] | stmts7.go:58:2:60:2 | After if statement | +| stmts7.go:58:5:58:12 | After register [true] | stmts7.go:58:14:60:2 | block statement | +| stmts7.go:58:5:58:12 | Before register | stmts7.go:58:5:58:12 | register | +| stmts7.go:58:5:58:12 | register | stmts7.go:58:5:58:12 | After register [false] | +| stmts7.go:58:5:58:12 | register | stmts7.go:58:5:58:12 | After register [true] | +| stmts7.go:58:14:60:2 | After block statement | stmts7.go:58:2:60:2 | After if statement | +| stmts7.go:58:14:60:2 | block statement | stmts7.go:59:3:59:22 | Before defer statement | +| stmts7.go:59:3:59:22 | After defer statement | stmts7.go:58:14:60:2 | After block statement | +| stmts7.go:59:3:59:22 | Before defer statement | stmts7.go:59:9:59:22 | call to recoverPanic | +| stmts7.go:59:3:59:22 | defer statement | stmts7.go:59:3:59:22 | After defer statement | +| stmts7.go:59:9:59:20 | After recoverPanic | stmts7.go:59:9:59:22 | After call to recoverPanic | +| stmts7.go:59:9:59:20 | Before recoverPanic | stmts7.go:59:9:59:20 | recoverPanic | +| stmts7.go:59:9:59:20 | recoverPanic | stmts7.go:59:9:59:20 | After recoverPanic | +| stmts7.go:59:9:59:22 | After call to recoverPanic | stmts7.go:59:3:59:22 | defer statement | +| stmts7.go:59:9:59:22 | call to recoverPanic | stmts7.go:59:9:59:20 | Before recoverPanic | +| stmts7.go:59:9:59:22 | defer-invoke call to recoverPanic | stmts7.go:57:1:62:1 | Exceptional Exit | +| stmts7.go:59:9:59:22 | defer-invoke call to recoverPanic | stmts7.go:57:1:62:1 | Normal Exit | +| stmts7.go:61:2:61:12 | After selection of Println | stmts7.go:61:14:61:19 | Before "done" | +| stmts7.go:61:2:61:12 | Before selection of Println | stmts7.go:61:2:61:12 | selection of Println | +| stmts7.go:61:2:61:12 | selection of Println | stmts7.go:61:2:61:12 | After selection of Println | +| stmts7.go:61:2:61:20 | After call to Println | stmts7.go:61:2:61:20 | After expression statement | +| stmts7.go:61:2:61:20 | After expression statement | stmts7.go:57:38:62:1 | After block statement | +| stmts7.go:61:2:61:20 | Before call to Println | stmts7.go:61:2:61:12 | Before selection of Println | +| stmts7.go:61:2:61:20 | call to Println | stmts7.go:59:9:59:22 | defer-invoke call to recoverPanic | +| stmts7.go:61:2:61:20 | call to Println | stmts7.go:61:2:61:20 | After call to Println | +| stmts7.go:61:2:61:20 | expression statement | stmts7.go:61:2:61:20 | Before call to Println | +| stmts7.go:61:14:61:19 | "done" | stmts7.go:61:14:61:19 | After "done" | +| stmts7.go:61:14:61:19 | After "done" | stmts7.go:61:2:61:20 | call to Println | +| stmts7.go:61:14:61:19 | Before "done" | stmts7.go:61:14:61:19 | "done" | +| stmts7.go:64:1:68:1 | After function declaration | stmts7.go:70:1:77:1 | Before function declaration | +| stmts7.go:64:1:68:1 | Before function declaration | stmts7.go:64:1:68:1 | function declaration | +| stmts7.go:64:1:68:1 | Entry | stmts7.go:64:20:64:24 | count | +| stmts7.go:64:1:68:1 | Normal Exit | stmts7.go:64:1:68:1 | Exit | +| stmts7.go:64:1:68:1 | function declaration | stmts7.go:64:1:68:1 | After function declaration | +| stmts7.go:64:20:64:24 | count | stmts7.go:64:31:68:1 | block statement | +| stmts7.go:64:31:68:1 | After block statement | stmts7.go:64:1:68:1 | Normal Exit | +| stmts7.go:64:31:68:1 | After block statement | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | +| stmts7.go:64:31:68:1 | block statement | stmts7.go:65:2:67:2 | for statement | +| stmts7.go:65:2:67:2 | After for statement | stmts7.go:64:31:68:1 | After block statement | +| stmts7.go:65:2:67:2 | [LoopHeader] for statement | stmts7.go:65:25:65:27 | increment statement | +| stmts7.go:65:2:67:2 | for statement | stmts7.go:65:6:65:11 | ... := ... | +| stmts7.go:65:6:65:11 | ... := ... | stmts7.go:65:11:65:11 | Before 0 | +| stmts7.go:65:6:65:11 | After ... := ... | stmts7.go:65:14:65:22 | Before ...<... | +| stmts7.go:65:6:65:11 | assign:0 ... := ... | stmts7.go:65:6:65:11 | After ... := ... | +| stmts7.go:65:11:65:11 | 0 | stmts7.go:65:11:65:11 | After 0 | +| stmts7.go:65:11:65:11 | After 0 | stmts7.go:65:6:65:11 | assign:0 ... := ... | +| stmts7.go:65:11:65:11 | Before 0 | stmts7.go:65:11:65:11 | 0 | +| stmts7.go:65:14:65:14 | After i | stmts7.go:65:18:65:22 | Before count | +| stmts7.go:65:14:65:14 | Before i | stmts7.go:65:14:65:14 | i | +| stmts7.go:65:14:65:14 | i | stmts7.go:65:14:65:14 | After i | +| stmts7.go:65:14:65:22 | ...<... | stmts7.go:65:14:65:22 | After ...<... [false] | +| stmts7.go:65:14:65:22 | ...<... | stmts7.go:65:14:65:22 | After ...<... [true] | +| stmts7.go:65:14:65:22 | After ...<... [false] | stmts7.go:65:2:67:2 | After for statement | +| stmts7.go:65:14:65:22 | After ...<... [true] | stmts7.go:65:29:67:2 | block statement | +| stmts7.go:65:14:65:22 | Before ...<... | stmts7.go:65:14:65:14 | Before i | +| stmts7.go:65:18:65:22 | After count | stmts7.go:65:14:65:22 | ...<... | +| stmts7.go:65:18:65:22 | Before count | stmts7.go:65:18:65:22 | count | +| stmts7.go:65:18:65:22 | count | stmts7.go:65:18:65:22 | After count | +| stmts7.go:65:25:65:25 | After i | stmts7.go:65:25:65:27 | compound-rhs increment statement | +| stmts7.go:65:25:65:25 | Before i | stmts7.go:65:25:65:25 | i | +| stmts7.go:65:25:65:25 | i | stmts7.go:65:25:65:25 | After i | +| stmts7.go:65:25:65:27 | After increment statement | stmts7.go:65:14:65:22 | Before ...<... | +| stmts7.go:65:25:65:27 | compound-rhs increment statement | stmts7.go:65:25:65:27 | After increment statement | +| stmts7.go:65:25:65:27 | increment statement | stmts7.go:65:25:65:25 | Before i | +| stmts7.go:65:29:67:2 | After block statement | stmts7.go:65:2:67:2 | [LoopHeader] for statement | +| stmts7.go:65:29:67:2 | block statement | stmts7.go:66:3:66:22 | Before defer statement | +| stmts7.go:66:3:66:22 | After defer statement | stmts7.go:65:29:67:2 | After block statement | +| stmts7.go:66:3:66:22 | Before defer statement | stmts7.go:66:9:66:22 | call to recoverPanic | +| stmts7.go:66:3:66:22 | defer statement | stmts7.go:66:3:66:22 | After defer statement | +| stmts7.go:66:9:66:20 | After recoverPanic | stmts7.go:66:9:66:22 | After call to recoverPanic | +| stmts7.go:66:9:66:20 | Before recoverPanic | stmts7.go:66:9:66:20 | recoverPanic | +| stmts7.go:66:9:66:20 | recoverPanic | stmts7.go:66:9:66:20 | After recoverPanic | +| stmts7.go:66:9:66:22 | After call to recoverPanic | stmts7.go:66:3:66:22 | defer statement | +| stmts7.go:66:9:66:22 | call to recoverPanic | stmts7.go:66:9:66:20 | Before recoverPanic | +| stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | stmts7.go:64:1:68:1 | Normal Exit | +| stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | +| stmts7.go:70:1:77:1 | After function declaration | stmts7.go:79:1:85:1 | Before function declaration | +| stmts7.go:70:1:77:1 | Before function declaration | stmts7.go:70:1:77:1 | function declaration | +| stmts7.go:70:1:77:1 | Entry | stmts7.go:70:20:70:23 | skip | +| stmts7.go:70:1:77:1 | Exceptional Exit | stmts7.go:70:1:77:1 | Exit | +| stmts7.go:70:1:77:1 | Normal Exit | stmts7.go:70:1:77:1 | Exit | +| stmts7.go:70:1:77:1 | function declaration | stmts7.go:70:1:77:1 | After function declaration | +| stmts7.go:70:20:70:23 | skip | stmts7.go:70:31:77:1 | block statement | +| stmts7.go:70:31:77:1 | After block statement | stmts7.go:74:8:74:21 | defer-invoke call to recoverPanic | +| stmts7.go:70:31:77:1 | block statement | stmts7.go:71:2:73:2 | if statement | +| stmts7.go:71:2:73:2 | After if statement | stmts7.go:74:2:74:21 | Before defer statement | +| stmts7.go:71:2:73:2 | if statement | stmts7.go:71:5:71:8 | Before skip | +| stmts7.go:71:5:71:8 | After skip [false] | stmts7.go:71:2:73:2 | After if statement | +| stmts7.go:71:5:71:8 | After skip [true] | stmts7.go:71:10:73:2 | block statement | +| stmts7.go:71:5:71:8 | Before skip | stmts7.go:71:5:71:8 | skip | +| stmts7.go:71:5:71:8 | skip | stmts7.go:71:5:71:8 | After skip [false] | +| stmts7.go:71:5:71:8 | skip | stmts7.go:71:5:71:8 | After skip [true] | +| stmts7.go:71:10:73:2 | block statement | stmts7.go:72:3:72:11 | Before goto statement | +| stmts7.go:72:3:72:11 | Before goto statement | stmts7.go:72:3:72:11 | goto statement | +| stmts7.go:72:3:72:11 | goto statement | stmts7.go:75:1:76:20 | labeled statement | +| stmts7.go:74:2:74:21 | After defer statement | stmts7.go:75:1:76:20 | labeled statement | +| stmts7.go:74:2:74:21 | Before defer statement | stmts7.go:74:8:74:21 | call to recoverPanic | +| stmts7.go:74:2:74:21 | defer statement | stmts7.go:74:2:74:21 | After defer statement | +| stmts7.go:74:8:74:19 | After recoverPanic | stmts7.go:74:8:74:21 | After call to recoverPanic | +| stmts7.go:74:8:74:19 | Before recoverPanic | stmts7.go:74:8:74:19 | recoverPanic | +| stmts7.go:74:8:74:19 | recoverPanic | stmts7.go:74:8:74:19 | After recoverPanic | +| stmts7.go:74:8:74:21 | After call to recoverPanic | stmts7.go:74:2:74:21 | defer statement | +| stmts7.go:74:8:74:21 | call to recoverPanic | stmts7.go:74:8:74:19 | Before recoverPanic | +| stmts7.go:74:8:74:21 | defer-invoke call to recoverPanic | stmts7.go:70:1:77:1 | Exceptional Exit | +| stmts7.go:74:8:74:21 | defer-invoke call to recoverPanic | stmts7.go:70:1:77:1 | Normal Exit | +| stmts7.go:75:1:76:20 | After labeled statement | stmts7.go:70:31:77:1 | After block statement | +| stmts7.go:75:1:76:20 | labeled statement | stmts7.go:76:2:76:20 | expression statement | +| stmts7.go:76:2:76:12 | After selection of Println | stmts7.go:76:14:76:19 | Before "done" | +| stmts7.go:76:2:76:12 | Before selection of Println | stmts7.go:76:2:76:12 | selection of Println | +| stmts7.go:76:2:76:12 | selection of Println | stmts7.go:76:2:76:12 | After selection of Println | +| stmts7.go:76:2:76:20 | After call to Println | stmts7.go:76:2:76:20 | After expression statement | +| stmts7.go:76:2:76:20 | After expression statement | stmts7.go:75:1:76:20 | After labeled statement | +| stmts7.go:76:2:76:20 | Before call to Println | stmts7.go:76:2:76:12 | Before selection of Println | +| stmts7.go:76:2:76:20 | call to Println | stmts7.go:74:8:74:21 | defer-invoke call to recoverPanic | +| stmts7.go:76:2:76:20 | call to Println | stmts7.go:76:2:76:20 | After call to Println | +| stmts7.go:76:2:76:20 | expression statement | stmts7.go:76:2:76:20 | Before call to Println | +| stmts7.go:76:14:76:19 | "done" | stmts7.go:76:14:76:19 | After "done" | +| stmts7.go:76:14:76:19 | After "done" | stmts7.go:76:2:76:20 | call to Println | +| stmts7.go:76:14:76:19 | Before "done" | stmts7.go:76:14:76:19 | "done" | +| stmts7.go:79:1:85:1 | After function declaration | stmts7.go:0:0:0:0 | After stmts7.go | +| stmts7.go:79:1:85:1 | Before function declaration | stmts7.go:79:1:85:1 | function declaration | +| stmts7.go:79:1:85:1 | Entry | stmts7.go:79:23:79:32 | panicEarly | +| stmts7.go:79:1:85:1 | Exceptional Exit | stmts7.go:79:1:85:1 | Exit | +| stmts7.go:79:1:85:1 | Normal Exit | stmts7.go:79:1:85:1 | Exit | +| stmts7.go:79:1:85:1 | function declaration | stmts7.go:79:1:85:1 | After function declaration | +| stmts7.go:79:23:79:32 | panicEarly | stmts7.go:79:40:85:1 | block statement | +| stmts7.go:79:40:85:1 | block statement | stmts7.go:80:2:82:2 | if statement | +| stmts7.go:80:2:82:2 | After if statement | stmts7.go:83:2:83:21 | Before defer statement | +| stmts7.go:80:2:82:2 | if statement | stmts7.go:80:5:80:14 | Before panicEarly | +| stmts7.go:80:5:80:14 | After panicEarly [false] | stmts7.go:80:2:82:2 | After if statement | +| stmts7.go:80:5:80:14 | After panicEarly [true] | stmts7.go:80:16:82:2 | block statement | +| stmts7.go:80:5:80:14 | Before panicEarly | stmts7.go:80:5:80:14 | panicEarly | +| stmts7.go:80:5:80:14 | panicEarly | stmts7.go:80:5:80:14 | After panicEarly [false] | +| stmts7.go:80:5:80:14 | panicEarly | stmts7.go:80:5:80:14 | After panicEarly [true] | +| stmts7.go:80:16:82:2 | block statement | stmts7.go:81:3:81:16 | expression statement | +| stmts7.go:81:3:81:7 | After panic | stmts7.go:81:9:81:15 | Before "early" | +| stmts7.go:81:3:81:7 | Before panic | stmts7.go:81:3:81:7 | panic | +| stmts7.go:81:3:81:7 | panic | stmts7.go:81:3:81:7 | After panic | +| stmts7.go:81:3:81:16 | Before call to panic | stmts7.go:81:3:81:7 | Before panic | +| stmts7.go:81:3:81:16 | call to panic | stmts7.go:79:1:85:1 | Exceptional Exit | +| stmts7.go:81:3:81:16 | expression statement | stmts7.go:81:3:81:16 | Before call to panic | +| stmts7.go:81:9:81:15 | "early" | stmts7.go:81:9:81:15 | After "early" | +| stmts7.go:81:9:81:15 | After "early" | stmts7.go:81:3:81:16 | call to panic | +| stmts7.go:81:9:81:15 | Before "early" | stmts7.go:81:9:81:15 | "early" | +| stmts7.go:83:2:83:21 | After defer statement | stmts7.go:84:2:84:14 | expression statement | +| stmts7.go:83:2:83:21 | Before defer statement | stmts7.go:83:8:83:21 | call to recoverPanic | +| stmts7.go:83:2:83:21 | defer statement | stmts7.go:83:2:83:21 | After defer statement | +| stmts7.go:83:8:83:19 | After recoverPanic | stmts7.go:83:8:83:21 | After call to recoverPanic | +| stmts7.go:83:8:83:19 | Before recoverPanic | stmts7.go:83:8:83:19 | recoverPanic | +| stmts7.go:83:8:83:19 | recoverPanic | stmts7.go:83:8:83:19 | After recoverPanic | +| stmts7.go:83:8:83:21 | After call to recoverPanic | stmts7.go:83:2:83:21 | defer statement | +| stmts7.go:83:8:83:21 | call to recoverPanic | stmts7.go:83:8:83:19 | Before recoverPanic | +| stmts7.go:83:8:83:21 | defer-invoke call to recoverPanic | stmts7.go:79:1:85:1 | Exceptional Exit | +| stmts7.go:83:8:83:21 | defer-invoke call to recoverPanic | stmts7.go:79:1:85:1 | Normal Exit | +| stmts7.go:84:2:84:6 | After panic | stmts7.go:84:8:84:13 | Before "late" | +| stmts7.go:84:2:84:6 | Before panic | stmts7.go:84:2:84:6 | panic | +| stmts7.go:84:2:84:6 | panic | stmts7.go:84:2:84:6 | After panic | +| stmts7.go:84:2:84:14 | Before call to panic | stmts7.go:84:2:84:6 | Before panic | +| stmts7.go:84:2:84:14 | call to panic | stmts7.go:83:8:83:21 | defer-invoke call to recoverPanic | +| stmts7.go:84:2:84:14 | expression statement | stmts7.go:84:2:84:14 | Before call to panic | +| stmts7.go:84:8:84:13 | "late" | stmts7.go:84:8:84:13 | After "late" | +| stmts7.go:84:8:84:13 | After "late" | stmts7.go:84:2:84:14 | call to panic | +| stmts7.go:84:8:84:13 | Before "late" | stmts7.go:84:8:84:13 | "late" | | stmts8.go:0:0:0:0 | After stmts8.go | stmts8.go:0:0:0:0 | Normal Exit | | stmts8.go:0:0:0:0 | Entry | stmts8.go:0:0:0:0 | stmts8.go | | stmts8.go:0:0:0:0 | Normal Exit | stmts8.go:0:0:0:0 | Exit | diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/stmts7.go b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/stmts7.go index c7686f331cd0..64d5db51563d 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/stmts7.go +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/stmts7.go @@ -53,3 +53,33 @@ func deferBeforePossiblePanic(values []int, index int) { defer recoverPanic() _ = values[index] } + +func conditionalDefer(register bool) { + if register { + defer recoverPanic() + } + fmt.Println("done") +} + +func repeatedDefer(count int) { + for i := 0; i < count; i++ { + defer recoverPanic() + } +} + +func bypassedDefer(skip bool) { + if skip { + goto done + } + defer recoverPanic() +done: + fmt.Println("done") +} + +func panicAroundDefer(panicEarly bool) { + if panicEarly { + panic("early") + } + defer recoverPanic() + panic("late") +} From b815f92bb2a0ec0094241b728462f7b640dd09ac Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 19 Aug 2026 10:35:36 +0100 Subject: [PATCH 0997/2098] Build defer edges from an early Go CFG --- .../go/controlflow/ControlFlowGraphShared.qll | 152 +++++++++++++++--- .../CONSISTENCY/CfgConsistency.expected | 13 +- .../ControlFlowNode_getASuccessor.expected | 1 + 3 files changed, 143 insertions(+), 23 deletions(-) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll index 70d9c2145601..e5d692b0906d 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll @@ -14,9 +14,11 @@ module CfgImpl { private module Cfg0 = CfgLib::Make0; - private module Cfg1 = Cfg0::Make1; + private module Cfg1 = Cfg0::Make1; - private module Cfg2 = Cfg1::Make2; + private module EarlyCfg2 = Cfg1::Make2; + + private module Cfg2 = Cfg1::Make2; private import Cfg0 private import Cfg1 @@ -27,7 +29,7 @@ module CfgImpl { /** Holds if `e` has an implicit field selection at `index` for `implicitField`. */ predicate implicitFieldSelection(Go::AstNode e, int index, Go::Field implicitField) { - Input::implicitFieldSelection(e, index, implicitField) + Input1::implicitFieldSelection(e, index, implicitField) } /** @@ -411,8 +413,8 @@ module CfgImpl { } } - /** The Input module implementing InputSig1 and InputSig2 for Go. */ - private module Input implements Cfg0::InputSig1, Cfg1::InputSig2 { + /** Predicates shared by the two stages of Go CFG construction. */ + private module Input1 implements Cfg0::InputSig1 { predicate cfgCachedStageRef() { CfgCachedStage::ref() } class CallableContext = Void; @@ -702,7 +704,7 @@ module CfgImpl { ) } - predicate beginAbruptCompletion( + additional predicate beginAbruptCompletion( Ast::AstNode ast, PreControlFlowNode n, AbruptCompletion c, boolean always ) { ast instanceof Go::CallExpr and @@ -759,7 +761,9 @@ module CfgImpl { always = false } - predicate endAbruptCompletion(Ast::AstNode ast, PreControlFlowNode n, AbruptCompletion c) { + additional predicate endAbruptCompletion( + Ast::AstNode ast, PreControlFlowNode n, AbruptCompletion c + ) { exists(Go::LabeledStmt lbl | ast = lbl.getStmt() and n.isAfter(lbl) and @@ -798,7 +802,9 @@ module CfgImpl { ) } - predicate overridesCallableEndAbruptCompletion(Ast::Callable c, AbruptCompletion completion) { + additional predicate overridesCallableEndAbruptCompletion( + Ast::Callable c, AbruptCompletion completion + ) { // For functions with result variables, the library's default routing of a // `return` straight to the normal exit node is suppressed so that the // return is instead caught by `endAbruptCompletion` above and routed @@ -811,7 +817,7 @@ module CfgImpl { completion.getSuccessorType() instanceof ReturnSuccessor } - predicate overridesAbruptCompletionEdge( + additional predicate overridesAbruptCompletionEdge( PreControlFlowNode source, PreControlFlowNode target, AbruptCompletion completion ) { completion.getSuccessorType() instanceof ExceptionSuccessor and @@ -821,7 +827,7 @@ module CfgImpl { ) } - predicate callableExitStep(PreControlFlowNode n, Ast::Callable c, boolean normal) { + additional predicate callableExitStep(PreControlFlowNode n, Ast::Callable c, boolean normal) { // The last result-read node of the epilogue steps to the normal exit node. exists(Go::FuncDef fd, int j | fd = c | normal = true and @@ -870,15 +876,19 @@ module CfgImpl { * node. Walking this relation from a node stops at the next registration * node, which is how the reachability gate for deferred calls is computed. * - * This is typed over `PreControlFlowNode` and uses `succIgnoringDeferExit` - * so that it does not depend on `reachable` (which would otherwise create a - * non-monotonic cycle through `deferExitStep`). + * This is computed over the early CFG, before deferred-invocation edges are + * added to the final CFG. */ private PreControlFlowNode succBeforeNextDeferRegistration(PreControlFlowNode n) { - succIgnoringDeferExit(n, result, _) and + earlySuccessor(n) = result and not deferRegistration(result, _) } + /** Gets a successor of `n` in the early CFG, before deferred invocations are added. */ + private PreControlFlowNode earlySuccessor(PreControlFlowNode n) { + exists(EarlyCfg2::ControlFlowNode early | early = n and result = early.getASuccessor()) + } + /** Gets a node reachable from `start` over `succBeforeNextDeferRegistration`, reflexively. */ private PreControlFlowNode reachableBeforeNextDeferRegistration(PreControlFlowNode start) { result = start @@ -901,7 +911,7 @@ module CfgImpl { exists(PreControlFlowNode reg, PreControlFlowNode m | deferRegistration(reg, s) and m = reachableBeforeNextDeferRegistration(funcEntry(fd)) and - succIgnoringDeferExit(m, reg, _) + earlySuccessor(m) = reg ) } @@ -921,7 +931,7 @@ module CfgImpl { deferRegistration(laterRegistration, laterRegistered) and deferRegistration(earlierRegistration, earlierRegistered) and m = reachableBeforeNextDeferRegistration(earlierRegistration) and - succIgnoringDeferExit(m, laterRegistration, _) + earlySuccessor(m) = laterRegistration ) } @@ -968,7 +978,7 @@ module CfgImpl { target.(NormalExitNodeImpl).getEnclosingCallable() = fd } - predicate deferExitStep( + additional predicate deferExitStep( PreControlFlowNode n1, PreControlFlowNode n2, SuccessorType successorType ) { exists(Go::FuncDef fd | funcHasDefer(fd) | @@ -1018,9 +1028,11 @@ module CfgImpl { ) } - predicate overridesCallableBodyExit(Ast::Callable c) { funcHasDefer(c.(Go::FuncDef)) } + additional predicate overridesCallableBodyExit(Ast::Callable c) { + funcHasDefer(c.(Go::FuncDef)) + } - predicate overridesDefaultControlFlow(Ast::AstNode ast) { + additional predicate overridesDefaultControlFlow(Ast::AstNode ast) { exists(Go::SelectStmt sel, Go::RecvStmt recv | recv = sel.getACommClause().getComm() and (ast = recv or ast = recv.getExpr()) @@ -1031,13 +1043,13 @@ module CfgImpl { ) } - predicate preservesDefaultControlFlow(Ast::AstNode ast) { + additional predicate preservesDefaultControlFlow(Ast::AstNode ast) { ast = any(Go::FuncDef fd | hasFuncDefPrologue(fd)).getBody() or exists(getFirstEpilogueTag(ast)) } - predicate overridesDefaultControlFlowStep( + additional predicate overridesDefaultControlFlowStep( Ast::AstNode ast, PreControlFlowNode source, PreControlFlowNode target ) { ast = any(Go::FuncDef fd | hasFuncDefPrologue(fd)).getBody() and source.isBefore(ast) @@ -1051,7 +1063,7 @@ module CfgImpl { (target.isIn(ast) or target.isAfter(ast)) } - predicate step(PreControlFlowNode n1, PreControlFlowNode n2) { + additional predicate step(PreControlFlowNode n1, PreControlFlowNode n2) { rangeStmtStep(n1, n2) or selectStmtStep(n1, n2) or deferStmtStep(n1, n2) or @@ -1734,4 +1746,100 @@ module CfgImpl { ) } } + + /** Builds the CFG used to determine which `defer` statements have been registered. */ + private module EarlyInput2 implements Cfg1::InputSig2 { + predicate beginAbruptCompletion( + Ast::AstNode ast, PreControlFlowNode n, AbruptCompletion c, boolean always + ) { + Input1::beginAbruptCompletion(ast, n, c, always) + } + + predicate endAbruptCompletion(Ast::AstNode ast, PreControlFlowNode n, AbruptCompletion c) { + Input1::endAbruptCompletion(ast, n, c) + or + exists(Go::FuncDef fd | + ast = fd.getBody() and + c.getSuccessorType() instanceof ReturnSuccessor and + exists(fd.getResultVar(0)) and + n.isAdditional(fd.getBody(), "result-read:0") + ) + } + + predicate overridesCallableEndAbruptCompletion(Ast::Callable c, AbruptCompletion completion) { + exists(c.(Go::FuncDef).getResultVar(0)) and + completion.getSuccessorType() instanceof ReturnSuccessor + } + + predicate callableExitStep(PreControlFlowNode n, Ast::Callable c, boolean normal) { + Input1::callableExitStep(n, c, normal) + } + + predicate overridesDefaultControlFlow(Ast::AstNode ast) { + Input1::overridesDefaultControlFlow(ast) + } + + predicate preservesDefaultControlFlow(Ast::AstNode ast) { + Input1::preservesDefaultControlFlow(ast) + } + + predicate overridesDefaultControlFlowStep( + Ast::AstNode ast, PreControlFlowNode source, PreControlFlowNode target + ) { + Input1::overridesDefaultControlFlowStep(ast, source, target) + } + + predicate step(PreControlFlowNode n1, PreControlFlowNode n2) { Input1::step(n1, n2) } + } + + /** Builds the final Go CFG, including deferred invocations. */ + private module FinalInput2 implements Cfg1::InputSig2 { + predicate beginAbruptCompletion( + Ast::AstNode ast, PreControlFlowNode n, AbruptCompletion c, boolean always + ) { + Input1::beginAbruptCompletion(ast, n, c, always) + } + + predicate endAbruptCompletion(Ast::AstNode ast, PreControlFlowNode n, AbruptCompletion c) { + Input1::endAbruptCompletion(ast, n, c) + } + + predicate overridesCallableEndAbruptCompletion(Ast::Callable c, AbruptCompletion completion) { + Input1::overridesCallableEndAbruptCompletion(c, completion) + } + + predicate overridesAbruptCompletionEdge( + PreControlFlowNode source, PreControlFlowNode target, AbruptCompletion completion + ) { + Input1::overridesAbruptCompletionEdge(source, target, completion) + } + + predicate callableExitStep(PreControlFlowNode n, Ast::Callable c, boolean normal) { + Input1::callableExitStep(n, c, normal) + } + + predicate deferExitStep( + PreControlFlowNode n1, PreControlFlowNode n2, SuccessorType successorType + ) { + Input1::deferExitStep(n1, n2, successorType) + } + + predicate overridesCallableBodyExit(Ast::Callable c) { Input1::overridesCallableBodyExit(c) } + + predicate overridesDefaultControlFlow(Ast::AstNode ast) { + Input1::overridesDefaultControlFlow(ast) + } + + predicate preservesDefaultControlFlow(Ast::AstNode ast) { + Input1::preservesDefaultControlFlow(ast) + } + + predicate overridesDefaultControlFlowStep( + Ast::AstNode ast, PreControlFlowNode source, PreControlFlowNode target + ) { + Input1::overridesDefaultControlFlowStep(ast, source, target) + } + + predicate step(PreControlFlowNode n1, PreControlFlowNode n2) { Input1::step(n1, n2) } + } } diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CONSISTENCY/CfgConsistency.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CONSISTENCY/CfgConsistency.expected index 76635561eb92..e8e1a0874323 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CONSISTENCY/CfgConsistency.expected @@ -1,6 +1,7 @@ consistencyOverview | deadEnd | 1 | -| multipleSuccessors | 10 | +| multipleSuccessors | 18 | +| selfLoop | 1 | deadEnd | stmts.go:61:2:61:10 | select statement | multipleSuccessors @@ -8,9 +9,19 @@ multipleSuccessors | stmts2.go:16:2:26:2 | select statement | successor | stmts2.go:18:2:19:10 | comm clause | | stmts2.go:16:2:26:2 | select statement | successor | stmts2.go:20:2:24:10 | comm clause | | stmts2.go:16:2:26:2 | select statement | successor | stmts2.go:25:2:25:18 | comm clause | +| stmts7.go:57:38:62:1 | After block statement | successor | stmts7.go:57:1:62:1 | Normal Exit | +| stmts7.go:57:38:62:1 | After block statement | successor | stmts7.go:59:9:59:22 | defer-invoke call to recoverPanic | +| stmts7.go:64:31:68:1 | After block statement | successor | stmts7.go:64:1:68:1 | Normal Exit | +| stmts7.go:64:31:68:1 | After block statement | successor | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | +| stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | successor | stmts7.go:64:1:68:1 | Normal Exit | +| stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | successor | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | +| stmts7.go:70:31:77:1 | After block statement | successor | stmts7.go:70:1:77:1 | Normal Exit | +| stmts7.go:70:31:77:1 | After block statement | successor | stmts7.go:74:8:74:21 | defer-invoke call to recoverPanic | | stmts.go:50:2:59:2 | select statement | successor | stmts.go:51:2:52:31 | comm clause | | stmts.go:50:2:59:2 | select statement | successor | stmts.go:53:2:55:16 | comm clause | | stmts.go:50:2:59:2 | select statement | successor | stmts.go:56:2:57:15 | comm clause | | stmts.go:50:2:59:2 | select statement | successor | stmts.go:58:2:58:16 | comm clause | | stmts.go:71:2:71:10 | return statement | successor | stmts.go:67:9:67:35 | defer-invoke function call | | stmts.go:71:2:71:10 | return statement | successor | stmts.go:69:9:69:36 | defer-invoke function call | +selfLoop +| stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | successor | diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected index c5b2cac91aa2..e9df03ee91bd 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected @@ -3214,6 +3214,7 @@ | stmts7.go:70:1:77:1 | Normal Exit | stmts7.go:70:1:77:1 | Exit | | stmts7.go:70:1:77:1 | function declaration | stmts7.go:70:1:77:1 | After function declaration | | stmts7.go:70:20:70:23 | skip | stmts7.go:70:31:77:1 | block statement | +| stmts7.go:70:31:77:1 | After block statement | stmts7.go:70:1:77:1 | Normal Exit | | stmts7.go:70:31:77:1 | After block statement | stmts7.go:74:8:74:21 | defer-invoke call to recoverPanic | | stmts7.go:70:31:77:1 | block statement | stmts7.go:71:2:73:2 | if statement | | stmts7.go:71:2:73:2 | After if statement | stmts7.go:74:2:74:21 | Before defer statement | From 290fa45dab13789cebfb20f181d06ffe1e4ad7e7 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 19 Aug 2026 10:47:17 +0100 Subject: [PATCH 0998/2098] Model Go function epilogues in the body CFG --- .../go/controlflow/ControlFlowGraphShared.qll | 121 +++++------- .../CONSISTENCY/CfgConsistency.expected | 6 +- .../CONSISTENCY/CfgConsistency.expected | 14 +- .../ControlFlowNode_getASuccessor.expected | 92 +++++---- .../CONSISTENCY/CfgConsistency.expected | 12 +- .../codeql/controlflow/ControlFlowGraph.qll | 181 ++---------------- 6 files changed, 134 insertions(+), 292 deletions(-) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll index e5d692b0906d..1fce1a4fff19 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll @@ -162,6 +162,7 @@ module CfgImpl { class BlockStmt extends Go::BlockStmt { BlockStmt() { + not this = any(Go::FuncDef fd).getBody() and not this = any(Go::SwitchStmt sw).getBody() and not this = any(Go::SelectStmt sel).getBody() } @@ -453,7 +454,7 @@ module CfgImpl { // The call of a `defer` statement is not invoked at the statement // itself; its callee and arguments are evaluated in place, but the call // is only invoked later, at function exit (modelled by the `defer-invoke` - // node and `deferExitStep`). Marking it as pre-order means no in-order + // node and `additionalSuccessor`). Marking it as pre-order means no in-order // "invocation" node (and hence no inline exceptional-exit edge) is // created at the `defer` statement. e = any(Go::DeferStmt s).getCall() @@ -603,7 +604,7 @@ module CfgImpl { tag = "implicit-field:" + i.toString() ) or - // Deferred-call invocation node, placed at function exit by `deferExitStep` + // Deferred-call invocation node, placed at function exit by `additionalSuccessor` n = any(Go::DeferStmt s).getCall() and tag = "defer-invoke" ) } @@ -800,40 +801,31 @@ module CfgImpl { exists(fd.getResultVar(0)) and n.isAdditional(fd.getBody(), "result-read:0") ) - } - - additional predicate overridesCallableEndAbruptCompletion( - Ast::Callable c, AbruptCompletion completion - ) { - // For functions with result variables, the library's default routing of a - // `return` straight to the normal exit node is suppressed so that the - // return is instead caught by `endAbruptCompletion` above and routed - // through the result-read epilogue. - // - // For functions containing `defer` statements, the default routing is - // likewise suppressed so that returns are routed through the deferred-call - // epilogue (see `deferExitStep`) instead. - (exists(c.(Go::FuncDef).getResultVar(0)) or funcHasDefer(c.(Go::FuncDef))) and - completion.getSuccessorType() instanceof ReturnSuccessor + or + // Function bodies are excluded from `Ast::BlockStmt`, so handle goto + // targets among their top-level statements here. + exists(Go::FuncDef fd, Go::Stmt target, Label l | + ast = fd.getBody() and + target = fd.getBody().getAStmt() and + not target instanceof Go::GotoStmt and + hasLabel(target, l) and + n.isBefore(target) and + c.getSuccessorType() instanceof GotoSuccessor and + c.hasLabel(l) + ) } additional predicate overridesAbruptCompletionEdge( PreControlFlowNode source, PreControlFlowNode target, AbruptCompletion completion ) { + completion.getSuccessorType() instanceof ReturnSuccessor and + target instanceof NormalExitNodeImpl and + exists(PreControlFlowNode replacement | additionalSuccessor(source, replacement, _)) + or completion.getSuccessorType() instanceof ExceptionSuccessor and target instanceof ExceptionalExitNodeImpl and exists(PreControlFlowNode nextDefer | - deferExitStep(source, nextDefer, _) and deferInvoke(nextDefer, _) - ) - } - - additional predicate callableExitStep(PreControlFlowNode n, Ast::Callable c, boolean normal) { - // The last result-read node of the epilogue steps to the normal exit node. - exists(Go::FuncDef fd, int j | fd = c | - normal = true and - exists(fd.getResultVar(j)) and - not exists(fd.getResultVar(j + 1)) and - n.isAdditional(fd.getBody(), "result-read:" + j.toString()) + additionalSuccessor(source, nextDefer, _) and deferInvoke(nextDefer, _) ) } @@ -937,12 +929,12 @@ module CfgImpl { /** * Holds if `n` is a normal-exit predecessor of `fd`: a `return` statement - * node, or the fall-through node after the body. + * node, or the normal fall-through from the body's last statement. */ private predicate normalExitPred(PreControlFlowNode n, Go::FuncDef fd) { exists(Go::ReturnStmt ret | ret.getEnclosingFunction() = fd and n.isIn(ret)) or - n.isAfter(fd.getBody()) + n.isAfter(getLastRankedChild(fd.getBody())) } /** @@ -968,17 +960,16 @@ module CfgImpl { /** * Holds if, after running its deferred calls, `fd` should continue at * `target` on a normal exit. For functions with result variables this is - * the start of the result-read epilogue; otherwise it is the normal exit - * node directly. + * the start of the result-read epilogue; otherwise it is the function + * body's `After` node. */ private predicate deferChainExitTarget(Go::FuncDef fd, PreControlFlowNode target) { exists(fd.getResultVar(0)) and target.isAdditional(fd.getBody(), "result-read:0") or - not exists(fd.getResultVar(_)) and - target.(NormalExitNodeImpl).getEnclosingCallable() = fd + not exists(fd.getResultVar(_)) and target.isAfter(fd.getBody()) } - additional predicate deferExitStep( + additional predicate additionalSuccessor( PreControlFlowNode n1, PreControlFlowNode n2, SuccessorType successorType ) { exists(Go::FuncDef fd | funcHasDefer(fd) | @@ -1028,10 +1019,6 @@ module CfgImpl { ) } - additional predicate overridesCallableBodyExit(Ast::Callable c) { - funcHasDefer(c.(Go::FuncDef)) - } - additional predicate overridesDefaultControlFlow(Ast::AstNode ast) { exists(Go::SelectStmt sel, Go::RecvStmt recv | recv = sel.getACommClause().getComm() and @@ -1054,6 +1041,10 @@ module CfgImpl { ) { ast = any(Go::FuncDef fd | hasFuncDefPrologue(fd)).getBody() and source.isBefore(ast) or + ast = any(Go::FuncDef fd | funcHasDefer(fd)).getBody() and + source.isAfter(getLastRankedChild(ast)) and + target.isAfter(ast) + or exists(getFirstEpilogueTag(ast)) and ( source.isAfter(getLastRankedChild(ast)) @@ -1693,8 +1684,8 @@ module CfgImpl { * variables: zero-init:0 → zero-init:1 → ... → first statement. * - Epilogue: return → result-read:0 → result-read:1 → ... → result-read:last * - * The last result-read node goes to `NormalExit(fd)` via the shared - * library's `callableExitStep` hook. + * The last result-read node goes to `After(body)`, from which the shared + * callable CFG continues to the normal exit. */ private predicate hasFuncDefPrologue(Go::FuncDef fd) { exists(fd.getResultVar(_)) } @@ -1702,12 +1693,7 @@ module CfgImpl { n.isBefore(getRankedChild(fd.getBody(), 1)) or not exists(getRankedChild(fd.getBody(), _)) and - n.isAfter(fd.getBody()) and - // When Before(body) and After(body) are the same node (the shared library's - // "simple leaf node" optimization merges them for empty bodies without - // additional nodes), don't generate Before→After as it would be a self-loop. - // The callable exit mechanism already routes After(body) → NormalExit. - not n.isBefore(fd.getBody()) + n.isAdditional(fd.getBody(), "result-read:0") } private predicate funcDefStep(PreControlFlowNode n1, PreControlFlowNode n2) { @@ -1737,12 +1723,26 @@ module CfgImpl { ) ) or - // result-read:j → result-read:(j+1); the last result-read node steps to - // the normal exit node via the `callableExitStep` hook. + // result-read:j → result-read:(j+1) exists(int j | exists(fd.getResultVar(j + 1)) | n1.isAdditional(fd.getBody(), "result-read:" + j.toString()) and n2.isAdditional(fd.getBody(), "result-read:" + (j + 1).toString()) ) + or + // Normal fall-through enters the result-read epilogue when there are + // named results but no deferred calls. + not funcHasDefer(fd) and + exists(fd.getResultVar(0)) and + n1.isAfter(getLastRankedChild(fd.getBody())) and + n2.isAdditional(fd.getBody(), "result-read:0") + or + // The completed result-read epilogue reaches `After(body)`. + exists(int j | + exists(fd.getResultVar(j)) and + not exists(fd.getResultVar(j + 1)) and + n1.isAdditional(fd.getBody(), "result-read:" + j.toString()) and + n2.isAfter(fd.getBody()) + ) ) } } @@ -1766,15 +1766,6 @@ module CfgImpl { ) } - predicate overridesCallableEndAbruptCompletion(Ast::Callable c, AbruptCompletion completion) { - exists(c.(Go::FuncDef).getResultVar(0)) and - completion.getSuccessorType() instanceof ReturnSuccessor - } - - predicate callableExitStep(PreControlFlowNode n, Ast::Callable c, boolean normal) { - Input1::callableExitStep(n, c, normal) - } - predicate overridesDefaultControlFlow(Ast::AstNode ast) { Input1::overridesDefaultControlFlow(ast) } @@ -1804,28 +1795,18 @@ module CfgImpl { Input1::endAbruptCompletion(ast, n, c) } - predicate overridesCallableEndAbruptCompletion(Ast::Callable c, AbruptCompletion completion) { - Input1::overridesCallableEndAbruptCompletion(c, completion) - } - predicate overridesAbruptCompletionEdge( PreControlFlowNode source, PreControlFlowNode target, AbruptCompletion completion ) { Input1::overridesAbruptCompletionEdge(source, target, completion) } - predicate callableExitStep(PreControlFlowNode n, Ast::Callable c, boolean normal) { - Input1::callableExitStep(n, c, normal) - } - - predicate deferExitStep( + predicate additionalSuccessor( PreControlFlowNode n1, PreControlFlowNode n2, SuccessorType successorType ) { - Input1::deferExitStep(n1, n2, successorType) + Input1::additionalSuccessor(n1, n2, successorType) } - predicate overridesCallableBodyExit(Ast::Callable c) { Input1::overridesCallableBodyExit(c) } - predicate overridesDefaultControlFlow(Ast::AstNode ast) { Input1::overridesDefaultControlFlow(ast) } diff --git a/go/ql/test/experimental/InconsistentCode/CONSISTENCY/CfgConsistency.expected b/go/ql/test/experimental/InconsistentCode/CONSISTENCY/CfgConsistency.expected index d615482c8a8f..567dc09e3f76 100644 --- a/go/ql/test/experimental/InconsistentCode/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/experimental/InconsistentCode/CONSISTENCY/CfgConsistency.expected @@ -2,9 +2,9 @@ consistencyOverview | multipleSuccessors | 4 | | selfLoop | 1 | multipleSuccessors -| DeferInLoop.go:5:36:14:1 | After block statement | successor | DeferInLoop.go:5:1:14:1 | Normal Exit | -| DeferInLoop.go:5:36:14:1 | After block statement | successor | DeferInLoop.go:8:9:8:20 | defer-invoke call to Close | -| DeferInLoop.go:8:9:8:20 | defer-invoke call to Close | successor | DeferInLoop.go:5:1:14:1 | Normal Exit | +| DeferInLoop.go:6:2:13:2 | After range statement | successor | DeferInLoop.go:5:36:14:1 | After block statement | +| DeferInLoop.go:6:2:13:2 | After range statement | successor | DeferInLoop.go:8:9:8:20 | defer-invoke call to Close | +| DeferInLoop.go:8:9:8:20 | defer-invoke call to Close | successor | DeferInLoop.go:5:36:14:1 | After block statement | | DeferInLoop.go:8:9:8:20 | defer-invoke call to Close | successor | DeferInLoop.go:8:9:8:20 | defer-invoke call to Close | selfLoop | DeferInLoop.go:8:9:8:20 | defer-invoke call to Close | successor | diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CONSISTENCY/CfgConsistency.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CONSISTENCY/CfgConsistency.expected index e8e1a0874323..b817b73a6e69 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CONSISTENCY/CfgConsistency.expected @@ -9,14 +9,14 @@ multipleSuccessors | stmts2.go:16:2:26:2 | select statement | successor | stmts2.go:18:2:19:10 | comm clause | | stmts2.go:16:2:26:2 | select statement | successor | stmts2.go:20:2:24:10 | comm clause | | stmts2.go:16:2:26:2 | select statement | successor | stmts2.go:25:2:25:18 | comm clause | -| stmts7.go:57:38:62:1 | After block statement | successor | stmts7.go:57:1:62:1 | Normal Exit | -| stmts7.go:57:38:62:1 | After block statement | successor | stmts7.go:59:9:59:22 | defer-invoke call to recoverPanic | -| stmts7.go:64:31:68:1 | After block statement | successor | stmts7.go:64:1:68:1 | Normal Exit | -| stmts7.go:64:31:68:1 | After block statement | successor | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | -| stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | successor | stmts7.go:64:1:68:1 | Normal Exit | +| stmts7.go:61:2:61:20 | After expression statement | successor | stmts7.go:57:38:62:1 | After block statement | +| stmts7.go:61:2:61:20 | After expression statement | successor | stmts7.go:59:9:59:22 | defer-invoke call to recoverPanic | +| stmts7.go:65:2:67:2 | After for statement | successor | stmts7.go:64:31:68:1 | After block statement | +| stmts7.go:65:2:67:2 | After for statement | successor | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | +| stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | successor | stmts7.go:64:31:68:1 | After block statement | | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | successor | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | -| stmts7.go:70:31:77:1 | After block statement | successor | stmts7.go:70:1:77:1 | Normal Exit | -| stmts7.go:70:31:77:1 | After block statement | successor | stmts7.go:74:8:74:21 | defer-invoke call to recoverPanic | +| stmts7.go:75:1:76:20 | After labeled statement | successor | stmts7.go:70:31:77:1 | After block statement | +| stmts7.go:75:1:76:20 | After labeled statement | successor | stmts7.go:74:8:74:21 | defer-invoke call to recoverPanic | | stmts.go:50:2:59:2 | select statement | successor | stmts.go:51:2:52:31 | comm clause | | stmts.go:50:2:59:2 | select statement | successor | stmts.go:53:2:55:16 | comm clause | | stmts.go:50:2:59:2 | select statement | successor | stmts.go:56:2:57:15 | comm clause | diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected index e9df03ee91bd..0e9990b47444 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected @@ -244,9 +244,10 @@ | epilogues.go:42:1:48:1 | Normal Exit | epilogues.go:42:1:48:1 | Exit | | epilogues.go:42:1:48:1 | function declaration | epilogues.go:42:1:48:1 | After function declaration | | epilogues.go:42:20:42:20 | x | epilogues.go:42:51:48:1 | block statement | +| epilogues.go:42:51:48:1 | After block statement | epilogues.go:42:1:48:1 | Normal Exit | | epilogues.go:42:51:48:1 | block statement | epilogues.go:42:51:48:1 | zero-init:0 block statement | | epilogues.go:42:51:48:1 | result-read:0 block statement | epilogues.go:42:51:48:1 | result-read:1 block statement | -| epilogues.go:42:51:48:1 | result-read:1 block statement | epilogues.go:42:1:48:1 | Normal Exit | +| epilogues.go:42:51:48:1 | result-read:1 block statement | epilogues.go:42:51:48:1 | After block statement | | epilogues.go:42:51:48:1 | zero-init:0 block statement | epilogues.go:42:51:48:1 | zero-init:1 block statement | | epilogues.go:42:51:48:1 | zero-init:1 block statement | epilogues.go:43:2:46:2 | if statement | | epilogues.go:43:2:46:2 | After if statement | epilogues.go:47:2:47:14 | Before return statement | @@ -290,8 +291,9 @@ | epilogues.go:51:1:54:1 | Normal Exit | epilogues.go:51:1:54:1 | Exit | | epilogues.go:51:1:54:1 | function declaration | epilogues.go:51:1:54:1 | After function declaration | | epilogues.go:51:23:51:23 | x | epilogues.go:51:38:54:1 | block statement | +| epilogues.go:51:38:54:1 | After block statement | epilogues.go:51:1:54:1 | Normal Exit | | epilogues.go:51:38:54:1 | block statement | epilogues.go:51:38:54:1 | zero-init:0 block statement | -| epilogues.go:51:38:54:1 | result-read:0 block statement | epilogues.go:51:1:54:1 | Normal Exit | +| epilogues.go:51:38:54:1 | result-read:0 block statement | epilogues.go:51:38:54:1 | After block statement | | epilogues.go:51:38:54:1 | zero-init:0 block statement | epilogues.go:52:2:52:10 | ... = ... | | epilogues.go:52:2:52:10 | ... = ... | epilogues.go:52:6:52:10 | Before ...+... | | epilogues.go:52:2:52:10 | After ... = ... | epilogues.go:53:2:53:7 | Before return statement | @@ -315,7 +317,7 @@ | epilogues.go:59:1:62:1 | function declaration | epilogues.go:59:1:62:1 | After function declaration | | epilogues.go:59:27:59:27 | l | epilogues.go:59:41:59:45 | items | | epilogues.go:59:41:59:45 | items | epilogues.go:59:54:62:1 | block statement | -| epilogues.go:59:54:62:1 | After block statement | epilogues.go:60:8:60:33 | defer-invoke call to log | +| epilogues.go:59:54:62:1 | After block statement | epilogues.go:59:1:62:1 | Normal Exit | | epilogues.go:59:54:62:1 | block statement | epilogues.go:60:2:60:33 | Before defer statement | | epilogues.go:60:2:60:33 | After defer statement | epilogues.go:61:2:61:38 | expression statement | | epilogues.go:60:2:60:33 | Before defer statement | epilogues.go:60:8:60:33 | call to log | @@ -329,7 +331,7 @@ | epilogues.go:60:8:60:33 | After call to log | epilogues.go:60:2:60:33 | defer statement | | epilogues.go:60:8:60:33 | call to log | epilogues.go:60:8:60:12 | Before selection of log | | epilogues.go:60:8:60:33 | defer-invoke call to log | epilogues.go:59:1:62:1 | Exceptional Exit | -| epilogues.go:60:8:60:33 | defer-invoke call to log | epilogues.go:59:1:62:1 | Normal Exit | +| epilogues.go:60:8:60:33 | defer-invoke call to log | epilogues.go:59:54:62:1 | After block statement | | epilogues.go:60:14:60:20 | "count" | epilogues.go:60:14:60:20 | After "count" | | epilogues.go:60:14:60:20 | After "count" | epilogues.go:60:23:60:32 | Before call to len | | epilogues.go:60:14:60:20 | Before "count" | epilogues.go:60:14:60:20 | "count" | @@ -346,7 +348,7 @@ | epilogues.go:61:2:61:12 | Before selection of Println | epilogues.go:61:2:61:12 | selection of Println | | epilogues.go:61:2:61:12 | selection of Println | epilogues.go:61:2:61:12 | After selection of Println | | epilogues.go:61:2:61:38 | After call to Println | epilogues.go:61:2:61:38 | After expression statement | -| epilogues.go:61:2:61:38 | After expression statement | epilogues.go:59:54:62:1 | After block statement | +| epilogues.go:61:2:61:38 | After expression statement | epilogues.go:60:8:60:33 | defer-invoke call to log | | epilogues.go:61:2:61:38 | Before call to Println | epilogues.go:61:2:61:12 | Before selection of Println | | epilogues.go:61:2:61:38 | call to Println | epilogues.go:60:8:60:33 | defer-invoke call to log | | epilogues.go:61:2:61:38 | call to Println | epilogues.go:61:2:61:38 | After call to Println | @@ -370,7 +372,7 @@ | epilogues.go:66:1:71:1 | Normal Exit | epilogues.go:66:1:71:1 | Exit | | epilogues.go:66:1:71:1 | function declaration | epilogues.go:66:1:71:1 | After function declaration | | epilogues.go:66:28:66:33 | prefix | epilogues.go:66:43:71:1 | block statement | -| epilogues.go:66:43:71:1 | After block statement | epilogues.go:69:8:69:25 | defer-invoke call to log | +| epilogues.go:66:43:71:1 | After block statement | epilogues.go:66:1:71:1 | Normal Exit | | epilogues.go:66:43:71:1 | block statement | epilogues.go:67:2:67:31 | ... := ... | | epilogues.go:67:2:67:31 | ... := ... | epilogues.go:67:7:67:31 | Before struct literal | | epilogues.go:67:2:67:31 | After ... := ... | epilogues.go:68:2:68:24 | Before defer statement | @@ -397,7 +399,7 @@ | epilogues.go:68:8:68:24 | After call to logValue | epilogues.go:68:2:68:24 | defer statement | | epilogues.go:68:8:68:24 | call to logValue | epilogues.go:68:8:68:17 | Before selection of logValue | | epilogues.go:68:8:68:24 | defer-invoke call to logValue | epilogues.go:66:1:71:1 | Exceptional Exit | -| epilogues.go:68:8:68:24 | defer-invoke call to logValue | epilogues.go:66:1:71:1 | Normal Exit | +| epilogues.go:68:8:68:24 | defer-invoke call to logValue | epilogues.go:66:43:71:1 | After block statement | | epilogues.go:68:19:68:23 | "bye" | epilogues.go:68:19:68:23 | After "bye" | | epilogues.go:68:19:68:23 | After "bye" | epilogues.go:68:8:68:24 | After call to logValue | | epilogues.go:68:19:68:23 | Before "bye" | epilogues.go:68:19:68:23 | "bye" | @@ -428,7 +430,7 @@ | epilogues.go:70:2:70:12 | Before selection of Println | epilogues.go:70:2:70:12 | selection of Println | | epilogues.go:70:2:70:12 | selection of Println | epilogues.go:70:2:70:12 | After selection of Println | | epilogues.go:70:2:70:20 | After call to Println | epilogues.go:70:2:70:20 | After expression statement | -| epilogues.go:70:2:70:20 | After expression statement | epilogues.go:66:43:71:1 | After block statement | +| epilogues.go:70:2:70:20 | After expression statement | epilogues.go:69:8:69:25 | defer-invoke call to log | | epilogues.go:70:2:70:20 | Before call to Println | epilogues.go:70:2:70:12 | Before selection of Println | | epilogues.go:70:2:70:20 | call to Println | epilogues.go:69:8:69:25 | defer-invoke call to log | | epilogues.go:70:2:70:20 | call to Println | epilogues.go:70:2:70:20 | After call to Println | @@ -443,7 +445,7 @@ | epilogues.go:77:1:82:1 | Normal Exit | epilogues.go:77:1:82:1 | Exit | | epilogues.go:77:1:82:1 | function declaration | epilogues.go:77:1:82:1 | After function declaration | | epilogues.go:77:22:77:22 | x | epilogues.go:77:29:82:1 | block statement | -| epilogues.go:77:29:82:1 | After block statement | epilogues.go:78:8:80:15 | defer-invoke function call | +| epilogues.go:77:29:82:1 | After block statement | epilogues.go:77:1:82:1 | Normal Exit | | epilogues.go:77:29:82:1 | block statement | epilogues.go:78:2:80:15 | Before defer statement | | epilogues.go:78:2:80:15 | After defer statement | epilogues.go:81:2:81:23 | expression statement | | epilogues.go:78:2:80:15 | Before defer statement | epilogues.go:78:8:80:15 | function call | @@ -456,7 +458,7 @@ | epilogues.go:78:8:80:2 | function literal | epilogues.go:78:8:80:2 | After function literal | | epilogues.go:78:8:80:15 | After function call | epilogues.go:78:2:80:15 | defer statement | | epilogues.go:78:8:80:15 | defer-invoke function call | epilogues.go:77:1:82:1 | Exceptional Exit | -| epilogues.go:78:8:80:15 | defer-invoke function call | epilogues.go:77:1:82:1 | Normal Exit | +| epilogues.go:78:8:80:15 | defer-invoke function call | epilogues.go:77:29:82:1 | After block statement | | epilogues.go:78:8:80:15 | function call | epilogues.go:78:8:80:2 | Before function literal | | epilogues.go:78:13:78:17 | label | epilogues.go:78:27:78:27 | n | | epilogues.go:78:27:78:27 | n | epilogues.go:78:34:80:2 | block statement | @@ -493,7 +495,7 @@ | epilogues.go:81:2:81:12 | Before selection of Println | epilogues.go:81:2:81:12 | selection of Println | | epilogues.go:81:2:81:12 | selection of Println | epilogues.go:81:2:81:12 | After selection of Println | | epilogues.go:81:2:81:23 | After call to Println | epilogues.go:81:2:81:23 | After expression statement | -| epilogues.go:81:2:81:23 | After expression statement | epilogues.go:77:29:82:1 | After block statement | +| epilogues.go:81:2:81:23 | After expression statement | epilogues.go:78:8:80:15 | defer-invoke function call | | epilogues.go:81:2:81:23 | Before call to Println | epilogues.go:81:2:81:12 | Before selection of Println | | epilogues.go:81:2:81:23 | call to Println | epilogues.go:78:8:80:15 | defer-invoke function call | | epilogues.go:81:2:81:23 | call to Println | epilogues.go:81:2:81:23 | After call to Println | @@ -511,8 +513,9 @@ | epilogues.go:87:1:98:1 | Normal Exit | epilogues.go:87:1:98:1 | Exit | | epilogues.go:87:1:98:1 | function declaration | epilogues.go:87:1:98:1 | After function declaration | | epilogues.go:87:22:87:22 | x | epilogues.go:87:42:98:1 | block statement | +| epilogues.go:87:42:98:1 | After block statement | epilogues.go:87:1:98:1 | Normal Exit | | epilogues.go:87:42:98:1 | block statement | epilogues.go:87:42:98:1 | zero-init:0 block statement | -| epilogues.go:87:42:98:1 | result-read:0 block statement | epilogues.go:87:1:98:1 | Normal Exit | +| epilogues.go:87:42:98:1 | result-read:0 block statement | epilogues.go:87:42:98:1 | After block statement | | epilogues.go:87:42:98:1 | zero-init:0 block statement | epilogues.go:88:2:92:4 | Before defer statement | | epilogues.go:88:2:92:4 | After defer statement | epilogues.go:93:2:95:2 | if statement | | epilogues.go:88:2:92:4 | Before defer statement | epilogues.go:88:8:92:4 | function call | @@ -606,9 +609,10 @@ | epilogues.go:102:1:110:1 | Normal Exit | epilogues.go:102:1:110:1 | Exit | | epilogues.go:102:1:110:1 | function declaration | epilogues.go:102:1:110:1 | After function declaration | | epilogues.go:102:26:102:26 | x | epilogues.go:102:50:110:1 | block statement | +| epilogues.go:102:50:110:1 | After block statement | epilogues.go:102:1:110:1 | Normal Exit | | epilogues.go:102:50:110:1 | block statement | epilogues.go:102:50:110:1 | zero-init:0 block statement | | epilogues.go:102:50:110:1 | result-read:0 block statement | epilogues.go:102:50:110:1 | result-read:1 block statement | -| epilogues.go:102:50:110:1 | result-read:1 block statement | epilogues.go:102:1:110:1 | Normal Exit | +| epilogues.go:102:50:110:1 | result-read:1 block statement | epilogues.go:102:50:110:1 | After block statement | | epilogues.go:102:50:110:1 | zero-init:0 block statement | epilogues.go:102:50:110:1 | zero-init:1 block statement | | epilogues.go:102:50:110:1 | zero-init:1 block statement | epilogues.go:103:2:103:19 | Before defer statement | | epilogues.go:103:2:103:19 | After defer statement | epilogues.go:104:2:106:2 | if statement | @@ -657,6 +661,7 @@ | epilogues.go:115:1:118:1 | Exceptional Exit | epilogues.go:115:1:118:1 | Exit | | epilogues.go:115:1:118:1 | Normal Exit | epilogues.go:115:1:118:1 | Exit | | epilogues.go:115:1:118:1 | function declaration | epilogues.go:115:1:118:1 | After function declaration | +| epilogues.go:115:26:118:1 | After block statement | epilogues.go:115:1:118:1 | Normal Exit | | epilogues.go:115:26:118:1 | block statement | epilogues.go:116:2:116:19 | Before defer statement | | epilogues.go:116:2:116:19 | After defer statement | epilogues.go:117:2:117:14 | expression statement | | epilogues.go:116:2:116:19 | Before defer statement | epilogues.go:116:8:116:19 | call to epiRecover | @@ -667,7 +672,7 @@ | epilogues.go:116:8:116:19 | After call to epiRecover | epilogues.go:116:2:116:19 | defer statement | | epilogues.go:116:8:116:19 | call to epiRecover | epilogues.go:116:8:116:17 | Before epiRecover | | epilogues.go:116:8:116:19 | defer-invoke call to epiRecover | epilogues.go:115:1:118:1 | Exceptional Exit | -| epilogues.go:116:8:116:19 | defer-invoke call to epiRecover | epilogues.go:115:1:118:1 | Normal Exit | +| epilogues.go:116:8:116:19 | defer-invoke call to epiRecover | epilogues.go:115:26:118:1 | After block statement | | epilogues.go:117:2:117:6 | After panic | epilogues.go:117:8:117:13 | Before "boom" | | epilogues.go:117:2:117:6 | Before panic | epilogues.go:117:2:117:6 | panic | | epilogues.go:117:2:117:6 | panic | epilogues.go:117:2:117:6 | After panic | @@ -1251,8 +1256,9 @@ | exprs.go:49:1:54:1 | Normal Exit | exprs.go:49:1:54:1 | Exit | | exprs.go:49:1:54:1 | function declaration | exprs.go:49:1:54:1 | After function declaration | | exprs.go:49:10:49:11 | xs | exprs.go:49:30:54:1 | block statement | +| exprs.go:49:30:54:1 | After block statement | exprs.go:49:1:54:1 | Normal Exit | | exprs.go:49:30:54:1 | block statement | exprs.go:49:30:54:1 | zero-init:0 block statement | -| exprs.go:49:30:54:1 | result-read:0 block statement | exprs.go:49:1:54:1 | Normal Exit | +| exprs.go:49:30:54:1 | result-read:0 block statement | exprs.go:49:30:54:1 | After block statement | | exprs.go:49:30:54:1 | zero-init:0 block statement | exprs.go:50:2:52:2 | for statement | | exprs.go:50:2:52:2 | After for statement | exprs.go:53:2:53:7 | Before return statement | | exprs.go:50:2:52:2 | [LoopHeader] for statement | exprs.go:50:27:50:29 | increment statement | @@ -2084,8 +2090,9 @@ | main.go:47:1:50:1 | Entry | main.go:47:25:50:1 | block statement | | main.go:47:1:50:1 | Normal Exit | main.go:47:1:50:1 | Exit | | main.go:47:1:50:1 | function declaration | main.go:47:1:50:1 | After function declaration | +| main.go:47:25:50:1 | After block statement | main.go:47:1:50:1 | Normal Exit | | main.go:47:25:50:1 | block statement | main.go:47:25:50:1 | zero-init:0 block statement | -| main.go:47:25:50:1 | result-read:0 block statement | main.go:47:1:50:1 | Normal Exit | +| main.go:47:25:50:1 | result-read:0 block statement | main.go:47:25:50:1 | After block statement | | main.go:47:25:50:1 | zero-init:0 block statement | main.go:48:2:48:12 | ... = ... | | main.go:48:2:48:12 | ... = ... | main.go:48:11:48:12 | Before 42 | | main.go:48:2:48:12 | After ... = ... | main.go:49:2:49:7 | Before return statement | @@ -2100,8 +2107,9 @@ | main.go:52:1:54:1 | Entry | main.go:52:26:54:1 | block statement | | main.go:52:1:54:1 | Normal Exit | main.go:52:1:54:1 | Exit | | main.go:52:1:54:1 | function declaration | main.go:52:1:54:1 | After function declaration | +| main.go:52:26:54:1 | After block statement | main.go:52:1:54:1 | Normal Exit | | main.go:52:26:54:1 | block statement | main.go:52:26:54:1 | zero-init:0 block statement | -| main.go:52:26:54:1 | result-read:0 block statement | main.go:52:1:54:1 | Normal Exit | +| main.go:52:26:54:1 | result-read:0 block statement | main.go:52:26:54:1 | After block statement | | main.go:52:26:54:1 | zero-init:0 block statement | main.go:53:2:53:7 | Before return statement | | main.go:53:2:53:7 | Before return statement | main.go:53:2:53:7 | return statement | | main.go:53:2:53:7 | return statement | main.go:52:26:54:1 | result-read:0 block statement | @@ -2111,8 +2119,9 @@ | main.go:56:1:64:1 | Normal Exit | main.go:56:1:64:1 | Exit | | main.go:56:1:64:1 | function declaration | main.go:56:1:64:1 | After function declaration | | main.go:56:11:56:18 | selector | main.go:56:38:64:1 | block statement | +| main.go:56:38:64:1 | After block statement | main.go:56:1:64:1 | Normal Exit | | main.go:56:38:64:1 | block statement | main.go:56:38:64:1 | zero-init:0 block statement | -| main.go:56:38:64:1 | result-read:0 block statement | main.go:56:1:64:1 | Normal Exit | +| main.go:56:38:64:1 | result-read:0 block statement | main.go:56:38:64:1 | After block statement | | main.go:56:38:64:1 | zero-init:0 block statement | main.go:57:2:57:11 | ... = ... | | main.go:57:2:57:11 | ... = ... | main.go:57:11:57:11 | Before 0 | | main.go:57:2:57:11 | After ... = ... | main.go:58:2:62:2 | if statement | @@ -2312,9 +2321,10 @@ | main.go:92:1:96:1 | Entry | main.go:92:36:96:1 | block statement | | main.go:92:1:96:1 | Normal Exit | main.go:92:1:96:1 | Exit | | main.go:92:1:96:1 | function declaration | main.go:92:1:96:1 | After function declaration | +| main.go:92:36:96:1 | After block statement | main.go:92:1:96:1 | Normal Exit | | main.go:92:36:96:1 | block statement | main.go:92:36:96:1 | zero-init:0 block statement | | main.go:92:36:96:1 | result-read:0 block statement | main.go:92:36:96:1 | result-read:1 block statement | -| main.go:92:36:96:1 | result-read:1 block statement | main.go:92:1:96:1 | Normal Exit | +| main.go:92:36:96:1 | result-read:1 block statement | main.go:92:36:96:1 | After block statement | | main.go:92:36:96:1 | zero-init:0 block statement | main.go:92:36:96:1 | zero-init:1 block statement | | main.go:92:36:96:1 | zero-init:1 block statement | main.go:93:2:93:8 | ... := ... | | main.go:93:2:93:8 | ... := ... | main.go:93:7:93:8 | Before 23 | @@ -2887,6 +2897,7 @@ | stmts7.go:13:1:16:1 | Exceptional Exit | stmts7.go:13:1:16:1 | Exit | | stmts7.go:13:1:16:1 | Normal Exit | stmts7.go:13:1:16:1 | Exit | | stmts7.go:13:1:16:1 | function declaration | stmts7.go:13:1:16:1 | After function declaration | +| stmts7.go:13:19:16:1 | After block statement | stmts7.go:13:1:16:1 | Normal Exit | | stmts7.go:13:19:16:1 | block statement | stmts7.go:14:2:14:21 | Before defer statement | | stmts7.go:14:2:14:21 | After defer statement | stmts7.go:15:2:15:10 | expression statement | | stmts7.go:14:2:14:21 | Before defer statement | stmts7.go:14:8:14:21 | call to recoverPanic | @@ -2897,7 +2908,7 @@ | stmts7.go:14:8:14:21 | After call to recoverPanic | stmts7.go:14:2:14:21 | defer statement | | stmts7.go:14:8:14:21 | call to recoverPanic | stmts7.go:14:8:14:19 | Before recoverPanic | | stmts7.go:14:8:14:21 | defer-invoke call to recoverPanic | stmts7.go:13:1:16:1 | Exceptional Exit | -| stmts7.go:14:8:14:21 | defer-invoke call to recoverPanic | stmts7.go:13:1:16:1 | Normal Exit | +| stmts7.go:14:8:14:21 | defer-invoke call to recoverPanic | stmts7.go:13:19:16:1 | After block statement | | stmts7.go:15:2:15:6 | After panic | stmts7.go:15:8:15:9 | Before "" | | stmts7.go:15:2:15:6 | Before panic | stmts7.go:15:2:15:6 | panic | | stmts7.go:15:2:15:6 | panic | stmts7.go:15:2:15:6 | After panic | @@ -2939,6 +2950,7 @@ | stmts7.go:26:1:31:1 | Normal Exit | stmts7.go:26:1:31:1 | Exit | | stmts7.go:26:1:31:1 | function declaration | stmts7.go:26:1:31:1 | After function declaration | | stmts7.go:26:16:26:23 | callback | stmts7.go:26:40:31:1 | block statement | +| stmts7.go:26:40:31:1 | After block statement | stmts7.go:26:1:31:1 | Normal Exit | | stmts7.go:26:40:31:1 | block statement | stmts7.go:27:2:27:20 | Before defer statement | | stmts7.go:27:2:27:20 | After defer statement | stmts7.go:28:2:28:23 | Before defer statement | | stmts7.go:27:2:27:20 | Before defer statement | stmts7.go:27:8:27:20 | call to fn | @@ -2952,7 +2964,7 @@ | stmts7.go:27:8:27:20 | After call to fn | stmts7.go:27:2:27:20 | defer statement | | stmts7.go:27:8:27:20 | call to fn | stmts7.go:27:8:27:18 | Before selection of fn | | stmts7.go:27:8:27:20 | defer-invoke call to fn | stmts7.go:26:1:31:1 | Exceptional Exit | -| stmts7.go:27:8:27:20 | defer-invoke call to fn | stmts7.go:26:1:31:1 | Normal Exit | +| stmts7.go:27:8:27:20 | defer-invoke call to fn | stmts7.go:26:40:31:1 | After block statement | | stmts7.go:28:2:28:23 | After defer statement | stmts7.go:29:2:29:31 | expression statement | | stmts7.go:28:2:28:23 | Before defer statement | stmts7.go:28:8:28:23 | call to fn | | stmts7.go:28:2:28:23 | defer statement | stmts7.go:28:2:28:23 | After defer statement | @@ -3017,7 +3029,7 @@ | stmts7.go:38:1:41:1 | Exceptional Exit | stmts7.go:38:1:41:1 | Exit | | stmts7.go:38:1:41:1 | Normal Exit | stmts7.go:38:1:41:1 | Exit | | stmts7.go:38:1:41:1 | function declaration | stmts7.go:38:1:41:1 | After function declaration | -| stmts7.go:38:22:41:1 | After block statement | stmts7.go:40:8:40:30 | defer-invoke call to panic | +| stmts7.go:38:22:41:1 | After block statement | stmts7.go:38:1:41:1 | Normal Exit | | stmts7.go:38:22:41:1 | block statement | stmts7.go:39:2:39:21 | Before defer statement | | stmts7.go:39:2:39:21 | After defer statement | stmts7.go:40:2:40:30 | Before defer statement | | stmts7.go:39:2:39:21 | Before defer statement | stmts7.go:39:8:39:21 | call to recoverPanic | @@ -3028,8 +3040,8 @@ | stmts7.go:39:8:39:21 | After call to recoverPanic | stmts7.go:39:2:39:21 | defer statement | | stmts7.go:39:8:39:21 | call to recoverPanic | stmts7.go:39:8:39:19 | Before recoverPanic | | stmts7.go:39:8:39:21 | defer-invoke call to recoverPanic | stmts7.go:38:1:41:1 | Exceptional Exit | -| stmts7.go:39:8:39:21 | defer-invoke call to recoverPanic | stmts7.go:38:1:41:1 | Normal Exit | -| stmts7.go:40:2:40:30 | After defer statement | stmts7.go:38:22:41:1 | After block statement | +| stmts7.go:39:8:39:21 | defer-invoke call to recoverPanic | stmts7.go:38:22:41:1 | After block statement | +| stmts7.go:40:2:40:30 | After defer statement | stmts7.go:40:8:40:30 | defer-invoke call to panic | | stmts7.go:40:2:40:30 | Before defer statement | stmts7.go:40:8:40:30 | call to panic | | stmts7.go:40:2:40:30 | defer statement | stmts7.go:40:2:40:30 | After defer statement | | stmts7.go:40:8:40:12 | After panic | stmts7.go:40:14:40:29 | Before "deferred panic" | @@ -3046,9 +3058,8 @@ | stmts7.go:43:1:45:1 | Entry | stmts7.go:43:27:45:1 | block statement | | stmts7.go:43:1:45:1 | Exceptional Exit | stmts7.go:43:1:45:1 | Exit | | stmts7.go:43:1:45:1 | function declaration | stmts7.go:43:1:45:1 | After function declaration | -| stmts7.go:43:27:45:1 | After block statement | stmts7.go:44:8:44:36 | defer-invoke call to panic | | stmts7.go:43:27:45:1 | block statement | stmts7.go:44:2:44:36 | Before defer statement | -| stmts7.go:44:2:44:36 | After defer statement | stmts7.go:43:27:45:1 | After block statement | +| stmts7.go:44:2:44:36 | After defer statement | stmts7.go:44:8:44:36 | defer-invoke call to panic | | stmts7.go:44:2:44:36 | Before defer statement | stmts7.go:44:8:44:36 | call to panic | | stmts7.go:44:2:44:36 | defer statement | stmts7.go:44:2:44:36 | After defer statement | | stmts7.go:44:8:44:12 | After panic | stmts7.go:44:14:44:35 | Before "final deferred panic" | @@ -3065,7 +3076,6 @@ | stmts7.go:47:1:50:1 | Entry | stmts7.go:47:35:50:1 | block statement | | stmts7.go:47:1:50:1 | Exceptional Exit | stmts7.go:47:1:50:1 | Exit | | stmts7.go:47:1:50:1 | function declaration | stmts7.go:47:1:50:1 | After function declaration | -| stmts7.go:47:35:50:1 | After block statement | stmts7.go:49:8:49:17 | defer-invoke call to Exit | | stmts7.go:47:35:50:1 | block statement | stmts7.go:48:2:48:21 | Before defer statement | | stmts7.go:48:2:48:21 | After defer statement | stmts7.go:49:2:49:17 | Before defer statement | | stmts7.go:48:2:48:21 | Before defer statement | stmts7.go:48:8:48:21 | call to recoverPanic | @@ -3075,7 +3085,7 @@ | stmts7.go:48:8:48:19 | recoverPanic | stmts7.go:48:8:48:19 | After recoverPanic | | stmts7.go:48:8:48:21 | After call to recoverPanic | stmts7.go:48:2:48:21 | defer statement | | stmts7.go:48:8:48:21 | call to recoverPanic | stmts7.go:48:8:48:19 | Before recoverPanic | -| stmts7.go:49:2:49:17 | After defer statement | stmts7.go:47:35:50:1 | After block statement | +| stmts7.go:49:2:49:17 | After defer statement | stmts7.go:49:8:49:17 | defer-invoke call to Exit | | stmts7.go:49:2:49:17 | Before defer statement | stmts7.go:49:8:49:17 | call to Exit | | stmts7.go:49:2:49:17 | defer statement | stmts7.go:49:2:49:17 | After defer statement | | stmts7.go:49:8:49:14 | After selection of Exit | stmts7.go:49:16:49:16 | Before 1 | @@ -3095,7 +3105,7 @@ | stmts7.go:52:1:55:1 | function declaration | stmts7.go:52:1:55:1 | After function declaration | | stmts7.go:52:31:52:36 | values | stmts7.go:52:45:52:49 | index | | stmts7.go:52:45:52:49 | index | stmts7.go:52:56:55:1 | block statement | -| stmts7.go:52:56:55:1 | After block statement | stmts7.go:53:8:53:21 | defer-invoke call to recoverPanic | +| stmts7.go:52:56:55:1 | After block statement | stmts7.go:52:1:55:1 | Normal Exit | | stmts7.go:52:56:55:1 | block statement | stmts7.go:53:2:53:21 | Before defer statement | | stmts7.go:53:2:53:21 | After defer statement | stmts7.go:54:2:54:18 | ... = ... | | stmts7.go:53:2:53:21 | Before defer statement | stmts7.go:53:8:53:21 | call to recoverPanic | @@ -3106,9 +3116,9 @@ | stmts7.go:53:8:53:21 | After call to recoverPanic | stmts7.go:53:2:53:21 | defer statement | | stmts7.go:53:8:53:21 | call to recoverPanic | stmts7.go:53:8:53:19 | Before recoverPanic | | stmts7.go:53:8:53:21 | defer-invoke call to recoverPanic | stmts7.go:52:1:55:1 | Exceptional Exit | -| stmts7.go:53:8:53:21 | defer-invoke call to recoverPanic | stmts7.go:52:1:55:1 | Normal Exit | +| stmts7.go:53:8:53:21 | defer-invoke call to recoverPanic | stmts7.go:52:56:55:1 | After block statement | | stmts7.go:54:2:54:18 | ... = ... | stmts7.go:54:6:54:18 | Before index expression | -| stmts7.go:54:2:54:18 | After ... = ... | stmts7.go:52:56:55:1 | After block statement | +| stmts7.go:54:2:54:18 | After ... = ... | stmts7.go:53:8:53:21 | defer-invoke call to recoverPanic | | stmts7.go:54:6:54:11 | After values | stmts7.go:54:13:54:17 | Before index | | stmts7.go:54:6:54:11 | Before values | stmts7.go:54:6:54:11 | values | | stmts7.go:54:6:54:11 | values | stmts7.go:54:6:54:11 | After values | @@ -3127,7 +3137,6 @@ | stmts7.go:57:1:62:1 | function declaration | stmts7.go:57:1:62:1 | After function declaration | | stmts7.go:57:23:57:30 | register | stmts7.go:57:38:62:1 | block statement | | stmts7.go:57:38:62:1 | After block statement | stmts7.go:57:1:62:1 | Normal Exit | -| stmts7.go:57:38:62:1 | After block statement | stmts7.go:59:9:59:22 | defer-invoke call to recoverPanic | | stmts7.go:57:38:62:1 | block statement | stmts7.go:58:2:60:2 | if statement | | stmts7.go:58:2:60:2 | After if statement | stmts7.go:61:2:61:20 | expression statement | | stmts7.go:58:2:60:2 | if statement | stmts7.go:58:5:58:12 | Before register | @@ -3147,12 +3156,13 @@ | stmts7.go:59:9:59:22 | After call to recoverPanic | stmts7.go:59:3:59:22 | defer statement | | stmts7.go:59:9:59:22 | call to recoverPanic | stmts7.go:59:9:59:20 | Before recoverPanic | | stmts7.go:59:9:59:22 | defer-invoke call to recoverPanic | stmts7.go:57:1:62:1 | Exceptional Exit | -| stmts7.go:59:9:59:22 | defer-invoke call to recoverPanic | stmts7.go:57:1:62:1 | Normal Exit | +| stmts7.go:59:9:59:22 | defer-invoke call to recoverPanic | stmts7.go:57:38:62:1 | After block statement | | stmts7.go:61:2:61:12 | After selection of Println | stmts7.go:61:14:61:19 | Before "done" | | stmts7.go:61:2:61:12 | Before selection of Println | stmts7.go:61:2:61:12 | selection of Println | | stmts7.go:61:2:61:12 | selection of Println | stmts7.go:61:2:61:12 | After selection of Println | | stmts7.go:61:2:61:20 | After call to Println | stmts7.go:61:2:61:20 | After expression statement | | stmts7.go:61:2:61:20 | After expression statement | stmts7.go:57:38:62:1 | After block statement | +| stmts7.go:61:2:61:20 | After expression statement | stmts7.go:59:9:59:22 | defer-invoke call to recoverPanic | | stmts7.go:61:2:61:20 | Before call to Println | stmts7.go:61:2:61:12 | Before selection of Println | | stmts7.go:61:2:61:20 | call to Println | stmts7.go:59:9:59:22 | defer-invoke call to recoverPanic | | stmts7.go:61:2:61:20 | call to Println | stmts7.go:61:2:61:20 | After call to Println | @@ -3167,9 +3177,9 @@ | stmts7.go:64:1:68:1 | function declaration | stmts7.go:64:1:68:1 | After function declaration | | stmts7.go:64:20:64:24 | count | stmts7.go:64:31:68:1 | block statement | | stmts7.go:64:31:68:1 | After block statement | stmts7.go:64:1:68:1 | Normal Exit | -| stmts7.go:64:31:68:1 | After block statement | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | | stmts7.go:64:31:68:1 | block statement | stmts7.go:65:2:67:2 | for statement | | stmts7.go:65:2:67:2 | After for statement | stmts7.go:64:31:68:1 | After block statement | +| stmts7.go:65:2:67:2 | After for statement | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | | stmts7.go:65:2:67:2 | [LoopHeader] for statement | stmts7.go:65:25:65:27 | increment statement | | stmts7.go:65:2:67:2 | for statement | stmts7.go:65:6:65:11 | ... := ... | | stmts7.go:65:6:65:11 | ... := ... | stmts7.go:65:11:65:11 | Before 0 | @@ -3205,7 +3215,7 @@ | stmts7.go:66:9:66:20 | recoverPanic | stmts7.go:66:9:66:20 | After recoverPanic | | stmts7.go:66:9:66:22 | After call to recoverPanic | stmts7.go:66:3:66:22 | defer statement | | stmts7.go:66:9:66:22 | call to recoverPanic | stmts7.go:66:9:66:20 | Before recoverPanic | -| stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | stmts7.go:64:1:68:1 | Normal Exit | +| stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | stmts7.go:64:31:68:1 | After block statement | | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | | stmts7.go:70:1:77:1 | After function declaration | stmts7.go:79:1:85:1 | Before function declaration | | stmts7.go:70:1:77:1 | Before function declaration | stmts7.go:70:1:77:1 | function declaration | @@ -3215,7 +3225,6 @@ | stmts7.go:70:1:77:1 | function declaration | stmts7.go:70:1:77:1 | After function declaration | | stmts7.go:70:20:70:23 | skip | stmts7.go:70:31:77:1 | block statement | | stmts7.go:70:31:77:1 | After block statement | stmts7.go:70:1:77:1 | Normal Exit | -| stmts7.go:70:31:77:1 | After block statement | stmts7.go:74:8:74:21 | defer-invoke call to recoverPanic | | stmts7.go:70:31:77:1 | block statement | stmts7.go:71:2:73:2 | if statement | | stmts7.go:71:2:73:2 | After if statement | stmts7.go:74:2:74:21 | Before defer statement | | stmts7.go:71:2:73:2 | if statement | stmts7.go:71:5:71:8 | Before skip | @@ -3236,8 +3245,9 @@ | stmts7.go:74:8:74:21 | After call to recoverPanic | stmts7.go:74:2:74:21 | defer statement | | stmts7.go:74:8:74:21 | call to recoverPanic | stmts7.go:74:8:74:19 | Before recoverPanic | | stmts7.go:74:8:74:21 | defer-invoke call to recoverPanic | stmts7.go:70:1:77:1 | Exceptional Exit | -| stmts7.go:74:8:74:21 | defer-invoke call to recoverPanic | stmts7.go:70:1:77:1 | Normal Exit | +| stmts7.go:74:8:74:21 | defer-invoke call to recoverPanic | stmts7.go:70:31:77:1 | After block statement | | stmts7.go:75:1:76:20 | After labeled statement | stmts7.go:70:31:77:1 | After block statement | +| stmts7.go:75:1:76:20 | After labeled statement | stmts7.go:74:8:74:21 | defer-invoke call to recoverPanic | | stmts7.go:75:1:76:20 | labeled statement | stmts7.go:76:2:76:20 | expression statement | | stmts7.go:76:2:76:12 | After selection of Println | stmts7.go:76:14:76:19 | Before "done" | | stmts7.go:76:2:76:12 | Before selection of Println | stmts7.go:76:2:76:12 | selection of Println | @@ -3258,6 +3268,7 @@ | stmts7.go:79:1:85:1 | Normal Exit | stmts7.go:79:1:85:1 | Exit | | stmts7.go:79:1:85:1 | function declaration | stmts7.go:79:1:85:1 | After function declaration | | stmts7.go:79:23:79:32 | panicEarly | stmts7.go:79:40:85:1 | block statement | +| stmts7.go:79:40:85:1 | After block statement | stmts7.go:79:1:85:1 | Normal Exit | | stmts7.go:79:40:85:1 | block statement | stmts7.go:80:2:82:2 | if statement | | stmts7.go:80:2:82:2 | After if statement | stmts7.go:83:2:83:21 | Before defer statement | | stmts7.go:80:2:82:2 | if statement | stmts7.go:80:5:80:14 | Before panicEarly | @@ -3285,7 +3296,7 @@ | stmts7.go:83:8:83:21 | After call to recoverPanic | stmts7.go:83:2:83:21 | defer statement | | stmts7.go:83:8:83:21 | call to recoverPanic | stmts7.go:83:8:83:19 | Before recoverPanic | | stmts7.go:83:8:83:21 | defer-invoke call to recoverPanic | stmts7.go:79:1:85:1 | Exceptional Exit | -| stmts7.go:83:8:83:21 | defer-invoke call to recoverPanic | stmts7.go:79:1:85:1 | Normal Exit | +| stmts7.go:83:8:83:21 | defer-invoke call to recoverPanic | stmts7.go:79:40:85:1 | After block statement | | stmts7.go:84:2:84:6 | After panic | stmts7.go:84:8:84:13 | Before "late" | | stmts7.go:84:2:84:6 | Before panic | stmts7.go:84:2:84:6 | panic | | stmts7.go:84:2:84:6 | panic | stmts7.go:84:2:84:6 | After panic | @@ -3651,6 +3662,7 @@ | stmts.go:65:1:72:1 | Normal Exit | stmts.go:65:1:72:1 | Exit | | stmts.go:65:1:72:1 | function declaration | stmts.go:65:1:72:1 | After function declaration | | stmts.go:65:12:65:12 | x | stmts.go:65:23:72:1 | block statement | +| stmts.go:65:23:72:1 | After block statement | stmts.go:65:1:72:1 | Normal Exit | | stmts.go:65:23:72:1 | block statement | stmts.go:66:2:70:2 | if statement | | stmts.go:66:2:70:2 | After if statement | stmts.go:71:2:71:10 | Before return statement | | stmts.go:66:2:70:2 | if statement | stmts.go:66:5:66:9 | Before ...>... | @@ -3678,7 +3690,7 @@ | stmts.go:67:9:67:33 | function literal | stmts.go:67:9:67:33 | After function literal | | stmts.go:67:9:67:35 | After function call | stmts.go:67:3:67:35 | defer statement | | stmts.go:67:9:67:35 | defer-invoke function call | stmts.go:65:1:72:1 | Exceptional Exit | -| stmts.go:67:9:67:35 | defer-invoke function call | stmts.go:65:1:72:1 | Normal Exit | +| stmts.go:67:9:67:35 | defer-invoke function call | stmts.go:65:23:72:1 | After block statement | | stmts.go:67:9:67:35 | function call | stmts.go:67:9:67:33 | Before function literal | | stmts.go:67:16:67:33 | After block statement | stmts.go:67:9:67:33 | Normal Exit | | stmts.go:67:16:67:33 | block statement | stmts.go:67:18:67:31 | expression statement | @@ -3707,7 +3719,7 @@ | stmts.go:69:9:69:34 | function literal | stmts.go:69:9:69:34 | After function literal | | stmts.go:69:9:69:36 | After function call | stmts.go:69:3:69:36 | defer statement | | stmts.go:69:9:69:36 | defer-invoke function call | stmts.go:65:1:72:1 | Exceptional Exit | -| stmts.go:69:9:69:36 | defer-invoke function call | stmts.go:65:1:72:1 | Normal Exit | +| stmts.go:69:9:69:36 | defer-invoke function call | stmts.go:65:23:72:1 | After block statement | | stmts.go:69:9:69:36 | function call | stmts.go:69:9:69:34 | Before function literal | | stmts.go:69:16:69:34 | After block statement | stmts.go:69:9:69:34 | Normal Exit | | stmts.go:69:16:69:34 | block statement | stmts.go:69:18:69:32 | expression statement | diff --git a/go/ql/test/query-tests/InconsistentCode/UnhandledCloseWritableHandle/CONSISTENCY/CfgConsistency.expected b/go/ql/test/query-tests/InconsistentCode/UnhandledCloseWritableHandle/CONSISTENCY/CfgConsistency.expected index 5d575b21805f..2ce97565d12d 100644 --- a/go/ql/test/query-tests/InconsistentCode/UnhandledCloseWritableHandle/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/query-tests/InconsistentCode/UnhandledCloseWritableHandle/CONSISTENCY/CfgConsistency.expected @@ -1,9 +1,9 @@ consistencyOverview | multipleSuccessors | 6 | multipleSuccessors -| tests.go:94:30:105:1 | After block statement | successor | tests.go:94:1:105:1 | Normal Exit | -| tests.go:94:30:105:1 | After block statement | successor | tests.go:99:9:99:17 | defer-invoke call to Close | -| tests.go:107:31:120:1 | After block statement | successor | tests.go:107:1:120:1 | Normal Exit | -| tests.go:107:31:120:1 | After block statement | successor | tests.go:112:9:112:17 | defer-invoke call to Close | -| tests.go:122:46:137:1 | After block statement | successor | tests.go:122:1:137:1 | Normal Exit | -| tests.go:122:46:137:1 | After block statement | successor | tests.go:126:9:126:17 | defer-invoke call to Close | +| tests.go:96:2:104:2 | After if statement | successor | tests.go:94:30:105:1 | After block statement | +| tests.go:96:2:104:2 | After if statement | successor | tests.go:99:9:99:17 | defer-invoke call to Close | +| tests.go:119:2:119:6 | After ... = ... | successor | tests.go:107:31:120:1 | After block statement | +| tests.go:119:2:119:6 | After ... = ... | successor | tests.go:112:9:112:17 | defer-invoke call to Close | +| tests.go:124:2:136:2 | After if statement | successor | tests.go:122:46:137:1 | After block statement | +| tests.go:124:2:136:2 | After if statement | successor | tests.go:126:9:126:17 | defer-invoke call to Close | diff --git a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll index 54dfb5c6e127..24dadd4cd2f6 100644 --- a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll +++ b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll @@ -1221,24 +1221,6 @@ module Make0 Ast> { */ predicate endAbruptCompletion(AstNode ast, PreControlFlowNode n, AbruptCompletion c); - /** - * Holds if the language-specific implementation takes over the catching - * of the abrupt completion `completion` at the boundary of callable `c`. - * - * When this holds, the library's default routing of `completion` to the - * normal or exceptional exit node of `c` is suppressed, and the language - * is then responsible for catching `completion` itself via - * `endAbruptCompletion` (for example, to interpose a function epilogue - * such as Go's deferred calls between a `return` and the normal exit - * node). - * - * The default implementation does not override any completions, leaving - * the standard behaviour intact. - */ - default predicate overridesCallableEndAbruptCompletion(Callable c, AbruptCompletion completion) { - none() - } - /** * Holds if the language-specific implementation replaces the edge from * `source` to `target` for abrupt completion `completion` originating @@ -1258,59 +1240,15 @@ module Make0 Ast> { } /** - * Holds if `n` steps directly to the normal exit node (`normal = true`) - * or the exceptional exit node (`normal = false`) of callable `c`. - * - * By default the only node that reaches a callable's normal exit is the - * "after" node of its body. This predicate lets a language route the tail - * of a function epilogue (such as Go's result-read or deferred-call nodes) - * to the appropriate exit node, which is useful when the body cannot - * terminate normally (e.g. it always ends in a `return`) and therefore has - * no "after" node to anchor the epilogue on. - * - * The default implementation adds no such steps. - */ - default predicate callableExitStep(PreControlFlowNode n, Callable c, boolean normal) { - none() - } - - /** - * Holds if the language-specific implementation takes over the routing of - * the normal fall-through from callable `c`'s body to its normal exit - * node. - * - * When this holds, the library's default edge from the "after" node of - * `c`'s body to the normal exit node is suppressed, and the language is - * responsible for routing the fall-through to the normal exit itself (for - * example, to interpose a function-exit epilogue such as Go's deferred - * calls). This complements `callableExitStep`, which the language can use - * to add the replacement edge into the normal exit node. - * - * The default implementation does not override any fall-through edges. - */ - default predicate overridesCallableBodyExit(Callable c) { none() } - - /** - * Holds if there is a local non-abrupt step from `n1` to `n2` that forms - * part of a function-exit epilogue whose placement depends on - * reachability (such as Go's deferred calls, which run at function exit in - * last-in-first-out order, gated by whether their registration is - * reachable on the path to a given exit). + * Holds if there is an additional control-flow edge from `n1` to `n2` + * with successor type `t`. * - * Edges added here are included in the final control flow graph exactly - * like ordinary `step` edges, but they are *excluded* when the library - * computes the defer-free reachability exposed through - * `getASuccessorIgnoringDeferredExit`. This lets a language compute the - * reachability gate without observing the epilogue edges it is in the - * process of defining, avoiding a circularity. - * - * Each `deferExitStep` edge must be disjoint from every other `step` edge - * (i.e. a pair `(n1, n2)` that is a `deferExitStep` must not also arise - * from `step`), so that the defer-free reachability is well defined. - * - * The default implementation adds no such steps. + * This is useful for language-specific edges whose successor type cannot + * be inferred from their target node. */ - default predicate deferExitStep(PreControlFlowNode n1, PreControlFlowNode n2, SuccessorType t) { + default predicate additionalSuccessor( + PreControlFlowNode n1, PreControlFlowNode n2, SuccessorType t + ) { none() } @@ -1425,7 +1363,7 @@ module Make0 Ast> { Input2::endAbruptCompletion(ast, n, c) or exists(Callable callable | - not Input2::overridesCallableEndAbruptCompletion(callable, c) and + not Input2::endAbruptCompletion(ast, _, c) and (callableHasBodyPart(callable, ast) or callableHasParamDefault(callable, ast)) | c.getSuccessorType() instanceof ReturnSuccessor and @@ -1615,22 +1553,6 @@ module Make0 Ast> { /** Holds if there is a local non-abrupt step from `n1` to `n2`. */ private predicate explicitStep(PreControlFlowNode n1, PreControlFlowNode n2) { - explicitStepCommon(n1, n2) - or - Input2::deferExitStep(n1, n2, _) - } - - /** - * Holds if there is a local non-abrupt step from `n1` to `n2`, excluding - * the reachability-dependent function-exit epilogue edges contributed by - * `Input2::deferExitStep`. - * - * This is the basis for the defer-free reachability exposed through - * `getASuccessorIgnoringDeferredExit`, and it must not depend on - * `deferExitStep` (so that a language can compute the reachability gate - * for its `deferExitStep` edges without circularity). - */ - private predicate explicitStepCommon(PreControlFlowNode n1, PreControlFlowNode n2) { Input2::step(n1, n2) or exists(Callable c | @@ -1655,15 +1577,8 @@ module Make0 Ast> { ) or n1.isAfter(getBodyExit(c)) and - n2.(NormalExitNodeImpl).getEnclosingCallable() = c and - not Input2::overridesCallableBodyExit(c) - or - Input2::callableExitStep(n1, c, true) and n2.(NormalExitNodeImpl).getEnclosingCallable() = c or - Input2::callableExitStep(n1, c, false) and - n2.(ExceptionalExitNodeImpl).getEnclosingCallable() = c - or n1.(AnnotatedExitNodeImpl).getEnclosingCallable() = c and n2.(ExitNodeImpl).getEnclosingCallable() = c ) @@ -2081,11 +1996,6 @@ module Make0 Ast> { /** * Holds if `ast` does not have explicitly defined control flow steps * and therefore should use default left-to-right evaluation. - * - * This uses `explicitStepCommon` rather than `explicitStep` so that it - * does not depend on `Input2::deferExitStep` (whose edges never originate - * from a "before" node, so the two agree on `before` nodes anyway). This - * keeps the defer-free reachability independent of `deferExitStep`. */ private predicate defaultCfg(AstNode ast) { hasCfg(ast) and @@ -2093,7 +2003,7 @@ module Make0 Ast> { ( Input2::preservesDefaultControlFlow(ast) or - not explicitStepCommon(any(PreControlFlowNode n | n.isBefore(ast)), _) + not explicitStep(any(PreControlFlowNode n | n.isBefore(ast)), _) ) } @@ -2162,14 +2072,6 @@ module Make0 Ast> { explicitStep(n1, n2) or defaultStep(n1, n2) } - /** - * Holds if there is a local non-abrupt step from `n1` to `n2`, excluding - * the function-exit epilogue edges contributed by `Input2::deferExitStep`. - */ - private predicate stepIgnoringDeferExit(PreControlFlowNode n1, PreControlFlowNode n2) { - explicitStepCommon(n1, n2) or defaultStep(n1, n2) - } - /** * Holds if the execution of `ast` may result in an abrupt completion * `c` originating at `last`. @@ -2178,7 +2080,7 @@ module Make0 Ast> { // Require a predecessor as a coarse approximation of reachability. // In particular, this prevents a catch-all catch clause preceding a // finally block from adding exception edges out of the finally. - step(_, last) and + (step(_, last) or Input2::additionalSuccessor(_, last, _)) and beginAbruptCompletion(ast, last, c, _) or exists(AstNode child | @@ -2202,13 +2104,13 @@ module Make0 Ast> { } private predicate preSucc(PreControlFlowNode n1, PreControlFlowNode n2, SuccessorType t) { - Input2::deferExitStep(n1, n2, t) + Input2::additionalSuccessor(n1, n2, t) or - stepIgnoringDeferExit(n1, n2) and n2 = TAfterValueNode(_, t) + step(n1, n2) and n2 = TAfterValueNode(_, t) or - stepIgnoringDeferExit(n1, n2) and n2.(AdditionalNode).getSuccessorType() = t + step(n1, n2) and n2.(AdditionalNode).getSuccessorType() = t or - stepIgnoringDeferExit(n1, n2) and + step(n1, n2) and not n2 instanceof AfterValueNode and not n2 instanceof AdditionalNode and t instanceof DirectSuccessor @@ -2236,45 +2138,6 @@ module Make0 Ast> { preSucc(n1, n2, t) } - /** - * Holds if `n2` is a normal successor of `n1` of type `t`, computed over - * the defer-free step relation `stepIgnoringDeferExit` (i.e. ignoring the - * epilogue edges added through `Input2::deferExitStep`). - * - * Abrupt-completion edges are deliberately omitted: this relation only - * needs to expose the normal control flow used to compute a language's - * reachability gate for its `deferExitStep` edges. - */ - private predicate preSuccIgnoringDeferExit( - PreControlFlowNode n1, PreControlFlowNode n2, SuccessorType t - ) { - stepIgnoringDeferExit(n1, n2) and n2 = TAfterValueNode(_, t) - or - stepIgnoringDeferExit(n1, n2) and n2.(AdditionalNode).getSuccessorType() = t - or - stepIgnoringDeferExit(n1, n2) and - not n2 instanceof AfterValueNode and - not n2 instanceof AdditionalNode and - t instanceof DirectSuccessor - } - - /** - * Holds if `n2` is a successor of `n1` of type `t`, ignoring the - * epilogue edges added through `Input2::deferExitStep`. - * - * This exposes the defer-free reachability that a language needs in order - * to compute the reachability gate for its `deferExitStep` edges without - * observing those edges. It is typed over `PreControlFlowNode` (rather - * than the reachability-restricted `ControlFlowNode`) so that a language - * can use it to compute `deferExitStep` without a non-monotonic cycle - * through `reachable`. - */ - cached - predicate succIgnoringDeferExit(PreControlFlowNode n1, PreControlFlowNode n2, SuccessorType t) { - Input1::cfgCachedStageRef() and - preSuccIgnoringDeferExit(n1, n2, t) - } - /** The cached stage of the control flow graph. */ cached module CfgCachedStage { @@ -2289,8 +2152,7 @@ module Make0 Ast> { (simpleLeafNode(_) implies any()) and (exists(TBeforeNode(_)) implies any()) and (reachable(_) implies any()) and - (succ(_, _, _) implies any()) and - (succIgnoringDeferExit(_, _, _) implies any()) + (succ(_, _, _) implies any()) } } @@ -2314,19 +2176,6 @@ module Make0 Ast> { /** Gets an immediate successor of this node, if this is not an `ExitNode`. */ ControlFlowNode getASuccessor() { result = this.getASuccessor(_) } - /** - * Gets an immediate successor of this node, ignoring the - * reachability-dependent function-exit epilogue edges added through - * `deferExitStep` (such as Go's deferred calls). - * - * This is intended for languages that need to compute reachability - * before those epilogue edges are added; it should not be used as a - * general successor relation. - */ - ControlFlowNode getASuccessorIgnoringDeferredExit() { - succIgnoringDeferExit(this, result, _) - } - /** Gets an immediate predecessor of this node, if this is not an `EntryNode`. */ ControlFlowNode getAPredecessor() { result.getASuccessor() = this } From 85fb77e90e34ac08bf55e128d0cedb3c0b7e1a0e Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 19 Aug 2026 11:43:57 +0100 Subject: [PATCH 0999/2098] Address more review comments --- .../go/controlflow/ControlFlowGraphShared.qll | 96 +++++++------------ go/ql/lib/semmle/go/controlflow/IR.qll | 63 +++--------- 2 files changed, 45 insertions(+), 114 deletions(-) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll index 1fce1a4fff19..2f2c9f254c09 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll @@ -1057,8 +1057,6 @@ module CfgImpl { additional predicate step(PreControlFlowNode n1, PreControlFlowNode n2) { rangeStmtStep(n1, n2) or selectStmtStep(n1, n2) or - deferStmtStep(n1, n2) or - goStmtStep(n1, n2) or assignmentStep(n1, n2) or incDecStep(n1, n2) or returnStep(n1, n2) or @@ -1129,7 +1127,7 @@ module CfgImpl { | epilogueStep(assgn, n1, n2) or - // Last epilogue → after the assignment + // Last epilogue -> after the assignment n1.isAdditional(assgn, getLastEpilogueTag(assgn)) and n2.isAfter(assgn) ) @@ -1204,13 +1202,7 @@ module CfgImpl { } private string getRankedEpilogueTag(Ast::AstNode node, int rnk) { - result = - rank[rnk](string tag, int ord | - tag = getEpilogueTag(node, ord) and - exists(tag) - | - tag order by ord - ) + result = rank[rnk](string tag, int ord | tag = getEpilogueTag(node, ord) | tag order by ord) } private string getFirstEpilogueTag(Ast::AstNode node) { result = getRankedEpilogueTag(node, 1) } @@ -1230,7 +1222,7 @@ module CfgImpl { } /** - * Increment/decrement: operand → compound-rhs → After(stmt). + * Increment/decrement: operand -> compound-rhs -> After(stmt). * * `x++` is modelled just like the compound assignment `x += 1`: a single * `compound-rhs` node computes the updated value and writes it back to the @@ -1239,13 +1231,10 @@ module CfgImpl { */ private predicate incDecStep(PreControlFlowNode n1, PreControlFlowNode n2) { exists(Go::IncDecStmt s | - // Before → Before operand n1.isBefore(s) and n2.isBefore(s.getOperand()) or - // After operand → compound-rhs (the update value + write) n1.isAfter(s.getOperand()) and n2.isAdditional(s, "compound-rhs") or - // compound-rhs → After(stmt) n1.isAdditional(s, "compound-rhs") and n2.isAfter(s) ) } @@ -1258,7 +1247,7 @@ module CfgImpl { exists(Go::ReturnStmt ret | epilogueStep(ret, n1, n2) or - // Last return epilogue → return node + // Last return epilogue -> return node n1.isAdditional(ret, getLastEpilogueTag(ret)) and n2.isIn(ret) ) @@ -1267,8 +1256,8 @@ module CfgImpl { /** * Call with spread arguments, e.g. `f(g())` where the inner call `g` * returns multiple results that are passed as the arguments of the outer - * call `f`: evaluate the children (callee and inner call), extract each - * tuple element of the inner call's result, then invoke the outer call. + * call `f`: evaluate the function expression and argument call, extract + * each tuple element of the argument's result, then invoke the outer call. * * The tuple-extraction nodes are additional nodes (see * `extractNodeCondition`); without wiring them into the control flow they @@ -1277,18 +1266,17 @@ module CfgImpl { private predicate callExprStep(PreControlFlowNode n1, PreControlFlowNode n2) { exists(Go::CallExpr call | // Restrict to ordinary invoked calls; the calls of `defer`/`go` - // statements are evaluated in place but invoked later / concurrently, - // and are handled by `deferStmtStep`/`goStmtStep` instead. + // statements do not use this tuple-extraction override. not call = any(Go::DeferStmt s).getCall() and not call = any(Go::GoStmt s).getCall() and extractNodeCondition(call, _) | epilogueStep(call, n1, n2) or - // Last tuple-extraction node → the call's invocation node + // Last tuple-extraction node -> the call's invocation node n1.isAdditional(call, getLastEpilogueTag(call)) and n2.isIn(call) or - // Invocation node → after the call (unless the call never returns normally) + // Invocation node -> after the call (unless the call never returns normally) n1.isIn(call) and n2.isAfter(call) and not beginAbruptCompletion(call, n1, _, true) @@ -1296,7 +1284,7 @@ module CfgImpl { } /** - * Index expression: base → implicit-deref? → index → In(indexExpr) + * Index expression: base -> implicit-deref? -> index -> In(indexExpr) */ private predicate indexExprStep(PreControlFlowNode n1, PreControlFlowNode n2) { exists(Go::IndexExpr ie | @@ -1347,7 +1335,7 @@ module CfgImpl { } /** - * Slice expression: base → implicit-deref? → low? → high? → max? → In(sliceExpr). + * Slice expression: base -> implicit-deref? -> low? -> high? -> max? -> In(sliceExpr). * * Missing (implicit) bounds have no control-flow node of their own; the * implicit lower bound of `0` is modelled as a constant on the @@ -1357,7 +1345,7 @@ module CfgImpl { exists(Go::SliceExpr se | n1.isBefore(se) and n2.isBefore(se.getBase()) or - // After base → implicit deref, or (if none) the first present bound / slice eval + // After base -> implicit deref, or (if none) the first present bound / slice eval n1.isAfter(se.getBase()) and ( if implicitDerefCondition(se.getBase()) @@ -1367,7 +1355,7 @@ module CfgImpl { or n1.isAdditional(se.getBase(), "implicit-deref") and sliceNext(se, -1, n2) or - // After a present bound → the next present bound / slice eval + // After a present bound -> the next present bound / slice eval n1.isAfter(se.getLow()) and sliceNext(se, 0, n2) or n1.isAfter(se.getHigh()) and sliceNext(se, 1, n2) @@ -1379,8 +1367,8 @@ module CfgImpl { } /** - * Selector expression with value base: base → implicit-deref? → - * implicit-field-selections → In(selector) + * Selector expression with value base: base -> implicit-deref? -> + * implicit-field-selections -> In(selector) */ private predicate selectorExprStep(PreControlFlowNode n1, PreControlFlowNode n2) { exists(Go::SelectorExpr sel | @@ -1393,7 +1381,7 @@ module CfgImpl { ( n1.isBefore(sel) and n2.isBefore(sel.getBase()) or - // After base (no implicit-deref) → first implicit-field or In(sel) + // After base (no implicit-deref) -> first implicit-field or In(sel) n1.isAfter(sel.getBase()) and not implicitDerefCondition(sel.getBase()) and ( @@ -1407,12 +1395,12 @@ module CfgImpl { not implicitFieldSelection(sel, _, _) and n2.isIn(sel) ) or - // After base (has implicit-deref) → implicit-deref node + // After base (has implicit-deref) -> implicit-deref node n1.isAfter(sel.getBase()) and implicitDerefCondition(sel.getBase()) and n2.isAdditional(sel.getBase(), "implicit-deref") or - // After implicit-deref → first implicit-field or In(sel) + // After implicit-deref -> first implicit-field or In(sel) n1.isAdditional(sel.getBase(), "implicit-deref") and ( exists(int maxIdx | @@ -1432,7 +1420,7 @@ module CfgImpl { n2.isAdditional(sel, "implicit-field:" + (i - 1).toString()) ) or - // Last implicit field read (index 1) → In(sel) + // Last implicit field read (index 1) -> In(sel) implicitFieldSelection(sel, 1, _) and n1.isAdditional(sel, "implicit-field:1") and n2.isIn(sel) @@ -1443,16 +1431,16 @@ module CfgImpl { } /** - * Composite literal: In(lit) → element-init chain → After(lit) + * Composite literal: In(lit) -> element-init chain -> After(lit) * CompositeLit evaluates the literal (allocation) first (pre-order), * then initializes elements. */ private predicate compositeLitStep(PreControlFlowNode n1, PreControlFlowNode n2) { exists(Go::CompositeLit lit | - // Before → In (the literal allocation) + // Before -> In (the literal allocation) n1.isBefore(lit) and n2.isIn(lit) or - // In → first element, or After if no elements + // In -> first element, or After if no elements n1.isIn(lit) and ( n2.isBefore(lit.getElement(0)) @@ -1460,7 +1448,7 @@ module CfgImpl { not exists(lit.getElement(_)) and n2.isAfter(lit) ) or - // After element → lit-init → next element or After. + // After element -> lit-init -> next element or After. // Positional array/slice elements have an implicit index that is // modelled on the `lit-init` instruction itself (see // `IR::InitLiteralElementInstruction`) rather than as a separate node. @@ -1479,7 +1467,7 @@ module CfgImpl { } /** - * Send statement (outside select): channel → value → In(send) + * Send statement (outside select): channel -> value -> In(send) */ private predicate sendStmtStep(PreControlFlowNode n1, PreControlFlowNode n2) { exists(Go::SendStmt s | not s = any(Go::CommClause cc).getComm() | @@ -1656,33 +1644,13 @@ module CfgImpl { ) } - private predicate deferStmtStep(PreControlFlowNode n1, PreControlFlowNode n2) { - exists(Go::DeferStmt s | - n1.isBefore(s) and n2.isBefore(s.getCall()) - or - n1.isAfter(s.getCall()) and n2.isIn(s) - or - n1.isIn(s) and n2.isAfter(s) - ) - } - - private predicate goStmtStep(PreControlFlowNode n1, PreControlFlowNode n2) { - exists(Go::GoStmt s | - n1.isBefore(s) and n2.isBefore(s.getCall()) - or - n1.isAfter(s.getCall()) and n2.isIn(s) - or - n1.isIn(s) and n2.isAfter(s) - ) - } - /** * Function definition prologue and epilogue: * - Prologue: parameters are modelled as native CFG nodes by the shared - * library (Entry → param → ... → Before(body)). The remaining + * library (Entry -> param -> ... -> Before(body)). The remaining * prologue on Before(body) zero-initializes any named result - * variables: zero-init:0 → zero-init:1 → ... → first statement. - * - Epilogue: return → result-read:0 → result-read:1 → ... → result-read:last + * variables: zero-init:0 -> zero-init:1 -> ... -> first statement. + * - Epilogue: return -> result-read:0 -> result-read:1 -> ... -> result-read:last * * The last result-read node goes to `After(body)`, from which the shared * callable CFG continues to the normal exit. @@ -1698,16 +1666,16 @@ module CfgImpl { private predicate funcDefStep(PreControlFlowNode n1, PreControlFlowNode n2) { exists(Go::FuncDef fd | exists(fd.getBody()) | - // Before(body) → first result-var zero-init node. Parameters are + // Before(body) -> first result-var zero-init node. Parameters are // modelled as native CFG nodes by the shared library and route - // Entry → param → ... → Before(body) ahead of this point; the - // no-result-variable case (Before(body) → first statement) is handled + // Entry -> param -> ... -> Before(body) ahead of this point; the + // no-result-variable case (Before(body) -> first statement) is handled // by the shared library's default control flow. n1.isBefore(fd.getBody()) and exists(fd.getResultVar(0)) and n2.isAdditional(fd.getBody(), "zero-init:0") or - // zero-init:j → next: zero-init:(j+1), or Before(body). + // zero-init:j -> next: zero-init:(j+1), or Before(body). // The zero-init node also writes the result variable (see // `IR::EvalImplicitInitInstruction`), so there is no separate result-init node. exists(int j | exists(fd.getResultVar(j)) | @@ -1723,7 +1691,7 @@ module CfgImpl { ) ) or - // result-read:j → result-read:(j+1) + // result-read:j -> result-read:(j+1) exists(int j | exists(fd.getResultVar(j + 1)) | n1.isAdditional(fd.getBody(), "result-read:" + j.toString()) and n2.isAdditional(fd.getBody(), "result-read:" + (j + 1).toString()) diff --git a/go/ql/lib/semmle/go/controlflow/IR.qll b/go/ql/lib/semmle/go/controlflow/IR.qll index cb7186cdd6fe..0d96e345c04c 100644 --- a/go/ql/lib/semmle/go/controlflow/IR.qll +++ b/go/ql/lib/semmle/go/controlflow/IR.qll @@ -18,32 +18,6 @@ private import codeql.controlflow.SuccessorType /** Provides predicates and classes for working with IR constructs. */ module IR { - /** - * Holds if `e` is in a boolean conditional context, meaning its evaluation - * is split across branch successors rather than producing a single value. - * - * This mirrors the conditions under which the shared CFG library creates - * `TAfterValueNode`s instead of a single `TAfterNode` (see - * `inConditionalContext` in `shared/controlflow/.../ControlFlowGraph.qll`), - * restricted to the Go-relevant cases that affect `NotExpr` and - * `LogicalBinaryExpr`. - */ - private predicate isInBooleanCondContext(Expr e) { - e = any(IfStmt s).getCondition() - or - e = any(ForStmt s).getCond() - or - exists(ExpressionSwitchStmt ess | - not exists(ess.getExpr()) and e = ess.getACase().(CaseClause).getExpr(_) - ) - or - e = any(LogicalBinaryExpr be | isInBooleanCondContext(be)).getAnOperand() - or - e = any(NotExpr ne | isInBooleanCondContext(ne)).getOperand() - or - e = any(ParenExpr pe | isInBooleanCondContext(pe)).getExpr() - } - /** * Holds if `n` is the control-flow node representing a successful match of * the type-switch case clause `cc` that implicitly declares a variable. @@ -59,19 +33,13 @@ module IR { } /** - * Holds if `n` is a genuine boolean condition-guard node: an "after" node - * that records exactly one of the true/false outcomes of a boolean - * condition. - * - * The shared CFG library's `isAfterTrue`/`isAfterFalse` are deliberately - * permissive when used for step-endpoint matching: a plain "after" node (or - * a merged leaf node) satisfies both of them. A real guard node is - * distinguished by satisfying exactly one of them. + * Holds if `n` records a boolean outcome, or the matching outcome of an + * expressionless switch case condition. */ private predicate isConditionGuardNode(ControlFlow::Node n) { - n.isAfterTrue(_) and not n.isAfterFalse(_) + n.isAfterTrue(_) or - n.isAfterFalse(_) and not n.isAfterTrue(_) + n.isAfterFalse(_) or exists(Expr condition, MatchingSuccessor successor | condition = @@ -97,16 +65,13 @@ module IR { typeSwitchCaseMatch(this, _) or // `NotExpr` and `LogicalBinaryExpr` are not in `postOrInOrder`, so they - // have no `isIn` node. When such an expression is not in a conditional - // context (so it has a single combined after-node rather than per-branch - // value-after-nodes), use that after-node as the value-producing - // instruction. In conditional contexts the value is already split - // across branches and the `ConditionGuardInstruction` for each branch - // captures the outcome, so no separate value instruction is needed. + // have no `isIn` node. Use their combined after-node as the value-producing + // instruction, but not a value-specific after-node, which is already a + // `ConditionGuardInstruction`. exists(Expr e | (e instanceof NotExpr or e instanceof LogicalBinaryExpr) and - not isInBooleanCondContext(e) and - this.isAfter(e) + this.isAfter(e) and + not this.isAfterValue(e, _) ) or // A named parameter is represented by a single CFG node (the merged @@ -247,14 +212,12 @@ module IR { // `postOrInOrder`, so they don't have an `isIn` node; their value is // produced by the after-node. (Constant ones are folded and get a leaf // `isIn` node via `constRoot`, handled by the first disjunct above, so - // they are excluded here to avoid a duplicate value node.) Only use the - // after-node when the expression is not in a conditional context; - // otherwise the value is split across `TAfterValueNode`s per branch and - // should not be exposed as a single value-producing instruction. + // they are excluded here to avoid a duplicate value node.) Value-specific + // after-nodes are condition guards rather than expression evaluations. (e instanceof NotExpr or e instanceof LogicalBinaryExpr) and not e.isConst() and - not isInBooleanCondContext(e) and - this.isAfter(e) + this.isAfter(e) and + not this.isAfterValue(_, _) } /** Gets the expression underlying this instruction. */ From f3449443b82e54d3794c919bcfdee39a7e853791 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 19 Aug 2026 12:50:33 +0100 Subject: [PATCH 1000/2098] Change CompoundAssignStmt and IncDecStmt --- .../go/controlflow/ControlFlowGraphShared.qll | 49 +++---------- go/ql/lib/semmle/go/controlflow/IR.qll | 10 +-- .../semmle/go/Scopes/EntityWrite.expected | 2 +- .../ControlFlowNode_getASuccessor.expected | 72 +++++++++---------- .../dataflow/FlowSteps/LocalFlowStep.expected | 6 +- .../FunctionOutput_getEntryNode.expected | 2 +- .../Nodes/BinaryOperationNodes.expected | 2 +- .../semmle/go/dataflow/SSA/VarDefs.expected | 6 +- .../OpenUrlRedirect/OpenUrlRedirect.expected | 6 +- 9 files changed, 61 insertions(+), 94 deletions(-) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll index 2f2c9f254c09..3005619e9194 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll @@ -499,6 +499,10 @@ module CfgImpl { or n instanceof Go::GoStmt or + n instanceof Go::CompoundAssignStmt + or + n instanceof Go::IncDecStmt + or n instanceof Go::SelectStmt or n instanceof Go::SendStmt @@ -513,9 +517,9 @@ module CfgImpl { exists(int i | ( notBlankIdent(n.(Go::Assignment).getLhs(i)) and - // A compound assignment (`x += y`) folds its write into the - // `compound-rhs` binary-operation instruction rather than emitting a - // separate `assign:i` write node (see + // A compound assignment (`x += y`) performs its write at its + // post-order operation node rather than emitting a separate + // `assign:i` write node (see // `IR::EvalCompoundAssignRhsInstruction`). not n instanceof Go::CompoundAssignStmt and // The `y := x.(type)` test statement of a type switch is transparent @@ -542,9 +546,6 @@ module CfgImpl { // Get the next key-value pair produced by a `range` statement. n instanceof Go::RangeElementExpr and tag = "next" or - // Compound assignment implicit RHS - n instanceof Go::CompoundAssignStmt and tag = "compound-rhs" - or // Tuple extraction nodes exists(int i | extractNodeCondition(n, i) and @@ -559,11 +560,6 @@ module CfgImpl { tag = "zero-init:" + i.toString() ) or - // Increment/decrement: a single node computes `operand + 1` (or `- 1`) - // and writes it back, modelled the same as a compound assignment's - // `compound-rhs` node (see `IR::EvalCompoundAssignRhsInstruction`). - n instanceof Go::IncDecStmt and tag = "compound-rhs" - or // Result write nodes in return statements exists(int i, Go::ReturnStmt ret | n = ret and @@ -1058,7 +1054,6 @@ module CfgImpl { rangeStmtStep(n1, n2) or selectStmtStep(n1, n2) or assignmentStep(n1, n2) or - incDecStep(n1, n2) or returnStep(n1, n2) or callExprStep(n1, n2) or indexExprStep(n1, n2) or @@ -1110,8 +1105,7 @@ module CfgImpl { /** * Assignment flow: routes through LHS/RHS children, then through - * additional nodes for compound-rhs, extract, zero-init, and assign - * operations. + * additional nodes for extract, zero-init, and assign operations. */ private predicate assignmentStep(PreControlFlowNode n1, PreControlFlowNode n2) { exists(Ast::AstNode assgn | @@ -1144,11 +1138,6 @@ module CfgImpl { /** Gets an assignment epilogue tag and its order. */ private string getAssignmentEpilogueTag(Ast::AstNode assgn, int ord) { - // Compound RHS comes first - assgn instanceof Go::CompoundAssignStmt and - ord = -1 and - result = "compound-rhs" - or exists(int j | ( exists(Go::ValueSpec spec | @@ -1161,8 +1150,8 @@ module CfgImpl { or ( notBlankIdent(assgn.(Go::Assignment).getLhs(j)) and - // Compound assignments fold their write into `compound-rhs` (ord -1) - // above, so they emit no separate `assign:j` node. + // Compound assignments perform their write at their post-order + // operation node, so they emit no separate `assign:j` node. not assgn instanceof Go::CompoundAssignStmt and // Tuple-destructuring targets are written by their `extract` node. not extractNodeCondition(assgn, j) @@ -1221,24 +1210,6 @@ module CfgImpl { ) } - /** - * Increment/decrement: operand -> compound-rhs -> After(stmt). - * - * `x++` is modelled just like the compound assignment `x += 1`: a single - * `compound-rhs` node computes the updated value and writes it back to the - * operand (see `IR::EvalCompoundAssignRhsInstruction`). The implicit constant - * `1` is modelled directly on that node rather than as its own node. - */ - private predicate incDecStep(PreControlFlowNode n1, PreControlFlowNode n2) { - exists(Go::IncDecStmt s | - n1.isBefore(s) and n2.isBefore(s.getOperand()) - or - n1.isAfter(s.getOperand()) and n2.isAdditional(s, "compound-rhs") - or - n1.isAdditional(s, "compound-rhs") and n2.isAfter(s) - ) - } - /** * Return statement: evaluate expressions, extract tuples, write results, * then the return node. diff --git a/go/ql/lib/semmle/go/controlflow/IR.qll b/go/ql/lib/semmle/go/controlflow/IR.qll index 0d96e345c04c..39492830bcdb 100644 --- a/go/ql/lib/semmle/go/controlflow/IR.qll +++ b/go/ql/lib/semmle/go/controlflow/IR.qll @@ -656,7 +656,7 @@ module IR { AstNode s; EvalCompoundAssignRhsInstruction() { - this.isAdditional(s, "compound-rhs") and + this.isIn(s) and (s instanceof CompoundAssignStmt or s instanceof IncDecStmt) } @@ -1070,13 +1070,9 @@ module IR { ) ) or - exists(CompoundAssignStmt ca | write.isAdditional(ca, "compound-rhs") | - lhs = ca.getLhs().stripParens() - ) + exists(CompoundAssignStmt ca | write.isIn(ca) | lhs = ca.getLhs().stripParens()) or - exists(IncDecStmt ids | write.isAdditional(ids, "compound-rhs") | - lhs = ids.getOperand().stripParens() - ) + exists(IncDecStmt ids | write.isIn(ids) | lhs = ids.getOperand().stripParens()) or exists(FuncDef fd, int idx | write.isBefore(fd.getParameter(idx).getDeclaration()) and diff --git a/go/ql/test/library-tests/semmle/go/Scopes/EntityWrite.expected b/go/ql/test/library-tests/semmle/go/Scopes/EntityWrite.expected index 93d3a7f405db..ed3af2c6ddff 100644 --- a/go/ql/test/library-tests/semmle/go/Scopes/EntityWrite.expected +++ b/go/ql/test/library-tests/semmle/go/Scopes/EntityWrite.expected @@ -1,4 +1,4 @@ -| main.go:6:2:6:2 | x | main.go:24:2:24:9 | compound-rhs increment statement | +| main.go:6:2:6:2 | x | main.go:24:2:24:9 | increment statement | | main.go:13:7:13:10 | recv | main.go:13:7:13:10 | recv | | main.go:17:10:17:10 | x | main.go:17:10:17:10 | x | | main.go:17:26:17:26 | y | main.go:17:26:17:26 | y | diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected index 0e9990b47444..add1549a7df6 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected @@ -1261,7 +1261,7 @@ | exprs.go:49:30:54:1 | result-read:0 block statement | exprs.go:49:30:54:1 | After block statement | | exprs.go:49:30:54:1 | zero-init:0 block statement | exprs.go:50:2:52:2 | for statement | | exprs.go:50:2:52:2 | After for statement | exprs.go:53:2:53:7 | Before return statement | -| exprs.go:50:2:52:2 | [LoopHeader] for statement | exprs.go:50:27:50:29 | increment statement | +| exprs.go:50:2:52:2 | [LoopHeader] for statement | exprs.go:50:27:50:29 | Before increment statement | | exprs.go:50:2:52:2 | for statement | exprs.go:50:6:50:11 | ... := ... | | exprs.go:50:6:50:11 | ... := ... | exprs.go:50:11:50:11 | Before 0 | | exprs.go:50:6:50:11 | After ... := ... | exprs.go:50:14:50:24 | Before ...<... | @@ -1286,24 +1286,24 @@ | exprs.go:50:22:50:23 | After xs | exprs.go:50:18:50:24 | call to len | | exprs.go:50:22:50:23 | Before xs | exprs.go:50:22:50:23 | xs | | exprs.go:50:22:50:23 | xs | exprs.go:50:22:50:23 | After xs | -| exprs.go:50:27:50:27 | After i | exprs.go:50:27:50:29 | compound-rhs increment statement | +| exprs.go:50:27:50:27 | After i | exprs.go:50:27:50:29 | increment statement | | exprs.go:50:27:50:27 | Before i | exprs.go:50:27:50:27 | i | | exprs.go:50:27:50:27 | i | exprs.go:50:27:50:27 | After i | | exprs.go:50:27:50:29 | After increment statement | exprs.go:50:14:50:24 | Before ...<... | -| exprs.go:50:27:50:29 | compound-rhs increment statement | exprs.go:50:27:50:29 | After increment statement | -| exprs.go:50:27:50:29 | increment statement | exprs.go:50:27:50:27 | Before i | +| exprs.go:50:27:50:29 | Before increment statement | exprs.go:50:27:50:27 | Before i | +| exprs.go:50:27:50:29 | increment statement | exprs.go:50:27:50:29 | After increment statement | | exprs.go:50:31:52:2 | After block statement | exprs.go:50:2:52:2 | [LoopHeader] for statement | -| exprs.go:50:31:52:2 | block statement | exprs.go:51:3:51:14 | ... += ... | +| exprs.go:50:31:52:2 | block statement | exprs.go:51:3:51:14 | Before ... += ... | | exprs.go:51:3:51:5 | After res | exprs.go:51:10:51:14 | Before index expression | | exprs.go:51:3:51:5 | Before res | exprs.go:51:3:51:5 | res | | exprs.go:51:3:51:5 | res | exprs.go:51:3:51:5 | After res | -| exprs.go:51:3:51:14 | ... += ... | exprs.go:51:3:51:5 | Before res | +| exprs.go:51:3:51:14 | ... += ... | exprs.go:51:3:51:14 | After ... += ... | | exprs.go:51:3:51:14 | After ... += ... | exprs.go:50:31:52:2 | After block statement | -| exprs.go:51:3:51:14 | compound-rhs ... += ... | exprs.go:51:3:51:14 | After ... += ... | +| exprs.go:51:3:51:14 | Before ... += ... | exprs.go:51:3:51:5 | Before res | | exprs.go:51:10:51:11 | After xs | exprs.go:51:13:51:13 | Before i | | exprs.go:51:10:51:11 | Before xs | exprs.go:51:10:51:11 | xs | | exprs.go:51:10:51:11 | xs | exprs.go:51:10:51:11 | After xs | -| exprs.go:51:10:51:14 | After index expression | exprs.go:51:3:51:14 | compound-rhs ... += ... | +| exprs.go:51:10:51:14 | After index expression | exprs.go:51:3:51:14 | ... += ... | | exprs.go:51:10:51:14 | Before index expression | exprs.go:51:10:51:11 | Before xs | | exprs.go:51:10:51:14 | index expression | exprs.go:49:1:54:1 | Exceptional Exit | | exprs.go:51:10:51:14 | index expression | exprs.go:51:10:51:14 | After index expression | @@ -1897,15 +1897,15 @@ | main.go:16:5:16:10 | call to cond | main.go:16:5:16:10 | After call to cond [false] | | main.go:16:5:16:10 | call to cond | main.go:16:5:16:10 | After call to cond [true] | | main.go:16:12:18:2 | After block statement | main.go:16:2:18:2 | After if statement | -| main.go:16:12:18:2 | block statement | main.go:17:3:17:9 | ... += ... | +| main.go:16:12:18:2 | block statement | main.go:17:3:17:9 | Before ... += ... | | main.go:17:3:17:3 | After y | main.go:17:8:17:9 | Before 19 | | main.go:17:3:17:3 | Before y | main.go:17:3:17:3 | y | | main.go:17:3:17:3 | y | main.go:17:3:17:3 | After y | -| main.go:17:3:17:9 | ... += ... | main.go:17:3:17:3 | Before y | +| main.go:17:3:17:9 | ... += ... | main.go:17:3:17:9 | After ... += ... | | main.go:17:3:17:9 | After ... += ... | main.go:16:12:18:2 | After block statement | -| main.go:17:3:17:9 | compound-rhs ... += ... | main.go:17:3:17:9 | After ... += ... | +| main.go:17:3:17:9 | Before ... += ... | main.go:17:3:17:3 | Before y | | main.go:17:8:17:9 | 19 | main.go:17:8:17:9 | After 19 | -| main.go:17:8:17:9 | After 19 | main.go:17:3:17:9 | compound-rhs ... += ... | +| main.go:17:8:17:9 | After 19 | main.go:17:3:17:9 | ... += ... | | main.go:17:8:17:9 | Before 19 | main.go:17:8:17:9 | 19 | | main.go:19:2:19:10 | After selection of Print | main.go:19:12:19:12 | Before x | | main.go:19:2:19:10 | Before selection of Print | main.go:19:2:19:10 | selection of Print | @@ -2012,18 +2012,18 @@ | main.go:34:1:36:1 | function declaration | main.go:34:1:36:1 | After function declaration | | main.go:34:11:34:11 | x | main.go:34:19:36:1 | block statement | | main.go:34:19:36:1 | After block statement | main.go:34:1:36:1 | Normal Exit | -| main.go:34:19:36:1 | block statement | main.go:35:2:35:9 | ... += ... | +| main.go:34:19:36:1 | block statement | main.go:35:2:35:9 | Before ... += ... | | main.go:35:2:35:3 | After star expression | main.go:35:8:35:9 | Before 19 | | main.go:35:2:35:3 | Before star expression | main.go:35:3:35:3 | Before x | | main.go:35:2:35:3 | star expression | main.go:35:2:35:3 | After star expression | -| main.go:35:2:35:9 | ... += ... | main.go:35:2:35:3 | Before star expression | +| main.go:35:2:35:9 | ... += ... | main.go:35:2:35:9 | After ... += ... | | main.go:35:2:35:9 | After ... += ... | main.go:34:19:36:1 | After block statement | -| main.go:35:2:35:9 | compound-rhs ... += ... | main.go:35:2:35:9 | After ... += ... | +| main.go:35:2:35:9 | Before ... += ... | main.go:35:2:35:3 | Before star expression | | main.go:35:3:35:3 | After x | main.go:35:2:35:3 | star expression | | main.go:35:3:35:3 | Before x | main.go:35:3:35:3 | x | | main.go:35:3:35:3 | x | main.go:35:3:35:3 | After x | | main.go:35:8:35:9 | 19 | main.go:35:8:35:9 | After 19 | -| main.go:35:8:35:9 | After 19 | main.go:35:2:35:9 | compound-rhs ... += ... | +| main.go:35:8:35:9 | After 19 | main.go:35:2:35:9 | ... += ... | | main.go:35:8:35:9 | Before 19 | main.go:35:8:35:9 | 19 | | main.go:38:1:45:1 | After function declaration | main.go:47:1:50:1 | Before function declaration | | main.go:38:1:45:1 | Before function declaration | main.go:38:1:45:1 | function declaration | @@ -2213,7 +2213,7 @@ | main.go:73:7:73:7 | After 1 | main.go:73:2:73:7 | assign:0 ... := ... | | main.go:73:7:73:7 | Before 1 | main.go:73:7:73:7 | 1 | | main.go:74:2:79:2 | After for statement | main.go:80:2:80:13 | expression statement | -| main.go:74:2:79:2 | [LoopHeader] for statement | main.go:74:16:74:18 | increment statement | +| main.go:74:2:79:2 | [LoopHeader] for statement | main.go:74:16:74:18 | Before increment statement | | main.go:74:2:79:2 | for statement | main.go:74:6:74:11 | ... := ... | | main.go:74:6:74:11 | ... := ... | main.go:74:11:74:11 | Before 0 | | main.go:74:6:74:11 | After ... := ... | main.go:74:20:79:2 | block statement | @@ -2221,12 +2221,12 @@ | main.go:74:11:74:11 | 0 | main.go:74:11:74:11 | After 0 | | main.go:74:11:74:11 | After 0 | main.go:74:6:74:11 | assign:0 ... := ... | | main.go:74:11:74:11 | Before 0 | main.go:74:11:74:11 | 0 | -| main.go:74:16:74:16 | After i | main.go:74:16:74:18 | compound-rhs increment statement | +| main.go:74:16:74:16 | After i | main.go:74:16:74:18 | increment statement | | main.go:74:16:74:16 | Before i | main.go:74:16:74:16 | i | | main.go:74:16:74:16 | i | main.go:74:16:74:16 | After i | | main.go:74:16:74:18 | After increment statement | main.go:74:20:79:2 | block statement | -| main.go:74:16:74:18 | compound-rhs increment statement | main.go:74:16:74:18 | After increment statement | -| main.go:74:16:74:18 | increment statement | main.go:74:16:74:16 | Before i | +| main.go:74:16:74:18 | Before increment statement | main.go:74:16:74:16 | Before i | +| main.go:74:16:74:18 | increment statement | main.go:74:16:74:18 | After increment statement | | main.go:74:20:79:2 | After block statement | main.go:74:2:79:2 | [LoopHeader] for statement | | main.go:74:20:79:2 | block statement | main.go:75:3:77:3 | if statement | | main.go:75:3:77:3 | After if statement | main.go:78:3:78:7 | ... = ... | @@ -2268,7 +2268,7 @@ | main.go:82:7:82:7 | After 1 | main.go:82:2:82:7 | assign:0 ... := ... | | main.go:82:7:82:7 | Before 1 | main.go:82:7:82:7 | 1 | | main.go:83:2:88:2 | After for statement | main.go:89:2:89:13 | expression statement | -| main.go:83:2:88:2 | [LoopHeader] for statement | main.go:83:16:83:18 | increment statement | +| main.go:83:2:88:2 | [LoopHeader] for statement | main.go:83:16:83:18 | Before increment statement | | main.go:83:2:88:2 | for statement | main.go:83:6:83:11 | ... := ... | | main.go:83:6:83:11 | ... := ... | main.go:83:11:83:11 | Before 0 | | main.go:83:6:83:11 | After ... := ... | main.go:83:20:88:2 | block statement | @@ -2276,12 +2276,12 @@ | main.go:83:11:83:11 | 0 | main.go:83:11:83:11 | After 0 | | main.go:83:11:83:11 | After 0 | main.go:83:6:83:11 | assign:0 ... := ... | | main.go:83:11:83:11 | Before 0 | main.go:83:11:83:11 | 0 | -| main.go:83:16:83:16 | After i | main.go:83:16:83:18 | compound-rhs increment statement | +| main.go:83:16:83:16 | After i | main.go:83:16:83:18 | increment statement | | main.go:83:16:83:16 | Before i | main.go:83:16:83:16 | i | | main.go:83:16:83:16 | i | main.go:83:16:83:16 | After i | | main.go:83:16:83:18 | After increment statement | main.go:83:20:88:2 | block statement | -| main.go:83:16:83:18 | compound-rhs increment statement | main.go:83:16:83:18 | After increment statement | -| main.go:83:16:83:18 | increment statement | main.go:83:16:83:16 | Before i | +| main.go:83:16:83:18 | Before increment statement | main.go:83:16:83:16 | Before i | +| main.go:83:16:83:18 | increment statement | main.go:83:16:83:18 | After increment statement | | main.go:83:20:88:2 | After block statement | main.go:83:2:88:2 | [LoopHeader] for statement | | main.go:83:20:88:2 | block statement | main.go:84:3:84:7 | ... = ... | | main.go:84:3:84:7 | ... = ... | main.go:84:7:84:7 | Before 2 | @@ -2812,17 +2812,17 @@ | stmts5.go:7:7:7:8 | me | stmts5.go:7:22:7:26 | other | | stmts5.go:7:22:7:26 | other | stmts5.go:7:33:9:1 | block statement | | stmts5.go:7:33:9:1 | After block statement | stmts5.go:7:1:9:1 | Normal Exit | -| stmts5.go:7:33:9:1 | block statement | stmts5.go:8:2:8:16 | ... += ... | +| stmts5.go:7:33:9:1 | block statement | stmts5.go:8:2:8:16 | Before ... += ... | | stmts5.go:8:2:8:3 | After me | stmts5.go:8:2:8:7 | selection of val | | stmts5.go:8:2:8:3 | Before me | stmts5.go:8:2:8:3 | me | | stmts5.go:8:2:8:3 | me | stmts5.go:8:2:8:3 | After me | | stmts5.go:8:2:8:7 | After selection of val | stmts5.go:8:12:8:16 | Before other | | stmts5.go:8:2:8:7 | Before selection of val | stmts5.go:8:2:8:3 | Before me | | stmts5.go:8:2:8:7 | selection of val | stmts5.go:8:2:8:7 | After selection of val | -| stmts5.go:8:2:8:16 | ... += ... | stmts5.go:8:2:8:7 | Before selection of val | +| stmts5.go:8:2:8:16 | ... += ... | stmts5.go:8:2:8:16 | After ... += ... | | stmts5.go:8:2:8:16 | After ... += ... | stmts5.go:7:33:9:1 | After block statement | -| stmts5.go:8:2:8:16 | compound-rhs ... += ... | stmts5.go:8:2:8:16 | After ... += ... | -| stmts5.go:8:12:8:16 | After other | stmts5.go:8:2:8:16 | compound-rhs ... += ... | +| stmts5.go:8:2:8:16 | Before ... += ... | stmts5.go:8:2:8:7 | Before selection of val | +| stmts5.go:8:12:8:16 | After other | stmts5.go:8:2:8:16 | ... += ... | | stmts5.go:8:12:8:16 | Before other | stmts5.go:8:12:8:16 | other | | stmts5.go:8:12:8:16 | other | stmts5.go:8:12:8:16 | After other | | stmts5.go:11:1:12:1 | After function declaration | stmts5.go:0:0:0:0 | After stmts5.go | @@ -3180,7 +3180,7 @@ | stmts7.go:64:31:68:1 | block statement | stmts7.go:65:2:67:2 | for statement | | stmts7.go:65:2:67:2 | After for statement | stmts7.go:64:31:68:1 | After block statement | | stmts7.go:65:2:67:2 | After for statement | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | -| stmts7.go:65:2:67:2 | [LoopHeader] for statement | stmts7.go:65:25:65:27 | increment statement | +| stmts7.go:65:2:67:2 | [LoopHeader] for statement | stmts7.go:65:25:65:27 | Before increment statement | | stmts7.go:65:2:67:2 | for statement | stmts7.go:65:6:65:11 | ... := ... | | stmts7.go:65:6:65:11 | ... := ... | stmts7.go:65:11:65:11 | Before 0 | | stmts7.go:65:6:65:11 | After ... := ... | stmts7.go:65:14:65:22 | Before ...<... | @@ -3199,12 +3199,12 @@ | stmts7.go:65:18:65:22 | After count | stmts7.go:65:14:65:22 | ...<... | | stmts7.go:65:18:65:22 | Before count | stmts7.go:65:18:65:22 | count | | stmts7.go:65:18:65:22 | count | stmts7.go:65:18:65:22 | After count | -| stmts7.go:65:25:65:25 | After i | stmts7.go:65:25:65:27 | compound-rhs increment statement | +| stmts7.go:65:25:65:25 | After i | stmts7.go:65:25:65:27 | increment statement | | stmts7.go:65:25:65:25 | Before i | stmts7.go:65:25:65:25 | i | | stmts7.go:65:25:65:25 | i | stmts7.go:65:25:65:25 | After i | | stmts7.go:65:25:65:27 | After increment statement | stmts7.go:65:14:65:22 | Before ...<... | -| stmts7.go:65:25:65:27 | compound-rhs increment statement | stmts7.go:65:25:65:27 | After increment statement | -| stmts7.go:65:25:65:27 | increment statement | stmts7.go:65:25:65:25 | Before i | +| stmts7.go:65:25:65:27 | Before increment statement | stmts7.go:65:25:65:25 | Before i | +| stmts7.go:65:25:65:27 | increment statement | stmts7.go:65:25:65:27 | After increment statement | | stmts7.go:65:29:67:2 | After block statement | stmts7.go:65:2:67:2 | [LoopHeader] for statement | | stmts7.go:65:29:67:2 | block statement | stmts7.go:66:3:66:22 | Before defer statement | | stmts7.go:66:3:66:22 | After defer statement | stmts7.go:65:29:67:2 | After block statement | @@ -3435,7 +3435,7 @@ | stmts.go:23:11:37:2 | After block statement | stmts.go:23:2:37:2 | [LoopHeader] for statement | | stmts.go:23:11:37:2 | block statement | stmts.go:24:3:36:3 | for statement | | stmts.go:24:3:36:3 | After for statement | stmts.go:23:11:37:2 | After block statement | -| stmts.go:24:3:36:3 | [LoopHeader] for statement | stmts.go:24:23:24:25 | increment statement | +| stmts.go:24:3:36:3 | [LoopHeader] for statement | stmts.go:24:23:24:25 | Before increment statement | | stmts.go:24:3:36:3 | for statement | stmts.go:24:7:24:12 | ... := ... | | stmts.go:24:7:24:12 | ... := ... | stmts.go:24:12:24:12 | Before 0 | | stmts.go:24:7:24:12 | After ... := ... | stmts.go:24:15:24:20 | Before ...<... | @@ -3454,12 +3454,12 @@ | stmts.go:24:19:24:20 | 10 | stmts.go:24:19:24:20 | After 10 | | stmts.go:24:19:24:20 | After 10 | stmts.go:24:15:24:20 | ...<... | | stmts.go:24:19:24:20 | Before 10 | stmts.go:24:19:24:20 | 10 | -| stmts.go:24:23:24:23 | After i | stmts.go:24:23:24:25 | compound-rhs increment statement | +| stmts.go:24:23:24:23 | After i | stmts.go:24:23:24:25 | increment statement | | stmts.go:24:23:24:23 | Before i | stmts.go:24:23:24:23 | i | | stmts.go:24:23:24:23 | i | stmts.go:24:23:24:23 | After i | | stmts.go:24:23:24:25 | After increment statement | stmts.go:24:15:24:20 | Before ...<... | -| stmts.go:24:23:24:25 | compound-rhs increment statement | stmts.go:24:23:24:25 | After increment statement | -| stmts.go:24:23:24:25 | increment statement | stmts.go:24:23:24:23 | Before i | +| stmts.go:24:23:24:25 | Before increment statement | stmts.go:24:23:24:23 | Before i | +| stmts.go:24:23:24:25 | increment statement | stmts.go:24:23:24:25 | After increment statement | | stmts.go:24:27:36:3 | block statement | stmts.go:25:4:35:4 | if statement | | stmts.go:25:4:35:4 | if statement | stmts.go:25:7:25:16 | ... := ... | | stmts.go:25:7:25:16 | ... := ... | stmts.go:25:12:25:16 | Before ...-... | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalFlowStep.expected b/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalFlowStep.expected index e615561bc816..5c4bd6cfcb2f 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalFlowStep.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/FlowSteps/LocalFlowStep.expected @@ -20,7 +20,7 @@ | main.go:15:9:15:9 | 0 | main.go:15:2:15:9 | SSA def(acc) | | main.go:16:9:19:2 | SSA def(acc) | main.go:17:3:17:5 | acc | | main.go:17:3:17:7 | SSA def(acc) | main.go:18:10:18:12 | acc | -| main.go:17:3:17:7 | compound-rhs increment statement | main.go:17:3:17:7 | SSA def(acc) | +| main.go:17:3:17:7 | increment statement | main.go:17:3:17:7 | SSA def(acc) | | main.go:22:12:22:12 | SSA def(b) | main.go:23:5:23:5 | b | | main.go:22:12:22:12 | b | main.go:22:12:22:12 | SSA def(b) | | main.go:22:20:22:20 | SSA def(x) | main.go:24:10:24:10 | x | @@ -57,12 +57,12 @@ | main.go:47:2:50:2 | SSA def(v) | main.go:48:11:48:11 | v | | main.go:47:2:50:2 | extract:0 range element | main.go:47:2:50:2 | SSA def(k) | | main.go:47:2:50:2 | extract:1 range element | main.go:47:2:50:2 | SSA def(v) | +| main.go:48:3:48:11 | ... += ... | main.go:48:3:48:11 | SSA def(vals) | | main.go:48:3:48:11 | SSA def(vals) | main.go:46:44:52:1 | result-read:1 block statement | | main.go:48:3:48:11 | SSA def(vals) | main.go:48:3:48:6 | vals | -| main.go:48:3:48:11 | compound-rhs ... += ... | main.go:48:3:48:11 | SSA def(vals) | +| main.go:49:3:49:11 | ... += ... | main.go:49:3:49:11 | SSA def(keys) | | main.go:49:3:49:11 | SSA def(keys) | main.go:46:44:52:1 | result-read:0 block statement | | main.go:49:3:49:11 | SSA def(keys) | main.go:49:3:49:6 | keys | -| main.go:49:3:49:11 | compound-rhs ... += ... | main.go:49:3:49:11 | SSA def(keys) | | main.go:55:6:55:17 | SSA def(ch) | main.go:56:2:56:3 | ch | | main.go:55:6:55:17 | zero-init:0 value declaration specifier | main.go:55:6:55:17 | SSA def(ch) | | main.go:56:2:56:3 | ch | main.go:57:4:57:5 | ch | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionOutput_getEntryNode.expected b/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionOutput_getEntryNode.expected index 6a386f44a9c0..ebe01f709c94 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionOutput_getEntryNode.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/FunctionOutput_getEntryNode.expected @@ -16,7 +16,7 @@ | result 1 | main.go:35:1:38:1 | function declaration | main.go:35:29:38:1 | zero-init:1 block statement | | result 1 | main.go:35:1:38:1 | function declaration | main.go:36:9:36:10 | 42 | | result 1 | main.go:40:1:48:1 | function declaration | main.go:40:33:48:1 | zero-init:1 block statement | -| result 1 | main.go:40:1:48:1 | function declaration | main.go:42:3:42:5 | compound-rhs increment statement | +| result 1 | main.go:40:1:48:1 | function declaration | main.go:42:3:42:5 | increment statement | | result 1 | main.go:40:1:48:1 | function declaration | main.go:45:13:45:13 | 1 | | result 1 | main.go:40:1:48:1 | function declaration | main.go:47:12:47:12 | 4 | | result 1 | tst2.go:8:1:12:1 | function declaration | tst2.go:11:12:11:14 | err | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/Nodes/BinaryOperationNodes.expected b/go/ql/test/library-tests/semmle/go/dataflow/Nodes/BinaryOperationNodes.expected index 4ae78d28fdb2..9315b269125d 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/Nodes/BinaryOperationNodes.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/Nodes/BinaryOperationNodes.expected @@ -1,6 +1,6 @@ | main.go:7:14:7:24 | ...+... | + | main.go:7:14:7:14 | x | main.go:7:19:7:23 | ...+... | | main.go:7:19:7:23 | ...+... | + | main.go:7:19:7:19 | y | main.go:7:23:7:23 | z | | main.go:10:14:10:18 | ...+... | + | main.go:10:14:10:14 | x | main.go:10:18:10:18 | y | -| main.go:17:2:17:13 | compound-rhs ... += ... | + | main.go:17:2:17:6 | index expression | main.go:17:11:17:13 | "!" | +| main.go:17:2:17:13 | ... += ... | + | main.go:17:2:17:6 | index expression | main.go:17:11:17:13 | "!" | | resultParameters.go:4:5:4:17 | ...==... | == | resultParameters.go:4:5:4:12 | selector | resultParameters.go:4:17:4:17 | 0 | | resultParameters.go:23:5:23:17 | ...==... | == | resultParameters.go:23:5:23:12 | selector | resultParameters.go:23:17:23:17 | 1 | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarDefs.expected b/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarDefs.expected index 155b0d602058..01085718157d 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarDefs.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/SSA/VarDefs.expected @@ -1,6 +1,6 @@ | main.go:13:6:13:10 | zero-init:0 value declaration specifier | main.go:13:6:13:6 | x | main.go:13:6:13:10 | zero-init:0 value declaration specifier | | main.go:14:2:14:8 | assign:0 ... := ... | main.go:14:2:14:2 | y | main.go:14:7:14:8 | 23 | -| main.go:17:3:17:9 | compound-rhs ... += ... | main.go:14:2:14:2 | y | main.go:17:3:17:9 | compound-rhs ... += ... | +| main.go:17:3:17:9 | ... += ... | main.go:14:2:14:2 | y | main.go:17:3:17:9 | ... += ... | | main.go:21:3:21:7 | assign:0 ... = ... | main.go:13:6:13:6 | x | main.go:21:7:21:7 | y | | main.go:26:10:26:10 | x | main.go:26:10:26:10 | x | main.go:26:10:26:10 | x | | main.go:27:2:27:13 | assign:0 ... := ... | main.go:27:2:27:2 | a | main.go:27:10:27:10 | x | @@ -17,11 +17,11 @@ | main.go:59:3:59:7 | assign:0 ... = ... | main.go:57:6:57:6 | x | main.go:59:7:59:7 | 2 | | main.go:63:2:63:7 | assign:0 ... := ... | main.go:63:2:63:2 | y | main.go:63:7:63:7 | 1 | | main.go:64:6:64:11 | assign:0 ... := ... | main.go:64:6:64:6 | i | main.go:64:11:64:11 | 0 | -| main.go:64:16:64:18 | compound-rhs increment statement | main.go:64:6:64:6 | i | main.go:64:16:64:18 | compound-rhs increment statement | +| main.go:64:16:64:18 | increment statement | main.go:64:6:64:6 | i | main.go:64:16:64:18 | increment statement | | main.go:68:3:68:7 | assign:0 ... = ... | main.go:63:2:63:2 | y | main.go:68:7:68:7 | 2 | | main.go:72:2:72:7 | assign:0 ... := ... | main.go:72:2:72:2 | z | main.go:72:7:72:7 | 1 | | main.go:73:6:73:11 | assign:0 ... := ... | main.go:73:6:73:6 | i | main.go:73:11:73:11 | 0 | -| main.go:73:16:73:18 | compound-rhs increment statement | main.go:73:6:73:6 | i | main.go:73:16:73:18 | compound-rhs increment statement | +| main.go:73:16:73:18 | increment statement | main.go:73:6:73:6 | i | main.go:73:16:73:18 | increment statement | | main.go:74:3:74:7 | assign:0 ... = ... | main.go:72:2:72:2 | z | main.go:74:7:74:7 | 2 | | main.go:82:36:86:1 | zero-init:0 block statement | main.go:82:18:82:18 | a | main.go:82:36:86:1 | zero-init:0 block statement | | main.go:82:36:86:1 | zero-init:1 block statement | main.go:82:25:82:25 | b | main.go:82:36:86:1 | zero-init:1 block statement | diff --git a/go/ql/test/query-tests/Security/CWE-601/OpenUrlRedirect/OpenUrlRedirect.expected b/go/ql/test/query-tests/Security/CWE-601/OpenUrlRedirect/OpenUrlRedirect.expected index 650341884f1a..09c6cb5157f1 100644 --- a/go/ql/test/query-tests/Security/CWE-601/OpenUrlRedirect/OpenUrlRedirect.expected +++ b/go/ql/test/query-tests/Security/CWE-601/OpenUrlRedirect/OpenUrlRedirect.expected @@ -30,8 +30,8 @@ edges | stdlib.go:71:23:71:37 | ...+... | stdlib.go:71:23:71:40 | ...+... | provenance | Config Sink:MaD:1 | | stdlib.go:93:13:93:18 | selection of Form | stdlib.go:93:13:93:32 | call to Get | provenance | Src:MaD:2 Config | | stdlib.go:93:13:93:32 | call to Get | stdlib.go:94:3:94:8 | target | provenance | | -| stdlib.go:94:3:94:8 | target | stdlib.go:94:3:94:25 | compound-rhs ... += ... | provenance | Config | -| stdlib.go:94:3:94:25 | compound-rhs ... += ... | stdlib.go:96:23:96:28 | target | provenance | Sink:MaD:1 | +| stdlib.go:94:3:94:8 | target | stdlib.go:94:3:94:25 | ... += ... | provenance | Config | +| stdlib.go:94:3:94:25 | ... += ... | stdlib.go:96:23:96:28 | target | provenance | Sink:MaD:1 | | stdlib.go:116:4:116:4 | implicit-deref r [postupdate] [URL] | stdlib.go:116:4:116:4 | r [postupdate] [pointer, URL] | provenance | | | stdlib.go:116:4:116:4 | r [postupdate] [pointer, URL] | stdlib.go:117:24:117:24 | r [pointer, URL] | provenance | | | stdlib.go:116:4:116:8 | implicit-deref selection of URL | stdlib.go:116:4:116:8 | selection of URL [postupdate] | provenance | Config | @@ -118,7 +118,7 @@ nodes | stdlib.go:93:13:93:18 | selection of Form | semmle.label | selection of Form | | stdlib.go:93:13:93:32 | call to Get | semmle.label | call to Get | | stdlib.go:94:3:94:8 | target | semmle.label | target | -| stdlib.go:94:3:94:25 | compound-rhs ... += ... | semmle.label | compound-rhs ... += ... | +| stdlib.go:94:3:94:25 | ... += ... | semmle.label | ... += ... | | stdlib.go:96:23:96:28 | target | semmle.label | target | | stdlib.go:116:4:116:4 | implicit-deref r [postupdate] [URL] | semmle.label | implicit-deref r [postupdate] [URL] | | stdlib.go:116:4:116:4 | r [postupdate] [pointer, URL] | semmle.label | r [postupdate] [pointer, URL] | From 6e4815753f7d9216ded5a4776184588f03c4498a Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 19 Aug 2026 13:44:27 +0100 Subject: [PATCH 1001/2098] Move `getExpr` to `SwitchExpr` --- go/ql/lib/semmle/go/Stmt.qll | 12 ++++++++---- .../semmle/go/controlflow/ControlFlowGraphShared.qll | 10 +--------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/go/ql/lib/semmle/go/Stmt.qll b/go/ql/lib/semmle/go/Stmt.qll index c7dca9dc2d13..eec57f83cc2c 100644 --- a/go/ql/lib/semmle/go/Stmt.qll +++ b/go/ql/lib/semmle/go/Stmt.qll @@ -832,6 +832,12 @@ class SwitchStmt extends @switchstmt, Stmt, ScopeNode { /** Gets the init statement of this `switch` statement, if any. */ Stmt getInit() { result = this.getChildStmt(0) } + /** + * Gets the expression whose value or type is examined by this `switch` + * statement, if any. + */ + Expr getExpr() { none() } + /** Gets the body of this `switch` statement. */ BlockStmt getBody() { result = this.getChildStmt(2) } @@ -880,8 +886,7 @@ class SwitchStmt extends @switchstmt, Stmt, ScopeNode { * ``` */ class ExpressionSwitchStmt extends @exprswitchstmt, SwitchStmt { - /** Gets the switch expression of this `switch` statement. */ - Expr getExpr() { result = this.getChildExpr(1) } + override Expr getExpr() { result = this.getChildExpr(1) } override predicate mayHaveSideEffects() { this.getInit().mayHaveSideEffects() or @@ -912,14 +917,13 @@ class ExpressionSwitchStmt extends @exprswitchstmt, SwitchStmt { * ``` */ class TypeSwitchStmt extends @typeswitchstmt, SwitchStmt { - /** Gets the assign statement of this type-switch statement. */ SimpleAssignStmt getAssign() { result = this.getChildStmt(1) } /** Gets the test statement of this type-switch statement. This is a `SimpleAssignStmt` or `ExprStmt`. */ Stmt getTest() { result = this.getChildStmt(1) } /** Gets the expression whose type is examined by this `switch` statement. */ - Expr getExpr() { + override Expr getExpr() { result = this.getAssign().getRhs() or result = this.getChildStmt(1).(ExprStmt).getExpr() } diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll index 3005619e9194..858aa641000d 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll @@ -265,15 +265,7 @@ module CfgImpl { } class Switch extends AstNode instanceof Go::SwitchStmt { - Expr getExpr() { - result = this.(Go::ExpressionSwitchStmt).getExpr() - or - // For a type switch the "switch expression" is the type-assertion - // expression `x.(type)`; evaluating it directly (rather than the - // wrapping `y := x.(type)` statement) lets the shared switch model - // drive the per-case type tests. - result = this.(Go::TypeSwitchStmt).getExpr() - } + Expr getExpr() { result = this.(Go::SwitchStmt).getExpr() } Case getCase(int index) { result = this.(Go::SwitchStmt).getCase(index) } From f37db602979395758f2b8873d6537e14bb1c08f0 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 19 Aug 2026 14:33:13 +0100 Subject: [PATCH 1002/2098] Remove/reduce comments --- .../go/controlflow/ControlFlowGraphShared.qll | 91 +++++-------------- .../codeql/controlflow/ControlFlowGraph.qll | 6 +- 2 files changed, 26 insertions(+), 71 deletions(-) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll index 858aa641000d..924c4809fdb9 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll @@ -82,9 +82,8 @@ module CfgImpl { or e.getParent*() = any(Go::ArrayTypeExpr ate).getLength() or - // The body block of a switch (expression or type) is transparent: the - // shared switch model wires control flow directly from the switch to its - // case clauses (in control-flow order) and between cases, so the + // The shared switch model wires control flow directly from the switch to + // its case clauses (in control-flow order) and between cases, so the // enclosing block must not introduce its own nodes or default // left-to-right sequencing of the case clauses. e = any(Go::SwitchStmt sw).getBody() @@ -217,12 +216,6 @@ module CfgImpl { } class ForeachStmt extends LoopStmt instanceof Go::RangeStmt { - // Go's `range` statement binds its key and value by destructuring the - // current element. The extractor synthesizes a single "range element" - // node grouping the key and value (see `Go::RangeElementExpr`), which we - // present here as the loop variable. The shared library routes control - // flow into and out of this node, and Go wires the destructuring through - // it (see `rangeStmtStep`). Expr getVariable() { result = this.(Go::RangeStmt).getPattern() } Expr getCollection() { result = this.(Go::RangeStmt).getDomain() } @@ -298,18 +291,11 @@ module CfgImpl { DefaultCase() { not exists(this.(Go::CaseClause).getAnExpr()) } } - /** Gets the initializer of `switch` statement `switch`, if any. */ AstNode getSwitchInit(Switch switch) { result = switch.(Go::SwitchStmt).getInit() } - /** - * Go has no implicit fall-through between case clauses; a case that runs to - * the end of its body breaks out of the switch. Fall-through only happens - * when the case body ends with an explicit `fallthrough` statement, in - * which case control transfers to the next case clause's body (in source - * order). The shared library models this by chaining the body of such a - * case to the body of the following case. - */ predicate fallsThrough(Case c) { + // Go has no implicit fall-through between case clauses; an explicit + // `fallthrough` statement is required. c.(Go::CaseClause).getStmt(max(int i | exists(c.(Go::CaseClause).getStmt(i)))) instanceof Go::FallthroughStmt } @@ -444,11 +430,11 @@ module CfgImpl { predicate preOrderExpr(Ast::Expr e) { // The call of a `defer` statement is not invoked at the statement - // itself; its callee and arguments are evaluated in place, but the call - // is only invoked later, at function exit (modelled by the `defer-invoke` - // node and `additionalSuccessor`). Marking it as pre-order means no in-order - // "invocation" node (and hence no inline exceptional-exit edge) is - // created at the `defer` statement. + // itself; its callee expression and arguments are evaluated in place, + // but the call is only invoked later, at function exit (modelled by the + // `defer-invoke` node and `additionalSuccessor`). Marking it as + // pre-order means no in-order "invocation" node (and hence no inline + // exceptional-exit edge) is created at the `defer` statement. e = any(Go::DeferStmt s).getCall() or // Parenthesized expressions are value-transparent (via `propagatesValue`) @@ -963,12 +949,12 @@ module CfgImpl { exists(Go::FuncDef fd | funcHasDefer(fd) | successorType instanceof DirectSuccessor and ( - // (a) an exit predecessor with no active defer flows straight to the exit target + // an exit predecessor with no active defer flows straight to the exit target normalExitPred(n1, fd) and n1 = reachableBeforeNextDeferRegistration(funcEntry(fd)) and deferChainExitTarget(fd, n2) or - // (b) an exit predecessor flows to the invocation of the last-registered active defer + // an exit predecessor flows to the invocation of the last-registered active defer exists(Go::DeferStmt d, PreControlFlowNode reg | deferRegistration(reg, d) and d.getEnclosingFunction() = fd and @@ -977,7 +963,7 @@ module CfgImpl { deferInvoke(n2, d) ) or - // (c) deferred invocations chain in last-in-first-out order + // deferred invocations chain in last-in-first-out order exists(Go::DeferStmt laterRegistered, Go::DeferStmt earlierRegistered | laterRegistered.getEnclosingFunction() = fd and nextRegisteredDefer(laterRegistered, earlierRegistered) and @@ -986,7 +972,7 @@ module CfgImpl { deferInvoke(n2, earlierRegistered) ) or - // (d) the invocation of the first-registered (last to run) defer flows to the exit target + // the invocation of the first-registered (last to run) defer flows to the exit target exists(Go::DeferStmt firstD | firstRegisteredDefer(firstD, fd) and deferInvocationMayReturnNormally(firstD) and @@ -995,7 +981,7 @@ module CfgImpl { ) ) or - // (e) a possible panic with active defers flows to the last-registered active defer + // a possible panic with active defers flows to the last-registered active defer successorType instanceof ExceptionSuccessor and exists(Go::DeferStmt d, PreControlFlowNode reg | deferRegistration(reg, d) and @@ -1113,7 +1099,6 @@ module CfgImpl { | epilogueStep(assgn, n1, n2) or - // Last epilogue -> after the assignment n1.isAdditional(assgn, getLastEpilogueTag(assgn)) and n2.isAfter(assgn) ) @@ -1210,7 +1195,6 @@ module CfgImpl { exists(Go::ReturnStmt ret | epilogueStep(ret, n1, n2) or - // Last return epilogue -> return node n1.isAdditional(ret, getLastEpilogueTag(ret)) and n2.isIn(ret) ) @@ -1236,10 +1220,8 @@ module CfgImpl { | epilogueStep(call, n1, n2) or - // Last tuple-extraction node -> the call's invocation node n1.isAdditional(call, getLastEpilogueTag(call)) and n2.isIn(call) or - // Invocation node -> after the call (unless the call never returns normally) n1.isIn(call) and n2.isAfter(call) and not beginAbruptCompletion(call, n1, _, true) @@ -1308,7 +1290,6 @@ module CfgImpl { exists(Go::SliceExpr se | n1.isBefore(se) and n2.isBefore(se.getBase()) or - // After base -> implicit deref, or (if none) the first present bound / slice eval n1.isAfter(se.getBase()) and ( if implicitDerefCondition(se.getBase()) @@ -1318,7 +1299,6 @@ module CfgImpl { or n1.isAdditional(se.getBase(), "implicit-deref") and sliceNext(se, -1, n2) or - // After a present bound -> the next present bound / slice eval n1.isAfter(se.getLow()) and sliceNext(se, 0, n2) or n1.isAfter(se.getHigh()) and sliceNext(se, 1, n2) @@ -1344,7 +1324,6 @@ module CfgImpl { ( n1.isBefore(sel) and n2.isBefore(sel.getBase()) or - // After base (no implicit-deref) -> first implicit-field or In(sel) n1.isAfter(sel.getBase()) and not implicitDerefCondition(sel.getBase()) and ( @@ -1358,23 +1337,22 @@ module CfgImpl { not implicitFieldSelection(sel, _, _) and n2.isIn(sel) ) or - // After base (has implicit-deref) -> implicit-deref node n1.isAfter(sel.getBase()) and implicitDerefCondition(sel.getBase()) and n2.isAdditional(sel.getBase(), "implicit-deref") or - // After implicit-deref -> first implicit-field or In(sel) n1.isAdditional(sel.getBase(), "implicit-deref") and ( + // Has implicit field reads: go to outermost (highest index) exists(int maxIdx | maxIdx = max(int i | implicitFieldSelection(sel, i, _)) and n2.isAdditional(sel, "implicit-field:" + maxIdx.toString()) ) or + // No implicit field reads: go directly to In(sel) not implicitFieldSelection(sel, _, _) and n2.isIn(sel) ) or - // Between implicit field reads: descend from index i to i-1 exists(int i | i > 1 and implicitFieldSelection(sel, i, _) and @@ -1383,7 +1361,6 @@ module CfgImpl { n2.isAdditional(sel, "implicit-field:" + (i - 1).toString()) ) or - // Last implicit field read (index 1) -> In(sel) implicitFieldSelection(sel, 1, _) and n1.isAdditional(sel, "implicit-field:1") and n2.isIn(sel) @@ -1400,10 +1377,8 @@ module CfgImpl { */ private predicate compositeLitStep(PreControlFlowNode n1, PreControlFlowNode n2) { exists(Go::CompositeLit lit | - // Before -> In (the literal allocation) n1.isBefore(lit) and n2.isIn(lit) or - // In -> first element, or After if no elements n1.isIn(lit) and ( n2.isBefore(lit.getElement(0)) @@ -1411,7 +1386,6 @@ module CfgImpl { not exists(lit.getElement(_)) and n2.isAfter(lit) ) or - // After element -> lit-init -> next element or After. // Positional array/slice elements have an implicit index that is // modelled on the `lit-init` instruction itself (see // `IR::InitLiteralElementInstruction`) rather than as a separate node. @@ -1607,17 +1581,6 @@ module CfgImpl { ) } - /** - * Function definition prologue and epilogue: - * - Prologue: parameters are modelled as native CFG nodes by the shared - * library (Entry -> param -> ... -> Before(body)). The remaining - * prologue on Before(body) zero-initializes any named result - * variables: zero-init:0 -> zero-init:1 -> ... -> first statement. - * - Epilogue: return -> result-read:0 -> result-read:1 -> ... -> result-read:last - * - * The last result-read node goes to `After(body)`, from which the shared - * callable CFG continues to the normal exit. - */ private predicate hasFuncDefPrologue(Go::FuncDef fd) { exists(fd.getResultVar(_)) } private predicate funcDefBodyStart(Go::FuncDef fd, PreControlFlowNode n) { @@ -1627,47 +1590,41 @@ module CfgImpl { n.isAdditional(fd.getBody(), "result-read:0") } + /** + * Function body flow for named result variables: `Before(body)` -> + * `zero-init:0` -> ... -> first statement -> ... -> `result-read:0` -> ... + * -> `After(body)`. Parameters precede `Before(body)` through the shared + * callable flow. Return and defer handling route into the result-read + * sequence separately; this predicate sequences its nodes and routes + * defer-free fall-through into it. + */ private predicate funcDefStep(PreControlFlowNode n1, PreControlFlowNode n2) { exists(Go::FuncDef fd | exists(fd.getBody()) | - // Before(body) -> first result-var zero-init node. Parameters are - // modelled as native CFG nodes by the shared library and route - // Entry -> param -> ... -> Before(body) ahead of this point; the - // no-result-variable case (Before(body) -> first statement) is handled - // by the shared library's default control flow. n1.isBefore(fd.getBody()) and exists(fd.getResultVar(0)) and n2.isAdditional(fd.getBody(), "zero-init:0") or - // zero-init:j -> next: zero-init:(j+1), or Before(body). - // The zero-init node also writes the result variable (see - // `IR::EvalImplicitInitInstruction`), so there is no separate result-init node. exists(int j | exists(fd.getResultVar(j)) | n1.isAdditional(fd.getBody(), "zero-init:" + j.toString()) and ( - // Next result var exists exists(fd.getResultVar(j + 1)) and n2.isAdditional(fd.getBody(), "zero-init:" + (j + 1).toString()) or - // No next result var: go to Before(body) not exists(fd.getResultVar(j + 1)) and funcDefBodyStart(fd, n2) ) ) or - // result-read:j -> result-read:(j+1) exists(int j | exists(fd.getResultVar(j + 1)) | n1.isAdditional(fd.getBody(), "result-read:" + j.toString()) and n2.isAdditional(fd.getBody(), "result-read:" + (j + 1).toString()) ) or - // Normal fall-through enters the result-read epilogue when there are - // named results but no deferred calls. not funcHasDefer(fd) and exists(fd.getResultVar(0)) and n1.isAfter(getLastRankedChild(fd.getBody())) and n2.isAdditional(fd.getBody(), "result-read:0") or - // The completed result-read epilogue reaches `After(body)`. exists(int j | exists(fd.getResultVar(j)) and not exists(fd.getResultVar(j + 1)) and diff --git a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll index 24dadd4cd2f6..279410f98fda 100644 --- a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll +++ b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll @@ -686,10 +686,8 @@ module Make0 Ast> { not postOrInOrder(n) and not additionalNode(n, _, _) and not inConditionalContext(n, _) and - // A switch is a branching construct with an explicit step from its - // "before" node to its "after" node, so it must keep distinct before and - // after nodes even when it has no children (e.g. an empty `switch {}`). - // Merging them would otherwise turn that step into a spurious self-loop. + // An empty switch statement still needs distinct before and after nodes + // to avoid a spurious self-loop. not n instanceof Switch } From 7e48a1e88a7ab0d715c3d463cfdffaa65951dbcd Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 19 Aug 2026 14:44:11 +0100 Subject: [PATCH 1003/2098] Rename file to ControlFlowGraphImpl.qll --- go/ql/consistency-queries/CfgConsistency.ql | 2 +- go/ql/lib/printCfg.ql | 2 +- go/ql/lib/semmle/go/controlflow/BasicBlocks.qll | 2 +- go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll | 2 +- .../{ControlFlowGraphShared.qll => ControlFlowGraphImpl.qll} | 0 go/ql/lib/semmle/go/controlflow/IR.qll | 2 +- go/ql/lib/semmle/go/dataflow/SsaImpl.qll | 2 +- 7 files changed, 6 insertions(+), 6 deletions(-) rename go/ql/lib/semmle/go/controlflow/{ControlFlowGraphShared.qll => ControlFlowGraphImpl.qll} (100%) diff --git a/go/ql/consistency-queries/CfgConsistency.ql b/go/ql/consistency-queries/CfgConsistency.ql index bcde1f95c305..86aa5260886c 100644 --- a/go/ql/consistency-queries/CfgConsistency.ql +++ b/go/ql/consistency-queries/CfgConsistency.ql @@ -1,3 +1,3 @@ import go -private import semmle.go.controlflow.ControlFlowGraphShared +private import semmle.go.controlflow.ControlFlowGraphImpl import CfgImpl::ControlFlow::Consistency diff --git a/go/ql/lib/printCfg.ql b/go/ql/lib/printCfg.ql index cd12a635c009..2b018caf5acc 100644 --- a/go/ql/lib/printCfg.ql +++ b/go/ql/lib/printCfg.ql @@ -9,7 +9,7 @@ import go import semmle.go.controlflow.ControlFlowGraph -private import semmle.go.controlflow.ControlFlowGraphShared +private import semmle.go.controlflow.ControlFlowGraphImpl external string selectedSourceFile(); diff --git a/go/ql/lib/semmle/go/controlflow/BasicBlocks.qll b/go/ql/lib/semmle/go/controlflow/BasicBlocks.qll index 81d56e6711cf..3ae911e931d0 100644 --- a/go/ql/lib/semmle/go/controlflow/BasicBlocks.qll +++ b/go/ql/lib/semmle/go/controlflow/BasicBlocks.qll @@ -5,7 +5,7 @@ overlay[local] module; import go -private import ControlFlowGraphShared +private import ControlFlowGraphImpl /** A basic block in the control-flow graph. */ class BasicBlock = CfgImpl::Cfg::BasicBlock; diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll index 83e8f8de14b8..551121f27f57 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll @@ -5,7 +5,7 @@ overlay[local] module; import go -private import ControlFlowGraphShared +private import ControlFlowGraphImpl private import codeql.controlflow.SuccessorType /** Provides helper predicates for mapping between CFG nodes and the AST. */ diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll similarity index 100% rename from go/ql/lib/semmle/go/controlflow/ControlFlowGraphShared.qll rename to go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll diff --git a/go/ql/lib/semmle/go/controlflow/IR.qll b/go/ql/lib/semmle/go/controlflow/IR.qll index 39492830bcdb..a06be4152235 100644 --- a/go/ql/lib/semmle/go/controlflow/IR.qll +++ b/go/ql/lib/semmle/go/controlflow/IR.qll @@ -13,7 +13,7 @@ overlay[local] module; import go -private import ControlFlowGraphShared +private import ControlFlowGraphImpl private import codeql.controlflow.SuccessorType /** Provides predicates and classes for working with IR constructs. */ diff --git a/go/ql/lib/semmle/go/dataflow/SsaImpl.qll b/go/ql/lib/semmle/go/dataflow/SsaImpl.qll index 9b875d3974ba..c206dccbba38 100644 --- a/go/ql/lib/semmle/go/dataflow/SsaImpl.qll +++ b/go/ql/lib/semmle/go/dataflow/SsaImpl.qll @@ -9,7 +9,7 @@ module; import go private import codeql.ssa.Ssa as SsaImplCommon private import semmle.go.controlflow.BasicBlocks as BasicBlocks -private import semmle.go.controlflow.ControlFlowGraphShared +private import semmle.go.controlflow.ControlFlowGraphImpl private class BasicBlock = BasicBlocks::BasicBlock; From cfe78efcd4f0caa007d9e4228185a7867943c857 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 19 Aug 2026 14:52:57 +0100 Subject: [PATCH 1004/2098] Use american spelling --- go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll index 924c4809fdb9..983a9c333059 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll @@ -431,7 +431,7 @@ module CfgImpl { predicate preOrderExpr(Ast::Expr e) { // The call of a `defer` statement is not invoked at the statement // itself; its callee expression and arguments are evaluated in place, - // but the call is only invoked later, at function exit (modelled by the + // but the call is only invoked later, at function exit (modeled by the // `defer-invoke` node and `additionalSuccessor`). Marking it as // pre-order means no in-order "invocation" node (and hence no inline // exceptional-exit edge) is created at the `defer` statement. @@ -749,7 +749,7 @@ module CfgImpl { // A `break` in a communication clause body terminates the enclosing // `select` statement, continuing after it. This mirrors the shared // library's handling of `break` in a `switch` case body, but `select` is - // modelled language-specifically (it is not a `Switch`), so the break + // modeled language-specifically (it is not a `Switch`), so the break // must be caught here. The break completion bubbles up the AST until it // reaches a top-level statement of the comm clause body, at which point // flow resumes after the `select`. An unlabeled `break` targets the @@ -1283,7 +1283,7 @@ module CfgImpl { * Slice expression: base -> implicit-deref? -> low? -> high? -> max? -> In(sliceExpr). * * Missing (implicit) bounds have no control-flow node of their own; the - * implicit lower bound of `0` is modelled as a constant on the + * implicit lower bound of `0` is modeled as a constant on the * `SliceInstruction` rather than as a separate node. */ private predicate sliceExprStep(PreControlFlowNode n1, PreControlFlowNode n2) { @@ -1387,7 +1387,7 @@ module CfgImpl { ) or // Positional array/slice elements have an implicit index that is - // modelled on the `lit-init` instruction itself (see + // modeled on the `lit-init` instruction itself (see // `IR::InitLiteralElementInstruction`) rather than as a separate node. exists(int i | n1.isAfter(lit.getElement(i)) and From c2d67031e14bf422e2c0cdb92cd6485b0b1526a5 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 19 Aug 2026 14:59:24 +0100 Subject: [PATCH 1005/2098] Add missing qldoc --- go/ql/lib/semmle/go/Stmt.qll | 1 + 1 file changed, 1 insertion(+) diff --git a/go/ql/lib/semmle/go/Stmt.qll b/go/ql/lib/semmle/go/Stmt.qll index eec57f83cc2c..a417271a14f4 100644 --- a/go/ql/lib/semmle/go/Stmt.qll +++ b/go/ql/lib/semmle/go/Stmt.qll @@ -917,6 +917,7 @@ class ExpressionSwitchStmt extends @exprswitchstmt, SwitchStmt { * ``` */ class TypeSwitchStmt extends @typeswitchstmt, SwitchStmt { + /** Gets the assignment statement of this type-switch statement, if any. */ SimpleAssignStmt getAssign() { result = this.getChildStmt(1) } /** Gets the test statement of this type-switch statement. This is a `SimpleAssignStmt` or `ExprStmt`. */ From c9276a089b8dfba7d1bc3cf741cc1a154215656c Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 19 Aug 2026 23:06:12 +0100 Subject: [PATCH 1006/2098] Update change note --- go/ql/lib/change-notes/2026-08-13-cfg.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/go/ql/lib/change-notes/2026-08-13-cfg.md b/go/ql/lib/change-notes/2026-08-13-cfg.md index 46a7c60828f9..aa0d5a8634a1 100644 --- a/go/ql/lib/change-notes/2026-08-13-cfg.md +++ b/go/ql/lib/change-notes/2026-08-13-cfg.md @@ -15,9 +15,15 @@ category: breaking - `ControlFlow::EntryNode` and `ControlFlow::ExitNode` have been added, and `ControlFlow::entryNode` and `ControlFlow::exitNode` now return these more specific types. + - `IfStmt.getCond` has been deprecated. Please use the new `IfStmt.getCondition` instead. + - The result types of `IfStmt.getThen` and `LoopStmt.getBody` have been + widened from `BlockStmt` to `Stmt`. + - `SwitchStmt.getExpr` has been added, providing a common accessor for the + expression examined by expression and type switches. - Several IR instruction classes have been removed or consolidated, including `ReadArgumentInstruction`, `InitResultInstruction`, `IncDecInstruction`, `EvalIncDecRhsInstruction`, `EvalImplicitOneInstruction`, `SelectInstruction`, and `SendInstruction`. - - `EvalCompoundAssignRhsInstruction` and `EvalImplicitInitInstruction` now - directly represent their associated writes. + - `EvalCompoundAssignRhsInstruction` now also represents increment and + decrement operations, and it and `EvalImplicitInitInstruction` directly + represent their associated writes. From b0427e09d5bbcd667429ed0675373974efb13e02 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Tue, 1 Sep 2026 16:08:46 +0100 Subject: [PATCH 1007/2098] Fix non-US spelling --- go/ql/lib/semmle/go/Stmt.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/ql/lib/semmle/go/Stmt.qll b/go/ql/lib/semmle/go/Stmt.qll index a417271a14f4..042d5d19cd8f 100644 --- a/go/ql/lib/semmle/go/Stmt.qll +++ b/go/ql/lib/semmle/go/Stmt.qll @@ -1182,7 +1182,7 @@ class RangeStmt extends @rangestmt, LoopStmt { * `range` statement. * * This node acts as the single target of the destructuring performed on each - * iteration of the loop, so that a `range` statement can be modelled with a + * iteration of the loop, so that a `range` statement can be modeled with a * single loop-variable node in the same way as a `foreach` loop in other * languages. It is present for every `range` statement, even when no loop * variables are bound (as in `for range x`). From 187e3fd83e8938625fdb654fa87dedd066323f99 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 2 Sep 2026 10:41:39 +0100 Subject: [PATCH 1008/2098] Change function epilogue CFG Use the pre-existing CFG library hooks more and removes some that we had added before. --- .../go/controlflow/ControlFlowGraphImpl.qll | 227 ++++++++++++------ .../CONSISTENCY/CfgConsistency.expected | 6 +- .../CONSISTENCY/CfgConsistency.expected | 4 +- .../CONSISTENCY/CfgConsistency.expected | 12 +- .../ControlFlowNode_getASuccessor.expected | 116 ++++++--- .../codeql/controlflow/ControlFlowGraph.qll | 37 +-- 6 files changed, 252 insertions(+), 150 deletions(-) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll index 983a9c333059..fb33a3221a98 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll @@ -432,7 +432,7 @@ module CfgImpl { // The call of a `defer` statement is not invoked at the statement // itself; its callee expression and arguments are evaluated in place, // but the call is only invoked later, at function exit (modeled by the - // `defer-invoke` node and `additionalSuccessor`). Marking it as + // `defer-invoke` node and the final-stage defer steps). Marking it as // pre-order means no in-order "invocation" node (and hence no inline // exceptional-exit edge) is created at the `defer` statement. e = any(Go::DeferStmt s).getCall() @@ -578,8 +578,17 @@ module CfgImpl { tag = "implicit-field:" + i.toString() ) or - // Deferred-call invocation node, placed at function exit by `additionalSuccessor` + // Deferred-call invocation node, placed at function exit by the final-stage defer steps n = any(Go::DeferStmt s).getCall() and tag = "defer-invoke" + or + n instanceof Go::DeferStmt and tag = "catch-defer-panic" + or + not n instanceof Go::DeferStmt and + mayPanic(n) and + mayDeferParent(n) and + tag = "catch-panic" + or + mayReturn(n) and mayDeferParent(n) and tag = "catch-return" ) } @@ -687,7 +696,16 @@ module CfgImpl { not exists(ast.(Go::CallExpr).getTarget()) or ast.(Go::CallExpr).getTarget().mayPanic() ) and - (n.isIn(ast) or n.isAdditional(ast, "defer-invoke")) and + n.isIn(ast) and + c.asSimpleAbruptCompletion() instanceof ExceptionSuccessor and + always = false + or + ast instanceof Go::DeferStmt and + ( + not exists(ast.(Go::DeferStmt).getCall().getTarget()) or + ast.(Go::DeferStmt).getCall().getTarget().mayPanic() + ) and + n.isAdditional(ast.(Go::DeferStmt).getCall(), "defer-invoke") and c.asSimpleAbruptCompletion() instanceof ExceptionSuccessor and always = false or @@ -699,7 +717,15 @@ module CfgImpl { exists(Go::Function target | target = ast.(Go::CallExpr).getTarget() | target.mustPanic() or target.mustNotReturnNormally() ) and - (n.isIn(ast) or n.isAdditional(ast, "defer-invoke")) and + n.isIn(ast) and + c.asSimpleAbruptCompletion() instanceof ExceptionSuccessor and + always = true + or + ast instanceof Go::DeferStmt and + exists(Go::Function target | target = ast.(Go::DeferStmt).getCall().getTarget() | + target.mustPanic() or target.mustNotReturnNormally() + ) and + n.isAdditional(ast.(Go::DeferStmt).getCall(), "defer-invoke") and c.asSimpleAbruptCompletion() instanceof ExceptionSuccessor and always = true or @@ -739,6 +765,21 @@ module CfgImpl { additional predicate endAbruptCompletion( Ast::AstNode ast, PreControlFlowNode n, AbruptCompletion c ) { + ast instanceof Go::DeferStmt and + n.isAdditional(ast, "catch-defer-panic") and + c.getSuccessorType() instanceof ExceptionSuccessor + or + not ast instanceof Go::DeferStmt and + mayPanic(ast) and + mayDeferParent(ast) and + n.isAdditional(ast, "catch-panic") and + c.getSuccessorType() instanceof ExceptionSuccessor + or + mayReturn(ast) and + mayDeferParent(ast) and + n.isAdditional(ast, "catch-return") and + c.getSuccessorType() instanceof ReturnSuccessor + or exists(Go::LabeledStmt lbl | ast = lbl.getStmt() and n.isAfter(lbl) and @@ -789,18 +830,51 @@ module CfgImpl { ) } - additional predicate overridesAbruptCompletionEdge( - PreControlFlowNode source, PreControlFlowNode target, AbruptCompletion completion - ) { - completion.getSuccessorType() instanceof ReturnSuccessor and - target instanceof NormalExitNodeImpl and - exists(PreControlFlowNode replacement | additionalSuccessor(source, replacement, _)) - or - completion.getSuccessorType() instanceof ExceptionSuccessor and - target instanceof ExceptionalExitNodeImpl and - exists(PreControlFlowNode nextDefer | - additionalSuccessor(source, nextDefer, _) and deferInvoke(nextDefer, _) + /** Holds if `ast` or one of its CFG children may panic. */ + private predicate mayPanic(Ast::AstNode ast) { + ast instanceof Go::CallExpr and + not ast = any(Go::DeferStmt s).getCall() and + (not exists(ast.(Go::CallExpr).getTarget()) or ast.(Go::CallExpr).getTarget().mayPanic()) and + not exists(Go::Function target | target = ast.(Go::CallExpr).getTarget() | + target.mustNotReturnNormally() and not target.mustPanic() ) + or + ast instanceof Go::DivExpr and not ast.(Go::Expr).isConst() + or + ast instanceof Go::DerefExpr + or + ast instanceof Go::TypeAssertExpr and + not exists(Go::Assignment assgn | + assgn.getNumLhs() = 2 and ast = assgn.getRhs().stripParens() + ) and + not exists(Go::ValueSpec vs | vs.getNumName() = 2 and ast = vs.getInit().stripParens()) and + not exists(Go::TypeSwitchStmt ts | ast = ts.getExpr()) + or + ast instanceof Go::IndexExpr + or + ast instanceof Go::ConversionExpr and + ast.(Go::ConversionExpr).getType().(Go::PointerType).getBaseType() instanceof Go::ArrayType + or + mayPanic(Ast::getChild(ast, _)) + } + + /** Holds if `ast` or one of its CFG children may return abruptly. */ + private predicate mayReturn(Ast::AstNode ast) { + ast instanceof Go::ReturnStmt + or + mayReturn(Ast::getChild(ast, _)) + } + + /** Holds if `ast` or one of its CFG children registers a deferred call. */ + private predicate mayDefer(Ast::AstNode ast) { + ast instanceof Go::DeferStmt + or + mayDefer(Ast::getChild(ast, _)) + } + + /** Holds if the CFG parent of `ast` may register a deferred call. */ + private predicate mayDeferParent(Ast::AstNode ast) { + exists(Ast::AstNode parent | ast = Ast::getChild(parent, _) and mayDefer(parent)) } /** Holds if `fd` contains at least one `defer` statement. */ @@ -906,7 +980,9 @@ module CfgImpl { * node, or the normal fall-through from the body's last statement. */ private predicate normalExitPred(PreControlFlowNode n, Go::FuncDef fd) { - exists(Go::ReturnStmt ret | ret.getEnclosingFunction() = fd and n.isIn(ret)) + exists(Ast::AstNode ast | + ast.getEnclosingFunction() = fd and n.isAdditional(ast, "catch-return") + ) or n.isAfter(getLastRankedChild(fd.getBody())) } @@ -918,16 +994,8 @@ module CfgImpl { * nonreturning calls, such as `os.Exit`, do not run deferred functions. */ private predicate exceptionalExitPred(PreControlFlowNode n, Go::FuncDef fd) { - exists(Ast::AstNode ast, AbruptCompletion c | - ast.getEnclosingFunction() = fd and - n.isIn(ast) and - beginAbruptCompletion(ast, n, c, false) and - c.getSuccessorType() instanceof ExceptionSuccessor and - not exists(Go::CallExpr call | - ast = call and - call.getTarget().mustNotReturnNormally() and - not call.getTarget().mustPanic() - ) + exists(Ast::AstNode ast | + ast.getEnclosingFunction() = fd and n.isAdditional(ast, "catch-panic") ) } @@ -943,46 +1011,64 @@ module CfgImpl { not exists(fd.getResultVar(_)) and target.isAfter(fd.getBody()) } - additional predicate additionalSuccessor( - PreControlFlowNode n1, PreControlFlowNode n2, SuccessorType successorType - ) { + additional predicate finalDeferStep(PreControlFlowNode n1, PreControlFlowNode n2) { exists(Go::FuncDef fd | funcHasDefer(fd) | - successorType instanceof DirectSuccessor and - ( - // an exit predecessor with no active defer flows straight to the exit target + // an exit predecessor with no active defer flows straight to the exit target + normalExitPred(n1, fd) and + n1 = reachableBeforeNextDeferRegistration(funcEntry(fd)) and + deferChainExitTarget(fd, n2) + or + // an exit predecessor flows to the invocation of the last-registered active defer + exists(Go::DeferStmt d, PreControlFlowNode reg | + deferRegistration(reg, d) and + d.getEnclosingFunction() = fd and normalExitPred(n1, fd) and - n1 = reachableBeforeNextDeferRegistration(funcEntry(fd)) and + n1 = reachableBeforeNextDeferRegistration(reg) and + deferInvoke(n2, d) + ) + or + // deferred invocations chain in last-in-first-out order + exists(Go::DeferStmt laterRegistered, Go::DeferStmt earlierRegistered | + laterRegistered.getEnclosingFunction() = fd and + nextRegisteredDefer(laterRegistered, earlierRegistered) and + not deferInvocationStopsUnwinding(laterRegistered) and + deferInvoke(n1, laterRegistered) and + deferInvoke(n2, earlierRegistered) + ) + or + // a panic in a deferred invocation continues unwinding through earlier defers + exists(Go::DeferStmt laterRegistered, Go::DeferStmt earlierRegistered | + laterRegistered.getEnclosingFunction() = fd and + nextRegisteredDefer(laterRegistered, earlierRegistered) and + not deferInvocationStopsUnwinding(laterRegistered) and + n1.isAdditional(laterRegistered, "catch-defer-panic") and + deferInvoke(n2, earlierRegistered) + ) + or + // the invocation of the first-registered (last to run) defer flows to the exit target + exists(Go::DeferStmt firstD | + firstRegisteredDefer(firstD, fd) and + deferInvocationMayReturnNormally(firstD) and + deferInvoke(n1, firstD) and deferChainExitTarget(fd, n2) - or - // an exit predecessor flows to the invocation of the last-registered active defer - exists(Go::DeferStmt d, PreControlFlowNode reg | - deferRegistration(reg, d) and - d.getEnclosingFunction() = fd and - normalExitPred(n1, fd) and - n1 = reachableBeforeNextDeferRegistration(reg) and - deferInvoke(n2, d) - ) - or - // deferred invocations chain in last-in-first-out order - exists(Go::DeferStmt laterRegistered, Go::DeferStmt earlierRegistered | - laterRegistered.getEnclosingFunction() = fd and - nextRegisteredDefer(laterRegistered, earlierRegistered) and - not deferInvocationStopsUnwinding(laterRegistered) and - deferInvoke(n1, laterRegistered) and - deferInvoke(n2, earlierRegistered) - ) - or - // the invocation of the first-registered (last to run) defer flows to the exit target - exists(Go::DeferStmt firstD | - firstRegisteredDefer(firstD, fd) and - deferInvocationMayReturnNormally(firstD) and - deferInvoke(n1, firstD) and - deferChainExitTarget(fd, n2) - ) + ) + or + // a panic in the first-registered defer finishes at the exceptional exit + exists(Go::DeferStmt firstD | + firstRegisteredDefer(firstD, fd) and + n1.isAdditional(firstD, "catch-defer-panic") and + n2.(ExceptionalExitNodeImpl).getEnclosingCallable() = fd + ) + or + // a non-panicking, non-returning deferred call stops unwinding immediately + exists(Go::DeferStmt d | + d.getEnclosingFunction() = fd and + deferInvocationStopsUnwinding(d) and + n1.isAdditional(d, "catch-defer-panic") and + n2.(ExceptionalExitNodeImpl).getEnclosingCallable() = fd ) or // a possible panic with active defers flows to the last-registered active defer - successorType instanceof ExceptionSuccessor and exists(Go::DeferStmt d, PreControlFlowNode reg | deferRegistration(reg, d) and d.getEnclosingFunction() = fd and @@ -990,6 +1076,11 @@ module CfgImpl { n1 = reachableBeforeNextDeferRegistration(reg) and deferInvoke(n2, d) ) + or + // a possible panic with no active defer flows to the exceptional exit + exceptionalExitPred(n1, fd) and + n1 = reachableBeforeNextDeferRegistration(funcEntry(fd)) and + n2.(ExceptionalExitNodeImpl).getEnclosingCallable() = fd ) } @@ -1683,18 +1774,6 @@ module CfgImpl { Input1::endAbruptCompletion(ast, n, c) } - predicate overridesAbruptCompletionEdge( - PreControlFlowNode source, PreControlFlowNode target, AbruptCompletion completion - ) { - Input1::overridesAbruptCompletionEdge(source, target, completion) - } - - predicate additionalSuccessor( - PreControlFlowNode n1, PreControlFlowNode n2, SuccessorType successorType - ) { - Input1::additionalSuccessor(n1, n2, successorType) - } - predicate overridesDefaultControlFlow(Ast::AstNode ast) { Input1::overridesDefaultControlFlow(ast) } @@ -1709,6 +1788,8 @@ module CfgImpl { Input1::overridesDefaultControlFlowStep(ast, source, target) } - predicate step(PreControlFlowNode n1, PreControlFlowNode n2) { Input1::step(n1, n2) } + predicate step(PreControlFlowNode n1, PreControlFlowNode n2) { + Input1::step(n1, n2) or Input1::finalDeferStep(n1, n2) + } } } diff --git a/go/ql/test/experimental/InconsistentCode/CONSISTENCY/CfgConsistency.expected b/go/ql/test/experimental/InconsistentCode/CONSISTENCY/CfgConsistency.expected index 567dc09e3f76..3c00017bbfca 100644 --- a/go/ql/test/experimental/InconsistentCode/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/experimental/InconsistentCode/CONSISTENCY/CfgConsistency.expected @@ -1,9 +1,13 @@ consistencyOverview -| multipleSuccessors | 4 | +| multipleSuccessors | 8 | | selfLoop | 1 | multipleSuccessors | DeferInLoop.go:6:2:13:2 | After range statement | successor | DeferInLoop.go:5:36:14:1 | After block statement | | DeferInLoop.go:6:2:13:2 | After range statement | successor | DeferInLoop.go:8:9:8:20 | defer-invoke call to Close | +| DeferInLoop.go:7:3:7:32 | catch-panic ... := ... | successor | DeferInLoop.go:5:1:14:1 | Exceptional Exit | +| DeferInLoop.go:7:3:7:32 | catch-panic ... := ... | successor | DeferInLoop.go:8:9:8:20 | defer-invoke call to Close | +| DeferInLoop.go:8:3:8:20 | catch-defer-panic defer statement | successor | DeferInLoop.go:5:1:14:1 | Exceptional Exit | +| DeferInLoop.go:8:3:8:20 | catch-defer-panic defer statement | successor | DeferInLoop.go:8:9:8:20 | defer-invoke call to Close | | DeferInLoop.go:8:9:8:20 | defer-invoke call to Close | successor | DeferInLoop.go:5:36:14:1 | After block statement | | DeferInLoop.go:8:9:8:20 | defer-invoke call to Close | successor | DeferInLoop.go:8:9:8:20 | defer-invoke call to Close | selfLoop diff --git a/go/ql/test/library-tests/semmle/go/PrintAst/CONSISTENCY/CfgConsistency.expected b/go/ql/test/library-tests/semmle/go/PrintAst/CONSISTENCY/CfgConsistency.expected index da8fa4817da9..bedab226be6e 100644 --- a/go/ql/test/library-tests/semmle/go/PrintAst/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/PrintAst/CONSISTENCY/CfgConsistency.expected @@ -8,5 +8,5 @@ multipleSuccessors | input.go:50:2:59:2 | select statement | successor | input.go:53:2:55:16 | comm clause | | input.go:50:2:59:2 | select statement | successor | input.go:56:2:57:15 | comm clause | | input.go:50:2:59:2 | select statement | successor | input.go:58:2:58:16 | comm clause | -| input.go:71:2:71:10 | return statement | successor | input.go:67:9:67:35 | defer-invoke function call | -| input.go:71:2:71:10 | return statement | successor | input.go:69:9:69:36 | defer-invoke function call | +| input.go:71:2:71:10 | catch-return return statement | successor | input.go:67:9:67:35 | defer-invoke function call | +| input.go:71:2:71:10 | catch-return return statement | successor | input.go:69:9:69:36 | defer-invoke function call | diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CONSISTENCY/CfgConsistency.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CONSISTENCY/CfgConsistency.expected index b817b73a6e69..d856f64ab253 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CONSISTENCY/CfgConsistency.expected @@ -1,6 +1,6 @@ consistencyOverview | deadEnd | 1 | -| multipleSuccessors | 18 | +| multipleSuccessors | 24 | | selfLoop | 1 | deadEnd | stmts.go:61:2:61:10 | select statement | @@ -11,17 +11,23 @@ multipleSuccessors | stmts2.go:16:2:26:2 | select statement | successor | stmts2.go:25:2:25:18 | comm clause | | stmts7.go:61:2:61:20 | After expression statement | successor | stmts7.go:57:38:62:1 | After block statement | | stmts7.go:61:2:61:20 | After expression statement | successor | stmts7.go:59:9:59:22 | defer-invoke call to recoverPanic | +| stmts7.go:61:2:61:20 | catch-panic expression statement | successor | stmts7.go:57:1:62:1 | Exceptional Exit | +| stmts7.go:61:2:61:20 | catch-panic expression statement | successor | stmts7.go:59:9:59:22 | defer-invoke call to recoverPanic | | stmts7.go:65:2:67:2 | After for statement | successor | stmts7.go:64:31:68:1 | After block statement | | stmts7.go:65:2:67:2 | After for statement | successor | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | +| stmts7.go:66:3:66:22 | catch-defer-panic defer statement | successor | stmts7.go:64:1:68:1 | Exceptional Exit | +| stmts7.go:66:3:66:22 | catch-defer-panic defer statement | successor | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | successor | stmts7.go:64:31:68:1 | After block statement | | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | successor | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | | stmts7.go:75:1:76:20 | After labeled statement | successor | stmts7.go:70:31:77:1 | After block statement | | stmts7.go:75:1:76:20 | After labeled statement | successor | stmts7.go:74:8:74:21 | defer-invoke call to recoverPanic | +| stmts7.go:75:1:76:20 | catch-panic labeled statement | successor | stmts7.go:70:1:77:1 | Exceptional Exit | +| stmts7.go:75:1:76:20 | catch-panic labeled statement | successor | stmts7.go:74:8:74:21 | defer-invoke call to recoverPanic | | stmts.go:50:2:59:2 | select statement | successor | stmts.go:51:2:52:31 | comm clause | | stmts.go:50:2:59:2 | select statement | successor | stmts.go:53:2:55:16 | comm clause | | stmts.go:50:2:59:2 | select statement | successor | stmts.go:56:2:57:15 | comm clause | | stmts.go:50:2:59:2 | select statement | successor | stmts.go:58:2:58:16 | comm clause | -| stmts.go:71:2:71:10 | return statement | successor | stmts.go:67:9:67:35 | defer-invoke function call | -| stmts.go:71:2:71:10 | return statement | successor | stmts.go:69:9:69:36 | defer-invoke function call | +| stmts.go:71:2:71:10 | catch-return return statement | successor | stmts.go:67:9:67:35 | defer-invoke function call | +| stmts.go:71:2:71:10 | catch-return return statement | successor | stmts.go:69:9:69:36 | defer-invoke function call | selfLoop | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | successor | diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected index add1549a7df6..2a04c5bb8e3c 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected @@ -321,6 +321,7 @@ | epilogues.go:59:54:62:1 | block statement | epilogues.go:60:2:60:33 | Before defer statement | | epilogues.go:60:2:60:33 | After defer statement | epilogues.go:61:2:61:38 | expression statement | | epilogues.go:60:2:60:33 | Before defer statement | epilogues.go:60:8:60:33 | call to log | +| epilogues.go:60:2:60:33 | catch-defer-panic defer statement | epilogues.go:59:1:62:1 | Exceptional Exit | | epilogues.go:60:2:60:33 | defer statement | epilogues.go:60:2:60:33 | After defer statement | | epilogues.go:60:8:60:8 | After l | epilogues.go:60:8:60:12 | selection of log | | epilogues.go:60:8:60:8 | Before l | epilogues.go:60:8:60:8 | l | @@ -330,8 +331,8 @@ | epilogues.go:60:8:60:12 | selection of log | epilogues.go:60:8:60:12 | After selection of log | | epilogues.go:60:8:60:33 | After call to log | epilogues.go:60:2:60:33 | defer statement | | epilogues.go:60:8:60:33 | call to log | epilogues.go:60:8:60:12 | Before selection of log | -| epilogues.go:60:8:60:33 | defer-invoke call to log | epilogues.go:59:1:62:1 | Exceptional Exit | | epilogues.go:60:8:60:33 | defer-invoke call to log | epilogues.go:59:54:62:1 | After block statement | +| epilogues.go:60:8:60:33 | defer-invoke call to log | epilogues.go:60:2:60:33 | catch-defer-panic defer statement | | epilogues.go:60:14:60:20 | "count" | epilogues.go:60:14:60:20 | After "count" | | epilogues.go:60:14:60:20 | After "count" | epilogues.go:60:23:60:32 | Before call to len | | epilogues.go:60:14:60:20 | Before "count" | epilogues.go:60:14:60:20 | "count" | @@ -350,8 +351,9 @@ | epilogues.go:61:2:61:38 | After call to Println | epilogues.go:61:2:61:38 | After expression statement | | epilogues.go:61:2:61:38 | After expression statement | epilogues.go:60:8:60:33 | defer-invoke call to log | | epilogues.go:61:2:61:38 | Before call to Println | epilogues.go:61:2:61:12 | Before selection of Println | -| epilogues.go:61:2:61:38 | call to Println | epilogues.go:60:8:60:33 | defer-invoke call to log | | epilogues.go:61:2:61:38 | call to Println | epilogues.go:61:2:61:38 | After call to Println | +| epilogues.go:61:2:61:38 | call to Println | epilogues.go:61:2:61:38 | catch-panic expression statement | +| epilogues.go:61:2:61:38 | catch-panic expression statement | epilogues.go:60:8:60:33 | defer-invoke call to log | | epilogues.go:61:2:61:38 | expression statement | epilogues.go:61:2:61:38 | Before call to Println | | epilogues.go:61:14:61:25 | "processing" | epilogues.go:61:14:61:25 | After "processing" | | epilogues.go:61:14:61:25 | After "processing" | epilogues.go:61:28:61:37 | Before call to len | @@ -389,6 +391,7 @@ | epilogues.go:67:25:67:30 | prefix | epilogues.go:67:25:67:30 | After prefix | | epilogues.go:68:2:68:24 | After defer statement | epilogues.go:69:2:69:25 | Before defer statement | | epilogues.go:68:2:68:24 | Before defer statement | epilogues.go:68:8:68:24 | call to logValue | +| epilogues.go:68:2:68:24 | catch-defer-panic defer statement | epilogues.go:66:1:71:1 | Exceptional Exit | | epilogues.go:68:2:68:24 | defer statement | epilogues.go:68:2:68:24 | After defer statement | | epilogues.go:68:8:68:8 | After l | epilogues.go:68:8:68:17 | selection of logValue | | epilogues.go:68:8:68:8 | Before l | epilogues.go:68:8:68:8 | l | @@ -398,13 +401,14 @@ | epilogues.go:68:8:68:17 | selection of logValue | epilogues.go:68:8:68:17 | After selection of logValue | | epilogues.go:68:8:68:24 | After call to logValue | epilogues.go:68:2:68:24 | defer statement | | epilogues.go:68:8:68:24 | call to logValue | epilogues.go:68:8:68:17 | Before selection of logValue | -| epilogues.go:68:8:68:24 | defer-invoke call to logValue | epilogues.go:66:1:71:1 | Exceptional Exit | | epilogues.go:68:8:68:24 | defer-invoke call to logValue | epilogues.go:66:43:71:1 | After block statement | +| epilogues.go:68:8:68:24 | defer-invoke call to logValue | epilogues.go:68:2:68:24 | catch-defer-panic defer statement | | epilogues.go:68:19:68:23 | "bye" | epilogues.go:68:19:68:23 | After "bye" | | epilogues.go:68:19:68:23 | After "bye" | epilogues.go:68:8:68:24 | After call to logValue | | epilogues.go:68:19:68:23 | Before "bye" | epilogues.go:68:19:68:23 | "bye" | | epilogues.go:69:2:69:25 | After defer statement | epilogues.go:70:2:70:20 | expression statement | | epilogues.go:69:2:69:25 | Before defer statement | epilogues.go:69:8:69:25 | call to log | +| epilogues.go:69:2:69:25 | catch-defer-panic defer statement | epilogues.go:68:8:68:24 | defer-invoke call to logValue | | epilogues.go:69:2:69:25 | defer statement | epilogues.go:69:2:69:25 | After defer statement | | epilogues.go:69:8:69:11 | (...) | epilogues.go:69:9:69:10 | Before &... | | epilogues.go:69:8:69:11 | After (...) | epilogues.go:69:8:69:15 | selection of log | @@ -414,6 +418,7 @@ | epilogues.go:69:8:69:25 | After call to log | epilogues.go:69:2:69:25 | defer statement | | epilogues.go:69:8:69:25 | call to log | epilogues.go:69:8:69:15 | Before selection of log | | epilogues.go:69:8:69:25 | defer-invoke call to log | epilogues.go:68:8:68:24 | defer-invoke call to logValue | +| epilogues.go:69:8:69:25 | defer-invoke call to log | epilogues.go:69:2:69:25 | catch-defer-panic defer statement | | epilogues.go:69:9:69:10 | &... | epilogues.go:69:9:69:10 | After &... | | epilogues.go:69:9:69:10 | After &... | epilogues.go:69:8:69:11 | After (...) | | epilogues.go:69:9:69:10 | Before &... | epilogues.go:69:10:69:10 | Before l | @@ -432,8 +437,9 @@ | epilogues.go:70:2:70:20 | After call to Println | epilogues.go:70:2:70:20 | After expression statement | | epilogues.go:70:2:70:20 | After expression statement | epilogues.go:69:8:69:25 | defer-invoke call to log | | epilogues.go:70:2:70:20 | Before call to Println | epilogues.go:70:2:70:12 | Before selection of Println | -| epilogues.go:70:2:70:20 | call to Println | epilogues.go:69:8:69:25 | defer-invoke call to log | | epilogues.go:70:2:70:20 | call to Println | epilogues.go:70:2:70:20 | After call to Println | +| epilogues.go:70:2:70:20 | call to Println | epilogues.go:70:2:70:20 | catch-panic expression statement | +| epilogues.go:70:2:70:20 | catch-panic expression statement | epilogues.go:69:8:69:25 | defer-invoke call to log | | epilogues.go:70:2:70:20 | expression statement | epilogues.go:70:2:70:20 | Before call to Println | | epilogues.go:70:14:70:19 | "body" | epilogues.go:70:14:70:19 | After "body" | | epilogues.go:70:14:70:19 | After "body" | epilogues.go:70:2:70:20 | call to Println | @@ -449,6 +455,7 @@ | epilogues.go:77:29:82:1 | block statement | epilogues.go:78:2:80:15 | Before defer statement | | epilogues.go:78:2:80:15 | After defer statement | epilogues.go:81:2:81:23 | expression statement | | epilogues.go:78:2:80:15 | Before defer statement | epilogues.go:78:8:80:15 | function call | +| epilogues.go:78:2:80:15 | catch-defer-panic defer statement | epilogues.go:77:1:82:1 | Exceptional Exit | | epilogues.go:78:2:80:15 | defer statement | epilogues.go:78:2:80:15 | After defer statement | | epilogues.go:78:8:80:2 | After function literal | epilogues.go:80:4:80:9 | Before "done" | | epilogues.go:78:8:80:2 | Before function literal | epilogues.go:78:8:80:2 | function literal | @@ -457,8 +464,8 @@ | epilogues.go:78:8:80:2 | Normal Exit | epilogues.go:78:8:80:2 | Exit | | epilogues.go:78:8:80:2 | function literal | epilogues.go:78:8:80:2 | After function literal | | epilogues.go:78:8:80:15 | After function call | epilogues.go:78:2:80:15 | defer statement | -| epilogues.go:78:8:80:15 | defer-invoke function call | epilogues.go:77:1:82:1 | Exceptional Exit | | epilogues.go:78:8:80:15 | defer-invoke function call | epilogues.go:77:29:82:1 | After block statement | +| epilogues.go:78:8:80:15 | defer-invoke function call | epilogues.go:78:2:80:15 | catch-defer-panic defer statement | | epilogues.go:78:8:80:15 | function call | epilogues.go:78:8:80:2 | Before function literal | | epilogues.go:78:13:78:17 | label | epilogues.go:78:27:78:27 | n | | epilogues.go:78:27:78:27 | n | epilogues.go:78:34:80:2 | block statement | @@ -497,8 +504,9 @@ | epilogues.go:81:2:81:23 | After call to Println | epilogues.go:81:2:81:23 | After expression statement | | epilogues.go:81:2:81:23 | After expression statement | epilogues.go:78:8:80:15 | defer-invoke function call | | epilogues.go:81:2:81:23 | Before call to Println | epilogues.go:81:2:81:12 | Before selection of Println | -| epilogues.go:81:2:81:23 | call to Println | epilogues.go:78:8:80:15 | defer-invoke function call | | epilogues.go:81:2:81:23 | call to Println | epilogues.go:81:2:81:23 | After call to Println | +| epilogues.go:81:2:81:23 | call to Println | epilogues.go:81:2:81:23 | catch-panic expression statement | +| epilogues.go:81:2:81:23 | catch-panic expression statement | epilogues.go:78:8:80:15 | defer-invoke function call | | epilogues.go:81:2:81:23 | expression statement | epilogues.go:81:2:81:23 | Before call to Println | | epilogues.go:81:14:81:19 | "body" | epilogues.go:81:14:81:19 | After "body" | | epilogues.go:81:14:81:19 | After "body" | epilogues.go:81:22:81:22 | Before x | @@ -519,6 +527,7 @@ | epilogues.go:87:42:98:1 | zero-init:0 block statement | epilogues.go:88:2:92:4 | Before defer statement | | epilogues.go:88:2:92:4 | After defer statement | epilogues.go:93:2:95:2 | if statement | | epilogues.go:88:2:92:4 | Before defer statement | epilogues.go:88:8:92:4 | function call | +| epilogues.go:88:2:92:4 | catch-defer-panic defer statement | epilogues.go:87:1:98:1 | Exceptional Exit | | epilogues.go:88:2:92:4 | defer statement | epilogues.go:88:2:92:4 | After defer statement | | epilogues.go:88:8:92:2 | After function literal | epilogues.go:88:8:92:4 | After function call | | epilogues.go:88:8:92:2 | Before function literal | epilogues.go:88:8:92:2 | function literal | @@ -526,8 +535,8 @@ | epilogues.go:88:8:92:2 | Normal Exit | epilogues.go:88:8:92:2 | Exit | | epilogues.go:88:8:92:2 | function literal | epilogues.go:88:8:92:2 | After function literal | | epilogues.go:88:8:92:4 | After function call | epilogues.go:88:2:92:4 | defer statement | -| epilogues.go:88:8:92:4 | defer-invoke function call | epilogues.go:87:1:98:1 | Exceptional Exit | | epilogues.go:88:8:92:4 | defer-invoke function call | epilogues.go:87:42:98:1 | result-read:0 block statement | +| epilogues.go:88:8:92:4 | defer-invoke function call | epilogues.go:88:2:92:4 | catch-defer-panic defer statement | | epilogues.go:88:8:92:4 | function call | epilogues.go:88:8:92:2 | Before function literal | | epilogues.go:88:15:92:2 | After block statement | epilogues.go:88:8:92:2 | Normal Exit | | epilogues.go:88:15:92:2 | block statement | epilogues.go:89:3:91:3 | if statement | @@ -562,6 +571,7 @@ | epilogues.go:90:13:90:14 | After -... | epilogues.go:90:4:90:14 | assign:0 ... = ... | | epilogues.go:90:13:90:14 | Before -... | epilogues.go:90:13:90:14 | -... | | epilogues.go:93:2:95:2 | After if statement | epilogues.go:96:2:96:15 | ... = ... | +| epilogues.go:93:2:95:2 | catch-panic if statement | epilogues.go:88:8:92:4 | defer-invoke function call | | epilogues.go:93:2:95:2 | if statement | epilogues.go:93:5:93:9 | Before ...<... | | epilogues.go:93:5:93:5 | After x | epilogues.go:93:9:93:9 | Before 0 | | epilogues.go:93:5:93:5 | Before x | epilogues.go:93:5:93:5 | x | @@ -579,7 +589,7 @@ | epilogues.go:94:3:94:7 | Before panic | epilogues.go:94:3:94:7 | panic | | epilogues.go:94:3:94:7 | panic | epilogues.go:94:3:94:7 | After panic | | epilogues.go:94:3:94:14 | Before call to panic | epilogues.go:94:3:94:7 | Before panic | -| epilogues.go:94:3:94:14 | call to panic | epilogues.go:88:8:92:4 | defer-invoke function call | +| epilogues.go:94:3:94:14 | call to panic | epilogues.go:93:2:95:2 | catch-panic if statement | | epilogues.go:94:3:94:14 | expression statement | epilogues.go:94:3:94:14 | Before call to panic | | epilogues.go:94:9:94:13 | "neg" | epilogues.go:94:9:94:13 | After "neg" | | epilogues.go:94:9:94:13 | After "neg" | epilogues.go:94:3:94:14 | call to panic | @@ -597,8 +607,9 @@ | epilogues.go:96:15:96:15 | Before x | epilogues.go:96:15:96:15 | x | | epilogues.go:96:15:96:15 | x | epilogues.go:96:15:96:15 | After x | | epilogues.go:97:2:97:14 | Before return statement | epilogues.go:97:9:97:14 | Before result | +| epilogues.go:97:2:97:14 | catch-return return statement | epilogues.go:88:8:92:4 | defer-invoke function call | | epilogues.go:97:2:97:14 | result-write:0 return statement | epilogues.go:97:2:97:14 | return statement | -| epilogues.go:97:2:97:14 | return statement | epilogues.go:88:8:92:4 | defer-invoke function call | +| epilogues.go:97:2:97:14 | return statement | epilogues.go:97:2:97:14 | catch-return return statement | | epilogues.go:97:9:97:14 | After result | epilogues.go:97:2:97:14 | result-write:0 return statement | | epilogues.go:97:9:97:14 | Before result | epilogues.go:97:9:97:14 | result | | epilogues.go:97:9:97:14 | result | epilogues.go:97:9:97:14 | After result | @@ -617,15 +628,17 @@ | epilogues.go:102:50:110:1 | zero-init:1 block statement | epilogues.go:103:2:103:19 | Before defer statement | | epilogues.go:103:2:103:19 | After defer statement | epilogues.go:104:2:106:2 | if statement | | epilogues.go:103:2:103:19 | Before defer statement | epilogues.go:103:8:103:19 | call to epiRecover | +| epilogues.go:103:2:103:19 | catch-defer-panic defer statement | epilogues.go:102:1:110:1 | Exceptional Exit | | epilogues.go:103:2:103:19 | defer statement | epilogues.go:103:2:103:19 | After defer statement | | epilogues.go:103:8:103:17 | After epiRecover | epilogues.go:103:8:103:19 | After call to epiRecover | | epilogues.go:103:8:103:17 | Before epiRecover | epilogues.go:103:8:103:17 | epiRecover | | epilogues.go:103:8:103:17 | epiRecover | epilogues.go:103:8:103:17 | After epiRecover | | epilogues.go:103:8:103:19 | After call to epiRecover | epilogues.go:103:2:103:19 | defer statement | | epilogues.go:103:8:103:19 | call to epiRecover | epilogues.go:103:8:103:17 | Before epiRecover | -| epilogues.go:103:8:103:19 | defer-invoke call to epiRecover | epilogues.go:102:1:110:1 | Exceptional Exit | | epilogues.go:103:8:103:19 | defer-invoke call to epiRecover | epilogues.go:102:50:110:1 | result-read:0 block statement | +| epilogues.go:103:8:103:19 | defer-invoke call to epiRecover | epilogues.go:103:2:103:19 | catch-defer-panic defer statement | | epilogues.go:104:2:106:2 | After if statement | epilogues.go:107:2:107:6 | ... = ... | +| epilogues.go:104:2:106:2 | catch-return if statement | epilogues.go:103:8:103:19 | defer-invoke call to epiRecover | | epilogues.go:104:2:106:2 | if statement | epilogues.go:104:5:104:10 | Before ...==... | | epilogues.go:104:5:104:5 | After x | epilogues.go:104:10:104:10 | Before 0 | | epilogues.go:104:5:104:5 | Before x | epilogues.go:104:5:104:5 | x | @@ -640,7 +653,7 @@ | epilogues.go:104:10:104:10 | Before 0 | epilogues.go:104:10:104:10 | 0 | | epilogues.go:104:12:106:2 | block statement | epilogues.go:105:3:105:8 | Before return statement | | epilogues.go:105:3:105:8 | Before return statement | epilogues.go:105:3:105:8 | return statement | -| epilogues.go:105:3:105:8 | return statement | epilogues.go:103:8:103:19 | defer-invoke call to epiRecover | +| epilogues.go:105:3:105:8 | return statement | epilogues.go:104:2:106:2 | catch-return if statement | | epilogues.go:107:2:107:6 | ... = ... | epilogues.go:107:6:107:6 | Before x | | epilogues.go:107:2:107:6 | After ... = ... | epilogues.go:108:2:108:10 | ... = ... | | epilogues.go:107:2:107:6 | assign:0 ... = ... | epilogues.go:107:2:107:6 | After ... = ... | @@ -654,7 +667,8 @@ | epilogues.go:108:7:108:10 | Before true | epilogues.go:108:7:108:10 | true | | epilogues.go:108:7:108:10 | true | epilogues.go:108:7:108:10 | After true | | epilogues.go:109:2:109:7 | Before return statement | epilogues.go:109:2:109:7 | return statement | -| epilogues.go:109:2:109:7 | return statement | epilogues.go:103:8:103:19 | defer-invoke call to epiRecover | +| epilogues.go:109:2:109:7 | catch-return return statement | epilogues.go:103:8:103:19 | defer-invoke call to epiRecover | +| epilogues.go:109:2:109:7 | return statement | epilogues.go:109:2:109:7 | catch-return return statement | | epilogues.go:115:1:118:1 | After function declaration | epilogues.go:0:0:0:0 | After epilogues.go | | epilogues.go:115:1:118:1 | Before function declaration | epilogues.go:115:1:118:1 | function declaration | | epilogues.go:115:1:118:1 | Entry | epilogues.go:115:26:118:1 | block statement | @@ -665,19 +679,21 @@ | epilogues.go:115:26:118:1 | block statement | epilogues.go:116:2:116:19 | Before defer statement | | epilogues.go:116:2:116:19 | After defer statement | epilogues.go:117:2:117:14 | expression statement | | epilogues.go:116:2:116:19 | Before defer statement | epilogues.go:116:8:116:19 | call to epiRecover | +| epilogues.go:116:2:116:19 | catch-defer-panic defer statement | epilogues.go:115:1:118:1 | Exceptional Exit | | epilogues.go:116:2:116:19 | defer statement | epilogues.go:116:2:116:19 | After defer statement | | epilogues.go:116:8:116:17 | After epiRecover | epilogues.go:116:8:116:19 | After call to epiRecover | | epilogues.go:116:8:116:17 | Before epiRecover | epilogues.go:116:8:116:17 | epiRecover | | epilogues.go:116:8:116:17 | epiRecover | epilogues.go:116:8:116:17 | After epiRecover | | epilogues.go:116:8:116:19 | After call to epiRecover | epilogues.go:116:2:116:19 | defer statement | | epilogues.go:116:8:116:19 | call to epiRecover | epilogues.go:116:8:116:17 | Before epiRecover | -| epilogues.go:116:8:116:19 | defer-invoke call to epiRecover | epilogues.go:115:1:118:1 | Exceptional Exit | | epilogues.go:116:8:116:19 | defer-invoke call to epiRecover | epilogues.go:115:26:118:1 | After block statement | +| epilogues.go:116:8:116:19 | defer-invoke call to epiRecover | epilogues.go:116:2:116:19 | catch-defer-panic defer statement | | epilogues.go:117:2:117:6 | After panic | epilogues.go:117:8:117:13 | Before "boom" | | epilogues.go:117:2:117:6 | Before panic | epilogues.go:117:2:117:6 | panic | | epilogues.go:117:2:117:6 | panic | epilogues.go:117:2:117:6 | After panic | | epilogues.go:117:2:117:14 | Before call to panic | epilogues.go:117:2:117:6 | Before panic | -| epilogues.go:117:2:117:14 | call to panic | epilogues.go:116:8:116:19 | defer-invoke call to epiRecover | +| epilogues.go:117:2:117:14 | call to panic | epilogues.go:117:2:117:14 | catch-panic expression statement | +| epilogues.go:117:2:117:14 | catch-panic expression statement | epilogues.go:116:8:116:19 | defer-invoke call to epiRecover | | epilogues.go:117:2:117:14 | expression statement | epilogues.go:117:2:117:14 | Before call to panic | | epilogues.go:117:8:117:13 | "boom" | epilogues.go:117:8:117:13 | After "boom" | | epilogues.go:117:8:117:13 | After "boom" | epilogues.go:117:2:117:14 | call to panic | @@ -2901,19 +2917,21 @@ | stmts7.go:13:19:16:1 | block statement | stmts7.go:14:2:14:21 | Before defer statement | | stmts7.go:14:2:14:21 | After defer statement | stmts7.go:15:2:15:10 | expression statement | | stmts7.go:14:2:14:21 | Before defer statement | stmts7.go:14:8:14:21 | call to recoverPanic | +| stmts7.go:14:2:14:21 | catch-defer-panic defer statement | stmts7.go:13:1:16:1 | Exceptional Exit | | stmts7.go:14:2:14:21 | defer statement | stmts7.go:14:2:14:21 | After defer statement | | stmts7.go:14:8:14:19 | After recoverPanic | stmts7.go:14:8:14:21 | After call to recoverPanic | | stmts7.go:14:8:14:19 | Before recoverPanic | stmts7.go:14:8:14:19 | recoverPanic | | stmts7.go:14:8:14:19 | recoverPanic | stmts7.go:14:8:14:19 | After recoverPanic | | stmts7.go:14:8:14:21 | After call to recoverPanic | stmts7.go:14:2:14:21 | defer statement | | stmts7.go:14:8:14:21 | call to recoverPanic | stmts7.go:14:8:14:19 | Before recoverPanic | -| stmts7.go:14:8:14:21 | defer-invoke call to recoverPanic | stmts7.go:13:1:16:1 | Exceptional Exit | | stmts7.go:14:8:14:21 | defer-invoke call to recoverPanic | stmts7.go:13:19:16:1 | After block statement | +| stmts7.go:14:8:14:21 | defer-invoke call to recoverPanic | stmts7.go:14:2:14:21 | catch-defer-panic defer statement | | stmts7.go:15:2:15:6 | After panic | stmts7.go:15:8:15:9 | Before "" | | stmts7.go:15:2:15:6 | Before panic | stmts7.go:15:2:15:6 | panic | | stmts7.go:15:2:15:6 | panic | stmts7.go:15:2:15:6 | After panic | | stmts7.go:15:2:15:10 | Before call to panic | stmts7.go:15:2:15:6 | Before panic | -| stmts7.go:15:2:15:10 | call to panic | stmts7.go:14:8:14:21 | defer-invoke call to recoverPanic | +| stmts7.go:15:2:15:10 | call to panic | stmts7.go:15:2:15:10 | catch-panic expression statement | +| stmts7.go:15:2:15:10 | catch-panic expression statement | stmts7.go:14:8:14:21 | defer-invoke call to recoverPanic | | stmts7.go:15:2:15:10 | expression statement | stmts7.go:15:2:15:10 | Before call to panic | | stmts7.go:15:8:15:9 | "" | stmts7.go:15:8:15:9 | After "" | | stmts7.go:15:8:15:9 | After "" | stmts7.go:15:2:15:10 | call to panic | @@ -2954,6 +2972,7 @@ | stmts7.go:26:40:31:1 | block statement | stmts7.go:27:2:27:20 | Before defer statement | | stmts7.go:27:2:27:20 | After defer statement | stmts7.go:28:2:28:23 | Before defer statement | | stmts7.go:27:2:27:20 | Before defer statement | stmts7.go:27:8:27:20 | call to fn | +| stmts7.go:27:2:27:20 | catch-defer-panic defer statement | stmts7.go:26:1:31:1 | Exceptional Exit | | stmts7.go:27:2:27:20 | defer statement | stmts7.go:27:2:27:20 | After defer statement | | stmts7.go:27:8:27:15 | After callback | stmts7.go:27:8:27:18 | selection of fn | | stmts7.go:27:8:27:15 | Before callback | stmts7.go:27:8:27:15 | callback | @@ -2963,10 +2982,11 @@ | stmts7.go:27:8:27:18 | selection of fn | stmts7.go:27:8:27:18 | After selection of fn | | stmts7.go:27:8:27:20 | After call to fn | stmts7.go:27:2:27:20 | defer statement | | stmts7.go:27:8:27:20 | call to fn | stmts7.go:27:8:27:18 | Before selection of fn | -| stmts7.go:27:8:27:20 | defer-invoke call to fn | stmts7.go:26:1:31:1 | Exceptional Exit | | stmts7.go:27:8:27:20 | defer-invoke call to fn | stmts7.go:26:40:31:1 | After block statement | +| stmts7.go:27:8:27:20 | defer-invoke call to fn | stmts7.go:27:2:27:20 | catch-defer-panic defer statement | | stmts7.go:28:2:28:23 | After defer statement | stmts7.go:29:2:29:31 | expression statement | | stmts7.go:28:2:28:23 | Before defer statement | stmts7.go:28:8:28:23 | call to fn | +| stmts7.go:28:2:28:23 | catch-defer-panic defer statement | stmts7.go:27:8:27:20 | defer-invoke call to fn | | stmts7.go:28:2:28:23 | defer statement | stmts7.go:28:2:28:23 | After defer statement | | stmts7.go:28:8:28:18 | (...) | stmts7.go:28:9:28:17 | Before &... | | stmts7.go:28:8:28:18 | After (...) | stmts7.go:28:8:28:18 | implicit-deref (...) | @@ -2977,6 +2997,7 @@ | stmts7.go:28:8:28:23 | After call to fn | stmts7.go:28:2:28:23 | defer statement | | stmts7.go:28:8:28:23 | call to fn | stmts7.go:28:8:28:21 | Before selection of fn | | stmts7.go:28:8:28:23 | defer-invoke call to fn | stmts7.go:27:8:27:20 | defer-invoke call to fn | +| stmts7.go:28:8:28:23 | defer-invoke call to fn | stmts7.go:28:2:28:23 | catch-defer-panic defer statement | | stmts7.go:28:9:28:17 | &... | stmts7.go:28:9:28:17 | After &... | | stmts7.go:28:9:28:17 | After &... | stmts7.go:28:8:28:18 | After (...) | | stmts7.go:28:9:28:17 | Before &... | stmts7.go:28:10:28:17 | Before callback | @@ -2989,14 +3010,16 @@ | stmts7.go:29:2:29:31 | After call to Println | stmts7.go:29:2:29:31 | After expression statement | | stmts7.go:29:2:29:31 | After expression statement | stmts7.go:30:2:30:13 | Before return statement | | stmts7.go:29:2:29:31 | Before call to Println | stmts7.go:29:2:29:12 | Before selection of Println | -| stmts7.go:29:2:29:31 | call to Println | stmts7.go:28:8:28:23 | defer-invoke call to fn | | stmts7.go:29:2:29:31 | call to Println | stmts7.go:29:2:29:31 | After call to Println | +| stmts7.go:29:2:29:31 | call to Println | stmts7.go:29:2:29:31 | catch-panic expression statement | +| stmts7.go:29:2:29:31 | catch-panic expression statement | stmts7.go:28:8:28:23 | defer-invoke call to fn | | stmts7.go:29:2:29:31 | expression statement | stmts7.go:29:2:29:31 | Before call to Println | | stmts7.go:29:14:29:30 | "print something" | stmts7.go:29:14:29:30 | After "print something" | | stmts7.go:29:14:29:30 | After "print something" | stmts7.go:29:2:29:31 | call to Println | | stmts7.go:29:14:29:30 | Before "print something" | stmts7.go:29:14:29:30 | "print something" | | stmts7.go:30:2:30:13 | Before return statement | stmts7.go:30:9:30:13 | Before false | -| stmts7.go:30:2:30:13 | return statement | stmts7.go:28:8:28:23 | defer-invoke call to fn | +| stmts7.go:30:2:30:13 | catch-return return statement | stmts7.go:28:8:28:23 | defer-invoke call to fn | +| stmts7.go:30:2:30:13 | return statement | stmts7.go:30:2:30:13 | catch-return return statement | | stmts7.go:30:9:30:13 | After false | stmts7.go:30:2:30:13 | return statement | | stmts7.go:30:9:30:13 | Before false | stmts7.go:30:9:30:13 | false | | stmts7.go:30:9:30:13 | false | stmts7.go:30:9:30:13 | After false | @@ -3033,16 +3056,18 @@ | stmts7.go:38:22:41:1 | block statement | stmts7.go:39:2:39:21 | Before defer statement | | stmts7.go:39:2:39:21 | After defer statement | stmts7.go:40:2:40:30 | Before defer statement | | stmts7.go:39:2:39:21 | Before defer statement | stmts7.go:39:8:39:21 | call to recoverPanic | +| stmts7.go:39:2:39:21 | catch-defer-panic defer statement | stmts7.go:38:1:41:1 | Exceptional Exit | | stmts7.go:39:2:39:21 | defer statement | stmts7.go:39:2:39:21 | After defer statement | | stmts7.go:39:8:39:19 | After recoverPanic | stmts7.go:39:8:39:21 | After call to recoverPanic | | stmts7.go:39:8:39:19 | Before recoverPanic | stmts7.go:39:8:39:19 | recoverPanic | | stmts7.go:39:8:39:19 | recoverPanic | stmts7.go:39:8:39:19 | After recoverPanic | | stmts7.go:39:8:39:21 | After call to recoverPanic | stmts7.go:39:2:39:21 | defer statement | | stmts7.go:39:8:39:21 | call to recoverPanic | stmts7.go:39:8:39:19 | Before recoverPanic | -| stmts7.go:39:8:39:21 | defer-invoke call to recoverPanic | stmts7.go:38:1:41:1 | Exceptional Exit | | stmts7.go:39:8:39:21 | defer-invoke call to recoverPanic | stmts7.go:38:22:41:1 | After block statement | +| stmts7.go:39:8:39:21 | defer-invoke call to recoverPanic | stmts7.go:39:2:39:21 | catch-defer-panic defer statement | | stmts7.go:40:2:40:30 | After defer statement | stmts7.go:40:8:40:30 | defer-invoke call to panic | | stmts7.go:40:2:40:30 | Before defer statement | stmts7.go:40:8:40:30 | call to panic | +| stmts7.go:40:2:40:30 | catch-defer-panic defer statement | stmts7.go:39:8:39:21 | defer-invoke call to recoverPanic | | stmts7.go:40:2:40:30 | defer statement | stmts7.go:40:2:40:30 | After defer statement | | stmts7.go:40:8:40:12 | After panic | stmts7.go:40:14:40:29 | Before "deferred panic" | | stmts7.go:40:8:40:12 | Before panic | stmts7.go:40:8:40:12 | panic | @@ -3050,6 +3075,7 @@ | stmts7.go:40:8:40:30 | After call to panic | stmts7.go:40:2:40:30 | defer statement | | stmts7.go:40:8:40:30 | call to panic | stmts7.go:40:8:40:12 | Before panic | | stmts7.go:40:8:40:30 | defer-invoke call to panic | stmts7.go:39:8:39:21 | defer-invoke call to recoverPanic | +| stmts7.go:40:8:40:30 | defer-invoke call to panic | stmts7.go:40:2:40:30 | catch-defer-panic defer statement | | stmts7.go:40:14:40:29 | "deferred panic" | stmts7.go:40:14:40:29 | After "deferred panic" | | stmts7.go:40:14:40:29 | After "deferred panic" | stmts7.go:40:8:40:30 | After call to panic | | stmts7.go:40:14:40:29 | Before "deferred panic" | stmts7.go:40:14:40:29 | "deferred panic" | @@ -3061,13 +3087,14 @@ | stmts7.go:43:27:45:1 | block statement | stmts7.go:44:2:44:36 | Before defer statement | | stmts7.go:44:2:44:36 | After defer statement | stmts7.go:44:8:44:36 | defer-invoke call to panic | | stmts7.go:44:2:44:36 | Before defer statement | stmts7.go:44:8:44:36 | call to panic | +| stmts7.go:44:2:44:36 | catch-defer-panic defer statement | stmts7.go:43:1:45:1 | Exceptional Exit | | stmts7.go:44:2:44:36 | defer statement | stmts7.go:44:2:44:36 | After defer statement | | stmts7.go:44:8:44:12 | After panic | stmts7.go:44:14:44:35 | Before "final deferred panic" | | stmts7.go:44:8:44:12 | Before panic | stmts7.go:44:8:44:12 | panic | | stmts7.go:44:8:44:12 | panic | stmts7.go:44:8:44:12 | After panic | | stmts7.go:44:8:44:36 | After call to panic | stmts7.go:44:2:44:36 | defer statement | | stmts7.go:44:8:44:36 | call to panic | stmts7.go:44:8:44:12 | Before panic | -| stmts7.go:44:8:44:36 | defer-invoke call to panic | stmts7.go:43:1:45:1 | Exceptional Exit | +| stmts7.go:44:8:44:36 | defer-invoke call to panic | stmts7.go:44:2:44:36 | catch-defer-panic defer statement | | stmts7.go:44:14:44:35 | "final deferred panic" | stmts7.go:44:14:44:35 | After "final deferred panic" | | stmts7.go:44:14:44:35 | After "final deferred panic" | stmts7.go:44:8:44:36 | After call to panic | | stmts7.go:44:14:44:35 | Before "final deferred panic" | stmts7.go:44:14:44:35 | "final deferred panic" | @@ -3087,13 +3114,14 @@ | stmts7.go:48:8:48:21 | call to recoverPanic | stmts7.go:48:8:48:19 | Before recoverPanic | | stmts7.go:49:2:49:17 | After defer statement | stmts7.go:49:8:49:17 | defer-invoke call to Exit | | stmts7.go:49:2:49:17 | Before defer statement | stmts7.go:49:8:49:17 | call to Exit | +| stmts7.go:49:2:49:17 | catch-defer-panic defer statement | stmts7.go:47:1:50:1 | Exceptional Exit | | stmts7.go:49:2:49:17 | defer statement | stmts7.go:49:2:49:17 | After defer statement | | stmts7.go:49:8:49:14 | After selection of Exit | stmts7.go:49:16:49:16 | Before 1 | | stmts7.go:49:8:49:14 | Before selection of Exit | stmts7.go:49:8:49:14 | selection of Exit | | stmts7.go:49:8:49:14 | selection of Exit | stmts7.go:49:8:49:14 | After selection of Exit | | stmts7.go:49:8:49:17 | After call to Exit | stmts7.go:49:2:49:17 | defer statement | | stmts7.go:49:8:49:17 | call to Exit | stmts7.go:49:8:49:14 | Before selection of Exit | -| stmts7.go:49:8:49:17 | defer-invoke call to Exit | stmts7.go:47:1:50:1 | Exceptional Exit | +| stmts7.go:49:8:49:17 | defer-invoke call to Exit | stmts7.go:49:2:49:17 | catch-defer-panic defer statement | | stmts7.go:49:16:49:16 | 1 | stmts7.go:49:16:49:16 | After 1 | | stmts7.go:49:16:49:16 | After 1 | stmts7.go:49:8:49:17 | After call to Exit | | stmts7.go:49:16:49:16 | Before 1 | stmts7.go:49:16:49:16 | 1 | @@ -3109,22 +3137,24 @@ | stmts7.go:52:56:55:1 | block statement | stmts7.go:53:2:53:21 | Before defer statement | | stmts7.go:53:2:53:21 | After defer statement | stmts7.go:54:2:54:18 | ... = ... | | stmts7.go:53:2:53:21 | Before defer statement | stmts7.go:53:8:53:21 | call to recoverPanic | +| stmts7.go:53:2:53:21 | catch-defer-panic defer statement | stmts7.go:52:1:55:1 | Exceptional Exit | | stmts7.go:53:2:53:21 | defer statement | stmts7.go:53:2:53:21 | After defer statement | | stmts7.go:53:8:53:19 | After recoverPanic | stmts7.go:53:8:53:21 | After call to recoverPanic | | stmts7.go:53:8:53:19 | Before recoverPanic | stmts7.go:53:8:53:19 | recoverPanic | | stmts7.go:53:8:53:19 | recoverPanic | stmts7.go:53:8:53:19 | After recoverPanic | | stmts7.go:53:8:53:21 | After call to recoverPanic | stmts7.go:53:2:53:21 | defer statement | | stmts7.go:53:8:53:21 | call to recoverPanic | stmts7.go:53:8:53:19 | Before recoverPanic | -| stmts7.go:53:8:53:21 | defer-invoke call to recoverPanic | stmts7.go:52:1:55:1 | Exceptional Exit | | stmts7.go:53:8:53:21 | defer-invoke call to recoverPanic | stmts7.go:52:56:55:1 | After block statement | +| stmts7.go:53:8:53:21 | defer-invoke call to recoverPanic | stmts7.go:53:2:53:21 | catch-defer-panic defer statement | | stmts7.go:54:2:54:18 | ... = ... | stmts7.go:54:6:54:18 | Before index expression | | stmts7.go:54:2:54:18 | After ... = ... | stmts7.go:53:8:53:21 | defer-invoke call to recoverPanic | +| stmts7.go:54:2:54:18 | catch-panic ... = ... | stmts7.go:53:8:53:21 | defer-invoke call to recoverPanic | | stmts7.go:54:6:54:11 | After values | stmts7.go:54:13:54:17 | Before index | | stmts7.go:54:6:54:11 | Before values | stmts7.go:54:6:54:11 | values | | stmts7.go:54:6:54:11 | values | stmts7.go:54:6:54:11 | After values | | stmts7.go:54:6:54:18 | After index expression | stmts7.go:54:2:54:18 | After ... = ... | | stmts7.go:54:6:54:18 | Before index expression | stmts7.go:54:6:54:11 | Before values | -| stmts7.go:54:6:54:18 | index expression | stmts7.go:53:8:53:21 | defer-invoke call to recoverPanic | +| stmts7.go:54:6:54:18 | index expression | stmts7.go:54:2:54:18 | catch-panic ... = ... | | stmts7.go:54:6:54:18 | index expression | stmts7.go:54:6:54:18 | After index expression | | stmts7.go:54:13:54:17 | After index | stmts7.go:54:6:54:18 | index expression | | stmts7.go:54:13:54:17 | Before index | stmts7.go:54:13:54:17 | index | @@ -3149,14 +3179,15 @@ | stmts7.go:58:14:60:2 | block statement | stmts7.go:59:3:59:22 | Before defer statement | | stmts7.go:59:3:59:22 | After defer statement | stmts7.go:58:14:60:2 | After block statement | | stmts7.go:59:3:59:22 | Before defer statement | stmts7.go:59:9:59:22 | call to recoverPanic | +| stmts7.go:59:3:59:22 | catch-defer-panic defer statement | stmts7.go:57:1:62:1 | Exceptional Exit | | stmts7.go:59:3:59:22 | defer statement | stmts7.go:59:3:59:22 | After defer statement | | stmts7.go:59:9:59:20 | After recoverPanic | stmts7.go:59:9:59:22 | After call to recoverPanic | | stmts7.go:59:9:59:20 | Before recoverPanic | stmts7.go:59:9:59:20 | recoverPanic | | stmts7.go:59:9:59:20 | recoverPanic | stmts7.go:59:9:59:20 | After recoverPanic | | stmts7.go:59:9:59:22 | After call to recoverPanic | stmts7.go:59:3:59:22 | defer statement | | stmts7.go:59:9:59:22 | call to recoverPanic | stmts7.go:59:9:59:20 | Before recoverPanic | -| stmts7.go:59:9:59:22 | defer-invoke call to recoverPanic | stmts7.go:57:1:62:1 | Exceptional Exit | | stmts7.go:59:9:59:22 | defer-invoke call to recoverPanic | stmts7.go:57:38:62:1 | After block statement | +| stmts7.go:59:9:59:22 | defer-invoke call to recoverPanic | stmts7.go:59:3:59:22 | catch-defer-panic defer statement | | stmts7.go:61:2:61:12 | After selection of Println | stmts7.go:61:14:61:19 | Before "done" | | stmts7.go:61:2:61:12 | Before selection of Println | stmts7.go:61:2:61:12 | selection of Println | | stmts7.go:61:2:61:12 | selection of Println | stmts7.go:61:2:61:12 | After selection of Println | @@ -3164,8 +3195,10 @@ | stmts7.go:61:2:61:20 | After expression statement | stmts7.go:57:38:62:1 | After block statement | | stmts7.go:61:2:61:20 | After expression statement | stmts7.go:59:9:59:22 | defer-invoke call to recoverPanic | | stmts7.go:61:2:61:20 | Before call to Println | stmts7.go:61:2:61:12 | Before selection of Println | -| stmts7.go:61:2:61:20 | call to Println | stmts7.go:59:9:59:22 | defer-invoke call to recoverPanic | | stmts7.go:61:2:61:20 | call to Println | stmts7.go:61:2:61:20 | After call to Println | +| stmts7.go:61:2:61:20 | call to Println | stmts7.go:61:2:61:20 | catch-panic expression statement | +| stmts7.go:61:2:61:20 | catch-panic expression statement | stmts7.go:57:1:62:1 | Exceptional Exit | +| stmts7.go:61:2:61:20 | catch-panic expression statement | stmts7.go:59:9:59:22 | defer-invoke call to recoverPanic | | stmts7.go:61:2:61:20 | expression statement | stmts7.go:61:2:61:20 | Before call to Println | | stmts7.go:61:14:61:19 | "done" | stmts7.go:61:14:61:19 | After "done" | | stmts7.go:61:14:61:19 | After "done" | stmts7.go:61:2:61:20 | call to Println | @@ -3173,6 +3206,7 @@ | stmts7.go:64:1:68:1 | After function declaration | stmts7.go:70:1:77:1 | Before function declaration | | stmts7.go:64:1:68:1 | Before function declaration | stmts7.go:64:1:68:1 | function declaration | | stmts7.go:64:1:68:1 | Entry | stmts7.go:64:20:64:24 | count | +| stmts7.go:64:1:68:1 | Exceptional Exit | stmts7.go:64:1:68:1 | Exit | | stmts7.go:64:1:68:1 | Normal Exit | stmts7.go:64:1:68:1 | Exit | | stmts7.go:64:1:68:1 | function declaration | stmts7.go:64:1:68:1 | After function declaration | | stmts7.go:64:20:64:24 | count | stmts7.go:64:31:68:1 | block statement | @@ -3209,6 +3243,8 @@ | stmts7.go:65:29:67:2 | block statement | stmts7.go:66:3:66:22 | Before defer statement | | stmts7.go:66:3:66:22 | After defer statement | stmts7.go:65:29:67:2 | After block statement | | stmts7.go:66:3:66:22 | Before defer statement | stmts7.go:66:9:66:22 | call to recoverPanic | +| stmts7.go:66:3:66:22 | catch-defer-panic defer statement | stmts7.go:64:1:68:1 | Exceptional Exit | +| stmts7.go:66:3:66:22 | catch-defer-panic defer statement | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | | stmts7.go:66:3:66:22 | defer statement | stmts7.go:66:3:66:22 | After defer statement | | stmts7.go:66:9:66:20 | After recoverPanic | stmts7.go:66:9:66:22 | After call to recoverPanic | | stmts7.go:66:9:66:20 | Before recoverPanic | stmts7.go:66:9:66:20 | recoverPanic | @@ -3216,6 +3252,7 @@ | stmts7.go:66:9:66:22 | After call to recoverPanic | stmts7.go:66:3:66:22 | defer statement | | stmts7.go:66:9:66:22 | call to recoverPanic | stmts7.go:66:9:66:20 | Before recoverPanic | | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | stmts7.go:64:31:68:1 | After block statement | +| stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | stmts7.go:66:3:66:22 | catch-defer-panic defer statement | | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | | stmts7.go:70:1:77:1 | After function declaration | stmts7.go:79:1:85:1 | Before function declaration | | stmts7.go:70:1:77:1 | Before function declaration | stmts7.go:70:1:77:1 | function declaration | @@ -3238,16 +3275,19 @@ | stmts7.go:72:3:72:11 | goto statement | stmts7.go:75:1:76:20 | labeled statement | | stmts7.go:74:2:74:21 | After defer statement | stmts7.go:75:1:76:20 | labeled statement | | stmts7.go:74:2:74:21 | Before defer statement | stmts7.go:74:8:74:21 | call to recoverPanic | +| stmts7.go:74:2:74:21 | catch-defer-panic defer statement | stmts7.go:70:1:77:1 | Exceptional Exit | | stmts7.go:74:2:74:21 | defer statement | stmts7.go:74:2:74:21 | After defer statement | | stmts7.go:74:8:74:19 | After recoverPanic | stmts7.go:74:8:74:21 | After call to recoverPanic | | stmts7.go:74:8:74:19 | Before recoverPanic | stmts7.go:74:8:74:19 | recoverPanic | | stmts7.go:74:8:74:19 | recoverPanic | stmts7.go:74:8:74:19 | After recoverPanic | | stmts7.go:74:8:74:21 | After call to recoverPanic | stmts7.go:74:2:74:21 | defer statement | | stmts7.go:74:8:74:21 | call to recoverPanic | stmts7.go:74:8:74:19 | Before recoverPanic | -| stmts7.go:74:8:74:21 | defer-invoke call to recoverPanic | stmts7.go:70:1:77:1 | Exceptional Exit | | stmts7.go:74:8:74:21 | defer-invoke call to recoverPanic | stmts7.go:70:31:77:1 | After block statement | +| stmts7.go:74:8:74:21 | defer-invoke call to recoverPanic | stmts7.go:74:2:74:21 | catch-defer-panic defer statement | | stmts7.go:75:1:76:20 | After labeled statement | stmts7.go:70:31:77:1 | After block statement | | stmts7.go:75:1:76:20 | After labeled statement | stmts7.go:74:8:74:21 | defer-invoke call to recoverPanic | +| stmts7.go:75:1:76:20 | catch-panic labeled statement | stmts7.go:70:1:77:1 | Exceptional Exit | +| stmts7.go:75:1:76:20 | catch-panic labeled statement | stmts7.go:74:8:74:21 | defer-invoke call to recoverPanic | | stmts7.go:75:1:76:20 | labeled statement | stmts7.go:76:2:76:20 | expression statement | | stmts7.go:76:2:76:12 | After selection of Println | stmts7.go:76:14:76:19 | Before "done" | | stmts7.go:76:2:76:12 | Before selection of Println | stmts7.go:76:2:76:12 | selection of Println | @@ -3255,7 +3295,7 @@ | stmts7.go:76:2:76:20 | After call to Println | stmts7.go:76:2:76:20 | After expression statement | | stmts7.go:76:2:76:20 | After expression statement | stmts7.go:75:1:76:20 | After labeled statement | | stmts7.go:76:2:76:20 | Before call to Println | stmts7.go:76:2:76:12 | Before selection of Println | -| stmts7.go:76:2:76:20 | call to Println | stmts7.go:74:8:74:21 | defer-invoke call to recoverPanic | +| stmts7.go:76:2:76:20 | call to Println | stmts7.go:75:1:76:20 | catch-panic labeled statement | | stmts7.go:76:2:76:20 | call to Println | stmts7.go:76:2:76:20 | After call to Println | | stmts7.go:76:2:76:20 | expression statement | stmts7.go:76:2:76:20 | Before call to Println | | stmts7.go:76:14:76:19 | "done" | stmts7.go:76:14:76:19 | After "done" | @@ -3271,6 +3311,7 @@ | stmts7.go:79:40:85:1 | After block statement | stmts7.go:79:1:85:1 | Normal Exit | | stmts7.go:79:40:85:1 | block statement | stmts7.go:80:2:82:2 | if statement | | stmts7.go:80:2:82:2 | After if statement | stmts7.go:83:2:83:21 | Before defer statement | +| stmts7.go:80:2:82:2 | catch-panic if statement | stmts7.go:79:1:85:1 | Exceptional Exit | | stmts7.go:80:2:82:2 | if statement | stmts7.go:80:5:80:14 | Before panicEarly | | stmts7.go:80:5:80:14 | After panicEarly [false] | stmts7.go:80:2:82:2 | After if statement | | stmts7.go:80:5:80:14 | After panicEarly [true] | stmts7.go:80:16:82:2 | block statement | @@ -3282,26 +3323,28 @@ | stmts7.go:81:3:81:7 | Before panic | stmts7.go:81:3:81:7 | panic | | stmts7.go:81:3:81:7 | panic | stmts7.go:81:3:81:7 | After panic | | stmts7.go:81:3:81:16 | Before call to panic | stmts7.go:81:3:81:7 | Before panic | -| stmts7.go:81:3:81:16 | call to panic | stmts7.go:79:1:85:1 | Exceptional Exit | +| stmts7.go:81:3:81:16 | call to panic | stmts7.go:80:2:82:2 | catch-panic if statement | | stmts7.go:81:3:81:16 | expression statement | stmts7.go:81:3:81:16 | Before call to panic | | stmts7.go:81:9:81:15 | "early" | stmts7.go:81:9:81:15 | After "early" | | stmts7.go:81:9:81:15 | After "early" | stmts7.go:81:3:81:16 | call to panic | | stmts7.go:81:9:81:15 | Before "early" | stmts7.go:81:9:81:15 | "early" | | stmts7.go:83:2:83:21 | After defer statement | stmts7.go:84:2:84:14 | expression statement | | stmts7.go:83:2:83:21 | Before defer statement | stmts7.go:83:8:83:21 | call to recoverPanic | +| stmts7.go:83:2:83:21 | catch-defer-panic defer statement | stmts7.go:79:1:85:1 | Exceptional Exit | | stmts7.go:83:2:83:21 | defer statement | stmts7.go:83:2:83:21 | After defer statement | | stmts7.go:83:8:83:19 | After recoverPanic | stmts7.go:83:8:83:21 | After call to recoverPanic | | stmts7.go:83:8:83:19 | Before recoverPanic | stmts7.go:83:8:83:19 | recoverPanic | | stmts7.go:83:8:83:19 | recoverPanic | stmts7.go:83:8:83:19 | After recoverPanic | | stmts7.go:83:8:83:21 | After call to recoverPanic | stmts7.go:83:2:83:21 | defer statement | | stmts7.go:83:8:83:21 | call to recoverPanic | stmts7.go:83:8:83:19 | Before recoverPanic | -| stmts7.go:83:8:83:21 | defer-invoke call to recoverPanic | stmts7.go:79:1:85:1 | Exceptional Exit | | stmts7.go:83:8:83:21 | defer-invoke call to recoverPanic | stmts7.go:79:40:85:1 | After block statement | +| stmts7.go:83:8:83:21 | defer-invoke call to recoverPanic | stmts7.go:83:2:83:21 | catch-defer-panic defer statement | | stmts7.go:84:2:84:6 | After panic | stmts7.go:84:8:84:13 | Before "late" | | stmts7.go:84:2:84:6 | Before panic | stmts7.go:84:2:84:6 | panic | | stmts7.go:84:2:84:6 | panic | stmts7.go:84:2:84:6 | After panic | | stmts7.go:84:2:84:14 | Before call to panic | stmts7.go:84:2:84:6 | Before panic | -| stmts7.go:84:2:84:14 | call to panic | stmts7.go:83:8:83:21 | defer-invoke call to recoverPanic | +| stmts7.go:84:2:84:14 | call to panic | stmts7.go:84:2:84:14 | catch-panic expression statement | +| stmts7.go:84:2:84:14 | catch-panic expression statement | stmts7.go:83:8:83:21 | defer-invoke call to recoverPanic | | stmts7.go:84:2:84:14 | expression statement | stmts7.go:84:2:84:14 | Before call to panic | | stmts7.go:84:8:84:13 | "late" | stmts7.go:84:8:84:13 | After "late" | | stmts7.go:84:8:84:13 | After "late" | stmts7.go:84:2:84:14 | call to panic | @@ -3681,6 +3724,7 @@ | stmts.go:66:11:68:2 | block statement | stmts.go:67:3:67:35 | Before defer statement | | stmts.go:67:3:67:35 | After defer statement | stmts.go:66:11:68:2 | After block statement | | stmts.go:67:3:67:35 | Before defer statement | stmts.go:67:9:67:35 | function call | +| stmts.go:67:3:67:35 | catch-defer-panic defer statement | stmts.go:65:1:72:1 | Exceptional Exit | | stmts.go:67:3:67:35 | defer statement | stmts.go:67:3:67:35 | After defer statement | | stmts.go:67:9:67:33 | After function literal | stmts.go:67:9:67:35 | After function call | | stmts.go:67:9:67:33 | Before function literal | stmts.go:67:9:67:33 | function literal | @@ -3689,8 +3733,8 @@ | stmts.go:67:9:67:33 | Normal Exit | stmts.go:67:9:67:33 | Exit | | stmts.go:67:9:67:33 | function literal | stmts.go:67:9:67:33 | After function literal | | stmts.go:67:9:67:35 | After function call | stmts.go:67:3:67:35 | defer statement | -| stmts.go:67:9:67:35 | defer-invoke function call | stmts.go:65:1:72:1 | Exceptional Exit | | stmts.go:67:9:67:35 | defer-invoke function call | stmts.go:65:23:72:1 | After block statement | +| stmts.go:67:9:67:35 | defer-invoke function call | stmts.go:67:3:67:35 | catch-defer-panic defer statement | | stmts.go:67:9:67:35 | function call | stmts.go:67:9:67:33 | Before function literal | | stmts.go:67:16:67:33 | After block statement | stmts.go:67:9:67:33 | Normal Exit | | stmts.go:67:16:67:33 | block statement | stmts.go:67:18:67:31 | expression statement | @@ -3710,6 +3754,7 @@ | stmts.go:68:9:70:2 | block statement | stmts.go:69:3:69:36 | Before defer statement | | stmts.go:69:3:69:36 | After defer statement | stmts.go:68:9:70:2 | After block statement | | stmts.go:69:3:69:36 | Before defer statement | stmts.go:69:9:69:36 | function call | +| stmts.go:69:3:69:36 | catch-defer-panic defer statement | stmts.go:65:1:72:1 | Exceptional Exit | | stmts.go:69:3:69:36 | defer statement | stmts.go:69:3:69:36 | After defer statement | | stmts.go:69:9:69:34 | After function literal | stmts.go:69:9:69:36 | After function call | | stmts.go:69:9:69:34 | Before function literal | stmts.go:69:9:69:34 | function literal | @@ -3718,8 +3763,8 @@ | stmts.go:69:9:69:34 | Normal Exit | stmts.go:69:9:69:34 | Exit | | stmts.go:69:9:69:34 | function literal | stmts.go:69:9:69:34 | After function literal | | stmts.go:69:9:69:36 | After function call | stmts.go:69:3:69:36 | defer statement | -| stmts.go:69:9:69:36 | defer-invoke function call | stmts.go:65:1:72:1 | Exceptional Exit | | stmts.go:69:9:69:36 | defer-invoke function call | stmts.go:65:23:72:1 | After block statement | +| stmts.go:69:9:69:36 | defer-invoke function call | stmts.go:69:3:69:36 | catch-defer-panic defer statement | | stmts.go:69:9:69:36 | function call | stmts.go:69:9:69:34 | Before function literal | | stmts.go:69:16:69:34 | After block statement | stmts.go:69:9:69:34 | Normal Exit | | stmts.go:69:16:69:34 | block statement | stmts.go:69:18:69:32 | expression statement | @@ -3739,8 +3784,9 @@ | stmts.go:69:31:69:31 | Before x | stmts.go:69:31:69:31 | x | | stmts.go:69:31:69:31 | x | stmts.go:69:31:69:31 | After x | | stmts.go:71:2:71:10 | Before return statement | stmts.go:71:9:71:10 | Before 42 | -| stmts.go:71:2:71:10 | return statement | stmts.go:67:9:67:35 | defer-invoke function call | -| stmts.go:71:2:71:10 | return statement | stmts.go:69:9:69:36 | defer-invoke function call | +| stmts.go:71:2:71:10 | catch-return return statement | stmts.go:67:9:67:35 | defer-invoke function call | +| stmts.go:71:2:71:10 | catch-return return statement | stmts.go:69:9:69:36 | defer-invoke function call | +| stmts.go:71:2:71:10 | return statement | stmts.go:71:2:71:10 | catch-return return statement | | stmts.go:71:9:71:10 | 42 | stmts.go:71:9:71:10 | After 42 | | stmts.go:71:9:71:10 | After 42 | stmts.go:71:2:71:10 | return statement | | stmts.go:71:9:71:10 | Before 42 | stmts.go:71:9:71:10 | 42 | diff --git a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll index 279410f98fda..3b423fc53972 100644 --- a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll +++ b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll @@ -1219,37 +1219,6 @@ module Make0 Ast> { */ predicate endAbruptCompletion(AstNode ast, PreControlFlowNode n, AbruptCompletion c); - /** - * Holds if the language-specific implementation replaces the edge from - * `source` to `target` for abrupt completion `completion` originating - * at `source`. - * - * This is useful when whether an abrupt completion is intercepted - * depends on its source, for example when Go routes a panic through the - * deferred calls that are active at that source. The language is - * responsible for providing the replacement control-flow edge. - * - * The default implementation does not override any edges. - */ - default predicate overridesAbruptCompletionEdge( - PreControlFlowNode source, PreControlFlowNode target, AbruptCompletion completion - ) { - none() - } - - /** - * Holds if there is an additional control-flow edge from `n1` to `n2` - * with successor type `t`. - * - * This is useful for language-specific edges whose successor type cannot - * be inferred from their target node. - */ - default predicate additionalSuccessor( - PreControlFlowNode n1, PreControlFlowNode n2, SuccessorType t - ) { - none() - } - /** * Holds if the language-specific implementation provides all control flow * for `ast`, suppressing the default left-to-right evaluation steps. @@ -2078,8 +2047,7 @@ module Make0 Ast> { // Require a predecessor as a coarse approximation of reachability. // In particular, this prevents a catch-all catch clause preceding a // finally block from adding exception edges out of the finally. - (step(_, last) or Input2::additionalSuccessor(_, last, _)) and - beginAbruptCompletion(ast, last, c, _) + step(_, last) and beginAbruptCompletion(ast, last, c, _) or exists(AstNode child | getChild(ast, _) = child and @@ -2102,8 +2070,6 @@ module Make0 Ast> { } private predicate preSucc(PreControlFlowNode n1, PreControlFlowNode n2, SuccessorType t) { - Input2::additionalSuccessor(n1, n2, t) - or step(n1, n2) and n2 = TAfterValueNode(_, t) or step(n1, n2) and n2.(AdditionalNode).getSuccessorType() = t @@ -2116,7 +2082,6 @@ module Make0 Ast> { exists(AstNode ast, AbruptCompletion c | last(ast, n1, c) and endAbruptCompletion(ast, n2, c) and - not Input2::overridesAbruptCompletionEdge(n1, n2, c) and t = c.getSuccessorType() ) } From 65cffd7bf371971dade85379375387483f95abb8 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 2 Sep 2026 13:42:07 +0100 Subject: [PATCH 1009/2098] Remove CFG hook by making CFG for SelectStmt simpler --- .../go/controlflow/ControlFlowGraphImpl.qll | 44 ++++++------------- .../ControlFlowNode_getASuccessor.expected | 27 +++++++++--- .../codeql/controlflow/ControlFlowGraph.qll | 11 ----- 3 files changed, 33 insertions(+), 49 deletions(-) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll index fb33a3221a98..b167be07018d 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll @@ -1084,21 +1084,11 @@ module CfgImpl { ) } - additional predicate overridesDefaultControlFlow(Ast::AstNode ast) { - exists(Go::SelectStmt sel, Go::RecvStmt recv | - recv = sel.getACommClause().getComm() and - (ast = recv or ast = recv.getExpr()) - ) - or - exists(Go::SelectStmt sel, Go::SendStmt send | - send = sel.getACommClause().getComm() and ast = send - ) - } - additional predicate preservesDefaultControlFlow(Ast::AstNode ast) { ast = any(Go::FuncDef fd | hasFuncDefPrologue(fd)).getBody() or - exists(getFirstEpilogueTag(ast)) + exists(getFirstEpilogueTag(ast)) and + not ast = any(Go::SelectStmt sel).getACommClause().getComm().(Go::RecvStmt) } additional predicate overridesDefaultControlFlowStep( @@ -1569,19 +1559,17 @@ module CfgImpl { * The channel operands (and, for a send, the value) of every clause are * evaluated up front in the prep phase (see `selectCommPrepStart` and * friends), and the `select` then non-deterministically dispatches to one - * clause via `In(sel) -> Before(cc)`. The communication node itself - * (`In(recv.getExpr())` for a receive, `In(send)` for a send) is therefore - * only reached through that dispatch, never by ordinary left-to-right - * evaluation of the clause. - * - * Default sequencing for the communication statements is suppressed by - * `overridesDefaultControlFlow` above, so the communication can only be - * reached through the select dispatch. + * clause via `In(sel) -> Before(cc) -> Before(comm)`. Explicit steps from + * the communication statement's `Before` node then skip the operands that + * were already evaluated during preparation and perform the selected + * communication. */ private predicate selectedCommStep( Go::SelectStmt sel, PreControlFlowNode n1, PreControlFlowNode n2 ) { exists(Go::SendStmt send | send = sel.getACommClause().getComm() | + n1.isBefore(send) and n2.isIn(send) + or // The send communication happens at `In(send)`; flow then continues to // the clause body via `selectStmtStep`. n1.isIn(send) and n2.isAfter(send) @@ -1595,6 +1583,10 @@ module CfgImpl { cc = sel.getACommClause() and recv = cc.getComm() and ( + n1.isBefore(recv) and n2.isBefore(recv.getExpr()) + or + n1.isBefore(recv.getExpr()) and n2.isIn(recv.getExpr()) + or n1.isIn(recv.getExpr()) and ( n2.isBefore(recv.getLhs(0)) @@ -1650,9 +1642,7 @@ module CfgImpl { exists(Go::CommClause cc | sel.getACommClause() = cc | n1.isBefore(cc) and ( - n2.isIn(cc.getComm().(Go::RecvStmt).getExpr()) - or - n2.isIn(cc.getComm().(Go::SendStmt)) + n2.isBefore(cc.getComm()) or not exists(cc.getComm()) and commClauseBodyStart(sel, cc, n2) ) @@ -1745,10 +1735,6 @@ module CfgImpl { ) } - predicate overridesDefaultControlFlow(Ast::AstNode ast) { - Input1::overridesDefaultControlFlow(ast) - } - predicate preservesDefaultControlFlow(Ast::AstNode ast) { Input1::preservesDefaultControlFlow(ast) } @@ -1774,10 +1760,6 @@ module CfgImpl { Input1::endAbruptCompletion(ast, n, c) } - predicate overridesDefaultControlFlow(Ast::AstNode ast) { - Input1::overridesDefaultControlFlow(ast) - } - predicate preservesDefaultControlFlow(Ast::AstNode ast) { Input1::preservesDefaultControlFlow(ast) } diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected index 2a04c5bb8e3c..b408ace01434 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected @@ -2618,24 +2618,28 @@ | stmts2.go:16:2:26:2 | select statement | stmts2.go:18:2:19:10 | comm clause | | stmts2.go:16:2:26:2 | select statement | stmts2.go:20:2:24:10 | comm clause | | stmts2.go:16:2:26:2 | select statement | stmts2.go:25:2:25:18 | comm clause | -| stmts2.go:17:2:17:15 | comm clause | stmts2.go:17:11:17:14 | <-... | +| stmts2.go:17:2:17:15 | comm clause | stmts2.go:17:7:17:14 | ... = ... | | stmts2.go:17:7:17:7 | After _ | stmts2.go:16:2:26:2 | After select statement | | stmts2.go:17:7:17:7 | Before _ | stmts2.go:17:7:17:7 | _ | | stmts2.go:17:7:17:7 | _ | stmts2.go:17:7:17:7 | After _ | +| stmts2.go:17:7:17:14 | ... = ... | stmts2.go:17:11:17:14 | Before <-... | | stmts2.go:17:11:17:14 | <-... | stmts2.go:17:7:17:7 | Before _ | +| stmts2.go:17:11:17:14 | Before <-... | stmts2.go:17:11:17:14 | <-... | | stmts2.go:17:13:17:14 | After ch | stmts2.go:18:17:18:18 | Before ch | | stmts2.go:17:13:17:14 | Before ch | stmts2.go:17:13:17:14 | ch | | stmts2.go:17:13:17:14 | ch | stmts2.go:17:13:17:14 | After ch | -| stmts2.go:18:2:19:10 | comm clause | stmts2.go:18:15:18:18 | <-... | +| stmts2.go:18:2:19:10 | comm clause | stmts2.go:18:7:18:18 | ... := ... | | stmts2.go:18:7:18:7 | After x | stmts2.go:18:10:18:10 | Before _ | | stmts2.go:18:7:18:7 | Before x | stmts2.go:18:7:18:7 | x | | stmts2.go:18:7:18:7 | x | stmts2.go:18:7:18:7 | After x | +| stmts2.go:18:7:18:18 | ... := ... | stmts2.go:18:15:18:18 | Before <-... | | stmts2.go:18:7:18:18 | extract:0 ... := ... | stmts2.go:18:7:18:18 | extract:1 ... := ... | | stmts2.go:18:7:18:18 | extract:1 ... := ... | stmts2.go:19:3:19:10 | Before return statement | | stmts2.go:18:10:18:10 | After _ | stmts2.go:18:7:18:18 | extract:0 ... := ... | | stmts2.go:18:10:18:10 | Before _ | stmts2.go:18:10:18:10 | _ | | stmts2.go:18:10:18:10 | _ | stmts2.go:18:10:18:10 | After _ | | stmts2.go:18:15:18:18 | <-... | stmts2.go:18:7:18:7 | Before x | +| stmts2.go:18:15:18:18 | Before <-... | stmts2.go:18:15:18:18 | <-... | | stmts2.go:18:17:18:18 | After ch | stmts2.go:20:17:20:18 | Before ch | | stmts2.go:18:17:18:18 | Before ch | stmts2.go:18:17:18:18 | ch | | stmts2.go:18:17:18:18 | ch | stmts2.go:18:17:18:18 | After ch | @@ -2644,16 +2648,18 @@ | stmts2.go:19:10:19:10 | After x | stmts2.go:19:3:19:10 | return statement | | stmts2.go:19:10:19:10 | Before x | stmts2.go:19:10:19:10 | x | | stmts2.go:19:10:19:10 | x | stmts2.go:19:10:19:10 | After x | -| stmts2.go:20:2:24:10 | comm clause | stmts2.go:20:15:20:18 | <-... | +| stmts2.go:20:2:24:10 | comm clause | stmts2.go:20:7:20:18 | ... := ... | | stmts2.go:20:7:20:7 | After _ | stmts2.go:20:10:20:10 | Before y | | stmts2.go:20:7:20:7 | Before _ | stmts2.go:20:7:20:7 | _ | | stmts2.go:20:7:20:7 | _ | stmts2.go:20:7:20:7 | After _ | +| stmts2.go:20:7:20:18 | ... := ... | stmts2.go:20:15:20:18 | Before <-... | | stmts2.go:20:7:20:18 | extract:0 ... := ... | stmts2.go:20:7:20:18 | extract:1 ... := ... | | stmts2.go:20:7:20:18 | extract:1 ... := ... | stmts2.go:21:3:23:3 | if statement | | stmts2.go:20:10:20:10 | After y | stmts2.go:20:7:20:18 | extract:0 ... := ... | | stmts2.go:20:10:20:10 | Before y | stmts2.go:20:10:20:10 | y | | stmts2.go:20:10:20:10 | y | stmts2.go:20:10:20:10 | After y | | stmts2.go:20:15:20:18 | <-... | stmts2.go:20:7:20:7 | Before _ | +| stmts2.go:20:15:20:18 | Before <-... | stmts2.go:20:15:20:18 | <-... | | stmts2.go:20:17:20:18 | After ch | stmts2.go:25:16:25:17 | Before ch | | stmts2.go:20:17:20:18 | Before ch | stmts2.go:20:17:20:18 | ch | | stmts2.go:20:17:20:18 | ch | stmts2.go:20:17:20:18 | After ch | @@ -2672,16 +2678,18 @@ | stmts2.go:24:10:24:10 | 0 | stmts2.go:24:10:24:10 | After 0 | | stmts2.go:24:10:24:10 | After 0 | stmts2.go:24:3:24:10 | return statement | | stmts2.go:24:10:24:10 | Before 0 | stmts2.go:24:10:24:10 | 0 | -| stmts2.go:25:2:25:18 | comm clause | stmts2.go:25:14:25:17 | <-... | +| stmts2.go:25:2:25:18 | comm clause | stmts2.go:25:7:25:17 | ... = ... | | stmts2.go:25:7:25:7 | After _ | stmts2.go:25:10:25:10 | Before _ | | stmts2.go:25:7:25:7 | Before _ | stmts2.go:25:7:25:7 | _ | | stmts2.go:25:7:25:7 | _ | stmts2.go:25:7:25:7 | After _ | +| stmts2.go:25:7:25:17 | ... = ... | stmts2.go:25:14:25:17 | Before <-... | | stmts2.go:25:7:25:17 | extract:0 ... = ... | stmts2.go:25:7:25:17 | extract:1 ... = ... | | stmts2.go:25:7:25:17 | extract:1 ... = ... | stmts2.go:16:2:26:2 | After select statement | | stmts2.go:25:10:25:10 | After _ | stmts2.go:25:7:25:17 | extract:0 ... = ... | | stmts2.go:25:10:25:10 | Before _ | stmts2.go:25:10:25:10 | _ | | stmts2.go:25:10:25:10 | _ | stmts2.go:25:10:25:10 | After _ | | stmts2.go:25:14:25:17 | <-... | stmts2.go:25:7:25:7 | Before _ | +| stmts2.go:25:14:25:17 | Before <-... | stmts2.go:25:14:25:17 | <-... | | stmts2.go:25:16:25:17 | After ch | stmts2.go:16:2:26:2 | select statement | | stmts2.go:25:16:25:17 | Before ch | stmts2.go:25:16:25:17 | ch | | stmts2.go:25:16:25:17 | ch | stmts2.go:25:16:25:17 | After ch | @@ -3617,8 +3625,10 @@ | stmts.go:50:2:59:2 | select statement | stmts.go:53:2:55:16 | comm clause | | stmts.go:50:2:59:2 | select statement | stmts.go:56:2:57:15 | comm clause | | stmts.go:50:2:59:2 | select statement | stmts.go:58:2:58:16 | comm clause | -| stmts.go:51:2:52:31 | comm clause | stmts.go:51:7:51:11 | <-... | +| stmts.go:51:2:52:31 | comm clause | stmts.go:51:7:51:11 | expression statement | | stmts.go:51:7:51:11 | <-... | stmts.go:52:3:52:31 | expression statement | +| stmts.go:51:7:51:11 | Before <-... | stmts.go:51:7:51:11 | <-... | +| stmts.go:51:7:51:11 | expression statement | stmts.go:51:7:51:11 | Before <-... | | stmts.go:51:9:51:11 | After ch1 | stmts.go:53:19:53:21 | Before ch2 | | stmts.go:51:9:51:11 | Before ch1 | stmts.go:51:9:51:11 | ch1 | | stmts.go:51:9:51:11 | ch1 | stmts.go:51:9:51:11 | After ch1 | @@ -3634,7 +3644,7 @@ | stmts.go:52:15:52:30 | "Heard from ch1" | stmts.go:52:15:52:30 | After "Heard from ch1" | | stmts.go:52:15:52:30 | After "Heard from ch1" | stmts.go:52:3:52:31 | call to Println | | stmts.go:52:15:52:30 | Before "Heard from ch1" | stmts.go:52:15:52:30 | "Heard from ch1" | -| stmts.go:53:2:55:16 | comm clause | stmts.go:53:17:53:21 | <-... | +| stmts.go:53:2:55:16 | comm clause | stmts.go:53:7:53:21 | ... = ... | | stmts.go:53:7:53:7 | After a | stmts.go:53:9:53:9 | Before 0 | | stmts.go:53:7:53:7 | Before a | stmts.go:53:7:53:7 | a | | stmts.go:53:7:53:7 | a | stmts.go:53:7:53:7 | After a | @@ -3642,6 +3652,7 @@ | stmts.go:53:7:53:10 | Before index expression | stmts.go:53:7:53:7 | Before a | | stmts.go:53:7:53:10 | index expression | stmts.go:46:1:62:1 | Exceptional Exit | | stmts.go:53:7:53:10 | index expression | stmts.go:53:7:53:10 | After index expression | +| stmts.go:53:7:53:21 | ... = ... | stmts.go:53:17:53:21 | Before <-... | | stmts.go:53:7:53:21 | extract:0 ... = ... | stmts.go:53:7:53:21 | extract:1 ... = ... | | stmts.go:53:7:53:21 | extract:1 ... = ... | stmts.go:54:3:54:16 | expression statement | | stmts.go:53:9:53:9 | 0 | stmts.go:53:9:53:9 | After 0 | @@ -3651,6 +3662,7 @@ | stmts.go:53:13:53:13 | Before w | stmts.go:53:13:53:13 | w | | stmts.go:53:13:53:13 | w | stmts.go:53:13:53:13 | After w | | stmts.go:53:17:53:21 | <-... | stmts.go:53:7:53:10 | Before index expression | +| stmts.go:53:17:53:21 | Before <-... | stmts.go:53:17:53:21 | <-... | | stmts.go:53:19:53:21 | After ch2 | stmts.go:58:7:58:9 | Before ch1 | | stmts.go:53:19:53:21 | Before ch2 | stmts.go:53:19:53:21 | ch2 | | stmts.go:53:19:53:21 | ch2 | stmts.go:53:19:53:21 | After ch2 | @@ -3688,11 +3700,12 @@ | stmts.go:57:3:57:15 | call to Println | stmts.go:46:1:62:1 | Exceptional Exit | | stmts.go:57:3:57:15 | call to Println | stmts.go:57:3:57:15 | After call to Println | | stmts.go:57:3:57:15 | expression statement | stmts.go:57:3:57:15 | Before call to Println | -| stmts.go:58:2:58:16 | comm clause | stmts.go:58:7:58:15 | send statement | +| stmts.go:58:2:58:16 | comm clause | stmts.go:58:7:58:15 | Before send statement | | stmts.go:58:7:58:9 | After ch1 | stmts.go:58:14:58:15 | Before 42 | | stmts.go:58:7:58:9 | Before ch1 | stmts.go:58:7:58:9 | ch1 | | stmts.go:58:7:58:9 | ch1 | stmts.go:58:7:58:9 | After ch1 | | stmts.go:58:7:58:15 | After send statement | stmts.go:50:2:59:2 | After select statement | +| stmts.go:58:7:58:15 | Before send statement | stmts.go:58:7:58:15 | send statement | | stmts.go:58:7:58:15 | send statement | stmts.go:58:7:58:15 | After send statement | | stmts.go:58:14:58:15 | 42 | stmts.go:58:14:58:15 | After 42 | | stmts.go:58:14:58:15 | After 42 | stmts.go:50:2:59:2 | select statement | diff --git a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll index 3b423fc53972..76e91c61fe61 100644 --- a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll +++ b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll @@ -1219,16 +1219,6 @@ module Make0 Ast> { */ predicate endAbruptCompletion(AstNode ast, PreControlFlowNode n, AbruptCompletion c); - /** - * Holds if the language-specific implementation provides all control flow - * for `ast`, suppressing the default left-to-right evaluation steps. - * - * This is useful when the language-specific entry point for `ast` is not - * an edge from its "before" node, so the presence of an explicit step - * cannot itself suppress the default control flow. - */ - default predicate overridesDefaultControlFlow(AstNode ast) { none() } - /** * Holds if the shared library should preserve its default left-to-right * control flow for `ast` even though the language provides an explicit @@ -1966,7 +1956,6 @@ module Make0 Ast> { */ private predicate defaultCfg(AstNode ast) { hasCfg(ast) and - not Input2::overridesDefaultControlFlow(ast) and ( Input2::preservesDefaultControlFlow(ast) or From b93595e14ddb353d38debb21bf5b4fa3f9812a11 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 2 Sep 2026 13:52:18 +0100 Subject: [PATCH 1010/2098] Remove CFG hook preservesDefaultControlFlow --- .../go/controlflow/ControlFlowGraphImpl.qll | 69 +++++++------------ .../codeql/controlflow/ControlFlowGraph.qll | 42 +---------- 2 files changed, 27 insertions(+), 84 deletions(-) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll index b167be07018d..bdb7e733135e 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll @@ -1084,31 +1084,6 @@ module CfgImpl { ) } - additional predicate preservesDefaultControlFlow(Ast::AstNode ast) { - ast = any(Go::FuncDef fd | hasFuncDefPrologue(fd)).getBody() - or - exists(getFirstEpilogueTag(ast)) and - not ast = any(Go::SelectStmt sel).getACommClause().getComm().(Go::RecvStmt) - } - - additional predicate overridesDefaultControlFlowStep( - Ast::AstNode ast, PreControlFlowNode source, PreControlFlowNode target - ) { - ast = any(Go::FuncDef fd | hasFuncDefPrologue(fd)).getBody() and source.isBefore(ast) - or - ast = any(Go::FuncDef fd | funcHasDefer(fd)).getBody() and - source.isAfter(getLastRankedChild(ast)) and - target.isAfter(ast) - or - exists(getFirstEpilogueTag(ast)) and - ( - source.isAfter(getLastRankedChild(ast)) - or - not exists(getRankedChild(ast, _)) and source.isBefore(ast) - ) and - (target.isIn(ast) or target.isAfter(ast)) - } - additional predicate step(PreControlFlowNode n1, PreControlFlowNode n2) { rangeStmtStep(n1, n2) or selectStmtStep(n1, n2) or @@ -1139,6 +1114,17 @@ module CfgImpl { ) } + /** Routes into and between the children of `parent` in evaluation order. */ + private predicate childSequenceStep( + Ast::AstNode parent, PreControlFlowNode n1, PreControlFlowNode n2 + ) { + n1.isBefore(parent) and n2.isBefore(getRankedChild(parent, 1)) + or + exists(int i | + n1.isAfter(getRankedChild(parent, i)) and n2.isBefore(getRankedChild(parent, i + 1)) + ) + } + /** Routes between consecutive epilogue nodes of `parent`. */ private predicate epilogueSequenceStep( Ast::AstNode parent, PreControlFlowNode n1, PreControlFlowNode n2 @@ -1152,6 +1138,8 @@ module CfgImpl { /** Routes into and between the epilogue nodes of `parent`. */ private predicate epilogueStep(Ast::AstNode parent, PreControlFlowNode n1, PreControlFlowNode n2) { + exists(getFirstEpilogueTag(parent)) and childSequenceStep(parent, n1, n2) + or n1.isAfter(getLastRankedChild(parent)) and n2.isAdditional(parent, getFirstEpilogueTag(parent)) or @@ -1681,6 +1669,17 @@ module CfgImpl { */ private predicate funcDefStep(PreControlFlowNode n1, PreControlFlowNode n2) { exists(Go::FuncDef fd | exists(fd.getBody()) | + funcHasDefer(fd) and + not hasFuncDefPrologue(fd) and + n1.isBefore(fd.getBody()) and + n2.isBefore(getRankedChild(fd.getBody(), 1)) + or + (hasFuncDefPrologue(fd) or funcHasDefer(fd)) and + exists(int i | + n1.isAfter(getRankedChild(fd.getBody(), i)) and + n2.isBefore(getRankedChild(fd.getBody(), i + 1)) + ) + or n1.isBefore(fd.getBody()) and exists(fd.getResultVar(0)) and n2.isAdditional(fd.getBody(), "zero-init:0") @@ -1735,16 +1734,6 @@ module CfgImpl { ) } - predicate preservesDefaultControlFlow(Ast::AstNode ast) { - Input1::preservesDefaultControlFlow(ast) - } - - predicate overridesDefaultControlFlowStep( - Ast::AstNode ast, PreControlFlowNode source, PreControlFlowNode target - ) { - Input1::overridesDefaultControlFlowStep(ast, source, target) - } - predicate step(PreControlFlowNode n1, PreControlFlowNode n2) { Input1::step(n1, n2) } } @@ -1760,16 +1749,6 @@ module CfgImpl { Input1::endAbruptCompletion(ast, n, c) } - predicate preservesDefaultControlFlow(Ast::AstNode ast) { - Input1::preservesDefaultControlFlow(ast) - } - - predicate overridesDefaultControlFlowStep( - Ast::AstNode ast, PreControlFlowNode source, PreControlFlowNode target - ) { - Input1::overridesDefaultControlFlowStep(ast, source, target) - } - predicate step(PreControlFlowNode n1, PreControlFlowNode n2) { Input1::step(n1, n2) or Input1::finalDeferStep(n1, n2) } diff --git a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll index 76e91c61fe61..a500b71afe3d 100644 --- a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll +++ b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll @@ -1219,32 +1219,6 @@ module Make0 Ast> { */ predicate endAbruptCompletion(AstNode ast, PreControlFlowNode n, AbruptCompletion c); - /** - * Holds if the shared library should preserve its default left-to-right - * control flow for `ast` even though the language provides an explicit - * step from its "before" node. - * - * The default implementation preserves the existing behaviour: an - * explicit step from the "before" node suppresses all default steps. - */ - default predicate preservesDefaultControlFlow(AstNode ast) { none() } - - /** - * Holds if the language-specific implementation replaces the default - * control-flow step from `source` to `target` for `ast`. - * - * This predicate is only consulted when default control flow is enabled - * for `ast`. The language is responsible for providing any replacement - * step. - * - * The default implementation does not override any steps. - */ - default predicate overridesDefaultControlFlowStep( - AstNode ast, PreControlFlowNode source, PreControlFlowNode target - ) { - none() - } - /** * Holds if there is a local non-abrupt step from `n1` to `n2`. * @@ -1956,11 +1930,7 @@ module Make0 Ast> { */ private predicate defaultCfg(AstNode ast) { hasCfg(ast) and - ( - Input2::preservesDefaultControlFlow(ast) - or - not explicitStep(any(PreControlFlowNode n | n.isBefore(ast)), _) - ) + not explicitStep(any(PreControlFlowNode n | n.isBefore(ast)), _) } private module ChildDenseRankInput implements DenseRankInputSig1 { @@ -2012,15 +1982,9 @@ module Make0 Ast> { ) } - /** - * Holds if `n1` to `n2` is a default left-to-right evaluation step for - * an `AstNode` that is not overridden by the language implementation. - */ + /** Holds if `n1` to `n2` is a default left-to-right evaluation step. */ private predicate defaultStep(PreControlFlowNode n1, PreControlFlowNode n2) { - exists(AstNode ast | - defaultStepCandidate(ast, n1, n2) and - not Input2::overridesDefaultControlFlowStep(ast, n1, n2) - ) + defaultStepCandidate(_, n1, n2) } /** Holds if there is a local non-abrupt step from `n1` to `n2`. */ From 563fae273dc08e2240b3368eaa38668b4f5531ea Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 2 Sep 2026 13:57:06 +0100 Subject: [PATCH 1011/2098] Allow empty switch to be a simple leaf node --- .../ControlFlowNode_getASuccessor.expected | 3 +-- .../controlflow/codeql/controlflow/ControlFlowGraph.qll | 9 ++++----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected index b408ace01434..ce7e59487ca8 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected @@ -4370,8 +4370,7 @@ | tst.go:23:1:26:1 | function declaration | tst.go:23:1:26:1 | After function declaration | | tst.go:23:15:26:1 | After block statement | tst.go:23:1:26:1 | Normal Exit | | tst.go:23:15:26:1 | block statement | tst.go:24:2:25:2 | expression-switch statement | -| tst.go:24:2:25:2 | After expression-switch statement | tst.go:23:15:26:1 | After block statement | -| tst.go:24:2:25:2 | expression-switch statement | tst.go:24:2:25:2 | After expression-switch statement | +| tst.go:24:2:25:2 | expression-switch statement | tst.go:23:15:26:1 | After block statement | | tst.go:28:1:32:1 | After function declaration | tst.go:0:0:0:0 | After tst.go | | tst.go:28:1:32:1 | Before function declaration | tst.go:28:1:32:1 | function declaration | | tst.go:28:1:32:1 | Entry | tst.go:28:15:32:1 | block statement | diff --git a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll index a500b71afe3d..a09d965262b1 100644 --- a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll +++ b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll @@ -685,10 +685,7 @@ module Make0 Ast> { not exists(getChild(n, _)) and not postOrInOrder(n) and not additionalNode(n, _, _) and - not inConditionalContext(n, _) and - // An empty switch statement still needs distinct before and after nodes - // to avoid a spurious self-loop. - not n instanceof Switch + not inConditionalContext(n, _) } private string catchClauseEmptyBodyTag() { result = "[CatchClauseEmptyBody]" } @@ -1838,7 +1835,9 @@ module Make0 Ast> { exists(Switch switch, PreControlFlowNode firstCase | firstCase.isBefore(getRankedCaseCfgOrder(switch, 1)) or - not exists(getRankedCaseCfgOrder(switch, _)) and firstCase.isAfter(switch) + not exists(getRankedCaseCfgOrder(switch, _)) and + not simpleLeafNode(switch) and + firstCase.isAfter(switch) | n1.isBefore(switch) and ( From d3298c7d5ead6270c800e8826a4803bdaa55d403 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 2 Sep 2026 14:24:40 +0100 Subject: [PATCH 1012/2098] Rename ForeachStmt to ForEachStmt --- go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll index bdb7e733135e..44216130bce9 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll @@ -215,7 +215,7 @@ module CfgImpl { AstNode getUpdate(int index) { index = 0 and result = this.(Go::ForStmt).getPost() } } - class ForeachStmt extends LoopStmt instanceof Go::RangeStmt { + class ForEachStmt extends LoopStmt instanceof Go::RangeStmt { Expr getVariable() { result = this.(Go::RangeStmt).getPattern() } Expr getCollection() { result = this.(Go::RangeStmt).getDomain() } @@ -1489,7 +1489,7 @@ module CfgImpl { private predicate rangeStmtStep(PreControlFlowNode n1, PreControlFlowNode n2) { exists(Go::RangeElementExpr p | - // The shared `ForeachStmt` model owns the loop skeleton (testing the + // The shared `ForEachStmt` model owns the loop skeleton (testing the // domain for emptiness, the `[LoopHeader]` join/branch point, and the // loop exit) and routes control flow into `Before(p)` and out of // `After(p)`, where `p` is the synthesized "range element" loop From 059305500c26e56669096ad44e2212a5c2df6c31 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 3 Sep 2026 15:39:17 +0100 Subject: [PATCH 1013/2098] Undo unnecessary code changes --- .../codeql/controlflow/ControlFlowGraph.qll | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll index a09d965262b1..a8a6a8e1c449 100644 --- a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll +++ b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll @@ -1950,11 +1950,8 @@ module Make0 Ast> { * an `AstNode` that does not otherwise have explicitly defined control * flow. */ - private predicate defaultStepCandidate( - AstNode ast, PreControlFlowNode n1, PreControlFlowNode n2 - ) { - defaultCfg(ast) and - ( + private predicate defaultStep(PreControlFlowNode n1, PreControlFlowNode n2) { + exists(AstNode ast | defaultCfg(ast) | n1.isBefore(ast) and n2.isBefore(getRankedChild(ast, 1)) or @@ -1981,11 +1978,6 @@ module Make0 Ast> { ) } - /** Holds if `n1` to `n2` is a default left-to-right evaluation step. */ - private predicate defaultStep(PreControlFlowNode n1, PreControlFlowNode n2) { - defaultStepCandidate(_, n1, n2) - } - /** Holds if there is a local non-abrupt step from `n1` to `n2`. */ private predicate step(PreControlFlowNode n1, PreControlFlowNode n2) { explicitStep(n1, n2) or defaultStep(n1, n2) @@ -2032,9 +2024,7 @@ module Make0 Ast> { t instanceof DirectSuccessor or exists(AstNode ast, AbruptCompletion c | - last(ast, n1, c) and - endAbruptCompletion(ast, n2, c) and - t = c.getSuccessorType() + last(ast, n1, c) and endAbruptCompletion(ast, n2, c) and t = c.getSuccessorType() ) } From ff260f57d99804c351ce0c44cf7b4b135abf7797 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 9 Jul 2026 14:42:01 +0100 Subject: [PATCH 1014/2098] Skip extracting ast.ParenExpr nodes Instead of creating a database entry for parenthesised expressions, extract their child expression directly in their place. This makes the extracted AST act as if ParenExpr nodes do not exist while still correctly extracting children. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- go/extractor/extractor.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/go/extractor/extractor.go b/go/extractor/extractor.go index 2aec8cc37e4b..335655f421b7 100644 --- a/go/extractor/extractor.go +++ b/go/extractor/extractor.go @@ -1025,6 +1025,12 @@ func extractExpr(tw *trap.Writer, expr ast.Expr, parent trap.Label, idx int, ski return } + // Skip parenthesised expressions and extract their child directly in their place + if paren, ok := expr.(*ast.ParenExpr); ok { + extractExpr(tw, paren.X, parent, idx, skipExtractingValue) + return + } + lbl := tw.Labeler.LocalID(expr) extractTypeOf(tw, expr, lbl) @@ -1099,9 +1105,6 @@ func extractExpr(tw *trap.Writer, expr ast.Expr, parent trap.Label, idx int, ski kind = dbscheme.CompositeLitExpr.Index() extractExpr(tw, expr.Type, lbl, 0, false) extractExprs(tw, expr.Elts, lbl, 1, 1) - case *ast.ParenExpr: - kind = dbscheme.ParenExpr.Index() - extractExpr(tw, expr.X, lbl, 0, false) case *ast.SelectorExpr: kind = dbscheme.SelectorExpr.Index() extractExpr(tw, expr.X, lbl, 0, false) From 82c2fd1c909a020fa8e763211fa034d10c303d1a Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 9 Jul 2026 15:20:05 +0100 Subject: [PATCH 1015/2098] Deprecate ParenExpr and remove all references Since the extractor no longer produces ParenExpr nodes, deprecate the class so existing user code gets a warning rather than breaking, and remove all references from library code where it was used to look through parentheses. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../learn-ql/go/ast-class-reference.rst | 2 - go/ql/lib/change-notes/2026-08-13-cfg.md | 3 ++ go/ql/lib/semmle/go/Expr.qll | 19 ++-------- .../go/controlflow/ControlFlowGraph.qll | 2 - .../go/controlflow/ControlFlowGraphImpl.qll | 10 ----- go/ql/lib/semmle/go/controlflow/IR.qll | 6 +-- go/ql/lib/semmle/go/dataflow/Properties.qll | 4 -- .../IntegerOverflow/RangeAnalysis.qll | 17 --------- .../CONSISTENCY/CfgConsistency.expected | 12 ------ .../ControlFlowNode_getASuccessor.expected | 38 +++++++------------ .../CONSISTENCY/CfgConsistency.expected | 5 --- .../CONSISTENCY/CfgConsistency.expected | 5 --- .../CONSISTENCY/CfgConsistency.expected | 6 --- 13 files changed, 21 insertions(+), 108 deletions(-) diff --git a/go/docs/language/learn-ql/go/ast-class-reference.rst b/go/docs/language/learn-ql/go/ast-class-reference.rst index d874652a8946..fc46df7c65d4 100644 --- a/go/docs/language/learn-ql/go/ast-class-reference.rst +++ b/go/docs/language/learn-ql/go/ast-class-reference.rst @@ -450,8 +450,6 @@ Miscellaneous +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``...`` | `Ellipsis `__ | | | +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| ``(``\ `Expr `__\ ``)`` | `ParenExpr `__ | | | -+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | `Ident `__\ ``.``\ `Ident `__ | `SelectorExpr `__ | | | +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | `Expr `__\ ``[``\ `Expr `__\ ``]`` | `IndexExpr `__ | | | diff --git a/go/ql/lib/change-notes/2026-08-13-cfg.md b/go/ql/lib/change-notes/2026-08-13-cfg.md index aa0d5a8634a1..4614ebca0744 100644 --- a/go/ql/lib/change-notes/2026-08-13-cfg.md +++ b/go/ql/lib/change-notes/2026-08-13-cfg.md @@ -27,3 +27,6 @@ category: breaking - `EvalCompoundAssignRhsInstruction` now also represents increment and decrement operations, and it and `EvalImplicitInitInstruction` directly represent their associated writes. +* `ParenExpr` has been deprecated because parenthesized expressions are no + longer extracted as separate AST nodes. The child expression now directly + takes the place of the parenthesized expression. diff --git a/go/ql/lib/semmle/go/Expr.qll b/go/ql/lib/semmle/go/Expr.qll index d9b4dcff5667..4b2a31cc8930 100644 --- a/go/ql/lib/semmle/go/Expr.qll +++ b/go/ql/lib/semmle/go/Expr.qll @@ -544,15 +544,11 @@ class SliceLit extends ArrayOrSliceLit { } /** - * A parenthesized expression. - * - * Examples: - * - * ```go - * (x + y) - * ``` + * DEPRECATED: `ParenExpr` is no longer extracted. Parenthesized expressions are + * transparent in the AST; the child expression takes the place of the parenthesized + * expression directly. */ -class ParenExpr extends @parenexpr, Expr { +deprecated class ParenExpr extends @parenexpr, Expr { /** Gets the expression between parentheses. */ Expr getExpr() { result = this.getChildExpr(0) } @@ -2149,8 +2145,6 @@ private predicate isTypeExprBottomUp(Expr e) { or e instanceof @indexexpr and isTypeExprBottomUp(e.getChildExpr(0)) or - isTypeExprBottomUp(e.(ParenExpr).getExpr()) - or isTypeExprBottomUp(e.(StarExpr).getBase()) or isTypeExprBottomUp(e.(Ellipsis).getOperand()) @@ -2201,8 +2195,6 @@ private predicate isTypeExprTopDown(Expr e) { or e = any(SelectorExpr sel | isTypeExprTopDown(sel)).getBase() or - e = any(ParenExpr pe | isTypeExprTopDown(pe)).getExpr() - or e = any(StarExpr se | isTypeExprTopDown(se)).getBase() or e = any(Ellipsis ell | isTypeExprTopDown(ell)).getOperand() @@ -2251,8 +2243,6 @@ class ReferenceExpr extends Expr { not this = any(MethodSpec md).getNameExpr() and not this = any(StructLit sl).getKey(_) or - this.(ParenExpr).getExpr() instanceof ReferenceExpr - or this.(StarExpr).getBase() instanceof ReferenceExpr or this instanceof DerefExpr @@ -2302,7 +2292,6 @@ class ValueExpr extends Expr { this instanceof BasicLit or this instanceof FuncLit or this instanceof CompositeLit or - this.(ParenExpr).getExpr() instanceof ValueExpr or this instanceof SliceExpr or this instanceof TypeAssertExpr or this instanceof CallOrConversionExpr or diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll index 551121f27f57..1ee860a5e865 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll @@ -282,8 +282,6 @@ module ControlFlow { private predicate ensuresAux(Expr expr, boolean b) { expr = cond and b = outcome or - expr = any(ParenExpr par | this.ensuresAux(par, b)).getExpr() - or expr = any(NotExpr ne | this.ensuresAux(ne, b.booleanNot())).getOperand() or expr = any(LandExpr land | this.ensuresAux(land, true)).getAnOperand() and diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll index 44216130bce9..3fbe4ebefbdf 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll @@ -436,16 +436,6 @@ module CfgImpl { // pre-order means no in-order "invocation" node (and hence no inline // exceptional-exit edge) is created at the `defer` statement. e = any(Go::DeferStmt s).getCall() - or - // Parenthesized expressions are value-transparent (via `propagatesValue`) - // and should not get an in-order evaluation node. Marking them as - // pre-order prevents the shared library from auto-computing - // `postOrInOrder` for them (which would create an unreachable In node). - e instanceof Go::ParenExpr - } - - predicate propagatesValue(Ast::AstNode child, Ast::AstNode parent) { - child = parent.(Go::ParenExpr).getExpr() } predicate postOrInOrder(Ast::AstNode n) { diff --git a/go/ql/lib/semmle/go/controlflow/IR.qll b/go/ql/lib/semmle/go/controlflow/IR.qll index a06be4152235..ec3e0f2490cc 100644 --- a/go/ql/lib/semmle/go/controlflow/IR.qll +++ b/go/ql/lib/semmle/go/controlflow/IR.qll @@ -1298,11 +1298,7 @@ module IR { /** * Gets the (final) instruction computing the value of `e`. */ - Instruction evalExprInstruction(Expr e) { - result.(EvalInstruction).getExpr() = e - or - result = evalExprInstruction(e.(ParenExpr).getExpr()) - } + Instruction evalExprInstruction(Expr e) { result.(EvalInstruction).getExpr() = e } /** * Gets the instruction corresponding to the initialization of `r`. diff --git a/go/ql/lib/semmle/go/dataflow/Properties.qll b/go/ql/lib/semmle/go/dataflow/Properties.qll index 573b001a3c36..0ec2654f8610 100644 --- a/go/ql/lib/semmle/go/dataflow/Properties.qll +++ b/go/ql/lib/semmle/go/dataflow/Properties.qll @@ -32,10 +32,6 @@ class Property extends TProperty { // then !test = !outcome ==> nd matches this this.checkOnExpr(test.(NotExpr).getOperand(), outcome.booleanNot(), nd) or - // if test = outcome ==> nd matches this - // then (test) = outcome ==> nd matches this - this.checkOnExpr(test.(ParenExpr).getExpr(), outcome, nd) - or // if test = true ==> nd matches this // then (test && e) = true ==> nd matches this outcome = true and diff --git a/go/ql/src/experimental/IntegerOverflow/RangeAnalysis.qll b/go/ql/src/experimental/IntegerOverflow/RangeAnalysis.qll index 5a53342b8aff..2d7e249fbc03 100644 --- a/go/ql/src/experimental/IntegerOverflow/RangeAnalysis.qll +++ b/go/ql/src/experimental/IntegerOverflow/RangeAnalysis.qll @@ -31,12 +31,6 @@ float getAnUpperBound(Expr expr) { if expr.isConst() then result = expr.getNumericValue() else ( - //if an expression with parenthesis, strip the parenthesis first - exists(ParenExpr paren | - paren = expr and - result = getAnUpperBound(paren.stripParens()) - ) - or //if this expression is an identifier exists(SsaVariable v, Ident identifier | identifier = expr and @@ -188,11 +182,6 @@ float getALowerBound(Expr expr) { result = expr.getIntValue() or result = expr.getExactValue().toFloat() else ( - exists(ParenExpr paren | - paren = expr and - result = getALowerBound(paren.stripParens()) - ) - or //if this expression is an identifer exists(SsaVariable v, Ident identifier | identifier = expr and @@ -571,12 +560,6 @@ predicate ssaDependsOnExpr(SsaDefinition def, Expr expr) { if expr.isConst() then none() else ( - //if an expression with parenthesis, strip the parenthesis - exists(ParenExpr paren | - paren = expr and - ssaDependsOnExpr(def, paren.stripParens()) - ) - or exists(Ident ident | ident = expr and getAUse(def) = ident diff --git a/go/ql/test/experimental/Unsafe/CONSISTENCY/CfgConsistency.expected b/go/ql/test/experimental/Unsafe/CONSISTENCY/CfgConsistency.expected index a3879fa1b37d..e69de29bb2d1 100644 --- a/go/ql/test/experimental/Unsafe/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/experimental/Unsafe/CONSISTENCY/CfgConsistency.expected @@ -1,12 +0,0 @@ -consistencyOverview -| missingInNodeForPostOrInOrder | 9 | -missingInNodeForPostOrInOrder -| WrongUsageOfUnsafe.go:19:21:19:27 | (...) | -| WrongUsageOfUnsafe.go:36:21:36:27 | (...) | -| WrongUsageOfUnsafe.go:57:21:57:27 | (...) | -| WrongUsageOfUnsafe.go:79:21:79:30 | (...) | -| WrongUsageOfUnsafe.go:113:21:113:30 | (...) | -| WrongUsageOfUnsafe.go:131:21:131:30 | (...) | -| WrongUsageOfUnsafe.go:151:21:151:30 | (...) | -| WrongUsageOfUnsafe.go:169:25:169:34 | (...) | -| WrongUsageOfUnsafe.go:191:21:191:30 | (...) | diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected index ce7e59487ca8..e789101e1e9f 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected @@ -410,17 +410,15 @@ | epilogues.go:69:2:69:25 | Before defer statement | epilogues.go:69:8:69:25 | call to log | | epilogues.go:69:2:69:25 | catch-defer-panic defer statement | epilogues.go:68:8:68:24 | defer-invoke call to logValue | | epilogues.go:69:2:69:25 | defer statement | epilogues.go:69:2:69:25 | After defer statement | -| epilogues.go:69:8:69:11 | (...) | epilogues.go:69:9:69:10 | Before &... | -| epilogues.go:69:8:69:11 | After (...) | epilogues.go:69:8:69:15 | selection of log | | epilogues.go:69:8:69:15 | After selection of log | epilogues.go:69:17:69:21 | Before "ptr" | -| epilogues.go:69:8:69:15 | Before selection of log | epilogues.go:69:8:69:11 | (...) | +| epilogues.go:69:8:69:15 | Before selection of log | epilogues.go:69:9:69:10 | Before &... | | epilogues.go:69:8:69:15 | selection of log | epilogues.go:69:8:69:15 | After selection of log | | epilogues.go:69:8:69:25 | After call to log | epilogues.go:69:2:69:25 | defer statement | | epilogues.go:69:8:69:25 | call to log | epilogues.go:69:8:69:15 | Before selection of log | | epilogues.go:69:8:69:25 | defer-invoke call to log | epilogues.go:68:8:68:24 | defer-invoke call to logValue | | epilogues.go:69:8:69:25 | defer-invoke call to log | epilogues.go:69:2:69:25 | catch-defer-panic defer statement | | epilogues.go:69:9:69:10 | &... | epilogues.go:69:9:69:10 | After &... | -| epilogues.go:69:9:69:10 | After &... | epilogues.go:69:8:69:11 | After (...) | +| epilogues.go:69:9:69:10 | After &... | epilogues.go:69:8:69:15 | selection of log | | epilogues.go:69:9:69:10 | Before &... | epilogues.go:69:10:69:10 | Before l | | epilogues.go:69:10:69:10 | After l | epilogues.go:69:9:69:10 | &... | | epilogues.go:69:10:69:10 | Before l | epilogues.go:69:10:69:10 | l | @@ -1474,22 +1472,19 @@ | exprs.go:77:31:79:1 | block statement | exprs.go:78:2:78:22 | Before return statement | | exprs.go:78:2:78:22 | Before return statement | exprs.go:78:9:78:22 | ...\|\|... | | exprs.go:78:2:78:22 | return statement | exprs.go:77:1:79:1 | Normal Exit | -| exprs.go:78:9:78:17 | !... | exprs.go:78:10:78:17 | (...) | +| exprs.go:78:9:78:17 | !... | exprs.go:78:11:78:16 | ...&&... | | exprs.go:78:9:78:17 | After !... [false] | exprs.go:78:22:78:22 | Before z | | exprs.go:78:9:78:17 | After !... [true] | exprs.go:78:9:78:22 | After ...\|\|... | | exprs.go:78:9:78:22 | ...\|\|... | exprs.go:78:9:78:17 | !... | | exprs.go:78:9:78:22 | After ...\|\|... | exprs.go:78:2:78:22 | return statement | -| exprs.go:78:10:78:17 | (...) | exprs.go:78:11:78:16 | ...&&... | -| exprs.go:78:10:78:17 | After (...) [false] | exprs.go:78:9:78:17 | After !... [true] | -| exprs.go:78:10:78:17 | After (...) [true] | exprs.go:78:9:78:17 | After !... [false] | | exprs.go:78:11:78:11 | After x [false] | exprs.go:78:11:78:16 | After ...&&... [false] | | exprs.go:78:11:78:11 | After x [true] | exprs.go:78:16:78:16 | Before y | | exprs.go:78:11:78:11 | Before x | exprs.go:78:11:78:11 | x | | exprs.go:78:11:78:11 | x | exprs.go:78:11:78:11 | After x [false] | | exprs.go:78:11:78:11 | x | exprs.go:78:11:78:11 | After x [true] | | exprs.go:78:11:78:16 | ...&&... | exprs.go:78:11:78:11 | Before x | -| exprs.go:78:11:78:16 | After ...&&... [false] | exprs.go:78:10:78:17 | After (...) [false] | -| exprs.go:78:11:78:16 | After ...&&... [true] | exprs.go:78:10:78:17 | After (...) [true] | +| exprs.go:78:11:78:16 | After ...&&... [false] | exprs.go:78:9:78:17 | After !... [true] | +| exprs.go:78:11:78:16 | After ...&&... [true] | exprs.go:78:9:78:17 | After !... [false] | | exprs.go:78:16:78:16 | After y [false] | exprs.go:78:11:78:16 | After ...&&... [false] | | exprs.go:78:16:78:16 | After y [true] | exprs.go:78:11:78:16 | After ...&&... [true] | | exprs.go:78:16:78:16 | Before y | exprs.go:78:16:78:16 | y | @@ -1575,10 +1570,7 @@ | exprs.go:93:32:95:1 | block statement | exprs.go:94:2:94:21 | Before return statement | | exprs.go:94:2:94:21 | Before return statement | exprs.go:94:9:94:21 | ...\|\|... | | exprs.go:94:2:94:21 | return statement | exprs.go:93:1:95:1 | Normal Exit | -| exprs.go:94:9:94:16 | (...) | exprs.go:94:10:94:15 | ...&&... | -| exprs.go:94:9:94:16 | After (...) [false] | exprs.go:94:21:94:21 | Before z | -| exprs.go:94:9:94:16 | After (...) [true] | exprs.go:94:9:94:21 | After ...\|\|... | -| exprs.go:94:9:94:21 | ...\|\|... | exprs.go:94:9:94:16 | (...) | +| exprs.go:94:9:94:21 | ...\|\|... | exprs.go:94:10:94:15 | ...&&... | | exprs.go:94:9:94:21 | After ...\|\|... | exprs.go:94:2:94:21 | return statement | | exprs.go:94:10:94:10 | After x [false] | exprs.go:94:10:94:15 | After ...&&... [false] | | exprs.go:94:10:94:10 | After x [true] | exprs.go:94:15:94:15 | Before y | @@ -1586,8 +1578,8 @@ | exprs.go:94:10:94:10 | x | exprs.go:94:10:94:10 | After x [false] | | exprs.go:94:10:94:10 | x | exprs.go:94:10:94:10 | After x [true] | | exprs.go:94:10:94:15 | ...&&... | exprs.go:94:10:94:10 | Before x | -| exprs.go:94:10:94:15 | After ...&&... [false] | exprs.go:94:9:94:16 | After (...) [false] | -| exprs.go:94:10:94:15 | After ...&&... [true] | exprs.go:94:9:94:16 | After (...) [true] | +| exprs.go:94:10:94:15 | After ...&&... [false] | exprs.go:94:21:94:21 | Before z | +| exprs.go:94:10:94:15 | After ...&&... [true] | exprs.go:94:9:94:21 | After ...\|\|... | | exprs.go:94:15:94:15 | After y [false] | exprs.go:94:10:94:15 | After ...&&... [false] | | exprs.go:94:15:94:15 | After y [true] | exprs.go:94:10:94:15 | After ...&&... [true] | | exprs.go:94:15:94:15 | Before y | exprs.go:94:15:94:15 | y | @@ -2996,19 +2988,17 @@ | stmts7.go:28:2:28:23 | Before defer statement | stmts7.go:28:8:28:23 | call to fn | | stmts7.go:28:2:28:23 | catch-defer-panic defer statement | stmts7.go:27:8:27:20 | defer-invoke call to fn | | stmts7.go:28:2:28:23 | defer statement | stmts7.go:28:2:28:23 | After defer statement | -| stmts7.go:28:8:28:18 | (...) | stmts7.go:28:9:28:17 | Before &... | -| stmts7.go:28:8:28:18 | After (...) | stmts7.go:28:8:28:18 | implicit-deref (...) | -| stmts7.go:28:8:28:18 | implicit-deref (...) | stmts7.go:28:8:28:21 | selection of fn | | stmts7.go:28:8:28:21 | After selection of fn | stmts7.go:28:8:28:23 | After call to fn | -| stmts7.go:28:8:28:21 | Before selection of fn | stmts7.go:28:8:28:18 | (...) | +| stmts7.go:28:8:28:21 | Before selection of fn | stmts7.go:28:9:28:17 | Before &... | | stmts7.go:28:8:28:21 | selection of fn | stmts7.go:28:8:28:21 | After selection of fn | | stmts7.go:28:8:28:23 | After call to fn | stmts7.go:28:2:28:23 | defer statement | | stmts7.go:28:8:28:23 | call to fn | stmts7.go:28:8:28:21 | Before selection of fn | | stmts7.go:28:8:28:23 | defer-invoke call to fn | stmts7.go:27:8:27:20 | defer-invoke call to fn | | stmts7.go:28:8:28:23 | defer-invoke call to fn | stmts7.go:28:2:28:23 | catch-defer-panic defer statement | | stmts7.go:28:9:28:17 | &... | stmts7.go:28:9:28:17 | After &... | -| stmts7.go:28:9:28:17 | After &... | stmts7.go:28:8:28:18 | After (...) | +| stmts7.go:28:9:28:17 | After &... | stmts7.go:28:9:28:17 | implicit-deref &... | | stmts7.go:28:9:28:17 | Before &... | stmts7.go:28:10:28:17 | Before callback | +| stmts7.go:28:9:28:17 | implicit-deref &... | stmts7.go:28:8:28:21 | selection of fn | | stmts7.go:28:10:28:17 | After callback | stmts7.go:28:9:28:17 | &... | | stmts7.go:28:10:28:17 | Before callback | stmts7.go:28:10:28:17 | callback | | stmts7.go:28:10:28:17 | callback | stmts7.go:28:10:28:17 | After callback | @@ -3383,16 +3373,14 @@ | stmts8.go:5:2:5:13 | ... := ... | stmts8.go:5:7:5:13 | Before ...%... | | stmts8.go:5:2:5:13 | After ... := ... | stmts8.go:6:2:6:17 | Before return statement | | stmts8.go:5:2:5:13 | assign:0 ... := ... | stmts8.go:5:2:5:13 | After ... := ... | -| stmts8.go:5:7:5:7 | After x | stmts8.go:5:11:5:13 | (...) | +| stmts8.go:5:7:5:7 | After x | stmts8.go:5:12:5:12 | Before 1 | | stmts8.go:5:7:5:7 | Before x | stmts8.go:5:7:5:7 | x | | stmts8.go:5:7:5:7 | x | stmts8.go:5:7:5:7 | After x | | stmts8.go:5:7:5:13 | ...%... | stmts8.go:5:7:5:13 | After ...%... | | stmts8.go:5:7:5:13 | After ...%... | stmts8.go:5:2:5:13 | assign:0 ... := ... | | stmts8.go:5:7:5:13 | Before ...%... | stmts8.go:5:7:5:7 | Before x | -| stmts8.go:5:11:5:13 | (...) | stmts8.go:5:12:5:12 | Before 1 | -| stmts8.go:5:11:5:13 | After (...) | stmts8.go:5:7:5:13 | ...%... | | stmts8.go:5:12:5:12 | 1 | stmts8.go:5:12:5:12 | After 1 | -| stmts8.go:5:12:5:12 | After 1 | stmts8.go:5:11:5:13 | After (...) | +| stmts8.go:5:12:5:12 | After 1 | stmts8.go:5:7:5:13 | ...%... | | stmts8.go:5:12:5:12 | Before 1 | stmts8.go:5:12:5:12 | 1 | | stmts8.go:6:2:6:17 | Before return statement | stmts8.go:6:9:6:9 | Before z | | stmts8.go:6:2:6:17 | return statement | stmts8.go:3:1:7:1 | Normal Exit | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/SliceExpressions/CONSISTENCY/CfgConsistency.expected b/go/ql/test/library-tests/semmle/go/dataflow/SliceExpressions/CONSISTENCY/CfgConsistency.expected index 25cf4726d273..e69de29bb2d1 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/SliceExpressions/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/SliceExpressions/CONSISTENCY/CfgConsistency.expected @@ -1,5 +0,0 @@ -consistencyOverview -| missingInNodeForPostOrInOrder | 2 | -missingInNodeForPostOrInOrder -| main.go:40:2:40:8 | (...) | -| main.go:41:11:41:17 | (...) | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Protobuf/CONSISTENCY/CfgConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/Protobuf/CONSISTENCY/CfgConsistency.expected index 74975ed06775..e69de29bb2d1 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Protobuf/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Protobuf/CONSISTENCY/CfgConsistency.expected @@ -1,5 +0,0 @@ -consistencyOverview -| missingInNodeForPostOrInOrder | 2 | -missingInNodeForPostOrInOrder -| testDeprecatedApi.go:169:13:169:20 | (...) | -| testModernApi.go:226:13:226:20 | (...) | diff --git a/go/ql/test/query-tests/Security/CWE-089/CONSISTENCY/CfgConsistency.expected b/go/ql/test/query-tests/Security/CWE-089/CONSISTENCY/CfgConsistency.expected index 5b87c646a3b5..e69de29bb2d1 100644 --- a/go/ql/test/query-tests/Security/CWE-089/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/query-tests/Security/CWE-089/CONSISTENCY/CfgConsistency.expected @@ -1,6 +0,0 @@ -consistencyOverview -| missingInNodeForPostOrInOrder | 3 | -missingInNodeForPostOrInOrder -| main.go:49:2:49:15 | (...) | -| main.go:58:2:58:15 | (...) | -| main.go:61:3:61:16 | (...) | From be6d5b769ed1e9eb712ab1ce12b9002c0381f729 Mon Sep 17 00:00:00 2001 From: Anders Fugmann Date: Tue, 15 Sep 2026 14:50:33 +0200 Subject: [PATCH 1016/2098] Address peer review: Replace 'pull_request_target' with a schedule for the external review labeler workflow Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../label-external-contributions.yml | 118 ++++++++++-------- 1 file changed, 68 insertions(+), 50 deletions(-) diff --git a/.github/workflows/label-external-contributions.yml b/.github/workflows/label-external-contributions.yml index 6db5dcd68501..2843f6d2c5d4 100644 --- a/.github/workflows/label-external-contributions.yml +++ b/.github/workflows/label-external-contributions.yml @@ -1,62 +1,80 @@ name: Label external contributions on: - pull_request_target: - types: - - opened - - reopened - - ready_for_review + schedule: + - cron: "7,22,37,52 * * * *" + workflow_dispatch: permissions: {} +concurrency: + group: label-external-contributions + cancel-in-progress: false + jobs: label: - # Label non-draft PRs from personal accounts that are not owning (github) organization members or owners, - # including outside collaborators and prior contributors. GitHub organization members are excluded, and bot accounts too. - if: >- - github.event.pull_request.draft == false && - github.event.pull_request.user.type == 'User' && - github.event.pull_request.author_association != 'MEMBER' && - github.event.pull_request.author_association != 'OWNER' + if: github.ref_name == github.event.repository.default_branch runs-on: ubuntu-latest - timeout-minutes: 5 + timeout-minutes: 10 permissions: - issues: write - concurrency: - group: label-external-contribution-${{ github.event.pull_request.number }} - cancel-in-progress: false + pull-requests: write steps: - - name: Add external contribution label - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 - with: - github-token: ${{ github.token }} - script: | - const label = 'external-contribution'; - const pullRequest = context.payload.pull_request; - - if (pullRequest.labels.some(({ name }) => name === label)) { - return; - } - - const events = await github.paginate( - github.rest.issues.listEvents, - { - ...context.repo, - issue_number: pullRequest.number, - per_page: 100, - }, - ); - if ( - events.some(({ event, label: eventLabel }) => - event === 'unlabeled' && eventLabel?.name === label - ) - ) { - return; - } - - await github.rest.issues.addLabels({ - ...context.repo, - issue_number: pullRequest.number, - labels: [label], - }); + - name: Label external contributions + env: + GH_TOKEN: ${{ github.token }} + REPO: ${{ github.repository }} + run: | + set -euo pipefail + + label="external-contribution" + updated_cutoff=$(date -u -d "1 hour ago" "+%Y-%m-%dT%H:%M:%SZ") + + while IFS= read -r pr_number; do + if [[ ! "$pr_number" =~ ^[1-9][0-9]*$ ]]; then + echo "Skipping malformed pull request number." + continue + fi + + pr_json=$(gh api "repos/$REPO/pulls/$pr_number") + if ! jq -e \ + --arg repo "$REPO" \ + --arg label "$label" \ + '.state == "open" and + .draft == false and + .base.repo.full_name == $repo and + (.head.repo.full_name | type == "string") and + .head.repo.full_name != $repo and + .user.type == "User" and + .author_association != "MEMBER" and + .author_association != "OWNER" and + (any(.labels[]?; .name == $label) | not)' \ + >/dev/null <<<"$pr_json"; then + continue + fi + + events=$(gh api --paginate \ + "repos/$REPO/issues/$pr_number/events?per_page=100" | + jq -cs 'add') + + if jq -e --arg label "$label" \ + 'any(.[]; .event == "labeled" and .label.name == $label)' \ + >/dev/null <<<"$events"; then + continue + fi + + jq -n --arg label "$label" '{labels: [$label]}' | + gh api --method POST \ + "repos/$REPO/issues/$pr_number/labels" \ + --input - \ + >/dev/null + echo "Labelled pull request #$pr_number." + done < <( + gh api --method GET --paginate "repos/$REPO/issues" \ + -f state=open \ + -f since="$updated_cutoff" \ + -f sort=updated \ + -f direction=desc \ + -f per_page=100 | + jq -r '.[] | select(.pull_request != null) | .number' + ) From b9af1d04c934715785f995e60cd9e1aa5e268ed7 Mon Sep 17 00:00:00 2001 From: Keshav Malik Date: Tue, 15 Sep 2026 21:23:23 +0530 Subject: [PATCH 1017/2098] Improve URI host allowlist checks --- .../2026-09-15-uri-host-comparisons.md | 4 + .../code/java/security/RequestForgery.qll | 34 ++- .../HostComparisonRedirect.java | 248 ++++++++++++++++++ .../UrlRedirect.expected | 144 ++++++++++ .../UrlRedirect.qlref | 4 + .../security/host-comparison-redirect/options | 1 + .../HostComparison.java | 247 +++++++++++++++++ .../RequestForgery.expected | 162 ++++++++++++ .../RequestForgery.qlref | 4 + .../ssrf-host-comparison-repro/options | 1 + 10 files changed, 845 insertions(+), 4 deletions(-) create mode 100644 java/ql/lib/change-notes/2026-09-15-uri-host-comparisons.md create mode 100644 java/ql/test/query-tests/security/host-comparison-redirect/HostComparisonRedirect.java create mode 100644 java/ql/test/query-tests/security/host-comparison-redirect/UrlRedirect.expected create mode 100644 java/ql/test/query-tests/security/host-comparison-redirect/UrlRedirect.qlref create mode 100644 java/ql/test/query-tests/security/host-comparison-redirect/options create mode 100644 java/ql/test/query-tests/security/ssrf-host-comparison-repro/HostComparison.java create mode 100644 java/ql/test/query-tests/security/ssrf-host-comparison-repro/RequestForgery.expected create mode 100644 java/ql/test/query-tests/security/ssrf-host-comparison-repro/RequestForgery.qlref create mode 100644 java/ql/test/query-tests/security/ssrf-host-comparison-repro/options diff --git a/java/ql/lib/change-notes/2026-09-15-uri-host-comparisons.md b/java/ql/lib/change-notes/2026-09-15-uri-host-comparisons.md new file mode 100644 index 000000000000..9ad96608e3ef --- /dev/null +++ b/java/ql/lib/change-notes/2026-09-15-uri-host-comparisons.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The queries `java/ssrf` and `java/unvalidated-url-redirection` recognize case-insensitive comparisons of `URI.getHost()` with fixed string allowlist entries, as well as equality and case-insensitive comparisons when the host is stored in a local variable. diff --git a/java/ql/lib/semmle/code/java/security/RequestForgery.qll b/java/ql/lib/semmle/code/java/security/RequestForgery.qll index 489b45dffa2c..e1c77a721535 100644 --- a/java/ql/lib/semmle/code/java/security/RequestForgery.qll +++ b/java/ql/lib/semmle/code/java/security/RequestForgery.qll @@ -13,6 +13,7 @@ import semmle.code.java.frameworks.Properties private import semmle.code.java.controlflow.Guards private import semmle.code.java.dataflow.StringPrefixes private import semmle.code.java.dataflow.ExternalFlow +private import semmle.code.java.dataflow.SSA private import semmle.code.java.security.Sanitizers /** @@ -122,11 +123,21 @@ private class ExternalRequestForgerySanitizer extends RequestForgerySanitizer { ExternalRequestForgerySanitizer() { barrierNode(this, "request-forgery") } } -/** - * A comparison on the host of a url, that is a sanitizer for URL redirects. - * E.g. `"example.org".equals(url.getHost())"` - */ +/** Gets a host read, following local assignments with a single explicit SSA definition. */ +private MethodCall getCheckedHost(Expr checked) { + result = checked.getUnderlyingExpr() and + result.getMethod().hasQualifiedName("java.net", "URI", "getHost") + or + exists(SsaExplicitWrite def | + checked.getUnderlyingExpr().(VarRead).getVariable() instanceof LocalScopeVariable and + def.getARead() = checked.getUnderlyingExpr() and + result = getCheckedHost(def.getValue()) + ) +} + +/** Holds if a comparison validates the host of a URI. */ private predicate isHostComparisonSanitizer(Guard guard, Expr e, boolean branch) { + // Direct equality checks also accept nonconstant comparison operands. guard = any(MethodCall equalsCall | equalsCall.getMethod().getName() = "equals" and @@ -137,6 +148,21 @@ private predicate isHostComparisonSanitizer(Guard guard, Expr e, boolean branch) e = hostCall.getQualifier() ) ) + or + exists(MethodCall comparison, Expr checked, Expr allowed | + guard = comparison and + comparison.getMethod().getDeclaringType() instanceof TypeString and + comparison.getMethod().hasName(["equals", "equalsIgnoreCase"]) and + branch = true and + ( + checked = comparison.getQualifier() and allowed = comparison.getArgument(0) + or + checked = comparison.getArgument(0) and allowed = comparison.getQualifier() + ) and + // New cases require a fixed allowlist entry, not another untrusted value. + exists(allowed.(CompileTimeConstantExpr).getStringValue()) and + e = getCheckedHost(checked).getQualifier() + ) } /** diff --git a/java/ql/test/query-tests/security/host-comparison-redirect/HostComparisonRedirect.java b/java/ql/test/query-tests/security/host-comparison-redirect/HostComparisonRedirect.java new file mode 100644 index 000000000000..edc5638bec26 --- /dev/null +++ b/java/ql/test/query-tests/security/host-comparison-redirect/HostComparisonRedirect.java @@ -0,0 +1,248 @@ +import java.net.URI; +import java.util.Arrays; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class HostComparisonRedirect { + public void unguarded(HttpServletRequest request, HttpServletResponse response) throws Exception { + URI uri = new URI(request.getParameter("url")); // $ Source + response.sendRedirect(uri.toString()); // $ Alert + } + + public void directEquals(HttpServletRequest request, HttpServletResponse response) throws Exception { + URI uri = new URI(request.getParameter("url")); + if ("example.com".equals(uri.getHost())) { + response.sendRedirect(uri.toString()); + } + } + + public void directEqualsIgnoreCase(HttpServletRequest request, HttpServletResponse response) throws Exception { + URI uri = new URI(request.getParameter("url")); + if ("example.com".equalsIgnoreCase(uri.getHost())) { + response.sendRedirect(uri.toString()); + } + } + + public void reversedEqualsIgnoreCase(HttpServletRequest request, HttpServletResponse response) throws Exception { + URI uri = new URI(request.getParameter("url")); + if (uri.getHost().equalsIgnoreCase("example.com")) { + response.sendRedirect(uri.toString()); + } + } + + public void localEquals(HttpServletRequest request, HttpServletResponse response) throws Exception { + URI uri = new URI(request.getParameter("url")); + String host = uri.getHost(); + if ("example.com".equals(host)) { + response.sendRedirect(uri.toString()); + } + } + + public void localEqualsIgnoreCase(HttpServletRequest request, HttpServletResponse response) throws Exception { + URI uri = new URI(request.getParameter("url")); + String host = uri.getHost(); + if ("example.com".equalsIgnoreCase(host)) { + response.sendRedirect(uri.toString()); + } + } + + public void streamEquals(HttpServletRequest request, HttpServletResponse response) throws Exception { + URI uri = new URI(request.getParameter("url")); // $ SPURIOUS: Source + if (Arrays.stream(new String[]{"example.com"}).anyMatch(uri.getHost()::equals)) { + response.sendRedirect(uri.toString()); // $ SPURIOUS: Alert + } + } + + public void reportedStreamHelper(HttpServletRequest request, HttpServletResponse response) throws Exception { + URI uri = new URI(request.getParameter("url")); // $ SPURIOUS: Source + if (isAllowedStream(uri.getHost(), "example.com")) { + response.sendRedirect(uri.toString()); // $ SPURIOUS: Alert + } + } + + private static boolean isAllowedStream(String host, String... allowedHosts) { + return Arrays.stream(allowedHosts).anyMatch(host::equalsIgnoreCase); + } + + public void reportedLoopHelper(HttpServletRequest request, HttpServletResponse response) throws Exception { + URI uri = new URI(request.getParameter("url")); // $ SPURIOUS: Source + if (isAllowedLoop(uri.getHost(), "example.com")) { + response.sendRedirect(uri.toString()); // $ SPURIOUS: Alert + } + } + + private static boolean isAllowedLoop(String host, String... allowedHosts) { + for (String allowed : allowedHosts) { + if (allowed.equalsIgnoreCase(host)) { + return true; + } + } + return false; + } + + public void wrongBranch(HttpServletRequest request, HttpServletResponse response) throws Exception { + URI uri = new URI(request.getParameter("url")); // $ Source + if (!"example.com".equals(uri.getHost())) { + response.sendRedirect(uri.toString()); // $ Alert + } + } + + public void differentUri(HttpServletRequest request, HttpServletResponse response) throws Exception { + URI checked = new URI(request.getParameter("checked")); + URI used = new URI(request.getParameter("url")); // $ Source + if ("example.com".equals(checked.getHost())) { + response.sendRedirect(used.toString()); // $ Alert + } + } + + public void constantUrl(HttpServletResponse response) throws Exception { + response.sendRedirect("https://example.com/"); + } + + public void caseInsensitiveWrongBranch(HttpServletRequest request, HttpServletResponse response) throws Exception { + URI uri = new URI(request.getParameter("url")); // $ Source + if (!"example.com".equalsIgnoreCase(uri.getHost())) { + response.sendRedirect(uri.toString()); // $ Alert + } + } + + public void caseInsensitiveDifferentUri(HttpServletRequest request, HttpServletResponse response) throws Exception { + URI checked = new URI(request.getParameter("checked")); + URI used = new URI(request.getParameter("url")); // $ Source + if ("example.com".equalsIgnoreCase(checked.getHost())) { + response.sendRedirect(used.toString()); // $ Alert + } + } + + public void reassignedHost(HttpServletRequest request, HttpServletResponse response) throws Exception { + URI uri = new URI(request.getParameter("url")); // $ Source + String host = uri.getHost(); + host = "example.com"; + if ("example.com".equalsIgnoreCase(host)) { + response.sendRedirect(uri.toString()); // $ Alert + } + } + + public void conditionallyReassignedHost(HttpServletRequest request, HttpServletResponse response, boolean skip) throws Exception { + URI uri = new URI(request.getParameter("url")); // $ Source + String host = uri.getHost(); + if (skip) { + host = "example.com"; + } + if ("example.com".equalsIgnoreCase(host)) { + response.sendRedirect(uri.toString()); // $ Alert + } + } + + public void reassignedUri(HttpServletRequest request, HttpServletResponse response) throws Exception { + URI uri = new URI("https://example.com/"); + String host = uri.getHost(); + uri = new URI(request.getParameter("url")); // $ Source + if ("example.com".equalsIgnoreCase(host)) { + response.sendRedirect(uri.toString()); // $ Alert + } + } + + public void untrustedComparison(HttpServletRequest request, HttpServletResponse response) throws Exception { + URI uri = new URI(request.getParameter("url")); // $ Source + if (request.getParameter("allowed").equalsIgnoreCase(uri.getHost())) { + response.sendRedirect(uri.toString()); // $ Alert + } + } + + public void unrelatedComparison(HttpServletRequest request, HttpServletResponse response) throws Exception { + URI uri = new URI(request.getParameter("url")); // $ Source + if (new FakeComparison().equalsIgnoreCase(uri.getHost())) { + response.sendRedirect(uri.toString()); // $ Alert + } + } + + private static class FakeComparison { + boolean equalsIgnoreCase(String host) { + return true; + } + } + + public void aliasChain(HttpServletRequest request, HttpServletResponse response) throws Exception { + URI uri = new URI(request.getParameter("url")); + String host = uri.getHost(); + String alias = host; + String secondAlias = alias; + if ("example.com".equalsIgnoreCase(secondAlias)) { + response.sendRedirect(uri.toString()); + } + } + + public void finallyOverwrite(HttpServletRequest request, HttpServletResponse response, boolean skip) throws Exception { + URI uri = new URI(request.getParameter("url")); // $ Source + String host = uri.getHost(); + try { + if (skip) return; + host = "example.com"; + } finally { + if ("example.com".equalsIgnoreCase(host)) { + response.sendRedirect(uri.toString()); // $ Alert + } + } + } + + public void rejectionReturns(HttpServletRequest request, HttpServletResponse response) throws Exception { + URI uri = new URI(request.getParameter("url")); + String host = uri.getHost(); + if (!"example.com".equalsIgnoreCase(host)) return; + response.sendRedirect(uri.toString()); + } + + private static final String ALLOWED_HOST = "example.com"; + + public void constantAllowlistField(HttpServletRequest request, HttpServletResponse response) throws Exception { + URI uri = new URI(request.getParameter("url")); + String host = uri.getHost(); + if (ALLOWED_HOST.equalsIgnoreCase(host)) { + response.sendRedirect(uri.toString()); + } + } + + public void orBypass(HttpServletRequest request, HttpServletResponse response, boolean skip) throws Exception { + URI uri = new URI(request.getParameter("url")); // $ Source + String host = uri.getHost(); + if ("example.com".equalsIgnoreCase(host) || skip) { + response.sendRedirect(uri.toString()); // $ Alert + } + } + + public void assignmentCast(HttpServletRequest request, HttpServletResponse response) throws Exception { + URI uri = new URI(request.getParameter("url")); + Object value = uri.getHost(); + String host = (String) value; + if ("example.com".equalsIgnoreCase(host)) { + response.sendRedirect(uri.toString()); + } + } + + public void comparisonCast(HttpServletRequest request, HttpServletResponse response) throws Exception { + URI uri = new URI(request.getParameter("url")); + Object host = uri.getHost(); + if ("example.com".equalsIgnoreCase((String) host)) { + response.sendRedirect(uri.toString()); + } + } + + public void castHostOverwrite(HttpServletRequest request, HttpServletResponse response) throws Exception { + URI uri = new URI(request.getParameter("url")); // $ Source + Object host = uri.getHost(); + host = "example.com"; + if ("example.com".equalsIgnoreCase((String) host)) { + response.sendRedirect(uri.toString()); // $ Alert + } + } + + public void castHostConditionalOverwrite(HttpServletRequest request, HttpServletResponse response, boolean skip) throws Exception { + URI uri = new URI(request.getParameter("url")); // $ Source + Object host = uri.getHost(); + if (skip) host = "example.com"; + if ("example.com".equalsIgnoreCase((String) host)) { + response.sendRedirect(uri.toString()); // $ Alert + } + } +} diff --git a/java/ql/test/query-tests/security/host-comparison-redirect/UrlRedirect.expected b/java/ql/test/query-tests/security/host-comparison-redirect/UrlRedirect.expected new file mode 100644 index 000000000000..9ad424c06406 --- /dev/null +++ b/java/ql/test/query-tests/security/host-comparison-redirect/UrlRedirect.expected @@ -0,0 +1,144 @@ +#select +| HostComparisonRedirect.java:9:31:9:44 | toString(...) | HostComparisonRedirect.java:8:27:8:53 | getParameter(...) : String | HostComparisonRedirect.java:9:31:9:44 | toString(...) | Untrusted URL redirection depends on a $@. | HostComparisonRedirect.java:8:27:8:53 | getParameter(...) | user-provided value | +| HostComparisonRedirect.java:52:35:52:48 | toString(...) | HostComparisonRedirect.java:50:27:50:53 | getParameter(...) : String | HostComparisonRedirect.java:52:35:52:48 | toString(...) | Untrusted URL redirection depends on a $@. | HostComparisonRedirect.java:50:27:50:53 | getParameter(...) | user-provided value | +| HostComparisonRedirect.java:59:35:59:48 | toString(...) | HostComparisonRedirect.java:57:27:57:53 | getParameter(...) : String | HostComparisonRedirect.java:59:35:59:48 | toString(...) | Untrusted URL redirection depends on a $@. | HostComparisonRedirect.java:57:27:57:53 | getParameter(...) | user-provided value | +| HostComparisonRedirect.java:70:35:70:48 | toString(...) | HostComparisonRedirect.java:68:27:68:53 | getParameter(...) : String | HostComparisonRedirect.java:70:35:70:48 | toString(...) | Untrusted URL redirection depends on a $@. | HostComparisonRedirect.java:68:27:68:53 | getParameter(...) | user-provided value | +| HostComparisonRedirect.java:86:35:86:48 | toString(...) | HostComparisonRedirect.java:84:27:84:53 | getParameter(...) : String | HostComparisonRedirect.java:86:35:86:48 | toString(...) | Untrusted URL redirection depends on a $@. | HostComparisonRedirect.java:84:27:84:53 | getParameter(...) | user-provided value | +| HostComparisonRedirect.java:94:35:94:49 | toString(...) | HostComparisonRedirect.java:92:28:92:54 | getParameter(...) : String | HostComparisonRedirect.java:94:35:94:49 | toString(...) | Untrusted URL redirection depends on a $@. | HostComparisonRedirect.java:92:28:92:54 | getParameter(...) | user-provided value | +| HostComparisonRedirect.java:105:35:105:48 | toString(...) | HostComparisonRedirect.java:103:27:103:53 | getParameter(...) : String | HostComparisonRedirect.java:105:35:105:48 | toString(...) | Untrusted URL redirection depends on a $@. | HostComparisonRedirect.java:103:27:103:53 | getParameter(...) | user-provided value | +| HostComparisonRedirect.java:113:35:113:49 | toString(...) | HostComparisonRedirect.java:111:28:111:54 | getParameter(...) : String | HostComparisonRedirect.java:113:35:113:49 | toString(...) | Untrusted URL redirection depends on a $@. | HostComparisonRedirect.java:111:28:111:54 | getParameter(...) | user-provided value | +| HostComparisonRedirect.java:122:35:122:48 | toString(...) | HostComparisonRedirect.java:118:27:118:53 | getParameter(...) : String | HostComparisonRedirect.java:122:35:122:48 | toString(...) | Untrusted URL redirection depends on a $@. | HostComparisonRedirect.java:118:27:118:53 | getParameter(...) | user-provided value | +| HostComparisonRedirect.java:133:35:133:48 | toString(...) | HostComparisonRedirect.java:127:27:127:53 | getParameter(...) : String | HostComparisonRedirect.java:133:35:133:48 | toString(...) | Untrusted URL redirection depends on a $@. | HostComparisonRedirect.java:127:27:127:53 | getParameter(...) | user-provided value | +| HostComparisonRedirect.java:142:35:142:48 | toString(...) | HostComparisonRedirect.java:140:23:140:49 | getParameter(...) : String | HostComparisonRedirect.java:142:35:142:48 | toString(...) | Untrusted URL redirection depends on a $@. | HostComparisonRedirect.java:140:23:140:49 | getParameter(...) | user-provided value | +| HostComparisonRedirect.java:149:35:149:48 | toString(...) | HostComparisonRedirect.java:147:27:147:53 | getParameter(...) : String | HostComparisonRedirect.java:149:35:149:48 | toString(...) | Untrusted URL redirection depends on a $@. | HostComparisonRedirect.java:147:27:147:53 | getParameter(...) | user-provided value | +| HostComparisonRedirect.java:156:35:156:48 | toString(...) | HostComparisonRedirect.java:154:27:154:53 | getParameter(...) : String | HostComparisonRedirect.java:156:35:156:48 | toString(...) | Untrusted URL redirection depends on a $@. | HostComparisonRedirect.java:154:27:154:53 | getParameter(...) | user-provided value | +| HostComparisonRedirect.java:184:39:184:52 | toString(...) | HostComparisonRedirect.java:177:27:177:53 | getParameter(...) : String | HostComparisonRedirect.java:184:39:184:52 | toString(...) | Untrusted URL redirection depends on a $@. | HostComparisonRedirect.java:177:27:177:53 | getParameter(...) | user-provided value | +| HostComparisonRedirect.java:210:35:210:48 | toString(...) | HostComparisonRedirect.java:207:27:207:53 | getParameter(...) : String | HostComparisonRedirect.java:210:35:210:48 | toString(...) | Untrusted URL redirection depends on a $@. | HostComparisonRedirect.java:207:27:207:53 | getParameter(...) | user-provided value | +| HostComparisonRedirect.java:236:35:236:48 | toString(...) | HostComparisonRedirect.java:232:27:232:53 | getParameter(...) : String | HostComparisonRedirect.java:236:35:236:48 | toString(...) | Untrusted URL redirection depends on a $@. | HostComparisonRedirect.java:232:27:232:53 | getParameter(...) | user-provided value | +| HostComparisonRedirect.java:245:35:245:48 | toString(...) | HostComparisonRedirect.java:241:27:241:53 | getParameter(...) : String | HostComparisonRedirect.java:245:35:245:48 | toString(...) | Untrusted URL redirection depends on a $@. | HostComparisonRedirect.java:241:27:241:53 | getParameter(...) | user-provided value | +edges +| HostComparisonRedirect.java:8:19:8:54 | new URI(...) : URI | HostComparisonRedirect.java:9:31:9:33 | uri : URI | provenance | | +| HostComparisonRedirect.java:8:27:8:53 | getParameter(...) : String | HostComparisonRedirect.java:8:19:8:54 | new URI(...) : URI | provenance | Src:MaD:1 MaD:2 | +| HostComparisonRedirect.java:9:31:9:33 | uri : URI | HostComparisonRedirect.java:9:31:9:44 | toString(...) | provenance | MaD:3 | +| HostComparisonRedirect.java:50:19:50:54 | new URI(...) : URI | HostComparisonRedirect.java:52:35:52:37 | uri : URI | provenance | | +| HostComparisonRedirect.java:50:27:50:53 | getParameter(...) : String | HostComparisonRedirect.java:50:19:50:54 | new URI(...) : URI | provenance | Src:MaD:1 MaD:2 | +| HostComparisonRedirect.java:52:35:52:37 | uri : URI | HostComparisonRedirect.java:52:35:52:48 | toString(...) | provenance | MaD:3 | +| HostComparisonRedirect.java:57:19:57:54 | new URI(...) : URI | HostComparisonRedirect.java:59:35:59:37 | uri : URI | provenance | | +| HostComparisonRedirect.java:57:27:57:53 | getParameter(...) : String | HostComparisonRedirect.java:57:19:57:54 | new URI(...) : URI | provenance | Src:MaD:1 MaD:2 | +| HostComparisonRedirect.java:59:35:59:37 | uri : URI | HostComparisonRedirect.java:59:35:59:48 | toString(...) | provenance | MaD:3 | +| HostComparisonRedirect.java:68:19:68:54 | new URI(...) : URI | HostComparisonRedirect.java:70:35:70:37 | uri : URI | provenance | | +| HostComparisonRedirect.java:68:27:68:53 | getParameter(...) : String | HostComparisonRedirect.java:68:19:68:54 | new URI(...) : URI | provenance | Src:MaD:1 MaD:2 | +| HostComparisonRedirect.java:70:35:70:37 | uri : URI | HostComparisonRedirect.java:70:35:70:48 | toString(...) | provenance | MaD:3 | +| HostComparisonRedirect.java:84:19:84:54 | new URI(...) : URI | HostComparisonRedirect.java:86:35:86:37 | uri : URI | provenance | | +| HostComparisonRedirect.java:84:27:84:53 | getParameter(...) : String | HostComparisonRedirect.java:84:19:84:54 | new URI(...) : URI | provenance | Src:MaD:1 MaD:2 | +| HostComparisonRedirect.java:86:35:86:37 | uri : URI | HostComparisonRedirect.java:86:35:86:48 | toString(...) | provenance | MaD:3 | +| HostComparisonRedirect.java:92:20:92:55 | new URI(...) : URI | HostComparisonRedirect.java:94:35:94:38 | used : URI | provenance | | +| HostComparisonRedirect.java:92:28:92:54 | getParameter(...) : String | HostComparisonRedirect.java:92:20:92:55 | new URI(...) : URI | provenance | Src:MaD:1 MaD:2 | +| HostComparisonRedirect.java:94:35:94:38 | used : URI | HostComparisonRedirect.java:94:35:94:49 | toString(...) | provenance | MaD:3 | +| HostComparisonRedirect.java:103:19:103:54 | new URI(...) : URI | HostComparisonRedirect.java:105:35:105:37 | uri : URI | provenance | | +| HostComparisonRedirect.java:103:27:103:53 | getParameter(...) : String | HostComparisonRedirect.java:103:19:103:54 | new URI(...) : URI | provenance | Src:MaD:1 MaD:2 | +| HostComparisonRedirect.java:105:35:105:37 | uri : URI | HostComparisonRedirect.java:105:35:105:48 | toString(...) | provenance | MaD:3 | +| HostComparisonRedirect.java:111:20:111:55 | new URI(...) : URI | HostComparisonRedirect.java:113:35:113:38 | used : URI | provenance | | +| HostComparisonRedirect.java:111:28:111:54 | getParameter(...) : String | HostComparisonRedirect.java:111:20:111:55 | new URI(...) : URI | provenance | Src:MaD:1 MaD:2 | +| HostComparisonRedirect.java:113:35:113:38 | used : URI | HostComparisonRedirect.java:113:35:113:49 | toString(...) | provenance | MaD:3 | +| HostComparisonRedirect.java:118:19:118:54 | new URI(...) : URI | HostComparisonRedirect.java:122:35:122:37 | uri : URI | provenance | | +| HostComparisonRedirect.java:118:27:118:53 | getParameter(...) : String | HostComparisonRedirect.java:118:19:118:54 | new URI(...) : URI | provenance | Src:MaD:1 MaD:2 | +| HostComparisonRedirect.java:122:35:122:37 | uri : URI | HostComparisonRedirect.java:122:35:122:48 | toString(...) | provenance | MaD:3 | +| HostComparisonRedirect.java:127:19:127:54 | new URI(...) : URI | HostComparisonRedirect.java:133:35:133:37 | uri : URI | provenance | | +| HostComparisonRedirect.java:127:27:127:53 | getParameter(...) : String | HostComparisonRedirect.java:127:19:127:54 | new URI(...) : URI | provenance | Src:MaD:1 MaD:2 | +| HostComparisonRedirect.java:133:35:133:37 | uri : URI | HostComparisonRedirect.java:133:35:133:48 | toString(...) | provenance | MaD:3 | +| HostComparisonRedirect.java:140:15:140:50 | new URI(...) : URI | HostComparisonRedirect.java:142:35:142:37 | uri : URI | provenance | | +| HostComparisonRedirect.java:140:23:140:49 | getParameter(...) : String | HostComparisonRedirect.java:140:15:140:50 | new URI(...) : URI | provenance | Src:MaD:1 MaD:2 | +| HostComparisonRedirect.java:142:35:142:37 | uri : URI | HostComparisonRedirect.java:142:35:142:48 | toString(...) | provenance | MaD:3 | +| HostComparisonRedirect.java:147:19:147:54 | new URI(...) : URI | HostComparisonRedirect.java:149:35:149:37 | uri : URI | provenance | | +| HostComparisonRedirect.java:147:27:147:53 | getParameter(...) : String | HostComparisonRedirect.java:147:19:147:54 | new URI(...) : URI | provenance | Src:MaD:1 MaD:2 | +| HostComparisonRedirect.java:149:35:149:37 | uri : URI | HostComparisonRedirect.java:149:35:149:48 | toString(...) | provenance | MaD:3 | +| HostComparisonRedirect.java:154:19:154:54 | new URI(...) : URI | HostComparisonRedirect.java:156:35:156:37 | uri : URI | provenance | | +| HostComparisonRedirect.java:154:27:154:53 | getParameter(...) : String | HostComparisonRedirect.java:154:19:154:54 | new URI(...) : URI | provenance | Src:MaD:1 MaD:2 | +| HostComparisonRedirect.java:156:35:156:37 | uri : URI | HostComparisonRedirect.java:156:35:156:48 | toString(...) | provenance | MaD:3 | +| HostComparisonRedirect.java:177:19:177:54 | new URI(...) : URI | HostComparisonRedirect.java:184:39:184:41 | uri : URI | provenance | | +| HostComparisonRedirect.java:177:27:177:53 | getParameter(...) : String | HostComparisonRedirect.java:177:19:177:54 | new URI(...) : URI | provenance | Src:MaD:1 MaD:2 | +| HostComparisonRedirect.java:184:39:184:41 | uri : URI | HostComparisonRedirect.java:184:39:184:52 | toString(...) | provenance | MaD:3 | +| HostComparisonRedirect.java:207:19:207:54 | new URI(...) : URI | HostComparisonRedirect.java:210:35:210:37 | uri : URI | provenance | | +| HostComparisonRedirect.java:207:27:207:53 | getParameter(...) : String | HostComparisonRedirect.java:207:19:207:54 | new URI(...) : URI | provenance | Src:MaD:1 MaD:2 | +| HostComparisonRedirect.java:210:35:210:37 | uri : URI | HostComparisonRedirect.java:210:35:210:48 | toString(...) | provenance | MaD:3 | +| HostComparisonRedirect.java:232:19:232:54 | new URI(...) : URI | HostComparisonRedirect.java:236:35:236:37 | uri : URI | provenance | | +| HostComparisonRedirect.java:232:27:232:53 | getParameter(...) : String | HostComparisonRedirect.java:232:19:232:54 | new URI(...) : URI | provenance | Src:MaD:1 MaD:2 | +| HostComparisonRedirect.java:236:35:236:37 | uri : URI | HostComparisonRedirect.java:236:35:236:48 | toString(...) | provenance | MaD:3 | +| HostComparisonRedirect.java:241:19:241:54 | new URI(...) : URI | HostComparisonRedirect.java:245:35:245:37 | uri : URI | provenance | | +| HostComparisonRedirect.java:241:27:241:53 | getParameter(...) : String | HostComparisonRedirect.java:241:19:241:54 | new URI(...) : URI | provenance | Src:MaD:1 MaD:2 | +| HostComparisonRedirect.java:245:35:245:37 | uri : URI | HostComparisonRedirect.java:245:35:245:48 | toString(...) | provenance | MaD:3 | +models +| 1 | Source: javax.servlet; ServletRequest; false; getParameter; (String); ; ReturnValue; remote; manual | +| 2 | Summary: java.net; URI; false; URI; (String); ; Argument[0]; Argument[this]; taint; manual | +| 3 | Summary: java.net; URI; false; toString; ; ; Argument[this]; ReturnValue; taint; manual | +nodes +| HostComparisonRedirect.java:8:19:8:54 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparisonRedirect.java:8:27:8:53 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparisonRedirect.java:9:31:9:33 | uri : URI | semmle.label | uri : URI | +| HostComparisonRedirect.java:9:31:9:44 | toString(...) | semmle.label | toString(...) | +| HostComparisonRedirect.java:50:19:50:54 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparisonRedirect.java:50:27:50:53 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparisonRedirect.java:52:35:52:37 | uri : URI | semmle.label | uri : URI | +| HostComparisonRedirect.java:52:35:52:48 | toString(...) | semmle.label | toString(...) | +| HostComparisonRedirect.java:57:19:57:54 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparisonRedirect.java:57:27:57:53 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparisonRedirect.java:59:35:59:37 | uri : URI | semmle.label | uri : URI | +| HostComparisonRedirect.java:59:35:59:48 | toString(...) | semmle.label | toString(...) | +| HostComparisonRedirect.java:68:19:68:54 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparisonRedirect.java:68:27:68:53 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparisonRedirect.java:70:35:70:37 | uri : URI | semmle.label | uri : URI | +| HostComparisonRedirect.java:70:35:70:48 | toString(...) | semmle.label | toString(...) | +| HostComparisonRedirect.java:84:19:84:54 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparisonRedirect.java:84:27:84:53 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparisonRedirect.java:86:35:86:37 | uri : URI | semmle.label | uri : URI | +| HostComparisonRedirect.java:86:35:86:48 | toString(...) | semmle.label | toString(...) | +| HostComparisonRedirect.java:92:20:92:55 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparisonRedirect.java:92:28:92:54 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparisonRedirect.java:94:35:94:38 | used : URI | semmle.label | used : URI | +| HostComparisonRedirect.java:94:35:94:49 | toString(...) | semmle.label | toString(...) | +| HostComparisonRedirect.java:103:19:103:54 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparisonRedirect.java:103:27:103:53 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparisonRedirect.java:105:35:105:37 | uri : URI | semmle.label | uri : URI | +| HostComparisonRedirect.java:105:35:105:48 | toString(...) | semmle.label | toString(...) | +| HostComparisonRedirect.java:111:20:111:55 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparisonRedirect.java:111:28:111:54 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparisonRedirect.java:113:35:113:38 | used : URI | semmle.label | used : URI | +| HostComparisonRedirect.java:113:35:113:49 | toString(...) | semmle.label | toString(...) | +| HostComparisonRedirect.java:118:19:118:54 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparisonRedirect.java:118:27:118:53 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparisonRedirect.java:122:35:122:37 | uri : URI | semmle.label | uri : URI | +| HostComparisonRedirect.java:122:35:122:48 | toString(...) | semmle.label | toString(...) | +| HostComparisonRedirect.java:127:19:127:54 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparisonRedirect.java:127:27:127:53 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparisonRedirect.java:133:35:133:37 | uri : URI | semmle.label | uri : URI | +| HostComparisonRedirect.java:133:35:133:48 | toString(...) | semmle.label | toString(...) | +| HostComparisonRedirect.java:140:15:140:50 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparisonRedirect.java:140:23:140:49 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparisonRedirect.java:142:35:142:37 | uri : URI | semmle.label | uri : URI | +| HostComparisonRedirect.java:142:35:142:48 | toString(...) | semmle.label | toString(...) | +| HostComparisonRedirect.java:147:19:147:54 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparisonRedirect.java:147:27:147:53 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparisonRedirect.java:149:35:149:37 | uri : URI | semmle.label | uri : URI | +| HostComparisonRedirect.java:149:35:149:48 | toString(...) | semmle.label | toString(...) | +| HostComparisonRedirect.java:154:19:154:54 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparisonRedirect.java:154:27:154:53 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparisonRedirect.java:156:35:156:37 | uri : URI | semmle.label | uri : URI | +| HostComparisonRedirect.java:156:35:156:48 | toString(...) | semmle.label | toString(...) | +| HostComparisonRedirect.java:177:19:177:54 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparisonRedirect.java:177:27:177:53 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparisonRedirect.java:184:39:184:41 | uri : URI | semmle.label | uri : URI | +| HostComparisonRedirect.java:184:39:184:52 | toString(...) | semmle.label | toString(...) | +| HostComparisonRedirect.java:207:19:207:54 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparisonRedirect.java:207:27:207:53 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparisonRedirect.java:210:35:210:37 | uri : URI | semmle.label | uri : URI | +| HostComparisonRedirect.java:210:35:210:48 | toString(...) | semmle.label | toString(...) | +| HostComparisonRedirect.java:232:19:232:54 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparisonRedirect.java:232:27:232:53 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparisonRedirect.java:236:35:236:37 | uri : URI | semmle.label | uri : URI | +| HostComparisonRedirect.java:236:35:236:48 | toString(...) | semmle.label | toString(...) | +| HostComparisonRedirect.java:241:19:241:54 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparisonRedirect.java:241:27:241:53 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparisonRedirect.java:245:35:245:37 | uri : URI | semmle.label | uri : URI | +| HostComparisonRedirect.java:245:35:245:48 | toString(...) | semmle.label | toString(...) | +subpaths diff --git a/java/ql/test/query-tests/security/host-comparison-redirect/UrlRedirect.qlref b/java/ql/test/query-tests/security/host-comparison-redirect/UrlRedirect.qlref new file mode 100644 index 000000000000..f41f720f7251 --- /dev/null +++ b/java/ql/test/query-tests/security/host-comparison-redirect/UrlRedirect.qlref @@ -0,0 +1,4 @@ +query: Security/CWE/CWE-601/UrlRedirect.ql +postprocess: + - utils/test/PrettyPrintModels.ql + - utils/test/InlineExpectationsTestQuery.ql diff --git a/java/ql/test/query-tests/security/host-comparison-redirect/options b/java/ql/test/query-tests/security/host-comparison-redirect/options new file mode 100644 index 000000000000..4e9c82fc62ae --- /dev/null +++ b/java/ql/test/query-tests/security/host-comparison-redirect/options @@ -0,0 +1 @@ +//semmle-extractor-options: --javac-args -source 11 -target 11 -cp ${testdir}/../../../stubs/javax-servlet-2.5 diff --git a/java/ql/test/query-tests/security/ssrf-host-comparison-repro/HostComparison.java b/java/ql/test/query-tests/security/ssrf-host-comparison-repro/HostComparison.java new file mode 100644 index 000000000000..163a74d1d8ae --- /dev/null +++ b/java/ql/test/query-tests/security/ssrf-host-comparison-repro/HostComparison.java @@ -0,0 +1,247 @@ +import java.net.URI; +import java.util.Arrays; +import javax.servlet.http.HttpServletRequest; + +public class HostComparison { + public void unguarded(HttpServletRequest request) throws Exception { + URI uri = new URI(request.getParameter("url")); // $ Source + uri.toURL().openConnection(); // $ Alert + } + + public void directEquals(HttpServletRequest request) throws Exception { + URI uri = new URI(request.getParameter("url")); + if ("example.com".equals(uri.getHost())) { + uri.toURL().openConnection(); + } + } + + public void directEqualsIgnoreCase(HttpServletRequest request) throws Exception { + URI uri = new URI(request.getParameter("url")); + if ("example.com".equalsIgnoreCase(uri.getHost())) { + uri.toURL().openConnection(); + } + } + + public void reversedEqualsIgnoreCase(HttpServletRequest request) throws Exception { + URI uri = new URI(request.getParameter("url")); + if (uri.getHost().equalsIgnoreCase("example.com")) { + uri.toURL().openConnection(); + } + } + + public void localEquals(HttpServletRequest request) throws Exception { + URI uri = new URI(request.getParameter("url")); + String host = uri.getHost(); + if ("example.com".equals(host)) { + uri.toURL().openConnection(); + } + } + + public void localEqualsIgnoreCase(HttpServletRequest request) throws Exception { + URI uri = new URI(request.getParameter("url")); + String host = uri.getHost(); + if ("example.com".equalsIgnoreCase(host)) { + uri.toURL().openConnection(); + } + } + + public void streamEquals(HttpServletRequest request) throws Exception { + URI uri = new URI(request.getParameter("url")); // $ SPURIOUS: Source + if (Arrays.stream(new String[]{"example.com"}).anyMatch(uri.getHost()::equals)) { + uri.toURL().openConnection(); // $ SPURIOUS: Alert + } + } + + public void reportedStreamHelper(HttpServletRequest request) throws Exception { + URI uri = new URI(request.getParameter("url")); // $ SPURIOUS: Source + if (isAllowedStream(uri.getHost(), "example.com")) { + uri.toURL().openConnection(); // $ SPURIOUS: Alert + } + } + + private static boolean isAllowedStream(String host, String... allowedHosts) { + return Arrays.stream(allowedHosts).anyMatch(host::equalsIgnoreCase); + } + + public void reportedLoopHelper(HttpServletRequest request) throws Exception { + URI uri = new URI(request.getParameter("url")); // $ SPURIOUS: Source + if (isAllowedLoop(uri.getHost(), "example.com")) { + uri.toURL().openConnection(); // $ SPURIOUS: Alert + } + } + + private static boolean isAllowedLoop(String host, String... allowedHosts) { + for (String allowed : allowedHosts) { + if (allowed.equalsIgnoreCase(host)) { + return true; + } + } + return false; + } + + public void wrongBranch(HttpServletRequest request) throws Exception { + URI uri = new URI(request.getParameter("url")); // $ Source + if (!"example.com".equals(uri.getHost())) { + uri.toURL().openConnection(); // $ Alert + } + } + + public void differentUri(HttpServletRequest request) throws Exception { + URI checked = new URI(request.getParameter("checked")); + URI used = new URI(request.getParameter("url")); // $ Source + if ("example.com".equals(checked.getHost())) { + used.toURL().openConnection(); // $ Alert + } + } + + public void constantUrl() throws Exception { + new URI("https://example.com/").toURL().openConnection(); + } + + public void caseInsensitiveWrongBranch(HttpServletRequest request) throws Exception { + URI uri = new URI(request.getParameter("url")); // $ Source + if (!"example.com".equalsIgnoreCase(uri.getHost())) { + uri.toURL().openConnection(); // $ Alert + } + } + + public void caseInsensitiveDifferentUri(HttpServletRequest request) throws Exception { + URI checked = new URI(request.getParameter("checked")); + URI used = new URI(request.getParameter("url")); // $ Source + if ("example.com".equalsIgnoreCase(checked.getHost())) { + used.toURL().openConnection(); // $ Alert + } + } + + public void reassignedHost(HttpServletRequest request) throws Exception { + URI uri = new URI(request.getParameter("url")); // $ Source + String host = uri.getHost(); + host = "example.com"; + if ("example.com".equalsIgnoreCase(host)) { + uri.toURL().openConnection(); // $ Alert + } + } + + public void conditionallyReassignedHost(HttpServletRequest request, boolean skip) throws Exception { + URI uri = new URI(request.getParameter("url")); // $ Source + String host = uri.getHost(); + if (skip) { + host = "example.com"; + } + if ("example.com".equalsIgnoreCase(host)) { + uri.toURL().openConnection(); // $ Alert + } + } + + public void reassignedUri(HttpServletRequest request) throws Exception { + URI uri = new URI("https://example.com/"); + String host = uri.getHost(); + uri = new URI(request.getParameter("url")); // $ Source + if ("example.com".equalsIgnoreCase(host)) { + uri.toURL().openConnection(); // $ Alert + } + } + + public void untrustedComparison(HttpServletRequest request) throws Exception { + URI uri = new URI(request.getParameter("url")); // $ Source + if (request.getParameter("allowed").equalsIgnoreCase(uri.getHost())) { + uri.toURL().openConnection(); // $ Alert + } + } + + public void unrelatedComparison(HttpServletRequest request) throws Exception { + URI uri = new URI(request.getParameter("url")); // $ Source + if (new FakeComparison().equalsIgnoreCase(uri.getHost())) { + uri.toURL().openConnection(); // $ Alert + } + } + + private static class FakeComparison { + boolean equalsIgnoreCase(String host) { + return true; + } + } + + public void aliasChain(HttpServletRequest request) throws Exception { + URI uri = new URI(request.getParameter("url")); + String host = uri.getHost(); + String alias = host; + String secondAlias = alias; + if ("example.com".equalsIgnoreCase(secondAlias)) { + uri.toURL().openConnection(); + } + } + + public void finallyOverwrite(HttpServletRequest request, boolean skip) throws Exception { + URI uri = new URI(request.getParameter("url")); // $ Source + String host = uri.getHost(); + try { + if (skip) return; + host = "example.com"; + } finally { + if ("example.com".equalsIgnoreCase(host)) { + uri.toURL().openConnection(); // $ Alert + } + } + } + + public void rejectionReturns(HttpServletRequest request) throws Exception { + URI uri = new URI(request.getParameter("url")); + String host = uri.getHost(); + if (!"example.com".equalsIgnoreCase(host)) return; + uri.toURL().openConnection(); + } + + private static final String ALLOWED_HOST = "example.com"; + + public void constantAllowlistField(HttpServletRequest request) throws Exception { + URI uri = new URI(request.getParameter("url")); + String host = uri.getHost(); + if (ALLOWED_HOST.equalsIgnoreCase(host)) { + uri.toURL().openConnection(); + } + } + + public void orBypass(HttpServletRequest request, boolean skip) throws Exception { + URI uri = new URI(request.getParameter("url")); // $ Source + String host = uri.getHost(); + if ("example.com".equalsIgnoreCase(host) || skip) { + uri.toURL().openConnection(); // $ Alert + } + } + + public void assignmentCast(HttpServletRequest request) throws Exception { + URI uri = new URI(request.getParameter("url")); + Object value = uri.getHost(); + String host = (String) value; + if ("example.com".equalsIgnoreCase(host)) { + uri.toURL().openConnection(); + } + } + + public void comparisonCast(HttpServletRequest request) throws Exception { + URI uri = new URI(request.getParameter("url")); + Object host = uri.getHost(); + if ("example.com".equalsIgnoreCase((String) host)) { + uri.toURL().openConnection(); + } + } + + public void castHostOverwrite(HttpServletRequest request) throws Exception { + URI uri = new URI(request.getParameter("url")); // $ Source + Object host = uri.getHost(); + host = "example.com"; + if ("example.com".equalsIgnoreCase((String) host)) { + uri.toURL().openConnection(); // $ Alert + } + } + + public void castHostConditionalOverwrite(HttpServletRequest request, boolean skip) throws Exception { + URI uri = new URI(request.getParameter("url")); // $ Source + Object host = uri.getHost(); + if (skip) host = "example.com"; + if ("example.com".equalsIgnoreCase((String) host)) { + uri.toURL().openConnection(); // $ Alert + } + } +} diff --git a/java/ql/test/query-tests/security/ssrf-host-comparison-repro/RequestForgery.expected b/java/ql/test/query-tests/security/ssrf-host-comparison-repro/RequestForgery.expected new file mode 100644 index 000000000000..bd3b7e368158 --- /dev/null +++ b/java/ql/test/query-tests/security/ssrf-host-comparison-repro/RequestForgery.expected @@ -0,0 +1,162 @@ +#select +| HostComparison.java:8:9:8:19 | toURL(...) | HostComparison.java:7:27:7:53 | getParameter(...) : String | HostComparison.java:8:9:8:19 | toURL(...) | Potential server-side request forgery due to a $@. | HostComparison.java:7:27:7:53 | getParameter(...) | user-provided value | +| HostComparison.java:51:13:51:23 | toURL(...) | HostComparison.java:49:27:49:53 | getParameter(...) : String | HostComparison.java:51:13:51:23 | toURL(...) | Potential server-side request forgery due to a $@. | HostComparison.java:49:27:49:53 | getParameter(...) | user-provided value | +| HostComparison.java:58:13:58:23 | toURL(...) | HostComparison.java:56:27:56:53 | getParameter(...) : String | HostComparison.java:58:13:58:23 | toURL(...) | Potential server-side request forgery due to a $@. | HostComparison.java:56:27:56:53 | getParameter(...) | user-provided value | +| HostComparison.java:69:13:69:23 | toURL(...) | HostComparison.java:67:27:67:53 | getParameter(...) : String | HostComparison.java:69:13:69:23 | toURL(...) | Potential server-side request forgery due to a $@. | HostComparison.java:67:27:67:53 | getParameter(...) | user-provided value | +| HostComparison.java:85:13:85:23 | toURL(...) | HostComparison.java:83:27:83:53 | getParameter(...) : String | HostComparison.java:85:13:85:23 | toURL(...) | Potential server-side request forgery due to a $@. | HostComparison.java:83:27:83:53 | getParameter(...) | user-provided value | +| HostComparison.java:93:13:93:24 | toURL(...) | HostComparison.java:91:28:91:54 | getParameter(...) : String | HostComparison.java:93:13:93:24 | toURL(...) | Potential server-side request forgery due to a $@. | HostComparison.java:91:28:91:54 | getParameter(...) | user-provided value | +| HostComparison.java:104:13:104:23 | toURL(...) | HostComparison.java:102:27:102:53 | getParameter(...) : String | HostComparison.java:104:13:104:23 | toURL(...) | Potential server-side request forgery due to a $@. | HostComparison.java:102:27:102:53 | getParameter(...) | user-provided value | +| HostComparison.java:112:13:112:24 | toURL(...) | HostComparison.java:110:28:110:54 | getParameter(...) : String | HostComparison.java:112:13:112:24 | toURL(...) | Potential server-side request forgery due to a $@. | HostComparison.java:110:28:110:54 | getParameter(...) | user-provided value | +| HostComparison.java:121:13:121:23 | toURL(...) | HostComparison.java:117:27:117:53 | getParameter(...) : String | HostComparison.java:121:13:121:23 | toURL(...) | Potential server-side request forgery due to a $@. | HostComparison.java:117:27:117:53 | getParameter(...) | user-provided value | +| HostComparison.java:132:13:132:23 | toURL(...) | HostComparison.java:126:27:126:53 | getParameter(...) : String | HostComparison.java:132:13:132:23 | toURL(...) | Potential server-side request forgery due to a $@. | HostComparison.java:126:27:126:53 | getParameter(...) | user-provided value | +| HostComparison.java:141:13:141:23 | toURL(...) | HostComparison.java:139:23:139:49 | getParameter(...) : String | HostComparison.java:141:13:141:23 | toURL(...) | Potential server-side request forgery due to a $@. | HostComparison.java:139:23:139:49 | getParameter(...) | user-provided value | +| HostComparison.java:148:13:148:23 | toURL(...) | HostComparison.java:146:27:146:53 | getParameter(...) : String | HostComparison.java:148:13:148:23 | toURL(...) | Potential server-side request forgery due to a $@. | HostComparison.java:146:27:146:53 | getParameter(...) | user-provided value | +| HostComparison.java:155:13:155:23 | toURL(...) | HostComparison.java:153:27:153:53 | getParameter(...) : String | HostComparison.java:155:13:155:23 | toURL(...) | Potential server-side request forgery due to a $@. | HostComparison.java:153:27:153:53 | getParameter(...) | user-provided value | +| HostComparison.java:183:17:183:27 | toURL(...) | HostComparison.java:176:27:176:53 | getParameter(...) : String | HostComparison.java:183:17:183:27 | toURL(...) | Potential server-side request forgery due to a $@. | HostComparison.java:176:27:176:53 | getParameter(...) | user-provided value | +| HostComparison.java:209:13:209:23 | toURL(...) | HostComparison.java:206:27:206:53 | getParameter(...) : String | HostComparison.java:209:13:209:23 | toURL(...) | Potential server-side request forgery due to a $@. | HostComparison.java:206:27:206:53 | getParameter(...) | user-provided value | +| HostComparison.java:235:13:235:23 | toURL(...) | HostComparison.java:231:27:231:53 | getParameter(...) : String | HostComparison.java:235:13:235:23 | toURL(...) | Potential server-side request forgery due to a $@. | HostComparison.java:231:27:231:53 | getParameter(...) | user-provided value | +| HostComparison.java:244:13:244:23 | toURL(...) | HostComparison.java:240:27:240:53 | getParameter(...) : String | HostComparison.java:244:13:244:23 | toURL(...) | Potential server-side request forgery due to a $@. | HostComparison.java:240:27:240:53 | getParameter(...) | user-provided value | +edges +| HostComparison.java:7:19:7:54 | new URI(...) : URI | HostComparison.java:8:9:8:11 | uri : URI | provenance | | +| HostComparison.java:7:27:7:53 | getParameter(...) : String | HostComparison.java:7:19:7:54 | new URI(...) : URI | provenance | Src:MaD:2 Config | +| HostComparison.java:7:27:7:53 | getParameter(...) : String | HostComparison.java:7:19:7:54 | new URI(...) : URI | provenance | Src:MaD:2 MaD:3 | +| HostComparison.java:8:9:8:11 | uri : URI | HostComparison.java:8:9:8:19 | toURL(...) | provenance | MaD:4 Sink:MaD:1 | +| HostComparison.java:49:19:49:54 | new URI(...) : URI | HostComparison.java:51:13:51:15 | uri : URI | provenance | | +| HostComparison.java:49:27:49:53 | getParameter(...) : String | HostComparison.java:49:19:49:54 | new URI(...) : URI | provenance | Src:MaD:2 Config | +| HostComparison.java:49:27:49:53 | getParameter(...) : String | HostComparison.java:49:19:49:54 | new URI(...) : URI | provenance | Src:MaD:2 MaD:3 | +| HostComparison.java:51:13:51:15 | uri : URI | HostComparison.java:51:13:51:23 | toURL(...) | provenance | MaD:4 Sink:MaD:1 | +| HostComparison.java:56:19:56:54 | new URI(...) : URI | HostComparison.java:58:13:58:15 | uri : URI | provenance | | +| HostComparison.java:56:27:56:53 | getParameter(...) : String | HostComparison.java:56:19:56:54 | new URI(...) : URI | provenance | Src:MaD:2 Config | +| HostComparison.java:56:27:56:53 | getParameter(...) : String | HostComparison.java:56:19:56:54 | new URI(...) : URI | provenance | Src:MaD:2 MaD:3 | +| HostComparison.java:58:13:58:15 | uri : URI | HostComparison.java:58:13:58:23 | toURL(...) | provenance | MaD:4 Sink:MaD:1 | +| HostComparison.java:67:19:67:54 | new URI(...) : URI | HostComparison.java:69:13:69:15 | uri : URI | provenance | | +| HostComparison.java:67:27:67:53 | getParameter(...) : String | HostComparison.java:67:19:67:54 | new URI(...) : URI | provenance | Src:MaD:2 Config | +| HostComparison.java:67:27:67:53 | getParameter(...) : String | HostComparison.java:67:19:67:54 | new URI(...) : URI | provenance | Src:MaD:2 MaD:3 | +| HostComparison.java:69:13:69:15 | uri : URI | HostComparison.java:69:13:69:23 | toURL(...) | provenance | MaD:4 Sink:MaD:1 | +| HostComparison.java:83:19:83:54 | new URI(...) : URI | HostComparison.java:85:13:85:15 | uri : URI | provenance | | +| HostComparison.java:83:27:83:53 | getParameter(...) : String | HostComparison.java:83:19:83:54 | new URI(...) : URI | provenance | Src:MaD:2 Config | +| HostComparison.java:83:27:83:53 | getParameter(...) : String | HostComparison.java:83:19:83:54 | new URI(...) : URI | provenance | Src:MaD:2 MaD:3 | +| HostComparison.java:85:13:85:15 | uri : URI | HostComparison.java:85:13:85:23 | toURL(...) | provenance | MaD:4 Sink:MaD:1 | +| HostComparison.java:91:20:91:55 | new URI(...) : URI | HostComparison.java:93:13:93:16 | used : URI | provenance | | +| HostComparison.java:91:28:91:54 | getParameter(...) : String | HostComparison.java:91:20:91:55 | new URI(...) : URI | provenance | Src:MaD:2 Config | +| HostComparison.java:91:28:91:54 | getParameter(...) : String | HostComparison.java:91:20:91:55 | new URI(...) : URI | provenance | Src:MaD:2 MaD:3 | +| HostComparison.java:93:13:93:16 | used : URI | HostComparison.java:93:13:93:24 | toURL(...) | provenance | MaD:4 Sink:MaD:1 | +| HostComparison.java:102:19:102:54 | new URI(...) : URI | HostComparison.java:104:13:104:15 | uri : URI | provenance | | +| HostComparison.java:102:27:102:53 | getParameter(...) : String | HostComparison.java:102:19:102:54 | new URI(...) : URI | provenance | Src:MaD:2 Config | +| HostComparison.java:102:27:102:53 | getParameter(...) : String | HostComparison.java:102:19:102:54 | new URI(...) : URI | provenance | Src:MaD:2 MaD:3 | +| HostComparison.java:104:13:104:15 | uri : URI | HostComparison.java:104:13:104:23 | toURL(...) | provenance | MaD:4 Sink:MaD:1 | +| HostComparison.java:110:20:110:55 | new URI(...) : URI | HostComparison.java:112:13:112:16 | used : URI | provenance | | +| HostComparison.java:110:28:110:54 | getParameter(...) : String | HostComparison.java:110:20:110:55 | new URI(...) : URI | provenance | Src:MaD:2 Config | +| HostComparison.java:110:28:110:54 | getParameter(...) : String | HostComparison.java:110:20:110:55 | new URI(...) : URI | provenance | Src:MaD:2 MaD:3 | +| HostComparison.java:112:13:112:16 | used : URI | HostComparison.java:112:13:112:24 | toURL(...) | provenance | MaD:4 Sink:MaD:1 | +| HostComparison.java:117:19:117:54 | new URI(...) : URI | HostComparison.java:121:13:121:15 | uri : URI | provenance | | +| HostComparison.java:117:27:117:53 | getParameter(...) : String | HostComparison.java:117:19:117:54 | new URI(...) : URI | provenance | Src:MaD:2 Config | +| HostComparison.java:117:27:117:53 | getParameter(...) : String | HostComparison.java:117:19:117:54 | new URI(...) : URI | provenance | Src:MaD:2 MaD:3 | +| HostComparison.java:121:13:121:15 | uri : URI | HostComparison.java:121:13:121:23 | toURL(...) | provenance | MaD:4 Sink:MaD:1 | +| HostComparison.java:126:19:126:54 | new URI(...) : URI | HostComparison.java:132:13:132:15 | uri : URI | provenance | | +| HostComparison.java:126:27:126:53 | getParameter(...) : String | HostComparison.java:126:19:126:54 | new URI(...) : URI | provenance | Src:MaD:2 Config | +| HostComparison.java:126:27:126:53 | getParameter(...) : String | HostComparison.java:126:19:126:54 | new URI(...) : URI | provenance | Src:MaD:2 MaD:3 | +| HostComparison.java:132:13:132:15 | uri : URI | HostComparison.java:132:13:132:23 | toURL(...) | provenance | MaD:4 Sink:MaD:1 | +| HostComparison.java:139:15:139:50 | new URI(...) : URI | HostComparison.java:141:13:141:15 | uri : URI | provenance | | +| HostComparison.java:139:23:139:49 | getParameter(...) : String | HostComparison.java:139:15:139:50 | new URI(...) : URI | provenance | Src:MaD:2 Config | +| HostComparison.java:139:23:139:49 | getParameter(...) : String | HostComparison.java:139:15:139:50 | new URI(...) : URI | provenance | Src:MaD:2 MaD:3 | +| HostComparison.java:141:13:141:15 | uri : URI | HostComparison.java:141:13:141:23 | toURL(...) | provenance | MaD:4 Sink:MaD:1 | +| HostComparison.java:146:19:146:54 | new URI(...) : URI | HostComparison.java:148:13:148:15 | uri : URI | provenance | | +| HostComparison.java:146:27:146:53 | getParameter(...) : String | HostComparison.java:146:19:146:54 | new URI(...) : URI | provenance | Src:MaD:2 Config | +| HostComparison.java:146:27:146:53 | getParameter(...) : String | HostComparison.java:146:19:146:54 | new URI(...) : URI | provenance | Src:MaD:2 MaD:3 | +| HostComparison.java:148:13:148:15 | uri : URI | HostComparison.java:148:13:148:23 | toURL(...) | provenance | MaD:4 Sink:MaD:1 | +| HostComparison.java:153:19:153:54 | new URI(...) : URI | HostComparison.java:155:13:155:15 | uri : URI | provenance | | +| HostComparison.java:153:27:153:53 | getParameter(...) : String | HostComparison.java:153:19:153:54 | new URI(...) : URI | provenance | Src:MaD:2 Config | +| HostComparison.java:153:27:153:53 | getParameter(...) : String | HostComparison.java:153:19:153:54 | new URI(...) : URI | provenance | Src:MaD:2 MaD:3 | +| HostComparison.java:155:13:155:15 | uri : URI | HostComparison.java:155:13:155:23 | toURL(...) | provenance | MaD:4 Sink:MaD:1 | +| HostComparison.java:176:19:176:54 | new URI(...) : URI | HostComparison.java:183:17:183:19 | uri : URI | provenance | | +| HostComparison.java:176:27:176:53 | getParameter(...) : String | HostComparison.java:176:19:176:54 | new URI(...) : URI | provenance | Src:MaD:2 Config | +| HostComparison.java:176:27:176:53 | getParameter(...) : String | HostComparison.java:176:19:176:54 | new URI(...) : URI | provenance | Src:MaD:2 MaD:3 | +| HostComparison.java:183:17:183:19 | uri : URI | HostComparison.java:183:17:183:27 | toURL(...) | provenance | MaD:4 Sink:MaD:1 | +| HostComparison.java:206:19:206:54 | new URI(...) : URI | HostComparison.java:209:13:209:15 | uri : URI | provenance | | +| HostComparison.java:206:27:206:53 | getParameter(...) : String | HostComparison.java:206:19:206:54 | new URI(...) : URI | provenance | Src:MaD:2 Config | +| HostComparison.java:206:27:206:53 | getParameter(...) : String | HostComparison.java:206:19:206:54 | new URI(...) : URI | provenance | Src:MaD:2 MaD:3 | +| HostComparison.java:209:13:209:15 | uri : URI | HostComparison.java:209:13:209:23 | toURL(...) | provenance | MaD:4 Sink:MaD:1 | +| HostComparison.java:231:19:231:54 | new URI(...) : URI | HostComparison.java:235:13:235:15 | uri : URI | provenance | | +| HostComparison.java:231:27:231:53 | getParameter(...) : String | HostComparison.java:231:19:231:54 | new URI(...) : URI | provenance | Src:MaD:2 Config | +| HostComparison.java:231:27:231:53 | getParameter(...) : String | HostComparison.java:231:19:231:54 | new URI(...) : URI | provenance | Src:MaD:2 MaD:3 | +| HostComparison.java:235:13:235:15 | uri : URI | HostComparison.java:235:13:235:23 | toURL(...) | provenance | MaD:4 Sink:MaD:1 | +| HostComparison.java:240:19:240:54 | new URI(...) : URI | HostComparison.java:244:13:244:15 | uri : URI | provenance | | +| HostComparison.java:240:27:240:53 | getParameter(...) : String | HostComparison.java:240:19:240:54 | new URI(...) : URI | provenance | Src:MaD:2 Config | +| HostComparison.java:240:27:240:53 | getParameter(...) : String | HostComparison.java:240:19:240:54 | new URI(...) : URI | provenance | Src:MaD:2 MaD:3 | +| HostComparison.java:244:13:244:15 | uri : URI | HostComparison.java:244:13:244:23 | toURL(...) | provenance | MaD:4 Sink:MaD:1 | +models +| 1 | Sink: java.net; URL; false; openConnection; ; ; Argument[this]; request-forgery; manual | +| 2 | Source: javax.servlet; ServletRequest; false; getParameter; (String); ; ReturnValue; remote; manual | +| 3 | Summary: java.net; URI; false; URI; (String); ; Argument[0]; Argument[this]; taint; manual | +| 4 | Summary: java.net; URI; false; toURL; ; ; Argument[this]; ReturnValue; taint; manual | +nodes +| HostComparison.java:7:19:7:54 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparison.java:7:27:7:53 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparison.java:8:9:8:11 | uri : URI | semmle.label | uri : URI | +| HostComparison.java:8:9:8:19 | toURL(...) | semmle.label | toURL(...) | +| HostComparison.java:49:19:49:54 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparison.java:49:27:49:53 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparison.java:51:13:51:15 | uri : URI | semmle.label | uri : URI | +| HostComparison.java:51:13:51:23 | toURL(...) | semmle.label | toURL(...) | +| HostComparison.java:56:19:56:54 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparison.java:56:27:56:53 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparison.java:58:13:58:15 | uri : URI | semmle.label | uri : URI | +| HostComparison.java:58:13:58:23 | toURL(...) | semmle.label | toURL(...) | +| HostComparison.java:67:19:67:54 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparison.java:67:27:67:53 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparison.java:69:13:69:15 | uri : URI | semmle.label | uri : URI | +| HostComparison.java:69:13:69:23 | toURL(...) | semmle.label | toURL(...) | +| HostComparison.java:83:19:83:54 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparison.java:83:27:83:53 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparison.java:85:13:85:15 | uri : URI | semmle.label | uri : URI | +| HostComparison.java:85:13:85:23 | toURL(...) | semmle.label | toURL(...) | +| HostComparison.java:91:20:91:55 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparison.java:91:28:91:54 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparison.java:93:13:93:16 | used : URI | semmle.label | used : URI | +| HostComparison.java:93:13:93:24 | toURL(...) | semmle.label | toURL(...) | +| HostComparison.java:102:19:102:54 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparison.java:102:27:102:53 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparison.java:104:13:104:15 | uri : URI | semmle.label | uri : URI | +| HostComparison.java:104:13:104:23 | toURL(...) | semmle.label | toURL(...) | +| HostComparison.java:110:20:110:55 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparison.java:110:28:110:54 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparison.java:112:13:112:16 | used : URI | semmle.label | used : URI | +| HostComparison.java:112:13:112:24 | toURL(...) | semmle.label | toURL(...) | +| HostComparison.java:117:19:117:54 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparison.java:117:27:117:53 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparison.java:121:13:121:15 | uri : URI | semmle.label | uri : URI | +| HostComparison.java:121:13:121:23 | toURL(...) | semmle.label | toURL(...) | +| HostComparison.java:126:19:126:54 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparison.java:126:27:126:53 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparison.java:132:13:132:15 | uri : URI | semmle.label | uri : URI | +| HostComparison.java:132:13:132:23 | toURL(...) | semmle.label | toURL(...) | +| HostComparison.java:139:15:139:50 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparison.java:139:23:139:49 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparison.java:141:13:141:15 | uri : URI | semmle.label | uri : URI | +| HostComparison.java:141:13:141:23 | toURL(...) | semmle.label | toURL(...) | +| HostComparison.java:146:19:146:54 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparison.java:146:27:146:53 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparison.java:148:13:148:15 | uri : URI | semmle.label | uri : URI | +| HostComparison.java:148:13:148:23 | toURL(...) | semmle.label | toURL(...) | +| HostComparison.java:153:19:153:54 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparison.java:153:27:153:53 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparison.java:155:13:155:15 | uri : URI | semmle.label | uri : URI | +| HostComparison.java:155:13:155:23 | toURL(...) | semmle.label | toURL(...) | +| HostComparison.java:176:19:176:54 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparison.java:176:27:176:53 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparison.java:183:17:183:19 | uri : URI | semmle.label | uri : URI | +| HostComparison.java:183:17:183:27 | toURL(...) | semmle.label | toURL(...) | +| HostComparison.java:206:19:206:54 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparison.java:206:27:206:53 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparison.java:209:13:209:15 | uri : URI | semmle.label | uri : URI | +| HostComparison.java:209:13:209:23 | toURL(...) | semmle.label | toURL(...) | +| HostComparison.java:231:19:231:54 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparison.java:231:27:231:53 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparison.java:235:13:235:15 | uri : URI | semmle.label | uri : URI | +| HostComparison.java:235:13:235:23 | toURL(...) | semmle.label | toURL(...) | +| HostComparison.java:240:19:240:54 | new URI(...) : URI | semmle.label | new URI(...) : URI | +| HostComparison.java:240:27:240:53 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| HostComparison.java:244:13:244:15 | uri : URI | semmle.label | uri : URI | +| HostComparison.java:244:13:244:23 | toURL(...) | semmle.label | toURL(...) | +subpaths diff --git a/java/ql/test/query-tests/security/ssrf-host-comparison-repro/RequestForgery.qlref b/java/ql/test/query-tests/security/ssrf-host-comparison-repro/RequestForgery.qlref new file mode 100644 index 000000000000..be2312049e7d --- /dev/null +++ b/java/ql/test/query-tests/security/ssrf-host-comparison-repro/RequestForgery.qlref @@ -0,0 +1,4 @@ +query: Security/CWE/CWE-918/RequestForgery.ql +postprocess: + - utils/test/PrettyPrintModels.ql + - utils/test/InlineExpectationsTestQuery.ql diff --git a/java/ql/test/query-tests/security/ssrf-host-comparison-repro/options b/java/ql/test/query-tests/security/ssrf-host-comparison-repro/options new file mode 100644 index 000000000000..4e9c82fc62ae --- /dev/null +++ b/java/ql/test/query-tests/security/ssrf-host-comparison-repro/options @@ -0,0 +1 @@ +//semmle-extractor-options: --javac-args -source 11 -target 11 -cp ${testdir}/../../../stubs/javax-servlet-2.5 From c00a11492e55f1b661cbb997bcd2ae76fb011415 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 15 Sep 2026 19:18:13 +0100 Subject: [PATCH 1018/2098] C++: Add a test with invalid IR. --- .../library-tests/ir/ir/PrintAST.expected | 24 ++++++++++++++ .../library-tests/ir/ir/aliased_ir.expected | 33 +++++++++++++++++++ .../ir/ir/aliased_ssa_consistency.expected | 3 ++ .../aliased_ssa_consistency_unsound.expected | 3 ++ cpp/ql/test/library-tests/ir/ir/ir.cpp | 10 ++++++ .../ir/ir/raw_consistency.expected | 3 ++ .../test/library-tests/ir/ir/raw_ir.expected | 31 +++++++++++++++++ .../ir/ir/unaliased_ssa_consistency.expected | 3 ++ ...unaliased_ssa_consistency_unsound.expected | 3 ++ 9 files changed, 113 insertions(+) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index f8a9e70fec7c..67e3c03d8f1f 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -25804,6 +25804,30 @@ ir.cpp: # 2919| Conversion = [FloatingPointToIntegralConversion] floating point to integral conversion # 2919| Type = [IntType] int # 2919| ValueCategory = prvalue +# 2921| [CopyAssignmentOperator] PointerWrapper& PointerWrapper::operator=(PointerWrapper const&) +# 2921| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const PointerWrapper & +# 2921| [MoveAssignmentOperator] PointerWrapper& PointerWrapper::operator=(PointerWrapper&&) +# 2921| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] PointerWrapper && +# 2925| [TopLevelFunction] PointerWrapper get_wrapper() +# 2925| : +# 2927| [TopLevelFunction] void test() +# 2927| : +# 2927| getEntryPoint(): [BlockStmt] { ... } +# 2928| getStmt(0): [ExprStmt] ExprStmt +# 2928| getExpr(): [ValueFieldAccess] x +# 2928| Type = [IntType] int +# 2928| ValueCategory = prvalue +# 2928| getQualifier(): [ValueFieldAccess] point +# 2928| Type = [Struct] Point +# 2928| ValueCategory = prvalue +# 2928| getQualifier(): [FunctionCall] call to get_wrapper +# 2928| Type = [Struct] PointerWrapper +# 2928| ValueCategory = prvalue +# 2929| getStmt(1): [ReturnStmt] return ... ir23.cpp: # 1| [TopLevelFunction] bool consteval_1() # 1| : diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected index 96035c165331..186a1a18e60b 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -21772,6 +21772,39 @@ ir.cpp: # 2919| v2919_13(void) = AliasedUse : ~m2919_11 # 2919| v2919_14(void) = ExitFunction : +# 2927| void test() +# 2927| Block 0 +# 2927| v2927_1(void) = EnterFunction : +# 2927| m2927_2(unknown) = AliasedDefinition : +# 2927| m2927_3(unknown) = InitializeNonLocal : +# 2927| m2927_4(unknown) = Chi : total:m2927_2, partial:m2927_3 +# 2928| r2928_1(glval) = FunctionAddress[get_wrapper] : +# 2928| r2928_2(PointerWrapper) = Call[get_wrapper] : func:r2928_1 +# 2928| m2928_3(unknown) = ^CallSideEffect : ~m2927_4 +# 2928| m2928_4(unknown) = Chi : total:m2927_4, partial:m2928_3 +# 2928| r2928_5(glval) = VariableAddress[#temp2928:3] : +# 2928| m2928_6(PointerWrapper) = Store[#temp2928:3] : &:r2928_5, r2928_2 +# 2928| r2928_7(glval) = FieldAddress[point] : r2928_5 +#-----| Goto -> Block 3 +#-----| Goto -> Block 2 + +# 2928| Block 1 +# 2928| r2928_8(glval) = FieldAddress[x] : +# 2928| r2928_9(int) = Load[?] : &:r2928_8, ~m2928_4 +# 2929| v2929_1(void) = NoOp : +# 2927| v2927_5(void) = ReturnVoid : +# 2927| v2927_6(void) = AliasedUse : ~m2928_4 +# 2927| v2927_7(void) = ExitFunction : + +# 2928| Block 2 +# 2928| r2928_10(glval) = VariableAddress[#temp2928:17] : +# 2928| m2928_11(Point) = Store[#temp2928:17] : &:r2928_10, r2928_7 +#-----| Goto -> Block 1 + +# 2928| Block 3 +# 2928| r2928_12(Point) = Load[?] : &:r2928_7, ~m2928_6 +#-----| Goto -> Block 1 + ir23.cpp: # 1| bool consteval_1() # 1| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected index f1b75895c3e7..e0ee2aa29cea 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected @@ -1,4 +1,5 @@ missingOperand +| ir.cpp:2928:23:2928:23 | FieldAddress: x | Instruction 'FieldAddress' is missing an expected operand with tag 'Unary' in function '$@'. | ir.cpp:2927:6:2927:9 | void test() | void test() | unexpectedOperand duplicateOperand missingPhiOperand @@ -7,6 +8,7 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors +| ir.cpp:2928:17:2928:21 | FieldAddress: point | Instruction 'FieldAddress: point' has 2 successors of kind 'Goto' in function '$@'. | ir.cpp:2927:6:2927:9 | void test() | void test() | unexplainedLoop unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled @@ -26,6 +28,7 @@ wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction fieldAddressOnNonPointer +| ir.cpp:2928:23:2928:23 | FieldAddress: x | FieldAddress instruction 'FieldAddress: x' has an object address operand that is not an address, in function '$@'. | ir.cpp:2927:6:2927:9 | void test() | void test() | thisArgumentIsNonPointer | ir.cpp:2548:34:2548:34 | Call: call to operator bool | Call instruction 'Call: call to operator bool' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:2547:6:2547:23 | void this_inconsistency(bool) | void this_inconsistency(bool) | nonUniqueIRVariable diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected index f1b75895c3e7..e0ee2aa29cea 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected @@ -1,4 +1,5 @@ missingOperand +| ir.cpp:2928:23:2928:23 | FieldAddress: x | Instruction 'FieldAddress' is missing an expected operand with tag 'Unary' in function '$@'. | ir.cpp:2927:6:2927:9 | void test() | void test() | unexpectedOperand duplicateOperand missingPhiOperand @@ -7,6 +8,7 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors +| ir.cpp:2928:17:2928:21 | FieldAddress: point | Instruction 'FieldAddress: point' has 2 successors of kind 'Goto' in function '$@'. | ir.cpp:2927:6:2927:9 | void test() | void test() | unexplainedLoop unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled @@ -26,6 +28,7 @@ wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction fieldAddressOnNonPointer +| ir.cpp:2928:23:2928:23 | FieldAddress: x | FieldAddress instruction 'FieldAddress: x' has an object address operand that is not an address, in function '$@'. | ir.cpp:2927:6:2927:9 | void test() | void test() | thisArgumentIsNonPointer | ir.cpp:2548:34:2548:34 | Call: call to operator bool | Call instruction 'Call: call to operator bool' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:2547:6:2547:23 | void this_inconsistency(bool) | void this_inconsistency(bool) | nonUniqueIRVariable diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index 1d2d4d5a79e3..7bab60fbb21e 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -2918,4 +2918,14 @@ T VariableTemplateFunc(T x) { int VariableTemplateFuncUse = VariableTemplateFunc(2.3); +struct PointerWrapper { + Point point; +}; + +PointerWrapper get_wrapper(); + +void test() { + get_wrapper().point.x; +} + // semmle-extractor-options: -std=c++20 --clang diff --git a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected index f1b75895c3e7..e0ee2aa29cea 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -1,4 +1,5 @@ missingOperand +| ir.cpp:2928:23:2928:23 | FieldAddress: x | Instruction 'FieldAddress' is missing an expected operand with tag 'Unary' in function '$@'. | ir.cpp:2927:6:2927:9 | void test() | void test() | unexpectedOperand duplicateOperand missingPhiOperand @@ -7,6 +8,7 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors +| ir.cpp:2928:17:2928:21 | FieldAddress: point | Instruction 'FieldAddress: point' has 2 successors of kind 'Goto' in function '$@'. | ir.cpp:2927:6:2927:9 | void test() | void test() | unexplainedLoop unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled @@ -26,6 +28,7 @@ wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction fieldAddressOnNonPointer +| ir.cpp:2928:23:2928:23 | FieldAddress: x | FieldAddress instruction 'FieldAddress: x' has an object address operand that is not an address, in function '$@'. | ir.cpp:2927:6:2927:9 | void test() | void test() | thisArgumentIsNonPointer | ir.cpp:2548:34:2548:34 | Call: call to operator bool | Call instruction 'Call: call to operator bool' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:2547:6:2547:23 | void this_inconsistency(bool) | void this_inconsistency(bool) | nonUniqueIRVariable diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index 05ab6c50d703..4554acd51f84 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -19777,6 +19777,37 @@ ir.cpp: # 2919| v2919_11(void) = AliasedUse : ~m? # 2919| v2919_12(void) = ExitFunction : +# 2927| void test() +# 2927| Block 0 +# 2927| v2927_1(void) = EnterFunction : +# 2927| mu2927_2(unknown) = AliasedDefinition : +# 2927| mu2927_3(unknown) = InitializeNonLocal : +# 2928| r2928_1(glval) = FunctionAddress[get_wrapper] : +# 2928| r2928_2(PointerWrapper) = Call[get_wrapper] : func:r2928_1 +# 2928| mu2928_3(unknown) = ^CallSideEffect : ~m? +# 2928| r2928_4(glval) = VariableAddress[#temp2928:3] : +# 2928| mu2928_5(PointerWrapper) = Store[#temp2928:3] : &:r2928_4, r2928_2 +# 2928| r2928_6(glval) = FieldAddress[point] : r2928_4 +#-----| Goto -> Block 3 +#-----| Goto -> Block 2 + +# 2928| Block 1 +# 2928| r2928_7(glval) = FieldAddress[x] : +# 2928| r2928_8(int) = Load[?] : &:r2928_7, ~m? +# 2929| v2929_1(void) = NoOp : +# 2927| v2927_4(void) = ReturnVoid : +# 2927| v2927_5(void) = AliasedUse : ~m? +# 2927| v2927_6(void) = ExitFunction : + +# 2928| Block 2 +# 2928| r2928_9(glval) = VariableAddress[#temp2928:17] : +# 2928| mu2928_10(Point) = Store[#temp2928:17] : &:r2928_9, r2928_6 +#-----| Goto -> Block 1 + +# 2928| Block 3 +# 2928| r2928_11(Point) = Load[?] : &:r2928_6, ~m? +#-----| Goto -> Block 1 + ir23.cpp: # 1| bool consteval_1() # 1| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected index f1b75895c3e7..e0ee2aa29cea 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected @@ -1,4 +1,5 @@ missingOperand +| ir.cpp:2928:23:2928:23 | FieldAddress: x | Instruction 'FieldAddress' is missing an expected operand with tag 'Unary' in function '$@'. | ir.cpp:2927:6:2927:9 | void test() | void test() | unexpectedOperand duplicateOperand missingPhiOperand @@ -7,6 +8,7 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors +| ir.cpp:2928:17:2928:21 | FieldAddress: point | Instruction 'FieldAddress: point' has 2 successors of kind 'Goto' in function '$@'. | ir.cpp:2927:6:2927:9 | void test() | void test() | unexplainedLoop unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled @@ -26,6 +28,7 @@ wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction fieldAddressOnNonPointer +| ir.cpp:2928:23:2928:23 | FieldAddress: x | FieldAddress instruction 'FieldAddress: x' has an object address operand that is not an address, in function '$@'. | ir.cpp:2927:6:2927:9 | void test() | void test() | thisArgumentIsNonPointer | ir.cpp:2548:34:2548:34 | Call: call to operator bool | Call instruction 'Call: call to operator bool' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:2547:6:2547:23 | void this_inconsistency(bool) | void this_inconsistency(bool) | nonUniqueIRVariable diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected index f1b75895c3e7..e0ee2aa29cea 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected @@ -1,4 +1,5 @@ missingOperand +| ir.cpp:2928:23:2928:23 | FieldAddress: x | Instruction 'FieldAddress' is missing an expected operand with tag 'Unary' in function '$@'. | ir.cpp:2927:6:2927:9 | void test() | void test() | unexpectedOperand duplicateOperand missingPhiOperand @@ -7,6 +8,7 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors +| ir.cpp:2928:17:2928:21 | FieldAddress: point | Instruction 'FieldAddress: point' has 2 successors of kind 'Goto' in function '$@'. | ir.cpp:2927:6:2927:9 | void test() | void test() | unexplainedLoop unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled @@ -26,6 +28,7 @@ wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction fieldAddressOnNonPointer +| ir.cpp:2928:23:2928:23 | FieldAddress: x | FieldAddress instruction 'FieldAddress: x' has an object address operand that is not an address, in function '$@'. | ir.cpp:2927:6:2927:9 | void test() | void test() | thisArgumentIsNonPointer | ir.cpp:2548:34:2548:34 | Call: call to operator bool | Call instruction 'Call: call to operator bool' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:2547:6:2547:23 | void this_inconsistency(bool) | void this_inconsistency(bool) | nonUniqueIRVariable From 19a9095e22f84a6c7394a0f521db3dc7c6076c6c Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 15 Sep 2026 20:48:53 +0100 Subject: [PATCH 1019/2098] C++: Handle 'isPRValueFieldAccessWithImplicitLoad' in more places. --- .../raw/internal/TranslatedElement.qll | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll index 58456476f6a2..7e9f7760b5a8 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll @@ -430,14 +430,18 @@ private predicate mustTransformToGLValue(Expr expr) { } /** - * Holds if `expr` has an lvalue-to-rvalue conversion that should be ignored - * when generating IR. This occurs for conversion from an lvalue of function type - * to an rvalue of function pointer type. The conversion is represented in the - * AST as an lvalue-to-rvalue conversion, but the IR represents both a function + * Holds if `expr` has an explicit or implicit load that should be ignored + * when generating IR. For example, this occurs for conversion from an lvalue of + * function type to an rvalue of function pointer type. The conversion is represented + * in the AST as an lvalue-to-rvalue conversion, but the IR represents both a function * lvalue and a function pointer prvalue the same. */ predicate ignoreLoad(Expr expr) { - expr.hasLValueToRValueConversion() and + ( + expr.hasLValueToRValueConversion() + or + isPRValueFieldAccessWithImplicitLoad(expr) + ) and ( expr instanceof ThisExpr or @@ -517,8 +521,11 @@ predicate hasTranslatedLoad(Expr expr) { predicate hasTranslatedSyntheticTemporaryObject(Expr expr) { not ignoreExpr(expr) and mustTransformToGLValue(expr) and - // If it's a load, we'll just ignore the load in `ignoreLoad()`. - not expr.hasLValueToRValueConversion() + // If it's an explicit or implicit field load, reuse the existing address by + // ignoring the load in `ignoreLoad` instead of materializing another + // temporary. + not expr.hasLValueToRValueConversion() and + not isPRValueFieldAccessWithImplicitLoad(expr) } Opcode comparisonOpcode(ComparisonOperation expr) { From fd9c8ca1716801a2e9251f31e1eaadc031036083 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 15 Sep 2026 20:09:28 +0100 Subject: [PATCH 1020/2098] C++: Accept test changes. --- .../library-tests/ir/ir/aliased_ir.expected | 25 +++++-------------- .../ir/ir/aliased_ssa_consistency.expected | 3 --- .../aliased_ssa_consistency_unsound.expected | 3 --- .../ir/ir/raw_consistency.expected | 3 --- .../test/library-tests/ir/ir/raw_ir.expected | 25 +++++-------------- .../ir/ir/unaliased_ssa_consistency.expected | 3 --- ...unaliased_ssa_consistency_unsound.expected | 3 --- 7 files changed, 12 insertions(+), 53 deletions(-) diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected index 186a1a18e60b..6efd5067acd1 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -21785,25 +21785,12 @@ ir.cpp: # 2928| r2928_5(glval) = VariableAddress[#temp2928:3] : # 2928| m2928_6(PointerWrapper) = Store[#temp2928:3] : &:r2928_5, r2928_2 # 2928| r2928_7(glval) = FieldAddress[point] : r2928_5 -#-----| Goto -> Block 3 -#-----| Goto -> Block 2 - -# 2928| Block 1 -# 2928| r2928_8(glval) = FieldAddress[x] : -# 2928| r2928_9(int) = Load[?] : &:r2928_8, ~m2928_4 -# 2929| v2929_1(void) = NoOp : -# 2927| v2927_5(void) = ReturnVoid : -# 2927| v2927_6(void) = AliasedUse : ~m2928_4 -# 2927| v2927_7(void) = ExitFunction : - -# 2928| Block 2 -# 2928| r2928_10(glval) = VariableAddress[#temp2928:17] : -# 2928| m2928_11(Point) = Store[#temp2928:17] : &:r2928_10, r2928_7 -#-----| Goto -> Block 1 - -# 2928| Block 3 -# 2928| r2928_12(Point) = Load[?] : &:r2928_7, ~m2928_6 -#-----| Goto -> Block 1 +# 2928| r2928_8(glval) = FieldAddress[x] : r2928_7 +# 2928| r2928_9(int) = Load[?] : &:r2928_8, ~m2928_6 +# 2929| v2929_1(void) = NoOp : +# 2927| v2927_5(void) = ReturnVoid : +# 2927| v2927_6(void) = AliasedUse : ~m2928_4 +# 2927| v2927_7(void) = ExitFunction : ir23.cpp: # 1| bool consteval_1() diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected index e0ee2aa29cea..f1b75895c3e7 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected @@ -1,5 +1,4 @@ missingOperand -| ir.cpp:2928:23:2928:23 | FieldAddress: x | Instruction 'FieldAddress' is missing an expected operand with tag 'Unary' in function '$@'. | ir.cpp:2927:6:2927:9 | void test() | void test() | unexpectedOperand duplicateOperand missingPhiOperand @@ -8,7 +7,6 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors -| ir.cpp:2928:17:2928:21 | FieldAddress: point | Instruction 'FieldAddress: point' has 2 successors of kind 'Goto' in function '$@'. | ir.cpp:2927:6:2927:9 | void test() | void test() | unexplainedLoop unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled @@ -28,7 +26,6 @@ wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction fieldAddressOnNonPointer -| ir.cpp:2928:23:2928:23 | FieldAddress: x | FieldAddress instruction 'FieldAddress: x' has an object address operand that is not an address, in function '$@'. | ir.cpp:2927:6:2927:9 | void test() | void test() | thisArgumentIsNonPointer | ir.cpp:2548:34:2548:34 | Call: call to operator bool | Call instruction 'Call: call to operator bool' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:2547:6:2547:23 | void this_inconsistency(bool) | void this_inconsistency(bool) | nonUniqueIRVariable diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected index e0ee2aa29cea..f1b75895c3e7 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected @@ -1,5 +1,4 @@ missingOperand -| ir.cpp:2928:23:2928:23 | FieldAddress: x | Instruction 'FieldAddress' is missing an expected operand with tag 'Unary' in function '$@'. | ir.cpp:2927:6:2927:9 | void test() | void test() | unexpectedOperand duplicateOperand missingPhiOperand @@ -8,7 +7,6 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors -| ir.cpp:2928:17:2928:21 | FieldAddress: point | Instruction 'FieldAddress: point' has 2 successors of kind 'Goto' in function '$@'. | ir.cpp:2927:6:2927:9 | void test() | void test() | unexplainedLoop unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled @@ -28,7 +26,6 @@ wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction fieldAddressOnNonPointer -| ir.cpp:2928:23:2928:23 | FieldAddress: x | FieldAddress instruction 'FieldAddress: x' has an object address operand that is not an address, in function '$@'. | ir.cpp:2927:6:2927:9 | void test() | void test() | thisArgumentIsNonPointer | ir.cpp:2548:34:2548:34 | Call: call to operator bool | Call instruction 'Call: call to operator bool' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:2547:6:2547:23 | void this_inconsistency(bool) | void this_inconsistency(bool) | nonUniqueIRVariable diff --git a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected index e0ee2aa29cea..f1b75895c3e7 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -1,5 +1,4 @@ missingOperand -| ir.cpp:2928:23:2928:23 | FieldAddress: x | Instruction 'FieldAddress' is missing an expected operand with tag 'Unary' in function '$@'. | ir.cpp:2927:6:2927:9 | void test() | void test() | unexpectedOperand duplicateOperand missingPhiOperand @@ -8,7 +7,6 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors -| ir.cpp:2928:17:2928:21 | FieldAddress: point | Instruction 'FieldAddress: point' has 2 successors of kind 'Goto' in function '$@'. | ir.cpp:2927:6:2927:9 | void test() | void test() | unexplainedLoop unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled @@ -28,7 +26,6 @@ wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction fieldAddressOnNonPointer -| ir.cpp:2928:23:2928:23 | FieldAddress: x | FieldAddress instruction 'FieldAddress: x' has an object address operand that is not an address, in function '$@'. | ir.cpp:2927:6:2927:9 | void test() | void test() | thisArgumentIsNonPointer | ir.cpp:2548:34:2548:34 | Call: call to operator bool | Call instruction 'Call: call to operator bool' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:2547:6:2547:23 | void this_inconsistency(bool) | void this_inconsistency(bool) | nonUniqueIRVariable diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index 4554acd51f84..be7d41ad09a4 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -19788,25 +19788,12 @@ ir.cpp: # 2928| r2928_4(glval) = VariableAddress[#temp2928:3] : # 2928| mu2928_5(PointerWrapper) = Store[#temp2928:3] : &:r2928_4, r2928_2 # 2928| r2928_6(glval) = FieldAddress[point] : r2928_4 -#-----| Goto -> Block 3 -#-----| Goto -> Block 2 - -# 2928| Block 1 -# 2928| r2928_7(glval) = FieldAddress[x] : -# 2928| r2928_8(int) = Load[?] : &:r2928_7, ~m? -# 2929| v2929_1(void) = NoOp : -# 2927| v2927_4(void) = ReturnVoid : -# 2927| v2927_5(void) = AliasedUse : ~m? -# 2927| v2927_6(void) = ExitFunction : - -# 2928| Block 2 -# 2928| r2928_9(glval) = VariableAddress[#temp2928:17] : -# 2928| mu2928_10(Point) = Store[#temp2928:17] : &:r2928_9, r2928_6 -#-----| Goto -> Block 1 - -# 2928| Block 3 -# 2928| r2928_11(Point) = Load[?] : &:r2928_6, ~m? -#-----| Goto -> Block 1 +# 2928| r2928_7(glval) = FieldAddress[x] : r2928_6 +# 2928| r2928_8(int) = Load[?] : &:r2928_7, ~m? +# 2929| v2929_1(void) = NoOp : +# 2927| v2927_4(void) = ReturnVoid : +# 2927| v2927_5(void) = AliasedUse : ~m? +# 2927| v2927_6(void) = ExitFunction : ir23.cpp: # 1| bool consteval_1() diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected index e0ee2aa29cea..f1b75895c3e7 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected @@ -1,5 +1,4 @@ missingOperand -| ir.cpp:2928:23:2928:23 | FieldAddress: x | Instruction 'FieldAddress' is missing an expected operand with tag 'Unary' in function '$@'. | ir.cpp:2927:6:2927:9 | void test() | void test() | unexpectedOperand duplicateOperand missingPhiOperand @@ -8,7 +7,6 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors -| ir.cpp:2928:17:2928:21 | FieldAddress: point | Instruction 'FieldAddress: point' has 2 successors of kind 'Goto' in function '$@'. | ir.cpp:2927:6:2927:9 | void test() | void test() | unexplainedLoop unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled @@ -28,7 +26,6 @@ wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction fieldAddressOnNonPointer -| ir.cpp:2928:23:2928:23 | FieldAddress: x | FieldAddress instruction 'FieldAddress: x' has an object address operand that is not an address, in function '$@'. | ir.cpp:2927:6:2927:9 | void test() | void test() | thisArgumentIsNonPointer | ir.cpp:2548:34:2548:34 | Call: call to operator bool | Call instruction 'Call: call to operator bool' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:2547:6:2547:23 | void this_inconsistency(bool) | void this_inconsistency(bool) | nonUniqueIRVariable diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected index e0ee2aa29cea..f1b75895c3e7 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected @@ -1,5 +1,4 @@ missingOperand -| ir.cpp:2928:23:2928:23 | FieldAddress: x | Instruction 'FieldAddress' is missing an expected operand with tag 'Unary' in function '$@'. | ir.cpp:2927:6:2927:9 | void test() | void test() | unexpectedOperand duplicateOperand missingPhiOperand @@ -8,7 +7,6 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors -| ir.cpp:2928:17:2928:21 | FieldAddress: point | Instruction 'FieldAddress: point' has 2 successors of kind 'Goto' in function '$@'. | ir.cpp:2927:6:2927:9 | void test() | void test() | unexplainedLoop unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled @@ -28,7 +26,6 @@ wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction fieldAddressOnNonPointer -| ir.cpp:2928:23:2928:23 | FieldAddress: x | FieldAddress instruction 'FieldAddress: x' has an object address operand that is not an address, in function '$@'. | ir.cpp:2927:6:2927:9 | void test() | void test() | thisArgumentIsNonPointer | ir.cpp:2548:34:2548:34 | Call: call to operator bool | Call instruction 'Call: call to operator bool' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:2547:6:2547:23 | void this_inconsistency(bool) | void this_inconsistency(bool) | nonUniqueIRVariable From 17033d8c5b320ed554caef36d183a84b5ff6a800 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 4 Sep 2026 10:06:29 +0100 Subject: [PATCH 1021/2098] Accept `invalidAbruptCompletionOrigin` results This is a new CFG consistency query. --- .../CONSISTENCY/CfgConsistency.expected | 7 ++++++ .../CONSISTENCY/CfgConsistency.expected | 5 ++++ .../CONSISTENCY/CfgConsistency.expected | 4 +++ .../CONSISTENCY/CfgConsistency.expected | 9 +++++++ .../CONSISTENCY/CfgConsistency.expected | 4 +++ .../CONSISTENCY/CfgConsistency.expected | 25 +++++++++++++++++++ .../CONSISTENCY/CfgConsistency.expected | 4 +++ .../CONSISTENCY/CfgConsistency.expected | 4 +++ .../CONSISTENCY/CfgConsistency.expected | 12 +++++++++ .../CONSISTENCY/CfgConsistency.expected | 4 +++ .../file/CONSISTENCY/CfgConsistency.expected | 6 +++++ .../Twirp/CONSISTENCY/CfgConsistency.expected | 9 +++++++ .../CONSISTENCY/CfgConsistency.expected | 10 ++++++++ .../CONSISTENCY/CfgConsistency.expected | 4 +++ .../CONSISTENCY/CfgConsistency.expected | 7 ++++++ .../CONSISTENCY/CfgConsistency.expected | 4 +++ .../CONSISTENCY/CfgConsistency.expected | 4 +++ 17 files changed, 122 insertions(+) create mode 100644 go/ql/test/experimental/CWE-287/CONSISTENCY/CfgConsistency.expected create mode 100644 go/ql/test/experimental/CWE-522-DecompressionBombs/CONSISTENCY/CfgConsistency.expected create mode 100644 go/ql/test/experimental/CWE-525/CONSISTENCY/CfgConsistency.expected create mode 100644 go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/CONSISTENCY/CfgConsistency.expected create mode 100644 go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/CONSISTENCY/CfgConsistency.expected create mode 100644 go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/environment/CONSISTENCY/CfgConsistency.expected create mode 100644 go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/file/CONSISTENCY/CfgConsistency.expected create mode 100644 go/ql/test/library-tests/semmle/go/frameworks/Twirp/CONSISTENCY/CfgConsistency.expected create mode 100644 go/ql/test/query-tests/RedundantCode/DeadStoreOfField/CONSISTENCY/CfgConsistency.expected create mode 100644 go/ql/test/query-tests/RedundantCode/RedundantRecover/CONSISTENCY/CfgConsistency.expected create mode 100644 go/ql/test/query-tests/Security/CWE-022/CONSISTENCY/CfgConsistency.expected create mode 100644 go/ql/test/query-tests/Security/CWE-078/CONSISTENCY/CfgConsistency.expected diff --git a/go/ql/test/experimental/CWE-287/CONSISTENCY/CfgConsistency.expected b/go/ql/test/experimental/CWE-287/CONSISTENCY/CfgConsistency.expected new file mode 100644 index 000000000000..1cbdeef22b93 --- /dev/null +++ b/go/ql/test/experimental/CWE-287/CONSISTENCY/CfgConsistency.expected @@ -0,0 +1,7 @@ +consistencyOverview +| invalidAbruptCompletionOrigin | 4 | +invalidAbruptCompletionOrigin +| ImproperLdapAuth.go:25:2:25:16 | defer statement | ImproperLdapAuth.go:25:8:25:16 | defer-invoke call to Close | +| ImproperLdapAuth.go:46:2:46:16 | defer statement | ImproperLdapAuth.go:46:8:46:16 | defer-invoke call to Close | +| ImproperLdapAuth.go:71:2:71:16 | defer statement | ImproperLdapAuth.go:71:8:71:16 | defer-invoke call to Close | +| ImproperLdapAuth.go:94:2:94:16 | defer statement | ImproperLdapAuth.go:94:8:94:16 | defer-invoke call to Close | diff --git a/go/ql/test/experimental/CWE-522-DecompressionBombs/CONSISTENCY/CfgConsistency.expected b/go/ql/test/experimental/CWE-522-DecompressionBombs/CONSISTENCY/CfgConsistency.expected new file mode 100644 index 000000000000..8fec0cabc252 --- /dev/null +++ b/go/ql/test/experimental/CWE-522-DecompressionBombs/CONSISTENCY/CfgConsistency.expected @@ -0,0 +1,5 @@ +consistencyOverview +| invalidAbruptCompletionOrigin | 2 | +invalidAbruptCompletionOrigin +| test.go:102:2:102:19 | defer statement | test.go:102:8:102:19 | defer-invoke call to Close | +| test.go:443:2:443:19 | defer statement | test.go:443:8:443:19 | defer-invoke call to Close | diff --git a/go/ql/test/experimental/CWE-525/CONSISTENCY/CfgConsistency.expected b/go/ql/test/experimental/CWE-525/CONSISTENCY/CfgConsistency.expected new file mode 100644 index 000000000000..92902348aaa7 --- /dev/null +++ b/go/ql/test/experimental/CWE-525/CONSISTENCY/CfgConsistency.expected @@ -0,0 +1,4 @@ +consistencyOverview +| invalidAbruptCompletionOrigin | 1 | +invalidAbruptCompletionOrigin +| WebCacheDeceptionBad.go:29:2:29:21 | defer statement | WebCacheDeceptionBad.go:29:8:29:21 | defer-invoke call to Unlock | diff --git a/go/ql/test/experimental/InconsistentCode/CONSISTENCY/CfgConsistency.expected b/go/ql/test/experimental/InconsistentCode/CONSISTENCY/CfgConsistency.expected index 3c00017bbfca..23271cb32e4c 100644 --- a/go/ql/test/experimental/InconsistentCode/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/experimental/InconsistentCode/CONSISTENCY/CfgConsistency.expected @@ -1,6 +1,15 @@ consistencyOverview +| invalidAbruptCompletionOrigin | 7 | | multipleSuccessors | 8 | | selfLoop | 1 | +invalidAbruptCompletionOrigin +| DeferInLoop.go:8:3:8:20 | defer statement | DeferInLoop.go:8:9:8:20 | defer-invoke call to Close | +| DeferInLoopGood.go:7:2:7:19 | defer statement | DeferInLoopGood.go:7:8:7:19 | defer-invoke call to Close | +| test.go:6:3:6:14 | defer statement | test.go:6:9:6:14 | defer-invoke call to test | +| test.go:11:4:11:15 | defer statement | test.go:11:10:11:15 | defer-invoke call to test | +| test.go:16:3:16:14 | defer statement | test.go:16:9:16:14 | defer-invoke call to test | +| test.go:20:3:20:14 | defer statement | test.go:20:9:20:14 | defer-invoke call to test | +| test.go:24:3:24:14 | defer statement | test.go:24:9:24:14 | defer-invoke call to test | multipleSuccessors | DeferInLoop.go:6:2:13:2 | After range statement | successor | DeferInLoop.go:5:36:14:1 | After block statement | | DeferInLoop.go:6:2:13:2 | After range statement | successor | DeferInLoop.go:8:9:8:20 | defer-invoke call to Close | diff --git a/go/ql/test/library-tests/semmle/go/PrintAst/CONSISTENCY/CfgConsistency.expected b/go/ql/test/library-tests/semmle/go/PrintAst/CONSISTENCY/CfgConsistency.expected index bedab226be6e..3a1c1263b9ca 100644 --- a/go/ql/test/library-tests/semmle/go/PrintAst/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/PrintAst/CONSISTENCY/CfgConsistency.expected @@ -1,8 +1,12 @@ consistencyOverview | deadEnd | 1 | +| invalidAbruptCompletionOrigin | 2 | | multipleSuccessors | 6 | deadEnd | input.go:61:2:61:10 | select statement | +invalidAbruptCompletionOrigin +| input.go:67:3:67:35 | defer statement | input.go:67:9:67:35 | defer-invoke function call | +| input.go:69:3:69:36 | defer statement | input.go:69:9:69:36 | defer-invoke function call | multipleSuccessors | input.go:50:2:59:2 | select statement | successor | input.go:51:2:52:31 | comm clause | | input.go:50:2:59:2 | select statement | successor | input.go:53:2:55:16 | comm clause | diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CONSISTENCY/CfgConsistency.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CONSISTENCY/CfgConsistency.expected index d856f64ab253..cdc8856d1bef 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CONSISTENCY/CfgConsistency.expected @@ -1,9 +1,34 @@ consistencyOverview | deadEnd | 1 | +| invalidAbruptCompletionOrigin | 23 | | multipleSuccessors | 24 | | selfLoop | 1 | deadEnd | stmts.go:61:2:61:10 | select statement | +invalidAbruptCompletionOrigin +| epilogues.go:60:2:60:33 | defer statement | epilogues.go:60:8:60:33 | defer-invoke call to log | +| epilogues.go:68:2:68:24 | defer statement | epilogues.go:68:8:68:24 | defer-invoke call to logValue | +| epilogues.go:69:2:69:25 | defer statement | epilogues.go:69:8:69:25 | defer-invoke call to log | +| epilogues.go:78:2:80:15 | defer statement | epilogues.go:78:8:80:15 | defer-invoke function call | +| epilogues.go:88:2:92:4 | defer statement | epilogues.go:88:8:92:4 | defer-invoke function call | +| epilogues.go:103:2:103:19 | defer statement | epilogues.go:103:8:103:19 | defer-invoke call to epiRecover | +| epilogues.go:116:2:116:19 | defer statement | epilogues.go:116:8:116:19 | defer-invoke call to epiRecover | +| stmts7.go:14:2:14:21 | defer statement | stmts7.go:14:8:14:21 | defer-invoke call to recoverPanic | +| stmts7.go:27:2:27:20 | defer statement | stmts7.go:27:8:27:20 | defer-invoke call to fn | +| stmts7.go:28:2:28:23 | defer statement | stmts7.go:28:8:28:23 | defer-invoke call to fn | +| stmts7.go:34:2:34:21 | defer statement | stmts7.go:34:8:34:21 | defer-invoke call to recoverPanic | +| stmts7.go:39:2:39:21 | defer statement | stmts7.go:39:8:39:21 | defer-invoke call to recoverPanic | +| stmts7.go:40:2:40:30 | defer statement | stmts7.go:40:8:40:30 | defer-invoke call to panic | +| stmts7.go:44:2:44:36 | defer statement | stmts7.go:44:8:44:36 | defer-invoke call to panic | +| stmts7.go:48:2:48:21 | defer statement | stmts7.go:48:8:48:21 | defer-invoke call to recoverPanic | +| stmts7.go:49:2:49:17 | defer statement | stmts7.go:49:8:49:17 | defer-invoke call to Exit | +| stmts7.go:53:2:53:21 | defer statement | stmts7.go:53:8:53:21 | defer-invoke call to recoverPanic | +| stmts7.go:59:3:59:22 | defer statement | stmts7.go:59:9:59:22 | defer-invoke call to recoverPanic | +| stmts7.go:66:3:66:22 | defer statement | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | +| stmts7.go:74:2:74:21 | defer statement | stmts7.go:74:8:74:21 | defer-invoke call to recoverPanic | +| stmts7.go:83:2:83:21 | defer statement | stmts7.go:83:8:83:21 | defer-invoke call to recoverPanic | +| stmts.go:67:3:67:35 | defer statement | stmts.go:67:9:67:35 | defer-invoke function call | +| stmts.go:69:3:69:36 | defer statement | stmts.go:69:9:69:36 | defer-invoke function call | multipleSuccessors | stmts2.go:16:2:26:2 | select statement | successor | stmts2.go:17:2:17:15 | comm clause | | stmts2.go:16:2:26:2 | select statement | successor | stmts2.go:18:2:19:10 | comm clause | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/CONSISTENCY/CfgConsistency.expected b/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/CONSISTENCY/CfgConsistency.expected new file mode 100644 index 000000000000..fdb5d8f015f0 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/CONSISTENCY/CfgConsistency.expected @@ -0,0 +1,4 @@ +consistencyOverview +| invalidAbruptCompletionOrigin | 1 | +invalidAbruptCompletionOrigin +| main.go:41:2:43:4 | defer statement | main.go:41:8:43:4 | defer-invoke function call | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/CONSISTENCY/CfgConsistency.expected b/go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/CONSISTENCY/CfgConsistency.expected new file mode 100644 index 000000000000..670cd484fae6 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/CONSISTENCY/CfgConsistency.expected @@ -0,0 +1,4 @@ +consistencyOverview +| invalidAbruptCompletionOrigin | 1 | +invalidAbruptCompletionOrigin +| main.go:35:2:37:4 | defer statement | main.go:35:8:37:4 | defer-invoke function call | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/CONSISTENCY/CfgConsistency.expected b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/CONSISTENCY/CfgConsistency.expected index e69de29bb2d1..cc2190142a96 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/CONSISTENCY/CfgConsistency.expected @@ -0,0 +1,12 @@ +consistencyOverview +| invalidAbruptCompletionOrigin | 9 | +invalidAbruptCompletionOrigin +| test_database_sql.go:15:2:15:19 | defer statement | test_database_sql.go:15:8:15:19 | defer-invoke call to Close | +| test_database_sql.go:49:2:49:19 | defer statement | test_database_sql.go:49:8:49:19 | defer-invoke call to Close | +| test_database_sql.go:87:2:87:19 | defer statement | test_database_sql.go:87:8:87:19 | defer-invoke call to Close | +| test_database_sql.go:128:2:128:19 | defer statement | test_database_sql.go:128:8:128:19 | defer-invoke call to Close | +| test_gorm.go:20:2:20:19 | defer statement | test_gorm.go:20:8:20:19 | defer-invoke call to Close | +| test_jmoiron_sqlx.go:89:2:89:19 | defer statement | test_jmoiron_sqlx.go:89:8:89:19 | defer-invoke call to Close | +| test_jmoiron_sqlx.go:151:2:151:19 | defer statement | test_jmoiron_sqlx.go:151:8:151:19 | defer-invoke call to Close | +| test_jmoiron_sqlx.go:207:2:207:19 | defer statement | test_jmoiron_sqlx.go:207:8:207:19 | defer-invoke call to Close | +| test_jmoiron_sqlx.go:263:2:263:19 | defer statement | test_jmoiron_sqlx.go:263:8:263:19 | defer-invoke call to Close | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/environment/CONSISTENCY/CfgConsistency.expected b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/environment/CONSISTENCY/CfgConsistency.expected new file mode 100644 index 000000000000..9b04020a3fcc --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/environment/CONSISTENCY/CfgConsistency.expected @@ -0,0 +1,4 @@ +consistencyOverview +| invalidAbruptCompletionOrigin | 1 | +invalidAbruptCompletionOrigin +| test.go:66:2:66:16 | defer statement | test.go:66:8:66:16 | defer-invoke call to Close | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/file/CONSISTENCY/CfgConsistency.expected b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/file/CONSISTENCY/CfgConsistency.expected new file mode 100644 index 000000000000..5f16b3053576 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/file/CONSISTENCY/CfgConsistency.expected @@ -0,0 +1,6 @@ +consistencyOverview +| invalidAbruptCompletionOrigin | 3 | +invalidAbruptCompletionOrigin +| test.go:14:2:14:19 | defer statement | test.go:14:8:14:19 | defer-invoke call to Close | +| test.go:23:2:23:19 | defer statement | test.go:23:8:23:19 | defer-invoke call to Close | +| test.go:68:2:68:19 | defer statement | test.go:68:8:68:19 | defer-invoke call to Close | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Twirp/CONSISTENCY/CfgConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/Twirp/CONSISTENCY/CfgConsistency.expected new file mode 100644 index 000000000000..860ce6a378b7 --- /dev/null +++ b/go/ql/test/library-tests/semmle/go/frameworks/Twirp/CONSISTENCY/CfgConsistency.expected @@ -0,0 +1,9 @@ +consistencyOverview +| invalidAbruptCompletionOrigin | 6 | +invalidAbruptCompletionOrigin +| rpc/notes/service.twirp.go:494:3:494:48 | defer statement | rpc/notes/service.twirp.go:494:9:494:48 | defer-invoke call to ensurePanicResponses | +| rpc/notes/service.twirp.go:575:3:575:48 | defer statement | rpc/notes/service.twirp.go:575:9:575:48 | defer-invoke call to ensurePanicResponses | +| rpc/notes/service.twirp.go:674:3:674:48 | defer statement | rpc/notes/service.twirp.go:674:9:674:48 | defer-invoke call to ensurePanicResponses | +| rpc/notes/service.twirp.go:755:3:755:48 | defer statement | rpc/notes/service.twirp.go:755:9:755:48 | defer-invoke call to ensurePanicResponses | +| rpc/notes/service.twirp.go:1227:2:1227:41 | defer statement | rpc/notes/service.twirp.go:1227:8:1227:41 | defer-invoke function call | +| rpc/notes/service.twirp.go:1277:2:1282:4 | defer statement | rpc/notes/service.twirp.go:1277:8:1282:4 | defer-invoke function call | diff --git a/go/ql/test/query-tests/InconsistentCode/UnhandledCloseWritableHandle/CONSISTENCY/CfgConsistency.expected b/go/ql/test/query-tests/InconsistentCode/UnhandledCloseWritableHandle/CONSISTENCY/CfgConsistency.expected index 2ce97565d12d..1746e690e278 100644 --- a/go/ql/test/query-tests/InconsistentCode/UnhandledCloseWritableHandle/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/query-tests/InconsistentCode/UnhandledCloseWritableHandle/CONSISTENCY/CfgConsistency.expected @@ -1,5 +1,15 @@ consistencyOverview +| invalidAbruptCompletionOrigin | 8 | | multipleSuccessors | 6 | +invalidAbruptCompletionOrigin +| tests.go:10:2:10:16 | defer statement | tests.go:10:8:10:16 | defer-invoke call to Close | +| tests.go:18:2:18:13 | defer statement | tests.go:18:8:18:13 | defer-invoke call to cont | +| tests.go:27:2:27:13 | defer statement | tests.go:27:8:27:13 | defer-invoke call to cont | +| tests.go:99:3:99:17 | defer statement | tests.go:99:9:99:17 | defer-invoke call to Close | +| tests.go:112:3:112:17 | defer statement | tests.go:112:9:112:17 | defer-invoke call to Close | +| tests.go:126:3:126:17 | defer statement | tests.go:126:9:126:17 | defer-invoke call to Close | +| tests.go:157:2:157:16 | defer statement | tests.go:157:8:157:16 | defer-invoke call to Close | +| tests.go:166:2:166:16 | defer statement | tests.go:166:8:166:16 | defer-invoke call to Close | multipleSuccessors | tests.go:96:2:104:2 | After if statement | successor | tests.go:94:30:105:1 | After block statement | | tests.go:96:2:104:2 | After if statement | successor | tests.go:99:9:99:17 | defer-invoke call to Close | diff --git a/go/ql/test/query-tests/RedundantCode/DeadStoreOfField/CONSISTENCY/CfgConsistency.expected b/go/ql/test/query-tests/RedundantCode/DeadStoreOfField/CONSISTENCY/CfgConsistency.expected new file mode 100644 index 000000000000..b0cb7b1de158 --- /dev/null +++ b/go/ql/test/query-tests/RedundantCode/DeadStoreOfField/CONSISTENCY/CfgConsistency.expected @@ -0,0 +1,4 @@ +consistencyOverview +| invalidAbruptCompletionOrigin | 1 | +invalidAbruptCompletionOrigin +| main.go:40:2:42:5 | defer statement | main.go:40:8:42:5 | defer-invoke function call | diff --git a/go/ql/test/query-tests/RedundantCode/RedundantRecover/CONSISTENCY/CfgConsistency.expected b/go/ql/test/query-tests/RedundantCode/RedundantRecover/CONSISTENCY/CfgConsistency.expected new file mode 100644 index 000000000000..e243f6b98c8d --- /dev/null +++ b/go/ql/test/query-tests/RedundantCode/RedundantRecover/CONSISTENCY/CfgConsistency.expected @@ -0,0 +1,7 @@ +consistencyOverview +| invalidAbruptCompletionOrigin | 4 | +invalidAbruptCompletionOrigin +| RedundantRecover1.go:12:2:14:4 | defer statement | RedundantRecover1.go:12:8:14:4 | defer-invoke function call | +| RedundantRecover1Good.go:12:2:12:25 | defer statement | RedundantRecover1Good.go:12:8:12:25 | defer-invoke call to callRecover1Good | +| RedundantRecover2Good.go:4:2:4:29 | defer statement | RedundantRecover2Good.go:4:8:4:29 | defer-invoke function call | +| tst.go:32:2:32:21 | defer statement | tst.go:32:8:32:21 | defer-invoke call to callRecover4 | diff --git a/go/ql/test/query-tests/Security/CWE-022/CONSISTENCY/CfgConsistency.expected b/go/ql/test/query-tests/Security/CWE-022/CONSISTENCY/CfgConsistency.expected new file mode 100644 index 000000000000..274437dd193a --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-022/CONSISTENCY/CfgConsistency.expected @@ -0,0 +1,4 @@ +consistencyOverview +| invalidAbruptCompletionOrigin | 1 | +invalidAbruptCompletionOrigin +| tst.go:16:2:16:19 | defer statement | tst.go:16:8:16:19 | defer-invoke call to Close | diff --git a/go/ql/test/query-tests/Security/CWE-078/CONSISTENCY/CfgConsistency.expected b/go/ql/test/query-tests/Security/CWE-078/CONSISTENCY/CfgConsistency.expected new file mode 100644 index 000000000000..2030ab9c4f99 --- /dev/null +++ b/go/ql/test/query-tests/Security/CWE-078/CONSISTENCY/CfgConsistency.expected @@ -0,0 +1,4 @@ +consistencyOverview +| invalidAbruptCompletionOrigin | 1 | +invalidAbruptCompletionOrigin +| CommandInjection2.go:29:2:29:22 | defer statement | CommandInjection2.go:29:8:29:22 | defer-invoke call to Close | From f76a0e41c7dbe08b3dbd3fbfc03cdf83b59caa01 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 4 Sep 2026 10:18:55 +0100 Subject: [PATCH 1022/2098] Fix `invalidAbruptCompletionOrigin` results --- .../go/controlflow/ControlFlowGraphImpl.qll | 16 ++++++------ .../CONSISTENCY/CfgConsistency.expected | 7 ------ .../CONSISTENCY/CfgConsistency.expected | 5 ---- .../CONSISTENCY/CfgConsistency.expected | 4 --- .../CONSISTENCY/CfgConsistency.expected | 9 ------- .../CONSISTENCY/CfgConsistency.expected | 4 --- .../CONSISTENCY/CfgConsistency.expected | 25 ------------------- .../CONSISTENCY/CfgConsistency.expected | 4 --- .../CONSISTENCY/CfgConsistency.expected | 4 --- .../CONSISTENCY/CfgConsistency.expected | 12 --------- .../CONSISTENCY/CfgConsistency.expected | 4 --- .../file/CONSISTENCY/CfgConsistency.expected | 6 ----- .../Twirp/CONSISTENCY/CfgConsistency.expected | 9 ------- .../CONSISTENCY/CfgConsistency.expected | 10 -------- .../CONSISTENCY/CfgConsistency.expected | 4 --- .../CONSISTENCY/CfgConsistency.expected | 7 ------ .../CONSISTENCY/CfgConsistency.expected | 4 --- .../CONSISTENCY/CfgConsistency.expected | 4 --- 18 files changed, 9 insertions(+), 129 deletions(-) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll index 3fbe4ebefbdf..f5cd54c1acc8 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll @@ -690,12 +690,13 @@ module CfgImpl { c.asSimpleAbruptCompletion() instanceof ExceptionSuccessor and always = false or - ast instanceof Go::DeferStmt and + ast instanceof Go::CallExpr and + ast = any(Go::DeferStmt defer).getCall() and ( - not exists(ast.(Go::DeferStmt).getCall().getTarget()) or - ast.(Go::DeferStmt).getCall().getTarget().mayPanic() + not exists(ast.(Go::CallExpr).getTarget()) or + ast.(Go::CallExpr).getTarget().mayPanic() ) and - n.isAdditional(ast.(Go::DeferStmt).getCall(), "defer-invoke") and + n.isAdditional(ast, "defer-invoke") and c.asSimpleAbruptCompletion() instanceof ExceptionSuccessor and always = false or @@ -711,11 +712,12 @@ module CfgImpl { c.asSimpleAbruptCompletion() instanceof ExceptionSuccessor and always = true or - ast instanceof Go::DeferStmt and - exists(Go::Function target | target = ast.(Go::DeferStmt).getCall().getTarget() | + ast instanceof Go::CallExpr and + ast = any(Go::DeferStmt defer).getCall() and + exists(Go::Function target | target = ast.(Go::CallExpr).getTarget() | target.mustPanic() or target.mustNotReturnNormally() ) and - n.isAdditional(ast.(Go::DeferStmt).getCall(), "defer-invoke") and + n.isAdditional(ast, "defer-invoke") and c.asSimpleAbruptCompletion() instanceof ExceptionSuccessor and always = true or diff --git a/go/ql/test/experimental/CWE-287/CONSISTENCY/CfgConsistency.expected b/go/ql/test/experimental/CWE-287/CONSISTENCY/CfgConsistency.expected index 1cbdeef22b93..e69de29bb2d1 100644 --- a/go/ql/test/experimental/CWE-287/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/experimental/CWE-287/CONSISTENCY/CfgConsistency.expected @@ -1,7 +0,0 @@ -consistencyOverview -| invalidAbruptCompletionOrigin | 4 | -invalidAbruptCompletionOrigin -| ImproperLdapAuth.go:25:2:25:16 | defer statement | ImproperLdapAuth.go:25:8:25:16 | defer-invoke call to Close | -| ImproperLdapAuth.go:46:2:46:16 | defer statement | ImproperLdapAuth.go:46:8:46:16 | defer-invoke call to Close | -| ImproperLdapAuth.go:71:2:71:16 | defer statement | ImproperLdapAuth.go:71:8:71:16 | defer-invoke call to Close | -| ImproperLdapAuth.go:94:2:94:16 | defer statement | ImproperLdapAuth.go:94:8:94:16 | defer-invoke call to Close | diff --git a/go/ql/test/experimental/CWE-522-DecompressionBombs/CONSISTENCY/CfgConsistency.expected b/go/ql/test/experimental/CWE-522-DecompressionBombs/CONSISTENCY/CfgConsistency.expected index 8fec0cabc252..e69de29bb2d1 100644 --- a/go/ql/test/experimental/CWE-522-DecompressionBombs/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/experimental/CWE-522-DecompressionBombs/CONSISTENCY/CfgConsistency.expected @@ -1,5 +0,0 @@ -consistencyOverview -| invalidAbruptCompletionOrigin | 2 | -invalidAbruptCompletionOrigin -| test.go:102:2:102:19 | defer statement | test.go:102:8:102:19 | defer-invoke call to Close | -| test.go:443:2:443:19 | defer statement | test.go:443:8:443:19 | defer-invoke call to Close | diff --git a/go/ql/test/experimental/CWE-525/CONSISTENCY/CfgConsistency.expected b/go/ql/test/experimental/CWE-525/CONSISTENCY/CfgConsistency.expected index 92902348aaa7..e69de29bb2d1 100644 --- a/go/ql/test/experimental/CWE-525/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/experimental/CWE-525/CONSISTENCY/CfgConsistency.expected @@ -1,4 +0,0 @@ -consistencyOverview -| invalidAbruptCompletionOrigin | 1 | -invalidAbruptCompletionOrigin -| WebCacheDeceptionBad.go:29:2:29:21 | defer statement | WebCacheDeceptionBad.go:29:8:29:21 | defer-invoke call to Unlock | diff --git a/go/ql/test/experimental/InconsistentCode/CONSISTENCY/CfgConsistency.expected b/go/ql/test/experimental/InconsistentCode/CONSISTENCY/CfgConsistency.expected index 23271cb32e4c..3c00017bbfca 100644 --- a/go/ql/test/experimental/InconsistentCode/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/experimental/InconsistentCode/CONSISTENCY/CfgConsistency.expected @@ -1,15 +1,6 @@ consistencyOverview -| invalidAbruptCompletionOrigin | 7 | | multipleSuccessors | 8 | | selfLoop | 1 | -invalidAbruptCompletionOrigin -| DeferInLoop.go:8:3:8:20 | defer statement | DeferInLoop.go:8:9:8:20 | defer-invoke call to Close | -| DeferInLoopGood.go:7:2:7:19 | defer statement | DeferInLoopGood.go:7:8:7:19 | defer-invoke call to Close | -| test.go:6:3:6:14 | defer statement | test.go:6:9:6:14 | defer-invoke call to test | -| test.go:11:4:11:15 | defer statement | test.go:11:10:11:15 | defer-invoke call to test | -| test.go:16:3:16:14 | defer statement | test.go:16:9:16:14 | defer-invoke call to test | -| test.go:20:3:20:14 | defer statement | test.go:20:9:20:14 | defer-invoke call to test | -| test.go:24:3:24:14 | defer statement | test.go:24:9:24:14 | defer-invoke call to test | multipleSuccessors | DeferInLoop.go:6:2:13:2 | After range statement | successor | DeferInLoop.go:5:36:14:1 | After block statement | | DeferInLoop.go:6:2:13:2 | After range statement | successor | DeferInLoop.go:8:9:8:20 | defer-invoke call to Close | diff --git a/go/ql/test/library-tests/semmle/go/PrintAst/CONSISTENCY/CfgConsistency.expected b/go/ql/test/library-tests/semmle/go/PrintAst/CONSISTENCY/CfgConsistency.expected index 3a1c1263b9ca..bedab226be6e 100644 --- a/go/ql/test/library-tests/semmle/go/PrintAst/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/PrintAst/CONSISTENCY/CfgConsistency.expected @@ -1,12 +1,8 @@ consistencyOverview | deadEnd | 1 | -| invalidAbruptCompletionOrigin | 2 | | multipleSuccessors | 6 | deadEnd | input.go:61:2:61:10 | select statement | -invalidAbruptCompletionOrigin -| input.go:67:3:67:35 | defer statement | input.go:67:9:67:35 | defer-invoke function call | -| input.go:69:3:69:36 | defer statement | input.go:69:9:69:36 | defer-invoke function call | multipleSuccessors | input.go:50:2:59:2 | select statement | successor | input.go:51:2:52:31 | comm clause | | input.go:50:2:59:2 | select statement | successor | input.go:53:2:55:16 | comm clause | diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CONSISTENCY/CfgConsistency.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CONSISTENCY/CfgConsistency.expected index cdc8856d1bef..d856f64ab253 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/CONSISTENCY/CfgConsistency.expected @@ -1,34 +1,9 @@ consistencyOverview | deadEnd | 1 | -| invalidAbruptCompletionOrigin | 23 | | multipleSuccessors | 24 | | selfLoop | 1 | deadEnd | stmts.go:61:2:61:10 | select statement | -invalidAbruptCompletionOrigin -| epilogues.go:60:2:60:33 | defer statement | epilogues.go:60:8:60:33 | defer-invoke call to log | -| epilogues.go:68:2:68:24 | defer statement | epilogues.go:68:8:68:24 | defer-invoke call to logValue | -| epilogues.go:69:2:69:25 | defer statement | epilogues.go:69:8:69:25 | defer-invoke call to log | -| epilogues.go:78:2:80:15 | defer statement | epilogues.go:78:8:80:15 | defer-invoke function call | -| epilogues.go:88:2:92:4 | defer statement | epilogues.go:88:8:92:4 | defer-invoke function call | -| epilogues.go:103:2:103:19 | defer statement | epilogues.go:103:8:103:19 | defer-invoke call to epiRecover | -| epilogues.go:116:2:116:19 | defer statement | epilogues.go:116:8:116:19 | defer-invoke call to epiRecover | -| stmts7.go:14:2:14:21 | defer statement | stmts7.go:14:8:14:21 | defer-invoke call to recoverPanic | -| stmts7.go:27:2:27:20 | defer statement | stmts7.go:27:8:27:20 | defer-invoke call to fn | -| stmts7.go:28:2:28:23 | defer statement | stmts7.go:28:8:28:23 | defer-invoke call to fn | -| stmts7.go:34:2:34:21 | defer statement | stmts7.go:34:8:34:21 | defer-invoke call to recoverPanic | -| stmts7.go:39:2:39:21 | defer statement | stmts7.go:39:8:39:21 | defer-invoke call to recoverPanic | -| stmts7.go:40:2:40:30 | defer statement | stmts7.go:40:8:40:30 | defer-invoke call to panic | -| stmts7.go:44:2:44:36 | defer statement | stmts7.go:44:8:44:36 | defer-invoke call to panic | -| stmts7.go:48:2:48:21 | defer statement | stmts7.go:48:8:48:21 | defer-invoke call to recoverPanic | -| stmts7.go:49:2:49:17 | defer statement | stmts7.go:49:8:49:17 | defer-invoke call to Exit | -| stmts7.go:53:2:53:21 | defer statement | stmts7.go:53:8:53:21 | defer-invoke call to recoverPanic | -| stmts7.go:59:3:59:22 | defer statement | stmts7.go:59:9:59:22 | defer-invoke call to recoverPanic | -| stmts7.go:66:3:66:22 | defer statement | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | -| stmts7.go:74:2:74:21 | defer statement | stmts7.go:74:8:74:21 | defer-invoke call to recoverPanic | -| stmts7.go:83:2:83:21 | defer statement | stmts7.go:83:8:83:21 | defer-invoke call to recoverPanic | -| stmts.go:67:3:67:35 | defer statement | stmts.go:67:9:67:35 | defer-invoke function call | -| stmts.go:69:3:69:36 | defer statement | stmts.go:69:9:69:36 | defer-invoke function call | multipleSuccessors | stmts2.go:16:2:26:2 | select statement | successor | stmts2.go:17:2:17:15 | comm clause | | stmts2.go:16:2:26:2 | select statement | successor | stmts2.go:18:2:19:10 | comm clause | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/CONSISTENCY/CfgConsistency.expected b/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/CONSISTENCY/CfgConsistency.expected index fdb5d8f015f0..e69de29bb2d1 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/FunctionInputsAndOutputs/CONSISTENCY/CfgConsistency.expected @@ -1,4 +0,0 @@ -consistencyOverview -| invalidAbruptCompletionOrigin | 1 | -invalidAbruptCompletionOrigin -| main.go:41:2:43:4 | defer statement | main.go:41:8:43:4 | defer-invoke function call | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/CONSISTENCY/CfgConsistency.expected b/go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/CONSISTENCY/CfgConsistency.expected index 670cd484fae6..e69de29bb2d1 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/CONSISTENCY/CfgConsistency.expected @@ -1,4 +0,0 @@ -consistencyOverview -| invalidAbruptCompletionOrigin | 1 | -invalidAbruptCompletionOrigin -| main.go:35:2:37:4 | defer statement | main.go:35:8:37:4 | defer-invoke function call | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/CONSISTENCY/CfgConsistency.expected b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/CONSISTENCY/CfgConsistency.expected index cc2190142a96..e69de29bb2d1 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/CONSISTENCY/CfgConsistency.expected @@ -1,12 +0,0 @@ -consistencyOverview -| invalidAbruptCompletionOrigin | 9 | -invalidAbruptCompletionOrigin -| test_database_sql.go:15:2:15:19 | defer statement | test_database_sql.go:15:8:15:19 | defer-invoke call to Close | -| test_database_sql.go:49:2:49:19 | defer statement | test_database_sql.go:49:8:49:19 | defer-invoke call to Close | -| test_database_sql.go:87:2:87:19 | defer statement | test_database_sql.go:87:8:87:19 | defer-invoke call to Close | -| test_database_sql.go:128:2:128:19 | defer statement | test_database_sql.go:128:8:128:19 | defer-invoke call to Close | -| test_gorm.go:20:2:20:19 | defer statement | test_gorm.go:20:8:20:19 | defer-invoke call to Close | -| test_jmoiron_sqlx.go:89:2:89:19 | defer statement | test_jmoiron_sqlx.go:89:8:89:19 | defer-invoke call to Close | -| test_jmoiron_sqlx.go:151:2:151:19 | defer statement | test_jmoiron_sqlx.go:151:8:151:19 | defer-invoke call to Close | -| test_jmoiron_sqlx.go:207:2:207:19 | defer statement | test_jmoiron_sqlx.go:207:8:207:19 | defer-invoke call to Close | -| test_jmoiron_sqlx.go:263:2:263:19 | defer statement | test_jmoiron_sqlx.go:263:8:263:19 | defer-invoke call to Close | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/environment/CONSISTENCY/CfgConsistency.expected b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/environment/CONSISTENCY/CfgConsistency.expected index 9b04020a3fcc..e69de29bb2d1 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/environment/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/environment/CONSISTENCY/CfgConsistency.expected @@ -1,4 +0,0 @@ -consistencyOverview -| invalidAbruptCompletionOrigin | 1 | -invalidAbruptCompletionOrigin -| test.go:66:2:66:16 | defer statement | test.go:66:8:66:16 | defer-invoke call to Close | diff --git a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/file/CONSISTENCY/CfgConsistency.expected b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/file/CONSISTENCY/CfgConsistency.expected index 5f16b3053576..e69de29bb2d1 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/file/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/file/CONSISTENCY/CfgConsistency.expected @@ -1,6 +0,0 @@ -consistencyOverview -| invalidAbruptCompletionOrigin | 3 | -invalidAbruptCompletionOrigin -| test.go:14:2:14:19 | defer statement | test.go:14:8:14:19 | defer-invoke call to Close | -| test.go:23:2:23:19 | defer statement | test.go:23:8:23:19 | defer-invoke call to Close | -| test.go:68:2:68:19 | defer statement | test.go:68:8:68:19 | defer-invoke call to Close | diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Twirp/CONSISTENCY/CfgConsistency.expected b/go/ql/test/library-tests/semmle/go/frameworks/Twirp/CONSISTENCY/CfgConsistency.expected index 860ce6a378b7..e69de29bb2d1 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Twirp/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Twirp/CONSISTENCY/CfgConsistency.expected @@ -1,9 +0,0 @@ -consistencyOverview -| invalidAbruptCompletionOrigin | 6 | -invalidAbruptCompletionOrigin -| rpc/notes/service.twirp.go:494:3:494:48 | defer statement | rpc/notes/service.twirp.go:494:9:494:48 | defer-invoke call to ensurePanicResponses | -| rpc/notes/service.twirp.go:575:3:575:48 | defer statement | rpc/notes/service.twirp.go:575:9:575:48 | defer-invoke call to ensurePanicResponses | -| rpc/notes/service.twirp.go:674:3:674:48 | defer statement | rpc/notes/service.twirp.go:674:9:674:48 | defer-invoke call to ensurePanicResponses | -| rpc/notes/service.twirp.go:755:3:755:48 | defer statement | rpc/notes/service.twirp.go:755:9:755:48 | defer-invoke call to ensurePanicResponses | -| rpc/notes/service.twirp.go:1227:2:1227:41 | defer statement | rpc/notes/service.twirp.go:1227:8:1227:41 | defer-invoke function call | -| rpc/notes/service.twirp.go:1277:2:1282:4 | defer statement | rpc/notes/service.twirp.go:1277:8:1282:4 | defer-invoke function call | diff --git a/go/ql/test/query-tests/InconsistentCode/UnhandledCloseWritableHandle/CONSISTENCY/CfgConsistency.expected b/go/ql/test/query-tests/InconsistentCode/UnhandledCloseWritableHandle/CONSISTENCY/CfgConsistency.expected index 1746e690e278..2ce97565d12d 100644 --- a/go/ql/test/query-tests/InconsistentCode/UnhandledCloseWritableHandle/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/query-tests/InconsistentCode/UnhandledCloseWritableHandle/CONSISTENCY/CfgConsistency.expected @@ -1,15 +1,5 @@ consistencyOverview -| invalidAbruptCompletionOrigin | 8 | | multipleSuccessors | 6 | -invalidAbruptCompletionOrigin -| tests.go:10:2:10:16 | defer statement | tests.go:10:8:10:16 | defer-invoke call to Close | -| tests.go:18:2:18:13 | defer statement | tests.go:18:8:18:13 | defer-invoke call to cont | -| tests.go:27:2:27:13 | defer statement | tests.go:27:8:27:13 | defer-invoke call to cont | -| tests.go:99:3:99:17 | defer statement | tests.go:99:9:99:17 | defer-invoke call to Close | -| tests.go:112:3:112:17 | defer statement | tests.go:112:9:112:17 | defer-invoke call to Close | -| tests.go:126:3:126:17 | defer statement | tests.go:126:9:126:17 | defer-invoke call to Close | -| tests.go:157:2:157:16 | defer statement | tests.go:157:8:157:16 | defer-invoke call to Close | -| tests.go:166:2:166:16 | defer statement | tests.go:166:8:166:16 | defer-invoke call to Close | multipleSuccessors | tests.go:96:2:104:2 | After if statement | successor | tests.go:94:30:105:1 | After block statement | | tests.go:96:2:104:2 | After if statement | successor | tests.go:99:9:99:17 | defer-invoke call to Close | diff --git a/go/ql/test/query-tests/RedundantCode/DeadStoreOfField/CONSISTENCY/CfgConsistency.expected b/go/ql/test/query-tests/RedundantCode/DeadStoreOfField/CONSISTENCY/CfgConsistency.expected index b0cb7b1de158..e69de29bb2d1 100644 --- a/go/ql/test/query-tests/RedundantCode/DeadStoreOfField/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/query-tests/RedundantCode/DeadStoreOfField/CONSISTENCY/CfgConsistency.expected @@ -1,4 +0,0 @@ -consistencyOverview -| invalidAbruptCompletionOrigin | 1 | -invalidAbruptCompletionOrigin -| main.go:40:2:42:5 | defer statement | main.go:40:8:42:5 | defer-invoke function call | diff --git a/go/ql/test/query-tests/RedundantCode/RedundantRecover/CONSISTENCY/CfgConsistency.expected b/go/ql/test/query-tests/RedundantCode/RedundantRecover/CONSISTENCY/CfgConsistency.expected index e243f6b98c8d..e69de29bb2d1 100644 --- a/go/ql/test/query-tests/RedundantCode/RedundantRecover/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/query-tests/RedundantCode/RedundantRecover/CONSISTENCY/CfgConsistency.expected @@ -1,7 +0,0 @@ -consistencyOverview -| invalidAbruptCompletionOrigin | 4 | -invalidAbruptCompletionOrigin -| RedundantRecover1.go:12:2:14:4 | defer statement | RedundantRecover1.go:12:8:14:4 | defer-invoke function call | -| RedundantRecover1Good.go:12:2:12:25 | defer statement | RedundantRecover1Good.go:12:8:12:25 | defer-invoke call to callRecover1Good | -| RedundantRecover2Good.go:4:2:4:29 | defer statement | RedundantRecover2Good.go:4:8:4:29 | defer-invoke function call | -| tst.go:32:2:32:21 | defer statement | tst.go:32:8:32:21 | defer-invoke call to callRecover4 | diff --git a/go/ql/test/query-tests/Security/CWE-022/CONSISTENCY/CfgConsistency.expected b/go/ql/test/query-tests/Security/CWE-022/CONSISTENCY/CfgConsistency.expected index 274437dd193a..e69de29bb2d1 100644 --- a/go/ql/test/query-tests/Security/CWE-022/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/query-tests/Security/CWE-022/CONSISTENCY/CfgConsistency.expected @@ -1,4 +0,0 @@ -consistencyOverview -| invalidAbruptCompletionOrigin | 1 | -invalidAbruptCompletionOrigin -| tst.go:16:2:16:19 | defer statement | tst.go:16:8:16:19 | defer-invoke call to Close | diff --git a/go/ql/test/query-tests/Security/CWE-078/CONSISTENCY/CfgConsistency.expected b/go/ql/test/query-tests/Security/CWE-078/CONSISTENCY/CfgConsistency.expected index 2030ab9c4f99..e69de29bb2d1 100644 --- a/go/ql/test/query-tests/Security/CWE-078/CONSISTENCY/CfgConsistency.expected +++ b/go/ql/test/query-tests/Security/CWE-078/CONSISTENCY/CfgConsistency.expected @@ -1,4 +0,0 @@ -consistencyOverview -| invalidAbruptCompletionOrigin | 1 | -invalidAbruptCompletionOrigin -| CommandInjection2.go:29:2:29:22 | defer statement | CommandInjection2.go:29:8:29:22 | defer-invoke call to Close | From 2c36cb9998daf0bec2a1e6cd148ff575b9f160d6 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 4 Sep 2026 11:57:47 +0100 Subject: [PATCH 1023/2098] Restore data flow through pointer assignment targets Evaluate the operand of a skipped pointer LHS and create post-update nodes for the full access path. --- go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll | 8 ++++++++ go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll | 2 ++ .../ControlFlowNode_getASuccessor.expected | 5 ++++- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll index f5cd54c1acc8..2c622b463e17 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll @@ -106,6 +106,14 @@ module CfgImpl { not skipCfg(n) and result = n.getChild(index) or + exists(Go::Assignment assgn, Go::Expr lhs | + n = assgn and lhs = assgn.getLhs(_) and lhs = n.getChild(index) and skipCfg(lhs) + | + result = lhs.(Go::StarExpr).getBase() + or + result = lhs.(Go::DerefExpr).getOperand() + ) + or // The body block of a switch (expression or type) is transparent (see // `skipCfg`), so it is not itself a child and contributes no children. // Expose the case clauses directly as children of the switch instead, diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll index ff609e008dff..ba35e27c0f80 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll @@ -772,6 +772,8 @@ module Public { private IR::Instruction getADirectlyWrittenInsn() { exists(Write w | w.writesComponentInstruction(result, _)) or + result = any(Write w).getLhs().(IR::PointerTarget).getBase() + or result = IR::evalExprInstruction(any(SendStmt s).getChannel()) } diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected index e789101e1e9f..4d72903e8503 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected @@ -2776,9 +2776,12 @@ | stmts3.go:14:13:14:13 | x | stmts3.go:14:21:16:1 | block statement | | stmts3.go:14:21:16:1 | After block statement | stmts3.go:14:1:16:1 | Normal Exit | | stmts3.go:14:21:16:1 | block statement | stmts3.go:15:2:15:8 | ... = ... | -| stmts3.go:15:2:15:8 | ... = ... | stmts3.go:15:7:15:8 | Before 42 | +| stmts3.go:15:2:15:8 | ... = ... | stmts3.go:15:3:15:3 | Before x | | stmts3.go:15:2:15:8 | After ... = ... | stmts3.go:14:21:16:1 | After block statement | | stmts3.go:15:2:15:8 | assign:0 ... = ... | stmts3.go:15:2:15:8 | After ... = ... | +| stmts3.go:15:3:15:3 | After x | stmts3.go:15:7:15:8 | Before 42 | +| stmts3.go:15:3:15:3 | Before x | stmts3.go:15:3:15:3 | x | +| stmts3.go:15:3:15:3 | x | stmts3.go:15:3:15:3 | After x | | stmts3.go:15:7:15:8 | 42 | stmts3.go:15:7:15:8 | After 42 | | stmts3.go:15:7:15:8 | After 42 | stmts3.go:15:2:15:8 | assign:0 ... = ... | | stmts3.go:15:7:15:8 | Before 42 | stmts3.go:15:7:15:8 | 42 | From c236b4046cdef0b4fd83c74ee4f0e11b7f8b3634 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Tue, 8 Sep 2026 12:03:33 +0100 Subject: [PATCH 1024/2098] Fix go/whitespace-contradicts-precendence for ParenExpr removal --- .../WhitespaceContradictsPrecedence.ql | 13 +++++++++---- .../ParenthesizedOperands.go | 7 +++++++ 2 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 go/ql/test/query-tests/InconsistentCode/WhitespaceContradictsPrecedence/ParenthesizedOperands.go diff --git a/go/ql/src/InconsistentCode/WhitespaceContradictsPrecedence.ql b/go/ql/src/InconsistentCode/WhitespaceContradictsPrecedence.ql index 7e2846cf6b2f..d2abb8f4a5b9 100644 --- a/go/ql/src/InconsistentCode/WhitespaceContradictsPrecedence.ql +++ b/go/ql/src/InconsistentCode/WhitespaceContradictsPrecedence.ql @@ -73,14 +73,19 @@ predicate interestingNesting(BinaryExpr inner, BinaryExpr outer) { /** Gets the number of whitespace characters around the operator `op` of `be`. */ int getWhitespaceAroundOperator(BinaryExpr be, string op) { - exists(Location left, Location right | + exists(Location loc, Location left, Location right | + be.getLocation() = loc and be.getLeftOperand().getLocation() = left and be.getRightOperand().getLocation() = right and left.getFile() = right.getFile() and - left.getStartLine() = right.getStartLine() - | + left.getStartLine() = right.getStartLine() and op = be.getOperator() and - result = (right.getStartColumn() - left.getEndColumn() - op.length() - 1) / 2 + result = + ( + right.getStartColumn() - left.getEndColumn() - op.length() - 1 - + (left.getStartColumn() - loc.getStartColumn()) - + (loc.getEndColumn() - right.getEndColumn()) + ) / 2 ) } diff --git a/go/ql/test/query-tests/InconsistentCode/WhitespaceContradictsPrecedence/ParenthesizedOperands.go b/go/ql/test/query-tests/InconsistentCode/WhitespaceContradictsPrecedence/ParenthesizedOperands.go new file mode 100644 index 000000000000..1b9d472a6237 --- /dev/null +++ b/go/ql/test/query-tests/InconsistentCode/WhitespaceContradictsPrecedence/ParenthesizedOperands.go @@ -0,0 +1,7 @@ +package main + +// autoformat-ignore (otherwise gofmt will insist on its particular spacing) + +func weightedMeanGood(a, b float64, countA, countB, total int) float64 { + return ((a * float64(countA)) + (b * float64(countB))) / float64(total) +} From 3d9f2f389dbb6adb39eeb9b8aade08ff716b3bc2 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Tue, 8 Sep 2026 14:35:54 +0100 Subject: [PATCH 1025/2098] Fix bad join order --- .../go/security/AllocationSizeOverflowCustomizations.qll | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/go/ql/lib/semmle/go/security/AllocationSizeOverflowCustomizations.qll b/go/ql/lib/semmle/go/security/AllocationSizeOverflowCustomizations.qll index 3eced801f209..789aaec04a16 100644 --- a/go/ql/lib/semmle/go/security/AllocationSizeOverflowCustomizations.qll +++ b/go/ql/lib/semmle/go/security/AllocationSizeOverflowCustomizations.qll @@ -73,7 +73,9 @@ module AllocationSizeOverflow { private predicate allocationSizeCheck(DataFlow::Node g, Expr e, boolean branch) { exists(DataFlow::Node lesser | - g.(DataFlow::RelationalComparisonNode).leq(branch, lesser, _, _) and + pragma[only_bind_into](g) + .(DataFlow::RelationalComparisonNode) + .leq(pragma[only_bind_into](branch), pragma[only_bind_into](lesser), _, _) and not lesser.isConst() and globalValueNumber(DataFlow::exprNode(e)) = globalValueNumber(lesser) ) From 79724e7229df1f3cfa543484245bc84aa9a07284 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 10 Sep 2026 11:42:08 +0100 Subject: [PATCH 1026/2098] (Performance) don't materialize ancestor relation --- .../go/controlflow/ControlFlowGraphImpl.qll | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll index 2c622b463e17..dd59e3b73da6 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll @@ -47,6 +47,18 @@ module CfgImpl { ) } + private predicate insideConstantRoot(Go::AstNode node) { + constantRoot(node.getParent()) + or + insideConstantRoot(node.getParent()) + } + + private predicate inArrayLength(Go::AstNode node) { + node = any(Go::ArrayTypeExpr array).getLength() + or + inArrayLength(node.getParent()) + } + /** Provides an implementation of the AST signature for Go. */ private module Ast implements CfgLib::AstSig { class AstNode = Go::AstNode; @@ -80,7 +92,7 @@ module CfgImpl { or e = any(Go::ImportSpec is).getPathExpr() or - e.getParent*() = any(Go::ArrayTypeExpr ate).getLength() + inArrayLength(e) or // The shared switch model wires control flow directly from the switch to // its case clauses (in control-flow order) and between cases, so the @@ -97,7 +109,7 @@ module CfgImpl { or // The strict sub-expressions of a constant expression are not evaluated // at run time, so they must not get their own evaluation nodes. - constantRoot(e.(Go::Expr).getParent+()) + insideConstantRoot(e.(Go::Expr)) } AstNode getChild(AstNode n, int index) { From 2dd2c2d576a0d2ec96eb841d9f0afba5db4313e8 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 10 Sep 2026 12:29:26 +0100 Subject: [PATCH 1027/2098] (Performance) speed up GVN calculations by using contracted graph --- .../go/dataflow/GlobalValueNumbering.qll | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/go/ql/lib/semmle/go/dataflow/GlobalValueNumbering.qll b/go/ql/lib/semmle/go/dataflow/GlobalValueNumbering.qll index 3547e70b858a..38c5ff4de219 100644 --- a/go/ql/lib/semmle/go/dataflow/GlobalValueNumbering.qll +++ b/go/ql/lib/semmle/go/dataflow/GlobalValueNumbering.qll @@ -109,15 +109,41 @@ private ControlFlow::Node getControlFlowEntry(ControlFlow::Node node) { private predicate entryNode(ControlFlow::Node node) { node.isEntryNode() } +/** Retains queried instructions, effects, and junctions while allowing linear CFG nodes to be bypassed. */ +private predicate retainedSideEffectNode(ControlFlow::Node node) { + node instanceof IR::Instruction + or + node = nodeWithPossibleSideEffect() + or + node.isEntryNode() + or + node.isBranch() + or + node.isJoin() + or + not exists(node.getAPredecessor()) + or + not exists(node.getASuccessor()) +} + +/** Gets the first retained node at or after `node` along a linear CFG path. */ +private ControlFlow::Node nextSideEffectNode(ControlFlow::Node node) { + retainedSideEffectNode(node) and result = node + or + not retainedSideEffectNode(node) and + result = nextSideEffectNode(node.getASuccessor()) +} + /** - * Holds if there is a control flow edge from `src` to `dst` or + * Holds if there is a contracted control flow edge from `src` to `dst` or * if `dst` is an expression with a possible side-effect. The idea * is to treat side effects as entry points in the control flow * graph so that we can use the dominator tree to find the most recent * side-effect. */ private predicate sideEffectCfg(ControlFlow::Node src, ControlFlow::Node dst) { - src.getASuccessor() = dst + retainedSideEffectNode(src) and + dst = nextSideEffectNode(src.getASuccessor()) or // Add an edge from the entry point to any node that might have a side // effect. From eaf952db05e38abea2d01affb6a0fbe0dc01c8d8 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 10 Sep 2026 12:45:31 +0100 Subject: [PATCH 1028/2098] Shared CFG: Add `includeCallableEntry` hook --- .../codeql/controlflow/ControlFlowGraph.qll | 39 ++++++++++++------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll index a8a6a8e1c449..eba82f31662f 100644 --- a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll +++ b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll @@ -1195,6 +1195,14 @@ module Make0 Ast> { } signature module InputSig2 { + /** + * Holds if control flow is constructed and reachability starts at the + * entry of `callable` in this stage. + * By default, all callable entries are included. Restricting this is useful + * for auxiliary CFG stages that are only needed for selected callables. + */ + default predicate includeCallableEntry(Callable callable) { any() } + /** * Holds if `ast` may result in an abrupt completion `c` originating at * `n`. The boolean `always` indicates whether the abrupt completion @@ -1929,6 +1937,7 @@ module Make0 Ast> { */ private predicate defaultCfg(AstNode ast) { hasCfg(ast) and + Input2::includeCallableEntry(getEnclosingCallable(ast)) and not explicitStep(any(PreControlFlowNode n | n.isBefore(ast)), _) } @@ -1980,7 +1989,8 @@ module Make0 Ast> { /** Holds if there is a local non-abrupt step from `n1` to `n2`. */ private predicate step(PreControlFlowNode n1, PreControlFlowNode n2) { - explicitStep(n1, n2) or defaultStep(n1, n2) + Input2::includeCallableEntry(n1.getEnclosingCallable()) and + (explicitStep(n1, n2) or defaultStep(n1, n2)) } /** @@ -2014,17 +2024,20 @@ module Make0 Ast> { } private predicate preSucc(PreControlFlowNode n1, PreControlFlowNode n2, SuccessorType t) { - step(n1, n2) and n2 = TAfterValueNode(_, t) - or - step(n1, n2) and n2.(AdditionalNode).getSuccessorType() = t - or - step(n1, n2) and - not n2 instanceof AfterValueNode and - not n2 instanceof AdditionalNode and - t instanceof DirectSuccessor - or - exists(AstNode ast, AbruptCompletion c | - last(ast, n1, c) and endAbruptCompletion(ast, n2, c) and t = c.getSuccessorType() + Input2::includeCallableEntry(n1.getEnclosingCallable()) and + ( + step(n1, n2) and n2 = TAfterValueNode(_, t) + or + step(n1, n2) and n2.(AdditionalNode).getSuccessorType() = t + or + step(n1, n2) and + not n2 instanceof AfterValueNode and + not n2 instanceof AdditionalNode and + t instanceof DirectSuccessor + or + exists(AstNode ast, AbruptCompletion c | + last(ast, n1, c) and endAbruptCompletion(ast, n2, c) and t = c.getSuccessorType() + ) ) } @@ -2032,7 +2045,7 @@ module Make0 Ast> { cached private predicate reachable(PreControlFlowNode n) { Input1::cfgCachedStageRef() and - n instanceof EntryNodeImpl + Input2::includeCallableEntry(n.(EntryNodeImpl).getEnclosingCallable()) or exists(PreControlFlowNode mid | reachable(mid) and preSucc(mid, n, _)) } From 948c032e83e20b3d9ee72894313985394069648d Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 10 Sep 2026 12:46:16 +0100 Subject: [PATCH 1029/2098] Performance: Use `includeCallableEntry` hook --- go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll index dd59e3b73da6..3ea6beec8b54 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll @@ -1727,8 +1727,15 @@ module CfgImpl { } } - /** Builds the CFG used to determine which `defer` statements have been registered. */ + /** + * Builds the CFG used to determine which `defer` statements have been registered. + * Only functions containing `defer` statements need this auxiliary stage. + */ private module EarlyInput2 implements Cfg1::InputSig2 { + predicate includeCallableEntry(Ast::Callable callable) { + callable = any(Go::DeferStmt stmt).getEnclosingFunction() + } + predicate beginAbruptCompletion( Ast::AstNode ast, PreControlFlowNode n, AbruptCompletion c, boolean always ) { From f49ab927d7de8f2c312087823824cc61fe461ff9 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 10 Sep 2026 23:14:50 +0100 Subject: [PATCH 1030/2098] Minor refactor (don't use AstNode.getNumChild) --- go/ql/lib/semmle/go/Stmt.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/ql/lib/semmle/go/Stmt.qll b/go/ql/lib/semmle/go/Stmt.qll index 042d5d19cd8f..04d9b24e9f70 100644 --- a/go/ql/lib/semmle/go/Stmt.qll +++ b/go/ql/lib/semmle/go/Stmt.qll @@ -571,7 +571,7 @@ class ReturnStmt extends @returnstmt, Stmt { int getNumExpr() { result = count(this.getAnExpr()) } /** Gets the unique returned expression, if there is only one. */ - Expr getExpr() { this.getNumChild() = 1 and result = this.getExpr(0) } + Expr getExpr() { this.getNumExpr() = 1 and result = this.getExpr(0) } override predicate mayHaveSideEffects() { this.getAnExpr().mayHaveSideEffects() } From c5bd6ab7c1d3223af91a3a92d4e0b45cbe6fb1b1 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 11 Sep 2026 00:00:14 +0100 Subject: [PATCH 1031/2098] Refactor: avoid transitive closures --- .../go/dataflow/internal/DataFlowNodes.qll | 42 ++++++++++++------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll index ba35e27c0f80..1aa60c0eca46 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowNodes.qll @@ -790,7 +790,23 @@ module Public { } private IR::Instruction getAWrittenInsn() { - result = getAccessPathPredecessorInsn*(getADirectlyWrittenInsn()) + result = getADirectlyWrittenInsn() + or + result = getAccessPathPredecessorInsn(getAWrittenInsn()) + } + + private IR::Instruction getAMethodReceiverInsn() { + exists(CallExpr call, IR::MethodReadInstruction methodRead | + call.getTarget() instanceof Method and + methodRead = IR::evalExprInstruction(call.getCalleeExpr()) and + result = methodRead.getReceiver() + ) + or + // If a.x is reading a promoted field, and it's equivalent to a.b.c.x, + // then methodRead.getReceiver() will give us the implicit field read a.b.c + // and we want to have post-update nodes for a, the implicit field + // read a.b and the implicit field read a.b.c. + result = IR::lookThroughImplicitFieldRead(getAMethodReceiverInsn()) } /** @@ -837,23 +853,17 @@ module Public { e = any(IR::EvalImplicitDerefInstruction eidi).getOperand() ) or - exists(CallExpr ce | - ce.getArgument(0).getType() instanceof TupleType and - insn = IR::extractTupleElement(IR::evalExprInstruction(ce.getArgument(0)), _) - or - not ce.getArgument(0).getType() instanceof TupleType and - insn = IR::evalExprInstruction(ce.getAnArgument()) + ( + exists(CallExpr ce | + ce.getArgument(0).getType() instanceof TupleType and + insn = IR::extractTupleElement(IR::evalExprInstruction(ce.getArgument(0)), _) + or + not ce.getArgument(0).getType() instanceof TupleType and + insn = IR::evalExprInstruction(ce.getAnArgument()) + ) or // Receiver of a method call - exists(IR::MethodReadInstruction mri | - ce.getTarget() instanceof Method and - mri = IR::evalExprInstruction(ce.getCalleeExpr()) and - // If a.x is reading a promoted field, and it's equivalent to a.b.c.x, - // then mri.getReceiver() will give us the implicit field read a.b.c - // and we want to have post-update nodes for a, the implicit field - // read a.b and the implicit field read a.b.c. - insn = IR::lookThroughImplicitFieldRead*(mri.getReceiver()) - ) + insn = getAMethodReceiverInsn() ) and mutableType(insn.getResultType()) or From c875d3280b7963f61f22e3ebed699062cb13220b Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 11 Sep 2026 00:18:12 +0100 Subject: [PATCH 1032/2098] Limit Go build-constraint regex matching to initial comments Filter comments by their position before the package declaration before matching build-constraint text. Use binding and inlining annotations to keep the regex evaluation behind this filter and avoid repeated scans of all line comments. --- go/ql/lib/semmle/go/Comments.qll | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/go/ql/lib/semmle/go/Comments.qll b/go/ql/lib/semmle/go/Comments.qll index 08a0fabc1cab..b5cd9a48e173 100644 --- a/go/ql/lib/semmle/go/Comments.qll +++ b/go/ql/lib/semmle/go/Comments.qll @@ -190,6 +190,18 @@ private Comment getInitialComment(File f, int i) { ) } +bindingset[comment] +pragma[inline_late] +private predicate hasBuildConstraintText(Comment comment) { + comment.getText().regexpMatch("\\s*(\\+|go:)build.*") +} + +pragma[noinline] +private predicate isInitialBuildConstraintComment(Comment comment) { + isInitialComment(comment, _, _, _) and + hasBuildConstraintText(comment) +} + /** * A build constraint comment of the form `// +build ...` or `//go:build ...`. * @@ -211,7 +223,7 @@ class BuildConstraintComment extends LineComment { not getInitialComment(f, [0 .. i - 1]) instanceof BlockComment ) and // comment text starts with `+build` or `go:build` - this.getText().regexpMatch("\\s*(\\+|go:)build.*") + isInitialBuildConstraintComment(this) } override string getAPrimaryQlClass() { result = "BuildConstraintComment" } From 172857051439a4ad9ae1d443fdbc94e65bffc30d Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 11 Sep 2026 09:55:29 +0100 Subject: [PATCH 1033/2098] Fix bad join order --- go/ql/lib/semmle/go/StringOps.qll | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/go/ql/lib/semmle/go/StringOps.qll b/go/ql/lib/semmle/go/StringOps.qll index 3c646d7c9413..a00f8d90b48e 100644 --- a/go/ql/lib/semmle/go/StringOps.qll +++ b/go/ql/lib/semmle/go/StringOps.qll @@ -138,6 +138,18 @@ module StringOps { override boolean getPolarity() { result = expr.getPolarity() } } + bindingset[slice, substring] + pragma[inline_late] + private predicate hasPrefixSliceUpperBound(DataFlow::SliceNode slice, DataFlow::Node substring) { + exists(DataFlow::CallNode len | + len = Builtin::len().getACall() and + len.getArgument(0) = globalValueNumber(substring).getANode() and + slice.getHigh() = globalValueNumber(len).getANode() + ) + or + substring.getStringValue().length() = slice.getHigh().getIntValue() + } + /** * A comparison of the form `x[:len(y)] == y`. */ @@ -149,15 +161,7 @@ module StringOps { this.eq(_, slice, substring) and // An omitted lower bound (`x[:len(y)]`) is implicitly `0`. (not exists(slice.getLow()) or slice.getLow().getIntValue() = 0) and - ( - exists(DataFlow::CallNode len | - len = Builtin::len().getACall() and - len.getArgument(0) = globalValueNumber(substring).getANode() and - slice.getHigh() = globalValueNumber(len).getANode() - ) - or - substring.getStringValue().length() = slice.getHigh().getIntValue() - ) + hasPrefixSliceUpperBound(slice, substring) } override DataFlow::Node getBaseString() { result = slice.getBase() } From e6bbfb27ebff5a4ff889465b184a24ac20be791a Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 11 Sep 2026 11:34:35 +0100 Subject: [PATCH 1034/2098] Cache Go CFG root lookup Materialize the public node-to-root mapping once across evaluation stages, including IR overrides. Keep the shared CFG cache boundaries unchanged. Validated with 30 Go CFG/dataflow/query tests and identical ReflectedXss BQRS results on CockroachDB and AWS SDK. Cold single-thread runs improved from 71-72s to 68-70s on CockroachDB and from 98s to 90s on AWS SDK. --- go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll | 1 + 1 file changed, 1 insertion(+) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll index 1ee860a5e865..52a87a153cbe 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll @@ -75,6 +75,7 @@ module ControlFlow { * Gets the innermost function to which this node belongs, or the file if * it is not inside a function. */ + cached Root getRoot() { result = this.getEnclosingCallable() } /** Gets the file to which this node belongs. */ From aea3d941ca9c6868240d2c8b3ed574b978c7363d Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 11 Sep 2026 13:21:12 +0100 Subject: [PATCH 1035/2098] Use shared CFG leaf representation more for Go Use Go-local before-node evaluation for basic literals and plain identifier references. Restore the shared library to its pre-coalescing implementation and cache the leaf evaluation mapping to avoid repeated IR classification. The Go-only representation reduces reachable CFG nodes by 23% on CockroachDB and 17.6% on AWS. Latest cold single-thread ReflectedXss runs were 68s versus a 71s baseline and 90s versus a 93s baseline; earlier candidate runs were 71s and 89s, so end-to-end gains remain modest. --- .../go/controlflow/ControlFlowGraphImpl.qll | 19 +- go/ql/lib/semmle/go/controlflow/IR.qll | 15 + .../ControlFlowNode_getASuccessor.expected | 2283 ++++++----------- 3 files changed, 744 insertions(+), 1573 deletions(-) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll index 3ea6beec8b54..b72704ff3c0c 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll @@ -459,13 +459,10 @@ module CfgImpl { } predicate postOrInOrder(Ast::AstNode n) { - // Leaf value expressions: these have no CFG children, so the shared - // library's default (which only makes expressions *with* children - // post-order) would otherwise treat them as simple leaf nodes with no - // in-order value node. - n instanceof Go::ReferenceExpr - or - n instanceof Go::BasicLit + // References other than plain identifiers and function literals need + // an in-order value node even when they have no CFG children. Basic + // literals and plain identifiers instead evaluate at their before node. + n instanceof Go::ReferenceExpr and not n instanceof Go::Ident or n instanceof Go::FuncLit or @@ -475,10 +472,10 @@ module CfgImpl { or // A constant expression is folded at compile time and its sub-expressions // are not evaluated (they are pruned by `skipCfg`), so the constant root - // has no CFG children. It therefore needs an explicit in-order node to - // remain a single value-producing leaf (e.g. `unsafe.Sizeof(test())`, - // `1 << 10`, or `!d` for constant `d`). - constantRoot(n) + // has no CFG children. Except for basic literals and identifiers, it + // needs an explicit in-order node to remain a single value-producing + // leaf (e.g. `unsafe.Sizeof(test())`, `1 << 10`, or `!d` for constant `d`). + constantRoot(n) and not n instanceof Go::BasicLit and not n instanceof Go::Ident or // Statements/declarations that compute a value or perform an operation and // are not among the statements the shared library makes post-order by diff --git a/go/ql/lib/semmle/go/controlflow/IR.qll b/go/ql/lib/semmle/go/controlflow/IR.qll index ec3e0f2490cc..bfc02c61dae2 100644 --- a/go/ql/lib/semmle/go/controlflow/IR.qll +++ b/go/ql/lib/semmle/go/controlflow/IR.qll @@ -48,6 +48,17 @@ module IR { ) } + /** Gets the CFG node representing a basic literal or plain identifier reference. */ + cached + private ControlFlow::Node leafEvaluation(Expr leaf) { + ( + leaf instanceof BasicLit + or + leaf instanceof Ident and leaf instanceof ReferenceExpr + ) and + result.injects(leaf) + } + /** * An IR instruction. */ @@ -55,6 +66,8 @@ module IR { Instruction() { this.isIn(_) or + this = leafEvaluation(_) + or this.isAdditional(_, _) or isConditionGuardNode(this) @@ -203,6 +216,8 @@ module IR { EvalInstruction() { this.isIn(e) or + this = leafEvaluation(e) + or // The call of a `defer` statement is pre-order (it has no in-order // "invocation" node at the statement), so its value is produced by the // `defer-invoke` node that models the call at function exit. diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected index 4d72903e8503..0ebc608ad646 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected @@ -16,60 +16,44 @@ | DuplicateSwitchCase.go:5:2:6:9 | After case clause [match] | DuplicateSwitchCase.go:6:3:6:9 | expression statement | | DuplicateSwitchCase.go:5:2:6:9 | After case clause [no-match] | DuplicateSwitchCase.go:7:2:8:8 | case clause | | DuplicateSwitchCase.go:5:2:6:9 | case clause | DuplicateSwitchCase.go:5:7:5:20 | Before ...==... | -| DuplicateSwitchCase.go:5:7:5:9 | After msg | DuplicateSwitchCase.go:5:14:5:20 | Before "start" | -| DuplicateSwitchCase.go:5:7:5:9 | Before msg | DuplicateSwitchCase.go:5:7:5:9 | msg | -| DuplicateSwitchCase.go:5:7:5:9 | msg | DuplicateSwitchCase.go:5:7:5:9 | After msg | +| DuplicateSwitchCase.go:5:7:5:9 | msg | DuplicateSwitchCase.go:5:14:5:20 | "start" | | DuplicateSwitchCase.go:5:7:5:20 | ...==... | DuplicateSwitchCase.go:5:7:5:20 | After ...==... [match] | | DuplicateSwitchCase.go:5:7:5:20 | ...==... | DuplicateSwitchCase.go:5:7:5:20 | After ...==... [no-match] | | DuplicateSwitchCase.go:5:7:5:20 | After ...==... [match] | DuplicateSwitchCase.go:5:2:6:9 | After case clause [match] | | DuplicateSwitchCase.go:5:7:5:20 | After ...==... [no-match] | DuplicateSwitchCase.go:5:2:6:9 | After case clause [no-match] | -| DuplicateSwitchCase.go:5:7:5:20 | Before ...==... | DuplicateSwitchCase.go:5:7:5:9 | Before msg | -| DuplicateSwitchCase.go:5:14:5:20 | "start" | DuplicateSwitchCase.go:5:14:5:20 | After "start" | -| DuplicateSwitchCase.go:5:14:5:20 | After "start" | DuplicateSwitchCase.go:5:7:5:20 | ...==... | -| DuplicateSwitchCase.go:5:14:5:20 | Before "start" | DuplicateSwitchCase.go:5:14:5:20 | "start" | -| DuplicateSwitchCase.go:6:3:6:7 | After start | DuplicateSwitchCase.go:6:3:6:9 | call to start | -| DuplicateSwitchCase.go:6:3:6:7 | Before start | DuplicateSwitchCase.go:6:3:6:7 | start | -| DuplicateSwitchCase.go:6:3:6:7 | start | DuplicateSwitchCase.go:6:3:6:7 | After start | +| DuplicateSwitchCase.go:5:7:5:20 | Before ...==... | DuplicateSwitchCase.go:5:7:5:9 | msg | +| DuplicateSwitchCase.go:5:14:5:20 | "start" | DuplicateSwitchCase.go:5:7:5:20 | ...==... | +| DuplicateSwitchCase.go:6:3:6:7 | start | DuplicateSwitchCase.go:6:3:6:9 | call to start | | DuplicateSwitchCase.go:6:3:6:9 | After call to start | DuplicateSwitchCase.go:6:3:6:9 | After expression statement | | DuplicateSwitchCase.go:6:3:6:9 | After expression statement | DuplicateSwitchCase.go:4:2:11:2 | After expression-switch statement | -| DuplicateSwitchCase.go:6:3:6:9 | Before call to start | DuplicateSwitchCase.go:6:3:6:7 | Before start | +| DuplicateSwitchCase.go:6:3:6:9 | Before call to start | DuplicateSwitchCase.go:6:3:6:7 | start | | DuplicateSwitchCase.go:6:3:6:9 | call to start | DuplicateSwitchCase.go:3:1:12:1 | Exceptional Exit | | DuplicateSwitchCase.go:6:3:6:9 | call to start | DuplicateSwitchCase.go:6:3:6:9 | After call to start | | DuplicateSwitchCase.go:6:3:6:9 | expression statement | DuplicateSwitchCase.go:6:3:6:9 | Before call to start | | DuplicateSwitchCase.go:7:2:8:8 | After case clause [match] | DuplicateSwitchCase.go:8:3:8:8 | expression statement | | DuplicateSwitchCase.go:7:2:8:8 | After case clause [no-match] | DuplicateSwitchCase.go:9:2:10:34 | case clause | | DuplicateSwitchCase.go:7:2:8:8 | case clause | DuplicateSwitchCase.go:7:7:7:20 | Before ...==... | -| DuplicateSwitchCase.go:7:7:7:9 | After msg | DuplicateSwitchCase.go:7:14:7:20 | Before "start" | -| DuplicateSwitchCase.go:7:7:7:9 | Before msg | DuplicateSwitchCase.go:7:7:7:9 | msg | -| DuplicateSwitchCase.go:7:7:7:9 | msg | DuplicateSwitchCase.go:7:7:7:9 | After msg | +| DuplicateSwitchCase.go:7:7:7:9 | msg | DuplicateSwitchCase.go:7:14:7:20 | "start" | | DuplicateSwitchCase.go:7:7:7:20 | ...==... | DuplicateSwitchCase.go:7:7:7:20 | After ...==... [match] | | DuplicateSwitchCase.go:7:7:7:20 | ...==... | DuplicateSwitchCase.go:7:7:7:20 | After ...==... [no-match] | | DuplicateSwitchCase.go:7:7:7:20 | After ...==... [match] | DuplicateSwitchCase.go:7:2:8:8 | After case clause [match] | | DuplicateSwitchCase.go:7:7:7:20 | After ...==... [no-match] | DuplicateSwitchCase.go:7:2:8:8 | After case clause [no-match] | -| DuplicateSwitchCase.go:7:7:7:20 | Before ...==... | DuplicateSwitchCase.go:7:7:7:9 | Before msg | -| DuplicateSwitchCase.go:7:14:7:20 | "start" | DuplicateSwitchCase.go:7:14:7:20 | After "start" | -| DuplicateSwitchCase.go:7:14:7:20 | After "start" | DuplicateSwitchCase.go:7:7:7:20 | ...==... | -| DuplicateSwitchCase.go:7:14:7:20 | Before "start" | DuplicateSwitchCase.go:7:14:7:20 | "start" | -| DuplicateSwitchCase.go:8:3:8:6 | After stop | DuplicateSwitchCase.go:8:3:8:8 | call to stop | -| DuplicateSwitchCase.go:8:3:8:6 | Before stop | DuplicateSwitchCase.go:8:3:8:6 | stop | -| DuplicateSwitchCase.go:8:3:8:6 | stop | DuplicateSwitchCase.go:8:3:8:6 | After stop | +| DuplicateSwitchCase.go:7:7:7:20 | Before ...==... | DuplicateSwitchCase.go:7:7:7:9 | msg | +| DuplicateSwitchCase.go:7:14:7:20 | "start" | DuplicateSwitchCase.go:7:7:7:20 | ...==... | +| DuplicateSwitchCase.go:8:3:8:6 | stop | DuplicateSwitchCase.go:8:3:8:8 | call to stop | | DuplicateSwitchCase.go:8:3:8:8 | After call to stop | DuplicateSwitchCase.go:8:3:8:8 | After expression statement | | DuplicateSwitchCase.go:8:3:8:8 | After expression statement | DuplicateSwitchCase.go:4:2:11:2 | After expression-switch statement | -| DuplicateSwitchCase.go:8:3:8:8 | Before call to stop | DuplicateSwitchCase.go:8:3:8:6 | Before stop | +| DuplicateSwitchCase.go:8:3:8:8 | Before call to stop | DuplicateSwitchCase.go:8:3:8:6 | stop | | DuplicateSwitchCase.go:8:3:8:8 | call to stop | DuplicateSwitchCase.go:3:1:12:1 | Exceptional Exit | | DuplicateSwitchCase.go:8:3:8:8 | call to stop | DuplicateSwitchCase.go:8:3:8:8 | After call to stop | | DuplicateSwitchCase.go:8:3:8:8 | expression statement | DuplicateSwitchCase.go:8:3:8:8 | Before call to stop | | DuplicateSwitchCase.go:9:2:10:34 | After case clause [match] | DuplicateSwitchCase.go:10:3:10:34 | expression statement | | DuplicateSwitchCase.go:9:2:10:34 | case clause | DuplicateSwitchCase.go:9:2:10:34 | After case clause [match] | -| DuplicateSwitchCase.go:10:3:10:7 | After panic | DuplicateSwitchCase.go:10:9:10:33 | Before "Message not understood." | -| DuplicateSwitchCase.go:10:3:10:7 | Before panic | DuplicateSwitchCase.go:10:3:10:7 | panic | -| DuplicateSwitchCase.go:10:3:10:7 | panic | DuplicateSwitchCase.go:10:3:10:7 | After panic | -| DuplicateSwitchCase.go:10:3:10:34 | Before call to panic | DuplicateSwitchCase.go:10:3:10:7 | Before panic | +| DuplicateSwitchCase.go:10:3:10:7 | panic | DuplicateSwitchCase.go:10:9:10:33 | "Message not understood." | +| DuplicateSwitchCase.go:10:3:10:34 | Before call to panic | DuplicateSwitchCase.go:10:3:10:7 | panic | | DuplicateSwitchCase.go:10:3:10:34 | call to panic | DuplicateSwitchCase.go:3:1:12:1 | Exceptional Exit | | DuplicateSwitchCase.go:10:3:10:34 | expression statement | DuplicateSwitchCase.go:10:3:10:34 | Before call to panic | -| DuplicateSwitchCase.go:10:9:10:33 | "Message not understood." | DuplicateSwitchCase.go:10:9:10:33 | After "Message not understood." | -| DuplicateSwitchCase.go:10:9:10:33 | After "Message not understood." | DuplicateSwitchCase.go:10:3:10:34 | call to panic | -| DuplicateSwitchCase.go:10:9:10:33 | Before "Message not understood." | DuplicateSwitchCase.go:10:9:10:33 | "Message not understood." | +| DuplicateSwitchCase.go:10:9:10:33 | "Message not understood." | DuplicateSwitchCase.go:10:3:10:34 | call to panic | | DuplicateSwitchCase.go:14:1:14:15 | After function declaration | DuplicateSwitchCase.go:16:1:16:14 | Before function declaration | | DuplicateSwitchCase.go:14:1:14:15 | Before function declaration | DuplicateSwitchCase.go:14:1:14:15 | function declaration | | DuplicateSwitchCase.go:14:1:14:15 | Entry | DuplicateSwitchCase.go:14:14:14:15 | block statement | @@ -113,18 +97,13 @@ | epilogues.go:13:2:13:33 | call to Println | epilogues.go:13:2:13:33 | After call to Println | | epilogues.go:13:2:13:33 | expression statement | epilogues.go:13:2:13:33 | Before call to Println | | epilogues.go:13:14:13:14 | After l | epilogues.go:13:14:13:14 | implicit-deref l | -| epilogues.go:13:14:13:14 | Before l | epilogues.go:13:14:13:14 | l | | epilogues.go:13:14:13:14 | implicit-deref l | epilogues.go:13:14:13:21 | selection of prefix | | epilogues.go:13:14:13:14 | l | epilogues.go:13:14:13:14 | After l | -| epilogues.go:13:14:13:21 | After selection of prefix | epilogues.go:13:24:13:26 | Before msg | -| epilogues.go:13:14:13:21 | Before selection of prefix | epilogues.go:13:14:13:14 | Before l | +| epilogues.go:13:14:13:21 | After selection of prefix | epilogues.go:13:24:13:26 | msg | +| epilogues.go:13:14:13:21 | Before selection of prefix | epilogues.go:13:14:13:14 | l | | epilogues.go:13:14:13:21 | selection of prefix | epilogues.go:13:14:13:21 | After selection of prefix | -| epilogues.go:13:24:13:26 | After msg | epilogues.go:13:29:13:32 | Before code | -| epilogues.go:13:24:13:26 | Before msg | epilogues.go:13:24:13:26 | msg | -| epilogues.go:13:24:13:26 | msg | epilogues.go:13:24:13:26 | After msg | -| epilogues.go:13:29:13:32 | After code | epilogues.go:13:2:13:33 | call to Println | -| epilogues.go:13:29:13:32 | Before code | epilogues.go:13:29:13:32 | code | -| epilogues.go:13:29:13:32 | code | epilogues.go:13:29:13:32 | After code | +| epilogues.go:13:24:13:26 | msg | epilogues.go:13:29:13:32 | code | +| epilogues.go:13:29:13:32 | code | epilogues.go:13:2:13:33 | call to Println | | epilogues.go:16:1:18:1 | After function declaration | epilogues.go:23:1:27:1 | Before function declaration | | epilogues.go:16:1:18:1 | Before function declaration | epilogues.go:16:1:18:1 | function declaration | | epilogues.go:16:1:18:1 | Entry | epilogues.go:16:7:16:7 | l | @@ -144,15 +123,11 @@ | epilogues.go:17:2:17:27 | call to Println | epilogues.go:16:1:18:1 | Exceptional Exit | | epilogues.go:17:2:17:27 | call to Println | epilogues.go:17:2:17:27 | After call to Println | | epilogues.go:17:2:17:27 | expression statement | epilogues.go:17:2:17:27 | Before call to Println | -| epilogues.go:17:14:17:14 | After l | epilogues.go:17:14:17:21 | selection of prefix | -| epilogues.go:17:14:17:14 | Before l | epilogues.go:17:14:17:14 | l | -| epilogues.go:17:14:17:14 | l | epilogues.go:17:14:17:14 | After l | -| epilogues.go:17:14:17:21 | After selection of prefix | epilogues.go:17:24:17:26 | Before msg | -| epilogues.go:17:14:17:21 | Before selection of prefix | epilogues.go:17:14:17:14 | Before l | +| epilogues.go:17:14:17:14 | l | epilogues.go:17:14:17:21 | selection of prefix | +| epilogues.go:17:14:17:21 | After selection of prefix | epilogues.go:17:24:17:26 | msg | +| epilogues.go:17:14:17:21 | Before selection of prefix | epilogues.go:17:14:17:14 | l | | epilogues.go:17:14:17:21 | selection of prefix | epilogues.go:17:14:17:21 | After selection of prefix | -| epilogues.go:17:24:17:26 | After msg | epilogues.go:17:2:17:27 | call to Println | -| epilogues.go:17:24:17:26 | Before msg | epilogues.go:17:24:17:26 | msg | -| epilogues.go:17:24:17:26 | msg | epilogues.go:17:24:17:26 | After msg | +| epilogues.go:17:24:17:26 | msg | epilogues.go:17:2:17:27 | call to Println | | epilogues.go:23:1:27:1 | After function declaration | epilogues.go:31:1:33:1 | Before function declaration | | epilogues.go:23:1:27:1 | Before function declaration | epilogues.go:23:1:27:1 | function declaration | | epilogues.go:23:1:27:1 | Entry | epilogues.go:23:19:27:1 | block statement | @@ -166,26 +141,20 @@ | epilogues.go:24:5:24:18 | ... := ... | epilogues.go:24:10:24:18 | Before call to recover | | epilogues.go:24:5:24:18 | After ... := ... | epilogues.go:24:21:24:28 | Before ...!=... | | epilogues.go:24:5:24:18 | assign:0 ... := ... | epilogues.go:24:5:24:18 | After ... := ... | -| epilogues.go:24:10:24:16 | After recover | epilogues.go:24:10:24:18 | call to recover | -| epilogues.go:24:10:24:16 | Before recover | epilogues.go:24:10:24:16 | recover | -| epilogues.go:24:10:24:16 | recover | epilogues.go:24:10:24:16 | After recover | +| epilogues.go:24:10:24:16 | recover | epilogues.go:24:10:24:18 | call to recover | | epilogues.go:24:10:24:18 | After call to recover | epilogues.go:24:5:24:18 | assign:0 ... := ... | -| epilogues.go:24:10:24:18 | Before call to recover | epilogues.go:24:10:24:16 | Before recover | +| epilogues.go:24:10:24:18 | Before call to recover | epilogues.go:24:10:24:16 | recover | | epilogues.go:24:10:24:18 | call to recover | epilogues.go:24:10:24:18 | After call to recover | -| epilogues.go:24:21:24:21 | After r | epilogues.go:24:26:24:28 | Before nil | -| epilogues.go:24:21:24:21 | Before r | epilogues.go:24:21:24:21 | r | -| epilogues.go:24:21:24:21 | r | epilogues.go:24:21:24:21 | After r | +| epilogues.go:24:21:24:21 | r | epilogues.go:24:26:24:28 | nil | | epilogues.go:24:21:24:28 | ...!=... | epilogues.go:24:21:24:28 | After ...!=... [false] | | epilogues.go:24:21:24:28 | ...!=... | epilogues.go:24:21:24:28 | After ...!=... [true] | | epilogues.go:24:21:24:28 | After ...!=... [false] | epilogues.go:24:2:26:2 | After if statement | | epilogues.go:24:21:24:28 | After ...!=... [true] | epilogues.go:24:30:26:2 | block statement | -| epilogues.go:24:21:24:28 | Before ...!=... | epilogues.go:24:21:24:21 | Before r | -| epilogues.go:24:26:24:28 | After nil | epilogues.go:24:21:24:28 | ...!=... | -| epilogues.go:24:26:24:28 | Before nil | epilogues.go:24:26:24:28 | nil | -| epilogues.go:24:26:24:28 | nil | epilogues.go:24:26:24:28 | After nil | +| epilogues.go:24:21:24:28 | Before ...!=... | epilogues.go:24:21:24:21 | r | +| epilogues.go:24:26:24:28 | nil | epilogues.go:24:21:24:28 | ...!=... | | epilogues.go:24:30:26:2 | After block statement | epilogues.go:24:2:26:2 | After if statement | | epilogues.go:24:30:26:2 | block statement | epilogues.go:25:3:25:30 | expression statement | -| epilogues.go:25:3:25:13 | After selection of Println | epilogues.go:25:15:25:26 | Before "recovered:" | +| epilogues.go:25:3:25:13 | After selection of Println | epilogues.go:25:15:25:26 | "recovered:" | | epilogues.go:25:3:25:13 | Before selection of Println | epilogues.go:25:3:25:13 | selection of Println | | epilogues.go:25:3:25:13 | selection of Println | epilogues.go:25:3:25:13 | After selection of Println | | epilogues.go:25:3:25:30 | After call to Println | epilogues.go:25:3:25:30 | After expression statement | @@ -194,12 +163,8 @@ | epilogues.go:25:3:25:30 | call to Println | epilogues.go:23:1:27:1 | Exceptional Exit | | epilogues.go:25:3:25:30 | call to Println | epilogues.go:25:3:25:30 | After call to Println | | epilogues.go:25:3:25:30 | expression statement | epilogues.go:25:3:25:30 | Before call to Println | -| epilogues.go:25:15:25:26 | "recovered:" | epilogues.go:25:15:25:26 | After "recovered:" | -| epilogues.go:25:15:25:26 | After "recovered:" | epilogues.go:25:29:25:29 | Before r | -| epilogues.go:25:15:25:26 | Before "recovered:" | epilogues.go:25:15:25:26 | "recovered:" | -| epilogues.go:25:29:25:29 | After r | epilogues.go:25:3:25:30 | call to Println | -| epilogues.go:25:29:25:29 | Before r | epilogues.go:25:29:25:29 | r | -| epilogues.go:25:29:25:29 | r | epilogues.go:25:29:25:29 | After r | +| epilogues.go:25:15:25:26 | "recovered:" | epilogues.go:25:29:25:29 | r | +| epilogues.go:25:29:25:29 | r | epilogues.go:25:3:25:30 | call to Println | | epilogues.go:31:1:33:1 | After function declaration | epilogues.go:36:1:38:1 | Before function declaration | | epilogues.go:31:1:33:1 | Before function declaration | epilogues.go:31:1:33:1 | function declaration | | epilogues.go:31:1:33:1 | Entry | epilogues.go:31:15:31:15 | x | @@ -209,15 +174,11 @@ | epilogues.go:31:26:33:1 | block statement | epilogues.go:32:2:32:13 | Before return statement | | epilogues.go:32:2:32:13 | Before return statement | epilogues.go:32:9:32:13 | Before ...*... | | epilogues.go:32:2:32:13 | return statement | epilogues.go:31:1:33:1 | Normal Exit | -| epilogues.go:32:9:32:9 | After x | epilogues.go:32:13:32:13 | Before 2 | -| epilogues.go:32:9:32:9 | Before x | epilogues.go:32:9:32:9 | x | -| epilogues.go:32:9:32:9 | x | epilogues.go:32:9:32:9 | After x | +| epilogues.go:32:9:32:9 | x | epilogues.go:32:13:32:13 | 2 | | epilogues.go:32:9:32:13 | ...*... | epilogues.go:32:9:32:13 | After ...*... | | epilogues.go:32:9:32:13 | After ...*... | epilogues.go:32:2:32:13 | return statement | -| epilogues.go:32:9:32:13 | Before ...*... | epilogues.go:32:9:32:9 | Before x | -| epilogues.go:32:13:32:13 | 2 | epilogues.go:32:13:32:13 | After 2 | -| epilogues.go:32:13:32:13 | After 2 | epilogues.go:32:9:32:13 | ...*... | -| epilogues.go:32:13:32:13 | Before 2 | epilogues.go:32:13:32:13 | 2 | +| epilogues.go:32:9:32:13 | Before ...*... | epilogues.go:32:9:32:9 | x | +| epilogues.go:32:13:32:13 | 2 | epilogues.go:32:9:32:13 | ...*... | | epilogues.go:36:1:38:1 | After function declaration | epilogues.go:42:1:48:1 | Before function declaration | | epilogues.go:36:1:38:1 | Before function declaration | epilogues.go:36:1:38:1 | function declaration | | epilogues.go:36:1:38:1 | Entry | epilogues.go:36:16:38:1 | block statement | @@ -226,7 +187,7 @@ | epilogues.go:36:1:38:1 | function declaration | epilogues.go:36:1:38:1 | After function declaration | | epilogues.go:36:16:38:1 | After block statement | epilogues.go:36:1:38:1 | Normal Exit | | epilogues.go:36:16:38:1 | block statement | epilogues.go:37:2:37:20 | expression statement | -| epilogues.go:37:2:37:12 | After selection of Println | epilogues.go:37:14:37:19 | Before "void" | +| epilogues.go:37:2:37:12 | After selection of Println | epilogues.go:37:14:37:19 | "void" | | epilogues.go:37:2:37:12 | Before selection of Println | epilogues.go:37:2:37:12 | selection of Println | | epilogues.go:37:2:37:12 | selection of Println | epilogues.go:37:2:37:12 | After selection of Println | | epilogues.go:37:2:37:20 | After call to Println | epilogues.go:37:2:37:20 | After expression statement | @@ -235,9 +196,7 @@ | epilogues.go:37:2:37:20 | call to Println | epilogues.go:36:1:38:1 | Exceptional Exit | | epilogues.go:37:2:37:20 | call to Println | epilogues.go:37:2:37:20 | After call to Println | | epilogues.go:37:2:37:20 | expression statement | epilogues.go:37:2:37:20 | Before call to Println | -| epilogues.go:37:14:37:19 | "void" | epilogues.go:37:14:37:19 | After "void" | -| epilogues.go:37:14:37:19 | After "void" | epilogues.go:37:2:37:20 | call to Println | -| epilogues.go:37:14:37:19 | Before "void" | epilogues.go:37:14:37:19 | "void" | +| epilogues.go:37:14:37:19 | "void" | epilogues.go:37:2:37:20 | call to Println | | epilogues.go:42:1:48:1 | After function declaration | epilogues.go:51:1:54:1 | Before function declaration | | epilogues.go:42:1:48:1 | Before function declaration | epilogues.go:42:1:48:1 | function declaration | | epilogues.go:42:1:48:1 | Entry | epilogues.go:42:20:42:20 | x | @@ -252,39 +211,29 @@ | epilogues.go:42:51:48:1 | zero-init:1 block statement | epilogues.go:43:2:46:2 | if statement | | epilogues.go:43:2:46:2 | After if statement | epilogues.go:47:2:47:14 | Before return statement | | epilogues.go:43:2:46:2 | if statement | epilogues.go:43:5:43:9 | Before ...<... | -| epilogues.go:43:5:43:5 | After x | epilogues.go:43:9:43:9 | Before 0 | -| epilogues.go:43:5:43:5 | Before x | epilogues.go:43:5:43:5 | x | -| epilogues.go:43:5:43:5 | x | epilogues.go:43:5:43:5 | After x | +| epilogues.go:43:5:43:5 | x | epilogues.go:43:9:43:9 | 0 | | epilogues.go:43:5:43:9 | ...<... | epilogues.go:43:5:43:9 | After ...<... [false] | | epilogues.go:43:5:43:9 | ...<... | epilogues.go:43:5:43:9 | After ...<... [true] | | epilogues.go:43:5:43:9 | After ...<... [false] | epilogues.go:43:2:46:2 | After if statement | | epilogues.go:43:5:43:9 | After ...<... [true] | epilogues.go:43:11:46:2 | block statement | -| epilogues.go:43:5:43:9 | Before ...<... | epilogues.go:43:5:43:5 | Before x | -| epilogues.go:43:9:43:9 | 0 | epilogues.go:43:9:43:9 | After 0 | -| epilogues.go:43:9:43:9 | After 0 | epilogues.go:43:5:43:9 | ...<... | -| epilogues.go:43:9:43:9 | Before 0 | epilogues.go:43:9:43:9 | 0 | +| epilogues.go:43:5:43:9 | Before ...<... | epilogues.go:43:5:43:5 | x | +| epilogues.go:43:9:43:9 | 0 | epilogues.go:43:5:43:9 | ...<... | | epilogues.go:43:11:46:2 | block statement | epilogues.go:44:3:44:13 | ... = ... | | epilogues.go:44:3:44:13 | ... = ... | epilogues.go:44:12:44:13 | Before -... | | epilogues.go:44:3:44:13 | After ... = ... | epilogues.go:45:3:45:8 | Before return statement | | epilogues.go:44:3:44:13 | assign:0 ... = ... | epilogues.go:44:3:44:13 | After ... = ... | | epilogues.go:44:12:44:13 | -... | epilogues.go:44:12:44:13 | After -... | | epilogues.go:44:12:44:13 | After -... | epilogues.go:44:3:44:13 | assign:0 ... = ... | -| epilogues.go:44:12:44:13 | Before -... | epilogues.go:44:13:44:13 | Before x | -| epilogues.go:44:13:44:13 | After x | epilogues.go:44:12:44:13 | -... | -| epilogues.go:44:13:44:13 | Before x | epilogues.go:44:13:44:13 | x | -| epilogues.go:44:13:44:13 | x | epilogues.go:44:13:44:13 | After x | +| epilogues.go:44:12:44:13 | Before -... | epilogues.go:44:13:44:13 | x | +| epilogues.go:44:13:44:13 | x | epilogues.go:44:12:44:13 | -... | | epilogues.go:45:3:45:8 | Before return statement | epilogues.go:45:3:45:8 | return statement | | epilogues.go:45:3:45:8 | return statement | epilogues.go:42:51:48:1 | result-read:0 block statement | -| epilogues.go:47:2:47:14 | Before return statement | epilogues.go:47:9:47:9 | Before x | +| epilogues.go:47:2:47:14 | Before return statement | epilogues.go:47:9:47:9 | x | | epilogues.go:47:2:47:14 | result-write:0 return statement | epilogues.go:47:2:47:14 | result-write:1 return statement | | epilogues.go:47:2:47:14 | result-write:1 return statement | epilogues.go:47:2:47:14 | return statement | | epilogues.go:47:2:47:14 | return statement | epilogues.go:42:51:48:1 | result-read:0 block statement | -| epilogues.go:47:9:47:9 | After x | epilogues.go:47:12:47:14 | Before nil | -| epilogues.go:47:9:47:9 | Before x | epilogues.go:47:9:47:9 | x | -| epilogues.go:47:9:47:9 | x | epilogues.go:47:9:47:9 | After x | -| epilogues.go:47:12:47:14 | After nil | epilogues.go:47:2:47:14 | result-write:0 return statement | -| epilogues.go:47:12:47:14 | Before nil | epilogues.go:47:12:47:14 | nil | -| epilogues.go:47:12:47:14 | nil | epilogues.go:47:12:47:14 | After nil | +| epilogues.go:47:9:47:9 | x | epilogues.go:47:12:47:14 | nil | +| epilogues.go:47:12:47:14 | nil | epilogues.go:47:2:47:14 | result-write:0 return statement | | epilogues.go:51:1:54:1 | After function declaration | epilogues.go:59:1:62:1 | Before function declaration | | epilogues.go:51:1:54:1 | Before function declaration | epilogues.go:51:1:54:1 | function declaration | | epilogues.go:51:1:54:1 | Entry | epilogues.go:51:23:51:23 | x | @@ -298,15 +247,11 @@ | epilogues.go:52:2:52:10 | ... = ... | epilogues.go:52:6:52:10 | Before ...+... | | epilogues.go:52:2:52:10 | After ... = ... | epilogues.go:53:2:53:7 | Before return statement | | epilogues.go:52:2:52:10 | assign:0 ... = ... | epilogues.go:52:2:52:10 | After ... = ... | -| epilogues.go:52:6:52:6 | After x | epilogues.go:52:10:52:10 | Before 1 | -| epilogues.go:52:6:52:6 | Before x | epilogues.go:52:6:52:6 | x | -| epilogues.go:52:6:52:6 | x | epilogues.go:52:6:52:6 | After x | +| epilogues.go:52:6:52:6 | x | epilogues.go:52:10:52:10 | 1 | | epilogues.go:52:6:52:10 | ...+... | epilogues.go:52:6:52:10 | After ...+... | | epilogues.go:52:6:52:10 | After ...+... | epilogues.go:52:2:52:10 | assign:0 ... = ... | -| epilogues.go:52:6:52:10 | Before ...+... | epilogues.go:52:6:52:6 | Before x | -| epilogues.go:52:10:52:10 | 1 | epilogues.go:52:10:52:10 | After 1 | -| epilogues.go:52:10:52:10 | After 1 | epilogues.go:52:6:52:10 | ...+... | -| epilogues.go:52:10:52:10 | Before 1 | epilogues.go:52:10:52:10 | 1 | +| epilogues.go:52:6:52:10 | Before ...+... | epilogues.go:52:6:52:6 | x | +| epilogues.go:52:10:52:10 | 1 | epilogues.go:52:6:52:10 | ...+... | | epilogues.go:53:2:53:7 | Before return statement | epilogues.go:53:2:53:7 | return statement | | epilogues.go:53:2:53:7 | return statement | epilogues.go:51:38:54:1 | result-read:0 block statement | | epilogues.go:59:1:62:1 | After function declaration | epilogues.go:66:1:71:1 | Before function declaration | @@ -323,29 +268,21 @@ | epilogues.go:60:2:60:33 | Before defer statement | epilogues.go:60:8:60:33 | call to log | | epilogues.go:60:2:60:33 | catch-defer-panic defer statement | epilogues.go:59:1:62:1 | Exceptional Exit | | epilogues.go:60:2:60:33 | defer statement | epilogues.go:60:2:60:33 | After defer statement | -| epilogues.go:60:8:60:8 | After l | epilogues.go:60:8:60:12 | selection of log | -| epilogues.go:60:8:60:8 | Before l | epilogues.go:60:8:60:8 | l | -| epilogues.go:60:8:60:8 | l | epilogues.go:60:8:60:8 | After l | -| epilogues.go:60:8:60:12 | After selection of log | epilogues.go:60:14:60:20 | Before "count" | -| epilogues.go:60:8:60:12 | Before selection of log | epilogues.go:60:8:60:8 | Before l | +| epilogues.go:60:8:60:8 | l | epilogues.go:60:8:60:12 | selection of log | +| epilogues.go:60:8:60:12 | After selection of log | epilogues.go:60:14:60:20 | "count" | +| epilogues.go:60:8:60:12 | Before selection of log | epilogues.go:60:8:60:8 | l | | epilogues.go:60:8:60:12 | selection of log | epilogues.go:60:8:60:12 | After selection of log | | epilogues.go:60:8:60:33 | After call to log | epilogues.go:60:2:60:33 | defer statement | | epilogues.go:60:8:60:33 | call to log | epilogues.go:60:8:60:12 | Before selection of log | | epilogues.go:60:8:60:33 | defer-invoke call to log | epilogues.go:59:54:62:1 | After block statement | | epilogues.go:60:8:60:33 | defer-invoke call to log | epilogues.go:60:2:60:33 | catch-defer-panic defer statement | -| epilogues.go:60:14:60:20 | "count" | epilogues.go:60:14:60:20 | After "count" | -| epilogues.go:60:14:60:20 | After "count" | epilogues.go:60:23:60:32 | Before call to len | -| epilogues.go:60:14:60:20 | Before "count" | epilogues.go:60:14:60:20 | "count" | -| epilogues.go:60:23:60:25 | After len | epilogues.go:60:27:60:31 | Before items | -| epilogues.go:60:23:60:25 | Before len | epilogues.go:60:23:60:25 | len | -| epilogues.go:60:23:60:25 | len | epilogues.go:60:23:60:25 | After len | +| epilogues.go:60:14:60:20 | "count" | epilogues.go:60:23:60:32 | Before call to len | +| epilogues.go:60:23:60:25 | len | epilogues.go:60:27:60:31 | items | | epilogues.go:60:23:60:32 | After call to len | epilogues.go:60:8:60:33 | After call to log | -| epilogues.go:60:23:60:32 | Before call to len | epilogues.go:60:23:60:25 | Before len | +| epilogues.go:60:23:60:32 | Before call to len | epilogues.go:60:23:60:25 | len | | epilogues.go:60:23:60:32 | call to len | epilogues.go:60:23:60:32 | After call to len | -| epilogues.go:60:27:60:31 | After items | epilogues.go:60:23:60:32 | call to len | -| epilogues.go:60:27:60:31 | Before items | epilogues.go:60:27:60:31 | items | -| epilogues.go:60:27:60:31 | items | epilogues.go:60:27:60:31 | After items | -| epilogues.go:61:2:61:12 | After selection of Println | epilogues.go:61:14:61:25 | Before "processing" | +| epilogues.go:60:27:60:31 | items | epilogues.go:60:23:60:32 | call to len | +| epilogues.go:61:2:61:12 | After selection of Println | epilogues.go:61:14:61:25 | "processing" | | epilogues.go:61:2:61:12 | Before selection of Println | epilogues.go:61:2:61:12 | selection of Println | | epilogues.go:61:2:61:12 | selection of Println | epilogues.go:61:2:61:12 | After selection of Println | | epilogues.go:61:2:61:38 | After call to Println | epilogues.go:61:2:61:38 | After expression statement | @@ -355,18 +292,12 @@ | epilogues.go:61:2:61:38 | call to Println | epilogues.go:61:2:61:38 | catch-panic expression statement | | epilogues.go:61:2:61:38 | catch-panic expression statement | epilogues.go:60:8:60:33 | defer-invoke call to log | | epilogues.go:61:2:61:38 | expression statement | epilogues.go:61:2:61:38 | Before call to Println | -| epilogues.go:61:14:61:25 | "processing" | epilogues.go:61:14:61:25 | After "processing" | -| epilogues.go:61:14:61:25 | After "processing" | epilogues.go:61:28:61:37 | Before call to len | -| epilogues.go:61:14:61:25 | Before "processing" | epilogues.go:61:14:61:25 | "processing" | -| epilogues.go:61:28:61:30 | After len | epilogues.go:61:32:61:36 | Before items | -| epilogues.go:61:28:61:30 | Before len | epilogues.go:61:28:61:30 | len | -| epilogues.go:61:28:61:30 | len | epilogues.go:61:28:61:30 | After len | +| epilogues.go:61:14:61:25 | "processing" | epilogues.go:61:28:61:37 | Before call to len | +| epilogues.go:61:28:61:30 | len | epilogues.go:61:32:61:36 | items | | epilogues.go:61:28:61:37 | After call to len | epilogues.go:61:2:61:38 | call to Println | -| epilogues.go:61:28:61:37 | Before call to len | epilogues.go:61:28:61:30 | Before len | +| epilogues.go:61:28:61:37 | Before call to len | epilogues.go:61:28:61:30 | len | | epilogues.go:61:28:61:37 | call to len | epilogues.go:61:28:61:37 | After call to len | -| epilogues.go:61:32:61:36 | After items | epilogues.go:61:28:61:37 | call to len | -| epilogues.go:61:32:61:36 | Before items | epilogues.go:61:32:61:36 | items | -| epilogues.go:61:32:61:36 | items | epilogues.go:61:32:61:36 | After items | +| epilogues.go:61:32:61:36 | items | epilogues.go:61:28:61:37 | call to len | | epilogues.go:66:1:71:1 | After function declaration | epilogues.go:77:1:82:1 | Before function declaration | | epilogues.go:66:1:71:1 | Before function declaration | epilogues.go:66:1:71:1 | function declaration | | epilogues.go:66:1:71:1 | Entry | epilogues.go:66:28:66:33 | prefix | @@ -383,34 +314,28 @@ | epilogues.go:67:7:67:31 | Before struct literal | epilogues.go:67:7:67:31 | struct literal | | epilogues.go:67:7:67:31 | struct literal | epilogues.go:67:17:67:30 | Before key-value pair | | epilogues.go:67:17:67:30 | After key-value pair | epilogues.go:67:17:67:30 | lit-init key-value pair | -| epilogues.go:67:17:67:30 | Before key-value pair | epilogues.go:67:25:67:30 | Before prefix | +| epilogues.go:67:17:67:30 | Before key-value pair | epilogues.go:67:25:67:30 | prefix | | epilogues.go:67:17:67:30 | key-value pair | epilogues.go:67:17:67:30 | After key-value pair | | epilogues.go:67:17:67:30 | lit-init key-value pair | epilogues.go:67:7:67:31 | After struct literal | -| epilogues.go:67:25:67:30 | After prefix | epilogues.go:67:17:67:30 | key-value pair | -| epilogues.go:67:25:67:30 | Before prefix | epilogues.go:67:25:67:30 | prefix | -| epilogues.go:67:25:67:30 | prefix | epilogues.go:67:25:67:30 | After prefix | +| epilogues.go:67:25:67:30 | prefix | epilogues.go:67:17:67:30 | key-value pair | | epilogues.go:68:2:68:24 | After defer statement | epilogues.go:69:2:69:25 | Before defer statement | | epilogues.go:68:2:68:24 | Before defer statement | epilogues.go:68:8:68:24 | call to logValue | | epilogues.go:68:2:68:24 | catch-defer-panic defer statement | epilogues.go:66:1:71:1 | Exceptional Exit | | epilogues.go:68:2:68:24 | defer statement | epilogues.go:68:2:68:24 | After defer statement | -| epilogues.go:68:8:68:8 | After l | epilogues.go:68:8:68:17 | selection of logValue | -| epilogues.go:68:8:68:8 | Before l | epilogues.go:68:8:68:8 | l | -| epilogues.go:68:8:68:8 | l | epilogues.go:68:8:68:8 | After l | -| epilogues.go:68:8:68:17 | After selection of logValue | epilogues.go:68:19:68:23 | Before "bye" | -| epilogues.go:68:8:68:17 | Before selection of logValue | epilogues.go:68:8:68:8 | Before l | +| epilogues.go:68:8:68:8 | l | epilogues.go:68:8:68:17 | selection of logValue | +| epilogues.go:68:8:68:17 | After selection of logValue | epilogues.go:68:19:68:23 | "bye" | +| epilogues.go:68:8:68:17 | Before selection of logValue | epilogues.go:68:8:68:8 | l | | epilogues.go:68:8:68:17 | selection of logValue | epilogues.go:68:8:68:17 | After selection of logValue | | epilogues.go:68:8:68:24 | After call to logValue | epilogues.go:68:2:68:24 | defer statement | | epilogues.go:68:8:68:24 | call to logValue | epilogues.go:68:8:68:17 | Before selection of logValue | | epilogues.go:68:8:68:24 | defer-invoke call to logValue | epilogues.go:66:43:71:1 | After block statement | | epilogues.go:68:8:68:24 | defer-invoke call to logValue | epilogues.go:68:2:68:24 | catch-defer-panic defer statement | -| epilogues.go:68:19:68:23 | "bye" | epilogues.go:68:19:68:23 | After "bye" | -| epilogues.go:68:19:68:23 | After "bye" | epilogues.go:68:8:68:24 | After call to logValue | -| epilogues.go:68:19:68:23 | Before "bye" | epilogues.go:68:19:68:23 | "bye" | +| epilogues.go:68:19:68:23 | "bye" | epilogues.go:68:8:68:24 | After call to logValue | | epilogues.go:69:2:69:25 | After defer statement | epilogues.go:70:2:70:20 | expression statement | | epilogues.go:69:2:69:25 | Before defer statement | epilogues.go:69:8:69:25 | call to log | | epilogues.go:69:2:69:25 | catch-defer-panic defer statement | epilogues.go:68:8:68:24 | defer-invoke call to logValue | | epilogues.go:69:2:69:25 | defer statement | epilogues.go:69:2:69:25 | After defer statement | -| epilogues.go:69:8:69:15 | After selection of log | epilogues.go:69:17:69:21 | Before "ptr" | +| epilogues.go:69:8:69:15 | After selection of log | epilogues.go:69:17:69:21 | "ptr" | | epilogues.go:69:8:69:15 | Before selection of log | epilogues.go:69:9:69:10 | Before &... | | epilogues.go:69:8:69:15 | selection of log | epilogues.go:69:8:69:15 | After selection of log | | epilogues.go:69:8:69:25 | After call to log | epilogues.go:69:2:69:25 | defer statement | @@ -419,17 +344,11 @@ | epilogues.go:69:8:69:25 | defer-invoke call to log | epilogues.go:69:2:69:25 | catch-defer-panic defer statement | | epilogues.go:69:9:69:10 | &... | epilogues.go:69:9:69:10 | After &... | | epilogues.go:69:9:69:10 | After &... | epilogues.go:69:8:69:15 | selection of log | -| epilogues.go:69:9:69:10 | Before &... | epilogues.go:69:10:69:10 | Before l | -| epilogues.go:69:10:69:10 | After l | epilogues.go:69:9:69:10 | &... | -| epilogues.go:69:10:69:10 | Before l | epilogues.go:69:10:69:10 | l | -| epilogues.go:69:10:69:10 | l | epilogues.go:69:10:69:10 | After l | -| epilogues.go:69:17:69:21 | "ptr" | epilogues.go:69:17:69:21 | After "ptr" | -| epilogues.go:69:17:69:21 | After "ptr" | epilogues.go:69:24:69:24 | Before 7 | -| epilogues.go:69:17:69:21 | Before "ptr" | epilogues.go:69:17:69:21 | "ptr" | -| epilogues.go:69:24:69:24 | 7 | epilogues.go:69:24:69:24 | After 7 | -| epilogues.go:69:24:69:24 | After 7 | epilogues.go:69:8:69:25 | After call to log | -| epilogues.go:69:24:69:24 | Before 7 | epilogues.go:69:24:69:24 | 7 | -| epilogues.go:70:2:70:12 | After selection of Println | epilogues.go:70:14:70:19 | Before "body" | +| epilogues.go:69:9:69:10 | Before &... | epilogues.go:69:10:69:10 | l | +| epilogues.go:69:10:69:10 | l | epilogues.go:69:9:69:10 | &... | +| epilogues.go:69:17:69:21 | "ptr" | epilogues.go:69:24:69:24 | 7 | +| epilogues.go:69:24:69:24 | 7 | epilogues.go:69:8:69:25 | After call to log | +| epilogues.go:70:2:70:12 | After selection of Println | epilogues.go:70:14:70:19 | "body" | | epilogues.go:70:2:70:12 | Before selection of Println | epilogues.go:70:2:70:12 | selection of Println | | epilogues.go:70:2:70:12 | selection of Println | epilogues.go:70:2:70:12 | After selection of Println | | epilogues.go:70:2:70:20 | After call to Println | epilogues.go:70:2:70:20 | After expression statement | @@ -439,9 +358,7 @@ | epilogues.go:70:2:70:20 | call to Println | epilogues.go:70:2:70:20 | catch-panic expression statement | | epilogues.go:70:2:70:20 | catch-panic expression statement | epilogues.go:69:8:69:25 | defer-invoke call to log | | epilogues.go:70:2:70:20 | expression statement | epilogues.go:70:2:70:20 | Before call to Println | -| epilogues.go:70:14:70:19 | "body" | epilogues.go:70:14:70:19 | After "body" | -| epilogues.go:70:14:70:19 | After "body" | epilogues.go:70:2:70:20 | call to Println | -| epilogues.go:70:14:70:19 | Before "body" | epilogues.go:70:14:70:19 | "body" | +| epilogues.go:70:14:70:19 | "body" | epilogues.go:70:2:70:20 | call to Println | | epilogues.go:77:1:82:1 | After function declaration | epilogues.go:87:1:98:1 | Before function declaration | | epilogues.go:77:1:82:1 | Before function declaration | epilogues.go:77:1:82:1 | function declaration | | epilogues.go:77:1:82:1 | Entry | epilogues.go:77:22:77:22 | x | @@ -455,7 +372,7 @@ | epilogues.go:78:2:80:15 | Before defer statement | epilogues.go:78:8:80:15 | function call | | epilogues.go:78:2:80:15 | catch-defer-panic defer statement | epilogues.go:77:1:82:1 | Exceptional Exit | | epilogues.go:78:2:80:15 | defer statement | epilogues.go:78:2:80:15 | After defer statement | -| epilogues.go:78:8:80:2 | After function literal | epilogues.go:80:4:80:9 | Before "done" | +| epilogues.go:78:8:80:2 | After function literal | epilogues.go:80:4:80:9 | "done" | | epilogues.go:78:8:80:2 | Before function literal | epilogues.go:78:8:80:2 | function literal | | epilogues.go:78:8:80:2 | Entry | epilogues.go:78:13:78:17 | label | | epilogues.go:78:8:80:2 | Exceptional Exit | epilogues.go:78:8:80:2 | Exit | @@ -469,7 +386,7 @@ | epilogues.go:78:27:78:27 | n | epilogues.go:78:34:80:2 | block statement | | epilogues.go:78:34:80:2 | After block statement | epilogues.go:78:8:80:2 | Normal Exit | | epilogues.go:78:34:80:2 | block statement | epilogues.go:79:3:79:23 | expression statement | -| epilogues.go:79:3:79:13 | After selection of Println | epilogues.go:79:15:79:19 | Before label | +| epilogues.go:79:3:79:13 | After selection of Println | epilogues.go:79:15:79:19 | label | | epilogues.go:79:3:79:13 | Before selection of Println | epilogues.go:79:3:79:13 | selection of Println | | epilogues.go:79:3:79:13 | selection of Println | epilogues.go:79:3:79:13 | After selection of Println | | epilogues.go:79:3:79:23 | After call to Println | epilogues.go:79:3:79:23 | After expression statement | @@ -478,25 +395,15 @@ | epilogues.go:79:3:79:23 | call to Println | epilogues.go:78:8:80:2 | Exceptional Exit | | epilogues.go:79:3:79:23 | call to Println | epilogues.go:79:3:79:23 | After call to Println | | epilogues.go:79:3:79:23 | expression statement | epilogues.go:79:3:79:23 | Before call to Println | -| epilogues.go:79:15:79:19 | After label | epilogues.go:79:22:79:22 | Before n | -| epilogues.go:79:15:79:19 | Before label | epilogues.go:79:15:79:19 | label | -| epilogues.go:79:15:79:19 | label | epilogues.go:79:15:79:19 | After label | -| epilogues.go:79:22:79:22 | After n | epilogues.go:79:3:79:23 | call to Println | -| epilogues.go:79:22:79:22 | Before n | epilogues.go:79:22:79:22 | n | -| epilogues.go:79:22:79:22 | n | epilogues.go:79:22:79:22 | After n | -| epilogues.go:80:4:80:9 | "done" | epilogues.go:80:4:80:9 | After "done" | -| epilogues.go:80:4:80:9 | After "done" | epilogues.go:80:12:80:14 | Before ...+... | -| epilogues.go:80:4:80:9 | Before "done" | epilogues.go:80:4:80:9 | "done" | -| epilogues.go:80:12:80:12 | After x | epilogues.go:80:14:80:14 | Before 1 | -| epilogues.go:80:12:80:12 | Before x | epilogues.go:80:12:80:12 | x | -| epilogues.go:80:12:80:12 | x | epilogues.go:80:12:80:12 | After x | +| epilogues.go:79:15:79:19 | label | epilogues.go:79:22:79:22 | n | +| epilogues.go:79:22:79:22 | n | epilogues.go:79:3:79:23 | call to Println | +| epilogues.go:80:4:80:9 | "done" | epilogues.go:80:12:80:14 | Before ...+... | +| epilogues.go:80:12:80:12 | x | epilogues.go:80:14:80:14 | 1 | | epilogues.go:80:12:80:14 | ...+... | epilogues.go:80:12:80:14 | After ...+... | | epilogues.go:80:12:80:14 | After ...+... | epilogues.go:78:8:80:15 | After function call | -| epilogues.go:80:12:80:14 | Before ...+... | epilogues.go:80:12:80:12 | Before x | -| epilogues.go:80:14:80:14 | 1 | epilogues.go:80:14:80:14 | After 1 | -| epilogues.go:80:14:80:14 | After 1 | epilogues.go:80:12:80:14 | ...+... | -| epilogues.go:80:14:80:14 | Before 1 | epilogues.go:80:14:80:14 | 1 | -| epilogues.go:81:2:81:12 | After selection of Println | epilogues.go:81:14:81:19 | Before "body" | +| epilogues.go:80:12:80:14 | Before ...+... | epilogues.go:80:12:80:12 | x | +| epilogues.go:80:14:80:14 | 1 | epilogues.go:80:12:80:14 | ...+... | +| epilogues.go:81:2:81:12 | After selection of Println | epilogues.go:81:14:81:19 | "body" | | epilogues.go:81:2:81:12 | Before selection of Println | epilogues.go:81:2:81:12 | selection of Println | | epilogues.go:81:2:81:12 | selection of Println | epilogues.go:81:2:81:12 | After selection of Println | | epilogues.go:81:2:81:23 | After call to Println | epilogues.go:81:2:81:23 | After expression statement | @@ -506,12 +413,8 @@ | epilogues.go:81:2:81:23 | call to Println | epilogues.go:81:2:81:23 | catch-panic expression statement | | epilogues.go:81:2:81:23 | catch-panic expression statement | epilogues.go:78:8:80:15 | defer-invoke function call | | epilogues.go:81:2:81:23 | expression statement | epilogues.go:81:2:81:23 | Before call to Println | -| epilogues.go:81:14:81:19 | "body" | epilogues.go:81:14:81:19 | After "body" | -| epilogues.go:81:14:81:19 | After "body" | epilogues.go:81:22:81:22 | Before x | -| epilogues.go:81:14:81:19 | Before "body" | epilogues.go:81:14:81:19 | "body" | -| epilogues.go:81:22:81:22 | After x | epilogues.go:81:2:81:23 | call to Println | -| epilogues.go:81:22:81:22 | Before x | epilogues.go:81:22:81:22 | x | -| epilogues.go:81:22:81:22 | x | epilogues.go:81:22:81:22 | After x | +| epilogues.go:81:14:81:19 | "body" | epilogues.go:81:22:81:22 | x | +| epilogues.go:81:22:81:22 | x | epilogues.go:81:2:81:23 | call to Println | | epilogues.go:87:1:98:1 | After function declaration | epilogues.go:102:1:110:1 | Before function declaration | | epilogues.go:87:1:98:1 | Before function declaration | epilogues.go:87:1:98:1 | function declaration | | epilogues.go:87:1:98:1 | Entry | epilogues.go:87:22:87:22 | x | @@ -543,23 +446,17 @@ | epilogues.go:89:6:89:19 | ... := ... | epilogues.go:89:11:89:19 | Before call to recover | | epilogues.go:89:6:89:19 | After ... := ... | epilogues.go:89:22:89:29 | Before ...!=... | | epilogues.go:89:6:89:19 | assign:0 ... := ... | epilogues.go:89:6:89:19 | After ... := ... | -| epilogues.go:89:11:89:17 | After recover | epilogues.go:89:11:89:19 | call to recover | -| epilogues.go:89:11:89:17 | Before recover | epilogues.go:89:11:89:17 | recover | -| epilogues.go:89:11:89:17 | recover | epilogues.go:89:11:89:17 | After recover | +| epilogues.go:89:11:89:17 | recover | epilogues.go:89:11:89:19 | call to recover | | epilogues.go:89:11:89:19 | After call to recover | epilogues.go:89:6:89:19 | assign:0 ... := ... | -| epilogues.go:89:11:89:19 | Before call to recover | epilogues.go:89:11:89:17 | Before recover | +| epilogues.go:89:11:89:19 | Before call to recover | epilogues.go:89:11:89:17 | recover | | epilogues.go:89:11:89:19 | call to recover | epilogues.go:89:11:89:19 | After call to recover | -| epilogues.go:89:22:89:22 | After r | epilogues.go:89:27:89:29 | Before nil | -| epilogues.go:89:22:89:22 | Before r | epilogues.go:89:22:89:22 | r | -| epilogues.go:89:22:89:22 | r | epilogues.go:89:22:89:22 | After r | +| epilogues.go:89:22:89:22 | r | epilogues.go:89:27:89:29 | nil | | epilogues.go:89:22:89:29 | ...!=... | epilogues.go:89:22:89:29 | After ...!=... [false] | | epilogues.go:89:22:89:29 | ...!=... | epilogues.go:89:22:89:29 | After ...!=... [true] | | epilogues.go:89:22:89:29 | After ...!=... [false] | epilogues.go:89:3:91:3 | After if statement | | epilogues.go:89:22:89:29 | After ...!=... [true] | epilogues.go:89:31:91:3 | block statement | -| epilogues.go:89:22:89:29 | Before ...!=... | epilogues.go:89:22:89:22 | Before r | -| epilogues.go:89:27:89:29 | After nil | epilogues.go:89:22:89:29 | ...!=... | -| epilogues.go:89:27:89:29 | Before nil | epilogues.go:89:27:89:29 | nil | -| epilogues.go:89:27:89:29 | nil | epilogues.go:89:27:89:29 | After nil | +| epilogues.go:89:22:89:29 | Before ...!=... | epilogues.go:89:22:89:22 | r | +| epilogues.go:89:27:89:29 | nil | epilogues.go:89:22:89:29 | ...!=... | | epilogues.go:89:31:91:3 | After block statement | epilogues.go:89:3:91:3 | After if statement | | epilogues.go:89:31:91:3 | block statement | epilogues.go:90:4:90:14 | ... = ... | | epilogues.go:90:4:90:14 | ... = ... | epilogues.go:90:13:90:14 | Before -... | @@ -571,46 +468,32 @@ | epilogues.go:93:2:95:2 | After if statement | epilogues.go:96:2:96:15 | ... = ... | | epilogues.go:93:2:95:2 | catch-panic if statement | epilogues.go:88:8:92:4 | defer-invoke function call | | epilogues.go:93:2:95:2 | if statement | epilogues.go:93:5:93:9 | Before ...<... | -| epilogues.go:93:5:93:5 | After x | epilogues.go:93:9:93:9 | Before 0 | -| epilogues.go:93:5:93:5 | Before x | epilogues.go:93:5:93:5 | x | -| epilogues.go:93:5:93:5 | x | epilogues.go:93:5:93:5 | After x | +| epilogues.go:93:5:93:5 | x | epilogues.go:93:9:93:9 | 0 | | epilogues.go:93:5:93:9 | ...<... | epilogues.go:93:5:93:9 | After ...<... [false] | | epilogues.go:93:5:93:9 | ...<... | epilogues.go:93:5:93:9 | After ...<... [true] | | epilogues.go:93:5:93:9 | After ...<... [false] | epilogues.go:93:2:95:2 | After if statement | | epilogues.go:93:5:93:9 | After ...<... [true] | epilogues.go:93:11:95:2 | block statement | -| epilogues.go:93:5:93:9 | Before ...<... | epilogues.go:93:5:93:5 | Before x | -| epilogues.go:93:9:93:9 | 0 | epilogues.go:93:9:93:9 | After 0 | -| epilogues.go:93:9:93:9 | After 0 | epilogues.go:93:5:93:9 | ...<... | -| epilogues.go:93:9:93:9 | Before 0 | epilogues.go:93:9:93:9 | 0 | +| epilogues.go:93:5:93:9 | Before ...<... | epilogues.go:93:5:93:5 | x | +| epilogues.go:93:9:93:9 | 0 | epilogues.go:93:5:93:9 | ...<... | | epilogues.go:93:11:95:2 | block statement | epilogues.go:94:3:94:14 | expression statement | -| epilogues.go:94:3:94:7 | After panic | epilogues.go:94:9:94:13 | Before "neg" | -| epilogues.go:94:3:94:7 | Before panic | epilogues.go:94:3:94:7 | panic | -| epilogues.go:94:3:94:7 | panic | epilogues.go:94:3:94:7 | After panic | -| epilogues.go:94:3:94:14 | Before call to panic | epilogues.go:94:3:94:7 | Before panic | +| epilogues.go:94:3:94:7 | panic | epilogues.go:94:9:94:13 | "neg" | +| epilogues.go:94:3:94:14 | Before call to panic | epilogues.go:94:3:94:7 | panic | | epilogues.go:94:3:94:14 | call to panic | epilogues.go:93:2:95:2 | catch-panic if statement | | epilogues.go:94:3:94:14 | expression statement | epilogues.go:94:3:94:14 | Before call to panic | -| epilogues.go:94:9:94:13 | "neg" | epilogues.go:94:9:94:13 | After "neg" | -| epilogues.go:94:9:94:13 | After "neg" | epilogues.go:94:3:94:14 | call to panic | -| epilogues.go:94:9:94:13 | Before "neg" | epilogues.go:94:9:94:13 | "neg" | +| epilogues.go:94:9:94:13 | "neg" | epilogues.go:94:3:94:14 | call to panic | | epilogues.go:96:2:96:15 | ... = ... | epilogues.go:96:11:96:15 | Before ...*... | | epilogues.go:96:2:96:15 | After ... = ... | epilogues.go:97:2:97:14 | Before return statement | | epilogues.go:96:2:96:15 | assign:0 ... = ... | epilogues.go:96:2:96:15 | After ... = ... | -| epilogues.go:96:11:96:11 | After x | epilogues.go:96:15:96:15 | Before x | -| epilogues.go:96:11:96:11 | Before x | epilogues.go:96:11:96:11 | x | -| epilogues.go:96:11:96:11 | x | epilogues.go:96:11:96:11 | After x | +| epilogues.go:96:11:96:11 | x | epilogues.go:96:15:96:15 | x | | epilogues.go:96:11:96:15 | ...*... | epilogues.go:96:11:96:15 | After ...*... | | epilogues.go:96:11:96:15 | After ...*... | epilogues.go:96:2:96:15 | assign:0 ... = ... | -| epilogues.go:96:11:96:15 | Before ...*... | epilogues.go:96:11:96:11 | Before x | -| epilogues.go:96:15:96:15 | After x | epilogues.go:96:11:96:15 | ...*... | -| epilogues.go:96:15:96:15 | Before x | epilogues.go:96:15:96:15 | x | -| epilogues.go:96:15:96:15 | x | epilogues.go:96:15:96:15 | After x | -| epilogues.go:97:2:97:14 | Before return statement | epilogues.go:97:9:97:14 | Before result | +| epilogues.go:96:11:96:15 | Before ...*... | epilogues.go:96:11:96:11 | x | +| epilogues.go:96:15:96:15 | x | epilogues.go:96:11:96:15 | ...*... | +| epilogues.go:97:2:97:14 | Before return statement | epilogues.go:97:9:97:14 | result | | epilogues.go:97:2:97:14 | catch-return return statement | epilogues.go:88:8:92:4 | defer-invoke function call | | epilogues.go:97:2:97:14 | result-write:0 return statement | epilogues.go:97:2:97:14 | return statement | | epilogues.go:97:2:97:14 | return statement | epilogues.go:97:2:97:14 | catch-return return statement | -| epilogues.go:97:9:97:14 | After result | epilogues.go:97:2:97:14 | result-write:0 return statement | -| epilogues.go:97:9:97:14 | Before result | epilogues.go:97:9:97:14 | result | -| epilogues.go:97:9:97:14 | result | epilogues.go:97:9:97:14 | After result | +| epilogues.go:97:9:97:14 | result | epilogues.go:97:2:97:14 | result-write:0 return statement | | epilogues.go:102:1:110:1 | After function declaration | epilogues.go:115:1:118:1 | Before function declaration | | epilogues.go:102:1:110:1 | Before function declaration | epilogues.go:102:1:110:1 | function declaration | | epilogues.go:102:1:110:1 | Entry | epilogues.go:102:26:102:26 | x | @@ -628,42 +511,32 @@ | epilogues.go:103:2:103:19 | Before defer statement | epilogues.go:103:8:103:19 | call to epiRecover | | epilogues.go:103:2:103:19 | catch-defer-panic defer statement | epilogues.go:102:1:110:1 | Exceptional Exit | | epilogues.go:103:2:103:19 | defer statement | epilogues.go:103:2:103:19 | After defer statement | -| epilogues.go:103:8:103:17 | After epiRecover | epilogues.go:103:8:103:19 | After call to epiRecover | -| epilogues.go:103:8:103:17 | Before epiRecover | epilogues.go:103:8:103:17 | epiRecover | -| epilogues.go:103:8:103:17 | epiRecover | epilogues.go:103:8:103:17 | After epiRecover | +| epilogues.go:103:8:103:17 | epiRecover | epilogues.go:103:8:103:19 | After call to epiRecover | | epilogues.go:103:8:103:19 | After call to epiRecover | epilogues.go:103:2:103:19 | defer statement | -| epilogues.go:103:8:103:19 | call to epiRecover | epilogues.go:103:8:103:17 | Before epiRecover | +| epilogues.go:103:8:103:19 | call to epiRecover | epilogues.go:103:8:103:17 | epiRecover | | epilogues.go:103:8:103:19 | defer-invoke call to epiRecover | epilogues.go:102:50:110:1 | result-read:0 block statement | | epilogues.go:103:8:103:19 | defer-invoke call to epiRecover | epilogues.go:103:2:103:19 | catch-defer-panic defer statement | | epilogues.go:104:2:106:2 | After if statement | epilogues.go:107:2:107:6 | ... = ... | | epilogues.go:104:2:106:2 | catch-return if statement | epilogues.go:103:8:103:19 | defer-invoke call to epiRecover | | epilogues.go:104:2:106:2 | if statement | epilogues.go:104:5:104:10 | Before ...==... | -| epilogues.go:104:5:104:5 | After x | epilogues.go:104:10:104:10 | Before 0 | -| epilogues.go:104:5:104:5 | Before x | epilogues.go:104:5:104:5 | x | -| epilogues.go:104:5:104:5 | x | epilogues.go:104:5:104:5 | After x | +| epilogues.go:104:5:104:5 | x | epilogues.go:104:10:104:10 | 0 | | epilogues.go:104:5:104:10 | ...==... | epilogues.go:104:5:104:10 | After ...==... [false] | | epilogues.go:104:5:104:10 | ...==... | epilogues.go:104:5:104:10 | After ...==... [true] | | epilogues.go:104:5:104:10 | After ...==... [false] | epilogues.go:104:2:106:2 | After if statement | | epilogues.go:104:5:104:10 | After ...==... [true] | epilogues.go:104:12:106:2 | block statement | -| epilogues.go:104:5:104:10 | Before ...==... | epilogues.go:104:5:104:5 | Before x | -| epilogues.go:104:10:104:10 | 0 | epilogues.go:104:10:104:10 | After 0 | -| epilogues.go:104:10:104:10 | After 0 | epilogues.go:104:5:104:10 | ...==... | -| epilogues.go:104:10:104:10 | Before 0 | epilogues.go:104:10:104:10 | 0 | +| epilogues.go:104:5:104:10 | Before ...==... | epilogues.go:104:5:104:5 | x | +| epilogues.go:104:10:104:10 | 0 | epilogues.go:104:5:104:10 | ...==... | | epilogues.go:104:12:106:2 | block statement | epilogues.go:105:3:105:8 | Before return statement | | epilogues.go:105:3:105:8 | Before return statement | epilogues.go:105:3:105:8 | return statement | | epilogues.go:105:3:105:8 | return statement | epilogues.go:104:2:106:2 | catch-return if statement | -| epilogues.go:107:2:107:6 | ... = ... | epilogues.go:107:6:107:6 | Before x | +| epilogues.go:107:2:107:6 | ... = ... | epilogues.go:107:6:107:6 | x | | epilogues.go:107:2:107:6 | After ... = ... | epilogues.go:108:2:108:10 | ... = ... | | epilogues.go:107:2:107:6 | assign:0 ... = ... | epilogues.go:107:2:107:6 | After ... = ... | -| epilogues.go:107:6:107:6 | After x | epilogues.go:107:2:107:6 | assign:0 ... = ... | -| epilogues.go:107:6:107:6 | Before x | epilogues.go:107:6:107:6 | x | -| epilogues.go:107:6:107:6 | x | epilogues.go:107:6:107:6 | After x | -| epilogues.go:108:2:108:10 | ... = ... | epilogues.go:108:7:108:10 | Before true | +| epilogues.go:107:6:107:6 | x | epilogues.go:107:2:107:6 | assign:0 ... = ... | +| epilogues.go:108:2:108:10 | ... = ... | epilogues.go:108:7:108:10 | true | | epilogues.go:108:2:108:10 | After ... = ... | epilogues.go:109:2:109:7 | Before return statement | | epilogues.go:108:2:108:10 | assign:0 ... = ... | epilogues.go:108:2:108:10 | After ... = ... | -| epilogues.go:108:7:108:10 | After true | epilogues.go:108:2:108:10 | assign:0 ... = ... | -| epilogues.go:108:7:108:10 | Before true | epilogues.go:108:7:108:10 | true | -| epilogues.go:108:7:108:10 | true | epilogues.go:108:7:108:10 | After true | +| epilogues.go:108:7:108:10 | true | epilogues.go:108:2:108:10 | assign:0 ... = ... | | epilogues.go:109:2:109:7 | Before return statement | epilogues.go:109:2:109:7 | return statement | | epilogues.go:109:2:109:7 | catch-return return statement | epilogues.go:103:8:103:19 | defer-invoke call to epiRecover | | epilogues.go:109:2:109:7 | return statement | epilogues.go:109:2:109:7 | catch-return return statement | @@ -679,23 +552,17 @@ | epilogues.go:116:2:116:19 | Before defer statement | epilogues.go:116:8:116:19 | call to epiRecover | | epilogues.go:116:2:116:19 | catch-defer-panic defer statement | epilogues.go:115:1:118:1 | Exceptional Exit | | epilogues.go:116:2:116:19 | defer statement | epilogues.go:116:2:116:19 | After defer statement | -| epilogues.go:116:8:116:17 | After epiRecover | epilogues.go:116:8:116:19 | After call to epiRecover | -| epilogues.go:116:8:116:17 | Before epiRecover | epilogues.go:116:8:116:17 | epiRecover | -| epilogues.go:116:8:116:17 | epiRecover | epilogues.go:116:8:116:17 | After epiRecover | +| epilogues.go:116:8:116:17 | epiRecover | epilogues.go:116:8:116:19 | After call to epiRecover | | epilogues.go:116:8:116:19 | After call to epiRecover | epilogues.go:116:2:116:19 | defer statement | -| epilogues.go:116:8:116:19 | call to epiRecover | epilogues.go:116:8:116:17 | Before epiRecover | +| epilogues.go:116:8:116:19 | call to epiRecover | epilogues.go:116:8:116:17 | epiRecover | | epilogues.go:116:8:116:19 | defer-invoke call to epiRecover | epilogues.go:115:26:118:1 | After block statement | | epilogues.go:116:8:116:19 | defer-invoke call to epiRecover | epilogues.go:116:2:116:19 | catch-defer-panic defer statement | -| epilogues.go:117:2:117:6 | After panic | epilogues.go:117:8:117:13 | Before "boom" | -| epilogues.go:117:2:117:6 | Before panic | epilogues.go:117:2:117:6 | panic | -| epilogues.go:117:2:117:6 | panic | epilogues.go:117:2:117:6 | After panic | -| epilogues.go:117:2:117:14 | Before call to panic | epilogues.go:117:2:117:6 | Before panic | +| epilogues.go:117:2:117:6 | panic | epilogues.go:117:8:117:13 | "boom" | +| epilogues.go:117:2:117:14 | Before call to panic | epilogues.go:117:2:117:6 | panic | | epilogues.go:117:2:117:14 | call to panic | epilogues.go:117:2:117:14 | catch-panic expression statement | | epilogues.go:117:2:117:14 | catch-panic expression statement | epilogues.go:116:8:116:19 | defer-invoke call to epiRecover | | epilogues.go:117:2:117:14 | expression statement | epilogues.go:117:2:117:14 | Before call to panic | -| epilogues.go:117:8:117:13 | "boom" | epilogues.go:117:8:117:13 | After "boom" | -| epilogues.go:117:8:117:13 | After "boom" | epilogues.go:117:2:117:14 | call to panic | -| epilogues.go:117:8:117:13 | Before "boom" | epilogues.go:117:8:117:13 | "boom" | +| epilogues.go:117:8:117:13 | "boom" | epilogues.go:117:2:117:14 | call to panic | | equalitytests.go:0:0:0:0 | After equalitytests.go | equalitytests.go:0:0:0:0 | Normal Exit | | equalitytests.go:0:0:0:0 | Entry | equalitytests.go:0:0:0:0 | equalitytests.go | | equalitytests.go:0:0:0:0 | Normal Exit | equalitytests.go:0:0:0:0 | Exit | @@ -726,14 +593,12 @@ | equalitytests.go:11:211:13:1 | block statement | equalitytests.go:12:2:12:76 | Before return statement | | equalitytests.go:12:2:12:76 | Before return statement | equalitytests.go:12:9:12:76 | ...&&... | | equalitytests.go:12:2:12:76 | return statement | equalitytests.go:11:1:13:1 | Normal Exit | -| equalitytests.go:12:9:12:10 | After i1 | equalitytests.go:12:15:12:16 | Before i2 | -| equalitytests.go:12:9:12:10 | Before i1 | equalitytests.go:12:9:12:10 | i1 | -| equalitytests.go:12:9:12:10 | i1 | equalitytests.go:12:9:12:10 | After i1 | +| equalitytests.go:12:9:12:10 | i1 | equalitytests.go:12:15:12:16 | i2 | | equalitytests.go:12:9:12:16 | ...==... | equalitytests.go:12:9:12:16 | After ...==... [false] | | equalitytests.go:12:9:12:16 | ...==... | equalitytests.go:12:9:12:16 | After ...==... [true] | | equalitytests.go:12:9:12:16 | After ...==... [false] | equalitytests.go:12:9:12:28 | After ...&&... [false] | | equalitytests.go:12:9:12:16 | After ...==... [true] | equalitytests.go:12:21:12:28 | Before ...==... | -| equalitytests.go:12:9:12:16 | Before ...==... | equalitytests.go:12:9:12:10 | Before i1 | +| equalitytests.go:12:9:12:16 | Before ...==... | equalitytests.go:12:9:12:10 | i1 | | equalitytests.go:12:9:12:28 | ...&&... | equalitytests.go:12:9:12:16 | Before ...==... | | equalitytests.go:12:9:12:28 | After ...&&... [false] | equalitytests.go:12:9:12:40 | After ...&&... [false] | | equalitytests.go:12:9:12:28 | After ...&&... [true] | equalitytests.go:12:33:12:40 | Before ...==... | @@ -748,62 +613,40 @@ | equalitytests.go:12:9:12:64 | After ...&&... [true] | equalitytests.go:12:69:12:76 | Before ...==... | | equalitytests.go:12:9:12:76 | ...&&... | equalitytests.go:12:9:12:64 | ...&&... | | equalitytests.go:12:9:12:76 | After ...&&... | equalitytests.go:12:2:12:76 | return statement | -| equalitytests.go:12:15:12:16 | After i2 | equalitytests.go:12:9:12:16 | ...==... | -| equalitytests.go:12:15:12:16 | Before i2 | equalitytests.go:12:15:12:16 | i2 | -| equalitytests.go:12:15:12:16 | i2 | equalitytests.go:12:15:12:16 | After i2 | -| equalitytests.go:12:21:12:22 | After e1 | equalitytests.go:12:27:12:28 | Before e2 | -| equalitytests.go:12:21:12:22 | Before e1 | equalitytests.go:12:21:12:22 | e1 | -| equalitytests.go:12:21:12:22 | e1 | equalitytests.go:12:21:12:22 | After e1 | +| equalitytests.go:12:15:12:16 | i2 | equalitytests.go:12:9:12:16 | ...==... | +| equalitytests.go:12:21:12:22 | e1 | equalitytests.go:12:27:12:28 | e2 | | equalitytests.go:12:21:12:28 | ...==... | equalitytests.go:12:21:12:28 | After ...==... [false] | | equalitytests.go:12:21:12:28 | ...==... | equalitytests.go:12:21:12:28 | After ...==... [true] | | equalitytests.go:12:21:12:28 | After ...==... [false] | equalitytests.go:12:9:12:28 | After ...&&... [false] | | equalitytests.go:12:21:12:28 | After ...==... [true] | equalitytests.go:12:9:12:28 | After ...&&... [true] | -| equalitytests.go:12:21:12:28 | Before ...==... | equalitytests.go:12:21:12:22 | Before e1 | -| equalitytests.go:12:27:12:28 | After e2 | equalitytests.go:12:21:12:28 | ...==... | -| equalitytests.go:12:27:12:28 | Before e2 | equalitytests.go:12:27:12:28 | e2 | -| equalitytests.go:12:27:12:28 | e2 | equalitytests.go:12:27:12:28 | After e2 | -| equalitytests.go:12:33:12:34 | After s1 | equalitytests.go:12:39:12:40 | Before s2 | -| equalitytests.go:12:33:12:34 | Before s1 | equalitytests.go:12:33:12:34 | s1 | -| equalitytests.go:12:33:12:34 | s1 | equalitytests.go:12:33:12:34 | After s1 | +| equalitytests.go:12:21:12:28 | Before ...==... | equalitytests.go:12:21:12:22 | e1 | +| equalitytests.go:12:27:12:28 | e2 | equalitytests.go:12:21:12:28 | ...==... | +| equalitytests.go:12:33:12:34 | s1 | equalitytests.go:12:39:12:40 | s2 | | equalitytests.go:12:33:12:40 | ...==... | equalitytests.go:12:33:12:40 | After ...==... [false] | | equalitytests.go:12:33:12:40 | ...==... | equalitytests.go:12:33:12:40 | After ...==... [true] | | equalitytests.go:12:33:12:40 | After ...==... [false] | equalitytests.go:12:9:12:40 | After ...&&... [false] | | equalitytests.go:12:33:12:40 | After ...==... [true] | equalitytests.go:12:9:12:40 | After ...&&... [true] | -| equalitytests.go:12:33:12:40 | Before ...==... | equalitytests.go:12:33:12:34 | Before s1 | -| equalitytests.go:12:39:12:40 | After s2 | equalitytests.go:12:33:12:40 | ...==... | -| equalitytests.go:12:39:12:40 | Before s2 | equalitytests.go:12:39:12:40 | s2 | -| equalitytests.go:12:39:12:40 | s2 | equalitytests.go:12:39:12:40 | After s2 | -| equalitytests.go:12:45:12:46 | After s3 | equalitytests.go:12:51:12:52 | Before s4 | -| equalitytests.go:12:45:12:46 | Before s3 | equalitytests.go:12:45:12:46 | s3 | -| equalitytests.go:12:45:12:46 | s3 | equalitytests.go:12:45:12:46 | After s3 | +| equalitytests.go:12:33:12:40 | Before ...==... | equalitytests.go:12:33:12:34 | s1 | +| equalitytests.go:12:39:12:40 | s2 | equalitytests.go:12:33:12:40 | ...==... | +| equalitytests.go:12:45:12:46 | s3 | equalitytests.go:12:51:12:52 | s4 | | equalitytests.go:12:45:12:52 | ...==... | equalitytests.go:12:45:12:52 | After ...==... [false] | | equalitytests.go:12:45:12:52 | ...==... | equalitytests.go:12:45:12:52 | After ...==... [true] | | equalitytests.go:12:45:12:52 | After ...==... [false] | equalitytests.go:12:9:12:52 | After ...&&... [false] | | equalitytests.go:12:45:12:52 | After ...==... [true] | equalitytests.go:12:9:12:52 | After ...&&... [true] | -| equalitytests.go:12:45:12:52 | Before ...==... | equalitytests.go:12:45:12:46 | Before s3 | -| equalitytests.go:12:51:12:52 | After s4 | equalitytests.go:12:45:12:52 | ...==... | -| equalitytests.go:12:51:12:52 | Before s4 | equalitytests.go:12:51:12:52 | s4 | -| equalitytests.go:12:51:12:52 | s4 | equalitytests.go:12:51:12:52 | After s4 | -| equalitytests.go:12:57:12:58 | After a1 | equalitytests.go:12:63:12:64 | Before a2 | -| equalitytests.go:12:57:12:58 | Before a1 | equalitytests.go:12:57:12:58 | a1 | -| equalitytests.go:12:57:12:58 | a1 | equalitytests.go:12:57:12:58 | After a1 | +| equalitytests.go:12:45:12:52 | Before ...==... | equalitytests.go:12:45:12:46 | s3 | +| equalitytests.go:12:51:12:52 | s4 | equalitytests.go:12:45:12:52 | ...==... | +| equalitytests.go:12:57:12:58 | a1 | equalitytests.go:12:63:12:64 | a2 | | equalitytests.go:12:57:12:64 | ...==... | equalitytests.go:12:57:12:64 | After ...==... [false] | | equalitytests.go:12:57:12:64 | ...==... | equalitytests.go:12:57:12:64 | After ...==... [true] | | equalitytests.go:12:57:12:64 | After ...==... [false] | equalitytests.go:12:9:12:64 | After ...&&... [false] | | equalitytests.go:12:57:12:64 | After ...==... [true] | equalitytests.go:12:9:12:64 | After ...&&... [true] | -| equalitytests.go:12:57:12:64 | Before ...==... | equalitytests.go:12:57:12:58 | Before a1 | -| equalitytests.go:12:63:12:64 | After a2 | equalitytests.go:12:57:12:64 | ...==... | -| equalitytests.go:12:63:12:64 | Before a2 | equalitytests.go:12:63:12:64 | a2 | -| equalitytests.go:12:63:12:64 | a2 | equalitytests.go:12:63:12:64 | After a2 | -| equalitytests.go:12:69:12:70 | After a3 | equalitytests.go:12:75:12:76 | Before a4 | -| equalitytests.go:12:69:12:70 | Before a3 | equalitytests.go:12:69:12:70 | a3 | -| equalitytests.go:12:69:12:70 | a3 | equalitytests.go:12:69:12:70 | After a3 | +| equalitytests.go:12:57:12:64 | Before ...==... | equalitytests.go:12:57:12:58 | a1 | +| equalitytests.go:12:63:12:64 | a2 | equalitytests.go:12:57:12:64 | ...==... | +| equalitytests.go:12:69:12:70 | a3 | equalitytests.go:12:75:12:76 | a4 | | equalitytests.go:12:69:12:76 | ...==... | equalitytests.go:12:69:12:76 | After ...==... | | equalitytests.go:12:69:12:76 | After ...==... | equalitytests.go:12:9:12:76 | After ...&&... | -| equalitytests.go:12:69:12:76 | Before ...==... | equalitytests.go:12:69:12:70 | Before a3 | -| equalitytests.go:12:75:12:76 | After a4 | equalitytests.go:12:69:12:76 | ...==... | -| equalitytests.go:12:75:12:76 | Before a4 | equalitytests.go:12:75:12:76 | a4 | -| equalitytests.go:12:75:12:76 | a4 | equalitytests.go:12:75:12:76 | After a4 | +| equalitytests.go:12:69:12:76 | Before ...==... | equalitytests.go:12:69:12:70 | a3 | +| equalitytests.go:12:75:12:76 | a4 | equalitytests.go:12:69:12:76 | ...==... | | exprs.go:0:0:0:0 | After exprs.go | exprs.go:0:0:0:0 | Normal Exit | | exprs.go:0:0:0:0 | Entry | exprs.go:0:0:0:0 | exprs.go | | exprs.go:0:0:0:0 | Exceptional Exit | exprs.go:0:0:0:0 | Exit | @@ -826,10 +669,8 @@ | exprs.go:6:6:6:26 | After value declaration specifier | exprs.go:6:2:6:26 | After variable declaration | | exprs.go:6:6:6:26 | assign:0 value declaration specifier | exprs.go:6:6:6:26 | assign:1 value declaration specifier | | exprs.go:6:6:6:26 | assign:1 value declaration specifier | exprs.go:6:6:6:26 | After value declaration specifier | -| exprs.go:6:6:6:26 | value declaration specifier | exprs.go:6:13:6:13 | Before 0 | -| exprs.go:6:13:6:13 | 0 | exprs.go:6:13:6:13 | After 0 | -| exprs.go:6:13:6:13 | After 0 | exprs.go:6:16:6:26 | Before ...+... | -| exprs.go:6:13:6:13 | Before 0 | exprs.go:6:13:6:13 | 0 | +| exprs.go:6:6:6:26 | value declaration specifier | exprs.go:6:13:6:13 | 0 | +| exprs.go:6:13:6:13 | 0 | exprs.go:6:16:6:26 | Before ...+... | | exprs.go:6:16:6:26 | ...+... | exprs.go:6:16:6:26 | After ...+... | | exprs.go:6:16:6:26 | After ...+... | exprs.go:6:6:6:26 | assign:0 value declaration specifier | | exprs.go:6:16:6:26 | Before ...+... | exprs.go:6:16:6:26 | ...+... | @@ -840,36 +681,26 @@ | exprs.go:7:6:7:16 | After value declaration specifier | exprs.go:7:2:7:16 | After variable declaration | | exprs.go:7:6:7:16 | assign:0 value declaration specifier | exprs.go:7:6:7:16 | After value declaration specifier | | exprs.go:7:6:7:16 | value declaration specifier | exprs.go:7:10:7:16 | Before ...+... | -| exprs.go:7:10:7:10 | After i | exprs.go:7:14:7:16 | Before ...*... | -| exprs.go:7:10:7:10 | Before i | exprs.go:7:10:7:10 | i | -| exprs.go:7:10:7:10 | i | exprs.go:7:10:7:10 | After i | +| exprs.go:7:10:7:10 | i | exprs.go:7:14:7:16 | Before ...*... | | exprs.go:7:10:7:16 | ...+... | exprs.go:7:10:7:16 | After ...+... | | exprs.go:7:10:7:16 | After ...+... | exprs.go:7:6:7:16 | assign:0 value declaration specifier | -| exprs.go:7:10:7:16 | Before ...+... | exprs.go:7:10:7:10 | Before i | -| exprs.go:7:14:7:14 | 2 | exprs.go:7:14:7:14 | After 2 | -| exprs.go:7:14:7:14 | After 2 | exprs.go:7:16:7:16 | Before j | -| exprs.go:7:14:7:14 | Before 2 | exprs.go:7:14:7:14 | 2 | +| exprs.go:7:10:7:16 | Before ...+... | exprs.go:7:10:7:10 | i | +| exprs.go:7:14:7:14 | 2 | exprs.go:7:16:7:16 | j | | exprs.go:7:14:7:16 | ...*... | exprs.go:7:14:7:16 | After ...*... | | exprs.go:7:14:7:16 | After ...*... | exprs.go:7:10:7:16 | ...+... | -| exprs.go:7:14:7:16 | Before ...*... | exprs.go:7:14:7:14 | Before 2 | -| exprs.go:7:16:7:16 | After j | exprs.go:7:14:7:16 | ...*... | -| exprs.go:7:16:7:16 | Before j | exprs.go:7:16:7:16 | j | -| exprs.go:7:16:7:16 | j | exprs.go:7:16:7:16 | After j | +| exprs.go:7:14:7:16 | Before ...*... | exprs.go:7:14:7:14 | 2 | +| exprs.go:7:16:7:16 | j | exprs.go:7:14:7:16 | ...*... | | exprs.go:8:2:8:24 | ... := ... | exprs.go:8:7:8:24 | Before ...+... | | exprs.go:8:2:8:24 | After ... := ... | exprs.go:9:2:9:61 | ... := ... | | exprs.go:8:2:8:24 | assign:0 ... := ... | exprs.go:8:2:8:24 | After ... := ... | -| exprs.go:8:7:8:12 | "k = " | exprs.go:8:7:8:12 | After "k = " | -| exprs.go:8:7:8:12 | After "k = " | exprs.go:8:16:8:24 | Before type conversion | -| exprs.go:8:7:8:12 | Before "k = " | exprs.go:8:7:8:12 | "k = " | +| exprs.go:8:7:8:12 | "k = " | exprs.go:8:16:8:24 | Before type conversion | | exprs.go:8:7:8:24 | ...+... | exprs.go:8:7:8:24 | After ...+... | | exprs.go:8:7:8:24 | After ...+... | exprs.go:8:2:8:24 | assign:0 ... := ... | -| exprs.go:8:7:8:24 | Before ...+... | exprs.go:8:7:8:12 | Before "k = " | +| exprs.go:8:7:8:24 | Before ...+... | exprs.go:8:7:8:12 | "k = " | | exprs.go:8:16:8:24 | After type conversion | exprs.go:8:7:8:24 | ...+... | -| exprs.go:8:16:8:24 | Before type conversion | exprs.go:8:23:8:23 | Before k | +| exprs.go:8:16:8:24 | Before type conversion | exprs.go:8:23:8:23 | k | | exprs.go:8:16:8:24 | type conversion | exprs.go:8:16:8:24 | After type conversion | -| exprs.go:8:23:8:23 | After k | exprs.go:8:16:8:24 | type conversion | -| exprs.go:8:23:8:23 | Before k | exprs.go:8:23:8:23 | k | -| exprs.go:8:23:8:23 | k | exprs.go:8:23:8:23 | After k | +| exprs.go:8:23:8:23 | k | exprs.go:8:16:8:24 | type conversion | | exprs.go:9:2:9:61 | ... := ... | exprs.go:9:8:9:61 | Before function literal | | exprs.go:9:2:9:61 | After ... := ... | exprs.go:10:2:10:32 | ... := ... | | exprs.go:9:2:9:61 | assign:0 ... := ... | exprs.go:9:2:9:61 | After ... := ... | @@ -884,24 +715,18 @@ | exprs.go:9:39:9:61 | block statement | exprs.go:9:41:9:59 | Before return statement | | exprs.go:9:41:9:59 | Before return statement | exprs.go:9:48:9:59 | Before ...<... | | exprs.go:9:41:9:59 | return statement | exprs.go:9:8:9:61 | Normal Exit | -| exprs.go:9:48:9:48 | After a | exprs.go:9:50:9:50 | Before b | -| exprs.go:9:48:9:48 | Before a | exprs.go:9:48:9:48 | a | -| exprs.go:9:48:9:48 | a | exprs.go:9:48:9:48 | After a | +| exprs.go:9:48:9:48 | a | exprs.go:9:50:9:50 | b | | exprs.go:9:48:9:50 | ...*... | exprs.go:9:48:9:50 | After ...*... | | exprs.go:9:48:9:50 | After ...*... | exprs.go:9:54:9:59 | Before type conversion | -| exprs.go:9:48:9:50 | Before ...*... | exprs.go:9:48:9:48 | Before a | +| exprs.go:9:48:9:50 | Before ...*... | exprs.go:9:48:9:48 | a | | exprs.go:9:48:9:59 | ...<... | exprs.go:9:48:9:59 | After ...<... | | exprs.go:9:48:9:59 | After ...<... | exprs.go:9:41:9:59 | return statement | | exprs.go:9:48:9:59 | Before ...<... | exprs.go:9:48:9:50 | Before ...*... | -| exprs.go:9:50:9:50 | After b | exprs.go:9:48:9:50 | ...*... | -| exprs.go:9:50:9:50 | Before b | exprs.go:9:50:9:50 | b | -| exprs.go:9:50:9:50 | b | exprs.go:9:50:9:50 | After b | +| exprs.go:9:50:9:50 | b | exprs.go:9:48:9:50 | ...*... | | exprs.go:9:54:9:59 | After type conversion | exprs.go:9:48:9:59 | ...<... | -| exprs.go:9:54:9:59 | Before type conversion | exprs.go:9:58:9:58 | Before z | +| exprs.go:9:54:9:59 | Before type conversion | exprs.go:9:58:9:58 | z | | exprs.go:9:54:9:59 | type conversion | exprs.go:9:54:9:59 | After type conversion | -| exprs.go:9:58:9:58 | After z | exprs.go:9:54:9:59 | type conversion | -| exprs.go:9:58:9:58 | Before z | exprs.go:9:58:9:58 | z | -| exprs.go:9:58:9:58 | z | exprs.go:9:58:9:58 | After z | +| exprs.go:9:58:9:58 | z | exprs.go:9:54:9:59 | type conversion | | exprs.go:10:2:10:32 | ... := ... | exprs.go:10:13:10:32 | Before struct literal | | exprs.go:10:2:10:32 | After ... := ... | exprs.go:11:2:14:21 | ... := ... | | exprs.go:10:2:10:32 | assign:0 ... := ... | exprs.go:10:2:10:32 | After ... := ... | @@ -913,25 +738,18 @@ | exprs.go:11:2:14:21 | assign:0 ... := ... | exprs.go:11:2:14:21 | After ... := ... | | exprs.go:11:13:14:21 | After struct literal | exprs.go:11:2:14:21 | assign:0 ... := ... | | exprs.go:11:13:14:21 | Before struct literal | exprs.go:11:13:14:21 | struct literal | -| exprs.go:11:13:14:21 | struct literal | exprs.go:14:4:14:4 | Before k | +| exprs.go:11:13:14:21 | struct literal | exprs.go:14:4:14:4 | k | | exprs.go:14:4:14:4 | After k | exprs.go:14:4:14:4 | lit-init k | -| exprs.go:14:4:14:4 | Before k | exprs.go:14:4:14:4 | k | | exprs.go:14:4:14:4 | k | exprs.go:14:4:14:4 | After k | | exprs.go:14:4:14:4 | lit-init k | exprs.go:14:7:14:20 | Before call to fn | -| exprs.go:14:7:14:8 | After fn | exprs.go:14:10:14:10 | Before i | -| exprs.go:14:7:14:8 | Before fn | exprs.go:14:7:14:8 | fn | -| exprs.go:14:7:14:8 | fn | exprs.go:14:7:14:8 | After fn | +| exprs.go:14:7:14:8 | fn | exprs.go:14:10:14:10 | i | | exprs.go:14:7:14:20 | After call to fn | exprs.go:14:7:14:20 | lit-init call to fn | -| exprs.go:14:7:14:20 | Before call to fn | exprs.go:14:7:14:8 | Before fn | +| exprs.go:14:7:14:20 | Before call to fn | exprs.go:14:7:14:8 | fn | | exprs.go:14:7:14:20 | call to fn | exprs.go:5:1:26:1 | Exceptional Exit | | exprs.go:14:7:14:20 | call to fn | exprs.go:14:7:14:20 | After call to fn | | exprs.go:14:7:14:20 | lit-init call to fn | exprs.go:11:13:14:21 | After struct literal | -| exprs.go:14:10:14:10 | After i | exprs.go:14:13:14:13 | Before j | -| exprs.go:14:10:14:10 | Before i | exprs.go:14:10:14:10 | i | -| exprs.go:14:10:14:10 | i | exprs.go:14:10:14:10 | After i | -| exprs.go:14:13:14:13 | After j | exprs.go:14:16:14:19 | Before .../... | -| exprs.go:14:13:14:13 | Before j | exprs.go:14:13:14:13 | j | -| exprs.go:14:13:14:13 | j | exprs.go:14:13:14:13 | After j | +| exprs.go:14:10:14:10 | i | exprs.go:14:13:14:13 | j | +| exprs.go:14:13:14:13 | j | exprs.go:14:16:14:19 | Before .../... | | exprs.go:14:16:14:19 | .../... | exprs.go:14:16:14:19 | After .../... | | exprs.go:14:16:14:19 | After .../... | exprs.go:14:7:14:20 | call to fn | | exprs.go:14:16:14:19 | Before .../... | exprs.go:14:16:14:19 | .../... | @@ -945,21 +763,17 @@ | exprs.go:15:32:15:43 | Before key-value pair | exprs.go:15:35:15:43 | Before selection of x | | exprs.go:15:32:15:43 | key-value pair | exprs.go:15:32:15:43 | After key-value pair | | exprs.go:15:32:15:43 | lit-init key-value pair | exprs.go:15:46:15:57 | Before key-value pair | -| exprs.go:15:35:15:41 | After struct1 | exprs.go:15:35:15:43 | selection of x | -| exprs.go:15:35:15:41 | Before struct1 | exprs.go:15:35:15:41 | struct1 | -| exprs.go:15:35:15:41 | struct1 | exprs.go:15:35:15:41 | After struct1 | +| exprs.go:15:35:15:41 | struct1 | exprs.go:15:35:15:43 | selection of x | | exprs.go:15:35:15:43 | After selection of x | exprs.go:15:32:15:43 | key-value pair | -| exprs.go:15:35:15:43 | Before selection of x | exprs.go:15:35:15:41 | Before struct1 | +| exprs.go:15:35:15:43 | Before selection of x | exprs.go:15:35:15:41 | struct1 | | exprs.go:15:35:15:43 | selection of x | exprs.go:15:35:15:43 | After selection of x | | exprs.go:15:46:15:57 | After key-value pair | exprs.go:15:46:15:57 | lit-init key-value pair | | exprs.go:15:46:15:57 | Before key-value pair | exprs.go:15:49:15:57 | Before selection of x | | exprs.go:15:46:15:57 | key-value pair | exprs.go:15:46:15:57 | After key-value pair | | exprs.go:15:46:15:57 | lit-init key-value pair | exprs.go:15:13:15:58 | After struct literal | -| exprs.go:15:49:15:55 | After struct2 | exprs.go:15:49:15:57 | selection of x | -| exprs.go:15:49:15:55 | Before struct2 | exprs.go:15:49:15:55 | struct2 | -| exprs.go:15:49:15:55 | struct2 | exprs.go:15:49:15:55 | After struct2 | +| exprs.go:15:49:15:55 | struct2 | exprs.go:15:49:15:57 | selection of x | | exprs.go:15:49:15:57 | After selection of x | exprs.go:15:46:15:57 | key-value pair | -| exprs.go:15:49:15:57 | Before selection of x | exprs.go:15:49:15:55 | Before struct2 | +| exprs.go:15:49:15:57 | Before selection of x | exprs.go:15:49:15:55 | struct2 | | exprs.go:15:49:15:57 | selection of x | exprs.go:15:49:15:57 | After selection of x | | exprs.go:16:2:16:26 | ... := ... | exprs.go:16:10:16:26 | Before array literal | | exprs.go:16:2:16:26 | After ... := ... | exprs.go:17:2:17:40 | ... := ... | @@ -967,11 +781,9 @@ | exprs.go:16:10:16:26 | After array literal | exprs.go:16:2:16:26 | assign:0 ... := ... | | exprs.go:16:10:16:26 | Before array literal | exprs.go:16:10:16:26 | array literal | | exprs.go:16:10:16:26 | array literal | exprs.go:16:17:16:25 | Before selection of x | -| exprs.go:16:17:16:23 | After struct3 | exprs.go:16:17:16:25 | selection of x | -| exprs.go:16:17:16:23 | Before struct3 | exprs.go:16:17:16:23 | struct3 | -| exprs.go:16:17:16:23 | struct3 | exprs.go:16:17:16:23 | After struct3 | +| exprs.go:16:17:16:23 | struct3 | exprs.go:16:17:16:25 | selection of x | | exprs.go:16:17:16:25 | After selection of x | exprs.go:16:17:16:25 | lit-init selection of x | -| exprs.go:16:17:16:25 | Before selection of x | exprs.go:16:17:16:23 | Before struct3 | +| exprs.go:16:17:16:25 | Before selection of x | exprs.go:16:17:16:23 | struct3 | | exprs.go:16:17:16:25 | lit-init selection of x | exprs.go:16:10:16:26 | After array literal | | exprs.go:16:17:16:25 | selection of x | exprs.go:16:17:16:25 | After selection of x | | exprs.go:17:2:17:40 | ... := ... | exprs.go:17:10:17:40 | Before array literal | @@ -980,42 +792,32 @@ | exprs.go:17:10:17:40 | After array literal | exprs.go:17:2:17:40 | assign:0 ... := ... | | exprs.go:17:10:17:40 | Before array literal | exprs.go:17:10:17:40 | array literal | | exprs.go:17:10:17:40 | array literal | exprs.go:17:19:17:27 | Before selection of x | -| exprs.go:17:19:17:25 | After struct3 | exprs.go:17:19:17:27 | selection of x | -| exprs.go:17:19:17:25 | Before struct3 | exprs.go:17:19:17:25 | struct3 | -| exprs.go:17:19:17:25 | struct3 | exprs.go:17:19:17:25 | After struct3 | +| exprs.go:17:19:17:25 | struct3 | exprs.go:17:19:17:27 | selection of x | | exprs.go:17:19:17:27 | After selection of x | exprs.go:17:19:17:27 | lit-init selection of x | -| exprs.go:17:19:17:27 | Before selection of x | exprs.go:17:19:17:25 | Before struct3 | +| exprs.go:17:19:17:27 | Before selection of x | exprs.go:17:19:17:25 | struct3 | | exprs.go:17:19:17:27 | lit-init selection of x | exprs.go:17:30:17:39 | Before key-value pair | | exprs.go:17:19:17:27 | selection of x | exprs.go:17:19:17:27 | After selection of x | -| exprs.go:17:30:17:30 | 2 | exprs.go:17:30:17:30 | After 2 | -| exprs.go:17:30:17:30 | After 2 | exprs.go:17:33:17:39 | Before index expression | -| exprs.go:17:30:17:30 | Before 2 | exprs.go:17:30:17:30 | 2 | +| exprs.go:17:30:17:30 | 2 | exprs.go:17:33:17:39 | Before index expression | | exprs.go:17:30:17:39 | After key-value pair | exprs.go:17:30:17:39 | lit-init key-value pair | -| exprs.go:17:30:17:39 | Before key-value pair | exprs.go:17:30:17:30 | Before 2 | +| exprs.go:17:30:17:39 | Before key-value pair | exprs.go:17:30:17:30 | 2 | | exprs.go:17:30:17:39 | key-value pair | exprs.go:17:30:17:39 | After key-value pair | | exprs.go:17:30:17:39 | lit-init key-value pair | exprs.go:17:10:17:40 | After array literal | -| exprs.go:17:33:17:36 | After arr1 | exprs.go:17:38:17:38 | Before 0 | -| exprs.go:17:33:17:36 | Before arr1 | exprs.go:17:33:17:36 | arr1 | -| exprs.go:17:33:17:36 | arr1 | exprs.go:17:33:17:36 | After arr1 | +| exprs.go:17:33:17:36 | arr1 | exprs.go:17:38:17:38 | 0 | | exprs.go:17:33:17:39 | After index expression | exprs.go:17:30:17:39 | key-value pair | -| exprs.go:17:33:17:39 | Before index expression | exprs.go:17:33:17:36 | Before arr1 | +| exprs.go:17:33:17:39 | Before index expression | exprs.go:17:33:17:36 | arr1 | | exprs.go:17:33:17:39 | index expression | exprs.go:5:1:26:1 | Exceptional Exit | | exprs.go:17:33:17:39 | index expression | exprs.go:17:33:17:39 | After index expression | -| exprs.go:17:38:17:38 | 0 | exprs.go:17:38:17:38 | After 0 | -| exprs.go:17:38:17:38 | After 0 | exprs.go:17:33:17:39 | index expression | -| exprs.go:17:38:17:38 | Before 0 | exprs.go:17:38:17:38 | 0 | +| exprs.go:17:38:17:38 | 0 | exprs.go:17:33:17:39 | index expression | | exprs.go:18:2:18:22 | ... := ... | exprs.go:18:9:18:22 | Before slice literal | | exprs.go:18:2:18:22 | After ... := ... | exprs.go:19:2:19:38 | ... := ... | | exprs.go:18:2:18:22 | assign:0 ... := ... | exprs.go:18:2:18:22 | After ... := ... | | exprs.go:18:9:18:22 | After slice literal | exprs.go:18:2:18:22 | assign:0 ... := ... | | exprs.go:18:9:18:22 | Before slice literal | exprs.go:18:9:18:22 | slice literal | -| exprs.go:18:9:18:22 | slice literal | exprs.go:18:18:18:18 | Before s | +| exprs.go:18:9:18:22 | slice literal | exprs.go:18:18:18:18 | s | | exprs.go:18:18:18:18 | After s | exprs.go:18:18:18:18 | lit-init s | -| exprs.go:18:18:18:18 | Before s | exprs.go:18:18:18:18 | s | -| exprs.go:18:18:18:18 | lit-init s | exprs.go:18:21:18:21 | Before s | +| exprs.go:18:18:18:18 | lit-init s | exprs.go:18:21:18:21 | s | | exprs.go:18:18:18:18 | s | exprs.go:18:18:18:18 | After s | | exprs.go:18:21:18:21 | After s | exprs.go:18:21:18:21 | lit-init s | -| exprs.go:18:21:18:21 | Before s | exprs.go:18:21:18:21 | s | | exprs.go:18:21:18:21 | lit-init s | exprs.go:18:9:18:22 | After slice literal | | exprs.go:18:21:18:21 | s | exprs.go:18:21:18:21 | After s | | exprs.go:19:2:19:38 | ... := ... | exprs.go:19:8:19:38 | Before map literal | @@ -1024,135 +826,89 @@ | exprs.go:19:8:19:38 | After map literal | exprs.go:19:2:19:38 | assign:0 ... := ... | | exprs.go:19:8:19:38 | Before map literal | exprs.go:19:8:19:38 | map literal | | exprs.go:19:8:19:38 | map literal | exprs.go:19:23:19:37 | Before key-value pair | -| exprs.go:19:23:19:25 | After slc | exprs.go:19:27:19:27 | Before 0 | -| exprs.go:19:23:19:25 | Before slc | exprs.go:19:23:19:25 | slc | -| exprs.go:19:23:19:25 | slc | exprs.go:19:23:19:25 | After slc | +| exprs.go:19:23:19:25 | slc | exprs.go:19:27:19:27 | 0 | | exprs.go:19:23:19:28 | After index expression | exprs.go:19:31:19:37 | Before index expression | -| exprs.go:19:23:19:28 | Before index expression | exprs.go:19:23:19:25 | Before slc | +| exprs.go:19:23:19:28 | Before index expression | exprs.go:19:23:19:25 | slc | | exprs.go:19:23:19:28 | index expression | exprs.go:5:1:26:1 | Exceptional Exit | | exprs.go:19:23:19:28 | index expression | exprs.go:19:23:19:28 | After index expression | | exprs.go:19:23:19:37 | After key-value pair | exprs.go:19:23:19:37 | lit-init key-value pair | | exprs.go:19:23:19:37 | Before key-value pair | exprs.go:19:23:19:28 | Before index expression | | exprs.go:19:23:19:37 | key-value pair | exprs.go:19:23:19:37 | After key-value pair | | exprs.go:19:23:19:37 | lit-init key-value pair | exprs.go:19:8:19:38 | After map literal | -| exprs.go:19:27:19:27 | 0 | exprs.go:19:27:19:27 | After 0 | -| exprs.go:19:27:19:27 | After 0 | exprs.go:19:23:19:28 | index expression | -| exprs.go:19:27:19:27 | Before 0 | exprs.go:19:27:19:27 | 0 | -| exprs.go:19:31:19:34 | After arr2 | exprs.go:19:36:19:36 | Before 1 | -| exprs.go:19:31:19:34 | Before arr2 | exprs.go:19:31:19:34 | arr2 | -| exprs.go:19:31:19:34 | arr2 | exprs.go:19:31:19:34 | After arr2 | +| exprs.go:19:27:19:27 | 0 | exprs.go:19:23:19:28 | index expression | +| exprs.go:19:31:19:34 | arr2 | exprs.go:19:36:19:36 | 1 | | exprs.go:19:31:19:37 | After index expression | exprs.go:19:23:19:37 | key-value pair | -| exprs.go:19:31:19:37 | Before index expression | exprs.go:19:31:19:34 | Before arr2 | +| exprs.go:19:31:19:37 | Before index expression | exprs.go:19:31:19:34 | arr2 | | exprs.go:19:31:19:37 | index expression | exprs.go:5:1:26:1 | Exceptional Exit | | exprs.go:19:31:19:37 | index expression | exprs.go:19:31:19:37 | After index expression | -| exprs.go:19:36:19:36 | 1 | exprs.go:19:36:19:36 | After 1 | -| exprs.go:19:36:19:36 | After 1 | exprs.go:19:31:19:37 | index expression | -| exprs.go:19:36:19:36 | Before 1 | exprs.go:19:36:19:36 | 1 | +| exprs.go:19:36:19:36 | 1 | exprs.go:19:31:19:37 | index expression | | exprs.go:20:2:20:19 | ... := ... | exprs.go:20:10:20:19 | Before slice expression | | exprs.go:20:2:20:19 | After ... := ... | exprs.go:21:2:21:19 | ... := ... | | exprs.go:20:2:20:19 | assign:0 ... := ... | exprs.go:20:2:20:19 | After ... := ... | -| exprs.go:20:10:20:12 | After slc | exprs.go:20:14:20:14 | Before 1 | -| exprs.go:20:10:20:12 | Before slc | exprs.go:20:10:20:12 | slc | -| exprs.go:20:10:20:12 | slc | exprs.go:20:10:20:12 | After slc | +| exprs.go:20:10:20:12 | slc | exprs.go:20:14:20:14 | 1 | | exprs.go:20:10:20:19 | After slice expression | exprs.go:20:2:20:19 | assign:0 ... := ... | -| exprs.go:20:10:20:19 | Before slice expression | exprs.go:20:10:20:12 | Before slc | +| exprs.go:20:10:20:19 | Before slice expression | exprs.go:20:10:20:12 | slc | | exprs.go:20:10:20:19 | slice expression | exprs.go:20:10:20:19 | After slice expression | -| exprs.go:20:14:20:14 | 1 | exprs.go:20:14:20:14 | After 1 | -| exprs.go:20:14:20:14 | After 1 | exprs.go:20:16:20:16 | Before 2 | -| exprs.go:20:14:20:14 | Before 1 | exprs.go:20:14:20:14 | 1 | -| exprs.go:20:16:20:16 | 2 | exprs.go:20:16:20:16 | After 2 | -| exprs.go:20:16:20:16 | After 2 | exprs.go:20:18:20:18 | Before 3 | -| exprs.go:20:16:20:16 | Before 2 | exprs.go:20:16:20:16 | 2 | -| exprs.go:20:18:20:18 | 3 | exprs.go:20:18:20:18 | After 3 | -| exprs.go:20:18:20:18 | After 3 | exprs.go:20:10:20:19 | slice expression | -| exprs.go:20:18:20:18 | Before 3 | exprs.go:20:18:20:18 | 3 | +| exprs.go:20:14:20:14 | 1 | exprs.go:20:16:20:16 | 2 | +| exprs.go:20:16:20:16 | 2 | exprs.go:20:18:20:18 | 3 | +| exprs.go:20:18:20:18 | 3 | exprs.go:20:10:20:19 | slice expression | | exprs.go:21:2:21:19 | ... := ... | exprs.go:21:10:21:19 | Before slice expression | | exprs.go:21:2:21:19 | After ... := ... | exprs.go:22:2:22:18 | ... := ... | | exprs.go:21:2:21:19 | assign:0 ... := ... | exprs.go:21:2:21:19 | After ... := ... | -| exprs.go:21:10:21:13 | After slc2 | exprs.go:21:16:21:16 | Before 2 | -| exprs.go:21:10:21:13 | Before slc2 | exprs.go:21:10:21:13 | slc2 | -| exprs.go:21:10:21:13 | slc2 | exprs.go:21:10:21:13 | After slc2 | +| exprs.go:21:10:21:13 | slc2 | exprs.go:21:16:21:16 | 2 | | exprs.go:21:10:21:19 | After slice expression | exprs.go:21:2:21:19 | assign:0 ... := ... | -| exprs.go:21:10:21:19 | Before slice expression | exprs.go:21:10:21:13 | Before slc2 | +| exprs.go:21:10:21:19 | Before slice expression | exprs.go:21:10:21:13 | slc2 | | exprs.go:21:10:21:19 | slice expression | exprs.go:21:10:21:19 | After slice expression | -| exprs.go:21:16:21:16 | 2 | exprs.go:21:16:21:16 | After 2 | -| exprs.go:21:16:21:16 | After 2 | exprs.go:21:18:21:18 | Before 3 | -| exprs.go:21:16:21:16 | Before 2 | exprs.go:21:16:21:16 | 2 | -| exprs.go:21:18:21:18 | 3 | exprs.go:21:18:21:18 | After 3 | -| exprs.go:21:18:21:18 | After 3 | exprs.go:21:10:21:19 | slice expression | -| exprs.go:21:18:21:18 | Before 3 | exprs.go:21:18:21:18 | 3 | +| exprs.go:21:16:21:16 | 2 | exprs.go:21:18:21:18 | 3 | +| exprs.go:21:18:21:18 | 3 | exprs.go:21:10:21:19 | slice expression | | exprs.go:22:2:22:18 | ... := ... | exprs.go:22:10:22:18 | Before slice expression | | exprs.go:22:2:22:18 | After ... := ... | exprs.go:23:2:23:17 | ... := ... | | exprs.go:22:2:22:18 | assign:0 ... := ... | exprs.go:22:2:22:18 | After ... := ... | -| exprs.go:22:10:22:13 | After slc3 | exprs.go:22:15:22:15 | Before 0 | -| exprs.go:22:10:22:13 | Before slc3 | exprs.go:22:10:22:13 | slc3 | -| exprs.go:22:10:22:13 | slc3 | exprs.go:22:10:22:13 | After slc3 | +| exprs.go:22:10:22:13 | slc3 | exprs.go:22:15:22:15 | 0 | | exprs.go:22:10:22:18 | After slice expression | exprs.go:22:2:22:18 | assign:0 ... := ... | -| exprs.go:22:10:22:18 | Before slice expression | exprs.go:22:10:22:13 | Before slc3 | +| exprs.go:22:10:22:18 | Before slice expression | exprs.go:22:10:22:13 | slc3 | | exprs.go:22:10:22:18 | slice expression | exprs.go:22:10:22:18 | After slice expression | -| exprs.go:22:15:22:15 | 0 | exprs.go:22:15:22:15 | After 0 | -| exprs.go:22:15:22:15 | After 0 | exprs.go:22:17:22:17 | Before 2 | -| exprs.go:22:15:22:15 | Before 0 | exprs.go:22:15:22:15 | 0 | -| exprs.go:22:17:22:17 | 2 | exprs.go:22:17:22:17 | After 2 | -| exprs.go:22:17:22:17 | After 2 | exprs.go:22:10:22:18 | slice expression | -| exprs.go:22:17:22:17 | Before 2 | exprs.go:22:17:22:17 | 2 | +| exprs.go:22:15:22:15 | 0 | exprs.go:22:17:22:17 | 2 | +| exprs.go:22:17:22:17 | 2 | exprs.go:22:10:22:18 | slice expression | | exprs.go:23:2:23:17 | ... := ... | exprs.go:23:10:23:17 | Before slice expression | | exprs.go:23:2:23:17 | After ... := ... | exprs.go:24:2:24:17 | ... := ... | | exprs.go:23:2:23:17 | assign:0 ... := ... | exprs.go:23:2:23:17 | After ... := ... | -| exprs.go:23:10:23:13 | After slc4 | exprs.go:23:15:23:15 | Before 0 | -| exprs.go:23:10:23:13 | Before slc4 | exprs.go:23:10:23:13 | slc4 | -| exprs.go:23:10:23:13 | slc4 | exprs.go:23:10:23:13 | After slc4 | +| exprs.go:23:10:23:13 | slc4 | exprs.go:23:15:23:15 | 0 | | exprs.go:23:10:23:17 | After slice expression | exprs.go:23:2:23:17 | assign:0 ... := ... | -| exprs.go:23:10:23:17 | Before slice expression | exprs.go:23:10:23:13 | Before slc4 | +| exprs.go:23:10:23:17 | Before slice expression | exprs.go:23:10:23:13 | slc4 | | exprs.go:23:10:23:17 | slice expression | exprs.go:23:10:23:17 | After slice expression | -| exprs.go:23:15:23:15 | 0 | exprs.go:23:15:23:15 | After 0 | -| exprs.go:23:15:23:15 | After 0 | exprs.go:23:10:23:17 | slice expression | -| exprs.go:23:15:23:15 | Before 0 | exprs.go:23:15:23:15 | 0 | +| exprs.go:23:15:23:15 | 0 | exprs.go:23:10:23:17 | slice expression | | exprs.go:24:2:24:17 | ... := ... | exprs.go:24:10:24:17 | Before slice expression | | exprs.go:24:2:24:17 | After ... := ... | exprs.go:25:2:25:34 | Before return statement | | exprs.go:24:2:24:17 | assign:0 ... := ... | exprs.go:24:2:24:17 | After ... := ... | -| exprs.go:24:10:24:13 | After slc5 | exprs.go:24:16:24:16 | Before 2 | -| exprs.go:24:10:24:13 | Before slc5 | exprs.go:24:10:24:13 | slc5 | -| exprs.go:24:10:24:13 | slc5 | exprs.go:24:10:24:13 | After slc5 | +| exprs.go:24:10:24:13 | slc5 | exprs.go:24:16:24:16 | 2 | | exprs.go:24:10:24:17 | After slice expression | exprs.go:24:2:24:17 | assign:0 ... := ... | -| exprs.go:24:10:24:17 | Before slice expression | exprs.go:24:10:24:13 | Before slc5 | +| exprs.go:24:10:24:17 | Before slice expression | exprs.go:24:10:24:13 | slc5 | | exprs.go:24:10:24:17 | slice expression | exprs.go:24:10:24:17 | After slice expression | -| exprs.go:24:16:24:16 | 2 | exprs.go:24:16:24:16 | After 2 | -| exprs.go:24:16:24:16 | After 2 | exprs.go:24:10:24:17 | slice expression | -| exprs.go:24:16:24:16 | Before 2 | exprs.go:24:16:24:16 | 2 | +| exprs.go:24:16:24:16 | 2 | exprs.go:24:10:24:17 | slice expression | | exprs.go:25:2:25:34 | Before return statement | exprs.go:25:9:25:34 | Before struct literal | | exprs.go:25:2:25:34 | return statement | exprs.go:5:1:26:1 | Normal Exit | | exprs.go:25:9:25:34 | After struct literal | exprs.go:25:2:25:34 | return statement | | exprs.go:25:9:25:34 | Before struct literal | exprs.go:25:9:25:34 | struct literal | | exprs.go:25:9:25:34 | struct literal | exprs.go:25:15:25:19 | Before index expression | -| exprs.go:25:15:25:16 | After mp | exprs.go:25:18:25:18 | Before s | -| exprs.go:25:15:25:16 | Before mp | exprs.go:25:15:25:16 | mp | -| exprs.go:25:15:25:16 | mp | exprs.go:25:15:25:16 | After mp | +| exprs.go:25:15:25:16 | mp | exprs.go:25:18:25:18 | s | | exprs.go:25:15:25:19 | After index expression | exprs.go:25:15:25:19 | lit-init index expression | -| exprs.go:25:15:25:19 | Before index expression | exprs.go:25:15:25:16 | Before mp | +| exprs.go:25:15:25:19 | Before index expression | exprs.go:25:15:25:16 | mp | | exprs.go:25:15:25:19 | index expression | exprs.go:5:1:26:1 | Exceptional Exit | | exprs.go:25:15:25:19 | index expression | exprs.go:25:15:25:19 | After index expression | | exprs.go:25:15:25:19 | lit-init index expression | exprs.go:25:22:25:33 | Before call to len | -| exprs.go:25:18:25:18 | After s | exprs.go:25:15:25:19 | index expression | -| exprs.go:25:18:25:18 | Before s | exprs.go:25:18:25:18 | s | -| exprs.go:25:18:25:18 | s | exprs.go:25:18:25:18 | After s | -| exprs.go:25:22:25:24 | After len | exprs.go:25:26:25:32 | Before index expression | -| exprs.go:25:22:25:24 | Before len | exprs.go:25:22:25:24 | len | -| exprs.go:25:22:25:24 | len | exprs.go:25:22:25:24 | After len | +| exprs.go:25:18:25:18 | s | exprs.go:25:15:25:19 | index expression | +| exprs.go:25:22:25:24 | len | exprs.go:25:26:25:32 | Before index expression | | exprs.go:25:22:25:33 | After call to len | exprs.go:25:22:25:33 | lit-init call to len | -| exprs.go:25:22:25:33 | Before call to len | exprs.go:25:22:25:24 | Before len | +| exprs.go:25:22:25:33 | Before call to len | exprs.go:25:22:25:24 | len | | exprs.go:25:22:25:33 | call to len | exprs.go:25:22:25:33 | After call to len | | exprs.go:25:22:25:33 | lit-init call to len | exprs.go:25:9:25:34 | After struct literal | -| exprs.go:25:26:25:29 | After slc6 | exprs.go:25:31:25:31 | Before 0 | -| exprs.go:25:26:25:29 | Before slc6 | exprs.go:25:26:25:29 | slc6 | -| exprs.go:25:26:25:29 | slc6 | exprs.go:25:26:25:29 | After slc6 | +| exprs.go:25:26:25:29 | slc6 | exprs.go:25:31:25:31 | 0 | | exprs.go:25:26:25:32 | After index expression | exprs.go:25:22:25:33 | call to len | -| exprs.go:25:26:25:32 | Before index expression | exprs.go:25:26:25:29 | Before slc6 | +| exprs.go:25:26:25:32 | Before index expression | exprs.go:25:26:25:29 | slc6 | | exprs.go:25:26:25:32 | index expression | exprs.go:5:1:26:1 | Exceptional Exit | | exprs.go:25:26:25:32 | index expression | exprs.go:25:26:25:32 | After index expression | -| exprs.go:25:31:25:31 | 0 | exprs.go:25:31:25:31 | After 0 | -| exprs.go:25:31:25:31 | After 0 | exprs.go:25:26:25:32 | index expression | -| exprs.go:25:31:25:31 | Before 0 | exprs.go:25:31:25:31 | 0 | +| exprs.go:25:31:25:31 | 0 | exprs.go:25:26:25:32 | index expression | | exprs.go:28:1:30:1 | After function declaration | exprs.go:32:1:37:1 | Before function declaration | | exprs.go:28:1:30:1 | Before function declaration | exprs.go:28:1:30:1 | function declaration | | exprs.go:28:1:30:1 | Entry | exprs.go:28:12:28:14 | arg | @@ -1163,11 +919,9 @@ | exprs.go:28:33:30:1 | block statement | exprs.go:29:2:29:21 | Before return statement | | exprs.go:29:2:29:21 | Before return statement | exprs.go:29:9:29:21 | Before selection of x | | exprs.go:29:2:29:21 | return statement | exprs.go:28:1:30:1 | Normal Exit | -| exprs.go:29:9:29:11 | After arg | exprs.go:29:9:29:19 | type assertion | -| exprs.go:29:9:29:11 | Before arg | exprs.go:29:9:29:11 | arg | -| exprs.go:29:9:29:11 | arg | exprs.go:29:9:29:11 | After arg | +| exprs.go:29:9:29:11 | arg | exprs.go:29:9:29:19 | type assertion | | exprs.go:29:9:29:19 | After type assertion | exprs.go:29:9:29:21 | selection of x | -| exprs.go:29:9:29:19 | Before type assertion | exprs.go:29:9:29:11 | Before arg | +| exprs.go:29:9:29:19 | Before type assertion | exprs.go:29:9:29:11 | arg | | exprs.go:29:9:29:19 | type assertion | exprs.go:28:1:30:1 | Exceptional Exit | | exprs.go:29:9:29:19 | type assertion | exprs.go:29:9:29:19 | After type assertion | | exprs.go:29:9:29:21 | After selection of x | exprs.go:29:2:29:21 | return statement | @@ -1183,28 +937,23 @@ | exprs.go:33:2:35:2 | After if statement | exprs.go:36:2:36:10 | Before return statement | | exprs.go:33:2:35:2 | if statement | exprs.go:33:5:33:24 | ... := ... | | exprs.go:33:5:33:24 | ... := ... | exprs.go:33:14:33:24 | Before type assertion | -| exprs.go:33:5:33:24 | After ... := ... | exprs.go:33:27:33:28 | Before ok | +| exprs.go:33:5:33:24 | After ... := ... | exprs.go:33:27:33:28 | ok | | exprs.go:33:5:33:24 | extract:0 ... := ... | exprs.go:33:5:33:24 | extract:1 ... := ... | | exprs.go:33:5:33:24 | extract:1 ... := ... | exprs.go:33:5:33:24 | After ... := ... | -| exprs.go:33:14:33:16 | After arg | exprs.go:33:14:33:24 | type assertion | -| exprs.go:33:14:33:16 | Before arg | exprs.go:33:14:33:16 | arg | -| exprs.go:33:14:33:16 | arg | exprs.go:33:14:33:16 | After arg | +| exprs.go:33:14:33:16 | arg | exprs.go:33:14:33:24 | type assertion | | exprs.go:33:14:33:24 | After type assertion | exprs.go:33:5:33:24 | extract:0 ... := ... | -| exprs.go:33:14:33:24 | Before type assertion | exprs.go:33:14:33:16 | Before arg | +| exprs.go:33:14:33:24 | Before type assertion | exprs.go:33:14:33:16 | arg | | exprs.go:33:14:33:24 | type assertion | exprs.go:33:14:33:24 | After type assertion | | exprs.go:33:27:33:28 | After ok [false] | exprs.go:33:2:35:2 | After if statement | | exprs.go:33:27:33:28 | After ok [true] | exprs.go:33:30:35:2 | block statement | -| exprs.go:33:27:33:28 | Before ok | exprs.go:33:27:33:28 | ok | | exprs.go:33:27:33:28 | ok | exprs.go:33:27:33:28 | After ok [false] | | exprs.go:33:27:33:28 | ok | exprs.go:33:27:33:28 | After ok [true] | | exprs.go:33:30:35:2 | block statement | exprs.go:34:3:34:12 | Before return statement | | exprs.go:34:3:34:12 | Before return statement | exprs.go:34:10:34:12 | Before selection of x | | exprs.go:34:3:34:12 | return statement | exprs.go:32:1:37:1 | Normal Exit | -| exprs.go:34:10:34:10 | After p | exprs.go:34:10:34:12 | selection of x | -| exprs.go:34:10:34:10 | Before p | exprs.go:34:10:34:10 | p | -| exprs.go:34:10:34:10 | p | exprs.go:34:10:34:10 | After p | +| exprs.go:34:10:34:10 | p | exprs.go:34:10:34:12 | selection of x | | exprs.go:34:10:34:12 | After selection of x | exprs.go:34:3:34:12 | return statement | -| exprs.go:34:10:34:12 | Before selection of x | exprs.go:34:10:34:10 | Before p | +| exprs.go:34:10:34:12 | Before selection of x | exprs.go:34:10:34:10 | p | | exprs.go:34:10:34:12 | selection of x | exprs.go:34:10:34:12 | After selection of x | | exprs.go:36:2:36:10 | Before return statement | exprs.go:36:9:36:10 | Before -... | | exprs.go:36:2:36:10 | return statement | exprs.go:32:1:37:1 | Normal Exit | @@ -1236,27 +985,22 @@ | exprs.go:42:2:42:20 | After ... = ... | exprs.go:43:2:45:2 | if statement | | exprs.go:42:2:42:20 | extract:0 ... = ... | exprs.go:42:2:42:20 | extract:1 ... = ... | | exprs.go:42:2:42:20 | extract:1 ... = ... | exprs.go:42:2:42:20 | After ... = ... | -| exprs.go:42:10:42:12 | After arg | exprs.go:42:10:42:20 | type assertion | -| exprs.go:42:10:42:12 | Before arg | exprs.go:42:10:42:12 | arg | -| exprs.go:42:10:42:12 | arg | exprs.go:42:10:42:12 | After arg | +| exprs.go:42:10:42:12 | arg | exprs.go:42:10:42:20 | type assertion | | exprs.go:42:10:42:20 | After type assertion | exprs.go:42:2:42:20 | extract:0 ... = ... | -| exprs.go:42:10:42:20 | Before type assertion | exprs.go:42:10:42:12 | Before arg | +| exprs.go:42:10:42:20 | Before type assertion | exprs.go:42:10:42:12 | arg | | exprs.go:42:10:42:20 | type assertion | exprs.go:42:10:42:20 | After type assertion | | exprs.go:43:2:45:2 | After if statement | exprs.go:46:2:46:10 | Before return statement | -| exprs.go:43:2:45:2 | if statement | exprs.go:43:5:43:6 | Before ok | +| exprs.go:43:2:45:2 | if statement | exprs.go:43:5:43:6 | ok | | exprs.go:43:5:43:6 | After ok [false] | exprs.go:43:2:45:2 | After if statement | | exprs.go:43:5:43:6 | After ok [true] | exprs.go:43:8:45:2 | block statement | -| exprs.go:43:5:43:6 | Before ok | exprs.go:43:5:43:6 | ok | | exprs.go:43:5:43:6 | ok | exprs.go:43:5:43:6 | After ok [false] | | exprs.go:43:5:43:6 | ok | exprs.go:43:5:43:6 | After ok [true] | | exprs.go:43:8:45:2 | block statement | exprs.go:44:3:44:12 | Before return statement | | exprs.go:44:3:44:12 | Before return statement | exprs.go:44:10:44:12 | Before selection of x | | exprs.go:44:3:44:12 | return statement | exprs.go:39:1:47:1 | Normal Exit | -| exprs.go:44:10:44:10 | After p | exprs.go:44:10:44:12 | selection of x | -| exprs.go:44:10:44:10 | Before p | exprs.go:44:10:44:10 | p | -| exprs.go:44:10:44:10 | p | exprs.go:44:10:44:10 | After p | +| exprs.go:44:10:44:10 | p | exprs.go:44:10:44:12 | selection of x | | exprs.go:44:10:44:12 | After selection of x | exprs.go:44:3:44:12 | return statement | -| exprs.go:44:10:44:12 | Before selection of x | exprs.go:44:10:44:10 | Before p | +| exprs.go:44:10:44:12 | Before selection of x | exprs.go:44:10:44:10 | p | | exprs.go:44:10:44:12 | selection of x | exprs.go:44:10:44:12 | After selection of x | | exprs.go:46:2:46:10 | Before return statement | exprs.go:46:9:46:10 | Before -... | | exprs.go:46:2:46:10 | return statement | exprs.go:39:1:47:1 | Normal Exit | @@ -1277,53 +1021,37 @@ | exprs.go:50:2:52:2 | After for statement | exprs.go:53:2:53:7 | Before return statement | | exprs.go:50:2:52:2 | [LoopHeader] for statement | exprs.go:50:27:50:29 | Before increment statement | | exprs.go:50:2:52:2 | for statement | exprs.go:50:6:50:11 | ... := ... | -| exprs.go:50:6:50:11 | ... := ... | exprs.go:50:11:50:11 | Before 0 | +| exprs.go:50:6:50:11 | ... := ... | exprs.go:50:11:50:11 | 0 | | exprs.go:50:6:50:11 | After ... := ... | exprs.go:50:14:50:24 | Before ...<... | | exprs.go:50:6:50:11 | assign:0 ... := ... | exprs.go:50:6:50:11 | After ... := ... | -| exprs.go:50:11:50:11 | 0 | exprs.go:50:11:50:11 | After 0 | -| exprs.go:50:11:50:11 | After 0 | exprs.go:50:6:50:11 | assign:0 ... := ... | -| exprs.go:50:11:50:11 | Before 0 | exprs.go:50:11:50:11 | 0 | -| exprs.go:50:14:50:14 | After i | exprs.go:50:18:50:24 | Before call to len | -| exprs.go:50:14:50:14 | Before i | exprs.go:50:14:50:14 | i | -| exprs.go:50:14:50:14 | i | exprs.go:50:14:50:14 | After i | +| exprs.go:50:11:50:11 | 0 | exprs.go:50:6:50:11 | assign:0 ... := ... | +| exprs.go:50:14:50:14 | i | exprs.go:50:18:50:24 | Before call to len | | exprs.go:50:14:50:24 | ...<... | exprs.go:50:14:50:24 | After ...<... [false] | | exprs.go:50:14:50:24 | ...<... | exprs.go:50:14:50:24 | After ...<... [true] | | exprs.go:50:14:50:24 | After ...<... [false] | exprs.go:50:2:52:2 | After for statement | | exprs.go:50:14:50:24 | After ...<... [true] | exprs.go:50:31:52:2 | block statement | -| exprs.go:50:14:50:24 | Before ...<... | exprs.go:50:14:50:14 | Before i | -| exprs.go:50:18:50:20 | After len | exprs.go:50:22:50:23 | Before xs | -| exprs.go:50:18:50:20 | Before len | exprs.go:50:18:50:20 | len | -| exprs.go:50:18:50:20 | len | exprs.go:50:18:50:20 | After len | +| exprs.go:50:14:50:24 | Before ...<... | exprs.go:50:14:50:14 | i | +| exprs.go:50:18:50:20 | len | exprs.go:50:22:50:23 | xs | | exprs.go:50:18:50:24 | After call to len | exprs.go:50:14:50:24 | ...<... | -| exprs.go:50:18:50:24 | Before call to len | exprs.go:50:18:50:20 | Before len | +| exprs.go:50:18:50:24 | Before call to len | exprs.go:50:18:50:20 | len | | exprs.go:50:18:50:24 | call to len | exprs.go:50:18:50:24 | After call to len | -| exprs.go:50:22:50:23 | After xs | exprs.go:50:18:50:24 | call to len | -| exprs.go:50:22:50:23 | Before xs | exprs.go:50:22:50:23 | xs | -| exprs.go:50:22:50:23 | xs | exprs.go:50:22:50:23 | After xs | -| exprs.go:50:27:50:27 | After i | exprs.go:50:27:50:29 | increment statement | -| exprs.go:50:27:50:27 | Before i | exprs.go:50:27:50:27 | i | -| exprs.go:50:27:50:27 | i | exprs.go:50:27:50:27 | After i | +| exprs.go:50:22:50:23 | xs | exprs.go:50:18:50:24 | call to len | +| exprs.go:50:27:50:27 | i | exprs.go:50:27:50:29 | increment statement | | exprs.go:50:27:50:29 | After increment statement | exprs.go:50:14:50:24 | Before ...<... | -| exprs.go:50:27:50:29 | Before increment statement | exprs.go:50:27:50:27 | Before i | +| exprs.go:50:27:50:29 | Before increment statement | exprs.go:50:27:50:27 | i | | exprs.go:50:27:50:29 | increment statement | exprs.go:50:27:50:29 | After increment statement | | exprs.go:50:31:52:2 | After block statement | exprs.go:50:2:52:2 | [LoopHeader] for statement | | exprs.go:50:31:52:2 | block statement | exprs.go:51:3:51:14 | Before ... += ... | -| exprs.go:51:3:51:5 | After res | exprs.go:51:10:51:14 | Before index expression | -| exprs.go:51:3:51:5 | Before res | exprs.go:51:3:51:5 | res | -| exprs.go:51:3:51:5 | res | exprs.go:51:3:51:5 | After res | +| exprs.go:51:3:51:5 | res | exprs.go:51:10:51:14 | Before index expression | | exprs.go:51:3:51:14 | ... += ... | exprs.go:51:3:51:14 | After ... += ... | | exprs.go:51:3:51:14 | After ... += ... | exprs.go:50:31:52:2 | After block statement | -| exprs.go:51:3:51:14 | Before ... += ... | exprs.go:51:3:51:5 | Before res | -| exprs.go:51:10:51:11 | After xs | exprs.go:51:13:51:13 | Before i | -| exprs.go:51:10:51:11 | Before xs | exprs.go:51:10:51:11 | xs | -| exprs.go:51:10:51:11 | xs | exprs.go:51:10:51:11 | After xs | +| exprs.go:51:3:51:14 | Before ... += ... | exprs.go:51:3:51:5 | res | +| exprs.go:51:10:51:11 | xs | exprs.go:51:13:51:13 | i | | exprs.go:51:10:51:14 | After index expression | exprs.go:51:3:51:14 | ... += ... | -| exprs.go:51:10:51:14 | Before index expression | exprs.go:51:10:51:11 | Before xs | +| exprs.go:51:10:51:14 | Before index expression | exprs.go:51:10:51:11 | xs | | exprs.go:51:10:51:14 | index expression | exprs.go:49:1:54:1 | Exceptional Exit | | exprs.go:51:10:51:14 | index expression | exprs.go:51:10:51:14 | After index expression | -| exprs.go:51:13:51:13 | After i | exprs.go:51:10:51:14 | index expression | -| exprs.go:51:13:51:13 | Before i | exprs.go:51:13:51:13 | i | -| exprs.go:51:13:51:13 | i | exprs.go:51:13:51:13 | After i | +| exprs.go:51:13:51:13 | i | exprs.go:51:10:51:14 | index expression | | exprs.go:53:2:53:7 | Before return statement | exprs.go:53:2:53:7 | return statement | | exprs.go:53:2:53:7 | return statement | exprs.go:49:30:54:1 | result-read:0 block statement | | exprs.go:56:1:58:1 | After function declaration | exprs.go:60:1:62:1 | Before function declaration | @@ -1336,16 +1064,12 @@ | exprs.go:56:26:58:1 | block statement | exprs.go:57:2:57:15 | Before return statement | | exprs.go:57:2:57:15 | Before return statement | exprs.go:57:9:57:15 | Before call to sum | | exprs.go:57:2:57:15 | return statement | exprs.go:56:1:58:1 | Normal Exit | -| exprs.go:57:9:57:11 | After sum | exprs.go:57:13:57:14 | Before xs | -| exprs.go:57:9:57:11 | Before sum | exprs.go:57:9:57:11 | sum | -| exprs.go:57:9:57:11 | sum | exprs.go:57:9:57:11 | After sum | +| exprs.go:57:9:57:11 | sum | exprs.go:57:13:57:14 | xs | | exprs.go:57:9:57:15 | After call to sum | exprs.go:57:2:57:15 | return statement | -| exprs.go:57:9:57:15 | Before call to sum | exprs.go:57:9:57:11 | Before sum | +| exprs.go:57:9:57:15 | Before call to sum | exprs.go:57:9:57:11 | sum | | exprs.go:57:9:57:15 | call to sum | exprs.go:56:1:58:1 | Exceptional Exit | | exprs.go:57:9:57:15 | call to sum | exprs.go:57:9:57:15 | After call to sum | -| exprs.go:57:13:57:14 | After xs | exprs.go:57:9:57:15 | call to sum | -| exprs.go:57:13:57:14 | Before xs | exprs.go:57:13:57:14 | xs | -| exprs.go:57:13:57:14 | xs | exprs.go:57:13:57:14 | After xs | +| exprs.go:57:13:57:14 | xs | exprs.go:57:9:57:15 | call to sum | | exprs.go:60:1:62:1 | After function declaration | exprs.go:64:1:64:19 | variable declaration | | exprs.go:60:1:62:1 | Before function declaration | exprs.go:60:1:62:1 | function declaration | | exprs.go:60:1:62:1 | Entry | exprs.go:60:19:62:1 | block statement | @@ -1356,36 +1080,29 @@ | exprs.go:61:2:61:22 | return statement | exprs.go:60:1:62:1 | Normal Exit | | exprs.go:61:9:61:22 | After slice literal | exprs.go:61:2:61:22 | return statement | | exprs.go:61:9:61:22 | Before slice literal | exprs.go:61:9:61:22 | slice literal | -| exprs.go:61:9:61:22 | slice literal | exprs.go:61:15:61:15 | Before 1 | +| exprs.go:61:9:61:22 | slice literal | exprs.go:61:15:61:15 | 1 | | exprs.go:61:15:61:15 | 1 | exprs.go:61:15:61:15 | After 1 | | exprs.go:61:15:61:15 | After 1 | exprs.go:61:15:61:15 | lit-init 1 | -| exprs.go:61:15:61:15 | Before 1 | exprs.go:61:15:61:15 | 1 | -| exprs.go:61:15:61:15 | lit-init 1 | exprs.go:61:18:61:18 | Before 2 | +| exprs.go:61:15:61:15 | lit-init 1 | exprs.go:61:18:61:18 | 2 | | exprs.go:61:18:61:18 | 2 | exprs.go:61:18:61:18 | After 2 | | exprs.go:61:18:61:18 | After 2 | exprs.go:61:18:61:18 | lit-init 2 | -| exprs.go:61:18:61:18 | Before 2 | exprs.go:61:18:61:18 | 2 | -| exprs.go:61:18:61:18 | lit-init 2 | exprs.go:61:21:61:21 | Before 3 | +| exprs.go:61:18:61:18 | lit-init 2 | exprs.go:61:21:61:21 | 3 | | exprs.go:61:21:61:21 | 3 | exprs.go:61:21:61:21 | After 3 | | exprs.go:61:21:61:21 | After 3 | exprs.go:61:21:61:21 | lit-init 3 | -| exprs.go:61:21:61:21 | Before 3 | exprs.go:61:21:61:21 | 3 | | exprs.go:61:21:61:21 | lit-init 3 | exprs.go:61:9:61:22 | After slice literal | | exprs.go:64:1:64:19 | After variable declaration | exprs.go:65:1:65:24 | variable declaration | | exprs.go:64:1:64:19 | variable declaration | exprs.go:64:5:64:19 | value declaration specifier | | exprs.go:64:5:64:19 | After value declaration specifier | exprs.go:64:1:64:19 | After variable declaration | | exprs.go:64:5:64:19 | assign:0 value declaration specifier | exprs.go:64:5:64:19 | After value declaration specifier | | exprs.go:64:5:64:19 | value declaration specifier | exprs.go:64:9:64:19 | Before call to sum | -| exprs.go:64:9:64:11 | After sum | exprs.go:64:13:64:18 | Before call to ints | -| exprs.go:64:9:64:11 | Before sum | exprs.go:64:9:64:11 | sum | -| exprs.go:64:9:64:11 | sum | exprs.go:64:9:64:11 | After sum | +| exprs.go:64:9:64:11 | sum | exprs.go:64:13:64:18 | Before call to ints | | exprs.go:64:9:64:19 | After call to sum | exprs.go:64:5:64:19 | assign:0 value declaration specifier | -| exprs.go:64:9:64:19 | Before call to sum | exprs.go:64:9:64:11 | Before sum | +| exprs.go:64:9:64:19 | Before call to sum | exprs.go:64:9:64:11 | sum | | exprs.go:64:9:64:19 | call to sum | exprs.go:0:0:0:0 | Exceptional Exit | | exprs.go:64:9:64:19 | call to sum | exprs.go:64:9:64:19 | After call to sum | -| exprs.go:64:13:64:16 | After ints | exprs.go:64:13:64:18 | call to ints | -| exprs.go:64:13:64:16 | Before ints | exprs.go:64:13:64:16 | ints | -| exprs.go:64:13:64:16 | ints | exprs.go:64:13:64:16 | After ints | +| exprs.go:64:13:64:16 | ints | exprs.go:64:13:64:18 | call to ints | | exprs.go:64:13:64:18 | After call to ints | exprs.go:64:9:64:19 | call to sum | -| exprs.go:64:13:64:18 | Before call to ints | exprs.go:64:13:64:16 | Before ints | +| exprs.go:64:13:64:18 | Before call to ints | exprs.go:64:13:64:16 | ints | | exprs.go:64:13:64:18 | call to ints | exprs.go:0:0:0:0 | Exceptional Exit | | exprs.go:64:13:64:18 | call to ints | exprs.go:64:13:64:18 | After call to ints | | exprs.go:65:1:65:24 | After variable declaration | exprs.go:67:1:69:1 | Before function declaration | @@ -1393,18 +1110,14 @@ | exprs.go:65:5:65:24 | After value declaration specifier | exprs.go:65:1:65:24 | After variable declaration | | exprs.go:65:5:65:24 | assign:0 value declaration specifier | exprs.go:65:5:65:24 | After value declaration specifier | | exprs.go:65:5:65:24 | value declaration specifier | exprs.go:65:10:65:24 | Before call to sum2 | -| exprs.go:65:10:65:13 | After sum2 | exprs.go:65:15:65:20 | Before call to ints | -| exprs.go:65:10:65:13 | Before sum2 | exprs.go:65:10:65:13 | sum2 | -| exprs.go:65:10:65:13 | sum2 | exprs.go:65:10:65:13 | After sum2 | +| exprs.go:65:10:65:13 | sum2 | exprs.go:65:15:65:20 | Before call to ints | | exprs.go:65:10:65:24 | After call to sum2 | exprs.go:65:5:65:24 | assign:0 value declaration specifier | -| exprs.go:65:10:65:24 | Before call to sum2 | exprs.go:65:10:65:13 | Before sum2 | +| exprs.go:65:10:65:24 | Before call to sum2 | exprs.go:65:10:65:13 | sum2 | | exprs.go:65:10:65:24 | call to sum2 | exprs.go:0:0:0:0 | Exceptional Exit | | exprs.go:65:10:65:24 | call to sum2 | exprs.go:65:10:65:24 | After call to sum2 | -| exprs.go:65:15:65:18 | After ints | exprs.go:65:15:65:20 | call to ints | -| exprs.go:65:15:65:18 | Before ints | exprs.go:65:15:65:18 | ints | -| exprs.go:65:15:65:18 | ints | exprs.go:65:15:65:18 | After ints | +| exprs.go:65:15:65:18 | ints | exprs.go:65:15:65:20 | call to ints | | exprs.go:65:15:65:20 | After call to ints | exprs.go:65:10:65:24 | call to sum2 | -| exprs.go:65:15:65:20 | Before call to ints | exprs.go:65:15:65:18 | Before ints | +| exprs.go:65:15:65:20 | Before call to ints | exprs.go:65:15:65:18 | ints | | exprs.go:65:15:65:20 | call to ints | exprs.go:0:0:0:0 | Exceptional Exit | | exprs.go:65:15:65:20 | call to ints | exprs.go:65:15:65:20 | After call to ints | | exprs.go:67:1:69:1 | After function declaration | exprs.go:71:1:73:1 | Before function declaration | @@ -1417,48 +1130,36 @@ | exprs.go:67:24:69:1 | block statement | exprs.go:68:2:68:13 | Before return statement | | exprs.go:68:2:68:13 | Before return statement | exprs.go:68:9:68:13 | Before ...+... | | exprs.go:68:2:68:13 | return statement | exprs.go:67:1:69:1 | Normal Exit | -| exprs.go:68:9:68:9 | After x | exprs.go:68:13:68:13 | Before y | -| exprs.go:68:9:68:9 | Before x | exprs.go:68:9:68:9 | x | -| exprs.go:68:9:68:9 | x | exprs.go:68:9:68:9 | After x | +| exprs.go:68:9:68:9 | x | exprs.go:68:13:68:13 | y | | exprs.go:68:9:68:13 | ...+... | exprs.go:68:9:68:13 | After ...+... | | exprs.go:68:9:68:13 | After ...+... | exprs.go:68:2:68:13 | return statement | -| exprs.go:68:9:68:13 | Before ...+... | exprs.go:68:9:68:9 | Before x | -| exprs.go:68:13:68:13 | After y | exprs.go:68:9:68:13 | ...+... | -| exprs.go:68:13:68:13 | Before y | exprs.go:68:13:68:13 | y | -| exprs.go:68:13:68:13 | y | exprs.go:68:13:68:13 | After y | +| exprs.go:68:9:68:13 | Before ...+... | exprs.go:68:9:68:9 | x | +| exprs.go:68:13:68:13 | y | exprs.go:68:9:68:13 | ...+... | | exprs.go:71:1:73:1 | After function declaration | exprs.go:75:1:75:19 | variable declaration | | exprs.go:71:1:73:1 | Before function declaration | exprs.go:71:1:73:1 | function declaration | | exprs.go:71:1:73:1 | Entry | exprs.go:71:23:73:1 | block statement | | exprs.go:71:1:73:1 | Normal Exit | exprs.go:71:1:73:1 | Exit | | exprs.go:71:1:73:1 | function declaration | exprs.go:71:1:73:1 | After function declaration | | exprs.go:71:23:73:1 | block statement | exprs.go:72:2:72:12 | Before return statement | -| exprs.go:72:2:72:12 | Before return statement | exprs.go:72:9:72:9 | Before 1 | +| exprs.go:72:2:72:12 | Before return statement | exprs.go:72:9:72:9 | 1 | | exprs.go:72:2:72:12 | return statement | exprs.go:71:1:73:1 | Normal Exit | -| exprs.go:72:9:72:9 | 1 | exprs.go:72:9:72:9 | After 1 | -| exprs.go:72:9:72:9 | After 1 | exprs.go:72:12:72:12 | Before 2 | -| exprs.go:72:9:72:9 | Before 1 | exprs.go:72:9:72:9 | 1 | -| exprs.go:72:12:72:12 | 2 | exprs.go:72:12:72:12 | After 2 | -| exprs.go:72:12:72:12 | After 2 | exprs.go:72:2:72:12 | return statement | -| exprs.go:72:12:72:12 | Before 2 | exprs.go:72:12:72:12 | 2 | +| exprs.go:72:9:72:9 | 1 | exprs.go:72:12:72:12 | 2 | +| exprs.go:72:12:72:12 | 2 | exprs.go:72:2:72:12 | return statement | | exprs.go:75:1:75:19 | After variable declaration | exprs.go:77:1:79:1 | Before function declaration | | exprs.go:75:1:75:19 | variable declaration | exprs.go:75:5:75:19 | value declaration specifier | | exprs.go:75:5:75:19 | After value declaration specifier | exprs.go:75:1:75:19 | After variable declaration | | exprs.go:75:5:75:19 | assign:0 value declaration specifier | exprs.go:75:5:75:19 | After value declaration specifier | | exprs.go:75:5:75:19 | value declaration specifier | exprs.go:75:10:75:19 | Before call to add | -| exprs.go:75:10:75:12 | After add | exprs.go:75:14:75:18 | Before call to gen | -| exprs.go:75:10:75:12 | Before add | exprs.go:75:10:75:12 | add | -| exprs.go:75:10:75:12 | add | exprs.go:75:10:75:12 | After add | +| exprs.go:75:10:75:12 | add | exprs.go:75:14:75:18 | Before call to gen | | exprs.go:75:10:75:19 | After call to add | exprs.go:75:5:75:19 | assign:0 value declaration specifier | -| exprs.go:75:10:75:19 | Before call to add | exprs.go:75:10:75:12 | Before add | +| exprs.go:75:10:75:19 | Before call to add | exprs.go:75:10:75:12 | add | | exprs.go:75:10:75:19 | call to add | exprs.go:0:0:0:0 | Exceptional Exit | | exprs.go:75:10:75:19 | call to add | exprs.go:75:10:75:19 | After call to add | | exprs.go:75:10:75:19 | extract:0 call to add | exprs.go:75:10:75:19 | extract:1 call to add | | exprs.go:75:10:75:19 | extract:1 call to add | exprs.go:75:10:75:19 | call to add | -| exprs.go:75:14:75:16 | After gen | exprs.go:75:14:75:18 | call to gen | -| exprs.go:75:14:75:16 | Before gen | exprs.go:75:14:75:16 | gen | -| exprs.go:75:14:75:16 | gen | exprs.go:75:14:75:16 | After gen | +| exprs.go:75:14:75:16 | gen | exprs.go:75:14:75:18 | call to gen | | exprs.go:75:14:75:18 | After call to gen | exprs.go:75:10:75:19 | extract:0 call to add | -| exprs.go:75:14:75:18 | Before call to gen | exprs.go:75:14:75:16 | Before gen | +| exprs.go:75:14:75:18 | Before call to gen | exprs.go:75:14:75:16 | gen | | exprs.go:75:14:75:18 | call to gen | exprs.go:0:0:0:0 | Exceptional Exit | | exprs.go:75:14:75:18 | call to gen | exprs.go:75:14:75:18 | After call to gen | | exprs.go:77:1:79:1 | After function declaration | exprs.go:81:1:87:1 | Before function declaration | @@ -1473,26 +1174,22 @@ | exprs.go:78:2:78:22 | Before return statement | exprs.go:78:9:78:22 | ...\|\|... | | exprs.go:78:2:78:22 | return statement | exprs.go:77:1:79:1 | Normal Exit | | exprs.go:78:9:78:17 | !... | exprs.go:78:11:78:16 | ...&&... | -| exprs.go:78:9:78:17 | After !... [false] | exprs.go:78:22:78:22 | Before z | +| exprs.go:78:9:78:17 | After !... [false] | exprs.go:78:22:78:22 | z | | exprs.go:78:9:78:17 | After !... [true] | exprs.go:78:9:78:22 | After ...\|\|... | | exprs.go:78:9:78:22 | ...\|\|... | exprs.go:78:9:78:17 | !... | | exprs.go:78:9:78:22 | After ...\|\|... | exprs.go:78:2:78:22 | return statement | | exprs.go:78:11:78:11 | After x [false] | exprs.go:78:11:78:16 | After ...&&... [false] | -| exprs.go:78:11:78:11 | After x [true] | exprs.go:78:16:78:16 | Before y | -| exprs.go:78:11:78:11 | Before x | exprs.go:78:11:78:11 | x | +| exprs.go:78:11:78:11 | After x [true] | exprs.go:78:16:78:16 | y | | exprs.go:78:11:78:11 | x | exprs.go:78:11:78:11 | After x [false] | | exprs.go:78:11:78:11 | x | exprs.go:78:11:78:11 | After x [true] | -| exprs.go:78:11:78:16 | ...&&... | exprs.go:78:11:78:11 | Before x | +| exprs.go:78:11:78:16 | ...&&... | exprs.go:78:11:78:11 | x | | exprs.go:78:11:78:16 | After ...&&... [false] | exprs.go:78:9:78:17 | After !... [true] | | exprs.go:78:11:78:16 | After ...&&... [true] | exprs.go:78:9:78:17 | After !... [false] | | exprs.go:78:16:78:16 | After y [false] | exprs.go:78:11:78:16 | After ...&&... [false] | | exprs.go:78:16:78:16 | After y [true] | exprs.go:78:11:78:16 | After ...&&... [true] | -| exprs.go:78:16:78:16 | Before y | exprs.go:78:16:78:16 | y | | exprs.go:78:16:78:16 | y | exprs.go:78:16:78:16 | After y [false] | | exprs.go:78:16:78:16 | y | exprs.go:78:16:78:16 | After y [true] | -| exprs.go:78:22:78:22 | After z | exprs.go:78:9:78:22 | After ...\|\|... | -| exprs.go:78:22:78:22 | Before z | exprs.go:78:22:78:22 | z | -| exprs.go:78:22:78:22 | z | exprs.go:78:22:78:22 | After z | +| exprs.go:78:22:78:22 | z | exprs.go:78:9:78:22 | After ...\|\|... | | exprs.go:81:1:87:1 | After function declaration | exprs.go:89:1:89:13 | constant declaration | | exprs.go:81:1:87:1 | Before function declaration | exprs.go:81:1:87:1 | function declaration | | exprs.go:81:1:87:1 | Entry | exprs.go:81:18:81:19 | ch | @@ -1507,40 +1204,29 @@ | exprs.go:82:2:82:16 | extract:1 ... := ... | exprs.go:82:2:82:16 | After ... := ... | | exprs.go:82:13:82:16 | <-... | exprs.go:82:13:82:16 | After <-... | | exprs.go:82:13:82:16 | After <-... | exprs.go:82:2:82:16 | extract:0 ... := ... | -| exprs.go:82:13:82:16 | Before <-... | exprs.go:82:15:82:16 | Before ch | -| exprs.go:82:15:82:16 | After ch | exprs.go:82:13:82:16 | <-... | -| exprs.go:82:15:82:16 | Before ch | exprs.go:82:15:82:16 | ch | -| exprs.go:82:15:82:16 | ch | exprs.go:82:15:82:16 | After ch | +| exprs.go:82:13:82:16 | Before <-... | exprs.go:82:15:82:16 | ch | +| exprs.go:82:15:82:16 | ch | exprs.go:82:13:82:16 | <-... | | exprs.go:83:2:85:2 | After if statement | exprs.go:86:2:86:18 | expression statement | -| exprs.go:83:2:85:2 | if statement | exprs.go:83:5:83:6 | Before ok | +| exprs.go:83:2:85:2 | if statement | exprs.go:83:5:83:6 | ok | | exprs.go:83:5:83:6 | After ok [false] | exprs.go:83:2:85:2 | After if statement | | exprs.go:83:5:83:6 | After ok [true] | exprs.go:83:8:85:2 | block statement | -| exprs.go:83:5:83:6 | Before ok | exprs.go:83:5:83:6 | ok | | exprs.go:83:5:83:6 | ok | exprs.go:83:5:83:6 | After ok [false] | | exprs.go:83:5:83:6 | ok | exprs.go:83:5:83:6 | After ok [true] | | exprs.go:83:8:85:2 | block statement | exprs.go:84:3:84:12 | Before return statement | -| exprs.go:84:3:84:12 | Before return statement | exprs.go:84:10:84:12 | Before val | +| exprs.go:84:3:84:12 | Before return statement | exprs.go:84:10:84:12 | val | | exprs.go:84:3:84:12 | return statement | exprs.go:81:1:87:1 | Normal Exit | -| exprs.go:84:10:84:12 | After val | exprs.go:84:3:84:12 | return statement | -| exprs.go:84:10:84:12 | Before val | exprs.go:84:10:84:12 | val | -| exprs.go:84:10:84:12 | val | exprs.go:84:10:84:12 | After val | -| exprs.go:86:2:86:6 | After panic | exprs.go:86:8:86:17 | Before "No value" | -| exprs.go:86:2:86:6 | Before panic | exprs.go:86:2:86:6 | panic | -| exprs.go:86:2:86:6 | panic | exprs.go:86:2:86:6 | After panic | -| exprs.go:86:2:86:18 | Before call to panic | exprs.go:86:2:86:6 | Before panic | +| exprs.go:84:10:84:12 | val | exprs.go:84:3:84:12 | return statement | +| exprs.go:86:2:86:6 | panic | exprs.go:86:8:86:17 | "No value" | +| exprs.go:86:2:86:18 | Before call to panic | exprs.go:86:2:86:6 | panic | | exprs.go:86:2:86:18 | call to panic | exprs.go:81:1:87:1 | Exceptional Exit | | exprs.go:86:2:86:18 | expression statement | exprs.go:86:2:86:18 | Before call to panic | -| exprs.go:86:8:86:17 | "No value" | exprs.go:86:8:86:17 | After "No value" | -| exprs.go:86:8:86:17 | After "No value" | exprs.go:86:2:86:18 | call to panic | -| exprs.go:86:8:86:17 | Before "No value" | exprs.go:86:8:86:17 | "No value" | +| exprs.go:86:8:86:17 | "No value" | exprs.go:86:2:86:18 | call to panic | | exprs.go:89:1:89:13 | After constant declaration | exprs.go:91:1:91:25 | variable declaration | | exprs.go:89:1:89:13 | constant declaration | exprs.go:89:7:89:13 | value declaration specifier | | exprs.go:89:7:89:13 | After value declaration specifier | exprs.go:89:1:89:13 | After constant declaration | | exprs.go:89:7:89:13 | assign:0 value declaration specifier | exprs.go:89:7:89:13 | After value declaration specifier | -| exprs.go:89:7:89:13 | value declaration specifier | exprs.go:89:13:89:13 | Before 1 | -| exprs.go:89:13:89:13 | 1 | exprs.go:89:13:89:13 | After 1 | -| exprs.go:89:13:89:13 | After 1 | exprs.go:89:7:89:13 | assign:0 value declaration specifier | -| exprs.go:89:13:89:13 | Before 1 | exprs.go:89:13:89:13 | 1 | +| exprs.go:89:7:89:13 | value declaration specifier | exprs.go:89:13:89:13 | 1 | +| exprs.go:89:13:89:13 | 1 | exprs.go:89:7:89:13 | assign:0 value declaration specifier | | exprs.go:91:1:91:25 | After variable declaration | exprs.go:93:1:95:1 | Before function declaration | | exprs.go:91:1:91:25 | variable declaration | exprs.go:91:5:91:25 | value declaration specifier | | exprs.go:91:5:91:25 | After value declaration specifier | exprs.go:91:1:91:25 | After variable declaration | @@ -1550,15 +1236,13 @@ | exprs.go:91:9:91:25 | Before slice literal | exprs.go:91:9:91:25 | slice literal | | exprs.go:91:9:91:25 | slice literal | exprs.go:91:15:91:24 | Before key-value pair | | exprs.go:91:15:91:21 | ...+... | exprs.go:91:15:91:21 | After ...+... | -| exprs.go:91:15:91:21 | After ...+... | exprs.go:91:24:91:24 | Before 2 | +| exprs.go:91:15:91:21 | After ...+... | exprs.go:91:24:91:24 | 2 | | exprs.go:91:15:91:21 | Before ...+... | exprs.go:91:15:91:21 | ...+... | | exprs.go:91:15:91:24 | After key-value pair | exprs.go:91:15:91:24 | lit-init key-value pair | | exprs.go:91:15:91:24 | Before key-value pair | exprs.go:91:15:91:21 | Before ...+... | | exprs.go:91:15:91:24 | key-value pair | exprs.go:91:15:91:24 | After key-value pair | | exprs.go:91:15:91:24 | lit-init key-value pair | exprs.go:91:9:91:25 | After slice literal | -| exprs.go:91:24:91:24 | 2 | exprs.go:91:24:91:24 | After 2 | -| exprs.go:91:24:91:24 | After 2 | exprs.go:91:15:91:24 | key-value pair | -| exprs.go:91:24:91:24 | Before 2 | exprs.go:91:24:91:24 | 2 | +| exprs.go:91:24:91:24 | 2 | exprs.go:91:15:91:24 | key-value pair | | exprs.go:93:1:95:1 | After function declaration | exprs.go:0:0:0:0 | After exprs.go | | exprs.go:93:1:95:1 | Before function declaration | exprs.go:93:1:95:1 | function declaration | | exprs.go:93:1:95:1 | Entry | exprs.go:93:13:93:13 | x | @@ -1573,21 +1257,17 @@ | exprs.go:94:9:94:21 | ...\|\|... | exprs.go:94:10:94:15 | ...&&... | | exprs.go:94:9:94:21 | After ...\|\|... | exprs.go:94:2:94:21 | return statement | | exprs.go:94:10:94:10 | After x [false] | exprs.go:94:10:94:15 | After ...&&... [false] | -| exprs.go:94:10:94:10 | After x [true] | exprs.go:94:15:94:15 | Before y | -| exprs.go:94:10:94:10 | Before x | exprs.go:94:10:94:10 | x | +| exprs.go:94:10:94:10 | After x [true] | exprs.go:94:15:94:15 | y | | exprs.go:94:10:94:10 | x | exprs.go:94:10:94:10 | After x [false] | | exprs.go:94:10:94:10 | x | exprs.go:94:10:94:10 | After x [true] | -| exprs.go:94:10:94:15 | ...&&... | exprs.go:94:10:94:10 | Before x | -| exprs.go:94:10:94:15 | After ...&&... [false] | exprs.go:94:21:94:21 | Before z | +| exprs.go:94:10:94:15 | ...&&... | exprs.go:94:10:94:10 | x | +| exprs.go:94:10:94:15 | After ...&&... [false] | exprs.go:94:21:94:21 | z | | exprs.go:94:10:94:15 | After ...&&... [true] | exprs.go:94:9:94:21 | After ...\|\|... | | exprs.go:94:15:94:15 | After y [false] | exprs.go:94:10:94:15 | After ...&&... [false] | | exprs.go:94:15:94:15 | After y [true] | exprs.go:94:10:94:15 | After ...&&... [true] | -| exprs.go:94:15:94:15 | Before y | exprs.go:94:15:94:15 | y | | exprs.go:94:15:94:15 | y | exprs.go:94:15:94:15 | After y [false] | | exprs.go:94:15:94:15 | y | exprs.go:94:15:94:15 | After y [true] | -| exprs.go:94:21:94:21 | After z | exprs.go:94:9:94:21 | After ...\|\|... | -| exprs.go:94:21:94:21 | Before z | exprs.go:94:21:94:21 | z | -| exprs.go:94:21:94:21 | z | exprs.go:94:21:94:21 | After z | +| exprs.go:94:21:94:21 | z | exprs.go:94:9:94:21 | After ...\|\|... | | generic.go:0:0:0:0 | After generic.go | generic.go:0:0:0:0 | Normal Exit | | generic.go:0:0:0:0 | Entry | generic.go:0:0:0:0 | generic.go | | generic.go:0:0:0:0 | Normal Exit | generic.go:0:0:0:0 | Exit | @@ -1603,11 +1283,9 @@ | generic.go:7:7:7:7 | g | generic.go:7:37:7:37 | u | | generic.go:7:37:7:37 | u | generic.go:7:44:7:55 | block statement | | generic.go:7:44:7:55 | block statement | generic.go:7:46:7:53 | Before return statement | -| generic.go:7:46:7:53 | Before return statement | generic.go:7:53:7:53 | Before u | +| generic.go:7:46:7:53 | Before return statement | generic.go:7:53:7:53 | u | | generic.go:7:46:7:53 | return statement | generic.go:7:1:7:55 | Normal Exit | -| generic.go:7:53:7:53 | After u | generic.go:7:46:7:53 | return statement | -| generic.go:7:53:7:53 | Before u | generic.go:7:53:7:53 | u | -| generic.go:7:53:7:53 | u | generic.go:7:53:7:53 | After u | +| generic.go:7:53:7:53 | u | generic.go:7:46:7:53 | return statement | | generic.go:9:1:12:1 | After type declaration | generic.go:14:1:14:59 | Before function declaration | | generic.go:9:1:12:1 | type declaration | generic.go:9:6:12:1 | type declaration specifier | | generic.go:9:6:12:1 | type declaration specifier | generic.go:9:1:12:1 | After type declaration | @@ -1619,11 +1297,9 @@ | generic.go:14:7:14:7 | g | generic.go:14:41:14:41 | u | | generic.go:14:41:14:41 | u | generic.go:14:48:14:59 | block statement | | generic.go:14:48:14:59 | block statement | generic.go:14:50:14:57 | Before return statement | -| generic.go:14:50:14:57 | Before return statement | generic.go:14:57:14:57 | Before u | +| generic.go:14:50:14:57 | Before return statement | generic.go:14:57:14:57 | u | | generic.go:14:50:14:57 | return statement | generic.go:14:1:14:59 | Normal Exit | -| generic.go:14:57:14:57 | After u | generic.go:14:50:14:57 | return statement | -| generic.go:14:57:14:57 | Before u | generic.go:14:57:14:57 | u | -| generic.go:14:57:14:57 | u | generic.go:14:57:14:57 | After u | +| generic.go:14:57:14:57 | u | generic.go:14:50:14:57 | return statement | | generic.go:16:1:18:1 | After function declaration | generic.go:20:1:22:1 | Before function declaration | | generic.go:16:1:18:1 | Before function declaration | generic.go:16:1:18:1 | function declaration | | generic.go:16:1:18:1 | Entry | generic.go:16:30:16:30 | t | @@ -1631,11 +1307,9 @@ | generic.go:16:1:18:1 | function declaration | generic.go:16:1:18:1 | After function declaration | | generic.go:16:30:16:30 | t | generic.go:16:37:18:1 | block statement | | generic.go:16:37:18:1 | block statement | generic.go:17:2:17:9 | Before return statement | -| generic.go:17:2:17:9 | Before return statement | generic.go:17:9:17:9 | Before t | +| generic.go:17:2:17:9 | Before return statement | generic.go:17:9:17:9 | t | | generic.go:17:2:17:9 | return statement | generic.go:16:1:18:1 | Normal Exit | -| generic.go:17:9:17:9 | After t | generic.go:17:2:17:9 | return statement | -| generic.go:17:9:17:9 | Before t | generic.go:17:9:17:9 | t | -| generic.go:17:9:17:9 | t | generic.go:17:9:17:9 | After t | +| generic.go:17:9:17:9 | t | generic.go:17:2:17:9 | return statement | | generic.go:20:1:22:1 | After function declaration | generic.go:24:1:35:1 | Before function declaration | | generic.go:20:1:22:1 | Before function declaration | generic.go:20:1:22:1 | function declaration | | generic.go:20:1:22:1 | Entry | generic.go:20:33:20:33 | s | @@ -1644,14 +1318,10 @@ | generic.go:20:33:20:33 | s | generic.go:20:38:20:38 | t | | generic.go:20:38:20:38 | t | generic.go:20:50:22:1 | block statement | | generic.go:20:50:22:1 | block statement | generic.go:21:2:21:12 | Before return statement | -| generic.go:21:2:21:12 | Before return statement | generic.go:21:9:21:9 | Before s | +| generic.go:21:2:21:12 | Before return statement | generic.go:21:9:21:9 | s | | generic.go:21:2:21:12 | return statement | generic.go:20:1:22:1 | Normal Exit | -| generic.go:21:9:21:9 | After s | generic.go:21:12:21:12 | Before t | -| generic.go:21:9:21:9 | Before s | generic.go:21:9:21:9 | s | -| generic.go:21:9:21:9 | s | generic.go:21:9:21:9 | After s | -| generic.go:21:12:21:12 | After t | generic.go:21:2:21:12 | return statement | -| generic.go:21:12:21:12 | Before t | generic.go:21:12:21:12 | t | -| generic.go:21:12:21:12 | t | generic.go:21:12:21:12 | After t | +| generic.go:21:9:21:9 | s | generic.go:21:12:21:12 | t | +| generic.go:21:12:21:12 | t | generic.go:21:2:21:12 | return statement | | generic.go:24:1:35:1 | After function declaration | generic.go:0:0:0:0 | After generic.go | | generic.go:24:1:35:1 | Before function declaration | generic.go:24:1:35:1 | function declaration | | generic.go:24:1:35:1 | Entry | generic.go:24:16:35:1 | block statement | @@ -1665,133 +1335,98 @@ | generic.go:25:2:25:35 | assign:0 ... := ... | generic.go:25:2:25:35 | After ... := ... | | generic.go:25:9:25:35 | After struct literal | generic.go:25:2:25:35 | assign:0 ... := ... | | generic.go:25:9:25:35 | Before struct literal | generic.go:25:9:25:35 | struct literal | -| generic.go:25:9:25:35 | struct literal | generic.go:25:32:25:34 | Before "x" | +| generic.go:25:9:25:35 | struct literal | generic.go:25:32:25:34 | "x" | | generic.go:25:32:25:34 | "x" | generic.go:25:32:25:34 | After "x" | | generic.go:25:32:25:34 | After "x" | generic.go:25:32:25:34 | lit-init "x" | -| generic.go:25:32:25:34 | Before "x" | generic.go:25:32:25:34 | "x" | | generic.go:25:32:25:34 | lit-init "x" | generic.go:25:9:25:35 | After struct literal | | generic.go:26:2:26:27 | ... := ... | generic.go:26:7:26:27 | Before call to Identity | | generic.go:26:2:26:27 | After ... := ... | generic.go:27:2:27:48 | ... := ... | | generic.go:26:2:26:27 | assign:0 ... := ... | generic.go:26:2:26:27 | After ... := ... | -| generic.go:26:7:26:9 | After gs1 | generic.go:26:7:26:18 | selection of Identity | -| generic.go:26:7:26:9 | Before gs1 | generic.go:26:7:26:9 | gs1 | -| generic.go:26:7:26:9 | gs1 | generic.go:26:7:26:9 | After gs1 | -| generic.go:26:7:26:18 | After selection of Identity | generic.go:26:20:26:26 | Before "hello" | -| generic.go:26:7:26:18 | Before selection of Identity | generic.go:26:7:26:9 | Before gs1 | +| generic.go:26:7:26:9 | gs1 | generic.go:26:7:26:18 | selection of Identity | +| generic.go:26:7:26:18 | After selection of Identity | generic.go:26:20:26:26 | "hello" | +| generic.go:26:7:26:18 | Before selection of Identity | generic.go:26:7:26:9 | gs1 | | generic.go:26:7:26:18 | selection of Identity | generic.go:26:7:26:18 | After selection of Identity | | generic.go:26:7:26:27 | After call to Identity | generic.go:26:2:26:27 | assign:0 ... := ... | | generic.go:26:7:26:27 | Before call to Identity | generic.go:26:7:26:18 | Before selection of Identity | | generic.go:26:7:26:27 | call to Identity | generic.go:24:1:35:1 | Exceptional Exit | | generic.go:26:7:26:27 | call to Identity | generic.go:26:7:26:27 | After call to Identity | -| generic.go:26:20:26:26 | "hello" | generic.go:26:20:26:26 | After "hello" | -| generic.go:26:20:26:26 | After "hello" | generic.go:26:7:26:27 | call to Identity | -| generic.go:26:20:26:26 | Before "hello" | generic.go:26:20:26:26 | "hello" | +| generic.go:26:20:26:26 | "hello" | generic.go:26:7:26:27 | call to Identity | | generic.go:27:2:27:48 | ... := ... | generic.go:27:9:27:48 | Before struct literal | | generic.go:27:2:27:48 | After ... := ... | generic.go:28:2:28:22 | ... := ... | | generic.go:27:2:27:48 | assign:0 ... := ... | generic.go:27:2:27:48 | After ... := ... | | generic.go:27:9:27:48 | After struct literal | generic.go:27:2:27:48 | assign:0 ... := ... | | generic.go:27:9:27:48 | Before struct literal | generic.go:27:9:27:48 | struct literal | -| generic.go:27:9:27:48 | struct literal | generic.go:27:40:27:42 | Before "y" | +| generic.go:27:9:27:48 | struct literal | generic.go:27:40:27:42 | "y" | | generic.go:27:40:27:42 | "y" | generic.go:27:40:27:42 | After "y" | | generic.go:27:40:27:42 | After "y" | generic.go:27:40:27:42 | lit-init "y" | -| generic.go:27:40:27:42 | Before "y" | generic.go:27:40:27:42 | "y" | -| generic.go:27:40:27:42 | lit-init "y" | generic.go:27:45:27:47 | Before "z" | +| generic.go:27:40:27:42 | lit-init "y" | generic.go:27:45:27:47 | "z" | | generic.go:27:45:27:47 | "z" | generic.go:27:45:27:47 | After "z" | | generic.go:27:45:27:47 | After "z" | generic.go:27:45:27:47 | lit-init "z" | -| generic.go:27:45:27:47 | Before "z" | generic.go:27:45:27:47 | "z" | | generic.go:27:45:27:47 | lit-init "z" | generic.go:27:9:27:48 | After struct literal | | generic.go:28:2:28:22 | ... := ... | generic.go:28:7:28:22 | Before call to Identity1 | | generic.go:28:2:28:22 | After ... := ... | generic.go:29:2:29:33 | ... := ... | | generic.go:28:2:28:22 | assign:0 ... := ... | generic.go:28:2:28:22 | After ... := ... | -| generic.go:28:7:28:9 | After gs2 | generic.go:28:7:28:19 | selection of Identity1 | -| generic.go:28:7:28:9 | Before gs2 | generic.go:28:7:28:9 | gs2 | -| generic.go:28:7:28:9 | gs2 | generic.go:28:7:28:9 | After gs2 | -| generic.go:28:7:28:19 | After selection of Identity1 | generic.go:28:21:28:21 | Before a | -| generic.go:28:7:28:19 | Before selection of Identity1 | generic.go:28:7:28:9 | Before gs2 | +| generic.go:28:7:28:9 | gs2 | generic.go:28:7:28:19 | selection of Identity1 | +| generic.go:28:7:28:19 | After selection of Identity1 | generic.go:28:21:28:21 | a | +| generic.go:28:7:28:19 | Before selection of Identity1 | generic.go:28:7:28:9 | gs2 | | generic.go:28:7:28:19 | selection of Identity1 | generic.go:28:7:28:19 | After selection of Identity1 | | generic.go:28:7:28:22 | After call to Identity1 | generic.go:28:2:28:22 | assign:0 ... := ... | | generic.go:28:7:28:22 | Before call to Identity1 | generic.go:28:7:28:19 | Before selection of Identity1 | | generic.go:28:7:28:22 | call to Identity1 | generic.go:24:1:35:1 | Exceptional Exit | | generic.go:28:7:28:22 | call to Identity1 | generic.go:28:7:28:22 | After call to Identity1 | -| generic.go:28:21:28:21 | After a | generic.go:28:7:28:22 | call to Identity1 | -| generic.go:28:21:28:21 | Before a | generic.go:28:21:28:21 | a | -| generic.go:28:21:28:21 | a | generic.go:28:21:28:21 | After a | +| generic.go:28:21:28:21 | a | generic.go:28:7:28:22 | call to Identity1 | | generic.go:29:2:29:33 | ... := ... | generic.go:29:7:29:33 | Before call to genericIdentity1 | | generic.go:29:2:29:33 | After ... := ... | generic.go:30:2:30:25 | ... := ... | | generic.go:29:2:29:33 | assign:0 ... := ... | generic.go:29:2:29:33 | After ... := ... | -| generic.go:29:7:29:22 | After genericIdentity1 | generic.go:29:7:29:30 | generic function instantiation expression | -| generic.go:29:7:29:22 | Before genericIdentity1 | generic.go:29:7:29:22 | genericIdentity1 | -| generic.go:29:7:29:22 | genericIdentity1 | generic.go:29:7:29:22 | After genericIdentity1 | -| generic.go:29:7:29:30 | After generic function instantiation expression | generic.go:29:32:29:32 | Before b | -| generic.go:29:7:29:30 | Before generic function instantiation expression | generic.go:29:7:29:22 | Before genericIdentity1 | +| generic.go:29:7:29:22 | genericIdentity1 | generic.go:29:7:29:30 | generic function instantiation expression | +| generic.go:29:7:29:30 | After generic function instantiation expression | generic.go:29:32:29:32 | b | +| generic.go:29:7:29:30 | Before generic function instantiation expression | generic.go:29:7:29:22 | genericIdentity1 | | generic.go:29:7:29:30 | generic function instantiation expression | generic.go:29:7:29:30 | After generic function instantiation expression | | generic.go:29:7:29:33 | After call to genericIdentity1 | generic.go:29:2:29:33 | assign:0 ... := ... | | generic.go:29:7:29:33 | Before call to genericIdentity1 | generic.go:29:7:29:30 | Before generic function instantiation expression | | generic.go:29:7:29:33 | call to genericIdentity1 | generic.go:24:1:35:1 | Exceptional Exit | | generic.go:29:7:29:33 | call to genericIdentity1 | generic.go:29:7:29:33 | After call to genericIdentity1 | -| generic.go:29:32:29:32 | After b | generic.go:29:7:29:33 | call to genericIdentity1 | -| generic.go:29:32:29:32 | Before b | generic.go:29:32:29:32 | b | -| generic.go:29:32:29:32 | b | generic.go:29:32:29:32 | After b | +| generic.go:29:32:29:32 | b | generic.go:29:7:29:33 | call to genericIdentity1 | | generic.go:30:2:30:25 | ... := ... | generic.go:30:7:30:25 | Before call to genericIdentity1 | | generic.go:30:2:30:25 | After ... := ... | generic.go:31:2:31:53 | ... := ... | | generic.go:30:2:30:25 | assign:0 ... := ... | generic.go:30:2:30:25 | After ... := ... | -| generic.go:30:7:30:22 | After genericIdentity1 | generic.go:30:24:30:24 | Before c | -| generic.go:30:7:30:22 | Before genericIdentity1 | generic.go:30:7:30:22 | genericIdentity1 | -| generic.go:30:7:30:22 | genericIdentity1 | generic.go:30:7:30:22 | After genericIdentity1 | +| generic.go:30:7:30:22 | genericIdentity1 | generic.go:30:24:30:24 | c | | generic.go:30:7:30:25 | After call to genericIdentity1 | generic.go:30:2:30:25 | assign:0 ... := ... | -| generic.go:30:7:30:25 | Before call to genericIdentity1 | generic.go:30:7:30:22 | Before genericIdentity1 | +| generic.go:30:7:30:25 | Before call to genericIdentity1 | generic.go:30:7:30:22 | genericIdentity1 | | generic.go:30:7:30:25 | call to genericIdentity1 | generic.go:24:1:35:1 | Exceptional Exit | | generic.go:30:7:30:25 | call to genericIdentity1 | generic.go:30:7:30:25 | After call to genericIdentity1 | -| generic.go:30:24:30:24 | After c | generic.go:30:7:30:25 | call to genericIdentity1 | -| generic.go:30:24:30:24 | Before c | generic.go:30:24:30:24 | c | -| generic.go:30:24:30:24 | c | generic.go:30:24:30:24 | After c | +| generic.go:30:24:30:24 | c | generic.go:30:7:30:25 | call to genericIdentity1 | | generic.go:31:2:31:53 | ... := ... | generic.go:31:10:31:53 | Before call to genericIdentity2 | | generic.go:31:2:31:53 | After ... := ... | generic.go:32:2:32:31 | ... := ... | | generic.go:31:2:31:53 | extract:0 ... := ... | generic.go:31:2:31:53 | extract:1 ... := ... | | generic.go:31:2:31:53 | extract:1 ... := ... | generic.go:31:2:31:53 | After ... := ... | -| generic.go:31:10:31:25 | After genericIdentity2 | generic.go:31:10:31:41 | generic function instantiation expression | -| generic.go:31:10:31:25 | Before genericIdentity2 | generic.go:31:10:31:25 | genericIdentity2 | -| generic.go:31:10:31:25 | genericIdentity2 | generic.go:31:10:31:25 | After genericIdentity2 | -| generic.go:31:10:31:41 | After generic function instantiation expression | generic.go:31:43:31:43 | Before d | -| generic.go:31:10:31:41 | Before generic function instantiation expression | generic.go:31:10:31:25 | Before genericIdentity2 | +| generic.go:31:10:31:25 | genericIdentity2 | generic.go:31:10:31:41 | generic function instantiation expression | +| generic.go:31:10:31:41 | After generic function instantiation expression | generic.go:31:43:31:43 | d | +| generic.go:31:10:31:41 | Before generic function instantiation expression | generic.go:31:10:31:25 | genericIdentity2 | | generic.go:31:10:31:41 | generic function instantiation expression | generic.go:31:10:31:41 | After generic function instantiation expression | | generic.go:31:10:31:53 | After call to genericIdentity2 | generic.go:31:2:31:53 | extract:0 ... := ... | | generic.go:31:10:31:53 | Before call to genericIdentity2 | generic.go:31:10:31:41 | Before generic function instantiation expression | | generic.go:31:10:31:53 | call to genericIdentity2 | generic.go:24:1:35:1 | Exceptional Exit | | generic.go:31:10:31:53 | call to genericIdentity2 | generic.go:31:10:31:53 | After call to genericIdentity2 | -| generic.go:31:43:31:43 | After d | generic.go:31:46:31:52 | Before "hello" | -| generic.go:31:43:31:43 | Before d | generic.go:31:43:31:43 | d | -| generic.go:31:43:31:43 | d | generic.go:31:43:31:43 | After d | -| generic.go:31:46:31:52 | "hello" | generic.go:31:46:31:52 | After "hello" | -| generic.go:31:46:31:52 | After "hello" | generic.go:31:10:31:53 | call to genericIdentity2 | -| generic.go:31:46:31:52 | Before "hello" | generic.go:31:46:31:52 | "hello" | +| generic.go:31:43:31:43 | d | generic.go:31:46:31:52 | "hello" | +| generic.go:31:46:31:52 | "hello" | generic.go:31:10:31:53 | call to genericIdentity2 | | generic.go:32:2:32:31 | ... := ... | generic.go:32:10:32:31 | Before call to genericIdentity2 | | generic.go:32:2:32:31 | After ... := ... | generic.go:33:2:33:6 | ... = ... | | generic.go:32:2:32:31 | extract:0 ... := ... | generic.go:32:2:32:31 | extract:1 ... := ... | | generic.go:32:2:32:31 | extract:1 ... := ... | generic.go:32:2:32:31 | After ... := ... | -| generic.go:32:10:32:25 | After genericIdentity2 | generic.go:32:27:32:27 | Before e | -| generic.go:32:10:32:25 | Before genericIdentity2 | generic.go:32:10:32:25 | genericIdentity2 | -| generic.go:32:10:32:25 | genericIdentity2 | generic.go:32:10:32:25 | After genericIdentity2 | +| generic.go:32:10:32:25 | genericIdentity2 | generic.go:32:27:32:27 | e | | generic.go:32:10:32:31 | After call to genericIdentity2 | generic.go:32:2:32:31 | extract:0 ... := ... | -| generic.go:32:10:32:31 | Before call to genericIdentity2 | generic.go:32:10:32:25 | Before genericIdentity2 | +| generic.go:32:10:32:31 | Before call to genericIdentity2 | generic.go:32:10:32:25 | genericIdentity2 | | generic.go:32:10:32:31 | call to genericIdentity2 | generic.go:24:1:35:1 | Exceptional Exit | | generic.go:32:10:32:31 | call to genericIdentity2 | generic.go:32:10:32:31 | After call to genericIdentity2 | -| generic.go:32:27:32:27 | After e | generic.go:32:30:32:30 | Before f | -| generic.go:32:27:32:27 | Before e | generic.go:32:27:32:27 | e | -| generic.go:32:27:32:27 | e | generic.go:32:27:32:27 | After e | -| generic.go:32:30:32:30 | After f | generic.go:32:10:32:31 | call to genericIdentity2 | -| generic.go:32:30:32:30 | Before f | generic.go:32:30:32:30 | f | -| generic.go:32:30:32:30 | f | generic.go:32:30:32:30 | After f | -| generic.go:33:2:33:6 | ... = ... | generic.go:33:6:33:6 | Before g | +| generic.go:32:27:32:27 | e | generic.go:32:30:32:30 | f | +| generic.go:32:30:32:30 | f | generic.go:32:10:32:31 | call to genericIdentity2 | +| generic.go:33:2:33:6 | ... = ... | generic.go:33:6:33:6 | g | | generic.go:33:2:33:6 | After ... = ... | generic.go:34:2:34:6 | ... = ... | -| generic.go:33:6:33:6 | After g | generic.go:33:2:33:6 | After ... = ... | -| generic.go:33:6:33:6 | Before g | generic.go:33:6:33:6 | g | -| generic.go:33:6:33:6 | g | generic.go:33:6:33:6 | After g | -| generic.go:34:2:34:6 | ... = ... | generic.go:34:6:34:6 | Before h | +| generic.go:33:6:33:6 | g | generic.go:33:2:33:6 | After ... = ... | +| generic.go:34:2:34:6 | ... = ... | generic.go:34:6:34:6 | h | | generic.go:34:2:34:6 | After ... = ... | generic.go:24:16:35:1 | After block statement | -| generic.go:34:6:34:6 | After h | generic.go:34:2:34:6 | After ... = ... | -| generic.go:34:6:34:6 | Before h | generic.go:34:6:34:6 | h | -| generic.go:34:6:34:6 | h | generic.go:34:6:34:6 | After h | +| generic.go:34:6:34:6 | h | generic.go:34:2:34:6 | After ... = ... | | hello.go:0:0:0:0 | After hello.go | hello.go:0:0:0:0 | Normal Exit | | hello.go:0:0:0:0 | Entry | hello.go:0:0:0:0 | hello.go | | hello.go:0:0:0:0 | Normal Exit | hello.go:0:0:0:0 | Exit | @@ -1803,10 +1438,8 @@ | hello.go:5:1:5:31 | constant declaration | hello.go:5:7:5:31 | value declaration specifier | | hello.go:5:7:5:31 | After value declaration specifier | hello.go:5:1:5:31 | After constant declaration | | hello.go:5:7:5:31 | assign:0 value declaration specifier | hello.go:5:7:5:31 | After value declaration specifier | -| hello.go:5:7:5:31 | value declaration specifier | hello.go:5:17:5:31 | Before "Hello, world!" | -| hello.go:5:17:5:31 | "Hello, world!" | hello.go:5:17:5:31 | After "Hello, world!" | -| hello.go:5:17:5:31 | After "Hello, world!" | hello.go:5:7:5:31 | assign:0 value declaration specifier | -| hello.go:5:17:5:31 | Before "Hello, world!" | hello.go:5:17:5:31 | "Hello, world!" | +| hello.go:5:7:5:31 | value declaration specifier | hello.go:5:17:5:31 | "Hello, world!" | +| hello.go:5:17:5:31 | "Hello, world!" | hello.go:5:7:5:31 | assign:0 value declaration specifier | | hello.go:7:1:9:1 | After function declaration | hello.go:0:0:0:0 | After hello.go | | hello.go:7:1:9:1 | Before function declaration | hello.go:7:1:9:1 | function declaration | | hello.go:7:1:9:1 | Entry | hello.go:7:17:9:1 | block statement | @@ -1815,7 +1448,7 @@ | hello.go:7:1:9:1 | function declaration | hello.go:7:1:9:1 | After function declaration | | hello.go:7:17:9:1 | After block statement | hello.go:7:1:9:1 | Normal Exit | | hello.go:7:17:9:1 | block statement | hello.go:8:2:8:21 | expression statement | -| hello.go:8:2:8:12 | After selection of Println | hello.go:8:14:8:20 | Before message | +| hello.go:8:2:8:12 | After selection of Println | hello.go:8:14:8:20 | message | | hello.go:8:2:8:12 | Before selection of Println | hello.go:8:2:8:12 | selection of Println | | hello.go:8:2:8:12 | selection of Println | hello.go:8:2:8:12 | After selection of Println | | hello.go:8:2:8:21 | After call to Println | hello.go:8:2:8:21 | After expression statement | @@ -1824,9 +1457,7 @@ | hello.go:8:2:8:21 | call to Println | hello.go:7:1:9:1 | Exceptional Exit | | hello.go:8:2:8:21 | call to Println | hello.go:8:2:8:21 | After call to Println | | hello.go:8:2:8:21 | expression statement | hello.go:8:2:8:21 | Before call to Println | -| hello.go:8:14:8:20 | After message | hello.go:8:2:8:21 | call to Println | -| hello.go:8:14:8:20 | Before message | hello.go:8:14:8:20 | message | -| hello.go:8:14:8:20 | message | hello.go:8:14:8:20 | After message | +| hello.go:8:14:8:20 | message | hello.go:8:2:8:21 | call to Println | | main.go:0:0:0:0 | After main.go | main.go:0:0:0:0 | Normal Exit | | main.go:0:0:0:0 | Entry | main.go:0:0:0:0 | main.go | | main.go:0:0:0:0 | Normal Exit | main.go:0:0:0:0 | Exit | @@ -1847,16 +1478,14 @@ | main.go:9:9:9:20 | After selection of Float64 | main.go:9:9:9:22 | call to Float64 | | main.go:9:9:9:20 | Before selection of Float64 | main.go:9:9:9:20 | selection of Float64 | | main.go:9:9:9:20 | selection of Float64 | main.go:9:9:9:20 | After selection of Float64 | -| main.go:9:9:9:22 | After call to Float64 | main.go:9:27:9:29 | Before 0.5 | +| main.go:9:9:9:22 | After call to Float64 | main.go:9:27:9:29 | 0.5 | | main.go:9:9:9:22 | Before call to Float64 | main.go:9:9:9:20 | Before selection of Float64 | | main.go:9:9:9:22 | call to Float64 | main.go:8:1:10:1 | Exceptional Exit | | main.go:9:9:9:22 | call to Float64 | main.go:9:9:9:22 | After call to Float64 | | main.go:9:9:9:29 | ...>=... | main.go:9:9:9:29 | After ...>=... | | main.go:9:9:9:29 | After ...>=... | main.go:9:2:9:29 | return statement | | main.go:9:9:9:29 | Before ...>=... | main.go:9:9:9:22 | Before call to Float64 | -| main.go:9:27:9:29 | 0.5 | main.go:9:27:9:29 | After 0.5 | -| main.go:9:27:9:29 | After 0.5 | main.go:9:9:9:29 | ...>=... | -| main.go:9:27:9:29 | Before 0.5 | main.go:9:27:9:29 | 0.5 | +| main.go:9:27:9:29 | 0.5 | main.go:9:9:9:29 | ...>=... | | main.go:12:1:24:1 | After function declaration | main.go:26:1:32:1 | Before function declaration | | main.go:12:1:24:1 | Before function declaration | main.go:12:1:24:1 | function declaration | | main.go:12:1:24:1 | Entry | main.go:12:13:24:1 | block statement | @@ -1872,13 +1501,11 @@ | main.go:13:6:13:10 | After value declaration specifier | main.go:13:2:13:10 | After variable declaration | | main.go:13:6:13:10 | value declaration specifier | main.go:13:6:13:10 | zero-init:0 value declaration specifier | | main.go:13:6:13:10 | zero-init:0 value declaration specifier | main.go:13:6:13:10 | After value declaration specifier | -| main.go:14:2:14:8 | ... := ... | main.go:14:7:14:8 | Before 23 | +| main.go:14:2:14:8 | ... := ... | main.go:14:7:14:8 | 23 | | main.go:14:2:14:8 | After ... := ... | main.go:15:2:15:16 | expression statement | | main.go:14:2:14:8 | assign:0 ... := ... | main.go:14:2:14:8 | After ... := ... | -| main.go:14:7:14:8 | 23 | main.go:14:7:14:8 | After 23 | -| main.go:14:7:14:8 | After 23 | main.go:14:2:14:8 | assign:0 ... := ... | -| main.go:14:7:14:8 | Before 23 | main.go:14:7:14:8 | 23 | -| main.go:15:2:15:10 | After selection of Print | main.go:15:12:15:12 | Before x | +| main.go:14:7:14:8 | 23 | main.go:14:2:14:8 | assign:0 ... := ... | +| main.go:15:2:15:10 | After selection of Print | main.go:15:12:15:12 | x | | main.go:15:2:15:10 | Before selection of Print | main.go:15:2:15:10 | selection of Print | | main.go:15:2:15:10 | selection of Print | main.go:15:2:15:10 | After selection of Print | | main.go:15:2:15:16 | After call to Print | main.go:15:2:15:16 | After expression statement | @@ -1887,35 +1514,25 @@ | main.go:15:2:15:16 | call to Print | main.go:12:1:24:1 | Exceptional Exit | | main.go:15:2:15:16 | call to Print | main.go:15:2:15:16 | After call to Print | | main.go:15:2:15:16 | expression statement | main.go:15:2:15:16 | Before call to Print | -| main.go:15:12:15:12 | After x | main.go:15:15:15:15 | Before y | -| main.go:15:12:15:12 | Before x | main.go:15:12:15:12 | x | -| main.go:15:12:15:12 | x | main.go:15:12:15:12 | After x | -| main.go:15:15:15:15 | After y | main.go:15:2:15:16 | call to Print | -| main.go:15:15:15:15 | Before y | main.go:15:15:15:15 | y | -| main.go:15:15:15:15 | y | main.go:15:15:15:15 | After y | +| main.go:15:12:15:12 | x | main.go:15:15:15:15 | y | +| main.go:15:15:15:15 | y | main.go:15:2:15:16 | call to Print | | main.go:16:2:18:2 | After if statement | main.go:19:2:19:16 | expression statement | | main.go:16:2:18:2 | if statement | main.go:16:5:16:10 | Before call to cond | -| main.go:16:5:16:8 | After cond | main.go:16:5:16:10 | call to cond | -| main.go:16:5:16:8 | Before cond | main.go:16:5:16:8 | cond | -| main.go:16:5:16:8 | cond | main.go:16:5:16:8 | After cond | +| main.go:16:5:16:8 | cond | main.go:16:5:16:10 | call to cond | | main.go:16:5:16:10 | After call to cond [false] | main.go:16:2:18:2 | After if statement | | main.go:16:5:16:10 | After call to cond [true] | main.go:16:12:18:2 | block statement | -| main.go:16:5:16:10 | Before call to cond | main.go:16:5:16:8 | Before cond | +| main.go:16:5:16:10 | Before call to cond | main.go:16:5:16:8 | cond | | main.go:16:5:16:10 | call to cond | main.go:12:1:24:1 | Exceptional Exit | | main.go:16:5:16:10 | call to cond | main.go:16:5:16:10 | After call to cond [false] | | main.go:16:5:16:10 | call to cond | main.go:16:5:16:10 | After call to cond [true] | | main.go:16:12:18:2 | After block statement | main.go:16:2:18:2 | After if statement | | main.go:16:12:18:2 | block statement | main.go:17:3:17:9 | Before ... += ... | -| main.go:17:3:17:3 | After y | main.go:17:8:17:9 | Before 19 | -| main.go:17:3:17:3 | Before y | main.go:17:3:17:3 | y | -| main.go:17:3:17:3 | y | main.go:17:3:17:3 | After y | +| main.go:17:3:17:3 | y | main.go:17:8:17:9 | 19 | | main.go:17:3:17:9 | ... += ... | main.go:17:3:17:9 | After ... += ... | | main.go:17:3:17:9 | After ... += ... | main.go:16:12:18:2 | After block statement | -| main.go:17:3:17:9 | Before ... += ... | main.go:17:3:17:3 | Before y | -| main.go:17:8:17:9 | 19 | main.go:17:8:17:9 | After 19 | -| main.go:17:8:17:9 | After 19 | main.go:17:3:17:9 | ... += ... | -| main.go:17:8:17:9 | Before 19 | main.go:17:8:17:9 | 19 | -| main.go:19:2:19:10 | After selection of Print | main.go:19:12:19:12 | Before x | +| main.go:17:3:17:9 | Before ... += ... | main.go:17:3:17:3 | y | +| main.go:17:8:17:9 | 19 | main.go:17:3:17:9 | ... += ... | +| main.go:19:2:19:10 | After selection of Print | main.go:19:12:19:12 | x | | main.go:19:2:19:10 | Before selection of Print | main.go:19:2:19:10 | selection of Print | | main.go:19:2:19:10 | selection of Print | main.go:19:2:19:10 | After selection of Print | | main.go:19:2:19:16 | After call to Print | main.go:19:2:19:16 | After expression statement | @@ -1924,32 +1541,24 @@ | main.go:19:2:19:16 | call to Print | main.go:12:1:24:1 | Exceptional Exit | | main.go:19:2:19:16 | call to Print | main.go:19:2:19:16 | After call to Print | | main.go:19:2:19:16 | expression statement | main.go:19:2:19:16 | Before call to Print | -| main.go:19:12:19:12 | After x | main.go:19:15:19:15 | Before y | -| main.go:19:12:19:12 | Before x | main.go:19:12:19:12 | x | -| main.go:19:12:19:12 | x | main.go:19:12:19:12 | After x | -| main.go:19:15:19:15 | After y | main.go:19:2:19:16 | call to Print | -| main.go:19:15:19:15 | Before y | main.go:19:15:19:15 | y | -| main.go:19:15:19:15 | y | main.go:19:15:19:15 | After y | +| main.go:19:12:19:12 | x | main.go:19:15:19:15 | y | +| main.go:19:15:19:15 | y | main.go:19:2:19:16 | call to Print | | main.go:20:2:22:2 | After if statement | main.go:23:2:23:16 | expression statement | | main.go:20:2:22:2 | if statement | main.go:20:5:20:10 | Before call to cond | -| main.go:20:5:20:8 | After cond | main.go:20:5:20:10 | call to cond | -| main.go:20:5:20:8 | Before cond | main.go:20:5:20:8 | cond | -| main.go:20:5:20:8 | cond | main.go:20:5:20:8 | After cond | +| main.go:20:5:20:8 | cond | main.go:20:5:20:10 | call to cond | | main.go:20:5:20:10 | After call to cond [false] | main.go:20:2:22:2 | After if statement | | main.go:20:5:20:10 | After call to cond [true] | main.go:20:12:22:2 | block statement | -| main.go:20:5:20:10 | Before call to cond | main.go:20:5:20:8 | Before cond | +| main.go:20:5:20:10 | Before call to cond | main.go:20:5:20:8 | cond | | main.go:20:5:20:10 | call to cond | main.go:12:1:24:1 | Exceptional Exit | | main.go:20:5:20:10 | call to cond | main.go:20:5:20:10 | After call to cond [false] | | main.go:20:5:20:10 | call to cond | main.go:20:5:20:10 | After call to cond [true] | | main.go:20:12:22:2 | After block statement | main.go:20:2:22:2 | After if statement | | main.go:20:12:22:2 | block statement | main.go:21:3:21:7 | ... = ... | -| main.go:21:3:21:7 | ... = ... | main.go:21:7:21:7 | Before y | +| main.go:21:3:21:7 | ... = ... | main.go:21:7:21:7 | y | | main.go:21:3:21:7 | After ... = ... | main.go:20:12:22:2 | After block statement | | main.go:21:3:21:7 | assign:0 ... = ... | main.go:21:3:21:7 | After ... = ... | -| main.go:21:7:21:7 | After y | main.go:21:3:21:7 | assign:0 ... = ... | -| main.go:21:7:21:7 | Before y | main.go:21:7:21:7 | y | -| main.go:21:7:21:7 | y | main.go:21:7:21:7 | After y | -| main.go:23:2:23:10 | After selection of Print | main.go:23:12:23:12 | Before x | +| main.go:21:7:21:7 | y | main.go:21:3:21:7 | assign:0 ... = ... | +| main.go:23:2:23:10 | After selection of Print | main.go:23:12:23:12 | x | | main.go:23:2:23:10 | Before selection of Print | main.go:23:2:23:10 | selection of Print | | main.go:23:2:23:10 | selection of Print | main.go:23:2:23:10 | After selection of Print | | main.go:23:2:23:16 | After call to Print | main.go:23:2:23:16 | After expression statement | @@ -1958,12 +1567,8 @@ | main.go:23:2:23:16 | call to Print | main.go:12:1:24:1 | Exceptional Exit | | main.go:23:2:23:16 | call to Print | main.go:23:2:23:16 | After call to Print | | main.go:23:2:23:16 | expression statement | main.go:23:2:23:16 | Before call to Print | -| main.go:23:12:23:12 | After x | main.go:23:15:23:15 | Before y | -| main.go:23:12:23:12 | Before x | main.go:23:12:23:12 | x | -| main.go:23:12:23:12 | x | main.go:23:12:23:12 | After x | -| main.go:23:15:23:15 | After y | main.go:23:2:23:16 | call to Print | -| main.go:23:15:23:15 | Before y | main.go:23:15:23:15 | y | -| main.go:23:15:23:15 | y | main.go:23:15:23:15 | After y | +| main.go:23:12:23:12 | x | main.go:23:15:23:15 | y | +| main.go:23:15:23:15 | y | main.go:23:2:23:16 | call to Print | | main.go:26:1:32:1 | After function declaration | main.go:34:1:36:1 | Before function declaration | | main.go:26:1:32:1 | Before function declaration | main.go:26:1:32:1 | function declaration | | main.go:26:1:32:1 | Entry | main.go:26:10:26:10 | x | @@ -1972,47 +1577,33 @@ | main.go:26:1:32:1 | function declaration | main.go:26:1:32:1 | After function declaration | | main.go:26:10:26:10 | x | main.go:26:28:32:1 | block statement | | main.go:26:28:32:1 | block statement | main.go:27:2:27:13 | ... := ... | -| main.go:27:2:27:13 | ... := ... | main.go:27:10:27:10 | Before x | +| main.go:27:2:27:13 | ... := ... | main.go:27:10:27:10 | x | | main.go:27:2:27:13 | After ... := ... | main.go:28:2:30:2 | if statement | | main.go:27:2:27:13 | assign:0 ... := ... | main.go:27:2:27:13 | assign:1 ... := ... | | main.go:27:2:27:13 | assign:1 ... := ... | main.go:27:2:27:13 | After ... := ... | -| main.go:27:10:27:10 | After x | main.go:27:13:27:13 | Before 0 | -| main.go:27:10:27:10 | Before x | main.go:27:10:27:10 | x | -| main.go:27:10:27:10 | x | main.go:27:10:27:10 | After x | -| main.go:27:13:27:13 | 0 | main.go:27:13:27:13 | After 0 | -| main.go:27:13:27:13 | After 0 | main.go:27:2:27:13 | assign:0 ... := ... | -| main.go:27:13:27:13 | Before 0 | main.go:27:13:27:13 | 0 | +| main.go:27:10:27:10 | x | main.go:27:13:27:13 | 0 | +| main.go:27:13:27:13 | 0 | main.go:27:2:27:13 | assign:0 ... := ... | | main.go:28:2:30:2 | After if statement | main.go:31:2:31:12 | Before return statement | | main.go:28:2:30:2 | if statement | main.go:28:5:28:10 | Before call to cond | -| main.go:28:5:28:8 | After cond | main.go:28:5:28:10 | call to cond | -| main.go:28:5:28:8 | Before cond | main.go:28:5:28:8 | cond | -| main.go:28:5:28:8 | cond | main.go:28:5:28:8 | After cond | +| main.go:28:5:28:8 | cond | main.go:28:5:28:10 | call to cond | | main.go:28:5:28:10 | After call to cond [false] | main.go:28:2:30:2 | After if statement | | main.go:28:5:28:10 | After call to cond [true] | main.go:28:12:30:2 | block statement | -| main.go:28:5:28:10 | Before call to cond | main.go:28:5:28:8 | Before cond | +| main.go:28:5:28:10 | Before call to cond | main.go:28:5:28:8 | cond | | main.go:28:5:28:10 | call to cond | main.go:26:1:32:1 | Exceptional Exit | | main.go:28:5:28:10 | call to cond | main.go:28:5:28:10 | After call to cond [false] | | main.go:28:5:28:10 | call to cond | main.go:28:5:28:10 | After call to cond [true] | | main.go:28:12:30:2 | After block statement | main.go:28:2:30:2 | After if statement | | main.go:28:12:30:2 | block statement | main.go:29:3:29:13 | ... = ... | -| main.go:29:3:29:13 | ... = ... | main.go:29:10:29:10 | Before b | +| main.go:29:3:29:13 | ... = ... | main.go:29:10:29:10 | b | | main.go:29:3:29:13 | After ... = ... | main.go:28:12:30:2 | After block statement | | main.go:29:3:29:13 | assign:0 ... = ... | main.go:29:3:29:13 | assign:1 ... = ... | | main.go:29:3:29:13 | assign:1 ... = ... | main.go:29:3:29:13 | After ... = ... | -| main.go:29:10:29:10 | After b | main.go:29:13:29:13 | Before a | -| main.go:29:10:29:10 | Before b | main.go:29:10:29:10 | b | -| main.go:29:10:29:10 | b | main.go:29:10:29:10 | After b | -| main.go:29:13:29:13 | After a | main.go:29:3:29:13 | assign:0 ... = ... | -| main.go:29:13:29:13 | Before a | main.go:29:13:29:13 | a | -| main.go:29:13:29:13 | a | main.go:29:13:29:13 | After a | -| main.go:31:2:31:12 | Before return statement | main.go:31:9:31:9 | Before a | +| main.go:29:10:29:10 | b | main.go:29:13:29:13 | a | +| main.go:29:13:29:13 | a | main.go:29:3:29:13 | assign:0 ... = ... | +| main.go:31:2:31:12 | Before return statement | main.go:31:9:31:9 | a | | main.go:31:2:31:12 | return statement | main.go:26:1:32:1 | Normal Exit | -| main.go:31:9:31:9 | After a | main.go:31:12:31:12 | Before b | -| main.go:31:9:31:9 | Before a | main.go:31:9:31:9 | a | -| main.go:31:9:31:9 | a | main.go:31:9:31:9 | After a | -| main.go:31:12:31:12 | After b | main.go:31:2:31:12 | return statement | -| main.go:31:12:31:12 | Before b | main.go:31:12:31:12 | b | -| main.go:31:12:31:12 | b | main.go:31:12:31:12 | After b | +| main.go:31:9:31:9 | a | main.go:31:12:31:12 | b | +| main.go:31:12:31:12 | b | main.go:31:2:31:12 | return statement | | main.go:34:1:36:1 | After function declaration | main.go:38:1:45:1 | Before function declaration | | main.go:34:1:36:1 | Before function declaration | main.go:34:1:36:1 | function declaration | | main.go:34:1:36:1 | Entry | main.go:34:11:34:11 | x | @@ -2021,18 +1612,14 @@ | main.go:34:11:34:11 | x | main.go:34:19:36:1 | block statement | | main.go:34:19:36:1 | After block statement | main.go:34:1:36:1 | Normal Exit | | main.go:34:19:36:1 | block statement | main.go:35:2:35:9 | Before ... += ... | -| main.go:35:2:35:3 | After star expression | main.go:35:8:35:9 | Before 19 | -| main.go:35:2:35:3 | Before star expression | main.go:35:3:35:3 | Before x | +| main.go:35:2:35:3 | After star expression | main.go:35:8:35:9 | 19 | +| main.go:35:2:35:3 | Before star expression | main.go:35:3:35:3 | x | | main.go:35:2:35:3 | star expression | main.go:35:2:35:3 | After star expression | | main.go:35:2:35:9 | ... += ... | main.go:35:2:35:9 | After ... += ... | | main.go:35:2:35:9 | After ... += ... | main.go:34:19:36:1 | After block statement | | main.go:35:2:35:9 | Before ... += ... | main.go:35:2:35:3 | Before star expression | -| main.go:35:3:35:3 | After x | main.go:35:2:35:3 | star expression | -| main.go:35:3:35:3 | Before x | main.go:35:3:35:3 | x | -| main.go:35:3:35:3 | x | main.go:35:3:35:3 | After x | -| main.go:35:8:35:9 | 19 | main.go:35:8:35:9 | After 19 | -| main.go:35:8:35:9 | After 19 | main.go:35:2:35:9 | ... += ... | -| main.go:35:8:35:9 | Before 19 | main.go:35:8:35:9 | 19 | +| main.go:35:3:35:3 | x | main.go:35:2:35:3 | star expression | +| main.go:35:8:35:9 | 19 | main.go:35:2:35:9 | ... += ... | | main.go:38:1:45:1 | After function declaration | main.go:47:1:50:1 | Before function declaration | | main.go:38:1:45:1 | Before function declaration | main.go:38:1:45:1 | function declaration | | main.go:38:1:45:1 | Entry | main.go:38:12:45:1 | block statement | @@ -2041,47 +1628,37 @@ | main.go:38:1:45:1 | function declaration | main.go:38:1:45:1 | After function declaration | | main.go:38:12:45:1 | After block statement | main.go:38:1:45:1 | Normal Exit | | main.go:38:12:45:1 | block statement | main.go:39:2:39:8 | ... := ... | -| main.go:39:2:39:8 | ... := ... | main.go:39:7:39:8 | Before 23 | +| main.go:39:2:39:8 | ... := ... | main.go:39:7:39:8 | 23 | | main.go:39:2:39:8 | After ... := ... | main.go:40:2:40:10 | ... := ... | | main.go:39:2:39:8 | assign:0 ... := ... | main.go:39:2:39:8 | After ... := ... | -| main.go:39:7:39:8 | 23 | main.go:39:7:39:8 | After 23 | -| main.go:39:7:39:8 | After 23 | main.go:39:2:39:8 | assign:0 ... := ... | -| main.go:39:7:39:8 | Before 23 | main.go:39:7:39:8 | 23 | +| main.go:39:7:39:8 | 23 | main.go:39:2:39:8 | assign:0 ... := ... | | main.go:40:2:40:10 | ... := ... | main.go:40:9:40:10 | Before &... | | main.go:40:2:40:10 | After ... := ... | main.go:41:2:43:2 | if statement | | main.go:40:2:40:10 | assign:0 ... := ... | main.go:40:2:40:10 | After ... := ... | | main.go:40:9:40:10 | &... | main.go:40:9:40:10 | After &... | | main.go:40:9:40:10 | After &... | main.go:40:2:40:10 | assign:0 ... := ... | -| main.go:40:9:40:10 | Before &... | main.go:40:10:40:10 | Before x | -| main.go:40:10:40:10 | After x | main.go:40:9:40:10 | &... | -| main.go:40:10:40:10 | Before x | main.go:40:10:40:10 | x | -| main.go:40:10:40:10 | x | main.go:40:10:40:10 | After x | +| main.go:40:9:40:10 | Before &... | main.go:40:10:40:10 | x | +| main.go:40:10:40:10 | x | main.go:40:9:40:10 | &... | | main.go:41:2:43:2 | After if statement | main.go:44:2:44:13 | expression statement | | main.go:41:2:43:2 | if statement | main.go:41:5:41:10 | Before call to cond | -| main.go:41:5:41:8 | After cond | main.go:41:5:41:10 | call to cond | -| main.go:41:5:41:8 | Before cond | main.go:41:5:41:8 | cond | -| main.go:41:5:41:8 | cond | main.go:41:5:41:8 | After cond | +| main.go:41:5:41:8 | cond | main.go:41:5:41:10 | call to cond | | main.go:41:5:41:10 | After call to cond [false] | main.go:41:2:43:2 | After if statement | | main.go:41:5:41:10 | After call to cond [true] | main.go:41:12:43:2 | block statement | -| main.go:41:5:41:10 | Before call to cond | main.go:41:5:41:8 | Before cond | +| main.go:41:5:41:10 | Before call to cond | main.go:41:5:41:8 | cond | | main.go:41:5:41:10 | call to cond | main.go:38:1:45:1 | Exceptional Exit | | main.go:41:5:41:10 | call to cond | main.go:41:5:41:10 | After call to cond [false] | | main.go:41:5:41:10 | call to cond | main.go:41:5:41:10 | After call to cond [true] | | main.go:41:12:43:2 | After block statement | main.go:41:2:43:2 | After if statement | | main.go:41:12:43:2 | block statement | main.go:42:3:42:11 | expression statement | -| main.go:42:3:42:6 | After bump | main.go:42:8:42:10 | Before ptr | -| main.go:42:3:42:6 | Before bump | main.go:42:3:42:6 | bump | -| main.go:42:3:42:6 | bump | main.go:42:3:42:6 | After bump | +| main.go:42:3:42:6 | bump | main.go:42:8:42:10 | ptr | | main.go:42:3:42:11 | After call to bump | main.go:42:3:42:11 | After expression statement | | main.go:42:3:42:11 | After expression statement | main.go:41:12:43:2 | After block statement | -| main.go:42:3:42:11 | Before call to bump | main.go:42:3:42:6 | Before bump | +| main.go:42:3:42:11 | Before call to bump | main.go:42:3:42:6 | bump | | main.go:42:3:42:11 | call to bump | main.go:38:1:45:1 | Exceptional Exit | | main.go:42:3:42:11 | call to bump | main.go:42:3:42:11 | After call to bump | | main.go:42:3:42:11 | expression statement | main.go:42:3:42:11 | Before call to bump | -| main.go:42:8:42:10 | After ptr | main.go:42:3:42:11 | call to bump | -| main.go:42:8:42:10 | Before ptr | main.go:42:8:42:10 | ptr | -| main.go:42:8:42:10 | ptr | main.go:42:8:42:10 | After ptr | -| main.go:44:2:44:10 | After selection of Print | main.go:44:12:44:12 | Before x | +| main.go:42:8:42:10 | ptr | main.go:42:3:42:11 | call to bump | +| main.go:44:2:44:10 | After selection of Print | main.go:44:12:44:12 | x | | main.go:44:2:44:10 | Before selection of Print | main.go:44:2:44:10 | selection of Print | | main.go:44:2:44:10 | selection of Print | main.go:44:2:44:10 | After selection of Print | | main.go:44:2:44:13 | After call to Print | main.go:44:2:44:13 | After expression statement | @@ -2090,9 +1667,7 @@ | main.go:44:2:44:13 | call to Print | main.go:38:1:45:1 | Exceptional Exit | | main.go:44:2:44:13 | call to Print | main.go:44:2:44:13 | After call to Print | | main.go:44:2:44:13 | expression statement | main.go:44:2:44:13 | Before call to Print | -| main.go:44:12:44:12 | After x | main.go:44:2:44:13 | call to Print | -| main.go:44:12:44:12 | Before x | main.go:44:12:44:12 | x | -| main.go:44:12:44:12 | x | main.go:44:12:44:12 | After x | +| main.go:44:12:44:12 | x | main.go:44:2:44:13 | call to Print | | main.go:47:1:50:1 | After function declaration | main.go:52:1:54:1 | Before function declaration | | main.go:47:1:50:1 | Before function declaration | main.go:47:1:50:1 | function declaration | | main.go:47:1:50:1 | Entry | main.go:47:25:50:1 | block statement | @@ -2102,12 +1677,10 @@ | main.go:47:25:50:1 | block statement | main.go:47:25:50:1 | zero-init:0 block statement | | main.go:47:25:50:1 | result-read:0 block statement | main.go:47:25:50:1 | After block statement | | main.go:47:25:50:1 | zero-init:0 block statement | main.go:48:2:48:12 | ... = ... | -| main.go:48:2:48:12 | ... = ... | main.go:48:11:48:12 | Before 42 | +| main.go:48:2:48:12 | ... = ... | main.go:48:11:48:12 | 42 | | main.go:48:2:48:12 | After ... = ... | main.go:49:2:49:7 | Before return statement | | main.go:48:2:48:12 | assign:0 ... = ... | main.go:48:2:48:12 | After ... = ... | -| main.go:48:11:48:12 | 42 | main.go:48:11:48:12 | After 42 | -| main.go:48:11:48:12 | After 42 | main.go:48:2:48:12 | assign:0 ... = ... | -| main.go:48:11:48:12 | Before 42 | main.go:48:11:48:12 | 42 | +| main.go:48:11:48:12 | 42 | main.go:48:2:48:12 | assign:0 ... = ... | | main.go:49:2:49:7 | Before return statement | main.go:49:2:49:7 | return statement | | main.go:49:2:49:7 | return statement | main.go:47:25:50:1 | result-read:0 block statement | | main.go:52:1:54:1 | After function declaration | main.go:56:1:64:1 | Before function declaration | @@ -2131,40 +1704,30 @@ | main.go:56:38:64:1 | block statement | main.go:56:38:64:1 | zero-init:0 block statement | | main.go:56:38:64:1 | result-read:0 block statement | main.go:56:38:64:1 | After block statement | | main.go:56:38:64:1 | zero-init:0 block statement | main.go:57:2:57:11 | ... = ... | -| main.go:57:2:57:11 | ... = ... | main.go:57:11:57:11 | Before 0 | +| main.go:57:2:57:11 | ... = ... | main.go:57:11:57:11 | 0 | | main.go:57:2:57:11 | After ... = ... | main.go:58:2:62:2 | if statement | | main.go:57:2:57:11 | assign:0 ... = ... | main.go:57:2:57:11 | After ... = ... | -| main.go:57:11:57:11 | 0 | main.go:57:11:57:11 | After 0 | -| main.go:57:11:57:11 | After 0 | main.go:57:2:57:11 | assign:0 ... = ... | -| main.go:57:11:57:11 | Before 0 | main.go:57:11:57:11 | 0 | +| main.go:57:11:57:11 | 0 | main.go:57:2:57:11 | assign:0 ... = ... | | main.go:58:2:62:2 | After if statement | main.go:63:2:63:7 | Before return statement | | main.go:58:2:62:2 | if statement | main.go:58:5:58:17 | Before ...==... | -| main.go:58:5:58:12 | After selector | main.go:58:17:58:17 | Before 1 | -| main.go:58:5:58:12 | Before selector | main.go:58:5:58:12 | selector | -| main.go:58:5:58:12 | selector | main.go:58:5:58:12 | After selector | +| main.go:58:5:58:12 | selector | main.go:58:17:58:17 | 1 | | main.go:58:5:58:17 | ...==... | main.go:58:5:58:17 | After ...==... [false] | | main.go:58:5:58:17 | ...==... | main.go:58:5:58:17 | After ...==... [true] | | main.go:58:5:58:17 | After ...==... [false] | main.go:60:9:62:2 | block statement | | main.go:58:5:58:17 | After ...==... [true] | main.go:58:19:60:2 | block statement | -| main.go:58:5:58:17 | Before ...==... | main.go:58:5:58:12 | Before selector | -| main.go:58:17:58:17 | 1 | main.go:58:17:58:17 | After 1 | -| main.go:58:17:58:17 | After 1 | main.go:58:5:58:17 | ...==... | -| main.go:58:17:58:17 | Before 1 | main.go:58:17:58:17 | 1 | +| main.go:58:5:58:17 | Before ...==... | main.go:58:5:58:12 | selector | +| main.go:58:17:58:17 | 1 | main.go:58:5:58:17 | ...==... | | main.go:58:19:60:2 | block statement | main.go:59:3:59:10 | Before return statement | -| main.go:59:3:59:10 | Before return statement | main.go:59:10:59:10 | Before 1 | +| main.go:59:3:59:10 | Before return statement | main.go:59:10:59:10 | 1 | | main.go:59:3:59:10 | result-write:0 return statement | main.go:59:3:59:10 | return statement | | main.go:59:3:59:10 | return statement | main.go:56:38:64:1 | result-read:0 block statement | -| main.go:59:10:59:10 | 1 | main.go:59:10:59:10 | After 1 | -| main.go:59:10:59:10 | After 1 | main.go:59:3:59:10 | result-write:0 return statement | -| main.go:59:10:59:10 | Before 1 | main.go:59:10:59:10 | 1 | +| main.go:59:10:59:10 | 1 | main.go:59:3:59:10 | result-write:0 return statement | | main.go:60:9:62:2 | After block statement | main.go:58:2:62:2 | After if statement | | main.go:60:9:62:2 | block statement | main.go:61:3:61:12 | ... = ... | -| main.go:61:3:61:12 | ... = ... | main.go:61:12:61:12 | Before 2 | +| main.go:61:3:61:12 | ... = ... | main.go:61:12:61:12 | 2 | | main.go:61:3:61:12 | After ... = ... | main.go:60:9:62:2 | After block statement | | main.go:61:3:61:12 | assign:0 ... = ... | main.go:61:3:61:12 | After ... = ... | -| main.go:61:12:61:12 | 2 | main.go:61:12:61:12 | After 2 | -| main.go:61:12:61:12 | After 2 | main.go:61:3:61:12 | assign:0 ... = ... | -| main.go:61:12:61:12 | Before 2 | main.go:61:12:61:12 | 2 | +| main.go:61:12:61:12 | 2 | main.go:61:3:61:12 | assign:0 ... = ... | | main.go:63:2:63:7 | Before return statement | main.go:63:2:63:7 | return statement | | main.go:63:2:63:7 | return statement | main.go:56:38:64:1 | result-read:0 block statement | | main.go:66:1:90:1 | After function declaration | main.go:92:1:96:1 | Before function declaration | @@ -2185,24 +1748,20 @@ | main.go:68:2:70:2 | After for statement | main.go:71:2:71:13 | expression statement | | main.go:68:2:70:2 | [LoopHeader] for statement | main.go:68:6:68:11 | Before call to cond | | main.go:68:2:70:2 | for statement | main.go:68:6:68:11 | Before call to cond | -| main.go:68:6:68:9 | After cond | main.go:68:6:68:11 | call to cond | -| main.go:68:6:68:9 | Before cond | main.go:68:6:68:9 | cond | -| main.go:68:6:68:9 | cond | main.go:68:6:68:9 | After cond | +| main.go:68:6:68:9 | cond | main.go:68:6:68:11 | call to cond | | main.go:68:6:68:11 | After call to cond [false] | main.go:68:2:70:2 | After for statement | | main.go:68:6:68:11 | After call to cond [true] | main.go:68:13:70:2 | block statement | -| main.go:68:6:68:11 | Before call to cond | main.go:68:6:68:9 | Before cond | +| main.go:68:6:68:11 | Before call to cond | main.go:68:6:68:9 | cond | | main.go:68:6:68:11 | call to cond | main.go:66:1:90:1 | Exceptional Exit | | main.go:68:6:68:11 | call to cond | main.go:68:6:68:11 | After call to cond [false] | | main.go:68:6:68:11 | call to cond | main.go:68:6:68:11 | After call to cond [true] | | main.go:68:13:70:2 | After block statement | main.go:68:2:70:2 | [LoopHeader] for statement | | main.go:68:13:70:2 | block statement | main.go:69:3:69:7 | ... = ... | -| main.go:69:3:69:7 | ... = ... | main.go:69:7:69:7 | Before 2 | +| main.go:69:3:69:7 | ... = ... | main.go:69:7:69:7 | 2 | | main.go:69:3:69:7 | After ... = ... | main.go:68:13:70:2 | After block statement | | main.go:69:3:69:7 | assign:0 ... = ... | main.go:69:3:69:7 | After ... = ... | -| main.go:69:7:69:7 | 2 | main.go:69:7:69:7 | After 2 | -| main.go:69:7:69:7 | After 2 | main.go:69:3:69:7 | assign:0 ... = ... | -| main.go:69:7:69:7 | Before 2 | main.go:69:7:69:7 | 2 | -| main.go:71:2:71:10 | After selection of Print | main.go:71:12:71:12 | Before x | +| main.go:69:7:69:7 | 2 | main.go:69:3:69:7 | assign:0 ... = ... | +| main.go:71:2:71:10 | After selection of Print | main.go:71:12:71:12 | x | | main.go:71:2:71:10 | Before selection of Print | main.go:71:2:71:10 | selection of Print | | main.go:71:2:71:10 | selection of Print | main.go:71:2:71:10 | After selection of Print | | main.go:71:2:71:13 | After call to Print | main.go:71:2:71:13 | After expression statement | @@ -2211,53 +1770,41 @@ | main.go:71:2:71:13 | call to Print | main.go:66:1:90:1 | Exceptional Exit | | main.go:71:2:71:13 | call to Print | main.go:71:2:71:13 | After call to Print | | main.go:71:2:71:13 | expression statement | main.go:71:2:71:13 | Before call to Print | -| main.go:71:12:71:12 | After x | main.go:71:2:71:13 | call to Print | -| main.go:71:12:71:12 | Before x | main.go:71:12:71:12 | x | -| main.go:71:12:71:12 | x | main.go:71:12:71:12 | After x | -| main.go:73:2:73:7 | ... := ... | main.go:73:7:73:7 | Before 1 | +| main.go:71:12:71:12 | x | main.go:71:2:71:13 | call to Print | +| main.go:73:2:73:7 | ... := ... | main.go:73:7:73:7 | 1 | | main.go:73:2:73:7 | After ... := ... | main.go:74:2:79:2 | for statement | | main.go:73:2:73:7 | assign:0 ... := ... | main.go:73:2:73:7 | After ... := ... | -| main.go:73:7:73:7 | 1 | main.go:73:7:73:7 | After 1 | -| main.go:73:7:73:7 | After 1 | main.go:73:2:73:7 | assign:0 ... := ... | -| main.go:73:7:73:7 | Before 1 | main.go:73:7:73:7 | 1 | +| main.go:73:7:73:7 | 1 | main.go:73:2:73:7 | assign:0 ... := ... | | main.go:74:2:79:2 | After for statement | main.go:80:2:80:13 | expression statement | | main.go:74:2:79:2 | [LoopHeader] for statement | main.go:74:16:74:18 | Before increment statement | | main.go:74:2:79:2 | for statement | main.go:74:6:74:11 | ... := ... | -| main.go:74:6:74:11 | ... := ... | main.go:74:11:74:11 | Before 0 | +| main.go:74:6:74:11 | ... := ... | main.go:74:11:74:11 | 0 | | main.go:74:6:74:11 | After ... := ... | main.go:74:20:79:2 | block statement | | main.go:74:6:74:11 | assign:0 ... := ... | main.go:74:6:74:11 | After ... := ... | -| main.go:74:11:74:11 | 0 | main.go:74:11:74:11 | After 0 | -| main.go:74:11:74:11 | After 0 | main.go:74:6:74:11 | assign:0 ... := ... | -| main.go:74:11:74:11 | Before 0 | main.go:74:11:74:11 | 0 | -| main.go:74:16:74:16 | After i | main.go:74:16:74:18 | increment statement | -| main.go:74:16:74:16 | Before i | main.go:74:16:74:16 | i | -| main.go:74:16:74:16 | i | main.go:74:16:74:16 | After i | +| main.go:74:11:74:11 | 0 | main.go:74:6:74:11 | assign:0 ... := ... | +| main.go:74:16:74:16 | i | main.go:74:16:74:18 | increment statement | | main.go:74:16:74:18 | After increment statement | main.go:74:20:79:2 | block statement | -| main.go:74:16:74:18 | Before increment statement | main.go:74:16:74:16 | Before i | +| main.go:74:16:74:18 | Before increment statement | main.go:74:16:74:16 | i | | main.go:74:16:74:18 | increment statement | main.go:74:16:74:18 | After increment statement | | main.go:74:20:79:2 | After block statement | main.go:74:2:79:2 | [LoopHeader] for statement | | main.go:74:20:79:2 | block statement | main.go:75:3:77:3 | if statement | | main.go:75:3:77:3 | After if statement | main.go:78:3:78:7 | ... = ... | | main.go:75:3:77:3 | if statement | main.go:75:6:75:11 | Before call to cond | -| main.go:75:6:75:9 | After cond | main.go:75:6:75:11 | call to cond | -| main.go:75:6:75:9 | Before cond | main.go:75:6:75:9 | cond | -| main.go:75:6:75:9 | cond | main.go:75:6:75:9 | After cond | +| main.go:75:6:75:9 | cond | main.go:75:6:75:11 | call to cond | | main.go:75:6:75:11 | After call to cond [false] | main.go:75:3:77:3 | After if statement | | main.go:75:6:75:11 | After call to cond [true] | main.go:75:13:77:3 | block statement | -| main.go:75:6:75:11 | Before call to cond | main.go:75:6:75:9 | Before cond | +| main.go:75:6:75:11 | Before call to cond | main.go:75:6:75:9 | cond | | main.go:75:6:75:11 | call to cond | main.go:66:1:90:1 | Exceptional Exit | | main.go:75:6:75:11 | call to cond | main.go:75:6:75:11 | After call to cond [false] | | main.go:75:6:75:11 | call to cond | main.go:75:6:75:11 | After call to cond [true] | | main.go:75:13:77:3 | block statement | main.go:76:4:76:8 | Before break statement | | main.go:76:4:76:8 | Before break statement | main.go:76:4:76:8 | break statement | | main.go:76:4:76:8 | break statement | main.go:74:2:79:2 | After for statement | -| main.go:78:3:78:7 | ... = ... | main.go:78:7:78:7 | Before 2 | +| main.go:78:3:78:7 | ... = ... | main.go:78:7:78:7 | 2 | | main.go:78:3:78:7 | After ... = ... | main.go:74:20:79:2 | After block statement | | main.go:78:3:78:7 | assign:0 ... = ... | main.go:78:3:78:7 | After ... = ... | -| main.go:78:7:78:7 | 2 | main.go:78:7:78:7 | After 2 | -| main.go:78:7:78:7 | After 2 | main.go:78:3:78:7 | assign:0 ... = ... | -| main.go:78:7:78:7 | Before 2 | main.go:78:7:78:7 | 2 | -| main.go:80:2:80:10 | After selection of Print | main.go:80:12:80:12 | Before y | +| main.go:78:7:78:7 | 2 | main.go:78:3:78:7 | assign:0 ... = ... | +| main.go:80:2:80:10 | After selection of Print | main.go:80:12:80:12 | y | | main.go:80:2:80:10 | Before selection of Print | main.go:80:2:80:10 | selection of Print | | main.go:80:2:80:10 | selection of Print | main.go:80:2:80:10 | After selection of Print | | main.go:80:2:80:13 | After call to Print | main.go:80:2:80:13 | After expression statement | @@ -2266,53 +1813,41 @@ | main.go:80:2:80:13 | call to Print | main.go:66:1:90:1 | Exceptional Exit | | main.go:80:2:80:13 | call to Print | main.go:80:2:80:13 | After call to Print | | main.go:80:2:80:13 | expression statement | main.go:80:2:80:13 | Before call to Print | -| main.go:80:12:80:12 | After y | main.go:80:2:80:13 | call to Print | -| main.go:80:12:80:12 | Before y | main.go:80:12:80:12 | y | -| main.go:80:12:80:12 | y | main.go:80:12:80:12 | After y | -| main.go:82:2:82:7 | ... := ... | main.go:82:7:82:7 | Before 1 | +| main.go:80:12:80:12 | y | main.go:80:2:80:13 | call to Print | +| main.go:82:2:82:7 | ... := ... | main.go:82:7:82:7 | 1 | | main.go:82:2:82:7 | After ... := ... | main.go:83:2:88:2 | for statement | | main.go:82:2:82:7 | assign:0 ... := ... | main.go:82:2:82:7 | After ... := ... | -| main.go:82:7:82:7 | 1 | main.go:82:7:82:7 | After 1 | -| main.go:82:7:82:7 | After 1 | main.go:82:2:82:7 | assign:0 ... := ... | -| main.go:82:7:82:7 | Before 1 | main.go:82:7:82:7 | 1 | +| main.go:82:7:82:7 | 1 | main.go:82:2:82:7 | assign:0 ... := ... | | main.go:83:2:88:2 | After for statement | main.go:89:2:89:13 | expression statement | | main.go:83:2:88:2 | [LoopHeader] for statement | main.go:83:16:83:18 | Before increment statement | | main.go:83:2:88:2 | for statement | main.go:83:6:83:11 | ... := ... | -| main.go:83:6:83:11 | ... := ... | main.go:83:11:83:11 | Before 0 | +| main.go:83:6:83:11 | ... := ... | main.go:83:11:83:11 | 0 | | main.go:83:6:83:11 | After ... := ... | main.go:83:20:88:2 | block statement | | main.go:83:6:83:11 | assign:0 ... := ... | main.go:83:6:83:11 | After ... := ... | -| main.go:83:11:83:11 | 0 | main.go:83:11:83:11 | After 0 | -| main.go:83:11:83:11 | After 0 | main.go:83:6:83:11 | assign:0 ... := ... | -| main.go:83:11:83:11 | Before 0 | main.go:83:11:83:11 | 0 | -| main.go:83:16:83:16 | After i | main.go:83:16:83:18 | increment statement | -| main.go:83:16:83:16 | Before i | main.go:83:16:83:16 | i | -| main.go:83:16:83:16 | i | main.go:83:16:83:16 | After i | +| main.go:83:11:83:11 | 0 | main.go:83:6:83:11 | assign:0 ... := ... | +| main.go:83:16:83:16 | i | main.go:83:16:83:18 | increment statement | | main.go:83:16:83:18 | After increment statement | main.go:83:20:88:2 | block statement | -| main.go:83:16:83:18 | Before increment statement | main.go:83:16:83:16 | Before i | +| main.go:83:16:83:18 | Before increment statement | main.go:83:16:83:16 | i | | main.go:83:16:83:18 | increment statement | main.go:83:16:83:18 | After increment statement | | main.go:83:20:88:2 | After block statement | main.go:83:2:88:2 | [LoopHeader] for statement | | main.go:83:20:88:2 | block statement | main.go:84:3:84:7 | ... = ... | -| main.go:84:3:84:7 | ... = ... | main.go:84:7:84:7 | Before 2 | +| main.go:84:3:84:7 | ... = ... | main.go:84:7:84:7 | 2 | | main.go:84:3:84:7 | After ... = ... | main.go:85:3:87:3 | if statement | | main.go:84:3:84:7 | assign:0 ... = ... | main.go:84:3:84:7 | After ... = ... | -| main.go:84:7:84:7 | 2 | main.go:84:7:84:7 | After 2 | -| main.go:84:7:84:7 | After 2 | main.go:84:3:84:7 | assign:0 ... = ... | -| main.go:84:7:84:7 | Before 2 | main.go:84:7:84:7 | 2 | +| main.go:84:7:84:7 | 2 | main.go:84:3:84:7 | assign:0 ... = ... | | main.go:85:3:87:3 | After if statement | main.go:83:20:88:2 | After block statement | | main.go:85:3:87:3 | if statement | main.go:85:6:85:11 | Before call to cond | -| main.go:85:6:85:9 | After cond | main.go:85:6:85:11 | call to cond | -| main.go:85:6:85:9 | Before cond | main.go:85:6:85:9 | cond | -| main.go:85:6:85:9 | cond | main.go:85:6:85:9 | After cond | +| main.go:85:6:85:9 | cond | main.go:85:6:85:11 | call to cond | | main.go:85:6:85:11 | After call to cond [false] | main.go:85:3:87:3 | After if statement | | main.go:85:6:85:11 | After call to cond [true] | main.go:85:13:87:3 | block statement | -| main.go:85:6:85:11 | Before call to cond | main.go:85:6:85:9 | Before cond | +| main.go:85:6:85:11 | Before call to cond | main.go:85:6:85:9 | cond | | main.go:85:6:85:11 | call to cond | main.go:66:1:90:1 | Exceptional Exit | | main.go:85:6:85:11 | call to cond | main.go:85:6:85:11 | After call to cond [false] | | main.go:85:6:85:11 | call to cond | main.go:85:6:85:11 | After call to cond [true] | | main.go:85:13:87:3 | block statement | main.go:86:4:86:8 | Before break statement | | main.go:86:4:86:8 | Before break statement | main.go:86:4:86:8 | break statement | | main.go:86:4:86:8 | break statement | main.go:83:2:88:2 | After for statement | -| main.go:89:2:89:10 | After selection of Print | main.go:89:12:89:12 | Before z | +| main.go:89:2:89:10 | After selection of Print | main.go:89:12:89:12 | z | | main.go:89:2:89:10 | Before selection of Print | main.go:89:2:89:10 | selection of Print | | main.go:89:2:89:10 | selection of Print | main.go:89:2:89:10 | After selection of Print | | main.go:89:2:89:13 | After call to Print | main.go:89:2:89:13 | After expression statement | @@ -2321,9 +1856,7 @@ | main.go:89:2:89:13 | call to Print | main.go:66:1:90:1 | Exceptional Exit | | main.go:89:2:89:13 | call to Print | main.go:89:2:89:13 | After call to Print | | main.go:89:2:89:13 | expression statement | main.go:89:2:89:13 | Before call to Print | -| main.go:89:12:89:12 | After z | main.go:89:2:89:13 | call to Print | -| main.go:89:12:89:12 | Before z | main.go:89:12:89:12 | z | -| main.go:89:12:89:12 | z | main.go:89:12:89:12 | After z | +| main.go:89:12:89:12 | z | main.go:89:2:89:13 | call to Print | | main.go:92:1:96:1 | After function declaration | main.go:98:1:106:1 | Before function declaration | | main.go:92:1:96:1 | Before function declaration | main.go:92:1:96:1 | function declaration | | main.go:92:1:96:1 | Entry | main.go:92:36:96:1 | block statement | @@ -2335,28 +1868,20 @@ | main.go:92:36:96:1 | result-read:1 block statement | main.go:92:36:96:1 | After block statement | | main.go:92:36:96:1 | zero-init:0 block statement | main.go:92:36:96:1 | zero-init:1 block statement | | main.go:92:36:96:1 | zero-init:1 block statement | main.go:93:2:93:8 | ... := ... | -| main.go:93:2:93:8 | ... := ... | main.go:93:7:93:8 | Before 23 | +| main.go:93:2:93:8 | ... := ... | main.go:93:7:93:8 | 23 | | main.go:93:2:93:8 | After ... := ... | main.go:94:2:94:15 | ... = ... | | main.go:93:2:93:8 | assign:0 ... := ... | main.go:93:2:93:8 | After ... := ... | -| main.go:93:7:93:8 | 23 | main.go:93:7:93:8 | After 23 | -| main.go:93:7:93:8 | After 23 | main.go:93:2:93:8 | assign:0 ... := ... | -| main.go:93:7:93:8 | Before 23 | main.go:93:7:93:8 | 23 | +| main.go:93:7:93:8 | 23 | main.go:93:2:93:8 | assign:0 ... := ... | | main.go:94:2:94:15 | ... = ... | main.go:94:9:94:12 | Before ...+... | | main.go:94:2:94:15 | After ... = ... | main.go:95:2:95:7 | Before return statement | | main.go:94:2:94:15 | assign:0 ... = ... | main.go:94:2:94:15 | assign:1 ... = ... | | main.go:94:2:94:15 | assign:1 ... = ... | main.go:94:2:94:15 | After ... = ... | -| main.go:94:9:94:9 | After x | main.go:94:11:94:12 | Before 19 | -| main.go:94:9:94:9 | Before x | main.go:94:9:94:9 | x | -| main.go:94:9:94:9 | x | main.go:94:9:94:9 | After x | +| main.go:94:9:94:9 | x | main.go:94:11:94:12 | 19 | | main.go:94:9:94:12 | ...+... | main.go:94:9:94:12 | After ...+... | -| main.go:94:9:94:12 | After ...+... | main.go:94:15:94:15 | Before x | -| main.go:94:9:94:12 | Before ...+... | main.go:94:9:94:9 | Before x | -| main.go:94:11:94:12 | 19 | main.go:94:11:94:12 | After 19 | -| main.go:94:11:94:12 | After 19 | main.go:94:9:94:12 | ...+... | -| main.go:94:11:94:12 | Before 19 | main.go:94:11:94:12 | 19 | -| main.go:94:15:94:15 | After x | main.go:94:2:94:15 | assign:0 ... = ... | -| main.go:94:15:94:15 | Before x | main.go:94:15:94:15 | x | -| main.go:94:15:94:15 | x | main.go:94:15:94:15 | After x | +| main.go:94:9:94:12 | After ...+... | main.go:94:15:94:15 | x | +| main.go:94:9:94:12 | Before ...+... | main.go:94:9:94:9 | x | +| main.go:94:11:94:12 | 19 | main.go:94:9:94:12 | ...+... | +| main.go:94:15:94:15 | x | main.go:94:2:94:15 | assign:0 ... = ... | | main.go:95:2:95:7 | Before return statement | main.go:95:2:95:7 | return statement | | main.go:95:2:95:7 | return statement | main.go:92:36:96:1 | result-read:0 block statement | | main.go:98:1:106:1 | After function declaration | main.go:0:0:0:0 | After main.go | @@ -2367,57 +1892,39 @@ | main.go:98:1:106:1 | function declaration | main.go:98:1:106:1 | After function declaration | | main.go:98:25:98:25 | x | main.go:98:43:106:1 | block statement | | main.go:98:43:106:1 | block statement | main.go:99:2:99:13 | ... := ... | -| main.go:99:2:99:13 | ... := ... | main.go:99:10:99:10 | Before x | +| main.go:99:2:99:13 | ... := ... | main.go:99:10:99:10 | x | | main.go:99:2:99:13 | After ... := ... | main.go:100:2:104:2 | if statement | | main.go:99:2:99:13 | assign:0 ... := ... | main.go:99:2:99:13 | assign:1 ... := ... | | main.go:99:2:99:13 | assign:1 ... := ... | main.go:99:2:99:13 | After ... := ... | -| main.go:99:10:99:10 | After x | main.go:99:13:99:13 | Before 0 | -| main.go:99:10:99:10 | Before x | main.go:99:10:99:10 | x | -| main.go:99:10:99:10 | x | main.go:99:10:99:10 | After x | -| main.go:99:13:99:13 | 0 | main.go:99:13:99:13 | After 0 | -| main.go:99:13:99:13 | After 0 | main.go:99:2:99:13 | assign:0 ... := ... | -| main.go:99:13:99:13 | Before 0 | main.go:99:13:99:13 | 0 | +| main.go:99:10:99:10 | x | main.go:99:13:99:13 | 0 | +| main.go:99:13:99:13 | 0 | main.go:99:2:99:13 | assign:0 ... := ... | | main.go:100:2:104:2 | After if statement | main.go:105:2:105:12 | Before return statement | | main.go:100:2:104:2 | if statement | main.go:100:5:100:10 | Before call to cond | -| main.go:100:5:100:8 | After cond | main.go:100:5:100:10 | call to cond | -| main.go:100:5:100:8 | Before cond | main.go:100:5:100:8 | cond | -| main.go:100:5:100:8 | cond | main.go:100:5:100:8 | After cond | +| main.go:100:5:100:8 | cond | main.go:100:5:100:10 | call to cond | | main.go:100:5:100:10 | After call to cond [false] | main.go:102:9:104:2 | block statement | | main.go:100:5:100:10 | After call to cond [true] | main.go:100:12:102:2 | block statement | -| main.go:100:5:100:10 | Before call to cond | main.go:100:5:100:8 | Before cond | +| main.go:100:5:100:10 | Before call to cond | main.go:100:5:100:8 | cond | | main.go:100:5:100:10 | call to cond | main.go:98:1:106:1 | Exceptional Exit | | main.go:100:5:100:10 | call to cond | main.go:100:5:100:10 | After call to cond [false] | | main.go:100:5:100:10 | call to cond | main.go:100:5:100:10 | After call to cond [true] | | main.go:100:12:102:2 | After block statement | main.go:100:2:104:2 | After if statement | | main.go:100:12:102:2 | block statement | main.go:101:3:101:13 | ... = ... | -| main.go:101:3:101:13 | ... = ... | main.go:101:10:101:10 | Before b | +| main.go:101:3:101:13 | ... = ... | main.go:101:10:101:10 | b | | main.go:101:3:101:13 | After ... = ... | main.go:100:12:102:2 | After block statement | | main.go:101:3:101:13 | assign:0 ... = ... | main.go:101:3:101:13 | After ... = ... | -| main.go:101:10:101:10 | After b | main.go:101:13:101:13 | Before a | -| main.go:101:10:101:10 | Before b | main.go:101:10:101:10 | b | -| main.go:101:10:101:10 | b | main.go:101:10:101:10 | After b | -| main.go:101:13:101:13 | After a | main.go:101:3:101:13 | assign:0 ... = ... | -| main.go:101:13:101:13 | Before a | main.go:101:13:101:13 | a | -| main.go:101:13:101:13 | a | main.go:101:13:101:13 | After a | +| main.go:101:10:101:10 | b | main.go:101:13:101:13 | a | +| main.go:101:13:101:13 | a | main.go:101:3:101:13 | assign:0 ... = ... | | main.go:102:9:104:2 | After block statement | main.go:100:2:104:2 | After if statement | | main.go:102:9:104:2 | block statement | main.go:103:3:103:13 | ... = ... | -| main.go:103:3:103:13 | ... = ... | main.go:103:10:103:10 | Before b | +| main.go:103:3:103:13 | ... = ... | main.go:103:10:103:10 | b | | main.go:103:3:103:13 | After ... = ... | main.go:102:9:104:2 | After block statement | | main.go:103:3:103:13 | assign:1 ... = ... | main.go:103:3:103:13 | After ... = ... | -| main.go:103:10:103:10 | After b | main.go:103:13:103:13 | Before a | -| main.go:103:10:103:10 | Before b | main.go:103:10:103:10 | b | -| main.go:103:10:103:10 | b | main.go:103:10:103:10 | After b | -| main.go:103:13:103:13 | After a | main.go:103:3:103:13 | assign:1 ... = ... | -| main.go:103:13:103:13 | Before a | main.go:103:13:103:13 | a | -| main.go:103:13:103:13 | a | main.go:103:13:103:13 | After a | -| main.go:105:2:105:12 | Before return statement | main.go:105:9:105:9 | Before a | +| main.go:103:10:103:10 | b | main.go:103:13:103:13 | a | +| main.go:103:13:103:13 | a | main.go:103:3:103:13 | assign:1 ... = ... | +| main.go:105:2:105:12 | Before return statement | main.go:105:9:105:9 | a | | main.go:105:2:105:12 | return statement | main.go:98:1:106:1 | Normal Exit | -| main.go:105:9:105:9 | After a | main.go:105:12:105:12 | Before b | -| main.go:105:9:105:9 | Before a | main.go:105:9:105:9 | a | -| main.go:105:9:105:9 | a | main.go:105:9:105:9 | After a | -| main.go:105:12:105:12 | After b | main.go:105:2:105:12 | return statement | -| main.go:105:12:105:12 | Before b | main.go:105:12:105:12 | b | -| main.go:105:12:105:12 | b | main.go:105:12:105:12 | After b | +| main.go:105:9:105:9 | a | main.go:105:12:105:12 | b | +| main.go:105:12:105:12 | b | main.go:105:2:105:12 | return statement | | noretfunctions.go:0:0:0:0 | After noretfunctions.go | noretfunctions.go:0:0:0:0 | Normal Exit | | noretfunctions.go:0:0:0:0 | Entry | noretfunctions.go:0:0:0:0 | noretfunctions.go | | noretfunctions.go:0:0:0:0 | Normal Exit | noretfunctions.go:0:0:0:0 | Exit | @@ -2432,15 +1939,13 @@ | noretfunctions.go:8:1:10:1 | Exceptional Exit | noretfunctions.go:8:1:10:1 | Exit | | noretfunctions.go:8:1:10:1 | function declaration | noretfunctions.go:8:1:10:1 | After function declaration | | noretfunctions.go:8:16:10:1 | block statement | noretfunctions.go:9:2:9:11 | expression statement | -| noretfunctions.go:9:2:9:8 | After selection of Exit | noretfunctions.go:9:10:9:10 | Before 1 | +| noretfunctions.go:9:2:9:8 | After selection of Exit | noretfunctions.go:9:10:9:10 | 1 | | noretfunctions.go:9:2:9:8 | Before selection of Exit | noretfunctions.go:9:2:9:8 | selection of Exit | | noretfunctions.go:9:2:9:8 | selection of Exit | noretfunctions.go:9:2:9:8 | After selection of Exit | | noretfunctions.go:9:2:9:11 | Before call to Exit | noretfunctions.go:9:2:9:8 | Before selection of Exit | | noretfunctions.go:9:2:9:11 | call to Exit | noretfunctions.go:8:1:10:1 | Exceptional Exit | | noretfunctions.go:9:2:9:11 | expression statement | noretfunctions.go:9:2:9:11 | Before call to Exit | -| noretfunctions.go:9:10:9:10 | 1 | noretfunctions.go:9:10:9:10 | After 1 | -| noretfunctions.go:9:10:9:10 | After 1 | noretfunctions.go:9:2:9:11 | call to Exit | -| noretfunctions.go:9:10:9:10 | Before 1 | noretfunctions.go:9:10:9:10 | 1 | +| noretfunctions.go:9:10:9:10 | 1 | noretfunctions.go:9:2:9:11 | call to Exit | | noretfunctions.go:12:1:16:1 | After function declaration | noretfunctions.go:18:1:18:17 | Before function declaration | | noretfunctions.go:12:1:16:1 | Before function declaration | noretfunctions.go:12:1:16:1 | function declaration | | noretfunctions.go:12:1:16:1 | Entry | noretfunctions.go:12:13:12:13 | x | @@ -2452,27 +1957,21 @@ | noretfunctions.go:12:20:16:1 | block statement | noretfunctions.go:13:2:15:2 | if statement | | noretfunctions.go:13:2:15:2 | After if statement | noretfunctions.go:12:20:16:1 | After block statement | | noretfunctions.go:13:2:15:2 | if statement | noretfunctions.go:13:5:13:10 | Before ...!=... | -| noretfunctions.go:13:5:13:5 | After x | noretfunctions.go:13:10:13:10 | Before 0 | -| noretfunctions.go:13:5:13:5 | Before x | noretfunctions.go:13:5:13:5 | x | -| noretfunctions.go:13:5:13:5 | x | noretfunctions.go:13:5:13:5 | After x | +| noretfunctions.go:13:5:13:5 | x | noretfunctions.go:13:10:13:10 | 0 | | noretfunctions.go:13:5:13:10 | ...!=... | noretfunctions.go:13:5:13:10 | After ...!=... [false] | | noretfunctions.go:13:5:13:10 | ...!=... | noretfunctions.go:13:5:13:10 | After ...!=... [true] | | noretfunctions.go:13:5:13:10 | After ...!=... [false] | noretfunctions.go:13:2:15:2 | After if statement | | noretfunctions.go:13:5:13:10 | After ...!=... [true] | noretfunctions.go:13:12:15:2 | block statement | -| noretfunctions.go:13:5:13:10 | Before ...!=... | noretfunctions.go:13:5:13:5 | Before x | -| noretfunctions.go:13:10:13:10 | 0 | noretfunctions.go:13:10:13:10 | After 0 | -| noretfunctions.go:13:10:13:10 | After 0 | noretfunctions.go:13:5:13:10 | ...!=... | -| noretfunctions.go:13:10:13:10 | Before 0 | noretfunctions.go:13:10:13:10 | 0 | +| noretfunctions.go:13:5:13:10 | Before ...!=... | noretfunctions.go:13:5:13:5 | x | +| noretfunctions.go:13:10:13:10 | 0 | noretfunctions.go:13:5:13:10 | ...!=... | | noretfunctions.go:13:12:15:2 | block statement | noretfunctions.go:14:3:14:12 | expression statement | -| noretfunctions.go:14:3:14:9 | After selection of Exit | noretfunctions.go:14:11:14:11 | Before x | +| noretfunctions.go:14:3:14:9 | After selection of Exit | noretfunctions.go:14:11:14:11 | x | | noretfunctions.go:14:3:14:9 | Before selection of Exit | noretfunctions.go:14:3:14:9 | selection of Exit | | noretfunctions.go:14:3:14:9 | selection of Exit | noretfunctions.go:14:3:14:9 | After selection of Exit | | noretfunctions.go:14:3:14:12 | Before call to Exit | noretfunctions.go:14:3:14:9 | Before selection of Exit | | noretfunctions.go:14:3:14:12 | call to Exit | noretfunctions.go:12:1:16:1 | Exceptional Exit | | noretfunctions.go:14:3:14:12 | expression statement | noretfunctions.go:14:3:14:12 | Before call to Exit | -| noretfunctions.go:14:11:14:11 | After x | noretfunctions.go:14:3:14:12 | call to Exit | -| noretfunctions.go:14:11:14:11 | Before x | noretfunctions.go:14:11:14:11 | x | -| noretfunctions.go:14:11:14:11 | x | noretfunctions.go:14:11:14:11 | After x | +| noretfunctions.go:14:11:14:11 | x | noretfunctions.go:14:3:14:12 | call to Exit | | noretfunctions.go:18:1:18:17 | After function declaration | noretfunctions.go:20:1:22:1 | Before function declaration | | noretfunctions.go:18:1:18:17 | Before function declaration | noretfunctions.go:18:1:18:17 | function declaration | | noretfunctions.go:18:1:18:17 | Entry | noretfunctions.go:18:16:18:17 | block statement | @@ -2485,30 +1984,26 @@ | noretfunctions.go:20:1:22:1 | Exceptional Exit | noretfunctions.go:20:1:22:1 | Exit | | noretfunctions.go:20:1:22:1 | function declaration | noretfunctions.go:20:1:22:1 | After function declaration | | noretfunctions.go:20:26:22:1 | block statement | noretfunctions.go:21:2:21:19 | expression statement | -| noretfunctions.go:21:2:21:10 | After selection of Fatal | noretfunctions.go:21:12:21:18 | Before "Oh no" | +| noretfunctions.go:21:2:21:10 | After selection of Fatal | noretfunctions.go:21:12:21:18 | "Oh no" | | noretfunctions.go:21:2:21:10 | Before selection of Fatal | noretfunctions.go:21:2:21:10 | selection of Fatal | | noretfunctions.go:21:2:21:10 | selection of Fatal | noretfunctions.go:21:2:21:10 | After selection of Fatal | | noretfunctions.go:21:2:21:19 | Before call to Fatal | noretfunctions.go:21:2:21:10 | Before selection of Fatal | | noretfunctions.go:21:2:21:19 | call to Fatal | noretfunctions.go:20:1:22:1 | Exceptional Exit | | noretfunctions.go:21:2:21:19 | expression statement | noretfunctions.go:21:2:21:19 | Before call to Fatal | -| noretfunctions.go:21:12:21:18 | "Oh no" | noretfunctions.go:21:12:21:18 | After "Oh no" | -| noretfunctions.go:21:12:21:18 | After "Oh no" | noretfunctions.go:21:2:21:19 | call to Fatal | -| noretfunctions.go:21:12:21:18 | Before "Oh no" | noretfunctions.go:21:12:21:18 | "Oh no" | +| noretfunctions.go:21:12:21:18 | "Oh no" | noretfunctions.go:21:2:21:19 | call to Fatal | | noretfunctions.go:24:1:26:1 | After function declaration | noretfunctions.go:0:0:0:0 | After noretfunctions.go | | noretfunctions.go:24:1:26:1 | Before function declaration | noretfunctions.go:24:1:26:1 | function declaration | | noretfunctions.go:24:1:26:1 | Entry | noretfunctions.go:24:27:26:1 | block statement | | noretfunctions.go:24:1:26:1 | Exceptional Exit | noretfunctions.go:24:1:26:1 | Exit | | noretfunctions.go:24:1:26:1 | function declaration | noretfunctions.go:24:1:26:1 | After function declaration | | noretfunctions.go:24:27:26:1 | block statement | noretfunctions.go:25:2:25:31 | expression statement | -| noretfunctions.go:25:2:25:11 | After selection of Fatalf | noretfunctions.go:25:13:25:30 | Before "It's as I feared" | +| noretfunctions.go:25:2:25:11 | After selection of Fatalf | noretfunctions.go:25:13:25:30 | "It's as I feared" | | noretfunctions.go:25:2:25:11 | Before selection of Fatalf | noretfunctions.go:25:2:25:11 | selection of Fatalf | | noretfunctions.go:25:2:25:11 | selection of Fatalf | noretfunctions.go:25:2:25:11 | After selection of Fatalf | | noretfunctions.go:25:2:25:31 | Before call to Fatalf | noretfunctions.go:25:2:25:11 | Before selection of Fatalf | | noretfunctions.go:25:2:25:31 | call to Fatalf | noretfunctions.go:24:1:26:1 | Exceptional Exit | | noretfunctions.go:25:2:25:31 | expression statement | noretfunctions.go:25:2:25:31 | Before call to Fatalf | -| noretfunctions.go:25:13:25:30 | "It's as I feared" | noretfunctions.go:25:13:25:30 | After "It's as I feared" | -| noretfunctions.go:25:13:25:30 | After "It's as I feared" | noretfunctions.go:25:2:25:31 | call to Fatalf | -| noretfunctions.go:25:13:25:30 | Before "It's as I feared" | noretfunctions.go:25:13:25:30 | "It's as I feared" | +| noretfunctions.go:25:13:25:30 | "It's as I feared" | noretfunctions.go:25:2:25:31 | call to Fatalf | | stmts2.go:0:0:0:0 | After stmts2.go | stmts2.go:0:0:0:0 | Normal Exit | | stmts2.go:0:0:0:0 | Entry | stmts2.go:0:0:0:0 | stmts2.go | | stmts2.go:0:0:0:0 | Normal Exit | stmts2.go:0:0:0:0 | Exit | @@ -2522,37 +2017,27 @@ | stmts2.go:3:19:7:1 | block statement | stmts2.go:4:2:4:13 | ... = ... | | stmts2.go:4:2:4:13 | ... = ... | stmts2.go:4:6:4:13 | Before call to test7 | | stmts2.go:4:2:4:13 | After ... = ... | stmts2.go:5:2:5:17 | declaration statement | -| stmts2.go:4:6:4:10 | After test7 | stmts2.go:4:12:4:12 | Before 0 | -| stmts2.go:4:6:4:10 | Before test7 | stmts2.go:4:6:4:10 | test7 | -| stmts2.go:4:6:4:10 | test7 | stmts2.go:4:6:4:10 | After test7 | +| stmts2.go:4:6:4:10 | test7 | stmts2.go:4:12:4:12 | 0 | | stmts2.go:4:6:4:13 | After call to test7 | stmts2.go:4:2:4:13 | After ... = ... | -| stmts2.go:4:6:4:13 | Before call to test7 | stmts2.go:4:6:4:10 | Before test7 | +| stmts2.go:4:6:4:13 | Before call to test7 | stmts2.go:4:6:4:10 | test7 | | stmts2.go:4:6:4:13 | call to test7 | stmts2.go:3:1:7:1 | Exceptional Exit | | stmts2.go:4:6:4:13 | call to test7 | stmts2.go:4:6:4:13 | After call to test7 | -| stmts2.go:4:12:4:12 | 0 | stmts2.go:4:12:4:12 | After 0 | -| stmts2.go:4:12:4:12 | After 0 | stmts2.go:4:6:4:13 | call to test7 | -| stmts2.go:4:12:4:12 | Before 0 | stmts2.go:4:12:4:12 | 0 | +| stmts2.go:4:12:4:12 | 0 | stmts2.go:4:6:4:13 | call to test7 | | stmts2.go:5:2:5:17 | After declaration statement | stmts2.go:6:2:6:9 | Before return statement | | stmts2.go:5:2:5:17 | After variable declaration | stmts2.go:5:2:5:17 | After declaration statement | | stmts2.go:5:2:5:17 | declaration statement | stmts2.go:5:2:5:17 | variable declaration | | stmts2.go:5:2:5:17 | variable declaration | stmts2.go:5:6:5:17 | value declaration specifier | | stmts2.go:5:6:5:17 | After value declaration specifier | stmts2.go:5:2:5:17 | After variable declaration | | stmts2.go:5:6:5:17 | value declaration specifier | stmts2.go:5:10:5:17 | Before call to test7 | -| stmts2.go:5:10:5:14 | After test7 | stmts2.go:5:16:5:16 | Before 1 | -| stmts2.go:5:10:5:14 | Before test7 | stmts2.go:5:10:5:14 | test7 | -| stmts2.go:5:10:5:14 | test7 | stmts2.go:5:10:5:14 | After test7 | +| stmts2.go:5:10:5:14 | test7 | stmts2.go:5:16:5:16 | 1 | | stmts2.go:5:10:5:17 | After call to test7 | stmts2.go:5:6:5:17 | After value declaration specifier | -| stmts2.go:5:10:5:17 | Before call to test7 | stmts2.go:5:10:5:14 | Before test7 | +| stmts2.go:5:10:5:17 | Before call to test7 | stmts2.go:5:10:5:14 | test7 | | stmts2.go:5:10:5:17 | call to test7 | stmts2.go:3:1:7:1 | Exceptional Exit | | stmts2.go:5:10:5:17 | call to test7 | stmts2.go:5:10:5:17 | After call to test7 | -| stmts2.go:5:16:5:16 | 1 | stmts2.go:5:16:5:16 | After 1 | -| stmts2.go:5:16:5:16 | After 1 | stmts2.go:5:10:5:17 | call to test7 | -| stmts2.go:5:16:5:16 | Before 1 | stmts2.go:5:16:5:16 | 1 | -| stmts2.go:6:2:6:9 | Before return statement | stmts2.go:6:9:6:9 | Before 2 | +| stmts2.go:5:16:5:16 | 1 | stmts2.go:5:10:5:17 | call to test7 | +| stmts2.go:6:2:6:9 | Before return statement | stmts2.go:6:9:6:9 | 2 | | stmts2.go:6:2:6:9 | return statement | stmts2.go:3:1:7:1 | Normal Exit | -| stmts2.go:6:9:6:9 | 2 | stmts2.go:6:9:6:9 | After 2 | -| stmts2.go:6:9:6:9 | After 2 | stmts2.go:6:2:6:9 | return statement | -| stmts2.go:6:9:6:9 | Before 2 | stmts2.go:6:9:6:9 | 2 | +| stmts2.go:6:9:6:9 | 2 | stmts2.go:6:2:6:9 | return statement | | stmts2.go:9:1:13:1 | After function declaration | stmts2.go:15:1:28:1 | Before function declaration | | stmts2.go:9:1:13:1 | Before function declaration | stmts2.go:9:1:13:1 | function declaration | | stmts2.go:9:1:13:1 | Entry | stmts2.go:9:19:13:1 | block statement | @@ -2564,11 +2049,9 @@ | stmts2.go:10:2:10:14 | After ... := ... | stmts2.go:11:2:11:17 | declaration statement | | stmts2.go:10:2:10:14 | extract:0 ... := ... | stmts2.go:10:2:10:14 | extract:1 ... := ... | | stmts2.go:10:2:10:14 | extract:1 ... := ... | stmts2.go:10:2:10:14 | After ... := ... | -| stmts2.go:10:10:10:12 | After gen | stmts2.go:10:10:10:14 | call to gen | -| stmts2.go:10:10:10:12 | Before gen | stmts2.go:10:10:10:12 | gen | -| stmts2.go:10:10:10:12 | gen | stmts2.go:10:10:10:12 | After gen | +| stmts2.go:10:10:10:12 | gen | stmts2.go:10:10:10:14 | call to gen | | stmts2.go:10:10:10:14 | After call to gen | stmts2.go:10:2:10:14 | extract:0 ... := ... | -| stmts2.go:10:10:10:14 | Before call to gen | stmts2.go:10:10:10:12 | Before gen | +| stmts2.go:10:10:10:14 | Before call to gen | stmts2.go:10:10:10:12 | gen | | stmts2.go:10:10:10:14 | call to gen | stmts2.go:9:1:13:1 | Exceptional Exit | | stmts2.go:10:10:10:14 | call to gen | stmts2.go:10:10:10:14 | After call to gen | | stmts2.go:11:2:11:17 | After declaration statement | stmts2.go:12:2:12:13 | Before return statement | @@ -2579,24 +2062,18 @@ | stmts2.go:11:6:11:17 | extract:0 value declaration specifier | stmts2.go:11:6:11:17 | extract:1 value declaration specifier | | stmts2.go:11:6:11:17 | extract:1 value declaration specifier | stmts2.go:11:6:11:17 | After value declaration specifier | | stmts2.go:11:6:11:17 | value declaration specifier | stmts2.go:11:13:11:17 | Before call to gen | -| stmts2.go:11:13:11:15 | After gen | stmts2.go:11:13:11:17 | call to gen | -| stmts2.go:11:13:11:15 | Before gen | stmts2.go:11:13:11:15 | gen | -| stmts2.go:11:13:11:15 | gen | stmts2.go:11:13:11:15 | After gen | +| stmts2.go:11:13:11:15 | gen | stmts2.go:11:13:11:17 | call to gen | | stmts2.go:11:13:11:17 | After call to gen | stmts2.go:11:6:11:17 | extract:0 value declaration specifier | -| stmts2.go:11:13:11:17 | Before call to gen | stmts2.go:11:13:11:15 | Before gen | +| stmts2.go:11:13:11:17 | Before call to gen | stmts2.go:11:13:11:15 | gen | | stmts2.go:11:13:11:17 | call to gen | stmts2.go:9:1:13:1 | Exceptional Exit | | stmts2.go:11:13:11:17 | call to gen | stmts2.go:11:13:11:17 | After call to gen | | stmts2.go:12:2:12:13 | Before return statement | stmts2.go:12:9:12:13 | Before ...+... | | stmts2.go:12:2:12:13 | return statement | stmts2.go:9:1:13:1 | Normal Exit | -| stmts2.go:12:9:12:9 | After x | stmts2.go:12:13:12:13 | Before y | -| stmts2.go:12:9:12:9 | Before x | stmts2.go:12:9:12:9 | x | -| stmts2.go:12:9:12:9 | x | stmts2.go:12:9:12:9 | After x | +| stmts2.go:12:9:12:9 | x | stmts2.go:12:13:12:13 | y | | stmts2.go:12:9:12:13 | ...+... | stmts2.go:12:9:12:13 | After ...+... | | stmts2.go:12:9:12:13 | After ...+... | stmts2.go:12:2:12:13 | return statement | -| stmts2.go:12:9:12:13 | Before ...+... | stmts2.go:12:9:12:9 | Before x | -| stmts2.go:12:13:12:13 | After y | stmts2.go:12:9:12:13 | ...+... | -| stmts2.go:12:13:12:13 | Before y | stmts2.go:12:13:12:13 | y | -| stmts2.go:12:13:12:13 | y | stmts2.go:12:13:12:13 | After y | +| stmts2.go:12:9:12:13 | Before ...+... | stmts2.go:12:9:12:9 | x | +| stmts2.go:12:13:12:13 | y | stmts2.go:12:9:12:13 | ...+... | | stmts2.go:15:1:28:1 | After function declaration | stmts2.go:30:1:34:1 | Before function declaration | | stmts2.go:15:1:28:1 | Before function declaration | stmts2.go:15:1:28:1 | function declaration | | stmts2.go:15:1:28:1 | Entry | stmts2.go:15:13:15:14 | ch | @@ -2605,91 +2082,62 @@ | stmts2.go:15:13:15:14 | ch | stmts2.go:15:30:28:1 | block statement | | stmts2.go:15:30:28:1 | block statement | stmts2.go:16:2:26:2 | Before select statement | | stmts2.go:16:2:26:2 | After select statement | stmts2.go:27:2:27:9 | Before return statement | -| stmts2.go:16:2:26:2 | Before select statement | stmts2.go:17:13:17:14 | Before ch | +| stmts2.go:16:2:26:2 | Before select statement | stmts2.go:17:13:17:14 | ch | | stmts2.go:16:2:26:2 | select statement | stmts2.go:17:2:17:15 | comm clause | | stmts2.go:16:2:26:2 | select statement | stmts2.go:18:2:19:10 | comm clause | | stmts2.go:16:2:26:2 | select statement | stmts2.go:20:2:24:10 | comm clause | | stmts2.go:16:2:26:2 | select statement | stmts2.go:25:2:25:18 | comm clause | | stmts2.go:17:2:17:15 | comm clause | stmts2.go:17:7:17:14 | ... = ... | -| stmts2.go:17:7:17:7 | After _ | stmts2.go:16:2:26:2 | After select statement | -| stmts2.go:17:7:17:7 | Before _ | stmts2.go:17:7:17:7 | _ | -| stmts2.go:17:7:17:7 | _ | stmts2.go:17:7:17:7 | After _ | +| stmts2.go:17:7:17:7 | _ | stmts2.go:16:2:26:2 | After select statement | | stmts2.go:17:7:17:14 | ... = ... | stmts2.go:17:11:17:14 | Before <-... | -| stmts2.go:17:11:17:14 | <-... | stmts2.go:17:7:17:7 | Before _ | +| stmts2.go:17:11:17:14 | <-... | stmts2.go:17:7:17:7 | _ | | stmts2.go:17:11:17:14 | Before <-... | stmts2.go:17:11:17:14 | <-... | -| stmts2.go:17:13:17:14 | After ch | stmts2.go:18:17:18:18 | Before ch | -| stmts2.go:17:13:17:14 | Before ch | stmts2.go:17:13:17:14 | ch | -| stmts2.go:17:13:17:14 | ch | stmts2.go:17:13:17:14 | After ch | +| stmts2.go:17:13:17:14 | ch | stmts2.go:18:17:18:18 | ch | | stmts2.go:18:2:19:10 | comm clause | stmts2.go:18:7:18:18 | ... := ... | -| stmts2.go:18:7:18:7 | After x | stmts2.go:18:10:18:10 | Before _ | -| stmts2.go:18:7:18:7 | Before x | stmts2.go:18:7:18:7 | x | -| stmts2.go:18:7:18:7 | x | stmts2.go:18:7:18:7 | After x | +| stmts2.go:18:7:18:7 | x | stmts2.go:18:10:18:10 | _ | | stmts2.go:18:7:18:18 | ... := ... | stmts2.go:18:15:18:18 | Before <-... | | stmts2.go:18:7:18:18 | extract:0 ... := ... | stmts2.go:18:7:18:18 | extract:1 ... := ... | | stmts2.go:18:7:18:18 | extract:1 ... := ... | stmts2.go:19:3:19:10 | Before return statement | -| stmts2.go:18:10:18:10 | After _ | stmts2.go:18:7:18:18 | extract:0 ... := ... | -| stmts2.go:18:10:18:10 | Before _ | stmts2.go:18:10:18:10 | _ | -| stmts2.go:18:10:18:10 | _ | stmts2.go:18:10:18:10 | After _ | -| stmts2.go:18:15:18:18 | <-... | stmts2.go:18:7:18:7 | Before x | +| stmts2.go:18:10:18:10 | _ | stmts2.go:18:7:18:18 | extract:0 ... := ... | +| stmts2.go:18:15:18:18 | <-... | stmts2.go:18:7:18:7 | x | | stmts2.go:18:15:18:18 | Before <-... | stmts2.go:18:15:18:18 | <-... | -| stmts2.go:18:17:18:18 | After ch | stmts2.go:20:17:20:18 | Before ch | -| stmts2.go:18:17:18:18 | Before ch | stmts2.go:18:17:18:18 | ch | -| stmts2.go:18:17:18:18 | ch | stmts2.go:18:17:18:18 | After ch | -| stmts2.go:19:3:19:10 | Before return statement | stmts2.go:19:10:19:10 | Before x | +| stmts2.go:18:17:18:18 | ch | stmts2.go:20:17:20:18 | ch | +| stmts2.go:19:3:19:10 | Before return statement | stmts2.go:19:10:19:10 | x | | stmts2.go:19:3:19:10 | return statement | stmts2.go:15:1:28:1 | Normal Exit | -| stmts2.go:19:10:19:10 | After x | stmts2.go:19:3:19:10 | return statement | -| stmts2.go:19:10:19:10 | Before x | stmts2.go:19:10:19:10 | x | -| stmts2.go:19:10:19:10 | x | stmts2.go:19:10:19:10 | After x | +| stmts2.go:19:10:19:10 | x | stmts2.go:19:3:19:10 | return statement | | stmts2.go:20:2:24:10 | comm clause | stmts2.go:20:7:20:18 | ... := ... | -| stmts2.go:20:7:20:7 | After _ | stmts2.go:20:10:20:10 | Before y | -| stmts2.go:20:7:20:7 | Before _ | stmts2.go:20:7:20:7 | _ | -| stmts2.go:20:7:20:7 | _ | stmts2.go:20:7:20:7 | After _ | +| stmts2.go:20:7:20:7 | _ | stmts2.go:20:10:20:10 | y | | stmts2.go:20:7:20:18 | ... := ... | stmts2.go:20:15:20:18 | Before <-... | | stmts2.go:20:7:20:18 | extract:0 ... := ... | stmts2.go:20:7:20:18 | extract:1 ... := ... | | stmts2.go:20:7:20:18 | extract:1 ... := ... | stmts2.go:21:3:23:3 | if statement | -| stmts2.go:20:10:20:10 | After y | stmts2.go:20:7:20:18 | extract:0 ... := ... | -| stmts2.go:20:10:20:10 | Before y | stmts2.go:20:10:20:10 | y | -| stmts2.go:20:10:20:10 | y | stmts2.go:20:10:20:10 | After y | -| stmts2.go:20:15:20:18 | <-... | stmts2.go:20:7:20:7 | Before _ | +| stmts2.go:20:10:20:10 | y | stmts2.go:20:7:20:18 | extract:0 ... := ... | +| stmts2.go:20:15:20:18 | <-... | stmts2.go:20:7:20:7 | _ | | stmts2.go:20:15:20:18 | Before <-... | stmts2.go:20:15:20:18 | <-... | -| stmts2.go:20:17:20:18 | After ch | stmts2.go:25:16:25:17 | Before ch | -| stmts2.go:20:17:20:18 | Before ch | stmts2.go:20:17:20:18 | ch | -| stmts2.go:20:17:20:18 | ch | stmts2.go:20:17:20:18 | After ch | +| stmts2.go:20:17:20:18 | ch | stmts2.go:25:16:25:17 | ch | | stmts2.go:21:3:23:3 | After if statement | stmts2.go:24:3:24:10 | Before return statement | -| stmts2.go:21:3:23:3 | if statement | stmts2.go:21:6:21:6 | Before y | +| stmts2.go:21:3:23:3 | if statement | stmts2.go:21:6:21:6 | y | | stmts2.go:21:6:21:6 | After y [false] | stmts2.go:21:3:23:3 | After if statement | | stmts2.go:21:6:21:6 | After y [true] | stmts2.go:21:8:23:3 | block statement | -| stmts2.go:21:6:21:6 | Before y | stmts2.go:21:6:21:6 | y | | stmts2.go:21:6:21:6 | y | stmts2.go:21:6:21:6 | After y [false] | | stmts2.go:21:6:21:6 | y | stmts2.go:21:6:21:6 | After y [true] | | stmts2.go:21:8:23:3 | block statement | stmts2.go:22:4:22:8 | Before break statement | | stmts2.go:22:4:22:8 | Before break statement | stmts2.go:22:4:22:8 | break statement | | stmts2.go:22:4:22:8 | break statement | stmts2.go:16:2:26:2 | After select statement | -| stmts2.go:24:3:24:10 | Before return statement | stmts2.go:24:10:24:10 | Before 0 | +| stmts2.go:24:3:24:10 | Before return statement | stmts2.go:24:10:24:10 | 0 | | stmts2.go:24:3:24:10 | return statement | stmts2.go:15:1:28:1 | Normal Exit | -| stmts2.go:24:10:24:10 | 0 | stmts2.go:24:10:24:10 | After 0 | -| stmts2.go:24:10:24:10 | After 0 | stmts2.go:24:3:24:10 | return statement | -| stmts2.go:24:10:24:10 | Before 0 | stmts2.go:24:10:24:10 | 0 | +| stmts2.go:24:10:24:10 | 0 | stmts2.go:24:3:24:10 | return statement | | stmts2.go:25:2:25:18 | comm clause | stmts2.go:25:7:25:17 | ... = ... | -| stmts2.go:25:7:25:7 | After _ | stmts2.go:25:10:25:10 | Before _ | -| stmts2.go:25:7:25:7 | Before _ | stmts2.go:25:7:25:7 | _ | -| stmts2.go:25:7:25:7 | _ | stmts2.go:25:7:25:7 | After _ | +| stmts2.go:25:7:25:7 | _ | stmts2.go:25:10:25:10 | _ | | stmts2.go:25:7:25:17 | ... = ... | stmts2.go:25:14:25:17 | Before <-... | | stmts2.go:25:7:25:17 | extract:0 ... = ... | stmts2.go:25:7:25:17 | extract:1 ... = ... | | stmts2.go:25:7:25:17 | extract:1 ... = ... | stmts2.go:16:2:26:2 | After select statement | -| stmts2.go:25:10:25:10 | After _ | stmts2.go:25:7:25:17 | extract:0 ... = ... | -| stmts2.go:25:10:25:10 | Before _ | stmts2.go:25:10:25:10 | _ | -| stmts2.go:25:10:25:10 | _ | stmts2.go:25:10:25:10 | After _ | -| stmts2.go:25:14:25:17 | <-... | stmts2.go:25:7:25:7 | Before _ | +| stmts2.go:25:10:25:10 | _ | stmts2.go:25:7:25:17 | extract:0 ... = ... | +| stmts2.go:25:14:25:17 | <-... | stmts2.go:25:7:25:7 | _ | | stmts2.go:25:14:25:17 | Before <-... | stmts2.go:25:14:25:17 | <-... | -| stmts2.go:25:16:25:17 | After ch | stmts2.go:16:2:26:2 | select statement | -| stmts2.go:25:16:25:17 | Before ch | stmts2.go:25:16:25:17 | ch | -| stmts2.go:25:16:25:17 | ch | stmts2.go:25:16:25:17 | After ch | -| stmts2.go:27:2:27:9 | Before return statement | stmts2.go:27:9:27:9 | Before 1 | +| stmts2.go:25:16:25:17 | ch | stmts2.go:16:2:26:2 | select statement | +| stmts2.go:27:2:27:9 | Before return statement | stmts2.go:27:9:27:9 | 1 | | stmts2.go:27:2:27:9 | return statement | stmts2.go:15:1:28:1 | Normal Exit | -| stmts2.go:27:9:27:9 | 1 | stmts2.go:27:9:27:9 | After 1 | -| stmts2.go:27:9:27:9 | After 1 | stmts2.go:27:2:27:9 | return statement | -| stmts2.go:27:9:27:9 | Before 1 | stmts2.go:27:9:27:9 | 1 | +| stmts2.go:27:9:27:9 | 1 | stmts2.go:27:2:27:9 | return statement | | stmts2.go:30:1:34:1 | After function declaration | stmts2.go:0:0:0:0 | After stmts2.go | | stmts2.go:30:1:34:1 | Before function declaration | stmts2.go:30:1:34:1 | function declaration | | stmts2.go:30:1:34:1 | Entry | stmts2.go:30:20:34:1 | block statement | @@ -2701,11 +2149,9 @@ | stmts2.go:31:2:31:14 | After ... := ... | stmts2.go:32:2:32:17 | declaration statement | | stmts2.go:31:2:31:14 | extract:0 ... := ... | stmts2.go:31:2:31:14 | extract:1 ... := ... | | stmts2.go:31:2:31:14 | extract:1 ... := ... | stmts2.go:31:2:31:14 | After ... := ... | -| stmts2.go:31:10:31:12 | After gen | stmts2.go:31:10:31:14 | call to gen | -| stmts2.go:31:10:31:12 | Before gen | stmts2.go:31:10:31:12 | gen | -| stmts2.go:31:10:31:12 | gen | stmts2.go:31:10:31:12 | After gen | +| stmts2.go:31:10:31:12 | gen | stmts2.go:31:10:31:14 | call to gen | | stmts2.go:31:10:31:14 | After call to gen | stmts2.go:31:2:31:14 | extract:0 ... := ... | -| stmts2.go:31:10:31:14 | Before call to gen | stmts2.go:31:10:31:12 | Before gen | +| stmts2.go:31:10:31:14 | Before call to gen | stmts2.go:31:10:31:12 | gen | | stmts2.go:31:10:31:14 | call to gen | stmts2.go:30:1:34:1 | Exceptional Exit | | stmts2.go:31:10:31:14 | call to gen | stmts2.go:31:10:31:14 | After call to gen | | stmts2.go:32:2:32:17 | After declaration statement | stmts2.go:33:2:33:13 | Before return statement | @@ -2716,24 +2162,18 @@ | stmts2.go:32:6:32:17 | extract:0 value declaration specifier | stmts2.go:32:6:32:17 | extract:1 value declaration specifier | | stmts2.go:32:6:32:17 | extract:1 value declaration specifier | stmts2.go:32:6:32:17 | After value declaration specifier | | stmts2.go:32:6:32:17 | value declaration specifier | stmts2.go:32:13:32:17 | Before call to gen | -| stmts2.go:32:13:32:15 | After gen | stmts2.go:32:13:32:17 | call to gen | -| stmts2.go:32:13:32:15 | Before gen | stmts2.go:32:13:32:15 | gen | -| stmts2.go:32:13:32:15 | gen | stmts2.go:32:13:32:15 | After gen | +| stmts2.go:32:13:32:15 | gen | stmts2.go:32:13:32:17 | call to gen | | stmts2.go:32:13:32:17 | After call to gen | stmts2.go:32:6:32:17 | extract:0 value declaration specifier | -| stmts2.go:32:13:32:17 | Before call to gen | stmts2.go:32:13:32:15 | Before gen | +| stmts2.go:32:13:32:17 | Before call to gen | stmts2.go:32:13:32:15 | gen | | stmts2.go:32:13:32:17 | call to gen | stmts2.go:30:1:34:1 | Exceptional Exit | | stmts2.go:32:13:32:17 | call to gen | stmts2.go:32:13:32:17 | After call to gen | | stmts2.go:33:2:33:13 | Before return statement | stmts2.go:33:9:33:13 | Before ...+... | | stmts2.go:33:2:33:13 | return statement | stmts2.go:30:1:34:1 | Normal Exit | -| stmts2.go:33:9:33:9 | After x | stmts2.go:33:13:33:13 | Before y | -| stmts2.go:33:9:33:9 | Before x | stmts2.go:33:9:33:9 | x | -| stmts2.go:33:9:33:9 | x | stmts2.go:33:9:33:9 | After x | +| stmts2.go:33:9:33:9 | x | stmts2.go:33:13:33:13 | y | | stmts2.go:33:9:33:13 | ...+... | stmts2.go:33:9:33:13 | After ...+... | | stmts2.go:33:9:33:13 | After ...+... | stmts2.go:33:2:33:13 | return statement | -| stmts2.go:33:9:33:13 | Before ...+... | stmts2.go:33:9:33:9 | Before x | -| stmts2.go:33:13:33:13 | After y | stmts2.go:33:9:33:13 | ...+... | -| stmts2.go:33:13:33:13 | Before y | stmts2.go:33:13:33:13 | y | -| stmts2.go:33:13:33:13 | y | stmts2.go:33:13:33:13 | After y | +| stmts2.go:33:9:33:13 | Before ...+... | stmts2.go:33:9:33:9 | x | +| stmts2.go:33:13:33:13 | y | stmts2.go:33:9:33:13 | ...+... | | stmts3.go:0:0:0:0 | After stmts3.go | stmts3.go:0:0:0:0 | Normal Exit | | stmts3.go:0:0:0:0 | Entry | stmts3.go:0:0:0:0 | stmts3.go | | stmts3.go:0:0:0:0 | Normal Exit | stmts3.go:0:0:0:0 | Exit | @@ -2753,10 +2193,8 @@ | stmts3.go:6:2:10:2 | declaration statement | stmts3.go:6:2:10:2 | constant declaration | | stmts3.go:7:3:7:12 | After value declaration specifier | stmts3.go:8:3:8:7 | value declaration specifier | | stmts3.go:7:3:7:12 | assign:0 value declaration specifier | stmts3.go:7:3:7:12 | After value declaration specifier | -| stmts3.go:7:3:7:12 | value declaration specifier | stmts3.go:7:9:7:12 | Before iota | -| stmts3.go:7:9:7:12 | After iota | stmts3.go:7:3:7:12 | assign:0 value declaration specifier | -| stmts3.go:7:9:7:12 | Before iota | stmts3.go:7:9:7:12 | iota | -| stmts3.go:7:9:7:12 | iota | stmts3.go:7:9:7:12 | After iota | +| stmts3.go:7:3:7:12 | value declaration specifier | stmts3.go:7:9:7:12 | iota | +| stmts3.go:7:9:7:12 | iota | stmts3.go:7:3:7:12 | assign:0 value declaration specifier | | stmts3.go:8:3:8:7 | After value declaration specifier | stmts3.go:9:3:9:6 | value declaration specifier | | stmts3.go:8:3:8:7 | value declaration specifier | stmts3.go:8:3:8:7 | zero-init:0 value declaration specifier | | stmts3.go:8:3:8:7 | zero-init:0 value declaration specifier | stmts3.go:8:3:8:7 | After value declaration specifier | @@ -2776,15 +2214,11 @@ | stmts3.go:14:13:14:13 | x | stmts3.go:14:21:16:1 | block statement | | stmts3.go:14:21:16:1 | After block statement | stmts3.go:14:1:16:1 | Normal Exit | | stmts3.go:14:21:16:1 | block statement | stmts3.go:15:2:15:8 | ... = ... | -| stmts3.go:15:2:15:8 | ... = ... | stmts3.go:15:3:15:3 | Before x | +| stmts3.go:15:2:15:8 | ... = ... | stmts3.go:15:3:15:3 | x | | stmts3.go:15:2:15:8 | After ... = ... | stmts3.go:14:21:16:1 | After block statement | | stmts3.go:15:2:15:8 | assign:0 ... = ... | stmts3.go:15:2:15:8 | After ... = ... | -| stmts3.go:15:3:15:3 | After x | stmts3.go:15:7:15:8 | Before 42 | -| stmts3.go:15:3:15:3 | Before x | stmts3.go:15:3:15:3 | x | -| stmts3.go:15:3:15:3 | x | stmts3.go:15:3:15:3 | After x | -| stmts3.go:15:7:15:8 | 42 | stmts3.go:15:7:15:8 | After 42 | -| stmts3.go:15:7:15:8 | After 42 | stmts3.go:15:2:15:8 | assign:0 ... = ... | -| stmts3.go:15:7:15:8 | Before 42 | stmts3.go:15:7:15:8 | 42 | +| stmts3.go:15:3:15:3 | x | stmts3.go:15:7:15:8 | 42 | +| stmts3.go:15:7:15:8 | 42 | stmts3.go:15:2:15:8 | assign:0 ... = ... | | stmts3.go:18:1:20:1 | After function declaration | stmts3.go:0:0:0:0 | After stmts3.go | | stmts3.go:18:1:20:1 | Before function declaration | stmts3.go:18:1:20:1 | function declaration | | stmts3.go:18:1:20:1 | Entry | stmts3.go:18:15:20:1 | block statement | @@ -2832,18 +2266,14 @@ | stmts5.go:7:22:7:26 | other | stmts5.go:7:33:9:1 | block statement | | stmts5.go:7:33:9:1 | After block statement | stmts5.go:7:1:9:1 | Normal Exit | | stmts5.go:7:33:9:1 | block statement | stmts5.go:8:2:8:16 | Before ... += ... | -| stmts5.go:8:2:8:3 | After me | stmts5.go:8:2:8:7 | selection of val | -| stmts5.go:8:2:8:3 | Before me | stmts5.go:8:2:8:3 | me | -| stmts5.go:8:2:8:3 | me | stmts5.go:8:2:8:3 | After me | -| stmts5.go:8:2:8:7 | After selection of val | stmts5.go:8:12:8:16 | Before other | -| stmts5.go:8:2:8:7 | Before selection of val | stmts5.go:8:2:8:3 | Before me | +| stmts5.go:8:2:8:3 | me | stmts5.go:8:2:8:7 | selection of val | +| stmts5.go:8:2:8:7 | After selection of val | stmts5.go:8:12:8:16 | other | +| stmts5.go:8:2:8:7 | Before selection of val | stmts5.go:8:2:8:3 | me | | stmts5.go:8:2:8:7 | selection of val | stmts5.go:8:2:8:7 | After selection of val | | stmts5.go:8:2:8:16 | ... += ... | stmts5.go:8:2:8:16 | After ... += ... | | stmts5.go:8:2:8:16 | After ... += ... | stmts5.go:7:33:9:1 | After block statement | | stmts5.go:8:2:8:16 | Before ... += ... | stmts5.go:8:2:8:7 | Before selection of val | -| stmts5.go:8:12:8:16 | After other | stmts5.go:8:2:8:16 | ... += ... | -| stmts5.go:8:12:8:16 | Before other | stmts5.go:8:12:8:16 | other | -| stmts5.go:8:12:8:16 | other | stmts5.go:8:12:8:16 | After other | +| stmts5.go:8:12:8:16 | other | stmts5.go:8:2:8:16 | ... += ... | | stmts5.go:11:1:12:1 | After function declaration | stmts5.go:0:0:0:0 | After stmts5.go | | stmts5.go:11:1:12:1 | Before function declaration | stmts5.go:11:1:12:1 | function declaration | | stmts5.go:11:1:12:1 | Entry | stmts5.go:11:20:12:1 | block statement | @@ -2860,16 +2290,13 @@ | stmts6.go:3:1:8:1 | Normal Exit | stmts6.go:3:1:8:1 | Exit | | stmts6.go:3:1:8:1 | function declaration | stmts6.go:3:1:8:1 | After function declaration | | stmts6.go:3:19:8:1 | block statement | stmts6.go:4:2:6:2 | if statement | -| stmts6.go:4:2:6:2 | if statement | stmts6.go:4:5:4:8 | Before true | +| stmts6.go:4:2:6:2 | if statement | stmts6.go:4:5:4:8 | true | | stmts6.go:4:5:4:8 | After true [true] | stmts6.go:4:10:6:2 | block statement | -| stmts6.go:4:5:4:8 | Before true | stmts6.go:4:5:4:8 | true | | stmts6.go:4:5:4:8 | true | stmts6.go:4:5:4:8 | After true [true] | | stmts6.go:4:10:6:2 | block statement | stmts6.go:5:3:5:11 | Before return statement | -| stmts6.go:5:3:5:11 | Before return statement | stmts6.go:5:10:5:11 | Before 42 | +| stmts6.go:5:3:5:11 | Before return statement | stmts6.go:5:10:5:11 | 42 | | stmts6.go:5:3:5:11 | return statement | stmts6.go:3:1:8:1 | Normal Exit | -| stmts6.go:5:10:5:11 | 42 | stmts6.go:5:10:5:11 | After 42 | -| stmts6.go:5:10:5:11 | After 42 | stmts6.go:5:3:5:11 | return statement | -| stmts6.go:5:10:5:11 | Before 42 | stmts6.go:5:10:5:11 | 42 | +| stmts6.go:5:10:5:11 | 42 | stmts6.go:5:3:5:11 | return statement | | stmts7.go:0:0:0:0 | After stmts7.go | stmts7.go:0:0:0:0 | Normal Exit | | stmts7.go:0:0:0:0 | Entry | stmts7.go:0:0:0:0 | stmts7.go | | stmts7.go:0:0:0:0 | Normal Exit | stmts7.go:0:0:0:0 | Exit | @@ -2889,13 +2316,11 @@ | stmts7.go:9:2:9:18 | ... := ... | stmts7.go:9:10:9:18 | Before call to recover | | stmts7.go:9:2:9:18 | After ... := ... | stmts7.go:10:2:10:33 | expression statement | | stmts7.go:9:2:9:18 | assign:0 ... := ... | stmts7.go:9:2:9:18 | After ... := ... | -| stmts7.go:9:10:9:16 | After recover | stmts7.go:9:10:9:18 | call to recover | -| stmts7.go:9:10:9:16 | Before recover | stmts7.go:9:10:9:16 | recover | -| stmts7.go:9:10:9:16 | recover | stmts7.go:9:10:9:16 | After recover | +| stmts7.go:9:10:9:16 | recover | stmts7.go:9:10:9:18 | call to recover | | stmts7.go:9:10:9:18 | After call to recover | stmts7.go:9:2:9:18 | assign:0 ... := ... | -| stmts7.go:9:10:9:18 | Before call to recover | stmts7.go:9:10:9:16 | Before recover | +| stmts7.go:9:10:9:18 | Before call to recover | stmts7.go:9:10:9:16 | recover | | stmts7.go:9:10:9:18 | call to recover | stmts7.go:9:10:9:18 | After call to recover | -| stmts7.go:10:2:10:12 | After selection of Println | stmts7.go:10:14:10:26 | Before "recovered: " | +| stmts7.go:10:2:10:12 | After selection of Println | stmts7.go:10:14:10:26 | "recovered: " | | stmts7.go:10:2:10:12 | Before selection of Println | stmts7.go:10:2:10:12 | selection of Println | | stmts7.go:10:2:10:12 | selection of Println | stmts7.go:10:2:10:12 | After selection of Println | | stmts7.go:10:2:10:33 | After call to Println | stmts7.go:10:2:10:33 | After expression statement | @@ -2904,12 +2329,8 @@ | stmts7.go:10:2:10:33 | call to Println | stmts7.go:8:1:11:1 | Exceptional Exit | | stmts7.go:10:2:10:33 | call to Println | stmts7.go:10:2:10:33 | After call to Println | | stmts7.go:10:2:10:33 | expression statement | stmts7.go:10:2:10:33 | Before call to Println | -| stmts7.go:10:14:10:26 | "recovered: " | stmts7.go:10:14:10:26 | After "recovered: " | -| stmts7.go:10:14:10:26 | After "recovered: " | stmts7.go:10:29:10:32 | Before blah | -| stmts7.go:10:14:10:26 | Before "recovered: " | stmts7.go:10:14:10:26 | "recovered: " | -| stmts7.go:10:29:10:32 | After blah | stmts7.go:10:2:10:33 | call to Println | -| stmts7.go:10:29:10:32 | Before blah | stmts7.go:10:29:10:32 | blah | -| stmts7.go:10:29:10:32 | blah | stmts7.go:10:29:10:32 | After blah | +| stmts7.go:10:14:10:26 | "recovered: " | stmts7.go:10:29:10:32 | blah | +| stmts7.go:10:29:10:32 | blah | stmts7.go:10:2:10:33 | call to Println | | stmts7.go:13:1:16:1 | After function declaration | stmts7.go:18:1:20:1 | type declaration | | stmts7.go:13:1:16:1 | Before function declaration | stmts7.go:13:1:16:1 | function declaration | | stmts7.go:13:1:16:1 | Entry | stmts7.go:13:19:16:1 | block statement | @@ -2922,23 +2343,17 @@ | stmts7.go:14:2:14:21 | Before defer statement | stmts7.go:14:8:14:21 | call to recoverPanic | | stmts7.go:14:2:14:21 | catch-defer-panic defer statement | stmts7.go:13:1:16:1 | Exceptional Exit | | stmts7.go:14:2:14:21 | defer statement | stmts7.go:14:2:14:21 | After defer statement | -| stmts7.go:14:8:14:19 | After recoverPanic | stmts7.go:14:8:14:21 | After call to recoverPanic | -| stmts7.go:14:8:14:19 | Before recoverPanic | stmts7.go:14:8:14:19 | recoverPanic | -| stmts7.go:14:8:14:19 | recoverPanic | stmts7.go:14:8:14:19 | After recoverPanic | +| stmts7.go:14:8:14:19 | recoverPanic | stmts7.go:14:8:14:21 | After call to recoverPanic | | stmts7.go:14:8:14:21 | After call to recoverPanic | stmts7.go:14:2:14:21 | defer statement | -| stmts7.go:14:8:14:21 | call to recoverPanic | stmts7.go:14:8:14:19 | Before recoverPanic | +| stmts7.go:14:8:14:21 | call to recoverPanic | stmts7.go:14:8:14:19 | recoverPanic | | stmts7.go:14:8:14:21 | defer-invoke call to recoverPanic | stmts7.go:13:19:16:1 | After block statement | | stmts7.go:14:8:14:21 | defer-invoke call to recoverPanic | stmts7.go:14:2:14:21 | catch-defer-panic defer statement | -| stmts7.go:15:2:15:6 | After panic | stmts7.go:15:8:15:9 | Before "" | -| stmts7.go:15:2:15:6 | Before panic | stmts7.go:15:2:15:6 | panic | -| stmts7.go:15:2:15:6 | panic | stmts7.go:15:2:15:6 | After panic | -| stmts7.go:15:2:15:10 | Before call to panic | stmts7.go:15:2:15:6 | Before panic | +| stmts7.go:15:2:15:6 | panic | stmts7.go:15:8:15:9 | "" | +| stmts7.go:15:2:15:10 | Before call to panic | stmts7.go:15:2:15:6 | panic | | stmts7.go:15:2:15:10 | call to panic | stmts7.go:15:2:15:10 | catch-panic expression statement | | stmts7.go:15:2:15:10 | catch-panic expression statement | stmts7.go:14:8:14:21 | defer-invoke call to recoverPanic | | stmts7.go:15:2:15:10 | expression statement | stmts7.go:15:2:15:10 | Before call to panic | -| stmts7.go:15:8:15:9 | "" | stmts7.go:15:8:15:9 | After "" | -| stmts7.go:15:8:15:9 | After "" | stmts7.go:15:2:15:10 | call to panic | -| stmts7.go:15:8:15:9 | Before "" | stmts7.go:15:8:15:9 | "" | +| stmts7.go:15:8:15:9 | "" | stmts7.go:15:2:15:10 | call to panic | | stmts7.go:18:1:20:1 | After type declaration | stmts7.go:22:1:24:1 | Before function declaration | | stmts7.go:18:1:20:1 | type declaration | stmts7.go:18:6:20:1 | type declaration specifier | | stmts7.go:18:6:20:1 | type declaration specifier | stmts7.go:18:1:20:1 | After type declaration | @@ -2952,11 +2367,10 @@ | stmts7.go:22:32:24:1 | After block statement | stmts7.go:22:1:24:1 | Normal Exit | | stmts7.go:22:32:24:1 | block statement | stmts7.go:23:2:23:13 | expression statement | | stmts7.go:23:2:23:8 | After methods | stmts7.go:23:2:23:8 | implicit-deref methods | -| stmts7.go:23:2:23:8 | Before methods | stmts7.go:23:2:23:8 | methods | | stmts7.go:23:2:23:8 | implicit-deref methods | stmts7.go:23:2:23:11 | selection of fn | | stmts7.go:23:2:23:8 | methods | stmts7.go:23:2:23:8 | After methods | | stmts7.go:23:2:23:11 | After selection of fn | stmts7.go:23:2:23:13 | call to fn | -| stmts7.go:23:2:23:11 | Before selection of fn | stmts7.go:23:2:23:8 | Before methods | +| stmts7.go:23:2:23:11 | Before selection of fn | stmts7.go:23:2:23:8 | methods | | stmts7.go:23:2:23:11 | selection of fn | stmts7.go:23:2:23:11 | After selection of fn | | stmts7.go:23:2:23:13 | After call to fn | stmts7.go:23:2:23:13 | After expression statement | | stmts7.go:23:2:23:13 | After expression statement | stmts7.go:22:32:24:1 | After block statement | @@ -2977,11 +2391,9 @@ | stmts7.go:27:2:27:20 | Before defer statement | stmts7.go:27:8:27:20 | call to fn | | stmts7.go:27:2:27:20 | catch-defer-panic defer statement | stmts7.go:26:1:31:1 | Exceptional Exit | | stmts7.go:27:2:27:20 | defer statement | stmts7.go:27:2:27:20 | After defer statement | -| stmts7.go:27:8:27:15 | After callback | stmts7.go:27:8:27:18 | selection of fn | -| stmts7.go:27:8:27:15 | Before callback | stmts7.go:27:8:27:15 | callback | -| stmts7.go:27:8:27:15 | callback | stmts7.go:27:8:27:15 | After callback | +| stmts7.go:27:8:27:15 | callback | stmts7.go:27:8:27:18 | selection of fn | | stmts7.go:27:8:27:18 | After selection of fn | stmts7.go:27:8:27:20 | After call to fn | -| stmts7.go:27:8:27:18 | Before selection of fn | stmts7.go:27:8:27:15 | Before callback | +| stmts7.go:27:8:27:18 | Before selection of fn | stmts7.go:27:8:27:15 | callback | | stmts7.go:27:8:27:18 | selection of fn | stmts7.go:27:8:27:18 | After selection of fn | | stmts7.go:27:8:27:20 | After call to fn | stmts7.go:27:2:27:20 | defer statement | | stmts7.go:27:8:27:20 | call to fn | stmts7.go:27:8:27:18 | Before selection of fn | @@ -3000,12 +2412,10 @@ | stmts7.go:28:8:28:23 | defer-invoke call to fn | stmts7.go:28:2:28:23 | catch-defer-panic defer statement | | stmts7.go:28:9:28:17 | &... | stmts7.go:28:9:28:17 | After &... | | stmts7.go:28:9:28:17 | After &... | stmts7.go:28:9:28:17 | implicit-deref &... | -| stmts7.go:28:9:28:17 | Before &... | stmts7.go:28:10:28:17 | Before callback | +| stmts7.go:28:9:28:17 | Before &... | stmts7.go:28:10:28:17 | callback | | stmts7.go:28:9:28:17 | implicit-deref &... | stmts7.go:28:8:28:21 | selection of fn | -| stmts7.go:28:10:28:17 | After callback | stmts7.go:28:9:28:17 | &... | -| stmts7.go:28:10:28:17 | Before callback | stmts7.go:28:10:28:17 | callback | -| stmts7.go:28:10:28:17 | callback | stmts7.go:28:10:28:17 | After callback | -| stmts7.go:29:2:29:12 | After selection of Println | stmts7.go:29:14:29:30 | Before "print something" | +| stmts7.go:28:10:28:17 | callback | stmts7.go:28:9:28:17 | &... | +| stmts7.go:29:2:29:12 | After selection of Println | stmts7.go:29:14:29:30 | "print something" | | stmts7.go:29:2:29:12 | Before selection of Println | stmts7.go:29:2:29:12 | selection of Println | | stmts7.go:29:2:29:12 | selection of Println | stmts7.go:29:2:29:12 | After selection of Println | | stmts7.go:29:2:29:31 | After call to Println | stmts7.go:29:2:29:31 | After expression statement | @@ -3015,15 +2425,11 @@ | stmts7.go:29:2:29:31 | call to Println | stmts7.go:29:2:29:31 | catch-panic expression statement | | stmts7.go:29:2:29:31 | catch-panic expression statement | stmts7.go:28:8:28:23 | defer-invoke call to fn | | stmts7.go:29:2:29:31 | expression statement | stmts7.go:29:2:29:31 | Before call to Println | -| stmts7.go:29:14:29:30 | "print something" | stmts7.go:29:14:29:30 | After "print something" | -| stmts7.go:29:14:29:30 | After "print something" | stmts7.go:29:2:29:31 | call to Println | -| stmts7.go:29:14:29:30 | Before "print something" | stmts7.go:29:14:29:30 | "print something" | -| stmts7.go:30:2:30:13 | Before return statement | stmts7.go:30:9:30:13 | Before false | +| stmts7.go:29:14:29:30 | "print something" | stmts7.go:29:2:29:31 | call to Println | +| stmts7.go:30:2:30:13 | Before return statement | stmts7.go:30:9:30:13 | false | | stmts7.go:30:2:30:13 | catch-return return statement | stmts7.go:28:8:28:23 | defer-invoke call to fn | | stmts7.go:30:2:30:13 | return statement | stmts7.go:30:2:30:13 | catch-return return statement | -| stmts7.go:30:9:30:13 | After false | stmts7.go:30:2:30:13 | return statement | -| stmts7.go:30:9:30:13 | Before false | stmts7.go:30:9:30:13 | false | -| stmts7.go:30:9:30:13 | false | stmts7.go:30:9:30:13 | After false | +| stmts7.go:30:9:30:13 | false | stmts7.go:30:2:30:13 | return statement | | stmts7.go:33:1:36:1 | After function declaration | stmts7.go:38:1:41:1 | Before function declaration | | stmts7.go:33:1:36:1 | Before function declaration | stmts7.go:33:1:36:1 | function declaration | | stmts7.go:33:1:36:1 | Entry | stmts7.go:33:24:36:1 | block statement | @@ -3033,20 +2439,16 @@ | stmts7.go:34:2:34:21 | After defer statement | stmts7.go:35:2:35:11 | expression statement | | stmts7.go:34:2:34:21 | Before defer statement | stmts7.go:34:8:34:21 | call to recoverPanic | | stmts7.go:34:2:34:21 | defer statement | stmts7.go:34:2:34:21 | After defer statement | -| stmts7.go:34:8:34:19 | After recoverPanic | stmts7.go:34:8:34:21 | After call to recoverPanic | -| stmts7.go:34:8:34:19 | Before recoverPanic | stmts7.go:34:8:34:19 | recoverPanic | -| stmts7.go:34:8:34:19 | recoverPanic | stmts7.go:34:8:34:19 | After recoverPanic | +| stmts7.go:34:8:34:19 | recoverPanic | stmts7.go:34:8:34:21 | After call to recoverPanic | | stmts7.go:34:8:34:21 | After call to recoverPanic | stmts7.go:34:2:34:21 | defer statement | -| stmts7.go:34:8:34:21 | call to recoverPanic | stmts7.go:34:8:34:19 | Before recoverPanic | -| stmts7.go:35:2:35:8 | After selection of Exit | stmts7.go:35:10:35:10 | Before 1 | +| stmts7.go:34:8:34:21 | call to recoverPanic | stmts7.go:34:8:34:19 | recoverPanic | +| stmts7.go:35:2:35:8 | After selection of Exit | stmts7.go:35:10:35:10 | 1 | | stmts7.go:35:2:35:8 | Before selection of Exit | stmts7.go:35:2:35:8 | selection of Exit | | stmts7.go:35:2:35:8 | selection of Exit | stmts7.go:35:2:35:8 | After selection of Exit | | stmts7.go:35:2:35:11 | Before call to Exit | stmts7.go:35:2:35:8 | Before selection of Exit | | stmts7.go:35:2:35:11 | call to Exit | stmts7.go:33:1:36:1 | Exceptional Exit | | stmts7.go:35:2:35:11 | expression statement | stmts7.go:35:2:35:11 | Before call to Exit | -| stmts7.go:35:10:35:10 | 1 | stmts7.go:35:10:35:10 | After 1 | -| stmts7.go:35:10:35:10 | After 1 | stmts7.go:35:2:35:11 | call to Exit | -| stmts7.go:35:10:35:10 | Before 1 | stmts7.go:35:10:35:10 | 1 | +| stmts7.go:35:10:35:10 | 1 | stmts7.go:35:2:35:11 | call to Exit | | stmts7.go:38:1:41:1 | After function declaration | stmts7.go:43:1:45:1 | Before function declaration | | stmts7.go:38:1:41:1 | Before function declaration | stmts7.go:38:1:41:1 | function declaration | | stmts7.go:38:1:41:1 | Entry | stmts7.go:38:22:41:1 | block statement | @@ -3059,27 +2461,21 @@ | stmts7.go:39:2:39:21 | Before defer statement | stmts7.go:39:8:39:21 | call to recoverPanic | | stmts7.go:39:2:39:21 | catch-defer-panic defer statement | stmts7.go:38:1:41:1 | Exceptional Exit | | stmts7.go:39:2:39:21 | defer statement | stmts7.go:39:2:39:21 | After defer statement | -| stmts7.go:39:8:39:19 | After recoverPanic | stmts7.go:39:8:39:21 | After call to recoverPanic | -| stmts7.go:39:8:39:19 | Before recoverPanic | stmts7.go:39:8:39:19 | recoverPanic | -| stmts7.go:39:8:39:19 | recoverPanic | stmts7.go:39:8:39:19 | After recoverPanic | +| stmts7.go:39:8:39:19 | recoverPanic | stmts7.go:39:8:39:21 | After call to recoverPanic | | stmts7.go:39:8:39:21 | After call to recoverPanic | stmts7.go:39:2:39:21 | defer statement | -| stmts7.go:39:8:39:21 | call to recoverPanic | stmts7.go:39:8:39:19 | Before recoverPanic | +| stmts7.go:39:8:39:21 | call to recoverPanic | stmts7.go:39:8:39:19 | recoverPanic | | stmts7.go:39:8:39:21 | defer-invoke call to recoverPanic | stmts7.go:38:22:41:1 | After block statement | | stmts7.go:39:8:39:21 | defer-invoke call to recoverPanic | stmts7.go:39:2:39:21 | catch-defer-panic defer statement | | stmts7.go:40:2:40:30 | After defer statement | stmts7.go:40:8:40:30 | defer-invoke call to panic | | stmts7.go:40:2:40:30 | Before defer statement | stmts7.go:40:8:40:30 | call to panic | | stmts7.go:40:2:40:30 | catch-defer-panic defer statement | stmts7.go:39:8:39:21 | defer-invoke call to recoverPanic | | stmts7.go:40:2:40:30 | defer statement | stmts7.go:40:2:40:30 | After defer statement | -| stmts7.go:40:8:40:12 | After panic | stmts7.go:40:14:40:29 | Before "deferred panic" | -| stmts7.go:40:8:40:12 | Before panic | stmts7.go:40:8:40:12 | panic | -| stmts7.go:40:8:40:12 | panic | stmts7.go:40:8:40:12 | After panic | +| stmts7.go:40:8:40:12 | panic | stmts7.go:40:14:40:29 | "deferred panic" | | stmts7.go:40:8:40:30 | After call to panic | stmts7.go:40:2:40:30 | defer statement | -| stmts7.go:40:8:40:30 | call to panic | stmts7.go:40:8:40:12 | Before panic | +| stmts7.go:40:8:40:30 | call to panic | stmts7.go:40:8:40:12 | panic | | stmts7.go:40:8:40:30 | defer-invoke call to panic | stmts7.go:39:8:39:21 | defer-invoke call to recoverPanic | | stmts7.go:40:8:40:30 | defer-invoke call to panic | stmts7.go:40:2:40:30 | catch-defer-panic defer statement | -| stmts7.go:40:14:40:29 | "deferred panic" | stmts7.go:40:14:40:29 | After "deferred panic" | -| stmts7.go:40:14:40:29 | After "deferred panic" | stmts7.go:40:8:40:30 | After call to panic | -| stmts7.go:40:14:40:29 | Before "deferred panic" | stmts7.go:40:14:40:29 | "deferred panic" | +| stmts7.go:40:14:40:29 | "deferred panic" | stmts7.go:40:8:40:30 | After call to panic | | stmts7.go:43:1:45:1 | After function declaration | stmts7.go:47:1:50:1 | Before function declaration | | stmts7.go:43:1:45:1 | Before function declaration | stmts7.go:43:1:45:1 | function declaration | | stmts7.go:43:1:45:1 | Entry | stmts7.go:43:27:45:1 | block statement | @@ -3090,15 +2486,11 @@ | stmts7.go:44:2:44:36 | Before defer statement | stmts7.go:44:8:44:36 | call to panic | | stmts7.go:44:2:44:36 | catch-defer-panic defer statement | stmts7.go:43:1:45:1 | Exceptional Exit | | stmts7.go:44:2:44:36 | defer statement | stmts7.go:44:2:44:36 | After defer statement | -| stmts7.go:44:8:44:12 | After panic | stmts7.go:44:14:44:35 | Before "final deferred panic" | -| stmts7.go:44:8:44:12 | Before panic | stmts7.go:44:8:44:12 | panic | -| stmts7.go:44:8:44:12 | panic | stmts7.go:44:8:44:12 | After panic | +| stmts7.go:44:8:44:12 | panic | stmts7.go:44:14:44:35 | "final deferred panic" | | stmts7.go:44:8:44:36 | After call to panic | stmts7.go:44:2:44:36 | defer statement | -| stmts7.go:44:8:44:36 | call to panic | stmts7.go:44:8:44:12 | Before panic | +| stmts7.go:44:8:44:36 | call to panic | stmts7.go:44:8:44:12 | panic | | stmts7.go:44:8:44:36 | defer-invoke call to panic | stmts7.go:44:2:44:36 | catch-defer-panic defer statement | -| stmts7.go:44:14:44:35 | "final deferred panic" | stmts7.go:44:14:44:35 | After "final deferred panic" | -| stmts7.go:44:14:44:35 | After "final deferred panic" | stmts7.go:44:8:44:36 | After call to panic | -| stmts7.go:44:14:44:35 | Before "final deferred panic" | stmts7.go:44:14:44:35 | "final deferred panic" | +| stmts7.go:44:14:44:35 | "final deferred panic" | stmts7.go:44:8:44:36 | After call to panic | | stmts7.go:47:1:50:1 | After function declaration | stmts7.go:52:1:55:1 | Before function declaration | | stmts7.go:47:1:50:1 | Before function declaration | stmts7.go:47:1:50:1 | function declaration | | stmts7.go:47:1:50:1 | Entry | stmts7.go:47:35:50:1 | block statement | @@ -3108,24 +2500,20 @@ | stmts7.go:48:2:48:21 | After defer statement | stmts7.go:49:2:49:17 | Before defer statement | | stmts7.go:48:2:48:21 | Before defer statement | stmts7.go:48:8:48:21 | call to recoverPanic | | stmts7.go:48:2:48:21 | defer statement | stmts7.go:48:2:48:21 | After defer statement | -| stmts7.go:48:8:48:19 | After recoverPanic | stmts7.go:48:8:48:21 | After call to recoverPanic | -| stmts7.go:48:8:48:19 | Before recoverPanic | stmts7.go:48:8:48:19 | recoverPanic | -| stmts7.go:48:8:48:19 | recoverPanic | stmts7.go:48:8:48:19 | After recoverPanic | +| stmts7.go:48:8:48:19 | recoverPanic | stmts7.go:48:8:48:21 | After call to recoverPanic | | stmts7.go:48:8:48:21 | After call to recoverPanic | stmts7.go:48:2:48:21 | defer statement | -| stmts7.go:48:8:48:21 | call to recoverPanic | stmts7.go:48:8:48:19 | Before recoverPanic | +| stmts7.go:48:8:48:21 | call to recoverPanic | stmts7.go:48:8:48:19 | recoverPanic | | stmts7.go:49:2:49:17 | After defer statement | stmts7.go:49:8:49:17 | defer-invoke call to Exit | | stmts7.go:49:2:49:17 | Before defer statement | stmts7.go:49:8:49:17 | call to Exit | | stmts7.go:49:2:49:17 | catch-defer-panic defer statement | stmts7.go:47:1:50:1 | Exceptional Exit | | stmts7.go:49:2:49:17 | defer statement | stmts7.go:49:2:49:17 | After defer statement | -| stmts7.go:49:8:49:14 | After selection of Exit | stmts7.go:49:16:49:16 | Before 1 | +| stmts7.go:49:8:49:14 | After selection of Exit | stmts7.go:49:16:49:16 | 1 | | stmts7.go:49:8:49:14 | Before selection of Exit | stmts7.go:49:8:49:14 | selection of Exit | | stmts7.go:49:8:49:14 | selection of Exit | stmts7.go:49:8:49:14 | After selection of Exit | | stmts7.go:49:8:49:17 | After call to Exit | stmts7.go:49:2:49:17 | defer statement | | stmts7.go:49:8:49:17 | call to Exit | stmts7.go:49:8:49:14 | Before selection of Exit | | stmts7.go:49:8:49:17 | defer-invoke call to Exit | stmts7.go:49:2:49:17 | catch-defer-panic defer statement | -| stmts7.go:49:16:49:16 | 1 | stmts7.go:49:16:49:16 | After 1 | -| stmts7.go:49:16:49:16 | After 1 | stmts7.go:49:8:49:17 | After call to Exit | -| stmts7.go:49:16:49:16 | Before 1 | stmts7.go:49:16:49:16 | 1 | +| stmts7.go:49:16:49:16 | 1 | stmts7.go:49:8:49:17 | After call to Exit | | stmts7.go:52:1:55:1 | After function declaration | stmts7.go:57:1:62:1 | Before function declaration | | stmts7.go:52:1:55:1 | Before function declaration | stmts7.go:52:1:55:1 | function declaration | | stmts7.go:52:1:55:1 | Entry | stmts7.go:52:31:52:36 | values | @@ -3140,26 +2528,20 @@ | stmts7.go:53:2:53:21 | Before defer statement | stmts7.go:53:8:53:21 | call to recoverPanic | | stmts7.go:53:2:53:21 | catch-defer-panic defer statement | stmts7.go:52:1:55:1 | Exceptional Exit | | stmts7.go:53:2:53:21 | defer statement | stmts7.go:53:2:53:21 | After defer statement | -| stmts7.go:53:8:53:19 | After recoverPanic | stmts7.go:53:8:53:21 | After call to recoverPanic | -| stmts7.go:53:8:53:19 | Before recoverPanic | stmts7.go:53:8:53:19 | recoverPanic | -| stmts7.go:53:8:53:19 | recoverPanic | stmts7.go:53:8:53:19 | After recoverPanic | +| stmts7.go:53:8:53:19 | recoverPanic | stmts7.go:53:8:53:21 | After call to recoverPanic | | stmts7.go:53:8:53:21 | After call to recoverPanic | stmts7.go:53:2:53:21 | defer statement | -| stmts7.go:53:8:53:21 | call to recoverPanic | stmts7.go:53:8:53:19 | Before recoverPanic | +| stmts7.go:53:8:53:21 | call to recoverPanic | stmts7.go:53:8:53:19 | recoverPanic | | stmts7.go:53:8:53:21 | defer-invoke call to recoverPanic | stmts7.go:52:56:55:1 | After block statement | | stmts7.go:53:8:53:21 | defer-invoke call to recoverPanic | stmts7.go:53:2:53:21 | catch-defer-panic defer statement | | stmts7.go:54:2:54:18 | ... = ... | stmts7.go:54:6:54:18 | Before index expression | | stmts7.go:54:2:54:18 | After ... = ... | stmts7.go:53:8:53:21 | defer-invoke call to recoverPanic | | stmts7.go:54:2:54:18 | catch-panic ... = ... | stmts7.go:53:8:53:21 | defer-invoke call to recoverPanic | -| stmts7.go:54:6:54:11 | After values | stmts7.go:54:13:54:17 | Before index | -| stmts7.go:54:6:54:11 | Before values | stmts7.go:54:6:54:11 | values | -| stmts7.go:54:6:54:11 | values | stmts7.go:54:6:54:11 | After values | +| stmts7.go:54:6:54:11 | values | stmts7.go:54:13:54:17 | index | | stmts7.go:54:6:54:18 | After index expression | stmts7.go:54:2:54:18 | After ... = ... | -| stmts7.go:54:6:54:18 | Before index expression | stmts7.go:54:6:54:11 | Before values | +| stmts7.go:54:6:54:18 | Before index expression | stmts7.go:54:6:54:11 | values | | stmts7.go:54:6:54:18 | index expression | stmts7.go:54:2:54:18 | catch-panic ... = ... | | stmts7.go:54:6:54:18 | index expression | stmts7.go:54:6:54:18 | After index expression | -| stmts7.go:54:13:54:17 | After index | stmts7.go:54:6:54:18 | index expression | -| stmts7.go:54:13:54:17 | Before index | stmts7.go:54:13:54:17 | index | -| stmts7.go:54:13:54:17 | index | stmts7.go:54:13:54:17 | After index | +| stmts7.go:54:13:54:17 | index | stmts7.go:54:6:54:18 | index expression | | stmts7.go:57:1:62:1 | After function declaration | stmts7.go:64:1:68:1 | Before function declaration | | stmts7.go:57:1:62:1 | Before function declaration | stmts7.go:57:1:62:1 | function declaration | | stmts7.go:57:1:62:1 | Entry | stmts7.go:57:23:57:30 | register | @@ -3170,10 +2552,9 @@ | stmts7.go:57:38:62:1 | After block statement | stmts7.go:57:1:62:1 | Normal Exit | | stmts7.go:57:38:62:1 | block statement | stmts7.go:58:2:60:2 | if statement | | stmts7.go:58:2:60:2 | After if statement | stmts7.go:61:2:61:20 | expression statement | -| stmts7.go:58:2:60:2 | if statement | stmts7.go:58:5:58:12 | Before register | +| stmts7.go:58:2:60:2 | if statement | stmts7.go:58:5:58:12 | register | | stmts7.go:58:5:58:12 | After register [false] | stmts7.go:58:2:60:2 | After if statement | | stmts7.go:58:5:58:12 | After register [true] | stmts7.go:58:14:60:2 | block statement | -| stmts7.go:58:5:58:12 | Before register | stmts7.go:58:5:58:12 | register | | stmts7.go:58:5:58:12 | register | stmts7.go:58:5:58:12 | After register [false] | | stmts7.go:58:5:58:12 | register | stmts7.go:58:5:58:12 | After register [true] | | stmts7.go:58:14:60:2 | After block statement | stmts7.go:58:2:60:2 | After if statement | @@ -3182,14 +2563,12 @@ | stmts7.go:59:3:59:22 | Before defer statement | stmts7.go:59:9:59:22 | call to recoverPanic | | stmts7.go:59:3:59:22 | catch-defer-panic defer statement | stmts7.go:57:1:62:1 | Exceptional Exit | | stmts7.go:59:3:59:22 | defer statement | stmts7.go:59:3:59:22 | After defer statement | -| stmts7.go:59:9:59:20 | After recoverPanic | stmts7.go:59:9:59:22 | After call to recoverPanic | -| stmts7.go:59:9:59:20 | Before recoverPanic | stmts7.go:59:9:59:20 | recoverPanic | -| stmts7.go:59:9:59:20 | recoverPanic | stmts7.go:59:9:59:20 | After recoverPanic | +| stmts7.go:59:9:59:20 | recoverPanic | stmts7.go:59:9:59:22 | After call to recoverPanic | | stmts7.go:59:9:59:22 | After call to recoverPanic | stmts7.go:59:3:59:22 | defer statement | -| stmts7.go:59:9:59:22 | call to recoverPanic | stmts7.go:59:9:59:20 | Before recoverPanic | +| stmts7.go:59:9:59:22 | call to recoverPanic | stmts7.go:59:9:59:20 | recoverPanic | | stmts7.go:59:9:59:22 | defer-invoke call to recoverPanic | stmts7.go:57:38:62:1 | After block statement | | stmts7.go:59:9:59:22 | defer-invoke call to recoverPanic | stmts7.go:59:3:59:22 | catch-defer-panic defer statement | -| stmts7.go:61:2:61:12 | After selection of Println | stmts7.go:61:14:61:19 | Before "done" | +| stmts7.go:61:2:61:12 | After selection of Println | stmts7.go:61:14:61:19 | "done" | | stmts7.go:61:2:61:12 | Before selection of Println | stmts7.go:61:2:61:12 | selection of Println | | stmts7.go:61:2:61:12 | selection of Println | stmts7.go:61:2:61:12 | After selection of Println | | stmts7.go:61:2:61:20 | After call to Println | stmts7.go:61:2:61:20 | After expression statement | @@ -3201,9 +2580,7 @@ | stmts7.go:61:2:61:20 | catch-panic expression statement | stmts7.go:57:1:62:1 | Exceptional Exit | | stmts7.go:61:2:61:20 | catch-panic expression statement | stmts7.go:59:9:59:22 | defer-invoke call to recoverPanic | | stmts7.go:61:2:61:20 | expression statement | stmts7.go:61:2:61:20 | Before call to Println | -| stmts7.go:61:14:61:19 | "done" | stmts7.go:61:14:61:19 | After "done" | -| stmts7.go:61:14:61:19 | After "done" | stmts7.go:61:2:61:20 | call to Println | -| stmts7.go:61:14:61:19 | Before "done" | stmts7.go:61:14:61:19 | "done" | +| stmts7.go:61:14:61:19 | "done" | stmts7.go:61:2:61:20 | call to Println | | stmts7.go:64:1:68:1 | After function declaration | stmts7.go:70:1:77:1 | Before function declaration | | stmts7.go:64:1:68:1 | Before function declaration | stmts7.go:64:1:68:1 | function declaration | | stmts7.go:64:1:68:1 | Entry | stmts7.go:64:20:64:24 | count | @@ -3217,28 +2594,20 @@ | stmts7.go:65:2:67:2 | After for statement | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | | stmts7.go:65:2:67:2 | [LoopHeader] for statement | stmts7.go:65:25:65:27 | Before increment statement | | stmts7.go:65:2:67:2 | for statement | stmts7.go:65:6:65:11 | ... := ... | -| stmts7.go:65:6:65:11 | ... := ... | stmts7.go:65:11:65:11 | Before 0 | +| stmts7.go:65:6:65:11 | ... := ... | stmts7.go:65:11:65:11 | 0 | | stmts7.go:65:6:65:11 | After ... := ... | stmts7.go:65:14:65:22 | Before ...<... | | stmts7.go:65:6:65:11 | assign:0 ... := ... | stmts7.go:65:6:65:11 | After ... := ... | -| stmts7.go:65:11:65:11 | 0 | stmts7.go:65:11:65:11 | After 0 | -| stmts7.go:65:11:65:11 | After 0 | stmts7.go:65:6:65:11 | assign:0 ... := ... | -| stmts7.go:65:11:65:11 | Before 0 | stmts7.go:65:11:65:11 | 0 | -| stmts7.go:65:14:65:14 | After i | stmts7.go:65:18:65:22 | Before count | -| stmts7.go:65:14:65:14 | Before i | stmts7.go:65:14:65:14 | i | -| stmts7.go:65:14:65:14 | i | stmts7.go:65:14:65:14 | After i | +| stmts7.go:65:11:65:11 | 0 | stmts7.go:65:6:65:11 | assign:0 ... := ... | +| stmts7.go:65:14:65:14 | i | stmts7.go:65:18:65:22 | count | | stmts7.go:65:14:65:22 | ...<... | stmts7.go:65:14:65:22 | After ...<... [false] | | stmts7.go:65:14:65:22 | ...<... | stmts7.go:65:14:65:22 | After ...<... [true] | | stmts7.go:65:14:65:22 | After ...<... [false] | stmts7.go:65:2:67:2 | After for statement | | stmts7.go:65:14:65:22 | After ...<... [true] | stmts7.go:65:29:67:2 | block statement | -| stmts7.go:65:14:65:22 | Before ...<... | stmts7.go:65:14:65:14 | Before i | -| stmts7.go:65:18:65:22 | After count | stmts7.go:65:14:65:22 | ...<... | -| stmts7.go:65:18:65:22 | Before count | stmts7.go:65:18:65:22 | count | -| stmts7.go:65:18:65:22 | count | stmts7.go:65:18:65:22 | After count | -| stmts7.go:65:25:65:25 | After i | stmts7.go:65:25:65:27 | increment statement | -| stmts7.go:65:25:65:25 | Before i | stmts7.go:65:25:65:25 | i | -| stmts7.go:65:25:65:25 | i | stmts7.go:65:25:65:25 | After i | +| stmts7.go:65:14:65:22 | Before ...<... | stmts7.go:65:14:65:14 | i | +| stmts7.go:65:18:65:22 | count | stmts7.go:65:14:65:22 | ...<... | +| stmts7.go:65:25:65:25 | i | stmts7.go:65:25:65:27 | increment statement | | stmts7.go:65:25:65:27 | After increment statement | stmts7.go:65:14:65:22 | Before ...<... | -| stmts7.go:65:25:65:27 | Before increment statement | stmts7.go:65:25:65:25 | Before i | +| stmts7.go:65:25:65:27 | Before increment statement | stmts7.go:65:25:65:25 | i | | stmts7.go:65:25:65:27 | increment statement | stmts7.go:65:25:65:27 | After increment statement | | stmts7.go:65:29:67:2 | After block statement | stmts7.go:65:2:67:2 | [LoopHeader] for statement | | stmts7.go:65:29:67:2 | block statement | stmts7.go:66:3:66:22 | Before defer statement | @@ -3247,11 +2616,9 @@ | stmts7.go:66:3:66:22 | catch-defer-panic defer statement | stmts7.go:64:1:68:1 | Exceptional Exit | | stmts7.go:66:3:66:22 | catch-defer-panic defer statement | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | | stmts7.go:66:3:66:22 | defer statement | stmts7.go:66:3:66:22 | After defer statement | -| stmts7.go:66:9:66:20 | After recoverPanic | stmts7.go:66:9:66:22 | After call to recoverPanic | -| stmts7.go:66:9:66:20 | Before recoverPanic | stmts7.go:66:9:66:20 | recoverPanic | -| stmts7.go:66:9:66:20 | recoverPanic | stmts7.go:66:9:66:20 | After recoverPanic | +| stmts7.go:66:9:66:20 | recoverPanic | stmts7.go:66:9:66:22 | After call to recoverPanic | | stmts7.go:66:9:66:22 | After call to recoverPanic | stmts7.go:66:3:66:22 | defer statement | -| stmts7.go:66:9:66:22 | call to recoverPanic | stmts7.go:66:9:66:20 | Before recoverPanic | +| stmts7.go:66:9:66:22 | call to recoverPanic | stmts7.go:66:9:66:20 | recoverPanic | | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | stmts7.go:64:31:68:1 | After block statement | | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | stmts7.go:66:3:66:22 | catch-defer-panic defer statement | | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | @@ -3265,10 +2632,9 @@ | stmts7.go:70:31:77:1 | After block statement | stmts7.go:70:1:77:1 | Normal Exit | | stmts7.go:70:31:77:1 | block statement | stmts7.go:71:2:73:2 | if statement | | stmts7.go:71:2:73:2 | After if statement | stmts7.go:74:2:74:21 | Before defer statement | -| stmts7.go:71:2:73:2 | if statement | stmts7.go:71:5:71:8 | Before skip | +| stmts7.go:71:2:73:2 | if statement | stmts7.go:71:5:71:8 | skip | | stmts7.go:71:5:71:8 | After skip [false] | stmts7.go:71:2:73:2 | After if statement | | stmts7.go:71:5:71:8 | After skip [true] | stmts7.go:71:10:73:2 | block statement | -| stmts7.go:71:5:71:8 | Before skip | stmts7.go:71:5:71:8 | skip | | stmts7.go:71:5:71:8 | skip | stmts7.go:71:5:71:8 | After skip [false] | | stmts7.go:71:5:71:8 | skip | stmts7.go:71:5:71:8 | After skip [true] | | stmts7.go:71:10:73:2 | block statement | stmts7.go:72:3:72:11 | Before goto statement | @@ -3278,11 +2644,9 @@ | stmts7.go:74:2:74:21 | Before defer statement | stmts7.go:74:8:74:21 | call to recoverPanic | | stmts7.go:74:2:74:21 | catch-defer-panic defer statement | stmts7.go:70:1:77:1 | Exceptional Exit | | stmts7.go:74:2:74:21 | defer statement | stmts7.go:74:2:74:21 | After defer statement | -| stmts7.go:74:8:74:19 | After recoverPanic | stmts7.go:74:8:74:21 | After call to recoverPanic | -| stmts7.go:74:8:74:19 | Before recoverPanic | stmts7.go:74:8:74:19 | recoverPanic | -| stmts7.go:74:8:74:19 | recoverPanic | stmts7.go:74:8:74:19 | After recoverPanic | +| stmts7.go:74:8:74:19 | recoverPanic | stmts7.go:74:8:74:21 | After call to recoverPanic | | stmts7.go:74:8:74:21 | After call to recoverPanic | stmts7.go:74:2:74:21 | defer statement | -| stmts7.go:74:8:74:21 | call to recoverPanic | stmts7.go:74:8:74:19 | Before recoverPanic | +| stmts7.go:74:8:74:21 | call to recoverPanic | stmts7.go:74:8:74:19 | recoverPanic | | stmts7.go:74:8:74:21 | defer-invoke call to recoverPanic | stmts7.go:70:31:77:1 | After block statement | | stmts7.go:74:8:74:21 | defer-invoke call to recoverPanic | stmts7.go:74:2:74:21 | catch-defer-panic defer statement | | stmts7.go:75:1:76:20 | After labeled statement | stmts7.go:70:31:77:1 | After block statement | @@ -3290,7 +2654,7 @@ | stmts7.go:75:1:76:20 | catch-panic labeled statement | stmts7.go:70:1:77:1 | Exceptional Exit | | stmts7.go:75:1:76:20 | catch-panic labeled statement | stmts7.go:74:8:74:21 | defer-invoke call to recoverPanic | | stmts7.go:75:1:76:20 | labeled statement | stmts7.go:76:2:76:20 | expression statement | -| stmts7.go:76:2:76:12 | After selection of Println | stmts7.go:76:14:76:19 | Before "done" | +| stmts7.go:76:2:76:12 | After selection of Println | stmts7.go:76:14:76:19 | "done" | | stmts7.go:76:2:76:12 | Before selection of Println | stmts7.go:76:2:76:12 | selection of Println | | stmts7.go:76:2:76:12 | selection of Println | stmts7.go:76:2:76:12 | After selection of Println | | stmts7.go:76:2:76:20 | After call to Println | stmts7.go:76:2:76:20 | After expression statement | @@ -3299,9 +2663,7 @@ | stmts7.go:76:2:76:20 | call to Println | stmts7.go:75:1:76:20 | catch-panic labeled statement | | stmts7.go:76:2:76:20 | call to Println | stmts7.go:76:2:76:20 | After call to Println | | stmts7.go:76:2:76:20 | expression statement | stmts7.go:76:2:76:20 | Before call to Println | -| stmts7.go:76:14:76:19 | "done" | stmts7.go:76:14:76:19 | After "done" | -| stmts7.go:76:14:76:19 | After "done" | stmts7.go:76:2:76:20 | call to Println | -| stmts7.go:76:14:76:19 | Before "done" | stmts7.go:76:14:76:19 | "done" | +| stmts7.go:76:14:76:19 | "done" | stmts7.go:76:2:76:20 | call to Println | | stmts7.go:79:1:85:1 | After function declaration | stmts7.go:0:0:0:0 | After stmts7.go | | stmts7.go:79:1:85:1 | Before function declaration | stmts7.go:79:1:85:1 | function declaration | | stmts7.go:79:1:85:1 | Entry | stmts7.go:79:23:79:32 | panicEarly | @@ -3313,43 +2675,32 @@ | stmts7.go:79:40:85:1 | block statement | stmts7.go:80:2:82:2 | if statement | | stmts7.go:80:2:82:2 | After if statement | stmts7.go:83:2:83:21 | Before defer statement | | stmts7.go:80:2:82:2 | catch-panic if statement | stmts7.go:79:1:85:1 | Exceptional Exit | -| stmts7.go:80:2:82:2 | if statement | stmts7.go:80:5:80:14 | Before panicEarly | +| stmts7.go:80:2:82:2 | if statement | stmts7.go:80:5:80:14 | panicEarly | | stmts7.go:80:5:80:14 | After panicEarly [false] | stmts7.go:80:2:82:2 | After if statement | | stmts7.go:80:5:80:14 | After panicEarly [true] | stmts7.go:80:16:82:2 | block statement | -| stmts7.go:80:5:80:14 | Before panicEarly | stmts7.go:80:5:80:14 | panicEarly | | stmts7.go:80:5:80:14 | panicEarly | stmts7.go:80:5:80:14 | After panicEarly [false] | | stmts7.go:80:5:80:14 | panicEarly | stmts7.go:80:5:80:14 | After panicEarly [true] | | stmts7.go:80:16:82:2 | block statement | stmts7.go:81:3:81:16 | expression statement | -| stmts7.go:81:3:81:7 | After panic | stmts7.go:81:9:81:15 | Before "early" | -| stmts7.go:81:3:81:7 | Before panic | stmts7.go:81:3:81:7 | panic | -| stmts7.go:81:3:81:7 | panic | stmts7.go:81:3:81:7 | After panic | -| stmts7.go:81:3:81:16 | Before call to panic | stmts7.go:81:3:81:7 | Before panic | +| stmts7.go:81:3:81:7 | panic | stmts7.go:81:9:81:15 | "early" | +| stmts7.go:81:3:81:16 | Before call to panic | stmts7.go:81:3:81:7 | panic | | stmts7.go:81:3:81:16 | call to panic | stmts7.go:80:2:82:2 | catch-panic if statement | | stmts7.go:81:3:81:16 | expression statement | stmts7.go:81:3:81:16 | Before call to panic | -| stmts7.go:81:9:81:15 | "early" | stmts7.go:81:9:81:15 | After "early" | -| stmts7.go:81:9:81:15 | After "early" | stmts7.go:81:3:81:16 | call to panic | -| stmts7.go:81:9:81:15 | Before "early" | stmts7.go:81:9:81:15 | "early" | +| stmts7.go:81:9:81:15 | "early" | stmts7.go:81:3:81:16 | call to panic | | stmts7.go:83:2:83:21 | After defer statement | stmts7.go:84:2:84:14 | expression statement | | stmts7.go:83:2:83:21 | Before defer statement | stmts7.go:83:8:83:21 | call to recoverPanic | | stmts7.go:83:2:83:21 | catch-defer-panic defer statement | stmts7.go:79:1:85:1 | Exceptional Exit | | stmts7.go:83:2:83:21 | defer statement | stmts7.go:83:2:83:21 | After defer statement | -| stmts7.go:83:8:83:19 | After recoverPanic | stmts7.go:83:8:83:21 | After call to recoverPanic | -| stmts7.go:83:8:83:19 | Before recoverPanic | stmts7.go:83:8:83:19 | recoverPanic | -| stmts7.go:83:8:83:19 | recoverPanic | stmts7.go:83:8:83:19 | After recoverPanic | +| stmts7.go:83:8:83:19 | recoverPanic | stmts7.go:83:8:83:21 | After call to recoverPanic | | stmts7.go:83:8:83:21 | After call to recoverPanic | stmts7.go:83:2:83:21 | defer statement | -| stmts7.go:83:8:83:21 | call to recoverPanic | stmts7.go:83:8:83:19 | Before recoverPanic | +| stmts7.go:83:8:83:21 | call to recoverPanic | stmts7.go:83:8:83:19 | recoverPanic | | stmts7.go:83:8:83:21 | defer-invoke call to recoverPanic | stmts7.go:79:40:85:1 | After block statement | | stmts7.go:83:8:83:21 | defer-invoke call to recoverPanic | stmts7.go:83:2:83:21 | catch-defer-panic defer statement | -| stmts7.go:84:2:84:6 | After panic | stmts7.go:84:8:84:13 | Before "late" | -| stmts7.go:84:2:84:6 | Before panic | stmts7.go:84:2:84:6 | panic | -| stmts7.go:84:2:84:6 | panic | stmts7.go:84:2:84:6 | After panic | -| stmts7.go:84:2:84:14 | Before call to panic | stmts7.go:84:2:84:6 | Before panic | +| stmts7.go:84:2:84:6 | panic | stmts7.go:84:8:84:13 | "late" | +| stmts7.go:84:2:84:14 | Before call to panic | stmts7.go:84:2:84:6 | panic | | stmts7.go:84:2:84:14 | call to panic | stmts7.go:84:2:84:14 | catch-panic expression statement | | stmts7.go:84:2:84:14 | catch-panic expression statement | stmts7.go:83:8:83:21 | defer-invoke call to recoverPanic | | stmts7.go:84:2:84:14 | expression statement | stmts7.go:84:2:84:14 | Before call to panic | -| stmts7.go:84:8:84:13 | "late" | stmts7.go:84:8:84:13 | After "late" | -| stmts7.go:84:8:84:13 | After "late" | stmts7.go:84:2:84:14 | call to panic | -| stmts7.go:84:8:84:13 | Before "late" | stmts7.go:84:8:84:13 | "late" | +| stmts7.go:84:8:84:13 | "late" | stmts7.go:84:2:84:14 | call to panic | | stmts8.go:0:0:0:0 | After stmts8.go | stmts8.go:0:0:0:0 | Normal Exit | | stmts8.go:0:0:0:0 | Entry | stmts8.go:0:0:0:0 | stmts8.go | | stmts8.go:0:0:0:0 | Normal Exit | stmts8.go:0:0:0:0 | Exit | @@ -3364,41 +2715,27 @@ | stmts8.go:4:2:4:12 | ... := ... | stmts8.go:4:7:4:12 | Before ...>>... | | stmts8.go:4:2:4:12 | After ... := ... | stmts8.go:5:2:5:13 | ... := ... | | stmts8.go:4:2:4:12 | assign:0 ... := ... | stmts8.go:4:2:4:12 | After ... := ... | -| stmts8.go:4:7:4:7 | After x | stmts8.go:4:12:4:12 | Before 5 | -| stmts8.go:4:7:4:7 | Before x | stmts8.go:4:7:4:7 | x | -| stmts8.go:4:7:4:7 | x | stmts8.go:4:7:4:7 | After x | +| stmts8.go:4:7:4:7 | x | stmts8.go:4:12:4:12 | 5 | | stmts8.go:4:7:4:12 | ...>>... | stmts8.go:4:7:4:12 | After ...>>... | | stmts8.go:4:7:4:12 | After ...>>... | stmts8.go:4:2:4:12 | assign:0 ... := ... | -| stmts8.go:4:7:4:12 | Before ...>>... | stmts8.go:4:7:4:7 | Before x | -| stmts8.go:4:12:4:12 | 5 | stmts8.go:4:12:4:12 | After 5 | -| stmts8.go:4:12:4:12 | After 5 | stmts8.go:4:7:4:12 | ...>>... | -| stmts8.go:4:12:4:12 | Before 5 | stmts8.go:4:12:4:12 | 5 | +| stmts8.go:4:7:4:12 | Before ...>>... | stmts8.go:4:7:4:7 | x | +| stmts8.go:4:12:4:12 | 5 | stmts8.go:4:7:4:12 | ...>>... | | stmts8.go:5:2:5:13 | ... := ... | stmts8.go:5:7:5:13 | Before ...%... | | stmts8.go:5:2:5:13 | After ... := ... | stmts8.go:6:2:6:17 | Before return statement | | stmts8.go:5:2:5:13 | assign:0 ... := ... | stmts8.go:5:2:5:13 | After ... := ... | -| stmts8.go:5:7:5:7 | After x | stmts8.go:5:12:5:12 | Before 1 | -| stmts8.go:5:7:5:7 | Before x | stmts8.go:5:7:5:7 | x | -| stmts8.go:5:7:5:7 | x | stmts8.go:5:7:5:7 | After x | +| stmts8.go:5:7:5:7 | x | stmts8.go:5:12:5:12 | 1 | | stmts8.go:5:7:5:13 | ...%... | stmts8.go:5:7:5:13 | After ...%... | | stmts8.go:5:7:5:13 | After ...%... | stmts8.go:5:2:5:13 | assign:0 ... := ... | -| stmts8.go:5:7:5:13 | Before ...%... | stmts8.go:5:7:5:7 | Before x | -| stmts8.go:5:12:5:12 | 1 | stmts8.go:5:12:5:12 | After 1 | -| stmts8.go:5:12:5:12 | After 1 | stmts8.go:5:7:5:13 | ...%... | -| stmts8.go:5:12:5:12 | Before 1 | stmts8.go:5:12:5:12 | 1 | -| stmts8.go:6:2:6:17 | Before return statement | stmts8.go:6:9:6:9 | Before z | +| stmts8.go:5:7:5:13 | Before ...%... | stmts8.go:5:7:5:7 | x | +| stmts8.go:5:12:5:12 | 1 | stmts8.go:5:7:5:13 | ...%... | +| stmts8.go:6:2:6:17 | Before return statement | stmts8.go:6:9:6:9 | z | | stmts8.go:6:2:6:17 | return statement | stmts8.go:3:1:7:1 | Normal Exit | -| stmts8.go:6:9:6:9 | After z | stmts8.go:6:12:6:17 | Before ...%... | -| stmts8.go:6:9:6:9 | Before z | stmts8.go:6:9:6:9 | z | -| stmts8.go:6:9:6:9 | z | stmts8.go:6:9:6:9 | After z | -| stmts8.go:6:12:6:12 | After y | stmts8.go:6:16:6:17 | Before 13 | -| stmts8.go:6:12:6:12 | Before y | stmts8.go:6:12:6:12 | y | -| stmts8.go:6:12:6:12 | y | stmts8.go:6:12:6:12 | After y | +| stmts8.go:6:9:6:9 | z | stmts8.go:6:12:6:17 | Before ...%... | +| stmts8.go:6:12:6:12 | y | stmts8.go:6:16:6:17 | 13 | | stmts8.go:6:12:6:17 | ...%... | stmts8.go:6:12:6:17 | After ...%... | | stmts8.go:6:12:6:17 | After ...%... | stmts8.go:6:2:6:17 | return statement | -| stmts8.go:6:12:6:17 | Before ...%... | stmts8.go:6:12:6:12 | Before y | -| stmts8.go:6:16:6:17 | 13 | stmts8.go:6:16:6:17 | After 13 | -| stmts8.go:6:16:6:17 | After 13 | stmts8.go:6:12:6:17 | ...%... | -| stmts8.go:6:16:6:17 | Before 13 | stmts8.go:6:16:6:17 | 13 | +| stmts8.go:6:12:6:17 | Before ...%... | stmts8.go:6:12:6:12 | y | +| stmts8.go:6:16:6:17 | 13 | stmts8.go:6:12:6:17 | ...%... | | stmts8.go:9:1:14:1 | After function declaration | stmts8.go:0:0:0:0 | After stmts8.go | | stmts8.go:9:1:14:1 | Before function declaration | stmts8.go:9:1:14:1 | function declaration | | stmts8.go:9:1:14:1 | Entry | stmts8.go:9:21:14:1 | block statement | @@ -3406,23 +2743,18 @@ | stmts8.go:9:1:14:1 | function declaration | stmts8.go:9:1:14:1 | After function declaration | | stmts8.go:9:21:14:1 | block statement | stmts8.go:10:2:12:2 | if statement | | stmts8.go:10:2:12:2 | After if statement | stmts8.go:13:2:13:13 | Before return statement | -| stmts8.go:10:2:12:2 | if statement | stmts8.go:10:5:10:9 | Before linux | +| stmts8.go:10:2:12:2 | if statement | stmts8.go:10:5:10:9 | linux | | stmts8.go:10:5:10:9 | After linux [false] | stmts8.go:10:2:12:2 | After if statement | | stmts8.go:10:5:10:9 | After linux [true] | stmts8.go:10:11:12:2 | block statement | -| stmts8.go:10:5:10:9 | Before linux | stmts8.go:10:5:10:9 | linux | | stmts8.go:10:5:10:9 | linux | stmts8.go:10:5:10:9 | After linux [false] | | stmts8.go:10:5:10:9 | linux | stmts8.go:10:5:10:9 | After linux [true] | | stmts8.go:10:11:12:2 | block statement | stmts8.go:11:3:11:13 | Before return statement | -| stmts8.go:11:3:11:13 | Before return statement | stmts8.go:11:10:11:13 | Before true | +| stmts8.go:11:3:11:13 | Before return statement | stmts8.go:11:10:11:13 | true | | stmts8.go:11:3:11:13 | return statement | stmts8.go:9:1:14:1 | Normal Exit | -| stmts8.go:11:10:11:13 | After true | stmts8.go:11:3:11:13 | return statement | -| stmts8.go:11:10:11:13 | Before true | stmts8.go:11:10:11:13 | true | -| stmts8.go:11:10:11:13 | true | stmts8.go:11:10:11:13 | After true | -| stmts8.go:13:2:13:13 | Before return statement | stmts8.go:13:9:13:13 | Before false | +| stmts8.go:11:10:11:13 | true | stmts8.go:11:3:11:13 | return statement | +| stmts8.go:13:2:13:13 | Before return statement | stmts8.go:13:9:13:13 | false | | stmts8.go:13:2:13:13 | return statement | stmts8.go:9:1:14:1 | Normal Exit | -| stmts8.go:13:9:13:13 | After false | stmts8.go:13:2:13:13 | return statement | -| stmts8.go:13:9:13:13 | Before false | stmts8.go:13:9:13:13 | false | -| stmts8.go:13:9:13:13 | false | stmts8.go:13:9:13:13 | After false | +| stmts8.go:13:9:13:13 | false | stmts8.go:13:2:13:13 | return statement | | stmts.go:0:0:0:0 | After stmts.go | stmts.go:0:0:0:0 | Normal Exit | | stmts.go:0:0:0:0 | Entry | stmts.go:0:0:0:0 | stmts.go | | stmts.go:0:0:0:0 | Normal Exit | stmts.go:0:0:0:0 | Exit | @@ -3441,12 +2773,11 @@ | stmts.go:11:2:18:2 | block statement | stmts.go:12:3:14:3 | if statement | | stmts.go:12:3:14:3 | After if statement | stmts.go:15:3:16:3 | block statement | | stmts.go:12:3:14:3 | if statement | stmts.go:12:6:12:7 | !... | -| stmts.go:12:6:12:7 | !... | stmts.go:12:7:12:7 | Before b | +| stmts.go:12:6:12:7 | !... | stmts.go:12:7:12:7 | b | | stmts.go:12:6:12:7 | After !... [false] | stmts.go:12:3:14:3 | After if statement | | stmts.go:12:6:12:7 | After !... [true] | stmts.go:12:9:14:3 | block statement | | stmts.go:12:7:12:7 | After b [false] | stmts.go:12:6:12:7 | After !... [true] | | stmts.go:12:7:12:7 | After b [true] | stmts.go:12:6:12:7 | After !... [false] | -| stmts.go:12:7:12:7 | Before b | stmts.go:12:7:12:7 | b | | stmts.go:12:7:12:7 | b | stmts.go:12:7:12:7 | After b [false] | | stmts.go:12:7:12:7 | b | stmts.go:12:7:12:7 | After b [true] | | stmts.go:12:9:14:3 | block statement | stmts.go:13:4:13:13 | Before goto statement | @@ -3454,7 +2785,7 @@ | stmts.go:13:4:13:13 | goto statement | stmts.go:22:1:37:2 | labeled statement | | stmts.go:15:3:16:3 | block statement | stmts.go:17:3:17:3 | empty statement | | stmts.go:17:3:17:3 | empty statement | stmts.go:11:2:18:2 | After block statement | -| stmts.go:20:2:20:12 | After selection of Println | stmts.go:20:14:20:17 | Before "Hi" | +| stmts.go:20:2:20:12 | After selection of Println | stmts.go:20:14:20:17 | "Hi" | | stmts.go:20:2:20:12 | Before selection of Println | stmts.go:20:2:20:12 | selection of Println | | stmts.go:20:2:20:12 | selection of Println | stmts.go:20:2:20:12 | After selection of Println | | stmts.go:20:2:20:18 | After call to Println | stmts.go:20:2:20:18 | After expression statement | @@ -3463,127 +2794,94 @@ | stmts.go:20:2:20:18 | call to Println | stmts.go:10:1:43:1 | Exceptional Exit | | stmts.go:20:2:20:18 | call to Println | stmts.go:20:2:20:18 | After call to Println | | stmts.go:20:2:20:18 | expression statement | stmts.go:20:2:20:18 | Before call to Println | -| stmts.go:20:14:20:17 | "Hi" | stmts.go:20:14:20:17 | After "Hi" | -| stmts.go:20:14:20:17 | After "Hi" | stmts.go:20:2:20:18 | call to Println | -| stmts.go:20:14:20:17 | Before "Hi" | stmts.go:20:14:20:17 | "Hi" | +| stmts.go:20:14:20:17 | "Hi" | stmts.go:20:2:20:18 | call to Println | | stmts.go:22:1:37:2 | After labeled statement | stmts.go:39:2:39:7 | ... := ... | | stmts.go:22:1:37:2 | labeled statement | stmts.go:23:2:37:2 | for statement | | stmts.go:23:2:37:2 | After for statement | stmts.go:22:1:37:2 | After labeled statement | -| stmts.go:23:2:37:2 | [LoopHeader] for statement | stmts.go:23:6:23:9 | Before true | -| stmts.go:23:2:37:2 | for statement | stmts.go:23:6:23:9 | Before true | +| stmts.go:23:2:37:2 | [LoopHeader] for statement | stmts.go:23:6:23:9 | true | +| stmts.go:23:2:37:2 | for statement | stmts.go:23:6:23:9 | true | | stmts.go:23:6:23:9 | After true [true] | stmts.go:23:11:37:2 | block statement | -| stmts.go:23:6:23:9 | Before true | stmts.go:23:6:23:9 | true | | stmts.go:23:6:23:9 | true | stmts.go:23:6:23:9 | After true [true] | | stmts.go:23:11:37:2 | After block statement | stmts.go:23:2:37:2 | [LoopHeader] for statement | | stmts.go:23:11:37:2 | block statement | stmts.go:24:3:36:3 | for statement | | stmts.go:24:3:36:3 | After for statement | stmts.go:23:11:37:2 | After block statement | | stmts.go:24:3:36:3 | [LoopHeader] for statement | stmts.go:24:23:24:25 | Before increment statement | | stmts.go:24:3:36:3 | for statement | stmts.go:24:7:24:12 | ... := ... | -| stmts.go:24:7:24:12 | ... := ... | stmts.go:24:12:24:12 | Before 0 | +| stmts.go:24:7:24:12 | ... := ... | stmts.go:24:12:24:12 | 0 | | stmts.go:24:7:24:12 | After ... := ... | stmts.go:24:15:24:20 | Before ...<... | | stmts.go:24:7:24:12 | assign:0 ... := ... | stmts.go:24:7:24:12 | After ... := ... | -| stmts.go:24:12:24:12 | 0 | stmts.go:24:12:24:12 | After 0 | -| stmts.go:24:12:24:12 | After 0 | stmts.go:24:7:24:12 | assign:0 ... := ... | -| stmts.go:24:12:24:12 | Before 0 | stmts.go:24:12:24:12 | 0 | -| stmts.go:24:15:24:15 | After i | stmts.go:24:19:24:20 | Before 10 | -| stmts.go:24:15:24:15 | Before i | stmts.go:24:15:24:15 | i | -| stmts.go:24:15:24:15 | i | stmts.go:24:15:24:15 | After i | +| stmts.go:24:12:24:12 | 0 | stmts.go:24:7:24:12 | assign:0 ... := ... | +| stmts.go:24:15:24:15 | i | stmts.go:24:19:24:20 | 10 | | stmts.go:24:15:24:20 | ...<... | stmts.go:24:15:24:20 | After ...<... [false] | | stmts.go:24:15:24:20 | ...<... | stmts.go:24:15:24:20 | After ...<... [true] | | stmts.go:24:15:24:20 | After ...<... [false] | stmts.go:24:3:36:3 | After for statement | | stmts.go:24:15:24:20 | After ...<... [true] | stmts.go:24:27:36:3 | block statement | -| stmts.go:24:15:24:20 | Before ...<... | stmts.go:24:15:24:15 | Before i | -| stmts.go:24:19:24:20 | 10 | stmts.go:24:19:24:20 | After 10 | -| stmts.go:24:19:24:20 | After 10 | stmts.go:24:15:24:20 | ...<... | -| stmts.go:24:19:24:20 | Before 10 | stmts.go:24:19:24:20 | 10 | -| stmts.go:24:23:24:23 | After i | stmts.go:24:23:24:25 | increment statement | -| stmts.go:24:23:24:23 | Before i | stmts.go:24:23:24:23 | i | -| stmts.go:24:23:24:23 | i | stmts.go:24:23:24:23 | After i | +| stmts.go:24:15:24:20 | Before ...<... | stmts.go:24:15:24:15 | i | +| stmts.go:24:19:24:20 | 10 | stmts.go:24:15:24:20 | ...<... | +| stmts.go:24:23:24:23 | i | stmts.go:24:23:24:25 | increment statement | | stmts.go:24:23:24:25 | After increment statement | stmts.go:24:15:24:20 | Before ...<... | -| stmts.go:24:23:24:25 | Before increment statement | stmts.go:24:23:24:23 | Before i | +| stmts.go:24:23:24:25 | Before increment statement | stmts.go:24:23:24:23 | i | | stmts.go:24:23:24:25 | increment statement | stmts.go:24:23:24:25 | After increment statement | | stmts.go:24:27:36:3 | block statement | stmts.go:25:4:35:4 | if statement | | stmts.go:25:4:35:4 | if statement | stmts.go:25:7:25:16 | ... := ... | | stmts.go:25:7:25:16 | ... := ... | stmts.go:25:12:25:16 | Before ...-... | | stmts.go:25:7:25:16 | After ... := ... | stmts.go:25:19:25:23 | Before ...>... | | stmts.go:25:7:25:16 | assign:0 ... := ... | stmts.go:25:7:25:16 | After ... := ... | -| stmts.go:25:12:25:12 | After i | stmts.go:25:16:25:16 | Before 1 | -| stmts.go:25:12:25:12 | Before i | stmts.go:25:12:25:12 | i | -| stmts.go:25:12:25:12 | i | stmts.go:25:12:25:12 | After i | +| stmts.go:25:12:25:12 | i | stmts.go:25:16:25:16 | 1 | | stmts.go:25:12:25:16 | ...-... | stmts.go:25:12:25:16 | After ...-... | | stmts.go:25:12:25:16 | After ...-... | stmts.go:25:7:25:16 | assign:0 ... := ... | -| stmts.go:25:12:25:16 | Before ...-... | stmts.go:25:12:25:12 | Before i | -| stmts.go:25:16:25:16 | 1 | stmts.go:25:16:25:16 | After 1 | -| stmts.go:25:16:25:16 | After 1 | stmts.go:25:12:25:16 | ...-... | -| stmts.go:25:16:25:16 | Before 1 | stmts.go:25:16:25:16 | 1 | -| stmts.go:25:19:25:19 | After j | stmts.go:25:23:25:23 | Before 5 | -| stmts.go:25:19:25:19 | Before j | stmts.go:25:19:25:19 | j | -| stmts.go:25:19:25:19 | j | stmts.go:25:19:25:19 | After j | +| stmts.go:25:12:25:16 | Before ...-... | stmts.go:25:12:25:12 | i | +| stmts.go:25:16:25:16 | 1 | stmts.go:25:12:25:16 | ...-... | +| stmts.go:25:19:25:19 | j | stmts.go:25:23:25:23 | 5 | | stmts.go:25:19:25:23 | ...>... | stmts.go:25:19:25:23 | After ...>... [false] | | stmts.go:25:19:25:23 | ...>... | stmts.go:25:19:25:23 | After ...>... [true] | | stmts.go:25:19:25:23 | After ...>... [false] | stmts.go:27:11:35:4 | if statement | | stmts.go:25:19:25:23 | After ...>... [true] | stmts.go:25:25:27:4 | block statement | -| stmts.go:25:19:25:23 | Before ...>... | stmts.go:25:19:25:19 | Before j | -| stmts.go:25:23:25:23 | 5 | stmts.go:25:23:25:23 | After 5 | -| stmts.go:25:23:25:23 | After 5 | stmts.go:25:19:25:23 | ...>... | -| stmts.go:25:23:25:23 | Before 5 | stmts.go:25:23:25:23 | 5 | +| stmts.go:25:19:25:23 | Before ...>... | stmts.go:25:19:25:19 | j | +| stmts.go:25:23:25:23 | 5 | stmts.go:25:19:25:23 | ...>... | | stmts.go:25:25:27:4 | block statement | stmts.go:26:5:26:15 | Before break statement | | stmts.go:26:5:26:15 | Before break statement | stmts.go:26:5:26:15 | break statement | | stmts.go:26:5:26:15 | break statement | stmts.go:23:2:37:2 | After for statement | | stmts.go:27:11:35:4 | if statement | stmts.go:27:14:27:18 | Before ...<... | -| stmts.go:27:14:27:14 | After i | stmts.go:27:18:27:18 | Before 3 | -| stmts.go:27:14:27:14 | Before i | stmts.go:27:14:27:14 | i | -| stmts.go:27:14:27:14 | i | stmts.go:27:14:27:14 | After i | +| stmts.go:27:14:27:14 | i | stmts.go:27:18:27:18 | 3 | | stmts.go:27:14:27:18 | ...<... | stmts.go:27:14:27:18 | After ...<... [false] | | stmts.go:27:14:27:18 | ...<... | stmts.go:27:14:27:18 | After ...<... [true] | | stmts.go:27:14:27:18 | After ...<... [false] | stmts.go:29:11:35:4 | if statement | | stmts.go:27:14:27:18 | After ...<... [true] | stmts.go:27:20:29:4 | block statement | -| stmts.go:27:14:27:18 | Before ...<... | stmts.go:27:14:27:14 | Before i | -| stmts.go:27:18:27:18 | 3 | stmts.go:27:18:27:18 | After 3 | -| stmts.go:27:18:27:18 | After 3 | stmts.go:27:14:27:18 | ...<... | -| stmts.go:27:18:27:18 | Before 3 | stmts.go:27:18:27:18 | 3 | +| stmts.go:27:14:27:18 | Before ...<... | stmts.go:27:14:27:14 | i | +| stmts.go:27:18:27:18 | 3 | stmts.go:27:14:27:18 | ...<... | | stmts.go:27:20:29:4 | block statement | stmts.go:28:5:28:9 | Before break statement | | stmts.go:28:5:28:9 | Before break statement | stmts.go:28:5:28:9 | break statement | | stmts.go:28:5:28:9 | break statement | stmts.go:24:3:36:3 | After for statement | | stmts.go:29:11:35:4 | if statement | stmts.go:29:14:29:19 | Before ...!=... | -| stmts.go:29:14:29:14 | After i | stmts.go:29:19:29:19 | Before 9 | -| stmts.go:29:14:29:14 | Before i | stmts.go:29:14:29:14 | i | -| stmts.go:29:14:29:14 | i | stmts.go:29:14:29:14 | After i | +| stmts.go:29:14:29:14 | i | stmts.go:29:19:29:19 | 9 | | stmts.go:29:14:29:19 | ...!=... | stmts.go:29:14:29:19 | After ...!=... [false] | | stmts.go:29:14:29:19 | ...!=... | stmts.go:29:14:29:19 | After ...!=... [true] | | stmts.go:29:14:29:19 | After ...!=... [false] | stmts.go:31:11:35:4 | if statement | | stmts.go:29:14:29:19 | After ...!=... [true] | stmts.go:29:21:31:4 | block statement | -| stmts.go:29:14:29:19 | Before ...!=... | stmts.go:29:14:29:14 | Before i | -| stmts.go:29:19:29:19 | 9 | stmts.go:29:19:29:19 | After 9 | -| stmts.go:29:19:29:19 | After 9 | stmts.go:29:14:29:19 | ...!=... | -| stmts.go:29:19:29:19 | Before 9 | stmts.go:29:19:29:19 | 9 | +| stmts.go:29:14:29:19 | Before ...!=... | stmts.go:29:14:29:14 | i | +| stmts.go:29:19:29:19 | 9 | stmts.go:29:14:29:19 | ...!=... | | stmts.go:29:21:31:4 | block statement | stmts.go:30:5:30:18 | Before continue statement | | stmts.go:30:5:30:18 | Before continue statement | stmts.go:30:5:30:18 | continue statement | | stmts.go:30:5:30:18 | continue statement | stmts.go:23:2:37:2 | [LoopHeader] for statement | | stmts.go:31:11:35:4 | if statement | stmts.go:31:14:31:19 | Before ...>=... | -| stmts.go:31:14:31:14 | After i | stmts.go:31:19:31:19 | Before 4 | -| stmts.go:31:14:31:14 | Before i | stmts.go:31:14:31:14 | i | -| stmts.go:31:14:31:14 | i | stmts.go:31:14:31:14 | After i | +| stmts.go:31:14:31:14 | i | stmts.go:31:19:31:19 | 4 | | stmts.go:31:14:31:19 | ...>=... | stmts.go:31:14:31:19 | After ...>=... [false] | | stmts.go:31:14:31:19 | ...>=... | stmts.go:31:14:31:19 | After ...>=... [true] | | stmts.go:31:14:31:19 | After ...>=... [false] | stmts.go:33:11:35:4 | block statement | | stmts.go:31:14:31:19 | After ...>=... [true] | stmts.go:31:21:33:4 | block statement | -| stmts.go:31:14:31:19 | Before ...>=... | stmts.go:31:14:31:14 | Before i | -| stmts.go:31:19:31:19 | 4 | stmts.go:31:19:31:19 | After 4 | -| stmts.go:31:19:31:19 | After 4 | stmts.go:31:14:31:19 | ...>=... | -| stmts.go:31:19:31:19 | Before 4 | stmts.go:31:19:31:19 | 4 | +| stmts.go:31:14:31:19 | Before ...>=... | stmts.go:31:14:31:14 | i | +| stmts.go:31:19:31:19 | 4 | stmts.go:31:14:31:19 | ...>=... | | stmts.go:31:21:33:4 | block statement | stmts.go:32:5:32:14 | Before goto statement | | stmts.go:32:5:32:14 | Before goto statement | stmts.go:32:5:32:14 | goto statement | | stmts.go:32:5:32:14 | goto statement | stmts.go:22:1:37:2 | labeled statement | | stmts.go:33:11:35:4 | block statement | stmts.go:34:5:34:12 | Before continue statement | | stmts.go:34:5:34:12 | Before continue statement | stmts.go:34:5:34:12 | continue statement | | stmts.go:34:5:34:12 | continue statement | stmts.go:24:3:36:3 | [LoopHeader] for statement | -| stmts.go:39:2:39:7 | ... := ... | stmts.go:39:7:39:7 | Before 9 | +| stmts.go:39:2:39:7 | ... := ... | stmts.go:39:7:39:7 | 9 | | stmts.go:39:2:39:7 | After ... := ... | stmts.go:40:2:42:2 | for statement | | stmts.go:39:2:39:7 | assign:0 ... := ... | stmts.go:39:2:39:7 | After ... := ... | -| stmts.go:39:7:39:7 | 9 | stmts.go:39:7:39:7 | After 9 | -| stmts.go:39:7:39:7 | After 9 | stmts.go:39:2:39:7 | assign:0 ... := ... | -| stmts.go:39:7:39:7 | Before 9 | stmts.go:39:7:39:7 | 9 | +| stmts.go:39:7:39:7 | 9 | stmts.go:39:2:39:7 | assign:0 ... := ... | | stmts.go:40:2:42:2 | for statement | stmts.go:40:14:42:2 | block statement | | stmts.go:40:14:42:2 | block statement | stmts.go:41:3:41:12 | Before goto statement | | stmts.go:41:3:41:12 | Before goto statement | stmts.go:41:3:41:12 | goto statement | @@ -3611,7 +2909,7 @@ | stmts.go:48:6:48:11 | value declaration specifier | stmts.go:48:6:48:11 | zero-init:0 value declaration specifier | | stmts.go:48:6:48:11 | zero-init:0 value declaration specifier | stmts.go:48:6:48:11 | After value declaration specifier | | stmts.go:50:2:59:2 | After select statement | stmts.go:61:2:61:10 | Before select statement | -| stmts.go:50:2:59:2 | Before select statement | stmts.go:51:9:51:11 | Before ch1 | +| stmts.go:50:2:59:2 | Before select statement | stmts.go:51:9:51:11 | ch1 | | stmts.go:50:2:59:2 | select statement | stmts.go:51:2:52:31 | comm clause | | stmts.go:50:2:59:2 | select statement | stmts.go:53:2:55:16 | comm clause | | stmts.go:50:2:59:2 | select statement | stmts.go:56:2:57:15 | comm clause | @@ -3620,10 +2918,8 @@ | stmts.go:51:7:51:11 | <-... | stmts.go:52:3:52:31 | expression statement | | stmts.go:51:7:51:11 | Before <-... | stmts.go:51:7:51:11 | <-... | | stmts.go:51:7:51:11 | expression statement | stmts.go:51:7:51:11 | Before <-... | -| stmts.go:51:9:51:11 | After ch1 | stmts.go:53:19:53:21 | Before ch2 | -| stmts.go:51:9:51:11 | Before ch1 | stmts.go:51:9:51:11 | ch1 | -| stmts.go:51:9:51:11 | ch1 | stmts.go:51:9:51:11 | After ch1 | -| stmts.go:52:3:52:13 | After selection of Println | stmts.go:52:15:52:30 | Before "Heard from ch1" | +| stmts.go:51:9:51:11 | ch1 | stmts.go:53:19:53:21 | ch2 | +| stmts.go:52:3:52:13 | After selection of Println | stmts.go:52:15:52:30 | "Heard from ch1" | | stmts.go:52:3:52:13 | Before selection of Println | stmts.go:52:3:52:13 | selection of Println | | stmts.go:52:3:52:13 | selection of Println | stmts.go:52:3:52:13 | After selection of Println | | stmts.go:52:3:52:31 | After call to Println | stmts.go:52:3:52:31 | After expression statement | @@ -3632,32 +2928,22 @@ | stmts.go:52:3:52:31 | call to Println | stmts.go:46:1:62:1 | Exceptional Exit | | stmts.go:52:3:52:31 | call to Println | stmts.go:52:3:52:31 | After call to Println | | stmts.go:52:3:52:31 | expression statement | stmts.go:52:3:52:31 | Before call to Println | -| stmts.go:52:15:52:30 | "Heard from ch1" | stmts.go:52:15:52:30 | After "Heard from ch1" | -| stmts.go:52:15:52:30 | After "Heard from ch1" | stmts.go:52:3:52:31 | call to Println | -| stmts.go:52:15:52:30 | Before "Heard from ch1" | stmts.go:52:15:52:30 | "Heard from ch1" | +| stmts.go:52:15:52:30 | "Heard from ch1" | stmts.go:52:3:52:31 | call to Println | | stmts.go:53:2:55:16 | comm clause | stmts.go:53:7:53:21 | ... = ... | -| stmts.go:53:7:53:7 | After a | stmts.go:53:9:53:9 | Before 0 | -| stmts.go:53:7:53:7 | Before a | stmts.go:53:7:53:7 | a | -| stmts.go:53:7:53:7 | a | stmts.go:53:7:53:7 | After a | -| stmts.go:53:7:53:10 | After index expression | stmts.go:53:13:53:13 | Before w | -| stmts.go:53:7:53:10 | Before index expression | stmts.go:53:7:53:7 | Before a | +| stmts.go:53:7:53:7 | a | stmts.go:53:9:53:9 | 0 | +| stmts.go:53:7:53:10 | After index expression | stmts.go:53:13:53:13 | w | +| stmts.go:53:7:53:10 | Before index expression | stmts.go:53:7:53:7 | a | | stmts.go:53:7:53:10 | index expression | stmts.go:46:1:62:1 | Exceptional Exit | | stmts.go:53:7:53:10 | index expression | stmts.go:53:7:53:10 | After index expression | | stmts.go:53:7:53:21 | ... = ... | stmts.go:53:17:53:21 | Before <-... | | stmts.go:53:7:53:21 | extract:0 ... = ... | stmts.go:53:7:53:21 | extract:1 ... = ... | | stmts.go:53:7:53:21 | extract:1 ... = ... | stmts.go:54:3:54:16 | expression statement | -| stmts.go:53:9:53:9 | 0 | stmts.go:53:9:53:9 | After 0 | -| stmts.go:53:9:53:9 | After 0 | stmts.go:53:7:53:10 | index expression | -| stmts.go:53:9:53:9 | Before 0 | stmts.go:53:9:53:9 | 0 | -| stmts.go:53:13:53:13 | After w | stmts.go:53:7:53:21 | extract:0 ... = ... | -| stmts.go:53:13:53:13 | Before w | stmts.go:53:13:53:13 | w | -| stmts.go:53:13:53:13 | w | stmts.go:53:13:53:13 | After w | +| stmts.go:53:9:53:9 | 0 | stmts.go:53:7:53:10 | index expression | +| stmts.go:53:13:53:13 | w | stmts.go:53:7:53:21 | extract:0 ... = ... | | stmts.go:53:17:53:21 | <-... | stmts.go:53:7:53:10 | Before index expression | | stmts.go:53:17:53:21 | Before <-... | stmts.go:53:17:53:21 | <-... | -| stmts.go:53:19:53:21 | After ch2 | stmts.go:58:7:58:9 | Before ch1 | -| stmts.go:53:19:53:21 | Before ch2 | stmts.go:53:19:53:21 | ch2 | -| stmts.go:53:19:53:21 | ch2 | stmts.go:53:19:53:21 | After ch2 | -| stmts.go:54:3:54:13 | After selection of Println | stmts.go:54:15:54:15 | Before a | +| stmts.go:53:19:53:21 | ch2 | stmts.go:58:7:58:9 | ch1 | +| stmts.go:54:3:54:13 | After selection of Println | stmts.go:54:15:54:15 | a | | stmts.go:54:3:54:13 | Before selection of Println | stmts.go:54:3:54:13 | selection of Println | | stmts.go:54:3:54:13 | selection of Println | stmts.go:54:3:54:13 | After selection of Println | | stmts.go:54:3:54:16 | After call to Println | stmts.go:54:3:54:16 | After expression statement | @@ -3666,10 +2952,8 @@ | stmts.go:54:3:54:16 | call to Println | stmts.go:46:1:62:1 | Exceptional Exit | | stmts.go:54:3:54:16 | call to Println | stmts.go:54:3:54:16 | After call to Println | | stmts.go:54:3:54:16 | expression statement | stmts.go:54:3:54:16 | Before call to Println | -| stmts.go:54:15:54:15 | After a | stmts.go:54:3:54:16 | call to Println | -| stmts.go:54:15:54:15 | Before a | stmts.go:54:15:54:15 | a | -| stmts.go:54:15:54:15 | a | stmts.go:54:15:54:15 | After a | -| stmts.go:55:3:55:13 | After selection of Println | stmts.go:55:15:55:15 | Before w | +| stmts.go:54:15:54:15 | a | stmts.go:54:3:54:16 | call to Println | +| stmts.go:55:3:55:13 | After selection of Println | stmts.go:55:15:55:15 | w | | stmts.go:55:3:55:13 | Before selection of Println | stmts.go:55:3:55:13 | selection of Println | | stmts.go:55:3:55:13 | selection of Println | stmts.go:55:3:55:13 | After selection of Println | | stmts.go:55:3:55:16 | After call to Println | stmts.go:55:3:55:16 | After expression statement | @@ -3678,9 +2962,7 @@ | stmts.go:55:3:55:16 | call to Println | stmts.go:46:1:62:1 | Exceptional Exit | | stmts.go:55:3:55:16 | call to Println | stmts.go:55:3:55:16 | After call to Println | | stmts.go:55:3:55:16 | expression statement | stmts.go:55:3:55:16 | Before call to Println | -| stmts.go:55:15:55:15 | After w | stmts.go:55:3:55:16 | call to Println | -| stmts.go:55:15:55:15 | Before w | stmts.go:55:15:55:15 | w | -| stmts.go:55:15:55:15 | w | stmts.go:55:15:55:15 | After w | +| stmts.go:55:15:55:15 | w | stmts.go:55:3:55:16 | call to Println | | stmts.go:56:2:57:15 | comm clause | stmts.go:57:3:57:15 | expression statement | | stmts.go:57:3:57:13 | After selection of Println | stmts.go:57:3:57:15 | call to Println | | stmts.go:57:3:57:13 | Before selection of Println | stmts.go:57:3:57:13 | selection of Println | @@ -3692,15 +2974,11 @@ | stmts.go:57:3:57:15 | call to Println | stmts.go:57:3:57:15 | After call to Println | | stmts.go:57:3:57:15 | expression statement | stmts.go:57:3:57:15 | Before call to Println | | stmts.go:58:2:58:16 | comm clause | stmts.go:58:7:58:15 | Before send statement | -| stmts.go:58:7:58:9 | After ch1 | stmts.go:58:14:58:15 | Before 42 | -| stmts.go:58:7:58:9 | Before ch1 | stmts.go:58:7:58:9 | ch1 | -| stmts.go:58:7:58:9 | ch1 | stmts.go:58:7:58:9 | After ch1 | +| stmts.go:58:7:58:9 | ch1 | stmts.go:58:14:58:15 | 42 | | stmts.go:58:7:58:15 | After send statement | stmts.go:50:2:59:2 | After select statement | | stmts.go:58:7:58:15 | Before send statement | stmts.go:58:7:58:15 | send statement | | stmts.go:58:7:58:15 | send statement | stmts.go:58:7:58:15 | After send statement | -| stmts.go:58:14:58:15 | 42 | stmts.go:58:14:58:15 | After 42 | -| stmts.go:58:14:58:15 | After 42 | stmts.go:50:2:59:2 | select statement | -| stmts.go:58:14:58:15 | Before 42 | stmts.go:58:14:58:15 | 42 | +| stmts.go:58:14:58:15 | 42 | stmts.go:50:2:59:2 | select statement | | stmts.go:61:2:61:10 | Before select statement | stmts.go:61:2:61:10 | select statement | | stmts.go:65:1:72:1 | After function declaration | stmts.go:75:1:109:1 | Before function declaration | | stmts.go:65:1:72:1 | Before function declaration | stmts.go:65:1:72:1 | function declaration | @@ -3713,17 +2991,13 @@ | stmts.go:65:23:72:1 | block statement | stmts.go:66:2:70:2 | if statement | | stmts.go:66:2:70:2 | After if statement | stmts.go:71:2:71:10 | Before return statement | | stmts.go:66:2:70:2 | if statement | stmts.go:66:5:66:9 | Before ...>... | -| stmts.go:66:5:66:5 | After x | stmts.go:66:9:66:9 | Before 0 | -| stmts.go:66:5:66:5 | Before x | stmts.go:66:5:66:5 | x | -| stmts.go:66:5:66:5 | x | stmts.go:66:5:66:5 | After x | +| stmts.go:66:5:66:5 | x | stmts.go:66:9:66:9 | 0 | | stmts.go:66:5:66:9 | ...>... | stmts.go:66:5:66:9 | After ...>... [false] | | stmts.go:66:5:66:9 | ...>... | stmts.go:66:5:66:9 | After ...>... [true] | | stmts.go:66:5:66:9 | After ...>... [false] | stmts.go:68:9:70:2 | block statement | | stmts.go:66:5:66:9 | After ...>... [true] | stmts.go:66:11:68:2 | block statement | -| stmts.go:66:5:66:9 | Before ...>... | stmts.go:66:5:66:5 | Before x | -| stmts.go:66:9:66:9 | 0 | stmts.go:66:9:66:9 | After 0 | -| stmts.go:66:9:66:9 | After 0 | stmts.go:66:5:66:9 | ...>... | -| stmts.go:66:9:66:9 | Before 0 | stmts.go:66:9:66:9 | 0 | +| stmts.go:66:5:66:9 | Before ...>... | stmts.go:66:5:66:5 | x | +| stmts.go:66:9:66:9 | 0 | stmts.go:66:5:66:9 | ...>... | | stmts.go:66:11:68:2 | After block statement | stmts.go:66:2:70:2 | After if statement | | stmts.go:66:11:68:2 | block statement | stmts.go:67:3:67:35 | Before defer statement | | stmts.go:67:3:67:35 | After defer statement | stmts.go:66:11:68:2 | After block statement | @@ -3742,7 +3016,7 @@ | stmts.go:67:9:67:35 | function call | stmts.go:67:9:67:33 | Before function literal | | stmts.go:67:16:67:33 | After block statement | stmts.go:67:9:67:33 | Normal Exit | | stmts.go:67:16:67:33 | block statement | stmts.go:67:18:67:31 | expression statement | -| stmts.go:67:18:67:28 | After selection of Println | stmts.go:67:30:67:30 | Before x | +| stmts.go:67:18:67:28 | After selection of Println | stmts.go:67:30:67:30 | x | | stmts.go:67:18:67:28 | Before selection of Println | stmts.go:67:18:67:28 | selection of Println | | stmts.go:67:18:67:28 | selection of Println | stmts.go:67:18:67:28 | After selection of Println | | stmts.go:67:18:67:31 | After call to Println | stmts.go:67:18:67:31 | After expression statement | @@ -3751,9 +3025,7 @@ | stmts.go:67:18:67:31 | call to Println | stmts.go:67:9:67:33 | Exceptional Exit | | stmts.go:67:18:67:31 | call to Println | stmts.go:67:18:67:31 | After call to Println | | stmts.go:67:18:67:31 | expression statement | stmts.go:67:18:67:31 | Before call to Println | -| stmts.go:67:30:67:30 | After x | stmts.go:67:18:67:31 | call to Println | -| stmts.go:67:30:67:30 | Before x | stmts.go:67:30:67:30 | x | -| stmts.go:67:30:67:30 | x | stmts.go:67:30:67:30 | After x | +| stmts.go:67:30:67:30 | x | stmts.go:67:18:67:31 | call to Println | | stmts.go:68:9:70:2 | After block statement | stmts.go:66:2:70:2 | After if statement | | stmts.go:68:9:70:2 | block statement | stmts.go:69:3:69:36 | Before defer statement | | stmts.go:69:3:69:36 | After defer statement | stmts.go:68:9:70:2 | After block statement | @@ -3783,17 +3055,13 @@ | stmts.go:69:18:69:32 | expression statement | stmts.go:69:18:69:32 | Before call to Println | | stmts.go:69:30:69:31 | -... | stmts.go:69:30:69:31 | After -... | | stmts.go:69:30:69:31 | After -... | stmts.go:69:18:69:32 | call to Println | -| stmts.go:69:30:69:31 | Before -... | stmts.go:69:31:69:31 | Before x | -| stmts.go:69:31:69:31 | After x | stmts.go:69:30:69:31 | -... | -| stmts.go:69:31:69:31 | Before x | stmts.go:69:31:69:31 | x | -| stmts.go:69:31:69:31 | x | stmts.go:69:31:69:31 | After x | -| stmts.go:71:2:71:10 | Before return statement | stmts.go:71:9:71:10 | Before 42 | +| stmts.go:69:30:69:31 | Before -... | stmts.go:69:31:69:31 | x | +| stmts.go:69:31:69:31 | x | stmts.go:69:30:69:31 | -... | +| stmts.go:71:2:71:10 | Before return statement | stmts.go:71:9:71:10 | 42 | | stmts.go:71:2:71:10 | catch-return return statement | stmts.go:67:9:67:35 | defer-invoke function call | | stmts.go:71:2:71:10 | catch-return return statement | stmts.go:69:9:69:36 | defer-invoke function call | | stmts.go:71:2:71:10 | return statement | stmts.go:71:2:71:10 | catch-return return statement | -| stmts.go:71:9:71:10 | 42 | stmts.go:71:9:71:10 | After 42 | -| stmts.go:71:9:71:10 | After 42 | stmts.go:71:2:71:10 | return statement | -| stmts.go:71:9:71:10 | Before 42 | stmts.go:71:9:71:10 | 42 | +| stmts.go:71:9:71:10 | 42 | stmts.go:71:2:71:10 | return statement | | stmts.go:75:1:109:1 | After function declaration | stmts.go:112:1:137:1 | Before function declaration | | stmts.go:75:1:109:1 | Before function declaration | stmts.go:75:1:109:1 | function declaration | | stmts.go:75:1:109:1 | Entry | stmts.go:75:12:75:12 | x | @@ -3804,104 +3072,76 @@ | stmts.go:75:19:109:1 | After block statement | stmts.go:75:1:109:1 | Normal Exit | | stmts.go:75:19:109:1 | block statement | stmts.go:76:2:77:2 | expression-switch statement | | stmts.go:76:2:77:2 | After expression-switch statement | stmts.go:79:2:82:2 | expression-switch statement | -| stmts.go:76:2:77:2 | expression-switch statement | stmts.go:76:9:76:9 | Before x | -| stmts.go:76:9:76:9 | After x | stmts.go:76:2:77:2 | After expression-switch statement | -| stmts.go:76:9:76:9 | Before x | stmts.go:76:9:76:9 | x | -| stmts.go:76:9:76:9 | x | stmts.go:76:9:76:9 | After x | +| stmts.go:76:2:77:2 | expression-switch statement | stmts.go:76:9:76:9 | x | +| stmts.go:76:9:76:9 | x | stmts.go:76:2:77:2 | After expression-switch statement | | stmts.go:79:2:82:2 | After expression-switch statement | stmts.go:84:2:88:2 | expression-switch statement | | stmts.go:79:2:82:2 | expression-switch statement | stmts.go:79:9:79:14 | ... := ... | -| stmts.go:79:9:79:14 | ... := ... | stmts.go:79:14:79:14 | Before x | +| stmts.go:79:9:79:14 | ... := ... | stmts.go:79:14:79:14 | x | | stmts.go:79:9:79:14 | After ... := ... | stmts.go:79:17:79:22 | Before ...-... | | stmts.go:79:9:79:14 | assign:0 ... := ... | stmts.go:79:9:79:14 | After ... := ... | -| stmts.go:79:14:79:14 | After x | stmts.go:79:9:79:14 | assign:0 ... := ... | -| stmts.go:79:14:79:14 | Before x | stmts.go:79:14:79:14 | x | -| stmts.go:79:14:79:14 | x | stmts.go:79:14:79:14 | After x | -| stmts.go:79:17:79:17 | After y | stmts.go:79:21:79:22 | Before 19 | -| stmts.go:79:17:79:17 | Before y | stmts.go:79:17:79:17 | y | -| stmts.go:79:17:79:17 | y | stmts.go:79:17:79:17 | After y | +| stmts.go:79:14:79:14 | x | stmts.go:79:9:79:14 | assign:0 ... := ... | +| stmts.go:79:17:79:17 | y | stmts.go:79:21:79:22 | 19 | | stmts.go:79:17:79:22 | ...-... | stmts.go:79:17:79:22 | After ...-... | | stmts.go:79:17:79:22 | After ...-... | stmts.go:80:2:81:14 | case clause | -| stmts.go:79:17:79:22 | Before ...-... | stmts.go:79:17:79:17 | Before y | -| stmts.go:79:21:79:22 | 19 | stmts.go:79:21:79:22 | After 19 | -| stmts.go:79:21:79:22 | After 19 | stmts.go:79:17:79:22 | ...-... | -| stmts.go:79:21:79:22 | Before 19 | stmts.go:79:21:79:22 | 19 | +| stmts.go:79:17:79:22 | Before ...-... | stmts.go:79:17:79:17 | y | +| stmts.go:79:21:79:22 | 19 | stmts.go:79:17:79:22 | ...-... | | stmts.go:80:2:81:14 | After case clause [match] | stmts.go:81:3:81:14 | expression statement | | stmts.go:80:2:81:14 | case clause | stmts.go:80:2:81:14 | After case clause [match] | -| stmts.go:81:3:81:7 | After test5 | stmts.go:81:9:81:13 | Before false | -| stmts.go:81:3:81:7 | Before test5 | stmts.go:81:3:81:7 | test5 | -| stmts.go:81:3:81:7 | test5 | stmts.go:81:3:81:7 | After test5 | +| stmts.go:81:3:81:7 | test5 | stmts.go:81:9:81:13 | false | | stmts.go:81:3:81:14 | After call to test5 | stmts.go:81:3:81:14 | After expression statement | | stmts.go:81:3:81:14 | After expression statement | stmts.go:79:2:82:2 | After expression-switch statement | -| stmts.go:81:3:81:14 | Before call to test5 | stmts.go:81:3:81:7 | Before test5 | +| stmts.go:81:3:81:14 | Before call to test5 | stmts.go:81:3:81:7 | test5 | | stmts.go:81:3:81:14 | call to test5 | stmts.go:75:1:109:1 | Exceptional Exit | | stmts.go:81:3:81:14 | call to test5 | stmts.go:81:3:81:14 | After call to test5 | | stmts.go:81:3:81:14 | expression statement | stmts.go:81:3:81:14 | Before call to test5 | -| stmts.go:81:9:81:13 | After false | stmts.go:81:3:81:14 | call to test5 | -| stmts.go:81:9:81:13 | Before false | stmts.go:81:9:81:13 | false | -| stmts.go:81:9:81:13 | false | stmts.go:81:9:81:13 | After false | +| stmts.go:81:9:81:13 | false | stmts.go:81:3:81:14 | call to test5 | | stmts.go:84:2:88:2 | After expression-switch statement | stmts.go:90:2:96:2 | expression-switch statement | -| stmts.go:84:2:88:2 | expression-switch statement | stmts.go:84:9:84:9 | Before x | -| stmts.go:84:9:84:9 | After x | stmts.go:85:2:85:8 | case clause | -| stmts.go:84:9:84:9 | Before x | stmts.go:84:9:84:9 | x | -| stmts.go:84:9:84:9 | x | stmts.go:84:9:84:9 | After x | +| stmts.go:84:2:88:2 | expression-switch statement | stmts.go:84:9:84:9 | x | +| stmts.go:84:9:84:9 | x | stmts.go:85:2:85:8 | case clause | | stmts.go:85:2:85:8 | After case clause [match] | stmts.go:84:2:88:2 | After expression-switch statement | | stmts.go:85:2:85:8 | After case clause [no-match] | stmts.go:86:2:87:13 | case clause | -| stmts.go:85:2:85:8 | case clause | stmts.go:85:7:85:7 | Before 1 | +| stmts.go:85:2:85:8 | case clause | stmts.go:85:7:85:7 | 1 | | stmts.go:85:7:85:7 | 1 | stmts.go:85:7:85:7 | After 1 [match] | | stmts.go:85:7:85:7 | 1 | stmts.go:85:7:85:7 | After 1 [no-match] | | stmts.go:85:7:85:7 | After 1 [match] | stmts.go:85:2:85:8 | After case clause [match] | | stmts.go:85:7:85:7 | After 1 [no-match] | stmts.go:85:2:85:8 | After case clause [no-match] | -| stmts.go:85:7:85:7 | Before 1 | stmts.go:85:7:85:7 | 1 | | stmts.go:86:2:87:13 | After case clause [match] | stmts.go:87:3:87:13 | expression statement | | stmts.go:86:2:87:13 | After case clause [no-match] | stmts.go:84:2:88:2 | After expression-switch statement | -| stmts.go:86:2:87:13 | case clause | stmts.go:86:7:86:7 | Before 2 | +| stmts.go:86:2:87:13 | case clause | stmts.go:86:7:86:7 | 2 | | stmts.go:86:7:86:7 | 2 | stmts.go:86:7:86:7 | After 2 [match] | | stmts.go:86:7:86:7 | 2 | stmts.go:86:7:86:7 | After 2 [no-match] | | stmts.go:86:7:86:7 | After 2 [match] | stmts.go:86:2:87:13 | After case clause [match] | -| stmts.go:86:7:86:7 | After 2 [no-match] | stmts.go:86:10:86:10 | Before 3 | -| stmts.go:86:7:86:7 | Before 2 | stmts.go:86:7:86:7 | 2 | +| stmts.go:86:7:86:7 | After 2 [no-match] | stmts.go:86:10:86:10 | 3 | | stmts.go:86:10:86:10 | 3 | stmts.go:86:10:86:10 | After 3 [match] | | stmts.go:86:10:86:10 | 3 | stmts.go:86:10:86:10 | After 3 [no-match] | | stmts.go:86:10:86:10 | After 3 [match] | stmts.go:86:2:87:13 | After case clause [match] | | stmts.go:86:10:86:10 | After 3 [no-match] | stmts.go:86:2:87:13 | After case clause [no-match] | -| stmts.go:86:10:86:10 | Before 3 | stmts.go:86:10:86:10 | 3 | -| stmts.go:87:3:87:7 | After test5 | stmts.go:87:9:87:12 | Before true | -| stmts.go:87:3:87:7 | Before test5 | stmts.go:87:3:87:7 | test5 | -| stmts.go:87:3:87:7 | test5 | stmts.go:87:3:87:7 | After test5 | +| stmts.go:87:3:87:7 | test5 | stmts.go:87:9:87:12 | true | | stmts.go:87:3:87:13 | After call to test5 | stmts.go:87:3:87:13 | After expression statement | | stmts.go:87:3:87:13 | After expression statement | stmts.go:84:2:88:2 | After expression-switch statement | -| stmts.go:87:3:87:13 | Before call to test5 | stmts.go:87:3:87:7 | Before test5 | +| stmts.go:87:3:87:13 | Before call to test5 | stmts.go:87:3:87:7 | test5 | | stmts.go:87:3:87:13 | call to test5 | stmts.go:75:1:109:1 | Exceptional Exit | | stmts.go:87:3:87:13 | call to test5 | stmts.go:87:3:87:13 | After call to test5 | | stmts.go:87:3:87:13 | expression statement | stmts.go:87:3:87:13 | Before call to test5 | -| stmts.go:87:9:87:12 | After true | stmts.go:87:3:87:13 | call to test5 | -| stmts.go:87:9:87:12 | Before true | stmts.go:87:9:87:12 | true | -| stmts.go:87:9:87:12 | true | stmts.go:87:9:87:12 | After true | +| stmts.go:87:9:87:12 | true | stmts.go:87:3:87:13 | call to test5 | | stmts.go:90:2:96:2 | After expression-switch statement | stmts.go:98:2:102:2 | expression-switch statement | -| stmts.go:90:2:96:2 | expression-switch statement | stmts.go:90:9:90:9 | Before x | -| stmts.go:90:9:90:9 | After x | stmts.go:91:2:93:13 | case clause | -| stmts.go:90:9:90:9 | Before x | stmts.go:90:9:90:9 | x | -| stmts.go:90:9:90:9 | x | stmts.go:90:9:90:9 | After x | +| stmts.go:90:2:96:2 | expression-switch statement | stmts.go:90:9:90:9 | x | +| stmts.go:90:9:90:9 | x | stmts.go:91:2:93:13 | case clause | | stmts.go:91:2:93:13 | After case clause [match] | stmts.go:92:3:92:14 | expression statement | | stmts.go:91:2:93:13 | After case clause [no-match] | stmts.go:94:2:95:13 | case clause | -| stmts.go:91:2:93:13 | case clause | stmts.go:91:7:91:7 | Before 1 | +| stmts.go:91:2:93:13 | case clause | stmts.go:91:7:91:7 | 1 | | stmts.go:91:7:91:7 | 1 | stmts.go:91:7:91:7 | After 1 [match] | | stmts.go:91:7:91:7 | 1 | stmts.go:91:7:91:7 | After 1 [no-match] | | stmts.go:91:7:91:7 | After 1 [match] | stmts.go:91:2:93:13 | After case clause [match] | | stmts.go:91:7:91:7 | After 1 [no-match] | stmts.go:91:2:93:13 | After case clause [no-match] | -| stmts.go:91:7:91:7 | Before 1 | stmts.go:91:7:91:7 | 1 | -| stmts.go:92:3:92:7 | After test5 | stmts.go:92:9:92:13 | Before false | -| stmts.go:92:3:92:7 | Before test5 | stmts.go:92:3:92:7 | test5 | -| stmts.go:92:3:92:7 | test5 | stmts.go:92:3:92:7 | After test5 | +| stmts.go:92:3:92:7 | test5 | stmts.go:92:9:92:13 | false | | stmts.go:92:3:92:14 | After call to test5 | stmts.go:92:3:92:14 | After expression statement | | stmts.go:92:3:92:14 | After expression statement | stmts.go:93:3:93:13 | fallthrough statement | -| stmts.go:92:3:92:14 | Before call to test5 | stmts.go:92:3:92:7 | Before test5 | +| stmts.go:92:3:92:14 | Before call to test5 | stmts.go:92:3:92:7 | test5 | | stmts.go:92:3:92:14 | call to test5 | stmts.go:75:1:109:1 | Exceptional Exit | | stmts.go:92:3:92:14 | call to test5 | stmts.go:92:3:92:14 | After call to test5 | | stmts.go:92:3:92:14 | expression statement | stmts.go:92:3:92:14 | Before call to test5 | -| stmts.go:92:9:92:13 | After false | stmts.go:92:3:92:14 | call to test5 | -| stmts.go:92:9:92:13 | Before false | stmts.go:92:9:92:13 | false | -| stmts.go:92:9:92:13 | false | stmts.go:92:9:92:13 | After false | +| stmts.go:92:9:92:13 | false | stmts.go:92:3:92:14 | call to test5 | | stmts.go:93:3:93:13 | fallthrough statement | stmts.go:95:3:95:13 | expression statement | | stmts.go:94:2:95:13 | After case clause [match] | stmts.go:95:3:95:13 | expression statement | | stmts.go:94:2:95:13 | After case clause [no-match] | stmts.go:90:2:96:2 | After expression-switch statement | @@ -3911,45 +3151,34 @@ | stmts.go:94:7:94:11 | After ...-... [match] | stmts.go:94:2:95:13 | After case clause [match] | | stmts.go:94:7:94:11 | After ...-... [no-match] | stmts.go:94:2:95:13 | After case clause [no-match] | | stmts.go:94:7:94:11 | Before ...-... | stmts.go:94:7:94:11 | ...-... | -| stmts.go:95:3:95:7 | After test5 | stmts.go:95:9:95:12 | Before true | -| stmts.go:95:3:95:7 | Before test5 | stmts.go:95:3:95:7 | test5 | -| stmts.go:95:3:95:7 | test5 | stmts.go:95:3:95:7 | After test5 | +| stmts.go:95:3:95:7 | test5 | stmts.go:95:9:95:12 | true | | stmts.go:95:3:95:13 | After call to test5 | stmts.go:95:3:95:13 | After expression statement | | stmts.go:95:3:95:13 | After expression statement | stmts.go:90:2:96:2 | After expression-switch statement | -| stmts.go:95:3:95:13 | Before call to test5 | stmts.go:95:3:95:7 | Before test5 | +| stmts.go:95:3:95:13 | Before call to test5 | stmts.go:95:3:95:7 | test5 | | stmts.go:95:3:95:13 | call to test5 | stmts.go:75:1:109:1 | Exceptional Exit | | stmts.go:95:3:95:13 | call to test5 | stmts.go:95:3:95:13 | After call to test5 | | stmts.go:95:3:95:13 | expression statement | stmts.go:95:3:95:13 | Before call to test5 | -| stmts.go:95:9:95:12 | After true | stmts.go:95:3:95:13 | call to test5 | -| stmts.go:95:9:95:12 | Before true | stmts.go:95:9:95:12 | true | -| stmts.go:95:9:95:12 | true | stmts.go:95:9:95:12 | After true | +| stmts.go:95:9:95:12 | true | stmts.go:95:3:95:13 | call to test5 | | stmts.go:98:2:102:2 | After expression-switch statement | stmts.go:104:2:108:2 | expression-switch statement | -| stmts.go:98:2:102:2 | expression-switch statement | stmts.go:98:9:98:9 | Before x | -| stmts.go:98:9:98:9 | After x | stmts.go:100:2:101:13 | case clause | -| stmts.go:98:9:98:9 | Before x | stmts.go:98:9:98:9 | x | -| stmts.go:98:9:98:9 | x | stmts.go:98:9:98:9 | After x | +| stmts.go:98:2:102:2 | expression-switch statement | stmts.go:98:9:98:9 | x | +| stmts.go:98:9:98:9 | x | stmts.go:100:2:101:13 | case clause | | stmts.go:99:2:99:9 | After case clause [match] | stmts.go:98:2:102:2 | After expression-switch statement | | stmts.go:99:2:99:9 | case clause | stmts.go:99:2:99:9 | After case clause [match] | | stmts.go:100:2:101:13 | After case clause [match] | stmts.go:101:3:101:13 | expression statement | | stmts.go:100:2:101:13 | After case clause [no-match] | stmts.go:99:2:99:9 | case clause | -| stmts.go:100:2:101:13 | case clause | stmts.go:100:7:100:7 | Before 2 | +| stmts.go:100:2:101:13 | case clause | stmts.go:100:7:100:7 | 2 | | stmts.go:100:7:100:7 | 2 | stmts.go:100:7:100:7 | After 2 [match] | | stmts.go:100:7:100:7 | 2 | stmts.go:100:7:100:7 | After 2 [no-match] | | stmts.go:100:7:100:7 | After 2 [match] | stmts.go:100:2:101:13 | After case clause [match] | | stmts.go:100:7:100:7 | After 2 [no-match] | stmts.go:100:2:101:13 | After case clause [no-match] | -| stmts.go:100:7:100:7 | Before 2 | stmts.go:100:7:100:7 | 2 | -| stmts.go:101:3:101:7 | After test5 | stmts.go:101:9:101:12 | Before true | -| stmts.go:101:3:101:7 | Before test5 | stmts.go:101:3:101:7 | test5 | -| stmts.go:101:3:101:7 | test5 | stmts.go:101:3:101:7 | After test5 | +| stmts.go:101:3:101:7 | test5 | stmts.go:101:9:101:12 | true | | stmts.go:101:3:101:13 | After call to test5 | stmts.go:101:3:101:13 | After expression statement | | stmts.go:101:3:101:13 | After expression statement | stmts.go:98:2:102:2 | After expression-switch statement | -| stmts.go:101:3:101:13 | Before call to test5 | stmts.go:101:3:101:7 | Before test5 | +| stmts.go:101:3:101:13 | Before call to test5 | stmts.go:101:3:101:7 | test5 | | stmts.go:101:3:101:13 | call to test5 | stmts.go:75:1:109:1 | Exceptional Exit | | stmts.go:101:3:101:13 | call to test5 | stmts.go:101:3:101:13 | After call to test5 | | stmts.go:101:3:101:13 | expression statement | stmts.go:101:3:101:13 | Before call to test5 | -| stmts.go:101:9:101:12 | After true | stmts.go:101:3:101:13 | call to test5 | -| stmts.go:101:9:101:12 | Before true | stmts.go:101:9:101:12 | true | -| stmts.go:101:9:101:12 | true | stmts.go:101:9:101:12 | After true | +| stmts.go:101:9:101:12 | true | stmts.go:101:3:101:13 | call to test5 | | stmts.go:104:2:108:2 | After expression-switch statement | stmts.go:75:19:109:1 | After block statement | | stmts.go:104:2:108:2 | expression-switch statement | stmts.go:107:2:107:11 | case clause | | stmts.go:105:2:106:7 | After case clause [match] | stmts.go:106:3:106:7 | Before break statement | @@ -3958,10 +3187,9 @@ | stmts.go:106:3:106:7 | break statement | stmts.go:104:2:108:2 | After expression-switch statement | | stmts.go:107:2:107:11 | After case clause [match] | stmts.go:104:2:108:2 | After expression-switch statement | | stmts.go:107:2:107:11 | After case clause [no-match] | stmts.go:105:2:106:7 | case clause | -| stmts.go:107:2:107:11 | case clause | stmts.go:107:7:107:10 | Before true | +| stmts.go:107:2:107:11 | case clause | stmts.go:107:7:107:10 | true | | stmts.go:107:7:107:10 | After true [match] | stmts.go:107:2:107:11 | After case clause [match] | | stmts.go:107:7:107:10 | After true [no-match] | stmts.go:107:2:107:11 | After case clause [no-match] | -| stmts.go:107:7:107:10 | Before true | stmts.go:107:7:107:10 | true | | stmts.go:107:7:107:10 | true | stmts.go:107:7:107:10 | After true [match] | | stmts.go:107:7:107:10 | true | stmts.go:107:7:107:10 | After true [no-match] | | stmts.go:112:1:137:1 | After function declaration | stmts.go:140:1:142:1 | Before function declaration | @@ -3975,11 +3203,9 @@ | stmts.go:112:27:137:1 | block statement | stmts.go:113:2:121:2 | type-switch statement | | stmts.go:113:2:121:2 | After type-switch statement | stmts.go:123:2:131:2 | type-switch statement | | stmts.go:113:2:121:2 | type-switch statement | stmts.go:113:14:113:21 | Before type assertion | -| stmts.go:113:14:113:14 | After x | stmts.go:113:14:113:21 | type assertion | -| stmts.go:113:14:113:14 | Before x | stmts.go:113:14:113:14 | x | -| stmts.go:113:14:113:14 | x | stmts.go:113:14:113:14 | After x | +| stmts.go:113:14:113:14 | x | stmts.go:113:14:113:21 | type assertion | | stmts.go:113:14:113:21 | After type assertion | stmts.go:114:2:115:16 | case clause | -| stmts.go:113:14:113:21 | Before type assertion | stmts.go:113:14:113:14 | Before x | +| stmts.go:113:14:113:21 | Before type assertion | stmts.go:113:14:113:14 | x | | stmts.go:113:14:113:21 | type assertion | stmts.go:113:14:113:21 | After type assertion | | stmts.go:114:2:115:16 | After case clause [match] | stmts.go:115:3:115:16 | expression statement | | stmts.go:114:2:115:16 | After case clause [no-match] | stmts.go:116:2:118:14 | case clause | @@ -3992,7 +3218,7 @@ | stmts.go:114:14:114:19 | After string [no-match] | stmts.go:114:2:115:16 | After case clause [no-match] | | stmts.go:114:14:114:19 | string | stmts.go:114:14:114:19 | After string [match] | | stmts.go:114:14:114:19 | string | stmts.go:114:14:114:19 | After string [no-match] | -| stmts.go:115:3:115:13 | After selection of Println | stmts.go:115:15:115:15 | Before y | +| stmts.go:115:3:115:13 | After selection of Println | stmts.go:115:15:115:15 | y | | stmts.go:115:3:115:13 | Before selection of Println | stmts.go:115:3:115:13 | selection of Println | | stmts.go:115:3:115:13 | selection of Println | stmts.go:115:3:115:13 | After selection of Println | | stmts.go:115:3:115:16 | After call to Println | stmts.go:115:3:115:16 | After expression statement | @@ -4001,9 +3227,7 @@ | stmts.go:115:3:115:16 | call to Println | stmts.go:112:1:137:1 | Exceptional Exit | | stmts.go:115:3:115:16 | call to Println | stmts.go:115:3:115:16 | After call to Println | | stmts.go:115:3:115:16 | expression statement | stmts.go:115:3:115:16 | Before call to Println | -| stmts.go:115:15:115:15 | After y | stmts.go:115:3:115:16 | call to Println | -| stmts.go:115:15:115:15 | Before y | stmts.go:115:15:115:15 | y | -| stmts.go:115:15:115:15 | y | stmts.go:115:15:115:15 | After y | +| stmts.go:115:15:115:15 | y | stmts.go:115:3:115:16 | call to Println | | stmts.go:116:2:118:14 | After case clause [match] | stmts.go:117:3:117:13 | expression statement | | stmts.go:116:2:118:14 | After case clause [no-match] | stmts.go:119:2:120:7 | case clause | | stmts.go:116:2:118:14 | case clause | stmts.go:116:7:116:13 | float32 | @@ -4011,50 +3235,36 @@ | stmts.go:116:7:116:13 | After float32 [no-match] | stmts.go:116:2:118:14 | After case clause [no-match] | | stmts.go:116:7:116:13 | float32 | stmts.go:116:7:116:13 | After float32 [match] | | stmts.go:116:7:116:13 | float32 | stmts.go:116:7:116:13 | After float32 [no-match] | -| stmts.go:117:3:117:7 | After test5 | stmts.go:117:9:117:12 | Before true | -| stmts.go:117:3:117:7 | Before test5 | stmts.go:117:3:117:7 | test5 | -| stmts.go:117:3:117:7 | test5 | stmts.go:117:3:117:7 | After test5 | +| stmts.go:117:3:117:7 | test5 | stmts.go:117:9:117:12 | true | | stmts.go:117:3:117:13 | After call to test5 | stmts.go:117:3:117:13 | After expression statement | | stmts.go:117:3:117:13 | After expression statement | stmts.go:118:3:118:14 | expression statement | -| stmts.go:117:3:117:13 | Before call to test5 | stmts.go:117:3:117:7 | Before test5 | +| stmts.go:117:3:117:13 | Before call to test5 | stmts.go:117:3:117:7 | test5 | | stmts.go:117:3:117:13 | call to test5 | stmts.go:112:1:137:1 | Exceptional Exit | | stmts.go:117:3:117:13 | call to test5 | stmts.go:117:3:117:13 | After call to test5 | | stmts.go:117:3:117:13 | expression statement | stmts.go:117:3:117:13 | Before call to test5 | -| stmts.go:117:9:117:12 | After true | stmts.go:117:3:117:13 | call to test5 | -| stmts.go:117:9:117:12 | Before true | stmts.go:117:9:117:12 | true | -| stmts.go:117:9:117:12 | true | stmts.go:117:9:117:12 | After true | -| stmts.go:118:3:118:7 | After test5 | stmts.go:118:9:118:13 | Before false | -| stmts.go:118:3:118:7 | Before test5 | stmts.go:118:3:118:7 | test5 | -| stmts.go:118:3:118:7 | test5 | stmts.go:118:3:118:7 | After test5 | +| stmts.go:117:9:117:12 | true | stmts.go:117:3:117:13 | call to test5 | +| stmts.go:118:3:118:7 | test5 | stmts.go:118:9:118:13 | false | | stmts.go:118:3:118:14 | After call to test5 | stmts.go:118:3:118:14 | After expression statement | | stmts.go:118:3:118:14 | After expression statement | stmts.go:113:2:121:2 | After type-switch statement | -| stmts.go:118:3:118:14 | Before call to test5 | stmts.go:118:3:118:7 | Before test5 | +| stmts.go:118:3:118:14 | Before call to test5 | stmts.go:118:3:118:7 | test5 | | stmts.go:118:3:118:14 | call to test5 | stmts.go:112:1:137:1 | Exceptional Exit | | stmts.go:118:3:118:14 | call to test5 | stmts.go:118:3:118:14 | After call to test5 | | stmts.go:118:3:118:14 | expression statement | stmts.go:118:3:118:14 | Before call to test5 | -| stmts.go:118:9:118:13 | After false | stmts.go:118:3:118:14 | call to test5 | -| stmts.go:118:9:118:13 | Before false | stmts.go:118:9:118:13 | false | -| stmts.go:118:9:118:13 | false | stmts.go:118:9:118:13 | After false | +| stmts.go:118:9:118:13 | false | stmts.go:118:3:118:14 | call to test5 | | stmts.go:119:2:120:7 | After case clause [match] | stmts.go:120:3:120:7 | ... = ... | | stmts.go:119:2:120:7 | case clause | stmts.go:119:2:120:7 | After case clause [match] | -| stmts.go:120:3:120:7 | ... = ... | stmts.go:120:7:120:7 | Before y | +| stmts.go:120:3:120:7 | ... = ... | stmts.go:120:7:120:7 | y | | stmts.go:120:3:120:7 | After ... = ... | stmts.go:113:2:121:2 | After type-switch statement | -| stmts.go:120:7:120:7 | After y | stmts.go:120:3:120:7 | After ... = ... | -| stmts.go:120:7:120:7 | Before y | stmts.go:120:7:120:7 | y | -| stmts.go:120:7:120:7 | y | stmts.go:120:7:120:7 | After y | +| stmts.go:120:7:120:7 | y | stmts.go:120:3:120:7 | After ... = ... | | stmts.go:123:2:131:2 | After type-switch statement | stmts.go:133:2:136:2 | type-switch statement | | stmts.go:123:2:131:2 | type-switch statement | stmts.go:123:9:123:14 | ... := ... | -| stmts.go:123:9:123:14 | ... := ... | stmts.go:123:14:123:14 | Before x | +| stmts.go:123:9:123:14 | ... := ... | stmts.go:123:14:123:14 | x | | stmts.go:123:9:123:14 | After ... := ... | stmts.go:123:17:123:24 | Before type assertion | | stmts.go:123:9:123:14 | assign:0 ... := ... | stmts.go:123:9:123:14 | After ... := ... | -| stmts.go:123:14:123:14 | After x | stmts.go:123:9:123:14 | assign:0 ... := ... | -| stmts.go:123:14:123:14 | Before x | stmts.go:123:14:123:14 | x | -| stmts.go:123:14:123:14 | x | stmts.go:123:14:123:14 | After x | -| stmts.go:123:17:123:17 | After y | stmts.go:123:17:123:24 | type assertion | -| stmts.go:123:17:123:17 | Before y | stmts.go:123:17:123:17 | y | -| stmts.go:123:17:123:17 | y | stmts.go:123:17:123:17 | After y | +| stmts.go:123:14:123:14 | x | stmts.go:123:9:123:14 | assign:0 ... := ... | +| stmts.go:123:17:123:17 | y | stmts.go:123:17:123:24 | type assertion | | stmts.go:123:17:123:24 | After type assertion | stmts.go:124:2:125:16 | case clause | -| stmts.go:123:17:123:24 | Before type assertion | stmts.go:123:17:123:17 | Before y | +| stmts.go:123:17:123:24 | Before type assertion | stmts.go:123:17:123:17 | y | | stmts.go:123:17:123:24 | type assertion | stmts.go:123:17:123:24 | After type assertion | | stmts.go:124:2:125:16 | After case clause [match] | stmts.go:125:3:125:16 | expression statement | | stmts.go:124:2:125:16 | After case clause [no-match] | stmts.go:126:2:128:14 | case clause | @@ -4067,7 +3277,7 @@ | stmts.go:124:14:124:19 | After string [no-match] | stmts.go:124:2:125:16 | After case clause [no-match] | | stmts.go:124:14:124:19 | string | stmts.go:124:14:124:19 | After string [match] | | stmts.go:124:14:124:19 | string | stmts.go:124:14:124:19 | After string [no-match] | -| stmts.go:125:3:125:13 | After selection of Println | stmts.go:125:15:125:15 | Before y | +| stmts.go:125:3:125:13 | After selection of Println | stmts.go:125:15:125:15 | y | | stmts.go:125:3:125:13 | Before selection of Println | stmts.go:125:3:125:13 | selection of Println | | stmts.go:125:3:125:13 | selection of Println | stmts.go:125:3:125:13 | After selection of Println | | stmts.go:125:3:125:16 | After call to Println | stmts.go:125:3:125:16 | After expression statement | @@ -4076,9 +3286,7 @@ | stmts.go:125:3:125:16 | call to Println | stmts.go:112:1:137:1 | Exceptional Exit | | stmts.go:125:3:125:16 | call to Println | stmts.go:125:3:125:16 | After call to Println | | stmts.go:125:3:125:16 | expression statement | stmts.go:125:3:125:16 | Before call to Println | -| stmts.go:125:15:125:15 | After y | stmts.go:125:3:125:16 | call to Println | -| stmts.go:125:15:125:15 | Before y | stmts.go:125:15:125:15 | y | -| stmts.go:125:15:125:15 | y | stmts.go:125:15:125:15 | After y | +| stmts.go:125:15:125:15 | y | stmts.go:125:3:125:16 | call to Println | | stmts.go:126:2:128:14 | After case clause [match] | stmts.go:127:3:127:13 | expression statement | | stmts.go:126:2:128:14 | After case clause [no-match] | stmts.go:129:2:130:7 | case clause | | stmts.go:126:2:128:14 | case clause | stmts.go:126:7:126:13 | float32 | @@ -4086,65 +3294,47 @@ | stmts.go:126:7:126:13 | After float32 [no-match] | stmts.go:126:2:128:14 | After case clause [no-match] | | stmts.go:126:7:126:13 | float32 | stmts.go:126:7:126:13 | After float32 [match] | | stmts.go:126:7:126:13 | float32 | stmts.go:126:7:126:13 | After float32 [no-match] | -| stmts.go:127:3:127:7 | After test5 | stmts.go:127:9:127:12 | Before true | -| stmts.go:127:3:127:7 | Before test5 | stmts.go:127:3:127:7 | test5 | -| stmts.go:127:3:127:7 | test5 | stmts.go:127:3:127:7 | After test5 | +| stmts.go:127:3:127:7 | test5 | stmts.go:127:9:127:12 | true | | stmts.go:127:3:127:13 | After call to test5 | stmts.go:127:3:127:13 | After expression statement | | stmts.go:127:3:127:13 | After expression statement | stmts.go:128:3:128:14 | expression statement | -| stmts.go:127:3:127:13 | Before call to test5 | stmts.go:127:3:127:7 | Before test5 | +| stmts.go:127:3:127:13 | Before call to test5 | stmts.go:127:3:127:7 | test5 | | stmts.go:127:3:127:13 | call to test5 | stmts.go:112:1:137:1 | Exceptional Exit | | stmts.go:127:3:127:13 | call to test5 | stmts.go:127:3:127:13 | After call to test5 | | stmts.go:127:3:127:13 | expression statement | stmts.go:127:3:127:13 | Before call to test5 | -| stmts.go:127:9:127:12 | After true | stmts.go:127:3:127:13 | call to test5 | -| stmts.go:127:9:127:12 | Before true | stmts.go:127:9:127:12 | true | -| stmts.go:127:9:127:12 | true | stmts.go:127:9:127:12 | After true | -| stmts.go:128:3:128:7 | After test5 | stmts.go:128:9:128:13 | Before false | -| stmts.go:128:3:128:7 | Before test5 | stmts.go:128:3:128:7 | test5 | -| stmts.go:128:3:128:7 | test5 | stmts.go:128:3:128:7 | After test5 | +| stmts.go:127:9:127:12 | true | stmts.go:127:3:127:13 | call to test5 | +| stmts.go:128:3:128:7 | test5 | stmts.go:128:9:128:13 | false | | stmts.go:128:3:128:14 | After call to test5 | stmts.go:128:3:128:14 | After expression statement | | stmts.go:128:3:128:14 | After expression statement | stmts.go:123:2:131:2 | After type-switch statement | -| stmts.go:128:3:128:14 | Before call to test5 | stmts.go:128:3:128:7 | Before test5 | +| stmts.go:128:3:128:14 | Before call to test5 | stmts.go:128:3:128:7 | test5 | | stmts.go:128:3:128:14 | call to test5 | stmts.go:112:1:137:1 | Exceptional Exit | | stmts.go:128:3:128:14 | call to test5 | stmts.go:128:3:128:14 | After call to test5 | | stmts.go:128:3:128:14 | expression statement | stmts.go:128:3:128:14 | Before call to test5 | -| stmts.go:128:9:128:13 | After false | stmts.go:128:3:128:14 | call to test5 | -| stmts.go:128:9:128:13 | Before false | stmts.go:128:9:128:13 | false | -| stmts.go:128:9:128:13 | false | stmts.go:128:9:128:13 | After false | +| stmts.go:128:9:128:13 | false | stmts.go:128:3:128:14 | call to test5 | | stmts.go:129:2:130:7 | After case clause [match] | stmts.go:130:3:130:7 | ... = ... | | stmts.go:129:2:130:7 | case clause | stmts.go:129:2:130:7 | After case clause [match] | -| stmts.go:130:3:130:7 | ... = ... | stmts.go:130:7:130:7 | Before y | +| stmts.go:130:3:130:7 | ... = ... | stmts.go:130:7:130:7 | y | | stmts.go:130:3:130:7 | After ... = ... | stmts.go:123:2:131:2 | After type-switch statement | -| stmts.go:130:7:130:7 | After y | stmts.go:130:3:130:7 | After ... = ... | -| stmts.go:130:7:130:7 | Before y | stmts.go:130:7:130:7 | y | -| stmts.go:130:7:130:7 | y | stmts.go:130:7:130:7 | After y | +| stmts.go:130:7:130:7 | y | stmts.go:130:3:130:7 | After ... = ... | | stmts.go:133:2:136:2 | After type-switch statement | stmts.go:112:27:137:1 | After block statement | | stmts.go:133:2:136:2 | type-switch statement | stmts.go:133:9:133:14 | ... := ... | -| stmts.go:133:9:133:14 | ... := ... | stmts.go:133:14:133:14 | Before x | +| stmts.go:133:9:133:14 | ... := ... | stmts.go:133:14:133:14 | x | | stmts.go:133:9:133:14 | After ... := ... | stmts.go:133:17:133:24 | Before type assertion | | stmts.go:133:9:133:14 | assign:0 ... := ... | stmts.go:133:9:133:14 | After ... := ... | -| stmts.go:133:14:133:14 | After x | stmts.go:133:9:133:14 | assign:0 ... := ... | -| stmts.go:133:14:133:14 | Before x | stmts.go:133:14:133:14 | x | -| stmts.go:133:14:133:14 | x | stmts.go:133:14:133:14 | After x | -| stmts.go:133:17:133:17 | After y | stmts.go:133:17:133:24 | type assertion | -| stmts.go:133:17:133:17 | Before y | stmts.go:133:17:133:17 | y | -| stmts.go:133:17:133:17 | y | stmts.go:133:17:133:17 | After y | +| stmts.go:133:14:133:14 | x | stmts.go:133:9:133:14 | assign:0 ... := ... | +| stmts.go:133:17:133:17 | y | stmts.go:133:17:133:24 | type assertion | | stmts.go:133:17:133:24 | After type assertion | stmts.go:134:2:135:14 | case clause | -| stmts.go:133:17:133:24 | Before type assertion | stmts.go:133:17:133:17 | Before y | +| stmts.go:133:17:133:24 | Before type assertion | stmts.go:133:17:133:17 | y | | stmts.go:133:17:133:24 | type assertion | stmts.go:133:17:133:24 | After type assertion | | stmts.go:134:2:135:14 | After case clause [match] | stmts.go:135:3:135:14 | expression statement | | stmts.go:134:2:135:14 | case clause | stmts.go:134:2:135:14 | After case clause [match] | -| stmts.go:135:3:135:7 | After test5 | stmts.go:135:9:135:13 | Before false | -| stmts.go:135:3:135:7 | Before test5 | stmts.go:135:3:135:7 | test5 | -| stmts.go:135:3:135:7 | test5 | stmts.go:135:3:135:7 | After test5 | +| stmts.go:135:3:135:7 | test5 | stmts.go:135:9:135:13 | false | | stmts.go:135:3:135:14 | After call to test5 | stmts.go:135:3:135:14 | After expression statement | | stmts.go:135:3:135:14 | After expression statement | stmts.go:133:2:136:2 | After type-switch statement | -| stmts.go:135:3:135:14 | Before call to test5 | stmts.go:135:3:135:7 | Before test5 | +| stmts.go:135:3:135:14 | Before call to test5 | stmts.go:135:3:135:7 | test5 | | stmts.go:135:3:135:14 | call to test5 | stmts.go:112:1:137:1 | Exceptional Exit | | stmts.go:135:3:135:14 | call to test5 | stmts.go:135:3:135:14 | After call to test5 | | stmts.go:135:3:135:14 | expression statement | stmts.go:135:3:135:14 | Before call to test5 | -| stmts.go:135:9:135:13 | After false | stmts.go:135:3:135:14 | call to test5 | -| stmts.go:135:9:135:13 | Before false | stmts.go:135:9:135:13 | false | -| stmts.go:135:9:135:13 | false | stmts.go:135:9:135:13 | After false | +| stmts.go:135:9:135:13 | false | stmts.go:135:3:135:14 | call to test5 | | stmts.go:140:1:142:1 | After function declaration | stmts.go:145:1:159:1 | Before function declaration | | stmts.go:140:1:142:1 | Before function declaration | stmts.go:140:1:142:1 | function declaration | | stmts.go:140:1:142:1 | Entry | stmts.go:140:13:140:13 | f | @@ -4157,11 +3347,9 @@ | stmts.go:141:2:141:7 | After go statement | stmts.go:140:23:142:1 | After block statement | | stmts.go:141:2:141:7 | Before go statement | stmts.go:141:5:141:7 | Before call to f | | stmts.go:141:2:141:7 | go statement | stmts.go:141:2:141:7 | After go statement | -| stmts.go:141:5:141:5 | After f | stmts.go:141:5:141:7 | call to f | -| stmts.go:141:5:141:5 | Before f | stmts.go:141:5:141:5 | f | -| stmts.go:141:5:141:5 | f | stmts.go:141:5:141:5 | After f | +| stmts.go:141:5:141:5 | f | stmts.go:141:5:141:7 | call to f | | stmts.go:141:5:141:7 | After call to f | stmts.go:141:2:141:7 | go statement | -| stmts.go:141:5:141:7 | Before call to f | stmts.go:141:5:141:5 | Before f | +| stmts.go:141:5:141:7 | Before call to f | stmts.go:141:5:141:5 | f | | stmts.go:141:5:141:7 | call to f | stmts.go:140:1:142:1 | Exceptional Exit | | stmts.go:141:5:141:7 | call to f | stmts.go:141:5:141:7 | After call to f | | stmts.go:145:1:159:1 | After function declaration | stmts.go:0:0:0:0 | After stmts.go | @@ -4180,31 +3368,26 @@ | stmts.go:146:2:151:2 | extract:0 range element | stmts.go:146:2:151:2 | After range element | | stmts.go:146:2:151:2 | next range element | stmts.go:146:2:151:2 | extract:0 range element | | stmts.go:146:2:151:2 | range element | stmts.go:146:2:151:2 | next range element | -| stmts.go:146:2:151:2 | range statement | stmts.go:146:17:146:18 | Before xs | +| stmts.go:146:2:151:2 | range statement | stmts.go:146:17:146:18 | xs | | stmts.go:146:17:146:18 | After xs [empty] | stmts.go:146:2:151:2 | After range statement | | stmts.go:146:17:146:18 | After xs [non-empty] | stmts.go:146:2:151:2 | range element | -| stmts.go:146:17:146:18 | Before xs | stmts.go:146:17:146:18 | xs | | stmts.go:146:17:146:18 | xs | stmts.go:146:17:146:18 | After xs [empty] | | stmts.go:146:17:146:18 | xs | stmts.go:146:17:146:18 | After xs [non-empty] | | stmts.go:146:20:151:2 | After block statement | stmts.go:146:2:151:2 | [LoopHeader] range statement | | stmts.go:146:20:151:2 | block statement | stmts.go:147:3:149:3 | if statement | | stmts.go:147:3:149:3 | After if statement | stmts.go:150:3:150:14 | expression statement | | stmts.go:147:3:149:3 | if statement | stmts.go:147:6:147:10 | Before ...>... | -| stmts.go:147:6:147:6 | After x | stmts.go:147:10:147:10 | Before 5 | -| stmts.go:147:6:147:6 | Before x | stmts.go:147:6:147:6 | x | -| stmts.go:147:6:147:6 | x | stmts.go:147:6:147:6 | After x | +| stmts.go:147:6:147:6 | x | stmts.go:147:10:147:10 | 5 | | stmts.go:147:6:147:10 | ...>... | stmts.go:147:6:147:10 | After ...>... [false] | | stmts.go:147:6:147:10 | ...>... | stmts.go:147:6:147:10 | After ...>... [true] | | stmts.go:147:6:147:10 | After ...>... [false] | stmts.go:147:3:149:3 | After if statement | | stmts.go:147:6:147:10 | After ...>... [true] | stmts.go:147:12:149:3 | block statement | -| stmts.go:147:6:147:10 | Before ...>... | stmts.go:147:6:147:6 | Before x | -| stmts.go:147:10:147:10 | 5 | stmts.go:147:10:147:10 | After 5 | -| stmts.go:147:10:147:10 | After 5 | stmts.go:147:6:147:10 | ...>... | -| stmts.go:147:10:147:10 | Before 5 | stmts.go:147:10:147:10 | 5 | +| stmts.go:147:6:147:10 | Before ...>... | stmts.go:147:6:147:6 | x | +| stmts.go:147:10:147:10 | 5 | stmts.go:147:6:147:10 | ...>... | | stmts.go:147:12:149:3 | block statement | stmts.go:148:4:148:11 | Before continue statement | | stmts.go:148:4:148:11 | Before continue statement | stmts.go:148:4:148:11 | continue statement | | stmts.go:148:4:148:11 | continue statement | stmts.go:146:2:151:2 | [LoopHeader] range statement | -| stmts.go:150:3:150:11 | After selection of Print | stmts.go:150:13:150:13 | Before x | +| stmts.go:150:3:150:11 | After selection of Print | stmts.go:150:13:150:13 | x | | stmts.go:150:3:150:11 | Before selection of Print | stmts.go:150:3:150:11 | selection of Print | | stmts.go:150:3:150:11 | selection of Print | stmts.go:150:3:150:11 | After selection of Print | | stmts.go:150:3:150:14 | After call to Print | stmts.go:150:3:150:14 | After expression statement | @@ -4213,9 +3396,7 @@ | stmts.go:150:3:150:14 | call to Print | stmts.go:145:1:159:1 | Exceptional Exit | | stmts.go:150:3:150:14 | call to Print | stmts.go:150:3:150:14 | After call to Print | | stmts.go:150:3:150:14 | expression statement | stmts.go:150:3:150:14 | Before call to Print | -| stmts.go:150:13:150:13 | After x | stmts.go:150:3:150:14 | call to Print | -| stmts.go:150:13:150:13 | Before x | stmts.go:150:13:150:13 | x | -| stmts.go:150:13:150:13 | x | stmts.go:150:13:150:13 | After x | +| stmts.go:150:13:150:13 | x | stmts.go:150:3:150:14 | call to Print | | stmts.go:153:2:155:2 | After range element | stmts.go:153:23:155:2 | block statement | | stmts.go:153:2:155:2 | After range statement | stmts.go:157:2:158:2 | range statement | | stmts.go:153:2:155:2 | [LoopHeader] range statement | stmts.go:153:2:155:2 | After range statement | @@ -4224,15 +3405,14 @@ | stmts.go:153:2:155:2 | extract:1 range element | stmts.go:153:2:155:2 | After range element | | stmts.go:153:2:155:2 | next range element | stmts.go:153:2:155:2 | extract:0 range element | | stmts.go:153:2:155:2 | range element | stmts.go:153:2:155:2 | next range element | -| stmts.go:153:2:155:2 | range statement | stmts.go:153:20:153:21 | Before xs | +| stmts.go:153:2:155:2 | range statement | stmts.go:153:20:153:21 | xs | | stmts.go:153:20:153:21 | After xs [empty] | stmts.go:153:2:155:2 | After range statement | | stmts.go:153:20:153:21 | After xs [non-empty] | stmts.go:153:2:155:2 | range element | -| stmts.go:153:20:153:21 | Before xs | stmts.go:153:20:153:21 | xs | | stmts.go:153:20:153:21 | xs | stmts.go:153:20:153:21 | After xs [empty] | | stmts.go:153:20:153:21 | xs | stmts.go:153:20:153:21 | After xs [non-empty] | | stmts.go:153:23:155:2 | After block statement | stmts.go:153:2:155:2 | [LoopHeader] range statement | | stmts.go:153:23:155:2 | block statement | stmts.go:154:3:154:17 | expression statement | -| stmts.go:154:3:154:11 | After selection of Print | stmts.go:154:13:154:13 | Before i | +| stmts.go:154:3:154:11 | After selection of Print | stmts.go:154:13:154:13 | i | | stmts.go:154:3:154:11 | Before selection of Print | stmts.go:154:3:154:11 | selection of Print | | stmts.go:154:3:154:11 | selection of Print | stmts.go:154:3:154:11 | After selection of Print | | stmts.go:154:3:154:17 | After call to Print | stmts.go:154:3:154:17 | After expression statement | @@ -4241,22 +3421,17 @@ | stmts.go:154:3:154:17 | call to Print | stmts.go:145:1:159:1 | Exceptional Exit | | stmts.go:154:3:154:17 | call to Print | stmts.go:154:3:154:17 | After call to Print | | stmts.go:154:3:154:17 | expression statement | stmts.go:154:3:154:17 | Before call to Print | -| stmts.go:154:13:154:13 | After i | stmts.go:154:16:154:16 | Before v | -| stmts.go:154:13:154:13 | Before i | stmts.go:154:13:154:13 | i | -| stmts.go:154:13:154:13 | i | stmts.go:154:13:154:13 | After i | -| stmts.go:154:16:154:16 | After v | stmts.go:154:3:154:17 | call to Print | -| stmts.go:154:16:154:16 | Before v | stmts.go:154:16:154:16 | v | -| stmts.go:154:16:154:16 | v | stmts.go:154:16:154:16 | After v | +| stmts.go:154:13:154:13 | i | stmts.go:154:16:154:16 | v | +| stmts.go:154:16:154:16 | v | stmts.go:154:3:154:17 | call to Print | | stmts.go:157:2:158:2 | After range element | stmts.go:157:15:158:2 | block statement | | stmts.go:157:2:158:2 | After range statement | stmts.go:145:23:159:1 | After block statement | | stmts.go:157:2:158:2 | [LoopHeader] range statement | stmts.go:157:2:158:2 | After range statement | | stmts.go:157:2:158:2 | [LoopHeader] range statement | stmts.go:157:2:158:2 | range element | | stmts.go:157:2:158:2 | next range element | stmts.go:157:2:158:2 | After range element | | stmts.go:157:2:158:2 | range element | stmts.go:157:2:158:2 | next range element | -| stmts.go:157:2:158:2 | range statement | stmts.go:157:12:157:13 | Before xs | +| stmts.go:157:2:158:2 | range statement | stmts.go:157:12:157:13 | xs | | stmts.go:157:12:157:13 | After xs [empty] | stmts.go:157:2:158:2 | After range statement | | stmts.go:157:12:157:13 | After xs [non-empty] | stmts.go:157:2:158:2 | range element | -| stmts.go:157:12:157:13 | Before xs | stmts.go:157:12:157:13 | xs | | stmts.go:157:12:157:13 | xs | stmts.go:157:12:157:13 | After xs [empty] | | stmts.go:157:12:157:13 | xs | stmts.go:157:12:157:13 | After xs [non-empty] | | stmts.go:157:15:158:2 | block statement | stmts.go:157:2:158:2 | [LoopHeader] range statement | @@ -4277,45 +3452,33 @@ | tst.go:5:2:5:13 | After case clause [match] | tst.go:4:2:11:2 | After expression-switch statement | | tst.go:5:2:5:13 | After case clause [no-match] | tst.go:7:2:7:13 | case clause | | tst.go:5:2:5:13 | case clause | tst.go:5:7:5:12 | Before ...<... | -| tst.go:5:7:5:7 | After x | tst.go:5:11:5:12 | Before 23 | -| tst.go:5:7:5:7 | Before x | tst.go:5:7:5:7 | x | -| tst.go:5:7:5:7 | x | tst.go:5:7:5:7 | After x | +| tst.go:5:7:5:7 | x | tst.go:5:11:5:12 | 23 | | tst.go:5:7:5:12 | ...<... | tst.go:5:7:5:12 | After ...<... [match] | | tst.go:5:7:5:12 | ...<... | tst.go:5:7:5:12 | After ...<... [no-match] | | tst.go:5:7:5:12 | After ...<... [match] | tst.go:5:2:5:13 | After case clause [match] | | tst.go:5:7:5:12 | After ...<... [no-match] | tst.go:5:2:5:13 | After case clause [no-match] | -| tst.go:5:7:5:12 | Before ...<... | tst.go:5:7:5:7 | Before x | -| tst.go:5:11:5:12 | 23 | tst.go:5:11:5:12 | After 23 | -| tst.go:5:11:5:12 | After 23 | tst.go:5:7:5:12 | ...<... | -| tst.go:5:11:5:12 | Before 23 | tst.go:5:11:5:12 | 23 | +| tst.go:5:7:5:12 | Before ...<... | tst.go:5:7:5:7 | x | +| tst.go:5:11:5:12 | 23 | tst.go:5:7:5:12 | ...<... | | tst.go:7:2:7:13 | After case clause [match] | tst.go:4:2:11:2 | After expression-switch statement | | tst.go:7:2:7:13 | After case clause [no-match] | tst.go:9:2:9:13 | case clause | | tst.go:7:2:7:13 | case clause | tst.go:7:7:7:12 | Before ...<... | -| tst.go:7:7:7:7 | After x | tst.go:7:11:7:12 | Before 42 | -| tst.go:7:7:7:7 | Before x | tst.go:7:7:7:7 | x | -| tst.go:7:7:7:7 | x | tst.go:7:7:7:7 | After x | +| tst.go:7:7:7:7 | x | tst.go:7:11:7:12 | 42 | | tst.go:7:7:7:12 | ...<... | tst.go:7:7:7:12 | After ...<... [match] | | tst.go:7:7:7:12 | ...<... | tst.go:7:7:7:12 | After ...<... [no-match] | | tst.go:7:7:7:12 | After ...<... [match] | tst.go:7:2:7:13 | After case clause [match] | | tst.go:7:7:7:12 | After ...<... [no-match] | tst.go:7:2:7:13 | After case clause [no-match] | -| tst.go:7:7:7:12 | Before ...<... | tst.go:7:7:7:7 | Before x | -| tst.go:7:11:7:12 | 42 | tst.go:7:11:7:12 | After 42 | -| tst.go:7:11:7:12 | After 42 | tst.go:7:7:7:12 | ...<... | -| tst.go:7:11:7:12 | Before 42 | tst.go:7:11:7:12 | 42 | +| tst.go:7:7:7:12 | Before ...<... | tst.go:7:7:7:7 | x | +| tst.go:7:11:7:12 | 42 | tst.go:7:7:7:12 | ...<... | | tst.go:9:2:9:13 | After case clause [match] | tst.go:4:2:11:2 | After expression-switch statement | | tst.go:9:2:9:13 | After case clause [no-match] | tst.go:4:2:11:2 | After expression-switch statement | | tst.go:9:2:9:13 | case clause | tst.go:9:7:9:12 | Before ...<... | -| tst.go:9:7:9:7 | After x | tst.go:9:11:9:12 | Before 23 | -| tst.go:9:7:9:7 | Before x | tst.go:9:7:9:7 | x | -| tst.go:9:7:9:7 | x | tst.go:9:7:9:7 | After x | +| tst.go:9:7:9:7 | x | tst.go:9:11:9:12 | 23 | | tst.go:9:7:9:12 | ...<... | tst.go:9:7:9:12 | After ...<... [match] | | tst.go:9:7:9:12 | ...<... | tst.go:9:7:9:12 | After ...<... [no-match] | | tst.go:9:7:9:12 | After ...<... [match] | tst.go:9:2:9:13 | After case clause [match] | | tst.go:9:7:9:12 | After ...<... [no-match] | tst.go:9:2:9:13 | After case clause [no-match] | -| tst.go:9:7:9:12 | Before ...<... | tst.go:9:7:9:7 | Before x | -| tst.go:9:11:9:12 | 23 | tst.go:9:11:9:12 | After 23 | -| tst.go:9:11:9:12 | After 23 | tst.go:9:7:9:12 | ...<... | -| tst.go:9:11:9:12 | Before 23 | tst.go:9:11:9:12 | 23 | +| tst.go:9:7:9:12 | Before ...<... | tst.go:9:7:9:7 | x | +| tst.go:9:11:9:12 | 23 | tst.go:9:7:9:12 | ...<... | | tst.go:14:1:21:1 | After function declaration | tst.go:23:1:26:1 | Before function declaration | | tst.go:14:1:21:1 | Before function declaration | tst.go:14:1:21:1 | function declaration | | tst.go:14:1:21:1 | Entry | tst.go:14:13:14:17 | value | @@ -4329,28 +3492,24 @@ | tst.go:16:2:16:34 | After case clause [match] | tst.go:15:2:20:2 | After expression-switch statement | | tst.go:16:2:16:34 | After case clause [no-match] | tst.go:18:2:18:39 | case clause | | tst.go:16:2:16:34 | case clause | tst.go:16:7:16:33 | Before ...<... | -| tst.go:16:7:16:11 | After value | tst.go:16:15:16:33 | Before ...*... | -| tst.go:16:7:16:11 | Before value | tst.go:16:7:16:11 | value | -| tst.go:16:7:16:11 | value | tst.go:16:7:16:11 | After value | +| tst.go:16:7:16:11 | value | tst.go:16:15:16:33 | Before ...*... | | tst.go:16:7:16:33 | ...<... | tst.go:16:7:16:33 | After ...<... [match] | | tst.go:16:7:16:33 | ...<... | tst.go:16:7:16:33 | After ...<... [no-match] | | tst.go:16:7:16:33 | After ...<... [match] | tst.go:16:2:16:34 | After case clause [match] | | tst.go:16:7:16:33 | After ...<... [no-match] | tst.go:16:2:16:34 | After case clause [no-match] | -| tst.go:16:7:16:33 | Before ...<... | tst.go:16:7:16:11 | Before value | +| tst.go:16:7:16:33 | Before ...<... | tst.go:16:7:16:11 | value | | tst.go:16:15:16:33 | ...*... | tst.go:16:15:16:33 | After ...*... | | tst.go:16:15:16:33 | After ...*... | tst.go:16:7:16:33 | ...<... | | tst.go:16:15:16:33 | Before ...*... | tst.go:16:15:16:33 | ...*... | | tst.go:18:2:18:39 | After case clause [match] | tst.go:15:2:20:2 | After expression-switch statement | | tst.go:18:2:18:39 | After case clause [no-match] | tst.go:15:2:20:2 | After expression-switch statement | | tst.go:18:2:18:39 | case clause | tst.go:18:7:18:38 | Before ...<... | -| tst.go:18:7:18:11 | After value | tst.go:18:15:18:38 | Before ...*... | -| tst.go:18:7:18:11 | Before value | tst.go:18:7:18:11 | value | -| tst.go:18:7:18:11 | value | tst.go:18:7:18:11 | After value | +| tst.go:18:7:18:11 | value | tst.go:18:15:18:38 | Before ...*... | | tst.go:18:7:18:38 | ...<... | tst.go:18:7:18:38 | After ...<... [match] | | tst.go:18:7:18:38 | ...<... | tst.go:18:7:18:38 | After ...<... [no-match] | | tst.go:18:7:18:38 | After ...<... [match] | tst.go:18:2:18:39 | After case clause [match] | | tst.go:18:7:18:38 | After ...<... [no-match] | tst.go:18:2:18:39 | After case clause [no-match] | -| tst.go:18:7:18:38 | Before ...<... | tst.go:18:7:18:11 | Before value | +| tst.go:18:7:18:38 | Before ...<... | tst.go:18:7:18:11 | value | | tst.go:18:15:18:38 | ...*... | tst.go:18:15:18:38 | After ...*... | | tst.go:18:15:18:38 | After ...*... | tst.go:18:7:18:38 | ...<... | | tst.go:18:15:18:38 | Before ...*... | tst.go:18:15:18:38 | ...*... | From 00b3005533095aac6925c9d4fe813bfa44f3d6ea Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 11 Sep 2026 14:42:05 +0100 Subject: [PATCH 1036/2098] Use shared default sequencing for ordinary Go operations Remove the ordinary send override and restrict slice and selector overrides to implicit dereferences and promoted-field operations. Keep select-specific sequencing and additional IR operations unchanged. All 220 Go control-flow, data-flow, query and consistency tests pass without expectation changes. Cold single-thread ReflectedXss on CockroachDB remains 67s with identical BQRS result sets. --- .../go/controlflow/ControlFlowGraphImpl.qll | 28 +++---------------- 1 file changed, 4 insertions(+), 24 deletions(-) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll index b72704ff3c0c..e5ab737dc14f 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll @@ -1103,7 +1103,6 @@ module CfgImpl { sliceExprStep(n1, n2) or selectorExprStep(n1, n2) or compositeLitStep(n1, n2) or - sendStmtStep(n1, n2) or funcDefStep(n1, n2) } @@ -1358,22 +1357,19 @@ module CfgImpl { } /** - * Slice expression: base -> implicit-deref? -> low? -> high? -> max? -> In(sliceExpr). + * Slice expression with implicit dereference: base -> implicit-deref -> + * low? -> high? -> max? -> In(sliceExpr). * * Missing (implicit) bounds have no control-flow node of their own; the * implicit lower bound of `0` is modeled as a constant on the * `SliceInstruction` rather than as a separate node. */ private predicate sliceExprStep(PreControlFlowNode n1, PreControlFlowNode n2) { - exists(Go::SliceExpr se | + exists(Go::SliceExpr se | implicitDerefCondition(se.getBase()) | n1.isBefore(se) and n2.isBefore(se.getBase()) or n1.isAfter(se.getBase()) and - ( - if implicitDerefCondition(se.getBase()) - then n2.isAdditional(se.getBase(), "implicit-deref") - else sliceNext(se, -1, n2) - ) + n2.isAdditional(se.getBase(), "implicit-deref") or n1.isAdditional(se.getBase(), "implicit-deref") and sliceNext(se, -1, n2) or @@ -1396,7 +1392,6 @@ module CfgImpl { sel.getBase() instanceof Go::ValueExpr and ( implicitDerefCondition(sel.getBase()) or - exists(Go::Field f | sel = f.getAReference()) or implicitFieldSelection(sel, _, _) ) and ( @@ -1481,21 +1476,6 @@ module CfgImpl { ) } - /** - * Send statement (outside select): channel -> value -> In(send) - */ - private predicate sendStmtStep(PreControlFlowNode n1, PreControlFlowNode n2) { - exists(Go::SendStmt s | not s = any(Go::CommClause cc).getComm() | - n1.isBefore(s) and n2.isBefore(s.getChannel()) - or - n1.isAfter(s.getChannel()) and n2.isBefore(s.getValue()) - or - n1.isAfter(s.getValue()) and n2.isIn(s) - or - n1.isIn(s) and n2.isAfter(s) - ) - } - private predicate rangeStmtStep(PreControlFlowNode n1, PreControlFlowNode n2) { exists(Go::RangeElementExpr p | // The shared `ForEachStmt` model owns the loop skeleton (testing the From efc650b5034dd82df35eda13729e4bd0230c9786 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 11 Sep 2026 14:55:08 +0100 Subject: [PATCH 1037/2098] Use shared CFG leaf nodes for Go function literals Remove the function-literal post-order override and recognize its injected leaf node through the existing cached IR mapping. Retain specialized mappings for folded constants, logical expressions, deferred calls and composite allocations. Validated 220 Go CFG, data-flow, query and consistency tests including the regenerated edge snapshot. Full ReflectedXss BQRS results and IR instruction counts are unchanged on CockroachDB and AWS. Reachable CFG nodes decrease by 8784 and 2501 respectively; cold single-thread runs were 67s and 89s, with no claimed speedup. --- .../go/controlflow/ControlFlowGraphImpl.qll | 8 ++--- go/ql/lib/semmle/go/controlflow/IR.qll | 4 ++- .../ControlFlowNode_getASuccessor.expected | 36 +++++++------------ 3 files changed, 18 insertions(+), 30 deletions(-) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll index e5ab737dc14f..385b9b4a31aa 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll @@ -459,13 +459,11 @@ module CfgImpl { } predicate postOrInOrder(Ast::AstNode n) { - // References other than plain identifiers and function literals need - // an in-order value node even when they have no CFG children. Basic - // literals and plain identifiers instead evaluate at their before node. + // References other than plain identifiers need an in-order value node + // even when they have no CFG children. Basic literals, function literals, + // and plain identifiers instead evaluate at their before node. n instanceof Go::ReferenceExpr and not n instanceof Go::Ident or - n instanceof Go::FuncLit - or // An empty composite literal (e.g. `T{}`) has no CFG children, so it too // needs an explicit in-order (allocation) node. n instanceof Go::CompositeLit diff --git a/go/ql/lib/semmle/go/controlflow/IR.qll b/go/ql/lib/semmle/go/controlflow/IR.qll index bfc02c61dae2..badac830cd3a 100644 --- a/go/ql/lib/semmle/go/controlflow/IR.qll +++ b/go/ql/lib/semmle/go/controlflow/IR.qll @@ -48,12 +48,14 @@ module IR { ) } - /** Gets the CFG node representing a basic literal or plain identifier reference. */ + /** Gets the CFG node representing a basic literal, function literal, or plain identifier reference. */ cached private ControlFlow::Node leafEvaluation(Expr leaf) { ( leaf instanceof BasicLit or + leaf instanceof FuncLit + or leaf instanceof Ident and leaf instanceof ReferenceExpr ) and result.injects(leaf) diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected index 0ebc608ad646..795d396bfa40 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected @@ -372,16 +372,14 @@ | epilogues.go:78:2:80:15 | Before defer statement | epilogues.go:78:8:80:15 | function call | | epilogues.go:78:2:80:15 | catch-defer-panic defer statement | epilogues.go:77:1:82:1 | Exceptional Exit | | epilogues.go:78:2:80:15 | defer statement | epilogues.go:78:2:80:15 | After defer statement | -| epilogues.go:78:8:80:2 | After function literal | epilogues.go:80:4:80:9 | "done" | -| epilogues.go:78:8:80:2 | Before function literal | epilogues.go:78:8:80:2 | function literal | | epilogues.go:78:8:80:2 | Entry | epilogues.go:78:13:78:17 | label | | epilogues.go:78:8:80:2 | Exceptional Exit | epilogues.go:78:8:80:2 | Exit | | epilogues.go:78:8:80:2 | Normal Exit | epilogues.go:78:8:80:2 | Exit | -| epilogues.go:78:8:80:2 | function literal | epilogues.go:78:8:80:2 | After function literal | +| epilogues.go:78:8:80:2 | function literal | epilogues.go:80:4:80:9 | "done" | | epilogues.go:78:8:80:15 | After function call | epilogues.go:78:2:80:15 | defer statement | | epilogues.go:78:8:80:15 | defer-invoke function call | epilogues.go:77:29:82:1 | After block statement | | epilogues.go:78:8:80:15 | defer-invoke function call | epilogues.go:78:2:80:15 | catch-defer-panic defer statement | -| epilogues.go:78:8:80:15 | function call | epilogues.go:78:8:80:2 | Before function literal | +| epilogues.go:78:8:80:15 | function call | epilogues.go:78:8:80:2 | function literal | | epilogues.go:78:13:78:17 | label | epilogues.go:78:27:78:27 | n | | epilogues.go:78:27:78:27 | n | epilogues.go:78:34:80:2 | block statement | | epilogues.go:78:34:80:2 | After block statement | epilogues.go:78:8:80:2 | Normal Exit | @@ -430,15 +428,13 @@ | epilogues.go:88:2:92:4 | Before defer statement | epilogues.go:88:8:92:4 | function call | | epilogues.go:88:2:92:4 | catch-defer-panic defer statement | epilogues.go:87:1:98:1 | Exceptional Exit | | epilogues.go:88:2:92:4 | defer statement | epilogues.go:88:2:92:4 | After defer statement | -| epilogues.go:88:8:92:2 | After function literal | epilogues.go:88:8:92:4 | After function call | -| epilogues.go:88:8:92:2 | Before function literal | epilogues.go:88:8:92:2 | function literal | | epilogues.go:88:8:92:2 | Entry | epilogues.go:88:15:92:2 | block statement | | epilogues.go:88:8:92:2 | Normal Exit | epilogues.go:88:8:92:2 | Exit | -| epilogues.go:88:8:92:2 | function literal | epilogues.go:88:8:92:2 | After function literal | +| epilogues.go:88:8:92:2 | function literal | epilogues.go:88:8:92:4 | After function call | | epilogues.go:88:8:92:4 | After function call | epilogues.go:88:2:92:4 | defer statement | | epilogues.go:88:8:92:4 | defer-invoke function call | epilogues.go:87:42:98:1 | result-read:0 block statement | | epilogues.go:88:8:92:4 | defer-invoke function call | epilogues.go:88:2:92:4 | catch-defer-panic defer statement | -| epilogues.go:88:8:92:4 | function call | epilogues.go:88:8:92:2 | Before function literal | +| epilogues.go:88:8:92:4 | function call | epilogues.go:88:8:92:2 | function literal | | epilogues.go:88:15:92:2 | After block statement | epilogues.go:88:8:92:2 | Normal Exit | | epilogues.go:88:15:92:2 | block statement | epilogues.go:89:3:91:3 | if statement | | epilogues.go:89:3:91:3 | After if statement | epilogues.go:88:15:92:2 | After block statement | @@ -701,14 +697,12 @@ | exprs.go:8:16:8:24 | Before type conversion | exprs.go:8:23:8:23 | k | | exprs.go:8:16:8:24 | type conversion | exprs.go:8:16:8:24 | After type conversion | | exprs.go:8:23:8:23 | k | exprs.go:8:16:8:24 | type conversion | -| exprs.go:9:2:9:61 | ... := ... | exprs.go:9:8:9:61 | Before function literal | +| exprs.go:9:2:9:61 | ... := ... | exprs.go:9:8:9:61 | function literal | | exprs.go:9:2:9:61 | After ... := ... | exprs.go:10:2:10:32 | ... := ... | | exprs.go:9:2:9:61 | assign:0 ... := ... | exprs.go:9:2:9:61 | After ... := ... | -| exprs.go:9:8:9:61 | After function literal | exprs.go:9:2:9:61 | assign:0 ... := ... | -| exprs.go:9:8:9:61 | Before function literal | exprs.go:9:8:9:61 | function literal | | exprs.go:9:8:9:61 | Entry | exprs.go:9:13:9:13 | a | | exprs.go:9:8:9:61 | Normal Exit | exprs.go:9:8:9:61 | Exit | -| exprs.go:9:8:9:61 | function literal | exprs.go:9:8:9:61 | After function literal | +| exprs.go:9:8:9:61 | function literal | exprs.go:9:2:9:61 | assign:0 ... := ... | | exprs.go:9:13:9:13 | a | exprs.go:9:16:9:16 | b | | exprs.go:9:16:9:16 | b | exprs.go:9:23:9:23 | z | | exprs.go:9:23:9:23 | z | exprs.go:9:39:9:61 | block statement | @@ -2226,17 +2220,15 @@ | stmts3.go:18:1:20:1 | function declaration | stmts3.go:18:1:20:1 | After function declaration | | stmts3.go:18:15:20:1 | After block statement | stmts3.go:18:1:20:1 | Normal Exit | | stmts3.go:18:15:20:1 | block statement | stmts3.go:19:2:19:23 | ... = ... | -| stmts3.go:19:2:19:11 | After selection of Usage | stmts3.go:19:15:19:23 | Before function literal | +| stmts3.go:19:2:19:11 | After selection of Usage | stmts3.go:19:15:19:23 | function literal | | stmts3.go:19:2:19:11 | Before selection of Usage | stmts3.go:19:2:19:11 | selection of Usage | | stmts3.go:19:2:19:11 | selection of Usage | stmts3.go:19:2:19:11 | After selection of Usage | | stmts3.go:19:2:19:23 | ... = ... | stmts3.go:19:2:19:11 | Before selection of Usage | | stmts3.go:19:2:19:23 | After ... = ... | stmts3.go:18:15:20:1 | After block statement | | stmts3.go:19:2:19:23 | assign:0 ... = ... | stmts3.go:19:2:19:23 | After ... = ... | -| stmts3.go:19:15:19:23 | After function literal | stmts3.go:19:2:19:23 | assign:0 ... = ... | -| stmts3.go:19:15:19:23 | Before function literal | stmts3.go:19:15:19:23 | function literal | | stmts3.go:19:15:19:23 | Entry | stmts3.go:19:22:19:23 | block statement | | stmts3.go:19:15:19:23 | Normal Exit | stmts3.go:19:15:19:23 | Exit | -| stmts3.go:19:15:19:23 | function literal | stmts3.go:19:15:19:23 | After function literal | +| stmts3.go:19:15:19:23 | function literal | stmts3.go:19:2:19:23 | assign:0 ... = ... | | stmts3.go:19:22:19:23 | block statement | stmts3.go:19:15:19:23 | Normal Exit | | stmts4.go:0:0:0:0 | After stmts4.go | stmts4.go:0:0:0:0 | Normal Exit | | stmts4.go:0:0:0:0 | Entry | stmts4.go:0:0:0:0 | stmts4.go | @@ -3004,16 +2996,14 @@ | stmts.go:67:3:67:35 | Before defer statement | stmts.go:67:9:67:35 | function call | | stmts.go:67:3:67:35 | catch-defer-panic defer statement | stmts.go:65:1:72:1 | Exceptional Exit | | stmts.go:67:3:67:35 | defer statement | stmts.go:67:3:67:35 | After defer statement | -| stmts.go:67:9:67:33 | After function literal | stmts.go:67:9:67:35 | After function call | -| stmts.go:67:9:67:33 | Before function literal | stmts.go:67:9:67:33 | function literal | | stmts.go:67:9:67:33 | Entry | stmts.go:67:16:67:33 | block statement | | stmts.go:67:9:67:33 | Exceptional Exit | stmts.go:67:9:67:33 | Exit | | stmts.go:67:9:67:33 | Normal Exit | stmts.go:67:9:67:33 | Exit | -| stmts.go:67:9:67:33 | function literal | stmts.go:67:9:67:33 | After function literal | +| stmts.go:67:9:67:33 | function literal | stmts.go:67:9:67:35 | After function call | | stmts.go:67:9:67:35 | After function call | stmts.go:67:3:67:35 | defer statement | | stmts.go:67:9:67:35 | defer-invoke function call | stmts.go:65:23:72:1 | After block statement | | stmts.go:67:9:67:35 | defer-invoke function call | stmts.go:67:3:67:35 | catch-defer-panic defer statement | -| stmts.go:67:9:67:35 | function call | stmts.go:67:9:67:33 | Before function literal | +| stmts.go:67:9:67:35 | function call | stmts.go:67:9:67:33 | function literal | | stmts.go:67:16:67:33 | After block statement | stmts.go:67:9:67:33 | Normal Exit | | stmts.go:67:16:67:33 | block statement | stmts.go:67:18:67:31 | expression statement | | stmts.go:67:18:67:28 | After selection of Println | stmts.go:67:30:67:30 | x | @@ -3032,16 +3022,14 @@ | stmts.go:69:3:69:36 | Before defer statement | stmts.go:69:9:69:36 | function call | | stmts.go:69:3:69:36 | catch-defer-panic defer statement | stmts.go:65:1:72:1 | Exceptional Exit | | stmts.go:69:3:69:36 | defer statement | stmts.go:69:3:69:36 | After defer statement | -| stmts.go:69:9:69:34 | After function literal | stmts.go:69:9:69:36 | After function call | -| stmts.go:69:9:69:34 | Before function literal | stmts.go:69:9:69:34 | function literal | | stmts.go:69:9:69:34 | Entry | stmts.go:69:16:69:34 | block statement | | stmts.go:69:9:69:34 | Exceptional Exit | stmts.go:69:9:69:34 | Exit | | stmts.go:69:9:69:34 | Normal Exit | stmts.go:69:9:69:34 | Exit | -| stmts.go:69:9:69:34 | function literal | stmts.go:69:9:69:34 | After function literal | +| stmts.go:69:9:69:34 | function literal | stmts.go:69:9:69:36 | After function call | | stmts.go:69:9:69:36 | After function call | stmts.go:69:3:69:36 | defer statement | | stmts.go:69:9:69:36 | defer-invoke function call | stmts.go:65:23:72:1 | After block statement | | stmts.go:69:9:69:36 | defer-invoke function call | stmts.go:69:3:69:36 | catch-defer-panic defer statement | -| stmts.go:69:9:69:36 | function call | stmts.go:69:9:69:34 | Before function literal | +| stmts.go:69:9:69:36 | function call | stmts.go:69:9:69:34 | function literal | | stmts.go:69:16:69:34 | After block statement | stmts.go:69:9:69:34 | Normal Exit | | stmts.go:69:16:69:34 | block statement | stmts.go:69:18:69:32 | expression statement | | stmts.go:69:18:69:28 | After selection of Println | stmts.go:69:30:69:31 | Before -... | From 54329d684788e48fda66b1094d04e417e116e4c2 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 11 Sep 2026 15:07:51 +0100 Subject: [PATCH 1038/2098] Add QLDoc to `skipCfg` --- go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll index 385b9b4a31aa..1471889f1c83 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll @@ -63,6 +63,12 @@ module CfgImpl { private module Ast implements CfgLib::AstSig { class AstNode = Go::AstNode; + /** + * Holds if `e` is excluded from ordinary AST child traversal by `getChild`. + * This does not exclude `e` from the CFG entirely: specialized accessors and + * explicit control-flow steps can still use it, for example as a type-switch + * pattern or a select-receive assignment target. + */ private predicate skipCfg(AstNode e) { e instanceof Go::TypeExpr and not e instanceof Go::FuncTypeExpr or From 48479b18223f6b6d748c426ef1c68929e62d9bf4 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 11 Sep 2026 15:30:06 +0100 Subject: [PATCH 1039/2098] Cache Go IR write-target construction Avoid repeatedly evaluating the CFG-to-AST write-target mapping. Cold ReflectedXss profiles on CockroachDB and AWS reduce MkLhs domain evaluation from seven runs to one, with lower aggregate IR predicate time. End-to-end timings remain noisy. Validated with 220 Go control-flow/data-flow tests including consistency queries, and identical full BQRS results on both databases. --- go/ql/lib/semmle/go/controlflow/IR.qll | 1 + 1 file changed, 1 insertion(+) diff --git a/go/ql/lib/semmle/go/controlflow/IR.qll b/go/ql/lib/semmle/go/controlflow/IR.qll index badac830cd3a..7a94ba3fb6a1 100644 --- a/go/ql/lib/semmle/go/controlflow/IR.qll +++ b/go/ql/lib/semmle/go/controlflow/IR.qll @@ -1072,6 +1072,7 @@ module IR { } /** A representation of the target of a write instruction. */ + cached newtype TWriteTarget = /** A left-hand side of an assignment. */ MkLhs(ControlFlow::Node write, Expr lhs) { From 02a6899e1e61282ad8476a28b05f3b1442ef63e3 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 11 Sep 2026 15:38:42 +0100 Subject: [PATCH 1040/2098] Limit Go explicit CFG child ranking to its consumers Only function bodies and nodes with epilogue tags need child ranks for explicit sequencing. Restrict the ranking domain instead of ranking children across the entire AST. Cold ReflectedXss profiles reduce ranked-child rows from 2.09M to 279K on CockroachDB and from 2.69M to 571K on AWS, with unchanged explicit steps and full BQRS results. All 220 Go control-flow/data-flow tests including consistency queries pass. No end-to-end speedup claimed. --- go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll index 1471889f1c83..5c58a2eea4ec 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll @@ -1112,9 +1112,15 @@ module CfgImpl { /** * Gets the non-skipped child of `parent` at rank `rnk` (1-based). - * This mimics the shared library's getRankedChild but for use in explicit steps. + * This mimics the shared library's getRankedChild for explicit sequencing of + * function bodies and nodes with epilogues. */ private Ast::AstNode getRankedChild(Ast::AstNode parent, int rnk) { + ( + parent = any(Go::FuncDef fd).getBody() + or + exists(getEpilogueTag(parent, _)) + ) and result = rank[rnk](Ast::AstNode c, int ix | c = Ast::getChild(parent, ix) | c order by ix) } From 861446c3b2229652598d1956d77ec4d7f8fbf787 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Tue, 15 Sep 2026 11:34:40 +0100 Subject: [PATCH 1041/2098] Remove unnecessary `Instruction.getRoot` overrides --- .../go/controlflow/ControlFlowGraph.qll | 2 -- go/ql/lib/semmle/go/controlflow/IR.qll | 36 ------------------- 2 files changed, 38 deletions(-) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll index 52a87a153cbe..37b81d0f4fe7 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraph.qll @@ -340,8 +340,6 @@ module ControlFlow { /** Gets the value of the condition that this node corresponds to. */ boolean getOutcome() { result = outcome } - - override Root getRoot() { result.isRootOf(cond) } } /** diff --git a/go/ql/lib/semmle/go/controlflow/IR.qll b/go/ql/lib/semmle/go/controlflow/IR.qll index 7a94ba3fb6a1..021406eafac4 100644 --- a/go/ql/lib/semmle/go/controlflow/IR.qll +++ b/go/ql/lib/semmle/go/controlflow/IR.qll @@ -244,8 +244,6 @@ module IR { override Type getResultType() { result = e.getType() } - override ControlFlow::Root getRoot() { result.isRootOf(e) } - override float getFloatValue() { result = e.getFloatValue() } override int getIntValue() { result = e.getIntValue() } @@ -421,8 +419,6 @@ module IR { override predicate reads(ValueEntity v) { v = fld } override Type getResultType() { result = lookThroughPointerType(fld.getType()) } - - override ControlFlow::Root getRoot() { result.isRootOf(sel) } } /** @@ -532,8 +528,6 @@ module IR { or result = evalExprInstruction(elt.(KeyValueExpr).getValue()) } - - override ControlFlow::Root getRoot() { result.isRootOf(elt) } } /** @@ -660,8 +654,6 @@ module IR { result = evalExprInstruction(spec.getInit(i)) ) } - - override ControlFlow::Root getRoot() { result.isRootOf(assgn) } } /** @@ -693,8 +685,6 @@ module IR { or result = s.(IncDecStmt).getOperand().getType() } - - override ControlFlow::Root getRoot() { result.isRootOf(s) } } /** An instruction extracting a component of a tuple value. */ @@ -781,8 +771,6 @@ module IR { i = 0 and result = rangeType.(SendRecvChanType).getElementType() ) } - - override ControlFlow::Root getRoot() { result.isRootOf(s) } } /** @@ -827,8 +815,6 @@ module IR { override Type getResultType() { result = v.getType() } - override ControlFlow::Root getRoot() { result.isRootOf(v.getDeclaration()) } - override int getIntValue() { v.getType().getUnderlyingType() instanceof IntegerType and result = 0 } @@ -871,8 +857,6 @@ module IR { DeferStmt defer; DeferInstruction() { this.isIn(defer) } - - override ControlFlow::Root getRoot() { result.isRootOf(defer) } } /** An instruction that corresponds to a `go` statement. */ @@ -880,8 +864,6 @@ module IR { GoStmt go; GoInstruction() { this.isIn(go) } - - override ControlFlow::Root getRoot() { result.isRootOf(go) } } /** An instruction corresponding to a return from a function. */ @@ -914,8 +896,6 @@ module IR { not exists(ExtractTupleElementInstruction ext | ext.isAdditional(ret, _)) and result = evalExprInstruction(ret.getExpr(i)) } - - override ControlFlow::Root getRoot() { result.isRootOf(ret) } } /** @@ -941,8 +921,6 @@ module IR { ResultVariable getResultVariable() { result = var } override Type getResultType() { result = var.getType() } - - override ControlFlow::Root getRoot() { var = result.(FuncDef).getAResultVar() } } /** @@ -962,8 +940,6 @@ module IR { override predicate reads(ValueEntity v) { v = var } override Type getResultType() { result = var.getType() } - - override ControlFlow::Root getRoot() { var = result.(FuncDef).getAResultVar() } } /** An instruction initializing a parameter to the corresponding argument. */ @@ -980,8 +956,6 @@ module IR { override Instruction getRhs() { result = this } override Type getResultType() { result = parm.getType() } - - override ControlFlow::Root getRoot() { result = parm.getFunction() } } /** An instruction that gets the next key-value pair in a range loop. */ @@ -994,8 +968,6 @@ module IR { * Gets the instruction computing the value whose key-value pairs this instruction reads. */ Instruction getDomain() { result = evalExprInstruction(p.getDomain()) } - - override ControlFlow::Root getRoot() { result.isRootOf(p.getRangeStmt()) } } /** @@ -1008,8 +980,6 @@ module IR { override Type getResultType() { result instanceof BoolType } - override ControlFlow::Root getRoot() { result.isRootOf(stmt) } - override boolean getBoolValue() { result = true } override string getExactValue() { result = "true" } @@ -1031,8 +1001,6 @@ module IR { this.isAdditional(cc, "case-check:" + i.toString()) and exists(cc.getExpr(i)) } - - override ControlFlow::Root getRoot() { result.isRootOf(cc) } } /** @@ -1048,8 +1016,6 @@ module IR { v = cc.getImplicitlyDeclaredVariable() and exists(TypeSwitchStmt ts | cc = ts.getACase() | rhs = evalExprInstruction(ts.getExpr())) } - - override ControlFlow::Root getRoot() { result.isRootOf(cc) } } /** @@ -1067,8 +1033,6 @@ module IR { override Type getResultType() { result = e.getType().getUnderlyingType().(PointerType).getBaseType() } - - override ControlFlow::Root getRoot() { result.isRootOf(e) } } /** A representation of the target of a write instruction. */ From 69ed94575204121b4bb797cd191bf1cb9659a2c4 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Tue, 15 Sep 2026 11:55:38 +0100 Subject: [PATCH 1042/2098] Cache `getEnclosingCallable` --- go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll | 1 + 1 file changed, 1 insertion(+) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll index 5c58a2eea4ec..5581e2adf33f 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll @@ -174,6 +174,7 @@ module CfgImpl { result = c.(Go::FuncDef).getParameter(index).getDeclaration() } + cached Callable getEnclosingCallable(AstNode node) { result = node.getEnclosingFunction() or From 85f0fb5b9f92b84d223b38a75d574ebadca034e6 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Tue, 15 Sep 2026 15:53:48 +0100 Subject: [PATCH 1043/2098] Single node for function, import, type decls Represent function, import, and type declarations with the same single-node shape as the legacy CFG. --- .../go/controlflow/ControlFlowGraphImpl.qll | 4 +- go/ql/lib/semmle/go/controlflow/IR.qll | 5 +- .../test/extractor-tests/go1.17/CFG.expected | 96 ++-- .../ControlFlowNode_getASuccessor.expected | 435 +++++------------- 4 files changed, 148 insertions(+), 392 deletions(-) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll index 5581e2adf33f..1da4b1e51231 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll @@ -121,6 +121,8 @@ module CfgImpl { AstNode getChild(AstNode n, int index) { ( not n instanceof Go::FuncDef and + not n instanceof Go::ImportDecl and + not n instanceof Go::TypeDecl and not skipCfg(n) and result = n.getChild(index) or @@ -496,8 +498,6 @@ module CfgImpl { n instanceof Go::SelectStmt or n instanceof Go::SendStmt - or - n instanceof Go::FuncDecl } predicate additionalNode(Ast::AstNode n, string tag, NormalSuccessor t) { diff --git a/go/ql/lib/semmle/go/controlflow/IR.qll b/go/ql/lib/semmle/go/controlflow/IR.qll index 021406eafac4..a87f1464de12 100644 --- a/go/ql/lib/semmle/go/controlflow/IR.qll +++ b/go/ql/lib/semmle/go/controlflow/IR.qll @@ -93,6 +93,9 @@ module IR { // "before"/"after" leaf node for its declaration), which hosts the // initialization write (see `InitParameterInstruction`). this.isBefore(any(FuncDef fd).getParameter(_).getDeclaration()) + or + // Function declarations are represented by their merged leaf node. + this.isBefore(any(FuncDecl fd)) } /** Holds if this instruction reads the value of variable or constant `v`. */ @@ -847,7 +850,7 @@ module IR { class DeclareFunctionInstruction extends Instruction { FuncDecl fd; - DeclareFunctionInstruction() { this.isIn(fd) } + DeclareFunctionInstruction() { this.isBefore(fd) } override Type getResultType() { result = fd.getType() } } diff --git a/go/ql/test/extractor-tests/go1.17/CFG.expected b/go/ql/test/extractor-tests/go1.17/CFG.expected index ebe0da07d68f..d6f4ea0f06fc 100644 --- a/go/ql/test/extractor-tests/go1.17/CFG.expected +++ b/go/ql/test/extractor-tests/go1.17/CFG.expected @@ -4,22 +4,16 @@ edges | conversions.go:0:0:0:0 | Entry | conversions.go:0:0:0:0 | conversions.go | | conversions.go:0:0:0:0 | Normal Exit | conversions.go:0:0:0:0 | Exit | | conversions.go:0:0:0:0 | conversions.go | conversions.go:3:1:3:15 | import declaration | -| conversions.go:3:1:3:15 | After import declaration | conversions.go:5:1:5:29 | Before function declaration | -| conversions.go:3:1:3:15 | import declaration | conversions.go:3:8:3:15 | import specifier | -| conversions.go:3:8:3:15 | import specifier | conversions.go:3:1:3:15 | After import declaration | -| conversions.go:5:1:5:29 | After function declaration | conversions.go:7:1:26:1 | Before function declaration | -| conversions.go:5:1:5:29 | Before function declaration | conversions.go:5:1:5:29 | function declaration | +| conversions.go:3:1:3:15 | import declaration | conversions.go:5:1:5:29 | function declaration | | conversions.go:5:1:5:29 | Entry | conversions.go:5:10:5:10 | _ | | conversions.go:5:1:5:29 | Normal Exit | conversions.go:5:1:5:29 | Exit | -| conversions.go:5:1:5:29 | function declaration | conversions.go:5:1:5:29 | After function declaration | +| conversions.go:5:1:5:29 | function declaration | conversions.go:7:1:26:1 | function declaration | | conversions.go:5:10:5:10 | _ | conversions.go:5:28:5:29 | block statement | | conversions.go:5:28:5:29 | block statement | conversions.go:5:1:5:29 | Normal Exit | -| conversions.go:7:1:26:1 | After function declaration | conversions.go:0:0:0:0 | After conversions.go | -| conversions.go:7:1:26:1 | Before function declaration | conversions.go:7:1:26:1 | function declaration | | conversions.go:7:1:26:1 | Entry | conversions.go:7:13:26:1 | block statement | | conversions.go:7:1:26:1 | Exceptional Exit | conversions.go:7:1:26:1 | Exit | | conversions.go:7:1:26:1 | Normal Exit | conversions.go:7:1:26:1 | Exit | -| conversions.go:7:1:26:1 | function declaration | conversions.go:7:1:26:1 | After function declaration | +| conversions.go:7:1:26:1 | function declaration | conversions.go:0:0:0:0 | After conversions.go | | conversions.go:7:13:26:1 | After block statement | conversions.go:7:1:26:1 | Normal Exit | | conversions.go:7:13:26:1 | block statement | conversions.go:8:2:8:21 | declaration statement | | conversions.go:8:2:8:21 | After declaration statement | conversions.go:10:2:10:23 | ... := ... | @@ -32,30 +26,22 @@ edges | conversions.go:10:2:10:23 | ... := ... | conversions.go:10:7:10:23 | Before call to Add | | conversions.go:10:2:10:23 | After ... := ... | conversions.go:11:2:11:7 | expression statement | | conversions.go:10:2:10:23 | assign:0 ... := ... | conversions.go:10:2:10:23 | After ... := ... | -| conversions.go:10:7:10:16 | After selection of Add | conversions.go:10:18:10:18 | Before a | +| conversions.go:10:7:10:16 | After selection of Add | conversions.go:10:18:10:18 | a | | conversions.go:10:7:10:16 | Before selection of Add | conversions.go:10:7:10:16 | selection of Add | | conversions.go:10:7:10:16 | selection of Add | conversions.go:10:7:10:16 | After selection of Add | | conversions.go:10:7:10:23 | After call to Add | conversions.go:10:2:10:23 | assign:0 ... := ... | | conversions.go:10:7:10:23 | Before call to Add | conversions.go:10:7:10:16 | Before selection of Add | | conversions.go:10:7:10:23 | call to Add | conversions.go:10:7:10:23 | After call to Add | -| conversions.go:10:18:10:18 | After a | conversions.go:10:21:10:22 | Before 10 | -| conversions.go:10:18:10:18 | Before a | conversions.go:10:18:10:18 | a | -| conversions.go:10:18:10:18 | a | conversions.go:10:18:10:18 | After a | -| conversions.go:10:21:10:22 | 10 | conversions.go:10:21:10:22 | After 10 | -| conversions.go:10:21:10:22 | After 10 | conversions.go:10:7:10:23 | call to Add | -| conversions.go:10:21:10:22 | Before 10 | conversions.go:10:21:10:22 | 10 | -| conversions.go:11:2:11:4 | After use | conversions.go:11:6:11:6 | Before b | -| conversions.go:11:2:11:4 | Before use | conversions.go:11:2:11:4 | use | -| conversions.go:11:2:11:4 | use | conversions.go:11:2:11:4 | After use | +| conversions.go:10:18:10:18 | a | conversions.go:10:21:10:22 | 10 | +| conversions.go:10:21:10:22 | 10 | conversions.go:10:7:10:23 | call to Add | +| conversions.go:11:2:11:4 | use | conversions.go:11:6:11:6 | b | | conversions.go:11:2:11:7 | After call to use | conversions.go:11:2:11:7 | After expression statement | | conversions.go:11:2:11:7 | After expression statement | conversions.go:13:2:13:13 | declaration statement | -| conversions.go:11:2:11:7 | Before call to use | conversions.go:11:2:11:4 | Before use | +| conversions.go:11:2:11:7 | Before call to use | conversions.go:11:2:11:4 | use | | conversions.go:11:2:11:7 | call to use | conversions.go:7:1:26:1 | Exceptional Exit | | conversions.go:11:2:11:7 | call to use | conversions.go:11:2:11:7 | After call to use | | conversions.go:11:2:11:7 | expression statement | conversions.go:11:2:11:7 | Before call to use | -| conversions.go:11:6:11:6 | After b | conversions.go:11:2:11:7 | call to use | -| conversions.go:11:6:11:6 | Before b | conversions.go:11:6:11:6 | b | -| conversions.go:11:6:11:6 | b | conversions.go:11:6:11:6 | After b | +| conversions.go:11:6:11:6 | b | conversions.go:11:2:11:7 | call to use | | conversions.go:13:2:13:13 | After declaration statement | conversions.go:14:2:14:31 | ... := ... | | conversions.go:13:2:13:13 | After variable declaration | conversions.go:13:2:13:13 | After declaration statement | | conversions.go:13:2:13:13 | declaration statement | conversions.go:13:2:13:13 | variable declaration | @@ -66,87 +52,63 @@ edges | conversions.go:14:2:14:31 | ... := ... | conversions.go:14:11:14:31 | Before call to Slice | | conversions.go:14:2:14:31 | After ... := ... | conversions.go:17:2:17:25 | ... := ... | | conversions.go:14:2:14:31 | assign:0 ... := ... | conversions.go:14:2:14:31 | After ... := ... | -| conversions.go:14:11:14:22 | After selection of Slice | conversions.go:14:24:14:26 | Before arr | +| conversions.go:14:11:14:22 | After selection of Slice | conversions.go:14:24:14:26 | arr | | conversions.go:14:11:14:22 | Before selection of Slice | conversions.go:14:11:14:22 | selection of Slice | | conversions.go:14:11:14:22 | selection of Slice | conversions.go:14:11:14:22 | After selection of Slice | | conversions.go:14:11:14:31 | After call to Slice | conversions.go:14:2:14:31 | assign:0 ... := ... | | conversions.go:14:11:14:31 | Before call to Slice | conversions.go:14:11:14:22 | Before selection of Slice | | conversions.go:14:11:14:31 | call to Slice | conversions.go:14:11:14:31 | After call to Slice | -| conversions.go:14:24:14:26 | After arr | conversions.go:14:29:14:30 | Before 20 | -| conversions.go:14:24:14:26 | Before arr | conversions.go:14:24:14:26 | arr | -| conversions.go:14:24:14:26 | arr | conversions.go:14:24:14:26 | After arr | -| conversions.go:14:29:14:30 | 20 | conversions.go:14:29:14:30 | After 20 | -| conversions.go:14:29:14:30 | After 20 | conversions.go:14:11:14:31 | call to Slice | -| conversions.go:14:29:14:30 | Before 20 | conversions.go:14:29:14:30 | 20 | +| conversions.go:14:24:14:26 | arr | conversions.go:14:29:14:30 | 20 | +| conversions.go:14:29:14:30 | 20 | conversions.go:14:11:14:31 | call to Slice | | conversions.go:17:2:17:25 | ... := ... | conversions.go:17:9:17:25 | Before type conversion | | conversions.go:17:2:17:25 | After ... := ... | conversions.go:18:2:18:9 | expression statement | | conversions.go:17:2:17:25 | assign:0 ... := ... | conversions.go:17:2:17:25 | After ... := ... | | conversions.go:17:9:17:25 | After type conversion | conversions.go:17:2:17:25 | assign:0 ... := ... | -| conversions.go:17:9:17:25 | Before type conversion | conversions.go:17:20:17:24 | Before slice | +| conversions.go:17:9:17:25 | Before type conversion | conversions.go:17:20:17:24 | slice | | conversions.go:17:9:17:25 | type conversion | conversions.go:7:1:26:1 | Exceptional Exit | | conversions.go:17:9:17:25 | type conversion | conversions.go:17:9:17:25 | After type conversion | -| conversions.go:17:20:17:24 | After slice | conversions.go:17:9:17:25 | type conversion | -| conversions.go:17:20:17:24 | Before slice | conversions.go:17:20:17:24 | slice | -| conversions.go:17:20:17:24 | slice | conversions.go:17:20:17:24 | After slice | -| conversions.go:18:2:18:4 | After use | conversions.go:18:6:18:8 | Before ptr | -| conversions.go:18:2:18:4 | Before use | conversions.go:18:2:18:4 | use | -| conversions.go:18:2:18:4 | use | conversions.go:18:2:18:4 | After use | +| conversions.go:17:20:17:24 | slice | conversions.go:17:9:17:25 | type conversion | +| conversions.go:18:2:18:4 | use | conversions.go:18:6:18:8 | ptr | | conversions.go:18:2:18:9 | After call to use | conversions.go:18:2:18:9 | After expression statement | | conversions.go:18:2:18:9 | After expression statement | conversions.go:21:2:21:18 | ... := ... | -| conversions.go:18:2:18:9 | Before call to use | conversions.go:18:2:18:4 | Before use | +| conversions.go:18:2:18:9 | Before call to use | conversions.go:18:2:18:4 | use | | conversions.go:18:2:18:9 | call to use | conversions.go:7:1:26:1 | Exceptional Exit | | conversions.go:18:2:18:9 | call to use | conversions.go:18:2:18:9 | After call to use | | conversions.go:18:2:18:9 | expression statement | conversions.go:18:2:18:9 | Before call to use | -| conversions.go:18:6:18:8 | After ptr | conversions.go:18:2:18:9 | call to use | -| conversions.go:18:6:18:8 | Before ptr | conversions.go:18:6:18:8 | ptr | -| conversions.go:18:6:18:8 | ptr | conversions.go:18:6:18:8 | After ptr | -| conversions.go:21:2:21:18 | ... := ... | conversions.go:21:9:21:18 | Before "a string" | +| conversions.go:18:6:18:8 | ptr | conversions.go:18:2:18:9 | call to use | +| conversions.go:21:2:21:18 | ... := ... | conversions.go:21:9:21:18 | "a string" | | conversions.go:21:2:21:18 | After ... := ... | conversions.go:22:2:22:21 | ... := ... | | conversions.go:21:2:21:18 | assign:0 ... := ... | conversions.go:21:2:21:18 | After ... := ... | -| conversions.go:21:9:21:18 | "a string" | conversions.go:21:9:21:18 | After "a string" | -| conversions.go:21:9:21:18 | After "a string" | conversions.go:21:2:21:18 | assign:0 ... := ... | -| conversions.go:21:9:21:18 | Before "a string" | conversions.go:21:9:21:18 | "a string" | +| conversions.go:21:9:21:18 | "a string" | conversions.go:21:2:21:18 | assign:0 ... := ... | | conversions.go:22:2:22:21 | ... := ... | conversions.go:22:11:22:21 | Before type conversion | | conversions.go:22:2:22:21 | After ... := ... | conversions.go:23:2:23:11 | expression statement | | conversions.go:22:2:22:21 | assign:0 ... := ... | conversions.go:22:2:22:21 | After ... := ... | | conversions.go:22:11:22:21 | After type conversion | conversions.go:22:2:22:21 | assign:0 ... := ... | -| conversions.go:22:11:22:21 | Before type conversion | conversions.go:22:18:22:20 | Before str | +| conversions.go:22:11:22:21 | Before type conversion | conversions.go:22:18:22:20 | str | | conversions.go:22:11:22:21 | type conversion | conversions.go:22:11:22:21 | After type conversion | -| conversions.go:22:18:22:20 | After str | conversions.go:22:11:22:21 | type conversion | -| conversions.go:22:18:22:20 | Before str | conversions.go:22:18:22:20 | str | -| conversions.go:22:18:22:20 | str | conversions.go:22:18:22:20 | After str | -| conversions.go:23:2:23:4 | After use | conversions.go:23:6:23:10 | Before bytes | -| conversions.go:23:2:23:4 | Before use | conversions.go:23:2:23:4 | use | -| conversions.go:23:2:23:4 | use | conversions.go:23:2:23:4 | After use | +| conversions.go:22:18:22:20 | str | conversions.go:22:11:22:21 | type conversion | +| conversions.go:23:2:23:4 | use | conversions.go:23:6:23:10 | bytes | | conversions.go:23:2:23:11 | After call to use | conversions.go:23:2:23:11 | After expression statement | | conversions.go:23:2:23:11 | After expression statement | conversions.go:24:2:24:21 | ... := ... | -| conversions.go:23:2:23:11 | Before call to use | conversions.go:23:2:23:4 | Before use | +| conversions.go:23:2:23:11 | Before call to use | conversions.go:23:2:23:4 | use | | conversions.go:23:2:23:11 | call to use | conversions.go:7:1:26:1 | Exceptional Exit | | conversions.go:23:2:23:11 | call to use | conversions.go:23:2:23:11 | After call to use | | conversions.go:23:2:23:11 | expression statement | conversions.go:23:2:23:11 | Before call to use | -| conversions.go:23:6:23:10 | After bytes | conversions.go:23:2:23:11 | call to use | -| conversions.go:23:6:23:10 | Before bytes | conversions.go:23:6:23:10 | bytes | -| conversions.go:23:6:23:10 | bytes | conversions.go:23:6:23:10 | After bytes | +| conversions.go:23:6:23:10 | bytes | conversions.go:23:2:23:11 | call to use | | conversions.go:24:2:24:21 | ... := ... | conversions.go:24:11:24:21 | Before type conversion | | conversions.go:24:2:24:21 | After ... := ... | conversions.go:25:2:25:11 | expression statement | | conversions.go:24:2:24:21 | assign:0 ... := ... | conversions.go:24:2:24:21 | After ... := ... | | conversions.go:24:11:24:21 | After type conversion | conversions.go:24:2:24:21 | assign:0 ... := ... | -| conversions.go:24:11:24:21 | Before type conversion | conversions.go:24:18:24:20 | Before str | +| conversions.go:24:11:24:21 | Before type conversion | conversions.go:24:18:24:20 | str | | conversions.go:24:11:24:21 | type conversion | conversions.go:24:11:24:21 | After type conversion | -| conversions.go:24:18:24:20 | After str | conversions.go:24:11:24:21 | type conversion | -| conversions.go:24:18:24:20 | Before str | conversions.go:24:18:24:20 | str | -| conversions.go:24:18:24:20 | str | conversions.go:24:18:24:20 | After str | -| conversions.go:25:2:25:4 | After use | conversions.go:25:6:25:10 | Before runes | -| conversions.go:25:2:25:4 | Before use | conversions.go:25:2:25:4 | use | -| conversions.go:25:2:25:4 | use | conversions.go:25:2:25:4 | After use | +| conversions.go:24:18:24:20 | str | conversions.go:24:11:24:21 | type conversion | +| conversions.go:25:2:25:4 | use | conversions.go:25:6:25:10 | runes | | conversions.go:25:2:25:11 | After call to use | conversions.go:25:2:25:11 | After expression statement | | conversions.go:25:2:25:11 | After expression statement | conversions.go:7:13:26:1 | After block statement | -| conversions.go:25:2:25:11 | Before call to use | conversions.go:25:2:25:4 | Before use | +| conversions.go:25:2:25:11 | Before call to use | conversions.go:25:2:25:4 | use | | conversions.go:25:2:25:11 | call to use | conversions.go:7:1:26:1 | Exceptional Exit | | conversions.go:25:2:25:11 | call to use | conversions.go:25:2:25:11 | After call to use | | conversions.go:25:2:25:11 | expression statement | conversions.go:25:2:25:11 | Before call to use | -| conversions.go:25:6:25:10 | After runes | conversions.go:25:2:25:11 | call to use | -| conversions.go:25:6:25:10 | Before runes | conversions.go:25:6:25:10 | runes | -| conversions.go:25:6:25:10 | runes | conversions.go:25:6:25:10 | After runes | +| conversions.go:25:6:25:10 | runes | conversions.go:25:2:25:11 | call to use | #select | | diff --git a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected index 795d396bfa40..28c1fdb2735a 100644 --- a/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected +++ b/go/ql/test/library-tests/semmle/go/controlflow/ControlFlowGraph/ControlFlowNode_getASuccessor.expected @@ -1,13 +1,11 @@ | DuplicateSwitchCase.go:0:0:0:0 | After DuplicateSwitchCase.go | DuplicateSwitchCase.go:0:0:0:0 | Normal Exit | -| DuplicateSwitchCase.go:0:0:0:0 | DuplicateSwitchCase.go | DuplicateSwitchCase.go:3:1:12:1 | Before function declaration | +| DuplicateSwitchCase.go:0:0:0:0 | DuplicateSwitchCase.go | DuplicateSwitchCase.go:3:1:12:1 | function declaration | | DuplicateSwitchCase.go:0:0:0:0 | Entry | DuplicateSwitchCase.go:0:0:0:0 | DuplicateSwitchCase.go | | DuplicateSwitchCase.go:0:0:0:0 | Normal Exit | DuplicateSwitchCase.go:0:0:0:0 | Exit | -| DuplicateSwitchCase.go:3:1:12:1 | After function declaration | DuplicateSwitchCase.go:14:1:14:15 | Before function declaration | -| DuplicateSwitchCase.go:3:1:12:1 | Before function declaration | DuplicateSwitchCase.go:3:1:12:1 | function declaration | | DuplicateSwitchCase.go:3:1:12:1 | Entry | DuplicateSwitchCase.go:3:17:3:19 | msg | | DuplicateSwitchCase.go:3:1:12:1 | Exceptional Exit | DuplicateSwitchCase.go:3:1:12:1 | Exit | | DuplicateSwitchCase.go:3:1:12:1 | Normal Exit | DuplicateSwitchCase.go:3:1:12:1 | Exit | -| DuplicateSwitchCase.go:3:1:12:1 | function declaration | DuplicateSwitchCase.go:3:1:12:1 | After function declaration | +| DuplicateSwitchCase.go:3:1:12:1 | function declaration | DuplicateSwitchCase.go:14:1:14:15 | function declaration | | DuplicateSwitchCase.go:3:17:3:19 | msg | DuplicateSwitchCase.go:3:29:12:1 | block statement | | DuplicateSwitchCase.go:3:29:12:1 | After block statement | DuplicateSwitchCase.go:3:1:12:1 | Normal Exit | | DuplicateSwitchCase.go:3:29:12:1 | block statement | DuplicateSwitchCase.go:4:2:11:2 | expression-switch statement | @@ -54,34 +52,24 @@ | DuplicateSwitchCase.go:10:3:10:34 | call to panic | DuplicateSwitchCase.go:3:1:12:1 | Exceptional Exit | | DuplicateSwitchCase.go:10:3:10:34 | expression statement | DuplicateSwitchCase.go:10:3:10:34 | Before call to panic | | DuplicateSwitchCase.go:10:9:10:33 | "Message not understood." | DuplicateSwitchCase.go:10:3:10:34 | call to panic | -| DuplicateSwitchCase.go:14:1:14:15 | After function declaration | DuplicateSwitchCase.go:16:1:16:14 | Before function declaration | -| DuplicateSwitchCase.go:14:1:14:15 | Before function declaration | DuplicateSwitchCase.go:14:1:14:15 | function declaration | | DuplicateSwitchCase.go:14:1:14:15 | Entry | DuplicateSwitchCase.go:14:14:14:15 | block statement | | DuplicateSwitchCase.go:14:1:14:15 | Normal Exit | DuplicateSwitchCase.go:14:1:14:15 | Exit | -| DuplicateSwitchCase.go:14:1:14:15 | function declaration | DuplicateSwitchCase.go:14:1:14:15 | After function declaration | +| DuplicateSwitchCase.go:14:1:14:15 | function declaration | DuplicateSwitchCase.go:16:1:16:14 | function declaration | | DuplicateSwitchCase.go:14:14:14:15 | block statement | DuplicateSwitchCase.go:14:1:14:15 | Normal Exit | -| DuplicateSwitchCase.go:16:1:16:14 | After function declaration | DuplicateSwitchCase.go:0:0:0:0 | After DuplicateSwitchCase.go | -| DuplicateSwitchCase.go:16:1:16:14 | Before function declaration | DuplicateSwitchCase.go:16:1:16:14 | function declaration | | DuplicateSwitchCase.go:16:1:16:14 | Entry | DuplicateSwitchCase.go:16:13:16:14 | block statement | | DuplicateSwitchCase.go:16:1:16:14 | Normal Exit | DuplicateSwitchCase.go:16:1:16:14 | Exit | -| DuplicateSwitchCase.go:16:1:16:14 | function declaration | DuplicateSwitchCase.go:16:1:16:14 | After function declaration | +| DuplicateSwitchCase.go:16:1:16:14 | function declaration | DuplicateSwitchCase.go:0:0:0:0 | After DuplicateSwitchCase.go | | DuplicateSwitchCase.go:16:13:16:14 | block statement | DuplicateSwitchCase.go:16:1:16:14 | Normal Exit | | epilogues.go:0:0:0:0 | After epilogues.go | epilogues.go:0:0:0:0 | Normal Exit | | epilogues.go:0:0:0:0 | Entry | epilogues.go:0:0:0:0 | epilogues.go | | epilogues.go:0:0:0:0 | Normal Exit | epilogues.go:0:0:0:0 | Exit | | epilogues.go:0:0:0:0 | epilogues.go | epilogues.go:3:1:3:12 | import declaration | -| epilogues.go:3:1:3:12 | After import declaration | epilogues.go:8:1:10:1 | type declaration | -| epilogues.go:3:1:3:12 | import declaration | epilogues.go:3:8:3:12 | import specifier | -| epilogues.go:3:8:3:12 | import specifier | epilogues.go:3:1:3:12 | After import declaration | -| epilogues.go:8:1:10:1 | After type declaration | epilogues.go:12:1:14:1 | Before function declaration | -| epilogues.go:8:1:10:1 | type declaration | epilogues.go:8:6:10:1 | type declaration specifier | -| epilogues.go:8:6:10:1 | type declaration specifier | epilogues.go:8:1:10:1 | After type declaration | -| epilogues.go:12:1:14:1 | After function declaration | epilogues.go:16:1:18:1 | Before function declaration | -| epilogues.go:12:1:14:1 | Before function declaration | epilogues.go:12:1:14:1 | function declaration | +| epilogues.go:3:1:3:12 | import declaration | epilogues.go:8:1:10:1 | type declaration | +| epilogues.go:8:1:10:1 | type declaration | epilogues.go:12:1:14:1 | function declaration | | epilogues.go:12:1:14:1 | Entry | epilogues.go:12:7:12:7 | l | | epilogues.go:12:1:14:1 | Exceptional Exit | epilogues.go:12:1:14:1 | Exit | | epilogues.go:12:1:14:1 | Normal Exit | epilogues.go:12:1:14:1 | Exit | -| epilogues.go:12:1:14:1 | function declaration | epilogues.go:12:1:14:1 | After function declaration | +| epilogues.go:12:1:14:1 | function declaration | epilogues.go:16:1:18:1 | function declaration | | epilogues.go:12:7:12:7 | l | epilogues.go:12:25:12:27 | msg | | epilogues.go:12:25:12:27 | msg | epilogues.go:12:37:12:40 | code | | epilogues.go:12:37:12:40 | code | epilogues.go:12:47:14:1 | block statement | @@ -104,12 +92,10 @@ | epilogues.go:13:14:13:21 | selection of prefix | epilogues.go:13:14:13:21 | After selection of prefix | | epilogues.go:13:24:13:26 | msg | epilogues.go:13:29:13:32 | code | | epilogues.go:13:29:13:32 | code | epilogues.go:13:2:13:33 | call to Println | -| epilogues.go:16:1:18:1 | After function declaration | epilogues.go:23:1:27:1 | Before function declaration | -| epilogues.go:16:1:18:1 | Before function declaration | epilogues.go:16:1:18:1 | function declaration | | epilogues.go:16:1:18:1 | Entry | epilogues.go:16:7:16:7 | l | | epilogues.go:16:1:18:1 | Exceptional Exit | epilogues.go:16:1:18:1 | Exit | | epilogues.go:16:1:18:1 | Normal Exit | epilogues.go:16:1:18:1 | Exit | -| epilogues.go:16:1:18:1 | function declaration | epilogues.go:16:1:18:1 | After function declaration | +| epilogues.go:16:1:18:1 | function declaration | epilogues.go:23:1:27:1 | function declaration | | epilogues.go:16:7:16:7 | l | epilogues.go:16:29:16:31 | msg | | epilogues.go:16:29:16:31 | msg | epilogues.go:16:41:18:1 | block statement | | epilogues.go:16:41:18:1 | After block statement | epilogues.go:16:1:18:1 | Normal Exit | @@ -128,12 +114,10 @@ | epilogues.go:17:14:17:21 | Before selection of prefix | epilogues.go:17:14:17:14 | l | | epilogues.go:17:14:17:21 | selection of prefix | epilogues.go:17:14:17:21 | After selection of prefix | | epilogues.go:17:24:17:26 | msg | epilogues.go:17:2:17:27 | call to Println | -| epilogues.go:23:1:27:1 | After function declaration | epilogues.go:31:1:33:1 | Before function declaration | -| epilogues.go:23:1:27:1 | Before function declaration | epilogues.go:23:1:27:1 | function declaration | | epilogues.go:23:1:27:1 | Entry | epilogues.go:23:19:27:1 | block statement | | epilogues.go:23:1:27:1 | Exceptional Exit | epilogues.go:23:1:27:1 | Exit | | epilogues.go:23:1:27:1 | Normal Exit | epilogues.go:23:1:27:1 | Exit | -| epilogues.go:23:1:27:1 | function declaration | epilogues.go:23:1:27:1 | After function declaration | +| epilogues.go:23:1:27:1 | function declaration | epilogues.go:31:1:33:1 | function declaration | | epilogues.go:23:19:27:1 | After block statement | epilogues.go:23:1:27:1 | Normal Exit | | epilogues.go:23:19:27:1 | block statement | epilogues.go:24:2:26:2 | if statement | | epilogues.go:24:2:26:2 | After if statement | epilogues.go:23:19:27:1 | After block statement | @@ -165,11 +149,9 @@ | epilogues.go:25:3:25:30 | expression statement | epilogues.go:25:3:25:30 | Before call to Println | | epilogues.go:25:15:25:26 | "recovered:" | epilogues.go:25:29:25:29 | r | | epilogues.go:25:29:25:29 | r | epilogues.go:25:3:25:30 | call to Println | -| epilogues.go:31:1:33:1 | After function declaration | epilogues.go:36:1:38:1 | Before function declaration | -| epilogues.go:31:1:33:1 | Before function declaration | epilogues.go:31:1:33:1 | function declaration | | epilogues.go:31:1:33:1 | Entry | epilogues.go:31:15:31:15 | x | | epilogues.go:31:1:33:1 | Normal Exit | epilogues.go:31:1:33:1 | Exit | -| epilogues.go:31:1:33:1 | function declaration | epilogues.go:31:1:33:1 | After function declaration | +| epilogues.go:31:1:33:1 | function declaration | epilogues.go:36:1:38:1 | function declaration | | epilogues.go:31:15:31:15 | x | epilogues.go:31:26:33:1 | block statement | | epilogues.go:31:26:33:1 | block statement | epilogues.go:32:2:32:13 | Before return statement | | epilogues.go:32:2:32:13 | Before return statement | epilogues.go:32:9:32:13 | Before ...*... | @@ -179,12 +161,10 @@ | epilogues.go:32:9:32:13 | After ...*... | epilogues.go:32:2:32:13 | return statement | | epilogues.go:32:9:32:13 | Before ...*... | epilogues.go:32:9:32:9 | x | | epilogues.go:32:13:32:13 | 2 | epilogues.go:32:9:32:13 | ...*... | -| epilogues.go:36:1:38:1 | After function declaration | epilogues.go:42:1:48:1 | Before function declaration | -| epilogues.go:36:1:38:1 | Before function declaration | epilogues.go:36:1:38:1 | function declaration | | epilogues.go:36:1:38:1 | Entry | epilogues.go:36:16:38:1 | block statement | | epilogues.go:36:1:38:1 | Exceptional Exit | epilogues.go:36:1:38:1 | Exit | | epilogues.go:36:1:38:1 | Normal Exit | epilogues.go:36:1:38:1 | Exit | -| epilogues.go:36:1:38:1 | function declaration | epilogues.go:36:1:38:1 | After function declaration | +| epilogues.go:36:1:38:1 | function declaration | epilogues.go:42:1:48:1 | function declaration | | epilogues.go:36:16:38:1 | After block statement | epilogues.go:36:1:38:1 | Normal Exit | | epilogues.go:36:16:38:1 | block statement | epilogues.go:37:2:37:20 | expression statement | | epilogues.go:37:2:37:12 | After selection of Println | epilogues.go:37:14:37:19 | "void" | @@ -197,11 +177,9 @@ | epilogues.go:37:2:37:20 | call to Println | epilogues.go:37:2:37:20 | After call to Println | | epilogues.go:37:2:37:20 | expression statement | epilogues.go:37:2:37:20 | Before call to Println | | epilogues.go:37:14:37:19 | "void" | epilogues.go:37:2:37:20 | call to Println | -| epilogues.go:42:1:48:1 | After function declaration | epilogues.go:51:1:54:1 | Before function declaration | -| epilogues.go:42:1:48:1 | Before function declaration | epilogues.go:42:1:48:1 | function declaration | | epilogues.go:42:1:48:1 | Entry | epilogues.go:42:20:42:20 | x | | epilogues.go:42:1:48:1 | Normal Exit | epilogues.go:42:1:48:1 | Exit | -| epilogues.go:42:1:48:1 | function declaration | epilogues.go:42:1:48:1 | After function declaration | +| epilogues.go:42:1:48:1 | function declaration | epilogues.go:51:1:54:1 | function declaration | | epilogues.go:42:20:42:20 | x | epilogues.go:42:51:48:1 | block statement | | epilogues.go:42:51:48:1 | After block statement | epilogues.go:42:1:48:1 | Normal Exit | | epilogues.go:42:51:48:1 | block statement | epilogues.go:42:51:48:1 | zero-init:0 block statement | @@ -234,11 +212,9 @@ | epilogues.go:47:2:47:14 | return statement | epilogues.go:42:51:48:1 | result-read:0 block statement | | epilogues.go:47:9:47:9 | x | epilogues.go:47:12:47:14 | nil | | epilogues.go:47:12:47:14 | nil | epilogues.go:47:2:47:14 | result-write:0 return statement | -| epilogues.go:51:1:54:1 | After function declaration | epilogues.go:59:1:62:1 | Before function declaration | -| epilogues.go:51:1:54:1 | Before function declaration | epilogues.go:51:1:54:1 | function declaration | | epilogues.go:51:1:54:1 | Entry | epilogues.go:51:23:51:23 | x | | epilogues.go:51:1:54:1 | Normal Exit | epilogues.go:51:1:54:1 | Exit | -| epilogues.go:51:1:54:1 | function declaration | epilogues.go:51:1:54:1 | After function declaration | +| epilogues.go:51:1:54:1 | function declaration | epilogues.go:59:1:62:1 | function declaration | | epilogues.go:51:23:51:23 | x | epilogues.go:51:38:54:1 | block statement | | epilogues.go:51:38:54:1 | After block statement | epilogues.go:51:1:54:1 | Normal Exit | | epilogues.go:51:38:54:1 | block statement | epilogues.go:51:38:54:1 | zero-init:0 block statement | @@ -254,12 +230,10 @@ | epilogues.go:52:10:52:10 | 1 | epilogues.go:52:6:52:10 | ...+... | | epilogues.go:53:2:53:7 | Before return statement | epilogues.go:53:2:53:7 | return statement | | epilogues.go:53:2:53:7 | return statement | epilogues.go:51:38:54:1 | result-read:0 block statement | -| epilogues.go:59:1:62:1 | After function declaration | epilogues.go:66:1:71:1 | Before function declaration | -| epilogues.go:59:1:62:1 | Before function declaration | epilogues.go:59:1:62:1 | function declaration | | epilogues.go:59:1:62:1 | Entry | epilogues.go:59:27:59:27 | l | | epilogues.go:59:1:62:1 | Exceptional Exit | epilogues.go:59:1:62:1 | Exit | | epilogues.go:59:1:62:1 | Normal Exit | epilogues.go:59:1:62:1 | Exit | -| epilogues.go:59:1:62:1 | function declaration | epilogues.go:59:1:62:1 | After function declaration | +| epilogues.go:59:1:62:1 | function declaration | epilogues.go:66:1:71:1 | function declaration | | epilogues.go:59:27:59:27 | l | epilogues.go:59:41:59:45 | items | | epilogues.go:59:41:59:45 | items | epilogues.go:59:54:62:1 | block statement | | epilogues.go:59:54:62:1 | After block statement | epilogues.go:59:1:62:1 | Normal Exit | @@ -298,12 +272,10 @@ | epilogues.go:61:28:61:37 | Before call to len | epilogues.go:61:28:61:30 | len | | epilogues.go:61:28:61:37 | call to len | epilogues.go:61:28:61:37 | After call to len | | epilogues.go:61:32:61:36 | items | epilogues.go:61:28:61:37 | call to len | -| epilogues.go:66:1:71:1 | After function declaration | epilogues.go:77:1:82:1 | Before function declaration | -| epilogues.go:66:1:71:1 | Before function declaration | epilogues.go:66:1:71:1 | function declaration | | epilogues.go:66:1:71:1 | Entry | epilogues.go:66:28:66:33 | prefix | | epilogues.go:66:1:71:1 | Exceptional Exit | epilogues.go:66:1:71:1 | Exit | | epilogues.go:66:1:71:1 | Normal Exit | epilogues.go:66:1:71:1 | Exit | -| epilogues.go:66:1:71:1 | function declaration | epilogues.go:66:1:71:1 | After function declaration | +| epilogues.go:66:1:71:1 | function declaration | epilogues.go:77:1:82:1 | function declaration | | epilogues.go:66:28:66:33 | prefix | epilogues.go:66:43:71:1 | block statement | | epilogues.go:66:43:71:1 | After block statement | epilogues.go:66:1:71:1 | Normal Exit | | epilogues.go:66:43:71:1 | block statement | epilogues.go:67:2:67:31 | ... := ... | @@ -359,12 +331,10 @@ | epilogues.go:70:2:70:20 | catch-panic expression statement | epilogues.go:69:8:69:25 | defer-invoke call to log | | epilogues.go:70:2:70:20 | expression statement | epilogues.go:70:2:70:20 | Before call to Println | | epilogues.go:70:14:70:19 | "body" | epilogues.go:70:2:70:20 | call to Println | -| epilogues.go:77:1:82:1 | After function declaration | epilogues.go:87:1:98:1 | Before function declaration | -| epilogues.go:77:1:82:1 | Before function declaration | epilogues.go:77:1:82:1 | function declaration | | epilogues.go:77:1:82:1 | Entry | epilogues.go:77:22:77:22 | x | | epilogues.go:77:1:82:1 | Exceptional Exit | epilogues.go:77:1:82:1 | Exit | | epilogues.go:77:1:82:1 | Normal Exit | epilogues.go:77:1:82:1 | Exit | -| epilogues.go:77:1:82:1 | function declaration | epilogues.go:77:1:82:1 | After function declaration | +| epilogues.go:77:1:82:1 | function declaration | epilogues.go:87:1:98:1 | function declaration | | epilogues.go:77:22:77:22 | x | epilogues.go:77:29:82:1 | block statement | | epilogues.go:77:29:82:1 | After block statement | epilogues.go:77:1:82:1 | Normal Exit | | epilogues.go:77:29:82:1 | block statement | epilogues.go:78:2:80:15 | Before defer statement | @@ -413,12 +383,10 @@ | epilogues.go:81:2:81:23 | expression statement | epilogues.go:81:2:81:23 | Before call to Println | | epilogues.go:81:14:81:19 | "body" | epilogues.go:81:22:81:22 | x | | epilogues.go:81:22:81:22 | x | epilogues.go:81:2:81:23 | call to Println | -| epilogues.go:87:1:98:1 | After function declaration | epilogues.go:102:1:110:1 | Before function declaration | -| epilogues.go:87:1:98:1 | Before function declaration | epilogues.go:87:1:98:1 | function declaration | | epilogues.go:87:1:98:1 | Entry | epilogues.go:87:22:87:22 | x | | epilogues.go:87:1:98:1 | Exceptional Exit | epilogues.go:87:1:98:1 | Exit | | epilogues.go:87:1:98:1 | Normal Exit | epilogues.go:87:1:98:1 | Exit | -| epilogues.go:87:1:98:1 | function declaration | epilogues.go:87:1:98:1 | After function declaration | +| epilogues.go:87:1:98:1 | function declaration | epilogues.go:102:1:110:1 | function declaration | | epilogues.go:87:22:87:22 | x | epilogues.go:87:42:98:1 | block statement | | epilogues.go:87:42:98:1 | After block statement | epilogues.go:87:1:98:1 | Normal Exit | | epilogues.go:87:42:98:1 | block statement | epilogues.go:87:42:98:1 | zero-init:0 block statement | @@ -490,12 +458,10 @@ | epilogues.go:97:2:97:14 | result-write:0 return statement | epilogues.go:97:2:97:14 | return statement | | epilogues.go:97:2:97:14 | return statement | epilogues.go:97:2:97:14 | catch-return return statement | | epilogues.go:97:9:97:14 | result | epilogues.go:97:2:97:14 | result-write:0 return statement | -| epilogues.go:102:1:110:1 | After function declaration | epilogues.go:115:1:118:1 | Before function declaration | -| epilogues.go:102:1:110:1 | Before function declaration | epilogues.go:102:1:110:1 | function declaration | | epilogues.go:102:1:110:1 | Entry | epilogues.go:102:26:102:26 | x | | epilogues.go:102:1:110:1 | Exceptional Exit | epilogues.go:102:1:110:1 | Exit | | epilogues.go:102:1:110:1 | Normal Exit | epilogues.go:102:1:110:1 | Exit | -| epilogues.go:102:1:110:1 | function declaration | epilogues.go:102:1:110:1 | After function declaration | +| epilogues.go:102:1:110:1 | function declaration | epilogues.go:115:1:118:1 | function declaration | | epilogues.go:102:26:102:26 | x | epilogues.go:102:50:110:1 | block statement | | epilogues.go:102:50:110:1 | After block statement | epilogues.go:102:1:110:1 | Normal Exit | | epilogues.go:102:50:110:1 | block statement | epilogues.go:102:50:110:1 | zero-init:0 block statement | @@ -536,12 +502,10 @@ | epilogues.go:109:2:109:7 | Before return statement | epilogues.go:109:2:109:7 | return statement | | epilogues.go:109:2:109:7 | catch-return return statement | epilogues.go:103:8:103:19 | defer-invoke call to epiRecover | | epilogues.go:109:2:109:7 | return statement | epilogues.go:109:2:109:7 | catch-return return statement | -| epilogues.go:115:1:118:1 | After function declaration | epilogues.go:0:0:0:0 | After epilogues.go | -| epilogues.go:115:1:118:1 | Before function declaration | epilogues.go:115:1:118:1 | function declaration | | epilogues.go:115:1:118:1 | Entry | epilogues.go:115:26:118:1 | block statement | | epilogues.go:115:1:118:1 | Exceptional Exit | epilogues.go:115:1:118:1 | Exit | | epilogues.go:115:1:118:1 | Normal Exit | epilogues.go:115:1:118:1 | Exit | -| epilogues.go:115:1:118:1 | function declaration | epilogues.go:115:1:118:1 | After function declaration | +| epilogues.go:115:1:118:1 | function declaration | epilogues.go:0:0:0:0 | After epilogues.go | | epilogues.go:115:26:118:1 | After block statement | epilogues.go:115:1:118:1 | Normal Exit | | epilogues.go:115:26:118:1 | block statement | epilogues.go:116:2:116:19 | Before defer statement | | epilogues.go:116:2:116:19 | After defer statement | epilogues.go:117:2:117:14 | expression statement | @@ -563,17 +527,11 @@ | equalitytests.go:0:0:0:0 | Entry | equalitytests.go:0:0:0:0 | equalitytests.go | | equalitytests.go:0:0:0:0 | Normal Exit | equalitytests.go:0:0:0:0 | Exit | | equalitytests.go:0:0:0:0 | equalitytests.go | equalitytests.go:3:1:5:1 | type declaration | -| equalitytests.go:3:1:5:1 | After type declaration | equalitytests.go:7:1:9:1 | type declaration | -| equalitytests.go:3:1:5:1 | type declaration | equalitytests.go:3:6:5:1 | type declaration specifier | -| equalitytests.go:3:6:5:1 | type declaration specifier | equalitytests.go:3:1:5:1 | After type declaration | -| equalitytests.go:7:1:9:1 | After type declaration | equalitytests.go:11:1:13:1 | Before function declaration | -| equalitytests.go:7:1:9:1 | type declaration | equalitytests.go:7:6:9:1 | type declaration specifier | -| equalitytests.go:7:6:9:1 | type declaration specifier | equalitytests.go:7:1:9:1 | After type declaration | -| equalitytests.go:11:1:13:1 | After function declaration | equalitytests.go:0:0:0:0 | After equalitytests.go | -| equalitytests.go:11:1:13:1 | Before function declaration | equalitytests.go:11:1:13:1 | function declaration | +| equalitytests.go:3:1:5:1 | type declaration | equalitytests.go:7:1:9:1 | type declaration | +| equalitytests.go:7:1:9:1 | type declaration | equalitytests.go:11:1:13:1 | function declaration | | equalitytests.go:11:1:13:1 | Entry | equalitytests.go:11:20:11:21 | i1 | | equalitytests.go:11:1:13:1 | Normal Exit | equalitytests.go:11:1:13:1 | Exit | -| equalitytests.go:11:1:13:1 | function declaration | equalitytests.go:11:1:13:1 | After function declaration | +| equalitytests.go:11:1:13:1 | function declaration | equalitytests.go:0:0:0:0 | After equalitytests.go | | equalitytests.go:11:20:11:21 | i1 | equalitytests.go:11:28:11:29 | i2 | | equalitytests.go:11:28:11:29 | i2 | equalitytests.go:11:36:11:37 | e1 | | equalitytests.go:11:36:11:37 | e1 | equalitytests.go:11:46:11:47 | e2 | @@ -648,15 +606,11 @@ | exprs.go:0:0:0:0 | Exceptional Exit | exprs.go:0:0:0:0 | Exit | | exprs.go:0:0:0:0 | Normal Exit | exprs.go:0:0:0:0 | Exit | | exprs.go:0:0:0:0 | exprs.go | exprs.go:3:1:3:29 | type declaration | -| exprs.go:3:1:3:29 | After type declaration | exprs.go:5:1:26:1 | Before function declaration | -| exprs.go:3:1:3:29 | type declaration | exprs.go:3:6:3:29 | type declaration specifier | -| exprs.go:3:6:3:29 | type declaration specifier | exprs.go:3:1:3:29 | After type declaration | -| exprs.go:5:1:26:1 | After function declaration | exprs.go:28:1:30:1 | Before function declaration | -| exprs.go:5:1:26:1 | Before function declaration | exprs.go:5:1:26:1 | function declaration | +| exprs.go:3:1:3:29 | type declaration | exprs.go:5:1:26:1 | function declaration | | exprs.go:5:1:26:1 | Entry | exprs.go:5:19:26:1 | block statement | | exprs.go:5:1:26:1 | Exceptional Exit | exprs.go:5:1:26:1 | Exit | | exprs.go:5:1:26:1 | Normal Exit | exprs.go:5:1:26:1 | Exit | -| exprs.go:5:1:26:1 | function declaration | exprs.go:5:1:26:1 | After function declaration | +| exprs.go:5:1:26:1 | function declaration | exprs.go:28:1:30:1 | function declaration | | exprs.go:5:19:26:1 | block statement | exprs.go:6:2:6:26 | declaration statement | | exprs.go:6:2:6:26 | After declaration statement | exprs.go:7:2:7:16 | declaration statement | | exprs.go:6:2:6:26 | After variable declaration | exprs.go:6:2:6:26 | After declaration statement | @@ -903,12 +857,10 @@ | exprs.go:25:26:25:32 | index expression | exprs.go:5:1:26:1 | Exceptional Exit | | exprs.go:25:26:25:32 | index expression | exprs.go:25:26:25:32 | After index expression | | exprs.go:25:31:25:31 | 0 | exprs.go:25:26:25:32 | index expression | -| exprs.go:28:1:30:1 | After function declaration | exprs.go:32:1:37:1 | Before function declaration | -| exprs.go:28:1:30:1 | Before function declaration | exprs.go:28:1:30:1 | function declaration | | exprs.go:28:1:30:1 | Entry | exprs.go:28:12:28:14 | arg | | exprs.go:28:1:30:1 | Exceptional Exit | exprs.go:28:1:30:1 | Exit | | exprs.go:28:1:30:1 | Normal Exit | exprs.go:28:1:30:1 | Exit | -| exprs.go:28:1:30:1 | function declaration | exprs.go:28:1:30:1 | After function declaration | +| exprs.go:28:1:30:1 | function declaration | exprs.go:32:1:37:1 | function declaration | | exprs.go:28:12:28:14 | arg | exprs.go:28:33:30:1 | block statement | | exprs.go:28:33:30:1 | block statement | exprs.go:29:2:29:21 | Before return statement | | exprs.go:29:2:29:21 | Before return statement | exprs.go:29:9:29:21 | Before selection of x | @@ -921,11 +873,9 @@ | exprs.go:29:9:29:21 | After selection of x | exprs.go:29:2:29:21 | return statement | | exprs.go:29:9:29:21 | Before selection of x | exprs.go:29:9:29:19 | Before type assertion | | exprs.go:29:9:29:21 | selection of x | exprs.go:29:9:29:21 | After selection of x | -| exprs.go:32:1:37:1 | After function declaration | exprs.go:39:1:47:1 | Before function declaration | -| exprs.go:32:1:37:1 | Before function declaration | exprs.go:32:1:37:1 | function declaration | | exprs.go:32:1:37:1 | Entry | exprs.go:32:12:32:14 | arg | | exprs.go:32:1:37:1 | Normal Exit | exprs.go:32:1:37:1 | Exit | -| exprs.go:32:1:37:1 | function declaration | exprs.go:32:1:37:1 | After function declaration | +| exprs.go:32:1:37:1 | function declaration | exprs.go:39:1:47:1 | function declaration | | exprs.go:32:12:32:14 | arg | exprs.go:32:33:37:1 | block statement | | exprs.go:32:33:37:1 | block statement | exprs.go:33:2:35:2 | if statement | | exprs.go:33:2:35:2 | After if statement | exprs.go:36:2:36:10 | Before return statement | @@ -954,11 +904,9 @@ | exprs.go:36:9:36:10 | -... | exprs.go:36:9:36:10 | After -... | | exprs.go:36:9:36:10 | After -... | exprs.go:36:2:36:10 | return statement | | exprs.go:36:9:36:10 | Before -... | exprs.go:36:9:36:10 | -... | -| exprs.go:39:1:47:1 | After function declaration | exprs.go:49:1:54:1 | Before function declaration | -| exprs.go:39:1:47:1 | Before function declaration | exprs.go:39:1:47:1 | function declaration | | exprs.go:39:1:47:1 | Entry | exprs.go:39:12:39:14 | arg | | exprs.go:39:1:47:1 | Normal Exit | exprs.go:39:1:47:1 | Exit | -| exprs.go:39:1:47:1 | function declaration | exprs.go:39:1:47:1 | After function declaration | +| exprs.go:39:1:47:1 | function declaration | exprs.go:49:1:54:1 | function declaration | | exprs.go:39:12:39:14 | arg | exprs.go:39:33:47:1 | block statement | | exprs.go:39:33:47:1 | block statement | exprs.go:40:2:40:12 | declaration statement | | exprs.go:40:2:40:12 | After declaration statement | exprs.go:41:2:41:12 | declaration statement | @@ -1001,12 +949,10 @@ | exprs.go:46:9:46:10 | -... | exprs.go:46:9:46:10 | After -... | | exprs.go:46:9:46:10 | After -... | exprs.go:46:2:46:10 | return statement | | exprs.go:46:9:46:10 | Before -... | exprs.go:46:9:46:10 | -... | -| exprs.go:49:1:54:1 | After function declaration | exprs.go:56:1:58:1 | Before function declaration | -| exprs.go:49:1:54:1 | Before function declaration | exprs.go:49:1:54:1 | function declaration | | exprs.go:49:1:54:1 | Entry | exprs.go:49:10:49:11 | xs | | exprs.go:49:1:54:1 | Exceptional Exit | exprs.go:49:1:54:1 | Exit | | exprs.go:49:1:54:1 | Normal Exit | exprs.go:49:1:54:1 | Exit | -| exprs.go:49:1:54:1 | function declaration | exprs.go:49:1:54:1 | After function declaration | +| exprs.go:49:1:54:1 | function declaration | exprs.go:56:1:58:1 | function declaration | | exprs.go:49:10:49:11 | xs | exprs.go:49:30:54:1 | block statement | | exprs.go:49:30:54:1 | After block statement | exprs.go:49:1:54:1 | Normal Exit | | exprs.go:49:30:54:1 | block statement | exprs.go:49:30:54:1 | zero-init:0 block statement | @@ -1048,12 +994,10 @@ | exprs.go:51:13:51:13 | i | exprs.go:51:10:51:14 | index expression | | exprs.go:53:2:53:7 | Before return statement | exprs.go:53:2:53:7 | return statement | | exprs.go:53:2:53:7 | return statement | exprs.go:49:30:54:1 | result-read:0 block statement | -| exprs.go:56:1:58:1 | After function declaration | exprs.go:60:1:62:1 | Before function declaration | -| exprs.go:56:1:58:1 | Before function declaration | exprs.go:56:1:58:1 | function declaration | | exprs.go:56:1:58:1 | Entry | exprs.go:56:11:56:12 | xs | | exprs.go:56:1:58:1 | Exceptional Exit | exprs.go:56:1:58:1 | Exit | | exprs.go:56:1:58:1 | Normal Exit | exprs.go:56:1:58:1 | Exit | -| exprs.go:56:1:58:1 | function declaration | exprs.go:56:1:58:1 | After function declaration | +| exprs.go:56:1:58:1 | function declaration | exprs.go:60:1:62:1 | function declaration | | exprs.go:56:11:56:12 | xs | exprs.go:56:26:58:1 | block statement | | exprs.go:56:26:58:1 | block statement | exprs.go:57:2:57:15 | Before return statement | | exprs.go:57:2:57:15 | Before return statement | exprs.go:57:9:57:15 | Before call to sum | @@ -1064,11 +1008,9 @@ | exprs.go:57:9:57:15 | call to sum | exprs.go:56:1:58:1 | Exceptional Exit | | exprs.go:57:9:57:15 | call to sum | exprs.go:57:9:57:15 | After call to sum | | exprs.go:57:13:57:14 | xs | exprs.go:57:9:57:15 | call to sum | -| exprs.go:60:1:62:1 | After function declaration | exprs.go:64:1:64:19 | variable declaration | -| exprs.go:60:1:62:1 | Before function declaration | exprs.go:60:1:62:1 | function declaration | | exprs.go:60:1:62:1 | Entry | exprs.go:60:19:62:1 | block statement | | exprs.go:60:1:62:1 | Normal Exit | exprs.go:60:1:62:1 | Exit | -| exprs.go:60:1:62:1 | function declaration | exprs.go:60:1:62:1 | After function declaration | +| exprs.go:60:1:62:1 | function declaration | exprs.go:64:1:64:19 | variable declaration | | exprs.go:60:19:62:1 | block statement | exprs.go:61:2:61:22 | Before return statement | | exprs.go:61:2:61:22 | Before return statement | exprs.go:61:9:61:22 | Before slice literal | | exprs.go:61:2:61:22 | return statement | exprs.go:60:1:62:1 | Normal Exit | @@ -1099,7 +1041,7 @@ | exprs.go:64:13:64:18 | Before call to ints | exprs.go:64:13:64:16 | ints | | exprs.go:64:13:64:18 | call to ints | exprs.go:0:0:0:0 | Exceptional Exit | | exprs.go:64:13:64:18 | call to ints | exprs.go:64:13:64:18 | After call to ints | -| exprs.go:65:1:65:24 | After variable declaration | exprs.go:67:1:69:1 | Before function declaration | +| exprs.go:65:1:65:24 | After variable declaration | exprs.go:67:1:69:1 | function declaration | | exprs.go:65:1:65:24 | variable declaration | exprs.go:65:5:65:24 | value declaration specifier | | exprs.go:65:5:65:24 | After value declaration specifier | exprs.go:65:1:65:24 | After variable declaration | | exprs.go:65:5:65:24 | assign:0 value declaration specifier | exprs.go:65:5:65:24 | After value declaration specifier | @@ -1114,11 +1056,9 @@ | exprs.go:65:15:65:20 | Before call to ints | exprs.go:65:15:65:18 | ints | | exprs.go:65:15:65:20 | call to ints | exprs.go:0:0:0:0 | Exceptional Exit | | exprs.go:65:15:65:20 | call to ints | exprs.go:65:15:65:20 | After call to ints | -| exprs.go:67:1:69:1 | After function declaration | exprs.go:71:1:73:1 | Before function declaration | -| exprs.go:67:1:69:1 | Before function declaration | exprs.go:67:1:69:1 | function declaration | | exprs.go:67:1:69:1 | Entry | exprs.go:67:10:67:10 | x | | exprs.go:67:1:69:1 | Normal Exit | exprs.go:67:1:69:1 | Exit | -| exprs.go:67:1:69:1 | function declaration | exprs.go:67:1:69:1 | After function declaration | +| exprs.go:67:1:69:1 | function declaration | exprs.go:71:1:73:1 | function declaration | | exprs.go:67:10:67:10 | x | exprs.go:67:13:67:13 | y | | exprs.go:67:13:67:13 | y | exprs.go:67:24:69:1 | block statement | | exprs.go:67:24:69:1 | block statement | exprs.go:68:2:68:13 | Before return statement | @@ -1129,17 +1069,15 @@ | exprs.go:68:9:68:13 | After ...+... | exprs.go:68:2:68:13 | return statement | | exprs.go:68:9:68:13 | Before ...+... | exprs.go:68:9:68:9 | x | | exprs.go:68:13:68:13 | y | exprs.go:68:9:68:13 | ...+... | -| exprs.go:71:1:73:1 | After function declaration | exprs.go:75:1:75:19 | variable declaration | -| exprs.go:71:1:73:1 | Before function declaration | exprs.go:71:1:73:1 | function declaration | | exprs.go:71:1:73:1 | Entry | exprs.go:71:23:73:1 | block statement | | exprs.go:71:1:73:1 | Normal Exit | exprs.go:71:1:73:1 | Exit | -| exprs.go:71:1:73:1 | function declaration | exprs.go:71:1:73:1 | After function declaration | +| exprs.go:71:1:73:1 | function declaration | exprs.go:75:1:75:19 | variable declaration | | exprs.go:71:23:73:1 | block statement | exprs.go:72:2:72:12 | Before return statement | | exprs.go:72:2:72:12 | Before return statement | exprs.go:72:9:72:9 | 1 | | exprs.go:72:2:72:12 | return statement | exprs.go:71:1:73:1 | Normal Exit | | exprs.go:72:9:72:9 | 1 | exprs.go:72:12:72:12 | 2 | | exprs.go:72:12:72:12 | 2 | exprs.go:72:2:72:12 | return statement | -| exprs.go:75:1:75:19 | After variable declaration | exprs.go:77:1:79:1 | Before function declaration | +| exprs.go:75:1:75:19 | After variable declaration | exprs.go:77:1:79:1 | function declaration | | exprs.go:75:1:75:19 | variable declaration | exprs.go:75:5:75:19 | value declaration specifier | | exprs.go:75:5:75:19 | After value declaration specifier | exprs.go:75:1:75:19 | After variable declaration | | exprs.go:75:5:75:19 | assign:0 value declaration specifier | exprs.go:75:5:75:19 | After value declaration specifier | @@ -1156,11 +1094,9 @@ | exprs.go:75:14:75:18 | Before call to gen | exprs.go:75:14:75:16 | gen | | exprs.go:75:14:75:18 | call to gen | exprs.go:0:0:0:0 | Exceptional Exit | | exprs.go:75:14:75:18 | call to gen | exprs.go:75:14:75:18 | After call to gen | -| exprs.go:77:1:79:1 | After function declaration | exprs.go:81:1:87:1 | Before function declaration | -| exprs.go:77:1:79:1 | Before function declaration | exprs.go:77:1:79:1 | function declaration | | exprs.go:77:1:79:1 | Entry | exprs.go:77:12:77:12 | x | | exprs.go:77:1:79:1 | Normal Exit | exprs.go:77:1:79:1 | Exit | -| exprs.go:77:1:79:1 | function declaration | exprs.go:77:1:79:1 | After function declaration | +| exprs.go:77:1:79:1 | function declaration | exprs.go:81:1:87:1 | function declaration | | exprs.go:77:12:77:12 | x | exprs.go:77:15:77:15 | y | | exprs.go:77:15:77:15 | y | exprs.go:77:18:77:18 | z | | exprs.go:77:18:77:18 | z | exprs.go:77:31:79:1 | block statement | @@ -1184,12 +1120,10 @@ | exprs.go:78:16:78:16 | y | exprs.go:78:16:78:16 | After y [false] | | exprs.go:78:16:78:16 | y | exprs.go:78:16:78:16 | After y [true] | | exprs.go:78:22:78:22 | z | exprs.go:78:9:78:22 | After ...\|\|... | -| exprs.go:81:1:87:1 | After function declaration | exprs.go:89:1:89:13 | constant declaration | -| exprs.go:81:1:87:1 | Before function declaration | exprs.go:81:1:87:1 | function declaration | | exprs.go:81:1:87:1 | Entry | exprs.go:81:18:81:19 | ch | | exprs.go:81:1:87:1 | Exceptional Exit | exprs.go:81:1:87:1 | Exit | | exprs.go:81:1:87:1 | Normal Exit | exprs.go:81:1:87:1 | Exit | -| exprs.go:81:1:87:1 | function declaration | exprs.go:81:1:87:1 | After function declaration | +| exprs.go:81:1:87:1 | function declaration | exprs.go:89:1:89:13 | constant declaration | | exprs.go:81:18:81:19 | ch | exprs.go:81:35:87:1 | block statement | | exprs.go:81:35:87:1 | block statement | exprs.go:82:2:82:16 | ... := ... | | exprs.go:82:2:82:16 | ... := ... | exprs.go:82:13:82:16 | Before <-... | @@ -1221,7 +1155,7 @@ | exprs.go:89:7:89:13 | assign:0 value declaration specifier | exprs.go:89:7:89:13 | After value declaration specifier | | exprs.go:89:7:89:13 | value declaration specifier | exprs.go:89:13:89:13 | 1 | | exprs.go:89:13:89:13 | 1 | exprs.go:89:7:89:13 | assign:0 value declaration specifier | -| exprs.go:91:1:91:25 | After variable declaration | exprs.go:93:1:95:1 | Before function declaration | +| exprs.go:91:1:91:25 | After variable declaration | exprs.go:93:1:95:1 | function declaration | | exprs.go:91:1:91:25 | variable declaration | exprs.go:91:5:91:25 | value declaration specifier | | exprs.go:91:5:91:25 | After value declaration specifier | exprs.go:91:1:91:25 | After variable declaration | | exprs.go:91:5:91:25 | assign:0 value declaration specifier | exprs.go:91:5:91:25 | After value declaration specifier | @@ -1237,11 +1171,9 @@ | exprs.go:91:15:91:24 | key-value pair | exprs.go:91:15:91:24 | After key-value pair | | exprs.go:91:15:91:24 | lit-init key-value pair | exprs.go:91:9:91:25 | After slice literal | | exprs.go:91:24:91:24 | 2 | exprs.go:91:15:91:24 | key-value pair | -| exprs.go:93:1:95:1 | After function declaration | exprs.go:0:0:0:0 | After exprs.go | -| exprs.go:93:1:95:1 | Before function declaration | exprs.go:93:1:95:1 | function declaration | | exprs.go:93:1:95:1 | Entry | exprs.go:93:13:93:13 | x | | exprs.go:93:1:95:1 | Normal Exit | exprs.go:93:1:95:1 | Exit | -| exprs.go:93:1:95:1 | function declaration | exprs.go:93:1:95:1 | After function declaration | +| exprs.go:93:1:95:1 | function declaration | exprs.go:0:0:0:0 | After exprs.go | | exprs.go:93:13:93:13 | x | exprs.go:93:16:93:16 | y | | exprs.go:93:16:93:16 | y | exprs.go:93:19:93:19 | z | | exprs.go:93:19:93:19 | z | exprs.go:93:32:95:1 | block statement | @@ -1266,49 +1198,37 @@ | generic.go:0:0:0:0 | Entry | generic.go:0:0:0:0 | generic.go | | generic.go:0:0:0:0 | Normal Exit | generic.go:0:0:0:0 | Exit | | generic.go:0:0:0:0 | generic.go | generic.go:3:1:5:1 | type declaration | -| generic.go:3:1:5:1 | After type declaration | generic.go:7:1:7:55 | Before function declaration | -| generic.go:3:1:5:1 | type declaration | generic.go:3:6:5:1 | type declaration specifier | -| generic.go:3:6:5:1 | type declaration specifier | generic.go:3:1:5:1 | After type declaration | -| generic.go:7:1:7:55 | After function declaration | generic.go:9:1:12:1 | type declaration | -| generic.go:7:1:7:55 | Before function declaration | generic.go:7:1:7:55 | function declaration | +| generic.go:3:1:5:1 | type declaration | generic.go:7:1:7:55 | function declaration | | generic.go:7:1:7:55 | Entry | generic.go:7:7:7:7 | g | | generic.go:7:1:7:55 | Normal Exit | generic.go:7:1:7:55 | Exit | -| generic.go:7:1:7:55 | function declaration | generic.go:7:1:7:55 | After function declaration | +| generic.go:7:1:7:55 | function declaration | generic.go:9:1:12:1 | type declaration | | generic.go:7:7:7:7 | g | generic.go:7:37:7:37 | u | | generic.go:7:37:7:37 | u | generic.go:7:44:7:55 | block statement | | generic.go:7:44:7:55 | block statement | generic.go:7:46:7:53 | Before return statement | | generic.go:7:46:7:53 | Before return statement | generic.go:7:53:7:53 | u | | generic.go:7:46:7:53 | return statement | generic.go:7:1:7:55 | Normal Exit | | generic.go:7:53:7:53 | u | generic.go:7:46:7:53 | return statement | -| generic.go:9:1:12:1 | After type declaration | generic.go:14:1:14:59 | Before function declaration | -| generic.go:9:1:12:1 | type declaration | generic.go:9:6:12:1 | type declaration specifier | -| generic.go:9:6:12:1 | type declaration specifier | generic.go:9:1:12:1 | After type declaration | -| generic.go:14:1:14:59 | After function declaration | generic.go:16:1:18:1 | Before function declaration | -| generic.go:14:1:14:59 | Before function declaration | generic.go:14:1:14:59 | function declaration | +| generic.go:9:1:12:1 | type declaration | generic.go:14:1:14:59 | function declaration | | generic.go:14:1:14:59 | Entry | generic.go:14:7:14:7 | g | | generic.go:14:1:14:59 | Normal Exit | generic.go:14:1:14:59 | Exit | -| generic.go:14:1:14:59 | function declaration | generic.go:14:1:14:59 | After function declaration | +| generic.go:14:1:14:59 | function declaration | generic.go:16:1:18:1 | function declaration | | generic.go:14:7:14:7 | g | generic.go:14:41:14:41 | u | | generic.go:14:41:14:41 | u | generic.go:14:48:14:59 | block statement | | generic.go:14:48:14:59 | block statement | generic.go:14:50:14:57 | Before return statement | | generic.go:14:50:14:57 | Before return statement | generic.go:14:57:14:57 | u | | generic.go:14:50:14:57 | return statement | generic.go:14:1:14:59 | Normal Exit | | generic.go:14:57:14:57 | u | generic.go:14:50:14:57 | return statement | -| generic.go:16:1:18:1 | After function declaration | generic.go:20:1:22:1 | Before function declaration | -| generic.go:16:1:18:1 | Before function declaration | generic.go:16:1:18:1 | function declaration | | generic.go:16:1:18:1 | Entry | generic.go:16:30:16:30 | t | | generic.go:16:1:18:1 | Normal Exit | generic.go:16:1:18:1 | Exit | -| generic.go:16:1:18:1 | function declaration | generic.go:16:1:18:1 | After function declaration | +| generic.go:16:1:18:1 | function declaration | generic.go:20:1:22:1 | function declaration | | generic.go:16:30:16:30 | t | generic.go:16:37:18:1 | block statement | | generic.go:16:37:18:1 | block statement | generic.go:17:2:17:9 | Before return statement | | generic.go:17:2:17:9 | Before return statement | generic.go:17:9:17:9 | t | | generic.go:17:2:17:9 | return statement | generic.go:16:1:18:1 | Normal Exit | | generic.go:17:9:17:9 | t | generic.go:17:2:17:9 | return statement | -| generic.go:20:1:22:1 | After function declaration | generic.go:24:1:35:1 | Before function declaration | -| generic.go:20:1:22:1 | Before function declaration | generic.go:20:1:22:1 | function declaration | | generic.go:20:1:22:1 | Entry | generic.go:20:33:20:33 | s | | generic.go:20:1:22:1 | Normal Exit | generic.go:20:1:22:1 | Exit | -| generic.go:20:1:22:1 | function declaration | generic.go:20:1:22:1 | After function declaration | +| generic.go:20:1:22:1 | function declaration | generic.go:24:1:35:1 | function declaration | | generic.go:20:33:20:33 | s | generic.go:20:38:20:38 | t | | generic.go:20:38:20:38 | t | generic.go:20:50:22:1 | block statement | | generic.go:20:50:22:1 | block statement | generic.go:21:2:21:12 | Before return statement | @@ -1316,12 +1236,10 @@ | generic.go:21:2:21:12 | return statement | generic.go:20:1:22:1 | Normal Exit | | generic.go:21:9:21:9 | s | generic.go:21:12:21:12 | t | | generic.go:21:12:21:12 | t | generic.go:21:2:21:12 | return statement | -| generic.go:24:1:35:1 | After function declaration | generic.go:0:0:0:0 | After generic.go | -| generic.go:24:1:35:1 | Before function declaration | generic.go:24:1:35:1 | function declaration | | generic.go:24:1:35:1 | Entry | generic.go:24:16:35:1 | block statement | | generic.go:24:1:35:1 | Exceptional Exit | generic.go:24:1:35:1 | Exit | | generic.go:24:1:35:1 | Normal Exit | generic.go:24:1:35:1 | Exit | -| generic.go:24:1:35:1 | function declaration | generic.go:24:1:35:1 | After function declaration | +| generic.go:24:1:35:1 | function declaration | generic.go:0:0:0:0 | After generic.go | | generic.go:24:16:35:1 | After block statement | generic.go:24:1:35:1 | Normal Exit | | generic.go:24:16:35:1 | block statement | generic.go:25:2:25:35 | ... := ... | | generic.go:25:2:25:35 | ... := ... | generic.go:25:9:25:35 | Before struct literal | @@ -1425,21 +1343,17 @@ | hello.go:0:0:0:0 | Entry | hello.go:0:0:0:0 | hello.go | | hello.go:0:0:0:0 | Normal Exit | hello.go:0:0:0:0 | Exit | | hello.go:0:0:0:0 | hello.go | hello.go:3:1:3:12 | import declaration | -| hello.go:3:1:3:12 | After import declaration | hello.go:5:1:5:31 | constant declaration | -| hello.go:3:1:3:12 | import declaration | hello.go:3:8:3:12 | import specifier | -| hello.go:3:8:3:12 | import specifier | hello.go:3:1:3:12 | After import declaration | -| hello.go:5:1:5:31 | After constant declaration | hello.go:7:1:9:1 | Before function declaration | +| hello.go:3:1:3:12 | import declaration | hello.go:5:1:5:31 | constant declaration | +| hello.go:5:1:5:31 | After constant declaration | hello.go:7:1:9:1 | function declaration | | hello.go:5:1:5:31 | constant declaration | hello.go:5:7:5:31 | value declaration specifier | | hello.go:5:7:5:31 | After value declaration specifier | hello.go:5:1:5:31 | After constant declaration | | hello.go:5:7:5:31 | assign:0 value declaration specifier | hello.go:5:7:5:31 | After value declaration specifier | | hello.go:5:7:5:31 | value declaration specifier | hello.go:5:17:5:31 | "Hello, world!" | | hello.go:5:17:5:31 | "Hello, world!" | hello.go:5:7:5:31 | assign:0 value declaration specifier | -| hello.go:7:1:9:1 | After function declaration | hello.go:0:0:0:0 | After hello.go | -| hello.go:7:1:9:1 | Before function declaration | hello.go:7:1:9:1 | function declaration | | hello.go:7:1:9:1 | Entry | hello.go:7:17:9:1 | block statement | | hello.go:7:1:9:1 | Exceptional Exit | hello.go:7:1:9:1 | Exit | | hello.go:7:1:9:1 | Normal Exit | hello.go:7:1:9:1 | Exit | -| hello.go:7:1:9:1 | function declaration | hello.go:7:1:9:1 | After function declaration | +| hello.go:7:1:9:1 | function declaration | hello.go:0:0:0:0 | After hello.go | | hello.go:7:17:9:1 | After block statement | hello.go:7:1:9:1 | Normal Exit | | hello.go:7:17:9:1 | block statement | hello.go:8:2:8:21 | expression statement | | hello.go:8:2:8:12 | After selection of Println | hello.go:8:14:8:20 | message | @@ -1456,16 +1370,11 @@ | main.go:0:0:0:0 | Entry | main.go:0:0:0:0 | main.go | | main.go:0:0:0:0 | Normal Exit | main.go:0:0:0:0 | Exit | | main.go:0:0:0:0 | main.go | main.go:3:1:6:1 | import declaration | -| main.go:3:1:6:1 | After import declaration | main.go:8:1:10:1 | Before function declaration | -| main.go:3:1:6:1 | import declaration | main.go:4:2:4:6 | import specifier | -| main.go:4:2:4:6 | import specifier | main.go:5:2:5:12 | import specifier | -| main.go:5:2:5:12 | import specifier | main.go:3:1:6:1 | After import declaration | -| main.go:8:1:10:1 | After function declaration | main.go:12:1:24:1 | Before function declaration | -| main.go:8:1:10:1 | Before function declaration | main.go:8:1:10:1 | function declaration | +| main.go:3:1:6:1 | import declaration | main.go:8:1:10:1 | function declaration | | main.go:8:1:10:1 | Entry | main.go:8:18:10:1 | block statement | | main.go:8:1:10:1 | Exceptional Exit | main.go:8:1:10:1 | Exit | | main.go:8:1:10:1 | Normal Exit | main.go:8:1:10:1 | Exit | -| main.go:8:1:10:1 | function declaration | main.go:8:1:10:1 | After function declaration | +| main.go:8:1:10:1 | function declaration | main.go:12:1:24:1 | function declaration | | main.go:8:18:10:1 | block statement | main.go:9:2:9:29 | Before return statement | | main.go:9:2:9:29 | Before return statement | main.go:9:9:9:29 | Before ...>=... | | main.go:9:2:9:29 | return statement | main.go:8:1:10:1 | Normal Exit | @@ -1480,12 +1389,10 @@ | main.go:9:9:9:29 | After ...>=... | main.go:9:2:9:29 | return statement | | main.go:9:9:9:29 | Before ...>=... | main.go:9:9:9:22 | Before call to Float64 | | main.go:9:27:9:29 | 0.5 | main.go:9:9:9:29 | ...>=... | -| main.go:12:1:24:1 | After function declaration | main.go:26:1:32:1 | Before function declaration | -| main.go:12:1:24:1 | Before function declaration | main.go:12:1:24:1 | function declaration | | main.go:12:1:24:1 | Entry | main.go:12:13:24:1 | block statement | | main.go:12:1:24:1 | Exceptional Exit | main.go:12:1:24:1 | Exit | | main.go:12:1:24:1 | Normal Exit | main.go:12:1:24:1 | Exit | -| main.go:12:1:24:1 | function declaration | main.go:12:1:24:1 | After function declaration | +| main.go:12:1:24:1 | function declaration | main.go:26:1:32:1 | function declaration | | main.go:12:13:24:1 | After block statement | main.go:12:1:24:1 | Normal Exit | | main.go:12:13:24:1 | block statement | main.go:13:2:13:10 | declaration statement | | main.go:13:2:13:10 | After declaration statement | main.go:14:2:14:8 | ... := ... | @@ -1563,12 +1470,10 @@ | main.go:23:2:23:16 | expression statement | main.go:23:2:23:16 | Before call to Print | | main.go:23:12:23:12 | x | main.go:23:15:23:15 | y | | main.go:23:15:23:15 | y | main.go:23:2:23:16 | call to Print | -| main.go:26:1:32:1 | After function declaration | main.go:34:1:36:1 | Before function declaration | -| main.go:26:1:32:1 | Before function declaration | main.go:26:1:32:1 | function declaration | | main.go:26:1:32:1 | Entry | main.go:26:10:26:10 | x | | main.go:26:1:32:1 | Exceptional Exit | main.go:26:1:32:1 | Exit | | main.go:26:1:32:1 | Normal Exit | main.go:26:1:32:1 | Exit | -| main.go:26:1:32:1 | function declaration | main.go:26:1:32:1 | After function declaration | +| main.go:26:1:32:1 | function declaration | main.go:34:1:36:1 | function declaration | | main.go:26:10:26:10 | x | main.go:26:28:32:1 | block statement | | main.go:26:28:32:1 | block statement | main.go:27:2:27:13 | ... := ... | | main.go:27:2:27:13 | ... := ... | main.go:27:10:27:10 | x | @@ -1598,11 +1503,9 @@ | main.go:31:2:31:12 | return statement | main.go:26:1:32:1 | Normal Exit | | main.go:31:9:31:9 | a | main.go:31:12:31:12 | b | | main.go:31:12:31:12 | b | main.go:31:2:31:12 | return statement | -| main.go:34:1:36:1 | After function declaration | main.go:38:1:45:1 | Before function declaration | -| main.go:34:1:36:1 | Before function declaration | main.go:34:1:36:1 | function declaration | | main.go:34:1:36:1 | Entry | main.go:34:11:34:11 | x | | main.go:34:1:36:1 | Normal Exit | main.go:34:1:36:1 | Exit | -| main.go:34:1:36:1 | function declaration | main.go:34:1:36:1 | After function declaration | +| main.go:34:1:36:1 | function declaration | main.go:38:1:45:1 | function declaration | | main.go:34:11:34:11 | x | main.go:34:19:36:1 | block statement | | main.go:34:19:36:1 | After block statement | main.go:34:1:36:1 | Normal Exit | | main.go:34:19:36:1 | block statement | main.go:35:2:35:9 | Before ... += ... | @@ -1614,12 +1517,10 @@ | main.go:35:2:35:9 | Before ... += ... | main.go:35:2:35:3 | Before star expression | | main.go:35:3:35:3 | x | main.go:35:2:35:3 | star expression | | main.go:35:8:35:9 | 19 | main.go:35:2:35:9 | ... += ... | -| main.go:38:1:45:1 | After function declaration | main.go:47:1:50:1 | Before function declaration | -| main.go:38:1:45:1 | Before function declaration | main.go:38:1:45:1 | function declaration | | main.go:38:1:45:1 | Entry | main.go:38:12:45:1 | block statement | | main.go:38:1:45:1 | Exceptional Exit | main.go:38:1:45:1 | Exit | | main.go:38:1:45:1 | Normal Exit | main.go:38:1:45:1 | Exit | -| main.go:38:1:45:1 | function declaration | main.go:38:1:45:1 | After function declaration | +| main.go:38:1:45:1 | function declaration | main.go:47:1:50:1 | function declaration | | main.go:38:12:45:1 | After block statement | main.go:38:1:45:1 | Normal Exit | | main.go:38:12:45:1 | block statement | main.go:39:2:39:8 | ... := ... | | main.go:39:2:39:8 | ... := ... | main.go:39:7:39:8 | 23 | @@ -1662,11 +1563,9 @@ | main.go:44:2:44:13 | call to Print | main.go:44:2:44:13 | After call to Print | | main.go:44:2:44:13 | expression statement | main.go:44:2:44:13 | Before call to Print | | main.go:44:12:44:12 | x | main.go:44:2:44:13 | call to Print | -| main.go:47:1:50:1 | After function declaration | main.go:52:1:54:1 | Before function declaration | -| main.go:47:1:50:1 | Before function declaration | main.go:47:1:50:1 | function declaration | | main.go:47:1:50:1 | Entry | main.go:47:25:50:1 | block statement | | main.go:47:1:50:1 | Normal Exit | main.go:47:1:50:1 | Exit | -| main.go:47:1:50:1 | function declaration | main.go:47:1:50:1 | After function declaration | +| main.go:47:1:50:1 | function declaration | main.go:52:1:54:1 | function declaration | | main.go:47:25:50:1 | After block statement | main.go:47:1:50:1 | Normal Exit | | main.go:47:25:50:1 | block statement | main.go:47:25:50:1 | zero-init:0 block statement | | main.go:47:25:50:1 | result-read:0 block statement | main.go:47:25:50:1 | After block statement | @@ -1677,22 +1576,18 @@ | main.go:48:11:48:12 | 42 | main.go:48:2:48:12 | assign:0 ... = ... | | main.go:49:2:49:7 | Before return statement | main.go:49:2:49:7 | return statement | | main.go:49:2:49:7 | return statement | main.go:47:25:50:1 | result-read:0 block statement | -| main.go:52:1:54:1 | After function declaration | main.go:56:1:64:1 | Before function declaration | -| main.go:52:1:54:1 | Before function declaration | main.go:52:1:54:1 | function declaration | | main.go:52:1:54:1 | Entry | main.go:52:26:54:1 | block statement | | main.go:52:1:54:1 | Normal Exit | main.go:52:1:54:1 | Exit | -| main.go:52:1:54:1 | function declaration | main.go:52:1:54:1 | After function declaration | +| main.go:52:1:54:1 | function declaration | main.go:56:1:64:1 | function declaration | | main.go:52:26:54:1 | After block statement | main.go:52:1:54:1 | Normal Exit | | main.go:52:26:54:1 | block statement | main.go:52:26:54:1 | zero-init:0 block statement | | main.go:52:26:54:1 | result-read:0 block statement | main.go:52:26:54:1 | After block statement | | main.go:52:26:54:1 | zero-init:0 block statement | main.go:53:2:53:7 | Before return statement | | main.go:53:2:53:7 | Before return statement | main.go:53:2:53:7 | return statement | | main.go:53:2:53:7 | return statement | main.go:52:26:54:1 | result-read:0 block statement | -| main.go:56:1:64:1 | After function declaration | main.go:66:1:90:1 | Before function declaration | -| main.go:56:1:64:1 | Before function declaration | main.go:56:1:64:1 | function declaration | | main.go:56:1:64:1 | Entry | main.go:56:11:56:18 | selector | | main.go:56:1:64:1 | Normal Exit | main.go:56:1:64:1 | Exit | -| main.go:56:1:64:1 | function declaration | main.go:56:1:64:1 | After function declaration | +| main.go:56:1:64:1 | function declaration | main.go:66:1:90:1 | function declaration | | main.go:56:11:56:18 | selector | main.go:56:38:64:1 | block statement | | main.go:56:38:64:1 | After block statement | main.go:56:1:64:1 | Normal Exit | | main.go:56:38:64:1 | block statement | main.go:56:38:64:1 | zero-init:0 block statement | @@ -1724,12 +1619,10 @@ | main.go:61:12:61:12 | 2 | main.go:61:3:61:12 | assign:0 ... = ... | | main.go:63:2:63:7 | Before return statement | main.go:63:2:63:7 | return statement | | main.go:63:2:63:7 | return statement | main.go:56:38:64:1 | result-read:0 block statement | -| main.go:66:1:90:1 | After function declaration | main.go:92:1:96:1 | Before function declaration | -| main.go:66:1:90:1 | Before function declaration | main.go:66:1:90:1 | function declaration | | main.go:66:1:90:1 | Entry | main.go:66:14:90:1 | block statement | | main.go:66:1:90:1 | Exceptional Exit | main.go:66:1:90:1 | Exit | | main.go:66:1:90:1 | Normal Exit | main.go:66:1:90:1 | Exit | -| main.go:66:1:90:1 | function declaration | main.go:66:1:90:1 | After function declaration | +| main.go:66:1:90:1 | function declaration | main.go:92:1:96:1 | function declaration | | main.go:66:14:90:1 | After block statement | main.go:66:1:90:1 | Normal Exit | | main.go:66:14:90:1 | block statement | main.go:67:2:67:10 | declaration statement | | main.go:67:2:67:10 | After declaration statement | main.go:68:2:70:2 | for statement | @@ -1851,11 +1744,9 @@ | main.go:89:2:89:13 | call to Print | main.go:89:2:89:13 | After call to Print | | main.go:89:2:89:13 | expression statement | main.go:89:2:89:13 | Before call to Print | | main.go:89:12:89:12 | z | main.go:89:2:89:13 | call to Print | -| main.go:92:1:96:1 | After function declaration | main.go:98:1:106:1 | Before function declaration | -| main.go:92:1:96:1 | Before function declaration | main.go:92:1:96:1 | function declaration | | main.go:92:1:96:1 | Entry | main.go:92:36:96:1 | block statement | | main.go:92:1:96:1 | Normal Exit | main.go:92:1:96:1 | Exit | -| main.go:92:1:96:1 | function declaration | main.go:92:1:96:1 | After function declaration | +| main.go:92:1:96:1 | function declaration | main.go:98:1:106:1 | function declaration | | main.go:92:36:96:1 | After block statement | main.go:92:1:96:1 | Normal Exit | | main.go:92:36:96:1 | block statement | main.go:92:36:96:1 | zero-init:0 block statement | | main.go:92:36:96:1 | result-read:0 block statement | main.go:92:36:96:1 | result-read:1 block statement | @@ -1878,12 +1769,10 @@ | main.go:94:15:94:15 | x | main.go:94:2:94:15 | assign:0 ... = ... | | main.go:95:2:95:7 | Before return statement | main.go:95:2:95:7 | return statement | | main.go:95:2:95:7 | return statement | main.go:92:36:96:1 | result-read:0 block statement | -| main.go:98:1:106:1 | After function declaration | main.go:0:0:0:0 | After main.go | -| main.go:98:1:106:1 | Before function declaration | main.go:98:1:106:1 | function declaration | | main.go:98:1:106:1 | Entry | main.go:98:25:98:25 | x | | main.go:98:1:106:1 | Exceptional Exit | main.go:98:1:106:1 | Exit | | main.go:98:1:106:1 | Normal Exit | main.go:98:1:106:1 | Exit | -| main.go:98:1:106:1 | function declaration | main.go:98:1:106:1 | After function declaration | +| main.go:98:1:106:1 | function declaration | main.go:0:0:0:0 | After main.go | | main.go:98:25:98:25 | x | main.go:98:43:106:1 | block statement | | main.go:98:43:106:1 | block statement | main.go:99:2:99:13 | ... := ... | | main.go:99:2:99:13 | ... := ... | main.go:99:10:99:10 | x | @@ -1923,15 +1812,10 @@ | noretfunctions.go:0:0:0:0 | Entry | noretfunctions.go:0:0:0:0 | noretfunctions.go | | noretfunctions.go:0:0:0:0 | Normal Exit | noretfunctions.go:0:0:0:0 | Exit | | noretfunctions.go:0:0:0:0 | noretfunctions.go | noretfunctions.go:3:1:6:1 | import declaration | -| noretfunctions.go:3:1:6:1 | After import declaration | noretfunctions.go:8:1:10:1 | Before function declaration | -| noretfunctions.go:3:1:6:1 | import declaration | noretfunctions.go:4:2:4:6 | import specifier | -| noretfunctions.go:4:2:4:6 | import specifier | noretfunctions.go:5:2:5:5 | import specifier | -| noretfunctions.go:5:2:5:5 | import specifier | noretfunctions.go:3:1:6:1 | After import declaration | -| noretfunctions.go:8:1:10:1 | After function declaration | noretfunctions.go:12:1:16:1 | Before function declaration | -| noretfunctions.go:8:1:10:1 | Before function declaration | noretfunctions.go:8:1:10:1 | function declaration | +| noretfunctions.go:3:1:6:1 | import declaration | noretfunctions.go:8:1:10:1 | function declaration | | noretfunctions.go:8:1:10:1 | Entry | noretfunctions.go:8:16:10:1 | block statement | | noretfunctions.go:8:1:10:1 | Exceptional Exit | noretfunctions.go:8:1:10:1 | Exit | -| noretfunctions.go:8:1:10:1 | function declaration | noretfunctions.go:8:1:10:1 | After function declaration | +| noretfunctions.go:8:1:10:1 | function declaration | noretfunctions.go:12:1:16:1 | function declaration | | noretfunctions.go:8:16:10:1 | block statement | noretfunctions.go:9:2:9:11 | expression statement | | noretfunctions.go:9:2:9:8 | After selection of Exit | noretfunctions.go:9:10:9:10 | 1 | | noretfunctions.go:9:2:9:8 | Before selection of Exit | noretfunctions.go:9:2:9:8 | selection of Exit | @@ -1940,12 +1824,10 @@ | noretfunctions.go:9:2:9:11 | call to Exit | noretfunctions.go:8:1:10:1 | Exceptional Exit | | noretfunctions.go:9:2:9:11 | expression statement | noretfunctions.go:9:2:9:11 | Before call to Exit | | noretfunctions.go:9:10:9:10 | 1 | noretfunctions.go:9:2:9:11 | call to Exit | -| noretfunctions.go:12:1:16:1 | After function declaration | noretfunctions.go:18:1:18:17 | Before function declaration | -| noretfunctions.go:12:1:16:1 | Before function declaration | noretfunctions.go:12:1:16:1 | function declaration | | noretfunctions.go:12:1:16:1 | Entry | noretfunctions.go:12:13:12:13 | x | | noretfunctions.go:12:1:16:1 | Exceptional Exit | noretfunctions.go:12:1:16:1 | Exit | | noretfunctions.go:12:1:16:1 | Normal Exit | noretfunctions.go:12:1:16:1 | Exit | -| noretfunctions.go:12:1:16:1 | function declaration | noretfunctions.go:12:1:16:1 | After function declaration | +| noretfunctions.go:12:1:16:1 | function declaration | noretfunctions.go:18:1:18:17 | function declaration | | noretfunctions.go:12:13:12:13 | x | noretfunctions.go:12:20:16:1 | block statement | | noretfunctions.go:12:20:16:1 | After block statement | noretfunctions.go:12:1:16:1 | Normal Exit | | noretfunctions.go:12:20:16:1 | block statement | noretfunctions.go:13:2:15:2 | if statement | @@ -1966,17 +1848,13 @@ | noretfunctions.go:14:3:14:12 | call to Exit | noretfunctions.go:12:1:16:1 | Exceptional Exit | | noretfunctions.go:14:3:14:12 | expression statement | noretfunctions.go:14:3:14:12 | Before call to Exit | | noretfunctions.go:14:11:14:11 | x | noretfunctions.go:14:3:14:12 | call to Exit | -| noretfunctions.go:18:1:18:17 | After function declaration | noretfunctions.go:20:1:22:1 | Before function declaration | -| noretfunctions.go:18:1:18:17 | Before function declaration | noretfunctions.go:18:1:18:17 | function declaration | | noretfunctions.go:18:1:18:17 | Entry | noretfunctions.go:18:16:18:17 | block statement | | noretfunctions.go:18:1:18:17 | Normal Exit | noretfunctions.go:18:1:18:17 | Exit | -| noretfunctions.go:18:1:18:17 | function declaration | noretfunctions.go:18:1:18:17 | After function declaration | +| noretfunctions.go:18:1:18:17 | function declaration | noretfunctions.go:20:1:22:1 | function declaration | | noretfunctions.go:18:16:18:17 | block statement | noretfunctions.go:18:1:18:17 | Normal Exit | -| noretfunctions.go:20:1:22:1 | After function declaration | noretfunctions.go:24:1:26:1 | Before function declaration | -| noretfunctions.go:20:1:22:1 | Before function declaration | noretfunctions.go:20:1:22:1 | function declaration | | noretfunctions.go:20:1:22:1 | Entry | noretfunctions.go:20:26:22:1 | block statement | | noretfunctions.go:20:1:22:1 | Exceptional Exit | noretfunctions.go:20:1:22:1 | Exit | -| noretfunctions.go:20:1:22:1 | function declaration | noretfunctions.go:20:1:22:1 | After function declaration | +| noretfunctions.go:20:1:22:1 | function declaration | noretfunctions.go:24:1:26:1 | function declaration | | noretfunctions.go:20:26:22:1 | block statement | noretfunctions.go:21:2:21:19 | expression statement | | noretfunctions.go:21:2:21:10 | After selection of Fatal | noretfunctions.go:21:12:21:18 | "Oh no" | | noretfunctions.go:21:2:21:10 | Before selection of Fatal | noretfunctions.go:21:2:21:10 | selection of Fatal | @@ -1985,11 +1863,9 @@ | noretfunctions.go:21:2:21:19 | call to Fatal | noretfunctions.go:20:1:22:1 | Exceptional Exit | | noretfunctions.go:21:2:21:19 | expression statement | noretfunctions.go:21:2:21:19 | Before call to Fatal | | noretfunctions.go:21:12:21:18 | "Oh no" | noretfunctions.go:21:2:21:19 | call to Fatal | -| noretfunctions.go:24:1:26:1 | After function declaration | noretfunctions.go:0:0:0:0 | After noretfunctions.go | -| noretfunctions.go:24:1:26:1 | Before function declaration | noretfunctions.go:24:1:26:1 | function declaration | | noretfunctions.go:24:1:26:1 | Entry | noretfunctions.go:24:27:26:1 | block statement | | noretfunctions.go:24:1:26:1 | Exceptional Exit | noretfunctions.go:24:1:26:1 | Exit | -| noretfunctions.go:24:1:26:1 | function declaration | noretfunctions.go:24:1:26:1 | After function declaration | +| noretfunctions.go:24:1:26:1 | function declaration | noretfunctions.go:0:0:0:0 | After noretfunctions.go | | noretfunctions.go:24:27:26:1 | block statement | noretfunctions.go:25:2:25:31 | expression statement | | noretfunctions.go:25:2:25:11 | After selection of Fatalf | noretfunctions.go:25:13:25:30 | "It's as I feared" | | noretfunctions.go:25:2:25:11 | Before selection of Fatalf | noretfunctions.go:25:2:25:11 | selection of Fatalf | @@ -2001,13 +1877,11 @@ | stmts2.go:0:0:0:0 | After stmts2.go | stmts2.go:0:0:0:0 | Normal Exit | | stmts2.go:0:0:0:0 | Entry | stmts2.go:0:0:0:0 | stmts2.go | | stmts2.go:0:0:0:0 | Normal Exit | stmts2.go:0:0:0:0 | Exit | -| stmts2.go:0:0:0:0 | stmts2.go | stmts2.go:3:1:7:1 | Before function declaration | -| stmts2.go:3:1:7:1 | After function declaration | stmts2.go:9:1:13:1 | Before function declaration | -| stmts2.go:3:1:7:1 | Before function declaration | stmts2.go:3:1:7:1 | function declaration | +| stmts2.go:0:0:0:0 | stmts2.go | stmts2.go:3:1:7:1 | function declaration | | stmts2.go:3:1:7:1 | Entry | stmts2.go:3:19:7:1 | block statement | | stmts2.go:3:1:7:1 | Exceptional Exit | stmts2.go:3:1:7:1 | Exit | | stmts2.go:3:1:7:1 | Normal Exit | stmts2.go:3:1:7:1 | Exit | -| stmts2.go:3:1:7:1 | function declaration | stmts2.go:3:1:7:1 | After function declaration | +| stmts2.go:3:1:7:1 | function declaration | stmts2.go:9:1:13:1 | function declaration | | stmts2.go:3:19:7:1 | block statement | stmts2.go:4:2:4:13 | ... = ... | | stmts2.go:4:2:4:13 | ... = ... | stmts2.go:4:6:4:13 | Before call to test7 | | stmts2.go:4:2:4:13 | After ... = ... | stmts2.go:5:2:5:17 | declaration statement | @@ -2032,12 +1906,10 @@ | stmts2.go:6:2:6:9 | Before return statement | stmts2.go:6:9:6:9 | 2 | | stmts2.go:6:2:6:9 | return statement | stmts2.go:3:1:7:1 | Normal Exit | | stmts2.go:6:9:6:9 | 2 | stmts2.go:6:2:6:9 | return statement | -| stmts2.go:9:1:13:1 | After function declaration | stmts2.go:15:1:28:1 | Before function declaration | -| stmts2.go:9:1:13:1 | Before function declaration | stmts2.go:9:1:13:1 | function declaration | | stmts2.go:9:1:13:1 | Entry | stmts2.go:9:19:13:1 | block statement | | stmts2.go:9:1:13:1 | Exceptional Exit | stmts2.go:9:1:13:1 | Exit | | stmts2.go:9:1:13:1 | Normal Exit | stmts2.go:9:1:13:1 | Exit | -| stmts2.go:9:1:13:1 | function declaration | stmts2.go:9:1:13:1 | After function declaration | +| stmts2.go:9:1:13:1 | function declaration | stmts2.go:15:1:28:1 | function declaration | | stmts2.go:9:19:13:1 | block statement | stmts2.go:10:2:10:14 | ... := ... | | stmts2.go:10:2:10:14 | ... := ... | stmts2.go:10:10:10:14 | Before call to gen | | stmts2.go:10:2:10:14 | After ... := ... | stmts2.go:11:2:11:17 | declaration statement | @@ -2068,11 +1940,9 @@ | stmts2.go:12:9:12:13 | After ...+... | stmts2.go:12:2:12:13 | return statement | | stmts2.go:12:9:12:13 | Before ...+... | stmts2.go:12:9:12:9 | x | | stmts2.go:12:13:12:13 | y | stmts2.go:12:9:12:13 | ...+... | -| stmts2.go:15:1:28:1 | After function declaration | stmts2.go:30:1:34:1 | Before function declaration | -| stmts2.go:15:1:28:1 | Before function declaration | stmts2.go:15:1:28:1 | function declaration | | stmts2.go:15:1:28:1 | Entry | stmts2.go:15:13:15:14 | ch | | stmts2.go:15:1:28:1 | Normal Exit | stmts2.go:15:1:28:1 | Exit | -| stmts2.go:15:1:28:1 | function declaration | stmts2.go:15:1:28:1 | After function declaration | +| stmts2.go:15:1:28:1 | function declaration | stmts2.go:30:1:34:1 | function declaration | | stmts2.go:15:13:15:14 | ch | stmts2.go:15:30:28:1 | block statement | | stmts2.go:15:30:28:1 | block statement | stmts2.go:16:2:26:2 | Before select statement | | stmts2.go:16:2:26:2 | After select statement | stmts2.go:27:2:27:9 | Before return statement | @@ -2132,12 +2002,10 @@ | stmts2.go:27:2:27:9 | Before return statement | stmts2.go:27:9:27:9 | 1 | | stmts2.go:27:2:27:9 | return statement | stmts2.go:15:1:28:1 | Normal Exit | | stmts2.go:27:9:27:9 | 1 | stmts2.go:27:2:27:9 | return statement | -| stmts2.go:30:1:34:1 | After function declaration | stmts2.go:0:0:0:0 | After stmts2.go | -| stmts2.go:30:1:34:1 | Before function declaration | stmts2.go:30:1:34:1 | function declaration | | stmts2.go:30:1:34:1 | Entry | stmts2.go:30:20:34:1 | block statement | | stmts2.go:30:1:34:1 | Exceptional Exit | stmts2.go:30:1:34:1 | Exit | | stmts2.go:30:1:34:1 | Normal Exit | stmts2.go:30:1:34:1 | Exit | -| stmts2.go:30:1:34:1 | function declaration | stmts2.go:30:1:34:1 | After function declaration | +| stmts2.go:30:1:34:1 | function declaration | stmts2.go:0:0:0:0 | After stmts2.go | | stmts2.go:30:20:34:1 | block statement | stmts2.go:31:2:31:14 | ... := ... | | stmts2.go:31:2:31:14 | ... := ... | stmts2.go:31:10:31:14 | Before call to gen | | stmts2.go:31:2:31:14 | After ... := ... | stmts2.go:32:2:32:17 | declaration statement | @@ -2172,14 +2040,10 @@ | stmts3.go:0:0:0:0 | Entry | stmts3.go:0:0:0:0 | stmts3.go | | stmts3.go:0:0:0:0 | Normal Exit | stmts3.go:0:0:0:0 | Exit | | stmts3.go:0:0:0:0 | stmts3.go | stmts3.go:3:1:3:13 | import declaration | -| stmts3.go:3:1:3:13 | After import declaration | stmts3.go:5:1:12:1 | Before function declaration | -| stmts3.go:3:1:3:13 | import declaration | stmts3.go:3:8:3:13 | import specifier | -| stmts3.go:3:8:3:13 | import specifier | stmts3.go:3:1:3:13 | After import declaration | -| stmts3.go:5:1:12:1 | After function declaration | stmts3.go:14:1:16:1 | Before function declaration | -| stmts3.go:5:1:12:1 | Before function declaration | stmts3.go:5:1:12:1 | function declaration | +| stmts3.go:3:1:3:13 | import declaration | stmts3.go:5:1:12:1 | function declaration | | stmts3.go:5:1:12:1 | Entry | stmts3.go:5:19:12:1 | block statement | | stmts3.go:5:1:12:1 | Normal Exit | stmts3.go:5:1:12:1 | Exit | -| stmts3.go:5:1:12:1 | function declaration | stmts3.go:5:1:12:1 | After function declaration | +| stmts3.go:5:1:12:1 | function declaration | stmts3.go:14:1:16:1 | function declaration | | stmts3.go:5:19:12:1 | block statement | stmts3.go:6:2:10:2 | declaration statement | | stmts3.go:6:2:10:2 | After constant declaration | stmts3.go:6:2:10:2 | After declaration statement | | stmts3.go:6:2:10:2 | After declaration statement | stmts3.go:11:2:11:26 | Before return statement | @@ -2200,11 +2064,9 @@ | stmts3.go:11:9:11:26 | ...-... | stmts3.go:11:9:11:26 | After ...-... | | stmts3.go:11:9:11:26 | After ...-... | stmts3.go:11:2:11:26 | return statement | | stmts3.go:11:9:11:26 | Before ...-... | stmts3.go:11:9:11:26 | ...-... | -| stmts3.go:14:1:16:1 | After function declaration | stmts3.go:18:1:20:1 | Before function declaration | -| stmts3.go:14:1:16:1 | Before function declaration | stmts3.go:14:1:16:1 | function declaration | | stmts3.go:14:1:16:1 | Entry | stmts3.go:14:13:14:13 | x | | stmts3.go:14:1:16:1 | Normal Exit | stmts3.go:14:1:16:1 | Exit | -| stmts3.go:14:1:16:1 | function declaration | stmts3.go:14:1:16:1 | After function declaration | +| stmts3.go:14:1:16:1 | function declaration | stmts3.go:18:1:20:1 | function declaration | | stmts3.go:14:13:14:13 | x | stmts3.go:14:21:16:1 | block statement | | stmts3.go:14:21:16:1 | After block statement | stmts3.go:14:1:16:1 | Normal Exit | | stmts3.go:14:21:16:1 | block statement | stmts3.go:15:2:15:8 | ... = ... | @@ -2213,11 +2075,9 @@ | stmts3.go:15:2:15:8 | assign:0 ... = ... | stmts3.go:15:2:15:8 | After ... = ... | | stmts3.go:15:3:15:3 | x | stmts3.go:15:7:15:8 | 42 | | stmts3.go:15:7:15:8 | 42 | stmts3.go:15:2:15:8 | assign:0 ... = ... | -| stmts3.go:18:1:20:1 | After function declaration | stmts3.go:0:0:0:0 | After stmts3.go | -| stmts3.go:18:1:20:1 | Before function declaration | stmts3.go:18:1:20:1 | function declaration | | stmts3.go:18:1:20:1 | Entry | stmts3.go:18:15:20:1 | block statement | | stmts3.go:18:1:20:1 | Normal Exit | stmts3.go:18:1:20:1 | Exit | -| stmts3.go:18:1:20:1 | function declaration | stmts3.go:18:1:20:1 | After function declaration | +| stmts3.go:18:1:20:1 | function declaration | stmts3.go:0:0:0:0 | After stmts3.go | | stmts3.go:18:15:20:1 | After block statement | stmts3.go:18:1:20:1 | Normal Exit | | stmts3.go:18:15:20:1 | block statement | stmts3.go:19:2:19:23 | ... = ... | | stmts3.go:19:2:19:11 | After selection of Usage | stmts3.go:19:15:19:23 | function literal | @@ -2234,26 +2094,20 @@ | stmts4.go:0:0:0:0 | Entry | stmts4.go:0:0:0:0 | stmts4.go | | stmts4.go:0:0:0:0 | Normal Exit | stmts4.go:0:0:0:0 | Exit | | stmts4.go:0:0:0:0 | stmts4.go | stmts4.go:3:1:3:9 | variable declaration | -| stmts4.go:3:1:3:9 | After variable declaration | stmts4.go:5:1:5:26 | Before function declaration | +| stmts4.go:3:1:3:9 | After variable declaration | stmts4.go:5:1:5:26 | function declaration | | stmts4.go:3:1:3:9 | variable declaration | stmts4.go:3:5:3:9 | value declaration specifier | | stmts4.go:3:5:3:9 | After value declaration specifier | stmts4.go:3:1:3:9 | After variable declaration | | stmts4.go:3:5:3:9 | value declaration specifier | stmts4.go:3:5:3:9 | zero-init:0 value declaration specifier | | stmts4.go:3:5:3:9 | zero-init:0 value declaration specifier | stmts4.go:3:5:3:9 | After value declaration specifier | -| stmts4.go:5:1:5:26 | After function declaration | stmts4.go:0:0:0:0 | After stmts4.go | -| stmts4.go:5:1:5:26 | Before function declaration | stmts4.go:5:1:5:26 | function declaration | -| stmts4.go:5:1:5:26 | function declaration | stmts4.go:5:1:5:26 | After function declaration | +| stmts4.go:5:1:5:26 | function declaration | stmts4.go:0:0:0:0 | After stmts4.go | | stmts5.go:0:0:0:0 | After stmts5.go | stmts5.go:0:0:0:0 | Normal Exit | | stmts5.go:0:0:0:0 | Entry | stmts5.go:0:0:0:0 | stmts5.go | | stmts5.go:0:0:0:0 | Normal Exit | stmts5.go:0:0:0:0 | Exit | | stmts5.go:0:0:0:0 | stmts5.go | stmts5.go:3:1:5:1 | type declaration | -| stmts5.go:3:1:5:1 | After type declaration | stmts5.go:7:1:9:1 | Before function declaration | -| stmts5.go:3:1:5:1 | type declaration | stmts5.go:3:6:5:1 | type declaration specifier | -| stmts5.go:3:6:5:1 | type declaration specifier | stmts5.go:3:1:5:1 | After type declaration | -| stmts5.go:7:1:9:1 | After function declaration | stmts5.go:11:1:12:1 | Before function declaration | -| stmts5.go:7:1:9:1 | Before function declaration | stmts5.go:7:1:9:1 | function declaration | +| stmts5.go:3:1:5:1 | type declaration | stmts5.go:7:1:9:1 | function declaration | | stmts5.go:7:1:9:1 | Entry | stmts5.go:7:7:7:8 | me | | stmts5.go:7:1:9:1 | Normal Exit | stmts5.go:7:1:9:1 | Exit | -| stmts5.go:7:1:9:1 | function declaration | stmts5.go:7:1:9:1 | After function declaration | +| stmts5.go:7:1:9:1 | function declaration | stmts5.go:11:1:12:1 | function declaration | | stmts5.go:7:7:7:8 | me | stmts5.go:7:22:7:26 | other | | stmts5.go:7:22:7:26 | other | stmts5.go:7:33:9:1 | block statement | | stmts5.go:7:33:9:1 | After block statement | stmts5.go:7:1:9:1 | Normal Exit | @@ -2266,21 +2120,17 @@ | stmts5.go:8:2:8:16 | After ... += ... | stmts5.go:7:33:9:1 | After block statement | | stmts5.go:8:2:8:16 | Before ... += ... | stmts5.go:8:2:8:7 | Before selection of val | | stmts5.go:8:12:8:16 | other | stmts5.go:8:2:8:16 | ... += ... | -| stmts5.go:11:1:12:1 | After function declaration | stmts5.go:0:0:0:0 | After stmts5.go | -| stmts5.go:11:1:12:1 | Before function declaration | stmts5.go:11:1:12:1 | function declaration | | stmts5.go:11:1:12:1 | Entry | stmts5.go:11:20:12:1 | block statement | | stmts5.go:11:1:12:1 | Normal Exit | stmts5.go:11:1:12:1 | Exit | -| stmts5.go:11:1:12:1 | function declaration | stmts5.go:11:1:12:1 | After function declaration | +| stmts5.go:11:1:12:1 | function declaration | stmts5.go:0:0:0:0 | After stmts5.go | | stmts5.go:11:20:12:1 | block statement | stmts5.go:11:1:12:1 | Normal Exit | | stmts6.go:0:0:0:0 | After stmts6.go | stmts6.go:0:0:0:0 | Normal Exit | | stmts6.go:0:0:0:0 | Entry | stmts6.go:0:0:0:0 | stmts6.go | | stmts6.go:0:0:0:0 | Normal Exit | stmts6.go:0:0:0:0 | Exit | -| stmts6.go:0:0:0:0 | stmts6.go | stmts6.go:3:1:8:1 | Before function declaration | -| stmts6.go:3:1:8:1 | After function declaration | stmts6.go:0:0:0:0 | After stmts6.go | -| stmts6.go:3:1:8:1 | Before function declaration | stmts6.go:3:1:8:1 | function declaration | +| stmts6.go:0:0:0:0 | stmts6.go | stmts6.go:3:1:8:1 | function declaration | | stmts6.go:3:1:8:1 | Entry | stmts6.go:3:19:8:1 | block statement | | stmts6.go:3:1:8:1 | Normal Exit | stmts6.go:3:1:8:1 | Exit | -| stmts6.go:3:1:8:1 | function declaration | stmts6.go:3:1:8:1 | After function declaration | +| stmts6.go:3:1:8:1 | function declaration | stmts6.go:0:0:0:0 | After stmts6.go | | stmts6.go:3:19:8:1 | block statement | stmts6.go:4:2:6:2 | if statement | | stmts6.go:4:2:6:2 | if statement | stmts6.go:4:5:4:8 | true | | stmts6.go:4:5:4:8 | After true [true] | stmts6.go:4:10:6:2 | block statement | @@ -2293,16 +2143,11 @@ | stmts7.go:0:0:0:0 | Entry | stmts7.go:0:0:0:0 | stmts7.go | | stmts7.go:0:0:0:0 | Normal Exit | stmts7.go:0:0:0:0 | Exit | | stmts7.go:0:0:0:0 | stmts7.go | stmts7.go:3:1:6:1 | import declaration | -| stmts7.go:3:1:6:1 | After import declaration | stmts7.go:8:1:11:1 | Before function declaration | -| stmts7.go:3:1:6:1 | import declaration | stmts7.go:4:2:4:6 | import specifier | -| stmts7.go:4:2:4:6 | import specifier | stmts7.go:5:2:5:5 | import specifier | -| stmts7.go:5:2:5:5 | import specifier | stmts7.go:3:1:6:1 | After import declaration | -| stmts7.go:8:1:11:1 | After function declaration | stmts7.go:13:1:16:1 | Before function declaration | -| stmts7.go:8:1:11:1 | Before function declaration | stmts7.go:8:1:11:1 | function declaration | +| stmts7.go:3:1:6:1 | import declaration | stmts7.go:8:1:11:1 | function declaration | | stmts7.go:8:1:11:1 | Entry | stmts7.go:8:21:11:1 | block statement | | stmts7.go:8:1:11:1 | Exceptional Exit | stmts7.go:8:1:11:1 | Exit | | stmts7.go:8:1:11:1 | Normal Exit | stmts7.go:8:1:11:1 | Exit | -| stmts7.go:8:1:11:1 | function declaration | stmts7.go:8:1:11:1 | After function declaration | +| stmts7.go:8:1:11:1 | function declaration | stmts7.go:13:1:16:1 | function declaration | | stmts7.go:8:21:11:1 | After block statement | stmts7.go:8:1:11:1 | Normal Exit | | stmts7.go:8:21:11:1 | block statement | stmts7.go:9:2:9:18 | ... := ... | | stmts7.go:9:2:9:18 | ... := ... | stmts7.go:9:10:9:18 | Before call to recover | @@ -2323,12 +2168,10 @@ | stmts7.go:10:2:10:33 | expression statement | stmts7.go:10:2:10:33 | Before call to Println | | stmts7.go:10:14:10:26 | "recovered: " | stmts7.go:10:29:10:32 | blah | | stmts7.go:10:29:10:32 | blah | stmts7.go:10:2:10:33 | call to Println | -| stmts7.go:13:1:16:1 | After function declaration | stmts7.go:18:1:20:1 | type declaration | -| stmts7.go:13:1:16:1 | Before function declaration | stmts7.go:13:1:16:1 | function declaration | | stmts7.go:13:1:16:1 | Entry | stmts7.go:13:19:16:1 | block statement | | stmts7.go:13:1:16:1 | Exceptional Exit | stmts7.go:13:1:16:1 | Exit | | stmts7.go:13:1:16:1 | Normal Exit | stmts7.go:13:1:16:1 | Exit | -| stmts7.go:13:1:16:1 | function declaration | stmts7.go:13:1:16:1 | After function declaration | +| stmts7.go:13:1:16:1 | function declaration | stmts7.go:18:1:20:1 | type declaration | | stmts7.go:13:19:16:1 | After block statement | stmts7.go:13:1:16:1 | Normal Exit | | stmts7.go:13:19:16:1 | block statement | stmts7.go:14:2:14:21 | Before defer statement | | stmts7.go:14:2:14:21 | After defer statement | stmts7.go:15:2:15:10 | expression statement | @@ -2346,15 +2189,11 @@ | stmts7.go:15:2:15:10 | catch-panic expression statement | stmts7.go:14:8:14:21 | defer-invoke call to recoverPanic | | stmts7.go:15:2:15:10 | expression statement | stmts7.go:15:2:15:10 | Before call to panic | | stmts7.go:15:8:15:9 | "" | stmts7.go:15:2:15:10 | call to panic | -| stmts7.go:18:1:20:1 | After type declaration | stmts7.go:22:1:24:1 | Before function declaration | -| stmts7.go:18:1:20:1 | type declaration | stmts7.go:18:6:20:1 | type declaration specifier | -| stmts7.go:18:6:20:1 | type declaration specifier | stmts7.go:18:1:20:1 | After type declaration | -| stmts7.go:22:1:24:1 | After function declaration | stmts7.go:26:1:31:1 | Before function declaration | -| stmts7.go:22:1:24:1 | Before function declaration | stmts7.go:22:1:24:1 | function declaration | +| stmts7.go:18:1:20:1 | type declaration | stmts7.go:22:1:24:1 | function declaration | | stmts7.go:22:1:24:1 | Entry | stmts7.go:22:7:22:13 | methods | | stmts7.go:22:1:24:1 | Exceptional Exit | stmts7.go:22:1:24:1 | Exit | | stmts7.go:22:1:24:1 | Normal Exit | stmts7.go:22:1:24:1 | Exit | -| stmts7.go:22:1:24:1 | function declaration | stmts7.go:22:1:24:1 | After function declaration | +| stmts7.go:22:1:24:1 | function declaration | stmts7.go:26:1:31:1 | function declaration | | stmts7.go:22:7:22:13 | methods | stmts7.go:22:32:24:1 | block statement | | stmts7.go:22:32:24:1 | After block statement | stmts7.go:22:1:24:1 | Normal Exit | | stmts7.go:22:32:24:1 | block statement | stmts7.go:23:2:23:13 | expression statement | @@ -2370,12 +2209,10 @@ | stmts7.go:23:2:23:13 | call to fn | stmts7.go:22:1:24:1 | Exceptional Exit | | stmts7.go:23:2:23:13 | call to fn | stmts7.go:23:2:23:13 | After call to fn | | stmts7.go:23:2:23:13 | expression statement | stmts7.go:23:2:23:13 | Before call to fn | -| stmts7.go:26:1:31:1 | After function declaration | stmts7.go:33:1:36:1 | Before function declaration | -| stmts7.go:26:1:31:1 | Before function declaration | stmts7.go:26:1:31:1 | function declaration | | stmts7.go:26:1:31:1 | Entry | stmts7.go:26:16:26:23 | callback | | stmts7.go:26:1:31:1 | Exceptional Exit | stmts7.go:26:1:31:1 | Exit | | stmts7.go:26:1:31:1 | Normal Exit | stmts7.go:26:1:31:1 | Exit | -| stmts7.go:26:1:31:1 | function declaration | stmts7.go:26:1:31:1 | After function declaration | +| stmts7.go:26:1:31:1 | function declaration | stmts7.go:33:1:36:1 | function declaration | | stmts7.go:26:16:26:23 | callback | stmts7.go:26:40:31:1 | block statement | | stmts7.go:26:40:31:1 | After block statement | stmts7.go:26:1:31:1 | Normal Exit | | stmts7.go:26:40:31:1 | block statement | stmts7.go:27:2:27:20 | Before defer statement | @@ -2422,11 +2259,9 @@ | stmts7.go:30:2:30:13 | catch-return return statement | stmts7.go:28:8:28:23 | defer-invoke call to fn | | stmts7.go:30:2:30:13 | return statement | stmts7.go:30:2:30:13 | catch-return return statement | | stmts7.go:30:9:30:13 | false | stmts7.go:30:2:30:13 | return statement | -| stmts7.go:33:1:36:1 | After function declaration | stmts7.go:38:1:41:1 | Before function declaration | -| stmts7.go:33:1:36:1 | Before function declaration | stmts7.go:33:1:36:1 | function declaration | | stmts7.go:33:1:36:1 | Entry | stmts7.go:33:24:36:1 | block statement | | stmts7.go:33:1:36:1 | Exceptional Exit | stmts7.go:33:1:36:1 | Exit | -| stmts7.go:33:1:36:1 | function declaration | stmts7.go:33:1:36:1 | After function declaration | +| stmts7.go:33:1:36:1 | function declaration | stmts7.go:38:1:41:1 | function declaration | | stmts7.go:33:24:36:1 | block statement | stmts7.go:34:2:34:21 | Before defer statement | | stmts7.go:34:2:34:21 | After defer statement | stmts7.go:35:2:35:11 | expression statement | | stmts7.go:34:2:34:21 | Before defer statement | stmts7.go:34:8:34:21 | call to recoverPanic | @@ -2441,12 +2276,10 @@ | stmts7.go:35:2:35:11 | call to Exit | stmts7.go:33:1:36:1 | Exceptional Exit | | stmts7.go:35:2:35:11 | expression statement | stmts7.go:35:2:35:11 | Before call to Exit | | stmts7.go:35:10:35:10 | 1 | stmts7.go:35:2:35:11 | call to Exit | -| stmts7.go:38:1:41:1 | After function declaration | stmts7.go:43:1:45:1 | Before function declaration | -| stmts7.go:38:1:41:1 | Before function declaration | stmts7.go:38:1:41:1 | function declaration | | stmts7.go:38:1:41:1 | Entry | stmts7.go:38:22:41:1 | block statement | | stmts7.go:38:1:41:1 | Exceptional Exit | stmts7.go:38:1:41:1 | Exit | | stmts7.go:38:1:41:1 | Normal Exit | stmts7.go:38:1:41:1 | Exit | -| stmts7.go:38:1:41:1 | function declaration | stmts7.go:38:1:41:1 | After function declaration | +| stmts7.go:38:1:41:1 | function declaration | stmts7.go:43:1:45:1 | function declaration | | stmts7.go:38:22:41:1 | After block statement | stmts7.go:38:1:41:1 | Normal Exit | | stmts7.go:38:22:41:1 | block statement | stmts7.go:39:2:39:21 | Before defer statement | | stmts7.go:39:2:39:21 | After defer statement | stmts7.go:40:2:40:30 | Before defer statement | @@ -2468,11 +2301,9 @@ | stmts7.go:40:8:40:30 | defer-invoke call to panic | stmts7.go:39:8:39:21 | defer-invoke call to recoverPanic | | stmts7.go:40:8:40:30 | defer-invoke call to panic | stmts7.go:40:2:40:30 | catch-defer-panic defer statement | | stmts7.go:40:14:40:29 | "deferred panic" | stmts7.go:40:8:40:30 | After call to panic | -| stmts7.go:43:1:45:1 | After function declaration | stmts7.go:47:1:50:1 | Before function declaration | -| stmts7.go:43:1:45:1 | Before function declaration | stmts7.go:43:1:45:1 | function declaration | | stmts7.go:43:1:45:1 | Entry | stmts7.go:43:27:45:1 | block statement | | stmts7.go:43:1:45:1 | Exceptional Exit | stmts7.go:43:1:45:1 | Exit | -| stmts7.go:43:1:45:1 | function declaration | stmts7.go:43:1:45:1 | After function declaration | +| stmts7.go:43:1:45:1 | function declaration | stmts7.go:47:1:50:1 | function declaration | | stmts7.go:43:27:45:1 | block statement | stmts7.go:44:2:44:36 | Before defer statement | | stmts7.go:44:2:44:36 | After defer statement | stmts7.go:44:8:44:36 | defer-invoke call to panic | | stmts7.go:44:2:44:36 | Before defer statement | stmts7.go:44:8:44:36 | call to panic | @@ -2483,11 +2314,9 @@ | stmts7.go:44:8:44:36 | call to panic | stmts7.go:44:8:44:12 | panic | | stmts7.go:44:8:44:36 | defer-invoke call to panic | stmts7.go:44:2:44:36 | catch-defer-panic defer statement | | stmts7.go:44:14:44:35 | "final deferred panic" | stmts7.go:44:8:44:36 | After call to panic | -| stmts7.go:47:1:50:1 | After function declaration | stmts7.go:52:1:55:1 | Before function declaration | -| stmts7.go:47:1:50:1 | Before function declaration | stmts7.go:47:1:50:1 | function declaration | | stmts7.go:47:1:50:1 | Entry | stmts7.go:47:35:50:1 | block statement | | stmts7.go:47:1:50:1 | Exceptional Exit | stmts7.go:47:1:50:1 | Exit | -| stmts7.go:47:1:50:1 | function declaration | stmts7.go:47:1:50:1 | After function declaration | +| stmts7.go:47:1:50:1 | function declaration | stmts7.go:52:1:55:1 | function declaration | | stmts7.go:47:35:50:1 | block statement | stmts7.go:48:2:48:21 | Before defer statement | | stmts7.go:48:2:48:21 | After defer statement | stmts7.go:49:2:49:17 | Before defer statement | | stmts7.go:48:2:48:21 | Before defer statement | stmts7.go:48:8:48:21 | call to recoverPanic | @@ -2506,12 +2335,10 @@ | stmts7.go:49:8:49:17 | call to Exit | stmts7.go:49:8:49:14 | Before selection of Exit | | stmts7.go:49:8:49:17 | defer-invoke call to Exit | stmts7.go:49:2:49:17 | catch-defer-panic defer statement | | stmts7.go:49:16:49:16 | 1 | stmts7.go:49:8:49:17 | After call to Exit | -| stmts7.go:52:1:55:1 | After function declaration | stmts7.go:57:1:62:1 | Before function declaration | -| stmts7.go:52:1:55:1 | Before function declaration | stmts7.go:52:1:55:1 | function declaration | | stmts7.go:52:1:55:1 | Entry | stmts7.go:52:31:52:36 | values | | stmts7.go:52:1:55:1 | Exceptional Exit | stmts7.go:52:1:55:1 | Exit | | stmts7.go:52:1:55:1 | Normal Exit | stmts7.go:52:1:55:1 | Exit | -| stmts7.go:52:1:55:1 | function declaration | stmts7.go:52:1:55:1 | After function declaration | +| stmts7.go:52:1:55:1 | function declaration | stmts7.go:57:1:62:1 | function declaration | | stmts7.go:52:31:52:36 | values | stmts7.go:52:45:52:49 | index | | stmts7.go:52:45:52:49 | index | stmts7.go:52:56:55:1 | block statement | | stmts7.go:52:56:55:1 | After block statement | stmts7.go:52:1:55:1 | Normal Exit | @@ -2534,12 +2361,10 @@ | stmts7.go:54:6:54:18 | index expression | stmts7.go:54:2:54:18 | catch-panic ... = ... | | stmts7.go:54:6:54:18 | index expression | stmts7.go:54:6:54:18 | After index expression | | stmts7.go:54:13:54:17 | index | stmts7.go:54:6:54:18 | index expression | -| stmts7.go:57:1:62:1 | After function declaration | stmts7.go:64:1:68:1 | Before function declaration | -| stmts7.go:57:1:62:1 | Before function declaration | stmts7.go:57:1:62:1 | function declaration | | stmts7.go:57:1:62:1 | Entry | stmts7.go:57:23:57:30 | register | | stmts7.go:57:1:62:1 | Exceptional Exit | stmts7.go:57:1:62:1 | Exit | | stmts7.go:57:1:62:1 | Normal Exit | stmts7.go:57:1:62:1 | Exit | -| stmts7.go:57:1:62:1 | function declaration | stmts7.go:57:1:62:1 | After function declaration | +| stmts7.go:57:1:62:1 | function declaration | stmts7.go:64:1:68:1 | function declaration | | stmts7.go:57:23:57:30 | register | stmts7.go:57:38:62:1 | block statement | | stmts7.go:57:38:62:1 | After block statement | stmts7.go:57:1:62:1 | Normal Exit | | stmts7.go:57:38:62:1 | block statement | stmts7.go:58:2:60:2 | if statement | @@ -2573,12 +2398,10 @@ | stmts7.go:61:2:61:20 | catch-panic expression statement | stmts7.go:59:9:59:22 | defer-invoke call to recoverPanic | | stmts7.go:61:2:61:20 | expression statement | stmts7.go:61:2:61:20 | Before call to Println | | stmts7.go:61:14:61:19 | "done" | stmts7.go:61:2:61:20 | call to Println | -| stmts7.go:64:1:68:1 | After function declaration | stmts7.go:70:1:77:1 | Before function declaration | -| stmts7.go:64:1:68:1 | Before function declaration | stmts7.go:64:1:68:1 | function declaration | | stmts7.go:64:1:68:1 | Entry | stmts7.go:64:20:64:24 | count | | stmts7.go:64:1:68:1 | Exceptional Exit | stmts7.go:64:1:68:1 | Exit | | stmts7.go:64:1:68:1 | Normal Exit | stmts7.go:64:1:68:1 | Exit | -| stmts7.go:64:1:68:1 | function declaration | stmts7.go:64:1:68:1 | After function declaration | +| stmts7.go:64:1:68:1 | function declaration | stmts7.go:70:1:77:1 | function declaration | | stmts7.go:64:20:64:24 | count | stmts7.go:64:31:68:1 | block statement | | stmts7.go:64:31:68:1 | After block statement | stmts7.go:64:1:68:1 | Normal Exit | | stmts7.go:64:31:68:1 | block statement | stmts7.go:65:2:67:2 | for statement | @@ -2614,12 +2437,10 @@ | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | stmts7.go:64:31:68:1 | After block statement | | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | stmts7.go:66:3:66:22 | catch-defer-panic defer statement | | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | stmts7.go:66:9:66:22 | defer-invoke call to recoverPanic | -| stmts7.go:70:1:77:1 | After function declaration | stmts7.go:79:1:85:1 | Before function declaration | -| stmts7.go:70:1:77:1 | Before function declaration | stmts7.go:70:1:77:1 | function declaration | | stmts7.go:70:1:77:1 | Entry | stmts7.go:70:20:70:23 | skip | | stmts7.go:70:1:77:1 | Exceptional Exit | stmts7.go:70:1:77:1 | Exit | | stmts7.go:70:1:77:1 | Normal Exit | stmts7.go:70:1:77:1 | Exit | -| stmts7.go:70:1:77:1 | function declaration | stmts7.go:70:1:77:1 | After function declaration | +| stmts7.go:70:1:77:1 | function declaration | stmts7.go:79:1:85:1 | function declaration | | stmts7.go:70:20:70:23 | skip | stmts7.go:70:31:77:1 | block statement | | stmts7.go:70:31:77:1 | After block statement | stmts7.go:70:1:77:1 | Normal Exit | | stmts7.go:70:31:77:1 | block statement | stmts7.go:71:2:73:2 | if statement | @@ -2656,12 +2477,10 @@ | stmts7.go:76:2:76:20 | call to Println | stmts7.go:76:2:76:20 | After call to Println | | stmts7.go:76:2:76:20 | expression statement | stmts7.go:76:2:76:20 | Before call to Println | | stmts7.go:76:14:76:19 | "done" | stmts7.go:76:2:76:20 | call to Println | -| stmts7.go:79:1:85:1 | After function declaration | stmts7.go:0:0:0:0 | After stmts7.go | -| stmts7.go:79:1:85:1 | Before function declaration | stmts7.go:79:1:85:1 | function declaration | | stmts7.go:79:1:85:1 | Entry | stmts7.go:79:23:79:32 | panicEarly | | stmts7.go:79:1:85:1 | Exceptional Exit | stmts7.go:79:1:85:1 | Exit | | stmts7.go:79:1:85:1 | Normal Exit | stmts7.go:79:1:85:1 | Exit | -| stmts7.go:79:1:85:1 | function declaration | stmts7.go:79:1:85:1 | After function declaration | +| stmts7.go:79:1:85:1 | function declaration | stmts7.go:0:0:0:0 | After stmts7.go | | stmts7.go:79:23:79:32 | panicEarly | stmts7.go:79:40:85:1 | block statement | | stmts7.go:79:40:85:1 | After block statement | stmts7.go:79:1:85:1 | Normal Exit | | stmts7.go:79:40:85:1 | block statement | stmts7.go:80:2:82:2 | if statement | @@ -2696,12 +2515,10 @@ | stmts8.go:0:0:0:0 | After stmts8.go | stmts8.go:0:0:0:0 | Normal Exit | | stmts8.go:0:0:0:0 | Entry | stmts8.go:0:0:0:0 | stmts8.go | | stmts8.go:0:0:0:0 | Normal Exit | stmts8.go:0:0:0:0 | Exit | -| stmts8.go:0:0:0:0 | stmts8.go | stmts8.go:3:1:7:1 | Before function declaration | -| stmts8.go:3:1:7:1 | After function declaration | stmts8.go:9:1:14:1 | Before function declaration | -| stmts8.go:3:1:7:1 | Before function declaration | stmts8.go:3:1:7:1 | function declaration | +| stmts8.go:0:0:0:0 | stmts8.go | stmts8.go:3:1:7:1 | function declaration | | stmts8.go:3:1:7:1 | Entry | stmts8.go:3:13:3:13 | x | | stmts8.go:3:1:7:1 | Normal Exit | stmts8.go:3:1:7:1 | Exit | -| stmts8.go:3:1:7:1 | function declaration | stmts8.go:3:1:7:1 | After function declaration | +| stmts8.go:3:1:7:1 | function declaration | stmts8.go:9:1:14:1 | function declaration | | stmts8.go:3:13:3:13 | x | stmts8.go:3:31:7:1 | block statement | | stmts8.go:3:31:7:1 | block statement | stmts8.go:4:2:4:12 | ... := ... | | stmts8.go:4:2:4:12 | ... := ... | stmts8.go:4:7:4:12 | Before ...>>... | @@ -2728,11 +2545,9 @@ | stmts8.go:6:12:6:17 | After ...%... | stmts8.go:6:2:6:17 | return statement | | stmts8.go:6:12:6:17 | Before ...%... | stmts8.go:6:12:6:12 | y | | stmts8.go:6:16:6:17 | 13 | stmts8.go:6:12:6:17 | ...%... | -| stmts8.go:9:1:14:1 | After function declaration | stmts8.go:0:0:0:0 | After stmts8.go | -| stmts8.go:9:1:14:1 | Before function declaration | stmts8.go:9:1:14:1 | function declaration | | stmts8.go:9:1:14:1 | Entry | stmts8.go:9:21:14:1 | block statement | | stmts8.go:9:1:14:1 | Normal Exit | stmts8.go:9:1:14:1 | Exit | -| stmts8.go:9:1:14:1 | function declaration | stmts8.go:9:1:14:1 | After function declaration | +| stmts8.go:9:1:14:1 | function declaration | stmts8.go:0:0:0:0 | After stmts8.go | | stmts8.go:9:21:14:1 | block statement | stmts8.go:10:2:12:2 | if statement | | stmts8.go:10:2:12:2 | After if statement | stmts8.go:13:2:13:13 | Before return statement | | stmts8.go:10:2:12:2 | if statement | stmts8.go:10:5:10:9 | linux | @@ -2751,14 +2566,10 @@ | stmts.go:0:0:0:0 | Entry | stmts.go:0:0:0:0 | stmts.go | | stmts.go:0:0:0:0 | Normal Exit | stmts.go:0:0:0:0 | Exit | | stmts.go:0:0:0:0 | stmts.go | stmts.go:3:1:3:12 | import declaration | -| stmts.go:3:1:3:12 | After import declaration | stmts.go:10:1:43:1 | Before function declaration | -| stmts.go:3:1:3:12 | import declaration | stmts.go:3:8:3:12 | import specifier | -| stmts.go:3:8:3:12 | import specifier | stmts.go:3:1:3:12 | After import declaration | -| stmts.go:10:1:43:1 | After function declaration | stmts.go:46:1:62:1 | Before function declaration | -| stmts.go:10:1:43:1 | Before function declaration | stmts.go:10:1:43:1 | function declaration | +| stmts.go:3:1:3:12 | import declaration | stmts.go:10:1:43:1 | function declaration | | stmts.go:10:1:43:1 | Entry | stmts.go:10:12:10:12 | b | | stmts.go:10:1:43:1 | Exceptional Exit | stmts.go:10:1:43:1 | Exit | -| stmts.go:10:1:43:1 | function declaration | stmts.go:10:1:43:1 | After function declaration | +| stmts.go:10:1:43:1 | function declaration | stmts.go:46:1:62:1 | function declaration | | stmts.go:10:12:10:12 | b | stmts.go:10:20:43:1 | block statement | | stmts.go:10:20:43:1 | block statement | stmts.go:11:2:18:2 | block statement | | stmts.go:11:2:18:2 | After block statement | stmts.go:20:2:20:18 | expression statement | @@ -2878,11 +2689,9 @@ | stmts.go:40:14:42:2 | block statement | stmts.go:41:3:41:12 | Before goto statement | | stmts.go:41:3:41:12 | Before goto statement | stmts.go:41:3:41:12 | goto statement | | stmts.go:41:3:41:12 | goto statement | stmts.go:22:1:37:2 | labeled statement | -| stmts.go:46:1:62:1 | After function declaration | stmts.go:65:1:72:1 | Before function declaration | -| stmts.go:46:1:62:1 | Before function declaration | stmts.go:46:1:62:1 | function declaration | | stmts.go:46:1:62:1 | Entry | stmts.go:46:12:46:14 | ch1 | | stmts.go:46:1:62:1 | Exceptional Exit | stmts.go:46:1:62:1 | Exit | -| stmts.go:46:1:62:1 | function declaration | stmts.go:46:1:62:1 | After function declaration | +| stmts.go:46:1:62:1 | function declaration | stmts.go:65:1:72:1 | function declaration | | stmts.go:46:12:46:14 | ch1 | stmts.go:46:26:46:28 | ch2 | | stmts.go:46:26:46:28 | ch2 | stmts.go:46:44:62:1 | block statement | | stmts.go:46:44:62:1 | block statement | stmts.go:47:2:47:17 | declaration statement | @@ -2972,12 +2781,10 @@ | stmts.go:58:7:58:15 | send statement | stmts.go:58:7:58:15 | After send statement | | stmts.go:58:14:58:15 | 42 | stmts.go:50:2:59:2 | select statement | | stmts.go:61:2:61:10 | Before select statement | stmts.go:61:2:61:10 | select statement | -| stmts.go:65:1:72:1 | After function declaration | stmts.go:75:1:109:1 | Before function declaration | -| stmts.go:65:1:72:1 | Before function declaration | stmts.go:65:1:72:1 | function declaration | | stmts.go:65:1:72:1 | Entry | stmts.go:65:12:65:12 | x | | stmts.go:65:1:72:1 | Exceptional Exit | stmts.go:65:1:72:1 | Exit | | stmts.go:65:1:72:1 | Normal Exit | stmts.go:65:1:72:1 | Exit | -| stmts.go:65:1:72:1 | function declaration | stmts.go:65:1:72:1 | After function declaration | +| stmts.go:65:1:72:1 | function declaration | stmts.go:75:1:109:1 | function declaration | | stmts.go:65:12:65:12 | x | stmts.go:65:23:72:1 | block statement | | stmts.go:65:23:72:1 | After block statement | stmts.go:65:1:72:1 | Normal Exit | | stmts.go:65:23:72:1 | block statement | stmts.go:66:2:70:2 | if statement | @@ -3050,12 +2857,10 @@ | stmts.go:71:2:71:10 | catch-return return statement | stmts.go:69:9:69:36 | defer-invoke function call | | stmts.go:71:2:71:10 | return statement | stmts.go:71:2:71:10 | catch-return return statement | | stmts.go:71:9:71:10 | 42 | stmts.go:71:2:71:10 | return statement | -| stmts.go:75:1:109:1 | After function declaration | stmts.go:112:1:137:1 | Before function declaration | -| stmts.go:75:1:109:1 | Before function declaration | stmts.go:75:1:109:1 | function declaration | | stmts.go:75:1:109:1 | Entry | stmts.go:75:12:75:12 | x | | stmts.go:75:1:109:1 | Exceptional Exit | stmts.go:75:1:109:1 | Exit | | stmts.go:75:1:109:1 | Normal Exit | stmts.go:75:1:109:1 | Exit | -| stmts.go:75:1:109:1 | function declaration | stmts.go:75:1:109:1 | After function declaration | +| stmts.go:75:1:109:1 | function declaration | stmts.go:112:1:137:1 | function declaration | | stmts.go:75:12:75:12 | x | stmts.go:75:19:109:1 | block statement | | stmts.go:75:19:109:1 | After block statement | stmts.go:75:1:109:1 | Normal Exit | | stmts.go:75:19:109:1 | block statement | stmts.go:76:2:77:2 | expression-switch statement | @@ -3180,12 +2985,10 @@ | stmts.go:107:7:107:10 | After true [no-match] | stmts.go:107:2:107:11 | After case clause [no-match] | | stmts.go:107:7:107:10 | true | stmts.go:107:7:107:10 | After true [match] | | stmts.go:107:7:107:10 | true | stmts.go:107:7:107:10 | After true [no-match] | -| stmts.go:112:1:137:1 | After function declaration | stmts.go:140:1:142:1 | Before function declaration | -| stmts.go:112:1:137:1 | Before function declaration | stmts.go:112:1:137:1 | function declaration | | stmts.go:112:1:137:1 | Entry | stmts.go:112:12:112:12 | x | | stmts.go:112:1:137:1 | Exceptional Exit | stmts.go:112:1:137:1 | Exit | | stmts.go:112:1:137:1 | Normal Exit | stmts.go:112:1:137:1 | Exit | -| stmts.go:112:1:137:1 | function declaration | stmts.go:112:1:137:1 | After function declaration | +| stmts.go:112:1:137:1 | function declaration | stmts.go:140:1:142:1 | function declaration | | stmts.go:112:12:112:12 | x | stmts.go:112:27:137:1 | block statement | | stmts.go:112:27:137:1 | After block statement | stmts.go:112:1:137:1 | Normal Exit | | stmts.go:112:27:137:1 | block statement | stmts.go:113:2:121:2 | type-switch statement | @@ -3323,12 +3126,10 @@ | stmts.go:135:3:135:14 | call to test5 | stmts.go:135:3:135:14 | After call to test5 | | stmts.go:135:3:135:14 | expression statement | stmts.go:135:3:135:14 | Before call to test5 | | stmts.go:135:9:135:13 | false | stmts.go:135:3:135:14 | call to test5 | -| stmts.go:140:1:142:1 | After function declaration | stmts.go:145:1:159:1 | Before function declaration | -| stmts.go:140:1:142:1 | Before function declaration | stmts.go:140:1:142:1 | function declaration | | stmts.go:140:1:142:1 | Entry | stmts.go:140:13:140:13 | f | | stmts.go:140:1:142:1 | Exceptional Exit | stmts.go:140:1:142:1 | Exit | | stmts.go:140:1:142:1 | Normal Exit | stmts.go:140:1:142:1 | Exit | -| stmts.go:140:1:142:1 | function declaration | stmts.go:140:1:142:1 | After function declaration | +| stmts.go:140:1:142:1 | function declaration | stmts.go:145:1:159:1 | function declaration | | stmts.go:140:13:140:13 | f | stmts.go:140:23:142:1 | block statement | | stmts.go:140:23:142:1 | After block statement | stmts.go:140:1:142:1 | Normal Exit | | stmts.go:140:23:142:1 | block statement | stmts.go:141:2:141:7 | Before go statement | @@ -3340,12 +3141,10 @@ | stmts.go:141:5:141:7 | Before call to f | stmts.go:141:5:141:5 | f | | stmts.go:141:5:141:7 | call to f | stmts.go:140:1:142:1 | Exceptional Exit | | stmts.go:141:5:141:7 | call to f | stmts.go:141:5:141:7 | After call to f | -| stmts.go:145:1:159:1 | After function declaration | stmts.go:0:0:0:0 | After stmts.go | -| stmts.go:145:1:159:1 | Before function declaration | stmts.go:145:1:159:1 | function declaration | | stmts.go:145:1:159:1 | Entry | stmts.go:145:13:145:14 | xs | | stmts.go:145:1:159:1 | Exceptional Exit | stmts.go:145:1:159:1 | Exit | | stmts.go:145:1:159:1 | Normal Exit | stmts.go:145:1:159:1 | Exit | -| stmts.go:145:1:159:1 | function declaration | stmts.go:145:1:159:1 | After function declaration | +| stmts.go:145:1:159:1 | function declaration | stmts.go:0:0:0:0 | After stmts.go | | stmts.go:145:13:145:14 | xs | stmts.go:145:23:159:1 | block statement | | stmts.go:145:23:159:1 | After block statement | stmts.go:145:1:159:1 | Normal Exit | | stmts.go:145:23:159:1 | block statement | stmts.go:146:2:151:2 | range statement | @@ -3426,12 +3225,10 @@ | tst.go:0:0:0:0 | After tst.go | tst.go:0:0:0:0 | Normal Exit | | tst.go:0:0:0:0 | Entry | tst.go:0:0:0:0 | tst.go | | tst.go:0:0:0:0 | Normal Exit | tst.go:0:0:0:0 | Exit | -| tst.go:0:0:0:0 | tst.go | tst.go:3:1:12:1 | Before function declaration | -| tst.go:3:1:12:1 | After function declaration | tst.go:14:1:21:1 | Before function declaration | -| tst.go:3:1:12:1 | Before function declaration | tst.go:3:1:12:1 | function declaration | +| tst.go:0:0:0:0 | tst.go | tst.go:3:1:12:1 | function declaration | | tst.go:3:1:12:1 | Entry | tst.go:3:12:3:12 | x | | tst.go:3:1:12:1 | Normal Exit | tst.go:3:1:12:1 | Exit | -| tst.go:3:1:12:1 | function declaration | tst.go:3:1:12:1 | After function declaration | +| tst.go:3:1:12:1 | function declaration | tst.go:14:1:21:1 | function declaration | | tst.go:3:12:3:12 | x | tst.go:3:19:12:1 | block statement | | tst.go:3:19:12:1 | After block statement | tst.go:3:1:12:1 | Normal Exit | | tst.go:3:19:12:1 | block statement | tst.go:4:2:11:2 | expression-switch statement | @@ -3467,11 +3264,9 @@ | tst.go:9:7:9:12 | After ...<... [no-match] | tst.go:9:2:9:13 | After case clause [no-match] | | tst.go:9:7:9:12 | Before ...<... | tst.go:9:7:9:7 | x | | tst.go:9:11:9:12 | 23 | tst.go:9:7:9:12 | ...<... | -| tst.go:14:1:21:1 | After function declaration | tst.go:23:1:26:1 | Before function declaration | -| tst.go:14:1:21:1 | Before function declaration | tst.go:14:1:21:1 | function declaration | | tst.go:14:1:21:1 | Entry | tst.go:14:13:14:17 | value | | tst.go:14:1:21:1 | Normal Exit | tst.go:14:1:21:1 | Exit | -| tst.go:14:1:21:1 | function declaration | tst.go:14:1:21:1 | After function declaration | +| tst.go:14:1:21:1 | function declaration | tst.go:23:1:26:1 | function declaration | | tst.go:14:13:14:17 | value | tst.go:14:26:21:1 | block statement | | tst.go:14:26:21:1 | After block statement | tst.go:14:1:21:1 | Normal Exit | | tst.go:14:26:21:1 | block statement | tst.go:15:2:20:2 | expression-switch statement | @@ -3501,19 +3296,15 @@ | tst.go:18:15:18:38 | ...*... | tst.go:18:15:18:38 | After ...*... | | tst.go:18:15:18:38 | After ...*... | tst.go:18:7:18:38 | ...<... | | tst.go:18:15:18:38 | Before ...*... | tst.go:18:15:18:38 | ...*... | -| tst.go:23:1:26:1 | After function declaration | tst.go:28:1:32:1 | Before function declaration | -| tst.go:23:1:26:1 | Before function declaration | tst.go:23:1:26:1 | function declaration | | tst.go:23:1:26:1 | Entry | tst.go:23:15:26:1 | block statement | | tst.go:23:1:26:1 | Normal Exit | tst.go:23:1:26:1 | Exit | -| tst.go:23:1:26:1 | function declaration | tst.go:23:1:26:1 | After function declaration | +| tst.go:23:1:26:1 | function declaration | tst.go:28:1:32:1 | function declaration | | tst.go:23:15:26:1 | After block statement | tst.go:23:1:26:1 | Normal Exit | | tst.go:23:15:26:1 | block statement | tst.go:24:2:25:2 | expression-switch statement | | tst.go:24:2:25:2 | expression-switch statement | tst.go:23:15:26:1 | After block statement | -| tst.go:28:1:32:1 | After function declaration | tst.go:0:0:0:0 | After tst.go | -| tst.go:28:1:32:1 | Before function declaration | tst.go:28:1:32:1 | function declaration | | tst.go:28:1:32:1 | Entry | tst.go:28:15:32:1 | block statement | | tst.go:28:1:32:1 | Normal Exit | tst.go:28:1:32:1 | Exit | -| tst.go:28:1:32:1 | function declaration | tst.go:28:1:32:1 | After function declaration | +| tst.go:28:1:32:1 | function declaration | tst.go:0:0:0:0 | After tst.go | | tst.go:28:15:32:1 | After block statement | tst.go:28:1:32:1 | Normal Exit | | tst.go:28:15:32:1 | block statement | tst.go:29:2:31:2 | expression-switch statement | | tst.go:29:2:31:2 | After expression-switch statement | tst.go:28:15:32:1 | After block statement | From 6727abac99a5179361b1d55e51412a15698a776e Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Tue, 15 Sep 2026 16:14:05 +0100 Subject: [PATCH 1044/2098] Add missing QLDoc in shared library --- .../controlflow/codeql/controlflow/ControlFlowGraph.qll | 1 + shared/controlflow/codeql/controlflow/test/TestCfg.qll | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll index eba82f31662f..3b1ba8887584 100644 --- a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll +++ b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll @@ -2247,6 +2247,7 @@ module Make0 Ast> { private module Cfg_ = BB::Make; + /** Provides the control flow graph interfaces used by basic-block and inline CFG tests. */ module Cfg implements BB::CfgSig, TestCfg::CfgSig { import Cfg_ diff --git a/shared/controlflow/codeql/controlflow/test/TestCfg.qll b/shared/controlflow/codeql/controlflow/test/TestCfg.qll index 9767688433fb..27ed56140e2f 100644 --- a/shared/controlflow/codeql/controlflow/test/TestCfg.qll +++ b/shared/controlflow/codeql/controlflow/test/TestCfg.qll @@ -254,6 +254,7 @@ module Make Cfg, InputSig Cfg, InputSig Date: Tue, 15 Sep 2026 19:58:03 -0400 Subject: [PATCH 1045/2098] Ruby: model Grape request sub-accessors as remote flow sources Adds request.body.read/.string, .params, .GET, .POST, .cookies, .env, .query_string, and .path_info as Http::Server::RequestInputAccess sources within Grape::API endpoints, plus matching Grape.ql test predicates and app.rb coverage. Also adds ConnectedToInjection.rb, exercising ActiveRecord connected_to role-switch blocks with captured variables as an SQL injection regression fixture. .expected files intentionally not yet updated pending a CodeQL CLI upgrade/test pass. --- ruby/ql/lib/codeql/ruby/frameworks/Grape.qll | 147 ++++++++++++++++++ .../library-tests/frameworks/grape/Grape.ql | 18 +++ .../library-tests/frameworks/grape/app.rb | 53 ++++++- .../security/cwe-089/ConnectedToInjection.rb | 37 +++++ 4 files changed, 254 insertions(+), 1 deletion(-) create mode 100644 ruby/ql/test/query-tests/security/cwe-089/ConnectedToInjection.rb diff --git a/ruby/ql/lib/codeql/ruby/frameworks/Grape.qll b/ruby/ql/lib/codeql/ruby/frameworks/Grape.qll index 9b7ae6185cdb..ff9439181265 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/Grape.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/Grape.qll @@ -206,6 +206,153 @@ module Grape { } } + /** + * Gets an API node for the `request` object accessible within a Grape API endpoint. + */ + private API::Node grapeRequestInstance() { result = grapeApiInstance().getReturn("request") } + + /** + * A call to `request.body.read` from within a Grape API endpoint, which reads + * the raw, unparsed request body and can contain user input. + */ + class GrapeRequestBodyReadSource extends Http::Server::RequestInputAccess::Range { + GrapeRequestBodyReadSource() { + this.asExpr().getExpr() = + grapeRequestInstance().getReturn("body").getAMethodCall("read").asExpr().getExpr() + } + + override string getSourceType() { result = "Grape::Request#body.read" } + + override Http::Server::RequestInputKind getKind() { + result = Http::Server::parameterInputKind() + } + } + + /** + * A call to `request.body.string` from within a Grape API endpoint, which reads + * the raw, unparsed request body and can contain user input. + */ + class GrapeRequestBodyStringSource extends Http::Server::RequestInputAccess::Range { + GrapeRequestBodyStringSource() { + this.asExpr().getExpr() = + grapeRequestInstance().getReturn("body").getAMethodCall("string").asExpr().getExpr() + } + + override string getSourceType() { result = "Grape::Request#body.string" } + + override Http::Server::RequestInputKind getKind() { + result = Http::Server::parameterInputKind() + } + } + + /** + * A call to `request.params` from within a Grape API endpoint. + */ + class GrapeRequestParamsSource extends Http::Server::RequestInputAccess::Range { + GrapeRequestParamsSource() { + this.asExpr().getExpr() = grapeRequestInstance().getAMethodCall("params").asExpr().getExpr() + } + + override string getSourceType() { result = "Grape::Request#params" } + + override Http::Server::RequestInputKind getKind() { + result = Http::Server::parameterInputKind() + } + } + + /** + * A call to `request.GET` from within a Grape API endpoint, which returns the + * parsed query-string parameters. + */ + class GrapeRequestGetSource extends Http::Server::RequestInputAccess::Range { + GrapeRequestGetSource() { + this.asExpr().getExpr() = grapeRequestInstance().getAMethodCall("GET").asExpr().getExpr() + } + + override string getSourceType() { result = "Grape::Request#GET" } + + override Http::Server::RequestInputKind getKind() { + result = Http::Server::parameterInputKind() + } + } + + /** + * A call to `request.POST` from within a Grape API endpoint, which returns the + * parsed form/body parameters. + */ + class GrapeRequestPostSource extends Http::Server::RequestInputAccess::Range { + GrapeRequestPostSource() { + this.asExpr().getExpr() = grapeRequestInstance().getAMethodCall("POST").asExpr().getExpr() + } + + override string getSourceType() { result = "Grape::Request#POST" } + + override Http::Server::RequestInputKind getKind() { + result = Http::Server::parameterInputKind() + } + } + + /** + * A call to `request.cookies` from within a Grape API endpoint. + */ + class GrapeRequestCookiesSource extends Http::Server::RequestInputAccess::Range { + GrapeRequestCookiesSource() { + this.asExpr().getExpr() = grapeRequestInstance().getAMethodCall("cookies").asExpr().getExpr() + } + + override string getSourceType() { result = "Grape::Request#cookies" } + + override Http::Server::RequestInputKind getKind() { result = Http::Server::cookieInputKind() } + } + + /** + * A call to `request.env` from within a Grape API endpoint, which returns the + * underlying Rack environment hash. + */ + class GrapeRequestEnvSource extends Http::Server::RequestInputAccess::Range { + GrapeRequestEnvSource() { + this.asExpr().getExpr() = grapeRequestInstance().getAMethodCall("env").asExpr().getExpr() + } + + override string getSourceType() { result = "Grape::Request#env" } + + override Http::Server::RequestInputKind getKind() { + result = Http::Server::parameterInputKind() + } + } + + /** + * A call to `request.query_string` from within a Grape API endpoint. + */ + class GrapeRequestQueryStringSource extends Http::Server::RequestInputAccess::Range { + GrapeRequestQueryStringSource() { + this.asExpr().getExpr() = + grapeRequestInstance().getAMethodCall("query_string").asExpr().getExpr() + } + + override string getSourceType() { result = "Grape::Request#query_string" } + + override Http::Server::RequestInputKind getKind() { + result = Http::Server::parameterInputKind() + } + } + + /** + * A call to `request.path_info` from within a Grape API endpoint. + */ + class GrapeRequestPathInfoSource extends Http::Server::RequestInputAccess::Range { + GrapeRequestPathInfoSource() { + this.asExpr().getExpr() = + grapeRequestInstance().getAMethodCall("path_info").asExpr().getExpr() + } + + override string getSourceType() { result = "Grape::Request#path_info" } + + override Http::Server::RequestInputKind getKind() { + result = Http::Server::parameterInputKind() + } + } + /** * A call to `route_param` from within a Grape API endpoint. */ diff --git a/ruby/ql/test/library-tests/frameworks/grape/Grape.ql b/ruby/ql/test/library-tests/frameworks/grape/Grape.ql index 63cd15a547e1..21d1fcfd0c16 100644 --- a/ruby/ql/test/library-tests/frameworks/grape/Grape.ql +++ b/ruby/ql/test/library-tests/frameworks/grape/Grape.ql @@ -22,3 +22,21 @@ query predicate grapeRequest(Grape::GrapeRequestSource request) { any() } query predicate grapeRouteParam(Grape::GrapeRouteParamSource routeParam) { any() } query predicate grapeCookies(Grape::GrapeCookiesSource cookies) { any() } + +query predicate grapeRequestBodyRead(Grape::GrapeRequestBodyReadSource src) { any() } + +query predicate grapeRequestBodyString(Grape::GrapeRequestBodyStringSource src) { any() } + +query predicate grapeRequestParams(Grape::GrapeRequestParamsSource src) { any() } + +query predicate grapeRequestGET(Grape::GrapeRequestGetSource src) { any() } + +query predicate grapeRequestPOST(Grape::GrapeRequestPostSource src) { any() } + +query predicate grapeRequestCookies(Grape::GrapeRequestCookiesSource src) { any() } + +query predicate grapeRequestEnv(Grape::GrapeRequestEnvSource src) { any() } + +query predicate grapeRequestQueryString(Grape::GrapeRequestQueryStringSource src) { any() } + +query predicate grapeRequestPathInfo(Grape::GrapeRequestPathInfoSource src) { any() } diff --git a/ruby/ql/test/library-tests/frameworks/grape/app.rb b/ruby/ql/test/library-tests/frameworks/grape/app.rb index 1b1fd15d5d8c..4148e9256768 100644 --- a/ruby/ql/test/library-tests/frameworks/grape/app.rb +++ b/ruby/ql/test/library-tests/frameworks/grape/app.rb @@ -174,7 +174,7 @@ def test_helper sink route_id # $ hasTaintFlow sink auth # $ hasTaintFlow sink session # $ hasTaintFlow - # Note: request.body.read may not be detected by this flow test config + sink body_data # $ hasTaintFlow end get '/helper_test/:user_id' do @@ -237,3 +237,54 @@ def test_helper end end end + +# Exercises `request` sub-accessors (body, params, GET, POST, cookies, env, +# query_string, path_info) as remote flow sources. +class RequestAccessorsAPI < Grape::API + format :json + + get '/body_read_test' do + body_data = request.body.read + sink body_data # $ hasTaintFlow + end + + get '/body_string_test' do + body_data = request.body.string + sink body_data # $ hasTaintFlow + end + + get '/request_params_test' do + params_hash = request.params + sink params_hash # $ hasTaintFlow + end + + get '/request_get_test' do + get_params = request.GET + sink get_params # $ hasTaintFlow + end + + get '/request_post_test' do + post_params = request.POST + sink post_params # $ hasTaintFlow + end + + get '/request_cookies_test' do + cookie_data = request.cookies + sink cookie_data # $ hasTaintFlow + end + + get '/request_env_test' do + env_data = request.env + sink env_data # $ hasTaintFlow + end + + get '/request_query_string_test' do + qs = request.query_string + sink qs # $ hasTaintFlow + end + + get '/request_path_info_test' do + path = request.path_info + sink path # $ hasTaintFlow + end +end diff --git a/ruby/ql/test/query-tests/security/cwe-089/ConnectedToInjection.rb b/ruby/ql/test/query-tests/security/cwe-089/ConnectedToInjection.rb new file mode 100644 index 000000000000..ef8f5f585b4c --- /dev/null +++ b/ruby/ql/test/query-tests/security/cwe-089/ConnectedToInjection.rb @@ -0,0 +1,37 @@ +class EventsController < ActionController::Base + # BAD: remote input captured by a block is interpolated into raw SQL + # executed inside an ActiveRecord `connected_to` role-switch block. + def date_range_report + lower_bound = params[:lower_bound] + upper_bound = params[:upper_bound] + + ApplicationRecord.connected_to(role: :reading) do + ApplicationRecord.connection.execute( + "SELECT * FROM events WHERE start_time BETWEEN '#{lower_bound}' AND '#{upper_bound}'" + ) + end + end + + # BAD: same pattern with a single captured bound + def since_report + lower_bound = params[:lower_bound] + + ApplicationRecord.connected_to(role: :reading) do + ApplicationRecord.connection.execute("SELECT * FROM events WHERE created_at > '#{lower_bound}'") + end + end + + # BAD: value read inside the block is assigned to an outer-scope variable, + # then interpolated into SQL executed after the block returns. + def deferred_report + lower_bound = params[:lower_bound] + captured = nil + + ApplicationRecord.connected_to(role: :reading) do + captured = lower_bound + end + + sql = "SELECT * FROM events WHERE created_at > '#{captured}'" + ApplicationRecord.connection.execute(sql) + end +end From 34a21cc72b1f927f8c9ae865e0ac39f4afb07e81 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 16 Sep 2026 00:34:04 +0000 Subject: [PATCH 1046/2098] Add changed framework coverage reports --- go/documentation/library-coverage/coverage.csv | 10 +++++----- go/documentation/library-coverage/coverage.rst | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/go/documentation/library-coverage/coverage.csv b/go/documentation/library-coverage/coverage.csv index d4266a31dfb4..3e1e307a0669 100644 --- a/go/documentation/library-coverage/coverage.csv +++ b/go/documentation/library-coverage/coverage.csv @@ -3,7 +3,7 @@ package,sink,source,summary,sink:command-injection,sink:credentials-key,sink:jwt archive/tar,,,5,,,,,,,,,,,,,,,,,,,,,,,5, archive/zip,,,6,,,,,,,,,,,,,,,,,,,,,,,6, bufio,,,17,,,,,,,,,,,,,,,,,,,,,,,17, -bytes,,,44,,,,,,,,,,,,,,,,,,,,,,,44, +bytes,,,45,,,,,,,,,,,,,,,,,,,,,,,45, clevergo.tech/clevergo,1,,,,,,,,,,,,,,,,,1,,,,,,,,, cloud.google.com/go/bigquery,1,,,,,,,,,,,,,,1,,,,,,,,,,,, compress/bzip2,,,1,,,,,,,,,,,,,,,,,,,,,,,1, @@ -16,8 +16,8 @@ container/list,,,20,,,,,,,,,,,,,,,,,,,,,,,20, container/ring,,,5,,,,,,,,,,,,,,,,,,,,,,,5, context,,,5,,,,,,,,,,,,,,,,,,,,,,,5, crypto,,,10,,,,,,,,,,,,,,,,,,,,,,,10, -database/sql,30,18,12,,,,,,,,,,,,30,,,,,,18,,,,,12, -encoding,,,81,,,,,,,,,,,,,,,,,,,,,,,81, +database/sql,30,18,14,,,,,,,,,,,,30,,,,,,18,,,,,14, +encoding,,,112,,,,,,,,,,,,,,,,,,,,,,,112, errors,,,4,,,,,,,,,,,,,,,,,,,,,,,4, expvar,,,6,,,,,,,,,,,,,,,,,,,,,,,6, fmt,3,,16,,,,3,,,,,,,,,,,,,,,,,,,16, @@ -126,7 +126,7 @@ launchpad.net/xmlpath,2,,,,,,,,,,,,,,,,,,2,,,,,,,, log,43,,16,,,,43,,,,,,,,,,,,,,,,,,,16, math/big,,,1,,,,,,,,,,,,,,,,,,,,,,,1, mime,,,14,,,,,,,,,,,,,,,,,,,,,,,14, -net,2,16,100,,,,,,1,,,,,,,,1,,,,,,,16,,100, +net,2,16,102,,,,,,1,,,,,,,,1,,,,,,,16,,102, nhooyr.io/websocket,,2,,,,,,,,,,,,,,,,,,,,,,2,,, os,29,12,6,3,,,,,26,,,,,,,,,,,1,,7,3,,1,6, path,,,18,,,,,,,,,,,,,,,,,,,,,,,18, @@ -135,7 +135,7 @@ regexp,10,,20,,,,,,,3,3,4,,,,,,,,,,,,,,20, slices,,,17,,,,,,,,,,,,,,,,,,,,,,,,17 sort,,,1,,,,,,,,,,,,,,,,,,,,,,,1, strconv,,,9,,,,,,,,,,,,,,,,,,,,,,,9, -strings,,,34,,,,,,,,,,,,,,,,,,,,,,,34, +strings,,,47,,,,,,,,,,,,,,,,,,,,,,,46,1 sync,,,34,,,,,,,,,,,,,,,,,,,,,,,34, syscall,5,2,8,5,,,,,,,,,,,,,,,,,,2,,,,8, text/scanner,,,3,,,,,,,,,,,,,,,,,,,,,,,3, diff --git a/go/documentation/library-coverage/coverage.rst b/go/documentation/library-coverage/coverage.rst index fc16fb8c2c57..2123a6ad73f5 100644 --- a/go/documentation/library-coverage/coverage.rst +++ b/go/documentation/library-coverage/coverage.rst @@ -32,7 +32,7 @@ Go framework & library support `Revel `_,"``github.com/revel/revel*``, ``github.com/robfig/revel*``",46,20,4 `SendGrid `_,``github.com/sendgrid/sendgrid-go*``,,1, `Squirrel `_,"``github.com/Masterminds/squirrel*``, ``github.com/lann/squirrel*``, ``gopkg.in/Masterminds/squirrel``",81,,96 - `Standard library `_,"````, ``archive/*``, ``bufio``, ``bytes``, ``cmp``, ``compress/*``, ``container/*``, ``context``, ``crypto``, ``crypto/*``, ``database/*``, ``debug/*``, ``embed``, ``encoding``, ``encoding/*``, ``errors``, ``expvar``, ``flag``, ``fmt``, ``go/*``, ``hash``, ``hash/*``, ``html``, ``html/*``, ``image``, ``image/*``, ``index/*``, ``io``, ``io/*``, ``log``, ``log/*``, ``maps``, ``math``, ``math/*``, ``mime``, ``mime/*``, ``net``, ``net/*``, ``os``, ``os/*``, ``path``, ``path/*``, ``plugin``, ``reflect``, ``reflect/*``, ``regexp``, ``regexp/*``, ``slices``, ``sort``, ``strconv``, ``strings``, ``sync``, ``sync/*``, ``syscall``, ``syscall/*``, ``testing``, ``testing/*``, ``text/*``, ``time``, ``time/*``, ``unicode``, ``unicode/*``, ``unsafe``, ``weak``",52,625,127 + `Standard library `_,"````, ``archive/*``, ``bufio``, ``bytes``, ``cmp``, ``compress/*``, ``container/*``, ``context``, ``crypto``, ``crypto/*``, ``database/*``, ``debug/*``, ``embed``, ``encoding``, ``encoding/*``, ``errors``, ``expvar``, ``flag``, ``fmt``, ``go/*``, ``hash``, ``hash/*``, ``html``, ``html/*``, ``image``, ``image/*``, ``index/*``, ``io``, ``io/*``, ``log``, ``log/*``, ``maps``, ``math``, ``math/*``, ``mime``, ``mime/*``, ``net``, ``net/*``, ``os``, ``os/*``, ``path``, ``path/*``, ``plugin``, ``reflect``, ``reflect/*``, ``regexp``, ``regexp/*``, ``slices``, ``sort``, ``strconv``, ``strings``, ``sync``, ``sync/*``, ``syscall``, ``syscall/*``, ``testing``, ``testing/*``, ``text/*``, ``time``, ``time/*``, ``unicode``, ``unicode/*``, ``unsafe``, ``weak``",52,674,127 `XORM `_,"``github.com/go-xorm/xorm*``, ``xorm.io/xorm*``",,,68 `XPath `_,``github.com/antchfx/xpath*``,,,4 `appleboy/gin-jwt `_,``github.com/appleboy/gin-jwt*``,,,1 @@ -74,5 +74,5 @@ Go framework & library support `xpathparser `_,``github.com/santhosh-tekuri/xpathparser*``,,,2 `yaml `_,``gopkg.in/yaml*``,,9, `zap `_,``go.uber.org/zap*``,,11,33 - Totals,,688,1085,1580 + Totals,,688,1134,1580 From 0c69604412d92a005d4208114a79a8be40afae91 Mon Sep 17 00:00:00 2001 From: Chad Bentz <1760475+felickz@users.noreply.github.com> Date: Tue, 15 Sep 2026 21:14:17 -0400 Subject: [PATCH 1047/2098] Ruby: add inline expectations and regenerate .expected for grape+cwe-089 tests Adds # $ Source / # $ Alert annotations to ConnectedToInjection.rb matching the sibling fixtures' convention. Regenerated Grape.expected/Flow.expected and SqlInjection.expected from verified actual output (codeql test run, CLI 2.27.0). All 3 tests pass: Flow.ql, Grape.ql, SqlInjection.qlref. --- .../frameworks/grape/Flow.expected | 60 +++++++++++++++++++ .../frameworks/grape/Grape.expected | 39 ++++++++++++ .../security/cwe-089/ConnectedToInjection.rb | 14 ++--- .../security/cwe-089/SqlInjection.expected | 44 ++++++++++++++ 4 files changed, 150 insertions(+), 7 deletions(-) diff --git a/ruby/ql/test/library-tests/frameworks/grape/Flow.expected b/ruby/ql/test/library-tests/frameworks/grape/Flow.expected index f04bd930ea97..23f8d78bb053 100644 --- a/ruby/ql/test/library-tests/frameworks/grape/Flow.expected +++ b/ruby/ql/test/library-tests/frameworks/grape/Flow.expected @@ -33,6 +33,8 @@ edges | app.rb:169:9:169:15 | session | app.rb:176:14:176:20 | session | provenance | | | app.rb:169:19:169:25 | call to cookies | app.rb:169:19:169:38 | ...[...] | provenance | | | app.rb:169:19:169:38 | ...[...] | app.rb:169:9:169:15 | session | provenance | | +| app.rb:170:9:170:17 | body_data | app.rb:177:14:177:22 | body_data | provenance | | +| app.rb:170:21:170:37 | call to read | app.rb:170:9:170:17 | body_data | provenance | | | app.rb:183:9:183:14 | result | app.rb:184:14:184:19 | result | provenance | | | app.rb:183:9:183:14 | result | app.rb:184:14:184:19 | result | provenance | | | app.rb:183:18:183:43 | call to vulnerable_helper | app.rb:183:9:183:14 | result | provenance | | @@ -76,6 +78,24 @@ edges | app.rb:235:13:235:23 | case_result | app.rb:236:18:236:28 | case_result | provenance | | | app.rb:235:27:235:37 | call to test_helper | app.rb:235:13:235:23 | case_result | provenance | | | app.rb:235:27:235:37 | call to test_helper | app.rb:235:13:235:23 | case_result | provenance | | +| app.rb:247:5:247:13 | body_data | app.rb:248:10:248:18 | body_data | provenance | | +| app.rb:247:17:247:33 | call to read | app.rb:247:5:247:13 | body_data | provenance | | +| app.rb:252:5:252:13 | body_data | app.rb:253:10:253:18 | body_data | provenance | | +| app.rb:252:17:252:35 | call to string | app.rb:252:5:252:13 | body_data | provenance | | +| app.rb:257:5:257:15 | params_hash | app.rb:258:10:258:20 | params_hash | provenance | | +| app.rb:257:19:257:32 | call to params | app.rb:257:5:257:15 | params_hash | provenance | | +| app.rb:262:5:262:14 | get_params | app.rb:263:10:263:19 | get_params | provenance | | +| app.rb:262:18:262:28 | call to GET | app.rb:262:5:262:14 | get_params | provenance | | +| app.rb:267:5:267:15 | post_params | app.rb:268:10:268:20 | post_params | provenance | | +| app.rb:267:19:267:30 | call to POST | app.rb:267:5:267:15 | post_params | provenance | | +| app.rb:272:5:272:15 | cookie_data | app.rb:273:10:273:20 | cookie_data | provenance | | +| app.rb:272:19:272:33 | call to cookies | app.rb:272:5:272:15 | cookie_data | provenance | | +| app.rb:277:5:277:12 | env_data | app.rb:278:10:278:17 | env_data | provenance | | +| app.rb:277:16:277:26 | call to env | app.rb:277:5:277:12 | env_data | provenance | | +| app.rb:282:5:282:6 | qs | app.rb:283:10:283:11 | qs | provenance | | +| app.rb:282:10:282:29 | call to query_string | app.rb:282:5:282:6 | qs | provenance | | +| app.rb:287:5:287:8 | path | app.rb:288:10:288:13 | path | provenance | | +| app.rb:287:12:287:28 | call to path_info | app.rb:287:5:287:8 | path | 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 | @@ -107,10 +127,13 @@ nodes | app.rb:169:9:169:15 | session | semmle.label | session | | app.rb:169:19:169:25 | call to cookies | semmle.label | call to cookies | | app.rb:169:19:169:38 | ...[...] | semmle.label | ...[...] | +| app.rb:170:9:170:17 | body_data | semmle.label | body_data | +| app.rb:170:21:170:37 | call to read | semmle.label | call to read | | app.rb:173:14:173:20 | user_id | semmle.label | user_id | | app.rb:174:14:174:21 | route_id | semmle.label | route_id | | app.rb:175:14:175:17 | auth | semmle.label | auth | | app.rb:176:14:176:20 | session | semmle.label | session | +| app.rb:177:14:177:22 | body_data | semmle.label | body_data | | app.rb:183:9:183:14 | result | semmle.label | result | | app.rb:183:9:183:14 | result | semmle.label | result | | app.rb:183:18:183:43 | call to vulnerable_helper | semmle.label | call to vulnerable_helper | @@ -173,6 +196,33 @@ nodes | app.rb:235:27:235:37 | call to test_helper | semmle.label | call to test_helper | | app.rb:236:18:236:28 | case_result | semmle.label | case_result | | app.rb:236:18:236:28 | case_result | semmle.label | case_result | +| app.rb:247:5:247:13 | body_data | semmle.label | body_data | +| app.rb:247:17:247:33 | call to read | semmle.label | call to read | +| app.rb:248:10:248:18 | body_data | semmle.label | body_data | +| app.rb:252:5:252:13 | body_data | semmle.label | body_data | +| app.rb:252:17:252:35 | call to string | semmle.label | call to string | +| app.rb:253:10:253:18 | body_data | semmle.label | body_data | +| app.rb:257:5:257:15 | params_hash | semmle.label | params_hash | +| app.rb:257:19:257:32 | call to params | semmle.label | call to params | +| app.rb:258:10:258:20 | params_hash | semmle.label | params_hash | +| app.rb:262:5:262:14 | get_params | semmle.label | get_params | +| app.rb:262:18:262:28 | call to GET | semmle.label | call to GET | +| app.rb:263:10:263:19 | get_params | semmle.label | get_params | +| app.rb:267:5:267:15 | post_params | semmle.label | post_params | +| app.rb:267:19:267:30 | call to POST | semmle.label | call to POST | +| app.rb:268:10:268:20 | post_params | semmle.label | post_params | +| app.rb:272:5:272:15 | cookie_data | semmle.label | cookie_data | +| app.rb:272:19:272:33 | call to cookies | semmle.label | call to cookies | +| app.rb:273:10:273:20 | cookie_data | semmle.label | cookie_data | +| app.rb:277:5:277:12 | env_data | semmle.label | env_data | +| app.rb:277:16:277:26 | call to env | semmle.label | call to env | +| app.rb:278:10:278:17 | env_data | semmle.label | env_data | +| app.rb:282:5:282:6 | qs | semmle.label | qs | +| app.rb:282:10:282:29 | call to query_string | semmle.label | call to query_string | +| app.rb:283:10:283:11 | qs | semmle.label | qs | +| app.rb:287:5:287:8 | path | semmle.label | path | +| app.rb:287:12:287:28 | call to path_info | semmle.label | call to path_info | +| app.rb:288:10:288:13 | path | semmle.label | path | subpaths testFailures #select @@ -180,6 +230,7 @@ testFailures | app.rb:174:14:174:21 | route_id | app.rb:167:20:167:40 | call to route_param | app.rb:174:14:174:21 | route_id | $@ | app.rb:167:20:167:40 | call to route_param | call to route_param | | app.rb:175:14:175:17 | auth | app.rb:168:16:168:22 | call to headers | app.rb:175:14:175:17 | auth | $@ | app.rb:168:16:168:22 | call to headers | call to headers | | app.rb:176:14:176:20 | session | app.rb:169:19:169:25 | call to cookies | app.rb:176:14:176:20 | session | $@ | app.rb:169:19:169:25 | call to cookies | call to cookies | +| app.rb:177:14:177:22 | body_data | app.rb:170:21:170:37 | call to read | app.rb:177:14:177:22 | body_data | $@ | app.rb:170:21:170:37 | call to read | call to read | | app.rb:184:14:184:19 | result | app.rb:107:13:107:32 | call to source | app.rb:184:14:184:19 | result | $@ | app.rb:107:13:107:32 | call to source | call to source | | app.rb:184:14:184:19 | result | app.rb:107:13:107:32 | call to source | app.rb:184:14:184:19 | result | $@ | app.rb:107:13:107:32 | call to source | call to source | | app.rb:191:14:191:22 | user_data | app.rb:103:13:103:18 | call to params | app.rb:191:14:191:22 | user_data | $@ | app.rb:103:13:103:18 | call to params | call to params | @@ -199,3 +250,12 @@ testFailures | app.rb:231:14:231:26 | rescue_result | app.rb:140:17:140:37 | call to source | app.rb:231:14:231:26 | rescue_result | $@ | app.rb:140:17:140:37 | call to source | call to source | | app.rb:236:18:236:28 | case_result | app.rb:150:17:150:35 | call to source | app.rb:236:18:236:28 | case_result | $@ | app.rb:150:17:150:35 | call to source | call to source | | app.rb:236:18:236:28 | case_result | app.rb:150:17:150:35 | call to source | app.rb:236:18:236:28 | case_result | $@ | app.rb:150:17:150:35 | call to source | call to source | +| app.rb:248:10:248:18 | body_data | app.rb:247:17:247:33 | call to read | app.rb:248:10:248:18 | body_data | $@ | app.rb:247:17:247:33 | call to read | call to read | +| app.rb:253:10:253:18 | body_data | app.rb:252:17:252:35 | call to string | app.rb:253:10:253:18 | body_data | $@ | app.rb:252:17:252:35 | call to string | call to string | +| app.rb:258:10:258:20 | params_hash | app.rb:257:19:257:32 | call to params | app.rb:258:10:258:20 | params_hash | $@ | app.rb:257:19:257:32 | call to params | call to params | +| app.rb:263:10:263:19 | get_params | app.rb:262:18:262:28 | call to GET | app.rb:263:10:263:19 | get_params | $@ | app.rb:262:18:262:28 | call to GET | call to GET | +| app.rb:268:10:268:20 | post_params | app.rb:267:19:267:30 | call to POST | app.rb:268:10:268:20 | post_params | $@ | app.rb:267:19:267:30 | call to POST | call to POST | +| app.rb:273:10:273:20 | cookie_data | app.rb:272:19:272:33 | call to cookies | app.rb:273:10:273:20 | cookie_data | $@ | app.rb:272:19:272:33 | call to cookies | call to cookies | +| app.rb:278:10:278:17 | env_data | app.rb:277:16:277:26 | call to env | app.rb:278:10:278:17 | env_data | $@ | app.rb:277:16:277:26 | call to env | call to env | +| app.rb:283:10:283:11 | qs | app.rb:282:10:282:29 | call to query_string | app.rb:283:10:283:11 | qs | $@ | app.rb:282:10:282:29 | call to query_string | call to query_string | +| app.rb:288:10:288:13 | path | app.rb:287:12:287:28 | call to path_info | app.rb:288:10:288:13 | path | $@ | app.rb:287:12:287:28 | call to path_info | call to path_info | diff --git a/ruby/ql/test/library-tests/frameworks/grape/Grape.expected b/ruby/ql/test/library-tests/frameworks/grape/Grape.expected index 7088eeb9018a..574322e208ce 100644 --- a/ruby/ql/test/library-tests/frameworks/grape/Grape.expected +++ b/ruby/ql/test/library-tests/frameworks/grape/Grape.expected @@ -2,6 +2,7 @@ grapeApiClasses | app.rb:1:1:90:3 | MyAPI | | app.rb:92:1:96:3 | AdminAPI | | app.rb:98:1:239:3 | UserAPI | +| app.rb:243:1:290:3 | RequestAccessorsAPI | 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 | @@ -19,6 +20,15 @@ grapeEndpoints | app.rb:98:1:239:3 | UserAPI | app.rb:187:5:193:7 | call to post | POST | /users | | app.rb:98:1:239:3 | UserAPI | app.rb:204:5:207:7 | call to post | POST | /users | | app.rb:98:1:239:3 | UserAPI | app.rb:210:5:238:7 | call to get | GET | /nested_test/:token | +| app.rb:243:1:290:3 | RequestAccessorsAPI | app.rb:246:3:249:5 | call to get | GET | /body_read_test | +| app.rb:243:1:290:3 | RequestAccessorsAPI | app.rb:251:3:254:5 | call to get | GET | /body_string_test | +| app.rb:243:1:290:3 | RequestAccessorsAPI | app.rb:256:3:259:5 | call to get | GET | /request_params_test | +| app.rb:243:1:290:3 | RequestAccessorsAPI | app.rb:261:3:264:5 | call to get | GET | /request_get_test | +| app.rb:243:1:290:3 | RequestAccessorsAPI | app.rb:266:3:269:5 | call to get | GET | /request_post_test | +| app.rb:243:1:290:3 | RequestAccessorsAPI | app.rb:271:3:274:5 | call to get | GET | /request_cookies_test | +| app.rb:243:1:290:3 | RequestAccessorsAPI | app.rb:276:3:279:5 | call to get | GET | /request_env_test | +| app.rb:243:1:290:3 | RequestAccessorsAPI | app.rb:281:3:284:5 | call to get | GET | /request_query_string_test | +| app.rb:243:1:290:3 | RequestAccessorsAPI | app.rb:286:3:289:5 | call to get | GET | /request_path_info_test | grapeParams | app.rb:8:12:8:17 | call to params | | app.rb:14:3:16:5 | call to params | @@ -44,6 +54,15 @@ grapeHeaders grapeRequest | app.rb:25:12:25:18 | call to request | | app.rb:170:21:170:27 | call to request | +| app.rb:247:17:247:23 | call to request | +| app.rb:252:17:252:23 | call to request | +| app.rb:257:19:257:25 | call to request | +| app.rb:262:18:262:24 | call to request | +| app.rb:267:19:267:25 | call to request | +| app.rb:272:19:272:25 | call to request | +| app.rb:277:16:277:22 | call to request | +| app.rb:282:10:282:16 | call to request | +| app.rb:287:12:287:18 | call to request | grapeRouteParam | app.rb:51:15:51:35 | call to route_param | | app.rb:52:15:52:36 | call to route_param | @@ -56,3 +75,23 @@ grapeCookies | app.rb:80:16:80:22 | call to cookies | | app.rb:160:5:162:7 | call to cookies | | app.rb:169:19:169:25 | call to cookies | +grapeRequestBodyRead +| app.rb:25:12:25:28 | call to read | +| app.rb:170:21:170:37 | call to read | +| app.rb:247:17:247:33 | call to read | +grapeRequestBodyString +| app.rb:252:17:252:35 | call to string | +grapeRequestParams +| app.rb:257:19:257:32 | call to params | +grapeRequestGET +| app.rb:262:18:262:28 | call to GET | +grapeRequestPOST +| app.rb:267:19:267:30 | call to POST | +grapeRequestCookies +| app.rb:272:19:272:33 | call to cookies | +grapeRequestEnv +| app.rb:277:16:277:26 | call to env | +grapeRequestQueryString +| app.rb:282:10:282:29 | call to query_string | +grapeRequestPathInfo +| app.rb:287:12:287:28 | call to path_info | diff --git a/ruby/ql/test/query-tests/security/cwe-089/ConnectedToInjection.rb b/ruby/ql/test/query-tests/security/cwe-089/ConnectedToInjection.rb index ef8f5f585b4c..4d57fc9bbe93 100644 --- a/ruby/ql/test/query-tests/security/cwe-089/ConnectedToInjection.rb +++ b/ruby/ql/test/query-tests/security/cwe-089/ConnectedToInjection.rb @@ -2,29 +2,29 @@ class EventsController < ActionController::Base # BAD: remote input captured by a block is interpolated into raw SQL # executed inside an ActiveRecord `connected_to` role-switch block. def date_range_report - lower_bound = params[:lower_bound] - upper_bound = params[:upper_bound] + lower_bound = params[:lower_bound] # $ Source + upper_bound = params[:upper_bound] # $ Source ApplicationRecord.connected_to(role: :reading) do ApplicationRecord.connection.execute( - "SELECT * FROM events WHERE start_time BETWEEN '#{lower_bound}' AND '#{upper_bound}'" + "SELECT * FROM events WHERE start_time BETWEEN '#{lower_bound}' AND '#{upper_bound}'" # $ Alert ) end end # BAD: same pattern with a single captured bound def since_report - lower_bound = params[:lower_bound] + lower_bound = params[:lower_bound] # $ Source ApplicationRecord.connected_to(role: :reading) do - ApplicationRecord.connection.execute("SELECT * FROM events WHERE created_at > '#{lower_bound}'") + ApplicationRecord.connection.execute("SELECT * FROM events WHERE created_at > '#{lower_bound}'") # $ Alert end end # BAD: value read inside the block is assigned to an outer-scope variable, # then interpolated into SQL executed after the block returns. def deferred_report - lower_bound = params[:lower_bound] + lower_bound = params[:lower_bound] # $ Source captured = nil ApplicationRecord.connected_to(role: :reading) do @@ -32,6 +32,6 @@ def deferred_report end sql = "SELECT * FROM events WHERE created_at > '#{captured}'" - ApplicationRecord.connection.execute(sql) + ApplicationRecord.connection.execute(sql) # $ Alert end end diff --git a/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected b/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected index c8926f635c47..590f3bfd104d 100644 --- a/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected +++ b/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected @@ -41,6 +41,10 @@ | ActiveRecordInjection.rb:217:38:217:53 | "role = #{...}" | ActiveRecordInjection.rb:223:29:223:34 | call to params | ActiveRecordInjection.rb:217:38:217:53 | "role = #{...}" | This SQL query depends on a $@. | ActiveRecordInjection.rb:223:29:223: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 | +| ConnectedToInjection.rb:10:9:10:93 | "SELECT * FROM events WHERE st..." | ConnectedToInjection.rb:5:19:5:24 | call to params | ConnectedToInjection.rb:10:9:10:93 | "SELECT * FROM events WHERE st..." | This SQL query depends on a $@. | ConnectedToInjection.rb:5:19:5:24 | call to params | user-provided value | +| ConnectedToInjection.rb:10:9:10:93 | "SELECT * FROM events WHERE st..." | ConnectedToInjection.rb:6:19:6:24 | call to params | ConnectedToInjection.rb:10:9:10:93 | "SELECT * FROM events WHERE st..." | This SQL query depends on a $@. | ConnectedToInjection.rb:6:19:6:24 | call to params | user-provided value | +| ConnectedToInjection.rb:20:44:20:101 | "SELECT * FROM events WHERE cr..." | ConnectedToInjection.rb:17:19:17:24 | call to params | ConnectedToInjection.rb:20:44:20:101 | "SELECT * FROM events WHERE cr..." | This SQL query depends on a $@. | ConnectedToInjection.rb:17:19:17:24 | call to params | user-provided value | +| ConnectedToInjection.rb:35:42:35:44 | sql | ConnectedToInjection.rb:27:19:27:24 | call to params | ConnectedToInjection.rb:35:42:35:44 | sql | This SQL query depends on a $@. | ConnectedToInjection.rb:27:19:27: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 | @@ -130,6 +134,24 @@ 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 | | +| ConnectedToInjection.rb:5:19:5:24 | call to params | ConnectedToInjection.rb:5:19:5:38 | ...[...] | provenance | | +| ConnectedToInjection.rb:5:19:5:38 | ...[...] | ConnectedToInjection.rb:8:52:12:7 | do ... end : [lambda] [captured lower_bound] | provenance | | +| ConnectedToInjection.rb:6:19:6:24 | call to params | ConnectedToInjection.rb:6:19:6:38 | ...[...] | provenance | | +| ConnectedToInjection.rb:6:19:6:38 | ...[...] | ConnectedToInjection.rb:8:52:12:7 | do ... end : [lambda] [captured upper_bound] | provenance | | +| ConnectedToInjection.rb:8:52:12:7 | do ... end : [lambda] [captured lower_bound] | ConnectedToInjection.rb:10:59:10:69 | lower_bound | provenance | heuristic-callback | +| ConnectedToInjection.rb:8:52:12:7 | do ... end : [lambda] [captured upper_bound] | ConnectedToInjection.rb:10:80:10:90 | upper_bound | provenance | heuristic-callback | +| ConnectedToInjection.rb:10:59:10:69 | lower_bound | ConnectedToInjection.rb:10:9:10:93 | "SELECT * FROM events WHERE st..." | provenance | AdditionalTaintStep | +| ConnectedToInjection.rb:10:80:10:90 | upper_bound | ConnectedToInjection.rb:10:9:10:93 | "SELECT * FROM events WHERE st..." | provenance | AdditionalTaintStep | +| ConnectedToInjection.rb:17:19:17:24 | call to params | ConnectedToInjection.rb:17:19:17:38 | ...[...] | provenance | | +| ConnectedToInjection.rb:17:19:17:38 | ...[...] | ConnectedToInjection.rb:19:52:21:7 | do ... end : [lambda] [captured lower_bound] | provenance | | +| ConnectedToInjection.rb:19:52:21:7 | do ... end : [lambda] [captured lower_bound] | ConnectedToInjection.rb:20:88:20:98 | lower_bound | provenance | heuristic-callback | +| ConnectedToInjection.rb:20:88:20:98 | lower_bound | ConnectedToInjection.rb:20:44:20:101 | "SELECT * FROM events WHERE cr..." | provenance | AdditionalTaintStep | +| ConnectedToInjection.rb:27:19:27:24 | call to params | ConnectedToInjection.rb:27:19:27:38 | ...[...] | provenance | | +| ConnectedToInjection.rb:27:19:27:38 | ...[...] | ConnectedToInjection.rb:30:52:32:7 | do ... end : [lambda] [captured lower_bound] | provenance | | +| ConnectedToInjection.rb:30:52:32:7 | [post] do ... end : [lambda] [captured captured] | ConnectedToInjection.rb:34:5:34:7 | sql : String | provenance | AdditionalTaintStep | +| ConnectedToInjection.rb:30:52:32:7 | do ... end : [lambda] [captured lower_bound] | ConnectedToInjection.rb:30:52:32:7 | [post] do ... end : [lambda] [captured captured] | provenance | heuristic-callback | +| ConnectedToInjection.rb:30:52:32:7 | do ... end : [lambda] [captured lower_bound] | ConnectedToInjection.rb:31:18:31:28 | lower_bound | provenance | heuristic-callback | +| ConnectedToInjection.rb:34:5:34:7 | sql : String | ConnectedToInjection.rb:35:42:35:44 | sql | 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 | @@ -258,6 +280,27 @@ 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..." | +| ConnectedToInjection.rb:5:19:5:24 | call to params | semmle.label | call to params | +| ConnectedToInjection.rb:5:19:5:38 | ...[...] | semmle.label | ...[...] | +| ConnectedToInjection.rb:6:19:6:24 | call to params | semmle.label | call to params | +| ConnectedToInjection.rb:6:19:6:38 | ...[...] | semmle.label | ...[...] | +| ConnectedToInjection.rb:8:52:12:7 | do ... end : [lambda] [captured lower_bound] | semmle.label | do ... end : [lambda] [captured lower_bound] | +| ConnectedToInjection.rb:8:52:12:7 | do ... end : [lambda] [captured upper_bound] | semmle.label | do ... end : [lambda] [captured upper_bound] | +| ConnectedToInjection.rb:10:9:10:93 | "SELECT * FROM events WHERE st..." | semmle.label | "SELECT * FROM events WHERE st..." | +| ConnectedToInjection.rb:10:59:10:69 | lower_bound | semmle.label | lower_bound | +| ConnectedToInjection.rb:10:80:10:90 | upper_bound | semmle.label | upper_bound | +| ConnectedToInjection.rb:17:19:17:24 | call to params | semmle.label | call to params | +| ConnectedToInjection.rb:17:19:17:38 | ...[...] | semmle.label | ...[...] | +| ConnectedToInjection.rb:19:52:21:7 | do ... end : [lambda] [captured lower_bound] | semmle.label | do ... end : [lambda] [captured lower_bound] | +| ConnectedToInjection.rb:20:44:20:101 | "SELECT * FROM events WHERE cr..." | semmle.label | "SELECT * FROM events WHERE cr..." | +| ConnectedToInjection.rb:20:88:20:98 | lower_bound | semmle.label | lower_bound | +| ConnectedToInjection.rb:27:19:27:24 | call to params | semmle.label | call to params | +| ConnectedToInjection.rb:27:19:27:38 | ...[...] | semmle.label | ...[...] | +| ConnectedToInjection.rb:30:52:32:7 | [post] do ... end : [lambda] [captured captured] | semmle.label | [post] do ... end : [lambda] [captured captured] | +| ConnectedToInjection.rb:30:52:32:7 | do ... end : [lambda] [captured lower_bound] | semmle.label | do ... end : [lambda] [captured lower_bound] | +| ConnectedToInjection.rb:31:18:31:28 | lower_bound | semmle.label | lower_bound | +| ConnectedToInjection.rb:34:5:34:7 | sql : String | semmle.label | sql : String | +| ConnectedToInjection.rb:35:42:35:44 | sql | semmle.label | sql | | 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 | ...[...] | @@ -272,3 +315,4 @@ nodes | PgInjection.rb:43:5:43:8 | qry3 : String | semmle.label | qry3 : String | | PgInjection.rb:44:29:44:32 | qry3 | semmle.label | qry3 | subpaths +| ConnectedToInjection.rb:30:52:32:7 | do ... end : [lambda] [captured lower_bound] | ConnectedToInjection.rb:31:18:31:28 | lower_bound | ConnectedToInjection.rb:31:18:31:28 | lower_bound | ConnectedToInjection.rb:30:52:32:7 | [post] do ... end : [lambda] [captured captured] | From 0552e750311ba433517d058ba9566c0227ccef0d Mon Sep 17 00:00:00 2001 From: Chad Bentz <1760475+felickz@users.noreply.github.com> Date: Tue, 15 Sep 2026 21:37:24 -0400 Subject: [PATCH 1048/2098] Ruby: add change note for Grape request sub-accessor sources --- ruby/ql/lib/change-notes/2026-09-15-grape-request-sources.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 ruby/ql/lib/change-notes/2026-09-15-grape-request-sources.md diff --git a/ruby/ql/lib/change-notes/2026-09-15-grape-request-sources.md b/ruby/ql/lib/change-notes/2026-09-15-grape-request-sources.md new file mode 100644 index 000000000000..6c10c221b3ab --- /dev/null +++ b/ruby/ql/lib/change-notes/2026-09-15-grape-request-sources.md @@ -0,0 +1,4 @@ +--- +category: feature +--- +* Added modeling for `Grape::API`'s `request` sub-accessors (`body.read`, `body.string`, `params`, `GET`, `POST`, `cookies`, `env`, `query_string`, and `path_info`) as remote flow sources. From 9aabf067ac1ed5c10e7b9905f014149f1e4c8a1a Mon Sep 17 00:00:00 2001 From: Chad Bentz <1760475+felickz@users.noreply.github.com> Date: Tue, 15 Sep 2026 21:46:01 -0400 Subject: [PATCH 1049/2098] Ruby: fix acronym casing in Grape.ql predicate names grapeRequestGET/grapeRequestPOST -> grapeRequestGet/grapeRequestPost, per CodeQL code-scanning naming-convention review comments on the PR. --- ruby/ql/test/library-tests/frameworks/grape/Grape.expected | 4 ++-- ruby/ql/test/library-tests/frameworks/grape/Grape.ql | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ruby/ql/test/library-tests/frameworks/grape/Grape.expected b/ruby/ql/test/library-tests/frameworks/grape/Grape.expected index 574322e208ce..8551596024fb 100644 --- a/ruby/ql/test/library-tests/frameworks/grape/Grape.expected +++ b/ruby/ql/test/library-tests/frameworks/grape/Grape.expected @@ -83,9 +83,9 @@ grapeRequestBodyString | app.rb:252:17:252:35 | call to string | grapeRequestParams | app.rb:257:19:257:32 | call to params | -grapeRequestGET +grapeRequestGet | app.rb:262:18:262:28 | call to GET | -grapeRequestPOST +grapeRequestPost | app.rb:267:19:267:30 | call to POST | grapeRequestCookies | app.rb:272:19:272:33 | call to cookies | diff --git a/ruby/ql/test/library-tests/frameworks/grape/Grape.ql b/ruby/ql/test/library-tests/frameworks/grape/Grape.ql index 21d1fcfd0c16..09997b2c5b56 100644 --- a/ruby/ql/test/library-tests/frameworks/grape/Grape.ql +++ b/ruby/ql/test/library-tests/frameworks/grape/Grape.ql @@ -29,9 +29,9 @@ query predicate grapeRequestBodyString(Grape::GrapeRequestBodyStringSource src) query predicate grapeRequestParams(Grape::GrapeRequestParamsSource src) { any() } -query predicate grapeRequestGET(Grape::GrapeRequestGetSource src) { any() } +query predicate grapeRequestGet(Grape::GrapeRequestGetSource src) { any() } -query predicate grapeRequestPOST(Grape::GrapeRequestPostSource src) { any() } +query predicate grapeRequestPost(Grape::GrapeRequestPostSource src) { any() } query predicate grapeRequestCookies(Grape::GrapeRequestCookiesSource src) { any() } From 1ea39dddcbf8b7f5f6077d022e590e92923fd599 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 16 Sep 2026 06:27:29 +0100 Subject: [PATCH 1050/2098] Fix bad join order in `getANonTestPassingReachingNodeRecursive` --- .../go/dataflow/internal/TaintTrackingUtil.qll | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/go/ql/lib/semmle/go/dataflow/internal/TaintTrackingUtil.qll b/go/ql/lib/semmle/go/dataflow/internal/TaintTrackingUtil.qll index 50b35d14364d..e985383c8cf4 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/TaintTrackingUtil.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/TaintTrackingUtil.qll @@ -336,9 +336,10 @@ private predicate isPossibleInputNode(DataFlow::Node inputNode, FuncDef fd) { * an expression which data flows to from `inputNode`. */ private ControlFlow::Node getANonTestPassingPredecessor( - ControlFlow::Node succ, DataFlow::Node inputNode + ControlFlow::Node succ, DataFlow::Node inputNode, FuncDef fd ) { - isPossibleInputNode(inputNode, succ.getRoot()) and + succ.getRoot() = fd and + isPossibleInputNode(inputNode, fd) and result = succ.getAPredecessor() and not exists(DataFlow::Node switchExprNode | flowsToSwitchExpression(inputNode, switchExprNode) and @@ -360,13 +361,15 @@ private ControlFlow::Node getANonTestPassingPredecessor( } private ControlFlow::Node getANonTestPassingReachingNodeRecursive( - ControlFlow::Node n, DataFlow::Node inputNode + ControlFlow::Node n, DataFlow::Node inputNode, FuncDef fd ) { - isPossibleInputNode(inputNode, n.getRoot()) and + n.getRoot() = fd and + isPossibleInputNode(inputNode, fd) and ( result = n or result = - getANonTestPassingReachingNodeRecursive(getANonTestPassingPredecessor(n, inputNode), inputNode) + getANonTestPassingReachingNodeRecursive(getANonTestPassingPredecessor(n, inputNode, fd), + inputNode, fd) ) } @@ -378,7 +381,7 @@ private ControlFlow::Node getANonTestPassingReachingNodeRecursive( private ControlFlow::Node getANonTestPassingReachingNodeBase( IR::ReturnInstruction ret, DataFlow::Node inputNode ) { - result = getANonTestPassingReachingNodeRecursive(ret, inputNode) + result = getANonTestPassingReachingNodeRecursive(ret, inputNode, ret.getRoot()) } /** From f192711aceabd981a0ce13b28919a4d31e0e8b5c Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Wed, 16 Sep 2026 09:46:25 +0200 Subject: [PATCH 1051/2098] Rust: Copy rust-analyzer update instructions to separate file --- rust/README.md | 56 +-------------------------------- rust/updating-rust-analyzer.md | 57 ++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 55 deletions(-) create mode 100644 rust/updating-rust-analyzer.md diff --git a/rust/README.md b/rust/README.md index b17c9ff12eee..5beb51eb3747 100644 --- a/rust/README.md +++ b/rust/README.md @@ -62,58 +62,4 @@ for code generation to succeed. ### Updating `rust-analyzer` -Here's a rundown of the typical actions to perform to do a rust-analyzer (and other dependencies) update. A one-time setup consists in -installing [`cargo-edit`](https://crates.io/crates/cargo-edit) with `cargo install cargo-edit`. On Ubuntu that also requires -`sudo apt install libssl-dev pkg-config`. - -1. From the root of the `codeql` repo checkout, run a Cargo upgrade: - ``` - cargo upgrade --incompatible --pinned - ``` -2. Look at a diff of the `Cargo.toml` files: if all `ra_ap_` prefixed dependencies have been updated to the same number, go on to the next step. - Otherwise, it means the latest `rust-analyzer` update has not been fully rolled out to all its crates in `crates.io`. - _All `ra_ap_` versions must agree!_ - Downgrade by hand to the minimum one you see, and run a `cargo update` after that to fix the `Cargo.lock` file. -3. Commit the changes, skipping `pre-commit` hooks if you have them enabled: - ``` - git commit -am 'Cargo: upgrade dependencies' --no-verify - ``` -4. Regenerate vendored bazel files (these allow faster builds, particularly on CI where it has to start from scratch each time), commit the changes: - ``` - misc/bazel/3rdparty/update_tree_sitter_extractors_deps.sh - git add . - git commit -am 'Bazel: regenerate vendored cargo dependencies' --no-verify - ``` - > [!NOTE] - > If in step 6 you also bump `rules_rust` or the rust toolchain, those changes invalidate _all_ vendored files (including the - > Python ones under `misc/bazel/3rdparty/py_deps`), not just the tree-sitter ones. In that case run the umbrella script - > `misc/bazel/3rdparty/update_cargo_deps.sh` instead (it regenerates both `py_deps` and `tree_sitter_extractors_deps`, and runs - > `bazel mod tidy`), then commit all the regenerated files. -5. Run codegen - ``` - bazel run //rust/codegen - ``` - Take note whether `rust/schema/ast.py` was changed. That might need tweaks, new tests and/or downgrade/upgrade scripts down the line. -6. Try compiling - ``` - bazel run //rust:install - ``` - * if it succeeds: good! You can move on to the next step. - * if it fails while compiling rust-analyzer dependencies, you need to update the rust toolchain. Sometimes the error will tell you - so explicitly, but it may happen that the error is more obscure. To update the rust toolchain: - * you will need to open a PR on the internal repo updating `RUST_VERSION` in `MODULE.bazel`. In general you can have this merged - independently of the changes in `codeql`. - * in `codeql`, update both `RUST_VERSION` in `MODULE.bazel` _and_ `rust-toolchain.toml` files. You may want to also update the - nightly toolchain in `rust/extractor/src/nightly-toolchain/rust-toolchain.toml` to a more recent date while you're at it. - * a toolchain and/or `rules_rust` bump invalidates the vendored files, so re-run `misc/bazel/3rdparty/update_cargo_deps.sh` - (see the note in step 4) and commit the regenerated files. - * if it fails while compiling rust extractor code, you will need to adapt it to the new library version. - * for example updating annotations in `annotations.py`, adding / removing generated tests. - - If you had to do any changes, commit them. If you updated the rust toolchain, running `rust/lint.py` might reformat or apply new - lints to the code. -7. Check with CI if everything is in order. -8. Run DCA with database caching disabled. Iterate on the code if needed. -9. If in step 5 the schema was updated, add upgrade/downgrade scripts and a change note. This is best done last to reduce the chance of -merge conflicts (none of the other testing depends on having upgrade and downgrade scripts in place). See -[Upgrading a language database schema](docs/prepare-db-upgrade.md). +See [Updating rust-analyzer](UPDATING-RUST-ANALYZER.md). diff --git a/rust/updating-rust-analyzer.md b/rust/updating-rust-analyzer.md new file mode 100644 index 000000000000..0acb59980a0b --- /dev/null +++ b/rust/updating-rust-analyzer.md @@ -0,0 +1,57 @@ +# Updating rust-analyzer + +Here's a rundown of the typical actions to perform to do a rust-analyzer (and other dependencies) update. A one-time setup consists in +installing [`cargo-edit`](https://crates.io/crates/cargo-edit) with `cargo install cargo-edit`. On Ubuntu that also requires +`sudo apt install libssl-dev pkg-config`. + +1. From the root of the `codeql` repo checkout, run a Cargo upgrade: + ``` + cargo upgrade --incompatible --pinned + ``` +2. Look at a diff of the `Cargo.toml` files: if all `ra_ap_` prefixed dependencies have been updated to the same number, go on to the next step. + Otherwise, it means the latest `rust-analyzer` update has not been fully rolled out to all its crates in `crates.io`. + _All `ra_ap_` versions must agree!_ + Downgrade by hand to the minimum one you see, and run a `cargo update` after that to fix the `Cargo.lock` file. +3. Commit the changes, skipping `pre-commit` hooks if you have them enabled: + ``` + git commit -am 'Cargo: upgrade dependencies' --no-verify + ``` +4. Regenerate vendored bazel files (these allow faster builds, particularly on CI where it has to start from scratch each time), commit the changes: + ``` + misc/bazel/3rdparty/update_tree_sitter_extractors_deps.sh + git add . + git commit -am 'Bazel: regenerate vendored cargo dependencies' --no-verify + ``` + > [!NOTE] + > If in step 6 you also bump `rules_rust` or the rust toolchain, those changes invalidate _all_ vendored files (including the + > Python ones under `misc/bazel/3rdparty/py_deps`), not just the tree-sitter ones. In that case run the umbrella script + > `misc/bazel/3rdparty/update_cargo_deps.sh` instead (it regenerates both `py_deps` and `tree_sitter_extractors_deps`, and runs + > `bazel mod tidy`), then commit all the regenerated files. +5. Run codegen + ``` + bazel run //rust/codegen + ``` + Take note whether `rust/schema/ast.py` was changed. That might need tweaks, new tests and/or downgrade/upgrade scripts down the line. +6. Try compiling + ``` + bazel run //rust:install + ``` + * if it succeeds: good! You can move on to the next step. + * if it fails while compiling rust-analyzer dependencies, you need to update the rust toolchain. Sometimes the error will tell you + so explicitly, but it may happen that the error is more obscure. To update the rust toolchain: + * you will need to open a PR on the internal repo updating `RUST_VERSION` in `MODULE.bazel`. In general you can have this merged + independently of the changes in `codeql`. + * in `codeql`, update both `RUST_VERSION` in `MODULE.bazel` _and_ `rust-toolchain.toml` files. You may want to also update the + nightly toolchain in `rust/extractor/src/nightly-toolchain/rust-toolchain.toml` to a more recent date while you're at it. + * a toolchain and/or `rules_rust` bump invalidates the vendored files, so re-run `misc/bazel/3rdparty/update_cargo_deps.sh` + (see the note in step 4) and commit the regenerated files. + * if it fails while compiling rust extractor code, you will need to adapt it to the new library version. + * for example updating annotations in `annotations.py`, adding / removing generated tests. + + If you had to do any changes, commit them. If you updated the rust toolchain, running `rust/lint.py` might reformat or apply new + lints to the code. +7. Check with CI if everything is in order. +8. Run DCA with database caching disabled. Iterate on the code if needed. +9. If in step 5 the schema was updated, add upgrade/downgrade scripts and a change note. This is best done last to reduce the chance of +merge conflicts (none of the other testing depends on having upgrade and downgrade scripts in place). See +[Upgrading a language database schema](docs/prepare-db-upgrade.md). From 16e1aab56a93ec158255e5c9cb9ddf5e6b8f9478 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Wed, 16 Sep 2026 11:31:24 +0200 Subject: [PATCH 1052/2098] Rust: Add script to perform the fixed steps of updating rust-analyzer --- rust/scripts/update_rust_analyzer.py | 184 +++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100755 rust/scripts/update_rust_analyzer.py diff --git a/rust/scripts/update_rust_analyzer.py b/rust/scripts/update_rust_analyzer.py new file mode 100755 index 000000000000..f7e278dcddcf --- /dev/null +++ b/rust/scripts/update_rust_analyzer.py @@ -0,0 +1,184 @@ +#!/usr/bin/env python3 + +import json +import shlex +import subprocess +import sys +import tomllib +import urllib.request +from pathlib import Path + + +REPO_ROOT = Path(__file__).resolve().parents[2] +RUST_EXTRACTOR_MANIFEST = REPO_ROOT / "rust/extractor/Cargo.toml" + +# The files that mention the fixed Rust toolchain version +TOOLCHAIN_RS = REPO_ROOT / "rust/extractor/src/toolchain.rs" +INTEGRATION_TEST_CONFTEST = REPO_ROOT / "rust/ql/integration-tests/conftest.py" +QL_TEST_SETUP = REPO_ROOT / "rust/ql/test/setup.sh" + + +def print_step(number: int, description: str) -> None: + print(f"\nStep {number}: {description}", flush=True) + + +def run(*command: str) -> None: + print(f"+ {shlex.join(command)}", flush=True) + subprocess.run(command, cwd=REPO_ROOT, check=True) + + +def run_codegen() -> None: + try: + run("bazel", "run", "//rust/codegen") + except subprocess.CalledProcessError as error: + print( + "\nCodegen failed. Carry out the instructions from step 4 in rust/updating-rust-analyzer.md manually.", + file=sys.stderr, + flush=True, + ) + raise SystemExit(error.returncode) from None + + +def get_rust_analyzer_version() -> str: + """Get the minimum version of all ra_ap dependencies from `Cargo.toml`.""" + dependencies = tomllib.loads(RUST_EXTRACTOR_MANIFEST.read_text())["dependencies"] + return min( + ( + version + for name, version in dependencies.items() + if name.startswith("ra_ap_") + ), + key=lambda value: tuple(map(int, value.split("."))), + ) + + +def fetch(url: str) -> bytes: + request = urllib.request.Request( + url, + headers={"User-Agent": "github/codeql rust-analyzer updater"}, + ) + with urllib.request.urlopen(request) as response: + return response.read() + + +def get_compatible_rust_toolchain(rust_analyzer_version: str) -> str: + """Get the latest Rust toolchain that precedes our version of rust-analyzer.""" + # Get the release date of the rust-analyzer version + crate_url = f"https://crates.io/api/v1/crates/ra_ap_syntax/{rust_analyzer_version}" + crate = json.loads(fetch(crate_url)) + rust_analyzer_release = crate["version"]["created_at"].split("T")[0] + + # `manifests.txt` is a list of all toolchains. The one we're interested looks likes + # ``` + # static.rust-lang.org/dist/YYYY-MM-DD/channel-rust-stable.toml + # ``` + # where `YYYY-MM-DD` is the last that is earlier than the rust-analyzer release. + rust_manifest = next( + manifest + for manifest in reversed( + fetch("https://static.rust-lang.org/manifests.txt").decode().splitlines() + ) + if manifest.endswith("/channel-rust-stable.toml") + and manifest.split("/")[2] <= rust_analyzer_release + ) + manifest = tomllib.loads(fetch(f"https://{rust_manifest}").decode()) + # The version looks like `version = "0.99.0 (797e8a9bc 2026-08-05)"` - we only want the first part. + return manifest["pkg"]["rust"]["version"].split()[0] + + +def update_fixed_rust_toolchain(version: str) -> None: + """Change the fixed toolchain in the places where it's hardcoded""" + toolchain_rs = TOOLCHAIN_RS.read_text() + prefix = 'const FIXED_RUST_TOOLCHAIN: &str = "' + old_version = toolchain_rs.split(prefix, 1)[1].split('"', 1)[0] + TOOLCHAIN_RS.write_text( + toolchain_rs.replace( + f'{prefix}{old_version}"', + f'{prefix}{version}"', + ) + ) + + for test_setup in (INTEGRATION_TEST_CONFTEST, QL_TEST_SETUP): + contents = test_setup.read_text() + test_setup.write_text( + contents.replace( + f"rustup toolchain install {old_version} ", + f"rustup toolchain install {version} ", + ) + ) + + +def align_rust_analyzer_versions() -> None: + """Align ra_ap dependencies and update the lockfile when versions differ. + + rust-analyzer crates may be published gradually, so this selects the newest + version that is available for every ra_ap dependency. + """ + manifest = RUST_EXTRACTOR_MANIFEST.read_text() + dependencies = { + name: version + for name, version in tomllib.loads(manifest)["dependencies"].items() + if name.startswith("ra_ap_") + } + if len(set(dependencies.values())) == 1: + # All the `ra_ap_` dependencies agree + return + + version = get_rust_analyzer_version() + + for name, old_version in dependencies.items(): + manifest = manifest.replace( + f'{name} = "{old_version}"', + f'{name} = "{version}"', + ) + RUST_EXTRACTOR_MANIFEST.write_text(manifest) + run("cargo", "update") + + +def commit_all(title: str) -> None: + run("git", "add", "--all") + run("git", "commit", "--no-verify", "--allow-empty", "-m", title) + + +def main() -> None: + status = subprocess.run( + ["git", "status", "--porcelain"], + cwd=REPO_ROOT, + check=True, + capture_output=True, + text=True, + ).stdout + if status: + raise RuntimeError("the working tree must be clean") + + print_step(1, "Update dependencies") + old_rust_analyzer_version = get_rust_analyzer_version() + run("cargo", "upgrade", "--incompatible", "--pinned") + new_rust_analyzer_version = get_rust_analyzer_version() + if new_rust_analyzer_version == old_rust_analyzer_version: + run("git", "restore", ".") + print("No new rust-analyzer version available.") + return + + align_rust_analyzer_versions() + commit_all("Cargo: Upgrade dependencies") + + print_step(2, "Update the fixed Rust toolchain used by the extractor") + rust_toolchain = get_compatible_rust_toolchain(new_rust_analyzer_version) + update_fixed_rust_toolchain(rust_toolchain) + commit_all("Rust: Update fixed toolchain") + + print_step(3, "Regenerate vendored bazel files") + run("misc/bazel/3rdparty/update_tree_sitter_extractors_deps.sh") + commit_all("Bazel: Regenerate vendored cargo dependencies") + + print_step(4, "Run codegen") + run_codegen() + commit_all("Rust: Run codegen") + + print_step(5, "Try compiling") + run("bazel", "run", "//rust:install") + + +if __name__ == "__main__": + main() From 04e44e9dd01e37c317c8cf8bf734fb75edb5c7b9 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Wed, 16 Sep 2026 12:20:19 +0200 Subject: [PATCH 1053/2098] Rust: Improvements and additions to the rust-analyzer update instructions --- rust/updating-rust-analyzer.md | 81 ++++++++++++++++++++++++---------- 1 file changed, 58 insertions(+), 23 deletions(-) diff --git a/rust/updating-rust-analyzer.md b/rust/updating-rust-analyzer.md index 0acb59980a0b..168bcefd722a 100644 --- a/rust/updating-rust-analyzer.md +++ b/rust/updating-rust-analyzer.md @@ -4,40 +4,70 @@ Here's a rundown of the typical actions to perform to do a rust-analyzer (and ot installing [`cargo-edit`](https://crates.io/crates/cargo-edit) with `cargo install cargo-edit`. On Ubuntu that also requires `sudo apt install libssl-dev pkg-config`. -1. From the root of the `codeql` repo checkout, run a Cargo upgrade: - ``` - cargo upgrade --incompatible --pinned - ``` -2. Look at a diff of the `Cargo.toml` files: if all `ra_ap_` prefixed dependencies have been updated to the same number, go on to the next step. - Otherwise, it means the latest `rust-analyzer` update has not been fully rolled out to all its crates in `crates.io`. - _All `ra_ap_` versions must agree!_ - Downgrade by hand to the minimum one you see, and run a `cargo update` after that to fix the `Cargo.lock` file. -3. Commit the changes, skipping `pre-commit` hooks if you have them enabled: - ``` - git commit -am 'Cargo: upgrade dependencies' --no-verify - ``` -4. Regenerate vendored bazel files (these allow faster builds, particularly on CI where it has to start from scratch each time), commit the changes: +> [!TIP] +> All steps up to and including running `bazel run //rust:install` are (barring +> any errors) caried out by the script `./scripts/update_rust_analyzer.py`. +> Prefer using the script. + +1. Update dependencies. + 1. From the root of the `codeql` repo checkout, run a Cargo upgrade: + ``` + cargo upgrade --incompatible --pinned + ``` + 2. Look at a diff of the `Cargo.toml` files: if all `ra_ap_` prefixed dependencies have been updated to the same number, go on to the next step. + Otherwise, it means the latest `rust-analyzer` update has not been fully rolled out to all its crates in `crates.io`. + _All `ra_ap_` versions must agree!_ + Downgrade by hand to the minimum one you see, and run a `cargo update` after that to fix the `Cargo.lock` file. + 3. Commit the changes, skipping `pre-commit` hooks if you have them enabled: + ``` + git commit -am 'Cargo: upgrade dependencies' --no-verify + ``` + +2. Update the fixed Rust toolchain used by the extractor. + + The version should be updated to the latest release that precedes the new + rust-analyzer version. + + Grepping for `FIXED_RUST_TOOLCHAIN` shows the places where this version is + written down. + + Commit the changes: `git commit -am 'Rust: Update fixed toolchain'` + +3. Regenerate vendored bazel files (these allow faster builds, particularly on + CI where it has to start from scratch each time), commit the changes: ``` misc/bazel/3rdparty/update_tree_sitter_extractors_deps.sh git add . git commit -am 'Bazel: regenerate vendored cargo dependencies' --no-verify ``` > [!NOTE] - > If in step 6 you also bump `rules_rust` or the rust toolchain, those changes invalidate _all_ vendored files (including the + > If in step 5 you also bump `rules_rust` or the Rust toolchain used for building the extractor, those changes invalidate _all_ vendored files (including the > Python ones under `misc/bazel/3rdparty/py_deps`), not just the tree-sitter ones. In that case run the umbrella script > `misc/bazel/3rdparty/update_cargo_deps.sh` instead (it regenerates both `py_deps` and `tree_sitter_extractors_deps`, and runs > `bazel mod tidy`), then commit all the regenerated files. -5. Run codegen + +4. Run codegen ``` bazel run //rust/codegen ``` - Take note whether `rust/schema/ast.py` was changed. That might need tweaks, new tests and/or downgrade/upgrade scripts down the line. -6. Try compiling + If codegen fails other changes might be neccessary. For instance, adaptions + to `annotations.py`. Make these changes in separate commits. + + Once codegen succeeds commit only the changes made by codegen with + ``` + git commit -am 'Rust: Run codegen' + ``` + + Take note whether `rust/schema/ast.py` was changed. That might need tweaks, + new tests and/or downgrade/upgrade scripts down the line. + + +5. Try compiling ``` bazel run //rust:install ``` * if it succeeds: good! You can move on to the next step. - * if it fails while compiling rust-analyzer dependencies, you need to update the rust toolchain. Sometimes the error will tell you + * if it fails while compiling rust-analyzer dependencies, you need to update the Rust toolchain. Sometimes the error will tell you so explicitly, but it may happen that the error is more obscure. To update the rust toolchain: * you will need to open a PR on the internal repo updating `RUST_VERSION` in `MODULE.bazel`. In general you can have this merged independently of the changes in `codeql`. @@ -50,8 +80,13 @@ installing [`cargo-edit`](https://crates.io/crates/cargo-edit) with `cargo insta If you had to do any changes, commit them. If you updated the rust toolchain, running `rust/lint.py` might reformat or apply new lints to the code. -7. Check with CI if everything is in order. -8. Run DCA with database caching disabled. Iterate on the code if needed. -9. If in step 5 the schema was updated, add upgrade/downgrade scripts and a change note. This is best done last to reduce the chance of -merge conflicts (none of the other testing depends on having upgrade and downgrade scripts in place). See -[Upgrading a language database schema](docs/prepare-db-upgrade.md). + +6. Check with CI if everything is in order. + +7. Run DCA with database caching disabled. Iterate on the code if needed. + +8. If in step 4 the schema was updated, add upgrade/downgrade scripts and a + change note. This is best done last to reduce the chance of merge conflicts + (none of the other testing depends on having upgrade and downgrade scripts + in place). See [Upgrading a language database + schema](docs/prepare-db-upgrade.md). From 8b8e4ec9c7981e305d02f3bb39a9b479c8b77d03 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Wed, 16 Sep 2026 13:51:56 +0200 Subject: [PATCH 1054/2098] Rust: Add agentic workflwo for updating rust-analyzer --- .gitattributes | 3 + .../workflows/update-rust-analyzer.lock.yml | 1821 +++++++++++++++++ .github/workflows/update-rust-analyzer.md | 124 ++ 3 files changed, 1948 insertions(+) create mode 100644 .github/workflows/update-rust-analyzer.lock.yml create mode 100644 .github/workflows/update-rust-analyzer.md diff --git a/.gitattributes b/.gitattributes index 610342ef78b1..a46131cc4cdf 100644 --- a/.gitattributes +++ b/.gitattributes @@ -75,6 +75,9 @@ /ruby/extractor/cargo-bazel-lock.json linguist-generated=true /ruby/extractor/cargo-bazel-lock.json -merge +# GitHub Agentic Workflows compiled output +.github/workflows/*.lock.yml linguist-generated=true + # auto-generated files for the C# build /csharp/paket.lock linguist-generated=true # needs eol=crlf, as `paket` touches this file and saves it as crlf diff --git a/.github/workflows/update-rust-analyzer.lock.yml b/.github/workflows/update-rust-analyzer.lock.yml new file mode 100644 index 000000000000..8bbd82b0e1bb --- /dev/null +++ b/.github/workflows/update-rust-analyzer.lock.yml @@ -0,0 +1,1821 @@ +# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"975f6b8a0aaf64f14026c41946d43a056cec29e198f871dc471ca42d4908ca5a","body_hash":"990718b1868afabca459556cc701c1d0ef315857b226b054dfe36037ea0c6371","compiler_version":"v0.88.7","strict":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.80"}} +# gh-aw-manifest: {"version":1,"secrets":["GH_AW_CI_TRIGGER_TOKEN","GH_AW_DEFAULT_OTLP_HEADERS","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/cache/restore","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/cache/save","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"820762786026740c76f36085b0efc47a31fe5020","version":"v7.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"github/gh-aw-actions/setup","sha":"5e508589e03a7757a7e05b26e834292f5445bfb6","version":"v0.88.7"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.28.14","digest":"sha256:f7df036c86575527b61f3f7df91c4412349a12b2a74988d929eafa2999230c98","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.28.14@sha256:f7df036c86575527b61f3f7df91c4412349a12b2a74988d929eafa2999230c98"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.14","digest":"sha256:6f95e2234dd9bd6333a8ff28ccea7ecf0204acd4a09108723844dbd2bf6268c5","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.14@sha256:6f95e2234dd9bd6333a8ff28ccea7ecf0204acd4a09108723844dbd2bf6268c5"},{"image":"ghcr.io/github/gh-aw-firewall/cli-proxy:0.28.14","digest":"sha256:3a379c5e96e29499c815e9dd2a71334d01c326a9b73991c76544fda9cae35c34","pinned_image":"ghcr.io/github/gh-aw-firewall/cli-proxy:0.28.14@sha256:3a379c5e96e29499c815e9dd2a71334d01c326a9b73991c76544fda9cae35c34"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.28.14","digest":"sha256:2ce8df3abf3e9b76e9c0cf5863da41f1ab3f89b20ad14b988806ab89e7bf2cd5","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.28.14@sha256:2ce8df3abf3e9b76e9c0cf5863da41f1ab3f89b20ad14b988806ab89e7bf2cd5"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.4.18","digest":"sha256:85b940556a8faa4e1fdbef124bfd75f2c4ebd855a10b88a1c3b6f3e97f6f1a53","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.4.18@sha256:85b940556a8faa4e1fdbef124bfd75f2c4ebd855a10b88a1c3b6f3e97f6f1a53"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:0daa8971fa4732b647150cb6524a6b0804b68d5d24f6f58b5dd1af23bd63fb23","pinned_image":"ghcr.io/github/gh-aw-node@sha256:0daa8971fa4732b647150cb6524a6b0804b68d5d24f6f58b5dd1af23bd63fb23"},{"image":"ghcr.io/github/github-mcp-server:v1.11.0","digest":"sha256:fbec75de11c255213fa08d80fb166abe73d851fff631c51c0079872967720699","pinned_image":"ghcr.io/github/github-mcp-server:v1.11.0@sha256:fbec75de11c255213fa08d80fb166abe73d851fff631c51c0079872967720699"}],"mcp_servers":[{"name":"safeoutputs","tools":["create_pull_request","missing_data","missing_tool","noop"]}]} +# This file was automatically generated by gh-aw (v0.88.7). DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md +# +# ___ _ _ +# / _ \ | | (_) +# | |_| | __ _ ___ _ __ | |_ _ ___ +# | _ |/ _` |/ _ \ '_ \| __| |/ __| +# | | | | (_| | __/ | | | |_| | (__ +# \_| |_/\__, |\___|_| |_|\__|_|\___| +# __/ | +# _ _ |___/ +# | | | | / _| | +# | | | | ___ _ __ _ __| |_| | _____ ____ +# | |/\| |/ _ \ '__| |/ /| _| |/ _ \ \ /\ / / ___| +# \ /\ / (_) | | | | ( | | | | (_) \ V V /\__ \ +# \/ \/ \___/|_| |_|\_\|_| |_|\___/ \_/\_/ |___/ +# +# +# To update this file, edit the corresponding .md file and run: +# gh aw compile +# Not all edits will cause changes to this file. +# +# For more information: https://github.github.com/gh-aw/introduction/overview/ +# +# Update the rust-analyzer version used by the Rust extractor and prepare a pull request. +# +# Intent: Keep the Rust extractor on the latest compatible rust-analyzer version with a reviewable, validated pull request. +# +# Secrets used: +# - GH_AW_CI_TRIGGER_TOKEN +# - GH_AW_DEFAULT_OTLP_HEADERS +# - GH_AW_GITHUB_MCP_SERVER_TOKEN +# - GH_AW_GITHUB_TOKEN +# - GITHUB_TOKEN +# +# Custom actions used: +# - actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 +# - actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 +# - actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 +# - actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 +# - actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 +# - actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 (source v9) +# - actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 +# - actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 +# - github/gh-aw-actions/setup@5e508589e03a7757a7e05b26e834292f5445bfb6 # v0.88.7 +# +# Container images used: +# - ghcr.io/github/gh-aw-firewall/agent:0.28.14@sha256:f7df036c86575527b61f3f7df91c4412349a12b2a74988d929eafa2999230c98 +# - ghcr.io/github/gh-aw-firewall/api-proxy:0.28.14@sha256:6f95e2234dd9bd6333a8ff28ccea7ecf0204acd4a09108723844dbd2bf6268c5 +# - ghcr.io/github/gh-aw-firewall/cli-proxy:0.28.14@sha256:3a379c5e96e29499c815e9dd2a71334d01c326a9b73991c76544fda9cae35c34 +# - ghcr.io/github/gh-aw-firewall/squid:0.28.14@sha256:2ce8df3abf3e9b76e9c0cf5863da41f1ab3f89b20ad14b988806ab89e7bf2cd5 +# - ghcr.io/github/gh-aw-mcpg:v0.4.18@sha256:85b940556a8faa4e1fdbef124bfd75f2c4ebd855a10b88a1c3b6f3e97f6f1a53 +# - ghcr.io/github/gh-aw-node@sha256:0daa8971fa4732b647150cb6524a6b0804b68d5d24f6f58b5dd1af23bd63fb23 +# - ghcr.io/github/github-mcp-server:v1.11.0@sha256:fbec75de11c255213fa08d80fb166abe73d851fff631c51c0079872967720699 + +name: "Update rust-analyzer" +on: + # roles: # Roles processed as role check in pre-activation job + # - admin # Roles processed as role check in pre-activation job + # - maintainer # Roles processed as role check in pre-activation job + # - write # Roles processed as role check in pre-activation job + workflow_dispatch: + inputs: + aw_context: + default: "" + description: "Agent caller context (used internally by Agentic Workflows)." + required: false + type: string + +permissions: {} + +concurrency: + cancel-in-progress: false + group: update-rust-analyzer + +run-name: "Update rust-analyzer" + +env: + OTEL_EXPORTER_OTLP_ENDPOINT: ${{ vars.GH_AW_DEFAULT_OTLP_ENDPOINT }} + OTEL_SERVICE_NAME: gh-aw.update-rust-analyzer + OTEL_RESOURCE_ATTRIBUTES: 'gh-aw.workflow.name=Update%20rust-analyzer,gh-aw.repository=${{ github.repository }},gh-aw.run.id=${{ github.run_id }},github.run_id=${{ github.run_id }},gh-aw.engine.id=copilot' + OTEL_EXPORTER_OTLP_HEADERS: ${{ secrets.GH_AW_DEFAULT_OTLP_HEADERS }} + GH_AW_OTLP_ENDPOINTS: '[{"url":"${{ vars.GH_AW_DEFAULT_OTLP_ENDPOINT }}","headers":"${{ secrets.GH_AW_DEFAULT_OTLP_HEADERS }}"}]' + GH_AW_OTLP_IF_MISSING: ignore + +jobs: + activation: + runs-on: ubuntu-slim + permissions: + actions: read + contents: read + env: + GH_AW_MAX_DAILY_AI_CREDITS: ${{ vars.GH_AW_DEFAULT_MAX_DAILY_AI_CREDITS || '5000' }} + GH_AW_RUNTIME_FEATURES: ${{ vars.GH_AW_RUNTIME_FEATURES }} + outputs: + comment_id: "" + comment_repo: "" + daily_ai_credits_exceeded: ${{ steps.daily-effective-workflow-guardrail.outputs.daily_ai_credits_exceeded == 'true' }} + daily_ai_credits_guardrail_status: ${{ steps.daily-effective-workflow-guardrail.outputs.daily_ai_credits_guardrail_status || '' }} + daily_ai_credits_threshold: ${{ steps.daily-effective-workflow-guardrail.outputs.daily_ai_credits_threshold || '' }} + daily_ai_credits_total_effective_tokens: ${{ steps.daily-effective-workflow-guardrail.outputs.daily_ai_credits_total_effective_tokens || '' }} + engine_id: ${{ steps.generate_aw_info.outputs.engine_id }} + lockdown_check_failed: ${{ steps.generate_aw_info.outputs.lockdown_check_failed == 'true' }} + model: ${{ steps.generate_aw_info.outputs.model }} + oauth_token_check_failed: ${{ steps.check-oauth-tokens.outputs.oauth_token_check_failed == 'true' }} + setup-parent-span-id: ${{ steps.setup.outputs.parent-span-id || steps.setup.outputs.span-id }} + setup-span-id: ${{ steps.setup.outputs.span-id }} + setup-trace-id: ${{ steps.setup.outputs.trace-id }} + stale_lock_file_failed: ${{ steps.check-lock-file.outputs.stale_lock_file_failed == 'true' }} + steps: + - name: Setup Scripts + id: setup + uses: github/gh-aw-actions/setup@5e508589e03a7757a7e05b26e834292f5445bfb6 # v0.88.7 + with: + destination: ${{ runner.temp }}/gh-aw/actions + job-name: ${{ github.job }} + safe-output-artifact-client: ${{ env.GH_AW_MAX_DAILY_AI_CREDITS != '' }} + env: + GH_AW_SETUP_WORKFLOW_NAME: "Update rust-analyzer" + GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/update-rust-analyzer.lock.yml@${{ github.ref }} + GH_AW_INFO_VERSION: "1.0.80" + GH_AW_INFO_AWF_VERSION: "v0.28.14" + GH_AW_INFO_ENGINE_ID: "copilot" + - name: Mask OTLP telemetry headers + run: bash "${RUNNER_TEMP}/gh-aw/actions/mask_otlp_headers.sh" + - name: Generate agentic run info + id: generate_aw_info + env: + GH_AW_INFO_ENGINE_ID: "copilot" + GH_AW_INFO_ENGINE_NAME: "GitHub Copilot CLI" + GH_AW_INFO_MODEL: ${{ vars.GH_AW_MODEL_AGENT_COPILOT || vars.GH_AW_DEFAULT_MODEL_COPILOT || 'auto' }} + GH_AW_INFO_VERSION: "1.0.80" + GH_AW_INFO_AGENT_VERSION: "1.0.80" + GH_AW_INFO_CLI_VERSION: "v0.88.7" + GH_AW_INFO_WORKFLOW_NAME: "Update rust-analyzer" + GH_AW_INFO_EXPERIMENTAL: "false" + GH_AW_INFO_SUPPORTS_TOOLS_ALLOWLIST: "true" + GH_AW_INFO_STAGED: "false" + GH_AW_INFO_ALLOWED_DOMAINS: '["defaults","github","github-actions","rust","bazel","python"]' + GH_AW_INFO_FIREWALL_ENABLED: "true" + GH_AW_INFO_AWF_VERSION: "v0.28.14" + GH_AW_INFO_AWMG_VERSION: "" + GH_AW_INFO_FIREWALL_TYPE: "squid" + GH_AW_INFO_AGENT_RUNTIME: "" + GH_AW_INFO_FRONTMATTER_EMOJI: "🦀" + GH_AW_COMPILED_STRICT: "true" + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'generate_aw_info.cjs')); + await main(core, context); + - name: Restore daily AIC usage cache + id: restore-daily-aic-cache + if: ${{ env.GH_AW_MAX_DAILY_AI_CREDITS != '' }} + continue-on-error: true + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + key: agentic-workflow-usage-updaterustanalyzer-${{ github.run_id }} + restore-keys: agentic-workflow-usage-updaterustanalyzer- + path: /tmp/gh-aw/agentic-workflow-usage-cache.jsonl + - name: Restore daily AIC usage cache (artifact fallback) + id: restore-daily-aic-cache-fallback + if: ${{ env.GH_AW_MAX_DAILY_AI_CREDITS != '' }} + continue-on-error: true + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_RESTORE_DAILY_AIC_CACHE_HIT: ${{ steps.restore-daily-aic-cache.outputs.cache-hit }} + GH_AW_RESTORE_DAILY_AIC_CACHE_MATCHED_KEY: ${{ steps.restore-daily-aic-cache.outputs.cache-matched-key }} + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'restore_aic_usage_cache_fallback.cjs')); + await main(); + - name: Check daily workflow token guardrail + id: daily-effective-workflow-guardrail + if: ${{ env.GH_AW_MAX_DAILY_AI_CREDITS != '' }} + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_WORKFLOW_NAME: "Update rust-analyzer" + GH_AW_WORKFLOW_ID: "update-rust-analyzer" + GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + GH_AW_WORKFLOW_DISPATCH_AW_CONTEXT: ${{ github.event.inputs.aw_context || '' }} + GH_AW_HAS_SLASH_COMMAND: "false" + GH_AW_HAS_LABEL_COMMAND: "false" + GH_AW_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_AW_MAX_DAILY_AI_CREDITS: ${{ vars.GH_AW_DEFAULT_MAX_DAILY_AI_CREDITS || '5000' }} + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'check_daily_aic_workflow_guardrail.cjs')); + await main(); + - name: Check for OAuth tokens + id: check-oauth-tokens + run: bash "${RUNNER_TEMP}/gh-aw/actions/check_oauth_tokens.sh" + env: + GH_AW_GITHUB_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN }} + GH_AW_GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN }} + - name: Checkout .github and .agents folders + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + sparse-checkout: | + .github + .agents + .claude + .codex + .gemini + .pi + sparse-checkout-cone-mode: true + fetch-depth: 1 + - name: Save agent config folders for base branch restoration + env: + GH_AW_AGENT_FOLDERS: ".agents .github" + GH_AW_AGENT_FILES: "AGENTS.md" + run: | + bash "${RUNNER_TEMP}/gh-aw/actions/save_base_github_folders.sh" + - name: Check workflow lock file + id: check-lock-file + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_WORKFLOW_FILE: "update-rust-analyzer.lock.yml" + GH_AW_CONTEXT_WORKFLOW_REF: "${{ github.workflow_ref }}" + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'check_workflow_timestamp_api.cjs')); + await main(); + - name: Check compile-agentic version + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_COMPILED_VERSION: "v0.88.7" + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'check_version_updates.cjs')); + await main(); + - name: Log runtime features + if: ${{ contains(toJSON(vars), '"GH_AW_RUNTIME_FEATURES":') }} + run: bash "${RUNNER_TEMP}/gh-aw/actions/log_runtime_features_summary.sh" + - name: Create prompt with built-in context + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_ACTIONS_DIR: ${{ runner.temp }}/gh-aw/actions + GH_AW_PROMPT: ${{ runner.temp }}/gh-aw/aw-prompts/prompt.txt + GH_AW_SAFE_OUTPUTS: ${{ runner.temp }}/gh-aw/safeoutputs/outputs.jsonl + GH_AW_PROMPT_CONFIG: "{\"items\":[{\"content_env\":\"GH_AW_PROMPT_CONTENT_0000\"},{\"file\":\"xpia.md\"},{\"file\":\"temp_folder_prompt.md\"},{\"file\":\"markdown.md\"},{\"file\":\"safe_outputs_prompt.md\"},{\"content_env\":\"GH_AW_PROMPT_CONTENT_0001\"},{\"file\":\"safe_outputs_create_pull_request.md\"},{\"content_env\":\"GH_AW_PROMPT_CONTENT_0002\"},{\"file\":\"mcp_cli_tools_with_safeoutputs_prompt.md\"},{\"content_env\":\"GH_AW_PROMPT_CONTENT_0003\"},{\"file\":\"cli_proxy_with_safeoutputs_prompt.md\"},{\"content_env\":\"GH_AW_PROMPT_CONTENT_0004\"},{\"content_env\":\"GH_AW_PROMPT_CONTENT_0005\"}]}" + GH_AW_EXPR_1A3A194A: ${{ github.event.discussion.number || (fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_type == 'discussion' && fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_number) }} + GH_AW_EXPR_463A214A: ${{ github.event.pull_request.number || (fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_type == 'pull_request' && fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_number) }} + GH_AW_EXPR_802A9F6A: ${{ github.event.issue.number || (fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_type == 'issue' && fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_number) }} + GH_AW_EXPR_FF1D34CE: ${{ github.event.comment.id || fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').comment_id }} + GH_AW_GITHUB_ACTOR: ${{ github.actor }} + GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} + GH_AW_GITHUB_RUN_ID: ${{ github.run_id }} + GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} + GH_AW_PROMPT_CONTENT_0000: "\n" + GH_AW_PROMPT_CONTENT_0001: "\nTools: create_pull_request, missing_tool, missing_data, noop\n" + GH_AW_PROMPT_CONTENT_0002: "\n" + GH_AW_PROMPT_CONTENT_0003: "\nThe following GitHub context information is available for this workflow:\n{{#if github.actor}}\n- **actor**: __GH_AW_GITHUB_ACTOR__\n{{/if}}\n{{#if github.repository}}\n- **repository**: __GH_AW_GITHUB_REPOSITORY__\n{{/if}}\n{{#if github.workspace}}\n- **workspace**: __GH_AW_GITHUB_WORKSPACE__\n{{/if}}\n{{#if github.event.issue.number || (github.aw.context.item_type == 'issue' && github.aw.context.item_number)}}\n- **issue-number**: #__GH_AW_EXPR_802A9F6A__\n{{/if}}\n{{#if github.event.discussion.number || (github.aw.context.item_type == 'discussion' && github.aw.context.item_number)}}\n- **discussion-number**: #__GH_AW_EXPR_1A3A194A__\n{{/if}}\n{{#if github.event.pull_request.number || (github.aw.context.item_type == 'pull_request' && github.aw.context.item_number)}}\n- **pull-request-number**: #__GH_AW_EXPR_463A214A__\n{{/if}}\n{{#if github.event.comment.id || github.aw.context.comment_id}}\n- **comment-id**: __GH_AW_EXPR_FF1D34CE__\n{{/if}}\n{{#if github.run_id}}\n- **workflow-run-id**: __GH_AW_GITHUB_RUN_ID__\n{{/if}}\n- **checkouts**: The following repositories have been checked out and are available in the workspace:\n - repo `__GH_AW_GITHUB_REPOSITORY__` → `$GITHUB_WORKSPACE` (cwd) [full history, all branches available as remote-tracking refs]\n - **Note**: If a branch you need is not in the list above and is not listed as an additional fetched ref, it has NOT been checked out. For private repositories you cannot fetch it. If the branch is required and not available, exit with an error and ask the user to add it to the `fetch:` option of the `checkout:` configuration (e.g., `fetch: [\"refs/pulls/open/*\"]` for all open PR refs, or `fetch: [\"main\", \"feature/my-branch\"]` for specific branches).\n - **Warning: No git credentials are available to the agent.** Credentials are\n intentionally removed after the checkout step for security. This means any git\n operation that needs to authenticate to the remote will fail. In private repositories, that includes:\n - `git fetch`, `git pull`, `git clone`, and `git push` (direct push, not via safe-output tools)\n - Checking out or switching to a remote branch that is not already fetched\n - Deepening a shallow clone (`git fetch --unshallow`)\n - On-demand blob fetches in partial/blobless clones (operations on files not in the initial checkout)\n Do NOT attempt to configure credentials, run `git credential fill`, or modify `.gitconfig` —\n authentication will not succeed. If you encounter credential prompts or authentication errors,\n stop immediately and report the limitation rather than spending turns trying to work around it.\n\n\n" + GH_AW_PROMPT_CONTENT_0004: "\n" + GH_AW_PROMPT_CONTENT_0005: "{{#runtime-import .github/workflows/update-rust-analyzer.md}}\n" + with: + script: | + const { setupGlobals } = require(process.env.GH_AW_ACTIONS_DIR + '/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(process.env.GH_AW_ACTIONS_DIR + '/create_prompt.cjs'); + await main(core); + - name: Interpolate variables and render templates + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_PROMPT: ${{ runner.temp }}/gh-aw/aw-prompts/prompt.txt + GH_AW_ENGINE_ID: "copilot" + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'interpolate_prompt.cjs')); + await main(); + - name: Substitute placeholders + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_PROMPT: ${{ runner.temp }}/gh-aw/aw-prompts/prompt.txt + GH_AW_EXPR_1A3A194A: ${{ github.event.discussion.number || (fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_type == 'discussion' && fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_number) }} + GH_AW_EXPR_463A214A: ${{ github.event.pull_request.number || (fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_type == 'pull_request' && fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_number) }} + GH_AW_EXPR_802A9F6A: ${{ github.event.issue.number || (fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_type == 'issue' && fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_number) }} + GH_AW_EXPR_FF1D34CE: ${{ github.event.comment.id || fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').comment_id }} + GH_AW_GITHUB_ACTOR: ${{ github.actor }} + GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} + GH_AW_GITHUB_RUN_ID: ${{ github.run_id }} + GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} + GH_AW_MCP_CLI_SERVERS_LIST: '- `safeoutputs` — run `safeoutputs --help` to see available tools' + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + + const substitutePlaceholders = require(path.join(actionsDir, 'substitute_placeholders.cjs')); + + // Call the substitution function + return await substitutePlaceholders({ + file: process.env.GH_AW_PROMPT, + substitutions: { + GH_AW_EXPR_1A3A194A: process.env.GH_AW_EXPR_1A3A194A, + GH_AW_EXPR_463A214A: process.env.GH_AW_EXPR_463A214A, + GH_AW_EXPR_802A9F6A: process.env.GH_AW_EXPR_802A9F6A, + GH_AW_EXPR_FF1D34CE: process.env.GH_AW_EXPR_FF1D34CE, + GH_AW_GITHUB_ACTOR: process.env.GH_AW_GITHUB_ACTOR, + GH_AW_GITHUB_REPOSITORY: process.env.GH_AW_GITHUB_REPOSITORY, + GH_AW_GITHUB_RUN_ID: process.env.GH_AW_GITHUB_RUN_ID, + GH_AW_GITHUB_WORKSPACE: process.env.GH_AW_GITHUB_WORKSPACE, + GH_AW_MCP_CLI_SERVERS_LIST: process.env.GH_AW_MCP_CLI_SERVERS_LIST + } + }); + - name: Validate prompt placeholders + env: + GH_AW_PROMPT: ${{ runner.temp }}/gh-aw/aw-prompts/prompt.txt + run: | + bash "${RUNNER_TEMP}/gh-aw/actions/validate_prompt_placeholders.sh" + - name: Print prompt + env: + GH_AW_PROMPT: ${{ runner.temp }}/gh-aw/aw-prompts/prompt.txt + run: | + bash "${RUNNER_TEMP}/gh-aw/actions/print_prompt_summary.sh" + - name: Stage prompt files for artifact upload + run: | + mkdir -p /tmp/gh-aw/aw-prompts + cp -a "${RUNNER_TEMP}/gh-aw/aw-prompts/." /tmp/gh-aw/aw-prompts/ + - name: Upload activation artifact + if: success() || failure() + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: activation + include-hidden-files: true + path: | + /tmp/gh-aw/aw_info.json + /tmp/gh-aw/models.json + /tmp/gh-aw/aw-prompts/prompt.txt + /tmp/gh-aw/aw-prompts/prompt-template.txt + /tmp/gh-aw/aw-prompts/prompt-import-tree.json + /tmp/gh-aw/github_rate_limits.jsonl + /tmp/gh-aw/base + /tmp/gh-aw/.github/agents + /tmp/gh-aw/.github/skills + if-no-files-found: ignore + retention-days: 1 + + agent: + needs: activation + if: needs.activation.outputs.daily_ai_credits_exceeded != 'true' + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + copilot-requests: write + pull-requests: read + timeout-minutes: 180 + env: + DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} + GH_AW_ASSETS_ALLOWED_EXTS: "" + GH_AW_ASSETS_BRANCH: "" + GH_AW_ASSETS_MAX_SIZE_KB: 0 + GH_AW_MCP_LOG_DIR: /tmp/gh-aw/mcp-logs/safeoutputs + GH_AW_PR_HEAD_BASE_BRANCH: "" + GH_AW_PR_HEAD_BASE_PR_NUMBER: "" + GH_AW_PR_HEAD_BASE_REF: "" + GH_AW_PR_HEAD_BASE_REPO: "" + GH_AW_PR_HEAD_BASE_SHA: "" + GH_AW_PR_HEAD_REPO: "" + GH_AW_RUNTIME_FEATURES: ${{ vars.GH_AW_RUNTIME_FEATURES }} + GH_AW_WORKFLOW_ID_SANITIZED: updaterustanalyzer + outputs: + agentic_engine_timeout: ${{ steps.detect-agent-errors.outputs.agentic_engine_timeout || 'false' }} + ai_credits_rate_limit_error: ${{ steps.parse-mcp-gateway.outputs.ai_credits_rate_limit_error || 'false' }} + aic: ${{ steps.parse-mcp-gateway.outputs.aic }} + ambient_context: ${{ steps.parse-mcp-gateway.outputs.ambient_context }} + checkout_pr_success: ${{ steps.checkout-pr.outputs.checkout_pr_success || 'true' }} + effective_tokens: ${{ steps.parse-mcp-gateway.outputs.effective_tokens }} + has_patch: ${{ steps.collect_output.outputs.has_patch }} + http_400_response_error: ${{ steps.detect-agent-errors.outputs.http_400_response_error || 'false' }} + inference_access_error: ${{ steps.detect-agent-errors.outputs.inference_access_error || 'false' }} + invocation_cap_exceeded: ${{ steps.detect-agent-errors.outputs.invocation_cap_exceeded || 'false' }} + max_cache_misses_exceeded: ${{ steps.detect-agent-errors.outputs.max_cache_misses_exceeded || 'false' }} + mcp_policy_error: ${{ steps.detect-agent-errors.outputs.mcp_policy_error || 'false' }} + missing_model_pricing_error: ${{ steps.detect-agent-errors.outputs.missing_model_pricing_error || 'false' }} + missing_model_pricing_model_name: ${{ steps.detect-agent-errors.outputs.missing_model_pricing_model_name || '' }} + model: ${{ needs.activation.outputs.model }} + model_not_supported_error: ${{ steps.detect-agent-errors.outputs.model_not_supported_error || 'false' }} + output: ${{ steps.collect_output.outputs.output }} + output_types: ${{ steps.collect_output.outputs.output_types }} + setup-parent-span-id: ${{ steps.setup.outputs.parent-span-id || steps.setup.outputs.span-id }} + setup-span-id: ${{ steps.setup.outputs.span-id }} + setup-trace-id: ${{ steps.setup.outputs.trace-id }} + shell_expansion_guard_rejected: ${{ steps.detect-agent-errors.outputs.shell_expansion_guard_rejected || 'false' }} + unknown_model_ai_credits: ${{ steps.parse-mcp-gateway.outputs.unknown_model_ai_credits || 'false' }} + steps: + - name: Setup Scripts + id: setup + uses: github/gh-aw-actions/setup@5e508589e03a7757a7e05b26e834292f5445bfb6 # v0.88.7 + with: + destination: ${{ runner.temp }}/gh-aw/actions + job-name: ${{ github.job }} + trace-id: ${{ needs.activation.outputs.setup-trace-id }} + parent-span-id: ${{ needs.activation.outputs.setup-parent-span-id || needs.activation.outputs.setup-span-id }} + env: + GH_AW_SETUP_WORKFLOW_NAME: "Update rust-analyzer" + GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/update-rust-analyzer.lock.yml@${{ github.ref }} + GH_AW_INFO_VERSION: "1.0.80" + GH_AW_INFO_AWF_VERSION: "v0.28.14" + GH_AW_INFO_ENGINE_ID: "copilot" + - name: Set runtime paths + id: set-runtime-paths + env: + GH_AW_RUNNER_TOOL_CACHE: ${{ runner.tool_cache }} + run: | + if [ -z "${RUNNER_TOOL_CACHE:-}" ]; then + echo "RUNNER_TOOL_CACHE=${GH_AW_RUNNER_TOOL_CACHE}" >> "$GITHUB_ENV" + fi + { + echo "GH_AW_SAFE_OUTPUTS=${RUNNER_TEMP}/gh-aw/safeoutputs/outputs.jsonl" + echo "GH_AW_SAFE_OUTPUTS_CONFIG_PATH=${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" + echo "GH_AW_SAFE_OUTPUTS_TOOLS_PATH=${RUNNER_TEMP}/gh-aw/safeoutputs/tools.json" + } >> "$GITHUB_OUTPUT" + - name: Mask OTLP telemetry headers + run: bash "${RUNNER_TEMP}/gh-aw/actions/mask_otlp_headers.sh" + - name: Check OTLP telemetry configuration + run: bash "${RUNNER_TEMP}/gh-aw/actions/check_otlp_default_credentials.sh" + - name: Checkout repository + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + fetch-depth: 0 + - name: Create gh-aw temp directory + run: bash "${RUNNER_TEMP}/gh-aw/actions/create_gh_aw_tmp_dir.sh" + - name: Configure gh CLI for GitHub Enterprise + run: bash "${RUNNER_TEMP}/gh-aw/actions/configure_gh_for_ghe.sh" + env: + GH_TOKEN: ${{ github.token }} + - name: Download activation artifact + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: activation + path: /tmp/gh-aw + - name: Configure Git + run: | + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + - continue-on-error: true + name: Install cargo-edit + run: cargo install cargo-edit --locked + - name: Run rust-analyzer updater script + run: "mkdir -p /tmp/gh-aw/agent\nset +e\npython3 rust/scripts/update_rust_analyzer.py \\\n 2>&1 | tee /tmp/gh-aw/agent/rust-analyzer-update.log\nstatus=${PIPESTATUS[0]}\nset -e\n\nprintf '%s\\n' \"$status\" > /tmp/gh-aw/agent/rust-analyzer-update-status.txt\nif grep -Fxq \"No new rust-analyzer version available.\" \\\n /tmp/gh-aw/agent/rust-analyzer-update.log; then\n printf '%s\\n' \"no-update\" > /tmp/gh-aw/agent/rust-analyzer-update-result.txt\nelse\n printf '%s\\n' \"update\" > /tmp/gh-aw/agent/rust-analyzer-update-result.txt\nfi" + + - name: Configure Git credentials + env: + GITHUB_REPOSITORY: ${{ github.repository }} + GITHUB_SERVER_URL: ${{ github.server_url }} + GITHUB_TOKEN: ${{ github.token }} + run: bash "${RUNNER_TEMP}/gh-aw/actions/configure_git_credentials.sh" + - name: Checkout PR branch + id: checkout-pr + if: | + github.event.pull_request || github.event.issue.pull_request || github.event_name == 'workflow_dispatch' && fromJSON(github.event.inputs.aw_context || '{}').item_type == 'pull_request' + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + with: + github-token: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'checkout_pr_branch.cjs')); + await main(); + - name: Install GitHub Copilot CLI + run: bash "${RUNNER_TEMP}/gh-aw/actions/install_copilot_cli.sh" + env: + GH_HOST: github.com + GH_AW_COMPILED_VERSION: v0.88.7 + - name: Install AWF binary + run: bash "${RUNNER_TEMP}/gh-aw/actions/install_awf_binary.sh" v0.28.14 --rootless + - name: Determine automatic lockdown mode for GitHub MCP Server + id: determine-automatic-lockdown + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 (source v9) + env: + GH_AW_GITHUB_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN }} + GH_AW_GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN }} + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const determineAutomaticLockdown = require(path.join(actionsDir, 'determine_automatic_lockdown.cjs')); + await determineAutomaticLockdown(github, context, core); + - name: Restore agent config folders from base branch + if: steps.checkout-pr.outcome == 'success' + env: + GH_AW_AGENT_FOLDERS: ".agents .github" + GH_AW_AGENT_FILES: "AGENTS.md" + run: bash "${RUNNER_TEMP}/gh-aw/actions/restore_base_github_folders.sh" + - name: Restore inline sub-agents from activation artifact + env: + GH_AW_SUB_AGENT_DIR: ".github/agents" + GH_AW_SUB_AGENT_EXT: ".agent.md" + run: bash "${RUNNER_TEMP}/gh-aw/actions/restore_inline_sub_agents.sh" + - name: Restore inline skills from activation artifact + env: + GH_AW_SKILL_DIR: ".github/skills" + run: bash "${RUNNER_TEMP}/gh-aw/actions/restore_inline_skills.sh" + - name: Download container images + run: bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" ghcr.io/github/gh-aw-firewall/agent:0.28.14@sha256:f7df036c86575527b61f3f7df91c4412349a12b2a74988d929eafa2999230c98 ghcr.io/github/gh-aw-firewall/api-proxy:0.28.14@sha256:6f95e2234dd9bd6333a8ff28ccea7ecf0204acd4a09108723844dbd2bf6268c5 ghcr.io/github/gh-aw-firewall/cli-proxy:0.28.14@sha256:3a379c5e96e29499c815e9dd2a71334d01c326a9b73991c76544fda9cae35c34 ghcr.io/github/gh-aw-firewall/squid:0.28.14@sha256:2ce8df3abf3e9b76e9c0cf5863da41f1ab3f89b20ad14b988806ab89e7bf2cd5 ghcr.io/github/gh-aw-mcpg:v0.4.18@sha256:85b940556a8faa4e1fdbef124bfd75f2c4ebd855a10b88a1c3b6f3e97f6f1a53 ghcr.io/github/gh-aw-node@sha256:0daa8971fa4732b647150cb6524a6b0804b68d5d24f6f58b5dd1af23bd63fb23 ghcr.io/github/github-mcp-server:v1.11.0@sha256:fbec75de11c255213fa08d80fb166abe73d851fff631c51c0079872967720699 + - name: Prepare Safe Outputs Directories + run: | + mkdir -p "${RUNNER_TEMP}/gh-aw/safeoutputs" + mkdir -p /tmp/gh-aw/safeoutputs + mkdir -p /tmp/gh-aw/mcp-logs/safeoutputs + - name: Generate Safe Outputs Config + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_FILE_ROOT: "${{ runner.temp }}/gh-aw" + GH_AW_FILE_CONFIG: "{\"files\":[{\"path\":\"safeoutputs/config.json\",\"content_env\":\"GH_AW_SAFE_OUTPUTS_CONFIG\"}]}" + GH_AW_SAFE_OUTPUTS_CONFIG: "{\"create_pull_request\":{\"allowed_files\":[\"Cargo.lock\",\"MODULE.bazel\",\"MODULE.bazel.lock\",\"rust-toolchain.toml\",\"rust/**\",\"misc/bazel/3rdparty/**\"],\"branch_prefix\":\"automation/update-rust-analyzer/\",\"draft\":true,\"max\":1,\"max_patch_files\":1000,\"max_patch_size\":10240,\"protect_top_level_dot_folders\":true,\"protected_files\":[\"package.json\",\"bun.lockb\",\"bunfig.toml\",\"deno.json\",\"deno.jsonc\",\"deno.lock\",\"global.json\",\"NuGet.Config\",\"Directory.Packages.props\",\"mix.exs\",\"mix.lock\",\"go.mod\",\"go.sum\",\"stack.yaml\",\"stack.yaml.lock\",\"pom.xml\",\"build.gradle\",\"build.gradle.kts\",\"settings.gradle\",\"settings.gradle.kts\",\"gradle.properties\",\"package-lock.json\",\"yarn.lock\",\"pnpm-lock.yaml\",\"npm-shrinkwrap.json\",\"requirements.txt\",\"Pipfile\",\"Pipfile.lock\",\"pyproject.toml\",\"setup.py\",\"setup.cfg\",\"Gemfile\",\"Gemfile.lock\",\"uv.lock\",\"CODEOWNERS\",\"DESIGN.md\",\"README.md\",\"CONTRIBUTING.md\",\"CHANGELOG.md\",\"SECURITY.md\",\"CODE_OF_CONDUCT.md\",\"AGENTS.md\"],\"protected_files_policy\":\"allowed\",\"title_prefix\":\"Rust: \"},\"create_report_incomplete_issue\":{},\"missing_data\":{},\"missing_tool\":{},\"noop\":{\"max\":1,\"report-as-issue\":\"false\"},\"report_incomplete\":{}}" + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'create_files.cjs')); + await main(); + - name: Generate Safe Outputs Tools + env: + GH_AW_TOOLS_META_JSON: | + { + "description_suffixes": { + "create_pull_request": " CONSTRAINTS: Maximum 1 pull request(s) can be created. Branch name will be prefixed with \"automation/update-rust-analyzer/\". Title will be prefixed with \"Rust: \". PRs will be created as drafts." + }, + "repo_params": {}, + "dynamic_tools": [] + } + GH_AW_VALIDATION_JSON: | + { + "create_pull_request": { + "defaultMax": 1, + "fields": { + "base": { + "type": "string", + "sanitize": true, + "maxLength": 128 + }, + "body": { + "required": true, + "type": "string", + "sanitize": true, + "maxLength": 65000 + }, + "branch": { + "required": true, + "type": "string", + "sanitize": true, + "maxLength": 256 + }, + "dependencies": { + "type": "array", + "itemType": "string", + "itemSanitize": true, + "itemMaxLength": 256 + }, + "draft": { + "type": "boolean" + }, + "labels": { + "type": "array", + "itemType": "string", + "itemSanitize": true, + "itemMaxLength": 128 + }, + "repo": { + "type": "string", + "maxLength": 256 + }, + "stack_position": { + "optionalPositiveInteger": true + }, + "stack_root": { + "type": "string", + "sanitize": true, + "maxLength": 256 + }, + "temporary_id": { + "type": "string", + "pattern": "^#?aw_[A-Za-z0-9_]{3,12}$" + }, + "title": { + "required": true, + "type": "string", + "sanitize": true, + "maxLength": 128 + } + } + }, + "missing_data": { + "defaultMax": 20, + "fields": { + "alternatives": { + "type": "string", + "sanitize": true, + "maxLength": 256 + }, + "context": { + "type": "string", + "sanitize": true, + "maxLength": 256 + }, + "data_type": { + "type": "string", + "sanitize": true, + "maxLength": 128 + }, + "reason": { + "type": "string", + "sanitize": true, + "maxLength": 256 + } + } + }, + "missing_tool": { + "defaultMax": 20, + "fields": { + "alternatives": { + "type": "string", + "sanitize": true, + "maxLength": 512 + }, + "reason": { + "required": true, + "type": "string", + "sanitize": true, + "maxLength": 256 + }, + "tool": { + "type": "string", + "sanitize": true, + "maxLength": 128 + } + } + }, + "noop": { + "defaultMax": 1, + "fields": { + "message": { + "required": true, + "type": "string", + "sanitize": true, + "maxLength": 65000 + } + } + }, + "report_incomplete": { + "defaultMax": 5, + "fields": { + "details": { + "type": "string", + "sanitize": true, + "maxLength": 65000 + }, + "reason": { + "required": true, + "type": "string", + "sanitize": true, + "maxLength": 1024 + } + } + } + } + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'generate_safe_outputs_tools.cjs')); + await main(); + - name: Start MCP Gateway + id: start-mcp-gateway + env: + GH_AW_POLICY_ALLOW_CREATE_PULL_REQUEST: ${{ vars.GH_AW_POLICY_ALLOW_CREATE_PULL_REQUEST || 'true' }} + GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} + GH_AW_SAFE_OUTPUTS_CONFIG_PATH: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS_CONFIG_PATH }} + GH_AW_SAFE_OUTPUTS_TOOLS_PATH: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS_TOOLS_PATH }} + GH_AW_SINK_VISIBILITY: ${{ steps.determine-automatic-lockdown.outputs.visibility }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + set -eo pipefail + mkdir -p "${RUNNER_TEMP}/gh-aw/mcp-config" + if [ -n "${GITHUB_EVENT_PATH:-}" ] && [ -r "${GITHUB_EVENT_PATH}" ]; then + GH_AW_SAFEOUTPUTS_EVENT_PATH="${RUNNER_TEMP}/gh-aw/safeoutputs/github_event.json" + cp "${GITHUB_EVENT_PATH}" "${GH_AW_SAFEOUTPUTS_EVENT_PATH}" + export GITHUB_EVENT_PATH="${GH_AW_SAFEOUTPUTS_EVENT_PATH}" + fi + + # Export gateway environment variables for MCP config and gateway script + export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_DOMAIN="awmg-mcpg" + export MCP_GATEWAY_HOST_DOMAIN="localhost" + MCP_GATEWAY_AGENT_ID=$(openssl rand -base64 45 | tr -d '/+=') + echo "::add-mask::${MCP_GATEWAY_AGENT_ID}" + export MCP_GATEWAY_AGENT_ID + export MCP_GATEWAY_PAYLOAD_DIR="/tmp/gh-aw/mcp-payloads" + mkdir -p "${MCP_GATEWAY_PAYLOAD_DIR}" + export MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD="524288" + export MCP_GATEWAY_ALLOWED_MOUNT_ROOTS="${GITHUB_WORKSPACE}:rw,${RUNNER_TEMP}/gh-aw:ro,${RUNNER_TEMP}/gh-aw/safeoutputs:rw,/opt:ro,/tmp:rw,/usr/bin/gh:ro" + export GH_AW_PR_HEAD_BASE_BRANCH="${GH_AW_PR_HEAD_BASE_BRANCH:-}" + export GH_AW_PR_HEAD_BASE_SHA="${GH_AW_PR_HEAD_BASE_SHA:-}" + export GH_AW_PR_HEAD_BASE_REPO="${GH_AW_PR_HEAD_BASE_REPO:-}" + export GH_AW_PR_HEAD_BASE_PR_NUMBER="${GH_AW_PR_HEAD_BASE_PR_NUMBER:-}" + export GH_AW_PR_HEAD_BASE_REF="${GH_AW_PR_HEAD_BASE_REF:-}" + export GH_AW_PR_HEAD_REPO="${GH_AW_PR_HEAD_REPO:-}" + export DEBUG="*" + + export GH_AW_ENGINE="copilot" + MCP_GATEWAY_UID=$(id -u 2>/dev/null || echo '0') + MCP_GATEWAY_GID=$(id -g 2>/dev/null || echo '0') + source "${RUNNER_TEMP}/gh-aw/actions/resolve_docker_socket_gid.sh" + export MCP_GATEWAY_DOCKER_COMMAND='docker run -i --rm --network bridge -p 127.0.0.1:'"${MCP_GATEWAY_PORT}"':'"${MCP_GATEWAY_PORT}"' --name awmg-mcpg --add-host host.docker.internal:host-gateway --user '"${MCP_GATEWAY_UID}"':'"${MCP_GATEWAY_GID}"' --group-add '"${DOCKER_SOCK_GID}"' -v '"${DOCKER_SOCK_PATH}"':/var/run/docker.sock -e MCP_GATEWAY_PORT -e MCP_GATEWAY_DOMAIN -e MCP_GATEWAY_AGENT_ID -e MCP_GATEWAY_PAYLOAD_DIR -e MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD -e DOCKER_HOST=unix:///var/run/docker.sock -e DEBUG -e MCP_GATEWAY_LOG_DIR -e GH_AW_MCP_LOG_DIR -e GH_AW_SAFE_OUTPUTS -e GH_AW_SAFE_OUTPUTS_CONFIG_PATH -e GH_AW_SAFE_OUTPUTS_TOOLS_PATH -e GH_AW_PR_HEAD_BASE_BRANCH -e GH_AW_PR_HEAD_BASE_SHA -e GH_AW_PR_HEAD_BASE_REPO -e GH_AW_PR_HEAD_BASE_PR_NUMBER -e GH_AW_PR_HEAD_BASE_REF -e GH_AW_PR_HEAD_REPO -e GH_AW_POLICY_ALLOW_CREATE_PULL_REQUEST -e GH_AW_ASSETS_BRANCH -e GH_AW_ASSETS_MAX_SIZE_KB -e GH_AW_ASSETS_ALLOWED_EXTS -e DEFAULT_BRANCH -e GITHUB_MCP_SERVER_TOKEN -e GITHUB_MCP_GUARD_MIN_INTEGRITY -e GITHUB_MCP_GUARD_REPOS -e GH_AW_SINK_VISIBILITY -e GITHUB_REPOSITORY -e GITHUB_SERVER_URL -e GITHUB_SHA -e GITHUB_WORKSPACE -e GITHUB_TOKEN -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_RUN_ATTEMPT -e GITHUB_JOB -e GITHUB_ACTION -e GITHUB_EVENT_NAME -e GITHUB_EVENT_PATH -e GITHUB_ACTOR -e GITHUB_ACTOR_ID -e GITHUB_TRIGGERING_ACTOR -e GITHUB_WORKFLOW -e GITHUB_WORKFLOW_REF -e GITHUB_WORKFLOW_SHA -e GITHUB_REF -e GITHUB_REF_NAME -e GITHUB_REF_TYPE -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e RUNNER_TEMP -e RUNNER_TOOL_CACHE -e MCP_GATEWAY_ALLOWED_MOUNT_ROOTS -e GITHUB_AW_OTEL_TRACE_ID -e GITHUB_AW_OTEL_PARENT_SPAN_ID -e OTEL_EXPORTER_OTLP_HEADERS -v /tmp/gh-aw/mcp-payloads:/tmp/gh-aw/mcp-payloads:rw -v /opt:/opt:ro -v /tmp:/tmp:rw -v '"${GITHUB_WORKSPACE}"':'"${GITHUB_WORKSPACE}"':rw -v '"${RUNNER_TEMP}"'/gh-aw/safeoutputs:'"${RUNNER_TEMP}"'/gh-aw/safeoutputs:rw ghcr.io/github/gh-aw-mcpg:v0.4.18' + + mkdir -p "$HOME/.copilot" + GH_AW_NODE=$(which node 2>/dev/null || command -v node 2>/dev/null || echo node) + cat << GH_AW_MCP_CONFIG_da213146dab3586b_EOF | "$GH_AW_NODE" "${RUNNER_TEMP}/gh-aw/actions/start_mcp_gateway.cjs" + { + "mcpServers": { + "safeoutputs": { + "type": "stdio", + "container": "ghcr.io/github/gh-aw-node", + "mounts": ["\${GITHUB_WORKSPACE}:\${GITHUB_WORKSPACE}:rw", "${RUNNER_TEMP}/gh-aw/safeoutputs:${RUNNER_TEMP}/gh-aw/safeoutputs:rw", "/tmp/gh-aw:/tmp/gh-aw:rw"], + "args": ["-w", "\${GITHUB_WORKSPACE}"], + "entrypoint": "sh", + "entrypointArgs": ["-c", "sh ${RUNNER_TEMP}/gh-aw/safeoutputs/start_safe_outputs_mcp.sh"], + "env": { + "DEBUG": "*", + "DEFAULT_BRANCH": "\${DEFAULT_BRANCH}", + "GH_AW_ASSETS_ALLOWED_EXTS": "\${GH_AW_ASSETS_ALLOWED_EXTS}", + "GH_AW_ASSETS_BRANCH": "\${GH_AW_ASSETS_BRANCH}", + "GH_AW_ASSETS_MAX_SIZE_KB": "\${GH_AW_ASSETS_MAX_SIZE_KB}", + "GH_AW_MCP_LOG_DIR": "\${GH_AW_MCP_LOG_DIR}", + "GH_AW_SAFE_OUTPUTS": "\${GH_AW_SAFE_OUTPUTS}", + "GH_AW_SAFE_OUTPUTS_CONFIG_PATH": "\${GH_AW_SAFE_OUTPUTS_CONFIG_PATH}", + "GH_AW_SAFE_OUTPUTS_TOOLS_PATH": "\${GH_AW_SAFE_OUTPUTS_TOOLS_PATH}", + "GH_AW_POLICY_ALLOW_CREATE_PULL_REQUEST": "\${GH_AW_POLICY_ALLOW_CREATE_PULL_REQUEST}", + "GH_AW_PR_HEAD_BASE_BRANCH": "\${GH_AW_PR_HEAD_BASE_BRANCH}", + "GH_AW_PR_HEAD_BASE_SHA": "\${GH_AW_PR_HEAD_BASE_SHA}", + "GH_AW_PR_HEAD_BASE_REPO": "\${GH_AW_PR_HEAD_BASE_REPO}", + "GH_AW_PR_HEAD_BASE_PR_NUMBER": "\${GH_AW_PR_HEAD_BASE_PR_NUMBER}", + "GH_AW_PR_HEAD_BASE_REF": "\${GH_AW_PR_HEAD_BASE_REF}", + "GH_AW_PR_HEAD_REPO": "\${GH_AW_PR_HEAD_REPO}", + "GITHUB_EVENT_NAME": "\${GITHUB_EVENT_NAME}", + "GITHUB_EVENT_PATH": "\${GITHUB_EVENT_PATH}", + "GITHUB_REPOSITORY": "\${GITHUB_REPOSITORY}", + "GITHUB_SHA": "\${GITHUB_SHA}", + "GITHUB_TOKEN": "\${GITHUB_TOKEN}", + "GITHUB_WORKSPACE": "\${GITHUB_WORKSPACE}", + "RUNNER_TEMP": "\${RUNNER_TEMP}" + }, + "guard-policies": { + "write-sink": { + "accept": [ + "*" + ], + "sink-visibility": "${GH_AW_SINK_VISIBILITY}" + } + } + } + }, + "gateway": { + "port": $MCP_GATEWAY_PORT, + "domain": "${MCP_GATEWAY_DOMAIN}", + "agentId": "${MCP_GATEWAY_AGENT_ID}", + "payloadDir": "${MCP_GATEWAY_PAYLOAD_DIR}", + "startupTimeout": 120, + "opentelemetry": { + "endpoint": "${OTEL_EXPORTER_OTLP_ENDPOINT}", + "traceId": "${GITHUB_AW_OTEL_TRACE_ID}", + "spanId": "${GITHUB_AW_OTEL_PARENT_SPAN_ID}" + } + } + } + GH_AW_MCP_CONFIG_da213146dab3586b_EOF + - name: Mount MCP servers as CLIs + id: mount-mcp-clis + continue-on-error: true + env: + MCP_GATEWAY_AGENT_ID: ${{ steps.start-mcp-gateway.outputs.gateway-agent-id }} + MCP_GATEWAY_DOMAIN: ${{ steps.start-mcp-gateway.outputs.gateway-domain }} + MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io); + const { main } = require(path.join(actionsDir, 'mount_mcp_as_cli.cjs')); + await main(); + - name: Clean credentials + continue-on-error: true + run: bash "${RUNNER_TEMP}/gh-aw/actions/clean_git_credentials.sh" + - name: Audit pre-agent workspace + id: pre_agent_audit + continue-on-error: true + run: bash "${RUNNER_TEMP}/gh-aw/actions/audit_pre_agent_workspace.sh" + - name: Start CLI Proxy + env: + GH_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + GITHUB_SERVER_URL: ${{ github.server_url }} + GITHUB_API_URL: ${{ github.api_url }} + GH_HOST: ${{ env.GH_HOST }} + GITHUB_HOST: ${{ env.GITHUB_HOST }} + GITHUB_ENTERPRISE_HOST: ${{ env.GITHUB_ENTERPRISE_HOST }} + GITHUB_GRAPHQL_URL: ${{ env.GITHUB_GRAPHQL_URL }} + GITHUB_COPILOT_BASE_URL: ${{ env.GITHUB_COPILOT_BASE_URL }} + GH_AW_NETWORK_ISOLATION: 'true' + CLI_PROXY_POLICY: '{"allow-only":{"repos":"${{ steps.determine-automatic-lockdown.outputs.repos }}","min-integrity":"${{ steps.determine-automatic-lockdown.outputs.min_integrity }}"}}' + CLI_PROXY_IMAGE: 'ghcr.io/github/gh-aw-mcpg:v0.4.18' + run: | + bash "${RUNNER_TEMP}/gh-aw/actions/start_cli_proxy.sh" + - name: Execute GitHub Copilot CLI + id: agentic_execution + # Copilot CLI tool arguments (sorted): + timeout-minutes: 180 + run: | + set -o pipefail + printf '%s' "$(date +%s%3N)" > /tmp/gh-aw/agent_cli_start_ms.txt + trap 'gh_aw_exit_code=$?; mkdir -p /tmp/gh-aw >/dev/null 2>&1 || true; printf "%s" "$gh_aw_exit_code" > /tmp/gh-aw/agent_execution_exit_code.txt || true; rm -f "$HOME/.copilot/settings.json"; if [ "$gh_aw_exit_code" -ne 0 ]; then echo "::error::Agent execution exited with code $gh_aw_exit_code"; fi' EXIT + mkdir -p "$HOME/.copilot" + printf '%s' '{"builtInAgents":{"rubberDuck":false}}' > "$HOME/.copilot/settings.json" + export XDG_CONFIG_HOME="$HOME" + export GH_AW_MCP_CONFIG="$HOME/.copilot/mcp-config.json" + GH_AW_COPILOT_SRC="$(command -v copilot 2>/dev/null || true)" + if [ -z "$GH_AW_COPILOT_SRC" ] || [ ! -x "$GH_AW_COPILOT_SRC" ]; then + echo "GitHub Copilot CLI executable not found on PATH after installation" >&2 + exit 127 + fi + GH_AW_COPILOT_BIN="${RUNNER_TEMP}/gh-aw/bin/copilot" + mkdir -p "${RUNNER_TEMP}/gh-aw/bin" + if [ "$GH_AW_COPILOT_SRC" != "$GH_AW_COPILOT_BIN" ]; then + cp "$GH_AW_COPILOT_SRC" "$GH_AW_COPILOT_BIN" + fi + chmod 755 "$GH_AW_COPILOT_BIN" + + touch /tmp/gh-aw/agent-step-summary.md + GH_AW_NODE_BIN=$(command -v node 2>/dev/null || true) + export GH_AW_NODE_BIN + export COPILOT_API_KEY="$COPILOT_DUMMY_BYOK" + (umask 177 && touch /tmp/gh-aw/agent-stdio.log) + GH_AW_MAX_AI_CREDITS="${GH_AW_MAX_AI_CREDITS:-1000}" + if [[ ! "$GH_AW_MAX_AI_CREDITS" =~ ^[0-9]+$ ]]; then + GH_AW_MAX_AI_CREDITS="1000" + fi + printf '%s\n' "{\"\$schema\":\"https://github.com/github/gh-aw-firewall/releases/download/v0.28.14/awf-config.schema.json\",\"network\":{\"allowDomains\":[\"*.githubusercontent.com\",\"*.pythonhosted.org\",\"anaconda.org\",\"api.snapcraft.io\",\"archive.ubuntu.com\",\"azure.archive.ubuntu.com\",\"bcr.bazel.build\",\"binstar.org\",\"blog.bazel.build\",\"bootstrap.pypa.io\",\"codeload.github.com\",\"conda.anaconda.org\",\"conda.binstar.org\",\"crates.io\",\"crl.geotrust.com\",\"crl.globalsign.com\",\"crl.identrust.com\",\"crl.sectigo.com\",\"crl.thawte.com\",\"crl.usertrust.com\",\"crl.verisign.com\",\"crl3.digicert.com\",\"crl4.digicert.com\",\"crls.ssl.com\",\"docs.github.com\",\"files.pythonhosted.org\",\"github-cloud.githubusercontent.com\",\"github-cloud.s3.amazonaws.com\",\"github.blog\",\"github.com\",\"github.githubassets.com\",\"index.crates.io\",\"json-schema.org\",\"json.schemastore.org\",\"keyserver.ubuntu.com\",\"lfs.github.com\",\"mirror.bazel.build\",\"objects.githubusercontent.com\",\"ocsp.digicert.com\",\"ocsp.geotrust.com\",\"ocsp.globalsign.com\",\"ocsp.identrust.com\",\"ocsp.sectigo.com\",\"ocsp.ssl.com\",\"ocsp.thawte.com\",\"ocsp.usertrust.com\",\"ocsp.verisign.com\",\"packagecloud.io\",\"packages.cloud.google.com\",\"packages.microsoft.com\",\"patch-diff.githubusercontent.com\",\"patchdiff.githubusercontent.com\",\"pip.pypa.io\",\"ppa.launchpad.net\",\"productionresultssa0.blob.core.windows.net\",\"productionresultssa1.blob.core.windows.net\",\"productionresultssa10.blob.core.windows.net\",\"productionresultssa11.blob.core.windows.net\",\"productionresultssa12.blob.core.windows.net\",\"productionresultssa13.blob.core.windows.net\",\"productionresultssa14.blob.core.windows.net\",\"productionresultssa15.blob.core.windows.net\",\"productionresultssa16.blob.core.windows.net\",\"productionresultssa17.blob.core.windows.net\",\"productionresultssa18.blob.core.windows.net\",\"productionresultssa19.blob.core.windows.net\",\"productionresultssa2.blob.core.windows.net\",\"productionresultssa3.blob.core.windows.net\",\"productionresultssa4.blob.core.windows.net\",\"productionresultssa5.blob.core.windows.net\",\"productionresultssa6.blob.core.windows.net\",\"productionresultssa7.blob.core.windows.net\",\"productionresultssa8.blob.core.windows.net\",\"productionresultssa9.blob.core.windows.net\",\"pypi.org\",\"pypi.python.org\",\"raw.githubusercontent.com\",\"releases.bazel.build\",\"repo.anaconda.com\",\"repo.continuum.io\",\"s.symcb.com\",\"s.symcd.com\",\"security.ubuntu.com\",\"sh.rustup.rs\",\"static.crates.io\",\"static.rust-lang.org\",\"ts-crl.ws.symantec.com\",\"ts-ocsp.ws.symantec.com\",\"www.googleapis.com\"],\"isolation\":true,\"topologyAttach\":[\"awmg-mcpg\",\"awmg-cli-proxy\"]},\"apiProxy\":{\"enabled\":true,\"enableTokenSteering\":true,\"maxRuns\":500,\"maxAiCredits\":${GH_AW_MAX_AI_CREDITS},\"maxCacheMisses\":5,\"models\":{\"agent\":[\"sonnet-6x\",\"gpt-5.4\",\"gpt-5.5\",\"gpt-5.6\",\"gpt-5.3\",\"gemini-pro\",\"any\"],\"antigravity\":[\"copilot/antigravity*\",\"google/antigravity*\",\"gemini/antigravity*\"],\"any\":[\"copilot/*\",\"anthropic/*\",\"openai/*\",\"google/*\",\"gemini/*\"],\"auto\":[\"copilot/auto\",\"large\"],\"claude\":[\"agent\"],\"codex\":[\"agent\"],\"coding\":[\"copilot/gpt-5*codex*\",\"openai/gpt-5*codex*\",\"gpt-5-codex\",\"kimi\"],\"computer-use\":[\"copilot/*computer-use*\",\"google/*computer-use*\",\"gemini/*computer-use*\",\"openai/*computer-use*\"],\"copilot\":[\"agent\"],\"deep-research\":[\"copilot/deep-research*\",\"copilot/o3-deep-research*\",\"copilot/o4-mini-deep-research*\",\"google/deep-research*\",\"gemini/deep-research*\",\"openai/o3-deep-research*\",\"openai/o4-mini-deep-research*\"],\"detection\":[\"small\"],\"evals\":[\"small\"],\"fable\":[\"copilot/*fable*\",\"anthropic/*fable*\"],\"gemini\":[\"agent\"],\"gemini-3-flash\":[\"copilot/gemini-3*flash*\",\"google/gemini-3*flash*\",\"gemini/gemini-3*flash*\"],\"gemini-3-pro\":[\"copilot/gemini-3*pro*\",\"google/gemini-3*pro*\",\"google/nano-banana*\",\"gemini/gemini-3*pro*\"],\"gemini-3.1-flash\":[\"copilot/gemini-3.1*flash*\",\"google/gemini-3.1*flash*\",\"gemini/gemini-3.1*flash*\"],\"gemini-3.1-pro\":[\"copilot/gemini-3.1*pro*\",\"google/gemini-3.1*pro*\",\"gemini/gemini-3.1*pro*\"],\"gemini-3.5-flash\":[\"copilot/gemini-3.5*flash*\",\"google/gemini-3.5*flash*\",\"gemini/gemini-3.5*flash*\"],\"gemini-3.6-flash\":[\"copilot/gemini-3.6*flash*\",\"google/gemini-3.6*flash*\",\"gemini/gemini-3.6*flash*\"],\"gemini-3.7-flash\":[\"copilot/gemini-3.7*flash*\",\"google/gemini-3.7*flash*\",\"gemini/gemini-3.7*flash*\"],\"gemini-flash\":[\"copilot/gemini-*flash*\",\"google/gemini-*flash*\",\"gemini/gemini-*flash*\"],\"gemini-flash-lite\":[\"copilot/gemini-*flash*lite*\",\"google/gemini-*flash*lite*\",\"gemini/gemini-*flash*lite*\"],\"gemini-omni\":[\"copilot/gemini-omni*\",\"google/gemini-omni*\",\"gemini/gemini-omni*\"],\"gemini-pro\":[\"copilot/gemini-*pro*\",\"google/gemini-*pro*\",\"gemini/gemini-*pro*\"],\"gemma\":[\"copilot/gemma*\",\"google/gemma*\",\"gemini/gemma*\"],\"gpt-5\":[\"copilot/gpt-5*\",\"openai/gpt-5*\"],\"gpt-5-codex\":[\"copilot/gpt-5*codex*\",\"openai/gpt-5*codex*\"],\"gpt-5-mini\":[\"copilot/gpt-5*mini*\",\"openai/gpt-5*mini*\"],\"gpt-5-nano\":[\"copilot/gpt-5*nano*\",\"openai/gpt-5*nano*\"],\"gpt-5-pro\":[\"copilot/gpt-5*pro*\",\"openai/gpt-5*pro*\"],\"gpt-5.1\":[\"copilot/gpt-5.1*\",\"openai/gpt-5.1*\"],\"gpt-5.2\":[\"copilot/gpt-5.2*\",\"openai/gpt-5.2*\"],\"gpt-5.3\":[\"copilot/gpt-5.3*\",\"openai/gpt-5.3*\"],\"gpt-5.4\":[\"copilot/gpt-5.4*\",\"openai/gpt-5.4*\"],\"gpt-5.5\":[\"copilot/gpt-5.5*\",\"openai/gpt-5.5*\"],\"gpt-5.6\":[\"copilot/gpt-5.6*\",\"openai/gpt-5.6*\"],\"grok\":[\"copilot/*grok*\",\"openai/*grok*\"],\"haiku\":[\"copilot/*haiku*\",\"anthropic/*haiku*\"],\"image-generation\":[\"copilot/gpt-image*\",\"openai/gpt-image*\",\"openai/chatgpt-image*\",\"copilot/gemini-*image*\",\"google/gemini-*image*\",\"gemini/gemini-*image*\",\"google/imagen*\"],\"kimi\":[\"copilot/kimi*\",\"openai/kimi*\"],\"kiwi\":[\"copilot/kiwi*\",\"openai/kiwi*\"],\"large\":[\"sonnet\",\"gpt-5-pro\",\"gpt-5\",\"gemini-pro\"],\"lyria\":[\"google/lyria*\",\"gemini/lyria*\",\"copilot/lyria*\"],\"mai-code\":[\"copilot/MAI-Code*\",\"copilot/mai-code*\",\"openai/MAI-Code*\"],\"mai-code-1-flash-picker\":[\"copilot/MAI-Code-1-Flash-picker*\",\"copilot/mai-code-1-flash-picker*\",\"openai/MAI-Code-1-Flash-picker*\"],\"mini\":[\"haiku\",\"gpt-5-mini\",\"gpt-5-nano\",\"gemini-flash-lite\"],\"nano-banana\":[\"copilot/nano-banana*\",\"google/nano-banana*\",\"gemini/nano-banana*\"],\"opus\":[\"copilot/*opus*\",\"anthropic/*opus*\"],\"opusplan\":[\"opus?effort=high\"],\"raptor-mini\":[\"copilot/raptor*\",\"openai/raptor*\"],\"reasoning\":[\"copilot/o1*\",\"copilot/o3*\",\"copilot/o4*\",\"openai/o1*\",\"openai/o3*\",\"openai/o4*\"],\"robotics\":[\"copilot/*robotics*\",\"google/*robotics*\",\"gemini/*robotics*\"],\"small\":[\"mini\"],\"small-agent\":[\"haiku\",\"gpt-5-mini\",\"gemini-flash\"],\"sonnet\":[\"copilot/*sonnet*\",\"anthropic/*sonnet*\"],\"sonnet-6x\":[\"copilot/*sonnet-4.5*\",\"copilot/*sonnet-4.6*\",\"copilot/*sonnet-5*\",\"copilot/*sonnet-4-5-*\",\"anthropic/*sonnet-4-5-*\",\"copilot/*sonnet-4-6*\",\"anthropic/*sonnet-4-6*\",\"anthropic/*sonnet-5*\"],\"summarization\":[\"haiku\",\"gpt-5-mini\",\"gemini-flash-lite\",\"mini\"],\"veo\":[\"google/veo*\",\"gemini/veo*\"],\"vision\":[\"copilot/gemini-*image*\",\"google/gemini-*image*\",\"gemini/gemini-*image*\",\"copilot/gemini-*flash*\",\"google/gemini-*flash*\",\"gemini/gemini-*flash*\"]}},\"container\":{\"imageTag\":\"0.28.14,squid=sha256:2ce8df3abf3e9b76e9c0cf5863da41f1ab3f89b20ad14b988806ab89e7bf2cd5,agent=sha256:f7df036c86575527b61f3f7df91c4412349a12b2a74988d929eafa2999230c98,api-proxy=sha256:6f95e2234dd9bd6333a8ff28ccea7ecf0204acd4a09108723844dbd2bf6268c5,cli-proxy=sha256:3a379c5e96e29499c815e9dd2a71334d01c326a9b73991c76544fda9cae35c34\"},\"logging\":{\"proxyLogsDir\":\"/tmp/gh-aw/sandbox/firewall/logs\",\"auditDir\":\"/tmp/gh-aw/sandbox/firewall/audit\"}}" > "${RUNNER_TEMP}/gh-aw/awf-config.json" + cp "${RUNNER_TEMP}/gh-aw/awf-config.json" /tmp/gh-aw/awf-config.json + export GH_AW_MODELS_JSON_PATH="/tmp/gh-aw/models.json" + GH_AW_DOCKER_HOST="" + if [[ "${DOCKER_HOST:-}" =~ ^tcp:// ]]; then + GH_AW_DOCKER_HOST="${DOCKER_HOST}" + fi + if [[ "${DOCKER_HOST:-}" =~ ^tcp:// ]]; then + GH_AW_CHROOT_BINARIES_SOURCE_PATH="${RUNNER_TEMP}/gh-aw" GH_AW_CHROOT_IDENTITY_HOME="${RUNNER_TEMP}/gh-aw/home" node "${RUNNER_TEMP}/gh-aw/actions/patch_awf_chroot_config.cjs" + fi + GH_AW_TOOL_CACHE_MOUNT="" + GH_AW_TOOL_CACHE="${RUNNER_TOOL_CACHE:?RUNNER_TOOL_CACHE must be set}" + if [ -d "$GH_AW_TOOL_CACHE" ]; then + if [[ "$GH_AW_TOOL_CACHE" != /opt/* ]]; then + GH_AW_TOOL_CACHE_MOUNT="$GH_AW_TOOL_CACHE:$GH_AW_TOOL_CACHE:ro" + fi + fi + # shellcheck disable=SC1003,SC2016,SC2086 + GH_AW_AWF_ENGINE_NAME=copilot \ + GH_AW_AWF_HARNESS_MARKER='[copilot-harness]' \ + GH_AW_AWF_LOG_FILE=/tmp/gh-aw/agent-stdio.log \ + GH_AW_AWF_ATTEMPT_LOG_NAME=copilot \ + bash "${RUNNER_TEMP}/gh-aw/actions/run_awf_with_startup_retries.sh" -- \ + awf --config "${RUNNER_TEMP}/gh-aw/awf-config.json" --container-workdir "${GITHUB_WORKSPACE}" --mount "${RUNNER_TEMP}/gh-aw:${RUNNER_TEMP}/gh-aw:ro" --mount "${RUNNER_TEMP}/gh-aw:/host${RUNNER_TEMP}/gh-aw:ro" ${GH_AW_TOOL_CACHE_MOUNT:+--mount "$GH_AW_TOOL_CACHE_MOUNT"} ${GH_AW_DOCKER_HOST:+--docker-host "$GH_AW_DOCKER_HOST"} --env-all --exclude-env ACTIONS_ID_TOKEN_REQUEST_TOKEN --exclude-env ACTIONS_ID_TOKEN_REQUEST_URL --exclude-env COPILOT_GITHUB_TOKEN --exclude-env GH_TOKEN --exclude-env GITHUB_MCP_SERVER_TOKEN --exclude-env MCP_GATEWAY_AGENT_ID --mount /tmp/gh-aw:/tmp/gh-aw:rw --log-level info --skip-pull --difc-proxy-host awmg-cli-proxy:18443 --difc-proxy-ca-cert /tmp/gh-aw/difc-proxy-tls/ca.crt \ + -- /bin/bash -c 'set +o histexpand; export PATH="${RUNNER_TEMP}/gh-aw/mcp-cli/bin:$PATH" && : "${RUNNER_TOOL_CACHE:?RUNNER_TOOL_CACHE must be set}"; GH_AW_TOOL_CACHE="$RUNNER_TOOL_CACHE"; GH_AW_TOOL_BINS="$(find "$GH_AW_TOOL_CACHE" -maxdepth 5 -type d -name bin 2>/dev/null | tr '\''\n'\'' '\'':'\'')"; GH_AW_TOOL_BINS="${GH_AW_TOOL_BINS%:}"; export PATH="$PATH${GH_AW_TOOL_BINS:+:}$GH_AW_TOOL_BINS"; [ -n "$GOROOT" ] && export PATH="$GOROOT/bin:$PATH" || true; [ -n "$ERLANG_HOME" ] && export PATH="$ERLANG_HOME/bin:$PATH" || true && GH_AW_NODE_EXEC="${GH_AW_NODE_BIN:-}"; if [ -z "$GH_AW_NODE_EXEC" ] || [ ! -x "$GH_AW_NODE_EXEC" ]; then GH_AW_NODE_EXEC="$(command -v node 2>/dev/null || true)"; fi; if [ -z "$GH_AW_NODE_EXEC" ]; then echo "node runtime missing on this runner — check runtimes.node in workflow YAML" >&2; exit 127; fi; GH_AW_NPM_GLOBAL_ROOT="$(npm root -g 2>/dev/null || true)"; if [ -n "$GH_AW_NPM_GLOBAL_ROOT" ]; then export NODE_PATH="${GH_AW_NPM_GLOBAL_ROOT}${NODE_PATH:+:${NODE_PATH}}"; fi; "$GH_AW_NODE_EXEC" "${RUNNER_TEMP}/gh-aw/actions/copilot_harness.cjs" "${RUNNER_TEMP}/gh-aw/bin/copilot" --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --no-ask-user --allow-all-tools --allow-all-paths --add-dir "${GITHUB_WORKSPACE}" --prompt-file /tmp/gh-aw/aw-prompts/prompt.txt' + env: + AWF_REFLECT_ENABLED: 1 + COPILOT_AGENT_RUNNER_TYPE: STANDALONE + COPILOT_DUMMY_BYOK: dummy-byok-key-for-offline-mode + COPILOT_GITHUB_TOKEN: ${{ github.token }} + COPILOT_MODEL: ${{ vars.GH_AW_MODEL_AGENT_COPILOT || vars.GH_AW_DEFAULT_MODEL_COPILOT || 'auto' }} + GH_AW_LLM_PROVIDER: github + GH_AW_MAX_AI_CREDITS: ${{ vars.GH_AW_DEFAULT_MAX_AI_CREDITS || '1000' }} + GH_AW_MAX_TURNS: ${{ vars.GH_AW_DEFAULT_MAX_TURNS || '' }} + GH_AW_PHASE: agent + GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} + GH_AW_TIMEOUT_MINUTES: 180 + GH_AW_VERSION: v0.88.7 + GH_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN || github.token }} + GITHUB_API_URL: ${{ github.api_url }} + GITHUB_AW: true + GITHUB_COPILOT_INTEGRATION_ID: agentic-workflows + GITHUB_HEAD_REF: ${{ github.head_ref }} + GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + GITHUB_REF_NAME: ${{ github.ref_name }} + GITHUB_SERVER_URL: ${{ github.server_url }} + GITHUB_STEP_SUMMARY: /tmp/gh-aw/agent-step-summary.md + GITHUB_WORKSPACE: ${{ github.workspace }} + GIT_AUTHOR_EMAIL: github-actions[bot]@users.noreply.github.com + GIT_AUTHOR_NAME: github-actions[bot] + GIT_COMMITTER_EMAIL: github-actions[bot]@users.noreply.github.com + GIT_COMMITTER_NAME: github-actions[bot] + RUNNER_TEMP: ${{ runner.temp }} + S2STOKENS: true + TRACEPARENT: ${{ env.GITHUB_AW_OTEL_TRACE_ID != '' && env.GITHUB_AW_OTEL_PARENT_SPAN_ID != '' && format('00-{0}-{1}-01', env.GITHUB_AW_OTEL_TRACE_ID, env.GITHUB_AW_OTEL_PARENT_SPAN_ID) || '' }} + - name: Stop CLI Proxy + if: always() + continue-on-error: true + run: bash "${RUNNER_TEMP}/gh-aw/actions/stop_cli_proxy.sh" + - name: Detect agent errors + if: always() + id: detect-agent-errors + continue-on-error: true + env: + GH_AW_AGENTIC_EXECUTION_OUTCOME: ${{ steps.agentic_execution.outcome }} + GH_AW_ENGINE_STEP_TIMEOUT_MINUTES: 180 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'detect_agent_errors.cjs')); + await main(); + - name: Configure Git credentials + env: + GITHUB_REPOSITORY: ${{ github.repository }} + GITHUB_SERVER_URL: ${{ github.server_url }} + GITHUB_TOKEN: ${{ github.token }} + run: bash "${RUNNER_TEMP}/gh-aw/actions/configure_git_credentials.sh" + - name: Copy Copilot session state files to logs + if: always() + continue-on-error: true + run: bash "${RUNNER_TEMP}/gh-aw/actions/copy_copilot_session_state.sh" + - name: Stop MCP Gateway + if: always() + continue-on-error: true + env: + MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_AGENT_ID: ${{ steps.start-mcp-gateway.outputs.gateway-agent-id }} + GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} + run: | + bash "${RUNNER_TEMP}/gh-aw/actions/stop_mcp_gateway.sh" "$GATEWAY_PID" + - name: Redact secrets in logs + if: always() + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'redact_secrets.cjs')); + await main(); + env: + GH_AW_SECRET_NAMES: 'GH_AW_GITHUB_MCP_SERVER_TOKEN,GH_AW_GITHUB_TOKEN,GITHUB_TOKEN' + SECRET_GH_AW_GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN }} + SECRET_GH_AW_GITHUB_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN }} + SECRET_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Append agent step summary + if: always() + run: bash "${RUNNER_TEMP}/gh-aw/actions/append_agent_step_summary.sh" + - name: Copy Safe Outputs + if: always() + env: + GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} + run: | + mkdir -p /tmp/gh-aw + cp "$GH_AW_SAFE_OUTPUTS" /tmp/gh-aw/safeoutputs.jsonl 2>/dev/null || true + - name: Ingest agent output + id: collect_output + if: always() + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} + GH_AW_ALLOWED_DOMAINS: "*.githubusercontent.com,*.pythonhosted.org,anaconda.org,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,bcr.bazel.build,binstar.org,blog.bazel.build,bootstrap.pypa.io,codeload.github.com,conda.anaconda.org,conda.binstar.org,crates.io,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,docs.github.com,files.pythonhosted.org,github-cloud.githubusercontent.com,github-cloud.s3.amazonaws.com,github.blog,github.com,github.githubassets.com,index.crates.io,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,lfs.github.com,mirror.bazel.build,objects.githubusercontent.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,patch-diff.githubusercontent.com,patchdiff.githubusercontent.com,pip.pypa.io,ppa.launchpad.net,productionresultssa0.blob.core.windows.net,productionresultssa1.blob.core.windows.net,productionresultssa10.blob.core.windows.net,productionresultssa11.blob.core.windows.net,productionresultssa12.blob.core.windows.net,productionresultssa13.blob.core.windows.net,productionresultssa14.blob.core.windows.net,productionresultssa15.blob.core.windows.net,productionresultssa16.blob.core.windows.net,productionresultssa17.blob.core.windows.net,productionresultssa18.blob.core.windows.net,productionresultssa19.blob.core.windows.net,productionresultssa2.blob.core.windows.net,productionresultssa3.blob.core.windows.net,productionresultssa4.blob.core.windows.net,productionresultssa5.blob.core.windows.net,productionresultssa6.blob.core.windows.net,productionresultssa7.blob.core.windows.net,productionresultssa8.blob.core.windows.net,productionresultssa9.blob.core.windows.net,pypi.org,pypi.python.org,raw.githubusercontent.com,releases.bazel.build,repo.anaconda.com,repo.continuum.io,s.symcb.com,s.symcd.com,security.ubuntu.com,sh.rustup.rs,static.crates.io,static.rust-lang.org,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com,www.googleapis.com" + GITHUB_SERVER_URL: ${{ github.server_url }} + GITHUB_API_URL: ${{ github.api_url }} + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'collect_ndjson_output.cjs')); + await main(); + - name: Parse agent logs for step summary + if: always() + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_AGENT_OUTPUT: /tmp/gh-aw/sandbox/agent/logs/ + GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'parse_copilot_log.cjs')); + await main(); + - name: Parse MCP Gateway logs for step summary + if: always() + id: parse-mcp-gateway + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'parse_mcp_gateway_log.cjs')); + await main(); + - name: Print firewall logs + if: always() + continue-on-error: true + env: + AWF_LOGS_DIR: /tmp/gh-aw/sandbox/firewall/logs + run: bash "${RUNNER_TEMP}/gh-aw/actions/print_firewall_logs.sh" --rootless + - name: Parse token usage for step summary + if: always() + continue-on-error: true + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'parse_token_usage.cjs')); + await main(); + - name: Print AWF reflect summary + if: always() + continue-on-error: true + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'awf_reflect_summary.cjs')); + await main(); + - name: Generate observability summary + if: always() + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'generate_observability_summary.cjs')); + await main(core); + - name: Write agent output placeholder if missing + if: always() + run: | + if [ ! -f /tmp/gh-aw/agent_output.json ]; then + echo '{"items":[]}' > /tmp/gh-aw/agent_output.json + fi + # Small dedicated copy of the agent output so safe-output processing + # survives a failed or timed-out upload of the larger agent artifact + - name: Upload agent output fallback artifact + if: always() + continue-on-error: true + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: agent-output-fallback + path: | + /tmp/gh-aw/agent_output.json + /tmp/gh-aw/safeoutputs.jsonl + if-no-files-found: ignore + - name: Upload agent artifacts + if: always() + continue-on-error: true + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: agent + path: | + /tmp/gh-aw/aw-prompts/prompt.txt + /tmp/gh-aw/sandbox/agent/logs/ + /tmp/gh-aw/redacted-urls.log + /tmp/gh-aw/mcp-logs/ + /tmp/gh-aw/agent_usage.json + /tmp/gh-aw/agent-stdio.log + /tmp/gh-aw/pre-agent-audit.txt + /tmp/gh-aw/github_rate_limits.jsonl + /tmp/gh-aw/otel.jsonl + /tmp/gh-aw/otlp-export-errors.jsonl + /tmp/gh-aw/safeoutputs.jsonl + /tmp/gh-aw/agent_output.json + /tmp/gh-aw/aw-*.patch + /tmp/gh-aw/aw-*.bundle + /tmp/gh-aw/awf-config.json + /tmp/gh-aw/sandbox/firewall/logs/ + /tmp/gh-aw/sandbox/firewall/audit/ + /tmp/gh-aw/sandbox/firewall/awf-reflect.json + if-no-files-found: ignore + + conclusion: + needs: + - activation + - agent + - detection + - safe_outputs + if: > + always() && (needs.agent.result != 'skipped' || needs.activation.outputs.lockdown_check_failed == 'true' || + needs.activation.outputs.oauth_token_check_failed == 'true' || needs.activation.outputs.stale_lock_file_failed == 'true' || + needs.activation.outputs.daily_ai_credits_exceeded == 'true') + runs-on: ubuntu-slim + permissions: + actions: read + contents: write + issues: write + pull-requests: write + concurrency: + group: "gh-aw-conclusion-update-rust-analyzer" + cancel-in-progress: false + queue: max + env: + GH_AW_RUNTIME_FEATURES: ${{ vars.GH_AW_RUNTIME_FEATURES }} + outputs: + incomplete_count: ${{ steps.report_incomplete.outputs.incomplete_count }} + noop_message: ${{ steps.noop.outputs.noop_message }} + tools_reported: ${{ steps.missing_tool.outputs.tools_reported }} + total_count: ${{ steps.missing_tool.outputs.total_count }} + steps: + - name: Setup Scripts + id: setup + uses: github/gh-aw-actions/setup@5e508589e03a7757a7e05b26e834292f5445bfb6 # v0.88.7 + with: + destination: ${{ runner.temp }}/gh-aw/actions + job-name: ${{ github.job }} + trace-id: ${{ needs.activation.outputs.setup-trace-id }} + parent-span-id: ${{ needs.activation.outputs.setup-parent-span-id || needs.activation.outputs.setup-span-id }} + env: + GH_AW_SETUP_WORKFLOW_NAME: "Update rust-analyzer" + GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/update-rust-analyzer.lock.yml@${{ github.ref }} + GH_AW_INFO_VERSION: "1.0.80" + GH_AW_INFO_AWF_VERSION: "v0.28.14" + GH_AW_INFO_ENGINE_ID: "copilot" + - name: Download agent output artifact + id: download-agent-output + continue-on-error: true + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + pattern: "{agent,agent-output-fallback}" + merge-multiple: true + path: /tmp/gh-aw/ + - name: Setup agent output environment variable + id: setup-agent-output-env + if: steps.download-agent-output.outcome == 'success' + run: | + mkdir -p /tmp/gh-aw/ + find "/tmp/gh-aw/" -type f -print + if [ -f "/tmp/gh-aw/agent_output.json" ]; then + echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/agent_output.json" >> "$GITHUB_OUTPUT" + fi + - name: Download detection artifact + id: download-detection-artifact + continue-on-error: true + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: detection + path: /tmp/gh-aw/threat-detection/ + - name: Download Safe Outputs Items Manifest + id: download-safe-outputs-manifest + if: always() + continue-on-error: true + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + pattern: safe-outputs-items + merge-multiple: true + path: /tmp/gh-aw/ + - name: Collect usage artifact files + if: always() + continue-on-error: true + run: bash "${RUNNER_TEMP}/gh-aw/actions/collect_usage_artifact_files.sh" + - name: Upload usage artifact + if: always() + continue-on-error: true + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: usage + path: | + /tmp/gh-aw/usage/aw_info.json + /tmp/gh-aw/usage/aw-info.jsonl + /tmp/gh-aw/usage/agent_usage.json + /tmp/gh-aw/usage/agent_usage.jsonl + /tmp/gh-aw/usage/detection_usage.jsonl + /tmp/gh-aw/usage/evals.jsonl + /tmp/gh-aw/usage/graders/grader_manifest.json + /tmp/gh-aw/usage/graders/grader_results.json + /tmp/gh-aw/usage/github_rate_limits.jsonl + /tmp/gh-aw/usage/agent/token_usage.jsonl + /tmp/gh-aw/usage/detection/token_usage.jsonl + /tmp/gh-aw/usage/activity/summary.json + if-no-files-found: ignore + - name: Restore daily AIC usage cache + id: restore-daily-aic-cache-conclusion + if: always() + continue-on-error: true + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + key: agentic-workflow-usage-updaterustanalyzer-${{ github.run_id }} + restore-keys: agentic-workflow-usage-updaterustanalyzer- + path: /tmp/gh-aw/agentic-workflow-usage-cache.jsonl + - name: Write daily AIC usage cache entry + id: write-daily-aic-cache + if: always() + continue-on-error: true + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + github-token: ${{ github.token }} + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context); + const { main } = require(path.join(actionsDir, 'write_daily_aic_usage_cache.cjs')); + await main(); + - name: Save daily AIC usage cache + id: save-daily-aic-cache + if: always() + continue-on-error: true + uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + key: agentic-workflow-usage-updaterustanalyzer-${{ github.run_id }} + path: /tmp/gh-aw/agentic-workflow-usage-cache.jsonl + - name: Upload daily AIC usage cache artifact + id: upload-daily-aic-cache + if: always() + continue-on-error: true + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: aic-usage-cache + path: /tmp/gh-aw/agentic-workflow-usage-cache.jsonl + if-no-files-found: ignore + retention-days: 7 + - name: Process no-op messages + id: noop + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} + GH_AW_NOOP_MAX: "1" + GH_AW_WORKFLOW_NAME: "Update rust-analyzer" + GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/${{ github.repository }}/blob/${{ github.ref_name }}/.github/workflows/update-rust-analyzer.md" + GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + GH_AW_AGENT_CONCLUSION: ${{ needs.agent.result }} + GH_AW_NOOP_REPORT_AS_ISSUE: "false" + GH_AW_AIC: ${{ needs.agent.outputs.aic }} + GH_AW_THREAT_DETECTION_AIC: ${{ needs.detection.outputs.aic }} + GH_AW_AMBIENT_CONTEXT: ${{ needs.agent.outputs.ambient_context }} + GH_AW_WORKFLOW_ID: "update-rust-analyzer" + with: + github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'handle_noop_message.cjs')); + await main(); + - name: Log detection run + id: detection_runs + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} + GH_AW_WORKFLOW_NAME: "Update rust-analyzer" + GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/${{ github.repository }}/blob/${{ github.ref_name }}/.github/workflows/update-rust-analyzer.md" + GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + GH_AW_DETECTION_CONCLUSION: ${{ needs.detection.outputs.detection_conclusion }} + GH_AW_DETECTION_REASON: ${{ needs.detection.outputs.detection_reason }} + with: + github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'handle_detection_runs.cjs')); + await main(); + - name: Record missing tool + id: missing_tool + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} + GH_AW_MISSING_TOOL_CREATE_ISSUE: "true" + GH_AW_WORKFLOW_NAME: "Update rust-analyzer" + GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/${{ github.repository }}/blob/${{ github.ref_name }}/.github/workflows/update-rust-analyzer.md" + with: + github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'missing_tool.cjs')); + await main(); + - name: Record incomplete + id: report_incomplete + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} + GH_AW_REPORT_INCOMPLETE_CREATE_ISSUE: "true" + GH_AW_WORKFLOW_NAME: "Update rust-analyzer" + GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/${{ github.repository }}/blob/${{ github.ref_name }}/.github/workflows/update-rust-analyzer.md" + with: + github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'report_incomplete_handler.cjs')); + await main(); + - name: Handle agent failure + id: handle_agent_failure + if: always() + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} + GH_AW_WORKFLOW_NAME: "Update rust-analyzer" + GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/${{ github.repository }}/blob/${{ github.ref_name }}/.github/workflows/update-rust-analyzer.md" + GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + GH_AW_AGENT_CONCLUSION: ${{ needs.agent.result }} + GH_AW_WORKFLOW_ID: "update-rust-analyzer" + GH_AW_ACTION_FAILURE_ISSUE_EXPIRES_HOURS: "0" + GH_AW_ENGINE_ID: "copilot" + GH_AW_CHECKOUT_PR_SUCCESS: ${{ needs.agent.outputs.checkout_pr_success }} + GH_AW_EFFECTIVE_TOKENS: ${{ needs.agent.outputs.effective_tokens || '' }} + GH_AW_AI_CREDITS_RATE_LIMIT_ERROR: ${{ needs.agent.outputs.ai_credits_rate_limit_error || 'false' }} + GH_AW_UNKNOWN_MODEL_AI_CREDITS: ${{ needs.agent.outputs.unknown_model_ai_credits || 'false' }} + GH_AW_AIC: ${{ needs.agent.outputs.aic }} + GH_AW_THREAT_DETECTION_AIC: ${{ needs.detection.outputs.aic }} + GH_AW_MAX_AI_CREDITS: ${{ vars.GH_AW_DEFAULT_MAX_AI_CREDITS || '1000' }} + GH_AW_INFERENCE_ACCESS_ERROR: ${{ needs.agent.outputs.inference_access_error }} + GH_AW_MCP_POLICY_ERROR: ${{ needs.agent.outputs.mcp_policy_error }} + GH_AW_AGENTIC_ENGINE_TIMEOUT: ${{ needs.agent.outputs.agentic_engine_timeout }} + GH_AW_MODEL_NOT_SUPPORTED_ERROR: ${{ needs.agent.outputs.model_not_supported_error }} + GH_AW_HTTP_400_RESPONSE_ERROR: ${{ needs.agent.outputs.http_400_response_error }} + GH_AW_MAX_CACHE_MISSES_EXCEEDED: ${{ needs.agent.outputs.max_cache_misses_exceeded }} + GH_AW_MISSING_MODEL_PRICING_ERROR: ${{ needs.agent.outputs.missing_model_pricing_error }} + GH_AW_MISSING_MODEL_PRICING_MODEL_NAME: ${{ needs.agent.outputs.missing_model_pricing_model_name }} + GH_AW_SHELL_EXPANSION_GUARD_REJECTED: ${{ needs.agent.outputs.shell_expansion_guard_rejected }} + GH_AW_ENGINE_API_HOSTS: "api.enterprise.githubcopilot.com,api.githubcopilot.com,api.business.githubcopilot.com,api.individual.githubcopilot.com" + GH_AW_CODE_PUSH_FAILURE_ERRORS: ${{ needs.safe_outputs.outputs.code_push_failure_errors }} + GH_AW_CODE_PUSH_FAILURE_COUNT: ${{ needs.safe_outputs.outputs.code_push_failure_count }} + GH_AW_LOCKDOWN_CHECK_FAILED: ${{ needs.activation.outputs.lockdown_check_failed }} + GH_AW_OAUTH_TOKEN_CHECK_FAILED: ${{ needs.activation.outputs.oauth_token_check_failed }} + GH_AW_STALE_LOCK_FILE_FAILED: ${{ needs.activation.outputs.stale_lock_file_failed }} + GH_AW_DAILY_AI_CREDITS_EXCEEDED: ${{ needs.activation.outputs.daily_ai_credits_exceeded }} + GH_AW_DAILY_AI_CREDITS_TOTAL_EFFECTIVE_TOKENS: ${{ needs.activation.outputs.daily_ai_credits_total_effective_tokens }} + GH_AW_DAILY_AI_CREDITS_THRESHOLD: ${{ needs.activation.outputs.daily_ai_credits_threshold }} + GH_AW_GROUP_REPORTS: "false" + GH_AW_FAILURE_REPORT_AS_ISSUE: "true" + GH_AW_MISSING_TOOL_REPORT_AS_FAILURE: "true" + GH_AW_MISSING_DATA_REPORT_AS_FAILURE: "true" + GH_AW_TIMEOUT_MINUTES: "180" + with: + github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'handle_agent_failure.cjs')); + await main(); + - name: Report failed jobs + id: report_failed_jobs + if: always() + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} + GH_AW_WORKFLOW_NAME: "Update rust-analyzer" + GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/${{ github.repository }}/blob/${{ github.ref_name }}/.github/workflows/update-rust-analyzer.md" + GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + GH_AW_REPORT_FAILED_JOBS: "true" + with: + github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'report_failed_jobs.cjs')); + await main(); + + detection: + needs: + - activation + - agent + if: always() && needs.agent.result != 'skipped' + runs-on: ubuntu-latest + permissions: + contents: read + copilot-requests: write + timeout-minutes: 10 + env: + GH_AW_RUNTIME_FEATURES: ${{ vars.GH_AW_RUNTIME_FEATURES }} + outputs: + aic: ${{ steps.parse_detection_token_usage.outputs.aic }} + detection_conclusion: ${{ steps.detection_conclusion.outputs.conclusion }} + detection_reason: ${{ steps.detection_conclusion.outputs.reason }} + detection_success: ${{ steps.detection_conclusion.outputs.success }} + steps: + - name: Setup Scripts + id: setup + uses: github/gh-aw-actions/setup@5e508589e03a7757a7e05b26e834292f5445bfb6 # v0.88.7 + with: + destination: ${{ runner.temp }}/gh-aw/actions + job-name: ${{ github.job }} + trace-id: ${{ needs.activation.outputs.setup-trace-id }} + parent-span-id: ${{ needs.activation.outputs.setup-parent-span-id || needs.activation.outputs.setup-span-id }} + env: + GH_AW_SETUP_WORKFLOW_NAME: "Update rust-analyzer" + GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/update-rust-analyzer.lock.yml@${{ github.ref }} + GH_AW_INFO_VERSION: "1.0.80" + GH_AW_INFO_AWF_VERSION: "v0.28.14" + GH_AW_INFO_ENGINE_ID: "copilot" + - name: Download activation artifact + continue-on-error: true + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: activation + path: /tmp/gh-aw + - name: Download agent output artifact + id: download-agent-output + continue-on-error: true + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + pattern: "{agent,agent-output-fallback}" + merge-multiple: true + path: /tmp/gh-aw/ + - name: Setup agent output environment variable + id: setup-agent-output-env + if: steps.download-agent-output.outcome == 'success' + run: | + mkdir -p /tmp/gh-aw/ + find "/tmp/gh-aw/" -type f -print + if [ -f "/tmp/gh-aw/agent_output.json" ]; then + echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/agent_output.json" >> "$GITHUB_OUTPUT" + fi + - name: Checkout repository for patch context + if: needs.agent.outputs.has_patch == 'true' + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + # --- Threat Detection --- + - name: Clean stale firewall files from agent artifact + run: | + rm -rf /tmp/gh-aw/sandbox/firewall/logs + rm -rf /tmp/gh-aw/sandbox/firewall/audit + - name: Download container images + run: bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" ghcr.io/github/gh-aw-firewall/agent:0.28.14@sha256:f7df036c86575527b61f3f7df91c4412349a12b2a74988d929eafa2999230c98 ghcr.io/github/gh-aw-firewall/api-proxy:0.28.14@sha256:6f95e2234dd9bd6333a8ff28ccea7ecf0204acd4a09108723844dbd2bf6268c5 ghcr.io/github/gh-aw-firewall/squid:0.28.14@sha256:2ce8df3abf3e9b76e9c0cf5863da41f1ab3f89b20ad14b988806ab89e7bf2cd5 + - name: Check if detection needed + id: detection_guard + if: always() + env: + OUTPUT_TYPES: ${{ needs.agent.outputs.output_types }} + HAS_PATCH: ${{ needs.agent.outputs.has_patch }} + run: | + if [[ -n "$OUTPUT_TYPES" || "$HAS_PATCH" == "true" ]]; then + echo "run_detection=true" >> "$GITHUB_OUTPUT" + echo "Detection will run: output_types=$OUTPUT_TYPES, has_patch=$HAS_PATCH" + else + echo "run_detection=false" >> "$GITHUB_OUTPUT" + echo "Detection skipped: no agent outputs or patches to analyze" + fi + - name: Clear MCP Config for detection + if: always() && steps.detection_guard.outputs.run_detection == 'true' + run: | + rm -f "${RUNNER_TEMP}/gh-aw/mcp-config/mcp-servers.json" + rm -f "$HOME/.copilot/mcp-config.json" + rm -f "$GITHUB_WORKSPACE/.gemini/settings.json" + - name: Prepare threat detection files + if: always() && steps.detection_guard.outputs.run_detection == 'true' + run: | + bash "${RUNNER_TEMP}/gh-aw/actions/prepare_threat_detection_files.sh" + - name: Setup threat detection + if: always() && steps.detection_guard.outputs.run_detection == 'true' + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + WORKFLOW_NAME: "Update rust-analyzer" + WORKFLOW_DESCRIPTION: "Update the rust-analyzer version used by the Rust extractor and prepare a pull request." + HAS_PATCH: ${{ needs.agent.outputs.has_patch }} + GH_AW_DETECTION_CONTINUE_ON_ERROR: "true" + GH_AW_DETECTION_SKIP_PROMPT_SUMMARY: "true" + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'setup_threat_detection.cjs')); + await main(); + - name: Ensure threat-detection directory and log + if: always() && steps.detection_guard.outputs.run_detection == 'true' + run: | + mkdir -p /tmp/gh-aw/threat-detection + touch /tmp/gh-aw/threat-detection/detection.log + - name: Install AWF binary + run: bash "${RUNNER_TEMP}/gh-aw/actions/install_awf_binary.sh" v0.28.14 --rootless + - name: Setup Node.js + uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 + with: + node-version: '24' + package-manager-cache: false + - name: Install GitHub Copilot CLI + run: bash "${RUNNER_TEMP}/gh-aw/actions/install_copilot_cli.sh" + env: + GH_HOST: github.com + GH_AW_COMPILED_VERSION: v0.88.7 + - name: Install threat-detect binary + if: always() && steps.detection_guard.outputs.run_detection == 'true' + continue-on-error: true + run: | + bash "${RUNNER_TEMP}/gh-aw/actions/install_threat_detect_binary.sh" v0.5.1 + - name: Execute threat detection with AWF + id: detection_agentic_execution + if: always() && steps.detection_guard.outputs.run_detection == 'true' + continue-on-error: true + timeout-minutes: 10 + env: + AWF_REFLECT_ENABLED: 1 + COPILOT_AGENT_RUNNER_TYPE: STANDALONE + COPILOT_DUMMY_BYOK: dummy-byok-key-for-offline-mode + COPILOT_GITHUB_TOKEN: ${{ github.token }} + COPILOT_MODEL: detection + GH_AW_HARNESS_MAX_RETRIES: 0 + GH_AW_LLM_PROVIDER: github + GH_AW_MAX_AI_CREDITS: ${{ vars.GH_AW_DEFAULT_DETECTION_MAX_AI_CREDITS || '400' }} + GH_AW_MAX_TURNS: ${{ vars.GH_AW_DEFAULT_MAX_TURNS || '' }} + GH_AW_PHASE: detection + GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + GH_AW_TIMEOUT_MINUTES: 10 + GH_AW_VERSION: v0.88.7 + GITHUB_API_URL: ${{ github.api_url }} + GITHUB_AW: true + GITHUB_COPILOT_INTEGRATION_ID: agentic-workflows + GITHUB_HEAD_REF: ${{ github.head_ref }} + GITHUB_REF_NAME: ${{ github.ref_name }} + GITHUB_SERVER_URL: ${{ github.server_url }} + GITHUB_STEP_SUMMARY: /tmp/gh-aw/agent-step-summary.md + GITHUB_WORKSPACE: ${{ github.workspace }} + GIT_AUTHOR_EMAIL: github-actions[bot]@users.noreply.github.com + GIT_AUTHOR_NAME: github-actions[bot] + GIT_COMMITTER_EMAIL: github-actions[bot]@users.noreply.github.com + GIT_COMMITTER_NAME: github-actions[bot] + RUNNER_TEMP: ${{ runner.temp }} + S2STOKENS: true + TRACEPARENT: ${{ env.GITHUB_AW_OTEL_TRACE_ID != '' && env.GITHUB_AW_OTEL_PARENT_SPAN_ID != '' && format('00-{0}-{1}-01', env.GITHUB_AW_OTEL_TRACE_ID, env.GITHUB_AW_OTEL_PARENT_SPAN_ID) || '' }} + WORKFLOW_NAME: "Update rust-analyzer" + WORKFLOW_DESCRIPTION: "Update the rust-analyzer version used by the Rust extractor and prepare a pull request." + HAS_PATCH: ${{ needs.agent.outputs.has_patch }} + GH_AW_DETECTION_CONTINUE_ON_ERROR: "true" + run: | + set -o pipefail + printf '%s' "$(date +%s%3N)" > /tmp/gh-aw/agent_cli_start_ms.txt + GH_AW_COPILOT_SRC="$(command -v copilot 2>/dev/null || true)" + if [ -z "$GH_AW_COPILOT_SRC" ] || [ ! -x "$GH_AW_COPILOT_SRC" ]; then + echo "GitHub Copilot CLI executable not found on PATH after installation" >&2 + exit 127 + fi + GH_AW_COPILOT_BIN="${RUNNER_TEMP}/gh-aw/bin/copilot" + mkdir -p "${RUNNER_TEMP}/gh-aw/bin" + if [ "$GH_AW_COPILOT_SRC" != "$GH_AW_COPILOT_BIN" ]; then + cp "$GH_AW_COPILOT_SRC" "$GH_AW_COPILOT_BIN" + fi + chmod 755 "$GH_AW_COPILOT_BIN" + + (umask 177 && touch /tmp/gh-aw/threat-detection/detection.log) + GH_AW_MAX_AI_CREDITS="${GH_AW_MAX_AI_CREDITS:-400}" + if [[ ! "$GH_AW_MAX_AI_CREDITS" =~ ^[0-9]+$ ]]; then + GH_AW_MAX_AI_CREDITS="400" + fi + printf '%s\n' "{\"\$schema\":\"https://github.com/github/gh-aw-firewall/releases/download/v0.28.14/awf-config.schema.json\",\"apiProxy\":{\"enabled\":true,\"enableTokenSteering\":true,\"maxRuns\":500,\"maxAiCredits\":${GH_AW_MAX_AI_CREDITS},\"maxCacheMisses\":5,\"models\":{\"agent\":[\"sonnet-6x\",\"gpt-5.4\",\"gpt-5.5\",\"gpt-5.6\",\"gpt-5.3\",\"gemini-pro\",\"any\"],\"antigravity\":[\"copilot/antigravity*\",\"google/antigravity*\",\"gemini/antigravity*\"],\"any\":[\"copilot/*\",\"anthropic/*\",\"openai/*\",\"google/*\",\"gemini/*\"],\"auto\":[\"copilot/auto\",\"large\"],\"claude\":[\"agent\"],\"codex\":[\"agent\"],\"coding\":[\"copilot/gpt-5*codex*\",\"openai/gpt-5*codex*\",\"gpt-5-codex\",\"kimi\"],\"computer-use\":[\"copilot/*computer-use*\",\"google/*computer-use*\",\"gemini/*computer-use*\",\"openai/*computer-use*\"],\"copilot\":[\"agent\"],\"deep-research\":[\"copilot/deep-research*\",\"copilot/o3-deep-research*\",\"copilot/o4-mini-deep-research*\",\"google/deep-research*\",\"gemini/deep-research*\",\"openai/o3-deep-research*\",\"openai/o4-mini-deep-research*\"],\"detection\":[\"small\"],\"evals\":[\"small\"],\"fable\":[\"copilot/*fable*\",\"anthropic/*fable*\"],\"gemini\":[\"agent\"],\"gemini-3-flash\":[\"copilot/gemini-3*flash*\",\"google/gemini-3*flash*\",\"gemini/gemini-3*flash*\"],\"gemini-3-pro\":[\"copilot/gemini-3*pro*\",\"google/gemini-3*pro*\",\"google/nano-banana*\",\"gemini/gemini-3*pro*\"],\"gemini-3.1-flash\":[\"copilot/gemini-3.1*flash*\",\"google/gemini-3.1*flash*\",\"gemini/gemini-3.1*flash*\"],\"gemini-3.1-pro\":[\"copilot/gemini-3.1*pro*\",\"google/gemini-3.1*pro*\",\"gemini/gemini-3.1*pro*\"],\"gemini-3.5-flash\":[\"copilot/gemini-3.5*flash*\",\"google/gemini-3.5*flash*\",\"gemini/gemini-3.5*flash*\"],\"gemini-3.6-flash\":[\"copilot/gemini-3.6*flash*\",\"google/gemini-3.6*flash*\",\"gemini/gemini-3.6*flash*\"],\"gemini-3.7-flash\":[\"copilot/gemini-3.7*flash*\",\"google/gemini-3.7*flash*\",\"gemini/gemini-3.7*flash*\"],\"gemini-flash\":[\"copilot/gemini-*flash*\",\"google/gemini-*flash*\",\"gemini/gemini-*flash*\"],\"gemini-flash-lite\":[\"copilot/gemini-*flash*lite*\",\"google/gemini-*flash*lite*\",\"gemini/gemini-*flash*lite*\"],\"gemini-omni\":[\"copilot/gemini-omni*\",\"google/gemini-omni*\",\"gemini/gemini-omni*\"],\"gemini-pro\":[\"copilot/gemini-*pro*\",\"google/gemini-*pro*\",\"gemini/gemini-*pro*\"],\"gemma\":[\"copilot/gemma*\",\"google/gemma*\",\"gemini/gemma*\"],\"gpt-5\":[\"copilot/gpt-5*\",\"openai/gpt-5*\"],\"gpt-5-codex\":[\"copilot/gpt-5*codex*\",\"openai/gpt-5*codex*\"],\"gpt-5-mini\":[\"copilot/gpt-5*mini*\",\"openai/gpt-5*mini*\"],\"gpt-5-nano\":[\"copilot/gpt-5*nano*\",\"openai/gpt-5*nano*\"],\"gpt-5-pro\":[\"copilot/gpt-5*pro*\",\"openai/gpt-5*pro*\"],\"gpt-5.1\":[\"copilot/gpt-5.1*\",\"openai/gpt-5.1*\"],\"gpt-5.2\":[\"copilot/gpt-5.2*\",\"openai/gpt-5.2*\"],\"gpt-5.3\":[\"copilot/gpt-5.3*\",\"openai/gpt-5.3*\"],\"gpt-5.4\":[\"copilot/gpt-5.4*\",\"openai/gpt-5.4*\"],\"gpt-5.5\":[\"copilot/gpt-5.5*\",\"openai/gpt-5.5*\"],\"gpt-5.6\":[\"copilot/gpt-5.6*\",\"openai/gpt-5.6*\"],\"grok\":[\"copilot/*grok*\",\"openai/*grok*\"],\"haiku\":[\"copilot/*haiku*\",\"anthropic/*haiku*\"],\"image-generation\":[\"copilot/gpt-image*\",\"openai/gpt-image*\",\"openai/chatgpt-image*\",\"copilot/gemini-*image*\",\"google/gemini-*image*\",\"gemini/gemini-*image*\",\"google/imagen*\"],\"kimi\":[\"copilot/kimi*\",\"openai/kimi*\"],\"kiwi\":[\"copilot/kiwi*\",\"openai/kiwi*\"],\"large\":[\"sonnet\",\"gpt-5-pro\",\"gpt-5\",\"gemini-pro\"],\"lyria\":[\"google/lyria*\",\"gemini/lyria*\",\"copilot/lyria*\"],\"mai-code\":[\"copilot/MAI-Code*\",\"copilot/mai-code*\",\"openai/MAI-Code*\"],\"mai-code-1-flash-picker\":[\"copilot/MAI-Code-1-Flash-picker*\",\"copilot/mai-code-1-flash-picker*\",\"openai/MAI-Code-1-Flash-picker*\"],\"mini\":[\"haiku\",\"gpt-5-mini\",\"gpt-5-nano\",\"gemini-flash-lite\"],\"nano-banana\":[\"copilot/nano-banana*\",\"google/nano-banana*\",\"gemini/nano-banana*\"],\"opus\":[\"copilot/*opus*\",\"anthropic/*opus*\"],\"opusplan\":[\"opus?effort=high\"],\"raptor-mini\":[\"copilot/raptor*\",\"openai/raptor*\"],\"reasoning\":[\"copilot/o1*\",\"copilot/o3*\",\"copilot/o4*\",\"openai/o1*\",\"openai/o3*\",\"openai/o4*\"],\"robotics\":[\"copilot/*robotics*\",\"google/*robotics*\",\"gemini/*robotics*\"],\"small\":[\"mini\"],\"small-agent\":[\"haiku\",\"gpt-5-mini\",\"gemini-flash\"],\"sonnet\":[\"copilot/*sonnet*\",\"anthropic/*sonnet*\"],\"sonnet-6x\":[\"copilot/*sonnet-4.5*\",\"copilot/*sonnet-4.6*\",\"copilot/*sonnet-5*\",\"copilot/*sonnet-4-5-*\",\"anthropic/*sonnet-4-5-*\",\"copilot/*sonnet-4-6*\",\"anthropic/*sonnet-4-6*\",\"anthropic/*sonnet-5*\"],\"summarization\":[\"haiku\",\"gpt-5-mini\",\"gemini-flash-lite\",\"mini\"],\"veo\":[\"google/veo*\",\"gemini/veo*\"],\"vision\":[\"copilot/gemini-*image*\",\"google/gemini-*image*\",\"gemini/gemini-*image*\",\"copilot/gemini-*flash*\",\"google/gemini-*flash*\",\"gemini/gemini-*flash*\"]}},\"container\":{\"imageTag\":\"0.28.14,squid=sha256:2ce8df3abf3e9b76e9c0cf5863da41f1ab3f89b20ad14b988806ab89e7bf2cd5,agent=sha256:f7df036c86575527b61f3f7df91c4412349a12b2a74988d929eafa2999230c98,api-proxy=sha256:6f95e2234dd9bd6333a8ff28ccea7ecf0204acd4a09108723844dbd2bf6268c5,cli-proxy=sha256:3a379c5e96e29499c815e9dd2a71334d01c326a9b73991c76544fda9cae35c34\"},\"logging\":{\"proxyLogsDir\":\"/tmp/gh-aw/sandbox/firewall/logs\",\"auditDir\":\"/tmp/gh-aw/sandbox/firewall/audit\"}}" > "${RUNNER_TEMP}/gh-aw/awf-config.json" + cp "${RUNNER_TEMP}/gh-aw/awf-config.json" /tmp/gh-aw/awf-config.json + export GH_AW_MODELS_JSON_PATH="/tmp/gh-aw/models.json" + GH_AW_DOCKER_HOST="" + if [[ "${DOCKER_HOST:-}" =~ ^tcp:// ]]; then + GH_AW_DOCKER_HOST="${DOCKER_HOST}" + fi + if [[ "${DOCKER_HOST:-}" =~ ^tcp:// ]]; then + _GH_AW_CHROOT_JSON=$(jq -c --arg src "${RUNNER_TEMP}/gh-aw" --arg user "$(id -un)" --argjson uid "$(id -u)" --argjson gid "$(id -g)" --arg home "${RUNNER_TEMP}/gh-aw/home" '.chroot={"binariesSourcePath":$src,"identity":{"user":$user,"uid":$uid,"gid":$gid,"home":$home}}' "${RUNNER_TEMP}/gh-aw/awf-config.json") || { echo "chroot config patch failed" >&2; exit 1; } + printf '%s\n' "$_GH_AW_CHROOT_JSON" > "${RUNNER_TEMP}/gh-aw/awf-config.json" + fi + GH_AW_TOOL_CACHE_MOUNT="" + GH_AW_TOOL_CACHE="${RUNNER_TOOL_CACHE:?RUNNER_TOOL_CACHE must be set}" + if [ -d "$GH_AW_TOOL_CACHE" ]; then + if [[ "$GH_AW_TOOL_CACHE" != /opt/* ]]; then + GH_AW_TOOL_CACHE_MOUNT="$GH_AW_TOOL_CACHE:$GH_AW_TOOL_CACHE:ro" + fi + fi + # shellcheck disable=SC1003,SC2016,SC2086 + awf --config "${RUNNER_TEMP}/gh-aw/awf-config.json" --container-workdir "${GITHUB_WORKSPACE}" --mount "${RUNNER_TEMP}/gh-aw:${RUNNER_TEMP}/gh-aw:ro" --mount "${RUNNER_TEMP}/gh-aw:/host${RUNNER_TEMP}/gh-aw:ro" ${GH_AW_TOOL_CACHE_MOUNT:+--mount "$GH_AW_TOOL_CACHE_MOUNT"} ${GH_AW_DOCKER_HOST:+--docker-host "$GH_AW_DOCKER_HOST"} --env-all --exclude-env ACTIONS_ID_TOKEN_REQUEST_TOKEN --exclude-env ACTIONS_ID_TOKEN_REQUEST_URL --exclude-env COPILOT_GITHUB_TOKEN --mount /tmp/gh-aw:/tmp/gh-aw:rw --mount /tmp/gh-aw/threat-detection:/tmp/gh-aw/threat-detection:rw --log-level info --skip-pull \ + -- /bin/bash -c 'set +o histexpand; export PATH="${RUNNER_TEMP}/gh-aw/bin:$PATH" && : "${RUNNER_TOOL_CACHE:?RUNNER_TOOL_CACHE must be set}"; GH_AW_TOOL_CACHE="$RUNNER_TOOL_CACHE"; GH_AW_TOOL_BINS="$(find "$GH_AW_TOOL_CACHE" -maxdepth 5 -type d -name bin 2>/dev/null | tr '\''\n'\'' '\'':'\'')"; GH_AW_TOOL_BINS="${GH_AW_TOOL_BINS%:}"; export PATH="$PATH${GH_AW_TOOL_BINS:+:}$GH_AW_TOOL_BINS"; [ -n "$GOROOT" ] && export PATH="$GOROOT/bin:$PATH" || true; [ -n "$ERLANG_HOME" ] && export PATH="$ERLANG_HOME/bin:$PATH" || true && threat-detect --engine copilot --output /tmp/gh-aw/threat-detection/detection_result.json /tmp/gh-aw/threat-detection' 2>&1 | tee -a /tmp/gh-aw/threat-detection/detection.log + - name: Render detection log + if: always() && steps.detection_guard.outputs.run_detection == 'true' + continue-on-error: true + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'render_detection_log.cjs')); + await main(); + - name: Copy detection firewall logs + if: always() && steps.detection_guard.outputs.run_detection == 'true' + continue-on-error: true + run: | + mkdir -p /tmp/gh-aw/threat-detection/sandbox/firewall + if [ -d /tmp/gh-aw/sandbox/firewall/logs ]; then mkdir -p /tmp/gh-aw/threat-detection/sandbox/firewall/logs && cp -r /tmp/gh-aw/sandbox/firewall/logs/. /tmp/gh-aw/threat-detection/sandbox/firewall/logs/; fi + if [ -d /tmp/gh-aw/sandbox/firewall/audit ]; then mkdir -p /tmp/gh-aw/threat-detection/sandbox/firewall/audit && cp -r /tmp/gh-aw/sandbox/firewall/audit/. /tmp/gh-aw/threat-detection/sandbox/firewall/audit/; fi + - name: Upload threat detection artifact + if: always() && steps.detection_guard.outputs.run_detection == 'true' + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: detection + path: | + /tmp/gh-aw/threat-detection/detection_result.json + /tmp/gh-aw/threat-detection/sandbox/firewall/logs/ + /tmp/gh-aw/threat-detection/sandbox/firewall/audit/ + if-no-files-found: ignore + - name: Parse threat detection token usage for step summary + id: parse_detection_token_usage + if: always() + continue-on-error: true + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_TOKEN_USAGE_SUMMARY_TITLE: Threat Detection Token Usage + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'parse_token_usage.cjs')); + await main(); + - name: Conclude threat detection + id: detection_conclusion + if: always() + continue-on-error: true + env: + RUN_DETECTION: ${{ steps.detection_guard.outputs.run_detection }} + DETECTION_AGENTIC_EXECUTION_OUTCOME: ${{ steps.detection_agentic_execution.outcome }} + GH_AW_DETECTION_CONTINUE_ON_ERROR: "true" + run: | + bash "${RUNNER_TEMP}/gh-aw/actions/conclude_threat_detection.sh" /tmp/gh-aw/threat-detection/detection_result.json + + safe_outputs: + needs: + - activation + - agent + - detection + if: (!cancelled()) && needs.agent.result != 'skipped' && needs.detection.result == 'success' + runs-on: ubuntu-slim + permissions: + contents: write + issues: write + pull-requests: write + timeout-minutes: 45 + env: + GH_AW_AGENT_AIC: ${{ needs.agent.outputs.aic }} + GH_AW_AIC: ${{ needs.agent.outputs.aic }} + GH_AW_AMBIENT_CONTEXT: ${{ needs.agent.outputs.ambient_context }} + GH_AW_CALLER_WORKFLOW_ID: "${{ github.repository }}/update-rust-analyzer" + GH_AW_DETECTION_CONCLUSION: ${{ needs.detection.outputs.detection_conclusion }} + GH_AW_DETECTION_REASON: ${{ needs.detection.outputs.detection_reason }} + GH_AW_EFFECTIVE_TOKENS: ${{ needs.agent.outputs.effective_tokens }} + GH_AW_ENGINE_ID: "copilot" + GH_AW_ENGINE_MODEL: ${{ needs.agent.outputs.model }} + GH_AW_RUNTIME_FEATURES: ${{ vars.GH_AW_RUNTIME_FEATURES }} + GH_AW_THREAT_DETECTION_AIC: ${{ needs.detection.outputs.aic }} + GH_AW_WORKFLOW_EMOJI: "🦀" + GH_AW_WORKFLOW_ID: "update-rust-analyzer" + GH_AW_WORKFLOW_NAME: "Update rust-analyzer" + GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/${{ github.repository }}/blob/${{ github.ref_name }}/.github/workflows/update-rust-analyzer.md" + outputs: + code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} + code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} + create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} + process_safe_outputs_items_applied: ${{ steps.process_safe_outputs.outputs.items_applied }} + process_safe_outputs_items_cancelled: ${{ steps.process_safe_outputs.outputs.items_cancelled }} + process_safe_outputs_items_deferred: ${{ steps.process_safe_outputs.outputs.items_deferred }} + process_safe_outputs_items_failed: ${{ steps.process_safe_outputs.outputs.items_failed }} + process_safe_outputs_items_skipped: ${{ steps.process_safe_outputs.outputs.items_skipped }} + process_safe_outputs_items_succeeded: ${{ steps.process_safe_outputs.outputs.items_succeeded }} + process_safe_outputs_items_warnings: ${{ steps.process_safe_outputs.outputs.items_warnings }} + process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} + process_safe_outputs_status: ${{ steps.process_safe_outputs.outputs.status }} + process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} + steps: + - name: Setup Scripts + id: setup + uses: github/gh-aw-actions/setup@5e508589e03a7757a7e05b26e834292f5445bfb6 # v0.88.7 + with: + destination: ${{ runner.temp }}/gh-aw/actions + job-name: ${{ github.job }} + trace-id: ${{ needs.activation.outputs.setup-trace-id }} + parent-span-id: ${{ needs.activation.outputs.setup-parent-span-id || needs.activation.outputs.setup-span-id }} + env: + GH_AW_SETUP_WORKFLOW_NAME: "Update rust-analyzer" + GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/update-rust-analyzer.lock.yml@${{ github.ref }} + GH_AW_INFO_VERSION: "1.0.80" + GH_AW_INFO_AWF_VERSION: "v0.28.14" + GH_AW_INFO_ENGINE_ID: "copilot" + - name: Mask OTLP telemetry headers + run: bash "${RUNNER_TEMP}/gh-aw/actions/mask_otlp_headers.sh" + - name: Download agent output artifact + id: download-agent-output + continue-on-error: true + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + pattern: "{agent,agent-output-fallback}" + merge-multiple: true + path: /tmp/gh-aw/ + - name: Setup agent output environment variable + id: setup-agent-output-env + if: steps.download-agent-output.outcome == 'success' + run: | + mkdir -p /tmp/gh-aw/ + find "/tmp/gh-aw/" -type f -print + if [ -f "/tmp/gh-aw/agent_output.json" ]; then + echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/agent_output.json" >> "$GITHUB_OUTPUT" + fi + - name: Download patch artifact + continue-on-error: true + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: agent + path: /tmp/gh-aw/ + - name: Checkout repository + if: (!cancelled()) && needs.agent.result != 'skipped' && contains(needs.agent.outputs.output_types, 'create_pull_request') + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: true + fetch-depth: 0 + token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + - name: Configure Git credentials + if: (!cancelled()) && needs.agent.result != 'skipped' && contains(needs.agent.outputs.output_types, 'create_pull_request') + env: + GITHUB_REPOSITORY: ${{ github.repository }} + GITHUB_SERVER_URL: ${{ github.server_url }} + GIT_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + run: bash "${RUNNER_TEMP}/gh-aw/actions/configure_git_credentials.sh" + - name: Configure GH_HOST for enterprise compatibility + id: ghes-host-config + shell: bash + run: | # zizmor: ignore[github-env] - GITHUB_SERVER_URL is set by GitHub Actions, not user input. + # Derive GH_HOST from GITHUB_SERVER_URL so the gh CLI targets the correct + # GitHub instance (GHES/GHEC). On github.com this is a harmless no-op. + GH_HOST="${GITHUB_SERVER_URL#https://}" + GH_HOST="${GH_HOST#http://}" + echo "GH_HOST=${GH_HOST}" >> "$GITHUB_ENV" + - name: Process Safe Outputs + id: process_safe_outputs + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} + GH_AW_COMMENT_ID: ${{ needs.activation.outputs.comment_id }} + GH_AW_ALLOWED_DOMAINS: "*.githubusercontent.com,*.pythonhosted.org,anaconda.org,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,bcr.bazel.build,binstar.org,blog.bazel.build,bootstrap.pypa.io,codeload.github.com,conda.anaconda.org,conda.binstar.org,crates.io,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,docs.github.com,files.pythonhosted.org,github-cloud.githubusercontent.com,github-cloud.s3.amazonaws.com,github.blog,github.com,github.githubassets.com,index.crates.io,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,lfs.github.com,mirror.bazel.build,objects.githubusercontent.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,patch-diff.githubusercontent.com,patchdiff.githubusercontent.com,pip.pypa.io,ppa.launchpad.net,productionresultssa0.blob.core.windows.net,productionresultssa1.blob.core.windows.net,productionresultssa10.blob.core.windows.net,productionresultssa11.blob.core.windows.net,productionresultssa12.blob.core.windows.net,productionresultssa13.blob.core.windows.net,productionresultssa14.blob.core.windows.net,productionresultssa15.blob.core.windows.net,productionresultssa16.blob.core.windows.net,productionresultssa17.blob.core.windows.net,productionresultssa18.blob.core.windows.net,productionresultssa19.blob.core.windows.net,productionresultssa2.blob.core.windows.net,productionresultssa3.blob.core.windows.net,productionresultssa4.blob.core.windows.net,productionresultssa5.blob.core.windows.net,productionresultssa6.blob.core.windows.net,productionresultssa7.blob.core.windows.net,productionresultssa8.blob.core.windows.net,productionresultssa9.blob.core.windows.net,pypi.org,pypi.python.org,raw.githubusercontent.com,releases.bazel.build,repo.anaconda.com,repo.continuum.io,s.symcb.com,s.symcd.com,security.ubuntu.com,sh.rustup.rs,static.crates.io,static.rust-lang.org,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com,www.googleapis.com" + GITHUB_SERVER_URL: ${{ github.server_url }} + GITHUB_API_URL: ${{ github.api_url }} + GH_AW_SAFE_OUTPUTS_HANDLER_CONFIG: "{\"create_pull_request\":{\"allowed_files\":[\"Cargo.lock\",\"MODULE.bazel\",\"MODULE.bazel.lock\",\"rust-toolchain.toml\",\"rust/**\",\"misc/bazel/3rdparty/**\"],\"branch_prefix\":\"automation/update-rust-analyzer/\",\"draft\":true,\"max\":1,\"max_patch_files\":1000,\"max_patch_size\":10240,\"protect_top_level_dot_folders\":true,\"protected_files\":[\"package.json\",\"bun.lockb\",\"bunfig.toml\",\"deno.json\",\"deno.jsonc\",\"deno.lock\",\"global.json\",\"NuGet.Config\",\"Directory.Packages.props\",\"mix.exs\",\"mix.lock\",\"go.mod\",\"go.sum\",\"stack.yaml\",\"stack.yaml.lock\",\"pom.xml\",\"build.gradle\",\"build.gradle.kts\",\"settings.gradle\",\"settings.gradle.kts\",\"gradle.properties\",\"package-lock.json\",\"yarn.lock\",\"pnpm-lock.yaml\",\"npm-shrinkwrap.json\",\"requirements.txt\",\"Pipfile\",\"Pipfile.lock\",\"pyproject.toml\",\"setup.py\",\"setup.cfg\",\"Gemfile\",\"Gemfile.lock\",\"uv.lock\",\"CODEOWNERS\",\"DESIGN.md\",\"README.md\",\"CONTRIBUTING.md\",\"CHANGELOG.md\",\"SECURITY.md\",\"CODE_OF_CONDUCT.md\",\"AGENTS.md\"],\"protected_files_policy\":\"allowed\",\"title_prefix\":\"Rust: \"},\"create_report_incomplete_issue\":{},\"missing_data\":{},\"missing_tool\":{},\"noop\":{\"max\":1,\"report-as-issue\":\"false\"},\"report_incomplete\":{}}" + GH_AW_CI_TRIGGER_TOKEN: ${{ secrets.GH_AW_CI_TRIGGER_TOKEN }} + with: + github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'process_safe_outputs.cjs')); + await main(); + - name: Upload Safe Outputs Items + if: always() + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: safe-outputs-items + path: | + /tmp/gh-aw/safe-output-items.jsonl + /tmp/gh-aw/temporary-id-map.json + /tmp/gh-aw/safe-output-errors.json + if-no-files-found: ignore diff --git a/.github/workflows/update-rust-analyzer.md b/.github/workflows/update-rust-analyzer.md new file mode 100644 index 000000000000..222ec9ae496d --- /dev/null +++ b/.github/workflows/update-rust-analyzer.md @@ -0,0 +1,124 @@ +--- +name: Update rust-analyzer +emoji: 🦀 +description: Update the rust-analyzer version used by the Rust extractor and prepare a pull request. +intent: Keep the Rust extractor on the latest compatible rust-analyzer version with a reviewable, validated pull request. +on: + workflow_dispatch: + roles: [admin, maintainer, write] +permissions: + contents: read + actions: read + pull-requests: read + copilot-requests: write +strict: true +checkout: + fetch-depth: 0 +concurrency: + group: update-rust-analyzer + cancel-in-progress: false +timeout-minutes: 180 +tools: + github: + mode: gh-proxy + toolsets: [repos, pull_requests, actions] + bash: ["*"] + edit: true +network: + allowed: + - defaults + - github + - github-actions + - rust + - bazel + - python +steps: + - name: Configure Git + run: | + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + + - name: Install cargo-edit + continue-on-error: true + run: cargo install cargo-edit --locked + + - name: Run rust-analyzer updater script + run: | + mkdir -p /tmp/gh-aw/agent + set +e + python3 rust/scripts/update_rust_analyzer.py \ + 2>&1 | tee /tmp/gh-aw/agent/rust-analyzer-update.log + status=${PIPESTATUS[0]} + set -e + + printf '%s\n' "$status" > /tmp/gh-aw/agent/rust-analyzer-update-status.txt + if grep -Fxq "No new rust-analyzer version available." \ + /tmp/gh-aw/agent/rust-analyzer-update.log; then + printf '%s\n' "no-update" > /tmp/gh-aw/agent/rust-analyzer-update-result.txt + else + printf '%s\n' "update" > /tmp/gh-aw/agent/rust-analyzer-update-result.txt + fi +safe-outputs: + create-pull-request: + title-prefix: "Rust: " + branch-prefix: "automation/update-rust-analyzer/" + draft: true + protected-files: allowed + max-patch-size: 10240 + max-patch-files: 1000 + allowed-files: + - "Cargo.lock" + - "MODULE.bazel" + - "MODULE.bazel.lock" + - "rust-toolchain.toml" + - "rust/**" + - "misc/bazel/3rdparty/**" +--- + +# Update rust-analyzer + +## Task + +The workflow has already run `rust/scripts/update_rust_analyzer.py`. Read: + +- `/tmp/gh-aw/agent/rust-analyzer-update.log` for its complete output. +- `/tmp/gh-aw/agent/rust-analyzer-update-status.txt` for its exit status. +- `/tmp/gh-aw/agent/rust-analyzer-update-result.txt` for the deterministic result classification. + +If the result is `no-update`, call `noop` with the reason +`No new rust-analyzer version available.` and stop immediately. Do not inspect +CI, modify files, or create a pull request. + +Otherwise, continue the update from the existing working tree and commits: + +1. Read `rust/updating-rust-analyzer.md` and all applicable repository + instructions. +2. Review the updater log, exit status, commits, and working tree. Do not rerun + the updater script. +3. Complete as much of the documented update as possible. Fix extractor or + code-generation breakage, keep all `ra_ap_` dependency versions aligned, + regenerate required files, and add schema upgrade/downgrade scripts, tests, + and a change note when the schema changed. +4. Run the relevant formatting, linting, code generation, build, and tests, + including `bazel run //rust:install`. Use `gh` to inspect relevant existing + CI configuration and prior failures while diagnosing problems. +5. Review the complete diff and commits. Do not include secrets. Do not refer + to private repositories, internal issues, or internal pull requests in the + public pull request. +6. Use `create_pull_request` exactly once to create a focused draft pull + request. Summarize the updater output, changes, and validation. If the + update cannot be finished, still create a partial draft pull request when + there are useful changes, and clearly list failures, missing work, and the + next commands for a maintainer. + +The pull request is created after this agent execution, so its newly triggered +CI cannot be awaited in this run. Compensate with the strongest practical +local validation and state this limitation accurately in the pull request. +If the updater did not report `no-update` but no useful patch can be produced, +call `report_incomplete` with the updater failure and exact blocker. + +## Safe Outputs + +- Use `create_pull_request` for the update or partial update. +- Use `noop` only for the exact no-update result. +- Use `report_incomplete` only when no useful pull request can be created. From b6c413b13783752734dcf1bb5f8b54290837fab5 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Wed, 16 Sep 2026 13:58:02 +0200 Subject: [PATCH 1055/2098] Rust: Wrap lines at consistent column --- rust/updating-rust-analyzer.md | 65 +++++++++++++++++++++------------- 1 file changed, 41 insertions(+), 24 deletions(-) diff --git a/rust/updating-rust-analyzer.md b/rust/updating-rust-analyzer.md index 168bcefd722a..f2169b22d60a 100644 --- a/rust/updating-rust-analyzer.md +++ b/rust/updating-rust-analyzer.md @@ -1,8 +1,10 @@ # Updating rust-analyzer -Here's a rundown of the typical actions to perform to do a rust-analyzer (and other dependencies) update. A one-time setup consists in -installing [`cargo-edit`](https://crates.io/crates/cargo-edit) with `cargo install cargo-edit`. On Ubuntu that also requires -`sudo apt install libssl-dev pkg-config`. +Here's a rundown of the typical actions to perform to do a rust-analyzer (and +other dependencies) update. A one-time setup consists in installing +[`cargo-edit`](https://crates.io/crates/cargo-edit) with `cargo install +cargo-edit`. On Ubuntu that also requires `sudo apt install libssl-dev +pkg-config`. > [!TIP] > All steps up to and including running `bazel run //rust:install` are (barring @@ -14,10 +16,13 @@ installing [`cargo-edit`](https://crates.io/crates/cargo-edit) with `cargo insta ``` cargo upgrade --incompatible --pinned ``` - 2. Look at a diff of the `Cargo.toml` files: if all `ra_ap_` prefixed dependencies have been updated to the same number, go on to the next step. - Otherwise, it means the latest `rust-analyzer` update has not been fully rolled out to all its crates in `crates.io`. - _All `ra_ap_` versions must agree!_ - Downgrade by hand to the minimum one you see, and run a `cargo update` after that to fix the `Cargo.lock` file. + 2. Look at a diff of the `Cargo.toml` files: if all `ra_ap_` prefixed + dependencies have been updated to the same number, go on to the next + step. Otherwise, it means the latest `rust-analyzer` update has not been + fully rolled out to all its crates in `crates.io`. _All `ra_ap_` versions + must agree!_ + Downgrade by hand to the minimum one you see, and run a `cargo update` + after that to fix the `Cargo.lock` file. 3. Commit the changes, skipping `pre-commit` hooks if you have them enabled: ``` git commit -am 'Cargo: upgrade dependencies' --no-verify @@ -41,10 +46,13 @@ installing [`cargo-edit`](https://crates.io/crates/cargo-edit) with `cargo insta git commit -am 'Bazel: regenerate vendored cargo dependencies' --no-verify ``` > [!NOTE] - > If in step 5 you also bump `rules_rust` or the Rust toolchain used for building the extractor, those changes invalidate _all_ vendored files (including the - > Python ones under `misc/bazel/3rdparty/py_deps`), not just the tree-sitter ones. In that case run the umbrella script - > `misc/bazel/3rdparty/update_cargo_deps.sh` instead (it regenerates both `py_deps` and `tree_sitter_extractors_deps`, and runs - > `bazel mod tidy`), then commit all the regenerated files. + > If in step 5 you also bump `rules_rust` or the Rust toolchain used for + > building the extractor, those changes invalidate _all_ vendored files + > (including the Python ones under `misc/bazel/3rdparty/py_deps`), not just + > the tree-sitter ones. In that case run the umbrella script + > `misc/bazel/3rdparty/update_cargo_deps.sh` instead (it regenerates both + > `py_deps` and `tree_sitter_extractors_deps`, and runs `bazel mod tidy`), + > then commit all the regenerated files. 4. Run codegen ``` @@ -67,19 +75,28 @@ installing [`cargo-edit`](https://crates.io/crates/cargo-edit) with `cargo insta bazel run //rust:install ``` * if it succeeds: good! You can move on to the next step. - * if it fails while compiling rust-analyzer dependencies, you need to update the Rust toolchain. Sometimes the error will tell you - so explicitly, but it may happen that the error is more obscure. To update the rust toolchain: - * you will need to open a PR on the internal repo updating `RUST_VERSION` in `MODULE.bazel`. In general you can have this merged - independently of the changes in `codeql`. - * in `codeql`, update both `RUST_VERSION` in `MODULE.bazel` _and_ `rust-toolchain.toml` files. You may want to also update the - nightly toolchain in `rust/extractor/src/nightly-toolchain/rust-toolchain.toml` to a more recent date while you're at it. - * a toolchain and/or `rules_rust` bump invalidates the vendored files, so re-run `misc/bazel/3rdparty/update_cargo_deps.sh` - (see the note in step 4) and commit the regenerated files. - * if it fails while compiling rust extractor code, you will need to adapt it to the new library version. - * for example updating annotations in `annotations.py`, adding / removing generated tests. - - If you had to do any changes, commit them. If you updated the rust toolchain, running `rust/lint.py` might reformat or apply new - lints to the code. + * if it fails while compiling rust-analyzer dependencies, you need to update + the Rust toolchain. Sometimes the error will tell you so explicitly, but + it may happen that the error is more obscure. To update the rust + toolchain: + * you will need to open a PR on the internal repo updating `RUST_VERSION` + in `MODULE.bazel`. In general you can have this merged independently of + the changes in `codeql`. + * in `codeql`, update both `RUST_VERSION` in `MODULE.bazel` _and_ + `rust-toolchain.toml` files. You may want to also update the nightly + toolchain in `rust/extractor/src/nightly-toolchain/rust-toolchain.toml` + to a more recent date while you're at it. + * a toolchain and/or `rules_rust` bump invalidates the vendored files, so + re-run `misc/bazel/3rdparty/update_cargo_deps.sh` (see the note in step + 4) and commit the regenerated files. + * if it fails while compiling rust extractor code, you will need to adapt it + to the new library version. + * for example updating annotations in `annotations.py`, adding / removing + generated tests. + + If you had to do any changes, commit them. If you updated the rust + toolchain, running `rust/lint.py` might reformat or apply new lints to the + code. 6. Check with CI if everything is in order. From ea202590e2f252136e055e685937b769dc2848c5 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Wed, 16 Sep 2026 13:19:40 +0200 Subject: [PATCH 1056/2098] Unified: Add exception CFG edges from try expressions. --- .../unified/internal/ControlFlowGraph.qll | 8 +++++++- .../internal/ControlFlowGraphPlugin.qll | 10 ++++++++++ .../internal/ControlFlowGraphPluginSwift.qll | 16 +++++++++++++++ .../controlflow/basicblock-slices.expected | 17 ++++++++++++++-- .../library-tests/controlflow/cfg.expected | 20 ++++++++++++------- .../test/library-tests/controlflow/cfg.swift | 20 +++++++++---------- 6 files changed, 71 insertions(+), 20 deletions(-) create mode 100644 unified/ql/lib/codeql/unified/internal/ControlFlowGraphPlugin.qll create mode 100644 unified/ql/lib/codeql/unified/internal/ControlFlowGraphPluginSwift.qll diff --git a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll index 2c60994c4cd5..019722484d1a 100644 --- a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll @@ -7,6 +7,7 @@ module; private import unified private import codeql.controlflow.ControlFlowGraph private import codeql.controlflow.SuccessorType +private import ControlFlowGraphPlugin private module Cfg0 = Make0; @@ -221,6 +222,8 @@ private module Ast implements AstSig { } } +private predicate mayThrow(AstNode ast) { any(ControlFlowGraphPlugin p).mayThrow(ast) } + private module Input implements InputSig1, InputSig2 { private import codeql.util.Void @@ -256,7 +259,10 @@ private module Input implements InputSig1, InputSig2 { predicate beginAbruptCompletion( AstNode ast, PreControlFlowNode n, AbruptCompletion c, boolean always ) { - none() + mayThrow(ast) and + n.isIn(ast) and + c.asSimpleAbruptCompletion() instanceof ExceptionSuccessor and + always = false } predicate endAbruptCompletion(AstNode ast, PreControlFlowNode n, AbruptCompletion c) { none() } diff --git a/unified/ql/lib/codeql/unified/internal/ControlFlowGraphPlugin.qll b/unified/ql/lib/codeql/unified/internal/ControlFlowGraphPlugin.qll new file mode 100644 index 000000000000..ae1f5fa25ce5 --- /dev/null +++ b/unified/ql/lib/codeql/unified/internal/ControlFlowGraphPlugin.qll @@ -0,0 +1,10 @@ +private import unified +private import codeql.util.Unit + +private module Plugins { + private import ControlFlowGraphPluginSwift +} + +class ControlFlowGraphPlugin extends Unit { + predicate mayThrow(AstNode ast) { none() } +} diff --git a/unified/ql/lib/codeql/unified/internal/ControlFlowGraphPluginSwift.qll b/unified/ql/lib/codeql/unified/internal/ControlFlowGraphPluginSwift.qll new file mode 100644 index 000000000000..fac0d2bacf1c --- /dev/null +++ b/unified/ql/lib/codeql/unified/internal/ControlFlowGraphPluginSwift.qll @@ -0,0 +1,16 @@ +private import unified +private import ControlFlowGraphPlugin + +private predicate inTry(AstNode ast) { + ast.(UnaryExpr).getOperator().(Token).getValue() = "try" + or + exists(AstNode parent | + parent = ast.getParent() and + inTry(ast.getParent()) and + not parent instanceof Callable + ) +} + +private class ControlFlowGraphPluginSwift extends ControlFlowGraphPlugin { + override predicate mayThrow(AstNode ast) { ast instanceof CallExpr and inTry(ast) } +} diff --git a/unified/ql/test/library-tests/controlflow/basicblock-slices.expected b/unified/ql/test/library-tests/controlflow/basicblock-slices.expected index 4cdaa2b10fde..c9d14ccd1af7 100644 --- a/unified/ql/test/library-tests/controlflow/basicblock-slices.expected +++ b/unified/ql/test/library-tests/controlflow/basicblock-slices.expected @@ -19,10 +19,22 @@ | 28 | cfg.swift:28:1:45:1 | FunctionDeclaration | 'FunctionDeclaration' | | 28 | cfg.swift:28:15:28:15 | x | 'x -^ Block' | | 29 | cfg.swift:29:3:43:3 | TryExpr | 'TryExpr -V Block' | -| 30 | cfg.swift:30:9:30:18 | mightThrow | 'mightThrow -> Argument -V 0 -^ CallExpr -^ try -^ UnaryExpr' | +| 30 | cfg.swift:30:5:30:24 | try | 'try -^ UnaryExpr' | +| 30 | cfg.swift:30:9:30:18 | mightThrow | 'mightThrow -> Argument -V 0 -^ CallExpr' | | 31 | cfg.swift:31:5:31:9 | print | 'print -> Argument -V "Did not throw." -^ CallExpr' | | 32 | cfg.swift:32:10:32:19 | mightThrow | 'mightThrow -> Argument -V 0 -^ CallExpr -^ try! -^ UnaryExpr' | | 33 | cfg.swift:33:5:33:9 | print | 'print -> Argument -V "Still did not throw." -^ CallExpr' | +| 35 | cfg.swift:35:5:37:3 | CatchClause | 'CatchClause -V MyError -^ MemberAccessExpr -> isZero -> Argument -V x -^ CallExpr -? MyError -^ MemberAccessExpr -^ ConditionalPattern -^ OrPattern' | +| 35 | cfg.swift:35:62:37:3 | Block | 'Block' | +| 36 | cfg.swift:36:12:36:12 | 0 | '0 -^ ReturnExpr' | +| 37 | cfg.swift:37:5:39:3 | CatchClause | 'CatchClause -V MyError -^ MemberAccessExpr -> Argument -V withParam -^ ExprPattern -^ CallExpr' | +| 37 | cfg.swift:37:41:39:3 | Block | 'Block' | +| 38 | cfg.swift:38:12:38:20 | withParam | 'withParam -^ ReturnExpr' | +| 39 | cfg.swift:39:5:41:3 | CatchClause | 'CatchClause -V ' | +| 39 | cfg.swift:39:22:41:3 | Block | 'Block' | +| 40 | cfg.swift:40:5:40:9 | print | 'print -> Argument -V "MyError" -^ CallExpr' | +| 41 | cfg.swift:41:5:43:3 | CatchClause | 'CatchClause -V Block' | +| 42 | cfg.swift:42:5:42:9 | print | 'print -> Argument -V Unknown error -> interpolation -V Argument -V error -^ CallExpr -> -^ StringInterpolationExpr -^ CallExpr' | | 44 | cfg.swift:44:10:44:10 | 0 | '0 -^ ReturnExpr' | | 47 | cfg.swift:47:1:51:1 | FunctionDeclaration | 'FunctionDeclaration' | | 47 | cfg.swift:47:21:47:21 | s | 's -^ Block' | @@ -311,7 +323,8 @@ | 396 | cfg.swift:396:1:404:1 | FunctionDeclaration | 'FunctionDeclaration' | | 396 | cfg.swift:396:21:396:21 | x | 'x -^ Block' | | 397 | cfg.swift:397:3:402:3 | TryExpr | 'TryExpr -V Block' | -| 398 | cfg.swift:398:9:398:18 | mightThrow | 'mightThrow -> Argument -V 0 -^ CallExpr -^ try -^ UnaryExpr' | +| 398 | cfg.swift:398:5:398:24 | try | 'try -^ UnaryExpr' | +| 398 | cfg.swift:398:9:398:18 | mightThrow | 'mightThrow -> Argument -V 0 -^ CallExpr' | | 399 | cfg.swift:399:5:399:9 | print | 'print -> Argument -V "Did not throw." -^ CallExpr' | | 400 | cfg.swift:400:10:400:19 | mightThrow | 'mightThrow -> Argument -V 0 -^ CallExpr -^ try! -^ UnaryExpr' | | 401 | cfg.swift:401:5:401:9 | print | 'print -> Argument -V "Still did not throw." -^ CallExpr' | diff --git a/unified/ql/test/library-tests/controlflow/cfg.expected b/unified/ql/test/library-tests/controlflow/cfg.expected index 675e2bbe0312..cf0b25228239 100644 --- a/unified/ql/test/library-tests/controlflow/cfg.expected +++ b/unified/ql/test/library-tests/controlflow/cfg.expected @@ -4,6 +4,17 @@ bbContinues | cfg.swift:525:78:525:78 | Block | 'Block goto Task(+2)' | | cfg.swift:526:9:526:20 | continuation | 'continuation goto Block(-1)' | bbStep +| cfg.swift:30:9:30:24 | CallExpr | 'CallExpr : exception -> CatchClause(+5)' | +| cfg.swift:30:9:30:24 | CallExpr | 'CallExpr : successor -> try(+0)' | +| cfg.swift:33:5:33:33 | CallExpr | 'CallExpr : successor -> 0(+11)' | +| cfg.swift:35:5:35:5 | OrPattern | 'OrPattern : match -> Block(+0)' | +| cfg.swift:35:5:35:5 | OrPattern | 'OrPattern : no-match -> CatchClause(+2)' | +| cfg.swift:37:11:37:39 | CallExpr | 'CallExpr : match -> Block(+0)' | +| cfg.swift:37:11:37:39 | CallExpr | 'CallExpr : no-match -> CatchClause(+2)' | +| cfg.swift:39:11:39:20 | | ' : match -> Block(+0)' | +| cfg.swift:39:11:39:20 | | ' : no-match -> CatchClause(+2)' | +| cfg.swift:40:5:40:20 | CallExpr | 'CallExpr : successor -> 0(+4)' | +| cfg.swift:42:5:42:35 | CallExpr | 'CallExpr : successor -> 0(+2)' | | cfg.swift:140:12:140:17 | BinaryExpr | 'BinaryExpr : empty -> SwitchExpr(+3)' | | cfg.swift:140:12:140:17 | BinaryExpr | 'BinaryExpr : non-empty -> _(+0)' | | cfg.swift:141:9:141:12 | Block | 'Block : successor -> SwitchExpr(+2)' | @@ -80,6 +91,7 @@ bbStep | cfg.swift:360:3:360:3 | WhileStmt | 'WhileStmt : successor -> x(+0)' | | cfg.swift:360:9:360:14 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | | cfg.swift:361:5:361:10 | CompoundAssignExpr | 'CompoundAssignExpr : successor -> x(-1)' | +| cfg.swift:398:9:398:24 | CallExpr | 'CallExpr : successor -> try(+0)' | | cfg.swift:500:6:500:28 | | ' : false -> IfExpr(+4)' | | cfg.swift:500:6:500:28 | | ' : true -> Block(+0)' | | cfg.swift:501:5:501:10 | CompoundAssignExpr | 'CompoundAssignExpr : successor -> IfExpr(+3)' | @@ -116,13 +128,6 @@ bbStep noCfg | cfg.swift:23:9:23:9 | x | | cfg.swift:24:5:24:42 | ThrowExpr | -| cfg.swift:35:11:35:17 | MyError | -| cfg.swift:36:5:36:12 | ReturnExpr | -| cfg.swift:37:11:37:17 | MyError | -| cfg.swift:38:5:38:20 | ReturnExpr | -| cfg.swift:39:11:39:20 | | -| cfg.swift:40:5:40:9 | print | -| cfg.swift:42:5:42:9 | print | | cfg.swift:47:42:47:47 | String | | cfg.swift:53:34:53:34 | _ | | cfg.swift:60:34:60:34 | _ | @@ -152,6 +157,7 @@ noCfg | cfg.swift:559:6:559:20 | autoclosureTest | nonSimple | cfg.swift:10:1:10:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V MyError -^ BaseType -V Error' | +| cfg.swift:35:5:35:5 | CatchClause | 'CatchClause -V MyError -^ MemberAccessExpr -> isZero -> Argument -V x -^ CallExpr -? MyError -^ MemberAccessExpr -^ ConditionalPattern -^ OrPattern' | | cfg.swift:209:5:209:5 | x | 'x -> x -? - -^ UnaryExpr -^ AssignExpr' | | cfg.swift:390:1:390:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V Derived -^ BaseType -V C' | | cfg.swift:527:13:527:16 | Task | 'Task -^ MemberAccessExpr -^ Argument -V FunctionExpr -^ CallExpr' | diff --git a/unified/ql/test/library-tests/controlflow/cfg.swift b/unified/ql/test/library-tests/controlflow/cfg.swift index 984983fc1b52..e8bb40e33f8e 100644 --- a/unified/ql/test/library-tests/controlflow/cfg.swift +++ b/unified/ql/test/library-tests/controlflow/cfg.swift @@ -27,19 +27,19 @@ func mightThrow(x : Int) throws -> Void { func tryCatch(x : Int) -> Int { do { - try mightThrow(x: 0) + try mightThrow(x: 0) // $ bbStep='CallExpr : exception -> CatchClause(+5)' bbStep='CallExpr : successor -> try(+0)' print("Did not throw.") try! mightThrow(x: 0) - print("Still did not throw.") + print("Still did not throw.") // $ bbStep='CallExpr : successor -> 0(+11)' - } catch MyError.error1 , MyError.error2 where isZero(x: x) { // $ noCfg - return 0 // $ noCfg - } catch MyError.error3(let withParam) { // $ noCfg - return withParam // $ noCfg - } catch is MyError { // $ noCfg - print("MyError") // $ noCfg + } catch MyError.error1 , MyError.error2 where isZero(x: x) { // $ bbStep='OrPattern : match -> Block(+0)' bbStep='OrPattern : no-match -> CatchClause(+2)' nonSimple='CatchClause -V MyError -^ MemberAccessExpr -> isZero -> Argument -V x -^ CallExpr -? MyError -^ MemberAccessExpr -^ ConditionalPattern -^ OrPattern' + return 0 + } catch MyError.error3(let withParam) { // $ bbStep='CallExpr : match -> Block(+0)' bbStep='CallExpr : no-match -> CatchClause(+2)' + return withParam + } catch is MyError { // $ bbStep=' : match -> Block(+0)' bbStep=' : no-match -> CatchClause(+2)' + print("MyError") // $ bbStep='CallExpr : successor -> 0(+4)' } catch { - print("Unknown error \(error)") // $ noCfg + print("Unknown error \(error)") // $ bbStep='CallExpr : successor -> 0(+2)' } return 0 } @@ -395,7 +395,7 @@ class Derived : C { // $ nonSimple='ClassLikeDeclaration -V Derived -^ BaseType func doWithoutCatch(x : Int) throws -> Int { do { - try mightThrow(x: 0) + try mightThrow(x: 0) // $ bbStep='CallExpr : successor -> try(+0)' print("Did not throw.") try! mightThrow(x: 0) print("Still did not throw.") From 02669d3d91fce5240ec782f92e905cc09bc082fc Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Wed, 16 Sep 2026 14:08:04 +0200 Subject: [PATCH 1057/2098] Unified: Minor style tweak for plugin import. --- unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll | 5 ++++- .../lib/codeql/unified/internal/dataflow/DataFlowPlugin.qll | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll b/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll index 809172854b3a..b65ee16542fb 100644 --- a/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll +++ b/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll @@ -1,6 +1,9 @@ private import unified private import codeql.util.Unit -private import codeql.unified.internal.NameBindingPluginSwift // ensure overrides are seen + +private module Plugins { + private import codeql.unified.internal.NameBindingPluginSwift +} /** Extension point for language-specific inputs to name binding. */ class NameBindingPlugin extends Unit { diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowPlugin.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowPlugin.qll index 7bf02b5a7524..01b480e5af74 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowPlugin.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowPlugin.qll @@ -5,7 +5,10 @@ private import unified private import AllDataFlow private import codeql.util.Unit -private import DataFlowPluginSwift // ensure overrides are seen + +private module Plugins { + private import DataFlowPluginSwift +} class DataFlowPlugin extends Unit { /** Holds if there is a language-specific step from `node1 -> step -> node2`. */ From dcda06a87bd55308dd75bab4584f59904da0d6b8 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Wed, 16 Sep 2026 13:38:52 +0100 Subject: [PATCH 1058/2098] C++: Add a testcase that uses a hardcoded constructed type. --- .../dataflow/external-models/flow.expected | 263 ++++++++++-------- .../dataflow/external-models/flow.ext.yml | 1 + .../dataflow/external-models/sinks.expected | 17 +- .../dataflow/external-models/sources.expected | 11 +- .../dataflow/external-models/test.cpp | 9 + 5 files changed, 166 insertions(+), 135 deletions(-) diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index 60638e39b726..176524aff75d 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -359,67 +359,76 @@ edges | test.cpp:345:38:345:40 | arg | test.cpp:346:5:346:18 | ... = ... | provenance | | | test.cpp:346:5:346:8 | *this [post update] [ul] | test.cpp:345:3:345:22 | *this [Return] [ul] | provenance | | | test.cpp:346:5:346:18 | ... = ... | test.cpp:346:5:346:8 | *this [post update] [ul] | provenance | | -| test.cpp:361:15:361:23 | call to ymlSource | test.cpp:361:15:361:25 | call to ymlSource | provenance | Src:MaD:48 | -| test.cpp:361:15:361:25 | call to ymlSource | test.cpp:362:15:362:15 | *x | provenance | | -| test.cpp:362:5:362:5 | forward output argument [s] | test.cpp:364:30:364:30 | *f [s] | provenance | | -| test.cpp:362:15:362:15 | *x | test.cpp:341:30:341:32 | arg | provenance | | -| test.cpp:362:15:362:15 | *x | test.cpp:362:5:362:5 | forward output argument [s] | provenance | | -| test.cpp:364:30:364:30 | *f [s] | test.cpp:364:32:364:34 | call to get [s] | provenance | MaD:88 | -| test.cpp:364:32:364:34 | call to get [s] | test.cpp:364:32:364:34 | call to get [s] | provenance | | -| test.cpp:364:32:364:34 | call to get [s] | test.cpp:365:13:365:13 | *c [s] | provenance | | -| test.cpp:365:13:365:13 | *c [s] | test.cpp:365:13:365:15 | s | provenance | | -| test.cpp:365:13:365:13 | *c [s] | test.cpp:365:15:365:15 | s | provenance | Sink:MaD:3 | -| test.cpp:365:13:365:15 | s | test.cpp:365:15:365:15 | s | provenance | Sink:MaD:3 | -| test.cpp:370:24:370:32 | call to ymlSource | test.cpp:370:24:370:34 | call to ymlSource | provenance | Src:MaD:48 | -| test.cpp:370:24:370:34 | call to ymlSource | test.cpp:371:15:371:16 | *ul | provenance | | -| test.cpp:371:5:371:5 | forward output argument [ul] | test.cpp:373:30:373:30 | *f [ul] | provenance | | -| test.cpp:371:15:371:16 | *ul | test.cpp:345:38:345:40 | arg | provenance | | -| test.cpp:371:15:371:16 | *ul | test.cpp:371:5:371:5 | forward output argument [ul] | provenance | | -| test.cpp:373:30:373:30 | *f [ul] | test.cpp:373:32:373:34 | call to get [ul] | provenance | MaD:88 | -| test.cpp:373:32:373:34 | call to get [ul] | test.cpp:373:32:373:34 | call to get [ul] | provenance | | -| test.cpp:373:32:373:34 | call to get [ul] | test.cpp:375:13:375:13 | *c [ul] | provenance | | -| test.cpp:375:13:375:13 | *c [ul] | test.cpp:375:13:375:16 | ul | provenance | | -| test.cpp:375:13:375:13 | *c [ul] | test.cpp:375:15:375:16 | ul | provenance | Sink:MaD:3 | -| test.cpp:375:13:375:16 | ul | test.cpp:375:15:375:16 | ul | provenance | Sink:MaD:3 | -| test.cpp:394:11:394:19 | call to ymlSource | test.cpp:394:11:394:19 | call to ymlSource | provenance | Src:MaD:48 | -| test.cpp:394:11:394:19 | call to ymlSource | test.cpp:395:16:395:16 | *x | provenance | | -| test.cpp:395:3:395:3 | emplace output argument [element, x] | test.cpp:397:15:397:15 | *c [element, x] | provenance | | -| test.cpp:395:16:395:16 | *x | test.cpp:395:3:395:3 | emplace output argument [element, x] | provenance | | -| test.cpp:397:15:397:15 | *c [element, x] | test.cpp:397:20:397:22 | call to get [x] | provenance | MaD:87 | -| test.cpp:397:20:397:22 | call to get [x] | test.cpp:397:20:397:22 | call to get [x] | provenance | | -| test.cpp:397:20:397:22 | call to get [x] | test.cpp:398:11:398:11 | *e [x] | provenance | | +| test.cpp:362:15:362:23 | call to ymlSource | test.cpp:362:15:362:25 | call to ymlSource | provenance | Src:MaD:48 | +| test.cpp:362:15:362:25 | call to ymlSource | test.cpp:363:15:363:15 | *x | provenance | | +| test.cpp:363:5:363:5 | forward output argument [s] | test.cpp:365:30:365:30 | *f [s] | provenance | | +| test.cpp:363:15:363:15 | *x | test.cpp:341:30:341:32 | arg | provenance | | +| test.cpp:363:15:363:15 | *x | test.cpp:363:5:363:5 | forward output argument [s] | provenance | | +| test.cpp:365:30:365:30 | *f [s] | test.cpp:365:32:365:34 | call to get [s] | provenance | MaD:88 | +| test.cpp:365:32:365:34 | call to get [s] | test.cpp:365:32:365:34 | call to get [s] | provenance | | +| test.cpp:365:32:365:34 | call to get [s] | test.cpp:366:13:366:13 | *c [s] | provenance | | +| test.cpp:366:13:366:13 | *c [s] | test.cpp:366:13:366:15 | s | provenance | | +| test.cpp:366:13:366:13 | *c [s] | test.cpp:366:15:366:15 | s | provenance | Sink:MaD:3 | +| test.cpp:366:13:366:15 | s | test.cpp:366:15:366:15 | s | provenance | Sink:MaD:3 | +| test.cpp:371:24:371:32 | call to ymlSource | test.cpp:371:24:371:34 | call to ymlSource | provenance | Src:MaD:48 | +| test.cpp:371:24:371:34 | call to ymlSource | test.cpp:372:15:372:16 | *ul | provenance | | +| test.cpp:372:5:372:5 | forward output argument [ul] | test.cpp:374:30:374:30 | *f [ul] | provenance | | +| test.cpp:372:15:372:16 | *ul | test.cpp:345:38:345:40 | arg | provenance | | +| test.cpp:372:15:372:16 | *ul | test.cpp:372:5:372:5 | forward output argument [ul] | provenance | | +| test.cpp:374:30:374:30 | *f [ul] | test.cpp:374:32:374:34 | call to get [ul] | provenance | MaD:88 | +| test.cpp:374:32:374:34 | call to get [ul] | test.cpp:374:32:374:34 | call to get [ul] | provenance | | +| test.cpp:374:32:374:34 | call to get [ul] | test.cpp:376:13:376:13 | *c [ul] | provenance | | +| test.cpp:376:13:376:13 | *c [ul] | test.cpp:376:13:376:16 | ul | provenance | | +| test.cpp:376:13:376:13 | *c [ul] | test.cpp:376:15:376:16 | ul | provenance | Sink:MaD:3 | +| test.cpp:376:13:376:16 | ul | test.cpp:376:15:376:16 | ul | provenance | Sink:MaD:3 | +| test.cpp:395:11:395:19 | call to ymlSource | test.cpp:395:11:395:19 | call to ymlSource | provenance | Src:MaD:48 | +| test.cpp:395:11:395:19 | call to ymlSource | test.cpp:396:22:396:22 | x | provenance | | +| test.cpp:396:3:396:3 | forwardToElement output argument [x] | test.cpp:397:15:397:15 | *f [x] | provenance | | +| test.cpp:396:22:396:22 | x | test.cpp:396:3:396:3 | forwardToElement output argument [x] | provenance | | +| test.cpp:397:15:397:15 | *f [x] | test.cpp:397:17:397:19 | call to get [x] | provenance | MaD:88 | +| test.cpp:397:17:397:19 | call to get [x] | test.cpp:397:17:397:19 | call to get [x] | provenance | | +| test.cpp:397:17:397:19 | call to get [x] | test.cpp:398:11:398:11 | *e [x] | provenance | | | test.cpp:398:11:398:11 | *e [x] | test.cpp:398:13:398:13 | x | provenance | | | test.cpp:398:13:398:13 | x | test.cpp:398:13:398:13 | x | provenance | Sink:MaD:3 | -| test.cpp:408:11:408:19 | call to ymlSource | test.cpp:408:11:408:19 | call to ymlSource | provenance | Src:MaD:48 | -| test.cpp:408:11:408:19 | call to ymlSource | test.cpp:409:16:409:16 | *x | provenance | | -| test.cpp:409:3:409:3 | emplace output argument [element, x] | test.cpp:411:34:411:34 | *c [element, x] | provenance | | -| test.cpp:409:16:409:16 | *x | test.cpp:409:3:409:3 | emplace output argument [element, x] | provenance | | -| test.cpp:411:34:411:34 | *c [element, x] | test.cpp:411:39:411:41 | call to get [x] | provenance | MaD:87 | -| test.cpp:411:39:411:41 | call to get [x] | test.cpp:411:39:411:41 | call to get [x] | provenance | | -| test.cpp:411:39:411:41 | call to get [x] | test.cpp:412:11:412:11 | *e [x] | provenance | | -| test.cpp:412:11:412:11 | *e [x] | test.cpp:412:13:412:13 | x | provenance | | -| test.cpp:412:13:412:13 | x | test.cpp:412:13:412:13 | x | provenance | Sink:MaD:3 | -| test.cpp:417:3:417:28 | *ElementWithOverloadedArity [post update] [x] | test.cpp:417:3:417:28 | *this [Return] [x] | provenance | | -| test.cpp:417:34:417:38 | first | test.cpp:417:45:417:49 | first | provenance | | -| test.cpp:417:45:417:49 | first | test.cpp:417:3:417:28 | *ElementWithOverloadedArity [post update] [x] | provenance | | -| test.cpp:418:3:418:28 | *ElementWithOverloadedArity [post update] [x] | test.cpp:418:3:418:28 | *this [Return] [x] | provenance | | -| test.cpp:418:39:418:44 | second | test.cpp:418:51:418:56 | second | provenance | | -| test.cpp:418:51:418:56 | second | test.cpp:418:3:418:28 | *ElementWithOverloadedArity [post update] [x] | provenance | | -| test.cpp:422:11:422:19 | call to ymlSource | test.cpp:422:11:422:19 | call to ymlSource | provenance | Src:MaD:48 | -| test.cpp:422:11:422:19 | call to ymlSource | test.cpp:425:18:425:18 | *x | provenance | | -| test.cpp:422:11:422:19 | call to ymlSource | test.cpp:435:21:435:21 | *x | provenance | | -| test.cpp:425:5:425:5 | emplace output argument [element, x] | test.cpp:426:13:426:13 | *c [element, x] | provenance | | -| test.cpp:425:18:425:18 | *x | test.cpp:417:34:417:38 | first | provenance | | -| test.cpp:425:18:425:18 | *x | test.cpp:425:5:425:5 | emplace output argument [element, x] | provenance | | -| test.cpp:426:13:426:13 | *c [element, x] | test.cpp:426:18:426:20 | *call to get [x] | provenance | MaD:87 | -| test.cpp:426:18:426:20 | *call to get [x] | test.cpp:426:21:426:21 | x | provenance | | -| test.cpp:426:21:426:21 | x | test.cpp:426:21:426:21 | x | provenance | Sink:MaD:3 | -| test.cpp:435:5:435:5 | emplace output argument [element, x] | test.cpp:436:13:436:13 | *c [element, x] | provenance | | -| test.cpp:435:21:435:21 | *x | test.cpp:418:39:418:44 | second | provenance | | -| test.cpp:435:21:435:21 | *x | test.cpp:435:5:435:5 | emplace output argument [element, x] | provenance | | -| test.cpp:436:13:436:13 | *c [element, x] | test.cpp:436:18:436:20 | *call to get [x] | provenance | MaD:87 | -| test.cpp:436:18:436:20 | *call to get [x] | test.cpp:436:21:436:21 | x | provenance | | -| test.cpp:436:21:436:21 | x | test.cpp:436:21:436:21 | x | provenance | Sink:MaD:3 | +| test.cpp:403:11:403:19 | call to ymlSource | test.cpp:403:11:403:19 | call to ymlSource | provenance | Src:MaD:48 | +| test.cpp:403:11:403:19 | call to ymlSource | test.cpp:404:16:404:16 | *x | provenance | | +| test.cpp:404:3:404:3 | emplace output argument [element, x] | test.cpp:406:15:406:15 | *c [element, x] | provenance | | +| test.cpp:404:16:404:16 | *x | test.cpp:404:3:404:3 | emplace output argument [element, x] | provenance | | +| test.cpp:406:15:406:15 | *c [element, x] | test.cpp:406:20:406:22 | call to get [x] | provenance | MaD:87 | +| test.cpp:406:20:406:22 | call to get [x] | test.cpp:406:20:406:22 | call to get [x] | provenance | | +| test.cpp:406:20:406:22 | call to get [x] | test.cpp:407:11:407:11 | *e [x] | provenance | | +| test.cpp:407:11:407:11 | *e [x] | test.cpp:407:13:407:13 | x | provenance | | +| test.cpp:407:13:407:13 | x | test.cpp:407:13:407:13 | x | provenance | Sink:MaD:3 | +| test.cpp:417:11:417:19 | call to ymlSource | test.cpp:417:11:417:19 | call to ymlSource | provenance | Src:MaD:48 | +| test.cpp:417:11:417:19 | call to ymlSource | test.cpp:418:16:418:16 | *x | provenance | | +| test.cpp:418:3:418:3 | emplace output argument [element, x] | test.cpp:420:34:420:34 | *c [element, x] | provenance | | +| test.cpp:418:16:418:16 | *x | test.cpp:418:3:418:3 | emplace output argument [element, x] | provenance | | +| test.cpp:420:34:420:34 | *c [element, x] | test.cpp:420:39:420:41 | call to get [x] | provenance | MaD:87 | +| test.cpp:420:39:420:41 | call to get [x] | test.cpp:420:39:420:41 | call to get [x] | provenance | | +| test.cpp:420:39:420:41 | call to get [x] | test.cpp:421:11:421:11 | *e [x] | provenance | | +| test.cpp:421:11:421:11 | *e [x] | test.cpp:421:13:421:13 | x | provenance | | +| test.cpp:421:13:421:13 | x | test.cpp:421:13:421:13 | x | provenance | Sink:MaD:3 | +| test.cpp:426:3:426:28 | *ElementWithOverloadedArity [post update] [x] | test.cpp:426:3:426:28 | *this [Return] [x] | provenance | | +| test.cpp:426:34:426:38 | first | test.cpp:426:45:426:49 | first | provenance | | +| test.cpp:426:45:426:49 | first | test.cpp:426:3:426:28 | *ElementWithOverloadedArity [post update] [x] | provenance | | +| test.cpp:427:3:427:28 | *ElementWithOverloadedArity [post update] [x] | test.cpp:427:3:427:28 | *this [Return] [x] | provenance | | +| test.cpp:427:39:427:44 | second | test.cpp:427:51:427:56 | second | provenance | | +| test.cpp:427:51:427:56 | second | test.cpp:427:3:427:28 | *ElementWithOverloadedArity [post update] [x] | provenance | | +| test.cpp:431:11:431:19 | call to ymlSource | test.cpp:431:11:431:19 | call to ymlSource | provenance | Src:MaD:48 | +| test.cpp:431:11:431:19 | call to ymlSource | test.cpp:434:18:434:18 | *x | provenance | | +| test.cpp:431:11:431:19 | call to ymlSource | test.cpp:444:21:444:21 | *x | provenance | | +| test.cpp:434:5:434:5 | emplace output argument [element, x] | test.cpp:435:13:435:13 | *c [element, x] | provenance | | +| test.cpp:434:18:434:18 | *x | test.cpp:426:34:426:38 | first | provenance | | +| test.cpp:434:18:434:18 | *x | test.cpp:434:5:434:5 | emplace output argument [element, x] | provenance | | +| test.cpp:435:13:435:13 | *c [element, x] | test.cpp:435:18:435:20 | *call to get [x] | provenance | MaD:87 | +| test.cpp:435:18:435:20 | *call to get [x] | test.cpp:435:21:435:21 | x | provenance | | +| test.cpp:435:21:435:21 | x | test.cpp:435:21:435:21 | x | provenance | Sink:MaD:3 | +| test.cpp:444:5:444:5 | emplace output argument [element, x] | test.cpp:445:13:445:13 | *c [element, x] | provenance | | +| test.cpp:444:21:444:21 | *x | test.cpp:427:39:427:44 | second | provenance | | +| test.cpp:444:21:444:21 | *x | test.cpp:444:5:444:5 | emplace output argument [element, x] | provenance | | +| test.cpp:445:13:445:13 | *c [element, x] | test.cpp:445:18:445:20 | *call to get [x] | provenance | MaD:87 | +| test.cpp:445:18:445:20 | *call to get [x] | test.cpp:445:21:445:21 | x | provenance | | +| test.cpp:445:21:445:21 | x | test.cpp:445:21:445:21 | x | provenance | Sink:MaD:3 | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:24:8:24:11 | * ... | provenance | | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:27:36:27:38 | *cmd | provenance | | | windows.cpp:22:15:22:29 | call to GetCommandLineA | windows.cpp:22:15:22:29 | *call to GetCommandLineA | provenance | Src:MaD:5 | @@ -888,68 +897,78 @@ nodes | test.cpp:345:38:345:40 | arg | semmle.label | arg | | test.cpp:346:5:346:8 | *this [post update] [ul] | semmle.label | *this [post update] [ul] | | test.cpp:346:5:346:18 | ... = ... | semmle.label | ... = ... | -| test.cpp:361:15:361:23 | call to ymlSource | semmle.label | call to ymlSource | -| test.cpp:361:15:361:25 | call to ymlSource | semmle.label | call to ymlSource | -| test.cpp:362:5:362:5 | forward output argument [s] | semmle.label | forward output argument [s] | -| test.cpp:362:15:362:15 | *x | semmle.label | *x | -| test.cpp:364:30:364:30 | *f [s] | semmle.label | *f [s] | -| test.cpp:364:32:364:34 | call to get [s] | semmle.label | call to get [s] | -| test.cpp:364:32:364:34 | call to get [s] | semmle.label | call to get [s] | -| test.cpp:365:13:365:13 | *c [s] | semmle.label | *c [s] | -| test.cpp:365:13:365:15 | s | semmle.label | s | -| test.cpp:365:15:365:15 | s | semmle.label | s | -| test.cpp:370:24:370:32 | call to ymlSource | semmle.label | call to ymlSource | -| test.cpp:370:24:370:34 | call to ymlSource | semmle.label | call to ymlSource | -| test.cpp:371:5:371:5 | forward output argument [ul] | semmle.label | forward output argument [ul] | -| test.cpp:371:15:371:16 | *ul | semmle.label | *ul | -| test.cpp:373:30:373:30 | *f [ul] | semmle.label | *f [ul] | -| test.cpp:373:32:373:34 | call to get [ul] | semmle.label | call to get [ul] | -| test.cpp:373:32:373:34 | call to get [ul] | semmle.label | call to get [ul] | -| test.cpp:375:13:375:13 | *c [ul] | semmle.label | *c [ul] | -| test.cpp:375:13:375:16 | ul | semmle.label | ul | -| test.cpp:375:15:375:16 | ul | semmle.label | ul | -| test.cpp:394:11:394:19 | call to ymlSource | semmle.label | call to ymlSource | -| test.cpp:394:11:394:19 | call to ymlSource | semmle.label | call to ymlSource | -| test.cpp:395:3:395:3 | emplace output argument [element, x] | semmle.label | emplace output argument [element, x] | -| test.cpp:395:16:395:16 | *x | semmle.label | *x | -| test.cpp:397:15:397:15 | *c [element, x] | semmle.label | *c [element, x] | -| test.cpp:397:20:397:22 | call to get [x] | semmle.label | call to get [x] | -| test.cpp:397:20:397:22 | call to get [x] | semmle.label | call to get [x] | +| test.cpp:362:15:362:23 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:362:15:362:25 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:363:5:363:5 | forward output argument [s] | semmle.label | forward output argument [s] | +| test.cpp:363:15:363:15 | *x | semmle.label | *x | +| test.cpp:365:30:365:30 | *f [s] | semmle.label | *f [s] | +| test.cpp:365:32:365:34 | call to get [s] | semmle.label | call to get [s] | +| test.cpp:365:32:365:34 | call to get [s] | semmle.label | call to get [s] | +| test.cpp:366:13:366:13 | *c [s] | semmle.label | *c [s] | +| test.cpp:366:13:366:15 | s | semmle.label | s | +| test.cpp:366:15:366:15 | s | semmle.label | s | +| test.cpp:371:24:371:32 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:371:24:371:34 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:372:5:372:5 | forward output argument [ul] | semmle.label | forward output argument [ul] | +| test.cpp:372:15:372:16 | *ul | semmle.label | *ul | +| test.cpp:374:30:374:30 | *f [ul] | semmle.label | *f [ul] | +| test.cpp:374:32:374:34 | call to get [ul] | semmle.label | call to get [ul] | +| test.cpp:374:32:374:34 | call to get [ul] | semmle.label | call to get [ul] | +| test.cpp:376:13:376:13 | *c [ul] | semmle.label | *c [ul] | +| test.cpp:376:13:376:16 | ul | semmle.label | ul | +| test.cpp:376:15:376:16 | ul | semmle.label | ul | +| test.cpp:395:11:395:19 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:395:11:395:19 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:396:3:396:3 | forwardToElement output argument [x] | semmle.label | forwardToElement output argument [x] | +| test.cpp:396:22:396:22 | x | semmle.label | x | +| test.cpp:397:15:397:15 | *f [x] | semmle.label | *f [x] | +| test.cpp:397:17:397:19 | call to get [x] | semmle.label | call to get [x] | +| test.cpp:397:17:397:19 | call to get [x] | semmle.label | call to get [x] | | test.cpp:398:11:398:11 | *e [x] | semmle.label | *e [x] | | test.cpp:398:13:398:13 | x | semmle.label | x | | test.cpp:398:13:398:13 | x | semmle.label | x | -| test.cpp:408:11:408:19 | call to ymlSource | semmle.label | call to ymlSource | -| test.cpp:408:11:408:19 | call to ymlSource | semmle.label | call to ymlSource | -| test.cpp:409:3:409:3 | emplace output argument [element, x] | semmle.label | emplace output argument [element, x] | -| test.cpp:409:16:409:16 | *x | semmle.label | *x | -| test.cpp:411:34:411:34 | *c [element, x] | semmle.label | *c [element, x] | -| test.cpp:411:39:411:41 | call to get [x] | semmle.label | call to get [x] | -| test.cpp:411:39:411:41 | call to get [x] | semmle.label | call to get [x] | -| test.cpp:412:11:412:11 | *e [x] | semmle.label | *e [x] | -| test.cpp:412:13:412:13 | x | semmle.label | x | -| test.cpp:412:13:412:13 | x | semmle.label | x | -| test.cpp:417:3:417:28 | *ElementWithOverloadedArity [post update] [x] | semmle.label | *ElementWithOverloadedArity [post update] [x] | -| test.cpp:417:3:417:28 | *this [Return] [x] | semmle.label | *this [Return] [x] | -| test.cpp:417:34:417:38 | first | semmle.label | first | -| test.cpp:417:45:417:49 | first | semmle.label | first | -| test.cpp:418:3:418:28 | *ElementWithOverloadedArity [post update] [x] | semmle.label | *ElementWithOverloadedArity [post update] [x] | -| test.cpp:418:3:418:28 | *this [Return] [x] | semmle.label | *this [Return] [x] | -| test.cpp:418:39:418:44 | second | semmle.label | second | -| test.cpp:418:51:418:56 | second | semmle.label | second | -| test.cpp:422:11:422:19 | call to ymlSource | semmle.label | call to ymlSource | -| test.cpp:422:11:422:19 | call to ymlSource | semmle.label | call to ymlSource | -| test.cpp:425:5:425:5 | emplace output argument [element, x] | semmle.label | emplace output argument [element, x] | -| test.cpp:425:18:425:18 | *x | semmle.label | *x | -| test.cpp:426:13:426:13 | *c [element, x] | semmle.label | *c [element, x] | -| test.cpp:426:18:426:20 | *call to get [x] | semmle.label | *call to get [x] | -| test.cpp:426:21:426:21 | x | semmle.label | x | -| test.cpp:426:21:426:21 | x | semmle.label | x | -| test.cpp:435:5:435:5 | emplace output argument [element, x] | semmle.label | emplace output argument [element, x] | -| test.cpp:435:21:435:21 | *x | semmle.label | *x | -| test.cpp:436:13:436:13 | *c [element, x] | semmle.label | *c [element, x] | -| test.cpp:436:18:436:20 | *call to get [x] | semmle.label | *call to get [x] | -| test.cpp:436:21:436:21 | x | semmle.label | x | -| test.cpp:436:21:436:21 | x | semmle.label | x | +| test.cpp:403:11:403:19 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:403:11:403:19 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:404:3:404:3 | emplace output argument [element, x] | semmle.label | emplace output argument [element, x] | +| test.cpp:404:16:404:16 | *x | semmle.label | *x | +| test.cpp:406:15:406:15 | *c [element, x] | semmle.label | *c [element, x] | +| test.cpp:406:20:406:22 | call to get [x] | semmle.label | call to get [x] | +| test.cpp:406:20:406:22 | call to get [x] | semmle.label | call to get [x] | +| test.cpp:407:11:407:11 | *e [x] | semmle.label | *e [x] | +| test.cpp:407:13:407:13 | x | semmle.label | x | +| test.cpp:407:13:407:13 | x | semmle.label | x | +| test.cpp:417:11:417:19 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:417:11:417:19 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:418:3:418:3 | emplace output argument [element, x] | semmle.label | emplace output argument [element, x] | +| test.cpp:418:16:418:16 | *x | semmle.label | *x | +| test.cpp:420:34:420:34 | *c [element, x] | semmle.label | *c [element, x] | +| test.cpp:420:39:420:41 | call to get [x] | semmle.label | call to get [x] | +| test.cpp:420:39:420:41 | call to get [x] | semmle.label | call to get [x] | +| test.cpp:421:11:421:11 | *e [x] | semmle.label | *e [x] | +| test.cpp:421:13:421:13 | x | semmle.label | x | +| test.cpp:421:13:421:13 | x | semmle.label | x | +| test.cpp:426:3:426:28 | *ElementWithOverloadedArity [post update] [x] | semmle.label | *ElementWithOverloadedArity [post update] [x] | +| test.cpp:426:3:426:28 | *this [Return] [x] | semmle.label | *this [Return] [x] | +| test.cpp:426:34:426:38 | first | semmle.label | first | +| test.cpp:426:45:426:49 | first | semmle.label | first | +| test.cpp:427:3:427:28 | *ElementWithOverloadedArity [post update] [x] | semmle.label | *ElementWithOverloadedArity [post update] [x] | +| test.cpp:427:3:427:28 | *this [Return] [x] | semmle.label | *this [Return] [x] | +| test.cpp:427:39:427:44 | second | semmle.label | second | +| test.cpp:427:51:427:56 | second | semmle.label | second | +| test.cpp:431:11:431:19 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:431:11:431:19 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:434:5:434:5 | emplace output argument [element, x] | semmle.label | emplace output argument [element, x] | +| test.cpp:434:18:434:18 | *x | semmle.label | *x | +| test.cpp:435:13:435:13 | *c [element, x] | semmle.label | *c [element, x] | +| test.cpp:435:18:435:20 | *call to get [x] | semmle.label | *call to get [x] | +| test.cpp:435:21:435:21 | x | semmle.label | x | +| test.cpp:435:21:435:21 | x | semmle.label | x | +| test.cpp:444:5:444:5 | emplace output argument [element, x] | semmle.label | emplace output argument [element, x] | +| test.cpp:444:21:444:21 | *x | semmle.label | *x | +| test.cpp:445:13:445:13 | *c [element, x] | semmle.label | *c [element, x] | +| test.cpp:445:18:445:20 | *call to get [x] | semmle.label | *call to get [x] | +| test.cpp:445:21:445:21 | x | semmle.label | x | +| test.cpp:445:21:445:21 | x | semmle.label | x | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | semmle.label | *call to GetCommandLineA | | windows.cpp:22:15:22:29 | call to GetCommandLineA | semmle.label | call to GetCommandLineA | | windows.cpp:24:8:24:11 | * ... | semmle.label | * ... | @@ -1171,8 +1190,8 @@ nodes subpaths | test.cpp:32:41:32:41 | x | test.cpp:7:47:7:52 | value2 | test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | | test.cpp:172:51:172:51 | x | test.cpp:164:34:164:34 | x | test.cpp:164:7:164:7 | *templateFunction3 | test.cpp:172:13:172:44 | call to templateFunction3 | -| test.cpp:362:15:362:15 | *x | test.cpp:341:30:341:32 | arg | test.cpp:341:3:341:22 | *this [Return] [s] | test.cpp:362:5:362:5 | forward output argument [s] | -| test.cpp:371:15:371:16 | *ul | test.cpp:345:38:345:40 | arg | test.cpp:345:3:345:22 | *this [Return] [ul] | test.cpp:371:5:371:5 | forward output argument [ul] | -| test.cpp:425:18:425:18 | *x | test.cpp:417:34:417:38 | first | test.cpp:417:3:417:28 | *this [Return] [x] | test.cpp:425:5:425:5 | emplace output argument [element, x] | -| test.cpp:435:21:435:21 | *x | test.cpp:418:39:418:44 | second | test.cpp:418:3:418:28 | *this [Return] [x] | test.cpp:435:5:435:5 | emplace output argument [element, x] | +| test.cpp:363:15:363:15 | *x | test.cpp:341:30:341:32 | arg | test.cpp:341:3:341:22 | *this [Return] [s] | test.cpp:363:5:363:5 | forward output argument [s] | +| test.cpp:372:15:372:16 | *ul | test.cpp:345:38:345:40 | arg | test.cpp:345:3:345:22 | *this [Return] [ul] | test.cpp:372:5:372:5 | forward output argument [ul] | +| test.cpp:434:18:434:18 | *x | test.cpp:426:34:426:38 | first | test.cpp:426:3:426:28 | *this [Return] [x] | test.cpp:434:5:434:5 | emplace output argument [element, x] | +| test.cpp:444:21:444:21 | *x | test.cpp:427:39:427:44 | second | test.cpp:427:3:427:28 | *this [Return] [x] | test.cpp:444:5:444:5 | emplace output argument [element, x] | testFailures diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml b/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml index 735bcaa320ed..954b6d1c2b41 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml @@ -51,4 +51,5 @@ extensions: extensible: forwardsModel data: # namespace, type, subtypes, name, signature, ext, start, constructor, output, provenance - ["", "Forwarder", True, "forward", "(Args &&)", "", "0", "T", "Argument[-1]", "manual"] + - ["", "Forwarder", True, "forwardToElement", "(int)", "", "0", "Element", "Argument[-1]", "manual"] - ["", "Container", True, "emplace", "(int,Args &&)", "", "1", "T", "Argument[-1].Element", "manual"] diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected index 6db6de3fc398..1fa77e37ed66 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected @@ -43,12 +43,13 @@ | test.cpp:331:10:331:19 | * ... | test-sink | | test.cpp:333:15:333:20 | source | test-sink | | test.cpp:334:10:334:16 | * ... | test-sink | -| test.cpp:365:15:365:15 | s | test-sink | -| test.cpp:366:15:366:16 | ul | test-sink | -| test.cpp:374:15:374:15 | s | test-sink | -| test.cpp:375:15:375:16 | ul | test-sink | +| test.cpp:366:15:366:15 | s | test-sink | +| test.cpp:367:15:367:16 | ul | test-sink | +| test.cpp:375:15:375:15 | s | test-sink | +| test.cpp:376:15:376:16 | ul | test-sink | | test.cpp:398:13:398:13 | x | test-sink | -| test.cpp:412:13:412:13 | x | test-sink | -| test.cpp:426:21:426:21 | x | test-sink | -| test.cpp:431:21:431:21 | x | test-sink | -| test.cpp:436:21:436:21 | x | test-sink | +| test.cpp:407:13:407:13 | x | test-sink | +| test.cpp:421:13:421:13 | x | test-sink | +| test.cpp:435:21:435:21 | x | test-sink | +| test.cpp:440:21:440:21 | x | test-sink | +| test.cpp:445:21:445:21 | x | test-sink | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected index bf4dd9810df4..d17a4c6b2c21 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected @@ -19,11 +19,12 @@ | test.cpp:222:10:222:18 | call to ymlSource | local | | test.cpp:297:33:297:41 | call to ymlSource | local | | test.cpp:317:51:317:59 | call to ymlSource | local | -| test.cpp:361:15:361:23 | call to ymlSource | local | -| test.cpp:370:24:370:32 | call to ymlSource | local | -| test.cpp:394:11:394:19 | call to ymlSource | local | -| test.cpp:408:11:408:19 | call to ymlSource | local | -| test.cpp:422:11:422:19 | call to ymlSource | local | +| test.cpp:362:15:362:23 | call to ymlSource | local | +| test.cpp:371:24:371:32 | call to ymlSource | local | +| test.cpp:395:11:395:19 | call to ymlSource | local | +| test.cpp:403:11:403:19 | call to ymlSource | local | +| test.cpp:417:11:417:19 | call to ymlSource | local | +| test.cpp:431:11:431:19 | call to ymlSource | local | | windows.cpp:22:15:22:29 | call to GetCommandLineA | local | | windows.cpp:34:17:34:38 | call to GetEnvironmentStringsA | local | | windows.cpp:39:36:39:38 | GetEnvironmentVariableA output argument | local | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp index 4bcfeb64473a..8f5383b79b4f 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp @@ -351,6 +351,7 @@ template struct Forwarder { template void forward(Args&&... args); + void forwardToElement(int arg); T get(); }; @@ -389,6 +390,14 @@ struct Element { Element(int); }; +void forward_test_named_constructor() { + Forwarder f; + int x = ymlSource(); + f.forwardToElement(x); + Element e = f.get(); + ymlSink(e.x); // $ ir +} + void forward_test_model() { Container c; int x = ymlSource(); From f3811194c43cca9d2356efbd04315713feac24a0 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Wed, 16 Sep 2026 13:45:32 +0100 Subject: [PATCH 1059/2098] C++: Expand QLDoc. --- cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll index 224094543dce..0f3a69b680c1 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll @@ -1127,7 +1127,11 @@ private predicate interpretForwardsModel( ) } -/** Holds if `forwarder` forwards its arguments starting at `start` to `constructor`. */ +/** + * Holds if `forwarder` may forward its arguments starting at `start` to `constructor`. The + * actual constructor being forwarded to depends on the types of arguments from `start` + * at calls to `forwarder`. + */ predicate forwards(Function forwarder, Constructor constructor, int start) { interpretForwardsModel(forwarder, constructor, start, _, _, _) } From a182dcfd3285c4e4a9b4a733389d0b6a291d74ad Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Wed, 16 Sep 2026 14:46:17 +0200 Subject: [PATCH 1060/2098] Rust: Take `!` types into account in consistency check --- .../rust/internal/typeinference/TypeInferenceConsistency.qll | 1 + 1 file changed, 1 insertion(+) diff --git a/rust/ql/lib/codeql/rust/internal/typeinference/TypeInferenceConsistency.qll b/rust/ql/lib/codeql/rust/internal/typeinference/TypeInferenceConsistency.qll index d21caec86513..6aff8c2ad531 100644 --- a/rust/ql/lib/codeql/rust/internal/typeinference/TypeInferenceConsistency.qll +++ b/rust/ql/lib/codeql/rust/internal/typeinference/TypeInferenceConsistency.qll @@ -11,6 +11,7 @@ import TypeInference::Consistency query predicate illFormedTypeMention(TypeMention tm) { Consistency::illFormedTypeMention(tm) and + not tm instanceof NeverTypeReprMention and // avoid overlap with `PathTypeMention` not tm instanceof PathTypeReprMention and // known limitation for type mentions that would mention an escaping type parameter From 8149caa857f8fdb89892c71e16b276568115059b Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Wed, 16 Sep 2026 13:48:40 +0100 Subject: [PATCH 1061/2098] C++: Add a testcase that uses type parameters in the function name for forwarding. --- .../dataflow/external-models/flow.expected | 209 ++++++++++-------- .../dataflow/external-models/flow.ext.yml | 1 + .../dataflow/external-models/sinks.expected | 11 +- .../dataflow/external-models/sources.expected | 9 +- .../dataflow/external-models/test.cpp | 9 + 5 files changed, 133 insertions(+), 106 deletions(-) diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index 176524aff75d..ca8ed7efb314 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -381,54 +381,61 @@ edges | test.cpp:376:13:376:13 | *c [ul] | test.cpp:376:13:376:16 | ul | provenance | | | test.cpp:376:13:376:13 | *c [ul] | test.cpp:376:15:376:16 | ul | provenance | Sink:MaD:3 | | test.cpp:376:13:376:16 | ul | test.cpp:376:15:376:16 | ul | provenance | Sink:MaD:3 | -| test.cpp:395:11:395:19 | call to ymlSource | test.cpp:395:11:395:19 | call to ymlSource | provenance | Src:MaD:48 | -| test.cpp:395:11:395:19 | call to ymlSource | test.cpp:396:22:396:22 | x | provenance | | -| test.cpp:396:3:396:3 | forwardToElement output argument [x] | test.cpp:397:15:397:15 | *f [x] | provenance | | -| test.cpp:396:22:396:22 | x | test.cpp:396:3:396:3 | forwardToElement output argument [x] | provenance | | -| test.cpp:397:15:397:15 | *f [x] | test.cpp:397:17:397:19 | call to get [x] | provenance | MaD:88 | -| test.cpp:397:17:397:19 | call to get [x] | test.cpp:397:17:397:19 | call to get [x] | provenance | | -| test.cpp:397:17:397:19 | call to get [x] | test.cpp:398:11:398:11 | *e [x] | provenance | | -| test.cpp:398:11:398:11 | *e [x] | test.cpp:398:13:398:13 | x | provenance | | -| test.cpp:398:13:398:13 | x | test.cpp:398:13:398:13 | x | provenance | Sink:MaD:3 | -| test.cpp:403:11:403:19 | call to ymlSource | test.cpp:403:11:403:19 | call to ymlSource | provenance | Src:MaD:48 | -| test.cpp:403:11:403:19 | call to ymlSource | test.cpp:404:16:404:16 | *x | provenance | | -| test.cpp:404:3:404:3 | emplace output argument [element, x] | test.cpp:406:15:406:15 | *c [element, x] | provenance | | -| test.cpp:404:16:404:16 | *x | test.cpp:404:3:404:3 | emplace output argument [element, x] | provenance | | -| test.cpp:406:15:406:15 | *c [element, x] | test.cpp:406:20:406:22 | call to get [x] | provenance | MaD:87 | -| test.cpp:406:20:406:22 | call to get [x] | test.cpp:406:20:406:22 | call to get [x] | provenance | | -| test.cpp:406:20:406:22 | call to get [x] | test.cpp:407:11:407:11 | *e [x] | provenance | | +| test.cpp:397:11:397:19 | call to ymlSource | test.cpp:397:11:397:19 | call to ymlSource | provenance | Src:MaD:48 | +| test.cpp:397:11:397:19 | call to ymlSource | test.cpp:398:38:398:38 | x | provenance | | +| test.cpp:398:15:398:36 | call to makeForwarded [x] | test.cpp:398:15:398:36 | call to makeForwarded [x] | provenance | | +| test.cpp:398:15:398:36 | call to makeForwarded [x] | test.cpp:399:11:399:11 | *e [x] | provenance | | +| test.cpp:398:38:398:38 | x | test.cpp:398:15:398:36 | call to makeForwarded [x] | provenance | | +| test.cpp:399:11:399:11 | *e [x] | test.cpp:399:13:399:13 | x | provenance | | +| test.cpp:399:13:399:13 | x | test.cpp:399:13:399:13 | x | provenance | Sink:MaD:3 | +| test.cpp:404:11:404:19 | call to ymlSource | test.cpp:404:11:404:19 | call to ymlSource | provenance | Src:MaD:48 | +| test.cpp:404:11:404:19 | call to ymlSource | test.cpp:405:22:405:22 | x | provenance | | +| test.cpp:405:3:405:3 | forwardToElement output argument [x] | test.cpp:406:15:406:15 | *f [x] | provenance | | +| test.cpp:405:22:405:22 | x | test.cpp:405:3:405:3 | forwardToElement output argument [x] | provenance | | +| test.cpp:406:15:406:15 | *f [x] | test.cpp:406:17:406:19 | call to get [x] | provenance | MaD:88 | +| test.cpp:406:17:406:19 | call to get [x] | test.cpp:406:17:406:19 | call to get [x] | provenance | | +| test.cpp:406:17:406:19 | call to get [x] | test.cpp:407:11:407:11 | *e [x] | provenance | | | test.cpp:407:11:407:11 | *e [x] | test.cpp:407:13:407:13 | x | provenance | | | test.cpp:407:13:407:13 | x | test.cpp:407:13:407:13 | x | provenance | Sink:MaD:3 | -| test.cpp:417:11:417:19 | call to ymlSource | test.cpp:417:11:417:19 | call to ymlSource | provenance | Src:MaD:48 | -| test.cpp:417:11:417:19 | call to ymlSource | test.cpp:418:16:418:16 | *x | provenance | | -| test.cpp:418:3:418:3 | emplace output argument [element, x] | test.cpp:420:34:420:34 | *c [element, x] | provenance | | -| test.cpp:418:16:418:16 | *x | test.cpp:418:3:418:3 | emplace output argument [element, x] | provenance | | -| test.cpp:420:34:420:34 | *c [element, x] | test.cpp:420:39:420:41 | call to get [x] | provenance | MaD:87 | -| test.cpp:420:39:420:41 | call to get [x] | test.cpp:420:39:420:41 | call to get [x] | provenance | | -| test.cpp:420:39:420:41 | call to get [x] | test.cpp:421:11:421:11 | *e [x] | provenance | | -| test.cpp:421:11:421:11 | *e [x] | test.cpp:421:13:421:13 | x | provenance | | -| test.cpp:421:13:421:13 | x | test.cpp:421:13:421:13 | x | provenance | Sink:MaD:3 | -| test.cpp:426:3:426:28 | *ElementWithOverloadedArity [post update] [x] | test.cpp:426:3:426:28 | *this [Return] [x] | provenance | | -| test.cpp:426:34:426:38 | first | test.cpp:426:45:426:49 | first | provenance | | -| test.cpp:426:45:426:49 | first | test.cpp:426:3:426:28 | *ElementWithOverloadedArity [post update] [x] | provenance | | -| test.cpp:427:3:427:28 | *ElementWithOverloadedArity [post update] [x] | test.cpp:427:3:427:28 | *this [Return] [x] | provenance | | -| test.cpp:427:39:427:44 | second | test.cpp:427:51:427:56 | second | provenance | | -| test.cpp:427:51:427:56 | second | test.cpp:427:3:427:28 | *ElementWithOverloadedArity [post update] [x] | provenance | | -| test.cpp:431:11:431:19 | call to ymlSource | test.cpp:431:11:431:19 | call to ymlSource | provenance | Src:MaD:48 | -| test.cpp:431:11:431:19 | call to ymlSource | test.cpp:434:18:434:18 | *x | provenance | | -| test.cpp:431:11:431:19 | call to ymlSource | test.cpp:444:21:444:21 | *x | provenance | | -| test.cpp:434:5:434:5 | emplace output argument [element, x] | test.cpp:435:13:435:13 | *c [element, x] | provenance | | -| test.cpp:434:18:434:18 | *x | test.cpp:426:34:426:38 | first | provenance | | -| test.cpp:434:18:434:18 | *x | test.cpp:434:5:434:5 | emplace output argument [element, x] | provenance | | -| test.cpp:435:13:435:13 | *c [element, x] | test.cpp:435:18:435:20 | *call to get [x] | provenance | MaD:87 | -| test.cpp:435:18:435:20 | *call to get [x] | test.cpp:435:21:435:21 | x | provenance | | -| test.cpp:435:21:435:21 | x | test.cpp:435:21:435:21 | x | provenance | Sink:MaD:3 | -| test.cpp:444:5:444:5 | emplace output argument [element, x] | test.cpp:445:13:445:13 | *c [element, x] | provenance | | -| test.cpp:444:21:444:21 | *x | test.cpp:427:39:427:44 | second | provenance | | -| test.cpp:444:21:444:21 | *x | test.cpp:444:5:444:5 | emplace output argument [element, x] | provenance | | -| test.cpp:445:13:445:13 | *c [element, x] | test.cpp:445:18:445:20 | *call to get [x] | provenance | MaD:87 | -| test.cpp:445:18:445:20 | *call to get [x] | test.cpp:445:21:445:21 | x | provenance | | -| test.cpp:445:21:445:21 | x | test.cpp:445:21:445:21 | x | provenance | Sink:MaD:3 | +| test.cpp:412:11:412:19 | call to ymlSource | test.cpp:412:11:412:19 | call to ymlSource | provenance | Src:MaD:48 | +| test.cpp:412:11:412:19 | call to ymlSource | test.cpp:413:16:413:16 | *x | provenance | | +| test.cpp:413:3:413:3 | emplace output argument [element, x] | test.cpp:415:15:415:15 | *c [element, x] | provenance | | +| test.cpp:413:16:413:16 | *x | test.cpp:413:3:413:3 | emplace output argument [element, x] | provenance | | +| test.cpp:415:15:415:15 | *c [element, x] | test.cpp:415:20:415:22 | call to get [x] | provenance | MaD:87 | +| test.cpp:415:20:415:22 | call to get [x] | test.cpp:415:20:415:22 | call to get [x] | provenance | | +| test.cpp:415:20:415:22 | call to get [x] | test.cpp:416:11:416:11 | *e [x] | provenance | | +| test.cpp:416:11:416:11 | *e [x] | test.cpp:416:13:416:13 | x | provenance | | +| test.cpp:416:13:416:13 | x | test.cpp:416:13:416:13 | x | provenance | Sink:MaD:3 | +| test.cpp:426:11:426:19 | call to ymlSource | test.cpp:426:11:426:19 | call to ymlSource | provenance | Src:MaD:48 | +| test.cpp:426:11:426:19 | call to ymlSource | test.cpp:427:16:427:16 | *x | provenance | | +| test.cpp:427:3:427:3 | emplace output argument [element, x] | test.cpp:429:34:429:34 | *c [element, x] | provenance | | +| test.cpp:427:16:427:16 | *x | test.cpp:427:3:427:3 | emplace output argument [element, x] | provenance | | +| test.cpp:429:34:429:34 | *c [element, x] | test.cpp:429:39:429:41 | call to get [x] | provenance | MaD:87 | +| test.cpp:429:39:429:41 | call to get [x] | test.cpp:429:39:429:41 | call to get [x] | provenance | | +| test.cpp:429:39:429:41 | call to get [x] | test.cpp:430:11:430:11 | *e [x] | provenance | | +| test.cpp:430:11:430:11 | *e [x] | test.cpp:430:13:430:13 | x | provenance | | +| test.cpp:430:13:430:13 | x | test.cpp:430:13:430:13 | x | provenance | Sink:MaD:3 | +| test.cpp:435:3:435:28 | *ElementWithOverloadedArity [post update] [x] | test.cpp:435:3:435:28 | *this [Return] [x] | provenance | | +| test.cpp:435:34:435:38 | first | test.cpp:435:45:435:49 | first | provenance | | +| test.cpp:435:45:435:49 | first | test.cpp:435:3:435:28 | *ElementWithOverloadedArity [post update] [x] | provenance | | +| test.cpp:436:3:436:28 | *ElementWithOverloadedArity [post update] [x] | test.cpp:436:3:436:28 | *this [Return] [x] | provenance | | +| test.cpp:436:39:436:44 | second | test.cpp:436:51:436:56 | second | provenance | | +| test.cpp:436:51:436:56 | second | test.cpp:436:3:436:28 | *ElementWithOverloadedArity [post update] [x] | provenance | | +| test.cpp:440:11:440:19 | call to ymlSource | test.cpp:440:11:440:19 | call to ymlSource | provenance | Src:MaD:48 | +| test.cpp:440:11:440:19 | call to ymlSource | test.cpp:443:18:443:18 | *x | provenance | | +| test.cpp:440:11:440:19 | call to ymlSource | test.cpp:453:21:453:21 | *x | provenance | | +| test.cpp:443:5:443:5 | emplace output argument [element, x] | test.cpp:444:13:444:13 | *c [element, x] | provenance | | +| test.cpp:443:18:443:18 | *x | test.cpp:435:34:435:38 | first | provenance | | +| test.cpp:443:18:443:18 | *x | test.cpp:443:5:443:5 | emplace output argument [element, x] | provenance | | +| test.cpp:444:13:444:13 | *c [element, x] | test.cpp:444:18:444:20 | *call to get [x] | provenance | MaD:87 | +| test.cpp:444:18:444:20 | *call to get [x] | test.cpp:444:21:444:21 | x | provenance | | +| test.cpp:444:21:444:21 | x | test.cpp:444:21:444:21 | x | provenance | Sink:MaD:3 | +| test.cpp:453:5:453:5 | emplace output argument [element, x] | test.cpp:454:13:454:13 | *c [element, x] | provenance | | +| test.cpp:453:21:453:21 | *x | test.cpp:436:39:436:44 | second | provenance | | +| test.cpp:453:21:453:21 | *x | test.cpp:453:5:453:5 | emplace output argument [element, x] | provenance | | +| test.cpp:454:13:454:13 | *c [element, x] | test.cpp:454:18:454:20 | *call to get [x] | provenance | MaD:87 | +| test.cpp:454:18:454:20 | *call to get [x] | test.cpp:454:21:454:21 | x | provenance | | +| test.cpp:454:21:454:21 | x | test.cpp:454:21:454:21 | x | provenance | Sink:MaD:3 | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:24:8:24:11 | * ... | provenance | | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:27:36:27:38 | *cmd | provenance | | | windows.cpp:22:15:22:29 | call to GetCommandLineA | windows.cpp:22:15:22:29 | *call to GetCommandLineA | provenance | Src:MaD:5 | @@ -917,58 +924,66 @@ nodes | test.cpp:376:13:376:13 | *c [ul] | semmle.label | *c [ul] | | test.cpp:376:13:376:16 | ul | semmle.label | ul | | test.cpp:376:15:376:16 | ul | semmle.label | ul | -| test.cpp:395:11:395:19 | call to ymlSource | semmle.label | call to ymlSource | -| test.cpp:395:11:395:19 | call to ymlSource | semmle.label | call to ymlSource | -| test.cpp:396:3:396:3 | forwardToElement output argument [x] | semmle.label | forwardToElement output argument [x] | -| test.cpp:396:22:396:22 | x | semmle.label | x | -| test.cpp:397:15:397:15 | *f [x] | semmle.label | *f [x] | -| test.cpp:397:17:397:19 | call to get [x] | semmle.label | call to get [x] | -| test.cpp:397:17:397:19 | call to get [x] | semmle.label | call to get [x] | -| test.cpp:398:11:398:11 | *e [x] | semmle.label | *e [x] | -| test.cpp:398:13:398:13 | x | semmle.label | x | -| test.cpp:398:13:398:13 | x | semmle.label | x | -| test.cpp:403:11:403:19 | call to ymlSource | semmle.label | call to ymlSource | -| test.cpp:403:11:403:19 | call to ymlSource | semmle.label | call to ymlSource | -| test.cpp:404:3:404:3 | emplace output argument [element, x] | semmle.label | emplace output argument [element, x] | -| test.cpp:404:16:404:16 | *x | semmle.label | *x | -| test.cpp:406:15:406:15 | *c [element, x] | semmle.label | *c [element, x] | -| test.cpp:406:20:406:22 | call to get [x] | semmle.label | call to get [x] | -| test.cpp:406:20:406:22 | call to get [x] | semmle.label | call to get [x] | +| test.cpp:397:11:397:19 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:397:11:397:19 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:398:15:398:36 | call to makeForwarded [x] | semmle.label | call to makeForwarded [x] | +| test.cpp:398:15:398:36 | call to makeForwarded [x] | semmle.label | call to makeForwarded [x] | +| test.cpp:398:38:398:38 | x | semmle.label | x | +| test.cpp:399:11:399:11 | *e [x] | semmle.label | *e [x] | +| test.cpp:399:13:399:13 | x | semmle.label | x | +| test.cpp:399:13:399:13 | x | semmle.label | x | +| test.cpp:404:11:404:19 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:404:11:404:19 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:405:3:405:3 | forwardToElement output argument [x] | semmle.label | forwardToElement output argument [x] | +| test.cpp:405:22:405:22 | x | semmle.label | x | +| test.cpp:406:15:406:15 | *f [x] | semmle.label | *f [x] | +| test.cpp:406:17:406:19 | call to get [x] | semmle.label | call to get [x] | +| test.cpp:406:17:406:19 | call to get [x] | semmle.label | call to get [x] | | test.cpp:407:11:407:11 | *e [x] | semmle.label | *e [x] | | test.cpp:407:13:407:13 | x | semmle.label | x | | test.cpp:407:13:407:13 | x | semmle.label | x | -| test.cpp:417:11:417:19 | call to ymlSource | semmle.label | call to ymlSource | -| test.cpp:417:11:417:19 | call to ymlSource | semmle.label | call to ymlSource | -| test.cpp:418:3:418:3 | emplace output argument [element, x] | semmle.label | emplace output argument [element, x] | -| test.cpp:418:16:418:16 | *x | semmle.label | *x | -| test.cpp:420:34:420:34 | *c [element, x] | semmle.label | *c [element, x] | -| test.cpp:420:39:420:41 | call to get [x] | semmle.label | call to get [x] | -| test.cpp:420:39:420:41 | call to get [x] | semmle.label | call to get [x] | -| test.cpp:421:11:421:11 | *e [x] | semmle.label | *e [x] | -| test.cpp:421:13:421:13 | x | semmle.label | x | -| test.cpp:421:13:421:13 | x | semmle.label | x | -| test.cpp:426:3:426:28 | *ElementWithOverloadedArity [post update] [x] | semmle.label | *ElementWithOverloadedArity [post update] [x] | -| test.cpp:426:3:426:28 | *this [Return] [x] | semmle.label | *this [Return] [x] | -| test.cpp:426:34:426:38 | first | semmle.label | first | -| test.cpp:426:45:426:49 | first | semmle.label | first | -| test.cpp:427:3:427:28 | *ElementWithOverloadedArity [post update] [x] | semmle.label | *ElementWithOverloadedArity [post update] [x] | -| test.cpp:427:3:427:28 | *this [Return] [x] | semmle.label | *this [Return] [x] | -| test.cpp:427:39:427:44 | second | semmle.label | second | -| test.cpp:427:51:427:56 | second | semmle.label | second | -| test.cpp:431:11:431:19 | call to ymlSource | semmle.label | call to ymlSource | -| test.cpp:431:11:431:19 | call to ymlSource | semmle.label | call to ymlSource | -| test.cpp:434:5:434:5 | emplace output argument [element, x] | semmle.label | emplace output argument [element, x] | -| test.cpp:434:18:434:18 | *x | semmle.label | *x | -| test.cpp:435:13:435:13 | *c [element, x] | semmle.label | *c [element, x] | -| test.cpp:435:18:435:20 | *call to get [x] | semmle.label | *call to get [x] | -| test.cpp:435:21:435:21 | x | semmle.label | x | -| test.cpp:435:21:435:21 | x | semmle.label | x | -| test.cpp:444:5:444:5 | emplace output argument [element, x] | semmle.label | emplace output argument [element, x] | -| test.cpp:444:21:444:21 | *x | semmle.label | *x | -| test.cpp:445:13:445:13 | *c [element, x] | semmle.label | *c [element, x] | -| test.cpp:445:18:445:20 | *call to get [x] | semmle.label | *call to get [x] | -| test.cpp:445:21:445:21 | x | semmle.label | x | -| test.cpp:445:21:445:21 | x | semmle.label | x | +| test.cpp:412:11:412:19 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:412:11:412:19 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:413:3:413:3 | emplace output argument [element, x] | semmle.label | emplace output argument [element, x] | +| test.cpp:413:16:413:16 | *x | semmle.label | *x | +| test.cpp:415:15:415:15 | *c [element, x] | semmle.label | *c [element, x] | +| test.cpp:415:20:415:22 | call to get [x] | semmle.label | call to get [x] | +| test.cpp:415:20:415:22 | call to get [x] | semmle.label | call to get [x] | +| test.cpp:416:11:416:11 | *e [x] | semmle.label | *e [x] | +| test.cpp:416:13:416:13 | x | semmle.label | x | +| test.cpp:416:13:416:13 | x | semmle.label | x | +| test.cpp:426:11:426:19 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:426:11:426:19 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:427:3:427:3 | emplace output argument [element, x] | semmle.label | emplace output argument [element, x] | +| test.cpp:427:16:427:16 | *x | semmle.label | *x | +| test.cpp:429:34:429:34 | *c [element, x] | semmle.label | *c [element, x] | +| test.cpp:429:39:429:41 | call to get [x] | semmle.label | call to get [x] | +| test.cpp:429:39:429:41 | call to get [x] | semmle.label | call to get [x] | +| test.cpp:430:11:430:11 | *e [x] | semmle.label | *e [x] | +| test.cpp:430:13:430:13 | x | semmle.label | x | +| test.cpp:430:13:430:13 | x | semmle.label | x | +| test.cpp:435:3:435:28 | *ElementWithOverloadedArity [post update] [x] | semmle.label | *ElementWithOverloadedArity [post update] [x] | +| test.cpp:435:3:435:28 | *this [Return] [x] | semmle.label | *this [Return] [x] | +| test.cpp:435:34:435:38 | first | semmle.label | first | +| test.cpp:435:45:435:49 | first | semmle.label | first | +| test.cpp:436:3:436:28 | *ElementWithOverloadedArity [post update] [x] | semmle.label | *ElementWithOverloadedArity [post update] [x] | +| test.cpp:436:3:436:28 | *this [Return] [x] | semmle.label | *this [Return] [x] | +| test.cpp:436:39:436:44 | second | semmle.label | second | +| test.cpp:436:51:436:56 | second | semmle.label | second | +| test.cpp:440:11:440:19 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:440:11:440:19 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:443:5:443:5 | emplace output argument [element, x] | semmle.label | emplace output argument [element, x] | +| test.cpp:443:18:443:18 | *x | semmle.label | *x | +| test.cpp:444:13:444:13 | *c [element, x] | semmle.label | *c [element, x] | +| test.cpp:444:18:444:20 | *call to get [x] | semmle.label | *call to get [x] | +| test.cpp:444:21:444:21 | x | semmle.label | x | +| test.cpp:444:21:444:21 | x | semmle.label | x | +| test.cpp:453:5:453:5 | emplace output argument [element, x] | semmle.label | emplace output argument [element, x] | +| test.cpp:453:21:453:21 | *x | semmle.label | *x | +| test.cpp:454:13:454:13 | *c [element, x] | semmle.label | *c [element, x] | +| test.cpp:454:18:454:20 | *call to get [x] | semmle.label | *call to get [x] | +| test.cpp:454:21:454:21 | x | semmle.label | x | +| test.cpp:454:21:454:21 | x | semmle.label | x | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | semmle.label | *call to GetCommandLineA | | windows.cpp:22:15:22:29 | call to GetCommandLineA | semmle.label | call to GetCommandLineA | | windows.cpp:24:8:24:11 | * ... | semmle.label | * ... | @@ -1192,6 +1207,6 @@ subpaths | test.cpp:172:51:172:51 | x | test.cpp:164:34:164:34 | x | test.cpp:164:7:164:7 | *templateFunction3 | test.cpp:172:13:172:44 | call to templateFunction3 | | test.cpp:363:15:363:15 | *x | test.cpp:341:30:341:32 | arg | test.cpp:341:3:341:22 | *this [Return] [s] | test.cpp:363:5:363:5 | forward output argument [s] | | test.cpp:372:15:372:16 | *ul | test.cpp:345:38:345:40 | arg | test.cpp:345:3:345:22 | *this [Return] [ul] | test.cpp:372:5:372:5 | forward output argument [ul] | -| test.cpp:434:18:434:18 | *x | test.cpp:426:34:426:38 | first | test.cpp:426:3:426:28 | *this [Return] [x] | test.cpp:434:5:434:5 | emplace output argument [element, x] | -| test.cpp:444:21:444:21 | *x | test.cpp:427:39:427:44 | second | test.cpp:427:3:427:28 | *this [Return] [x] | test.cpp:444:5:444:5 | emplace output argument [element, x] | +| test.cpp:443:18:443:18 | *x | test.cpp:435:34:435:38 | first | test.cpp:435:3:435:28 | *this [Return] [x] | test.cpp:443:5:443:5 | emplace output argument [element, x] | +| test.cpp:453:21:453:21 | *x | test.cpp:436:39:436:44 | second | test.cpp:436:3:436:28 | *this [Return] [x] | test.cpp:453:5:453:5 | emplace output argument [element, x] | testFailures diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml b/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml index 954b6d1c2b41..105d0a050311 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml @@ -51,5 +51,6 @@ extensions: extensible: forwardsModel data: # namespace, type, subtypes, name, signature, ext, start, constructor, output, provenance - ["", "Forwarder", True, "forward", "(Args &&)", "", "0", "T", "Argument[-1]", "manual"] + - ["", "", False, "makeForwarded", "(int)", "", "0", "T", "ReturnValue", "manual"] - ["", "Forwarder", True, "forwardToElement", "(int)", "", "0", "Element", "Argument[-1]", "manual"] - ["", "Container", True, "emplace", "(int,Args &&)", "", "1", "T", "Argument[-1].Element", "manual"] diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected index 1fa77e37ed66..e7b076de2f73 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected @@ -47,9 +47,10 @@ | test.cpp:367:15:367:16 | ul | test-sink | | test.cpp:375:15:375:15 | s | test-sink | | test.cpp:376:15:376:16 | ul | test-sink | -| test.cpp:398:13:398:13 | x | test-sink | +| test.cpp:399:13:399:13 | x | test-sink | | test.cpp:407:13:407:13 | x | test-sink | -| test.cpp:421:13:421:13 | x | test-sink | -| test.cpp:435:21:435:21 | x | test-sink | -| test.cpp:440:21:440:21 | x | test-sink | -| test.cpp:445:21:445:21 | x | test-sink | +| test.cpp:416:13:416:13 | x | test-sink | +| test.cpp:430:13:430:13 | x | test-sink | +| test.cpp:444:21:444:21 | x | test-sink | +| test.cpp:449:21:449:21 | x | test-sink | +| test.cpp:454:21:454:21 | x | test-sink | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected index d17a4c6b2c21..cb1b2ab4a656 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected @@ -21,10 +21,11 @@ | test.cpp:317:51:317:59 | call to ymlSource | local | | test.cpp:362:15:362:23 | call to ymlSource | local | | test.cpp:371:24:371:32 | call to ymlSource | local | -| test.cpp:395:11:395:19 | call to ymlSource | local | -| test.cpp:403:11:403:19 | call to ymlSource | local | -| test.cpp:417:11:417:19 | call to ymlSource | local | -| test.cpp:431:11:431:19 | call to ymlSource | local | +| test.cpp:397:11:397:19 | call to ymlSource | local | +| test.cpp:404:11:404:19 | call to ymlSource | local | +| test.cpp:412:11:412:19 | call to ymlSource | local | +| test.cpp:426:11:426:19 | call to ymlSource | local | +| test.cpp:440:11:440:19 | call to ymlSource | local | | windows.cpp:22:15:22:29 | call to GetCommandLineA | local | | windows.cpp:34:17:34:38 | call to GetEnvironmentStringsA | local | | windows.cpp:39:36:39:38 | GetEnvironmentVariableA output argument | local | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp index 8f5383b79b4f..17421e38d2f8 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp @@ -390,6 +390,15 @@ struct Element { Element(int); }; +template +T makeForwarded(int arg); + +void forward_test_function_template_constructor() { + int x = ymlSource(); + Element e = makeForwarded(x); + ymlSink(e.x); // $ ir +} + void forward_test_named_constructor() { Forwarder f; int x = ymlSource(); From d9331e968e6ee55335cfbf52b1b933db3afdefce Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 10 Sep 2026 09:22:01 +0100 Subject: [PATCH 1062/2098] C++: Add a testcase with forwarding without a constructor. --- .../dataflow/external-models/sinks.expected | 2 ++ .../dataflow/external-models/sources.expected | 1 + .../library-tests/dataflow/external-models/test.cpp | 13 +++++++++++++ 3 files changed, 16 insertions(+) diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected index e7b076de2f73..dc8db031cbb8 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected @@ -54,3 +54,5 @@ | test.cpp:444:21:444:21 | x | test-sink | | test.cpp:449:21:449:21 | x | test-sink | | test.cpp:454:21:454:21 | x | test-sink | +| test.cpp:462:15:462:17 | call to get | test-sink | +| test.cpp:467:13:467:20 | * ... | test-sink | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected index cb1b2ab4a656..232eb60fe50f 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected @@ -26,6 +26,7 @@ | test.cpp:412:11:412:19 | call to ymlSource | local | | test.cpp:426:11:426:19 | call to ymlSource | local | | test.cpp:440:11:440:19 | call to ymlSource | local | +| test.cpp:461:15:461:23 | call to ymlSource | local | | windows.cpp:22:15:22:29 | call to GetCommandLineA | local | | windows.cpp:34:17:34:38 | call to GetEnvironmentStringsA | local | | windows.cpp:39:36:39:38 | GetEnvironmentVariableA output argument | local | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp index 17421e38d2f8..d25c110f9c0d 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp @@ -453,4 +453,17 @@ void forward_test_constructor_arity() { c.emplace(0, 0, x); ymlSink(c.get().x); // $ ir } +} + +void forward_test_without_constructor() { + { + Forwarder f; + f.forward(ymlSource()); + ymlSink(f.get()); // $ MISSING: ir + } + { + Forwarder f; + f.forward(ymlSourcePtr()); + ymlSink(*f.get()); // $ MISSING: ir + } } \ No newline at end of file From f52d18cc3f5687876b4bfffc3abdda04534e8761 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Wed, 16 Sep 2026 14:05:32 +0100 Subject: [PATCH 1063/2098] C++: Handle forwarding without a constructor. --- .../semmle/code/cpp/dataflow/ExternalFlow.qll | 41 ++++++++++++++++--- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll index 0f3a69b680c1..9c3f45fcd776 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll @@ -1097,9 +1097,9 @@ private Type getForwardedConstructorType( ) } -/** Interprets a forwarding model, retaining its output and provenance. */ -private predicate interpretForwardsModel( - Function forwarder, Constructor constructor, int start, string output, string provenance, +/** Interprets a forwarding model, retaining its constructed type, output, and provenance. */ +private predicate interpretForwardsModelType( + Function forwarder, Type constructedType, int start, string output, string provenance, string model ) { exists( @@ -1114,7 +1114,7 @@ private predicate interpretForwardsModel( // Either the row specifies forwarding to a type given by the type or // function template, in which case we need to resolve that from the type // or function name. - constructor.getDeclaringType() = + constructedType = getForwardedConstructorType(forwarder, namespace, type, subtypes, name, signature, ext, constructorType).getUnspecifiedType() or @@ -1123,7 +1123,7 @@ private predicate interpretForwardsModel( getForwardedConstructorType(forwarder, namespace, type, subtypes, name, signature, ext, constructorType) ) and - classHasQualifiedName(constructor.getDeclaringType(), namespace, constructorType) + classHasQualifiedName(constructedType, namespace, constructorType) ) } @@ -1132,6 +1132,15 @@ private predicate interpretForwardsModel( * actual constructor being forwarded to depends on the types of arguments from `start` * at calls to `forwarder`. */ +private predicate interpretForwardsModel( + Function forwarder, Constructor constructor, int start, string output, string provenance, + string model +) { + interpretForwardsModelType(forwarder, constructor.getDeclaringType(), start, output, provenance, + model) +} + +/** Holds if `forwarder` forwards its arguments starting at `start` to `constructor`. */ predicate forwards(Function forwarder, Constructor constructor, int start) { interpretForwardsModel(forwarder, constructor, start, _, _, _) } @@ -1140,6 +1149,14 @@ private int referenceIndirection(Type unspecified) { if unspecified instanceof ReferenceType then result = 1 else result = 0 } +/** Gets `unspecified`, but with its outermost reference removed, if any. */ +private Type stripReference(Type unspecified) { + result = unspecified.(ReferenceType).getBaseType().getUnspecifiedType() + or + not unspecified instanceof ReferenceType and + result = unspecified +} + /** * In order to support flow summaries for functions that perform "perfect * forwarding" we interpret a call such as: @@ -1183,6 +1200,20 @@ private predicate interpretForwardingSummary( input = "Argument[forward].Parameter[-1]" and output = constructorOutput ) + or + // Scalar types have no constructor to synthesize. In this case, directly + // preserve the value of the single forwarded argument at the modeled output. + exists(Type constructedType, int start, Parameter p, int indirection | + interpretForwardsModelType(forwarder, constructedType, start, output, provenance, model) and + not constructedType instanceof Class and + forwarder.getNumberOfParameters() = start + 1 and + p = forwarder.getParameter(start) and + stripReference(p.getUnspecifiedType()) = constructedType and + indirection = [0 .. SsaImpl::getMaxIndirectionsForPRType(constructedType)] and + input = + "Argument[" + repeatStars(indirection + referenceIndirection(p.getUnspecifiedType())) + start + + "]" + ) } /** From f00b553d4734bb9f9baa7c9e44597d93cfaf5648 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Wed, 16 Sep 2026 14:06:59 +0100 Subject: [PATCH 1064/2098] C++: Accept test changes. --- .../dataflow/external-models/flow.expected | 24 +++++++++++++++++++ .../dataflow/external-models/test.cpp | 4 ++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index ca8ed7efb314..d5ee12796059 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -436,6 +436,17 @@ edges | test.cpp:454:13:454:13 | *c [element, x] | test.cpp:454:18:454:20 | *call to get [x] | provenance | MaD:87 | | test.cpp:454:18:454:20 | *call to get [x] | test.cpp:454:21:454:21 | x | provenance | | | test.cpp:454:21:454:21 | x | test.cpp:454:21:454:21 | x | provenance | Sink:MaD:3 | +| test.cpp:461:5:461:5 | forward output argument | test.cpp:462:13:462:13 | *f | provenance | | +| test.cpp:461:15:461:23 | call to ymlSource | test.cpp:461:15:461:23 | call to ymlSource | provenance | Src:MaD:48 | +| test.cpp:461:15:461:23 | call to ymlSource | test.cpp:461:15:461:25 | call to ymlSource | provenance | | +| test.cpp:461:15:461:25 | call to ymlSource | test.cpp:461:5:461:5 | forward output argument | provenance | | +| test.cpp:462:13:462:13 | *f | test.cpp:462:15:462:17 | call to get | provenance | MaD:88 | +| test.cpp:462:15:462:17 | call to get | test.cpp:462:15:462:17 | call to get | provenance | Sink:MaD:3 | +| test.cpp:466:5:466:5 | forward output argument | test.cpp:467:14:467:14 | *f | provenance | | +| test.cpp:466:15:466:26 | *call to ymlSourcePtr | test.cpp:466:15:466:28 | **call to ymlSourcePtr | provenance | | +| test.cpp:466:15:466:26 | call to ymlSourcePtr | test.cpp:466:15:466:26 | *call to ymlSourcePtr | provenance | Src:MaD:49 | +| test.cpp:466:15:466:28 | **call to ymlSourcePtr | test.cpp:466:5:466:5 | forward output argument | provenance | | +| test.cpp:467:14:467:14 | *f | test.cpp:467:13:467:20 | * ... | provenance | MaD:88 Sink:MaD:3 | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:24:8:24:11 | * ... | provenance | | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:27:36:27:38 | *cmd | provenance | | | windows.cpp:22:15:22:29 | call to GetCommandLineA | windows.cpp:22:15:22:29 | *call to GetCommandLineA | provenance | Src:MaD:5 | @@ -984,6 +995,19 @@ nodes | test.cpp:454:18:454:20 | *call to get [x] | semmle.label | *call to get [x] | | test.cpp:454:21:454:21 | x | semmle.label | x | | test.cpp:454:21:454:21 | x | semmle.label | x | +| test.cpp:461:5:461:5 | forward output argument | semmle.label | forward output argument | +| test.cpp:461:15:461:23 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:461:15:461:23 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:461:15:461:25 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:462:13:462:13 | *f | semmle.label | *f | +| test.cpp:462:15:462:17 | call to get | semmle.label | call to get | +| test.cpp:462:15:462:17 | call to get | semmle.label | call to get | +| test.cpp:466:5:466:5 | forward output argument | semmle.label | forward output argument | +| test.cpp:466:15:466:26 | *call to ymlSourcePtr | semmle.label | *call to ymlSourcePtr | +| test.cpp:466:15:466:26 | call to ymlSourcePtr | semmle.label | call to ymlSourcePtr | +| test.cpp:466:15:466:28 | **call to ymlSourcePtr | semmle.label | **call to ymlSourcePtr | +| test.cpp:467:13:467:20 | * ... | semmle.label | * ... | +| test.cpp:467:14:467:14 | *f | semmle.label | *f | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | semmle.label | *call to GetCommandLineA | | windows.cpp:22:15:22:29 | call to GetCommandLineA | semmle.label | call to GetCommandLineA | | windows.cpp:24:8:24:11 | * ... | semmle.label | * ... | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp index d25c110f9c0d..ae4c4f657aba 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp @@ -459,11 +459,11 @@ void forward_test_without_constructor() { { Forwarder f; f.forward(ymlSource()); - ymlSink(f.get()); // $ MISSING: ir + ymlSink(f.get()); // $ ir } { Forwarder f; f.forward(ymlSourcePtr()); - ymlSink(*f.get()); // $ MISSING: ir + ymlSink(*f.get()); // $ ir } } \ No newline at end of file From dee5142fee418ec7d501160df4c7b6feace16e1c Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Wed, 16 Sep 2026 14:15:36 +0100 Subject: [PATCH 1065/2098] C++: Add a high-level description of the forwarding model. --- cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll index 9c3f45fcd776..2b48b36c5022 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll @@ -110,6 +110,15 @@ * - "manual": The model has been written by hand. * This information is used in a heuristic for dataflow analysis to determine, if a * model or source code should be used for determining flow. + * + * The "Forwards" relation allows modeling of function that perform C++11-style "perfect + * forwarding" where a function receives a number of arguments and forwards those arguments + * to a constructor of another type. For example, the row: + * `"std"; "vector"; "True"; "emplace"; ""; ""; "1"; T; Argument[-1].Element; manual` + * says that `std::vector::emplace(arg0, arg1, ..., argn)` forwards arguments + * `arg1, ..., argn` to a constructor for `T`, and the result of `T(arg1, ..., argn)` + * flows to `Argument[-1].Element` (see information about the semantics of the `output` + * column further above). */ import cpp From e6cf65522121482250ae89d2f67ff0a6f0cee7cb Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Wed, 16 Sep 2026 15:40:08 +0200 Subject: [PATCH 1066/2098] Rust: Fix typos and update references in documentation Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- rust/README.md | 2 +- rust/scripts/update_rust_analyzer.py | 2 +- rust/updating-rust-analyzer.md | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/rust/README.md b/rust/README.md index 5beb51eb3747..83d9a735df65 100644 --- a/rust/README.md +++ b/rust/README.md @@ -62,4 +62,4 @@ for code generation to succeed. ### Updating `rust-analyzer` -See [Updating rust-analyzer](UPDATING-RUST-ANALYZER.md). +See [Updating rust-analyzer](updating-rust-analyzer.md). diff --git a/rust/scripts/update_rust_analyzer.py b/rust/scripts/update_rust_analyzer.py index f7e278dcddcf..a3579c931db6 100755 --- a/rust/scripts/update_rust_analyzer.py +++ b/rust/scripts/update_rust_analyzer.py @@ -68,7 +68,7 @@ def get_compatible_rust_toolchain(rust_analyzer_version: str) -> str: crate = json.loads(fetch(crate_url)) rust_analyzer_release = crate["version"]["created_at"].split("T")[0] - # `manifests.txt` is a list of all toolchains. The one we're interested looks likes + # `manifests.txt` is a list of all toolchains. The one we're interested in looks like # ``` # static.rust-lang.org/dist/YYYY-MM-DD/channel-rust-stable.toml # ``` diff --git a/rust/updating-rust-analyzer.md b/rust/updating-rust-analyzer.md index f2169b22d60a..ed0f58a60d29 100644 --- a/rust/updating-rust-analyzer.md +++ b/rust/updating-rust-analyzer.md @@ -8,7 +8,7 @@ pkg-config`. > [!TIP] > All steps up to and including running `bazel run //rust:install` are (barring -> any errors) caried out by the script `./scripts/update_rust_analyzer.py`. +> any errors) carried out by the script `rust/scripts/update_rust_analyzer.py`. > Prefer using the script. 1. Update dependencies. @@ -58,7 +58,7 @@ pkg-config`. ``` bazel run //rust/codegen ``` - If codegen fails other changes might be neccessary. For instance, adaptions + If codegen fails, other changes might be necessary. For instance, adaptations to `annotations.py`. Make these changes in separate commits. Once codegen succeeds commit only the changes made by codegen with @@ -87,8 +87,8 @@ pkg-config`. toolchain in `rust/extractor/src/nightly-toolchain/rust-toolchain.toml` to a more recent date while you're at it. * a toolchain and/or `rules_rust` bump invalidates the vendored files, so - re-run `misc/bazel/3rdparty/update_cargo_deps.sh` (see the note in step - 4) and commit the regenerated files. + re-run `misc/bazel/3rdparty/update_cargo_deps.sh` (see the note in step + 3) and commit the regenerated files. * if it fails while compiling rust extractor code, you will need to adapt it to the new library version. * for example updating annotations in `annotations.py`, adding / removing From a74e5650ae688f2a03a02b0c81c6b8c86eaf2d72 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Wed, 16 Sep 2026 16:32:41 +0200 Subject: [PATCH 1067/2098] Rust: Pin cargo-edit version Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> --- .github/workflows/update-rust-analyzer.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update-rust-analyzer.md b/.github/workflows/update-rust-analyzer.md index 222ec9ae496d..835748cc0487 100644 --- a/.github/workflows/update-rust-analyzer.md +++ b/.github/workflows/update-rust-analyzer.md @@ -40,7 +40,7 @@ steps: - name: Install cargo-edit continue-on-error: true - run: cargo install cargo-edit --locked + run: cargo install cargo-edit@0.13.0 --locked - name: Run rust-analyzer updater script run: | From 4723481b0f1ea6983509732848a6015bd38b1275 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Wed, 16 Sep 2026 16:53:20 +0200 Subject: [PATCH 1068/2098] Rust: Fix updater workflow safe outputs Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/update-rust-analyzer.lock.yml | 9 +++++---- .github/workflows/update-rust-analyzer.md | 8 ++++++++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/.github/workflows/update-rust-analyzer.lock.yml b/.github/workflows/update-rust-analyzer.lock.yml index 8bbd82b0e1bb..20f637d2a37a 100644 --- a/.github/workflows/update-rust-analyzer.lock.yml +++ b/.github/workflows/update-rust-analyzer.lock.yml @@ -1,4 +1,4 @@ -# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"975f6b8a0aaf64f14026c41946d43a056cec29e198f871dc471ca42d4908ca5a","body_hash":"990718b1868afabca459556cc701c1d0ef315857b226b054dfe36037ea0c6371","compiler_version":"v0.88.7","strict":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.80"}} +# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"db75e63ae5870d54f69bab035472bdbcdd398bf5b068490976596e0f765d4b65","body_hash":"990718b1868afabca459556cc701c1d0ef315857b226b054dfe36037ea0c6371","compiler_version":"v0.88.7","strict":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.80"}} # gh-aw-manifest: {"version":1,"secrets":["GH_AW_CI_TRIGGER_TOKEN","GH_AW_DEFAULT_OTLP_HEADERS","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/cache/restore","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/cache/save","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"820762786026740c76f36085b0efc47a31fe5020","version":"v7.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"github/gh-aw-actions/setup","sha":"5e508589e03a7757a7e05b26e834292f5445bfb6","version":"v0.88.7"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.28.14","digest":"sha256:f7df036c86575527b61f3f7df91c4412349a12b2a74988d929eafa2999230c98","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.28.14@sha256:f7df036c86575527b61f3f7df91c4412349a12b2a74988d929eafa2999230c98"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.14","digest":"sha256:6f95e2234dd9bd6333a8ff28ccea7ecf0204acd4a09108723844dbd2bf6268c5","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.14@sha256:6f95e2234dd9bd6333a8ff28ccea7ecf0204acd4a09108723844dbd2bf6268c5"},{"image":"ghcr.io/github/gh-aw-firewall/cli-proxy:0.28.14","digest":"sha256:3a379c5e96e29499c815e9dd2a71334d01c326a9b73991c76544fda9cae35c34","pinned_image":"ghcr.io/github/gh-aw-firewall/cli-proxy:0.28.14@sha256:3a379c5e96e29499c815e9dd2a71334d01c326a9b73991c76544fda9cae35c34"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.28.14","digest":"sha256:2ce8df3abf3e9b76e9c0cf5863da41f1ab3f89b20ad14b988806ab89e7bf2cd5","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.28.14@sha256:2ce8df3abf3e9b76e9c0cf5863da41f1ab3f89b20ad14b988806ab89e7bf2cd5"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.4.18","digest":"sha256:85b940556a8faa4e1fdbef124bfd75f2c4ebd855a10b88a1c3b6f3e97f6f1a53","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.4.18@sha256:85b940556a8faa4e1fdbef124bfd75f2c4ebd855a10b88a1c3b6f3e97f6f1a53"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:0daa8971fa4732b647150cb6524a6b0804b68d5d24f6f58b5dd1af23bd63fb23","pinned_image":"ghcr.io/github/gh-aw-node@sha256:0daa8971fa4732b647150cb6524a6b0804b68d5d24f6f58b5dd1af23bd63fb23"},{"image":"ghcr.io/github/github-mcp-server:v1.11.0","digest":"sha256:fbec75de11c255213fa08d80fb166abe73d851fff631c51c0079872967720699","pinned_image":"ghcr.io/github/github-mcp-server:v1.11.0@sha256:fbec75de11c255213fa08d80fb166abe73d851fff631c51c0079872967720699"}],"mcp_servers":[{"name":"safeoutputs","tools":["create_pull_request","missing_data","missing_tool","noop"]}]} # This file was automatically generated by gh-aw (v0.88.7). DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md # @@ -468,7 +468,7 @@ jobs: git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - continue-on-error: true name: Install cargo-edit - run: cargo install cargo-edit --locked + run: cargo install cargo-edit@0.13.0 --locked - name: Run rust-analyzer updater script run: "mkdir -p /tmp/gh-aw/agent\nset +e\npython3 rust/scripts/update_rust_analyzer.py \\\n 2>&1 | tee /tmp/gh-aw/agent/rust-analyzer-update.log\nstatus=${PIPESTATUS[0]}\nset -e\n\nprintf '%s\\n' \"$status\" > /tmp/gh-aw/agent/rust-analyzer-update-status.txt\nif grep -Fxq \"No new rust-analyzer version available.\" \\\n /tmp/gh-aw/agent/rust-analyzer-update.log; then\n printf '%s\\n' \"no-update\" > /tmp/gh-aw/agent/rust-analyzer-update-result.txt\nelse\n printf '%s\\n' \"update\" > /tmp/gh-aw/agent/rust-analyzer-update-result.txt\nfi" @@ -540,7 +540,7 @@ jobs: env: GH_AW_FILE_ROOT: "${{ runner.temp }}/gh-aw" GH_AW_FILE_CONFIG: "{\"files\":[{\"path\":\"safeoutputs/config.json\",\"content_env\":\"GH_AW_SAFE_OUTPUTS_CONFIG\"}]}" - GH_AW_SAFE_OUTPUTS_CONFIG: "{\"create_pull_request\":{\"allowed_files\":[\"Cargo.lock\",\"MODULE.bazel\",\"MODULE.bazel.lock\",\"rust-toolchain.toml\",\"rust/**\",\"misc/bazel/3rdparty/**\"],\"branch_prefix\":\"automation/update-rust-analyzer/\",\"draft\":true,\"max\":1,\"max_patch_files\":1000,\"max_patch_size\":10240,\"protect_top_level_dot_folders\":true,\"protected_files\":[\"package.json\",\"bun.lockb\",\"bunfig.toml\",\"deno.json\",\"deno.jsonc\",\"deno.lock\",\"global.json\",\"NuGet.Config\",\"Directory.Packages.props\",\"mix.exs\",\"mix.lock\",\"go.mod\",\"go.sum\",\"stack.yaml\",\"stack.yaml.lock\",\"pom.xml\",\"build.gradle\",\"build.gradle.kts\",\"settings.gradle\",\"settings.gradle.kts\",\"gradle.properties\",\"package-lock.json\",\"yarn.lock\",\"pnpm-lock.yaml\",\"npm-shrinkwrap.json\",\"requirements.txt\",\"Pipfile\",\"Pipfile.lock\",\"pyproject.toml\",\"setup.py\",\"setup.cfg\",\"Gemfile\",\"Gemfile.lock\",\"uv.lock\",\"CODEOWNERS\",\"DESIGN.md\",\"README.md\",\"CONTRIBUTING.md\",\"CHANGELOG.md\",\"SECURITY.md\",\"CODE_OF_CONDUCT.md\",\"AGENTS.md\"],\"protected_files_policy\":\"allowed\",\"title_prefix\":\"Rust: \"},\"create_report_incomplete_issue\":{},\"missing_data\":{},\"missing_tool\":{},\"noop\":{\"max\":1,\"report-as-issue\":\"false\"},\"report_incomplete\":{}}" + GH_AW_SAFE_OUTPUTS_CONFIG: "{\"create_pull_request\":{\"allowed_files\":[\"Cargo.lock\",\"shared/tree-sitter-extractor/Cargo.toml\",\"shared/yeast/Cargo.toml\",\"shared/yeast-macros/Cargo.toml\",\"shared/yeast-schema/Cargo.toml\",\"ruby/extractor/Cargo.toml\",\"unified/extractor/Cargo.toml\",\"unified/swift-syntax-rs/Cargo.toml\",\"MODULE.bazel\",\"MODULE.bazel.lock\",\"rust-toolchain.toml\",\"rust/**\",\"misc/bazel/3rdparty/**\"],\"branch_prefix\":\"automation/update-rust-analyzer/\",\"draft\":true,\"max\":1,\"max_patch_files\":1000,\"max_patch_size\":10240,\"protect_top_level_dot_folders\":true,\"protected_files\":[\"package.json\",\"bun.lockb\",\"bunfig.toml\",\"deno.json\",\"deno.jsonc\",\"deno.lock\",\"global.json\",\"NuGet.Config\",\"Directory.Packages.props\",\"mix.exs\",\"mix.lock\",\"go.mod\",\"go.sum\",\"stack.yaml\",\"stack.yaml.lock\",\"pom.xml\",\"build.gradle\",\"build.gradle.kts\",\"settings.gradle\",\"settings.gradle.kts\",\"gradle.properties\",\"package-lock.json\",\"yarn.lock\",\"pnpm-lock.yaml\",\"npm-shrinkwrap.json\",\"requirements.txt\",\"Pipfile\",\"Pipfile.lock\",\"pyproject.toml\",\"setup.py\",\"setup.cfg\",\"Gemfile\",\"Gemfile.lock\",\"uv.lock\",\"CODEOWNERS\",\"DESIGN.md\",\"README.md\",\"CONTRIBUTING.md\",\"CHANGELOG.md\",\"SECURITY.md\",\"CODE_OF_CONDUCT.md\",\"AGENTS.md\"],\"protected_files_policy\":\"allowed\",\"title_prefix\":\"Rust: \"},\"create_report_incomplete_issue\":{\"title-prefix\":\"[incomplete]\"},\"missing_data\":{},\"missing_tool\":{},\"noop\":{\"max\":1,\"report-as-issue\":\"false\"},\"report_incomplete\":{}}" with: script: | const path = require('path'); @@ -1334,6 +1334,7 @@ jobs: env: GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} GH_AW_REPORT_INCOMPLETE_CREATE_ISSUE: "true" + GH_AW_REPORT_INCOMPLETE_TITLE_PREFIX: "[incomplete]" GH_AW_WORKFLOW_NAME: "Update rust-analyzer" GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/${{ github.repository }}/blob/${{ github.ref_name }}/.github/workflows/update-rust-analyzer.md" with: @@ -1798,7 +1799,7 @@ jobs: GH_AW_ALLOWED_DOMAINS: "*.githubusercontent.com,*.pythonhosted.org,anaconda.org,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,bcr.bazel.build,binstar.org,blog.bazel.build,bootstrap.pypa.io,codeload.github.com,conda.anaconda.org,conda.binstar.org,crates.io,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,docs.github.com,files.pythonhosted.org,github-cloud.githubusercontent.com,github-cloud.s3.amazonaws.com,github.blog,github.com,github.githubassets.com,index.crates.io,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,lfs.github.com,mirror.bazel.build,objects.githubusercontent.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,patch-diff.githubusercontent.com,patchdiff.githubusercontent.com,pip.pypa.io,ppa.launchpad.net,productionresultssa0.blob.core.windows.net,productionresultssa1.blob.core.windows.net,productionresultssa10.blob.core.windows.net,productionresultssa11.blob.core.windows.net,productionresultssa12.blob.core.windows.net,productionresultssa13.blob.core.windows.net,productionresultssa14.blob.core.windows.net,productionresultssa15.blob.core.windows.net,productionresultssa16.blob.core.windows.net,productionresultssa17.blob.core.windows.net,productionresultssa18.blob.core.windows.net,productionresultssa19.blob.core.windows.net,productionresultssa2.blob.core.windows.net,productionresultssa3.blob.core.windows.net,productionresultssa4.blob.core.windows.net,productionresultssa5.blob.core.windows.net,productionresultssa6.blob.core.windows.net,productionresultssa7.blob.core.windows.net,productionresultssa8.blob.core.windows.net,productionresultssa9.blob.core.windows.net,pypi.org,pypi.python.org,raw.githubusercontent.com,releases.bazel.build,repo.anaconda.com,repo.continuum.io,s.symcb.com,s.symcd.com,security.ubuntu.com,sh.rustup.rs,static.crates.io,static.rust-lang.org,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com,www.googleapis.com" GITHUB_SERVER_URL: ${{ github.server_url }} GITHUB_API_URL: ${{ github.api_url }} - GH_AW_SAFE_OUTPUTS_HANDLER_CONFIG: "{\"create_pull_request\":{\"allowed_files\":[\"Cargo.lock\",\"MODULE.bazel\",\"MODULE.bazel.lock\",\"rust-toolchain.toml\",\"rust/**\",\"misc/bazel/3rdparty/**\"],\"branch_prefix\":\"automation/update-rust-analyzer/\",\"draft\":true,\"max\":1,\"max_patch_files\":1000,\"max_patch_size\":10240,\"protect_top_level_dot_folders\":true,\"protected_files\":[\"package.json\",\"bun.lockb\",\"bunfig.toml\",\"deno.json\",\"deno.jsonc\",\"deno.lock\",\"global.json\",\"NuGet.Config\",\"Directory.Packages.props\",\"mix.exs\",\"mix.lock\",\"go.mod\",\"go.sum\",\"stack.yaml\",\"stack.yaml.lock\",\"pom.xml\",\"build.gradle\",\"build.gradle.kts\",\"settings.gradle\",\"settings.gradle.kts\",\"gradle.properties\",\"package-lock.json\",\"yarn.lock\",\"pnpm-lock.yaml\",\"npm-shrinkwrap.json\",\"requirements.txt\",\"Pipfile\",\"Pipfile.lock\",\"pyproject.toml\",\"setup.py\",\"setup.cfg\",\"Gemfile\",\"Gemfile.lock\",\"uv.lock\",\"CODEOWNERS\",\"DESIGN.md\",\"README.md\",\"CONTRIBUTING.md\",\"CHANGELOG.md\",\"SECURITY.md\",\"CODE_OF_CONDUCT.md\",\"AGENTS.md\"],\"protected_files_policy\":\"allowed\",\"title_prefix\":\"Rust: \"},\"create_report_incomplete_issue\":{},\"missing_data\":{},\"missing_tool\":{},\"noop\":{\"max\":1,\"report-as-issue\":\"false\"},\"report_incomplete\":{}}" + GH_AW_SAFE_OUTPUTS_HANDLER_CONFIG: "{\"create_pull_request\":{\"allowed_files\":[\"Cargo.lock\",\"shared/tree-sitter-extractor/Cargo.toml\",\"shared/yeast/Cargo.toml\",\"shared/yeast-macros/Cargo.toml\",\"shared/yeast-schema/Cargo.toml\",\"ruby/extractor/Cargo.toml\",\"unified/extractor/Cargo.toml\",\"unified/swift-syntax-rs/Cargo.toml\",\"MODULE.bazel\",\"MODULE.bazel.lock\",\"rust-toolchain.toml\",\"rust/**\",\"misc/bazel/3rdparty/**\"],\"branch_prefix\":\"automation/update-rust-analyzer/\",\"draft\":true,\"max\":1,\"max_patch_files\":1000,\"max_patch_size\":10240,\"protect_top_level_dot_folders\":true,\"protected_files\":[\"package.json\",\"bun.lockb\",\"bunfig.toml\",\"deno.json\",\"deno.jsonc\",\"deno.lock\",\"global.json\",\"NuGet.Config\",\"Directory.Packages.props\",\"mix.exs\",\"mix.lock\",\"go.mod\",\"go.sum\",\"stack.yaml\",\"stack.yaml.lock\",\"pom.xml\",\"build.gradle\",\"build.gradle.kts\",\"settings.gradle\",\"settings.gradle.kts\",\"gradle.properties\",\"package-lock.json\",\"yarn.lock\",\"pnpm-lock.yaml\",\"npm-shrinkwrap.json\",\"requirements.txt\",\"Pipfile\",\"Pipfile.lock\",\"pyproject.toml\",\"setup.py\",\"setup.cfg\",\"Gemfile\",\"Gemfile.lock\",\"uv.lock\",\"CODEOWNERS\",\"DESIGN.md\",\"README.md\",\"CONTRIBUTING.md\",\"CHANGELOG.md\",\"SECURITY.md\",\"CODE_OF_CONDUCT.md\",\"AGENTS.md\"],\"protected_files_policy\":\"allowed\",\"title_prefix\":\"Rust: \"},\"create_report_incomplete_issue\":{\"title-prefix\":\"[incomplete]\"},\"missing_data\":{},\"missing_tool\":{},\"noop\":{\"max\":1,\"report-as-issue\":\"false\"},\"report_incomplete\":{}}" GH_AW_CI_TRIGGER_TOKEN: ${{ secrets.GH_AW_CI_TRIGGER_TOKEN }} with: github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/update-rust-analyzer.md b/.github/workflows/update-rust-analyzer.md index 835748cc0487..c47725406aa7 100644 --- a/.github/workflows/update-rust-analyzer.md +++ b/.github/workflows/update-rust-analyzer.md @@ -59,6 +59,7 @@ steps: printf '%s\n' "update" > /tmp/gh-aw/agent/rust-analyzer-update-result.txt fi safe-outputs: + report-incomplete: {} create-pull-request: title-prefix: "Rust: " branch-prefix: "automation/update-rust-analyzer/" @@ -68,6 +69,13 @@ safe-outputs: max-patch-files: 1000 allowed-files: - "Cargo.lock" + - "shared/tree-sitter-extractor/Cargo.toml" + - "shared/yeast/Cargo.toml" + - "shared/yeast-macros/Cargo.toml" + - "shared/yeast-schema/Cargo.toml" + - "ruby/extractor/Cargo.toml" + - "unified/extractor/Cargo.toml" + - "unified/swift-syntax-rs/Cargo.toml" - "MODULE.bazel" - "MODULE.bazel.lock" - "rust-toolchain.toml" From 066e688f7d09c7597ccf7cba77846aa8e8789801 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Wed, 16 Sep 2026 16:54:11 +0200 Subject: [PATCH 1069/2098] Rust: Preserve workflow protected-file guardrails Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/update-rust-analyzer.lock.yml | 6 +++--- .github/workflows/update-rust-analyzer.md | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/update-rust-analyzer.lock.yml b/.github/workflows/update-rust-analyzer.lock.yml index 20f637d2a37a..087569e9c9e4 100644 --- a/.github/workflows/update-rust-analyzer.lock.yml +++ b/.github/workflows/update-rust-analyzer.lock.yml @@ -1,4 +1,4 @@ -# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"db75e63ae5870d54f69bab035472bdbcdd398bf5b068490976596e0f765d4b65","body_hash":"990718b1868afabca459556cc701c1d0ef315857b226b054dfe36037ea0c6371","compiler_version":"v0.88.7","strict":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.80"}} +# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"583eb1f28bb89d6fe6bc224f639ddb76e04e57c00c17d02df5183320edadabcd","body_hash":"990718b1868afabca459556cc701c1d0ef315857b226b054dfe36037ea0c6371","compiler_version":"v0.88.7","strict":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.80"}} # gh-aw-manifest: {"version":1,"secrets":["GH_AW_CI_TRIGGER_TOKEN","GH_AW_DEFAULT_OTLP_HEADERS","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/cache/restore","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/cache/save","sha":"55cc8345863c7cc4c66a329aec7e433d2d1c52a9","version":"v6.1.0"},{"repo":"actions/checkout","sha":"3d3c42e5aac5ba805825da76410c181273ba90b1","version":"v7.0.1"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"820762786026740c76f36085b0efc47a31fe5020","version":"v7.0.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"github/gh-aw-actions/setup","sha":"5e508589e03a7757a7e05b26e834292f5445bfb6","version":"v0.88.7"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.28.14","digest":"sha256:f7df036c86575527b61f3f7df91c4412349a12b2a74988d929eafa2999230c98","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.28.14@sha256:f7df036c86575527b61f3f7df91c4412349a12b2a74988d929eafa2999230c98"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.14","digest":"sha256:6f95e2234dd9bd6333a8ff28ccea7ecf0204acd4a09108723844dbd2bf6268c5","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.28.14@sha256:6f95e2234dd9bd6333a8ff28ccea7ecf0204acd4a09108723844dbd2bf6268c5"},{"image":"ghcr.io/github/gh-aw-firewall/cli-proxy:0.28.14","digest":"sha256:3a379c5e96e29499c815e9dd2a71334d01c326a9b73991c76544fda9cae35c34","pinned_image":"ghcr.io/github/gh-aw-firewall/cli-proxy:0.28.14@sha256:3a379c5e96e29499c815e9dd2a71334d01c326a9b73991c76544fda9cae35c34"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.28.14","digest":"sha256:2ce8df3abf3e9b76e9c0cf5863da41f1ab3f89b20ad14b988806ab89e7bf2cd5","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.28.14@sha256:2ce8df3abf3e9b76e9c0cf5863da41f1ab3f89b20ad14b988806ab89e7bf2cd5"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.4.18","digest":"sha256:85b940556a8faa4e1fdbef124bfd75f2c4ebd855a10b88a1c3b6f3e97f6f1a53","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.4.18@sha256:85b940556a8faa4e1fdbef124bfd75f2c4ebd855a10b88a1c3b6f3e97f6f1a53"},{"image":"ghcr.io/github/gh-aw-node","digest":"sha256:0daa8971fa4732b647150cb6524a6b0804b68d5d24f6f58b5dd1af23bd63fb23","pinned_image":"ghcr.io/github/gh-aw-node@sha256:0daa8971fa4732b647150cb6524a6b0804b68d5d24f6f58b5dd1af23bd63fb23"},{"image":"ghcr.io/github/github-mcp-server:v1.11.0","digest":"sha256:fbec75de11c255213fa08d80fb166abe73d851fff631c51c0079872967720699","pinned_image":"ghcr.io/github/github-mcp-server:v1.11.0@sha256:fbec75de11c255213fa08d80fb166abe73d851fff631c51c0079872967720699"}],"mcp_servers":[{"name":"safeoutputs","tools":["create_pull_request","missing_data","missing_tool","noop"]}]} # This file was automatically generated by gh-aw (v0.88.7). DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md # @@ -540,7 +540,7 @@ jobs: env: GH_AW_FILE_ROOT: "${{ runner.temp }}/gh-aw" GH_AW_FILE_CONFIG: "{\"files\":[{\"path\":\"safeoutputs/config.json\",\"content_env\":\"GH_AW_SAFE_OUTPUTS_CONFIG\"}]}" - GH_AW_SAFE_OUTPUTS_CONFIG: "{\"create_pull_request\":{\"allowed_files\":[\"Cargo.lock\",\"shared/tree-sitter-extractor/Cargo.toml\",\"shared/yeast/Cargo.toml\",\"shared/yeast-macros/Cargo.toml\",\"shared/yeast-schema/Cargo.toml\",\"ruby/extractor/Cargo.toml\",\"unified/extractor/Cargo.toml\",\"unified/swift-syntax-rs/Cargo.toml\",\"MODULE.bazel\",\"MODULE.bazel.lock\",\"rust-toolchain.toml\",\"rust/**\",\"misc/bazel/3rdparty/**\"],\"branch_prefix\":\"automation/update-rust-analyzer/\",\"draft\":true,\"max\":1,\"max_patch_files\":1000,\"max_patch_size\":10240,\"protect_top_level_dot_folders\":true,\"protected_files\":[\"package.json\",\"bun.lockb\",\"bunfig.toml\",\"deno.json\",\"deno.jsonc\",\"deno.lock\",\"global.json\",\"NuGet.Config\",\"Directory.Packages.props\",\"mix.exs\",\"mix.lock\",\"go.mod\",\"go.sum\",\"stack.yaml\",\"stack.yaml.lock\",\"pom.xml\",\"build.gradle\",\"build.gradle.kts\",\"settings.gradle\",\"settings.gradle.kts\",\"gradle.properties\",\"package-lock.json\",\"yarn.lock\",\"pnpm-lock.yaml\",\"npm-shrinkwrap.json\",\"requirements.txt\",\"Pipfile\",\"Pipfile.lock\",\"pyproject.toml\",\"setup.py\",\"setup.cfg\",\"Gemfile\",\"Gemfile.lock\",\"uv.lock\",\"CODEOWNERS\",\"DESIGN.md\",\"README.md\",\"CONTRIBUTING.md\",\"CHANGELOG.md\",\"SECURITY.md\",\"CODE_OF_CONDUCT.md\",\"AGENTS.md\"],\"protected_files_policy\":\"allowed\",\"title_prefix\":\"Rust: \"},\"create_report_incomplete_issue\":{\"title-prefix\":\"[incomplete]\"},\"missing_data\":{},\"missing_tool\":{},\"noop\":{\"max\":1,\"report-as-issue\":\"false\"},\"report_incomplete\":{}}" + GH_AW_SAFE_OUTPUTS_CONFIG: "{\"create_pull_request\":{\"allowed_files\":[\"Cargo.lock\",\"shared/tree-sitter-extractor/Cargo.toml\",\"shared/yeast/Cargo.toml\",\"shared/yeast-macros/Cargo.toml\",\"shared/yeast-schema/Cargo.toml\",\"ruby/extractor/Cargo.toml\",\"unified/extractor/Cargo.toml\",\"unified/swift-syntax-rs/Cargo.toml\",\"MODULE.bazel\",\"MODULE.bazel.lock\",\"rust-toolchain.toml\",\"rust/**\",\"misc/bazel/3rdparty/**\"],\"branch_prefix\":\"automation/update-rust-analyzer/\",\"draft\":true,\"max\":1,\"max_patch_files\":1000,\"max_patch_size\":10240,\"protect_top_level_dot_folders\":true,\"protected_files\":[\"package.json\",\"bun.lockb\",\"bunfig.toml\",\"deno.json\",\"deno.jsonc\",\"deno.lock\",\"global.json\",\"NuGet.Config\",\"Directory.Packages.props\",\"mix.exs\",\"mix.lock\",\"go.mod\",\"go.sum\",\"stack.yaml\",\"stack.yaml.lock\",\"pom.xml\",\"build.gradle\",\"build.gradle.kts\",\"settings.gradle\",\"settings.gradle.kts\",\"gradle.properties\",\"package-lock.json\",\"yarn.lock\",\"pnpm-lock.yaml\",\"npm-shrinkwrap.json\",\"requirements.txt\",\"Pipfile\",\"Pipfile.lock\",\"pyproject.toml\",\"setup.py\",\"setup.cfg\",\"Gemfile\",\"Gemfile.lock\",\"uv.lock\",\"CODEOWNERS\",\"DESIGN.md\",\"README.md\",\"CONTRIBUTING.md\",\"CHANGELOG.md\",\"SECURITY.md\",\"CODE_OF_CONDUCT.md\",\"AGENTS.md\"],\"protected_files_policy\":\"request_review\",\"title_prefix\":\"Rust: \"},\"create_report_incomplete_issue\":{\"title-prefix\":\"[incomplete]\"},\"missing_data\":{},\"missing_tool\":{},\"noop\":{\"max\":1,\"report-as-issue\":\"false\"},\"report_incomplete\":{}}" with: script: | const path = require('path'); @@ -1799,7 +1799,7 @@ jobs: GH_AW_ALLOWED_DOMAINS: "*.githubusercontent.com,*.pythonhosted.org,anaconda.org,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,bcr.bazel.build,binstar.org,blog.bazel.build,bootstrap.pypa.io,codeload.github.com,conda.anaconda.org,conda.binstar.org,crates.io,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,docs.github.com,files.pythonhosted.org,github-cloud.githubusercontent.com,github-cloud.s3.amazonaws.com,github.blog,github.com,github.githubassets.com,index.crates.io,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,lfs.github.com,mirror.bazel.build,objects.githubusercontent.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,patch-diff.githubusercontent.com,patchdiff.githubusercontent.com,pip.pypa.io,ppa.launchpad.net,productionresultssa0.blob.core.windows.net,productionresultssa1.blob.core.windows.net,productionresultssa10.blob.core.windows.net,productionresultssa11.blob.core.windows.net,productionresultssa12.blob.core.windows.net,productionresultssa13.blob.core.windows.net,productionresultssa14.blob.core.windows.net,productionresultssa15.blob.core.windows.net,productionresultssa16.blob.core.windows.net,productionresultssa17.blob.core.windows.net,productionresultssa18.blob.core.windows.net,productionresultssa19.blob.core.windows.net,productionresultssa2.blob.core.windows.net,productionresultssa3.blob.core.windows.net,productionresultssa4.blob.core.windows.net,productionresultssa5.blob.core.windows.net,productionresultssa6.blob.core.windows.net,productionresultssa7.blob.core.windows.net,productionresultssa8.blob.core.windows.net,productionresultssa9.blob.core.windows.net,pypi.org,pypi.python.org,raw.githubusercontent.com,releases.bazel.build,repo.anaconda.com,repo.continuum.io,s.symcb.com,s.symcd.com,security.ubuntu.com,sh.rustup.rs,static.crates.io,static.rust-lang.org,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com,www.googleapis.com" GITHUB_SERVER_URL: ${{ github.server_url }} GITHUB_API_URL: ${{ github.api_url }} - GH_AW_SAFE_OUTPUTS_HANDLER_CONFIG: "{\"create_pull_request\":{\"allowed_files\":[\"Cargo.lock\",\"shared/tree-sitter-extractor/Cargo.toml\",\"shared/yeast/Cargo.toml\",\"shared/yeast-macros/Cargo.toml\",\"shared/yeast-schema/Cargo.toml\",\"ruby/extractor/Cargo.toml\",\"unified/extractor/Cargo.toml\",\"unified/swift-syntax-rs/Cargo.toml\",\"MODULE.bazel\",\"MODULE.bazel.lock\",\"rust-toolchain.toml\",\"rust/**\",\"misc/bazel/3rdparty/**\"],\"branch_prefix\":\"automation/update-rust-analyzer/\",\"draft\":true,\"max\":1,\"max_patch_files\":1000,\"max_patch_size\":10240,\"protect_top_level_dot_folders\":true,\"protected_files\":[\"package.json\",\"bun.lockb\",\"bunfig.toml\",\"deno.json\",\"deno.jsonc\",\"deno.lock\",\"global.json\",\"NuGet.Config\",\"Directory.Packages.props\",\"mix.exs\",\"mix.lock\",\"go.mod\",\"go.sum\",\"stack.yaml\",\"stack.yaml.lock\",\"pom.xml\",\"build.gradle\",\"build.gradle.kts\",\"settings.gradle\",\"settings.gradle.kts\",\"gradle.properties\",\"package-lock.json\",\"yarn.lock\",\"pnpm-lock.yaml\",\"npm-shrinkwrap.json\",\"requirements.txt\",\"Pipfile\",\"Pipfile.lock\",\"pyproject.toml\",\"setup.py\",\"setup.cfg\",\"Gemfile\",\"Gemfile.lock\",\"uv.lock\",\"CODEOWNERS\",\"DESIGN.md\",\"README.md\",\"CONTRIBUTING.md\",\"CHANGELOG.md\",\"SECURITY.md\",\"CODE_OF_CONDUCT.md\",\"AGENTS.md\"],\"protected_files_policy\":\"allowed\",\"title_prefix\":\"Rust: \"},\"create_report_incomplete_issue\":{\"title-prefix\":\"[incomplete]\"},\"missing_data\":{},\"missing_tool\":{},\"noop\":{\"max\":1,\"report-as-issue\":\"false\"},\"report_incomplete\":{}}" + GH_AW_SAFE_OUTPUTS_HANDLER_CONFIG: "{\"create_pull_request\":{\"allowed_files\":[\"Cargo.lock\",\"shared/tree-sitter-extractor/Cargo.toml\",\"shared/yeast/Cargo.toml\",\"shared/yeast-macros/Cargo.toml\",\"shared/yeast-schema/Cargo.toml\",\"ruby/extractor/Cargo.toml\",\"unified/extractor/Cargo.toml\",\"unified/swift-syntax-rs/Cargo.toml\",\"MODULE.bazel\",\"MODULE.bazel.lock\",\"rust-toolchain.toml\",\"rust/**\",\"misc/bazel/3rdparty/**\"],\"branch_prefix\":\"automation/update-rust-analyzer/\",\"draft\":true,\"max\":1,\"max_patch_files\":1000,\"max_patch_size\":10240,\"protect_top_level_dot_folders\":true,\"protected_files\":[\"package.json\",\"bun.lockb\",\"bunfig.toml\",\"deno.json\",\"deno.jsonc\",\"deno.lock\",\"global.json\",\"NuGet.Config\",\"Directory.Packages.props\",\"mix.exs\",\"mix.lock\",\"go.mod\",\"go.sum\",\"stack.yaml\",\"stack.yaml.lock\",\"pom.xml\",\"build.gradle\",\"build.gradle.kts\",\"settings.gradle\",\"settings.gradle.kts\",\"gradle.properties\",\"package-lock.json\",\"yarn.lock\",\"pnpm-lock.yaml\",\"npm-shrinkwrap.json\",\"requirements.txt\",\"Pipfile\",\"Pipfile.lock\",\"pyproject.toml\",\"setup.py\",\"setup.cfg\",\"Gemfile\",\"Gemfile.lock\",\"uv.lock\",\"CODEOWNERS\",\"DESIGN.md\",\"README.md\",\"CONTRIBUTING.md\",\"CHANGELOG.md\",\"SECURITY.md\",\"CODE_OF_CONDUCT.md\",\"AGENTS.md\"],\"protected_files_policy\":\"request_review\",\"title_prefix\":\"Rust: \"},\"create_report_incomplete_issue\":{\"title-prefix\":\"[incomplete]\"},\"missing_data\":{},\"missing_tool\":{},\"noop\":{\"max\":1,\"report-as-issue\":\"false\"},\"report_incomplete\":{}}" GH_AW_CI_TRIGGER_TOKEN: ${{ secrets.GH_AW_CI_TRIGGER_TOKEN }} with: github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/update-rust-analyzer.md b/.github/workflows/update-rust-analyzer.md index c47725406aa7..970f5197ee01 100644 --- a/.github/workflows/update-rust-analyzer.md +++ b/.github/workflows/update-rust-analyzer.md @@ -64,7 +64,6 @@ safe-outputs: title-prefix: "Rust: " branch-prefix: "automation/update-rust-analyzer/" draft: true - protected-files: allowed max-patch-size: 10240 max-patch-files: 1000 allowed-files: From 0aba99ba3a21410857055f3398a058a2542b2348 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Wed, 16 Sep 2026 14:24:39 +0200 Subject: [PATCH 1070/2098] Inline expectations: Ignore results in files outside the source dir --- .../ActionsInlineExpectationsTestQuery.ql | 12 ++++----- .../utils/test/InlineExpectationsTestQuery.ql | 14 +--------- .../internal/InlineExpectationsTestImpl.qll | 10 +++++++ .../utils/test/InlineExpectationsTestQuery.ql | 14 +--------- .../internal/InlineExpectationsTestImpl.qll | 10 +++++++ .../utils/test/InlineExpectationsTestQuery.ql | 14 +--------- .../internal/InlineExpectationsTestImpl.qll | 10 +++++++ .../utils/test/InlineExpectationsTestQuery.ql | 14 +--------- .../internal/InlineExpectationsTestImpl.qll | 10 +++++++ .../internal/InlineExpectationsTestImpl.qll | 10 +++++++ .../internal/InlineExpectationsTestImpl.qll | 10 +++++++ .../utils/test/InlineExpectationsTestQuery.ql | 14 +--------- .../internal/InlineExpectationsTestImpl.qll | 10 +++++++ .../utils/test/InlineExpectationsTestQuery.ql | 14 +--------- .../internal/InlineExpectationsTestImpl.qll | 10 +++++++ .../utils/test/InlineExpectationsTestQuery.ql | 14 +--------- .../internal/InlineExpectationsTestImpl.qll | 10 +++++++ .../utils/test/InlineExpectationsTestQuery.ql | 14 +--------- .../internal/InlineExpectationsTestImpl.qll | 10 +++++++ .../utils/test/InlineExpectationsTestQuery.ql | 14 +--------- .../internal/InlineExpectationsTestImpl.qll | 10 +++++++ .../util/test/InlineExpectationsTest.qll | 27 +++++++++++-------- .../utils/test/InlineExpectationsTestQuery.ql | 14 +--------- .../internal/InlineExpectationsTestImpl.qll | 10 +++++++ .../utils/test/InlineExpectationsTestQuery.ql | 14 +--------- .../internal/InlineExpectationsTestImpl.qll | 10 +++++++ 26 files changed, 162 insertions(+), 161 deletions(-) diff --git a/actions/ql/test/utils/ActionsInlineExpectationsTestQuery.ql b/actions/ql/test/utils/ActionsInlineExpectationsTestQuery.ql index a67c200cf117..cf23944f553d 100644 --- a/actions/ql/test/utils/ActionsInlineExpectationsTestQuery.ql +++ b/actions/ql/test/utils/ActionsInlineExpectationsTestQuery.ql @@ -10,12 +10,6 @@ import T::TestPostProcessing private module Impl implements T::InlineExpectationsTestSig { class Location = Locations::Location; - class ExpectationComment extends Yaml::YamlComment { - string getContents() { result = this.getText() } - } -} - -private module Input implements T::TestPostProcessing::InputSig { string getRelativeUrl(Locations::Location location) { exists(int startLine, int startColumn, int endLine, int endColumn | location.hasLocationInfo(_, startLine, startColumn, endLine, endColumn) @@ -25,6 +19,10 @@ private module Input implements T::TestPostProcessing::InputSig { ":" + endColumn ) } + + class ExpectationComment extends Yaml::YamlComment { + string getContents() { result = this.getText() } + } } -import T::TestPostProcessing::Make +import T::TestPostProcessing::Make diff --git a/cpp/ql/lib/utils/test/InlineExpectationsTestQuery.ql b/cpp/ql/lib/utils/test/InlineExpectationsTestQuery.ql index 8e6977ba5321..e71d67bc528c 100644 --- a/cpp/ql/lib/utils/test/InlineExpectationsTestQuery.ql +++ b/cpp/ql/lib/utils/test/InlineExpectationsTestQuery.ql @@ -6,16 +6,4 @@ private import cpp private import codeql.util.test.InlineExpectationsTest as T private import internal.InlineExpectationsTestImpl import T::TestPostProcessing -import T::TestPostProcessing::Make - -private module Input implements T::TestPostProcessing::InputSig { - string getRelativeUrl(Location location) { - exists(File f, int startline, int startcolumn, int endline, int endcolumn | - location.hasLocationInfo(_, startline, startcolumn, endline, endcolumn) and - f = location.getFile() - | - result = - f.getRelativePath() + ":" + startline + ":" + startcolumn + ":" + endline + ":" + endcolumn - ) - } -} +import T::TestPostProcessing::Make diff --git a/cpp/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll b/cpp/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll index d2c8efbf3165..18493c8ad19c 100644 --- a/cpp/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll +++ b/cpp/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll @@ -25,4 +25,14 @@ module Impl implements InlineExpectationsTestSig { } class Location = C::Location; + + string getRelativeUrl(Location location) { + exists(C::File f, int startline, int startcolumn, int endline, int endcolumn | + location.hasLocationInfo(_, startline, startcolumn, endline, endcolumn) and + f = location.getFile() + | + result = + f.getRelativePath() + ":" + startline + ":" + startcolumn + ":" + endline + ":" + endcolumn + ) + } } diff --git a/csharp/ql/lib/utils/test/InlineExpectationsTestQuery.ql b/csharp/ql/lib/utils/test/InlineExpectationsTestQuery.ql index 35901ee64012..1c5be4160ae0 100644 --- a/csharp/ql/lib/utils/test/InlineExpectationsTestQuery.ql +++ b/csharp/ql/lib/utils/test/InlineExpectationsTestQuery.ql @@ -6,16 +6,4 @@ private import csharp private import codeql.util.test.InlineExpectationsTest as T private import internal.InlineExpectationsTestImpl import T::TestPostProcessing -import T::TestPostProcessing::Make - -private module Input implements T::TestPostProcessing::InputSig { - string getRelativeUrl(Location location) { - exists(File f, int startline, int startcolumn, int endline, int endcolumn | - location.hasLocationInfo(_, startline, startcolumn, endline, endcolumn) and - f = location.getFile() - | - result = - f.getRelativePath() + ":" + startline + ":" + startcolumn + ":" + endline + ":" + endcolumn - ) - } -} +import T::TestPostProcessing::Make diff --git a/csharp/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll b/csharp/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll index 6916c5f61067..f623d683dca6 100644 --- a/csharp/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll +++ b/csharp/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll @@ -49,4 +49,14 @@ module Impl implements InlineExpectationsTestSig { } class Location = CS::Location; + + string getRelativeUrl(Location location) { + exists(CS::File f, int startline, int startcolumn, int endline, int endcolumn | + location.hasLocationInfo(_, startline, startcolumn, endline, endcolumn) and + f = location.getFile() + | + result = + f.getRelativePath() + ":" + startline + ":" + startcolumn + ":" + endline + ":" + endcolumn + ) + } } diff --git a/go/ql/lib/utils/test/InlineExpectationsTestQuery.ql b/go/ql/lib/utils/test/InlineExpectationsTestQuery.ql index 1cf2f5ea1d9b..0d7462c57056 100644 --- a/go/ql/lib/utils/test/InlineExpectationsTestQuery.ql +++ b/go/ql/lib/utils/test/InlineExpectationsTestQuery.ql @@ -6,16 +6,4 @@ private import go private import codeql.util.test.InlineExpectationsTest as T private import internal.InlineExpectationsTestImpl import T::TestPostProcessing -import T::TestPostProcessing::Make - -private module Input implements T::TestPostProcessing::InputSig { - string getRelativeUrl(Location location) { - exists(File f, int startline, int startcolumn, int endline, int endcolumn | - location.hasLocationInfo(_, startline, startcolumn, endline, endcolumn) and - f = location.getFile() - | - result = - f.getRelativePath() + ":" + startline + ":" + startcolumn + ":" + endline + ":" + endcolumn - ) - } -} +import T::TestPostProcessing::Make diff --git a/go/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll b/go/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll index 3bdc948842c7..3084c4846795 100644 --- a/go/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll +++ b/go/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll @@ -20,4 +20,14 @@ module Impl implements InlineExpectationsTestSig { } class Location = G::Location; + + string getRelativeUrl(Location location) { + exists(G::File f, int startline, int startcolumn, int endline, int endcolumn | + location.hasLocationInfo(_, startline, startcolumn, endline, endcolumn) and + f = location.getFile() + | + result = + f.getRelativePath() + ":" + startline + ":" + startcolumn + ":" + endline + ":" + endcolumn + ) + } } diff --git a/java/ql/lib/utils/test/InlineExpectationsTestQuery.ql b/java/ql/lib/utils/test/InlineExpectationsTestQuery.ql index b0360dfecd8d..72cbb9c4148a 100644 --- a/java/ql/lib/utils/test/InlineExpectationsTestQuery.ql +++ b/java/ql/lib/utils/test/InlineExpectationsTestQuery.ql @@ -6,16 +6,4 @@ private import java private import codeql.util.test.InlineExpectationsTest as T private import internal.InlineExpectationsTestImpl import T::TestPostProcessing -import T::TestPostProcessing::Make - -private module Input implements T::TestPostProcessing::InputSig { - string getRelativeUrl(Location location) { - exists(File f, int startline, int startcolumn, int endline, int endcolumn | - location.hasLocationInfo(_, startline, startcolumn, endline, endcolumn) and - f = location.getFile() - | - result = - f.getRelativePath() + ":" + startline + ":" + startcolumn + ":" + endline + ":" + endcolumn - ) - } -} +import T::TestPostProcessing::Make diff --git a/java/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll b/java/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll index 446b6a544c34..9a51a70eda60 100644 --- a/java/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll +++ b/java/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll @@ -35,4 +35,14 @@ module Impl implements InlineExpectationsTestSig { } class Location = J::Location; + + string getRelativeUrl(Location location) { + exists(J::File f, int startline, int startcolumn, int endline, int endcolumn | + location.hasLocationInfo(_, startline, startcolumn, endline, endcolumn) and + f = location.getFile() + | + result = + f.getRelativePath() + ":" + startline + ":" + startcolumn + ":" + endline + ":" + endcolumn + ) + } } diff --git a/java/ql/test-kotlin1/TestUtilities/internal/InlineExpectationsTestImpl.qll b/java/ql/test-kotlin1/TestUtilities/internal/InlineExpectationsTestImpl.qll index cd62fdb757e0..646501a84c91 100644 --- a/java/ql/test-kotlin1/TestUtilities/internal/InlineExpectationsTestImpl.qll +++ b/java/ql/test-kotlin1/TestUtilities/internal/InlineExpectationsTestImpl.qll @@ -32,4 +32,14 @@ module Impl implements InlineExpectationsTestSig { } class Location = J::Location; + + string getRelativeUrl(Location location) { + exists(J::File f, int startline, int startcolumn, int endline, int endcolumn | + location.hasLocationInfo(_, startline, startcolumn, endline, endcolumn) and + f = location.getFile() + | + result = + f.getRelativePath() + ":" + startline + ":" + startcolumn + ":" + endline + ":" + endcolumn + ) + } } diff --git a/java/ql/test-kotlin2/TestUtilities/internal/InlineExpectationsTestImpl.qll b/java/ql/test-kotlin2/TestUtilities/internal/InlineExpectationsTestImpl.qll index cd62fdb757e0..646501a84c91 100644 --- a/java/ql/test-kotlin2/TestUtilities/internal/InlineExpectationsTestImpl.qll +++ b/java/ql/test-kotlin2/TestUtilities/internal/InlineExpectationsTestImpl.qll @@ -32,4 +32,14 @@ module Impl implements InlineExpectationsTestSig { } class Location = J::Location; + + string getRelativeUrl(Location location) { + exists(J::File f, int startline, int startcolumn, int endline, int endcolumn | + location.hasLocationInfo(_, startline, startcolumn, endline, endcolumn) and + f = location.getFile() + | + result = + f.getRelativePath() + ":" + startline + ":" + startcolumn + ":" + endline + ":" + endcolumn + ) + } } diff --git a/javascript/ql/lib/utils/test/InlineExpectationsTestQuery.ql b/javascript/ql/lib/utils/test/InlineExpectationsTestQuery.ql index 55892be75d79..068f69d0013c 100644 --- a/javascript/ql/lib/utils/test/InlineExpectationsTestQuery.ql +++ b/javascript/ql/lib/utils/test/InlineExpectationsTestQuery.ql @@ -6,16 +6,4 @@ private import javascript private import codeql.util.test.InlineExpectationsTest as T private import internal.InlineExpectationsTestImpl import T::TestPostProcessing -import T::TestPostProcessing::Make - -private module Input implements T::TestPostProcessing::InputSig { - string getRelativeUrl(Location location) { - exists(File f, int startline, int startcolumn, int endline, int endcolumn | - location.hasLocationInfo(_, startline, startcolumn, endline, endcolumn) and - f = location.getFile() - | - result = - f.getRelativePath() + ":" + startline + ":" + startcolumn + ":" + endline + ":" + endcolumn - ) - } -} +import T::TestPostProcessing::Make diff --git a/javascript/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll b/javascript/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll index 42eb94230ae6..d73cdcd321b5 100644 --- a/javascript/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll +++ b/javascript/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll @@ -8,6 +8,16 @@ module Impl implements InlineExpectationsTestSig { class Location = JS::Location; + string getRelativeUrl(Location location) { + exists(JS::File f, int startline, int startcolumn, int endline, int endcolumn | + location.hasLocationInfo(_, startline, startcolumn, endline, endcolumn) and + f = location.getFile() + | + result = + f.getRelativePath() + ":" + startline + ":" + startcolumn + ":" + endline + ":" + endcolumn + ) + } + abstract private class ExpectationCommentImpl extends Locatable { abstract string getContents(); diff --git a/python/ql/lib/utils/test/InlineExpectationsTestQuery.ql b/python/ql/lib/utils/test/InlineExpectationsTestQuery.ql index 9ce5fdf326ca..fa37afa388c0 100644 --- a/python/ql/lib/utils/test/InlineExpectationsTestQuery.ql +++ b/python/ql/lib/utils/test/InlineExpectationsTestQuery.ql @@ -6,16 +6,4 @@ private import python private import codeql.util.test.InlineExpectationsTest as T private import internal.InlineExpectationsTestImpl import T::TestPostProcessing -import T::TestPostProcessing::Make - -private module Input implements T::TestPostProcessing::InputSig { - string getRelativeUrl(Location location) { - exists(File f, int startline, int startcolumn, int endline, int endcolumn | - location.hasLocationInfo(_, startline, startcolumn, endline, endcolumn) and - f = location.getFile() - | - result = - f.getRelativePath() + ":" + startline + ":" + startcolumn + ":" + endline + ":" + endcolumn - ) - } -} +import T::TestPostProcessing::Make diff --git a/python/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll b/python/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll index ea8faaeeae31..bc8c66cba5f3 100644 --- a/python/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll +++ b/python/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll @@ -9,4 +9,14 @@ module Impl implements InlineExpectationsTestSig { class ExpectationComment = PY::Comment; class Location = PY::Location; + + string getRelativeUrl(Location location) { + exists(PY::File f, int startline, int startcolumn, int endline, int endcolumn | + location.hasLocationInfo(_, startline, startcolumn, endline, endcolumn) and + f = location.getFile() + | + result = + f.getRelativePath() + ":" + startline + ":" + startcolumn + ":" + endline + ":" + endcolumn + ) + } } diff --git a/ql/ql/src/utils/test/InlineExpectationsTestQuery.ql b/ql/ql/src/utils/test/InlineExpectationsTestQuery.ql index 979839480e1d..b5c70edad177 100644 --- a/ql/ql/src/utils/test/InlineExpectationsTestQuery.ql +++ b/ql/ql/src/utils/test/InlineExpectationsTestQuery.ql @@ -6,16 +6,4 @@ private import ql private import codeql.util.test.InlineExpectationsTest as T private import internal.InlineExpectationsTestImpl import T::TestPostProcessing -import T::TestPostProcessing::Make - -private module Input implements T::TestPostProcessing::InputSig { - string getRelativeUrl(Location location) { - exists(File f, int startline, int startcolumn, int endline, int endcolumn | - location.hasLocationInfo(_, startline, startcolumn, endline, endcolumn) and - f = location.getFile() - | - result = - f.getRelativePath() + ":" + startline + ":" + startcolumn + ":" + endline + ":" + endcolumn - ) - } -} +import T::TestPostProcessing::Make diff --git a/ql/ql/src/utils/test/internal/InlineExpectationsTestImpl.qll b/ql/ql/src/utils/test/internal/InlineExpectationsTestImpl.qll index 647ddd5a87db..88a30d0d4c7a 100644 --- a/ql/ql/src/utils/test/internal/InlineExpectationsTestImpl.qll +++ b/ql/ql/src/utils/test/internal/InlineExpectationsTestImpl.qll @@ -25,4 +25,14 @@ module Impl implements InlineExpectationsTestSig { } class Location = QL::Location; + + string getRelativeUrl(Location location) { + exists(QL::File f, int startline, int startcolumn, int endline, int endcolumn | + location.hasLocationInfo(_, startline, startcolumn, endline, endcolumn) and + f = location.getFile() + | + result = + f.getRelativePath() + ":" + startline + ":" + startcolumn + ":" + endline + ":" + endcolumn + ) + } } diff --git a/ruby/ql/lib/utils/test/InlineExpectationsTestQuery.ql b/ruby/ql/lib/utils/test/InlineExpectationsTestQuery.ql index 1cbc37a7fe85..08768162c173 100644 --- a/ruby/ql/lib/utils/test/InlineExpectationsTestQuery.ql +++ b/ruby/ql/lib/utils/test/InlineExpectationsTestQuery.ql @@ -6,16 +6,4 @@ private import ruby private import codeql.util.test.InlineExpectationsTest as T private import internal.InlineExpectationsTestImpl import T::TestPostProcessing -import T::TestPostProcessing::Make - -private module Input implements T::TestPostProcessing::InputSig { - string getRelativeUrl(Location location) { - exists(File f, int startline, int startcolumn, int endline, int endcolumn | - location.hasLocationInfo(_, startline, startcolumn, endline, endcolumn) and - f = location.getFile() - | - result = - f.getRelativePath() + ":" + startline + ":" + startcolumn + ":" + endline + ":" + endcolumn - ) - } -} +import T::TestPostProcessing::Make diff --git a/ruby/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll b/ruby/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll index bd84f530f9c3..d445c91d2e8f 100644 --- a/ruby/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll +++ b/ruby/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll @@ -36,4 +36,14 @@ module Impl implements InlineExpectationsTestSig { } class Location = R::Location; + + string getRelativeUrl(Location location) { + exists(R::File f, int startline, int startcolumn, int endline, int endcolumn | + location.hasLocationInfo(_, startline, startcolumn, endline, endcolumn) and + f = location.getFile() + | + result = + f.getRelativePath() + ":" + startline + ":" + startcolumn + ":" + endline + ":" + endcolumn + ) + } } diff --git a/rust/ql/lib/utils/test/InlineExpectationsTestQuery.ql b/rust/ql/lib/utils/test/InlineExpectationsTestQuery.ql index e5821ba4f50c..d97f49cb382f 100644 --- a/rust/ql/lib/utils/test/InlineExpectationsTestQuery.ql +++ b/rust/ql/lib/utils/test/InlineExpectationsTestQuery.ql @@ -6,16 +6,4 @@ private import rust private import codeql.util.test.InlineExpectationsTest as T private import internal.InlineExpectationsTestImpl import T::TestPostProcessing -import T::TestPostProcessing::Make - -private module Input implements T::TestPostProcessing::InputSig { - string getRelativeUrl(Location location) { - exists(File f, int startline, int startcolumn, int endline, int endcolumn | - location.hasLocationInfo(_, startline, startcolumn, endline, endcolumn) and - f = location.getFile() - | - result = - f.getRelativePath() + ":" + startline + ":" + startcolumn + ":" + endline + ":" + endcolumn - ) - } -} +import T::TestPostProcessing::Make diff --git a/rust/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll b/rust/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll index c189e1c7e80e..5dc1dbaeb03d 100644 --- a/rust/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll +++ b/rust/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll @@ -11,4 +11,14 @@ module Impl implements InlineExpectationsTestSig { } class Location = R::Location; + + string getRelativeUrl(Location location) { + exists(R::File f, int startline, int startcolumn, int endline, int endcolumn | + location.hasLocationInfo(_, startline, startcolumn, endline, endcolumn) and + f = location.getFile() + | + result = + f.getRelativePath() + ":" + startline + ":" + startcolumn + ":" + endline + ":" + endcolumn + ) + } } diff --git a/shared/util/codeql/util/test/InlineExpectationsTest.qll b/shared/util/codeql/util/test/InlineExpectationsTest.qll index 4e0b2f678449..21c8c3a39f64 100644 --- a/shared/util/codeql/util/test/InlineExpectationsTest.qll +++ b/shared/util/codeql/util/test/InlineExpectationsTest.qll @@ -108,6 +108,9 @@ signature module InlineExpectationsTestSig { ); } + /** Gets the relative URL of the given location, if any. */ + string getRelativeUrl(Location location); + /** A comment that may contain inline expectations. */ class ExpectationComment { /** Gets the contents of this comment, _excluding_ the comment indicator. */ @@ -242,9 +245,13 @@ module Make { TActualResult( Impl::Location location, string element, string tag, string value, boolean optional ) { - TestImpl::hasActualResult(location, element, tag, value) and optional = false - or - TestImpl::hasOptionalResult(location, element, tag, value) and optional = true + ( + TestImpl::hasActualResult(location, element, tag, value) and optional = false + or + TestImpl::hasOptionalResult(location, element, tag, value) and optional = true + ) and + // test expectations can only be defined in source code + exists(Impl::getRelativeUrl(location)) } or TValidExpectation( Impl::ExpectationComment comment, string tag, string value, string knownFailure @@ -633,11 +640,7 @@ module TestPostProcessing { private string getQueryKind() { queryMetadata("kind", result) } - signature module InputSig { - string getRelativeUrl(Input::Location location); - } - - module Make Input2> { + module Make { private import InlineExpectationsTest as InlineExpectationsTest bindingset[loc] @@ -655,7 +658,7 @@ module TestPostProcessing { private string getRelativePathTo(string absolutePath) { exists(Input::Location loc | loc.hasLocationInfo(absolutePath, _, _, _, _) and - parseLocationString(Input2::getRelativeUrl(loc), result, _, _, _, _) + parseLocationString(Input::getRelativeUrl(loc), result, _, _, _, _) ) } @@ -665,7 +668,7 @@ module TestPostProcessing { exists(string data | queryResults(_, _, _, data) and parseLocationString(data, relativePath, sl, sc, el, ec) and - not Input2::getRelativeUrl(_) = data // avoid duplicate locations + not Input::getRelativeUrl(_) = data // avoid duplicate locations ) } @@ -711,7 +714,7 @@ module TestPostProcessing { LocationFromInput() { this = MkInputLocation(loc) } - override string getRelativeUrl() { result = Input2::getRelativeUrl(loc) } + override string getRelativeUrl() { result = Input::getRelativeUrl(loc) } override predicate hasLocationInfo(string file, int sl, int sc, int el, int ec) { loc.hasLocationInfo(file, sl, sc, el, ec) @@ -723,6 +726,8 @@ module TestPostProcessing { module TestImpl2 implements InlineExpectationsTestSig { final class Location = TestLocation; + string getRelativeUrl(Location location) { result = location.getRelativeUrl() } + final private class ExpectationCommentFinal = Input::ExpectationComment; class ExpectationComment extends ExpectationCommentFinal { diff --git a/swift/ql/lib/utils/test/InlineExpectationsTestQuery.ql b/swift/ql/lib/utils/test/InlineExpectationsTestQuery.ql index a7c112bc00e0..e41d9310e0bf 100644 --- a/swift/ql/lib/utils/test/InlineExpectationsTestQuery.ql +++ b/swift/ql/lib/utils/test/InlineExpectationsTestQuery.ql @@ -6,16 +6,4 @@ private import swift private import codeql.util.test.InlineExpectationsTest as T private import internal.InlineExpectationsTestImpl import T::TestPostProcessing -import T::TestPostProcessing::Make - -private module Input implements T::TestPostProcessing::InputSig { - string getRelativeUrl(Location location) { - exists(File f, int startline, int startcolumn, int endline, int endcolumn | - location.hasLocationInfo(_, startline, startcolumn, endline, endcolumn) and - f = location.getFile() - | - result = - f.getRelativePath() + ":" + startline + ":" + startcolumn + ":" + endline + ":" + endcolumn - ) - } -} +import T::TestPostProcessing::Make diff --git a/swift/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll b/swift/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll index b96f27c42ac2..718c118ef907 100644 --- a/swift/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll +++ b/swift/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll @@ -25,4 +25,14 @@ module Impl implements InlineExpectationsTestSig { } class Location = S::Location; + + string getRelativeUrl(Location location) { + exists(S::File f, int startline, int startcolumn, int endline, int endcolumn | + location.hasLocationInfo(_, startline, startcolumn, endline, endcolumn) and + f = location.getFile() + | + result = + f.getRelativePath() + ":" + startline + ":" + startcolumn + ":" + endline + ":" + endcolumn + ) + } } diff --git a/unified/ql/lib/utils/test/InlineExpectationsTestQuery.ql b/unified/ql/lib/utils/test/InlineExpectationsTestQuery.ql index 039194bc2e38..96e655dbecfb 100644 --- a/unified/ql/lib/utils/test/InlineExpectationsTestQuery.ql +++ b/unified/ql/lib/utils/test/InlineExpectationsTestQuery.ql @@ -6,16 +6,4 @@ private import unified private import codeql.util.test.InlineExpectationsTest as T private import internal.InlineExpectationsTestImpl import T::TestPostProcessing -import T::TestPostProcessing::Make - -private module Input implements T::TestPostProcessing::InputSig { - string getRelativeUrl(Location location) { - exists(File f, int startline, int startcolumn, int endline, int endcolumn | - location.hasLocationInfo(_, startline, startcolumn, endline, endcolumn) and - f = location.getFile() - | - result = - f.getRelativePath() + ":" + startline + ":" + startcolumn + ":" + endline + ":" + endcolumn - ) - } -} +import T::TestPostProcessing::Make diff --git a/unified/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll b/unified/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll index b73301687412..7379e1b94e66 100644 --- a/unified/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll +++ b/unified/ql/lib/utils/test/internal/InlineExpectationsTestImpl.qll @@ -9,4 +9,14 @@ module Impl implements InlineExpectationsTestSig { } class Location = U::Location; + + string getRelativeUrl(Location location) { + exists(File f, int startline, int startcolumn, int endline, int endcolumn | + location.hasLocationInfo(_, startline, startcolumn, endline, endcolumn) and + f = location.getFile() + | + result = + f.getRelativePath() + ":" + startline + ":" + startcolumn + ":" + endline + ":" + endcolumn + ) + } } From 7c8d3af9fffe079416812db00f6cddc87f56a82f Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Wed, 16 Sep 2026 20:03:41 +0200 Subject: [PATCH 1071/2098] C++: Remove inline expectation comment from included file --- cpp/ql/test/include/iterator.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cpp/ql/test/include/iterator.h b/cpp/ql/test/include/iterator.h index 5cd7f2312842..77758bfa8da6 100644 --- a/cpp/ql/test/include/iterator.h +++ b/cpp/ql/test/include/iterator.h @@ -65,7 +65,7 @@ namespace std { }; template - constexpr back_insert_iterator back_inserter(Container& x) { // $ ir-def=*x + constexpr back_insert_iterator back_inserter(Container& x) { return back_insert_iterator(x); } @@ -89,7 +89,7 @@ namespace std { constexpr front_insert_iterator operator++(int); }; template - constexpr front_insert_iterator front_inserter(Container& x) { // $ ir-def=*x + constexpr front_insert_iterator front_inserter(Container& x) { return front_insert_iterator(x); } } From 125836d345532fa4ce41e7ae782e2dfc7409c8d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jack=20N=C3=B8rskov=20J=C3=B8rgensen?= Date: Thu, 17 Sep 2026 09:28:21 +0200 Subject: [PATCH 1072/2098] Update test to match ticket version --- .../hapi/src/wrapped-route-cache.js | 7 +++ .../hapi/src/wrapped-route-configurator.js | 30 +++++++++++ .../hapi/src/wrapped-route-service.js | 15 ++++++ .../frameworks/hapi/src/wrapped-route.js | 52 ++++++------------- .../frameworks/hapi/tests.expected | 32 +++++++----- 5 files changed, 87 insertions(+), 49 deletions(-) create mode 100644 javascript/ql/test/library-tests/frameworks/hapi/src/wrapped-route-cache.js create mode 100644 javascript/ql/test/library-tests/frameworks/hapi/src/wrapped-route-configurator.js create mode 100644 javascript/ql/test/library-tests/frameworks/hapi/src/wrapped-route-service.js diff --git a/javascript/ql/test/library-tests/frameworks/hapi/src/wrapped-route-cache.js b/javascript/ql/test/library-tests/frameworks/hapi/src/wrapped-route-cache.js new file mode 100644 index 000000000000..7b1e7c59f008 --- /dev/null +++ b/javascript/ql/test/library-tests/frameworks/hapi/src/wrapped-route-cache.js @@ -0,0 +1,7 @@ +function createCached(fn) { + return async function (...args) { + return fn(...args); + }; +} + +module.exports = { createCached }; diff --git a/javascript/ql/test/library-tests/frameworks/hapi/src/wrapped-route-configurator.js b/javascript/ql/test/library-tests/frameworks/hapi/src/wrapped-route-configurator.js new file mode 100644 index 000000000000..fcb26aad8fa0 --- /dev/null +++ b/javascript/ql/test/library-tests/frameworks/hapi/src/wrapped-route-configurator.js @@ -0,0 +1,30 @@ +const endpoints = []; + +function apiEndpoint(method, path, handler) { + endpoints.push({ method, path, handler }); +} + +function createRouteConfig(method, path, handler) { + const hapiHandler = async function (request, h) { + return handler(request.params, request.query, request.payload); + }; + + return { + method, + path, + handler: hapiHandler, + }; +} + +function registerEndpoints(server, serviceInstance) { + for (const definition of endpoints) { + const wrapped = async (params, query, payload) => { + return definition.handler.call(serviceInstance, params, query, payload); + }; + + const config = createRouteConfig(definition.method, definition.path, wrapped); + server.route(config); + } +} + +module.exports = { apiEndpoint, registerEndpoints }; diff --git a/javascript/ql/test/library-tests/frameworks/hapi/src/wrapped-route-service.js b/javascript/ql/test/library-tests/frameworks/hapi/src/wrapped-route-service.js new file mode 100644 index 000000000000..9e495b8e0fde --- /dev/null +++ b/javascript/ql/test/library-tests/frameworks/hapi/src/wrapped-route-service.js @@ -0,0 +1,15 @@ +const { createCached } = require("./wrapped-route-cache"); + +class ReportService { + async runQuery(filter) { + sink(filter); + } +} + +const service = new ReportService(); + +const getReportCached = createCached(async function (filter) { + return service.runQuery(filter); +}); + +module.exports = { getReportCached }; diff --git a/javascript/ql/test/library-tests/frameworks/hapi/src/wrapped-route.js b/javascript/ql/test/library-tests/frameworks/hapi/src/wrapped-route.js index 15dc1ab26c16..319b57f8c348 100644 --- a/javascript/ql/test/library-tests/frameworks/hapi/src/wrapped-route.js +++ b/javascript/ql/test/library-tests/frameworks/hapi/src/wrapped-route.js @@ -1,42 +1,22 @@ -const Hapi = require("hapi"); - -const endpoints = []; - -function endpoint(handler) { - endpoints.push({ handler }); -} - -function routeConfig(handler) { - return { - handler: async function (request, h) { - return handler(request.query); - }, - }; -} - -function createCached(fn) { - return async function (...args) { - return fn(...args); - }; -} - -const cached = createCached(function (filter) { - sink(filter); -}); - -class Routes { - get(query) { - return cached(query.filter); +const Hapi = require("@hapi/hapi"); +const { + apiEndpoint, + registerEndpoints, +} = require("./wrapped-route-configurator"); +const { getReportCached } = require("./wrapped-route-service"); + +class ReportRoutes { + async getReport(params, query) { + return getReportCached(query.filter); } } -endpoint(Routes.prototype.get); +apiEndpoint("GET", "/reports", ReportRoutes.prototype.getReport); -function register(server, instance) { - for (const definition of endpoints) { - const wrapped = async (query) => definition.handler.call(instance, query); - server.route(routeConfig(wrapped)); - } +async function main() { + const server = Hapi.server(); + registerEndpoints(server, new ReportRoutes()); + return server; } -register(new Hapi.Server(), new Routes()); \ No newline at end of file +main(); diff --git a/javascript/ql/test/library-tests/frameworks/hapi/tests.expected b/javascript/ql/test/library-tests/frameworks/hapi/tests.expected index 3cb778c82595..6d53a86165f8 100644 --- a/javascript/ql/test/library-tests/frameworks/hapi/tests.expected +++ b/javascript/ql/test/library-tests/frameworks/hapi/tests.expected @@ -14,7 +14,7 @@ test_RouteSetup | src/hapihapi.js:17:1:18:2 | server2 ... dler\\n}) | | src/hapihapi.js:29:1:29:20 | server2.route(route) | | src/hapihapi.js:36:1:36:38 | server2 ... ler()}) | -| src/wrapped-route.js:38:5:38:38 | server. ... apped)) | +| src/wrapped-route-configurator.js:26:5:26:24 | server.route(config) | test_RequestExpr | src/hapi.js:13:32:13:38 | request | src/hapi.js:13:14:15:5 | functio ... n\\n } | | src/hapi.js:13:32:13:38 | request | src/hapi.js:13:14:15:5 | functio ... n\\n } | @@ -65,9 +65,11 @@ test_RequestExpr | src/hapihapi.js:25:3:25:9 | request | src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapihapi.js:26:3:26:9 | request | src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapihapi.js:34:22:34:24 | req | src/hapihapi.js:34:12:34:30 | function (req, h){} | -| src/wrapped-route.js:11:30:11:36 | request | src/wrapped-route.js:11:14:13:5 | async f ... ;\\n } | -| src/wrapped-route.js:11:30:11:36 | request | src/wrapped-route.js:11:14:13:5 | async f ... ;\\n } | -| src/wrapped-route.js:12:22:12:28 | request | src/wrapped-route.js:11:14:13:5 | async f ... ;\\n } | +| src/wrapped-route-configurator.js:8:39:8:45 | request | src/wrapped-route-configurator.js:8:23:10:3 | async f ... d);\\n } | +| src/wrapped-route-configurator.js:8:39:8:45 | request | src/wrapped-route-configurator.js:8:23:10:3 | async f ... d);\\n } | +| src/wrapped-route-configurator.js:9:20:9:26 | request | src/wrapped-route-configurator.js:8:23:10:3 | async f ... d);\\n } | +| src/wrapped-route-configurator.js:9:36:9:42 | request | src/wrapped-route-configurator.js:8:23:10:3 | async f ... d);\\n } | +| src/wrapped-route-configurator.js:9:51:9:57 | request | src/wrapped-route-configurator.js:8:23:10:3 | async f ... d);\\n } | test_HeaderAccess | src/hapi.js:25:3:25:21 | request.headers.baz | baz | | src/hapiglue.js:27:3:27:21 | request.headers.baz | baz | @@ -92,7 +94,7 @@ test_RouteHandler | src/hapihapi.js:17:30:18:1 | functio ... ndler\\n} | src/hapihapi.js:4:15:4:31 | new Hapi.Server() | | src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapihapi.js:4:15:4:31 | new Hapi.Server() | | src/hapihapi.js:34:12:34:30 | function (req, h){} | src/hapihapi.js:4:15:4:31 | new Hapi.Server() | -| src/wrapped-route.js:11:14:13:5 | async f ... ;\\n } | src/wrapped-route.js:42:10:42:26 | new Hapi.Server() | +| src/wrapped-route-configurator.js:8:23:10:3 | async f ... d);\\n } | src/wrapped-route.js:17:18:17:30 | Hapi.server() | test_HeaderDefinition | src/hapi.js:14:9:14:46 | request ... 1', '') | src/hapi.js:13:14:15:5 | functio ... n\\n } | | src/hapiglue.js:14:9:14:46 | request ... 1', '') | src/hapiglue.js:13:14:15:5 | functio ... n\\n } | @@ -106,7 +108,7 @@ test_ServerDefinition | src/hapiglue.js:44:45:44:51 | server_ | | src/hapihapi.js:1:15:1:50 | new (re ... erver() | | src/hapihapi.js:4:15:4:31 | new Hapi.Server() | -| src/wrapped-route.js:42:10:42:26 | new Hapi.Server() | +| src/wrapped-route.js:17:18:17:30 | Hapi.server() | test_RequestInputAccess | src/hapi.js:21:3:21:20 | request.rawPayload | body | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapi.js:22:3:22:33 | getRequ ... oad.foo | body | src/hapi.js:20:1:27:1 | functio ... oken;\\n} | @@ -129,7 +131,9 @@ test_RequestInputAccess | src/hapihapi.js:24:3:24:18 | request.url.path | url | src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapihapi.js:25:3:25:21 | request.headers.baz | header | src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} | | src/hapihapi.js:26:3:26:21 | request.state.token | cookie | src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} | -| src/wrapped-route.js:12:22:12:34 | request.query | parameter | src/wrapped-route.js:11:14:13:5 | async f ... ;\\n } | +| src/wrapped-route-configurator.js:9:20:9:33 | request.params | parameter | src/wrapped-route-configurator.js:8:23:10:3 | async f ... d);\\n } | +| src/wrapped-route-configurator.js:9:36:9:48 | request.query | parameter | src/wrapped-route-configurator.js:8:23:10:3 | async f ... d);\\n } | +| src/wrapped-route-configurator.js:9:51:9:65 | request.payload | body | src/wrapped-route-configurator.js:8:23:10:3 | async f ... d);\\n } | test_RouteSetup_getServer | src/hapi.js:7:1:9:2 | server2 ... ler1\\n}) | src/hapi.js:4:15:4:31 | new Hapi.Server() | | src/hapi.js:12:1:15:7 | server2 ... }}) | src/hapi.js:4:15:4:31 | new Hapi.Server() | @@ -146,7 +150,7 @@ test_RouteSetup_getServer | src/hapihapi.js:17:1:18:2 | server2 ... dler\\n}) | src/hapihapi.js:4:15:4:31 | new Hapi.Server() | | src/hapihapi.js:29:1:29:20 | server2.route(route) | src/hapihapi.js:4:15:4:31 | new Hapi.Server() | | src/hapihapi.js:36:1:36:38 | server2 ... ler()}) | src/hapihapi.js:4:15:4:31 | new Hapi.Server() | -| src/wrapped-route.js:38:5:38:38 | server. ... apped)) | src/wrapped-route.js:42:10:42:26 | new Hapi.Server() | +| src/wrapped-route-configurator.js:26:5:26:24 | server.route(config) | src/wrapped-route.js:17:18:17:30 | Hapi.server() | test_HeaderDefinition_defines | src/hapi.js:14:9:14:46 | request ... 1', '') | header1 | | | src/hapiglue.js:14:9:14:46 | request ... 1', '') | header1 | | @@ -173,7 +177,7 @@ test_RouteSetup_getARouteHandler | src/hapihapi.js:36:1:36:38 | server2 ... ler()}) | src/hapihapi.js:33:1:35:1 | return of function getHandler | | src/hapihapi.js:36:1:36:38 | server2 ... ler()}) | src/hapihapi.js:34:12:34:30 | function (req, h){} | | src/hapihapi.js:36:1:36:38 | server2 ... ler()}) | src/hapihapi.js:36:25:36:36 | getHandler() | -| src/wrapped-route.js:38:5:38:38 | server. ... apped)) | src/wrapped-route.js:11:14:13:5 | async f ... ;\\n } | +| src/wrapped-route-configurator.js:26:5:26:24 | server.route(config) | src/wrapped-route-configurator.js:8:23:10:3 | async f ... d);\\n } | test_RouteHandler_getARequestExpr | src/hapi.js:13:14:15:5 | functio ... n\\n } | src/hapi.js:13:32:13:38 | request | | src/hapi.js:13:14:15:5 | functio ... n\\n } | src/hapi.js:13:32:13:38 | request | @@ -224,9 +228,11 @@ test_RouteHandler_getARequestExpr | src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapihapi.js:25:3:25:9 | request | | src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapihapi.js:26:3:26:9 | request | | src/hapihapi.js:34:12:34:30 | function (req, h){} | src/hapihapi.js:34:22:34:24 | req | -| src/wrapped-route.js:11:14:13:5 | async f ... ;\\n } | src/wrapped-route.js:11:30:11:36 | request | -| src/wrapped-route.js:11:14:13:5 | async f ... ;\\n } | src/wrapped-route.js:11:30:11:36 | request | -| src/wrapped-route.js:11:14:13:5 | async f ... ;\\n } | src/wrapped-route.js:12:22:12:28 | request | +| src/wrapped-route-configurator.js:8:23:10:3 | async f ... d);\\n } | src/wrapped-route-configurator.js:8:39:8:45 | request | +| src/wrapped-route-configurator.js:8:23:10:3 | async f ... d);\\n } | src/wrapped-route-configurator.js:8:39:8:45 | request | +| src/wrapped-route-configurator.js:8:23:10:3 | async f ... d);\\n } | src/wrapped-route-configurator.js:9:20:9:26 | request | +| src/wrapped-route-configurator.js:8:23:10:3 | async f ... d);\\n } | src/wrapped-route-configurator.js:9:36:9:42 | request | +| src/wrapped-route-configurator.js:8:23:10:3 | async f ... d);\\n } | src/wrapped-route-configurator.js:9:51:9:57 | request | test_HeaderDefinition_getAHeaderName | src/hapi.js:14:9:14:46 | request ... 1', '') | header1 | | src/hapiglue.js:14:9:14:46 | request ... 1', '') | header1 | @@ -236,4 +242,4 @@ test_RouteHandler_getAResponseHeader | src/hapiglue.js:13:14:15:5 | functio ... n\\n } | header1 | src/hapiglue.js:14:9:14:46 | request ... 1', '') | | src/hapihapi.js:13:14:15:5 | functio ... n\\n } | header1 | src/hapihapi.js:14:9:14:46 | request ... 1', '') | test_WrappedRouteFlow -| src/wrapped-route.js:12:22:12:34 | request.query | src/wrapped-route.js:24:8:24:13 | filter | +| src/wrapped-route-configurator.js:9:36:9:48 | request.query | src/wrapped-route-service.js:5:10:5:15 | filter | From 66b70bdb3dab03bc6c7de0d96c80615a9912f8ae Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Thu, 17 Sep 2026 09:53:35 +0200 Subject: [PATCH 1073/2098] Add a Bazel skill for this repository MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Agents (and humans) editing BUILD.bazel/*.bzl here had no cross-cutting reference: the only Bazel docs are per-area READMEs. This collects the conventions that are not discoverable from any single file — which construct to reach for, the shared `misc/bazel` macros, the `{CODEQL_PLATFORM}` packaging mechanism, checksum pinning, and what the `semmle_code` stub does and does not cover. A counterpart exists for the internal module that also depends on this one. This is deliberately not a copy of it: it is scoped to the standalone build, so it is useful to someone who only ever sees this repository, and it says nothing that requires internal access. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .github/skills/bazel/SKILL.md | 172 ++++++++++++++++++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 .github/skills/bazel/SKILL.md diff --git a/.github/skills/bazel/SKILL.md b/.github/skills/bazel/SKILL.md new file mode 100644 index 000000000000..4447b8a84ce6 --- /dev/null +++ b/.github/skills/bazel/SKILL.md @@ -0,0 +1,172 @@ +--- +name: bazel +description: Conventions for editing Bazel files in the github/codeql repository — the shared `misc/bazel` helpers, `codeql_platform_select` and the `{CODEQL_PLATFORM}` packaging placeholder, adding `MODULE.bazel` dependencies, and the `semmle_code` stub that keeps the standalone build working. Use when editing any `BUILD.bazel`, `*.bzl`, `MODULE.bazel` or `.bazelrc` here, and before validating such an edit. +--- + +# Bazel in the codeql repository + +A bzlmod module named `ql`, repo name `@codeql` ([`MODULE.bazel`](../../../MODULE.bazel)). It builds standalone, and is +also consumed by an internal module that depends on it; standalone builds replace that module with a stub. + +## Traps + +Things that will waste your time or produce a wrong edit here. Read this section even if you skip the rest. + +* **`//...` does not work.** `bazel build //...`, and even `bazel query //...`, fail at the repo root — the patched + modules under `misc/bazel/registry/modules/*/*/overlay` are real packages referencing repos that are not visible from + the main repo, and [`.bazelrc`](../../../.bazelrc) notes that transitions break `...` builds separately. **Validate + the specific target or package you changed**, not a recursive pattern. The error names an unrelated directory and is + very easy to misdiagnose. +* **There is no `MODULE.bazel.lock`, deliberately.** [`.bazelrc`](../../../.bazelrc) sets `--lockfile_mode=off` because + the workspace-relative module override makes a lockfile unstable. Do not add one, and do not "fix" its absence. +* **`linux_arm64` vs `linux-arm64`.** The keyword argument and config setting use an underscore; the platform *string* + substituted into paths and zip names uses a hyphen. They are not interchangeable. +* **Do not stub your way out of a missing internal dependency.** See [Building standalone](#building-standalone) for the + one narrow case where extending the stub is correct. + +## Rules of thumb + +* **Copy a neighbouring target rather than inventing a shape.** Note that packaging is not uniform — some packages use + the `codeql_*` wrappers, others still use `pkg_files` directly — so copy the closest *working* neighbour and prefer + the wrapper for new code. +* **Pin anything fetched over the network** with `sha256` or `integrity`. Bazel only *warns* on an unpinned download, so + nothing fails loudly, but the build stops being reproducible and a retagged upstream release silently changes what you + build. `lfs_archive` is the exception — content is pinned by git object. +* **Format with `bazel run //misc/bazel/buildifier`.** It rewrites in place, so don't hand-tune formatting. Also wired as + a `pre-commit` hook ([`.pre-commit-config.yaml`](../../../.pre-commit-config.yaml)). + +## Where new code goes + +Bazel's own macro / rule / repository-rule distinction applies as usual. What is repo-specific: + +| Adding… | Goes in | +| --- | --- | +| a new packaging shape | extend [`misc/bazel/pkg.bzl`](../../../misc/bazel/pkg.bzl) — don't fork `pkg_files` | +| a new OS or arch split | [`misc/bazel/os.bzl`](../../../misc/bazel/os.bzl) — don't hand-roll a `select()` over `@platforms//` | +| a fetch of something external | a repository rule ([`lfs.bzl`](../../../misc/bazel/lfs.bzl), [`ripunzip.bzl`](../../../misc/ripunzip/ripunzip.bzl)) — not a `genrule` | +| a wrapper used by one language | next to that language ([`swift/rules.bzl`](../../../swift/rules.bzl)) | +| a wrapper used across languages | `misc/bazel/` | + +Prefer inline rules in `BUILD.bazel`. A `.bzl` file earns its `load()` only when the shape repeats across packages or a +value must be computed: [`rust.bzl`](../../../misc/bazel/rust.bzl) is worth it because every Rust binary in the repo +must get the same universal-binary wrapper and symbols test, and forgetting either is a release bug. The `_gen_binaries` +list in [`go/BUILD.bazel`](../../../go/BUILD.bazel) is not — it is shared by two targets in one file, so a local +variable does the job. + +Macros here are typically a thin public wrapper around a private rule (`codeql_csharp_binary`, `swift_cc_binary`). Keep +the rule narrow and the ergonomics in the macro. Generated targets are named after the macro's `name` (`-all`, +`single_arch/`, `internal/`) and kept private; when an error names a target you cannot find in any source +file, a macro minted it — grep the suffix under `misc/bazel/`. + +## Shared helpers + +Frequently-used pieces, so you load the existing one instead of rewriting it. Read the file for its actual exports. + +| `load()` path | Covers | +| --- | --- | +| `//misc/bazel:pkg.bzl` | CodeQL packs and packaging | +| `//misc/bazel:os.bzl` | platform and architecture selection | +| `//misc/bazel:lfs.bzl` | on-demand git-LFS repositories | +| `//misc/bazel:rust.bzl` | Rust binary wrapper | +| `//misc/bazel:csharp.bzl` | C# binary/library/test wrappers | +| `//misc/bazel:utils.bzl` | `select_os`; prefer `os.bzl`'s `os_select` in new code | + +[`defs.bzl`](../../../defs.bzl) at the root exports `codeql_platform` for *dependent* modules — nothing in this repo +loads it, and it is not the way to get the platform string here (use `os.bzl`). + +## Platform selection + +`codeql_platform_select` discriminates the four platforms CodeQL knows about: `linux64`, `linux_arm64`, `osx64`, +`win64`. `otherwise` supplies the value for whichever of those four you leave unset — it is **not** a +`//conditions:default`. **There is deliberately no fallback from `linux_arm64` to `linux64`**; if you only care about +the OS, use `os_select`, which gives Linux the same value on both architectures and has a `posix` shorthand for the +shared Linux/macOS value. + +In a macro (no `ctx`) it returns a `select()`: + +```python +load("//misc/bazel:os.bzl", "codeql_platform_select") +load("//misc/bazel:pkg.bzl", "codeql_pkg_files") + +codeql_pkg_files( + name = "extractor-arch", + exes = codeql_platform_select( + otherwise = ["//unified/extractor"], + win64 = ["//unified/extractor-unsupported-os:extractor"], + ), + prefix = "tools/{CODEQL_PLATFORM}", +) +``` + +If implementation code needs to *branch* on the value rather than pass it through, pass `ctx` and add +`OS_DETECTION_ATTRS` to the rule's attributes — the value is then resolved eagerly instead of being an opaque `select()`: + +```python +load("//misc/bazel:os.bzl", "OS_DETECTION_ATTRS", "os_select") + +def _impl(ctx): + ext = os_select(ctx, windows = ".exe", posix = "") + ... + +my_rule = rule( + implementation = _impl, + attrs = {"src": attr.label()} | OS_DETECTION_ATTRS, +) +``` + +## Packs + +A pack is the unit that becomes an extractor pack. See [`unified/BUILD.bazel`](../../../unified/BUILD.bazel) for a +minimal complete example and [`pkg.bzl`](../../../misc/bazel/pkg.bzl) for the arguments. The non-obvious parts: + +* **`{CODEQL_PLATFORM}` in a destination path is the routing mechanism**, not just a substitution. A path containing it + is *arch-specific* and lands in the per-architecture zip; every other path is *common*. So `prefix = + "tools/{CODEQL_PLATFORM}"` both places the file and marks it arch-specific. `arch_overrides` forces named + destinations into the arch-specific part without a placeholder. +* **`codeql_pkg_files` splits `srcs` (plain) from `exes` (mode 755)** and **rejects `attributes =`** with an explicit + error — use `exes` rather than hand-rolling `pkg_attributes(mode = "755")`. +* **`pkg_dirs` and `pkg_symlinks` are unsupported** and fail at analysis time. +* `codeql_pack` also generates an installer and an `install` alias, hence `bazel run //unified:install`. Pass + `installer_alias = None` if one package defines several packs. +* `codeql_pack_group` exists for bundling packs into distribution zips, but nothing in this repo instantiates it. + +## Dependencies and `MODULE.bazel` + +In order of preference: + +1. **A [Bazel Central Registry](https://registry.bazel.build/) module** — a `bazel_dep` in + [`MODULE.bazel`](../../../MODULE.bazel). +2. **A patched upstream module** — add it under + [`misc/bazel/registry`](../../../misc/bazel/registry), which `.bazelrc` puts ahead of the BCR. Put patches in + `modules///patches`, rename the version with a `-codeql.N` suffix, and run + [`fix.py`](../../../misc/bazel/registry/fix.py) to realign the metadata. +3. **A raw archive** — `http_archive` via `use_repo_rule`, or a repository rule. Copy an adjacent declaration and keep + its checksum field populated. + +Vendored Rust crates under [`misc/bazel/3rdparty`](../../../misc/bazel/3rdparty) are generated — regenerate with +`update_cargo_deps.sh` rather than editing, and keep the `use_repo` lists in sync (`bazel mod tidy` handles several). + +## Building standalone + +[`MODULE.bazel`](../../../MODULE.bazel) declares `semmle_code` with a `local_path_override` pointing at `..`, which +resolves when this repo is checked out inside the internal module. [`.bazelrc`](../../../.bazelrc) — read when Bazel is +invoked in *this* workspace — overrides that with a stub, and this line is the whole reason a standalone build resolves: + +``` +common --override_module=semmle_code=%workspace%/misc/bazel/semmle_code_stub +``` + +Do not change either the override path or the `local_path_override`; they work as a pair. + +[`misc/bazel/semmle_code_stub`](../../../misc/bazel/semmle_code_stub) is an otherwise empty module supplying no-op +versions of the internal helpers that shared `.bzl` files load *unconditionally*. That is its only job, and it is small +enough to read. + +**Extend the stub only when a `.bzl` file every standalone target loads gains a new internal `load()`** — that breaks +package loading outright, for everyone. Prefer not needing one. **Never add a stub so that an internal-only target +appears to build**: some targets depend on internal libraries (`grep -rl @semmle_code --include=*.bazel` finds them) and +are correctly unbuildable here. Unlike a `load()`, such a dependency only fails when that target is actually requested. + +[`.bazelrc.internal`](../../../.bazelrc.internal) is **not** read here; it carries settings for the internal build. A +setting needed by both has to be written in both files, with paths differing because this repo sits at a different depth +there. From c76ba5940571aa6fdfa36214f61f3f7f1b84eaad Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 17 Sep 2026 11:36:31 +0100 Subject: [PATCH 1074/2098] Update docs on db upgrade and downgrade --- ...ade.md => prepare-db-upgrade-downgrade.md} | 94 ++++++++++++------- 1 file changed, 62 insertions(+), 32 deletions(-) rename docs/{prepare-db-upgrade.md => prepare-db-upgrade-downgrade.md} (59%) diff --git a/docs/prepare-db-upgrade.md b/docs/prepare-db-upgrade-downgrade.md similarity index 59% rename from docs/prepare-db-upgrade.md rename to docs/prepare-db-upgrade-downgrade.md index 58806ecebebf..59d79e482a4e 100644 --- a/docs/prepare-db-upgrade.md +++ b/docs/prepare-db-upgrade-downgrade.md @@ -13,6 +13,10 @@ This document explains how to write or generate those scripts. 2. Run `misc/scripts/prepare-db-upgrade.sh --lang `. This will generate skeleton upgrade/downgrade scripts in the appropriate directories. 3. Fill in the details in the two `upgrade.properties` files that it generated, and add any required upgrade queries. +The generated directory names are hashes of the old and new `.dbscheme` files. If the +schema changes after generating the scripts, delete the generated directories and run the +script again so that the directory names and schema snapshots use the correct hashes. + It may be helpful to look at some of the existing upgrade/downgrade scripts, to see how they work. ## Details @@ -25,7 +29,9 @@ compatibility: partial some_relation.rel: run some_relation.qlo ``` -The `description` field is a textual description of the aim of the upgrade. +The `description` field is a textual description of the aim of the step. Describe the +operation in its actual direction: for example, a downgrade that removes a newly added +table should say that it removes the table. The `compatibility` field takes one of four values: @@ -37,14 +43,36 @@ The `compatibility` field takes one of four values: * **breaking**: the step is unsafe and will prevent certain queries from working. -The `some_relation.rel` line(s) are the actions required to perform the database upgrade. Do a diff on the new vs old `.dbscheme` file to get an idea of what they have to achieve. Sometimes you won't need any upgrade commands – this happens when the dbscheme has changed in "cosmetic" ways, for example by adding/removing comments or changing union type relationships, but still retains the same on-disk format for all tables; the purpose of the upgrade script is then to document the fact that it's safe to replace the old dbscheme with the new one. +Choose compatibility independently for the upgrade and downgrade, because the two directions +may preserve different amounts of information. + +The `some_relation.rel` line(s) are the actions required to transform the database in the +direction of the step. Upgrade and downgrade directories use the same file name and command +syntax, even though a file in a downgrade directory describes a downgrade. Diff `old.dbscheme` +against the target `.dbscheme` in the generated directory to determine which actions are +needed. + +No action is needed for a relation added by the target schema if it should be empty in the +transformed database. A missing relation is treated as empty, so do not add a `.rel` line just +to create an empty file. If extraction would populate the new relation, however, the upgrade +is not `full`: it will usually be `backwards`, because queries using the new relation may have +degraded results on upgraded databases. + +A relation that exists in `old.dbscheme` but not in the target schema should normally be +deleted explicitly with `relation.rel: delete` so that the transformation does not leave +obsolete data behind. + +Sometimes no commands are needed because the schema changed only cosmetically, for example +by adding or removing comments or changing union type relationships without changing the +on-disk format. The script then documents that it is safe to replace the old schema with the +new one. Ideally, your downgrade script will perfectly revert the changes applied by the upgrade script, such that applying the upgrade and then the downgrade will result in the same database you started with. -Some typical upgrade commands look like this: +Some typical upgrade or downgrade commands look like this: ``` -// Delete a relation that has been replaced in the new scheme +// Delete a relation that does not exist in the target schema obsolete.rel: delete // Create a new version of a table by applying an expression (using a simple @@ -83,7 +111,7 @@ To test the upgrade script, run: codeql test run --search-path= --search-path= ``` -Where `` is an extractor pack containing the old extractor and dbscheme that pre-date your changes, `` is the directory containing the qltests for your language, and `` is the root directory directory of the `github/codeql` clone that contains ``. This will run the tests using an old extractor, and the test databases will all be upgraded in place using your new upgrade script. +Where `` is an extractor pack containing the old extractor and dbscheme that pre-date your changes, `` is the directory containing the qltests for your language, and `` is the root directory of the `github/codeql` clone that contains ``. This will run the tests using an old extractor, and the test databases will all be upgraded in place using your new upgrade script. To test the downgrade script, create an extractor pack that includes your new dbscheme and extractor changes. Then checkout the `main` branch of `codeql` (i.e. a branch that does not include your changes), and run: @@ -107,43 +135,45 @@ You might also choose to test with a real-world database. 5. Verify that your queries produced sensible results. -#### Doing the upgrade manually - -To create the upgrade directory manually, without using `prepare-db-upgrade.sh`: - -1. Get a hash of the old `.dbscheme` file from `main` (i.e. from just before your changes). You can do this by checking out the code prior to your changes and running `git hash-object ql/lib/.dbscheme` - -2. Go back to your branch and create an upgrade directory with that hash as its name, for example: -``` -mkdir ql/lib/upgrades/454f1e15151422355049dc4f1f0486a03baeffef -``` +#### Creating the scripts manually +To create both directions manually, without using `prepare-db-upgrade.sh`: -3. Copy the old `.dbscheme` file to that directory, using the name old.dbscheme. +1. Get the hashes of the old `.dbscheme` from `main` and the new `.dbscheme` from + your branch. For example: -``` -cp ql/lib/.dbscheme ql/lib/upgrades/454f1e15151422355049dc4f1f0486a03baeffef/old.dbscheme -``` + ```sh + old_hash=$(git show main:ql/lib/.dbscheme | git hash-object --stdin) + new_hash=$(git hash-object ql/lib/.dbscheme) + ``` -4. Put a copy of your new `.dbscheme` file in that directory and create an `upgrade.properties` file (as described above). +2. Create the upgrade directory using the old hash and the downgrade directory using the + new hash: -#### Doing the downgrade manually + ```sh + mkdir -p ql/lib/upgrades/$old_hash + mkdir -p downgrades/$new_hash + ``` -The process is similar for downgrade scripts, but there is a reversal in terminology: your **new** dbscheme will now be the one called `old.dbscheme`. +3. Populate the upgrade directory. Here, `old.dbscheme` is the schema from `main`, and + `.dbscheme` is the new target schema: -1. Get a hash of your new `.dbscheme` file, with `git hash-object ql/lib/.dbscheme` + ```sh + git show main:ql/lib/.dbscheme > ql/lib/upgrades/$old_hash/old.dbscheme + cp ql/lib/.dbscheme ql/lib/upgrades/$old_hash/.dbscheme + ``` -2. Create a downgrade directory with that hash as its name, for example: -``` -mkdir downgrades/9fdd1d40fd3c3f8f9db8fabf5a353580d14c663a -``` +4. Populate the downgrade directory in the opposite direction. For a downgrade, the new + schema is called `old.dbscheme`, because it is the schema before the downgrade step: -3. Copy your new `.dbscheme` file to that directory, using the name `old.dbscheme`. -``` -cp ql/lib/.dbscheme ql/lib/upgrades/454f1e15151422355049dc4f1f0486a03baeffef/old.dbscheme -``` + ```sh + cp ql/lib/.dbscheme downgrades/$new_hash/old.dbscheme + git show main:ql/lib/.dbscheme > downgrades/$new_hash/.dbscheme + ``` -4. Put a copy of the `.dbscheme` from `main` in that directory and create an `upgrade.properties` file that performs the downgrade (as described above). +5. Create an `upgrade.properties` file in each directory. The file in the upgrade directory + describes the forward transformation, while the file in the downgrade directory describes + the reverse transformation. ### Debugging your scripts From ee3a225ca671010a1a70e78db704f6acee5384f9 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 17 Sep 2026 11:51:55 +0100 Subject: [PATCH 1075/2098] Clarify compatibility for downgrade scripts --- docs/prepare-db-upgrade-downgrade.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/prepare-db-upgrade-downgrade.md b/docs/prepare-db-upgrade-downgrade.md index 59d79e482a4e..e5d1b9cdcd49 100644 --- a/docs/prepare-db-upgrade-downgrade.md +++ b/docs/prepare-db-upgrade-downgrade.md @@ -33,15 +33,17 @@ The `description` field is a textual description of the aim of the step. Describ operation in its actual direction: for example, a downgrade that removes a newly added table should say that it removes the table. -The `compatibility` field takes one of four values: +The `compatibility` field takes one of four values. In these definitions, the source schema is +`old.dbscheme`, and the target schema is the other `.dbscheme` in the script directory. Thus, +the source is the older schema for an upgrade and the newer schema for a downgrade. - * **full**: results from the upgraded snapshot will be identical to results from a snapshot built with the new version of the toolchain. + * **full**: query results from the transformed database will be identical to results from a database built with the target version of the toolchain. - * **backwards**: the step is safe and preserves the meaning of the old database, but new features may not work correctly on the upgraded snapshot. + * **backwards**: the step is safe and preserves the meaning of the source database, but features provided by the target query and library packs may not work correctly on the transformed database. - * **partial**: the step is safe and preserves the meaning of the old database, but you would get better results if you rebuilt the snapshot with the new version of the toolchain. + * **partial**: the step is safe and preserves the meaning of the source database, but rebuilding the database with the target version of the toolchain would produce better results. - * **breaking**: the step is unsafe and will prevent certain queries from working. + * **breaking**: the step is unsafe and will prevent certain target queries from working. Choose compatibility independently for the upgrade and downgrade, because the two directions may preserve different amounts of information. From 9045b897983155eb64777956490fcb07204c2428 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 17 Sep 2026 11:52:29 +0100 Subject: [PATCH 1076/2098] Make paths more consistent --- docs/prepare-db-upgrade-downgrade.md | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/docs/prepare-db-upgrade-downgrade.md b/docs/prepare-db-upgrade-downgrade.md index e5d1b9cdcd49..1ea1dcffd45d 100644 --- a/docs/prepare-db-upgrade-downgrade.md +++ b/docs/prepare-db-upgrade-downgrade.md @@ -139,38 +139,46 @@ You might also choose to test with a real-world database. #### Creating the scripts manually -To create both directions manually, without using `prepare-db-upgrade.sh`: +To create both directions manually, without using `prepare-db-upgrade.sh`, run the following +commands from the repository root. First set `lang` to the language directory and `schema_file` +to the repository-relative path of its `.dbscheme` file. For example, for Go: + + ```sh + lang=go + schema_file=go/ql/lib/go.dbscheme + ``` 1. Get the hashes of the old `.dbscheme` from `main` and the new `.dbscheme` from your branch. For example: ```sh - old_hash=$(git show main:ql/lib/.dbscheme | git hash-object --stdin) - new_hash=$(git hash-object ql/lib/.dbscheme) + old_hash=$(git show "main:$schema_file" | git hash-object --stdin) + new_hash=$(git hash-object "$schema_file") ``` 2. Create the upgrade directory using the old hash and the downgrade directory using the new hash: ```sh - mkdir -p ql/lib/upgrades/$old_hash - mkdir -p downgrades/$new_hash + upgrade_dir="$lang/ql/lib/upgrades/$old_hash" + downgrade_dir="$lang/downgrades/$new_hash" + mkdir -p "$upgrade_dir" "$downgrade_dir" ``` 3. Populate the upgrade directory. Here, `old.dbscheme` is the schema from `main`, and - `.dbscheme` is the new target schema: + the other `.dbscheme` file is the new target schema: ```sh - git show main:ql/lib/.dbscheme > ql/lib/upgrades/$old_hash/old.dbscheme - cp ql/lib/.dbscheme ql/lib/upgrades/$old_hash/.dbscheme + git show "main:$schema_file" > "$upgrade_dir/old.dbscheme" + cp "$schema_file" "$upgrade_dir/$(basename "$schema_file")" ``` 4. Populate the downgrade directory in the opposite direction. For a downgrade, the new schema is called `old.dbscheme`, because it is the schema before the downgrade step: ```sh - cp ql/lib/.dbscheme downgrades/$new_hash/old.dbscheme - git show main:ql/lib/.dbscheme > downgrades/$new_hash/.dbscheme + cp "$schema_file" "$downgrade_dir/old.dbscheme" + git show "main:$schema_file" > "$downgrade_dir/$(basename "$schema_file")" ``` 5. Create an `upgrade.properties` file in each directory. The file in the upgrade directory From 1f05b4146898b4f6273acb25457fbceb06b969d5 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Thu, 17 Sep 2026 12:26:34 +0200 Subject: [PATCH 1077/2098] Rust: Add codegen for generating a toStringImpl that delegates to getAPrimaryQlClass --- misc/codegen/generators/qlgen.py | 3 + misc/codegen/lib/ql.py | 1 + misc/codegen/lib/schemadefs.py | 6 + misc/codegen/templates/ql_class.mustache | 4 + misc/codegen/test/test_qlgen.py | 41 ++ misc/codegen/test/test_schemaloader.py | 23 + rust/ql/.generated.list | 433 +++++++++++------- rust/ql/.gitattributes | 85 ++++ .../codeql/rust/elements/internal/AbiImpl.qll | 6 +- .../rust/elements/internal/ArgListImpl.qll | 6 +- .../internal/ArrayExprInternalImpl.qll | 5 +- .../elements/internal/ArrayTypeReprImpl.qll | 6 +- .../elements/internal/AsmClobberAbiImpl.qll | 6 +- .../rust/elements/internal/AsmConstImpl.qll | 6 +- .../rust/elements/internal/AsmDirSpecImpl.qll | 6 +- .../rust/elements/internal/AsmExprImpl.qll | 6 +- .../rust/elements/internal/AsmLabelImpl.qll | 6 +- .../elements/internal/AsmOperandExprImpl.qll | 6 +- .../elements/internal/AsmOperandNamedImpl.qll | 6 +- .../rust/elements/internal/AsmOptionImpl.qll | 6 +- .../elements/internal/AsmOptionsListImpl.qll | 6 +- .../elements/internal/AsmRegOperandImpl.qll | 6 +- .../rust/elements/internal/AsmRegSpecImpl.qll | 6 +- .../rust/elements/internal/AsmSymImpl.qll | 6 +- .../elements/internal/AssocItemListImpl.qll | 6 +- .../elements/internal/AssocTypeArgImpl.qll | 6 +- .../rust/elements/internal/AttrImpl.qll | 6 +- .../rust/elements/internal/CfgAtomImpl.qll | 5 +- .../elements/internal/CfgAttrMetaImpl.qll | 5 +- .../elements/internal/CfgCompositeImpl.qll | 5 +- .../rust/elements/internal/CfgMetaImpl.qll | 5 +- .../rust/elements/internal/ConstArgImpl.qll | 6 +- .../elements/internal/ConstBlockPatImpl.qll | 6 +- .../rust/elements/internal/ConstParamImpl.qll | 6 +- .../rust/elements/internal/DerefPatImpl.qll | 6 +- .../internal/DynTraitTypeReprImpl.qll | 2 - .../rust/elements/internal/ExprStmtImpl.qll | 6 +- .../elements/internal/ExternBlockImpl.qll | 6 +- .../elements/internal/ExternCrateImpl.qll | 6 +- .../elements/internal/ExternItemListImpl.qll | 6 +- .../elements/internal/FnPtrTypeReprImpl.qll | 6 +- .../elements/internal/ForTypeReprImpl.qll | 6 +- .../elements/internal/FormatArgsArgImpl.qll | 6 +- .../elements/internal/FormatArgsExprImpl.qll | 2 - .../elements/internal/ImplRestrictionImpl.qll | 6 +- .../internal/IncludeBytesExprImpl.qll | 6 +- .../rust/elements/internal/ItemListImpl.qll | 6 +- .../elements/internal/KeyValueMetaImpl.qll | 5 +- .../elements/internal/LifetimeArgImpl.qll | 6 +- .../elements/internal/LifetimeParamImpl.qll | 6 +- .../rust/elements/internal/MacroDefImpl.qll | 6 +- .../rust/elements/internal/MacroExprImpl.qll | 6 +- .../rust/elements/internal/MacroItemsImpl.qll | 6 +- .../rust/elements/internal/MacroPatImpl.qll | 6 +- .../rust/elements/internal/MacroRulesImpl.qll | 6 +- .../elements/internal/MacroTypeReprImpl.qll | 6 +- .../elements/internal/MatchArmListImpl.qll | 6 +- .../rust/elements/internal/MatchGuardImpl.qll | 6 +- .../elements/internal/MutRestrictionImpl.qll | 6 +- .../rust/elements/internal/NamedCrateImpl.qll | 5 +- .../rust/elements/internal/NotNullImpl.qll | 6 +- .../elements/internal/OffsetOfExprImpl.qll | 6 +- .../rust/elements/internal/ParamListImpl.qll | 2 - .../internal/ParenthesizedArgListImpl.qll | 6 +- .../rust/elements/internal/PathMetaImpl.qll | 5 +- .../elements/internal/PatternTypeReprImpl.qll | 6 +- .../elements/internal/PtrTypeReprImpl.qll | 6 +- .../rust/elements/internal/RangePatImpl.qll | 6 +- .../elements/internal/RefTypeReprImpl.qll | 6 +- .../rust/elements/internal/RenameImpl.qll | 6 +- .../elements/internal/RetTypeReprImpl.qll | 6 +- .../internal/ReturnTypeSyntaxImpl.qll | 6 +- .../rust/elements/internal/SelfParamImpl.qll | 6 +- .../rust/elements/internal/SlicePatImpl.qll | 6 +- .../elements/internal/SliceTypeReprImpl.qll | 6 +- .../rust/elements/internal/SourceFileImpl.qll | 6 +- .../rust/elements/internal/StmtListImpl.qll | 2 - .../internal/StructExprFieldListImpl.qll | 6 +- .../elements/internal/StructFieldListImpl.qll | 6 +- .../internal/StructPatFieldListImpl.qll | 6 +- .../rust/elements/internal/TokenTreeImpl.qll | 6 +- .../elements/internal/TokenTreeMetaImpl.qll | 5 +- .../internal/TryBlockModifierImpl.qll | 5 +- .../rust/elements/internal/TryExprImpl.qll | 6 +- .../rust/elements/internal/TupleExprImpl.qll | 6 +- .../rust/elements/internal/TupleFieldImpl.qll | 2 - .../elements/internal/TupleFieldListImpl.qll | 6 +- .../rust/elements/internal/TuplePatImpl.qll | 2 - .../elements/internal/TupleTypeReprImpl.qll | 6 +- .../rust/elements/internal/TypeArgImpl.qll | 6 +- .../rust/elements/internal/TypeBoundImpl.qll | 2 - .../rust/elements/internal/UnsafeMetaImpl.qll | 5 +- .../internal/UseBoundGenericArgsImpl.qll | 6 +- .../elements/internal/UseTreeListImpl.qll | 6 +- .../elements/internal/VariantListImpl.qll | 6 +- .../elements/internal/VisibilityInnerImpl.qll | 6 +- .../elements/internal/WhereClauseImpl.qll | 6 +- .../rust/elements/internal/WherePredImpl.qll | 6 +- .../rust/elements/internal/YeetExprImpl.qll | 6 +- .../rust/elements/internal/YieldExprImpl.qll | 6 +- .../rust/elements/internal/generated/Abi.qll | 2 + .../elements/internal/generated/ArgList.qll | 2 + .../internal/generated/ArrayExprInternal.qll | 2 + .../internal/generated/ArrayListExpr.qll | 2 + .../internal/generated/ArrayRepeatExpr.qll | 2 + .../internal/generated/ArrayTypeRepr.qll | 2 + .../internal/generated/AsmClobberAbi.qll | 2 + .../elements/internal/generated/AsmConst.qll | 2 + .../internal/generated/AsmDirSpec.qll | 2 + .../elements/internal/generated/AsmExpr.qll | 2 + .../elements/internal/generated/AsmLabel.qll | 2 + .../internal/generated/AsmOperandExpr.qll | 2 + .../internal/generated/AsmOperandNamed.qll | 2 + .../elements/internal/generated/AsmOption.qll | 2 + .../internal/generated/AsmOptionsList.qll | 2 + .../internal/generated/AsmRegOperand.qll | 2 + .../internal/generated/AsmRegSpec.qll | 2 + .../elements/internal/generated/AsmSym.qll | 2 + .../internal/generated/AssocItemList.qll | 2 + .../internal/generated/AssocTypeArg.qll | 2 + .../rust/elements/internal/generated/Attr.qll | 2 + .../elements/internal/generated/AwaitExpr.qll | 2 + .../internal/generated/BecomeExpr.qll | 2 + .../internal/generated/BinaryExpr.qll | 2 + .../elements/internal/generated/BoxPat.qll | 2 + .../elements/internal/generated/BreakExpr.qll | 2 + .../elements/internal/generated/CallExpr.qll | 2 + .../elements/internal/generated/CastExpr.qll | 2 + .../elements/internal/generated/CfgAtom.qll | 2 + .../internal/generated/CfgAttrMeta.qll | 2 + .../internal/generated/CfgComposite.qll | 2 + .../elements/internal/generated/CfgMeta.qll | 2 + .../internal/generated/ClosureExpr.qll | 2 + .../elements/internal/generated/Comment.qll | 2 + .../elements/internal/generated/Const.qll | 2 + .../elements/internal/generated/ConstArg.qll | 2 + .../internal/generated/ConstBlockPat.qll | 2 + .../internal/generated/ConstParam.qll | 2 + .../internal/generated/ContinueExpr.qll | 2 + .../elements/internal/generated/Crate.qll | 2 + .../elements/internal/generated/DerefPat.qll | 2 + .../internal/generated/DynTraitTypeRepr.qll | 2 + .../rust/elements/internal/generated/Enum.qll | 2 + .../elements/internal/generated/ExprStmt.qll | 2 + .../internal/generated/ExternBlock.qll | 2 + .../internal/generated/ExternCrate.qll | 2 + .../internal/generated/ExternItemList.qll | 2 + .../internal/generated/ExtractorStep.qll | 2 + .../elements/internal/generated/FieldExpr.qll | 2 + .../internal/generated/FnPtrTypeRepr.qll | 2 + .../elements/internal/generated/ForBinder.qll | 2 + .../internal/generated/ForTypeRepr.qll | 2 + .../elements/internal/generated/Format.qll | 2 + .../internal/generated/FormatArgsArg.qll | 2 + .../internal/generated/FormatArgsExpr.qll | 2 + .../internal/generated/FormatArgument.qll | 2 + .../FormatTemplateVariableAccess.qll | 2 + .../elements/internal/generated/Function.qll | 2 + .../internal/generated/GenericArgList.qll | 2 + .../internal/generated/GenericParamList.qll | 2 + .../elements/internal/generated/IdentPat.qll | 2 + .../elements/internal/generated/IfExpr.qll | 2 + .../rust/elements/internal/generated/Impl.qll | 2 + .../internal/generated/ImplRestriction.qll | 2 + .../internal/generated/ImplTraitTypeRepr.qll | 2 + .../internal/generated/IncludeBytesExpr.qll | 2 + .../elements/internal/generated/IndexExpr.qll | 2 + .../internal/generated/InferTypeRepr.qll | 2 + .../elements/internal/generated/ItemList.qll | 2 + .../internal/generated/KeyValueMeta.qll | 2 + .../elements/internal/generated/Label.qll | 2 + .../elements/internal/generated/LetElse.qll | 2 + .../elements/internal/generated/LetExpr.qll | 2 + .../elements/internal/generated/LetStmt.qll | 2 + .../elements/internal/generated/Lifetime.qll | 2 + .../internal/generated/LifetimeArg.qll | 2 + .../internal/generated/LifetimeParam.qll | 2 + .../internal/generated/LiteralExpr.qll | 2 + .../internal/generated/LiteralPat.qll | 2 + .../elements/internal/generated/MacroCall.qll | 2 + .../elements/internal/generated/MacroDef.qll | 2 + .../elements/internal/generated/MacroExpr.qll | 2 + .../internal/generated/MacroItems.qll | 2 + .../elements/internal/generated/MacroPat.qll | 2 + .../internal/generated/MacroRules.qll | 2 + .../internal/generated/MacroTypeRepr.qll | 2 + .../elements/internal/generated/MatchArm.qll | 2 + .../internal/generated/MatchArmList.qll | 2 + .../elements/internal/generated/MatchExpr.qll | 2 + .../internal/generated/MatchGuard.qll | 2 + .../internal/generated/MethodCallExpr.qll | 2 + .../elements/internal/generated/Missing.qll | 2 + .../elements/internal/generated/Module.qll | 2 + .../internal/generated/MutRestriction.qll | 2 + .../rust/elements/internal/generated/Name.qll | 2 + .../elements/internal/generated/NameRef.qll | 2 + .../internal/generated/NamedCrate.qll | 2 + .../internal/generated/NeverTypeRepr.qll | 2 + .../elements/internal/generated/NotNull.qll | 2 + .../internal/generated/OffsetOfExpr.qll | 2 + .../elements/internal/generated/OrPat.qll | 2 + .../elements/internal/generated/Param.qll | 2 + .../elements/internal/generated/ParamList.qll | 2 + .../elements/internal/generated/ParenExpr.qll | 2 + .../elements/internal/generated/ParenPat.qll | 2 + .../internal/generated/ParenTypeRepr.qll | 2 + .../generated/ParenthesizedArgList.qll | 2 + .../rust/elements/internal/generated/Path.qll | 2 + .../elements/internal/generated/PathExpr.qll | 2 + .../elements/internal/generated/PathMeta.qll | 2 + .../elements/internal/generated/PathPat.qll | 2 + .../internal/generated/PathSegment.qll | 2 + .../internal/generated/PathTypeRepr.qll | 2 + .../internal/generated/PatternTypeRepr.qll | 2 + .../internal/generated/PrefixExpr.qll | 2 + .../internal/generated/PtrTypeRepr.qll | 2 + .../elements/internal/generated/RangeExpr.qll | 2 + .../elements/internal/generated/RangePat.qll | 2 + .../elements/internal/generated/RefExpr.qll | 2 + .../elements/internal/generated/RefPat.qll | 2 + .../internal/generated/RefTypeRepr.qll | 2 + .../elements/internal/generated/Rename.qll | 2 + .../elements/internal/generated/RestPat.qll | 2 + .../internal/generated/RetTypeRepr.qll | 2 + .../internal/generated/ReturnExpr.qll | 2 + .../internal/generated/ReturnTypeSyntax.qll | 2 + .../elements/internal/generated/SelfParam.qll | 2 + .../elements/internal/generated/SlicePat.qll | 2 + .../internal/generated/SliceTypeRepr.qll | 2 + .../internal/generated/SourceFile.qll | 2 + .../elements/internal/generated/Static.qll | 2 + .../elements/internal/generated/StmtList.qll | 2 + .../elements/internal/generated/Struct.qll | 2 + .../internal/generated/StructExpr.qll | 2 + .../internal/generated/StructExprField.qll | 2 + .../generated/StructExprFieldList.qll | 2 + .../internal/generated/StructField.qll | 2 + .../internal/generated/StructFieldList.qll | 2 + .../elements/internal/generated/StructPat.qll | 2 + .../internal/generated/StructPatField.qll | 2 + .../internal/generated/StructPatFieldList.qll | 2 + .../elements/internal/generated/TokenTree.qll | 2 + .../internal/generated/TokenTreeMeta.qll | 2 + .../elements/internal/generated/Trait.qll | 2 + .../internal/generated/TryBlockModifier.qll | 2 + .../elements/internal/generated/TryExpr.qll | 2 + .../elements/internal/generated/TupleExpr.qll | 2 + .../internal/generated/TupleField.qll | 2 + .../internal/generated/TupleFieldList.qll | 2 + .../elements/internal/generated/TuplePat.qll | 2 + .../internal/generated/TupleStructPat.qll | 2 + .../internal/generated/TupleTypeRepr.qll | 2 + .../elements/internal/generated/TypeAlias.qll | 2 + .../elements/internal/generated/TypeArg.qll | 2 + .../elements/internal/generated/TypeBound.qll | 2 + .../internal/generated/TypeBoundList.qll | 2 + .../elements/internal/generated/TypeParam.qll | 2 + .../internal/generated/UnderscoreExpr.qll | 2 + .../internal/generated/Unimplemented.qll | 2 + .../elements/internal/generated/Union.qll | 2 + .../internal/generated/UnsafeMeta.qll | 2 + .../rust/elements/internal/generated/Use.qll | 2 + .../generated/UseBoundGenericArgs.qll | 2 + .../elements/internal/generated/UseTree.qll | 2 + .../internal/generated/UseTreeList.qll | 2 + .../elements/internal/generated/Variant.qll | 2 + .../internal/generated/VariantList.qll | 2 + .../internal/generated/Visibility.qll | 2 + .../internal/generated/VisibilityInner.qll | 2 + .../internal/generated/WhereClause.qll | 2 + .../elements/internal/generated/WherePred.qll | 2 + .../internal/generated/WildcardPat.qll | 2 + .../elements/internal/generated/YeetExpr.qll | 2 + .../elements/internal/generated/YieldExpr.qll | 2 + rust/schema/annotations.py | 3 + rust/schema/prelude.py | 1 + 276 files changed, 944 insertions(+), 517 deletions(-) diff --git a/misc/codegen/generators/qlgen.py b/misc/codegen/generators/qlgen.py index c3848917c49e..30059f9c93b4 100755 --- a/misc/codegen/generators/qlgen.py +++ b/misc/codegen/generators/qlgen.py @@ -237,6 +237,9 @@ def get_ql_class(self, cls: schema.Class) -> ql.Class: hideable="ql_hideable" in cls.pragmas, internal="ql_internal" in cls.pragmas, cfg=cls.cfg, + to_string_impl_from_primary_class=bool( + cls.pragmas.get("ql_to_string_impl_from_primary_class") + ), ) return self._class_cache[cache_key] diff --git a/misc/codegen/lib/ql.py b/misc/codegen/lib/ql.py index 503570c2adc3..7b4434a42e8a 100644 --- a/misc/codegen/lib/ql.py +++ b/misc/codegen/lib/ql.py @@ -117,6 +117,7 @@ class Class: doc: List[str] = field(default_factory=list) hideable: bool = False cfg: bool = False + to_string_impl_from_primary_class: bool = False def __post_init__(self): def get_bases(bases): diff --git a/misc/codegen/lib/schemadefs.py b/misc/codegen/lib/schemadefs.py index 125951701c9b..c4d3c0669e80 100644 --- a/misc/codegen/lib/schemadefs.py +++ b/misc/codegen/lib/schemadefs.py @@ -263,6 +263,12 @@ def __getitem__(self, item): ql.add(_Parametrized(_ClassPragma("default_doc_name"), factory=lambda doc: doc)) ql.add(_ClassPragma("hideable", inherited=True)) +ql.add( + _Parametrized( + _ClassPragma("to_string_impl_from_primary_class", inherited=True), + factory=lambda enabled: enabled, + ) +) ql.add(_Pragma("internal")) ql.add(_Parametrized(_Pragma("name"), factory=lambda name: name)) ql.add(_Parametrized(_PropertyPragma("db_table_name"), factory=lambda name: name)) diff --git a/misc/codegen/templates/ql_class.mustache b/misc/codegen/templates/ql_class.mustache index e80e0b0eebda..391c096afa31 100644 --- a/misc/codegen/templates/ql_class.mustache +++ b/misc/codegen/templates/ql_class.mustache @@ -77,6 +77,10 @@ module Generated { {{/root}} {{#final}} override string getAPrimaryQlClass() { result = "{{name}}" } + {{#to_string_impl_from_primary_class}} + + override string toStringImpl() { result = this.getAPrimaryQlClass() } + {{/to_string_impl_from_primary_class}} {{/final}} {{#properties}} diff --git a/misc/codegen/test/test_qlgen.py b/misc/codegen/test/test_qlgen.py index a2434432390f..226011a2924f 100644 --- a/misc/codegen/test/test_qlgen.py +++ b/misc/codegen/test/test_qlgen.py @@ -196,6 +196,47 @@ def test_one_empty_class(generate_classes): } +def test_to_string_impl_from_primary_class(generate_classes): + assert generate_classes( + [ + schema.Class( + "A", + derived={"B"}, + pragmas={"ql_to_string_impl_from_primary_class": True}, + ), + schema.Class( + "B", + bases=["A"], + pragmas={"ql_to_string_impl_from_primary_class": True}, + ), + ] + ) == { + "A.qll": ( + a_ql_class_public(name="A"), + a_ql_stub(name="A"), + a_ql_class( + name="A", + imports=[stub_import_prefix + "A"], + to_string_impl_from_primary_class=True, + ), + ), + "B.qll": ( + a_ql_class_public(name="B", imports=[stub_import_prefix + "A"]), + a_ql_stub(name="B"), + a_ql_class( + name="B", + final=True, + bases=["A"], + bases_impl=["AImpl::A"], + imports=[ + stub_import_prefix_internal + "AImpl::Impl as AImpl", + ], + to_string_impl_from_primary_class=True, + ), + ), + } + + def test_one_empty_internal_class(generate_classes): assert generate_classes([schema.Class("A", pragmas=["ql_internal"])]) == { "A.qll": ( diff --git a/misc/codegen/test/test_schemaloader.py b/misc/codegen/test/test_schemaloader.py index 5e8ba91b742a..cdfc684ef391 100644 --- a/misc/codegen/test/test_schemaloader.py +++ b/misc/codegen/test/test_schemaloader.py @@ -382,6 +382,29 @@ class A: } +def test_inherited_to_string_impl_from_primary_class_pragma(): + @load + class data: + @defs.ql.to_string_impl_from_primary_class(True) + class A: + pass + + class B(A): + pass + + @defs.ql.to_string_impl_from_primary_class(False) + class C(B): + pass + + class D(C): + pass + + assert data.classes["A"].pragmas["ql_to_string_impl_from_primary_class"] is True + assert data.classes["B"].pragmas["ql_to_string_impl_from_primary_class"] is True + assert data.classes["C"].pragmas["ql_to_string_impl_from_primary_class"] is False + assert data.classes["D"].pragmas["ql_to_string_impl_from_primary_class"] is False + + def test_synth_from_class(): @load class data: diff --git a/rust/ql/.generated.list b/rust/ql/.generated.list index ebbf91a4f16a..53e249477270 100644 --- a/rust/ql/.generated.list +++ b/rust/ql/.generated.list @@ -204,27 +204,46 @@ lib/codeql/rust/elements/WildcardPat.qll 4f941afc5f9f8d319719312399a8f787c75a0db lib/codeql/rust/elements/YeetExpr.qll 4172bf70de31cab17639da6eed4a12a7afcefd7aa9182216c3811c822d3d6b17 88223aab1bef696f508e0605615d6b83e1eaef755314e6a651ae977edd3757c3 lib/codeql/rust/elements/YieldExpr.qll de2dc096a077f6c57bba9d1c2b2dcdbecce501333753b866d77c3ffbe06aa516 1f3e8949689c09ed356ff4777394fe39f2ed2b1e6c381fd391790da4f5d5c76a lib/codeql/rust/elements/internal/AbiConstructor.qll 4484538db49d7c1d31c139f0f21879fceb48d00416e24499a1d4b1337b4141ac 460818e397f2a1a8f2e5466d9551698b0e569d4640fcb87de6c4268a519b3da1 +lib/codeql/rust/elements/internal/AbiImpl.qll 28a2b6bdb38fd626e5d7d1ed29b839b95976c3a03717d840669eb17c4d6f0c7a 8e83877855abe760f3be8f45c2cf91c1f6e810ec0301313910b8104b2474d9cf lib/codeql/rust/elements/internal/ArgListConstructor.qll a73685c8792ae23a2d628e7357658efb3f6e34006ff6e9661863ef116ec0b015 0bee572a046e8dfc031b1216d729843991519d94ae66280f5e795d20aea07a22 +lib/codeql/rust/elements/internal/ArgListImpl.qll 0903b2ca31b3e5439f631582d12f17d77721d63fdb54dc41372d19b742881ce4 2c71c153ccca4b4988e6a25c37e58dc8ecb5a7483273afff563a8542f33e7949 lib/codeql/rust/elements/internal/ArrayExprInternal.qll 07a219b3d3fba3ff8b18e77686b2f58ab01acd99e0f5d5cad5d91af937e228f5 7528fc0e2064c481f0d6cbff3835950a044e429a2cd00c4d8442d2e132560d37 lib/codeql/rust/elements/internal/ArrayExprInternalConstructor.qll f9756bc40beee99c5e4355bf157030b440c532dff5bdf43e848b3aa1a00fea90 39467f7f313e6f9ede1fe92375ee408098dc65291ca8ee50e36a3684a2767836 +lib/codeql/rust/elements/internal/ArrayExprInternalImpl.qll ae4488846c8309b2d4a51d54b36fce0a75107917c0b1f8af5ccf40797f570580 37838c7d6a04b95a16ed46e963d7e56def7a30b5e5ef1ab7e0dfdb5f256fa874 lib/codeql/rust/elements/internal/ArrayTypeReprConstructor.qll 52fea288f2031ae4fd5e5fe62300311134ed1dec29e372500487bf2c294516c1 fa6484f548aa0b85867813166f4b6699517dda9906e42d361f5e8c6486bdcb81 +lib/codeql/rust/elements/internal/ArrayTypeReprImpl.qll c00e03cc7136383bde1d830a8760e0e8665ed49692023ad27ad1e9c8eeb27c48 52cbc8e247f346f4b99855d653b8845b162300ecdab22db0578e7dec969768d0 lib/codeql/rust/elements/internal/AsmClobberAbiConstructor.qll 8bc39bd50f46b7c51b0cf2700d434d19d779ed6660e67e6dcec086e5a137ae3e 4e7425194565bea7a0fdc06e98338ebaeef4810d1e87245cdc55274534f1a592 +lib/codeql/rust/elements/internal/AsmClobberAbiImpl.qll aa6be2677bec6fa83ec3e29ee2aa53a0214a50de9a620a52ebdc6b94aaf38736 128937b710b5321788fe9675e0d364da09fd771c9ebc34b3de106496ef43396c lib/codeql/rust/elements/internal/AsmConstConstructor.qll 810cb616b04b3e70beb0e21f9ead43238d666ab21982ad513fc30c3357c85758 ad864bec16d3295b86c8aef3dc7170b58ef307a8d4d8b1bc1e91373021d6ae10 +lib/codeql/rust/elements/internal/AsmConstImpl.qll 775e6cc5df01462b649925a4bdd8f8d5481ec1d84e1c764d8eaf94e9e032822c 810c069fad76d4441c556dc72544cb4cac84169ae749e0686d88985acfc9acd9 lib/codeql/rust/elements/internal/AsmDirSpecConstructor.qll 91514d37fc4f274015606cc61e3137be71b06a8f5c09e3211affb1a7bd6d95b2 866ba3f8077e59b94ae07d38a9152081fc11122e18aa89cdd0c0acd9c846ed87 +lib/codeql/rust/elements/internal/AsmDirSpecImpl.qll ba95497c1c83ee9193adbdd619efe60c8178123ead1eef8e07e1b686af1106fb c0c99a40187cd2bb12bef97fc312ca69c742c965ea130da842eb75d91ecfb0d8 lib/codeql/rust/elements/internal/AsmExprConstructor.qll 36c68023b58beec30af9f05d9d902a4c49faa0206b5528d6aad494a91da07941 4d91b7d30def03e634b92c0d7b99b47c3aadd75f4499f425b80355bc775ea5b6 +lib/codeql/rust/elements/internal/AsmExprImpl.qll a5eec51c3a01e89456283a3054a40527b819a3f4c28405e1e38b09adae922581 ba53e4bdbe9e13d658dd78765c6ea7db3bb0f60536c24751bcb9108f07134401 lib/codeql/rust/elements/internal/AsmLabelConstructor.qll e5f04525befc30136b656b020ade440c8b987ec787ff9c3feec77c1660f2556d cb9394581e39656bbe50cf8cc882c1b4b5534d7d0d59cef5c716d1c716a8a4f6 +lib/codeql/rust/elements/internal/AsmLabelImpl.qll cc1cc4be2f804915731acadb438ee755d330d3557a5d029aff1b208f2b5a7d19 298b8e2974f5c01e9f6bab5c485ce7e149a1392343bfc7c03a536c4bd41c0e7c lib/codeql/rust/elements/internal/AsmOperandExprConstructor.qll a7a724033717fe6c7aefb344bc21278baa690408135958d51fe01106e3df6f69 72212bf8792f5b8483a3567aab86fad70a45d9d33e85d81c275f96b2b10c87d1 +lib/codeql/rust/elements/internal/AsmOperandExprImpl.qll d97b9ab3740c68b17b716d672371958dcbca396b2fed670d407732e13989fbec f34b43f3f8b70da9470216cc6f535b928291780edebce69e208b7a9fb662b0f4 lib/codeql/rust/elements/internal/AsmOperandImpl.qll acd1eb6467d7b1904e2f35b5abe9aa4431b9382c68da68ea9a90938c8277e2f0 ab21f5a8d57da0698b8fbfee6d569c95671ea48d433e64337e69452523cec9c3 lib/codeql/rust/elements/internal/AsmOperandNamedConstructor.qll 321fdd145a3449c7a93e6b16bb2d6e35a7d8c8aa63a325aa121d62309509ae58 08386b0e35c5e24918732f450a65f3b217601dc07123396df618ac46b9e94d7d +lib/codeql/rust/elements/internal/AsmOperandNamedImpl.qll a50add359936b7efa3411163e6d51ee3e4083dd05f65cefb63a7648bbf251202 9c7d9515d9adcc4652aea864dfd5273f1260539b41b4d201778e0374988553cb lib/codeql/rust/elements/internal/AsmOptionConstructor.qll 4dc373d005a09bf4baba7205a5fe536dae9fcd39c5a761796a04bf026862e0c2 3e4d8f38344c1a246bce6e4f1df1fc47e928b7a528b6a82683259f7bc190ed13 +lib/codeql/rust/elements/internal/AsmOptionImpl.qll 41199586e1ef9127f07673b46293816a483774e997c5b2e44cf5579ce3aad765 3ee04fd2d070a581afe15822da768f1e4c1e3f1a3645f01e1b99717d9dce93ec lib/codeql/rust/elements/internal/AsmOptionsListConstructor.qll 45e78f45fb65c1ae98f16e5c4d8129b91cf079b6793c5241981fab881b6a28a7 1fc496b87693e779e5185741461d5de7061699d7d94d15c8a6edec4fb0c5ccc7 +lib/codeql/rust/elements/internal/AsmOptionsListImpl.qll 078ad57aaa0741ad256d6f7102ad226979766b4991fc3c96b12b556732c17f6b c70814bae7ef4c5e3e6f05f7a512d4e2cd559922616f0c0e6fc68127b21a1089 lib/codeql/rust/elements/internal/AsmPieceImpl.qll 1e501905bbf11c5a3cc4327af6b4a48ce157258d29c5936269e406d9e0fe21d4 54b91047f72c03ebbd84cf1826b7bfc556620a161edf3085d0a4faef8e60f63e lib/codeql/rust/elements/internal/AsmRegOperandConstructor.qll 5299b8134fdf2034c4d82a13a1f5ba7d90ffeae18ecd1d59aa43fd3dbf7ab92b d135f5e4a2d9da6917fb3b8277be9fcd68bcb1e3a76e4b2e70eb0b969b391402 +lib/codeql/rust/elements/internal/AsmRegOperandImpl.qll 0999a4b492e6508dd74de56ed3a40d0e16959877efc060a516a404336ec605a3 70ca08941d76ebac530ee98894aa721877147b21c447d4e93c3aef92222bb1ca lib/codeql/rust/elements/internal/AsmRegSpecConstructor.qll bf3e0783645622691183e2f0df50144710a3198159c030e350b87f7c1bb0c86f 66f7c92260038785f9010c0914e69589bb5ff64fb14c2fb2c786851ca3c52866 +lib/codeql/rust/elements/internal/AsmRegSpecImpl.qll 7ad0a5b86922e321da9f8c7ea8aefa88068b27bcea3890f981b061a204ab576d 65f13c423ef42209bd514523f21dd1e43cc4f5c191bdb85ba7128c76241f78a8 lib/codeql/rust/elements/internal/AsmSymConstructor.qll 9c7e8471081b9173f01592d4b9d22584a0d1cee6b4851050d642ddaa4017659e adc5b4b2a8cd7164da4867d83aa08c6e54c45614c1f4fc9aa1cbbedd3c20a1b3 +lib/codeql/rust/elements/internal/AsmSymImpl.qll e173807c5b6cf856f5f4eaedb2be41d48db95dd8a973e1dc857a883383feec50 ab19c9f479c0272a5257ab45977c9f9dd60380fe33b4ade14f3dddf2970112de lib/codeql/rust/elements/internal/AssocItemListConstructor.qll 1977164a68d52707ddee2f16e4d5a3de07280864510648750016010baec61637 bb750f1a016b42a32583b423655279e967be5def66f6b68c5018ec1e022e25e1 +lib/codeql/rust/elements/internal/AssocItemListImpl.qll 70e82744464827326bfc394dab417f39905db155fb631f804bf1f27e23892698 760c7b42137d010e15920f9623e461daaf16518ab44a36a15259e549ecd4fa7a lib/codeql/rust/elements/internal/AssocTypeArgConstructor.qll 58b4ac5a532e55d71f77a5af8eadaf7ba53a8715c398f48285dac1db3a6c87a3 f0d889f32d9ea7bd633b495df014e39af24454608253200c05721022948bd856 +lib/codeql/rust/elements/internal/AssocTypeArgImpl.qll 5a5016276bef74ae52c6b7a04dfd46b0d466356292c110860c7f650a2d455100 b72b10eeede0f945c96f098e484058469f6e6e2223d29377d6ef3e2fde698624 lib/codeql/rust/elements/internal/AttrConstructor.qll de1dd30692635810277430291ba3889a456344dbd25938d9f8289ab22506d5cd 57b62b2b07dee4a9daeed241e0b4514ba36fd5ec0abb089869a4d5b2c79d6e72 +lib/codeql/rust/elements/internal/AttrImpl.qll 3d5b3b8efd1f1401a33585d36a8f127ea1dff21fc41330e2e6828925bcc0995a 28c9132499da2ccb00e4f3618341c2d4268c2dccbbf4739af33d4c074f9b29cd lib/codeql/rust/elements/internal/AwaitExprConstructor.qll 44ff1653e73d5b9f6885c0a200b45175bb8f2ceb8942c0816520976c74f1fc77 11e6f4a1e1462a59e2652925c8bd6663e0346c311c0b60ebe80daa3b55b268b0 lib/codeql/rust/elements/internal/BecomeExprConstructor.qll ba073aaa256cb8827a0307c3128d50f62b11aac0b1f324e48c95f30351a9b942 3a787ded505c3158fa4f4923f66e8ecdcb7b5f86f27f64c5412dc32dca031f18 lib/codeql/rust/elements/internal/BinaryExprConstructor.qll 7f9b17757f78b9fb7c46e21d2040a77fa50083bef4911c8464991c3d1ad91d87 a59390cd8e896c0bfbdc9ba0674e06d980ffcefa710fbc9886be52ed427e9717 @@ -234,36 +253,51 @@ lib/codeql/rust/elements/internal/BreakExprConstructor.qll 356be043c28e0b34fdf92 lib/codeql/rust/elements/internal/CallExprConstructor.qll 742b38e862e2cf82fd1ecc4d4fc5b4782a9c7c07f031452b2bae7aa59d5aa13a cad6e0a8be21d91b20ac2ec16cab9c30eae810b452c0f1992ed87d5c7f4144dc lib/codeql/rust/elements/internal/CastExprConstructor.qll f3d6e10c4731f38a384675aeab3fba47d17b9e15648293787092bb3247ed808d d738a7751dbadb70aa1dcffcf8af7fa61d4cf8029798369a7e8620013afff4ed lib/codeql/rust/elements/internal/CfgAtomConstructor.qll b71484029b4fdaa5df6b42f6b38c3feb0ad72284e5badf3d8413b78d6d14240b 146c73c0354d67fbccba5eb2fe21918ab441d953e005b4ec5482c80388d9493d +lib/codeql/rust/elements/internal/CfgAtomImpl.qll 47ca5355933e1c405dc2edec7bff9fd9be5132f708d6d7e0237a9f0a809eefa7 965eeca1d9ba5045735b16fa0340c0227f22418e0545f381c4df36eac23cf3fe lib/codeql/rust/elements/internal/CfgAttrMetaConstructor.qll 8cae731f5e86830dec3367b1c69e807389bc434b4f83ff6e13427e4106ec6f2c 0ced22b35219edf0250a8542062f66641f03c13575a3c71d4d718ce5146288ea +lib/codeql/rust/elements/internal/CfgAttrMetaImpl.qll 2b8a578d52aea3ab218f1337ba2c8737cf16e9c64580b1916860dc66ae3e9025 e92e5e8dc79b1da72873af410b778054df7e22bc9080719d60371bc72bc27043 lib/codeql/rust/elements/internal/CfgCompositeConstructor.qll 160bfbccdd80c9b9421b33cb302f6fe48bebe80050a01ad72a43f7332100f834 0102cad0255d632cac4ffaf334ce15f9beff9d7eb7d14a50255ef5c0e4b67d7b +lib/codeql/rust/elements/internal/CfgCompositeImpl.qll 840a148dc5c4b213ffdaca6213d6f2dfa3c1dad3f99293f8244baa3bf6902909 36e9291b124c52bb2e4620bead8acf2f9be4a2281eccfd74411adaf91914dd20 lib/codeql/rust/elements/internal/CfgMetaConstructor.qll 335cb7a36e430b08a12c5548d0a91bbb9a00aaa2f9b0dc7b2fa526882ec0271e 0bd7002f58c1c19c22023d6f03874d84e083e1aa09ec9cac888661d5ad632f6b +lib/codeql/rust/elements/internal/CfgMetaImpl.qll 9d820fb4dee32288e467a8b667ba191588381d8ec2a0ce0e5e8645ee437a16a8 5888fb533768a36d94f56f81058aa0d00c4a2c13721af42bdd30628747698bce lib/codeql/rust/elements/internal/CfgPredicateImpl.qll 3ba6c6732a7de4df967dd2cb2b4cc99db8aefb2301b75521f1b369052e3a2ec0 c07d4366f98f374f24e235f809946dc513a16203e4c1eb151c8185a5bc79e70d lib/codeql/rust/elements/internal/ClosureExprConstructor.qll a348229d2b25c7ebd43b58461830b7915e92d31ae83436ec831e0c4873f6218a 70a1d2ac33db3ac4da5826b0e8628f2f29a8f9cdfd8e4fd0e488d90ce0031a38 lib/codeql/rust/elements/internal/CommentConstructor.qll 0b4a6a976d667bf7595500dfb91b9cfc87460a501837ba5382d9a8d8321d7736 7d02d8c94a319dc48e7978d5270e33fc5c308d443768ff96b618236d250123f1 lib/codeql/rust/elements/internal/ConstArgConstructor.qll f63021dc1ca2276786da3a981d06c18d7a360b5e75c08bca5d1afece4f7c4a83 487a870cbf5ed6554d671a8e159edd9261d853eba2d28ce2bd459759f47f11f2 +lib/codeql/rust/elements/internal/ConstArgImpl.qll dc7e7b5fe1a6eeb61dd30a55a3ed2ab87bb82d712b40e4901cff44e4a6fae3f4 1ea7553d764617807df71286a4dd5cbbf51c9f45aa8c8c19e9cc91b41dbe0645 lib/codeql/rust/elements/internal/ConstBlockPatConstructor.qll ddb4a0045635d477e87360ecafec0ba90ddcffc6e62996eb6e7edd5a5d65b860 442061d0497a615b3f008b990f5e3c4f045110f76500eff81a7f44ffd1319acf +lib/codeql/rust/elements/internal/ConstBlockPatImpl.qll 2082a3244c21e03b6dadfba9b3f97a00981324e10d1465d3a51cf3c921eb89e4 889e347834d8c6e90dfef9714af073b3b2193f6830f1c8356cee9c6573b3ecb4 lib/codeql/rust/elements/internal/ConstConstructor.qll 72a31fd9b8b3fd910e35af1b2b30fa54cc4d9e14e7eabdb94b4cd2af95b2df38 3edc0a82a7b446fdfd3e71947801f3c7cac010b2a217b8accb69980387bdd67a lib/codeql/rust/elements/internal/ConstParamConstructor.qll f6645f952aac87c7e00e5e9661275312a1df47172088b4de6b5a253d5c4ed048 eda737470a7b89cf6a02715c9147d074041d6d00fd50d5b2d70266add6e4b571 +lib/codeql/rust/elements/internal/ConstParamImpl.qll c6995be58f84d1df65897c80f7ee3dd8eb410bb3e634ff1bfe1be94dfb3fdf32 bcfb5547b40f24bcec20056fe1d36724b734c920b0bc7538fe2974b03f4478fe lib/codeql/rust/elements/internal/ContinueExprConstructor.qll cd93f1b35ccdb031d7e8deba92f6a76187f6009c454f3ea07e89ba459de57ca6 6f658e7d580c4c9068b01d6dd6f72888b8800860668a6653f8c3b27dc9996935 lib/codeql/rust/elements/internal/CrateConstructor.qll 2a3710ed6ff4ffdbc773ac16e2cf176415be8908e1d59fd0702bdeddbae096f4 f75a069b0ef71e54089001eb3a34b8a9e4ce8e4f65ffa71b669b38cf86e0af40 lib/codeql/rust/elements/internal/DerefPatConstructor.qll a92a1e9b310a7dc92f31952b08c264cbd57265a5c619ff1abecf739ed4f6525f f86e26668b88baa571ca7521782141ce92f816ec366024c21c953bc335482c10 +lib/codeql/rust/elements/internal/DerefPatImpl.qll b43a939e3d373b411fe7b8b2b8192f6cb58860fd806aaa83f20b7e2be06c7e63 21b433843baa1aef9d5a67bd4cfcfbbb08a64a1e8d31ab254ecdc2ef1f1854c0 lib/codeql/rust/elements/internal/DynTraitTypeReprConstructor.qll 6964e6c80fb7f5e283c1d15562cef18ed097452b7fcbc04eff780c7646675c7a f03c4830bf1b958fdfb6563136fa21c911b2e41ce1d1caee14ec572c7232866d lib/codeql/rust/elements/internal/EnumConstructor.qll eca1a13937faacb1db50e4cf69d175f992f2204a5aaed9144bb6f3cb63814ac5 1bafba78b2729fdb052a25a1ba3f4f70871564aa4df632b4a1d467858a437924 lib/codeql/rust/elements/internal/ExprImpl.qll ab20ee174e2e786f34af6e5dedf3ec071bb89fc266b3e91df6377f72aa38d3f2 f68192700f449bf1c229cfbaabd5353c7c559941c915d5a0c88752cf9844194b lib/codeql/rust/elements/internal/ExprStmtConstructor.qll dd6bb06a7d48c12f630aafd611621cc50ce0f3e7d9abba5484a695f90879264b dc8b6ec8acc314e041ae71868803630c5d4cab488c72c1ea929bb756e1847c52 +lib/codeql/rust/elements/internal/ExprStmtImpl.qll 420221c64245b490dab85f4e50d6b408cf488349869eb87312c166e185ad8145 2c2a4c71eea8c1ad8823e8e22780fadebb38ae502b3a7b9b062923a188fef692 lib/codeql/rust/elements/internal/ExternBlockConstructor.qll 884bafd1cb5a6ce9f54a7a6b9ba1c8814f38e3baf69a2ff8cfc8b02163204b9d ee26e070fcbfd730bbfaf0502d5ed54110c25f84e7b65948c8638a314b67ea5d +lib/codeql/rust/elements/internal/ExternBlockImpl.qll 6234810c73ede38cd78bf4824e729db0485522f0098f2a4af43c44233996f1eb 9b6327a491ee5c713b4f5056231e67160a34894c736cc5c7248a7c6c45f620ad lib/codeql/rust/elements/internal/ExternCrateConstructor.qll edd4d69ca7e36bd8389a96eac4ce04d9dd3857b0470b9f24319312469b0f8654 c80f4968e675f4b29e92a2fd8783f800823cc855ad193fee64869d5ba244d949 +lib/codeql/rust/elements/internal/ExternCrateImpl.qll 4aedfd8f0398015c3a93bf49d9ebdeb6a805bc05ae6ddbf5ee4d27b3af363f9b fba287a8b62ae795f28ac3aa1f67221109473deb48aaa91ff567087dbeb54d4e lib/codeql/rust/elements/internal/ExternItemImpl.qll 9a723a8d67054d8442dcca6dd0f285b25e69f39b1f4c90040fb04cd991d25069 e4de7bd6d9c1ce4a62b05ee4a64bdc169403bffa9673275c2a6c061ccff9a570 lib/codeql/rust/elements/internal/ExternItemListConstructor.qll 9e4f6a036707c848c0553119272fd2b11c1740dd9910a626a9a0cf68a55b249b efde86b18bd419154fb5b6d28790a14ea989b317d84b5c1ddbdfb29c6924fd86 +lib/codeql/rust/elements/internal/ExternItemListImpl.qll f73e1a11ff7810aa554254a394b5e167e45114c6deaa6c3d16fb2b3c6cd60286 b7f8453582fbd8d4a4e0472e850398418542e5c33bc4fe2f743a649374787aa4 lib/codeql/rust/elements/internal/ExtractorStep.qll 1c65668007ea71d05333e44132eccc01dc2a2b4908fb37d0a73995119d3ed5f0 8cbe1eeb35bc2bc95c1b7765070d1ff58aae03fd28dc94896b091858eea40efe lib/codeql/rust/elements/internal/ExtractorStepConstructor.qll 00c527a3139ad399ea1efd0ebe4656372d70f6c4e79136bc497a6cb84becae8e 93817f3dddeaf2c0964ab31c2df451dcee0aeba7cb6520803d8ce42cefcb3703 lib/codeql/rust/elements/internal/FieldExprConstructor.qll b3be2c4ccaf2c8a1283f3d5349d7f4f49f87b35e310ef33491023c5ab6f3abc5 645d0d4073b032f6b7284fc36a10a6ec85596fb95c68f30c09504f2c5a6f789f lib/codeql/rust/elements/internal/FieldListImpl.qll 6b80b573989ee85389c4485729a40c92c7e0a5b8a96a4385e812c74fb63c894f d333bcb043616b95ffefed4d216f94e5b07541f8153e4fb8084f4e793947b023 lib/codeql/rust/elements/internal/FnPtrTypeReprConstructor.qll 61d8808ea027a6e04d5304c880974332a0195451f6b4474f84b3695ec907d865 0916c63a02b01a839fe23ec8b189d37dc1b8bc4e1ba753cbf6d6f5067a46965a +lib/codeql/rust/elements/internal/FnPtrTypeReprImpl.qll 6b66f9bda1b5deba50a02b6ac7deb8e922da04cf19d6ed9834141bc97074bf14 b0a07d7b9204256a85188fda2deaf14e18d24e8a881727fd6e5b571bf9debdc8 lib/codeql/rust/elements/internal/ForBinderConstructor.qll 98f16b0106a19210713404f4be8b1b9f70c88efb0b88bdf2f9ea9c8fbd129842 a7af9e75f11d824a60c367924542a31a0f46f7b1f88d3ee330d4dd26b2f29df5 lib/codeql/rust/elements/internal/ForExprConstructor.qll d79b88dac19256300b758ba0f37ce3f07e9f848d6ae0c1fdb87bd348e760aa3e 62123b11858293429aa609ea77d2f45cb8c8eebae80a1d81da6f3ad7d1dbc19b lib/codeql/rust/elements/internal/ForTypeReprConstructor.qll eae141dbe9256ab0eb812a926ebf226075d150f6506dfecb56c85eb169cdc76b 721c2272193a6f9504fb780d40e316a93247ebfb1f302bb0a0222af689300245 +lib/codeql/rust/elements/internal/ForTypeReprImpl.qll dbbcb86626dcba3d5534d461d7306c354a15f800ff37c1d039801b868179b387 f942eebb20fb2603b7bab0e90f3e3f7a3f87dd6229090fc011c692a52164ac90 lib/codeql/rust/elements/internal/FormatArgsArgConstructor.qll 8bd9b4e035ef8adeb3ac510dd68043934c0140facb933be1f240096d01cdfa11 74e9d3bbd8882ae59a7e88935d468e0a90a6529a4e2af6a3d83e93944470f0ee +lib/codeql/rust/elements/internal/FormatArgsArgImpl.qll 6a8f55e51e141e4875ed03a7cc65eea49daa349de370b957e1e8c6bc4478425c 7efab8981ccbe75a4843315404674793dda66dde02ba432edbca25c7d355778a lib/codeql/rust/elements/internal/FormatArgsExprConstructor.qll ce29ff5a839b885b1ab7a02d6a381ae474ab1be3e6ee7dcfd7595bdf28e4b558 63bf957426871905a51ea319662a59e38104c197a1024360aca364dc145b11e8 lib/codeql/rust/elements/internal/FunctionConstructor.qll b50aea579938d03745dfbd8b5fa8498f7f83b967369f63d6875510e09ab7f5d2 19cca32aeaecaf9debc27329e8c39ecec69464bb1d89d7b09908a1d73a8d92a2 lib/codeql/rust/elements/internal/GenericArgImpl.qll fde43bb0e3cb2d8eb9feb02012b0a4f934015f8175ec112dea1077d131f55acb 44842e8075f750ba2876cff28d07284f99188982aa6d674ec863ad90305bf6ae @@ -274,46 +308,64 @@ lib/codeql/rust/elements/internal/IdentPatConstructor.qll 09792f5a070996b65f095d lib/codeql/rust/elements/internal/IfExprConstructor.qll 03088b54c8fa623f93a5b5a7eb896f680e8b0e9025488157a02c48aaebc6ad56 906f916c3690d0721a31dd31b302dcdcec4233bb507683007d82cf10793a648f lib/codeql/rust/elements/internal/ImplConstructor.qll 24edccca59f70d812d1458b412a45310ddc096d095332f6e3258903c54c1bb44 7eb673b3ab33a0873ee5ce189105425066b376821cce0fc9eb8ace22995f0bc7 lib/codeql/rust/elements/internal/ImplRestrictionConstructor.qll 7d58e3efd82a6869fec0c95733d710223563ba063a11096bc78bdaa2b52228ee 83c219aabb5d037dcece2e723b8424f0a853d5a7c15562c1b5b964e8ea43fd2d +lib/codeql/rust/elements/internal/ImplRestrictionImpl.qll 5023ad9d8103df7c23b3d301ab6a957b2ed17a7b6f78b724e1cfb913423439dc 35ccaf051a5cbc3bf76578a6a30ff11b6f2520bb55232751ec951d9d65119aa5 lib/codeql/rust/elements/internal/ImplTraitTypeReprConstructor.qll 1ed355e5e56f432b24b6f4778e4dc45c6e65095190cacb7a5015529e0c9d01f8 c8505185a042da4eb20a0cc32323194a0290c4bf821c7e0fce7351b194b10f31 lib/codeql/rust/elements/internal/IncludeBytesExprConstructor.qll 62d20cf32e8c0fa62ef5b472e3b5538b95cc6bf275955f195a4924c2f38c9ba8 5fd4b50e9760af5a5c76d616658adde406470c4c9eac9b846dc0b7583e6460c1 +lib/codeql/rust/elements/internal/IncludeBytesExprImpl.qll cf1da0abb200dceedf5000fe6565456fd1526310565df1f210ec12c37b3b1f4f 82195e928034735f3e41b4d4cf48d411cf6719089f0529a843e79a1dabb94b21 lib/codeql/rust/elements/internal/IndexExprConstructor.qll 99bdc3d793c4dbd993860da60abe2b7c604345d645e86916462bc55a6939a5d1 3fe9d7da725956903707806aadbecac8d5b3874e8bed63c9bab54fff630e75dd lib/codeql/rust/elements/internal/InferTypeReprConstructor.qll bc5f16853401617fc9c5af8a1287a23c5921df1b615cfbe2d7c7a70145ecfcbd da93bd28ea2daade2cbb0a729be3fbf05f72bc02009565c7bb062e4f68fdb9e7 lib/codeql/rust/elements/internal/ItemListConstructor.qll 08af3bd12536941c3dd4a43c81cc861be24325e242e2593c087a3ce632674291 2fa166159c409d2aaffa73a30babb40829a6de580bd40894d909ee6152801082 +lib/codeql/rust/elements/internal/ItemListImpl.qll 195dbe93c334ad2bfc29db530bda9aaea88fc31696b2f230faae9e6c2ecb74a8 e498983a5b2f7a91e2fd336e85ac17e521a18c677784a0788d95bb283f3652e7 lib/codeql/rust/elements/internal/KeyValueMetaConstructor.qll 946f4df587ae7c77445faec67b0c796e008a10c642e5bdf881f9f75e819a1f93 d2bff94a5f8967fabadb76424917383e1472467db1d90214b1b871ebf8da672d +lib/codeql/rust/elements/internal/KeyValueMetaImpl.qll 6f895ee05d983885ad3624b5c64483f2c9024888ed62781889c589ba6fadb4eb 4004bb1b22c30e27f7e2262e9788d1ad3ea4cb08729d8910140c54663a123b91 lib/codeql/rust/elements/internal/LabelConstructor.qll 1f814c94251e664bfa1b1a606aef995382e40e78d4f953350ec951ee0bc8bd34 3157fb8c7c6bd365a739f217ad73ba1e0b65ccd59b922e5ab034e3449915b36c lib/codeql/rust/elements/internal/LetElseConstructor.qll b2b5d68e5701379a0870aa6278078e09f06aa18ddd14045fc6ae62e90827ece7 7359e70bea8a78bcaf6e6ecc8cc37c5135ae31415b74645594456cc8daa82118 lib/codeql/rust/elements/internal/LetExprConstructor.qll 66f27cbdafb2b72b31d99645ec5ed72f4b762a7d6f5d292d7639dd8b86272972 7da048f4d7f677919c41d5c87ead301eacc12ece634d30b30a8ae1fab580ff30 lib/codeql/rust/elements/internal/LetStmtConstructor.qll 7ee0d67bebd6d3b9c7560137c165675d17b231318c084952ba4a2226d61e501f 84199ba755bb6c00579eee245b2bca41da478ca813b202b05abaa1246dcf13d8 lib/codeql/rust/elements/internal/LifetimeArgConstructor.qll 270f7de475814d42e242e5bfe45d7365a675e62c10257110286e6a16ce026454 643d644b60bfe9943507a77011e5360231ac520fbc2f48e4064b80454b96c19b +lib/codeql/rust/elements/internal/LifetimeArgImpl.qll ea3e831077f6ee51de90949a3487b007aeeea74f08e74ee8ce2f4f1a41bc7b7c da99145353601cf124e4ebbd425cc4b8561b5f6f7451c9696ac0bed94eaf84cd lib/codeql/rust/elements/internal/LifetimeConstructor.qll 2babe40165547ac53f69296bb966201e8634d6d46bc413a174f52575e874d8cd ef419ae0e1b334d8b03cdb96bc1696787b8e76de5d1a08716e2ff5bd7d6dc60d lib/codeql/rust/elements/internal/LifetimeParamConstructor.qll 530c59a701d814ebc5e12dc35e3bfb84ed6ee9b5be7a0956ea7ada65f75ff100 ff6507e5d82690e0eec675956813afabbbcfb89626b2dbfffe3da34baeff278c +lib/codeql/rust/elements/internal/LifetimeParamImpl.qll e9251af977880dcdf659472fa488b3f031fa6f6cbf6d9431218db342148b534f 63b287477b23434f50763b2077a5f2461de3d8ba41ef18ac430ffa76eb7f2704 lib/codeql/rust/elements/internal/LiteralExprConstructor.qll 8ea3569bd50704ce7d57be790d2dfd38f4c40cb0b12e0dd60d6830e8145a686f 88d07ad3298003f314f74bd8e3d64a3094de32080ad42a7e6741c416c3856095 lib/codeql/rust/elements/internal/LiteralPatConstructor.qll b660cb428a0cba0b713fc7b07d5d2921de4a2f65a805535fb6387684c40620de 2dbc9fbc56e9de53d24265d6b13738ef5b9ced33cc3c4c1c270e04dc2fc1330f lib/codeql/rust/elements/internal/LoopExprConstructor.qll 45f3f8f7441fcab6adc58831421679ee07bac68ac0417f3cbc90c97426cc805b f7ab3361b4a11e898126378ea277d76949466946762cd6cb5e9e9b4bb9860420 lib/codeql/rust/elements/internal/LoopingExprImpl.qll 17885c1bcf7b5a3f9c7bbad3d4d55e24372af0dedd5e7fc0efcfc0a8b2cdad70 104dc45ca399b9f6e8227ad561679f728d60170398a52b31fc90cb2a2dd3c33c lib/codeql/rust/elements/internal/MacroCallConstructor.qll 707fee4fba1fd632cd00128f493e8919eaaea552ad653af4c1b7a138e362907d b49e7e36bf9306199f2326af042740ff858871b5c79f6aeddf3d5037044dbf1f lib/codeql/rust/elements/internal/MacroDefConstructor.qll 382a3bdf46905d112ee491620cc94f87d584d72f49e01eb1483f749e4709c055 eb61b90d8d8d655c2b00ff576ae20c8da9709eeef754212bc64d8e1558ad05ce +lib/codeql/rust/elements/internal/MacroDefImpl.qll 73db95ff82834e0063699c7d31349b65e95ba7436fe0a8914dbdd3a383f8b1c9 cd2f078f84ce73fdc88b207df105b297f2cd3b780428968214443af3a2719e8f lib/codeql/rust/elements/internal/MacroExprConstructor.qll b12edb21ea189a1b28d96309c69c3d08e08837621af22edd67ff9416c097d2df d35bc98e7b7b5451930214c0d93dce33a2c7b5b74f36bf99f113f53db1f19c14 +lib/codeql/rust/elements/internal/MacroExprImpl.qll 35b0f734e62d054e0f7678b28454a07371acc5f6fb2ae73e814c54a4b8eb928a cd3d3d9af009b0103dd42714b1f6531ee6d96f9f40b7c141267ce974ef95b70e lib/codeql/rust/elements/internal/MacroItemsConstructor.qll 8e9ab7ec1e0f50a22605d4e993f99a85ca8059fbb506d67bc8f5a281af367b05 2602f9db31ea0c48192c3dde3bb5625a8ed1cae4cd3408729b9e09318d5bd071 +lib/codeql/rust/elements/internal/MacroItemsImpl.qll f89f46b578f27241e055acf56e8b4495da042ad37fb3e091f606413d3ac18e14 12e9f6d7196871fb3f0d53cccf19869dc44f623b4888a439a7c213dbe1e439be lib/codeql/rust/elements/internal/MacroPatConstructor.qll 24744c1bbe21c1d249a04205fb09795ae38ed106ba1423e86ccbc5e62359eaa2 4fac3f731a1ffd87c1230d561c5236bd28dcde0d1ce0dcd7d7a84ba393669d4a +lib/codeql/rust/elements/internal/MacroPatImpl.qll c014ffc6c8de9463d61b1d5f0055085543f68918fa9161723565fc946154b437 fb5d0679fe409c8dad7247fdfc1289ef944537f2a51e08bcf4bbb1485ef5fd2a lib/codeql/rust/elements/internal/MacroRulesConstructor.qll dc04726ad59915ec980501c4cd3b3d2ad774f454ddbf138ff5808eba6bd63dea 8d6bf20feb850c47d1176237027ef131f18c5cbb095f6ab8b3ec58cea9bce856 +lib/codeql/rust/elements/internal/MacroRulesImpl.qll 63f5f1151075826697966f91f56e45810de8f2ac3ec84b8fd9f5f160f906f0d5 1b70f90f4b7fb66839cfe0db84825a949ed1518278a56921ed0059857d788e2b lib/codeql/rust/elements/internal/MacroTypeReprConstructor.qll cf8a3bdcd41dda1452200993206593e957825b406b357fc89c6286cb282347ac a82279485416567428ab7bff7b8da7a3d1233fb1cfcdb1b22932ff13bd8c8ec9 +lib/codeql/rust/elements/internal/MacroTypeReprImpl.qll 50d47f2c0732a0fa33ed815e2b70ae0dbe78364abc8091e7bf89936c894a1e39 bf8a6454bb616cb64f51c546701988f00fb2ae9f3fc0dca311d87e7c240eb1b1 lib/codeql/rust/elements/internal/MatchArmConstructor.qll b41c1d5822d54127ce376ef62c6a5fa60e11697319fc7d9c9c54fd313d784a93 96cca80e5684e5893c0e9c0dff365ef8ad9e15ff648c9969ba42d91f95abea05 lib/codeql/rust/elements/internal/MatchArmListConstructor.qll 8bc5ac978fe1158ef70d0ac06bdad9e02aadd657decb64abcc4ea03f6715a87a 4604ab0e524d0de6e19c16711b713f2090c95a8708909816a2b046f1bd83fe24 +lib/codeql/rust/elements/internal/MatchArmListImpl.qll 16de8d9e0768ee42c5069df5c9b6bf21abcbf5345fa90d90b2dfcefd7579d6d9 91575188d9ed55d993ed6141e40f3f30506e4a1030cac4a9ac384f1e0f6880a9 lib/codeql/rust/elements/internal/MatchExprConstructor.qll 0355ca543a0f9ad56697bc2e1e2511fa3f233bc1f6344d9e1c2369106901c696 78622807a1c4bff61b751c715639510146c7a713e0c4f63246e9a2cf302f4875 lib/codeql/rust/elements/internal/MatchGuardConstructor.qll d4cae02d2902fe8d3cb6b9c2796137863f41f55840f6623935a1c99df43f28d8 0c89f2ca71a2fd5a3f365291e784cb779e34ba0542d9285515e1856424cec60d +lib/codeql/rust/elements/internal/MatchGuardImpl.qll 489040ca1ea85edda91405fab3d12321b6541d2888c35356d3c14c707bf1468e 2b60223a822b840356a3668da3f9578e6a9b8f683fcdd3dbd99b5354c7d96095 lib/codeql/rust/elements/internal/MethodCallExprConstructor.qll a1b3c4587f0ae60d206980b1d9e6881d998f29d2b592a73421d6a44124c70c20 8d4eaa3eb54653fac17f7d95e9cc833fe1398d27c02b2388cd9af8724a560ded lib/codeql/rust/elements/internal/MissingConstructor.qll aab0b7f2846f14a5914661a18c7c9eae71b9bde2162a3c5e5e8a8ecafa20e854 8f30b00b5b7918a7500786cc749b61695158b5b3cc8e9f2277b6b6bf0f7850a0 lib/codeql/rust/elements/internal/MissingImpl.qll e81caa383797dfe837cf101fb78d23ab150b32fef7b47ffcc5489bfcd942ac3e 9f3212d45d77e5888e435e7babd55c1e6b42c3c16f5b1f71170ac41f93ee8d0b lib/codeql/rust/elements/internal/ModuleConstructor.qll 31cc83c9d8f25ac07375d19e568f05c068e1f5aa205ff3d9ac31c2510e6f8468 8a70f3f1c18ff87f17e6baf2f05ccaed55c70469288192fc39ef0bb5531b8c0e lib/codeql/rust/elements/internal/MutRestrictionConstructor.qll 002e0b35790932db84a5643d9ffc531b10dc327b1b44b966e773bf9b4e46a325 5d81599d543825b8ace752dc03bafc9bae7f13bc8bcbb3db5e2e0243fc9c6772 +lib/codeql/rust/elements/internal/MutRestrictionImpl.qll 80e2f1b224a71df6a8c6544c1feb19a92b300cf3447c9905814a6539f89f1dde 16099f2adf7b4b9401f3320fc16d27c170b0d00221d9a062d373216150a2559b lib/codeql/rust/elements/internal/NameConstructor.qll a760134c6d4fc785746e1a5dc042a6bf25b8adaa3947a6897c31e50fd91dd5fd 1359f903d57112bcc1f62a609febb288301bfa810e569aa12e1045fd48b5b5c9 lib/codeql/rust/elements/internal/NameRefConstructor.qll 5ff6eacc614fd41f98b54cbb4960a07a1471cf4ea291758d33e54a48fd5d1bc4 c538d65414a24dfdbeb49cfd997588227559ba038f0b55d14bb5d89ed1a016f2 lib/codeql/rust/elements/internal/NamedCrate.qll 6c697076387b5af00422e227540d100ff7c03d3001f6a4c5b61433191d022490 2276f85411db199598fc6a5d8d6ec5762e42b1b45c98e398eeb75e69c697b57f lib/codeql/rust/elements/internal/NamedCrateConstructor.qll 72e07ece16f787dfd993982848689dc2e11845aa5634e9ee5ad8865b95cb59dc ea6555ae33cabe408935649b5e8c6218158036a3b7c4e1abc8bd7cd51c05a912 +lib/codeql/rust/elements/internal/NamedCrateImpl.qll ba1f775ca6177a5bdb2ef1891a3fd505642e2fec63910f958f380039499f45bf f66b503b3574d3be75b79870b754015740f58195c4924b71c21ba4e673efd8c4 lib/codeql/rust/elements/internal/NeverTypeReprConstructor.qll 2e0a9c75e389e9ef41a18dd9b5d6c29ffe1d1d633e51ef1de90ec553236d201a 61ea87802fd1c3a68e864ccd76657253a228b06471e4c55bcf94ca2be554f866 lib/codeql/rust/elements/internal/NotNullConstructor.qll 40e9254021ce7f09861c8d4ac70c3595953e8ade756a3da039d99a638fe8f0f3 3264d3ba76e04cdee673ae38dd3fcd7660978dc17d86c9b8f062bd0fbf3e5d3e +lib/codeql/rust/elements/internal/NotNullImpl.qll d76de5a4967440f52b2b968bae371d7e3aa11b98a38e7de0591720346e70224c 667b432d8500db42c56653b329ef80c7d3079f24efa360528d438c9dff5c9507 lib/codeql/rust/elements/internal/OffsetOfExprConstructor.qll 616e146562adb3ac0fba4d6f55dd6ce60518ed377c0856f1f09ba49593e7bfab 80518ce90fc6d08011d6f5fc2a543958067739e1b0a6a5f2ed90fc9b1db078f0 +lib/codeql/rust/elements/internal/OffsetOfExprImpl.qll e52d4596068cc54719438121f7d5afcaab04e0c70168ac5e4df1a3a0969817a6 6ab37e659d79e02fb2685d6802ae124157bf14b6f790b31688f437c87f40f52c lib/codeql/rust/elements/internal/OrPatConstructor.qll 4ef583e07298487c0c4c6d7c76ffcc04b1e5fe58aba0c1da3e2c8446a9e0c92b 980a6bd176ae5e5b11c134569910c5468ba91f480982d846e222d031a6a05f1a lib/codeql/rust/elements/internal/ParamConstructor.qll b98a2d8969f289fdcc8c0fb11cbd19a3b0c71be038c4a74f5988295a2bae52f0 77d81b31064167945b79b19d9697b57ca24462c3a7cc19e462c4693ce87db532 lib/codeql/rust/elements/internal/ParamListConstructor.qll 3123142ab3cab46fb53d7f3eff6ba2d3ff7a45b78839a53dc1979a9c6a54920e 165f3d777ea257cfcf142cc4ba9a0ebcd1902eb99842b8a6657c87087f3df6fe @@ -321,31 +373,44 @@ lib/codeql/rust/elements/internal/ParenExprConstructor.qll 104b67dc3fd53ab52e2a4 lib/codeql/rust/elements/internal/ParenPatConstructor.qll 9aea3c3b677755177d85c63e20234c234f530a16db20ab699de05ca3f1b59787 29f24aed0d880629a53b30550467ade09a0a778dbf88891769c1e11b0b239f98 lib/codeql/rust/elements/internal/ParenTypeReprConstructor.qll b3825399f90c8546c254df1f3285fe6053b8137e4705978de50017be941c9f42 696fa20ce5bd4731566b88c8ea13df836627354d37cc9d39514d89d8fb730200 lib/codeql/rust/elements/internal/ParenthesizedArgListConstructor.qll 67f49d376e87a58d7b22eb6e8f90c5b3d295a732be657b27ea6b86835a0ac327 6549e4f5bccb2d29dfeb207625f4d940344ac1bb4c7a7ae007a8eb1c4c985da0 +lib/codeql/rust/elements/internal/ParenthesizedArgListImpl.qll c885ff2903fcbe89540aff643d416e8d0dd5dcf1f7a77f48b9952f4679f8c92b 7e5d8e6d77999f02fe4267ceac6892b2063b1252cf5fa3bceab7898c6bad5c54 lib/codeql/rust/elements/internal/PathAstNodeImpl.qll 5a38c42a9127fc2071a9e8f0914996d8c3763e2708805de922e42771de50f649 ebe319cce565497071118cd4c291668bbcdf5fc8942c07efc5a10181b4ce5880 lib/codeql/rust/elements/internal/PathConstructor.qll 5c6354c28faf9f28f3efee8e19bdb82773adcf4b0c1a38788b06af25bcb6bc4a 3e2aeef7b6b9cda7f7f45a6c8119c98803aa644cf6a492cf0fce318eba40fe8f lib/codeql/rust/elements/internal/PathExprBaseImpl.qll e8b09447ee41b4123f7d94c6b366b2602d8022c9644f1088c670c7794307ab2e 96b9b328771aaf19ba18d0591e85fcc915c0f930b2479b433de3bfdd2ea25249 lib/codeql/rust/elements/internal/PathExprConstructor.qll cf6e0a338a8ed2d1042bdee4c2c49be5827e8c572d8c56e828db265d39e59ae3 36a3d1b7c5cc2cf527616be787b32071b9e2a6613a4f6b3f82e2a3b0e02a516f lib/codeql/rust/elements/internal/PathMetaConstructor.qll de6ebd053e66f0c72e6acb59c7a7e7326abfe0331e65080cc539030b93c49e32 327a8d8b5a6d721daa763cb5dac83247f9b2d9650be53ce01cbae02b15fbad94 +lib/codeql/rust/elements/internal/PathMetaImpl.qll 052152ec17c827054b1e9fccfc7cd7cb12fc0787e82242fde5724fd7a77b3b39 677460de83898bdfc9f06460ddb5dab2d4d884a88998c879b7eff5018d9b434a lib/codeql/rust/elements/internal/PathPatConstructor.qll 966c4ea22218ef71e000d7ce8dd5b570c39ad96b9239a3aa8a38292e2a9f36d2 8a1f348e9257ffc6e6bedcd70389b8e7ec2a3ed6e7b3733744ddfab284826e57 lib/codeql/rust/elements/internal/PathSegmentConstructor.qll 2d9639e42035dc7e73b7d6ddb8a977beadc6b4492dee4292b2f85b4409344441 c337fc3b9ef56366428772563e3f25f711474d16e860d3e89c1395a95d9e83e7 lib/codeql/rust/elements/internal/PathTypeReprConstructor.qll e05e7be13d48e7f832e735254777692d4be827a745b1fd94b9649d46fe574393 4aa1e6935a4479b61f205265cbbba01ce96d09a680c20d5decf30d1374d484d4 lib/codeql/rust/elements/internal/PatternTypeReprConstructor.qll cf17aaca86534afe86518f1dc2fdbf548fc0e9bf241d1e698a94940ce875d1f2 5799da5538796765846bcf09391ec2388cc96fdc6fea60819301ab6387d5d146 +lib/codeql/rust/elements/internal/PatternTypeReprImpl.qll 38052ab7f6f18d73556644291546d1f58709c2e44c7fdbcb259a4e5102bc1a08 f63d6fb495a1cad07ae55de210e766fdf15f011de4d8b7b2e8124d556287db26 lib/codeql/rust/elements/internal/PrefixExprConstructor.qll 90c50b0df2d4b4cbf5e2b7d67a9d243a1af9bfff660b7a70d8b9c7859c28bca7 1a1b5ea1f06ed8d41a658c872e8e1915c241a7c799c691df81b9a7b55d8f2f1e lib/codeql/rust/elements/internal/PtrTypeReprConstructor.qll c8bd3502dc23429577fbff0fe3e3c78b812b2237b2bb65862c137083fdaa7a4a 4d5c135be30f71a3712acbc22bdb6c425fa6463043a9ee64543da31151d68366 +lib/codeql/rust/elements/internal/PtrTypeReprImpl.qll cb3cf7960a05f2c1930067fc62c5a207fc5faac143758b9b9e5f117fbd073f2f 40545d4768380f0dde9b708932f92f57566ac49f3f9b4147a8ff2ea90a0947c7 lib/codeql/rust/elements/internal/RangeExprConstructor.qll a0aa90a1c38c5deea56475399016afae2a00a858b961fbbab8ddeb3bc6a08103 0ddf1bcf28aafc56d7334e6138fb268f9b36a429e4cbdd982cd8384e0644076b lib/codeql/rust/elements/internal/RangePatConstructor.qll fe4345cb41d970ab64196ca37eccb26e5b9cf85fab4253cacfd2b31de03bd070 1d09d5ec8203d76aed2dfb7e7f14c0c07d6559c8f589e11860fff8a2c682c1a6 +lib/codeql/rust/elements/internal/RangePatImpl.qll ef11ab2c002896036553231741a7cf896fafa09e22e920e15661b9cbe4393cae 24ac2dcce3055a77f3a5e0b38cf13aebefd2eeaefa53674ff144a6225634ac0d lib/codeql/rust/elements/internal/RefExprConstructor.qll 9ad08c0f3d980a56a2af8857cb84db589941d20ab3ae5c8ece004ccaccaaf950 4cac3ace31b7ed77a72e989fce9cdbae2247f03c28a3f0c50d67385d02c7f193 lib/codeql/rust/elements/internal/RefPatConstructor.qll d8b88c2c468b08072f6f853306eb61eb88ee1e6c5cfb63958f115a64a9715bb3 0c1d6a8af6a66912698acce47e89d4e3239e67f89c228a36a141f9c685c36394 lib/codeql/rust/elements/internal/RefTypeReprConstructor.qll 8e7012b456ebf1cc7a2c50892c0fffd51f0d5d83e417e1d4cabd4d409e3dddc0 4f3c6368bcea5e8c3f0b83591336f01331dc6dabf9c1e8b67de0fc4d640f65f0 +lib/codeql/rust/elements/internal/RefTypeReprImpl.qll 553dd95e1a49ab7aef5db08e7bb550104c604ec33c9a3c7529370cd47c6a0965 8902db7c814f631c2a995df5911a7b13b6a38c524417e4bbbf2bda74ad53e14c lib/codeql/rust/elements/internal/RenameConstructor.qll 65fa2e938978d154701e6cac05b56320b176ee014ef5c20a7b66f3e94fd5c4a7 dfc0ff4606b8e1c14003cc93a0811f4d62ec993b07ff3c1aa0776746577ed103 +lib/codeql/rust/elements/internal/RenameImpl.qll 61c681055f1f86402af0772539f702e9e19a123f8cfcfca225535c3a1a4cb1d7 1aa1c78616c4b54a31c8af74de141aef9e5ada53f3859df631ecb4238faabdbf lib/codeql/rust/elements/internal/RestPatConstructor.qll 45430925ddf08fba70ede44c7f413ddb41b3113c149b7efc276e0c2bf72507b4 25c678898d72446e7a975bb8b7f2fde51e55b59dbd42f2cca997c833b1a995f1 lib/codeql/rust/elements/internal/RetTypeReprConstructor.qll 6dcb56c92a13f5ca2c9a8344bc05638cc611543896c578cd6ca185054f155537 3fe34953ba397dc31533bd28b48df76693e86b51c4a89c26ad4dfdbd816a0874 +lib/codeql/rust/elements/internal/RetTypeReprImpl.qll 321355a9b39193e09ef7c38b807d7f3c221dce06b0cafd2e0ceccdfbb81712e4 02ea0fb17416889b400e0706eeacc0afc6b489b76158e8c26b9b77102df6bd60 lib/codeql/rust/elements/internal/ReturnExprConstructor.qll 57be5afbe20aa8db6e63c1f2871914c19c186730ad7dccaa424038c6305730d5 4d3c4f2e9b38a4b54ff26a0032455cdcca3d35fec201b6c932072a9e31fbb4fe lib/codeql/rust/elements/internal/ReturnTypeSyntaxConstructor.qll 8994672e504d1674e5773157d0ad8a0dc3aad3d64ef295e7722e647e78e36c11 abe7df754721f4ff7f3e3bb22d275976b2e9a1ef51436a461fe52ebd2d29cff1 +lib/codeql/rust/elements/internal/ReturnTypeSyntaxImpl.qll 554af21b52fedfc356cb873e25c2429e6660ae62ea01be708de4342960cf4048 cdc497a3693bb162a7528b75e902c4743b0a974c6c44152f822a16107a83bee4 lib/codeql/rust/elements/internal/SelfParamConstructor.qll a63af1d1ccde6013c09e0397f1247f5ab3efd97f3410dd1b6c15e1fb6cd96e54 0d8977653c074d5010c78144327f8b6c4da07f09d21e5cc3342082cd50107a81 +lib/codeql/rust/elements/internal/SelfParamImpl.qll 4112ffa718b95b3917ac3dfb45f4f4df56c1ee9cbbc61b91ec16628be57001c5 23f49c040a785ff5c9b09891d09007e9878fa78be086a68621d1f4d59d2e5d86 lib/codeql/rust/elements/internal/SlicePatConstructor.qll 19216ec9e87ca98784d78b29b8b06ea9ac428e2faa468f0717d1c0d0a8e7351c 458e5be76aa51aec579566be39486525ec9d4c73d248cb228da74892e2a56c08 +lib/codeql/rust/elements/internal/SlicePatImpl.qll c6176095360e3b23382557242d2d3ff0b5e0f01f8b1c438452518e9c36ff3c70 644ab41a59a619947f69f75e2d0807245d4ddefc247efaeab63b99b4f08c1cc1 lib/codeql/rust/elements/internal/SliceTypeReprConstructor.qll 4576f203450767bfd142b1d6797b6482bb78f7700b6b410475b182d5067504ae 2b5aeaf91d5ea10e2370fa88b86bce7d0691d6d00f18ab8e1a1be917bb1619bb +lib/codeql/rust/elements/internal/SliceTypeReprImpl.qll ba1a53a3ecc90a7f54c003fc9610c782ce169faf9674010e14ed08a947f464e1 ccd1b77eea0a528fca76d5a4d6590ce259727fe38b4a2d7860974bf2c64389bb lib/codeql/rust/elements/internal/SourceFileConstructor.qll 1dc559887ea7798774528b5505c8601c61030c17480f7ffca49b68b76fcc0321 75a635b88622e3110b16795bd12ca6fc4af176c92d6e441518d60aa47255edc1 +lib/codeql/rust/elements/internal/SourceFileImpl.qll 829cc59d508c190fecfcfb0e27df232fd0a53cb98a6c6f110aecc7242db6f794 2834ab836557ae294410ccde023cca6ef6315aa4b78a7c238862437cec697583 lib/codeql/rust/elements/internal/StaticConstructor.qll 6dd7ee3fd16466c407de35b439074b56341fc97a9c36846b725c2eb43fd4a643 5bf5b0e78d0e9eb294a57b91075de6e4b86a9e6335f546c83ec11ab4c51e5679 lib/codeql/rust/elements/internal/StmtImpl.qll ea99d261f32592ff368cc3a1960864989897c92944f1675549e0753964cb562f 9117b4cdfad56f8fa3bc5d921c2146b4ff0658e8914ac51bf48eb3e68599dd6b lib/codeql/rust/elements/internal/StmtListConstructor.qll 435d59019e17a6279110a23d3d5dfbc1d1e16fc358a93a1d688484d22a754866 23fcb60a5cbb66174e459bc10bd7c28ed532fd1ab46f10b9f0c8a6291d3e343f @@ -353,25 +418,36 @@ lib/codeql/rust/elements/internal/StructConstructor.qll 52921ea6e70421fd08884dc0 lib/codeql/rust/elements/internal/StructExprConstructor.qll 69761fa65a4bedf2893fdfc49753fd1289d9eb64cf405227458161b95fa550cb 72ed5f32dcf6a462d9d3cadfc57395a40ee6f4e294a88dbda78761b4a0759ece lib/codeql/rust/elements/internal/StructExprFieldConstructor.qll 6766d7941963904b3a704e64381a478d410c2ef88e8facbc82efca4e781dac96 a14ce465f0f4e43dea5c21c269d803b0ad452d2eb03f4342ea7a9f5d0b357d60 lib/codeql/rust/elements/internal/StructExprFieldListConstructor.qll fda308db380c608d5df1dc48b30bccb32bce31eabff807d0e623b812000a2a2c 84fb7cb24bf61aec602956f867c722d10907b3edfd4dd6946f1349cf6240b4f1 +lib/codeql/rust/elements/internal/StructExprFieldListImpl.qll 93c8e243095ad67e9cf59e6f66af08244fd45539199193d18275d946ea558ee3 53c90a886971cf6d8a6afd10a1f4bb859e0b9ebc17f32fcb220a01c1d6524743 lib/codeql/rust/elements/internal/StructFieldConstructor.qll 07c7ca8cd5666a0d022573e8d4f9a2e8b237c629c729b9563d783f5e34f232ce 82de0f502272ebdc4f3b15aa314611dd20e82f78ad629e79b5459fdcacf44f9e lib/codeql/rust/elements/internal/StructFieldListConstructor.qll c4ed03a31f08e63f77411e443635ae20caa82c0b4ce27a8ca0011ddf85602874 9f6c12949ea06f932c141fed8e6f7d2d93e0d3305dfc60db163feb34ada90917 +lib/codeql/rust/elements/internal/StructFieldListImpl.qll 7b0d40025d49d133ea34d9e6abddca379fc5e1158813c68b9e2bf2b8b17b40a8 67262e95dc760e7f0dd0e8c54ccd9a0abc95d7cca15c22430c1020dbc6366e6a lib/codeql/rust/elements/internal/StructPatConstructor.qll 4289608942b7ca73d5a7760232ef23cd9a1baf63cc1d0dc64e7dfea146194fe4 189aec3a5c376addd75b17a79729837fb4185de4abf45008df3956a2d9cdadb8 lib/codeql/rust/elements/internal/StructPatFieldConstructor.qll 780294d2bbad2062a7c66a0dca370e12551d94dd97540936864cf26cbafd7d0e aa9c717f3ec13927be9c598af06ae0b785fb6645a409acf4eaedf07b0b765079 lib/codeql/rust/elements/internal/StructPatFieldListConstructor.qll f67090a3738f2dc89874325c1ec2d4b4d975a5fdef505f0008a016f33868bebb 1c10b9ae42ed78758f59902c44c3eeebb0bd862c04783f83aa4db5653f12bf0e +lib/codeql/rust/elements/internal/StructPatFieldListImpl.qll 046464430ba9cc0a924bb1370b584650c29b6abdaf0da73faa87cf7ec85cf959 84d236a133a016fbd373dbbc1aa70741f5ea67b3ea678adfac2625bc714419af lib/codeql/rust/elements/internal/TokenImpl.qll 87629ffee74cacc6e8af5e96e18e62fb0fa4043d3ba1e7360daa880e628f8530 d54e213e39ae2b9bb92ab377dc72d72ba5bca88b72d29032507cdcbef201a215 lib/codeql/rust/elements/internal/TokenTreeConstructor.qll 0be1f838b04ff944560aa477cbe4ab1ad0b3f4ae982de84773faac5902fcae45 254b387adc2e1e3c355651ab958785d0b8babbc0030194234698a1219e9497b3 +lib/codeql/rust/elements/internal/TokenTreeImpl.qll 7c16b22a8ff4ad33be25c3d2d43b8f043cab7626538ac5d8938b074dc663b4f4 793e04299d571a8cea2097e6c43136c5e618b31da91ccc68bda334c3d2c3793d lib/codeql/rust/elements/internal/TokenTreeMetaConstructor.qll 059903cc9cbc77d753f1e7833bbc6ba42d55d281bdf0a3ec1c79d0224be1613f b387eb1eb56f83ff9b2831552db5f23af9b8b8bd822e277f2c1e95ed88b71c1f +lib/codeql/rust/elements/internal/TokenTreeMetaImpl.qll e0c30c264f05a5b610c6d1c7bdacd804b4188031e3968756e6670d51b9b7ee02 084adcb4898a694a8be217a416b693e8291848f3802d4437a2004384ab079037 lib/codeql/rust/elements/internal/TraitConstructor.qll 1f790e63c32f1a22ae1b039ca585b5fe6ffef6339c1e2bf8bca108febb433035 535cebd676001bfbbb724d8006fa2da94e585951b8fd54c7dc092732214615b5 lib/codeql/rust/elements/internal/TryBlockModifierConstructor.qll 55a69eced15a1637cb84889e50cf465bbc677baaf4bf3e4e5ab37615018f5803 ee6141225ade44559067474a75b27e3c68dbb149dc9c24dacc1e9d8c791f13f7 +lib/codeql/rust/elements/internal/TryBlockModifierImpl.qll 97ab789b3a0d9f9e851cee967cc92ae28446355e7bfeb7ff598787f18b9fdfa5 6f24a42b5e4c448f3ac447200becbf63b83bf1f26e99fca933f5e4262906d278 lib/codeql/rust/elements/internal/TryExprConstructor.qll 98e3077ebc4d76f687488b344f532b698512af215b66f0a74b5cea8ed180836c b95603c10c262911eeffdf4ccba14849e8443916b360e287963d5f2582d8e434 +lib/codeql/rust/elements/internal/TryExprImpl.qll cacf43a49ba518be3f94e4a355f5889861edc41f77601eff27e0ed774eca6651 5f4a6a346ec457d5de89b32419e8b4c2deddc55e2d61dbb59842d7f34aa11c44 lib/codeql/rust/elements/internal/TupleExprConstructor.qll 71c38786723225d3d90399b8a085b2b2664c62256654db9e1288fadd56745b9d 639ad70b49ebadc027127fbdc9de14e5180169a4285908233bc38ccac6f14110 +lib/codeql/rust/elements/internal/TupleExprImpl.qll daabbc7dd36c615cdd8d3b59e06f4992a302b26554115711f733508836887abe 4c43a26e5f8b68d9d032bb5cd0af88cf9ac9b4b4e40af47dc85dd931ce9db6f8 lib/codeql/rust/elements/internal/TupleFieldConstructor.qll 89d3cf2540235044ed5a89706cfbdebc5cdf9180fd5b6d3376c79a1b2c0430c0 16861fe089aac8e42a5a90d81dd48d5015391d0a06c78ca02bd876d65378699f lib/codeql/rust/elements/internal/TupleFieldListConstructor.qll 4335ba2061b6e4968db9ec05c0b4d3e6a564db89a2df69e036f317672a7900b1 0b8dded875dbf696cf588e8c21acc27332a2ff66ced7bfabdfc1ad621991f888 +lib/codeql/rust/elements/internal/TupleFieldListImpl.qll 2e5141d5894d1cebadef9cd3afe7585779327c4e24390201e1ef05a29401caf8 bbfa1e0b513393012bf2ae43a3aa0e33fce6ea4d110d1be0f039562071f3c547 lib/codeql/rust/elements/internal/TuplePatConstructor.qll 2a5e83ad5b8713a732e610128aeddf14e9b344402d6cf30ff0b43aa39e838418 6d467f7141307523994f03ed7b8e8b1a5bcf860963c9934b90e54582ea38096a lib/codeql/rust/elements/internal/TupleStructPatConstructor.qll 9d68f67a17a5cec0e78907a53eccfa7696be5b0571da4b486c8184274e56344a 3ffa29f546cd6c644be4fecc7415477a3a4dc00d69b8764be9119abe4c6d8b9e lib/codeql/rust/elements/internal/TupleTypeReprConstructor.qll 80c31c25fd27e330690fb500d757a4bbd33f226186d88ea73bfe4cf29a7db508 d572a72fa361990a3d0a3f9b81d1e966e2ba1ac0a60314ec824c1b8b2814c857 +lib/codeql/rust/elements/internal/TupleTypeReprImpl.qll daf679e3cac0eaf1c20880b49b22bbe0822a27cc6ab2c241916b4bf6da995586 ebd87d7fce7d8acd7fa37c4107f8210e60412dd418104bd9fdbdbcde13c8b6a7 lib/codeql/rust/elements/internal/TypeAliasConstructor.qll 048caa79eb7d400971e3e6d7e580867cbee4bd6b9d291aafac423aa96c321e76 d1d1e33a789ae6fa1a96af4d23d6376b9d82e14e3cbb777963e2d2cb8b22f66d lib/codeql/rust/elements/internal/TypeArgConstructor.qll 51d621e170fdf5f91497f8cc8c1764ce8a59fde5a2b9ecfad17ce826a96c56c4 a5bbb329bde456a40ffa84a325a4be1271dbde842c1573d1beb7056c8fb0f681 +lib/codeql/rust/elements/internal/TypeArgImpl.qll 77886af8b2c045463c4c34d781c8f618eec5f5143098548047730f73c7e4a34a 6be6c519b71f9196e0559958e85efe8a78fbce7a90ca2401d7c402e46bc865c9 lib/codeql/rust/elements/internal/TypeBoundConstructor.qll ba99616e65cf2811187016ff23e5b0005cfd0f1123622e908ff8b560aaa5847f fde78432b55b31cf68a3acb7093256217df37539f942c4441d1b1e7bf9271d89 lib/codeql/rust/elements/internal/TypeBoundListConstructor.qll 4b634b3a4ca8909ce8c0d172d9258168c5271435474089902456c2e3e47ae1c5 3af74623ced55b3263c096810a685517d36b75229431b81f3bb8101294940025 lib/codeql/rust/elements/internal/TypeItemImpl.qll e439593cfbf8fb647b69151b7a0ef2b60b7dfa4603d1a0d911b0f924997acd0c 72caab93da71a88df1c0890ae70e866dc607ce61b177243ee60afa555881c72b @@ -383,233 +459,242 @@ lib/codeql/rust/elements/internal/UnimplementedConstructor.qll 70b0489fdc75fed38 lib/codeql/rust/elements/internal/UnimplementedImpl.qll 06771abc088e0a8fc24032c9d2633618e8e40343ef8757a68cc0a70f1617165a 5738f626f1f4f573fdf7dcd5bd57a0948d290ed89342b9160e95ef3c84044f9a lib/codeql/rust/elements/internal/UnionConstructor.qll d650551a1b3ef29c5a770bdad626269cf539ed0c675af954bc847d2c6111f3f6 aca9064ad653a126ab4f03703e96b274587c852dc5e7ff3fea0fec4d45993f10 lib/codeql/rust/elements/internal/UnsafeMetaConstructor.qll 89c041ebd8ff05137d0244c97b9cd8ea1afffbc1d6d3e6aab906546897d851aa 6da0034021f992ae39977694418a4d8f2fe6b426f54f606a2a089c3896e6eb52 +lib/codeql/rust/elements/internal/UnsafeMetaImpl.qll 38134143aec9d5f48762a1d70330a8899bd3e94265f80b0772e7db3987a7a107 7731646d9a29357c7567a08129d018c4b09982781d8b6cb73d93bcea7f71f0a1 lib/codeql/rust/elements/internal/UseBoundGenericArgImpl.qll 2f90bfd5e43113da1155445bef0334ab84acddef102bd62dfa2ef908717a5d09 dd2fa3c6081d79e1d96360dbdb339128cd944e7b7dc26c449c04f970ee1d7848 lib/codeql/rust/elements/internal/UseBoundGenericArgsConstructor.qll 84d4a959d098fcd1713cb169e15b4945d846121701d2c5709b11e19202c21f2b 93113c92be9bc9f0b8530c308fe482dfeddc7dc827fc44049cecb3eab28df731 +lib/codeql/rust/elements/internal/UseBoundGenericArgsImpl.qll 0f98d47c1e09c46dd3da66a4770181a0caae0512b362faaec997af22bb5f4ce7 1919235e50b9d2fee9bd5d407a0bc023a02dbb04b2662349fad5a8d6cfa98069 lib/codeql/rust/elements/internal/UseConstructor.qll a4f790795e18abc29a50d6fbaa0db64cba781e3259a42cbf0468c24ac66b63e7 2fa288f073ac094a838c11f091def2c790b347b6a1b79407c11b10c73d6bff57 lib/codeql/rust/elements/internal/UseTreeConstructor.qll 3e6e834100fcc7249f8a20f8bd9debe09b705fcf5a0e655537e71ac1c6f7956b cdbc84b8f1b009be1e4a7aaba7f5237823cea62c86b38f1794aad97e3dfcf64b lib/codeql/rust/elements/internal/UseTreeListConstructor.qll 973577da5d7b58eb245f108bd1ae2fecc5645f2795421dedf7687b067a233003 f41e5e3ffcb2a387e5c37f56c0b271e8dc20428b6ff4c63e1ee42fcfa4e67d0a +lib/codeql/rust/elements/internal/UseTreeListImpl.qll a155fbfeb9792d511e1f3331d6756ccff6cca18c7ca4cac0faa7184cbb2e0dd4 0eeb1343b2284c02f9a0f0237267c77857a3a3a0f57df8277437313fde38d1b7 lib/codeql/rust/elements/internal/VariantConstructor.qll 0297d4a9a9b32448d6d6063d308c8d0e7a067d028b9ec97de10a1d659ee2cfdd 6a4bee28b340e97d06b262120fd39ab21717233a5bcc142ba542cb1b456eb952 lib/codeql/rust/elements/internal/VariantListConstructor.qll c841fb345eb46ea3978a0ed7a689f8955efc9178044b140b74d98a6bcd0c926a c9e52d112abdba2b60013fa01a944c8770766bf7368f9878e6b13daaa4eed446 +lib/codeql/rust/elements/internal/VariantListImpl.qll 4ceeda617696eb547c707589ba26103cf4c5c3d889955531be24cbf224e79dff 4258196c126fd2fad0e18068cb3d570a67034a8b26e2f13f8223d7f1a246d1a4 lib/codeql/rust/elements/internal/VisibilityConstructor.qll 1fd30663d87945f08d15cfaca54f586a658f26b7a98ea45ac73a35d36d4f65d0 6ddaf11742cc8fbbe03af2aa578394041ae077911e62d2fa6c885ae0543ba53a lib/codeql/rust/elements/internal/VisibilityInnerConstructor.qll 6d845ba35a3bc8521fb49d1691d6aa10f1f7f4b7f27f12f4d3e316d8d3d6050c eecc48b25464df7e723ce1e9706b2b9ffbb8ccac26edb78b0901ce9912675edc +lib/codeql/rust/elements/internal/VisibilityInnerImpl.qll 9a536441b258a5dae6518b7efa36a881244194f7e0f842a1c730dfeaa979d462 de14821d1d9ffeac766b01ee3ec248c73a531b4d3a7357e5b609e4de40ffea93 lib/codeql/rust/elements/internal/WhereClauseConstructor.qll 6d6f0f0376cf45fac37ea0c7c4345d08718d2a3d6d913e591de1de9e640317c9 ff690f3d4391e5f1fae6e9014365810105e8befe9d6b52a82625994319af9ffd +lib/codeql/rust/elements/internal/WhereClauseImpl.qll 006e330df395183d15896e5f81128e24b8274d849fe45afb5040444e4b764226 ed5e8317b5f33104e5c322588dc400755c8852bbb77ef835177b13af7480fd43 lib/codeql/rust/elements/internal/WherePredConstructor.qll f331c37085792a01159e8c218e9ef827e80e99b7c3d5978b6489808f05bd11f8 179cad3e4c5aaaf27755891694ef3569322fcf34c5290e6af49e5b5e3f8aa732 +lib/codeql/rust/elements/internal/WherePredImpl.qll eabd6553a16165ddb0103602d8cff65c6af22580ea7a0e2beabbf795ffabdb2d 8025d8bd2351ec2de8273225a6e59d46748d7bfd7e53251fa4eb90d5140afd92 lib/codeql/rust/elements/internal/WhileExprConstructor.qll 01eb17d834584b3cba0098d367324d137aacfc60860752d9053ec414180897e7 e5e0999fb48a48ba9b3e09f87d8f44f43cc3d8a276059d9f67e7714a1852b8a5 lib/codeql/rust/elements/internal/WildcardPatConstructor.qll 5980c4e5724f88a8cb91365fc2b65a72a47183d01a37f3ff11dcd2021e612dd9 c015e94953e02dc405f8cdc1f24f7cae6b7c1134d69878e99c6858143fc7ab34 lib/codeql/rust/elements/internal/YeetExprConstructor.qll 7763e1717d3672156587250a093dd21680ad88c8224a815b472e1c9bba18f976 70dd1fd50824902362554c8c6075468060d0abbe3b3335957be335057512a417 +lib/codeql/rust/elements/internal/YeetExprImpl.qll e8924147c3ebe0c32d04c5b33edfd82ae965c32479acfd4429eeab525cf42efb b2debcfa42df901f254c58705a5009825ec153464c9ab4b323aa439e5924e59e lib/codeql/rust/elements/internal/YieldExprConstructor.qll 8cbfa6405acb151ee31ccc7c89336948a597d783e8890e5c3e53853850871712 966f685eb6b9063bc359213323d3ff760b536158ecd17608e7618a3e9adf475f -lib/codeql/rust/elements/internal/generated/Abi.qll f5a22afe5596c261b4409395056ce3227b25d67602d51d0b72734d870f614df3 06d1c242ccd31f1cc90212823077e1a7a9e93cd3771a14ebe2f0659c979f3dd1 +lib/codeql/rust/elements/internal/YieldExprImpl.qll af184649a348ddd0be16dee9daae307240bf123ace09243950342e9d71ededd9 17df90f67dd51623e8a5715b344ccd8740c8fc415af092469f801b99caacb70d +lib/codeql/rust/elements/internal/generated/Abi.qll 43ccb654c5cb29c850607ac338c0a289284174825c2a1b6e52fafe8e227ec3b2 72c40ceef8dffe8b7328d0400d367bd757ede03771b901bb46c771e5a5530e1e lib/codeql/rust/elements/internal/generated/Addressable.qll 624c380d385af6563885417d1e8ecd5d9b7abf1435c0ab79a1b9a405387874a3 e2755dc2155d6f2bc0e2d54006da0e62ee359440592db9d6a8b73202ef28e64f -lib/codeql/rust/elements/internal/generated/ArgList.qll e41f48258082876a8ceac9107209d94fdd00a62d2e4c632987a01a8394c4aff6 bf1982d14f8cd55fa0c3da2c6aab56fc73b15a3572ffc72d9a94f2c860f8f3b7 +lib/codeql/rust/elements/internal/generated/ArgList.qll 7e2b7dbccc506fb5df7b85885ce1c9cadfc98d98cd8c291d84bd3a0d67fdd577 a8fe85d1bfeb9786fc6179b6cc7f783168162f1ae6aa100db9cfd210af43b043 lib/codeql/rust/elements/internal/generated/ArrayExpr.qll 73806a0de8168b38a9436fa6b8c6d68c92eeab3d64a1ae7edfff82f871929992 7ad998cdd8f4fed226473517ad7a5765cb35608033047aad53bf8aa3969fd03b -lib/codeql/rust/elements/internal/generated/ArrayExprInternal.qll 67a7b0fae04b11cf771727ff39a123fb2d5ce6e2d650d32478fcb33a26ed5688 15833405fa85f6abe0e5146dac283cb5a142a07f08300ccc15a1dae30ed88942 -lib/codeql/rust/elements/internal/generated/ArrayListExpr.qll f325163c2bd401286305330482bee20d060cecd24afa9e49deab7ba7e72ca056 ae3f5b303e31fc6c48b38172304ee8dcf3af2b2ba693767824ea8a944b6be0eb -lib/codeql/rust/elements/internal/generated/ArrayRepeatExpr.qll ac2035488d5b9328f01ce2dd5bd7598e3af1cbb383ddb48b648e1e8908ea82fc 3ec910b184115fb3750692287e8039560e20bd6a5fb26ac1f9c346424d8eaa48 -lib/codeql/rust/elements/internal/generated/ArrayTypeRepr.qll d1db33bc2c13e5bc6faa9c7009c50b336296b10ed69723499db2680ff105604d e581ca7f2e5089e272c4ef99630daac2511440314a71267ff3e66f857f13ee69 -lib/codeql/rust/elements/internal/generated/AsmClobberAbi.qll cd5b177210a072df598f83b49b891800f6ea4bdc4064b45e4a0853d7076d4d9a 03bd9e78da06333038a5219c00c5b16d2c7396434e85f2fe76179181adf107dc -lib/codeql/rust/elements/internal/generated/AsmConst.qll 26c96fc41f2b517b7756fd602c8b0cd4849c7090013fb3f8a5e290e5eabe80cc f0f1bf3e8ae7e20e1c2ab638428190c58ee242a7d15c480ed9c5f789ce42c9cb -lib/codeql/rust/elements/internal/generated/AsmDirSpec.qll 4064e9c98aeebfebf29d013f6280f44548996d6f185b19bf96b1b23384c976b9 2bb0b99d20c0fdd6d54d4a1947a02372b6e4b197fb887ad058290ae97f015953 -lib/codeql/rust/elements/internal/generated/AsmExpr.qll afabf734bf93040451cb22d22f71ab9b2abb176bd6e0d862f5cc67d687f84e4c 7e35b3bc93b5e6f6b7259f3261234421eb5778a47192bc0f5e54d062d3bc8dde -lib/codeql/rust/elements/internal/generated/AsmLabel.qll 3e97e64f0682709f05464218e0182f64537e08079b0f276738c83eae92c22d25 3ce70364762bc8c0eeb13940406a0613a815a0ae68b24f7e3a1a649a6fe05c89 +lib/codeql/rust/elements/internal/generated/ArrayExprInternal.qll 6cd054e7ced15ad3917d87e07afe4547cda9ee1d76fc25c6d2b8c1980f297802 22b099201d05b0846a831d15bd8db700982b5aa3b3f011c5dc617eeb4b3e38d9 +lib/codeql/rust/elements/internal/generated/ArrayListExpr.qll 274b0348797662d1983376272a9763b86c22890e7ac088f62ef6d0a4b63d0934 925b5e96539f4936a5d20fe5cee08792d95f1b60011f83a14814842d84ff332e +lib/codeql/rust/elements/internal/generated/ArrayRepeatExpr.qll 05a88ea3d433484604da402bcd8c9065d2d93c7ef33f4a3882cd31c107637557 829455e80f0e4dfa1fc9ca3810e6d2a0a8398b1e32687361c5531a18b21b0452 +lib/codeql/rust/elements/internal/generated/ArrayTypeRepr.qll 9bd3ead45e102631eb77f7597667833a92eeb18d89254e0be62d7050ecbf24a3 9381025db82c59a8af6bc1c804cd45380f955f6c49004d1dbf67c579e25b40eb +lib/codeql/rust/elements/internal/generated/AsmClobberAbi.qll c727e486378e6d8d0c48155143b6842a1e13d1b4fe9c44e45b76cdb73c24d3a0 0107e1505d5c11e8fa86eb4ee30cb47583e6e978725db6cd07b150e525bea418 +lib/codeql/rust/elements/internal/generated/AsmConst.qll 56d180e14aa90537b0a0a9c22bc684c23b9e30bebdc955979419655f9c61dd1d 1d7f4387f0282651af1e2ee789395d56d1074328f496db91e5b747f5aef9413d +lib/codeql/rust/elements/internal/generated/AsmDirSpec.qll ca1cb42a0132433ce77b3b626cb6cd88bf4ecd3197fc3d310f37999123a4b870 8f07f2d7c51f33cf4bac9c751d89eb5c8a659d9ebac3056b119559e0eebc00f3 +lib/codeql/rust/elements/internal/generated/AsmExpr.qll 5b73353c619ea62a366343143072a1a392768080e804cd0c328b840899d2ddfc ba210c3f33742db341d10c1cd29b91d755a8a5762da4cf63dd13b504bb529416 +lib/codeql/rust/elements/internal/generated/AsmLabel.qll 0af8151c20ab3eaefdfdad15a3d67067d8852de1c2430d7c7063a33962df7de8 990b1bb7f561e8375d58e108177b696adb8c4a3e19d0568c78137d9197e86383 lib/codeql/rust/elements/internal/generated/AsmOperand.qll a18ddb65ba0de6b61fb73e6a39398a127ccd4180b12fea43398e1e8f3e829ecd 22d2162566bcf18e8bb39eac9c1de0ae563013767ef5efebff6d844cb4038cae -lib/codeql/rust/elements/internal/generated/AsmOperandExpr.qll 6ec1db45e8523331d516263476bbda1006251ce137c2cd324d9b6c6fabf358df b6278d4e605fb5422ab1e563649da793bacf28cd587328f9cc36ca57799510d0 -lib/codeql/rust/elements/internal/generated/AsmOperandNamed.qll d6bfe8314d1e1694c4bb197fbee745a52a5c721997f2b7e72667230b449661c5 9864bfd98d7c52f543af4a36aa7c7530760c67c061fa52be20aa3e5f768cd777 -lib/codeql/rust/elements/internal/generated/AsmOption.qll 9aa5df0f677363111b395b3fb09a0882d61c38f97ba811713490f52c851fa8db d863469f626c6e9a6a69faee4216226dd13c62fbf76ba93717d7d12fd95e0c9f -lib/codeql/rust/elements/internal/generated/AsmOptionsList.qll 98403f62e88f3c01b466e25e836c5eb90c414d21b22cc3ff50c0aba46d440092 4b60c9d657230a9d7275b4fe8c46a5cf9986036cf7aedf9ee2c3d90051ea6054 +lib/codeql/rust/elements/internal/generated/AsmOperandExpr.qll 40c8ff956a00c374d3023f064f96dee98d2e740e220196d9768c1fce240d0f1e a0bf7b4d6920285d2e1e46ae525ba5da4902d7817b49c261daf7ad0067b975ed +lib/codeql/rust/elements/internal/generated/AsmOperandNamed.qll 8bf268578274b914ca40a2d38dce6c9ed24c47bed64fde3d4b24c66bee2867e4 0dffae4f78aec60f50e808650801b262b256c08a24072156c3a14b9de213fc22 +lib/codeql/rust/elements/internal/generated/AsmOption.qll 0ae798dca45107d488e2feede94e3ef5f5da596bcc358608e815e7addbf282e6 8e987e2f5027d0c1be8148694413610cd8b8b7622f6d55db8dbb162a46c22f73 +lib/codeql/rust/elements/internal/generated/AsmOptionsList.qll a0a342e0002014d5cd5c9b4900455e689f7027de5e1f486d4f94806fe21c7072 49be4584dfd30a0c87d5cdb9ec19f73c2fa337a5e4757393196c0ccd7d378fb8 lib/codeql/rust/elements/internal/generated/AsmPiece.qll 17f425727781cdda3a2ec59e20a70e7eb14c75298298e7a014316593fb18f1f9 67656da151f466288d5e7f6cd7723ccb4660df81a9414398c00f7a7c97a19163 -lib/codeql/rust/elements/internal/generated/AsmRegOperand.qll e1412c7a9135669cb3e07f82dcf2bebc2ea28958d9ffb9520ae48d299344997c d81f18570703c9eb300241bd1900b7969d12d71cec0a3ce55c33f7d586600c24 -lib/codeql/rust/elements/internal/generated/AsmRegSpec.qll 73a24744f62dd6dfa28a0978087828f009fb0619762798f5e0965003fff1e8ec fdb8fd2f89b64086a2ca873c683c02a68d088bb01007d534617d0b7f67fde2cb -lib/codeql/rust/elements/internal/generated/AsmSym.qll 476ee9ad15db015c43633072175bca3822af30c379ee10eb8ffc091c88d573f6 9f24baf36506eb959e9077dc5ba1cddbc4d93e3d8cba6e357dff5f9780d1e492 +lib/codeql/rust/elements/internal/generated/AsmRegOperand.qll d6c77d79c86ca7cb02725c41d06f55e2cd982643bd09790c6ad66a8c93432147 588a5ae9257150a006246476acedaa0d8fabe7008c49d296e64bd4b36a85bb00 +lib/codeql/rust/elements/internal/generated/AsmRegSpec.qll 2f0c45f6c3776ca6fdb46350759a39340efcdb97eb5a2b31073022677a0dbffa d80d44f6a06d328335e0b30abf32dafbb91be1ddf239f2a8444c2111341c14af +lib/codeql/rust/elements/internal/generated/AsmSym.qll 2fa14d2445051e271c2a5806408c3d558219e86e18aeba6163fce538e10d78a9 863e3a0755c6baa565abde23db06efa0293f1ce7c871bb3e58a9cb282730816a lib/codeql/rust/elements/internal/generated/AssocItem.qll 188fd2aaaef11cc926cf202adc64f294988fe2b3ec768d586d260c23877bbe21 58332ddaeff27fa80ce329d3964f4cc05f2cc807eb2a7a4cd6c26e90442e7f3a -lib/codeql/rust/elements/internal/generated/AssocItemList.qll 52900dcf32ef749a3bd285b4a01ff337df3c52255fe2698c9c1547c40652f3b9 10709dd626a527c37186b02c4ea738a9edb6c9e97b87370de206d3eb9941575b -lib/codeql/rust/elements/internal/generated/AssocTypeArg.qll a93a42278263bb0c9692aca507108e25f99292aef2a9822501b31489c4ce620d afd9559e0c799988ef7ff1957a5a9ebc4fb92c6e960cbe7fecf12a0a484fef08 +lib/codeql/rust/elements/internal/generated/AssocItemList.qll a572d291a79a1678839a3830b379e4cc024267d6cbb37287ad4d64ab6a37f76c 8f5b1df68d0213d279de124e8d224097efefe700ff982296115160c0e26eaede +lib/codeql/rust/elements/internal/generated/AssocTypeArg.qll 0f5bd621dda4c3869f05df713b3c4f64a257ccf0b95f8bd61506ec9922cfb2f7 0661102323b0200ea310a38fd86b9dd32b67b3f48b9a248e0f5bd0b9dfb05513 lib/codeql/rust/elements/internal/generated/AstNode.qll 1cbfae6a732a1de54b56669ee69d875b0e1d15e58d9aa621df9337c59db5619d 37e16a0c70ae69c5dc1b6df241b9acca96a6326d6cca15456699c44a81c93666 -lib/codeql/rust/elements/internal/generated/Attr.qll 3f306e301c79f58018f1d5f39b4232760ebba7cad7208b78ffcf77e962041459 865a985c0af86b3463440975216b863256d9bf5960e664dd9c0fe2e602b4828b -lib/codeql/rust/elements/internal/generated/AwaitExpr.qll 1d71af702a1f397fb231fae3e0642b3deeba0cd5a43c1d8fabdff29cac979340 e0bfa007bdecc5a09a266d449d723ae35f5a24fbdfc11e4e48aeea3ec0c5147c -lib/codeql/rust/elements/internal/generated/BecomeExpr.qll 7a211b785a4a2f961242d1d73fd031d381aad809f7b600ce7f7f864518bb7242 17a0388680007871748cfdc6621f700a7c2817b9601e1bd817fb48561e7c63ad -lib/codeql/rust/elements/internal/generated/BinaryExpr.qll 64e9bd9c571edd6e5f3e7662b956b1d87fa0354ce6fe95da9caf25ac16b66c68 3fca09fdbe879db2ca3293618896a462e96376a2963d15cce3d5b1baac552fcb +lib/codeql/rust/elements/internal/generated/Attr.qll 691bdafd73d52767bbebcbffd2d9a4aa46b8589c037928228f789dcdb3f6cdd7 ce9375c5386b60b7ce5f39b834c017f206990ca27f528acf3a7e47ee971795f6 +lib/codeql/rust/elements/internal/generated/AwaitExpr.qll a3e64fd0749d054eeddb89a807e04fc0f42da3eb35921ae438a3e8adbf92e128 e8beb70d9449d16547877d30b8502bb1f8789490ecb17690bd05b9aa2f97aad1 +lib/codeql/rust/elements/internal/generated/BecomeExpr.qll 3c27168c14246689b34fcf26f6e2e5d2ce6ab7333464d89718dd325fd4e79082 4a11be8a21ec89c6660167f194d55c16d0bf27f21072547e15a91679cc28d179 +lib/codeql/rust/elements/internal/generated/BinaryExpr.qll aabea18b82da6745b05c5d4d52ce0d8879b4cd9db8140ebece87e2724d368a56 5717f0467a3a361adb5d0a64cc1713a37aee2d7f71be3ceadc2a42590778794e lib/codeql/rust/elements/internal/generated/BlockExpr.qll db813fa05eace9769ba2a51bb38c17e58d621cc31cbf88ee8186c23e3734467c 3a2804490c2bdfccfd2b18c2d4c6cd6edefc375a0a7463120a43212d22ce7513 -lib/codeql/rust/elements/internal/generated/BoxPat.qll 597bed52f7489e0addce3266f7bee5be7c53d2d1263eceec3a252d041ca0908f b8ccf363ca5f1a988547caf1fd266a55aec7cbf8623578deea99765d264b0151 -lib/codeql/rust/elements/internal/generated/BreakExpr.qll 0f428a8b2f4209b134c2ffc3e1c93c30bc6b0e9c9172f140cefa88c1f77d8690 957b39f38ff6befe9061f55bc0b403c2f1c366dd0cf63b874bae6f8216576d76 -lib/codeql/rust/elements/internal/generated/CallExpr.qll 6096035ba2ef1ce3e6254d5b8497dcb6cd7570253423c778a9dd7e158f928644 e56caf9ba094ddfc4952ed5072c5f6f139db8029fa6bd6328d1a118e96a1d5fe +lib/codeql/rust/elements/internal/generated/BoxPat.qll d8724f3e861b5df17064488f5245a530d5fb790b6829161ff85169624b47708e 12c353ab15d1a936027a8ca53ac6bb3bdba836ed31ba1140970024da52d60836 +lib/codeql/rust/elements/internal/generated/BreakExpr.qll 7866f0e4ac808124c20cb058bd220bcb691fb0a4ce41be348086099e0cb62abf 90eb2f4293314e7663f19642794d863621b0312972a8c49f0b865cb8b23337cb +lib/codeql/rust/elements/internal/generated/CallExpr.qll 999bc9e603471757adb4c917c9403fa786b992e217973e64579981c106ea5abe b65062f26359998a45b9807bb94dd07c935ee2a754495a37997dd269db43b39a lib/codeql/rust/elements/internal/generated/Callable.qll 12368b998c771c6b80f54123cea4d3600af7432ab34c9e571bc0bf3894ceb17e 273a9fd9cdae56cf2edbdc9c49b15da49cd5ad04be70acbbe2475c9c50200183 -lib/codeql/rust/elements/internal/generated/CastExpr.qll ddc20054b0b339ad4d40298f3461490d25d00af87c876da5ffbc6a11c0832295 f4247307afcd74d80e926f29f8c57e78c50800984483e6b6003a44681e4a71f3 -lib/codeql/rust/elements/internal/generated/CfgAtom.qll 4379fe45c14c3f8d6bdbc2d7879082d1dbcfee00973c91d93a29ed01f9477dad 52488050dddacb84729ddf06cfe1d71c33e052015f1dff544d805ebbf286150d -lib/codeql/rust/elements/internal/generated/CfgAttrMeta.qll 8bbf153628df0e59d5c66bd41788fbbfb83b44e8870b695f5551a8961e7d4464 f605ddb63a1adc2a881e95b6adbbd908e341aca24448cd1441c7021a1eb70ae1 -lib/codeql/rust/elements/internal/generated/CfgComposite.qll 96ea6dc95579b31808d1b6cc10c8a42bb8d2b211fe6092eb62416b225297c15e 37ba82588d34831abf4426b658e1b063044f6093879bc8a704432cb8f99785d8 -lib/codeql/rust/elements/internal/generated/CfgMeta.qll 6e2e5f26a57781af0e46ddcf589f4d33637d304eca28b9c4c4e01108d075c590 015385a2fc33bfb6fbe3d3353861dea36ed00cbcf810e64c36fa46cae140218d +lib/codeql/rust/elements/internal/generated/CastExpr.qll 064a1ee797dcd9943f98fbb04d09e8bd00b5c3a7d7276616d1f92d5b3f68d419 b2676abdf091ac1397a918458238d5bb6d9abdb28119763510689e798becb70e +lib/codeql/rust/elements/internal/generated/CfgAtom.qll 1b7672e06fe19c7ba484937c3101ff7f5a48fc19e8fff2cb5ecbffc6fce612bc 6dacd084ed0110cc477881fd0f709c6c996ec8a038549bf885a0abb21261bb1d +lib/codeql/rust/elements/internal/generated/CfgAttrMeta.qll 4531aaa627f4d44787970f18dfe30b957f51d83ab2396bac436563c40d144ca9 1731ecd335431b0a2ec70403dc1ad7bce1f8e171a4d6b575d340f1d683fa6c92 +lib/codeql/rust/elements/internal/generated/CfgComposite.qll 4f30fa0495381774cd7993a38e1fbe94dff63a5742e8b836bbc35987b746df1a 595ff31b5990845085bbb963ba408dd1246aed1952bee2836ad9d92a1da6e4c7 +lib/codeql/rust/elements/internal/generated/CfgMeta.qll 7fd8ee49428da70ba1e52bf9017bbe30b690443c26147c77aa9bcffd7d09338d ec4d34dbd1e7ca412ce3d242f1bd6695a5fe9f263d5bc68ce12610facedf3e93 lib/codeql/rust/elements/internal/generated/CfgPredicate.qll 736fe7385e2af5bb86c349bb1b8dd030aef191541f6af24694e3c460b8272f61 4117ee073683eb5fb81bae9e7e49b4ad0991cfcb53e0b7b4160199931a300632 -lib/codeql/rust/elements/internal/generated/ClosureExpr.qll 818aff75d86821c670d8ba0720c3270681b3e070140a9c41beab2a811b43eee6 9bf2d1d38f6c4a99d7c058f8ed096141f5ba6a75d2d26a464f0d65ed4e554222 -lib/codeql/rust/elements/internal/generated/Comment.qll cd1ef861e3803618f9f78a4ac00516d50ecfecdca1c1d14304dc5327cbe07a3b 8b67345aeb15beb5895212228761ea3496297846c93fd2127b417406ae87c201 -lib/codeql/rust/elements/internal/generated/Const.qll 3e606f0198b6461a94964dba7a4d386408f01651d75378eeab251dfceccf49c8 20fe276cded4764bdb1cd50de956bea88d7cd731909c0b84b4abb972b3094959 -lib/codeql/rust/elements/internal/generated/ConstArg.qll c52bf746f2dc89b8d71b8419736707bfcbb09cca424c3ba76e888e2add415bf6 89309a9df4fde23cfd3d8492908ccec4d90cc8457d35c507ef81371a369941b4 -lib/codeql/rust/elements/internal/generated/ConstBlockPat.qll 7526d83ee9565d74776f42db58b1a2efff6fb324cfc7137f51f2206fee815d79 0ab3c22908ff790e7092e576a5df3837db33c32a7922a513a0f5e495729c1ac5 -lib/codeql/rust/elements/internal/generated/ConstParam.qll 2e24198f636e4932c79f28c324f395ae5f61f713795ed4543e920913898e2815 5abe6d3df395c679c28a7720479bad455c53bc5ade9133f1ff113ea54dc66c11 -lib/codeql/rust/elements/internal/generated/ContinueExpr.qll e2010feb14fb6edeb83a991d9357e50edb770172ddfde2e8670b0d3e68169f28 48d09d661e1443002f6d22b8710e22c9c36d9daa9cde09c6366a61e960d717cb -lib/codeql/rust/elements/internal/generated/Crate.qll 37f3760d7c0c1c3ca809d07daf7215a8eae6053eda05e88ed7db6e07f4db0781 649a3d7cd7ee99f95f8a4d3d3c41ea2fa848ce7d8415ccbac62977dfc9a49d35 -lib/codeql/rust/elements/internal/generated/DerefPat.qll fba6bfa4be64247c5d2786d9a65e660498c81a08f1e14cac7347f87fa9d0dfe9 e4cc0922c30a498e6cd4e0eee7a76be4d5a2abaa5a6676cf942823ec7be1d2b8 -lib/codeql/rust/elements/internal/generated/DynTraitTypeRepr.qll b2e0e728b6708923b862d9d8d6104d13f572da17e393ec1485b8465e4bfdc206 4a87ea9669c55c4905ce4e781b680f674989591b0cb56af1e9fa1058c13300b3 +lib/codeql/rust/elements/internal/generated/ClosureExpr.qll f944d5177321c2559f6ed8851d442e32bf32192bc537791df0725a40581c8f99 e96154132759073a6fd9ddd0b6c8a1ff98a1b6d269b691fc863e1f10045a9437 +lib/codeql/rust/elements/internal/generated/Comment.qll 658d7dfe05500c8c57d5d1794f2a1322a0660cc1ec1fcdc09b06ca71141c628d 1912224023048117b9320f2e713f7ed8fdfc18d5c2dcfb7077621c3b0753cfcd +lib/codeql/rust/elements/internal/generated/Const.qll b29908cf0ef649c48fc48fc64e5df3a4e8c254c03ec32b2ec84cb5ffff72974a 9377e3d91bed4fbe3a0bef10254b8e8f42ce6232e195d2ee6a384002bf6f1089 +lib/codeql/rust/elements/internal/generated/ConstArg.qll acee83548e8e4203603fbf4fab8a4c309109a41b91e79e52577eb6dae0765b89 8d2291de34ec278dadde7daaa309d599a3db6ec6d9e9b71b467b47d13598e51b +lib/codeql/rust/elements/internal/generated/ConstBlockPat.qll abdbab1c9fda654548708ec38deb79e6d5b4abc448be0533b114b670ce8c4e16 d04845ebacc2bafc1d70ddbab5f72293038064340c75b7449e26b340ad8010f5 +lib/codeql/rust/elements/internal/generated/ConstParam.qll 32b4bbbf73da2f924c0e457c74f76cbcb58093e578239078e4e4a48dd7c7893a 21738751a4e33ac511b3f4ff97926ea4939e9a587257c1079bcd24e1b0d76f55 +lib/codeql/rust/elements/internal/generated/ContinueExpr.qll bcadfda6559af81850398d747884e51dd164099f7761ac3b2942da5f556ac593 974fda891aa385e1f382524bf0c7047c788327edd5a42f90997223c747cca6de +lib/codeql/rust/elements/internal/generated/Crate.qll e7814ed4c92627d1b8109e2da2458add819725982d9fcf6c570ecabf249a008c 418f27761f406da6cf849f94a48d8724592f387d3e4daabcc132ac3eaf685b97 +lib/codeql/rust/elements/internal/generated/DerefPat.qll cdae06ddb54d7f6962c150d08b5617c502ccd18b39e5024ec590db5c09ffca65 8a1e215232bd73c98f9bc4f95677aa4d0e165512ee9b9b3ca608456ef42011ae +lib/codeql/rust/elements/internal/generated/DynTraitTypeRepr.qll dd708e6bdbc01c427a9465750d8c12d99d68828b5cc8193b2f1e7ae9d8307f32 b198c2069ae80ce57d5c1e479ba47b511ced2d21e00e7ec05d4c76c83766e454 lib/codeql/rust/elements/internal/generated/Element.qll d56d22c060fa929464f837b1e16475a4a2a2e42d68235a014f7369bcb48431db 0e48426ca72179f675ac29aa49bbaadb8b1d27b08ad5cbc72ec5a005c291848e -lib/codeql/rust/elements/internal/generated/Enum.qll 3ed69005ab7cf68745a67cc9891bd68a83f6ab927febf077de9e4092cb373b0b 604fd03d1c46884b3c93e5bff3951ec41593320e1f7382c1a7143a64063827bc +lib/codeql/rust/elements/internal/generated/Enum.qll 2763b7644e34611d5a342d42fee2a8c2f1ad51b86e8bc8bae4c9ea8b2a53f592 1710eec35fc24d862b05a5961d376989138bc854452120a98d8e694da71f5b69 lib/codeql/rust/elements/internal/generated/Expr.qll 5fa34f2ed21829a1509417440dae42d416234ff43433002974328e7aabb8f30f 46f3972c7413b7db28a3ea8acb5a50a74b6dd9b658e8725f6953a8829ac912f8 -lib/codeql/rust/elements/internal/generated/ExprStmt.qll d1112230015fbeb216b43407a268dc2ccd0f9e0836ab2dca4800c51b38fa1d7d 4a80562dcc55efa5e72c6c3b1d6747ab44fe494e76faff2b8f6e9f10a4b08b5b -lib/codeql/rust/elements/internal/generated/ExternBlock.qll e7faac92297a53ac6e0420eec36255a54f360eeb962bf663a00da709407832dd 5ff32c54ec7097d43cc3311492090b9b90f411eead3bc849f258858f29405e81 -lib/codeql/rust/elements/internal/generated/ExternCrate.qll f1a64a1c2f5b07b1186c6259374251d289e59e2d274e95a2ecff7c70e7cbe799 fd9b5b61d49121f54dd739f87efaea1a37c5f438c8e98290b1227223808e24c5 +lib/codeql/rust/elements/internal/generated/ExprStmt.qll a389b43ecb47855f89c6ddce3aaf0f789342c3c79610fe44840053b86ddfd33c 96647d1faec5e9dc57994644f178e9e8834de4a22fc1074a6e19a396bc875ff6 +lib/codeql/rust/elements/internal/generated/ExternBlock.qll b46086ded295788fbd749718693ddbcb76890f93e0c97234b1e1d565a9902001 df6c26551d3e7becbdab6a68e35c31294a0c413aff92510157b470b55053dece +lib/codeql/rust/elements/internal/generated/ExternCrate.qll 3b0c8346008a8178b0d19158dd63b8eec4f0391014dcd3dba9f48f555f3d6556 52867babc6c6ec3b8b872160f40feb385a4b850bddfd5501c576096ca0a654fd lib/codeql/rust/elements/internal/generated/ExternItem.qll 08c02dbc8a96df25725ccec69ef5e19089ae03faea2efb86be892077ea1bc8ab 8afe7b6a87445dde4ce2c790ad05c2ccf771996d10625e6fc100113f219e8e32 -lib/codeql/rust/elements/internal/generated/ExternItemList.qll cb3ec330f70b760393af8ca60929ad5cca2f3863f7655d3f144719ab55184f33 e6829b21b275c7c59f27056501fee7a2d3462ed6a6682d9b37d3c0f0f11d16b8 -lib/codeql/rust/elements/internal/generated/ExtractorStep.qll 61cd504a1aab98b1c977ee8cff661258351d11ca1fec77038c0a17d359f5810e 5e57b50f3e8e3114a55159fb11a524c6944363f5f8a380abccc8b220dedc70ca -lib/codeql/rust/elements/internal/generated/FieldExpr.qll d6077fcc563702bb8d626d2fda60df171023636f98b4a345345e131da1a03dfc 03f9eb65abfab778e6d2c7090c08fe75c38c967302f5a9fa96ab0c24e954929d +lib/codeql/rust/elements/internal/generated/ExternItemList.qll a5fe9a9008268c73b4ed16c4b07de4bbe6beead65b778f57a4bbc7bbb7c2c0a9 25cb1af76aa9435e5d45672582e9a82b207ade4fa2a36343cdb36da73b090d5f +lib/codeql/rust/elements/internal/generated/ExtractorStep.qll e7e42ee5b7d21d1aeef8c667a759c84a32bae89e23fd2444a6fa858ec876808d 75534611495361f4bdd67c420e9ee2215e077572176a241b7bec2718ae0c80e5 +lib/codeql/rust/elements/internal/generated/FieldExpr.qll 1b9f7de8acb497a9de16d4a021e31491884caa7e85c990cf65f6ab46f5254908 0e8f4af6c6ff2821d3ed9555fa7cc719b7f58614160685c50742b65bc90de8b4 lib/codeql/rust/elements/internal/generated/FieldList.qll 35bb72a673c02afafc1f6128aeb26853d3a1cdbaea246332affa17a023ece70e b7012dd214788de9248e9ab6eea1a896329d5731fa0b39e23df1b39df2b7eb9c -lib/codeql/rust/elements/internal/generated/FnPtrTypeRepr.qll f218fa57a01ecc39b58fa15893d6499c15ff8ab8fd9f4ed3078f0ca8b3f15c7e 2d1a7325cf2bd0174ce6fc15e0cbe39c7c1d8b40db5f91e5329acb339a1ad1e8 -lib/codeql/rust/elements/internal/generated/ForBinder.qll 7be6b8e3934db8cd4ac326625cf637dda4b175fd7573a52d2feb147769c4c6a1 234484b9b4cf3a20c97334417700db5029da65313410b3c9e929512c509e5c27 +lib/codeql/rust/elements/internal/generated/FnPtrTypeRepr.qll e9b45cf0e1ed7cc31b6dc56e171d33a0986a0753397e4eb7a3540f91831247a2 ec5607555ba1feb16e3f0ef4c4bbe67d14cb5eb4cd0c83d5aaf6a88de4008b60 +lib/codeql/rust/elements/internal/generated/ForBinder.qll 53c239c5710d0ddf0a0675e63e008ecab6b1fc9c3d42d19b19fcee95bf5ecfe3 783650d7f13190da743f9820d096d475ef6ddc42a6a201baf88a253c604bd587 lib/codeql/rust/elements/internal/generated/ForExpr.qll 7c497d2c612fd175069037d6d7ff9339e8aec63259757bb56269e9ca8b0114ea dc48c0ad3945868d6bd5e41ca34a41f8ee74d8ba0adc62b440256f59c7f21096 -lib/codeql/rust/elements/internal/generated/ForTypeRepr.qll 7daa3b938592b590d604203e7d0fc5c34c2bffe6adcceee5a5e0c681ed16214c f1380179cbdc188ad133c946d9e17e85aed0d77771b319f663d8eada0f7cf17d -lib/codeql/rust/elements/internal/generated/Format.qll 934351f8a8ffd914cc3fd88aca8e81bf646236fe34d15e0df7aeeb0b942b203f da9f146e6f52bafd67dcfd3b916692cf8f66031e0b1d5d17fc8dda5eefb99ca0 -lib/codeql/rust/elements/internal/generated/FormatArgsArg.qll c762a4af8609472e285dd1b1aec8251421aec49f8d0e5ce9df2cc5e2722326f8 c8c226b94b32447634b445c62bd9af7e11b93a706f8fa35d2de4fda3ce951926 -lib/codeql/rust/elements/internal/generated/FormatArgsExpr.qll 8aed8715a27d3af3de56ded4610c6792a25216b1544eb7e57c8b0b37c14bd9c1 590a2b0063d2ecd00bbbd1ce29603c8fd69972e34e6daddf309c915ce4ec1375 -lib/codeql/rust/elements/internal/generated/FormatArgument.qll cd05153276e63e689c95d5537fbc7d892615f62e110323759ef02e23a7587407 be2a4531b498f01625effa4c631d51ee8857698b00cfb829074120a0f2696d57 -lib/codeql/rust/elements/internal/generated/FormatTemplateVariableAccess.qll a6175214fad445df9234b3ee9bf5147da75baf82473fb8d384b455e3add0dac1 a928db0ff126b2e54a18f5c488232abd1bd6c5eda24591d3c3bb80c6ee71c770 -lib/codeql/rust/elements/internal/generated/Function.qll 25aa44c816233b9259b4ca12a15b6aff5856f4147d6a72fd0ec2fdebb24a5131 62a8a9080bf555950a854f84444d79cbe72d69b1d3f73ac801bb11e732fc7e46 +lib/codeql/rust/elements/internal/generated/ForTypeRepr.qll 8d960834b5fb55f50f6259d565961e8604f4298ff7a69120ceb9a21257ba629c f93c3477bffe1c648bb1d2c126f608fe8eee41abe7a306a7b6f16957d280b1c9 +lib/codeql/rust/elements/internal/generated/Format.qll d2c171c1cb477dfb22665a09207f704cae1747693e2b24f3c0914506492c6b08 1e777e406f84f040eee4f33be51fd72b149a97d31c33911eb0bff8d1e81949d0 +lib/codeql/rust/elements/internal/generated/FormatArgsArg.qll 24a0c1e6b1d51cf25c9c04bea2d3692978c6accdba1c9b990edf3804d382d784 3e309db56048786599debc41f97a0fa8436ae44abe8498b2218438cf9eafef47 +lib/codeql/rust/elements/internal/generated/FormatArgsExpr.qll 7cc086bb2a132f2b1a20d69994d7c767581c28c29bfc1fe6ccb4dcc2f4cac1b8 8d4ece2140ac31c31e2443249f3fd8b9db8eb6a2dfeab8b15c65ebd99841d5b7 +lib/codeql/rust/elements/internal/generated/FormatArgument.qll 5ce1cb9005fab3769c84cb21beb401db69cebee8be75c8e794d400648b6ab0bf ed101e21d7f2cf7e1a607ae409b9a83d2ed68a2eb7cae740abd542bc8f56e9ec +lib/codeql/rust/elements/internal/generated/FormatTemplateVariableAccess.qll 7de1e97aaeadcdc9051ffe92a4083a43f81562d7fe733773be8be42a3649ddef 5300fb4af144de0b033135fd31e02981535b53da239729688de67a7db45b7e55 +lib/codeql/rust/elements/internal/generated/Function.qll f40dd30af74f2e8af3b8265df06f516bbb074313f68096ef39ba8f0155346afc f110aa828b25980539dfa8ec856576dc21b3a74710c18dcb115ecb162c6c4117 lib/codeql/rust/elements/internal/generated/GenericArg.qll 908dadf36a631bc9f4423ab473d1344ed882c7f3f85ac169d82e0099ff6337d4 c6ef5358db3a0318987962a51cbe6b77ae9c0e39c1312a059306e40e86db7eb8 -lib/codeql/rust/elements/internal/generated/GenericArgList.qll b8cd936bba6f28344e28c98acf38acb8ef43af6ecf8367d79ed487e5b9da17cb 8b14331261e49d004807285b02fca190aafd62bfb9378b05c7d9c1e95525fe7b +lib/codeql/rust/elements/internal/generated/GenericArgList.qll 1e4a0e887470fa15a8052a01b06aa485d6852d681883f652b5893e70a87fbcaa 1cb0ef4ac93dec6ae2ad531729b3eb5a529ec880c5e18e2d055d9cb180369c1e lib/codeql/rust/elements/internal/generated/GenericParam.qll 85ac027a42b3300febc9f7ede1098d3ffae7bac571cba6391bc00f9061780324 806cb9d1b0e93442bef180e362c4abc055ab31867ff34bac734b89d32bd82aa1 -lib/codeql/rust/elements/internal/generated/GenericParamList.qll b18fa5fd435d94857c9863bbcc40571af0b1efba1b31ba9159c95568f5c58fce 6e70f1e9a1823d28d60e0e753ac8fbbe8deb10c94365f893b0c8f8ea4061b460 -lib/codeql/rust/elements/internal/generated/IdentPat.qll 1fe5061759848fdc9588b27606efb1187ce9c13d12ad0a2a19666d250dd62db3 87dbc8b88c31079076a896b48e0c483a600d7d11c1c4bf266581bdfc9c93ae98 -lib/codeql/rust/elements/internal/generated/IfExpr.qll 413dd7a20c6b98c0d2ad2e5b50981c14bf96c1a719ace3e341d78926219a5af7 c9a2d44e3baa6a265a29a683ca3c1683352457987c92f599c5771b4f3b4bafff -lib/codeql/rust/elements/internal/generated/Impl.qll bdc3da08b23ab098e92927a57c2e99eeb78ea8561cf11accc51db3033492b500 4b45be6b0c51f03999619705104574d78c262ed2497921f2ca8696844b17addc -lib/codeql/rust/elements/internal/generated/ImplRestriction.qll 934b9c66f3fb3bbebc5b0a5f748fd33d46b08dc2ff77411ca46c2b5a6183db2d ec2c695d23cfe4ac78d372996b7269b152bd72a7747a723c203dad8304d583ba -lib/codeql/rust/elements/internal/generated/ImplTraitTypeRepr.qll e376a2e34ba51df403d42b02afe25140543e3e53aaf04b9ea118eb575acb4644 dc3a7e3eac758423c90a9803cc40dfdf53818bd62ee894982cd636f6b1596dfc -lib/codeql/rust/elements/internal/generated/IncludeBytesExpr.qll 39383a3b29f01c5e721f8db75fa78842c32ed823a3523709d8facaaaf6f490ee 2ccb4c8d1f00b0bdb881e18d4712effc34ac806d7eb6432fcf86191e19a294e3 -lib/codeql/rust/elements/internal/generated/IndexExpr.qll cf951fc40f6690e966b4dc78fa9a6221aa5c6cade44759dcb52254f799292d11 1572e71918cc4e0b7e028331b6d98c9db23100a3646cd3874d1915e06ab6211d -lib/codeql/rust/elements/internal/generated/InferTypeRepr.qll 4f101c1cb1278e919f9195cac4aa0c768e304c1881394b500874e7627e62d6c4 dca3f85d0a78ecc8bf030b4324f0d219ffff60784a2ecf565a4257e888dea0ff +lib/codeql/rust/elements/internal/generated/GenericParamList.qll 034b7026a7104a3302b12972b0953a621e603fe781819f63f4b3827a96698630 07f807797b98521cece9400feb052b01a1fc35bdaf55df7cb0863aae5702c0ce +lib/codeql/rust/elements/internal/generated/IdentPat.qll 68671110f903ccc8bea948cbeef3e7a2b699ae0bb5c3aea58b7ab8a18a1adcb9 1489d5dc35e2f953426b15f89b56ac339816a1c1168025edd3cc9e243058a8db +lib/codeql/rust/elements/internal/generated/IfExpr.qll 8331c553a52663f2256633fe69f937fe5819c50b7e90e1188c0d43c3f203fd55 3084474404f84d77d97834d9eecefbb0c760801d2433edf08831bef32f6b297f +lib/codeql/rust/elements/internal/generated/Impl.qll 7c645e932f21ea8f37b734324b2e97cc71a4881ee305f00eb7baf584a8b62f97 78c7c2144e5467a62cebadad29b83c6f8244f5495d7f0ced77e09e7f2ef3641f +lib/codeql/rust/elements/internal/generated/ImplRestriction.qll d74591e8fa8d164207270766c2d7cbc3ecee42cf69ac9401bc6343a038ad9429 eb6fb67bd66d3a04f483b9291ae8a876ff71b627b127f44bdac40ab3008eeabc +lib/codeql/rust/elements/internal/generated/ImplTraitTypeRepr.qll eddad5f87306202f903ed70de198bd7b4e0ceccf9526400b53fdf85f69ccb80a 8ab459ab7f6badff0fb61c8813fdd521746ee57711f235fcb303ec399738b54d +lib/codeql/rust/elements/internal/generated/IncludeBytesExpr.qll 9a047dabc395b00509b457dc86a0029f10272a1ce3a6b2194a7391ca7beba0fd ca929e0686255d4e860fb80c33e5ba580e0083e61b12ed3819394dff14d6b46c +lib/codeql/rust/elements/internal/generated/IndexExpr.qll df6593db9e67748e49f953e596f987d9ab9b6bd46c425a10df4814aa9bbe021b c6e30efaaffc3dbdfe2240f017337fa8ac5e6c703f2835533d3d7e536c102191 +lib/codeql/rust/elements/internal/generated/InferTypeRepr.qll 70a80413dd1fab41bb275bda17af4c9b84be2d52a9281380f82c604f4854e980 a5caa63ef4b970cdf4e11a4e67105d80fbc48eaa7992b91e350023521263afe7 lib/codeql/rust/elements/internal/generated/Item.qll 03077c9d2f3200ebbc5df5d31f7d9b78a3ae25957ac46899a19a93684b2d7306 6492e341b9d9270c0181da0a5330f588238ced81657041ad1ad343db2bdf210b -lib/codeql/rust/elements/internal/generated/ItemList.qll 1571a3ab0f2c7c0d8384549f8eac7f6e6863c42f3ec5d5ea5e01fc26b9f1056f 7b2cade995505f214df9bb2d73143a28b2499f76d88abc56ae8fcc59bf709204 -lib/codeql/rust/elements/internal/generated/KeyValueMeta.qll 0cd628f043ee5d693f602d91cd6d4e3e889beed905d84ae215be2ce0988bd2a9 4fa22e86456df225c14ae10f6c0d2509447efed81ef7bc98a88c61b0f06c1a1c -lib/codeql/rust/elements/internal/generated/Label.qll 6630fe16e9d2de6c759ff2684f5b9950bc8566a1525c835c131ebb26f3eea63e 671143775e811fd88ec90961837a6c0ee4db96e54f42efd80c5ae2571661f108 +lib/codeql/rust/elements/internal/generated/ItemList.qll 174c8eebd5cdfb8e0e74b492f30f660d758e87a9705947589376767c8d5ace41 d6bce9aa6a594a3e6523c5c5863b7fb72b1ed40c6526e1e50c4fccdb7fa7f243 +lib/codeql/rust/elements/internal/generated/KeyValueMeta.qll 6e1cd898cb80b7abfe3e64ce232b60aa0efc134722c4eb9150d4604e139557a9 d2da54005a3a266594b01cbbab85aa999d99f7a69cdd55627707bea2fbdf9f72 +lib/codeql/rust/elements/internal/generated/Label.qll 84590e70dbc51f1fea0cd4bef38f3798cf0c1eb00dffae5b78d3e12e7da5e4fb 3506f2debdd836e6169b6881d96df67e544e9dd3c68c08d899c1a8f60c087d75 lib/codeql/rust/elements/internal/generated/LabelableExpr.qll 896fd165b438b60d7169e8f30fa2a94946490c4d284e1bbadfec4253b909ee6c 5c6b029ea0b22cf096df2b15fe6f9384ad3e65b50b253cae7f19a2e5ffb04a58 -lib/codeql/rust/elements/internal/generated/LetElse.qll 9e6f7057b8cb7d37b0ea79d540520028febe017ed8e9def95927ffa3fcdc1af4 3ee7d344d718898f25eb2a7a646d3c6704e8f1f22b83d0c0ea727cff74161946 -lib/codeql/rust/elements/internal/generated/LetExpr.qll 5983b8e1a528c9ad57932a54eb832d5bcf6307b15e1d423ffa2402e8a5d8afa4 8a6affdc42de32aa1bfc93002352227fc251540304765e53967bab6e4383f4ae -lib/codeql/rust/elements/internal/generated/LetStmt.qll 21e0fadccc1e7523ef1c638fc3e2af47256791eff70d1be01a9c377659ee36ef 21ccb4821bdbde409f17ae96790e395546d6c20d2411fccf88bad6ef623a473e -lib/codeql/rust/elements/internal/generated/Lifetime.qll 2f07b2467c816098158ed5c74d2123245fe901d0d1cca3ff5c18d1c58af70f4e d0ba493bc337a53fd3e7486b1b3c9d36c5a0b217d9525fc0e206733b3ed3fa74 -lib/codeql/rust/elements/internal/generated/LifetimeArg.qll 9e2378391fb130513972176ee2aa033e9fd1a55f1d4253da2d646317e33fa0fb 8168f867666e8e2bba994c7a025cd101907a4e870dc374b93ec0e55bb1bd8b4e -lib/codeql/rust/elements/internal/generated/LifetimeParam.qll 62ad874c198eac8ae96bceb3b28ad500f84464f66302c05f6a53af45f0816c82 386362c79b0641061655b3030ec04f6b80a4ef508e1628eea46a8836acada943 -lib/codeql/rust/elements/internal/generated/LiteralExpr.qll f3a564d0a3ed0d915f5ab48e12246777e4972ad987cd9deaafeb94cf407b2877 2337c3d5f60361bd10f6aeca301e88255f5dffb85301cf36cbbfa1a65bfad1cd -lib/codeql/rust/elements/internal/generated/LiteralPat.qll f36b09cf39330019c111eeaf7255ce3240178342d0ddaace59dbfee760aa4dbb d58667cf4aa0952450957f340696cb2fd22587206986c209234162c72bdb9d9a +lib/codeql/rust/elements/internal/generated/LetElse.qll 6b40e1094eb310645e753151020b5029c9d80878ddbb503965f127543867497c 9d50fbc97d33ae4f288e1f0c5edb744c88e34acbfe383f9b80b0d6718d699d84 +lib/codeql/rust/elements/internal/generated/LetExpr.qll 119ae15ccc60c42810572c821c310bd9a770a858591ef6e8dab351ec7acbc47f d538872283bdcc5b28ed1155caaaf793eef96262d8a79773b7a781f820ae6ad6 +lib/codeql/rust/elements/internal/generated/LetStmt.qll bebba95e19699c20935302481616995334f8f25b5c733304932d1c1f3b9a598e 780aa480212693fd4dd5c5382c5f6243145dd194151b6f5b2370b6f4df6a6f6b +lib/codeql/rust/elements/internal/generated/Lifetime.qll 6c94eebd583386c4fcdcc7c7e02e66e3ff384cfcc695e7e9b6c17505620c443a a4b08a0ff307912ea62633a04e06fe2618fb952bba43a416f93cbc20576f17a2 +lib/codeql/rust/elements/internal/generated/LifetimeArg.qll 479f82ecbc9a295afb047e4d52d53f816c455b8c526197adf99f4745d67d28e5 9548e850b7f3e14954d0d7139cf4f6913200b3dd74a210627a8512032eb9bf15 +lib/codeql/rust/elements/internal/generated/LifetimeParam.qll 13a52f3e6fd3e321f50fe377e57d1294ca137301311de6297399bdd5fe157bf3 c6a525683aa2e6008c40b09940b8c28889a034490a1be76a048ea22dea4b3688 +lib/codeql/rust/elements/internal/generated/LiteralExpr.qll a768a964a3f37417ed54226e840ba706082dc6b23e10670909295ecd8ab2a61f 9c8384cb8730e780a4a1821d46105f907eaa48c2d9e00584b30b4401e6e828d1 +lib/codeql/rust/elements/internal/generated/LiteralPat.qll a210444358ef0043cc5865fd400307256f3c149011449e2425b0e70398841661 98e46a8fdbaa24b965985c16dc09295a945fe9e6be9b5a011186e8f159b9dda4 lib/codeql/rust/elements/internal/generated/Locatable.qll c897dc1bdd4dfcb6ded83a4a93332ca3d8f421bae02493ea2a0555023071775e b32d242f8c9480dc9b53c1e13a5cb8dcfce575b0373991c082c1db460a3e37b8 lib/codeql/rust/elements/internal/generated/LoopExpr.qll db6bc87e795c9852426ec661fa2c2c54106805897408b43a67f5b82fb4657afd 1492866ccf8213469be85bbdbcae0142f4e2a39df305d4c0d664229ecd1ebdb9 lib/codeql/rust/elements/internal/generated/LoopingExpr.qll 0792c38d84b8c68114da2bbdfef32ef803b696cb0fd06e10e101756d5c46976c 111fe961fad512722006323c3f2a075fddf59bd3eb5c7afc349835fcec8eb102 -lib/codeql/rust/elements/internal/generated/MacroCall.qll 1a7ee9c782ebc9ab0a807762aabebc9e0a7ef10c6eb945679737598630b20af2 782a437654cb316355c020e89d50b07c93ba7817715fa5d42a9e807cf12d1a43 -lib/codeql/rust/elements/internal/generated/MacroDef.qll 90393408d9e10ff6167789367c30f9bfe1d3e8ac3b83871c6cb30a8ae37eef47 f022d1df45bc9546cb9fd7059f20e16a3acfaae2053bbd10075fe467c96e2379 -lib/codeql/rust/elements/internal/generated/MacroExpr.qll 5a86ae36a28004ce5e7eb30addf763eef0f1c614466f4507a3935b0dab2c7ce3 11c15e8ebd36455ec9f6b7819134f6b22a15a3644678ca96b911ed0eb1181873 -lib/codeql/rust/elements/internal/generated/MacroItems.qll bf10b946e9addb8dd7cef032ebc4480492ab3f9625edbabe69f41dcb81d448fe f6788fe1022e1d699056111d47e0f815eb1fa2826c3b6a6b43c0216d82d3904b -lib/codeql/rust/elements/internal/generated/MacroPat.qll 77af514f2e8b068f6428075bc6c759df5d52f0782f2fed90c3fa3e532871b4b6 27cda2ff01c0e7b8d27a5b3c4fc41947c3457a035833ad39e25913ba696c8ae0 -lib/codeql/rust/elements/internal/generated/MacroRules.qll 29d7f9a13a8d313d7a71055b2e831b30d879bdc1baa46815117621a477551dd7 9bd09859bfbbce3220266420b6d0d2cf067b3499c04752bff9fddc367da16275 -lib/codeql/rust/elements/internal/generated/MacroTypeRepr.qll e82e49cfcb5ee010e241b1d2ec9a13b1b741b545f392ceeab11b28d0925c7a84 cafd02b27d80fa734234341dedd63a6595b0408ec086fb3ba37a6b53fcce5b3e -lib/codeql/rust/elements/internal/generated/MatchArm.qll f8c4c955c50f8398159c492d9d0a74f7b71e9510fcb8a3aab1d06e0f7e15b263 713939c7ef77ca73d95788096163c26213ab49f34ed41c6f4bc09a1ef9607b0d -lib/codeql/rust/elements/internal/generated/MatchArmList.qll 12d969ecb267a749918e93beda6ad2e5e5198f1683c7611772a0734a2748b04b 9226ff7cadcab4dc69009f3deeda7320c3cee9f4c5b40d6439a2fe2a9b8e8617 -lib/codeql/rust/elements/internal/generated/MatchExpr.qll b686842e7000fd61e3a0598bf245fb4e18167b99eca9162fdfdff0b0963def22 00f1743b1b0f1a92c5a687f5260fda02d80cc5871694cad0d5e7d94bac7fe977 -lib/codeql/rust/elements/internal/generated/MatchGuard.qll 58fa1d6979ef22de2bd68574c7ffcf4a021d7543445f68834d879ff8cee3abcb 072f22a7929df3c0e764b2a770b4cdf03504b3053067d9b9008d6655fb5837e1 +lib/codeql/rust/elements/internal/generated/MacroCall.qll 54894ec88b57c2ace6e7f154021beb764460e5d81d627ae3aa82aff654863be4 3cdc0be3500c50ce80110ec1c348424b382fe0c916febec432570f7816d0a851 +lib/codeql/rust/elements/internal/generated/MacroDef.qll ceb965daf4e4fc52434f3cf64eab83a9b25a334476f8a5da9e243ffd25591d5e ef564309ac512f2e0f7332c212f92242a59bc152e0667262c9d2371e188500e2 +lib/codeql/rust/elements/internal/generated/MacroExpr.qll e36596803028408a76591e2ed6309aea8e5740105d6924029b1e74a6bf60efa0 34aa8c478f72c415a601d672c95f4e26384225a61e1f07b8f08d63cb4e4dc9d4 +lib/codeql/rust/elements/internal/generated/MacroItems.qll e641c26572c1b517b8f068cd76737b5f92f89f5015763e379e39d86b8f6440cc 4055ba4210bd96a4840601a260b6db50b9598eeef8a7650e5350fa28f84341b4 +lib/codeql/rust/elements/internal/generated/MacroPat.qll 5c044c3cfc984e71902b7326c1f8b06a629863c80b61c0574022e905dfaa5f35 d12f30547b3eb264d0baa2ab284b394221f6c5363dbe6b2fe51e3bb557e1d057 +lib/codeql/rust/elements/internal/generated/MacroRules.qll 7b2684dc0f75307aa2e85371dfdff4f48aa816e7f13445271c2fdb587519b168 1572a71eec788e500f84756e87ee88dceb0a5f002b4bac90b73ae25b3d2f8fc0 +lib/codeql/rust/elements/internal/generated/MacroTypeRepr.qll 747b614f532651bc890390a7ab1431b4892c263695e44a050e528232655f56ef aebca14e28277d92a1c0e8f15a57ea1d2e82121e9d13fa33f949041211695e89 +lib/codeql/rust/elements/internal/generated/MatchArm.qll 8620ba1a8f0db4bf6e6f64c3bfa56cc652859bd618821e79475b14b00543816e 0c36436b76de62c655cfaaf466e2039b410ab307acbfa1ea688491911a48d240 +lib/codeql/rust/elements/internal/generated/MatchArmList.qll b75e202d374031b110717be98fb803fa8bdd1fcd55c90eee867899a7826e9d98 16092ae38b283c16a115df4b8fdcb59bd90af2037fe2fab7fc84910458b0b570 +lib/codeql/rust/elements/internal/generated/MatchExpr.qll eed36a14b013d66928a2fdf047438b993fd2f9cf7bc77d837cced7c188eb4cb5 3335c18ac13288268d62c68a3a3d4b983de122820c5810dd8401bd545d05dbbf +lib/codeql/rust/elements/internal/generated/MatchGuard.qll b789fe3b0e78ee21b6712b5ec3eb97388ce04441469b7db63aa795b046daaf57 64a90af32944d6f4a8680a0cf87a78fa9bb60a2fcf16ec22717e81ed1bb69337 lib/codeql/rust/elements/internal/generated/Meta.qll 5c3358c737d504dacfa3227b80ceeead3cdeebbd7498d1d0ac88570cac1d91ec cd04ebdf19cf6710ce43e888211e61b0740aa6298db9a5ec79f29a1301a60b40 -lib/codeql/rust/elements/internal/generated/MethodCallExpr.qll ffce98a6a1921822b12ead721cff0878553eb3e049c5d2184a7abce32b6615b4 d1408a0f47ee5764fe7b484494daf6e1f99b1c6a505274c48545b3e650ef8baf -lib/codeql/rust/elements/internal/generated/Missing.qll 16735d91df04a4e1ae52fae25db5f59a044e540755734bbab46b5fbb0fe6b0bd 28ca4e49fb7e6b4734be2f2f69e7c224c570344cc160ef80c5a5cd413e750dad -lib/codeql/rust/elements/internal/generated/Module.qll ebae5d8963c9fd569c0fbad1d7770abd3fd2479437f236cbce0505ba9f9af52c fa3c382115fed18a26f1a755d8749a201b9489f82c09448a88fb8e9e1435fe5f -lib/codeql/rust/elements/internal/generated/MutRestriction.qll ab507ff1a1cdd04f3b5deab8b52b41aa520d7a20bf94ec3fe53644eb8524e7d4 0396ab58b867a53c1870fb12d1c203a741927defc0d08ae10ef7a93f48e8cedf -lib/codeql/rust/elements/internal/generated/Name.qll e6bd6240a051383a52b21ab539bc204ce7bcd51a1a4379e497dff008d4eef5b4 578a3b45e70f519d57b3e3a3450f6272716c849940daee49889717c7aaa85fc9 -lib/codeql/rust/elements/internal/generated/NameRef.qll 090c15ed6c44fc4f1a7236215f42e16921912d3030119ac22bc7ffe2dcdb4ba8 b61cc486e6764272c4e8377523bf043d0beae4926606dbcb48f8205c6a0b9a90 -lib/codeql/rust/elements/internal/generated/NamedCrate.qll e190dd742751ea2de914d0750c93fcad3100d3ebb4e3f47f6adc0a7fa3e7932c 755ead62328df8a4496dc4ad6fea7243ab6144138ed62d7368fa53737eef5819 -lib/codeql/rust/elements/internal/generated/NeverTypeRepr.qll 4f13c6e850814a4759fdb5fca83a50e4094c27edee4d2e74fe209b10d8fb01c3 231f39610e56f68f48c70ca8a17a6f447458e83218e529fff147ed039516a2f7 -lib/codeql/rust/elements/internal/generated/NotNull.qll 437dd90a15cc2518f26489d4251fc0de31646e7735a3463ec51983f39a33c3b6 78b1051f7ec1d82c36b5c825c4b9c3c2b8ad9563542e5e4b7d2f0292455fb74a -lib/codeql/rust/elements/internal/generated/OffsetOfExpr.qll c86eecd11345a807571542e220ced8ccc8bb78f81de61fff6fc6b23ff379cd12 76a692d3ad5e26751e574c7d9b13cf698d471e1783f53a312e808c0b21a110ab -lib/codeql/rust/elements/internal/generated/OrPat.qll 0dc6bd6ada8d11b7f708f71c8208fc2c28629e9c265c3df3c2dc9bea30de5afa 892119fc1de2e3315489203c56ee3ed3df8b9806e927ee58aa6083e5b2156dab -lib/codeql/rust/elements/internal/generated/Param.qll 19f03396897c1b7b494df2d0e9677c1a2fc6d4ae190e64e5be51145aba9de2e2 3d63116e70457226ea7488a9f6ed9c7cea3233b0e5cab443db9566c17b125e80 +lib/codeql/rust/elements/internal/generated/MethodCallExpr.qll 85895a3d8c607c1b742f6757d2d37effb320d01f62addd62847158cf5d3b8686 6c46f790c1a993befb1d9ca1dfa50aeddc20c8f9bc684eca963cdd70ec6aff57 +lib/codeql/rust/elements/internal/generated/Missing.qll 1810565cc670fadb5724bb93dd17363e107c79334c5dbd98bc85fda1b2be8b10 e9c91ba13715af0e6390e9d121523d622702bc569f8a148015a0d4e6f0488230 +lib/codeql/rust/elements/internal/generated/Module.qll 45411242fe83c27c45db4133a93ada2505c0ddcf8ea448904a7c4fa3ebf0a34e 8d1573878196820e67f323397b7676a2dc55c30aec2e9572da01044d78c1106e +lib/codeql/rust/elements/internal/generated/MutRestriction.qll 01fe01b18327c05e76d94c448b8c124811171252fbfde0ea2f9a0988af1483c6 95695424b50bde72bc50390d6739a7acefe0396207e2914f47d7f7258073c37a +lib/codeql/rust/elements/internal/generated/Name.qll ad7256a77b3dec0d6a5431a2d15f52d5138d93fa657c042819300f358a54475f 6b2bdb62bb7f38ccbb0ab30610cad9327bf6fa88fd5545f20539e659b2f93e03 +lib/codeql/rust/elements/internal/generated/NameRef.qll 20730079c68008a29d8bcedd7eecb634f5055c6acc5951ca100d0765fd3098bf 0be3384e1821d9743cf72c88d11422afc80c619436c8a6ab26606addc7d39d0b +lib/codeql/rust/elements/internal/generated/NamedCrate.qll 058d4c396383e19c5ce3b7835f2d76d477eedfe6771acd076f0d4b87cda2437e b5d44e4b31dc4fef46ec1219e6134d5d66df0512214b516ba1bfc9c0f024878c +lib/codeql/rust/elements/internal/generated/NeverTypeRepr.qll e165a248547d180ec34f97bdf7c979adc0bd7160dcb04dcaa2994f2215180061 b5ca8403399db500f5c7de439ec2a9f9583906548c2ce1ebea9dab510beae6bf +lib/codeql/rust/elements/internal/generated/NotNull.qll c78815961df086065fd140a55b1eb7eff883940c8b31dcd79341e3f9f035423b 4b7cb75c48b791f8b8ca5e9144bdfd97ce59a207c2b8ade1da7b97fff2311134 +lib/codeql/rust/elements/internal/generated/OffsetOfExpr.qll 5d39ade5f3e91dbb54f1fe34b6ea58faad795d72646c282970a127cb44189d45 716fdbbd1a81acdf965fbb3e0a7141db5c5a4874625ebd5cb3c8341e6f4484e9 +lib/codeql/rust/elements/internal/generated/OrPat.qll 1eb20314c27658f05101fc4084267d70e36f67cf306c7d915b1f9c025f1bb750 cae1cc20517b5a4b0ba8ab789a817759918bb942bc22c580b8798b06d80a43eb +lib/codeql/rust/elements/internal/generated/Param.qll 87c905e1e63efe0c46b0c5f725bf3f1ac9432eefb16d6e815bdb98e77c14e6e9 ee1ad6fb188b7f1577a35a2f7315e634167ab844ea858a0dcb442e481afc5c70 lib/codeql/rust/elements/internal/generated/ParamBase.qll 218f3b821675c0851b93dd78946e6e1189a41995dc84d1f5c4ac7f82609740f7 4c281b4f5364dab23d176859e6b2196a4228a65549e9f63287fa832bd209e13d -lib/codeql/rust/elements/internal/generated/ParamList.qll eaa0cd4402d3665013d47ec556cc05c30a0666aece43163cf5847789389d05bf a08d09d0d3dfca6f3efade49687800bae7e6f01714ed0a151abd4885cd74a1b6 -lib/codeql/rust/elements/internal/generated/ParenExpr.qll 812d2ff65079277f39f15c084657a955a960a7c1c0e96dd60472a58d56b945eb eb8c607f43e1fcbb41f37a10de203a1db806690e10ff4f04d48ed874189cb0eb -lib/codeql/rust/elements/internal/generated/ParenPat.qll 24f9dc7fce75827d6fddb856cd48f80168143151b27295c0bab6db5a06567a09 ebadbc6f5498e9ed754b39893ce0763840409a0721036a25b56e1ead7dcc09aa -lib/codeql/rust/elements/internal/generated/ParenTypeRepr.qll 03f5c5b96a37adeb845352d7fcea3e098da9050e534972d14ac0f70d60a2d776 ed3d6e5d02086523087adebce4e89e35461eb95f2a66d1d4100fe23fc691b126 +lib/codeql/rust/elements/internal/generated/ParamList.qll d8e73957983491302faa560ba0756f125dec0b310d59def54d4763408e1b81c9 701fa4e1364478617b2f73c9d86bdba6f4a6c04f58208b9ed35a388f11e11938 +lib/codeql/rust/elements/internal/generated/ParenExpr.qll 811629da7116f508d22da3d2371eaa65fcb7cb41f507076afefa0ad8c0b92796 754b27827386420c4ccc023158289370b14c827d8b18fdcf009cb913b707380b +lib/codeql/rust/elements/internal/generated/ParenPat.qll 6f7f7987209c3809b98f477dadf20a6fcf9b02d5696fb37f88c027d38a4c206e 7b377256e571b98005fa6ce4c1afcc3effb51afc4a1cd5264f46518e8dd1e60f +lib/codeql/rust/elements/internal/generated/ParenTypeRepr.qll ffe7cde9a77d449adeb619e703b7f4a644127f7dac38546eb1844bafd6d1b92f ea77a4ccfef88e01220fca0009fa70403687d3d3fcba96c5d470129436df3c96 lib/codeql/rust/elements/internal/generated/ParentChild.qll 491b2adad685733cae41b4e918e850718074a14e0f179b3debbe9424c927a5aa 4e851e1d327156fcad247dae87adc091fd0e2f7ff19c6559612165c16d961beb -lib/codeql/rust/elements/internal/generated/ParenthesizedArgList.qll d901fdc8142a5b8847cc98fc2afcfd16428b8ace4fbffb457e761b5fd3901a77 5dbb0aea5a13f937da666ccb042494af8f11e776ade1459d16b70a4dd193f9fb +lib/codeql/rust/elements/internal/generated/ParenthesizedArgList.qll 4e85b4bcabdbde71602d557fa0dd5ccbab09d2360d2bb470384cb85437e1611f 688af26f360655ee6454fa45b3169cc9db6ed46d8f58c2470111703e1e7a117f lib/codeql/rust/elements/internal/generated/Pat.qll 3605ac062be2f294ee73336e9669027b8b655f4ad55660e1eab35266275154ee 7f9400db2884d336dd1d21df2a8093759c2a110be9bf6482ce8e80ae0fd74ed4 -lib/codeql/rust/elements/internal/generated/Path.qll 9b12afb46fc5a9ad3a811b05472621bbecccb900c47504feb7f29d96b28421ca bcacbffc36fb3e0c9b26523b5963af0ffa9fd6b19f00a2a31bdb2316071546bd +lib/codeql/rust/elements/internal/generated/Path.qll e55c58906be8764cbed224542fe1551e89b0f2eb4213899c76509c2e468d018d fdde9f8603ff27eb9d50c6619211f4bd6e49cf89ff945197cf247438b8c60fd1 lib/codeql/rust/elements/internal/generated/PathAstNode.qll b02654422f80e398027069135bb01205358f0ab82ded3408d83d066f300996a3 345e7f92a75bfc71657b223602f60c36f7637d6f2e3798f07e2d2926eea2431b -lib/codeql/rust/elements/internal/generated/PathExpr.qll 34ebad4d062ce8b7e517f2ab09d52745fb8455203f4a936df7284ad296638387 ba66781cdbdeb89c27a4bfb2be0f27f85fb34978d699b4e343446fb0d7ad2aa6 +lib/codeql/rust/elements/internal/generated/PathExpr.qll 379e92044d36bdf6bcf44a535cc5293453c568ee95e6a5f04ae88fd3ba357c91 4cb3651244f4b2a2ad02a6d1f71f849db9a1cfb020598f7728b84e4eba48fbb1 lib/codeql/rust/elements/internal/generated/PathExprBase.qll d8218e201b8557fa6d9ca2c30b764e5ad9a04a2e4fb695cc7219bbd7636a6ac2 4ef178426d7095a156f4f8c459b4d16f63abc64336cb50a6cf883a5f7ee09113 -lib/codeql/rust/elements/internal/generated/PathMeta.qll 42cf084a78acb656a86a6a9b3cd893b93176a6ec9fc989a0232f01cfa3cbd228 cccedf3ca1e353d55979354b0baa23d936890ae9581097cfe4b44748ca797f18 -lib/codeql/rust/elements/internal/generated/PathPat.qll 003d10a4d18681da67c7b20fcb16b15047cf9cc4b1723e7674ef74e40589cc5a 955e66f6d317ca5562ad1b5b13e1cd230c29e2538b8e86f072795b0fdd8a1c66 -lib/codeql/rust/elements/internal/generated/PathSegment.qll 48b452229b644ea323460cd44e258d3ea8482b3e8b4cb14c3b1df581da004fa8 2025badcfab385756009a499e08eecc8ffd7fa590cd2b777adb283eebcc432c6 -lib/codeql/rust/elements/internal/generated/PathTypeRepr.qll f12fe234d7fb1a12678b524434fcdd801453d90eb778b9173f7197ff3d957557 a1be605f8937c5bd3a3a9cb277782c24446c9f5ef8363e6f5ee8f6229886b6f6 -lib/codeql/rust/elements/internal/generated/PatternTypeRepr.qll 081f81ecb630be1a437711c028887f8e2aee017a8dd76c5ae4dac4e04b319b0b 5a4125625847271a7cbc5af4a0cb85040af768600ff762fa53c56d3fdbb99730 -lib/codeql/rust/elements/internal/generated/PrefixExpr.qll c9ede5f2deb7b41bc8240969e8554f645057018fe96e7e9ad9c2924c8b14722b 5ae2e3c3dc8fa73e7026ef6534185afa6b0b5051804435d8b741dd3640c864e1 -lib/codeql/rust/elements/internal/generated/PtrTypeRepr.qll 8d0ea4f6c7f8203340bf4b91ecedad3ed217a65d8be48d498f2e12da7687a6d0 6f74182fd3fe8099af31b55edeaacc0c54637d0a29736f15d2cd58d11d3de260 +lib/codeql/rust/elements/internal/generated/PathMeta.qll 9e47ae77903bb2bdf1fa7f130ae45e444b0847722a22c7b5edaa8bdd1ae038df a80c417c5df58d944504ca8657fd6066cbf84939a70840bc813b6b41d138ee04 +lib/codeql/rust/elements/internal/generated/PathPat.qll 7cc8389d7873b28967983d9bd7237e3cb95c86d1330559264221dcf7f81808cf d50fee400190914c1a76eb6bc009bf9f91050bf2c7c93eddc340e6fa5aac93c6 +lib/codeql/rust/elements/internal/generated/PathSegment.qll 645fde67796f1eb8945a94d04146500c5b2bb46a7c91a6dcda1017a17ecef17a 310e83672af434b3be51dd7721751e66d0be5c80a71e92f1f7076c89f8c5c64a +lib/codeql/rust/elements/internal/generated/PathTypeRepr.qll e2039430b87bb54f155a993fbcd7c759d54d34ce957bc1a82ed208a430a975b2 178a86568964b6923c923587d72ad3365fc8143a05b2780792ca253244732f6b +lib/codeql/rust/elements/internal/generated/PatternTypeRepr.qll 6d11342c39915b5173cf735957af0e3f92398f22b6bc189bfbcdc46851d4d33c 3ef6765f7dfb39c2280aeec4f15f42e4056d2d6644a279a8726c43feb28a9a38 +lib/codeql/rust/elements/internal/generated/PrefixExpr.qll 62a0cd04ec8c69c355844996aeb7cf4e67b002cd9d1c38b310f3632edc5231af 845e184e2ece7f3419206dce2d3437aafa38372b613e039adaaefd34bbb348c5 +lib/codeql/rust/elements/internal/generated/PtrTypeRepr.qll d7a400b238d7edf2b46596dab12e61add04e4930c9fe40c6b7de6d29fe3e3155 914d3b3a80823d2965664b6d4dd161598424d5477f7a1c7f872ae4894896430b lib/codeql/rust/elements/internal/generated/PureSynthConstructors.qll e5b8e69519012bbaae29dcb82d53f7f7ecce368c0358ec27ef6180b228a0057f e5b8e69519012bbaae29dcb82d53f7f7ecce368c0358ec27ef6180b228a0057f -lib/codeql/rust/elements/internal/generated/RangeExpr.qll 23cca03bf43535f33b22a38894f70d669787be4e4f5b8fe5c8f7b964d30e9027 18624cef6c6b679eeace2a98737e472432e0ead354cca02192b4d45330f047c9 -lib/codeql/rust/elements/internal/generated/RangePat.qll 80826a6a6868a803aa2372e31c52a03e1811a3f1f2abdb469f91ca0bfdd9ecb6 34ee1e208c1690cba505dff2c588837c0cd91e185e2a87d1fe673191962276a9 +lib/codeql/rust/elements/internal/generated/RangeExpr.qll 1e954c224978448f7658153d66a50e48c5909559cfc4a73262e23fc9210fadb6 a868bafdaa59927b9a88e3368541dfa575a2fc246f0d47f0880b9b10761259e0 +lib/codeql/rust/elements/internal/generated/RangePat.qll a0c805eb31a773e16806384bd11592563c61b720e694bd444b93c28b5cf00d65 4b82088a62e7e5027f5930a697a18b5d4fd2a831a7bb6123d1b3f8ff4a9255ea lib/codeql/rust/elements/internal/generated/Raw.qll b797442c8c4ef094437c7e20c2d580a96b272ea6752a496213c8caaf72cabe6a 433002df28dc5ffae8485ddd0bac85e47587e088e730f5ccf34152eceb4d325c -lib/codeql/rust/elements/internal/generated/RefExpr.qll 7d995884e3dc1c25fc719f5d7253179344d63650e217e9ff6530285fe7a57f64 f2c3c12551deea4964b66553fb9b6423ee16fec53bd63db4796191aa60dc6c66 -lib/codeql/rust/elements/internal/generated/RefPat.qll 456ede39837463ee22a630ec7ab6c8630d3664a8ea206fcc6e4f199e92fa564c 5622062765f32930465ba6b170e986706f159f6070f48adee3c20e24e8df4e05 -lib/codeql/rust/elements/internal/generated/RefTypeRepr.qll 5b0663a6d234572fb3e467e276d019415caa95ef006438cc59b7af4e1783161e 0e27c8a8f0e323c0e4d6db01fca821bf07c0864d293cdf96fa891b10820c1e4b -lib/codeql/rust/elements/internal/generated/Rename.qll 53dd50d35aa38cb6eb4174c94e8e23042b42bdc4f38df009489ebf707380483b db14fbce0d95b4dae3d7512f9bdee92e0dc2dffde5ba5d7458f2f5dd632876b0 -lib/codeql/rust/elements/internal/generated/RestPat.qll 369f5828bb78f2856d528679a9869f81859b375c2f831ff72f4507daaee976e3 17f24ce8aa6a27359c10a654667b7877ca7a1509509e2ab246ed26fe15ef66b4 -lib/codeql/rust/elements/internal/generated/RetTypeRepr.qll 853b7fd6c1f3678d0f9315ac23a99a0828a6e54148de24016a265039c7b1941c f1e140d2b113c494601143b735482869ee817c8a7d92026f6a511bc5c1420552 -lib/codeql/rust/elements/internal/generated/ReturnExpr.qll c9c05400d326cd8e0da11c3bfa524daa08b2579ecaee80e468076e5dd7911d56 e7694926727220f46a7617b6ca336767450e359c6fa3782e82b1e21d85d37268 -lib/codeql/rust/elements/internal/generated/ReturnTypeSyntax.qll 7b7692ca9fbe627afa0759050a740f0f42a8083446c1c3196084f5698fc570c3 96a735d60a3919c7c994f7b67930c9e51a3713940678d04a5fee54557d733c24 -lib/codeql/rust/elements/internal/generated/SelfParam.qll 076c583f7f34e29aaaf3319e9d64565a34c64caa5a6dfca240c0cc7800e9a14c 375afed1772d193b71980d3825c4ac438e90b295cba0baf58319d29a3a8463a0 -lib/codeql/rust/elements/internal/generated/SlicePat.qll 722b1bd47a980ac9c91d018133b251c65ee817682e06708ad130031fbd01379b 7e0ce13b9de2040d2ef9d0948aab3f39e5fdc28d38c40bfbee590e2125dbe41c -lib/codeql/rust/elements/internal/generated/SliceTypeRepr.qll 6f4f9d7e29784ce95dc6f9fcdf044909d55c7282c732a81b0108dc4000e96b48 a188436cd6d4d071fd45b943d9778e46ee9a465940bdd1a2903269b4b7a01e21 -lib/codeql/rust/elements/internal/generated/SourceFile.qll 4bc95c88b49868d1da1a887b35e43ae81e51a69407e79463f5e8824801859380 5641581d70241c0d0d0426976968576ebbef10c183f0371583b243e4e5bbf576 -lib/codeql/rust/elements/internal/generated/Static.qll 1a6c87d3c5602e3d02268ebe2463a4ac64614ad25e8966a9bdb9c0ef58991365 cc1fe16d70cdce41a12e41a8f80cc38bdd7efa49c1544e35342fcf3cd26b8219 +lib/codeql/rust/elements/internal/generated/RefExpr.qll 4d682dd36961edcb8b9cc36a1e2363bb833c0ee878617ca361685d4c3e6547ff 14459e3dca4ae0aaaea5e3429be6cd5eb8f0c11c226af48993b782324b604bb3 +lib/codeql/rust/elements/internal/generated/RefPat.qll 21864ad065b20e958e4fafae7ebbda3b30c0cc9544f8a15f324b85ebd7047037 da54d64bf0b845528b7f86928aef75e89ec90da4a4dea91ab9e08588cf4afe25 +lib/codeql/rust/elements/internal/generated/RefTypeRepr.qll fbab8bae4d3eac10338a9bc5743f3ac9c0feab11107d6d28825f4e97bcd59bad 224f6aec466ddcde526ce8df23d2f925887232b462730af078815a68b47c133d +lib/codeql/rust/elements/internal/generated/Rename.qll dcc205cf6a1cbceb97c363379ecf67d7640ed992a73af4597ecabd2b65dbe898 7794510d6594d289a6fa655f8618fa7ac4c0667158afbc236590248e1f0cbad1 +lib/codeql/rust/elements/internal/generated/RestPat.qll 042ff722d32af92df1e681c7272de56c063b8c5bc95187a2b3f310712d70c5e1 eb56af6f5f270a1979a56c9f510b6f9db16df5d145b3b3d7fc56fd47d5bde6e0 +lib/codeql/rust/elements/internal/generated/RetTypeRepr.qll 7e60c74c696cebe3a9fb6bbed28bb3446ae0804b2177ed5613892762f17fb684 80be5ba25f852ad54daca4a4c24df1b09cb3d501bdc02afafe1c0ef2f9644efe +lib/codeql/rust/elements/internal/generated/ReturnExpr.qll 620c03f9dec2ca76e5f5296fc1900f8f2e9474d65264df318e5a553fa4e3ad06 7553d9a054da774f7a8ca31616f5d44ecc1cbe78b383ebe5fac55afc27120eab +lib/codeql/rust/elements/internal/generated/ReturnTypeSyntax.qll 3c2eee8dceae1b28dbee1b64ed2db6a932227dd9581eed089d68e8882eff4db0 a9f942ae7839954927239a842832592920754b510f12ae16057f6a2a0c561bf5 +lib/codeql/rust/elements/internal/generated/SelfParam.qll 9c85961392d3d36f7dfdde1311a17962b0eeafb64e9e748b580abed2c4a49ad5 da6f438bba6e1e97cbd4a16bb5bf07defe75023c38280fd7160367de1899141b +lib/codeql/rust/elements/internal/generated/SlicePat.qll 457281f265db001f59cb7fdb518a58406981114642d003ff9bf555f4d59c5a34 8256531d5a4a16d083601fcc0d3d3accccc631562e5948b26ae2b0111dd19c6c +lib/codeql/rust/elements/internal/generated/SliceTypeRepr.qll 15e720c364638c14fad9dcca4f6627572423718189678c7252a462400cebd56e 7bafd93d6ec9e1196917becd6679778e552f5bc3d58537801071f957d77e61ba +lib/codeql/rust/elements/internal/generated/SourceFile.qll 144ff23a64cb4602d56bcfd767428d7441273c6bfb55a997d77ea0c3006c2f50 307fbd5daf094bd08a39ba0e24fe395f5296d4a8334d4da6afb104e9873a65e9 +lib/codeql/rust/elements/internal/generated/Static.qll f706e604c80641b27ca2aef0ef857b7d3e546542f29323f73395c0317821f6a4 f0105e0d6dec743d9179b2a525c321538f67e5fe9e1c1d66bf056e98caea3ad6 lib/codeql/rust/elements/internal/generated/Stmt.qll 8473ff532dd5cc9d7decaddcd174b94d610f6ca0aec8e473cc051dad9f3db917 6ef7d2b5237c2dbdcacbf7d8b39109d4dc100229f2b28b5c9e3e4fbf673ba72b -lib/codeql/rust/elements/internal/generated/StmtList.qll 834b87cd93f0c5b41736fb52a6c25fd0e3bdce41d5a64cb3d0810c54e90507f4 ec42f2dfa322044ceaaf90d278f0e7e751d63710facbaf3f5ee69ca3c64ecd06 -lib/codeql/rust/elements/internal/generated/Struct.qll 56775b98f793c108bd0eb8f35dbbc4983c170138e92c7378c24f45d2e612ca39 7bd83f2686f2f7a6b55b82156028c1951fde4c3ac9fc0248b1bb28f35b949fd4 -lib/codeql/rust/elements/internal/generated/StructExpr.qll e77702890561102af38f52d836729e82569c964f8d4c7e680b27992c1ff0f141 23dc51f68107ab0e5c9dd88a6bcc85bb66e8e0f4064cb4d416f50f2ba5db698c -lib/codeql/rust/elements/internal/generated/StructExprField.qll 6bdc52ed325fd014495410c619536079b8c404e2247bd2435aa7685dd56c3833 501a30650cf813176ff325a1553da6030f78d14be3f84fea6d38032f4262c6b0 -lib/codeql/rust/elements/internal/generated/StructExprFieldList.qll 298d33442d1054922d2f97133a436ee559f1f35b7708523284d1f7eee7ebf443 7febe38a79fadf3dcb53fb8f8caf4c2780f5df55a1f8336269c7b674d53c6272 -lib/codeql/rust/elements/internal/generated/StructField.qll cdb78ca654a459204a8f471f8e1a79a08186db93177289ab6dd4a8864fb88cf3 d0ddbe4e9e570721796379b7e090bec6301f50b0ed26de06ff1f7a4e1a9eb70f -lib/codeql/rust/elements/internal/generated/StructFieldList.qll 5da528a51a6a5db9d245772aec462d1767bcc7341e5bedd1dc1bbedd3e4ab920 dac4cee3280eef1136ffc7fbc11b84b754eb6290fc159c6397a39ae91ceeaa13 -lib/codeql/rust/elements/internal/generated/StructPat.qll c76fa005c2fd0448a8803233e1e8818c4123301eb66ac5cf69d0b9eaafc61e98 6e0dffccdce24bca20e87d5ba0f0995c9a1ae8983283e71e7dbfcf6fffc67a58 -lib/codeql/rust/elements/internal/generated/StructPatField.qll 5b5c7302dbc4a902ca8e69ff31875c867e295a16a626ba3cef29cd0aa248f179 4e192a0df79947f5cb0d47fdbbba7986137a6a40a1be92ae119873e2fad67edf -lib/codeql/rust/elements/internal/generated/StructPatFieldList.qll 1a95a1bd9f64fb18e9571657cf2d02a8b13c747048a1f0f74baf31b91f0392ad fc274e414ff4ed54386046505920de92755ad0b4d39a7523cdffa4830bd53b37 +lib/codeql/rust/elements/internal/generated/StmtList.qll 028c4ca5b245cc5535d14c7ed2c815d161e2f944e9c324983677cded6f737058 e14941fb5960ec4ce7db7ce37685ecbc61af5dda9795a969c50953c5395bb473 +lib/codeql/rust/elements/internal/generated/Struct.qll 9a218f180490f3115b9577ec632fc177afda243ae2bd9dd992a8705fa70d3009 6dd4572f1292d224aaa81b543126a9655b97b809eb003d1b1c784416ef17ab03 +lib/codeql/rust/elements/internal/generated/StructExpr.qll e26e2dd10e8d38d4de48fc3f5fd5efd49fff7e1cfd9ab59c8b61cb7309485a04 75dbdfa23cdaad054de53f9e56fd0538094f0714f1674ce6facf3f7517a1b517 +lib/codeql/rust/elements/internal/generated/StructExprField.qll d8663066770cad4cf7cbe29ca74ed0d03241d0883367d08f20faba5b7daae937 41cb2423841b3af57a6d61233aac4ea3148ea1e42f115e223601c635c039def9 +lib/codeql/rust/elements/internal/generated/StructExprFieldList.qll 8dcb42134624949480ade77e82ffa6f120cae11d7f5e80e7176d5a3ac6dcf99b 4ab1a4d1b48f9156e0c85015f619c25986aa249721f04487546ff85cb47b99b0 +lib/codeql/rust/elements/internal/generated/StructField.qll e009faf1a5110eff4de98ce7da8418bf56f7e05e0622bd772180903445cb50dc 479baef6097cb7868c3464763d023a493357995a5df4a0e8e158937f3fc4711d +lib/codeql/rust/elements/internal/generated/StructFieldList.qll 2abf0688ca9659d205d8dabb98724b656493f4529e54e6d2a83f7073929ed5ef f2542e614e258845325e9103c26d50304fe45d21c4ce0630b52c91c8ce01a3dd +lib/codeql/rust/elements/internal/generated/StructPat.qll 1bcfbf6774b7cd61619e76509299e58942b7372493fdf7f9bae86f9a7af847df e2e3fc68473f448a0dc2de61d55d82da871cd544be8dad55f72ef14bf0cba85c +lib/codeql/rust/elements/internal/generated/StructPatField.qll f7db4f7b9e356c02b6a861f7763d5b00263bcc94c5f1a82e2c602925d0830017 489a214c4e7dbb333a940fbc7f13e8962737fb0614da6669de0de993692aee60 +lib/codeql/rust/elements/internal/generated/StructPatFieldList.qll 342ca25fbd8bf8fef84d06e263f59f010e21418658c1f79f40c52e5ce76ca158 c950a39a946904b84a2557fb1febd59906e42e5de4903e88d0da67ba3e14a250 lib/codeql/rust/elements/internal/generated/Synth.qll c753ec12f68833536dfcc467357f6bb6e0b039d2ab50683a4669432cbe20cbb2 e83329642325e05574ce4e82e3fc68e1a39b23f02f19a4cd972ca195f861f7eb lib/codeql/rust/elements/internal/generated/SynthConstructors.qll d8c1962dcb7c6ecfdb15671c34bbb30a139bae017fd3b3186b7df41d02060f7e d8c1962dcb7c6ecfdb15671c34bbb30a139bae017fd3b3186b7df41d02060f7e lib/codeql/rust/elements/internal/generated/Token.qll 77a91a25ca5669703cf3a4353b591cef4d72caa6b0b9db07bb9e005d69c848d1 2fdffc4882ed3a6ca9ac6d1fb5f1ac5a471ca703e2ffdc642885fa558d6e373b -lib/codeql/rust/elements/internal/generated/TokenTree.qll 1a3c4f5f30659738641abdd28cb793dab3cfde484196b59656fc0a2767e53511 de2ebb210c7759ef7a6f7ee9f805e1cac879221287281775fc80ba34a5492edf -lib/codeql/rust/elements/internal/generated/TokenTreeMeta.qll 6952cd186e38c4a41131f93754010c8af3c210324d5a8ce3831694aa6be9f2aa 7a23c380fc8aa02c53370e0c68536a7e9fed8aad58185cb0f6110093c3067543 -lib/codeql/rust/elements/internal/generated/Trait.qll 762d4a2aa0ca2b1384b598201e2964287fce1c0de5475cf493e52de3267a6c55 affd77f6a84c9589c18ae3e3a0e51778e4e9d247f2b9b34761ba7e12502a14b1 -lib/codeql/rust/elements/internal/generated/TryBlockModifier.qll 812cc73a945abaa51054e7261daf4dc10912f1e331f202186001ed087a962696 a76457699f3f6bc1373276a0de2f14365e573d34e82fd292c6c9261612c0f17e -lib/codeql/rust/elements/internal/generated/TryExpr.qll 73052d7d309427a30019ad962ee332d22e7e48b9cc98ee60261ca2df2f433f93 d9dd70bf69eaa22475acd78bea504341e3574742a51ad9118566f39038a02d85 -lib/codeql/rust/elements/internal/generated/TupleExpr.qll 98f10bc72d09f98e3be87f41b1a3cbf037f4a7e3d3560dfa6d5759905a8177a5 6a9eb5568c518876b2912371e2b7b774cf5245097c5a0206eda35b749995f00b -lib/codeql/rust/elements/internal/generated/TupleField.qll b23d90aa02d687d8a2f498fc30d6156f277a08261ae7f790c5ceda059604140c f1f5c7f28334dbd718ae6de27414e01b501dbba0d87c99041cf092a44da243dd -lib/codeql/rust/elements/internal/generated/TupleFieldList.qll e7874518ce353f58312b02fb646f19eb109b3d868f8b550c84b7d6fc3a85fd5a f4bff793bbdbc252688296953116146f5c9a0894e14a7d3e4883a5ac211c122f -lib/codeql/rust/elements/internal/generated/TuplePat.qll 4e13b509e1c9dd1581a9dc50d38e0a6e36abc1254ea9c732b5b3e6503335afeb 298028df9eb84e106e625ed09d6b20038ad47bfc2faf634a0ffea50b17b5805d -lib/codeql/rust/elements/internal/generated/TupleStructPat.qll 6539d0edbdc16e7df849514d51980d4cd1a2c9cbb58ca9e5273851f96df4eb36 45a13bae5220d5737cbd04713a17af5b33d8bb4cfdf17ddd64b298ab0c1eea24 -lib/codeql/rust/elements/internal/generated/TupleTypeRepr.qll 1756cdbad56d634bf4726bc39c768386754e62650492d7d6344012038236a05b 3ac0997a47f95f28cc70c782173ce345fcb5b073be10f3c0b414d1df8443e04c -lib/codeql/rust/elements/internal/generated/TypeAlias.qll 0d0c97d9e9213b8f0390b3456737d4611701a570b9943bb20b348c4efc8e4693 a83c701c0d8914e01517dfa9253a12be962f0a7ed2f75fbaae25a13432db403f -lib/codeql/rust/elements/internal/generated/TypeArg.qll 80245e4b52bef30e5033d4c765c72531324385deea1435dc623290271ff05b1d 097926e918dcd897ea1609010c5490dbf45d4d8f4cffb9166bcadf316a2f1558 -lib/codeql/rust/elements/internal/generated/TypeBound.qll ed27681b76b8f3ad790daad4a08f3bc243452821246bcb240b1d925bc1c362a3 8fdc0caf91f1894d8711d68547185eb029446898b66f60fc0d10ef862cd6292e -lib/codeql/rust/elements/internal/generated/TypeBoundList.qll c5d43dc27075a0d5370ba4bc56b4e247357af5d2989625deff284e7846a3a48b c33c87d080e6eb6df01e98b8b0031d780472fcaf3a1ed156a038669c0e05bf0a +lib/codeql/rust/elements/internal/generated/TokenTree.qll 3d855014747ae2996375f05bdaef1dd07464692ea09f47174a92f705a5ef63bb b85fed50862f97bce98fb4cbd3f275b553ef3e8dedf215915736197078867427 +lib/codeql/rust/elements/internal/generated/TokenTreeMeta.qll 390121812f4f16753747d1eca17580a16385332e49fa93de89a5a5dc029a3a36 fa1e30306690fef85c6f455f4b51b1b14efd046b862e0160b311469da14ac98d +lib/codeql/rust/elements/internal/generated/Trait.qll 4ce3dd41dd591f1b8ec73c7fabc464aa26d1850d24847fc152e482d805cfbdf7 fb84473fe96159770b2761e27a10587ae89fd8e7e19da5f0fefff0391a1d1c33 +lib/codeql/rust/elements/internal/generated/TryBlockModifier.qll d2ddf8ab5b06d2236acbfef8edade7f669f8a01b2fda2b5c7a2a5821f3cf2075 b8e5d3d057d425508dadb6c620b3e09d05ceb36fdf94dc1276157c6d8c5edec6 +lib/codeql/rust/elements/internal/generated/TryExpr.qll b90d93178e699f3fab17c8b3903d508c74e258b6f77907ceb7e3e090033e4614 ef5fa114921add79e3de5372bb507f0686576360df2d7fae138250603a3f3f5b +lib/codeql/rust/elements/internal/generated/TupleExpr.qll f5ad30e21345c8bdf14d79e7a695c2d32299445f334c389b284a7e29d601dd81 c6a6dfb2cd875613a59a674f0d49ec30725f4b1ed47e8a4f4c873316bf497627 +lib/codeql/rust/elements/internal/generated/TupleField.qll a70c620acf097e4e8e46585928d0110203b97f8fa3c0957ba77c90c1f215f747 092a82f13712bead44eb10c411f71e50ef8bbe94fabd98c3b5a304ef307a3572 +lib/codeql/rust/elements/internal/generated/TupleFieldList.qll ef5453baded5c9d7f6f358e096ef0bd67ed3062bdd41e07cbba7495e6f27ea8c e0add270f62a397de4ce53fa207d6ce4e6bbd5229d9cac7ab172b07de1dcba6c +lib/codeql/rust/elements/internal/generated/TuplePat.qll 583d3a449745b81bf1c3c79b85add13067579226b85a7b005561ec55c5ffae8e c454a0b18086c687702d3146776727f15f9c1326c0806d90ff7797d41bc69e75 +lib/codeql/rust/elements/internal/generated/TupleStructPat.qll 6e6f8045b2013a6b219e712e58129568da435a1bc5aee2c937fd25dafb2937b0 6645c8167218f92dec1c8226d631ccf3e8dcab0cc88853f916d2194b9d2fece5 +lib/codeql/rust/elements/internal/generated/TupleTypeRepr.qll f6b0db3882b09b914c98c2c96b249416773bf6509a90028bae14dabc2194ad21 66fd831c7a75fd28cf374d8c89069861b69140baf9c912635a3e18d23c9e8414 +lib/codeql/rust/elements/internal/generated/TypeAlias.qll 35dc8344a7d3e537eeedfcf4f460e7a05b8a8d9295dfad3fd9fcab85441ea5d4 ddd6a3165228896b0c2be5594202eb2139dc849aedb874c0d073b76088d64b1c +lib/codeql/rust/elements/internal/generated/TypeArg.qll 87f9aa99436eacc911d3cd52b3572a940c6fa291ab3e61cc9ef8477546d4caa1 f0a45180180871aa629e81ea63ffaac0966f2f1c333a7e0bac3a6ad043629be8 +lib/codeql/rust/elements/internal/generated/TypeBound.qll 80863e417e974265101a64401e70537c3377b324fb85d0efba6c8bd51b7a5b93 5da768b567e354be82919d213e3d860d06a6ed769d72974259820fccfb09118f +lib/codeql/rust/elements/internal/generated/TypeBoundList.qll 0cf7d3846bfaa69ac905ada2186b7fec25f6736cb823029693ed5b77306fba18 57aaf6ae48e50d61c594896211e3992db8189b924af582c889cabdd60ec968af lib/codeql/rust/elements/internal/generated/TypeItem.qll 940b197a06b11621db980ae8ff8c0c6684cebeff62987ad8267f3838aa768d0a ab0e3b6e23acd1970ea4e2a32bef3cced27072ec9c5d16428626ec2632b33d14 -lib/codeql/rust/elements/internal/generated/TypeParam.qll 81a8d39f1e227de031187534e5d8e2c34f42ad3433061d686cadfbdd0df54285 893795d62b5b89997574e9057701d308bea2c4dca6053042c5308c512137e697 +lib/codeql/rust/elements/internal/generated/TypeParam.qll e658a9eacee28c9e58dff2998fa021997904c5296452839373d658a624adad0d a06f19b90c5a3638eb635f95c37aaba248727f342237fefcf569ed18d0107c5d lib/codeql/rust/elements/internal/generated/TypeRepr.qll 1e7b9d2ddab86e35dad7c31a6453a2a60747420f8bc2e689d5163cab4fec71bb eb80e3947649e511e7f3555ffc1fd87199e7a32624449ca80ffad996cdf9e2f3 -lib/codeql/rust/elements/internal/generated/UnderscoreExpr.qll b3780c99c5d57159bef4c6bd2fd8ec44ebd1854c892c1ca776c740f71249e58c 2fd451cbf0a779e8042e439882e7d9cadc19d1e596df3bbb086d16f2596407c7 +lib/codeql/rust/elements/internal/generated/UnderscoreExpr.qll 79249be8652989a01895218b34cf2805753ccae245ac916d09af5cef4e939f03 721fef3d3c14d56411b0c0fd3ab9eb595469616a9ee17f745f727941f2702d39 lib/codeql/rust/elements/internal/generated/Unextracted.qll 01563dfd769d6dc3c6b8a40d9a4dc0d99a3b6a0c6725c180d2bf4d7633929a17 a93ce90f8c03f4305e59de9c63f089fc7935298fc9a73d091d76933cf63e790c -lib/codeql/rust/elements/internal/generated/Unimplemented.qll a3eb304781991bff1227de1e4422b68bf91e7b344e4f6c9e874b324e82a35e60 6bc4839fda3850a56dc993b79ef9ba921008395c8432b184e14438fba4566f21 -lib/codeql/rust/elements/internal/generated/Union.qll 4df8fc632f7bcc0cbd564cd1c148c1a2438f26e6a83cd6470e15870120f677fe c74dea0a4ddfd581b9208d7907ea134219cafd217294315acf5c595de38a61f3 -lib/codeql/rust/elements/internal/generated/UnsafeMeta.qll ec5515798be2395a1256460d9272fe023bc604d952eba5d18e13d3e43fc801ff 3ece9a326a7c91d49395e3dc6687a38e2e2736cc20e4b7c534eb7a4e73613264 -lib/codeql/rust/elements/internal/generated/Use.qll cf95b5c4756b25bee74113207786e37464ffbc0fb5f776a04c651300afc53753 1fe26b3904db510184cb688cb0eeb0a8dbac7ac15e27a3b572d839743c738393 +lib/codeql/rust/elements/internal/generated/Unimplemented.qll 7f81857a0a4e993697cdb05fa7ef16d041fff9e5ed491e34102b846cfa12434c fba05d2e35cc04ad2fbbf34d92af8db85f5d518dadd0e484bef2f7dde5f8490a +lib/codeql/rust/elements/internal/generated/Union.qll 2cec251e68904ae61058d6812f72b9260339fb7d4937aa689a70010ae998b608 e66511168ea4cd114816e6eb8660fda9482abd7f0b508df69dd5006e89dca50c +lib/codeql/rust/elements/internal/generated/UnsafeMeta.qll 4ae970d7db0093a1ecf82f429cb307b38327b618d3a3eddb70b4ec650d58f6fc 2fb1ceac4b60218e55240d30f1ecaf950a4697b49680b2787618bc5a45530e67 +lib/codeql/rust/elements/internal/generated/Use.qll f05ccfcbd47d0cf413de38610f62fc5a407c45abc6b674deee9a1b9c324c6bb4 a921cbdbd17208b8c442cbd19837c715eb2b471bb8d3c7a7369e20fe48e467b9 lib/codeql/rust/elements/internal/generated/UseBoundGenericArg.qll 69162794e871291545ea04f61259b2d000671a96f7ca129f7dd9ed6e984067c4 31de9ebc0634b38e2347e0608b4ea888892f1f2732a2892464078cd8a07b4ee8 -lib/codeql/rust/elements/internal/generated/UseBoundGenericArgs.qll cedde7ccf689e3a2a246113be94544c206c56fb1c01b83b074e1f6edd3acfced f022ea4c653d1b5f311917efde8e59be27394ce7f6abf2561bb1e42f93f74adf -lib/codeql/rust/elements/internal/generated/UseTree.qll 3d7cbcc8ae76068b8f660c7d5b81b05595026043015cd6b4d42a60ed4c165811 b9f0bcf82feb31f31406e787670fee93e1aa0966bcc0e4cc285c342e88793e4e -lib/codeql/rust/elements/internal/generated/UseTreeList.qll 38efaa569b76ca79be047703279388e8f64583a126b98078fbbb6586e0c6eb56 1623a50fd2d3b1e4b85323ad73dd655172f7cbc658d3506aaa6b409e9ebe576e -lib/codeql/rust/elements/internal/generated/Variant.qll 7a1aedf6518780d1534147d5a52d14542698befe1d8eb8b78eb10d2664c3a69b 180d6de0826b1a75bf8b1853d539f605bff2eb3794ccb57ff23e5b3ee3171956 -lib/codeql/rust/elements/internal/generated/VariantList.qll 3f70bfde982e5c5e8ee45da6ebe149286214f8d40377d5bc5e25df6ae8f3e2d1 22e5f428bf64fd3fd21c537bfa69a46089aad7c363d72c6566474fbe1d75859e -lib/codeql/rust/elements/internal/generated/Visibility.qll c6c3099cb563c010e18012772c57bea636967e30f0f90b026f744441fb4c9263 f0db2927498fd5900eedacaaec5f3f538829c1f46306b593ff95699fa6535f68 -lib/codeql/rust/elements/internal/generated/VisibilityInner.qll 3e853aed43f32e216c67716da5ff4d910e4e48e4f017067a61041ce91a7eee9d 6a3b669762e091c7e12c19a081847475814ce4e7c52fb41ed1786cec36344356 -lib/codeql/rust/elements/internal/generated/WhereClause.qll aec72d358689d99741c769b6e8e72b92c1458138c097ec2380e917aa68119ff0 81bb9d303bc0c8d2513dc7a2b8802ec15345b364e6c1e8b300f7860aac219c36 -lib/codeql/rust/elements/internal/generated/WherePred.qll 73b28efc1682bf527bdc97a07568d08666d61686940400c99095cb9593bc8df3 2ec1fb5577d033c120d31f1620753b3618fcb7f384a35a6d3e6b5e0bb375a8a5 +lib/codeql/rust/elements/internal/generated/UseBoundGenericArgs.qll cdf4253b51aa9fb1639089f73f17640f1732e099644d7e8c5f527b5b04175b52 228df08b8597069d7b11aa6b03b35e0d749d32802eb4d2239ba8dd22def5f0e6 +lib/codeql/rust/elements/internal/generated/UseTree.qll 773abe7dce6d7fd1e7536dd3438eaae5b075576393c9408828277c0cf9f00539 1c22e0473241c3c6b8500568e1970c77e2bbdc6729a1c936e4ac19a27bf0f327 +lib/codeql/rust/elements/internal/generated/UseTreeList.qll c8fa4298bd1dc476a16c8b0c2b043674bde9d7360f53eb8a215170fffd32317b 18aa0c886a1f0d805d9fc1771fe73ff1cf3796183ba1e1f5a9408ae359b556c5 +lib/codeql/rust/elements/internal/generated/Variant.qll eb593c99dbd751a54c615cbf10f0ec1805c1aa7175d565efc586dce1d8c20a10 d9e940e97168b43b8d706ac9fd645b4470f9ee67769eda986eb5bd4742f90de2 +lib/codeql/rust/elements/internal/generated/VariantList.qll 7d5ffa311b62ecd8d263c8dd843d76b5d7f5f306b6702cbc49d574a3af7fdd5b 947abb4cd46ad3265473fcb29287da4782f932ecd571da0170abed63e1b830e0 +lib/codeql/rust/elements/internal/generated/Visibility.qll e87f4eda96727bcdd59a5cb8e0228e8ce3c46b78cdcf3b9e8ba48354848a6814 179ef35379f6b328aae8b570de2fbd1a2cf8888271f3e80c99dda7bd85b5a822 +lib/codeql/rust/elements/internal/generated/VisibilityInner.qll c5117329df3fda9a02095f4084c95a7f8ad68f742ba7ee13d5f06e1abae33fc2 2bde934b77717cd74b59735cbe8f3ae5f700325c3e8176a04d8aabe7548c7ec1 +lib/codeql/rust/elements/internal/generated/WhereClause.qll f1ddc9cee259e4d6d9799e2d72bf2e0acb09926246cdb0d8d1914c0cb907bd71 0924e2b188bb20a652f366fafaa6afc251502a0c2bc048204111ba8e18209cd2 +lib/codeql/rust/elements/internal/generated/WherePred.qll 373edb54ae03834e6f69a0d3ab08a0392ea35bc20012e4df71d29d401ac49c63 15fcae3f3bc4baf3569ee0f361fc6117ce8cb55ed7152f1c04ee67da909dc4ee lib/codeql/rust/elements/internal/generated/WhileExpr.qll 0353aab87c49569e1fbf5828b8f44457230edfa6b408fb5ec70e3d9b70f2e277 e1ba7c9c41ff150b9aaa43642c0714def4407850f2149232260c1a2672dd574a -lib/codeql/rust/elements/internal/generated/WildcardPat.qll d74b70b57a0a66bfae017a329352a5b27a6b9e73dd5521d627f680e810c6c59e 4b913b548ba27ff3c82fcd32cf996ff329cb57d176d3bebd0fcef394486ea499 -lib/codeql/rust/elements/internal/generated/YeetExpr.qll cac328200872a35337b4bcb15c851afb4743f82c080f9738d295571eb01d7392 94af734eea08129b587fed849b643e7572800e8330c0b57d727d41abda47930b -lib/codeql/rust/elements/internal/generated/YieldExpr.qll 37e5f0c1e373a22bbc53d8b7f2c0e1f476e5be5080b8437c5e964f4e83fad79a 4a9a68643401637bf48e5c2b2f74a6bf0ddcb4ff76f6bffb61d436b685621e85 +lib/codeql/rust/elements/internal/generated/WildcardPat.qll 0f85d877252b91a957c813b7ed7cfca1af30c552c89bb3d7df1ce7baa41db065 04134c062894846b43ca8736f782f8b7280e59446e31dacc6e5b858f0307f4ce +lib/codeql/rust/elements/internal/generated/YeetExpr.qll 5f5ec58a77b5036f5c2de0eaf325f6900fb0ee849a6195328ac43a798612fcc6 10a1829f9c99f8c4dcf9bea3208d9ae4c1879ab4294bb721c58f367e8d78a21e +lib/codeql/rust/elements/internal/generated/YieldExpr.qll 3a55be2e767e7d9b017bec36f14b5ad9f1e62b290701ad5dd3a00b2d18ceff56 f3c1f41726538b7b111ba6de3c348f677d0b7595478e17a6697730b97a42b3ae lib/codeql/rust/elements.qll e5ae502dca38c314eb5681d8b80b837cb1b09e59f1ffcccbe1b377658418e496 e5ae502dca38c314eb5681d8b80b837cb1b09e59f1ffcccbe1b377658418e496 test/extractor-tests/generated/Abi/Abi.ql 086ed104ab1a7e7fe5c1ed29e03f1719a797c7096c738868bf6ebe872ab8fdaa fe23fe67ab0d9201e1177ea3f844b18ed428e13e3ce77381bf2b6910adfa3a0e test/extractor-tests/generated/ArgList/ArgList.ql da97b5b25418b2aa8cb8df793f48870c89fa00759cdade8ddba60d7f1f4bbc01 acfd5d2caf67282ad2d57b961068472100482d0f770a52a3c00214c647d18c75 diff --git a/rust/ql/.gitattributes b/rust/ql/.gitattributes index 34bded4d4de9..a37af330c5d6 100644 --- a/rust/ql/.gitattributes +++ b/rust/ql/.gitattributes @@ -206,27 +206,46 @@ /lib/codeql/rust/elements/YeetExpr.qll linguist-generated /lib/codeql/rust/elements/YieldExpr.qll linguist-generated /lib/codeql/rust/elements/internal/AbiConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/AbiImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ArgListConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/ArgListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ArrayExprInternal.qll linguist-generated /lib/codeql/rust/elements/internal/ArrayExprInternalConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/ArrayExprInternalImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ArrayTypeReprConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/ArrayTypeReprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AsmClobberAbiConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/AsmClobberAbiImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AsmConstConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/AsmConstImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AsmDirSpecConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/AsmDirSpecImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AsmExprConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/AsmExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AsmLabelConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/AsmLabelImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AsmOperandExprConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/AsmOperandExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AsmOperandImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AsmOperandNamedConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/AsmOperandNamedImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AsmOptionConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/AsmOptionImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AsmOptionsListConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/AsmOptionsListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AsmPieceImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AsmRegOperandConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/AsmRegOperandImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AsmRegSpecConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/AsmRegSpecImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AsmSymConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/AsmSymImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AssocItemListConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/AssocItemListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AssocTypeArgConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/AssocTypeArgImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AttrConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/AttrImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AwaitExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/BecomeExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/BinaryExprConstructor.qll linguist-generated @@ -236,36 +255,51 @@ /lib/codeql/rust/elements/internal/CallExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/CastExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/CfgAtomConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/CfgAtomImpl.qll linguist-generated /lib/codeql/rust/elements/internal/CfgAttrMetaConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/CfgAttrMetaImpl.qll linguist-generated /lib/codeql/rust/elements/internal/CfgCompositeConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/CfgCompositeImpl.qll linguist-generated /lib/codeql/rust/elements/internal/CfgMetaConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/CfgMetaImpl.qll linguist-generated /lib/codeql/rust/elements/internal/CfgPredicateImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ClosureExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/CommentConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ConstArgConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/ConstArgImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ConstBlockPatConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/ConstBlockPatImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ConstConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ConstParamConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/ConstParamImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ContinueExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/CrateConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/DerefPatConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/DerefPatImpl.qll linguist-generated /lib/codeql/rust/elements/internal/DynTraitTypeReprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/EnumConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ExprStmtConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/ExprStmtImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ExternBlockConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/ExternBlockImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ExternCrateConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/ExternCrateImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ExternItemImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ExternItemListConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/ExternItemListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ExtractorStep.qll linguist-generated /lib/codeql/rust/elements/internal/ExtractorStepConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/FieldExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/FieldListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/FnPtrTypeReprConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/FnPtrTypeReprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ForBinderConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ForExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ForTypeReprConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/ForTypeReprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/FormatArgsArgConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/FormatArgsArgImpl.qll linguist-generated /lib/codeql/rust/elements/internal/FormatArgsExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/FunctionConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/GenericArgImpl.qll linguist-generated @@ -276,46 +310,64 @@ /lib/codeql/rust/elements/internal/IfExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ImplConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ImplRestrictionConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/ImplRestrictionImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ImplTraitTypeReprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/IncludeBytesExprConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/IncludeBytesExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/IndexExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/InferTypeReprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ItemListConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/ItemListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/KeyValueMetaConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/KeyValueMetaImpl.qll linguist-generated /lib/codeql/rust/elements/internal/LabelConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/LetElseConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/LetExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/LetStmtConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/LifetimeArgConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/LifetimeArgImpl.qll linguist-generated /lib/codeql/rust/elements/internal/LifetimeConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/LifetimeParamConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/LifetimeParamImpl.qll linguist-generated /lib/codeql/rust/elements/internal/LiteralExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/LiteralPatConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/LoopExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/LoopingExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/MacroCallConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/MacroDefConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/MacroDefImpl.qll linguist-generated /lib/codeql/rust/elements/internal/MacroExprConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/MacroExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/MacroItemsConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/MacroItemsImpl.qll linguist-generated /lib/codeql/rust/elements/internal/MacroPatConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/MacroPatImpl.qll linguist-generated /lib/codeql/rust/elements/internal/MacroRulesConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/MacroRulesImpl.qll linguist-generated /lib/codeql/rust/elements/internal/MacroTypeReprConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/MacroTypeReprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/MatchArmConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/MatchArmListConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/MatchArmListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/MatchExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/MatchGuardConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/MatchGuardImpl.qll linguist-generated /lib/codeql/rust/elements/internal/MethodCallExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/MissingConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/MissingImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ModuleConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/MutRestrictionConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/MutRestrictionImpl.qll linguist-generated /lib/codeql/rust/elements/internal/NameConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/NameRefConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/NamedCrate.qll linguist-generated /lib/codeql/rust/elements/internal/NamedCrateConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/NamedCrateImpl.qll linguist-generated /lib/codeql/rust/elements/internal/NeverTypeReprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/NotNullConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/NotNullImpl.qll linguist-generated /lib/codeql/rust/elements/internal/OffsetOfExprConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/OffsetOfExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/OrPatConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ParamConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ParamListConstructor.qll linguist-generated @@ -323,31 +375,44 @@ /lib/codeql/rust/elements/internal/ParenPatConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ParenTypeReprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ParenthesizedArgListConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/ParenthesizedArgListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/PathAstNodeImpl.qll linguist-generated /lib/codeql/rust/elements/internal/PathConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/PathExprBaseImpl.qll linguist-generated /lib/codeql/rust/elements/internal/PathExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/PathMetaConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/PathMetaImpl.qll linguist-generated /lib/codeql/rust/elements/internal/PathPatConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/PathSegmentConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/PathTypeReprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/PatternTypeReprConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/PatternTypeReprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/PrefixExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/PtrTypeReprConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/PtrTypeReprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/RangeExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/RangePatConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/RangePatImpl.qll linguist-generated /lib/codeql/rust/elements/internal/RefExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/RefPatConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/RefTypeReprConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/RefTypeReprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/RenameConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/RenameImpl.qll linguist-generated /lib/codeql/rust/elements/internal/RestPatConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/RetTypeReprConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/RetTypeReprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ReturnExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ReturnTypeSyntaxConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/ReturnTypeSyntaxImpl.qll linguist-generated /lib/codeql/rust/elements/internal/SelfParamConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/SelfParamImpl.qll linguist-generated /lib/codeql/rust/elements/internal/SlicePatConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/SlicePatImpl.qll linguist-generated /lib/codeql/rust/elements/internal/SliceTypeReprConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/SliceTypeReprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/SourceFileConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/SourceFileImpl.qll linguist-generated /lib/codeql/rust/elements/internal/StaticConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/StmtImpl.qll linguist-generated /lib/codeql/rust/elements/internal/StmtListConstructor.qll linguist-generated @@ -355,25 +420,36 @@ /lib/codeql/rust/elements/internal/StructExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/StructExprFieldConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/StructExprFieldListConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/StructExprFieldListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/StructFieldConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/StructFieldListConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/StructFieldListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/StructPatConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/StructPatFieldConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/StructPatFieldListConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/StructPatFieldListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TokenImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TokenTreeConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/TokenTreeImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TokenTreeMetaConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/TokenTreeMetaImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TraitConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/TryBlockModifierConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/TryBlockModifierImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TryExprConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/TryExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TupleExprConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/TupleExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TupleFieldConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/TupleFieldListConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/TupleFieldListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TuplePatConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/TupleStructPatConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/TupleTypeReprConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/TupleTypeReprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TypeAliasConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/TypeArgConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/TypeArgImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TypeBoundConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/TypeBoundListConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/TypeItemImpl.qll linguist-generated @@ -385,21 +461,30 @@ /lib/codeql/rust/elements/internal/UnimplementedImpl.qll linguist-generated /lib/codeql/rust/elements/internal/UnionConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/UnsafeMetaConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/UnsafeMetaImpl.qll linguist-generated /lib/codeql/rust/elements/internal/UseBoundGenericArgImpl.qll linguist-generated /lib/codeql/rust/elements/internal/UseBoundGenericArgsConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/UseBoundGenericArgsImpl.qll linguist-generated /lib/codeql/rust/elements/internal/UseConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/UseTreeConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/UseTreeListConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/UseTreeListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/VariantConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/VariantListConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/VariantListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/VisibilityConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/VisibilityInnerConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/VisibilityInnerImpl.qll linguist-generated /lib/codeql/rust/elements/internal/WhereClauseConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/WhereClauseImpl.qll linguist-generated /lib/codeql/rust/elements/internal/WherePredConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/WherePredImpl.qll linguist-generated /lib/codeql/rust/elements/internal/WhileExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/WildcardPatConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/YeetExprConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/YeetExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/YieldExprConstructor.qll linguist-generated +/lib/codeql/rust/elements/internal/YieldExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/generated/Abi.qll linguist-generated /lib/codeql/rust/elements/internal/generated/Addressable.qll linguist-generated /lib/codeql/rust/elements/internal/generated/ArgList.qll linguist-generated diff --git a/rust/ql/lib/codeql/rust/elements/internal/AbiImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AbiImpl.qll index adc08fc02304..2534d71e610c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AbiImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AbiImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `Abi`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.Abi * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An ABI specification for an extern function or block. * @@ -21,7 +21,5 @@ module Impl { * // ^^^ * ``` */ - class Abi extends Generated::Abi { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class Abi extends Generated::Abi { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ArgListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ArgListImpl.qll index 1816402bf14e..f5fd9a066a78 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ArgListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ArgListImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ArgList`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.ArgList * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A list of arguments in a function or method call. * @@ -21,7 +21,5 @@ module Impl { * // ^^^^^^^^^ * ``` */ - class ArgList extends Generated::ArgList { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class ArgList extends Generated::ArgList { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ArrayExprInternalImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ArrayExprInternalImpl.qll index 174417b1dab1..df972e84525d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ArrayExprInternalImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ArrayExprInternalImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ArrayExprInternal`. * @@ -11,7 +12,5 @@ private import codeql.rust.elements.internal.generated.ArrayExprInternal * be referenced directly. */ module Impl { - class ArrayExprInternal extends Generated::ArrayExprInternal { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class ArrayExprInternal extends Generated::ArrayExprInternal { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ArrayTypeReprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ArrayTypeReprImpl.qll index 76f2748ee40b..cb72de9b87eb 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ArrayTypeReprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ArrayTypeReprImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ArrayTypeRepr`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.ArrayTypeRepr * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An array type representation. * @@ -21,7 +21,5 @@ module Impl { * // ^^^^^^^^ * ``` */ - class ArrayTypeRepr extends Generated::ArrayTypeRepr { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class ArrayTypeRepr extends Generated::ArrayTypeRepr { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/AsmClobberAbiImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AsmClobberAbiImpl.qll index 3b0e4bb2917d..aa8a49e0fa24 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AsmClobberAbiImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AsmClobberAbiImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `AsmClobberAbi`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.AsmClobberAbi * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A clobbered ABI in an inline assembly block. * @@ -22,7 +22,5 @@ module Impl { * // ^^^^^^^^^^^^^^^^ * ``` */ - class AsmClobberAbi extends Generated::AsmClobberAbi { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class AsmClobberAbi extends Generated::AsmClobberAbi { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/AsmConstImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AsmConstImpl.qll index d753838d8135..2c66fc52a3fc 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AsmConstImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AsmConstImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `AsmConst`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.AsmConst * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A constant operand in an inline assembly block. * @@ -22,7 +22,5 @@ module Impl { * // ^^^^^^^ * ``` */ - class AsmConst extends Generated::AsmConst { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class AsmConst extends Generated::AsmConst { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/AsmDirSpecImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AsmDirSpecImpl.qll index 379d1aba0426..d9c284eca28c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AsmDirSpecImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AsmDirSpecImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `AsmDirSpec`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.AsmDirSpec * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An inline assembly direction specifier. * @@ -22,7 +22,5 @@ module Impl { * // ^^^ ^^ * ``` */ - class AsmDirSpec extends Generated::AsmDirSpec { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class AsmDirSpec extends Generated::AsmDirSpec { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/AsmExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AsmExprImpl.qll index 1f281d87c3d5..338f4772a53e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AsmExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AsmExprImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `AsmExpr`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.AsmExpr * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An inline assembly expression. For example: * ```rust @@ -21,7 +21,5 @@ module Impl { * } * ``` */ - class AsmExpr extends Generated::AsmExpr { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class AsmExpr extends Generated::AsmExpr { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/AsmLabelImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AsmLabelImpl.qll index bc681076f5db..ee89b6cb27d5 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AsmLabelImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AsmLabelImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `AsmLabel`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.AsmLabel * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A label in an inline assembly block. * @@ -25,7 +25,5 @@ module Impl { * ); * ``` */ - class AsmLabel extends Generated::AsmLabel { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class AsmLabel extends Generated::AsmLabel { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/AsmOperandExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AsmOperandExprImpl.qll index a3295686857a..ee0db41767aa 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AsmOperandExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AsmOperandExprImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `AsmOperandExpr`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.AsmOperandExpr * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An operand expression in an inline assembly block. * @@ -22,7 +22,5 @@ module Impl { * // ^ ^ * ``` */ - class AsmOperandExpr extends Generated::AsmOperandExpr { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class AsmOperandExpr extends Generated::AsmOperandExpr { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/AsmOperandNamedImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AsmOperandNamedImpl.qll index 522ce7ed07ce..dd45bcc05a9a 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AsmOperandNamedImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AsmOperandNamedImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `AsmOperandNamed`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.AsmOperandNamed * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A named operand in an inline assembly block. * @@ -22,7 +22,5 @@ module Impl { * // ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^ * ``` */ - class AsmOperandNamed extends Generated::AsmOperandNamed { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class AsmOperandNamed extends Generated::AsmOperandNamed { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/AsmOptionImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AsmOptionImpl.qll index 10973c0e0d0d..60d56d225810 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AsmOptionImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AsmOptionImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `AsmOption`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.AsmOption * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An option in an inline assembly block. * @@ -22,7 +22,5 @@ module Impl { * // ^^^^^^^^^^^^^^^^ * ``` */ - class AsmOption extends Generated::AsmOption { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class AsmOption extends Generated::AsmOption { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/AsmOptionsListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AsmOptionsListImpl.qll index 47ef16b26a06..ca8e80f82ecc 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AsmOptionsListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AsmOptionsListImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `AsmOptionsList`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.AsmOptionsList * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A list of options in an inline assembly block. * @@ -22,7 +22,5 @@ module Impl { * // ^^^^^^^^^^^^^^^^ * ``` */ - class AsmOptionsList extends Generated::AsmOptionsList { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class AsmOptionsList extends Generated::AsmOptionsList { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/AsmRegOperandImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AsmRegOperandImpl.qll index 810b37964e73..d3d6b24c15a3 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AsmRegOperandImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AsmRegOperandImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `AsmRegOperand`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.AsmRegOperand * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A register operand in an inline assembly block. * @@ -22,7 +22,5 @@ module Impl { * // ^ ^ * ``` */ - class AsmRegOperand extends Generated::AsmRegOperand { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class AsmRegOperand extends Generated::AsmRegOperand { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/AsmRegSpecImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AsmRegSpecImpl.qll index 563bdc80fe82..24798bae93c8 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AsmRegSpecImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AsmRegSpecImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `AsmRegSpec`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.AsmRegSpec * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A register specification in an inline assembly block. * @@ -22,7 +22,5 @@ module Impl { * // ^^^ ^^^ * ``` */ - class AsmRegSpec extends Generated::AsmRegSpec { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class AsmRegSpec extends Generated::AsmRegSpec { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/AsmSymImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AsmSymImpl.qll index c7d25e88a974..ad118f38d1c5 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AsmSymImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AsmSymImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `AsmSym`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.AsmSym * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A symbol operand in an inline assembly block. * @@ -22,7 +22,5 @@ module Impl { * // ^^^^^^^^^^^^^^^^^^^^^^ * ``` */ - class AsmSym extends Generated::AsmSym { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class AsmSym extends Generated::AsmSym { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/AssocItemListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AssocItemListImpl.qll index 6b492d9db722..f68c9e5fbe3f 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AssocItemListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AssocItemListImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `AssocItemList`. * @@ -11,11 +12,8 @@ private import codeql.rust.elements.internal.generated.AssocItemList * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A list of `AssocItem` elements, as appearing in a `Trait` or `Impl`. */ - class AssocItemList extends Generated::AssocItemList { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class AssocItemList extends Generated::AssocItemList { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/AssocTypeArgImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AssocTypeArgImpl.qll index aa0c222f3b62..fab477d4c3f6 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AssocTypeArgImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AssocTypeArgImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `AssocTypeArg`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.AssocTypeArg * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An associated type argument in a path. * @@ -26,7 +26,5 @@ module Impl { * } * ``` */ - class AssocTypeArg extends Generated::AssocTypeArg { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class AssocTypeArg extends Generated::AssocTypeArg { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/AttrImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AttrImpl.qll index dc948c3f9007..e01d3c3652e4 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AttrImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AttrImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `Attr`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.Attr * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An attribute applied to an item. * @@ -22,7 +22,5 @@ module Impl { * struct S; * ``` */ - class Attr extends Generated::Attr { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class Attr extends Generated::Attr { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/CfgAtomImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/CfgAtomImpl.qll index 6a66a0efcc74..6f1515cb7d1b 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/CfgAtomImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/CfgAtomImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `CfgAtom`. * @@ -11,7 +12,5 @@ private import codeql.rust.elements.internal.generated.CfgAtom * be referenced directly. */ module Impl { - class CfgAtom extends Generated::CfgAtom { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class CfgAtom extends Generated::CfgAtom { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/CfgAttrMetaImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/CfgAttrMetaImpl.qll index f9c79f2e4939..5e189d4126de 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/CfgAttrMetaImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/CfgAttrMetaImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `CfgAttrMeta`. * @@ -11,7 +12,5 @@ private import codeql.rust.elements.internal.generated.CfgAttrMeta * be referenced directly. */ module Impl { - class CfgAttrMeta extends Generated::CfgAttrMeta { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class CfgAttrMeta extends Generated::CfgAttrMeta { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/CfgCompositeImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/CfgCompositeImpl.qll index 7dba801a875a..58c9a10af763 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/CfgCompositeImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/CfgCompositeImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `CfgComposite`. * @@ -11,7 +12,5 @@ private import codeql.rust.elements.internal.generated.CfgComposite * be referenced directly. */ module Impl { - class CfgComposite extends Generated::CfgComposite { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class CfgComposite extends Generated::CfgComposite { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/CfgMetaImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/CfgMetaImpl.qll index 6f1fc84e4ba4..f3c75352121e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/CfgMetaImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/CfgMetaImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `CfgMeta`. * @@ -11,7 +12,5 @@ private import codeql.rust.elements.internal.generated.CfgMeta * be referenced directly. */ module Impl { - class CfgMeta extends Generated::CfgMeta { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class CfgMeta extends Generated::CfgMeta { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ConstArgImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ConstArgImpl.qll index 90276ee6f06e..7a5a78df17cc 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ConstArgImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ConstArgImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ConstArg`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.ConstArg * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A constant argument in a generic argument list. * @@ -21,7 +21,5 @@ module Impl { * // ^ * ``` */ - class ConstArg extends Generated::ConstArg { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class ConstArg extends Generated::ConstArg { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ConstBlockPatImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ConstBlockPatImpl.qll index 52a9090dbaaa..7d823a729568 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ConstBlockPatImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ConstBlockPatImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ConstBlockPat`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.ConstBlockPat * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A const block pattern. For example: * ```rust @@ -21,7 +21,5 @@ module Impl { * }; * ``` */ - class ConstBlockPat extends Generated::ConstBlockPat { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class ConstBlockPat extends Generated::ConstBlockPat { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ConstParamImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ConstParamImpl.qll index 7e41ee37e5f1..e4ff7186254f 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ConstParamImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ConstParamImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ConstParam`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.ConstParam * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A constant parameter in a generic parameter list. * @@ -21,7 +21,5 @@ module Impl { * // ^^^^^^^^^^^^^^ * ``` */ - class ConstParam extends Generated::ConstParam { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class ConstParam extends Generated::ConstParam { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/DerefPatImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/DerefPatImpl.qll index 664af10393dd..ec44a20c2b5e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/DerefPatImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/DerefPatImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `DerefPat`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.DerefPat * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A deref pattern, matching the value behind a smart pointer. This is an experimental * Rust feature that cannot be written directly in stable Rust; the example below uses @@ -23,7 +23,5 @@ module Impl { * }; * ``` */ - class DerefPat extends Generated::DerefPat { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class DerefPat extends Generated::DerefPat { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/DynTraitTypeReprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/DynTraitTypeReprImpl.qll index 91f09efab90b..53e46a5f65a7 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/DynTraitTypeReprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/DynTraitTypeReprImpl.qll @@ -25,8 +25,6 @@ module Impl { * ``` */ class DynTraitTypeRepr extends Generated::DynTraitTypeRepr { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** Gets the trait that this trait object refers to. */ pragma[nomagic] Trait getTrait() { diff --git a/rust/ql/lib/codeql/rust/elements/internal/ExprStmtImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ExprStmtImpl.qll index 0652b7d9090d..1f36bd00db7e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ExprStmtImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ExprStmtImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ExprStmt`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.ExprStmt * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An expression statement. For example: * ```rust @@ -20,7 +20,5 @@ module Impl { * use std::env; * ``` */ - class ExprStmt extends Generated::ExprStmt { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class ExprStmt extends Generated::ExprStmt { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ExternBlockImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ExternBlockImpl.qll index 2c584f6d79fd..bb60d9c6e660 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ExternBlockImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ExternBlockImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ExternBlock`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.ExternBlock * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An extern block containing foreign function declarations. * @@ -22,7 +22,5 @@ module Impl { * } * ``` */ - class ExternBlock extends Generated::ExternBlock { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class ExternBlock extends Generated::ExternBlock { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ExternCrateImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ExternCrateImpl.qll index a7e128571a03..af9e4005b196 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ExternCrateImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ExternCrateImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ExternCrate`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.ExternCrate * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An extern crate declaration. * @@ -20,7 +20,5 @@ module Impl { * extern crate serde; * ``` */ - class ExternCrate extends Generated::ExternCrate { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class ExternCrate extends Generated::ExternCrate { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ExternItemListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ExternItemListImpl.qll index 0a787d6ff08b..f2281c5f6d87 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ExternItemListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ExternItemListImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ExternItemList`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.ExternItemList * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A list of items inside an extern block. * @@ -23,7 +23,5 @@ module Impl { * } * ``` */ - class ExternItemList extends Generated::ExternItemList { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class ExternItemList extends Generated::ExternItemList { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/FnPtrTypeReprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/FnPtrTypeReprImpl.qll index e39ac8ad523e..41d1151ac362 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/FnPtrTypeReprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/FnPtrTypeReprImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `FnPtrTypeRepr`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.FnPtrTypeRepr * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A function pointer type. * @@ -21,7 +21,5 @@ module Impl { * // ^^^^^^^^^^^^^^ * ``` */ - class FnPtrTypeRepr extends Generated::FnPtrTypeRepr { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class FnPtrTypeRepr extends Generated::FnPtrTypeRepr { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ForTypeReprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ForTypeReprImpl.qll index 9220b6210dc1..409c0d94c94f 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ForTypeReprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ForTypeReprImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ForTypeRepr`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.ForTypeRepr * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A function pointer type with a `for` modifier. * @@ -21,7 +21,5 @@ module Impl { * // ^^^^^^^^^^^^^^^^^^^^^^^^^^ * ``` */ - class ForTypeRepr extends Generated::ForTypeRepr { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class ForTypeRepr extends Generated::ForTypeRepr { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/FormatArgsArgImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/FormatArgsArgImpl.qll index d82d243662e5..c7fa88b51b0b 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/FormatArgsArgImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/FormatArgsArgImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `FormatArgsArg`. * @@ -11,14 +12,11 @@ private import codeql.rust.elements.internal.generated.FormatArgsArg * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A FormatArgsArg. For example the `"world"` in: * ```rust * format_args!("Hello, {}!", "world") * ``` */ - class FormatArgsArg extends Generated::FormatArgsArg { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class FormatArgsArg extends Generated::FormatArgsArg { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/FormatArgsExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/FormatArgsExprImpl.qll index da91d724db3c..6cc3aa114616 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/FormatArgsExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/FormatArgsExprImpl.qll @@ -24,8 +24,6 @@ module Impl { * ``` */ class FormatArgsExpr extends Generated::FormatArgsExpr { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - override Format getFormat(int index) { result = rank[index + 1](Format f, int i | f.getParent() = this and f.getIndex() = i | f order by i) diff --git a/rust/ql/lib/codeql/rust/elements/internal/ImplRestrictionImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ImplRestrictionImpl.qll index 45fe45f45d4e..7240c6a6bcea 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ImplRestrictionImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ImplRestrictionImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ImplRestriction`. * @@ -11,11 +12,8 @@ private import codeql.rust.elements.internal.generated.ImplRestriction * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An implementation restriction, limiting where a trait can be implemented. For example the `impl(crate)` restriction (an unstable feature). */ - class ImplRestriction extends Generated::ImplRestriction { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class ImplRestriction extends Generated::ImplRestriction { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/IncludeBytesExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/IncludeBytesExprImpl.qll index 985fdf310d38..750abcb2f098 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/IncludeBytesExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/IncludeBytesExprImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `IncludeBytesExpr`. * @@ -11,14 +12,11 @@ private import codeql.rust.elements.internal.generated.IncludeBytesExpr * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An expression produced by the built-in `include_bytes!` macro, embedding the contents of a file as a byte array. For example: * ```rust * let data = include_bytes!("data.bin"); * ``` */ - class IncludeBytesExpr extends Generated::IncludeBytesExpr { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class IncludeBytesExpr extends Generated::IncludeBytesExpr { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ItemListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ItemListImpl.qll index 65dda52be4e1..2d94e6340dd2 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ItemListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ItemListImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ItemList`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.ItemList * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A list of items in a module or block. * @@ -23,7 +23,5 @@ module Impl { * } * ``` */ - class ItemList extends Generated::ItemList { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class ItemList extends Generated::ItemList { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/KeyValueMetaImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/KeyValueMetaImpl.qll index 3d22c12e1aa1..ac3befd85b60 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/KeyValueMetaImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/KeyValueMetaImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `KeyValueMeta`. * @@ -11,7 +12,5 @@ private import codeql.rust.elements.internal.generated.KeyValueMeta * be referenced directly. */ module Impl { - class KeyValueMeta extends Generated::KeyValueMeta { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class KeyValueMeta extends Generated::KeyValueMeta { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/LifetimeArgImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/LifetimeArgImpl.qll index 5c8dd4d6c3cd..db3bd53c8935 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/LifetimeArgImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/LifetimeArgImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `LifetimeArg`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.LifetimeArg * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A lifetime argument in a generic argument list. * @@ -21,7 +21,5 @@ module Impl { * // ^^ * ``` */ - class LifetimeArg extends Generated::LifetimeArg { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class LifetimeArg extends Generated::LifetimeArg { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/LifetimeParamImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/LifetimeParamImpl.qll index 8baf08712052..7db6c5bcb69f 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/LifetimeParamImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/LifetimeParamImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `LifetimeParam`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.LifetimeParam * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A lifetime parameter in a generic parameter list. * @@ -21,7 +21,5 @@ module Impl { * // ^^ * ``` */ - class LifetimeParam extends Generated::LifetimeParam { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class LifetimeParam extends Generated::LifetimeParam { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/MacroDefImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/MacroDefImpl.qll index b46d73ce2a17..90cdfd533c6a 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/MacroDefImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/MacroDefImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `MacroDef`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.MacroDef * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A Rust 2.0 style declarative macro definition. * @@ -22,7 +22,5 @@ module Impl { * } * ``` */ - class MacroDef extends Generated::MacroDef { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class MacroDef extends Generated::MacroDef { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/MacroExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/MacroExprImpl.qll index d4e18b6c00fa..2dfb6e445ac4 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/MacroExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/MacroExprImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `MacroExpr`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.MacroExpr * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A macro expression, representing the invocation of a macro that produces an expression. * @@ -20,7 +20,5 @@ module Impl { * let y = vec![1, 2, 3]; * ``` */ - class MacroExpr extends Generated::MacroExpr { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class MacroExpr extends Generated::MacroExpr { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/MacroItemsImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/MacroItemsImpl.qll index c41836fbdcf4..0efb96554a47 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/MacroItemsImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/MacroItemsImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `MacroItems`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.MacroItems * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A sequence of items generated by a macro. For example: * ```rust @@ -28,7 +28,5 @@ module Impl { * } * ``` */ - class MacroItems extends Generated::MacroItems { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class MacroItems extends Generated::MacroItems { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/MacroPatImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/MacroPatImpl.qll index 8a990bb2bb46..166b105ab959 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/MacroPatImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/MacroPatImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `MacroPat`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.MacroPat * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A macro pattern, representing the invocation of a macro that produces a pattern. * @@ -29,7 +29,5 @@ module Impl { * } * ``` */ - class MacroPat extends Generated::MacroPat { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class MacroPat extends Generated::MacroPat { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/MacroRulesImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/MacroRulesImpl.qll index 0999afac1682..5d5b45ea84f6 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/MacroRulesImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/MacroRulesImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `MacroRules`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.MacroRules * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A macro definition using the `macro_rules!` syntax. * ```rust @@ -22,7 +22,5 @@ module Impl { * } * ``` */ - class MacroRules extends Generated::MacroRules { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class MacroRules extends Generated::MacroRules { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/MacroTypeReprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/MacroTypeReprImpl.qll index 40bb3a3b57cc..87801fe58770 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/MacroTypeReprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/MacroTypeReprImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `MacroTypeRepr`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.MacroTypeRepr * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A type produced by a macro. * @@ -24,7 +24,5 @@ module Impl { * // ^^^^^^^^^^^^^ * ``` */ - class MacroTypeRepr extends Generated::MacroTypeRepr { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class MacroTypeRepr extends Generated::MacroTypeRepr { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/MatchArmListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/MatchArmListImpl.qll index 7e8b1b521679..6f77dc0b42fc 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/MatchArmListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/MatchArmListImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `MatchArmList`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.MatchArmList * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A list of arms in a match expression. * @@ -25,7 +25,5 @@ module Impl { * // ^^^^^^^^^^^ * ``` */ - class MatchArmList extends Generated::MatchArmList { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class MatchArmList extends Generated::MatchArmList { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/MatchGuardImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/MatchGuardImpl.qll index 5ef7a203694b..495fcc88ef65 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/MatchGuardImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/MatchGuardImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `MatchGuard`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.MatchGuard * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A guard condition in a match arm. * @@ -24,7 +24,5 @@ module Impl { * } * ``` */ - class MatchGuard extends Generated::MatchGuard { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class MatchGuard extends Generated::MatchGuard { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/MutRestrictionImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/MutRestrictionImpl.qll index cec0128f8c93..6d8722a09e6c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/MutRestrictionImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/MutRestrictionImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `MutRestriction`. * @@ -11,11 +12,8 @@ private import codeql.rust.elements.internal.generated.MutRestriction * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A mutability restriction, limiting where a field can be mutated. For example the `mut(crate)` restriction (an unstable feature). */ - class MutRestriction extends Generated::MutRestriction { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class MutRestriction extends Generated::MutRestriction { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/NamedCrateImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/NamedCrateImpl.qll index ccaca9d83943..2dafd18c22b7 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/NamedCrateImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/NamedCrateImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `NamedCrate`. * @@ -11,7 +12,5 @@ private import codeql.rust.elements.internal.generated.NamedCrate * be referenced directly. */ module Impl { - class NamedCrate extends Generated::NamedCrate { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class NamedCrate extends Generated::NamedCrate { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/NotNullImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/NotNullImpl.qll index c5c0b9f617ca..19365f23a2d5 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/NotNullImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/NotNullImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `NotNull`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.NotNull * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * The `!null` pattern used in a pattern type to denote a non-null value. Pattern types * are an experimental, mostly compiler-internal feature (used in the standard library for @@ -21,7 +21,5 @@ module Impl { * type NonNull = builtin#pattern_type(*const () is !null); * ``` */ - class NotNull extends Generated::NotNull { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class NotNull extends Generated::NotNull { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/OffsetOfExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/OffsetOfExprImpl.qll index 0482b91843fe..53a0c2e06dc7 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/OffsetOfExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/OffsetOfExprImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `OffsetOfExpr`. * @@ -11,14 +12,11 @@ private import codeql.rust.elements.internal.generated.OffsetOfExpr * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An `offset_of` expression. For example: * ```rust * builtin # offset_of(Struct, field); * ``` */ - class OffsetOfExpr extends Generated::OffsetOfExpr { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class OffsetOfExpr extends Generated::OffsetOfExpr { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ParamListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ParamListImpl.qll index ca9f28f4eaa2..c0b914c1e3ca 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ParamListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ParamListImpl.qll @@ -22,8 +22,6 @@ module Impl { * ``` */ class ParamList extends Generated::ParamList { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets any of the parameters of this parameter list. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/ParenthesizedArgListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ParenthesizedArgListImpl.qll index dbb28970be10..b6b41caea7a5 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ParenthesizedArgListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ParenthesizedArgListImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ParenthesizedArgList`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.ParenthesizedArgList * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A parenthesized argument list as used in function traits. * @@ -26,7 +26,5 @@ module Impl { * } * ``` */ - class ParenthesizedArgList extends Generated::ParenthesizedArgList { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class ParenthesizedArgList extends Generated::ParenthesizedArgList { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/PathMetaImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/PathMetaImpl.qll index 6e0db162f786..fd58653419e7 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/PathMetaImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/PathMetaImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `PathMeta`. * @@ -11,7 +12,5 @@ private import codeql.rust.elements.internal.generated.PathMeta * be referenced directly. */ module Impl { - class PathMeta extends Generated::PathMeta { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class PathMeta extends Generated::PathMeta { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/PatternTypeReprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/PatternTypeReprImpl.qll index c9b0951a2ffe..16cb9358ebae 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/PatternTypeReprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/PatternTypeReprImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `PatternTypeRepr`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.PatternTypeRepr * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A pattern type, constraining a type to values matching a pattern. Pattern types are an * experimental, mostly compiler-internal feature and cannot be written directly in stable @@ -20,7 +20,5 @@ module Impl { * type NonZero = builtin#pattern_type(u32 is 1..); * ``` */ - class PatternTypeRepr extends Generated::PatternTypeRepr { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class PatternTypeRepr extends Generated::PatternTypeRepr { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/PtrTypeReprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/PtrTypeReprImpl.qll index ca18cb6c862d..3e8c80ba0ea4 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/PtrTypeReprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/PtrTypeReprImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `PtrTypeRepr`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.PtrTypeRepr * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A pointer type. * @@ -22,7 +22,5 @@ module Impl { * // ^^^^^^^^^ * ``` */ - class PtrTypeRepr extends Generated::PtrTypeRepr { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class PtrTypeRepr extends Generated::PtrTypeRepr { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/RangePatImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/RangePatImpl.qll index 38935f9ca9ad..dc88a8070a5a 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/RangePatImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/RangePatImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `RangePat`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.RangePat * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A range pattern. For example: * ```rust @@ -22,7 +22,5 @@ module Impl { * } * ``` */ - class RangePat extends Generated::RangePat { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class RangePat extends Generated::RangePat { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/RefTypeReprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/RefTypeReprImpl.qll index a3014bfc6cad..334d223a42cf 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/RefTypeReprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/RefTypeReprImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `RefTypeRepr`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.RefTypeRepr * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A reference type. * @@ -22,7 +22,5 @@ module Impl { * // ^^^^^^^^ * ``` */ - class RefTypeRepr extends Generated::RefTypeRepr { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class RefTypeRepr extends Generated::RefTypeRepr { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/RenameImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/RenameImpl.qll index 88f9e13a7f5d..1788cf98c254 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/RenameImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/RenameImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `Rename`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.Rename * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A rename in a use declaration. * @@ -21,7 +21,5 @@ module Impl { * // ^^^^^^ * ``` */ - class Rename extends Generated::Rename { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class Rename extends Generated::Rename { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/RetTypeReprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/RetTypeReprImpl.qll index 0c95aa955ac3..d8b6a5b9e82c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/RetTypeReprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/RetTypeReprImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `RetTypeRepr`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.RetTypeRepr * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A return type in a function signature. * @@ -21,7 +21,5 @@ module Impl { * // ^^^^^^ * ``` */ - class RetTypeRepr extends Generated::RetTypeRepr { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class RetTypeRepr extends Generated::RetTypeRepr { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ReturnTypeSyntaxImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ReturnTypeSyntaxImpl.qll index 381d673c4279..ffb09d726ab9 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ReturnTypeSyntaxImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ReturnTypeSyntaxImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ReturnTypeSyntax`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.ReturnTypeSyntax * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A return type notation `(..)` to reference or bound the type returned by a trait method * @@ -31,7 +31,5 @@ module Impl { * } * ``` */ - class ReturnTypeSyntax extends Generated::ReturnTypeSyntax { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class ReturnTypeSyntax extends Generated::ReturnTypeSyntax { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/SelfParamImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/SelfParamImpl.qll index 11327066a48f..dad7b1d96fb2 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/SelfParamImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/SelfParamImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `SelfParam`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.SelfParam * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A `self` parameter. For example `self` in: * ```rust @@ -25,7 +25,5 @@ module Impl { * } * ``` */ - class SelfParam extends Generated::SelfParam { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class SelfParam extends Generated::SelfParam { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/SlicePatImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/SlicePatImpl.qll index 6b2cb0cb8781..d905247cc663 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/SlicePatImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/SlicePatImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `SlicePat`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.SlicePat * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A slice pattern. For example: * ```rust @@ -22,7 +22,5 @@ module Impl { * } * ``` */ - class SlicePat extends Generated::SlicePat { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class SlicePat extends Generated::SlicePat { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/SliceTypeReprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/SliceTypeReprImpl.qll index b08521e17a1d..3c17ad922a6a 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/SliceTypeReprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/SliceTypeReprImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `SliceTypeRepr`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.SliceTypeRepr * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A slice type. * @@ -21,7 +21,5 @@ module Impl { * // ^^^^^ * ``` */ - class SliceTypeRepr extends Generated::SliceTypeRepr { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class SliceTypeRepr extends Generated::SliceTypeRepr { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/SourceFileImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/SourceFileImpl.qll index e97c066e6f62..7be1e405ddfe 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/SourceFileImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/SourceFileImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `SourceFile`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.SourceFile * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A source file. * @@ -21,7 +21,5 @@ module Impl { * fn main() {} * ``` */ - class SourceFile extends Generated::SourceFile { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class SourceFile extends Generated::SourceFile { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/StmtListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/StmtListImpl.qll index 1e1c6f2a2bca..d56b4c49ce21 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/StmtListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/StmtListImpl.qll @@ -27,8 +27,6 @@ module Impl { * ``` */ class StmtList extends Generated::StmtList { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th statement or expression of this statement list (0-based). * diff --git a/rust/ql/lib/codeql/rust/elements/internal/StructExprFieldListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/StructExprFieldListImpl.qll index c00d54ab0ce1..b4197e55885d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/StructExprFieldListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/StructExprFieldListImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `StructExprFieldList`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.StructExprFieldList * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A list of fields in a struct expression. * @@ -21,7 +21,5 @@ module Impl { * // ^^^^^^^^^^^ * ``` */ - class StructExprFieldList extends Generated::StructExprFieldList { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class StructExprFieldList extends Generated::StructExprFieldList { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/StructFieldListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/StructFieldListImpl.qll index bcaf879db754..a6a16d430c21 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/StructFieldListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/StructFieldListImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `StructFieldList`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.StructFieldList * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A list of fields in a struct declaration. * @@ -21,7 +21,5 @@ module Impl { * // ^^^^^^^^^^^^^^^ * ``` */ - class StructFieldList extends Generated::StructFieldList { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class StructFieldList extends Generated::StructFieldList { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/StructPatFieldListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/StructPatFieldListImpl.qll index 81fa9d687ea2..a2a078a5bf33 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/StructPatFieldListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/StructPatFieldListImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `StructPatFieldList`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.StructPatFieldList * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A list of fields in a struct pattern. * @@ -21,7 +21,5 @@ module Impl { * // ^^^^^ * ``` */ - class StructPatFieldList extends Generated::StructPatFieldList { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class StructPatFieldList extends Generated::StructPatFieldList { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/TokenTreeImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TokenTreeImpl.qll index 3fc3b62278aa..15e9c15abe12 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TokenTreeImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TokenTreeImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `TokenTree`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.TokenTree * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A token tree in a macro definition or invocation. * @@ -25,7 +25,5 @@ module Impl { * // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * ``` */ - class TokenTree extends Generated::TokenTree { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class TokenTree extends Generated::TokenTree { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/TokenTreeMetaImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TokenTreeMetaImpl.qll index 33c928c763d3..b61b222879d8 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TokenTreeMetaImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TokenTreeMetaImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `TokenTreeMeta`. * @@ -11,7 +12,5 @@ private import codeql.rust.elements.internal.generated.TokenTreeMeta * be referenced directly. */ module Impl { - class TokenTreeMeta extends Generated::TokenTreeMeta { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class TokenTreeMeta extends Generated::TokenTreeMeta { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/TryBlockModifierImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TryBlockModifierImpl.qll index 8e478141f23e..8be62790eeeb 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TryBlockModifierImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TryBlockModifierImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `TryBlockModifier`. * @@ -11,7 +12,5 @@ private import codeql.rust.elements.internal.generated.TryBlockModifier * be referenced directly. */ module Impl { - class TryBlockModifier extends Generated::TryBlockModifier { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class TryBlockModifier extends Generated::TryBlockModifier { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/TryExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TryExprImpl.qll index dd133194d4d1..0eaa4462ea70 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TryExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TryExprImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `TryExpr`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.TryExpr * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A try expression using the `?` operator. * @@ -21,7 +21,5 @@ module Impl { * // ^ * ``` */ - class TryExpr extends Generated::TryExpr { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class TryExpr extends Generated::TryExpr { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/TupleExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TupleExprImpl.qll index 0a40768fb263..df818859d879 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TupleExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TupleExprImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `TupleExpr`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.TupleExpr * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A tuple expression. For example: * ```rust @@ -20,7 +20,5 @@ module Impl { * let (a, b) = tuple; * ``` */ - class TupleExpr extends Generated::TupleExpr { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class TupleExpr extends Generated::TupleExpr { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/TupleFieldImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TupleFieldImpl.qll index d9ac804c72da..f26c855e3cb2 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TupleFieldImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TupleFieldImpl.qll @@ -24,8 +24,6 @@ module Impl { * ``` */ class TupleField extends Generated::TupleField { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** Holds if this tuple field is the `pos`th field of variant `v`. */ predicate isVariantField(Variant v, int pos) { this = v.getTupleField(pos) } diff --git a/rust/ql/lib/codeql/rust/elements/internal/TupleFieldListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TupleFieldListImpl.qll index bee2af0a683c..b52f0477987b 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TupleFieldListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TupleFieldListImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `TupleFieldList`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.TupleFieldList * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A list of fields in a tuple struct or tuple variant. * @@ -21,7 +21,5 @@ module Impl { * // ^^^^^^^^^^^^^ * ``` */ - class TupleFieldList extends Generated::TupleFieldList { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class TupleFieldList extends Generated::TupleFieldList { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/TuplePatImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TuplePatImpl.qll index b4a9ffed6ef4..ac9a723b6e13 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TuplePatImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TuplePatImpl.qll @@ -22,8 +22,6 @@ module Impl { * ``` */ class TuplePat extends Generated::TuplePat { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the arity of the tuple matched by this pattern, if any. * diff --git a/rust/ql/lib/codeql/rust/elements/internal/TupleTypeReprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TupleTypeReprImpl.qll index f529d731e0f7..47b18d2aca95 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TupleTypeReprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TupleTypeReprImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `TupleTypeRepr`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.TupleTypeRepr * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A tuple type. * @@ -21,7 +21,5 @@ module Impl { * // ^^^^^^^^^^^^^ * ``` */ - class TupleTypeRepr extends Generated::TupleTypeRepr { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class TupleTypeRepr extends Generated::TupleTypeRepr { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/TypeArgImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TypeArgImpl.qll index 56a3cf9ed5a0..616bc8e5af5c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TypeArgImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TypeArgImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `TypeArg`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.TypeArg * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A type argument in a generic argument list. * @@ -21,7 +21,5 @@ module Impl { * // ^^^ * ``` */ - class TypeArg extends Generated::TypeArg { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class TypeArg extends Generated::TypeArg { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/TypeBoundImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TypeBoundImpl.qll index 918238cd656e..cf05bbc4adad 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TypeBoundImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TypeBoundImpl.qll @@ -24,8 +24,6 @@ module Impl { * ``` */ class TypeBound extends Generated::TypeBound { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - override string toAbbreviatedString() { result = this.getLifetime().toAbbreviatedString() or diff --git a/rust/ql/lib/codeql/rust/elements/internal/UnsafeMetaImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/UnsafeMetaImpl.qll index 295b6b06b5fa..7da4ed5ace29 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/UnsafeMetaImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/UnsafeMetaImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `UnsafeMeta`. * @@ -11,7 +12,5 @@ private import codeql.rust.elements.internal.generated.UnsafeMeta * be referenced directly. */ module Impl { - class UnsafeMeta extends Generated::UnsafeMeta { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class UnsafeMeta extends Generated::UnsafeMeta { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/UseBoundGenericArgsImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/UseBoundGenericArgsImpl.qll index eab75ccca592..5b18c8f49789 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/UseBoundGenericArgsImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/UseBoundGenericArgsImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `UseBoundGenericArgs`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.UseBoundGenericArgs * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A use<..> bound to control which generic parameters are captured by an impl Trait return type. * @@ -21,7 +21,5 @@ module Impl { * // ^^^^^^^^ * ``` */ - class UseBoundGenericArgs extends Generated::UseBoundGenericArgs { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class UseBoundGenericArgs extends Generated::UseBoundGenericArgs { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/UseTreeListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/UseTreeListImpl.qll index de3260b9d8f3..d5f86f1ba3a7 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/UseTreeListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/UseTreeListImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `UseTreeList`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.UseTreeList * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A list of use trees in a use declaration. * @@ -21,7 +21,5 @@ module Impl { * // ^^^^^^^^ * ``` */ - class UseTreeList extends Generated::UseTreeList { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class UseTreeList extends Generated::UseTreeList { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/VariantListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/VariantListImpl.qll index c671954d10b4..2537307d34e1 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/VariantListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/VariantListImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `VariantList`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.VariantList * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A list of variants in an enum declaration. * @@ -21,7 +21,5 @@ module Impl { * // ^^^^^^^^^^^ * ``` */ - class VariantList extends Generated::VariantList { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class VariantList extends Generated::VariantList { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/VisibilityInnerImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/VisibilityInnerImpl.qll index 28f66a5db70c..ad896e5dcd25 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/VisibilityInnerImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/VisibilityInnerImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `VisibilityInner`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.VisibilityInner * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * The parenthesized inner part of a visibility modifier or restriction, such as the `(in path)` in `pub(in path)`, or the `(crate)` in `pub(crate)`. For example the `(in foo::bar)` in: * ```rust @@ -19,7 +19,5 @@ module Impl { * // ^^^^^^^^^^^^ * ``` */ - class VisibilityInner extends Generated::VisibilityInner { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class VisibilityInner extends Generated::VisibilityInner { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/WhereClauseImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/WhereClauseImpl.qll index 00d34f2ea290..aa916bbee56f 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/WhereClauseImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/WhereClauseImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `WhereClause`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.WhereClause * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A where clause in a generic declaration. * @@ -21,7 +21,5 @@ module Impl { * // ^^^^^^^^^^^^^^ * ``` */ - class WhereClause extends Generated::WhereClause { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class WhereClause extends Generated::WhereClause { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/WherePredImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/WherePredImpl.qll index 58b238c1af9a..9e4231ec5154 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/WherePredImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/WherePredImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `WherePred`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.WherePred * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A predicate in a where clause. * @@ -23,7 +23,5 @@ module Impl { * // ^^^^^^^^^^^^^^^^^^^^^^^^ * ``` */ - class WherePred extends Generated::WherePred { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class WherePred extends Generated::WherePred { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/YeetExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/YeetExprImpl.qll index 4e2049d24f63..37ddd76f8f8d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/YeetExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/YeetExprImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `YeetExpr`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.YeetExpr * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A `yeet` expression. For example: * ```rust @@ -20,7 +20,5 @@ module Impl { * } * ``` */ - class YeetExpr extends Generated::YeetExpr { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class YeetExpr extends Generated::YeetExpr { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/YieldExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/YieldExprImpl.qll index 8e682a17b2ab..573f66266158 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/YieldExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/YieldExprImpl.qll @@ -1,3 +1,4 @@ +// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `YieldExpr`. * @@ -11,7 +12,6 @@ private import codeql.rust.elements.internal.generated.YieldExpr * be referenced directly. */ module Impl { - // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A `yield` expression. For example: * ```rust @@ -21,7 +21,5 @@ module Impl { * }; * ``` */ - class YieldExpr extends Generated::YieldExpr { - override string toStringImpl() { result = this.getAPrimaryQlClass() } - } + class YieldExpr extends Generated::YieldExpr { } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Abi.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Abi.qll index 0f1089c4284a..6db2656c06f8 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Abi.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Abi.qll @@ -27,6 +27,8 @@ module Generated { class Abi extends Synth::TAbi, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "Abi" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the abi string of this abi, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ArgList.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ArgList.qll index c75d722e7938..e20cb6bab8cd 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ArgList.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ArgList.qll @@ -28,6 +28,8 @@ module Generated { class ArgList extends Synth::TArgList, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "ArgList" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th argument of this argument list (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ArrayExprInternal.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ArrayExprInternal.qll index 15c86caa17b1..84acaf3eaa8c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ArrayExprInternal.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ArrayExprInternal.qll @@ -22,6 +22,8 @@ module Generated { class ArrayExprInternal extends Synth::TArrayExprInternal, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "ArrayExprInternal" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this array expression internal (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ArrayListExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ArrayListExpr.qll index 657be83802da..d77d271cdcf4 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ArrayListExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ArrayListExpr.qll @@ -23,5 +23,7 @@ module Generated { */ class ArrayListExpr extends Synth::TArrayListExpr, ArrayExprImpl::ArrayExpr { override string getAPrimaryQlClass() { result = "ArrayListExpr" } + + override string toStringImpl() { result = this.getAPrimaryQlClass() } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ArrayRepeatExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ArrayRepeatExpr.qll index df7b21452a1c..56bd0282679c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ArrayRepeatExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ArrayRepeatExpr.qll @@ -25,6 +25,8 @@ module Generated { class ArrayRepeatExpr extends Synth::TArrayRepeatExpr, ArrayExprImpl::ArrayExpr { override string getAPrimaryQlClass() { result = "ArrayRepeatExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the repeat operand of this array repeat expression. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ArrayTypeRepr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ArrayTypeRepr.qll index c8e682937108..4d4d9addec92 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ArrayTypeRepr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ArrayTypeRepr.qll @@ -29,6 +29,8 @@ module Generated { class ArrayTypeRepr extends Synth::TArrayTypeRepr, TypeReprImpl::TypeRepr { override string getAPrimaryQlClass() { result = "ArrayTypeRepr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the const argument of this array type representation, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmClobberAbi.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmClobberAbi.qll index 37299a945e45..56a5f1f5c0f6 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmClobberAbi.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmClobberAbi.qll @@ -29,6 +29,8 @@ module Generated { class AsmClobberAbi extends Synth::TAsmClobberAbi, AsmPieceImpl::AsmPiece { override string getAPrimaryQlClass() { result = "AsmClobberAbi" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this asm clobber abi (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmConst.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmConst.qll index eb685ef2deb8..fc6fb8a03b1e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmConst.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmConst.qll @@ -29,6 +29,8 @@ module Generated { class AsmConst extends Synth::TAsmConst, AsmOperandImpl::AsmOperand { override string getAPrimaryQlClass() { result = "AsmConst" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the expression of this asm const, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmDirSpec.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmDirSpec.qll index 520e2d88ad66..4560dc7b24ce 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmDirSpec.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmDirSpec.qll @@ -27,5 +27,7 @@ module Generated { */ class AsmDirSpec extends Synth::TAsmDirSpec, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "AsmDirSpec" } + + override string toStringImpl() { result = this.getAPrimaryQlClass() } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmExpr.qll index 95e4d08aa406..b9d04e41b539 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmExpr.qll @@ -31,6 +31,8 @@ module Generated { class AsmExpr extends Synth::TAsmExpr, ExprImpl::Expr, ItemImpl::Item { override string getAPrimaryQlClass() { result = "AsmExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th asm piece of this asm expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmLabel.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmLabel.qll index 7d5f750f098c..991e7b5b6342 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmLabel.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmLabel.qll @@ -32,6 +32,8 @@ module Generated { class AsmLabel extends Synth::TAsmLabel, AsmOperandImpl::AsmOperand { override string getAPrimaryQlClass() { result = "AsmLabel" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the block expression of this asm label, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmOperandExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmOperandExpr.qll index 5f5fd7ff09d1..194b8a939c58 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmOperandExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmOperandExpr.qll @@ -29,6 +29,8 @@ module Generated { class AsmOperandExpr extends Synth::TAsmOperandExpr, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "AsmOperandExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the in expression of this asm operand expression, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmOperandNamed.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmOperandNamed.qll index 917866383a61..13a9d054bf35 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmOperandNamed.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmOperandNamed.qll @@ -31,6 +31,8 @@ module Generated { class AsmOperandNamed extends Synth::TAsmOperandNamed, AsmPieceImpl::AsmPiece { override string getAPrimaryQlClass() { result = "AsmOperandNamed" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the asm operand of this asm operand named, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmOption.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmOption.qll index 9c3d309f3078..0c9c861a662d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmOption.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmOption.qll @@ -28,6 +28,8 @@ module Generated { class AsmOption extends Synth::TAsmOption, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "AsmOption" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Holds if this asm option is raw. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmOptionsList.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmOptionsList.qll index e0c53f19f587..cc30288deb30 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmOptionsList.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmOptionsList.qll @@ -30,6 +30,8 @@ module Generated { class AsmOptionsList extends Synth::TAsmOptionsList, AsmPieceImpl::AsmPiece { override string getAPrimaryQlClass() { result = "AsmOptionsList" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th asm option of this asm options list (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmRegOperand.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmRegOperand.qll index a294732fd96b..a66d2cbf867c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmRegOperand.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmRegOperand.qll @@ -31,6 +31,8 @@ module Generated { class AsmRegOperand extends Synth::TAsmRegOperand, AsmOperandImpl::AsmOperand { override string getAPrimaryQlClass() { result = "AsmRegOperand" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the asm dir spec of this asm reg operand, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmRegSpec.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmRegSpec.qll index 60f0c5803fe9..610a8624606d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmRegSpec.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmRegSpec.qll @@ -29,6 +29,8 @@ module Generated { class AsmRegSpec extends Synth::TAsmRegSpec, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "AsmRegSpec" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the identifier of this asm reg spec, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmSym.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmSym.qll index 269b6721eb1e..ff21032734a6 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/AsmSym.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/AsmSym.qll @@ -29,6 +29,8 @@ module Generated { class AsmSym extends Synth::TAsmSym, AsmOperandImpl::AsmOperand { override string getAPrimaryQlClass() { result = "AsmSym" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the path of this asm sym, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/AssocItemList.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/AssocItemList.qll index 8a6dc5a43eda..b390c4b8c6b2 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/AssocItemList.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/AssocItemList.qll @@ -23,6 +23,8 @@ module Generated { class AssocItemList extends Synth::TAssocItemList, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "AssocItemList" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th assoc item of this assoc item list (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/AssocTypeArg.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/AssocTypeArg.qll index 50e5fb32fe6e..cffbdb25b299 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/AssocTypeArg.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/AssocTypeArg.qll @@ -40,6 +40,8 @@ module Generated { class AssocTypeArg extends Synth::TAssocTypeArg, GenericArgImpl::GenericArg { override string getAPrimaryQlClass() { result = "AssocTypeArg" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the const argument of this assoc type argument, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Attr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Attr.qll index 351b77154e3d..2b2c6a53b84d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Attr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Attr.qll @@ -29,6 +29,8 @@ module Generated { class Attr extends Synth::TAttr, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "Attr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the meta of this attr, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/AwaitExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/AwaitExpr.qll index baef03315c92..99b1b9ca0a75 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/AwaitExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/AwaitExpr.qll @@ -29,6 +29,8 @@ module Generated { class AwaitExpr extends Synth::TAwaitExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "AwaitExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this await expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/BecomeExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/BecomeExpr.qll index 7fdd78fcbee9..c05f1808fa04 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/BecomeExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/BecomeExpr.qll @@ -32,6 +32,8 @@ module Generated { class BecomeExpr extends Synth::TBecomeExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "BecomeExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this become expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/BinaryExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/BinaryExpr.qll index 68e7d391e396..6ed429aa960a 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/BinaryExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/BinaryExpr.qll @@ -30,6 +30,8 @@ module Generated { class BinaryExpr extends Synth::TBinaryExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "BinaryExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this binary expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/BoxPat.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/BoxPat.qll index ddd1d312c6b3..b0ae3bfd0c18 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/BoxPat.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/BoxPat.qll @@ -28,6 +28,8 @@ module Generated { class BoxPat extends Synth::TBoxPat, PatImpl::Pat { override string getAPrimaryQlClass() { result = "BoxPat" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the pattern of this box pattern, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/BreakExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/BreakExpr.qll index dae4a83377cf..332bab69bce9 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/BreakExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/BreakExpr.qll @@ -46,6 +46,8 @@ module Generated { class BreakExpr extends Synth::TBreakExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "BreakExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this break expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/CallExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/CallExpr.qll index 196b78c1bde1..996f984a17eb 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/CallExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/CallExpr.qll @@ -33,6 +33,8 @@ module Generated { class CallExpr extends Synth::TCallExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "CallExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the argument list of this call expression, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/CastExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/CastExpr.qll index a3725ff1a45f..02723a5bd68c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/CastExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/CastExpr.qll @@ -27,6 +27,8 @@ module Generated { class CastExpr extends Synth::TCastExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "CastExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this cast expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/CfgAtom.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/CfgAtom.qll index 8243d5ba14a7..2943c4c6ae06 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/CfgAtom.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/CfgAtom.qll @@ -19,5 +19,7 @@ module Generated { */ class CfgAtom extends Synth::TCfgAtom, CfgPredicateImpl::CfgPredicate { override string getAPrimaryQlClass() { result = "CfgAtom" } + + override string toStringImpl() { result = this.getAPrimaryQlClass() } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/CfgAttrMeta.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/CfgAttrMeta.qll index 0b972b413c53..e92309bff64d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/CfgAttrMeta.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/CfgAttrMeta.qll @@ -22,6 +22,8 @@ module Generated { class CfgAttrMeta extends Synth::TCfgAttrMeta, MetaImpl::Meta { override string getAPrimaryQlClass() { result = "CfgAttrMeta" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the cfg predicate of this cfg attr meta, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/CfgComposite.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/CfgComposite.qll index 65a5a672baf9..1000b1b2528d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/CfgComposite.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/CfgComposite.qll @@ -21,6 +21,8 @@ module Generated { class CfgComposite extends Synth::TCfgComposite, CfgPredicateImpl::CfgPredicate { override string getAPrimaryQlClass() { result = "CfgComposite" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th cfg predicate of this cfg composite (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/CfgMeta.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/CfgMeta.qll index d65162b85dda..7a76175fe25a 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/CfgMeta.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/CfgMeta.qll @@ -21,6 +21,8 @@ module Generated { class CfgMeta extends Synth::TCfgMeta, MetaImpl::Meta { override string getAPrimaryQlClass() { result = "CfgMeta" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the cfg predicate of this cfg meta, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ClosureExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ClosureExpr.qll index 86e1178589af..bc9f7d103f89 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ClosureExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ClosureExpr.qll @@ -37,6 +37,8 @@ module Generated { class ClosureExpr extends Synth::TClosureExpr, ExprImpl::Expr, CallableImpl::Callable { override string getAPrimaryQlClass() { result = "ClosureExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the closure body of this closure expression, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Comment.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Comment.qll index 7a4ca595f113..fa92b65fff87 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Comment.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Comment.qll @@ -26,6 +26,8 @@ module Generated { class Comment extends Synth::TComment, TokenImpl::Token { override string getAPrimaryQlClass() { result = "Comment" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the parent of this comment. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Const.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Const.qll index 07ffd9058bba..8798020310a8 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Const.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Const.qll @@ -33,6 +33,8 @@ module Generated { class Const extends Synth::TConst, AssocItemImpl::AssocItem { override string getAPrimaryQlClass() { result = "Const" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this const (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ConstArg.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ConstArg.qll index d9a9ee1d8553..2ed69e654c86 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ConstArg.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ConstArg.qll @@ -28,6 +28,8 @@ module Generated { class ConstArg extends Synth::TConstArg, GenericArgImpl::GenericArg { override string getAPrimaryQlClass() { result = "ConstArg" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the expression of this const argument, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ConstBlockPat.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ConstBlockPat.qll index 971308952917..d75a9b25c6f9 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ConstBlockPat.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ConstBlockPat.qll @@ -28,6 +28,8 @@ module Generated { class ConstBlockPat extends Synth::TConstBlockPat, PatImpl::Pat { override string getAPrimaryQlClass() { result = "ConstBlockPat" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the block expression of this const block pattern, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ConstParam.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ConstParam.qll index c2268deec020..7ad61d6f7401 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ConstParam.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ConstParam.qll @@ -31,6 +31,8 @@ module Generated { class ConstParam extends Synth::TConstParam, GenericParamImpl::GenericParam { override string getAPrimaryQlClass() { result = "ConstParam" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this const parameter (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ContinueExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ContinueExpr.qll index 9e8df8e22e6b..69b4e87b3f45 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ContinueExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ContinueExpr.qll @@ -37,6 +37,8 @@ module Generated { class ContinueExpr extends Synth::TContinueExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "ContinueExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this continue expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Crate.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Crate.qll index 644b23f1a1ea..dc3ca123591e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Crate.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Crate.qll @@ -21,6 +21,8 @@ module Generated { class Crate extends Synth::TCrate, LocatableImpl::Locatable { override string getAPrimaryQlClass() { result = "Crate" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the name of this crate, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/DerefPat.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/DerefPat.qll index abf59274933b..99cd951ee8d7 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/DerefPat.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/DerefPat.qll @@ -30,6 +30,8 @@ module Generated { class DerefPat extends Synth::TDerefPat, PatImpl::Pat { override string getAPrimaryQlClass() { result = "DerefPat" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the pattern of this deref pattern, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/DynTraitTypeRepr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/DynTraitTypeRepr.qll index 8e82d3f428c6..2f65e909d553 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/DynTraitTypeRepr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/DynTraitTypeRepr.qll @@ -28,6 +28,8 @@ module Generated { class DynTraitTypeRepr extends Synth::TDynTraitTypeRepr, TypeReprImpl::TypeRepr { override string getAPrimaryQlClass() { result = "DynTraitTypeRepr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the type bound list of this dyn trait type representation, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Enum.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Enum.qll index 35ff29361bc1..46e498bca254 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Enum.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Enum.qll @@ -27,6 +27,8 @@ module Generated { class Enum extends Synth::TEnum, TypeItemImpl::TypeItem { override string getAPrimaryQlClass() { result = "Enum" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the variant list of this enum, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ExprStmt.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ExprStmt.qll index 23396d0c9042..fda34aec572a 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ExprStmt.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ExprStmt.qll @@ -27,6 +27,8 @@ module Generated { class ExprStmt extends Synth::TExprStmt, StmtImpl::Stmt { override string getAPrimaryQlClass() { result = "ExprStmt" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the expression of this expression statement, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ExternBlock.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ExternBlock.qll index 9b769440bd3b..6fc3f3afb938 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ExternBlock.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ExternBlock.qll @@ -31,6 +31,8 @@ module Generated { class ExternBlock extends Synth::TExternBlock, ItemImpl::Item { override string getAPrimaryQlClass() { result = "ExternBlock" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the abi of this extern block, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ExternCrate.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ExternCrate.qll index 3484139b9fc2..59176f938224 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ExternCrate.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ExternCrate.qll @@ -30,6 +30,8 @@ module Generated { class ExternCrate extends Synth::TExternCrate, ItemImpl::Item { override string getAPrimaryQlClass() { result = "ExternCrate" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this extern crate (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ExternItemList.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ExternItemList.qll index 250fe549b52f..8f2c4ea3b4fa 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ExternItemList.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ExternItemList.qll @@ -31,6 +31,8 @@ module Generated { class ExternItemList extends Synth::TExternItemList, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "ExternItemList" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this extern item list (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ExtractorStep.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ExtractorStep.qll index e74b0e9680f1..f6aca65c944f 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ExtractorStep.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ExtractorStep.qll @@ -21,6 +21,8 @@ module Generated { class ExtractorStep extends Synth::TExtractorStep, ElementImpl::Element { override string getAPrimaryQlClass() { result = "ExtractorStep" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the action of this extractor step. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/FieldExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/FieldExpr.qll index acb19cd2a52e..87b10745862d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/FieldExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/FieldExpr.qll @@ -27,6 +27,8 @@ module Generated { class FieldExpr extends Synth::TFieldExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "FieldExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this field expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/FnPtrTypeRepr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/FnPtrTypeRepr.qll index c250406e68c9..9139b1616f11 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/FnPtrTypeRepr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/FnPtrTypeRepr.qll @@ -30,6 +30,8 @@ module Generated { class FnPtrTypeRepr extends Synth::TFnPtrTypeRepr, TypeReprImpl::TypeRepr { override string getAPrimaryQlClass() { result = "FnPtrTypeRepr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the abi of this fn ptr type representation, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ForBinder.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ForBinder.qll index 38512084e395..bc5825b9d79c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ForBinder.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ForBinder.qll @@ -33,6 +33,8 @@ module Generated { class ForBinder extends Synth::TForBinder, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "ForBinder" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the generic parameter list of this for binder, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ForTypeRepr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ForTypeRepr.qll index 56745b56f009..ecf9924b26d0 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ForTypeRepr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ForTypeRepr.qll @@ -29,6 +29,8 @@ module Generated { class ForTypeRepr extends Synth::TForTypeRepr, TypeReprImpl::TypeRepr { override string getAPrimaryQlClass() { result = "ForTypeRepr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the for binder of this for type representation, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Format.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Format.qll index 385eb04140e0..350c978e6622 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Format.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Format.qll @@ -30,6 +30,8 @@ module Generated { class Format extends Synth::TFormat, LocatableImpl::Locatable { override string getAPrimaryQlClass() { result = "Format" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the parent of this format. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsArg.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsArg.qll index 80ca340284fa..6cc08f872a91 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsArg.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsArg.qll @@ -26,6 +26,8 @@ module Generated { class FormatArgsArg extends Synth::TFormatArgsArg, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "FormatArgsArg" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the expression of this format arguments argument, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsExpr.qll index 38034779e053..e2e0e8022102 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsExpr.qll @@ -32,6 +32,8 @@ module Generated { class FormatArgsExpr extends Synth::TFormatArgsExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "FormatArgsExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th argument of this format arguments expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgument.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgument.qll index a1db224494b5..9668b3c1fea8 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgument.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgument.qll @@ -30,6 +30,8 @@ module Generated { class FormatArgument extends Synth::TFormatArgument, LocatableImpl::Locatable { override string getAPrimaryQlClass() { result = "FormatArgument" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the parent of this format argument. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/FormatTemplateVariableAccess.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/FormatTemplateVariableAccess.qll index 75e8a134f0ac..16fcca1faa38 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/FormatTemplateVariableAccess.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/FormatTemplateVariableAccess.qll @@ -21,5 +21,7 @@ module Generated { PathExprBaseImpl::PathExprBase { override string getAPrimaryQlClass() { result = "FormatTemplateVariableAccess" } + + override string toStringImpl() { result = this.getAPrimaryQlClass() } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Function.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Function.qll index 1221917425d1..0783a3c8d2d8 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Function.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Function.qll @@ -41,6 +41,8 @@ module Generated { { override string getAPrimaryQlClass() { result = "Function" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the abi of this function, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/GenericArgList.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/GenericArgList.qll index ac10d591ec17..c71cdee31c4a 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/GenericArgList.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/GenericArgList.qll @@ -25,6 +25,8 @@ module Generated { class GenericArgList extends Synth::TGenericArgList, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "GenericArgList" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th generic argument of this generic argument list (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/GenericParamList.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/GenericParamList.qll index 574bcb5f6f3a..22bd2febaca3 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/GenericParamList.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/GenericParamList.qll @@ -28,6 +28,8 @@ module Generated { class GenericParamList extends Synth::TGenericParamList, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "GenericParamList" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th generic parameter of this generic parameter list (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/IdentPat.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/IdentPat.qll index d016899bc01d..119c2bc3f175 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/IdentPat.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/IdentPat.qll @@ -36,6 +36,8 @@ module Generated { class IdentPat extends Synth::TIdentPat, PatImpl::Pat { override string getAPrimaryQlClass() { result = "IdentPat" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this ident pattern (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/IfExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/IfExpr.qll index 57d726b6210e..e227b92af56d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/IfExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/IfExpr.qll @@ -36,6 +36,8 @@ module Generated { class IfExpr extends Synth::TIfExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "IfExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this if expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Impl.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Impl.qll index 915e8940fb0e..c4e8acc6883b 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Impl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Impl.qll @@ -34,6 +34,8 @@ module Generated { class Impl extends Synth::TImpl, ItemImpl::Item { override string getAPrimaryQlClass() { result = "Impl" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the assoc item list of this impl, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ImplRestriction.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ImplRestriction.qll index 22210ede91a9..29d077d8795c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ImplRestriction.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ImplRestriction.qll @@ -22,6 +22,8 @@ module Generated { class ImplRestriction extends Synth::TImplRestriction, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "ImplRestriction" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the visibility inner of this impl restriction, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ImplTraitTypeRepr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ImplTraitTypeRepr.qll index 01ee54612c3d..4def3e1b8cf4 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ImplTraitTypeRepr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ImplTraitTypeRepr.qll @@ -28,6 +28,8 @@ module Generated { class ImplTraitTypeRepr extends Synth::TImplTraitTypeRepr, TypeReprImpl::TypeRepr { override string getAPrimaryQlClass() { result = "ImplTraitTypeRepr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the type bound list of this impl trait type representation, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/IncludeBytesExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/IncludeBytesExpr.qll index 712f9c6b37dc..23af5459aa6e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/IncludeBytesExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/IncludeBytesExpr.qll @@ -23,5 +23,7 @@ module Generated { */ class IncludeBytesExpr extends Synth::TIncludeBytesExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "IncludeBytesExpr" } + + override string toStringImpl() { result = this.getAPrimaryQlClass() } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/IndexExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/IndexExpr.qll index 51a9cd393e42..6733b94a9857 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/IndexExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/IndexExpr.qll @@ -27,6 +27,8 @@ module Generated { class IndexExpr extends Synth::TIndexExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "IndexExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this index expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/InferTypeRepr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/InferTypeRepr.qll index 780cc9a4b07d..4d0cf73c45ad 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/InferTypeRepr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/InferTypeRepr.qll @@ -26,5 +26,7 @@ module Generated { */ class InferTypeRepr extends Synth::TInferTypeRepr, TypeReprImpl::TypeRepr { override string getAPrimaryQlClass() { result = "InferTypeRepr" } + + override string toStringImpl() { result = this.getAPrimaryQlClass() } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ItemList.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ItemList.qll index 5d470ac9a779..b78105533a4d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ItemList.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ItemList.qll @@ -31,6 +31,8 @@ module Generated { class ItemList extends Synth::TItemList, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "ItemList" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this item list (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/KeyValueMeta.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/KeyValueMeta.qll index fba14fb3fc4d..cae2b17bf00d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/KeyValueMeta.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/KeyValueMeta.qll @@ -22,6 +22,8 @@ module Generated { class KeyValueMeta extends Synth::TKeyValueMeta, MetaImpl::Meta { override string getAPrimaryQlClass() { result = "KeyValueMeta" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the expression of this key value meta, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Label.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Label.qll index 8cb3102efd9b..4ef8f34d07af 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Label.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Label.qll @@ -28,6 +28,8 @@ module Generated { class Label extends Synth::TLabel, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "Label" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the lifetime of this label, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/LetElse.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/LetElse.qll index 442a4483c4b8..61a3f04c3c10 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/LetElse.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/LetElse.qll @@ -30,6 +30,8 @@ module Generated { class LetElse extends Synth::TLetElse, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "LetElse" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the block expression of this let else, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/LetExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/LetExpr.qll index 45e0fa589dab..73c05af9677a 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/LetExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/LetExpr.qll @@ -29,6 +29,8 @@ module Generated { class LetExpr extends Synth::TLetExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "LetExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this let expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/LetStmt.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/LetStmt.qll index c971a1548a56..69551d592698 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/LetStmt.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/LetStmt.qll @@ -36,6 +36,8 @@ module Generated { class LetStmt extends Synth::TLetStmt, StmtImpl::Stmt { override string getAPrimaryQlClass() { result = "LetStmt" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this let statement (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Lifetime.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Lifetime.qll index 9652d460b9ea..b34a95d84845 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Lifetime.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Lifetime.qll @@ -27,6 +27,8 @@ module Generated { class Lifetime extends Synth::TLifetime, UseBoundGenericArgImpl::UseBoundGenericArg { override string getAPrimaryQlClass() { result = "Lifetime" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the text of this lifetime, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/LifetimeArg.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/LifetimeArg.qll index 7ae2873fa606..c17a9e391299 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/LifetimeArg.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/LifetimeArg.qll @@ -28,6 +28,8 @@ module Generated { class LifetimeArg extends Synth::TLifetimeArg, GenericArgImpl::GenericArg { override string getAPrimaryQlClass() { result = "LifetimeArg" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the lifetime of this lifetime argument, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/LifetimeParam.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/LifetimeParam.qll index a293bfd54276..dea7e2f5eb9d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/LifetimeParam.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/LifetimeParam.qll @@ -30,6 +30,8 @@ module Generated { class LifetimeParam extends Synth::TLifetimeParam, GenericParamImpl::GenericParam { override string getAPrimaryQlClass() { result = "LifetimeParam" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this lifetime parameter (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/LiteralExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/LiteralExpr.qll index 57967d06538e..e799a0710653 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/LiteralExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/LiteralExpr.qll @@ -32,6 +32,8 @@ module Generated { class LiteralExpr extends Synth::TLiteralExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "LiteralExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this literal expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/LiteralPat.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/LiteralPat.qll index e3e6c7bd264b..b80bc7947334 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/LiteralPat.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/LiteralPat.qll @@ -28,6 +28,8 @@ module Generated { class LiteralPat extends Synth::TLiteralPat, PatImpl::Pat { override string getAPrimaryQlClass() { result = "LiteralPat" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the literal of this literal pattern, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/MacroCall.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/MacroCall.qll index bcca8b8deef3..32a0ed282016 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/MacroCall.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/MacroCall.qll @@ -31,6 +31,8 @@ module Generated { class MacroCall extends Synth::TMacroCall, AssocItemImpl::AssocItem, ExternItemImpl::ExternItem { override string getAPrimaryQlClass() { result = "MacroCall" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this macro call (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/MacroDef.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/MacroDef.qll index b10858d06854..1582f29d97b7 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/MacroDef.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/MacroDef.qll @@ -32,6 +32,8 @@ module Generated { class MacroDef extends Synth::TMacroDef, ItemImpl::Item { override string getAPrimaryQlClass() { result = "MacroDef" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the arguments of this macro def, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/MacroExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/MacroExpr.qll index 60e6ae6708eb..21118262a248 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/MacroExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/MacroExpr.qll @@ -27,6 +27,8 @@ module Generated { class MacroExpr extends Synth::TMacroExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "MacroExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the macro call of this macro expression, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/MacroItems.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/MacroItems.qll index 5dc115ecba4f..2a30b7db55c6 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/MacroItems.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/MacroItems.qll @@ -35,6 +35,8 @@ module Generated { class MacroItems extends Synth::TMacroItems, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "MacroItems" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th item of this macro items (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/MacroPat.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/MacroPat.qll index e967082bc775..2710500847e6 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/MacroPat.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/MacroPat.qll @@ -36,6 +36,8 @@ module Generated { class MacroPat extends Synth::TMacroPat, PatImpl::Pat { override string getAPrimaryQlClass() { result = "MacroPat" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the macro call of this macro pattern, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/MacroRules.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/MacroRules.qll index d7c915a9363e..623989ca866c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/MacroRules.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/MacroRules.qll @@ -32,6 +32,8 @@ module Generated { class MacroRules extends Synth::TMacroRules, ItemImpl::Item { override string getAPrimaryQlClass() { result = "MacroRules" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this macro rules (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/MacroTypeRepr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/MacroTypeRepr.qll index e6b901ba3d97..ead66c1d8639 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/MacroTypeRepr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/MacroTypeRepr.qll @@ -31,6 +31,8 @@ module Generated { class MacroTypeRepr extends Synth::TMacroTypeRepr, TypeReprImpl::TypeRepr { override string getAPrimaryQlClass() { result = "MacroTypeRepr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the macro call of this macro type representation, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/MatchArm.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/MatchArm.qll index 47782a2accb1..8ad003e81276 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/MatchArm.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/MatchArm.qll @@ -37,6 +37,8 @@ module Generated { class MatchArm extends Synth::TMatchArm, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "MatchArm" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this match arm (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/MatchArmList.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/MatchArmList.qll index b3b97b7a1751..09f89006de98 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/MatchArmList.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/MatchArmList.qll @@ -33,6 +33,8 @@ module Generated { class MatchArmList extends Synth::TMatchArmList, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "MatchArmList" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th arm of this match arm list (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/MatchExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/MatchExpr.qll index 8f49407e5f9e..621561b8d794 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/MatchExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/MatchExpr.qll @@ -36,6 +36,8 @@ module Generated { class MatchExpr extends Synth::TMatchExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "MatchExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this match expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/MatchGuard.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/MatchGuard.qll index b0b52879f52c..e0ab9e2ed245 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/MatchGuard.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/MatchGuard.qll @@ -31,6 +31,8 @@ module Generated { class MatchGuard extends Synth::TMatchGuard, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "MatchGuard" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the condition of this match guard, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/MethodCallExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/MethodCallExpr.qll index 18d6803211b3..725b9fe8d0b8 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/MethodCallExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/MethodCallExpr.qll @@ -34,6 +34,8 @@ module Generated { class MethodCallExpr extends Synth::TMethodCallExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "MethodCallExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the argument list of this method call expression, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Missing.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Missing.qll index 9eff62a26c46..6011345a730e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Missing.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Missing.qll @@ -20,5 +20,7 @@ module Generated { */ class Missing extends Synth::TMissing, UnextractedImpl::Unextracted { override string getAPrimaryQlClass() { result = "Missing" } + + override string toStringImpl() { result = this.getAPrimaryQlClass() } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Module.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Module.qll index b4513c9ae855..42ac38de7692 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Module.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Module.qll @@ -33,6 +33,8 @@ module Generated { class Module extends Synth::TModule, ItemImpl::Item { override string getAPrimaryQlClass() { result = "Module" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this module (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/MutRestriction.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/MutRestriction.qll index 8d387ff8ccf7..8213b036b8b3 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/MutRestriction.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/MutRestriction.qll @@ -22,6 +22,8 @@ module Generated { class MutRestriction extends Synth::TMutRestriction, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "MutRestriction" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Holds if this mut restriction is mut. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Name.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Name.qll index 115ae6afaeac..d9376b1cbf1f 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Name.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Name.qll @@ -27,6 +27,8 @@ module Generated { class Name extends Synth::TName, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "Name" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the text of this name, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/NameRef.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/NameRef.qll index f22dbdf5e228..7f08d90c1837 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/NameRef.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/NameRef.qll @@ -27,6 +27,8 @@ module Generated { class NameRef extends Synth::TNameRef, UseBoundGenericArgImpl::UseBoundGenericArg { override string getAPrimaryQlClass() { result = "NameRef" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the text of this name reference, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/NamedCrate.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/NamedCrate.qll index 8068f52970eb..9670f154299b 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/NamedCrate.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/NamedCrate.qll @@ -21,6 +21,8 @@ module Generated { class NamedCrate extends Synth::TNamedCrate, ElementImpl::Element { override string getAPrimaryQlClass() { result = "NamedCrate" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the name of this named crate. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/NeverTypeRepr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/NeverTypeRepr.qll index 6da319c83f3b..7db304955c78 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/NeverTypeRepr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/NeverTypeRepr.qll @@ -26,5 +26,7 @@ module Generated { */ class NeverTypeRepr extends Synth::TNeverTypeRepr, TypeReprImpl::TypeRepr { override string getAPrimaryQlClass() { result = "NeverTypeRepr" } + + override string toStringImpl() { result = this.getAPrimaryQlClass() } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/NotNull.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/NotNull.qll index 0748f287a6eb..467a1ba73a09 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/NotNull.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/NotNull.qll @@ -26,5 +26,7 @@ module Generated { */ class NotNull extends Synth::TNotNull, PatImpl::Pat { override string getAPrimaryQlClass() { result = "NotNull" } + + override string toStringImpl() { result = this.getAPrimaryQlClass() } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/OffsetOfExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/OffsetOfExpr.qll index c66a1af823a3..212ea8b678f4 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/OffsetOfExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/OffsetOfExpr.qll @@ -27,6 +27,8 @@ module Generated { class OffsetOfExpr extends Synth::TOffsetOfExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "OffsetOfExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this offset of expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/OrPat.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/OrPat.qll index 548ca32eb5ff..47acbf363862 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/OrPat.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/OrPat.qll @@ -27,6 +27,8 @@ module Generated { class OrPat extends Synth::TOrPat, PatImpl::Pat { override string getAPrimaryQlClass() { result = "OrPat" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th pattern of this or pattern (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Param.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Param.qll index 8e6176de53cc..80de784e8f0c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Param.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Param.qll @@ -27,6 +27,8 @@ module Generated { class Param extends Synth::TParam, ParamBaseImpl::ParamBase { override string getAPrimaryQlClass() { result = "Param" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the pattern of this parameter, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ParamList.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ParamList.qll index 1e13899b9a57..110cbcc396fb 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ParamList.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ParamList.qll @@ -29,6 +29,8 @@ module Generated { class ParamList extends Synth::TParamList, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "ParamList" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th parameter of this parameter list (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ParenExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ParenExpr.qll index 560398ca7f29..3ac0f192f460 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ParenExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ParenExpr.qll @@ -28,6 +28,8 @@ module Generated { class ParenExpr extends Synth::TParenExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "ParenExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this paren expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ParenPat.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ParenPat.qll index ddf678e24473..0ed82b8dd582 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ParenPat.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ParenPat.qll @@ -28,6 +28,8 @@ module Generated { class ParenPat extends Synth::TParenPat, PatImpl::Pat { override string getAPrimaryQlClass() { result = "ParenPat" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the pattern of this paren pattern, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ParenTypeRepr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ParenTypeRepr.qll index b174f19a1a01..5ad0c0c6224e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ParenTypeRepr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ParenTypeRepr.qll @@ -28,6 +28,8 @@ module Generated { class ParenTypeRepr extends Synth::TParenTypeRepr, TypeReprImpl::TypeRepr { override string getAPrimaryQlClass() { result = "ParenTypeRepr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the type representation of this paren type representation, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ParenthesizedArgList.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ParenthesizedArgList.qll index 6057a7eb3269..637f927914dd 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ParenthesizedArgList.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ParenthesizedArgList.qll @@ -33,6 +33,8 @@ module Generated { class ParenthesizedArgList extends Synth::TParenthesizedArgList, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "ParenthesizedArgList" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th type argument of this parenthesized argument list (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Path.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Path.qll index 60248dc9d304..53103baddf70 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Path.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Path.qll @@ -29,6 +29,8 @@ module Generated { class Path extends Synth::TPath, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "Path" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the qualifier of this path, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/PathExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/PathExpr.qll index 7409a2854534..00a45ec43f42 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/PathExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/PathExpr.qll @@ -31,6 +31,8 @@ module Generated { { override string getAPrimaryQlClass() { result = "PathExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this path expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/PathMeta.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/PathMeta.qll index f568d2407e13..bfc707da0dcf 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/PathMeta.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/PathMeta.qll @@ -21,6 +21,8 @@ module Generated { class PathMeta extends Synth::TPathMeta, MetaImpl::Meta { override string getAPrimaryQlClass() { result = "PathMeta" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the path of this path meta, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/PathPat.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/PathPat.qll index 3e69bb2cb32c..40cb5174c096 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/PathPat.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/PathPat.qll @@ -27,5 +27,7 @@ module Generated { */ class PathPat extends Synth::TPathPat, PatImpl::Pat, PathAstNodeImpl::PathAstNode { override string getAPrimaryQlClass() { result = "PathPat" } + + override string toStringImpl() { result = this.getAPrimaryQlClass() } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/PathSegment.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/PathSegment.qll index dd831902b99c..f26562d2e9f3 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/PathSegment.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/PathSegment.qll @@ -34,6 +34,8 @@ module Generated { class PathSegment extends Synth::TPathSegment, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "PathSegment" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the generic argument list of this path segment, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/PathTypeRepr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/PathTypeRepr.qll index 7fa652459f73..6f6bef8cc1c5 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/PathTypeRepr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/PathTypeRepr.qll @@ -26,6 +26,8 @@ module Generated { class PathTypeRepr extends Synth::TPathTypeRepr, TypeReprImpl::TypeRepr { override string getAPrimaryQlClass() { result = "PathTypeRepr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the path of this path type representation, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/PatternTypeRepr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/PatternTypeRepr.qll index 9081b0642797..fc7446d80515 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/PatternTypeRepr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/PatternTypeRepr.qll @@ -28,6 +28,8 @@ module Generated { class PatternTypeRepr extends Synth::TPatternTypeRepr, TypeReprImpl::TypeRepr { override string getAPrimaryQlClass() { result = "PatternTypeRepr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the pattern of this pattern type representation, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/PrefixExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/PrefixExpr.qll index d8c4bc290515..2f69986daf70 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/PrefixExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/PrefixExpr.qll @@ -28,6 +28,8 @@ module Generated { class PrefixExpr extends Synth::TPrefixExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "PrefixExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this prefix expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/PtrTypeRepr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/PtrTypeRepr.qll index 34c116a037e0..c9af74c2d9cd 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/PtrTypeRepr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/PtrTypeRepr.qll @@ -29,6 +29,8 @@ module Generated { class PtrTypeRepr extends Synth::TPtrTypeRepr, TypeReprImpl::TypeRepr { override string getAPrimaryQlClass() { result = "PtrTypeRepr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Holds if this ptr type representation is const. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/RangeExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/RangeExpr.qll index 06595838c222..4bfba674a973 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/RangeExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/RangeExpr.qll @@ -31,6 +31,8 @@ module Generated { class RangeExpr extends Synth::TRangeExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "RangeExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this range expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/RangePat.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/RangePat.qll index 60ea7b90fd7d..c4b7f6f23292 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/RangePat.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/RangePat.qll @@ -29,6 +29,8 @@ module Generated { class RangePat extends Synth::TRangePat, PatImpl::Pat { override string getAPrimaryQlClass() { result = "RangePat" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the end of this range pattern, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/RefExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/RefExpr.qll index 4eef67e3ed17..64c126c2bf5d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/RefExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/RefExpr.qll @@ -29,6 +29,8 @@ module Generated { class RefExpr extends Synth::TRefExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "RefExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this reference expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/RefPat.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/RefPat.qll index b954663a2dbf..d45d9be5bda1 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/RefPat.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/RefPat.qll @@ -28,6 +28,8 @@ module Generated { class RefPat extends Synth::TRefPat, PatImpl::Pat { override string getAPrimaryQlClass() { result = "RefPat" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Holds if this reference pattern is mut. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/RefTypeRepr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/RefTypeRepr.qll index b770a268431d..df8567ceb556 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/RefTypeRepr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/RefTypeRepr.qll @@ -30,6 +30,8 @@ module Generated { class RefTypeRepr extends Synth::TRefTypeRepr, TypeReprImpl::TypeRepr { override string getAPrimaryQlClass() { result = "RefTypeRepr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Holds if this reference type representation is mut. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Rename.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Rename.qll index 31dfe0d307cc..2b477678488a 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Rename.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Rename.qll @@ -28,6 +28,8 @@ module Generated { class Rename extends Synth::TRename, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "Rename" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the name of this rename, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/RestPat.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/RestPat.qll index 0134255b8285..dbfb5ee4ae2f 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/RestPat.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/RestPat.qll @@ -28,6 +28,8 @@ module Generated { class RestPat extends Synth::TRestPat, PatImpl::Pat { override string getAPrimaryQlClass() { result = "RestPat" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this rest pattern (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/RetTypeRepr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/RetTypeRepr.qll index 1589d16f20d6..d54da0d2f4a3 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/RetTypeRepr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/RetTypeRepr.qll @@ -28,6 +28,8 @@ module Generated { class RetTypeRepr extends Synth::TRetTypeRepr, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "RetTypeRepr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the type representation of this ret type representation, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ReturnExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ReturnExpr.qll index 184b14b8fcf0..0f2d9a77ac42 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ReturnExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ReturnExpr.qll @@ -33,6 +33,8 @@ module Generated { class ReturnExpr extends Synth::TReturnExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "ReturnExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this return expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ReturnTypeSyntax.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ReturnTypeSyntax.qll index 9b8a30c800ad..fdf9167b2e59 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ReturnTypeSyntax.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ReturnTypeSyntax.qll @@ -36,5 +36,7 @@ module Generated { */ class ReturnTypeSyntax extends Synth::TReturnTypeSyntax, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "ReturnTypeSyntax" } + + override string toStringImpl() { result = this.getAPrimaryQlClass() } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/SelfParam.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/SelfParam.qll index 1092de3cc08c..ec408668e296 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/SelfParam.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/SelfParam.qll @@ -33,6 +33,8 @@ module Generated { class SelfParam extends Synth::TSelfParam, ParamBaseImpl::ParamBase { override string getAPrimaryQlClass() { result = "SelfParam" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Holds if this self parameter is reference. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/SlicePat.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/SlicePat.qll index 2a2521248722..b11fa654b956 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/SlicePat.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/SlicePat.qll @@ -29,6 +29,8 @@ module Generated { class SlicePat extends Synth::TSlicePat, PatImpl::Pat { override string getAPrimaryQlClass() { result = "SlicePat" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th pattern of this slice pattern (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/SliceTypeRepr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/SliceTypeRepr.qll index 176b4e699e43..3c772c0f04bd 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/SliceTypeRepr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/SliceTypeRepr.qll @@ -28,6 +28,8 @@ module Generated { class SliceTypeRepr extends Synth::TSliceTypeRepr, TypeReprImpl::TypeRepr { override string getAPrimaryQlClass() { result = "SliceTypeRepr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the type representation of this slice type representation, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/SourceFile.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/SourceFile.qll index 64854b410cad..05eb9a21812b 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/SourceFile.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/SourceFile.qll @@ -29,6 +29,8 @@ module Generated { class SourceFile extends Synth::TSourceFile, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "SourceFile" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this source file (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Static.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Static.qll index 075b48c42e31..4324ff4cd402 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Static.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Static.qll @@ -31,6 +31,8 @@ module Generated { class Static extends Synth::TStatic, ExternItemImpl::ExternItem { override string getAPrimaryQlClass() { result = "Static" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this static (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/StmtList.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/StmtList.qll index 26a7f1f363a4..fc90ad0ce483 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/StmtList.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/StmtList.qll @@ -35,6 +35,8 @@ module Generated { class StmtList extends Synth::TStmtList, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "StmtList" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this statement list (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Struct.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Struct.qll index 07c4657c651f..857b8a623d93 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Struct.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Struct.qll @@ -28,6 +28,8 @@ module Generated { class Struct extends Synth::TStruct, TypeItemImpl::TypeItem { override string getAPrimaryQlClass() { result = "Struct" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the field list of this struct, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/StructExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/StructExpr.qll index c9fbacd72686..d9b90c5233b0 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/StructExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/StructExpr.qll @@ -29,6 +29,8 @@ module Generated { class StructExpr extends Synth::TStructExpr, ExprImpl::Expr, PathAstNodeImpl::PathAstNode { override string getAPrimaryQlClass() { result = "StructExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the struct expression field list of this struct expression, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/StructExprField.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/StructExprField.qll index 16dfbd946af1..b2bace71760f 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/StructExprField.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/StructExprField.qll @@ -27,6 +27,8 @@ module Generated { class StructExprField extends Synth::TStructExprField, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "StructExprField" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this struct expression field (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/StructExprFieldList.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/StructExprFieldList.qll index 66ab2785d422..6ca5c482ec56 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/StructExprFieldList.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/StructExprFieldList.qll @@ -30,6 +30,8 @@ module Generated { class StructExprFieldList extends Synth::TStructExprFieldList, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "StructExprFieldList" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this struct expression field list (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/StructField.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/StructField.qll index 2e540f11314f..2a8e85994190 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/StructField.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/StructField.qll @@ -33,6 +33,8 @@ module Generated { class StructField extends Synth::TStructField, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "StructField" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this struct field (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/StructFieldList.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/StructFieldList.qll index 624391a3da6f..7222c1877537 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/StructFieldList.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/StructFieldList.qll @@ -28,6 +28,8 @@ module Generated { class StructFieldList extends Synth::TStructFieldList, FieldListImpl::FieldList { override string getAPrimaryQlClass() { result = "StructFieldList" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th field of this struct field list (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/StructPat.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/StructPat.qll index 93f89aae3523..64129c6df648 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/StructPat.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/StructPat.qll @@ -29,6 +29,8 @@ module Generated { class StructPat extends Synth::TStructPat, PatImpl::Pat, PathAstNodeImpl::PathAstNode { override string getAPrimaryQlClass() { result = "StructPat" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the struct pattern field list of this struct pattern, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/StructPatField.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/StructPatField.qll index 40a2d3f74d52..9d8348447454 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/StructPatField.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/StructPatField.qll @@ -27,6 +27,8 @@ module Generated { class StructPatField extends Synth::TStructPatField, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "StructPatField" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this struct pattern field (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/StructPatFieldList.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/StructPatFieldList.qll index 46a5407626ba..ec2afa90be46 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/StructPatFieldList.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/StructPatFieldList.qll @@ -29,6 +29,8 @@ module Generated { class StructPatFieldList extends Synth::TStructPatFieldList, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "StructPatFieldList" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th field of this struct pattern field list (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/TokenTree.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/TokenTree.qll index 258a730ec643..f15483c9073d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/TokenTree.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/TokenTree.qll @@ -30,5 +30,7 @@ module Generated { */ class TokenTree extends Synth::TTokenTree, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "TokenTree" } + + override string toStringImpl() { result = this.getAPrimaryQlClass() } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/TokenTreeMeta.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/TokenTreeMeta.qll index b6d7d0a676a3..1aa4c6048f63 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/TokenTreeMeta.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/TokenTreeMeta.qll @@ -22,6 +22,8 @@ module Generated { class TokenTreeMeta extends Synth::TTokenTreeMeta, MetaImpl::Meta { override string getAPrimaryQlClass() { result = "TokenTreeMeta" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the path of this token tree meta, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Trait.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Trait.qll index 878c3ae4b015..f223e14a8c66 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Trait.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Trait.qll @@ -38,6 +38,8 @@ module Generated { class Trait extends Synth::TTrait, ItemImpl::Item { override string getAPrimaryQlClass() { result = "Trait" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the assoc item list of this trait, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/TryBlockModifier.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/TryBlockModifier.qll index e058784736b8..a1fcc4faa355 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/TryBlockModifier.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/TryBlockModifier.qll @@ -21,6 +21,8 @@ module Generated { class TryBlockModifier extends Synth::TTryBlockModifier, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "TryBlockModifier" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Holds if this try block modifier is try. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/TryExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/TryExpr.qll index f4c5bbf6e9be..ec6acbab762f 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/TryExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/TryExpr.qll @@ -29,6 +29,8 @@ module Generated { class TryExpr extends Synth::TTryExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "TryExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this try expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/TupleExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/TupleExpr.qll index 9a3b414dda0e..2ce27a28fb0b 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/TupleExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/TupleExpr.qll @@ -28,6 +28,8 @@ module Generated { class TupleExpr extends Synth::TTupleExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "TupleExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this tuple expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/TupleField.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/TupleField.qll index 7ed0d4788d82..e1eeca3e45ce 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/TupleField.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/TupleField.qll @@ -31,6 +31,8 @@ module Generated { class TupleField extends Synth::TTupleField, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "TupleField" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this tuple field (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/TupleFieldList.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/TupleFieldList.qll index 6d68797e64b0..57de287b3622 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/TupleFieldList.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/TupleFieldList.qll @@ -28,6 +28,8 @@ module Generated { class TupleFieldList extends Synth::TTupleFieldList, FieldListImpl::FieldList { override string getAPrimaryQlClass() { result = "TupleFieldList" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th field of this tuple field list (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/TuplePat.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/TuplePat.qll index 724a827f7c3b..a17a085f3ac7 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/TuplePat.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/TuplePat.qll @@ -26,6 +26,8 @@ module Generated { class TuplePat extends Synth::TTuplePat, PatImpl::Pat { override string getAPrimaryQlClass() { result = "TuplePat" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th field of this tuple pattern (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/TupleStructPat.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/TupleStructPat.qll index 859e8dfe3bb2..e902984b973c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/TupleStructPat.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/TupleStructPat.qll @@ -30,6 +30,8 @@ module Generated { class TupleStructPat extends Synth::TTupleStructPat, PatImpl::Pat, PathAstNodeImpl::PathAstNode { override string getAPrimaryQlClass() { result = "TupleStructPat" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th field of this tuple struct pattern (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/TupleTypeRepr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/TupleTypeRepr.qll index dead3a445e73..132f3bdabe83 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/TupleTypeRepr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/TupleTypeRepr.qll @@ -28,6 +28,8 @@ module Generated { class TupleTypeRepr extends Synth::TTupleTypeRepr, TypeReprImpl::TypeRepr { override string getAPrimaryQlClass() { result = "TupleTypeRepr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th field of this tuple type representation (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/TypeAlias.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/TypeAlias.qll index 063658e0a7bc..10671581be1f 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/TypeAlias.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/TypeAlias.qll @@ -37,6 +37,8 @@ module Generated { class TypeAlias extends Synth::TTypeAlias, AssocItemImpl::AssocItem, ExternItemImpl::ExternItem { override string getAPrimaryQlClass() { result = "TypeAlias" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this type alias (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/TypeArg.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/TypeArg.qll index 1b6b1c13219a..97896e199a83 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/TypeArg.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/TypeArg.qll @@ -28,6 +28,8 @@ module Generated { class TypeArg extends Synth::TTypeArg, GenericArgImpl::GenericArg { override string getAPrimaryQlClass() { result = "TypeArg" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the type representation of this type argument, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/TypeBound.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/TypeBound.qll index 958867911ce8..a262298cc03d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/TypeBound.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/TypeBound.qll @@ -33,6 +33,8 @@ module Generated { class TypeBound extends Synth::TTypeBound, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "TypeBound" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the for binder of this type bound, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/TypeBoundList.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/TypeBoundList.qll index e2fa4152d024..29cc078f7e17 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/TypeBoundList.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/TypeBoundList.qll @@ -28,6 +28,8 @@ module Generated { class TypeBoundList extends Synth::TTypeBoundList, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "TypeBoundList" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th bound of this type bound list (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/TypeParam.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/TypeParam.qll index 5379ca78306e..58df0abde48f 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/TypeParam.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/TypeParam.qll @@ -31,6 +31,8 @@ module Generated { class TypeParam extends Synth::TTypeParam, GenericParamImpl::GenericParam { override string getAPrimaryQlClass() { result = "TypeParam" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this type parameter (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/UnderscoreExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/UnderscoreExpr.qll index 89cc654eb17c..27f75fe894e1 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/UnderscoreExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/UnderscoreExpr.qll @@ -25,6 +25,8 @@ module Generated { class UnderscoreExpr extends Synth::TUnderscoreExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "UnderscoreExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this underscore expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Unimplemented.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Unimplemented.qll index 04e38d47781d..8b6d1e3bf263 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Unimplemented.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Unimplemented.qll @@ -20,5 +20,7 @@ module Generated { */ class Unimplemented extends Synth::TUnimplemented, UnextractedImpl::Unextracted { override string getAPrimaryQlClass() { result = "Unimplemented" } + + override string toStringImpl() { result = this.getAPrimaryQlClass() } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Union.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Union.qll index 5d31edafa114..d25fa6067ad1 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Union.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Union.qll @@ -27,6 +27,8 @@ module Generated { class Union extends Synth::TUnion, TypeItemImpl::TypeItem { override string getAPrimaryQlClass() { result = "Union" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the struct field list of this union, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/UnsafeMeta.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/UnsafeMeta.qll index e701e6bb1fb8..4af13f9e9a68 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/UnsafeMeta.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/UnsafeMeta.qll @@ -21,6 +21,8 @@ module Generated { class UnsafeMeta extends Synth::TUnsafeMeta, MetaImpl::Meta { override string getAPrimaryQlClass() { result = "UnsafeMeta" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Holds if this unsafe meta is unsafe. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Use.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Use.qll index ba3cc1de397b..c82c528eecc6 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Use.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Use.qll @@ -27,6 +27,8 @@ module Generated { class Use extends Synth::TUse, ItemImpl::Item { override string getAPrimaryQlClass() { result = "Use" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this use (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/UseBoundGenericArgs.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/UseBoundGenericArgs.qll index 3f76518c2404..600a9270b883 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/UseBoundGenericArgs.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/UseBoundGenericArgs.qll @@ -28,6 +28,8 @@ module Generated { class UseBoundGenericArgs extends Synth::TUseBoundGenericArgs, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "UseBoundGenericArgs" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th use bound generic argument of this use bound generic arguments (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/UseTree.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/UseTree.qll index 7279c4e9c44f..b5751811715a 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/UseTree.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/UseTree.qll @@ -30,6 +30,8 @@ module Generated { class UseTree extends Synth::TUseTree, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "UseTree" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Holds if this use tree is glob. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/UseTreeList.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/UseTreeList.qll index bb21ec82936f..03e21bc1fc91 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/UseTreeList.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/UseTreeList.qll @@ -28,6 +28,8 @@ module Generated { class UseTreeList extends Synth::TUseTreeList, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "UseTreeList" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th use tree of this use tree list (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Variant.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Variant.qll index c37995f77a0f..b48f9bb8bc5f 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Variant.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Variant.qll @@ -32,6 +32,8 @@ module Generated { class Variant extends Synth::TVariant, AddressableImpl::Addressable { override string getAPrimaryQlClass() { result = "Variant" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this variant (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/VariantList.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/VariantList.qll index e0ba8bfab156..a0347ac51c5e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/VariantList.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/VariantList.qll @@ -28,6 +28,8 @@ module Generated { class VariantList extends Synth::TVariantList, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "VariantList" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th variant of this variant list (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Visibility.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Visibility.qll index e37eff57a895..a031c6692d84 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Visibility.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Visibility.qll @@ -28,6 +28,8 @@ module Generated { class Visibility extends Synth::TVisibility, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "Visibility" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the visibility inner of this visibility, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/VisibilityInner.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/VisibilityInner.qll index 4283b56cd9dd..4d6956f0657f 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/VisibilityInner.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/VisibilityInner.qll @@ -26,6 +26,8 @@ module Generated { class VisibilityInner extends Synth::TVisibilityInner, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "VisibilityInner" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the path of this visibility inner, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/WhereClause.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/WhereClause.qll index 5b7080a7afaf..59cc942ead6d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/WhereClause.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/WhereClause.qll @@ -28,6 +28,8 @@ module Generated { class WhereClause extends Synth::TWhereClause, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "WhereClause" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th predicate of this where clause (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/WherePred.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/WherePred.qll index 7a96b326f1c2..a33f78c430d5 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/WherePred.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/WherePred.qll @@ -33,6 +33,8 @@ module Generated { class WherePred extends Synth::TWherePred, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "WherePred" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the for binder of this where pred, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/WildcardPat.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/WildcardPat.qll index e87383562c61..2a2be0e5cea1 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/WildcardPat.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/WildcardPat.qll @@ -23,5 +23,7 @@ module Generated { */ class WildcardPat extends Synth::TWildcardPat, PatImpl::Pat { override string getAPrimaryQlClass() { result = "WildcardPat" } + + override string toStringImpl() { result = this.getAPrimaryQlClass() } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/YeetExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/YeetExpr.qll index a9bd1e991d55..e56b1e3f59b9 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/YeetExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/YeetExpr.qll @@ -28,6 +28,8 @@ module Generated { class YeetExpr extends Synth::TYeetExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "YeetExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this yeet expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/YieldExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/YieldExpr.qll index 03541b83cfb6..b5790a6a7012 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/YieldExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/YieldExpr.qll @@ -29,6 +29,8 @@ module Generated { class YieldExpr extends Synth::TYieldExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "YieldExpr" } + override string toStringImpl() { result = this.getAPrimaryQlClass() } + /** * Gets the `index`th attr of this yield expression (0-based). */ diff --git a/rust/schema/annotations.py b/rust/schema/annotations.py index 3c1ab3e4d43c..968f0a1694c1 100644 --- a/rust/schema/annotations.py +++ b/rust/schema/annotations.py @@ -2,6 +2,9 @@ from .ast import * +@ql.to_string_impl_from_primary_class( + False +) # Disable since we have a final manual `toStringImpl` for this class class LabelableExpr(Expr): """ The base class for expressions that can be labeled (`LoopExpr`, `ForExpr`, `WhileExpr` or `BlockExpr`). diff --git a/rust/schema/prelude.py b/rust/schema/prelude.py index 9ca62f33acc1..e8e30bf7b65d 100644 --- a/rust/schema/prelude.py +++ b/rust/schema/prelude.py @@ -6,6 +6,7 @@ File = imported("File", "codeql.files.FileSystem") +@ql.to_string_impl_from_primary_class(True) @qltest.skip class Element: pass From 72d8db81a7dc4eae1cb8d436c7852aafd6ed08b4 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 17 Sep 2026 11:39:45 +0200 Subject: [PATCH 1078/2098] C#: Add some logging messages for lazily computed sets of dependencies. --- .../FeedManager.cs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs index 80c295afba46..8cf85869be88 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs @@ -107,19 +107,29 @@ public FeedManager(ILogger logger, IDotNet dotnet, IRegistryProxy? registryProxy lazyExplicitFeeds = new Lazy>(GetExplicitFeeds); lazyAllFeeds = new Lazy>(GetAllFeeds); - lazyReachableExplicitFeeds = new Lazy>(() => CheckSpecifiedFeeds(ExplicitFeeds)); + lazyReachableExplicitFeeds = new Lazy>(() => + { + logger.LogInfo("Discovering reachable explicit NuGet feeds."); + return CheckSpecifiedFeeds(ExplicitFeeds); + }); lazyReachableFeeds = new Lazy>(() => { + logger.LogInfo("Discovering reachable inherited NuGet feeds."); // Inherited feeds should only be used, if they are indeed reachable (as they may be environment specific). var reachableInheritedFeeds = CheckSpecifiedFeeds(InheritedFeeds); return ReachableExplicitFeeds.Union(reachableInheritedFeeds).ToImmutableHashSet(); }); lazyReachableFallbackFeeds = new Lazy>(() => { + logger.LogInfo("Discovering reachable fallback NuGet feeds."); var reachableFallbackFeeds = GetReachableFallbackNugetFeeds(); return reachableFallbackFeeds.ToImmutableHashSet(); }); - lazyReachableDefaultFeeds = new Lazy>(() => CheckSpecifiedFeeds(DefaultFeeds)); + lazyReachableDefaultFeeds = new Lazy>(() => + { + logger.LogInfo("Discovering reachable default NuGet feeds."); + return CheckSpecifiedFeeds(DefaultFeeds); + }); } public FeedManager(ILogger logger, IDotNet dotnet, IRegistryProxy? registryProxy, IFileProvider fileProvider) @@ -369,6 +379,7 @@ private List GetReachableFallbackNugetFeeds() private ImmutableHashSet GetExplicitFeeds() { + logger.LogInfo("Discovering explicit NuGet feeds from nuget.config files and private registries."); var nugetConfigs = fileProvider.NugetConfigs; // Find feeds that are explicitly configured in the NuGet configuration files that we found. @@ -398,6 +409,8 @@ private ImmutableHashSet GetExplicitFeeds() private ImmutableHashSet GetAllFeeds() { + logger.LogInfo("Discovering all NuGet feeds."); + var nugetConfigs = fileProvider.NugetConfigs; HashSet allFeeds = []; From 5d34c7992e5b279179abbdd36b445f45f476dffa Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 16 Sep 2026 12:51:48 +0200 Subject: [PATCH 1079/2098] unified: Map assignments to binary_expr --- .../extractor/src/languages/swift/swift.rs | 33 +++++-------------- ...t-with-shadowing-in-condition-value.output | 6 ++-- .../expressions/array-type-constructor.output | 7 ++-- .../function-with-inout-parameter.output | 6 ++-- .../swift/loops/repeat-while-loop.output | 6 ++-- .../corpus/swift/loops/while-loop.output | 6 ++-- .../swift/types/class-with-initializer.output | 7 ++-- .../swift/types/class-with-method.output | 6 ++-- .../property-with-getter-and-setter.output | 7 ++-- .../corpus/swift/variables/assignment.output | 7 ++-- .../variables/compound-assignment.output | 6 ++-- 11 files changed, 43 insertions(+), 54 deletions(-) diff --git a/unified/extractor/src/languages/swift/swift.rs b/unified/extractor/src/languages/swift/swift.rs index e355cbb96dce..8242e37a8a3f 100644 --- a/unified/extractor/src/languages/swift/swift.rs +++ b/unified/extractor/src/languages/swift/swift.rs @@ -129,13 +129,6 @@ fn member_chain( result } -/// Compound-assignment operator spellings (`+=`, `<<=`, ...). Used to tell a -/// compound assignment from an ordinary binary application, both of which -/// arrive as a `binaryOperator`-based `infixOperatorExpr`. -const COMPOUND_ASSIGN_OPS: &[&str] = &[ - "+=", "-=", "*=", "/=", "%=", "<<=", ">>=", "&=", "|=", "^=", "&+=", "&-=", "&*=", -]; - fn translation_rules() -> Vec> { vec![ // ---- Top-level ---- @@ -243,29 +236,21 @@ fn translation_rules() -> Vec> { // operator leaf. Used by `infixOperatorExpr` (folded) and `sequenceExpr` // (unresolved). rule!((binaryOperatorExpr operator: @op) => (infix_operator #{op})), - // Compound assignment (`x += y`) vs. an ordinary binary application - // (`a + b`): both are `binaryOperator`-based `infixOperatorExpr`s, - // distinguishable only by the operator's spelling. The query engine - // can't match on token text, so a small Rust block reads the spelling - // and routes to `compound_assign_expr` or `binary_expr`. The operator - // is captured raw (`@@op`) to read its spelling. + // A `binaryOperator`-based `infixOperatorExpr` represents both ordinary + // binary applications (`a + b`) and compound assignments (`x += y`). + // Both have the same target AST shape; the QL library distinguishes + // assignments by the operator spelling. rule!( (infixOperatorExpr leftOperand: @l operator: (binaryOperatorExpr) @@op rightOperand: @r) => - expr { - if COMPOUND_ASSIGN_OPS.contains(&ctx.source_text(op).as_str()) { - tree!((compound_assign_expr target: {l} operator: (infix_operator #{op}) value: {r})) - } else { - tree!((binary_expr left: {l} operator: (infix_operator #{op}) right: {r})) - } - } + (binary_expr left: {l} operator: (infix_operator #{op}) right: {r}) ), - // Plain assignment (`x = y`). In a folded chain the `=` is an - // `assignmentExpr` node (distinct from other operators), matched by kind. + // Plain assignment (`x = y`). In a folded chain the `=` is represented + // by an `assignmentExpr` node rather than a `binaryOperatorExpr`. rule!( - (infixOperatorExpr leftOperand: @l operator: (assignmentExpr) rightOperand: @r) + (infixOperatorExpr leftOperand: @l operator: (assignmentExpr) @op rightOperand: @r) => - (assign_expr target: {l} value: {r}) + (binary_expr left: {l} operator: (infix_operator #{op}) right: {r}) ), // In an unresolved `sequenceExpr` (below) the operator positions are not // only `binaryOperatorExpr`s: a plain assignment (`=`), an `as`/`is` cast diff --git a/unified/extractor/tests/corpus/swift/control-flow/if-case-let-with-shadowing-in-condition-value.output b/unified/extractor/tests/corpus/swift/control-flow/if-case-let-with-shadowing-in-condition-value.output index 699609a26309..1b44ec1e7707 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/if-case-let-with-shadowing-in-condition-value.output +++ b/unified/extractor/tests/corpus/swift/control-flow/if-case-let-with-shadowing-in-condition-value.output @@ -151,7 +151,7 @@ top_level then: block stmt: - compound_assign_expr - target: identifier "y" + binary_expr + left: identifier "y" operator: infix_operator "+=" - value: int_literal "1" + right: int_literal "1" diff --git a/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.output b/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.output index be59a73183d9..6f33fc0321a4 100644 --- a/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.output +++ b/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.output @@ -167,6 +167,7 @@ top_level body: block stmt: - assign_expr - target: identifier "count" - value: int_literal "0" + binary_expr + left: identifier "count" + operator: infix_operator "=" + right: int_literal "0" diff --git a/unified/extractor/tests/corpus/swift/functions/function-with-inout-parameter.output b/unified/extractor/tests/corpus/swift/functions/function-with-inout-parameter.output index 198bb22bb29f..83e3c7a53c2d 100644 --- a/unified/extractor/tests/corpus/swift/functions/function-with-inout-parameter.output +++ b/unified/extractor/tests/corpus/swift/functions/function-with-inout-parameter.output @@ -71,7 +71,7 @@ top_level body: block stmt: - compound_assign_expr - target: identifier "x" + binary_expr + left: identifier "x" operator: infix_operator "+=" - value: int_literal "1" + right: int_literal "1" diff --git a/unified/extractor/tests/corpus/swift/loops/repeat-while-loop.output b/unified/extractor/tests/corpus/swift/loops/repeat-while-loop.output index 025cdb19f63f..6287bbaa9bfc 100644 --- a/unified/extractor/tests/corpus/swift/loops/repeat-while-loop.output +++ b/unified/extractor/tests/corpus/swift/loops/repeat-while-loop.output @@ -51,10 +51,10 @@ top_level body: block stmt: - compound_assign_expr - target: identifier "x" + binary_expr + left: identifier "x" operator: infix_operator "-=" - value: int_literal "1" + right: int_literal "1" condition: binary_expr left: identifier "x" diff --git a/unified/extractor/tests/corpus/swift/loops/while-loop.output b/unified/extractor/tests/corpus/swift/loops/while-loop.output index 54b3c20d61ab..f4f64cfca6bc 100644 --- a/unified/extractor/tests/corpus/swift/loops/while-loop.output +++ b/unified/extractor/tests/corpus/swift/loops/while-loop.output @@ -57,7 +57,7 @@ top_level body: block stmt: - compound_assign_expr - target: identifier "x" + binary_expr + left: identifier "x" operator: infix_operator "-=" - value: int_literal "1" + right: int_literal "1" diff --git a/unified/extractor/tests/corpus/swift/types/class-with-initializer.output b/unified/extractor/tests/corpus/swift/types/class-with-initializer.output index 8027fd0fca8c..cd9e3c1eb9ad 100644 --- a/unified/extractor/tests/corpus/swift/types/class-with-initializer.output +++ b/unified/extractor/tests/corpus/swift/types/class-with-initializer.output @@ -106,9 +106,10 @@ top_level body: block stmt: - assign_expr - target: + binary_expr + left: member_access_expr base: identifier "self" member_name_node: identifier "x" - value: identifier "x" + operator: infix_operator "=" + right: identifier "x" diff --git a/unified/extractor/tests/corpus/swift/types/class-with-method.output b/unified/extractor/tests/corpus/swift/types/class-with-method.output index f0b8cbf68dfb..2cc184038255 100644 --- a/unified/extractor/tests/corpus/swift/types/class-with-method.output +++ b/unified/extractor/tests/corpus/swift/types/class-with-method.output @@ -90,7 +90,7 @@ top_level body: block stmt: - compound_assign_expr - target: identifier "n" + binary_expr + left: identifier "n" operator: infix_operator "+=" - value: int_literal "1" + right: int_literal "1" diff --git a/unified/extractor/tests/corpus/swift/types/property-with-getter-and-setter.output b/unified/extractor/tests/corpus/swift/types/property-with-getter-and-setter.output index 0641e6e30931..a37b28985e6b 100644 --- a/unified/extractor/tests/corpus/swift/types/property-with-getter-and-setter.output +++ b/unified/extractor/tests/corpus/swift/types/property-with-getter-and-setter.output @@ -136,6 +136,7 @@ top_level body: block stmt: - assign_expr - target: identifier "_v" - value: identifier "newValue" + binary_expr + left: identifier "_v" + operator: infix_operator "=" + right: identifier "newValue" diff --git a/unified/extractor/tests/corpus/swift/variables/assignment.output b/unified/extractor/tests/corpus/swift/variables/assignment.output index a81c74dd6c29..384b09066e37 100644 --- a/unified/extractor/tests/corpus/swift/variables/assignment.output +++ b/unified/extractor/tests/corpus/swift/variables/assignment.output @@ -24,6 +24,7 @@ top_level body: block stmt: - assign_expr - target: identifier "x" - value: int_literal "1" + binary_expr + left: identifier "x" + operator: infix_operator "=" + right: int_literal "1" diff --git a/unified/extractor/tests/corpus/swift/variables/compound-assignment.output b/unified/extractor/tests/corpus/swift/variables/compound-assignment.output index 0189512f9abd..e5e1fc04f93d 100644 --- a/unified/extractor/tests/corpus/swift/variables/compound-assignment.output +++ b/unified/extractor/tests/corpus/swift/variables/compound-assignment.output @@ -24,7 +24,7 @@ top_level body: block stmt: - compound_assign_expr - target: identifier "x" + binary_expr + left: identifier "x" operator: infix_operator "+=" - value: int_literal "1" + right: int_literal "1" From 02c3c0ca8ef72c3002d7fbefbca78de9e247b2df Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 16 Sep 2026 12:52:00 +0200 Subject: [PATCH 1080/2098] unified: Remove old AST nodes --- unified/extractor/ast_types.yml | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/unified/extractor/ast_types.yml b/unified/extractor/ast_types.yml index f1ee78f1c621..b293820d9cd8 100644 --- a/unified/extractor/ast_types.yml +++ b/unified/extractor/ast_types.yml @@ -23,8 +23,6 @@ supertypes: - type_cast_expr - type_test_expr - if_expr - - assign_expr - - compound_assign_expr - pattern_guard_expr - empty_expr - block @@ -159,17 +157,6 @@ named: unresolved_operator_sequence: element*: expr_or_operator - # Plain assignment - assign_expr: - target: expr - value: expr - - # Compound assignment - compound_assign_expr: - target: expr - operator: infix_operator - value: expr - # A function or method call, such as `f(x)` or `obj.m(x)`. # # Method calls are represented as a call whose `function` is a `member_access_expr`. From b0e73130aecceaffdb9dbf8bb1f2fb04c03699aa Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 16 Sep 2026 12:52:09 +0200 Subject: [PATCH 1081/2098] unified: Regenerate QL --- .../ql/lib/codeql/unified/internal/Ast.qll | 53 ------------------- unified/ql/lib/unified.dbscheme | 17 +----- 2 files changed, 2 insertions(+), 68 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/Ast.qll b/unified/ql/lib/codeql/unified/internal/Ast.qll index a04b93291707..ea296e4d3dd7 100644 --- a/unified/ql/lib/codeql/unified/internal/Ast.qll +++ b/unified/ql/lib/codeql/unified/internal/Ast.qll @@ -183,23 +183,6 @@ module Unified { final override F::AstNode getAFieldOrChild() { unified_array_literal_element(this, _, result) } } - /** A class representing `assign_expr` nodes. */ - class AssignExpr extends @unified_assign_expr, F::Expr { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "AssignExpr" } - - /** Gets the node corresponding to the field `target`. */ - final F::Expr getTarget() { unified_assign_expr_def(this, result, _) } - - /** Gets the node corresponding to the field `value`. */ - final F::Expr getValue() { unified_assign_expr_def(this, _, result) } - - /** Gets a field or child node of this node. */ - final override F::AstNode getAFieldOrChild() { - unified_assign_expr_def(this, result, _) or unified_assign_expr_def(this, _, result) - } - } - /** A class representing `associated_type_declaration` nodes. */ class AssociatedTypeDeclaration extends @unified_associated_type_declaration, F::Member { /** Gets the name of the primary QL class for this element. */ @@ -468,28 +451,6 @@ module Unified { } } - /** A class representing `compound_assign_expr` nodes. */ - class CompoundAssignExpr extends @unified_compound_assign_expr, F::Expr { - /** Gets the name of the primary QL class for this element. */ - final override string getAPrimaryQlClass() { result = "CompoundAssignExpr" } - - /** Gets the node corresponding to the field `operator`. */ - final F::InfixOperator getOperator() { unified_compound_assign_expr_def(this, result, _, _) } - - /** Gets the node corresponding to the field `target`. */ - final F::Expr getTarget() { unified_compound_assign_expr_def(this, _, result, _) } - - /** Gets the node corresponding to the field `value`. */ - final F::Expr getValue() { unified_compound_assign_expr_def(this, _, _, result) } - - /** Gets a field or child node of this node. */ - final override F::AstNode getAFieldOrChild() { - unified_compound_assign_expr_def(this, result, _, _) or - unified_compound_assign_expr_def(this, _, result, _) or - unified_compound_assign_expr_def(this, _, _, result) - } - } - /** A class representing `conditional_pattern` nodes. */ class ConditionalPattern extends @unified_conditional_pattern, F::Expr { /** Gets the name of the primary QL class for this element. */ @@ -1576,10 +1537,6 @@ module Unified { or result = node.(ArrayLiteral).getElement(i) and name = "getElement" or - result = node.(AssignExpr).getTarget() and i = -1 and name = "getTarget" - or - result = node.(AssignExpr).getValue() and i = -1 and name = "getValue" - or result = node.(AssociatedTypeDeclaration).getBound() and i = -1 and name = "getBound" or result = node.(AssociatedTypeDeclaration).getModifier(i) and name = "getModifier" @@ -1634,12 +1591,6 @@ module Unified { or result = node.(ClassLikeDeclaration).getTypeParameter(i) and name = "getTypeParameter" or - result = node.(CompoundAssignExpr).getOperator() and i = -1 and name = "getOperator" - or - result = node.(CompoundAssignExpr).getTarget() and i = -1 and name = "getTarget" - or - result = node.(CompoundAssignExpr).getValue() and i = -1 and name = "getValue" - or result = node.(ConditionalPattern).getCondition() and i = -1 and name = "getCondition" or result = node.(ConditionalPattern).getModifier(i) and name = "getModifier" @@ -1879,8 +1830,6 @@ module UnifiedFinal { final class ArrayLiteral = F::ArrayLiteral; - final class AssignExpr = F::AssignExpr; - final class AssociatedTypeDeclaration = F::AssociatedTypeDeclaration; final class BaseType = F::BaseType; @@ -1907,8 +1856,6 @@ module UnifiedFinal { final class ClassLikeDeclaration = F::ClassLikeDeclaration; - final class CompoundAssignExpr = F::CompoundAssignExpr; - final class ConditionalPattern = F::ConditionalPattern; final class ConstructorDeclaration = F::ConstructorDeclaration; diff --git a/unified/ql/lib/unified.dbscheme b/unified/ql/lib/unified.dbscheme index cb0facfc1d0a..c5f144e8b661 100644 --- a/unified/ql/lib/unified.dbscheme +++ b/unified/ql/lib/unified.dbscheme @@ -194,12 +194,6 @@ unified_array_literal_def( unique int id: @unified_array_literal ); -unified_assign_expr_def( - unique int id: @unified_assign_expr, - int target: @unified_expr ref, - int value: @unified_expr ref -); - unified_associated_type_declaration_bound( unique int unified_associated_type_declaration: @unified_associated_type_declaration ref, unique int bound: @unified_expr ref @@ -360,13 +354,6 @@ unified_class_like_declaration_def( unique int id: @unified_class_like_declaration ); -unified_compound_assign_expr_def( - unique int id: @unified_compound_assign_expr, - int operator: @unified_token_infix_operator ref, - int target: @unified_expr ref, - int value: @unified_expr ref -); - #keyset[unified_conditional_pattern, index] unified_conditional_pattern_modifier( int unified_conditional_pattern: @unified_conditional_pattern ref, @@ -448,7 +435,7 @@ unified_equality_type_constraint_def( int right: @unified_expr ref ); -@unified_expr = @unified_array_literal | @unified_assign_expr | @unified_binary_expr | @unified_block | @unified_break_expr | @unified_bulk_importing_pattern | @unified_call_expr | @unified_compound_assign_expr | @unified_conditional_pattern | @unified_continue_expr | @unified_expr_pattern | @unified_function_expr | @unified_generic_type_expr | @unified_if_expr | @unified_key_value_pair | @unified_map_literal | @unified_member_access_expr | @unified_named_pattern | @unified_or_pattern | @unified_pattern_guard_expr | @unified_return_expr | @unified_string_interpolation_expr | @unified_switch_expr | @unified_throw_expr | @unified_token_boolean_literal | @unified_token_builtin_expr | @unified_token_empty_expr | @unified_token_float_literal | @unified_token_identifier | @unified_token_inferred_type_expr | @unified_token_int_literal | @unified_token_regex_literal | @unified_token_string_literal | @unified_token_super_expr | @unified_token_unsupported_node | @unified_try_expr | @unified_tuple_expr | @unified_type_cast_expr | @unified_type_test_expr | @unified_unary_expr | @unified_unresolved_operator_sequence +@unified_expr = @unified_array_literal | @unified_binary_expr | @unified_block | @unified_break_expr | @unified_bulk_importing_pattern | @unified_call_expr | @unified_conditional_pattern | @unified_continue_expr | @unified_expr_pattern | @unified_function_expr | @unified_generic_type_expr | @unified_if_expr | @unified_key_value_pair | @unified_map_literal | @unified_member_access_expr | @unified_named_pattern | @unified_or_pattern | @unified_pattern_guard_expr | @unified_return_expr | @unified_string_interpolation_expr | @unified_switch_expr | @unified_throw_expr | @unified_token_boolean_literal | @unified_token_builtin_expr | @unified_token_empty_expr | @unified_token_float_literal | @unified_token_identifier | @unified_token_inferred_type_expr | @unified_token_int_literal | @unified_token_regex_literal | @unified_token_string_literal | @unified_token_super_expr | @unified_token_unsupported_node | @unified_try_expr | @unified_tuple_expr | @unified_type_cast_expr | @unified_type_test_expr | @unified_unary_expr | @unified_unresolved_operator_sequence @unified_expr_or_operator = @unified_expr | @unified_token_infix_operator @@ -1012,7 +999,7 @@ unified_trivia_tokeninfo( string value: string ref ); -@unified_ast_node = @unified_accessor_declaration | @unified_argument | @unified_array_literal | @unified_assign_expr | @unified_associated_type_declaration | @unified_base_type | @unified_binary_expr | @unified_block | @unified_bound_type_constraint | @unified_break_expr | @unified_bulk_importing_pattern | @unified_call_expr | @unified_catch_clause | @unified_class_like_declaration | @unified_compound_assign_expr | @unified_conditional_pattern | @unified_constructor_declaration | @unified_continue_expr | @unified_destructor_declaration | @unified_do_while_stmt | @unified_equality_type_constraint | @unified_expr_pattern | @unified_for_each_stmt | @unified_function_declaration | @unified_function_expr | @unified_generic_type_expr | @unified_guard_if_stmt | @unified_if_expr | @unified_import_declaration | @unified_initializer_declaration | @unified_key_value_pair | @unified_labeled_stmt | @unified_map_literal | @unified_member_access_expr | @unified_named_pattern | @unified_operator_syntax_declaration | @unified_or_pattern | @unified_parameter | @unified_pattern_guard_expr | @unified_return_expr | @unified_string_interpolation_expr | @unified_switch_case | @unified_switch_expr | @unified_throw_expr | @unified_token | @unified_top_level | @unified_trivia_token | @unified_try_expr | @unified_tuple_expr | @unified_type_alias_declaration | @unified_type_cast_expr | @unified_type_parameter | @unified_type_test_expr | @unified_unary_expr | @unified_unresolved_operator_sequence | @unified_variable_declaration | @unified_while_stmt +@unified_ast_node = @unified_accessor_declaration | @unified_argument | @unified_array_literal | @unified_associated_type_declaration | @unified_base_type | @unified_binary_expr | @unified_block | @unified_bound_type_constraint | @unified_break_expr | @unified_bulk_importing_pattern | @unified_call_expr | @unified_catch_clause | @unified_class_like_declaration | @unified_conditional_pattern | @unified_constructor_declaration | @unified_continue_expr | @unified_destructor_declaration | @unified_do_while_stmt | @unified_equality_type_constraint | @unified_expr_pattern | @unified_for_each_stmt | @unified_function_declaration | @unified_function_expr | @unified_generic_type_expr | @unified_guard_if_stmt | @unified_if_expr | @unified_import_declaration | @unified_initializer_declaration | @unified_key_value_pair | @unified_labeled_stmt | @unified_map_literal | @unified_member_access_expr | @unified_named_pattern | @unified_operator_syntax_declaration | @unified_or_pattern | @unified_parameter | @unified_pattern_guard_expr | @unified_return_expr | @unified_string_interpolation_expr | @unified_switch_case | @unified_switch_expr | @unified_throw_expr | @unified_token | @unified_top_level | @unified_trivia_token | @unified_try_expr | @unified_tuple_expr | @unified_type_alias_declaration | @unified_type_cast_expr | @unified_type_parameter | @unified_type_test_expr | @unified_unary_expr | @unified_unresolved_operator_sequence | @unified_variable_declaration | @unified_while_stmt unified_ast_node_location( unique int node: @unified_ast_node ref, From 04666e013e1fa31292c72fa22aa7899d0d467240 Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 16 Sep 2026 12:52:25 +0200 Subject: [PATCH 1082/2098] unified: Manually add corresponding classes --- .../lib/codeql/unified/internal/AstExtra.qll | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/unified/ql/lib/codeql/unified/internal/AstExtra.qll b/unified/ql/lib/codeql/unified/internal/AstExtra.qll index 64ab0262ea56..3b059389e8cd 100644 --- a/unified/ql/lib/codeql/unified/internal/AstExtra.qll +++ b/unified/ql/lib/codeql/unified/internal/AstExtra.qll @@ -6,6 +6,31 @@ private import unified private import codeql.unified.internal.NameBindingPlugin module Public { + /** A plain assignment expression. */ + class AssignExpr extends BinaryExpr { + AssignExpr() { this.getOperator().getValue() = "=" } + + /** Gets the target of this assignment. */ + Expr getTarget() { result = this.getLeft() } + + /** Gets the value assigned by this assignment. */ + Expr getValue() { result = this.getRight() } + } + + /** A compound assignment expression. */ + class CompoundAssignExpr extends BinaryExpr { + CompoundAssignExpr() { + this.getOperator().getValue() = + ["+=", "-=", "*=", "/=", "%=", "<<=", ">>=", "&=", "|=", "^=", "&+=", "&-=", "&*="] + } + + /** Gets the target of this assignment. */ + Expr getTarget() { result = this.getLeft() } + + /** Gets the value assigned by this assignment. */ + Expr getValue() { result = this.getRight() } + } + /** A short-circuiting logical AND expression. */ class LogicalAndExpr extends BinaryExpr { LogicalAndExpr() { this.getOperator().getValue() = "&&" } From f8344191c9c8a21c9d41e5bd580b9262a038fe53 Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 16 Sep 2026 13:03:11 +0200 Subject: [PATCH 1083/2098] unified: Add union type and update CFG --- .../lib/codeql/unified/internal/AstExtra.qll | 27 ++++++++++++------- .../unified/internal/ControlFlowGraph.qll | 21 ++++++++------- 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/AstExtra.qll b/unified/ql/lib/codeql/unified/internal/AstExtra.qll index 3b059389e8cd..486fb16ad3e5 100644 --- a/unified/ql/lib/codeql/unified/internal/AstExtra.qll +++ b/unified/ql/lib/codeql/unified/internal/AstExtra.qll @@ -6,29 +6,36 @@ private import unified private import codeql.unified.internal.NameBindingPlugin module Public { + /** An assignment, possibly a compound assignment. */ + abstract class AssignmentImpl extends BinaryExpr { + /** Gets the target of this assignment. */ + abstract Expr getTarget(); + + /** Gets the value assigned by this assignment. */ + abstract Expr getValue(); + } + + final class Assignment = AssignmentImpl; + /** A plain assignment expression. */ - class AssignExpr extends BinaryExpr { + final class AssignExpr extends BinaryExpr, AssignmentImpl { AssignExpr() { this.getOperator().getValue() = "=" } - /** Gets the target of this assignment. */ - Expr getTarget() { result = this.getLeft() } + override Expr getTarget() { result = this.getLeft() } - /** Gets the value assigned by this assignment. */ - Expr getValue() { result = this.getRight() } + override Expr getValue() { result = this.getRight() } } /** A compound assignment expression. */ - class CompoundAssignExpr extends BinaryExpr { + final class CompoundAssignExpr extends BinaryExpr, AssignmentImpl { CompoundAssignExpr() { this.getOperator().getValue() = ["+=", "-=", "*=", "/=", "%=", "<<=", ">>=", "&=", "|=", "^=", "&+=", "&-=", "&*="] } - /** Gets the target of this assignment. */ - Expr getTarget() { result = this.getLeft() } + override Expr getTarget() { result = this.getLeft() } - /** Gets the value assigned by this assignment. */ - Expr getValue() { result = this.getRight() } + override Expr getValue() { result = this.getRight() } } /** A short-circuiting logical AND expression. */ diff --git a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll index 019722484d1a..157c6794ff51 100644 --- a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll @@ -196,20 +196,23 @@ private module Ast implements AstSig { class LogicalNotExpr = U::LogicalNotExpr; - // TODO - class Assignment extends BinaryExpr { - Assignment() { none() } - } + class Assignment extends BinaryExpr, U::Assignment { } - class AssignExpr extends Assignment { } + class AssignExpr extends Assignment, U::AssignExpr { } - class CompoundAssignment extends Assignment { } + class CompoundAssignment extends Assignment, U::CompoundAssignExpr { } - class AssignLogicalAndExpr extends CompoundAssignment { } + class AssignLogicalAndExpr extends CompoundAssignment { + AssignLogicalAndExpr() { this.getOperator().getValue() = "&&=" } + } - class AssignLogicalOrExpr extends CompoundAssignment { } + class AssignLogicalOrExpr extends CompoundAssignment { + AssignLogicalOrExpr() { this.getOperator().getValue() = "||=" } + } - class AssignNullCoalescingExpr extends CompoundAssignment { } + class AssignNullCoalescingExpr extends CompoundAssignment { + AssignNullCoalescingExpr() { this.getOperator().getValue() = "??=" } + } class BooleanLiteral extends U::BooleanLiteral { boolean getValue() { result.toString() = super.getValue() } From 4ce663aec0976608bf34e71a76d891ca110d135c Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 17 Sep 2026 13:00:40 +0200 Subject: [PATCH 1084/2098] unified: Update CFG test output after rename --- .../controlflow/basicblock-slices.expected | 86 +++++++++---------- .../library-tests/controlflow/cfg.expected | 16 ++-- .../test/library-tests/controlflow/cfg.swift | 16 ++-- 3 files changed, 59 insertions(+), 59 deletions(-) diff --git a/unified/ql/test/library-tests/controlflow/basicblock-slices.expected b/unified/ql/test/library-tests/controlflow/basicblock-slices.expected index c9d14ccd1af7..50824aa38bc2 100644 --- a/unified/ql/test/library-tests/controlflow/basicblock-slices.expected +++ b/unified/ql/test/library-tests/controlflow/basicblock-slices.expected @@ -72,10 +72,10 @@ | 84 | cfg.swift:84:3:84:15 | VariableDeclaration | 'VariableDeclaration -V temp -> 10' | | 86 | cfg.swift:86:3:88:3 | FunctionDeclaration | 'FunctionDeclaration' | | 86 | cfg.swift:86:12:86:12 | a | 'a -^ Block' | -| 87 | cfg.swift:87:5:87:5 | a | 'a -> a -> + -> 1 -^ BinaryExpr -^ AssignExpr' | +| 87 | cfg.swift:87:5:87:5 | a | 'a -> = -> a -> + -> 1 -^ BinaryExpr -^ BinaryExpr' | | 90 | cfg.swift:90:3:92:3 | FunctionDeclaration | 'FunctionDeclaration' | | 90 | cfg.swift:90:20:90:20 | a | 'a -^ Block' | -| 91 | cfg.swift:91:5:91:5 | a | 'a -> nil -^ AssignExpr' | +| 91 | cfg.swift:91:5:91:5 | a | 'a -> = -> nil -^ BinaryExpr' | | 94 | cfg.swift:94:3:94:5 | add | 'add -> Argument -V -^ CallExpr' | | 95 | cfg.swift:95:3:95:30 | VariableDeclaration | 'VariableDeclaration -V tempOptional -> Optional -V Int -^ GenericTypeExpr -> 10' | | 96 | cfg.swift:96:3:96:13 | addOptional | 'addOptional -> Argument -V -^ CallExpr' | @@ -84,7 +84,7 @@ | 101 | cfg.swift:101:3:101:16 | VariableDeclaration | 'VariableDeclaration -V myInt -> Int' | | 102 | cfg.swift:102:3:104:3 | ConstructorDeclaration | 'ConstructorDeclaration' | | 102 | cfg.swift:102:8:102:8 | n | 'n -^ Block' | -| 103 | cfg.swift:103:5:103:9 | myInt | 'myInt -> n -^ AssignExpr' | +| 103 | cfg.swift:103:5:103:9 | myInt | 'myInt -> = -> n -^ BinaryExpr' | | 106 | cfg.swift:106:3:108:3 | Block | 'Block' | | 106 | cfg.swift:106:3:108:3 | FunctionDeclaration | 'FunctionDeclaration' | | 107 | cfg.swift:107:12:107:16 | myInt | 'myInt -^ ReturnExpr' | @@ -155,10 +155,10 @@ | 207 | cfg.swift:207:9:207:9 | x | 'x -^ Block' | | 208 | cfg.swift:208:3:213:3 | IfExpr | 'IfExpr -V x -> < -> 0 -^ BinaryExpr' | | 208 | cfg.swift:208:12:213:3 | Block | 'Block' | -| 209 | cfg.swift:209:5:209:5 | x | 'x -> x -? - -^ UnaryExpr -^ AssignExpr' | +| 209 | cfg.swift:209:5:209:5 | x | 'x -> = -> x -? - -^ UnaryExpr -^ BinaryExpr' | | 210 | cfg.swift:210:5:212:5 | IfExpr | 'IfExpr -V x -> > -> 10 -^ BinaryExpr' | | 210 | cfg.swift:210:15:212:5 | Block | 'Block' | -| 211 | cfg.swift:211:7:211:7 | x | 'x -> x -> - -> 1 -^ BinaryExpr -^ AssignExpr' | +| 211 | cfg.swift:211:7:211:7 | x | 'x -> = -> x -> - -> 1 -^ BinaryExpr -^ BinaryExpr' | | 214 | cfg.swift:214:10:214:10 | x | 'x -^ ReturnExpr' | | 217 | cfg.swift:217:1:223:1 | FunctionDeclaration | 'FunctionDeclaration' | | 217 | cfg.swift:217:10:217:11 | b1 | 'b1 -> b2 -> b3 -^ Block' | @@ -217,30 +217,30 @@ | 279 | cfg.swift:279:1:310:1 | Block | 'Block' | | 279 | cfg.swift:279:1:310:1 | FunctionDeclaration | 'FunctionDeclaration' | | 280 | cfg.swift:280:3:280:44 | VariableDeclaration | 'VariableDeclaration -V a -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -^ ArrayLiteral' | -| 281 | cfg.swift:281:3:281:3 | a | 'a -> Argument -V 0 -^ CallExpr -> 0 -^ AssignExpr' | -| 282 | cfg.swift:282:3:282:3 | a | 'a -> Argument -V 1 -^ CallExpr -> += -> 1 -^ CompoundAssignExpr' | -| 283 | cfg.swift:283:3:283:3 | a | 'a -> Argument -V 2 -^ CallExpr -> -= -> 1 -^ CompoundAssignExpr' | -| 284 | cfg.swift:284:3:284:3 | a | 'a -> Argument -V 3 -^ CallExpr -> *= -> 1 -^ CompoundAssignExpr' | -| 285 | cfg.swift:285:3:285:3 | a | 'a -> Argument -V 4 -^ CallExpr -> /= -> 1 -^ CompoundAssignExpr' | -| 286 | cfg.swift:286:3:286:3 | a | 'a -> Argument -V 5 -^ CallExpr -> %= -> 1 -^ CompoundAssignExpr' | -| 287 | cfg.swift:287:3:287:3 | a | 'a -> Argument -V 6 -^ CallExpr -> &= -> 1 -^ CompoundAssignExpr' | -| 288 | cfg.swift:288:3:288:3 | a | 'a -> Argument -V 7 -^ CallExpr -> \|= -> 1 -^ CompoundAssignExpr' | -| 289 | cfg.swift:289:3:289:3 | a | 'a -> Argument -V 8 -^ CallExpr -> ^= -> 1 -^ CompoundAssignExpr' | -| 290 | cfg.swift:290:3:290:3 | a | 'a -> Argument -V 9 -^ CallExpr -> <<= -> 1 -^ CompoundAssignExpr' | -| 291 | cfg.swift:291:3:291:3 | a | 'a -> Argument -V 10 -^ CallExpr -> >>= -> 1 -^ CompoundAssignExpr' | +| 281 | cfg.swift:281:3:281:3 | a | 'a -> Argument -V 0 -^ CallExpr -> = -> 0 -^ BinaryExpr' | +| 282 | cfg.swift:282:3:282:3 | a | 'a -> Argument -V 1 -^ CallExpr -> += -> 1 -^ BinaryExpr' | +| 283 | cfg.swift:283:3:283:3 | a | 'a -> Argument -V 2 -^ CallExpr -> -= -> 1 -^ BinaryExpr' | +| 284 | cfg.swift:284:3:284:3 | a | 'a -> Argument -V 3 -^ CallExpr -> *= -> 1 -^ BinaryExpr' | +| 285 | cfg.swift:285:3:285:3 | a | 'a -> Argument -V 4 -^ CallExpr -> /= -> 1 -^ BinaryExpr' | +| 286 | cfg.swift:286:3:286:3 | a | 'a -> Argument -V 5 -^ CallExpr -> %= -> 1 -^ BinaryExpr' | +| 287 | cfg.swift:287:3:287:3 | a | 'a -> Argument -V 6 -^ CallExpr -> &= -> 1 -^ BinaryExpr' | +| 288 | cfg.swift:288:3:288:3 | a | 'a -> Argument -V 7 -^ CallExpr -> \|= -> 1 -^ BinaryExpr' | +| 289 | cfg.swift:289:3:289:3 | a | 'a -> Argument -V 8 -^ CallExpr -> ^= -> 1 -^ BinaryExpr' | +| 290 | cfg.swift:290:3:290:3 | a | 'a -> Argument -V 9 -^ CallExpr -> <<= -> 1 -^ BinaryExpr' | +| 291 | cfg.swift:291:3:291:3 | a | 'a -> Argument -V 10 -^ CallExpr -> >>= -> 1 -^ BinaryExpr' | | 293 | cfg.swift:293:3:293:49 | VariableDeclaration | 'VariableDeclaration -V tupleWithA -> Argument -V a -> Argument -V 0 -^ CallExpr -> Argument -V a -> Argument -V 1 -^ CallExpr -> Argument -V a -> Argument -V 2 -^ CallExpr -> Argument -V a -> Argument -V 3 -^ CallExpr -> Argument -V a -> Argument -V 4 -^ CallExpr -^ TupleExpr' | | 295 | cfg.swift:295:3:295:48 | VariableDeclaration | 'VariableDeclaration -V b -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -> 11 -^ ArrayLiteral' | -| 296 | cfg.swift:296:3:296:3 | b | 'b -> Argument -V 0 -^ CallExpr -> a -> Argument -V 10 -^ CallExpr -^ AssignExpr' | -| 297 | cfg.swift:297:3:297:3 | b | 'b -> Argument -V 1 -^ CallExpr -> b -> Argument -V 0 -^ CallExpr -> + -> 1 -^ BinaryExpr -^ AssignExpr' | -| 298 | cfg.swift:298:3:298:3 | b | 'b -> Argument -V 2 -^ CallExpr -> b -> Argument -V 1 -^ CallExpr -> - -> 1 -^ BinaryExpr -^ AssignExpr' | -| 299 | cfg.swift:299:3:299:3 | b | 'b -> Argument -V 3 -^ CallExpr -> b -> Argument -V 2 -^ CallExpr -> * -> 1 -^ BinaryExpr -^ AssignExpr' | -| 300 | cfg.swift:300:3:300:3 | b | 'b -> Argument -V 4 -^ CallExpr -> b -> Argument -V 3 -^ CallExpr -> / -> 1 -^ BinaryExpr -^ AssignExpr' | -| 301 | cfg.swift:301:3:301:3 | b | 'b -> Argument -V 5 -^ CallExpr -> b -> Argument -V 4 -^ CallExpr -> % -> 1 -^ BinaryExpr -^ AssignExpr' | -| 302 | cfg.swift:302:3:302:3 | b | 'b -> Argument -V 6 -^ CallExpr -> b -> Argument -V 5 -^ CallExpr -> & -> 1 -^ BinaryExpr -^ AssignExpr' | -| 303 | cfg.swift:303:3:303:3 | b | 'b -> Argument -V 7 -^ CallExpr -> b -> Argument -V 6 -^ CallExpr -> \| -> 1 -^ BinaryExpr -^ AssignExpr' | -| 304 | cfg.swift:304:3:304:3 | b | 'b -> Argument -V 8 -^ CallExpr -> b -> Argument -V 7 -^ CallExpr -> ^ -> 1 -^ BinaryExpr -^ AssignExpr' | -| 305 | cfg.swift:305:3:305:3 | b | 'b -> Argument -V 9 -^ CallExpr -> b -> Argument -V 8 -^ CallExpr -> << -> 1 -^ BinaryExpr -^ AssignExpr' | -| 306 | cfg.swift:306:3:306:3 | b | 'b -> Argument -V 10 -^ CallExpr -> b -> Argument -V 9 -^ CallExpr -> >> -> 1 -^ BinaryExpr -^ AssignExpr' | +| 296 | cfg.swift:296:3:296:3 | b | 'b -> Argument -V 0 -^ CallExpr -> = -> a -> Argument -V 10 -^ CallExpr -^ BinaryExpr' | +| 297 | cfg.swift:297:3:297:3 | b | 'b -> Argument -V 1 -^ CallExpr -> = -> b -> Argument -V 0 -^ CallExpr -> + -> 1 -^ BinaryExpr -^ BinaryExpr' | +| 298 | cfg.swift:298:3:298:3 | b | 'b -> Argument -V 2 -^ CallExpr -> = -> b -> Argument -V 1 -^ CallExpr -> - -> 1 -^ BinaryExpr -^ BinaryExpr' | +| 299 | cfg.swift:299:3:299:3 | b | 'b -> Argument -V 3 -^ CallExpr -> = -> b -> Argument -V 2 -^ CallExpr -> * -> 1 -^ BinaryExpr -^ BinaryExpr' | +| 300 | cfg.swift:300:3:300:3 | b | 'b -> Argument -V 4 -^ CallExpr -> = -> b -> Argument -V 3 -^ CallExpr -> / -> 1 -^ BinaryExpr -^ BinaryExpr' | +| 301 | cfg.swift:301:3:301:3 | b | 'b -> Argument -V 5 -^ CallExpr -> = -> b -> Argument -V 4 -^ CallExpr -> % -> 1 -^ BinaryExpr -^ BinaryExpr' | +| 302 | cfg.swift:302:3:302:3 | b | 'b -> Argument -V 6 -^ CallExpr -> = -> b -> Argument -V 5 -^ CallExpr -> & -> 1 -^ BinaryExpr -^ BinaryExpr' | +| 303 | cfg.swift:303:3:303:3 | b | 'b -> Argument -V 7 -^ CallExpr -> = -> b -> Argument -V 6 -^ CallExpr -> \| -> 1 -^ BinaryExpr -^ BinaryExpr' | +| 304 | cfg.swift:304:3:304:3 | b | 'b -> Argument -V 8 -^ CallExpr -> = -> b -> Argument -V 7 -^ CallExpr -> ^ -> 1 -^ BinaryExpr -^ BinaryExpr' | +| 305 | cfg.swift:305:3:305:3 | b | 'b -> Argument -V 9 -^ CallExpr -> = -> b -> Argument -V 8 -^ CallExpr -> << -> 1 -^ BinaryExpr -^ BinaryExpr' | +| 306 | cfg.swift:306:3:306:3 | b | 'b -> Argument -V 10 -^ CallExpr -> = -> b -> Argument -V 9 -^ CallExpr -> >> -> 1 -^ BinaryExpr -^ BinaryExpr' | | 308 | cfg.swift:308:3:308:39 | VariableDeclaration | 'VariableDeclaration -V Argument -V a1 -> Argument -V a2 -> Argument -V a3 -> Argument -V a4 -> Argument -V a5 -^ TupleExpr -> tupleWithA' | | 309 | cfg.swift:309:11:309:20 | Argument | 'Argument -V a1 -> + -> b -> Argument -V 0 -^ CallExpr -^ BinaryExpr -> Argument -V a2 -> + -> b -> Argument -V 1 -^ CallExpr -^ BinaryExpr -> Argument -V a3 -> + -> b -> Argument -V 2 -^ CallExpr -^ BinaryExpr -> Argument -V a4 -> + -> b -> Argument -V 3 -^ CallExpr -^ BinaryExpr -> Argument -V a5 -> + -> b -> Argument -V 4 -^ CallExpr -^ BinaryExpr -^ TupleExpr -^ ReturnExpr' | | 312 | cfg.swift:312:1:317:1 | FunctionDeclaration | 'FunctionDeclaration' | @@ -249,14 +249,14 @@ | 313 | cfg.swift:313:9:313:9 | x | 'x -> >= -> 0 -^ BinaryExpr' | | 313 | cfg.swift:313:16:316:3 | Block | 'Block' | | 314 | cfg.swift:314:5:314:9 | print | 'print -> Argument -V x -^ CallExpr' | -| 315 | cfg.swift:315:5:315:5 | x | 'x -> -= -> 1 -^ CompoundAssignExpr' | +| 315 | cfg.swift:315:5:315:5 | x | 'x -> -= -> 1 -^ BinaryExpr' | | 319 | cfg.swift:319:1:332:1 | FunctionDeclaration | 'FunctionDeclaration' | | 319 | cfg.swift:319:12:319:12 | x | 'x -^ Block' | | 320 | cfg.swift:320:3:330:3 | WhileStmt | 'WhileStmt' | | 320 | cfg.swift:320:9:320:9 | x | 'x -> >= -> 0 -^ BinaryExpr' | | 320 | cfg.swift:320:16:330:3 | Block | 'Block' | | 321 | cfg.swift:321:5:321:9 | print | 'print -> Argument -V x -^ CallExpr' | -| 322 | cfg.swift:322:5:322:5 | x | 'x -> -= -> 1 -^ CompoundAssignExpr' | +| 322 | cfg.swift:322:5:322:5 | x | 'x -> -= -> 1 -^ BinaryExpr' | | 323 | cfg.swift:323:5:328:5 | IfExpr | 'IfExpr -V x -> > -> 100 -^ BinaryExpr' | | 323 | cfg.swift:323:16:325:5 | Block | 'Block' | | 324 | cfg.swift:324:7:324:11 | BreakExpr | 'BreakExpr' | @@ -274,7 +274,7 @@ | 336 | cfg.swift:336:18:336:18 | x | 'x -> >= -> 0 -^ BinaryExpr' | | 336 | cfg.swift:336:25:346:5 | Block | 'Block' | | 337 | cfg.swift:337:7:337:11 | print | 'print -> Argument -V x -^ CallExpr' | -| 338 | cfg.swift:338:7:338:7 | x | 'x -> -= -> 1 -^ CompoundAssignExpr' | +| 338 | cfg.swift:338:7:338:7 | x | 'x -> -= -> 1 -^ BinaryExpr' | | 339 | cfg.swift:339:7:344:7 | IfExpr | 'IfExpr -V x -> > -> 100 -^ BinaryExpr' | | 339 | cfg.swift:339:18:341:7 | Block | 'Block' | | 340 | cfg.swift:340:9:340:19 | BreakExpr | 'BreakExpr' | @@ -288,7 +288,7 @@ | 352 | cfg.swift:352:3:355:16 | DoWhileStmt | 'DoWhileStmt' | | 352 | cfg.swift:352:10:355:3 | Block | 'Block' | | 353 | cfg.swift:353:5:353:9 | print | 'print -> Argument -V x -^ CallExpr' | -| 354 | cfg.swift:354:5:354:5 | x | 'x -> -= -> 1 -^ CompoundAssignExpr' | +| 354 | cfg.swift:354:5:354:5 | x | 'x -> -= -> 1 -^ BinaryExpr' | | 355 | cfg.swift:355:11:355:11 | x | 'x -> >= -> 0 -^ BinaryExpr' | | 358 | cfg.swift:358:1:363:1 | Block | 'Block' | | 358 | cfg.swift:358:1:363:1 | FunctionDeclaration | 'FunctionDeclaration' | @@ -296,12 +296,12 @@ | 360 | cfg.swift:360:3:362:3 | WhileStmt | 'WhileStmt' | | 360 | cfg.swift:360:9:360:9 | x | 'x -> < -> 10 -^ BinaryExpr' | | 360 | cfg.swift:360:17:362:3 | Block | 'Block' | -| 361 | cfg.swift:361:5:361:5 | x | 'x -> += -> 1 -^ CompoundAssignExpr' | +| 361 | cfg.swift:361:5:361:5 | x | 'x -> += -> 1 -^ BinaryExpr' | | 365 | cfg.swift:365:1:374:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V OptionalC' | | 366 | cfg.swift:366:3:366:11 | VariableDeclaration | 'VariableDeclaration -V c -> Optional -V C -^ GenericTypeExpr' | | 367 | cfg.swift:367:3:369:3 | ConstructorDeclaration | 'ConstructorDeclaration' | | 367 | cfg.swift:367:8:367:10 | arg | 'arg -^ Block' | -| 368 | cfg.swift:368:5:368:5 | c | 'c -> arg -^ AssignExpr' | +| 368 | cfg.swift:368:5:368:5 | c | 'c -> = -> arg -^ BinaryExpr' | | 371 | cfg.swift:371:3:373:3 | Block | 'Block' | | 371 | cfg.swift:371:3:373:3 | FunctionDeclaration | 'FunctionDeclaration' | | 372 | cfg.swift:372:12:372:12 | c | 'c -^ ReturnExpr' | @@ -333,10 +333,10 @@ | 407 | cfg.swift:407:3:407:16 | VariableDeclaration | 'VariableDeclaration -V field -> Int' | | 408 | cfg.swift:408:3:410:3 | Block | 'Block' | | 408 | cfg.swift:408:3:410:3 | ConstructorDeclaration | 'ConstructorDeclaration' | -| 409 | cfg.swift:409:5:409:9 | field | 'field -> 10 -^ AssignExpr' | +| 409 | cfg.swift:409:5:409:9 | field | 'field -> = -> 10 -^ BinaryExpr' | | 412 | cfg.swift:412:3:414:3 | Block | 'Block' | | 412 | cfg.swift:412:3:414:3 | DestructorDeclaration | 'DestructorDeclaration' | -| 413 | cfg.swift:413:5:413:9 | field | 'field -> 0 -^ AssignExpr' | +| 413 | cfg.swift:413:5:413:9 | field | 'field -> = -> 0 -^ BinaryExpr' | | 417 | cfg.swift:417:1:419:1 | FunctionDeclaration | 'FunctionDeclaration' | | 417 | cfg.swift:417:24:417:24 | x | 'x -> y -^ Block' | | 418 | cfg.swift:418:10:418:25 | MapLiteral | 'MapLiteral -^ ReturnExpr' | @@ -346,12 +346,12 @@ | 423 | cfg.swift:423:5:423:14 | VariableDeclaration | 'VariableDeclaration -V x -> Int' | | 424 | cfg.swift:424:5:426:5 | Block | 'Block' | | 424 | cfg.swift:424:5:426:5 | ConstructorDeclaration | 'ConstructorDeclaration' | -| 425 | cfg.swift:425:7:425:7 | x | 'x -> 10 -^ AssignExpr' | +| 425 | cfg.swift:425:7:425:7 | x | 'x -> = -> 10 -^ BinaryExpr' | | 429 | cfg.swift:429:3:434:3 | ClassLikeDeclaration | 'ClassLikeDeclaration -V MyLocalStruct' | | 430 | cfg.swift:430:5:430:14 | VariableDeclaration | 'VariableDeclaration -V x -> Int' | | 431 | cfg.swift:431:5:433:5 | Block | 'Block' | | 431 | cfg.swift:431:5:433:5 | ConstructorDeclaration | 'ConstructorDeclaration' | -| 432 | cfg.swift:432:7:432:7 | x | 'x -> 10 -^ AssignExpr' | +| 432 | cfg.swift:432:7:432:7 | x | 'x -> = -> 10 -^ BinaryExpr' | | 436 | cfg.swift:436:3:439:3 | ClassLikeDeclaration | 'ClassLikeDeclaration -V MyLocalEnum' | | 437 | cfg.swift:437:10:437:10 | VariableDeclaration | 'VariableDeclaration -V A' | | 438 | cfg.swift:438:10:438:10 | VariableDeclaration | 'VariableDeclaration -V B' | @@ -386,19 +386,19 @@ | 498 | cfg.swift:498:3:498:11 | VariableDeclaration | 'VariableDeclaration -V x -> 0' | | 500 | cfg.swift:500:3:502:3 | IfExpr | 'IfExpr -V ' | | 500 | cfg.swift:500:30:502:3 | Block | 'Block' | -| 501 | cfg.swift:501:5:501:5 | x | 'x -> += -> 1 -^ CompoundAssignExpr' | +| 501 | cfg.swift:501:5:501:5 | x | 'x -> += -> 1 -^ BinaryExpr' | | 504 | cfg.swift:504:3:506:3 | IfExpr | 'IfExpr -V ' | | 504 | cfg.swift:504:33:506:3 | Block | 'Block' | -| 505 | cfg.swift:505:5:505:5 | x | 'x -> += -> 1 -^ CompoundAssignExpr' | +| 505 | cfg.swift:505:5:505:5 | x | 'x -> += -> 1 -^ BinaryExpr' | | 508 | cfg.swift:508:3:510:3 | IfExpr | 'IfExpr -V ' | | 508 | cfg.swift:508:49:510:3 | Block | 'Block' | -| 509 | cfg.swift:509:5:509:5 | x | 'x -> += -> 1 -^ CompoundAssignExpr' | +| 509 | cfg.swift:509:5:509:5 | x | 'x -> += -> 1 -^ BinaryExpr' | | 512 | cfg.swift:512:3:514:3 | GuardIfStmt | 'GuardIfStmt -V -> Block' | -| 513 | cfg.swift:513:5:513:5 | x | 'x -> += -> 1 -^ CompoundAssignExpr' | +| 513 | cfg.swift:513:5:513:5 | x | 'x -> += -> 1 -^ BinaryExpr' | | 516 | cfg.swift:516:3:519:3 | IfExpr | 'IfExpr -V BinaryExpr -V ' | | 517 | cfg.swift:517:7:517:27 | | '' | | 517 | cfg.swift:517:29:519:3 | Block | 'Block' | -| 518 | cfg.swift:518:5:518:5 | x | 'x -> += -> 1 -^ CompoundAssignExpr' | +| 518 | cfg.swift:518:5:518:5 | x | 'x -> += -> 1 -^ BinaryExpr' | | 521 | cfg.swift:521:10:521:10 | x | 'x -^ ReturnExpr' | | 524 | cfg.swift:524:1:538:1 | Block | 'Block' | | 524 | cfg.swift:524:1:538:1 | FunctionDeclaration | 'FunctionDeclaration' | @@ -467,4 +467,4 @@ | 600 | cfg.swift:600:36:600:40 | value | 'value -^ Block' | | 601 | cfg.swift:601:5:601:13 | VariableDeclaration | 'VariableDeclaration -V x -> N' | | 602 | cfg.swift:602:5:602:9 | print | 'print -> Argument -V x -^ CallExpr' | -| 603 | cfg.swift:603:5:603:5 | _ | '_ -> value -^ AssignExpr' | +| 603 | cfg.swift:603:5:603:5 | _ | '_ -> = -> value -^ BinaryExpr' | diff --git a/unified/ql/test/library-tests/controlflow/cfg.expected b/unified/ql/test/library-tests/controlflow/cfg.expected index cf0b25228239..d5b76b70bd47 100644 --- a/unified/ql/test/library-tests/controlflow/cfg.expected +++ b/unified/ql/test/library-tests/controlflow/cfg.expected @@ -40,7 +40,7 @@ bbStep | cfg.swift:208:6:208:10 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | | cfg.swift:210:8:210:13 | BinaryExpr | 'BinaryExpr : false -> x(+4)' | | cfg.swift:210:8:210:13 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | -| cfg.swift:211:7:211:15 | AssignExpr | 'AssignExpr : successor -> x(+3)' | +| cfg.swift:211:7:211:15 | BinaryExpr | 'BinaryExpr : successor -> x(+3)' | | cfg.swift:218:11:218:12 | b1 | 'b1 : false -> b3(+2)' | | cfg.swift:218:11:218:12 | b1 | 'b1 : true -> b2(+1)' | | cfg.swift:219:13:219:14 | b2 | 'b2 : false,false -> "!b2 \|\| !b3"(+3)' | @@ -63,7 +63,7 @@ bbStep | cfg.swift:251:13:251:14 | b2 | 'b2 : true,true -> Block(+0)' | | cfg.swift:313:3:313:3 | WhileStmt | 'WhileStmt : successor -> x(+0)' | | cfg.swift:313:9:313:14 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | -| cfg.swift:315:5:315:10 | CompoundAssignExpr | 'CompoundAssignExpr : successor -> x(-2)' | +| cfg.swift:315:5:315:10 | BinaryExpr | 'BinaryExpr : successor -> x(-2)' | | cfg.swift:320:3:320:3 | WhileStmt | 'WhileStmt : successor -> x(+0)' | | cfg.swift:320:9:320:14 | BinaryExpr | 'BinaryExpr : false -> print(+11)' | | cfg.swift:320:9:320:14 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | @@ -90,22 +90,22 @@ bbStep | cfg.swift:355:11:355:16 | BinaryExpr | 'BinaryExpr : true -> Block(-3)' | | cfg.swift:360:3:360:3 | WhileStmt | 'WhileStmt : successor -> x(+0)' | | cfg.swift:360:9:360:14 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | -| cfg.swift:361:5:361:10 | CompoundAssignExpr | 'CompoundAssignExpr : successor -> x(-1)' | +| cfg.swift:361:5:361:10 | BinaryExpr | 'BinaryExpr : successor -> x(-1)' | | cfg.swift:398:9:398:24 | CallExpr | 'CallExpr : successor -> try(+0)' | | cfg.swift:500:6:500:28 | | ' : false -> IfExpr(+4)' | | cfg.swift:500:6:500:28 | | ' : true -> Block(+0)' | -| cfg.swift:501:5:501:10 | CompoundAssignExpr | 'CompoundAssignExpr : successor -> IfExpr(+3)' | +| cfg.swift:501:5:501:10 | BinaryExpr | 'BinaryExpr : successor -> IfExpr(+3)' | | cfg.swift:504:6:504:31 | | ' : false -> IfExpr(+4)' | | cfg.swift:504:6:504:31 | | ' : true -> Block(+0)' | -| cfg.swift:505:5:505:10 | CompoundAssignExpr | 'CompoundAssignExpr : successor -> IfExpr(+3)' | +| cfg.swift:505:5:505:10 | BinaryExpr | 'BinaryExpr : successor -> IfExpr(+3)' | | cfg.swift:508:6:508:47 | | ' : false -> GuardIfStmt(+4)' | | cfg.swift:508:6:508:47 | | ' : true -> Block(+0)' | -| cfg.swift:509:5:509:10 | CompoundAssignExpr | 'CompoundAssignExpr : successor -> GuardIfStmt(+3)' | +| cfg.swift:509:5:509:10 | BinaryExpr | 'BinaryExpr : successor -> GuardIfStmt(+3)' | | cfg.swift:516:6:516:28 | | ' : false,false -> x(+5)' | | cfg.swift:516:6:516:28 | | ' : true -> (+1)' | | cfg.swift:517:7:517:27 | | ' : false,false -> x(+4)' | | cfg.swift:517:7:517:27 | | ' : true -> Block(+0)' | -| cfg.swift:518:5:518:10 | CompoundAssignExpr | 'CompoundAssignExpr : successor -> x(+3)' | +| cfg.swift:518:5:518:10 | BinaryExpr | 'BinaryExpr : successor -> x(+3)' | | cfg.swift:528:26:528:32 | BinaryExpr | 'BinaryExpr : empty -> continuation(+3)' | | cfg.swift:528:26:528:32 | BinaryExpr | 'BinaryExpr : non-empty -> i(+0)' | | cfg.swift:529:21:529:41 | CallExpr | 'CallExpr : successor -> continuation(+2)' | @@ -158,7 +158,7 @@ noCfg nonSimple | cfg.swift:10:1:10:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V MyError -^ BaseType -V Error' | | cfg.swift:35:5:35:5 | CatchClause | 'CatchClause -V MyError -^ MemberAccessExpr -> isZero -> Argument -V x -^ CallExpr -? MyError -^ MemberAccessExpr -^ ConditionalPattern -^ OrPattern' | -| cfg.swift:209:5:209:5 | x | 'x -> x -? - -^ UnaryExpr -^ AssignExpr' | +| cfg.swift:209:5:209:5 | x | 'x -> = -> x -? - -^ UnaryExpr -^ BinaryExpr' | | cfg.swift:390:1:390:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V Derived -^ BaseType -V C' | | cfg.swift:527:13:527:16 | Task | 'Task -^ MemberAccessExpr -^ Argument -V FunctionExpr -^ CallExpr' | | cfg.swift:569:1:569:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V MyProcotolImpl -^ BaseType -V MyProtocol' | diff --git a/unified/ql/test/library-tests/controlflow/cfg.swift b/unified/ql/test/library-tests/controlflow/cfg.swift index e8bb40e33f8e..c7c96c1f1716 100644 --- a/unified/ql/test/library-tests/controlflow/cfg.swift +++ b/unified/ql/test/library-tests/controlflow/cfg.swift @@ -206,9 +206,9 @@ func m2(b : Bool) -> Int { func m3(x : inout Int) -> Int { if x < 0 { // $ bbStep='BinaryExpr : true -> Block(+0)' bbStep='BinaryExpr : false -> x(+6)' - x = -x // $ nonSimple='x -> x -? - -^ UnaryExpr -^ AssignExpr' + x = -x // $ nonSimple='x -> = -> x -? - -^ UnaryExpr -^ BinaryExpr' if x > 10 { // $ bbStep='BinaryExpr : true -> Block(+0)' bbStep='BinaryExpr : false -> x(+4)' - x = x - 1 // $ bbStep='AssignExpr : successor -> x(+3)' + x = x - 1 // $ bbStep='BinaryExpr : successor -> x(+3)' } } return x @@ -312,7 +312,7 @@ func testSubscriptExpr() -> (Int, Int, Int, Int, Int) { // $ noCfg func loop1(x : inout Int) { while x >= 0 { // $ bbStep='WhileStmt : successor -> x(+0)' bbStep='BinaryExpr : true -> Block(+0)' print(x) - x -= 1 // $ bbStep='CompoundAssignExpr : successor -> x(-2)' + x -= 1 // $ bbStep='BinaryExpr : successor -> x(-2)' } } @@ -358,7 +358,7 @@ func testRepeat(x : inout Int) { func loop_with_identity_expr() { // $ noCfg var x = 0 while(x < 10) { // $ bbStep='WhileStmt : successor -> x(+0)' bbStep='BinaryExpr : true -> Block(+0)' - x += 1 // $ bbStep='CompoundAssignExpr : successor -> x(-1)' + x += 1 // $ bbStep='BinaryExpr : successor -> x(-1)' } } @@ -498,15 +498,15 @@ func testAvailable() -> Int { // $ noCfg var x = 0; if #available(macOS 10, *) { // $ bbStep=' : false -> IfExpr(+4)' bbStep=' : true -> Block(+0)' - x += 1 // $ bbStep='CompoundAssignExpr : successor -> IfExpr(+3)' + x += 1 // $ bbStep='BinaryExpr : successor -> IfExpr(+3)' } if #available(macOS 10.13, *) { // $ bbStep=' : false -> IfExpr(+4)' bbStep=' : true -> Block(+0)' - x += 1 // $ bbStep='CompoundAssignExpr : successor -> IfExpr(+3)' + x += 1 // $ bbStep='BinaryExpr : successor -> IfExpr(+3)' } if #unavailable(iOS 10, watchOS 10, macOS 10) { // $ bbStep=' : false -> GuardIfStmt(+4)' bbStep=' : true -> Block(+0)' - x += 1 // $ bbStep='CompoundAssignExpr : successor -> GuardIfStmt(+3)' + x += 1 // $ bbStep='BinaryExpr : successor -> GuardIfStmt(+3)' } guard #available(macOS 12, *) else { @@ -515,7 +515,7 @@ func testAvailable() -> Int { // $ noCfg if #available(macOS 12, *), // $ bbStep=' : true -> (+1)' bbStep=' : false,false -> x(+5)' #available(iOS 12, *) { // $ bbStep=' : false,false -> x(+4)' bbStep=' : true -> Block(+0)' - x += 1 // $ bbStep='CompoundAssignExpr : successor -> x(+3)' + x += 1 // $ bbStep='BinaryExpr : successor -> x(+3)' } return x From 038e8b0c369bcb8d8e96fcc01321514e1eb00f9d Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 16 Sep 2026 13:58:02 +0200 Subject: [PATCH 1085/2098] unified: Use proper CFG nodes for assignments in data flow --- .../internal/dataflow/DataFlowNode.qll | 24 ++++++++++++------- .../test/library-tests/dataflow/test.expected | 3 --- .../ql/test/library-tests/dataflow/test.swift | 2 +- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll index bc4bec52b948..09cf4b9f4606 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll @@ -2,9 +2,16 @@ private import unified private import AllDataFlow private import codeql.unified.internal.ExprPositions -private predicate hasPostUpdate(Expr expr) { +private predicate hasIncomingValueAtCfgNode(Expr expr, ControlFlowNode cfgNode) { + exists(AstNode declOrAssignment | + hasIncomingValue(expr, declOrAssignment) and + cfgNode.injects(declOrAssignment) + ) +} + +private predicate hasPostUpdate(Expr expr, ControlFlowNode cfgNode) { exists(MemberAccessExpr member | - (hasIncomingValue(member, _) or hasPostUpdate(member)) and + (hasIncomingValueAtCfgNode(member, cfgNode) or hasPostUpdate(member, cfgNode)) and expr = member.getBase() ) } @@ -16,11 +23,11 @@ predicate performsVariableAccess( Expr expr, LocalVariable var, VariableRefKind kind, ControlFlowNode cfgNode ) { exists(LocalVariableAccess access | var = access.getLocalVariable() and expr = access | - hasResultValue(access) and kind.isRead() and cfgNode.isAfter(expr) + hasResultValue(access) and kind.isRead() and cfgNode.asExpr() = expr or - hasIncomingValue(access, _) and kind.isWrite() and cfgNode.asExpr() = expr // TODO: use more precise CFG node + hasIncomingValueAtCfgNode(access, cfgNode) and kind.isWrite() or - hasPostUpdate(access) and kind.isPostUpdate() and cfgNode.asExpr() = expr // TODO: use more precise CFG node + hasPostUpdate(access, cfgNode) and kind.isPostUpdate() ) or exists(UnqualifiedMemberAccess access | @@ -28,16 +35,15 @@ predicate performsVariableAccess( | kind.isRead() and cfgNode.isBefore(access) or - (hasIncomingValue(access, _) or hasPostUpdate(access)) and - kind.isPostUpdate() and - cfgNode.asExpr() = access // TODO: use more precise CFG node + (hasIncomingValueAtCfgNode(access, cfgNode) or hasPostUpdate(access, cfgNode)) and + kind.isPostUpdate() ) } newtype TDataFlowNode = TValueNode(Expr expr) { hasResultValue(expr) or hasIncomingValue(expr, _) } or TStrictlyIncomingValue(Expr expr) { hasResultValue(expr) and hasIncomingValue(expr, _) } or - TExprPostUpdateNode(Expr expr) { hasPostUpdate(expr) } or + TExprPostUpdateNode(Expr expr) { hasPostUpdate(expr, _) } or TLocalVariableRefNode(Expr expr, LocalVariable var, VariableRefKind kind) { performsVariableAccess(expr, var, kind, _) } or diff --git a/unified/ql/test/library-tests/dataflow/test.expected b/unified/ql/test/library-tests/dataflow/test.expected index f6df03922f1f..ff3ecd1f24fc 100644 --- a/unified/ql/test/library-tests/dataflow/test.expected +++ b/unified/ql/test/library-tests/dataflow/test.expected @@ -95,7 +95,6 @@ edges | test.swift:120:12:120:12 | b | test.swift:126:10:126:10 | b | provenance | | | test.swift:120:17:120:21 | tuple [0] | test.swift:120:9:120:13 | TupleExpr [0] | provenance | | | test.swift:120:17:120:21 | tuple [1] | test.swift:120:9:120:13 | TupleExpr [1] | provenance | | -| test.swift:131:5:131:5 | a | test.swift:131:14:131:14 | a | provenance | | | test.swift:131:5:131:5 | a | test.swift:132:10:132:10 | a | provenance | | | test.swift:131:19:131:33 | CallExpr | test.swift:131:5:131:5 | a | provenance | | nodes @@ -224,7 +223,6 @@ nodes | test.swift:125:10:125:10 | a | semmle.label | a | | test.swift:126:10:126:10 | b | semmle.label | b | | test.swift:131:5:131:5 | a | semmle.label | a | -| test.swift:131:14:131:14 | a | semmle.label | a | | test.swift:131:19:131:33 | CallExpr | semmle.label | CallExpr | | test.swift:132:10:132:10 | a | semmle.label | a | subpaths @@ -261,5 +259,4 @@ testFailures | test.swift:112:10:112:16 | MemberAccessExpr | test.swift:107:19:107:33 | CallExpr | test.swift:112:10:112:16 | MemberAccessExpr | $@ | test.swift:107:19:107:33 | CallExpr | CallExpr | | test.swift:125:10:125:10 | a | test.swift:117:18:117:33 | CallExpr | test.swift:125:10:125:10 | a | $@ | test.swift:117:18:117:33 | CallExpr | CallExpr | | test.swift:126:10:126:10 | b | test.swift:117:35:117:49 | CallExpr | test.swift:126:10:126:10 | b | $@ | test.swift:117:35:117:49 | CallExpr | CallExpr | -| test.swift:131:14:131:14 | a | test.swift:131:19:131:33 | CallExpr | test.swift:131:14:131:14 | a | $@ | test.swift:131:19:131:33 | CallExpr | CallExpr | | test.swift:132:10:132:10 | a | test.swift:131:19:131:33 | CallExpr | test.swift:132:10:132:10 | a | $@ | test.swift:131:19:131:33 | CallExpr | CallExpr | diff --git a/unified/ql/test/library-tests/dataflow/test.swift b/unified/ql/test/library-tests/dataflow/test.swift index 132afed56490..27d2f0b16d62 100644 --- a/unified/ql/test/library-tests/dataflow/test.swift +++ b/unified/ql/test/library-tests/dataflow/test.swift @@ -128,7 +128,7 @@ func t13() { func t14() { var a = "safe"; - a = sink(a) + source("t14.1"); // $ SPURIOUS: hasTaintFlow=t14.1 + a = sink(a) + source("t14.1"); sink(a); // $ hasTaintFlow=t14.1 } From 6282c60f537049142a4c8eeca237f9fdbae3453e Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 16 Sep 2026 14:01:56 +0200 Subject: [PATCH 1086/2098] unified: Handle flow through += --- .../unified/internal/dataflow/DataFlowGraph.qll | 8 ++++++++ .../internal/dataflow/DataFlowPluginSwift.qll | 2 +- .../ql/test/library-tests/dataflow/test.expected | 14 ++++++++++++++ unified/ql/test/library-tests/dataflow/test.swift | 4 ++-- 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll index 1edff6eea04b..2bd96b2b3ef1 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll @@ -16,6 +16,14 @@ predicate step(Node node1, Step step, Node node2) { node2.isIncomingValue(assign.getTarget()) ) or + // For compound assignments, the result of the expression represents the result of the operator. + // Make it flow to the target of the assignment. + exists(CompoundAssignExpr assign | + node1.isResultValue(assign) and + step.value() and + node2.isIncomingValue(assign.getTarget()) + ) + or exists(LocalVariableAccess access | node1.isLocalVariableRead(access, access.getLocalVariable()) and step.value() and diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowPluginSwift.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowPluginSwift.qll index 6cf9b5d487b8..ec03bf1536d3 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowPluginSwift.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowPluginSwift.qll @@ -9,7 +9,7 @@ private class SwiftDataFlowPlugin extends DataFlowPlugin { // Note: For now we assume all code is Swift, but in the future we must restrict these rules to Swift-files override predicate step(Node node1, Step step, Node node2) { exists(BinaryExpr expr | - expr.getOperator().getValue() = "+" and + expr.getOperator().getValue() = ["+", "+="] and node1.isResultValue([expr.getLeft(), expr.getRight()]) and step.taint() and node2.isResultValue(expr) diff --git a/unified/ql/test/library-tests/dataflow/test.expected b/unified/ql/test/library-tests/dataflow/test.expected index ff3ecd1f24fc..ab74d41c7969 100644 --- a/unified/ql/test/library-tests/dataflow/test.expected +++ b/unified/ql/test/library-tests/dataflow/test.expected @@ -97,6 +97,10 @@ edges | test.swift:120:17:120:21 | tuple [1] | test.swift:120:9:120:13 | TupleExpr [1] | provenance | | | test.swift:131:5:131:5 | a | test.swift:132:10:132:10 | a | provenance | | | test.swift:131:19:131:33 | CallExpr | test.swift:131:5:131:5 | a | provenance | | +| test.swift:137:5:137:5 | [incoming] a | test.swift:138:10:138:10 | a | provenance | | +| test.swift:137:10:137:24 | CallExpr | test.swift:137:5:137:5 | [incoming] a | provenance | | +| test.swift:143:5:143:5 | [incoming] a | test.swift:144:10:144:10 | a | provenance | | +| test.swift:143:20:143:34 | CallExpr | test.swift:143:5:143:5 | [incoming] a | provenance | | nodes | implicit-self.swift:11:9:11:12 | [post] self [x] | semmle.label | [post] self [x] | | implicit-self.swift:11:9:11:14 | MemberAccessExpr | semmle.label | MemberAccessExpr | @@ -225,8 +229,16 @@ nodes | test.swift:131:5:131:5 | a | semmle.label | a | | test.swift:131:19:131:33 | CallExpr | semmle.label | CallExpr | | test.swift:132:10:132:10 | a | semmle.label | a | +| test.swift:137:5:137:5 | [incoming] a | semmle.label | [incoming] a | +| test.swift:137:10:137:24 | CallExpr | semmle.label | CallExpr | +| test.swift:138:10:138:10 | a | semmle.label | a | +| test.swift:143:5:143:5 | [incoming] a | semmle.label | [incoming] a | +| test.swift:143:20:143:34 | CallExpr | semmle.label | CallExpr | +| test.swift:144:10:144:10 | a | semmle.label | a | subpaths testFailures +| test.swift:138:10:138:10 | a | Fixed missing result: hasTaintFlow=t15.1 | +| test.swift:144:10:144:10 | a | Fixed missing result: hasTaintFlow=t16.1 | #select | implicit-self.swift:12:14:12:19 | MemberAccessExpr | implicit-self.swift:11:18:11:31 | CallExpr | implicit-self.swift:12:14:12:19 | MemberAccessExpr | $@ | implicit-self.swift:11:18:11:31 | CallExpr | CallExpr | | implicit-self.swift:18:14:18:14 | x | implicit-self.swift:17:13:17:26 | CallExpr | implicit-self.swift:18:14:18:14 | x | $@ | implicit-self.swift:17:13:17:26 | CallExpr | CallExpr | @@ -260,3 +272,5 @@ testFailures | test.swift:125:10:125:10 | a | test.swift:117:18:117:33 | CallExpr | test.swift:125:10:125:10 | a | $@ | test.swift:117:18:117:33 | CallExpr | CallExpr | | test.swift:126:10:126:10 | b | test.swift:117:35:117:49 | CallExpr | test.swift:126:10:126:10 | b | $@ | test.swift:117:35:117:49 | CallExpr | CallExpr | | test.swift:132:10:132:10 | a | test.swift:131:19:131:33 | CallExpr | test.swift:132:10:132:10 | a | $@ | test.swift:131:19:131:33 | CallExpr | CallExpr | +| test.swift:138:10:138:10 | a | test.swift:137:10:137:24 | CallExpr | test.swift:138:10:138:10 | a | $@ | test.swift:137:10:137:24 | CallExpr | CallExpr | +| test.swift:144:10:144:10 | a | test.swift:143:20:143:34 | CallExpr | test.swift:144:10:144:10 | a | $@ | test.swift:143:20:143:34 | CallExpr | CallExpr | diff --git a/unified/ql/test/library-tests/dataflow/test.swift b/unified/ql/test/library-tests/dataflow/test.swift index 27d2f0b16d62..07d17d2910a9 100644 --- a/unified/ql/test/library-tests/dataflow/test.swift +++ b/unified/ql/test/library-tests/dataflow/test.swift @@ -135,11 +135,11 @@ func t14() { func t15() { var a = "safe"; a += source("t15.1"); - sink(a); // $ MISSING: hasTaintFlow=t15.1 + sink(a); // $ hasTaintFlow=t15.1 } func t16() { var a = "safe"; a += sink(a) + source("t16.1"); - sink(a); // $ MISSING: hasTaintFlow=t16.1 + sink(a); // $ hasTaintFlow=t16.1 } From 572ccd99378333421330c7948eac27b756065b9d Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 16 Sep 2026 14:09:57 +0200 Subject: [PATCH 1087/2098] unified: Add similar tests for implicit self There are some spurious flows explained by the added TODO comment. --- .../internal/dataflow/DataFlowNode.qll | 1 + .../dataflow/implicit-self.swift | 28 +++++++++ .../test/library-tests/dataflow/test.expected | 62 ++++++++++++++++++- 3 files changed, 89 insertions(+), 2 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll index 09cf4b9f4606..a8a645d5daa5 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll @@ -27,6 +27,7 @@ predicate performsVariableAccess( or hasIncomingValueAtCfgNode(access, cfgNode) and kind.isWrite() or + // TODO: Make the SSA library use this CFG node for post-updates. It currently picks the same as the read. hasPostUpdate(access, cfgNode) and kind.isPostUpdate() ) or diff --git a/unified/ql/test/library-tests/dataflow/implicit-self.swift b/unified/ql/test/library-tests/dataflow/implicit-self.swift index 8e13479d51fe..58a2a839b308 100644 --- a/unified/ql/test/library-tests/dataflow/implicit-self.swift +++ b/unified/ql/test/library-tests/dataflow/implicit-self.swift @@ -53,4 +53,32 @@ class C { self.box.x = source("t8.1"); sink(box.x); // $ hasValueFlow=t8.1 } + + func t9() { + x = "safe"; + x += sink(x) + source("t9.1"); // $ SPURIOUS: hasTaintFlow=t9.1 + sink(x); // $ hasTaintFlow=t9.1 + sink(self.x); // $ hasTaintFlow=t9.1 + } + + func t10() { + x = "safe"; + self.x += sink(x) + source("t10.1"); // $ SPURIOUS: hasTaintFlow=t10.1 + sink(x); // $ hasTaintFlow=t10.1 + sink(self.x); // $ hasTaintFlow=t10.1 + } + + func t11() { + self.x = "safe"; + x += sink(x) + source("t11.1"); // $ SPURIOUS: hasTaintFlow=t11.1 + sink(x); // $ hasTaintFlow=t11.1 + sink(self.x); // $ hasTaintFlow=t11.1 + } + + func t12() { + self.x = "safe"; + self.x += sink(x) + source("t12.1"); // $ SPURIOUS: hasTaintFlow=t12.1 + sink(x); // $ hasTaintFlow=t12.1 + sink(self.x); // $ hasTaintFlow=t12.1 + } } diff --git a/unified/ql/test/library-tests/dataflow/test.expected b/unified/ql/test/library-tests/dataflow/test.expected index ab74d41c7969..4ea7aaae4803 100644 --- a/unified/ql/test/library-tests/dataflow/test.expected +++ b/unified/ql/test/library-tests/dataflow/test.expected @@ -32,6 +32,28 @@ edges | implicit-self.swift:53:9:53:18 | MemberAccessExpr | implicit-self.swift:53:9:53:16 | [post] MemberAccessExpr [x] | provenance | | | implicit-self.swift:53:22:53:35 | CallExpr | implicit-self.swift:53:9:53:18 | MemberAccessExpr | provenance | | | implicit-self.swift:54:14:54:16 | box [x] | implicit-self.swift:54:14:54:18 | MemberAccessExpr | provenance | | +| implicit-self.swift:59:9:59:9 | [incoming] x | implicit-self.swift:59:19:59:19 | x | provenance | | +| implicit-self.swift:59:9:59:9 | [incoming] x | implicit-self.swift:60:14:60:14 | x | provenance | | +| implicit-self.swift:59:9:59:9 | [incoming] x | implicit-self.swift:61:14:61:17 | self [x] | provenance | | +| implicit-self.swift:59:24:59:37 | CallExpr | implicit-self.swift:59:9:59:9 | [incoming] x | provenance | | +| implicit-self.swift:61:14:61:17 | self [x] | implicit-self.swift:61:14:61:19 | MemberAccessExpr | provenance | | +| implicit-self.swift:66:9:66:12 | [post] self [x] | implicit-self.swift:66:24:66:24 | x | provenance | | +| implicit-self.swift:66:9:66:12 | [post] self [x] | implicit-self.swift:67:14:67:14 | x | provenance | | +| implicit-self.swift:66:9:66:12 | [post] self [x] | implicit-self.swift:68:14:68:17 | self [x] | provenance | | +| implicit-self.swift:66:9:66:14 | [incoming] MemberAccessExpr | implicit-self.swift:66:9:66:12 | [post] self [x] | provenance | | +| implicit-self.swift:66:29:66:43 | CallExpr | implicit-self.swift:66:9:66:14 | [incoming] MemberAccessExpr | provenance | | +| implicit-self.swift:68:14:68:17 | self [x] | implicit-self.swift:68:14:68:19 | MemberAccessExpr | provenance | | +| implicit-self.swift:73:9:73:9 | [incoming] x | implicit-self.swift:73:19:73:19 | x | provenance | | +| implicit-self.swift:73:9:73:9 | [incoming] x | implicit-self.swift:74:14:74:14 | x | provenance | | +| implicit-self.swift:73:9:73:9 | [incoming] x | implicit-self.swift:75:14:75:17 | self [x] | provenance | | +| implicit-self.swift:73:24:73:38 | CallExpr | implicit-self.swift:73:9:73:9 | [incoming] x | provenance | | +| implicit-self.swift:75:14:75:17 | self [x] | implicit-self.swift:75:14:75:19 | MemberAccessExpr | provenance | | +| implicit-self.swift:80:9:80:12 | [post] self [x] | implicit-self.swift:80:24:80:24 | x | provenance | | +| implicit-self.swift:80:9:80:12 | [post] self [x] | implicit-self.swift:81:14:81:14 | x | provenance | | +| implicit-self.swift:80:9:80:12 | [post] self [x] | implicit-self.swift:82:14:82:17 | self [x] | provenance | | +| implicit-self.swift:80:9:80:14 | [incoming] MemberAccessExpr | implicit-self.swift:80:9:80:12 | [post] self [x] | provenance | | +| implicit-self.swift:80:29:80:43 | CallExpr | implicit-self.swift:80:9:80:14 | [incoming] MemberAccessExpr | provenance | | +| implicit-self.swift:82:14:82:17 | self [x] | implicit-self.swift:82:14:82:19 | MemberAccessExpr | provenance | | | test.swift:6:10:6:23 | CallExpr | test.swift:6:10:6:32 | BinaryExpr | provenance | | | test.swift:7:19:7:32 | CallExpr | test.swift:7:10:7:32 | BinaryExpr | provenance | | | test.swift:9:13:9:26 | CallExpr | test.swift:9:10:9:33 | StringInterpolationExpr | provenance | | @@ -142,6 +164,32 @@ nodes | implicit-self.swift:53:22:53:35 | CallExpr | semmle.label | CallExpr | | implicit-self.swift:54:14:54:16 | box [x] | semmle.label | box [x] | | implicit-self.swift:54:14:54:18 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| implicit-self.swift:59:9:59:9 | [incoming] x | semmle.label | [incoming] x | +| implicit-self.swift:59:19:59:19 | x | semmle.label | x | +| implicit-self.swift:59:24:59:37 | CallExpr | semmle.label | CallExpr | +| implicit-self.swift:60:14:60:14 | x | semmle.label | x | +| implicit-self.swift:61:14:61:17 | self [x] | semmle.label | self [x] | +| implicit-self.swift:61:14:61:19 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| implicit-self.swift:66:9:66:12 | [post] self [x] | semmle.label | [post] self [x] | +| implicit-self.swift:66:9:66:14 | [incoming] MemberAccessExpr | semmle.label | [incoming] MemberAccessExpr | +| implicit-self.swift:66:24:66:24 | x | semmle.label | x | +| implicit-self.swift:66:29:66:43 | CallExpr | semmle.label | CallExpr | +| implicit-self.swift:67:14:67:14 | x | semmle.label | x | +| implicit-self.swift:68:14:68:17 | self [x] | semmle.label | self [x] | +| implicit-self.swift:68:14:68:19 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| implicit-self.swift:73:9:73:9 | [incoming] x | semmle.label | [incoming] x | +| implicit-self.swift:73:19:73:19 | x | semmle.label | x | +| implicit-self.swift:73:24:73:38 | CallExpr | semmle.label | CallExpr | +| implicit-self.swift:74:14:74:14 | x | semmle.label | x | +| implicit-self.swift:75:14:75:17 | self [x] | semmle.label | self [x] | +| implicit-self.swift:75:14:75:19 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| implicit-self.swift:80:9:80:12 | [post] self [x] | semmle.label | [post] self [x] | +| implicit-self.swift:80:9:80:14 | [incoming] MemberAccessExpr | semmle.label | [incoming] MemberAccessExpr | +| implicit-self.swift:80:24:80:24 | x | semmle.label | x | +| implicit-self.swift:80:29:80:43 | CallExpr | semmle.label | CallExpr | +| implicit-self.swift:81:14:81:14 | x | semmle.label | x | +| implicit-self.swift:82:14:82:17 | self [x] | semmle.label | self [x] | +| implicit-self.swift:82:14:82:19 | MemberAccessExpr | semmle.label | MemberAccessExpr | | test.swift:2:10:2:21 | CallExpr | semmle.label | CallExpr | | test.swift:6:10:6:23 | CallExpr | semmle.label | CallExpr | | test.swift:6:10:6:32 | BinaryExpr | semmle.label | BinaryExpr | @@ -237,8 +285,6 @@ nodes | test.swift:144:10:144:10 | a | semmle.label | a | subpaths testFailures -| test.swift:138:10:138:10 | a | Fixed missing result: hasTaintFlow=t15.1 | -| test.swift:144:10:144:10 | a | Fixed missing result: hasTaintFlow=t16.1 | #select | implicit-self.swift:12:14:12:19 | MemberAccessExpr | implicit-self.swift:11:18:11:31 | CallExpr | implicit-self.swift:12:14:12:19 | MemberAccessExpr | $@ | implicit-self.swift:11:18:11:31 | CallExpr | CallExpr | | implicit-self.swift:18:14:18:14 | x | implicit-self.swift:17:13:17:26 | CallExpr | implicit-self.swift:18:14:18:14 | x | $@ | implicit-self.swift:17:13:17:26 | CallExpr | CallExpr | @@ -248,6 +294,18 @@ testFailures | implicit-self.swift:42:14:42:18 | MemberAccessExpr | implicit-self.swift:41:17:41:30 | CallExpr | implicit-self.swift:42:14:42:18 | MemberAccessExpr | $@ | implicit-self.swift:41:17:41:30 | CallExpr | CallExpr | | implicit-self.swift:48:14:48:23 | MemberAccessExpr | implicit-self.swift:47:17:47:30 | CallExpr | implicit-self.swift:48:14:48:23 | MemberAccessExpr | $@ | implicit-self.swift:47:17:47:30 | CallExpr | CallExpr | | implicit-self.swift:54:14:54:18 | MemberAccessExpr | implicit-self.swift:53:22:53:35 | CallExpr | implicit-self.swift:54:14:54:18 | MemberAccessExpr | $@ | implicit-self.swift:53:22:53:35 | CallExpr | CallExpr | +| implicit-self.swift:59:19:59:19 | x | implicit-self.swift:59:24:59:37 | CallExpr | implicit-self.swift:59:19:59:19 | x | $@ | implicit-self.swift:59:24:59:37 | CallExpr | CallExpr | +| implicit-self.swift:60:14:60:14 | x | implicit-self.swift:59:24:59:37 | CallExpr | implicit-self.swift:60:14:60:14 | x | $@ | implicit-self.swift:59:24:59:37 | CallExpr | CallExpr | +| implicit-self.swift:61:14:61:19 | MemberAccessExpr | implicit-self.swift:59:24:59:37 | CallExpr | implicit-self.swift:61:14:61:19 | MemberAccessExpr | $@ | implicit-self.swift:59:24:59:37 | CallExpr | CallExpr | +| implicit-self.swift:66:24:66:24 | x | implicit-self.swift:66:29:66:43 | CallExpr | implicit-self.swift:66:24:66:24 | x | $@ | implicit-self.swift:66:29:66:43 | CallExpr | CallExpr | +| implicit-self.swift:67:14:67:14 | x | implicit-self.swift:66:29:66:43 | CallExpr | implicit-self.swift:67:14:67:14 | x | $@ | implicit-self.swift:66:29:66:43 | CallExpr | CallExpr | +| implicit-self.swift:68:14:68:19 | MemberAccessExpr | implicit-self.swift:66:29:66:43 | CallExpr | implicit-self.swift:68:14:68:19 | MemberAccessExpr | $@ | implicit-self.swift:66:29:66:43 | CallExpr | CallExpr | +| implicit-self.swift:73:19:73:19 | x | implicit-self.swift:73:24:73:38 | CallExpr | implicit-self.swift:73:19:73:19 | x | $@ | implicit-self.swift:73:24:73:38 | CallExpr | CallExpr | +| implicit-self.swift:74:14:74:14 | x | implicit-self.swift:73:24:73:38 | CallExpr | implicit-self.swift:74:14:74:14 | x | $@ | implicit-self.swift:73:24:73:38 | CallExpr | CallExpr | +| implicit-self.swift:75:14:75:19 | MemberAccessExpr | implicit-self.swift:73:24:73:38 | CallExpr | implicit-self.swift:75:14:75:19 | MemberAccessExpr | $@ | implicit-self.swift:73:24:73:38 | CallExpr | CallExpr | +| implicit-self.swift:80:24:80:24 | x | implicit-self.swift:80:29:80:43 | CallExpr | implicit-self.swift:80:24:80:24 | x | $@ | implicit-self.swift:80:29:80:43 | CallExpr | CallExpr | +| implicit-self.swift:81:14:81:14 | x | implicit-self.swift:80:29:80:43 | CallExpr | implicit-self.swift:81:14:81:14 | x | $@ | implicit-self.swift:80:29:80:43 | CallExpr | CallExpr | +| implicit-self.swift:82:14:82:19 | MemberAccessExpr | implicit-self.swift:80:29:80:43 | CallExpr | implicit-self.swift:82:14:82:19 | MemberAccessExpr | $@ | implicit-self.swift:80:29:80:43 | CallExpr | CallExpr | | test.swift:2:10:2:21 | CallExpr | test.swift:2:10:2:21 | CallExpr | test.swift:2:10:2:21 | CallExpr | $@ | test.swift:2:10:2:21 | CallExpr | CallExpr | | test.swift:6:10:6:32 | BinaryExpr | test.swift:6:10:6:23 | CallExpr | test.swift:6:10:6:32 | BinaryExpr | $@ | test.swift:6:10:6:23 | CallExpr | CallExpr | | test.swift:7:10:7:32 | BinaryExpr | test.swift:7:19:7:32 | CallExpr | test.swift:7:10:7:32 | BinaryExpr | $@ | test.swift:7:19:7:32 | CallExpr | CallExpr | From 5c00811fd8fc09d6d1ab07c52eebc443b1bfcfe4 Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 16 Sep 2026 14:15:34 +0200 Subject: [PATCH 1088/2098] ssa: Split a line (no behaviour change) --- shared/ssa/codeql/ssa/Ssa.qll | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/shared/ssa/codeql/ssa/Ssa.qll b/shared/ssa/codeql/ssa/Ssa.qll index b8fe058bc0f5..e63f9458a03a 100644 --- a/shared/ssa/codeql/ssa/Ssa.qll +++ b/shared/ssa/codeql/ssa/Ssa.qll @@ -1907,7 +1907,10 @@ module Make< isUseStep = false ) or - [nodeFrom, nodeFrom.(ExprPostUpdateNode).getPreUpdateNode()].(ReadNode).readsAt(bb, i, v) and + nodeFrom.(ReadNode).readsAt(bb, i, v) and + isUseStep = true + or + nodeFrom.(ExprPostUpdateNode).getPreUpdateNode().(ReadNode).readsAt(bb, i, v) and isUseStep = true } From 1b9cc6116fbd4e58101c7f7f9f6ded397f0a141e Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 16 Sep 2026 15:22:15 +0200 Subject: [PATCH 1089/2098] unified: Sharpen CFG node for post-updates --- shared/ssa/codeql/ssa/Ssa.qll | 25 ++++++++++++++++++- .../internal/dataflow/DataFlowNode.qll | 1 - .../unified/internal/dataflow/LocalSsa.qll | 10 ++++++++ .../dataflow/implicit-self.swift | 8 +++--- .../test/library-tests/dataflow/test.expected | 12 --------- 5 files changed, 38 insertions(+), 18 deletions(-) diff --git a/shared/ssa/codeql/ssa/Ssa.qll b/shared/ssa/codeql/ssa/Ssa.qll index e63f9458a03a..a0c295c5d27d 100644 --- a/shared/ssa/codeql/ssa/Ssa.qll +++ b/shared/ssa/codeql/ssa/Ssa.qll @@ -1419,6 +1419,22 @@ module Make< */ default predicate allowFlowIntoUncertainDef(UncertainWriteDefinition def) { none() } + /** + * Holds if the post-update node corresponding to the given `read` occurs at `bb,i`, meaning + * it will propagate to the next use (strictly) after that point in the CFG. + * + * The default is to use the CFG node associated with the read itself, meaning the post-update + * always flows to the next use. The default can however lead to spurious flow in cases like: + * ``` + * x.f = foo(x) + * ``` + * where the post-update node for `x` on the left-hand side flows into the `x` on the right-hand side. + * + * NOTE: When implementing this predicate, you must ensure that `variableRead` is defined to contain + * a synthetic read of this variable at `bb,i`. + */ + default predicate postUpdateCfgNode(Expr read, BasicBlock bb, int i) { read.hasCfgNode(bb, i) } + /** An abstract value that a `Guard` may evaluate to. */ class GuardValue { /** Gets a textual representation of this value. */ @@ -1892,6 +1908,13 @@ module Make< override string toString() { result = "[input] " + def_.toString() } } + private predicate postUpdateNodeAt( + ExprPostUpdateNode node, BasicBlock bb, int i, SourceVariable v + ) { + node.getPreUpdateNode().(ReadNode).readsAt(_, _, v) and + DfInput::postUpdateCfgNode(node.getExpr(), bb, i) + } + /** * Holds if `nodeFrom` corresponds to the reference to `v` at index `i` in * `bb`. The boolean `isUseStep` indicates whether `nodeFrom` is an actual @@ -1910,7 +1933,7 @@ module Make< nodeFrom.(ReadNode).readsAt(bb, i, v) and isUseStep = true or - nodeFrom.(ExprPostUpdateNode).getPreUpdateNode().(ReadNode).readsAt(bb, i, v) and + postUpdateNodeAt(nodeFrom, bb, i, v) and isUseStep = true } diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll index a8a645d5daa5..09cf4b9f4606 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll @@ -27,7 +27,6 @@ predicate performsVariableAccess( or hasIncomingValueAtCfgNode(access, cfgNode) and kind.isWrite() or - // TODO: Make the SSA library use this CFG node for post-updates. It currently picks the same as the read. hasPostUpdate(access, cfgNode) and kind.isPostUpdate() ) or diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll b/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll index 6b4fe6c376c1..96c90fbb47ed 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll @@ -27,6 +27,9 @@ module LocalSsaInput implements InputSig { predicate variableRead(BasicBlock bb, int i, SourceVariable v, boolean certain) { certain = true and performsVariableAccess(_, v, TRead(), bb.getNode(i)) + or + certain = true and + performsVariableAccess(_, v, TPostUpdate(), bb.getNode(i)) } } @@ -58,6 +61,13 @@ module LocalSsaDataFlowInput implements DataFlowIntegrationInputSig { } predicate guardDirectlyControlsBlock(Guard guard, BasicBlock bb, GuardValue val) { none() } + + predicate postUpdateCfgNode(Expr read, BasicBlock bb, int i) { + exists(LocalVariable var, U::Expr expr | + read = TLocalVariableRefNode(expr, var, TRead()) and + performsVariableAccess(expr, var, TPostUpdate(), bb.getNode(i)) + ) + } } module LocalSsaDataFlowOutput = DataFlowIntegration; diff --git a/unified/ql/test/library-tests/dataflow/implicit-self.swift b/unified/ql/test/library-tests/dataflow/implicit-self.swift index 58a2a839b308..32f8e88266f4 100644 --- a/unified/ql/test/library-tests/dataflow/implicit-self.swift +++ b/unified/ql/test/library-tests/dataflow/implicit-self.swift @@ -56,28 +56,28 @@ class C { func t9() { x = "safe"; - x += sink(x) + source("t9.1"); // $ SPURIOUS: hasTaintFlow=t9.1 + x += sink(x) + source("t9.1"); sink(x); // $ hasTaintFlow=t9.1 sink(self.x); // $ hasTaintFlow=t9.1 } func t10() { x = "safe"; - self.x += sink(x) + source("t10.1"); // $ SPURIOUS: hasTaintFlow=t10.1 + self.x += sink(x) + source("t10.1"); sink(x); // $ hasTaintFlow=t10.1 sink(self.x); // $ hasTaintFlow=t10.1 } func t11() { self.x = "safe"; - x += sink(x) + source("t11.1"); // $ SPURIOUS: hasTaintFlow=t11.1 + x += sink(x) + source("t11.1"); sink(x); // $ hasTaintFlow=t11.1 sink(self.x); // $ hasTaintFlow=t11.1 } func t12() { self.x = "safe"; - self.x += sink(x) + source("t12.1"); // $ SPURIOUS: hasTaintFlow=t12.1 + self.x += sink(x) + source("t12.1"); sink(x); // $ hasTaintFlow=t12.1 sink(self.x); // $ hasTaintFlow=t12.1 } diff --git a/unified/ql/test/library-tests/dataflow/test.expected b/unified/ql/test/library-tests/dataflow/test.expected index 4ea7aaae4803..c3e3bf02ca57 100644 --- a/unified/ql/test/library-tests/dataflow/test.expected +++ b/unified/ql/test/library-tests/dataflow/test.expected @@ -32,23 +32,19 @@ edges | implicit-self.swift:53:9:53:18 | MemberAccessExpr | implicit-self.swift:53:9:53:16 | [post] MemberAccessExpr [x] | provenance | | | implicit-self.swift:53:22:53:35 | CallExpr | implicit-self.swift:53:9:53:18 | MemberAccessExpr | provenance | | | implicit-self.swift:54:14:54:16 | box [x] | implicit-self.swift:54:14:54:18 | MemberAccessExpr | provenance | | -| implicit-self.swift:59:9:59:9 | [incoming] x | implicit-self.swift:59:19:59:19 | x | provenance | | | implicit-self.swift:59:9:59:9 | [incoming] x | implicit-self.swift:60:14:60:14 | x | provenance | | | implicit-self.swift:59:9:59:9 | [incoming] x | implicit-self.swift:61:14:61:17 | self [x] | provenance | | | implicit-self.swift:59:24:59:37 | CallExpr | implicit-self.swift:59:9:59:9 | [incoming] x | provenance | | | implicit-self.swift:61:14:61:17 | self [x] | implicit-self.swift:61:14:61:19 | MemberAccessExpr | provenance | | -| implicit-self.swift:66:9:66:12 | [post] self [x] | implicit-self.swift:66:24:66:24 | x | provenance | | | implicit-self.swift:66:9:66:12 | [post] self [x] | implicit-self.swift:67:14:67:14 | x | provenance | | | implicit-self.swift:66:9:66:12 | [post] self [x] | implicit-self.swift:68:14:68:17 | self [x] | provenance | | | implicit-self.swift:66:9:66:14 | [incoming] MemberAccessExpr | implicit-self.swift:66:9:66:12 | [post] self [x] | provenance | | | implicit-self.swift:66:29:66:43 | CallExpr | implicit-self.swift:66:9:66:14 | [incoming] MemberAccessExpr | provenance | | | implicit-self.swift:68:14:68:17 | self [x] | implicit-self.swift:68:14:68:19 | MemberAccessExpr | provenance | | -| implicit-self.swift:73:9:73:9 | [incoming] x | implicit-self.swift:73:19:73:19 | x | provenance | | | implicit-self.swift:73:9:73:9 | [incoming] x | implicit-self.swift:74:14:74:14 | x | provenance | | | implicit-self.swift:73:9:73:9 | [incoming] x | implicit-self.swift:75:14:75:17 | self [x] | provenance | | | implicit-self.swift:73:24:73:38 | CallExpr | implicit-self.swift:73:9:73:9 | [incoming] x | provenance | | | implicit-self.swift:75:14:75:17 | self [x] | implicit-self.swift:75:14:75:19 | MemberAccessExpr | provenance | | -| implicit-self.swift:80:9:80:12 | [post] self [x] | implicit-self.swift:80:24:80:24 | x | provenance | | | implicit-self.swift:80:9:80:12 | [post] self [x] | implicit-self.swift:81:14:81:14 | x | provenance | | | implicit-self.swift:80:9:80:12 | [post] self [x] | implicit-self.swift:82:14:82:17 | self [x] | provenance | | | implicit-self.swift:80:9:80:14 | [incoming] MemberAccessExpr | implicit-self.swift:80:9:80:12 | [post] self [x] | provenance | | @@ -165,27 +161,23 @@ nodes | implicit-self.swift:54:14:54:16 | box [x] | semmle.label | box [x] | | implicit-self.swift:54:14:54:18 | MemberAccessExpr | semmle.label | MemberAccessExpr | | implicit-self.swift:59:9:59:9 | [incoming] x | semmle.label | [incoming] x | -| implicit-self.swift:59:19:59:19 | x | semmle.label | x | | implicit-self.swift:59:24:59:37 | CallExpr | semmle.label | CallExpr | | implicit-self.swift:60:14:60:14 | x | semmle.label | x | | implicit-self.swift:61:14:61:17 | self [x] | semmle.label | self [x] | | implicit-self.swift:61:14:61:19 | MemberAccessExpr | semmle.label | MemberAccessExpr | | implicit-self.swift:66:9:66:12 | [post] self [x] | semmle.label | [post] self [x] | | implicit-self.swift:66:9:66:14 | [incoming] MemberAccessExpr | semmle.label | [incoming] MemberAccessExpr | -| implicit-self.swift:66:24:66:24 | x | semmle.label | x | | implicit-self.swift:66:29:66:43 | CallExpr | semmle.label | CallExpr | | implicit-self.swift:67:14:67:14 | x | semmle.label | x | | implicit-self.swift:68:14:68:17 | self [x] | semmle.label | self [x] | | implicit-self.swift:68:14:68:19 | MemberAccessExpr | semmle.label | MemberAccessExpr | | implicit-self.swift:73:9:73:9 | [incoming] x | semmle.label | [incoming] x | -| implicit-self.swift:73:19:73:19 | x | semmle.label | x | | implicit-self.swift:73:24:73:38 | CallExpr | semmle.label | CallExpr | | implicit-self.swift:74:14:74:14 | x | semmle.label | x | | implicit-self.swift:75:14:75:17 | self [x] | semmle.label | self [x] | | implicit-self.swift:75:14:75:19 | MemberAccessExpr | semmle.label | MemberAccessExpr | | implicit-self.swift:80:9:80:12 | [post] self [x] | semmle.label | [post] self [x] | | implicit-self.swift:80:9:80:14 | [incoming] MemberAccessExpr | semmle.label | [incoming] MemberAccessExpr | -| implicit-self.swift:80:24:80:24 | x | semmle.label | x | | implicit-self.swift:80:29:80:43 | CallExpr | semmle.label | CallExpr | | implicit-self.swift:81:14:81:14 | x | semmle.label | x | | implicit-self.swift:82:14:82:17 | self [x] | semmle.label | self [x] | @@ -294,16 +286,12 @@ testFailures | implicit-self.swift:42:14:42:18 | MemberAccessExpr | implicit-self.swift:41:17:41:30 | CallExpr | implicit-self.swift:42:14:42:18 | MemberAccessExpr | $@ | implicit-self.swift:41:17:41:30 | CallExpr | CallExpr | | implicit-self.swift:48:14:48:23 | MemberAccessExpr | implicit-self.swift:47:17:47:30 | CallExpr | implicit-self.swift:48:14:48:23 | MemberAccessExpr | $@ | implicit-self.swift:47:17:47:30 | CallExpr | CallExpr | | implicit-self.swift:54:14:54:18 | MemberAccessExpr | implicit-self.swift:53:22:53:35 | CallExpr | implicit-self.swift:54:14:54:18 | MemberAccessExpr | $@ | implicit-self.swift:53:22:53:35 | CallExpr | CallExpr | -| implicit-self.swift:59:19:59:19 | x | implicit-self.swift:59:24:59:37 | CallExpr | implicit-self.swift:59:19:59:19 | x | $@ | implicit-self.swift:59:24:59:37 | CallExpr | CallExpr | | implicit-self.swift:60:14:60:14 | x | implicit-self.swift:59:24:59:37 | CallExpr | implicit-self.swift:60:14:60:14 | x | $@ | implicit-self.swift:59:24:59:37 | CallExpr | CallExpr | | implicit-self.swift:61:14:61:19 | MemberAccessExpr | implicit-self.swift:59:24:59:37 | CallExpr | implicit-self.swift:61:14:61:19 | MemberAccessExpr | $@ | implicit-self.swift:59:24:59:37 | CallExpr | CallExpr | -| implicit-self.swift:66:24:66:24 | x | implicit-self.swift:66:29:66:43 | CallExpr | implicit-self.swift:66:24:66:24 | x | $@ | implicit-self.swift:66:29:66:43 | CallExpr | CallExpr | | implicit-self.swift:67:14:67:14 | x | implicit-self.swift:66:29:66:43 | CallExpr | implicit-self.swift:67:14:67:14 | x | $@ | implicit-self.swift:66:29:66:43 | CallExpr | CallExpr | | implicit-self.swift:68:14:68:19 | MemberAccessExpr | implicit-self.swift:66:29:66:43 | CallExpr | implicit-self.swift:68:14:68:19 | MemberAccessExpr | $@ | implicit-self.swift:66:29:66:43 | CallExpr | CallExpr | -| implicit-self.swift:73:19:73:19 | x | implicit-self.swift:73:24:73:38 | CallExpr | implicit-self.swift:73:19:73:19 | x | $@ | implicit-self.swift:73:24:73:38 | CallExpr | CallExpr | | implicit-self.swift:74:14:74:14 | x | implicit-self.swift:73:24:73:38 | CallExpr | implicit-self.swift:74:14:74:14 | x | $@ | implicit-self.swift:73:24:73:38 | CallExpr | CallExpr | | implicit-self.swift:75:14:75:19 | MemberAccessExpr | implicit-self.swift:73:24:73:38 | CallExpr | implicit-self.swift:75:14:75:19 | MemberAccessExpr | $@ | implicit-self.swift:73:24:73:38 | CallExpr | CallExpr | -| implicit-self.swift:80:24:80:24 | x | implicit-self.swift:80:29:80:43 | CallExpr | implicit-self.swift:80:24:80:24 | x | $@ | implicit-self.swift:80:29:80:43 | CallExpr | CallExpr | | implicit-self.swift:81:14:81:14 | x | implicit-self.swift:80:29:80:43 | CallExpr | implicit-self.swift:81:14:81:14 | x | $@ | implicit-self.swift:80:29:80:43 | CallExpr | CallExpr | | implicit-self.swift:82:14:82:19 | MemberAccessExpr | implicit-self.swift:80:29:80:43 | CallExpr | implicit-self.swift:82:14:82:19 | MemberAccessExpr | $@ | implicit-self.swift:80:29:80:43 | CallExpr | CallExpr | | test.swift:2:10:2:21 | CallExpr | test.swift:2:10:2:21 | CallExpr | test.swift:2:10:2:21 | CallExpr | $@ | test.swift:2:10:2:21 | CallExpr | CallExpr | From e1672815cb33af09911834d74bb09cdf8d322143 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 17 Sep 2026 13:19:17 +0200 Subject: [PATCH 1090/2098] unified: Add a few more mutation tests --- .../test/library-tests/dataflow/test.expected | 50 +++++++++++++++++++ .../ql/test/library-tests/dataflow/test.swift | 22 ++++++++ 2 files changed, 72 insertions(+) diff --git a/unified/ql/test/library-tests/dataflow/test.expected b/unified/ql/test/library-tests/dataflow/test.expected index c3e3bf02ca57..41ced3845de2 100644 --- a/unified/ql/test/library-tests/dataflow/test.expected +++ b/unified/ql/test/library-tests/dataflow/test.expected @@ -119,6 +119,27 @@ edges | test.swift:137:10:137:24 | CallExpr | test.swift:137:5:137:5 | [incoming] a | provenance | | | test.swift:143:5:143:5 | [incoming] a | test.swift:144:10:144:10 | a | provenance | | | test.swift:143:20:143:34 | CallExpr | test.swift:143:5:143:5 | [incoming] a | provenance | | +| test.swift:149:5:149:5 | [post] a [0] | test.swift:150:10:150:10 | a [0] | provenance | | +| test.swift:149:5:149:7 | MemberAccessExpr | test.swift:149:5:149:5 | [post] a [0] | provenance | | +| test.swift:149:23:149:37 | CallExpr | test.swift:149:5:149:7 | MemberAccessExpr | provenance | | +| test.swift:150:10:150:10 | a [0] | test.swift:150:10:150:12 | MemberAccessExpr | provenance | | +| test.swift:156:5:156:12 | TupleExpr [0] | test.swift:156:6:156:8 | MemberAccessExpr | provenance | | +| test.swift:156:6:156:6 | [post] a [0] | test.swift:157:10:157:10 | a [0] | provenance | | +| test.swift:156:6:156:8 | MemberAccessExpr | test.swift:156:6:156:6 | [post] a [0] | provenance | | +| test.swift:156:16:156:61 | TupleExpr [0] | test.swift:156:5:156:12 | TupleExpr [0] | provenance | | +| test.swift:156:17:156:43 | BinaryExpr | test.swift:156:16:156:61 | TupleExpr [0] | provenance | | +| test.swift:156:29:156:43 | CallExpr | test.swift:156:17:156:43 | BinaryExpr | provenance | | +| test.swift:157:10:157:10 | a [0] | test.swift:157:10:157:12 | MemberAccessExpr | provenance | | +| test.swift:164:5:164:10 | TupleExpr [0] | test.swift:164:6:164:6 | a | provenance | | +| test.swift:164:5:164:10 | TupleExpr [1] | test.swift:164:9:164:9 | b | provenance | | +| test.swift:164:6:164:6 | a | test.swift:165:10:165:10 | a | provenance | | +| test.swift:164:9:164:9 | b | test.swift:166:10:166:10 | b | provenance | | +| test.swift:164:14:164:67 | TupleExpr [0] | test.swift:164:5:164:10 | TupleExpr [0] | provenance | | +| test.swift:164:14:164:67 | TupleExpr [1] | test.swift:164:5:164:10 | TupleExpr [1] | provenance | | +| test.swift:164:15:164:39 | BinaryExpr | test.swift:164:14:164:67 | TupleExpr [0] | provenance | | +| test.swift:164:25:164:39 | CallExpr | test.swift:164:15:164:39 | BinaryExpr | provenance | | +| test.swift:164:42:164:66 | BinaryExpr | test.swift:164:14:164:67 | TupleExpr [1] | provenance | | +| test.swift:164:52:164:66 | CallExpr | test.swift:164:42:164:66 | BinaryExpr | provenance | | nodes | implicit-self.swift:11:9:11:12 | [post] self [x] | semmle.label | [post] self [x] | | implicit-self.swift:11:9:11:14 | MemberAccessExpr | semmle.label | MemberAccessExpr | @@ -275,6 +296,31 @@ nodes | test.swift:143:5:143:5 | [incoming] a | semmle.label | [incoming] a | | test.swift:143:20:143:34 | CallExpr | semmle.label | CallExpr | | test.swift:144:10:144:10 | a | semmle.label | a | +| test.swift:149:5:149:5 | [post] a [0] | semmle.label | [post] a [0] | +| test.swift:149:5:149:7 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| test.swift:149:23:149:37 | CallExpr | semmle.label | CallExpr | +| test.swift:150:10:150:10 | a [0] | semmle.label | a [0] | +| test.swift:150:10:150:12 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| test.swift:156:5:156:12 | TupleExpr [0] | semmle.label | TupleExpr [0] | +| test.swift:156:6:156:6 | [post] a [0] | semmle.label | [post] a [0] | +| test.swift:156:6:156:8 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| test.swift:156:16:156:61 | TupleExpr [0] | semmle.label | TupleExpr [0] | +| test.swift:156:17:156:43 | BinaryExpr | semmle.label | BinaryExpr | +| test.swift:156:29:156:43 | CallExpr | semmle.label | CallExpr | +| test.swift:157:10:157:10 | a [0] | semmle.label | a [0] | +| test.swift:157:10:157:12 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| test.swift:164:5:164:10 | TupleExpr [0] | semmle.label | TupleExpr [0] | +| test.swift:164:5:164:10 | TupleExpr [1] | semmle.label | TupleExpr [1] | +| test.swift:164:6:164:6 | a | semmle.label | a | +| test.swift:164:9:164:9 | b | semmle.label | b | +| test.swift:164:14:164:67 | TupleExpr [0] | semmle.label | TupleExpr [0] | +| test.swift:164:14:164:67 | TupleExpr [1] | semmle.label | TupleExpr [1] | +| test.swift:164:15:164:39 | BinaryExpr | semmle.label | BinaryExpr | +| test.swift:164:25:164:39 | CallExpr | semmle.label | CallExpr | +| test.swift:164:42:164:66 | BinaryExpr | semmle.label | BinaryExpr | +| test.swift:164:52:164:66 | CallExpr | semmle.label | CallExpr | +| test.swift:165:10:165:10 | a | semmle.label | a | +| test.swift:166:10:166:10 | b | semmle.label | b | subpaths testFailures #select @@ -320,3 +366,7 @@ testFailures | test.swift:132:10:132:10 | a | test.swift:131:19:131:33 | CallExpr | test.swift:132:10:132:10 | a | $@ | test.swift:131:19:131:33 | CallExpr | CallExpr | | test.swift:138:10:138:10 | a | test.swift:137:10:137:24 | CallExpr | test.swift:138:10:138:10 | a | $@ | test.swift:137:10:137:24 | CallExpr | CallExpr | | test.swift:144:10:144:10 | a | test.swift:143:20:143:34 | CallExpr | test.swift:144:10:144:10 | a | $@ | test.swift:143:20:143:34 | CallExpr | CallExpr | +| test.swift:150:10:150:12 | MemberAccessExpr | test.swift:149:23:149:37 | CallExpr | test.swift:150:10:150:12 | MemberAccessExpr | $@ | test.swift:149:23:149:37 | CallExpr | CallExpr | +| test.swift:157:10:157:12 | MemberAccessExpr | test.swift:156:29:156:43 | CallExpr | test.swift:157:10:157:12 | MemberAccessExpr | $@ | test.swift:156:29:156:43 | CallExpr | CallExpr | +| test.swift:165:10:165:10 | a | test.swift:164:25:164:39 | CallExpr | test.swift:165:10:165:10 | a | $@ | test.swift:164:25:164:39 | CallExpr | CallExpr | +| test.swift:166:10:166:10 | b | test.swift:164:52:164:66 | CallExpr | test.swift:166:10:166:10 | b | $@ | test.swift:164:52:164:66 | CallExpr | CallExpr | diff --git a/unified/ql/test/library-tests/dataflow/test.swift b/unified/ql/test/library-tests/dataflow/test.swift index 07d17d2910a9..988bcfe03f52 100644 --- a/unified/ql/test/library-tests/dataflow/test.swift +++ b/unified/ql/test/library-tests/dataflow/test.swift @@ -143,3 +143,25 @@ func t16() { a += sink(a) + source("t16.1"); sink(a); // $ hasTaintFlow=t16.1 } + +func t17() { + var a = ("safe", "safe"); + a.0 = sink(a.0) + source("t17.1"); + sink(a.0); // $ hasTaintFlow=t17.1 + sink(a.1); // no flow +} + +func t18() { + var a = ("safe", "safe"); + (a.0, _) = (sink(a.0) + source("t18.1"), source("t18.2")); + sink(a.0); // $ hasTaintFlow=t18.1 + sink(a.1); // no flow +} + +func t19() { + var a = "safe"; + var b = "safe"; + (a, b) = (sink(a) + source("t19.1"), sink(b) + source("t19.2")); + sink(a); // $ hasTaintFlow=t19.1 + sink(b); // $ hasTaintFlow=t19.2 +} From 220530c216a0e871bcc604a582225cca705140e8 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Thu, 17 Sep 2026 13:55:16 +0200 Subject: [PATCH 1091/2098] Rust: Don't preserve old nightly toolchains --- rust/extractor/src/toolchain.rs | 106 +++++++++++++++++++++++++++++--- 1 file changed, 99 insertions(+), 7 deletions(-) diff --git a/rust/extractor/src/toolchain.rs b/rust/extractor/src/toolchain.rs index 14a641bbee19..bf9c4fd043eb 100644 --- a/rust/extractor/src/toolchain.rs +++ b/rust/extractor/src/toolchain.rs @@ -17,6 +17,7 @@ use std::{io, process}; +use chrono::NaiveDate; use tracing::{info, warn}; /// The toolchain target by the extractor. This should usually be latest Rust @@ -25,6 +26,12 @@ use tracing::{info, warn}; /// When rust-analyzer is updated this version should be updated accordingly. const FIXED_RUST_TOOLCHAIN: &str = "1.97.0"; +/// The date of the oldest nightly toolchain known to work with our version of +/// rust-analyzer. +/// +/// When rust-analyzer is updated this version may need to be updated. +const MINIMUM_NIGHTLY_DATE: NaiveDate = NaiveDate::from_ymd_opt(2026, 7, 15).unwrap(); + /// The command output of asking `rustup` which toolchain is used by the Rust /// project in the current working directory. This main looks at /// `rust-toolchain.toml` if present. @@ -43,17 +50,42 @@ pub fn project_toolchain() -> io::Result { /// Returns the fixed toolchain except when the project is using a nightly /// toolchain. /// -/// When the project is using `nightly`, anything below is almost certain to not -/// work. In that case using the specified nightly toolchain may work if the -/// toolchain is compatible with our rust-analyzer version. +/// Recent nightly toolchains are preserved so that projects can use unstable +/// features. Older dated nightlies are replaced with the oldest nightly known +/// to be compatible with our rust-analyzer version. pub fn select_toolchain() -> String { - let nightly = project_toolchain() + let project_toolchain = project_toolchain() .ok() .filter(|output| output.status.success()) .and_then(|output| String::from_utf8(output.stdout).ok()) - .and_then(|toolchain| toolchain.split_whitespace().next().map(str::to_owned)) - .filter(|toolchain| toolchain.starts_with("nightly")); - nightly.unwrap_or_else(|| FIXED_RUST_TOOLCHAIN.to_owned()) + .unwrap_or_default(); + select_toolchain_from_project_toolchain(&project_toolchain) +} + +fn select_toolchain_from_project_toolchain(project_toolchain: &str) -> String { + let nightly_toolchain = project_toolchain + .split_whitespace() + .next() + .filter(|toolchain| toolchain.starts_with("nightly")) + .map(str::to_owned) + .map(cap_nightly_toolchain); + nightly_toolchain.unwrap_or_else(|| FIXED_RUST_TOOLCHAIN.to_owned()) +} + +fn cap_nightly_toolchain(nightly_toolchain: String) -> String { + if let Some(project_date) = nightly_date(&nightly_toolchain) + && project_date < MINIMUM_NIGHTLY_DATE + { + format!("nightly-{MINIMUM_NIGHTLY_DATE}") + } else { + nightly_toolchain + } +} + +/// Parse the date from a nightly toolchain string. +fn nightly_date(toolchain: &str) -> Option { + let suffix = toolchain.strip_prefix("nightly-")?; + (suffix.len() >= 10).then(|| NaiveDate::parse_from_str(suffix.get(..10)?, "%Y-%m-%d").ok())? } pub fn log_project_toolchain() { @@ -69,3 +101,63 @@ pub fn log_project_toolchain() { Err(error) => warn!("unable to determine project Rust toolchain: {error}"), } } + +#[cfg(test)] +mod tests { + use super::{MINIMUM_NIGHTLY_DATE, select_toolchain_from_project_toolchain}; + + #[test] + fn preserves_rolling_nightly_toolchain() { + assert_eq!( + select_toolchain_from_project_toolchain("nightly-aarch64-apple-darwin"), + "nightly-aarch64-apple-darwin" + ); + } + + #[test] + fn replaces_old_dated_nightly_toolchain() { + assert_eq!( + select_toolchain_from_project_toolchain("nightly-2025-07-15-aarch64-apple-darwin"), + format!("nightly-{MINIMUM_NIGHTLY_DATE}") + ); + assert_eq!( + select_toolchain_from_project_toolchain("nightly-2025-07-15"), + format!("nightly-{MINIMUM_NIGHTLY_DATE}") + ); + } + + #[test] + fn preserves_minimum_dated_nightly_toolchain() { + assert_eq!( + select_toolchain_from_project_toolchain("nightly-2026-07-15-aarch64-apple-darwin"), + "nightly-2026-07-15-aarch64-apple-darwin" + ); + } + + #[test] + fn preserves_newer_dated_nightly_toolchain() { + assert_eq!( + select_toolchain_from_project_toolchain("nightly-2026-09-01-aarch64-apple-darwin"), + "nightly-2026-09-01-aarch64-apple-darwin" + ); + } + + #[test] + fn preserves_unrecognized_nightly_toolchain() { + assert_eq!( + select_toolchain_from_project_toolchain("nightly-custom"), + "nightly-custom" + ); + assert_eq!( + select_toolchain_from_project_toolchain("nightly-2026-99-99-aarch64-apple-darwin"), + "nightly-2026-99-99-aarch64-apple-darwin" + ); + } + + #[test] + fn minimum_nightly_matches_qltest_toolchain() { + // The minimum nightly toolchain should match the one we test against. + let toolchain_file = include_str!("nightly-toolchain/rust-toolchain.toml"); + assert!(toolchain_file.contains(&format!("channel = \"nightly-{MINIMUM_NIGHTLY_DATE}\""))); + } +} From 8565611780df9489831b1ffc7aa1523099585c11 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Thu, 17 Sep 2026 14:04:50 +0200 Subject: [PATCH 1092/2098] Bazel skill: narrow the rust.bzl rationale to shipped binaries The wrapper is mandatory for binaries that go into a pack, not for every rust_binary in the repo: swift-syntax-parse is a local debugging aid and deliberately declares a plain one. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .github/skills/bazel/SKILL.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/skills/bazel/SKILL.md b/.github/skills/bazel/SKILL.md index 4447b8a84ce6..df69f4b39bdc 100644 --- a/.github/skills/bazel/SKILL.md +++ b/.github/skills/bazel/SKILL.md @@ -48,9 +48,11 @@ Bazel's own macro / rule / repository-rule distinction applies as usual. What is | a wrapper used across languages | `misc/bazel/` | Prefer inline rules in `BUILD.bazel`. A `.bzl` file earns its `load()` only when the shape repeats across packages or a -value must be computed: [`rust.bzl`](../../../misc/bazel/rust.bzl) is worth it because every Rust binary in the repo -must get the same universal-binary wrapper and symbols test, and forgetting either is a release bug. The `_gen_binaries` -list in [`go/BUILD.bazel`](../../../go/BUILD.bazel) is not — it is shared by two targets in one file, so a local +value must be computed: [`rust.bzl`](../../../misc/bazel/rust.bzl) is worth it because every Rust binary that ships in a +pack must get the same universal-binary wrapper and symbols test, and forgetting either is a release bug. A local +debugging aid opts out and declares a plain `rust_binary` — see `swift-syntax-parse` in +[`unified/swift-syntax-rs/BUILD.bazel`](../../../unified/swift-syntax-rs/BUILD.bazel). The `_gen_binaries` list in +[`go/BUILD.bazel`](../../../go/BUILD.bazel) does not earn a `.bzl` — it is shared by two targets in one file, so a local variable does the job. Macros here are typically a thin public wrapper around a private rule (`codeql_csharp_binary`, `swift_cc_binary`). Keep From 49f4967c4dae642255b01a49cd985e9cb07f0440 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Thu, 17 Sep 2026 14:13:48 +0200 Subject: [PATCH 1093/2098] Bazel skill: generated-target visibility is per-macro, not an invariant Each macro picks whether its helper targets are private, package default or handed the caller's visibility. Keep the naming shapes as examples and the grep-the-suffix tip, drop the blanket claim. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .github/skills/bazel/SKILL.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/skills/bazel/SKILL.md b/.github/skills/bazel/SKILL.md index df69f4b39bdc..998a8223ee83 100644 --- a/.github/skills/bazel/SKILL.md +++ b/.github/skills/bazel/SKILL.md @@ -56,9 +56,10 @@ debugging aid opts out and declares a plain `rust_binary` — see `swift-syntax- variable does the job. Macros here are typically a thin public wrapper around a private rule (`codeql_csharp_binary`, `swift_cc_binary`). Keep -the rule narrow and the ergonomics in the macro. Generated targets are named after the macro's `name` (`-all`, -`single_arch/`, `internal/`) and kept private; when an error names a target you cannot find in any source -file, a macro minted it — grep the suffix under `misc/bazel/`. +the rule narrow and the ergonomics in the macro. Each macro decorates the caller's `name` to mint its helper targets +(`internal/`, `single_arch/`, `bin/`), but the visibility they get is that macro's choice — private, +package default, or the caller's own — so read it instead of assuming. When an error names a target you cannot find in +any source file, a macro minted it — grep the suffix under `misc/bazel/`. ## Shared helpers From 903466fc8aa658db3fa84d3d375009695ea2e868 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 17 Sep 2026 12:45:51 +0000 Subject: [PATCH 1094/2098] Release preparation for version 2.27.1 --- actions/ql/lib/CHANGELOG.md | 4 ++++ actions/ql/lib/change-notes/released/0.6.2.md | 3 +++ actions/ql/lib/codeql-pack.release.yml | 2 +- actions/ql/lib/qlpack.yml | 2 +- actions/ql/src/CHANGELOG.md | 7 +++++++ .../2026-07-09-unpinned-tag-lockfile-aware.md | 4 ---- .../0.6.36.md} | 8 +++++--- actions/ql/src/codeql-pack.release.yml | 2 +- actions/ql/src/qlpack.yml | 2 +- cpp/ql/lib/CHANGELOG.md | 8 ++++++++ .../lib/change-notes/2026-08-27-bdlbb-blob-models.md | 4 ---- cpp/ql/lib/change-notes/2026-08-27-protobuf-models.md | 4 ---- .../change-notes/2026-09-08-boost-asio-ip-resolve.md | 4 ---- cpp/ql/lib/change-notes/released/12.1.1.md | 7 +++++++ cpp/ql/lib/codeql-pack.release.yml | 2 +- cpp/ql/lib/qlpack.yml | 2 +- cpp/ql/src/CHANGELOG.md | 8 ++++++++ .../1.9.0.md} | 7 ++++--- cpp/ql/src/codeql-pack.release.yml | 2 +- cpp/ql/src/qlpack.yml | 2 +- csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md | 4 ++++ .../Solorigate/lib/change-notes/released/1.7.75.md | 3 +++ .../campaigns/Solorigate/lib/codeql-pack.release.yml | 2 +- csharp/ql/campaigns/Solorigate/lib/qlpack.yml | 2 +- csharp/ql/campaigns/Solorigate/src/CHANGELOG.md | 4 ++++ .../Solorigate/src/change-notes/released/1.7.75.md | 3 +++ .../campaigns/Solorigate/src/codeql-pack.release.yml | 2 +- csharp/ql/campaigns/Solorigate/src/qlpack.yml | 2 +- csharp/ql/lib/CHANGELOG.md | 6 ++++++ .../7.3.1.md} | 7 ++++--- csharp/ql/lib/codeql-pack.release.yml | 2 +- csharp/ql/lib/qlpack.yml | 2 +- csharp/ql/src/CHANGELOG.md | 11 +++++++++++ .../src/change-notes/2026-08-27-csrf-autovalidate.md | 4 ---- .../change-notes/2026-09-03-missed-firstordefault.md | 4 ---- .../change-notes/2026-09-10-missed-linq-inoutref.md | 4 ---- csharp/ql/src/change-notes/released/1.10.0.md | 10 ++++++++++ csharp/ql/src/codeql-pack.release.yml | 2 +- csharp/ql/src/qlpack.yml | 2 +- go/ql/consistency-queries/CHANGELOG.md | 4 ++++ .../change-notes/released/1.0.58.md | 3 +++ go/ql/consistency-queries/codeql-pack.release.yml | 2 +- go/ql/consistency-queries/qlpack.yml | 2 +- go/ql/lib/CHANGELOG.md | 9 +++++++++ .../7.3.2.md} | 7 ++++--- go/ql/lib/codeql-pack.release.yml | 2 +- go/ql/lib/qlpack.yml | 2 +- go/ql/src/CHANGELOG.md | 4 ++++ go/ql/src/change-notes/released/1.6.11.md | 3 +++ go/ql/src/codeql-pack.release.yml | 2 +- go/ql/src/qlpack.yml | 2 +- java/ql/lib/CHANGELOG.md | 7 +++++++ java/ql/lib/change-notes/2026-08-21-kotlin-2.4.20.md | 4 ---- .../9.3.1.md} | 8 +++++--- java/ql/lib/codeql-pack.release.yml | 2 +- java/ql/lib/qlpack.yml | 2 +- java/ql/src/CHANGELOG.md | 4 ++++ java/ql/src/change-notes/released/1.11.11.md | 3 +++ java/ql/src/codeql-pack.release.yml | 2 +- java/ql/src/qlpack.yml | 2 +- javascript/ql/lib/CHANGELOG.md | 6 ++++++ .../2.10.2.md} | 7 ++++--- javascript/ql/lib/codeql-pack.release.yml | 2 +- javascript/ql/lib/qlpack.yml | 2 +- javascript/ql/src/CHANGELOG.md | 4 ++++ javascript/ql/src/change-notes/released/2.4.6.md | 3 +++ javascript/ql/src/codeql-pack.release.yml | 2 +- javascript/ql/src/qlpack.yml | 2 +- misc/suite-helpers/CHANGELOG.md | 4 ++++ misc/suite-helpers/change-notes/released/1.0.58.md | 3 +++ misc/suite-helpers/codeql-pack.release.yml | 2 +- misc/suite-helpers/qlpack.yml | 2 +- python/ql/lib/CHANGELOG.md | 4 ++++ python/ql/lib/change-notes/released/7.2.6.md | 3 +++ python/ql/lib/codeql-pack.release.yml | 2 +- python/ql/lib/qlpack.yml | 2 +- python/ql/src/CHANGELOG.md | 4 ++++ python/ql/src/change-notes/released/1.8.11.md | 3 +++ python/ql/src/codeql-pack.release.yml | 2 +- python/ql/src/qlpack.yml | 2 +- ruby/ql/lib/CHANGELOG.md | 4 ++++ ruby/ql/lib/change-notes/released/7.0.1.md | 3 +++ ruby/ql/lib/codeql-pack.release.yml | 2 +- ruby/ql/lib/qlpack.yml | 2 +- ruby/ql/src/CHANGELOG.md | 4 ++++ ruby/ql/src/change-notes/released/1.6.11.md | 3 +++ ruby/ql/src/codeql-pack.release.yml | 2 +- ruby/ql/src/qlpack.yml | 2 +- rust/ql/lib/CHANGELOG.md | 8 ++++++++ .../2026-08-19-rust-core-fmt-flow-models.md | 4 ---- .../ql/lib/change-notes/2026-09-07-self-path-trait.md | 4 ---- .../0.2.22.md} | 9 ++++++--- rust/ql/lib/codeql-pack.release.yml | 2 +- rust/ql/lib/qlpack.yml | 2 +- rust/ql/src/CHANGELOG.md | 4 ++++ rust/ql/src/change-notes/released/0.1.43.md | 3 +++ rust/ql/src/codeql-pack.release.yml | 2 +- rust/ql/src/qlpack.yml | 2 +- shared/concepts/CHANGELOG.md | 4 ++++ shared/concepts/change-notes/released/0.0.32.md | 3 +++ shared/concepts/codeql-pack.release.yml | 2 +- shared/concepts/qlpack.yml | 2 +- shared/controlflow/CHANGELOG.md | 4 ++++ shared/controlflow/change-notes/released/2.0.42.md | 3 +++ shared/controlflow/codeql-pack.release.yml | 2 +- shared/controlflow/qlpack.yml | 2 +- shared/dataflow/CHANGELOG.md | 4 ++++ shared/dataflow/change-notes/released/2.1.14.md | 3 +++ shared/dataflow/codeql-pack.release.yml | 2 +- shared/dataflow/qlpack.yml | 2 +- shared/mad/CHANGELOG.md | 4 ++++ shared/mad/change-notes/released/1.0.58.md | 3 +++ shared/mad/codeql-pack.release.yml | 2 +- shared/mad/qlpack.yml | 2 +- shared/namebinding/CHANGELOG.md | 4 ++++ shared/namebinding/change-notes/released/0.0.7.md | 3 +++ shared/namebinding/codeql-pack.release.yml | 2 +- shared/namebinding/qlpack.yml | 2 +- shared/quantum/CHANGELOG.md | 4 ++++ shared/quantum/change-notes/released/0.0.36.md | 3 +++ shared/quantum/codeql-pack.release.yml | 2 +- shared/quantum/qlpack.yml | 2 +- shared/rangeanalysis/CHANGELOG.md | 4 ++++ shared/rangeanalysis/change-notes/released/1.0.58.md | 3 +++ shared/rangeanalysis/codeql-pack.release.yml | 2 +- shared/rangeanalysis/qlpack.yml | 2 +- shared/regex/CHANGELOG.md | 4 ++++ shared/regex/change-notes/released/1.0.58.md | 3 +++ shared/regex/codeql-pack.release.yml | 2 +- shared/regex/qlpack.yml | 2 +- shared/ssa/CHANGELOG.md | 4 ++++ shared/ssa/change-notes/released/2.0.34.md | 3 +++ shared/ssa/codeql-pack.release.yml | 2 +- shared/ssa/qlpack.yml | 2 +- shared/threat-models/CHANGELOG.md | 4 ++++ shared/threat-models/change-notes/released/1.0.58.md | 3 +++ shared/threat-models/codeql-pack.release.yml | 2 +- shared/threat-models/qlpack.yml | 2 +- shared/tutorial/CHANGELOG.md | 4 ++++ shared/tutorial/change-notes/released/1.0.58.md | 3 +++ shared/tutorial/codeql-pack.release.yml | 2 +- shared/tutorial/qlpack.yml | 2 +- shared/typeflow/CHANGELOG.md | 4 ++++ shared/typeflow/change-notes/released/1.0.58.md | 3 +++ shared/typeflow/codeql-pack.release.yml | 2 +- shared/typeflow/qlpack.yml | 2 +- shared/typeinference/CHANGELOG.md | 4 ++++ shared/typeinference/change-notes/released/0.0.39.md | 3 +++ shared/typeinference/codeql-pack.release.yml | 2 +- shared/typeinference/qlpack.yml | 2 +- shared/typetracking/CHANGELOG.md | 4 ++++ shared/typetracking/change-notes/released/2.0.42.md | 3 +++ shared/typetracking/codeql-pack.release.yml | 2 +- shared/typetracking/qlpack.yml | 2 +- shared/typos/CHANGELOG.md | 4 ++++ shared/typos/change-notes/released/1.0.58.md | 3 +++ shared/typos/codeql-pack.release.yml | 2 +- shared/typos/qlpack.yml | 2 +- shared/util/CHANGELOG.md | 4 ++++ shared/util/change-notes/released/2.0.45.md | 3 +++ shared/util/codeql-pack.release.yml | 2 +- shared/util/qlpack.yml | 2 +- shared/xml/CHANGELOG.md | 4 ++++ shared/xml/change-notes/released/1.0.58.md | 3 +++ shared/xml/codeql-pack.release.yml | 2 +- shared/xml/qlpack.yml | 2 +- shared/yaml/CHANGELOG.md | 4 ++++ shared/yaml/change-notes/released/1.0.58.md | 3 +++ shared/yaml/codeql-pack.release.yml | 2 +- shared/yaml/qlpack.yml | 2 +- swift/ql/lib/CHANGELOG.md | 4 ++++ swift/ql/lib/change-notes/released/6.8.4.md | 3 +++ swift/ql/lib/codeql-pack.release.yml | 2 +- swift/ql/lib/qlpack.yml | 2 +- swift/ql/src/CHANGELOG.md | 4 ++++ swift/ql/src/change-notes/released/1.3.11.md | 3 +++ swift/ql/src/codeql-pack.release.yml | 2 +- swift/ql/src/qlpack.yml | 2 +- 178 files changed, 434 insertions(+), 145 deletions(-) create mode 100644 actions/ql/lib/change-notes/released/0.6.2.md delete mode 100644 actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md rename actions/ql/src/change-notes/{2026-07-09-unpinned-tag-self-repository.md => released/0.6.36.md} (55%) delete mode 100644 cpp/ql/lib/change-notes/2026-08-27-bdlbb-blob-models.md delete mode 100644 cpp/ql/lib/change-notes/2026-08-27-protobuf-models.md delete mode 100644 cpp/ql/lib/change-notes/2026-09-08-boost-asio-ip-resolve.md create mode 100644 cpp/ql/lib/change-notes/released/12.1.1.md rename cpp/ql/src/change-notes/{2026-08-13-ambiguous-assignment-of-comparison.md => released/1.9.0.md} (88%) create mode 100644 csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.75.md create mode 100644 csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.75.md rename csharp/ql/lib/change-notes/{2026-09-03-replaces-base.md => released/7.3.1.md} (86%) delete mode 100644 csharp/ql/src/change-notes/2026-08-27-csrf-autovalidate.md delete mode 100644 csharp/ql/src/change-notes/2026-09-03-missed-firstordefault.md delete mode 100644 csharp/ql/src/change-notes/2026-09-10-missed-linq-inoutref.md create mode 100644 csharp/ql/src/change-notes/released/1.10.0.md create mode 100644 go/ql/consistency-queries/change-notes/released/1.0.58.md rename go/ql/lib/change-notes/{2026-09-09-go-1.27-models.md => released/7.3.2.md} (93%) create mode 100644 go/ql/src/change-notes/released/1.6.11.md delete mode 100644 java/ql/lib/change-notes/2026-08-21-kotlin-2.4.20.md rename java/ql/lib/change-notes/{2026-05-30-kclass-java-arg-k2-fix.md => released/9.3.1.md} (70%) create mode 100644 java/ql/src/change-notes/released/1.11.11.md rename javascript/ql/lib/change-notes/{2026-09-10-fastify-chainable-config-methods.md => released/2.10.2.md} (91%) create mode 100644 javascript/ql/src/change-notes/released/2.4.6.md create mode 100644 misc/suite-helpers/change-notes/released/1.0.58.md create mode 100644 python/ql/lib/change-notes/released/7.2.6.md create mode 100644 python/ql/src/change-notes/released/1.8.11.md create mode 100644 ruby/ql/lib/change-notes/released/7.0.1.md create mode 100644 ruby/ql/src/change-notes/released/1.6.11.md delete mode 100644 rust/ql/lib/change-notes/2026-08-19-rust-core-fmt-flow-models.md delete mode 100644 rust/ql/lib/change-notes/2026-09-07-self-path-trait.md rename rust/ql/lib/change-notes/{2026-08-14-rust-analyzer-0.0.347.md => released/0.2.22.md} (72%) create mode 100644 rust/ql/src/change-notes/released/0.1.43.md create mode 100644 shared/concepts/change-notes/released/0.0.32.md create mode 100644 shared/controlflow/change-notes/released/2.0.42.md create mode 100644 shared/dataflow/change-notes/released/2.1.14.md create mode 100644 shared/mad/change-notes/released/1.0.58.md create mode 100644 shared/namebinding/change-notes/released/0.0.7.md create mode 100644 shared/quantum/change-notes/released/0.0.36.md create mode 100644 shared/rangeanalysis/change-notes/released/1.0.58.md create mode 100644 shared/regex/change-notes/released/1.0.58.md create mode 100644 shared/ssa/change-notes/released/2.0.34.md create mode 100644 shared/threat-models/change-notes/released/1.0.58.md create mode 100644 shared/tutorial/change-notes/released/1.0.58.md create mode 100644 shared/typeflow/change-notes/released/1.0.58.md create mode 100644 shared/typeinference/change-notes/released/0.0.39.md create mode 100644 shared/typetracking/change-notes/released/2.0.42.md create mode 100644 shared/typos/change-notes/released/1.0.58.md create mode 100644 shared/util/change-notes/released/2.0.45.md create mode 100644 shared/xml/change-notes/released/1.0.58.md create mode 100644 shared/yaml/change-notes/released/1.0.58.md create mode 100644 swift/ql/lib/change-notes/released/6.8.4.md create mode 100644 swift/ql/src/change-notes/released/1.3.11.md diff --git a/actions/ql/lib/CHANGELOG.md b/actions/ql/lib/CHANGELOG.md index d1943239b2d1..db853ead17bd 100644 --- a/actions/ql/lib/CHANGELOG.md +++ b/actions/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.2 + +No user-facing changes. + ## 0.6.1 ### New Features diff --git a/actions/ql/lib/change-notes/released/0.6.2.md b/actions/ql/lib/change-notes/released/0.6.2.md new file mode 100644 index 000000000000..43f80640fc5e --- /dev/null +++ b/actions/ql/lib/change-notes/released/0.6.2.md @@ -0,0 +1,3 @@ +## 0.6.2 + +No user-facing changes. diff --git a/actions/ql/lib/codeql-pack.release.yml b/actions/ql/lib/codeql-pack.release.yml index 80fb0899f645..5501a2a1cc59 100644 --- a/actions/ql/lib/codeql-pack.release.yml +++ b/actions/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.6.1 +lastReleaseVersion: 0.6.2 diff --git a/actions/ql/lib/qlpack.yml b/actions/ql/lib/qlpack.yml index 268018a37415..f905941a9751 100644 --- a/actions/ql/lib/qlpack.yml +++ b/actions/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-all -version: 0.6.2-dev +version: 0.6.2 library: true warnOnImplicitThis: true dependencies: diff --git a/actions/ql/src/CHANGELOG.md b/actions/ql/src/CHANGELOG.md index 9676c26efaff..4220f2dda356 100644 --- a/actions/ql/src/CHANGELOG.md +++ b/actions/ql/src/CHANGELOG.md @@ -1,3 +1,10 @@ +## 0.6.36 + +### Minor Analysis Improvements + +* The `actions/unpinned-tag` query no longer reports action references pinned by a structurally valid `.github/workflows/actions.lock` entry for the enclosing workflow. +* The `actions/unpinned-tag` query no longer reports `$/` self repository references (e.g. `uses: $/path/to/action`), which resolve to the same repository at the running commit and are therefore inherently pinned, just like `./` self workspace (local) references. + ## 0.6.35 No user-facing changes. diff --git a/actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md b/actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md deleted file mode 100644 index 258850e3c52a..000000000000 --- a/actions/ql/src/change-notes/2026-07-09-unpinned-tag-lockfile-aware.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The `actions/unpinned-tag` query no longer reports action references pinned by a structurally valid `.github/workflows/actions.lock` entry for the enclosing workflow. diff --git a/actions/ql/src/change-notes/2026-07-09-unpinned-tag-self-repository.md b/actions/ql/src/change-notes/released/0.6.36.md similarity index 55% rename from actions/ql/src/change-notes/2026-07-09-unpinned-tag-self-repository.md rename to actions/ql/src/change-notes/released/0.6.36.md index 02e1eac704b2..1dce71ce8b9d 100644 --- a/actions/ql/src/change-notes/2026-07-09-unpinned-tag-self-repository.md +++ b/actions/ql/src/change-notes/released/0.6.36.md @@ -1,4 +1,6 @@ ---- -category: minorAnalysis ---- +## 0.6.36 + +### Minor Analysis Improvements + +* The `actions/unpinned-tag` query no longer reports action references pinned by a structurally valid `.github/workflows/actions.lock` entry for the enclosing workflow. * The `actions/unpinned-tag` query no longer reports `$/` self repository references (e.g. `uses: $/path/to/action`), which resolve to the same repository at the running commit and are therefore inherently pinned, just like `./` self workspace (local) references. diff --git a/actions/ql/src/codeql-pack.release.yml b/actions/ql/src/codeql-pack.release.yml index 0a9561ad0b98..405fe4fe2246 100644 --- a/actions/ql/src/codeql-pack.release.yml +++ b/actions/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.6.35 +lastReleaseVersion: 0.6.36 diff --git a/actions/ql/src/qlpack.yml b/actions/ql/src/qlpack.yml index 5feedb52c8ce..011ff8278576 100644 --- a/actions/ql/src/qlpack.yml +++ b/actions/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-queries -version: 0.6.36-dev +version: 0.6.36 library: false warnOnImplicitThis: true groups: [actions, queries] diff --git a/cpp/ql/lib/CHANGELOG.md b/cpp/ql/lib/CHANGELOG.md index c42b0d3ec5d5..a3b3f173f5d1 100644 --- a/cpp/ql/lib/CHANGELOG.md +++ b/cpp/ql/lib/CHANGELOG.md @@ -1,3 +1,11 @@ +## 12.1.1 + +### Minor Analysis Improvements + +* Added taint flow models for the `boost::asio::ip::basic_resolver::resolve` function. +* Added flow summaries for the BDE `BloombergLP::bdlbb::Blob` segmented byte buffer. +* Added flow summaries for the Protocol Buffers `google::protobuf::MessageLite` C++ API. + ## 12.1.0 ### New Features diff --git a/cpp/ql/lib/change-notes/2026-08-27-bdlbb-blob-models.md b/cpp/ql/lib/change-notes/2026-08-27-bdlbb-blob-models.md deleted file mode 100644 index ed52e5e091e2..000000000000 --- a/cpp/ql/lib/change-notes/2026-08-27-bdlbb-blob-models.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added flow summaries for the BDE `BloombergLP::bdlbb::Blob` segmented byte buffer. diff --git a/cpp/ql/lib/change-notes/2026-08-27-protobuf-models.md b/cpp/ql/lib/change-notes/2026-08-27-protobuf-models.md deleted file mode 100644 index 952a1e2a0e33..000000000000 --- a/cpp/ql/lib/change-notes/2026-08-27-protobuf-models.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added flow summaries for the Protocol Buffers `google::protobuf::MessageLite` C++ API. diff --git a/cpp/ql/lib/change-notes/2026-09-08-boost-asio-ip-resolve.md b/cpp/ql/lib/change-notes/2026-09-08-boost-asio-ip-resolve.md deleted file mode 100644 index 9276eed8ed83..000000000000 --- a/cpp/ql/lib/change-notes/2026-09-08-boost-asio-ip-resolve.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added taint flow models for the `boost::asio::ip::basic_resolver::resolve` function. \ No newline at end of file diff --git a/cpp/ql/lib/change-notes/released/12.1.1.md b/cpp/ql/lib/change-notes/released/12.1.1.md new file mode 100644 index 000000000000..9f0cb4c5ad36 --- /dev/null +++ b/cpp/ql/lib/change-notes/released/12.1.1.md @@ -0,0 +1,7 @@ +## 12.1.1 + +### Minor Analysis Improvements + +* Added taint flow models for the `boost::asio::ip::basic_resolver::resolve` function. +* Added flow summaries for the BDE `BloombergLP::bdlbb::Blob` segmented byte buffer. +* Added flow summaries for the Protocol Buffers `google::protobuf::MessageLite` C++ API. diff --git a/cpp/ql/lib/codeql-pack.release.yml b/cpp/ql/lib/codeql-pack.release.yml index 87f64222020b..35ce909f91a0 100644 --- a/cpp/ql/lib/codeql-pack.release.yml +++ b/cpp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 12.1.0 +lastReleaseVersion: 12.1.1 diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index 5114bf861a36..bc08d146770d 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-all -version: 12.1.1-dev +version: 12.1.1 groups: cpp dbscheme: semmlecode.cpp.dbscheme extractor: cpp diff --git a/cpp/ql/src/CHANGELOG.md b/cpp/ql/src/CHANGELOG.md index de14ac42a586..2431bf053346 100644 --- a/cpp/ql/src/CHANGELOG.md +++ b/cpp/ql/src/CHANGELOG.md @@ -1,3 +1,11 @@ +## 1.9.0 + +### New Queries + +* Added a new query, `cpp/ambiguous-assignment-of-comparison`, to detect potentially + ambiguous expressions where a comparison result is assigned to a variable and the + assignment is used as a truth value. + ## 1.8.3 ### Minor Analysis Improvements diff --git a/cpp/ql/src/change-notes/2026-08-13-ambiguous-assignment-of-comparison.md b/cpp/ql/src/change-notes/released/1.9.0.md similarity index 88% rename from cpp/ql/src/change-notes/2026-08-13-ambiguous-assignment-of-comparison.md rename to cpp/ql/src/change-notes/released/1.9.0.md index bcec04cbf241..61431fce84ed 100644 --- a/cpp/ql/src/change-notes/2026-08-13-ambiguous-assignment-of-comparison.md +++ b/cpp/ql/src/change-notes/released/1.9.0.md @@ -1,6 +1,7 @@ ---- -category: newQuery ---- +## 1.9.0 + +### New Queries + * Added a new query, `cpp/ambiguous-assignment-of-comparison`, to detect potentially ambiguous expressions where a comparison result is assigned to a variable and the assignment is used as a truth value. diff --git a/cpp/ql/src/codeql-pack.release.yml b/cpp/ql/src/codeql-pack.release.yml index 8071ef421ab4..df17dc3a3662 100644 --- a/cpp/ql/src/codeql-pack.release.yml +++ b/cpp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.8.3 +lastReleaseVersion: 1.9.0 diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml index 034523449c24..a05ad83ab85f 100644 --- a/cpp/ql/src/qlpack.yml +++ b/cpp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-queries -version: 1.8.4-dev +version: 1.9.0 groups: - cpp - queries diff --git a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md index 8d3c16f6bc95..2b5054095dc6 100644 --- a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.7.75 + +No user-facing changes. + ## 1.7.74 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.75.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.75.md new file mode 100644 index 000000000000..0793cd5cd065 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.75.md @@ -0,0 +1,3 @@ +## 1.7.75 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml index 34061dc1c22a..f2554616a7cd 100644 --- a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.74 +lastReleaseVersion: 1.7.75 diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml index 07c306a65a9d..d2f3ebb9bad8 100644 --- a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-all -version: 1.7.75-dev +version: 1.7.75 groups: - csharp - solorigate diff --git a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md index 8d3c16f6bc95..2b5054095dc6 100644 --- a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.7.75 + +No user-facing changes. + ## 1.7.74 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.75.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.75.md new file mode 100644 index 000000000000..0793cd5cd065 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.75.md @@ -0,0 +1,3 @@ +## 1.7.75 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml index 34061dc1c22a..f2554616a7cd 100644 --- a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.74 +lastReleaseVersion: 1.7.75 diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml index 94bf9c0f7db3..2a4bce7db26d 100644 --- a/csharp/ql/campaigns/Solorigate/src/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-queries -version: 1.7.75-dev +version: 1.7.75 groups: - csharp - solorigate diff --git a/csharp/ql/lib/CHANGELOG.md b/csharp/ql/lib/CHANGELOG.md index 78b2f677db3e..82ba01b981d6 100644 --- a/csharp/ql/lib/CHANGELOG.md +++ b/csharp/ql/lib/CHANGELOG.md @@ -1,3 +1,9 @@ +## 7.3.1 + +### Minor Analysis Improvements + +* Private NuGet registries for which the "Replaces base" option is enabled in the organization-level private registry configuration now replace default NuGet feeds whenever dependencies are downloaded, including when default NuGet feeds are configured explicitly for a project. + ## 7.3.0 ### New Features diff --git a/csharp/ql/lib/change-notes/2026-09-03-replaces-base.md b/csharp/ql/lib/change-notes/released/7.3.1.md similarity index 86% rename from csharp/ql/lib/change-notes/2026-09-03-replaces-base.md rename to csharp/ql/lib/change-notes/released/7.3.1.md index 2a80f4a89eab..07bdb3c1b643 100644 --- a/csharp/ql/lib/change-notes/2026-09-03-replaces-base.md +++ b/csharp/ql/lib/change-notes/released/7.3.1.md @@ -1,4 +1,5 @@ ---- -category: minorAnalysis ---- +## 7.3.1 + +### Minor Analysis Improvements + * Private NuGet registries for which the "Replaces base" option is enabled in the organization-level private registry configuration now replace default NuGet feeds whenever dependencies are downloaded, including when default NuGet feeds are configured explicitly for a project. diff --git a/csharp/ql/lib/codeql-pack.release.yml b/csharp/ql/lib/codeql-pack.release.yml index 2b9b871fffa7..43cb026b1392 100644 --- a/csharp/ql/lib/codeql-pack.release.yml +++ b/csharp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 7.3.0 +lastReleaseVersion: 7.3.1 diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index 18ee2c149098..123af97b1c3c 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-all -version: 7.3.1-dev +version: 7.3.1 groups: csharp dbscheme: semmlecode.csharp.dbscheme extractor: csharp diff --git a/csharp/ql/src/CHANGELOG.md b/csharp/ql/src/CHANGELOG.md index cf86d815aa53..6e6f89ac813b 100644 --- a/csharp/ql/src/CHANGELOG.md +++ b/csharp/ql/src/CHANGELOG.md @@ -1,3 +1,14 @@ +## 1.10.0 + +### New Queries + +* Added a new query, `cs/linq/missed-firstordefault`, that detects `foreach` loops that can be expressed more clearly using LINQ's `FirstOrDefault` method. + +### Minor Analysis Improvements + +* The `cs/linq/missed-*` queries no longer suggest rewrites that would capture `in`, `out`, or `ref` parameters in a lambda, fixing false-positive results for transformations that would not compile. +* The `cs/web/missing-token-validation` query now recognizes an ASP.NET Core `AutoValidateAntiforgeryTokenAttribute` registered as a global MVC filter through `AddControllersWithViews` (and friends), avoiding false-positive results for covered actions. + ## 1.9.3 ### Minor Analysis Improvements diff --git a/csharp/ql/src/change-notes/2026-08-27-csrf-autovalidate.md b/csharp/ql/src/change-notes/2026-08-27-csrf-autovalidate.md deleted file mode 100644 index 7ba5dbe4467c..000000000000 --- a/csharp/ql/src/change-notes/2026-08-27-csrf-autovalidate.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The `cs/web/missing-token-validation` query now recognizes an ASP.NET Core `AutoValidateAntiforgeryTokenAttribute` registered as a global MVC filter through `AddControllersWithViews` (and friends), avoiding false-positive results for covered actions. diff --git a/csharp/ql/src/change-notes/2026-09-03-missed-firstordefault.md b/csharp/ql/src/change-notes/2026-09-03-missed-firstordefault.md deleted file mode 100644 index f4fed0de1301..000000000000 --- a/csharp/ql/src/change-notes/2026-09-03-missed-firstordefault.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: newQuery ---- -* Added a new query, `cs/linq/missed-firstordefault`, that detects `foreach` loops that can be expressed more clearly using LINQ's `FirstOrDefault` method. diff --git a/csharp/ql/src/change-notes/2026-09-10-missed-linq-inoutref.md b/csharp/ql/src/change-notes/2026-09-10-missed-linq-inoutref.md deleted file mode 100644 index 400e0bcd2ed0..000000000000 --- a/csharp/ql/src/change-notes/2026-09-10-missed-linq-inoutref.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The `cs/linq/missed-*` queries no longer suggest rewrites that would capture `in`, `out`, or `ref` parameters in a lambda, fixing false-positive results for transformations that would not compile. diff --git a/csharp/ql/src/change-notes/released/1.10.0.md b/csharp/ql/src/change-notes/released/1.10.0.md new file mode 100644 index 000000000000..55a1dcb12b89 --- /dev/null +++ b/csharp/ql/src/change-notes/released/1.10.0.md @@ -0,0 +1,10 @@ +## 1.10.0 + +### New Queries + +* Added a new query, `cs/linq/missed-firstordefault`, that detects `foreach` loops that can be expressed more clearly using LINQ's `FirstOrDefault` method. + +### Minor Analysis Improvements + +* The `cs/linq/missed-*` queries no longer suggest rewrites that would capture `in`, `out`, or `ref` parameters in a lambda, fixing false-positive results for transformations that would not compile. +* The `cs/web/missing-token-validation` query now recognizes an ASP.NET Core `AutoValidateAntiforgeryTokenAttribute` registered as a global MVC filter through `AddControllersWithViews` (and friends), avoiding false-positive results for covered actions. diff --git a/csharp/ql/src/codeql-pack.release.yml b/csharp/ql/src/codeql-pack.release.yml index 46a56c94195c..753e9ac28449 100644 --- a/csharp/ql/src/codeql-pack.release.yml +++ b/csharp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.9.3 +lastReleaseVersion: 1.10.0 diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml index c90064a3b913..c542cbc1d544 100644 --- a/csharp/ql/src/qlpack.yml +++ b/csharp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-queries -version: 1.9.4-dev +version: 1.10.0 groups: - csharp - queries diff --git a/go/ql/consistency-queries/CHANGELOG.md b/go/ql/consistency-queries/CHANGELOG.md index 3a71bc3b5561..aa7f66a0913d 100644 --- a/go/ql/consistency-queries/CHANGELOG.md +++ b/go/ql/consistency-queries/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.58 + +No user-facing changes. + ## 1.0.57 No user-facing changes. diff --git a/go/ql/consistency-queries/change-notes/released/1.0.58.md b/go/ql/consistency-queries/change-notes/released/1.0.58.md new file mode 100644 index 000000000000..f43459b898c0 --- /dev/null +++ b/go/ql/consistency-queries/change-notes/released/1.0.58.md @@ -0,0 +1,3 @@ +## 1.0.58 + +No user-facing changes. diff --git a/go/ql/consistency-queries/codeql-pack.release.yml b/go/ql/consistency-queries/codeql-pack.release.yml index 08ea3909354f..9312be8dfabd 100644 --- a/go/ql/consistency-queries/codeql-pack.release.yml +++ b/go/ql/consistency-queries/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.57 +lastReleaseVersion: 1.0.58 diff --git a/go/ql/consistency-queries/qlpack.yml b/go/ql/consistency-queries/qlpack.yml index c9c318de2fa2..3b17a07bcdb1 100644 --- a/go/ql/consistency-queries/qlpack.yml +++ b/go/ql/consistency-queries/qlpack.yml @@ -1,5 +1,5 @@ name: codeql-go-consistency-queries -version: 1.0.58-dev +version: 1.0.58 groups: - go - queries diff --git a/go/ql/lib/CHANGELOG.md b/go/ql/lib/CHANGELOG.md index 0c60f6aed295..d08d522d309c 100644 --- a/go/ql/lib/CHANGELOG.md +++ b/go/ql/lib/CHANGELOG.md @@ -1,3 +1,12 @@ +## 7.3.2 + +### Minor Analysis Improvements + +* Added or improved data flow models for the following Go standard-library APIs introduced or updated in Go 1.27: + * `bytes.CutLast`, `database/sql.ConvertAssign`, `database/sql/driver.RowsColumnScanner.ScanColumn`, `net/url.URL.Clone`, `net/url.Values.Clone` and `strings.CutLast`. + * The new `encoding/json/jsontext` package. +* Added more data flow models for the `strings` package: `strings.Clone`, `Cut`, `CutPrefix`, `CutSuffix`, `Fields`, `FieldsFunc`, and `Join`; `strings.Builder.String`, `Builder.WriteByte`, and `Builder.WriteRune`; `strings.Reader.ReadByte` and `Reader.ReadRune`; and `strings.Replacer.Replace` and `Replacer.WriteString`. + ## 7.3.1 No user-facing changes. diff --git a/go/ql/lib/change-notes/2026-09-09-go-1.27-models.md b/go/ql/lib/change-notes/released/7.3.2.md similarity index 93% rename from go/ql/lib/change-notes/2026-09-09-go-1.27-models.md rename to go/ql/lib/change-notes/released/7.3.2.md index 94c1b4469b73..988651b7ec2c 100644 --- a/go/ql/lib/change-notes/2026-09-09-go-1.27-models.md +++ b/go/ql/lib/change-notes/released/7.3.2.md @@ -1,6 +1,7 @@ ---- -category: minorAnalysis ---- +## 7.3.2 + +### Minor Analysis Improvements + * Added or improved data flow models for the following Go standard-library APIs introduced or updated in Go 1.27: * `bytes.CutLast`, `database/sql.ConvertAssign`, `database/sql/driver.RowsColumnScanner.ScanColumn`, `net/url.URL.Clone`, `net/url.Values.Clone` and `strings.CutLast`. * The new `encoding/json/jsontext` package. diff --git a/go/ql/lib/codeql-pack.release.yml b/go/ql/lib/codeql-pack.release.yml index 43cb026b1392..cf3deb9367da 100644 --- a/go/ql/lib/codeql-pack.release.yml +++ b/go/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 7.3.1 +lastReleaseVersion: 7.3.2 diff --git a/go/ql/lib/qlpack.yml b/go/ql/lib/qlpack.yml index 4dc828abeffe..8546b3b5fb30 100644 --- a/go/ql/lib/qlpack.yml +++ b/go/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-all -version: 7.3.2-dev +version: 7.3.2 groups: go dbscheme: go.dbscheme extractor: go diff --git a/go/ql/src/CHANGELOG.md b/go/ql/src/CHANGELOG.md index 96239d742d4a..32a07b1f615f 100644 --- a/go/ql/src/CHANGELOG.md +++ b/go/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.6.11 + +No user-facing changes. + ## 1.6.10 No user-facing changes. diff --git a/go/ql/src/change-notes/released/1.6.11.md b/go/ql/src/change-notes/released/1.6.11.md new file mode 100644 index 000000000000..cd335cb7d261 --- /dev/null +++ b/go/ql/src/change-notes/released/1.6.11.md @@ -0,0 +1,3 @@ +## 1.6.11 + +No user-facing changes. diff --git a/go/ql/src/codeql-pack.release.yml b/go/ql/src/codeql-pack.release.yml index 995e7a94a564..2d489ac8f04d 100644 --- a/go/ql/src/codeql-pack.release.yml +++ b/go/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.6.10 +lastReleaseVersion: 1.6.11 diff --git a/go/ql/src/qlpack.yml b/go/ql/src/qlpack.yml index fdfdd1f67432..7c3209e893ed 100644 --- a/go/ql/src/qlpack.yml +++ b/go/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-queries -version: 1.6.11-dev +version: 1.6.11 groups: - go - queries diff --git a/java/ql/lib/CHANGELOG.md b/java/ql/lib/CHANGELOG.md index 13a7b5b7961b..a0d89a570c41 100644 --- a/java/ql/lib/CHANGELOG.md +++ b/java/ql/lib/CHANGELOG.md @@ -1,3 +1,10 @@ +## 9.3.1 + +### Minor Analysis Improvements + +* Support for Kotlin 2.4.20 has been added. +* Fixed an issue where `Foo::class.java` arguments were dropped during extraction under the Kotlin K2 compiler, which could cause false positives in queries such as `java/android/implicit-pendingintents`. + ## 9.3.0 ### New Features diff --git a/java/ql/lib/change-notes/2026-08-21-kotlin-2.4.20.md b/java/ql/lib/change-notes/2026-08-21-kotlin-2.4.20.md deleted file mode 100644 index 22925adf104e..000000000000 --- a/java/ql/lib/change-notes/2026-08-21-kotlin-2.4.20.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Support for Kotlin 2.4.20 has been added. diff --git a/java/ql/lib/change-notes/2026-05-30-kclass-java-arg-k2-fix.md b/java/ql/lib/change-notes/released/9.3.1.md similarity index 70% rename from java/ql/lib/change-notes/2026-05-30-kclass-java-arg-k2-fix.md rename to java/ql/lib/change-notes/released/9.3.1.md index bad7f5c21b30..322934436309 100644 --- a/java/ql/lib/change-notes/2026-05-30-kclass-java-arg-k2-fix.md +++ b/java/ql/lib/change-notes/released/9.3.1.md @@ -1,4 +1,6 @@ ---- -category: minorAnalysis ---- +## 9.3.1 + +### Minor Analysis Improvements + +* Support for Kotlin 2.4.20 has been added. * Fixed an issue where `Foo::class.java` arguments were dropped during extraction under the Kotlin K2 compiler, which could cause false positives in queries such as `java/android/implicit-pendingintents`. diff --git a/java/ql/lib/codeql-pack.release.yml b/java/ql/lib/codeql-pack.release.yml index a806354ee450..72bff5e791d4 100644 --- a/java/ql/lib/codeql-pack.release.yml +++ b/java/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 9.3.0 +lastReleaseVersion: 9.3.1 diff --git a/java/ql/lib/qlpack.yml b/java/ql/lib/qlpack.yml index d6aefad45233..97b7c12a129a 100644 --- a/java/ql/lib/qlpack.yml +++ b/java/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-all -version: 9.3.1-dev +version: 9.3.1 groups: java dbscheme: config/semmlecode.dbscheme extractor: java diff --git a/java/ql/src/CHANGELOG.md b/java/ql/src/CHANGELOG.md index 0bb36a39ed24..837b5733249b 100644 --- a/java/ql/src/CHANGELOG.md +++ b/java/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.11.11 + +No user-facing changes. + ## 1.11.10 No user-facing changes. diff --git a/java/ql/src/change-notes/released/1.11.11.md b/java/ql/src/change-notes/released/1.11.11.md new file mode 100644 index 000000000000..e7597eb25e2c --- /dev/null +++ b/java/ql/src/change-notes/released/1.11.11.md @@ -0,0 +1,3 @@ +## 1.11.11 + +No user-facing changes. diff --git a/java/ql/src/codeql-pack.release.yml b/java/ql/src/codeql-pack.release.yml index ae9cd379d8c8..c3dd71a1e0f1 100644 --- a/java/ql/src/codeql-pack.release.yml +++ b/java/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.11.10 +lastReleaseVersion: 1.11.11 diff --git a/java/ql/src/qlpack.yml b/java/ql/src/qlpack.yml index 1bb0cdc16c09..7c539eff1073 100644 --- a/java/ql/src/qlpack.yml +++ b/java/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-queries -version: 1.11.11-dev +version: 1.11.11 groups: - java - queries diff --git a/javascript/ql/lib/CHANGELOG.md b/javascript/ql/lib/CHANGELOG.md index c4910f0c369c..6ed24f4a3232 100644 --- a/javascript/ql/lib/CHANGELOG.md +++ b/javascript/ql/lib/CHANGELOG.md @@ -1,3 +1,9 @@ +## 2.10.2 + +### Minor Analysis Improvements + +* Fastify servers reached through a chainable configuration method, such as `fastify().withTypeProvider()` or `fastify().setValidatorCompiler(...)`, are now recognized as the same server instance. Routes registered on such an instance are now attributed to their server, which may add results for queries such as `js/missing-rate-limiting` where routes were previously not recognized at all, and remove false positives where a globally registered plugin guards them. + ## 2.10.1 No user-facing changes. diff --git a/javascript/ql/lib/change-notes/2026-09-10-fastify-chainable-config-methods.md b/javascript/ql/lib/change-notes/released/2.10.2.md similarity index 91% rename from javascript/ql/lib/change-notes/2026-09-10-fastify-chainable-config-methods.md rename to javascript/ql/lib/change-notes/released/2.10.2.md index 986788d62111..94c749202ceb 100644 --- a/javascript/ql/lib/change-notes/2026-09-10-fastify-chainable-config-methods.md +++ b/javascript/ql/lib/change-notes/released/2.10.2.md @@ -1,4 +1,5 @@ ---- -category: minorAnalysis ---- +## 2.10.2 + +### Minor Analysis Improvements + * Fastify servers reached through a chainable configuration method, such as `fastify().withTypeProvider()` or `fastify().setValidatorCompiler(...)`, are now recognized as the same server instance. Routes registered on such an instance are now attributed to their server, which may add results for queries such as `js/missing-rate-limiting` where routes were previously not recognized at all, and remove false positives where a globally registered plugin guards them. diff --git a/javascript/ql/lib/codeql-pack.release.yml b/javascript/ql/lib/codeql-pack.release.yml index 1366256715eb..08421f663576 100644 --- a/javascript/ql/lib/codeql-pack.release.yml +++ b/javascript/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.10.1 +lastReleaseVersion: 2.10.2 diff --git a/javascript/ql/lib/qlpack.yml b/javascript/ql/lib/qlpack.yml index 93c4370aab6d..4225a0507163 100644 --- a/javascript/ql/lib/qlpack.yml +++ b/javascript/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-all -version: 2.10.2-dev +version: 2.10.2 groups: javascript dbscheme: semmlecode.javascript.dbscheme extractor: javascript diff --git a/javascript/ql/src/CHANGELOG.md b/javascript/ql/src/CHANGELOG.md index 541393cea333..f485ca682b6c 100644 --- a/javascript/ql/src/CHANGELOG.md +++ b/javascript/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.4.6 + +No user-facing changes. + ## 2.4.5 ### Minor Analysis Improvements diff --git a/javascript/ql/src/change-notes/released/2.4.6.md b/javascript/ql/src/change-notes/released/2.4.6.md new file mode 100644 index 000000000000..9c588051a43a --- /dev/null +++ b/javascript/ql/src/change-notes/released/2.4.6.md @@ -0,0 +1,3 @@ +## 2.4.6 + +No user-facing changes. diff --git a/javascript/ql/src/codeql-pack.release.yml b/javascript/ql/src/codeql-pack.release.yml index 4d5f66ce2c87..0715ac90fc8d 100644 --- a/javascript/ql/src/codeql-pack.release.yml +++ b/javascript/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.4.5 +lastReleaseVersion: 2.4.6 diff --git a/javascript/ql/src/qlpack.yml b/javascript/ql/src/qlpack.yml index 456c7f4ca7b5..ea85a76b6555 100644 --- a/javascript/ql/src/qlpack.yml +++ b/javascript/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-queries -version: 2.4.6-dev +version: 2.4.6 groups: - javascript - queries diff --git a/misc/suite-helpers/CHANGELOG.md b/misc/suite-helpers/CHANGELOG.md index 4289e0e8c4f7..e33fe55d6b07 100644 --- a/misc/suite-helpers/CHANGELOG.md +++ b/misc/suite-helpers/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.58 + +No user-facing changes. + ## 1.0.57 No user-facing changes. diff --git a/misc/suite-helpers/change-notes/released/1.0.58.md b/misc/suite-helpers/change-notes/released/1.0.58.md new file mode 100644 index 000000000000..f43459b898c0 --- /dev/null +++ b/misc/suite-helpers/change-notes/released/1.0.58.md @@ -0,0 +1,3 @@ +## 1.0.58 + +No user-facing changes. diff --git a/misc/suite-helpers/codeql-pack.release.yml b/misc/suite-helpers/codeql-pack.release.yml index 08ea3909354f..9312be8dfabd 100644 --- a/misc/suite-helpers/codeql-pack.release.yml +++ b/misc/suite-helpers/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.57 +lastReleaseVersion: 1.0.58 diff --git a/misc/suite-helpers/qlpack.yml b/misc/suite-helpers/qlpack.yml index 1c27d6177555..7fea6fd1b738 100644 --- a/misc/suite-helpers/qlpack.yml +++ b/misc/suite-helpers/qlpack.yml @@ -1,4 +1,4 @@ name: codeql/suite-helpers -version: 1.0.58-dev +version: 1.0.58 groups: shared warnOnImplicitThis: true diff --git a/python/ql/lib/CHANGELOG.md b/python/ql/lib/CHANGELOG.md index ec64251b69d5..8c4547b8267f 100644 --- a/python/ql/lib/CHANGELOG.md +++ b/python/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 7.2.6 + +No user-facing changes. + ## 7.2.5 ### Bug Fixes diff --git a/python/ql/lib/change-notes/released/7.2.6.md b/python/ql/lib/change-notes/released/7.2.6.md new file mode 100644 index 000000000000..7cce6b846fb5 --- /dev/null +++ b/python/ql/lib/change-notes/released/7.2.6.md @@ -0,0 +1,3 @@ +## 7.2.6 + +No user-facing changes. diff --git a/python/ql/lib/codeql-pack.release.yml b/python/ql/lib/codeql-pack.release.yml index c6aa7ff5b753..9b4eb72728fa 100644 --- a/python/ql/lib/codeql-pack.release.yml +++ b/python/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 7.2.5 +lastReleaseVersion: 7.2.6 diff --git a/python/ql/lib/qlpack.yml b/python/ql/lib/qlpack.yml index ad9d7605202a..5886bee214c5 100644 --- a/python/ql/lib/qlpack.yml +++ b/python/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-all -version: 7.2.6-dev +version: 7.2.6 groups: python dbscheme: semmlecode.python.dbscheme extractor: python diff --git a/python/ql/src/CHANGELOG.md b/python/ql/src/CHANGELOG.md index 874d180f72cc..96506804eaa4 100644 --- a/python/ql/src/CHANGELOG.md +++ b/python/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.8.11 + +No user-facing changes. + ## 1.8.10 No user-facing changes. diff --git a/python/ql/src/change-notes/released/1.8.11.md b/python/ql/src/change-notes/released/1.8.11.md new file mode 100644 index 000000000000..cbd98fc1758f --- /dev/null +++ b/python/ql/src/change-notes/released/1.8.11.md @@ -0,0 +1,3 @@ +## 1.8.11 + +No user-facing changes. diff --git a/python/ql/src/codeql-pack.release.yml b/python/ql/src/codeql-pack.release.yml index b615673a3ce0..2b07ce04a48a 100644 --- a/python/ql/src/codeql-pack.release.yml +++ b/python/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.8.10 +lastReleaseVersion: 1.8.11 diff --git a/python/ql/src/qlpack.yml b/python/ql/src/qlpack.yml index 70ce9eeef942..e275f6d43a3b 100644 --- a/python/ql/src/qlpack.yml +++ b/python/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-queries -version: 1.8.11-dev +version: 1.8.11 groups: - python - queries diff --git a/ruby/ql/lib/CHANGELOG.md b/ruby/ql/lib/CHANGELOG.md index 056f71cef95e..f42242ece8cc 100644 --- a/ruby/ql/lib/CHANGELOG.md +++ b/ruby/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 7.0.1 + +No user-facing changes. + ## 7.0.0 ### Breaking Changes diff --git a/ruby/ql/lib/change-notes/released/7.0.1.md b/ruby/ql/lib/change-notes/released/7.0.1.md new file mode 100644 index 000000000000..b5ef70820b26 --- /dev/null +++ b/ruby/ql/lib/change-notes/released/7.0.1.md @@ -0,0 +1,3 @@ +## 7.0.1 + +No user-facing changes. diff --git a/ruby/ql/lib/codeql-pack.release.yml b/ruby/ql/lib/codeql-pack.release.yml index e0db21c78694..a18747dd3a7a 100644 --- a/ruby/ql/lib/codeql-pack.release.yml +++ b/ruby/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 7.0.0 +lastReleaseVersion: 7.0.1 diff --git a/ruby/ql/lib/qlpack.yml b/ruby/ql/lib/qlpack.yml index f38a7120a31f..d13d4ad9bdc1 100644 --- a/ruby/ql/lib/qlpack.yml +++ b/ruby/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-all -version: 7.0.1-dev +version: 7.0.1 groups: ruby extractor: ruby dbscheme: ruby.dbscheme diff --git a/ruby/ql/src/CHANGELOG.md b/ruby/ql/src/CHANGELOG.md index c8a0fd7cbbc3..a82301c24f72 100644 --- a/ruby/ql/src/CHANGELOG.md +++ b/ruby/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.6.11 + +No user-facing changes. + ## 1.6.10 No user-facing changes. diff --git a/ruby/ql/src/change-notes/released/1.6.11.md b/ruby/ql/src/change-notes/released/1.6.11.md new file mode 100644 index 000000000000..cd335cb7d261 --- /dev/null +++ b/ruby/ql/src/change-notes/released/1.6.11.md @@ -0,0 +1,3 @@ +## 1.6.11 + +No user-facing changes. diff --git a/ruby/ql/src/codeql-pack.release.yml b/ruby/ql/src/codeql-pack.release.yml index 995e7a94a564..2d489ac8f04d 100644 --- a/ruby/ql/src/codeql-pack.release.yml +++ b/ruby/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.6.10 +lastReleaseVersion: 1.6.11 diff --git a/ruby/ql/src/qlpack.yml b/ruby/ql/src/qlpack.yml index d532c03248a0..991d8407aaed 100644 --- a/ruby/ql/src/qlpack.yml +++ b/ruby/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-queries -version: 1.6.11-dev +version: 1.6.11 groups: - ruby - queries diff --git a/rust/ql/lib/CHANGELOG.md b/rust/ql/lib/CHANGELOG.md index 26e0631f2ced..a2997b5f6322 100644 --- a/rust/ql/lib/CHANGELOG.md +++ b/rust/ql/lib/CHANGELOG.md @@ -1,3 +1,11 @@ +## 0.2.22 + +### Minor Analysis Improvements + +* Fix path resolution for `m::{self}` paths where `m` is a trait. +* Added data-flow models for `core::fmt::Write`. This may improve detection of vulnerabilities where tainted data is written to a formatted output buffer. +* The Rust extractor has been upgraded to use `rust-analyzer` version 0.0.347. As a result, the AST exposed by the Rust libraries has changed: new `DerefPat`, `ImplRestriction`, `IncludeBytesExpr`, `MutRestriction`, `NotNull`, `PatternTypeRepr`, and `VisibilityInner` classes have been added; the `FormatArgsArgName` class has been removed in favour of `FormatArgsArg.getName()`, which now returns a `Name`; `Visibility.getPath()` has been moved onto the new `VisibilityInner` class, reachable via `Visibility.getVisibilityInner()`; and `attrs` have been added to the inline assembly nodes, `getMutRestriction()` to `StructField` and `TupleField`, and `getImplRestriction()` to `Trait`. + ## 0.2.21 ### Minor Analysis Improvements diff --git a/rust/ql/lib/change-notes/2026-08-19-rust-core-fmt-flow-models.md b/rust/ql/lib/change-notes/2026-08-19-rust-core-fmt-flow-models.md deleted file mode 100644 index 87b8b08ed067..000000000000 --- a/rust/ql/lib/change-notes/2026-08-19-rust-core-fmt-flow-models.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added data-flow models for `core::fmt::Write`. This may improve detection of vulnerabilities where tainted data is written to a formatted output buffer. diff --git a/rust/ql/lib/change-notes/2026-09-07-self-path-trait.md b/rust/ql/lib/change-notes/2026-09-07-self-path-trait.md deleted file mode 100644 index ff7b0f2d350d..000000000000 --- a/rust/ql/lib/change-notes/2026-09-07-self-path-trait.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Fix path resolution for `m::{self}` paths where `m` is a trait. \ No newline at end of file diff --git a/rust/ql/lib/change-notes/2026-08-14-rust-analyzer-0.0.347.md b/rust/ql/lib/change-notes/released/0.2.22.md similarity index 72% rename from rust/ql/lib/change-notes/2026-08-14-rust-analyzer-0.0.347.md rename to rust/ql/lib/change-notes/released/0.2.22.md index 9e03da0fa39c..e23bf68bd293 100644 --- a/rust/ql/lib/change-notes/2026-08-14-rust-analyzer-0.0.347.md +++ b/rust/ql/lib/change-notes/released/0.2.22.md @@ -1,4 +1,7 @@ ---- -category: minorAnalysis ---- +## 0.2.22 + +### Minor Analysis Improvements + +* Fix path resolution for `m::{self}` paths where `m` is a trait. +* Added data-flow models for `core::fmt::Write`. This may improve detection of vulnerabilities where tainted data is written to a formatted output buffer. * The Rust extractor has been upgraded to use `rust-analyzer` version 0.0.347. As a result, the AST exposed by the Rust libraries has changed: new `DerefPat`, `ImplRestriction`, `IncludeBytesExpr`, `MutRestriction`, `NotNull`, `PatternTypeRepr`, and `VisibilityInner` classes have been added; the `FormatArgsArgName` class has been removed in favour of `FormatArgsArg.getName()`, which now returns a `Name`; `Visibility.getPath()` has been moved onto the new `VisibilityInner` class, reachable via `Visibility.getVisibilityInner()`; and `attrs` have been added to the inline assembly nodes, `getMutRestriction()` to `StructField` and `TupleField`, and `getImplRestriction()` to `Trait`. diff --git a/rust/ql/lib/codeql-pack.release.yml b/rust/ql/lib/codeql-pack.release.yml index 8d4f094a4664..434da62922ef 100644 --- a/rust/ql/lib/codeql-pack.release.yml +++ b/rust/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.2.21 +lastReleaseVersion: 0.2.22 diff --git a/rust/ql/lib/qlpack.yml b/rust/ql/lib/qlpack.yml index bb31a181ec16..f86cc9282a17 100644 --- a/rust/ql/lib/qlpack.yml +++ b/rust/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rust-all -version: 0.2.22-dev +version: 0.2.22 groups: rust extractor: rust dbscheme: rust.dbscheme diff --git a/rust/ql/src/CHANGELOG.md b/rust/ql/src/CHANGELOG.md index 91b75ac72346..186f88d010b4 100644 --- a/rust/ql/src/CHANGELOG.md +++ b/rust/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.43 + +No user-facing changes. + ## 0.1.42 ### New Queries diff --git a/rust/ql/src/change-notes/released/0.1.43.md b/rust/ql/src/change-notes/released/0.1.43.md new file mode 100644 index 000000000000..d398bbdfcd6c --- /dev/null +++ b/rust/ql/src/change-notes/released/0.1.43.md @@ -0,0 +1,3 @@ +## 0.1.43 + +No user-facing changes. diff --git a/rust/ql/src/codeql-pack.release.yml b/rust/ql/src/codeql-pack.release.yml index 55593f737cc9..5498c13491a4 100644 --- a/rust/ql/src/codeql-pack.release.yml +++ b/rust/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.1.42 +lastReleaseVersion: 0.1.43 diff --git a/rust/ql/src/qlpack.yml b/rust/ql/src/qlpack.yml index dc4e53aeaf81..8b2b8f64ddfc 100644 --- a/rust/ql/src/qlpack.yml +++ b/rust/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rust-queries -version: 0.1.43-dev +version: 0.1.43 groups: - rust - queries diff --git a/shared/concepts/CHANGELOG.md b/shared/concepts/CHANGELOG.md index e399ac467e78..39d49c46b762 100644 --- a/shared/concepts/CHANGELOG.md +++ b/shared/concepts/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.32 + +No user-facing changes. + ## 0.0.31 No user-facing changes. diff --git a/shared/concepts/change-notes/released/0.0.32.md b/shared/concepts/change-notes/released/0.0.32.md new file mode 100644 index 000000000000..c390443f09a3 --- /dev/null +++ b/shared/concepts/change-notes/released/0.0.32.md @@ -0,0 +1,3 @@ +## 0.0.32 + +No user-facing changes. diff --git a/shared/concepts/codeql-pack.release.yml b/shared/concepts/codeql-pack.release.yml index 54b504d06ecb..714fcfc18281 100644 --- a/shared/concepts/codeql-pack.release.yml +++ b/shared/concepts/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.31 +lastReleaseVersion: 0.0.32 diff --git a/shared/concepts/qlpack.yml b/shared/concepts/qlpack.yml index 677235474b91..a6b0b37a2570 100644 --- a/shared/concepts/qlpack.yml +++ b/shared/concepts/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/concepts -version: 0.0.32-dev +version: 0.0.32 groups: shared library: true dependencies: diff --git a/shared/controlflow/CHANGELOG.md b/shared/controlflow/CHANGELOG.md index 5edd14954f3e..fedbc6ec11ea 100644 --- a/shared/controlflow/CHANGELOG.md +++ b/shared/controlflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.42 + +No user-facing changes. + ## 2.0.41 No user-facing changes. diff --git a/shared/controlflow/change-notes/released/2.0.42.md b/shared/controlflow/change-notes/released/2.0.42.md new file mode 100644 index 000000000000..85ba02702b9f --- /dev/null +++ b/shared/controlflow/change-notes/released/2.0.42.md @@ -0,0 +1,3 @@ +## 2.0.42 + +No user-facing changes. diff --git a/shared/controlflow/codeql-pack.release.yml b/shared/controlflow/codeql-pack.release.yml index dcd61b02de59..000a2d0de2d1 100644 --- a/shared/controlflow/codeql-pack.release.yml +++ b/shared/controlflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.41 +lastReleaseVersion: 2.0.42 diff --git a/shared/controlflow/qlpack.yml b/shared/controlflow/qlpack.yml index 66ae31f61364..65726e011a97 100644 --- a/shared/controlflow/qlpack.yml +++ b/shared/controlflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/controlflow -version: 2.0.42-dev +version: 2.0.42 groups: shared library: true dependencies: diff --git a/shared/dataflow/CHANGELOG.md b/shared/dataflow/CHANGELOG.md index f42b3d852dc7..4609711e174a 100644 --- a/shared/dataflow/CHANGELOG.md +++ b/shared/dataflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.1.14 + +No user-facing changes. + ## 2.1.13 No user-facing changes. diff --git a/shared/dataflow/change-notes/released/2.1.14.md b/shared/dataflow/change-notes/released/2.1.14.md new file mode 100644 index 000000000000..279c7d5ae20c --- /dev/null +++ b/shared/dataflow/change-notes/released/2.1.14.md @@ -0,0 +1,3 @@ +## 2.1.14 + +No user-facing changes. diff --git a/shared/dataflow/codeql-pack.release.yml b/shared/dataflow/codeql-pack.release.yml index 77d1ddbc8f91..1819769770d3 100644 --- a/shared/dataflow/codeql-pack.release.yml +++ b/shared/dataflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.1.13 +lastReleaseVersion: 2.1.14 diff --git a/shared/dataflow/qlpack.yml b/shared/dataflow/qlpack.yml index 134205735fe7..4a2dc511d856 100644 --- a/shared/dataflow/qlpack.yml +++ b/shared/dataflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/dataflow -version: 2.1.14-dev +version: 2.1.14 groups: shared library: true dependencies: diff --git a/shared/mad/CHANGELOG.md b/shared/mad/CHANGELOG.md index 0aa8d83bb6fa..e719070a015b 100644 --- a/shared/mad/CHANGELOG.md +++ b/shared/mad/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.58 + +No user-facing changes. + ## 1.0.57 No user-facing changes. diff --git a/shared/mad/change-notes/released/1.0.58.md b/shared/mad/change-notes/released/1.0.58.md new file mode 100644 index 000000000000..f43459b898c0 --- /dev/null +++ b/shared/mad/change-notes/released/1.0.58.md @@ -0,0 +1,3 @@ +## 1.0.58 + +No user-facing changes. diff --git a/shared/mad/codeql-pack.release.yml b/shared/mad/codeql-pack.release.yml index 08ea3909354f..9312be8dfabd 100644 --- a/shared/mad/codeql-pack.release.yml +++ b/shared/mad/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.57 +lastReleaseVersion: 1.0.58 diff --git a/shared/mad/qlpack.yml b/shared/mad/qlpack.yml index 783f372bc478..7bd39099c50a 100644 --- a/shared/mad/qlpack.yml +++ b/shared/mad/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/mad -version: 1.0.58-dev +version: 1.0.58 groups: shared library: true dependencies: diff --git a/shared/namebinding/CHANGELOG.md b/shared/namebinding/CHANGELOG.md index ad2e63eb4709..8f58f5145db5 100644 --- a/shared/namebinding/CHANGELOG.md +++ b/shared/namebinding/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.7 + +No user-facing changes. + ## 0.0.6 No user-facing changes. diff --git a/shared/namebinding/change-notes/released/0.0.7.md b/shared/namebinding/change-notes/released/0.0.7.md new file mode 100644 index 000000000000..84da6f18c42e --- /dev/null +++ b/shared/namebinding/change-notes/released/0.0.7.md @@ -0,0 +1,3 @@ +## 0.0.7 + +No user-facing changes. diff --git a/shared/namebinding/codeql-pack.release.yml b/shared/namebinding/codeql-pack.release.yml index cf398ce02aa4..a2a5484910bc 100644 --- a/shared/namebinding/codeql-pack.release.yml +++ b/shared/namebinding/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.6 +lastReleaseVersion: 0.0.7 diff --git a/shared/namebinding/qlpack.yml b/shared/namebinding/qlpack.yml index af4358254944..fc302f24e0af 100644 --- a/shared/namebinding/qlpack.yml +++ b/shared/namebinding/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/namebinding -version: 0.0.7-dev +version: 0.0.7 groups: shared library: true dependencies: diff --git a/shared/quantum/CHANGELOG.md b/shared/quantum/CHANGELOG.md index 4916c26d385a..cd72576290a7 100644 --- a/shared/quantum/CHANGELOG.md +++ b/shared/quantum/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.36 + +No user-facing changes. + ## 0.0.35 No user-facing changes. diff --git a/shared/quantum/change-notes/released/0.0.36.md b/shared/quantum/change-notes/released/0.0.36.md new file mode 100644 index 000000000000..14c56d238da9 --- /dev/null +++ b/shared/quantum/change-notes/released/0.0.36.md @@ -0,0 +1,3 @@ +## 0.0.36 + +No user-facing changes. diff --git a/shared/quantum/codeql-pack.release.yml b/shared/quantum/codeql-pack.release.yml index 143c97892032..b6df3a024ee6 100644 --- a/shared/quantum/codeql-pack.release.yml +++ b/shared/quantum/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.35 +lastReleaseVersion: 0.0.36 diff --git a/shared/quantum/qlpack.yml b/shared/quantum/qlpack.yml index 044e243531fd..501fb636d2f2 100644 --- a/shared/quantum/qlpack.yml +++ b/shared/quantum/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/quantum -version: 0.0.36-dev +version: 0.0.36 groups: shared library: true dependencies: diff --git a/shared/rangeanalysis/CHANGELOG.md b/shared/rangeanalysis/CHANGELOG.md index 965a43bc55b1..9594a1763f95 100644 --- a/shared/rangeanalysis/CHANGELOG.md +++ b/shared/rangeanalysis/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.58 + +No user-facing changes. + ## 1.0.57 No user-facing changes. diff --git a/shared/rangeanalysis/change-notes/released/1.0.58.md b/shared/rangeanalysis/change-notes/released/1.0.58.md new file mode 100644 index 000000000000..f43459b898c0 --- /dev/null +++ b/shared/rangeanalysis/change-notes/released/1.0.58.md @@ -0,0 +1,3 @@ +## 1.0.58 + +No user-facing changes. diff --git a/shared/rangeanalysis/codeql-pack.release.yml b/shared/rangeanalysis/codeql-pack.release.yml index 08ea3909354f..9312be8dfabd 100644 --- a/shared/rangeanalysis/codeql-pack.release.yml +++ b/shared/rangeanalysis/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.57 +lastReleaseVersion: 1.0.58 diff --git a/shared/rangeanalysis/qlpack.yml b/shared/rangeanalysis/qlpack.yml index 6b4e8a5adede..0d8901c3913e 100644 --- a/shared/rangeanalysis/qlpack.yml +++ b/shared/rangeanalysis/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rangeanalysis -version: 1.0.58-dev +version: 1.0.58 groups: shared library: true dependencies: diff --git a/shared/regex/CHANGELOG.md b/shared/regex/CHANGELOG.md index 20e772df81ad..79a7955c4683 100644 --- a/shared/regex/CHANGELOG.md +++ b/shared/regex/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.58 + +No user-facing changes. + ## 1.0.57 No user-facing changes. diff --git a/shared/regex/change-notes/released/1.0.58.md b/shared/regex/change-notes/released/1.0.58.md new file mode 100644 index 000000000000..f43459b898c0 --- /dev/null +++ b/shared/regex/change-notes/released/1.0.58.md @@ -0,0 +1,3 @@ +## 1.0.58 + +No user-facing changes. diff --git a/shared/regex/codeql-pack.release.yml b/shared/regex/codeql-pack.release.yml index 08ea3909354f..9312be8dfabd 100644 --- a/shared/regex/codeql-pack.release.yml +++ b/shared/regex/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.57 +lastReleaseVersion: 1.0.58 diff --git a/shared/regex/qlpack.yml b/shared/regex/qlpack.yml index ad414ca86d3d..812351e84752 100644 --- a/shared/regex/qlpack.yml +++ b/shared/regex/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/regex -version: 1.0.58-dev +version: 1.0.58 groups: shared library: true dependencies: diff --git a/shared/ssa/CHANGELOG.md b/shared/ssa/CHANGELOG.md index 1ed23b3a72b6..0a250ccea650 100644 --- a/shared/ssa/CHANGELOG.md +++ b/shared/ssa/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.34 + +No user-facing changes. + ## 2.0.33 No user-facing changes. diff --git a/shared/ssa/change-notes/released/2.0.34.md b/shared/ssa/change-notes/released/2.0.34.md new file mode 100644 index 000000000000..fd170d38ce6d --- /dev/null +++ b/shared/ssa/change-notes/released/2.0.34.md @@ -0,0 +1,3 @@ +## 2.0.34 + +No user-facing changes. diff --git a/shared/ssa/codeql-pack.release.yml b/shared/ssa/codeql-pack.release.yml index 92e23200b4d6..339a3ce7c57a 100644 --- a/shared/ssa/codeql-pack.release.yml +++ b/shared/ssa/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.33 +lastReleaseVersion: 2.0.34 diff --git a/shared/ssa/qlpack.yml b/shared/ssa/qlpack.yml index 07e6041a5142..997dbcb032da 100644 --- a/shared/ssa/qlpack.yml +++ b/shared/ssa/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ssa -version: 2.0.34-dev +version: 2.0.34 groups: shared library: true dependencies: diff --git a/shared/threat-models/CHANGELOG.md b/shared/threat-models/CHANGELOG.md index 3a71bc3b5561..aa7f66a0913d 100644 --- a/shared/threat-models/CHANGELOG.md +++ b/shared/threat-models/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.58 + +No user-facing changes. + ## 1.0.57 No user-facing changes. diff --git a/shared/threat-models/change-notes/released/1.0.58.md b/shared/threat-models/change-notes/released/1.0.58.md new file mode 100644 index 000000000000..f43459b898c0 --- /dev/null +++ b/shared/threat-models/change-notes/released/1.0.58.md @@ -0,0 +1,3 @@ +## 1.0.58 + +No user-facing changes. diff --git a/shared/threat-models/codeql-pack.release.yml b/shared/threat-models/codeql-pack.release.yml index 08ea3909354f..9312be8dfabd 100644 --- a/shared/threat-models/codeql-pack.release.yml +++ b/shared/threat-models/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.57 +lastReleaseVersion: 1.0.58 diff --git a/shared/threat-models/qlpack.yml b/shared/threat-models/qlpack.yml index 84c172ce3f25..dc276731544a 100644 --- a/shared/threat-models/qlpack.yml +++ b/shared/threat-models/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/threat-models -version: 1.0.58-dev +version: 1.0.58 library: true groups: shared dataExtensions: diff --git a/shared/tutorial/CHANGELOG.md b/shared/tutorial/CHANGELOG.md index b3541e1248f5..5144684733a0 100644 --- a/shared/tutorial/CHANGELOG.md +++ b/shared/tutorial/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.58 + +No user-facing changes. + ## 1.0.57 No user-facing changes. diff --git a/shared/tutorial/change-notes/released/1.0.58.md b/shared/tutorial/change-notes/released/1.0.58.md new file mode 100644 index 000000000000..f43459b898c0 --- /dev/null +++ b/shared/tutorial/change-notes/released/1.0.58.md @@ -0,0 +1,3 @@ +## 1.0.58 + +No user-facing changes. diff --git a/shared/tutorial/codeql-pack.release.yml b/shared/tutorial/codeql-pack.release.yml index 08ea3909354f..9312be8dfabd 100644 --- a/shared/tutorial/codeql-pack.release.yml +++ b/shared/tutorial/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.57 +lastReleaseVersion: 1.0.58 diff --git a/shared/tutorial/qlpack.yml b/shared/tutorial/qlpack.yml index fa374cda8f72..d775e2d54869 100644 --- a/shared/tutorial/qlpack.yml +++ b/shared/tutorial/qlpack.yml @@ -1,7 +1,7 @@ name: codeql/tutorial description: Library for the CodeQL detective tutorials, helping new users learn to write CodeQL queries. -version: 1.0.58-dev +version: 1.0.58 groups: shared library: true warnOnImplicitThis: true diff --git a/shared/typeflow/CHANGELOG.md b/shared/typeflow/CHANGELOG.md index ad7f55dd34bd..e799dfcd2685 100644 --- a/shared/typeflow/CHANGELOG.md +++ b/shared/typeflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.58 + +No user-facing changes. + ## 1.0.57 No user-facing changes. diff --git a/shared/typeflow/change-notes/released/1.0.58.md b/shared/typeflow/change-notes/released/1.0.58.md new file mode 100644 index 000000000000..f43459b898c0 --- /dev/null +++ b/shared/typeflow/change-notes/released/1.0.58.md @@ -0,0 +1,3 @@ +## 1.0.58 + +No user-facing changes. diff --git a/shared/typeflow/codeql-pack.release.yml b/shared/typeflow/codeql-pack.release.yml index 08ea3909354f..9312be8dfabd 100644 --- a/shared/typeflow/codeql-pack.release.yml +++ b/shared/typeflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.57 +lastReleaseVersion: 1.0.58 diff --git a/shared/typeflow/qlpack.yml b/shared/typeflow/qlpack.yml index 4dd13d3aad94..b3739dbc4509 100644 --- a/shared/typeflow/qlpack.yml +++ b/shared/typeflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeflow -version: 1.0.58-dev +version: 1.0.58 groups: shared library: true dependencies: diff --git a/shared/typeinference/CHANGELOG.md b/shared/typeinference/CHANGELOG.md index 6ab8c640bc68..5d7fb2536b42 100644 --- a/shared/typeinference/CHANGELOG.md +++ b/shared/typeinference/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.39 + +No user-facing changes. + ## 0.0.38 No user-facing changes. diff --git a/shared/typeinference/change-notes/released/0.0.39.md b/shared/typeinference/change-notes/released/0.0.39.md new file mode 100644 index 000000000000..b492d1378882 --- /dev/null +++ b/shared/typeinference/change-notes/released/0.0.39.md @@ -0,0 +1,3 @@ +## 0.0.39 + +No user-facing changes. diff --git a/shared/typeinference/codeql-pack.release.yml b/shared/typeinference/codeql-pack.release.yml index 078a0e3aff01..3e5b1e56a574 100644 --- a/shared/typeinference/codeql-pack.release.yml +++ b/shared/typeinference/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.38 +lastReleaseVersion: 0.0.39 diff --git a/shared/typeinference/qlpack.yml b/shared/typeinference/qlpack.yml index 68db81a4851b..68c5fd3592a9 100644 --- a/shared/typeinference/qlpack.yml +++ b/shared/typeinference/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeinference -version: 0.0.39-dev +version: 0.0.39 groups: shared library: true dependencies: diff --git a/shared/typetracking/CHANGELOG.md b/shared/typetracking/CHANGELOG.md index 2c6907a4eaae..2ce6e99219f4 100644 --- a/shared/typetracking/CHANGELOG.md +++ b/shared/typetracking/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.42 + +No user-facing changes. + ## 2.0.41 No user-facing changes. diff --git a/shared/typetracking/change-notes/released/2.0.42.md b/shared/typetracking/change-notes/released/2.0.42.md new file mode 100644 index 000000000000..85ba02702b9f --- /dev/null +++ b/shared/typetracking/change-notes/released/2.0.42.md @@ -0,0 +1,3 @@ +## 2.0.42 + +No user-facing changes. diff --git a/shared/typetracking/codeql-pack.release.yml b/shared/typetracking/codeql-pack.release.yml index dcd61b02de59..000a2d0de2d1 100644 --- a/shared/typetracking/codeql-pack.release.yml +++ b/shared/typetracking/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.41 +lastReleaseVersion: 2.0.42 diff --git a/shared/typetracking/qlpack.yml b/shared/typetracking/qlpack.yml index 9b52023e6343..5fea2bfe4cc4 100644 --- a/shared/typetracking/qlpack.yml +++ b/shared/typetracking/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typetracking -version: 2.0.42-dev +version: 2.0.42 groups: shared library: true dependencies: diff --git a/shared/typos/CHANGELOG.md b/shared/typos/CHANGELOG.md index 503f9fa3d4f0..20c327744792 100644 --- a/shared/typos/CHANGELOG.md +++ b/shared/typos/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.58 + +No user-facing changes. + ## 1.0.57 No user-facing changes. diff --git a/shared/typos/change-notes/released/1.0.58.md b/shared/typos/change-notes/released/1.0.58.md new file mode 100644 index 000000000000..f43459b898c0 --- /dev/null +++ b/shared/typos/change-notes/released/1.0.58.md @@ -0,0 +1,3 @@ +## 1.0.58 + +No user-facing changes. diff --git a/shared/typos/codeql-pack.release.yml b/shared/typos/codeql-pack.release.yml index 08ea3909354f..9312be8dfabd 100644 --- a/shared/typos/codeql-pack.release.yml +++ b/shared/typos/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.57 +lastReleaseVersion: 1.0.58 diff --git a/shared/typos/qlpack.yml b/shared/typos/qlpack.yml index ade80e7678f0..d1e99d6715ce 100644 --- a/shared/typos/qlpack.yml +++ b/shared/typos/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typos -version: 1.0.58-dev +version: 1.0.58 groups: shared library: true warnOnImplicitThis: true diff --git a/shared/util/CHANGELOG.md b/shared/util/CHANGELOG.md index 68a57b6e1bbc..dfa0d4b74964 100644 --- a/shared/util/CHANGELOG.md +++ b/shared/util/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.45 + +No user-facing changes. + ## 2.0.44 No user-facing changes. diff --git a/shared/util/change-notes/released/2.0.45.md b/shared/util/change-notes/released/2.0.45.md new file mode 100644 index 000000000000..ec5a10154c4d --- /dev/null +++ b/shared/util/change-notes/released/2.0.45.md @@ -0,0 +1,3 @@ +## 2.0.45 + +No user-facing changes. diff --git a/shared/util/codeql-pack.release.yml b/shared/util/codeql-pack.release.yml index 2032d0ef8b3f..c36828b9af04 100644 --- a/shared/util/codeql-pack.release.yml +++ b/shared/util/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.44 +lastReleaseVersion: 2.0.45 diff --git a/shared/util/qlpack.yml b/shared/util/qlpack.yml index 0a61f3903159..724d3be90cf8 100644 --- a/shared/util/qlpack.yml +++ b/shared/util/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/util -version: 2.0.45-dev +version: 2.0.45 groups: shared library: true dependencies: null diff --git a/shared/xml/CHANGELOG.md b/shared/xml/CHANGELOG.md index 19444d2622d1..95ee8a397bad 100644 --- a/shared/xml/CHANGELOG.md +++ b/shared/xml/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.58 + +No user-facing changes. + ## 1.0.57 No user-facing changes. diff --git a/shared/xml/change-notes/released/1.0.58.md b/shared/xml/change-notes/released/1.0.58.md new file mode 100644 index 000000000000..f43459b898c0 --- /dev/null +++ b/shared/xml/change-notes/released/1.0.58.md @@ -0,0 +1,3 @@ +## 1.0.58 + +No user-facing changes. diff --git a/shared/xml/codeql-pack.release.yml b/shared/xml/codeql-pack.release.yml index 08ea3909354f..9312be8dfabd 100644 --- a/shared/xml/codeql-pack.release.yml +++ b/shared/xml/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.57 +lastReleaseVersion: 1.0.58 diff --git a/shared/xml/qlpack.yml b/shared/xml/qlpack.yml index 133a3b9dac86..58071916af45 100644 --- a/shared/xml/qlpack.yml +++ b/shared/xml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/xml -version: 1.0.58-dev +version: 1.0.58 groups: shared library: true dependencies: diff --git a/shared/yaml/CHANGELOG.md b/shared/yaml/CHANGELOG.md index 8835951f9c51..cdb91acd9ae7 100644 --- a/shared/yaml/CHANGELOG.md +++ b/shared/yaml/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.58 + +No user-facing changes. + ## 1.0.57 No user-facing changes. diff --git a/shared/yaml/change-notes/released/1.0.58.md b/shared/yaml/change-notes/released/1.0.58.md new file mode 100644 index 000000000000..f43459b898c0 --- /dev/null +++ b/shared/yaml/change-notes/released/1.0.58.md @@ -0,0 +1,3 @@ +## 1.0.58 + +No user-facing changes. diff --git a/shared/yaml/codeql-pack.release.yml b/shared/yaml/codeql-pack.release.yml index 08ea3909354f..9312be8dfabd 100644 --- a/shared/yaml/codeql-pack.release.yml +++ b/shared/yaml/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.57 +lastReleaseVersion: 1.0.58 diff --git a/shared/yaml/qlpack.yml b/shared/yaml/qlpack.yml index 14b67df2f8d1..175e338e8466 100644 --- a/shared/yaml/qlpack.yml +++ b/shared/yaml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/yaml -version: 1.0.58-dev +version: 1.0.58 groups: shared library: true warnOnImplicitThis: true diff --git a/swift/ql/lib/CHANGELOG.md b/swift/ql/lib/CHANGELOG.md index b907f330f976..9abd5027897f 100644 --- a/swift/ql/lib/CHANGELOG.md +++ b/swift/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 6.8.4 + +No user-facing changes. + ## 6.8.3 No user-facing changes. diff --git a/swift/ql/lib/change-notes/released/6.8.4.md b/swift/ql/lib/change-notes/released/6.8.4.md new file mode 100644 index 000000000000..be181c65d52d --- /dev/null +++ b/swift/ql/lib/change-notes/released/6.8.4.md @@ -0,0 +1,3 @@ +## 6.8.4 + +No user-facing changes. diff --git a/swift/ql/lib/codeql-pack.release.yml b/swift/ql/lib/codeql-pack.release.yml index de8d19f816cf..8194611a7dda 100644 --- a/swift/ql/lib/codeql-pack.release.yml +++ b/swift/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 6.8.3 +lastReleaseVersion: 6.8.4 diff --git a/swift/ql/lib/qlpack.yml b/swift/ql/lib/qlpack.yml index 9806fded2032..6a98e4ff8d25 100644 --- a/swift/ql/lib/qlpack.yml +++ b/swift/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-all -version: 6.8.4-dev +version: 6.8.4 groups: swift extractor: swift dbscheme: swift.dbscheme diff --git a/swift/ql/src/CHANGELOG.md b/swift/ql/src/CHANGELOG.md index f828ae84a5ac..1ca1013756cb 100644 --- a/swift/ql/src/CHANGELOG.md +++ b/swift/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.3.11 + +No user-facing changes. + ## 1.3.10 No user-facing changes. diff --git a/swift/ql/src/change-notes/released/1.3.11.md b/swift/ql/src/change-notes/released/1.3.11.md new file mode 100644 index 000000000000..975cfda3553c --- /dev/null +++ b/swift/ql/src/change-notes/released/1.3.11.md @@ -0,0 +1,3 @@ +## 1.3.11 + +No user-facing changes. diff --git a/swift/ql/src/codeql-pack.release.yml b/swift/ql/src/codeql-pack.release.yml index eb79ac3dca3f..9520fdc9ee93 100644 --- a/swift/ql/src/codeql-pack.release.yml +++ b/swift/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.3.10 +lastReleaseVersion: 1.3.11 diff --git a/swift/ql/src/qlpack.yml b/swift/ql/src/qlpack.yml index aa419cb33887..d65ed75d46bf 100644 --- a/swift/ql/src/qlpack.yml +++ b/swift/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-queries -version: 1.3.11-dev +version: 1.3.11 groups: - swift - queries From bad3b1e01fe086ff8ccc9a71dd89dbc8c180adf6 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 17 Sep 2026 09:35:40 +0100 Subject: [PATCH 1095/2098] Add dbscheme table isParenthesized --- .../go.dbscheme | 564 +++++++++++++++++ .../old.dbscheme | 565 ++++++++++++++++++ .../upgrade.properties | 3 + go/extractor/dbscheme/tables.go | 6 + go/extractor/extractor.go | 16 +- go/ql/lib/go.dbscheme | 3 +- .../go.dbscheme | 565 ++++++++++++++++++ .../old.dbscheme | 564 +++++++++++++++++ .../upgrade.properties | 2 + 9 files changed, 2284 insertions(+), 4 deletions(-) create mode 100644 go/downgrades/b4012cfa6fa7de1878c247155b7dfcd76df2604d/go.dbscheme create mode 100644 go/downgrades/b4012cfa6fa7de1878c247155b7dfcd76df2604d/old.dbscheme create mode 100644 go/downgrades/b4012cfa6fa7de1878c247155b7dfcd76df2604d/upgrade.properties create mode 100644 go/ql/lib/upgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/go.dbscheme create mode 100644 go/ql/lib/upgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/old.dbscheme create mode 100644 go/ql/lib/upgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/upgrade.properties diff --git a/go/downgrades/b4012cfa6fa7de1878c247155b7dfcd76df2604d/go.dbscheme b/go/downgrades/b4012cfa6fa7de1878c247155b7dfcd76df2604d/go.dbscheme new file mode 100644 index 000000000000..d0e7336b491e --- /dev/null +++ b/go/downgrades/b4012cfa6fa7de1878c247155b7dfcd76df2604d/go.dbscheme @@ -0,0 +1,564 @@ +/** Auto-generated dbscheme; do not edit. Run `make gen` in directory `go/` to regenerate. */ + + +/** Duplicate code **/ + +duplicateCode( + unique int id : @duplication, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +similarCode( + unique int id : @similarity, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +@duplication_or_similarity = @duplication | @similarity; + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref); + +/** External data **/ + +externalData( + int id : @externalDataElement, + varchar(900) path : string ref, + int column: int ref, + varchar(900) value : string ref +); + +snapshotDate(unique date snapshotDate : date ref); + +sourceLocationPrefix(varchar(900) prefix : string ref); + +/** Overlay support **/ + +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +overlayChangedFiles( + string path: string ref +); + + +/* + * XML Files + */ + +xmlEncoding( + unique int id: @file ref, + string encoding: string ref +); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +compilations(unique int id: @compilation, string cwd: string ref); + +#keyset[id, num] +compilation_args(int id: @compilation ref, int num: int ref, string arg: string ref); + +#keyset[id, num, kind] +compilation_time(int id: @compilation ref, int num: int ref, int kind: int ref, float secs: float ref); + +diagnostic_for(unique int diagnostic: @diagnostic ref, int compilation: @compilation ref, int file_number: int ref, int file_number_diagnostic_number: int ref); + +compilation_finished(unique int id: @compilation ref, float cpu_seconds: float ref, float elapsed_seconds: float ref); + +#keyset[id, num] +compilation_compiling_files(int id: @compilation ref, int num: int ref, int file: @file ref); + +diagnostics(unique int id: @diagnostic, int severity: int ref, string error_tag: string ref, string error_message: string ref, + string full_error_message: string ref, int location: @location ref); + +locations_default(unique int id: @location_default, int file: @file ref, int beginLine: int ref, int beginColumn: int ref, + int endLine: int ref, int endColumn: int ref); + +numlines(int element_id: @sourceline ref, int num_lines: int ref, int num_code: int ref, int num_comment: int ref); + +files(unique int id: @file, string name: string ref); + +folders(unique int id: @folder, string name: string ref); + +containerparent(int parent: @container ref, unique int child: @container ref); + +has_location(unique int locatable: @locatable ref, int location: @location ref); + +#keyset[parent, idx] +comment_groups(unique int id: @comment_group, int parent: @file ref, int idx: int ref); + +comments(unique int id: @comment, int kind: int ref, int parent: @comment_group ref, int idx: int ref, string text: string ref); + +doc_comments(unique int node: @documentable ref, int comment: @comment_group ref); + +#keyset[parent, idx] +exprs(unique int id: @expr, int kind: int ref, int parent: @exprparent ref, int idx: int ref); + +literals(unique int expr: @expr ref, string value: string ref, string raw: string ref); + +constvalues(unique int expr: @expr ref, string value: string ref, string exact: string ref); + +fields(unique int id: @field, int parent: @fieldparent ref, int idx: int ref); + +typeparamdecls(unique int id: @typeparamdecl, int parent: @typeparamdeclparent ref, int idx: int ref); + +#keyset[parent, idx] +stmts(unique int id: @stmt, int kind: int ref, int parent: @stmtparent ref, int idx: int ref); + +#keyset[parent, idx] +decls(unique int id: @decl, int kind: int ref, int parent: @declparent ref, int idx: int ref); + +#keyset[parent, idx] +specs(unique int id: @spec, int kind: int ref, int parent: @gendecl ref, int idx: int ref); + +scopes(unique int id: @scope, int kind: int ref); + +scopenesting(unique int inner: @scope ref, int outer: @scope ref); + +scopenodes(unique int node: @scopenode ref, int scope: @localscope ref); + +objects(unique int id: @object, int kind: int ref, string name: string ref); + +objectscopes(unique int object: @object ref, int scope: @scope ref); + +objecttypes(unique int object: @object ref, int tp: @type ref); + +methodreceivers(unique int method: @object ref, int receiver: @object ref); + +fieldstructs(unique int field: @object ref, int struct: @structtype ref); + +methodhosts(int method: @object ref, int host: @definedtype ref); + +defs(int ident: @ident ref, int object: @object ref); + +uses(int ident: @ident ref, int object: @object ref); + +types(unique int id: @type, int kind: int ref); + +type_of(unique int expr: @expr ref, int tp: @type ref); + +typename(unique int tp: @type ref, string name: string ref); + +key_type(unique int map: @maptype ref, int tp: @type ref); + +element_type(unique int container: @containertype ref, int tp: @type ref); + +base_type(unique int ptr: @pointertype ref, int tp: @type ref); + +underlying_type(unique int defined: @definedtype ref, int tp: @type ref); + +#keyset[parent, index] +component_types(int parent: @compositetype ref, int index: int ref, string name: string ref, int tp: @type ref); + +#keyset[parent, index] +struct_tags(int parent: @structtype ref, int index: int ref, string tag: string ref); + +#keyset[interface, index] +interface_private_method_ids(int interface: @interfacetype ref, int index: int ref, string id: string ref); + +array_length(unique int tp: @arraytype ref, string len: string ref); + +type_objects(unique int tp: @type ref, int object: @object ref); + +packages(unique int id: @package, string name: string ref, string path: string ref, int scope: @packagescope ref); + +#keyset[parent, idx] +modexprs(unique int id: @modexpr, int kind: int ref, int parent: @modexprparent ref, int idx: int ref); + +#keyset[parent, idx] +modtokens(string token: string ref, int parent: @modexpr ref, int idx: int ref); + +#keyset[package, idx] +errors(unique int id: @error, int kind: int ref, string msg: string ref, string rawpos: string ref, + string file: string ref, int line: int ref, int col: int ref, int package: @package ref, int idx: int ref); + +has_ellipsis(int id: @callorconversionexpr ref); + +variadic(int id: @signaturetype ref); + +#keyset[parent, idx, is_from_recv] +typeparam(unique int tp: @typeparamtype ref, string name: string ref, + int bound: @compositetype ref, int parent: @typeparamparentobject ref, int idx: int ref, boolean is_from_recv: boolean ref); + +@container = @file | @folder; + +@locatable = @xmllocatable | @node | @localscope; + +@node = @documentable | @exprparent | @modexprparent | @fieldparent | @stmtparent | @declparent | @typeparamdeclparent + | @scopenode | @comment_group | @comment; + +@documentable = @file | @field | @typeparamdecl | @spec | @gendecl | @funcdecl | @modexpr; + +@exprparent = @funcdef | @file | @expr | @field | @stmt | @decl | @typeparamdecl | @spec; + +@modexprparent = @file | @modexpr; + +@fieldparent = @decl | @structtypeexpr | @functypeexpr | @interfacetypeexpr; + +@stmtparent = @funcdef | @stmt | @decl; + +@declparent = @file | @declstmt; + +@typeparamdeclparent = @funcdecl | @typespec; + +@funcdef = @funclit | @funcdecl; + +@scopenode = @file | @functypeexpr | @blockstmt | @ifstmt | @caseclause | @switchstmt | @commclause | @loopstmt; + +@location = @location_default; + +@sourceline = @locatable; + +case @comment.kind of + 0 = @slashslashcomment +| 1 = @slashstarcomment; + +case @expr.kind of + 0 = @badexpr +| 1 = @ident +| 2 = @ellipsis +| 3 = @intlit +| 4 = @floatlit +| 5 = @imaglit +| 6 = @charlit +| 7 = @stringlit +| 8 = @funclit +| 9 = @compositelit +| 10 = @parenexpr +| 11 = @selectorexpr +| 12 = @indexexpr +| 13 = @genericfunctioninstantiationexpr +| 14 = @generictypeinstantiationexpr +| 15 = @sliceexpr +| 16 = @typeassertexpr +| 17 = @callorconversionexpr +| 18 = @starexpr +| 19 = @keyvalueexpr +| 20 = @arraytypeexpr +| 21 = @structtypeexpr +| 22 = @functypeexpr +| 23 = @interfacetypeexpr +| 24 = @maptypeexpr +| 25 = @typesetliteralexpr +| 26 = @plusexpr +| 27 = @minusexpr +| 28 = @notexpr +| 29 = @complementexpr +| 30 = @derefexpr +| 31 = @addressexpr +| 32 = @arrowexpr +| 33 = @lorexpr +| 34 = @landexpr +| 35 = @eqlexpr +| 36 = @neqexpr +| 37 = @lssexpr +| 38 = @leqexpr +| 39 = @gtrexpr +| 40 = @geqexpr +| 41 = @addexpr +| 42 = @subexpr +| 43 = @orexpr +| 44 = @xorexpr +| 45 = @mulexpr +| 46 = @quoexpr +| 47 = @remexpr +| 48 = @shlexpr +| 49 = @shrexpr +| 50 = @andexpr +| 51 = @andnotexpr +| 52 = @sendchantypeexpr +| 53 = @recvchantypeexpr +| 54 = @sendrcvchantypeexpr +| 55 = @rangeelementexpr; + +@basiclit = @intlit | @floatlit | @imaglit | @charlit | @stringlit; + +@operatorexpr = @logicalexpr | @arithmeticexpr | @bitwiseexpr | @unaryexpr | @binaryexpr; + +@logicalexpr = @logicalunaryexpr | @logicalbinaryexpr; + +@arithmeticexpr = @arithmeticunaryexpr | @arithmeticbinaryexpr; + +@bitwiseexpr = @bitwiseunaryexpr | @bitwisebinaryexpr; + +@unaryexpr = @logicalunaryexpr | @bitwiseunaryexpr | @arithmeticunaryexpr | @derefexpr | @addressexpr | @arrowexpr; + +@logicalunaryexpr = @notexpr; + +@bitwiseunaryexpr = @complementexpr; + +@arithmeticunaryexpr = @plusexpr | @minusexpr; + +@binaryexpr = @logicalbinaryexpr | @bitwisebinaryexpr | @arithmeticbinaryexpr | @comparison; + +@logicalbinaryexpr = @lorexpr | @landexpr; + +@bitwisebinaryexpr = @shiftexpr | @orexpr | @xorexpr | @andexpr | @andnotexpr; + +@arithmeticbinaryexpr = @addexpr | @subexpr | @mulexpr | @quoexpr | @remexpr; + +@shiftexpr = @shlexpr | @shrexpr; + +@comparison = @equalitytest | @relationalcomparison; + +@equalitytest = @eqlexpr | @neqexpr; + +@relationalcomparison = @lssexpr | @leqexpr | @gtrexpr | @geqexpr; + +@chantypeexpr = @sendchantypeexpr | @recvchantypeexpr | @sendrcvchantypeexpr; + +case @stmt.kind of + 0 = @badstmt +| 1 = @declstmt +| 2 = @emptystmt +| 3 = @labeledstmt +| 4 = @exprstmt +| 5 = @sendstmt +| 6 = @incstmt +| 7 = @decstmt +| 8 = @gostmt +| 9 = @deferstmt +| 10 = @returnstmt +| 11 = @breakstmt +| 12 = @continuestmt +| 13 = @gotostmt +| 14 = @fallthroughstmt +| 15 = @blockstmt +| 16 = @ifstmt +| 17 = @caseclause +| 18 = @exprswitchstmt +| 19 = @typeswitchstmt +| 20 = @commclause +| 21 = @selectstmt +| 22 = @forstmt +| 23 = @rangestmt +| 24 = @assignstmt +| 25 = @definestmt +| 26 = @addassignstmt +| 27 = @subassignstmt +| 28 = @mulassignstmt +| 29 = @quoassignstmt +| 30 = @remassignstmt +| 31 = @andassignstmt +| 32 = @orassignstmt +| 33 = @xorassignstmt +| 34 = @shlassignstmt +| 35 = @shrassignstmt +| 36 = @andnotassignstmt; + +@incdecstmt = @incstmt | @decstmt; + +@assignment = @simpleassignstmt | @compoundassignstmt; + +@simpleassignstmt = @assignstmt | @definestmt; + +@compoundassignstmt = @addassignstmt | @subassignstmt | @mulassignstmt | @quoassignstmt | @remassignstmt + | @andassignstmt | @orassignstmt | @xorassignstmt | @shlassignstmt | @shrassignstmt | @andnotassignstmt; + +@branchstmt = @breakstmt | @continuestmt | @gotostmt | @fallthroughstmt; + +@switchstmt = @exprswitchstmt | @typeswitchstmt; + +@loopstmt = @forstmt | @rangestmt; + +case @decl.kind of + 0 = @baddecl +| 1 = @importdecl +| 2 = @constdecl +| 3 = @typedecl +| 4 = @vardecl +| 5 = @funcdecl; + +@gendecl = @importdecl | @constdecl | @typedecl | @vardecl; + +case @spec.kind of + 0 = @importspec +| 1 = @valuespec +| 2 = @typedefspec +| 3 = @aliasspec; + +@typespec = @typedefspec | @aliasspec; + +case @object.kind of + 0 = @pkgobject +| 1 = @decltypeobject +| 2 = @builtintypeobject +| 3 = @declconstobject +| 4 = @builtinconstobject +| 5 = @declvarobject +| 6 = @declfunctionobject +| 7 = @builtinfunctionobject +| 8 = @labelobject; + +@typeparamparentobject = @decltypeobject | @declfunctionobject; + +@declobject = @decltypeobject | @declconstobject | @declvarobject | @declfunctionobject; + +@builtinobject = @builtintypeobject | @builtinconstobject | @builtinfunctionobject; + +@typeobject = @decltypeobject | @builtintypeobject; + +@valueobject = @constobject | @varobject | @functionobject; + +@constobject = @declconstobject | @builtinconstobject; + +@varobject = @declvarobject; + +@functionobject = @declfunctionobject | @builtinfunctionobject; + +case @scope.kind of + 0 = @universescope +| 1 = @packagescope +| 2 = @localscope; + +case @type.kind of + 0 = @invalidtype +| 1 = @boolexprtype +| 2 = @inttype +| 3 = @int8type +| 4 = @int16type +| 5 = @int32type +| 6 = @int64type +| 7 = @uinttype +| 8 = @uint8type +| 9 = @uint16type +| 10 = @uint32type +| 11 = @uint64type +| 12 = @uintptrtype +| 13 = @float32type +| 14 = @float64type +| 15 = @complex64type +| 16 = @complex128type +| 17 = @stringexprtype +| 18 = @unsafepointertype +| 19 = @boolliteraltype +| 20 = @intliteraltype +| 21 = @runeliteraltype +| 22 = @floatliteraltype +| 23 = @complexliteraltype +| 24 = @stringliteraltype +| 25 = @nilliteraltype +| 26 = @typeparamtype +| 27 = @arraytype +| 28 = @slicetype +| 29 = @structtype +| 30 = @pointertype +| 31 = @interfacetype +| 32 = @tupletype +| 33 = @signaturetype +| 34 = @maptype +| 35 = @sendchantype +| 36 = @recvchantype +| 37 = @sendrcvchantype +| 38 = @definedtype +| 39 = @typesetliteraltype; + +@basictype = @booltype | @numerictype | @stringtype | @literaltype | @invalidtype | @unsafepointertype; + +@booltype = @boolexprtype | @boolliteraltype; + +@numerictype = @integertype | @floattype | @complextype; + +@integertype = @signedintegertype | @unsignedintegertype; + +@signedintegertype = @inttype | @int8type | @int16type | @int32type | @int64type | @intliteraltype | @runeliteraltype; + +@unsignedintegertype = @uinttype | @uint8type | @uint16type | @uint32type | @uint64type | @uintptrtype; + +@floattype = @float32type | @float64type | @floatliteraltype; + +@complextype = @complex64type | @complex128type | @complexliteraltype; + +@stringtype = @stringexprtype | @stringliteraltype; + +@literaltype = @boolliteraltype | @intliteraltype | @runeliteraltype | @floatliteraltype | @complexliteraltype + | @stringliteraltype | @nilliteraltype; + +@compositetype = @typeparamtype | @containertype | @structtype | @pointertype | @interfacetype | @tupletype + | @signaturetype | @definedtype | @typesetliteraltype; + +@containertype = @arraytype | @slicetype | @maptype | @chantype; + +@chantype = @sendchantype | @recvchantype | @sendrcvchantype; + +case @modexpr.kind of + 0 = @modcommentblock +| 1 = @modline +| 2 = @modlineblock +| 3 = @modlparen +| 4 = @modrparen; + +case @error.kind of + 0 = @unknownerror +| 1 = @listerror +| 2 = @parseerror +| 3 = @typeerror; + diff --git a/go/downgrades/b4012cfa6fa7de1878c247155b7dfcd76df2604d/old.dbscheme b/go/downgrades/b4012cfa6fa7de1878c247155b7dfcd76df2604d/old.dbscheme new file mode 100644 index 000000000000..b4012cfa6fa7 --- /dev/null +++ b/go/downgrades/b4012cfa6fa7de1878c247155b7dfcd76df2604d/old.dbscheme @@ -0,0 +1,565 @@ +/** Auto-generated dbscheme; do not edit. Run `make gen` in directory `go/` to regenerate. */ + + +/** Duplicate code **/ + +duplicateCode( + unique int id : @duplication, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +similarCode( + unique int id : @similarity, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +@duplication_or_similarity = @duplication | @similarity; + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref); + +/** External data **/ + +externalData( + int id : @externalDataElement, + varchar(900) path : string ref, + int column: int ref, + varchar(900) value : string ref +); + +snapshotDate(unique date snapshotDate : date ref); + +sourceLocationPrefix(varchar(900) prefix : string ref); + +/** Overlay support **/ + +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +overlayChangedFiles( + string path: string ref +); + + +/* + * XML Files + */ + +xmlEncoding( + unique int id: @file ref, + string encoding: string ref +); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +compilations(unique int id: @compilation, string cwd: string ref); + +#keyset[id, num] +compilation_args(int id: @compilation ref, int num: int ref, string arg: string ref); + +#keyset[id, num, kind] +compilation_time(int id: @compilation ref, int num: int ref, int kind: int ref, float secs: float ref); + +diagnostic_for(unique int diagnostic: @diagnostic ref, int compilation: @compilation ref, int file_number: int ref, int file_number_diagnostic_number: int ref); + +compilation_finished(unique int id: @compilation ref, float cpu_seconds: float ref, float elapsed_seconds: float ref); + +#keyset[id, num] +compilation_compiling_files(int id: @compilation ref, int num: int ref, int file: @file ref); + +diagnostics(unique int id: @diagnostic, int severity: int ref, string error_tag: string ref, string error_message: string ref, + string full_error_message: string ref, int location: @location ref); + +locations_default(unique int id: @location_default, int file: @file ref, int beginLine: int ref, int beginColumn: int ref, + int endLine: int ref, int endColumn: int ref); + +numlines(int element_id: @sourceline ref, int num_lines: int ref, int num_code: int ref, int num_comment: int ref); + +files(unique int id: @file, string name: string ref); + +folders(unique int id: @folder, string name: string ref); + +containerparent(int parent: @container ref, unique int child: @container ref); + +has_location(unique int locatable: @locatable ref, int location: @location ref); + +#keyset[parent, idx] +comment_groups(unique int id: @comment_group, int parent: @file ref, int idx: int ref); + +comments(unique int id: @comment, int kind: int ref, int parent: @comment_group ref, int idx: int ref, string text: string ref); + +doc_comments(unique int node: @documentable ref, int comment: @comment_group ref); + +#keyset[parent, idx] +exprs(unique int id: @expr, int kind: int ref, int parent: @exprparent ref, int idx: int ref); + +isParenthesized(unique int id: @expr ref, int parentheses: int ref); + +literals(unique int expr: @expr ref, string value: string ref, string raw: string ref); + +constvalues(unique int expr: @expr ref, string value: string ref, string exact: string ref); + +fields(unique int id: @field, int parent: @fieldparent ref, int idx: int ref); + +typeparamdecls(unique int id: @typeparamdecl, int parent: @typeparamdeclparent ref, int idx: int ref); + +#keyset[parent, idx] +stmts(unique int id: @stmt, int kind: int ref, int parent: @stmtparent ref, int idx: int ref); + +#keyset[parent, idx] +decls(unique int id: @decl, int kind: int ref, int parent: @declparent ref, int idx: int ref); + +#keyset[parent, idx] +specs(unique int id: @spec, int kind: int ref, int parent: @gendecl ref, int idx: int ref); + +scopes(unique int id: @scope, int kind: int ref); + +scopenesting(unique int inner: @scope ref, int outer: @scope ref); + +scopenodes(unique int node: @scopenode ref, int scope: @localscope ref); + +objects(unique int id: @object, int kind: int ref, string name: string ref); + +objectscopes(unique int object: @object ref, int scope: @scope ref); + +objecttypes(unique int object: @object ref, int tp: @type ref); + +methodreceivers(unique int method: @object ref, int receiver: @object ref); + +fieldstructs(unique int field: @object ref, int struct: @structtype ref); + +methodhosts(int method: @object ref, int host: @definedtype ref); + +defs(int ident: @ident ref, int object: @object ref); + +uses(int ident: @ident ref, int object: @object ref); + +types(unique int id: @type, int kind: int ref); + +type_of(unique int expr: @expr ref, int tp: @type ref); + +typename(unique int tp: @type ref, string name: string ref); + +key_type(unique int map: @maptype ref, int tp: @type ref); + +element_type(unique int container: @containertype ref, int tp: @type ref); + +base_type(unique int ptr: @pointertype ref, int tp: @type ref); + +underlying_type(unique int defined: @definedtype ref, int tp: @type ref); + +#keyset[parent, index] +component_types(int parent: @compositetype ref, int index: int ref, string name: string ref, int tp: @type ref); + +#keyset[parent, index] +struct_tags(int parent: @structtype ref, int index: int ref, string tag: string ref); + +#keyset[interface, index] +interface_private_method_ids(int interface: @interfacetype ref, int index: int ref, string id: string ref); + +array_length(unique int tp: @arraytype ref, string len: string ref); + +type_objects(unique int tp: @type ref, int object: @object ref); + +packages(unique int id: @package, string name: string ref, string path: string ref, int scope: @packagescope ref); + +#keyset[parent, idx] +modexprs(unique int id: @modexpr, int kind: int ref, int parent: @modexprparent ref, int idx: int ref); + +#keyset[parent, idx] +modtokens(string token: string ref, int parent: @modexpr ref, int idx: int ref); + +#keyset[package, idx] +errors(unique int id: @error, int kind: int ref, string msg: string ref, string rawpos: string ref, + string file: string ref, int line: int ref, int col: int ref, int package: @package ref, int idx: int ref); + +has_ellipsis(int id: @callorconversionexpr ref); + +variadic(int id: @signaturetype ref); + +#keyset[parent, idx, is_from_recv] +typeparam(unique int tp: @typeparamtype ref, string name: string ref, + int bound: @compositetype ref, int parent: @typeparamparentobject ref, int idx: int ref, boolean is_from_recv: boolean ref); + +@container = @file | @folder; + +@locatable = @xmllocatable | @node | @localscope; + +@node = @documentable | @exprparent | @modexprparent | @fieldparent | @stmtparent | @declparent | @typeparamdeclparent + | @scopenode | @comment_group | @comment; + +@documentable = @file | @field | @typeparamdecl | @spec | @gendecl | @funcdecl | @modexpr; + +@exprparent = @funcdef | @file | @expr | @field | @stmt | @decl | @typeparamdecl | @spec; + +@modexprparent = @file | @modexpr; + +@fieldparent = @decl | @structtypeexpr | @functypeexpr | @interfacetypeexpr; + +@stmtparent = @funcdef | @stmt | @decl; + +@declparent = @file | @declstmt; + +@typeparamdeclparent = @funcdecl | @typespec; + +@funcdef = @funclit | @funcdecl; + +@scopenode = @file | @functypeexpr | @blockstmt | @ifstmt | @caseclause | @switchstmt | @commclause | @loopstmt; + +@location = @location_default; + +@sourceline = @locatable; + +case @comment.kind of + 0 = @slashslashcomment +| 1 = @slashstarcomment; + +case @expr.kind of + 0 = @badexpr +| 1 = @ident +| 2 = @ellipsis +| 3 = @intlit +| 4 = @floatlit +| 5 = @imaglit +| 6 = @charlit +| 7 = @stringlit +| 8 = @funclit +| 9 = @compositelit +| 10 = @parenexpr +| 11 = @selectorexpr +| 12 = @indexexpr +| 13 = @genericfunctioninstantiationexpr +| 14 = @generictypeinstantiationexpr +| 15 = @sliceexpr +| 16 = @typeassertexpr +| 17 = @callorconversionexpr +| 18 = @starexpr +| 19 = @keyvalueexpr +| 20 = @arraytypeexpr +| 21 = @structtypeexpr +| 22 = @functypeexpr +| 23 = @interfacetypeexpr +| 24 = @maptypeexpr +| 25 = @typesetliteralexpr +| 26 = @plusexpr +| 27 = @minusexpr +| 28 = @notexpr +| 29 = @complementexpr +| 30 = @derefexpr +| 31 = @addressexpr +| 32 = @arrowexpr +| 33 = @lorexpr +| 34 = @landexpr +| 35 = @eqlexpr +| 36 = @neqexpr +| 37 = @lssexpr +| 38 = @leqexpr +| 39 = @gtrexpr +| 40 = @geqexpr +| 41 = @addexpr +| 42 = @subexpr +| 43 = @orexpr +| 44 = @xorexpr +| 45 = @mulexpr +| 46 = @quoexpr +| 47 = @remexpr +| 48 = @shlexpr +| 49 = @shrexpr +| 50 = @andexpr +| 51 = @andnotexpr +| 52 = @sendchantypeexpr +| 53 = @recvchantypeexpr +| 54 = @sendrcvchantypeexpr +| 55 = @rangeelementexpr; + +@basiclit = @intlit | @floatlit | @imaglit | @charlit | @stringlit; + +@operatorexpr = @logicalexpr | @arithmeticexpr | @bitwiseexpr | @unaryexpr | @binaryexpr; + +@logicalexpr = @logicalunaryexpr | @logicalbinaryexpr; + +@arithmeticexpr = @arithmeticunaryexpr | @arithmeticbinaryexpr; + +@bitwiseexpr = @bitwiseunaryexpr | @bitwisebinaryexpr; + +@unaryexpr = @logicalunaryexpr | @bitwiseunaryexpr | @arithmeticunaryexpr | @derefexpr | @addressexpr | @arrowexpr; + +@logicalunaryexpr = @notexpr; + +@bitwiseunaryexpr = @complementexpr; + +@arithmeticunaryexpr = @plusexpr | @minusexpr; + +@binaryexpr = @logicalbinaryexpr | @bitwisebinaryexpr | @arithmeticbinaryexpr | @comparison; + +@logicalbinaryexpr = @lorexpr | @landexpr; + +@bitwisebinaryexpr = @shiftexpr | @orexpr | @xorexpr | @andexpr | @andnotexpr; + +@arithmeticbinaryexpr = @addexpr | @subexpr | @mulexpr | @quoexpr | @remexpr; + +@shiftexpr = @shlexpr | @shrexpr; + +@comparison = @equalitytest | @relationalcomparison; + +@equalitytest = @eqlexpr | @neqexpr; + +@relationalcomparison = @lssexpr | @leqexpr | @gtrexpr | @geqexpr; + +@chantypeexpr = @sendchantypeexpr | @recvchantypeexpr | @sendrcvchantypeexpr; + +case @stmt.kind of + 0 = @badstmt +| 1 = @declstmt +| 2 = @emptystmt +| 3 = @labeledstmt +| 4 = @exprstmt +| 5 = @sendstmt +| 6 = @incstmt +| 7 = @decstmt +| 8 = @gostmt +| 9 = @deferstmt +| 10 = @returnstmt +| 11 = @breakstmt +| 12 = @continuestmt +| 13 = @gotostmt +| 14 = @fallthroughstmt +| 15 = @blockstmt +| 16 = @ifstmt +| 17 = @caseclause +| 18 = @exprswitchstmt +| 19 = @typeswitchstmt +| 20 = @commclause +| 21 = @selectstmt +| 22 = @forstmt +| 23 = @rangestmt +| 24 = @assignstmt +| 25 = @definestmt +| 26 = @addassignstmt +| 27 = @subassignstmt +| 28 = @mulassignstmt +| 29 = @quoassignstmt +| 30 = @remassignstmt +| 31 = @andassignstmt +| 32 = @orassignstmt +| 33 = @xorassignstmt +| 34 = @shlassignstmt +| 35 = @shrassignstmt +| 36 = @andnotassignstmt; + +@incdecstmt = @incstmt | @decstmt; + +@assignment = @simpleassignstmt | @compoundassignstmt; + +@simpleassignstmt = @assignstmt | @definestmt; + +@compoundassignstmt = @addassignstmt | @subassignstmt | @mulassignstmt | @quoassignstmt | @remassignstmt + | @andassignstmt | @orassignstmt | @xorassignstmt | @shlassignstmt | @shrassignstmt | @andnotassignstmt; + +@branchstmt = @breakstmt | @continuestmt | @gotostmt | @fallthroughstmt; + +@switchstmt = @exprswitchstmt | @typeswitchstmt; + +@loopstmt = @forstmt | @rangestmt; + +case @decl.kind of + 0 = @baddecl +| 1 = @importdecl +| 2 = @constdecl +| 3 = @typedecl +| 4 = @vardecl +| 5 = @funcdecl; + +@gendecl = @importdecl | @constdecl | @typedecl | @vardecl; + +case @spec.kind of + 0 = @importspec +| 1 = @valuespec +| 2 = @typedefspec +| 3 = @aliasspec; + +@typespec = @typedefspec | @aliasspec; + +case @object.kind of + 0 = @pkgobject +| 1 = @decltypeobject +| 2 = @builtintypeobject +| 3 = @declconstobject +| 4 = @builtinconstobject +| 5 = @declvarobject +| 6 = @declfunctionobject +| 7 = @builtinfunctionobject +| 8 = @labelobject; + +@typeparamparentobject = @decltypeobject | @declfunctionobject; + +@declobject = @decltypeobject | @declconstobject | @declvarobject | @declfunctionobject; + +@builtinobject = @builtintypeobject | @builtinconstobject | @builtinfunctionobject; + +@typeobject = @decltypeobject | @builtintypeobject; + +@valueobject = @constobject | @varobject | @functionobject; + +@constobject = @declconstobject | @builtinconstobject; + +@varobject = @declvarobject; + +@functionobject = @declfunctionobject | @builtinfunctionobject; + +case @scope.kind of + 0 = @universescope +| 1 = @packagescope +| 2 = @localscope; + +case @type.kind of + 0 = @invalidtype +| 1 = @boolexprtype +| 2 = @inttype +| 3 = @int8type +| 4 = @int16type +| 5 = @int32type +| 6 = @int64type +| 7 = @uinttype +| 8 = @uint8type +| 9 = @uint16type +| 10 = @uint32type +| 11 = @uint64type +| 12 = @uintptrtype +| 13 = @float32type +| 14 = @float64type +| 15 = @complex64type +| 16 = @complex128type +| 17 = @stringexprtype +| 18 = @unsafepointertype +| 19 = @boolliteraltype +| 20 = @intliteraltype +| 21 = @runeliteraltype +| 22 = @floatliteraltype +| 23 = @complexliteraltype +| 24 = @stringliteraltype +| 25 = @nilliteraltype +| 26 = @typeparamtype +| 27 = @arraytype +| 28 = @slicetype +| 29 = @structtype +| 30 = @pointertype +| 31 = @interfacetype +| 32 = @tupletype +| 33 = @signaturetype +| 34 = @maptype +| 35 = @sendchantype +| 36 = @recvchantype +| 37 = @sendrcvchantype +| 38 = @definedtype +| 39 = @typesetliteraltype; + +@basictype = @booltype | @numerictype | @stringtype | @literaltype | @invalidtype | @unsafepointertype; + +@booltype = @boolexprtype | @boolliteraltype; + +@numerictype = @integertype | @floattype | @complextype; + +@integertype = @signedintegertype | @unsignedintegertype; + +@signedintegertype = @inttype | @int8type | @int16type | @int32type | @int64type | @intliteraltype | @runeliteraltype; + +@unsignedintegertype = @uinttype | @uint8type | @uint16type | @uint32type | @uint64type | @uintptrtype; + +@floattype = @float32type | @float64type | @floatliteraltype; + +@complextype = @complex64type | @complex128type | @complexliteraltype; + +@stringtype = @stringexprtype | @stringliteraltype; + +@literaltype = @boolliteraltype | @intliteraltype | @runeliteraltype | @floatliteraltype | @complexliteraltype + | @stringliteraltype | @nilliteraltype; + +@compositetype = @typeparamtype | @containertype | @structtype | @pointertype | @interfacetype | @tupletype + | @signaturetype | @definedtype | @typesetliteraltype; + +@containertype = @arraytype | @slicetype | @maptype | @chantype; + +@chantype = @sendchantype | @recvchantype | @sendrcvchantype; + +case @modexpr.kind of + 0 = @modcommentblock +| 1 = @modline +| 2 = @modlineblock +| 3 = @modlparen +| 4 = @modrparen; + +case @error.kind of + 0 = @unknownerror +| 1 = @listerror +| 2 = @parseerror +| 3 = @typeerror; diff --git a/go/downgrades/b4012cfa6fa7de1878c247155b7dfcd76df2604d/upgrade.properties b/go/downgrades/b4012cfa6fa7de1878c247155b7dfcd76df2604d/upgrade.properties new file mode 100644 index 000000000000..74cb08710c86 --- /dev/null +++ b/go/downgrades/b4012cfa6fa7de1878c247155b7dfcd76df2604d/upgrade.properties @@ -0,0 +1,3 @@ +description: Remove table recording the number of parentheses around expressions +compatibility: full +isParenthesized.rel: delete diff --git a/go/extractor/dbscheme/tables.go b/go/extractor/dbscheme/tables.go index 04dbdf40ba65..8335734963c5 100644 --- a/go/extractor/dbscheme/tables.go +++ b/go/extractor/dbscheme/tables.go @@ -996,6 +996,12 @@ var ExprsTable = NewTable("exprs", IntColumn("idx"), ).KeySet("parent", "idx") +// IsParenthesizedTable is the table associating expressions with how many parentheses they originally had +var IsParenthesizedTable = NewTable("isParenthesized", + EntityColumn(ExprType, "id").Unique(), + IntColumn("parentheses"), +) + // LiteralsTable is the table associating literal expression AST nodes with their values var LiteralsTable = NewTable("literals", EntityColumn(ExprType, "expr").Unique(), diff --git a/go/extractor/extractor.go b/go/extractor/extractor.go index 335655f421b7..cbe24088d7c0 100644 --- a/go/extractor/extractor.go +++ b/go/extractor/extractor.go @@ -1026,12 +1026,22 @@ func extractExpr(tw *trap.Writer, expr ast.Expr, parent trap.Label, idx int, ski } // Skip parenthesised expressions and extract their child directly in their place - if paren, ok := expr.(*ast.ParenExpr); ok { - extractExpr(tw, paren.X, parent, idx, skipExtractingValue) - return + nParens := 0 + for { + paren, ok := expr.(*ast.ParenExpr) + if !ok { + break + } + nParens++ + expr = paren.X } lbl := tw.Labeler.LocalID(expr) + + if nParens > 0 { + dbscheme.IsParenthesizedTable.Emit(tw, lbl, nParens) + } + extractTypeOf(tw, expr, lbl) var kind int diff --git a/go/ql/lib/go.dbscheme b/go/ql/lib/go.dbscheme index d0e7336b491e..b4012cfa6fa7 100644 --- a/go/ql/lib/go.dbscheme +++ b/go/ql/lib/go.dbscheme @@ -162,6 +162,8 @@ doc_comments(unique int node: @documentable ref, int comment: @comment_group ref #keyset[parent, idx] exprs(unique int id: @expr, int kind: int ref, int parent: @exprparent ref, int idx: int ref); +isParenthesized(unique int id: @expr ref, int parentheses: int ref); + literals(unique int expr: @expr ref, string value: string ref, string raw: string ref); constvalues(unique int expr: @expr ref, string value: string ref, string exact: string ref); @@ -561,4 +563,3 @@ case @error.kind of | 1 = @listerror | 2 = @parseerror | 3 = @typeerror; - diff --git a/go/ql/lib/upgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/go.dbscheme b/go/ql/lib/upgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/go.dbscheme new file mode 100644 index 000000000000..b4012cfa6fa7 --- /dev/null +++ b/go/ql/lib/upgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/go.dbscheme @@ -0,0 +1,565 @@ +/** Auto-generated dbscheme; do not edit. Run `make gen` in directory `go/` to regenerate. */ + + +/** Duplicate code **/ + +duplicateCode( + unique int id : @duplication, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +similarCode( + unique int id : @similarity, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +@duplication_or_similarity = @duplication | @similarity; + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref); + +/** External data **/ + +externalData( + int id : @externalDataElement, + varchar(900) path : string ref, + int column: int ref, + varchar(900) value : string ref +); + +snapshotDate(unique date snapshotDate : date ref); + +sourceLocationPrefix(varchar(900) prefix : string ref); + +/** Overlay support **/ + +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +overlayChangedFiles( + string path: string ref +); + + +/* + * XML Files + */ + +xmlEncoding( + unique int id: @file ref, + string encoding: string ref +); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +compilations(unique int id: @compilation, string cwd: string ref); + +#keyset[id, num] +compilation_args(int id: @compilation ref, int num: int ref, string arg: string ref); + +#keyset[id, num, kind] +compilation_time(int id: @compilation ref, int num: int ref, int kind: int ref, float secs: float ref); + +diagnostic_for(unique int diagnostic: @diagnostic ref, int compilation: @compilation ref, int file_number: int ref, int file_number_diagnostic_number: int ref); + +compilation_finished(unique int id: @compilation ref, float cpu_seconds: float ref, float elapsed_seconds: float ref); + +#keyset[id, num] +compilation_compiling_files(int id: @compilation ref, int num: int ref, int file: @file ref); + +diagnostics(unique int id: @diagnostic, int severity: int ref, string error_tag: string ref, string error_message: string ref, + string full_error_message: string ref, int location: @location ref); + +locations_default(unique int id: @location_default, int file: @file ref, int beginLine: int ref, int beginColumn: int ref, + int endLine: int ref, int endColumn: int ref); + +numlines(int element_id: @sourceline ref, int num_lines: int ref, int num_code: int ref, int num_comment: int ref); + +files(unique int id: @file, string name: string ref); + +folders(unique int id: @folder, string name: string ref); + +containerparent(int parent: @container ref, unique int child: @container ref); + +has_location(unique int locatable: @locatable ref, int location: @location ref); + +#keyset[parent, idx] +comment_groups(unique int id: @comment_group, int parent: @file ref, int idx: int ref); + +comments(unique int id: @comment, int kind: int ref, int parent: @comment_group ref, int idx: int ref, string text: string ref); + +doc_comments(unique int node: @documentable ref, int comment: @comment_group ref); + +#keyset[parent, idx] +exprs(unique int id: @expr, int kind: int ref, int parent: @exprparent ref, int idx: int ref); + +isParenthesized(unique int id: @expr ref, int parentheses: int ref); + +literals(unique int expr: @expr ref, string value: string ref, string raw: string ref); + +constvalues(unique int expr: @expr ref, string value: string ref, string exact: string ref); + +fields(unique int id: @field, int parent: @fieldparent ref, int idx: int ref); + +typeparamdecls(unique int id: @typeparamdecl, int parent: @typeparamdeclparent ref, int idx: int ref); + +#keyset[parent, idx] +stmts(unique int id: @stmt, int kind: int ref, int parent: @stmtparent ref, int idx: int ref); + +#keyset[parent, idx] +decls(unique int id: @decl, int kind: int ref, int parent: @declparent ref, int idx: int ref); + +#keyset[parent, idx] +specs(unique int id: @spec, int kind: int ref, int parent: @gendecl ref, int idx: int ref); + +scopes(unique int id: @scope, int kind: int ref); + +scopenesting(unique int inner: @scope ref, int outer: @scope ref); + +scopenodes(unique int node: @scopenode ref, int scope: @localscope ref); + +objects(unique int id: @object, int kind: int ref, string name: string ref); + +objectscopes(unique int object: @object ref, int scope: @scope ref); + +objecttypes(unique int object: @object ref, int tp: @type ref); + +methodreceivers(unique int method: @object ref, int receiver: @object ref); + +fieldstructs(unique int field: @object ref, int struct: @structtype ref); + +methodhosts(int method: @object ref, int host: @definedtype ref); + +defs(int ident: @ident ref, int object: @object ref); + +uses(int ident: @ident ref, int object: @object ref); + +types(unique int id: @type, int kind: int ref); + +type_of(unique int expr: @expr ref, int tp: @type ref); + +typename(unique int tp: @type ref, string name: string ref); + +key_type(unique int map: @maptype ref, int tp: @type ref); + +element_type(unique int container: @containertype ref, int tp: @type ref); + +base_type(unique int ptr: @pointertype ref, int tp: @type ref); + +underlying_type(unique int defined: @definedtype ref, int tp: @type ref); + +#keyset[parent, index] +component_types(int parent: @compositetype ref, int index: int ref, string name: string ref, int tp: @type ref); + +#keyset[parent, index] +struct_tags(int parent: @structtype ref, int index: int ref, string tag: string ref); + +#keyset[interface, index] +interface_private_method_ids(int interface: @interfacetype ref, int index: int ref, string id: string ref); + +array_length(unique int tp: @arraytype ref, string len: string ref); + +type_objects(unique int tp: @type ref, int object: @object ref); + +packages(unique int id: @package, string name: string ref, string path: string ref, int scope: @packagescope ref); + +#keyset[parent, idx] +modexprs(unique int id: @modexpr, int kind: int ref, int parent: @modexprparent ref, int idx: int ref); + +#keyset[parent, idx] +modtokens(string token: string ref, int parent: @modexpr ref, int idx: int ref); + +#keyset[package, idx] +errors(unique int id: @error, int kind: int ref, string msg: string ref, string rawpos: string ref, + string file: string ref, int line: int ref, int col: int ref, int package: @package ref, int idx: int ref); + +has_ellipsis(int id: @callorconversionexpr ref); + +variadic(int id: @signaturetype ref); + +#keyset[parent, idx, is_from_recv] +typeparam(unique int tp: @typeparamtype ref, string name: string ref, + int bound: @compositetype ref, int parent: @typeparamparentobject ref, int idx: int ref, boolean is_from_recv: boolean ref); + +@container = @file | @folder; + +@locatable = @xmllocatable | @node | @localscope; + +@node = @documentable | @exprparent | @modexprparent | @fieldparent | @stmtparent | @declparent | @typeparamdeclparent + | @scopenode | @comment_group | @comment; + +@documentable = @file | @field | @typeparamdecl | @spec | @gendecl | @funcdecl | @modexpr; + +@exprparent = @funcdef | @file | @expr | @field | @stmt | @decl | @typeparamdecl | @spec; + +@modexprparent = @file | @modexpr; + +@fieldparent = @decl | @structtypeexpr | @functypeexpr | @interfacetypeexpr; + +@stmtparent = @funcdef | @stmt | @decl; + +@declparent = @file | @declstmt; + +@typeparamdeclparent = @funcdecl | @typespec; + +@funcdef = @funclit | @funcdecl; + +@scopenode = @file | @functypeexpr | @blockstmt | @ifstmt | @caseclause | @switchstmt | @commclause | @loopstmt; + +@location = @location_default; + +@sourceline = @locatable; + +case @comment.kind of + 0 = @slashslashcomment +| 1 = @slashstarcomment; + +case @expr.kind of + 0 = @badexpr +| 1 = @ident +| 2 = @ellipsis +| 3 = @intlit +| 4 = @floatlit +| 5 = @imaglit +| 6 = @charlit +| 7 = @stringlit +| 8 = @funclit +| 9 = @compositelit +| 10 = @parenexpr +| 11 = @selectorexpr +| 12 = @indexexpr +| 13 = @genericfunctioninstantiationexpr +| 14 = @generictypeinstantiationexpr +| 15 = @sliceexpr +| 16 = @typeassertexpr +| 17 = @callorconversionexpr +| 18 = @starexpr +| 19 = @keyvalueexpr +| 20 = @arraytypeexpr +| 21 = @structtypeexpr +| 22 = @functypeexpr +| 23 = @interfacetypeexpr +| 24 = @maptypeexpr +| 25 = @typesetliteralexpr +| 26 = @plusexpr +| 27 = @minusexpr +| 28 = @notexpr +| 29 = @complementexpr +| 30 = @derefexpr +| 31 = @addressexpr +| 32 = @arrowexpr +| 33 = @lorexpr +| 34 = @landexpr +| 35 = @eqlexpr +| 36 = @neqexpr +| 37 = @lssexpr +| 38 = @leqexpr +| 39 = @gtrexpr +| 40 = @geqexpr +| 41 = @addexpr +| 42 = @subexpr +| 43 = @orexpr +| 44 = @xorexpr +| 45 = @mulexpr +| 46 = @quoexpr +| 47 = @remexpr +| 48 = @shlexpr +| 49 = @shrexpr +| 50 = @andexpr +| 51 = @andnotexpr +| 52 = @sendchantypeexpr +| 53 = @recvchantypeexpr +| 54 = @sendrcvchantypeexpr +| 55 = @rangeelementexpr; + +@basiclit = @intlit | @floatlit | @imaglit | @charlit | @stringlit; + +@operatorexpr = @logicalexpr | @arithmeticexpr | @bitwiseexpr | @unaryexpr | @binaryexpr; + +@logicalexpr = @logicalunaryexpr | @logicalbinaryexpr; + +@arithmeticexpr = @arithmeticunaryexpr | @arithmeticbinaryexpr; + +@bitwiseexpr = @bitwiseunaryexpr | @bitwisebinaryexpr; + +@unaryexpr = @logicalunaryexpr | @bitwiseunaryexpr | @arithmeticunaryexpr | @derefexpr | @addressexpr | @arrowexpr; + +@logicalunaryexpr = @notexpr; + +@bitwiseunaryexpr = @complementexpr; + +@arithmeticunaryexpr = @plusexpr | @minusexpr; + +@binaryexpr = @logicalbinaryexpr | @bitwisebinaryexpr | @arithmeticbinaryexpr | @comparison; + +@logicalbinaryexpr = @lorexpr | @landexpr; + +@bitwisebinaryexpr = @shiftexpr | @orexpr | @xorexpr | @andexpr | @andnotexpr; + +@arithmeticbinaryexpr = @addexpr | @subexpr | @mulexpr | @quoexpr | @remexpr; + +@shiftexpr = @shlexpr | @shrexpr; + +@comparison = @equalitytest | @relationalcomparison; + +@equalitytest = @eqlexpr | @neqexpr; + +@relationalcomparison = @lssexpr | @leqexpr | @gtrexpr | @geqexpr; + +@chantypeexpr = @sendchantypeexpr | @recvchantypeexpr | @sendrcvchantypeexpr; + +case @stmt.kind of + 0 = @badstmt +| 1 = @declstmt +| 2 = @emptystmt +| 3 = @labeledstmt +| 4 = @exprstmt +| 5 = @sendstmt +| 6 = @incstmt +| 7 = @decstmt +| 8 = @gostmt +| 9 = @deferstmt +| 10 = @returnstmt +| 11 = @breakstmt +| 12 = @continuestmt +| 13 = @gotostmt +| 14 = @fallthroughstmt +| 15 = @blockstmt +| 16 = @ifstmt +| 17 = @caseclause +| 18 = @exprswitchstmt +| 19 = @typeswitchstmt +| 20 = @commclause +| 21 = @selectstmt +| 22 = @forstmt +| 23 = @rangestmt +| 24 = @assignstmt +| 25 = @definestmt +| 26 = @addassignstmt +| 27 = @subassignstmt +| 28 = @mulassignstmt +| 29 = @quoassignstmt +| 30 = @remassignstmt +| 31 = @andassignstmt +| 32 = @orassignstmt +| 33 = @xorassignstmt +| 34 = @shlassignstmt +| 35 = @shrassignstmt +| 36 = @andnotassignstmt; + +@incdecstmt = @incstmt | @decstmt; + +@assignment = @simpleassignstmt | @compoundassignstmt; + +@simpleassignstmt = @assignstmt | @definestmt; + +@compoundassignstmt = @addassignstmt | @subassignstmt | @mulassignstmt | @quoassignstmt | @remassignstmt + | @andassignstmt | @orassignstmt | @xorassignstmt | @shlassignstmt | @shrassignstmt | @andnotassignstmt; + +@branchstmt = @breakstmt | @continuestmt | @gotostmt | @fallthroughstmt; + +@switchstmt = @exprswitchstmt | @typeswitchstmt; + +@loopstmt = @forstmt | @rangestmt; + +case @decl.kind of + 0 = @baddecl +| 1 = @importdecl +| 2 = @constdecl +| 3 = @typedecl +| 4 = @vardecl +| 5 = @funcdecl; + +@gendecl = @importdecl | @constdecl | @typedecl | @vardecl; + +case @spec.kind of + 0 = @importspec +| 1 = @valuespec +| 2 = @typedefspec +| 3 = @aliasspec; + +@typespec = @typedefspec | @aliasspec; + +case @object.kind of + 0 = @pkgobject +| 1 = @decltypeobject +| 2 = @builtintypeobject +| 3 = @declconstobject +| 4 = @builtinconstobject +| 5 = @declvarobject +| 6 = @declfunctionobject +| 7 = @builtinfunctionobject +| 8 = @labelobject; + +@typeparamparentobject = @decltypeobject | @declfunctionobject; + +@declobject = @decltypeobject | @declconstobject | @declvarobject | @declfunctionobject; + +@builtinobject = @builtintypeobject | @builtinconstobject | @builtinfunctionobject; + +@typeobject = @decltypeobject | @builtintypeobject; + +@valueobject = @constobject | @varobject | @functionobject; + +@constobject = @declconstobject | @builtinconstobject; + +@varobject = @declvarobject; + +@functionobject = @declfunctionobject | @builtinfunctionobject; + +case @scope.kind of + 0 = @universescope +| 1 = @packagescope +| 2 = @localscope; + +case @type.kind of + 0 = @invalidtype +| 1 = @boolexprtype +| 2 = @inttype +| 3 = @int8type +| 4 = @int16type +| 5 = @int32type +| 6 = @int64type +| 7 = @uinttype +| 8 = @uint8type +| 9 = @uint16type +| 10 = @uint32type +| 11 = @uint64type +| 12 = @uintptrtype +| 13 = @float32type +| 14 = @float64type +| 15 = @complex64type +| 16 = @complex128type +| 17 = @stringexprtype +| 18 = @unsafepointertype +| 19 = @boolliteraltype +| 20 = @intliteraltype +| 21 = @runeliteraltype +| 22 = @floatliteraltype +| 23 = @complexliteraltype +| 24 = @stringliteraltype +| 25 = @nilliteraltype +| 26 = @typeparamtype +| 27 = @arraytype +| 28 = @slicetype +| 29 = @structtype +| 30 = @pointertype +| 31 = @interfacetype +| 32 = @tupletype +| 33 = @signaturetype +| 34 = @maptype +| 35 = @sendchantype +| 36 = @recvchantype +| 37 = @sendrcvchantype +| 38 = @definedtype +| 39 = @typesetliteraltype; + +@basictype = @booltype | @numerictype | @stringtype | @literaltype | @invalidtype | @unsafepointertype; + +@booltype = @boolexprtype | @boolliteraltype; + +@numerictype = @integertype | @floattype | @complextype; + +@integertype = @signedintegertype | @unsignedintegertype; + +@signedintegertype = @inttype | @int8type | @int16type | @int32type | @int64type | @intliteraltype | @runeliteraltype; + +@unsignedintegertype = @uinttype | @uint8type | @uint16type | @uint32type | @uint64type | @uintptrtype; + +@floattype = @float32type | @float64type | @floatliteraltype; + +@complextype = @complex64type | @complex128type | @complexliteraltype; + +@stringtype = @stringexprtype | @stringliteraltype; + +@literaltype = @boolliteraltype | @intliteraltype | @runeliteraltype | @floatliteraltype | @complexliteraltype + | @stringliteraltype | @nilliteraltype; + +@compositetype = @typeparamtype | @containertype | @structtype | @pointertype | @interfacetype | @tupletype + | @signaturetype | @definedtype | @typesetliteraltype; + +@containertype = @arraytype | @slicetype | @maptype | @chantype; + +@chantype = @sendchantype | @recvchantype | @sendrcvchantype; + +case @modexpr.kind of + 0 = @modcommentblock +| 1 = @modline +| 2 = @modlineblock +| 3 = @modlparen +| 4 = @modrparen; + +case @error.kind of + 0 = @unknownerror +| 1 = @listerror +| 2 = @parseerror +| 3 = @typeerror; diff --git a/go/ql/lib/upgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/old.dbscheme b/go/ql/lib/upgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/old.dbscheme new file mode 100644 index 000000000000..d0e7336b491e --- /dev/null +++ b/go/ql/lib/upgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/old.dbscheme @@ -0,0 +1,564 @@ +/** Auto-generated dbscheme; do not edit. Run `make gen` in directory `go/` to regenerate. */ + + +/** Duplicate code **/ + +duplicateCode( + unique int id : @duplication, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +similarCode( + unique int id : @similarity, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +@duplication_or_similarity = @duplication | @similarity; + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref); + +/** External data **/ + +externalData( + int id : @externalDataElement, + varchar(900) path : string ref, + int column: int ref, + varchar(900) value : string ref +); + +snapshotDate(unique date snapshotDate : date ref); + +sourceLocationPrefix(varchar(900) prefix : string ref); + +/** Overlay support **/ + +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +overlayChangedFiles( + string path: string ref +); + + +/* + * XML Files + */ + +xmlEncoding( + unique int id: @file ref, + string encoding: string ref +); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +compilations(unique int id: @compilation, string cwd: string ref); + +#keyset[id, num] +compilation_args(int id: @compilation ref, int num: int ref, string arg: string ref); + +#keyset[id, num, kind] +compilation_time(int id: @compilation ref, int num: int ref, int kind: int ref, float secs: float ref); + +diagnostic_for(unique int diagnostic: @diagnostic ref, int compilation: @compilation ref, int file_number: int ref, int file_number_diagnostic_number: int ref); + +compilation_finished(unique int id: @compilation ref, float cpu_seconds: float ref, float elapsed_seconds: float ref); + +#keyset[id, num] +compilation_compiling_files(int id: @compilation ref, int num: int ref, int file: @file ref); + +diagnostics(unique int id: @diagnostic, int severity: int ref, string error_tag: string ref, string error_message: string ref, + string full_error_message: string ref, int location: @location ref); + +locations_default(unique int id: @location_default, int file: @file ref, int beginLine: int ref, int beginColumn: int ref, + int endLine: int ref, int endColumn: int ref); + +numlines(int element_id: @sourceline ref, int num_lines: int ref, int num_code: int ref, int num_comment: int ref); + +files(unique int id: @file, string name: string ref); + +folders(unique int id: @folder, string name: string ref); + +containerparent(int parent: @container ref, unique int child: @container ref); + +has_location(unique int locatable: @locatable ref, int location: @location ref); + +#keyset[parent, idx] +comment_groups(unique int id: @comment_group, int parent: @file ref, int idx: int ref); + +comments(unique int id: @comment, int kind: int ref, int parent: @comment_group ref, int idx: int ref, string text: string ref); + +doc_comments(unique int node: @documentable ref, int comment: @comment_group ref); + +#keyset[parent, idx] +exprs(unique int id: @expr, int kind: int ref, int parent: @exprparent ref, int idx: int ref); + +literals(unique int expr: @expr ref, string value: string ref, string raw: string ref); + +constvalues(unique int expr: @expr ref, string value: string ref, string exact: string ref); + +fields(unique int id: @field, int parent: @fieldparent ref, int idx: int ref); + +typeparamdecls(unique int id: @typeparamdecl, int parent: @typeparamdeclparent ref, int idx: int ref); + +#keyset[parent, idx] +stmts(unique int id: @stmt, int kind: int ref, int parent: @stmtparent ref, int idx: int ref); + +#keyset[parent, idx] +decls(unique int id: @decl, int kind: int ref, int parent: @declparent ref, int idx: int ref); + +#keyset[parent, idx] +specs(unique int id: @spec, int kind: int ref, int parent: @gendecl ref, int idx: int ref); + +scopes(unique int id: @scope, int kind: int ref); + +scopenesting(unique int inner: @scope ref, int outer: @scope ref); + +scopenodes(unique int node: @scopenode ref, int scope: @localscope ref); + +objects(unique int id: @object, int kind: int ref, string name: string ref); + +objectscopes(unique int object: @object ref, int scope: @scope ref); + +objecttypes(unique int object: @object ref, int tp: @type ref); + +methodreceivers(unique int method: @object ref, int receiver: @object ref); + +fieldstructs(unique int field: @object ref, int struct: @structtype ref); + +methodhosts(int method: @object ref, int host: @definedtype ref); + +defs(int ident: @ident ref, int object: @object ref); + +uses(int ident: @ident ref, int object: @object ref); + +types(unique int id: @type, int kind: int ref); + +type_of(unique int expr: @expr ref, int tp: @type ref); + +typename(unique int tp: @type ref, string name: string ref); + +key_type(unique int map: @maptype ref, int tp: @type ref); + +element_type(unique int container: @containertype ref, int tp: @type ref); + +base_type(unique int ptr: @pointertype ref, int tp: @type ref); + +underlying_type(unique int defined: @definedtype ref, int tp: @type ref); + +#keyset[parent, index] +component_types(int parent: @compositetype ref, int index: int ref, string name: string ref, int tp: @type ref); + +#keyset[parent, index] +struct_tags(int parent: @structtype ref, int index: int ref, string tag: string ref); + +#keyset[interface, index] +interface_private_method_ids(int interface: @interfacetype ref, int index: int ref, string id: string ref); + +array_length(unique int tp: @arraytype ref, string len: string ref); + +type_objects(unique int tp: @type ref, int object: @object ref); + +packages(unique int id: @package, string name: string ref, string path: string ref, int scope: @packagescope ref); + +#keyset[parent, idx] +modexprs(unique int id: @modexpr, int kind: int ref, int parent: @modexprparent ref, int idx: int ref); + +#keyset[parent, idx] +modtokens(string token: string ref, int parent: @modexpr ref, int idx: int ref); + +#keyset[package, idx] +errors(unique int id: @error, int kind: int ref, string msg: string ref, string rawpos: string ref, + string file: string ref, int line: int ref, int col: int ref, int package: @package ref, int idx: int ref); + +has_ellipsis(int id: @callorconversionexpr ref); + +variadic(int id: @signaturetype ref); + +#keyset[parent, idx, is_from_recv] +typeparam(unique int tp: @typeparamtype ref, string name: string ref, + int bound: @compositetype ref, int parent: @typeparamparentobject ref, int idx: int ref, boolean is_from_recv: boolean ref); + +@container = @file | @folder; + +@locatable = @xmllocatable | @node | @localscope; + +@node = @documentable | @exprparent | @modexprparent | @fieldparent | @stmtparent | @declparent | @typeparamdeclparent + | @scopenode | @comment_group | @comment; + +@documentable = @file | @field | @typeparamdecl | @spec | @gendecl | @funcdecl | @modexpr; + +@exprparent = @funcdef | @file | @expr | @field | @stmt | @decl | @typeparamdecl | @spec; + +@modexprparent = @file | @modexpr; + +@fieldparent = @decl | @structtypeexpr | @functypeexpr | @interfacetypeexpr; + +@stmtparent = @funcdef | @stmt | @decl; + +@declparent = @file | @declstmt; + +@typeparamdeclparent = @funcdecl | @typespec; + +@funcdef = @funclit | @funcdecl; + +@scopenode = @file | @functypeexpr | @blockstmt | @ifstmt | @caseclause | @switchstmt | @commclause | @loopstmt; + +@location = @location_default; + +@sourceline = @locatable; + +case @comment.kind of + 0 = @slashslashcomment +| 1 = @slashstarcomment; + +case @expr.kind of + 0 = @badexpr +| 1 = @ident +| 2 = @ellipsis +| 3 = @intlit +| 4 = @floatlit +| 5 = @imaglit +| 6 = @charlit +| 7 = @stringlit +| 8 = @funclit +| 9 = @compositelit +| 10 = @parenexpr +| 11 = @selectorexpr +| 12 = @indexexpr +| 13 = @genericfunctioninstantiationexpr +| 14 = @generictypeinstantiationexpr +| 15 = @sliceexpr +| 16 = @typeassertexpr +| 17 = @callorconversionexpr +| 18 = @starexpr +| 19 = @keyvalueexpr +| 20 = @arraytypeexpr +| 21 = @structtypeexpr +| 22 = @functypeexpr +| 23 = @interfacetypeexpr +| 24 = @maptypeexpr +| 25 = @typesetliteralexpr +| 26 = @plusexpr +| 27 = @minusexpr +| 28 = @notexpr +| 29 = @complementexpr +| 30 = @derefexpr +| 31 = @addressexpr +| 32 = @arrowexpr +| 33 = @lorexpr +| 34 = @landexpr +| 35 = @eqlexpr +| 36 = @neqexpr +| 37 = @lssexpr +| 38 = @leqexpr +| 39 = @gtrexpr +| 40 = @geqexpr +| 41 = @addexpr +| 42 = @subexpr +| 43 = @orexpr +| 44 = @xorexpr +| 45 = @mulexpr +| 46 = @quoexpr +| 47 = @remexpr +| 48 = @shlexpr +| 49 = @shrexpr +| 50 = @andexpr +| 51 = @andnotexpr +| 52 = @sendchantypeexpr +| 53 = @recvchantypeexpr +| 54 = @sendrcvchantypeexpr +| 55 = @rangeelementexpr; + +@basiclit = @intlit | @floatlit | @imaglit | @charlit | @stringlit; + +@operatorexpr = @logicalexpr | @arithmeticexpr | @bitwiseexpr | @unaryexpr | @binaryexpr; + +@logicalexpr = @logicalunaryexpr | @logicalbinaryexpr; + +@arithmeticexpr = @arithmeticunaryexpr | @arithmeticbinaryexpr; + +@bitwiseexpr = @bitwiseunaryexpr | @bitwisebinaryexpr; + +@unaryexpr = @logicalunaryexpr | @bitwiseunaryexpr | @arithmeticunaryexpr | @derefexpr | @addressexpr | @arrowexpr; + +@logicalunaryexpr = @notexpr; + +@bitwiseunaryexpr = @complementexpr; + +@arithmeticunaryexpr = @plusexpr | @minusexpr; + +@binaryexpr = @logicalbinaryexpr | @bitwisebinaryexpr | @arithmeticbinaryexpr | @comparison; + +@logicalbinaryexpr = @lorexpr | @landexpr; + +@bitwisebinaryexpr = @shiftexpr | @orexpr | @xorexpr | @andexpr | @andnotexpr; + +@arithmeticbinaryexpr = @addexpr | @subexpr | @mulexpr | @quoexpr | @remexpr; + +@shiftexpr = @shlexpr | @shrexpr; + +@comparison = @equalitytest | @relationalcomparison; + +@equalitytest = @eqlexpr | @neqexpr; + +@relationalcomparison = @lssexpr | @leqexpr | @gtrexpr | @geqexpr; + +@chantypeexpr = @sendchantypeexpr | @recvchantypeexpr | @sendrcvchantypeexpr; + +case @stmt.kind of + 0 = @badstmt +| 1 = @declstmt +| 2 = @emptystmt +| 3 = @labeledstmt +| 4 = @exprstmt +| 5 = @sendstmt +| 6 = @incstmt +| 7 = @decstmt +| 8 = @gostmt +| 9 = @deferstmt +| 10 = @returnstmt +| 11 = @breakstmt +| 12 = @continuestmt +| 13 = @gotostmt +| 14 = @fallthroughstmt +| 15 = @blockstmt +| 16 = @ifstmt +| 17 = @caseclause +| 18 = @exprswitchstmt +| 19 = @typeswitchstmt +| 20 = @commclause +| 21 = @selectstmt +| 22 = @forstmt +| 23 = @rangestmt +| 24 = @assignstmt +| 25 = @definestmt +| 26 = @addassignstmt +| 27 = @subassignstmt +| 28 = @mulassignstmt +| 29 = @quoassignstmt +| 30 = @remassignstmt +| 31 = @andassignstmt +| 32 = @orassignstmt +| 33 = @xorassignstmt +| 34 = @shlassignstmt +| 35 = @shrassignstmt +| 36 = @andnotassignstmt; + +@incdecstmt = @incstmt | @decstmt; + +@assignment = @simpleassignstmt | @compoundassignstmt; + +@simpleassignstmt = @assignstmt | @definestmt; + +@compoundassignstmt = @addassignstmt | @subassignstmt | @mulassignstmt | @quoassignstmt | @remassignstmt + | @andassignstmt | @orassignstmt | @xorassignstmt | @shlassignstmt | @shrassignstmt | @andnotassignstmt; + +@branchstmt = @breakstmt | @continuestmt | @gotostmt | @fallthroughstmt; + +@switchstmt = @exprswitchstmt | @typeswitchstmt; + +@loopstmt = @forstmt | @rangestmt; + +case @decl.kind of + 0 = @baddecl +| 1 = @importdecl +| 2 = @constdecl +| 3 = @typedecl +| 4 = @vardecl +| 5 = @funcdecl; + +@gendecl = @importdecl | @constdecl | @typedecl | @vardecl; + +case @spec.kind of + 0 = @importspec +| 1 = @valuespec +| 2 = @typedefspec +| 3 = @aliasspec; + +@typespec = @typedefspec | @aliasspec; + +case @object.kind of + 0 = @pkgobject +| 1 = @decltypeobject +| 2 = @builtintypeobject +| 3 = @declconstobject +| 4 = @builtinconstobject +| 5 = @declvarobject +| 6 = @declfunctionobject +| 7 = @builtinfunctionobject +| 8 = @labelobject; + +@typeparamparentobject = @decltypeobject | @declfunctionobject; + +@declobject = @decltypeobject | @declconstobject | @declvarobject | @declfunctionobject; + +@builtinobject = @builtintypeobject | @builtinconstobject | @builtinfunctionobject; + +@typeobject = @decltypeobject | @builtintypeobject; + +@valueobject = @constobject | @varobject | @functionobject; + +@constobject = @declconstobject | @builtinconstobject; + +@varobject = @declvarobject; + +@functionobject = @declfunctionobject | @builtinfunctionobject; + +case @scope.kind of + 0 = @universescope +| 1 = @packagescope +| 2 = @localscope; + +case @type.kind of + 0 = @invalidtype +| 1 = @boolexprtype +| 2 = @inttype +| 3 = @int8type +| 4 = @int16type +| 5 = @int32type +| 6 = @int64type +| 7 = @uinttype +| 8 = @uint8type +| 9 = @uint16type +| 10 = @uint32type +| 11 = @uint64type +| 12 = @uintptrtype +| 13 = @float32type +| 14 = @float64type +| 15 = @complex64type +| 16 = @complex128type +| 17 = @stringexprtype +| 18 = @unsafepointertype +| 19 = @boolliteraltype +| 20 = @intliteraltype +| 21 = @runeliteraltype +| 22 = @floatliteraltype +| 23 = @complexliteraltype +| 24 = @stringliteraltype +| 25 = @nilliteraltype +| 26 = @typeparamtype +| 27 = @arraytype +| 28 = @slicetype +| 29 = @structtype +| 30 = @pointertype +| 31 = @interfacetype +| 32 = @tupletype +| 33 = @signaturetype +| 34 = @maptype +| 35 = @sendchantype +| 36 = @recvchantype +| 37 = @sendrcvchantype +| 38 = @definedtype +| 39 = @typesetliteraltype; + +@basictype = @booltype | @numerictype | @stringtype | @literaltype | @invalidtype | @unsafepointertype; + +@booltype = @boolexprtype | @boolliteraltype; + +@numerictype = @integertype | @floattype | @complextype; + +@integertype = @signedintegertype | @unsignedintegertype; + +@signedintegertype = @inttype | @int8type | @int16type | @int32type | @int64type | @intliteraltype | @runeliteraltype; + +@unsignedintegertype = @uinttype | @uint8type | @uint16type | @uint32type | @uint64type | @uintptrtype; + +@floattype = @float32type | @float64type | @floatliteraltype; + +@complextype = @complex64type | @complex128type | @complexliteraltype; + +@stringtype = @stringexprtype | @stringliteraltype; + +@literaltype = @boolliteraltype | @intliteraltype | @runeliteraltype | @floatliteraltype | @complexliteraltype + | @stringliteraltype | @nilliteraltype; + +@compositetype = @typeparamtype | @containertype | @structtype | @pointertype | @interfacetype | @tupletype + | @signaturetype | @definedtype | @typesetliteraltype; + +@containertype = @arraytype | @slicetype | @maptype | @chantype; + +@chantype = @sendchantype | @recvchantype | @sendrcvchantype; + +case @modexpr.kind of + 0 = @modcommentblock +| 1 = @modline +| 2 = @modlineblock +| 3 = @modlparen +| 4 = @modrparen; + +case @error.kind of + 0 = @unknownerror +| 1 = @listerror +| 2 = @parseerror +| 3 = @typeerror; + diff --git a/go/ql/lib/upgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/upgrade.properties b/go/ql/lib/upgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/upgrade.properties new file mode 100644 index 000000000000..3874b6cb69b2 --- /dev/null +++ b/go/ql/lib/upgrades/d0e7336b491e35a4c890e0b9755a4030d32ee444/upgrade.properties @@ -0,0 +1,2 @@ +description: Add table recording the number of parentheses around expressions +compatibility: backwards From 431b73a363fc9479ace646a98e20a6d923dafe30 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 17 Sep 2026 11:11:30 +0100 Subject: [PATCH 1096/2098] Update go/whitespace-contradicts-precedence to use isParenthesized --- .../WhitespaceContradictsPrecedence.ql | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/go/ql/src/InconsistentCode/WhitespaceContradictsPrecedence.ql b/go/ql/src/InconsistentCode/WhitespaceContradictsPrecedence.ql index d2abb8f4a5b9..83ce8ce7eead 100644 --- a/go/ql/src/InconsistentCode/WhitespaceContradictsPrecedence.ql +++ b/go/ql/src/InconsistentCode/WhitespaceContradictsPrecedence.ql @@ -71,21 +71,26 @@ predicate interestingNesting(BinaryExpr inner, BinaryExpr outer) { not inner instanceof HarmlessNestedExpr } +private int getNumberOfParentheses(Expr expr) { + isParenthesized(expr, result) + or + not isParenthesized(expr, _) and result = 0 +} + /** Gets the number of whitespace characters around the operator `op` of `be`. */ int getWhitespaceAroundOperator(BinaryExpr be, string op) { - exists(Location loc, Location left, Location right | - be.getLocation() = loc and + exists(Location left, Location right, int leftParens, int rightParens | be.getLeftOperand().getLocation() = left and be.getRightOperand().getLocation() = right and left.getFile() = right.getFile() and left.getStartLine() = right.getStartLine() and + leftParens = getNumberOfParentheses(be.getLeftOperand()) and + rightParens = getNumberOfParentheses(be.getRightOperand()) + | op = be.getOperator() and result = - ( - right.getStartColumn() - left.getEndColumn() - op.length() - 1 - - (left.getStartColumn() - loc.getStartColumn()) - - (loc.getEndColumn() - right.getEndColumn()) - ) / 2 + (right.getStartColumn() - left.getEndColumn() - op.length() - leftParens - rightParens - 1) / + 2 ) } From 85adb810f40c27b3d71f27c65bcdd7f9213228e3 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 17 Sep 2026 13:51:41 +0100 Subject: [PATCH 1097/2098] Add test for FP result when read is unreachable --- .../CONSISTENCY/UnexpectedFrontendErrors.expected | 2 +- .../test/query-tests/RedundantCode/DeadStoreOfLocal/main.go | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/go/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/CONSISTENCY/UnexpectedFrontendErrors.expected b/go/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/CONSISTENCY/UnexpectedFrontendErrors.expected index a7a03f17abcf..dbdac1b9d081 100644 --- a/go/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/CONSISTENCY/UnexpectedFrontendErrors.expected +++ b/go/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/CONSISTENCY/UnexpectedFrontendErrors.expected @@ -1 +1 @@ -| main.go:36:9:36:9 | undefined: unknownFunction | +| main.go:41:9:41:9 | undefined: unknownFunction | diff --git a/go/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/main.go b/go/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/main.go index ee7b9214a66b..9d9d041ddd29 100644 --- a/go/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/main.go +++ b/go/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/main.go @@ -26,6 +26,11 @@ func deadParameter(x int) bool { // we don't want to flag x here return true } +func usedOnlyAfterFalse() bool { + s := deadStore() // $ SPURIOUS: Alert + return false && s == 0 +} + func test2(x int) (int, int) { y := x >> 5 z := x % (1) From b8740865884751dbd6914ca657dd57a99aacb76a Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 17 Sep 2026 13:54:03 +0100 Subject: [PATCH 1098/2098] Fix FP in go/useless-assignment-to-local --- go/ql/src/RedundantCode/DeadStoreOfLocal.ql | 7 +++++-- .../query-tests/RedundantCode/DeadStoreOfLocal/main.go | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/go/ql/src/RedundantCode/DeadStoreOfLocal.ql b/go/ql/src/RedundantCode/DeadStoreOfLocal.ql index 7a523926f498..2b6886222aa4 100644 --- a/go/ql/src/RedundantCode/DeadStoreOfLocal.ql +++ b/go/ql/src/RedundantCode/DeadStoreOfLocal.ql @@ -37,8 +37,11 @@ where def.getBasicBlock() instanceof ReachableBasicBlock and // exclude assignments with default values or simple expressions not isSimple(rhs) and - // exclude variables that are not used at all - exists(target.getAReference()) and + // exclude variables that are not used in reachable code + exists(IR::Instruction ref | + ref != def and + (ref.reads(target) or ref.writes(target, _)) + ) and // exclude variables with indirect references not target.mayHaveIndirectReferences() and // Report the assigned variable rather than the whole write instruction. A write to an diff --git a/go/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/main.go b/go/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/main.go index 9d9d041ddd29..6574f5377bb2 100644 --- a/go/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/main.go +++ b/go/ql/test/query-tests/RedundantCode/DeadStoreOfLocal/main.go @@ -27,7 +27,7 @@ func deadParameter(x int) bool { // we don't want to flag x here } func usedOnlyAfterFalse() bool { - s := deadStore() // $ SPURIOUS: Alert + s := deadStore() return false && s == 0 } From bdbe039b4d7a5b8f7a3e0cc66d5fedd0ad572a06 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 17 Sep 2026 13:29:01 +0200 Subject: [PATCH 1099/2098] UnboundList: More compact string representation using Unicode --- shared/util/codeql/util/UnboundList.qll | 38 +++++++++++++++++++++---- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/shared/util/codeql/util/UnboundList.qll b/shared/util/codeql/util/UnboundList.qll index 622895a6bd01..e4104e06222c 100644 --- a/shared/util/codeql/util/UnboundList.qll +++ b/shared/util/codeql/util/UnboundList.qll @@ -52,7 +52,35 @@ module Make Input> { /** Gets the rank of element `e`, which is used internally in the string encoding. */ int getRank(Element e) { e = DenseRank::denseRank(result) } - private string encode(Element e) { result = getRank(e).toString() } + pragma[nomagic] + private string interpretUnicodeCodePoint(int codePoint) { + codePoint = [0, getRank(_)] and + codePoint.toUnicode() = result and + result != "." // used as element separator + } + + private int unicodeCodePoints() { result = strictcount(interpretUnicodeCodePoint(_)) } + + private int getUnicodeCodePointPart(Element e, int i) { + result = getRank(e) and + i = 0 + or + exists(int mid | + mid = getUnicodeCodePointPart(e, i - 1) and + mid > 0 and + result = mid / unicodeCodePoints() + ) + } + + pragma[nomagic] + private string encode(Element e) { + result = + strictconcat(string s, int i | + s = interpretUnicodeCodePoint(getUnicodeCodePointPart(e, i) % unicodeCodePoints()) + | + s order by i + ) + } bindingset[s] private Element decode(string s) { encode(result) = s } @@ -88,7 +116,7 @@ module Make Input> { // Same as // `result = count(this.indexOf("."))` // but performs better because it doesn't use an aggregate - result = this.regexpReplaceAll("[0-9]+", "").length() + result = this.regexpReplaceAll("[^\\.]+", "").length() } /** Gets the list obtained by appending `suffix` onto this list. */ @@ -123,7 +151,7 @@ module Make Input> { // `regexpCapture` will then always join in both groups, only to afterwards filter // based on the requested group (the group number is not part of the binding set // of `regexpCapture`) - elem = this.regexpCapture("^([0-9]+)\\..*$", 1) and + elem = this.regexpCapture("^([^\\.]+)\\..*$", 1) and e = decode(elem) and suffix = this.suffix(elem.length() + 1) ) @@ -133,7 +161,7 @@ module Make Input> { bindingset[this] predicate isSnoc(UnboundList prefix, Element e) { // same remark as above about not using multiple capture groups - prefix = this.regexpCapture("^(|.+\\.)[0-9]+\\.$", 1) and + prefix = this.regexpCapture("^(|.+\\.)[^\\.]+\\.$", 1) and e = decode(this.substring(prefix.stringLength(), this.stringLength() - 1)) } @@ -148,7 +176,7 @@ module Make Input> { */ bindingset[this] UnboundList getProperPrefix(int i) { - exists(string regexp, int occurrenceOffset | regexp = "[0-9]+\\." | + exists(string regexp, int occurrenceOffset | regexp = "[^\\.]+\\." | exists(this.regexpFind(regexp, i, occurrenceOffset)) and result = this.prefix(occurrenceOffset) ) From 7630552d856fccd5b35f82f0ffc15d583b8ad4c3 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Thu, 17 Sep 2026 15:14:01 +0200 Subject: [PATCH 1100/2098] Bazel skill: apply the repository doc register No em dashes or contractions, matching the agent-facing docs already in the repo. Also drops a few facts that would go stale without anything catching them: the registry overlay glob, the platform count, and the claim that nothing loads defs.bzl. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .github/skills/bazel/SKILL.md | 90 +++++++++++++++++------------------ 1 file changed, 44 insertions(+), 46 deletions(-) diff --git a/.github/skills/bazel/SKILL.md b/.github/skills/bazel/SKILL.md index 998a8223ee83..9e105bb475b6 100644 --- a/.github/skills/bazel/SKILL.md +++ b/.github/skills/bazel/SKILL.md @@ -1,6 +1,6 @@ --- name: bazel -description: Conventions for editing Bazel files in the github/codeql repository — the shared `misc/bazel` helpers, `codeql_platform_select` and the `{CODEQL_PLATFORM}` packaging placeholder, adding `MODULE.bazel` dependencies, and the `semmle_code` stub that keeps the standalone build working. Use when editing any `BUILD.bazel`, `*.bzl`, `MODULE.bazel` or `.bazelrc` here, and before validating such an edit. +description: Conventions for editing Bazel files in the github/codeql repository: the shared `misc/bazel` helpers, `codeql_platform_select` and the `{CODEQL_PLATFORM}` packaging placeholder, adding `MODULE.bazel` dependencies, and the `semmle_code` stub that keeps the standalone build working. Use when editing any `BUILD.bazel`, `*.bzl`, `MODULE.bazel` or `.bazelrc` here, and before validating such an edit. --- # Bazel in the codeql repository @@ -12,11 +12,11 @@ also consumed by an internal module that depends on it; standalone builds replac Things that will waste your time or produce a wrong edit here. Read this section even if you skip the rest. -* **`//...` does not work.** `bazel build //...`, and even `bazel query //...`, fail at the repo root — the patched - modules under `misc/bazel/registry/modules/*/*/overlay` are real packages referencing repos that are not visible from - the main repo, and [`.bazelrc`](../../../.bazelrc) notes that transitions break `...` builds separately. **Validate - the specific target or package you changed**, not a recursive pattern. The error names an unrelated directory and is - very easy to misdiagnose. +* **`//...` does not work.** `bazel build //...`, and even `bazel query //...`, fail at the repo root: the patched + modules under [`misc/bazel/registry`](../../../misc/bazel/registry) are real packages referencing repos that are not + visible from the main repo, and [`.bazelrc`](../../../.bazelrc) notes separately that transitions break `...` builds. + The error names a registry directory unrelated to your edit, so it is easy to misdiagnose. **Validate the specific + target or package you changed**, not a recursive pattern. * **There is no `MODULE.bazel.lock`, deliberately.** [`.bazelrc`](../../../.bazelrc) sets `--lockfile_mode=off` because the workspace-relative module override makes a lockfile unstable. Do not add one, and do not "fix" its absence. * **`linux_arm64` vs `linux-arm64`.** The keyword argument and config setting use an underscore; the platform *string* @@ -26,40 +26,40 @@ Things that will waste your time or produce a wrong edit here. Read this section ## Rules of thumb -* **Copy a neighbouring target rather than inventing a shape.** Note that packaging is not uniform — some packages use - the `codeql_*` wrappers, others still use `pkg_files` directly — so copy the closest *working* neighbour and prefer - the wrapper for new code. +* **Copy a neighbouring target rather than inventing a shape.** Packaging is not uniform: some packages use the + `codeql_*` wrappers, others still use `pkg_files` directly. Copy the closest *working* neighbour, and prefer the + wrapper for new code. * **Pin anything fetched over the network** with `sha256` or `integrity`. Bazel only *warns* on an unpinned download, so nothing fails loudly, but the build stops being reproducible and a retagged upstream release silently changes what you - build. `lfs_archive` is the exception — content is pinned by git object. -* **Format with `bazel run //misc/bazel/buildifier`.** It rewrites in place, so don't hand-tune formatting. Also wired as - a `pre-commit` hook ([`.pre-commit-config.yaml`](../../../.pre-commit-config.yaml)). + build. `lfs_archive` is the exception: content is pinned by git object. +* **Format with `bazel run //misc/bazel/buildifier`.** It rewrites in place, so do not hand-tune formatting. Also wired + as a `pre-commit` hook ([`.pre-commit-config.yaml`](../../../.pre-commit-config.yaml)). ## Where new code goes Bazel's own macro / rule / repository-rule distinction applies as usual. What is repo-specific: -| Adding… | Goes in | +| Adding | Goes in | | --- | --- | -| a new packaging shape | extend [`misc/bazel/pkg.bzl`](../../../misc/bazel/pkg.bzl) — don't fork `pkg_files` | -| a new OS or arch split | [`misc/bazel/os.bzl`](../../../misc/bazel/os.bzl) — don't hand-roll a `select()` over `@platforms//` | -| a fetch of something external | a repository rule ([`lfs.bzl`](../../../misc/bazel/lfs.bzl), [`ripunzip.bzl`](../../../misc/ripunzip/ripunzip.bzl)) — not a `genrule` | +| a new packaging shape | extend [`misc/bazel/pkg.bzl`](../../../misc/bazel/pkg.bzl), do not fork `pkg_files` | +| a new OS or arch split | [`misc/bazel/os.bzl`](../../../misc/bazel/os.bzl), do not hand-roll a `select()` over `@platforms//` | +| a fetch of something external | a repository rule ([`lfs.bzl`](../../../misc/bazel/lfs.bzl), [`ripunzip.bzl`](../../../misc/ripunzip/ripunzip.bzl)), not a `genrule` | | a wrapper used by one language | next to that language ([`swift/rules.bzl`](../../../swift/rules.bzl)) | | a wrapper used across languages | `misc/bazel/` | Prefer inline rules in `BUILD.bazel`. A `.bzl` file earns its `load()` only when the shape repeats across packages or a value must be computed: [`rust.bzl`](../../../misc/bazel/rust.bzl) is worth it because every Rust binary that ships in a pack must get the same universal-binary wrapper and symbols test, and forgetting either is a release bug. A local -debugging aid opts out and declares a plain `rust_binary` — see `swift-syntax-parse` in +debugging aid opts out and declares a plain `rust_binary`; see `swift-syntax-parse` in [`unified/swift-syntax-rs/BUILD.bazel`](../../../unified/swift-syntax-rs/BUILD.bazel). The `_gen_binaries` list in -[`go/BUILD.bazel`](../../../go/BUILD.bazel) does not earn a `.bzl` — it is shared by two targets in one file, so a local -variable does the job. +[`go/BUILD.bazel`](../../../go/BUILD.bazel) does not earn a `.bzl`, because it is shared within a single file, where a +local variable does the job. Macros here are typically a thin public wrapper around a private rule (`codeql_csharp_binary`, `swift_cc_binary`). Keep -the rule narrow and the ergonomics in the macro. Each macro decorates the caller's `name` to mint its helper targets -(`internal/`, `single_arch/`, `bin/`), but the visibility they get is that macro's choice — private, -package default, or the caller's own — so read it instead of assuming. When an error names a target you cannot find in -any source file, a macro minted it — grep the suffix under `misc/bazel/`. +the rule narrow and the ergonomics in the macro. Each macro decorates the caller's `name` to mint its helper targets, +for example `internal/` or `single_arch/`. Their visibility is that macro's choice (private, package +default, or the caller's own), so read the macro instead of assuming. When an error names a target you cannot find in +any source file, a macro minted it: grep the suffix under `misc/bazel/`. ## Shared helpers @@ -74,16 +74,15 @@ Frequently-used pieces, so you load the existing one instead of rewriting it. Re | `//misc/bazel:csharp.bzl` | C# binary/library/test wrappers | | `//misc/bazel:utils.bzl` | `select_os`; prefer `os.bzl`'s `os_select` in new code | -[`defs.bzl`](../../../defs.bzl) at the root exports `codeql_platform` for *dependent* modules — nothing in this repo -loads it, and it is not the way to get the platform string here (use `os.bzl`). +[`defs.bzl`](../../../defs.bzl) at the root exports `codeql_platform` for *dependent* modules. It is not the way to get +the platform string here; use `os.bzl`. ## Platform selection -`codeql_platform_select` discriminates the four platforms CodeQL knows about: `linux64`, `linux_arm64`, `osx64`, -`win64`. `otherwise` supplies the value for whichever of those four you leave unset — it is **not** a -`//conditions:default`. **There is deliberately no fallback from `linux_arm64` to `linux64`**; if you only care about -the OS, use `os_select`, which gives Linux the same value on both architectures and has a `posix` shorthand for the -shared Linux/macOS value. +`codeql_platform_select` discriminates the platforms CodeQL knows about: `linux64`, `linux_arm64`, `osx64` and `win64`. +`otherwise` supplies the value for whichever of those you leave unset; it is **not** a `//conditions:default`. **There +is deliberately no fallback from `linux_arm64` to `linux64`.** If you only care about the OS, use `os_select`, which +gives Linux the same value on both architectures and has a `posix` shorthand for the shared Linux/macOS value. In a macro (no `ctx`) it returns a `select()`: @@ -102,7 +101,7 @@ codeql_pkg_files( ``` If implementation code needs to *branch* on the value rather than pass it through, pass `ctx` and add -`OS_DETECTION_ATTRS` to the rule's attributes — the value is then resolved eagerly instead of being an opaque `select()`: +`OS_DETECTION_ATTRS` to the rule's attributes. The value is then resolved eagerly instead of being an opaque `select()`: ```python load("//misc/bazel:os.bzl", "OS_DETECTION_ATTRS", "os_select") @@ -119,15 +118,15 @@ my_rule = rule( ## Packs -A pack is the unit that becomes an extractor pack. See [`unified/BUILD.bazel`](../../../unified/BUILD.bazel) for a -minimal complete example and [`pkg.bzl`](../../../misc/bazel/pkg.bzl) for the arguments. The non-obvious parts: +`codeql_pack` assembles the files that become an extractor pack. See [`unified/BUILD.bazel`](../../../unified/BUILD.bazel) +for a minimal complete example and [`pkg.bzl`](../../../misc/bazel/pkg.bzl) for the arguments. The non-obvious parts: * **`{CODEQL_PLATFORM}` in a destination path is the routing mechanism**, not just a substitution. A path containing it is *arch-specific* and lands in the per-architecture zip; every other path is *common*. So `prefix = "tools/{CODEQL_PLATFORM}"` both places the file and marks it arch-specific. `arch_overrides` forces named destinations into the arch-specific part without a placeholder. * **`codeql_pkg_files` splits `srcs` (plain) from `exes` (mode 755)** and **rejects `attributes =`** with an explicit - error — use `exes` rather than hand-rolling `pkg_attributes(mode = "755")`. + error. Use `exes` rather than hand-rolling `pkg_attributes(mode = "755")`. * **`pkg_dirs` and `pkg_symlinks` are unsupported** and fail at analysis time. * `codeql_pack` also generates an installer and an `install` alias, hence `bazel run //unified:install`. Pass `installer_alias = None` if one package defines several packs. @@ -137,23 +136,22 @@ minimal complete example and [`pkg.bzl`](../../../misc/bazel/pkg.bzl) for the ar In order of preference: -1. **A [Bazel Central Registry](https://registry.bazel.build/) module** — a `bazel_dep` in +1. **A [Bazel Central Registry](https://registry.bazel.build/) module.** Add a `bazel_dep` in [`MODULE.bazel`](../../../MODULE.bazel). -2. **A patched upstream module** — add it under - [`misc/bazel/registry`](../../../misc/bazel/registry), which `.bazelrc` puts ahead of the BCR. Put patches in - `modules///patches`, rename the version with a `-codeql.N` suffix, and run - [`fix.py`](../../../misc/bazel/registry/fix.py) to realign the metadata. -3. **A raw archive** — `http_archive` via `use_repo_rule`, or a repository rule. Copy an adjacent declaration and keep - its checksum field populated. - -Vendored Rust crates under [`misc/bazel/3rdparty`](../../../misc/bazel/3rdparty) are generated — regenerate with +2. **A patched upstream module.** Add it under [`misc/bazel/registry`](../../../misc/bazel/registry), which `.bazelrc` + puts ahead of the BCR. Put patches in `modules///patches`, rename the version with a `-codeql.N` + suffix, and run [`fix.py`](../../../misc/bazel/registry/fix.py) to realign the metadata. +3. **A raw archive.** Use `http_archive` via `use_repo_rule`, or a repository rule. Copy an adjacent declaration and + keep its checksum field populated. + +Vendored Rust crates under [`misc/bazel/3rdparty`](../../../misc/bazel/3rdparty) are generated. Regenerate with `update_cargo_deps.sh` rather than editing, and keep the `use_repo` lists in sync (`bazel mod tidy` handles several). ## Building standalone [`MODULE.bazel`](../../../MODULE.bazel) declares `semmle_code` with a `local_path_override` pointing at `..`, which -resolves when this repo is checked out inside the internal module. [`.bazelrc`](../../../.bazelrc) — read when Bazel is -invoked in *this* workspace — overrides that with a stub, and this line is the whole reason a standalone build resolves: +resolves when this repo is checked out inside the internal module. [`.bazelrc`](../../../.bazelrc), which Bazel reads +when invoked in *this* workspace, overrides that with a stub. This line is the whole reason a standalone build resolves: ``` common --override_module=semmle_code=%workspace%/misc/bazel/semmle_code_stub @@ -165,7 +163,7 @@ Do not change either the override path or the `local_path_override`; they work a versions of the internal helpers that shared `.bzl` files load *unconditionally*. That is its only job, and it is small enough to read. -**Extend the stub only when a `.bzl` file every standalone target loads gains a new internal `load()`** — that breaks +**Extend the stub only when a `.bzl` file every standalone target loads gains a new internal `load()`**, which breaks package loading outright, for everyone. Prefer not needing one. **Never add a stub so that an internal-only target appears to build**: some targets depend on internal libraries (`grep -rl @semmle_code --include=*.bazel` finds them) and are correctly unbuildable here. Unlike a `load()`, such a dependency only fails when that target is actually requested. From e3d3a7a89fb86b35f0113eb7479b59374f4625cd Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Thu, 17 Sep 2026 14:33:39 +0100 Subject: [PATCH 1101/2098] Don't add trailing blank line to dbscheme --- go/extractor/dbscheme/dbscheme.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/go/extractor/dbscheme/dbscheme.go b/go/extractor/dbscheme/dbscheme.go index 45aea39b4e54..66152eca49da 100644 --- a/go/extractor/dbscheme/dbscheme.go +++ b/go/extractor/dbscheme/dbscheme.go @@ -415,17 +415,19 @@ func AddDefaultSnippet(snippet string) bool { // PrintDbScheme prints the schema of this database to the writer `w` func PrintDbScheme(w io.Writer) { - fmt.Fprintf(w, "/** Auto-generated dbscheme; do not edit. Run `make gen` in directory `go/` to regenerate. */\n\n") + var b strings.Builder + fmt.Fprintf(&b, "/** Auto-generated dbscheme; do not edit. Run `make gen` in directory `go/` to regenerate. */\n\n") for _, snippet := range defaultSnippets { - fmt.Fprintf(w, "%s\n", snippet) + fmt.Fprintf(&b, "%s\n", snippet) } for _, table := range tables { - fmt.Fprintf(w, "%s\n\n", table.String()) + fmt.Fprintf(&b, "%s\n\n", table.String()) } for _, tp := range types { def := tp.def() if def != "" { - fmt.Fprintf(w, "%s\n\n", def) + fmt.Fprintf(&b, "%s\n\n", def) } } + fmt.Fprintln(w, strings.TrimRight(b.String(), "\n")) } From f32171fe16d29370e07d3c8aafa80aacd1493f46 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Wed, 16 Sep 2026 14:30:42 +0200 Subject: [PATCH 1102/2098] Unified: Extract built-in Swift types --- unified/BUILD.bazel | 15 +- unified/extractor/src/extractor.rs | 37 +++- unified/ql/lib/codeql/files/FileSystem.qll | 2 +- .../lib/codeql/unified/internal/Builtins.qll | 30 +++ .../unified/internal/ControlFlowGraph.qll | 4 +- .../lib/codeql/unified/internal/FacadeAst.qll | 3 + .../ql/test/library-tests/BasicTest/test.ql | 4 +- .../test/library-tests/comments/comments.ql | 2 +- .../test/library-tests/definitions/test.swift | 4 +- .../explicit-instance-field-access.swift | 4 +- unified/tools/BUILD.bazel | 1 - unified/tools/builtins/BUILD.bazel | 8 + unified/tools/builtins/types.swift | 207 ++++++++++++++++++ 13 files changed, 304 insertions(+), 17 deletions(-) create mode 100644 unified/ql/lib/codeql/unified/internal/Builtins.qll create mode 100644 unified/tools/builtins/BUILD.bazel create mode 100644 unified/tools/builtins/types.swift diff --git a/unified/BUILD.bazel b/unified/BUILD.bazel index 55bf87e8e38b..52f720f4cb12 100644 --- a/unified/BUILD.bazel +++ b/unified/BUILD.bazel @@ -45,7 +45,17 @@ codeql_pkg_files( otherwise = ["//unified/extractor"], win64 = ["//unified/extractor-unsupported-os:extractor"], ), - prefix = "tools/{CODEQL_PLATFORM}", + prefix = "{CODEQL_PLATFORM}", +) + +pkg_filegroup( + name = "tools", + srcs = [ + ":extractor-arch", + "//unified/tools", + "//unified/tools/builtins", + ], + prefix = "tools", ) codeql_pack( @@ -53,7 +63,6 @@ codeql_pack( srcs = [ ":codeql-extractor-yml", ":dbscheme-group", - ":extractor-arch", - "//unified/tools", + ":tools", ], ) diff --git a/unified/extractor/src/extractor.rs b/unified/extractor/src/extractor.rs index 82bfe81219b5..8c180c854d1f 100644 --- a/unified/extractor/src/extractor.rs +++ b/unified/extractor/src/extractor.rs @@ -1,10 +1,10 @@ -use clap::Args; -use std::path::PathBuf; - use crate::languages; +use clap::Args; use codeql_extractor::extractor::desugaring; use codeql_extractor::trap; - +use std::path::Path; +use std::path::PathBuf; +use std::{env, fs}; #[derive(Args)] pub struct Options { /// Sets a custom source archive folder @@ -31,6 +31,33 @@ pub fn run(options: Options) -> std::io::Result<()> { lang.prefix = "unified"; } + let scratch_dir = std::env::var("CODEQL_EXTRACTOR_UNIFIED_SCRATCH_DIR") + .expect("failed to read CODEQL_EXTRACTOR_UNIFIED_SCRATCH_DIR environment variable"); + let builtins_path = env::var("CODEQL_EXTRACTOR_UNIFIED_ROOT") + .map(|path| Path::new(&path).join("tools").join("builtins")) + .expect("failed to read CODEQL_EXTRACTOR_UNIFIED_ROOT environment variable"); + let builtins_dir = fs::read_dir(builtins_path).expect("failed to read builtins directory"); + let mut builtins_list = PathBuf::new(); + builtins_list.push(scratch_dir.clone()); + builtins_list.push("builtins"); + builtins_list.set_extension("list"); + + let mut builtins_list_file = fs::OpenOptions::new() + .create_new(true) + .write(true) + .open(&builtins_list) + .expect("failed to open file list"); + for entry in builtins_dir { + let entry = entry.expect("failed to read builtins directory"); + let path = entry.path(); + if path.extension().is_some_and(|ext| ext == "swift") { + use std::io::Write; + writeln!(builtins_list_file, "{}", path.display()) + .expect("failed to write to file list"); + } + } + drop(builtins_list_file); + let extractor = desugaring::Extractor { prefix: "unified".to_string(), languages, @@ -39,7 +66,7 @@ pub fn run(options: Options) -> std::io::Result<()> { "CODEQL_EXTRACTOR_UNIFIED_OPTION_TRAP_COMPRESSION", ), source_archive_dir: options.source_archive_dir, - file_lists: vec![options.file_list], + file_lists: vec![options.file_list, builtins_list], }; extractor.run() diff --git a/unified/ql/lib/codeql/files/FileSystem.qll b/unified/ql/lib/codeql/files/FileSystem.qll index 897a855612be..59c7900c550f 100644 --- a/unified/ql/lib/codeql/files/FileSystem.qll +++ b/unified/ql/lib/codeql/files/FileSystem.qll @@ -37,7 +37,7 @@ module Folder = Impl::Folder; /** A file. */ class File extends Container, Impl::File { /** Holds if this file was extracted from ordinary source code. */ - predicate fromSource() { any() } + predicate fromSource() { exists(this.getRelativePath()) } /** * Gets the number of lines containing code in this file. This value diff --git a/unified/ql/lib/codeql/unified/internal/Builtins.qll b/unified/ql/lib/codeql/unified/internal/Builtins.qll new file mode 100644 index 000000000000..099ced74d2bb --- /dev/null +++ b/unified/ql/lib/codeql/unified/internal/Builtins.qll @@ -0,0 +1,30 @@ +/** + * Provides classes for builtins. + */ + +private import unified + +/** The folder containing builtins. */ +class BuiltinsFolder extends Folder { + BuiltinsFolder() { + not exists(this.getRelativePath()) and + this.getBaseName() = "builtins" and + this.getParentContainer().getBaseName() = "tools" + } +} + +private class BuiltinsTypesFile extends File { + BuiltinsTypesFile() { + this.getBaseName() = "types.swift" and + this.getParentContainer() instanceof BuiltinsFolder + } +} + +/** + * A builtin type, such as `Bool` and `String`. + * + * Builtin types are represented as class-like declarations. + */ +class BuiltinClassLikeDeclaration extends ClassLikeDeclaration { + BuiltinClassLikeDeclaration() { this.getFile() instanceof BuiltinsTypesFile } +} diff --git a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll index 019722484d1a..1a5180c14db0 100644 --- a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll @@ -42,7 +42,9 @@ private module Ast implements AstSig { Callable getEnclosingCallable(AstNode node) { result = node.getEnclosingCallable() } - class Callable = U::Callable; + class Callable extends U::Callable { + Callable() { this.fromSource() } + } AstNode callableGetBody(Callable c) { result = c.getBody() } diff --git a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll index 54efc88a473d..7b431214294a 100644 --- a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll +++ b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll @@ -15,6 +15,9 @@ module Unified { /** Gets the file containing this AST node. */ File getFile() { result = this.getLocation().getFile() } + /** Holds if this AST node comes from ordinary source code. */ + predicate fromSource() { this.getFile().fromSource() } + /** Holds if this AST node has a modifier with the given text. */ predicate hasModifier(string text) { exists(Modifier mod | diff --git a/unified/ql/test/library-tests/BasicTest/test.ql b/unified/ql/test/library-tests/BasicTest/test.ql index fa3c26183b08..165cb1be9a0e 100644 --- a/unified/ql/test/library-tests/BasicTest/test.ql +++ b/unified/ql/test/library-tests/BasicTest/test.ql @@ -1,6 +1,8 @@ import unified -query predicate identifier(Identifier node, string value) { value = node.getValue() } +query predicate identifier(Identifier node, string value) { + node.fromSource() and value = node.getValue() +} query predicate namedPattern(NamedPattern node, string value) { value = node.getName() } diff --git a/unified/ql/test/library-tests/comments/comments.ql b/unified/ql/test/library-tests/comments/comments.ql index db64ff737a71..a17b318cff6e 100644 --- a/unified/ql/test/library-tests/comments/comments.ql +++ b/unified/ql/test/library-tests/comments/comments.ql @@ -1,3 +1,3 @@ import unified -query predicate comments(Comment c, string text) { text = c.getCommentText() } +query predicate comments(Comment c, string text) { c.fromSource() and text = c.getCommentText() } diff --git a/unified/ql/test/library-tests/definitions/test.swift b/unified/ql/test/library-tests/definitions/test.swift index 5bbbd59e21e8..d2597898f4f2 100644 --- a/unified/ql/test/library-tests/definitions/test.swift +++ b/unified/ql/test/library-tests/definitions/test.swift @@ -11,8 +11,8 @@ func test() { let local = 2 // name=local2 local // $ definition=local2 Derived.member // $ definition=Derived definition=Base.member - let _: Derived.Nested? // $ definition=Derived definition=Base.Nested + let _: Derived.Nested? // $ definition=Derived definition=Base.Nested definition=Optional } typealias Alias = Derived // $ definition=Derived -let _: Alias.Nested? // $ definition=Alias definition=Base.Nested +let _: Alias.Nested? // $ definition=Alias definition=Base.Nested definition=Optional diff --git a/unified/ql/test/library-tests/static-name-binding/explicit-instance-field-access.swift b/unified/ql/test/library-tests/static-name-binding/explicit-instance-field-access.swift index 42bf26038f17..a24ed7466903 100644 --- a/unified/ql/test/library-tests/static-name-binding/explicit-instance-field-access.swift +++ b/unified/ql/test/library-tests/static-name-binding/explicit-instance-field-access.swift @@ -15,7 +15,7 @@ private class A { return self.y // $ not handled by static name binding } - class func z() -> Int { // name=A.type.z + class func z() -> Int { // $ access=Int // name=A.type.z return 789 } @@ -37,7 +37,7 @@ private class B : A { // $ access=A return self.y // $ not handled by static name binding } - class func z() -> Int { // name=B.type.z + class func z() -> Int { // $ access=Int // name=B.type.z return 789 } diff --git a/unified/tools/BUILD.bazel b/unified/tools/BUILD.bazel index a4b4baed225c..103ded415c2d 100644 --- a/unified/tools/BUILD.bazel +++ b/unified/tools/BUILD.bazel @@ -6,6 +6,5 @@ codeql_pkg_files( "BUILD.bazel", ], exes = glob(["**/*"]), - prefix = "tools", visibility = ["//unified:__pkg__"], ) diff --git a/unified/tools/builtins/BUILD.bazel b/unified/tools/builtins/BUILD.bazel new file mode 100644 index 000000000000..666db59c0c12 --- /dev/null +++ b/unified/tools/builtins/BUILD.bazel @@ -0,0 +1,8 @@ +load("//misc/bazel:pkg.bzl", "codeql_pkg_files") + +codeql_pkg_files( + name = "builtins", + srcs = glob(["*.swift"]), + prefix = "builtins", + visibility = ["//unified:__subpackages__"], +) diff --git a/unified/tools/builtins/types.swift b/unified/tools/builtins/types.swift new file mode 100644 index 000000000000..7a7d2e0c8c6a --- /dev/null +++ b/unified/tools/builtins/types.swift @@ -0,0 +1,207 @@ +// Provides built-in Swift types + +struct Bool { } + +struct Int { } + +struct String { } + +struct Character { } + +struct Substring { } + +struct Int8 { } + +struct Int16 { } + +struct Int32 { } + +struct Int64 { } + +struct UInt { } + +struct UInt8 { } + +struct UInt16 { } + +struct UInt32 { } + +struct UInt64 { } + +struct Float16 { } + +struct Float { } + +struct Double { } + +struct Float80 { } + +struct Array { } + +struct Dictionary { } + +struct Set { } + +enum Optional { + case none + case some(Wrapped) +} + +enum Result { + case success(Success) + case failure(Failure) +} + +struct Range { } + +struct ClosedRange { } + +struct PartialRangeFrom { } + +struct PartialRangeThrough { } + +struct PartialRangeUpTo { } + +enum Never { } + +struct UnsafePointer { } + +struct UnsafeMutablePointer { } + +struct UnsafeRawPointer { } + +struct UnsafeMutableRawPointer { } + +struct UnsafeBufferPointer { } + +struct UnsafeMutableBufferPointer { } + +struct UnsafeRawBufferPointer { } + +struct UnsafeMutableRawBufferPointer { } + +struct AutoreleasingUnsafeMutablePointer { } + +struct OpaquePointer { } + +struct Unmanaged { } + +struct Function { } // `Args` is always instantiated as a tuple type + +typealias Void = Tuple0 + +struct Tuple0 {} + +struct Tuple1 { + var _0: T0 +} + +struct Tuple2 { + var _0: T0 + var _1: T1 +} + +struct Tuple3 { + var _0: T0 + var _1: T1 + var _2: T2 +} + +struct Tuple4 { + var _0: T0 + var _1: T1 + var _2: T2 + var _3: T3 +} + +struct Tuple5 { + var _0: T0 + var _1: T1 + var _2: T2 + var _3: T3 + var _4: T4 +} + +struct Tuple6 { + var _0: T0 + var _1: T1 + var _2: T2 + var _3: T3 + var _4: T4 + var _5: T5 +} + +struct Tuple7 { + var _0: T0 + var _1: T1 + var _2: T2 + var _3: T3 + var _4: T4 + var _5: T5 + var _6: T6 +} + +struct Tuple8 { + var _0: T0 + var _1: T1 + var _2: T2 + var _3: T3 + var _4: T4 + var _5: T5 + var _6: T6 + var _7: T7 +} + +struct Tuple9 { + var _0: T0 + var _1: T1 + var _2: T2 + var _3: T3 + var _4: T4 + var _5: T5 + var _6: T6 + var _7: T7 + var _8: T8 +} + +struct Tuple10 { + var _0: T0 + var _1: T1 + var _2: T2 + var _3: T3 + var _4: T4 + var _5: T5 + var _6: T6 + var _7: T7 + var _8: T8 + var _9: T9 +} + +struct Tuple11 { + var _0: T0 + var _1: T1 + var _2: T2 + var _3: T3 + var _4: T4 + var _5: T5 + var _6: T6 + var _7: T7 + var _8: T8 + var _9: T9 + var _10: T10 +} + +struct Tuple12 { + var _0: T0 + var _1: T1 + var _2: T2 + var _3: T3 + var _4: T4 + var _5: T5 + var _6: T6 + var _7: T7 + var _8: T8 + var _9: T9 + var _10: T10 + var _11: T11 +} From 465f0b5b835aa50d5a4872c3867ab28373918352 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Thu, 17 Sep 2026 15:45:11 +0200 Subject: [PATCH 1103/2098] Bazel skill: American English and traceable references Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .github/skills/bazel/SKILL.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/.github/skills/bazel/SKILL.md b/.github/skills/bazel/SKILL.md index 9e105bb475b6..dc30ce30c57f 100644 --- a/.github/skills/bazel/SKILL.md +++ b/.github/skills/bazel/SKILL.md @@ -6,7 +6,7 @@ description: Conventions for editing Bazel files in the github/codeql repository # Bazel in the codeql repository A bzlmod module named `ql`, repo name `@codeql` ([`MODULE.bazel`](../../../MODULE.bazel)). It builds standalone, and is -also consumed by an internal module that depends on it; standalone builds replace that module with a stub. +also consumed by an internal module; standalone builds replace that module with a stub. ## Traps @@ -24,10 +24,10 @@ Things that will waste your time or produce a wrong edit here. Read this section * **Do not stub your way out of a missing internal dependency.** See [Building standalone](#building-standalone) for the one narrow case where extending the stub is correct. -## Rules of thumb +## Conventions -* **Copy a neighbouring target rather than inventing a shape.** Packaging is not uniform: some packages use the - `codeql_*` wrappers, others still use `pkg_files` directly. Copy the closest *working* neighbour, and prefer the +* **Copy a neighboring target rather than inventing a shape.** Packaging is not uniform: some packages use the + `codeql_*` wrappers, others still use `pkg_files` directly. Copy the closest *working* neighbor, and prefer the wrapper for new code. * **Pin anything fetched over the network** with `sha256` or `integrity`. Bazel only *warns* on an unpinned download, so nothing fails loudly, but the build stops being reproducible and a retagged upstream release silently changes what you @@ -79,10 +79,11 @@ the platform string here; use `os.bzl`. ## Platform selection -`codeql_platform_select` discriminates the platforms CodeQL knows about: `linux64`, `linux_arm64`, `osx64` and `win64`. -`otherwise` supplies the value for whichever of those you leave unset; it is **not** a `//conditions:default`. **There -is deliberately no fallback from `linux_arm64` to `linux64`.** If you only care about the OS, use `os_select`, which -gives Linux the same value on both architectures and has a `posix` shorthand for the shared Linux/macOS value. +[`codeql_platform_select`](../../../misc/bazel/os.bzl) takes one keyword argument per CodeQL platform: `linux64`, +`linux_arm64`, `osx64` and `win64`. `otherwise` supplies the value for whichever of those you leave unset; it is **not** +a `//conditions:default`. **There is deliberately no fallback from `linux_arm64` to `linux64`.** If you only care about +the OS, use `os_select`, which gives Linux the same value on both architectures and has a `posix` shorthand for the +shared Linux/macOS value. In a macro (no `ctx`) it returns a `select()`: @@ -132,7 +133,7 @@ for a minimal complete example and [`pkg.bzl`](../../../misc/bazel/pkg.bzl) for `installer_alias = None` if one package defines several packs. * `codeql_pack_group` exists for bundling packs into distribution zips, but nothing in this repo instantiates it. -## Dependencies and `MODULE.bazel` +## Adding a dependency In order of preference: @@ -145,7 +146,8 @@ In order of preference: keep its checksum field populated. Vendored Rust crates under [`misc/bazel/3rdparty`](../../../misc/bazel/3rdparty) are generated. Regenerate with -`update_cargo_deps.sh` rather than editing, and keep the `use_repo` lists in sync (`bazel mod tidy` handles several). +[`update_cargo_deps.sh`](../../../misc/bazel/3rdparty/update_cargo_deps.sh) rather than editing, and keep the +`use_repo` lists in sync, which `bazel mod tidy` does for module extensions. ## Building standalone From 449e377da1e8f4f95c0b6e4f714df0c6096a46a2 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 17 Sep 2026 14:47:47 +0200 Subject: [PATCH 1104/2098] UnboundList: Use ASCII encoding instead of Unicode --- shared/util/codeql/util/UnboundList.qll | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/shared/util/codeql/util/UnboundList.qll b/shared/util/codeql/util/UnboundList.qll index e4104e06222c..dd92ff24ffcf 100644 --- a/shared/util/codeql/util/UnboundList.qll +++ b/shared/util/codeql/util/UnboundList.qll @@ -10,6 +10,7 @@ overlay[local?] module; private import Location +private import Strings /** Provides the input to `Make`. */ signature module InputSig { @@ -53,22 +54,25 @@ module Make Input> { int getRank(Element e) { e = DenseRank::denseRank(result) } pragma[nomagic] - private string interpretUnicodeCodePoint(int codePoint) { - codePoint = [0, getRank(_)] and - codePoint.toUnicode() = result and - result != "." // used as element separator + private string interpretAsciiCode(int code) { + exists(int dot, int c | + c = code + 1 and + // `.` is used as element separator, so cannot be used to encode elements + dot = asciiPrintable(".") and + if c < dot then c = asciiPrintable(result) else c + 1 = asciiPrintable(result) + ) } - private int unicodeCodePoints() { result = strictcount(interpretUnicodeCodePoint(_)) } + private int asciiCodes() { result = strictcount(interpretAsciiCode(_)) } - private int getUnicodeCodePointPart(Element e, int i) { + private int getAsciiCodePart(Element e, int i) { result = getRank(e) and i = 0 or exists(int mid | - mid = getUnicodeCodePointPart(e, i - 1) and + mid = getAsciiCodePart(e, i - 1) and mid > 0 and - result = mid / unicodeCodePoints() + result = mid / asciiCodes() ) } @@ -76,7 +80,7 @@ module Make Input> { private string encode(Element e) { result = strictconcat(string s, int i | - s = interpretUnicodeCodePoint(getUnicodeCodePointPart(e, i) % unicodeCodePoints()) + s = interpretAsciiCode(getAsciiCodePart(e, i) % asciiCodes()) | s order by i ) From 168d999f3a43c2d5760d884831d327dc96f4bb26 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 17 Sep 2026 16:22:51 +0000 Subject: [PATCH 1105/2098] Post-release preparation for codeql-cli-2.27.1 --- actions/ql/lib/qlpack.yml | 2 +- actions/ql/src/qlpack.yml | 2 +- cpp/ql/lib/qlpack.yml | 2 +- cpp/ql/src/qlpack.yml | 2 +- csharp/ql/campaigns/Solorigate/lib/qlpack.yml | 2 +- csharp/ql/campaigns/Solorigate/src/qlpack.yml | 2 +- csharp/ql/lib/qlpack.yml | 2 +- csharp/ql/src/qlpack.yml | 2 +- go/ql/consistency-queries/qlpack.yml | 2 +- go/ql/lib/qlpack.yml | 2 +- go/ql/src/qlpack.yml | 2 +- java/ql/lib/qlpack.yml | 2 +- java/ql/src/qlpack.yml | 2 +- javascript/ql/lib/qlpack.yml | 2 +- javascript/ql/src/qlpack.yml | 2 +- misc/suite-helpers/qlpack.yml | 2 +- python/ql/lib/qlpack.yml | 2 +- python/ql/src/qlpack.yml | 2 +- ruby/ql/lib/qlpack.yml | 2 +- ruby/ql/src/qlpack.yml | 2 +- rust/ql/lib/qlpack.yml | 2 +- rust/ql/src/qlpack.yml | 2 +- shared/concepts/qlpack.yml | 2 +- shared/controlflow/qlpack.yml | 2 +- shared/dataflow/qlpack.yml | 2 +- shared/mad/qlpack.yml | 2 +- shared/namebinding/qlpack.yml | 2 +- shared/quantum/qlpack.yml | 2 +- shared/rangeanalysis/qlpack.yml | 2 +- shared/regex/qlpack.yml | 2 +- shared/ssa/qlpack.yml | 2 +- shared/threat-models/qlpack.yml | 2 +- shared/tutorial/qlpack.yml | 2 +- shared/typeflow/qlpack.yml | 2 +- shared/typeinference/qlpack.yml | 2 +- shared/typetracking/qlpack.yml | 2 +- shared/typos/qlpack.yml | 2 +- shared/util/qlpack.yml | 2 +- shared/xml/qlpack.yml | 2 +- shared/yaml/qlpack.yml | 2 +- swift/ql/lib/qlpack.yml | 2 +- swift/ql/src/qlpack.yml | 2 +- 42 files changed, 42 insertions(+), 42 deletions(-) diff --git a/actions/ql/lib/qlpack.yml b/actions/ql/lib/qlpack.yml index f905941a9751..1d893939b4de 100644 --- a/actions/ql/lib/qlpack.yml +++ b/actions/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-all -version: 0.6.2 +version: 0.6.3-dev library: true warnOnImplicitThis: true dependencies: diff --git a/actions/ql/src/qlpack.yml b/actions/ql/src/qlpack.yml index 011ff8278576..1c40c671d161 100644 --- a/actions/ql/src/qlpack.yml +++ b/actions/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-queries -version: 0.6.36 +version: 0.6.37-dev library: false warnOnImplicitThis: true groups: [actions, queries] diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index bc08d146770d..c31bd8823c61 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-all -version: 12.1.1 +version: 12.1.2-dev groups: cpp dbscheme: semmlecode.cpp.dbscheme extractor: cpp diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml index a05ad83ab85f..163b7a780871 100644 --- a/cpp/ql/src/qlpack.yml +++ b/cpp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-queries -version: 1.9.0 +version: 1.9.1-dev groups: - cpp - queries diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml index d2f3ebb9bad8..4ba97f30926e 100644 --- a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-all -version: 1.7.75 +version: 1.7.76-dev groups: - csharp - solorigate diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml index 2a4bce7db26d..9883df480dac 100644 --- a/csharp/ql/campaigns/Solorigate/src/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-queries -version: 1.7.75 +version: 1.7.76-dev groups: - csharp - solorigate diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index 123af97b1c3c..f22aae2ac044 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-all -version: 7.3.1 +version: 7.3.2-dev groups: csharp dbscheme: semmlecode.csharp.dbscheme extractor: csharp diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml index c542cbc1d544..e9344f6a56ba 100644 --- a/csharp/ql/src/qlpack.yml +++ b/csharp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-queries -version: 1.10.0 +version: 1.10.1-dev groups: - csharp - queries diff --git a/go/ql/consistency-queries/qlpack.yml b/go/ql/consistency-queries/qlpack.yml index 3b17a07bcdb1..dfed59bbcf96 100644 --- a/go/ql/consistency-queries/qlpack.yml +++ b/go/ql/consistency-queries/qlpack.yml @@ -1,5 +1,5 @@ name: codeql-go-consistency-queries -version: 1.0.58 +version: 1.0.59-dev groups: - go - queries diff --git a/go/ql/lib/qlpack.yml b/go/ql/lib/qlpack.yml index 8546b3b5fb30..04ba746416ea 100644 --- a/go/ql/lib/qlpack.yml +++ b/go/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-all -version: 7.3.2 +version: 7.3.3-dev groups: go dbscheme: go.dbscheme extractor: go diff --git a/go/ql/src/qlpack.yml b/go/ql/src/qlpack.yml index 7c3209e893ed..a8fcfc1e0e70 100644 --- a/go/ql/src/qlpack.yml +++ b/go/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-queries -version: 1.6.11 +version: 1.6.12-dev groups: - go - queries diff --git a/java/ql/lib/qlpack.yml b/java/ql/lib/qlpack.yml index 97b7c12a129a..7e0612f1c4be 100644 --- a/java/ql/lib/qlpack.yml +++ b/java/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-all -version: 9.3.1 +version: 9.3.2-dev groups: java dbscheme: config/semmlecode.dbscheme extractor: java diff --git a/java/ql/src/qlpack.yml b/java/ql/src/qlpack.yml index 7c539eff1073..6fb144c64beb 100644 --- a/java/ql/src/qlpack.yml +++ b/java/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-queries -version: 1.11.11 +version: 1.11.12-dev groups: - java - queries diff --git a/javascript/ql/lib/qlpack.yml b/javascript/ql/lib/qlpack.yml index 4225a0507163..9bee0312fc08 100644 --- a/javascript/ql/lib/qlpack.yml +++ b/javascript/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-all -version: 2.10.2 +version: 2.10.3-dev groups: javascript dbscheme: semmlecode.javascript.dbscheme extractor: javascript diff --git a/javascript/ql/src/qlpack.yml b/javascript/ql/src/qlpack.yml index ea85a76b6555..ad2054ccf34d 100644 --- a/javascript/ql/src/qlpack.yml +++ b/javascript/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-queries -version: 2.4.6 +version: 2.4.7-dev groups: - javascript - queries diff --git a/misc/suite-helpers/qlpack.yml b/misc/suite-helpers/qlpack.yml index 7fea6fd1b738..b35dbc350a16 100644 --- a/misc/suite-helpers/qlpack.yml +++ b/misc/suite-helpers/qlpack.yml @@ -1,4 +1,4 @@ name: codeql/suite-helpers -version: 1.0.58 +version: 1.0.59-dev groups: shared warnOnImplicitThis: true diff --git a/python/ql/lib/qlpack.yml b/python/ql/lib/qlpack.yml index 5886bee214c5..aaebce61456d 100644 --- a/python/ql/lib/qlpack.yml +++ b/python/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-all -version: 7.2.6 +version: 7.2.7-dev groups: python dbscheme: semmlecode.python.dbscheme extractor: python diff --git a/python/ql/src/qlpack.yml b/python/ql/src/qlpack.yml index e275f6d43a3b..e4a0f47caa84 100644 --- a/python/ql/src/qlpack.yml +++ b/python/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-queries -version: 1.8.11 +version: 1.8.12-dev groups: - python - queries diff --git a/ruby/ql/lib/qlpack.yml b/ruby/ql/lib/qlpack.yml index d13d4ad9bdc1..64a7647ef6ba 100644 --- a/ruby/ql/lib/qlpack.yml +++ b/ruby/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-all -version: 7.0.1 +version: 7.0.2-dev groups: ruby extractor: ruby dbscheme: ruby.dbscheme diff --git a/ruby/ql/src/qlpack.yml b/ruby/ql/src/qlpack.yml index 991d8407aaed..6f55d5475ba3 100644 --- a/ruby/ql/src/qlpack.yml +++ b/ruby/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-queries -version: 1.6.11 +version: 1.6.12-dev groups: - ruby - queries diff --git a/rust/ql/lib/qlpack.yml b/rust/ql/lib/qlpack.yml index f86cc9282a17..92546703c681 100644 --- a/rust/ql/lib/qlpack.yml +++ b/rust/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rust-all -version: 0.2.22 +version: 0.2.23-dev groups: rust extractor: rust dbscheme: rust.dbscheme diff --git a/rust/ql/src/qlpack.yml b/rust/ql/src/qlpack.yml index 8b2b8f64ddfc..dc78b353f93b 100644 --- a/rust/ql/src/qlpack.yml +++ b/rust/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rust-queries -version: 0.1.43 +version: 0.1.44-dev groups: - rust - queries diff --git a/shared/concepts/qlpack.yml b/shared/concepts/qlpack.yml index a6b0b37a2570..ec6e6c832b27 100644 --- a/shared/concepts/qlpack.yml +++ b/shared/concepts/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/concepts -version: 0.0.32 +version: 0.0.33-dev groups: shared library: true dependencies: diff --git a/shared/controlflow/qlpack.yml b/shared/controlflow/qlpack.yml index 65726e011a97..3b023fe52bf3 100644 --- a/shared/controlflow/qlpack.yml +++ b/shared/controlflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/controlflow -version: 2.0.42 +version: 2.0.43-dev groups: shared library: true dependencies: diff --git a/shared/dataflow/qlpack.yml b/shared/dataflow/qlpack.yml index 4a2dc511d856..3cb2306bafbd 100644 --- a/shared/dataflow/qlpack.yml +++ b/shared/dataflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/dataflow -version: 2.1.14 +version: 2.1.15-dev groups: shared library: true dependencies: diff --git a/shared/mad/qlpack.yml b/shared/mad/qlpack.yml index 7bd39099c50a..ff07c6347d6c 100644 --- a/shared/mad/qlpack.yml +++ b/shared/mad/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/mad -version: 1.0.58 +version: 1.0.59-dev groups: shared library: true dependencies: diff --git a/shared/namebinding/qlpack.yml b/shared/namebinding/qlpack.yml index fc302f24e0af..aff022f2b397 100644 --- a/shared/namebinding/qlpack.yml +++ b/shared/namebinding/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/namebinding -version: 0.0.7 +version: 0.0.8-dev groups: shared library: true dependencies: diff --git a/shared/quantum/qlpack.yml b/shared/quantum/qlpack.yml index 501fb636d2f2..303cb1e976ac 100644 --- a/shared/quantum/qlpack.yml +++ b/shared/quantum/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/quantum -version: 0.0.36 +version: 0.0.37-dev groups: shared library: true dependencies: diff --git a/shared/rangeanalysis/qlpack.yml b/shared/rangeanalysis/qlpack.yml index 0d8901c3913e..1638c42c958a 100644 --- a/shared/rangeanalysis/qlpack.yml +++ b/shared/rangeanalysis/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rangeanalysis -version: 1.0.58 +version: 1.0.59-dev groups: shared library: true dependencies: diff --git a/shared/regex/qlpack.yml b/shared/regex/qlpack.yml index 812351e84752..814948230281 100644 --- a/shared/regex/qlpack.yml +++ b/shared/regex/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/regex -version: 1.0.58 +version: 1.0.59-dev groups: shared library: true dependencies: diff --git a/shared/ssa/qlpack.yml b/shared/ssa/qlpack.yml index 997dbcb032da..00e2631c83f4 100644 --- a/shared/ssa/qlpack.yml +++ b/shared/ssa/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ssa -version: 2.0.34 +version: 2.0.35-dev groups: shared library: true dependencies: diff --git a/shared/threat-models/qlpack.yml b/shared/threat-models/qlpack.yml index dc276731544a..59219ed81c7f 100644 --- a/shared/threat-models/qlpack.yml +++ b/shared/threat-models/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/threat-models -version: 1.0.58 +version: 1.0.59-dev library: true groups: shared dataExtensions: diff --git a/shared/tutorial/qlpack.yml b/shared/tutorial/qlpack.yml index d775e2d54869..e556d4851a65 100644 --- a/shared/tutorial/qlpack.yml +++ b/shared/tutorial/qlpack.yml @@ -1,7 +1,7 @@ name: codeql/tutorial description: Library for the CodeQL detective tutorials, helping new users learn to write CodeQL queries. -version: 1.0.58 +version: 1.0.59-dev groups: shared library: true warnOnImplicitThis: true diff --git a/shared/typeflow/qlpack.yml b/shared/typeflow/qlpack.yml index b3739dbc4509..342b96185672 100644 --- a/shared/typeflow/qlpack.yml +++ b/shared/typeflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeflow -version: 1.0.58 +version: 1.0.59-dev groups: shared library: true dependencies: diff --git a/shared/typeinference/qlpack.yml b/shared/typeinference/qlpack.yml index 68c5fd3592a9..0657bb89bb77 100644 --- a/shared/typeinference/qlpack.yml +++ b/shared/typeinference/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeinference -version: 0.0.39 +version: 0.0.40-dev groups: shared library: true dependencies: diff --git a/shared/typetracking/qlpack.yml b/shared/typetracking/qlpack.yml index 5fea2bfe4cc4..4e9b5a508ada 100644 --- a/shared/typetracking/qlpack.yml +++ b/shared/typetracking/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typetracking -version: 2.0.42 +version: 2.0.43-dev groups: shared library: true dependencies: diff --git a/shared/typos/qlpack.yml b/shared/typos/qlpack.yml index d1e99d6715ce..6cd98a8c4e37 100644 --- a/shared/typos/qlpack.yml +++ b/shared/typos/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typos -version: 1.0.58 +version: 1.0.59-dev groups: shared library: true warnOnImplicitThis: true diff --git a/shared/util/qlpack.yml b/shared/util/qlpack.yml index 724d3be90cf8..82846d4fdc85 100644 --- a/shared/util/qlpack.yml +++ b/shared/util/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/util -version: 2.0.45 +version: 2.0.46-dev groups: shared library: true dependencies: null diff --git a/shared/xml/qlpack.yml b/shared/xml/qlpack.yml index 58071916af45..42a40d0080b0 100644 --- a/shared/xml/qlpack.yml +++ b/shared/xml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/xml -version: 1.0.58 +version: 1.0.59-dev groups: shared library: true dependencies: diff --git a/shared/yaml/qlpack.yml b/shared/yaml/qlpack.yml index 175e338e8466..627ca453617a 100644 --- a/shared/yaml/qlpack.yml +++ b/shared/yaml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/yaml -version: 1.0.58 +version: 1.0.59-dev groups: shared library: true warnOnImplicitThis: true diff --git a/swift/ql/lib/qlpack.yml b/swift/ql/lib/qlpack.yml index 6a98e4ff8d25..c19e14034e66 100644 --- a/swift/ql/lib/qlpack.yml +++ b/swift/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-all -version: 6.8.4 +version: 6.8.5-dev groups: swift extractor: swift dbscheme: swift.dbscheme diff --git a/swift/ql/src/qlpack.yml b/swift/ql/src/qlpack.yml index d65ed75d46bf..c79db19ccabe 100644 --- a/swift/ql/src/qlpack.yml +++ b/swift/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-queries -version: 1.3.11 +version: 1.3.12-dev groups: - swift - queries From cf909e553a333e62f65ef222529f8e15f68d8d7f Mon Sep 17 00:00:00 2001 From: Chad Bentz <1760475+felickz@users.noreply.github.com> Date: Thu, 17 Sep 2026 14:15:11 -0400 Subject: [PATCH 1106/2098] Ruby: fix Grape request input kinds --- ruby/ql/lib/codeql/ruby/frameworks/Grape.qll | 8 ++--- .../frameworks/grape/Grape.expected | 22 ++++++------ .../library-tests/frameworks/grape/Grape.ql | 36 ++++++++++++++----- 3 files changed, 42 insertions(+), 24 deletions(-) diff --git a/ruby/ql/lib/codeql/ruby/frameworks/Grape.qll b/ruby/ql/lib/codeql/ruby/frameworks/Grape.qll index ff9439181265..b3d23e13dc84 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/Grape.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/Grape.qll @@ -224,7 +224,7 @@ module Grape { override string getSourceType() { result = "Grape::Request#body.read" } override Http::Server::RequestInputKind getKind() { - result = Http::Server::parameterInputKind() + result = Http::Server::bodyInputKind() } } @@ -241,7 +241,7 @@ module Grape { override string getSourceType() { result = "Grape::Request#body.string" } override Http::Server::RequestInputKind getKind() { - result = Http::Server::parameterInputKind() + result = Http::Server::bodyInputKind() } } @@ -288,7 +288,7 @@ module Grape { override string getSourceType() { result = "Grape::Request#POST" } override Http::Server::RequestInputKind getKind() { - result = Http::Server::parameterInputKind() + result = Http::Server::bodyInputKind() } } @@ -349,7 +349,7 @@ module Grape { override string getSourceType() { result = "Grape::Request#path_info" } override Http::Server::RequestInputKind getKind() { - result = Http::Server::parameterInputKind() + result = Http::Server::urlInputKind() } } diff --git a/ruby/ql/test/library-tests/frameworks/grape/Grape.expected b/ruby/ql/test/library-tests/frameworks/grape/Grape.expected index 8551596024fb..778eeb050849 100644 --- a/ruby/ql/test/library-tests/frameworks/grape/Grape.expected +++ b/ruby/ql/test/library-tests/frameworks/grape/Grape.expected @@ -76,22 +76,22 @@ grapeCookies | app.rb:160:5:162:7 | call to cookies | | app.rb:169:19:169:25 | call to cookies | grapeRequestBodyRead -| app.rb:25:12:25:28 | call to read | -| app.rb:170:21:170:37 | call to read | -| app.rb:247:17:247:33 | call to read | +| app.rb:25:12:25:28 | call to read | body | +| app.rb:170:21:170:37 | call to read | body | +| app.rb:247:17:247:33 | call to read | body | grapeRequestBodyString -| app.rb:252:17:252:35 | call to string | +| app.rb:252:17:252:35 | call to string | body | grapeRequestParams -| app.rb:257:19:257:32 | call to params | +| app.rb:257:19:257:32 | call to params | parameter | grapeRequestGet -| app.rb:262:18:262:28 | call to GET | +| app.rb:262:18:262:28 | call to GET | parameter | grapeRequestPost -| app.rb:267:19:267:30 | call to POST | +| app.rb:267:19:267:30 | call to POST | body | grapeRequestCookies -| app.rb:272:19:272:33 | call to cookies | +| app.rb:272:19:272:33 | call to cookies | cookie | grapeRequestEnv -| app.rb:277:16:277:26 | call to env | +| app.rb:277:16:277:26 | call to env | parameter | grapeRequestQueryString -| app.rb:282:10:282:29 | call to query_string | +| app.rb:282:10:282:29 | call to query_string | parameter | grapeRequestPathInfo -| app.rb:287:12:287:28 | call to path_info | +| app.rb:287:12:287:28 | call to path_info | url | diff --git a/ruby/ql/test/library-tests/frameworks/grape/Grape.ql b/ruby/ql/test/library-tests/frameworks/grape/Grape.ql index 09997b2c5b56..01d9b5095f53 100644 --- a/ruby/ql/test/library-tests/frameworks/grape/Grape.ql +++ b/ruby/ql/test/library-tests/frameworks/grape/Grape.ql @@ -23,20 +23,38 @@ query predicate grapeRouteParam(Grape::GrapeRouteParamSource routeParam) { any() query predicate grapeCookies(Grape::GrapeCookiesSource cookies) { any() } -query predicate grapeRequestBodyRead(Grape::GrapeRequestBodyReadSource src) { any() } +query predicate grapeRequestBodyRead(Grape::GrapeRequestBodyReadSource src, string kind) { + kind = src.getKind() +} -query predicate grapeRequestBodyString(Grape::GrapeRequestBodyStringSource src) { any() } +query predicate grapeRequestBodyString(Grape::GrapeRequestBodyStringSource src, string kind) { + kind = src.getKind() +} -query predicate grapeRequestParams(Grape::GrapeRequestParamsSource src) { any() } +query predicate grapeRequestParams(Grape::GrapeRequestParamsSource src, string kind) { + kind = src.getKind() +} -query predicate grapeRequestGet(Grape::GrapeRequestGetSource src) { any() } +query predicate grapeRequestGet(Grape::GrapeRequestGetSource src, string kind) { + kind = src.getKind() +} -query predicate grapeRequestPost(Grape::GrapeRequestPostSource src) { any() } +query predicate grapeRequestPost(Grape::GrapeRequestPostSource src, string kind) { + kind = src.getKind() +} -query predicate grapeRequestCookies(Grape::GrapeRequestCookiesSource src) { any() } +query predicate grapeRequestCookies(Grape::GrapeRequestCookiesSource src, string kind) { + kind = src.getKind() +} -query predicate grapeRequestEnv(Grape::GrapeRequestEnvSource src) { any() } +query predicate grapeRequestEnv(Grape::GrapeRequestEnvSource src, string kind) { + kind = src.getKind() +} -query predicate grapeRequestQueryString(Grape::GrapeRequestQueryStringSource src) { any() } +query predicate grapeRequestQueryString(Grape::GrapeRequestQueryStringSource src, string kind) { + kind = src.getKind() +} -query predicate grapeRequestPathInfo(Grape::GrapeRequestPathInfoSource src) { any() } +query predicate grapeRequestPathInfo(Grape::GrapeRequestPathInfoSource src, string kind) { + kind = src.getKind() +} From b681bc4eb222b6fbd6a157b45ae0121588654bde Mon Sep 17 00:00:00 2001 From: Tarek Date: Wed, 26 Aug 2026 23:53:37 -0400 Subject: [PATCH 1107/2098] cpp: Add 'cpp/mmio-unsanitized-memcpy' query --- .../CWE/CWE-120/MmioUnsanitizedMemcpy.qhelp | 35 ++++++++ .../CWE/CWE-120/MmioUnsanitizedMemcpy.ql | 84 +++++++++++++++++++ .../CWE/CWE-120/MmioUnsanitizedMemcpyBad.c | 9 ++ .../CWE/CWE-120/MmioUnsanitizedMemcpyGood.c | 10 +++ .../codeql-suites/cpp-security-extended.qls | 3 + .../MmioUnsanitizedMemcpy.expected | 22 +++++ .../MmioUnsanitizedMemcpy.qlref | 2 + .../CWE/CWE-120/MmioUnsanitizedMemcpy/test.c | 50 +++++++++++ 8 files changed, 215 insertions(+) create mode 100644 cpp/ql/src/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.qhelp create mode 100644 cpp/ql/src/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.ql create mode 100644 cpp/ql/src/Security/CWE/CWE-120/MmioUnsanitizedMemcpyBad.c create mode 100644 cpp/ql/src/Security/CWE/CWE-120/MmioUnsanitizedMemcpyGood.c create mode 100644 cpp/ql/test/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/MmioUnsanitizedMemcpy.expected create mode 100644 cpp/ql/test/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/MmioUnsanitizedMemcpy.qlref create mode 100644 cpp/ql/test/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/test.c diff --git a/cpp/ql/src/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.qhelp b/cpp/ql/src/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.qhelp new file mode 100644 index 000000000000..0b431d77cf53 --- /dev/null +++ b/cpp/ql/src/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.qhelp @@ -0,0 +1,35 @@ + + + +

    +Firmware and embedded drivers often copy data into buffers using lengths read from +memory-mapped I/O (MMIO) registers or DMA descriptor fields. When those lengths are not +validated against the destination buffer size, an attacker who can influence hardware +registers or DMA metadata can trigger buffer overflows and potentially achieve remote +code execution on microcontrollers, WiFi stacks, and cellular basebands. +

    +
    + +

    +Always validate MMIO/DMA-derived lengths before passing them to memcpy, +memmove, or strncpy. Compare against a compile-time maximum +and reject or clamp out-of-range values before copying. +

    +
    + +

    Bad: length from an MMIO register used directly as the copy size.

    + +

    Good: defensive bounds check before the copy.

    + +
    + +
  • +CWE-120: Buffer Copy without Checking Size of Input +
  • +
  • +CWE-787: Out-of-bounds Write +
  • +
    +
    diff --git a/cpp/ql/src/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.ql b/cpp/ql/src/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.ql new file mode 100644 index 000000000000..8d47e2fc939f --- /dev/null +++ b/cpp/ql/src/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.ql @@ -0,0 +1,84 @@ +/** + * @name MMIO/DMA unsanitized memory copy + * @description Memory copy sizes derived from memory-mapped I/O or DMA + * descriptor fields without bounds validation may overflow + * destination buffers. + * @kind path-problem + * @problem.severity error + * @security-severity 8.6 + * @precision medium + * @id cpp/mmio-unsanitized-memcpy + * @tags security + * external/cwe/cwe-120 + * external/cwe/cwe-787 + */ + +import cpp +import semmle.code.cpp.dataflow.new.TaintTracking +import semmle.code.cpp.controlflow.IRGuards +import MmioFlow::PathGraph + +/** Holds if `e` is an expression that reads MMIO/DMA hardware state. */ +predicate isMmioExpr(Expr e) { + exists(VariableAccess va | va = e and va.getTarget().isVolatile()) + or + exists(FieldAccess fa | fa = e and fa.getTarget().getType().isVolatile()) + or + exists(FunctionCall call | + call = e and + call.getTarget().hasName(["READ_REG", "GET_MMIO", "REG_READ", "DMA_READ"]) + ) + or + exists(PointerDereferenceExpr deref | + deref = e and + deref.getOperand().getUnspecifiedType() instanceof PointerType and + deref.getOperand().getUnspecifiedType().(PointerType).getBaseType().isVolatile() + ) +} + +predicate isMmioSource(DataFlow::Node source) { + isMmioExpr(source.asExpr()) + or + exists(MacroInvocation mi | + mi.getMacro().hasName(["READ_REG", "GET_MMIO", "REG_READ", "DMA_READ"]) and + source.asExpr() = mi.getExpr() + ) +} + +predicate isMemcpySizeSink(DataFlow::Node sink, FunctionCall fc) { + fc.getTarget().hasName(["memcpy", "memmove", "strncpy", "wmemcpy", "wmemmove"]) and + sink.asExpr() = fc.getArgument(2) +} + +/** Recognizes relational comparison bounds checks using public IRGuards API. */ +predicate lessThanOrEqual(IRGuardCondition g, Expr e, boolean branch) { + exists(Operand left | + g.comparesLt(left, _, _, true, branch) or + g.comparesEq(left, _, _, true, branch) + | + left.getDef().getConvertedResultExpression() = e + ) +} + +module MmioConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { isMmioSource(source) } + + predicate isSink(DataFlow::Node sink) { isMemcpySizeSink(sink, _) } + + predicate isBarrier(DataFlow::Node node) { + node = DataFlow::BarrierGuard::getABarrierNode() or + node = DataFlow::BarrierGuard::getAnIndirectBarrierNode() + } + + predicate observeDiffInformedIncrementalMode() { any() } +} + +module MmioFlow = TaintTracking::Global; + +from FunctionCall memcpyCall, MmioFlow::PathNode source, MmioFlow::PathNode sink +where + MmioFlow::flowPath(source, sink) and + isMemcpySizeSink(sink.getNode(), memcpyCall) +select memcpyCall, source, sink, + "Memory copy size argument is derived from $@ without sufficient bounds validation.", + source.getNode(), "an MMIO/DMA hardware register read" diff --git a/cpp/ql/src/Security/CWE/CWE-120/MmioUnsanitizedMemcpyBad.c b/cpp/ql/src/Security/CWE/CWE-120/MmioUnsanitizedMemcpyBad.c new file mode 100644 index 000000000000..13e68fc7561d --- /dev/null +++ b/cpp/ql/src/Security/CWE/CWE-120/MmioUnsanitizedMemcpyBad.c @@ -0,0 +1,9 @@ +#define READ_REG(addr) (*(volatile unsigned int *)(addr)) +#define MAX_DMA_LEN 64 + +void *memcpy(void *dest, const void *src, unsigned long n); + +void bad_mmio_memcpy(char *dst, char *src) { + unsigned int len = READ_REG(0x40001000); + memcpy(dst, src, len); +} diff --git a/cpp/ql/src/Security/CWE/CWE-120/MmioUnsanitizedMemcpyGood.c b/cpp/ql/src/Security/CWE/CWE-120/MmioUnsanitizedMemcpyGood.c new file mode 100644 index 000000000000..38c37a3f3c64 --- /dev/null +++ b/cpp/ql/src/Security/CWE/CWE-120/MmioUnsanitizedMemcpyGood.c @@ -0,0 +1,10 @@ +#define READ_REG(addr) (*(volatile unsigned int *)(addr)) +#define MAX_DMA_LEN 64 + +void *memcpy(void *dest, const void *src, unsigned long n); + +void good_mmio_memcpy(char *dst, char *src) { + unsigned int len = READ_REG(0x40001000); + if (len <= MAX_DMA_LEN) + memcpy(dst, src, len); +} diff --git a/cpp/ql/src/codeql-suites/cpp-security-extended.qls b/cpp/ql/src/codeql-suites/cpp-security-extended.qls index 69c014c4c6f8..6c992b3da313 100644 --- a/cpp/ql/src/codeql-suites/cpp-security-extended.qls +++ b/cpp/ql/src/codeql-suites/cpp-security-extended.qls @@ -3,3 +3,6 @@ - apply: security-extended-selectors.yml from: codeql/suite-helpers - apply: codeql-suites/exclude-slow-queries.yml +# CWE-120: MMIO/DMA unsanitized memcpy (also selected by metadata; explicit for review) +- include: + id: cpp/mmio-unsanitized-memcpy diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/MmioUnsanitizedMemcpy.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/MmioUnsanitizedMemcpy.expected new file mode 100644 index 000000000000..78511215ff39 --- /dev/null +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/MmioUnsanitizedMemcpy.expected @@ -0,0 +1,22 @@ +#select +| test.c:21:3:21:8 | call to memcpy | test.c:20:18:20:37 | * ... | test.c:21:20:21:22 | len | Memory copy size argument is derived from $@ without sufficient bounds validation. | test.c:20:18:20:37 | * ... | an MMIO/DMA hardware register read | +| test.c:26:3:26:9 | call to memmove | test.c:25:18:25:25 | call to GET_MMIO | test.c:26:21:26:23 | len | Memory copy size argument is derived from $@ without sufficient bounds validation. | test.c:25:18:25:25 | call to GET_MMIO | an MMIO/DMA hardware register read | +| test.c:31:3:31:9 | call to strncpy | test.c:30:18:30:29 | mmio_len_reg | test.c:31:21:31:23 | len | Memory copy size argument is derived from $@ without sufficient bounds validation. | test.c:30:18:30:29 | mmio_len_reg | an MMIO/DMA hardware register read | +edges +| test.c:20:18:20:37 | * ... | test.c:20:18:20:37 | * ... | provenance | | +| test.c:20:18:20:37 | * ... | test.c:21:20:21:22 | len | provenance | | +| test.c:25:18:25:25 | call to GET_MMIO | test.c:25:18:25:25 | call to GET_MMIO | provenance | | +| test.c:25:18:25:25 | call to GET_MMIO | test.c:26:21:26:23 | len | provenance | | +| test.c:30:18:30:29 | mmio_len_reg | test.c:30:18:30:29 | mmio_len_reg | provenance | | +| test.c:30:18:30:29 | mmio_len_reg | test.c:31:21:31:23 | len | provenance | | +nodes +| test.c:20:18:20:37 | * ... | semmle.label | * ... | +| test.c:20:18:20:37 | * ... | semmle.label | * ... | +| test.c:21:20:21:22 | len | semmle.label | len | +| test.c:25:18:25:25 | call to GET_MMIO | semmle.label | call to GET_MMIO | +| test.c:25:18:25:25 | call to GET_MMIO | semmle.label | call to GET_MMIO | +| test.c:26:21:26:23 | len | semmle.label | len | +| test.c:30:18:30:29 | mmio_len_reg | semmle.label | mmio_len_reg | +| test.c:30:18:30:29 | mmio_len_reg | semmle.label | mmio_len_reg | +| test.c:31:21:31:23 | len | semmle.label | len | +subpaths diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/MmioUnsanitizedMemcpy.qlref b/cpp/ql/test/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/MmioUnsanitizedMemcpy.qlref new file mode 100644 index 000000000000..e82093d33480 --- /dev/null +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/MmioUnsanitizedMemcpy.qlref @@ -0,0 +1,2 @@ +query: Security/CWE/CWE-120/MmioUnsanitizedMemcpy.ql +postprocess: utils/test/InlineExpectationsTestQuery.ql diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/test.c b/cpp/ql/test/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/test.c new file mode 100644 index 000000000000..01286d2a14b4 --- /dev/null +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/test.c @@ -0,0 +1,50 @@ +/* Semmle test case for MmioUnsanitizedMemcpy.ql + * MMIO/DMA register reads flowing into memcpy/memmove/strncpy size parameters. + */ + +typedef unsigned int uint32_t; + +void *memcpy(void *dest, const void *src, unsigned long n); +void *memmove(void *dest, const void *src, unsigned long n); +char *strncpy(char *dest, const char *src, unsigned long n); + +#define READ_REG(addr) (*(volatile uint32_t *)(addr)) +#define MAX_DMA_LEN 64 + +uint32_t GET_MMIO(unsigned long addr); +uint32_t DMA_READ(unsigned long addr); + +volatile uint32_t mmio_len_reg; + +static void bad_read_reg(char *dst, char *src) { + uint32_t len = READ_REG(0x40001000); // $ Source + memcpy(dst, src, len); // $ Alert +} + +static void bad_get_mmio(char *dst, char *src) { + uint32_t len = GET_MMIO(0x50000000); // $ Source + memmove(dst, src, len); // $ Alert +} + +static void bad_volatile_global(char *dst, char *src) { + uint32_t len = mmio_len_reg; // $ Source + strncpy(dst, src, len); // $ Alert +} + +static void good_bounded(char *dst, char *src) { + uint32_t len = READ_REG(0x40001000); + if (len <= MAX_DMA_LEN) + memcpy(dst, src, len); // GOOD +} + +static void good_early_return(char *dst, char *src) { + uint32_t len = DMA_READ(0x60000000); + if (len > MAX_DMA_LEN) + return; + memcpy(dst, src, len); // GOOD +} + +static void good_constant_size(char *dst, char *src) { + uint32_t len = READ_REG(0x40001000); + memcpy(dst, src, 32); // GOOD — constant size, not tainted sink +} From e20ec33e48cf9034a78aba1e2395399a7be33ba4 Mon Sep 17 00:00:00 2001 From: Tarek Date: Mon, 31 Aug 2026 11:34:04 -0400 Subject: [PATCH 1108/2098] cpp: Add change note for mmio-unsanitized-memcpy query --- cpp/ql/src/change-notes/2026-08-31-mmio-unsanitized-memcpy.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 cpp/ql/src/change-notes/2026-08-31-mmio-unsanitized-memcpy.md diff --git a/cpp/ql/src/change-notes/2026-08-31-mmio-unsanitized-memcpy.md b/cpp/ql/src/change-notes/2026-08-31-mmio-unsanitized-memcpy.md new file mode 100644 index 000000000000..e7b396a72345 --- /dev/null +++ b/cpp/ql/src/change-notes/2026-08-31-mmio-unsanitized-memcpy.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added a new query, `cpp/mmio-unsanitized-memcpy`, to detect memory copy operations whose size argument is derived from memory-mapped I/O or DMA hardware state without sufficient bounds validation. From 30544e867ba88a54dd32746cb95a13e22ec51048 Mon Sep 17 00:00:00 2001 From: Tarek Date: Wed, 2 Sep 2026 16:00:30 -0400 Subject: [PATCH 1109/2098] cpp: Move mmio-unsanitized-memcpy to experimental Relocate the query under experimental/, narrow sources to allowlisted MMIO register macros only, drop the security-extended suite include, and update tests and change notes for maintainer feedback on PR #22438. --- .gitignore | 3 + .../2026-08-31-mmio-unsanitized-memcpy.md | 2 +- .../codeql-suites/cpp-security-extended.qls | 3 - .../CWE/CWE-120/MmioUnsanitizedMemcpy.qhelp | 7 +- .../CWE/CWE-120/MmioUnsanitizedMemcpy.ql | 31 ++----- .../CWE/CWE-120/MmioUnsanitizedMemcpyBad.c | 0 .../CWE/CWE-120/MmioUnsanitizedMemcpyGood.c | 0 .../MmioUnsanitizedMemcpy.expected | 28 +++++++ .../MmioUnsanitizedMemcpy.qlref | 2 + .../CWE/CWE-120/MmioUnsanitizedMemcpy/test.c | 83 +++++++++++++++++++ .../MmioUnsanitizedMemcpy.expected | 22 ----- .../MmioUnsanitizedMemcpy.qlref | 2 - .../CWE/CWE-120/MmioUnsanitizedMemcpy/test.c | 50 ----------- 13 files changed, 126 insertions(+), 107 deletions(-) rename cpp/ql/src/{ => experimental}/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.qhelp (71%) rename cpp/ql/src/{ => experimental}/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.ql (68%) rename cpp/ql/src/{ => experimental}/Security/CWE/CWE-120/MmioUnsanitizedMemcpyBad.c (100%) rename cpp/ql/src/{ => experimental}/Security/CWE/CWE-120/MmioUnsanitizedMemcpyGood.c (100%) create mode 100644 cpp/ql/test/experimental/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/MmioUnsanitizedMemcpy.expected create mode 100644 cpp/ql/test/experimental/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/MmioUnsanitizedMemcpy.qlref create mode 100644 cpp/ql/test/experimental/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/test.c delete mode 100644 cpp/ql/test/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/MmioUnsanitizedMemcpy.expected delete mode 100644 cpp/ql/test/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/MmioUnsanitizedMemcpy.qlref delete mode 100644 cpp/ql/test/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/test.c diff --git a/.gitignore b/.gitignore index 4dbe45b8d28a..d6b0edfe2516 100644 --- a/.gitignore +++ b/.gitignore @@ -79,3 +79,6 @@ node_modules/ # Mergetool files *.orig + +# Local CodeQL harness database cache (veraptos TP/TN validation) +codeql_harness_dbs/ diff --git a/cpp/ql/src/change-notes/2026-08-31-mmio-unsanitized-memcpy.md b/cpp/ql/src/change-notes/2026-08-31-mmio-unsanitized-memcpy.md index e7b396a72345..3a96eb5d6a60 100644 --- a/cpp/ql/src/change-notes/2026-08-31-mmio-unsanitized-memcpy.md +++ b/cpp/ql/src/change-notes/2026-08-31-mmio-unsanitized-memcpy.md @@ -1,4 +1,4 @@ --- category: minorAnalysis --- -* Added a new query, `cpp/mmio-unsanitized-memcpy`, to detect memory copy operations whose size argument is derived from memory-mapped I/O or DMA hardware state without sufficient bounds validation. +* Added a new experimental query, `cpp/experimental/mmio-unsanitized-memcpy`, to detect memory copy operations whose size argument is derived from allowlisted MMIO/DMA register-read macros without sufficient bounds validation. diff --git a/cpp/ql/src/codeql-suites/cpp-security-extended.qls b/cpp/ql/src/codeql-suites/cpp-security-extended.qls index 6c992b3da313..69c014c4c6f8 100644 --- a/cpp/ql/src/codeql-suites/cpp-security-extended.qls +++ b/cpp/ql/src/codeql-suites/cpp-security-extended.qls @@ -3,6 +3,3 @@ - apply: security-extended-selectors.yml from: codeql/suite-helpers - apply: codeql-suites/exclude-slow-queries.yml -# CWE-120: MMIO/DMA unsanitized memcpy (also selected by metadata; explicit for review) -- include: - id: cpp/mmio-unsanitized-memcpy diff --git a/cpp/ql/src/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.qhelp b/cpp/ql/src/experimental/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.qhelp similarity index 71% rename from cpp/ql/src/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.qhelp rename to cpp/ql/src/experimental/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.qhelp index 0b431d77cf53..c89496bb1745 100644 --- a/cpp/ql/src/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.qhelp +++ b/cpp/ql/src/experimental/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.qhelp @@ -5,10 +5,9 @@

    Firmware and embedded drivers often copy data into buffers using lengths read from -memory-mapped I/O (MMIO) registers or DMA descriptor fields. When those lengths are not -validated against the destination buffer size, an attacker who can influence hardware -registers or DMA metadata can trigger buffer overflows and potentially achieve remote -code execution on microcontrollers, WiFi stacks, and cellular basebands. +allowlisted MMIO register macros such as READ_REG or GET_MMIO. +When those lengths are not validated against the destination buffer size, an attacker who +can influence hardware registers or DMA metadata can trigger buffer overflows.

    diff --git a/cpp/ql/src/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.ql b/cpp/ql/src/experimental/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.ql similarity index 68% rename from cpp/ql/src/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.ql rename to cpp/ql/src/experimental/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.ql index 8d47e2fc939f..17f2a339e553 100644 --- a/cpp/ql/src/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.ql +++ b/cpp/ql/src/experimental/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.ql @@ -1,14 +1,14 @@ /** * @name MMIO/DMA unsanitized memory copy - * @description Memory copy sizes derived from memory-mapped I/O or DMA - * descriptor fields without bounds validation may overflow - * destination buffers. + * @description Memory copy sizes derived from allowlisted MMIO/DMA register-read + * macros without bounds validation may overflow destination buffers. * @kind path-problem * @problem.severity error * @security-severity 8.6 - * @precision medium - * @id cpp/mmio-unsanitized-memcpy + * @precision low + * @id cpp/experimental/mmio-unsanitized-memcpy * @tags security + * experimental * external/cwe/cwe-120 * external/cwe/cwe-787 */ @@ -18,27 +18,8 @@ import semmle.code.cpp.dataflow.new.TaintTracking import semmle.code.cpp.controlflow.IRGuards import MmioFlow::PathGraph -/** Holds if `e` is an expression that reads MMIO/DMA hardware state. */ -predicate isMmioExpr(Expr e) { - exists(VariableAccess va | va = e and va.getTarget().isVolatile()) - or - exists(FieldAccess fa | fa = e and fa.getTarget().getType().isVolatile()) - or - exists(FunctionCall call | - call = e and - call.getTarget().hasName(["READ_REG", "GET_MMIO", "REG_READ", "DMA_READ"]) - ) - or - exists(PointerDereferenceExpr deref | - deref = e and - deref.getOperand().getUnspecifiedType() instanceof PointerType and - deref.getOperand().getUnspecifiedType().(PointerType).getBaseType().isVolatile() - ) -} - +/** Holds if `source` reads MMIO/DMA state through an allowlisted register macro. */ predicate isMmioSource(DataFlow::Node source) { - isMmioExpr(source.asExpr()) - or exists(MacroInvocation mi | mi.getMacro().hasName(["READ_REG", "GET_MMIO", "REG_READ", "DMA_READ"]) and source.asExpr() = mi.getExpr() diff --git a/cpp/ql/src/Security/CWE/CWE-120/MmioUnsanitizedMemcpyBad.c b/cpp/ql/src/experimental/Security/CWE/CWE-120/MmioUnsanitizedMemcpyBad.c similarity index 100% rename from cpp/ql/src/Security/CWE/CWE-120/MmioUnsanitizedMemcpyBad.c rename to cpp/ql/src/experimental/Security/CWE/CWE-120/MmioUnsanitizedMemcpyBad.c diff --git a/cpp/ql/src/Security/CWE/CWE-120/MmioUnsanitizedMemcpyGood.c b/cpp/ql/src/experimental/Security/CWE/CWE-120/MmioUnsanitizedMemcpyGood.c similarity index 100% rename from cpp/ql/src/Security/CWE/CWE-120/MmioUnsanitizedMemcpyGood.c rename to cpp/ql/src/experimental/Security/CWE/CWE-120/MmioUnsanitizedMemcpyGood.c diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/MmioUnsanitizedMemcpy.expected b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/MmioUnsanitizedMemcpy.expected new file mode 100644 index 000000000000..39cd12d18aa4 --- /dev/null +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/MmioUnsanitizedMemcpy.expected @@ -0,0 +1,28 @@ +#select +| test.c:26:3:26:8 | call to memcpy | test.c:25:18:25:37 | * ... | test.c:26:20:26:22 | len | Memory copy size argument is derived from $@ without sufficient bounds validation. | test.c:25:18:25:37 | * ... | an MMIO/DMA hardware register read | +| test.c:31:3:31:9 | call to memmove | test.c:30:18:30:37 | * ... | test.c:31:21:31:23 | len | Memory copy size argument is derived from $@ without sufficient bounds validation. | test.c:30:18:30:37 | * ... | an MMIO/DMA hardware register read | +| test.c:36:3:36:9 | call to strncpy | test.c:35:18:35:37 | * ... | test.c:36:21:36:23 | len | Memory copy size argument is derived from $@ without sufficient bounds validation. | test.c:35:18:35:37 | * ... | an MMIO/DMA hardware register read | +| test.c:41:3:41:8 | call to memcpy | test.c:40:18:40:37 | * ... | test.c:41:20:41:22 | len | Memory copy size argument is derived from $@ without sufficient bounds validation. | test.c:40:18:40:37 | * ... | an MMIO/DMA hardware register read | +edges +| test.c:25:18:25:37 | * ... | test.c:25:18:25:37 | * ... | provenance | | +| test.c:25:18:25:37 | * ... | test.c:26:20:26:22 | len | provenance | | +| test.c:30:18:30:37 | * ... | test.c:30:18:30:37 | * ... | provenance | | +| test.c:30:18:30:37 | * ... | test.c:31:21:31:23 | len | provenance | | +| test.c:35:18:35:37 | * ... | test.c:35:18:35:37 | * ... | provenance | | +| test.c:35:18:35:37 | * ... | test.c:36:21:36:23 | len | provenance | | +| test.c:40:18:40:37 | * ... | test.c:40:18:40:37 | * ... | provenance | | +| test.c:40:18:40:37 | * ... | test.c:41:20:41:22 | len | provenance | | +nodes +| test.c:25:18:25:37 | * ... | semmle.label | * ... | +| test.c:25:18:25:37 | * ... | semmle.label | * ... | +| test.c:26:20:26:22 | len | semmle.label | len | +| test.c:30:18:30:37 | * ... | semmle.label | * ... | +| test.c:30:18:30:37 | * ... | semmle.label | * ... | +| test.c:31:21:31:23 | len | semmle.label | len | +| test.c:35:18:35:37 | * ... | semmle.label | * ... | +| test.c:35:18:35:37 | * ... | semmle.label | * ... | +| test.c:36:21:36:23 | len | semmle.label | len | +| test.c:40:18:40:37 | * ... | semmle.label | * ... | +| test.c:40:18:40:37 | * ... | semmle.label | * ... | +| test.c:41:20:41:22 | len | semmle.label | len | +subpaths diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/MmioUnsanitizedMemcpy.qlref b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/MmioUnsanitizedMemcpy.qlref new file mode 100644 index 000000000000..671ab2524272 --- /dev/null +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/MmioUnsanitizedMemcpy.qlref @@ -0,0 +1,2 @@ +query: experimental/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.ql +postprocess: utils/test/InlineExpectationsTestQuery.ql diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/test.c b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/test.c new file mode 100644 index 000000000000..863894a552f7 --- /dev/null +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/test.c @@ -0,0 +1,83 @@ +/* Semmle test case for MmioUnsanitizedMemcpy.ql + * Allowlisted MMIO/DMA register macros flowing into memcpy/memmove/strncpy size parameters. + */ + +typedef unsigned int uint32_t; + +void *memcpy(void *dest, const void *src, unsigned long n); +void *memmove(void *dest, const void *src, unsigned long n); +char *strncpy(char *dest, const char *src, unsigned long n); + +#define READ_REG(addr) (*(volatile uint32_t *)(addr)) +#define GET_MMIO(addr) (*(volatile uint32_t *)(addr)) +#define REG_READ(addr) (*(volatile uint32_t *)(addr)) +#define DMA_READ(addr) (*(volatile uint32_t *)(addr)) +#define MAX_DMA_LEN 64 + +struct VolatileField { + volatile uint32_t len; +}; + +volatile uint32_t mmio_len_reg; +struct VolatileField vf; + +static void bad_read_reg(char *dst, char *src) { + uint32_t len = READ_REG(0x40001000); // $ Source + memcpy(dst, src, len); // $ Alert +} + +static void bad_get_mmio(char *dst, char *src) { + uint32_t len = GET_MMIO(0x50000000); // $ Source + memmove(dst, src, len); // $ Alert +} + +static void bad_reg_read(char *dst, char *src) { + uint32_t len = REG_READ(0x51000000); // $ Source + strncpy(dst, src, len); // $ Alert +} + +static void bad_dma_read(char *dst, char *src) { + uint32_t len = DMA_READ(0x60000000); // $ Source + memcpy(dst, src, len); // $ Alert +} + +static void good_bounded(char *dst, char *src) { + uint32_t len = READ_REG(0x40001000); + if (len <= MAX_DMA_LEN) + memcpy(dst, src, len); // GOOD +} + +static void good_early_return(char *dst, char *src) { + uint32_t len = DMA_READ(0x60000000); + if (len > MAX_DMA_LEN) + return; + memcpy(dst, src, len); // GOOD +} + +static void good_constant_size(char *dst, char *src) { + uint32_t len = READ_REG(0x40001000); + memcpy(dst, src, 32); // GOOD — constant size, not tainted sink +} + +static void negative_volatile_global(char *dst, char *src) { + uint32_t len = mmio_len_reg; + memcpy(dst, src, len); // GOOD +} + +static void negative_volatile_field(char *dst, char *src) { + uint32_t len = vf.len; + memcpy(dst, src, len); // GOOD +} + +static void negative_volatile_deref(char *dst, char *src) { + volatile uint32_t *reg = (volatile uint32_t *)0x40001000; + uint32_t len = *reg; + memcpy(dst, src, len); // GOOD +} + +static uint32_t GET_MMIO_fn(unsigned long addr); + +static void negative_get_mmio_function(char *dst, char *src) { + uint32_t len = GET_MMIO_fn(0x50000000); + memcpy(dst, src, len); // GOOD +} diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/MmioUnsanitizedMemcpy.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/MmioUnsanitizedMemcpy.expected deleted file mode 100644 index 78511215ff39..000000000000 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/MmioUnsanitizedMemcpy.expected +++ /dev/null @@ -1,22 +0,0 @@ -#select -| test.c:21:3:21:8 | call to memcpy | test.c:20:18:20:37 | * ... | test.c:21:20:21:22 | len | Memory copy size argument is derived from $@ without sufficient bounds validation. | test.c:20:18:20:37 | * ... | an MMIO/DMA hardware register read | -| test.c:26:3:26:9 | call to memmove | test.c:25:18:25:25 | call to GET_MMIO | test.c:26:21:26:23 | len | Memory copy size argument is derived from $@ without sufficient bounds validation. | test.c:25:18:25:25 | call to GET_MMIO | an MMIO/DMA hardware register read | -| test.c:31:3:31:9 | call to strncpy | test.c:30:18:30:29 | mmio_len_reg | test.c:31:21:31:23 | len | Memory copy size argument is derived from $@ without sufficient bounds validation. | test.c:30:18:30:29 | mmio_len_reg | an MMIO/DMA hardware register read | -edges -| test.c:20:18:20:37 | * ... | test.c:20:18:20:37 | * ... | provenance | | -| test.c:20:18:20:37 | * ... | test.c:21:20:21:22 | len | provenance | | -| test.c:25:18:25:25 | call to GET_MMIO | test.c:25:18:25:25 | call to GET_MMIO | provenance | | -| test.c:25:18:25:25 | call to GET_MMIO | test.c:26:21:26:23 | len | provenance | | -| test.c:30:18:30:29 | mmio_len_reg | test.c:30:18:30:29 | mmio_len_reg | provenance | | -| test.c:30:18:30:29 | mmio_len_reg | test.c:31:21:31:23 | len | provenance | | -nodes -| test.c:20:18:20:37 | * ... | semmle.label | * ... | -| test.c:20:18:20:37 | * ... | semmle.label | * ... | -| test.c:21:20:21:22 | len | semmle.label | len | -| test.c:25:18:25:25 | call to GET_MMIO | semmle.label | call to GET_MMIO | -| test.c:25:18:25:25 | call to GET_MMIO | semmle.label | call to GET_MMIO | -| test.c:26:21:26:23 | len | semmle.label | len | -| test.c:30:18:30:29 | mmio_len_reg | semmle.label | mmio_len_reg | -| test.c:30:18:30:29 | mmio_len_reg | semmle.label | mmio_len_reg | -| test.c:31:21:31:23 | len | semmle.label | len | -subpaths diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/MmioUnsanitizedMemcpy.qlref b/cpp/ql/test/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/MmioUnsanitizedMemcpy.qlref deleted file mode 100644 index e82093d33480..000000000000 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/MmioUnsanitizedMemcpy.qlref +++ /dev/null @@ -1,2 +0,0 @@ -query: Security/CWE/CWE-120/MmioUnsanitizedMemcpy.ql -postprocess: utils/test/InlineExpectationsTestQuery.ql diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/test.c b/cpp/ql/test/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/test.c deleted file mode 100644 index 01286d2a14b4..000000000000 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/test.c +++ /dev/null @@ -1,50 +0,0 @@ -/* Semmle test case for MmioUnsanitizedMemcpy.ql - * MMIO/DMA register reads flowing into memcpy/memmove/strncpy size parameters. - */ - -typedef unsigned int uint32_t; - -void *memcpy(void *dest, const void *src, unsigned long n); -void *memmove(void *dest, const void *src, unsigned long n); -char *strncpy(char *dest, const char *src, unsigned long n); - -#define READ_REG(addr) (*(volatile uint32_t *)(addr)) -#define MAX_DMA_LEN 64 - -uint32_t GET_MMIO(unsigned long addr); -uint32_t DMA_READ(unsigned long addr); - -volatile uint32_t mmio_len_reg; - -static void bad_read_reg(char *dst, char *src) { - uint32_t len = READ_REG(0x40001000); // $ Source - memcpy(dst, src, len); // $ Alert -} - -static void bad_get_mmio(char *dst, char *src) { - uint32_t len = GET_MMIO(0x50000000); // $ Source - memmove(dst, src, len); // $ Alert -} - -static void bad_volatile_global(char *dst, char *src) { - uint32_t len = mmio_len_reg; // $ Source - strncpy(dst, src, len); // $ Alert -} - -static void good_bounded(char *dst, char *src) { - uint32_t len = READ_REG(0x40001000); - if (len <= MAX_DMA_LEN) - memcpy(dst, src, len); // GOOD -} - -static void good_early_return(char *dst, char *src) { - uint32_t len = DMA_READ(0x60000000); - if (len > MAX_DMA_LEN) - return; - memcpy(dst, src, len); // GOOD -} - -static void good_constant_size(char *dst, char *src) { - uint32_t len = READ_REG(0x40001000); - memcpy(dst, src, 32); // GOOD — constant size, not tainted sink -} From 56c5f3ab14b129ed32b604679b3ba900834436ef Mon Sep 17 00:00:00 2001 From: Tarek Date: Wed, 2 Sep 2026 20:51:39 -0400 Subject: [PATCH 1110/2098] cpp: Drop experimental query id prefix and change note --- .gitignore | 3 --- cpp/ql/src/change-notes/2026-08-31-mmio-unsanitized-memcpy.md | 4 ---- .../Security/CWE/CWE-120/MmioUnsanitizedMemcpy.ql | 3 +-- 3 files changed, 1 insertion(+), 9 deletions(-) delete mode 100644 cpp/ql/src/change-notes/2026-08-31-mmio-unsanitized-memcpy.md diff --git a/.gitignore b/.gitignore index d6b0edfe2516..4dbe45b8d28a 100644 --- a/.gitignore +++ b/.gitignore @@ -79,6 +79,3 @@ node_modules/ # Mergetool files *.orig - -# Local CodeQL harness database cache (veraptos TP/TN validation) -codeql_harness_dbs/ diff --git a/cpp/ql/src/change-notes/2026-08-31-mmio-unsanitized-memcpy.md b/cpp/ql/src/change-notes/2026-08-31-mmio-unsanitized-memcpy.md deleted file mode 100644 index 3a96eb5d6a60..000000000000 --- a/cpp/ql/src/change-notes/2026-08-31-mmio-unsanitized-memcpy.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added a new experimental query, `cpp/experimental/mmio-unsanitized-memcpy`, to detect memory copy operations whose size argument is derived from allowlisted MMIO/DMA register-read macros without sufficient bounds validation. diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.ql b/cpp/ql/src/experimental/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.ql index 17f2a339e553..d48796c62338 100644 --- a/cpp/ql/src/experimental/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.ql +++ b/cpp/ql/src/experimental/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.ql @@ -4,9 +4,8 @@ * macros without bounds validation may overflow destination buffers. * @kind path-problem * @problem.severity error - * @security-severity 8.6 * @precision low - * @id cpp/experimental/mmio-unsanitized-memcpy + * @id cpp/mmio-unsanitized-memcpy * @tags security * experimental * external/cwe/cwe-120 From 5d6e2d421c665353cbf2a36fd66174075ce90871 Mon Sep 17 00:00:00 2001 From: Tarek Date: Thu, 3 Sep 2026 21:01:30 -0400 Subject: [PATCH 1111/2098] cpp: fix alert location and update integration test expectations --- .../query-suite/not_included_in_qls.expected | 1 + .../Security/CWE/CWE-120/MmioUnsanitizedMemcpy.ql | 2 +- .../MmioUnsanitizedMemcpy/MmioUnsanitizedMemcpy.expected | 8 ++++---- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/cpp/ql/integration-tests/query-suite/not_included_in_qls.expected b/cpp/ql/integration-tests/query-suite/not_included_in_qls.expected index 20ffa7c40c0d..70affad11648 100644 --- a/cpp/ql/integration-tests/query-suite/not_included_in_qls.expected +++ b/cpp/ql/integration-tests/query-suite/not_included_in_qls.expected @@ -242,6 +242,7 @@ ql/cpp/ql/src/experimental/Security/CWE/CWE-078/WordexpTainted.ql ql/cpp/ql/src/experimental/Security/CWE/CWE-1041/FindWrapperFunctions.ql ql/cpp/ql/src/experimental/Security/CWE/CWE-1126/DeclarationOfVariableWithUnnecessarilyWideScope.ql ql/cpp/ql/src/experimental/Security/CWE/CWE-120/MemoryUnsafeFunctionScan.ql +ql/cpp/ql/src/experimental/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.ql ql/cpp/ql/src/experimental/Security/CWE/CWE-1240/CustomCryptographicPrimitive.ql ql/cpp/ql/src/experimental/Security/CWE/CWE-125/DangerousWorksWithMultibyteOrWideCharacters.ql ql/cpp/ql/src/experimental/Security/CWE/CWE-190/AllocMultiplicationOverflow.ql diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.ql b/cpp/ql/src/experimental/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.ql index d48796c62338..67a0c98e2db4 100644 --- a/cpp/ql/src/experimental/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.ql +++ b/cpp/ql/src/experimental/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.ql @@ -59,6 +59,6 @@ from FunctionCall memcpyCall, MmioFlow::PathNode source, MmioFlow::PathNode sink where MmioFlow::flowPath(source, sink) and isMemcpySizeSink(sink.getNode(), memcpyCall) -select memcpyCall, source, sink, +select sink.getNode(), source, sink, "Memory copy size argument is derived from $@ without sufficient bounds validation.", source.getNode(), "an MMIO/DMA hardware register read" diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/MmioUnsanitizedMemcpy.expected b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/MmioUnsanitizedMemcpy.expected index 39cd12d18aa4..322b2ef7c419 100644 --- a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/MmioUnsanitizedMemcpy.expected +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/MmioUnsanitizedMemcpy.expected @@ -1,8 +1,8 @@ #select -| test.c:26:3:26:8 | call to memcpy | test.c:25:18:25:37 | * ... | test.c:26:20:26:22 | len | Memory copy size argument is derived from $@ without sufficient bounds validation. | test.c:25:18:25:37 | * ... | an MMIO/DMA hardware register read | -| test.c:31:3:31:9 | call to memmove | test.c:30:18:30:37 | * ... | test.c:31:21:31:23 | len | Memory copy size argument is derived from $@ without sufficient bounds validation. | test.c:30:18:30:37 | * ... | an MMIO/DMA hardware register read | -| test.c:36:3:36:9 | call to strncpy | test.c:35:18:35:37 | * ... | test.c:36:21:36:23 | len | Memory copy size argument is derived from $@ without sufficient bounds validation. | test.c:35:18:35:37 | * ... | an MMIO/DMA hardware register read | -| test.c:41:3:41:8 | call to memcpy | test.c:40:18:40:37 | * ... | test.c:41:20:41:22 | len | Memory copy size argument is derived from $@ without sufficient bounds validation. | test.c:40:18:40:37 | * ... | an MMIO/DMA hardware register read | +| test.c:26:20:26:22 | len | test.c:25:18:25:37 | * ... | test.c:26:20:26:22 | len | Memory copy size argument is derived from $@ without sufficient bounds validation. | test.c:25:18:25:37 | * ... | an MMIO/DMA hardware register read | +| test.c:31:21:31:23 | len | test.c:30:18:30:37 | * ... | test.c:31:21:31:23 | len | Memory copy size argument is derived from $@ without sufficient bounds validation. | test.c:30:18:30:37 | * ... | an MMIO/DMA hardware register read | +| test.c:36:21:36:23 | len | test.c:35:18:35:37 | * ... | test.c:36:21:36:23 | len | Memory copy size argument is derived from $@ without sufficient bounds validation. | test.c:35:18:35:37 | * ... | an MMIO/DMA hardware register read | +| test.c:41:20:41:22 | len | test.c:40:18:40:37 | * ... | test.c:41:20:41:22 | len | Memory copy size argument is derived from $@ without sufficient bounds validation. | test.c:40:18:40:37 | * ... | an MMIO/DMA hardware register read | edges | test.c:25:18:25:37 | * ... | test.c:25:18:25:37 | * ... | provenance | | | test.c:25:18:25:37 | * ... | test.c:26:20:26:22 | len | provenance | | From ff2416b0bf8228ff4eb656f24b64f05fc7c697d1 Mon Sep 17 00:00:00 2001 From: Tarek Date: Fri, 4 Sep 2026 18:12:44 -0400 Subject: [PATCH 1112/2098] cpp: remove non-ASCII character in test file --- .../Security/CWE/CWE-120/MmioUnsanitizedMemcpy/test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/test.c b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/test.c index 863894a552f7..66bd499a9582 100644 --- a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/test.c +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/test.c @@ -56,7 +56,7 @@ static void good_early_return(char *dst, char *src) { static void good_constant_size(char *dst, char *src) { uint32_t len = READ_REG(0x40001000); - memcpy(dst, src, 32); // GOOD — constant size, not tainted sink + memcpy(dst, src, 32); // GOOD } static void negative_volatile_global(char *dst, char *src) { From e41e0908f44029cb250c22b04d259fab442157a9 Mon Sep 17 00:00:00 2001 From: Tito0015 Date: Thu, 17 Sep 2026 15:21:19 -0400 Subject: [PATCH 1113/2098] cpp: address review nits on qhelp references and test header --- .../Security/CWE/CWE-120/MmioUnsanitizedMemcpy.qhelp | 6 ------ .../Security/CWE/CWE-120/MmioUnsanitizedMemcpy/test.c | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.qhelp b/cpp/ql/src/experimental/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.qhelp index c89496bb1745..9b1dcdc4cdf4 100644 --- a/cpp/ql/src/experimental/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.qhelp +++ b/cpp/ql/src/experimental/Security/CWE/CWE-120/MmioUnsanitizedMemcpy.qhelp @@ -24,11 +24,5 @@ and reject or clamp out-of-range values before copying. -
  • -CWE-120: Buffer Copy without Checking Size of Input -
  • -
  • -CWE-787: Out-of-bounds Write -
  • diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/test.c b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/test.c index 66bd499a9582..bf5c1bb583f4 100644 --- a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/test.c +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-120/MmioUnsanitizedMemcpy/test.c @@ -1,4 +1,4 @@ -/* Semmle test case for MmioUnsanitizedMemcpy.ql +/* Test case for MmioUnsanitizedMemcpy.ql * Allowlisted MMIO/DMA register macros flowing into memcpy/memmove/strncpy size parameters. */ From cfb2f0a3879f0c45296dcdd27c3582ebc97fceba Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Fri, 18 Sep 2026 09:04:51 +0200 Subject: [PATCH 1114/2098] Address review comments --- shared/util/codeql/util/UnboundList.qll | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/shared/util/codeql/util/UnboundList.qll b/shared/util/codeql/util/UnboundList.qll index dd92ff24ffcf..a08f76f9c362 100644 --- a/shared/util/codeql/util/UnboundList.qll +++ b/shared/util/codeql/util/UnboundList.qll @@ -53,6 +53,7 @@ module Make Input> { /** Gets the rank of element `e`, which is used internally in the string encoding. */ int getRank(Element e) { e = DenseRank::denseRank(result) } + /** Gets the ASCII printable excluding `.` with zero-based index `code`. */ pragma[nomagic] private string interpretAsciiCode(int code) { exists(int dot, int c | @@ -65,14 +66,18 @@ module Make Input> { private int asciiCodes() { result = strictcount(interpretAsciiCode(_)) } + /** + * Gets the `i`th digit (modulo `asciiCodes()`) in a base-`asciiCodes()` integer + * representation of `getRank(e)`. + */ private int getAsciiCodePart(Element e, int i) { result = getRank(e) and i = 0 or exists(int mid | mid = getAsciiCodePart(e, i - 1) and - mid > 0 and - result = mid / asciiCodes() + result = mid / asciiCodes() and + result > 0 ) } From acd08723a534cc5b3b1a969a1c4f32f7aa33a507 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 17 Sep 2026 13:04:27 +0200 Subject: [PATCH 1115/2098] Unified: Drop operators from the CFG. --- .../unified/internal/ControlFlowGraph.qll | 2 + .../controlflow/basicblock-slices.expected | 202 +++++++++--------- .../library-tests/controlflow/cfg.expected | 5 +- .../test/library-tests/controlflow/cfg.swift | 6 +- 4 files changed, 108 insertions(+), 107 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll index 157c6794ff51..42aa8bf5439d 100644 --- a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll @@ -30,6 +30,8 @@ private module Ast implements AstSig { e instanceof Modifier or e instanceof Identifier and not e instanceof IdentifierExpr + or + e instanceof Operator } AstNode getChild(AstNode n, int index) { diff --git a/unified/ql/test/library-tests/controlflow/basicblock-slices.expected b/unified/ql/test/library-tests/controlflow/basicblock-slices.expected index 50824aa38bc2..f167b4d76038 100644 --- a/unified/ql/test/library-tests/controlflow/basicblock-slices.expected +++ b/unified/ql/test/library-tests/controlflow/basicblock-slices.expected @@ -1,6 +1,6 @@ | 1 | cfg.swift:1:1:604:2 | Block | 'Block -V VariableDeclaration -V topLevelDecl -> Int -> 0' | | 2 | cfg.swift:2:1:2:1 | 0 | '0' | -| 3 | cfg.swift:3:1:3:12 | topLevelDecl | 'topLevelDecl -> + -> 1 -^ BinaryExpr' | +| 3 | cfg.swift:3:1:3:12 | topLevelDecl | 'topLevelDecl -> 1 -^ BinaryExpr' | | 5 | cfg.swift:5:1:5:37 | Block | 'Block -V 0 -^ ReturnExpr' | | 5 | cfg.swift:5:1:5:37 | FunctionDeclaration | 'FunctionDeclaration' | | 7 | cfg.swift:7:1:7:10 | returnZero | 'returnZero -^ CallExpr' | @@ -11,18 +11,18 @@ | 12 | cfg.swift:12:17:12:25 | withParam | 'withParam -^ Block' | | 15 | cfg.swift:15:1:17:1 | FunctionDeclaration | 'FunctionDeclaration' | | 15 | cfg.swift:15:13:15:13 | x | 'x -^ Block' | -| 16 | cfg.swift:16:10:16:10 | x | 'x -> == -> 0 -^ BinaryExpr -^ ReturnExpr' | +| 16 | cfg.swift:16:10:16:10 | x | 'x -> 0 -^ BinaryExpr -^ ReturnExpr' | | 19 | cfg.swift:19:1:26:1 | FunctionDeclaration | 'FunctionDeclaration' | | 19 | cfg.swift:19:17:19:17 | x | 'x -^ Block' | -| 20 | cfg.swift:20:3:22:3 | GuardIfStmt | 'GuardIfStmt -V x -> >= -> 0 -^ BinaryExpr -> Block' | +| 20 | cfg.swift:20:3:22:3 | GuardIfStmt | 'GuardIfStmt -V x -> 0 -^ BinaryExpr -> Block' | | 21 | cfg.swift:21:11:21:17 | MyError | 'MyError -^ MemberAccessExpr -^ ThrowExpr' | | 28 | cfg.swift:28:1:45:1 | FunctionDeclaration | 'FunctionDeclaration' | | 28 | cfg.swift:28:15:28:15 | x | 'x -^ Block' | | 29 | cfg.swift:29:3:43:3 | TryExpr | 'TryExpr -V Block' | -| 30 | cfg.swift:30:5:30:24 | try | 'try -^ UnaryExpr' | +| 30 | cfg.swift:30:5:30:24 | UnaryExpr | 'UnaryExpr' | | 30 | cfg.swift:30:9:30:18 | mightThrow | 'mightThrow -> Argument -V 0 -^ CallExpr' | | 31 | cfg.swift:31:5:31:9 | print | 'print -> Argument -V "Did not throw." -^ CallExpr' | -| 32 | cfg.swift:32:10:32:19 | mightThrow | 'mightThrow -> Argument -V 0 -^ CallExpr -^ try! -^ UnaryExpr' | +| 32 | cfg.swift:32:10:32:19 | mightThrow | 'mightThrow -> Argument -V 0 -^ CallExpr -^ UnaryExpr' | | 33 | cfg.swift:33:5:33:9 | print | 'print -> Argument -V "Still did not throw." -^ CallExpr' | | 35 | cfg.swift:35:5:37:3 | CatchClause | 'CatchClause -V MyError -^ MemberAccessExpr -> isZero -> Argument -V x -^ CallExpr -? MyError -^ MemberAccessExpr -^ ConditionalPattern -^ OrPattern' | | 35 | cfg.swift:35:62:37:3 | Block | 'Block' | @@ -40,19 +40,19 @@ | 47 | cfg.swift:47:21:47:21 | s | 's -^ Block' | | 48 | cfg.swift:48:10:50:3 | Block | 'Block' | | 48 | cfg.swift:48:10:50:3 | FunctionExpr | 'FunctionExpr -^ ReturnExpr' | -| 49 | cfg.swift:49:12:49:12 | s | 's -> + -> "" -^ BinaryExpr -^ ReturnExpr' | +| 49 | cfg.swift:49:12:49:12 | s | 's -> "" -^ BinaryExpr -^ ReturnExpr' | | 53 | cfg.swift:53:1:58:1 | FunctionDeclaration | 'FunctionDeclaration' | | 53 | cfg.swift:53:21:53:21 | x | 'x -^ Block' | | 54 | cfg.swift:54:3:56:3 | FunctionDeclaration | 'FunctionDeclaration' | | 54 | cfg.swift:54:10:54:10 | y | 'y -^ Block' | -| 55 | cfg.swift:55:12:55:12 | x | 'x -> + -> y -^ BinaryExpr -^ ReturnExpr' | +| 55 | cfg.swift:55:12:55:12 | x | 'x -> y -^ BinaryExpr -^ ReturnExpr' | | 57 | cfg.swift:57:10:57:10 | f | 'f -^ ReturnExpr' | | 60 | cfg.swift:60:1:64:1 | FunctionDeclaration | 'FunctionDeclaration' | | 60 | cfg.swift:60:21:60:21 | x | 'x -^ Block' | | 61 | cfg.swift:61:10:63:3 | Block | 'Block' | | 61 | cfg.swift:61:10:63:3 | FunctionExpr | 'FunctionExpr -^ ReturnExpr' | | 62 | cfg.swift:62:6:62:6 | y | 'y' | -| 62 | cfg.swift:62:19:62:19 | x | 'x -> + -> y -^ BinaryExpr' | +| 62 | cfg.swift:62:19:62:19 | x | 'x -> y -^ BinaryExpr' | | 66 | cfg.swift:66:1:70:1 | Block | 'Block' | | 66 | cfg.swift:66:1:70:1 | FunctionDeclaration | 'FunctionDeclaration' | | 67 | cfg.swift:67:3:67:34 | VariableDeclaration | 'VariableDeclaration -V x1 -> createClosure1 -> Argument -V "" -^ CallExpr -^ CallExpr' | @@ -64,27 +64,27 @@ | 74 | cfg.swift:74:10:74:10 | n | 'n -^ ReturnExpr' | | 77 | cfg.swift:77:1:81:1 | Block | 'Block' | | 77 | cfg.swift:77:1:81:1 | FunctionDeclaration | 'FunctionDeclaration' | -| 78 | cfg.swift:78:3:78:36 | VariableDeclaration | 'VariableDeclaration -V nBang -> maybeParseInt -> Argument -V "42" -^ CallExpr -^ ! -^ UnaryExpr' | +| 78 | cfg.swift:78:3:78:36 | VariableDeclaration | 'VariableDeclaration -V nBang -> maybeParseInt -> Argument -V "42" -^ CallExpr -^ UnaryExpr' | | 79 | cfg.swift:79:3:79:31 | VariableDeclaration | 'VariableDeclaration -V n -> maybeParseInt -> Argument -V "42" -^ CallExpr' | -| 80 | cfg.swift:80:10:80:14 | nBang | 'nBang -> + -> n -^ ! -^ UnaryExpr -^ BinaryExpr -^ ReturnExpr' | +| 80 | cfg.swift:80:10:80:14 | nBang | 'nBang -> n -^ UnaryExpr -^ BinaryExpr -^ ReturnExpr' | | 83 | cfg.swift:83:1:98:1 | Block | 'Block' | | 83 | cfg.swift:83:1:98:1 | FunctionDeclaration | 'FunctionDeclaration' | | 84 | cfg.swift:84:3:84:15 | VariableDeclaration | 'VariableDeclaration -V temp -> 10' | | 86 | cfg.swift:86:3:88:3 | FunctionDeclaration | 'FunctionDeclaration' | | 86 | cfg.swift:86:12:86:12 | a | 'a -^ Block' | -| 87 | cfg.swift:87:5:87:5 | a | 'a -> = -> a -> + -> 1 -^ BinaryExpr -^ BinaryExpr' | +| 87 | cfg.swift:87:5:87:5 | a | 'a -> a -> 1 -^ BinaryExpr -^ BinaryExpr' | | 90 | cfg.swift:90:3:92:3 | FunctionDeclaration | 'FunctionDeclaration' | | 90 | cfg.swift:90:20:90:20 | a | 'a -^ Block' | -| 91 | cfg.swift:91:5:91:5 | a | 'a -> = -> nil -^ BinaryExpr' | +| 91 | cfg.swift:91:5:91:5 | a | 'a -> nil -^ BinaryExpr' | | 94 | cfg.swift:94:3:94:5 | add | 'add -> Argument -V -^ CallExpr' | | 95 | cfg.swift:95:3:95:30 | VariableDeclaration | 'VariableDeclaration -V tempOptional -> Optional -V Int -^ GenericTypeExpr -> 10' | | 96 | cfg.swift:96:3:96:13 | addOptional | 'addOptional -> Argument -V -^ CallExpr' | -| 97 | cfg.swift:97:10:97:13 | temp | 'temp -> + -> tempOptional -^ ! -^ UnaryExpr -^ BinaryExpr -^ ReturnExpr' | +| 97 | cfg.swift:97:10:97:13 | temp | 'temp -> tempOptional -^ UnaryExpr -^ BinaryExpr -^ ReturnExpr' | | 100 | cfg.swift:100:1:109:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V C' | | 101 | cfg.swift:101:3:101:16 | VariableDeclaration | 'VariableDeclaration -V myInt -> Int' | | 102 | cfg.swift:102:3:104:3 | ConstructorDeclaration | 'ConstructorDeclaration' | | 102 | cfg.swift:102:8:102:8 | n | 'n -^ Block' | -| 103 | cfg.swift:103:5:103:9 | myInt | 'myInt -> = -> n -^ BinaryExpr' | +| 103 | cfg.swift:103:5:103:9 | myInt | 'myInt -> n -^ BinaryExpr' | | 106 | cfg.swift:106:3:108:3 | Block | 'Block' | | 106 | cfg.swift:106:3:108:3 | FunctionDeclaration | 'FunctionDeclaration' | | 107 | cfg.swift:107:12:107:16 | myInt | 'myInt -^ ReturnExpr' | @@ -103,17 +103,17 @@ | 124 | cfg.swift:124:3:124:33 | VariableDeclaration | 'VariableDeclaration -V n10 -> inoutParam -^ MemberAccessExpr -^ MemberAccessExpr' | | 125 | cfg.swift:125:3:125:33 | VariableDeclaration | 'VariableDeclaration -V n11 -> inoutParam -^ MemberAccessExpr -^ CallExpr' | | 126 | cfg.swift:126:3:126:38 | VariableDeclaration | 'VariableDeclaration -V n12 -> inoutParam -^ MemberAccessExpr -^ MemberAccessExpr -^ CallExpr' | -| 128 | cfg.swift:128:3:128:22 | VariableDeclaration | 'VariableDeclaration -V n13 -> opt -^ ! -^ UnaryExpr -^ MemberAccessExpr' | -| 129 | cfg.swift:129:3:129:27 | VariableDeclaration | 'VariableDeclaration -V n14 -> opt -^ ! -^ UnaryExpr -^ MemberAccessExpr -^ MemberAccessExpr' | -| 130 | cfg.swift:130:3:130:27 | VariableDeclaration | 'VariableDeclaration -V n15 -> opt -^ ! -^ UnaryExpr -^ MemberAccessExpr -^ CallExpr' | -| 131 | cfg.swift:131:3:131:32 | VariableDeclaration | 'VariableDeclaration -V n16 -> opt -^ ! -^ UnaryExpr -^ MemberAccessExpr -^ MemberAccessExpr -^ CallExpr' | +| 128 | cfg.swift:128:3:128:22 | VariableDeclaration | 'VariableDeclaration -V n13 -> opt -^ UnaryExpr -^ MemberAccessExpr' | +| 129 | cfg.swift:129:3:129:27 | VariableDeclaration | 'VariableDeclaration -V n14 -> opt -^ UnaryExpr -^ MemberAccessExpr -^ MemberAccessExpr' | +| 130 | cfg.swift:130:3:130:27 | VariableDeclaration | 'VariableDeclaration -V n15 -> opt -^ UnaryExpr -^ MemberAccessExpr -^ CallExpr' | +| 131 | cfg.swift:131:3:131:32 | VariableDeclaration | 'VariableDeclaration -V n16 -> opt -^ UnaryExpr -^ MemberAccessExpr -^ MemberAccessExpr -^ CallExpr' | | 133 | cfg.swift:133:3:133:22 | VariableDeclaration | 'VariableDeclaration -V n17 -> opt -^ MemberAccessExpr' | | 134 | cfg.swift:134:3:134:27 | VariableDeclaration | 'VariableDeclaration -V n18 -> opt -^ MemberAccessExpr -^ MemberAccessExpr' | | 135 | cfg.swift:135:3:135:27 | VariableDeclaration | 'VariableDeclaration -V n19 -> opt -^ MemberAccessExpr -^ CallExpr' | | 136 | cfg.swift:136:3:136:32 | VariableDeclaration | 'VariableDeclaration -V n20 -> opt -^ MemberAccessExpr -^ MemberAccessExpr -^ CallExpr' | | 139 | cfg.swift:139:1:166:1 | FunctionDeclaration | 'FunctionDeclaration' | | 139 | cfg.swift:139:15:139:15 | x | 'x -^ Block' | -| 140 | cfg.swift:140:3:141:12 | ForEachStmt | 'ForEachStmt -V 0 -> ... -> 10 -^ BinaryExpr' | +| 140 | cfg.swift:140:3:141:12 | ForEachStmt | 'ForEachStmt -V 0 -> 10 -^ BinaryExpr' | | 140 | cfg.swift:140:7:140:7 | _ | '_' | | 141 | cfg.swift:141:9:141:12 | Block | 'Block' | | 143 | cfg.swift:143:3:153:3 | SwitchExpr | 'SwitchExpr -V x' | @@ -123,8 +123,8 @@ | 147 | cfg.swift:147:5:150:17 | Block | 'Block' | | 147 | cfg.swift:147:5:150:17 | SwitchCase | 'SwitchCase' | | 147 | cfg.swift:147:10:147:10 | x | 'x -^ ConditionalPattern' | -| 148 | cfg.swift:148:9:149:17 | BinaryExpr | 'BinaryExpr -V x -> >= -> 2 -^ BinaryExpr' | -| 149 | cfg.swift:149:13:149:13 | x | 'x -> < -> 5 -^ BinaryExpr' | +| 148 | cfg.swift:148:9:149:17 | BinaryExpr | 'BinaryExpr -V x -> 2 -^ BinaryExpr' | +| 149 | cfg.swift:149:13:149:13 | x | 'x -> 5 -^ BinaryExpr' | | 150 | cfg.swift:150:14:150:17 | true | 'true -^ ReturnExpr' | | 151 | cfg.swift:151:5:152:18 | SwitchCase | 'SwitchCase -V Block' | | 152 | cfg.swift:152:14:152:18 | false | 'false -^ ReturnExpr' | @@ -135,12 +135,12 @@ | 178 | cfg.swift:178:3:183:3 | | '' | | 186 | cfg.swift:186:1:198:1 | FunctionDeclaration | 'FunctionDeclaration' | | 186 | cfg.swift:186:9:186:9 | x | 'x -^ Block' | -| 187 | cfg.swift:187:3:197:3 | IfExpr | 'IfExpr -V x -> > -> 2 -^ BinaryExpr' | +| 187 | cfg.swift:187:3:197:3 | IfExpr | 'IfExpr -V x -> 2 -^ BinaryExpr' | | 187 | cfg.swift:187:12:189:3 | Block | 'Block' | | 188 | cfg.swift:188:5:188:9 | print | 'print -> Argument -V "x is greater than 2" -^ CallExpr' | -| 190 | cfg.swift:190:8:197:3 | IfExpr | 'IfExpr -V BinaryExpr -V BinaryExpr -V x -> <= -> 2 -^ BinaryExpr' | -| 191 | cfg.swift:191:13:191:13 | x | 'x -> > -> 0 -^ BinaryExpr' | -| 192 | cfg.swift:192:13:192:21 | UnaryExpr | 'UnaryExpr -V x -> == -> 5 -^ BinaryExpr' | +| 190 | cfg.swift:190:8:197:3 | IfExpr | 'IfExpr -V BinaryExpr -V BinaryExpr -V x -> 2 -^ BinaryExpr' | +| 191 | cfg.swift:191:13:191:13 | x | 'x -> 0 -^ BinaryExpr' | +| 192 | cfg.swift:192:13:192:21 | UnaryExpr | 'UnaryExpr -V x -> 5 -^ BinaryExpr' | | 192 | cfg.swift:192:23:194:3 | Block | 'Block' | | 193 | cfg.swift:193:5:193:9 | print | 'print -> Argument -V "x is 1" -^ CallExpr' | | 195 | cfg.swift:195:8:197:3 | Block | 'Block' | @@ -153,12 +153,12 @@ | 204 | cfg.swift:204:10:204:10 | 1 | '1 -^ ReturnExpr' | | 207 | cfg.swift:207:1:215:1 | FunctionDeclaration | 'FunctionDeclaration' | | 207 | cfg.swift:207:9:207:9 | x | 'x -^ Block' | -| 208 | cfg.swift:208:3:213:3 | IfExpr | 'IfExpr -V x -> < -> 0 -^ BinaryExpr' | +| 208 | cfg.swift:208:3:213:3 | IfExpr | 'IfExpr -V x -> 0 -^ BinaryExpr' | | 208 | cfg.swift:208:12:213:3 | Block | 'Block' | -| 209 | cfg.swift:209:5:209:5 | x | 'x -> = -> x -? - -^ UnaryExpr -^ BinaryExpr' | -| 210 | cfg.swift:210:5:212:5 | IfExpr | 'IfExpr -V x -> > -> 10 -^ BinaryExpr' | +| 209 | cfg.swift:209:5:209:5 | x | 'x -> x -^ UnaryExpr -^ BinaryExpr' | +| 210 | cfg.swift:210:5:212:5 | IfExpr | 'IfExpr -V x -> 10 -^ BinaryExpr' | | 210 | cfg.swift:210:15:212:5 | Block | 'Block' | -| 211 | cfg.swift:211:7:211:7 | x | 'x -> = -> x -> - -> 1 -^ BinaryExpr -^ BinaryExpr' | +| 211 | cfg.swift:211:7:211:7 | x | 'x -> x -> 1 -^ BinaryExpr -^ BinaryExpr' | | 214 | cfg.swift:214:10:214:10 | x | 'x -^ ReturnExpr' | | 217 | cfg.swift:217:1:223:1 | FunctionDeclaration | 'FunctionDeclaration' | | 217 | cfg.swift:217:10:217:11 | b1 | 'b1 -> b2 -> b3 -^ Block' | @@ -195,72 +195,72 @@ | 252 | cfg.swift:252:5:252:9 | print | 'print -> Argument -V "b1 or b2" -^ CallExpr' | | 256 | cfg.swift:256:1:273:1 | FunctionDeclaration | 'FunctionDeclaration' | | 256 | cfg.swift:256:18:256:18 | a | 'a -> b -^ Block' | -| 257 | cfg.swift:257:3:257:15 | VariableDeclaration | 'VariableDeclaration -V c -> a -> + -> b -^ BinaryExpr' | -| 258 | cfg.swift:258:3:258:15 | VariableDeclaration | 'VariableDeclaration -V d -> a -> - -> b -^ BinaryExpr' | -| 259 | cfg.swift:259:3:259:15 | VariableDeclaration | 'VariableDeclaration -V e -> a -> * -> b -^ BinaryExpr' | -| 260 | cfg.swift:260:3:260:15 | VariableDeclaration | 'VariableDeclaration -V f -> a -> / -> b -^ BinaryExpr' | -| 261 | cfg.swift:261:3:261:15 | VariableDeclaration | 'VariableDeclaration -V g -> a -> % -> b -^ BinaryExpr' | -| 262 | cfg.swift:262:3:262:15 | VariableDeclaration | 'VariableDeclaration -V h -> a -> & -> b -^ BinaryExpr' | -| 263 | cfg.swift:263:3:263:15 | VariableDeclaration | 'VariableDeclaration -V i -> a -> \| -> b -^ BinaryExpr' | -| 264 | cfg.swift:264:3:264:15 | VariableDeclaration | 'VariableDeclaration -V j -> a -> ^ -> b -^ BinaryExpr' | -| 265 | cfg.swift:265:3:265:16 | VariableDeclaration | 'VariableDeclaration -V k -> a -> << -> b -^ BinaryExpr' | -| 266 | cfg.swift:266:3:266:16 | VariableDeclaration | 'VariableDeclaration -V l -> a -> >> -> b -^ BinaryExpr' | -| 267 | cfg.swift:267:3:267:16 | VariableDeclaration | 'VariableDeclaration -V o -> a -> == -> b -^ BinaryExpr' | -| 268 | cfg.swift:268:3:268:16 | VariableDeclaration | 'VariableDeclaration -V p -> a -> != -> b -^ BinaryExpr' | -| 269 | cfg.swift:269:3:269:15 | VariableDeclaration | 'VariableDeclaration -V q -> a -> < -> b -^ BinaryExpr' | -| 270 | cfg.swift:270:3:270:16 | VariableDeclaration | 'VariableDeclaration -V r -> a -> <= -> b -^ BinaryExpr' | -| 271 | cfg.swift:271:3:271:15 | VariableDeclaration | 'VariableDeclaration -V s -> a -> > -> b -^ BinaryExpr' | -| 272 | cfg.swift:272:3:272:16 | VariableDeclaration | 'VariableDeclaration -V t -> a -> >= -> b -^ BinaryExpr' | +| 257 | cfg.swift:257:3:257:15 | VariableDeclaration | 'VariableDeclaration -V c -> a -> b -^ BinaryExpr' | +| 258 | cfg.swift:258:3:258:15 | VariableDeclaration | 'VariableDeclaration -V d -> a -> b -^ BinaryExpr' | +| 259 | cfg.swift:259:3:259:15 | VariableDeclaration | 'VariableDeclaration -V e -> a -> b -^ BinaryExpr' | +| 260 | cfg.swift:260:3:260:15 | VariableDeclaration | 'VariableDeclaration -V f -> a -> b -^ BinaryExpr' | +| 261 | cfg.swift:261:3:261:15 | VariableDeclaration | 'VariableDeclaration -V g -> a -> b -^ BinaryExpr' | +| 262 | cfg.swift:262:3:262:15 | VariableDeclaration | 'VariableDeclaration -V h -> a -> b -^ BinaryExpr' | +| 263 | cfg.swift:263:3:263:15 | VariableDeclaration | 'VariableDeclaration -V i -> a -> b -^ BinaryExpr' | +| 264 | cfg.swift:264:3:264:15 | VariableDeclaration | 'VariableDeclaration -V j -> a -> b -^ BinaryExpr' | +| 265 | cfg.swift:265:3:265:16 | VariableDeclaration | 'VariableDeclaration -V k -> a -> b -^ BinaryExpr' | +| 266 | cfg.swift:266:3:266:16 | VariableDeclaration | 'VariableDeclaration -V l -> a -> b -^ BinaryExpr' | +| 267 | cfg.swift:267:3:267:16 | VariableDeclaration | 'VariableDeclaration -V o -> a -> b -^ BinaryExpr' | +| 268 | cfg.swift:268:3:268:16 | VariableDeclaration | 'VariableDeclaration -V p -> a -> b -^ BinaryExpr' | +| 269 | cfg.swift:269:3:269:15 | VariableDeclaration | 'VariableDeclaration -V q -> a -> b -^ BinaryExpr' | +| 270 | cfg.swift:270:3:270:16 | VariableDeclaration | 'VariableDeclaration -V r -> a -> b -^ BinaryExpr' | +| 271 | cfg.swift:271:3:271:15 | VariableDeclaration | 'VariableDeclaration -V s -> a -> b -^ BinaryExpr' | +| 272 | cfg.swift:272:3:272:16 | VariableDeclaration | 'VariableDeclaration -V t -> a -> b -^ BinaryExpr' | | 275 | cfg.swift:275:1:277:1 | FunctionDeclaration | 'FunctionDeclaration' | | 275 | cfg.swift:275:25:275:25 | x | 'x -> y -^ Block' | -| 276 | cfg.swift:276:11:276:10 | | ' -> interpolation -V Argument -V x -^ CallExpr -> + -> interpolation -V Argument -V y -^ CallExpr -> is equal to -> interpolation -V Argument -V x -> + -> y -^ BinaryExpr -^ CallExpr -> and here is a zero: -> interpolation -V Argument -V returnZero -^ CallExpr -^ CallExpr -> -^ StringInterpolationExpr -^ ReturnExpr' | +| 276 | cfg.swift:276:11:276:10 | | ' -> interpolation -V Argument -V x -^ CallExpr -> + -> interpolation -V Argument -V y -^ CallExpr -> is equal to -> interpolation -V Argument -V x -> y -^ BinaryExpr -^ CallExpr -> and here is a zero: -> interpolation -V Argument -V returnZero -^ CallExpr -^ CallExpr -> -^ StringInterpolationExpr -^ ReturnExpr' | | 279 | cfg.swift:279:1:310:1 | Block | 'Block' | | 279 | cfg.swift:279:1:310:1 | FunctionDeclaration | 'FunctionDeclaration' | | 280 | cfg.swift:280:3:280:44 | VariableDeclaration | 'VariableDeclaration -V a -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -^ ArrayLiteral' | -| 281 | cfg.swift:281:3:281:3 | a | 'a -> Argument -V 0 -^ CallExpr -> = -> 0 -^ BinaryExpr' | -| 282 | cfg.swift:282:3:282:3 | a | 'a -> Argument -V 1 -^ CallExpr -> += -> 1 -^ BinaryExpr' | -| 283 | cfg.swift:283:3:283:3 | a | 'a -> Argument -V 2 -^ CallExpr -> -= -> 1 -^ BinaryExpr' | -| 284 | cfg.swift:284:3:284:3 | a | 'a -> Argument -V 3 -^ CallExpr -> *= -> 1 -^ BinaryExpr' | -| 285 | cfg.swift:285:3:285:3 | a | 'a -> Argument -V 4 -^ CallExpr -> /= -> 1 -^ BinaryExpr' | -| 286 | cfg.swift:286:3:286:3 | a | 'a -> Argument -V 5 -^ CallExpr -> %= -> 1 -^ BinaryExpr' | -| 287 | cfg.swift:287:3:287:3 | a | 'a -> Argument -V 6 -^ CallExpr -> &= -> 1 -^ BinaryExpr' | -| 288 | cfg.swift:288:3:288:3 | a | 'a -> Argument -V 7 -^ CallExpr -> \|= -> 1 -^ BinaryExpr' | -| 289 | cfg.swift:289:3:289:3 | a | 'a -> Argument -V 8 -^ CallExpr -> ^= -> 1 -^ BinaryExpr' | -| 290 | cfg.swift:290:3:290:3 | a | 'a -> Argument -V 9 -^ CallExpr -> <<= -> 1 -^ BinaryExpr' | -| 291 | cfg.swift:291:3:291:3 | a | 'a -> Argument -V 10 -^ CallExpr -> >>= -> 1 -^ BinaryExpr' | +| 281 | cfg.swift:281:3:281:3 | a | 'a -> Argument -V 0 -^ CallExpr -> 0 -^ BinaryExpr' | +| 282 | cfg.swift:282:3:282:3 | a | 'a -> Argument -V 1 -^ CallExpr -> 1 -^ BinaryExpr' | +| 283 | cfg.swift:283:3:283:3 | a | 'a -> Argument -V 2 -^ CallExpr -> 1 -^ BinaryExpr' | +| 284 | cfg.swift:284:3:284:3 | a | 'a -> Argument -V 3 -^ CallExpr -> 1 -^ BinaryExpr' | +| 285 | cfg.swift:285:3:285:3 | a | 'a -> Argument -V 4 -^ CallExpr -> 1 -^ BinaryExpr' | +| 286 | cfg.swift:286:3:286:3 | a | 'a -> Argument -V 5 -^ CallExpr -> 1 -^ BinaryExpr' | +| 287 | cfg.swift:287:3:287:3 | a | 'a -> Argument -V 6 -^ CallExpr -> 1 -^ BinaryExpr' | +| 288 | cfg.swift:288:3:288:3 | a | 'a -> Argument -V 7 -^ CallExpr -> 1 -^ BinaryExpr' | +| 289 | cfg.swift:289:3:289:3 | a | 'a -> Argument -V 8 -^ CallExpr -> 1 -^ BinaryExpr' | +| 290 | cfg.swift:290:3:290:3 | a | 'a -> Argument -V 9 -^ CallExpr -> 1 -^ BinaryExpr' | +| 291 | cfg.swift:291:3:291:3 | a | 'a -> Argument -V 10 -^ CallExpr -> 1 -^ BinaryExpr' | | 293 | cfg.swift:293:3:293:49 | VariableDeclaration | 'VariableDeclaration -V tupleWithA -> Argument -V a -> Argument -V 0 -^ CallExpr -> Argument -V a -> Argument -V 1 -^ CallExpr -> Argument -V a -> Argument -V 2 -^ CallExpr -> Argument -V a -> Argument -V 3 -^ CallExpr -> Argument -V a -> Argument -V 4 -^ CallExpr -^ TupleExpr' | | 295 | cfg.swift:295:3:295:48 | VariableDeclaration | 'VariableDeclaration -V b -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -> 11 -^ ArrayLiteral' | -| 296 | cfg.swift:296:3:296:3 | b | 'b -> Argument -V 0 -^ CallExpr -> = -> a -> Argument -V 10 -^ CallExpr -^ BinaryExpr' | -| 297 | cfg.swift:297:3:297:3 | b | 'b -> Argument -V 1 -^ CallExpr -> = -> b -> Argument -V 0 -^ CallExpr -> + -> 1 -^ BinaryExpr -^ BinaryExpr' | -| 298 | cfg.swift:298:3:298:3 | b | 'b -> Argument -V 2 -^ CallExpr -> = -> b -> Argument -V 1 -^ CallExpr -> - -> 1 -^ BinaryExpr -^ BinaryExpr' | -| 299 | cfg.swift:299:3:299:3 | b | 'b -> Argument -V 3 -^ CallExpr -> = -> b -> Argument -V 2 -^ CallExpr -> * -> 1 -^ BinaryExpr -^ BinaryExpr' | -| 300 | cfg.swift:300:3:300:3 | b | 'b -> Argument -V 4 -^ CallExpr -> = -> b -> Argument -V 3 -^ CallExpr -> / -> 1 -^ BinaryExpr -^ BinaryExpr' | -| 301 | cfg.swift:301:3:301:3 | b | 'b -> Argument -V 5 -^ CallExpr -> = -> b -> Argument -V 4 -^ CallExpr -> % -> 1 -^ BinaryExpr -^ BinaryExpr' | -| 302 | cfg.swift:302:3:302:3 | b | 'b -> Argument -V 6 -^ CallExpr -> = -> b -> Argument -V 5 -^ CallExpr -> & -> 1 -^ BinaryExpr -^ BinaryExpr' | -| 303 | cfg.swift:303:3:303:3 | b | 'b -> Argument -V 7 -^ CallExpr -> = -> b -> Argument -V 6 -^ CallExpr -> \| -> 1 -^ BinaryExpr -^ BinaryExpr' | -| 304 | cfg.swift:304:3:304:3 | b | 'b -> Argument -V 8 -^ CallExpr -> = -> b -> Argument -V 7 -^ CallExpr -> ^ -> 1 -^ BinaryExpr -^ BinaryExpr' | -| 305 | cfg.swift:305:3:305:3 | b | 'b -> Argument -V 9 -^ CallExpr -> = -> b -> Argument -V 8 -^ CallExpr -> << -> 1 -^ BinaryExpr -^ BinaryExpr' | -| 306 | cfg.swift:306:3:306:3 | b | 'b -> Argument -V 10 -^ CallExpr -> = -> b -> Argument -V 9 -^ CallExpr -> >> -> 1 -^ BinaryExpr -^ BinaryExpr' | +| 296 | cfg.swift:296:3:296:3 | b | 'b -> Argument -V 0 -^ CallExpr -> a -> Argument -V 10 -^ CallExpr -^ BinaryExpr' | +| 297 | cfg.swift:297:3:297:3 | b | 'b -> Argument -V 1 -^ CallExpr -> b -> Argument -V 0 -^ CallExpr -> 1 -^ BinaryExpr -^ BinaryExpr' | +| 298 | cfg.swift:298:3:298:3 | b | 'b -> Argument -V 2 -^ CallExpr -> b -> Argument -V 1 -^ CallExpr -> 1 -^ BinaryExpr -^ BinaryExpr' | +| 299 | cfg.swift:299:3:299:3 | b | 'b -> Argument -V 3 -^ CallExpr -> b -> Argument -V 2 -^ CallExpr -> 1 -^ BinaryExpr -^ BinaryExpr' | +| 300 | cfg.swift:300:3:300:3 | b | 'b -> Argument -V 4 -^ CallExpr -> b -> Argument -V 3 -^ CallExpr -> 1 -^ BinaryExpr -^ BinaryExpr' | +| 301 | cfg.swift:301:3:301:3 | b | 'b -> Argument -V 5 -^ CallExpr -> b -> Argument -V 4 -^ CallExpr -> 1 -^ BinaryExpr -^ BinaryExpr' | +| 302 | cfg.swift:302:3:302:3 | b | 'b -> Argument -V 6 -^ CallExpr -> b -> Argument -V 5 -^ CallExpr -> 1 -^ BinaryExpr -^ BinaryExpr' | +| 303 | cfg.swift:303:3:303:3 | b | 'b -> Argument -V 7 -^ CallExpr -> b -> Argument -V 6 -^ CallExpr -> 1 -^ BinaryExpr -^ BinaryExpr' | +| 304 | cfg.swift:304:3:304:3 | b | 'b -> Argument -V 8 -^ CallExpr -> b -> Argument -V 7 -^ CallExpr -> 1 -^ BinaryExpr -^ BinaryExpr' | +| 305 | cfg.swift:305:3:305:3 | b | 'b -> Argument -V 9 -^ CallExpr -> b -> Argument -V 8 -^ CallExpr -> 1 -^ BinaryExpr -^ BinaryExpr' | +| 306 | cfg.swift:306:3:306:3 | b | 'b -> Argument -V 10 -^ CallExpr -> b -> Argument -V 9 -^ CallExpr -> 1 -^ BinaryExpr -^ BinaryExpr' | | 308 | cfg.swift:308:3:308:39 | VariableDeclaration | 'VariableDeclaration -V Argument -V a1 -> Argument -V a2 -> Argument -V a3 -> Argument -V a4 -> Argument -V a5 -^ TupleExpr -> tupleWithA' | -| 309 | cfg.swift:309:11:309:20 | Argument | 'Argument -V a1 -> + -> b -> Argument -V 0 -^ CallExpr -^ BinaryExpr -> Argument -V a2 -> + -> b -> Argument -V 1 -^ CallExpr -^ BinaryExpr -> Argument -V a3 -> + -> b -> Argument -V 2 -^ CallExpr -^ BinaryExpr -> Argument -V a4 -> + -> b -> Argument -V 3 -^ CallExpr -^ BinaryExpr -> Argument -V a5 -> + -> b -> Argument -V 4 -^ CallExpr -^ BinaryExpr -^ TupleExpr -^ ReturnExpr' | +| 309 | cfg.swift:309:11:309:20 | Argument | 'Argument -V a1 -> b -> Argument -V 0 -^ CallExpr -^ BinaryExpr -> Argument -V a2 -> b -> Argument -V 1 -^ CallExpr -^ BinaryExpr -> Argument -V a3 -> b -> Argument -V 2 -^ CallExpr -^ BinaryExpr -> Argument -V a4 -> b -> Argument -V 3 -^ CallExpr -^ BinaryExpr -> Argument -V a5 -> b -> Argument -V 4 -^ CallExpr -^ BinaryExpr -^ TupleExpr -^ ReturnExpr' | | 312 | cfg.swift:312:1:317:1 | FunctionDeclaration | 'FunctionDeclaration' | | 312 | cfg.swift:312:12:312:12 | x | 'x -^ Block' | | 313 | cfg.swift:313:3:316:3 | WhileStmt | 'WhileStmt' | -| 313 | cfg.swift:313:9:313:9 | x | 'x -> >= -> 0 -^ BinaryExpr' | +| 313 | cfg.swift:313:9:313:9 | x | 'x -> 0 -^ BinaryExpr' | | 313 | cfg.swift:313:16:316:3 | Block | 'Block' | | 314 | cfg.swift:314:5:314:9 | print | 'print -> Argument -V x -^ CallExpr' | -| 315 | cfg.swift:315:5:315:5 | x | 'x -> -= -> 1 -^ BinaryExpr' | +| 315 | cfg.swift:315:5:315:5 | x | 'x -> 1 -^ BinaryExpr' | | 319 | cfg.swift:319:1:332:1 | FunctionDeclaration | 'FunctionDeclaration' | | 319 | cfg.swift:319:12:319:12 | x | 'x -^ Block' | | 320 | cfg.swift:320:3:330:3 | WhileStmt | 'WhileStmt' | -| 320 | cfg.swift:320:9:320:9 | x | 'x -> >= -> 0 -^ BinaryExpr' | +| 320 | cfg.swift:320:9:320:9 | x | 'x -> 0 -^ BinaryExpr' | | 320 | cfg.swift:320:16:330:3 | Block | 'Block' | | 321 | cfg.swift:321:5:321:9 | print | 'print -> Argument -V x -^ CallExpr' | -| 322 | cfg.swift:322:5:322:5 | x | 'x -> -= -> 1 -^ BinaryExpr' | -| 323 | cfg.swift:323:5:328:5 | IfExpr | 'IfExpr -V x -> > -> 100 -^ BinaryExpr' | +| 322 | cfg.swift:322:5:322:5 | x | 'x -> 1 -^ BinaryExpr' | +| 323 | cfg.swift:323:5:328:5 | IfExpr | 'IfExpr -V x -> 100 -^ BinaryExpr' | | 323 | cfg.swift:323:16:325:5 | Block | 'Block' | | 324 | cfg.swift:324:7:324:11 | BreakExpr | 'BreakExpr' | -| 326 | cfg.swift:326:10:328:5 | IfExpr | 'IfExpr -V x -> > -> 50 -^ BinaryExpr' | +| 326 | cfg.swift:326:10:328:5 | IfExpr | 'IfExpr -V x -> 50 -^ BinaryExpr' | | 326 | cfg.swift:326:20:328:5 | Block | 'Block' | | 327 | cfg.swift:327:7:327:14 | ContinueExpr | 'ContinueExpr' | | 329 | cfg.swift:329:5:329:9 | print | 'print -> Argument -V "Iter" -^ CallExpr' | @@ -268,17 +268,17 @@ | 334 | cfg.swift:334:1:349:1 | FunctionDeclaration | 'FunctionDeclaration' | | 334 | cfg.swift:334:18:334:18 | x | 'x -^ Block' | | 335 | cfg.swift:335:3:348:3 | LabeledStmt | 'LabeledStmt -V WhileStmt' | -| 335 | cfg.swift:335:16:335:16 | x | 'x -> >= -> 0 -^ BinaryExpr' | +| 335 | cfg.swift:335:16:335:16 | x | 'x -> 0 -^ BinaryExpr' | | 335 | cfg.swift:335:23:348:3 | Block | 'Block' | | 336 | cfg.swift:336:5:346:5 | LabeledStmt | 'LabeledStmt -V WhileStmt' | -| 336 | cfg.swift:336:18:336:18 | x | 'x -> >= -> 0 -^ BinaryExpr' | +| 336 | cfg.swift:336:18:336:18 | x | 'x -> 0 -^ BinaryExpr' | | 336 | cfg.swift:336:25:346:5 | Block | 'Block' | | 337 | cfg.swift:337:7:337:11 | print | 'print -> Argument -V x -^ CallExpr' | -| 338 | cfg.swift:338:7:338:7 | x | 'x -> -= -> 1 -^ BinaryExpr' | -| 339 | cfg.swift:339:7:344:7 | IfExpr | 'IfExpr -V x -> > -> 100 -^ BinaryExpr' | +| 338 | cfg.swift:338:7:338:7 | x | 'x -> 1 -^ BinaryExpr' | +| 339 | cfg.swift:339:7:344:7 | IfExpr | 'IfExpr -V x -> 100 -^ BinaryExpr' | | 339 | cfg.swift:339:18:341:7 | Block | 'Block' | | 340 | cfg.swift:340:9:340:19 | BreakExpr | 'BreakExpr' | -| 342 | cfg.swift:342:12:344:7 | IfExpr | 'IfExpr -V x -> > -> 50 -^ BinaryExpr' | +| 342 | cfg.swift:342:12:344:7 | IfExpr | 'IfExpr -V x -> 50 -^ BinaryExpr' | | 342 | cfg.swift:342:22:344:7 | Block | 'Block' | | 343 | cfg.swift:343:9:343:22 | ContinueExpr | 'ContinueExpr' | | 345 | cfg.swift:345:7:345:11 | print | 'print -> Argument -V "Iter" -^ CallExpr' | @@ -288,20 +288,20 @@ | 352 | cfg.swift:352:3:355:16 | DoWhileStmt | 'DoWhileStmt' | | 352 | cfg.swift:352:10:355:3 | Block | 'Block' | | 353 | cfg.swift:353:5:353:9 | print | 'print -> Argument -V x -^ CallExpr' | -| 354 | cfg.swift:354:5:354:5 | x | 'x -> -= -> 1 -^ BinaryExpr' | -| 355 | cfg.swift:355:11:355:11 | x | 'x -> >= -> 0 -^ BinaryExpr' | +| 354 | cfg.swift:354:5:354:5 | x | 'x -> 1 -^ BinaryExpr' | +| 355 | cfg.swift:355:11:355:11 | x | 'x -> 0 -^ BinaryExpr' | | 358 | cfg.swift:358:1:363:1 | Block | 'Block' | | 358 | cfg.swift:358:1:363:1 | FunctionDeclaration | 'FunctionDeclaration' | | 359 | cfg.swift:359:3:359:11 | VariableDeclaration | 'VariableDeclaration -V x -> 0' | | 360 | cfg.swift:360:3:362:3 | WhileStmt | 'WhileStmt' | -| 360 | cfg.swift:360:9:360:9 | x | 'x -> < -> 10 -^ BinaryExpr' | +| 360 | cfg.swift:360:9:360:9 | x | 'x -> 10 -^ BinaryExpr' | | 360 | cfg.swift:360:17:362:3 | Block | 'Block' | -| 361 | cfg.swift:361:5:361:5 | x | 'x -> += -> 1 -^ BinaryExpr' | +| 361 | cfg.swift:361:5:361:5 | x | 'x -> 1 -^ BinaryExpr' | | 365 | cfg.swift:365:1:374:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V OptionalC' | | 366 | cfg.swift:366:3:366:11 | VariableDeclaration | 'VariableDeclaration -V c -> Optional -V C -^ GenericTypeExpr' | | 367 | cfg.swift:367:3:369:3 | ConstructorDeclaration | 'ConstructorDeclaration' | | 367 | cfg.swift:367:8:367:10 | arg | 'arg -^ Block' | -| 368 | cfg.swift:368:5:368:5 | c | 'c -> = -> arg -^ BinaryExpr' | +| 368 | cfg.swift:368:5:368:5 | c | 'c -> arg -^ BinaryExpr' | | 371 | cfg.swift:371:3:373:3 | Block | 'Block' | | 371 | cfg.swift:371:3:373:3 | FunctionDeclaration | 'FunctionDeclaration' | | 372 | cfg.swift:372:12:372:12 | c | 'c -^ ReturnExpr' | @@ -315,7 +315,7 @@ | 382 | cfg.swift:382:12:382:12 | z | 'z -^ ReturnExpr' | | 386 | cfg.swift:386:1:388:1 | FunctionDeclaration | 'FunctionDeclaration' | | 386 | cfg.swift:386:23:386:23 | t | 't -^ Block' | -| 387 | cfg.swift:387:10:387:10 | t | 't -^ MemberAccessExpr -> + -> t -^ MemberAccessExpr -^ BinaryExpr -> + -> t -^ MemberAccessExpr -^ BinaryExpr -> + -> Argument -V 1 -> Argument -V 2 -> Argument -V 3 -^ TupleExpr -^ MemberAccessExpr -^ BinaryExpr -^ ReturnExpr' | +| 387 | cfg.swift:387:10:387:10 | t | 't -^ MemberAccessExpr -> t -^ MemberAccessExpr -^ BinaryExpr -> t -^ MemberAccessExpr -^ BinaryExpr -> Argument -V 1 -> Argument -V 2 -> Argument -V 3 -^ TupleExpr -^ MemberAccessExpr -^ BinaryExpr -^ ReturnExpr' | | 390 | cfg.swift:390:1:394:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V Derived -^ BaseType -V C' | | 391 | cfg.swift:391:3:393:3 | Block | 'Block' | | 391 | cfg.swift:391:3:393:3 | ConstructorDeclaration | 'ConstructorDeclaration' | @@ -323,20 +323,20 @@ | 396 | cfg.swift:396:1:404:1 | FunctionDeclaration | 'FunctionDeclaration' | | 396 | cfg.swift:396:21:396:21 | x | 'x -^ Block' | | 397 | cfg.swift:397:3:402:3 | TryExpr | 'TryExpr -V Block' | -| 398 | cfg.swift:398:5:398:24 | try | 'try -^ UnaryExpr' | +| 398 | cfg.swift:398:5:398:24 | UnaryExpr | 'UnaryExpr' | | 398 | cfg.swift:398:9:398:18 | mightThrow | 'mightThrow -> Argument -V 0 -^ CallExpr' | | 399 | cfg.swift:399:5:399:9 | print | 'print -> Argument -V "Did not throw." -^ CallExpr' | -| 400 | cfg.swift:400:10:400:19 | mightThrow | 'mightThrow -> Argument -V 0 -^ CallExpr -^ try! -^ UnaryExpr' | +| 400 | cfg.swift:400:10:400:19 | mightThrow | 'mightThrow -> Argument -V 0 -^ CallExpr -^ UnaryExpr' | | 401 | cfg.swift:401:5:401:9 | print | 'print -> Argument -V "Still did not throw." -^ CallExpr' | | 403 | cfg.swift:403:10:403:10 | 0 | '0 -^ ReturnExpr' | | 406 | cfg.swift:406:1:415:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V Structors' | | 407 | cfg.swift:407:3:407:16 | VariableDeclaration | 'VariableDeclaration -V field -> Int' | | 408 | cfg.swift:408:3:410:3 | Block | 'Block' | | 408 | cfg.swift:408:3:410:3 | ConstructorDeclaration | 'ConstructorDeclaration' | -| 409 | cfg.swift:409:5:409:9 | field | 'field -> = -> 10 -^ BinaryExpr' | +| 409 | cfg.swift:409:5:409:9 | field | 'field -> 10 -^ BinaryExpr' | | 412 | cfg.swift:412:3:414:3 | Block | 'Block' | | 412 | cfg.swift:412:3:414:3 | DestructorDeclaration | 'DestructorDeclaration' | -| 413 | cfg.swift:413:5:413:9 | field | 'field -> = -> 0 -^ BinaryExpr' | +| 413 | cfg.swift:413:5:413:9 | field | 'field -> 0 -^ BinaryExpr' | | 417 | cfg.swift:417:1:419:1 | FunctionDeclaration | 'FunctionDeclaration' | | 417 | cfg.swift:417:24:417:24 | x | 'x -> y -^ Block' | | 418 | cfg.swift:418:10:418:25 | MapLiteral | 'MapLiteral -^ ReturnExpr' | @@ -346,12 +346,12 @@ | 423 | cfg.swift:423:5:423:14 | VariableDeclaration | 'VariableDeclaration -V x -> Int' | | 424 | cfg.swift:424:5:426:5 | Block | 'Block' | | 424 | cfg.swift:424:5:426:5 | ConstructorDeclaration | 'ConstructorDeclaration' | -| 425 | cfg.swift:425:7:425:7 | x | 'x -> = -> 10 -^ BinaryExpr' | +| 425 | cfg.swift:425:7:425:7 | x | 'x -> 10 -^ BinaryExpr' | | 429 | cfg.swift:429:3:434:3 | ClassLikeDeclaration | 'ClassLikeDeclaration -V MyLocalStruct' | | 430 | cfg.swift:430:5:430:14 | VariableDeclaration | 'VariableDeclaration -V x -> Int' | | 431 | cfg.swift:431:5:433:5 | Block | 'Block' | | 431 | cfg.swift:431:5:433:5 | ConstructorDeclaration | 'ConstructorDeclaration' | -| 432 | cfg.swift:432:7:432:7 | x | 'x -> = -> 10 -^ BinaryExpr' | +| 432 | cfg.swift:432:7:432:7 | x | 'x -> 10 -^ BinaryExpr' | | 436 | cfg.swift:436:3:439:3 | ClassLikeDeclaration | 'ClassLikeDeclaration -V MyLocalEnum' | | 437 | cfg.swift:437:10:437:10 | VariableDeclaration | 'VariableDeclaration -V A' | | 438 | cfg.swift:438:10:438:10 | VariableDeclaration | 'VariableDeclaration -V B' | @@ -386,19 +386,19 @@ | 498 | cfg.swift:498:3:498:11 | VariableDeclaration | 'VariableDeclaration -V x -> 0' | | 500 | cfg.swift:500:3:502:3 | IfExpr | 'IfExpr -V ' | | 500 | cfg.swift:500:30:502:3 | Block | 'Block' | -| 501 | cfg.swift:501:5:501:5 | x | 'x -> += -> 1 -^ BinaryExpr' | +| 501 | cfg.swift:501:5:501:5 | x | 'x -> 1 -^ BinaryExpr' | | 504 | cfg.swift:504:3:506:3 | IfExpr | 'IfExpr -V ' | | 504 | cfg.swift:504:33:506:3 | Block | 'Block' | -| 505 | cfg.swift:505:5:505:5 | x | 'x -> += -> 1 -^ BinaryExpr' | +| 505 | cfg.swift:505:5:505:5 | x | 'x -> 1 -^ BinaryExpr' | | 508 | cfg.swift:508:3:510:3 | IfExpr | 'IfExpr -V ' | | 508 | cfg.swift:508:49:510:3 | Block | 'Block' | -| 509 | cfg.swift:509:5:509:5 | x | 'x -> += -> 1 -^ BinaryExpr' | +| 509 | cfg.swift:509:5:509:5 | x | 'x -> 1 -^ BinaryExpr' | | 512 | cfg.swift:512:3:514:3 | GuardIfStmt | 'GuardIfStmt -V -> Block' | -| 513 | cfg.swift:513:5:513:5 | x | 'x -> += -> 1 -^ BinaryExpr' | +| 513 | cfg.swift:513:5:513:5 | x | 'x -> 1 -^ BinaryExpr' | | 516 | cfg.swift:516:3:519:3 | IfExpr | 'IfExpr -V BinaryExpr -V ' | | 517 | cfg.swift:517:7:517:27 | | '' | | 517 | cfg.swift:517:29:519:3 | Block | 'Block' | -| 518 | cfg.swift:518:5:518:5 | x | 'x -> += -> 1 -^ BinaryExpr' | +| 518 | cfg.swift:518:5:518:5 | x | 'x -> 1 -^ BinaryExpr' | | 521 | cfg.swift:521:10:521:10 | x | 'x -^ ReturnExpr' | | 524 | cfg.swift:524:1:538:1 | Block | 'Block' | | 524 | cfg.swift:524:1:538:1 | FunctionDeclaration | 'FunctionDeclaration' | @@ -407,7 +407,7 @@ | 526 | cfg.swift:526:9:526:20 | continuation | 'continuation' | | 527 | cfg.swift:527:13:527:16 | Task | 'Task -^ MemberAccessExpr -^ Argument -V FunctionExpr -^ CallExpr' | | 527 | cfg.swift:527:27:532:13 | Block | 'Block' | -| 528 | cfg.swift:528:17:530:17 | ForEachStmt | 'ForEachStmt -V 1 -> ... -> 100 -^ BinaryExpr' | +| 528 | cfg.swift:528:17:530:17 | ForEachStmt | 'ForEachStmt -V 1 -> 100 -^ BinaryExpr' | | 528 | cfg.swift:528:21:528:21 | i | 'i -> Block' | | 529 | cfg.swift:529:21:529:32 | continuation | 'continuation -^ MemberAccessExpr -> Argument -V i -^ CallExpr' | | 531 | cfg.swift:531:17:531:28 | continuation | 'continuation -^ MemberAccessExpr -^ CallExpr' | @@ -455,10 +455,10 @@ | 585 | cfg.swift:585:23:585:23 | x | 'x -^ Block' | | 586 | cfg.swift:586:3:589:3 | VariableDeclaration | 'VariableDeclaration -V a -> SwitchExpr -V x' | | 587 | cfg.swift:587:5:587:17 | Block | 'Block -V 1' | -| 587 | cfg.swift:587:5:587:17 | SwitchCase | 'SwitchCase -V 0 -> ..< -> 5 -^ BinaryExpr' | +| 587 | cfg.swift:587:5:587:17 | SwitchCase | 'SwitchCase -V 0 -> 5 -^ BinaryExpr' | | 588 | cfg.swift:588:5:588:14 | SwitchCase | 'SwitchCase -V Block -V 2' | | 590 | cfg.swift:590:3:592:18 | VariableDeclaration | 'VariableDeclaration -V b' | -| 591 | cfg.swift:591:9:592:18 | IfExpr | 'IfExpr -V x -> < -> 42 -^ BinaryExpr' | +| 591 | cfg.swift:591:9:592:18 | IfExpr | 'IfExpr -V x -> 42 -^ BinaryExpr' | | 591 | cfg.swift:591:21:591:25 | Block | 'Block -V 1' | | 592 | cfg.swift:592:14:592:18 | Block | 'Block -V 2' | | 596 | cfg.swift:596:1:598:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V ValueGenericsStruct -> TypeParameter -V N -> Int' | @@ -467,4 +467,4 @@ | 600 | cfg.swift:600:36:600:40 | value | 'value -^ Block' | | 601 | cfg.swift:601:5:601:13 | VariableDeclaration | 'VariableDeclaration -V x -> N' | | 602 | cfg.swift:602:5:602:9 | print | 'print -> Argument -V x -^ CallExpr' | -| 603 | cfg.swift:603:5:603:5 | _ | '_ -> = -> value -^ BinaryExpr' | +| 603 | cfg.swift:603:5:603:5 | _ | '_ -> value -^ BinaryExpr' | diff --git a/unified/ql/test/library-tests/controlflow/cfg.expected b/unified/ql/test/library-tests/controlflow/cfg.expected index d5b76b70bd47..5b6709fc8968 100644 --- a/unified/ql/test/library-tests/controlflow/cfg.expected +++ b/unified/ql/test/library-tests/controlflow/cfg.expected @@ -5,7 +5,7 @@ bbContinues | cfg.swift:526:9:526:20 | continuation | 'continuation goto Block(-1)' | bbStep | cfg.swift:30:9:30:24 | CallExpr | 'CallExpr : exception -> CatchClause(+5)' | -| cfg.swift:30:9:30:24 | CallExpr | 'CallExpr : successor -> try(+0)' | +| cfg.swift:30:9:30:24 | CallExpr | 'CallExpr : successor -> UnaryExpr(+0)' | | cfg.swift:33:5:33:33 | CallExpr | 'CallExpr : successor -> 0(+11)' | | cfg.swift:35:5:35:5 | OrPattern | 'OrPattern : match -> Block(+0)' | | cfg.swift:35:5:35:5 | OrPattern | 'OrPattern : no-match -> CatchClause(+2)' | @@ -91,7 +91,7 @@ bbStep | cfg.swift:360:3:360:3 | WhileStmt | 'WhileStmt : successor -> x(+0)' | | cfg.swift:360:9:360:14 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | | cfg.swift:361:5:361:10 | BinaryExpr | 'BinaryExpr : successor -> x(-1)' | -| cfg.swift:398:9:398:24 | CallExpr | 'CallExpr : successor -> try(+0)' | +| cfg.swift:398:9:398:24 | CallExpr | 'CallExpr : successor -> UnaryExpr(+0)' | | cfg.swift:500:6:500:28 | | ' : false -> IfExpr(+4)' | | cfg.swift:500:6:500:28 | | ' : true -> Block(+0)' | | cfg.swift:501:5:501:10 | BinaryExpr | 'BinaryExpr : successor -> IfExpr(+3)' | @@ -158,7 +158,6 @@ noCfg nonSimple | cfg.swift:10:1:10:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V MyError -^ BaseType -V Error' | | cfg.swift:35:5:35:5 | CatchClause | 'CatchClause -V MyError -^ MemberAccessExpr -> isZero -> Argument -V x -^ CallExpr -? MyError -^ MemberAccessExpr -^ ConditionalPattern -^ OrPattern' | -| cfg.swift:209:5:209:5 | x | 'x -> = -> x -? - -^ UnaryExpr -^ BinaryExpr' | | cfg.swift:390:1:390:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V Derived -^ BaseType -V C' | | cfg.swift:527:13:527:16 | Task | 'Task -^ MemberAccessExpr -^ Argument -V FunctionExpr -^ CallExpr' | | cfg.swift:569:1:569:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V MyProcotolImpl -^ BaseType -V MyProtocol' | diff --git a/unified/ql/test/library-tests/controlflow/cfg.swift b/unified/ql/test/library-tests/controlflow/cfg.swift index c7c96c1f1716..2c3a2fa68a0c 100644 --- a/unified/ql/test/library-tests/controlflow/cfg.swift +++ b/unified/ql/test/library-tests/controlflow/cfg.swift @@ -27,7 +27,7 @@ func mightThrow(x : Int) throws -> Void { func tryCatch(x : Int) -> Int { do { - try mightThrow(x: 0) // $ bbStep='CallExpr : exception -> CatchClause(+5)' bbStep='CallExpr : successor -> try(+0)' + try mightThrow(x: 0) // $ bbStep='CallExpr : exception -> CatchClause(+5)' bbStep='CallExpr : successor -> UnaryExpr(+0)' print("Did not throw.") try! mightThrow(x: 0) print("Still did not throw.") // $ bbStep='CallExpr : successor -> 0(+11)' @@ -206,7 +206,7 @@ func m2(b : Bool) -> Int { func m3(x : inout Int) -> Int { if x < 0 { // $ bbStep='BinaryExpr : true -> Block(+0)' bbStep='BinaryExpr : false -> x(+6)' - x = -x // $ nonSimple='x -> = -> x -? - -^ UnaryExpr -^ BinaryExpr' + x = -x if x > 10 { // $ bbStep='BinaryExpr : true -> Block(+0)' bbStep='BinaryExpr : false -> x(+4)' x = x - 1 // $ bbStep='BinaryExpr : successor -> x(+3)' } @@ -395,7 +395,7 @@ class Derived : C { // $ nonSimple='ClassLikeDeclaration -V Derived -^ BaseType func doWithoutCatch(x : Int) throws -> Int { do { - try mightThrow(x: 0) // $ bbStep='CallExpr : successor -> try(+0)' + try mightThrow(x: 0) // $ bbStep='CallExpr : successor -> UnaryExpr(+0)' print("Did not throw.") try! mightThrow(x: 0) print("Still did not throw.") From b78173792c9e5b728e3fc65237eb4ea567989d66 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 17 Sep 2026 13:07:21 +0200 Subject: [PATCH 1116/2098] Unified: Support capture declarations in the CFG. --- unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll | 2 ++ .../test/library-tests/controlflow/basicblock-slices.expected | 2 +- unified/ql/test/library-tests/controlflow/cfg.expected | 1 - unified/ql/test/library-tests/controlflow/cfg.swift | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll index 42aa8bf5439d..19643cb2b591 100644 --- a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll @@ -40,6 +40,8 @@ private module Ast implements AstSig { not n instanceof Callable and not skipControlFlow(n) and not skipControlFlow(result) + or + n.(FunctionExpr).getCaptureDeclaration(index) = result } Callable getEnclosingCallable(AstNode node) { result = node.getEnclosingCallable() } diff --git a/unified/ql/test/library-tests/controlflow/basicblock-slices.expected b/unified/ql/test/library-tests/controlflow/basicblock-slices.expected index f167b4d76038..20afbd17472e 100644 --- a/unified/ql/test/library-tests/controlflow/basicblock-slices.expected +++ b/unified/ql/test/library-tests/controlflow/basicblock-slices.expected @@ -311,7 +311,7 @@ | 380 | cfg.swift:380:1:384:1 | FunctionDeclaration | 'FunctionDeclaration' | | 380 | cfg.swift:380:18:380:18 | x | 'x -> y -^ Block' | | 381 | cfg.swift:381:10:383:3 | Block | 'Block' | -| 381 | cfg.swift:381:10:383:3 | FunctionExpr | 'FunctionExpr -^ ReturnExpr' | +| 381 | cfg.swift:381:13:381:22 | VariableDeclaration | 'VariableDeclaration -V z -> x -> y -^ BinaryExpr -> VariableDeclaration -V t -> "literal" -^ FunctionExpr -^ ReturnExpr' | | 382 | cfg.swift:382:12:382:12 | z | 'z -^ ReturnExpr' | | 386 | cfg.swift:386:1:388:1 | FunctionDeclaration | 'FunctionDeclaration' | | 386 | cfg.swift:386:23:386:23 | t | 't -^ Block' | diff --git a/unified/ql/test/library-tests/controlflow/cfg.expected b/unified/ql/test/library-tests/controlflow/cfg.expected index 5b6709fc8968..59e18dafb648 100644 --- a/unified/ql/test/library-tests/controlflow/cfg.expected +++ b/unified/ql/test/library-tests/controlflow/cfg.expected @@ -149,7 +149,6 @@ noCfg | cfg.swift:358:6:358:28 | loop_with_identity_expr | | cfg.swift:371:8:371:18 | getOptional | | cfg.swift:380:45:380:47 | Int | -| cfg.swift:381:13:381:13 | z | | cfg.swift:421:6:421:22 | localDeclarations | | cfg.swift:468:6:468:17 | testIfConfig | | cfg.swift:497:6:497:18 | testAvailable | diff --git a/unified/ql/test/library-tests/controlflow/cfg.swift b/unified/ql/test/library-tests/controlflow/cfg.swift index 2c3a2fa68a0c..9c6c57c105c2 100644 --- a/unified/ql/test/library-tests/controlflow/cfg.swift +++ b/unified/ql/test/library-tests/controlflow/cfg.swift @@ -378,7 +378,7 @@ func testOptional(c : OptionalC?) -> Int? { } func testCapture(x : Int, y : Int) -> () -> Int { // $ noCfg - return { [z = x + y, t = "literal"] in // $ noCfg + return { [z = x + y, t = "literal"] in return z } } From 0e4a06b347e1cb769cbb5a90ccc559d33f420e91 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 17 Sep 2026 13:37:28 +0200 Subject: [PATCH 1117/2098] Unified: Support swift GuardIfStmt in CFG. --- .../lib/codeql/unified/internal/ControlFlowGraph.qll | 8 +++----- .../controlflow/basicblock-slices.expected | 9 +++++++-- unified/ql/test/library-tests/controlflow/cfg.expected | 8 ++++++-- unified/ql/test/library-tests/controlflow/cfg.swift | 10 +++++----- 4 files changed, 21 insertions(+), 14 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll index 19643cb2b591..1c734fe737b5 100644 --- a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll @@ -75,14 +75,12 @@ private module Ast implements AstSig { Expr getExpr() { none() } } - class IfStmt extends Stmt { - IfStmt() { none() } - - Expr getCondition() { none() } + class IfStmt extends Stmt instanceof U::GuardIfStmt { + Expr getCondition() { result = super.getCondition() } Stmt getThen() { none() } - Stmt getElse() { none() } + Stmt getElse() { result = super.getElse() } } abstract class LoopStmt extends Stmt { diff --git a/unified/ql/test/library-tests/controlflow/basicblock-slices.expected b/unified/ql/test/library-tests/controlflow/basicblock-slices.expected index 20afbd17472e..f34783a37dc0 100644 --- a/unified/ql/test/library-tests/controlflow/basicblock-slices.expected +++ b/unified/ql/test/library-tests/controlflow/basicblock-slices.expected @@ -14,8 +14,12 @@ | 16 | cfg.swift:16:10:16:10 | x | 'x -> 0 -^ BinaryExpr -^ ReturnExpr' | | 19 | cfg.swift:19:1:26:1 | FunctionDeclaration | 'FunctionDeclaration' | | 19 | cfg.swift:19:17:19:17 | x | 'x -^ Block' | -| 20 | cfg.swift:20:3:22:3 | GuardIfStmt | 'GuardIfStmt -V x -> 0 -^ BinaryExpr -> Block' | +| 20 | cfg.swift:20:3:22:3 | GuardIfStmt | 'GuardIfStmt -V x -> 0 -^ BinaryExpr' | +| 20 | cfg.swift:20:21:22:3 | Block | 'Block' | | 21 | cfg.swift:21:11:21:17 | MyError | 'MyError -^ MemberAccessExpr -^ ThrowExpr' | +| 23 | cfg.swift:23:3:25:3 | GuardIfStmt | 'GuardIfStmt -V x -> 0 -^ BinaryExpr' | +| 23 | cfg.swift:23:21:25:3 | Block | 'Block' | +| 24 | cfg.swift:24:11:24:17 | MyError | 'MyError -^ MemberAccessExpr -> Argument -V x -> 1 -^ BinaryExpr -^ CallExpr -^ ThrowExpr' | | 28 | cfg.swift:28:1:45:1 | FunctionDeclaration | 'FunctionDeclaration' | | 28 | cfg.swift:28:15:28:15 | x | 'x -^ Block' | | 29 | cfg.swift:29:3:43:3 | TryExpr | 'TryExpr -V Block' | @@ -393,7 +397,8 @@ | 508 | cfg.swift:508:3:510:3 | IfExpr | 'IfExpr -V ' | | 508 | cfg.swift:508:49:510:3 | Block | 'Block' | | 509 | cfg.swift:509:5:509:5 | x | 'x -> 1 -^ BinaryExpr' | -| 512 | cfg.swift:512:3:514:3 | GuardIfStmt | 'GuardIfStmt -V -> Block' | +| 512 | cfg.swift:512:3:514:3 | GuardIfStmt | 'GuardIfStmt -V ' | +| 512 | cfg.swift:512:38:514:3 | Block | 'Block' | | 513 | cfg.swift:513:5:513:5 | x | 'x -> 1 -^ BinaryExpr' | | 516 | cfg.swift:516:3:519:3 | IfExpr | 'IfExpr -V BinaryExpr -V ' | | 517 | cfg.swift:517:7:517:27 | | '' | diff --git a/unified/ql/test/library-tests/controlflow/cfg.expected b/unified/ql/test/library-tests/controlflow/cfg.expected index 59e18dafb648..a97c8b8d74f9 100644 --- a/unified/ql/test/library-tests/controlflow/cfg.expected +++ b/unified/ql/test/library-tests/controlflow/cfg.expected @@ -4,6 +4,9 @@ bbContinues | cfg.swift:525:78:525:78 | Block | 'Block goto Task(+2)' | | cfg.swift:526:9:526:20 | continuation | 'continuation goto Block(-1)' | bbStep +| cfg.swift:20:9:20:14 | BinaryExpr | 'BinaryExpr : false -> Block(+0)' | +| cfg.swift:20:9:20:14 | BinaryExpr | 'BinaryExpr : true -> GuardIfStmt(+3)' | +| cfg.swift:23:9:23:14 | BinaryExpr | 'BinaryExpr : false -> Block(+0)' | | cfg.swift:30:9:30:24 | CallExpr | 'CallExpr : exception -> CatchClause(+5)' | | cfg.swift:30:9:30:24 | CallExpr | 'CallExpr : successor -> UnaryExpr(+0)' | | cfg.swift:33:5:33:33 | CallExpr | 'CallExpr : successor -> 0(+11)' | @@ -101,6 +104,9 @@ bbStep | cfg.swift:508:6:508:47 | | ' : false -> GuardIfStmt(+4)' | | cfg.swift:508:6:508:47 | | ' : true -> Block(+0)' | | cfg.swift:509:5:509:10 | BinaryExpr | 'BinaryExpr : successor -> GuardIfStmt(+3)' | +| cfg.swift:512:9:512:31 | | ' : false -> Block(+0)' | +| cfg.swift:512:9:512:31 | | ' : true -> IfExpr(+4)' | +| cfg.swift:513:5:513:10 | BinaryExpr | 'BinaryExpr : successor -> IfExpr(+3)' | | cfg.swift:516:6:516:28 | | ' : false,false -> x(+5)' | | cfg.swift:516:6:516:28 | | ' : true -> (+1)' | | cfg.swift:517:7:517:27 | | ' : false,false -> x(+4)' | @@ -126,8 +132,6 @@ bbStep | cfg.swift:591:13:591:18 | BinaryExpr | 'BinaryExpr : false -> Block(+1)' | | cfg.swift:591:13:591:18 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | noCfg -| cfg.swift:23:9:23:9 | x | -| cfg.swift:24:5:24:42 | ThrowExpr | | cfg.swift:47:42:47:47 | String | | cfg.swift:53:34:53:34 | _ | | cfg.swift:60:34:60:34 | _ | diff --git a/unified/ql/test/library-tests/controlflow/cfg.swift b/unified/ql/test/library-tests/controlflow/cfg.swift index 9c6c57c105c2..d40be313fc66 100644 --- a/unified/ql/test/library-tests/controlflow/cfg.swift +++ b/unified/ql/test/library-tests/controlflow/cfg.swift @@ -17,11 +17,11 @@ func isZero(x : Int) -> Bool { } func mightThrow(x : Int) throws -> Void { - guard x >= 0 else { + guard x >= 0 else { // $ bbStep='BinaryExpr : false -> Block(+0)' bbStep='BinaryExpr : true -> GuardIfStmt(+3)' throw MyError.error1 } - guard x <= 0 else { // $ noCfg - throw MyError.error3(withParam: x + 1) // $ noCfg + guard x <= 0 else { // $ bbStep='BinaryExpr : false -> Block(+0)' + throw MyError.error3(withParam: x + 1) } } @@ -509,8 +509,8 @@ func testAvailable() -> Int { // $ noCfg x += 1 // $ bbStep='BinaryExpr : successor -> GuardIfStmt(+3)' } - guard #available(macOS 12, *) else { - x += 1 + guard #available(macOS 12, *) else { // $ bbStep=' : false -> Block(+0)' bbStep=' : true -> IfExpr(+4)' + x += 1 // $ bbStep='BinaryExpr : successor -> IfExpr(+3)' } if #available(macOS 12, *), // $ bbStep=' : true -> (+1)' bbStep=' : false,false -> x(+5)' From 06ddaceaa20ca2dbb7f791270233b372aca163f6 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 18 Sep 2026 10:18:50 +0200 Subject: [PATCH 1118/2098] Bump `clang-format` from 17.0.6 to 20.1.8 17.0.6 dropped the spaces around `&&` in C++20 concept conjunctions, emitting `)&&!(`. 20.1.8 formats it correctly, which accounts for the reformat of `swift/extractor/infra/SwiftLocationExtractor.h`. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- swift/extractor/infra/SwiftLocationExtractor.h | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 37bd56bb11ee..fdbc68e86d7e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -12,7 +12,7 @@ repos: exclude: Cargo.lock$|/test([^/]*)/.*$(? concept HasLAndRParenLoc = requires(T e) { e.getLParenLoc(); e.getRParenLoc(); -} && !(HasSourceRange)&&!(HasStartAndEndLoc); +} && !(HasSourceRange) && !(HasStartAndEndLoc); template -concept HasOneLoc = requires(T e) { e.getLoc(); } && !(HasSourceRange)&&(!HasStartAndEndLoc); +concept HasOneLoc = + requires(T e) { e.getLoc(); } && !(HasSourceRange) && (!HasStartAndEndLoc); template concept HasOneLocField = requires(T e) { e.Loc; }; From ed68b0ebcefab5f7baff29021b70fe4eb69c6687 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Fri, 18 Sep 2026 10:57:31 +0200 Subject: [PATCH 1119/2098] Rust: Do not generate `toStringImpl` when manual definition exists --- misc/codegen/generators/qlgen.py | 17 +- misc/codegen/test/test_qlgen.py | 12 ++ rust/ql/.generated.list | 160 +++++++++--------- .../internal/generated/ArrayListExpr.qll | 2 - .../internal/generated/ArrayRepeatExpr.qll | 2 - .../elements/internal/generated/AwaitExpr.qll | 2 - .../internal/generated/BecomeExpr.qll | 2 - .../internal/generated/BinaryExpr.qll | 2 - .../elements/internal/generated/BoxPat.qll | 2 - .../elements/internal/generated/BreakExpr.qll | 2 - .../elements/internal/generated/CallExpr.qll | 2 - .../elements/internal/generated/CastExpr.qll | 2 - .../internal/generated/ClosureExpr.qll | 2 - .../elements/internal/generated/Comment.qll | 2 - .../elements/internal/generated/Const.qll | 2 - .../internal/generated/ContinueExpr.qll | 2 - .../elements/internal/generated/Crate.qll | 2 - .../rust/elements/internal/generated/Enum.qll | 2 - .../internal/generated/ExtractorStep.qll | 2 - .../elements/internal/generated/FieldExpr.qll | 2 - .../elements/internal/generated/ForBinder.qll | 2 - .../elements/internal/generated/Format.qll | 2 - .../internal/generated/FormatArgument.qll | 2 - .../FormatTemplateVariableAccess.qll | 2 - .../elements/internal/generated/Function.qll | 2 - .../internal/generated/GenericArgList.qll | 2 - .../internal/generated/GenericParamList.qll | 2 - .../elements/internal/generated/IdentPat.qll | 2 - .../elements/internal/generated/IfExpr.qll | 2 - .../rust/elements/internal/generated/Impl.qll | 2 - .../internal/generated/ImplTraitTypeRepr.qll | 2 - .../elements/internal/generated/IndexExpr.qll | 2 - .../internal/generated/InferTypeRepr.qll | 2 - .../elements/internal/generated/Label.qll | 2 - .../elements/internal/generated/LetElse.qll | 2 - .../elements/internal/generated/LetExpr.qll | 2 - .../elements/internal/generated/LetStmt.qll | 2 - .../elements/internal/generated/Lifetime.qll | 2 - .../internal/generated/LiteralExpr.qll | 2 - .../internal/generated/LiteralPat.qll | 2 - .../elements/internal/generated/MacroCall.qll | 2 - .../elements/internal/generated/MatchArm.qll | 2 - .../elements/internal/generated/MatchExpr.qll | 2 - .../internal/generated/MethodCallExpr.qll | 2 - .../elements/internal/generated/Module.qll | 2 - .../rust/elements/internal/generated/Name.qll | 2 - .../elements/internal/generated/NameRef.qll | 2 - .../internal/generated/NeverTypeRepr.qll | 2 - .../elements/internal/generated/OrPat.qll | 2 - .../elements/internal/generated/Param.qll | 2 - .../elements/internal/generated/ParenExpr.qll | 2 - .../elements/internal/generated/ParenPat.qll | 2 - .../internal/generated/ParenTypeRepr.qll | 2 - .../rust/elements/internal/generated/Path.qll | 2 - .../elements/internal/generated/PathExpr.qll | 2 - .../elements/internal/generated/PathPat.qll | 2 - .../internal/generated/PathSegment.qll | 2 - .../internal/generated/PathTypeRepr.qll | 2 - .../internal/generated/PrefixExpr.qll | 2 - .../elements/internal/generated/RangeExpr.qll | 2 - .../elements/internal/generated/RefExpr.qll | 2 - .../elements/internal/generated/RefPat.qll | 2 - .../elements/internal/generated/RestPat.qll | 2 - .../internal/generated/ReturnExpr.qll | 2 - .../elements/internal/generated/Static.qll | 2 - .../elements/internal/generated/Struct.qll | 2 - .../internal/generated/StructExpr.qll | 2 - .../internal/generated/StructExprField.qll | 2 - .../internal/generated/StructField.qll | 2 - .../elements/internal/generated/StructPat.qll | 2 - .../internal/generated/StructPatField.qll | 2 - .../elements/internal/generated/Trait.qll | 2 - .../internal/generated/TupleStructPat.qll | 2 - .../elements/internal/generated/TypeAlias.qll | 2 - .../internal/generated/TypeBoundList.qll | 2 - .../elements/internal/generated/TypeParam.qll | 2 - .../internal/generated/UnderscoreExpr.qll | 2 - .../elements/internal/generated/Union.qll | 2 - .../rust/elements/internal/generated/Use.qll | 2 - .../elements/internal/generated/UseTree.qll | 2 - .../elements/internal/generated/Variant.qll | 2 - .../internal/generated/Visibility.qll | 2 - .../internal/generated/WildcardPat.qll | 2 - 83 files changed, 106 insertions(+), 243 deletions(-) diff --git a/misc/codegen/generators/qlgen.py b/misc/codegen/generators/qlgen.py index 30059f9c93b4..2b836b2706d8 100755 --- a/misc/codegen/generators/qlgen.py +++ b/misc/codegen/generators/qlgen.py @@ -83,6 +83,8 @@ def _humanize(s: str) -> str: _format_re = re.compile(r"\{(\w+)\}") +# Regular expression to find manual `toStringImpl`s +_to_string_impl_re = re.compile(r"\bstring\s+toStringImpl\s*\(") def _get_doc(cls: schema.Class, prop: schema.Property, plural=None): @@ -117,6 +119,7 @@ def _get_doc(cls: schema.Class, prop: schema.Property, plural=None): @dataclasses.dataclass class Resolver: lookup: typing.Dict[str, schema.ClassBase] + custom_to_string_impls: typing.Set[str] = dataclasses.field(default_factory=set) _property_cache: typing.Dict[tuple[int, int], ql.Property] = dataclasses.field( default_factory=dict, init=False ) @@ -239,7 +242,8 @@ def get_ql_class(self, cls: schema.Class) -> ql.Class: cfg=cls.cfg, to_string_impl_from_primary_class=bool( cls.pragmas.get("ql_to_string_impl_from_primary_class") - ), + ) + and cls.name not in self.custom_to_string_impls, ) return self._class_cache[cache_key] @@ -499,7 +503,15 @@ def generate(opts, renderer): data = schemaloader.load_file(input) - resolver = Resolver(data.classes) + # Schema class names whose wrapper define a manual `toStringImpl` + custom_to_string_impls = { + cls.name + for cls in data.classes.values() + if not cls.imported + and (stub_out / _get_path_impl(cls)).is_file() + and _to_string_impl_re.search((stub_out / _get_path_impl(cls)).read_text()) + } + resolver = Resolver(data.classes, custom_to_string_impls) classes = { name: resolver.get_ql_class(cls) @@ -525,7 +537,6 @@ def generate(opts, renderer): with renderer.manage( generated=generated, stubs=stubs, registry=registry, force=opts.force ) as renderer: - db_classes = [ cls for name, cls in classes.items() if not data.classes[name].synth ] diff --git a/misc/codegen/test/test_qlgen.py b/misc/codegen/test/test_qlgen.py index 226011a2924f..7e5bce3a06c1 100644 --- a/misc/codegen/test/test_qlgen.py +++ b/misc/codegen/test/test_qlgen.py @@ -237,6 +237,18 @@ def test_to_string_impl_from_primary_class(generate_classes): } +def test_to_string_impl_from_primary_class_is_not_generated_when_custom(): + cls = schema.Class( + "A", + pragmas={"ql_to_string_impl_from_primary_class": True}, + ) + # Pass `A` as a class with a custom `toStringImpl` + resolver = qlgen.Resolver({"A": cls}, {"A"}) + + # Resolving `A` gives a class where `to_string_impl_from_primary_class` does not hold. + assert not resolver.get_ql_class(cls).to_string_impl_from_primary_class + + def test_one_empty_internal_class(generate_classes): assert generate_classes([schema.Class("A", pragmas=["ql_internal"])]) == { "A.qll": ( diff --git a/rust/ql/.generated.list b/rust/ql/.generated.list index 53e249477270..fb3ebc6caf1d 100644 --- a/rust/ql/.generated.list +++ b/rust/ql/.generated.list @@ -488,8 +488,8 @@ lib/codeql/rust/elements/internal/generated/Addressable.qll 624c380d385af6563885 lib/codeql/rust/elements/internal/generated/ArgList.qll 7e2b7dbccc506fb5df7b85885ce1c9cadfc98d98cd8c291d84bd3a0d67fdd577 a8fe85d1bfeb9786fc6179b6cc7f783168162f1ae6aa100db9cfd210af43b043 lib/codeql/rust/elements/internal/generated/ArrayExpr.qll 73806a0de8168b38a9436fa6b8c6d68c92eeab3d64a1ae7edfff82f871929992 7ad998cdd8f4fed226473517ad7a5765cb35608033047aad53bf8aa3969fd03b lib/codeql/rust/elements/internal/generated/ArrayExprInternal.qll 6cd054e7ced15ad3917d87e07afe4547cda9ee1d76fc25c6d2b8c1980f297802 22b099201d05b0846a831d15bd8db700982b5aa3b3f011c5dc617eeb4b3e38d9 -lib/codeql/rust/elements/internal/generated/ArrayListExpr.qll 274b0348797662d1983376272a9763b86c22890e7ac088f62ef6d0a4b63d0934 925b5e96539f4936a5d20fe5cee08792d95f1b60011f83a14814842d84ff332e -lib/codeql/rust/elements/internal/generated/ArrayRepeatExpr.qll 05a88ea3d433484604da402bcd8c9065d2d93c7ef33f4a3882cd31c107637557 829455e80f0e4dfa1fc9ca3810e6d2a0a8398b1e32687361c5531a18b21b0452 +lib/codeql/rust/elements/internal/generated/ArrayListExpr.qll f325163c2bd401286305330482bee20d060cecd24afa9e49deab7ba7e72ca056 ae3f5b303e31fc6c48b38172304ee8dcf3af2b2ba693767824ea8a944b6be0eb +lib/codeql/rust/elements/internal/generated/ArrayRepeatExpr.qll ac2035488d5b9328f01ce2dd5bd7598e3af1cbb383ddb48b648e1e8908ea82fc 3ec910b184115fb3750692287e8039560e20bd6a5fb26ac1f9c346424d8eaa48 lib/codeql/rust/elements/internal/generated/ArrayTypeRepr.qll 9bd3ead45e102631eb77f7597667833a92eeb18d89254e0be62d7050ecbf24a3 9381025db82c59a8af6bc1c804cd45380f955f6c49004d1dbf67c579e25b40eb lib/codeql/rust/elements/internal/generated/AsmClobberAbi.qll c727e486378e6d8d0c48155143b6842a1e13d1b4fe9c44e45b76cdb73c24d3a0 0107e1505d5c11e8fa86eb4ee30cb47583e6e978725db6cd07b150e525bea418 lib/codeql/rust/elements/internal/generated/AsmConst.qll 56d180e14aa90537b0a0a9c22bc684c23b9e30bebdc955979419655f9c61dd1d 1d7f4387f0282651af1e2ee789395d56d1074328f496db91e5b747f5aef9413d @@ -510,189 +510,189 @@ lib/codeql/rust/elements/internal/generated/AssocItemList.qll a572d291a79a167883 lib/codeql/rust/elements/internal/generated/AssocTypeArg.qll 0f5bd621dda4c3869f05df713b3c4f64a257ccf0b95f8bd61506ec9922cfb2f7 0661102323b0200ea310a38fd86b9dd32b67b3f48b9a248e0f5bd0b9dfb05513 lib/codeql/rust/elements/internal/generated/AstNode.qll 1cbfae6a732a1de54b56669ee69d875b0e1d15e58d9aa621df9337c59db5619d 37e16a0c70ae69c5dc1b6df241b9acca96a6326d6cca15456699c44a81c93666 lib/codeql/rust/elements/internal/generated/Attr.qll 691bdafd73d52767bbebcbffd2d9a4aa46b8589c037928228f789dcdb3f6cdd7 ce9375c5386b60b7ce5f39b834c017f206990ca27f528acf3a7e47ee971795f6 -lib/codeql/rust/elements/internal/generated/AwaitExpr.qll a3e64fd0749d054eeddb89a807e04fc0f42da3eb35921ae438a3e8adbf92e128 e8beb70d9449d16547877d30b8502bb1f8789490ecb17690bd05b9aa2f97aad1 -lib/codeql/rust/elements/internal/generated/BecomeExpr.qll 3c27168c14246689b34fcf26f6e2e5d2ce6ab7333464d89718dd325fd4e79082 4a11be8a21ec89c6660167f194d55c16d0bf27f21072547e15a91679cc28d179 -lib/codeql/rust/elements/internal/generated/BinaryExpr.qll aabea18b82da6745b05c5d4d52ce0d8879b4cd9db8140ebece87e2724d368a56 5717f0467a3a361adb5d0a64cc1713a37aee2d7f71be3ceadc2a42590778794e +lib/codeql/rust/elements/internal/generated/AwaitExpr.qll 1d71af702a1f397fb231fae3e0642b3deeba0cd5a43c1d8fabdff29cac979340 e0bfa007bdecc5a09a266d449d723ae35f5a24fbdfc11e4e48aeea3ec0c5147c +lib/codeql/rust/elements/internal/generated/BecomeExpr.qll 7a211b785a4a2f961242d1d73fd031d381aad809f7b600ce7f7f864518bb7242 17a0388680007871748cfdc6621f700a7c2817b9601e1bd817fb48561e7c63ad +lib/codeql/rust/elements/internal/generated/BinaryExpr.qll 64e9bd9c571edd6e5f3e7662b956b1d87fa0354ce6fe95da9caf25ac16b66c68 3fca09fdbe879db2ca3293618896a462e96376a2963d15cce3d5b1baac552fcb lib/codeql/rust/elements/internal/generated/BlockExpr.qll db813fa05eace9769ba2a51bb38c17e58d621cc31cbf88ee8186c23e3734467c 3a2804490c2bdfccfd2b18c2d4c6cd6edefc375a0a7463120a43212d22ce7513 -lib/codeql/rust/elements/internal/generated/BoxPat.qll d8724f3e861b5df17064488f5245a530d5fb790b6829161ff85169624b47708e 12c353ab15d1a936027a8ca53ac6bb3bdba836ed31ba1140970024da52d60836 -lib/codeql/rust/elements/internal/generated/BreakExpr.qll 7866f0e4ac808124c20cb058bd220bcb691fb0a4ce41be348086099e0cb62abf 90eb2f4293314e7663f19642794d863621b0312972a8c49f0b865cb8b23337cb -lib/codeql/rust/elements/internal/generated/CallExpr.qll 999bc9e603471757adb4c917c9403fa786b992e217973e64579981c106ea5abe b65062f26359998a45b9807bb94dd07c935ee2a754495a37997dd269db43b39a +lib/codeql/rust/elements/internal/generated/BoxPat.qll 597bed52f7489e0addce3266f7bee5be7c53d2d1263eceec3a252d041ca0908f b8ccf363ca5f1a988547caf1fd266a55aec7cbf8623578deea99765d264b0151 +lib/codeql/rust/elements/internal/generated/BreakExpr.qll 0f428a8b2f4209b134c2ffc3e1c93c30bc6b0e9c9172f140cefa88c1f77d8690 957b39f38ff6befe9061f55bc0b403c2f1c366dd0cf63b874bae6f8216576d76 +lib/codeql/rust/elements/internal/generated/CallExpr.qll 6096035ba2ef1ce3e6254d5b8497dcb6cd7570253423c778a9dd7e158f928644 e56caf9ba094ddfc4952ed5072c5f6f139db8029fa6bd6328d1a118e96a1d5fe lib/codeql/rust/elements/internal/generated/Callable.qll 12368b998c771c6b80f54123cea4d3600af7432ab34c9e571bc0bf3894ceb17e 273a9fd9cdae56cf2edbdc9c49b15da49cd5ad04be70acbbe2475c9c50200183 -lib/codeql/rust/elements/internal/generated/CastExpr.qll 064a1ee797dcd9943f98fbb04d09e8bd00b5c3a7d7276616d1f92d5b3f68d419 b2676abdf091ac1397a918458238d5bb6d9abdb28119763510689e798becb70e +lib/codeql/rust/elements/internal/generated/CastExpr.qll ddc20054b0b339ad4d40298f3461490d25d00af87c876da5ffbc6a11c0832295 f4247307afcd74d80e926f29f8c57e78c50800984483e6b6003a44681e4a71f3 lib/codeql/rust/elements/internal/generated/CfgAtom.qll 1b7672e06fe19c7ba484937c3101ff7f5a48fc19e8fff2cb5ecbffc6fce612bc 6dacd084ed0110cc477881fd0f709c6c996ec8a038549bf885a0abb21261bb1d lib/codeql/rust/elements/internal/generated/CfgAttrMeta.qll 4531aaa627f4d44787970f18dfe30b957f51d83ab2396bac436563c40d144ca9 1731ecd335431b0a2ec70403dc1ad7bce1f8e171a4d6b575d340f1d683fa6c92 lib/codeql/rust/elements/internal/generated/CfgComposite.qll 4f30fa0495381774cd7993a38e1fbe94dff63a5742e8b836bbc35987b746df1a 595ff31b5990845085bbb963ba408dd1246aed1952bee2836ad9d92a1da6e4c7 lib/codeql/rust/elements/internal/generated/CfgMeta.qll 7fd8ee49428da70ba1e52bf9017bbe30b690443c26147c77aa9bcffd7d09338d ec4d34dbd1e7ca412ce3d242f1bd6695a5fe9f263d5bc68ce12610facedf3e93 lib/codeql/rust/elements/internal/generated/CfgPredicate.qll 736fe7385e2af5bb86c349bb1b8dd030aef191541f6af24694e3c460b8272f61 4117ee073683eb5fb81bae9e7e49b4ad0991cfcb53e0b7b4160199931a300632 -lib/codeql/rust/elements/internal/generated/ClosureExpr.qll f944d5177321c2559f6ed8851d442e32bf32192bc537791df0725a40581c8f99 e96154132759073a6fd9ddd0b6c8a1ff98a1b6d269b691fc863e1f10045a9437 -lib/codeql/rust/elements/internal/generated/Comment.qll 658d7dfe05500c8c57d5d1794f2a1322a0660cc1ec1fcdc09b06ca71141c628d 1912224023048117b9320f2e713f7ed8fdfc18d5c2dcfb7077621c3b0753cfcd -lib/codeql/rust/elements/internal/generated/Const.qll b29908cf0ef649c48fc48fc64e5df3a4e8c254c03ec32b2ec84cb5ffff72974a 9377e3d91bed4fbe3a0bef10254b8e8f42ce6232e195d2ee6a384002bf6f1089 +lib/codeql/rust/elements/internal/generated/ClosureExpr.qll 818aff75d86821c670d8ba0720c3270681b3e070140a9c41beab2a811b43eee6 9bf2d1d38f6c4a99d7c058f8ed096141f5ba6a75d2d26a464f0d65ed4e554222 +lib/codeql/rust/elements/internal/generated/Comment.qll cd1ef861e3803618f9f78a4ac00516d50ecfecdca1c1d14304dc5327cbe07a3b 8b67345aeb15beb5895212228761ea3496297846c93fd2127b417406ae87c201 +lib/codeql/rust/elements/internal/generated/Const.qll 3e606f0198b6461a94964dba7a4d386408f01651d75378eeab251dfceccf49c8 20fe276cded4764bdb1cd50de956bea88d7cd731909c0b84b4abb972b3094959 lib/codeql/rust/elements/internal/generated/ConstArg.qll acee83548e8e4203603fbf4fab8a4c309109a41b91e79e52577eb6dae0765b89 8d2291de34ec278dadde7daaa309d599a3db6ec6d9e9b71b467b47d13598e51b lib/codeql/rust/elements/internal/generated/ConstBlockPat.qll abdbab1c9fda654548708ec38deb79e6d5b4abc448be0533b114b670ce8c4e16 d04845ebacc2bafc1d70ddbab5f72293038064340c75b7449e26b340ad8010f5 lib/codeql/rust/elements/internal/generated/ConstParam.qll 32b4bbbf73da2f924c0e457c74f76cbcb58093e578239078e4e4a48dd7c7893a 21738751a4e33ac511b3f4ff97926ea4939e9a587257c1079bcd24e1b0d76f55 -lib/codeql/rust/elements/internal/generated/ContinueExpr.qll bcadfda6559af81850398d747884e51dd164099f7761ac3b2942da5f556ac593 974fda891aa385e1f382524bf0c7047c788327edd5a42f90997223c747cca6de -lib/codeql/rust/elements/internal/generated/Crate.qll e7814ed4c92627d1b8109e2da2458add819725982d9fcf6c570ecabf249a008c 418f27761f406da6cf849f94a48d8724592f387d3e4daabcc132ac3eaf685b97 +lib/codeql/rust/elements/internal/generated/ContinueExpr.qll e2010feb14fb6edeb83a991d9357e50edb770172ddfde2e8670b0d3e68169f28 48d09d661e1443002f6d22b8710e22c9c36d9daa9cde09c6366a61e960d717cb +lib/codeql/rust/elements/internal/generated/Crate.qll 37f3760d7c0c1c3ca809d07daf7215a8eae6053eda05e88ed7db6e07f4db0781 649a3d7cd7ee99f95f8a4d3d3c41ea2fa848ce7d8415ccbac62977dfc9a49d35 lib/codeql/rust/elements/internal/generated/DerefPat.qll cdae06ddb54d7f6962c150d08b5617c502ccd18b39e5024ec590db5c09ffca65 8a1e215232bd73c98f9bc4f95677aa4d0e165512ee9b9b3ca608456ef42011ae lib/codeql/rust/elements/internal/generated/DynTraitTypeRepr.qll dd708e6bdbc01c427a9465750d8c12d99d68828b5cc8193b2f1e7ae9d8307f32 b198c2069ae80ce57d5c1e479ba47b511ced2d21e00e7ec05d4c76c83766e454 lib/codeql/rust/elements/internal/generated/Element.qll d56d22c060fa929464f837b1e16475a4a2a2e42d68235a014f7369bcb48431db 0e48426ca72179f675ac29aa49bbaadb8b1d27b08ad5cbc72ec5a005c291848e -lib/codeql/rust/elements/internal/generated/Enum.qll 2763b7644e34611d5a342d42fee2a8c2f1ad51b86e8bc8bae4c9ea8b2a53f592 1710eec35fc24d862b05a5961d376989138bc854452120a98d8e694da71f5b69 +lib/codeql/rust/elements/internal/generated/Enum.qll 3ed69005ab7cf68745a67cc9891bd68a83f6ab927febf077de9e4092cb373b0b 604fd03d1c46884b3c93e5bff3951ec41593320e1f7382c1a7143a64063827bc lib/codeql/rust/elements/internal/generated/Expr.qll 5fa34f2ed21829a1509417440dae42d416234ff43433002974328e7aabb8f30f 46f3972c7413b7db28a3ea8acb5a50a74b6dd9b658e8725f6953a8829ac912f8 lib/codeql/rust/elements/internal/generated/ExprStmt.qll a389b43ecb47855f89c6ddce3aaf0f789342c3c79610fe44840053b86ddfd33c 96647d1faec5e9dc57994644f178e9e8834de4a22fc1074a6e19a396bc875ff6 lib/codeql/rust/elements/internal/generated/ExternBlock.qll b46086ded295788fbd749718693ddbcb76890f93e0c97234b1e1d565a9902001 df6c26551d3e7becbdab6a68e35c31294a0c413aff92510157b470b55053dece lib/codeql/rust/elements/internal/generated/ExternCrate.qll 3b0c8346008a8178b0d19158dd63b8eec4f0391014dcd3dba9f48f555f3d6556 52867babc6c6ec3b8b872160f40feb385a4b850bddfd5501c576096ca0a654fd lib/codeql/rust/elements/internal/generated/ExternItem.qll 08c02dbc8a96df25725ccec69ef5e19089ae03faea2efb86be892077ea1bc8ab 8afe7b6a87445dde4ce2c790ad05c2ccf771996d10625e6fc100113f219e8e32 lib/codeql/rust/elements/internal/generated/ExternItemList.qll a5fe9a9008268c73b4ed16c4b07de4bbe6beead65b778f57a4bbc7bbb7c2c0a9 25cb1af76aa9435e5d45672582e9a82b207ade4fa2a36343cdb36da73b090d5f -lib/codeql/rust/elements/internal/generated/ExtractorStep.qll e7e42ee5b7d21d1aeef8c667a759c84a32bae89e23fd2444a6fa858ec876808d 75534611495361f4bdd67c420e9ee2215e077572176a241b7bec2718ae0c80e5 -lib/codeql/rust/elements/internal/generated/FieldExpr.qll 1b9f7de8acb497a9de16d4a021e31491884caa7e85c990cf65f6ab46f5254908 0e8f4af6c6ff2821d3ed9555fa7cc719b7f58614160685c50742b65bc90de8b4 +lib/codeql/rust/elements/internal/generated/ExtractorStep.qll 61cd504a1aab98b1c977ee8cff661258351d11ca1fec77038c0a17d359f5810e 5e57b50f3e8e3114a55159fb11a524c6944363f5f8a380abccc8b220dedc70ca +lib/codeql/rust/elements/internal/generated/FieldExpr.qll d6077fcc563702bb8d626d2fda60df171023636f98b4a345345e131da1a03dfc 03f9eb65abfab778e6d2c7090c08fe75c38c967302f5a9fa96ab0c24e954929d lib/codeql/rust/elements/internal/generated/FieldList.qll 35bb72a673c02afafc1f6128aeb26853d3a1cdbaea246332affa17a023ece70e b7012dd214788de9248e9ab6eea1a896329d5731fa0b39e23df1b39df2b7eb9c lib/codeql/rust/elements/internal/generated/FnPtrTypeRepr.qll e9b45cf0e1ed7cc31b6dc56e171d33a0986a0753397e4eb7a3540f91831247a2 ec5607555ba1feb16e3f0ef4c4bbe67d14cb5eb4cd0c83d5aaf6a88de4008b60 -lib/codeql/rust/elements/internal/generated/ForBinder.qll 53c239c5710d0ddf0a0675e63e008ecab6b1fc9c3d42d19b19fcee95bf5ecfe3 783650d7f13190da743f9820d096d475ef6ddc42a6a201baf88a253c604bd587 +lib/codeql/rust/elements/internal/generated/ForBinder.qll 7be6b8e3934db8cd4ac326625cf637dda4b175fd7573a52d2feb147769c4c6a1 234484b9b4cf3a20c97334417700db5029da65313410b3c9e929512c509e5c27 lib/codeql/rust/elements/internal/generated/ForExpr.qll 7c497d2c612fd175069037d6d7ff9339e8aec63259757bb56269e9ca8b0114ea dc48c0ad3945868d6bd5e41ca34a41f8ee74d8ba0adc62b440256f59c7f21096 lib/codeql/rust/elements/internal/generated/ForTypeRepr.qll 8d960834b5fb55f50f6259d565961e8604f4298ff7a69120ceb9a21257ba629c f93c3477bffe1c648bb1d2c126f608fe8eee41abe7a306a7b6f16957d280b1c9 -lib/codeql/rust/elements/internal/generated/Format.qll d2c171c1cb477dfb22665a09207f704cae1747693e2b24f3c0914506492c6b08 1e777e406f84f040eee4f33be51fd72b149a97d31c33911eb0bff8d1e81949d0 +lib/codeql/rust/elements/internal/generated/Format.qll 934351f8a8ffd914cc3fd88aca8e81bf646236fe34d15e0df7aeeb0b942b203f da9f146e6f52bafd67dcfd3b916692cf8f66031e0b1d5d17fc8dda5eefb99ca0 lib/codeql/rust/elements/internal/generated/FormatArgsArg.qll 24a0c1e6b1d51cf25c9c04bea2d3692978c6accdba1c9b990edf3804d382d784 3e309db56048786599debc41f97a0fa8436ae44abe8498b2218438cf9eafef47 lib/codeql/rust/elements/internal/generated/FormatArgsExpr.qll 7cc086bb2a132f2b1a20d69994d7c767581c28c29bfc1fe6ccb4dcc2f4cac1b8 8d4ece2140ac31c31e2443249f3fd8b9db8eb6a2dfeab8b15c65ebd99841d5b7 -lib/codeql/rust/elements/internal/generated/FormatArgument.qll 5ce1cb9005fab3769c84cb21beb401db69cebee8be75c8e794d400648b6ab0bf ed101e21d7f2cf7e1a607ae409b9a83d2ed68a2eb7cae740abd542bc8f56e9ec -lib/codeql/rust/elements/internal/generated/FormatTemplateVariableAccess.qll 7de1e97aaeadcdc9051ffe92a4083a43f81562d7fe733773be8be42a3649ddef 5300fb4af144de0b033135fd31e02981535b53da239729688de67a7db45b7e55 -lib/codeql/rust/elements/internal/generated/Function.qll f40dd30af74f2e8af3b8265df06f516bbb074313f68096ef39ba8f0155346afc f110aa828b25980539dfa8ec856576dc21b3a74710c18dcb115ecb162c6c4117 +lib/codeql/rust/elements/internal/generated/FormatArgument.qll cd05153276e63e689c95d5537fbc7d892615f62e110323759ef02e23a7587407 be2a4531b498f01625effa4c631d51ee8857698b00cfb829074120a0f2696d57 +lib/codeql/rust/elements/internal/generated/FormatTemplateVariableAccess.qll a6175214fad445df9234b3ee9bf5147da75baf82473fb8d384b455e3add0dac1 a928db0ff126b2e54a18f5c488232abd1bd6c5eda24591d3c3bb80c6ee71c770 +lib/codeql/rust/elements/internal/generated/Function.qll 25aa44c816233b9259b4ca12a15b6aff5856f4147d6a72fd0ec2fdebb24a5131 62a8a9080bf555950a854f84444d79cbe72d69b1d3f73ac801bb11e732fc7e46 lib/codeql/rust/elements/internal/generated/GenericArg.qll 908dadf36a631bc9f4423ab473d1344ed882c7f3f85ac169d82e0099ff6337d4 c6ef5358db3a0318987962a51cbe6b77ae9c0e39c1312a059306e40e86db7eb8 -lib/codeql/rust/elements/internal/generated/GenericArgList.qll 1e4a0e887470fa15a8052a01b06aa485d6852d681883f652b5893e70a87fbcaa 1cb0ef4ac93dec6ae2ad531729b3eb5a529ec880c5e18e2d055d9cb180369c1e +lib/codeql/rust/elements/internal/generated/GenericArgList.qll b8cd936bba6f28344e28c98acf38acb8ef43af6ecf8367d79ed487e5b9da17cb 8b14331261e49d004807285b02fca190aafd62bfb9378b05c7d9c1e95525fe7b lib/codeql/rust/elements/internal/generated/GenericParam.qll 85ac027a42b3300febc9f7ede1098d3ffae7bac571cba6391bc00f9061780324 806cb9d1b0e93442bef180e362c4abc055ab31867ff34bac734b89d32bd82aa1 -lib/codeql/rust/elements/internal/generated/GenericParamList.qll 034b7026a7104a3302b12972b0953a621e603fe781819f63f4b3827a96698630 07f807797b98521cece9400feb052b01a1fc35bdaf55df7cb0863aae5702c0ce -lib/codeql/rust/elements/internal/generated/IdentPat.qll 68671110f903ccc8bea948cbeef3e7a2b699ae0bb5c3aea58b7ab8a18a1adcb9 1489d5dc35e2f953426b15f89b56ac339816a1c1168025edd3cc9e243058a8db -lib/codeql/rust/elements/internal/generated/IfExpr.qll 8331c553a52663f2256633fe69f937fe5819c50b7e90e1188c0d43c3f203fd55 3084474404f84d77d97834d9eecefbb0c760801d2433edf08831bef32f6b297f -lib/codeql/rust/elements/internal/generated/Impl.qll 7c645e932f21ea8f37b734324b2e97cc71a4881ee305f00eb7baf584a8b62f97 78c7c2144e5467a62cebadad29b83c6f8244f5495d7f0ced77e09e7f2ef3641f +lib/codeql/rust/elements/internal/generated/GenericParamList.qll b18fa5fd435d94857c9863bbcc40571af0b1efba1b31ba9159c95568f5c58fce 6e70f1e9a1823d28d60e0e753ac8fbbe8deb10c94365f893b0c8f8ea4061b460 +lib/codeql/rust/elements/internal/generated/IdentPat.qll 1fe5061759848fdc9588b27606efb1187ce9c13d12ad0a2a19666d250dd62db3 87dbc8b88c31079076a896b48e0c483a600d7d11c1c4bf266581bdfc9c93ae98 +lib/codeql/rust/elements/internal/generated/IfExpr.qll 413dd7a20c6b98c0d2ad2e5b50981c14bf96c1a719ace3e341d78926219a5af7 c9a2d44e3baa6a265a29a683ca3c1683352457987c92f599c5771b4f3b4bafff +lib/codeql/rust/elements/internal/generated/Impl.qll bdc3da08b23ab098e92927a57c2e99eeb78ea8561cf11accc51db3033492b500 4b45be6b0c51f03999619705104574d78c262ed2497921f2ca8696844b17addc lib/codeql/rust/elements/internal/generated/ImplRestriction.qll d74591e8fa8d164207270766c2d7cbc3ecee42cf69ac9401bc6343a038ad9429 eb6fb67bd66d3a04f483b9291ae8a876ff71b627b127f44bdac40ab3008eeabc -lib/codeql/rust/elements/internal/generated/ImplTraitTypeRepr.qll eddad5f87306202f903ed70de198bd7b4e0ceccf9526400b53fdf85f69ccb80a 8ab459ab7f6badff0fb61c8813fdd521746ee57711f235fcb303ec399738b54d +lib/codeql/rust/elements/internal/generated/ImplTraitTypeRepr.qll e376a2e34ba51df403d42b02afe25140543e3e53aaf04b9ea118eb575acb4644 dc3a7e3eac758423c90a9803cc40dfdf53818bd62ee894982cd636f6b1596dfc lib/codeql/rust/elements/internal/generated/IncludeBytesExpr.qll 9a047dabc395b00509b457dc86a0029f10272a1ce3a6b2194a7391ca7beba0fd ca929e0686255d4e860fb80c33e5ba580e0083e61b12ed3819394dff14d6b46c -lib/codeql/rust/elements/internal/generated/IndexExpr.qll df6593db9e67748e49f953e596f987d9ab9b6bd46c425a10df4814aa9bbe021b c6e30efaaffc3dbdfe2240f017337fa8ac5e6c703f2835533d3d7e536c102191 -lib/codeql/rust/elements/internal/generated/InferTypeRepr.qll 70a80413dd1fab41bb275bda17af4c9b84be2d52a9281380f82c604f4854e980 a5caa63ef4b970cdf4e11a4e67105d80fbc48eaa7992b91e350023521263afe7 +lib/codeql/rust/elements/internal/generated/IndexExpr.qll cf951fc40f6690e966b4dc78fa9a6221aa5c6cade44759dcb52254f799292d11 1572e71918cc4e0b7e028331b6d98c9db23100a3646cd3874d1915e06ab6211d +lib/codeql/rust/elements/internal/generated/InferTypeRepr.qll 4f101c1cb1278e919f9195cac4aa0c768e304c1881394b500874e7627e62d6c4 dca3f85d0a78ecc8bf030b4324f0d219ffff60784a2ecf565a4257e888dea0ff lib/codeql/rust/elements/internal/generated/Item.qll 03077c9d2f3200ebbc5df5d31f7d9b78a3ae25957ac46899a19a93684b2d7306 6492e341b9d9270c0181da0a5330f588238ced81657041ad1ad343db2bdf210b lib/codeql/rust/elements/internal/generated/ItemList.qll 174c8eebd5cdfb8e0e74b492f30f660d758e87a9705947589376767c8d5ace41 d6bce9aa6a594a3e6523c5c5863b7fb72b1ed40c6526e1e50c4fccdb7fa7f243 lib/codeql/rust/elements/internal/generated/KeyValueMeta.qll 6e1cd898cb80b7abfe3e64ce232b60aa0efc134722c4eb9150d4604e139557a9 d2da54005a3a266594b01cbbab85aa999d99f7a69cdd55627707bea2fbdf9f72 -lib/codeql/rust/elements/internal/generated/Label.qll 84590e70dbc51f1fea0cd4bef38f3798cf0c1eb00dffae5b78d3e12e7da5e4fb 3506f2debdd836e6169b6881d96df67e544e9dd3c68c08d899c1a8f60c087d75 +lib/codeql/rust/elements/internal/generated/Label.qll 6630fe16e9d2de6c759ff2684f5b9950bc8566a1525c835c131ebb26f3eea63e 671143775e811fd88ec90961837a6c0ee4db96e54f42efd80c5ae2571661f108 lib/codeql/rust/elements/internal/generated/LabelableExpr.qll 896fd165b438b60d7169e8f30fa2a94946490c4d284e1bbadfec4253b909ee6c 5c6b029ea0b22cf096df2b15fe6f9384ad3e65b50b253cae7f19a2e5ffb04a58 -lib/codeql/rust/elements/internal/generated/LetElse.qll 6b40e1094eb310645e753151020b5029c9d80878ddbb503965f127543867497c 9d50fbc97d33ae4f288e1f0c5edb744c88e34acbfe383f9b80b0d6718d699d84 -lib/codeql/rust/elements/internal/generated/LetExpr.qll 119ae15ccc60c42810572c821c310bd9a770a858591ef6e8dab351ec7acbc47f d538872283bdcc5b28ed1155caaaf793eef96262d8a79773b7a781f820ae6ad6 -lib/codeql/rust/elements/internal/generated/LetStmt.qll bebba95e19699c20935302481616995334f8f25b5c733304932d1c1f3b9a598e 780aa480212693fd4dd5c5382c5f6243145dd194151b6f5b2370b6f4df6a6f6b -lib/codeql/rust/elements/internal/generated/Lifetime.qll 6c94eebd583386c4fcdcc7c7e02e66e3ff384cfcc695e7e9b6c17505620c443a a4b08a0ff307912ea62633a04e06fe2618fb952bba43a416f93cbc20576f17a2 +lib/codeql/rust/elements/internal/generated/LetElse.qll 9e6f7057b8cb7d37b0ea79d540520028febe017ed8e9def95927ffa3fcdc1af4 3ee7d344d718898f25eb2a7a646d3c6704e8f1f22b83d0c0ea727cff74161946 +lib/codeql/rust/elements/internal/generated/LetExpr.qll 5983b8e1a528c9ad57932a54eb832d5bcf6307b15e1d423ffa2402e8a5d8afa4 8a6affdc42de32aa1bfc93002352227fc251540304765e53967bab6e4383f4ae +lib/codeql/rust/elements/internal/generated/LetStmt.qll 21e0fadccc1e7523ef1c638fc3e2af47256791eff70d1be01a9c377659ee36ef 21ccb4821bdbde409f17ae96790e395546d6c20d2411fccf88bad6ef623a473e +lib/codeql/rust/elements/internal/generated/Lifetime.qll 2f07b2467c816098158ed5c74d2123245fe901d0d1cca3ff5c18d1c58af70f4e d0ba493bc337a53fd3e7486b1b3c9d36c5a0b217d9525fc0e206733b3ed3fa74 lib/codeql/rust/elements/internal/generated/LifetimeArg.qll 479f82ecbc9a295afb047e4d52d53f816c455b8c526197adf99f4745d67d28e5 9548e850b7f3e14954d0d7139cf4f6913200b3dd74a210627a8512032eb9bf15 lib/codeql/rust/elements/internal/generated/LifetimeParam.qll 13a52f3e6fd3e321f50fe377e57d1294ca137301311de6297399bdd5fe157bf3 c6a525683aa2e6008c40b09940b8c28889a034490a1be76a048ea22dea4b3688 -lib/codeql/rust/elements/internal/generated/LiteralExpr.qll a768a964a3f37417ed54226e840ba706082dc6b23e10670909295ecd8ab2a61f 9c8384cb8730e780a4a1821d46105f907eaa48c2d9e00584b30b4401e6e828d1 -lib/codeql/rust/elements/internal/generated/LiteralPat.qll a210444358ef0043cc5865fd400307256f3c149011449e2425b0e70398841661 98e46a8fdbaa24b965985c16dc09295a945fe9e6be9b5a011186e8f159b9dda4 +lib/codeql/rust/elements/internal/generated/LiteralExpr.qll f3a564d0a3ed0d915f5ab48e12246777e4972ad987cd9deaafeb94cf407b2877 2337c3d5f60361bd10f6aeca301e88255f5dffb85301cf36cbbfa1a65bfad1cd +lib/codeql/rust/elements/internal/generated/LiteralPat.qll f36b09cf39330019c111eeaf7255ce3240178342d0ddaace59dbfee760aa4dbb d58667cf4aa0952450957f340696cb2fd22587206986c209234162c72bdb9d9a lib/codeql/rust/elements/internal/generated/Locatable.qll c897dc1bdd4dfcb6ded83a4a93332ca3d8f421bae02493ea2a0555023071775e b32d242f8c9480dc9b53c1e13a5cb8dcfce575b0373991c082c1db460a3e37b8 lib/codeql/rust/elements/internal/generated/LoopExpr.qll db6bc87e795c9852426ec661fa2c2c54106805897408b43a67f5b82fb4657afd 1492866ccf8213469be85bbdbcae0142f4e2a39df305d4c0d664229ecd1ebdb9 lib/codeql/rust/elements/internal/generated/LoopingExpr.qll 0792c38d84b8c68114da2bbdfef32ef803b696cb0fd06e10e101756d5c46976c 111fe961fad512722006323c3f2a075fddf59bd3eb5c7afc349835fcec8eb102 -lib/codeql/rust/elements/internal/generated/MacroCall.qll 54894ec88b57c2ace6e7f154021beb764460e5d81d627ae3aa82aff654863be4 3cdc0be3500c50ce80110ec1c348424b382fe0c916febec432570f7816d0a851 +lib/codeql/rust/elements/internal/generated/MacroCall.qll 1a7ee9c782ebc9ab0a807762aabebc9e0a7ef10c6eb945679737598630b20af2 782a437654cb316355c020e89d50b07c93ba7817715fa5d42a9e807cf12d1a43 lib/codeql/rust/elements/internal/generated/MacroDef.qll ceb965daf4e4fc52434f3cf64eab83a9b25a334476f8a5da9e243ffd25591d5e ef564309ac512f2e0f7332c212f92242a59bc152e0667262c9d2371e188500e2 lib/codeql/rust/elements/internal/generated/MacroExpr.qll e36596803028408a76591e2ed6309aea8e5740105d6924029b1e74a6bf60efa0 34aa8c478f72c415a601d672c95f4e26384225a61e1f07b8f08d63cb4e4dc9d4 lib/codeql/rust/elements/internal/generated/MacroItems.qll e641c26572c1b517b8f068cd76737b5f92f89f5015763e379e39d86b8f6440cc 4055ba4210bd96a4840601a260b6db50b9598eeef8a7650e5350fa28f84341b4 lib/codeql/rust/elements/internal/generated/MacroPat.qll 5c044c3cfc984e71902b7326c1f8b06a629863c80b61c0574022e905dfaa5f35 d12f30547b3eb264d0baa2ab284b394221f6c5363dbe6b2fe51e3bb557e1d057 lib/codeql/rust/elements/internal/generated/MacroRules.qll 7b2684dc0f75307aa2e85371dfdff4f48aa816e7f13445271c2fdb587519b168 1572a71eec788e500f84756e87ee88dceb0a5f002b4bac90b73ae25b3d2f8fc0 lib/codeql/rust/elements/internal/generated/MacroTypeRepr.qll 747b614f532651bc890390a7ab1431b4892c263695e44a050e528232655f56ef aebca14e28277d92a1c0e8f15a57ea1d2e82121e9d13fa33f949041211695e89 -lib/codeql/rust/elements/internal/generated/MatchArm.qll 8620ba1a8f0db4bf6e6f64c3bfa56cc652859bd618821e79475b14b00543816e 0c36436b76de62c655cfaaf466e2039b410ab307acbfa1ea688491911a48d240 +lib/codeql/rust/elements/internal/generated/MatchArm.qll f8c4c955c50f8398159c492d9d0a74f7b71e9510fcb8a3aab1d06e0f7e15b263 713939c7ef77ca73d95788096163c26213ab49f34ed41c6f4bc09a1ef9607b0d lib/codeql/rust/elements/internal/generated/MatchArmList.qll b75e202d374031b110717be98fb803fa8bdd1fcd55c90eee867899a7826e9d98 16092ae38b283c16a115df4b8fdcb59bd90af2037fe2fab7fc84910458b0b570 -lib/codeql/rust/elements/internal/generated/MatchExpr.qll eed36a14b013d66928a2fdf047438b993fd2f9cf7bc77d837cced7c188eb4cb5 3335c18ac13288268d62c68a3a3d4b983de122820c5810dd8401bd545d05dbbf +lib/codeql/rust/elements/internal/generated/MatchExpr.qll b686842e7000fd61e3a0598bf245fb4e18167b99eca9162fdfdff0b0963def22 00f1743b1b0f1a92c5a687f5260fda02d80cc5871694cad0d5e7d94bac7fe977 lib/codeql/rust/elements/internal/generated/MatchGuard.qll b789fe3b0e78ee21b6712b5ec3eb97388ce04441469b7db63aa795b046daaf57 64a90af32944d6f4a8680a0cf87a78fa9bb60a2fcf16ec22717e81ed1bb69337 lib/codeql/rust/elements/internal/generated/Meta.qll 5c3358c737d504dacfa3227b80ceeead3cdeebbd7498d1d0ac88570cac1d91ec cd04ebdf19cf6710ce43e888211e61b0740aa6298db9a5ec79f29a1301a60b40 -lib/codeql/rust/elements/internal/generated/MethodCallExpr.qll 85895a3d8c607c1b742f6757d2d37effb320d01f62addd62847158cf5d3b8686 6c46f790c1a993befb1d9ca1dfa50aeddc20c8f9bc684eca963cdd70ec6aff57 +lib/codeql/rust/elements/internal/generated/MethodCallExpr.qll ffce98a6a1921822b12ead721cff0878553eb3e049c5d2184a7abce32b6615b4 d1408a0f47ee5764fe7b484494daf6e1f99b1c6a505274c48545b3e650ef8baf lib/codeql/rust/elements/internal/generated/Missing.qll 1810565cc670fadb5724bb93dd17363e107c79334c5dbd98bc85fda1b2be8b10 e9c91ba13715af0e6390e9d121523d622702bc569f8a148015a0d4e6f0488230 -lib/codeql/rust/elements/internal/generated/Module.qll 45411242fe83c27c45db4133a93ada2505c0ddcf8ea448904a7c4fa3ebf0a34e 8d1573878196820e67f323397b7676a2dc55c30aec2e9572da01044d78c1106e +lib/codeql/rust/elements/internal/generated/Module.qll ebae5d8963c9fd569c0fbad1d7770abd3fd2479437f236cbce0505ba9f9af52c fa3c382115fed18a26f1a755d8749a201b9489f82c09448a88fb8e9e1435fe5f lib/codeql/rust/elements/internal/generated/MutRestriction.qll 01fe01b18327c05e76d94c448b8c124811171252fbfde0ea2f9a0988af1483c6 95695424b50bde72bc50390d6739a7acefe0396207e2914f47d7f7258073c37a -lib/codeql/rust/elements/internal/generated/Name.qll ad7256a77b3dec0d6a5431a2d15f52d5138d93fa657c042819300f358a54475f 6b2bdb62bb7f38ccbb0ab30610cad9327bf6fa88fd5545f20539e659b2f93e03 -lib/codeql/rust/elements/internal/generated/NameRef.qll 20730079c68008a29d8bcedd7eecb634f5055c6acc5951ca100d0765fd3098bf 0be3384e1821d9743cf72c88d11422afc80c619436c8a6ab26606addc7d39d0b +lib/codeql/rust/elements/internal/generated/Name.qll e6bd6240a051383a52b21ab539bc204ce7bcd51a1a4379e497dff008d4eef5b4 578a3b45e70f519d57b3e3a3450f6272716c849940daee49889717c7aaa85fc9 +lib/codeql/rust/elements/internal/generated/NameRef.qll 090c15ed6c44fc4f1a7236215f42e16921912d3030119ac22bc7ffe2dcdb4ba8 b61cc486e6764272c4e8377523bf043d0beae4926606dbcb48f8205c6a0b9a90 lib/codeql/rust/elements/internal/generated/NamedCrate.qll 058d4c396383e19c5ce3b7835f2d76d477eedfe6771acd076f0d4b87cda2437e b5d44e4b31dc4fef46ec1219e6134d5d66df0512214b516ba1bfc9c0f024878c -lib/codeql/rust/elements/internal/generated/NeverTypeRepr.qll e165a248547d180ec34f97bdf7c979adc0bd7160dcb04dcaa2994f2215180061 b5ca8403399db500f5c7de439ec2a9f9583906548c2ce1ebea9dab510beae6bf +lib/codeql/rust/elements/internal/generated/NeverTypeRepr.qll 4f13c6e850814a4759fdb5fca83a50e4094c27edee4d2e74fe209b10d8fb01c3 231f39610e56f68f48c70ca8a17a6f447458e83218e529fff147ed039516a2f7 lib/codeql/rust/elements/internal/generated/NotNull.qll c78815961df086065fd140a55b1eb7eff883940c8b31dcd79341e3f9f035423b 4b7cb75c48b791f8b8ca5e9144bdfd97ce59a207c2b8ade1da7b97fff2311134 lib/codeql/rust/elements/internal/generated/OffsetOfExpr.qll 5d39ade5f3e91dbb54f1fe34b6ea58faad795d72646c282970a127cb44189d45 716fdbbd1a81acdf965fbb3e0a7141db5c5a4874625ebd5cb3c8341e6f4484e9 -lib/codeql/rust/elements/internal/generated/OrPat.qll 1eb20314c27658f05101fc4084267d70e36f67cf306c7d915b1f9c025f1bb750 cae1cc20517b5a4b0ba8ab789a817759918bb942bc22c580b8798b06d80a43eb -lib/codeql/rust/elements/internal/generated/Param.qll 87c905e1e63efe0c46b0c5f725bf3f1ac9432eefb16d6e815bdb98e77c14e6e9 ee1ad6fb188b7f1577a35a2f7315e634167ab844ea858a0dcb442e481afc5c70 +lib/codeql/rust/elements/internal/generated/OrPat.qll 0dc6bd6ada8d11b7f708f71c8208fc2c28629e9c265c3df3c2dc9bea30de5afa 892119fc1de2e3315489203c56ee3ed3df8b9806e927ee58aa6083e5b2156dab +lib/codeql/rust/elements/internal/generated/Param.qll 19f03396897c1b7b494df2d0e9677c1a2fc6d4ae190e64e5be51145aba9de2e2 3d63116e70457226ea7488a9f6ed9c7cea3233b0e5cab443db9566c17b125e80 lib/codeql/rust/elements/internal/generated/ParamBase.qll 218f3b821675c0851b93dd78946e6e1189a41995dc84d1f5c4ac7f82609740f7 4c281b4f5364dab23d176859e6b2196a4228a65549e9f63287fa832bd209e13d lib/codeql/rust/elements/internal/generated/ParamList.qll d8e73957983491302faa560ba0756f125dec0b310d59def54d4763408e1b81c9 701fa4e1364478617b2f73c9d86bdba6f4a6c04f58208b9ed35a388f11e11938 -lib/codeql/rust/elements/internal/generated/ParenExpr.qll 811629da7116f508d22da3d2371eaa65fcb7cb41f507076afefa0ad8c0b92796 754b27827386420c4ccc023158289370b14c827d8b18fdcf009cb913b707380b -lib/codeql/rust/elements/internal/generated/ParenPat.qll 6f7f7987209c3809b98f477dadf20a6fcf9b02d5696fb37f88c027d38a4c206e 7b377256e571b98005fa6ce4c1afcc3effb51afc4a1cd5264f46518e8dd1e60f -lib/codeql/rust/elements/internal/generated/ParenTypeRepr.qll ffe7cde9a77d449adeb619e703b7f4a644127f7dac38546eb1844bafd6d1b92f ea77a4ccfef88e01220fca0009fa70403687d3d3fcba96c5d470129436df3c96 +lib/codeql/rust/elements/internal/generated/ParenExpr.qll 812d2ff65079277f39f15c084657a955a960a7c1c0e96dd60472a58d56b945eb eb8c607f43e1fcbb41f37a10de203a1db806690e10ff4f04d48ed874189cb0eb +lib/codeql/rust/elements/internal/generated/ParenPat.qll 24f9dc7fce75827d6fddb856cd48f80168143151b27295c0bab6db5a06567a09 ebadbc6f5498e9ed754b39893ce0763840409a0721036a25b56e1ead7dcc09aa +lib/codeql/rust/elements/internal/generated/ParenTypeRepr.qll 03f5c5b96a37adeb845352d7fcea3e098da9050e534972d14ac0f70d60a2d776 ed3d6e5d02086523087adebce4e89e35461eb95f2a66d1d4100fe23fc691b126 lib/codeql/rust/elements/internal/generated/ParentChild.qll 491b2adad685733cae41b4e918e850718074a14e0f179b3debbe9424c927a5aa 4e851e1d327156fcad247dae87adc091fd0e2f7ff19c6559612165c16d961beb lib/codeql/rust/elements/internal/generated/ParenthesizedArgList.qll 4e85b4bcabdbde71602d557fa0dd5ccbab09d2360d2bb470384cb85437e1611f 688af26f360655ee6454fa45b3169cc9db6ed46d8f58c2470111703e1e7a117f lib/codeql/rust/elements/internal/generated/Pat.qll 3605ac062be2f294ee73336e9669027b8b655f4ad55660e1eab35266275154ee 7f9400db2884d336dd1d21df2a8093759c2a110be9bf6482ce8e80ae0fd74ed4 -lib/codeql/rust/elements/internal/generated/Path.qll e55c58906be8764cbed224542fe1551e89b0f2eb4213899c76509c2e468d018d fdde9f8603ff27eb9d50c6619211f4bd6e49cf89ff945197cf247438b8c60fd1 +lib/codeql/rust/elements/internal/generated/Path.qll 9b12afb46fc5a9ad3a811b05472621bbecccb900c47504feb7f29d96b28421ca bcacbffc36fb3e0c9b26523b5963af0ffa9fd6b19f00a2a31bdb2316071546bd lib/codeql/rust/elements/internal/generated/PathAstNode.qll b02654422f80e398027069135bb01205358f0ab82ded3408d83d066f300996a3 345e7f92a75bfc71657b223602f60c36f7637d6f2e3798f07e2d2926eea2431b -lib/codeql/rust/elements/internal/generated/PathExpr.qll 379e92044d36bdf6bcf44a535cc5293453c568ee95e6a5f04ae88fd3ba357c91 4cb3651244f4b2a2ad02a6d1f71f849db9a1cfb020598f7728b84e4eba48fbb1 +lib/codeql/rust/elements/internal/generated/PathExpr.qll 34ebad4d062ce8b7e517f2ab09d52745fb8455203f4a936df7284ad296638387 ba66781cdbdeb89c27a4bfb2be0f27f85fb34978d699b4e343446fb0d7ad2aa6 lib/codeql/rust/elements/internal/generated/PathExprBase.qll d8218e201b8557fa6d9ca2c30b764e5ad9a04a2e4fb695cc7219bbd7636a6ac2 4ef178426d7095a156f4f8c459b4d16f63abc64336cb50a6cf883a5f7ee09113 lib/codeql/rust/elements/internal/generated/PathMeta.qll 9e47ae77903bb2bdf1fa7f130ae45e444b0847722a22c7b5edaa8bdd1ae038df a80c417c5df58d944504ca8657fd6066cbf84939a70840bc813b6b41d138ee04 -lib/codeql/rust/elements/internal/generated/PathPat.qll 7cc8389d7873b28967983d9bd7237e3cb95c86d1330559264221dcf7f81808cf d50fee400190914c1a76eb6bc009bf9f91050bf2c7c93eddc340e6fa5aac93c6 -lib/codeql/rust/elements/internal/generated/PathSegment.qll 645fde67796f1eb8945a94d04146500c5b2bb46a7c91a6dcda1017a17ecef17a 310e83672af434b3be51dd7721751e66d0be5c80a71e92f1f7076c89f8c5c64a -lib/codeql/rust/elements/internal/generated/PathTypeRepr.qll e2039430b87bb54f155a993fbcd7c759d54d34ce957bc1a82ed208a430a975b2 178a86568964b6923c923587d72ad3365fc8143a05b2780792ca253244732f6b +lib/codeql/rust/elements/internal/generated/PathPat.qll 003d10a4d18681da67c7b20fcb16b15047cf9cc4b1723e7674ef74e40589cc5a 955e66f6d317ca5562ad1b5b13e1cd230c29e2538b8e86f072795b0fdd8a1c66 +lib/codeql/rust/elements/internal/generated/PathSegment.qll 48b452229b644ea323460cd44e258d3ea8482b3e8b4cb14c3b1df581da004fa8 2025badcfab385756009a499e08eecc8ffd7fa590cd2b777adb283eebcc432c6 +lib/codeql/rust/elements/internal/generated/PathTypeRepr.qll f12fe234d7fb1a12678b524434fcdd801453d90eb778b9173f7197ff3d957557 a1be605f8937c5bd3a3a9cb277782c24446c9f5ef8363e6f5ee8f6229886b6f6 lib/codeql/rust/elements/internal/generated/PatternTypeRepr.qll 6d11342c39915b5173cf735957af0e3f92398f22b6bc189bfbcdc46851d4d33c 3ef6765f7dfb39c2280aeec4f15f42e4056d2d6644a279a8726c43feb28a9a38 -lib/codeql/rust/elements/internal/generated/PrefixExpr.qll 62a0cd04ec8c69c355844996aeb7cf4e67b002cd9d1c38b310f3632edc5231af 845e184e2ece7f3419206dce2d3437aafa38372b613e039adaaefd34bbb348c5 +lib/codeql/rust/elements/internal/generated/PrefixExpr.qll c9ede5f2deb7b41bc8240969e8554f645057018fe96e7e9ad9c2924c8b14722b 5ae2e3c3dc8fa73e7026ef6534185afa6b0b5051804435d8b741dd3640c864e1 lib/codeql/rust/elements/internal/generated/PtrTypeRepr.qll d7a400b238d7edf2b46596dab12e61add04e4930c9fe40c6b7de6d29fe3e3155 914d3b3a80823d2965664b6d4dd161598424d5477f7a1c7f872ae4894896430b lib/codeql/rust/elements/internal/generated/PureSynthConstructors.qll e5b8e69519012bbaae29dcb82d53f7f7ecce368c0358ec27ef6180b228a0057f e5b8e69519012bbaae29dcb82d53f7f7ecce368c0358ec27ef6180b228a0057f -lib/codeql/rust/elements/internal/generated/RangeExpr.qll 1e954c224978448f7658153d66a50e48c5909559cfc4a73262e23fc9210fadb6 a868bafdaa59927b9a88e3368541dfa575a2fc246f0d47f0880b9b10761259e0 +lib/codeql/rust/elements/internal/generated/RangeExpr.qll 23cca03bf43535f33b22a38894f70d669787be4e4f5b8fe5c8f7b964d30e9027 18624cef6c6b679eeace2a98737e472432e0ead354cca02192b4d45330f047c9 lib/codeql/rust/elements/internal/generated/RangePat.qll a0c805eb31a773e16806384bd11592563c61b720e694bd444b93c28b5cf00d65 4b82088a62e7e5027f5930a697a18b5d4fd2a831a7bb6123d1b3f8ff4a9255ea lib/codeql/rust/elements/internal/generated/Raw.qll b797442c8c4ef094437c7e20c2d580a96b272ea6752a496213c8caaf72cabe6a 433002df28dc5ffae8485ddd0bac85e47587e088e730f5ccf34152eceb4d325c -lib/codeql/rust/elements/internal/generated/RefExpr.qll 4d682dd36961edcb8b9cc36a1e2363bb833c0ee878617ca361685d4c3e6547ff 14459e3dca4ae0aaaea5e3429be6cd5eb8f0c11c226af48993b782324b604bb3 -lib/codeql/rust/elements/internal/generated/RefPat.qll 21864ad065b20e958e4fafae7ebbda3b30c0cc9544f8a15f324b85ebd7047037 da54d64bf0b845528b7f86928aef75e89ec90da4a4dea91ab9e08588cf4afe25 +lib/codeql/rust/elements/internal/generated/RefExpr.qll 7d995884e3dc1c25fc719f5d7253179344d63650e217e9ff6530285fe7a57f64 f2c3c12551deea4964b66553fb9b6423ee16fec53bd63db4796191aa60dc6c66 +lib/codeql/rust/elements/internal/generated/RefPat.qll 456ede39837463ee22a630ec7ab6c8630d3664a8ea206fcc6e4f199e92fa564c 5622062765f32930465ba6b170e986706f159f6070f48adee3c20e24e8df4e05 lib/codeql/rust/elements/internal/generated/RefTypeRepr.qll fbab8bae4d3eac10338a9bc5743f3ac9c0feab11107d6d28825f4e97bcd59bad 224f6aec466ddcde526ce8df23d2f925887232b462730af078815a68b47c133d lib/codeql/rust/elements/internal/generated/Rename.qll dcc205cf6a1cbceb97c363379ecf67d7640ed992a73af4597ecabd2b65dbe898 7794510d6594d289a6fa655f8618fa7ac4c0667158afbc236590248e1f0cbad1 -lib/codeql/rust/elements/internal/generated/RestPat.qll 042ff722d32af92df1e681c7272de56c063b8c5bc95187a2b3f310712d70c5e1 eb56af6f5f270a1979a56c9f510b6f9db16df5d145b3b3d7fc56fd47d5bde6e0 +lib/codeql/rust/elements/internal/generated/RestPat.qll 369f5828bb78f2856d528679a9869f81859b375c2f831ff72f4507daaee976e3 17f24ce8aa6a27359c10a654667b7877ca7a1509509e2ab246ed26fe15ef66b4 lib/codeql/rust/elements/internal/generated/RetTypeRepr.qll 7e60c74c696cebe3a9fb6bbed28bb3446ae0804b2177ed5613892762f17fb684 80be5ba25f852ad54daca4a4c24df1b09cb3d501bdc02afafe1c0ef2f9644efe -lib/codeql/rust/elements/internal/generated/ReturnExpr.qll 620c03f9dec2ca76e5f5296fc1900f8f2e9474d65264df318e5a553fa4e3ad06 7553d9a054da774f7a8ca31616f5d44ecc1cbe78b383ebe5fac55afc27120eab +lib/codeql/rust/elements/internal/generated/ReturnExpr.qll c9c05400d326cd8e0da11c3bfa524daa08b2579ecaee80e468076e5dd7911d56 e7694926727220f46a7617b6ca336767450e359c6fa3782e82b1e21d85d37268 lib/codeql/rust/elements/internal/generated/ReturnTypeSyntax.qll 3c2eee8dceae1b28dbee1b64ed2db6a932227dd9581eed089d68e8882eff4db0 a9f942ae7839954927239a842832592920754b510f12ae16057f6a2a0c561bf5 lib/codeql/rust/elements/internal/generated/SelfParam.qll 9c85961392d3d36f7dfdde1311a17962b0eeafb64e9e748b580abed2c4a49ad5 da6f438bba6e1e97cbd4a16bb5bf07defe75023c38280fd7160367de1899141b lib/codeql/rust/elements/internal/generated/SlicePat.qll 457281f265db001f59cb7fdb518a58406981114642d003ff9bf555f4d59c5a34 8256531d5a4a16d083601fcc0d3d3accccc631562e5948b26ae2b0111dd19c6c lib/codeql/rust/elements/internal/generated/SliceTypeRepr.qll 15e720c364638c14fad9dcca4f6627572423718189678c7252a462400cebd56e 7bafd93d6ec9e1196917becd6679778e552f5bc3d58537801071f957d77e61ba lib/codeql/rust/elements/internal/generated/SourceFile.qll 144ff23a64cb4602d56bcfd767428d7441273c6bfb55a997d77ea0c3006c2f50 307fbd5daf094bd08a39ba0e24fe395f5296d4a8334d4da6afb104e9873a65e9 -lib/codeql/rust/elements/internal/generated/Static.qll f706e604c80641b27ca2aef0ef857b7d3e546542f29323f73395c0317821f6a4 f0105e0d6dec743d9179b2a525c321538f67e5fe9e1c1d66bf056e98caea3ad6 +lib/codeql/rust/elements/internal/generated/Static.qll 1a6c87d3c5602e3d02268ebe2463a4ac64614ad25e8966a9bdb9c0ef58991365 cc1fe16d70cdce41a12e41a8f80cc38bdd7efa49c1544e35342fcf3cd26b8219 lib/codeql/rust/elements/internal/generated/Stmt.qll 8473ff532dd5cc9d7decaddcd174b94d610f6ca0aec8e473cc051dad9f3db917 6ef7d2b5237c2dbdcacbf7d8b39109d4dc100229f2b28b5c9e3e4fbf673ba72b lib/codeql/rust/elements/internal/generated/StmtList.qll 028c4ca5b245cc5535d14c7ed2c815d161e2f944e9c324983677cded6f737058 e14941fb5960ec4ce7db7ce37685ecbc61af5dda9795a969c50953c5395bb473 -lib/codeql/rust/elements/internal/generated/Struct.qll 9a218f180490f3115b9577ec632fc177afda243ae2bd9dd992a8705fa70d3009 6dd4572f1292d224aaa81b543126a9655b97b809eb003d1b1c784416ef17ab03 -lib/codeql/rust/elements/internal/generated/StructExpr.qll e26e2dd10e8d38d4de48fc3f5fd5efd49fff7e1cfd9ab59c8b61cb7309485a04 75dbdfa23cdaad054de53f9e56fd0538094f0714f1674ce6facf3f7517a1b517 -lib/codeql/rust/elements/internal/generated/StructExprField.qll d8663066770cad4cf7cbe29ca74ed0d03241d0883367d08f20faba5b7daae937 41cb2423841b3af57a6d61233aac4ea3148ea1e42f115e223601c635c039def9 +lib/codeql/rust/elements/internal/generated/Struct.qll 56775b98f793c108bd0eb8f35dbbc4983c170138e92c7378c24f45d2e612ca39 7bd83f2686f2f7a6b55b82156028c1951fde4c3ac9fc0248b1bb28f35b949fd4 +lib/codeql/rust/elements/internal/generated/StructExpr.qll e77702890561102af38f52d836729e82569c964f8d4c7e680b27992c1ff0f141 23dc51f68107ab0e5c9dd88a6bcc85bb66e8e0f4064cb4d416f50f2ba5db698c +lib/codeql/rust/elements/internal/generated/StructExprField.qll 6bdc52ed325fd014495410c619536079b8c404e2247bd2435aa7685dd56c3833 501a30650cf813176ff325a1553da6030f78d14be3f84fea6d38032f4262c6b0 lib/codeql/rust/elements/internal/generated/StructExprFieldList.qll 8dcb42134624949480ade77e82ffa6f120cae11d7f5e80e7176d5a3ac6dcf99b 4ab1a4d1b48f9156e0c85015f619c25986aa249721f04487546ff85cb47b99b0 -lib/codeql/rust/elements/internal/generated/StructField.qll e009faf1a5110eff4de98ce7da8418bf56f7e05e0622bd772180903445cb50dc 479baef6097cb7868c3464763d023a493357995a5df4a0e8e158937f3fc4711d +lib/codeql/rust/elements/internal/generated/StructField.qll cdb78ca654a459204a8f471f8e1a79a08186db93177289ab6dd4a8864fb88cf3 d0ddbe4e9e570721796379b7e090bec6301f50b0ed26de06ff1f7a4e1a9eb70f lib/codeql/rust/elements/internal/generated/StructFieldList.qll 2abf0688ca9659d205d8dabb98724b656493f4529e54e6d2a83f7073929ed5ef f2542e614e258845325e9103c26d50304fe45d21c4ce0630b52c91c8ce01a3dd -lib/codeql/rust/elements/internal/generated/StructPat.qll 1bcfbf6774b7cd61619e76509299e58942b7372493fdf7f9bae86f9a7af847df e2e3fc68473f448a0dc2de61d55d82da871cd544be8dad55f72ef14bf0cba85c -lib/codeql/rust/elements/internal/generated/StructPatField.qll f7db4f7b9e356c02b6a861f7763d5b00263bcc94c5f1a82e2c602925d0830017 489a214c4e7dbb333a940fbc7f13e8962737fb0614da6669de0de993692aee60 +lib/codeql/rust/elements/internal/generated/StructPat.qll c76fa005c2fd0448a8803233e1e8818c4123301eb66ac5cf69d0b9eaafc61e98 6e0dffccdce24bca20e87d5ba0f0995c9a1ae8983283e71e7dbfcf6fffc67a58 +lib/codeql/rust/elements/internal/generated/StructPatField.qll 5b5c7302dbc4a902ca8e69ff31875c867e295a16a626ba3cef29cd0aa248f179 4e192a0df79947f5cb0d47fdbbba7986137a6a40a1be92ae119873e2fad67edf lib/codeql/rust/elements/internal/generated/StructPatFieldList.qll 342ca25fbd8bf8fef84d06e263f59f010e21418658c1f79f40c52e5ce76ca158 c950a39a946904b84a2557fb1febd59906e42e5de4903e88d0da67ba3e14a250 lib/codeql/rust/elements/internal/generated/Synth.qll c753ec12f68833536dfcc467357f6bb6e0b039d2ab50683a4669432cbe20cbb2 e83329642325e05574ce4e82e3fc68e1a39b23f02f19a4cd972ca195f861f7eb lib/codeql/rust/elements/internal/generated/SynthConstructors.qll d8c1962dcb7c6ecfdb15671c34bbb30a139bae017fd3b3186b7df41d02060f7e d8c1962dcb7c6ecfdb15671c34bbb30a139bae017fd3b3186b7df41d02060f7e lib/codeql/rust/elements/internal/generated/Token.qll 77a91a25ca5669703cf3a4353b591cef4d72caa6b0b9db07bb9e005d69c848d1 2fdffc4882ed3a6ca9ac6d1fb5f1ac5a471ca703e2ffdc642885fa558d6e373b lib/codeql/rust/elements/internal/generated/TokenTree.qll 3d855014747ae2996375f05bdaef1dd07464692ea09f47174a92f705a5ef63bb b85fed50862f97bce98fb4cbd3f275b553ef3e8dedf215915736197078867427 lib/codeql/rust/elements/internal/generated/TokenTreeMeta.qll 390121812f4f16753747d1eca17580a16385332e49fa93de89a5a5dc029a3a36 fa1e30306690fef85c6f455f4b51b1b14efd046b862e0160b311469da14ac98d -lib/codeql/rust/elements/internal/generated/Trait.qll 4ce3dd41dd591f1b8ec73c7fabc464aa26d1850d24847fc152e482d805cfbdf7 fb84473fe96159770b2761e27a10587ae89fd8e7e19da5f0fefff0391a1d1c33 +lib/codeql/rust/elements/internal/generated/Trait.qll 762d4a2aa0ca2b1384b598201e2964287fce1c0de5475cf493e52de3267a6c55 affd77f6a84c9589c18ae3e3a0e51778e4e9d247f2b9b34761ba7e12502a14b1 lib/codeql/rust/elements/internal/generated/TryBlockModifier.qll d2ddf8ab5b06d2236acbfef8edade7f669f8a01b2fda2b5c7a2a5821f3cf2075 b8e5d3d057d425508dadb6c620b3e09d05ceb36fdf94dc1276157c6d8c5edec6 lib/codeql/rust/elements/internal/generated/TryExpr.qll b90d93178e699f3fab17c8b3903d508c74e258b6f77907ceb7e3e090033e4614 ef5fa114921add79e3de5372bb507f0686576360df2d7fae138250603a3f3f5b lib/codeql/rust/elements/internal/generated/TupleExpr.qll f5ad30e21345c8bdf14d79e7a695c2d32299445f334c389b284a7e29d601dd81 c6a6dfb2cd875613a59a674f0d49ec30725f4b1ed47e8a4f4c873316bf497627 lib/codeql/rust/elements/internal/generated/TupleField.qll a70c620acf097e4e8e46585928d0110203b97f8fa3c0957ba77c90c1f215f747 092a82f13712bead44eb10c411f71e50ef8bbe94fabd98c3b5a304ef307a3572 lib/codeql/rust/elements/internal/generated/TupleFieldList.qll ef5453baded5c9d7f6f358e096ef0bd67ed3062bdd41e07cbba7495e6f27ea8c e0add270f62a397de4ce53fa207d6ce4e6bbd5229d9cac7ab172b07de1dcba6c lib/codeql/rust/elements/internal/generated/TuplePat.qll 583d3a449745b81bf1c3c79b85add13067579226b85a7b005561ec55c5ffae8e c454a0b18086c687702d3146776727f15f9c1326c0806d90ff7797d41bc69e75 -lib/codeql/rust/elements/internal/generated/TupleStructPat.qll 6e6f8045b2013a6b219e712e58129568da435a1bc5aee2c937fd25dafb2937b0 6645c8167218f92dec1c8226d631ccf3e8dcab0cc88853f916d2194b9d2fece5 +lib/codeql/rust/elements/internal/generated/TupleStructPat.qll 6539d0edbdc16e7df849514d51980d4cd1a2c9cbb58ca9e5273851f96df4eb36 45a13bae5220d5737cbd04713a17af5b33d8bb4cfdf17ddd64b298ab0c1eea24 lib/codeql/rust/elements/internal/generated/TupleTypeRepr.qll f6b0db3882b09b914c98c2c96b249416773bf6509a90028bae14dabc2194ad21 66fd831c7a75fd28cf374d8c89069861b69140baf9c912635a3e18d23c9e8414 -lib/codeql/rust/elements/internal/generated/TypeAlias.qll 35dc8344a7d3e537eeedfcf4f460e7a05b8a8d9295dfad3fd9fcab85441ea5d4 ddd6a3165228896b0c2be5594202eb2139dc849aedb874c0d073b76088d64b1c +lib/codeql/rust/elements/internal/generated/TypeAlias.qll 0d0c97d9e9213b8f0390b3456737d4611701a570b9943bb20b348c4efc8e4693 a83c701c0d8914e01517dfa9253a12be962f0a7ed2f75fbaae25a13432db403f lib/codeql/rust/elements/internal/generated/TypeArg.qll 87f9aa99436eacc911d3cd52b3572a940c6fa291ab3e61cc9ef8477546d4caa1 f0a45180180871aa629e81ea63ffaac0966f2f1c333a7e0bac3a6ad043629be8 lib/codeql/rust/elements/internal/generated/TypeBound.qll 80863e417e974265101a64401e70537c3377b324fb85d0efba6c8bd51b7a5b93 5da768b567e354be82919d213e3d860d06a6ed769d72974259820fccfb09118f -lib/codeql/rust/elements/internal/generated/TypeBoundList.qll 0cf7d3846bfaa69ac905ada2186b7fec25f6736cb823029693ed5b77306fba18 57aaf6ae48e50d61c594896211e3992db8189b924af582c889cabdd60ec968af +lib/codeql/rust/elements/internal/generated/TypeBoundList.qll c5d43dc27075a0d5370ba4bc56b4e247357af5d2989625deff284e7846a3a48b c33c87d080e6eb6df01e98b8b0031d780472fcaf3a1ed156a038669c0e05bf0a lib/codeql/rust/elements/internal/generated/TypeItem.qll 940b197a06b11621db980ae8ff8c0c6684cebeff62987ad8267f3838aa768d0a ab0e3b6e23acd1970ea4e2a32bef3cced27072ec9c5d16428626ec2632b33d14 -lib/codeql/rust/elements/internal/generated/TypeParam.qll e658a9eacee28c9e58dff2998fa021997904c5296452839373d658a624adad0d a06f19b90c5a3638eb635f95c37aaba248727f342237fefcf569ed18d0107c5d +lib/codeql/rust/elements/internal/generated/TypeParam.qll 81a8d39f1e227de031187534e5d8e2c34f42ad3433061d686cadfbdd0df54285 893795d62b5b89997574e9057701d308bea2c4dca6053042c5308c512137e697 lib/codeql/rust/elements/internal/generated/TypeRepr.qll 1e7b9d2ddab86e35dad7c31a6453a2a60747420f8bc2e689d5163cab4fec71bb eb80e3947649e511e7f3555ffc1fd87199e7a32624449ca80ffad996cdf9e2f3 -lib/codeql/rust/elements/internal/generated/UnderscoreExpr.qll 79249be8652989a01895218b34cf2805753ccae245ac916d09af5cef4e939f03 721fef3d3c14d56411b0c0fd3ab9eb595469616a9ee17f745f727941f2702d39 +lib/codeql/rust/elements/internal/generated/UnderscoreExpr.qll b3780c99c5d57159bef4c6bd2fd8ec44ebd1854c892c1ca776c740f71249e58c 2fd451cbf0a779e8042e439882e7d9cadc19d1e596df3bbb086d16f2596407c7 lib/codeql/rust/elements/internal/generated/Unextracted.qll 01563dfd769d6dc3c6b8a40d9a4dc0d99a3b6a0c6725c180d2bf4d7633929a17 a93ce90f8c03f4305e59de9c63f089fc7935298fc9a73d091d76933cf63e790c lib/codeql/rust/elements/internal/generated/Unimplemented.qll 7f81857a0a4e993697cdb05fa7ef16d041fff9e5ed491e34102b846cfa12434c fba05d2e35cc04ad2fbbf34d92af8db85f5d518dadd0e484bef2f7dde5f8490a -lib/codeql/rust/elements/internal/generated/Union.qll 2cec251e68904ae61058d6812f72b9260339fb7d4937aa689a70010ae998b608 e66511168ea4cd114816e6eb8660fda9482abd7f0b508df69dd5006e89dca50c +lib/codeql/rust/elements/internal/generated/Union.qll 4df8fc632f7bcc0cbd564cd1c148c1a2438f26e6a83cd6470e15870120f677fe c74dea0a4ddfd581b9208d7907ea134219cafd217294315acf5c595de38a61f3 lib/codeql/rust/elements/internal/generated/UnsafeMeta.qll 4ae970d7db0093a1ecf82f429cb307b38327b618d3a3eddb70b4ec650d58f6fc 2fb1ceac4b60218e55240d30f1ecaf950a4697b49680b2787618bc5a45530e67 -lib/codeql/rust/elements/internal/generated/Use.qll f05ccfcbd47d0cf413de38610f62fc5a407c45abc6b674deee9a1b9c324c6bb4 a921cbdbd17208b8c442cbd19837c715eb2b471bb8d3c7a7369e20fe48e467b9 +lib/codeql/rust/elements/internal/generated/Use.qll cf95b5c4756b25bee74113207786e37464ffbc0fb5f776a04c651300afc53753 1fe26b3904db510184cb688cb0eeb0a8dbac7ac15e27a3b572d839743c738393 lib/codeql/rust/elements/internal/generated/UseBoundGenericArg.qll 69162794e871291545ea04f61259b2d000671a96f7ca129f7dd9ed6e984067c4 31de9ebc0634b38e2347e0608b4ea888892f1f2732a2892464078cd8a07b4ee8 lib/codeql/rust/elements/internal/generated/UseBoundGenericArgs.qll cdf4253b51aa9fb1639089f73f17640f1732e099644d7e8c5f527b5b04175b52 228df08b8597069d7b11aa6b03b35e0d749d32802eb4d2239ba8dd22def5f0e6 -lib/codeql/rust/elements/internal/generated/UseTree.qll 773abe7dce6d7fd1e7536dd3438eaae5b075576393c9408828277c0cf9f00539 1c22e0473241c3c6b8500568e1970c77e2bbdc6729a1c936e4ac19a27bf0f327 +lib/codeql/rust/elements/internal/generated/UseTree.qll 3d7cbcc8ae76068b8f660c7d5b81b05595026043015cd6b4d42a60ed4c165811 b9f0bcf82feb31f31406e787670fee93e1aa0966bcc0e4cc285c342e88793e4e lib/codeql/rust/elements/internal/generated/UseTreeList.qll c8fa4298bd1dc476a16c8b0c2b043674bde9d7360f53eb8a215170fffd32317b 18aa0c886a1f0d805d9fc1771fe73ff1cf3796183ba1e1f5a9408ae359b556c5 -lib/codeql/rust/elements/internal/generated/Variant.qll eb593c99dbd751a54c615cbf10f0ec1805c1aa7175d565efc586dce1d8c20a10 d9e940e97168b43b8d706ac9fd645b4470f9ee67769eda986eb5bd4742f90de2 +lib/codeql/rust/elements/internal/generated/Variant.qll 7a1aedf6518780d1534147d5a52d14542698befe1d8eb8b78eb10d2664c3a69b 180d6de0826b1a75bf8b1853d539f605bff2eb3794ccb57ff23e5b3ee3171956 lib/codeql/rust/elements/internal/generated/VariantList.qll 7d5ffa311b62ecd8d263c8dd843d76b5d7f5f306b6702cbc49d574a3af7fdd5b 947abb4cd46ad3265473fcb29287da4782f932ecd571da0170abed63e1b830e0 -lib/codeql/rust/elements/internal/generated/Visibility.qll e87f4eda96727bcdd59a5cb8e0228e8ce3c46b78cdcf3b9e8ba48354848a6814 179ef35379f6b328aae8b570de2fbd1a2cf8888271f3e80c99dda7bd85b5a822 +lib/codeql/rust/elements/internal/generated/Visibility.qll c6c3099cb563c010e18012772c57bea636967e30f0f90b026f744441fb4c9263 f0db2927498fd5900eedacaaec5f3f538829c1f46306b593ff95699fa6535f68 lib/codeql/rust/elements/internal/generated/VisibilityInner.qll c5117329df3fda9a02095f4084c95a7f8ad68f742ba7ee13d5f06e1abae33fc2 2bde934b77717cd74b59735cbe8f3ae5f700325c3e8176a04d8aabe7548c7ec1 lib/codeql/rust/elements/internal/generated/WhereClause.qll f1ddc9cee259e4d6d9799e2d72bf2e0acb09926246cdb0d8d1914c0cb907bd71 0924e2b188bb20a652f366fafaa6afc251502a0c2bc048204111ba8e18209cd2 lib/codeql/rust/elements/internal/generated/WherePred.qll 373edb54ae03834e6f69a0d3ab08a0392ea35bc20012e4df71d29d401ac49c63 15fcae3f3bc4baf3569ee0f361fc6117ce8cb55ed7152f1c04ee67da909dc4ee lib/codeql/rust/elements/internal/generated/WhileExpr.qll 0353aab87c49569e1fbf5828b8f44457230edfa6b408fb5ec70e3d9b70f2e277 e1ba7c9c41ff150b9aaa43642c0714def4407850f2149232260c1a2672dd574a -lib/codeql/rust/elements/internal/generated/WildcardPat.qll 0f85d877252b91a957c813b7ed7cfca1af30c552c89bb3d7df1ce7baa41db065 04134c062894846b43ca8736f782f8b7280e59446e31dacc6e5b858f0307f4ce +lib/codeql/rust/elements/internal/generated/WildcardPat.qll d74b70b57a0a66bfae017a329352a5b27a6b9e73dd5521d627f680e810c6c59e 4b913b548ba27ff3c82fcd32cf996ff329cb57d176d3bebd0fcef394486ea499 lib/codeql/rust/elements/internal/generated/YeetExpr.qll 5f5ec58a77b5036f5c2de0eaf325f6900fb0ee849a6195328ac43a798612fcc6 10a1829f9c99f8c4dcf9bea3208d9ae4c1879ab4294bb721c58f367e8d78a21e lib/codeql/rust/elements/internal/generated/YieldExpr.qll 3a55be2e767e7d9b017bec36f14b5ad9f1e62b290701ad5dd3a00b2d18ceff56 f3c1f41726538b7b111ba6de3c348f677d0b7595478e17a6697730b97a42b3ae lib/codeql/rust/elements.qll e5ae502dca38c314eb5681d8b80b837cb1b09e59f1ffcccbe1b377658418e496 e5ae502dca38c314eb5681d8b80b837cb1b09e59f1ffcccbe1b377658418e496 diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ArrayListExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ArrayListExpr.qll index d77d271cdcf4..657be83802da 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ArrayListExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ArrayListExpr.qll @@ -23,7 +23,5 @@ module Generated { */ class ArrayListExpr extends Synth::TArrayListExpr, ArrayExprImpl::ArrayExpr { override string getAPrimaryQlClass() { result = "ArrayListExpr" } - - override string toStringImpl() { result = this.getAPrimaryQlClass() } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ArrayRepeatExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ArrayRepeatExpr.qll index 56bd0282679c..df7b21452a1c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ArrayRepeatExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ArrayRepeatExpr.qll @@ -25,8 +25,6 @@ module Generated { class ArrayRepeatExpr extends Synth::TArrayRepeatExpr, ArrayExprImpl::ArrayExpr { override string getAPrimaryQlClass() { result = "ArrayRepeatExpr" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the repeat operand of this array repeat expression. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/AwaitExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/AwaitExpr.qll index 99b1b9ca0a75..baef03315c92 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/AwaitExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/AwaitExpr.qll @@ -29,8 +29,6 @@ module Generated { class AwaitExpr extends Synth::TAwaitExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "AwaitExpr" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this await expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/BecomeExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/BecomeExpr.qll index c05f1808fa04..7fdd78fcbee9 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/BecomeExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/BecomeExpr.qll @@ -32,8 +32,6 @@ module Generated { class BecomeExpr extends Synth::TBecomeExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "BecomeExpr" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this become expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/BinaryExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/BinaryExpr.qll index 6ed429aa960a..68e7d391e396 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/BinaryExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/BinaryExpr.qll @@ -30,8 +30,6 @@ module Generated { class BinaryExpr extends Synth::TBinaryExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "BinaryExpr" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this binary expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/BoxPat.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/BoxPat.qll index b0ae3bfd0c18..ddd1d312c6b3 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/BoxPat.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/BoxPat.qll @@ -28,8 +28,6 @@ module Generated { class BoxPat extends Synth::TBoxPat, PatImpl::Pat { override string getAPrimaryQlClass() { result = "BoxPat" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the pattern of this box pattern, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/BreakExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/BreakExpr.qll index 332bab69bce9..dae4a83377cf 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/BreakExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/BreakExpr.qll @@ -46,8 +46,6 @@ module Generated { class BreakExpr extends Synth::TBreakExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "BreakExpr" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this break expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/CallExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/CallExpr.qll index 996f984a17eb..196b78c1bde1 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/CallExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/CallExpr.qll @@ -33,8 +33,6 @@ module Generated { class CallExpr extends Synth::TCallExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "CallExpr" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the argument list of this call expression, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/CastExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/CastExpr.qll index 02723a5bd68c..a3725ff1a45f 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/CastExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/CastExpr.qll @@ -27,8 +27,6 @@ module Generated { class CastExpr extends Synth::TCastExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "CastExpr" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this cast expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ClosureExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ClosureExpr.qll index bc9f7d103f89..86e1178589af 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ClosureExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ClosureExpr.qll @@ -37,8 +37,6 @@ module Generated { class ClosureExpr extends Synth::TClosureExpr, ExprImpl::Expr, CallableImpl::Callable { override string getAPrimaryQlClass() { result = "ClosureExpr" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the closure body of this closure expression, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Comment.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Comment.qll index fa92b65fff87..7a4ca595f113 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Comment.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Comment.qll @@ -26,8 +26,6 @@ module Generated { class Comment extends Synth::TComment, TokenImpl::Token { override string getAPrimaryQlClass() { result = "Comment" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the parent of this comment. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Const.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Const.qll index 8798020310a8..07ffd9058bba 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Const.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Const.qll @@ -33,8 +33,6 @@ module Generated { class Const extends Synth::TConst, AssocItemImpl::AssocItem { override string getAPrimaryQlClass() { result = "Const" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this const (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ContinueExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ContinueExpr.qll index 69b4e87b3f45..9e8df8e22e6b 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ContinueExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ContinueExpr.qll @@ -37,8 +37,6 @@ module Generated { class ContinueExpr extends Synth::TContinueExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "ContinueExpr" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this continue expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Crate.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Crate.qll index dc3ca123591e..644b23f1a1ea 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Crate.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Crate.qll @@ -21,8 +21,6 @@ module Generated { class Crate extends Synth::TCrate, LocatableImpl::Locatable { override string getAPrimaryQlClass() { result = "Crate" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the name of this crate, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Enum.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Enum.qll index 46e498bca254..35ff29361bc1 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Enum.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Enum.qll @@ -27,8 +27,6 @@ module Generated { class Enum extends Synth::TEnum, TypeItemImpl::TypeItem { override string getAPrimaryQlClass() { result = "Enum" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the variant list of this enum, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ExtractorStep.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ExtractorStep.qll index f6aca65c944f..e74b0e9680f1 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ExtractorStep.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ExtractorStep.qll @@ -21,8 +21,6 @@ module Generated { class ExtractorStep extends Synth::TExtractorStep, ElementImpl::Element { override string getAPrimaryQlClass() { result = "ExtractorStep" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the action of this extractor step. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/FieldExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/FieldExpr.qll index 87b10745862d..acb19cd2a52e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/FieldExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/FieldExpr.qll @@ -27,8 +27,6 @@ module Generated { class FieldExpr extends Synth::TFieldExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "FieldExpr" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this field expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ForBinder.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ForBinder.qll index bc5825b9d79c..38512084e395 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ForBinder.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ForBinder.qll @@ -33,8 +33,6 @@ module Generated { class ForBinder extends Synth::TForBinder, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "ForBinder" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the generic parameter list of this for binder, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Format.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Format.qll index 350c978e6622..385eb04140e0 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Format.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Format.qll @@ -30,8 +30,6 @@ module Generated { class Format extends Synth::TFormat, LocatableImpl::Locatable { override string getAPrimaryQlClass() { result = "Format" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the parent of this format. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgument.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgument.qll index 9668b3c1fea8..a1db224494b5 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgument.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgument.qll @@ -30,8 +30,6 @@ module Generated { class FormatArgument extends Synth::TFormatArgument, LocatableImpl::Locatable { override string getAPrimaryQlClass() { result = "FormatArgument" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the parent of this format argument. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/FormatTemplateVariableAccess.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/FormatTemplateVariableAccess.qll index 16fcca1faa38..75e8a134f0ac 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/FormatTemplateVariableAccess.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/FormatTemplateVariableAccess.qll @@ -21,7 +21,5 @@ module Generated { PathExprBaseImpl::PathExprBase { override string getAPrimaryQlClass() { result = "FormatTemplateVariableAccess" } - - override string toStringImpl() { result = this.getAPrimaryQlClass() } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Function.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Function.qll index 0783a3c8d2d8..1221917425d1 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Function.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Function.qll @@ -41,8 +41,6 @@ module Generated { { override string getAPrimaryQlClass() { result = "Function" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the abi of this function, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/GenericArgList.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/GenericArgList.qll index c71cdee31c4a..ac10d591ec17 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/GenericArgList.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/GenericArgList.qll @@ -25,8 +25,6 @@ module Generated { class GenericArgList extends Synth::TGenericArgList, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "GenericArgList" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th generic argument of this generic argument list (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/GenericParamList.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/GenericParamList.qll index 22bd2febaca3..574bcb5f6f3a 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/GenericParamList.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/GenericParamList.qll @@ -28,8 +28,6 @@ module Generated { class GenericParamList extends Synth::TGenericParamList, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "GenericParamList" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th generic parameter of this generic parameter list (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/IdentPat.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/IdentPat.qll index 119c2bc3f175..d016899bc01d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/IdentPat.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/IdentPat.qll @@ -36,8 +36,6 @@ module Generated { class IdentPat extends Synth::TIdentPat, PatImpl::Pat { override string getAPrimaryQlClass() { result = "IdentPat" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this ident pattern (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/IfExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/IfExpr.qll index e227b92af56d..57d726b6210e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/IfExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/IfExpr.qll @@ -36,8 +36,6 @@ module Generated { class IfExpr extends Synth::TIfExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "IfExpr" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this if expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Impl.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Impl.qll index c4e8acc6883b..915e8940fb0e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Impl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Impl.qll @@ -34,8 +34,6 @@ module Generated { class Impl extends Synth::TImpl, ItemImpl::Item { override string getAPrimaryQlClass() { result = "Impl" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the assoc item list of this impl, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ImplTraitTypeRepr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ImplTraitTypeRepr.qll index 4def3e1b8cf4..01ee54612c3d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ImplTraitTypeRepr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ImplTraitTypeRepr.qll @@ -28,8 +28,6 @@ module Generated { class ImplTraitTypeRepr extends Synth::TImplTraitTypeRepr, TypeReprImpl::TypeRepr { override string getAPrimaryQlClass() { result = "ImplTraitTypeRepr" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the type bound list of this impl trait type representation, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/IndexExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/IndexExpr.qll index 6733b94a9857..51a9cd393e42 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/IndexExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/IndexExpr.qll @@ -27,8 +27,6 @@ module Generated { class IndexExpr extends Synth::TIndexExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "IndexExpr" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this index expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/InferTypeRepr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/InferTypeRepr.qll index 4d0cf73c45ad..780cc9a4b07d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/InferTypeRepr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/InferTypeRepr.qll @@ -26,7 +26,5 @@ module Generated { */ class InferTypeRepr extends Synth::TInferTypeRepr, TypeReprImpl::TypeRepr { override string getAPrimaryQlClass() { result = "InferTypeRepr" } - - override string toStringImpl() { result = this.getAPrimaryQlClass() } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Label.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Label.qll index 4ef8f34d07af..8cb3102efd9b 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Label.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Label.qll @@ -28,8 +28,6 @@ module Generated { class Label extends Synth::TLabel, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "Label" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the lifetime of this label, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/LetElse.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/LetElse.qll index 61a3f04c3c10..442a4483c4b8 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/LetElse.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/LetElse.qll @@ -30,8 +30,6 @@ module Generated { class LetElse extends Synth::TLetElse, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "LetElse" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the block expression of this let else, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/LetExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/LetExpr.qll index 73c05af9677a..45e0fa589dab 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/LetExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/LetExpr.qll @@ -29,8 +29,6 @@ module Generated { class LetExpr extends Synth::TLetExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "LetExpr" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this let expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/LetStmt.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/LetStmt.qll index 69551d592698..c971a1548a56 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/LetStmt.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/LetStmt.qll @@ -36,8 +36,6 @@ module Generated { class LetStmt extends Synth::TLetStmt, StmtImpl::Stmt { override string getAPrimaryQlClass() { result = "LetStmt" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this let statement (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Lifetime.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Lifetime.qll index b34a95d84845..9652d460b9ea 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Lifetime.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Lifetime.qll @@ -27,8 +27,6 @@ module Generated { class Lifetime extends Synth::TLifetime, UseBoundGenericArgImpl::UseBoundGenericArg { override string getAPrimaryQlClass() { result = "Lifetime" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the text of this lifetime, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/LiteralExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/LiteralExpr.qll index e799a0710653..57967d06538e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/LiteralExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/LiteralExpr.qll @@ -32,8 +32,6 @@ module Generated { class LiteralExpr extends Synth::TLiteralExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "LiteralExpr" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this literal expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/LiteralPat.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/LiteralPat.qll index b80bc7947334..e3e6c7bd264b 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/LiteralPat.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/LiteralPat.qll @@ -28,8 +28,6 @@ module Generated { class LiteralPat extends Synth::TLiteralPat, PatImpl::Pat { override string getAPrimaryQlClass() { result = "LiteralPat" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the literal of this literal pattern, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/MacroCall.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/MacroCall.qll index 32a0ed282016..bcca8b8deef3 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/MacroCall.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/MacroCall.qll @@ -31,8 +31,6 @@ module Generated { class MacroCall extends Synth::TMacroCall, AssocItemImpl::AssocItem, ExternItemImpl::ExternItem { override string getAPrimaryQlClass() { result = "MacroCall" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this macro call (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/MatchArm.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/MatchArm.qll index 8ad003e81276..47782a2accb1 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/MatchArm.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/MatchArm.qll @@ -37,8 +37,6 @@ module Generated { class MatchArm extends Synth::TMatchArm, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "MatchArm" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this match arm (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/MatchExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/MatchExpr.qll index 621561b8d794..8f49407e5f9e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/MatchExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/MatchExpr.qll @@ -36,8 +36,6 @@ module Generated { class MatchExpr extends Synth::TMatchExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "MatchExpr" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this match expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/MethodCallExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/MethodCallExpr.qll index 725b9fe8d0b8..18d6803211b3 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/MethodCallExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/MethodCallExpr.qll @@ -34,8 +34,6 @@ module Generated { class MethodCallExpr extends Synth::TMethodCallExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "MethodCallExpr" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the argument list of this method call expression, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Module.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Module.qll index 42ac38de7692..b4513c9ae855 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Module.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Module.qll @@ -33,8 +33,6 @@ module Generated { class Module extends Synth::TModule, ItemImpl::Item { override string getAPrimaryQlClass() { result = "Module" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this module (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Name.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Name.qll index d9376b1cbf1f..115ae6afaeac 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Name.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Name.qll @@ -27,8 +27,6 @@ module Generated { class Name extends Synth::TName, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "Name" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the text of this name, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/NameRef.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/NameRef.qll index 7f08d90c1837..f22dbdf5e228 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/NameRef.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/NameRef.qll @@ -27,8 +27,6 @@ module Generated { class NameRef extends Synth::TNameRef, UseBoundGenericArgImpl::UseBoundGenericArg { override string getAPrimaryQlClass() { result = "NameRef" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the text of this name reference, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/NeverTypeRepr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/NeverTypeRepr.qll index 7db304955c78..6da319c83f3b 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/NeverTypeRepr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/NeverTypeRepr.qll @@ -26,7 +26,5 @@ module Generated { */ class NeverTypeRepr extends Synth::TNeverTypeRepr, TypeReprImpl::TypeRepr { override string getAPrimaryQlClass() { result = "NeverTypeRepr" } - - override string toStringImpl() { result = this.getAPrimaryQlClass() } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/OrPat.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/OrPat.qll index 47acbf363862..548ca32eb5ff 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/OrPat.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/OrPat.qll @@ -27,8 +27,6 @@ module Generated { class OrPat extends Synth::TOrPat, PatImpl::Pat { override string getAPrimaryQlClass() { result = "OrPat" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th pattern of this or pattern (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Param.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Param.qll index 80de784e8f0c..8e6176de53cc 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Param.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Param.qll @@ -27,8 +27,6 @@ module Generated { class Param extends Synth::TParam, ParamBaseImpl::ParamBase { override string getAPrimaryQlClass() { result = "Param" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the pattern of this parameter, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ParenExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ParenExpr.qll index 3ac0f192f460..560398ca7f29 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ParenExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ParenExpr.qll @@ -28,8 +28,6 @@ module Generated { class ParenExpr extends Synth::TParenExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "ParenExpr" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this paren expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ParenPat.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ParenPat.qll index 0ed82b8dd582..ddf678e24473 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ParenPat.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ParenPat.qll @@ -28,8 +28,6 @@ module Generated { class ParenPat extends Synth::TParenPat, PatImpl::Pat { override string getAPrimaryQlClass() { result = "ParenPat" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the pattern of this paren pattern, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ParenTypeRepr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ParenTypeRepr.qll index 5ad0c0c6224e..b174f19a1a01 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ParenTypeRepr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ParenTypeRepr.qll @@ -28,8 +28,6 @@ module Generated { class ParenTypeRepr extends Synth::TParenTypeRepr, TypeReprImpl::TypeRepr { override string getAPrimaryQlClass() { result = "ParenTypeRepr" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the type representation of this paren type representation, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Path.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Path.qll index 53103baddf70..60248dc9d304 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Path.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Path.qll @@ -29,8 +29,6 @@ module Generated { class Path extends Synth::TPath, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "Path" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the qualifier of this path, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/PathExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/PathExpr.qll index 00a45ec43f42..7409a2854534 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/PathExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/PathExpr.qll @@ -31,8 +31,6 @@ module Generated { { override string getAPrimaryQlClass() { result = "PathExpr" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this path expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/PathPat.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/PathPat.qll index 40cb5174c096..3e69bb2cb32c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/PathPat.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/PathPat.qll @@ -27,7 +27,5 @@ module Generated { */ class PathPat extends Synth::TPathPat, PatImpl::Pat, PathAstNodeImpl::PathAstNode { override string getAPrimaryQlClass() { result = "PathPat" } - - override string toStringImpl() { result = this.getAPrimaryQlClass() } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/PathSegment.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/PathSegment.qll index f26562d2e9f3..dd831902b99c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/PathSegment.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/PathSegment.qll @@ -34,8 +34,6 @@ module Generated { class PathSegment extends Synth::TPathSegment, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "PathSegment" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the generic argument list of this path segment, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/PathTypeRepr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/PathTypeRepr.qll index 6f6bef8cc1c5..7fa652459f73 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/PathTypeRepr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/PathTypeRepr.qll @@ -26,8 +26,6 @@ module Generated { class PathTypeRepr extends Synth::TPathTypeRepr, TypeReprImpl::TypeRepr { override string getAPrimaryQlClass() { result = "PathTypeRepr" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the path of this path type representation, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/PrefixExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/PrefixExpr.qll index 2f69986daf70..d8c4bc290515 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/PrefixExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/PrefixExpr.qll @@ -28,8 +28,6 @@ module Generated { class PrefixExpr extends Synth::TPrefixExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "PrefixExpr" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this prefix expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/RangeExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/RangeExpr.qll index 4bfba674a973..06595838c222 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/RangeExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/RangeExpr.qll @@ -31,8 +31,6 @@ module Generated { class RangeExpr extends Synth::TRangeExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "RangeExpr" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this range expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/RefExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/RefExpr.qll index 64c126c2bf5d..4eef67e3ed17 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/RefExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/RefExpr.qll @@ -29,8 +29,6 @@ module Generated { class RefExpr extends Synth::TRefExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "RefExpr" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this reference expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/RefPat.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/RefPat.qll index d45d9be5bda1..b954663a2dbf 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/RefPat.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/RefPat.qll @@ -28,8 +28,6 @@ module Generated { class RefPat extends Synth::TRefPat, PatImpl::Pat { override string getAPrimaryQlClass() { result = "RefPat" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Holds if this reference pattern is mut. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/RestPat.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/RestPat.qll index dbfb5ee4ae2f..0134255b8285 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/RestPat.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/RestPat.qll @@ -28,8 +28,6 @@ module Generated { class RestPat extends Synth::TRestPat, PatImpl::Pat { override string getAPrimaryQlClass() { result = "RestPat" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this rest pattern (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ReturnExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ReturnExpr.qll index 0f2d9a77ac42..184b14b8fcf0 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ReturnExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ReturnExpr.qll @@ -33,8 +33,6 @@ module Generated { class ReturnExpr extends Synth::TReturnExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "ReturnExpr" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this return expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Static.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Static.qll index 4324ff4cd402..075b48c42e31 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Static.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Static.qll @@ -31,8 +31,6 @@ module Generated { class Static extends Synth::TStatic, ExternItemImpl::ExternItem { override string getAPrimaryQlClass() { result = "Static" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this static (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Struct.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Struct.qll index 857b8a623d93..07c4657c651f 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Struct.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Struct.qll @@ -28,8 +28,6 @@ module Generated { class Struct extends Synth::TStruct, TypeItemImpl::TypeItem { override string getAPrimaryQlClass() { result = "Struct" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the field list of this struct, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/StructExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/StructExpr.qll index d9b90c5233b0..c9fbacd72686 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/StructExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/StructExpr.qll @@ -29,8 +29,6 @@ module Generated { class StructExpr extends Synth::TStructExpr, ExprImpl::Expr, PathAstNodeImpl::PathAstNode { override string getAPrimaryQlClass() { result = "StructExpr" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the struct expression field list of this struct expression, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/StructExprField.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/StructExprField.qll index b2bace71760f..16dfbd946af1 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/StructExprField.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/StructExprField.qll @@ -27,8 +27,6 @@ module Generated { class StructExprField extends Synth::TStructExprField, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "StructExprField" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this struct expression field (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/StructField.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/StructField.qll index 2a8e85994190..2e540f11314f 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/StructField.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/StructField.qll @@ -33,8 +33,6 @@ module Generated { class StructField extends Synth::TStructField, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "StructField" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this struct field (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/StructPat.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/StructPat.qll index 64129c6df648..93f89aae3523 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/StructPat.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/StructPat.qll @@ -29,8 +29,6 @@ module Generated { class StructPat extends Synth::TStructPat, PatImpl::Pat, PathAstNodeImpl::PathAstNode { override string getAPrimaryQlClass() { result = "StructPat" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the struct pattern field list of this struct pattern, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/StructPatField.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/StructPatField.qll index 9d8348447454..40a2d3f74d52 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/StructPatField.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/StructPatField.qll @@ -27,8 +27,6 @@ module Generated { class StructPatField extends Synth::TStructPatField, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "StructPatField" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this struct pattern field (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Trait.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Trait.qll index f223e14a8c66..878c3ae4b015 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Trait.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Trait.qll @@ -38,8 +38,6 @@ module Generated { class Trait extends Synth::TTrait, ItemImpl::Item { override string getAPrimaryQlClass() { result = "Trait" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the assoc item list of this trait, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/TupleStructPat.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/TupleStructPat.qll index e902984b973c..859e8dfe3bb2 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/TupleStructPat.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/TupleStructPat.qll @@ -30,8 +30,6 @@ module Generated { class TupleStructPat extends Synth::TTupleStructPat, PatImpl::Pat, PathAstNodeImpl::PathAstNode { override string getAPrimaryQlClass() { result = "TupleStructPat" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th field of this tuple struct pattern (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/TypeAlias.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/TypeAlias.qll index 10671581be1f..063658e0a7bc 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/TypeAlias.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/TypeAlias.qll @@ -37,8 +37,6 @@ module Generated { class TypeAlias extends Synth::TTypeAlias, AssocItemImpl::AssocItem, ExternItemImpl::ExternItem { override string getAPrimaryQlClass() { result = "TypeAlias" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this type alias (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/TypeBoundList.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/TypeBoundList.qll index 29cc078f7e17..e2fa4152d024 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/TypeBoundList.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/TypeBoundList.qll @@ -28,8 +28,6 @@ module Generated { class TypeBoundList extends Synth::TTypeBoundList, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "TypeBoundList" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th bound of this type bound list (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/TypeParam.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/TypeParam.qll index 58df0abde48f..5379ca78306e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/TypeParam.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/TypeParam.qll @@ -31,8 +31,6 @@ module Generated { class TypeParam extends Synth::TTypeParam, GenericParamImpl::GenericParam { override string getAPrimaryQlClass() { result = "TypeParam" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this type parameter (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/UnderscoreExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/UnderscoreExpr.qll index 27f75fe894e1..89cc654eb17c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/UnderscoreExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/UnderscoreExpr.qll @@ -25,8 +25,6 @@ module Generated { class UnderscoreExpr extends Synth::TUnderscoreExpr, ExprImpl::Expr { override string getAPrimaryQlClass() { result = "UnderscoreExpr" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this underscore expression (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Union.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Union.qll index d25fa6067ad1..5d31edafa114 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Union.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Union.qll @@ -27,8 +27,6 @@ module Generated { class Union extends Synth::TUnion, TypeItemImpl::TypeItem { override string getAPrimaryQlClass() { result = "Union" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the struct field list of this union, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Use.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Use.qll index c82c528eecc6..ba3cc1de397b 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Use.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Use.qll @@ -27,8 +27,6 @@ module Generated { class Use extends Synth::TUse, ItemImpl::Item { override string getAPrimaryQlClass() { result = "Use" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this use (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/UseTree.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/UseTree.qll index b5751811715a..7279c4e9c44f 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/UseTree.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/UseTree.qll @@ -30,8 +30,6 @@ module Generated { class UseTree extends Synth::TUseTree, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "UseTree" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Holds if this use tree is glob. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Variant.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Variant.qll index b48f9bb8bc5f..c37995f77a0f 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Variant.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Variant.qll @@ -32,8 +32,6 @@ module Generated { class Variant extends Synth::TVariant, AddressableImpl::Addressable { override string getAPrimaryQlClass() { result = "Variant" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the `index`th attr of this variant (0-based). */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Visibility.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Visibility.qll index a031c6692d84..e37eff57a895 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Visibility.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Visibility.qll @@ -28,8 +28,6 @@ module Generated { class Visibility extends Synth::TVisibility, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "Visibility" } - override string toStringImpl() { result = this.getAPrimaryQlClass() } - /** * Gets the visibility inner of this visibility, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/WildcardPat.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/WildcardPat.qll index 2a2be0e5cea1..e87383562c61 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/WildcardPat.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/WildcardPat.qll @@ -23,7 +23,5 @@ module Generated { */ class WildcardPat extends Synth::TWildcardPat, PatImpl::Pat { override string getAPrimaryQlClass() { result = "WildcardPat" } - - override string toStringImpl() { result = this.getAPrimaryQlClass() } } } From 78a4f9c562ab3fce2362d1e29dab4ad5a1fe4595 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Fri, 18 Sep 2026 10:52:22 +0200 Subject: [PATCH 1120/2098] Shared: Add `InverseAppend` modules for effecient prefix matching --- shared/util/codeql/util/Strings.qll | 191 ++++++++++++++++++++++++++++ 1 file changed, 191 insertions(+) diff --git a/shared/util/codeql/util/Strings.qll b/shared/util/codeql/util/Strings.qll index b032bb73672b..de4139550dbe 100644 --- a/shared/util/codeql/util/Strings.qll +++ b/shared/util/codeql/util/Strings.qll @@ -91,3 +91,194 @@ int asciiPrintable(string char) { .charAt(_) ) } + +/** + * Escapes all characters in `s` that have special meaning in regular expressions. + */ +bindingset[s] +string regexpEscape(string s) { + result = s.regexpReplaceAll("([\\\\.*+?\\[^\\]$(){}=!<>|:\\-])", "\\\\$1") +} + +/** Provides the input to `InverseAppend`. */ +signature module InverseAppendInputSig { + /** A prefix matching result. */ + bindingset[this] + class Result; + + /** + * Holds if `prefix` is a prefix candidate with resulting value `res`. + */ + predicate prefixCandidate(string prefix, Result res); +} + +/** Provides the `inverseAppend` predicate. */ +module InverseAppend { + /** + * Holds if `s = prefix + suffix` with resulting value `res`. + * + * The predicate avoids unnecessary result fan-out by first constraining the + * prefix using a regular expression match. + */ + bindingset[s] + predicate inverseAppend(string s, string prefix, string suffix, Input::Result res) { + exists(string regexp | + regexp = + "(" + + strictconcat(string prefixCand | + Input::prefixCandidate(prefixCand, _) + | + regexpEscape(prefixCand), "|" + ) + ").*" and + prefix = s.regexpCapture(regexp, 1) and + s = prefix + suffix and + Input::prefixCandidate(prefix, res) + ) + } +} + +/** Provides the input to `InverseAppend1`. */ +signature module InverseAppend1InputSig { + /** A prefix matching context. */ + bindingset[this] + class C; + + /** A prefix matching result. */ + bindingset[this] + class Result; + + /** + * Holds if `prefix` is a prefix candidate in the context `c` + * with resulting value `res`. + */ + predicate prefixCandidate(string prefix, C c, Result res); +} + +/** Provides the `inverseAppend` predicate. */ +module InverseAppend1 { + /** + * Holds if `s = prefix + suffix` in the context `c` with resulting + * value `res`. + * + * The predicate avoids unnecessary result fan-out by first constraining the + * prefix using a regular expression match. + */ + bindingset[s] + predicate inverseAppend(string s, string prefix, string suffix, Input::C c, Input::Result res) { + exists(string regexp | + regexp = + "(" + + strictconcat(string prefixCand | + Input::prefixCandidate(prefixCand, c, _) + | + regexpEscape(prefixCand), "|" + ) + ").*" and + prefix = s.regexpCapture(regexp, 1) and + s = prefix + suffix and + Input::prefixCandidate(prefix, c, res) + ) + } +} + +/** Provides the input to `InverseAppend2`. */ +signature module InverseAppend2InputSig { + /** A prefix matching context. */ + bindingset[this] + class C1; + + /** A prefix matching context. */ + bindingset[this] + class C2; + + /** A prefix matching result. */ + bindingset[this] + class Result; + + /** + * Holds if `prefix` is a prefix candidate in the context `(c1, c2)` + * with resulting value `res`. + */ + predicate prefixCandidate(string prefix, C1 c1, C2 c2, Result res); +} + +/** Provides the `inverseAppend` predicate. */ +module InverseAppend2 { + /** + * Holds if `s = prefix + suffix` in the context `(c1, c2)` with resulting + * value `res`. + * + * The predicate avoids unnecessary result fan-out by first constraining the + * prefix using a regular expression match. + */ + bindingset[s] + predicate inverseAppend( + string s, string prefix, string suffix, Input::C1 c1, Input::C2 c2, Input::Result res + ) { + exists(string regexp | + regexp = + "(" + + strictconcat(string prefixCand | + Input::prefixCandidate(prefixCand, c1, c2, _) + | + regexpEscape(prefixCand), "|" + ) + ").*" and + prefix = s.regexpCapture(regexp, 1) and + s = prefix + suffix and + Input::prefixCandidate(prefix, c1, c2, res) + ) + } +} + +/** Provides the input to `InverseAppend3`. */ +signature module InverseAppend3InputSig { + /** A prefix matching context. */ + bindingset[this] + class C1; + + /** A prefix matching context. */ + bindingset[this] + class C2; + + /** A prefix matching context. */ + bindingset[this] + class C3; + + /** A prefix matching result. */ + bindingset[this] + class Result; + + /** + * Holds if `prefix` is a prefix candidate in the context `(c1, c2, c3)` + * with resulting value `res`. + */ + predicate prefixCandidate(string prefix, C1 c1, C2 c2, C3 c3, Result res); +} + +/** Provides the `inverseAppend` predicate. */ +module InverseAppend3 { + /** + * Holds if `s = prefix + suffix` in the context `(c1, c2, c3)` with resulting + * value `res`. + * + * The predicate avoids unnecessary result fan-out by first constraining the + * prefix using a regular expression match. + */ + bindingset[s] + predicate inverseAppend( + string s, string prefix, string suffix, Input::C1 c1, Input::C2 c2, Input::C3 c3, + Input::Result res + ) { + exists(string regexp | + regexp = + "(" + + strictconcat(string prefixCand | + Input::prefixCandidate(prefixCand, c1, c2, c3, _) + | + regexpEscape(prefixCand), "|" + ) + ").*" and + prefix = s.regexpCapture(regexp, 1) and + s = prefix + suffix and + Input::prefixCandidate(prefix, c1, c2, c3, res) + ) + } +} From 3720a8cfa98bc2392fa210b7057b96a4e3f32841 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Fri, 18 Sep 2026 10:53:18 +0200 Subject: [PATCH 1121/2098] Type inference: Performance tweaks --- .../typeinference/internal/TypeInference.qll | 107 ++++++++++++++---- 1 file changed, 86 insertions(+), 21 deletions(-) diff --git a/shared/typeinference/codeql/typeinference/internal/TypeInference.qll b/shared/typeinference/codeql/typeinference/internal/TypeInference.qll index 399e5d818c87..a475a19096d7 100644 --- a/shared/typeinference/codeql/typeinference/internal/TypeInference.qll +++ b/shared/typeinference/codeql/typeinference/internal/TypeInference.qll @@ -70,6 +70,7 @@ overlay[local?] module; private import codeql.util.Location +private import codeql.util.Strings /** Provides the input to `Make1`. */ signature module InputSig1 { @@ -1261,30 +1262,58 @@ module Make1 Input1> { module MatchingWithEnvironment { private import Input + private Type getTypeArgumentNonPseudo(Access a, int pos, TypePath path) { + result = a.getTypeArgument(pos, path) and + not result instanceof PseudoType + } + /** * Gets the type of the type argument at `path` in `a` that corresponds to * the type parameter `tp` in `target`, if any. * * Note that this predicate crucially does not depend on type inference, - * and hence can appear in negated position, e.g., as in - * `directTypeMatch`. + * and hence can appear in negated position, e.g., as in `directTypeMatch`. */ bindingset[a, target] pragma[inline_late] Type getTypeArgument(Access a, Declaration target, TypeParameter tp, TypePath path) { exists(int pos | - result = a.getTypeArgument(pos, path) and - tp = target.getTypeParameter(pos) and - not result instanceof PseudoType + result = getTypeArgumentNonPseudo(a, pos, path) and + tp = target.getTypeParameter(pos) + ) + } + + bindingset[a, target] + pragma[inline_late] + private predicate hasNotTypeArgument0(Access a, Declaration target, TypeParameter tp) { + exists(int pos | + tp = target.getTypeParameter(pragma[only_bind_into](pos)) and + not exists(getTypeArgumentNonPseudo(a, pos, _)) ) } + bindingset[target, tp] + pragma[inline_late] + private predicate hasNotTypeArgument1(Declaration target, TypeParameter tp) { + not tp = target.getTypeParameter(_) + } + + /** + * A join-order optimized version of `not exists(getTypeArgument(a, target, tp, _)`. + */ + pragma[inline] + private predicate hasNotTypeArgument(Access a, Declaration target, TypeParameter tp) { + hasNotTypeArgument0(a, target, tp) + or + hasNotTypeArgument1(target, tp) + } + pragma[nomagic] private predicate directTypeMatch0( Access a, DeclarationPosition dpos, AccessEnvironment e, Declaration target, TypePath pathToTypeParam, TypeParameter tp ) { - not exists(getTypeArgument(a, target, tp, _)) and + hasNotTypeArgument(a, target, tp) and tp = target.getDeclaredType(dpos, pathToTypeParam) and target = a.getTarget(e) } @@ -1359,12 +1388,18 @@ module Make1 Input1> { t = a.getInferredType(e, apos, TypePath::nil()) } + private predicate relevantAccessTarget( + Access a, AccessPosition apos, AccessEnvironment e, Declaration target + ) { + exists(Type t | + accessTargetsWithArgRootType(a, e, target, apos, t) and + argRootTypeSatisfiesTargetTypeCand(t, target, apos, _, _) + ) + } + private newtype TRelevantAccess = MkRelevantAccess(Access a, AccessPosition apos, AccessEnvironment e) { - exists(Declaration target, Type t | - accessTargetsWithArgRootType(a, e, target, apos, t) and - argRootTypeSatisfiesTargetTypeCand(t, target, apos, _, _) - ) + relevantAccessTarget(a, apos, e, _) } private class RelevantAccess extends MkRelevantAccess { @@ -1374,7 +1409,12 @@ module Make1 Input1> { RelevantAccess() { this = MkRelevantAccess(a, apos, e) } - RelevantTarget getTarget() { result = MkRelevantTarget(a.getTarget(e), apos) } + RelevantTarget getTarget() { + exists(Declaration target | + relevantAccessTarget(a, apos, e, target) and + result = MkRelevantTarget(target, apos) + ) + } pragma[nomagic] Type getTypeAt(TypePath path) { result = a.getInferredType(e, apos, path) } @@ -1395,6 +1435,18 @@ module Make1 Input1> { private module SatisfiesParameterConstraint = SatisfiesConstraint; + private module InverseAppend2Input implements InverseAppend2InputSig { + class C1 = Declaration; + + class C2 = AccessPosition; + + class Result = TypeParameter; + + predicate prefixCandidate(string prefix, C1 c1, C2 c2, Result res) { + argRootTypeSatisfiesTargetTypeCand(_, c1, c2, res, prefix) + } + } + /** * Holds if the (transitive) base type `t` at `path` of `a` in environment `e` * for some `AccessPosition` matches the type parameter `tp`, which is used in @@ -1431,13 +1483,12 @@ module Make1 Input1> { predicate baseTypeMatch( Access a, AccessEnvironment e, Declaration target, TypePath path, Type t, TypeParameter tp ) { - exists(AccessPosition apos, TypePath pathToTp | - argRootTypeSatisfiesTargetTypeCand(_, target, pragma[only_bind_into](apos), tp, pathToTp) and + exists(AccessPosition apos, TypePath pathFull | SatisfiesParameterConstraint::satisfiesConstraint(MkRelevantAccess(a, pragma[only_bind_into](apos), e), - MkRelevantTarget(target, pragma[only_bind_into](apos)), pathToTp.appendInverse(path), - t) and - not exists(getTypeArgument(a, target, tp, _)) + MkRelevantTarget(target, pragma[only_bind_into](apos)), pathFull, t) and + InverseAppend2::inverseAppend(pathFull, _, path, target, apos, tp) and + hasNotTypeArgument(a, target, tp) ) } } @@ -1591,15 +1642,29 @@ module Make1 Input1> { constrainedTp != tp } + private module InverseAppend3Input implements InverseAppend3InputSig { + class C1 = Declaration; + + class C2 = TypeParameter; + + class C3 = TypeMention; + + class Result = TypeParameter; + + predicate prefixCandidate(string prefix, C1 c1, C2 c2, C3 c3, Result res) { + typeParameterConstraintHasTypeParameter(c1, c2, c3, prefix, res) + } + } + pragma[nomagic] private predicate typeConstraintBaseTypeMatch( Access a, AccessEnvironment e, Declaration target, TypePath path, Type t, TypeParameter tp ) { - not exists(getTypeArgument(a, target, tp, _)) and - exists(TypeMention constraint, TypeParameter constrainedTp, TypePath pathToTp | - typeParameterConstraintHasTypeParameter(target, constrainedTp, constraint, pathToTp, tp) and - AccessConstraint::satisfiesConstraint(a, e, target, constrainedTp, constraint, - pathToTp.appendInverse(path), t) + hasNotTypeArgument(a, target, tp) and + exists(TypeParameter constrainedTp, TypeMention constraint, TypePath pathFull | + AccessConstraint::satisfiesConstraint(a, e, target, constrainedTp, constraint, pathFull, t) and + InverseAppend3::inverseAppend(pathFull, _, path, target, + constrainedTp, constraint, tp) ) } From fa56fb4b6df943cdc2b867a3073c74ccd0ad6cd4 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Fri, 18 Sep 2026 11:02:40 +0200 Subject: [PATCH 1122/2098] Unified: Improve toString of UnaryExpr, BinaryExpr, CallExpr, and MemberAccessExpr. --- .../lib/codeql/unified/internal/FacadeAst.qll | 24 + .../controlflow/basicblock-slices.expected | 364 +++++++-------- .../library-tests/controlflow/cfg.expected | 138 +++--- .../test/library-tests/controlflow/cfg.swift | 94 ++-- .../test/library-tests/dataflow/test.expected | 430 +++++++++--------- 5 files changed, 537 insertions(+), 513 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll index 54efc88a473d..39641a63273a 100644 --- a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll +++ b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll @@ -152,6 +152,8 @@ module Unified { } class MemberAccessExpr extends G::MemberAccessExpr { + override string toString() { result = "... ." + this.getMemberName() } + /** Gets the member name of this access. */ string getMemberName() { result = this.getMemberNameNode().getValue() } } @@ -183,12 +185,34 @@ module Unified { /** A binary expression. */ class BinaryExpr extends G::BinaryExpr { + override string toString() { result = "... " + this.getOperator().getValue() + " ..." } + /** Gets an operand of this binary expression. */ Expr getAnOperand() { result = [this.getLeft(), this.getRight()] } } + /** A unary expression. */ + class UnaryExpr extends G::UnaryExpr { + override string toString() { + result = this.getOperator().(PrefixOperator).getValue() + " ..." or + result = "... " + this.getOperator().(PostfixOperator).getValue() + } + } + /** A function call */ class CallExpr extends G::CallExpr { + override string toString() { + exists(Expr callee | callee = this.getCallee() | + result = callee.(Token).getValue() + "(...)" + or + result = callee.(MemberAccessExpr).getMemberName() + "(...)" + or + not callee instanceof Token and + not callee instanceof MemberAccessExpr and + result = "...(...)" + ) + } + /** Gets the named argument with the given `name`. */ Expr getNamedArgument(string name) { exists(Argument arg | diff --git a/unified/ql/test/library-tests/controlflow/basicblock-slices.expected b/unified/ql/test/library-tests/controlflow/basicblock-slices.expected index f34783a37dc0..96892bf91adf 100644 --- a/unified/ql/test/library-tests/controlflow/basicblock-slices.expected +++ b/unified/ql/test/library-tests/controlflow/basicblock-slices.expected @@ -1,123 +1,123 @@ | 1 | cfg.swift:1:1:604:2 | Block | 'Block -V VariableDeclaration -V topLevelDecl -> Int -> 0' | | 2 | cfg.swift:2:1:2:1 | 0 | '0' | -| 3 | cfg.swift:3:1:3:12 | topLevelDecl | 'topLevelDecl -> 1 -^ BinaryExpr' | +| 3 | cfg.swift:3:1:3:12 | topLevelDecl | 'topLevelDecl -> 1 -^ ... + ...' | | 5 | cfg.swift:5:1:5:37 | Block | 'Block -V 0 -^ ReturnExpr' | | 5 | cfg.swift:5:1:5:37 | FunctionDeclaration | 'FunctionDeclaration' | -| 7 | cfg.swift:7:1:7:10 | returnZero | 'returnZero -^ CallExpr' | -| 8 | cfg.swift:8:1:8:6 | Double | 'Double -> Argument -V topLevelDecl -^ CallExpr' | +| 7 | cfg.swift:7:1:7:10 | returnZero | 'returnZero -^ returnZero(...)' | +| 8 | cfg.swift:8:1:8:6 | Double | 'Double -> Argument -V topLevelDecl -^ Double(...)' | | 10 | cfg.swift:10:1:13:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V MyError -^ BaseType -V Error' | | 11 | cfg.swift:11:10:11:16 | VariableDeclaration | 'VariableDeclaration -V error1 -> VariableDeclaration -V error2' | | 12 | cfg.swift:12:10:12:31 | ClassLikeDeclaration | 'ClassLikeDeclaration -V error3 -^ ConstructorDeclaration' | | 12 | cfg.swift:12:17:12:25 | withParam | 'withParam -^ Block' | | 15 | cfg.swift:15:1:17:1 | FunctionDeclaration | 'FunctionDeclaration' | | 15 | cfg.swift:15:13:15:13 | x | 'x -^ Block' | -| 16 | cfg.swift:16:10:16:10 | x | 'x -> 0 -^ BinaryExpr -^ ReturnExpr' | +| 16 | cfg.swift:16:10:16:10 | x | 'x -> 0 -^ ... == ... -^ ReturnExpr' | | 19 | cfg.swift:19:1:26:1 | FunctionDeclaration | 'FunctionDeclaration' | | 19 | cfg.swift:19:17:19:17 | x | 'x -^ Block' | -| 20 | cfg.swift:20:3:22:3 | GuardIfStmt | 'GuardIfStmt -V x -> 0 -^ BinaryExpr' | +| 20 | cfg.swift:20:3:22:3 | GuardIfStmt | 'GuardIfStmt -V x -> 0 -^ ... >= ...' | | 20 | cfg.swift:20:21:22:3 | Block | 'Block' | -| 21 | cfg.swift:21:11:21:17 | MyError | 'MyError -^ MemberAccessExpr -^ ThrowExpr' | -| 23 | cfg.swift:23:3:25:3 | GuardIfStmt | 'GuardIfStmt -V x -> 0 -^ BinaryExpr' | +| 21 | cfg.swift:21:11:21:17 | MyError | 'MyError -^ ... .error1 -^ ThrowExpr' | +| 23 | cfg.swift:23:3:25:3 | GuardIfStmt | 'GuardIfStmt -V x -> 0 -^ ... <= ...' | | 23 | cfg.swift:23:21:25:3 | Block | 'Block' | -| 24 | cfg.swift:24:11:24:17 | MyError | 'MyError -^ MemberAccessExpr -> Argument -V x -> 1 -^ BinaryExpr -^ CallExpr -^ ThrowExpr' | +| 24 | cfg.swift:24:11:24:17 | MyError | 'MyError -^ ... .error3 -> Argument -V x -> 1 -^ ... + ... -^ error3(...) -^ ThrowExpr' | | 28 | cfg.swift:28:1:45:1 | FunctionDeclaration | 'FunctionDeclaration' | | 28 | cfg.swift:28:15:28:15 | x | 'x -^ Block' | | 29 | cfg.swift:29:3:43:3 | TryExpr | 'TryExpr -V Block' | -| 30 | cfg.swift:30:5:30:24 | UnaryExpr | 'UnaryExpr' | -| 30 | cfg.swift:30:9:30:18 | mightThrow | 'mightThrow -> Argument -V 0 -^ CallExpr' | -| 31 | cfg.swift:31:5:31:9 | print | 'print -> Argument -V "Did not throw." -^ CallExpr' | -| 32 | cfg.swift:32:10:32:19 | mightThrow | 'mightThrow -> Argument -V 0 -^ CallExpr -^ UnaryExpr' | -| 33 | cfg.swift:33:5:33:9 | print | 'print -> Argument -V "Still did not throw." -^ CallExpr' | -| 35 | cfg.swift:35:5:37:3 | CatchClause | 'CatchClause -V MyError -^ MemberAccessExpr -> isZero -> Argument -V x -^ CallExpr -? MyError -^ MemberAccessExpr -^ ConditionalPattern -^ OrPattern' | +| 30 | cfg.swift:30:5:30:24 | try ... | 'try ...' | +| 30 | cfg.swift:30:9:30:18 | mightThrow | 'mightThrow -> Argument -V 0 -^ mightThrow(...)' | +| 31 | cfg.swift:31:5:31:9 | print | 'print -> Argument -V "Did not throw." -^ print(...)' | +| 32 | cfg.swift:32:10:32:19 | mightThrow | 'mightThrow -> Argument -V 0 -^ mightThrow(...) -^ try! ...' | +| 33 | cfg.swift:33:5:33:9 | print | 'print -> Argument -V "Still did not throw." -^ print(...)' | +| 35 | cfg.swift:35:5:37:3 | CatchClause | 'CatchClause -V MyError -^ ... .error1 -> isZero -> Argument -V x -^ isZero(...) -? MyError -^ ... .error2 -^ ConditionalPattern -^ OrPattern' | | 35 | cfg.swift:35:62:37:3 | Block | 'Block' | | 36 | cfg.swift:36:12:36:12 | 0 | '0 -^ ReturnExpr' | -| 37 | cfg.swift:37:5:39:3 | CatchClause | 'CatchClause -V MyError -^ MemberAccessExpr -> Argument -V withParam -^ ExprPattern -^ CallExpr' | +| 37 | cfg.swift:37:5:39:3 | CatchClause | 'CatchClause -V MyError -^ ... .error3 -> Argument -V withParam -^ ExprPattern -^ error3(...)' | | 37 | cfg.swift:37:41:39:3 | Block | 'Block' | | 38 | cfg.swift:38:12:38:20 | withParam | 'withParam -^ ReturnExpr' | | 39 | cfg.swift:39:5:41:3 | CatchClause | 'CatchClause -V ' | | 39 | cfg.swift:39:22:41:3 | Block | 'Block' | -| 40 | cfg.swift:40:5:40:9 | print | 'print -> Argument -V "MyError" -^ CallExpr' | +| 40 | cfg.swift:40:5:40:9 | print | 'print -> Argument -V "MyError" -^ print(...)' | | 41 | cfg.swift:41:5:43:3 | CatchClause | 'CatchClause -V Block' | -| 42 | cfg.swift:42:5:42:9 | print | 'print -> Argument -V Unknown error -> interpolation -V Argument -V error -^ CallExpr -> -^ StringInterpolationExpr -^ CallExpr' | +| 42 | cfg.swift:42:5:42:9 | print | 'print -> Argument -V Unknown error -> interpolation -V Argument -V error -^ interpolation(...) -> -^ StringInterpolationExpr -^ print(...)' | | 44 | cfg.swift:44:10:44:10 | 0 | '0 -^ ReturnExpr' | | 47 | cfg.swift:47:1:51:1 | FunctionDeclaration | 'FunctionDeclaration' | | 47 | cfg.swift:47:21:47:21 | s | 's -^ Block' | | 48 | cfg.swift:48:10:50:3 | Block | 'Block' | | 48 | cfg.swift:48:10:50:3 | FunctionExpr | 'FunctionExpr -^ ReturnExpr' | -| 49 | cfg.swift:49:12:49:12 | s | 's -> "" -^ BinaryExpr -^ ReturnExpr' | +| 49 | cfg.swift:49:12:49:12 | s | 's -> "" -^ ... + ... -^ ReturnExpr' | | 53 | cfg.swift:53:1:58:1 | FunctionDeclaration | 'FunctionDeclaration' | | 53 | cfg.swift:53:21:53:21 | x | 'x -^ Block' | | 54 | cfg.swift:54:3:56:3 | FunctionDeclaration | 'FunctionDeclaration' | | 54 | cfg.swift:54:10:54:10 | y | 'y -^ Block' | -| 55 | cfg.swift:55:12:55:12 | x | 'x -> y -^ BinaryExpr -^ ReturnExpr' | +| 55 | cfg.swift:55:12:55:12 | x | 'x -> y -^ ... + ... -^ ReturnExpr' | | 57 | cfg.swift:57:10:57:10 | f | 'f -^ ReturnExpr' | | 60 | cfg.swift:60:1:64:1 | FunctionDeclaration | 'FunctionDeclaration' | | 60 | cfg.swift:60:21:60:21 | x | 'x -^ Block' | | 61 | cfg.swift:61:10:63:3 | Block | 'Block' | | 61 | cfg.swift:61:10:63:3 | FunctionExpr | 'FunctionExpr -^ ReturnExpr' | | 62 | cfg.swift:62:6:62:6 | y | 'y' | -| 62 | cfg.swift:62:19:62:19 | x | 'x -> y -^ BinaryExpr' | +| 62 | cfg.swift:62:19:62:19 | x | 'x -> y -^ ... + ...' | | 66 | cfg.swift:66:1:70:1 | Block | 'Block' | | 66 | cfg.swift:66:1:70:1 | FunctionDeclaration | 'FunctionDeclaration' | -| 67 | cfg.swift:67:3:67:34 | VariableDeclaration | 'VariableDeclaration -V x1 -> createClosure1 -> Argument -V "" -^ CallExpr -^ CallExpr' | -| 68 | cfg.swift:68:3:68:35 | VariableDeclaration | 'VariableDeclaration -V x2 -> createClosure2 -> Argument -V 0 -^ CallExpr -> Argument -V 10 -^ CallExpr' | -| 69 | cfg.swift:69:3:69:35 | VariableDeclaration | 'VariableDeclaration -V x3 -> createClosure3 -> Argument -V 0 -^ CallExpr -> Argument -V 10 -^ CallExpr' | +| 67 | cfg.swift:67:3:67:34 | VariableDeclaration | 'VariableDeclaration -V x1 -> createClosure1 -> Argument -V "" -^ createClosure1(...) -^ ...(...)' | +| 68 | cfg.swift:68:3:68:35 | VariableDeclaration | 'VariableDeclaration -V x2 -> createClosure2 -> Argument -V 0 -^ createClosure2(...) -> Argument -V 10 -^ ...(...)' | +| 69 | cfg.swift:69:3:69:35 | VariableDeclaration | 'VariableDeclaration -V x3 -> createClosure3 -> Argument -V 0 -^ createClosure3(...) -> Argument -V 10 -^ ...(...)' | | 72 | cfg.swift:72:1:75:1 | FunctionDeclaration | 'FunctionDeclaration' | | 72 | cfg.swift:72:20:72:20 | s | 's -^ Block' | -| 73 | cfg.swift:73:3:73:23 | VariableDeclaration | 'VariableDeclaration -V n -> Optional -V Int -^ GenericTypeExpr -> Int -> Argument -V s -^ CallExpr' | +| 73 | cfg.swift:73:3:73:23 | VariableDeclaration | 'VariableDeclaration -V n -> Optional -V Int -^ GenericTypeExpr -> Int -> Argument -V s -^ Int(...)' | | 74 | cfg.swift:74:10:74:10 | n | 'n -^ ReturnExpr' | | 77 | cfg.swift:77:1:81:1 | Block | 'Block' | | 77 | cfg.swift:77:1:81:1 | FunctionDeclaration | 'FunctionDeclaration' | -| 78 | cfg.swift:78:3:78:36 | VariableDeclaration | 'VariableDeclaration -V nBang -> maybeParseInt -> Argument -V "42" -^ CallExpr -^ UnaryExpr' | -| 79 | cfg.swift:79:3:79:31 | VariableDeclaration | 'VariableDeclaration -V n -> maybeParseInt -> Argument -V "42" -^ CallExpr' | -| 80 | cfg.swift:80:10:80:14 | nBang | 'nBang -> n -^ UnaryExpr -^ BinaryExpr -^ ReturnExpr' | +| 78 | cfg.swift:78:3:78:36 | VariableDeclaration | 'VariableDeclaration -V nBang -> maybeParseInt -> Argument -V "42" -^ maybeParseInt(...) -^ ... !' | +| 79 | cfg.swift:79:3:79:31 | VariableDeclaration | 'VariableDeclaration -V n -> maybeParseInt -> Argument -V "42" -^ maybeParseInt(...)' | +| 80 | cfg.swift:80:10:80:14 | nBang | 'nBang -> n -^ ... ! -^ ... + ... -^ ReturnExpr' | | 83 | cfg.swift:83:1:98:1 | Block | 'Block' | | 83 | cfg.swift:83:1:98:1 | FunctionDeclaration | 'FunctionDeclaration' | | 84 | cfg.swift:84:3:84:15 | VariableDeclaration | 'VariableDeclaration -V temp -> 10' | | 86 | cfg.swift:86:3:88:3 | FunctionDeclaration | 'FunctionDeclaration' | | 86 | cfg.swift:86:12:86:12 | a | 'a -^ Block' | -| 87 | cfg.swift:87:5:87:5 | a | 'a -> a -> 1 -^ BinaryExpr -^ BinaryExpr' | +| 87 | cfg.swift:87:5:87:5 | a | 'a -> a -> 1 -^ ... + ... -^ ... = ...' | | 90 | cfg.swift:90:3:92:3 | FunctionDeclaration | 'FunctionDeclaration' | | 90 | cfg.swift:90:20:90:20 | a | 'a -^ Block' | -| 91 | cfg.swift:91:5:91:5 | a | 'a -> nil -^ BinaryExpr' | -| 94 | cfg.swift:94:3:94:5 | add | 'add -> Argument -V -^ CallExpr' | +| 91 | cfg.swift:91:5:91:5 | a | 'a -> nil -^ ... = ...' | +| 94 | cfg.swift:94:3:94:5 | add | 'add -> Argument -V -^ add(...)' | | 95 | cfg.swift:95:3:95:30 | VariableDeclaration | 'VariableDeclaration -V tempOptional -> Optional -V Int -^ GenericTypeExpr -> 10' | -| 96 | cfg.swift:96:3:96:13 | addOptional | 'addOptional -> Argument -V -^ CallExpr' | -| 97 | cfg.swift:97:10:97:13 | temp | 'temp -> tempOptional -^ UnaryExpr -^ BinaryExpr -^ ReturnExpr' | +| 96 | cfg.swift:96:3:96:13 | addOptional | 'addOptional -> Argument -V -^ addOptional(...)' | +| 97 | cfg.swift:97:10:97:13 | temp | 'temp -> tempOptional -^ ... ! -^ ... + ... -^ ReturnExpr' | | 100 | cfg.swift:100:1:109:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V C' | | 101 | cfg.swift:101:3:101:16 | VariableDeclaration | 'VariableDeclaration -V myInt -> Int' | | 102 | cfg.swift:102:3:104:3 | ConstructorDeclaration | 'ConstructorDeclaration' | | 102 | cfg.swift:102:8:102:8 | n | 'n -^ Block' | -| 103 | cfg.swift:103:5:103:9 | myInt | 'myInt -> n -^ BinaryExpr' | +| 103 | cfg.swift:103:5:103:9 | myInt | 'myInt -> n -^ ... = ...' | | 106 | cfg.swift:106:3:108:3 | Block | 'Block' | | 106 | cfg.swift:106:3:108:3 | FunctionDeclaration | 'FunctionDeclaration' | | 107 | cfg.swift:107:12:107:16 | myInt | 'myInt -^ ReturnExpr' | | 111 | cfg.swift:111:1:137:1 | FunctionDeclaration | 'FunctionDeclaration' | | 111 | cfg.swift:111:20:111:24 | param | 'param -> inoutParam -> opt -^ Block' | -| 112 | cfg.swift:112:3:112:18 | VariableDeclaration | 'VariableDeclaration -V c -> C -> Argument -V 42 -^ CallExpr' | -| 113 | cfg.swift:113:3:113:18 | VariableDeclaration | 'VariableDeclaration -V n1 -> c -^ MemberAccessExpr' | -| 114 | cfg.swift:114:3:114:23 | VariableDeclaration | 'VariableDeclaration -V n2 -> c -^ MemberAccessExpr -^ MemberAccessExpr' | -| 115 | cfg.swift:115:3:115:23 | VariableDeclaration | 'VariableDeclaration -V n3 -> c -^ MemberAccessExpr -^ CallExpr' | -| 116 | cfg.swift:116:3:116:28 | VariableDeclaration | 'VariableDeclaration -V n4 -> c -^ MemberAccessExpr -^ MemberAccessExpr -^ CallExpr' | -| 117 | cfg.swift:117:3:117:22 | VariableDeclaration | 'VariableDeclaration -V n5 -> param -^ MemberAccessExpr' | -| 118 | cfg.swift:118:3:118:27 | VariableDeclaration | 'VariableDeclaration -V n6 -> param -^ MemberAccessExpr -^ MemberAccessExpr' | -| 120 | cfg.swift:120:3:120:32 | VariableDeclaration | 'VariableDeclaration -V n8 -> param -^ MemberAccessExpr -^ MemberAccessExpr -^ CallExpr' | -| 122 | cfg.swift:122:3:122:27 | VariableDeclaration | 'VariableDeclaration -V n9 -> inoutParam -^ MemberAccessExpr' | -| 123 | cfg.swift:123:3:123:27 | VariableDeclaration | 'VariableDeclaration -V n7 -> param -^ MemberAccessExpr -^ CallExpr' | -| 124 | cfg.swift:124:3:124:33 | VariableDeclaration | 'VariableDeclaration -V n10 -> inoutParam -^ MemberAccessExpr -^ MemberAccessExpr' | -| 125 | cfg.swift:125:3:125:33 | VariableDeclaration | 'VariableDeclaration -V n11 -> inoutParam -^ MemberAccessExpr -^ CallExpr' | -| 126 | cfg.swift:126:3:126:38 | VariableDeclaration | 'VariableDeclaration -V n12 -> inoutParam -^ MemberAccessExpr -^ MemberAccessExpr -^ CallExpr' | -| 128 | cfg.swift:128:3:128:22 | VariableDeclaration | 'VariableDeclaration -V n13 -> opt -^ UnaryExpr -^ MemberAccessExpr' | -| 129 | cfg.swift:129:3:129:27 | VariableDeclaration | 'VariableDeclaration -V n14 -> opt -^ UnaryExpr -^ MemberAccessExpr -^ MemberAccessExpr' | -| 130 | cfg.swift:130:3:130:27 | VariableDeclaration | 'VariableDeclaration -V n15 -> opt -^ UnaryExpr -^ MemberAccessExpr -^ CallExpr' | -| 131 | cfg.swift:131:3:131:32 | VariableDeclaration | 'VariableDeclaration -V n16 -> opt -^ UnaryExpr -^ MemberAccessExpr -^ MemberAccessExpr -^ CallExpr' | -| 133 | cfg.swift:133:3:133:22 | VariableDeclaration | 'VariableDeclaration -V n17 -> opt -^ MemberAccessExpr' | -| 134 | cfg.swift:134:3:134:27 | VariableDeclaration | 'VariableDeclaration -V n18 -> opt -^ MemberAccessExpr -^ MemberAccessExpr' | -| 135 | cfg.swift:135:3:135:27 | VariableDeclaration | 'VariableDeclaration -V n19 -> opt -^ MemberAccessExpr -^ CallExpr' | -| 136 | cfg.swift:136:3:136:32 | VariableDeclaration | 'VariableDeclaration -V n20 -> opt -^ MemberAccessExpr -^ MemberAccessExpr -^ CallExpr' | +| 112 | cfg.swift:112:3:112:18 | VariableDeclaration | 'VariableDeclaration -V c -> C -> Argument -V 42 -^ C(...)' | +| 113 | cfg.swift:113:3:113:18 | VariableDeclaration | 'VariableDeclaration -V n1 -> c -^ ... .myInt' | +| 114 | cfg.swift:114:3:114:23 | VariableDeclaration | 'VariableDeclaration -V n2 -> c -^ ... .self -^ ... .myInt' | +| 115 | cfg.swift:115:3:115:23 | VariableDeclaration | 'VariableDeclaration -V n3 -> c -^ ... .getMyInt -^ getMyInt(...)' | +| 116 | cfg.swift:116:3:116:28 | VariableDeclaration | 'VariableDeclaration -V n4 -> c -^ ... .self -^ ... .getMyInt -^ getMyInt(...)' | +| 117 | cfg.swift:117:3:117:22 | VariableDeclaration | 'VariableDeclaration -V n5 -> param -^ ... .myInt' | +| 118 | cfg.swift:118:3:118:27 | VariableDeclaration | 'VariableDeclaration -V n6 -> param -^ ... .self -^ ... .myInt' | +| 120 | cfg.swift:120:3:120:32 | VariableDeclaration | 'VariableDeclaration -V n8 -> param -^ ... .self -^ ... .getMyInt -^ getMyInt(...)' | +| 122 | cfg.swift:122:3:122:27 | VariableDeclaration | 'VariableDeclaration -V n9 -> inoutParam -^ ... .myInt' | +| 123 | cfg.swift:123:3:123:27 | VariableDeclaration | 'VariableDeclaration -V n7 -> param -^ ... .getMyInt -^ getMyInt(...)' | +| 124 | cfg.swift:124:3:124:33 | VariableDeclaration | 'VariableDeclaration -V n10 -> inoutParam -^ ... .self -^ ... .myInt' | +| 125 | cfg.swift:125:3:125:33 | VariableDeclaration | 'VariableDeclaration -V n11 -> inoutParam -^ ... .getMyInt -^ getMyInt(...)' | +| 126 | cfg.swift:126:3:126:38 | VariableDeclaration | 'VariableDeclaration -V n12 -> inoutParam -^ ... .self -^ ... .getMyInt -^ getMyInt(...)' | +| 128 | cfg.swift:128:3:128:22 | VariableDeclaration | 'VariableDeclaration -V n13 -> opt -^ ... ! -^ ... .myInt' | +| 129 | cfg.swift:129:3:129:27 | VariableDeclaration | 'VariableDeclaration -V n14 -> opt -^ ... ! -^ ... .self -^ ... .myInt' | +| 130 | cfg.swift:130:3:130:27 | VariableDeclaration | 'VariableDeclaration -V n15 -> opt -^ ... ! -^ ... .getMyInt -^ getMyInt(...)' | +| 131 | cfg.swift:131:3:131:32 | VariableDeclaration | 'VariableDeclaration -V n16 -> opt -^ ... ! -^ ... .self -^ ... .getMyInt -^ getMyInt(...)' | +| 133 | cfg.swift:133:3:133:22 | VariableDeclaration | 'VariableDeclaration -V n17 -> opt -^ ... .myInt' | +| 134 | cfg.swift:134:3:134:27 | VariableDeclaration | 'VariableDeclaration -V n18 -> opt -^ ... .self -^ ... .myInt' | +| 135 | cfg.swift:135:3:135:27 | VariableDeclaration | 'VariableDeclaration -V n19 -> opt -^ ... .getMyInt -^ getMyInt(...)' | +| 136 | cfg.swift:136:3:136:32 | VariableDeclaration | 'VariableDeclaration -V n20 -> opt -^ ... .self -^ ... .getMyInt -^ getMyInt(...)' | | 139 | cfg.swift:139:1:166:1 | FunctionDeclaration | 'FunctionDeclaration' | | 139 | cfg.swift:139:15:139:15 | x | 'x -^ Block' | -| 140 | cfg.swift:140:3:141:12 | ForEachStmt | 'ForEachStmt -V 0 -> 10 -^ BinaryExpr' | +| 140 | cfg.swift:140:3:141:12 | ForEachStmt | 'ForEachStmt -V 0 -> 10 -^ ... ... ...' | | 140 | cfg.swift:140:7:140:7 | _ | '_' | | 141 | cfg.swift:141:9:141:12 | Block | 'Block' | | 143 | cfg.swift:143:3:153:3 | SwitchExpr | 'SwitchExpr -V x' | @@ -127,8 +127,8 @@ | 147 | cfg.swift:147:5:150:17 | Block | 'Block' | | 147 | cfg.swift:147:5:150:17 | SwitchCase | 'SwitchCase' | | 147 | cfg.swift:147:10:147:10 | x | 'x -^ ConditionalPattern' | -| 148 | cfg.swift:148:9:149:17 | BinaryExpr | 'BinaryExpr -V x -> 2 -^ BinaryExpr' | -| 149 | cfg.swift:149:13:149:13 | x | 'x -> 5 -^ BinaryExpr' | +| 148 | cfg.swift:148:9:149:17 | ... && ... | '... && ... -V x -> 2 -^ ... >= ...' | +| 149 | cfg.swift:149:13:149:13 | x | 'x -> 5 -^ ... < ...' | | 150 | cfg.swift:150:14:150:17 | true | 'true -^ ReturnExpr' | | 151 | cfg.swift:151:5:152:18 | SwitchCase | 'SwitchCase -V Block' | | 152 | cfg.swift:152:14:152:18 | false | 'false -^ ReturnExpr' | @@ -139,16 +139,16 @@ | 178 | cfg.swift:178:3:183:3 | | '' | | 186 | cfg.swift:186:1:198:1 | FunctionDeclaration | 'FunctionDeclaration' | | 186 | cfg.swift:186:9:186:9 | x | 'x -^ Block' | -| 187 | cfg.swift:187:3:197:3 | IfExpr | 'IfExpr -V x -> 2 -^ BinaryExpr' | +| 187 | cfg.swift:187:3:197:3 | IfExpr | 'IfExpr -V x -> 2 -^ ... > ...' | | 187 | cfg.swift:187:12:189:3 | Block | 'Block' | -| 188 | cfg.swift:188:5:188:9 | print | 'print -> Argument -V "x is greater than 2" -^ CallExpr' | -| 190 | cfg.swift:190:8:197:3 | IfExpr | 'IfExpr -V BinaryExpr -V BinaryExpr -V x -> 2 -^ BinaryExpr' | -| 191 | cfg.swift:191:13:191:13 | x | 'x -> 0 -^ BinaryExpr' | -| 192 | cfg.swift:192:13:192:21 | UnaryExpr | 'UnaryExpr -V x -> 5 -^ BinaryExpr' | +| 188 | cfg.swift:188:5:188:9 | print | 'print -> Argument -V "x is greater than 2" -^ print(...)' | +| 190 | cfg.swift:190:8:197:3 | IfExpr | 'IfExpr -V ... && ... -V ... && ... -V x -> 2 -^ ... <= ...' | +| 191 | cfg.swift:191:13:191:13 | x | 'x -> 0 -^ ... > ...' | +| 192 | cfg.swift:192:13:192:21 | ! ... | '! ... -V x -> 5 -^ ... == ...' | | 192 | cfg.swift:192:23:194:3 | Block | 'Block' | -| 193 | cfg.swift:193:5:193:9 | print | 'print -> Argument -V "x is 1" -^ CallExpr' | +| 193 | cfg.swift:193:5:193:9 | print | 'print -> Argument -V "x is 1" -^ print(...)' | | 195 | cfg.swift:195:8:197:3 | Block | 'Block' | -| 196 | cfg.swift:196:5:196:9 | print | 'print -> Argument -V "I can't guess the number" -^ CallExpr' | +| 196 | cfg.swift:196:5:196:9 | print | 'print -> Argument -V "I can't guess the number" -^ print(...)' | | 200 | cfg.swift:200:1:205:1 | FunctionDeclaration | 'FunctionDeclaration' | | 200 | cfg.swift:200:9:200:9 | b | 'b -^ Block' | | 201 | cfg.swift:201:3:203:3 | IfExpr | 'IfExpr -V b' | @@ -157,12 +157,12 @@ | 204 | cfg.swift:204:10:204:10 | 1 | '1 -^ ReturnExpr' | | 207 | cfg.swift:207:1:215:1 | FunctionDeclaration | 'FunctionDeclaration' | | 207 | cfg.swift:207:9:207:9 | x | 'x -^ Block' | -| 208 | cfg.swift:208:3:213:3 | IfExpr | 'IfExpr -V x -> 0 -^ BinaryExpr' | +| 208 | cfg.swift:208:3:213:3 | IfExpr | 'IfExpr -V x -> 0 -^ ... < ...' | | 208 | cfg.swift:208:12:213:3 | Block | 'Block' | -| 209 | cfg.swift:209:5:209:5 | x | 'x -> x -^ UnaryExpr -^ BinaryExpr' | -| 210 | cfg.swift:210:5:212:5 | IfExpr | 'IfExpr -V x -> 10 -^ BinaryExpr' | +| 209 | cfg.swift:209:5:209:5 | x | 'x -> x -^ - ... -^ ... = ...' | +| 210 | cfg.swift:210:5:212:5 | IfExpr | 'IfExpr -V x -> 10 -^ ... > ...' | | 210 | cfg.swift:210:15:212:5 | Block | 'Block' | -| 211 | cfg.swift:211:7:211:7 | x | 'x -> x -> 1 -^ BinaryExpr -^ BinaryExpr' | +| 211 | cfg.swift:211:7:211:7 | x | 'x -> x -> 1 -^ ... - ... -^ ... = ...' | | 214 | cfg.swift:214:10:214:10 | x | 'x -^ ReturnExpr' | | 217 | cfg.swift:217:1:223:1 | FunctionDeclaration | 'FunctionDeclaration' | | 217 | cfg.swift:217:10:217:11 | b1 | 'b1 -> b2 -> b3 -^ Block' | @@ -176,171 +176,171 @@ | 225 | cfg.swift:225:31:225:31 | b | 'b -^ Block' | | 226 | cfg.swift:226:3:233:3 | IfExpr | 'IfExpr -V IfExpr -V b' | | 227 | cfg.swift:227:8:227:11 | true | 'true' | -| 228 | cfg.swift:228:7:228:10 | Bool | 'Bool -> Argument -V false -^ CallExpr' | +| 228 | cfg.swift:228:7:228:10 | Bool | 'Bool -> Argument -V false -^ Bool(...)' | | 228 | cfg.swift:228:19:230:3 | Block | 'Block' | | 229 | cfg.swift:229:12:229:14 | "b" | '"b" -^ ReturnExpr' | | 231 | cfg.swift:231:8:233:3 | Block | 'Block' | | 232 | cfg.swift:232:12:232:15 | "!b" | '"!b" -^ ReturnExpr' | | 236 | cfg.swift:236:1:240:1 | Block | 'Block' | | 236 | cfg.swift:236:1:240:1 | FunctionDeclaration | 'FunctionDeclaration' | -| 237 | cfg.swift:237:3:239:3 | IfExpr | 'IfExpr -V UnaryExpr -V true' | +| 237 | cfg.swift:237:3:239:3 | IfExpr | 'IfExpr -V ! ... -V true' | | 242 | cfg.swift:242:1:248:1 | FunctionDeclaration | 'FunctionDeclaration' | | 242 | cfg.swift:242:17:242:17 | b | 'b -^ Block' | | 243 | cfg.swift:243:3:246:9 | IfExpr | 'IfExpr -V b' | | 243 | cfg.swift:243:8:245:3 | Block | 'Block' | -| 244 | cfg.swift:244:5:244:9 | print | 'print -> Argument -V "true" -^ CallExpr' | +| 244 | cfg.swift:244:5:244:9 | print | 'print -> Argument -V "true" -^ print(...)' | | 246 | cfg.swift:246:8:246:9 | Block | 'Block' | -| 247 | cfg.swift:247:3:247:7 | print | 'print -> Argument -V "done" -^ CallExpr' | +| 247 | cfg.swift:247:3:247:7 | print | 'print -> Argument -V "done" -^ print(...)' | | 250 | cfg.swift:250:1:254:1 | FunctionDeclaration | 'FunctionDeclaration' | | 250 | cfg.swift:250:16:250:17 | b1 | 'b1 -> b2 -^ Block' | -| 251 | cfg.swift:251:3:253:3 | IfExpr | 'IfExpr -V BinaryExpr -V b1' | +| 251 | cfg.swift:251:3:253:3 | IfExpr | 'IfExpr -V ... \|\| ... -V b1' | | 251 | cfg.swift:251:13:251:14 | b2 | 'b2' | | 251 | cfg.swift:251:17:253:3 | Block | 'Block' | -| 252 | cfg.swift:252:5:252:9 | print | 'print -> Argument -V "b1 or b2" -^ CallExpr' | +| 252 | cfg.swift:252:5:252:9 | print | 'print -> Argument -V "b1 or b2" -^ print(...)' | | 256 | cfg.swift:256:1:273:1 | FunctionDeclaration | 'FunctionDeclaration' | | 256 | cfg.swift:256:18:256:18 | a | 'a -> b -^ Block' | -| 257 | cfg.swift:257:3:257:15 | VariableDeclaration | 'VariableDeclaration -V c -> a -> b -^ BinaryExpr' | -| 258 | cfg.swift:258:3:258:15 | VariableDeclaration | 'VariableDeclaration -V d -> a -> b -^ BinaryExpr' | -| 259 | cfg.swift:259:3:259:15 | VariableDeclaration | 'VariableDeclaration -V e -> a -> b -^ BinaryExpr' | -| 260 | cfg.swift:260:3:260:15 | VariableDeclaration | 'VariableDeclaration -V f -> a -> b -^ BinaryExpr' | -| 261 | cfg.swift:261:3:261:15 | VariableDeclaration | 'VariableDeclaration -V g -> a -> b -^ BinaryExpr' | -| 262 | cfg.swift:262:3:262:15 | VariableDeclaration | 'VariableDeclaration -V h -> a -> b -^ BinaryExpr' | -| 263 | cfg.swift:263:3:263:15 | VariableDeclaration | 'VariableDeclaration -V i -> a -> b -^ BinaryExpr' | -| 264 | cfg.swift:264:3:264:15 | VariableDeclaration | 'VariableDeclaration -V j -> a -> b -^ BinaryExpr' | -| 265 | cfg.swift:265:3:265:16 | VariableDeclaration | 'VariableDeclaration -V k -> a -> b -^ BinaryExpr' | -| 266 | cfg.swift:266:3:266:16 | VariableDeclaration | 'VariableDeclaration -V l -> a -> b -^ BinaryExpr' | -| 267 | cfg.swift:267:3:267:16 | VariableDeclaration | 'VariableDeclaration -V o -> a -> b -^ BinaryExpr' | -| 268 | cfg.swift:268:3:268:16 | VariableDeclaration | 'VariableDeclaration -V p -> a -> b -^ BinaryExpr' | -| 269 | cfg.swift:269:3:269:15 | VariableDeclaration | 'VariableDeclaration -V q -> a -> b -^ BinaryExpr' | -| 270 | cfg.swift:270:3:270:16 | VariableDeclaration | 'VariableDeclaration -V r -> a -> b -^ BinaryExpr' | -| 271 | cfg.swift:271:3:271:15 | VariableDeclaration | 'VariableDeclaration -V s -> a -> b -^ BinaryExpr' | -| 272 | cfg.swift:272:3:272:16 | VariableDeclaration | 'VariableDeclaration -V t -> a -> b -^ BinaryExpr' | +| 257 | cfg.swift:257:3:257:15 | VariableDeclaration | 'VariableDeclaration -V c -> a -> b -^ ... + ...' | +| 258 | cfg.swift:258:3:258:15 | VariableDeclaration | 'VariableDeclaration -V d -> a -> b -^ ... - ...' | +| 259 | cfg.swift:259:3:259:15 | VariableDeclaration | 'VariableDeclaration -V e -> a -> b -^ ... * ...' | +| 260 | cfg.swift:260:3:260:15 | VariableDeclaration | 'VariableDeclaration -V f -> a -> b -^ ... / ...' | +| 261 | cfg.swift:261:3:261:15 | VariableDeclaration | 'VariableDeclaration -V g -> a -> b -^ ... % ...' | +| 262 | cfg.swift:262:3:262:15 | VariableDeclaration | 'VariableDeclaration -V h -> a -> b -^ ... & ...' | +| 263 | cfg.swift:263:3:263:15 | VariableDeclaration | 'VariableDeclaration -V i -> a -> b -^ ... \| ...' | +| 264 | cfg.swift:264:3:264:15 | VariableDeclaration | 'VariableDeclaration -V j -> a -> b -^ ... ^ ...' | +| 265 | cfg.swift:265:3:265:16 | VariableDeclaration | 'VariableDeclaration -V k -> a -> b -^ ... << ...' | +| 266 | cfg.swift:266:3:266:16 | VariableDeclaration | 'VariableDeclaration -V l -> a -> b -^ ... >> ...' | +| 267 | cfg.swift:267:3:267:16 | VariableDeclaration | 'VariableDeclaration -V o -> a -> b -^ ... == ...' | +| 268 | cfg.swift:268:3:268:16 | VariableDeclaration | 'VariableDeclaration -V p -> a -> b -^ ... != ...' | +| 269 | cfg.swift:269:3:269:15 | VariableDeclaration | 'VariableDeclaration -V q -> a -> b -^ ... < ...' | +| 270 | cfg.swift:270:3:270:16 | VariableDeclaration | 'VariableDeclaration -V r -> a -> b -^ ... <= ...' | +| 271 | cfg.swift:271:3:271:15 | VariableDeclaration | 'VariableDeclaration -V s -> a -> b -^ ... > ...' | +| 272 | cfg.swift:272:3:272:16 | VariableDeclaration | 'VariableDeclaration -V t -> a -> b -^ ... >= ...' | | 275 | cfg.swift:275:1:277:1 | FunctionDeclaration | 'FunctionDeclaration' | | 275 | cfg.swift:275:25:275:25 | x | 'x -> y -^ Block' | -| 276 | cfg.swift:276:11:276:10 | | ' -> interpolation -V Argument -V x -^ CallExpr -> + -> interpolation -V Argument -V y -^ CallExpr -> is equal to -> interpolation -V Argument -V x -> y -^ BinaryExpr -^ CallExpr -> and here is a zero: -> interpolation -V Argument -V returnZero -^ CallExpr -^ CallExpr -> -^ StringInterpolationExpr -^ ReturnExpr' | +| 276 | cfg.swift:276:11:276:10 | | ' -> interpolation -V Argument -V x -^ interpolation(...) -> + -> interpolation -V Argument -V y -^ interpolation(...) -> is equal to -> interpolation -V Argument -V x -> y -^ ... + ... -^ interpolation(...) -> and here is a zero: -> interpolation -V Argument -V returnZero -^ returnZero(...) -^ interpolation(...) -> -^ StringInterpolationExpr -^ ReturnExpr' | | 279 | cfg.swift:279:1:310:1 | Block | 'Block' | | 279 | cfg.swift:279:1:310:1 | FunctionDeclaration | 'FunctionDeclaration' | | 280 | cfg.swift:280:3:280:44 | VariableDeclaration | 'VariableDeclaration -V a -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -^ ArrayLiteral' | -| 281 | cfg.swift:281:3:281:3 | a | 'a -> Argument -V 0 -^ CallExpr -> 0 -^ BinaryExpr' | -| 282 | cfg.swift:282:3:282:3 | a | 'a -> Argument -V 1 -^ CallExpr -> 1 -^ BinaryExpr' | -| 283 | cfg.swift:283:3:283:3 | a | 'a -> Argument -V 2 -^ CallExpr -> 1 -^ BinaryExpr' | -| 284 | cfg.swift:284:3:284:3 | a | 'a -> Argument -V 3 -^ CallExpr -> 1 -^ BinaryExpr' | -| 285 | cfg.swift:285:3:285:3 | a | 'a -> Argument -V 4 -^ CallExpr -> 1 -^ BinaryExpr' | -| 286 | cfg.swift:286:3:286:3 | a | 'a -> Argument -V 5 -^ CallExpr -> 1 -^ BinaryExpr' | -| 287 | cfg.swift:287:3:287:3 | a | 'a -> Argument -V 6 -^ CallExpr -> 1 -^ BinaryExpr' | -| 288 | cfg.swift:288:3:288:3 | a | 'a -> Argument -V 7 -^ CallExpr -> 1 -^ BinaryExpr' | -| 289 | cfg.swift:289:3:289:3 | a | 'a -> Argument -V 8 -^ CallExpr -> 1 -^ BinaryExpr' | -| 290 | cfg.swift:290:3:290:3 | a | 'a -> Argument -V 9 -^ CallExpr -> 1 -^ BinaryExpr' | -| 291 | cfg.swift:291:3:291:3 | a | 'a -> Argument -V 10 -^ CallExpr -> 1 -^ BinaryExpr' | -| 293 | cfg.swift:293:3:293:49 | VariableDeclaration | 'VariableDeclaration -V tupleWithA -> Argument -V a -> Argument -V 0 -^ CallExpr -> Argument -V a -> Argument -V 1 -^ CallExpr -> Argument -V a -> Argument -V 2 -^ CallExpr -> Argument -V a -> Argument -V 3 -^ CallExpr -> Argument -V a -> Argument -V 4 -^ CallExpr -^ TupleExpr' | +| 281 | cfg.swift:281:3:281:3 | a | 'a -> Argument -V 0 -^ a(...) -> 0 -^ ... = ...' | +| 282 | cfg.swift:282:3:282:3 | a | 'a -> Argument -V 1 -^ a(...) -> 1 -^ ... += ...' | +| 283 | cfg.swift:283:3:283:3 | a | 'a -> Argument -V 2 -^ a(...) -> 1 -^ ... -= ...' | +| 284 | cfg.swift:284:3:284:3 | a | 'a -> Argument -V 3 -^ a(...) -> 1 -^ ... *= ...' | +| 285 | cfg.swift:285:3:285:3 | a | 'a -> Argument -V 4 -^ a(...) -> 1 -^ ... /= ...' | +| 286 | cfg.swift:286:3:286:3 | a | 'a -> Argument -V 5 -^ a(...) -> 1 -^ ... %= ...' | +| 287 | cfg.swift:287:3:287:3 | a | 'a -> Argument -V 6 -^ a(...) -> 1 -^ ... &= ...' | +| 288 | cfg.swift:288:3:288:3 | a | 'a -> Argument -V 7 -^ a(...) -> 1 -^ ... \|= ...' | +| 289 | cfg.swift:289:3:289:3 | a | 'a -> Argument -V 8 -^ a(...) -> 1 -^ ... ^= ...' | +| 290 | cfg.swift:290:3:290:3 | a | 'a -> Argument -V 9 -^ a(...) -> 1 -^ ... <<= ...' | +| 291 | cfg.swift:291:3:291:3 | a | 'a -> Argument -V 10 -^ a(...) -> 1 -^ ... >>= ...' | +| 293 | cfg.swift:293:3:293:49 | VariableDeclaration | 'VariableDeclaration -V tupleWithA -> Argument -V a -> Argument -V 0 -^ a(...) -> Argument -V a -> Argument -V 1 -^ a(...) -> Argument -V a -> Argument -V 2 -^ a(...) -> Argument -V a -> Argument -V 3 -^ a(...) -> Argument -V a -> Argument -V 4 -^ a(...) -^ TupleExpr' | | 295 | cfg.swift:295:3:295:48 | VariableDeclaration | 'VariableDeclaration -V b -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -> 11 -^ ArrayLiteral' | -| 296 | cfg.swift:296:3:296:3 | b | 'b -> Argument -V 0 -^ CallExpr -> a -> Argument -V 10 -^ CallExpr -^ BinaryExpr' | -| 297 | cfg.swift:297:3:297:3 | b | 'b -> Argument -V 1 -^ CallExpr -> b -> Argument -V 0 -^ CallExpr -> 1 -^ BinaryExpr -^ BinaryExpr' | -| 298 | cfg.swift:298:3:298:3 | b | 'b -> Argument -V 2 -^ CallExpr -> b -> Argument -V 1 -^ CallExpr -> 1 -^ BinaryExpr -^ BinaryExpr' | -| 299 | cfg.swift:299:3:299:3 | b | 'b -> Argument -V 3 -^ CallExpr -> b -> Argument -V 2 -^ CallExpr -> 1 -^ BinaryExpr -^ BinaryExpr' | -| 300 | cfg.swift:300:3:300:3 | b | 'b -> Argument -V 4 -^ CallExpr -> b -> Argument -V 3 -^ CallExpr -> 1 -^ BinaryExpr -^ BinaryExpr' | -| 301 | cfg.swift:301:3:301:3 | b | 'b -> Argument -V 5 -^ CallExpr -> b -> Argument -V 4 -^ CallExpr -> 1 -^ BinaryExpr -^ BinaryExpr' | -| 302 | cfg.swift:302:3:302:3 | b | 'b -> Argument -V 6 -^ CallExpr -> b -> Argument -V 5 -^ CallExpr -> 1 -^ BinaryExpr -^ BinaryExpr' | -| 303 | cfg.swift:303:3:303:3 | b | 'b -> Argument -V 7 -^ CallExpr -> b -> Argument -V 6 -^ CallExpr -> 1 -^ BinaryExpr -^ BinaryExpr' | -| 304 | cfg.swift:304:3:304:3 | b | 'b -> Argument -V 8 -^ CallExpr -> b -> Argument -V 7 -^ CallExpr -> 1 -^ BinaryExpr -^ BinaryExpr' | -| 305 | cfg.swift:305:3:305:3 | b | 'b -> Argument -V 9 -^ CallExpr -> b -> Argument -V 8 -^ CallExpr -> 1 -^ BinaryExpr -^ BinaryExpr' | -| 306 | cfg.swift:306:3:306:3 | b | 'b -> Argument -V 10 -^ CallExpr -> b -> Argument -V 9 -^ CallExpr -> 1 -^ BinaryExpr -^ BinaryExpr' | +| 296 | cfg.swift:296:3:296:3 | b | 'b -> Argument -V 0 -^ b(...) -> a -> Argument -V 10 -^ a(...) -^ ... = ...' | +| 297 | cfg.swift:297:3:297:3 | b | 'b -> Argument -V 1 -^ b(...) -> b -> Argument -V 0 -^ b(...) -> 1 -^ ... + ... -^ ... = ...' | +| 298 | cfg.swift:298:3:298:3 | b | 'b -> Argument -V 2 -^ b(...) -> b -> Argument -V 1 -^ b(...) -> 1 -^ ... - ... -^ ... = ...' | +| 299 | cfg.swift:299:3:299:3 | b | 'b -> Argument -V 3 -^ b(...) -> b -> Argument -V 2 -^ b(...) -> 1 -^ ... * ... -^ ... = ...' | +| 300 | cfg.swift:300:3:300:3 | b | 'b -> Argument -V 4 -^ b(...) -> b -> Argument -V 3 -^ b(...) -> 1 -^ ... / ... -^ ... = ...' | +| 301 | cfg.swift:301:3:301:3 | b | 'b -> Argument -V 5 -^ b(...) -> b -> Argument -V 4 -^ b(...) -> 1 -^ ... % ... -^ ... = ...' | +| 302 | cfg.swift:302:3:302:3 | b | 'b -> Argument -V 6 -^ b(...) -> b -> Argument -V 5 -^ b(...) -> 1 -^ ... & ... -^ ... = ...' | +| 303 | cfg.swift:303:3:303:3 | b | 'b -> Argument -V 7 -^ b(...) -> b -> Argument -V 6 -^ b(...) -> 1 -^ ... \| ... -^ ... = ...' | +| 304 | cfg.swift:304:3:304:3 | b | 'b -> Argument -V 8 -^ b(...) -> b -> Argument -V 7 -^ b(...) -> 1 -^ ... ^ ... -^ ... = ...' | +| 305 | cfg.swift:305:3:305:3 | b | 'b -> Argument -V 9 -^ b(...) -> b -> Argument -V 8 -^ b(...) -> 1 -^ ... << ... -^ ... = ...' | +| 306 | cfg.swift:306:3:306:3 | b | 'b -> Argument -V 10 -^ b(...) -> b -> Argument -V 9 -^ b(...) -> 1 -^ ... >> ... -^ ... = ...' | | 308 | cfg.swift:308:3:308:39 | VariableDeclaration | 'VariableDeclaration -V Argument -V a1 -> Argument -V a2 -> Argument -V a3 -> Argument -V a4 -> Argument -V a5 -^ TupleExpr -> tupleWithA' | -| 309 | cfg.swift:309:11:309:20 | Argument | 'Argument -V a1 -> b -> Argument -V 0 -^ CallExpr -^ BinaryExpr -> Argument -V a2 -> b -> Argument -V 1 -^ CallExpr -^ BinaryExpr -> Argument -V a3 -> b -> Argument -V 2 -^ CallExpr -^ BinaryExpr -> Argument -V a4 -> b -> Argument -V 3 -^ CallExpr -^ BinaryExpr -> Argument -V a5 -> b -> Argument -V 4 -^ CallExpr -^ BinaryExpr -^ TupleExpr -^ ReturnExpr' | +| 309 | cfg.swift:309:11:309:20 | Argument | 'Argument -V a1 -> b -> Argument -V 0 -^ b(...) -^ ... + ... -> Argument -V a2 -> b -> Argument -V 1 -^ b(...) -^ ... + ... -> Argument -V a3 -> b -> Argument -V 2 -^ b(...) -^ ... + ... -> Argument -V a4 -> b -> Argument -V 3 -^ b(...) -^ ... + ... -> Argument -V a5 -> b -> Argument -V 4 -^ b(...) -^ ... + ... -^ TupleExpr -^ ReturnExpr' | | 312 | cfg.swift:312:1:317:1 | FunctionDeclaration | 'FunctionDeclaration' | | 312 | cfg.swift:312:12:312:12 | x | 'x -^ Block' | | 313 | cfg.swift:313:3:316:3 | WhileStmt | 'WhileStmt' | -| 313 | cfg.swift:313:9:313:9 | x | 'x -> 0 -^ BinaryExpr' | +| 313 | cfg.swift:313:9:313:9 | x | 'x -> 0 -^ ... >= ...' | | 313 | cfg.swift:313:16:316:3 | Block | 'Block' | -| 314 | cfg.swift:314:5:314:9 | print | 'print -> Argument -V x -^ CallExpr' | -| 315 | cfg.swift:315:5:315:5 | x | 'x -> 1 -^ BinaryExpr' | +| 314 | cfg.swift:314:5:314:9 | print | 'print -> Argument -V x -^ print(...)' | +| 315 | cfg.swift:315:5:315:5 | x | 'x -> 1 -^ ... -= ...' | | 319 | cfg.swift:319:1:332:1 | FunctionDeclaration | 'FunctionDeclaration' | | 319 | cfg.swift:319:12:319:12 | x | 'x -^ Block' | | 320 | cfg.swift:320:3:330:3 | WhileStmt | 'WhileStmt' | -| 320 | cfg.swift:320:9:320:9 | x | 'x -> 0 -^ BinaryExpr' | +| 320 | cfg.swift:320:9:320:9 | x | 'x -> 0 -^ ... >= ...' | | 320 | cfg.swift:320:16:330:3 | Block | 'Block' | -| 321 | cfg.swift:321:5:321:9 | print | 'print -> Argument -V x -^ CallExpr' | -| 322 | cfg.swift:322:5:322:5 | x | 'x -> 1 -^ BinaryExpr' | -| 323 | cfg.swift:323:5:328:5 | IfExpr | 'IfExpr -V x -> 100 -^ BinaryExpr' | +| 321 | cfg.swift:321:5:321:9 | print | 'print -> Argument -V x -^ print(...)' | +| 322 | cfg.swift:322:5:322:5 | x | 'x -> 1 -^ ... -= ...' | +| 323 | cfg.swift:323:5:328:5 | IfExpr | 'IfExpr -V x -> 100 -^ ... > ...' | | 323 | cfg.swift:323:16:325:5 | Block | 'Block' | | 324 | cfg.swift:324:7:324:11 | BreakExpr | 'BreakExpr' | -| 326 | cfg.swift:326:10:328:5 | IfExpr | 'IfExpr -V x -> 50 -^ BinaryExpr' | +| 326 | cfg.swift:326:10:328:5 | IfExpr | 'IfExpr -V x -> 50 -^ ... > ...' | | 326 | cfg.swift:326:20:328:5 | Block | 'Block' | | 327 | cfg.swift:327:7:327:14 | ContinueExpr | 'ContinueExpr' | -| 329 | cfg.swift:329:5:329:9 | print | 'print -> Argument -V "Iter" -^ CallExpr' | -| 331 | cfg.swift:331:3:331:7 | print | 'print -> Argument -V "Done" -^ CallExpr' | +| 329 | cfg.swift:329:5:329:9 | print | 'print -> Argument -V "Iter" -^ print(...)' | +| 331 | cfg.swift:331:3:331:7 | print | 'print -> Argument -V "Done" -^ print(...)' | | 334 | cfg.swift:334:1:349:1 | FunctionDeclaration | 'FunctionDeclaration' | | 334 | cfg.swift:334:18:334:18 | x | 'x -^ Block' | | 335 | cfg.swift:335:3:348:3 | LabeledStmt | 'LabeledStmt -V WhileStmt' | -| 335 | cfg.swift:335:16:335:16 | x | 'x -> 0 -^ BinaryExpr' | +| 335 | cfg.swift:335:16:335:16 | x | 'x -> 0 -^ ... >= ...' | | 335 | cfg.swift:335:23:348:3 | Block | 'Block' | | 336 | cfg.swift:336:5:346:5 | LabeledStmt | 'LabeledStmt -V WhileStmt' | -| 336 | cfg.swift:336:18:336:18 | x | 'x -> 0 -^ BinaryExpr' | +| 336 | cfg.swift:336:18:336:18 | x | 'x -> 0 -^ ... >= ...' | | 336 | cfg.swift:336:25:346:5 | Block | 'Block' | -| 337 | cfg.swift:337:7:337:11 | print | 'print -> Argument -V x -^ CallExpr' | -| 338 | cfg.swift:338:7:338:7 | x | 'x -> 1 -^ BinaryExpr' | -| 339 | cfg.swift:339:7:344:7 | IfExpr | 'IfExpr -V x -> 100 -^ BinaryExpr' | +| 337 | cfg.swift:337:7:337:11 | print | 'print -> Argument -V x -^ print(...)' | +| 338 | cfg.swift:338:7:338:7 | x | 'x -> 1 -^ ... -= ...' | +| 339 | cfg.swift:339:7:344:7 | IfExpr | 'IfExpr -V x -> 100 -^ ... > ...' | | 339 | cfg.swift:339:18:341:7 | Block | 'Block' | | 340 | cfg.swift:340:9:340:19 | BreakExpr | 'BreakExpr' | -| 342 | cfg.swift:342:12:344:7 | IfExpr | 'IfExpr -V x -> 50 -^ BinaryExpr' | +| 342 | cfg.swift:342:12:344:7 | IfExpr | 'IfExpr -V x -> 50 -^ ... > ...' | | 342 | cfg.swift:342:22:344:7 | Block | 'Block' | | 343 | cfg.swift:343:9:343:22 | ContinueExpr | 'ContinueExpr' | -| 345 | cfg.swift:345:7:345:11 | print | 'print -> Argument -V "Iter" -^ CallExpr' | -| 347 | cfg.swift:347:5:347:9 | print | 'print -> Argument -V "Done" -^ CallExpr' | +| 345 | cfg.swift:345:7:345:11 | print | 'print -> Argument -V "Iter" -^ print(...)' | +| 347 | cfg.swift:347:5:347:9 | print | 'print -> Argument -V "Done" -^ print(...)' | | 351 | cfg.swift:351:1:356:1 | FunctionDeclaration | 'FunctionDeclaration' | | 351 | cfg.swift:351:17:351:17 | x | 'x -^ Block' | | 352 | cfg.swift:352:3:355:16 | DoWhileStmt | 'DoWhileStmt' | | 352 | cfg.swift:352:10:355:3 | Block | 'Block' | -| 353 | cfg.swift:353:5:353:9 | print | 'print -> Argument -V x -^ CallExpr' | -| 354 | cfg.swift:354:5:354:5 | x | 'x -> 1 -^ BinaryExpr' | -| 355 | cfg.swift:355:11:355:11 | x | 'x -> 0 -^ BinaryExpr' | +| 353 | cfg.swift:353:5:353:9 | print | 'print -> Argument -V x -^ print(...)' | +| 354 | cfg.swift:354:5:354:5 | x | 'x -> 1 -^ ... -= ...' | +| 355 | cfg.swift:355:11:355:11 | x | 'x -> 0 -^ ... >= ...' | | 358 | cfg.swift:358:1:363:1 | Block | 'Block' | | 358 | cfg.swift:358:1:363:1 | FunctionDeclaration | 'FunctionDeclaration' | | 359 | cfg.swift:359:3:359:11 | VariableDeclaration | 'VariableDeclaration -V x -> 0' | | 360 | cfg.swift:360:3:362:3 | WhileStmt | 'WhileStmt' | -| 360 | cfg.swift:360:9:360:9 | x | 'x -> 10 -^ BinaryExpr' | +| 360 | cfg.swift:360:9:360:9 | x | 'x -> 10 -^ ... < ...' | | 360 | cfg.swift:360:17:362:3 | Block | 'Block' | -| 361 | cfg.swift:361:5:361:5 | x | 'x -> 1 -^ BinaryExpr' | +| 361 | cfg.swift:361:5:361:5 | x | 'x -> 1 -^ ... += ...' | | 365 | cfg.swift:365:1:374:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V OptionalC' | | 366 | cfg.swift:366:3:366:11 | VariableDeclaration | 'VariableDeclaration -V c -> Optional -V C -^ GenericTypeExpr' | | 367 | cfg.swift:367:3:369:3 | ConstructorDeclaration | 'ConstructorDeclaration' | | 367 | cfg.swift:367:8:367:10 | arg | 'arg -^ Block' | -| 368 | cfg.swift:368:5:368:5 | c | 'c -> arg -^ BinaryExpr' | +| 368 | cfg.swift:368:5:368:5 | c | 'c -> arg -^ ... = ...' | | 371 | cfg.swift:371:3:373:3 | Block | 'Block' | | 371 | cfg.swift:371:3:373:3 | FunctionDeclaration | 'FunctionDeclaration' | | 372 | cfg.swift:372:12:372:12 | c | 'c -^ ReturnExpr' | | 376 | cfg.swift:376:1:378:1 | FunctionDeclaration | 'FunctionDeclaration' | | 376 | cfg.swift:376:19:376:19 | c | 'c -^ Block' | -| 377 | cfg.swift:377:10:377:10 | c | 'c -^ MemberAccessExpr -^ CallExpr -^ MemberAccessExpr -^ CallExpr -^ ReturnExpr' | +| 377 | cfg.swift:377:10:377:10 | c | 'c -^ ... .getOptional -^ getOptional(...) -^ ... .getMyInt -^ getMyInt(...) -^ ReturnExpr' | | 380 | cfg.swift:380:1:384:1 | FunctionDeclaration | 'FunctionDeclaration' | | 380 | cfg.swift:380:18:380:18 | x | 'x -> y -^ Block' | | 381 | cfg.swift:381:10:383:3 | Block | 'Block' | -| 381 | cfg.swift:381:13:381:22 | VariableDeclaration | 'VariableDeclaration -V z -> x -> y -^ BinaryExpr -> VariableDeclaration -V t -> "literal" -^ FunctionExpr -^ ReturnExpr' | +| 381 | cfg.swift:381:13:381:22 | VariableDeclaration | 'VariableDeclaration -V z -> x -> y -^ ... + ... -> VariableDeclaration -V t -> "literal" -^ FunctionExpr -^ ReturnExpr' | | 382 | cfg.swift:382:12:382:12 | z | 'z -^ ReturnExpr' | | 386 | cfg.swift:386:1:388:1 | FunctionDeclaration | 'FunctionDeclaration' | | 386 | cfg.swift:386:23:386:23 | t | 't -^ Block' | -| 387 | cfg.swift:387:10:387:10 | t | 't -^ MemberAccessExpr -> t -^ MemberAccessExpr -^ BinaryExpr -> t -^ MemberAccessExpr -^ BinaryExpr -> Argument -V 1 -> Argument -V 2 -> Argument -V 3 -^ TupleExpr -^ MemberAccessExpr -^ BinaryExpr -^ ReturnExpr' | +| 387 | cfg.swift:387:10:387:10 | t | 't -^ ... .a -> t -^ ... .1 -^ ... + ... -> t -^ ... .c -^ ... + ... -> Argument -V 1 -> Argument -V 2 -> Argument -V 3 -^ TupleExpr -^ ... .0 -^ ... + ... -^ ReturnExpr' | | 390 | cfg.swift:390:1:394:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V Derived -^ BaseType -V C' | | 391 | cfg.swift:391:3:393:3 | Block | 'Block' | | 391 | cfg.swift:391:3:393:3 | ConstructorDeclaration | 'ConstructorDeclaration' | -| 392 | cfg.swift:392:5:392:9 | | ' -^ MemberAccessExpr -> Argument -V 0 -^ CallExpr' | +| 392 | cfg.swift:392:5:392:9 | | ' -^ ... .init -> Argument -V 0 -^ init(...)' | | 396 | cfg.swift:396:1:404:1 | FunctionDeclaration | 'FunctionDeclaration' | | 396 | cfg.swift:396:21:396:21 | x | 'x -^ Block' | | 397 | cfg.swift:397:3:402:3 | TryExpr | 'TryExpr -V Block' | -| 398 | cfg.swift:398:5:398:24 | UnaryExpr | 'UnaryExpr' | -| 398 | cfg.swift:398:9:398:18 | mightThrow | 'mightThrow -> Argument -V 0 -^ CallExpr' | -| 399 | cfg.swift:399:5:399:9 | print | 'print -> Argument -V "Did not throw." -^ CallExpr' | -| 400 | cfg.swift:400:10:400:19 | mightThrow | 'mightThrow -> Argument -V 0 -^ CallExpr -^ UnaryExpr' | -| 401 | cfg.swift:401:5:401:9 | print | 'print -> Argument -V "Still did not throw." -^ CallExpr' | +| 398 | cfg.swift:398:5:398:24 | try ... | 'try ...' | +| 398 | cfg.swift:398:9:398:18 | mightThrow | 'mightThrow -> Argument -V 0 -^ mightThrow(...)' | +| 399 | cfg.swift:399:5:399:9 | print | 'print -> Argument -V "Did not throw." -^ print(...)' | +| 400 | cfg.swift:400:10:400:19 | mightThrow | 'mightThrow -> Argument -V 0 -^ mightThrow(...) -^ try! ...' | +| 401 | cfg.swift:401:5:401:9 | print | 'print -> Argument -V "Still did not throw." -^ print(...)' | | 403 | cfg.swift:403:10:403:10 | 0 | '0 -^ ReturnExpr' | | 406 | cfg.swift:406:1:415:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V Structors' | | 407 | cfg.swift:407:3:407:16 | VariableDeclaration | 'VariableDeclaration -V field -> Int' | | 408 | cfg.swift:408:3:410:3 | Block | 'Block' | | 408 | cfg.swift:408:3:410:3 | ConstructorDeclaration | 'ConstructorDeclaration' | -| 409 | cfg.swift:409:5:409:9 | field | 'field -> 10 -^ BinaryExpr' | +| 409 | cfg.swift:409:5:409:9 | field | 'field -> 10 -^ ... = ...' | | 412 | cfg.swift:412:3:414:3 | Block | 'Block' | | 412 | cfg.swift:412:3:414:3 | DestructorDeclaration | 'DestructorDeclaration' | -| 413 | cfg.swift:413:5:413:9 | field | 'field -> 0 -^ BinaryExpr' | +| 413 | cfg.swift:413:5:413:9 | field | 'field -> 0 -^ ... = ...' | | 417 | cfg.swift:417:1:419:1 | FunctionDeclaration | 'FunctionDeclaration' | | 417 | cfg.swift:417:24:417:24 | x | 'x -> y -^ Block' | | 418 | cfg.swift:418:10:418:25 | MapLiteral | 'MapLiteral -^ ReturnExpr' | @@ -350,12 +350,12 @@ | 423 | cfg.swift:423:5:423:14 | VariableDeclaration | 'VariableDeclaration -V x -> Int' | | 424 | cfg.swift:424:5:426:5 | Block | 'Block' | | 424 | cfg.swift:424:5:426:5 | ConstructorDeclaration | 'ConstructorDeclaration' | -| 425 | cfg.swift:425:7:425:7 | x | 'x -> 10 -^ BinaryExpr' | +| 425 | cfg.swift:425:7:425:7 | x | 'x -> 10 -^ ... = ...' | | 429 | cfg.swift:429:3:434:3 | ClassLikeDeclaration | 'ClassLikeDeclaration -V MyLocalStruct' | | 430 | cfg.swift:430:5:430:14 | VariableDeclaration | 'VariableDeclaration -V x -> Int' | | 431 | cfg.swift:431:5:433:5 | Block | 'Block' | | 431 | cfg.swift:431:5:433:5 | ConstructorDeclaration | 'ConstructorDeclaration' | -| 432 | cfg.swift:432:7:432:7 | x | 'x -> 10 -^ BinaryExpr' | +| 432 | cfg.swift:432:7:432:7 | x | 'x -> 10 -^ ... = ...' | | 436 | cfg.swift:436:3:439:3 | ClassLikeDeclaration | 'ClassLikeDeclaration -V MyLocalEnum' | | 437 | cfg.swift:437:10:437:10 | VariableDeclaration | 'VariableDeclaration -V A' | | 438 | cfg.swift:438:10:438:10 | VariableDeclaration | 'VariableDeclaration -V B' | @@ -373,10 +373,10 @@ | 458 | cfg.swift:458:3:458:31 | VariableDeclaration | 'VariableDeclaration -V kpGet_bs_0_x -> ' | | 459 | cfg.swift:459:3:459:37 | VariableDeclaration | 'VariableDeclaration -V kpGet_mayB_force_x -> ' | | 460 | cfg.swift:460:3:460:31 | VariableDeclaration | 'VariableDeclaration -V kpGet_mayB_x -> ' | -| 462 | cfg.swift:462:3:462:45 | VariableDeclaration | 'VariableDeclaration -V apply_kpGet_b_x -> a -> Argument -V kpGet_b_x -^ CallExpr' | -| 463 | cfg.swift:463:3:463:51 | VariableDeclaration | 'VariableDeclaration -V apply_kpGet_bs_0_x -> a -> Argument -V kpGet_bs_0_x -^ CallExpr' | -| 464 | cfg.swift:464:3:464:63 | VariableDeclaration | 'VariableDeclaration -V apply_kpGet_mayB_force_x -> a -> Argument -V kpGet_mayB_force_x -^ CallExpr' | -| 465 | cfg.swift:465:3:465:51 | VariableDeclaration | 'VariableDeclaration -V apply_kpGet_mayB_x -> a -> Argument -V kpGet_mayB_x -^ CallExpr' | +| 462 | cfg.swift:462:3:462:45 | VariableDeclaration | 'VariableDeclaration -V apply_kpGet_b_x -> a -> Argument -V kpGet_b_x -^ a(...)' | +| 463 | cfg.swift:463:3:463:51 | VariableDeclaration | 'VariableDeclaration -V apply_kpGet_bs_0_x -> a -> Argument -V kpGet_bs_0_x -^ a(...)' | +| 464 | cfg.swift:464:3:464:63 | VariableDeclaration | 'VariableDeclaration -V apply_kpGet_mayB_force_x -> a -> Argument -V kpGet_mayB_force_x -^ a(...)' | +| 465 | cfg.swift:465:3:465:51 | VariableDeclaration | 'VariableDeclaration -V apply_kpGet_mayB_x -> a -> Argument -V kpGet_mayB_x -^ a(...)' | | 468 | cfg.swift:468:1:495:1 | Block | 'Block' | | 468 | cfg.swift:468:1:495:1 | FunctionDeclaration | 'FunctionDeclaration' | | 469 | cfg.swift:469:1:475:6 | | '' | @@ -390,43 +390,43 @@ | 498 | cfg.swift:498:3:498:11 | VariableDeclaration | 'VariableDeclaration -V x -> 0' | | 500 | cfg.swift:500:3:502:3 | IfExpr | 'IfExpr -V ' | | 500 | cfg.swift:500:30:502:3 | Block | 'Block' | -| 501 | cfg.swift:501:5:501:5 | x | 'x -> 1 -^ BinaryExpr' | +| 501 | cfg.swift:501:5:501:5 | x | 'x -> 1 -^ ... += ...' | | 504 | cfg.swift:504:3:506:3 | IfExpr | 'IfExpr -V ' | | 504 | cfg.swift:504:33:506:3 | Block | 'Block' | -| 505 | cfg.swift:505:5:505:5 | x | 'x -> 1 -^ BinaryExpr' | +| 505 | cfg.swift:505:5:505:5 | x | 'x -> 1 -^ ... += ...' | | 508 | cfg.swift:508:3:510:3 | IfExpr | 'IfExpr -V ' | | 508 | cfg.swift:508:49:510:3 | Block | 'Block' | -| 509 | cfg.swift:509:5:509:5 | x | 'x -> 1 -^ BinaryExpr' | +| 509 | cfg.swift:509:5:509:5 | x | 'x -> 1 -^ ... += ...' | | 512 | cfg.swift:512:3:514:3 | GuardIfStmt | 'GuardIfStmt -V ' | | 512 | cfg.swift:512:38:514:3 | Block | 'Block' | -| 513 | cfg.swift:513:5:513:5 | x | 'x -> 1 -^ BinaryExpr' | -| 516 | cfg.swift:516:3:519:3 | IfExpr | 'IfExpr -V BinaryExpr -V ' | +| 513 | cfg.swift:513:5:513:5 | x | 'x -> 1 -^ ... += ...' | +| 516 | cfg.swift:516:3:519:3 | IfExpr | 'IfExpr -V ... && ... -V ' | | 517 | cfg.swift:517:7:517:27 | | '' | | 517 | cfg.swift:517:29:519:3 | Block | 'Block' | -| 518 | cfg.swift:518:5:518:5 | x | 'x -> 1 -^ BinaryExpr' | +| 518 | cfg.swift:518:5:518:5 | x | 'x -> 1 -^ ... += ...' | | 521 | cfg.swift:521:10:521:10 | x | 'x -^ ReturnExpr' | | 524 | cfg.swift:524:1:538:1 | Block | 'Block' | | 524 | cfg.swift:524:1:538:1 | FunctionDeclaration | 'FunctionDeclaration' | -| 525 | cfg.swift:525:5:533:6 | VariableDeclaration | 'VariableDeclaration -V stream -> AsyncStream -> Argument -V Int -^ MemberAccessExpr -> Argument -V . -^ MemberAccessExpr -> Argument -V 5 -^ CallExpr -> Argument -V FunctionExpr -^ CallExpr' | +| 525 | cfg.swift:525:5:533:6 | VariableDeclaration | 'VariableDeclaration -V stream -> AsyncStream -> Argument -V Int -^ ... .self -> Argument -V . -^ ... .bufferingNewest -> Argument -V 5 -^ bufferingNewest(...) -> Argument -V FunctionExpr -^ AsyncStream(...)' | | 525 | cfg.swift:525:78:533:5 | Block | 'Block' | | 526 | cfg.swift:526:9:526:20 | continuation | 'continuation' | -| 527 | cfg.swift:527:13:527:16 | Task | 'Task -^ MemberAccessExpr -^ Argument -V FunctionExpr -^ CallExpr' | +| 527 | cfg.swift:527:13:527:16 | Task | 'Task -^ ... .detached -^ Argument -V FunctionExpr -^ detached(...)' | | 527 | cfg.swift:527:27:532:13 | Block | 'Block' | -| 528 | cfg.swift:528:17:530:17 | ForEachStmt | 'ForEachStmt -V 1 -> 100 -^ BinaryExpr' | +| 528 | cfg.swift:528:17:530:17 | ForEachStmt | 'ForEachStmt -V 1 -> 100 -^ ... ... ...' | | 528 | cfg.swift:528:21:528:21 | i | 'i -> Block' | -| 529 | cfg.swift:529:21:529:32 | continuation | 'continuation -^ MemberAccessExpr -> Argument -V i -^ CallExpr' | -| 531 | cfg.swift:531:17:531:28 | continuation | 'continuation -^ MemberAccessExpr -^ CallExpr' | +| 529 | cfg.swift:529:21:529:32 | continuation | 'continuation -^ ... .yield -> Argument -V i -^ yield(...)' | +| 531 | cfg.swift:531:17:531:28 | continuation | 'continuation -^ ... .finish -^ finish(...)' | | 535 | cfg.swift:535:5:537:5 | ForEachStmt | 'ForEachStmt -V stream' | | 535 | cfg.swift:535:19:535:19 | i | 'i -> Block' | -| 536 | cfg.swift:536:9:536:13 | print | 'print -> Argument -V i -^ CallExpr' | +| 536 | cfg.swift:536:9:536:13 | print | 'print -> Argument -V i -^ print(...)' | | 540 | cfg.swift:540:1:544:1 | FunctionDeclaration | 'FunctionDeclaration' | | 540 | cfg.swift:540:24:540:24 | x | 'x -^ Block' | | 541 | cfg.swift:541:3:543:9 | ReturnExpr | 'ReturnExpr' | -| 542 | cfg.swift:542:5:543:9 | BinaryExpr | 'BinaryExpr -V x' | +| 542 | cfg.swift:542:5:543:9 | ... ?? ... | '... ?? ... -V x' | | 543 | cfg.swift:543:9:543:9 | 0 | '0' | | 546 | cfg.swift:546:1:553:1 | FunctionDeclaration | 'FunctionDeclaration' | | 546 | cfg.swift:546:25:546:25 | x | 'x -^ Block' | -| 547 | cfg.swift:547:3:552:3 | IfExpr | 'IfExpr -V BinaryExpr -V x' | +| 547 | cfg.swift:547:3:552:3 | IfExpr | 'IfExpr -V ... ?? ... -V x' | | 548 | cfg.swift:548:7:548:11 | false | 'false' | | 548 | cfg.swift:548:13:550:3 | Block | 'Block' | | 549 | cfg.swift:549:12:549:12 | 1 | '1 -^ ReturnExpr' | @@ -434,36 +434,36 @@ | 551 | cfg.swift:551:12:551:12 | 0 | '0 -^ ReturnExpr' | | 555 | cfg.swift:555:1:557:1 | FunctionDeclaration | 'FunctionDeclaration' | | 555 | cfg.swift:555:24:555:27 | expr | 'expr -^ Block' | -| 556 | cfg.swift:556:10:556:13 | expr | 'expr -^ CallExpr -^ ReturnExpr' | +| 556 | cfg.swift:556:10:556:13 | expr | 'expr -^ expr(...) -^ ReturnExpr' | | 559 | cfg.swift:559:1:561:1 | Block | 'Block' | | 559 | cfg.swift:559:1:561:1 | FunctionDeclaration | 'FunctionDeclaration' | -| 560 | cfg.swift:560:3:560:17 | usesAutoclosure | 'usesAutoclosure -> Argument -V 1 -^ CallExpr' | +| 560 | cfg.swift:560:3:560:17 | usesAutoclosure | 'usesAutoclosure -> Argument -V 1 -^ usesAutoclosure(...)' | | 565 | cfg.swift:565:1:567:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V MyProtocol' | | 566 | cfg.swift:566:2:566:21 | Block | 'Block' | | 566 | cfg.swift:566:2:566:21 | FunctionDeclaration | 'FunctionDeclaration' | | 569 | cfg.swift:569:1:571:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V MyProcotolImpl -^ BaseType -V MyProtocol' | | 570 | cfg.swift:570:2:570:34 | Block | 'Block -V 0 -^ ReturnExpr' | | 570 | cfg.swift:570:2:570:34 | FunctionDeclaration | 'FunctionDeclaration' | -| 573 | cfg.swift:573:1:573:62 | Block | 'Block -V MyProcotolImpl -^ CallExpr -^ ReturnExpr' | +| 573 | cfg.swift:573:1:573:62 | Block | 'Block -V MyProcotolImpl -^ MyProcotolImpl(...) -^ ReturnExpr' | | 573 | cfg.swift:573:1:573:62 | FunctionDeclaration | 'FunctionDeclaration' | -| 574 | cfg.swift:574:1:574:70 | Block | 'Block -V MyProcotolImpl -^ CallExpr -^ ReturnExpr' | +| 574 | cfg.swift:574:1:574:70 | Block | 'Block -V MyProcotolImpl -^ MyProcotolImpl(...) -^ ReturnExpr' | | 574 | cfg.swift:574:1:574:70 | FunctionDeclaration | 'FunctionDeclaration' | | 576 | cfg.swift:576:1:576:23 | FunctionDeclaration | 'FunctionDeclaration' | | 576 | cfg.swift:576:11:576:13 | arg | 'arg -^ Block' | | 578 | cfg.swift:578:1:583:1 | FunctionDeclaration | 'FunctionDeclaration' | | 578 | cfg.swift:578:30:578:30 | x | 'x -> y -^ Block' | -| 579 | cfg.swift:579:2:579:5 | sink | 'sink -> Argument -V x -^ MemberAccessExpr -^ CallExpr -^ CallExpr' | -| 580 | cfg.swift:580:2:580:5 | sink | 'sink -> Argument -V y -^ MemberAccessExpr -^ CallExpr -^ CallExpr' | -| 581 | cfg.swift:581:2:581:5 | sink | 'sink -> Argument -V getMyProtocol -^ CallExpr -^ MemberAccessExpr -^ CallExpr -^ CallExpr' | -| 582 | cfg.swift:582:2:582:5 | sink | 'sink -> Argument -V getMyProtocolImpl -^ CallExpr -^ MemberAccessExpr -^ CallExpr -^ CallExpr' | +| 579 | cfg.swift:579:2:579:5 | sink | 'sink -> Argument -V x -^ ... .source -^ source(...) -^ sink(...)' | +| 580 | cfg.swift:580:2:580:5 | sink | 'sink -> Argument -V y -^ ... .source -^ source(...) -^ sink(...)' | +| 581 | cfg.swift:581:2:581:5 | sink | 'sink -> Argument -V getMyProtocol -^ getMyProtocol(...) -^ ... .source -^ source(...) -^ sink(...)' | +| 582 | cfg.swift:582:2:582:5 | sink | 'sink -> Argument -V getMyProtocolImpl -^ getMyProtocolImpl(...) -^ ... .source -^ source(...) -^ sink(...)' | | 585 | cfg.swift:585:1:593:1 | FunctionDeclaration | 'FunctionDeclaration' | | 585 | cfg.swift:585:23:585:23 | x | 'x -^ Block' | | 586 | cfg.swift:586:3:589:3 | VariableDeclaration | 'VariableDeclaration -V a -> SwitchExpr -V x' | | 587 | cfg.swift:587:5:587:17 | Block | 'Block -V 1' | -| 587 | cfg.swift:587:5:587:17 | SwitchCase | 'SwitchCase -V 0 -> 5 -^ BinaryExpr' | +| 587 | cfg.swift:587:5:587:17 | SwitchCase | 'SwitchCase -V 0 -> 5 -^ ... ..< ...' | | 588 | cfg.swift:588:5:588:14 | SwitchCase | 'SwitchCase -V Block -V 2' | | 590 | cfg.swift:590:3:592:18 | VariableDeclaration | 'VariableDeclaration -V b' | -| 591 | cfg.swift:591:9:592:18 | IfExpr | 'IfExpr -V x -> 42 -^ BinaryExpr' | +| 591 | cfg.swift:591:9:592:18 | IfExpr | 'IfExpr -V x -> 42 -^ ... < ...' | | 591 | cfg.swift:591:21:591:25 | Block | 'Block -V 1' | | 592 | cfg.swift:592:14:592:18 | Block | 'Block -V 2' | | 596 | cfg.swift:596:1:598:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V ValueGenericsStruct -> TypeParameter -V N -> Int' | @@ -471,5 +471,5 @@ | 600 | cfg.swift:600:1:604:1 | FunctionDeclaration | 'FunctionDeclaration' | | 600 | cfg.swift:600:36:600:40 | value | 'value -^ Block' | | 601 | cfg.swift:601:5:601:13 | VariableDeclaration | 'VariableDeclaration -V x -> N' | -| 602 | cfg.swift:602:5:602:9 | print | 'print -> Argument -V x -^ CallExpr' | -| 603 | cfg.swift:603:5:603:5 | _ | '_ -> value -^ BinaryExpr' | +| 602 | cfg.swift:602:5:602:9 | print | 'print -> Argument -V x -^ print(...)' | +| 603 | cfg.swift:603:5:603:5 | _ | '_ -> value -^ ... = ...' | diff --git a/unified/ql/test/library-tests/controlflow/cfg.expected b/unified/ql/test/library-tests/controlflow/cfg.expected index a97c8b8d74f9..5bb55317b92b 100644 --- a/unified/ql/test/library-tests/controlflow/cfg.expected +++ b/unified/ql/test/library-tests/controlflow/cfg.expected @@ -4,46 +4,46 @@ bbContinues | cfg.swift:525:78:525:78 | Block | 'Block goto Task(+2)' | | cfg.swift:526:9:526:20 | continuation | 'continuation goto Block(-1)' | bbStep -| cfg.swift:20:9:20:14 | BinaryExpr | 'BinaryExpr : false -> Block(+0)' | -| cfg.swift:20:9:20:14 | BinaryExpr | 'BinaryExpr : true -> GuardIfStmt(+3)' | -| cfg.swift:23:9:23:14 | BinaryExpr | 'BinaryExpr : false -> Block(+0)' | -| cfg.swift:30:9:30:24 | CallExpr | 'CallExpr : exception -> CatchClause(+5)' | -| cfg.swift:30:9:30:24 | CallExpr | 'CallExpr : successor -> UnaryExpr(+0)' | -| cfg.swift:33:5:33:33 | CallExpr | 'CallExpr : successor -> 0(+11)' | +| cfg.swift:20:9:20:14 | ... >= ... | '... >= ... : false -> Block(+0)' | +| cfg.swift:20:9:20:14 | ... >= ... | '... >= ... : true -> GuardIfStmt(+3)' | +| cfg.swift:23:9:23:14 | ... <= ... | '... <= ... : false -> Block(+0)' | +| cfg.swift:30:9:30:24 | mightThrow(...) | 'mightThrow(...) : exception -> CatchClause(+5)' | +| cfg.swift:30:9:30:24 | mightThrow(...) | 'mightThrow(...) : successor -> try ...(+0)' | +| cfg.swift:33:5:33:33 | print(...) | 'print(...) : successor -> 0(+11)' | | cfg.swift:35:5:35:5 | OrPattern | 'OrPattern : match -> Block(+0)' | | cfg.swift:35:5:35:5 | OrPattern | 'OrPattern : no-match -> CatchClause(+2)' | -| cfg.swift:37:11:37:39 | CallExpr | 'CallExpr : match -> Block(+0)' | -| cfg.swift:37:11:37:39 | CallExpr | 'CallExpr : no-match -> CatchClause(+2)' | +| cfg.swift:37:11:37:39 | error3(...) | 'error3(...) : match -> Block(+0)' | +| cfg.swift:37:11:37:39 | error3(...) | 'error3(...) : no-match -> CatchClause(+2)' | | cfg.swift:39:11:39:20 | | ' : match -> Block(+0)' | | cfg.swift:39:11:39:20 | | ' : no-match -> CatchClause(+2)' | -| cfg.swift:40:5:40:20 | CallExpr | 'CallExpr : successor -> 0(+4)' | -| cfg.swift:42:5:42:35 | CallExpr | 'CallExpr : successor -> 0(+2)' | -| cfg.swift:140:12:140:17 | BinaryExpr | 'BinaryExpr : empty -> SwitchExpr(+3)' | -| cfg.swift:140:12:140:17 | BinaryExpr | 'BinaryExpr : non-empty -> _(+0)' | +| cfg.swift:40:5:40:20 | print(...) | 'print(...) : successor -> 0(+4)' | +| cfg.swift:42:5:42:35 | print(...) | 'print(...) : successor -> 0(+2)' | +| cfg.swift:140:12:140:17 | ... ... ... | '... ... ... : empty -> SwitchExpr(+3)' | +| cfg.swift:140:12:140:17 | ... ... ... | '... ... ... : non-empty -> _(+0)' | | cfg.swift:141:9:141:12 | Block | 'Block : successor -> SwitchExpr(+2)' | | cfg.swift:141:9:141:12 | Block | 'Block : successor -> _(-1)' | | cfg.swift:144:5:144:5 | OrPattern | 'OrPattern : match -> Block(+0)' | | cfg.swift:144:5:144:5 | OrPattern | 'OrPattern : no-match -> SwitchCase(+3)' | | cfg.swift:147:10:147:10 | ConditionalPattern | 'ConditionalPattern : match -> Block(+0)' | | cfg.swift:147:10:147:10 | ConditionalPattern | 'ConditionalPattern : no-match -> SwitchCase(+4)' | -| cfg.swift:148:10:148:15 | BinaryExpr | 'BinaryExpr : false -> x(-1)' | -| cfg.swift:148:10:148:15 | BinaryExpr | 'BinaryExpr : true -> x(+1)' | -| cfg.swift:149:13:149:17 | BinaryExpr | 'BinaryExpr : successor -> x(-2)' | -| cfg.swift:187:6:187:10 | BinaryExpr | 'BinaryExpr : false -> IfExpr(+3)' | -| cfg.swift:187:6:187:10 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | -| cfg.swift:190:11:190:16 | BinaryExpr | 'BinaryExpr : false,false,false -> Block(+5)' | -| cfg.swift:190:11:190:16 | BinaryExpr | 'BinaryExpr : true -> x(+1)' | -| cfg.swift:191:13:191:17 | BinaryExpr | 'BinaryExpr : false,false,false -> Block(+4)' | -| cfg.swift:191:13:191:17 | BinaryExpr | 'BinaryExpr : true -> UnaryExpr(+1)' | -| cfg.swift:192:15:192:20 | BinaryExpr | 'BinaryExpr : false -> Block(+0)' | -| cfg.swift:192:15:192:20 | BinaryExpr | 'BinaryExpr : true,false -> Block(+3)' | +| cfg.swift:148:10:148:15 | ... >= ... | '... >= ... : false -> x(-1)' | +| cfg.swift:148:10:148:15 | ... >= ... | '... >= ... : true -> x(+1)' | +| cfg.swift:149:13:149:17 | ... < ... | '... < ... : successor -> x(-2)' | +| cfg.swift:187:6:187:10 | ... > ... | '... > ... : false -> IfExpr(+3)' | +| cfg.swift:187:6:187:10 | ... > ... | '... > ... : true -> Block(+0)' | +| cfg.swift:190:11:190:16 | ... <= ... | '... <= ... : false,false,false -> Block(+5)' | +| cfg.swift:190:11:190:16 | ... <= ... | '... <= ... : true -> x(+1)' | +| cfg.swift:191:13:191:17 | ... > ... | '... > ... : false,false,false -> Block(+4)' | +| cfg.swift:191:13:191:17 | ... > ... | '... > ... : true -> ! ...(+1)' | +| cfg.swift:192:15:192:20 | ... == ... | '... == ... : false -> Block(+0)' | +| cfg.swift:192:15:192:20 | ... == ... | '... == ... : true,false -> Block(+3)' | | cfg.swift:201:6:201:6 | b | 'b : false -> 1(+3)' | | cfg.swift:201:6:201:6 | b | 'b : true -> Block(+0)' | -| cfg.swift:208:6:208:10 | BinaryExpr | 'BinaryExpr : false -> x(+6)' | -| cfg.swift:208:6:208:10 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | -| cfg.swift:210:8:210:13 | BinaryExpr | 'BinaryExpr : false -> x(+4)' | -| cfg.swift:210:8:210:13 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | -| cfg.swift:211:7:211:15 | BinaryExpr | 'BinaryExpr : successor -> x(+3)' | +| cfg.swift:208:6:208:10 | ... < ... | '... < ... : false -> x(+6)' | +| cfg.swift:208:6:208:10 | ... < ... | '... < ... : true -> Block(+0)' | +| cfg.swift:210:8:210:13 | ... > ... | '... > ... : false -> x(+4)' | +| cfg.swift:210:8:210:13 | ... > ... | '... > ... : true -> Block(+0)' | +| cfg.swift:211:7:211:15 | ... = ... | '... = ... : successor -> x(+3)' | | cfg.swift:218:11:218:12 | b1 | 'b1 : false -> b3(+2)' | | cfg.swift:218:11:218:12 | b1 | 'b1 : true -> b2(+1)' | | cfg.swift:219:13:219:14 | b2 | 'b2 : false,false -> "!b2 \|\| !b3"(+3)' | @@ -55,69 +55,69 @@ bbStep | cfg.swift:226:6:226:6 | b | 'b : false -> Bool(+2)' | | cfg.swift:226:6:226:6 | b | 'b : true -> true(+1)' | | cfg.swift:227:8:227:11 | true | 'true : true -> Block(+1)' | -| cfg.swift:228:7:228:17 | CallExpr | 'CallExpr : false -> Block(+3)' | -| cfg.swift:228:7:228:17 | CallExpr | 'CallExpr : true,true -> Block(+0)' | +| cfg.swift:228:7:228:17 | Bool(...) | 'Bool(...) : false -> Block(+3)' | +| cfg.swift:228:7:228:17 | Bool(...) | 'Bool(...) : true,true -> Block(+0)' | | cfg.swift:243:6:243:6 | b | 'b : false -> Block(+3)' | | cfg.swift:243:6:243:6 | b | 'b : true -> Block(+0)' | -| cfg.swift:244:5:244:17 | CallExpr | 'CallExpr : successor -> print(+3)' | +| cfg.swift:244:5:244:17 | print(...) | 'print(...) : successor -> print(+3)' | | cfg.swift:246:8:246:9 | Block | 'Block : successor -> print(+1)' | | cfg.swift:251:7:251:8 | b1 | 'b1 : false -> b2(+0)' | | cfg.swift:251:7:251:8 | b1 | 'b1 : true,true -> Block(+0)' | | cfg.swift:251:13:251:14 | b2 | 'b2 : true,true -> Block(+0)' | | cfg.swift:313:3:313:3 | WhileStmt | 'WhileStmt : successor -> x(+0)' | -| cfg.swift:313:9:313:14 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | -| cfg.swift:315:5:315:10 | BinaryExpr | 'BinaryExpr : successor -> x(-2)' | +| cfg.swift:313:9:313:14 | ... >= ... | '... >= ... : true -> Block(+0)' | +| cfg.swift:315:5:315:10 | ... -= ... | '... -= ... : successor -> x(-2)' | | cfg.swift:320:3:320:3 | WhileStmt | 'WhileStmt : successor -> x(+0)' | -| cfg.swift:320:9:320:14 | BinaryExpr | 'BinaryExpr : false -> print(+11)' | -| cfg.swift:320:9:320:14 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | -| cfg.swift:323:8:323:14 | BinaryExpr | 'BinaryExpr : false -> IfExpr(+3)' | -| cfg.swift:323:8:323:14 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | +| cfg.swift:320:9:320:14 | ... >= ... | '... >= ... : false -> print(+11)' | +| cfg.swift:320:9:320:14 | ... >= ... | '... >= ... : true -> Block(+0)' | +| cfg.swift:323:8:323:14 | ... > ... | '... > ... : false -> IfExpr(+3)' | +| cfg.swift:323:8:323:14 | ... > ... | '... > ... : true -> Block(+0)' | | cfg.swift:324:7:324:11 | BreakExpr | 'BreakExpr : break -> print(+7)' | -| cfg.swift:326:13:326:18 | BinaryExpr | 'BinaryExpr : false -> print(+3)' | -| cfg.swift:326:13:326:18 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | +| cfg.swift:326:13:326:18 | ... > ... | '... > ... : false -> print(+3)' | +| cfg.swift:326:13:326:18 | ... > ... | '... > ... : true -> Block(+0)' | | cfg.swift:327:7:327:14 | ContinueExpr | 'ContinueExpr : continue -> x(-7)' | -| cfg.swift:329:5:329:17 | CallExpr | 'CallExpr : successor -> x(-9)' | +| cfg.swift:329:5:329:17 | print(...) | 'print(...) : successor -> x(-9)' | | cfg.swift:335:10:335:10 | WhileStmt | 'WhileStmt : successor -> x(+0)' | -| cfg.swift:335:16:335:21 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | +| cfg.swift:335:16:335:21 | ... >= ... | '... >= ... : true -> Block(+0)' | | cfg.swift:336:12:336:12 | WhileStmt | 'WhileStmt : successor -> x(+0)' | -| cfg.swift:336:18:336:23 | BinaryExpr | 'BinaryExpr : false -> print(+11)' | -| cfg.swift:336:18:336:23 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | -| cfg.swift:339:10:339:16 | BinaryExpr | 'BinaryExpr : false -> IfExpr(+3)' | -| cfg.swift:339:10:339:16 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | -| cfg.swift:342:15:342:20 | BinaryExpr | 'BinaryExpr : false -> print(+3)' | -| cfg.swift:342:15:342:20 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | +| cfg.swift:336:18:336:23 | ... >= ... | '... >= ... : false -> print(+11)' | +| cfg.swift:336:18:336:23 | ... >= ... | '... >= ... : true -> Block(+0)' | +| cfg.swift:339:10:339:16 | ... > ... | '... > ... : false -> IfExpr(+3)' | +| cfg.swift:339:10:339:16 | ... > ... | '... > ... : true -> Block(+0)' | +| cfg.swift:342:15:342:20 | ... > ... | '... > ... : false -> print(+3)' | +| cfg.swift:342:15:342:20 | ... > ... | '... > ... : true -> Block(+0)' | | cfg.swift:343:9:343:22 | ContinueExpr | 'ContinueExpr : continue -> x(-7)' | -| cfg.swift:345:7:345:19 | CallExpr | 'CallExpr : successor -> x(-9)' | -| cfg.swift:347:5:347:17 | CallExpr | 'CallExpr : successor -> x(-12)' | +| cfg.swift:345:7:345:19 | print(...) | 'print(...) : successor -> x(-9)' | +| cfg.swift:347:5:347:17 | print(...) | 'print(...) : successor -> x(-12)' | | cfg.swift:352:3:352:3 | DoWhileStmt | 'DoWhileStmt : successor -> Block(+0)' | -| cfg.swift:355:11:355:16 | BinaryExpr | 'BinaryExpr : true -> Block(-3)' | +| cfg.swift:355:11:355:16 | ... >= ... | '... >= ... : true -> Block(-3)' | | cfg.swift:360:3:360:3 | WhileStmt | 'WhileStmt : successor -> x(+0)' | -| cfg.swift:360:9:360:14 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | -| cfg.swift:361:5:361:10 | BinaryExpr | 'BinaryExpr : successor -> x(-1)' | -| cfg.swift:398:9:398:24 | CallExpr | 'CallExpr : successor -> UnaryExpr(+0)' | +| cfg.swift:360:9:360:14 | ... < ... | '... < ... : true -> Block(+0)' | +| cfg.swift:361:5:361:10 | ... += ... | '... += ... : successor -> x(-1)' | +| cfg.swift:398:9:398:24 | mightThrow(...) | 'mightThrow(...) : successor -> try ...(+0)' | | cfg.swift:500:6:500:28 | | ' : false -> IfExpr(+4)' | | cfg.swift:500:6:500:28 | | ' : true -> Block(+0)' | -| cfg.swift:501:5:501:10 | BinaryExpr | 'BinaryExpr : successor -> IfExpr(+3)' | +| cfg.swift:501:5:501:10 | ... += ... | '... += ... : successor -> IfExpr(+3)' | | cfg.swift:504:6:504:31 | | ' : false -> IfExpr(+4)' | | cfg.swift:504:6:504:31 | | ' : true -> Block(+0)' | -| cfg.swift:505:5:505:10 | BinaryExpr | 'BinaryExpr : successor -> IfExpr(+3)' | +| cfg.swift:505:5:505:10 | ... += ... | '... += ... : successor -> IfExpr(+3)' | | cfg.swift:508:6:508:47 | | ' : false -> GuardIfStmt(+4)' | | cfg.swift:508:6:508:47 | | ' : true -> Block(+0)' | -| cfg.swift:509:5:509:10 | BinaryExpr | 'BinaryExpr : successor -> GuardIfStmt(+3)' | +| cfg.swift:509:5:509:10 | ... += ... | '... += ... : successor -> GuardIfStmt(+3)' | | cfg.swift:512:9:512:31 | | ' : false -> Block(+0)' | | cfg.swift:512:9:512:31 | | ' : true -> IfExpr(+4)' | -| cfg.swift:513:5:513:10 | BinaryExpr | 'BinaryExpr : successor -> IfExpr(+3)' | +| cfg.swift:513:5:513:10 | ... += ... | '... += ... : successor -> IfExpr(+3)' | | cfg.swift:516:6:516:28 | | ' : false,false -> x(+5)' | | cfg.swift:516:6:516:28 | | ' : true -> (+1)' | | cfg.swift:517:7:517:27 | | ' : false,false -> x(+4)' | | cfg.swift:517:7:517:27 | | ' : true -> Block(+0)' | -| cfg.swift:518:5:518:10 | BinaryExpr | 'BinaryExpr : successor -> x(+3)' | -| cfg.swift:528:26:528:32 | BinaryExpr | 'BinaryExpr : empty -> continuation(+3)' | -| cfg.swift:528:26:528:32 | BinaryExpr | 'BinaryExpr : non-empty -> i(+0)' | -| cfg.swift:529:21:529:41 | CallExpr | 'CallExpr : successor -> continuation(+2)' | -| cfg.swift:529:21:529:41 | CallExpr | 'CallExpr : successor -> i(-1)' | +| cfg.swift:518:5:518:10 | ... += ... | '... += ... : successor -> x(+3)' | +| cfg.swift:528:26:528:32 | ... ... ... | '... ... ... : empty -> continuation(+3)' | +| cfg.swift:528:26:528:32 | ... ... ... | '... ... ... : non-empty -> i(+0)' | +| cfg.swift:529:21:529:41 | yield(...) | 'yield(...) : successor -> continuation(+2)' | +| cfg.swift:529:21:529:41 | yield(...) | 'yield(...) : successor -> i(-1)' | | cfg.swift:535:24:535:29 | stream | 'stream : non-empty -> i(+0)' | -| cfg.swift:536:9:536:16 | CallExpr | 'CallExpr : successor -> i(-1)' | +| cfg.swift:536:9:536:16 | print(...) | 'print(...) : successor -> i(-1)' | | cfg.swift:542:5:542:5 | x | 'x : non-null -> ReturnExpr(-1)' | | cfg.swift:542:5:542:5 | x | 'x : null -> 0(+1)' | | cfg.swift:543:9:543:9 | 0 | '0 : successor -> ReturnExpr(-2)' | @@ -125,12 +125,12 @@ bbStep | cfg.swift:547:6:547:6 | x | 'x : non-null,true -> Block(+1)' | | cfg.swift:547:6:547:6 | x | 'x : null -> false(+1)' | | cfg.swift:548:7:548:11 | false | 'false : false -> Block(+2)' | -| cfg.swift:587:10:587:14 | BinaryExpr | 'BinaryExpr : match -> Block(+0)' | -| cfg.swift:587:10:587:14 | BinaryExpr | 'BinaryExpr : no-match -> SwitchCase(+1)' | +| cfg.swift:587:10:587:14 | ... ..< ... | '... ..< ... : match -> Block(+0)' | +| cfg.swift:587:10:587:14 | ... ..< ... | '... ..< ... : no-match -> SwitchCase(+1)' | | cfg.swift:587:17:587:17 | 1 | '1 : successor -> VariableDeclaration(+3)' | | cfg.swift:588:14:588:14 | 2 | '2 : successor -> VariableDeclaration(+2)' | -| cfg.swift:591:13:591:18 | BinaryExpr | 'BinaryExpr : false -> Block(+1)' | -| cfg.swift:591:13:591:18 | BinaryExpr | 'BinaryExpr : true -> Block(+0)' | +| cfg.swift:591:13:591:18 | ... < ... | '... < ... : false -> Block(+1)' | +| cfg.swift:591:13:591:18 | ... < ... | '... < ... : true -> Block(+0)' | noCfg | cfg.swift:47:42:47:47 | String | | cfg.swift:53:34:53:34 | _ | @@ -160,7 +160,7 @@ noCfg | cfg.swift:559:6:559:20 | autoclosureTest | nonSimple | cfg.swift:10:1:10:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V MyError -^ BaseType -V Error' | -| cfg.swift:35:5:35:5 | CatchClause | 'CatchClause -V MyError -^ MemberAccessExpr -> isZero -> Argument -V x -^ CallExpr -? MyError -^ MemberAccessExpr -^ ConditionalPattern -^ OrPattern' | +| cfg.swift:35:5:35:5 | CatchClause | 'CatchClause -V MyError -^ ... .error1 -> isZero -> Argument -V x -^ isZero(...) -? MyError -^ ... .error2 -^ ConditionalPattern -^ OrPattern' | | cfg.swift:390:1:390:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V Derived -^ BaseType -V C' | -| cfg.swift:527:13:527:16 | Task | 'Task -^ MemberAccessExpr -^ Argument -V FunctionExpr -^ CallExpr' | +| cfg.swift:527:13:527:16 | Task | 'Task -^ ... .detached -^ Argument -V FunctionExpr -^ detached(...)' | | cfg.swift:569:1:569:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V MyProcotolImpl -^ BaseType -V MyProtocol' | diff --git a/unified/ql/test/library-tests/controlflow/cfg.swift b/unified/ql/test/library-tests/controlflow/cfg.swift index d40be313fc66..2b352f4f7e1e 100644 --- a/unified/ql/test/library-tests/controlflow/cfg.swift +++ b/unified/ql/test/library-tests/controlflow/cfg.swift @@ -17,29 +17,29 @@ func isZero(x : Int) -> Bool { } func mightThrow(x : Int) throws -> Void { - guard x >= 0 else { // $ bbStep='BinaryExpr : false -> Block(+0)' bbStep='BinaryExpr : true -> GuardIfStmt(+3)' + guard x >= 0 else { // $ bbStep='... >= ... : false -> Block(+0)' bbStep='... >= ... : true -> GuardIfStmt(+3)' throw MyError.error1 } - guard x <= 0 else { // $ bbStep='BinaryExpr : false -> Block(+0)' + guard x <= 0 else { // $ bbStep='... <= ... : false -> Block(+0)' throw MyError.error3(withParam: x + 1) } } func tryCatch(x : Int) -> Int { do { - try mightThrow(x: 0) // $ bbStep='CallExpr : exception -> CatchClause(+5)' bbStep='CallExpr : successor -> UnaryExpr(+0)' + try mightThrow(x: 0) // $ bbStep='mightThrow(...) : exception -> CatchClause(+5)' bbStep='mightThrow(...) : successor -> try ...(+0)' print("Did not throw.") try! mightThrow(x: 0) - print("Still did not throw.") // $ bbStep='CallExpr : successor -> 0(+11)' + print("Still did not throw.") // $ bbStep='print(...) : successor -> 0(+11)' - } catch MyError.error1 , MyError.error2 where isZero(x: x) { // $ bbStep='OrPattern : match -> Block(+0)' bbStep='OrPattern : no-match -> CatchClause(+2)' nonSimple='CatchClause -V MyError -^ MemberAccessExpr -> isZero -> Argument -V x -^ CallExpr -? MyError -^ MemberAccessExpr -^ ConditionalPattern -^ OrPattern' + } catch MyError.error1 , MyError.error2 where isZero(x: x) { // $ bbStep='OrPattern : match -> Block(+0)' bbStep='OrPattern : no-match -> CatchClause(+2)' nonSimple='CatchClause -V MyError -^ ... .error1 -> isZero -> Argument -V x -^ isZero(...) -? MyError -^ ... .error2 -^ ConditionalPattern -^ OrPattern' return 0 - } catch MyError.error3(let withParam) { // $ bbStep='CallExpr : match -> Block(+0)' bbStep='CallExpr : no-match -> CatchClause(+2)' + } catch MyError.error3(let withParam) { // $ bbStep='error3(...) : match -> Block(+0)' bbStep='error3(...) : no-match -> CatchClause(+2)' return withParam } catch is MyError { // $ bbStep=' : match -> Block(+0)' bbStep=' : no-match -> CatchClause(+2)' - print("MyError") // $ bbStep='CallExpr : successor -> 0(+4)' + print("MyError") // $ bbStep='print(...) : successor -> 0(+4)' } catch { - print("Unknown error \(error)") // $ bbStep='CallExpr : successor -> 0(+2)' + print("Unknown error \(error)") // $ bbStep='print(...) : successor -> 0(+2)' } return 0 } @@ -137,7 +137,7 @@ func testMemberRef(param : C, inoutParam : inout C, opt : C?) { } func patterns(x : Int) -> Bool { - for _ in 0...10 // $ bbStep='BinaryExpr : empty -> SwitchExpr(+3)' bbStep='BinaryExpr : non-empty -> _(+0)' + for _ in 0...10 // $ bbStep='... ... ... : empty -> SwitchExpr(+3)' bbStep='... ... ... : non-empty -> _(+0)' { } // $ bbStep='Block : successor -> _(-1)' bbStep='Block : successor -> SwitchExpr(+2)' switch x { @@ -145,8 +145,8 @@ func patterns(x : Int) -> Bool { return true return true // $ noCfg case x where // $ bbContinues='Block goto true(+3)' bbStep='ConditionalPattern : match -> Block(+0)' bbStep='ConditionalPattern : no-match -> SwitchCase(+4)' - (x >= 2) && // $ bbStep='BinaryExpr : false -> x(-1)' bbStep='BinaryExpr : true -> x(+1)' - x < 5: // $ bbStep='BinaryExpr : successor -> x(-2)' + (x >= 2) && // $ bbStep='... >= ... : false -> x(-1)' bbStep='... >= ... : true -> x(+1)' + x < 5: // $ bbStep='... < ... : successor -> x(-2)' return true default: return false @@ -184,12 +184,12 @@ func testDefer(x : inout Int) { } func m1(x : Int) { - if x > 2 { // $ bbStep='BinaryExpr : false -> IfExpr(+3)' bbStep='BinaryExpr : true -> Block(+0)' + if x > 2 { // $ bbStep='... > ... : false -> IfExpr(+3)' bbStep='... > ... : true -> Block(+0)' print("x is greater than 2") } - else if x <= 2 && // $ bbStep='BinaryExpr : true -> x(+1)' bbStep='BinaryExpr : false,false,false -> Block(+5)' - x > 0 && // $ bbStep='BinaryExpr : true -> UnaryExpr(+1)' bbStep='BinaryExpr : false,false,false -> Block(+4)' - !(x == 5) { // $ bbStep='BinaryExpr : false -> Block(+0)' bbStep='BinaryExpr : true,false -> Block(+3)' + else if x <= 2 && // $ bbStep='... <= ... : false,false,false -> Block(+5)' bbStep='... <= ... : true -> x(+1)' + x > 0 && // $ bbStep='... > ... : false,false,false -> Block(+4)' bbStep='... > ... : true -> ! ...(+1)' + !(x == 5) { // $ bbStep='... == ... : false -> Block(+0)' bbStep='... == ... : true,false -> Block(+3)' print("x is 1") } else { @@ -205,10 +205,10 @@ func m2(b : Bool) -> Int { } func m3(x : inout Int) -> Int { - if x < 0 { // $ bbStep='BinaryExpr : true -> Block(+0)' bbStep='BinaryExpr : false -> x(+6)' + if x < 0 { // $ bbStep='... < ... : false -> x(+6)' bbStep='... < ... : true -> Block(+0)' x = -x - if x > 10 { // $ bbStep='BinaryExpr : true -> Block(+0)' bbStep='BinaryExpr : false -> x(+4)' - x = x - 1 // $ bbStep='BinaryExpr : successor -> x(+3)' + if x > 10 { // $ bbStep='... > ... : false -> x(+4)' bbStep='... > ... : true -> Block(+0)' + x = x - 1 // $ bbStep='... = ... : successor -> x(+3)' } } return x @@ -225,7 +225,7 @@ func m4 (b1 : Bool, b2 : Bool, b3 : Bool) -> String { func conversionsInSplitEntry (b : Bool) -> String { if b ? // $ bbStep='b : false -> Bool(+2)' bbStep='b : true -> true(+1)' (true) : // $ bbStep='true : true -> Block(+1)' - Bool(false) { // $ bbStep='CallExpr : true,true -> Block(+0)' bbStep='CallExpr : false -> Block(+3)' + Bool(false) { // $ bbStep='Bool(...) : false -> Block(+3)' bbStep='Bool(...) : true,true -> Block(+0)' return "b" } else { @@ -241,7 +241,7 @@ func constant_condition() { // $ noCfg func empty_else(b : Bool) { if b { // $ bbStep='b : false -> Block(+3)' bbStep='b : true -> Block(+0)' - print("true") // $ bbStep='CallExpr : successor -> print(+3)' + print("true") // $ bbStep='print(...) : successor -> print(+3)' } else {} // $ bbStep='Block : successor -> print(+1)' print("done") @@ -310,41 +310,41 @@ func testSubscriptExpr() -> (Int, Int, Int, Int, Int) { // $ noCfg } func loop1(x : inout Int) { - while x >= 0 { // $ bbStep='WhileStmt : successor -> x(+0)' bbStep='BinaryExpr : true -> Block(+0)' + while x >= 0 { // $ bbStep='WhileStmt : successor -> x(+0)' bbStep='... >= ... : true -> Block(+0)' print(x) - x -= 1 // $ bbStep='BinaryExpr : successor -> x(-2)' + x -= 1 // $ bbStep='... -= ... : successor -> x(-2)' } } func loop2(x : inout Int) { - while x >= 0 { // $ bbStep='WhileStmt : successor -> x(+0)' bbStep='BinaryExpr : false -> print(+11)' bbStep='BinaryExpr : true -> Block(+0)' + while x >= 0 { // $ bbStep='WhileStmt : successor -> x(+0)' bbStep='... >= ... : false -> print(+11)' bbStep='... >= ... : true -> Block(+0)' print(x) x -= 1 - if x > 100 { // $ bbStep='BinaryExpr : false -> IfExpr(+3)' bbStep='BinaryExpr : true -> Block(+0)' + if x > 100 { // $ bbStep='... > ... : false -> IfExpr(+3)' bbStep='... > ... : true -> Block(+0)' break // $ bbStep='BreakExpr : break -> print(+7)' } - else if x > 50 { // $ bbStep='BinaryExpr : false -> print(+3)' bbStep='BinaryExpr : true -> Block(+0)' + else if x > 50 { // $ bbStep='... > ... : false -> print(+3)' bbStep='... > ... : true -> Block(+0)' continue // $ bbStep='ContinueExpr : continue -> x(-7)' } - print("Iter") // $ bbStep='CallExpr : successor -> x(-9)' + print("Iter") // $ bbStep='print(...) : successor -> x(-9)' } print("Done") } func labeledLoop(x : inout Int) { - outer: while x >= 0 { // $ bbStep='WhileStmt : successor -> x(+0)' bbStep='BinaryExpr : true -> Block(+0)' - inner: while x >= 0 { // $ bbStep='BinaryExpr : false -> print(+11)' bbStep='WhileStmt : successor -> x(+0)' bbStep='BinaryExpr : true -> Block(+0)' + outer: while x >= 0 { // $ bbStep='WhileStmt : successor -> x(+0)' bbStep='... >= ... : true -> Block(+0)' + inner: while x >= 0 { // $ bbStep='WhileStmt : successor -> x(+0)' bbStep='... >= ... : false -> print(+11)' bbStep='... >= ... : true -> Block(+0)' print(x) x -= 1 - if x > 100 { // $ bbStep='BinaryExpr : false -> IfExpr(+3)' bbStep='BinaryExpr : true -> Block(+0)' + if x > 100 { // $ bbStep='... > ... : false -> IfExpr(+3)' bbStep='... > ... : true -> Block(+0)' break outer } - else if x > 50 { // $ bbStep='BinaryExpr : false -> print(+3)' bbStep='BinaryExpr : true -> Block(+0)' + else if x > 50 { // $ bbStep='... > ... : false -> print(+3)' bbStep='... > ... : true -> Block(+0)' continue inner // $ bbStep='ContinueExpr : continue -> x(-7)' } - print("Iter") // $ bbStep='CallExpr : successor -> x(-9)' + print("Iter") // $ bbStep='print(...) : successor -> x(-9)' } - print("Done") // $ bbStep='CallExpr : successor -> x(-12)' + print("Done") // $ bbStep='print(...) : successor -> x(-12)' } } @@ -352,13 +352,13 @@ func testRepeat(x : inout Int) { repeat { // $ bbStep='DoWhileStmt : successor -> Block(+0)' print(x) x -= 1 - } while x >= 0 // $ bbStep='BinaryExpr : true -> Block(-3)' + } while x >= 0 // $ bbStep='... >= ... : true -> Block(-3)' } func loop_with_identity_expr() { // $ noCfg var x = 0 - while(x < 10) { // $ bbStep='WhileStmt : successor -> x(+0)' bbStep='BinaryExpr : true -> Block(+0)' - x += 1 // $ bbStep='BinaryExpr : successor -> x(-1)' + while(x < 10) { // $ bbStep='WhileStmt : successor -> x(+0)' bbStep='... < ... : true -> Block(+0)' + x += 1 // $ bbStep='... += ... : successor -> x(-1)' } } @@ -395,7 +395,7 @@ class Derived : C { // $ nonSimple='ClassLikeDeclaration -V Derived -^ BaseType func doWithoutCatch(x : Int) throws -> Int { do { - try mightThrow(x: 0) // $ bbStep='CallExpr : successor -> UnaryExpr(+0)' + try mightThrow(x: 0) // $ bbStep='mightThrow(...) : successor -> try ...(+0)' print("Did not throw.") try! mightThrow(x: 0) print("Still did not throw.") @@ -498,24 +498,24 @@ func testAvailable() -> Int { // $ noCfg var x = 0; if #available(macOS 10, *) { // $ bbStep=' : false -> IfExpr(+4)' bbStep=' : true -> Block(+0)' - x += 1 // $ bbStep='BinaryExpr : successor -> IfExpr(+3)' + x += 1 // $ bbStep='... += ... : successor -> IfExpr(+3)' } if #available(macOS 10.13, *) { // $ bbStep=' : false -> IfExpr(+4)' bbStep=' : true -> Block(+0)' - x += 1 // $ bbStep='BinaryExpr : successor -> IfExpr(+3)' + x += 1 // $ bbStep='... += ... : successor -> IfExpr(+3)' } if #unavailable(iOS 10, watchOS 10, macOS 10) { // $ bbStep=' : false -> GuardIfStmt(+4)' bbStep=' : true -> Block(+0)' - x += 1 // $ bbStep='BinaryExpr : successor -> GuardIfStmt(+3)' + x += 1 // $ bbStep='... += ... : successor -> GuardIfStmt(+3)' } guard #available(macOS 12, *) else { // $ bbStep=' : false -> Block(+0)' bbStep=' : true -> IfExpr(+4)' - x += 1 // $ bbStep='BinaryExpr : successor -> IfExpr(+3)' + x += 1 // $ bbStep='... += ... : successor -> IfExpr(+3)' } if #available(macOS 12, *), // $ bbStep=' : true -> (+1)' bbStep=' : false,false -> x(+5)' #available(iOS 12, *) { // $ bbStep=' : false,false -> x(+4)' bbStep=' : true -> Block(+0)' - x += 1 // $ bbStep='BinaryExpr : successor -> x(+3)' + x += 1 // $ bbStep='... += ... : successor -> x(+3)' } return x @@ -524,16 +524,16 @@ func testAvailable() -> Int { // $ noCfg func testAsyncFor () async { // $ noCfg var stream = AsyncStream(Int.self, bufferingPolicy: .bufferingNewest(5), { // $ bbContinues='Block goto Task(+2)' continuation in // $ bbContinues='continuation goto Block(-1)' - Task.detached { // $ nonSimple='Task -^ MemberAccessExpr -^ Argument -V FunctionExpr -^ CallExpr' - for i in 1...100 { // $ bbStep='BinaryExpr : empty -> continuation(+3)' bbStep='BinaryExpr : non-empty -> i(+0)' - continuation.yield(i) // $ bbStep='CallExpr : successor -> continuation(+2)' bbStep='CallExpr : successor -> i(-1)' + Task.detached { // $ nonSimple='Task -^ ... .detached -^ Argument -V FunctionExpr -^ detached(...)' + for i in 1...100 { // $ bbStep='... ... ... : empty -> continuation(+3)' bbStep='... ... ... : non-empty -> i(+0)' + continuation.yield(i) // $ bbStep='yield(...) : successor -> continuation(+2)' bbStep='yield(...) : successor -> i(-1)' } continuation.finish() } }) for try await i in stream { // $ bbStep='stream : non-empty -> i(+0)' - print(i) // $ bbStep='CallExpr : successor -> i(-1)' + print(i) // $ bbStep='print(...) : successor -> i(-1)' } } @@ -584,11 +584,11 @@ func testOpenExistentialExpr(x: MyProtocol, y: MyProcotolImpl) { func singleStmtExpr(_ x: Int) { let a = switch x { - case 0..<5: 1 // $ bbStep='BinaryExpr : match -> Block(+0)' bbStep='BinaryExpr : no-match -> SwitchCase(+1)' bbStep='1 : successor -> VariableDeclaration(+3)' + case 0..<5: 1 // $ bbStep='1 : successor -> VariableDeclaration(+3)' bbStep='... ..< ... : match -> Block(+0)' bbStep='... ..< ... : no-match -> SwitchCase(+1)' default: 2 // $ bbStep='2 : successor -> VariableDeclaration(+2)' } let b = - if (x < 42) { 1 } // $ bbStep='BinaryExpr : false -> Block(+1)' bbStep='BinaryExpr : true -> Block(+0)' + if (x < 42) { 1 } // $ bbStep='... < ... : false -> Block(+1)' bbStep='... < ... : true -> Block(+0)' else { 2 } } // --- diff --git a/unified/ql/test/library-tests/dataflow/test.expected b/unified/ql/test/library-tests/dataflow/test.expected index 41ced3845de2..fb4090d3e62f 100644 --- a/unified/ql/test/library-tests/dataflow/test.expected +++ b/unified/ql/test/library-tests/dataflow/test.expected @@ -1,112 +1,112 @@ models edges | implicit-self.swift:11:9:11:12 | [post] self [x] | implicit-self.swift:12:14:12:17 | self [x] | provenance | | -| implicit-self.swift:11:9:11:14 | MemberAccessExpr | implicit-self.swift:11:9:11:12 | [post] self [x] | provenance | | -| implicit-self.swift:11:18:11:31 | CallExpr | implicit-self.swift:11:9:11:14 | MemberAccessExpr | provenance | | -| implicit-self.swift:12:14:12:17 | self [x] | implicit-self.swift:12:14:12:19 | MemberAccessExpr | provenance | | +| implicit-self.swift:11:9:11:14 | ... .x | implicit-self.swift:11:9:11:12 | [post] self [x] | provenance | | +| implicit-self.swift:11:18:11:31 | source(...) | implicit-self.swift:11:9:11:14 | ... .x | provenance | | +| implicit-self.swift:12:14:12:17 | self [x] | implicit-self.swift:12:14:12:19 | ... .x | provenance | | | implicit-self.swift:17:9:17:9 | x | implicit-self.swift:18:14:18:14 | x | provenance | | -| implicit-self.swift:17:13:17:26 | CallExpr | implicit-self.swift:17:9:17:9 | x | provenance | | +| implicit-self.swift:17:13:17:26 | source(...) | implicit-self.swift:17:9:17:9 | x | provenance | | | implicit-self.swift:23:9:23:9 | x | implicit-self.swift:24:14:24:17 | self [x] | provenance | | -| implicit-self.swift:23:13:23:26 | CallExpr | implicit-self.swift:23:9:23:9 | x | provenance | | -| implicit-self.swift:24:14:24:17 | self [x] | implicit-self.swift:24:14:24:19 | MemberAccessExpr | provenance | | +| implicit-self.swift:23:13:23:26 | source(...) | implicit-self.swift:23:9:23:9 | x | provenance | | +| implicit-self.swift:24:14:24:17 | self [x] | implicit-self.swift:24:14:24:19 | ... .x | provenance | | | implicit-self.swift:29:9:29:12 | [post] self [x] | implicit-self.swift:30:14:30:14 | x | provenance | | -| implicit-self.swift:29:9:29:14 | MemberAccessExpr | implicit-self.swift:29:9:29:12 | [post] self [x] | provenance | | -| implicit-self.swift:29:18:29:31 | CallExpr | implicit-self.swift:29:9:29:14 | MemberAccessExpr | provenance | | +| implicit-self.swift:29:9:29:14 | ... .x | implicit-self.swift:29:9:29:12 | [post] self [x] | provenance | | +| implicit-self.swift:29:18:29:31 | source(...) | implicit-self.swift:29:9:29:14 | ... .x | provenance | | | implicit-self.swift:35:9:35:12 | [post] self [box, x] | implicit-self.swift:36:14:36:17 | self [box, x] | provenance | | -| implicit-self.swift:35:9:35:16 | [post] MemberAccessExpr [x] | implicit-self.swift:35:9:35:12 | [post] self [box, x] | provenance | | -| implicit-self.swift:35:9:35:18 | MemberAccessExpr | implicit-self.swift:35:9:35:16 | [post] MemberAccessExpr [x] | provenance | | -| implicit-self.swift:35:22:35:35 | CallExpr | implicit-self.swift:35:9:35:18 | MemberAccessExpr | provenance | | -| implicit-self.swift:36:14:36:17 | self [box, x] | implicit-self.swift:36:14:36:21 | MemberAccessExpr [x] | provenance | | -| implicit-self.swift:36:14:36:21 | MemberAccessExpr [x] | implicit-self.swift:36:14:36:23 | MemberAccessExpr | provenance | | +| implicit-self.swift:35:9:35:16 | [post] ... .box [x] | implicit-self.swift:35:9:35:12 | [post] self [box, x] | provenance | | +| implicit-self.swift:35:9:35:18 | ... .x | implicit-self.swift:35:9:35:16 | [post] ... .box [x] | provenance | | +| implicit-self.swift:35:22:35:35 | source(...) | implicit-self.swift:35:9:35:18 | ... .x | provenance | | +| implicit-self.swift:36:14:36:17 | self [box, x] | implicit-self.swift:36:14:36:21 | ... .box [x] | provenance | | +| implicit-self.swift:36:14:36:21 | ... .box [x] | implicit-self.swift:36:14:36:23 | ... .x | provenance | | | implicit-self.swift:41:9:41:11 | [post] box [x] | implicit-self.swift:42:14:42:16 | box [x] | provenance | | -| implicit-self.swift:41:9:41:13 | MemberAccessExpr | implicit-self.swift:41:9:41:11 | [post] box [x] | provenance | | -| implicit-self.swift:41:17:41:30 | CallExpr | implicit-self.swift:41:9:41:13 | MemberAccessExpr | provenance | | -| implicit-self.swift:42:14:42:16 | box [x] | implicit-self.swift:42:14:42:18 | MemberAccessExpr | provenance | | +| implicit-self.swift:41:9:41:13 | ... .x | implicit-self.swift:41:9:41:11 | [post] box [x] | provenance | | +| implicit-self.swift:41:17:41:30 | source(...) | implicit-self.swift:41:9:41:13 | ... .x | provenance | | +| implicit-self.swift:42:14:42:16 | box [x] | implicit-self.swift:42:14:42:18 | ... .x | provenance | | | implicit-self.swift:47:9:47:11 | [post] box [x] | implicit-self.swift:48:14:48:17 | self [box, x] | provenance | | -| implicit-self.swift:47:9:47:13 | MemberAccessExpr | implicit-self.swift:47:9:47:11 | [post] box [x] | provenance | | -| implicit-self.swift:47:17:47:30 | CallExpr | implicit-self.swift:47:9:47:13 | MemberAccessExpr | provenance | | -| implicit-self.swift:48:14:48:17 | self [box, x] | implicit-self.swift:48:14:48:21 | MemberAccessExpr [x] | provenance | | -| implicit-self.swift:48:14:48:21 | MemberAccessExpr [x] | implicit-self.swift:48:14:48:23 | MemberAccessExpr | provenance | | +| implicit-self.swift:47:9:47:13 | ... .x | implicit-self.swift:47:9:47:11 | [post] box [x] | provenance | | +| implicit-self.swift:47:17:47:30 | source(...) | implicit-self.swift:47:9:47:13 | ... .x | provenance | | +| implicit-self.swift:48:14:48:17 | self [box, x] | implicit-self.swift:48:14:48:21 | ... .box [x] | provenance | | +| implicit-self.swift:48:14:48:21 | ... .box [x] | implicit-self.swift:48:14:48:23 | ... .x | provenance | | | implicit-self.swift:53:9:53:12 | [post] self [box, x] | implicit-self.swift:54:14:54:16 | box [x] | provenance | | -| implicit-self.swift:53:9:53:16 | [post] MemberAccessExpr [x] | implicit-self.swift:53:9:53:12 | [post] self [box, x] | provenance | | -| implicit-self.swift:53:9:53:18 | MemberAccessExpr | implicit-self.swift:53:9:53:16 | [post] MemberAccessExpr [x] | provenance | | -| implicit-self.swift:53:22:53:35 | CallExpr | implicit-self.swift:53:9:53:18 | MemberAccessExpr | provenance | | -| implicit-self.swift:54:14:54:16 | box [x] | implicit-self.swift:54:14:54:18 | MemberAccessExpr | provenance | | +| implicit-self.swift:53:9:53:16 | [post] ... .box [x] | implicit-self.swift:53:9:53:12 | [post] self [box, x] | provenance | | +| implicit-self.swift:53:9:53:18 | ... .x | implicit-self.swift:53:9:53:16 | [post] ... .box [x] | provenance | | +| implicit-self.swift:53:22:53:35 | source(...) | implicit-self.swift:53:9:53:18 | ... .x | provenance | | +| implicit-self.swift:54:14:54:16 | box [x] | implicit-self.swift:54:14:54:18 | ... .x | provenance | | | implicit-self.swift:59:9:59:9 | [incoming] x | implicit-self.swift:60:14:60:14 | x | provenance | | | implicit-self.swift:59:9:59:9 | [incoming] x | implicit-self.swift:61:14:61:17 | self [x] | provenance | | -| implicit-self.swift:59:24:59:37 | CallExpr | implicit-self.swift:59:9:59:9 | [incoming] x | provenance | | -| implicit-self.swift:61:14:61:17 | self [x] | implicit-self.swift:61:14:61:19 | MemberAccessExpr | provenance | | +| implicit-self.swift:59:24:59:37 | source(...) | implicit-self.swift:59:9:59:9 | [incoming] x | provenance | | +| implicit-self.swift:61:14:61:17 | self [x] | implicit-self.swift:61:14:61:19 | ... .x | provenance | | | implicit-self.swift:66:9:66:12 | [post] self [x] | implicit-self.swift:67:14:67:14 | x | provenance | | | implicit-self.swift:66:9:66:12 | [post] self [x] | implicit-self.swift:68:14:68:17 | self [x] | provenance | | -| implicit-self.swift:66:9:66:14 | [incoming] MemberAccessExpr | implicit-self.swift:66:9:66:12 | [post] self [x] | provenance | | -| implicit-self.swift:66:29:66:43 | CallExpr | implicit-self.swift:66:9:66:14 | [incoming] MemberAccessExpr | provenance | | -| implicit-self.swift:68:14:68:17 | self [x] | implicit-self.swift:68:14:68:19 | MemberAccessExpr | provenance | | +| implicit-self.swift:66:9:66:14 | [incoming] ... .x | implicit-self.swift:66:9:66:12 | [post] self [x] | provenance | | +| implicit-self.swift:66:29:66:43 | source(...) | implicit-self.swift:66:9:66:14 | [incoming] ... .x | provenance | | +| implicit-self.swift:68:14:68:17 | self [x] | implicit-self.swift:68:14:68:19 | ... .x | provenance | | | implicit-self.swift:73:9:73:9 | [incoming] x | implicit-self.swift:74:14:74:14 | x | provenance | | | implicit-self.swift:73:9:73:9 | [incoming] x | implicit-self.swift:75:14:75:17 | self [x] | provenance | | -| implicit-self.swift:73:24:73:38 | CallExpr | implicit-self.swift:73:9:73:9 | [incoming] x | provenance | | -| implicit-self.swift:75:14:75:17 | self [x] | implicit-self.swift:75:14:75:19 | MemberAccessExpr | provenance | | +| implicit-self.swift:73:24:73:38 | source(...) | implicit-self.swift:73:9:73:9 | [incoming] x | provenance | | +| implicit-self.swift:75:14:75:17 | self [x] | implicit-self.swift:75:14:75:19 | ... .x | provenance | | | implicit-self.swift:80:9:80:12 | [post] self [x] | implicit-self.swift:81:14:81:14 | x | provenance | | | implicit-self.swift:80:9:80:12 | [post] self [x] | implicit-self.swift:82:14:82:17 | self [x] | provenance | | -| implicit-self.swift:80:9:80:14 | [incoming] MemberAccessExpr | implicit-self.swift:80:9:80:12 | [post] self [x] | provenance | | -| implicit-self.swift:80:29:80:43 | CallExpr | implicit-self.swift:80:9:80:14 | [incoming] MemberAccessExpr | provenance | | -| implicit-self.swift:82:14:82:17 | self [x] | implicit-self.swift:82:14:82:19 | MemberAccessExpr | provenance | | -| test.swift:6:10:6:23 | CallExpr | test.swift:6:10:6:32 | BinaryExpr | provenance | | -| test.swift:7:19:7:32 | CallExpr | test.swift:7:10:7:32 | BinaryExpr | provenance | | -| test.swift:9:13:9:26 | CallExpr | test.swift:9:10:9:33 | StringInterpolationExpr | provenance | | -| test.swift:10:18:10:31 | CallExpr | test.swift:10:10:10:33 | StringInterpolationExpr | provenance | | -| test.swift:11:18:11:31 | CallExpr | test.swift:11:10:11:38 | StringInterpolationExpr | provenance | | -| test.swift:16:10:16:33 | TupleExpr [0] | test.swift:16:10:16:35 | MemberAccessExpr | provenance | | -| test.swift:16:11:16:25 | CallExpr | test.swift:16:10:16:33 | TupleExpr [0] | provenance | | -| test.swift:19:10:19:33 | TupleExpr [1] | test.swift:19:10:19:35 | MemberAccessExpr | provenance | | -| test.swift:19:19:19:32 | CallExpr | test.swift:19:10:19:33 | TupleExpr [1] | provenance | | +| implicit-self.swift:80:9:80:14 | [incoming] ... .x | implicit-self.swift:80:9:80:12 | [post] self [x] | provenance | | +| implicit-self.swift:80:29:80:43 | source(...) | implicit-self.swift:80:9:80:14 | [incoming] ... .x | provenance | | +| implicit-self.swift:82:14:82:17 | self [x] | implicit-self.swift:82:14:82:19 | ... .x | provenance | | +| test.swift:6:10:6:23 | source(...) | test.swift:6:10:6:32 | ... + ... | provenance | | +| test.swift:7:19:7:32 | source(...) | test.swift:7:10:7:32 | ... + ... | provenance | | +| test.swift:9:13:9:26 | source(...) | test.swift:9:10:9:33 | StringInterpolationExpr | provenance | | +| test.swift:10:18:10:31 | source(...) | test.swift:10:10:10:33 | StringInterpolationExpr | provenance | | +| test.swift:11:18:11:31 | source(...) | test.swift:11:10:11:38 | StringInterpolationExpr | provenance | | +| test.swift:16:10:16:33 | TupleExpr [0] | test.swift:16:10:16:35 | ... .0 | provenance | | +| test.swift:16:11:16:25 | source(...) | test.swift:16:10:16:33 | TupleExpr [0] | provenance | | +| test.swift:19:10:19:33 | TupleExpr [1] | test.swift:19:10:19:35 | ... .1 | provenance | | +| test.swift:19:19:19:32 | source(...) | test.swift:19:10:19:33 | TupleExpr [1] | provenance | | | test.swift:23:9:23:9 | a | test.swift:24:10:24:10 | a | provenance | | -| test.swift:23:13:23:26 | CallExpr | test.swift:23:9:23:9 | a | provenance | | +| test.swift:23:13:23:26 | source(...) | test.swift:23:9:23:9 | a | provenance | | | test.swift:28:9:28:14 | TupleExpr [0] | test.swift:28:10:28:10 | a | provenance | | | test.swift:28:10:28:10 | a | test.swift:29:10:29:10 | a | provenance | | | test.swift:28:18:28:41 | TupleExpr [0] | test.swift:28:9:28:14 | TupleExpr [0] | provenance | | -| test.swift:28:19:28:33 | CallExpr | test.swift:28:18:28:41 | TupleExpr [0] | provenance | | +| test.swift:28:19:28:33 | source(...) | test.swift:28:18:28:41 | TupleExpr [0] | provenance | | | test.swift:32:9:32:14 | TupleExpr [1] | test.swift:32:13:32:13 | d | provenance | | | test.swift:32:13:32:13 | d | test.swift:34:10:34:10 | d | provenance | | | test.swift:32:18:32:41 | TupleExpr [1] | test.swift:32:9:32:14 | TupleExpr [1] | provenance | | -| test.swift:32:27:32:40 | CallExpr | test.swift:32:18:32:41 | TupleExpr [1] | provenance | | +| test.swift:32:27:32:40 | source(...) | test.swift:32:18:32:41 | TupleExpr [1] | provenance | | | test.swift:38:9:38:9 | a | test.swift:39:10:39:10 | a | provenance | | -| test.swift:38:13:38:26 | CallExpr | test.swift:38:9:38:9 | a | provenance | | +| test.swift:38:13:38:26 | source(...) | test.swift:38:9:38:9 | a | provenance | | | test.swift:46:5:46:9 | [post] tuple [0] | test.swift:47:10:47:14 | tuple [0] | provenance | | -| test.swift:46:5:46:11 | MemberAccessExpr | test.swift:46:5:46:9 | [post] tuple [0] | provenance | | -| test.swift:46:15:46:28 | CallExpr | test.swift:46:5:46:11 | MemberAccessExpr | provenance | | -| test.swift:47:10:47:14 | tuple [0] | test.swift:47:10:47:16 | MemberAccessExpr | provenance | | +| test.swift:46:5:46:11 | ... .0 | test.swift:46:5:46:9 | [post] tuple [0] | provenance | | +| test.swift:46:15:46:28 | source(...) | test.swift:46:5:46:11 | ... .0 | provenance | | +| test.swift:47:10:47:14 | tuple [0] | test.swift:47:10:47:16 | ... .0 | provenance | | | test.swift:53:5:53:14 | [post] deep_tuple [1, 0] | test.swift:58:10:58:19 | deep_tuple [1, 0] | provenance | | -| test.swift:53:5:53:16 | [post] MemberAccessExpr [0] | test.swift:53:5:53:14 | [post] deep_tuple [1, 0] | provenance | | -| test.swift:53:5:53:18 | MemberAccessExpr | test.swift:53:5:53:16 | [post] MemberAccessExpr [0] | provenance | | -| test.swift:53:22:53:35 | CallExpr | test.swift:53:5:53:18 | MemberAccessExpr | provenance | | -| test.swift:58:10:58:19 | deep_tuple [1, 0] | test.swift:58:10:58:21 | MemberAccessExpr [0] | provenance | | -| test.swift:58:10:58:21 | MemberAccessExpr [0] | test.swift:58:10:58:23 | MemberAccessExpr | provenance | | -| test.swift:64:5:64:16 | TupleExpr [0] | test.swift:64:6:64:12 | MemberAccessExpr | provenance | | +| test.swift:53:5:53:16 | [post] ... .1 [0] | test.swift:53:5:53:14 | [post] deep_tuple [1, 0] | provenance | | +| test.swift:53:5:53:18 | ... .0 | test.swift:53:5:53:16 | [post] ... .1 [0] | provenance | | +| test.swift:53:22:53:35 | source(...) | test.swift:53:5:53:18 | ... .0 | provenance | | +| test.swift:58:10:58:19 | deep_tuple [1, 0] | test.swift:58:10:58:21 | ... .1 [0] | provenance | | +| test.swift:58:10:58:21 | ... .1 [0] | test.swift:58:10:58:23 | ... .0 | provenance | | +| test.swift:64:5:64:16 | TupleExpr [0] | test.swift:64:6:64:12 | ... .1 | provenance | | | test.swift:64:6:64:10 | [post] tuple [1] | test.swift:66:10:66:14 | tuple [1] | provenance | | -| test.swift:64:6:64:12 | MemberAccessExpr | test.swift:64:6:64:10 | [post] tuple [1] | provenance | | +| test.swift:64:6:64:12 | ... .1 | test.swift:64:6:64:10 | [post] tuple [1] | provenance | | | test.swift:64:20:64:51 | TupleExpr [0] | test.swift:64:5:64:16 | TupleExpr [0] | provenance | | -| test.swift:64:21:64:35 | CallExpr | test.swift:64:20:64:51 | TupleExpr [0] | provenance | | -| test.swift:66:10:66:14 | tuple [1] | test.swift:66:10:66:16 | MemberAccessExpr | provenance | | +| test.swift:64:21:64:35 | source(...) | test.swift:64:20:64:51 | TupleExpr [0] | provenance | | +| test.swift:66:10:66:14 | tuple [1] | test.swift:66:10:66:16 | ... .1 | provenance | | | test.swift:74:5:74:9 | [post] tuple [0] | test.swift:75:10:75:14 | tuple [0] | provenance | | -| test.swift:74:5:74:11 | MemberAccessExpr | test.swift:74:5:74:9 | [post] tuple [0] | provenance | | -| test.swift:74:15:74:29 | CallExpr | test.swift:74:5:74:11 | MemberAccessExpr | provenance | | -| test.swift:75:10:75:14 | tuple [0] | test.swift:75:10:75:16 | MemberAccessExpr | provenance | | +| test.swift:74:5:74:11 | ... .0 | test.swift:74:5:74:9 | [post] tuple [0] | provenance | | +| test.swift:74:15:74:29 | source(...) | test.swift:74:5:74:11 | ... .0 | provenance | | +| test.swift:75:10:75:14 | tuple [0] | test.swift:75:10:75:16 | ... .0 | provenance | | | test.swift:86:9:86:9 | x | test.swift:90:10:90:10 | x | provenance | | | test.swift:86:9:86:9 | x | test.swift:99:14:99:14 | x | provenance | | -| test.swift:86:13:86:27 | CallExpr | test.swift:86:9:86:9 | x | provenance | | +| test.swift:86:13:86:27 | source(...) | test.swift:86:9:86:9 | x | provenance | | | test.swift:94:9:94:9 | y | test.swift:96:10:96:10 | y | provenance | | | test.swift:94:9:94:9 | y | test.swift:100:14:100:14 | y | provenance | | -| test.swift:94:13:94:27 | CallExpr | test.swift:94:9:94:9 | y | provenance | | +| test.swift:94:13:94:27 | source(...) | test.swift:94:9:94:9 | y | provenance | | | test.swift:107:9:107:13 | [post] tuple [0] | test.swift:112:10:112:14 | tuple [0] | provenance | | -| test.swift:107:9:107:15 | MemberAccessExpr | test.swift:107:9:107:13 | [post] tuple [0] | provenance | | -| test.swift:107:19:107:33 | CallExpr | test.swift:107:9:107:15 | MemberAccessExpr | provenance | | -| test.swift:112:10:112:14 | tuple [0] | test.swift:112:10:112:16 | MemberAccessExpr | provenance | | +| test.swift:107:9:107:15 | ... .0 | test.swift:107:9:107:13 | [post] tuple [0] | provenance | | +| test.swift:107:19:107:33 | source(...) | test.swift:107:9:107:15 | ... .0 | provenance | | +| test.swift:112:10:112:14 | tuple [0] | test.swift:112:10:112:16 | ... .0 | provenance | | | test.swift:117:9:117:13 | tuple [0] | test.swift:120:17:120:21 | tuple [0] | provenance | | | test.swift:117:9:117:13 | tuple [1] | test.swift:120:17:120:21 | tuple [1] | provenance | | | test.swift:117:17:117:50 | TupleExpr [0] | test.swift:117:9:117:13 | tuple [0] | provenance | | | test.swift:117:17:117:50 | TupleExpr [1] | test.swift:117:9:117:13 | tuple [1] | provenance | | -| test.swift:117:18:117:33 | CallExpr | test.swift:117:17:117:50 | TupleExpr [0] | provenance | | -| test.swift:117:35:117:49 | CallExpr | test.swift:117:17:117:50 | TupleExpr [1] | provenance | | +| test.swift:117:18:117:33 | source(...) | test.swift:117:17:117:50 | TupleExpr [0] | provenance | | +| test.swift:117:35:117:49 | source(...) | test.swift:117:17:117:50 | TupleExpr [1] | provenance | | | test.swift:120:9:120:13 | TupleExpr [0] | test.swift:120:10:120:10 | a | provenance | | | test.swift:120:9:120:13 | TupleExpr [1] | test.swift:120:12:120:12 | b | provenance | | | test.swift:120:10:120:10 | a | test.swift:125:10:125:10 | a | provenance | | @@ -114,171 +114,171 @@ edges | test.swift:120:17:120:21 | tuple [0] | test.swift:120:9:120:13 | TupleExpr [0] | provenance | | | test.swift:120:17:120:21 | tuple [1] | test.swift:120:9:120:13 | TupleExpr [1] | provenance | | | test.swift:131:5:131:5 | a | test.swift:132:10:132:10 | a | provenance | | -| test.swift:131:19:131:33 | CallExpr | test.swift:131:5:131:5 | a | provenance | | +| test.swift:131:19:131:33 | source(...) | test.swift:131:5:131:5 | a | provenance | | | test.swift:137:5:137:5 | [incoming] a | test.swift:138:10:138:10 | a | provenance | | -| test.swift:137:10:137:24 | CallExpr | test.swift:137:5:137:5 | [incoming] a | provenance | | +| test.swift:137:10:137:24 | source(...) | test.swift:137:5:137:5 | [incoming] a | provenance | | | test.swift:143:5:143:5 | [incoming] a | test.swift:144:10:144:10 | a | provenance | | -| test.swift:143:20:143:34 | CallExpr | test.swift:143:5:143:5 | [incoming] a | provenance | | +| test.swift:143:20:143:34 | source(...) | test.swift:143:5:143:5 | [incoming] a | provenance | | | test.swift:149:5:149:5 | [post] a [0] | test.swift:150:10:150:10 | a [0] | provenance | | -| test.swift:149:5:149:7 | MemberAccessExpr | test.swift:149:5:149:5 | [post] a [0] | provenance | | -| test.swift:149:23:149:37 | CallExpr | test.swift:149:5:149:7 | MemberAccessExpr | provenance | | -| test.swift:150:10:150:10 | a [0] | test.swift:150:10:150:12 | MemberAccessExpr | provenance | | -| test.swift:156:5:156:12 | TupleExpr [0] | test.swift:156:6:156:8 | MemberAccessExpr | provenance | | +| test.swift:149:5:149:7 | ... .0 | test.swift:149:5:149:5 | [post] a [0] | provenance | | +| test.swift:149:23:149:37 | source(...) | test.swift:149:5:149:7 | ... .0 | provenance | | +| test.swift:150:10:150:10 | a [0] | test.swift:150:10:150:12 | ... .0 | provenance | | +| test.swift:156:5:156:12 | TupleExpr [0] | test.swift:156:6:156:8 | ... .0 | provenance | | | test.swift:156:6:156:6 | [post] a [0] | test.swift:157:10:157:10 | a [0] | provenance | | -| test.swift:156:6:156:8 | MemberAccessExpr | test.swift:156:6:156:6 | [post] a [0] | provenance | | +| test.swift:156:6:156:8 | ... .0 | test.swift:156:6:156:6 | [post] a [0] | provenance | | | test.swift:156:16:156:61 | TupleExpr [0] | test.swift:156:5:156:12 | TupleExpr [0] | provenance | | -| test.swift:156:17:156:43 | BinaryExpr | test.swift:156:16:156:61 | TupleExpr [0] | provenance | | -| test.swift:156:29:156:43 | CallExpr | test.swift:156:17:156:43 | BinaryExpr | provenance | | -| test.swift:157:10:157:10 | a [0] | test.swift:157:10:157:12 | MemberAccessExpr | provenance | | +| test.swift:156:17:156:43 | ... + ... | test.swift:156:16:156:61 | TupleExpr [0] | provenance | | +| test.swift:156:29:156:43 | source(...) | test.swift:156:17:156:43 | ... + ... | provenance | | +| test.swift:157:10:157:10 | a [0] | test.swift:157:10:157:12 | ... .0 | provenance | | | test.swift:164:5:164:10 | TupleExpr [0] | test.swift:164:6:164:6 | a | provenance | | | test.swift:164:5:164:10 | TupleExpr [1] | test.swift:164:9:164:9 | b | provenance | | | test.swift:164:6:164:6 | a | test.swift:165:10:165:10 | a | provenance | | | test.swift:164:9:164:9 | b | test.swift:166:10:166:10 | b | provenance | | | test.swift:164:14:164:67 | TupleExpr [0] | test.swift:164:5:164:10 | TupleExpr [0] | provenance | | | test.swift:164:14:164:67 | TupleExpr [1] | test.swift:164:5:164:10 | TupleExpr [1] | provenance | | -| test.swift:164:15:164:39 | BinaryExpr | test.swift:164:14:164:67 | TupleExpr [0] | provenance | | -| test.swift:164:25:164:39 | CallExpr | test.swift:164:15:164:39 | BinaryExpr | provenance | | -| test.swift:164:42:164:66 | BinaryExpr | test.swift:164:14:164:67 | TupleExpr [1] | provenance | | -| test.swift:164:52:164:66 | CallExpr | test.swift:164:42:164:66 | BinaryExpr | provenance | | +| test.swift:164:15:164:39 | ... + ... | test.swift:164:14:164:67 | TupleExpr [0] | provenance | | +| test.swift:164:25:164:39 | source(...) | test.swift:164:15:164:39 | ... + ... | provenance | | +| test.swift:164:42:164:66 | ... + ... | test.swift:164:14:164:67 | TupleExpr [1] | provenance | | +| test.swift:164:52:164:66 | source(...) | test.swift:164:42:164:66 | ... + ... | provenance | | nodes | implicit-self.swift:11:9:11:12 | [post] self [x] | semmle.label | [post] self [x] | -| implicit-self.swift:11:9:11:14 | MemberAccessExpr | semmle.label | MemberAccessExpr | -| implicit-self.swift:11:18:11:31 | CallExpr | semmle.label | CallExpr | +| implicit-self.swift:11:9:11:14 | ... .x | semmle.label | ... .x | +| implicit-self.swift:11:18:11:31 | source(...) | semmle.label | source(...) | | implicit-self.swift:12:14:12:17 | self [x] | semmle.label | self [x] | -| implicit-self.swift:12:14:12:19 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| implicit-self.swift:12:14:12:19 | ... .x | semmle.label | ... .x | | implicit-self.swift:17:9:17:9 | x | semmle.label | x | -| implicit-self.swift:17:13:17:26 | CallExpr | semmle.label | CallExpr | +| implicit-self.swift:17:13:17:26 | source(...) | semmle.label | source(...) | | implicit-self.swift:18:14:18:14 | x | semmle.label | x | | implicit-self.swift:23:9:23:9 | x | semmle.label | x | -| implicit-self.swift:23:13:23:26 | CallExpr | semmle.label | CallExpr | +| implicit-self.swift:23:13:23:26 | source(...) | semmle.label | source(...) | | implicit-self.swift:24:14:24:17 | self [x] | semmle.label | self [x] | -| implicit-self.swift:24:14:24:19 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| implicit-self.swift:24:14:24:19 | ... .x | semmle.label | ... .x | | implicit-self.swift:29:9:29:12 | [post] self [x] | semmle.label | [post] self [x] | -| implicit-self.swift:29:9:29:14 | MemberAccessExpr | semmle.label | MemberAccessExpr | -| implicit-self.swift:29:18:29:31 | CallExpr | semmle.label | CallExpr | +| implicit-self.swift:29:9:29:14 | ... .x | semmle.label | ... .x | +| implicit-self.swift:29:18:29:31 | source(...) | semmle.label | source(...) | | implicit-self.swift:30:14:30:14 | x | semmle.label | x | | implicit-self.swift:35:9:35:12 | [post] self [box, x] | semmle.label | [post] self [box, x] | -| implicit-self.swift:35:9:35:16 | [post] MemberAccessExpr [x] | semmle.label | [post] MemberAccessExpr [x] | -| implicit-self.swift:35:9:35:18 | MemberAccessExpr | semmle.label | MemberAccessExpr | -| implicit-self.swift:35:22:35:35 | CallExpr | semmle.label | CallExpr | +| implicit-self.swift:35:9:35:16 | [post] ... .box [x] | semmle.label | [post] ... .box [x] | +| implicit-self.swift:35:9:35:18 | ... .x | semmle.label | ... .x | +| implicit-self.swift:35:22:35:35 | source(...) | semmle.label | source(...) | | implicit-self.swift:36:14:36:17 | self [box, x] | semmle.label | self [box, x] | -| implicit-self.swift:36:14:36:21 | MemberAccessExpr [x] | semmle.label | MemberAccessExpr [x] | -| implicit-self.swift:36:14:36:23 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| implicit-self.swift:36:14:36:21 | ... .box [x] | semmle.label | ... .box [x] | +| implicit-self.swift:36:14:36:23 | ... .x | semmle.label | ... .x | | implicit-self.swift:41:9:41:11 | [post] box [x] | semmle.label | [post] box [x] | -| implicit-self.swift:41:9:41:13 | MemberAccessExpr | semmle.label | MemberAccessExpr | -| implicit-self.swift:41:17:41:30 | CallExpr | semmle.label | CallExpr | +| implicit-self.swift:41:9:41:13 | ... .x | semmle.label | ... .x | +| implicit-self.swift:41:17:41:30 | source(...) | semmle.label | source(...) | | implicit-self.swift:42:14:42:16 | box [x] | semmle.label | box [x] | -| implicit-self.swift:42:14:42:18 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| implicit-self.swift:42:14:42:18 | ... .x | semmle.label | ... .x | | implicit-self.swift:47:9:47:11 | [post] box [x] | semmle.label | [post] box [x] | -| implicit-self.swift:47:9:47:13 | MemberAccessExpr | semmle.label | MemberAccessExpr | -| implicit-self.swift:47:17:47:30 | CallExpr | semmle.label | CallExpr | +| implicit-self.swift:47:9:47:13 | ... .x | semmle.label | ... .x | +| implicit-self.swift:47:17:47:30 | source(...) | semmle.label | source(...) | | implicit-self.swift:48:14:48:17 | self [box, x] | semmle.label | self [box, x] | -| implicit-self.swift:48:14:48:21 | MemberAccessExpr [x] | semmle.label | MemberAccessExpr [x] | -| implicit-self.swift:48:14:48:23 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| implicit-self.swift:48:14:48:21 | ... .box [x] | semmle.label | ... .box [x] | +| implicit-self.swift:48:14:48:23 | ... .x | semmle.label | ... .x | | implicit-self.swift:53:9:53:12 | [post] self [box, x] | semmle.label | [post] self [box, x] | -| implicit-self.swift:53:9:53:16 | [post] MemberAccessExpr [x] | semmle.label | [post] MemberAccessExpr [x] | -| implicit-self.swift:53:9:53:18 | MemberAccessExpr | semmle.label | MemberAccessExpr | -| implicit-self.swift:53:22:53:35 | CallExpr | semmle.label | CallExpr | +| implicit-self.swift:53:9:53:16 | [post] ... .box [x] | semmle.label | [post] ... .box [x] | +| implicit-self.swift:53:9:53:18 | ... .x | semmle.label | ... .x | +| implicit-self.swift:53:22:53:35 | source(...) | semmle.label | source(...) | | implicit-self.swift:54:14:54:16 | box [x] | semmle.label | box [x] | -| implicit-self.swift:54:14:54:18 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| implicit-self.swift:54:14:54:18 | ... .x | semmle.label | ... .x | | implicit-self.swift:59:9:59:9 | [incoming] x | semmle.label | [incoming] x | -| implicit-self.swift:59:24:59:37 | CallExpr | semmle.label | CallExpr | +| implicit-self.swift:59:24:59:37 | source(...) | semmle.label | source(...) | | implicit-self.swift:60:14:60:14 | x | semmle.label | x | | implicit-self.swift:61:14:61:17 | self [x] | semmle.label | self [x] | -| implicit-self.swift:61:14:61:19 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| implicit-self.swift:61:14:61:19 | ... .x | semmle.label | ... .x | | implicit-self.swift:66:9:66:12 | [post] self [x] | semmle.label | [post] self [x] | -| implicit-self.swift:66:9:66:14 | [incoming] MemberAccessExpr | semmle.label | [incoming] MemberAccessExpr | -| implicit-self.swift:66:29:66:43 | CallExpr | semmle.label | CallExpr | +| implicit-self.swift:66:9:66:14 | [incoming] ... .x | semmle.label | [incoming] ... .x | +| implicit-self.swift:66:29:66:43 | source(...) | semmle.label | source(...) | | implicit-self.swift:67:14:67:14 | x | semmle.label | x | | implicit-self.swift:68:14:68:17 | self [x] | semmle.label | self [x] | -| implicit-self.swift:68:14:68:19 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| implicit-self.swift:68:14:68:19 | ... .x | semmle.label | ... .x | | implicit-self.swift:73:9:73:9 | [incoming] x | semmle.label | [incoming] x | -| implicit-self.swift:73:24:73:38 | CallExpr | semmle.label | CallExpr | +| implicit-self.swift:73:24:73:38 | source(...) | semmle.label | source(...) | | implicit-self.swift:74:14:74:14 | x | semmle.label | x | | implicit-self.swift:75:14:75:17 | self [x] | semmle.label | self [x] | -| implicit-self.swift:75:14:75:19 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| implicit-self.swift:75:14:75:19 | ... .x | semmle.label | ... .x | | implicit-self.swift:80:9:80:12 | [post] self [x] | semmle.label | [post] self [x] | -| implicit-self.swift:80:9:80:14 | [incoming] MemberAccessExpr | semmle.label | [incoming] MemberAccessExpr | -| implicit-self.swift:80:29:80:43 | CallExpr | semmle.label | CallExpr | +| implicit-self.swift:80:9:80:14 | [incoming] ... .x | semmle.label | [incoming] ... .x | +| implicit-self.swift:80:29:80:43 | source(...) | semmle.label | source(...) | | implicit-self.swift:81:14:81:14 | x | semmle.label | x | | implicit-self.swift:82:14:82:17 | self [x] | semmle.label | self [x] | -| implicit-self.swift:82:14:82:19 | MemberAccessExpr | semmle.label | MemberAccessExpr | -| test.swift:2:10:2:21 | CallExpr | semmle.label | CallExpr | -| test.swift:6:10:6:23 | CallExpr | semmle.label | CallExpr | -| test.swift:6:10:6:32 | BinaryExpr | semmle.label | BinaryExpr | -| test.swift:7:10:7:32 | BinaryExpr | semmle.label | BinaryExpr | -| test.swift:7:19:7:32 | CallExpr | semmle.label | CallExpr | +| implicit-self.swift:82:14:82:19 | ... .x | semmle.label | ... .x | +| test.swift:2:10:2:21 | source(...) | semmle.label | source(...) | +| test.swift:6:10:6:23 | source(...) | semmle.label | source(...) | +| test.swift:6:10:6:32 | ... + ... | semmle.label | ... + ... | +| test.swift:7:10:7:32 | ... + ... | semmle.label | ... + ... | +| test.swift:7:19:7:32 | source(...) | semmle.label | source(...) | | test.swift:9:10:9:33 | StringInterpolationExpr | semmle.label | StringInterpolationExpr | -| test.swift:9:13:9:26 | CallExpr | semmle.label | CallExpr | +| test.swift:9:13:9:26 | source(...) | semmle.label | source(...) | | test.swift:10:10:10:33 | StringInterpolationExpr | semmle.label | StringInterpolationExpr | -| test.swift:10:18:10:31 | CallExpr | semmle.label | CallExpr | +| test.swift:10:18:10:31 | source(...) | semmle.label | source(...) | | test.swift:11:10:11:38 | StringInterpolationExpr | semmle.label | StringInterpolationExpr | -| test.swift:11:18:11:31 | CallExpr | semmle.label | CallExpr | +| test.swift:11:18:11:31 | source(...) | semmle.label | source(...) | | test.swift:16:10:16:33 | TupleExpr [0] | semmle.label | TupleExpr [0] | -| test.swift:16:10:16:35 | MemberAccessExpr | semmle.label | MemberAccessExpr | -| test.swift:16:11:16:25 | CallExpr | semmle.label | CallExpr | +| test.swift:16:10:16:35 | ... .0 | semmle.label | ... .0 | +| test.swift:16:11:16:25 | source(...) | semmle.label | source(...) | | test.swift:19:10:19:33 | TupleExpr [1] | semmle.label | TupleExpr [1] | -| test.swift:19:10:19:35 | MemberAccessExpr | semmle.label | MemberAccessExpr | -| test.swift:19:19:19:32 | CallExpr | semmle.label | CallExpr | +| test.swift:19:10:19:35 | ... .1 | semmle.label | ... .1 | +| test.swift:19:19:19:32 | source(...) | semmle.label | source(...) | | test.swift:23:9:23:9 | a | semmle.label | a | -| test.swift:23:13:23:26 | CallExpr | semmle.label | CallExpr | +| test.swift:23:13:23:26 | source(...) | semmle.label | source(...) | | test.swift:24:10:24:10 | a | semmle.label | a | | test.swift:28:9:28:14 | TupleExpr [0] | semmle.label | TupleExpr [0] | | test.swift:28:10:28:10 | a | semmle.label | a | | test.swift:28:18:28:41 | TupleExpr [0] | semmle.label | TupleExpr [0] | -| test.swift:28:19:28:33 | CallExpr | semmle.label | CallExpr | +| test.swift:28:19:28:33 | source(...) | semmle.label | source(...) | | test.swift:29:10:29:10 | a | semmle.label | a | | test.swift:32:9:32:14 | TupleExpr [1] | semmle.label | TupleExpr [1] | | test.swift:32:13:32:13 | d | semmle.label | d | | test.swift:32:18:32:41 | TupleExpr [1] | semmle.label | TupleExpr [1] | -| test.swift:32:27:32:40 | CallExpr | semmle.label | CallExpr | +| test.swift:32:27:32:40 | source(...) | semmle.label | source(...) | | test.swift:34:10:34:10 | d | semmle.label | d | | test.swift:38:9:38:9 | a | semmle.label | a | -| test.swift:38:13:38:26 | CallExpr | semmle.label | CallExpr | +| test.swift:38:13:38:26 | source(...) | semmle.label | source(...) | | test.swift:39:10:39:10 | a | semmle.label | a | | test.swift:46:5:46:9 | [post] tuple [0] | semmle.label | [post] tuple [0] | -| test.swift:46:5:46:11 | MemberAccessExpr | semmle.label | MemberAccessExpr | -| test.swift:46:15:46:28 | CallExpr | semmle.label | CallExpr | +| test.swift:46:5:46:11 | ... .0 | semmle.label | ... .0 | +| test.swift:46:15:46:28 | source(...) | semmle.label | source(...) | | test.swift:47:10:47:14 | tuple [0] | semmle.label | tuple [0] | -| test.swift:47:10:47:16 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| test.swift:47:10:47:16 | ... .0 | semmle.label | ... .0 | | test.swift:53:5:53:14 | [post] deep_tuple [1, 0] | semmle.label | [post] deep_tuple [1, 0] | -| test.swift:53:5:53:16 | [post] MemberAccessExpr [0] | semmle.label | [post] MemberAccessExpr [0] | -| test.swift:53:5:53:18 | MemberAccessExpr | semmle.label | MemberAccessExpr | -| test.swift:53:22:53:35 | CallExpr | semmle.label | CallExpr | +| test.swift:53:5:53:16 | [post] ... .1 [0] | semmle.label | [post] ... .1 [0] | +| test.swift:53:5:53:18 | ... .0 | semmle.label | ... .0 | +| test.swift:53:22:53:35 | source(...) | semmle.label | source(...) | | test.swift:58:10:58:19 | deep_tuple [1, 0] | semmle.label | deep_tuple [1, 0] | -| test.swift:58:10:58:21 | MemberAccessExpr [0] | semmle.label | MemberAccessExpr [0] | -| test.swift:58:10:58:23 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| test.swift:58:10:58:21 | ... .1 [0] | semmle.label | ... .1 [0] | +| test.swift:58:10:58:23 | ... .0 | semmle.label | ... .0 | | test.swift:64:5:64:16 | TupleExpr [0] | semmle.label | TupleExpr [0] | | test.swift:64:6:64:10 | [post] tuple [1] | semmle.label | [post] tuple [1] | -| test.swift:64:6:64:12 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| test.swift:64:6:64:12 | ... .1 | semmle.label | ... .1 | | test.swift:64:20:64:51 | TupleExpr [0] | semmle.label | TupleExpr [0] | -| test.swift:64:21:64:35 | CallExpr | semmle.label | CallExpr | +| test.swift:64:21:64:35 | source(...) | semmle.label | source(...) | | test.swift:66:10:66:14 | tuple [1] | semmle.label | tuple [1] | -| test.swift:66:10:66:16 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| test.swift:66:10:66:16 | ... .1 | semmle.label | ... .1 | | test.swift:74:5:74:9 | [post] tuple [0] | semmle.label | [post] tuple [0] | -| test.swift:74:5:74:11 | MemberAccessExpr | semmle.label | MemberAccessExpr | -| test.swift:74:15:74:29 | CallExpr | semmle.label | CallExpr | +| test.swift:74:5:74:11 | ... .0 | semmle.label | ... .0 | +| test.swift:74:15:74:29 | source(...) | semmle.label | source(...) | | test.swift:75:10:75:14 | tuple [0] | semmle.label | tuple [0] | -| test.swift:75:10:75:16 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| test.swift:75:10:75:16 | ... .0 | semmle.label | ... .0 | | test.swift:86:9:86:9 | x | semmle.label | x | -| test.swift:86:13:86:27 | CallExpr | semmle.label | CallExpr | +| test.swift:86:13:86:27 | source(...) | semmle.label | source(...) | | test.swift:90:10:90:10 | x | semmle.label | x | | test.swift:94:9:94:9 | y | semmle.label | y | -| test.swift:94:13:94:27 | CallExpr | semmle.label | CallExpr | +| test.swift:94:13:94:27 | source(...) | semmle.label | source(...) | | test.swift:96:10:96:10 | y | semmle.label | y | | test.swift:99:14:99:14 | x | semmle.label | x | | test.swift:100:14:100:14 | y | semmle.label | y | | test.swift:107:9:107:13 | [post] tuple [0] | semmle.label | [post] tuple [0] | -| test.swift:107:9:107:15 | MemberAccessExpr | semmle.label | MemberAccessExpr | -| test.swift:107:19:107:33 | CallExpr | semmle.label | CallExpr | +| test.swift:107:9:107:15 | ... .0 | semmle.label | ... .0 | +| test.swift:107:19:107:33 | source(...) | semmle.label | source(...) | | test.swift:112:10:112:14 | tuple [0] | semmle.label | tuple [0] | -| test.swift:112:10:112:16 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| test.swift:112:10:112:16 | ... .0 | semmle.label | ... .0 | | test.swift:117:9:117:13 | tuple [0] | semmle.label | tuple [0] | | test.swift:117:9:117:13 | tuple [1] | semmle.label | tuple [1] | | test.swift:117:17:117:50 | TupleExpr [0] | semmle.label | TupleExpr [0] | | test.swift:117:17:117:50 | TupleExpr [1] | semmle.label | TupleExpr [1] | -| test.swift:117:18:117:33 | CallExpr | semmle.label | CallExpr | -| test.swift:117:35:117:49 | CallExpr | semmle.label | CallExpr | +| test.swift:117:18:117:33 | source(...) | semmle.label | source(...) | +| test.swift:117:35:117:49 | source(...) | semmle.label | source(...) | | test.swift:120:9:120:13 | TupleExpr [0] | semmle.label | TupleExpr [0] | | test.swift:120:9:120:13 | TupleExpr [1] | semmle.label | TupleExpr [1] | | test.swift:120:10:120:10 | a | semmle.label | a | @@ -288,85 +288,85 @@ nodes | test.swift:125:10:125:10 | a | semmle.label | a | | test.swift:126:10:126:10 | b | semmle.label | b | | test.swift:131:5:131:5 | a | semmle.label | a | -| test.swift:131:19:131:33 | CallExpr | semmle.label | CallExpr | +| test.swift:131:19:131:33 | source(...) | semmle.label | source(...) | | test.swift:132:10:132:10 | a | semmle.label | a | | test.swift:137:5:137:5 | [incoming] a | semmle.label | [incoming] a | -| test.swift:137:10:137:24 | CallExpr | semmle.label | CallExpr | +| test.swift:137:10:137:24 | source(...) | semmle.label | source(...) | | test.swift:138:10:138:10 | a | semmle.label | a | | test.swift:143:5:143:5 | [incoming] a | semmle.label | [incoming] a | -| test.swift:143:20:143:34 | CallExpr | semmle.label | CallExpr | +| test.swift:143:20:143:34 | source(...) | semmle.label | source(...) | | test.swift:144:10:144:10 | a | semmle.label | a | | test.swift:149:5:149:5 | [post] a [0] | semmle.label | [post] a [0] | -| test.swift:149:5:149:7 | MemberAccessExpr | semmle.label | MemberAccessExpr | -| test.swift:149:23:149:37 | CallExpr | semmle.label | CallExpr | +| test.swift:149:5:149:7 | ... .0 | semmle.label | ... .0 | +| test.swift:149:23:149:37 | source(...) | semmle.label | source(...) | | test.swift:150:10:150:10 | a [0] | semmle.label | a [0] | -| test.swift:150:10:150:12 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| test.swift:150:10:150:12 | ... .0 | semmle.label | ... .0 | | test.swift:156:5:156:12 | TupleExpr [0] | semmle.label | TupleExpr [0] | | test.swift:156:6:156:6 | [post] a [0] | semmle.label | [post] a [0] | -| test.swift:156:6:156:8 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| test.swift:156:6:156:8 | ... .0 | semmle.label | ... .0 | | test.swift:156:16:156:61 | TupleExpr [0] | semmle.label | TupleExpr [0] | -| test.swift:156:17:156:43 | BinaryExpr | semmle.label | BinaryExpr | -| test.swift:156:29:156:43 | CallExpr | semmle.label | CallExpr | +| test.swift:156:17:156:43 | ... + ... | semmle.label | ... + ... | +| test.swift:156:29:156:43 | source(...) | semmle.label | source(...) | | test.swift:157:10:157:10 | a [0] | semmle.label | a [0] | -| test.swift:157:10:157:12 | MemberAccessExpr | semmle.label | MemberAccessExpr | +| test.swift:157:10:157:12 | ... .0 | semmle.label | ... .0 | | test.swift:164:5:164:10 | TupleExpr [0] | semmle.label | TupleExpr [0] | | test.swift:164:5:164:10 | TupleExpr [1] | semmle.label | TupleExpr [1] | | test.swift:164:6:164:6 | a | semmle.label | a | | test.swift:164:9:164:9 | b | semmle.label | b | | test.swift:164:14:164:67 | TupleExpr [0] | semmle.label | TupleExpr [0] | | test.swift:164:14:164:67 | TupleExpr [1] | semmle.label | TupleExpr [1] | -| test.swift:164:15:164:39 | BinaryExpr | semmle.label | BinaryExpr | -| test.swift:164:25:164:39 | CallExpr | semmle.label | CallExpr | -| test.swift:164:42:164:66 | BinaryExpr | semmle.label | BinaryExpr | -| test.swift:164:52:164:66 | CallExpr | semmle.label | CallExpr | +| test.swift:164:15:164:39 | ... + ... | semmle.label | ... + ... | +| test.swift:164:25:164:39 | source(...) | semmle.label | source(...) | +| test.swift:164:42:164:66 | ... + ... | semmle.label | ... + ... | +| test.swift:164:52:164:66 | source(...) | semmle.label | source(...) | | test.swift:165:10:165:10 | a | semmle.label | a | | test.swift:166:10:166:10 | b | semmle.label | b | subpaths testFailures #select -| implicit-self.swift:12:14:12:19 | MemberAccessExpr | implicit-self.swift:11:18:11:31 | CallExpr | implicit-self.swift:12:14:12:19 | MemberAccessExpr | $@ | implicit-self.swift:11:18:11:31 | CallExpr | CallExpr | -| implicit-self.swift:18:14:18:14 | x | implicit-self.swift:17:13:17:26 | CallExpr | implicit-self.swift:18:14:18:14 | x | $@ | implicit-self.swift:17:13:17:26 | CallExpr | CallExpr | -| implicit-self.swift:24:14:24:19 | MemberAccessExpr | implicit-self.swift:23:13:23:26 | CallExpr | implicit-self.swift:24:14:24:19 | MemberAccessExpr | $@ | implicit-self.swift:23:13:23:26 | CallExpr | CallExpr | -| implicit-self.swift:30:14:30:14 | x | implicit-self.swift:29:18:29:31 | CallExpr | implicit-self.swift:30:14:30:14 | x | $@ | implicit-self.swift:29:18:29:31 | CallExpr | CallExpr | -| implicit-self.swift:36:14:36:23 | MemberAccessExpr | implicit-self.swift:35:22:35:35 | CallExpr | implicit-self.swift:36:14:36:23 | MemberAccessExpr | $@ | implicit-self.swift:35:22:35:35 | CallExpr | CallExpr | -| implicit-self.swift:42:14:42:18 | MemberAccessExpr | implicit-self.swift:41:17:41:30 | CallExpr | implicit-self.swift:42:14:42:18 | MemberAccessExpr | $@ | implicit-self.swift:41:17:41:30 | CallExpr | CallExpr | -| implicit-self.swift:48:14:48:23 | MemberAccessExpr | implicit-self.swift:47:17:47:30 | CallExpr | implicit-self.swift:48:14:48:23 | MemberAccessExpr | $@ | implicit-self.swift:47:17:47:30 | CallExpr | CallExpr | -| implicit-self.swift:54:14:54:18 | MemberAccessExpr | implicit-self.swift:53:22:53:35 | CallExpr | implicit-self.swift:54:14:54:18 | MemberAccessExpr | $@ | implicit-self.swift:53:22:53:35 | CallExpr | CallExpr | -| implicit-self.swift:60:14:60:14 | x | implicit-self.swift:59:24:59:37 | CallExpr | implicit-self.swift:60:14:60:14 | x | $@ | implicit-self.swift:59:24:59:37 | CallExpr | CallExpr | -| implicit-self.swift:61:14:61:19 | MemberAccessExpr | implicit-self.swift:59:24:59:37 | CallExpr | implicit-self.swift:61:14:61:19 | MemberAccessExpr | $@ | implicit-self.swift:59:24:59:37 | CallExpr | CallExpr | -| implicit-self.swift:67:14:67:14 | x | implicit-self.swift:66:29:66:43 | CallExpr | implicit-self.swift:67:14:67:14 | x | $@ | implicit-self.swift:66:29:66:43 | CallExpr | CallExpr | -| implicit-self.swift:68:14:68:19 | MemberAccessExpr | implicit-self.swift:66:29:66:43 | CallExpr | implicit-self.swift:68:14:68:19 | MemberAccessExpr | $@ | implicit-self.swift:66:29:66:43 | CallExpr | CallExpr | -| implicit-self.swift:74:14:74:14 | x | implicit-self.swift:73:24:73:38 | CallExpr | implicit-self.swift:74:14:74:14 | x | $@ | implicit-self.swift:73:24:73:38 | CallExpr | CallExpr | -| implicit-self.swift:75:14:75:19 | MemberAccessExpr | implicit-self.swift:73:24:73:38 | CallExpr | implicit-self.swift:75:14:75:19 | MemberAccessExpr | $@ | implicit-self.swift:73:24:73:38 | CallExpr | CallExpr | -| implicit-self.swift:81:14:81:14 | x | implicit-self.swift:80:29:80:43 | CallExpr | implicit-self.swift:81:14:81:14 | x | $@ | implicit-self.swift:80:29:80:43 | CallExpr | CallExpr | -| implicit-self.swift:82:14:82:19 | MemberAccessExpr | implicit-self.swift:80:29:80:43 | CallExpr | implicit-self.swift:82:14:82:19 | MemberAccessExpr | $@ | implicit-self.swift:80:29:80:43 | CallExpr | CallExpr | -| test.swift:2:10:2:21 | CallExpr | test.swift:2:10:2:21 | CallExpr | test.swift:2:10:2:21 | CallExpr | $@ | test.swift:2:10:2:21 | CallExpr | CallExpr | -| test.swift:6:10:6:32 | BinaryExpr | test.swift:6:10:6:23 | CallExpr | test.swift:6:10:6:32 | BinaryExpr | $@ | test.swift:6:10:6:23 | CallExpr | CallExpr | -| test.swift:7:10:7:32 | BinaryExpr | test.swift:7:19:7:32 | CallExpr | test.swift:7:10:7:32 | BinaryExpr | $@ | test.swift:7:19:7:32 | CallExpr | CallExpr | -| test.swift:9:10:9:33 | StringInterpolationExpr | test.swift:9:13:9:26 | CallExpr | test.swift:9:10:9:33 | StringInterpolationExpr | $@ | test.swift:9:13:9:26 | CallExpr | CallExpr | -| test.swift:10:10:10:33 | StringInterpolationExpr | test.swift:10:18:10:31 | CallExpr | test.swift:10:10:10:33 | StringInterpolationExpr | $@ | test.swift:10:18:10:31 | CallExpr | CallExpr | -| test.swift:11:10:11:38 | StringInterpolationExpr | test.swift:11:18:11:31 | CallExpr | test.swift:11:10:11:38 | StringInterpolationExpr | $@ | test.swift:11:18:11:31 | CallExpr | CallExpr | -| test.swift:16:10:16:35 | MemberAccessExpr | test.swift:16:11:16:25 | CallExpr | test.swift:16:10:16:35 | MemberAccessExpr | $@ | test.swift:16:11:16:25 | CallExpr | CallExpr | -| test.swift:19:10:19:35 | MemberAccessExpr | test.swift:19:19:19:32 | CallExpr | test.swift:19:10:19:35 | MemberAccessExpr | $@ | test.swift:19:19:19:32 | CallExpr | CallExpr | -| test.swift:24:10:24:10 | a | test.swift:23:13:23:26 | CallExpr | test.swift:24:10:24:10 | a | $@ | test.swift:23:13:23:26 | CallExpr | CallExpr | -| test.swift:29:10:29:10 | a | test.swift:28:19:28:33 | CallExpr | test.swift:29:10:29:10 | a | $@ | test.swift:28:19:28:33 | CallExpr | CallExpr | -| test.swift:34:10:34:10 | d | test.swift:32:27:32:40 | CallExpr | test.swift:34:10:34:10 | d | $@ | test.swift:32:27:32:40 | CallExpr | CallExpr | -| test.swift:39:10:39:10 | a | test.swift:38:13:38:26 | CallExpr | test.swift:39:10:39:10 | a | $@ | test.swift:38:13:38:26 | CallExpr | CallExpr | -| test.swift:47:10:47:16 | MemberAccessExpr | test.swift:46:15:46:28 | CallExpr | test.swift:47:10:47:16 | MemberAccessExpr | $@ | test.swift:46:15:46:28 | CallExpr | CallExpr | -| test.swift:58:10:58:23 | MemberAccessExpr | test.swift:53:22:53:35 | CallExpr | test.swift:58:10:58:23 | MemberAccessExpr | $@ | test.swift:53:22:53:35 | CallExpr | CallExpr | -| test.swift:66:10:66:16 | MemberAccessExpr | test.swift:64:21:64:35 | CallExpr | test.swift:66:10:66:16 | MemberAccessExpr | $@ | test.swift:64:21:64:35 | CallExpr | CallExpr | -| test.swift:75:10:75:16 | MemberAccessExpr | test.swift:74:15:74:29 | CallExpr | test.swift:75:10:75:16 | MemberAccessExpr | $@ | test.swift:74:15:74:29 | CallExpr | CallExpr | -| test.swift:90:10:90:10 | x | test.swift:86:13:86:27 | CallExpr | test.swift:90:10:90:10 | x | $@ | test.swift:86:13:86:27 | CallExpr | CallExpr | -| test.swift:96:10:96:10 | y | test.swift:94:13:94:27 | CallExpr | test.swift:96:10:96:10 | y | $@ | test.swift:94:13:94:27 | CallExpr | CallExpr | -| test.swift:99:14:99:14 | x | test.swift:86:13:86:27 | CallExpr | test.swift:99:14:99:14 | x | $@ | test.swift:86:13:86:27 | CallExpr | CallExpr | -| test.swift:100:14:100:14 | y | test.swift:94:13:94:27 | CallExpr | test.swift:100:14:100:14 | y | $@ | test.swift:94:13:94:27 | CallExpr | CallExpr | -| test.swift:112:10:112:16 | MemberAccessExpr | test.swift:107:19:107:33 | CallExpr | test.swift:112:10:112:16 | MemberAccessExpr | $@ | test.swift:107:19:107:33 | CallExpr | CallExpr | -| test.swift:125:10:125:10 | a | test.swift:117:18:117:33 | CallExpr | test.swift:125:10:125:10 | a | $@ | test.swift:117:18:117:33 | CallExpr | CallExpr | -| test.swift:126:10:126:10 | b | test.swift:117:35:117:49 | CallExpr | test.swift:126:10:126:10 | b | $@ | test.swift:117:35:117:49 | CallExpr | CallExpr | -| test.swift:132:10:132:10 | a | test.swift:131:19:131:33 | CallExpr | test.swift:132:10:132:10 | a | $@ | test.swift:131:19:131:33 | CallExpr | CallExpr | -| test.swift:138:10:138:10 | a | test.swift:137:10:137:24 | CallExpr | test.swift:138:10:138:10 | a | $@ | test.swift:137:10:137:24 | CallExpr | CallExpr | -| test.swift:144:10:144:10 | a | test.swift:143:20:143:34 | CallExpr | test.swift:144:10:144:10 | a | $@ | test.swift:143:20:143:34 | CallExpr | CallExpr | -| test.swift:150:10:150:12 | MemberAccessExpr | test.swift:149:23:149:37 | CallExpr | test.swift:150:10:150:12 | MemberAccessExpr | $@ | test.swift:149:23:149:37 | CallExpr | CallExpr | -| test.swift:157:10:157:12 | MemberAccessExpr | test.swift:156:29:156:43 | CallExpr | test.swift:157:10:157:12 | MemberAccessExpr | $@ | test.swift:156:29:156:43 | CallExpr | CallExpr | -| test.swift:165:10:165:10 | a | test.swift:164:25:164:39 | CallExpr | test.swift:165:10:165:10 | a | $@ | test.swift:164:25:164:39 | CallExpr | CallExpr | -| test.swift:166:10:166:10 | b | test.swift:164:52:164:66 | CallExpr | test.swift:166:10:166:10 | b | $@ | test.swift:164:52:164:66 | CallExpr | CallExpr | +| implicit-self.swift:12:14:12:19 | ... .x | implicit-self.swift:11:18:11:31 | source(...) | implicit-self.swift:12:14:12:19 | ... .x | $@ | implicit-self.swift:11:18:11:31 | source(...) | source(...) | +| implicit-self.swift:18:14:18:14 | x | implicit-self.swift:17:13:17:26 | source(...) | implicit-self.swift:18:14:18:14 | x | $@ | implicit-self.swift:17:13:17:26 | source(...) | source(...) | +| implicit-self.swift:24:14:24:19 | ... .x | implicit-self.swift:23:13:23:26 | source(...) | implicit-self.swift:24:14:24:19 | ... .x | $@ | implicit-self.swift:23:13:23:26 | source(...) | source(...) | +| implicit-self.swift:30:14:30:14 | x | implicit-self.swift:29:18:29:31 | source(...) | implicit-self.swift:30:14:30:14 | x | $@ | implicit-self.swift:29:18:29:31 | source(...) | source(...) | +| implicit-self.swift:36:14:36:23 | ... .x | implicit-self.swift:35:22:35:35 | source(...) | implicit-self.swift:36:14:36:23 | ... .x | $@ | implicit-self.swift:35:22:35:35 | source(...) | source(...) | +| implicit-self.swift:42:14:42:18 | ... .x | implicit-self.swift:41:17:41:30 | source(...) | implicit-self.swift:42:14:42:18 | ... .x | $@ | implicit-self.swift:41:17:41:30 | source(...) | source(...) | +| implicit-self.swift:48:14:48:23 | ... .x | implicit-self.swift:47:17:47:30 | source(...) | implicit-self.swift:48:14:48:23 | ... .x | $@ | implicit-self.swift:47:17:47:30 | source(...) | source(...) | +| implicit-self.swift:54:14:54:18 | ... .x | implicit-self.swift:53:22:53:35 | source(...) | implicit-self.swift:54:14:54:18 | ... .x | $@ | implicit-self.swift:53:22:53:35 | source(...) | source(...) | +| implicit-self.swift:60:14:60:14 | x | implicit-self.swift:59:24:59:37 | source(...) | implicit-self.swift:60:14:60:14 | x | $@ | implicit-self.swift:59:24:59:37 | source(...) | source(...) | +| implicit-self.swift:61:14:61:19 | ... .x | implicit-self.swift:59:24:59:37 | source(...) | implicit-self.swift:61:14:61:19 | ... .x | $@ | implicit-self.swift:59:24:59:37 | source(...) | source(...) | +| implicit-self.swift:67:14:67:14 | x | implicit-self.swift:66:29:66:43 | source(...) | implicit-self.swift:67:14:67:14 | x | $@ | implicit-self.swift:66:29:66:43 | source(...) | source(...) | +| implicit-self.swift:68:14:68:19 | ... .x | implicit-self.swift:66:29:66:43 | source(...) | implicit-self.swift:68:14:68:19 | ... .x | $@ | implicit-self.swift:66:29:66:43 | source(...) | source(...) | +| implicit-self.swift:74:14:74:14 | x | implicit-self.swift:73:24:73:38 | source(...) | implicit-self.swift:74:14:74:14 | x | $@ | implicit-self.swift:73:24:73:38 | source(...) | source(...) | +| implicit-self.swift:75:14:75:19 | ... .x | implicit-self.swift:73:24:73:38 | source(...) | implicit-self.swift:75:14:75:19 | ... .x | $@ | implicit-self.swift:73:24:73:38 | source(...) | source(...) | +| implicit-self.swift:81:14:81:14 | x | implicit-self.swift:80:29:80:43 | source(...) | implicit-self.swift:81:14:81:14 | x | $@ | implicit-self.swift:80:29:80:43 | source(...) | source(...) | +| implicit-self.swift:82:14:82:19 | ... .x | implicit-self.swift:80:29:80:43 | source(...) | implicit-self.swift:82:14:82:19 | ... .x | $@ | implicit-self.swift:80:29:80:43 | source(...) | source(...) | +| test.swift:2:10:2:21 | source(...) | test.swift:2:10:2:21 | source(...) | test.swift:2:10:2:21 | source(...) | $@ | test.swift:2:10:2:21 | source(...) | source(...) | +| test.swift:6:10:6:32 | ... + ... | test.swift:6:10:6:23 | source(...) | test.swift:6:10:6:32 | ... + ... | $@ | test.swift:6:10:6:23 | source(...) | source(...) | +| test.swift:7:10:7:32 | ... + ... | test.swift:7:19:7:32 | source(...) | test.swift:7:10:7:32 | ... + ... | $@ | test.swift:7:19:7:32 | source(...) | source(...) | +| test.swift:9:10:9:33 | StringInterpolationExpr | test.swift:9:13:9:26 | source(...) | test.swift:9:10:9:33 | StringInterpolationExpr | $@ | test.swift:9:13:9:26 | source(...) | source(...) | +| test.swift:10:10:10:33 | StringInterpolationExpr | test.swift:10:18:10:31 | source(...) | test.swift:10:10:10:33 | StringInterpolationExpr | $@ | test.swift:10:18:10:31 | source(...) | source(...) | +| test.swift:11:10:11:38 | StringInterpolationExpr | test.swift:11:18:11:31 | source(...) | test.swift:11:10:11:38 | StringInterpolationExpr | $@ | test.swift:11:18:11:31 | source(...) | source(...) | +| test.swift:16:10:16:35 | ... .0 | test.swift:16:11:16:25 | source(...) | test.swift:16:10:16:35 | ... .0 | $@ | test.swift:16:11:16:25 | source(...) | source(...) | +| test.swift:19:10:19:35 | ... .1 | test.swift:19:19:19:32 | source(...) | test.swift:19:10:19:35 | ... .1 | $@ | test.swift:19:19:19:32 | source(...) | source(...) | +| test.swift:24:10:24:10 | a | test.swift:23:13:23:26 | source(...) | test.swift:24:10:24:10 | a | $@ | test.swift:23:13:23:26 | source(...) | source(...) | +| test.swift:29:10:29:10 | a | test.swift:28:19:28:33 | source(...) | test.swift:29:10:29:10 | a | $@ | test.swift:28:19:28:33 | source(...) | source(...) | +| test.swift:34:10:34:10 | d | test.swift:32:27:32:40 | source(...) | test.swift:34:10:34:10 | d | $@ | test.swift:32:27:32:40 | source(...) | source(...) | +| test.swift:39:10:39:10 | a | test.swift:38:13:38:26 | source(...) | test.swift:39:10:39:10 | a | $@ | test.swift:38:13:38:26 | source(...) | source(...) | +| test.swift:47:10:47:16 | ... .0 | test.swift:46:15:46:28 | source(...) | test.swift:47:10:47:16 | ... .0 | $@ | test.swift:46:15:46:28 | source(...) | source(...) | +| test.swift:58:10:58:23 | ... .0 | test.swift:53:22:53:35 | source(...) | test.swift:58:10:58:23 | ... .0 | $@ | test.swift:53:22:53:35 | source(...) | source(...) | +| test.swift:66:10:66:16 | ... .1 | test.swift:64:21:64:35 | source(...) | test.swift:66:10:66:16 | ... .1 | $@ | test.swift:64:21:64:35 | source(...) | source(...) | +| test.swift:75:10:75:16 | ... .0 | test.swift:74:15:74:29 | source(...) | test.swift:75:10:75:16 | ... .0 | $@ | test.swift:74:15:74:29 | source(...) | source(...) | +| test.swift:90:10:90:10 | x | test.swift:86:13:86:27 | source(...) | test.swift:90:10:90:10 | x | $@ | test.swift:86:13:86:27 | source(...) | source(...) | +| test.swift:96:10:96:10 | y | test.swift:94:13:94:27 | source(...) | test.swift:96:10:96:10 | y | $@ | test.swift:94:13:94:27 | source(...) | source(...) | +| test.swift:99:14:99:14 | x | test.swift:86:13:86:27 | source(...) | test.swift:99:14:99:14 | x | $@ | test.swift:86:13:86:27 | source(...) | source(...) | +| test.swift:100:14:100:14 | y | test.swift:94:13:94:27 | source(...) | test.swift:100:14:100:14 | y | $@ | test.swift:94:13:94:27 | source(...) | source(...) | +| test.swift:112:10:112:16 | ... .0 | test.swift:107:19:107:33 | source(...) | test.swift:112:10:112:16 | ... .0 | $@ | test.swift:107:19:107:33 | source(...) | source(...) | +| test.swift:125:10:125:10 | a | test.swift:117:18:117:33 | source(...) | test.swift:125:10:125:10 | a | $@ | test.swift:117:18:117:33 | source(...) | source(...) | +| test.swift:126:10:126:10 | b | test.swift:117:35:117:49 | source(...) | test.swift:126:10:126:10 | b | $@ | test.swift:117:35:117:49 | source(...) | source(...) | +| test.swift:132:10:132:10 | a | test.swift:131:19:131:33 | source(...) | test.swift:132:10:132:10 | a | $@ | test.swift:131:19:131:33 | source(...) | source(...) | +| test.swift:138:10:138:10 | a | test.swift:137:10:137:24 | source(...) | test.swift:138:10:138:10 | a | $@ | test.swift:137:10:137:24 | source(...) | source(...) | +| test.swift:144:10:144:10 | a | test.swift:143:20:143:34 | source(...) | test.swift:144:10:144:10 | a | $@ | test.swift:143:20:143:34 | source(...) | source(...) | +| test.swift:150:10:150:12 | ... .0 | test.swift:149:23:149:37 | source(...) | test.swift:150:10:150:12 | ... .0 | $@ | test.swift:149:23:149:37 | source(...) | source(...) | +| test.swift:157:10:157:12 | ... .0 | test.swift:156:29:156:43 | source(...) | test.swift:157:10:157:12 | ... .0 | $@ | test.swift:156:29:156:43 | source(...) | source(...) | +| test.swift:165:10:165:10 | a | test.swift:164:25:164:39 | source(...) | test.swift:165:10:165:10 | a | $@ | test.swift:164:25:164:39 | source(...) | source(...) | +| test.swift:166:10:166:10 | b | test.swift:164:52:164:66 | source(...) | test.swift:166:10:166:10 | b | $@ | test.swift:164:52:164:66 | source(...) | source(...) | From 404d23fddbe4aef0cb4c41ee01abe7d2f28beecd Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Fri, 18 Sep 2026 11:24:44 +0200 Subject: [PATCH 1123/2098] Unified: Include short-circuiting compound assignments. --- unified/ql/lib/codeql/unified/internal/AstExtra.qll | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/AstExtra.qll b/unified/ql/lib/codeql/unified/internal/AstExtra.qll index 486fb16ad3e5..d08601d8e792 100644 --- a/unified/ql/lib/codeql/unified/internal/AstExtra.qll +++ b/unified/ql/lib/codeql/unified/internal/AstExtra.qll @@ -7,7 +7,7 @@ private import codeql.unified.internal.NameBindingPlugin module Public { /** An assignment, possibly a compound assignment. */ - abstract class AssignmentImpl extends BinaryExpr { + abstract private class AssignmentImpl extends BinaryExpr { /** Gets the target of this assignment. */ abstract Expr getTarget(); @@ -30,7 +30,10 @@ module Public { final class CompoundAssignExpr extends BinaryExpr, AssignmentImpl { CompoundAssignExpr() { this.getOperator().getValue() = - ["+=", "-=", "*=", "/=", "%=", "<<=", ">>=", "&=", "|=", "^=", "&+=", "&-=", "&*="] + [ + "+=", "-=", "*=", "/=", "%=", "<<=", ">>=", "&=", "|=", "^=", "&+=", "&-=", "&*=", "&&=", + "||=", "??=" + ] } override Expr getTarget() { result = this.getLeft() } From 3fedfbb5fb8df33cd5affe6fbc651e6155eb650b Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Fri, 18 Sep 2026 12:05:44 +0200 Subject: [PATCH 1124/2098] Revert "UnboundList: More compact string representation" --- shared/util/codeql/util/UnboundList.qll | 47 +++---------------------- 1 file changed, 5 insertions(+), 42 deletions(-) diff --git a/shared/util/codeql/util/UnboundList.qll b/shared/util/codeql/util/UnboundList.qll index a08f76f9c362..622895a6bd01 100644 --- a/shared/util/codeql/util/UnboundList.qll +++ b/shared/util/codeql/util/UnboundList.qll @@ -10,7 +10,6 @@ overlay[local?] module; private import Location -private import Strings /** Provides the input to `Make`. */ signature module InputSig { @@ -53,43 +52,7 @@ module Make Input> { /** Gets the rank of element `e`, which is used internally in the string encoding. */ int getRank(Element e) { e = DenseRank::denseRank(result) } - /** Gets the ASCII printable excluding `.` with zero-based index `code`. */ - pragma[nomagic] - private string interpretAsciiCode(int code) { - exists(int dot, int c | - c = code + 1 and - // `.` is used as element separator, so cannot be used to encode elements - dot = asciiPrintable(".") and - if c < dot then c = asciiPrintable(result) else c + 1 = asciiPrintable(result) - ) - } - - private int asciiCodes() { result = strictcount(interpretAsciiCode(_)) } - - /** - * Gets the `i`th digit (modulo `asciiCodes()`) in a base-`asciiCodes()` integer - * representation of `getRank(e)`. - */ - private int getAsciiCodePart(Element e, int i) { - result = getRank(e) and - i = 0 - or - exists(int mid | - mid = getAsciiCodePart(e, i - 1) and - result = mid / asciiCodes() and - result > 0 - ) - } - - pragma[nomagic] - private string encode(Element e) { - result = - strictconcat(string s, int i | - s = interpretAsciiCode(getAsciiCodePart(e, i) % asciiCodes()) - | - s order by i - ) - } + private string encode(Element e) { result = getRank(e).toString() } bindingset[s] private Element decode(string s) { encode(result) = s } @@ -125,7 +88,7 @@ module Make Input> { // Same as // `result = count(this.indexOf("."))` // but performs better because it doesn't use an aggregate - result = this.regexpReplaceAll("[^\\.]+", "").length() + result = this.regexpReplaceAll("[0-9]+", "").length() } /** Gets the list obtained by appending `suffix` onto this list. */ @@ -160,7 +123,7 @@ module Make Input> { // `regexpCapture` will then always join in both groups, only to afterwards filter // based on the requested group (the group number is not part of the binding set // of `regexpCapture`) - elem = this.regexpCapture("^([^\\.]+)\\..*$", 1) and + elem = this.regexpCapture("^([0-9]+)\\..*$", 1) and e = decode(elem) and suffix = this.suffix(elem.length() + 1) ) @@ -170,7 +133,7 @@ module Make Input> { bindingset[this] predicate isSnoc(UnboundList prefix, Element e) { // same remark as above about not using multiple capture groups - prefix = this.regexpCapture("^(|.+\\.)[^\\.]+\\.$", 1) and + prefix = this.regexpCapture("^(|.+\\.)[0-9]+\\.$", 1) and e = decode(this.substring(prefix.stringLength(), this.stringLength() - 1)) } @@ -185,7 +148,7 @@ module Make Input> { */ bindingset[this] UnboundList getProperPrefix(int i) { - exists(string regexp, int occurrenceOffset | regexp = "[^\\.]+\\." | + exists(string regexp, int occurrenceOffset | regexp = "[0-9]+\\." | exists(this.regexpFind(regexp, i, occurrenceOffset)) and result = this.prefix(occurrenceOffset) ) From bb6b2ce9b600937369cf534dd3dafa43aa66a5c7 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 18 Sep 2026 12:43:25 +0200 Subject: [PATCH 1125/2098] Update actions/ql/lib/codeql/actions/test/internal/InlineExpectationsTestImpl.qll Co-authored-by: Owen Mansel-Chan <62447351+owen-mc@users.noreply.github.com> --- .../codeql/actions/test/internal/InlineExpectationsTestImpl.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actions/ql/lib/codeql/actions/test/internal/InlineExpectationsTestImpl.qll b/actions/ql/lib/codeql/actions/test/internal/InlineExpectationsTestImpl.qll index 5498ff795eb5..4ca7b73a8dbf 100644 --- a/actions/ql/lib/codeql/actions/test/internal/InlineExpectationsTestImpl.qll +++ b/actions/ql/lib/codeql/actions/test/internal/InlineExpectationsTestImpl.qll @@ -6,7 +6,7 @@ module Impl implements InlineExpectationsTestSig { class ExpectationComment extends YamlNode { ExpectationComment() { this.toString().matches("%$ %") } - string getContents() { result = "$ " + this.toString().regexpCapture(".*\\$ (.*)", 1) } + string getContents() { result = this.toString().regexpCapture(".*(\\$ .*)", 1) } } class Location = L::Location; From 14f38e607ea396e7d32a86e37b6ddc2f3007a009 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 18 Sep 2026 12:51:14 +0200 Subject: [PATCH 1126/2098] Document Actions inline expectations test API Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../actions/test/internal/InlineExpectationsTestImpl.qll | 3 +++ 1 file changed, 3 insertions(+) diff --git a/actions/ql/lib/codeql/actions/test/internal/InlineExpectationsTestImpl.qll b/actions/ql/lib/codeql/actions/test/internal/InlineExpectationsTestImpl.qll index 4ca7b73a8dbf..5f4e834bc929 100644 --- a/actions/ql/lib/codeql/actions/test/internal/InlineExpectationsTestImpl.qll +++ b/actions/ql/lib/codeql/actions/test/internal/InlineExpectationsTestImpl.qll @@ -2,10 +2,13 @@ private import codeql.Locations as L private import codeql.actions.ast.internal.Yaml private import codeql.util.test.InlineExpectationsTest +/** Provides the Actions implementation of inline expectation parsing. */ module Impl implements InlineExpectationsTestSig { + /** A class representing YAML comments that may contain inline expectations. */ class ExpectationComment extends YamlNode { ExpectationComment() { this.toString().matches("%$ %") } + /** Gets the contents of this comment, starting at the inline expectation marker (`$`). */ string getContents() { result = this.toString().regexpCapture(".*(\\$ .*)", 1) } } From 870240f3d946d504aa46332616b9ea52876174c3 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Fri, 18 Sep 2026 13:03:46 +0200 Subject: [PATCH 1127/2098] Apply suggestion from @hvitved Co-authored-by: Tom Hvitved --- unified/ql/lib/codeql/unified/internal/FacadeAst.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll index 39641a63273a..2952765114ec 100644 --- a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll +++ b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll @@ -205,7 +205,7 @@ module Unified { exists(Expr callee | callee = this.getCallee() | result = callee.(Token).getValue() + "(...)" or - result = callee.(MemberAccessExpr).getMemberName() + "(...)" + result = "... ." + callee.(MemberAccessExpr).getMemberName() + "(...)" or not callee instanceof Token and not callee instanceof MemberAccessExpr and From ed5fa16b37fe32c0fa7f2c2b8a8baa595ba1e26e Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Fri, 18 Sep 2026 13:07:41 +0200 Subject: [PATCH 1128/2098] Unified: Update .expected --- .../controlflow/basicblock-slices.expected | 44 +++++++++---------- .../library-tests/controlflow/cfg.expected | 10 ++--- .../test/library-tests/controlflow/cfg.swift | 6 +-- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/unified/ql/test/library-tests/controlflow/basicblock-slices.expected b/unified/ql/test/library-tests/controlflow/basicblock-slices.expected index 96892bf91adf..97a1d1a279f0 100644 --- a/unified/ql/test/library-tests/controlflow/basicblock-slices.expected +++ b/unified/ql/test/library-tests/controlflow/basicblock-slices.expected @@ -19,7 +19,7 @@ | 21 | cfg.swift:21:11:21:17 | MyError | 'MyError -^ ... .error1 -^ ThrowExpr' | | 23 | cfg.swift:23:3:25:3 | GuardIfStmt | 'GuardIfStmt -V x -> 0 -^ ... <= ...' | | 23 | cfg.swift:23:21:25:3 | Block | 'Block' | -| 24 | cfg.swift:24:11:24:17 | MyError | 'MyError -^ ... .error3 -> Argument -V x -> 1 -^ ... + ... -^ error3(...) -^ ThrowExpr' | +| 24 | cfg.swift:24:11:24:17 | MyError | 'MyError -^ ... .error3 -> Argument -V x -> 1 -^ ... + ... -^ ... .error3(...) -^ ThrowExpr' | | 28 | cfg.swift:28:1:45:1 | FunctionDeclaration | 'FunctionDeclaration' | | 28 | cfg.swift:28:15:28:15 | x | 'x -^ Block' | | 29 | cfg.swift:29:3:43:3 | TryExpr | 'TryExpr -V Block' | @@ -31,7 +31,7 @@ | 35 | cfg.swift:35:5:37:3 | CatchClause | 'CatchClause -V MyError -^ ... .error1 -> isZero -> Argument -V x -^ isZero(...) -? MyError -^ ... .error2 -^ ConditionalPattern -^ OrPattern' | | 35 | cfg.swift:35:62:37:3 | Block | 'Block' | | 36 | cfg.swift:36:12:36:12 | 0 | '0 -^ ReturnExpr' | -| 37 | cfg.swift:37:5:39:3 | CatchClause | 'CatchClause -V MyError -^ ... .error3 -> Argument -V withParam -^ ExprPattern -^ error3(...)' | +| 37 | cfg.swift:37:5:39:3 | CatchClause | 'CatchClause -V MyError -^ ... .error3 -> Argument -V withParam -^ ExprPattern -^ ... .error3(...)' | | 37 | cfg.swift:37:41:39:3 | Block | 'Block' | | 38 | cfg.swift:38:12:38:20 | withParam | 'withParam -^ ReturnExpr' | | 39 | cfg.swift:39:5:41:3 | CatchClause | 'CatchClause -V ' | @@ -97,24 +97,24 @@ | 112 | cfg.swift:112:3:112:18 | VariableDeclaration | 'VariableDeclaration -V c -> C -> Argument -V 42 -^ C(...)' | | 113 | cfg.swift:113:3:113:18 | VariableDeclaration | 'VariableDeclaration -V n1 -> c -^ ... .myInt' | | 114 | cfg.swift:114:3:114:23 | VariableDeclaration | 'VariableDeclaration -V n2 -> c -^ ... .self -^ ... .myInt' | -| 115 | cfg.swift:115:3:115:23 | VariableDeclaration | 'VariableDeclaration -V n3 -> c -^ ... .getMyInt -^ getMyInt(...)' | -| 116 | cfg.swift:116:3:116:28 | VariableDeclaration | 'VariableDeclaration -V n4 -> c -^ ... .self -^ ... .getMyInt -^ getMyInt(...)' | +| 115 | cfg.swift:115:3:115:23 | VariableDeclaration | 'VariableDeclaration -V n3 -> c -^ ... .getMyInt -^ ... .getMyInt(...)' | +| 116 | cfg.swift:116:3:116:28 | VariableDeclaration | 'VariableDeclaration -V n4 -> c -^ ... .self -^ ... .getMyInt -^ ... .getMyInt(...)' | | 117 | cfg.swift:117:3:117:22 | VariableDeclaration | 'VariableDeclaration -V n5 -> param -^ ... .myInt' | | 118 | cfg.swift:118:3:118:27 | VariableDeclaration | 'VariableDeclaration -V n6 -> param -^ ... .self -^ ... .myInt' | -| 120 | cfg.swift:120:3:120:32 | VariableDeclaration | 'VariableDeclaration -V n8 -> param -^ ... .self -^ ... .getMyInt -^ getMyInt(...)' | +| 120 | cfg.swift:120:3:120:32 | VariableDeclaration | 'VariableDeclaration -V n8 -> param -^ ... .self -^ ... .getMyInt -^ ... .getMyInt(...)' | | 122 | cfg.swift:122:3:122:27 | VariableDeclaration | 'VariableDeclaration -V n9 -> inoutParam -^ ... .myInt' | -| 123 | cfg.swift:123:3:123:27 | VariableDeclaration | 'VariableDeclaration -V n7 -> param -^ ... .getMyInt -^ getMyInt(...)' | +| 123 | cfg.swift:123:3:123:27 | VariableDeclaration | 'VariableDeclaration -V n7 -> param -^ ... .getMyInt -^ ... .getMyInt(...)' | | 124 | cfg.swift:124:3:124:33 | VariableDeclaration | 'VariableDeclaration -V n10 -> inoutParam -^ ... .self -^ ... .myInt' | -| 125 | cfg.swift:125:3:125:33 | VariableDeclaration | 'VariableDeclaration -V n11 -> inoutParam -^ ... .getMyInt -^ getMyInt(...)' | -| 126 | cfg.swift:126:3:126:38 | VariableDeclaration | 'VariableDeclaration -V n12 -> inoutParam -^ ... .self -^ ... .getMyInt -^ getMyInt(...)' | +| 125 | cfg.swift:125:3:125:33 | VariableDeclaration | 'VariableDeclaration -V n11 -> inoutParam -^ ... .getMyInt -^ ... .getMyInt(...)' | +| 126 | cfg.swift:126:3:126:38 | VariableDeclaration | 'VariableDeclaration -V n12 -> inoutParam -^ ... .self -^ ... .getMyInt -^ ... .getMyInt(...)' | | 128 | cfg.swift:128:3:128:22 | VariableDeclaration | 'VariableDeclaration -V n13 -> opt -^ ... ! -^ ... .myInt' | | 129 | cfg.swift:129:3:129:27 | VariableDeclaration | 'VariableDeclaration -V n14 -> opt -^ ... ! -^ ... .self -^ ... .myInt' | -| 130 | cfg.swift:130:3:130:27 | VariableDeclaration | 'VariableDeclaration -V n15 -> opt -^ ... ! -^ ... .getMyInt -^ getMyInt(...)' | -| 131 | cfg.swift:131:3:131:32 | VariableDeclaration | 'VariableDeclaration -V n16 -> opt -^ ... ! -^ ... .self -^ ... .getMyInt -^ getMyInt(...)' | +| 130 | cfg.swift:130:3:130:27 | VariableDeclaration | 'VariableDeclaration -V n15 -> opt -^ ... ! -^ ... .getMyInt -^ ... .getMyInt(...)' | +| 131 | cfg.swift:131:3:131:32 | VariableDeclaration | 'VariableDeclaration -V n16 -> opt -^ ... ! -^ ... .self -^ ... .getMyInt -^ ... .getMyInt(...)' | | 133 | cfg.swift:133:3:133:22 | VariableDeclaration | 'VariableDeclaration -V n17 -> opt -^ ... .myInt' | | 134 | cfg.swift:134:3:134:27 | VariableDeclaration | 'VariableDeclaration -V n18 -> opt -^ ... .self -^ ... .myInt' | -| 135 | cfg.swift:135:3:135:27 | VariableDeclaration | 'VariableDeclaration -V n19 -> opt -^ ... .getMyInt -^ getMyInt(...)' | -| 136 | cfg.swift:136:3:136:32 | VariableDeclaration | 'VariableDeclaration -V n20 -> opt -^ ... .self -^ ... .getMyInt -^ getMyInt(...)' | +| 135 | cfg.swift:135:3:135:27 | VariableDeclaration | 'VariableDeclaration -V n19 -> opt -^ ... .getMyInt -^ ... .getMyInt(...)' | +| 136 | cfg.swift:136:3:136:32 | VariableDeclaration | 'VariableDeclaration -V n20 -> opt -^ ... .self -^ ... .getMyInt -^ ... .getMyInt(...)' | | 139 | cfg.swift:139:1:166:1 | FunctionDeclaration | 'FunctionDeclaration' | | 139 | cfg.swift:139:15:139:15 | x | 'x -^ Block' | | 140 | cfg.swift:140:3:141:12 | ForEachStmt | 'ForEachStmt -V 0 -> 10 -^ ... ... ...' | @@ -311,7 +311,7 @@ | 372 | cfg.swift:372:12:372:12 | c | 'c -^ ReturnExpr' | | 376 | cfg.swift:376:1:378:1 | FunctionDeclaration | 'FunctionDeclaration' | | 376 | cfg.swift:376:19:376:19 | c | 'c -^ Block' | -| 377 | cfg.swift:377:10:377:10 | c | 'c -^ ... .getOptional -^ getOptional(...) -^ ... .getMyInt -^ getMyInt(...) -^ ReturnExpr' | +| 377 | cfg.swift:377:10:377:10 | c | 'c -^ ... .getOptional -^ ... .getOptional(...) -^ ... .getMyInt -^ ... .getMyInt(...) -^ ReturnExpr' | | 380 | cfg.swift:380:1:384:1 | FunctionDeclaration | 'FunctionDeclaration' | | 380 | cfg.swift:380:18:380:18 | x | 'x -> y -^ Block' | | 381 | cfg.swift:381:10:383:3 | Block | 'Block' | @@ -323,7 +323,7 @@ | 390 | cfg.swift:390:1:394:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V Derived -^ BaseType -V C' | | 391 | cfg.swift:391:3:393:3 | Block | 'Block' | | 391 | cfg.swift:391:3:393:3 | ConstructorDeclaration | 'ConstructorDeclaration' | -| 392 | cfg.swift:392:5:392:9 | | ' -^ ... .init -> Argument -V 0 -^ init(...)' | +| 392 | cfg.swift:392:5:392:9 | | ' -^ ... .init -> Argument -V 0 -^ ... .init(...)' | | 396 | cfg.swift:396:1:404:1 | FunctionDeclaration | 'FunctionDeclaration' | | 396 | cfg.swift:396:21:396:21 | x | 'x -^ Block' | | 397 | cfg.swift:397:3:402:3 | TryExpr | 'TryExpr -V Block' | @@ -407,15 +407,15 @@ | 521 | cfg.swift:521:10:521:10 | x | 'x -^ ReturnExpr' | | 524 | cfg.swift:524:1:538:1 | Block | 'Block' | | 524 | cfg.swift:524:1:538:1 | FunctionDeclaration | 'FunctionDeclaration' | -| 525 | cfg.swift:525:5:533:6 | VariableDeclaration | 'VariableDeclaration -V stream -> AsyncStream -> Argument -V Int -^ ... .self -> Argument -V . -^ ... .bufferingNewest -> Argument -V 5 -^ bufferingNewest(...) -> Argument -V FunctionExpr -^ AsyncStream(...)' | +| 525 | cfg.swift:525:5:533:6 | VariableDeclaration | 'VariableDeclaration -V stream -> AsyncStream -> Argument -V Int -^ ... .self -> Argument -V . -^ ... .bufferingNewest -> Argument -V 5 -^ ... .bufferingNewest(...) -> Argument -V FunctionExpr -^ AsyncStream(...)' | | 525 | cfg.swift:525:78:533:5 | Block | 'Block' | | 526 | cfg.swift:526:9:526:20 | continuation | 'continuation' | -| 527 | cfg.swift:527:13:527:16 | Task | 'Task -^ ... .detached -^ Argument -V FunctionExpr -^ detached(...)' | +| 527 | cfg.swift:527:13:527:16 | Task | 'Task -^ ... .detached -^ Argument -V FunctionExpr -^ ... .detached(...)' | | 527 | cfg.swift:527:27:532:13 | Block | 'Block' | | 528 | cfg.swift:528:17:530:17 | ForEachStmt | 'ForEachStmt -V 1 -> 100 -^ ... ... ...' | | 528 | cfg.swift:528:21:528:21 | i | 'i -> Block' | -| 529 | cfg.swift:529:21:529:32 | continuation | 'continuation -^ ... .yield -> Argument -V i -^ yield(...)' | -| 531 | cfg.swift:531:17:531:28 | continuation | 'continuation -^ ... .finish -^ finish(...)' | +| 529 | cfg.swift:529:21:529:32 | continuation | 'continuation -^ ... .yield -> Argument -V i -^ ... .yield(...)' | +| 531 | cfg.swift:531:17:531:28 | continuation | 'continuation -^ ... .finish -^ ... .finish(...)' | | 535 | cfg.swift:535:5:537:5 | ForEachStmt | 'ForEachStmt -V stream' | | 535 | cfg.swift:535:19:535:19 | i | 'i -> Block' | | 536 | cfg.swift:536:9:536:13 | print | 'print -> Argument -V i -^ print(...)' | @@ -452,10 +452,10 @@ | 576 | cfg.swift:576:11:576:13 | arg | 'arg -^ Block' | | 578 | cfg.swift:578:1:583:1 | FunctionDeclaration | 'FunctionDeclaration' | | 578 | cfg.swift:578:30:578:30 | x | 'x -> y -^ Block' | -| 579 | cfg.swift:579:2:579:5 | sink | 'sink -> Argument -V x -^ ... .source -^ source(...) -^ sink(...)' | -| 580 | cfg.swift:580:2:580:5 | sink | 'sink -> Argument -V y -^ ... .source -^ source(...) -^ sink(...)' | -| 581 | cfg.swift:581:2:581:5 | sink | 'sink -> Argument -V getMyProtocol -^ getMyProtocol(...) -^ ... .source -^ source(...) -^ sink(...)' | -| 582 | cfg.swift:582:2:582:5 | sink | 'sink -> Argument -V getMyProtocolImpl -^ getMyProtocolImpl(...) -^ ... .source -^ source(...) -^ sink(...)' | +| 579 | cfg.swift:579:2:579:5 | sink | 'sink -> Argument -V x -^ ... .source -^ ... .source(...) -^ sink(...)' | +| 580 | cfg.swift:580:2:580:5 | sink | 'sink -> Argument -V y -^ ... .source -^ ... .source(...) -^ sink(...)' | +| 581 | cfg.swift:581:2:581:5 | sink | 'sink -> Argument -V getMyProtocol -^ getMyProtocol(...) -^ ... .source -^ ... .source(...) -^ sink(...)' | +| 582 | cfg.swift:582:2:582:5 | sink | 'sink -> Argument -V getMyProtocolImpl -^ getMyProtocolImpl(...) -^ ... .source -^ ... .source(...) -^ sink(...)' | | 585 | cfg.swift:585:1:593:1 | FunctionDeclaration | 'FunctionDeclaration' | | 585 | cfg.swift:585:23:585:23 | x | 'x -^ Block' | | 586 | cfg.swift:586:3:589:3 | VariableDeclaration | 'VariableDeclaration -V a -> SwitchExpr -V x' | diff --git a/unified/ql/test/library-tests/controlflow/cfg.expected b/unified/ql/test/library-tests/controlflow/cfg.expected index 5bb55317b92b..fc1f15c91c5f 100644 --- a/unified/ql/test/library-tests/controlflow/cfg.expected +++ b/unified/ql/test/library-tests/controlflow/cfg.expected @@ -12,8 +12,8 @@ bbStep | cfg.swift:33:5:33:33 | print(...) | 'print(...) : successor -> 0(+11)' | | cfg.swift:35:5:35:5 | OrPattern | 'OrPattern : match -> Block(+0)' | | cfg.swift:35:5:35:5 | OrPattern | 'OrPattern : no-match -> CatchClause(+2)' | -| cfg.swift:37:11:37:39 | error3(...) | 'error3(...) : match -> Block(+0)' | -| cfg.swift:37:11:37:39 | error3(...) | 'error3(...) : no-match -> CatchClause(+2)' | +| cfg.swift:37:11:37:39 | ... .error3(...) | '... .error3(...) : match -> Block(+0)' | +| cfg.swift:37:11:37:39 | ... .error3(...) | '... .error3(...) : no-match -> CatchClause(+2)' | | cfg.swift:39:11:39:20 | | ' : match -> Block(+0)' | | cfg.swift:39:11:39:20 | | ' : no-match -> CatchClause(+2)' | | cfg.swift:40:5:40:20 | print(...) | 'print(...) : successor -> 0(+4)' | @@ -114,8 +114,8 @@ bbStep | cfg.swift:518:5:518:10 | ... += ... | '... += ... : successor -> x(+3)' | | cfg.swift:528:26:528:32 | ... ... ... | '... ... ... : empty -> continuation(+3)' | | cfg.swift:528:26:528:32 | ... ... ... | '... ... ... : non-empty -> i(+0)' | -| cfg.swift:529:21:529:41 | yield(...) | 'yield(...) : successor -> continuation(+2)' | -| cfg.swift:529:21:529:41 | yield(...) | 'yield(...) : successor -> i(-1)' | +| cfg.swift:529:21:529:41 | ... .yield(...) | '... .yield(...) : successor -> continuation(+2)' | +| cfg.swift:529:21:529:41 | ... .yield(...) | '... .yield(...) : successor -> i(-1)' | | cfg.swift:535:24:535:29 | stream | 'stream : non-empty -> i(+0)' | | cfg.swift:536:9:536:16 | print(...) | 'print(...) : successor -> i(-1)' | | cfg.swift:542:5:542:5 | x | 'x : non-null -> ReturnExpr(-1)' | @@ -162,5 +162,5 @@ nonSimple | cfg.swift:10:1:10:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V MyError -^ BaseType -V Error' | | cfg.swift:35:5:35:5 | CatchClause | 'CatchClause -V MyError -^ ... .error1 -> isZero -> Argument -V x -^ isZero(...) -? MyError -^ ... .error2 -^ ConditionalPattern -^ OrPattern' | | cfg.swift:390:1:390:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V Derived -^ BaseType -V C' | -| cfg.swift:527:13:527:16 | Task | 'Task -^ ... .detached -^ Argument -V FunctionExpr -^ detached(...)' | +| cfg.swift:527:13:527:16 | Task | 'Task -^ ... .detached -^ Argument -V FunctionExpr -^ ... .detached(...)' | | cfg.swift:569:1:569:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V MyProcotolImpl -^ BaseType -V MyProtocol' | diff --git a/unified/ql/test/library-tests/controlflow/cfg.swift b/unified/ql/test/library-tests/controlflow/cfg.swift index 2b352f4f7e1e..2061d46cd78a 100644 --- a/unified/ql/test/library-tests/controlflow/cfg.swift +++ b/unified/ql/test/library-tests/controlflow/cfg.swift @@ -34,7 +34,7 @@ func tryCatch(x : Int) -> Int { } catch MyError.error1 , MyError.error2 where isZero(x: x) { // $ bbStep='OrPattern : match -> Block(+0)' bbStep='OrPattern : no-match -> CatchClause(+2)' nonSimple='CatchClause -V MyError -^ ... .error1 -> isZero -> Argument -V x -^ isZero(...) -? MyError -^ ... .error2 -^ ConditionalPattern -^ OrPattern' return 0 - } catch MyError.error3(let withParam) { // $ bbStep='error3(...) : match -> Block(+0)' bbStep='error3(...) : no-match -> CatchClause(+2)' + } catch MyError.error3(let withParam) { // $ bbStep='... .error3(...) : match -> Block(+0)' bbStep='... .error3(...) : no-match -> CatchClause(+2)' return withParam } catch is MyError { // $ bbStep=' : match -> Block(+0)' bbStep=' : no-match -> CatchClause(+2)' print("MyError") // $ bbStep='print(...) : successor -> 0(+4)' @@ -524,9 +524,9 @@ func testAvailable() -> Int { // $ noCfg func testAsyncFor () async { // $ noCfg var stream = AsyncStream(Int.self, bufferingPolicy: .bufferingNewest(5), { // $ bbContinues='Block goto Task(+2)' continuation in // $ bbContinues='continuation goto Block(-1)' - Task.detached { // $ nonSimple='Task -^ ... .detached -^ Argument -V FunctionExpr -^ detached(...)' + Task.detached { // $ nonSimple='Task -^ ... .detached -^ Argument -V FunctionExpr -^ ... .detached(...)' for i in 1...100 { // $ bbStep='... ... ... : empty -> continuation(+3)' bbStep='... ... ... : non-empty -> i(+0)' - continuation.yield(i) // $ bbStep='yield(...) : successor -> continuation(+2)' bbStep='yield(...) : successor -> i(-1)' + continuation.yield(i) // $ bbStep='... .yield(...) : successor -> continuation(+2)' bbStep='... .yield(...) : successor -> i(-1)' } continuation.finish() } From 9d551ed83fc7ad0f020fca6d129ddfc465b8408b Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Fri, 18 Sep 2026 13:10:36 +0200 Subject: [PATCH 1129/2098] Rust: Remove test toolchain pin This has no effect now that the extractor always uses a fixed toolchain hardcoded into the extractor. --- rust/ql/test/rust-toolchain.toml | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 rust/ql/test/rust-toolchain.toml diff --git a/rust/ql/test/rust-toolchain.toml b/rust/ql/test/rust-toolchain.toml deleted file mode 100644 index a2094a1d6e14..000000000000 --- a/rust/ql/test/rust-toolchain.toml +++ /dev/null @@ -1,12 +0,0 @@ -# This file specifies the Rust version used to test the rust extractor. -# IMPORTANT: this can also have an impact on QL test results -# -# Pinned to 1.95: this is the newest stable that both expands the builtin -# `format_args!` macro against std (needs >= ~1.94) and still accepts -# `use SomeStruct::{self};`, which became a hard error (E0432) in 1.96 and is -# exercised by the path-resolution test. Do not bump past 1.95 without -# adapting that test. -[toolchain] -channel = "1.95.0" -profile = "minimal" -components = [ "rust-src" ] From d28b7aed2787e86a88255b430c479f1e3e0d3729 Mon Sep 17 00:00:00 2001 From: Taus Date: Fri, 11 Sep 2026 12:54:03 +0000 Subject: [PATCH 1130/2098] yeast: Get rid of shorthand form for rules In practice we were only using this in the tests, since most rules end up doing more complicated things than straight translations anyway. --- shared/yeast-macros/src/lib.rs | 2 - shared/yeast-macros/src/parse.rs | 72 ++------------------------ shared/yeast/doc/yeast.md | 15 +----- shared/yeast/tests/test.rs | 89 +++----------------------------- 4 files changed, 13 insertions(+), 165 deletions(-) diff --git a/shared/yeast-macros/src/lib.rs b/shared/yeast-macros/src/lib.rs index e9f7b46d0570..6793c48857c3 100644 --- a/shared/yeast-macros/src/lib.rs +++ b/shared/yeast-macros/src/lib.rs @@ -131,8 +131,6 @@ pub fn trees(input: TokenStream) -> TokenStream { /// (output_template) /// ) /// -/// // Shorthand: captures become fields on the output node -/// rule!((query ...) => output_kind) /// ``` /// /// Captures become Rust variables automatically: diff --git a/shared/yeast-macros/src/parse.rs b/shared/yeast-macros/src/parse.rs index 87fb5435bcd1..c81febe7a649 100644 --- a/shared/yeast-macros/src/parse.rs +++ b/shared/yeast-macros/src/parse.rs @@ -768,8 +768,7 @@ fn extract_captures_inner( /// ``` /// /// Template bodies (`=> (kind …)`) never carry an annotation — the -/// output kind is the template root. The shorthand `=> kind` (no -/// body) also carries no annotation. See `parse_rule_top` for dispatch. +/// output kind is the template root. #[derive(Clone, Debug)] struct ReturnAnnotation { kind: Ident, @@ -793,7 +792,6 @@ enum AnnotationMultiplicity { /// `kind {` → annotation (single) /// `kind? {` → annotation (optional) /// `kind* {` → annotation (repeated) -/// `kind` → shorthand form (no `{` follows) — NOT an annotation /// anything else → template or bare block — NOT an annotation fn try_consume_return_annotation(tokens: &mut Tokens) -> Result> { // Must start with an identifier (the kind name). @@ -881,15 +879,13 @@ pub fn parse_rule_top(input: TokenStream) -> Result { let raw_bindings = capture_bindings(raw_captures.into_iter()); let translated_bindings = capture_bindings(translated_captures.into_iter()); - // Parse transform: the token(s) after `=>` fall into one of three + // Parse transform: the token(s) after `=>` fall into one of two // shapes, dispatched in order: // // 1. `kind [? | *] { rust_body }` — annotated Rust body (NEW). // Static-analysis-ready: the annotation declares the output // kind and multiplicity in the schema's own vocabulary. - // 2. `kind` alone — shorthand: emit `(kind field: {@cap})…` from - // the query's captures. - // 3. anything else — full template form (`(kind …)` or bare + // 2. anything else — full template form (`(kind …)` or bare // `{ … }` splice via `parse_direct_list`). let annotation = try_consume_return_annotation(&mut tokens)?; @@ -926,65 +922,6 @@ pub fn parse_rule_top(input: TokenStream) -> Result { yeast::IntoFieldIds::extend_into(__value, &mut __ids); __ids } - } else if peek_is_field(&mut tokens) && { - // Shorthand form: bare identifier = output node kind. - // Auto-generate template from captures. - let mut lookahead = tokens.clone(); - lookahead.next(); // skip ident - lookahead.peek().is_none() // nothing after = shorthand - } { - let output_kind = expect_ident(&mut tokens, "expected output node kind")?; - let output_kind_str = output_kind.to_string(); - - // Generate field assignments from captures - let field_stmts: Vec = captures - .iter() - .map(|cap| { - let name = Ident::new(&cap.name, Span::call_site()); - let name_str = &cap.name; - match cap.multiplicity { - CaptureMultiplicity::Repeated => quote! { - let __field_id = #ctx_ident.ast.field_id_for_name(#name_str) - .unwrap_or_else(|| panic!("field '{}' not found", #name_str)); - __fields.insert( - __field_id, - #name.into_iter() - .map(::std::convert::Into::::into) - .collect(), - ); - }, - CaptureMultiplicity::Optional => quote! { - let __field_id = #ctx_ident.ast.field_id_for_name(#name_str) - .unwrap_or_else(|| panic!("field '{}' not found", #name_str)); - if let Some(__id) = #name { - __fields.entry(__field_id).or_insert_with(Vec::new) - .push(::std::convert::Into::::into(__id)); - } - }, - CaptureMultiplicity::Single => quote! { - let __field_id = #ctx_ident.ast.field_id_for_name(#name_str) - .unwrap_or_else(|| panic!("field '{}' not found", #name_str)); - __fields.entry(__field_id).or_insert_with(Vec::new) - .push(::std::convert::Into::::into(#name)); - }, - } - }) - .collect(); - - quote! { - let __kind = #ctx_ident.ast.id_for_node_kind(#output_kind_str) - .unwrap_or_else(|| panic!("node kind '{}' not found", #output_kind_str)); - let mut __fields = std::collections::BTreeMap::new(); - #(#field_stmts)* - let __id = #ctx_ident.ast.create_node_with_range( - __kind, - yeast::NodeContent::DynamicString(String::new()), - __fields, - true, - __source_range, - ); - vec![__id] - } } else { // Reject bare `{ ... }` transforms — they used to be accepted // as either a Rust body producing a `Vec` or a template @@ -1482,8 +1419,5 @@ mod rules_tests { // Match expressions inside a block: `=>` is inside braces. let toks = quote! { { match x { 1 => 2, _ => 3 } } }; assert!(!has_top_level_arrow(&toks)); - // Bare shorthand form: top-level `=>` followed by a bare ident. - let toks = quote! { (a) => kind }; - assert!(has_top_level_arrow(&toks)); } } diff --git a/shared/yeast/doc/yeast.md b/shared/yeast/doc/yeast.md index 3e3e1cd3610f..7e1678168d38 100644 --- a/shared/yeast/doc/yeast.md +++ b/shared/yeast/doc/yeast.md @@ -422,7 +422,7 @@ automatically: single captures bind as `Id`, repeated captures (after ## The `rule!` macro `rule!` combines a query and a transform into a single declaration. -There are three transform forms, each suited to a different level of +There are two transform forms, each suited to a different level of rule complexity: ```rust @@ -433,13 +433,7 @@ yeast::rule!( (output_template field: {capture}) ) -// 2. Shorthand form — captures become fields on a bare output kind. -yeast::rule!( - (query_pattern field: (_) @capture) - => output_kind -) - -// 3. Annotation form — a Rust block body preceded by the output kind. +// 2. Annotation form — a Rust block body preceded by the output kind. yeast::rule!( (query_pattern child: (_)+ @@children) => @@ -455,9 +449,6 @@ yeast::rule!( ) ``` -The shorthand `=> kind` form auto-generates the template, mapping each -capture name to a field of the same name on the output node. - ### Guards A rule may include a Rust guard between its query and `=>`. The guard runs @@ -537,8 +528,6 @@ having to inspect the block's expression. Prefer the simplest form that fits: - If the whole transform is a tree literal, use the **template form**. -- If the transform is a template whose root matches a query capture - 1:1, use the **shorthand form**. - If the transform needs Rust logic (loops, `let` bindings, calls to `ctx.translate`, etc.), use the **annotation form**. diff --git a/shared/yeast/tests/test.rs b/shared/yeast/tests/test.rs index 35393685b5ca..e0abe51053d9 100644 --- a/shared/yeast/tests/test.rs +++ b/shared/yeast/tests/test.rs @@ -896,28 +896,6 @@ fn test_desugar_for_loop() { ); } -#[test] -fn test_shorthand_rule() { - let rule: Rule = yeast::rule!( - (assignment - left: (_) @method - right: (_) @receiver - ) - => call - ); - - let dump = run_and_dump("x = 1", vec![rule]); - assert_dump_eq( - &dump, - r#" - program - call - method: identifier "x" - receiver: integer "1" - "#, - ); -} - #[derive(Clone, Default)] struct GuardTestContext { enabled: bool, @@ -1024,19 +1002,19 @@ fn test_chained_rules_output_only_kind() { // first_node → second_node (output-only → output-only) // The matcher must look up `first_node` against the schema, which only // knows about it via the YAML node-types file. - let assignment_to_first = yeast::rule!( + let assignment_to_first: Rule = yeast::rule!( (assignment left: (_) @left right: (_) @right ) - => first_node + => (first_node left: {left} right: {right}) ); - let first_to_second = yeast::rule!( + let first_to_second: Rule = yeast::rule!( (first_node left: (_) @left right: (_) @right ) - => second_node + => (second_node left: {left} right: {right}) ); let dump = run_and_dump("x = 1", vec![assignment_to_first, first_to_second]); @@ -1103,19 +1081,19 @@ fn test_phased_desugaring() { // Two phases that could equally have been a single one with chained // rules. Splitting them makes the intent (cleanup, then desugar) // explicit and provides per-phase error messages. - let cleanup = vec![yeast::rule!( + let cleanup: Vec = vec![yeast::rule!( (assignment left: (_) @left right: (_) @right ) - => first_node + => (first_node left: {left} right: {right}) )]; - let desugar = vec![yeast::rule!( + let desugar: Vec = vec![yeast::rule!( (first_node left: (_) @left right: (_) @right ) - => second_node + => (second_node left: {left} right: {right}) )]; let dump = run_phased_and_dump( @@ -1731,33 +1709,6 @@ fn test_rules_macro_accepts_bare_rule_body() { ); } -/// The bare-rule-body shorthand `=> output_kind` should also be accepted. -#[test] -fn test_rules_macro_accepts_bare_shorthand_form() { - let rules: Vec = yeast::rules! { - input: "tests/input-types.yml", - output: "tests/node-types.yml", - [ - (assignment - left: (_) @method - right: (_) @receiver - ) - => call, - ] - }; - - let dump = run_and_dump("x = 1", rules); - assert_dump_eq( - &dump, - r#" - program - call - method: identifier "x" - receiver: integer "1" - "#, - ); -} - #[test] fn test_rules_macro_accepts_bare_guarded_rule() { let rules: Vec = yeast::rules! { @@ -1926,27 +1877,3 @@ fn test_rule_annotation_single() { } assert!(has_assignment, "expected an assignment node"); } - -/// The shorthand `=> kind` form (no body, no annotation) must still be -/// distinguished from the annotation form and continue to work. -#[test] -fn test_shorthand_still_works_alongside_annotation_syntax() { - let r: Rule = rule!( - (assignment left: (_) @method right: (_) @receiver) - => - call - ); - let ast = run_and_ast("x = 1", vec![r]); - let mut has_call = false; - for id in ast.reachable_node_ids() { - if let Some(n) = ast.get_node(id) { - if n.kind_name() == "call" { - has_call = true; - } - } - } - assert!( - has_call, - "shorthand form should still produce a `call` node" - ); -} From aab5d0085d852b8e7f7332b1a5b2b608326b7779 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Fri, 18 Sep 2026 13:54:40 +0200 Subject: [PATCH 1131/2098] Unified: Expose Ast in the CFG. --- unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll | 5 ++--- unified/ql/lib/ide-contextual-queries/printCfg.ql | 3 ++- unified/ql/lib/unified.qll | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll index e6dbd052c5b0..a01b95244c39 100644 --- a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll @@ -17,11 +17,10 @@ private module Cfg2 = Make2; private import Cfg0 private import Cfg1 -private import Cfg2 -import Public +import Cfg2 /** Provides an implementation of the AST signature for Unified. */ -private module Ast implements AstSig { +module Ast implements AstSig { private import unified as U class AstNode = U::AstNode; diff --git a/unified/ql/lib/ide-contextual-queries/printCfg.ql b/unified/ql/lib/ide-contextual-queries/printCfg.ql index f183c5c63cc9..aab7918d487e 100644 --- a/unified/ql/lib/ide-contextual-queries/printCfg.ql +++ b/unified/ql/lib/ide-contextual-queries/printCfg.ql @@ -8,6 +8,7 @@ */ private import unified +private import codeql.unified.internal.ControlFlowGraph private import codeql.Locations external string selectedSourceFile(); @@ -30,7 +31,7 @@ module ViewCfgQueryInput implements ControlFlow::ViewCfgQueryInputSig { predicate selectedSourceColumn = selectedSourceColumnAlias/0; predicate cfgScopeSpan( - Callable scope, File file, int startLine, int startColumn, int endLine, int endColumn + Ast::Callable scope, File file, int startLine, int startColumn, int endLine, int endColumn ) { file = scope.getFile() and scope.getLocation().hasLocationInfo(_, startLine, startColumn, endLine, endColumn) diff --git a/unified/ql/lib/unified.qll b/unified/ql/lib/unified.qll index 9729b6445812..b8dd4e9949fc 100644 --- a/unified/ql/lib/unified.qll +++ b/unified/ql/lib/unified.qll @@ -6,6 +6,6 @@ import codeql.Locations import codeql.files.FileSystem import codeql.unified.internal.Ast::UnifiedFinal import codeql.unified.internal.AstExtra::Public -import codeql.unified.internal.ControlFlowGraph +import codeql.unified.internal.ControlFlowGraph::Public import codeql.unified.internal.NameBinding::Public import codeql.unified.internal.dataflow.DataFlowPublic From 5224a052c40a1778b64be1aa7ebb6a5c761e7605 Mon Sep 17 00:00:00 2001 From: Taus Date: Fri, 18 Sep 2026 11:00:22 +0000 Subject: [PATCH 1132/2098] yeast: Add source skeletons to AST dumps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit With this change, output AST nodes (with locations that span part of the source code) now get an additional `source=...` annotation that compactly expresses how much of the source code is included in the location. For example, a variable declaration might look like this: ``` variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" ``` Here, the bits inside Unicode angle brackets correspond to sub-ranges of the input that are owned by direct children of the node in question. The string inside the brackets gives the name of the corresponding field. (I chose Unicode angle brackets because they are unlikely to occur naturally in source code.) This provides us with (hopefully) an intuitive and compact way of representing locations, without needing to list particular row and column offsets (which are impossible to inspect manually anyway). --- shared/yeast/doc/yeast.md | 11 ++ shared/yeast/src/dump.rs | 252 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 263 insertions(+) diff --git a/shared/yeast/doc/yeast.md b/shared/yeast/doc/yeast.md index 3e3e1cd3610f..fdd0f230cb17 100644 --- a/shared/yeast/doc/yeast.md +++ b/shared/yeast/doc/yeast.md @@ -235,6 +235,17 @@ yeast::trees!(ctx, (identifier #{name}) // an identifier from a Rust variable ``` +For reviewing locations, `DumpOptions::show_abridged_source` prints each node's +source range with every direct child replaced by its field name in Unicode +angle brackets. This keeps delimiters and other parent-owned syntax visible +without repeating entire subtrees: + +```text +return_expr source="return ⟨value⟩" + value: + call_expr source="⟨callee⟩(⟨argument⟩)" +``` + ### Optional fields (`?`) A `?` on a field's value makes that field fallible. If a `#{expr}` anywhere diff --git a/shared/yeast/src/dump.rs b/shared/yeast/src/dump.rs index 0e2e57e6f82a..ddcf3ae12b4e 100644 --- a/shared/yeast/src/dump.rs +++ b/shared/yeast/src/dump.rs @@ -15,6 +15,9 @@ pub struct DumpOptions { pub show_locations: bool, /// Whether to include source text for leaf nodes. pub show_content: bool, + /// Whether to include each node's source range with direct-child ranges + /// replaced by their field names in `⟨angle brackets⟩`. + pub show_abridged_source: bool, } impl Default for DumpOptions { @@ -22,6 +25,7 @@ impl Default for DumpOptions { Self { show_locations: false, show_content: true, + show_abridged_source: false, } } } @@ -226,6 +230,10 @@ fn dump_node( } } + if options.show_abridged_source { + write_source_skeleton(ast, node, source, out); + } + if let Some(context) = type_check { if let Some(err) = type_error_for_node(context.schema, node, context.expected, context.parent_field) @@ -409,6 +417,10 @@ fn dump_node_inline( } } + if options.show_abridged_source { + write_source_skeleton(ast, node, source, out); + } + if let Some(context) = type_check { if let Some(err) = type_error_for_node(context.schema, node, context.expected, context.parent_field) @@ -424,6 +436,246 @@ fn is_leaf(node: &Node) -> bool { node.fields.is_empty() } +enum SourceSkeleton { + Missing, + Text(String), + Invalid(String), +} + +fn write_source_skeleton(ast: &Ast, node: &Node, source: &str, out: &mut String) { + match source_skeleton(ast, node, source) { + SourceSkeleton::Missing => write!(out, " source=").unwrap(), + SourceSkeleton::Text(text) => write!(out, " source={text:?}").unwrap(), + SourceSkeleton::Invalid(error) => write!(out, " source=").unwrap(), + } +} + +fn node_source_range(node: &Node) -> Option { + match node.content { + NodeContent::Range(range) => Some(range), + _ => node.source_range, + } +} + +fn source_skeleton(ast: &Ast, node: &Node, source: &str) -> SourceSkeleton { + let Some(parent) = node_source_range(node) else { + return SourceSkeleton::Missing; + }; + let parent = parent.start_byte..parent.end_byte; + if parent.start > parent.end || source.get(parent.clone()).is_none() { + return SourceSkeleton::Invalid(format!( + "node range {}..{} is outside the source or not on UTF-8 boundaries", + parent.start, parent.end + )); + } + + let mut children = Vec::new(); + for (field_id, child_ids) in &node.fields { + let field_name = if *field_id == CHILD_FIELD { + "child" + } else { + ast.field_name_for_id(*field_id).unwrap_or("?") + }; + for child_id in child_ids { + let Some(child) = ast.get_node(*child_id) else { + continue; + }; + if !child.is_named() { + continue; + } + let Some(child) = node_source_range(child) else { + continue; + }; + let child = child.start_byte..child.end_byte; + if child.start > child.end || source.get(child.clone()).is_none() { + return SourceSkeleton::Invalid(format!( + "child range {}..{} is outside the source or not on UTF-8 boundaries", + child.start, child.end + )); + } + if child.start < parent.start || child.end > parent.end { + return SourceSkeleton::Invalid(format!( + "child range {}..{} is outside node range {}..{}", + child.start, child.end, parent.start, parent.end + )); + } + if child.start == child.end { + continue; + } + children.push((child, field_name)); + } + } + children.sort_by_key(|(range, field_name)| (range.start, range.end, *field_name)); + + let mut result = String::new(); + let mut cursor = parent.start; + for (range, field_name) in children { + if cursor < range.start { + result.push_str(source.get(cursor..range.start).unwrap()); + } + result.push('⟨'); + result.push_str(field_name); + result.push('⟩'); + cursor = cursor.max(range.end); + } + result.push_str(source.get(cursor..parent.end).unwrap()); + SourceSkeleton::Text(result) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{NodeContent, Point, Range}; + use std::collections::BTreeMap; + + fn range(start: usize, end: usize) -> Range { + Range { + start_byte: start, + end_byte: end, + start_point: Point::new(0, start), + end_point: Point::new(0, end), + } + } + + fn dump_with_children(source: &str, parent_range: Range, children: &[(&str, Range)]) -> String { + let mut ast = Ast::with_schema(crate::schema::Schema::new()); + let parent_kind = ast.register_kind("parent"); + let child_kind = ast.register_kind("child"); + let mut fields = BTreeMap::new(); + for (field_name, range) in children { + let field = ast.register_field(field_name); + let child = ast.create_node_with_range( + child_kind, + NodeContent::Range(*range), + BTreeMap::new(), + true, + None, + ); + fields.entry(field).or_insert_with(Vec::new).push(child); + } + let parent = ast.create_node_with_range( + parent_kind, + NodeContent::Range(parent_range), + fields, + true, + None, + ); + ast.set_root(parent); + + dump_ast_with_options( + &ast, + parent, + source, + &DumpOptions { + show_locations: false, + show_content: false, + show_abridged_source: true, + }, + ) + } + + #[test] + fn source_skeleton_elides_direct_children_and_ignores_empty_ranges() { + let source = "αbefore(child)afterω"; + let child_start = source.find("child").unwrap(); + let child_end = child_start + "child".len(); + let dump = dump_with_children( + source, + range(0, source.len()), + &[ + ("value", range(child_start, child_end)), + ("marker", range(child_start, child_start)), + ], + ); + + assert!(dump.starts_with("parent source=\"αbefore(⟨value⟩)afterω\"\n")); + } + + #[test] + fn source_skeleton_preserves_unnamed_tokens() { + let source = "x = 1"; + let runner: crate::Runner = crate::Runner::new(tree_sitter_ruby::LANGUAGE.into(), &[]); + let ast = runner.run(source).unwrap(); + let dump = dump_ast_with_options( + &ast, + ast.get_root(), + source, + &DumpOptions { + show_locations: false, + show_content: false, + show_abridged_source: true, + }, + ); + + assert!(dump.contains("assignment source=\"⟨left⟩ = ⟨right⟩\"")); + } + + #[test] + fn source_skeleton_validates_empty_child_ranges() { + let cases = [ + ( + "abcdef", + range(0, 3), + range(4, 4), + "child range 4..4 is outside node range 0..3", + ), + ( + "abcdef", + range(0, 6), + range(7, 7), + "child range 7..7 is outside the source or not on UTF-8 boundaries", + ), + ( + "αbc", + range(0, 4), + range(1, 1), + "child range 1..1 is outside the source or not on UTF-8 boundaries", + ), + ]; + + for (source, parent, child, error) in cases { + let dump = dump_with_children(source, parent, &[("marker", child)]); + assert!( + dump.starts_with(&format!("parent source=\n")), + "unexpected dump: {dump}" + ); + } + } + + #[test] + fn source_skeleton_keeps_adjacent_child_fields_separate() { + let source = "abcdef"; + let dump = dump_with_children( + source, + range(0, source.len()), + &[("left", range(1, 3)), ("right", range(3, 5))], + ); + + assert!(dump.starts_with("parent source=\"a⟨left⟩⟨right⟩f\"\n")); + } + + #[test] + fn source_skeleton_keeps_overlapping_child_fields_separate() { + let source = "abcdef"; + let dump = dump_with_children( + source, + range(0, source.len()), + &[("left", range(1, 4)), ("right", range(3, 5))], + ); + + assert!(dump.starts_with("parent source=\"a⟨left⟩⟨right⟩f\"\n")); + } + + #[test] + fn source_skeleton_reports_children_outside_the_parent() { + let source = "abcdefghi"; + let dump = dump_with_children(source, range(0, 6), &[("child", range(7, 9))]); + + assert!(dump + .starts_with("parent source=\n")); + } +} + fn node_content(node: &Node, source: &str) -> String { match &node.content { NodeContent::DynamicString(s) if !s.is_empty() => s.clone(), From a0f9f35ace39a9406422422e0b9eb1c2b5d51391 Mon Sep 17 00:00:00 2001 From: Taus Date: Fri, 18 Sep 2026 11:01:14 +0000 Subject: [PATCH 1133/2098] Unified: Include source skeletons in corpus output Regenerates all of the existing corpus output files to include source skeletons. Note that this already reveals some issues with our current locations: - arguments with trailing commas have a location that includes said comma, - switch_case nodes contain a `block` that encompasses the `case` statement itself. These will be fixed in due course. --- .../closures/closure-with-capture-list.output | 28 ++-- .../closure-with-explicit-parameters.output | 30 ++-- .../closure-with-shorthand-parameters.output | 22 +-- .../closures/multi-statement-closure.output | 46 +++--- .../swift/closures/trailing-closure.output | 26 +-- .../swift/collections/array-literal.output | 18 +- .../collections/dictionary-literal.output | 12 +- .../collections/dictionary-subscript.output | 18 +- .../empty-array-literal-with-type.output | 18 +- .../swift/collections/set-literal.output | 24 +-- .../swift/collections/subscript-access.output | 18 +- .../swift/collections/tuple-literal.output | 24 +-- .../collections/tuple-member-access.output | 16 +- ...g-modifier-does-not-leak-to-sibling.output | 36 ++-- .../swift/control-flow/defer-statement.output | 20 +-- .../control-flow/discard-statement.output | 24 +-- .../swift/control-flow/fallthrough.output | 36 ++-- .../swift/control-flow/guard-let.output | 30 ++-- ...t-with-shadowing-in-condition-value.output | 60 +++---- .../control-flow/if-else-if-chain.output | 54 +++--- .../corpus/swift/control-flow/if-else.output | 38 ++--- .../if-let-optional-binding.output | 36 ++-- .../swift/control-flow/if-statement.output | 24 +-- .../nested-enum-case-pattern.output | 88 +++++----- .../switch-case-item-where-clauses.output | 80 ++++----- .../switch-expression-pattern.output | 152 ++++++++--------- .../control-flow/switch-statement.output | 52 +++--- .../switch-with-binding-pattern.output | 64 ++++---- ...with-labeled-case-pattern-arguments.output | 68 ++++---- .../control-flow/ternary-expression.output | 28 ++-- .../additive-expression-is-desugared.output | 12 +- ...er-additive-expression-is-desugared.output | 12 +- ...with-deeply-nested-path-three-parts.output | 22 +-- .../import-with-dotted-path-two-parts.output | 18 +- .../scoped-import-uses-name-pattern.output | 16 +- .../simple-import-with-single-name.output | 14 +- .../expressions/array-type-constructor.output | 68 ++++---- .../expressions/array-type-metatype.output | 24 +-- .../expressions/consume-expression.output | 26 +-- .../swift/expressions/copy-expression.output | 26 +-- .../generic-specialization-expression.output | 18 +- .../expressions/key-path-expression.output | 12 +- .../expressions/unsafe-expression.output | 12 +- .../functions/call-with-inout-argument.output | 32 ++-- ...onstructor-call-with-type-arguments.output | 34 ++-- ...nction-call-with-labelled-arguments.output | 14 +- .../swift/functions/function-call.output | 16 +- ...nction-with-default-parameter-value.output | 26 +-- .../function-with-inout-parameter.output | 26 +-- .../function-with-named-parameters.output | 26 +-- .../function-with-no-parameters.output | 18 +- ...ion-with-parameters-and-return-type.output | 38 ++--- .../swift/functions/generic-function.output | 28 ++-- .../swift/functions/generic-type-alias.output | 26 +-- .../leading-dot-expression-call.output | 22 +-- .../leading-dot-expression-value.output | 16 +- .../corpus/swift/functions/method-call.output | 16 +- .../functions/nested-function-type.output | 52 +++--- .../swift/functions/variadic-function.output | 38 ++--- .../swift/literals/boolean-literals.output | 8 +- .../literals/floating-point-literal.output | 6 +- .../swift/literals/integer-literal.output | 6 +- .../swift/literals/line-magic-literal.output | 12 +- .../literals/negative-integer-literal.output | 10 +- .../corpus/swift/literals/nil-literal.output | 6 +- .../swift/literals/string-literal.output | 6 +- .../literals/string-with-interpolation.output | 154 +++++++++--------- .../swift/loops/break-and-continue.output | 48 +++--- .../loops/for-in-over-array-literal.output | 26 +-- .../swift/loops/for-in-over-range.output | 26 +-- .../loops/for-in-with-where-clause.output | 28 ++-- .../swift/loops/repeat-while-loop.output | 24 +-- .../corpus/swift/loops/while-loop.output | 24 +-- .../corpus/swift/operators/addition.output | 12 +- .../corpus/swift/operators/comparison.output | 12 +- .../operators/custom-postfix-operator.output | 14 +- .../corpus/swift/operators/division.output | 12 +- .../corpus/swift/operators/equality.output | 12 +- .../corpus/swift/operators/logical-and.output | 12 +- .../corpus/swift/operators/logical-not.output | 10 +- .../corpus/swift/operators/logical-or.output | 12 +- .../swift/operators/multiplication.output | 12 +- ...cedence-addition-and-multiplication.output | 18 +- .../operators/parenthesised-expression.output | 18 +- .../swift/operators/partial-range-from.output | 12 +- .../swift/operators/range-operator.output | 12 +- .../corpus/swift/operators/subtraction.output | 12 +- ...solved-operator-sequence-with-casts.output | 58 +++---- ...lved-operator-sequence-with-ternary.output | 62 +++---- .../unresolved-operator-sequence.output | 38 ++--- .../catch-where-clauses.output | 74 ++++----- .../optionals-and-errors/do-catch.output | 28 ++-- .../optionals-and-errors/force-unwrap.output | 16 +- .../nil-coalescing.output | 18 +- .../optional-chaining.output | 20 +-- .../optional-enum-case-binding.output | 46 +++--- .../optional-type-annotation.output | 18 +- .../throwing-function.output | 16 +- .../try-expression-2.output | 18 +- .../try-expression.output | 18 +- .../swift/types/actor-declaration.output | 6 +- ...er-does-not-leak-into-accessor-body.output | 38 ++--- .../corpus/swift/types/class-function.output | 18 +- .../swift/types/class-inheritance.output | 14 +- .../swift/types/class-with-initializer.output | 40 ++--- .../swift/types/class-with-method.output | 32 ++-- .../class-with-multiple-base-types.output | 18 +- .../types/class-with-stored-properties.output | 26 +-- .../swift/types/computed-property.output | 48 +++--- ...nditional-compilation-in-class-body.output | 12 +- .../types/constructor-with-parameters.output | 30 ++-- .../corpus/swift/types/empty-class.output | 10 +- .../types/enum-with-associated-values.output | 42 ++--- .../corpus/swift/types/enum-with-cases.output | 34 ++-- ...separated-cases-chained-declaration.output | 40 ++--- .../tests/corpus/swift/types/extension.output | 28 ++-- ...tion-type-with-convention-attribute.output | 16 +- ...nction-type-with-sendable-attribute.output | 16 +- ...ic-class-parameters-and-constraints.output | 32 ++-- .../swift/types/generic-type-arguments.output | 24 +-- .../swift/types/inline-array-type.output | 20 +-- .../swift/types/noncopyable-type.output | 22 +-- .../property-with-getter-and-setter.output | 58 +++---- .../swift/types/protocol-declaration.output | 24 +-- ...nd-read-write-property-requirements.output | 44 ++--- .../corpus/swift/types/qualified-type.output | 50 +++--- .../corpus/swift/types/static-function.output | 18 +- .../tests/corpus/swift/types/struct.output | 26 +-- .../corpus/swift/variables/assignment.output | 12 +- ...fier-does-not-leak-into-initializer.output | 28 ++-- .../variables/compound-assignment.output | 12 +- .../corpus/swift/variables/let-binding.output | 12 +- .../variables/let-with-type-annotation.output | 14 +- .../multiple-bindings-on-one-line.output | 22 +-- ...y-with-willset-and-didset-observers.output | 60 +++---- .../tuple-destructuring-binding.output | 20 +-- .../corpus/swift/variables/var-binding.output | 12 +- .../variables/var-without-initialiser.output | 12 +- unified/extractor/tests/corpus_tests.rs | 8 +- 139 files changed, 1947 insertions(+), 1943 deletions(-) diff --git a/unified/extractor/tests/corpus/swift/closures/closure-with-capture-list.output b/unified/extractor/tests/corpus/swift/closures/closure-with-capture-list.output index 64de98c7b745..1e28176add2b 100644 --- a/unified/extractor/tests/corpus/swift/closures/closure-with-capture-list.output +++ b/unified/extractor/tests/corpus/swift/closures/closure-with-capture-list.output @@ -60,24 +60,24 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "f" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "f" source="f" value: - function_expr + function_expr source="⟨body⟩⟨capture_declaration⟩" capture_declaration: - variable_declaration - modifier: modifier "weak" - pattern: identifier "self" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩" + modifier: modifier "weak" source="weak" + pattern: identifier "self" source="self" body: - block + block source="{ [weak self] in ⟨stmt⟩ }" stmt: - call_expr + call_expr source="⟨callee⟩()" callee: - member_access_expr - base: identifier "self" - member_name_node: identifier "doThing" + member_access_expr source="⟨base⟩?.⟨member_name_node⟩" + base: identifier "self" source="self" + member_name_node: identifier "doThing" source="doThing" diff --git a/unified/extractor/tests/corpus/swift/closures/closure-with-explicit-parameters.output b/unified/extractor/tests/corpus/swift/closures/closure-with-explicit-parameters.output index dca87eb8bebc..a44783d172d1 100644 --- a/unified/extractor/tests/corpus/swift/closures/closure-with-explicit-parameters.output +++ b/unified/extractor/tests/corpus/swift/closures/closure-with-explicit-parameters.output @@ -62,24 +62,24 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "f" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "f" source="f" value: - function_expr + function_expr source="⟨body⟩⟨parameter⟩⟨return_type⟩" parameter: - parameter - type: identifier "Int" - pattern: identifier "x" - return_type: identifier "Int" + parameter source="⟨pattern⟩: ⟨type⟩" + type: identifier "Int" source="Int" + pattern: identifier "x" source="x" + return_type: identifier "Int" source="Int" body: - block + block source="{ (x: Int) -> Int in ⟨stmt⟩ }" stmt: - binary_expr - left: identifier "x" - operator: infix_operator "*" - right: int_literal "2" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "x" source="x" + operator: infix_operator "*" source="*" + right: int_literal "2" source="2" diff --git a/unified/extractor/tests/corpus/swift/closures/closure-with-shorthand-parameters.output b/unified/extractor/tests/corpus/swift/closures/closure-with-shorthand-parameters.output index 2473ae994abe..6de0b9bea57c 100644 --- a/unified/extractor/tests/corpus/swift/closures/closure-with-shorthand-parameters.output +++ b/unified/extractor/tests/corpus/swift/closures/closure-with-shorthand-parameters.output @@ -39,19 +39,19 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "f" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "f" source="f" value: - function_expr + function_expr source="⟨body⟩" body: - block + block source="{ ⟨stmt⟩ }" stmt: - binary_expr - left: identifier "$0" - operator: infix_operator "+" - right: identifier "$1" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "$0" source="$0" + operator: infix_operator "+" source="+" + right: identifier "$1" source="$1" diff --git a/unified/extractor/tests/corpus/swift/closures/multi-statement-closure.output b/unified/extractor/tests/corpus/swift/closures/multi-statement-closure.output index 83b9fec3302a..36649bd5ac0d 100644 --- a/unified/extractor/tests/corpus/swift/closures/multi-statement-closure.output +++ b/unified/extractor/tests/corpus/swift/closures/multi-statement-closure.output @@ -93,34 +93,34 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "f" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "f" source="f" value: - function_expr + function_expr source="⟨body⟩⟨parameter⟩⟨return_type⟩" parameter: - parameter - type: identifier "Int" - pattern: identifier "x" - return_type: identifier "Int" + parameter source="⟨pattern⟩: ⟨type⟩" + type: identifier "Int" source="Int" + pattern: identifier "x" source="x" + return_type: identifier "Int" source="Int" body: - block + block source="{ (x: Int) -> Int in\n ⟨stmt⟩\n ⟨stmt⟩\n}" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "y" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "y" source="y" value: - binary_expr - left: identifier "x" - operator: infix_operator "+" - right: int_literal "1" - return_expr + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "x" source="x" + operator: infix_operator "+" source="+" + right: int_literal "1" source="1" + return_expr source="return ⟨value⟩" value: - binary_expr - left: identifier "y" - operator: infix_operator "*" - right: int_literal "2" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "y" source="y" + operator: infix_operator "*" source="*" + right: int_literal "2" source="2" diff --git a/unified/extractor/tests/corpus/swift/closures/trailing-closure.output b/unified/extractor/tests/corpus/swift/closures/trailing-closure.output index 399075b488db..ad75555b1002 100644 --- a/unified/extractor/tests/corpus/swift/closures/trailing-closure.output +++ b/unified/extractor/tests/corpus/swift/closures/trailing-closure.output @@ -39,23 +39,23 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - call_expr + call_expr source="⟨callee⟩⟨argument⟩" callee: - member_access_expr - base: identifier "xs" - member_name_node: identifier "map" + member_access_expr source="⟨base⟩.⟨member_name_node⟩" + base: identifier "xs" source="xs" + member_name_node: identifier "map" source="map" argument: - argument + argument source="xs.map ⟨value⟩" value: - function_expr + function_expr source="⟨body⟩" body: - block + block source="{ ⟨stmt⟩ }" stmt: - binary_expr - left: identifier "$0" - operator: infix_operator "*" - right: int_literal "2" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "$0" source="$0" + operator: infix_operator "*" source="*" + right: int_literal "2" source="2" diff --git a/unified/extractor/tests/corpus/swift/collections/array-literal.output b/unified/extractor/tests/corpus/swift/collections/array-literal.output index b6fd3a4331bc..51c65ac2a0f0 100644 --- a/unified/extractor/tests/corpus/swift/collections/array-literal.output +++ b/unified/extractor/tests/corpus/swift/collections/array-literal.output @@ -41,16 +41,16 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "xs" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "xs" source="xs" value: - array_literal + array_literal source="[⟨element⟩, ⟨element⟩, ⟨element⟩]" element: - int_literal "1" - int_literal "2" - int_literal "3" + int_literal "1" source="1" + int_literal "2" source="2" + int_literal "3" source="3" diff --git a/unified/extractor/tests/corpus/swift/collections/dictionary-literal.output b/unified/extractor/tests/corpus/swift/collections/dictionary-literal.output index f2a2be74c780..7993dd1a841a 100644 --- a/unified/extractor/tests/corpus/swift/collections/dictionary-literal.output +++ b/unified/extractor/tests/corpus/swift/collections/dictionary-literal.output @@ -52,11 +52,11 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "d" - value: map_literal "[\"a\": 1, \"b\": 2]" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "d" source="d" + value: map_literal "[\"a\": 1, \"b\": 2]" source="[\"a\": 1, \"b\": 2]" diff --git a/unified/extractor/tests/corpus/swift/collections/dictionary-subscript.output b/unified/extractor/tests/corpus/swift/collections/dictionary-subscript.output index bf67e55bd23d..b7719365bbc6 100644 --- a/unified/extractor/tests/corpus/swift/collections/dictionary-subscript.output +++ b/unified/extractor/tests/corpus/swift/collections/dictionary-subscript.output @@ -41,16 +41,16 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "v" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "v" source="v" value: - call_expr - callee: identifier "d" + call_expr source="⟨callee⟩[⟨argument⟩]" + callee: identifier "d" source="d" argument: - argument - value: string_literal "\"key\"" + argument source="⟨value⟩" + value: string_literal "\"key\"" source="\"key\"" diff --git a/unified/extractor/tests/corpus/swift/collections/empty-array-literal-with-type.output b/unified/extractor/tests/corpus/swift/collections/empty-array-literal-with-type.output index 5e562153961b..28958f323827 100644 --- a/unified/extractor/tests/corpus/swift/collections/empty-array-literal-with-type.output +++ b/unified/extractor/tests/corpus/swift/collections/empty-array-literal-with-type.output @@ -37,15 +37,15 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "xs" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩: ⟨type⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "xs" source="xs" type: - generic_type_expr - base: identifier "Array" - type_argument: identifier "Int" - value: array_literal "[]" + generic_type_expr source="⟨base⟩⟨type_argument⟩" + base: identifier "Array" source="[Int]" + type_argument: identifier "Int" source="Int" + value: array_literal "[]" source="[]" diff --git a/unified/extractor/tests/corpus/swift/collections/set-literal.output b/unified/extractor/tests/corpus/swift/collections/set-literal.output index 071c7c4fcb70..97cf2cf6a72a 100644 --- a/unified/extractor/tests/corpus/swift/collections/set-literal.output +++ b/unified/extractor/tests/corpus/swift/collections/set-literal.output @@ -56,20 +56,20 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "s" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩: ⟨type⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "s" source="s" type: - generic_type_expr - base: identifier "Set" - type_argument: identifier "Int" + generic_type_expr source="⟨base⟩<⟨type_argument⟩>" + base: identifier "Set" source="Set" + type_argument: identifier "Int" source="Int" value: - array_literal + array_literal source="[⟨element⟩, ⟨element⟩, ⟨element⟩]" element: - int_literal "1" - int_literal "2" - int_literal "3" + int_literal "1" source="1" + int_literal "2" source="2" + int_literal "3" source="3" diff --git a/unified/extractor/tests/corpus/swift/collections/subscript-access.output b/unified/extractor/tests/corpus/swift/collections/subscript-access.output index 6067a9a90684..771004ff717f 100644 --- a/unified/extractor/tests/corpus/swift/collections/subscript-access.output +++ b/unified/extractor/tests/corpus/swift/collections/subscript-access.output @@ -38,16 +38,16 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "first" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "first" source="first" value: - call_expr - callee: identifier "xs" + call_expr source="⟨callee⟩[⟨argument⟩]" + callee: identifier "xs" source="xs" argument: - argument - value: int_literal "0" + argument source="⟨value⟩" + value: int_literal "0" source="0" diff --git a/unified/extractor/tests/corpus/swift/collections/tuple-literal.output b/unified/extractor/tests/corpus/swift/collections/tuple-literal.output index 4a8a54078d9c..653bce662689 100644 --- a/unified/extractor/tests/corpus/swift/collections/tuple-literal.output +++ b/unified/extractor/tests/corpus/swift/collections/tuple-literal.output @@ -45,19 +45,19 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "t" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "t" source="t" value: - tuple_expr + tuple_expr source="(⟨element⟩ ⟨element⟩ ⟨element⟩)" element: - argument - value: int_literal "1" - argument - value: string_literal "\"two\"" - argument - value: float_literal "3.0" + argument source="⟨value⟩," + value: int_literal "1" source="1" + argument source="⟨value⟩," + value: string_literal "\"two\"" source="\"two\"" + argument source="⟨value⟩" + value: float_literal "3.0" source="3.0" diff --git a/unified/extractor/tests/corpus/swift/collections/tuple-member-access.output b/unified/extractor/tests/corpus/swift/collections/tuple-member-access.output index ed31af94f0aa..d5eb860a528e 100644 --- a/unified/extractor/tests/corpus/swift/collections/tuple-member-access.output +++ b/unified/extractor/tests/corpus/swift/collections/tuple-member-access.output @@ -31,14 +31,14 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "n" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "n" source="n" value: - member_access_expr - base: identifier "t" - member_name_node: identifier "0" + member_access_expr source="⟨base⟩.⟨member_name_node⟩" + base: identifier "t" source="t" + member_name_node: identifier "0" source="0" diff --git a/unified/extractor/tests/corpus/swift/control-flow/binding-modifier-does-not-leak-to-sibling.output b/unified/extractor/tests/corpus/swift/control-flow/binding-modifier-does-not-leak-to-sibling.output index 1a50d875f783..f960f16a50f9 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/binding-modifier-does-not-leak-to-sibling.output +++ b/unified/extractor/tests/corpus/swift/control-flow/binding-modifier-does-not-leak-to-sibling.output @@ -84,28 +84,28 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩\n⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "x" - value: int_literal "1" - switch_expr - value: identifier "y" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "x" source="x" + value: int_literal "1" source="1" + switch_expr source="switch ⟨value⟩ {\n⟨case⟩\n⟨case⟩\n}" + value: identifier "y" source="y" case: - switch_case - pattern: identifier "someConstant" + switch_case source="⟨body⟩⟨pattern⟩" + pattern: identifier "someConstant" source="someConstant" body: - block + block source="case someConstant:\n ⟨stmt⟩" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: string_literal "\"matched\"" - switch_case + argument source="⟨value⟩" + value: string_literal "\"matched\"" source="\"matched\"" + switch_case source="⟨body⟩" body: - block - stmt: break_expr "break" + block source="default:\n ⟨stmt⟩" + stmt: break_expr "break" source="break" diff --git a/unified/extractor/tests/corpus/swift/control-flow/defer-statement.output b/unified/extractor/tests/corpus/swift/control-flow/defer-statement.output index 0a9adb11a990..78f25fbd9551 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/defer-statement.output +++ b/unified/extractor/tests/corpus/swift/control-flow/defer-statement.output @@ -75,18 +75,18 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - function_declaration - name_node: identifier "withCleanup" + function_declaration source="⟨body⟩⟨name_node⟩" + name_node: identifier "withCleanup" source="withCleanup" body: - block + block source="func withCleanup() {\n ⟨stmt⟩\n ⟨stmt⟩\n}" stmt: - unsupported_node "defer { print(\"cleanup\") }" - call_expr - callee: identifier "print" + unsupported_node "defer { print(\"cleanup\") }" source="defer { print(\"cleanup\") }" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: string_literal "\"work\"" + argument source="⟨value⟩" + value: string_literal "\"work\"" source="\"work\"" diff --git a/unified/extractor/tests/corpus/swift/control-flow/discard-statement.output b/unified/extractor/tests/corpus/swift/control-flow/discard-statement.output index c4418dba888b..b2c21eee642e 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/discard-statement.output +++ b/unified/extractor/tests/corpus/swift/control-flow/discard-statement.output @@ -63,20 +63,20 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - class_like_declaration - modifier: modifier "struct" - name_node: identifier "Resource" + class_like_declaration source="⟨modifier⟩⟨base_type⟩⟨name_node⟩⟨member⟩" + modifier: modifier "struct" source="struct" + name_node: identifier "Resource" source="Resource" base_type: - base_type - type: unsupported_node "~Copyable" + base_type source="struct Resource: ⟨type⟩ {\n consuming func close() {\n discard self\n }\n}" + type: unsupported_node "~Copyable" source="~Copyable" member: - function_declaration - modifier: modifier "consuming" - name_node: identifier "close" + function_declaration source="⟨modifier⟩⟨body⟩⟨name_node⟩" + modifier: modifier "consuming" source="consuming" + name_node: identifier "close" source="close" body: - block - stmt: unsupported_node "discard self" + block source="consuming func close() {\n ⟨stmt⟩\n }" + stmt: unsupported_node "discard self" source="discard self" diff --git a/unified/extractor/tests/corpus/swift/control-flow/fallthrough.output b/unified/extractor/tests/corpus/swift/control-flow/fallthrough.output index a0920ac436aa..c5752060af62 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/fallthrough.output +++ b/unified/extractor/tests/corpus/swift/control-flow/fallthrough.output @@ -82,29 +82,29 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - function_declaration - name_node: identifier "classify" + function_declaration source="⟨body⟩⟨name_node⟩⟨parameter⟩" + name_node: identifier "classify" source="classify" parameter: - parameter - external_name_node: identifier "_" - type: identifier "Int" - pattern: identifier "x" + parameter source="⟨external_name_node⟩ ⟨pattern⟩: ⟨type⟩" + external_name_node: identifier "_" source="_" + type: identifier "Int" source="Int" + pattern: identifier "x" source="x" body: - block + block source="func classify(_ x: Int) {\n ⟨stmt⟩\n}" stmt: - switch_expr - value: identifier "x" + switch_expr source="switch ⟨value⟩ {\n ⟨case⟩\n ⟨case⟩\n }" + value: identifier "x" source="x" case: - switch_case - pattern: int_literal "1" + switch_case source="⟨body⟩⟨pattern⟩" + pattern: int_literal "1" source="1" body: - block - stmt: unsupported_node "fallthrough" - switch_case + block source="case 1:\n ⟨stmt⟩" + stmt: unsupported_node "fallthrough" source="fallthrough" + switch_case source="⟨body⟩" body: - block - stmt: break_expr "break" + block source="default:\n ⟨stmt⟩" + stmt: break_expr "break" source="break" diff --git a/unified/extractor/tests/corpus/swift/control-flow/guard-let.output b/unified/extractor/tests/corpus/swift/control-flow/guard-let.output index 2eb1682529f1..aefb475a5bde 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/guard-let.output +++ b/unified/extractor/tests/corpus/swift/control-flow/guard-let.output @@ -36,26 +36,26 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - guard_if_stmt + guard_if_stmt source="guard ⟨condition⟩ else ⟨else⟩" condition: - pattern_guard_expr + pattern_guard_expr source="⟨pattern⟩⟨value⟩" pattern: - call_expr + call_expr source="⟨argument⟩⟨callee⟩" callee: - member_access_expr - base: identifier "Optional" - member_name_node: identifier "some" + member_access_expr source="⟨base⟩⟨member_name_node⟩" + base: identifier "Optional" source="let value = optional" + member_name_node: identifier "some" source="let value = optional" argument: - argument + argument source="⟨value⟩" value: - expr_pattern - modifier: modifier "let" - expr: identifier "value" - value: identifier "optional" + expr_pattern source="⟨modifier⟩⟨expr⟩" + modifier: modifier "let" source="let value = optional" + expr: identifier "value" source="value" + value: identifier "optional" source="optional" else: - block - stmt: return_expr "return" + block source="{ ⟨stmt⟩ }" + stmt: return_expr "return" source="return" diff --git a/unified/extractor/tests/corpus/swift/control-flow/if-case-let-with-shadowing-in-condition-value.output b/unified/extractor/tests/corpus/swift/control-flow/if-case-let-with-shadowing-in-condition-value.output index 1b44ec1e7707..07ae6d16afae 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/if-case-let-with-shadowing-in-condition-value.output +++ b/unified/extractor/tests/corpus/swift/control-flow/if-case-let-with-shadowing-in-condition-value.output @@ -112,46 +112,46 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩\n\n⟨stmt⟩" stmt: - if_expr + if_expr source="if ⟨condition⟩ ⟨then⟩" condition: - pattern_guard_expr + pattern_guard_expr source="case ⟨pattern⟩ = ⟨value⟩" pattern: - expr_pattern - modifier: modifier "let" - expr: identifier "x" + expr_pattern source="⟨modifier⟩ ⟨expr⟩" + modifier: modifier "let" source="let" + expr: identifier "x" source="x" value: - binary_expr - left: identifier "x" - operator: infix_operator "+" - right: int_literal "10" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "x" source="x" + operator: infix_operator "+" source="+" + right: int_literal "10" source="10" then: - block + block source="{\n ⟨stmt⟩\n}" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: identifier "x" - if_expr + argument source="⟨value⟩" + value: identifier "x" source="x" + if_expr source="if ⟨condition⟩ ⟨then⟩" condition: - pattern_guard_expr + pattern_guard_expr source="case ⟨pattern⟩ = ⟨value⟩" pattern: - expr_pattern - modifier: modifier "var" - expr: identifier "y" + expr_pattern source="⟨modifier⟩ ⟨expr⟩" + modifier: modifier "var" source="var" + expr: identifier "y" source="y" value: - binary_expr - left: identifier "y" - operator: infix_operator "+" - right: int_literal "10" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "y" source="y" + operator: infix_operator "+" source="+" + right: int_literal "10" source="10" then: - block + block source="{\n ⟨stmt⟩\n}" stmt: - binary_expr - left: identifier "y" - operator: infix_operator "+=" - right: int_literal "1" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "y" source="y" + operator: infix_operator "+=" source="+=" + right: int_literal "1" source="1" diff --git a/unified/extractor/tests/corpus/swift/control-flow/if-else-if-chain.output b/unified/extractor/tests/corpus/swift/control-flow/if-else-if-chain.output index 82c5b6c468ca..b6e3c1bcd939 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/if-else-if-chain.output +++ b/unified/extractor/tests/corpus/swift/control-flow/if-else-if-chain.output @@ -108,44 +108,44 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - if_expr + if_expr source="if ⟨condition⟩ ⟨then⟩ else ⟨else⟩" condition: - binary_expr - left: identifier "x" - operator: infix_operator ">" - right: int_literal "0" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "x" source="x" + operator: infix_operator ">" source=">" + right: int_literal "0" source="0" then: - block + block source="{\n ⟨stmt⟩\n}" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: int_literal "1" + argument source="⟨value⟩" + value: int_literal "1" source="1" else: - if_expr + if_expr source="if ⟨condition⟩ ⟨then⟩ else ⟨else⟩" condition: - binary_expr - left: identifier "x" - operator: infix_operator "<" - right: int_literal "0" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "x" source="x" + operator: infix_operator "<" source="<" + right: int_literal "0" source="0" then: - block + block source="{\n ⟨stmt⟩\n}" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: int_literal "2" + argument source="⟨value⟩" + value: int_literal "2" source="2" else: - block + block source="{\n ⟨stmt⟩\n}" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: int_literal "3" + argument source="⟨value⟩" + value: int_literal "3" source="3" diff --git a/unified/extractor/tests/corpus/swift/control-flow/if-else.output b/unified/extractor/tests/corpus/swift/control-flow/if-else.output index 86c3b9cd876c..121d7e747e89 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/if-else.output +++ b/unified/extractor/tests/corpus/swift/control-flow/if-else.output @@ -73,32 +73,32 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - if_expr + if_expr source="if ⟨condition⟩ ⟨then⟩ else ⟨else⟩" condition: - binary_expr - left: identifier "x" - operator: infix_operator ">" - right: int_literal "0" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "x" source="x" + operator: infix_operator ">" source=">" + right: int_literal "0" source="0" then: - block + block source="{\n ⟨stmt⟩\n}" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: identifier "x" + argument source="⟨value⟩" + value: identifier "x" source="x" else: - block + block source="{\n ⟨stmt⟩\n}" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument + argument source="⟨value⟩" value: - unary_expr - operand: identifier "x" - operator: prefix_operator "-" + unary_expr source="⟨operator⟩⟨operand⟩" + operand: identifier "x" source="x" + operator: prefix_operator "-" source="-" diff --git a/unified/extractor/tests/corpus/swift/control-flow/if-let-optional-binding.output b/unified/extractor/tests/corpus/swift/control-flow/if-let-optional-binding.output index 1a09a2874e9a..e878953ff7b4 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/if-let-optional-binding.output +++ b/unified/extractor/tests/corpus/swift/control-flow/if-let-optional-binding.output @@ -49,31 +49,31 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - if_expr + if_expr source="if ⟨condition⟩ ⟨then⟩" condition: - pattern_guard_expr + pattern_guard_expr source="⟨pattern⟩⟨value⟩" pattern: - call_expr + call_expr source="⟨argument⟩⟨callee⟩" callee: - member_access_expr - base: identifier "Optional" - member_name_node: identifier "some" + member_access_expr source="⟨base⟩⟨member_name_node⟩" + base: identifier "Optional" source="let value = optional" + member_name_node: identifier "some" source="let value = optional" argument: - argument + argument source="⟨value⟩" value: - expr_pattern - modifier: modifier "let" - expr: identifier "value" - value: identifier "optional" + expr_pattern source="⟨modifier⟩⟨expr⟩" + modifier: modifier "let" source="let value = optional" + expr: identifier "value" source="value" + value: identifier "optional" source="optional" then: - block + block source="{\n ⟨stmt⟩\n}" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: identifier "value" + argument source="⟨value⟩" + value: identifier "value" source="value" diff --git a/unified/extractor/tests/corpus/swift/control-flow/if-statement.output b/unified/extractor/tests/corpus/swift/control-flow/if-statement.output index c0a7cfd021d8..b5616ee887da 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/if-statement.output +++ b/unified/extractor/tests/corpus/swift/control-flow/if-statement.output @@ -48,21 +48,21 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - if_expr + if_expr source="if ⟨condition⟩ ⟨then⟩" condition: - binary_expr - left: identifier "x" - operator: infix_operator ">" - right: int_literal "0" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "x" source="x" + operator: infix_operator ">" source=">" + right: int_literal "0" source="0" then: - block + block source="{\n ⟨stmt⟩\n}" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: identifier "x" + argument source="⟨value⟩" + value: identifier "x" source="x" diff --git a/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output b/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output index 4d0afdcb77db..0d403fd592ea 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output +++ b/unified/extractor/tests/corpus/swift/control-flow/nested-enum-case-pattern.output @@ -155,68 +155,68 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - switch_expr - value: identifier "event" + switch_expr source="switch ⟨value⟩ {\n⟨case⟩\n⟨case⟩\n⟨case⟩\n}" + value: identifier "event" source="event" case: - switch_case + switch_case source="⟨body⟩⟨pattern⟩" pattern: - expr_pattern - modifier: modifier "let" + expr_pattern source="⟨modifier⟩ ⟨expr⟩" + modifier: modifier "let" source="let" expr: - call_expr + call_expr source="⟨callee⟩(⟨argument⟩ ⟨argument⟩)" callee: - member_access_expr - base: inferred_type_expr "." - member_name_node: identifier "received" + member_access_expr source="⟨base⟩⟨member_name_node⟩" + base: inferred_type_expr "." source="." + member_name_node: identifier "received" source="received" argument: - argument + argument source="⟨value⟩" value: - call_expr + call_expr source="⟨callee⟩(⟨argument⟩)," callee: - member_access_expr - base: inferred_type_expr "." - member_name_node: identifier "some" + member_access_expr source="⟨base⟩⟨member_name_node⟩" + base: inferred_type_expr "." source="." + member_name_node: identifier "some" source="some" argument: - argument - value: identifier "value" - argument - value: identifier "timestamp" + argument source="⟨value⟩" + value: identifier "value" source="value" + argument source="⟨value⟩" + value: identifier "timestamp" source="timestamp" body: - block + block source="case let .received(.some(value), timestamp):\n ⟨stmt⟩" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩ ⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: identifier "value" - argument - value: identifier "timestamp" - switch_case + argument source="⟨value⟩," + value: identifier "value" source="value" + argument source="⟨value⟩" + value: identifier "timestamp" source="timestamp" + switch_case source="⟨body⟩⟨pattern⟩" pattern: - call_expr + call_expr source="⟨callee⟩(⟨argument⟩)" callee: - member_access_expr - base: identifier "Type" - member_name_node: identifier "some" + member_access_expr source="⟨base⟩.⟨member_name_node⟩" + base: identifier "Type" source="Type" + member_name_node: identifier "some" source="some" argument: - argument + argument source="⟨value⟩" value: - expr_pattern - modifier: modifier "let" - expr: identifier "value" + expr_pattern source="⟨modifier⟩ ⟨expr⟩" + modifier: modifier "let" source="let" + expr: identifier "value" source="value" body: - block + block source="case Type.some(let value):\n ⟨stmt⟩" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: identifier "value" - switch_case + argument source="⟨value⟩" + value: identifier "value" source="value" + switch_case source="⟨body⟩" body: - block - stmt: break_expr "break" + block source="default:\n ⟨stmt⟩" + stmt: break_expr "break" source="break" diff --git a/unified/extractor/tests/corpus/swift/control-flow/switch-case-item-where-clauses.output b/unified/extractor/tests/corpus/swift/control-flow/switch-case-item-where-clauses.output index 77adadc261b1..a14f115a3f72 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/switch-case-item-where-clauses.output +++ b/unified/extractor/tests/corpus/swift/control-flow/switch-case-item-where-clauses.output @@ -150,62 +150,62 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - switch_expr - value: identifier "n" + switch_expr source="switch ⟨value⟩ {\n⟨case⟩\n⟨case⟩\n⟨case⟩\n}" + value: identifier "n" source="n" case: - switch_case + switch_case source="⟨body⟩⟨pattern⟩" pattern: - conditional_pattern + conditional_pattern source="⟨pattern⟩ where ⟨condition⟩" condition: - binary_expr - left: identifier "x" - operator: infix_operator ">" - right: int_literal "0" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "x" source="x" + operator: infix_operator ">" source=">" + right: int_literal "0" source="0" pattern: - expr_pattern - modifier: modifier "let" - expr: identifier "x" + expr_pattern source="⟨modifier⟩ ⟨expr⟩" + modifier: modifier "let" source="let" + expr: identifier "x" source="x" body: - block + block source="case let x where x > 0:\n ⟨stmt⟩" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: string_literal "\"positive\"" - switch_case + argument source="⟨value⟩" + value: string_literal "\"positive\"" source="\"positive\"" + switch_case source="⟨body⟩⟨pattern⟩" pattern: - or_pattern + or_pattern source="case ⟨pattern⟩ ⟨pattern⟩:\n print(\"non-positive\")" pattern: - conditional_pattern + conditional_pattern source="⟨pattern⟩ where ⟨condition⟩," condition: - binary_expr - left: identifier "y" - operator: infix_operator "<" - right: int_literal "0" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "y" source="y" + operator: infix_operator "<" source="<" + right: int_literal "0" source="0" pattern: - expr_pattern - modifier: modifier "let" - expr: identifier "y" - int_literal "0" + expr_pattern source="⟨modifier⟩ ⟨expr⟩" + modifier: modifier "let" source="let" + expr: identifier "y" source="y" + int_literal "0" source="0" body: - block + block source="case let y where y < 0, 0:\n ⟨stmt⟩" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: string_literal "\"non-positive\"" - switch_case + argument source="⟨value⟩" + value: string_literal "\"non-positive\"" source="\"non-positive\"" + switch_case source="⟨body⟩" body: - block + block source="default:\n ⟨stmt⟩" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: string_literal "\"other\"" + argument source="⟨value⟩" + value: string_literal "\"other\"" source="\"other\"" diff --git a/unified/extractor/tests/corpus/swift/control-flow/switch-expression-pattern.output b/unified/extractor/tests/corpus/swift/control-flow/switch-expression-pattern.output index 533f717b827e..e86af77df08d 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/switch-expression-pattern.output +++ b/unified/extractor/tests/corpus/swift/control-flow/switch-expression-pattern.output @@ -300,96 +300,96 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - switch_expr - value: identifier "subject" + switch_expr source="switch ⟨value⟩ {\n⟨case⟩\n⟨case⟩\n⟨case⟩\n}" + value: identifier "subject" source="subject" case: - switch_case + switch_case source="⟨body⟩⟨pattern⟩" pattern: - or_pattern + or_pattern source="case ⟨pattern⟩, ⟨pattern⟩, ⟨pattern⟩, ⟨pattern⟩, ⟨pattern⟩, ⟨pattern⟩,\n ⟨pattern⟩, ⟨pattern⟩, ⟨pattern⟩, ⟨pattern⟩, ⟨pattern⟩, ⟨pattern⟩,\n ⟨pattern⟩, ⟨pattern⟩, ⟨pattern⟩, ⟨pattern⟩:\n consume(value)" pattern: - identifier "value" - binary_expr - left: identifier "value" - operator: infix_operator "+" - right: identifier "offset" - unary_expr - operand: identifier "value" - operator: prefix_operator "-" - binary_expr - left: identifier "lower" - operator: infix_operator "..." - right: identifier "upper" - call_expr - callee: identifier "makeValue" - member_access_expr + identifier "value" source="value" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "value" source="value" + operator: infix_operator "+" source="+" + right: identifier "offset" source="offset" + unary_expr source="⟨operator⟩⟨operand⟩" + operand: identifier "value" source="value" + operator: prefix_operator "-" source="-" + binary_expr source="⟨left⟩⟨operator⟩⟨right⟩" + left: identifier "lower" source="lower" + operator: infix_operator "..." source="..." + right: identifier "upper" source="upper" + call_expr source="⟨callee⟩()" + callee: identifier "makeValue" source="makeValue" + member_access_expr source="⟨base⟩.⟨member_name_node⟩" base: - call_expr - callee: identifier "makeValue" - member_name_node: identifier "member" - member_access_expr - base: inferred_type_expr "." - member_name_node: identifier "inferred" - tuple_expr + call_expr source="⟨callee⟩()" + callee: identifier "makeValue" source="makeValue" + member_name_node: identifier "member" source="member" + member_access_expr source="⟨base⟩⟨member_name_node⟩" + base: inferred_type_expr "." source="." + member_name_node: identifier "inferred" source="inferred" + tuple_expr source="(⟨element⟩ ⟨element⟩)" element: - argument - value: identifier "value" - argument - value: identifier "offset" - array_literal - element: identifier "value" - map_literal "[key: value]" - call_expr + argument source="⟨value⟩," + value: identifier "value" source="value" + argument source="⟨value⟩" + value: identifier "offset" source="offset" + array_literal source="[⟨element⟩]" + element: identifier "value" source="value" + map_literal "[key: value]" source="[key: value]" + call_expr source="⟨argument⟩⟨callee⟩" callee: - member_access_expr - base: identifier "Optional" - member_name_node: identifier "some" + member_access_expr source="⟨base⟩⟨member_name_node⟩" + base: identifier "Optional" source="optional?" + member_name_node: identifier "some" source="optional?" argument: - argument - value: identifier "optional" - unary_expr - operand: identifier "value" - operator: prefix_operator "try" - unary_expr - operand: identifier "value" - operator: postfix_operator "!" - type_cast_expr - expr: identifier "value" - operator: infix_operator "as" - type: identifier "Target" - type_test_expr - expr: identifier "value" - operator: infix_operator "is" - type: identifier "Target" - unary_expr - operand: identifier "value" - operator: prefix_operator "await" + argument source="⟨value⟩?" + value: identifier "optional" source="optional" + unary_expr source="⟨operator⟩⟨operand⟩" + operand: identifier "value" source="value" + operator: prefix_operator "try" source="try value" + unary_expr source="⟨operand⟩⟨operator⟩" + operand: identifier "value" source="value" + operator: postfix_operator "!" source="value!" + type_cast_expr source="⟨expr⟩⟨operator⟩⟨type⟩" + expr: identifier "value" source="value" + operator: infix_operator "as" source="value as Target" + type: identifier "Target" source="Target" + type_test_expr source="⟨expr⟩⟨operator⟩⟨type⟩" + expr: identifier "value" source="value" + operator: infix_operator "is" source="value is Target" + type: identifier "Target" source="Target" + unary_expr source="⟨operator⟩⟨operand⟩" + operand: identifier "value" source="value" + operator: prefix_operator "await" source="await value" body: - block + block source="case value, value + offset, -value, lower...upper, makeValue(), makeValue().member,\n .inferred, (value, offset), [value], [key: value], optional?, try value,\n value!, value as Target, value is Target, await value:\n ⟨stmt⟩" stmt: - call_expr - callee: identifier "consume" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "consume" source="consume" argument: - argument - value: identifier "value" - switch_case + argument source="⟨value⟩" + value: identifier "value" source="value" + switch_case source="⟨body⟩⟨pattern⟩" pattern: - if_expr - condition: identifier "condition" - then: identifier "value" - else: identifier "fallback" + if_expr source="⟨condition⟩ ? ⟨then⟩ : ⟨else⟩" + condition: identifier "condition" source="condition" + then: identifier "value" source="value" + else: identifier "fallback" source="fallback" body: - block + block source="case condition ? value : fallback:\n ⟨stmt⟩" stmt: - call_expr - callee: identifier "consume" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "consume" source="consume" argument: - argument - value: identifier "fallback" - switch_case + argument source="⟨value⟩" + value: identifier "fallback" source="fallback" + switch_case source="⟨body⟩" body: - block - stmt: break_expr "break" + block source="default:\n ⟨stmt⟩" + stmt: break_expr "break" source="break" diff --git a/unified/extractor/tests/corpus/swift/control-flow/switch-statement.output b/unified/extractor/tests/corpus/swift/control-flow/switch-statement.output index 3ba92e37ab8f..90372a736d22 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/switch-statement.output +++ b/unified/extractor/tests/corpus/swift/control-flow/switch-statement.output @@ -120,43 +120,43 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - switch_expr - value: identifier "x" + switch_expr source="switch ⟨value⟩ {\n⟨case⟩\n⟨case⟩\n⟨case⟩\n}" + value: identifier "x" source="x" case: - switch_case - pattern: int_literal "1" + switch_case source="⟨body⟩⟨pattern⟩" + pattern: int_literal "1" source="1" body: - block + block source="case 1:\n ⟨stmt⟩" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: string_literal "\"one\"" - switch_case + argument source="⟨value⟩" + value: string_literal "\"one\"" source="\"one\"" + switch_case source="⟨body⟩⟨pattern⟩" pattern: - or_pattern + or_pattern source="case ⟨pattern⟩, ⟨pattern⟩:\n print(\"two or three\")" pattern: - int_literal "2" - int_literal "3" + int_literal "2" source="2" + int_literal "3" source="3" body: - block + block source="case 2, 3:\n ⟨stmt⟩" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: string_literal "\"two or three\"" - switch_case + argument source="⟨value⟩" + value: string_literal "\"two or three\"" source="\"two or three\"" + switch_case source="⟨body⟩" body: - block + block source="default:\n ⟨stmt⟩" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: string_literal "\"other\"" + argument source="⟨value⟩" + value: string_literal "\"other\"" source="\"other\"" diff --git a/unified/extractor/tests/corpus/swift/control-flow/switch-with-binding-pattern.output b/unified/extractor/tests/corpus/swift/control-flow/switch-with-binding-pattern.output index 5820da95f35c..8d4d98ec7078 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/switch-with-binding-pattern.output +++ b/unified/extractor/tests/corpus/swift/control-flow/switch-with-binding-pattern.output @@ -115,52 +115,52 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - switch_expr - value: identifier "shape" + switch_expr source="switch ⟨value⟩ {\n⟨case⟩\n⟨case⟩\n}" + value: identifier "shape" source="shape" case: - switch_case + switch_case source="⟨body⟩⟨pattern⟩" pattern: - call_expr + call_expr source="⟨callee⟩(⟨argument⟩)" callee: - member_access_expr - base: inferred_type_expr "." - member_name_node: identifier "circle" + member_access_expr source="⟨base⟩⟨member_name_node⟩" + base: inferred_type_expr "." source="." + member_name_node: identifier "circle" source="circle" argument: - argument + argument source="⟨value⟩" value: - expr_pattern - modifier: modifier "let" - expr: identifier "r" + expr_pattern source="⟨modifier⟩ ⟨expr⟩" + modifier: modifier "let" source="let" + expr: identifier "r" source="r" body: - block + block source="case .circle(let r):\n ⟨stmt⟩" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: identifier "r" - switch_case + argument source="⟨value⟩" + value: identifier "r" source="r" + switch_case source="⟨body⟩⟨pattern⟩" pattern: - call_expr + call_expr source="⟨callee⟩(⟨argument⟩)" callee: - member_access_expr - base: inferred_type_expr "." - member_name_node: identifier "square" + member_access_expr source="⟨base⟩⟨member_name_node⟩" + base: inferred_type_expr "." source="." + member_name_node: identifier "square" source="square" argument: - argument + argument source="⟨value⟩" value: - expr_pattern - modifier: modifier "let" - expr: identifier "s" + expr_pattern source="⟨modifier⟩ ⟨expr⟩" + modifier: modifier "let" source="let" + expr: identifier "s" source="s" body: - block + block source="case .square(let s):\n ⟨stmt⟩" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: identifier "s" + argument source="⟨value⟩" + value: identifier "s" source="s" diff --git a/unified/extractor/tests/corpus/swift/control-flow/switch-with-labeled-case-pattern-arguments.output b/unified/extractor/tests/corpus/swift/control-flow/switch-with-labeled-case-pattern-arguments.output index aca699ad6f74..8f7a0ae5f1f1 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/switch-with-labeled-case-pattern-arguments.output +++ b/unified/extractor/tests/corpus/swift/control-flow/switch-with-labeled-case-pattern-arguments.output @@ -123,53 +123,53 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - switch_expr - value: identifier "x" + switch_expr source="switch ⟨value⟩ {\n⟨case⟩\n⟨case⟩\n}" + value: identifier "x" source="x" case: - switch_case + switch_case source="⟨body⟩⟨pattern⟩" pattern: - call_expr + call_expr source="⟨callee⟩(⟨argument⟩)" callee: - member_access_expr - base: inferred_type_expr "." - member_name_node: identifier "implicit" + member_access_expr source="⟨base⟩⟨member_name_node⟩" + base: inferred_type_expr "." source="." + member_name_node: identifier "implicit" source="implicit" argument: - argument - name_node: identifier "isAcknowledged" - value: boolean_literal "false" + argument source="⟨name_node⟩: ⟨value⟩" + name_node: identifier "isAcknowledged" source="isAcknowledged" + value: boolean_literal "false" source="false" body: - block + block source="case .implicit(isAcknowledged: false):\n ⟨stmt⟩" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: string_literal "\"yes\"" - switch_case + argument source="⟨value⟩" + value: string_literal "\"yes\"" source="\"yes\"" + switch_case source="⟨body⟩⟨pattern⟩" pattern: - call_expr + call_expr source="⟨callee⟩(⟨argument⟩ ⟨argument⟩)" callee: - member_access_expr - base: inferred_type_expr "." - member_name_node: identifier "thread" + member_access_expr source="⟨base⟩⟨member_name_node⟩" + base: inferred_type_expr "." source="." + member_name_node: identifier "thread" source="thread" argument: - argument - name_node: identifier "threadRowId" - value: identifier "_" - argument + argument source="⟨name_node⟩: ⟨value⟩," + name_node: identifier "threadRowId" source="threadRowId" + value: identifier "_" source="_" + argument source="⟨value⟩" value: - expr_pattern - modifier: modifier "let" - expr: identifier "rowId" + expr_pattern source="⟨modifier⟩ ⟨expr⟩" + modifier: modifier "let" source="let" + expr: identifier "rowId" source="rowId" body: - block + block source="case .thread(threadRowId: _, let rowId):\n ⟨stmt⟩" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: identifier "rowId" + argument source="⟨value⟩" + value: identifier "rowId" source="rowId" diff --git a/unified/extractor/tests/corpus/swift/control-flow/ternary-expression.output b/unified/extractor/tests/corpus/swift/control-flow/ternary-expression.output index 299d84c7822f..e864a67ea560 100644 --- a/unified/extractor/tests/corpus/swift/control-flow/ternary-expression.output +++ b/unified/extractor/tests/corpus/swift/control-flow/ternary-expression.output @@ -46,22 +46,22 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "y" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "y" source="y" value: - if_expr + if_expr source="⟨condition⟩ ? ⟨then⟩ : ⟨else⟩" condition: - binary_expr - left: identifier "x" - operator: infix_operator ">" - right: int_literal "0" - then: int_literal "1" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "x" source="x" + operator: infix_operator ">" source=">" + right: int_literal "0" source="0" + then: int_literal "1" source="1" else: - unary_expr - operand: int_literal "1" - operator: prefix_operator "-" + unary_expr source="⟨operator⟩⟨operand⟩" + operand: int_literal "1" source="1" + operator: prefix_operator "-" source="-" diff --git a/unified/extractor/tests/corpus/swift/desugar/additive-expression-is-desugared.output b/unified/extractor/tests/corpus/swift/desugar/additive-expression-is-desugared.output index 30d9570f3bee..3ee44dd60a05 100644 --- a/unified/extractor/tests/corpus/swift/desugar/additive-expression-is-desugared.output +++ b/unified/extractor/tests/corpus/swift/desugar/additive-expression-is-desugared.output @@ -20,11 +20,11 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - binary_expr - left: int_literal "1" - operator: infix_operator "+" - right: int_literal "2" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: int_literal "1" source="1" + operator: infix_operator "+" source="+" + right: int_literal "2" source="2" diff --git a/unified/extractor/tests/corpus/swift/desugar/another-additive-expression-is-desugared.output b/unified/extractor/tests/corpus/swift/desugar/another-additive-expression-is-desugared.output index e27b9c7089ec..e655642a6640 100644 --- a/unified/extractor/tests/corpus/swift/desugar/another-additive-expression-is-desugared.output +++ b/unified/extractor/tests/corpus/swift/desugar/another-additive-expression-is-desugared.output @@ -20,11 +20,11 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - binary_expr - left: identifier "foo" - operator: infix_operator "+" - right: identifier "bar" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "foo" source="foo" + operator: infix_operator "+" source="+" + right: identifier "bar" source="bar" diff --git a/unified/extractor/tests/corpus/swift/desugar/import-with-deeply-nested-path-three-parts.output b/unified/extractor/tests/corpus/swift/desugar/import-with-deeply-nested-path-three-parts.output index 85e830e07383..a35890d96301 100644 --- a/unified/extractor/tests/corpus/swift/desugar/import-with-deeply-nested-path-three-parts.output +++ b/unified/extractor/tests/corpus/swift/desugar/import-with-deeply-nested-path-three-parts.output @@ -23,19 +23,19 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - import_declaration + import_declaration source="⟨pattern⟩⟨imported_expr⟩" imported_expr: - member_access_expr + member_access_expr source="⟨base⟩.⟨member_name_node⟩" base: - member_access_expr - base: identifier "Foundation" - member_name_node: identifier "Networking" - member_name_node: identifier "URLSession" + member_access_expr source="⟨base⟩.⟨member_name_node⟩" + base: identifier "Foundation" source="Foundation" + member_name_node: identifier "Networking" source="Networking" + member_name_node: identifier "URLSession" source="URLSession" pattern: - named_pattern - name_node: identifier "URLSession" - sub_pattern: bulk_importing_pattern "import Foundation.Networking.URLSession" + named_pattern source="⟨sub_pattern⟩⟨name_node⟩" + name_node: identifier "URLSession" source="URLSession" + sub_pattern: bulk_importing_pattern "import Foundation.Networking.URLSession" source="import Foundation.Networking.URLSession" diff --git a/unified/extractor/tests/corpus/swift/desugar/import-with-dotted-path-two-parts.output b/unified/extractor/tests/corpus/swift/desugar/import-with-dotted-path-two-parts.output index 966d399f070d..3f069a347481 100644 --- a/unified/extractor/tests/corpus/swift/desugar/import-with-dotted-path-two-parts.output +++ b/unified/extractor/tests/corpus/swift/desugar/import-with-dotted-path-two-parts.output @@ -20,16 +20,16 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - import_declaration + import_declaration source="⟨pattern⟩⟨imported_expr⟩" imported_expr: - member_access_expr - base: identifier "Foundation" - member_name_node: identifier "Networking" + member_access_expr source="⟨base⟩.⟨member_name_node⟩" + base: identifier "Foundation" source="Foundation" + member_name_node: identifier "Networking" source="Networking" pattern: - named_pattern - name_node: identifier "Networking" - sub_pattern: bulk_importing_pattern "import Foundation.Networking" + named_pattern source="⟨sub_pattern⟩⟨name_node⟩" + name_node: identifier "Networking" source="Networking" + sub_pattern: bulk_importing_pattern "import Foundation.Networking" source="import Foundation.Networking" diff --git a/unified/extractor/tests/corpus/swift/desugar/scoped-import-uses-name-pattern.output b/unified/extractor/tests/corpus/swift/desugar/scoped-import-uses-name-pattern.output index 6983e5408fbc..cd7415127b7e 100644 --- a/unified/extractor/tests/corpus/swift/desugar/scoped-import-uses-name-pattern.output +++ b/unified/extractor/tests/corpus/swift/desugar/scoped-import-uses-name-pattern.output @@ -21,14 +21,14 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - import_declaration - modifier: modifier "struct" + import_declaration source="import ⟨modifier⟩ ⟨imported_expr⟩⟨pattern⟩" + modifier: modifier "struct" source="struct" imported_expr: - member_access_expr - base: identifier "Foundation" - member_name_node: identifier "Date" - pattern: identifier "Date" + member_access_expr source="⟨base⟩.⟨member_name_node⟩" + base: identifier "Foundation" source="Foundation" + member_name_node: identifier "Date" source="Date" + pattern: identifier "Date" source="Date" diff --git a/unified/extractor/tests/corpus/swift/desugar/simple-import-with-single-name.output b/unified/extractor/tests/corpus/swift/desugar/simple-import-with-single-name.output index a7c401563932..d52673da8dda 100644 --- a/unified/extractor/tests/corpus/swift/desugar/simple-import-with-single-name.output +++ b/unified/extractor/tests/corpus/swift/desugar/simple-import-with-single-name.output @@ -17,13 +17,13 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - import_declaration - imported_expr: identifier "Foundation" + import_declaration source="⟨pattern⟩⟨imported_expr⟩" + imported_expr: identifier "Foundation" source="Foundation" pattern: - named_pattern - name_node: identifier "Foundation" - sub_pattern: bulk_importing_pattern "import Foundation" + named_pattern source="⟨sub_pattern⟩⟨name_node⟩" + name_node: identifier "Foundation" source="Foundation" + sub_pattern: bulk_importing_pattern "import Foundation" source="import Foundation" diff --git a/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.output b/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.output index 6f33fc0321a4..2ab188e028f7 100644 --- a/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.output +++ b/unified/extractor/tests/corpus/swift/expressions/array-type-constructor.output @@ -124,50 +124,50 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩\n⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "values" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "values" source="values" value: - call_expr + call_expr source="⟨callee⟩" callee: - generic_type_expr - base: identifier "Array" + generic_type_expr source="⟨base⟩⟨type_argument⟩" + base: identifier "Array" source="[Result]()" type_argument: - generic_type_expr - base: identifier "Result" - type_argument: identifier "Void" - variable_declaration - modifier: modifier "let" - pattern: identifier "initialized" + generic_type_expr source="⟨base⟩<⟨type_argument⟩>" + base: identifier "Result" source="Result" + type_argument: identifier "Void" source="Void" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "initialized" source="initialized" value: - call_expr + call_expr source="⟨argument⟩⟨callee⟩⟨argument⟩" callee: - generic_type_expr - base: identifier "Array" + generic_type_expr source="⟨base⟩⟨type_argument⟩" + base: identifier "Array" source="[Result](unsafeUninitializedCapacity: 1) { _, count in\n\tcount = 0\n}" type_argument: - generic_type_expr - base: identifier "Result" - type_argument: identifier "Void" + generic_type_expr source="⟨base⟩<⟨type_argument⟩>" + base: identifier "Result" source="Result" + type_argument: identifier "Void" source="Void" argument: - argument - name_node: identifier "unsafeUninitializedCapacity" - value: int_literal "1" - argument + argument source="⟨name_node⟩: ⟨value⟩" + name_node: identifier "unsafeUninitializedCapacity" source="unsafeUninitializedCapacity" + value: int_literal "1" source="1" + argument source="[Result](unsafeUninitializedCapacity: 1) ⟨value⟩" value: - function_expr + function_expr source="⟨body⟩⟨parameter⟩⟨parameter⟩" parameter: - parameter - pattern: identifier "_" - parameter - pattern: identifier "count" + parameter source="⟨pattern⟩," + pattern: identifier "_" source="_" + parameter source="⟨pattern⟩" + pattern: identifier "count" source="count" body: - block + block source="{ _, count in\n\t⟨stmt⟩\n}" stmt: - binary_expr - left: identifier "count" - operator: infix_operator "=" - right: int_literal "0" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "count" source="count" + operator: infix_operator "=" source="=" + right: int_literal "0" source="0" diff --git a/unified/extractor/tests/corpus/swift/expressions/array-type-metatype.output b/unified/extractor/tests/corpus/swift/expressions/array-type-metatype.output index 080cf34bb3c1..98c721af9fab 100644 --- a/unified/extractor/tests/corpus/swift/expressions/array-type-metatype.output +++ b/unified/extractor/tests/corpus/swift/expressions/array-type-metatype.output @@ -48,20 +48,20 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "type" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "type" source="type" value: - member_access_expr + member_access_expr source="⟨base⟩⟨member_name_node⟩" base: - generic_type_expr - base: identifier "Array" + generic_type_expr source="⟨base⟩⟨type_argument⟩" + base: identifier "Array" source="[Result].self" type_argument: - generic_type_expr - base: identifier "Result" - type_argument: identifier "Void" - member_name_node: identifier "self" + generic_type_expr source="⟨base⟩<⟨type_argument⟩>" + base: identifier "Result" source="Result" + type_argument: identifier "Void" source="Void" + member_name_node: identifier "self" source="self" diff --git a/unified/extractor/tests/corpus/swift/expressions/consume-expression.output b/unified/extractor/tests/corpus/swift/expressions/consume-expression.output index aedba985574d..3b9f369f8ad9 100644 --- a/unified/extractor/tests/corpus/swift/expressions/consume-expression.output +++ b/unified/extractor/tests/corpus/swift/expressions/consume-expression.output @@ -62,20 +62,20 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩\n⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "original" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "original" source="original" value: - array_literal + array_literal source="[⟨element⟩, ⟨element⟩, ⟨element⟩]" element: - int_literal "1" - int_literal "2" - int_literal "3" - variable_declaration - modifier: modifier "let" - pattern: identifier "consumed" - value: unsupported_node "consume original" + int_literal "1" source="1" + int_literal "2" source="2" + int_literal "3" source="3" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "consumed" source="consumed" + value: unsupported_node "consume original" source="consume original" diff --git a/unified/extractor/tests/corpus/swift/expressions/copy-expression.output b/unified/extractor/tests/corpus/swift/expressions/copy-expression.output index 448dd95e78b3..523e8c9dddec 100644 --- a/unified/extractor/tests/corpus/swift/expressions/copy-expression.output +++ b/unified/extractor/tests/corpus/swift/expressions/copy-expression.output @@ -62,20 +62,20 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩\n⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "original" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "original" source="original" value: - array_literal + array_literal source="[⟨element⟩, ⟨element⟩, ⟨element⟩]" element: - int_literal "1" - int_literal "2" - int_literal "3" - variable_declaration - modifier: modifier "let" - pattern: identifier "copied" - value: unsupported_node "copy original" + int_literal "1" source="1" + int_literal "2" source="2" + int_literal "3" source="3" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "copied" source="copied" + value: unsupported_node "copy original" source="copy original" diff --git a/unified/extractor/tests/corpus/swift/expressions/generic-specialization-expression.output b/unified/extractor/tests/corpus/swift/expressions/generic-specialization-expression.output index b8b3a5a7903f..f952f5a44509 100644 --- a/unified/extractor/tests/corpus/swift/expressions/generic-specialization-expression.output +++ b/unified/extractor/tests/corpus/swift/expressions/generic-specialization-expression.output @@ -42,16 +42,16 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "numbers" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "numbers" source="numbers" value: - call_expr + call_expr source="⟨callee⟩()" callee: - generic_type_expr - base: identifier "Array" - type_argument: identifier "Int" + generic_type_expr source="⟨base⟩<⟨type_argument⟩>" + base: identifier "Array" source="Array" + type_argument: identifier "Int" source="Int" diff --git a/unified/extractor/tests/corpus/swift/expressions/key-path-expression.output b/unified/extractor/tests/corpus/swift/expressions/key-path-expression.output index c71105e4ee2e..95a2a440847f 100644 --- a/unified/extractor/tests/corpus/swift/expressions/key-path-expression.output +++ b/unified/extractor/tests/corpus/swift/expressions/key-path-expression.output @@ -36,11 +36,11 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "keyPath" - value: unsupported_node "\\String.count" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "keyPath" source="keyPath" + value: unsupported_node "\\String.count" source="\\String.count" diff --git a/unified/extractor/tests/corpus/swift/expressions/unsafe-expression.output b/unified/extractor/tests/corpus/swift/expressions/unsafe-expression.output index a91bf6e2684c..06d2e76d6f55 100644 --- a/unified/extractor/tests/corpus/swift/expressions/unsafe-expression.output +++ b/unified/extractor/tests/corpus/swift/expressions/unsafe-expression.output @@ -41,11 +41,11 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩\n⟨stmt⟩" stmt: - function_declaration - name_node: identifier "doWork" - body: block "func doWork() {}" - unsupported_node "unsafe doWork()" + function_declaration source="⟨body⟩⟨name_node⟩" + name_node: identifier "doWork" source="doWork" + body: block "func doWork() {}" source="func doWork() {}" + unsupported_node "unsafe doWork()" source="unsafe doWork()" diff --git a/unified/extractor/tests/corpus/swift/functions/call-with-inout-argument.output b/unified/extractor/tests/corpus/swift/functions/call-with-inout-argument.output index 13e99e707a86..6899013425de 100644 --- a/unified/extractor/tests/corpus/swift/functions/call-with-inout-argument.output +++ b/unified/extractor/tests/corpus/swift/functions/call-with-inout-argument.output @@ -69,22 +69,22 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩\n⟨stmt⟩\n⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "var" - pattern: identifier "a" - value: int_literal "1" - variable_declaration - modifier: modifier "var" - pattern: identifier "b" - value: int_literal "2" - call_expr - callee: identifier "swap" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "var" source="var" + pattern: identifier "a" source="a" + value: int_literal "1" source="1" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "var" source="var" + pattern: identifier "b" source="b" + value: int_literal "2" source="2" + call_expr source="⟨callee⟩(⟨argument⟩ ⟨argument⟩)" + callee: identifier "swap" source="swap" argument: - argument - value: unsupported_node "&a" - argument - value: unsupported_node "&b" + argument source="⟨value⟩," + value: unsupported_node "&a" source="&a" + argument source="⟨value⟩" + value: unsupported_node "&b" source="&b" diff --git a/unified/extractor/tests/corpus/swift/functions/constructor-call-with-type-arguments.output b/unified/extractor/tests/corpus/swift/functions/constructor-call-with-type-arguments.output index baf959c0cc86..3ef240f3dfe5 100644 --- a/unified/extractor/tests/corpus/swift/functions/constructor-call-with-type-arguments.output +++ b/unified/extractor/tests/corpus/swift/functions/constructor-call-with-type-arguments.output @@ -76,25 +76,25 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩\n⟨stmt⟩\n⟨stmt⟩" stmt: - class_like_declaration - modifier: modifier "class" - name_node: identifier "Foo" - class_like_declaration - modifier: modifier "class" - name_node: identifier "C" + class_like_declaration source="⟨modifier⟩ ⟨name_node⟩ {}" + modifier: modifier "class" source="class" + name_node: identifier "Foo" source="Foo" + class_like_declaration source="⟨modifier⟩ ⟨name_node⟩<⟨type_parameter⟩> {}" + modifier: modifier "class" source="class" + name_node: identifier "C" source="C" type_parameter: - type_parameter - name_node: identifier "T" - variable_declaration - modifier: modifier "let" - pattern: identifier "x" + type_parameter source="⟨name_node⟩" + name_node: identifier "T" source="T" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "x" source="x" value: - call_expr + call_expr source="⟨callee⟩()" callee: - generic_type_expr - base: identifier "C" - type_argument: identifier "Foo" + generic_type_expr source="⟨base⟩<⟨type_argument⟩>" + base: identifier "C" source="C" + type_argument: identifier "Foo" source="Foo" diff --git a/unified/extractor/tests/corpus/swift/functions/function-call-with-labelled-arguments.output b/unified/extractor/tests/corpus/swift/functions/function-call-with-labelled-arguments.output index 81c2af30295d..48de52d425d8 100644 --- a/unified/extractor/tests/corpus/swift/functions/function-call-with-labelled-arguments.output +++ b/unified/extractor/tests/corpus/swift/functions/function-call-with-labelled-arguments.output @@ -28,13 +28,13 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - call_expr - callee: identifier "greet" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "greet" source="greet" argument: - argument - name_node: identifier "person" - value: string_literal "\"Bob\"" + argument source="⟨name_node⟩: ⟨value⟩" + name_node: identifier "person" source="person" + value: string_literal "\"Bob\"" source="\"Bob\"" diff --git a/unified/extractor/tests/corpus/swift/functions/function-call.output b/unified/extractor/tests/corpus/swift/functions/function-call.output index 35cac76d7bd1..6f25208b0189 100644 --- a/unified/extractor/tests/corpus/swift/functions/function-call.output +++ b/unified/extractor/tests/corpus/swift/functions/function-call.output @@ -27,14 +27,14 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - call_expr - callee: identifier "foo" + call_expr source="⟨callee⟩(⟨argument⟩ ⟨argument⟩)" + callee: identifier "foo" source="foo" argument: - argument - value: int_literal "1" - argument - value: int_literal "2" + argument source="⟨value⟩," + value: int_literal "1" source="1" + argument source="⟨value⟩" + value: int_literal "2" source="2" diff --git a/unified/extractor/tests/corpus/swift/functions/function-with-default-parameter-value.output b/unified/extractor/tests/corpus/swift/functions/function-with-default-parameter-value.output index 3d4c6483cb50..65da7fc5c00f 100644 --- a/unified/extractor/tests/corpus/swift/functions/function-with-default-parameter-value.output +++ b/unified/extractor/tests/corpus/swift/functions/function-with-default-parameter-value.output @@ -61,22 +61,22 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - function_declaration - name_node: identifier "greet" + function_declaration source="⟨body⟩⟨name_node⟩⟨parameter⟩" + name_node: identifier "greet" source="greet" parameter: - parameter - type: identifier "String" - pattern: identifier "name" - default: string_literal "\"world\"" + parameter source="⟨pattern⟩: ⟨type⟩ = ⟨default⟩" + type: identifier "String" source="String" + pattern: identifier "name" source="name" + default: string_literal "\"world\"" source="\"world\"" body: - block + block source="func greet(name: String = \"world\") {\n ⟨stmt⟩\n}" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: identifier "name" + argument source="⟨value⟩" + value: identifier "name" source="name" diff --git a/unified/extractor/tests/corpus/swift/functions/function-with-inout-parameter.output b/unified/extractor/tests/corpus/swift/functions/function-with-inout-parameter.output index 83e3c7a53c2d..54133b022968 100644 --- a/unified/extractor/tests/corpus/swift/functions/function-with-inout-parameter.output +++ b/unified/extractor/tests/corpus/swift/functions/function-with-inout-parameter.output @@ -57,21 +57,21 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - function_declaration - name_node: identifier "increment" + function_declaration source="⟨body⟩⟨name_node⟩⟨parameter⟩" + name_node: identifier "increment" source="increment" parameter: - parameter - external_name_node: identifier "_" - type: unsupported_node "inout Int" - pattern: identifier "x" + parameter source="⟨external_name_node⟩ ⟨pattern⟩: ⟨type⟩" + external_name_node: identifier "_" source="_" + type: unsupported_node "inout Int" source="inout Int" + pattern: identifier "x" source="x" body: - block + block source="func increment(_ x: inout Int) {\n ⟨stmt⟩\n}" stmt: - binary_expr - left: identifier "x" - operator: infix_operator "+=" - right: int_literal "1" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "x" source="x" + operator: infix_operator "+=" source="+=" + right: int_literal "1" source="1" diff --git a/unified/extractor/tests/corpus/swift/functions/function-with-named-parameters.output b/unified/extractor/tests/corpus/swift/functions/function-with-named-parameters.output index 6ad2a386ae8e..96d34925e8e7 100644 --- a/unified/extractor/tests/corpus/swift/functions/function-with-named-parameters.output +++ b/unified/extractor/tests/corpus/swift/functions/function-with-named-parameters.output @@ -52,22 +52,22 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - function_declaration - name_node: identifier "greet" + function_declaration source="⟨body⟩⟨name_node⟩⟨parameter⟩" + name_node: identifier "greet" source="greet" parameter: - parameter - external_name_node: identifier "person" - type: identifier "String" - pattern: identifier "name" + parameter source="⟨external_name_node⟩ ⟨pattern⟩: ⟨type⟩" + external_name_node: identifier "person" source="person" + type: identifier "String" source="String" + pattern: identifier "name" source="name" body: - block + block source="func greet(person name: String) {\n ⟨stmt⟩\n}" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: identifier "name" + argument source="⟨value⟩" + value: identifier "name" source="name" diff --git a/unified/extractor/tests/corpus/swift/functions/function-with-no-parameters.output b/unified/extractor/tests/corpus/swift/functions/function-with-no-parameters.output index 39c0b67786e2..901624c3b423 100644 --- a/unified/extractor/tests/corpus/swift/functions/function-with-no-parameters.output +++ b/unified/extractor/tests/corpus/swift/functions/function-with-no-parameters.output @@ -47,17 +47,17 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - function_declaration - name_node: identifier "greet" + function_declaration source="⟨body⟩⟨name_node⟩" + name_node: identifier "greet" source="greet" body: - block + block source="func greet() {\n ⟨stmt⟩\n}" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: string_literal "\"hello\"" + argument source="⟨value⟩" + value: string_literal "\"hello\"" source="\"hello\"" diff --git a/unified/extractor/tests/corpus/swift/functions/function-with-parameters-and-return-type.output b/unified/extractor/tests/corpus/swift/functions/function-with-parameters-and-return-type.output index 88311a0596e7..1c200d26c675 100644 --- a/unified/extractor/tests/corpus/swift/functions/function-with-parameters-and-return-type.output +++ b/unified/extractor/tests/corpus/swift/functions/function-with-parameters-and-return-type.output @@ -69,28 +69,28 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - function_declaration - name_node: identifier "add" + function_declaration source="⟨body⟩⟨name_node⟩⟨parameter⟩⟨parameter⟩⟨return_type⟩" + name_node: identifier "add" source="add" parameter: - parameter - external_name_node: identifier "_" - type: identifier "Int" - pattern: identifier "a" - parameter - external_name_node: identifier "_" - type: identifier "Int" - pattern: identifier "b" - return_type: identifier "Int" + parameter source="⟨external_name_node⟩ ⟨pattern⟩: ⟨type⟩," + external_name_node: identifier "_" source="_" + type: identifier "Int" source="Int" + pattern: identifier "a" source="a" + parameter source="⟨external_name_node⟩ ⟨pattern⟩: ⟨type⟩" + external_name_node: identifier "_" source="_" + type: identifier "Int" source="Int" + pattern: identifier "b" source="b" + return_type: identifier "Int" source="Int" body: - block + block source="func add(_ a: Int, _ b: Int) -> Int {\n ⟨stmt⟩\n}" stmt: - return_expr + return_expr source="return ⟨value⟩" value: - binary_expr - left: identifier "a" - operator: infix_operator "+" - right: identifier "b" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "a" source="a" + operator: infix_operator "+" source="+" + right: identifier "b" source="b" diff --git a/unified/extractor/tests/corpus/swift/functions/generic-function.output b/unified/extractor/tests/corpus/swift/functions/generic-function.output index 646ee6196166..280996f96f32 100644 --- a/unified/extractor/tests/corpus/swift/functions/generic-function.output +++ b/unified/extractor/tests/corpus/swift/functions/generic-function.output @@ -59,23 +59,23 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - function_declaration - name_node: identifier "identity" + function_declaration source="⟨body⟩⟨name_node⟩⟨type_parameter⟩⟨parameter⟩⟨return_type⟩" + name_node: identifier "identity" source="identity" type_parameter: - type_parameter - name_node: identifier "T" + type_parameter source="⟨name_node⟩" + name_node: identifier "T" source="T" parameter: - parameter - external_name_node: identifier "_" - type: identifier "T" - pattern: identifier "x" - return_type: identifier "T" + parameter source="⟨external_name_node⟩ ⟨pattern⟩: ⟨type⟩" + external_name_node: identifier "_" source="_" + type: identifier "T" source="T" + pattern: identifier "x" source="x" + return_type: identifier "T" source="T" body: - block + block source="func identity(_ x: T) -> T {\n ⟨stmt⟩\n}" stmt: - return_expr - value: identifier "x" + return_expr source="return ⟨value⟩" + value: identifier "x" source="x" diff --git a/unified/extractor/tests/corpus/swift/functions/generic-type-alias.output b/unified/extractor/tests/corpus/swift/functions/generic-type-alias.output index 459aec5b784c..5f06367b306b 100644 --- a/unified/extractor/tests/corpus/swift/functions/generic-type-alias.output +++ b/unified/extractor/tests/corpus/swift/functions/generic-type-alias.output @@ -51,21 +51,21 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - type_alias_declaration - name_node: identifier "Box" + type_alias_declaration source="typealias ⟨name_node⟩<⟨type_parameter⟩ ⟨type_parameter⟩> = ⟨type⟩" + name_node: identifier "Box" source="Box" type_parameter: - type_parameter - name_node: identifier "T" - bound: identifier "Equatable" - type_parameter - name_node: identifier "U" + type_parameter source="⟨name_node⟩: ⟨bound⟩," + name_node: identifier "T" source="T" + bound: identifier "Equatable" source="Equatable" + type_parameter source="⟨name_node⟩" + name_node: identifier "U" source="U" type: - generic_type_expr - base: identifier "Dictionary" + generic_type_expr source="⟨base⟩<⟨type_argument⟩, ⟨type_argument⟩>" + base: identifier "Dictionary" source="Dictionary" type_argument: - identifier "T" - identifier "U" + identifier "T" source="T" + identifier "U" source="U" diff --git a/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-call.output b/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-call.output index 5cb220bbb681..3335f2ba054b 100644 --- a/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-call.output +++ b/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-call.output @@ -38,19 +38,19 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "y" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "y" source="y" value: - call_expr + call_expr source="⟨callee⟩(⟨argument⟩)" callee: - member_access_expr - base: inferred_type_expr "." - member_name_node: identifier "some" + member_access_expr source="⟨base⟩⟨member_name_node⟩" + base: inferred_type_expr "." source="." + member_name_node: identifier "some" source="some" argument: - argument - value: int_literal "1" + argument source="⟨value⟩" + value: int_literal "1" source="1" diff --git a/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-value.output b/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-value.output index 1c2eab54b2ef..233ba6d5c1a7 100644 --- a/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-value.output +++ b/unified/extractor/tests/corpus/swift/functions/leading-dot-expression-value.output @@ -28,14 +28,14 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "x" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "x" source="x" value: - member_access_expr - base: inferred_type_expr "." - member_name_node: identifier "foo" + member_access_expr source="⟨base⟩⟨member_name_node⟩" + base: inferred_type_expr "." source="." + member_name_node: identifier "foo" source="foo" diff --git a/unified/extractor/tests/corpus/swift/functions/method-call.output b/unified/extractor/tests/corpus/swift/functions/method-call.output index 52a36238c2d5..62c9506ef630 100644 --- a/unified/extractor/tests/corpus/swift/functions/method-call.output +++ b/unified/extractor/tests/corpus/swift/functions/method-call.output @@ -28,15 +28,15 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - call_expr + call_expr source="⟨callee⟩(⟨argument⟩)" callee: - member_access_expr - base: identifier "list" - member_name_node: identifier "append" + member_access_expr source="⟨base⟩.⟨member_name_node⟩" + base: identifier "list" source="list" + member_name_node: identifier "append" source="append" argument: - argument - value: int_literal "1" + argument source="⟨value⟩" + value: int_literal "1" source="1" diff --git a/unified/extractor/tests/corpus/swift/functions/nested-function-type.output b/unified/extractor/tests/corpus/swift/functions/nested-function-type.output index b14135c1065c..d78d47dbbbb4 100644 --- a/unified/extractor/tests/corpus/swift/functions/nested-function-type.output +++ b/unified/extractor/tests/corpus/swift/functions/nested-function-type.output @@ -100,41 +100,41 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩\n\n⟨stmt⟩" stmt: - type_alias_declaration - name_node: identifier "NestedFunction" + type_alias_declaration source="typealias ⟨name_node⟩ = ⟨type⟩" + name_node: identifier "NestedFunction" source="NestedFunction" type: - function_expr + function_expr source="(⟨parameter⟩) -> ⟨return_type⟩" parameter: - parameter + parameter source="⟨type⟩" type: - function_expr + function_expr source="(⟨parameter⟩) -> ⟨return_type⟩" parameter: - parameter - type: identifier "Int" - return_type: identifier "Bool" - return_type: identifier "Bool" - type_alias_declaration - name_node: identifier "MixedParametersAndTuples" + parameter source="⟨type⟩" + type: identifier "Int" source="Int" + return_type: identifier "Bool" source="Bool" + return_type: identifier "Bool" source="Bool" + type_alias_declaration source="typealias ⟨name_node⟩ = ⟨type⟩" + name_node: identifier "MixedParametersAndTuples" source="MixedParametersAndTuples" type: - function_expr + function_expr source="(⟨parameter⟩ ⟨parameter⟩) -> ⟨return_type⟩" parameter: - parameter + parameter source="⟨type⟩," type: - function_expr + function_expr source="(⟨parameter⟩) -> ⟨return_type⟩" parameter: - parameter - type: identifier "Int" - return_type: identifier "Bool" - parameter - type: identifier "String" + parameter source="⟨type⟩" + type: identifier "Int" source="Int" + return_type: identifier "Bool" source="Bool" + parameter source="⟨type⟩" + type: identifier "String" source="String" return_type: - tuple_expr + tuple_expr source="(⟨element⟩ ⟨element⟩)" element: - argument - value: identifier "Bool" - argument - value: identifier "Int" + argument source="⟨value⟩," + value: identifier "Bool" source="Bool" + argument source="⟨value⟩" + value: identifier "Int" source="Int" diff --git a/unified/extractor/tests/corpus/swift/functions/variadic-function.output b/unified/extractor/tests/corpus/swift/functions/variadic-function.output index 79384b19b20f..0f73aabfd8cd 100644 --- a/unified/extractor/tests/corpus/swift/functions/variadic-function.output +++ b/unified/extractor/tests/corpus/swift/functions/variadic-function.output @@ -73,30 +73,30 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - function_declaration - name_node: identifier "sum" + function_declaration source="⟨body⟩⟨name_node⟩⟨parameter⟩⟨return_type⟩" + name_node: identifier "sum" source="sum" parameter: - parameter - external_name_node: identifier "_" - type: identifier "Int" - pattern: identifier "values" - return_type: identifier "Int" + parameter source="⟨external_name_node⟩ ⟨pattern⟩: ⟨type⟩..." + external_name_node: identifier "_" source="_" + type: identifier "Int" source="Int" + pattern: identifier "values" source="values" + return_type: identifier "Int" source="Int" body: - block + block source="func sum(_ values: Int...) -> Int {\n ⟨stmt⟩\n}" stmt: - return_expr + return_expr source="return ⟨value⟩" value: - call_expr + call_expr source="⟨callee⟩(⟨argument⟩ ⟨argument⟩)" callee: - member_access_expr - base: identifier "values" - member_name_node: identifier "reduce" + member_access_expr source="⟨base⟩.⟨member_name_node⟩" + base: identifier "values" source="values" + member_name_node: identifier "reduce" source="reduce" argument: - argument - value: int_literal "0" - argument - value: identifier "+" + argument source="⟨value⟩," + value: int_literal "0" source="0" + argument source="⟨value⟩" + value: identifier "+" source="+" diff --git a/unified/extractor/tests/corpus/swift/literals/boolean-literals.output b/unified/extractor/tests/corpus/swift/literals/boolean-literals.output index 34b394712a35..53e784af9d5a 100644 --- a/unified/extractor/tests/corpus/swift/literals/boolean-literals.output +++ b/unified/extractor/tests/corpus/swift/literals/boolean-literals.output @@ -17,9 +17,9 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩\n⟨stmt⟩" stmt: - boolean_literal "true" - boolean_literal "false" + boolean_literal "true" source="true" + boolean_literal "false" source="false" diff --git a/unified/extractor/tests/corpus/swift/literals/floating-point-literal.output b/unified/extractor/tests/corpus/swift/literals/floating-point-literal.output index 19fa40aac776..879eb5b3f020 100644 --- a/unified/extractor/tests/corpus/swift/literals/floating-point-literal.output +++ b/unified/extractor/tests/corpus/swift/literals/floating-point-literal.output @@ -12,7 +12,7 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block - stmt: float_literal "3.14" + block source="⟨stmt⟩" + stmt: float_literal "3.14" source="3.14" diff --git a/unified/extractor/tests/corpus/swift/literals/integer-literal.output b/unified/extractor/tests/corpus/swift/literals/integer-literal.output index 9df79925753c..9e86858d7bdf 100644 --- a/unified/extractor/tests/corpus/swift/literals/integer-literal.output +++ b/unified/extractor/tests/corpus/swift/literals/integer-literal.output @@ -12,7 +12,7 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block - stmt: int_literal "42" + block source="⟨stmt⟩" + stmt: int_literal "42" source="42" diff --git a/unified/extractor/tests/corpus/swift/literals/line-magic-literal.output b/unified/extractor/tests/corpus/swift/literals/line-magic-literal.output index 291ab41d8fe4..bfb9b2e09eac 100644 --- a/unified/extractor/tests/corpus/swift/literals/line-magic-literal.output +++ b/unified/extractor/tests/corpus/swift/literals/line-magic-literal.output @@ -28,11 +28,11 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "currentLine" - value: unsupported_node "#line" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "currentLine" source="currentLine" + value: unsupported_node "#line" source="#line" diff --git a/unified/extractor/tests/corpus/swift/literals/negative-integer-literal.output b/unified/extractor/tests/corpus/swift/literals/negative-integer-literal.output index 907944054782..99c94b78bf86 100644 --- a/unified/extractor/tests/corpus/swift/literals/negative-integer-literal.output +++ b/unified/extractor/tests/corpus/swift/literals/negative-integer-literal.output @@ -15,10 +15,10 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - unary_expr - operand: int_literal "7" - operator: prefix_operator "-" + unary_expr source="⟨operator⟩⟨operand⟩" + operand: int_literal "7" source="7" + operator: prefix_operator "-" source="-" diff --git a/unified/extractor/tests/corpus/swift/literals/nil-literal.output b/unified/extractor/tests/corpus/swift/literals/nil-literal.output index c7da232131fd..a81d5a2fd1e1 100644 --- a/unified/extractor/tests/corpus/swift/literals/nil-literal.output +++ b/unified/extractor/tests/corpus/swift/literals/nil-literal.output @@ -12,7 +12,7 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block - stmt: builtin_expr "nil" + block source="⟨stmt⟩" + stmt: builtin_expr "nil" source="nil" diff --git a/unified/extractor/tests/corpus/swift/literals/string-literal.output b/unified/extractor/tests/corpus/swift/literals/string-literal.output index 8d3ea8e796c0..f24e74608866 100644 --- a/unified/extractor/tests/corpus/swift/literals/string-literal.output +++ b/unified/extractor/tests/corpus/swift/literals/string-literal.output @@ -16,7 +16,7 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block - stmt: string_literal "\"hello\"" + block source="⟨stmt⟩" + stmt: string_literal "\"hello\"" source="\"hello\"" diff --git a/unified/extractor/tests/corpus/swift/literals/string-with-interpolation.output b/unified/extractor/tests/corpus/swift/literals/string-with-interpolation.output index 4d8a2706c66e..6e02c0f92968 100644 --- a/unified/extractor/tests/corpus/swift/literals/string-with-interpolation.output +++ b/unified/extractor/tests/corpus/swift/literals/string-with-interpolation.output @@ -221,100 +221,100 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩\n\n// Multiple interpolations\n⟨stmt⟩\n\n// Interpolation with expression\n⟨stmt⟩\n\n// Plain string before and after interpolation\n⟨stmt⟩\n\n// Calls to custom DefaultStringInterpolation.appendInterpolation impls\n⟨stmt⟩\n⟨stmt⟩\n⟨stmt⟩\n⟨stmt⟩" stmt: - string_interpolation_expr + string_interpolation_expr source="\"⟨element⟩⟨element⟩\"" element: - string_literal "hello " - call_expr - callee: builtin_expr "interpolation" + string_literal "hello " source="hello " + call_expr source="⟨callee⟩⟨argument⟩" + callee: builtin_expr "interpolation" source="\\(name)" argument: - argument - value: identifier "name" - string_literal - string_interpolation_expr + argument source="⟨value⟩" + value: identifier "name" source="name" + string_literal source="" + string_interpolation_expr source="\"⟨element⟩⟨element⟩⟨element⟩⟨element⟩\"" element: - string_literal "hello " - call_expr - callee: builtin_expr "interpolation" + string_literal "hello " source="hello " + call_expr source="⟨callee⟩⟨argument⟩" + callee: builtin_expr "interpolation" source="\\(first)" argument: - argument - value: identifier "first" - string_literal " " - call_expr - callee: builtin_expr "interpolation" + argument source="⟨value⟩" + value: identifier "first" source="first" + string_literal " " source=" " + call_expr source="⟨callee⟩⟨argument⟩" + callee: builtin_expr "interpolation" source="\\(last)" argument: - argument - value: identifier "last" - string_literal - string_interpolation_expr + argument source="⟨value⟩" + value: identifier "last" source="last" + string_literal source="" + string_interpolation_expr source="\"⟨element⟩⟨element⟩\"" element: - string_literal "result: " - call_expr - callee: builtin_expr "interpolation" + string_literal "result: " source="result: " + call_expr source="⟨callee⟩⟨argument⟩" + callee: builtin_expr "interpolation" source="\\(x + y)" argument: - argument + argument source="⟨value⟩" value: - binary_expr - left: identifier "x" - operator: infix_operator "+" - right: identifier "y" - string_literal - string_interpolation_expr + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "x" source="x" + operator: infix_operator "+" source="+" + right: identifier "y" source="y" + string_literal source="" + string_interpolation_expr source="\"⟨element⟩⟨element⟩⟨element⟩\"" element: - string_literal "prefix " - call_expr - callee: builtin_expr "interpolation" + string_literal "prefix " source="prefix " + call_expr source="⟨callee⟩⟨argument⟩" + callee: builtin_expr "interpolation" source="\\(value)" argument: - argument - value: identifier "value" - string_literal " suffix" - string_interpolation_expr + argument source="⟨value⟩" + value: identifier "value" source="value" + string_literal " suffix" source=" suffix" + string_interpolation_expr source="\"⟨element⟩⟨element⟩\"" element: - string_literal "foo " - call_expr - callee: builtin_expr "interpolation" + string_literal "foo " source="foo " + call_expr source="⟨callee⟩⟨argument⟩⟨argument⟩" + callee: builtin_expr "interpolation" source="\\(x, y)" argument: - argument - value: identifier "x" - argument - value: identifier "y" - string_literal - string_interpolation_expr + argument source="⟨value⟩," + value: identifier "x" source="x" + argument source="⟨value⟩" + value: identifier "y" source="y" + string_literal source="" + string_interpolation_expr source="\"⟨element⟩⟨element⟩\"" element: - string_literal "foo " - call_expr - callee: builtin_expr "interpolation" + string_literal "foo " source="foo " + call_expr source="⟨callee⟩⟨argument⟩⟨argument⟩⟨argument⟩" + callee: builtin_expr "interpolation" source="\\(x, y, z)" argument: - argument - value: identifier "x" - argument - value: identifier "y" - argument - value: identifier "z" - string_literal - string_interpolation_expr + argument source="⟨value⟩," + value: identifier "x" source="x" + argument source="⟨value⟩," + value: identifier "y" source="y" + argument source="⟨value⟩" + value: identifier "z" source="z" + string_literal source="" + string_interpolation_expr source="\"⟨element⟩⟨element⟩\"" element: - string_literal "foo " - call_expr - callee: builtin_expr "interpolation" + string_literal "foo " source="foo " + call_expr source="⟨callee⟩⟨argument⟩" + callee: builtin_expr "interpolation" source="\\(arg: x)" argument: - argument - name_node: identifier "arg" - value: identifier "x" - string_literal - string_interpolation_expr + argument source="⟨name_node⟩: ⟨value⟩" + name_node: identifier "arg" source="arg" + value: identifier "x" source="x" + string_literal source="" + string_interpolation_expr source="\"⟨element⟩⟨element⟩\"" element: - string_literal "foo " - call_expr - callee: builtin_expr "interpolation" + string_literal "foo " source="foo " + call_expr source="⟨callee⟩⟨argument⟩⟨argument⟩" + callee: builtin_expr "interpolation" source="\\(arg: x, arg2: y)" argument: - argument - name_node: identifier "arg" - value: identifier "x" - argument - name_node: identifier "arg2" - value: identifier "y" - string_literal + argument source="⟨name_node⟩: ⟨value⟩," + name_node: identifier "arg" source="arg" + value: identifier "x" source="x" + argument source="⟨name_node⟩: ⟨value⟩" + name_node: identifier "arg2" source="arg2" + value: identifier "y" source="y" + string_literal source="" diff --git a/unified/extractor/tests/corpus/swift/loops/break-and-continue.output b/unified/extractor/tests/corpus/swift/loops/break-and-continue.output index 4143f2a5b99b..c24ef267ec62 100644 --- a/unified/extractor/tests/corpus/swift/loops/break-and-continue.output +++ b/unified/extractor/tests/corpus/swift/loops/break-and-continue.output @@ -98,36 +98,36 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - for_each_stmt - pattern: identifier "x" - iterable: identifier "xs" + for_each_stmt source="for ⟨pattern⟩ in ⟨iterable⟩ ⟨body⟩" + pattern: identifier "x" source="x" + iterable: identifier "xs" source="xs" body: - block + block source="{\n ⟨stmt⟩\n ⟨stmt⟩\n ⟨stmt⟩\n}" stmt: - if_expr + if_expr source="if ⟨condition⟩ ⟨then⟩" condition: - binary_expr - left: identifier "x" - operator: infix_operator "<" - right: int_literal "0" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "x" source="x" + operator: infix_operator "<" source="<" + right: int_literal "0" source="0" then: - block - stmt: continue_expr "continue" - if_expr + block source="{ ⟨stmt⟩ }" + stmt: continue_expr "continue" source="continue" + if_expr source="if ⟨condition⟩ ⟨then⟩" condition: - binary_expr - left: identifier "x" - operator: infix_operator ">" - right: int_literal "100" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "x" source="x" + operator: infix_operator ">" source=">" + right: int_literal "100" source="100" then: - block - stmt: break_expr "break" - call_expr - callee: identifier "print" + block source="{ ⟨stmt⟩ }" + stmt: break_expr "break" source="break" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: identifier "x" + argument source="⟨value⟩" + value: identifier "x" source="x" diff --git a/unified/extractor/tests/corpus/swift/loops/for-in-over-array-literal.output b/unified/extractor/tests/corpus/swift/loops/for-in-over-array-literal.output index 3eb9c22f53a7..4d927aad290c 100644 --- a/unified/extractor/tests/corpus/swift/loops/for-in-over-array-literal.output +++ b/unified/extractor/tests/corpus/swift/loops/for-in-over-array-literal.output @@ -56,23 +56,23 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - for_each_stmt - pattern: identifier "x" + for_each_stmt source="for ⟨pattern⟩ in ⟨iterable⟩ ⟨body⟩" + pattern: identifier "x" source="x" iterable: - array_literal + array_literal source="[⟨element⟩, ⟨element⟩, ⟨element⟩]" element: - int_literal "1" - int_literal "2" - int_literal "3" + int_literal "1" source="1" + int_literal "2" source="2" + int_literal "3" source="3" body: - block + block source="{\n ⟨stmt⟩\n}" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: identifier "x" + argument source="⟨value⟩" + value: identifier "x" source="x" diff --git a/unified/extractor/tests/corpus/swift/loops/for-in-over-range.output b/unified/extractor/tests/corpus/swift/loops/for-in-over-range.output index 2dd2f67df8b2..856aaf792846 100644 --- a/unified/extractor/tests/corpus/swift/loops/for-in-over-range.output +++ b/unified/extractor/tests/corpus/swift/loops/for-in-over-range.output @@ -48,22 +48,22 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - for_each_stmt - pattern: identifier "i" + for_each_stmt source="for ⟨pattern⟩ in ⟨iterable⟩ ⟨body⟩" + pattern: identifier "i" source="i" iterable: - binary_expr - left: int_literal "0" - operator: infix_operator "..<" - right: int_literal "10" + binary_expr source="⟨left⟩⟨operator⟩⟨right⟩" + left: int_literal "0" source="0" + operator: infix_operator "..<" source="..<" + right: int_literal "10" source="10" body: - block + block source="{\n ⟨stmt⟩\n}" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: identifier "i" + argument source="⟨value⟩" + value: identifier "i" source="i" diff --git a/unified/extractor/tests/corpus/swift/loops/for-in-with-where-clause.output b/unified/extractor/tests/corpus/swift/loops/for-in-with-where-clause.output index febf7450e2d1..412fc6b3672c 100644 --- a/unified/extractor/tests/corpus/swift/loops/for-in-with-where-clause.output +++ b/unified/extractor/tests/corpus/swift/loops/for-in-with-where-clause.output @@ -54,23 +54,23 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - for_each_stmt - pattern: identifier "x" - iterable: identifier "xs" + for_each_stmt source="for ⟨pattern⟩ in ⟨iterable⟩ where ⟨guard⟩ ⟨body⟩" + pattern: identifier "x" source="x" + iterable: identifier "xs" source="xs" guard: - binary_expr - left: identifier "x" - operator: infix_operator ">" - right: int_literal "0" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "x" source="x" + operator: infix_operator ">" source=">" + right: int_literal "0" source="0" body: - block + block source="{\n ⟨stmt⟩\n}" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: identifier "x" + argument source="⟨value⟩" + value: identifier "x" source="x" diff --git a/unified/extractor/tests/corpus/swift/loops/repeat-while-loop.output b/unified/extractor/tests/corpus/swift/loops/repeat-while-loop.output index 6287bbaa9bfc..53e4be6b6e5a 100644 --- a/unified/extractor/tests/corpus/swift/loops/repeat-while-loop.output +++ b/unified/extractor/tests/corpus/swift/loops/repeat-while-loop.output @@ -43,20 +43,20 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - do_while_stmt + do_while_stmt source="repeat ⟨body⟩ while ⟨condition⟩" body: - block + block source="{\n ⟨stmt⟩\n}" stmt: - binary_expr - left: identifier "x" - operator: infix_operator "-=" - right: int_literal "1" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "x" source="x" + operator: infix_operator "-=" source="-=" + right: int_literal "1" source="1" condition: - binary_expr - left: identifier "x" - operator: infix_operator ">" - right: int_literal "0" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "x" source="x" + operator: infix_operator ">" source=">" + right: int_literal "0" source="0" diff --git a/unified/extractor/tests/corpus/swift/loops/while-loop.output b/unified/extractor/tests/corpus/swift/loops/while-loop.output index f4f64cfca6bc..e9e6d67c3bb5 100644 --- a/unified/extractor/tests/corpus/swift/loops/while-loop.output +++ b/unified/extractor/tests/corpus/swift/loops/while-loop.output @@ -44,20 +44,20 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - while_stmt + while_stmt source="while ⟨condition⟩ ⟨body⟩" condition: - binary_expr - left: identifier "x" - operator: infix_operator ">" - right: int_literal "0" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "x" source="x" + operator: infix_operator ">" source=">" + right: int_literal "0" source="0" body: - block + block source="{\n ⟨stmt⟩\n}" stmt: - binary_expr - left: identifier "x" - operator: infix_operator "-=" - right: int_literal "1" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "x" source="x" + operator: infix_operator "-=" source="-=" + right: int_literal "1" source="1" diff --git a/unified/extractor/tests/corpus/swift/operators/addition.output b/unified/extractor/tests/corpus/swift/operators/addition.output index d7607c50c10c..20e75d76b371 100644 --- a/unified/extractor/tests/corpus/swift/operators/addition.output +++ b/unified/extractor/tests/corpus/swift/operators/addition.output @@ -20,11 +20,11 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - binary_expr - left: identifier "a" - operator: infix_operator "+" - right: identifier "b" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "a" source="a" + operator: infix_operator "+" source="+" + right: identifier "b" source="b" diff --git a/unified/extractor/tests/corpus/swift/operators/comparison.output b/unified/extractor/tests/corpus/swift/operators/comparison.output index 98d11f401bc8..01e9bc0d8de1 100644 --- a/unified/extractor/tests/corpus/swift/operators/comparison.output +++ b/unified/extractor/tests/corpus/swift/operators/comparison.output @@ -20,11 +20,11 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - binary_expr - left: identifier "a" - operator: infix_operator "<" - right: identifier "b" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "a" source="a" + operator: infix_operator "<" source="<" + right: identifier "b" source="b" diff --git a/unified/extractor/tests/corpus/swift/operators/custom-postfix-operator.output b/unified/extractor/tests/corpus/swift/operators/custom-postfix-operator.output index df8ad5e47745..cc73dce357e5 100644 --- a/unified/extractor/tests/corpus/swift/operators/custom-postfix-operator.output +++ b/unified/extractor/tests/corpus/swift/operators/custom-postfix-operator.output @@ -35,12 +35,12 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩\n⟨stmt⟩" stmt: - unsupported_node "postfix operator ^^" - variable_declaration - modifier: modifier "let" - pattern: identifier "squared" - value: unsupported_node "3^^" + unsupported_node "postfix operator ^^" source="postfix operator ^^" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "squared" source="squared" + value: unsupported_node "3^^" source="3^^" diff --git a/unified/extractor/tests/corpus/swift/operators/division.output b/unified/extractor/tests/corpus/swift/operators/division.output index 306a3639b3e1..5400b45146f1 100644 --- a/unified/extractor/tests/corpus/swift/operators/division.output +++ b/unified/extractor/tests/corpus/swift/operators/division.output @@ -20,11 +20,11 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - binary_expr - left: identifier "a" - operator: infix_operator "/" - right: identifier "b" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "a" source="a" + operator: infix_operator "/" source="/" + right: identifier "b" source="b" diff --git a/unified/extractor/tests/corpus/swift/operators/equality.output b/unified/extractor/tests/corpus/swift/operators/equality.output index 7280d13ff1aa..a6f92fa7471e 100644 --- a/unified/extractor/tests/corpus/swift/operators/equality.output +++ b/unified/extractor/tests/corpus/swift/operators/equality.output @@ -20,11 +20,11 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - binary_expr - left: identifier "a" - operator: infix_operator "==" - right: identifier "b" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "a" source="a" + operator: infix_operator "==" source="==" + right: identifier "b" source="b" diff --git a/unified/extractor/tests/corpus/swift/operators/logical-and.output b/unified/extractor/tests/corpus/swift/operators/logical-and.output index 102b83ec6ed4..1b652d920be4 100644 --- a/unified/extractor/tests/corpus/swift/operators/logical-and.output +++ b/unified/extractor/tests/corpus/swift/operators/logical-and.output @@ -20,11 +20,11 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - binary_expr - left: identifier "a" - operator: infix_operator "&&" - right: identifier "b" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "a" source="a" + operator: infix_operator "&&" source="&&" + right: identifier "b" source="b" diff --git a/unified/extractor/tests/corpus/swift/operators/logical-not.output b/unified/extractor/tests/corpus/swift/operators/logical-not.output index 03476b41def3..278667af8241 100644 --- a/unified/extractor/tests/corpus/swift/operators/logical-not.output +++ b/unified/extractor/tests/corpus/swift/operators/logical-not.output @@ -15,10 +15,10 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - unary_expr - operand: identifier "a" - operator: prefix_operator "!" + unary_expr source="⟨operator⟩⟨operand⟩" + operand: identifier "a" source="a" + operator: prefix_operator "!" source="!" diff --git a/unified/extractor/tests/corpus/swift/operators/logical-or.output b/unified/extractor/tests/corpus/swift/operators/logical-or.output index 8a447d8bb9fd..a6762a959794 100644 --- a/unified/extractor/tests/corpus/swift/operators/logical-or.output +++ b/unified/extractor/tests/corpus/swift/operators/logical-or.output @@ -20,11 +20,11 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - binary_expr - left: identifier "a" - operator: infix_operator "||" - right: identifier "b" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "a" source="a" + operator: infix_operator "||" source="||" + right: identifier "b" source="b" diff --git a/unified/extractor/tests/corpus/swift/operators/multiplication.output b/unified/extractor/tests/corpus/swift/operators/multiplication.output index 0313287d9431..b8fd88cf5299 100644 --- a/unified/extractor/tests/corpus/swift/operators/multiplication.output +++ b/unified/extractor/tests/corpus/swift/operators/multiplication.output @@ -20,11 +20,11 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - binary_expr - left: identifier "a" - operator: infix_operator "*" - right: identifier "b" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "a" source="a" + operator: infix_operator "*" source="*" + right: identifier "b" source="b" diff --git a/unified/extractor/tests/corpus/swift/operators/operator-precedence-addition-and-multiplication.output b/unified/extractor/tests/corpus/swift/operators/operator-precedence-addition-and-multiplication.output index abbc1c6d5782..955797c45114 100644 --- a/unified/extractor/tests/corpus/swift/operators/operator-precedence-addition-and-multiplication.output +++ b/unified/extractor/tests/corpus/swift/operators/operator-precedence-addition-and-multiplication.output @@ -28,15 +28,15 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - binary_expr - left: identifier "a" - operator: infix_operator "+" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "a" source="a" + operator: infix_operator "+" source="+" right: - binary_expr - left: identifier "b" - operator: infix_operator "*" - right: identifier "c" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "b" source="b" + operator: infix_operator "*" source="*" + right: identifier "c" source="c" diff --git a/unified/extractor/tests/corpus/swift/operators/parenthesised-expression.output b/unified/extractor/tests/corpus/swift/operators/parenthesised-expression.output index 33bb1599ff1a..d5d1b99069e6 100644 --- a/unified/extractor/tests/corpus/swift/operators/parenthesised-expression.output +++ b/unified/extractor/tests/corpus/swift/operators/parenthesised-expression.output @@ -34,15 +34,15 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - binary_expr + binary_expr source="(⟨left⟩) ⟨operator⟩ ⟨right⟩" left: - binary_expr - left: identifier "a" - operator: infix_operator "+" - right: identifier "b" - operator: infix_operator "*" - right: identifier "c" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "a" source="a" + operator: infix_operator "+" source="+" + right: identifier "b" source="b" + operator: infix_operator "*" source="*" + right: identifier "c" source="c" diff --git a/unified/extractor/tests/corpus/swift/operators/partial-range-from.output b/unified/extractor/tests/corpus/swift/operators/partial-range-from.output index 6b0a834494ec..90faee91bd75 100644 --- a/unified/extractor/tests/corpus/swift/operators/partial-range-from.output +++ b/unified/extractor/tests/corpus/swift/operators/partial-range-from.output @@ -28,11 +28,11 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "range" - value: unsupported_node "3..." + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "range" source="range" + value: unsupported_node "3..." source="3..." diff --git a/unified/extractor/tests/corpus/swift/operators/range-operator.output b/unified/extractor/tests/corpus/swift/operators/range-operator.output index 55ed3ab971a7..ab5aff23c30f 100644 --- a/unified/extractor/tests/corpus/swift/operators/range-operator.output +++ b/unified/extractor/tests/corpus/swift/operators/range-operator.output @@ -20,11 +20,11 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - binary_expr - left: int_literal "1" - operator: infix_operator "..." - right: int_literal "10" + binary_expr source="⟨left⟩⟨operator⟩⟨right⟩" + left: int_literal "1" source="1" + operator: infix_operator "..." source="..." + right: int_literal "10" source="10" diff --git a/unified/extractor/tests/corpus/swift/operators/subtraction.output b/unified/extractor/tests/corpus/swift/operators/subtraction.output index 63b4662fb575..210d25065f8c 100644 --- a/unified/extractor/tests/corpus/swift/operators/subtraction.output +++ b/unified/extractor/tests/corpus/swift/operators/subtraction.output @@ -20,11 +20,11 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - binary_expr - left: identifier "a" - operator: infix_operator "-" - right: identifier "b" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "a" source="a" + operator: infix_operator "-" source="-" + right: identifier "b" source="b" diff --git a/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-casts.output b/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-casts.output index d78fb757a8d9..0cdfd8b9d43b 100644 --- a/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-casts.output +++ b/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-casts.output @@ -89,39 +89,39 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - function_declaration - name_node: identifier "casts" + function_declaration source="⟨body⟩⟨name_node⟩⟨parameter⟩⟨parameter⟩" + name_node: identifier "casts" source="casts" parameter: - parameter - external_name_node: identifier "_" - type: identifier "Any" - pattern: identifier "a" - parameter - external_name_node: identifier "_" - type: identifier "Int" - pattern: identifier "b" + parameter source="⟨external_name_node⟩ ⟨pattern⟩: ⟨type⟩," + external_name_node: identifier "_" source="_" + type: identifier "Any" source="Any" + pattern: identifier "a" source="a" + parameter source="⟨external_name_node⟩ ⟨pattern⟩: ⟨type⟩" + external_name_node: identifier "_" source="_" + type: identifier "Int" source="Int" + pattern: identifier "b" source="b" body: - block + block source="func casts(_ a: Any, _ b: Int) {\n ⟨stmt⟩\n ⟨stmt⟩\n}" stmt: - unresolved_operator_sequence + unresolved_operator_sequence source="⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩" element: - identifier "_" - infix_operator "=" - identifier "a" - infix_operator "as" - unsupported_node "Int" - infix_operator ".&" - identifier "b" - unresolved_operator_sequence + identifier "_" source="_" + infix_operator "=" source="=" + identifier "a" source="a" + infix_operator "as" source="as" + unsupported_node "Int" source="Int" + infix_operator ".&" source=".&" + identifier "b" source="b" + unresolved_operator_sequence source="⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩" element: - identifier "_" - infix_operator "=" - identifier "a" - infix_operator "is" - unsupported_node "Int" - infix_operator ".&" - identifier "b" + identifier "_" source="_" + infix_operator "=" source="=" + identifier "a" source="a" + infix_operator "is" source="is" + unsupported_node "Int" source="Int" + infix_operator ".&" source=".&" + identifier "b" source="b" diff --git a/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-ternary.output b/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-ternary.output index 80e0f7285631..f0b2c64b9d91 100644 --- a/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-ternary.output +++ b/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-ternary.output @@ -95,41 +95,41 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - function_declaration - name_node: identifier "choose" + function_declaration source="⟨body⟩⟨name_node⟩⟨parameter⟩⟨parameter⟩⟨parameter⟩⟨parameter⟩⟨return_type⟩" + name_node: identifier "choose" source="choose" parameter: - parameter - external_name_node: identifier "_" - type: identifier "Bool" - pattern: identifier "c" - parameter - external_name_node: identifier "_" - type: identifier "Int" - pattern: identifier "a" - parameter - external_name_node: identifier "_" - type: identifier "Int" - pattern: identifier "b" - parameter - external_name_node: identifier "_" - type: identifier "Int" - pattern: identifier "d" - return_type: identifier "Int" + parameter source="⟨external_name_node⟩ ⟨pattern⟩: ⟨type⟩," + external_name_node: identifier "_" source="_" + type: identifier "Bool" source="Bool" + pattern: identifier "c" source="c" + parameter source="⟨external_name_node⟩ ⟨pattern⟩: ⟨type⟩," + external_name_node: identifier "_" source="_" + type: identifier "Int" source="Int" + pattern: identifier "a" source="a" + parameter source="⟨external_name_node⟩ ⟨pattern⟩: ⟨type⟩," + external_name_node: identifier "_" source="_" + type: identifier "Int" source="Int" + pattern: identifier "b" source="b" + parameter source="⟨external_name_node⟩ ⟨pattern⟩: ⟨type⟩" + external_name_node: identifier "_" source="_" + type: identifier "Int" source="Int" + pattern: identifier "d" source="d" + return_type: identifier "Int" source="Int" body: - block + block source="func choose(_ c: Bool, _ a: Int, _ b: Int, _ d: Int) -> Int {\n ⟨stmt⟩\n}" stmt: - return_expr + return_expr source="return ⟨value⟩" value: - unresolved_operator_sequence + unresolved_operator_sequence source="⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩" element: - identifier "c" - infix_operator "?" - identifier "a" - infix_operator ":" - identifier "b" - infix_operator ".&" - identifier "d" + identifier "c" source="c" + infix_operator "?" source="?" + identifier "a" source="a" + infix_operator ":" source=":" + identifier "b" source="b" + infix_operator ".&" source=".&" + identifier "d" source="d" diff --git a/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence.output b/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence.output index ae2da42f2d43..2ed6779f4c89 100644 --- a/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence.output +++ b/unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence.output @@ -62,28 +62,28 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - function_declaration - name_node: identifier "combine" + function_declaration source="⟨body⟩⟨name_node⟩⟨parameter⟩⟨parameter⟩" + name_node: identifier "combine" source="combine" parameter: - parameter - external_name_node: identifier "_" - type: identifier "Int" - pattern: identifier "a" - parameter - external_name_node: identifier "_" - type: identifier "Int" - pattern: identifier "b" + parameter source="⟨external_name_node⟩ ⟨pattern⟩: ⟨type⟩," + external_name_node: identifier "_" source="_" + type: identifier "Int" source="Int" + pattern: identifier "a" source="a" + parameter source="⟨external_name_node⟩ ⟨pattern⟩: ⟨type⟩" + external_name_node: identifier "_" source="_" + type: identifier "Int" source="Int" + pattern: identifier "b" source="b" body: - block + block source="func combine(_ a: Int, _ b: Int) {\n ⟨stmt⟩\n}" stmt: - unresolved_operator_sequence + unresolved_operator_sequence source="⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩" element: - identifier "_" - infix_operator "=" - identifier "a" - infix_operator ".&" - identifier "b" + identifier "_" source="_" + infix_operator "=" source="=" + identifier "a" source="a" + infix_operator ".&" source=".&" + identifier "b" source="b" diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/catch-where-clauses.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/catch-where-clauses.output index 3a603e8f504c..c1937aca8255 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/catch-where-clauses.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/catch-where-clauses.output @@ -136,60 +136,60 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - try_expr + try_expr source="do ⟨body⟩ ⟨catch_clause⟩ ⟨catch_clause⟩" body: - block + block source="{\n ⟨stmt⟩\n}" stmt: - unary_expr + unary_expr source="⟨operator⟩⟨operand⟩" operand: - call_expr - callee: identifier "foo" - operator: prefix_operator "try" + call_expr source="⟨callee⟩()" + callee: identifier "foo" source="foo" + operator: prefix_operator "try" source="try foo()" catch_clause: - catch_clause + catch_clause source="⟨pattern⟩⟨body⟩" pattern: - or_pattern + or_pattern source="catch ⟨pattern⟩ ⟨pattern⟩ {\n print(\"retry\")\n}" pattern: - conditional_pattern + conditional_pattern source="⟨pattern⟩ where ⟨condition⟩," condition: - call_expr - callee: identifier "isNetworkError" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "isNetworkError" source="isNetworkError" argument: - argument - value: identifier "e" + argument source="⟨value⟩" + value: identifier "e" source="e" pattern: - expr_pattern - modifier: modifier "let" - expr: identifier "e" - conditional_pattern + expr_pattern source="⟨modifier⟩ ⟨expr⟩" + modifier: modifier "let" source="let" + expr: identifier "e" source="e" + conditional_pattern source="⟨pattern⟩ where ⟨condition⟩" condition: - call_expr - callee: identifier "isTimeout" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "isTimeout" source="isTimeout" argument: - argument - value: identifier "f" + argument source="⟨value⟩" + value: identifier "f" source="f" pattern: - expr_pattern - modifier: modifier "let" - expr: identifier "f" + expr_pattern source="⟨modifier⟩ ⟨expr⟩" + modifier: modifier "let" source="let" + expr: identifier "f" source="f" body: - block + block source="{\n ⟨stmt⟩\n}" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: string_literal "\"retry\"" - catch_clause + argument source="⟨value⟩" + value: string_literal "\"retry\"" source="\"retry\"" + catch_clause source="catch ⟨body⟩" body: - block + block source="{\n ⟨stmt⟩\n}" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: string_literal "\"fallback\"" + argument source="⟨value⟩" + value: string_literal "\"fallback\"" source="\"fallback\"" diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/do-catch.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/do-catch.output index 8db6319fd778..0c5009e02fc3 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/do-catch.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/do-catch.output @@ -57,26 +57,26 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - try_expr + try_expr source="do ⟨body⟩ ⟨catch_clause⟩" body: - block + block source="{\n ⟨stmt⟩\n}" stmt: - unary_expr + unary_expr source="⟨operator⟩⟨operand⟩" operand: - call_expr - callee: identifier "foo" - operator: prefix_operator "try" + call_expr source="⟨callee⟩()" + callee: identifier "foo" source="foo" + operator: prefix_operator "try" source="try foo()" catch_clause: - catch_clause + catch_clause source="catch ⟨body⟩" body: - block + block source="{\n ⟨stmt⟩\n}" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: identifier "error" + argument source="⟨value⟩" + value: identifier "error" source="error" diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/force-unwrap.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/force-unwrap.output index c977adaaa3f3..4d8b84743253 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/force-unwrap.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/force-unwrap.output @@ -28,14 +28,14 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "n" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "n" source="n" value: - unary_expr - operand: identifier "opt" - operator: postfix_operator "!" + unary_expr source="⟨operand⟩⟨operator⟩" + operand: identifier "opt" source="opt" + operator: postfix_operator "!" source="opt!" diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/nil-coalescing.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/nil-coalescing.output index c8b6a85d6203..5a35a80306a5 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/nil-coalescing.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/nil-coalescing.output @@ -33,15 +33,15 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "n" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "n" source="n" value: - binary_expr - left: identifier "opt" - operator: infix_operator "??" - right: int_literal "0" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "opt" source="opt" + operator: infix_operator "??" source="??" + right: int_literal "0" source="0" diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-chaining.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-chaining.output index 42b65ed696b0..2fb5be96bc8f 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-chaining.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-chaining.output @@ -43,17 +43,17 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "n" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "n" source="n" value: - member_access_expr + member_access_expr source="⟨base⟩?.⟨member_name_node⟩" base: - member_access_expr - base: identifier "obj" - member_name_node: identifier "foo" - member_name_node: identifier "bar" + member_access_expr source="⟨base⟩?.⟨member_name_node⟩" + base: identifier "obj" source="obj" + member_name_node: identifier "foo" source="foo" + member_name_node: identifier "bar" source="bar" diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.output index 05223133226b..739fcb48ec29 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-enum-case-binding.output @@ -72,39 +72,39 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - if_expr + if_expr source="if ⟨condition⟩ ⟨then⟩" condition: - pattern_guard_expr + pattern_guard_expr source="case ⟨pattern⟩ = ⟨value⟩" pattern: - call_expr + call_expr source="⟨argument⟩⟨callee⟩" callee: - member_access_expr - base: identifier "Optional" - member_name_node: identifier "some" + member_access_expr source="⟨base⟩⟨member_name_node⟩" + base: identifier "Optional" source=".some(let value)?" + member_name_node: identifier "some" source=".some(let value)?" argument: - argument + argument source="⟨value⟩?" value: - call_expr + call_expr source="⟨callee⟩(⟨argument⟩)" callee: - member_access_expr - base: inferred_type_expr "." - member_name_node: identifier "some" + member_access_expr source="⟨base⟩⟨member_name_node⟩" + base: inferred_type_expr "." source="." + member_name_node: identifier "some" source="some" argument: - argument + argument source="⟨value⟩" value: - expr_pattern - modifier: modifier "let" - expr: identifier "value" - value: identifier "input" + expr_pattern source="⟨modifier⟩ ⟨expr⟩" + modifier: modifier "let" source="let" + expr: identifier "value" source="value" + value: identifier "input" source="input" then: - block + block source="{\n ⟨stmt⟩\n}" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: identifier "value" + argument source="⟨value⟩" + value: identifier "value" source="value" diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-type-annotation.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-type-annotation.output index dd73c9899745..6860e38d7a3a 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-type-annotation.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/optional-type-annotation.output @@ -34,15 +34,15 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "x" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩: ⟨type⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "x" source="x" type: - generic_type_expr - base: identifier "Optional" - type_argument: identifier "Int" - value: builtin_expr "nil" + generic_type_expr source="⟨type_argument⟩⟨base⟩" + base: identifier "Optional" source="Int?" + type_argument: identifier "Int" source="Int" + value: builtin_expr "nil" source="nil" diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/throwing-function.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/throwing-function.output index 7915e7ee92f8..5be898e21651 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/throwing-function.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/throwing-function.output @@ -51,15 +51,15 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - function_declaration - name_node: identifier "read" - return_type: identifier "String" + function_declaration source="⟨body⟩⟨name_node⟩⟨return_type⟩" + name_node: identifier "read" source="read" + return_type: identifier "String" source="String" body: - block + block source="func read() throws -> String {\n ⟨stmt⟩\n}" stmt: - return_expr - value: string_literal "\"\"" + return_expr source="return ⟨value⟩" + value: string_literal "\"\"" source="\"\"" diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/try-expression-2.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/try-expression-2.output index faacc2583539..4faa3545ea5c 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/try-expression-2.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/try-expression-2.output @@ -35,16 +35,16 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "result" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "result" source="result" value: - unary_expr + unary_expr source="⟨operator⟩⟨operand⟩" operand: - call_expr - callee: identifier "foo" - operator: prefix_operator "try!" + call_expr source="⟨callee⟩()" + callee: identifier "foo" source="foo" + operator: prefix_operator "try!" source="try! foo()" diff --git a/unified/extractor/tests/corpus/swift/optionals-and-errors/try-expression.output b/unified/extractor/tests/corpus/swift/optionals-and-errors/try-expression.output index a5e07f561208..57464ed82141 100644 --- a/unified/extractor/tests/corpus/swift/optionals-and-errors/try-expression.output +++ b/unified/extractor/tests/corpus/swift/optionals-and-errors/try-expression.output @@ -35,16 +35,16 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "result" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "result" source="result" value: - unary_expr + unary_expr source="⟨operator⟩⟨operand⟩" operand: - call_expr - callee: identifier "foo" - operator: prefix_operator "try?" + call_expr source="⟨callee⟩()" + callee: identifier "foo" source="foo" + operator: prefix_operator "try?" source="try? foo()" diff --git a/unified/extractor/tests/corpus/swift/types/actor-declaration.output b/unified/extractor/tests/corpus/swift/types/actor-declaration.output index b4fcd605b9e9..89d549b0e749 100644 --- a/unified/extractor/tests/corpus/swift/types/actor-declaration.output +++ b/unified/extractor/tests/corpus/swift/types/actor-declaration.output @@ -39,7 +39,7 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block - stmt: unsupported_node "actor Counter {\n var value = 0\n}" + block source="⟨stmt⟩" + stmt: unsupported_node "actor Counter {\n var value = 0\n}" source="actor Counter {\n var value = 0\n}" diff --git a/unified/extractor/tests/corpus/swift/types/binding-modifier-does-not-leak-into-accessor-body.output b/unified/extractor/tests/corpus/swift/types/binding-modifier-does-not-leak-into-accessor-body.output index 0c839689dce0..6a02642ced38 100644 --- a/unified/extractor/tests/corpus/swift/types/binding-modifier-does-not-leak-into-accessor-body.output +++ b/unified/extractor/tests/corpus/swift/types/binding-modifier-does-not-leak-into-accessor-body.output @@ -92,31 +92,31 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩\n}" stmt: - accessor_declaration - modifier: modifier "var" - name_node: identifier "p" - accessor_kind: accessor_kind "get" - type: identifier "Int" + accessor_declaration source="⟨modifier⟩ ⟨name_node⟩: ⟨type⟩ {\n ⟨accessor_kind⟩ ⟨body⟩" + modifier: modifier "var" source="var" + name_node: identifier "p" source="p" + accessor_kind: accessor_kind "get" source="get" + type: identifier "Int" source="Int" body: - block + block source="{\n ⟨stmt⟩\n }" stmt: - switch_expr - value: identifier "y" + switch_expr source="switch ⟨value⟩ {\n ⟨case⟩\n ⟨case⟩\n }" + value: identifier "y" source="y" case: - switch_case - pattern: identifier "someConstant" + switch_case source="⟨body⟩⟨pattern⟩" + pattern: identifier "someConstant" source="someConstant" body: - block + block source="case someConstant:\n ⟨stmt⟩" stmt: - return_expr - value: int_literal "1" - switch_case + return_expr source="return ⟨value⟩" + value: int_literal "1" source="1" + switch_case source="⟨body⟩" body: - block + block source="default:\n ⟨stmt⟩" stmt: - return_expr - value: int_literal "2" + return_expr source="return ⟨value⟩" + value: int_literal "2" source="2" diff --git a/unified/extractor/tests/corpus/swift/types/class-function.output b/unified/extractor/tests/corpus/swift/types/class-function.output index ed00913dafde..a3084367cea1 100644 --- a/unified/extractor/tests/corpus/swift/types/class-function.output +++ b/unified/extractor/tests/corpus/swift/types/class-function.output @@ -43,15 +43,15 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - class_like_declaration - modifier: modifier "class" - name_node: identifier "Factory" + class_like_declaration source="⟨modifier⟩ ⟨name_node⟩ {\n ⟨member⟩\n}" + modifier: modifier "class" source="class" + name_node: identifier "Factory" source="Factory" member: - function_declaration - modifier: modifier "class" - name_node: identifier "make" - body: block "class func make() {}" + function_declaration source="⟨modifier⟩⟨body⟩⟨name_node⟩" + modifier: modifier "class" source="class" + name_node: identifier "make" source="make" + body: block "class func make() {}" source="class func make() {}" diff --git a/unified/extractor/tests/corpus/swift/types/class-inheritance.output b/unified/extractor/tests/corpus/swift/types/class-inheritance.output index 28af5a0f7086..28a35c0906ff 100644 --- a/unified/extractor/tests/corpus/swift/types/class-inheritance.output +++ b/unified/extractor/tests/corpus/swift/types/class-inheritance.output @@ -28,13 +28,13 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - class_like_declaration - modifier: modifier "class" - name_node: identifier "Dog" + class_like_declaration source="⟨modifier⟩⟨base_type⟩⟨name_node⟩" + modifier: modifier "class" source="class" + name_node: identifier "Dog" source="Dog" base_type: - base_type - type: identifier "Animal" + base_type source="class Dog: ⟨type⟩ {}" + type: identifier "Animal" source="Animal" diff --git a/unified/extractor/tests/corpus/swift/types/class-with-initializer.output b/unified/extractor/tests/corpus/swift/types/class-with-initializer.output index cd9e3c1eb9ad..f5e85a979d67 100644 --- a/unified/extractor/tests/corpus/swift/types/class-with-initializer.output +++ b/unified/extractor/tests/corpus/swift/types/class-with-initializer.output @@ -86,30 +86,30 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - class_like_declaration - modifier: modifier "class" - name_node: identifier "Point" + class_like_declaration source="⟨modifier⟩ ⟨name_node⟩ {\n ⟨member⟩\n ⟨member⟩\n}" + modifier: modifier "class" source="class" + name_node: identifier "Point" source="Point" member: - variable_declaration - modifier: modifier "var" - pattern: identifier "x" - type: identifier "Int" - constructor_declaration + variable_declaration source="⟨modifier⟩ ⟨pattern⟩: ⟨type⟩" + modifier: modifier "var" source="var" + pattern: identifier "x" source="x" + type: identifier "Int" source="Int" + constructor_declaration source="⟨body⟩⟨parameter⟩" parameter: - parameter - type: identifier "Int" - pattern: identifier "x" + parameter source="⟨pattern⟩: ⟨type⟩" + type: identifier "Int" source="Int" + pattern: identifier "x" source="x" body: - block + block source="init(x: Int) {\n ⟨stmt⟩\n }" stmt: - binary_expr + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" left: - member_access_expr - base: identifier "self" - member_name_node: identifier "x" - operator: infix_operator "=" - right: identifier "x" + member_access_expr source="⟨base⟩.⟨member_name_node⟩" + base: identifier "self" source="self" + member_name_node: identifier "x" source="x" + operator: infix_operator "=" source="=" + right: identifier "x" source="x" diff --git a/unified/extractor/tests/corpus/swift/types/class-with-method.output b/unified/extractor/tests/corpus/swift/types/class-with-method.output index 2cc184038255..64981979359d 100644 --- a/unified/extractor/tests/corpus/swift/types/class-with-method.output +++ b/unified/extractor/tests/corpus/swift/types/class-with-method.output @@ -73,24 +73,24 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - class_like_declaration - modifier: modifier "class" - name_node: identifier "Counter" + class_like_declaration source="⟨modifier⟩ ⟨name_node⟩ {\n ⟨member⟩\n ⟨member⟩\n}" + modifier: modifier "class" source="class" + name_node: identifier "Counter" source="Counter" member: - variable_declaration - modifier: modifier "var" - pattern: identifier "n" - value: int_literal "0" - function_declaration - name_node: identifier "bump" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "var" source="var" + pattern: identifier "n" source="n" + value: int_literal "0" source="0" + function_declaration source="⟨body⟩⟨name_node⟩" + name_node: identifier "bump" source="bump" body: - block + block source="func bump() {\n ⟨stmt⟩\n }" stmt: - binary_expr - left: identifier "n" - operator: infix_operator "+=" - right: int_literal "1" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "n" source="n" + operator: infix_operator "+=" source="+=" + right: int_literal "1" source="1" diff --git a/unified/extractor/tests/corpus/swift/types/class-with-multiple-base-types.output b/unified/extractor/tests/corpus/swift/types/class-with-multiple-base-types.output index f6c87accee27..f2a839add74c 100644 --- a/unified/extractor/tests/corpus/swift/types/class-with-multiple-base-types.output +++ b/unified/extractor/tests/corpus/swift/types/class-with-multiple-base-types.output @@ -33,15 +33,15 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - class_like_declaration - modifier: modifier "class" - name_node: identifier "Button" + class_like_declaration source="⟨modifier⟩⟨base_type⟩⟨base_type⟩⟨name_node⟩" + modifier: modifier "class" source="class" + name_node: identifier "Button" source="Button" base_type: - base_type - type: identifier "Control" - base_type - type: identifier "Drawable" + base_type source="class Button: ⟨type⟩, Drawable {}" + type: identifier "Control" source="Control" + base_type source="class Button: Control, ⟨type⟩ {}" + type: identifier "Drawable" source="Drawable" diff --git a/unified/extractor/tests/corpus/swift/types/class-with-stored-properties.output b/unified/extractor/tests/corpus/swift/types/class-with-stored-properties.output index a2eea59d3e87..37ea4f114076 100644 --- a/unified/extractor/tests/corpus/swift/types/class-with-stored-properties.output +++ b/unified/extractor/tests/corpus/swift/types/class-with-stored-properties.output @@ -57,19 +57,19 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - class_like_declaration - modifier: modifier "class" - name_node: identifier "Point" + class_like_declaration source="⟨modifier⟩ ⟨name_node⟩ {\n ⟨member⟩\n ⟨member⟩\n}" + modifier: modifier "class" source="class" + name_node: identifier "Point" source="Point" member: - variable_declaration - modifier: modifier "var" - pattern: identifier "x" - type: identifier "Int" - variable_declaration - modifier: modifier "var" - pattern: identifier "y" - type: identifier "Int" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩: ⟨type⟩" + modifier: modifier "var" source="var" + pattern: identifier "x" source="x" + type: identifier "Int" source="Int" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩: ⟨type⟩" + modifier: modifier "var" source="var" + pattern: identifier "y" source="y" + type: identifier "Int" source="Int" diff --git a/unified/extractor/tests/corpus/swift/types/computed-property.output b/unified/extractor/tests/corpus/swift/types/computed-property.output index ab7c072ae40d..b4021e9dfdbb 100644 --- a/unified/extractor/tests/corpus/swift/types/computed-property.output +++ b/unified/extractor/tests/corpus/swift/types/computed-property.output @@ -97,33 +97,33 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - class_like_declaration - modifier: modifier "class" - name_node: identifier "Rect" + class_like_declaration source="⟨modifier⟩ ⟨name_node⟩ {\n ⟨member⟩\n ⟨member⟩\n ⟨member⟩\n}" + modifier: modifier "class" source="class" + name_node: identifier "Rect" source="Rect" member: - variable_declaration - modifier: modifier "var" - pattern: identifier "w" - type: identifier "Double" - variable_declaration - modifier: modifier "var" - pattern: identifier "h" - type: identifier "Double" - accessor_declaration - modifier: modifier "var" - name_node: identifier "area" - accessor_kind: accessor_kind "get" - type: identifier "Double" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩: ⟨type⟩" + modifier: modifier "var" source="var" + pattern: identifier "w" source="w" + type: identifier "Double" source="Double" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩: ⟨type⟩" + modifier: modifier "var" source="var" + pattern: identifier "h" source="h" + type: identifier "Double" source="Double" + accessor_declaration source="⟨modifier⟩⟨accessor_kind⟩⟨body⟩⟨name_node⟩⟨type⟩" + modifier: modifier "var" source="var" + name_node: identifier "area" source="area" + accessor_kind: accessor_kind "get" source="var area: Double {\n return w * h\n }" + type: identifier "Double" source="Double" body: - block + block source="var area: Double {\n ⟨stmt⟩\n }" stmt: - return_expr + return_expr source="return ⟨value⟩" value: - binary_expr - left: identifier "w" - operator: infix_operator "*" - right: identifier "h" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "w" source="w" + operator: infix_operator "*" source="*" + right: identifier "h" source="h" diff --git a/unified/extractor/tests/corpus/swift/types/conditional-compilation-in-class-body.output b/unified/extractor/tests/corpus/swift/types/conditional-compilation-in-class-body.output index b184e9b33ea1..79154b5c70d0 100644 --- a/unified/extractor/tests/corpus/swift/types/conditional-compilation-in-class-body.output +++ b/unified/extractor/tests/corpus/swift/types/conditional-compilation-in-class-body.output @@ -77,11 +77,11 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - class_like_declaration - modifier: modifier "class" - name_node: identifier "C" - member: unsupported_node "#if DEBUG\n init(x: Int) {}\n deinit {}\n#endif" + class_like_declaration source="⟨modifier⟩ ⟨name_node⟩ {\n⟨member⟩\n}" + modifier: modifier "class" source="class" + name_node: identifier "C" source="C" + member: unsupported_node "#if DEBUG\n init(x: Int) {}\n deinit {}\n#endif" source="#if DEBUG\n init(x: Int) {}\n deinit {}\n#endif" diff --git a/unified/extractor/tests/corpus/swift/types/constructor-with-parameters.output b/unified/extractor/tests/corpus/swift/types/constructor-with-parameters.output index d594e9c48df4..72d8952ea356 100644 --- a/unified/extractor/tests/corpus/swift/types/constructor-with-parameters.output +++ b/unified/extractor/tests/corpus/swift/types/constructor-with-parameters.output @@ -59,22 +59,22 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - class_like_declaration - modifier: modifier "struct" - name_node: identifier "Size" + class_like_declaration source="⟨modifier⟩ ⟨name_node⟩ {\n ⟨member⟩\n}" + modifier: modifier "struct" source="struct" + name_node: identifier "Size" source="Size" member: - constructor_declaration + constructor_declaration source="⟨body⟩⟨parameter⟩⟨parameter⟩" parameter: - parameter - external_name_node: identifier "width" - type: identifier "Int" - pattern: identifier "w" - parameter - external_name_node: identifier "height" - type: identifier "Int" - pattern: identifier "h" - body: block "init(width w: Int, height h: Int) {}" + parameter source="⟨external_name_node⟩ ⟨pattern⟩: ⟨type⟩," + external_name_node: identifier "width" source="width" + type: identifier "Int" source="Int" + pattern: identifier "w" source="w" + parameter source="⟨external_name_node⟩ ⟨pattern⟩: ⟨type⟩" + external_name_node: identifier "height" source="height" + type: identifier "Int" source="Int" + pattern: identifier "h" source="h" + body: block "init(width w: Int, height h: Int) {}" source="init(width w: Int, height h: Int) {}" diff --git a/unified/extractor/tests/corpus/swift/types/empty-class.output b/unified/extractor/tests/corpus/swift/types/empty-class.output index 27bb4b5e67cd..9ea1e0d72f9c 100644 --- a/unified/extractor/tests/corpus/swift/types/empty-class.output +++ b/unified/extractor/tests/corpus/swift/types/empty-class.output @@ -20,10 +20,10 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - class_like_declaration - modifier: modifier "class" - name_node: identifier "Foo" + class_like_declaration source="⟨modifier⟩ ⟨name_node⟩ {}" + modifier: modifier "class" source="class" + name_node: identifier "Foo" source="Foo" diff --git a/unified/extractor/tests/corpus/swift/types/enum-with-associated-values.output b/unified/extractor/tests/corpus/swift/types/enum-with-associated-values.output index 6e4bf71fe920..ef7a079eabf9 100644 --- a/unified/extractor/tests/corpus/swift/types/enum-with-associated-values.output +++ b/unified/extractor/tests/corpus/swift/types/enum-with-associated-values.output @@ -65,31 +65,31 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - class_like_declaration - modifier: modifier "enum" - name_node: identifier "Shape" + class_like_declaration source="⟨modifier⟩ ⟨name_node⟩ {\n case ⟨member⟩\n case ⟨member⟩\n}" + modifier: modifier "enum" source="enum" + name_node: identifier "Shape" source="Shape" member: - class_like_declaration - modifier: modifier "enum_case" - name_node: identifier "circle" + class_like_declaration source="⟨name_node⟩⟨member⟩⟨modifier⟩" + modifier: modifier "enum_case" source="circle(radius: Double)" + name_node: identifier "circle" source="circle" member: - constructor_declaration + constructor_declaration source="⟨body⟩⟨parameter⟩" parameter: - parameter - type: identifier "Double" - pattern: identifier "radius" - body: block "circle(radius: Double)" - class_like_declaration - modifier: modifier "enum_case" - name_node: identifier "square" + parameter source="⟨pattern⟩: ⟨type⟩" + type: identifier "Double" source="Double" + pattern: identifier "radius" source="radius" + body: block "circle(radius: Double)" source="circle(radius: Double)" + class_like_declaration source="⟨name_node⟩⟨member⟩⟨modifier⟩" + modifier: modifier "enum_case" source="square(side: Double)" + name_node: identifier "square" source="square" member: - constructor_declaration + constructor_declaration source="⟨body⟩⟨parameter⟩" parameter: - parameter - type: identifier "Double" - pattern: identifier "side" - body: block "square(side: Double)" + parameter source="⟨pattern⟩: ⟨type⟩" + type: identifier "Double" source="Double" + pattern: identifier "side" source="side" + body: block "square(side: Double)" source="square(side: Double)" diff --git a/unified/extractor/tests/corpus/swift/types/enum-with-cases.output b/unified/extractor/tests/corpus/swift/types/enum-with-cases.output index 7c9184a774b3..a66dc1f2d7c0 100644 --- a/unified/extractor/tests/corpus/swift/types/enum-with-cases.output +++ b/unified/extractor/tests/corpus/swift/types/enum-with-cases.output @@ -61,23 +61,23 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - class_like_declaration - modifier: modifier "enum" - name_node: identifier "Direction" + class_like_declaration source="⟨modifier⟩ ⟨name_node⟩ {\n case ⟨member⟩\n case ⟨member⟩\n case ⟨member⟩\n case ⟨member⟩\n}" + modifier: modifier "enum" source="enum" + name_node: identifier "Direction" source="Direction" member: - variable_declaration - modifier: modifier "enum_case" - pattern: identifier "north" - variable_declaration - modifier: modifier "enum_case" - pattern: identifier "south" - variable_declaration - modifier: modifier "enum_case" - pattern: identifier "east" - variable_declaration - modifier: modifier "enum_case" - pattern: identifier "west" + variable_declaration source="⟨modifier⟩⟨pattern⟩" + modifier: modifier "enum_case" source="north" + pattern: identifier "north" source="north" + variable_declaration source="⟨modifier⟩⟨pattern⟩" + modifier: modifier "enum_case" source="south" + pattern: identifier "south" source="south" + variable_declaration source="⟨modifier⟩⟨pattern⟩" + modifier: modifier "enum_case" source="east" + pattern: identifier "east" source="east" + variable_declaration source="⟨modifier⟩⟨pattern⟩" + modifier: modifier "enum_case" source="west" + pattern: identifier "west" source="west" diff --git a/unified/extractor/tests/corpus/swift/types/enum-with-comma-separated-cases-chained-declaration.output b/unified/extractor/tests/corpus/swift/types/enum-with-comma-separated-cases-chained-declaration.output index 87b81b333d2f..97945a6cc910 100644 --- a/unified/extractor/tests/corpus/swift/types/enum-with-comma-separated-cases-chained-declaration.output +++ b/unified/extractor/tests/corpus/swift/types/enum-with-comma-separated-cases-chained-declaration.output @@ -40,29 +40,29 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - class_like_declaration - modifier: modifier "enum" - name_node: identifier "Suit" + class_like_declaration source="⟨modifier⟩ ⟨name_node⟩ {\n case ⟨member⟩ ⟨member⟩ ⟨member⟩ ⟨member⟩\n}" + modifier: modifier "enum" source="enum" + name_node: identifier "Suit" source="Suit" member: - variable_declaration - modifier: modifier "enum_case" - pattern: identifier "clubs" - variable_declaration + variable_declaration source="⟨pattern⟩⟨modifier⟩" + modifier: modifier "enum_case" source="clubs," + pattern: identifier "clubs" source="clubs" + variable_declaration source="⟨pattern⟩⟨modifier⟩⟨modifier⟩" modifier: - modifier "chained_declaration" - modifier "enum_case" - pattern: identifier "diamonds" - variable_declaration + modifier "chained_declaration" source="diamonds," + modifier "enum_case" source="diamonds," + pattern: identifier "diamonds" source="diamonds" + variable_declaration source="⟨pattern⟩⟨modifier⟩⟨modifier⟩" modifier: - modifier "chained_declaration" - modifier "enum_case" - pattern: identifier "hearts" - variable_declaration + modifier "chained_declaration" source="hearts," + modifier "enum_case" source="hearts," + pattern: identifier "hearts" source="hearts" + variable_declaration source="⟨modifier⟩⟨modifier⟩⟨pattern⟩" modifier: - modifier "chained_declaration" - modifier "enum_case" - pattern: identifier "spades" + modifier "chained_declaration" source="spades" + modifier "enum_case" source="spades" + pattern: identifier "spades" source="spades" diff --git a/unified/extractor/tests/corpus/swift/types/extension.output b/unified/extractor/tests/corpus/swift/types/extension.output index 76dedcdcd909..0ab670eb5cfd 100644 --- a/unified/extractor/tests/corpus/swift/types/extension.output +++ b/unified/extractor/tests/corpus/swift/types/extension.output @@ -64,23 +64,23 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - class_like_declaration - modifier: modifier "extension" - extension_target: identifier "Int" + class_like_declaration source="⟨modifier⟩ ⟨extension_target⟩ {\n ⟨member⟩\n}" + modifier: modifier "extension" source="extension" + extension_target: identifier "Int" source="Int" member: - function_declaration - name_node: identifier "squared" - return_type: identifier "Int" + function_declaration source="⟨body⟩⟨name_node⟩⟨return_type⟩" + name_node: identifier "squared" source="squared" + return_type: identifier "Int" source="Int" body: - block + block source="func squared() -> Int { ⟨stmt⟩ }" stmt: - return_expr + return_expr source="return ⟨value⟩" value: - binary_expr - left: identifier "self" - operator: infix_operator "*" - right: identifier "self" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "self" source="self" + operator: infix_operator "*" source="*" + right: identifier "self" source="self" diff --git a/unified/extractor/tests/corpus/swift/types/function-type-with-convention-attribute.output b/unified/extractor/tests/corpus/swift/types/function-type-with-convention-attribute.output index 1522ef79c8a4..e26e022261f4 100644 --- a/unified/extractor/tests/corpus/swift/types/function-type-with-convention-attribute.output +++ b/unified/extractor/tests/corpus/swift/types/function-type-with-convention-attribute.output @@ -58,14 +58,14 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "callback" - type: unsupported_node "@convention(c) () -> Void" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩: ⟨type⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "callback" source="callback" + type: unsupported_node "@convention(c) () -> Void" source="@convention(c) () -> Void" value: - function_expr - body: block "{}" + function_expr source="⟨body⟩" + body: block "{}" source="{}" diff --git a/unified/extractor/tests/corpus/swift/types/function-type-with-sendable-attribute.output b/unified/extractor/tests/corpus/swift/types/function-type-with-sendable-attribute.output index 8478fad42c7e..3d4a80ebea18 100644 --- a/unified/extractor/tests/corpus/swift/types/function-type-with-sendable-attribute.output +++ b/unified/extractor/tests/corpus/swift/types/function-type-with-sendable-attribute.output @@ -51,14 +51,14 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "handler" - type: unsupported_node "@Sendable () -> Void" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩: ⟨type⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "handler" source="handler" + type: unsupported_node "@Sendable () -> Void" source="@Sendable () -> Void" value: - function_expr - body: block "{}" + function_expr source="⟨body⟩" + body: block "{}" source="{}" diff --git a/unified/extractor/tests/corpus/swift/types/generic-class-parameters-and-constraints.output b/unified/extractor/tests/corpus/swift/types/generic-class-parameters-and-constraints.output index 92b1713cebad..8e057dfae084 100644 --- a/unified/extractor/tests/corpus/swift/types/generic-class-parameters-and-constraints.output +++ b/unified/extractor/tests/corpus/swift/types/generic-class-parameters-and-constraints.output @@ -62,23 +62,23 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - class_like_declaration - modifier: modifier "class" - name_node: identifier "Box" + class_like_declaration source="⟨modifier⟩ ⟨name_node⟩<⟨type_parameter⟩ ⟨type_parameter⟩> where ⟨type_constraint⟩ ⟨type_constraint⟩ {\n}" + modifier: modifier "class" source="class" + name_node: identifier "Box" source="Box" type_parameter: - type_parameter - name_node: identifier "T" - bound: identifier "Equatable" - type_parameter - name_node: identifier "U" + type_parameter source="⟨name_node⟩: ⟨bound⟩," + name_node: identifier "T" source="T" + bound: identifier "Equatable" source="Equatable" + type_parameter source="⟨name_node⟩" + name_node: identifier "U" source="U" type_constraint: - bound_type_constraint - type: identifier "U" - bound: identifier "Equatable" - equality_type_constraint - left: identifier "U" - right: identifier "T" + bound_type_constraint source="⟨type⟩: ⟨bound⟩," + type: identifier "U" source="U" + bound: identifier "Equatable" source="Equatable" + equality_type_constraint source="⟨left⟩ == ⟨right⟩" + left: identifier "U" source="U" + right: identifier "T" source="T" diff --git a/unified/extractor/tests/corpus/swift/types/generic-type-arguments.output b/unified/extractor/tests/corpus/swift/types/generic-type-arguments.output index 17cdddf083fb..402ec3f8b780 100644 --- a/unified/extractor/tests/corpus/swift/types/generic-type-arguments.output +++ b/unified/extractor/tests/corpus/swift/types/generic-type-arguments.output @@ -56,19 +56,19 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "cache" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩: ⟨type⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "cache" source="cache" type: - generic_type_expr - base: identifier "Dictionary" + generic_type_expr source="⟨base⟩<⟨type_argument⟩, ⟨type_argument⟩>" + base: identifier "Dictionary" source="Dictionary" type_argument: - identifier "String" - generic_type_expr - base: identifier "Array" - type_argument: identifier "Int" - value: map_literal "[:]" + identifier "String" source="String" + generic_type_expr source="⟨base⟩<⟨type_argument⟩>" + base: identifier "Array" source="Array" + type_argument: identifier "Int" source="Int" + value: map_literal "[:]" source="[:]" diff --git a/unified/extractor/tests/corpus/swift/types/inline-array-type.output b/unified/extractor/tests/corpus/swift/types/inline-array-type.output index 0be81cb39306..39657ec20345 100644 --- a/unified/extractor/tests/corpus/swift/types/inline-array-type.output +++ b/unified/extractor/tests/corpus/swift/types/inline-array-type.output @@ -59,17 +59,17 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "triple" - type: unsupported_node "[3 of Int]" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩: ⟨type⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "triple" source="triple" + type: unsupported_node "[3 of Int]" source="[3 of Int]" value: - array_literal + array_literal source="[⟨element⟩, ⟨element⟩, ⟨element⟩]" element: - int_literal "1" - int_literal "2" - int_literal "3" + int_literal "1" source="1" + int_literal "2" source="2" + int_literal "3" source="3" diff --git a/unified/extractor/tests/corpus/swift/types/noncopyable-type.output b/unified/extractor/tests/corpus/swift/types/noncopyable-type.output index 970d21683f6e..0a22d1ca0b07 100644 --- a/unified/extractor/tests/corpus/swift/types/noncopyable-type.output +++ b/unified/extractor/tests/corpus/swift/types/noncopyable-type.output @@ -50,18 +50,18 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - class_like_declaration - modifier: modifier "struct" - name_node: identifier "FileHandle" + class_like_declaration source="⟨modifier⟩⟨base_type⟩⟨name_node⟩⟨member⟩" + modifier: modifier "struct" source="struct" + name_node: identifier "FileHandle" source="FileHandle" base_type: - base_type - type: unsupported_node "~Copyable" + base_type source="struct FileHandle: ⟨type⟩ {\n let descriptor: Int\n}" + type: unsupported_node "~Copyable" source="~Copyable" member: - variable_declaration - modifier: modifier "let" - pattern: identifier "descriptor" - type: identifier "Int" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩: ⟨type⟩" + modifier: modifier "let" source="let" + pattern: identifier "descriptor" source="descriptor" + type: identifier "Int" source="Int" diff --git a/unified/extractor/tests/corpus/swift/types/property-with-getter-and-setter.output b/unified/extractor/tests/corpus/swift/types/property-with-getter-and-setter.output index a37b28985e6b..f84cf98e24c4 100644 --- a/unified/extractor/tests/corpus/swift/types/property-with-getter-and-setter.output +++ b/unified/extractor/tests/corpus/swift/types/property-with-getter-and-setter.output @@ -102,41 +102,41 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - class_like_declaration - modifier: modifier "class" - name_node: identifier "Box" + class_like_declaration source="⟨modifier⟩ ⟨name_node⟩ {\n ⟨member⟩\n ⟨member⟩⟨member⟩\n }\n}" + modifier: modifier "class" source="class" + name_node: identifier "Box" source="Box" member: - variable_declaration + variable_declaration source="⟨modifier⟩ ⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" modifier: - modifier "var" - modifier "private" - pattern: identifier "_v" - value: int_literal "0" - accessor_declaration - modifier: modifier "var" - name_node: identifier "v" - accessor_kind: accessor_kind "get" - type: identifier "Int" + modifier "var" source="var" + modifier "private" source="private" + pattern: identifier "_v" source="_v" + value: int_literal "0" source="0" + accessor_declaration source="⟨modifier⟩ ⟨name_node⟩: ⟨type⟩ {\n ⟨accessor_kind⟩ ⟨body⟩" + modifier: modifier "var" source="var" + name_node: identifier "v" source="v" + accessor_kind: accessor_kind "get" source="get" + type: identifier "Int" source="Int" body: - block + block source="{ ⟨stmt⟩ }" stmt: - return_expr - value: identifier "_v" - accessor_declaration + return_expr source="return ⟨value⟩" + value: identifier "_v" source="_v" + accessor_declaration source="⟨modifier⟩ ⟨name_node⟩: ⟨type⟩ {\n get { return _v }\n ⟨accessor_kind⟩⟨modifier⟩⟨body⟩" modifier: - modifier "var" - modifier "chained_declaration" - name_node: identifier "v" - accessor_kind: accessor_kind "set" - type: identifier "Int" + modifier "var" source="var" + modifier "chained_declaration" source="set { _v = newValue }" + name_node: identifier "v" source="v" + accessor_kind: accessor_kind "set" source="set" + type: identifier "Int" source="Int" body: - block + block source="{ ⟨stmt⟩ }" stmt: - binary_expr - left: identifier "_v" - operator: infix_operator "=" - right: identifier "newValue" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "_v" source="_v" + operator: infix_operator "=" source="=" + right: identifier "newValue" source="newValue" diff --git a/unified/extractor/tests/corpus/swift/types/protocol-declaration.output b/unified/extractor/tests/corpus/swift/types/protocol-declaration.output index dacfae76cb34..b2bc4b1e1867 100644 --- a/unified/extractor/tests/corpus/swift/types/protocol-declaration.output +++ b/unified/extractor/tests/corpus/swift/types/protocol-declaration.output @@ -53,18 +53,18 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - class_like_declaration - modifier: modifier "protocol" - name_node: identifier "Drawable" + class_like_declaration source="⟨modifier⟩ ⟨name_node⟩ {\n ⟨member⟩\n ⟨member⟩\n}" + modifier: modifier "protocol" source="protocol" + name_node: identifier "Drawable" source="Drawable" member: - function_declaration - name_node: identifier "draw" - body: block "func draw()" - function_declaration - modifier: modifier "static" - name_node: identifier "make" - body: block "static func make()" + function_declaration source="⟨body⟩⟨name_node⟩" + name_node: identifier "draw" source="draw" + body: block "func draw()" source="func draw()" + function_declaration source="⟨modifier⟩⟨body⟩⟨name_node⟩" + modifier: modifier "static" source="static" + name_node: identifier "make" source="make" + body: block "static func make()" source="static func make()" diff --git a/unified/extractor/tests/corpus/swift/types/protocol-with-read-only-and-read-write-property-requirements.output b/unified/extractor/tests/corpus/swift/types/protocol-with-read-only-and-read-write-property-requirements.output index 37e084520a18..0a3277df185c 100644 --- a/unified/extractor/tests/corpus/swift/types/protocol-with-read-only-and-read-write-property-requirements.output +++ b/unified/extractor/tests/corpus/swift/types/protocol-with-read-only-and-read-write-property-requirements.output @@ -102,28 +102,28 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - class_like_declaration - modifier: modifier "protocol" - name_node: identifier "P" + class_like_declaration source="⟨modifier⟩ ⟨name_node⟩ {\n var ⟨member⟩ }\n var ⟨member⟩⟨member⟩ }\n var ⟨member⟩ }\n}" + modifier: modifier "protocol" source="protocol" + name_node: identifier "P" source="P" member: - accessor_declaration - name_node: identifier "foo" - accessor_kind: accessor_kind "get" - type: identifier "Int" - accessor_declaration - name_node: identifier "bar" - accessor_kind: accessor_kind "get" - type: identifier "String" - accessor_declaration - modifier: modifier "chained_declaration" - name_node: identifier "bar" - accessor_kind: accessor_kind "set" - type: identifier "String" - accessor_declaration - name_node: identifier "count" - accessor_kind: accessor_kind "get" - type: identifier "Int" + accessor_declaration source="⟨name_node⟩: ⟨type⟩ { ⟨accessor_kind⟩" + name_node: identifier "foo" source="foo" + accessor_kind: accessor_kind "get" source="get" + type: identifier "Int" source="Int" + accessor_declaration source="⟨name_node⟩: ⟨type⟩ { ⟨accessor_kind⟩" + name_node: identifier "bar" source="bar" + accessor_kind: accessor_kind "get" source="get" + type: identifier "String" source="String" + accessor_declaration source="⟨name_node⟩: ⟨type⟩ { get ⟨accessor_kind⟩⟨modifier⟩" + modifier: modifier "chained_declaration" source="set" + name_node: identifier "bar" source="bar" + accessor_kind: accessor_kind "set" source="set" + type: identifier "String" source="String" + accessor_declaration source="⟨name_node⟩: ⟨type⟩ { ⟨accessor_kind⟩" + name_node: identifier "count" source="count" + accessor_kind: accessor_kind "get" source="get" + type: identifier "Int" source="Int" diff --git a/unified/extractor/tests/corpus/swift/types/qualified-type.output b/unified/extractor/tests/corpus/swift/types/qualified-type.output index 4512e9e6c54d..df148ed33316 100644 --- a/unified/extractor/tests/corpus/swift/types/qualified-type.output +++ b/unified/extractor/tests/corpus/swift/types/qualified-type.output @@ -97,35 +97,35 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩\n\n⟨stmt⟩\n⟨stmt⟩" stmt: - class_like_declaration - modifier: modifier "struct" - name_node: identifier "Outer" + class_like_declaration source="⟨modifier⟩ ⟨name_node⟩ {\n ⟨member⟩\n}" + modifier: modifier "struct" source="struct" + name_node: identifier "Outer" source="Outer" member: - class_like_declaration - modifier: modifier "struct" - name_node: identifier "Inner" + class_like_declaration source="⟨modifier⟩ ⟨name_node⟩ {\n ⟨member⟩\n }" + modifier: modifier "struct" source="struct" + name_node: identifier "Inner" source="Inner" member: - class_like_declaration - modifier: modifier "struct" - name_node: identifier "Deep" - variable_declaration - modifier: modifier "let" - pattern: identifier "value" + class_like_declaration source="⟨modifier⟩ ⟨name_node⟩ {}" + modifier: modifier "struct" source="struct" + name_node: identifier "Deep" source="Deep" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩: ⟨type⟩" + modifier: modifier "let" source="let" + pattern: identifier "value" source="value" type: - member_access_expr - base: identifier "Outer" - member_name_node: identifier "Inner" - variable_declaration - modifier: modifier "let" - pattern: identifier "nested" + member_access_expr source="⟨base⟩.⟨member_name_node⟩" + base: identifier "Outer" source="Outer" + member_name_node: identifier "Inner" source="Inner" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩: ⟨type⟩" + modifier: modifier "let" source="let" + pattern: identifier "nested" source="nested" type: - member_access_expr + member_access_expr source="⟨base⟩.⟨member_name_node⟩" base: - member_access_expr - base: identifier "Outer" - member_name_node: identifier "Inner" - member_name_node: identifier "Deep" + member_access_expr source="⟨base⟩.⟨member_name_node⟩" + base: identifier "Outer" source="Outer" + member_name_node: identifier "Inner" source="Inner" + member_name_node: identifier "Deep" source="Deep" diff --git a/unified/extractor/tests/corpus/swift/types/static-function.output b/unified/extractor/tests/corpus/swift/types/static-function.output index f610765a02eb..b7f87ab13d76 100644 --- a/unified/extractor/tests/corpus/swift/types/static-function.output +++ b/unified/extractor/tests/corpus/swift/types/static-function.output @@ -43,15 +43,15 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - class_like_declaration - modifier: modifier "class" - name_node: identifier "Factory" + class_like_declaration source="⟨modifier⟩ ⟨name_node⟩ {\n ⟨member⟩\n}" + modifier: modifier "class" source="class" + name_node: identifier "Factory" source="Factory" member: - function_declaration - modifier: modifier "static" - name_node: identifier "make" - body: block "static func make() {}" + function_declaration source="⟨modifier⟩⟨body⟩⟨name_node⟩" + modifier: modifier "static" source="static" + name_node: identifier "make" source="make" + body: block "static func make() {}" source="static func make() {}" diff --git a/unified/extractor/tests/corpus/swift/types/struct.output b/unified/extractor/tests/corpus/swift/types/struct.output index 133a2935acd7..06bfef904314 100644 --- a/unified/extractor/tests/corpus/swift/types/struct.output +++ b/unified/extractor/tests/corpus/swift/types/struct.output @@ -57,19 +57,19 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - class_like_declaration - modifier: modifier "struct" - name_node: identifier "Point" + class_like_declaration source="⟨modifier⟩ ⟨name_node⟩ {\n ⟨member⟩\n ⟨member⟩\n}" + modifier: modifier "struct" source="struct" + name_node: identifier "Point" source="Point" member: - variable_declaration - modifier: modifier "let" - pattern: identifier "x" - type: identifier "Int" - variable_declaration - modifier: modifier "let" - pattern: identifier "y" - type: identifier "Int" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩: ⟨type⟩" + modifier: modifier "let" source="let" + pattern: identifier "x" source="x" + type: identifier "Int" source="Int" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩: ⟨type⟩" + modifier: modifier "let" source="let" + pattern: identifier "y" source="y" + type: identifier "Int" source="Int" diff --git a/unified/extractor/tests/corpus/swift/variables/assignment.output b/unified/extractor/tests/corpus/swift/variables/assignment.output index 384b09066e37..cdfb041a8025 100644 --- a/unified/extractor/tests/corpus/swift/variables/assignment.output +++ b/unified/extractor/tests/corpus/swift/variables/assignment.output @@ -20,11 +20,11 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - binary_expr - left: identifier "x" - operator: infix_operator "=" - right: int_literal "1" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "x" source="x" + operator: infix_operator "=" source="=" + right: int_literal "1" source="1" diff --git a/unified/extractor/tests/corpus/swift/variables/binding-modifier-does-not-leak-into-initializer.output b/unified/extractor/tests/corpus/swift/variables/binding-modifier-does-not-leak-into-initializer.output index 6776009f62bb..90e58be069ad 100644 --- a/unified/extractor/tests/corpus/swift/variables/binding-modifier-does-not-leak-into-initializer.output +++ b/unified/extractor/tests/corpus/swift/variables/binding-modifier-does-not-leak-into-initializer.output @@ -61,23 +61,23 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "x" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "x" source="x" value: - switch_expr - value: identifier "y" + switch_expr source="switch ⟨value⟩ {\n⟨case⟩\n⟨case⟩\n}" + value: identifier "y" source="y" case: - switch_case - pattern: identifier "someConstant" + switch_case source="⟨body⟩⟨pattern⟩" + pattern: identifier "someConstant" source="someConstant" body: - block - stmt: int_literal "1" - switch_case + block source="case someConstant: ⟨stmt⟩" + stmt: int_literal "1" source="1" + switch_case source="⟨body⟩" body: - block - stmt: int_literal "2" + block source="default: ⟨stmt⟩" + stmt: int_literal "2" source="2" diff --git a/unified/extractor/tests/corpus/swift/variables/compound-assignment.output b/unified/extractor/tests/corpus/swift/variables/compound-assignment.output index e5e1fc04f93d..300996f69952 100644 --- a/unified/extractor/tests/corpus/swift/variables/compound-assignment.output +++ b/unified/extractor/tests/corpus/swift/variables/compound-assignment.output @@ -20,11 +20,11 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - binary_expr - left: identifier "x" - operator: infix_operator "+=" - right: int_literal "1" + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "x" source="x" + operator: infix_operator "+=" source="+=" + right: int_literal "1" source="1" diff --git a/unified/extractor/tests/corpus/swift/variables/let-binding.output b/unified/extractor/tests/corpus/swift/variables/let-binding.output index d4cefc129d47..ae64722a29c5 100644 --- a/unified/extractor/tests/corpus/swift/variables/let-binding.output +++ b/unified/extractor/tests/corpus/swift/variables/let-binding.output @@ -25,11 +25,11 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "x" - value: int_literal "1" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "x" source="x" + value: int_literal "1" source="1" diff --git a/unified/extractor/tests/corpus/swift/variables/let-with-type-annotation.output b/unified/extractor/tests/corpus/swift/variables/let-with-type-annotation.output index 8a28988e8b9d..2100371ba3ca 100644 --- a/unified/extractor/tests/corpus/swift/variables/let-with-type-annotation.output +++ b/unified/extractor/tests/corpus/swift/variables/let-with-type-annotation.output @@ -31,12 +31,12 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "x" - type: identifier "Int" - value: int_literal "1" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩: ⟨type⟩ = ⟨value⟩" + modifier: modifier "let" source="let" + pattern: identifier "x" source="x" + type: identifier "Int" source="Int" + value: int_literal "1" source="1" diff --git a/unified/extractor/tests/corpus/swift/variables/multiple-bindings-on-one-line.output b/unified/extractor/tests/corpus/swift/variables/multiple-bindings-on-one-line.output index 2ab4bc96691f..fd6057bfb1f8 100644 --- a/unified/extractor/tests/corpus/swift/variables/multiple-bindings-on-one-line.output +++ b/unified/extractor/tests/corpus/swift/variables/multiple-bindings-on-one-line.output @@ -36,17 +36,17 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" - pattern: identifier "x" - value: int_literal "1" - variable_declaration + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩," + modifier: modifier "let" source="let" + pattern: identifier "x" source="x" + value: int_literal "1" source="1" + variable_declaration source="⟨modifier⟩ x = 1, ⟨pattern⟩⟨modifier⟩⟨value⟩" modifier: - modifier "let" - modifier "chained_declaration" - pattern: identifier "y" - value: int_literal "2" + modifier "let" source="let" + modifier "chained_declaration" source="y = 2" + pattern: identifier "y" source="y" + value: int_literal "2" source="2" diff --git a/unified/extractor/tests/corpus/swift/variables/property-with-willset-and-didset-observers.output b/unified/extractor/tests/corpus/swift/variables/property-with-willset-and-didset-observers.output index c574ee74d788..13397f03e6fd 100644 --- a/unified/extractor/tests/corpus/swift/variables/property-with-willset-and-didset-observers.output +++ b/unified/extractor/tests/corpus/swift/variables/property-with-willset-and-didset-observers.output @@ -97,44 +97,44 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - class_like_declaration - modifier: modifier "class" - name_node: identifier "C" + class_like_declaration source="⟨modifier⟩ ⟨name_node⟩ {\n ⟨member⟩⟨member⟩⟨member⟩\n}" + modifier: modifier "class" source="class" + name_node: identifier "C" source="C" member: - variable_declaration - modifier: modifier "var" - pattern: identifier "x" - type: identifier "Int" - value: int_literal "0" - accessor_declaration + variable_declaration source="⟨modifier⟩ ⟨pattern⟩: ⟨type⟩ = ⟨value⟩ {\n willSet { print(newValue) }\n didSet { print(oldValue) }\n }" + modifier: modifier "var" source="var" + pattern: identifier "x" source="x" + type: identifier "Int" source="Int" + value: int_literal "0" source="0" + accessor_declaration source="⟨modifier⟩ ⟨name_node⟩: Int = 0 {\n ⟨accessor_kind⟩⟨modifier⟩⟨body⟩" modifier: - modifier "var" - modifier "chained_declaration" - name_node: identifier "x" - accessor_kind: accessor_kind "willSet" + modifier "var" source="var" + modifier "chained_declaration" source="willSet { print(newValue) }" + name_node: identifier "x" source="x" + accessor_kind: accessor_kind "willSet" source="willSet" body: - block + block source="{ ⟨stmt⟩ }" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: identifier "newValue" - accessor_declaration + argument source="⟨value⟩" + value: identifier "newValue" source="newValue" + accessor_declaration source="⟨modifier⟩ ⟨name_node⟩: Int = 0 {\n willSet { print(newValue) }\n ⟨accessor_kind⟩⟨modifier⟩⟨body⟩" modifier: - modifier "var" - modifier "chained_declaration" - name_node: identifier "x" - accessor_kind: accessor_kind "didSet" + modifier "var" source="var" + modifier "chained_declaration" source="didSet { print(oldValue) }" + name_node: identifier "x" source="x" + accessor_kind: accessor_kind "didSet" source="didSet" body: - block + block source="{ ⟨stmt⟩ }" stmt: - call_expr - callee: identifier "print" + call_expr source="⟨callee⟩(⟨argument⟩)" + callee: identifier "print" source="print" argument: - argument - value: identifier "oldValue" + argument source="⟨value⟩" + value: identifier "oldValue" source="oldValue" diff --git a/unified/extractor/tests/corpus/swift/variables/tuple-destructuring-binding.output b/unified/extractor/tests/corpus/swift/variables/tuple-destructuring-binding.output index 1036f85b4e94..794c3e5054ec 100644 --- a/unified/extractor/tests/corpus/swift/variables/tuple-destructuring-binding.output +++ b/unified/extractor/tests/corpus/swift/variables/tuple-destructuring-binding.output @@ -36,17 +36,17 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "let" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "let" source="let" pattern: - tuple_expr + tuple_expr source="(⟨element⟩ ⟨element⟩)" element: - argument - value: identifier "a" - argument - value: identifier "b" - value: identifier "pair" + argument source="⟨value⟩," + value: identifier "a" source="a" + argument source="⟨value⟩" + value: identifier "b" source="b" + value: identifier "pair" source="pair" diff --git a/unified/extractor/tests/corpus/swift/variables/var-binding.output b/unified/extractor/tests/corpus/swift/variables/var-binding.output index a2c717034c0d..ee5a922da8f6 100644 --- a/unified/extractor/tests/corpus/swift/variables/var-binding.output +++ b/unified/extractor/tests/corpus/swift/variables/var-binding.output @@ -25,11 +25,11 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "var" - pattern: identifier "x" - value: int_literal "1" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "var" source="var" + pattern: identifier "x" source="x" + value: int_literal "1" source="1" diff --git a/unified/extractor/tests/corpus/swift/variables/var-without-initialiser.output b/unified/extractor/tests/corpus/swift/variables/var-without-initialiser.output index 7996077c0d36..4aac0af4ce32 100644 --- a/unified/extractor/tests/corpus/swift/variables/var-without-initialiser.output +++ b/unified/extractor/tests/corpus/swift/variables/var-without-initialiser.output @@ -25,11 +25,11 @@ sourceFile --- -top_level +top_level source="⟨body⟩" body: - block + block source="⟨stmt⟩" stmt: - variable_declaration - modifier: modifier "var" - pattern: identifier "x" - type: identifier "Int" + variable_declaration source="⟨modifier⟩ ⟨pattern⟩: ⟨type⟩" + modifier: modifier "var" source="var" + pattern: identifier "x" source="x" + type: identifier "Int" source="Int" diff --git a/unified/extractor/tests/corpus_tests.rs b/unified/extractor/tests/corpus_tests.rs index 47675fc2287f..852e72452c5b 100644 --- a/unified/extractor/tests/corpus_tests.rs +++ b/unified/extractor/tests/corpus_tests.rs @@ -2,7 +2,7 @@ use std::fs; use std::path::Path; use codeql_extractor::extractor::desugaring; -use yeast::{dump::dump_ast, dump::dump_ast_with_type_errors}; +use yeast::dump::{DumpOptions, dump_ast, dump_ast_with_type_errors_and_options}; #[path = "../src/languages/mod.rs"] mod languages; @@ -223,11 +223,15 @@ fn test_corpus() { )); } Ok(actual) => { - let actual_dump = dump_ast_with_type_errors( + let actual_dump = dump_ast_with_type_errors_and_options( &actual, actual.get_root(), &case_input, &output_schema, + &DumpOptions { + show_abridged_source: true, + ..DumpOptions::default() + }, ); if update_mode { case.expected = actual_dump.trim().to_string(); From 80db2b229618a63e8360cf60968404bccf5c74dd Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Fri, 18 Sep 2026 15:00:21 +0200 Subject: [PATCH 1134/2098] Type inference: Revert inverse append changes --- .../typeinference/internal/TypeInference.qll | 42 +--- shared/util/codeql/util/Strings.qll | 191 ------------------ 2 files changed, 8 insertions(+), 225 deletions(-) diff --git a/shared/typeinference/codeql/typeinference/internal/TypeInference.qll b/shared/typeinference/codeql/typeinference/internal/TypeInference.qll index a475a19096d7..8331144faa80 100644 --- a/shared/typeinference/codeql/typeinference/internal/TypeInference.qll +++ b/shared/typeinference/codeql/typeinference/internal/TypeInference.qll @@ -70,7 +70,6 @@ overlay[local?] module; private import codeql.util.Location -private import codeql.util.Strings /** Provides the input to `Make1`. */ signature module InputSig1 { @@ -1435,18 +1434,6 @@ module Make1 Input1> { private module SatisfiesParameterConstraint = SatisfiesConstraint; - private module InverseAppend2Input implements InverseAppend2InputSig { - class C1 = Declaration; - - class C2 = AccessPosition; - - class Result = TypeParameter; - - predicate prefixCandidate(string prefix, C1 c1, C2 c2, Result res) { - argRootTypeSatisfiesTargetTypeCand(_, c1, c2, res, prefix) - } - } - /** * Holds if the (transitive) base type `t` at `path` of `a` in environment `e` * for some `AccessPosition` matches the type parameter `tp`, which is used in @@ -1483,11 +1470,12 @@ module Make1 Input1> { predicate baseTypeMatch( Access a, AccessEnvironment e, Declaration target, TypePath path, Type t, TypeParameter tp ) { - exists(AccessPosition apos, TypePath pathFull | + exists(AccessPosition apos, TypePath pathToTp | + argRootTypeSatisfiesTargetTypeCand(_, target, pragma[only_bind_into](apos), tp, pathToTp) and SatisfiesParameterConstraint::satisfiesConstraint(MkRelevantAccess(a, pragma[only_bind_into](apos), e), - MkRelevantTarget(target, pragma[only_bind_into](apos)), pathFull, t) and - InverseAppend2::inverseAppend(pathFull, _, path, target, apos, tp) and + MkRelevantTarget(target, pragma[only_bind_into](apos)), pathToTp.appendInverse(path), + t) and hasNotTypeArgument(a, target, tp) ) } @@ -1642,29 +1630,15 @@ module Make1 Input1> { constrainedTp != tp } - private module InverseAppend3Input implements InverseAppend3InputSig { - class C1 = Declaration; - - class C2 = TypeParameter; - - class C3 = TypeMention; - - class Result = TypeParameter; - - predicate prefixCandidate(string prefix, C1 c1, C2 c2, C3 c3, Result res) { - typeParameterConstraintHasTypeParameter(c1, c2, c3, prefix, res) - } - } - pragma[nomagic] private predicate typeConstraintBaseTypeMatch( Access a, AccessEnvironment e, Declaration target, TypePath path, Type t, TypeParameter tp ) { hasNotTypeArgument(a, target, tp) and - exists(TypeParameter constrainedTp, TypeMention constraint, TypePath pathFull | - AccessConstraint::satisfiesConstraint(a, e, target, constrainedTp, constraint, pathFull, t) and - InverseAppend3::inverseAppend(pathFull, _, path, target, - constrainedTp, constraint, tp) + exists(TypeMention constraint, TypeParameter constrainedTp, TypePath pathToTp | + typeParameterConstraintHasTypeParameter(target, constrainedTp, constraint, pathToTp, tp) and + AccessConstraint::satisfiesConstraint(a, e, target, constrainedTp, constraint, + pathToTp.appendInverse(path), t) ) } diff --git a/shared/util/codeql/util/Strings.qll b/shared/util/codeql/util/Strings.qll index de4139550dbe..b032bb73672b 100644 --- a/shared/util/codeql/util/Strings.qll +++ b/shared/util/codeql/util/Strings.qll @@ -91,194 +91,3 @@ int asciiPrintable(string char) { .charAt(_) ) } - -/** - * Escapes all characters in `s` that have special meaning in regular expressions. - */ -bindingset[s] -string regexpEscape(string s) { - result = s.regexpReplaceAll("([\\\\.*+?\\[^\\]$(){}=!<>|:\\-])", "\\\\$1") -} - -/** Provides the input to `InverseAppend`. */ -signature module InverseAppendInputSig { - /** A prefix matching result. */ - bindingset[this] - class Result; - - /** - * Holds if `prefix` is a prefix candidate with resulting value `res`. - */ - predicate prefixCandidate(string prefix, Result res); -} - -/** Provides the `inverseAppend` predicate. */ -module InverseAppend { - /** - * Holds if `s = prefix + suffix` with resulting value `res`. - * - * The predicate avoids unnecessary result fan-out by first constraining the - * prefix using a regular expression match. - */ - bindingset[s] - predicate inverseAppend(string s, string prefix, string suffix, Input::Result res) { - exists(string regexp | - regexp = - "(" + - strictconcat(string prefixCand | - Input::prefixCandidate(prefixCand, _) - | - regexpEscape(prefixCand), "|" - ) + ").*" and - prefix = s.regexpCapture(regexp, 1) and - s = prefix + suffix and - Input::prefixCandidate(prefix, res) - ) - } -} - -/** Provides the input to `InverseAppend1`. */ -signature module InverseAppend1InputSig { - /** A prefix matching context. */ - bindingset[this] - class C; - - /** A prefix matching result. */ - bindingset[this] - class Result; - - /** - * Holds if `prefix` is a prefix candidate in the context `c` - * with resulting value `res`. - */ - predicate prefixCandidate(string prefix, C c, Result res); -} - -/** Provides the `inverseAppend` predicate. */ -module InverseAppend1 { - /** - * Holds if `s = prefix + suffix` in the context `c` with resulting - * value `res`. - * - * The predicate avoids unnecessary result fan-out by first constraining the - * prefix using a regular expression match. - */ - bindingset[s] - predicate inverseAppend(string s, string prefix, string suffix, Input::C c, Input::Result res) { - exists(string regexp | - regexp = - "(" + - strictconcat(string prefixCand | - Input::prefixCandidate(prefixCand, c, _) - | - regexpEscape(prefixCand), "|" - ) + ").*" and - prefix = s.regexpCapture(regexp, 1) and - s = prefix + suffix and - Input::prefixCandidate(prefix, c, res) - ) - } -} - -/** Provides the input to `InverseAppend2`. */ -signature module InverseAppend2InputSig { - /** A prefix matching context. */ - bindingset[this] - class C1; - - /** A prefix matching context. */ - bindingset[this] - class C2; - - /** A prefix matching result. */ - bindingset[this] - class Result; - - /** - * Holds if `prefix` is a prefix candidate in the context `(c1, c2)` - * with resulting value `res`. - */ - predicate prefixCandidate(string prefix, C1 c1, C2 c2, Result res); -} - -/** Provides the `inverseAppend` predicate. */ -module InverseAppend2 { - /** - * Holds if `s = prefix + suffix` in the context `(c1, c2)` with resulting - * value `res`. - * - * The predicate avoids unnecessary result fan-out by first constraining the - * prefix using a regular expression match. - */ - bindingset[s] - predicate inverseAppend( - string s, string prefix, string suffix, Input::C1 c1, Input::C2 c2, Input::Result res - ) { - exists(string regexp | - regexp = - "(" + - strictconcat(string prefixCand | - Input::prefixCandidate(prefixCand, c1, c2, _) - | - regexpEscape(prefixCand), "|" - ) + ").*" and - prefix = s.regexpCapture(regexp, 1) and - s = prefix + suffix and - Input::prefixCandidate(prefix, c1, c2, res) - ) - } -} - -/** Provides the input to `InverseAppend3`. */ -signature module InverseAppend3InputSig { - /** A prefix matching context. */ - bindingset[this] - class C1; - - /** A prefix matching context. */ - bindingset[this] - class C2; - - /** A prefix matching context. */ - bindingset[this] - class C3; - - /** A prefix matching result. */ - bindingset[this] - class Result; - - /** - * Holds if `prefix` is a prefix candidate in the context `(c1, c2, c3)` - * with resulting value `res`. - */ - predicate prefixCandidate(string prefix, C1 c1, C2 c2, C3 c3, Result res); -} - -/** Provides the `inverseAppend` predicate. */ -module InverseAppend3 { - /** - * Holds if `s = prefix + suffix` in the context `(c1, c2, c3)` with resulting - * value `res`. - * - * The predicate avoids unnecessary result fan-out by first constraining the - * prefix using a regular expression match. - */ - bindingset[s] - predicate inverseAppend( - string s, string prefix, string suffix, Input::C1 c1, Input::C2 c2, Input::C3 c3, - Input::Result res - ) { - exists(string regexp | - regexp = - "(" + - strictconcat(string prefixCand | - Input::prefixCandidate(prefixCand, c1, c2, c3, _) - | - regexpEscape(prefixCand), "|" - ) + ").*" and - prefix = s.regexpCapture(regexp, 1) and - s = prefix + suffix and - Input::prefixCandidate(prefix, c1, c2, c3, res) - ) - } -} From 1f8b466018a93a2043dd01f3f7a834c870945c8a Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Wed, 26 Aug 2026 15:42:08 +0200 Subject: [PATCH 1135/2098] Rust: Model `[T;n] -> [T]` unsized coercions as implicit derefs --- .../rust/frameworks/stdlib/core.model.yml | 3 + .../dataflow/local/DataFlowStep.expected | 54 ++++++ .../dataflow/local/inline-flow.expected | 178 +++++++++++++----- .../test/library-tests/dataflow/local/main.rs | 14 +- .../test/library-tests/type-inference/main.rs | 10 +- .../type-inference/type-inference.expected | 55 ++++-- .../CWE-078/CommandInjection.expected | 12 -- .../test/query-tests/security/CWE-078/main.rs | 4 +- rust/tools/builtins/types.rs | 9 + 9 files changed, 254 insertions(+), 85 deletions(-) diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml index e68f69fa0681..68b34d2f6797 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml @@ -7,6 +7,8 @@ extensions: - ["<& as core::ops::deref::Deref>::deref", "Argument[self].Reference", "ReturnValue", "value", "manual"] - ["<&mut as core::ops::deref::Deref>::deref", "Argument[self].Reference", "ReturnValue", "value", "manual"] - ["::deref", "Argument[self].Reference", "ReturnValue.Reference", "taint", "manual"] + # for the pseudo implementation in `builtins/types.rs` + - ["<[;] as core::ops::deref::Deref>::deref", "Argument[self].Reference", "ReturnValue.Reference", "value", "manual"] # Index - ["::index", "Argument[self].Reference.Element", "ReturnValue.Reference", "value", "manual"] - ["::index_mut", "Argument[self].Reference.Element", "ReturnValue.Reference", "value", "manual"] @@ -140,6 +142,7 @@ extensions: - ["::clamp", "Argument[self,0,1]", "ReturnValue", "value", "manual"] # Slice - ["<[]>::get", "Argument[self].Reference.Element", "ReturnValue.Field[core::option::Option::Some(0)].Reference", "value", "manual"] + - ["<[]>::iter", "Argument[self].Reference.Element", "ReturnValue.Element.Reference", "value", "manual"] - addsTo: pack: codeql/rust-all extensible: sourceModel diff --git a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected index 8f50c8d56e97..c6984639dcef 100644 --- a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected +++ b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected @@ -763,6 +763,7 @@ localStep | main.rs:535:20:535:20 | x | main.rs:535:20:535:20 | x | | main.rs:536:5:536:6 | [post] vs | main.rs:538:14:538:15 | vs | | main.rs:536:5:536:6 | vs | main.rs:538:14:538:15 | vs | +| main.rs:536:24:536:35 | \|...\| ... | main.rs:536:24:536:35 | \|...\| ... | | main.rs:536:25:536:25 | ... | main.rs:536:25:536:25 | x | | main.rs:536:25:536:25 | [SSA] x | main.rs:536:34:536:34 | x | | main.rs:536:25:536:25 | x | main.rs:536:25:536:25 | [SSA] x | @@ -944,26 +945,57 @@ readStep | main.rs:519:10:519:11 | [post] vs [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:519:10:519:11 | [post] vs | | main.rs:519:10:519:14 | vs[0] [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:519:10:519:14 | vs[0] | | main.rs:520:10:520:35 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:520:10:520:35 | * ... | +| main.rs:520:11:520:12 | [post] vs [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:520:11:520:12 | [post] vs [implicit deref 0 in state after deref] | +| main.rs:520:11:520:12 | [post] vs [implicit deref 0 in state after borrow] | file://:0:0:0:0 | &ref | main.rs:520:11:520:12 | [post] vs | +| main.rs:520:11:520:12 | vs [implicit deref 0 in state before deref] | file://:0:0:0:0 | &ref | main.rs:520:11:520:12 | vs [implicit deref 0 in state after deref] | +| main.rs:520:11:520:19 | [post] vs.iter() [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:520:11:520:19 | [post] vs.iter() | | main.rs:520:11:520:35 | [post] ... .unwrap() [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:520:11:520:35 | [post] ... .unwrap() | | main.rs:521:10:521:35 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:521:10:521:35 | * ... | +| main.rs:521:11:521:12 | [post] vs [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:521:11:521:12 | [post] vs [implicit deref 0 in state after deref] | +| main.rs:521:11:521:12 | [post] vs [implicit deref 0 in state after borrow] | file://:0:0:0:0 | &ref | main.rs:521:11:521:12 | [post] vs | +| main.rs:521:11:521:12 | vs [implicit deref 0 in state before deref] | file://:0:0:0:0 | &ref | main.rs:521:11:521:12 | vs [implicit deref 0 in state after deref] | +| main.rs:521:11:521:19 | [post] vs.iter() [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:521:11:521:19 | [post] vs.iter() | | main.rs:521:11:521:35 | [post] ... .unwrap() [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:521:11:521:35 | [post] ... .unwrap() | | main.rs:523:14:523:15 | vs | file://:0:0:0:0 | element | main.rs:523:9:523:9 | v | | main.rs:526:9:526:10 | &... | file://:0:0:0:0 | &ref | main.rs:526:10:526:10 | v | +| main.rs:526:15:526:16 | [post] vs [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:526:15:526:16 | [post] vs [implicit deref 0 in state after deref] | +| main.rs:526:15:526:16 | [post] vs [implicit deref 0 in state after borrow] | file://:0:0:0:0 | &ref | main.rs:526:15:526:16 | [post] vs | +| main.rs:526:15:526:16 | vs [implicit deref 0 in state before deref] | file://:0:0:0:0 | &ref | main.rs:526:15:526:16 | vs [implicit deref 0 in state after deref] | | main.rs:526:15:526:23 | vs.iter() | file://:0:0:0:0 | element | main.rs:526:9:526:10 | &... | +| main.rs:530:26:530:27 | [post] vs [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:530:26:530:27 | [post] vs [implicit deref 0 in state after deref] | +| main.rs:530:26:530:27 | [post] vs [implicit deref 0 in state after borrow] | file://:0:0:0:0 | &ref | main.rs:530:26:530:27 | [post] vs | +| main.rs:530:26:530:27 | vs [implicit deref 0 in state before deref] | file://:0:0:0:0 | &ref | main.rs:530:26:530:27 | vs [implicit deref 0 in state after deref] | | main.rs:531:9:531:10 | &... | file://:0:0:0:0 | &ref | main.rs:531:10:531:10 | v | | main.rs:531:15:531:17 | vs2 | file://:0:0:0:0 | element | main.rs:531:9:531:10 | &... | +| main.rs:535:5:535:6 | [post] vs [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:535:5:535:6 | [post] vs [implicit deref 0 in state after deref] | +| main.rs:535:5:535:6 | [post] vs [implicit deref 0 in state after borrow] | file://:0:0:0:0 | &ref | main.rs:535:5:535:6 | [post] vs | +| main.rs:535:5:535:6 | vs [implicit deref 0 in state before deref] | file://:0:0:0:0 | &ref | main.rs:535:5:535:6 | vs [implicit deref 0 in state after deref] | | main.rs:535:28:535:29 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:535:28:535:29 | * ... | | main.rs:535:29:535:29 | [post] x [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:535:29:535:29 | [post] x | +| main.rs:536:5:536:6 | [post] vs [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:536:5:536:6 | [post] vs [implicit deref 0 in state after deref] | +| main.rs:536:5:536:6 | [post] vs [implicit deref 0 in state after borrow] | file://:0:0:0:0 | &ref | main.rs:536:5:536:6 | [post] vs | +| main.rs:536:5:536:6 | vs [implicit deref 0 in state before deref] | file://:0:0:0:0 | &ref | main.rs:536:5:536:6 | vs [implicit deref 0 in state after deref] | | main.rs:536:33:536:34 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:536:33:536:34 | * ... | | main.rs:536:34:536:34 | [post] x [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:536:34:536:34 | [post] x | | main.rs:538:14:538:27 | vs.into_iter() | file://:0:0:0:0 | element | main.rs:538:9:538:9 | v | | main.rs:544:10:544:15 | [post] vs_mut [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:544:10:544:15 | [post] vs_mut | | main.rs:544:10:544:18 | vs_mut[0] [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:544:10:544:18 | vs_mut[0] | | main.rs:545:10:545:39 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:545:10:545:39 | * ... | +| main.rs:545:11:545:16 | [post] vs_mut [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:545:11:545:16 | [post] vs_mut [implicit deref 0 in state after deref] | +| main.rs:545:11:545:16 | [post] vs_mut [implicit deref 0 in state after borrow] | file://:0:0:0:0 | &ref | main.rs:545:11:545:16 | [post] vs_mut | +| main.rs:545:11:545:16 | vs_mut [implicit deref 0 in state before deref] | file://:0:0:0:0 | &ref | main.rs:545:11:545:16 | vs_mut [implicit deref 0 in state after deref] | +| main.rs:545:11:545:23 | [post] vs_mut.iter() [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:545:11:545:23 | [post] vs_mut.iter() | | main.rs:545:11:545:39 | [post] ... .unwrap() [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:545:11:545:39 | [post] ... .unwrap() | | main.rs:546:10:546:39 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:546:10:546:39 | * ... | +| main.rs:546:11:546:16 | [post] vs_mut [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:546:11:546:16 | [post] vs_mut [implicit deref 0 in state after deref] | +| main.rs:546:11:546:16 | [post] vs_mut [implicit deref 0 in state after borrow] | file://:0:0:0:0 | &ref | main.rs:546:11:546:16 | [post] vs_mut | +| main.rs:546:11:546:16 | vs_mut [implicit deref 0 in state before deref] | file://:0:0:0:0 | &ref | main.rs:546:11:546:16 | vs_mut [implicit deref 0 in state after deref] | +| main.rs:546:11:546:23 | [post] vs_mut.iter() [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:546:11:546:23 | [post] vs_mut.iter() | | main.rs:546:11:546:39 | [post] ... .unwrap() [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:546:11:546:39 | [post] ... .unwrap() | | main.rs:548:9:548:14 | &mut ... | file://:0:0:0:0 | &ref | main.rs:548:14:548:14 | v | +| main.rs:548:19:548:24 | [post] vs_mut [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:548:19:548:24 | [post] vs_mut [implicit deref 0 in state after deref] | +| main.rs:548:19:548:24 | [post] vs_mut [implicit deref 0 in state after borrow] | file://:0:0:0:0 | &ref | main.rs:548:19:548:24 | [post] vs_mut | +| main.rs:548:19:548:24 | vs_mut [implicit deref 0 in state before deref] | file://:0:0:0:0 | &ref | main.rs:548:19:548:24 | vs_mut [implicit deref 0 in state after deref] | | main.rs:548:19:548:35 | vs_mut.iter_mut() | file://:0:0:0:0 | element | main.rs:548:9:548:14 | &mut ... | | main.rs:562:10:562:15 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:562:10:562:15 | * ... | | main.rs:562:11:562:15 | [post] c_ref [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:562:11:562:15 | [post] c_ref | @@ -1069,17 +1101,39 @@ storeStep | main.rs:517:30:517:30 | 3 | file://:0:0:0:0 | element | main.rs:517:14:517:34 | [...] | | main.rs:517:33:517:33 | 4 | file://:0:0:0:0 | element | main.rs:517:14:517:34 | [...] | | main.rs:519:10:519:11 | vs | file://:0:0:0:0 | &ref | main.rs:519:10:519:11 | vs [implicit borrow] | +| main.rs:520:11:520:12 | vs | file://:0:0:0:0 | &ref | main.rs:520:11:520:12 | vs [implicit deref 0 in state after borrow] | +| main.rs:520:11:520:12 | vs [implicit deref 0 in state after deref] | file://:0:0:0:0 | &ref | main.rs:520:11:520:12 | vs [implicit borrow] | +| main.rs:520:11:520:19 | vs.iter() | file://:0:0:0:0 | &ref | main.rs:520:11:520:19 | vs.iter() [implicit borrow] | | main.rs:520:11:520:35 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:520:11:520:35 | ... .unwrap() [implicit borrow] | +| main.rs:521:11:521:12 | vs | file://:0:0:0:0 | &ref | main.rs:521:11:521:12 | vs [implicit deref 0 in state after borrow] | +| main.rs:521:11:521:12 | vs [implicit deref 0 in state after deref] | file://:0:0:0:0 | &ref | main.rs:521:11:521:12 | vs [implicit borrow] | +| main.rs:521:11:521:19 | vs.iter() | file://:0:0:0:0 | &ref | main.rs:521:11:521:19 | vs.iter() [implicit borrow] | | main.rs:521:11:521:35 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:521:11:521:35 | ... .unwrap() [implicit borrow] | +| main.rs:526:15:526:16 | vs | file://:0:0:0:0 | &ref | main.rs:526:15:526:16 | vs [implicit deref 0 in state after borrow] | +| main.rs:526:15:526:16 | vs [implicit deref 0 in state after deref] | file://:0:0:0:0 | &ref | main.rs:526:15:526:16 | vs [implicit borrow] | +| main.rs:530:26:530:27 | vs | file://:0:0:0:0 | &ref | main.rs:530:26:530:27 | vs [implicit deref 0 in state after borrow] | +| main.rs:530:26:530:27 | vs [implicit deref 0 in state after deref] | file://:0:0:0:0 | &ref | main.rs:530:26:530:27 | vs [implicit borrow] | +| main.rs:535:5:535:6 | vs | file://:0:0:0:0 | &ref | main.rs:535:5:535:6 | vs [implicit deref 0 in state after borrow] | +| main.rs:535:5:535:6 | vs [implicit deref 0 in state after deref] | file://:0:0:0:0 | &ref | main.rs:535:5:535:6 | vs [implicit borrow] | | main.rs:535:29:535:29 | x | file://:0:0:0:0 | &ref | main.rs:535:29:535:29 | x [implicit borrow] | +| main.rs:536:5:536:6 | vs | file://:0:0:0:0 | &ref | main.rs:536:5:536:6 | vs [implicit deref 0 in state after borrow] | +| main.rs:536:5:536:6 | vs [implicit deref 0 in state after deref] | file://:0:0:0:0 | &ref | main.rs:536:5:536:6 | vs [implicit borrow] | | main.rs:536:34:536:34 | x | file://:0:0:0:0 | &ref | main.rs:536:34:536:34 | x [implicit borrow] | | main.rs:542:23:542:32 | source(...) | file://:0:0:0:0 | element | main.rs:542:22:542:42 | [...] | | main.rs:542:35:542:35 | 2 | file://:0:0:0:0 | element | main.rs:542:22:542:42 | [...] | | main.rs:542:38:542:38 | 3 | file://:0:0:0:0 | element | main.rs:542:22:542:42 | [...] | | main.rs:542:41:542:41 | 4 | file://:0:0:0:0 | element | main.rs:542:22:542:42 | [...] | | main.rs:544:10:544:15 | vs_mut | file://:0:0:0:0 | &ref | main.rs:544:10:544:15 | vs_mut [implicit borrow] | +| main.rs:545:11:545:16 | vs_mut | file://:0:0:0:0 | &ref | main.rs:545:11:545:16 | vs_mut [implicit deref 0 in state after borrow] | +| main.rs:545:11:545:16 | vs_mut [implicit deref 0 in state after deref] | file://:0:0:0:0 | &ref | main.rs:545:11:545:16 | vs_mut [implicit borrow] | +| main.rs:545:11:545:23 | vs_mut.iter() | file://:0:0:0:0 | &ref | main.rs:545:11:545:23 | vs_mut.iter() [implicit borrow] | | main.rs:545:11:545:39 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:545:11:545:39 | ... .unwrap() [implicit borrow] | +| main.rs:546:11:546:16 | vs_mut | file://:0:0:0:0 | &ref | main.rs:546:11:546:16 | vs_mut [implicit deref 0 in state after borrow] | +| main.rs:546:11:546:16 | vs_mut [implicit deref 0 in state after deref] | file://:0:0:0:0 | &ref | main.rs:546:11:546:16 | vs_mut [implicit borrow] | +| main.rs:546:11:546:23 | vs_mut.iter() | file://:0:0:0:0 | &ref | main.rs:546:11:546:23 | vs_mut.iter() [implicit borrow] | | main.rs:546:11:546:39 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:546:11:546:39 | ... .unwrap() [implicit borrow] | +| main.rs:548:19:548:24 | vs_mut | file://:0:0:0:0 | &ref | main.rs:548:19:548:24 | vs_mut [implicit deref 0 in state after borrow] | +| main.rs:548:19:548:24 | vs_mut [implicit deref 0 in state after deref] | file://:0:0:0:0 | &ref | main.rs:548:19:548:24 | vs_mut [implicit borrow] | | main.rs:557:18:557:18 | c | file://:0:0:0:0 | &ref | main.rs:557:17:557:18 | &c | | main.rs:560:15:560:15 | b | file://:0:0:0:0 | &ref | main.rs:560:14:560:15 | &b | | main.rs:562:11:562:15 | c_ref | file://:0:0:0:0 | &ref | main.rs:562:11:562:15 | c_ref [implicit borrow] | 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 3dbfa8da04d9..e350439d5580 100644 --- a/rust/ql/test/library-tests/dataflow/local/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/local/inline-flow.expected @@ -1,23 +1,28 @@ models | 1 | Summary: <& as core::ops::deref::Deref>::deref; Argument[self].Reference; ReturnValue; value | -| 2 | Summary: ::deref; Argument[self].Reference.Field[alloc::boxed::Box(0)]; ReturnValue.Reference; value | -| 3 | Summary: ::new; Argument[0]; ReturnValue.Field[alloc::boxed::Box(0)]; value | -| 4 | Summary: ::deref; Argument[self]; ReturnValue; value | -| 5 | Summary: ::to_string; Argument[self].Reference; ReturnValue; taint | -| 6 | Summary: ::into; Argument[self].Element; ReturnValue.Element; taint | -| 7 | Summary: ::into; Argument[self].Reference.Element; ReturnValue.Element; taint | -| 8 | Summary: ::from; Argument[0]; ReturnValue; taint | -| 9 | Summary: ::index; Argument[self].Reference.Element; ReturnValue.Reference; value | -| 10 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 11 | Summary: ::unwrap_or; Argument[0]; ReturnValue; value | -| 12 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 13 | Summary: ::unwrap_or_else; Argument[0].ReturnValue; ReturnValue; value | -| 14 | Summary: ::unwrap_or_else; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 15 | Summary: ::err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 16 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 17 | Summary: ::expect_err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue; value | -| 18 | Summary: ::ok; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 19 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 2 | Summary: <[;] as core::ops::deref::Deref>::deref; Argument[self].Reference; ReturnValue.Reference; value | +| 3 | Summary: ::deref; Argument[self].Reference.Field[alloc::boxed::Box(0)]; ReturnValue.Reference; value | +| 4 | Summary: ::new; Argument[0]; ReturnValue.Field[alloc::boxed::Box(0)]; value | +| 5 | Summary: ::deref; Argument[self]; ReturnValue; value | +| 6 | Summary: ::to_string; Argument[self].Reference; ReturnValue; taint | +| 7 | Summary: ::into; Argument[self].Element; ReturnValue.Element; taint | +| 8 | Summary: ::into; Argument[self].Reference.Element; ReturnValue.Element; taint | +| 9 | Summary: ::from; Argument[0]; ReturnValue; taint | +| 10 | Summary: ::collect; Argument[self].Element; ReturnValue.Element; value | +| 11 | Summary: ::map; Argument[self].Element; Argument[0].Parameter[0]; value | +| 12 | Summary: ::next; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 13 | Summary: ::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 14 | Summary: ::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 15 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 16 | Summary: ::unwrap_or; Argument[0]; ReturnValue; value | +| 17 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 18 | Summary: ::unwrap_or_else; Argument[0].ReturnValue; ReturnValue; value | +| 19 | Summary: ::unwrap_or_else; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 20 | Summary: ::err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 21 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 22 | Summary: ::expect_err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue; value | +| 23 | Summary: ::ok; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 24 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | edges | main.rs:23:9:23:9 | s | main.rs:24:10:24:10 | s | provenance | | | main.rs:23:9:23:9 | s | main.rs:26:12:26:12 | x | provenance | | @@ -45,8 +50,8 @@ edges | main.rs:82:5:82:5 | l | main.rs:83:10:83:10 | l | provenance | | | main.rs:115:9:115:9 | i [Box(0)] | main.rs:116:11:116:11 | i [Box(0)] | provenance | | | main.rs:115:13:115:31 | ...::new(...) [Box(0)] | main.rs:115:9:115:9 | i [Box(0)] | provenance | | -| main.rs:115:22:115:30 | source(...) | main.rs:115:13:115:31 | ...::new(...) [Box(0)] | provenance | MaD:3 | -| main.rs:116:11:116:11 | i [Box(0)] | main.rs:116:10:116:11 | * ... | provenance | MaD:2 | +| main.rs:115:22:115:30 | source(...) | main.rs:115:13:115:31 | ...::new(...) [Box(0)] | provenance | MaD:4 | +| main.rs:116:11:116:11 | i [Box(0)] | main.rs:116:10:116:11 | * ... | provenance | MaD:3 | | main.rs:123:9:123:9 | a [tuple.0] | main.rs:124:10:124:10 | a [tuple.0] | provenance | | | main.rs:123:13:123:26 | TupleExpr [tuple.0] | main.rs:123:9:123:9 | a [tuple.0] | provenance | | | main.rs:123:14:123:22 | source(...) | main.rs:123:13:123:26 | TupleExpr [tuple.0] | provenance | | @@ -129,17 +134,17 @@ edges | main.rs:278:9:278:10 | s1 [Some] | main.rs:279:10:279:11 | s1 [Some] | provenance | | | main.rs:278:14:278:29 | Some(...) [Some] | main.rs:278:9:278:10 | s1 [Some] | provenance | | | main.rs:278:19:278:28 | source(...) | main.rs:278:14:278:29 | Some(...) [Some] | provenance | | -| main.rs:279:10:279:11 | s1 [Some] | main.rs:279:10:279:20 | s1.unwrap() | provenance | MaD:10 | +| main.rs:279:10:279:11 | s1 [Some] | main.rs:279:10:279:20 | s1.unwrap() | provenance | MaD:15 | | main.rs:283:9:283:10 | s1 [Some] | main.rs:284:10:284:11 | s1 [Some] | provenance | | | main.rs:283:14:283:29 | Some(...) [Some] | main.rs:283:9:283:10 | s1 [Some] | provenance | | | main.rs:283:19:283:28 | source(...) | main.rs:283:14:283:29 | Some(...) [Some] | provenance | | -| main.rs:284:10:284:11 | s1 [Some] | main.rs:284:10:284:24 | s1.unwrap_or(...) | provenance | MaD:12 | -| main.rs:287:23:287:32 | source(...) | main.rs:287:10:287:33 | s2.unwrap_or(...) | provenance | MaD:11 | +| main.rs:284:10:284:11 | s1 [Some] | main.rs:284:10:284:24 | s1.unwrap_or(...) | provenance | MaD:17 | +| main.rs:287:23:287:32 | source(...) | main.rs:287:10:287:33 | s2.unwrap_or(...) | provenance | MaD:16 | | main.rs:291:9:291:10 | s1 [Some] | main.rs:292:10:292:11 | s1 [Some] | provenance | | | main.rs:291:14:291:29 | Some(...) [Some] | main.rs:291:9:291:10 | s1 [Some] | provenance | | | main.rs:291:19:291:28 | source(...) | main.rs:291:14:291:29 | Some(...) [Some] | provenance | | -| main.rs:292:10:292:11 | s1 [Some] | main.rs:292:10:292:32 | s1.unwrap_or_else(...) | provenance | MaD:14 | -| main.rs:295:31:295:40 | source(...) | main.rs:295:10:295:41 | s2.unwrap_or_else(...) | provenance | MaD:13 | +| main.rs:292:10:292:11 | s1 [Some] | main.rs:292:10:292:32 | s1.unwrap_or_else(...) | provenance | MaD:19 | +| main.rs:295:31:295:40 | source(...) | main.rs:295:10:295:41 | s2.unwrap_or_else(...) | provenance | MaD:18 | | main.rs:299:9:299:10 | s1 [Some] | main.rs:301:14:301:15 | s1 [Some] | provenance | | | main.rs:299:14:299:29 | Some(...) [Some] | main.rs:299:9:299:10 | s1 [Some] | provenance | | | main.rs:299:19:299:28 | source(...) | main.rs:299:14:299:29 | Some(...) [Some] | provenance | | @@ -150,16 +155,16 @@ edges | main.rs:308:32:308:45 | Ok(...) [Ok] | main.rs:308:9:308:10 | r1 [Ok] | provenance | | | main.rs:308:35:308:44 | source(...) | main.rs:308:32:308:45 | Ok(...) [Ok] | provenance | | | main.rs:309:9:309:11 | o1a [Some] | main.rs:311:10:311:12 | o1a [Some] | provenance | | -| main.rs:309:28:309:29 | r1 [Ok] | main.rs:309:28:309:34 | r1.ok() [Some] | provenance | MaD:18 | +| main.rs:309:28:309:29 | r1 [Ok] | main.rs:309:28:309:34 | r1.ok() [Some] | provenance | MaD:23 | | main.rs:309:28:309:34 | r1.ok() [Some] | main.rs:309:9:309:11 | o1a [Some] | provenance | | -| main.rs:311:10:311:12 | o1a [Some] | main.rs:311:10:311:21 | o1a.unwrap() | provenance | MaD:10 | +| main.rs:311:10:311:12 | o1a [Some] | main.rs:311:10:311:21 | o1a.unwrap() | provenance | MaD:15 | | main.rs:314:9:314:10 | r2 [Err] | main.rs:316:28:316:29 | r2 [Err] | provenance | | | main.rs:314:32:314:46 | Err(...) [Err] | main.rs:314:9:314:10 | r2 [Err] | provenance | | | main.rs:314:36:314:45 | source(...) | main.rs:314:32:314:46 | Err(...) [Err] | provenance | | | main.rs:316:9:316:11 | o2b [Some] | main.rs:318:10:318:12 | o2b [Some] | provenance | | -| main.rs:316:28:316:29 | r2 [Err] | main.rs:316:28:316:35 | r2.err() [Some] | provenance | MaD:15 | +| main.rs:316:28:316:29 | r2 [Err] | main.rs:316:28:316:35 | r2.err() [Some] | provenance | MaD:20 | | main.rs:316:28:316:35 | r2.err() [Some] | main.rs:316:9:316:11 | o2b [Some] | provenance | | -| main.rs:318:10:318:12 | o2b [Some] | main.rs:318:10:318:21 | o2b.unwrap() | provenance | MaD:10 | +| main.rs:318:10:318:12 | o2b [Some] | main.rs:318:10:318:21 | o2b.unwrap() | provenance | MaD:15 | | main.rs:322:9:322:10 | s1 [Ok] | main.rs:325:14:325:15 | s1 [Ok] | provenance | | | main.rs:322:32:322:45 | Ok(...) [Ok] | main.rs:322:9:322:10 | s1 [Ok] | provenance | | | main.rs:322:35:322:44 | source(...) | main.rs:322:32:322:45 | Ok(...) [Ok] | provenance | | @@ -169,11 +174,11 @@ edges | main.rs:335:9:335:10 | s1 [Ok] | main.rs:336:10:336:11 | s1 [Ok] | provenance | | | main.rs:335:32:335:45 | Ok(...) [Ok] | main.rs:335:9:335:10 | s1 [Ok] | provenance | | | main.rs:335:35:335:44 | source(...) | main.rs:335:32:335:45 | Ok(...) [Ok] | provenance | | -| main.rs:336:10:336:11 | s1 [Ok] | main.rs:336:10:336:22 | s1.expect(...) | provenance | MaD:16 | +| main.rs:336:10:336:11 | s1 [Ok] | main.rs:336:10:336:22 | s1.expect(...) | provenance | MaD:21 | | main.rs:339:9:339:10 | s2 [Err] | main.rs:341:10:341:11 | s2 [Err] | provenance | | | main.rs:339:32:339:46 | Err(...) [Err] | main.rs:339:9:339:10 | s2 [Err] | provenance | | | main.rs:339:36:339:45 | source(...) | main.rs:339:32:339:46 | Err(...) [Err] | provenance | | -| main.rs:341:10:341:11 | s2 [Err] | main.rs:341:10:341:26 | s2.expect_err(...) | provenance | MaD:17 | +| main.rs:341:10:341:11 | s2 [Err] | main.rs:341:10:341:26 | s2.expect_err(...) | provenance | MaD:22 | | main.rs:350:9:350:10 | s1 [A] | main.rs:352:11:352:12 | s1 [A] | provenance | | | main.rs:350:14:350:39 | ...::A(...) [A] | main.rs:350:9:350:10 | s1 [A] | provenance | | | main.rs:350:29:350:38 | source(...) | main.rs:350:14:350:39 | ...::A(...) [A] | provenance | | @@ -222,13 +227,13 @@ edges | main.rs:430:16:430:33 | [...] [element] | main.rs:430:9:430:12 | arr1 [element] | provenance | | | main.rs:430:23:430:32 | source(...) | main.rs:430:16:430:33 | [...] [element] | provenance | | | main.rs:431:9:431:10 | n1 | main.rs:432:10:432:11 | n1 | provenance | | -| main.rs:431:14:431:17 | arr1 [element] | main.rs:431:14:431:20 | arr1[2] | provenance | MaD:9 | +| main.rs:431:14:431:17 | arr1 [element] | main.rs:431:14:431:20 | arr1[2] | provenance | MaD:14 | | main.rs:431:14:431:20 | arr1[2] | main.rs:431:9:431:10 | n1 | provenance | | | main.rs:434:9:434:12 | arr2 [element] | main.rs:435:14:435:17 | arr2 [element] | provenance | | | main.rs:434:16:434:31 | [...; 10] [element] | main.rs:434:9:434:12 | arr2 [element] | provenance | | | main.rs:434:17:434:26 | source(...) | main.rs:434:16:434:31 | [...; 10] [element] | provenance | | | main.rs:435:9:435:10 | n2 | main.rs:436:10:436:11 | n2 | provenance | | -| main.rs:435:14:435:17 | arr2 [element] | main.rs:435:14:435:20 | arr2[4] | provenance | MaD:9 | +| main.rs:435:14:435:17 | arr2 [element] | main.rs:435:14:435:20 | arr2[4] | provenance | MaD:14 | | main.rs:435:14:435:20 | arr2[4] | main.rs:435:9:435:10 | n2 | provenance | | | main.rs:444:9:444:12 | arr1 [element] | main.rs:445:15:445:18 | arr1 [element] | provenance | | | main.rs:444:16:444:33 | [...] [element] | main.rs:444:9:444:12 | arr1 [element] | provenance | | @@ -249,9 +254,9 @@ edges | main.rs:470:5:470:11 | [post] mut_arr [element] | main.rs:473:10:473:16 | mut_arr [element] | provenance | | | main.rs:470:18:470:27 | source(...) | main.rs:470:5:470:11 | [post] mut_arr [element] | provenance | | | main.rs:471:9:471:9 | d | main.rs:472:10:472:10 | d | provenance | | -| main.rs:471:13:471:19 | mut_arr [element] | main.rs:471:13:471:22 | mut_arr[1] | provenance | MaD:9 | +| main.rs:471:13:471:19 | mut_arr [element] | main.rs:471:13:471:22 | mut_arr[1] | provenance | MaD:14 | | main.rs:471:13:471:22 | mut_arr[1] | main.rs:471:9:471:9 | d | provenance | | -| main.rs:473:10:473:16 | mut_arr [element] | main.rs:473:10:473:19 | mut_arr[0] | provenance | MaD:9 | +| main.rs:473:10:473:16 | mut_arr [element] | main.rs:473:10:473:19 | mut_arr[0] | provenance | MaD:14 | | main.rs:496:9:496:9 | s | main.rs:497:10:497:10 | s | provenance | | | main.rs:496:25:496:26 | source(...) | main.rs:496:9:496:9 | s | provenance | | | main.rs:505:9:505:9 | a | main.rs:506:13:506:13 | a | provenance | | @@ -260,27 +265,65 @@ edges | main.rs:506:9:506:9 | b | main.rs:507:13:507:13 | b | provenance | | | main.rs:506:9:506:9 | b | main.rs:508:18:508:18 | b | provenance | | | main.rs:506:9:506:9 | b | main.rs:511:17:511:17 | b | provenance | | -| main.rs:506:13:506:13 | a | main.rs:506:13:506:25 | a.to_string() | provenance | MaD:5 | +| main.rs:506:13:506:13 | a | main.rs:506:13:506:25 | a.to_string() | provenance | MaD:6 | | main.rs:506:13:506:25 | a.to_string() | main.rs:506:9:506:9 | b | provenance | | | main.rs:507:9:507:9 | c | main.rs:512:10:512:10 | c | provenance | | -| main.rs:507:13:507:13 | b | main.rs:507:13:507:28 | b.parse() [Ok] | provenance | MaD:4 | -| main.rs:507:13:507:28 | b.parse() [Ok] | main.rs:507:13:507:37 | ... .unwrap() | provenance | MaD:19 | +| main.rs:507:13:507:13 | b | main.rs:507:13:507:28 | b.parse() [Ok] | provenance | MaD:5 | +| main.rs:507:13:507:28 | b.parse() [Ok] | main.rs:507:13:507:37 | ... .unwrap() | provenance | MaD:24 | | main.rs:507:13:507:37 | ... .unwrap() | main.rs:507:9:507:9 | c | provenance | | | main.rs:508:9:508:9 | d | main.rs:513:10:513:10 | d | provenance | | -| main.rs:508:18:508:18 | b | main.rs:508:18:508:26 | b.parse() [Ok] | provenance | MaD:4 | -| main.rs:508:18:508:26 | b.parse() [Ok] | main.rs:508:18:508:35 | ... .unwrap() | provenance | MaD:19 | +| main.rs:508:18:508:18 | b | main.rs:508:18:508:26 | b.parse() [Ok] | provenance | MaD:5 | +| main.rs:508:18:508:26 | b.parse() [Ok] | main.rs:508:18:508:35 | ... .unwrap() | provenance | MaD:24 | | main.rs:508:18:508:35 | ... .unwrap() | main.rs:508:9:508:9 | d | provenance | | | main.rs:517:9:517:10 | vs [element] | main.rs:519:10:519:11 | vs [element] | provenance | | +| main.rs:517:9:517:10 | vs [element] | main.rs:520:11:520:12 | vs [element] | provenance | | +| main.rs:517:9:517:10 | vs [element] | main.rs:521:11:521:12 | vs [element] | provenance | | | main.rs:517:9:517:10 | vs [element] | main.rs:523:14:523:15 | vs [element] | provenance | | +| main.rs:517:9:517:10 | vs [element] | main.rs:526:15:526:16 | vs [element] | provenance | | +| main.rs:517:9:517:10 | vs [element] | main.rs:530:26:530:27 | vs [element] | provenance | | +| main.rs:517:9:517:10 | vs [element] | main.rs:535:5:535:6 | vs [element] | provenance | | | main.rs:517:14:517:34 | [...] [element] | main.rs:517:9:517:10 | vs [element] | provenance | | | main.rs:517:15:517:24 | source(...) | main.rs:517:14:517:34 | [...] [element] | provenance | | -| main.rs:519:10:519:11 | vs [element] | main.rs:519:10:519:14 | vs[0] | provenance | MaD:9 | +| main.rs:519:10:519:11 | vs [element] | main.rs:519:10:519:14 | vs[0] | provenance | MaD:14 | +| main.rs:520:11:520:12 | vs [element] | main.rs:520:11:520:19 | vs.iter() [element, &ref] | provenance | MaD:2 | +| main.rs:520:11:520:19 | vs.iter() [element, &ref] | main.rs:520:11:520:26 | ... .next() [Some, &ref] | provenance | MaD:12 | +| main.rs:520:11:520:26 | ... .next() [Some, &ref] | main.rs:520:11:520:35 | ... .unwrap() [&ref] | provenance | MaD:15 | +| main.rs:520:11:520:35 | ... .unwrap() [&ref] | main.rs:520:10:520:35 | * ... | provenance | MaD:1 | +| main.rs:521:11:521:12 | vs [element] | main.rs:521:11:521:19 | vs.iter() [element, &ref] | provenance | MaD:2 | +| main.rs:521:11:521:19 | vs.iter() [element, &ref] | main.rs:521:11:521:26 | ... .nth(...) [Some, &ref] | provenance | MaD:13 | +| main.rs:521:11:521:26 | ... .nth(...) [Some, &ref] | main.rs:521:11:521:35 | ... .unwrap() [&ref] | provenance | MaD:15 | +| main.rs:521:11:521:35 | ... .unwrap() [&ref] | main.rs:521:10:521:35 | * ... | provenance | MaD:1 | | main.rs:523:9:523:9 | v | main.rs:524:14:524:14 | v | provenance | | | main.rs:523:14:523:15 | vs [element] | main.rs:523:9:523:9 | v | provenance | | +| main.rs:526:9:526:10 | &... [&ref] | main.rs:526:10:526:10 | v | provenance | | +| main.rs:526:10:526:10 | v | main.rs:527:14:527:14 | v | provenance | | +| main.rs:526:15:526:16 | vs [element] | main.rs:526:15:526:23 | vs.iter() [element, &ref] | provenance | MaD:2 | +| main.rs:526:15:526:23 | vs.iter() [element, &ref] | main.rs:526:9:526:10 | &... [&ref] | provenance | | +| main.rs:530:9:530:11 | vs2 [element, &ref] | main.rs:531:15:531:17 | vs2 [element, &ref] | provenance | | +| main.rs:530:26:530:27 | vs [element] | main.rs:530:26:530:34 | vs.iter() [element, &ref] | provenance | MaD:2 | +| main.rs:530:26:530:34 | vs.iter() [element, &ref] | main.rs:530:26:530:44 | ... .collect() [element, &ref] | provenance | MaD:10 | +| main.rs:530:26:530:44 | ... .collect() [element, &ref] | main.rs:530:9:530:11 | vs2 [element, &ref] | provenance | | +| main.rs:531:9:531:10 | &... [&ref] | main.rs:531:10:531:10 | v | provenance | | +| main.rs:531:10:531:10 | v | main.rs:532:14:532:14 | v | provenance | | +| main.rs:531:15:531:17 | vs2 [element, &ref] | main.rs:531:9:531:10 | &... [&ref] | provenance | | +| main.rs:535:5:535:6 | vs [element] | main.rs:535:5:535:13 | vs.iter() [element, &ref] | provenance | MaD:2 | +| main.rs:535:5:535:13 | vs.iter() [element, &ref] | main.rs:535:20:535:20 | ... [&ref] | provenance | MaD:11 | +| main.rs:535:20:535:20 | ... [&ref] | main.rs:535:29:535:29 | x [&ref] | provenance | | +| main.rs:535:29:535:29 | x [&ref] | main.rs:535:28:535:29 | * ... | provenance | MaD:1 | | main.rs:542:9:542:18 | mut vs_mut [element] | main.rs:544:10:544:15 | vs_mut [element] | provenance | | +| main.rs:542:9:542:18 | mut vs_mut [element] | main.rs:545:11:545:16 | vs_mut [element] | provenance | | +| main.rs:542:9:542:18 | mut vs_mut [element] | main.rs:546:11:546:16 | vs_mut [element] | provenance | | | main.rs:542:22:542:42 | [...] [element] | main.rs:542:9:542:18 | mut vs_mut [element] | provenance | | | main.rs:542:23:542:32 | source(...) | main.rs:542:22:542:42 | [...] [element] | provenance | | -| main.rs:544:10:544:15 | vs_mut [element] | main.rs:544:10:544:18 | vs_mut[0] | provenance | MaD:9 | +| main.rs:544:10:544:15 | vs_mut [element] | main.rs:544:10:544:18 | vs_mut[0] | provenance | MaD:14 | +| main.rs:545:11:545:16 | vs_mut [element] | main.rs:545:11:545:23 | vs_mut.iter() [element, &ref] | provenance | MaD:2 | +| main.rs:545:11:545:23 | vs_mut.iter() [element, &ref] | main.rs:545:11:545:30 | ... .next() [Some, &ref] | provenance | MaD:12 | +| main.rs:545:11:545:30 | ... .next() [Some, &ref] | main.rs:545:11:545:39 | ... .unwrap() [&ref] | provenance | MaD:15 | +| main.rs:545:11:545:39 | ... .unwrap() [&ref] | main.rs:545:10:545:39 | * ... | provenance | MaD:1 | +| main.rs:546:11:546:16 | vs_mut [element] | main.rs:546:11:546:23 | vs_mut.iter() [element, &ref] | provenance | MaD:2 | +| main.rs:546:11:546:23 | vs_mut.iter() [element, &ref] | main.rs:546:11:546:30 | ... .nth(...) [Some, &ref] | provenance | MaD:13 | +| main.rs:546:11:546:30 | ... .nth(...) [Some, &ref] | main.rs:546:11:546:39 | ... .unwrap() [&ref] | provenance | MaD:15 | +| main.rs:546:11:546:39 | ... .unwrap() [&ref] | main.rs:546:10:546:39 | * ... | provenance | MaD:1 | | main.rs:554:9:554:9 | a | main.rs:559:10:559:10 | a | provenance | | | main.rs:554:13:554:22 | source(...) | main.rs:554:9:554:9 | a | provenance | | | main.rs:555:9:555:9 | b | main.rs:560:15:560:15 | b | provenance | | @@ -297,16 +340,16 @@ edges | main.rs:566:9:566:9 | a | main.rs:569:10:569:10 | a | provenance | | | main.rs:566:9:566:9 | a | main.rs:570:20:570:20 | a | provenance | | | main.rs:566:18:566:27 | source(...) | main.rs:566:9:566:9 | a | provenance | | -| main.rs:569:10:569:10 | a | main.rs:569:10:569:17 | a.into() | provenance | MaD:6 | | main.rs:569:10:569:10 | a | main.rs:569:10:569:17 | a.into() | provenance | MaD:7 | +| main.rs:569:10:569:10 | a | main.rs:569:10:569:17 | a.into() | provenance | MaD:8 | | main.rs:570:20:570:20 | a | main.rs:570:10:570:21 | ...::from(...) | provenance | ReflexiveFrom | | main.rs:572:9:572:9 | b | main.rs:574:10:574:17 | b as i64 | provenance | | | main.rs:572:9:572:9 | b | main.rs:575:10:575:10 | b | provenance | | | main.rs:572:9:572:9 | b | main.rs:576:20:576:20 | b | provenance | | | main.rs:572:18:572:27 | source(...) | main.rs:572:9:572:9 | b | provenance | | -| main.rs:575:10:575:10 | b | main.rs:575:10:575:17 | b.into() | provenance | MaD:6 | | main.rs:575:10:575:10 | b | main.rs:575:10:575:17 | b.into() | provenance | MaD:7 | -| main.rs:576:20:576:20 | b | main.rs:576:10:576:21 | ...::from(...) | provenance | MaD:8 | +| main.rs:575:10:575:10 | b | main.rs:575:10:575:17 | b.into() | provenance | MaD:8 | +| main.rs:576:20:576:20 | b | main.rs:576:10:576:21 | ...::from(...) | provenance | MaD:9 | nodes | main.rs:19:10:19:18 | source(...) | semmle.label | source(...) | | main.rs:23:9:23:9 | s | semmle.label | s | @@ -609,14 +652,52 @@ nodes | main.rs:517:15:517:24 | source(...) | semmle.label | source(...) | | main.rs:519:10:519:11 | vs [element] | semmle.label | vs [element] | | main.rs:519:10:519:14 | vs[0] | semmle.label | vs[0] | +| main.rs:520:10:520:35 | * ... | semmle.label | * ... | +| main.rs:520:11:520:12 | vs [element] | semmle.label | vs [element] | +| main.rs:520:11:520:19 | vs.iter() [element, &ref] | semmle.label | vs.iter() [element, &ref] | +| main.rs:520:11:520:26 | ... .next() [Some, &ref] | semmle.label | ... .next() [Some, &ref] | +| main.rs:520:11:520:35 | ... .unwrap() [&ref] | semmle.label | ... .unwrap() [&ref] | +| main.rs:521:10:521:35 | * ... | semmle.label | * ... | +| main.rs:521:11:521:12 | vs [element] | semmle.label | vs [element] | +| main.rs:521:11:521:19 | vs.iter() [element, &ref] | semmle.label | vs.iter() [element, &ref] | +| main.rs:521:11:521:26 | ... .nth(...) [Some, &ref] | semmle.label | ... .nth(...) [Some, &ref] | +| main.rs:521:11:521:35 | ... .unwrap() [&ref] | semmle.label | ... .unwrap() [&ref] | | main.rs:523:9:523:9 | v | semmle.label | v | | main.rs:523:14:523:15 | vs [element] | semmle.label | vs [element] | | main.rs:524:14:524:14 | v | semmle.label | v | +| main.rs:526:9:526:10 | &... [&ref] | semmle.label | &... [&ref] | +| main.rs:526:10:526:10 | v | semmle.label | v | +| main.rs:526:15:526:16 | vs [element] | semmle.label | vs [element] | +| main.rs:526:15:526:23 | vs.iter() [element, &ref] | semmle.label | vs.iter() [element, &ref] | +| main.rs:527:14:527:14 | v | semmle.label | v | +| main.rs:530:9:530:11 | vs2 [element, &ref] | semmle.label | vs2 [element, &ref] | +| main.rs:530:26:530:27 | vs [element] | semmle.label | vs [element] | +| main.rs:530:26:530:34 | vs.iter() [element, &ref] | semmle.label | vs.iter() [element, &ref] | +| main.rs:530:26:530:44 | ... .collect() [element, &ref] | semmle.label | ... .collect() [element, &ref] | +| main.rs:531:9:531:10 | &... [&ref] | semmle.label | &... [&ref] | +| main.rs:531:10:531:10 | v | semmle.label | v | +| main.rs:531:15:531:17 | vs2 [element, &ref] | semmle.label | vs2 [element, &ref] | +| main.rs:532:14:532:14 | v | semmle.label | v | +| main.rs:535:5:535:6 | vs [element] | semmle.label | vs [element] | +| main.rs:535:5:535:13 | vs.iter() [element, &ref] | semmle.label | vs.iter() [element, &ref] | +| main.rs:535:20:535:20 | ... [&ref] | semmle.label | ... [&ref] | +| main.rs:535:28:535:29 | * ... | semmle.label | * ... | +| main.rs:535:29:535:29 | x [&ref] | semmle.label | x [&ref] | | main.rs:542:9:542:18 | mut vs_mut [element] | semmle.label | mut vs_mut [element] | | main.rs:542:22:542:42 | [...] [element] | semmle.label | [...] [element] | | main.rs:542:23:542:32 | source(...) | semmle.label | source(...) | | main.rs:544:10:544:15 | vs_mut [element] | semmle.label | vs_mut [element] | | main.rs:544:10:544:18 | vs_mut[0] | semmle.label | vs_mut[0] | +| main.rs:545:10:545:39 | * ... | semmle.label | * ... | +| main.rs:545:11:545:16 | vs_mut [element] | semmle.label | vs_mut [element] | +| main.rs:545:11:545:23 | vs_mut.iter() [element, &ref] | semmle.label | vs_mut.iter() [element, &ref] | +| main.rs:545:11:545:30 | ... .next() [Some, &ref] | semmle.label | ... .next() [Some, &ref] | +| main.rs:545:11:545:39 | ... .unwrap() [&ref] | semmle.label | ... .unwrap() [&ref] | +| main.rs:546:10:546:39 | * ... | semmle.label | * ... | +| main.rs:546:11:546:16 | vs_mut [element] | semmle.label | vs_mut [element] | +| main.rs:546:11:546:23 | vs_mut.iter() [element, &ref] | semmle.label | vs_mut.iter() [element, &ref] | +| main.rs:546:11:546:30 | ... .nth(...) [Some, &ref] | semmle.label | ... .nth(...) [Some, &ref] | +| main.rs:546:11:546:39 | ... .unwrap() [&ref] | semmle.label | ... .unwrap() [&ref] | | main.rs:554:9:554:9 | a | semmle.label | a | | main.rs:554:13:554:22 | source(...) | semmle.label | source(...) | | main.rs:555:9:555:9 | b | semmle.label | b | @@ -711,8 +792,15 @@ testFailures | main.rs:512:10:512:10 | c | main.rs:505:13:505:22 | source(...) | main.rs:512:10:512:10 | c | $@ | main.rs:505:13:505:22 | source(...) | source(...) | | main.rs:513:10:513:10 | d | main.rs:505:13:505:22 | source(...) | main.rs:513:10:513:10 | d | $@ | main.rs:505:13:505:22 | source(...) | source(...) | | main.rs:519:10:519:14 | vs[0] | main.rs:517:15:517:24 | source(...) | main.rs:519:10:519:14 | vs[0] | $@ | main.rs:517:15:517:24 | source(...) | source(...) | +| main.rs:520:10:520:35 | * ... | main.rs:517:15:517:24 | source(...) | main.rs:520:10:520:35 | * ... | $@ | main.rs:517:15:517:24 | source(...) | source(...) | +| main.rs:521:10:521:35 | * ... | main.rs:517:15:517:24 | source(...) | main.rs:521:10:521:35 | * ... | $@ | main.rs:517:15:517:24 | source(...) | source(...) | | main.rs:524:14:524:14 | v | main.rs:517:15:517:24 | source(...) | main.rs:524:14:524:14 | v | $@ | main.rs:517:15:517:24 | source(...) | source(...) | +| main.rs:527:14:527:14 | v | main.rs:517:15:517:24 | source(...) | main.rs:527:14:527:14 | v | $@ | main.rs:517:15:517:24 | source(...) | source(...) | +| main.rs:532:14:532:14 | v | main.rs:517:15:517:24 | source(...) | main.rs:532:14:532:14 | v | $@ | main.rs:517:15:517:24 | source(...) | source(...) | +| main.rs:535:28:535:29 | * ... | main.rs:517:15:517:24 | source(...) | main.rs:535:28:535:29 | * ... | $@ | main.rs:517:15:517:24 | source(...) | source(...) | | main.rs:544:10:544:18 | vs_mut[0] | main.rs:542:23:542:32 | source(...) | main.rs:544:10:544:18 | vs_mut[0] | $@ | main.rs:542:23:542:32 | source(...) | source(...) | +| main.rs:545:10:545:39 | * ... | main.rs:542:23:542:32 | source(...) | main.rs:545:10:545:39 | * ... | $@ | main.rs:542:23:542:32 | source(...) | source(...) | +| main.rs:546:10:546:39 | * ... | main.rs:542:23:542:32 | source(...) | main.rs:546:10:546:39 | * ... | $@ | main.rs:542:23:542:32 | source(...) | source(...) | | main.rs:559:10:559:10 | a | main.rs:554:13:554:22 | source(...) | main.rs:559:10:559:10 | a | $@ | main.rs:554:13:554:22 | source(...) | source(...) | | main.rs:560:14:560:15 | &b | main.rs:555:13:555:22 | source(...) | main.rs:560:14:560:15 | &b | $@ | main.rs:555:13:555:22 | source(...) | source(...) | | main.rs:561:14:561:18 | c_ref | main.rs:556:13:556:22 | source(...) | main.rs:561:14:561:18 | c_ref | $@ | main.rs:556:13:556:22 | 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 41f34da6122d..5b7eb211a6f6 100644 --- a/rust/ql/test/library-tests/dataflow/local/main.rs +++ b/rust/ql/test/library-tests/dataflow/local/main.rs @@ -517,22 +517,22 @@ fn iterators() { let vs = [source(91), 2, 3, 4]; sink(vs[0]); // $ hasValueFlow=91 - sink(*vs.iter().next().unwrap()); // $ MISSING: hasValueFlow=91 - sink(*vs.iter().nth(0).unwrap()); // $ MISSING: hasValueFlow=91 + sink(*vs.iter().next().unwrap()); // $ hasValueFlow=91 + sink(*vs.iter().nth(0).unwrap()); // $ hasValueFlow=91 for v in vs { sink(v); // $ hasValueFlow=91 } for &v in vs.iter() { - sink(v); // $ MISSING: hasValueFlow=91 + sink(v); // $ hasValueFlow=91 } let vs2: Vec<&i64> = vs.iter().collect(); for &v in vs2 { - sink(v); // $ MISSING: hasValueFlow=91 + sink(v); // $ hasValueFlow=91 } - vs.iter().map(|x| sink(*x)); // $ MISSING: hasValueFlow=91 + vs.iter().map(|x| sink(*x)); // $ hasValueFlow=91 vs.iter().for_each(|x| sink(*x)); // $ MISSING: hasValueFlow=91 for v in vs.into_iter() { @@ -542,8 +542,8 @@ fn iterators() { let mut vs_mut = [source(92), 2, 3, 4]; sink(vs_mut[0]); // $ hasValueFlow=92 - sink(*vs_mut.iter().next().unwrap()); // $ MISSING: hasValueFlow=92 - sink(*vs_mut.iter().nth(0).unwrap()); // $ MISSING: hasValueFlow=92 + sink(*vs_mut.iter().next().unwrap()); // $ hasValueFlow=92 + sink(*vs_mut.iter().nth(0).unwrap()); // $ hasValueFlow=92 for &mut v in vs_mut.iter_mut() { sink(v); // $ MISSING: hasValueFlow=92 diff --git a/rust/ql/test/library-tests/type-inference/main.rs b/rust/ql/test/library-tests/type-inference/main.rs index fbcc3b920430..2c462aa114a7 100644 --- a/rust/ql/test/library-tests/type-inference/main.rs +++ b/rust/ql/test/library-tests/type-inference/main.rs @@ -1412,7 +1412,7 @@ mod builtins { impl MyTrait for [T; N] { fn my_method(&self) -> &T { - self.get(0).unwrap() // $ MISSING: target=get target=unwrap + self.get(0).unwrap() // $ target=get target=unwrap } fn my_func() -> T { @@ -2340,16 +2340,16 @@ mod loops { let vals3 = vec![1, 2, 3]; // $ type=vals3:Vec type=vals3@Vec:i32 for i in vals3 {} // $ type=i:i32 - let vals4a: Vec = [1u16, 2, 3].to_vec(); // $ certainType=vals4a@Vec:u16 + let vals4a = [1u16, 2, 3].to_vec(); // $ type=vals4a@Vec:u16 target=to_vec for u in vals4a {} // $ type=u:u16 - let vals4b = [1u16, 2, 3].to_vec(); // $ MISSING: type=vals4b:Vec type=vals4b@Vec:u16 - for u in vals4b {} // $ MISSING: type=u:u16 + let vals4b = [1u16, 2, 3].to_vec(); // $ type=vals4b@Vec:u16 target=to_vec + for u in vals4b {} // $ type=u:u16 let vals5 = Vec::from([1u32, 2, 3]); // $ target=from type=vals5@Vec:u32 for u in vals5 {} // $ type=u:u32 - let vals6: Vec<&u64> = [1u64, 2, 3].iter().collect(); // $ certainType=vals6@Vec.&:u64 + let vals6: Vec<&u64> = [1u64, 2, 3].iter().collect(); // $ certainType=vals6@Vec.&:u64 target=iter target=collect for u in vals6 {} // $ type=u@&:u64 let mut vals7 = Vec::new(); // $ target=new type=vals7@Vec:u8 diff --git a/rust/ql/test/library-tests/type-inference/type-inference.expected b/rust/ql/test/library-tests/type-inference/type-inference.expected index 077171db3ce6..1663b7871cd7 100644 --- a/rust/ql/test/library-tests/type-inference/type-inference.expected +++ b/rust/ql/test/library-tests/type-inference/type-inference.expected @@ -3475,15 +3475,9 @@ inferCertainType | main.rs:2336:25:2336:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2341:9:2341:25 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2341:24:2341:25 | { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2343:13:2343:18 | vals4a | | {EXTERNAL LOCATION} | Vec | -| main.rs:2343:13:2343:18 | vals4a | A | {EXTERNAL LOCATION} | Global | -| main.rs:2343:13:2343:18 | vals4a | T | {EXTERNAL LOCATION} | u16 | -| main.rs:2343:32:2343:43 | [...] | | {EXTERNAL LOCATION} | [;] | -| main.rs:2343:33:2343:36 | 1u16 | | {EXTERNAL LOCATION} | u16 | +| main.rs:2343:22:2343:33 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2343:23:2343:26 | 1u16 | | {EXTERNAL LOCATION} | u16 | | main.rs:2344:9:2344:26 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | -| main.rs:2344:18:2344:23 | vals4a | | {EXTERNAL LOCATION} | Vec | -| main.rs:2344:18:2344:23 | vals4a | A | {EXTERNAL LOCATION} | Global | -| main.rs:2344:18:2344:23 | vals4a | T | {EXTERNAL LOCATION} | u16 | | main.rs:2344:25:2344:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2346:22:2346:33 | [...] | | {EXTERNAL LOCATION} | [;] | | main.rs:2346:23:2346:26 | 1u16 | | {EXTERNAL LOCATION} | u16 | @@ -10002,9 +9996,13 @@ inferType | main.rs:1414:26:1414:30 | SelfParam | | {EXTERNAL LOCATION} | & | | main.rs:1414:26:1414:30 | SelfParam | TRef | {EXTERNAL LOCATION} | [;] | | main.rs:1414:26:1414:30 | SelfParam | TRef.TArray | main.rs:1413:14:1413:23 | T | +| main.rs:1414:39:1416:13 | { ... } | | {EXTERNAL LOCATION} | & | | main.rs:1415:17:1415:20 | self | | {EXTERNAL LOCATION} | & | | main.rs:1415:17:1415:20 | self | TRef | {EXTERNAL LOCATION} | [;] | | main.rs:1415:17:1415:20 | self | TRef.TArray | main.rs:1413:14:1413:23 | T | +| main.rs:1415:17:1415:27 | self.get(...) | | {EXTERNAL LOCATION} | Option | +| main.rs:1415:17:1415:27 | self.get(...) | T | {EXTERNAL LOCATION} | & | +| main.rs:1415:17:1415:36 | ... .unwrap() | | {EXTERNAL LOCATION} | & | | main.rs:1415:26:1415:26 | 0 | | {EXTERNAL LOCATION} | i32 | | main.rs:1418:31:1420:13 | { ... } | | main.rs:1413:14:1413:23 | T | | main.rs:1419:17:1419:28 | ...::default(...) | | main.rs:1413:14:1413:23 | T | @@ -11682,26 +11680,47 @@ inferType | main.rs:2341:24:2341:25 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2343:13:2343:18 | vals4a | | {EXTERNAL LOCATION} | Vec | | main.rs:2343:13:2343:18 | vals4a | A | {EXTERNAL LOCATION} | Global | +| main.rs:2343:13:2343:18 | vals4a | T | {EXTERNAL LOCATION} | i32 | | main.rs:2343:13:2343:18 | vals4a | T | {EXTERNAL LOCATION} | u16 | -| main.rs:2343:32:2343:43 | [...] | | {EXTERNAL LOCATION} | [;] | -| main.rs:2343:32:2343:43 | [...] | TArray | {EXTERNAL LOCATION} | i32 | -| main.rs:2343:32:2343:43 | [...] | TArray | {EXTERNAL LOCATION} | u16 | -| main.rs:2343:33:2343:36 | 1u16 | | {EXTERNAL LOCATION} | u16 | -| main.rs:2343:39:2343:39 | 2 | | {EXTERNAL LOCATION} | i32 | -| main.rs:2343:42:2343:42 | 3 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2343:22:2343:33 | [...] | | {EXTERNAL LOCATION} | [;] | +| main.rs:2343:22:2343:33 | [...] | TArray | {EXTERNAL LOCATION} | i32 | +| main.rs:2343:22:2343:33 | [...] | TArray | {EXTERNAL LOCATION} | u16 | +| main.rs:2343:22:2343:42 | ... .to_vec() | | {EXTERNAL LOCATION} | Vec | +| main.rs:2343:22:2343:42 | ... .to_vec() | A | {EXTERNAL LOCATION} | Global | +| main.rs:2343:22:2343:42 | ... .to_vec() | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2343:22:2343:42 | ... .to_vec() | T | {EXTERNAL LOCATION} | u16 | +| main.rs:2343:23:2343:26 | 1u16 | | {EXTERNAL LOCATION} | u16 | +| main.rs:2343:29:2343:29 | 2 | | {EXTERNAL LOCATION} | i32 | +| main.rs:2343:32:2343:32 | 3 | | {EXTERNAL LOCATION} | i32 | | main.rs:2344:9:2344:26 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2344:13:2344:13 | u | | {EXTERNAL LOCATION} | i32 | | main.rs:2344:13:2344:13 | u | | {EXTERNAL LOCATION} | u16 | | main.rs:2344:18:2344:23 | vals4a | | {EXTERNAL LOCATION} | Vec | | main.rs:2344:18:2344:23 | vals4a | A | {EXTERNAL LOCATION} | Global | +| main.rs:2344:18:2344:23 | vals4a | T | {EXTERNAL LOCATION} | i32 | | main.rs:2344:18:2344:23 | vals4a | T | {EXTERNAL LOCATION} | u16 | | main.rs:2344:25:2344:26 | { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2346:13:2346:18 | vals4b | | {EXTERNAL LOCATION} | Vec | +| main.rs:2346:13:2346:18 | vals4b | A | {EXTERNAL LOCATION} | Global | +| main.rs:2346:13:2346:18 | vals4b | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2346:13:2346:18 | vals4b | T | {EXTERNAL LOCATION} | u16 | | main.rs:2346:22:2346:33 | [...] | | {EXTERNAL LOCATION} | [;] | | main.rs:2346:22:2346:33 | [...] | TArray | {EXTERNAL LOCATION} | i32 | | main.rs:2346:22:2346:33 | [...] | TArray | {EXTERNAL LOCATION} | u16 | +| main.rs:2346:22:2346:42 | ... .to_vec() | | {EXTERNAL LOCATION} | Vec | +| main.rs:2346:22:2346:42 | ... .to_vec() | A | {EXTERNAL LOCATION} | Global | +| main.rs:2346:22:2346:42 | ... .to_vec() | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2346:22:2346:42 | ... .to_vec() | T | {EXTERNAL LOCATION} | u16 | | main.rs:2346:23:2346:26 | 1u16 | | {EXTERNAL LOCATION} | u16 | | main.rs:2346:29:2346:29 | 2 | | {EXTERNAL LOCATION} | i32 | | main.rs:2346:32:2346:32 | 3 | | {EXTERNAL LOCATION} | i32 | | main.rs:2347:9:2347:26 | for ... in ... { ... } | | {EXTERNAL LOCATION} | () | +| main.rs:2347:13:2347:13 | u | | {EXTERNAL LOCATION} | i32 | +| main.rs:2347:13:2347:13 | u | | {EXTERNAL LOCATION} | u16 | +| main.rs:2347:18:2347:23 | vals4b | | {EXTERNAL LOCATION} | Vec | +| main.rs:2347:18:2347:23 | vals4b | A | {EXTERNAL LOCATION} | Global | +| main.rs:2347:18:2347:23 | vals4b | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2347:18:2347:23 | vals4b | T | {EXTERNAL LOCATION} | u16 | | main.rs:2347:25:2347:26 | { ... } | | {EXTERNAL LOCATION} | () | | main.rs:2349:13:2349:17 | vals5 | | {EXTERNAL LOCATION} | Vec | | main.rs:2349:13:2349:17 | vals5 | A | {EXTERNAL LOCATION} | Global | @@ -11732,6 +11751,14 @@ inferType | main.rs:2352:32:2352:43 | [...] | | {EXTERNAL LOCATION} | [;] | | main.rs:2352:32:2352:43 | [...] | TArray | {EXTERNAL LOCATION} | i32 | | main.rs:2352:32:2352:43 | [...] | TArray | {EXTERNAL LOCATION} | u64 | +| main.rs:2352:32:2352:50 | ... .iter() | | {EXTERNAL LOCATION} | Iter | +| main.rs:2352:32:2352:50 | ... .iter() | T | {EXTERNAL LOCATION} | i32 | +| main.rs:2352:32:2352:50 | ... .iter() | T | {EXTERNAL LOCATION} | u64 | +| main.rs:2352:32:2352:60 | ... .collect() | | {EXTERNAL LOCATION} | Vec | +| main.rs:2352:32:2352:60 | ... .collect() | A | {EXTERNAL LOCATION} | Global | +| main.rs:2352:32:2352:60 | ... .collect() | T | {EXTERNAL LOCATION} | & | +| main.rs:2352:32:2352:60 | ... .collect() | T.TRef | {EXTERNAL LOCATION} | i32 | +| main.rs:2352:32:2352:60 | ... .collect() | T.TRef | {EXTERNAL LOCATION} | u64 | | main.rs:2352:33:2352:36 | 1u64 | | {EXTERNAL LOCATION} | u64 | | main.rs:2352:39:2352:39 | 2 | | {EXTERNAL LOCATION} | i32 | | main.rs:2352:42:2352:42 | 3 | | {EXTERNAL LOCATION} | i32 | diff --git a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected index e3d423933f7e..392bc09cb0ba 100644 --- a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected @@ -7,8 +7,6 @@ | main.rs:65:48:65:69 | remote_string.as_str() | main.rs:59:25:59:69 | ...::get(...) | main.rs:65:48:65:69 | remote_string.as_str() | This command line depends on a $@. | main.rs:59:25:59:69 | ...::get(...) | user-provided value | | main.rs:73:14:73:35 | remote_string.as_str() | main.rs:59:25:59:69 | ...::get(...) | main.rs:73:14:73:35 | remote_string.as_str() | This command line depends on a $@. | main.rs:59:25:59:69 | ...::get(...) | user-provided value | | main.rs:86:18:86:27 | user_input | main.rs:138:22:138:37 | ...::args(...) | main.rs:86:18:86:27 | user_input | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | -| main.rs:100:22:100:29 | filename | main.rs:138:22:138:37 | ...::args(...) | main.rs:100:22:100:29 | filename | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | -| main.rs:111:22:111:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:111:22:111:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | | main.rs:113:22:113:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:113:22:113:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | | main.rs:121:22:121:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:121:22:121:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | | main.rs:127:22:127:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:127:22:127:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | @@ -58,14 +56,11 @@ edges | main.rs:73:14:73:26 | remote_string | main.rs:73:14:73:35 | remote_string.as_str() [&ref] | provenance | MaD:8 | | main.rs:73:14:73:35 | remote_string.as_str() [&ref] | main.rs:73:14:73:35 | remote_string.as_str() | provenance | Sink:MaD:4 | | main.rs:82:27:82:42 | ...: ... [&ref] | main.rs:86:18:86:27 | user_input | provenance | Sink:MaD:1 | -| main.rs:95:27:95:40 | ...: ... [&ref] | main.rs:100:22:100:29 | filename | provenance | Sink:MaD:1 | -| main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:111:22:111:28 | command | provenance | Sink:MaD:3 | | main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:113:22:113:28 | command | provenance | Sink:MaD:3 | | main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:121:22:121:28 | command | provenance | Sink:MaD:3 | | main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:127:22:127:28 | command | provenance | Sink:MaD:3 | | main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:131:22:131:28 | command | provenance | Sink:MaD:3 | | main.rs:138:9:138:18 | arg_string | main.rs:142:39:142:48 | arg_string | provenance | | -| main.rs:138:9:138:18 | arg_string | main.rs:143:40:143:49 | arg_string | provenance | | | main.rs:138:9:138:18 | arg_string | main.rs:144:31:144:40 | arg_string | provenance | | | main.rs:138:22:138:37 | ...::args(...) | main.rs:138:22:138:37 | ...::args(...) [element] | provenance | Src:MaD:7 | | main.rs:138:22:138:37 | ...::args(...) [element] | main.rs:138:22:138:44 | ... .nth(...) [Some] | provenance | MaD:9 | @@ -73,8 +68,6 @@ edges | main.rs:138:22:138:74 | ... .unwrap_or(...) | main.rs:138:9:138:18 | arg_string | provenance | | | main.rs:142:39:142:48 | arg_string | main.rs:142:39:142:57 | arg_string.as_str() [&ref] | provenance | MaD:8 | | main.rs:142:39:142:57 | arg_string.as_str() [&ref] | main.rs:82:27:82:42 | ...: ... [&ref] | provenance | | -| main.rs:143:40:143:49 | arg_string | main.rs:143:40:143:58 | arg_string.as_str() [&ref] | provenance | MaD:8 | -| main.rs:143:40:143:58 | arg_string.as_str() [&ref] | main.rs:95:27:95:40 | ...: ... [&ref] | provenance | | | main.rs:144:31:144:40 | arg_string | main.rs:144:31:144:49 | arg_string.as_str() [&ref] | provenance | MaD:8 | | main.rs:144:31:144:49 | arg_string.as_str() [&ref] | main.rs:107:30:107:42 | ...: ... [&ref] | provenance | | models @@ -141,10 +134,7 @@ nodes | main.rs:73:14:73:35 | remote_string.as_str() [&ref] | semmle.label | remote_string.as_str() [&ref] | | main.rs:82:27:82:42 | ...: ... [&ref] | semmle.label | ...: ... [&ref] | | main.rs:86:18:86:27 | user_input | semmle.label | user_input | -| main.rs:95:27:95:40 | ...: ... [&ref] | semmle.label | ...: ... [&ref] | -| main.rs:100:22:100:29 | filename | semmle.label | filename | | main.rs:107:30:107:42 | ...: ... [&ref] | semmle.label | ...: ... [&ref] | -| main.rs:111:22:111:28 | command | semmle.label | command | | main.rs:113:22:113:28 | command | semmle.label | command | | main.rs:121:22:121:28 | command | semmle.label | command | | main.rs:127:22:127:28 | command | semmle.label | command | @@ -156,8 +146,6 @@ nodes | main.rs:138:22:138:74 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | | main.rs:142:39:142:48 | arg_string | semmle.label | arg_string | | main.rs:142:39:142:57 | arg_string.as_str() [&ref] | semmle.label | arg_string.as_str() [&ref] | -| main.rs:143:40:143:49 | arg_string | semmle.label | arg_string | -| main.rs:143:40:143:58 | arg_string.as_str() [&ref] | semmle.label | arg_string.as_str() [&ref] | | main.rs:144:31:144:40 | arg_string | semmle.label | arg_string | | main.rs:144:31:144:49 | arg_string.as_str() [&ref] | semmle.label | arg_string.as_str() [&ref] | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-078/main.rs b/rust/ql/test/query-tests/security/CWE-078/main.rs index f2d8ac4ee994..310f9eaee03a 100644 --- a/rust/ql/test/query-tests/security/CWE-078/main.rs +++ b/rust/ql/test/query-tests/security/CWE-078/main.rs @@ -97,7 +97,7 @@ mod qhelp_example_good { let allowed_names = ["report.pdf", "summary.txt", "data.csv"]; if allowed_names.contains(&filename) { Command::new("cat") - .arg(filename) // $ SPURIOUS: Alert[rust/command-line-injection]=args2 + .arg(filename) .output() .expect("failed to execute"); } @@ -108,7 +108,7 @@ fn test_allowlist_sanitizers(command: &str) { let allowed_commands_array = ["cat", "git", "ls"]; if allowed_commands_array.contains(&command) { - Command::new(command).output().expect("failed"); // $ SPURIOUS: Alert[rust/command-line-injection]=args2 + Command::new(command).output().expect("failed"); } else { Command::new(command).output().expect("failed"); // $ Alert[rust/command-line-injection]=args2 } diff --git a/rust/tools/builtins/types.rs b/rust/tools/builtins/types.rs index d3fd06b21683..b45c7dff0904 100644 --- a/rust/tools/builtins/types.rs +++ b/rust/tools/builtins/types.rs @@ -70,3 +70,12 @@ struct Tuple12( T10, T11, ); + +// model unsized coercion (https://doc.rust-lang.org/reference/type-coercions.html#r-coerce.unsize.slice) +// as a `Deref` implementation in order to reuse type inference and data flow logic +impl std::ops::Deref for Array { + type Target = Slice; + fn deref(&self) -> &Slice { + // not a real implementation + } +} From 20c1033079e0d882ac7e38db0f886d50691fd47e Mon Sep 17 00:00:00 2001 From: Chad Bentz <1760475+felickz@users.noreply.github.com> Date: Fri, 18 Sep 2026 10:33:07 -0400 Subject: [PATCH 1136/2098] C#: Fix cs/web/xss false positive on Razor tag-helper attribute values Razor's source generator brackets WriteLiteral calls that populate an HTML attribute value on a tag-helper-enabled element (e.g. sp-for) between BeginWriteTagHelperAttribute()/EndWriteTagHelperAttribute() calls. The captured text is buffered internally and HTML-attribute- encoded before being rendered, so it is not a real XSS sink, but cs/web/xss previously flagged it as one. - Add getBeginWriteTagHelperAttributeMethod() / getEndWriteTagHelperAttributeMethod() to MicrosoftAspNetCoreMvcRazorPageBase. - Add isBracketedForTagHelperAttribute() to Html.qll and use it to exclude bracketed WriteLiteral calls from MicrosoftAspNetRazorPageWriteLiteralSink, using same-basic-block, immediately-adjacent-bracket matching so unrelated bracket pairs cannot "adopt" an unbracketed call. - Add RazorTagHelperAttribute.cshtml(.g.cs) test coverage: a suppressed bracketed write, an unbracketed positive control, two independent brackets in one basic block, and a bare write sandwiched between brackets. - Add change note (majorAnalysis). Diagnosed and validated against the real customer reproduction that motivated this fix (field-security-codeql#257 / #261): the false positive (ChangeAccountInfo.cshtml) is no longer reported, while the genuine Html.Raw-based positive control (ProfileSummary.cshtml) remains reported. Full CWE-079 test suite (6 tests) passes with no regressions. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- ...09-18-razor-tag-helper-attribute-xss-fp.md | 4 + .../frameworks/microsoft/AspNetCore.qll | 10 +++ .../security/dataflow/flowsinks/Html.qll | 64 ++++++++++++- .../XSS/RazorTagHelperAttribute.cshtml | 1 + .../XSS/RazorTagHelperAttribute.cshtml.g.cs | 89 +++++++++++++++++++ .../CWE-079/XSS/XSS.expected | 9 ++ 6 files changed, 175 insertions(+), 2 deletions(-) create mode 100644 csharp/ql/lib/change-notes/2026-09-18-razor-tag-helper-attribute-xss-fp.md create mode 100644 csharp/ql/test/query-tests/Security Features/CWE-079/XSS/RazorTagHelperAttribute.cshtml create mode 100644 csharp/ql/test/query-tests/Security Features/CWE-079/XSS/RazorTagHelperAttribute.cshtml.g.cs diff --git a/csharp/ql/lib/change-notes/2026-09-18-razor-tag-helper-attribute-xss-fp.md b/csharp/ql/lib/change-notes/2026-09-18-razor-tag-helper-attribute-xss-fp.md new file mode 100644 index 000000000000..72774940ee3a --- /dev/null +++ b/csharp/ql/lib/change-notes/2026-09-18-razor-tag-helper-attribute-xss-fp.md @@ -0,0 +1,4 @@ +--- +category: majorAnalysis +--- +* The `cs/web/xss` query no longer flags `WriteLiteral` calls that the Razor source generator emits for the value of an HTML attribute on an element that also has a tag helper (for example, an attribute populated via `asp-for`). Such values are captured into a string buffer by matching `BeginWriteTagHelperAttribute`/`EndWriteTagHelperAttribute` calls and are HTML-attribute-encoded before being rendered, so they are not a real cross-site scripting sink. This fixes a false positive that could previously be reported for any tainted value bound to an HTML attribute on a tag-helper-enabled element. diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll index 37b0ff2884f9..f14eb2f96fa9 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll @@ -491,6 +491,16 @@ class MicrosoftAspNetCoreMvcRazorPageBase extends Class { /** Gets the `WriteLiteral` method. */ Method getWriteLiteralMethod() { result = this.getAMethod("WriteLiteral") } + + /** Gets the `BeginWriteTagHelperAttribute` method. */ + Method getBeginWriteTagHelperAttributeMethod() { + result = this.getAMethod("BeginWriteTagHelperAttribute") + } + + /** Gets the `EndWriteTagHelperAttribute` method. */ + Method getEndWriteTagHelperAttributeMethod() { + result = this.getAMethod("EndWriteTagHelperAttribute") + } } /** A class deriving from `Microsoft.AspNetCore.Http.HttpRequest`, implements `HttpRequest` in ASP.NET Core. */ diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsinks/Html.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsinks/Html.qll index 362a993e5321..747ee2b3a11c 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsinks/Html.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsinks/Html.qll @@ -177,14 +177,74 @@ class MicrosoftAspNetCoreMvcHtmlHelperRawSink extends AspNetCoreHtmlSink { } } +/** + * Holds if `writeLiteral` is a call to `RazorPageBase.WriteLiteral` whose argument is captured + * between a matching pair of `BeginWriteTagHelperAttribute()`/`EndWriteTagHelperAttribute()` + * calls on `page`, in the same basic block, with no other such calls in between. + * + * The Razor source generator emits this bracketing for every literal or expression segment of an + * HTML attribute value on an element that also carries a tag helper (for example `asp-for`). Such + * a `WriteLiteral` call does not write directly, unencoded, to the response: `WriteLiteral` + * appends to an internal string buffer, `EndWriteTagHelperAttribute()` returns that buffer, and + * the buffered text is subsequently stored as a tag helper attribute value and HTML-attribute- + * encoded when the tag helper's output is rendered. This is therefore not a real sink. + * + * Because a basic block cannot contain a branch, requiring `beginCall`, `writeLiteral`, and + * `endCall` to appear (in that order) in the same basic block, with no other + * `Begin`/`EndWriteTagHelperAttribute` call from `page` strictly between `beginCall` and + * `writeLiteral`, or between `writeLiteral` and `endCall`, guarantees that `beginCall`/`endCall` + * are the immediately enclosing bracket around `writeLiteral` on every path that reaches it (that + * is, the bracket opened by `beginCall` is still open, and not yet closed by some other `endCall`, + * at the point `writeLiteral` executes). + */ +private predicate isBracketedForTagHelperAttribute(Call writeLiteral) { + exists( + MicrosoftAspNetCoreMvcRazorPageBase page, Call beginCall, Call endCall, int i, int j, int k + | + writeLiteral = page.getWriteLiteralMethod().getACall() and + beginCall = page.getBeginWriteTagHelperAttributeMethod().getACall() and + endCall = page.getEndWriteTagHelperAttributeMethod().getACall() and + writeLiteral.getBasicBlock().getNode(i) = beginCall.getControlFlowNode() and + writeLiteral.getBasicBlock().getNode(j) = writeLiteral.getControlFlowNode() and + writeLiteral.getBasicBlock().getNode(k) = endCall.getControlFlowNode() and + i < j and + j < k and + not exists(int i2, Call other | + ( + other = page.getBeginWriteTagHelperAttributeMethod().getACall() or + other = page.getEndWriteTagHelperAttributeMethod().getACall() + ) and + writeLiteral.getBasicBlock().getNode(i2) = other.getControlFlowNode() and + i < i2 and + i2 < j + ) and + not exists(int k2, Call other | + ( + other = page.getBeginWriteTagHelperAttributeMethod().getACall() or + other = page.getEndWriteTagHelperAttributeMethod().getACall() + ) and + writeLiteral.getBasicBlock().getNode(k2) = other.getControlFlowNode() and + j < k2 and + k2 < k + ) + ) +} + /** * An expression that is used as an argument to `Page.WriteLiteral` in ASP.NET 6.0 razor page, typically in * a `.cshtml` file. + * + * `WriteLiteral` calls whose argument is captured for a tag helper attribute value (see + * `isBracketedForTagHelperAttribute`) are excluded, since such values are HTML-attribute-encoded + * later and are not written unencoded to the response. */ class MicrosoftAspNetRazorPageWriteLiteralSink extends AspNetCoreHtmlSink { MicrosoftAspNetRazorPageWriteLiteralSink() { - this.getExpr() = - any(MicrosoftAspNetCoreMvcRazorPageBase h).getWriteLiteralMethod().getACall().getAnArgument() + exists(Call writeLiteral | + writeLiteral = any(MicrosoftAspNetCoreMvcRazorPageBase h).getWriteLiteralMethod().getACall() and + this.getExpr() = writeLiteral.getAnArgument() and + not isBracketedForTagHelperAttribute(writeLiteral) + ) } } diff --git a/csharp/ql/test/query-tests/Security Features/CWE-079/XSS/RazorTagHelperAttribute.cshtml b/csharp/ql/test/query-tests/Security Features/CWE-079/XSS/RazorTagHelperAttribute.cshtml new file mode 100644 index 000000000000..8b1a393741c9 --- /dev/null +++ b/csharp/ql/test/query-tests/Security Features/CWE-079/XSS/RazorTagHelperAttribute.cshtml @@ -0,0 +1 @@ +// empty diff --git a/csharp/ql/test/query-tests/Security Features/CWE-079/XSS/RazorTagHelperAttribute.cshtml.g.cs b/csharp/ql/test/query-tests/Security Features/CWE-079/XSS/RazorTagHelperAttribute.cshtml.g.cs new file mode 100644 index 000000000000..12c2b389709a --- /dev/null +++ b/csharp/ql/test/query-tests/Security Features/CWE-079/XSS/RazorTagHelperAttribute.cshtml.g.cs @@ -0,0 +1,89 @@ +// A hand-written test file that mimics the output of compiling a `.cshtml` file that has an +// element with a tag helper (e.g. `asp-for`) and an HTML attribute whose value contains a +// tainted expression, for example: +#pragma checksum "RazorTagHelperAttribute.cshtml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "c4ae76542f1958092cebd8f57beef899d20fc548" +// +#pragma warning disable 1591 +[assembly: global::Microsoft.AspNetCore.Razor.Hosting.RazorCompiledItemAttribute(typeof(dotnetweb.Pages.Pages_RazorTagHelperAttribute), @"mvc.1.0.razor-page", @"RazorTagHelperAttribute.cshtml")] +namespace dotnetweb.Pages +{ + #line hidden + using System; + using System.Collections.Generic; + using System.Linq; + using System.Threading.Tasks; + using Microsoft.AspNetCore.Mvc; + using Microsoft.AspNetCore.Mvc.Rendering; + using Microsoft.AspNetCore.Mvc.ViewFeatures; +#nullable restore +using dotnetweb; + +#line default +#line hidden +#nullable disable + [global::Microsoft.AspNetCore.Razor.Hosting.RazorSourceChecksumAttribute(@"SHA1", @"c4ae76542f1958092cebd8f57beef899d20fc548", @"RazorTagHelperAttribute.cshtml")] + public class Pages_RazorTagHelperAttribute : global::Microsoft.AspNetCore.Mvc.RazorPages.Page + { + #pragma warning disable 1998 + public async override global::System.Threading.Tasks.Task ExecuteAsync() + { +#nullable restore +#line 3 "RazorTagHelperAttribute.cshtml" + + var model = Request.Query["m"]; // $ Source=model + +#line default +#line hidden +#nullable disable + WriteLiteral(""); + + // BAD: a `WriteLiteral` call that is not bracketed by + // `BeginWriteTagHelperAttribute()`/`EndWriteTagHelperAttribute()` writes directly, + // unencoded, to the response and must still be flagged. + WriteLiteral(model); // $ Alert=model + + // GOOD: two independent tag helper attribute brackets that occur one after another + // in the same basic block must each be matched with their own nearest + // `Begin`/`EndWriteTagHelperAttribute` call, and neither should leak into the other. + BeginWriteTagHelperAttribute(); + WriteLiteral("literal-prefix-"); + var __tagHelperAttribute_2 = EndWriteTagHelperAttribute(); + BeginWriteTagHelperAttribute(); + WriteLiteral(model); + var __tagHelperAttribute_3 = EndWriteTagHelperAttribute(); + + // BAD: a bare `WriteLiteral` call sandwiched between two unrelated tag helper + // attribute brackets, in the same basic block, must not be mistaken for being + // captured by either neighboring bracket. + BeginWriteTagHelperAttribute(); + WriteLiteral("prefix"); + var __tagHelperAttribute_4 = EndWriteTagHelperAttribute(); + WriteLiteral(model); // $ Alert=model + BeginWriteTagHelperAttribute(); + WriteLiteral("suffix"); + var __tagHelperAttribute_5 = EndWriteTagHelperAttribute(); + } + #pragma warning restore 1998 + [global::Microsoft.AspNetCore.Mvc.Razor.Internal.RazorInjectAttribute] + public global::Microsoft.AspNetCore.Mvc.ViewFeatures.IModelExpressionProvider ModelExpressionProvider { get; private set; } + [global::Microsoft.AspNetCore.Mvc.Razor.Internal.RazorInjectAttribute] + public global::Microsoft.AspNetCore.Mvc.IUrlHelper Url { get; private set; } + [global::Microsoft.AspNetCore.Mvc.Razor.Internal.RazorInjectAttribute] + public global::Microsoft.AspNetCore.Mvc.IViewComponentHelper Component { get; private set; } + [global::Microsoft.AspNetCore.Mvc.Razor.Internal.RazorInjectAttribute] + public global::Microsoft.AspNetCore.Mvc.Rendering.IJsonHelper Json { get; private set; } + [global::Microsoft.AspNetCore.Mvc.Razor.Internal.RazorInjectAttribute] + public global::Microsoft.AspNetCore.Mvc.Rendering.IHtmlHelper Html { get; private set; } + public global::Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataDictionary ViewData => (global::Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataDictionary)PageContext?.ViewData; + } +} +#pragma warning restore 1591 diff --git a/csharp/ql/test/query-tests/Security Features/CWE-079/XSS/XSS.expected b/csharp/ql/test/query-tests/Security Features/CWE-079/XSS/XSS.expected index fe184fdff75a..f560bb101456 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-079/XSS/XSS.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-079/XSS/XSS.expected @@ -1,5 +1,7 @@ #select | Index.cshtml:14:16:14:22 | call to operator implicit conversion | Index.cshtml:5:19:5:31 | access to property Query : IQueryCollection | Index.cshtml:14:16:14:22 | call to operator implicit conversion | $@ flows to here and is written to HTML or JavaScript: Microsoft.AspNetCore.Mvc.ViewFeatures.HtmlHelper.Raw() method. | Index.cshtml:5:19:5:31 | access to property Query : IQueryCollection | User-provided value | +| RazorTagHelperAttribute.cshtml.g.cs:52:26:52:30 | call to operator implicit conversion | RazorTagHelperAttribute.cshtml:4:17:4:29 | access to property Query : IQueryCollection | RazorTagHelperAttribute.cshtml.g.cs:52:26:52:30 | call to operator implicit conversion | $@ flows to here and is written to HTML or JavaScript: Microsoft.AspNetCore.Mvc.Razor.RazorPageBase.WriteLiteral() method. | RazorTagHelperAttribute.cshtml:4:17:4:29 | access to property Query : IQueryCollection | User-provided value | +| RazorTagHelperAttribute.cshtml.g.cs:70:26:70:30 | call to operator implicit conversion | RazorTagHelperAttribute.cshtml:4:17:4:29 | access to property Query : IQueryCollection | RazorTagHelperAttribute.cshtml.g.cs:70:26:70:30 | call to operator implicit conversion | $@ flows to here and is written to HTML or JavaScript: Microsoft.AspNetCore.Mvc.Razor.RazorPageBase.WriteLiteral() method. | RazorTagHelperAttribute.cshtml:4:17:4:29 | access to property Query : IQueryCollection | User-provided value | | XSSAspNet.cs:26:30:26:34 | access to local variable sayHi | XSSAspNet.cs:19:25:19:43 | access to property QueryString : NameValueCollection | XSSAspNet.cs:26:30:26:34 | access to local variable sayHi | $@ flows to here and is written to HTML or JavaScript: System.Web.WebPages.WebPage.WriteLiteral() method. | XSSAspNet.cs:19:25:19:43 | access to property QueryString : NameValueCollection | User-provided value | | XSSAspNet.cs:36:40:36:44 | access to local variable sayHi | XSSAspNet.cs:19:25:19:43 | access to property QueryString : NameValueCollection | XSSAspNet.cs:36:40:36:44 | access to local variable sayHi | $@ flows to here and is written to HTML or JavaScript: System.Web.WebPages.WebPage.WriteLiteralTo() method. | XSSAspNet.cs:19:25:19:43 | access to property QueryString : NameValueCollection | User-provided value | | XSSAspNet.cs:44:28:44:33 | access to local variable sayHi2 | XSSAspNet.cs:43:26:43:44 | access to property QueryString : NameValueCollection | XSSAspNet.cs:44:28:44:33 | access to local variable sayHi2 | $@ flows to here and is written to HTML or JavaScript. | XSSAspNet.cs:43:26:43:44 | access to property QueryString : NameValueCollection | User-provided value | @@ -13,6 +15,9 @@ edges | Index.cshtml:5:9:5:15 | access to local variable message : StringValues | Index.cshtml:14:16:14:22 | call to operator implicit conversion | provenance | | | Index.cshtml:5:19:5:31 | access to property Query : IQueryCollection | Index.cshtml:5:9:5:15 | access to local variable message : StringValues | provenance | | +| RazorTagHelperAttribute.cshtml:4:9:4:13 | access to local variable model : StringValues | RazorTagHelperAttribute.cshtml.g.cs:52:26:52:30 | call to operator implicit conversion | provenance | | +| RazorTagHelperAttribute.cshtml:4:9:4:13 | access to local variable model : StringValues | RazorTagHelperAttribute.cshtml.g.cs:70:26:70:30 | call to operator implicit conversion | provenance | | +| RazorTagHelperAttribute.cshtml:4:17:4:29 | access to property Query : IQueryCollection | RazorTagHelperAttribute.cshtml:4:9:4:13 | access to local variable model : StringValues | provenance | | | XSSAspNet.cs:19:17:19:21 | access to local variable sayHi : String | XSSAspNet.cs:26:30:26:34 | access to local variable sayHi | provenance | | | XSSAspNet.cs:19:17:19:21 | access to local variable sayHi : String | XSSAspNet.cs:36:40:36:44 | access to local variable sayHi | provenance | | | XSSAspNet.cs:19:25:19:43 | access to property QueryString : NameValueCollection | XSSAspNet.cs:19:17:19:21 | access to local variable sayHi : String | provenance | | @@ -49,6 +54,10 @@ nodes | Index.cshtml:5:9:5:15 | access to local variable message : StringValues | semmle.label | access to local variable message : StringValues | | Index.cshtml:5:19:5:31 | access to property Query : IQueryCollection | semmle.label | access to property Query : IQueryCollection | | Index.cshtml:14:16:14:22 | call to operator implicit conversion | semmle.label | call to operator implicit conversion | +| RazorTagHelperAttribute.cshtml.g.cs:52:26:52:30 | call to operator implicit conversion | semmle.label | call to operator implicit conversion | +| RazorTagHelperAttribute.cshtml.g.cs:70:26:70:30 | call to operator implicit conversion | semmle.label | call to operator implicit conversion | +| RazorTagHelperAttribute.cshtml:4:9:4:13 | access to local variable model : StringValues | semmle.label | access to local variable model : StringValues | +| RazorTagHelperAttribute.cshtml:4:17:4:29 | access to property Query : IQueryCollection | semmle.label | access to property Query : IQueryCollection | | XSSAspNet.cs:19:17:19:21 | access to local variable sayHi : String | semmle.label | access to local variable sayHi : String | | XSSAspNet.cs:19:25:19:43 | access to property QueryString : NameValueCollection | semmle.label | access to property QueryString : NameValueCollection | | XSSAspNet.cs:19:25:19:52 | access to indexer : String | semmle.label | access to indexer : String | From ace3b3c9a1150e8fff2c4caac1627c889d830ebb Mon Sep 17 00:00:00 2001 From: Chad Bentz <1760475+felickz@users.noreply.github.com> Date: Fri, 18 Sep 2026 14:41:57 -0400 Subject: [PATCH 1137/2098] Address CCR: require implicit-this receiver for bracket calls Copilot Code Review correctly flagged that isBracketedForTagHelperAttribute never related the receivers of beginCall/writeLiteral/endCall, so a bracket on one page instance could theoretically be mistaken for a bracket around a WriteLiteral call on a different page (e.g. otherPage.BeginWriteTagHelperAttribute(); this.WriteLiteral(model); otherPage.EndWriteTagHelperAttribute();). Require all three calls to have an implicit his qualifier, which is how the Razor source generator always emits them, guaranteeing they act on the same page instance. Re-verified: XSS.ql compiles, all 6 CWE-079 tests pass, and the real customer reproduction database still shows the FP suppressed and the genuine Html.Raw positive control still reported. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../code/csharp/security/dataflow/flowsinks/Html.qll | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsinks/Html.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsinks/Html.qll index 747ee2b3a11c..2934c5c123de 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsinks/Html.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsinks/Html.qll @@ -196,14 +196,23 @@ class MicrosoftAspNetCoreMvcHtmlHelperRawSink extends AspNetCoreHtmlSink { * are the immediately enclosing bracket around `writeLiteral` on every path that reaches it (that * is, the bracket opened by `beginCall` is still open, and not yet closed by some other `endCall`, * at the point `writeLiteral` executes). + * + * `beginCall`, `writeLiteral`, and `endCall` are additionally required to have an implicit `this` + * qualifier, which is how the Razor source generator always emits these calls. This ensures all + * three calls act on the same page instance, so a bracket on one page cannot be mistaken for a + * bracket around a `WriteLiteral` call on a different page. */ private predicate isBracketedForTagHelperAttribute(Call writeLiteral) { exists( - MicrosoftAspNetCoreMvcRazorPageBase page, Call beginCall, Call endCall, int i, int j, int k + MicrosoftAspNetCoreMvcRazorPageBase page, MethodCall beginCall, MethodCall endCall, int i, + int j, int k | writeLiteral = page.getWriteLiteralMethod().getACall() and beginCall = page.getBeginWriteTagHelperAttributeMethod().getACall() and endCall = page.getEndWriteTagHelperAttributeMethod().getACall() and + writeLiteral.(QualifiableExpr).hasImplicitThisQualifier() and + beginCall.hasImplicitThisQualifier() and + endCall.hasImplicitThisQualifier() and writeLiteral.getBasicBlock().getNode(i) = beginCall.getControlFlowNode() and writeLiteral.getBasicBlock().getNode(j) = writeLiteral.getControlFlowNode() and writeLiteral.getBasicBlock().getNode(k) = endCall.getControlFlowNode() and From 6a272fb020caa15752caf5cd20902da5151c8473 Mon Sep 17 00:00:00 2001 From: Chad Bentz <1760475+felickz@users.noreply.github.com> Date: Fri, 18 Sep 2026 16:22:41 -0400 Subject: [PATCH 1138/2098] Trim change note to match repo conventions Shortened to a single terse sentence, matching the depth/style of other recent change-notes (one bullet, no implementation detail), and called out the ASP.NET Core Razor Pages/MVC scope. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../2026-09-18-razor-tag-helper-attribute-xss-fp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csharp/ql/lib/change-notes/2026-09-18-razor-tag-helper-attribute-xss-fp.md b/csharp/ql/lib/change-notes/2026-09-18-razor-tag-helper-attribute-xss-fp.md index 72774940ee3a..266ef985cd47 100644 --- a/csharp/ql/lib/change-notes/2026-09-18-razor-tag-helper-attribute-xss-fp.md +++ b/csharp/ql/lib/change-notes/2026-09-18-razor-tag-helper-attribute-xss-fp.md @@ -1,4 +1,4 @@ --- category: majorAnalysis --- -* The `cs/web/xss` query no longer flags `WriteLiteral` calls that the Razor source generator emits for the value of an HTML attribute on an element that also has a tag helper (for example, an attribute populated via `asp-for`). Such values are captured into a string buffer by matching `BeginWriteTagHelperAttribute`/`EndWriteTagHelperAttribute` calls and are HTML-attribute-encoded before being rendered, so they are not a real cross-site scripting sink. This fixes a false positive that could previously be reported for any tainted value bound to an HTML attribute on a tag-helper-enabled element. +* Fixed a false positive in `cs/web/xss` for ASP.NET Core Razor Pages/MVC views: `WriteLiteral` calls generated for tag helper attribute values (for example, `asp-for`) are HTML-attribute-encoded before being rendered, so they are no longer treated as XSS sinks. From 7dfce7fc9ffc9a35e3948cc98f8022c48c2018d3 Mon Sep 17 00:00:00 2001 From: Chad Bentz <1760475+felickz@users.noreply.github.com> Date: Fri, 18 Sep 2026 17:14:54 -0400 Subject: [PATCH 1139/2098] Ruby: format Grape request input kinds --- ruby/ql/lib/codeql/ruby/frameworks/Grape.qll | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/ruby/ql/lib/codeql/ruby/frameworks/Grape.qll b/ruby/ql/lib/codeql/ruby/frameworks/Grape.qll index b3d23e13dc84..ec14fe0475a6 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/Grape.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/Grape.qll @@ -223,9 +223,7 @@ module Grape { override string getSourceType() { result = "Grape::Request#body.read" } - override Http::Server::RequestInputKind getKind() { - result = Http::Server::bodyInputKind() - } + override Http::Server::RequestInputKind getKind() { result = Http::Server::bodyInputKind() } } /** @@ -240,9 +238,7 @@ module Grape { override string getSourceType() { result = "Grape::Request#body.string" } - override Http::Server::RequestInputKind getKind() { - result = Http::Server::bodyInputKind() - } + override Http::Server::RequestInputKind getKind() { result = Http::Server::bodyInputKind() } } /** @@ -287,9 +283,7 @@ module Grape { override string getSourceType() { result = "Grape::Request#POST" } - override Http::Server::RequestInputKind getKind() { - result = Http::Server::bodyInputKind() - } + override Http::Server::RequestInputKind getKind() { result = Http::Server::bodyInputKind() } } /** @@ -348,9 +342,7 @@ module Grape { override string getSourceType() { result = "Grape::Request#path_info" } - override Http::Server::RequestInputKind getKind() { - result = Http::Server::urlInputKind() - } + override Http::Server::RequestInputKind getKind() { result = Http::Server::urlInputKind() } } /** From 043701dd6c1beefe84e2003db102d4453cd5aa9b Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 18 Sep 2026 10:08:23 +0200 Subject: [PATCH 1140/2098] unified: Make data flow tests valid --- .../dataflow/implicit-self.swift | 85 +- .../test/library-tests/dataflow/test.expected | 730 +++++++++--------- .../ql/test/library-tests/dataflow/test.swift | 197 ++--- 3 files changed, 514 insertions(+), 498 deletions(-) diff --git a/unified/ql/test/library-tests/dataflow/implicit-self.swift b/unified/ql/test/library-tests/dataflow/implicit-self.swift index 32f8e88266f4..87d9dc172524 100644 --- a/unified/ql/test/library-tests/dataflow/implicit-self.swift +++ b/unified/ql/test/library-tests/dataflow/implicit-self.swift @@ -1,3 +1,8 @@ +func source(_ s: String) -> String { return s } + +@discardableResult +func sink(_ s: String) -> String { return "" } + class Box { var x: String = "" } @@ -7,78 +12,78 @@ class C { var box = Box() func t1() { - sink(self.x); // no flow - self.x = source("t1.1"); - sink(self.x); // $ hasValueFlow=t1.1 + sink(self.x) // no flow + self.x = source("t1.1") + sink(self.x) // $ hasValueFlow=t1.1 } func t2() { - sink(x); // no flow - x = source("t2.1"); - sink(x); // $ hasValueFlow=t2.1 + sink(x) // no flow + x = source("t2.1") + sink(x) // $ hasValueFlow=t2.1 } func t3() { - sink(self.x); // no flow - x = source("t3.1"); - sink(self.x); // $ hasValueFlow=t3.1 + sink(self.x) // no flow + x = source("t3.1") + sink(self.x) // $ hasValueFlow=t3.1 } func t4() { - sink(x); // no flow - self.x = source("t4.1"); - sink(x); // $ hasValueFlow=t4.1 + sink(x) // no flow + self.x = source("t4.1") + sink(x) // $ hasValueFlow=t4.1 } func t5() { - sink(self.box.x); // no flow - self.box.x = source("t5.1"); - sink(self.box.x); // $ hasValueFlow=t5.1 + sink(self.box.x) // no flow + self.box.x = source("t5.1") + sink(self.box.x) // $ hasValueFlow=t5.1 } func t6() { - sink(box.x); // no flow - box.x = source("t6.1"); - sink(box.x); // $ hasValueFlow=t6.1 + sink(box.x) // no flow + box.x = source("t6.1") + sink(box.x) // $ hasValueFlow=t6.1 } func t7() { - sink(self.box.x); // no flow - box.x = source("t7.1"); - sink(self.box.x); // $ hasValueFlow=t7.1 + sink(self.box.x) // no flow + box.x = source("t7.1") + sink(self.box.x) // $ hasValueFlow=t7.1 } func t8() { - sink(box.x); // no flow - self.box.x = source("t8.1"); - sink(box.x); // $ hasValueFlow=t8.1 + sink(box.x) // no flow + self.box.x = source("t8.1") + sink(box.x) // $ hasValueFlow=t8.1 } func t9() { - x = "safe"; - x += sink(x) + source("t9.1"); - sink(x); // $ hasTaintFlow=t9.1 - sink(self.x); // $ hasTaintFlow=t9.1 + x = "safe" + x += sink(x) + source("t9.1") + sink(x) // $ hasTaintFlow=t9.1 + sink(self.x) // $ hasTaintFlow=t9.1 } func t10() { - x = "safe"; - self.x += sink(x) + source("t10.1"); - sink(x); // $ hasTaintFlow=t10.1 - sink(self.x); // $ hasTaintFlow=t10.1 + x = "safe" + self.x += sink(x) + source("t10.1") + sink(x) // $ hasTaintFlow=t10.1 + sink(self.x) // $ hasTaintFlow=t10.1 } func t11() { - self.x = "safe"; - x += sink(x) + source("t11.1"); - sink(x); // $ hasTaintFlow=t11.1 - sink(self.x); // $ hasTaintFlow=t11.1 + self.x = "safe" + x += sink(x) + source("t11.1") + sink(x) // $ hasTaintFlow=t11.1 + sink(self.x) // $ hasTaintFlow=t11.1 } func t12() { - self.x = "safe"; - self.x += sink(x) + source("t12.1"); - sink(x); // $ hasTaintFlow=t12.1 - sink(self.x); // $ hasTaintFlow=t12.1 + self.x = "safe" + self.x += sink(x) + source("t12.1") + sink(x) // $ hasTaintFlow=t12.1 + sink(self.x) // $ hasTaintFlow=t12.1 } } diff --git a/unified/ql/test/library-tests/dataflow/test.expected b/unified/ql/test/library-tests/dataflow/test.expected index fb4090d3e62f..42b2766426e6 100644 --- a/unified/ql/test/library-tests/dataflow/test.expected +++ b/unified/ql/test/library-tests/dataflow/test.expected @@ -1,372 +1,372 @@ models edges -| implicit-self.swift:11:9:11:12 | [post] self [x] | implicit-self.swift:12:14:12:17 | self [x] | provenance | | -| implicit-self.swift:11:9:11:14 | ... .x | implicit-self.swift:11:9:11:12 | [post] self [x] | provenance | | -| implicit-self.swift:11:18:11:31 | source(...) | implicit-self.swift:11:9:11:14 | ... .x | provenance | | -| implicit-self.swift:12:14:12:17 | self [x] | implicit-self.swift:12:14:12:19 | ... .x | provenance | | -| implicit-self.swift:17:9:17:9 | x | implicit-self.swift:18:14:18:14 | x | provenance | | -| implicit-self.swift:17:13:17:26 | source(...) | implicit-self.swift:17:9:17:9 | x | provenance | | -| implicit-self.swift:23:9:23:9 | x | implicit-self.swift:24:14:24:17 | self [x] | provenance | | -| implicit-self.swift:23:13:23:26 | source(...) | implicit-self.swift:23:9:23:9 | x | provenance | | -| implicit-self.swift:24:14:24:17 | self [x] | implicit-self.swift:24:14:24:19 | ... .x | provenance | | -| implicit-self.swift:29:9:29:12 | [post] self [x] | implicit-self.swift:30:14:30:14 | x | provenance | | -| implicit-self.swift:29:9:29:14 | ... .x | implicit-self.swift:29:9:29:12 | [post] self [x] | provenance | | -| implicit-self.swift:29:18:29:31 | source(...) | implicit-self.swift:29:9:29:14 | ... .x | provenance | | -| implicit-self.swift:35:9:35:12 | [post] self [box, x] | implicit-self.swift:36:14:36:17 | self [box, x] | provenance | | -| implicit-self.swift:35:9:35:16 | [post] ... .box [x] | implicit-self.swift:35:9:35:12 | [post] self [box, x] | provenance | | -| implicit-self.swift:35:9:35:18 | ... .x | implicit-self.swift:35:9:35:16 | [post] ... .box [x] | provenance | | -| implicit-self.swift:35:22:35:35 | source(...) | implicit-self.swift:35:9:35:18 | ... .x | provenance | | -| implicit-self.swift:36:14:36:17 | self [box, x] | implicit-self.swift:36:14:36:21 | ... .box [x] | provenance | | -| implicit-self.swift:36:14:36:21 | ... .box [x] | implicit-self.swift:36:14:36:23 | ... .x | provenance | | -| implicit-self.swift:41:9:41:11 | [post] box [x] | implicit-self.swift:42:14:42:16 | box [x] | provenance | | -| implicit-self.swift:41:9:41:13 | ... .x | implicit-self.swift:41:9:41:11 | [post] box [x] | provenance | | -| implicit-self.swift:41:17:41:30 | source(...) | implicit-self.swift:41:9:41:13 | ... .x | provenance | | -| implicit-self.swift:42:14:42:16 | box [x] | implicit-self.swift:42:14:42:18 | ... .x | provenance | | -| implicit-self.swift:47:9:47:11 | [post] box [x] | implicit-self.swift:48:14:48:17 | self [box, x] | provenance | | -| implicit-self.swift:47:9:47:13 | ... .x | implicit-self.swift:47:9:47:11 | [post] box [x] | provenance | | -| implicit-self.swift:47:17:47:30 | source(...) | implicit-self.swift:47:9:47:13 | ... .x | provenance | | -| implicit-self.swift:48:14:48:17 | self [box, x] | implicit-self.swift:48:14:48:21 | ... .box [x] | provenance | | -| implicit-self.swift:48:14:48:21 | ... .box [x] | implicit-self.swift:48:14:48:23 | ... .x | provenance | | -| implicit-self.swift:53:9:53:12 | [post] self [box, x] | implicit-self.swift:54:14:54:16 | box [x] | provenance | | -| implicit-self.swift:53:9:53:16 | [post] ... .box [x] | implicit-self.swift:53:9:53:12 | [post] self [box, x] | provenance | | -| implicit-self.swift:53:9:53:18 | ... .x | implicit-self.swift:53:9:53:16 | [post] ... .box [x] | provenance | | -| implicit-self.swift:53:22:53:35 | source(...) | implicit-self.swift:53:9:53:18 | ... .x | provenance | | -| implicit-self.swift:54:14:54:16 | box [x] | implicit-self.swift:54:14:54:18 | ... .x | provenance | | -| implicit-self.swift:59:9:59:9 | [incoming] x | implicit-self.swift:60:14:60:14 | x | provenance | | -| implicit-self.swift:59:9:59:9 | [incoming] x | implicit-self.swift:61:14:61:17 | self [x] | provenance | | -| implicit-self.swift:59:24:59:37 | source(...) | implicit-self.swift:59:9:59:9 | [incoming] x | provenance | | -| implicit-self.swift:61:14:61:17 | self [x] | implicit-self.swift:61:14:61:19 | ... .x | provenance | | -| implicit-self.swift:66:9:66:12 | [post] self [x] | implicit-self.swift:67:14:67:14 | x | provenance | | -| implicit-self.swift:66:9:66:12 | [post] self [x] | implicit-self.swift:68:14:68:17 | self [x] | provenance | | -| implicit-self.swift:66:9:66:14 | [incoming] ... .x | implicit-self.swift:66:9:66:12 | [post] self [x] | provenance | | -| implicit-self.swift:66:29:66:43 | source(...) | implicit-self.swift:66:9:66:14 | [incoming] ... .x | provenance | | -| implicit-self.swift:68:14:68:17 | self [x] | implicit-self.swift:68:14:68:19 | ... .x | provenance | | -| implicit-self.swift:73:9:73:9 | [incoming] x | implicit-self.swift:74:14:74:14 | x | provenance | | -| implicit-self.swift:73:9:73:9 | [incoming] x | implicit-self.swift:75:14:75:17 | self [x] | provenance | | -| implicit-self.swift:73:24:73:38 | source(...) | implicit-self.swift:73:9:73:9 | [incoming] x | provenance | | -| implicit-self.swift:75:14:75:17 | self [x] | implicit-self.swift:75:14:75:19 | ... .x | provenance | | -| implicit-self.swift:80:9:80:12 | [post] self [x] | implicit-self.swift:81:14:81:14 | x | provenance | | -| implicit-self.swift:80:9:80:12 | [post] self [x] | implicit-self.swift:82:14:82:17 | self [x] | provenance | | -| implicit-self.swift:80:9:80:14 | [incoming] ... .x | implicit-self.swift:80:9:80:12 | [post] self [x] | provenance | | -| implicit-self.swift:80:29:80:43 | source(...) | implicit-self.swift:80:9:80:14 | [incoming] ... .x | provenance | | -| implicit-self.swift:82:14:82:17 | self [x] | implicit-self.swift:82:14:82:19 | ... .x | provenance | | -| test.swift:6:10:6:23 | source(...) | test.swift:6:10:6:32 | ... + ... | provenance | | -| test.swift:7:19:7:32 | source(...) | test.swift:7:10:7:32 | ... + ... | provenance | | -| test.swift:9:13:9:26 | source(...) | test.swift:9:10:9:33 | StringInterpolationExpr | provenance | | -| test.swift:10:18:10:31 | source(...) | test.swift:10:10:10:33 | StringInterpolationExpr | provenance | | -| test.swift:11:18:11:31 | source(...) | test.swift:11:10:11:38 | StringInterpolationExpr | provenance | | -| test.swift:16:10:16:33 | TupleExpr [0] | test.swift:16:10:16:35 | ... .0 | provenance | | -| test.swift:16:11:16:25 | source(...) | test.swift:16:10:16:33 | TupleExpr [0] | provenance | | -| test.swift:19:10:19:33 | TupleExpr [1] | test.swift:19:10:19:35 | ... .1 | provenance | | -| test.swift:19:19:19:32 | source(...) | test.swift:19:10:19:33 | TupleExpr [1] | provenance | | -| test.swift:23:9:23:9 | a | test.swift:24:10:24:10 | a | provenance | | -| test.swift:23:13:23:26 | source(...) | test.swift:23:9:23:9 | a | provenance | | -| test.swift:28:9:28:14 | TupleExpr [0] | test.swift:28:10:28:10 | a | provenance | | -| test.swift:28:10:28:10 | a | test.swift:29:10:29:10 | a | provenance | | -| test.swift:28:18:28:41 | TupleExpr [0] | test.swift:28:9:28:14 | TupleExpr [0] | provenance | | -| test.swift:28:19:28:33 | source(...) | test.swift:28:18:28:41 | TupleExpr [0] | provenance | | -| test.swift:32:9:32:14 | TupleExpr [1] | test.swift:32:13:32:13 | d | provenance | | -| test.swift:32:13:32:13 | d | test.swift:34:10:34:10 | d | provenance | | -| test.swift:32:18:32:41 | TupleExpr [1] | test.swift:32:9:32:14 | TupleExpr [1] | provenance | | -| test.swift:32:27:32:40 | source(...) | test.swift:32:18:32:41 | TupleExpr [1] | provenance | | -| test.swift:38:9:38:9 | a | test.swift:39:10:39:10 | a | provenance | | -| test.swift:38:13:38:26 | source(...) | test.swift:38:9:38:9 | a | provenance | | -| test.swift:46:5:46:9 | [post] tuple [0] | test.swift:47:10:47:14 | tuple [0] | provenance | | -| test.swift:46:5:46:11 | ... .0 | test.swift:46:5:46:9 | [post] tuple [0] | provenance | | -| test.swift:46:15:46:28 | source(...) | test.swift:46:5:46:11 | ... .0 | provenance | | -| test.swift:47:10:47:14 | tuple [0] | test.swift:47:10:47:16 | ... .0 | provenance | | -| test.swift:53:5:53:14 | [post] deep_tuple [1, 0] | test.swift:58:10:58:19 | deep_tuple [1, 0] | provenance | | -| test.swift:53:5:53:16 | [post] ... .1 [0] | test.swift:53:5:53:14 | [post] deep_tuple [1, 0] | provenance | | -| test.swift:53:5:53:18 | ... .0 | test.swift:53:5:53:16 | [post] ... .1 [0] | provenance | | -| test.swift:53:22:53:35 | source(...) | test.swift:53:5:53:18 | ... .0 | provenance | | -| test.swift:58:10:58:19 | deep_tuple [1, 0] | test.swift:58:10:58:21 | ... .1 [0] | provenance | | -| test.swift:58:10:58:21 | ... .1 [0] | test.swift:58:10:58:23 | ... .0 | provenance | | -| test.swift:64:5:64:16 | TupleExpr [0] | test.swift:64:6:64:12 | ... .1 | provenance | | -| test.swift:64:6:64:10 | [post] tuple [1] | test.swift:66:10:66:14 | tuple [1] | provenance | | -| test.swift:64:6:64:12 | ... .1 | test.swift:64:6:64:10 | [post] tuple [1] | provenance | | -| test.swift:64:20:64:51 | TupleExpr [0] | test.swift:64:5:64:16 | TupleExpr [0] | provenance | | -| test.swift:64:21:64:35 | source(...) | test.swift:64:20:64:51 | TupleExpr [0] | provenance | | -| test.swift:66:10:66:14 | tuple [1] | test.swift:66:10:66:16 | ... .1 | provenance | | -| test.swift:74:5:74:9 | [post] tuple [0] | test.swift:75:10:75:14 | tuple [0] | provenance | | -| test.swift:74:5:74:11 | ... .0 | test.swift:74:5:74:9 | [post] tuple [0] | provenance | | -| test.swift:74:15:74:29 | source(...) | test.swift:74:5:74:11 | ... .0 | provenance | | -| test.swift:75:10:75:14 | tuple [0] | test.swift:75:10:75:16 | ... .0 | provenance | | -| test.swift:86:9:86:9 | x | test.swift:90:10:90:10 | x | provenance | | -| test.swift:86:9:86:9 | x | test.swift:99:14:99:14 | x | provenance | | -| test.swift:86:13:86:27 | source(...) | test.swift:86:9:86:9 | x | provenance | | -| test.swift:94:9:94:9 | y | test.swift:96:10:96:10 | y | provenance | | -| test.swift:94:9:94:9 | y | test.swift:100:14:100:14 | y | provenance | | -| test.swift:94:13:94:27 | source(...) | test.swift:94:9:94:9 | y | provenance | | -| test.swift:107:9:107:13 | [post] tuple [0] | test.swift:112:10:112:14 | tuple [0] | provenance | | -| test.swift:107:9:107:15 | ... .0 | test.swift:107:9:107:13 | [post] tuple [0] | provenance | | -| test.swift:107:19:107:33 | source(...) | test.swift:107:9:107:15 | ... .0 | provenance | | -| test.swift:112:10:112:14 | tuple [0] | test.swift:112:10:112:16 | ... .0 | provenance | | -| test.swift:117:9:117:13 | tuple [0] | test.swift:120:17:120:21 | tuple [0] | provenance | | -| test.swift:117:9:117:13 | tuple [1] | test.swift:120:17:120:21 | tuple [1] | provenance | | -| test.swift:117:17:117:50 | TupleExpr [0] | test.swift:117:9:117:13 | tuple [0] | provenance | | -| test.swift:117:17:117:50 | TupleExpr [1] | test.swift:117:9:117:13 | tuple [1] | provenance | | -| test.swift:117:18:117:33 | source(...) | test.swift:117:17:117:50 | TupleExpr [0] | provenance | | -| test.swift:117:35:117:49 | source(...) | test.swift:117:17:117:50 | TupleExpr [1] | provenance | | -| test.swift:120:9:120:13 | TupleExpr [0] | test.swift:120:10:120:10 | a | provenance | | -| test.swift:120:9:120:13 | TupleExpr [1] | test.swift:120:12:120:12 | b | provenance | | -| test.swift:120:10:120:10 | a | test.swift:125:10:125:10 | a | provenance | | -| test.swift:120:12:120:12 | b | test.swift:126:10:126:10 | b | provenance | | -| test.swift:120:17:120:21 | tuple [0] | test.swift:120:9:120:13 | TupleExpr [0] | provenance | | -| test.swift:120:17:120:21 | tuple [1] | test.swift:120:9:120:13 | TupleExpr [1] | provenance | | -| test.swift:131:5:131:5 | a | test.swift:132:10:132:10 | a | provenance | | -| test.swift:131:19:131:33 | source(...) | test.swift:131:5:131:5 | a | provenance | | -| test.swift:137:5:137:5 | [incoming] a | test.swift:138:10:138:10 | a | provenance | | -| test.swift:137:10:137:24 | source(...) | test.swift:137:5:137:5 | [incoming] a | provenance | | -| test.swift:143:5:143:5 | [incoming] a | test.swift:144:10:144:10 | a | provenance | | -| test.swift:143:20:143:34 | source(...) | test.swift:143:5:143:5 | [incoming] a | provenance | | -| test.swift:149:5:149:5 | [post] a [0] | test.swift:150:10:150:10 | a [0] | provenance | | -| test.swift:149:5:149:7 | ... .0 | test.swift:149:5:149:5 | [post] a [0] | provenance | | -| test.swift:149:23:149:37 | source(...) | test.swift:149:5:149:7 | ... .0 | provenance | | -| test.swift:150:10:150:10 | a [0] | test.swift:150:10:150:12 | ... .0 | provenance | | -| test.swift:156:5:156:12 | TupleExpr [0] | test.swift:156:6:156:8 | ... .0 | provenance | | -| test.swift:156:6:156:6 | [post] a [0] | test.swift:157:10:157:10 | a [0] | provenance | | -| test.swift:156:6:156:8 | ... .0 | test.swift:156:6:156:6 | [post] a [0] | provenance | | -| test.swift:156:16:156:61 | TupleExpr [0] | test.swift:156:5:156:12 | TupleExpr [0] | provenance | | -| test.swift:156:17:156:43 | ... + ... | test.swift:156:16:156:61 | TupleExpr [0] | provenance | | -| test.swift:156:29:156:43 | source(...) | test.swift:156:17:156:43 | ... + ... | provenance | | -| test.swift:157:10:157:10 | a [0] | test.swift:157:10:157:12 | ... .0 | provenance | | -| test.swift:164:5:164:10 | TupleExpr [0] | test.swift:164:6:164:6 | a | provenance | | -| test.swift:164:5:164:10 | TupleExpr [1] | test.swift:164:9:164:9 | b | provenance | | -| test.swift:164:6:164:6 | a | test.swift:165:10:165:10 | a | provenance | | -| test.swift:164:9:164:9 | b | test.swift:166:10:166:10 | b | provenance | | -| test.swift:164:14:164:67 | TupleExpr [0] | test.swift:164:5:164:10 | TupleExpr [0] | provenance | | -| test.swift:164:14:164:67 | TupleExpr [1] | test.swift:164:5:164:10 | TupleExpr [1] | provenance | | -| test.swift:164:15:164:39 | ... + ... | test.swift:164:14:164:67 | TupleExpr [0] | provenance | | -| test.swift:164:25:164:39 | source(...) | test.swift:164:15:164:39 | ... + ... | provenance | | -| test.swift:164:42:164:66 | ... + ... | test.swift:164:14:164:67 | TupleExpr [1] | provenance | | -| test.swift:164:52:164:66 | source(...) | test.swift:164:42:164:66 | ... + ... | provenance | | +| implicit-self.swift:16:9:16:12 | [post] self [x] | implicit-self.swift:17:14:17:17 | self [x] | provenance | | +| implicit-self.swift:16:9:16:14 | ... .x | implicit-self.swift:16:9:16:12 | [post] self [x] | provenance | | +| implicit-self.swift:16:18:16:31 | source(...) | implicit-self.swift:16:9:16:14 | ... .x | provenance | | +| implicit-self.swift:17:14:17:17 | self [x] | implicit-self.swift:17:14:17:19 | ... .x | provenance | | +| implicit-self.swift:22:9:22:9 | x | implicit-self.swift:23:14:23:14 | x | provenance | | +| implicit-self.swift:22:13:22:26 | source(...) | implicit-self.swift:22:9:22:9 | x | provenance | | +| implicit-self.swift:28:9:28:9 | x | implicit-self.swift:29:14:29:17 | self [x] | provenance | | +| implicit-self.swift:28:13:28:26 | source(...) | implicit-self.swift:28:9:28:9 | x | provenance | | +| implicit-self.swift:29:14:29:17 | self [x] | implicit-self.swift:29:14:29:19 | ... .x | provenance | | +| implicit-self.swift:34:9:34:12 | [post] self [x] | implicit-self.swift:35:14:35:14 | x | provenance | | +| implicit-self.swift:34:9:34:14 | ... .x | implicit-self.swift:34:9:34:12 | [post] self [x] | provenance | | +| implicit-self.swift:34:18:34:31 | source(...) | implicit-self.swift:34:9:34:14 | ... .x | provenance | | +| implicit-self.swift:40:9:40:12 | [post] self [box, x] | implicit-self.swift:41:14:41:17 | self [box, x] | provenance | | +| implicit-self.swift:40:9:40:16 | [post] ... .box [x] | implicit-self.swift:40:9:40:12 | [post] self [box, x] | provenance | | +| implicit-self.swift:40:9:40:18 | ... .x | implicit-self.swift:40:9:40:16 | [post] ... .box [x] | provenance | | +| implicit-self.swift:40:22:40:35 | source(...) | implicit-self.swift:40:9:40:18 | ... .x | provenance | | +| implicit-self.swift:41:14:41:17 | self [box, x] | implicit-self.swift:41:14:41:21 | ... .box [x] | provenance | | +| implicit-self.swift:41:14:41:21 | ... .box [x] | implicit-self.swift:41:14:41:23 | ... .x | provenance | | +| implicit-self.swift:46:9:46:11 | [post] box [x] | implicit-self.swift:47:14:47:16 | box [x] | provenance | | +| implicit-self.swift:46:9:46:13 | ... .x | implicit-self.swift:46:9:46:11 | [post] box [x] | provenance | | +| implicit-self.swift:46:17:46:30 | source(...) | implicit-self.swift:46:9:46:13 | ... .x | provenance | | +| implicit-self.swift:47:14:47:16 | box [x] | implicit-self.swift:47:14:47:18 | ... .x | provenance | | +| implicit-self.swift:52:9:52:11 | [post] box [x] | implicit-self.swift:53:14:53:17 | self [box, x] | provenance | | +| implicit-self.swift:52:9:52:13 | ... .x | implicit-self.swift:52:9:52:11 | [post] box [x] | provenance | | +| implicit-self.swift:52:17:52:30 | source(...) | implicit-self.swift:52:9:52:13 | ... .x | provenance | | +| implicit-self.swift:53:14:53:17 | self [box, x] | implicit-self.swift:53:14:53:21 | ... .box [x] | provenance | | +| implicit-self.swift:53:14:53:21 | ... .box [x] | implicit-self.swift:53:14:53:23 | ... .x | provenance | | +| implicit-self.swift:58:9:58:12 | [post] self [box, x] | implicit-self.swift:59:14:59:16 | box [x] | provenance | | +| implicit-self.swift:58:9:58:16 | [post] ... .box [x] | implicit-self.swift:58:9:58:12 | [post] self [box, x] | provenance | | +| implicit-self.swift:58:9:58:18 | ... .x | implicit-self.swift:58:9:58:16 | [post] ... .box [x] | provenance | | +| implicit-self.swift:58:22:58:35 | source(...) | implicit-self.swift:58:9:58:18 | ... .x | provenance | | +| implicit-self.swift:59:14:59:16 | box [x] | implicit-self.swift:59:14:59:18 | ... .x | provenance | | +| implicit-self.swift:64:9:64:9 | [incoming] x | implicit-self.swift:65:14:65:14 | x | provenance | | +| implicit-self.swift:64:9:64:9 | [incoming] x | implicit-self.swift:66:14:66:17 | self [x] | provenance | | +| implicit-self.swift:64:24:64:37 | source(...) | implicit-self.swift:64:9:64:9 | [incoming] x | provenance | | +| implicit-self.swift:66:14:66:17 | self [x] | implicit-self.swift:66:14:66:19 | ... .x | provenance | | +| implicit-self.swift:71:9:71:12 | [post] self [x] | implicit-self.swift:72:14:72:14 | x | provenance | | +| implicit-self.swift:71:9:71:12 | [post] self [x] | implicit-self.swift:73:14:73:17 | self [x] | provenance | | +| implicit-self.swift:71:9:71:14 | [incoming] ... .x | implicit-self.swift:71:9:71:12 | [post] self [x] | provenance | | +| implicit-self.swift:71:29:71:43 | source(...) | implicit-self.swift:71:9:71:14 | [incoming] ... .x | provenance | | +| implicit-self.swift:73:14:73:17 | self [x] | implicit-self.swift:73:14:73:19 | ... .x | provenance | | +| implicit-self.swift:78:9:78:9 | [incoming] x | implicit-self.swift:79:14:79:14 | x | provenance | | +| implicit-self.swift:78:9:78:9 | [incoming] x | implicit-self.swift:80:14:80:17 | self [x] | provenance | | +| implicit-self.swift:78:24:78:38 | source(...) | implicit-self.swift:78:9:78:9 | [incoming] x | provenance | | +| implicit-self.swift:80:14:80:17 | self [x] | implicit-self.swift:80:14:80:19 | ... .x | provenance | | +| implicit-self.swift:85:9:85:12 | [post] self [x] | implicit-self.swift:86:14:86:14 | x | provenance | | +| implicit-self.swift:85:9:85:12 | [post] self [x] | implicit-self.swift:87:14:87:17 | self [x] | provenance | | +| implicit-self.swift:85:9:85:14 | [incoming] ... .x | implicit-self.swift:85:9:85:12 | [post] self [x] | provenance | | +| implicit-self.swift:85:29:85:43 | source(...) | implicit-self.swift:85:9:85:14 | [incoming] ... .x | provenance | | +| implicit-self.swift:87:14:87:17 | self [x] | implicit-self.swift:87:14:87:19 | ... .x | provenance | | +| test.swift:17:10:17:23 | source(...) | test.swift:17:10:17:32 | ... + ... | provenance | | +| test.swift:18:19:18:32 | source(...) | test.swift:18:10:18:32 | ... + ... | provenance | | +| test.swift:20:13:20:26 | source(...) | test.swift:20:10:20:33 | StringInterpolationExpr | provenance | | +| test.swift:21:18:21:31 | source(...) | test.swift:21:10:21:33 | StringInterpolationExpr | provenance | | +| test.swift:22:18:22:31 | source(...) | test.swift:22:10:22:38 | StringInterpolationExpr | provenance | | +| test.swift:27:10:27:33 | TupleExpr [0] | test.swift:27:10:27:35 | ... .0 | provenance | | +| test.swift:27:11:27:25 | source(...) | test.swift:27:10:27:33 | TupleExpr [0] | provenance | | +| test.swift:30:10:30:33 | TupleExpr [1] | test.swift:30:10:30:35 | ... .1 | provenance | | +| test.swift:30:19:30:32 | source(...) | test.swift:30:10:30:33 | TupleExpr [1] | provenance | | +| test.swift:34:9:34:9 | a | test.swift:35:10:35:10 | a | provenance | | +| test.swift:34:13:34:26 | source(...) | test.swift:34:9:34:9 | a | provenance | | +| test.swift:39:9:39:14 | TupleExpr [0] | test.swift:39:10:39:10 | a | provenance | | +| test.swift:39:10:39:10 | a | test.swift:40:10:40:10 | a | provenance | | +| test.swift:39:18:39:41 | TupleExpr [0] | test.swift:39:9:39:14 | TupleExpr [0] | provenance | | +| test.swift:39:19:39:33 | source(...) | test.swift:39:18:39:41 | TupleExpr [0] | provenance | | +| test.swift:43:9:43:14 | TupleExpr [1] | test.swift:43:13:43:13 | d | provenance | | +| test.swift:43:13:43:13 | d | test.swift:45:10:45:10 | d | provenance | | +| test.swift:43:18:43:41 | TupleExpr [1] | test.swift:43:9:43:14 | TupleExpr [1] | provenance | | +| test.swift:43:27:43:40 | source(...) | test.swift:43:18:43:41 | TupleExpr [1] | provenance | | +| test.swift:49:9:49:9 | a | test.swift:50:10:50:10 | a | provenance | | +| test.swift:49:13:49:26 | source(...) | test.swift:49:9:49:9 | a | provenance | | +| test.swift:57:5:57:9 | [post] tuple [0] | test.swift:58:10:58:14 | tuple [0] | provenance | | +| test.swift:57:5:57:11 | ... .0 | test.swift:57:5:57:9 | [post] tuple [0] | provenance | | +| test.swift:57:15:57:28 | source(...) | test.swift:57:5:57:11 | ... .0 | provenance | | +| test.swift:58:10:58:14 | tuple [0] | test.swift:58:10:58:16 | ... .0 | provenance | | +| test.swift:64:5:64:14 | [post] deep_tuple [1, 0] | test.swift:69:10:69:19 | deep_tuple [1, 0] | provenance | | +| test.swift:64:5:64:16 | [post] ... .1 [0] | test.swift:64:5:64:14 | [post] deep_tuple [1, 0] | provenance | | +| test.swift:64:5:64:18 | ... .0 | test.swift:64:5:64:16 | [post] ... .1 [0] | provenance | | +| test.swift:64:22:64:35 | source(...) | test.swift:64:5:64:18 | ... .0 | provenance | | +| test.swift:69:10:69:19 | deep_tuple [1, 0] | test.swift:69:10:69:21 | ... .1 [0] | provenance | | +| test.swift:69:10:69:21 | ... .1 [0] | test.swift:69:10:69:23 | ... .0 | provenance | | +| test.swift:75:5:75:16 | TupleExpr [0] | test.swift:75:6:75:12 | ... .1 | provenance | | +| test.swift:75:6:75:10 | [post] tuple [1] | test.swift:77:10:77:14 | tuple [1] | provenance | | +| test.swift:75:6:75:12 | ... .1 | test.swift:75:6:75:10 | [post] tuple [1] | provenance | | +| test.swift:75:20:75:51 | TupleExpr [0] | test.swift:75:5:75:16 | TupleExpr [0] | provenance | | +| test.swift:75:21:75:35 | source(...) | test.swift:75:20:75:51 | TupleExpr [0] | provenance | | +| test.swift:77:10:77:14 | tuple [1] | test.swift:77:10:77:16 | ... .1 | provenance | | +| test.swift:85:5:85:9 | [post] tuple [0] | test.swift:86:10:86:14 | tuple [0] | provenance | | +| test.swift:85:5:85:11 | ... .0 | test.swift:85:5:85:9 | [post] tuple [0] | provenance | | +| test.swift:85:15:85:29 | source(...) | test.swift:85:5:85:11 | ... .0 | provenance | | +| test.swift:86:10:86:14 | tuple [0] | test.swift:86:10:86:16 | ... .0 | provenance | | +| test.swift:97:9:97:9 | x | test.swift:101:10:101:10 | x | provenance | | +| test.swift:97:9:97:9 | x | test.swift:110:14:110:14 | x | provenance | | +| test.swift:97:13:97:27 | source(...) | test.swift:97:9:97:9 | x | provenance | | +| test.swift:105:9:105:9 | y | test.swift:107:10:107:10 | y | provenance | | +| test.swift:105:9:105:9 | y | test.swift:111:14:111:14 | y | provenance | | +| test.swift:105:13:105:27 | source(...) | test.swift:105:9:105:9 | y | provenance | | +| test.swift:118:9:118:13 | [post] tuple [0] | test.swift:123:10:123:14 | tuple [0] | provenance | | +| test.swift:118:9:118:15 | ... .0 | test.swift:118:9:118:13 | [post] tuple [0] | provenance | | +| test.swift:118:19:118:33 | source(...) | test.swift:118:9:118:15 | ... .0 | provenance | | +| test.swift:123:10:123:14 | tuple [0] | test.swift:123:10:123:16 | ... .0 | provenance | | +| test.swift:128:9:128:13 | tuple [0] | test.swift:131:18:131:22 | tuple [0] | provenance | | +| test.swift:128:9:128:13 | tuple [1] | test.swift:131:18:131:22 | tuple [1] | provenance | | +| test.swift:128:17:128:50 | TupleExpr [0] | test.swift:128:9:128:13 | tuple [0] | provenance | | +| test.swift:128:17:128:50 | TupleExpr [1] | test.swift:128:9:128:13 | tuple [1] | provenance | | +| test.swift:128:18:128:33 | source(...) | test.swift:128:17:128:50 | TupleExpr [0] | provenance | | +| test.swift:128:35:128:49 | source(...) | test.swift:128:17:128:50 | TupleExpr [1] | provenance | | +| test.swift:131:9:131:14 | TupleExpr [0] | test.swift:131:10:131:10 | a | provenance | | +| test.swift:131:9:131:14 | TupleExpr [1] | test.swift:131:13:131:13 | b | provenance | | +| test.swift:131:10:131:10 | a | test.swift:136:10:136:10 | a | provenance | | +| test.swift:131:13:131:13 | b | test.swift:137:10:137:10 | b | provenance | | +| test.swift:131:18:131:22 | tuple [0] | test.swift:131:9:131:14 | TupleExpr [0] | provenance | | +| test.swift:131:18:131:22 | tuple [1] | test.swift:131:9:131:14 | TupleExpr [1] | provenance | | +| test.swift:142:5:142:5 | a | test.swift:143:10:143:10 | a | provenance | | +| test.swift:142:19:142:33 | source(...) | test.swift:142:5:142:5 | a | provenance | | +| test.swift:148:5:148:5 | [incoming] a | test.swift:149:10:149:10 | a | provenance | | +| test.swift:148:10:148:24 | source(...) | test.swift:148:5:148:5 | [incoming] a | provenance | | +| test.swift:154:5:154:5 | [incoming] a | test.swift:155:10:155:10 | a | provenance | | +| test.swift:154:20:154:34 | source(...) | test.swift:154:5:154:5 | [incoming] a | provenance | | +| test.swift:160:5:160:5 | [post] a [0] | test.swift:161:10:161:10 | a [0] | provenance | | +| test.swift:160:5:160:7 | ... .0 | test.swift:160:5:160:5 | [post] a [0] | provenance | | +| test.swift:160:23:160:37 | source(...) | test.swift:160:5:160:7 | ... .0 | provenance | | +| test.swift:161:10:161:10 | a [0] | test.swift:161:10:161:12 | ... .0 | provenance | | +| test.swift:167:5:167:12 | TupleExpr [0] | test.swift:167:6:167:8 | ... .0 | provenance | | +| test.swift:167:6:167:6 | [post] a [0] | test.swift:168:10:168:10 | a [0] | provenance | | +| test.swift:167:6:167:8 | ... .0 | test.swift:167:6:167:6 | [post] a [0] | provenance | | +| test.swift:167:16:167:61 | TupleExpr [0] | test.swift:167:5:167:12 | TupleExpr [0] | provenance | | +| test.swift:167:17:167:43 | ... + ... | test.swift:167:16:167:61 | TupleExpr [0] | provenance | | +| test.swift:167:29:167:43 | source(...) | test.swift:167:17:167:43 | ... + ... | provenance | | +| test.swift:168:10:168:10 | a [0] | test.swift:168:10:168:12 | ... .0 | provenance | | +| test.swift:175:5:175:10 | TupleExpr [0] | test.swift:175:6:175:6 | a | provenance | | +| test.swift:175:5:175:10 | TupleExpr [1] | test.swift:175:9:175:9 | b | provenance | | +| test.swift:175:6:175:6 | a | test.swift:176:10:176:10 | a | provenance | | +| test.swift:175:9:175:9 | b | test.swift:177:10:177:10 | b | provenance | | +| test.swift:175:14:175:67 | TupleExpr [0] | test.swift:175:5:175:10 | TupleExpr [0] | provenance | | +| test.swift:175:14:175:67 | TupleExpr [1] | test.swift:175:5:175:10 | TupleExpr [1] | provenance | | +| test.swift:175:15:175:39 | ... + ... | test.swift:175:14:175:67 | TupleExpr [0] | provenance | | +| test.swift:175:25:175:39 | source(...) | test.swift:175:15:175:39 | ... + ... | provenance | | +| test.swift:175:42:175:66 | ... + ... | test.swift:175:14:175:67 | TupleExpr [1] | provenance | | +| test.swift:175:52:175:66 | source(...) | test.swift:175:42:175:66 | ... + ... | provenance | | nodes -| implicit-self.swift:11:9:11:12 | [post] self [x] | semmle.label | [post] self [x] | -| implicit-self.swift:11:9:11:14 | ... .x | semmle.label | ... .x | -| implicit-self.swift:11:18:11:31 | source(...) | semmle.label | source(...) | -| implicit-self.swift:12:14:12:17 | self [x] | semmle.label | self [x] | -| implicit-self.swift:12:14:12:19 | ... .x | semmle.label | ... .x | -| implicit-self.swift:17:9:17:9 | x | semmle.label | x | -| implicit-self.swift:17:13:17:26 | source(...) | semmle.label | source(...) | -| implicit-self.swift:18:14:18:14 | x | semmle.label | x | -| implicit-self.swift:23:9:23:9 | x | semmle.label | x | -| implicit-self.swift:23:13:23:26 | source(...) | semmle.label | source(...) | -| implicit-self.swift:24:14:24:17 | self [x] | semmle.label | self [x] | -| implicit-self.swift:24:14:24:19 | ... .x | semmle.label | ... .x | -| implicit-self.swift:29:9:29:12 | [post] self [x] | semmle.label | [post] self [x] | -| implicit-self.swift:29:9:29:14 | ... .x | semmle.label | ... .x | -| implicit-self.swift:29:18:29:31 | source(...) | semmle.label | source(...) | -| implicit-self.swift:30:14:30:14 | x | semmle.label | x | -| implicit-self.swift:35:9:35:12 | [post] self [box, x] | semmle.label | [post] self [box, x] | -| implicit-self.swift:35:9:35:16 | [post] ... .box [x] | semmle.label | [post] ... .box [x] | -| implicit-self.swift:35:9:35:18 | ... .x | semmle.label | ... .x | -| implicit-self.swift:35:22:35:35 | source(...) | semmle.label | source(...) | -| implicit-self.swift:36:14:36:17 | self [box, x] | semmle.label | self [box, x] | -| implicit-self.swift:36:14:36:21 | ... .box [x] | semmle.label | ... .box [x] | -| implicit-self.swift:36:14:36:23 | ... .x | semmle.label | ... .x | -| implicit-self.swift:41:9:41:11 | [post] box [x] | semmle.label | [post] box [x] | -| implicit-self.swift:41:9:41:13 | ... .x | semmle.label | ... .x | -| implicit-self.swift:41:17:41:30 | source(...) | semmle.label | source(...) | -| implicit-self.swift:42:14:42:16 | box [x] | semmle.label | box [x] | -| implicit-self.swift:42:14:42:18 | ... .x | semmle.label | ... .x | -| implicit-self.swift:47:9:47:11 | [post] box [x] | semmle.label | [post] box [x] | -| implicit-self.swift:47:9:47:13 | ... .x | semmle.label | ... .x | -| implicit-self.swift:47:17:47:30 | source(...) | semmle.label | source(...) | -| implicit-self.swift:48:14:48:17 | self [box, x] | semmle.label | self [box, x] | -| implicit-self.swift:48:14:48:21 | ... .box [x] | semmle.label | ... .box [x] | -| implicit-self.swift:48:14:48:23 | ... .x | semmle.label | ... .x | -| implicit-self.swift:53:9:53:12 | [post] self [box, x] | semmle.label | [post] self [box, x] | -| implicit-self.swift:53:9:53:16 | [post] ... .box [x] | semmle.label | [post] ... .box [x] | -| implicit-self.swift:53:9:53:18 | ... .x | semmle.label | ... .x | -| implicit-self.swift:53:22:53:35 | source(...) | semmle.label | source(...) | -| implicit-self.swift:54:14:54:16 | box [x] | semmle.label | box [x] | -| implicit-self.swift:54:14:54:18 | ... .x | semmle.label | ... .x | -| implicit-self.swift:59:9:59:9 | [incoming] x | semmle.label | [incoming] x | -| implicit-self.swift:59:24:59:37 | source(...) | semmle.label | source(...) | -| implicit-self.swift:60:14:60:14 | x | semmle.label | x | -| implicit-self.swift:61:14:61:17 | self [x] | semmle.label | self [x] | -| implicit-self.swift:61:14:61:19 | ... .x | semmle.label | ... .x | -| implicit-self.swift:66:9:66:12 | [post] self [x] | semmle.label | [post] self [x] | -| implicit-self.swift:66:9:66:14 | [incoming] ... .x | semmle.label | [incoming] ... .x | -| implicit-self.swift:66:29:66:43 | source(...) | semmle.label | source(...) | -| implicit-self.swift:67:14:67:14 | x | semmle.label | x | -| implicit-self.swift:68:14:68:17 | self [x] | semmle.label | self [x] | -| implicit-self.swift:68:14:68:19 | ... .x | semmle.label | ... .x | -| implicit-self.swift:73:9:73:9 | [incoming] x | semmle.label | [incoming] x | -| implicit-self.swift:73:24:73:38 | source(...) | semmle.label | source(...) | -| implicit-self.swift:74:14:74:14 | x | semmle.label | x | -| implicit-self.swift:75:14:75:17 | self [x] | semmle.label | self [x] | -| implicit-self.swift:75:14:75:19 | ... .x | semmle.label | ... .x | -| implicit-self.swift:80:9:80:12 | [post] self [x] | semmle.label | [post] self [x] | -| implicit-self.swift:80:9:80:14 | [incoming] ... .x | semmle.label | [incoming] ... .x | -| implicit-self.swift:80:29:80:43 | source(...) | semmle.label | source(...) | -| implicit-self.swift:81:14:81:14 | x | semmle.label | x | -| implicit-self.swift:82:14:82:17 | self [x] | semmle.label | self [x] | -| implicit-self.swift:82:14:82:19 | ... .x | semmle.label | ... .x | -| test.swift:2:10:2:21 | source(...) | semmle.label | source(...) | -| test.swift:6:10:6:23 | source(...) | semmle.label | source(...) | -| test.swift:6:10:6:32 | ... + ... | semmle.label | ... + ... | -| test.swift:7:10:7:32 | ... + ... | semmle.label | ... + ... | -| test.swift:7:19:7:32 | source(...) | semmle.label | source(...) | -| test.swift:9:10:9:33 | StringInterpolationExpr | semmle.label | StringInterpolationExpr | -| test.swift:9:13:9:26 | source(...) | semmle.label | source(...) | -| test.swift:10:10:10:33 | StringInterpolationExpr | semmle.label | StringInterpolationExpr | -| test.swift:10:18:10:31 | source(...) | semmle.label | source(...) | -| test.swift:11:10:11:38 | StringInterpolationExpr | semmle.label | StringInterpolationExpr | -| test.swift:11:18:11:31 | source(...) | semmle.label | source(...) | -| test.swift:16:10:16:33 | TupleExpr [0] | semmle.label | TupleExpr [0] | -| test.swift:16:10:16:35 | ... .0 | semmle.label | ... .0 | -| test.swift:16:11:16:25 | source(...) | semmle.label | source(...) | -| test.swift:19:10:19:33 | TupleExpr [1] | semmle.label | TupleExpr [1] | -| test.swift:19:10:19:35 | ... .1 | semmle.label | ... .1 | -| test.swift:19:19:19:32 | source(...) | semmle.label | source(...) | -| test.swift:23:9:23:9 | a | semmle.label | a | -| test.swift:23:13:23:26 | source(...) | semmle.label | source(...) | -| test.swift:24:10:24:10 | a | semmle.label | a | -| test.swift:28:9:28:14 | TupleExpr [0] | semmle.label | TupleExpr [0] | -| test.swift:28:10:28:10 | a | semmle.label | a | -| test.swift:28:18:28:41 | TupleExpr [0] | semmle.label | TupleExpr [0] | -| test.swift:28:19:28:33 | source(...) | semmle.label | source(...) | -| test.swift:29:10:29:10 | a | semmle.label | a | -| test.swift:32:9:32:14 | TupleExpr [1] | semmle.label | TupleExpr [1] | -| test.swift:32:13:32:13 | d | semmle.label | d | -| test.swift:32:18:32:41 | TupleExpr [1] | semmle.label | TupleExpr [1] | -| test.swift:32:27:32:40 | source(...) | semmle.label | source(...) | -| test.swift:34:10:34:10 | d | semmle.label | d | -| test.swift:38:9:38:9 | a | semmle.label | a | -| test.swift:38:13:38:26 | source(...) | semmle.label | source(...) | +| implicit-self.swift:16:9:16:12 | [post] self [x] | semmle.label | [post] self [x] | +| implicit-self.swift:16:9:16:14 | ... .x | semmle.label | ... .x | +| implicit-self.swift:16:18:16:31 | source(...) | semmle.label | source(...) | +| implicit-self.swift:17:14:17:17 | self [x] | semmle.label | self [x] | +| implicit-self.swift:17:14:17:19 | ... .x | semmle.label | ... .x | +| implicit-self.swift:22:9:22:9 | x | semmle.label | x | +| implicit-self.swift:22:13:22:26 | source(...) | semmle.label | source(...) | +| implicit-self.swift:23:14:23:14 | x | semmle.label | x | +| implicit-self.swift:28:9:28:9 | x | semmle.label | x | +| implicit-self.swift:28:13:28:26 | source(...) | semmle.label | source(...) | +| implicit-self.swift:29:14:29:17 | self [x] | semmle.label | self [x] | +| implicit-self.swift:29:14:29:19 | ... .x | semmle.label | ... .x | +| implicit-self.swift:34:9:34:12 | [post] self [x] | semmle.label | [post] self [x] | +| implicit-self.swift:34:9:34:14 | ... .x | semmle.label | ... .x | +| implicit-self.swift:34:18:34:31 | source(...) | semmle.label | source(...) | +| implicit-self.swift:35:14:35:14 | x | semmle.label | x | +| implicit-self.swift:40:9:40:12 | [post] self [box, x] | semmle.label | [post] self [box, x] | +| implicit-self.swift:40:9:40:16 | [post] ... .box [x] | semmle.label | [post] ... .box [x] | +| implicit-self.swift:40:9:40:18 | ... .x | semmle.label | ... .x | +| implicit-self.swift:40:22:40:35 | source(...) | semmle.label | source(...) | +| implicit-self.swift:41:14:41:17 | self [box, x] | semmle.label | self [box, x] | +| implicit-self.swift:41:14:41:21 | ... .box [x] | semmle.label | ... .box [x] | +| implicit-self.swift:41:14:41:23 | ... .x | semmle.label | ... .x | +| implicit-self.swift:46:9:46:11 | [post] box [x] | semmle.label | [post] box [x] | +| implicit-self.swift:46:9:46:13 | ... .x | semmle.label | ... .x | +| implicit-self.swift:46:17:46:30 | source(...) | semmle.label | source(...) | +| implicit-self.swift:47:14:47:16 | box [x] | semmle.label | box [x] | +| implicit-self.swift:47:14:47:18 | ... .x | semmle.label | ... .x | +| implicit-self.swift:52:9:52:11 | [post] box [x] | semmle.label | [post] box [x] | +| implicit-self.swift:52:9:52:13 | ... .x | semmle.label | ... .x | +| implicit-self.swift:52:17:52:30 | source(...) | semmle.label | source(...) | +| implicit-self.swift:53:14:53:17 | self [box, x] | semmle.label | self [box, x] | +| implicit-self.swift:53:14:53:21 | ... .box [x] | semmle.label | ... .box [x] | +| implicit-self.swift:53:14:53:23 | ... .x | semmle.label | ... .x | +| implicit-self.swift:58:9:58:12 | [post] self [box, x] | semmle.label | [post] self [box, x] | +| implicit-self.swift:58:9:58:16 | [post] ... .box [x] | semmle.label | [post] ... .box [x] | +| implicit-self.swift:58:9:58:18 | ... .x | semmle.label | ... .x | +| implicit-self.swift:58:22:58:35 | source(...) | semmle.label | source(...) | +| implicit-self.swift:59:14:59:16 | box [x] | semmle.label | box [x] | +| implicit-self.swift:59:14:59:18 | ... .x | semmle.label | ... .x | +| implicit-self.swift:64:9:64:9 | [incoming] x | semmle.label | [incoming] x | +| implicit-self.swift:64:24:64:37 | source(...) | semmle.label | source(...) | +| implicit-self.swift:65:14:65:14 | x | semmle.label | x | +| implicit-self.swift:66:14:66:17 | self [x] | semmle.label | self [x] | +| implicit-self.swift:66:14:66:19 | ... .x | semmle.label | ... .x | +| implicit-self.swift:71:9:71:12 | [post] self [x] | semmle.label | [post] self [x] | +| implicit-self.swift:71:9:71:14 | [incoming] ... .x | semmle.label | [incoming] ... .x | +| implicit-self.swift:71:29:71:43 | source(...) | semmle.label | source(...) | +| implicit-self.swift:72:14:72:14 | x | semmle.label | x | +| implicit-self.swift:73:14:73:17 | self [x] | semmle.label | self [x] | +| implicit-self.swift:73:14:73:19 | ... .x | semmle.label | ... .x | +| implicit-self.swift:78:9:78:9 | [incoming] x | semmle.label | [incoming] x | +| implicit-self.swift:78:24:78:38 | source(...) | semmle.label | source(...) | +| implicit-self.swift:79:14:79:14 | x | semmle.label | x | +| implicit-self.swift:80:14:80:17 | self [x] | semmle.label | self [x] | +| implicit-self.swift:80:14:80:19 | ... .x | semmle.label | ... .x | +| implicit-self.swift:85:9:85:12 | [post] self [x] | semmle.label | [post] self [x] | +| implicit-self.swift:85:9:85:14 | [incoming] ... .x | semmle.label | [incoming] ... .x | +| implicit-self.swift:85:29:85:43 | source(...) | semmle.label | source(...) | +| implicit-self.swift:86:14:86:14 | x | semmle.label | x | +| implicit-self.swift:87:14:87:17 | self [x] | semmle.label | self [x] | +| implicit-self.swift:87:14:87:19 | ... .x | semmle.label | ... .x | +| test.swift:9:10:9:21 | source(...) | semmle.label | source(...) | +| test.swift:17:10:17:23 | source(...) | semmle.label | source(...) | +| test.swift:17:10:17:32 | ... + ... | semmle.label | ... + ... | +| test.swift:18:10:18:32 | ... + ... | semmle.label | ... + ... | +| test.swift:18:19:18:32 | source(...) | semmle.label | source(...) | +| test.swift:20:10:20:33 | StringInterpolationExpr | semmle.label | StringInterpolationExpr | +| test.swift:20:13:20:26 | source(...) | semmle.label | source(...) | +| test.swift:21:10:21:33 | StringInterpolationExpr | semmle.label | StringInterpolationExpr | +| test.swift:21:18:21:31 | source(...) | semmle.label | source(...) | +| test.swift:22:10:22:38 | StringInterpolationExpr | semmle.label | StringInterpolationExpr | +| test.swift:22:18:22:31 | source(...) | semmle.label | source(...) | +| test.swift:27:10:27:33 | TupleExpr [0] | semmle.label | TupleExpr [0] | +| test.swift:27:10:27:35 | ... .0 | semmle.label | ... .0 | +| test.swift:27:11:27:25 | source(...) | semmle.label | source(...) | +| test.swift:30:10:30:33 | TupleExpr [1] | semmle.label | TupleExpr [1] | +| test.swift:30:10:30:35 | ... .1 | semmle.label | ... .1 | +| test.swift:30:19:30:32 | source(...) | semmle.label | source(...) | +| test.swift:34:9:34:9 | a | semmle.label | a | +| test.swift:34:13:34:26 | source(...) | semmle.label | source(...) | +| test.swift:35:10:35:10 | a | semmle.label | a | +| test.swift:39:9:39:14 | TupleExpr [0] | semmle.label | TupleExpr [0] | | test.swift:39:10:39:10 | a | semmle.label | a | -| test.swift:46:5:46:9 | [post] tuple [0] | semmle.label | [post] tuple [0] | -| test.swift:46:5:46:11 | ... .0 | semmle.label | ... .0 | -| test.swift:46:15:46:28 | source(...) | semmle.label | source(...) | -| test.swift:47:10:47:14 | tuple [0] | semmle.label | tuple [0] | -| test.swift:47:10:47:16 | ... .0 | semmle.label | ... .0 | -| test.swift:53:5:53:14 | [post] deep_tuple [1, 0] | semmle.label | [post] deep_tuple [1, 0] | -| test.swift:53:5:53:16 | [post] ... .1 [0] | semmle.label | [post] ... .1 [0] | -| test.swift:53:5:53:18 | ... .0 | semmle.label | ... .0 | -| test.swift:53:22:53:35 | source(...) | semmle.label | source(...) | -| test.swift:58:10:58:19 | deep_tuple [1, 0] | semmle.label | deep_tuple [1, 0] | -| test.swift:58:10:58:21 | ... .1 [0] | semmle.label | ... .1 [0] | -| test.swift:58:10:58:23 | ... .0 | semmle.label | ... .0 | -| test.swift:64:5:64:16 | TupleExpr [0] | semmle.label | TupleExpr [0] | -| test.swift:64:6:64:10 | [post] tuple [1] | semmle.label | [post] tuple [1] | -| test.swift:64:6:64:12 | ... .1 | semmle.label | ... .1 | -| test.swift:64:20:64:51 | TupleExpr [0] | semmle.label | TupleExpr [0] | -| test.swift:64:21:64:35 | source(...) | semmle.label | source(...) | -| test.swift:66:10:66:14 | tuple [1] | semmle.label | tuple [1] | -| test.swift:66:10:66:16 | ... .1 | semmle.label | ... .1 | -| test.swift:74:5:74:9 | [post] tuple [0] | semmle.label | [post] tuple [0] | -| test.swift:74:5:74:11 | ... .0 | semmle.label | ... .0 | -| test.swift:74:15:74:29 | source(...) | semmle.label | source(...) | -| test.swift:75:10:75:14 | tuple [0] | semmle.label | tuple [0] | -| test.swift:75:10:75:16 | ... .0 | semmle.label | ... .0 | -| test.swift:86:9:86:9 | x | semmle.label | x | -| test.swift:86:13:86:27 | source(...) | semmle.label | source(...) | -| test.swift:90:10:90:10 | x | semmle.label | x | -| test.swift:94:9:94:9 | y | semmle.label | y | -| test.swift:94:13:94:27 | source(...) | semmle.label | source(...) | -| test.swift:96:10:96:10 | y | semmle.label | y | -| test.swift:99:14:99:14 | x | semmle.label | x | -| test.swift:100:14:100:14 | y | semmle.label | y | -| test.swift:107:9:107:13 | [post] tuple [0] | semmle.label | [post] tuple [0] | -| test.swift:107:9:107:15 | ... .0 | semmle.label | ... .0 | -| test.swift:107:19:107:33 | source(...) | semmle.label | source(...) | -| test.swift:112:10:112:14 | tuple [0] | semmle.label | tuple [0] | -| test.swift:112:10:112:16 | ... .0 | semmle.label | ... .0 | -| test.swift:117:9:117:13 | tuple [0] | semmle.label | tuple [0] | -| test.swift:117:9:117:13 | tuple [1] | semmle.label | tuple [1] | -| test.swift:117:17:117:50 | TupleExpr [0] | semmle.label | TupleExpr [0] | -| test.swift:117:17:117:50 | TupleExpr [1] | semmle.label | TupleExpr [1] | -| test.swift:117:18:117:33 | source(...) | semmle.label | source(...) | -| test.swift:117:35:117:49 | source(...) | semmle.label | source(...) | -| test.swift:120:9:120:13 | TupleExpr [0] | semmle.label | TupleExpr [0] | -| test.swift:120:9:120:13 | TupleExpr [1] | semmle.label | TupleExpr [1] | -| test.swift:120:10:120:10 | a | semmle.label | a | -| test.swift:120:12:120:12 | b | semmle.label | b | -| test.swift:120:17:120:21 | tuple [0] | semmle.label | tuple [0] | -| test.swift:120:17:120:21 | tuple [1] | semmle.label | tuple [1] | -| test.swift:125:10:125:10 | a | semmle.label | a | -| test.swift:126:10:126:10 | b | semmle.label | b | -| test.swift:131:5:131:5 | a | semmle.label | a | -| test.swift:131:19:131:33 | source(...) | semmle.label | source(...) | -| test.swift:132:10:132:10 | a | semmle.label | a | -| test.swift:137:5:137:5 | [incoming] a | semmle.label | [incoming] a | -| test.swift:137:10:137:24 | source(...) | semmle.label | source(...) | -| test.swift:138:10:138:10 | a | semmle.label | a | -| test.swift:143:5:143:5 | [incoming] a | semmle.label | [incoming] a | -| test.swift:143:20:143:34 | source(...) | semmle.label | source(...) | -| test.swift:144:10:144:10 | a | semmle.label | a | -| test.swift:149:5:149:5 | [post] a [0] | semmle.label | [post] a [0] | -| test.swift:149:5:149:7 | ... .0 | semmle.label | ... .0 | -| test.swift:149:23:149:37 | source(...) | semmle.label | source(...) | -| test.swift:150:10:150:10 | a [0] | semmle.label | a [0] | -| test.swift:150:10:150:12 | ... .0 | semmle.label | ... .0 | -| test.swift:156:5:156:12 | TupleExpr [0] | semmle.label | TupleExpr [0] | -| test.swift:156:6:156:6 | [post] a [0] | semmle.label | [post] a [0] | -| test.swift:156:6:156:8 | ... .0 | semmle.label | ... .0 | -| test.swift:156:16:156:61 | TupleExpr [0] | semmle.label | TupleExpr [0] | -| test.swift:156:17:156:43 | ... + ... | semmle.label | ... + ... | -| test.swift:156:29:156:43 | source(...) | semmle.label | source(...) | -| test.swift:157:10:157:10 | a [0] | semmle.label | a [0] | -| test.swift:157:10:157:12 | ... .0 | semmle.label | ... .0 | -| test.swift:164:5:164:10 | TupleExpr [0] | semmle.label | TupleExpr [0] | -| test.swift:164:5:164:10 | TupleExpr [1] | semmle.label | TupleExpr [1] | -| test.swift:164:6:164:6 | a | semmle.label | a | -| test.swift:164:9:164:9 | b | semmle.label | b | -| test.swift:164:14:164:67 | TupleExpr [0] | semmle.label | TupleExpr [0] | -| test.swift:164:14:164:67 | TupleExpr [1] | semmle.label | TupleExpr [1] | -| test.swift:164:15:164:39 | ... + ... | semmle.label | ... + ... | -| test.swift:164:25:164:39 | source(...) | semmle.label | source(...) | -| test.swift:164:42:164:66 | ... + ... | semmle.label | ... + ... | -| test.swift:164:52:164:66 | source(...) | semmle.label | source(...) | -| test.swift:165:10:165:10 | a | semmle.label | a | -| test.swift:166:10:166:10 | b | semmle.label | b | +| test.swift:39:18:39:41 | TupleExpr [0] | semmle.label | TupleExpr [0] | +| test.swift:39:19:39:33 | source(...) | semmle.label | source(...) | +| test.swift:40:10:40:10 | a | semmle.label | a | +| test.swift:43:9:43:14 | TupleExpr [1] | semmle.label | TupleExpr [1] | +| test.swift:43:13:43:13 | d | semmle.label | d | +| test.swift:43:18:43:41 | TupleExpr [1] | semmle.label | TupleExpr [1] | +| test.swift:43:27:43:40 | source(...) | semmle.label | source(...) | +| test.swift:45:10:45:10 | d | semmle.label | d | +| test.swift:49:9:49:9 | a | semmle.label | a | +| test.swift:49:13:49:26 | source(...) | semmle.label | source(...) | +| test.swift:50:10:50:10 | a | semmle.label | a | +| test.swift:57:5:57:9 | [post] tuple [0] | semmle.label | [post] tuple [0] | +| test.swift:57:5:57:11 | ... .0 | semmle.label | ... .0 | +| test.swift:57:15:57:28 | source(...) | semmle.label | source(...) | +| test.swift:58:10:58:14 | tuple [0] | semmle.label | tuple [0] | +| test.swift:58:10:58:16 | ... .0 | semmle.label | ... .0 | +| test.swift:64:5:64:14 | [post] deep_tuple [1, 0] | semmle.label | [post] deep_tuple [1, 0] | +| test.swift:64:5:64:16 | [post] ... .1 [0] | semmle.label | [post] ... .1 [0] | +| test.swift:64:5:64:18 | ... .0 | semmle.label | ... .0 | +| test.swift:64:22:64:35 | source(...) | semmle.label | source(...) | +| test.swift:69:10:69:19 | deep_tuple [1, 0] | semmle.label | deep_tuple [1, 0] | +| test.swift:69:10:69:21 | ... .1 [0] | semmle.label | ... .1 [0] | +| test.swift:69:10:69:23 | ... .0 | semmle.label | ... .0 | +| test.swift:75:5:75:16 | TupleExpr [0] | semmle.label | TupleExpr [0] | +| test.swift:75:6:75:10 | [post] tuple [1] | semmle.label | [post] tuple [1] | +| test.swift:75:6:75:12 | ... .1 | semmle.label | ... .1 | +| test.swift:75:20:75:51 | TupleExpr [0] | semmle.label | TupleExpr [0] | +| test.swift:75:21:75:35 | source(...) | semmle.label | source(...) | +| test.swift:77:10:77:14 | tuple [1] | semmle.label | tuple [1] | +| test.swift:77:10:77:16 | ... .1 | semmle.label | ... .1 | +| test.swift:85:5:85:9 | [post] tuple [0] | semmle.label | [post] tuple [0] | +| test.swift:85:5:85:11 | ... .0 | semmle.label | ... .0 | +| test.swift:85:15:85:29 | source(...) | semmle.label | source(...) | +| test.swift:86:10:86:14 | tuple [0] | semmle.label | tuple [0] | +| test.swift:86:10:86:16 | ... .0 | semmle.label | ... .0 | +| test.swift:97:9:97:9 | x | semmle.label | x | +| test.swift:97:13:97:27 | source(...) | semmle.label | source(...) | +| test.swift:101:10:101:10 | x | semmle.label | x | +| test.swift:105:9:105:9 | y | semmle.label | y | +| test.swift:105:13:105:27 | source(...) | semmle.label | source(...) | +| test.swift:107:10:107:10 | y | semmle.label | y | +| test.swift:110:14:110:14 | x | semmle.label | x | +| test.swift:111:14:111:14 | y | semmle.label | y | +| test.swift:118:9:118:13 | [post] tuple [0] | semmle.label | [post] tuple [0] | +| test.swift:118:9:118:15 | ... .0 | semmle.label | ... .0 | +| test.swift:118:19:118:33 | source(...) | semmle.label | source(...) | +| test.swift:123:10:123:14 | tuple [0] | semmle.label | tuple [0] | +| test.swift:123:10:123:16 | ... .0 | semmle.label | ... .0 | +| test.swift:128:9:128:13 | tuple [0] | semmle.label | tuple [0] | +| test.swift:128:9:128:13 | tuple [1] | semmle.label | tuple [1] | +| test.swift:128:17:128:50 | TupleExpr [0] | semmle.label | TupleExpr [0] | +| test.swift:128:17:128:50 | TupleExpr [1] | semmle.label | TupleExpr [1] | +| test.swift:128:18:128:33 | source(...) | semmle.label | source(...) | +| test.swift:128:35:128:49 | source(...) | semmle.label | source(...) | +| test.swift:131:9:131:14 | TupleExpr [0] | semmle.label | TupleExpr [0] | +| test.swift:131:9:131:14 | TupleExpr [1] | semmle.label | TupleExpr [1] | +| test.swift:131:10:131:10 | a | semmle.label | a | +| test.swift:131:13:131:13 | b | semmle.label | b | +| test.swift:131:18:131:22 | tuple [0] | semmle.label | tuple [0] | +| test.swift:131:18:131:22 | tuple [1] | semmle.label | tuple [1] | +| test.swift:136:10:136:10 | a | semmle.label | a | +| test.swift:137:10:137:10 | b | semmle.label | b | +| test.swift:142:5:142:5 | a | semmle.label | a | +| test.swift:142:19:142:33 | source(...) | semmle.label | source(...) | +| test.swift:143:10:143:10 | a | semmle.label | a | +| test.swift:148:5:148:5 | [incoming] a | semmle.label | [incoming] a | +| test.swift:148:10:148:24 | source(...) | semmle.label | source(...) | +| test.swift:149:10:149:10 | a | semmle.label | a | +| test.swift:154:5:154:5 | [incoming] a | semmle.label | [incoming] a | +| test.swift:154:20:154:34 | source(...) | semmle.label | source(...) | +| test.swift:155:10:155:10 | a | semmle.label | a | +| test.swift:160:5:160:5 | [post] a [0] | semmle.label | [post] a [0] | +| test.swift:160:5:160:7 | ... .0 | semmle.label | ... .0 | +| test.swift:160:23:160:37 | source(...) | semmle.label | source(...) | +| test.swift:161:10:161:10 | a [0] | semmle.label | a [0] | +| test.swift:161:10:161:12 | ... .0 | semmle.label | ... .0 | +| test.swift:167:5:167:12 | TupleExpr [0] | semmle.label | TupleExpr [0] | +| test.swift:167:6:167:6 | [post] a [0] | semmle.label | [post] a [0] | +| test.swift:167:6:167:8 | ... .0 | semmle.label | ... .0 | +| test.swift:167:16:167:61 | TupleExpr [0] | semmle.label | TupleExpr [0] | +| test.swift:167:17:167:43 | ... + ... | semmle.label | ... + ... | +| test.swift:167:29:167:43 | source(...) | semmle.label | source(...) | +| test.swift:168:10:168:10 | a [0] | semmle.label | a [0] | +| test.swift:168:10:168:12 | ... .0 | semmle.label | ... .0 | +| test.swift:175:5:175:10 | TupleExpr [0] | semmle.label | TupleExpr [0] | +| test.swift:175:5:175:10 | TupleExpr [1] | semmle.label | TupleExpr [1] | +| test.swift:175:6:175:6 | a | semmle.label | a | +| test.swift:175:9:175:9 | b | semmle.label | b | +| test.swift:175:14:175:67 | TupleExpr [0] | semmle.label | TupleExpr [0] | +| test.swift:175:14:175:67 | TupleExpr [1] | semmle.label | TupleExpr [1] | +| test.swift:175:15:175:39 | ... + ... | semmle.label | ... + ... | +| test.swift:175:25:175:39 | source(...) | semmle.label | source(...) | +| test.swift:175:42:175:66 | ... + ... | semmle.label | ... + ... | +| test.swift:175:52:175:66 | source(...) | semmle.label | source(...) | +| test.swift:176:10:176:10 | a | semmle.label | a | +| test.swift:177:10:177:10 | b | semmle.label | b | subpaths testFailures #select -| implicit-self.swift:12:14:12:19 | ... .x | implicit-self.swift:11:18:11:31 | source(...) | implicit-self.swift:12:14:12:19 | ... .x | $@ | implicit-self.swift:11:18:11:31 | source(...) | source(...) | -| implicit-self.swift:18:14:18:14 | x | implicit-self.swift:17:13:17:26 | source(...) | implicit-self.swift:18:14:18:14 | x | $@ | implicit-self.swift:17:13:17:26 | source(...) | source(...) | -| implicit-self.swift:24:14:24:19 | ... .x | implicit-self.swift:23:13:23:26 | source(...) | implicit-self.swift:24:14:24:19 | ... .x | $@ | implicit-self.swift:23:13:23:26 | source(...) | source(...) | -| implicit-self.swift:30:14:30:14 | x | implicit-self.swift:29:18:29:31 | source(...) | implicit-self.swift:30:14:30:14 | x | $@ | implicit-self.swift:29:18:29:31 | source(...) | source(...) | -| implicit-self.swift:36:14:36:23 | ... .x | implicit-self.swift:35:22:35:35 | source(...) | implicit-self.swift:36:14:36:23 | ... .x | $@ | implicit-self.swift:35:22:35:35 | source(...) | source(...) | -| implicit-self.swift:42:14:42:18 | ... .x | implicit-self.swift:41:17:41:30 | source(...) | implicit-self.swift:42:14:42:18 | ... .x | $@ | implicit-self.swift:41:17:41:30 | source(...) | source(...) | -| implicit-self.swift:48:14:48:23 | ... .x | implicit-self.swift:47:17:47:30 | source(...) | implicit-self.swift:48:14:48:23 | ... .x | $@ | implicit-self.swift:47:17:47:30 | source(...) | source(...) | -| implicit-self.swift:54:14:54:18 | ... .x | implicit-self.swift:53:22:53:35 | source(...) | implicit-self.swift:54:14:54:18 | ... .x | $@ | implicit-self.swift:53:22:53:35 | source(...) | source(...) | -| implicit-self.swift:60:14:60:14 | x | implicit-self.swift:59:24:59:37 | source(...) | implicit-self.swift:60:14:60:14 | x | $@ | implicit-self.swift:59:24:59:37 | source(...) | source(...) | -| implicit-self.swift:61:14:61:19 | ... .x | implicit-self.swift:59:24:59:37 | source(...) | implicit-self.swift:61:14:61:19 | ... .x | $@ | implicit-self.swift:59:24:59:37 | source(...) | source(...) | -| implicit-self.swift:67:14:67:14 | x | implicit-self.swift:66:29:66:43 | source(...) | implicit-self.swift:67:14:67:14 | x | $@ | implicit-self.swift:66:29:66:43 | source(...) | source(...) | -| implicit-self.swift:68:14:68:19 | ... .x | implicit-self.swift:66:29:66:43 | source(...) | implicit-self.swift:68:14:68:19 | ... .x | $@ | implicit-self.swift:66:29:66:43 | source(...) | source(...) | -| implicit-self.swift:74:14:74:14 | x | implicit-self.swift:73:24:73:38 | source(...) | implicit-self.swift:74:14:74:14 | x | $@ | implicit-self.swift:73:24:73:38 | source(...) | source(...) | -| implicit-self.swift:75:14:75:19 | ... .x | implicit-self.swift:73:24:73:38 | source(...) | implicit-self.swift:75:14:75:19 | ... .x | $@ | implicit-self.swift:73:24:73:38 | source(...) | source(...) | -| implicit-self.swift:81:14:81:14 | x | implicit-self.swift:80:29:80:43 | source(...) | implicit-self.swift:81:14:81:14 | x | $@ | implicit-self.swift:80:29:80:43 | source(...) | source(...) | -| implicit-self.swift:82:14:82:19 | ... .x | implicit-self.swift:80:29:80:43 | source(...) | implicit-self.swift:82:14:82:19 | ... .x | $@ | implicit-self.swift:80:29:80:43 | source(...) | source(...) | -| test.swift:2:10:2:21 | source(...) | test.swift:2:10:2:21 | source(...) | test.swift:2:10:2:21 | source(...) | $@ | test.swift:2:10:2:21 | source(...) | source(...) | -| test.swift:6:10:6:32 | ... + ... | test.swift:6:10:6:23 | source(...) | test.swift:6:10:6:32 | ... + ... | $@ | test.swift:6:10:6:23 | source(...) | source(...) | -| test.swift:7:10:7:32 | ... + ... | test.swift:7:19:7:32 | source(...) | test.swift:7:10:7:32 | ... + ... | $@ | test.swift:7:19:7:32 | source(...) | source(...) | -| test.swift:9:10:9:33 | StringInterpolationExpr | test.swift:9:13:9:26 | source(...) | test.swift:9:10:9:33 | StringInterpolationExpr | $@ | test.swift:9:13:9:26 | source(...) | source(...) | -| test.swift:10:10:10:33 | StringInterpolationExpr | test.swift:10:18:10:31 | source(...) | test.swift:10:10:10:33 | StringInterpolationExpr | $@ | test.swift:10:18:10:31 | source(...) | source(...) | -| test.swift:11:10:11:38 | StringInterpolationExpr | test.swift:11:18:11:31 | source(...) | test.swift:11:10:11:38 | StringInterpolationExpr | $@ | test.swift:11:18:11:31 | source(...) | source(...) | -| test.swift:16:10:16:35 | ... .0 | test.swift:16:11:16:25 | source(...) | test.swift:16:10:16:35 | ... .0 | $@ | test.swift:16:11:16:25 | source(...) | source(...) | -| test.swift:19:10:19:35 | ... .1 | test.swift:19:19:19:32 | source(...) | test.swift:19:10:19:35 | ... .1 | $@ | test.swift:19:19:19:32 | source(...) | source(...) | -| test.swift:24:10:24:10 | a | test.swift:23:13:23:26 | source(...) | test.swift:24:10:24:10 | a | $@ | test.swift:23:13:23:26 | source(...) | source(...) | -| test.swift:29:10:29:10 | a | test.swift:28:19:28:33 | source(...) | test.swift:29:10:29:10 | a | $@ | test.swift:28:19:28:33 | source(...) | source(...) | -| test.swift:34:10:34:10 | d | test.swift:32:27:32:40 | source(...) | test.swift:34:10:34:10 | d | $@ | test.swift:32:27:32:40 | source(...) | source(...) | -| test.swift:39:10:39:10 | a | test.swift:38:13:38:26 | source(...) | test.swift:39:10:39:10 | a | $@ | test.swift:38:13:38:26 | source(...) | source(...) | -| test.swift:47:10:47:16 | ... .0 | test.swift:46:15:46:28 | source(...) | test.swift:47:10:47:16 | ... .0 | $@ | test.swift:46:15:46:28 | source(...) | source(...) | -| test.swift:58:10:58:23 | ... .0 | test.swift:53:22:53:35 | source(...) | test.swift:58:10:58:23 | ... .0 | $@ | test.swift:53:22:53:35 | source(...) | source(...) | -| test.swift:66:10:66:16 | ... .1 | test.swift:64:21:64:35 | source(...) | test.swift:66:10:66:16 | ... .1 | $@ | test.swift:64:21:64:35 | source(...) | source(...) | -| test.swift:75:10:75:16 | ... .0 | test.swift:74:15:74:29 | source(...) | test.swift:75:10:75:16 | ... .0 | $@ | test.swift:74:15:74:29 | source(...) | source(...) | -| test.swift:90:10:90:10 | x | test.swift:86:13:86:27 | source(...) | test.swift:90:10:90:10 | x | $@ | test.swift:86:13:86:27 | source(...) | source(...) | -| test.swift:96:10:96:10 | y | test.swift:94:13:94:27 | source(...) | test.swift:96:10:96:10 | y | $@ | test.swift:94:13:94:27 | source(...) | source(...) | -| test.swift:99:14:99:14 | x | test.swift:86:13:86:27 | source(...) | test.swift:99:14:99:14 | x | $@ | test.swift:86:13:86:27 | source(...) | source(...) | -| test.swift:100:14:100:14 | y | test.swift:94:13:94:27 | source(...) | test.swift:100:14:100:14 | y | $@ | test.swift:94:13:94:27 | source(...) | source(...) | -| test.swift:112:10:112:16 | ... .0 | test.swift:107:19:107:33 | source(...) | test.swift:112:10:112:16 | ... .0 | $@ | test.swift:107:19:107:33 | source(...) | source(...) | -| test.swift:125:10:125:10 | a | test.swift:117:18:117:33 | source(...) | test.swift:125:10:125:10 | a | $@ | test.swift:117:18:117:33 | source(...) | source(...) | -| test.swift:126:10:126:10 | b | test.swift:117:35:117:49 | source(...) | test.swift:126:10:126:10 | b | $@ | test.swift:117:35:117:49 | source(...) | source(...) | -| test.swift:132:10:132:10 | a | test.swift:131:19:131:33 | source(...) | test.swift:132:10:132:10 | a | $@ | test.swift:131:19:131:33 | source(...) | source(...) | -| test.swift:138:10:138:10 | a | test.swift:137:10:137:24 | source(...) | test.swift:138:10:138:10 | a | $@ | test.swift:137:10:137:24 | source(...) | source(...) | -| test.swift:144:10:144:10 | a | test.swift:143:20:143:34 | source(...) | test.swift:144:10:144:10 | a | $@ | test.swift:143:20:143:34 | source(...) | source(...) | -| test.swift:150:10:150:12 | ... .0 | test.swift:149:23:149:37 | source(...) | test.swift:150:10:150:12 | ... .0 | $@ | test.swift:149:23:149:37 | source(...) | source(...) | -| test.swift:157:10:157:12 | ... .0 | test.swift:156:29:156:43 | source(...) | test.swift:157:10:157:12 | ... .0 | $@ | test.swift:156:29:156:43 | source(...) | source(...) | -| test.swift:165:10:165:10 | a | test.swift:164:25:164:39 | source(...) | test.swift:165:10:165:10 | a | $@ | test.swift:164:25:164:39 | source(...) | source(...) | -| test.swift:166:10:166:10 | b | test.swift:164:52:164:66 | source(...) | test.swift:166:10:166:10 | b | $@ | test.swift:164:52:164:66 | source(...) | source(...) | +| implicit-self.swift:17:14:17:19 | ... .x | implicit-self.swift:16:18:16:31 | source(...) | implicit-self.swift:17:14:17:19 | ... .x | $@ | implicit-self.swift:16:18:16:31 | source(...) | source(...) | +| implicit-self.swift:23:14:23:14 | x | implicit-self.swift:22:13:22:26 | source(...) | implicit-self.swift:23:14:23:14 | x | $@ | implicit-self.swift:22:13:22:26 | source(...) | source(...) | +| implicit-self.swift:29:14:29:19 | ... .x | implicit-self.swift:28:13:28:26 | source(...) | implicit-self.swift:29:14:29:19 | ... .x | $@ | implicit-self.swift:28:13:28:26 | source(...) | source(...) | +| implicit-self.swift:35:14:35:14 | x | implicit-self.swift:34:18:34:31 | source(...) | implicit-self.swift:35:14:35:14 | x | $@ | implicit-self.swift:34:18:34:31 | source(...) | source(...) | +| implicit-self.swift:41:14:41:23 | ... .x | implicit-self.swift:40:22:40:35 | source(...) | implicit-self.swift:41:14:41:23 | ... .x | $@ | implicit-self.swift:40:22:40:35 | source(...) | source(...) | +| implicit-self.swift:47:14:47:18 | ... .x | implicit-self.swift:46:17:46:30 | source(...) | implicit-self.swift:47:14:47:18 | ... .x | $@ | implicit-self.swift:46:17:46:30 | source(...) | source(...) | +| implicit-self.swift:53:14:53:23 | ... .x | implicit-self.swift:52:17:52:30 | source(...) | implicit-self.swift:53:14:53:23 | ... .x | $@ | implicit-self.swift:52:17:52:30 | source(...) | source(...) | +| implicit-self.swift:59:14:59:18 | ... .x | implicit-self.swift:58:22:58:35 | source(...) | implicit-self.swift:59:14:59:18 | ... .x | $@ | implicit-self.swift:58:22:58:35 | source(...) | source(...) | +| implicit-self.swift:65:14:65:14 | x | implicit-self.swift:64:24:64:37 | source(...) | implicit-self.swift:65:14:65:14 | x | $@ | implicit-self.swift:64:24:64:37 | source(...) | source(...) | +| implicit-self.swift:66:14:66:19 | ... .x | implicit-self.swift:64:24:64:37 | source(...) | implicit-self.swift:66:14:66:19 | ... .x | $@ | implicit-self.swift:64:24:64:37 | source(...) | source(...) | +| implicit-self.swift:72:14:72:14 | x | implicit-self.swift:71:29:71:43 | source(...) | implicit-self.swift:72:14:72:14 | x | $@ | implicit-self.swift:71:29:71:43 | source(...) | source(...) | +| implicit-self.swift:73:14:73:19 | ... .x | implicit-self.swift:71:29:71:43 | source(...) | implicit-self.swift:73:14:73:19 | ... .x | $@ | implicit-self.swift:71:29:71:43 | source(...) | source(...) | +| implicit-self.swift:79:14:79:14 | x | implicit-self.swift:78:24:78:38 | source(...) | implicit-self.swift:79:14:79:14 | x | $@ | implicit-self.swift:78:24:78:38 | source(...) | source(...) | +| implicit-self.swift:80:14:80:19 | ... .x | implicit-self.swift:78:24:78:38 | source(...) | implicit-self.swift:80:14:80:19 | ... .x | $@ | implicit-self.swift:78:24:78:38 | source(...) | source(...) | +| implicit-self.swift:86:14:86:14 | x | implicit-self.swift:85:29:85:43 | source(...) | implicit-self.swift:86:14:86:14 | x | $@ | implicit-self.swift:85:29:85:43 | source(...) | source(...) | +| implicit-self.swift:87:14:87:19 | ... .x | implicit-self.swift:85:29:85:43 | source(...) | implicit-self.swift:87:14:87:19 | ... .x | $@ | implicit-self.swift:85:29:85:43 | source(...) | source(...) | +| test.swift:9:10:9:21 | source(...) | test.swift:9:10:9:21 | source(...) | test.swift:9:10:9:21 | source(...) | $@ | test.swift:9:10:9:21 | source(...) | source(...) | +| test.swift:17:10:17:32 | ... + ... | test.swift:17:10:17:23 | source(...) | test.swift:17:10:17:32 | ... + ... | $@ | test.swift:17:10:17:23 | source(...) | source(...) | +| test.swift:18:10:18:32 | ... + ... | test.swift:18:19:18:32 | source(...) | test.swift:18:10:18:32 | ... + ... | $@ | test.swift:18:19:18:32 | source(...) | source(...) | +| test.swift:20:10:20:33 | StringInterpolationExpr | test.swift:20:13:20:26 | source(...) | test.swift:20:10:20:33 | StringInterpolationExpr | $@ | test.swift:20:13:20:26 | source(...) | source(...) | +| test.swift:21:10:21:33 | StringInterpolationExpr | test.swift:21:18:21:31 | source(...) | test.swift:21:10:21:33 | StringInterpolationExpr | $@ | test.swift:21:18:21:31 | source(...) | source(...) | +| test.swift:22:10:22:38 | StringInterpolationExpr | test.swift:22:18:22:31 | source(...) | test.swift:22:10:22:38 | StringInterpolationExpr | $@ | test.swift:22:18:22:31 | source(...) | source(...) | +| test.swift:27:10:27:35 | ... .0 | test.swift:27:11:27:25 | source(...) | test.swift:27:10:27:35 | ... .0 | $@ | test.swift:27:11:27:25 | source(...) | source(...) | +| test.swift:30:10:30:35 | ... .1 | test.swift:30:19:30:32 | source(...) | test.swift:30:10:30:35 | ... .1 | $@ | test.swift:30:19:30:32 | source(...) | source(...) | +| test.swift:35:10:35:10 | a | test.swift:34:13:34:26 | source(...) | test.swift:35:10:35:10 | a | $@ | test.swift:34:13:34:26 | source(...) | source(...) | +| test.swift:40:10:40:10 | a | test.swift:39:19:39:33 | source(...) | test.swift:40:10:40:10 | a | $@ | test.swift:39:19:39:33 | source(...) | source(...) | +| test.swift:45:10:45:10 | d | test.swift:43:27:43:40 | source(...) | test.swift:45:10:45:10 | d | $@ | test.swift:43:27:43:40 | source(...) | source(...) | +| test.swift:50:10:50:10 | a | test.swift:49:13:49:26 | source(...) | test.swift:50:10:50:10 | a | $@ | test.swift:49:13:49:26 | source(...) | source(...) | +| test.swift:58:10:58:16 | ... .0 | test.swift:57:15:57:28 | source(...) | test.swift:58:10:58:16 | ... .0 | $@ | test.swift:57:15:57:28 | source(...) | source(...) | +| test.swift:69:10:69:23 | ... .0 | test.swift:64:22:64:35 | source(...) | test.swift:69:10:69:23 | ... .0 | $@ | test.swift:64:22:64:35 | source(...) | source(...) | +| test.swift:77:10:77:16 | ... .1 | test.swift:75:21:75:35 | source(...) | test.swift:77:10:77:16 | ... .1 | $@ | test.swift:75:21:75:35 | source(...) | source(...) | +| test.swift:86:10:86:16 | ... .0 | test.swift:85:15:85:29 | source(...) | test.swift:86:10:86:16 | ... .0 | $@ | test.swift:85:15:85:29 | source(...) | source(...) | +| test.swift:101:10:101:10 | x | test.swift:97:13:97:27 | source(...) | test.swift:101:10:101:10 | x | $@ | test.swift:97:13:97:27 | source(...) | source(...) | +| test.swift:107:10:107:10 | y | test.swift:105:13:105:27 | source(...) | test.swift:107:10:107:10 | y | $@ | test.swift:105:13:105:27 | source(...) | source(...) | +| test.swift:110:14:110:14 | x | test.swift:97:13:97:27 | source(...) | test.swift:110:14:110:14 | x | $@ | test.swift:97:13:97:27 | source(...) | source(...) | +| test.swift:111:14:111:14 | y | test.swift:105:13:105:27 | source(...) | test.swift:111:14:111:14 | y | $@ | test.swift:105:13:105:27 | source(...) | source(...) | +| test.swift:123:10:123:16 | ... .0 | test.swift:118:19:118:33 | source(...) | test.swift:123:10:123:16 | ... .0 | $@ | test.swift:118:19:118:33 | source(...) | source(...) | +| test.swift:136:10:136:10 | a | test.swift:128:18:128:33 | source(...) | test.swift:136:10:136:10 | a | $@ | test.swift:128:18:128:33 | source(...) | source(...) | +| test.swift:137:10:137:10 | b | test.swift:128:35:128:49 | source(...) | test.swift:137:10:137:10 | b | $@ | test.swift:128:35:128:49 | source(...) | source(...) | +| test.swift:143:10:143:10 | a | test.swift:142:19:142:33 | source(...) | test.swift:143:10:143:10 | a | $@ | test.swift:142:19:142:33 | source(...) | source(...) | +| test.swift:149:10:149:10 | a | test.swift:148:10:148:24 | source(...) | test.swift:149:10:149:10 | a | $@ | test.swift:148:10:148:24 | source(...) | source(...) | +| test.swift:155:10:155:10 | a | test.swift:154:20:154:34 | source(...) | test.swift:155:10:155:10 | a | $@ | test.swift:154:20:154:34 | source(...) | source(...) | +| test.swift:161:10:161:12 | ... .0 | test.swift:160:23:160:37 | source(...) | test.swift:161:10:161:12 | ... .0 | $@ | test.swift:160:23:160:37 | source(...) | source(...) | +| test.swift:168:10:168:12 | ... .0 | test.swift:167:29:167:43 | source(...) | test.swift:168:10:168:12 | ... .0 | $@ | test.swift:167:29:167:43 | source(...) | source(...) | +| test.swift:176:10:176:10 | a | test.swift:175:25:175:39 | source(...) | test.swift:176:10:176:10 | a | $@ | test.swift:175:25:175:39 | source(...) | source(...) | +| test.swift:177:10:177:10 | b | test.swift:175:52:175:66 | source(...) | test.swift:177:10:177:10 | b | $@ | test.swift:175:52:175:66 | source(...) | source(...) | diff --git a/unified/ql/test/library-tests/dataflow/test.swift b/unified/ql/test/library-tests/dataflow/test.swift index 988bcfe03f52..a7fa42ee6100 100644 --- a/unified/ql/test/library-tests/dataflow/test.swift +++ b/unified/ql/test/library-tests/dataflow/test.swift @@ -1,167 +1,178 @@ +func source(_ s: String) -> String { return s } + +@discardableResult +func sink(_ s: Any) -> String { return "" } + +func foo() -> Bool { return 5 > 5 } + func t1() { - sink(source("t1")); // $ hasValueFlow=t1 + sink(source("t1")) // $ hasValueFlow=t1 +} + +extension DefaultStringInterpolation { + mutating func appendInterpolation(escape value: String) {} } func t2() { - sink(source("t2.1") + "blah"); // $ hasTaintFlow=t2.1 - sink("blah" + source("t2.2")); // $ hasTaintFlow=t2.2 + sink(source("t2.1") + "blah") // $ hasTaintFlow=t2.1 + sink("blah" + source("t2.2")) // $ hasTaintFlow=t2.2 - sink("\(source("t2.3")) blah"); // $ hasTaintFlow=t2.3 - sink("blah \(source("t2.4"))"); // $ hasTaintFlow=t2.4 - sink("blah \(source("t2.5")) blah"); // $ hasTaintFlow=t2.5 - sink("blah \(escape: source("t2.6")) blah"); // no flow + sink("\(source("t2.3")) blah") // $ hasTaintFlow=t2.3 + sink("blah \(source("t2.4"))") // $ hasTaintFlow=t2.4 + sink("blah \(source("t2.5")) blah") // $ hasTaintFlow=t2.5 + sink("blah \(escape: source("t2.6")) blah") // no flow } func t3() { - sink((source("t3.1"), "safe").0); // $ hasValueFlow=t3.1 - sink((source("t3.2"), "safe").1); // no flow - sink(("safe", source("t3.3")).0); // no flow - sink(("safe", source("t3.4")).1); // $ hasValueFlow=t3.4 + sink((source("t3.1"), "safe").0) // $ hasValueFlow=t3.1 + sink((source("t3.2"), "safe").1) // no flow + sink(("safe", source("t3.3")).0) // no flow + sink(("safe", source("t3.4")).1) // $ hasValueFlow=t3.4 } func t4() { - let a = source("t4.1"); - sink(a); // $ hasValueFlow=t4.1 + let a = source("t4.1") + sink(a) // $ hasValueFlow=t4.1 } func t5() { - let (a, b) = (source("t5.1"), "safe"); - sink(a); // $ hasValueFlow=t5.1 - sink(b); // no flow + let (a, b) = (source("t5.1"), "safe") + sink(a) // $ hasValueFlow=t5.1 + sink(b) // no flow - let (c, d) = ("safe", source("t5.2")); - sink(c); // no flow - sink(d); // $ hasValueFlow=t5.2 + let (c, d) = ("safe", source("t5.2")) + sink(c) // no flow + sink(d) // $ hasValueFlow=t5.2 } func t6() { - var a = source("t6.1"); - sink(a); // $ hasValueFlow=t6.1 - a = "safe"; - sink(a); + var a = source("t6.1") + sink(a) // $ hasValueFlow=t6.1 + a = "safe" + sink(a) } func t7() { var tuple = ("safe", "safe") - tuple.0 = source("t7.1"); - sink(tuple.0); // $ hasValueFlow=t7.1 - sink(tuple.1); // no flow + tuple.0 = source("t7.1") + sink(tuple.0) // $ hasValueFlow=t7.1 + sink(tuple.1) // no flow } func t8() { var deep_tuple = (("safe", "safe"), ("safe", "safe")) - deep_tuple.1.0 = source("t8.1"); - sink(deep_tuple); // no flow - sink(deep_tuple.0); // no flow - sink(deep_tuple.1); // no flow - sink(deep_tuple.0.1); // no flow - sink(deep_tuple.1.0); // $ hasValueFlow=t8.1 - sink(deep_tuple.1.1); // no flow + deep_tuple.1.0 = source("t8.1") + sink(deep_tuple) // no flow + sink(deep_tuple.0) // no flow + sink(deep_tuple.1) // no flow + sink(deep_tuple.0.1) // no flow + sink(deep_tuple.1.0) // $ hasValueFlow=t8.1 + sink(deep_tuple.1.1) // no flow } func t9() { var tuple = ("safe", "safe") - (tuple.1, _) = (source("t9.1"), source("t9.2")); - sink(tuple.0); // no flow - sink(tuple.1); // $ hasValueFlow=t9.1 + (tuple.1, _) = (source("t9.1"), source("t9.2")) + sink(tuple.0) // no flow + sink(tuple.1) // $ hasValueFlow=t9.1 } func t10() { var tuple = ("safe", "safe") - sink(tuple.0); // no flow - sink(tuple.1); // no flow + sink(tuple.0) // no flow + sink(tuple.1) // no flow - tuple.0 = source("t10.1"); - sink(tuple.0); // $ hasValueFlow=t10.1 - sink(tuple.1); // no flow + tuple.0 = source("t10.1") + sink(tuple.0) // $ hasValueFlow=t10.1 + sink(tuple.1) // no flow - tuple = ("safe", "safe"); - sink(tuple.0); // no flow - sink(tuple.1); // no flow + tuple = ("safe", "safe") + sink(tuple.0) // no flow + sink(tuple.1) // no flow } func t11() { - var x = "safe"; - if (foo()) { - x = source("t11.1"); + var x = "safe" + if foo() { + x = source("t11.1") } else { - sink(x); // no flow + sink(x) // no flow } - sink(x); // $ hasValueFlow=t11.1 + sink(x) // $ hasValueFlow=t11.1 - var y = "safe"; - if (foo()) { - y = source("t11.2"); + var y = "safe" + if foo() { + y = source("t11.2") } - sink(y); // $ hasValueFlow=t11.2 + sink(y) // $ hasValueFlow=t11.2 - if (foo()) { - sink(x); // $ hasValueFlow=t11.1 - sink(y); // $ hasValueFlow=t11.2 + if foo() { + sink(x) // $ hasValueFlow=t11.1 + sink(y) // $ hasValueFlow=t11.2 } } func t12() { - var tuple = ("safe", "safe"); - if (foo()) { - tuple.0 = source("t12.1"); + var tuple = ("safe", "safe") + if foo() { + tuple.0 = source("t12.1") } else { - sink(tuple.0); // no flow - sink(tuple.1); // no flow + sink(tuple.0) // no flow + sink(tuple.1) // no flow } - sink(tuple.0); // $ hasValueFlow=t12.1 - sink(tuple.1); // no flow + sink(tuple.0) // $ hasValueFlow=t12.1 + sink(tuple.1) // no flow } func t13() { - var tuple = (source("t13.1"), source("t13.2")); - var (a,b) = ("safe", "safe") - if (foo()) { - (a,b) = tuple + let tuple = (source("t13.1"), source("t13.2")) + var (a, b) = ("safe", "safe") + if foo() { + (a, b) = tuple } else { - sink(a); // no flow - sink(b); // no flow + sink(a) // no flow + sink(b) // no flow } - sink(a); // $ hasValueFlow=t13.1 - sink(b); // $ hasValueFlow=t13.2 + sink(a) // $ hasValueFlow=t13.1 + sink(b) // $ hasValueFlow=t13.2 } func t14() { - var a = "safe"; - a = sink(a) + source("t14.1"); - sink(a); // $ hasTaintFlow=t14.1 + var a = "safe" + a = sink(a) + source("t14.1") + sink(a) // $ hasTaintFlow=t14.1 } func t15() { - var a = "safe"; - a += source("t15.1"); - sink(a); // $ hasTaintFlow=t15.1 + var a = "safe" + a += source("t15.1") + sink(a) // $ hasTaintFlow=t15.1 } func t16() { - var a = "safe"; - a += sink(a) + source("t16.1"); - sink(a); // $ hasTaintFlow=t16.1 + var a = "safe" + a += sink(a) + source("t16.1") + sink(a) // $ hasTaintFlow=t16.1 } func t17() { - var a = ("safe", "safe"); - a.0 = sink(a.0) + source("t17.1"); - sink(a.0); // $ hasTaintFlow=t17.1 - sink(a.1); // no flow + var a = ("safe", "safe") + a.0 = sink(a.0) + source("t17.1") + sink(a.0) // $ hasTaintFlow=t17.1 + sink(a.1) // no flow } func t18() { - var a = ("safe", "safe"); - (a.0, _) = (sink(a.0) + source("t18.1"), source("t18.2")); - sink(a.0); // $ hasTaintFlow=t18.1 - sink(a.1); // no flow + var a = ("safe", "safe") + (a.0, _) = (sink(a.0) + source("t18.1"), source("t18.2")) + sink(a.0) // $ hasTaintFlow=t18.1 + sink(a.1) // no flow } func t19() { - var a = "safe"; - var b = "safe"; - (a, b) = (sink(a) + source("t19.1"), sink(b) + source("t19.2")); - sink(a); // $ hasTaintFlow=t19.1 - sink(b); // $ hasTaintFlow=t19.2 + var a = "safe" + var b = "safe" + (a, b) = (sink(a) + source("t19.1"), sink(b) + source("t19.2")) + sink(a) // $ hasTaintFlow=t19.1 + sink(b) // $ hasTaintFlow=t19.2 } From ec82b66b9892efe1d5be52880801e7718b99ec96 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 17 Sep 2026 15:48:09 +0200 Subject: [PATCH 1141/2098] unified: Add some basic call graph tests --- .../test/library-tests/dataflow/calls.swift | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 unified/ql/test/library-tests/dataflow/calls.swift diff --git a/unified/ql/test/library-tests/dataflow/calls.swift b/unified/ql/test/library-tests/dataflow/calls.swift new file mode 100644 index 000000000000..b5c4ab37673b --- /dev/null +++ b/unified/ql/test/library-tests/dataflow/calls.swift @@ -0,0 +1,68 @@ +func source(_ s: String) -> String { return s } + +@discardableResult +func sink(_ s: String) -> String { return "" } + +func t1() { + func target(_ x: String) { + sink(x) // $ MISSING: hasValueFlow=t1.1 + } + target(source("t1.1")) +} + +func t2() { + func target() -> String { + return source("t2.1") + } + sink(target()) // $ MISSING: hasValueFlow=t2.1 +} + +func t3() { + func target(x: String) { + sink(x) // $ MISSING: hasValueFlow=t3.1 + } + target(x: source("t3.1")) +} + +func t4() { + func target(_ x: String) -> String { + return x + "foo" + } + sink(target(source("t4.1"))) // $ MISSING: hasTaintFlow=t4.1 + sink(target(source("t4.2"))) // $ MISSING: hasTaintFlow=t4.2 + sink(target("safe")) +} + +func t5() { + func target1(name x: String) { + sink(x) // $ MISSING: hasValueFlow=t5.1 + } + target1(name: source("t5.1")) + + func target2(name: String) { + sink(name) // $ MISSING: hasValueFlow=t5.2 + } + target2(name: source("t5.2")) +} + +func t6() { + func target(_ x: String, _ y: String) { + sink(x) // $ MISSING: hasValueFlow=t6.1 + sink(y) // $ MISSING: hasValueFlow=t6.2 + } + target(source("t6.1"), source("t6.2")) +} + +class Box { + var field: String = "" +} + +func t7() { + func target(_ x: Box) { + x.field = source("t7.1") + } + let b = Box() + sink(b.field) // no flow + target(b) + sink(b.field) // $ MISSING: hasValueFlow=t7.1 +} From 11c7858545ff36ab70ad18a41f152445bcf3cd65 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 17 Sep 2026 14:03:01 +0200 Subject: [PATCH 1142/2098] unified: Add ParameterPosition --- .../lib/codeql/unified/internal/FacadeAst.qll | 8 +++-- .../unified/internal/dataflow/AllDataFlow.qll | 3 +- .../dataflow/DataFlowInstantiation.qll | 16 +--------- .../internal/dataflow/ParameterPositions.qll | 30 +++++++++++++++++++ 4 files changed, 39 insertions(+), 18 deletions(-) create mode 100644 unified/ql/lib/codeql/unified/internal/dataflow/ParameterPositions.qll diff --git a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll index 67473ac728b5..337bc0fecd67 100644 --- a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll +++ b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll @@ -172,8 +172,12 @@ module Unified { } class Parameter extends G::Parameter { - /** Gets the external name of this parameter. */ - string getExternalName() { result = this.getExternalNameNode().getValue() } + /** + * Gets the external name of this parameter. + * + * Has no result for pseudo-names like `_` that indicate that this is actually a positional parameter. + */ + string getExternalName() { result = this.getExternalNameNode().getValue() and not result = "_" } } class TypeAliasDeclaration extends G::TypeAliasDeclaration { diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/AllDataFlow.qll b/unified/ql/lib/codeql/unified/internal/dataflow/AllDataFlow.qll index 893e62d3b140..e63a4cbc29ed 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/AllDataFlow.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/AllDataFlow.qll @@ -5,7 +5,8 @@ import DataFlowGraph import DataFlowInstantiation import DataFlowNode import DataFlowPlugin -import Step import LocalSsa +import ParameterPositions +import Step import TaintTrackingInstantiation import VariableRefKind diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll index da5602cddd29..6642e78d2558 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll @@ -42,21 +42,7 @@ module DataFlowInput implements InputSig { class ReturnKind = Unit; - class ParameterPosition extends Void { - ParameterPosition() { none() } // TODO - - bindingset[this] - string toString() { none() } // TODO - } - - class ArgumentPosition extends Void { - ArgumentPosition() { none() } // TODO - - bindingset[this] - string toString() { none() } // TODO - } - - predicate parameterMatch(ParameterPosition ppos, ArgumentPosition apos) { none() } // TODO + import ParameterPositions // // Calls and callables diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/ParameterPositions.qll b/unified/ql/lib/codeql/unified/internal/dataflow/ParameterPositions.qll new file mode 100644 index 000000000000..81a11f3a0419 --- /dev/null +++ b/unified/ql/lib/codeql/unified/internal/dataflow/ParameterPositions.qll @@ -0,0 +1,30 @@ +private import unified + +private newtype TParameterPosition = + TReceiverParameter() or + TPositionalParameter(int n) { n = [0 .. 20] } or + TNamedParameter(string name) { + name = any(Parameter p).getExternalName() + or + name = any(Argument arg).getName() + } + +class ParameterPosition extends TParameterPosition { + predicate isReceiver() { this = TReceiverParameter() } + + int asPositional() { this = TPositionalParameter(result) } + + string asNamed() { this = TNamedParameter(result) } + + string toString() { + this.isReceiver() and result = "receiver" + or + result = this.asPositional().toString() + or + result = "\"" + this.asNamed() + "\"" + } +} + +class ArgumentPosition = ParameterPosition; + +predicate parameterMatch(ParameterPosition ppos, ArgumentPosition apos) { apos = ppos } From 724807f685445c0657766305a233a044f29d0e87 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 17 Sep 2026 14:41:02 +0200 Subject: [PATCH 1143/2098] unified: Add DataFlowCall and DataFlowCallable --- .../unified/internal/dataflow/AllDataFlow.qll | 2 ++ .../internal/dataflow/DataFlowCall.qll | 26 +++++++++++++++++++ .../internal/dataflow/DataFlowCallable.qll | 21 +++++++++++++++ .../dataflow/DataFlowInstantiation.qll | 14 ++++------ 4 files changed, 54 insertions(+), 9 deletions(-) create mode 100644 unified/ql/lib/codeql/unified/internal/dataflow/DataFlowCall.qll create mode 100644 unified/ql/lib/codeql/unified/internal/dataflow/DataFlowCallable.qll diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/AllDataFlow.qll b/unified/ql/lib/codeql/unified/internal/dataflow/AllDataFlow.qll index e63a4cbc29ed..f7b3ea5624ef 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/AllDataFlow.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/AllDataFlow.qll @@ -1,6 +1,8 @@ /** Re-exports all the files in the internal dataflow folder (except DataFlowPublic). */ import Content +import DataFlowCall +import DataFlowCallable import DataFlowGraph import DataFlowInstantiation import DataFlowNode diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowCall.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowCall.qll new file mode 100644 index 000000000000..895f309f028a --- /dev/null +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowCall.qll @@ -0,0 +1,26 @@ +private import unified +private import AllDataFlow + +private newtype TDataFlowCall = TExplicitCall(CallExpr call) + +/** + * A call site, covering both explicit calls such as `foo(1,2)`, as well an implicit + * calls and calls derived from library models. + * + * Currently only explicit calls are implemented. + */ +class DataFlowCall extends TDataFlowCall { + /** Gets the `CallExpr` wrapped by this dataflow call, if any. */ + CallExpr asExplicitCall() { this = TExplicitCall(result) } + + /** Gets a string representation of this call. */ + string toString() { result = this.asExplicitCall().toString() } + + /** Gets the location of this call, if any. */ + Location getLocation() { result = this.asExplicitCall().getLocation() } + + /** Gets the callable containing this call. */ + DataFlowCallable getEnclosingCallable() { + result.asSourceCallable() = this.asExplicitCall().getEnclosingCallable() + } +} diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowCallable.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowCallable.qll new file mode 100644 index 000000000000..40f6934ebae7 --- /dev/null +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowCallable.qll @@ -0,0 +1,21 @@ +private import unified +private import AllDataFlow + +private newtype TDataFlowCallable = TSourceCallable(Callable callable) + +/** + * A callable entity, either an function-like entity in the source code, + * an entity derived from a library model. + * + * Currently only callables in source code are implemented. + */ +class DataFlowCallable extends TDataFlowCallable { + /** Gets the `Callable` wrapped by this dataflow callable, if any. */ + Callable asSourceCallable() { this = TSourceCallable(result) } + + /** Gets a string representation of this call. */ + string toString() { result = this.asSourceCallable().toString() } + + /** Gets the location of this call, if any. */ + Location getLocation() { result = this.asSourceCallable().getLocation() } +} diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll index 6642e78d2558..2a299b28ed0c 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll @@ -43,21 +43,17 @@ module DataFlowInput implements InputSig { class ReturnKind = Unit; import ParameterPositions - // // Calls and callables // - class DataFlowCall extends Void { - Location getLocation() { none() } // TODO - - DataFlowCallable getEnclosingCallable() { none() } // TODO - } - - class DataFlowCallable = Callable; // TODO: Use newtype + import DataFlowCall + import DataFlowCallable DataFlowCallable viableCallable(DataFlowCall c) { none() } // TODO - DataFlowCallable nodeGetEnclosingCallable(Node node) { result = node.getEnclosingCallable() } + DataFlowCallable nodeGetEnclosingCallable(Node node) { + result.asSourceCallable() = node.getEnclosingCallable() + } predicate isParameterNode(ParameterNode p, DataFlowCallable c, ParameterPosition pos) { none() // TODO From 80f557ad66fdbd0eb80af3089979ee09da11c77d Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 17 Sep 2026 15:15:46 +0200 Subject: [PATCH 1144/2098] unified: ParameterNode, ArgumentNode, OutNode --- .../lib/codeql/unified/internal/FacadeAst.qll | 29 ++++++++++ .../dataflow/DataFlowInstantiation.qll | 54 ++++++++++++++----- 2 files changed, 69 insertions(+), 14 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll index 337bc0fecd67..31b3ec3d950d 100644 --- a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll +++ b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll @@ -117,6 +117,19 @@ module Unified { class Argument extends G::Argument { /** Gets the name of this argument. */ string getName() { result = this.getNameNode().getValue() } + + /** Holds if this is a positional argument. */ + predicate isPositional() { not exists(this.getName()) } + + /** Gets the 0-based index of this argument among the positional arguments in the surrounding call or tuple. */ + int getPositionalIndex() { + this = + rank[result + 1](Argument a | + a.getParent() = this.getParent() and a.isPositional() + | + a order by a.getParentIndex() + ) + } } class AssociatedTypeDeclaration extends G::AssociatedTypeDeclaration { @@ -178,6 +191,22 @@ module Unified { * Has no result for pseudo-names like `_` that indicate that this is actually a positional parameter. */ string getExternalName() { result = this.getExternalNameNode().getValue() and not result = "_" } + + /** Gets the callable on which this parameter appears. */ + Callable getDeclaringCallable() { result = this.getParent() } + + /** Holds if this is a positional parameter. */ + predicate isPositional() { not exists(this.getExternalName()) } + + /** Gets the 0-based index of this parameter among the positional parameters of the declaring callable. */ + int getPositionalIndex() { + this = + rank[result + 1](Parameter p | + p.getDeclaringCallable() = this.getDeclaringCallable() and p.isPositional() + | + p order by p.getParentIndex() + ) + } } class TypeAliasDeclaration extends G::TypeAliasDeclaration { diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll index 2a299b28ed0c..86fdc29d263f 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll @@ -22,22 +22,14 @@ module DataFlowInput implements InputSig { // // Parameter, argument, return, and out nodes and their positions/kinds // - class ParameterNode extends Node { - ParameterNode() { none() } // TODO - } - - class ArgumentNode extends Node { - ArgumentNode() { none() } // TODO - } - class ReturnNode extends Node { - ReturnNode() { none() } // TODO + ReturnNode() { this.asExpr() = any(ReturnExpr r).getValue() } - ReturnKind getKind() { none() } // TODO + ReturnKind getKind() { exists(result) } } class OutNode extends Node { - OutNode() { none() } // TODO + OutNode() { this.asExpr() instanceof CallExpr } } class ReturnKind = Unit; @@ -55,15 +47,49 @@ module DataFlowInput implements InputSig { result.asSourceCallable() = node.getEnclosingCallable() } + private predicate isParameterNodeImpl(Node p, DataFlowCallable c, ParameterPosition pos) { + exists(Parameter param | + p.asExpr() = param.getPattern() and + c.asSourceCallable() = param.getEnclosingCallable() + | + pos.asPositional() = param.getPositionalIndex() + or + pos.asNamed() = param.getExternalName() + ) + } + + class ParameterNode extends Node { + ParameterNode() { isParameterNodeImpl(this, _, _) } + } + predicate isParameterNode(ParameterNode p, DataFlowCallable c, ParameterPosition pos) { - none() // TODO + // This predicate is needed to implement the signature without empty recursion through ParameterNode + isParameterNodeImpl(p, c, pos) + } + + private predicate isArgumentNodeImpl(Node n, DataFlowCall call, ArgumentPosition pos) { + exists(Argument arg | + n.asExpr() = arg.getValue() and + call.asExplicitCall().getAnArgument() = arg + | + pos.asPositional() = arg.getPositionalIndex() + or + pos.asNamed() = arg.getName() + ) + } + + class ArgumentNode extends Node { + ArgumentNode() { isArgumentNodeImpl(this, _, _) } } predicate isArgumentNode(ArgumentNode n, DataFlowCall call, ArgumentPosition pos) { - none() // TODO + // This predicate is needed to implement the signature without empty recursion through ArgumentNode + isArgumentNodeImpl(n, call, pos) } - OutNode getAnOutNode(DataFlowCall call, ReturnKind kind) { none() } // TODO + OutNode getAnOutNode(DataFlowCall call, ReturnKind kind) { + result.asExpr() = call.asExplicitCall() and exists(kind) + } // // Post-update nodes From 03952320432a59d810b50d5ce4217131589298b8 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 17 Sep 2026 15:48:32 +0200 Subject: [PATCH 1145/2098] unified: Add basic call graph --- .../unified/internal/dataflow/AllDataFlow.qll | 1 + .../unified/internal/dataflow/CallGraph.qll | 16 ++++++++++++++++ .../internal/dataflow/DataFlowInstantiation.qll | 3 +-- 3 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 unified/ql/lib/codeql/unified/internal/dataflow/CallGraph.qll diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/AllDataFlow.qll b/unified/ql/lib/codeql/unified/internal/dataflow/AllDataFlow.qll index f7b3ea5624ef..0d44eea6cb1e 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/AllDataFlow.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/AllDataFlow.qll @@ -1,5 +1,6 @@ /** Re-exports all the files in the internal dataflow folder (except DataFlowPublic). */ +import CallGraph import Content import DataFlowCall import DataFlowCallable diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/CallGraph.qll b/unified/ql/lib/codeql/unified/internal/dataflow/CallGraph.qll new file mode 100644 index 000000000000..226e2f15d93b --- /dev/null +++ b/unified/ql/lib/codeql/unified/internal/dataflow/CallGraph.qll @@ -0,0 +1,16 @@ +private import unified +private import AllDataFlow +private import codeql.unified.internal.NameBinding as N + +private Callable getCallableFromNameBinding(NameBinding binding) { + binding = result.(FunctionDeclaration).getNameNode() +} + +DataFlowCallable viableCallable(DataFlowCall c) { + exists(CallExpr call, Callable callable, NameBinding target | + c.asExplicitCall() = call and + target = N::getStaticBindingTarget(N::getIdentifierFromRef(call.getCallee())) and + callable = getCallableFromNameBinding(target) and + result.asSourceCallable() = callable + ) +} diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll index 86fdc29d263f..450d47dab638 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll @@ -40,8 +40,7 @@ module DataFlowInput implements InputSig { // import DataFlowCall import DataFlowCallable - - DataFlowCallable viableCallable(DataFlowCall c) { none() } // TODO + import CallGraph DataFlowCallable nodeGetEnclosingCallable(Node node) { result.asSourceCallable() = node.getEnclosingCallable() From 9da74ef078408632015f98c086d2719d74efbd62 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 17 Sep 2026 17:19:11 +0200 Subject: [PATCH 1146/2098] unified: Fix CFG node associated with parameter assignment --- .../internal/dataflow/DataFlowNode.qll | 17 +++++-- .../test/library-tests/dataflow/calls.swift | 14 +++--- .../test/library-tests/dataflow/test.expected | 45 +++++++++++++++++++ 3 files changed, 66 insertions(+), 10 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll index 09cf4b9f4606..d4a974c37fc0 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll @@ -3,9 +3,20 @@ private import AllDataFlow private import codeql.unified.internal.ExprPositions private predicate hasIncomingValueAtCfgNode(Expr expr, ControlFlowNode cfgNode) { - exists(AstNode declOrAssignment | - hasIncomingValue(expr, declOrAssignment) and - cfgNode.injects(declOrAssignment) + exists(AstNode declOrAssignment | hasIncomingValue(expr, declOrAssignment) | + // In cases where the CFG node for 'expr' appears before its actual assignment, + // use the CFG node from the surrounding assignment-like node + cfgNode.injects(declOrAssignment.(Assignment)) + or + // Variable declarations are pre-order and visit the target first. + // Use the after node. + cfgNode.isAfter(declOrAssignment.(VariableDeclaration)) + or + // In other cases, it's a binding pattern whose CFG node can be used + // as its assignment time + not declOrAssignment instanceof Assignment and + not declOrAssignment instanceof VariableDeclaration and + cfgNode.injects(expr) ) } diff --git a/unified/ql/test/library-tests/dataflow/calls.swift b/unified/ql/test/library-tests/dataflow/calls.swift index b5c4ab37673b..97cf77f1839f 100644 --- a/unified/ql/test/library-tests/dataflow/calls.swift +++ b/unified/ql/test/library-tests/dataflow/calls.swift @@ -5,7 +5,7 @@ func sink(_ s: String) -> String { return "" } func t1() { func target(_ x: String) { - sink(x) // $ MISSING: hasValueFlow=t1.1 + sink(x) // $ hasValueFlow=t1.1 } target(source("t1.1")) } @@ -14,7 +14,7 @@ func t2() { func target() -> String { return source("t2.1") } - sink(target()) // $ MISSING: hasValueFlow=t2.1 + sink(target()) // $ hasValueFlow=t2.1 } func t3() { @@ -28,14 +28,14 @@ func t4() { func target(_ x: String) -> String { return x + "foo" } - sink(target(source("t4.1"))) // $ MISSING: hasTaintFlow=t4.1 - sink(target(source("t4.2"))) // $ MISSING: hasTaintFlow=t4.2 + sink(target(source("t4.1"))) // $ hasTaintFlow=t4.1 + sink(target(source("t4.2"))) // $ hasTaintFlow=t4.2 sink(target("safe")) } func t5() { func target1(name x: String) { - sink(x) // $ MISSING: hasValueFlow=t5.1 + sink(x) // $ hasValueFlow=t5.1 } target1(name: source("t5.1")) @@ -47,8 +47,8 @@ func t5() { func t6() { func target(_ x: String, _ y: String) { - sink(x) // $ MISSING: hasValueFlow=t6.1 - sink(y) // $ MISSING: hasValueFlow=t6.2 + sink(x) // $ hasValueFlow=t6.1 + sink(y) // $ hasValueFlow=t6.2 } target(source("t6.1"), source("t6.2")) } diff --git a/unified/ql/test/library-tests/dataflow/test.expected b/unified/ql/test/library-tests/dataflow/test.expected index 42b2766426e6..6359138cf381 100644 --- a/unified/ql/test/library-tests/dataflow/test.expected +++ b/unified/ql/test/library-tests/dataflow/test.expected @@ -1,5 +1,20 @@ models edges +| calls.swift:7:19:7:19 | x | calls.swift:8:14:8:14 | x | provenance | | +| calls.swift:10:12:10:25 | source(...) | calls.swift:7:19:7:19 | x | provenance | | +| calls.swift:15:16:15:29 | source(...) | calls.swift:17:10:17:17 | target(...) | provenance | | +| calls.swift:28:19:28:19 | x | calls.swift:29:16:29:16 | x | provenance | | +| calls.swift:29:16:29:16 | x | calls.swift:29:16:29:24 | ... + ... | provenance | | +| calls.swift:31:17:31:30 | source(...) | calls.swift:28:19:28:19 | x | provenance | | +| calls.swift:31:17:31:30 | source(...) | calls.swift:31:10:31:31 | target(...) | provenance | | +| calls.swift:32:17:32:30 | source(...) | calls.swift:28:19:28:19 | x | provenance | | +| calls.swift:32:17:32:30 | source(...) | calls.swift:32:10:32:31 | target(...) | provenance | | +| calls.swift:37:23:37:23 | x | calls.swift:38:14:38:14 | x | provenance | | +| calls.swift:40:13:40:32 | source(...) | calls.swift:37:23:37:23 | x | provenance | | +| calls.swift:49:19:49:19 | x | calls.swift:50:14:50:14 | x | provenance | | +| calls.swift:49:32:49:32 | y | calls.swift:51:14:51:14 | y | provenance | | +| calls.swift:53:12:53:26 | source(...) | calls.swift:49:19:49:19 | x | provenance | | +| calls.swift:53:28:53:41 | source(...) | calls.swift:49:32:49:32 | y | provenance | | | implicit-self.swift:16:9:16:12 | [post] self [x] | implicit-self.swift:17:14:17:17 | self [x] | provenance | | | implicit-self.swift:16:9:16:14 | ... .x | implicit-self.swift:16:9:16:12 | [post] self [x] | provenance | | | implicit-self.swift:16:18:16:31 | source(...) | implicit-self.swift:16:9:16:14 | ... .x | provenance | | @@ -141,6 +156,27 @@ edges | test.swift:175:42:175:66 | ... + ... | test.swift:175:14:175:67 | TupleExpr [1] | provenance | | | test.swift:175:52:175:66 | source(...) | test.swift:175:42:175:66 | ... + ... | provenance | | nodes +| calls.swift:7:19:7:19 | x | semmle.label | x | +| calls.swift:8:14:8:14 | x | semmle.label | x | +| calls.swift:10:12:10:25 | source(...) | semmle.label | source(...) | +| calls.swift:15:16:15:29 | source(...) | semmle.label | source(...) | +| calls.swift:17:10:17:17 | target(...) | semmle.label | target(...) | +| calls.swift:28:19:28:19 | x | semmle.label | x | +| calls.swift:29:16:29:16 | x | semmle.label | x | +| calls.swift:29:16:29:24 | ... + ... | semmle.label | ... + ... | +| calls.swift:31:10:31:31 | target(...) | semmle.label | target(...) | +| calls.swift:31:17:31:30 | source(...) | semmle.label | source(...) | +| calls.swift:32:10:32:31 | target(...) | semmle.label | target(...) | +| calls.swift:32:17:32:30 | source(...) | semmle.label | source(...) | +| calls.swift:37:23:37:23 | x | semmle.label | x | +| calls.swift:38:14:38:14 | x | semmle.label | x | +| calls.swift:40:13:40:32 | source(...) | semmle.label | source(...) | +| calls.swift:49:19:49:19 | x | semmle.label | x | +| calls.swift:49:32:49:32 | y | semmle.label | y | +| calls.swift:50:14:50:14 | x | semmle.label | x | +| calls.swift:51:14:51:14 | y | semmle.label | y | +| calls.swift:53:12:53:26 | source(...) | semmle.label | source(...) | +| calls.swift:53:28:53:41 | source(...) | semmle.label | source(...) | | implicit-self.swift:16:9:16:12 | [post] self [x] | semmle.label | [post] self [x] | | implicit-self.swift:16:9:16:14 | ... .x | semmle.label | ... .x | | implicit-self.swift:16:18:16:31 | source(...) | semmle.label | source(...) | @@ -322,8 +358,17 @@ nodes | test.swift:176:10:176:10 | a | semmle.label | a | | test.swift:177:10:177:10 | b | semmle.label | b | subpaths +| calls.swift:31:17:31:30 | source(...) | calls.swift:28:19:28:19 | x | calls.swift:29:16:29:24 | ... + ... | calls.swift:31:10:31:31 | target(...) | +| calls.swift:32:17:32:30 | source(...) | calls.swift:28:19:28:19 | x | calls.swift:29:16:29:24 | ... + ... | calls.swift:32:10:32:31 | target(...) | testFailures #select +| calls.swift:8:14:8:14 | x | calls.swift:10:12:10:25 | source(...) | calls.swift:8:14:8:14 | x | $@ | calls.swift:10:12:10:25 | source(...) | source(...) | +| calls.swift:17:10:17:17 | target(...) | calls.swift:15:16:15:29 | source(...) | calls.swift:17:10:17:17 | target(...) | $@ | calls.swift:15:16:15:29 | source(...) | source(...) | +| calls.swift:31:10:31:31 | target(...) | calls.swift:31:17:31:30 | source(...) | calls.swift:31:10:31:31 | target(...) | $@ | calls.swift:31:17:31:30 | source(...) | source(...) | +| calls.swift:32:10:32:31 | target(...) | calls.swift:32:17:32:30 | source(...) | calls.swift:32:10:32:31 | target(...) | $@ | calls.swift:32:17:32:30 | source(...) | source(...) | +| calls.swift:38:14:38:14 | x | calls.swift:40:13:40:32 | source(...) | calls.swift:38:14:38:14 | x | $@ | calls.swift:40:13:40:32 | source(...) | source(...) | +| calls.swift:50:14:50:14 | x | calls.swift:53:12:53:26 | source(...) | calls.swift:50:14:50:14 | x | $@ | calls.swift:53:12:53:26 | source(...) | source(...) | +| calls.swift:51:14:51:14 | y | calls.swift:53:28:53:41 | source(...) | calls.swift:51:14:51:14 | y | $@ | calls.swift:53:28:53:41 | source(...) | source(...) | | implicit-self.swift:17:14:17:19 | ... .x | implicit-self.swift:16:18:16:31 | source(...) | implicit-self.swift:17:14:17:19 | ... .x | $@ | implicit-self.swift:16:18:16:31 | source(...) | source(...) | | implicit-self.swift:23:14:23:14 | x | implicit-self.swift:22:13:22:26 | source(...) | implicit-self.swift:23:14:23:14 | x | $@ | implicit-self.swift:22:13:22:26 | source(...) | source(...) | | implicit-self.swift:29:14:29:19 | ... .x | implicit-self.swift:28:13:28:26 | source(...) | implicit-self.swift:29:14:29:19 | ... .x | $@ | implicit-self.swift:28:13:28:26 | source(...) | source(...) | From f098a84b89aaa1419e5c8bba372200deb77748f3 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 18 Sep 2026 10:36:31 +0200 Subject: [PATCH 1147/2098] unified: Populate external name when parameter has only one name A parameter with only one name has that name as its internal and external parameter name. --- .../extractor/src/languages/swift/swift.rs | 33 +++++++++++-------- ...nction-with-default-parameter-value.output | 3 +- .../swift/types/class-with-initializer.output | 3 +- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/unified/extractor/src/languages/swift/swift.rs b/unified/extractor/src/languages/swift/swift.rs index 8242e37a8a3f..dbff2f878f97 100644 --- a/unified/extractor/src/languages/swift/swift.rs +++ b/unified/extractor/src/languages/swift/swift.rs @@ -596,26 +596,31 @@ fn translation_rules() -> Vec> { ), // A function parameter. With two names (`firstName`+`secondName`) the // first is the external argument label and the second the internal name; - // with one name it is just the internal name. The declared type is - // emitted; the default value is optional. + // with one name it is both the external and internal name. rule!( (functionParameter firstName: @@first - secondName: _? @@second + secondName: @@second type: @ty defaultValue: (initializerClause value: @val)?) => - parameter { - let (external, name) = match second { - Some(second) => (Some(tree!((identifier #{first}))), second), - None => (None, first), - }; - tree!((parameter - external_name_node: {external} - pattern: (identifier #{name}) - type: {ty} - default: {val})) - } + (parameter + external_name_node: (identifier #{first}) + pattern: (identifier #{second}) + type: {ty} + default: {val}) + ), + rule!( + (functionParameter + firstName: @@first + type: @ty + defaultValue: (initializerClause value: @val)?) + => + (parameter + external_name_node: (identifier #{first}) // duplicate the parameter name + pattern: (identifier #{first}) + type: {ty} + default: {val}) ), // Swift's `[T](...)` array-type constructor syntax is parsed as a call // whose callee is an `arrayExpr` containing `T`. For a generic `T`, diff --git a/unified/extractor/tests/corpus/swift/functions/function-with-default-parameter-value.output b/unified/extractor/tests/corpus/swift/functions/function-with-default-parameter-value.output index 65da7fc5c00f..e4a29f540ab9 100644 --- a/unified/extractor/tests/corpus/swift/functions/function-with-default-parameter-value.output +++ b/unified/extractor/tests/corpus/swift/functions/function-with-default-parameter-value.output @@ -68,7 +68,8 @@ top_level source="⟨body⟩" function_declaration source="⟨body⟩⟨name_node⟩⟨parameter⟩" name_node: identifier "greet" source="greet" parameter: - parameter source="⟨pattern⟩: ⟨type⟩ = ⟨default⟩" + parameter source="⟨external_name_node⟩⟨pattern⟩: ⟨type⟩ = ⟨default⟩" + external_name_node: identifier "name" source="name" type: identifier "String" source="String" pattern: identifier "name" source="name" default: string_literal "\"world\"" source="\"world\"" diff --git a/unified/extractor/tests/corpus/swift/types/class-with-initializer.output b/unified/extractor/tests/corpus/swift/types/class-with-initializer.output index f5e85a979d67..19466f4989e8 100644 --- a/unified/extractor/tests/corpus/swift/types/class-with-initializer.output +++ b/unified/extractor/tests/corpus/swift/types/class-with-initializer.output @@ -100,7 +100,8 @@ top_level source="⟨body⟩" type: identifier "Int" source="Int" constructor_declaration source="⟨body⟩⟨parameter⟩" parameter: - parameter source="⟨pattern⟩: ⟨type⟩" + parameter source="⟨external_name_node⟩⟨pattern⟩: ⟨type⟩" + external_name_node: identifier "x" source="x" type: identifier "Int" source="Int" pattern: identifier "x" source="x" body: From 43aa59f0b65db516d89fda5b330a77ead8aac4b8 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 18 Sep 2026 10:36:49 +0200 Subject: [PATCH 1148/2098] unified: Update data flow test output --- unified/ql/test/library-tests/dataflow/calls.swift | 4 ++-- unified/ql/test/library-tests/dataflow/test.expected | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/unified/ql/test/library-tests/dataflow/calls.swift b/unified/ql/test/library-tests/dataflow/calls.swift index 97cf77f1839f..24f0c119aadf 100644 --- a/unified/ql/test/library-tests/dataflow/calls.swift +++ b/unified/ql/test/library-tests/dataflow/calls.swift @@ -19,7 +19,7 @@ func t2() { func t3() { func target(x: String) { - sink(x) // $ MISSING: hasValueFlow=t3.1 + sink(x) // $ hasValueFlow=t3.1 } target(x: source("t3.1")) } @@ -40,7 +40,7 @@ func t5() { target1(name: source("t5.1")) func target2(name: String) { - sink(name) // $ MISSING: hasValueFlow=t5.2 + sink(name) // $ hasValueFlow=t5.2 } target2(name: source("t5.2")) } diff --git a/unified/ql/test/library-tests/dataflow/test.expected b/unified/ql/test/library-tests/dataflow/test.expected index 6359138cf381..9363e6176763 100644 --- a/unified/ql/test/library-tests/dataflow/test.expected +++ b/unified/ql/test/library-tests/dataflow/test.expected @@ -3,6 +3,8 @@ edges | calls.swift:7:19:7:19 | x | calls.swift:8:14:8:14 | x | provenance | | | calls.swift:10:12:10:25 | source(...) | calls.swift:7:19:7:19 | x | provenance | | | calls.swift:15:16:15:29 | source(...) | calls.swift:17:10:17:17 | target(...) | provenance | | +| calls.swift:21:17:21:17 | x | calls.swift:22:14:22:14 | x | provenance | | +| calls.swift:24:12:24:28 | source(...) | calls.swift:21:17:21:17 | x | provenance | | | calls.swift:28:19:28:19 | x | calls.swift:29:16:29:16 | x | provenance | | | calls.swift:29:16:29:16 | x | calls.swift:29:16:29:24 | ... + ... | provenance | | | calls.swift:31:17:31:30 | source(...) | calls.swift:28:19:28:19 | x | provenance | | @@ -11,6 +13,8 @@ edges | calls.swift:32:17:32:30 | source(...) | calls.swift:32:10:32:31 | target(...) | provenance | | | calls.swift:37:23:37:23 | x | calls.swift:38:14:38:14 | x | provenance | | | calls.swift:40:13:40:32 | source(...) | calls.swift:37:23:37:23 | x | provenance | | +| calls.swift:42:18:42:21 | name | calls.swift:43:14:43:17 | name | provenance | | +| calls.swift:45:13:45:32 | source(...) | calls.swift:42:18:42:21 | name | provenance | | | calls.swift:49:19:49:19 | x | calls.swift:50:14:50:14 | x | provenance | | | calls.swift:49:32:49:32 | y | calls.swift:51:14:51:14 | y | provenance | | | calls.swift:53:12:53:26 | source(...) | calls.swift:49:19:49:19 | x | provenance | | @@ -161,6 +165,9 @@ nodes | calls.swift:10:12:10:25 | source(...) | semmle.label | source(...) | | calls.swift:15:16:15:29 | source(...) | semmle.label | source(...) | | calls.swift:17:10:17:17 | target(...) | semmle.label | target(...) | +| calls.swift:21:17:21:17 | x | semmle.label | x | +| calls.swift:22:14:22:14 | x | semmle.label | x | +| calls.swift:24:12:24:28 | source(...) | semmle.label | source(...) | | calls.swift:28:19:28:19 | x | semmle.label | x | | calls.swift:29:16:29:16 | x | semmle.label | x | | calls.swift:29:16:29:24 | ... + ... | semmle.label | ... + ... | @@ -171,6 +178,9 @@ nodes | calls.swift:37:23:37:23 | x | semmle.label | x | | calls.swift:38:14:38:14 | x | semmle.label | x | | calls.swift:40:13:40:32 | source(...) | semmle.label | source(...) | +| calls.swift:42:18:42:21 | name | semmle.label | name | +| calls.swift:43:14:43:17 | name | semmle.label | name | +| calls.swift:45:13:45:32 | source(...) | semmle.label | source(...) | | calls.swift:49:19:49:19 | x | semmle.label | x | | calls.swift:49:32:49:32 | y | semmle.label | y | | calls.swift:50:14:50:14 | x | semmle.label | x | @@ -364,9 +374,11 @@ testFailures #select | calls.swift:8:14:8:14 | x | calls.swift:10:12:10:25 | source(...) | calls.swift:8:14:8:14 | x | $@ | calls.swift:10:12:10:25 | source(...) | source(...) | | calls.swift:17:10:17:17 | target(...) | calls.swift:15:16:15:29 | source(...) | calls.swift:17:10:17:17 | target(...) | $@ | calls.swift:15:16:15:29 | source(...) | source(...) | +| calls.swift:22:14:22:14 | x | calls.swift:24:12:24:28 | source(...) | calls.swift:22:14:22:14 | x | $@ | calls.swift:24:12:24:28 | source(...) | source(...) | | calls.swift:31:10:31:31 | target(...) | calls.swift:31:17:31:30 | source(...) | calls.swift:31:10:31:31 | target(...) | $@ | calls.swift:31:17:31:30 | source(...) | source(...) | | calls.swift:32:10:32:31 | target(...) | calls.swift:32:17:32:30 | source(...) | calls.swift:32:10:32:31 | target(...) | $@ | calls.swift:32:17:32:30 | source(...) | source(...) | | calls.swift:38:14:38:14 | x | calls.swift:40:13:40:32 | source(...) | calls.swift:38:14:38:14 | x | $@ | calls.swift:40:13:40:32 | source(...) | source(...) | +| calls.swift:43:14:43:17 | name | calls.swift:45:13:45:32 | source(...) | calls.swift:43:14:43:17 | name | $@ | calls.swift:45:13:45:32 | source(...) | source(...) | | calls.swift:50:14:50:14 | x | calls.swift:53:12:53:26 | source(...) | calls.swift:50:14:50:14 | x | $@ | calls.swift:53:12:53:26 | source(...) | source(...) | | calls.swift:51:14:51:14 | y | calls.swift:53:28:53:41 | source(...) | calls.swift:51:14:51:14 | y | $@ | calls.swift:53:28:53:41 | source(...) | source(...) | | implicit-self.swift:17:14:17:19 | ... .x | implicit-self.swift:16:18:16:31 | source(...) | implicit-self.swift:17:14:17:19 | ... .x | $@ | implicit-self.swift:16:18:16:31 | source(...) | source(...) | From 6aca7224d282e2de5a356d05b5564435d03a4753 Mon Sep 17 00:00:00 2001 From: Asger F Date: Sat, 19 Sep 2026 10:08:14 +0200 Subject: [PATCH 1149/2098] unified: Update BasicTest output after duplicating parameter name --- unified/ql/test/library-tests/BasicTest/test.expected | 1 + 1 file changed, 1 insertion(+) diff --git a/unified/ql/test/library-tests/BasicTest/test.expected b/unified/ql/test/library-tests/BasicTest/test.expected index 5f8e2a323ad2..0b5b75967b3b 100644 --- a/unified/ql/test/library-tests/BasicTest/test.expected +++ b/unified/ql/test/library-tests/BasicTest/test.expected @@ -141,6 +141,7 @@ identifier | test.swift:85:27:85:29 | Array | Array | | test.swift:85:28:85:28 | T | T | | test.swift:85:32:85:40 | transform | transform | +| test.swift:85:32:85:40 | transform | transform | | test.swift:85:44:85:44 | T | T | | test.swift:85:47:85:47 | T | T | | test.swift:85:53:85:53 | T | T | From 76c39b69e182473bc1770e55a292a02e5d229066 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 18 Sep 2026 11:12:21 +0200 Subject: [PATCH 1150/2098] unified: Insert post-updates for call arguments --- .../unified/internal/dataflow/DataFlowNode.qll | 6 ++++++ .../codeql/unified/internal/dataflow/LocalSsa.qll | 3 ++- unified/ql/test/library-tests/dataflow/calls.swift | 2 +- .../ql/test/library-tests/dataflow/test.expected | 14 ++++++++++++++ 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll index d4a974c37fc0..ec7f1f58d725 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll @@ -25,6 +25,12 @@ private predicate hasPostUpdate(Expr expr, ControlFlowNode cfgNode) { (hasIncomingValueAtCfgNode(member, cfgNode) or hasPostUpdate(member, cfgNode)) and expr = member.getBase() ) + or + exists(CallExpr call | cfgNode.isAfter(call) | + expr = call.getAnArgument().getValue() + or + expr = call.getCallee().(MemberAccessExpr).getBase() + ) } /** diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll b/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll index 96c90fbb47ed..6c5bd125db72 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll @@ -42,7 +42,8 @@ module LocalSsaDataFlowInput implements DataFlowIntegrationInputSig { predicate hasCfgNode(BasicBlock bb, int i) { exists(U::Expr expr, LocalVariable var, VariableRefKind kind | this = TLocalVariableRefNode(expr, var, kind) and - kind.isRead() and + // Note: the synthetic read we insert for post-updates must also have an Expr + (kind.isRead() or kind.isPostUpdate()) and performsVariableAccess(expr, var, kind, bb.getNode(i)) ) } diff --git a/unified/ql/test/library-tests/dataflow/calls.swift b/unified/ql/test/library-tests/dataflow/calls.swift index 24f0c119aadf..99272319acb8 100644 --- a/unified/ql/test/library-tests/dataflow/calls.swift +++ b/unified/ql/test/library-tests/dataflow/calls.swift @@ -64,5 +64,5 @@ func t7() { let b = Box() sink(b.field) // no flow target(b) - sink(b.field) // $ MISSING: hasValueFlow=t7.1 + sink(b.field) // $ hasValueFlow=t7.1 } diff --git a/unified/ql/test/library-tests/dataflow/test.expected b/unified/ql/test/library-tests/dataflow/test.expected index 9363e6176763..545cd611a543 100644 --- a/unified/ql/test/library-tests/dataflow/test.expected +++ b/unified/ql/test/library-tests/dataflow/test.expected @@ -19,6 +19,12 @@ edges | calls.swift:49:32:49:32 | y | calls.swift:51:14:51:14 | y | provenance | | | calls.swift:53:12:53:26 | source(...) | calls.swift:49:19:49:19 | x | provenance | | | calls.swift:53:28:53:41 | source(...) | calls.swift:49:32:49:32 | y | provenance | | +| calls.swift:61:19:61:19 | x [Return] [field] | calls.swift:66:12:66:12 | [post] b [field] | provenance | | +| calls.swift:62:9:62:9 | [post] x [field] | calls.swift:61:19:61:19 | x [Return] [field] | provenance | | +| calls.swift:62:9:62:15 | ... .field | calls.swift:62:9:62:9 | [post] x [field] | provenance | | +| calls.swift:62:19:62:32 | source(...) | calls.swift:62:9:62:15 | ... .field | provenance | | +| calls.swift:66:12:66:12 | [post] b [field] | calls.swift:67:10:67:10 | b [field] | provenance | | +| calls.swift:67:10:67:10 | b [field] | calls.swift:67:10:67:16 | ... .field | provenance | | | implicit-self.swift:16:9:16:12 | [post] self [x] | implicit-self.swift:17:14:17:17 | self [x] | provenance | | | implicit-self.swift:16:9:16:14 | ... .x | implicit-self.swift:16:9:16:12 | [post] self [x] | provenance | | | implicit-self.swift:16:18:16:31 | source(...) | implicit-self.swift:16:9:16:14 | ... .x | provenance | | @@ -187,6 +193,13 @@ nodes | calls.swift:51:14:51:14 | y | semmle.label | y | | calls.swift:53:12:53:26 | source(...) | semmle.label | source(...) | | calls.swift:53:28:53:41 | source(...) | semmle.label | source(...) | +| calls.swift:61:19:61:19 | x [Return] [field] | semmle.label | x [Return] [field] | +| calls.swift:62:9:62:9 | [post] x [field] | semmle.label | [post] x [field] | +| calls.swift:62:9:62:15 | ... .field | semmle.label | ... .field | +| calls.swift:62:19:62:32 | source(...) | semmle.label | source(...) | +| calls.swift:66:12:66:12 | [post] b [field] | semmle.label | [post] b [field] | +| calls.swift:67:10:67:10 | b [field] | semmle.label | b [field] | +| calls.swift:67:10:67:16 | ... .field | semmle.label | ... .field | | implicit-self.swift:16:9:16:12 | [post] self [x] | semmle.label | [post] self [x] | | implicit-self.swift:16:9:16:14 | ... .x | semmle.label | ... .x | | implicit-self.swift:16:18:16:31 | source(...) | semmle.label | source(...) | @@ -381,6 +394,7 @@ testFailures | calls.swift:43:14:43:17 | name | calls.swift:45:13:45:32 | source(...) | calls.swift:43:14:43:17 | name | $@ | calls.swift:45:13:45:32 | source(...) | source(...) | | calls.swift:50:14:50:14 | x | calls.swift:53:12:53:26 | source(...) | calls.swift:50:14:50:14 | x | $@ | calls.swift:53:12:53:26 | source(...) | source(...) | | calls.swift:51:14:51:14 | y | calls.swift:53:28:53:41 | source(...) | calls.swift:51:14:51:14 | y | $@ | calls.swift:53:28:53:41 | source(...) | source(...) | +| calls.swift:67:10:67:16 | ... .field | calls.swift:62:19:62:32 | source(...) | calls.swift:67:10:67:16 | ... .field | $@ | calls.swift:62:19:62:32 | source(...) | source(...) | | implicit-self.swift:17:14:17:19 | ... .x | implicit-self.swift:16:18:16:31 | source(...) | implicit-self.swift:17:14:17:19 | ... .x | $@ | implicit-self.swift:16:18:16:31 | source(...) | source(...) | | implicit-self.swift:23:14:23:14 | x | implicit-self.swift:22:13:22:26 | source(...) | implicit-self.swift:23:14:23:14 | x | $@ | implicit-self.swift:22:13:22:26 | source(...) | source(...) | | implicit-self.swift:29:14:29:19 | ... .x | implicit-self.swift:28:13:28:26 | source(...) | implicit-self.swift:29:14:29:19 | ... .x | $@ | implicit-self.swift:28:13:28:26 | source(...) | source(...) | From f4f7e69115bac8be200eacf7fee97c3e7a3af5c0 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 18 Sep 2026 13:36:32 +0200 Subject: [PATCH 1151/2098] unified: Avoid stepping into post-update nodes The previous commit resulted in data-flow consistency errors due to having local flow into a post-update node (for good reason). We now skip over the synthetic read node in use-use flow, so the use-use flow is not seen as a mutation of a variable. --- .../unified/internal/dataflow/LocalSsa.qll | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll b/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll index 6c5bd125db72..3aac1f7b7968 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll @@ -75,10 +75,21 @@ module LocalSsaDataFlowOutput = DataFlowIntegration; private module Ssa = LocalSsaDataFlowOutput; +/** + * Holds if `node` represents the synthetic read we use to represent a post-update node. + * + * We want to skip use-use flow through such a node, as we don't want use-use ordinary flow + * targeting a post-update node. + */ +private predicate postUpdateReadNode(Ssa::Node node) { + node.(Ssa::ExprNode).getExpr() = TLocalVariableRefNode(_, _, TPostUpdate()) +} + Node getNodeFromLocalSsaNode(Ssa::Node n) { result = TLocalSsaNode(n) or - result = n.(Ssa::ExprNode).getExpr() + result = n.(Ssa::ExprNode).getExpr() and + not postUpdateReadNode(n) or result = getPostUpdateNode(n.(Ssa::ExprPostUpdateNode).getExpr()) or @@ -89,9 +100,29 @@ Node getNodeFromLocalSsaNode(Ssa::Node n) { ) } +/** + * Holds if there is use-use flow from `node1`, through one or most post-update reads, into `node2`. + */ +predicate skipPostUpdateRead(Ssa::Node node1, Ssa::Node node2) { + Ssa::localFlowStep(_, node1, node2, true) and + postUpdateReadNode(node2) + or + exists(Ssa::Node mid | + skipPostUpdateRead(node1, mid) and + postUpdateReadNode(mid) and + Ssa::localFlowStep(_, mid, node2, _) + ) +} + predicate localSsaStep(Node node1, Node node2, boolean isUseStep) { exists(Ssa::Node ssa1, Ssa::Node ssa2 | - Ssa::localFlowStep(_, ssa1, ssa2, isUseStep) and + ( + Ssa::localFlowStep(_, ssa1, ssa2, isUseStep) + or + skipPostUpdateRead(ssa1, ssa2) and + isUseStep = true + ) and + not postUpdateReadNode(ssa2) and node1 = getNodeFromLocalSsaNode(ssa1) and node2 = getNodeFromLocalSsaNode(ssa2) ) From 4ebd5f7ebee6b2376acb14a907f5e24e162c4d85 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 18 Sep 2026 09:35:03 +0200 Subject: [PATCH 1152/2098] unified: Add call graph stats --- .../unified/internal/AnalysisQuality.qll | 19 +++++++++++++++++++ unified/ql/src/diagnostic/CallGraph.ql | 17 +++++++++++++++++ .../ql/src/diagnostic/ExtractorInformation.ql | 3 ++- 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 unified/ql/src/diagnostic/CallGraph.ql diff --git a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll index d5eb5071176e..d6165688e3dc 100644 --- a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll +++ b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll @@ -1,6 +1,9 @@ private import unified private import codeql.util.ReportStats private import codeql.unified.internal.NameBinding +private import codeql.unified.internal.dataflow.DataFlowCall +private import codeql.unified.internal.dataflow.DataFlowCallable +private import codeql.unified.internal.dataflow.CallGraph /** Stats about name nodes that static name binding could resolve. */ module StaticNameResolutionStats implements EntityStatsSig { @@ -87,3 +90,19 @@ module FilesCoveredByModuleManifestStats implements EntityStatsSig { module FilesCoveredByModuleManifestStatsReport = EntityReportStats; + +module CallGraphStats implements EntityStatsSig { + class Candidate extends CallExpr { + DataFlowCall getDataFlowCall() { result.asExplicitCall() = this } + + DataFlowCallable getTarget() { result = viableCallable(this.getDataFlowCall()) } + + predicate isOk() { exists(this.getTarget()) } + } + + string getOkText() { result = "calls with call target" } + + string getNotOkText() { result = "calls with missing call target" } +} + +module CallGraphStatsReport = EntityReportStats; diff --git a/unified/ql/src/diagnostic/CallGraph.ql b/unified/ql/src/diagnostic/CallGraph.ql new file mode 100644 index 000000000000..96477bffe193 --- /dev/null +++ b/unified/ql/src/diagnostic/CallGraph.ql @@ -0,0 +1,17 @@ +/** + * @name Call graph + * @description Calls that could be resolved to a target callable + * @kind problem + * @problem.severity recommendation + * @id unified/diagnostic/call-graph + * @tags meta + * @precision very-low + */ + +import unified +import codeql.unified.internal.dataflow.DataFlowCallable +import codeql.unified.internal.AnalysisQuality + +from CallGraphStats::Candidate c, DataFlowCallable target +where target = c.getTarget() +select c, "Call to $@.", target, target.toString() diff --git a/unified/ql/src/diagnostic/ExtractorInformation.ql b/unified/ql/src/diagnostic/ExtractorInformation.ql index 6e52b4fa0887..3fc0634b3344 100644 --- a/unified/ql/src/diagnostic/ExtractorInformation.ql +++ b/unified/ql/src/diagnostic/ExtractorInformation.ql @@ -41,7 +41,8 @@ where numberOfLinesOfCode(key, value) or numberOfLinesOfCodeByExtension(key, value) or StaticNameResolutionStatsReport::keyValuePair(key, value) or - FilesCoveredByModuleManifestStatsReport::keyValuePair(key, value) + FilesCoveredByModuleManifestStatsReport::keyValuePair(key, value) or + CallGraphStatsReport::keyValuePair(key, value) ) and /* Infinity */ value != 1.0 / 0.0 and From a9340a80c3d2e50c7664fa0aa973b1ae2bca6ba7 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 17 Sep 2026 15:16:43 +0200 Subject: [PATCH 1153/2098] unified: Add canonical receiver parameter --- .../dataflow/DataFlowInstantiation.qll | 2 ++ .../internal/dataflow/DataFlowNode.qll | 35 ++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll index 450d47dab638..56aa5ae782e6 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll @@ -44,6 +44,8 @@ module DataFlowInput implements InputSig { DataFlowCallable nodeGetEnclosingCallable(Node node) { result.asSourceCallable() = node.getEnclosingCallable() + or + node.isReceiverParameterEx(result) } private predicate isParameterNodeImpl(Node p, DataFlowCallable c, ParameterPosition pos) { diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll index ec7f1f58d725..8795f4adcfda 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll @@ -64,7 +64,8 @@ newtype TDataFlowNode = TLocalVariableRefNode(Expr expr, LocalVariable var, VariableRefKind kind) { performsVariableAccess(expr, var, kind, _) } or - TLocalSsaNode(LocalSsaDataFlowOutput::SsaNode node) + TLocalSsaNode(LocalSsaDataFlowOutput::SsaNode node) or + TReceiverParameterNode(DataFlowCallable callable) /** * A node representing something that can have a value. @@ -108,6 +109,26 @@ class Node extends TDataFlowNode { /** Holds if this represents the updated state of the value returned by `expr` after it has been mutated by the surrounding assignment or call. */ predicate isPostUpdate(Expr expr) { this = TExprPostUpdateNode(expr) } + /** + * Holds if this represents the receiver passed to the given callable. + * + * Note that for non-methods and closures that capture the receiver from the enclosing method, + * this node still exists but will typically not flow anywhere. + */ + predicate isReceiverParameter(Callable callable) { + this.isReceiverParameterEx(any(DataFlowCallable c | c.asSourceCallable() = callable)) + } + + /** + * Holds if this represents the receiver passed to the given callable. + * + * Note that for non-methods and closures that capture the receiver from the enclosing method, + * this node still exists but will typically not flow anywhere. + */ + predicate isReceiverParameterEx(DataFlowCallable callable) { + this = TReceiverParameterNode(callable) + } + /** Gets the expression represented by this node. */ Expr asExpr() { this = TValueNode(result) } @@ -142,6 +163,11 @@ class Node extends TDataFlowNode { this = TLocalSsaNode(node) and result = node.toString() ) + or + exists(DataFlowCallable callable | + this.isReceiverParameterEx(callable) and + result = "[receiver] " + callable.toString() + ) } /** Gets the location of this data flow node. */ @@ -152,6 +178,11 @@ class Node extends TDataFlowNode { this = TLocalSsaNode(node) and result = node.getLocation() ) + or + exists(DataFlowCallable callable | + this.isReceiverParameterEx(callable) and + result = callable.getLocation() + ) } /** Gets the callable containing this data flow node. */ @@ -162,6 +193,8 @@ class Node extends TDataFlowNode { this = TLocalSsaNode(node) and result = node.getSourceVariable().getDeclaringCallable() ) + or + this.isReceiverParameter(result) } } From e1326fd64d63694efad9c440541b851f383f2ef0 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 18 Sep 2026 11:25:17 +0200 Subject: [PATCH 1154/2098] unified: Also add getEnclosingCallableEx --- .../internal/dataflow/DataFlowInstantiation.qll | 6 +----- .../unified/internal/dataflow/DataFlowNode.qll | 14 +++++++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll index 56aa5ae782e6..243d3914f853 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll @@ -42,11 +42,7 @@ module DataFlowInput implements InputSig { import DataFlowCallable import CallGraph - DataFlowCallable nodeGetEnclosingCallable(Node node) { - result.asSourceCallable() = node.getEnclosingCallable() - or - node.isReceiverParameterEx(result) - } + DataFlowCallable nodeGetEnclosingCallable(Node node) { result = node.getEnclosingCallableEx() } private predicate isParameterNodeImpl(Node p, DataFlowCallable c, ParameterPosition pos) { exists(Parameter param | diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll index 8795f4adcfda..bdcee71d54fd 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll @@ -185,17 +185,21 @@ class Node extends TDataFlowNode { ) } - /** Gets the callable containing this data flow node. */ - Callable getEnclosingCallable() { - result = this.getWrappedAstNode().getEnclosingCallable() + /** Gets the data-flow callable containing this data flow node. */ + DataFlowCallable getEnclosingCallableEx() { + result.asSourceCallable() = this.getWrappedAstNode().getEnclosingCallable() or exists(LocalSsaDataFlowOutput::SsaNode node | this = TLocalSsaNode(node) and - result = node.getSourceVariable().getDeclaringCallable() + result.asSourceCallable() = node.getSourceVariable().getDeclaringCallable() ) or - this.isReceiverParameter(result) + this.isReceiverParameterEx(result) + ) } + + /** Gets the callable containing this data flow node. */ + Callable getEnclosingCallable() { result = this.getEnclosingCallableEx().asSourceCallable() } } Node getPostUpdateNode(Node pre) { From 82ed70117984734d6f82a46febaa85cdc8ac5b38 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 18 Sep 2026 11:25:39 +0200 Subject: [PATCH 1155/2098] unified: Add receiver argument node --- .../internal/dataflow/DataFlowNode.qll | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll index bdcee71d54fd..6b03fd3e13aa 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll @@ -65,7 +65,8 @@ newtype TDataFlowNode = performsVariableAccess(expr, var, kind, _) } or TLocalSsaNode(LocalSsaDataFlowOutput::SsaNode node) or - TReceiverParameterNode(DataFlowCallable callable) + TReceiverParameterNode(DataFlowCallable callable) or + TReceiverArgumentNode(DataFlowCall call) /** * A node representing something that can have a value. @@ -129,6 +130,14 @@ class Node extends TDataFlowNode { this = TReceiverParameterNode(callable) } + /** Holds if this node represents the receiver argument passed to `call`. */ + predicate isReceiverArgument(CallExpr call) { + this = TReceiverArgumentNode(any(DataFlowCall c | c.asExplicitCall() = call)) + } + + /** Holds if this node represents the receiver argument passed to `call`. */ + predicate isReceiverArgumentEx(DataFlowCall call) { this = TReceiverArgumentNode(call) } + /** Gets the expression represented by this node. */ Expr asExpr() { this = TValueNode(result) } @@ -168,6 +177,11 @@ class Node extends TDataFlowNode { this.isReceiverParameterEx(callable) and result = "[receiver] " + callable.toString() ) + or + exists(DataFlowCall call | + this.isReceiverArgumentEx(call) and + result = "[receiver arg] " + call.toString() + ) } /** Gets the location of this data flow node. */ @@ -183,6 +197,11 @@ class Node extends TDataFlowNode { this.isReceiverParameterEx(callable) and result = callable.getLocation() ) + or + exists(DataFlowCall call | + this.isReceiverArgumentEx(call) and + result = call.getLocation() + ) } /** Gets the data-flow callable containing this data flow node. */ @@ -195,6 +214,10 @@ class Node extends TDataFlowNode { ) or this.isReceiverParameterEx(result) + or + exists(DataFlowCall call | + this.isReceiverArgumentEx(call) and + result = call.getEnclosingCallable() ) } From 25baa0b2d4cf4d3fec77b768cc62b63aa39d7347 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 17 Sep 2026 15:38:58 +0200 Subject: [PATCH 1156/2098] unified: Link up receiver argument/parameter --- .../unified/internal/dataflow/DataFlowInstantiation.qll | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll index 243d3914f853..e104a351a172 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll @@ -53,6 +53,9 @@ module DataFlowInput implements InputSig { or pos.asNamed() = param.getExternalName() ) + or + p.isReceiverParameterEx(c) and + pos.isReceiver() } class ParameterNode extends Node { @@ -73,6 +76,9 @@ module DataFlowInput implements InputSig { or pos.asNamed() = arg.getName() ) + or + n.isReceiverArgumentEx(call) and + pos.isReceiver() } class ArgumentNode extends Node { From 8f2b812d52f072d4fa49d5a9d9dcafe9db633cf5 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 17 Sep 2026 15:39:12 +0200 Subject: [PATCH 1157/2098] unified: Refactor first column in performsVariableAccess This changes the type from Expr -> AstNode and renames the column. This should just be an arbitrary representative for the access; it does not have to be an Expr. --- .../internal/dataflow/DataFlowNode.qll | 38 ++++++++++--------- .../unified/internal/dataflow/LocalSsa.qll | 18 ++++----- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll index 6b03fd3e13aa..102f0acfae0c 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll @@ -34,13 +34,15 @@ private predicate hasPostUpdate(Expr expr, ControlFlowNode cfgNode) { } /** - * Holds if `expr` performs an access to `var` of the given `kind` at `cfgNode`. + * Holds if `repr` performs an access to `var` of the given `kind` at `cfgNode`. + * + * `repr` should be an arbitary but unique representative for the access. */ predicate performsVariableAccess( - Expr expr, LocalVariable var, VariableRefKind kind, ControlFlowNode cfgNode + AstNode repr, LocalVariable var, VariableRefKind kind, ControlFlowNode cfgNode ) { - exists(LocalVariableAccess access | var = access.getLocalVariable() and expr = access | - hasResultValue(access) and kind.isRead() and cfgNode.asExpr() = expr + exists(LocalVariableAccess access | var = access.getLocalVariable() and repr = access | + hasResultValue(access) and kind.isRead() and cfgNode.asExpr() = repr or hasIncomingValueAtCfgNode(access, cfgNode) and kind.isWrite() or @@ -48,7 +50,7 @@ predicate performsVariableAccess( ) or exists(UnqualifiedMemberAccess access | - access.isInstanceAccess() and var = access.getImplicitQualifierVariable() and expr = access + access.isInstanceAccess() and var = access.getImplicitQualifierVariable() and repr = access | kind.isRead() and cfgNode.isBefore(access) or @@ -61,8 +63,8 @@ newtype TDataFlowNode = TValueNode(Expr expr) { hasResultValue(expr) or hasIncomingValue(expr, _) } or TStrictlyIncomingValue(Expr expr) { hasResultValue(expr) and hasIncomingValue(expr, _) } or TExprPostUpdateNode(Expr expr) { hasPostUpdate(expr, _) } or - TLocalVariableRefNode(Expr expr, LocalVariable var, VariableRefKind kind) { - performsVariableAccess(expr, var, kind, _) + TLocalVariableRefNode(AstNode repr, LocalVariable var, VariableRefKind kind) { + performsVariableAccess(repr, var, kind, _) } or TLocalSsaNode(LocalSsaDataFlowOutput::SsaNode node) or TReceiverParameterNode(DataFlowCallable callable) or @@ -87,24 +89,24 @@ class Node extends TDataFlowNode { this = TStrictlyIncomingValue(expr) } - /** Holds if this represents the reference to `v` at `access`. */ - predicate isLocalVariableRef(Expr access, LocalVariable v, VariableRefKind kind) { - this = TLocalVariableRefNode(access, v, kind) + /** Holds if this represents the reference to `v` at `repr`. */ + predicate isLocalVariableRef(AstNode repr, LocalVariable v, VariableRefKind kind) { + this = TLocalVariableRefNode(repr, v, kind) } - /** Holds if this represents the value read from `v` at `access`. */ - predicate isLocalVariableRead(Expr access, LocalVariable v) { - this.isLocalVariableRef(access, v, TRead()) + /** Holds if this represents the value read from `v` at `repr`. */ + predicate isLocalVariableRead(AstNode repr, LocalVariable v) { + this.isLocalVariableRef(repr, v, TRead()) } - /** Holds if this represents the value written to `v` at `access`. */ - predicate isLocalVariableWrite(Expr access, LocalVariable v) { - this.isLocalVariableRef(access, v, TWrite()) + /** Holds if this represents the value written to `v` at `repr`. */ + predicate isLocalVariableWrite(AstNode repr, LocalVariable v) { + this.isLocalVariableRef(repr, v, TWrite()) } /** Holds if this represents the updated state of the value held in `v` after it has been mutated by the surrounding assignment or call. */ - predicate isLocalVariablePostUpdate(Expr access, LocalVariable v) { - this.isLocalVariableRef(access, v, TPostUpdate()) + predicate isLocalVariablePostUpdate(AstNode repr, LocalVariable v) { + this.isLocalVariableRef(repr, v, TPostUpdate()) } /** Holds if this represents the updated state of the value returned by `expr` after it has been mutated by the surrounding assignment or call. */ diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll b/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll index 3aac1f7b7968..3b5c63dd6149 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll @@ -40,11 +40,11 @@ private import LocalSsaOutput module LocalSsaDataFlowInput implements DataFlowIntegrationInputSig { class Expr extends TLocalVariableRefNode { predicate hasCfgNode(BasicBlock bb, int i) { - exists(U::Expr expr, LocalVariable var, VariableRefKind kind | - this = TLocalVariableRefNode(expr, var, kind) and + exists(U::AstNode repr, LocalVariable var, VariableRefKind kind | + this = TLocalVariableRefNode(repr, var, kind) and // Note: the synthetic read we insert for post-updates must also have an Expr (kind.isRead() or kind.isPostUpdate()) and - performsVariableAccess(expr, var, kind, bb.getNode(i)) + performsVariableAccess(repr, var, kind, bb.getNode(i)) ) } @@ -64,9 +64,9 @@ module LocalSsaDataFlowInput implements DataFlowIntegrationInputSig { predicate guardDirectlyControlsBlock(Guard guard, BasicBlock bb, GuardValue val) { none() } predicate postUpdateCfgNode(Expr read, BasicBlock bb, int i) { - exists(LocalVariable var, U::Expr expr | - read = TLocalVariableRefNode(expr, var, TRead()) and - performsVariableAccess(expr, var, TPostUpdate(), bb.getNode(i)) + exists(LocalVariable var, U::AstNode repr | + read = TLocalVariableRefNode(repr, var, TRead()) and + performsVariableAccess(repr, var, TPostUpdate(), bb.getNode(i)) ) } } @@ -93,10 +93,10 @@ Node getNodeFromLocalSsaNode(Ssa::Node n) { or result = getPostUpdateNode(n.(Ssa::ExprPostUpdateNode).getExpr()) or - exists(LocalVariable v, BasicBlock bb, int i, Expr expr | + exists(LocalVariable v, BasicBlock bb, int i, AstNode repr | n.(Ssa::WriteDefSourceNode).getDefinition().definesAt(v, bb, i) and - performsVariableAccess(expr, v, TWrite(), bb.getNode(i)) and - result.isLocalVariableWrite(expr, v) + performsVariableAccess(repr, v, TWrite(), bb.getNode(i)) and + result.isLocalVariableWrite(repr, v) ) } From 2e3081e8603c779c3aa3dbf256ff231c80298f68 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 17 Sep 2026 15:39:12 +0200 Subject: [PATCH 1158/2098] unified: Store the receiver in 'self' --- .../ql/lib/codeql/unified/internal/LocalNameBinding.qll | 8 ++++++++ .../codeql/unified/internal/dataflow/DataFlowGraph.qll | 7 +++++++ .../lib/codeql/unified/internal/dataflow/DataFlowNode.qll | 8 ++++++++ 3 files changed, 23 insertions(+) diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index 0844fe64bed9..716e3e7182a1 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -474,3 +474,11 @@ class PotentialLocalNameAccess extends IdentifierExpr { /** Holds if this is one of the binding sites for a name, such as the `x` in `let x = 123`. */ predicate isBindingSite() { this instanceof NameBinding } } + +/** Gets implicitly-declared variable through which the given callable refers to its receiver. */ +LocalVariable getImplicitReceiverVariable(Callable callable) { + exists(string name | + name = any(NameBindingPlugin p).getImplicitReceiverParameterName(callable) and + result.(LocalNameBindingOutput::ImplicitLocal).hasNameAndScope(name, callable) + ) +} diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll index 2bd96b2b3ef1..d86a46fa69fb 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll @@ -1,9 +1,16 @@ private import unified private import AllDataFlow +private import codeql.unified.internal.LocalNameBinding predicate step(Node node1, Step step, Node node2) { any(DataFlowPlugin p).step(node1, step, node2) or + exists(Callable callable | + node1.isReceiverParameter(callable) and + step.value() and + node2.isLocalVariableWrite(callable, getImplicitReceiverVariable(callable)) + ) + or exists(VariableDeclaration decl | node1.isResultValue(decl.getValue()) and step.value() and diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll index 102f0acfae0c..15a65ba2898c 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll @@ -1,6 +1,7 @@ private import unified private import AllDataFlow private import codeql.unified.internal.ExprPositions +private import codeql.unified.internal.LocalNameBinding private predicate hasIncomingValueAtCfgNode(Expr expr, ControlFlowNode cfgNode) { exists(AstNode declOrAssignment | hasIncomingValue(expr, declOrAssignment) | @@ -57,6 +58,13 @@ predicate performsVariableAccess( (hasIncomingValueAtCfgNode(access, cfgNode) or hasPostUpdate(access, cfgNode)) and kind.isPostUpdate() ) + or + exists(Callable callable | + repr = callable and + var = getImplicitReceiverVariable(callable) and + kind.isWrite() and + cfgNode.(ControlFlow::EntryNode).getEnclosingCallable() = callable + ) } newtype TDataFlowNode = From 6acf68354b1be799586f4b91e8e6cf9d8db17aa0 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 18 Sep 2026 11:43:54 +0200 Subject: [PATCH 1159/2098] unified: Wire up call receiver --- .../internal/dataflow/DataFlowGraph.qll | 22 +++++++++++++ .../internal/dataflow/DataFlowNode.qll | 32 ++++++++++++++++--- 2 files changed, 49 insertions(+), 5 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll index d86a46fa69fb..4ba0fdcb802c 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowGraph.qll @@ -11,6 +11,28 @@ predicate step(Node node1, Step step, Node node2) { node2.isLocalVariableWrite(callable, getImplicitReceiverVariable(callable)) ) or + exists(CallExpr call, Expr receiverExpr | + receiverExpr = call.getCallee().(MemberAccessExpr).getBase() + | + node1.isResultValue(receiverExpr) and + step.value() and + node2.isReceiverArgument(call) + or + node1.isReceiverPostUpdate(call) and + step.value() and + node2.isPostUpdate(receiverExpr) + ) + or + exists(CallExpr call, UnqualifiedMemberAccess callee | callee = call.getCallee() | + node1.isLocalVariableRead(callee, callee.getImplicitQualifierVariable()) and + step.value() and + node2.isReceiverArgument(call) + or + node1.isReceiverPostUpdate(call) and + step.value() and + node2.isLocalVariablePostUpdate(callee, callee.getImplicitQualifierVariable()) + ) + or exists(VariableDeclaration decl | node1.isResultValue(decl.getValue()) and step.value() and diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll index 15a65ba2898c..6344624d763d 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll @@ -2,6 +2,7 @@ private import unified private import AllDataFlow private import codeql.unified.internal.ExprPositions private import codeql.unified.internal.LocalNameBinding +private import codeql.util.Boolean private predicate hasIncomingValueAtCfgNode(Expr expr, ControlFlowNode cfgNode) { exists(AstNode declOrAssignment | hasIncomingValue(expr, declOrAssignment) | @@ -76,7 +77,7 @@ newtype TDataFlowNode = } or TLocalSsaNode(LocalSsaDataFlowOutput::SsaNode node) or TReceiverParameterNode(DataFlowCallable callable) or - TReceiverArgumentNode(DataFlowCall call) + TReceiverArgumentNode(DataFlowCall call, Boolean isPost) /** * A node representing something that can have a value. @@ -142,11 +143,24 @@ class Node extends TDataFlowNode { /** Holds if this node represents the receiver argument passed to `call`. */ predicate isReceiverArgument(CallExpr call) { - this = TReceiverArgumentNode(any(DataFlowCall c | c.asExplicitCall() = call)) + this.isReceiverArgumentEx(any(DataFlowCall c | c.asExplicitCall() = call)) } + /** Holds if this node represents the updated state of the receiver of `call` after the call returns. */ + predicate isReceiverPostUpdate(CallExpr call) { + this.isReceiverPostUpdateEx(any(DataFlowCall c | c.asExplicitCall() = call)) + } + + /** Holds if this node represents the receiver argument passed to `call`. */ + predicate isReceiverArgumentEx(DataFlowCall call) { this.isReceiverArgumentEx(call, false) } + + /** Holds if this node represents the updated state of the receiver of `call` after the call returns. */ + predicate isReceiverPostUpdateEx(DataFlowCall call) { this.isReceiverArgumentEx(call, true) } + /** Holds if this node represents the receiver argument passed to `call`. */ - predicate isReceiverArgumentEx(DataFlowCall call) { this = TReceiverArgumentNode(call) } + predicate isReceiverArgumentEx(DataFlowCall call, boolean isPost) { + this = TReceiverArgumentNode(call, isPost) + } /** Gets the expression represented by this node. */ Expr asExpr() { this = TValueNode(result) } @@ -191,6 +205,9 @@ class Node extends TDataFlowNode { exists(DataFlowCall call | this.isReceiverArgumentEx(call) and result = "[receiver arg] " + call.toString() + or + this.isReceiverPostUpdateEx(call) and + result = "[receiver post] " + call.toString() ) } @@ -209,7 +226,7 @@ class Node extends TDataFlowNode { ) or exists(DataFlowCall call | - this.isReceiverArgumentEx(call) and + this.isReceiverArgumentEx(call, _) and result = call.getLocation() ) } @@ -226,7 +243,7 @@ class Node extends TDataFlowNode { this.isReceiverParameterEx(result) or exists(DataFlowCall call | - this.isReceiverArgumentEx(call) and + this.isReceiverArgumentEx(call, _) and result = call.getEnclosingCallable() ) } @@ -245,4 +262,9 @@ Node getPostUpdateNode(Node pre) { pre.isLocalVariableRead(expr, var) and result.isLocalVariablePostUpdate(expr, var) ) + or + exists(DataFlowCall call | + pre.isReceiverArgumentEx(call) and + result.isReceiverPostUpdateEx(call) + ) } From 29499de2936441e1735a8924d373e71a46af52be Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 18 Sep 2026 11:55:31 +0200 Subject: [PATCH 1160/2098] unified: Ensure implicit 'self' has a post-update --- .../lib/codeql/unified/internal/dataflow/DataFlowNode.qll | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll index 6344624d763d..dcdb76f526c0 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll @@ -58,6 +58,12 @@ predicate performsVariableAccess( or (hasIncomingValueAtCfgNode(access, cfgNode) or hasPostUpdate(access, cfgNode)) and kind.isPostUpdate() + or + exists(CallExpr call | + access = call.getCallee() and + cfgNode.isAfter(call) and + kind.isPostUpdate() + ) ) or exists(Callable callable | From 1175f8417f97f523fb19cdc2f9eb0872ac13b125 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 18 Sep 2026 11:55:42 +0200 Subject: [PATCH 1161/2098] unified: Add test --- .../ql/test/library-tests/dataflow/calls.swift | 15 +++++++++++++++ .../ql/test/library-tests/dataflow/test.expected | 6 ++++++ 2 files changed, 21 insertions(+) diff --git a/unified/ql/test/library-tests/dataflow/calls.swift b/unified/ql/test/library-tests/dataflow/calls.swift index 99272319acb8..2cc2ce4abced 100644 --- a/unified/ql/test/library-tests/dataflow/calls.swift +++ b/unified/ql/test/library-tests/dataflow/calls.swift @@ -66,3 +66,18 @@ func t7() { target(b) sink(b.field) // $ hasValueFlow=t7.1 } + +func t8() { + class C { + var field: String = "" + + func store() { + field = source("t8.1") + } + func read() { + sink(field) // no flow + store() + sink(field) // $ hasValueFlow=t8.1 + } + } +} diff --git a/unified/ql/test/library-tests/dataflow/test.expected b/unified/ql/test/library-tests/dataflow/test.expected index 545cd611a543..f8b0050317a9 100644 --- a/unified/ql/test/library-tests/dataflow/test.expected +++ b/unified/ql/test/library-tests/dataflow/test.expected @@ -25,6 +25,8 @@ edges | calls.swift:62:19:62:32 | source(...) | calls.swift:62:9:62:15 | ... .field | provenance | | | calls.swift:66:12:66:12 | [post] b [field] | calls.swift:67:10:67:10 | b [field] | provenance | | | calls.swift:67:10:67:10 | b [field] | calls.swift:67:10:67:16 | ... .field | provenance | | +| calls.swift:75:13:75:17 | field | calls.swift:80:18:80:22 | field | provenance | | +| calls.swift:75:21:75:34 | source(...) | calls.swift:75:13:75:17 | field | provenance | | | implicit-self.swift:16:9:16:12 | [post] self [x] | implicit-self.swift:17:14:17:17 | self [x] | provenance | | | implicit-self.swift:16:9:16:14 | ... .x | implicit-self.swift:16:9:16:12 | [post] self [x] | provenance | | | implicit-self.swift:16:18:16:31 | source(...) | implicit-self.swift:16:9:16:14 | ... .x | provenance | | @@ -200,6 +202,9 @@ nodes | calls.swift:66:12:66:12 | [post] b [field] | semmle.label | [post] b [field] | | calls.swift:67:10:67:10 | b [field] | semmle.label | b [field] | | calls.swift:67:10:67:16 | ... .field | semmle.label | ... .field | +| calls.swift:75:13:75:17 | field | semmle.label | field | +| calls.swift:75:21:75:34 | source(...) | semmle.label | source(...) | +| calls.swift:80:18:80:22 | field | semmle.label | field | | implicit-self.swift:16:9:16:12 | [post] self [x] | semmle.label | [post] self [x] | | implicit-self.swift:16:9:16:14 | ... .x | semmle.label | ... .x | | implicit-self.swift:16:18:16:31 | source(...) | semmle.label | source(...) | @@ -395,6 +400,7 @@ testFailures | calls.swift:50:14:50:14 | x | calls.swift:53:12:53:26 | source(...) | calls.swift:50:14:50:14 | x | $@ | calls.swift:53:12:53:26 | source(...) | source(...) | | calls.swift:51:14:51:14 | y | calls.swift:53:28:53:41 | source(...) | calls.swift:51:14:51:14 | y | $@ | calls.swift:53:28:53:41 | source(...) | source(...) | | calls.swift:67:10:67:16 | ... .field | calls.swift:62:19:62:32 | source(...) | calls.swift:67:10:67:16 | ... .field | $@ | calls.swift:62:19:62:32 | source(...) | source(...) | +| calls.swift:80:18:80:22 | field | calls.swift:75:21:75:34 | source(...) | calls.swift:80:18:80:22 | field | $@ | calls.swift:75:21:75:34 | source(...) | source(...) | | implicit-self.swift:17:14:17:19 | ... .x | implicit-self.swift:16:18:16:31 | source(...) | implicit-self.swift:17:14:17:19 | ... .x | $@ | implicit-self.swift:16:18:16:31 | source(...) | source(...) | | implicit-self.swift:23:14:23:14 | x | implicit-self.swift:22:13:22:26 | source(...) | implicit-self.swift:23:14:23:14 | x | $@ | implicit-self.swift:22:13:22:26 | source(...) | source(...) | | implicit-self.swift:29:14:29:19 | ... .x | implicit-self.swift:28:13:28:26 | source(...) | implicit-self.swift:29:14:29:19 | ... .x | $@ | implicit-self.swift:28:13:28:26 | source(...) | source(...) | From 10bcc258886e31cf309b62cce2a3cc344ea98f00 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 18 Sep 2026 12:47:53 +0200 Subject: [PATCH 1162/2098] unified: Add 8 combinations of implicit/explicit self Note that some of them are failing because 'self.store()' is not resolved by static name binding. --- .../test/library-tests/dataflow/calls.swift | 45 ++++++++++++++++++- .../test/library-tests/dataflow/test.expected | 19 ++++++-- 2 files changed, 60 insertions(+), 4 deletions(-) diff --git a/unified/ql/test/library-tests/dataflow/calls.swift b/unified/ql/test/library-tests/dataflow/calls.swift index 2cc2ce4abced..9f2fedf4d3c8 100644 --- a/unified/ql/test/library-tests/dataflow/calls.swift +++ b/unified/ql/test/library-tests/dataflow/calls.swift @@ -74,10 +74,53 @@ func t8() { func store() { field = source("t8.1") } - func read() { + + func read1() { + sink(field) // no flow + store() + sink(field) // $ hasValueFlow=t8.1 + } + + func read2() { + sink(field) // no flow + store() + sink(self.field) // $ hasValueFlow=t8.1 + } + + func read3() { + sink(field) // no flow + self.store() + sink(field) // $ MISSING: hasValueFlow=t8.1 // self.store() not yet resolved by call graph + } + + func read4() { sink(field) // no flow + self.store() + sink(self.field) // $ MISSING: hasValueFlow=t8.1 // self.store() not yet resolved by call graph + } + + func read5() { + sink(self.field) // no flow store() sink(field) // $ hasValueFlow=t8.1 } + + func read6() { + sink(self.field) // no flow + store() + sink(self.field) // $ hasValueFlow=t8.1 + } + + func read7() { + sink(self.field) // no flow + self.store() + sink(field) // $ MISSING: hasValueFlow=t8.1 // self.store() not yet resolved by call graph + } + + func read8() { + sink(self.field) // no flow + self.store() + sink(self.field) // $ MISSING: hasValueFlow=t8.1 // self.store() not yet resolved by call graph + } } } diff --git a/unified/ql/test/library-tests/dataflow/test.expected b/unified/ql/test/library-tests/dataflow/test.expected index f8b0050317a9..09bfb86d7540 100644 --- a/unified/ql/test/library-tests/dataflow/test.expected +++ b/unified/ql/test/library-tests/dataflow/test.expected @@ -25,8 +25,13 @@ edges | calls.swift:62:19:62:32 | source(...) | calls.swift:62:9:62:15 | ... .field | provenance | | | calls.swift:66:12:66:12 | [post] b [field] | calls.swift:67:10:67:10 | b [field] | provenance | | | calls.swift:67:10:67:10 | b [field] | calls.swift:67:10:67:16 | ... .field | provenance | | -| calls.swift:75:13:75:17 | field | calls.swift:80:18:80:22 | field | provenance | | +| calls.swift:75:13:75:17 | field | calls.swift:81:18:81:22 | field | provenance | | +| calls.swift:75:13:75:17 | field | calls.swift:87:18:87:21 | self [field] | provenance | | +| calls.swift:75:13:75:17 | field | calls.swift:105:18:105:22 | field | provenance | | +| calls.swift:75:13:75:17 | field | calls.swift:111:18:111:21 | self [field] | provenance | | | calls.swift:75:21:75:34 | source(...) | calls.swift:75:13:75:17 | field | provenance | | +| calls.swift:87:18:87:21 | self [field] | calls.swift:87:18:87:27 | ... .field | provenance | | +| calls.swift:111:18:111:21 | self [field] | calls.swift:111:18:111:27 | ... .field | provenance | | | implicit-self.swift:16:9:16:12 | [post] self [x] | implicit-self.swift:17:14:17:17 | self [x] | provenance | | | implicit-self.swift:16:9:16:14 | ... .x | implicit-self.swift:16:9:16:12 | [post] self [x] | provenance | | | implicit-self.swift:16:18:16:31 | source(...) | implicit-self.swift:16:9:16:14 | ... .x | provenance | | @@ -204,7 +209,12 @@ nodes | calls.swift:67:10:67:16 | ... .field | semmle.label | ... .field | | calls.swift:75:13:75:17 | field | semmle.label | field | | calls.swift:75:21:75:34 | source(...) | semmle.label | source(...) | -| calls.swift:80:18:80:22 | field | semmle.label | field | +| calls.swift:81:18:81:22 | field | semmle.label | field | +| calls.swift:87:18:87:21 | self [field] | semmle.label | self [field] | +| calls.swift:87:18:87:27 | ... .field | semmle.label | ... .field | +| calls.swift:105:18:105:22 | field | semmle.label | field | +| calls.swift:111:18:111:21 | self [field] | semmle.label | self [field] | +| calls.swift:111:18:111:27 | ... .field | semmle.label | ... .field | | implicit-self.swift:16:9:16:12 | [post] self [x] | semmle.label | [post] self [x] | | implicit-self.swift:16:9:16:14 | ... .x | semmle.label | ... .x | | implicit-self.swift:16:18:16:31 | source(...) | semmle.label | source(...) | @@ -400,7 +410,10 @@ testFailures | calls.swift:50:14:50:14 | x | calls.swift:53:12:53:26 | source(...) | calls.swift:50:14:50:14 | x | $@ | calls.swift:53:12:53:26 | source(...) | source(...) | | calls.swift:51:14:51:14 | y | calls.swift:53:28:53:41 | source(...) | calls.swift:51:14:51:14 | y | $@ | calls.swift:53:28:53:41 | source(...) | source(...) | | calls.swift:67:10:67:16 | ... .field | calls.swift:62:19:62:32 | source(...) | calls.swift:67:10:67:16 | ... .field | $@ | calls.swift:62:19:62:32 | source(...) | source(...) | -| calls.swift:80:18:80:22 | field | calls.swift:75:21:75:34 | source(...) | calls.swift:80:18:80:22 | field | $@ | calls.swift:75:21:75:34 | source(...) | source(...) | +| calls.swift:81:18:81:22 | field | calls.swift:75:21:75:34 | source(...) | calls.swift:81:18:81:22 | field | $@ | calls.swift:75:21:75:34 | source(...) | source(...) | +| calls.swift:87:18:87:27 | ... .field | calls.swift:75:21:75:34 | source(...) | calls.swift:87:18:87:27 | ... .field | $@ | calls.swift:75:21:75:34 | source(...) | source(...) | +| calls.swift:105:18:105:22 | field | calls.swift:75:21:75:34 | source(...) | calls.swift:105:18:105:22 | field | $@ | calls.swift:75:21:75:34 | source(...) | source(...) | +| calls.swift:111:18:111:27 | ... .field | calls.swift:75:21:75:34 | source(...) | calls.swift:111:18:111:27 | ... .field | $@ | calls.swift:75:21:75:34 | source(...) | source(...) | | implicit-self.swift:17:14:17:19 | ... .x | implicit-self.swift:16:18:16:31 | source(...) | implicit-self.swift:17:14:17:19 | ... .x | $@ | implicit-self.swift:16:18:16:31 | source(...) | source(...) | | implicit-self.swift:23:14:23:14 | x | implicit-self.swift:22:13:22:26 | source(...) | implicit-self.swift:23:14:23:14 | x | $@ | implicit-self.swift:22:13:22:26 | source(...) | source(...) | | implicit-self.swift:29:14:29:19 | ... .x | implicit-self.swift:28:13:28:26 | source(...) | implicit-self.swift:29:14:29:19 | ... .x | $@ | implicit-self.swift:28:13:28:26 | source(...) | source(...) | From 414c86c9e42e5ee8c0dd74da6653fbbbe5eed305 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 18 Sep 2026 13:12:39 +0200 Subject: [PATCH 1163/2098] unified: Move some variables into fields --- .../unified/internal/dataflow/LocalSsa.qll | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll b/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll index 3b5c63dd6149..c69e5c799670 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll @@ -39,13 +39,17 @@ private import LocalSsaOutput module LocalSsaDataFlowInput implements DataFlowIntegrationInputSig { class Expr extends TLocalVariableRefNode { + U::AstNode repr; + LocalVariable var; + VariableRefKind kind; + + Expr() { this = TLocalVariableRefNode(repr, var, kind) } + predicate hasCfgNode(BasicBlock bb, int i) { - exists(U::AstNode repr, LocalVariable var, VariableRefKind kind | - this = TLocalVariableRefNode(repr, var, kind) and - // Note: the synthetic read we insert for post-updates must also have an Expr - (kind.isRead() or kind.isPostUpdate()) and - performsVariableAccess(repr, var, kind, bb.getNode(i)) - ) + this = TLocalVariableRefNode(repr, var, kind) and + // Note: the synthetic read we insert for post-updates must also have an Expr + (kind.isRead() or kind.isPostUpdate()) and + performsVariableAccess(repr, var, kind, bb.getNode(i)) } string toString() { result = this.(Node).toString() } From 9494c90923d1b65368b54a8d95d122bf77497b88 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 18 Sep 2026 13:46:41 +0200 Subject: [PATCH 1164/2098] unified: Fix getEnclosingCallable for LocalVariableRef This should be taken from the CFG node instead of the AST node --- .../unified/internal/dataflow/DataFlowNode.qll | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll index dcdb76f526c0..80fcf3d85a22 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll @@ -177,8 +177,7 @@ class Node extends TDataFlowNode { AstNode getWrappedAstNode() { result = this.asExpr() or this = TStrictlyIncomingValue(result) or - this = TExprPostUpdateNode(result) or - this = TLocalVariableRefNode(result, _, _) + this = TExprPostUpdateNode(result) } /** Get a string representation of this element. */ @@ -221,6 +220,11 @@ class Node extends TDataFlowNode { Location getLocation() { result = this.getWrappedAstNode().getLocation() or + exists(AstNode repr | + this.isLocalVariableRef(repr, _, _) and + result = repr.getLocation() + ) + or exists(LocalSsaDataFlowOutput::SsaNode node | this = TLocalSsaNode(node) and result = node.getLocation() @@ -241,6 +245,12 @@ class Node extends TDataFlowNode { DataFlowCallable getEnclosingCallableEx() { result.asSourceCallable() = this.getWrappedAstNode().getEnclosingCallable() or + exists(AstNode repr, LocalVariable var, VariableRefKind kind, ControlFlowNode cfgNode | + this.isLocalVariableRef(repr, var, kind) and + performsVariableAccess(repr, var, kind, cfgNode) and + result.asSourceCallable() = cfgNode.getEnclosingCallable() + ) + or exists(LocalSsaDataFlowOutput::SsaNode node | this = TLocalSsaNode(node) and result.asSourceCallable() = node.getSourceVariable().getDeclaringCallable() From f144d3802b73b2ec7b13026e6ef72a8377a231aa Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 18 Sep 2026 14:20:11 +0200 Subject: [PATCH 1165/2098] unified: Exclude calls in pattern context This fixes a data flow consistency error due to ArgumentNodes for constructor patterns missing their PostUpdateNode. --- .../lib/codeql/unified/internal/dataflow/DataFlowCall.qll | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowCall.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowCall.qll index 895f309f028a..462515880cf3 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowCall.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowCall.qll @@ -1,7 +1,11 @@ private import unified private import AllDataFlow +private import codeql.unified.internal.ExprPositions -private newtype TDataFlowCall = TExplicitCall(CallExpr call) +private newtype TDataFlowCall = + TExplicitCall(CallExpr call) { + not isInBindingContext(call, _) // ignore constructor patterns + } /** * A call site, covering both explicit calls such as `foo(1,2)`, as well an implicit From 832dfb415542c0b173353e41175b2ef325a73047 Mon Sep 17 00:00:00 2001 From: Asger F Date: Sat, 19 Sep 2026 10:01:26 +0200 Subject: [PATCH 1166/2098] unified: Tolerate missing post-updates in unreachable code --- .../DataFlowConsistency.ql | 6 ++- .../internal/dataflow/DataFlowNode.qll | 49 +++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/unified/ql/consistency-queries/DataFlowConsistency.ql b/unified/ql/consistency-queries/DataFlowConsistency.ql index 267abd674cb5..00a782f847c1 100644 --- a/unified/ql/consistency-queries/DataFlowConsistency.ql +++ b/unified/ql/consistency-queries/DataFlowConsistency.ql @@ -2,7 +2,11 @@ private import unified private import codeql.unified.internal.dataflow.AllDataFlow private import codeql.dataflow.internal.DataFlowImplConsistency -module ConsistencyInput implements InputSig { } +module ConsistencyInput implements InputSig { + predicate argHasPostUpdateExclude(DataFlowInput::ArgumentNode n) { + not exists(n.getBasicBlock()) // ignore unreachable data flow nodes + } +} module ConsistencyOutput = MakeConsistency; diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll index 80fcf3d85a22..6defd397c0be 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll @@ -266,6 +266,55 @@ class Node extends TDataFlowNode { /** Gets the callable containing this data flow node. */ Callable getEnclosingCallable() { result = this.getEnclosingCallableEx().asSourceCallable() } + + /** + * Holds if this data flow node is associated with the `i`'th index in the given basic block. + * + * Note that some data flow nodes may have an index appearing before the first or after the + * last `ControlFlowNode` node in the basic block. Multiple data flow nodes may share the same control flow position. + * + * Also note that some data flow nodes have no associated control flow position, either because they are + * in unreachable code, or belong to a synthesized callable that has no control flow graph. + */ + predicate hasControlFlowPosition(BasicBlock bb, int i) { + exists(ControlFlowNode cfgNode | cfgNode = bb.getNode(i) | + exists(Expr expr | + this.isResultValue(expr) and cfgNode.asExpr() = expr + or + this.isIncomingValue(expr) and hasIncomingValueAtCfgNode(expr, cfgNode) + or + this.isPostUpdate(expr) and hasPostUpdate(expr, cfgNode) + ) + or + exists(AstNode repr, LocalVariable var, VariableRefKind kind | + this.isLocalVariableRef(repr, var, kind) and + performsVariableAccess(repr, var, kind, cfgNode) + ) + or + exists(DataFlowCallable callable | + this.isReceiverParameterEx(callable) and + cfgNode.(ControlFlow::EntryNode).getEnclosingCallable() = callable.asSourceCallable() + ) + or + exists(DataFlowCall call, CallExpr sourceCall | + call.asExplicitCall() = sourceCall and + ( + this.isReceiverArgumentEx(call) and cfgNode.injects(sourceCall) + or + this.isReceiverPostUpdateEx(call) and cfgNode.isAfter(sourceCall) + ) + ) + ) + or + exists(LocalSsaDataFlowOutput::SsaNode node | + this = TLocalSsaNode(node) and + bb = node.getBasicBlock() and + i = node.getIndex() // TODO: why is this marked as internal in the SSA library? + ) + } + + /** Gets the basic block associated with this data flow node, if any. */ + BasicBlock getBasicBlock() { this.hasControlFlowPosition(result, _) } } Node getPostUpdateNode(Node pre) { From 56fe8a4378caeed89023442cdae4bbf40c5fc871 Mon Sep 17 00:00:00 2001 From: James Tatsch Date: Fri, 11 Sep 2026 08:33:22 -0500 Subject: [PATCH 1167/2098] C#: Reduce false positives in cs/web/missing-x-frame-options --- .../CWE-451/MissingXFrameOptions.qhelp | 43 +++++-- .../CWE-451/MissingXFrameOptions.ql | 53 ++++---- .../CWE-451/MissingXFrameOptionsAspNetCore.cs | 8 ++ .../MissingXFrameOptionsLib.qll | 118 ++++++++++++++++++ .../2026-09-10-missing-x-frame-options.md | 6 + .../MissingXFrameOptions.qlref | 3 +- .../HeaderWrites/HeaderWrites.cs | 52 ++++++++ .../HeaderWrites/HeaderWrites.expected | 9 ++ .../HeaderWrites/HeaderWrites.ql | 12 ++ .../HeaderWrites/HeaderWrites.qlref | 2 + .../MissingXFrameOptions.expected | 0 .../HeaderWrites/MissingXFrameOptions.qlref | 1 + .../HeaderWrites/Web.config | 2 + .../MissingXFrameOptions/HeaderWrites/options | 3 + .../NoHeader/MissingXFrameOptions.expected | 2 +- .../WebConfigAddedHeader/Csp.Web.config | 10 ++ .../CspSubstring.Web.config | 10 ++ .../MissingXFrameOptions.expected | 2 + .../MissingXFrameOptions.qlref | 3 +- .../PrefixedCsp.Web.config | 10 ++ .../WebConfigAddedHeader/Web.config | 2 +- .../MissingXFrameOptions.qlref | 3 +- 22 files changed, 309 insertions(+), 45 deletions(-) create mode 100644 csharp/ql/src/Security Features/CWE-451/MissingXFrameOptionsAspNetCore.cs create mode 100644 csharp/ql/src/Security Features/MissingXFrameOptionsLib.qll create mode 100644 csharp/ql/src/change-notes/2026-09-10-missing-x-frame-options.md create mode 100644 csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/HeaderWrites.cs create mode 100644 csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/HeaderWrites.expected create mode 100644 csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/HeaderWrites.ql create mode 100644 csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/HeaderWrites.qlref create mode 100644 csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/MissingXFrameOptions.expected create mode 100644 csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/MissingXFrameOptions.qlref create mode 100644 csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/Web.config create mode 100644 csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/options create mode 100644 csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/WebConfigAddedHeader/Csp.Web.config create mode 100644 csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/WebConfigAddedHeader/CspSubstring.Web.config create mode 100644 csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/WebConfigAddedHeader/PrefixedCsp.Web.config diff --git a/csharp/ql/src/Security Features/CWE-451/MissingXFrameOptions.qhelp b/csharp/ql/src/Security Features/CWE-451/MissingXFrameOptions.qhelp index 6d5d298c8e43..5f7dd4f3282f 100644 --- a/csharp/ql/src/Security Features/CWE-451/MissingXFrameOptions.qhelp +++ b/csharp/ql/src/Security Features/CWE-451/MissingXFrameOptions.qhelp @@ -5,9 +5,10 @@

    -Web sites that do not specify the X-Frame-Options HTTP header may be vulnerable to UI -redress attacks ("clickjacking"). In these attacks, the vulnerable site is loaded in a frame on -an attacker-controlled site which uses opaque or transparent layers to trick the user into +Web sites that do not restrict framing using the X-Frame-Options HTTP header or the +frame-ancestors Content Security Policy directive may be vulnerable to UI redress +attacks ("clickjacking"). In these attacks, the vulnerable site is loaded in a frame on an +attacker-controlled site which uses opaque or transparent layers to trick the user into unintentionally clicking a button or link on the vulnerable site.

    @@ -17,16 +18,24 @@ unintentionally clicking a button or link on the vulnerable site.

    Set the X-Frame-Options HTTP header to DENY, to instruct web browsers to block attempts to load the site in a frame. Alternatively, if framing is needed in certain -circumstances, specify SAMEORIGIN or ALLOW FROM: ... to limit the ability -to frame the site to pages from the same origin, or from an allowed whitelist of trusted domains. +circumstances, specify SAMEORIGIN to permit framing by the same origin. The +frame-ancestors directive in an enforced Content-Security-Policy header +provides a more flexible alternative. For example, use frame-ancestors 'none' to +prevent all framing, or use its source list to specify which origins may embed the application.

    -For ASP.NET web applications, the header may be specified either in the Web.config -file, using the <customHeaders> tag, or within the source code of the -application using the HttpResponse.AddHeader method. In general, prefer specifying the -header in the Web.config file to ensure it is added to all requests. If adding it -to the source code, ensure that it is added unconditionally to all requests. For example, add the -header in the Application_BeginRequest method in the global.asax file. +For ASP.NET Framework applications, the header may be specified either in the +Web.config file, using the <customHeaders> tag, or within the source +code of the application using the HttpResponse.AddHeader method. In general, prefer +specifying the header in the Web.config file to ensure it is added to all requests. If +adding it to the source code, ensure that it is added unconditionally to all requests. For example, +add the header in the Application_BeginRequest method in the +global.asax file. +

    +

    +For ASP.NET Core applications, set the header on HttpResponse.Headers. This can be +done using the header dictionary's indexer or its Append, Add, or +TryAdd methods.

    @@ -41,11 +50,17 @@ The following example shows how to specify the X-Frame-Options head

    This next example shows how to specify the X-Frame-Options header within the -global.asax file for ASP.NET application: +global.asax file for an ASP.NET application:

    +

    +The following ASP.NET Core example uses an enforced Content Security Policy to disallow framing: +

    + + + @@ -57,6 +72,10 @@ OWASP: Mozilla:
    X-Frame-Options +
  • +Mozilla: +Content-Security-Policy: frame-ancestors +
  • diff --git a/csharp/ql/src/Security Features/CWE-451/MissingXFrameOptions.ql b/csharp/ql/src/Security Features/CWE-451/MissingXFrameOptions.ql index 1b647457e7c8..8d78587c0943 100644 --- a/csharp/ql/src/Security Features/CWE-451/MissingXFrameOptions.ql +++ b/csharp/ql/src/Security Features/CWE-451/MissingXFrameOptions.ql @@ -1,7 +1,8 @@ /** - * @name Missing X-Frame-Options HTTP header - * @description If the 'X-Frame-Options' setting is not provided, a malicious user may be able to - * overlay their own UI on top of the site by using an iframe. + * @name Missing clickjacking protection + * @description If neither the 'X-Frame-Options' header nor a Content Security Policy + * 'frame-ancestors' directive is provided, a malicious user may be able to overlay + * their own UI on top of the site by using an iframe. * @kind problem * @problem.severity error * @security-severity 7.5 @@ -14,7 +15,7 @@ import csharp import semmle.code.asp.WebConfig -import semmle.code.csharp.frameworks.system.Web +import Security_Features.MissingXFrameOptionsLib XmlElement getAWebConfigRoot(WebConfigXml webConfig) { result = webConfig.getARootElement() @@ -28,9 +29,10 @@ XmlElement getAWebConfigRoot(WebConfigXml webConfig) { } /** - * Holds if the `Web.config` file `webConfig` adds an `X-Frame-Options` header. + * Holds if the `Web.config` file `webConfig` adds an `X-Frame-Options` header or a + * `Content-Security-Policy` header containing a `frame-ancestors` directive. */ -predicate hasWebConfigXFrameOptions(WebConfigXml webConfig) { +predicate hasWebConfigClickjackingProtection(WebConfigXml webConfig) { // Looking for an entry in `webConfig` that looks like this: // ```xml // @@ -42,29 +44,30 @@ predicate hasWebConfigXFrameOptions(WebConfigXml webConfig) { // // ``` // This can also be in a `location` - getAWebConfigRoot(webConfig) - .getAChild("system.webServer") - .getAChild("httpProtocol") - .getAChild("customHeaders") - .getAChild("add") - .getAttributeValue("name") = "X-Frame-Options" + exists(XmlElement add, string name | + add = + getAWebConfigRoot(webConfig) + .getAChild("system.webServer") + .getAChild("httpProtocol") + .getAChild("customHeaders") + .getAChild("add") and + name = add.getAttributeValue("name") and + ( + isXFrameOptionsHeaderName(name) + or + isContentSecurityPolicyHeaderName(name) and + containsFrameAncestorsDirective(add.getAttributeValue("value")) + ) + ) } /** - * Holds if there exists a call to `AddHeader` or `AppendHeader` adding the `X-Frame-Options` - * header. + * Holds if code configures a clickjacking protection response header. */ -predicate hasCodeXFrameOptions() { - exists(MethodCall call | - call.getTarget() = any(SystemWebHttpResponseClass r).getAppendHeaderMethod() or - call.getTarget() = any(SystemWebHttpResponseClass r).getAddHeaderMethod() - | - call.getArgumentForName("name").getValue() = "X-Frame-Options" - ) -} +predicate hasCodeClickjackingProtection() { exists(getAClickjackingHeaderWrite()) } from WebConfigXml webConfig where - not hasWebConfigXFrameOptions(webConfig) and - not hasCodeXFrameOptions() -select webConfig, "Configuration file is missing the X-Frame-Options setting." + not hasWebConfigClickjackingProtection(webConfig) and + not hasCodeClickjackingProtection() +select webConfig, "Configuration file is missing clickjacking protection." diff --git a/csharp/ql/src/Security Features/CWE-451/MissingXFrameOptionsAspNetCore.cs b/csharp/ql/src/Security Features/CWE-451/MissingXFrameOptionsAspNetCore.cs new file mode 100644 index 000000000000..f735a8f0ae7c --- /dev/null +++ b/csharp/ql/src/Security Features/CWE-451/MissingXFrameOptionsAspNetCore.cs @@ -0,0 +1,8 @@ +void Configure(IApplicationBuilder app) +{ + app.Use(async (context, next) => + { + context.Response.Headers["Content-Security-Policy"] = "frame-ancestors 'none'"; + await next(); + }); +} diff --git a/csharp/ql/src/Security Features/MissingXFrameOptionsLib.qll b/csharp/ql/src/Security Features/MissingXFrameOptionsLib.qll new file mode 100644 index 000000000000..afd0d7410cf7 --- /dev/null +++ b/csharp/ql/src/Security Features/MissingXFrameOptionsLib.qll @@ -0,0 +1,118 @@ +/** Provides predicates for recognizing clickjacking-related response-header configuration. */ + +import csharp +import semmle.code.csharp.dataflow.DataFlow +import semmle.code.csharp.frameworks.microsoft.AspNetCore +import semmle.code.csharp.frameworks.system.Web + +/** Holds if `name` is the `X-Frame-Options` header name, ignoring case. */ +bindingset[name] +predicate isXFrameOptionsHeaderName(string name) { name.toLowerCase() = "x-frame-options" } + +/** Holds if `name` is the enforced `Content-Security-Policy` header name, ignoring case. */ +bindingset[name] +predicate isContentSecurityPolicyHeaderName(string name) { + name.toLowerCase() = "content-security-policy" +} + +/** + * Holds if `value` contains a `frame-ancestors` directive at the start of a CSP policy or + * after a directive or policy separator. + */ +bindingset[value] +predicate containsFrameAncestorsDirective(string value) { + value.regexpMatch("(?is)(^|.*[;,])\\s*frame-ancestors(\\s|;|$).*") +} + +private predicate isHeaderNamesField(Expr name, string fieldName) { + exists(FieldAccess access | + name.stripImplicit() = access and + access.getTarget().hasFullyQualifiedName("Microsoft.Net.Http.Headers", "HeaderNames", fieldName) + ) +} + +private predicate isXFrameOptionsHeaderNameExpr(Expr name) { + isXFrameOptionsHeaderName(name.stripImplicit().getValue()) + or + isHeaderNamesField(name, "XFrameOptions") +} + +private predicate isContentSecurityPolicyHeaderNameExpr(Expr name) { + isContentSecurityPolicyHeaderName(name.stripImplicit().getValue()) + or + isHeaderNamesField(name, "ContentSecurityPolicy") +} + +private predicate containsFrameAncestorsDirectiveExpr(Expr value) { + containsFrameAncestorsDirective(value.stripImplicit().getValue()) +} + +private predicate isClickjackingHeader(Expr name, Expr value) { + isXFrameOptionsHeaderNameExpr(name) + or + isContentSecurityPolicyHeaderNameExpr(name) and containsFrameAncestorsDirectiveExpr(value) +} + +private predicate isDirectResponseHeadersAccess(Expr expr) { + exists(PropertyAccessExpr headers, MicrosoftAspNetCoreHttpHttpResponse response | + expr.stripImplicit() = headers and headers.getProperty() = response.getHeadersProperty() + ) +} + +private predicate isResponseHeadersAccess(Expr expr) { + exists(Expr directAccess | + isDirectResponseHeadersAccess(directAccess) and + DataFlow::localExprFlow(directAccess, expr.stripImplicit()) + ) +} + +private Expr getHeaderDictionaryReceiver(MethodCall call) { + result = call.getQualifier() + or + call.getTarget().isExtensionMethod() and + result = call.getArgumentForParameter(call.getTarget().getParameter(0)) +} + +private predicate isClickjackingHeaderCall(MethodCall call) { + ( + call.getTarget() = any(SystemWebHttpResponseClass r).getAppendHeaderMethod() or + call.getTarget() = any(SystemWebHttpResponseClass r).getAddHeaderMethod() + ) and + isClickjackingHeader(call.getArgumentForName("name"), call.getArgumentForName("value")) + or + call.getTarget().hasUndecoratedName(["Append", "Add", "TryAdd"]) and + isResponseHeadersAccess(getHeaderDictionaryReceiver(call)) and + isClickjackingHeader(call.getArgumentForName("key"), call.getArgumentForName("value")) +} + +private predicate isClickjackingHeaderIndexerAssignment(AssignExpr assignment) { + exists(IndexerCall indexer | + assignment.getLeftOperand() = indexer and + isResponseHeadersAccess(indexer.getQualifier()) and + isClickjackingHeader(indexer.getArgument(0), assignment.getRightOperand()) + ) +} + +private predicate isClickjackingNamedHeaderPropertyAssignment(AssignExpr assignment) { + exists(PropertyAccessExpr header | + assignment.getLeftOperand() = header and + isResponseHeadersAccess(header.(QualifiableExpr).getQualifier()) and + ( + header.getProperty().hasName("XFrameOptions") + or + header.getProperty().hasName("ContentSecurityPolicy") and + containsFrameAncestorsDirectiveExpr(assignment.getRightOperand()) + ) + ) +} + +/** Gets an expression that configures a clickjacking-related response header. */ +Expr getAClickjackingHeaderWrite() { + result = any(MethodCall call | isClickjackingHeaderCall(call)) + or + result = + any(AssignExpr assignment | + isClickjackingHeaderIndexerAssignment(assignment) or + isClickjackingNamedHeaderPropertyAssignment(assignment) + ) +} diff --git a/csharp/ql/src/change-notes/2026-09-10-missing-x-frame-options.md b/csharp/ql/src/change-notes/2026-09-10-missing-x-frame-options.md new file mode 100644 index 000000000000..fe62433ec70a --- /dev/null +++ b/csharp/ql/src/change-notes/2026-09-10-missing-x-frame-options.md @@ -0,0 +1,6 @@ +--- +category: minorAnalysis +--- +* The `cs/web/missing-x-frame-options` query now recognizes clickjacking protection configured + through ASP.NET Core response headers and enforced Content Security Policy `frame-ancestors` + directives. diff --git a/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/CodeAddedHeader/MissingXFrameOptions.qlref b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/CodeAddedHeader/MissingXFrameOptions.qlref index d0d38c4b0117..b8a963200e57 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/CodeAddedHeader/MissingXFrameOptions.qlref +++ b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/CodeAddedHeader/MissingXFrameOptions.qlref @@ -1,2 +1 @@ -query: Security Features/CWE-451/MissingXFrameOptions.ql -postprocess: utils/test/InlineExpectationsTestQuery.ql +Security Features/CWE-451/MissingXFrameOptions.ql diff --git a/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/HeaderWrites.cs b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/HeaderWrites.cs new file mode 100644 index 000000000000..0bb97e464cb0 --- /dev/null +++ b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/HeaderWrites.cs @@ -0,0 +1,52 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Http; +using Microsoft.Net.Http.Headers; +using AspNetCoreHttpContext = Microsoft.AspNetCore.Http.HttpContext; + +public class HeaderWrites +{ + public void AspNetCoreResponseHeaders(AspNetCoreHttpContext context) + { + context.Response.Headers.Append(HeaderNames.XFrameOptions, "DENY"); // $ Alert + context.Response.Headers.Add("x-frame-options", "SAMEORIGIN"); // $ Alert + context.Response.Headers.TryAdd( + HeaderNames.ContentSecurityPolicy, + "default-src 'self'; FrAmE-AnCeStOrS 'none'"); // $ Alert + + context.Response.Headers["X-Frame-Options"] = "DENY"; // $ Alert + context.Response.Headers["Content-Security-Policy"] = + "default-src 'self'; frame-ancestors 'none'"; // $ Alert + + context.Response.Headers.XFrameOptions = "DENY"; // $ Alert + context.Response.Headers.ContentSecurityPolicy = + "default-src 'self'; frame-ancestors 'self'"; // $ Alert + context.Response.Headers["Content-Security-Policy"] = + "default-src 'self', frame-ancestors 'none'"; // $ Alert + + IHeaderDictionary responseHeaders = context.Response.Headers; + responseHeaders.Append("X-Frame-Options", "DENY"); // $ Alert + } + + public void IgnoredHeaderWrites(AspNetCoreHttpContext context) + { + context.Request.Headers["X-Frame-Options"] = "DENY"; + + IHeaderDictionary reassignedHeaders = context.Response.Headers; + reassignedHeaders = context.Request.Headers; + reassignedHeaders["X-Frame-Options"] = "DENY"; + + var standaloneHeaders = new HeaderDictionary(); + standaloneHeaders.Append("X-Frame-Options", "DENY"); + standaloneHeaders["Content-Security-Policy"] = "frame-ancestors 'none'"; + + context.Response.Headers["Content-Security-Policy-Report-Only"] = + "frame-ancestors 'none'"; + context.Response.Headers.ContentSecurityPolicyReportOnly = "frame-ancestors 'none'"; + context.Response.Headers["X-Content-Security-Policy"] = "frame-ancestors 'none'"; + context.Response.Headers["Content-Security-Policy"] = "default-src 'self'"; + context.Response.Headers["Content-Security-Policy"] = + "report-uri https://example.test/frame-ancestors"; + context.Response.Headers["Content-Security-Policy"] = + "default-src 'self'; not-frame-ancestors 'none'"; + } +} diff --git a/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/HeaderWrites.expected b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/HeaderWrites.expected new file mode 100644 index 000000000000..908d14dfda79 --- /dev/null +++ b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/HeaderWrites.expected @@ -0,0 +1,9 @@ +| HeaderWrites.cs:10:9:10:74 | call to method Append | A clickjacking-related response header is configured here. | +| HeaderWrites.cs:11:9:11:69 | call to method Add | A clickjacking-related response header is configured here. | +| HeaderWrites.cs:12:9:14:57 | call to method TryAdd | A clickjacking-related response header is configured here. | +| HeaderWrites.cs:16:9:16:60 | ... = ... | A clickjacking-related response header is configured here. | +| HeaderWrites.cs:17:9:18:56 | ... = ... | A clickjacking-related response header is configured here. | +| HeaderWrites.cs:20:9:20:55 | ... = ... | A clickjacking-related response header is configured here. | +| HeaderWrites.cs:21:9:22:56 | ... = ... | A clickjacking-related response header is configured here. | +| HeaderWrites.cs:23:9:24:56 | ... = ... | A clickjacking-related response header is configured here. | +| HeaderWrites.cs:27:9:27:57 | call to method Append | A clickjacking-related response header is configured here. | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/HeaderWrites.ql b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/HeaderWrites.ql new file mode 100644 index 000000000000..ca6a7e164962 --- /dev/null +++ b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/HeaderWrites.ql @@ -0,0 +1,12 @@ +/** + * @kind problem + * @id cs/test/clickjacking-header-write + * @problem.severity warning + */ + +import csharp +import Security_Features.MissingXFrameOptionsLib + +from Expr write +where write = getAClickjackingHeaderWrite() +select write, "A clickjacking-related response header is configured here." diff --git a/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/HeaderWrites.qlref b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/HeaderWrites.qlref new file mode 100644 index 000000000000..a2d35d0adb5b --- /dev/null +++ b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/HeaderWrites.qlref @@ -0,0 +1,2 @@ +query: HeaderWrites.ql +postprocess: utils/test/InlineExpectationsTestQuery.ql diff --git a/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/MissingXFrameOptions.expected b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/MissingXFrameOptions.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/MissingXFrameOptions.qlref b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/MissingXFrameOptions.qlref new file mode 100644 index 000000000000..b8a963200e57 --- /dev/null +++ b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/MissingXFrameOptions.qlref @@ -0,0 +1 @@ +Security Features/CWE-451/MissingXFrameOptions.ql diff --git a/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/Web.config b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/Web.config new file mode 100644 index 000000000000..484daccbf3a4 --- /dev/null +++ b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/Web.config @@ -0,0 +1,2 @@ + + diff --git a/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/options b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/options new file mode 100644 index 000000000000..ce3f295ed117 --- /dev/null +++ b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/options @@ -0,0 +1,3 @@ +semmle-extractor-options: /nostdlib /noconfig +semmle-extractor-options: --load-sources-from-project:${testdir}/../../../../../resources/stubs/_frameworks/Microsoft.NETCore.App/Microsoft.NETCore.App.csproj +semmle-extractor-options: --load-sources-from-project:${testdir}/../../../../../resources/stubs/_frameworks/Microsoft.AspNetCore.App/Microsoft.AspNetCore.App.csproj diff --git a/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/NoHeader/MissingXFrameOptions.expected b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/NoHeader/MissingXFrameOptions.expected index 74dfb6fc2f47..d1708140c9d7 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/NoHeader/MissingXFrameOptions.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/NoHeader/MissingXFrameOptions.expected @@ -1 +1 @@ -| Web.config:0:0:0:0 | Web.config | Configuration file is missing the X-Frame-Options setting. | +| Web.config:0:0:0:0 | Web.config | Configuration file is missing clickjacking protection. | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/WebConfigAddedHeader/Csp.Web.config b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/WebConfigAddedHeader/Csp.Web.config new file mode 100644 index 000000000000..733792aadd8d --- /dev/null +++ b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/WebConfigAddedHeader/Csp.Web.config @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/WebConfigAddedHeader/CspSubstring.Web.config b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/WebConfigAddedHeader/CspSubstring.Web.config new file mode 100644 index 000000000000..caf093f9ecbe --- /dev/null +++ b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/WebConfigAddedHeader/CspSubstring.Web.config @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/WebConfigAddedHeader/MissingXFrameOptions.expected b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/WebConfigAddedHeader/MissingXFrameOptions.expected index e69de29bb2d1..31aad4a5216f 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/WebConfigAddedHeader/MissingXFrameOptions.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/WebConfigAddedHeader/MissingXFrameOptions.expected @@ -0,0 +1,2 @@ +| CspSubstring.Web.config:0:0:0:0 | CspSubstring.Web.config | Configuration file is missing clickjacking protection. | +| PrefixedCsp.Web.config:0:0:0:0 | PrefixedCsp.Web.config | Configuration file is missing clickjacking protection. | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/WebConfigAddedHeader/MissingXFrameOptions.qlref b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/WebConfigAddedHeader/MissingXFrameOptions.qlref index d0d38c4b0117..b8a963200e57 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/WebConfigAddedHeader/MissingXFrameOptions.qlref +++ b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/WebConfigAddedHeader/MissingXFrameOptions.qlref @@ -1,2 +1 @@ -query: Security Features/CWE-451/MissingXFrameOptions.ql -postprocess: utils/test/InlineExpectationsTestQuery.ql +Security Features/CWE-451/MissingXFrameOptions.ql diff --git a/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/WebConfigAddedHeader/PrefixedCsp.Web.config b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/WebConfigAddedHeader/PrefixedCsp.Web.config new file mode 100644 index 000000000000..334b63ce5b0e --- /dev/null +++ b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/WebConfigAddedHeader/PrefixedCsp.Web.config @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/WebConfigAddedHeader/Web.config b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/WebConfigAddedHeader/Web.config index 78f6c30a819f..74c0fa10fd27 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/WebConfigAddedHeader/Web.config +++ b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/WebConfigAddedHeader/Web.config @@ -5,7 +5,7 @@ - + diff --git a/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/WebConfigAddedHeaderInLocation/MissingXFrameOptions.qlref b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/WebConfigAddedHeaderInLocation/MissingXFrameOptions.qlref index d0d38c4b0117..b8a963200e57 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/WebConfigAddedHeaderInLocation/MissingXFrameOptions.qlref +++ b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/WebConfigAddedHeaderInLocation/MissingXFrameOptions.qlref @@ -1,2 +1 @@ -query: Security Features/CWE-451/MissingXFrameOptions.ql -postprocess: utils/test/InlineExpectationsTestQuery.ql +Security Features/CWE-451/MissingXFrameOptions.ql From 66d4840da705f7a0cdc5ed2b0c2d47520bf615a3 Mon Sep 17 00:00:00 2001 From: James Tatsch Date: Sat, 19 Sep 2026 10:33:29 -0500 Subject: [PATCH 1168/2098] Move MissingXFrameOptionsQuery, optimize isClickjackingHeader --- .../security/MissingXFrameOptionsQuery.qll} | 27 ++++++++++++------- .../CWE-451/MissingXFrameOptions.ql | 2 +- .../HeaderWrites/HeaderWrites.ql | 2 +- 3 files changed, 20 insertions(+), 11 deletions(-) rename csharp/ql/{src/Security Features/MissingXFrameOptionsLib.qll => lib/semmle/code/csharp/security/MissingXFrameOptionsQuery.qll} (84%) diff --git a/csharp/ql/src/Security Features/MissingXFrameOptionsLib.qll b/csharp/ql/lib/semmle/code/csharp/security/MissingXFrameOptionsQuery.qll similarity index 84% rename from csharp/ql/src/Security Features/MissingXFrameOptionsLib.qll rename to csharp/ql/lib/semmle/code/csharp/security/MissingXFrameOptionsQuery.qll index afd0d7410cf7..03992291e40c 100644 --- a/csharp/ql/src/Security Features/MissingXFrameOptionsLib.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/MissingXFrameOptionsQuery.qll @@ -47,12 +47,6 @@ private predicate containsFrameAncestorsDirectiveExpr(Expr value) { containsFrameAncestorsDirective(value.stripImplicit().getValue()) } -private predicate isClickjackingHeader(Expr name, Expr value) { - isXFrameOptionsHeaderNameExpr(name) - or - isContentSecurityPolicyHeaderNameExpr(name) and containsFrameAncestorsDirectiveExpr(value) -} - private predicate isDirectResponseHeadersAccess(Expr expr) { exists(PropertyAccessExpr headers, MicrosoftAspNetCoreHttpHttpResponse response | expr.stripImplicit() = headers and headers.getProperty() = response.getHeadersProperty() @@ -78,18 +72,33 @@ private predicate isClickjackingHeaderCall(MethodCall call) { call.getTarget() = any(SystemWebHttpResponseClass r).getAppendHeaderMethod() or call.getTarget() = any(SystemWebHttpResponseClass r).getAddHeaderMethod() ) and - isClickjackingHeader(call.getArgumentForName("name"), call.getArgumentForName("value")) + ( + isXFrameOptionsHeaderNameExpr(call.getArgumentForName("name")) + or + isContentSecurityPolicyHeaderNameExpr(call.getArgumentForName("name")) and + containsFrameAncestorsDirectiveExpr(call.getArgumentForName("value")) + ) or call.getTarget().hasUndecoratedName(["Append", "Add", "TryAdd"]) and isResponseHeadersAccess(getHeaderDictionaryReceiver(call)) and - isClickjackingHeader(call.getArgumentForName("key"), call.getArgumentForName("value")) + ( + isXFrameOptionsHeaderNameExpr(call.getArgumentForName("key")) + or + isContentSecurityPolicyHeaderNameExpr(call.getArgumentForName("key")) and + containsFrameAncestorsDirectiveExpr(call.getArgumentForName("value")) + ) } private predicate isClickjackingHeaderIndexerAssignment(AssignExpr assignment) { exists(IndexerCall indexer | assignment.getLeftOperand() = indexer and isResponseHeadersAccess(indexer.getQualifier()) and - isClickjackingHeader(indexer.getArgument(0), assignment.getRightOperand()) + ( + isXFrameOptionsHeaderNameExpr(indexer.getArgument(0)) + or + isContentSecurityPolicyHeaderNameExpr(indexer.getArgument(0)) and + containsFrameAncestorsDirectiveExpr(assignment.getRightOperand()) + ) ) } diff --git a/csharp/ql/src/Security Features/CWE-451/MissingXFrameOptions.ql b/csharp/ql/src/Security Features/CWE-451/MissingXFrameOptions.ql index 8d78587c0943..2341f3788362 100644 --- a/csharp/ql/src/Security Features/CWE-451/MissingXFrameOptions.ql +++ b/csharp/ql/src/Security Features/CWE-451/MissingXFrameOptions.ql @@ -15,7 +15,7 @@ import csharp import semmle.code.asp.WebConfig -import Security_Features.MissingXFrameOptionsLib +import semmle.code.csharp.security.MissingXFrameOptionsQuery XmlElement getAWebConfigRoot(WebConfigXml webConfig) { result = webConfig.getARootElement() diff --git a/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/HeaderWrites.ql b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/HeaderWrites.ql index ca6a7e164962..607510cd1111 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/HeaderWrites.ql +++ b/csharp/ql/test/query-tests/Security Features/CWE-451/MissingXFrameOptions/HeaderWrites/HeaderWrites.ql @@ -5,7 +5,7 @@ */ import csharp -import Security_Features.MissingXFrameOptionsLib +import semmle.code.csharp.security.MissingXFrameOptionsQuery from Expr write where write = getAClickjackingHeaderWrite() From d7f7ab3135455558733d2eac6b5aa869a432b0b8 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Sun, 20 Sep 2026 18:30:27 +0100 Subject: [PATCH 1169/2098] C#: Disallow magic in 'getAnAccess'. --- csharp/ql/lib/semmle/code/csharp/Assignable.qll | 2 ++ csharp/ql/lib/semmle/code/csharp/Member.qll | 1 + csharp/ql/lib/semmle/code/csharp/Property.qll | 2 ++ csharp/ql/lib/semmle/code/csharp/Variable.qll | 2 ++ 4 files changed, 7 insertions(+) diff --git a/csharp/ql/lib/semmle/code/csharp/Assignable.qll b/csharp/ql/lib/semmle/code/csharp/Assignable.qll index 89dc594ec3f4..d98d78331c83 100644 --- a/csharp/ql/lib/semmle/code/csharp/Assignable.qll +++ b/csharp/ql/lib/semmle/code/csharp/Assignable.qll @@ -18,6 +18,7 @@ class Assignable extends Declaration, @assignable { final AnnotatedType getAnnotatedType() { result.appliesTo(this) } /** Gets an access to this assignable. */ + pragma[nomagic] AssignableAccess getAnAccess() { result.getTarget() = this } /** Gets an expression assigned to this assignable, if any. */ @@ -31,6 +32,7 @@ class Assignable extends Declaration, @assignable { * property (`Property`), an indexer (`Indexer`), or an event (`Event`). */ class AssignableMember extends Member, Assignable, Attributable { + pragma[nomagic] override AssignableMemberAccess getAnAccess() { result = Assignable.super.getAnAccess() } override string toString() { result = Assignable.super.toString() } diff --git a/csharp/ql/lib/semmle/code/csharp/Member.qll b/csharp/ql/lib/semmle/code/csharp/Member.qll index b64f408af64c..ac3229351ea3 100644 --- a/csharp/ql/lib/semmle/code/csharp/Member.qll +++ b/csharp/ql/lib/semmle/code/csharp/Member.qll @@ -238,6 +238,7 @@ class Modifiable extends Declaration, @modifiable { /** A declaration that is a member of a type. */ class Member extends Modifiable, @member { /** Gets an access to this member. */ + pragma[nomagic] MemberAccess getAnAccess() { result.getTarget() = this } /** diff --git a/csharp/ql/lib/semmle/code/csharp/Property.qll b/csharp/ql/lib/semmle/code/csharp/Property.qll index 3a007b0d6e9d..7c048528aaae 100644 --- a/csharp/ql/lib/semmle/code/csharp/Property.qll +++ b/csharp/ql/lib/semmle/code/csharp/Property.qll @@ -217,6 +217,7 @@ class Property extends DeclarationWithGetSetAccessors, @property { result = DeclarationWithGetSetAccessors.super.getAnUltimateImplementor() } + pragma[nomagic] override PropertyAccess getAnAccess() { result.getTarget() = this } override Location getALocation() { property_location(this.getUnboundDeclaration(), result) } @@ -326,6 +327,7 @@ class Indexer extends DeclarationWithGetSetAccessors, Parameterizable, @indexer indexers(this, _, _, getTypeRef(result), _) } + pragma[nomagic] override IndexerAccess getAnAccess() { result.getTarget() = this } /** diff --git a/csharp/ql/lib/semmle/code/csharp/Variable.qll b/csharp/ql/lib/semmle/code/csharp/Variable.qll index 2d4cf578436d..b8e3ae0190d6 100644 --- a/csharp/ql/lib/semmle/code/csharp/Variable.qll +++ b/csharp/ql/lib/semmle/code/csharp/Variable.qll @@ -16,6 +16,7 @@ private import TypeRef class Variable extends Assignable, @variable { override Variable getUnboundDeclaration() { result = this } + pragma[nomagic] override VariableAccess getAnAccess() { result.getTarget() = this } /** Gets the type of this variable. */ @@ -438,6 +439,7 @@ class Field extends Variable, AssignableMember, Attributable, TopLevelExprParent override Field getUnboundDeclaration() { fields(this, _, _, _, _, result) } + pragma[nomagic] override FieldAccess getAnAccess() { result = Variable.super.getAnAccess() } override ValueOrRefType getDeclaringType() { fields(this, _, _, result, _, _) } From 0e6e942e136d2bd6128a9d00241a768398f61592 Mon Sep 17 00:00:00 2001 From: Asger F Date: Mon, 21 Sep 2026 09:06:53 +0200 Subject: [PATCH 1170/2098] JS: Remove destructuring error-checking --- .../semmle/jcorn/AngularExpressionParser.java | 7 +- .../src/com/semmle/jcorn/CustomParser.java | 39 ++- .../src/com/semmle/jcorn/ESNextParser.java | 23 +- .../src/com/semmle/jcorn/Parser.java | 228 ++++++------------ .../src/com/semmle/jcorn/flow/FlowParser.java | 13 +- .../src/com/semmle/jcorn/jsx/JSXParser.java | 12 +- .../js/extractor/test/RobustnessTests.java | 11 + 7 files changed, 128 insertions(+), 205 deletions(-) diff --git a/javascript/extractor/src/com/semmle/jcorn/AngularExpressionParser.java b/javascript/extractor/src/com/semmle/jcorn/AngularExpressionParser.java index 79c1a1e30dbe..f3245d573352 100644 --- a/javascript/extractor/src/com/semmle/jcorn/AngularExpressionParser.java +++ b/javascript/extractor/src/com/semmle/jcorn/AngularExpressionParser.java @@ -30,14 +30,13 @@ protected Expression buildBinary( boolean logical) { // Angular pipe expression: `x|f:a` is desugared to `f(x, a)` if (op.equals("|")) { - DestructuringErrors refDestructuringErrors = new DestructuringErrors(); List arguments = new ArrayList<>(); arguments.add(left); while (this.type == TokenType.colon) { this.next(); int argStartPos = this.pos; Position argStartLocation = this.curPosition(); - Expression arg = parseMaybeUnary(refDestructuringErrors, false); + Expression arg = parseMaybeUnary(false); arguments.add(parseExprOp(arg, argStartPos, argStartLocation, TokenType.plusMin.binop, true)); } SourceLocation loc = new SourceLocation(startLoc); @@ -50,10 +49,10 @@ protected Expression buildBinary( } @Override - protected Expression parseExprAtom(DestructuringErrors refDestructuringErrors) { + protected Expression parseExprAtom() { // Parse postfix "!" operator Position startLoc = this.startLoc; - Expression expr = super.parseExprAtom(refDestructuringErrors); + Expression expr = super.parseExprAtom(); if (this.type == TokenType.prefix && "!".equals(this.value)) { this.next(); // consume "!" token return finishNode(new NonNullAssertion(new SourceLocation(startLoc), expr)); diff --git a/javascript/extractor/src/com/semmle/jcorn/CustomParser.java b/javascript/extractor/src/com/semmle/jcorn/CustomParser.java index 7170aa3e5217..cb963a4cd380 100644 --- a/javascript/extractor/src/com/semmle/jcorn/CustomParser.java +++ b/javascript/extractor/src/com/semmle/jcorn/CustomParser.java @@ -90,7 +90,7 @@ protected CatchClause parseCatchClause(Position startLoc) { if (this.eat(TokenType.parenL)) { param = this.parseBindingAtom(); this.checkLVal(param, true, null); - if (this.eat(TokenType._if)) guard = this.parseExpression(false, null); + if (this.eat(TokenType._if)) guard = this.parseExpression(false); this.expect(TokenType.parenR); } else if (!options.esnext()) { this.unexpected(); @@ -123,7 +123,7 @@ protected Statement parseVarStatement(Position startLoc, String kind) { } @Override - protected Expression parseExprAtom(DestructuringErrors refDestructuringErrors) { + protected Expression parseExprAtom() { Position startLoc = this.startLoc; if (options.mozExtensions() && this.isContextual("let")) { this.next(); @@ -141,9 +141,9 @@ protected Expression parseExprAtom(DestructuringErrors refDestructuringErrors) { if (this.type == TokenType.comma || this.type == TokenType.bracketR || this.type == TokenType.ellipsis) { - elements = this.parseExprList(TokenType.bracketR, true, true, refDestructuringErrors); + elements = this.parseExprList(TokenType.bracketR, true, true); } else { - Expression firstExpr = this.parseMaybeAssign(false, refDestructuringErrors, null); + Expression firstExpr = this.parseMaybeAssign(false, null); // check whether this is a postfix array comprehension if (this.type == TokenType._for || this.type == TokenType._if) { ComprehensionExpression c = this.parseComprehension(startLoc, false, firstExpr); @@ -154,7 +154,7 @@ protected Expression parseExprAtom(DestructuringErrors refDestructuringErrors) { elements = new ArrayList(); elements.add(firstExpr); elements.addAll( - this.parseExprList(TokenType.bracketR, true, true, refDestructuringErrors)); + this.parseExprList(TokenType.bracketR, true, true)); } } return this.finishNode(new ArrayExpression(new SourceLocation(startLoc), elements)); @@ -164,7 +164,7 @@ protected Expression parseExprAtom(DestructuringErrors refDestructuringErrors) { Identifier buildinName = this.parseIdent(true); Identifier name = this.finishNode(new Identifier(new SourceLocation(startLoc), "%" + buildinName.getName())); this.expect(TokenType.parenL); - List args = this.parseExprList(TokenType.parenR, false, false, null); + List args = this.parseExprList(TokenType.parenR, false, false); CallExpression node = new CallExpression( new SourceLocation(startLoc), name, new ArrayList<>(), args, false, false); @@ -184,7 +184,7 @@ protected Expression parseExprAtom(DestructuringErrors refDestructuringErrors) { } return attr; } else { - return super.parseExprAtom(refDestructuringErrors); + return super.parseExprAtom(); } } @@ -197,7 +197,7 @@ protected Node parseLetExpression(Position startLoc, boolean maybeStatement) { if (this.type == TokenType.braceL) { if (!maybeStatement) { // must be the start of an object literal - Expression body = this.parseObj(false, null); + Expression body = this.parseObj(false); return this.finishNode( new LetExpression(new SourceLocation(startLoc), decl.getDeclarations(), body)); } @@ -212,7 +212,7 @@ protected Node parseLetExpression(Position startLoc, boolean maybeStatement) { return this.finishNode( new LetStatement(new SourceLocation(startLoc), decl.getDeclarations(), body)); } else { - Expression body = this.parseExpression(false, null); + Expression body = this.parseExpression(false); return this.finishNode( new LetExpression(new SourceLocation(startLoc), decl.getDeclarations(), body)); } @@ -283,13 +283,12 @@ private boolean eatDoubleColon() { // accept `yield` in non-generator functions @Override - protected Expression parseMaybeAssign( - boolean noIn, DestructuringErrors refDestructuringErrors, AfterLeftParse afterLeftParse) { + protected Expression parseMaybeAssign(boolean noIn, AfterLeftParse afterLeftParse) { if (options.mozExtensions() && isContextual("yield")) { if (!this.inFunction) this.raise(this.startLoc, "Yield not in function"); return this.parseYield(); } - return super.parseMaybeAssign(noIn, refDestructuringErrors, afterLeftParse); + return super.parseMaybeAssign(noIn, afterLeftParse); } // add parsing of comprehensions @@ -309,12 +308,12 @@ protected ComprehensionExpression parseComprehension( } else { this.expect(TokenType._in); } - Expression right = this.parseExpression(false, null); + Expression right = this.parseExpression(false); this.expect(TokenType.parenR); blocks.add(this.finishNode(new ComprehensionBlock(blockStart, (IPattern) left, right, of))); } Expression filter = this.eat(TokenType._if) ? this.parseParenExpression() : null; - if (body == null) body = this.parseExpression(false, null); + if (body == null) body = this.parseExpression(false); return new ComprehensionExpression( new SourceLocation(startLoc), body, blocks, filter, isGenerator); @@ -353,13 +352,11 @@ protected Expression parseParenAndDistinguishExpression(boolean canBeArrow) { @Override protected boolean parseParenthesisedExpression( - DestructuringErrors refDestructuringErrors, boolean allowTrailingComma, ParenthesisedExpressions parenExprs, boolean first) { boolean cont = - super.parseParenthesisedExpression( - refDestructuringErrors, allowTrailingComma, parenExprs, first); + super.parseParenthesisedExpression(allowTrailingComma, parenExprs, first); if (options.mozExtensions() && parenExprs.exprList.size() == 1 && this.type == TokenType._for) { Expression body = parenExprs.exprList.remove(0); ComprehensionExpression c = parseComprehension(body.getLoc().getStart(), true, body); @@ -399,7 +396,7 @@ protected Expression parseNew() { && options.mozExtensions() && !canInsertSemicolon() && this.type == TokenType.braceL) { - ((NewExpression) res).getArguments().add(this.parseObj(false, null)); + ((NewExpression) res).getArguments().add(this.parseObj(false)); res = this.finishNode(res); } return res; @@ -465,7 +462,7 @@ protected Pair parseSubscript( if (options.e4x() && this.eat(TokenType.dot)) { SourceLocation start = new SourceLocation(startLoc); if (this.eat(TokenType.parenL)) { - Expression filter = parseExpression(false, null); + Expression filter = parseExpression(false); this.expect(TokenType.parenR); return Pair.make(this.finishNode(new XMLFilterExpression(start, base, filter)), true); } @@ -515,7 +512,7 @@ protected Expression parsePropertySelector(SourceLocation start) { */ protected Expression parseAttributeIdentifier(SourceLocation start) { if (this.eat(TokenType.bracketL)) { - Expression idx = parseExpression(false, null); + Expression idx = parseExpression(false); this.expect(TokenType.bracketR); return this.finishNode(new XMLAttributeSelector(start, idx, true)); } else { @@ -533,7 +530,7 @@ protected Expression parseDecoratorBody() { // followed by a right bracket, which will later be converted by // `decoratorToAttributeSelector` below List elements = new ArrayList<>(); - elements.add(parseExpression(false, null)); + elements.add(parseExpression(false)); this.expect(TokenType.bracketR); return this.finishNode(new ArrayExpression(start, elements)); } diff --git a/javascript/extractor/src/com/semmle/jcorn/ESNextParser.java b/javascript/extractor/src/com/semmle/jcorn/ESNextParser.java index 1eff68a30385..edc6fb9bf632 100644 --- a/javascript/extractor/src/com/semmle/jcorn/ESNextParser.java +++ b/javascript/extractor/src/com/semmle/jcorn/ESNextParser.java @@ -59,17 +59,14 @@ public ESNextParser(Options options, String input, int startPos) { */ @Override - protected Property parseProperty( - boolean isPattern, - DestructuringErrors refDestructuringErrors, - Map propHash) { + protected Property parseProperty(boolean isPattern, Map propHash) { Position start = this.startLoc; List decorators = parseDecorators(); Property prop = null; if (this.type == TokenType.ellipsis) { - SpreadElement spread = this.parseSpread(null); + SpreadElement spread = this.parseSpread(); Expression val; if (isPattern) val = new RestElement(spread.getLoc(), spread.getArgument()); else val = spread; @@ -79,7 +76,7 @@ protected Property parseProperty( new SourceLocation(start), null, val, Property.Kind.INIT.name(), false, false)); } - if (prop == null) prop = super.parseProperty(isPattern, refDestructuringErrors, propHash); + if (prop == null) prop = super.parseProperty(isPattern, propHash); prop.addDecorators(decorators); @@ -129,7 +126,7 @@ protected FieldDefinition parseFieldDefinition(PropertyInfo pi, boolean isStatic this.next(); boolean oldInFunc = this.inFunction; this.inFunction = true; - value = parseMaybeAssign(false, null, null); + value = parseMaybeAssign(false, null); this.inFunction = oldInFunc; } this.semicolon(); @@ -220,7 +217,7 @@ protected Statement parseStatement(boolean declaration, boolean topLevel, Set decorators = parseDecorators(); ClassExpression ce = (ClassExpression) this.parseClass(startLoc, false); @@ -232,7 +229,7 @@ protected Expression parseExprAtom(DestructuringErrors refDestructuringErrors) { this.next(); int innerStart = this.start; Position innerStartLoc = this.startLoc; - Expression callee = parseSubscripts(parseExprAtom(null), innerStart, innerStartLoc, true); + Expression callee = parseSubscripts(parseExprAtom(), innerStart, innerStartLoc, true); if (!(callee instanceof MemberExpression)) this.raiseRecoverable(callee, "Binding should be performed on a member expression."); return this.finishNode(new BindExpression(startLoc, null, callee)); @@ -246,7 +243,7 @@ protected Expression parseExprAtom(DestructuringErrors refDestructuringErrors) { this.expect(TokenType.parenL); return parseDynamicImport(startLoc); } - return super.parseExprAtom(refDestructuringErrors); + return super.parseExprAtom(); } @Override @@ -373,7 +370,7 @@ private boolean functionBind() { protected Pair parseSubscript( Expression base, Position startLoc, boolean noCalls) { if (!noCalls && this.eat(doubleColon)) { - Expression callee = parseSubscripts(parseExprAtom(null), this.start, this.startLoc, true); + Expression callee = parseSubscripts(parseExprAtom(), this.start, this.startLoc, true); BindExpression bind = new BindExpression(new SourceLocation(startLoc), base, callee); return Pair.make(this.finishNode(bind), true); } @@ -438,11 +435,11 @@ private MetaProperty parseImportMeta(Position loc) { * already been consumed. */ private DynamicImport parseDynamicImport(Position startLoc) { - Expression source = parseMaybeAssign(false, null, null); + Expression source = parseMaybeAssign(false, null); Expression attributes = null; if (this.eat(TokenType.comma)) { if (this.type != TokenType.parenR) { // Skip if the comma was a trailing comma - attributes = this.parseMaybeAssign(false, null, null); + attributes = this.parseMaybeAssign(false, null); this.eat(TokenType.comma); // Allow trailing comma } } diff --git a/javascript/extractor/src/com/semmle/jcorn/Parser.java b/javascript/extractor/src/com/semmle/jcorn/Parser.java index cb9af6c6822c..315ed51be715 100644 --- a/javascript/extractor/src/com/semmle/jcorn/Parser.java +++ b/javascript/extractor/src/com/semmle/jcorn/Parser.java @@ -1239,32 +1239,6 @@ protected void unexpected() { unexpected((Integer) null); } - public static class DestructuringErrors { - private int shorthandAssign, trailingComma; - - public void reset() { - this.shorthandAssign = 0; - this.trailingComma = 0; - } - } - - protected boolean checkPatternErrors( - DestructuringErrors refDestructuringErrors, boolean andThrow) { - int trailing = refDestructuringErrors != null ? refDestructuringErrors.trailingComma : 0; - if (!andThrow) return trailing != 0; - if (trailing != 0) this.raise(trailing, "Comma is not permitted after the rest element"); - return false; - } - - protected boolean checkExpressionErrors( - DestructuringErrors refDestructuringErrors, boolean andThrow) { - int pos = refDestructuringErrors != null ? refDestructuringErrors.shorthandAssign : 0; - if (!andThrow) return pos != 0; - if (pos != 0) - this.raise(pos, "Shorthand property assignments are valid only in destructuring patterns"); - return false; - } - private void checkYieldAwaitInDefaultParams() { if (this.yieldPos > 0 && (this.awaitPos == 0 || this.yieldPos < this.awaitPos)) this.raise(this.yieldPos, "Yield expression cannot be a default value"); @@ -1367,20 +1341,16 @@ private void checkPropClash(Property prop, Map propHash) { // and, *if* the syntactic construct they handle is present, wrap // the AST node that the inner parser gave them in another node. - // Parse a full expression. The optional arguments are used to - // forbid the `in` operator (in for loops initalization expressions) - // and provide reference for storing '=' operator inside shorthand - // property assignment in contexts where both object expression - // and object pattern might appear (so it's possible to raise - // delayed syntax error at correct position). - protected Expression parseExpression(boolean noIn, DestructuringErrors refDestructuringErrors) { + // Parse a full expression. The argument is used to forbid the `in` operator + // (in for loops initialization expressions). + protected Expression parseExpression(boolean noIn) { Position startLoc = this.startLoc; - Expression expr = this.parseMaybeAssign(noIn, refDestructuringErrors, null); + Expression expr = this.parseMaybeAssign(noIn, null); if (this.type == TokenType.comma) { List expressions = CollectionUtil.makeList(expr); SequenceExpression node = new SequenceExpression(new SourceLocation(startLoc), expressions); while (this.eat(TokenType.comma)) - expressions.add(this.parseMaybeAssign(noIn, refDestructuringErrors, null)); + expressions.add(this.parseMaybeAssign(noIn, null)); return this.finishNode(node); } return expr; @@ -1392,46 +1362,32 @@ public interface AfterLeftParse { // Parse an assignment expression. This includes applications of // operators like `+=`. - protected Expression parseMaybeAssign( - boolean noIn, DestructuringErrors refDestructuringErrors, AfterLeftParse afterLeftParse) { + protected Expression parseMaybeAssign(boolean noIn, AfterLeftParse afterLeftParse) { if (this.inGenerator && this.isContextual("yield")) return this.parseYield(); - boolean ownDestructuringErrors = false; - if (refDestructuringErrors == null) { - refDestructuringErrors = new DestructuringErrors(); - ownDestructuringErrors = true; - } int startPos = this.start; Position startLoc = this.startLoc; if (this.type == TokenType.parenL || this.type == TokenType.name) this.potentialArrowAt = this.start; - Expression left = this.parseMaybeConditional(noIn, refDestructuringErrors); + Expression left = this.parseMaybeConditional(noIn); if (afterLeftParse != null) left = afterLeftParse.call(left, startPos, startLoc); if (this.type.isAssign) { - this.checkPatternErrors(refDestructuringErrors, true); - if (!ownDestructuringErrors) refDestructuringErrors.reset(); Expression l = this.type == TokenType.eq ? (Expression) this.toAssignable(left, false) : left; - refDestructuringErrors.shorthandAssign = - 0; // reset because shorthand default was used correctly String operator = String.valueOf(this.value); this.checkLVal(l, false, null); this.next(); - Expression r = this.parseMaybeAssign(noIn, null, null); + Expression r = this.parseMaybeAssign(noIn, null); AssignmentExpression node = new AssignmentExpression(new SourceLocation(startLoc), operator, l, r); return this.finishNode(node); - } else { - if (ownDestructuringErrors) this.checkExpressionErrors(refDestructuringErrors, true); } return left; } // Parse a ternary conditional (`?:`) operator. - protected Expression parseMaybeConditional( - boolean noIn, DestructuringErrors refDestructuringErrors) { + protected Expression parseMaybeConditional(boolean noIn) { Position startLoc = this.startLoc; - Expression expr = this.parseExprOps(noIn, refDestructuringErrors); - if (this.checkExpressionErrors(refDestructuringErrors, false)) return expr; + Expression expr = this.parseExprOps(noIn); if (this.eat(TokenType.question)) { return parseConditionalRest(noIn, startLoc, expr); } @@ -1439,20 +1395,19 @@ protected Expression parseMaybeConditional( } protected Expression parseConditionalRest(boolean noIn, Position start, Expression test) { - Expression consequent = this.parseMaybeAssign(false, null, null); + Expression consequent = this.parseMaybeAssign(false, null); this.expect(TokenType.colon); - Expression alternate = this.parseMaybeAssign(noIn, null, null); + Expression alternate = this.parseMaybeAssign(noIn, null); ConditionalExpression node = new ConditionalExpression(new SourceLocation(start), test, consequent, alternate); return this.finishNode(node); } // Start the precedence parser. - protected Expression parseExprOps(boolean noIn, DestructuringErrors refDestructuringErrors) { + protected Expression parseExprOps(boolean noIn) { int startPos = this.start; Position startLoc = this.startLoc; - Expression expr = this.parseMaybeUnary(refDestructuringErrors, false); - if (this.checkExpressionErrors(refDestructuringErrors, false)) return expr; + Expression expr = this.parseMaybeUnary(false); return this.parseExprOp(expr, startPos, startLoc, -1, noIn); } @@ -1472,7 +1427,7 @@ protected Expression parseExprOp( int startPos = this.start; Position startLoc = this.startLoc; Expression right = - this.parseExprOp(this.parseMaybeUnary(null, false), startPos, startLoc, prec, noIn); + this.parseExprOp(this.parseMaybeUnary(false), startPos, startLoc, prec, noIn); Expression node = this.buildBinary(leftStartPos, leftStartLoc, left, right, op, logical); return this.parseExprOp(node, leftStartPos, leftStartLoc, minPrec, noIn); } @@ -1496,8 +1451,7 @@ protected Expression buildBinary( } // Parse unary operators, both prefix and postfix. - protected Expression parseMaybeUnary( - DestructuringErrors refDestructuringErrors, boolean sawUnary) { + protected Expression parseMaybeUnary(boolean sawUnary) { int startPos = this.start; Position startLoc = this.startLoc; Expression expr; @@ -1508,21 +1462,19 @@ protected Expression parseMaybeUnary( String operator = String.valueOf(this.value); boolean update = this.type == TokenType.incDec; this.next(); - Expression argument = this.parseMaybeUnary(null, true); + Expression argument = this.parseMaybeUnary(true); SourceLocation loc = new SourceLocation(startLoc); Expression node = update ? new UpdateExpression(loc, operator, argument, true) : new UnaryExpression(loc, operator, argument, true); - this.checkExpressionErrors(refDestructuringErrors, true); if (update) this.checkLVal(argument, false, null); else if (this.strict && operator.equals("delete") && argument instanceof Identifier) this.raiseRecoverable(node, "Deleting local variable in strict mode"); else sawUnary = true; expr = this.finishNode(node); } else { - expr = this.parseExprSubscripts(refDestructuringErrors); - if (this.checkExpressionErrors(refDestructuringErrors, false)) return expr; + expr = this.parseExprSubscripts(); while (this.type.isPostfix && !this.canInsertSemicolon()) { UpdateExpression node = new UpdateExpression( @@ -1535,20 +1487,19 @@ else if (this.strict && operator.equals("delete") && argument instanceof Identif if (!sawUnary && this.eat(TokenType.starstar)) return this.buildBinary( - startPos, startLoc, expr, this.parseMaybeUnary(null, false), "**", false); + startPos, startLoc, expr, this.parseMaybeUnary(false), "**", false); else return expr; } // Parse call, dot, and `[]`-subscript expressions. - protected Expression parseExprSubscripts(DestructuringErrors refDestructuringErrors) { + protected Expression parseExprSubscripts() { int startPos = this.start; Position startLoc = this.startLoc; - Expression expr = this.parseExprAtom(refDestructuringErrors); + Expression expr = this.parseExprAtom(); boolean skipArrowSubscripts = expr instanceof ArrowFunctionExpression && !inputSubstring(this.lastTokStart, this.lastTokEnd).equals(")"); - if (this.checkExpressionErrors(refDestructuringErrors, false) || skipArrowSubscripts) - return expr; + if (skipArrowSubscripts) return expr; return this.parseSubscripts(expr, startPos, startLoc, false); } @@ -1578,28 +1529,24 @@ protected Pair parseSubscript( new MemberExpression( new SourceLocation(startLoc), base, - this.parseExpression(false, null), + this.parseExpression(false), true, optional, Chainable.isOnOptionalChain(optional, base)); this.expect(TokenType.bracketR); return Pair.make(this.finishNode(node), true); } else if (!noCalls && this.eat(TokenType.parenL)) { - DestructuringErrors refDestructuringErrors = new DestructuringErrors(); int oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos; this.yieldPos = 0; this.awaitPos = 0; List exprList = - this.parseExprList( - TokenType.parenR, this.options.ecmaVersion() >= 8, false, refDestructuringErrors); + this.parseExprList(TokenType.parenR, this.options.ecmaVersion() >= 8, false); if (maybeAsyncArrow && shouldParseAsyncArrow()) { - this.checkPatternErrors(refDestructuringErrors, true); this.checkYieldAwaitInDefaultParams(); this.yieldPos = oldYieldPos; this.awaitPos = oldAwaitPos; return Pair.make(this.parseArrowExpression(startLoc, exprList, true), false); } - this.checkExpressionErrors(refDestructuringErrors, true); if (oldYieldPos > 0) this.yieldPos = oldYieldPos; if (oldAwaitPos > 0) this.awaitPos = oldAwaitPos; CallExpression node = @@ -1642,7 +1589,7 @@ protected boolean shouldParseAsyncArrow() { // expression, an expression started by a keyword like `function` or // `new`, or an expression wrapped in punctuation like `()`, `[]`, // or `{}`. - protected Expression parseExprAtom(DestructuringErrors refDestructuringErrors) { + protected Expression parseExprAtom() { Expression node; boolean canBeArrow = this.potentialArrowAt == this.start; if (this.type == TokenType._super) { @@ -1700,12 +1647,11 @@ protected Expression parseExprAtom(DestructuringErrors refDestructuringErrors) { } else if (this.type == TokenType.bracketL) { Position startLoc = this.startLoc; this.next(); - List elements = - this.parseExprList(TokenType.bracketR, true, true, refDestructuringErrors); + List elements = this.parseExprList(TokenType.bracketR, true, true); node = new ArrayExpression(new SourceLocation(startLoc), elements); return this.finishNode(node); } else if (this.type == TokenType.braceL) { - return this.parseObj(false, refDestructuringErrors); + return this.parseObj(false); } else if (this.type == TokenType._function) { Position startLoc = this.startLoc; this.next(); @@ -1734,7 +1680,7 @@ protected Literal parseLiteral(TokenType tokenType, Object value) { protected Expression parseParenExpression() { this.expect(TokenType.parenL); - Expression val = this.parseExpression(false, null); + Expression val = this.parseExpression(false); this.expect(TokenType.parenR); return val; } @@ -1745,12 +1691,10 @@ protected Expression parseParenAndDistinguishExpression(boolean canBeArrow) { if (this.options.ecmaVersion() >= 6) { this.next(); - DestructuringErrors refDestructuringErrors = new DestructuringErrors(); int oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos; - ParenthesisedExpressions parenExprs = parseParenthesisedExpressions(refDestructuringErrors); + ParenthesisedExpressions parenExprs = parseParenthesisedExpressions(); if (canBeArrow && !this.canInsertSemicolon() && this.eat(TokenType.arrow)) { - this.checkPatternErrors(refDestructuringErrors, true); this.checkYieldAwaitInDefaultParams(); if (parenExprs.innerParenStart != 0) this.unexpected(parenExprs.innerParenStart); this.yieldPos = oldYieldPos; @@ -1761,7 +1705,6 @@ protected Expression parseParenAndDistinguishExpression(boolean canBeArrow) { if (parenExprs.exprList.isEmpty() || parenExprs.lastIsComma) this.unexpected(this.lastTokStart); if (parenExprs.spreadStart != 0) this.unexpected(parenExprs.spreadStart); - this.checkExpressionErrors(refDestructuringErrors, true); if (oldYieldPos > 0) this.yieldPos = oldYieldPos; if (oldAwaitPos > 0) this.awaitPos = oldAwaitPos; @@ -1803,8 +1746,7 @@ protected static class ParenthesisedExpressions { boolean lastIsComma; } - protected ParenthesisedExpressions parseParenthesisedExpressions( - DestructuringErrors refDestructuringErrors) { + protected ParenthesisedExpressions parseParenthesisedExpressions() { boolean allowTrailingComma = this.options.ecmaVersion() >= 8; ParenthesisedExpressions parenExprs = new ParenthesisedExpressions(); parenExprs.startLoc = this.startLoc; @@ -1814,8 +1756,7 @@ protected ParenthesisedExpressions parseParenthesisedExpressions( while (this.type != TokenType.parenR) { if (first) first = false; else this.expect(TokenType.comma); - if (!parseParenthesisedExpression( - refDestructuringErrors, allowTrailingComma, parenExprs, first)) break; + if (!parseParenthesisedExpression(allowTrailingComma, parenExprs, first)) break; } parenExprs.endLoc = this.startLoc; this.expect(TokenType.parenR); @@ -1829,7 +1770,6 @@ protected ParenthesisedExpressions parseParenthesisedExpressions( * @return true if more expressions may follow this one, false if it must be the last one */ protected boolean parseParenthesisedExpression( - DestructuringErrors refDestructuringErrors, boolean allowTrailingComma, ParenthesisedExpressions parenExprs, boolean first) { @@ -1839,15 +1779,14 @@ protected boolean parseParenthesisedExpression( } else if (this.type == TokenType.ellipsis) { parenExprs.spreadStart = this.start; parenExprs.exprList.add(this.parseParenItem(this.parseRest(false), -1, null)); - if (this.type == TokenType.comma) - this.raise(this.startLoc, "Comma is not permitted after the rest element"); + this.eat(TokenType.comma); return false; } else { if (this.type == TokenType.parenL && parenExprs.innerParenStart == 0) { parenExprs.innerParenStart = this.start; } parenExprs.exprList.add( - this.parseMaybeAssign(false, refDestructuringErrors, this::parseParenItem)); + this.parseMaybeAssign(false, this::parseParenItem)); } return true; } @@ -1879,7 +1818,7 @@ protected Expression parseNew() { int innerStartPos = this.start; Position innerStartLoc = this.startLoc; Expression callee = - this.parseSubscripts(this.parseExprAtom(null), innerStartPos, innerStartLoc, true); + this.parseSubscripts(this.parseExprAtom(), innerStartPos, innerStartLoc, true); if (Chainable.isOnOptionalChain(false, callee)) this.raise(callee, "An optional chain may not be used in a `new` expression."); @@ -1891,7 +1830,7 @@ protected Expression parseNewArguments(Position startLoc, Expression callee) { List arguments; if (this.eat(TokenType.parenL)) arguments = - this.parseExprList(TokenType.parenR, this.options.ecmaVersion() >= 8, false, null); + this.parseExprList(TokenType.parenR, this.options.ecmaVersion() >= 8, false); else arguments = new ArrayList(); NewExpression node = new NewExpression(new SourceLocation(startLoc), callee, new ArrayList<>(), arguments); @@ -1926,7 +1865,7 @@ protected TemplateLiteral parseTemplate(boolean isTagged) { List quasis = CollectionUtil.makeList(curElt); while (!curElt.isTail()) { this.expect(TokenType.dollarBraceL); - expressions.add(this.parseExpression(false, null)); + expressions.add(this.parseExpression(false)); this.expect(TokenType.braceR); quasis.add(curElt = this.parseTemplateElement(isTagged)); } @@ -1958,7 +1897,7 @@ MethodDefinition.Kind getMethodKind() { } // Parse an object literal or binding pattern. - protected Expression parseObj(boolean isPattern, DestructuringErrors refDestructuringErrors) { + protected Expression parseObj(boolean isPattern) { Position startLoc = this.startLoc; if (!isPattern && options.allowGeneratedCodeExprs() && charAt(pos) == '{') { // Parse mustache-style placeholder expression: {{ ... }} or {{{ ... }}} @@ -1978,7 +1917,7 @@ protected Expression parseObj(boolean isPattern, DestructuringErrors refDestruct first = false; } - properties.add(this.finishNode(parseProperty(isPattern, refDestructuringErrors, propHash))); + properties.add(this.finishNode(parseProperty(isPattern, propHash))); } SourceLocation loc = new SourceLocation(startLoc); Expression node = @@ -2022,10 +1961,7 @@ protected Expression parseGeneratedCodeExpr(Position startLoc, String openingDel bodyToken.getValue())); } - protected Property parseProperty( - boolean isPattern, - DestructuringErrors refDestructuringErrors, - Map propHash) { + protected Property parseProperty(boolean isPattern, Map propHash) { Position propStartLoc = this.startLoc; boolean isGenerator = false; if (this.options.ecmaVersion() >= 6) { @@ -2040,7 +1976,7 @@ protected Property parseProperty( } else { pi.isAsync = false; } - this.parsePropertyValue(pi, refDestructuringErrors); + this.parsePropertyValue(pi); Property prop = new Property( new SourceLocation(pi.startLoc), pi.key, pi.value, pi.kind, pi.computed, pi.method); @@ -2061,14 +1997,14 @@ private boolean isAsyncProp(PropertyInfo pi) { && !this.canInsertSemicolon(); } - protected void parsePropertyValue(PropertyInfo pi, DestructuringErrors refDestructuringErrors) { + protected void parsePropertyValue(PropertyInfo pi) { if ((pi.isGenerator || pi.isAsync) && this.type == TokenType.colon) this.unexpected(); if (this.eat(TokenType.colon)) { pi.value = pi.isPattern ? this.parseMaybeDefault(this.startLoc, null) - : this.parseMaybeAssign(false, refDestructuringErrors, null); + : this.parseMaybeAssign(false, null); pi.kind = "init"; } else if (this.options.ecmaVersion() >= 6 && this.type == TokenType.parenL) { if (pi.isPattern) this.unexpected(); @@ -2108,9 +2044,7 @@ protected void parsePropertyValue(PropertyInfo pi, DestructuringErrors refDestru pi.kind = "init"; if (pi.isPattern) { pi.value = this.parseMaybeDefault(pi.startLoc, pi.key); - } else if (this.type == TokenType.eq && refDestructuringErrors != null) { - if (refDestructuringErrors.shorthandAssign == 0) - refDestructuringErrors.shorthandAssign = this.start; + } else if (this.type == TokenType.eq) { pi.value = this.parseMaybeDefault(pi.startLoc, pi.key); } else { pi.value = pi.key; @@ -2123,14 +2057,14 @@ protected void parsePropertyValue(PropertyInfo pi, DestructuringErrors refDestru protected void parsePropertyName(PropertyInfo result) { if (this.options.ecmaVersion() >= 6) { if (this.eat(TokenType.bracketL)) { - result.key = this.parseMaybeAssign(false, null, null); + result.key = this.parseMaybeAssign(false, null); result.computed = true; this.expect(TokenType.bracketR); return; } } if (this.type == TokenType.num || this.type == TokenType.string) - result.key = this.parseExprAtom(null); + result.key = this.parseExprAtom(); else result.key = this.parseIdent(true); } @@ -2191,7 +2125,7 @@ protected Node parseFunctionBody( boolean isExpression = isArrowFunction && this.type != TokenType.braceL; Node body; if (isExpression) { - body = this.parseMaybeAssign(false, null, null); + body = this.parseMaybeAssign(false, null); } else { // Start a new scope with regard to labels and the `inFunction` // flag (restore them to their old value afterwards). @@ -2247,10 +2181,7 @@ protected void checkParams(List params) { // nothing in between them to be parsed as `null` (which is needed // for array literals). protected List parseExprList( - TokenType close, - boolean allowTrailingComma, - boolean allowEmpty, - DestructuringErrors refDestructuringErrors) { + TokenType close, boolean allowTrailingComma, boolean allowEmpty) { List elts = new ArrayList(); boolean first = true; while (!this.eat(close)) { @@ -2265,14 +2196,9 @@ protected List parseExprList( if (allowEmpty && this.type == TokenType.comma) { elt = null; } else if (this.type == TokenType.ellipsis) { - elt = this.processExprListItem(this.parseSpread(refDestructuringErrors)); - if (this.type == TokenType.comma - && refDestructuringErrors != null - && refDestructuringErrors.trailingComma == 0) { - refDestructuringErrors.trailingComma = this.start; - } + elt = this.processExprListItem(this.parseSpread()); } else - elt = this.processExprListItem(this.parseMaybeAssign(false, refDestructuringErrors, null)); + elt = this.processExprListItem(this.parseMaybeAssign(false, null)); elts.add(elt); } return elts; @@ -2335,7 +2261,7 @@ protected YieldExpression parseYield() { argument = null; } else { delegate = this.eat(TokenType.star); - argument = this.parseMaybeAssign(false, null, null); + argument = this.parseMaybeAssign(false, null); } YieldExpression node = new YieldExpression(new SourceLocation(startLoc), argument, delegate); return this.finishNode(node); @@ -2344,7 +2270,7 @@ protected YieldExpression parseYield() { protected AwaitExpression parseAwait() { Position startLoc = this.startLoc; this.next(); - Expression argument = this.parseMaybeUnary(null, true); + Expression argument = this.parseMaybeUnary(true); AwaitExpression node = new AwaitExpression(new SourceLocation(startLoc), argument); return this.finishNode(node); } @@ -2451,12 +2377,11 @@ protected List toAssignableList(List exprList, boolean i } // Parses spread element. - protected SpreadElement parseSpread(DestructuringErrors refDestructuringErrors) { + protected SpreadElement parseSpread() { Position start = this.startLoc; this.next(); SpreadElement node = - new SpreadElement( - new SourceLocation(start), this.parseMaybeAssign(false, refDestructuringErrors, null)); + new SpreadElement(new SourceLocation(start), this.parseMaybeAssign(false, null)); return this.finishNode(node); } @@ -2488,7 +2413,7 @@ protected Expression parseBindingAtom() { return this.finishNode(node); } - if (this.type == TokenType.braceL) return this.parseObj(true, null); + if (this.type == TokenType.braceL) return this.parseObj(true); return this.parseIdent(false); } @@ -2506,8 +2431,7 @@ protected List parseBindingList( break; } else if (this.type == TokenType.ellipsis) { result.add(this.processBindingListItem(this.parseRest(allowNonIdent))); - if (this.type == TokenType.comma) - this.raise(this.start, "Comma is not permitted after the rest element"); + this.eat(TokenType.comma); this.expect(close); break; } else { @@ -2527,7 +2451,7 @@ protected Expression parseMaybeDefault(Position startLoc, Expression left) { if (this.options.ecmaVersion() < 6 || !this.eat(TokenType.eq)) return left; AssignmentPattern node = new AssignmentPattern( - new SourceLocation(startLoc), "=", left, this.parseMaybeAssign(false, null, null)); + new SourceLocation(startLoc), "=", left, this.parseMaybeAssign(false, null)); return this.finishNode(node); } @@ -2826,7 +2750,7 @@ protected Statement parseStatement(boolean declaration, boolean topLevel, Set= 6 && this.isContextual("of"))) { - this.checkPatternErrors(refDestructuringErrors, true); init = (Expression) this.toAssignable(init, false); this.checkLVal(init, false, null); return this.parseForIn(startLoc, init); - } else { - this.checkExpressionErrors(refDestructuringErrors, true); } return this.parseFor(startLoc, init); } @@ -2972,7 +2892,7 @@ protected ReturnStatement parseReturnStatement(Position startLoc) { if (this.eagerlyTrySemicolon()) { argument = null; } else { - argument = this.parseExpression(false, null); + argument = this.parseExpression(false); this.semicolon(); } return this.finishNode(new ReturnStatement(new SourceLocation(startLoc), argument)); @@ -3005,7 +2925,7 @@ protected SwitchStatement parseSwitchStatement(Position startLoc) { curConsequent = new ArrayList(); this.next(); if (isCase) { - curTest = this.parseExpression(false, null); + curTest = this.parseExpression(false); } else { if (sawDefault) this.raiseRecoverable(this.lastTokStart, "Multiple default clauses"); sawDefault = true; @@ -3031,7 +2951,7 @@ protected ThrowStatement parseThrowStatement(Position startLoc) { this.next(); if (inputSubstring(this.lastTokEnd, this.start).matches("(?s).*(?:" + lineBreak + ").*")) this.raise(this.lastTokEnd, "Illegal newline after throw"); - Expression argument = this.parseExpression(false, null); + Expression argument = this.parseExpression(false); this.semicolon(); return this.finishNode(new ThrowStatement(new SourceLocation(startLoc), argument)); } @@ -3144,9 +3064,9 @@ protected BlockStatement parseBlock(boolean allowStrict) { // expression. protected ForStatement parseFor(Position startLoc, Node init) { this.expect(TokenType.semi); - Expression test = this.type == TokenType.semi ? null : this.parseExpression(false, null); + Expression test = this.type == TokenType.semi ? null : this.parseExpression(false); this.expect(TokenType.semi); - Expression update = this.type == TokenType.parenR ? null : this.parseExpression(false, null); + Expression update = this.type == TokenType.parenR ? null : this.parseExpression(false); this.expect(TokenType.parenR); Statement body = this.parseStatement(false, false); this.labels.pop(); @@ -3160,7 +3080,7 @@ protected Statement parseForIn(Position startLoc, Node left) { SourceLocation loc = new SourceLocation(startLoc); boolean isForIn = this.type == TokenType._in; this.next(); - Expression right = this.parseExpression(false, null); + Expression right = this.parseExpression(false); this.expect(TokenType.parenR); Statement body = this.parseStatement(false, false); this.labels.pop(); @@ -3178,7 +3098,7 @@ protected VariableDeclaration parseVar(Position startLoc, boolean isFor, String Expression id = this.parseVarId(); Expression init = null; if (this.eat(TokenType.eq)) { - init = this.parseMaybeAssign(isFor, null, null); + init = this.parseMaybeAssign(isFor, null); } else if ((kind.equals("const") || kind.equals("using")) && !(this.type == TokenType._in || (this.options.ecmaVersion() >= 6 && this.isContextual("of")))) { @@ -3415,7 +3335,7 @@ protected Identifier parseClassId(boolean isStatement) { } protected Expression parseClassSuper() { - return this.eat(TokenType._extends) ? this.parseExprSubscripts(null) : null; + return this.eat(TokenType._extends) ? this.parseExprSubscripts() : null; } // Parses module export declaration. @@ -3462,7 +3382,7 @@ protected ExportDeclaration parseExportRest(SourceLocation loc, Set expo new ClassDeclaration(ce.getLoc(), ce.getClassDef(), noDeclareKeyword, notAbstract); else declaration = ce; } else { - declaration = this.parseMaybeAssign(false, null, null); + declaration = this.parseMaybeAssign(false, null); this.semicolon(); } return this.finishNode(new ExportDefaultDeclaration(loc, declaration)); @@ -3497,7 +3417,7 @@ protected ExportDeclaration parseExportRest(SourceLocation loc, Set expo protected Expression parseExportFrom( List specifiers, Expression source, boolean expectFrom) { if (this.eatContextual("from")) { - if (this.type == TokenType.string) source = this.parseExprAtom(null); + if (this.type == TokenType.string) source = this.parseExprAtom(); else this.unexpected(); } else { if (expectFrom) this.unexpected(); @@ -3576,7 +3496,7 @@ protected List parseExportSpecifiers(Set exports) { } else { if (this.type == TokenType.string) { // e.g. `export { Foo_new as "Foo::new" }` - Expression string = this.parseExprAtom(null); + Expression string = this.parseExprAtom(); String str = ((Literal)string).getStringValue(); exported = this.finishNode(new Identifier(loc, str)); } else { @@ -3609,7 +3529,7 @@ protected ImportDeclaration parseLegacyModuleImport(Position startLoc) { this.checkLVal(local, true, null); this.expectContextual("from"); if (this.type != TokenType.string) this.unexpected(); - Literal source = (Literal) this.parseExprAtom(null); + Literal source = (Literal) this.parseExprAtom(); this.semicolon(); List specifiers = new ArrayList(); @@ -3625,7 +3545,7 @@ protected Expression parseImportOrExportAttributesAndSemicolon() { if (!this.eatContextual("assert")) { this.expect(TokenType._with); } - result = this.parseObj(false, null); + result = this.parseObj(false); this.semicolon(); } return result; @@ -3638,12 +3558,12 @@ protected ImportDeclaration parseImportRest(SourceLocation loc) { // import '...' if (this.type == TokenType.string) { specifiers = new ArrayList(); - source = (Literal) this.parseExprAtom(null); + source = (Literal) this.parseExprAtom(); } else { specifiers = this.parseImportSpecifiers(phaseModifier); this.expectContextual("from"); if (this.type != TokenType.string) this.unexpected(); - source = (Literal) this.parseExprAtom(null); + source = (Literal) this.parseExprAtom(); } Expression attributes = this.parseImportOrExportAttributesAndSemicolon(); if (specifiers == null) return null; @@ -3698,7 +3618,7 @@ protected ImportSpecifier parseImportSpecifier() { if (this.type == TokenType.string) { // Arbitrary Module Namespace Identifiers // e.g. `import { "Foo::new" as Foo_new } from "./foo.wasm"` - Expression string = this.parseExprAtom(null); + Expression string = this.parseExprAtom(); String str = ((Literal)string).getStringValue(); imported = this.finishNode(new Identifier(loc, str)); // only makes sense if there is a local identifier diff --git a/javascript/extractor/src/com/semmle/jcorn/flow/FlowParser.java b/javascript/extractor/src/com/semmle/jcorn/flow/FlowParser.java index 7475994c27ed..ec7d4c74e4ad 100644 --- a/javascript/extractor/src/com/semmle/jcorn/flow/FlowParser.java +++ b/javascript/extractor/src/com/semmle/jcorn/flow/FlowParser.java @@ -237,7 +237,7 @@ private void flowParseDeclareModule(Position start) { this.next(); if (this.type == TokenType.string) { - this.parseExprAtom(null); + this.parseExprAtom(); } else { this.parseIdent(false); } @@ -458,7 +458,7 @@ private void flowParseTypeParameterInstantiation() { private void flowParseObjectPropertyKey() { if (this.type == TokenType.num || this.type == TokenType.string) { - this.parseExprAtom(null); + this.parseExprAtom(); } else if ("@@iterator".equals(inputSubstring(start, start + 10))) { // allow `@@iterator` as property name; this doesn't appear to be standard Flow syntax, // but is used a few times in react-native @@ -1158,9 +1158,8 @@ protected Expression parseConditionalRest(boolean noIn, Position start, Expressi } @Override - protected ParenthesisedExpressions parseParenthesisedExpressions( - DestructuringErrors refDestructuringErrors) { - ParenthesisedExpressions pe = super.parseParenthesisedExpressions(refDestructuringErrors); + protected ParenthesisedExpressions parseParenthesisedExpressions() { + ParenthesisedExpressions pe = super.parseParenthesisedExpressions(); // handle return types for arrow functions if (flow() && this.type == TokenType.colon) { @@ -1218,14 +1217,14 @@ protected FieldDefinition parseFieldDefinition(PropertyInfo pi, boolean isStatic // parse type parameters for object method shorthand @Override - protected void parsePropertyValue(PropertyInfo pi, DestructuringErrors refDestructuringErrors) { + protected void parsePropertyValue(PropertyInfo pi) { // method shorthand if (flow() && this.isRelational("<")) { this.flowParseTypeParameterDeclaration(); if (this.type != TokenType.parenL) this.unexpected(); } - super.parsePropertyValue(pi, refDestructuringErrors); + super.parsePropertyValue(pi); } @Override diff --git a/javascript/extractor/src/com/semmle/jcorn/jsx/JSXParser.java b/javascript/extractor/src/com/semmle/jcorn/jsx/JSXParser.java index 6deec72809c3..cabdb9c1e4fd 100644 --- a/javascript/extractor/src/com/semmle/jcorn/jsx/JSXParser.java +++ b/javascript/extractor/src/com/semmle/jcorn/jsx/JSXParser.java @@ -276,7 +276,7 @@ private INode jsx_parseAttributeValue() { this.raise(node, "JSX attributes must only be assigned a non-empty expression"); return node; } else if (type == jsxTagStart || type == string) { - return this.parseExprAtom(null); + return this.parseExprAtom(); } else { this.raise(this.start, "JSX value should be either an expression or a quoted JSX text"); return null; @@ -298,7 +298,7 @@ private JSXExpressionContainer jsx_parseExpressionContainer() { this.next(); INode expression; if (this.type == braceR) expression = this.jsx_parseEmptyExpression(); - else expression = this.parseExpression(false, null); + else expression = this.parseExpression(false); this.expect(braceR); return this.finishNode(new JSXExpressionContainer(loc, expression)); } @@ -308,7 +308,7 @@ private IJSXAttribute jsx_parseAttribute() { SourceLocation loc = new SourceLocation(this.startLoc); if (this.eat(braceL)) { this.expect(ellipsis); - Expression argument = this.parseMaybeAssign(false, null, null); + Expression argument = this.parseMaybeAssign(false, null); this.expect(braceR); return this.finishNode(new JSXSpreadAttribute(loc, argument)); } @@ -358,7 +358,7 @@ private JSXElement jsx_parseElementAt(Position startLoc) { } children.add(this.jsx_parseElementAt(startLoc)); } else if (type == jsxText) { - children.add(this.parseExprAtom(null)); + children.add(this.parseExprAtom()); } else if (type == braceL) { children.add(this.jsx_parseExpressionContainer()); } else { @@ -389,13 +389,13 @@ private JSXElement jsx_parseElement() { } @Override - protected Expression parseExprAtom(DestructuringErrors refDestructuringErrors) { + protected Expression parseExprAtom() { if (this.type == jsxText) { return this.parseLiteral(this.type, this.value); } else if (this.type == jsxTagStart) { return this.jsx_parseElement(); } else { - return super.parseExprAtom(refDestructuringErrors); + return super.parseExprAtom(); } } diff --git a/javascript/extractor/test/com/semmle/js/extractor/test/RobustnessTests.java b/javascript/extractor/test/com/semmle/js/extractor/test/RobustnessTests.java index 1bc64fc8ffa6..bd8187c5196e 100644 --- a/javascript/extractor/test/com/semmle/js/extractor/test/RobustnessTests.java +++ b/javascript/extractor/test/com/semmle/js/extractor/test/RobustnessTests.java @@ -16,4 +16,15 @@ public void letLookheadTest() { String src = new WholeIO(StandardCharsets.UTF_8.name()).strictread(test); new Parser(new Options(), src, 0).parse(); } + + @Test + public void permissiveDestructuringTest() { + String src = + "({ shorthand = 1 });\n" + + "([...rest,] = values);\n" + + "function f(...args,) {}\n" + + "const arrow = (...args,) => args;\n" + + "async (...args,) => args;\n"; + new Parser(new Options(), src, 0).parse(); + } } From d3b999e76da5ba2ee66c2e48e306a20f5d76eaf7 Mon Sep 17 00:00:00 2001 From: Asger F Date: Mon, 21 Sep 2026 09:09:33 +0200 Subject: [PATCH 1171/2098] JS: Allow destructuring rest patterns --- .../src/com/semmle/jcorn/Parser.java | 32 +++++-------------- .../js/extractor/test/RobustnessTests.java | 5 ++- 2 files changed, 12 insertions(+), 25 deletions(-) diff --git a/javascript/extractor/src/com/semmle/jcorn/Parser.java b/javascript/extractor/src/com/semmle/jcorn/Parser.java index 315ed51be715..a6eeb86c74a2 100644 --- a/javascript/extractor/src/com/semmle/jcorn/Parser.java +++ b/javascript/extractor/src/com/semmle/jcorn/Parser.java @@ -1778,7 +1778,7 @@ protected boolean parseParenthesisedExpression( return false; } else if (this.type == TokenType.ellipsis) { parenExprs.spreadStart = this.start; - parenExprs.exprList.add(this.parseParenItem(this.parseRest(false), -1, null)); + parenExprs.exprList.add(this.parseParenItem(this.parseRest(), -1, null)); this.eat(TokenType.comma); return false; } else { @@ -2081,7 +2081,7 @@ protected FunctionExpression parseMethod(boolean isGenerator, boolean isAsync) { this.expect(TokenType.parenL); List params = - this.parseBindingList(TokenType.parenR, false, this.options.ecmaVersion() >= 8, false); + this.parseBindingList(TokenType.parenR, false, this.options.ecmaVersion() >= 8); this.checkYieldAwaitInDefaultParams(); boolean generator = this.options.ecmaVersion() >= 6 && isGenerator; Node body = this.parseFunctionBody(null, params, false); @@ -2359,17 +2359,9 @@ protected List toAssignableList(List exprList, boolean i } else if (last != null && last instanceof SpreadElement) { Expression arg = ((SpreadElement) last).getArgument(); arg = (Expression) this.toAssignable(arg, isBinding); - if (!(arg instanceof Identifier - || arg instanceof MemberExpression - || arg instanceof ArrayPattern)) this.unexpected(arg.getLoc().getStart()); exprList.set(end - 1, last = new RestElement(last.getLoc(), arg)); --end; } - - if (isBinding - && last instanceof RestElement - && !(((RestElement) last).getArgument() instanceof Identifier)) - this.unexpected(((RestElement) last).getArgument().getLoc().getStart()); } for (int i = 0; i < end; ++i) exprList.set(i, (Expression) this.toAssignable(exprList.get(i), isBinding)); @@ -2385,18 +2377,10 @@ protected SpreadElement parseSpread() { return this.finishNode(node); } - protected RestElement parseRest(boolean allowNonIdent) { + protected RestElement parseRest() { Position start = this.startLoc; this.next(); - - // RestElement inside of a function parameter must be an identifier - Expression argument = null; - if (allowNonIdent) - if (this.type == TokenType.name) argument = this.parseIdent(false); - else this.unexpected(); - else if (this.type == TokenType.name || this.type == TokenType.bracketL) - argument = this.parseBindingAtom(); - else this.unexpected(); + Expression argument = this.parseBindingAtom(); RestElement node = new RestElement(new SourceLocation(start), argument); return this.finishNode(node); } @@ -2408,7 +2392,7 @@ protected Expression parseBindingAtom() { if (this.type == TokenType.bracketL) { Position start = this.startLoc; this.next(); - List elements = this.parseBindingList(TokenType.bracketR, true, true, false); + List elements = this.parseBindingList(TokenType.bracketR, true, true); ArrayPattern node = new ArrayPattern(new SourceLocation(start), elements); return this.finishNode(node); } @@ -2419,7 +2403,7 @@ protected Expression parseBindingAtom() { } protected List parseBindingList( - TokenType close, boolean allowEmpty, boolean allowTrailingComma, boolean allowNonIdent) { + TokenType close, boolean allowEmpty, boolean allowTrailingComma) { List result = new ArrayList(); boolean first = true; while (!this.eat(close)) { @@ -2430,7 +2414,7 @@ protected List parseBindingList( } else if (allowTrailingComma && this.afterTrailingComma(close, false)) { break; } else if (this.type == TokenType.ellipsis) { - result.add(this.processBindingListItem(this.parseRest(allowNonIdent))); + result.add(this.processBindingListItem(this.parseRest())); this.eat(TokenType.comma); this.expect(close); break; @@ -3200,7 +3184,7 @@ protected IFunction parseFunctionRest( protected List parseFunctionParams() { this.expect(TokenType.parenL); List params = - this.parseBindingList(TokenType.parenR, false, this.options.ecmaVersion() >= 8, true); + this.parseBindingList(TokenType.parenR, false, this.options.ecmaVersion() >= 8); this.checkYieldAwaitInDefaultParams(); return params; } diff --git a/javascript/extractor/test/com/semmle/js/extractor/test/RobustnessTests.java b/javascript/extractor/test/com/semmle/js/extractor/test/RobustnessTests.java index bd8187c5196e..7b91c59376fe 100644 --- a/javascript/extractor/test/com/semmle/js/extractor/test/RobustnessTests.java +++ b/javascript/extractor/test/com/semmle/js/extractor/test/RobustnessTests.java @@ -23,8 +23,11 @@ public void permissiveDestructuringTest() { "({ shorthand = 1 });\n" + "([...rest,] = values);\n" + "function f(...args,) {}\n" + + "function g(...[first, { nested }],) {}\n" + "const arrow = (...args,) => args;\n" - + "async (...args,) => args;\n"; + + "const destructuringArrow = (...{ value },) => value;\n" + + "async (...[first, { nested }],) => first;\n" + + "({ method(...{ value },) {} });\n"; new Parser(new Options(), src, 0).parse(); } } From bec80a819c3f0b90600cb10352ed5b8772983f63 Mon Sep 17 00:00:00 2001 From: Asger F Date: Mon, 21 Sep 2026 09:15:17 +0200 Subject: [PATCH 1172/2098] JS: Add data flow test with destructured rest params --- .../ql/test/library-tests/TripleDot/tst.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/javascript/ql/test/library-tests/TripleDot/tst.js b/javascript/ql/test/library-tests/TripleDot/tst.js index 6f776264e84f..f7aedbdcf339 100644 --- a/javascript/ql/test/library-tests/TripleDot/tst.js +++ b/javascript/ql/test/library-tests/TripleDot/tst.js @@ -172,3 +172,19 @@ function t16() { sink(array[2]); // $ hasValueFlow=t16.1 sink(array); // $ hasTaintFlow=t16.1 } + +function t17() { + function target(...[x, y]) { + sink(x); // $ hasValueFlow=t17.1 + sink(y); // $ hasValueFlow=t17.2 + } + target(source("t17.1"), source("t17.2"), source("t17.3")); +} + +function t18() { + function target(...{0: x, 1: y}) { + sink(x); // $ hasValueFlow=t18.1 + sink(y); // $ hasValueFlow=t18.2 + } + target(source("t18.1"), source("t18.2"), source("t18.3")); +} From 7356bf4e36b58fa2b83b6285078f5c32ca95adcb Mon Sep 17 00:00:00 2001 From: Asger F Date: Mon, 21 Sep 2026 09:26:40 +0200 Subject: [PATCH 1173/2098] JS: Update TRAP output This input file contained a destructuring rest parameter --- .../es2015/output/trap/restparms2.js.trap | 195 ++++++++++++++++-- 1 file changed, 173 insertions(+), 22 deletions(-) diff --git a/javascript/extractor/tests/es2015/output/trap/restparms2.js.trap b/javascript/extractor/tests/es2015/output/trap/restparms2.js.trap index e6faa776dd50..924b02a736d4 100644 --- a/javascript/extractor/tests/es2015/output/trap/restparms2.js.trap +++ b/javascript/extractor/tests/es2015/output/trap/restparms2.js.trap @@ -9,27 +9,178 @@ hasLocation(#10000,#10002) #20000=@"global_scope" scopes(#20000,0) #20001=@"script;{#10000},1,1" -toplevels(#20001,0) -#20002=@"loc,{#10000},1,1,1,1" -locations_default(#20002,#10000,1,1,1,1) -hasLocation(#20001,#20002) -#20003=* -js_parse_errors(#20003,#20001,"Error: Unexpected token","function f(x, ...[y, z]) { -") -#20004=@"loc,{#10000},1,18,1,18" -locations_default(#20004,#10000,1,18,1,18) -hasLocation(#20003,#20004) -#20005=* -lines(#20005,#20001,"function f(x, ...[y, z]) {"," +#20002=* +lines(#20002,#20001,"function f(x, ...[y, z]) {"," ") -#20006=@"loc,{#10000},1,1,1,26" -locations_default(#20006,#10000,1,1,1,26) -hasLocation(#20005,#20006) -#20007=* -lines(#20007,#20001,"}","") -#20008=@"loc,{#10000},2,1,2,1" -locations_default(#20008,#10000,2,1,2,1) -hasLocation(#20007,#20008) -numlines(#20001,2,0,0) -numlines(#10000,2,0,0) +#20003=@"loc,{#10000},1,1,1,26" +locations_default(#20003,#10000,1,1,1,26) +hasLocation(#20002,#20003) +#20004=* +lines(#20004,#20001,"}","") +#20005=@"loc,{#10000},2,1,2,1" +locations_default(#20005,#10000,2,1,2,1) +hasLocation(#20004,#20005) +numlines(#20001,2,2,0) +#20006=* +tokeninfo(#20006,7,#20001,0,"function") +#20007=@"loc,{#10000},1,1,1,8" +locations_default(#20007,#10000,1,1,1,8) +hasLocation(#20006,#20007) +#20008=* +tokeninfo(#20008,6,#20001,1,"f") +#20009=@"loc,{#10000},1,10,1,10" +locations_default(#20009,#10000,1,10,1,10) +hasLocation(#20008,#20009) +#20010=* +tokeninfo(#20010,8,#20001,2,"(") +#20011=@"loc,{#10000},1,11,1,11" +locations_default(#20011,#10000,1,11,1,11) +hasLocation(#20010,#20011) +#20012=* +tokeninfo(#20012,6,#20001,3,"x") +#20013=@"loc,{#10000},1,12,1,12" +locations_default(#20013,#10000,1,12,1,12) +hasLocation(#20012,#20013) +#20014=* +tokeninfo(#20014,8,#20001,4,",") +#20015=@"loc,{#10000},1,13,1,13" +locations_default(#20015,#10000,1,13,1,13) +hasLocation(#20014,#20015) +#20016=* +tokeninfo(#20016,8,#20001,5,"...") +#20017=@"loc,{#10000},1,15,1,17" +locations_default(#20017,#10000,1,15,1,17) +hasLocation(#20016,#20017) +#20018=* +tokeninfo(#20018,8,#20001,6,"[") +#20019=@"loc,{#10000},1,18,1,18" +locations_default(#20019,#10000,1,18,1,18) +hasLocation(#20018,#20019) +#20020=* +tokeninfo(#20020,6,#20001,7,"y") +#20021=@"loc,{#10000},1,19,1,19" +locations_default(#20021,#10000,1,19,1,19) +hasLocation(#20020,#20021) +#20022=* +tokeninfo(#20022,8,#20001,8,",") +#20023=@"loc,{#10000},1,20,1,20" +locations_default(#20023,#10000,1,20,1,20) +hasLocation(#20022,#20023) +#20024=* +tokeninfo(#20024,6,#20001,9,"z") +#20025=@"loc,{#10000},1,22,1,22" +locations_default(#20025,#10000,1,22,1,22) +hasLocation(#20024,#20025) +#20026=* +tokeninfo(#20026,8,#20001,10,"]") +#20027=@"loc,{#10000},1,23,1,23" +locations_default(#20027,#10000,1,23,1,23) +hasLocation(#20026,#20027) +#20028=* +tokeninfo(#20028,8,#20001,11,")") +#20029=@"loc,{#10000},1,24,1,24" +locations_default(#20029,#10000,1,24,1,24) +hasLocation(#20028,#20029) +#20030=* +tokeninfo(#20030,8,#20001,12,"{") +#20031=@"loc,{#10000},1,26,1,26" +locations_default(#20031,#10000,1,26,1,26) +hasLocation(#20030,#20031) +#20032=* +tokeninfo(#20032,8,#20001,13,"}") +hasLocation(#20032,#20005) +#20033=* +tokeninfo(#20033,0,#20001,14,"") +#20034=@"loc,{#10000},2,2,2,1" +locations_default(#20034,#10000,2,2,2,1) +hasLocation(#20033,#20034) +toplevels(#20001,0) +#20035=@"loc,{#10000},1,1,2,1" +locations_default(#20035,#10000,1,1,2,1) +hasLocation(#20001,#20035) +#20036=@"var;{f};{#20000}" +variables(#20036,"f",#20000) +#20037=@"var;{this};{#20000}" +variables(#20037,"this",#20000) +#20038=* +stmts(#20038,17,#20001,0,"functio ... z]) {\n}") +hasLocation(#20038,#20035) +stmt_containers(#20038,#20001) +#20039=* +exprs(#20039,78,#20038,-1,"f") +hasLocation(#20039,#20009) +expr_containers(#20039,#20038) +literals("f","f",#20039) +decl(#20039,#20036) +#20040=* +scopes(#20040,1) +scopenodes(#20038,#20040) +scopenesting(#20040,#20000) +#20041=@"var;{this};{#20040}" +variables(#20041,"this",#20040) +#20042=@"var;{x};{#20040}" +variables(#20042,"x",#20040) +#20043=* +exprs(#20043,78,#20038,0,"x") +hasLocation(#20043,#20013) +expr_containers(#20043,#20038) +literals("x","x",#20043) +decl(#20043,#20042) +#20044=@"var;{y};{#20040}" +variables(#20044,"y",#20040) +#20045=@"var;{z};{#20040}" +variables(#20045,"z",#20040) +#20046=* +exprs(#20046,67,#20038,1,"[y, z]") +#20047=@"loc,{#10000},1,18,1,23" +locations_default(#20047,#10000,1,18,1,23) +hasLocation(#20046,#20047) +expr_containers(#20046,#20038) +#20048=* +exprs(#20048,78,#20046,0,"y") +hasLocation(#20048,#20021) +expr_containers(#20048,#20038) +literals("y","y",#20048) +decl(#20048,#20044) +#20049=* +exprs(#20049,78,#20046,1,"z") +hasLocation(#20049,#20025) +expr_containers(#20049,#20038) +literals("z","z",#20049) +decl(#20049,#20045) +array_size(#20046,2) +#20050=@"var;{arguments};{#20040}" +variables(#20050,"arguments",#20040) +is_arguments_object(#20050) +has_rest_parameter(#20038) +#20051=* +stmts(#20051,1,#20038,-2,"{\n}") +#20052=@"loc,{#10000},1,26,2,1" +locations_default(#20052,#10000,1,26,2,1) +hasLocation(#20051,#20052) +stmt_containers(#20051,#20038) +#20053=* +entry_cfg_node(#20053,#20001) +#20054=@"loc,{#10000},1,1,1,0" +locations_default(#20054,#10000,1,1,1,0) +hasLocation(#20053,#20054) +#20055=* +exit_cfg_node(#20055,#20001) +hasLocation(#20055,#20034) +successor(#20038,#20055) +#20056=* +entry_cfg_node(#20056,#20038) +hasLocation(#20056,#20054) +#20057=* +exit_cfg_node(#20057,#20038) +hasLocation(#20057,#20034) +successor(#20051,#20057) +successor(#20046,#20048) +successor(#20049,#20051) +successor(#20048,#20049) +successor(#20043,#20046) +successor(#20056,#20043) +successor(#20039,#20038) +successor(#20053,#20039) +numlines(#10000,2,2,0) filetype(#10000,"javascript") From 627f35b5f80cd75af6ab069ad2c8bb77b99e9622 Mon Sep 17 00:00:00 2001 From: Asger F Date: Mon, 21 Sep 2026 09:36:56 +0200 Subject: [PATCH 1174/2098] JS: Ensure ParseError instead of CastError for malformed patterns --- .../extractor/src/com/semmle/jcorn/Parser.java | 1 + .../semmle/js/extractor/test/RobustnessTests.java | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/javascript/extractor/src/com/semmle/jcorn/Parser.java b/javascript/extractor/src/com/semmle/jcorn/Parser.java index a6eeb86c74a2..89326d4a0f39 100644 --- a/javascript/extractor/src/com/semmle/jcorn/Parser.java +++ b/javascript/extractor/src/com/semmle/jcorn/Parser.java @@ -2359,6 +2359,7 @@ protected List toAssignableList(List exprList, boolean i } else if (last != null && last instanceof SpreadElement) { Expression arg = ((SpreadElement) last).getArgument(); arg = (Expression) this.toAssignable(arg, isBinding); + if (!(arg instanceof IPattern)) this.unexpected(arg.getLoc().getStart()); exprList.set(end - 1, last = new RestElement(last.getLoc(), arg)); --end; } diff --git a/javascript/extractor/test/com/semmle/js/extractor/test/RobustnessTests.java b/javascript/extractor/test/com/semmle/js/extractor/test/RobustnessTests.java index 7b91c59376fe..f9e262f457d1 100644 --- a/javascript/extractor/test/com/semmle/js/extractor/test/RobustnessTests.java +++ b/javascript/extractor/test/com/semmle/js/extractor/test/RobustnessTests.java @@ -1,11 +1,14 @@ package com.semmle.js.extractor.test; +import com.semmle.jcorn.CustomParser; import com.semmle.jcorn.Options; import com.semmle.jcorn.Parser; +import com.semmle.jcorn.SyntaxError; import com.semmle.util.io.WholeIO; import com.semmle.util.tests.TestPaths; import java.io.File; import java.nio.charset.StandardCharsets; +import org.junit.Assert; import org.junit.Test; public class RobustnessTests { @@ -30,4 +33,15 @@ public void permissiveDestructuringTest() { + "({ method(...{ value },) {} });\n"; new Parser(new Options(), src, 0).parse(); } + + @Test + public void parenthesizedRestParameterTest() { + try { + new CustomParser(new Options().preserveParens(true), "async(...(x)) => x", 0) + .parse(); + Assert.fail("Expected syntax error, but parsing succeeded."); + } catch (SyntaxError expected) { + Assert.assertEquals("Unexpected token (1:9)", expected.getMessage()); + } + } } From 516986e5be1aef1d274a8f6dc0bc8dc69318a55d Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Mon, 21 Sep 2026 09:59:15 +0200 Subject: [PATCH 1175/2098] Rust: Clarify rust-analyzer updater helpers --- rust/scripts/update_rust_analyzer.py | 43 ++++++++++++++++------------ 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/rust/scripts/update_rust_analyzer.py b/rust/scripts/update_rust_analyzer.py index a3579c931db6..1eaeda2dcb90 100755 --- a/rust/scripts/update_rust_analyzer.py +++ b/rust/scripts/update_rust_analyzer.py @@ -39,9 +39,9 @@ def run_codegen() -> None: raise SystemExit(error.returncode) from None -def get_rust_analyzer_version() -> str: +def get_min_rust_analyzer_version(manifest: str) -> str: """Get the minimum version of all ra_ap dependencies from `Cargo.toml`.""" - dependencies = tomllib.loads(RUST_EXTRACTOR_MANIFEST.read_text())["dependencies"] + dependencies = tomllib.loads(manifest)["dependencies"] return min( ( version @@ -62,7 +62,7 @@ def fetch(url: str) -> bytes: def get_compatible_rust_toolchain(rust_analyzer_version: str) -> str: - """Get the latest Rust toolchain that precedes our version of rust-analyzer.""" + """Get the latest Rust toolchain released no later than rust-analyzer.""" # Get the release date of the rust-analyzer version crate_url = f"https://crates.io/api/v1/crates/ra_ap_syntax/{rust_analyzer_version}" crate = json.loads(fetch(crate_url)) @@ -72,12 +72,13 @@ def get_compatible_rust_toolchain(rust_analyzer_version: str) -> str: # ``` # static.rust-lang.org/dist/YYYY-MM-DD/channel-rust-stable.toml # ``` - # where `YYYY-MM-DD` is the last that is earlier than the rust-analyzer release. + # where `YYYY-MM-DD` is no later than the rust-analyzer release date. + manifests = ( + fetch("https://static.rust-lang.org/manifests.txt").decode().splitlines() + ) rust_manifest = next( manifest - for manifest in reversed( - fetch("https://static.rust-lang.org/manifests.txt").decode().splitlines() - ) + for manifest in reversed(manifests) if manifest.endswith("/channel-rust-stable.toml") and manifest.split("/")[2] <= rust_analyzer_release ) @@ -86,7 +87,7 @@ def get_compatible_rust_toolchain(rust_analyzer_version: str) -> str: return manifest["pkg"]["rust"]["version"].split()[0] -def update_fixed_rust_toolchain(version: str) -> None: +def update_fixed_rust_toolchain_versions(version: str) -> None: """Change the fixed toolchain in the places where it's hardcoded""" toolchain_rs = TOOLCHAIN_RS.read_text() prefix = 'const FIXED_RUST_TOOLCHAIN: &str = "' @@ -108,13 +109,12 @@ def update_fixed_rust_toolchain(version: str) -> None: ) -def align_rust_analyzer_versions() -> None: - """Align ra_ap dependencies and update the lockfile when versions differ. +def align_rust_analyzer_versions(manifest: str) -> tuple[str, bool]: + """Align ra_ap dependency versions in a Cargo manifest. rust-analyzer crates may be published gradually, so this selects the newest version that is available for every ra_ap dependency. """ - manifest = RUST_EXTRACTOR_MANIFEST.read_text() dependencies = { name: version for name, version in tomllib.loads(manifest)["dependencies"].items() @@ -122,17 +122,16 @@ def align_rust_analyzer_versions() -> None: } if len(set(dependencies.values())) == 1: # All the `ra_ap_` dependencies agree - return + return manifest, False - version = get_rust_analyzer_version() + version = get_min_rust_analyzer_version(manifest) for name, old_version in dependencies.items(): manifest = manifest.replace( f'{name} = "{old_version}"', f'{name} = "{version}"', ) - RUST_EXTRACTOR_MANIFEST.write_text(manifest) - run("cargo", "update") + return manifest, True def commit_all(title: str) -> None: @@ -152,20 +151,26 @@ def main() -> None: raise RuntimeError("the working tree must be clean") print_step(1, "Update dependencies") - old_rust_analyzer_version = get_rust_analyzer_version() + manifest = RUST_EXTRACTOR_MANIFEST.read_text() + old_rust_analyzer_version = get_min_rust_analyzer_version(manifest) run("cargo", "upgrade", "--incompatible", "--pinned") - new_rust_analyzer_version = get_rust_analyzer_version() + # Re-read the (potentially) changed manifest + manifest = RUST_EXTRACTOR_MANIFEST.read_text() + new_rust_analyzer_version = get_min_rust_analyzer_version(manifest) if new_rust_analyzer_version == old_rust_analyzer_version: run("git", "restore", ".") print("No new rust-analyzer version available.") return - align_rust_analyzer_versions() + aligned_manifest, manifest_changed = align_rust_analyzer_versions(manifest) + if manifest_changed: + RUST_EXTRACTOR_MANIFEST.write_text(aligned_manifest) + run("cargo", "update") commit_all("Cargo: Upgrade dependencies") print_step(2, "Update the fixed Rust toolchain used by the extractor") rust_toolchain = get_compatible_rust_toolchain(new_rust_analyzer_version) - update_fixed_rust_toolchain(rust_toolchain) + update_fixed_rust_toolchain_versions(rust_toolchain) commit_all("Rust: Update fixed toolchain") print_step(3, "Regenerate vendored bazel files") From 3bc23d698e25819195df0d5f7abdbfae2c48921e Mon Sep 17 00:00:00 2001 From: Anders Fugmann Date: Mon, 21 Sep 2026 10:04:42 +0200 Subject: [PATCH 1176/2098] CONTRIBUTING.md: Add Rust and Actions to list of languages --- CONTRIBUTING.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a0efca6dec93..460c8dbe5e57 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -16,8 +16,9 @@ If you have an idea for a query that you would like to share with other CodeQL u 1. **Directory structure** - There are eight language-specific query directories in this repository: + There are ten language-specific query directories in this repository: + * Actions: `actions/ql/src` * C/C++: `cpp/ql/src` * C#: `csharp/ql/src` * Go: `go/ql/src` @@ -25,6 +26,7 @@ If you have an idea for a query that you would like to share with other CodeQL u * JavaScript: `javascript/ql/src` * Python: `python/ql/src` * Ruby: `ruby/ql/src` + * Rust: `rust/ql/src` * Swift: `swift/ql/src` Each language-specific directory contains further subdirectories that group queries based on their `@tags` or purpose. From d3d19f17c3a7bee6313d8434c827b8b074240f0b Mon Sep 17 00:00:00 2001 From: Anders Fugmann Date: Mon, 21 Sep 2026 10:05:44 +0200 Subject: [PATCH 1177/2098] CONTRIBUTING.md: Remove comment on experimental bazel targets --- CONTRIBUTING.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 460c8dbe5e57..81980359600a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -77,7 +77,3 @@ After the experimental query is merged, we welcome pull requests to improve it. If you contribute to this project, we will record your name and email address (as provided by you with your contributions) as part of the code repositories, which are public. We might also use this information to contact you in relation to your contributions, as well as in the normal course of software development. We also store records of CLA agreements signed in the past, but no longer require contributors to sign a CLA. Under GDPR legislation, we do this on the basis of our legitimate interest in creating the CodeQL product. Please do get in touch (privacy@github.com) if you have any questions about this or our data protection policies. - -## Bazel -Please notice that any bazel targets and definitions in this repository are currently experimental -and for internal use only. From ed3b85cd986d9037e26180bfcdfd58dfe9c53061 Mon Sep 17 00:00:00 2001 From: Asger F Date: Mon, 21 Sep 2026 10:16:50 +0200 Subject: [PATCH 1178/2098] Accept Copilot suggestions Some typos and exclude constructor patterns from call graph stats Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll | 2 ++ .../ql/lib/codeql/unified/internal/dataflow/DataFlowCall.qll | 2 +- .../lib/codeql/unified/internal/dataflow/DataFlowCallable.qll | 2 +- .../ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll | 2 +- unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll | 2 +- 5 files changed, 6 insertions(+), 4 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll index d6165688e3dc..b0449cef77a8 100644 --- a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll +++ b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll @@ -93,6 +93,8 @@ module FilesCoveredByModuleManifestStatsReport = module CallGraphStats implements EntityStatsSig { class Candidate extends CallExpr { + Candidate() { exists(DataFlowCall c | c.asExplicitCall() = this) } + DataFlowCall getDataFlowCall() { result.asExplicitCall() = this } DataFlowCallable getTarget() { result = viableCallable(this.getDataFlowCall()) } diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowCall.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowCall.qll index 462515880cf3..e6aeebdeee9d 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowCall.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowCall.qll @@ -8,7 +8,7 @@ private newtype TDataFlowCall = } /** - * A call site, covering both explicit calls such as `foo(1,2)`, as well an implicit + * A call site, covering explicit calls such as `foo(1,2)`, as well as implicit * calls and calls derived from library models. * * Currently only explicit calls are implemented. diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowCallable.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowCallable.qll index 40f6934ebae7..7e31a0b45e0e 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowCallable.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowCallable.qll @@ -4,7 +4,7 @@ private import AllDataFlow private newtype TDataFlowCallable = TSourceCallable(Callable callable) /** - * A callable entity, either an function-like entity in the source code, + * A callable entity: either a function-like entity in source code or * an entity derived from a library model. * * Currently only callables in source code are implemented. diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll index 6defd397c0be..03b01096848f 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowNode.qll @@ -38,7 +38,7 @@ private predicate hasPostUpdate(Expr expr, ControlFlowNode cfgNode) { /** * Holds if `repr` performs an access to `var` of the given `kind` at `cfgNode`. * - * `repr` should be an arbitary but unique representative for the access. + * `repr` should be an arbitrary but unique representative for the access. */ predicate performsVariableAccess( AstNode repr, LocalVariable var, VariableRefKind kind, ControlFlowNode cfgNode diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll b/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll index c69e5c799670..56c2cfadea73 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/LocalSsa.qll @@ -105,7 +105,7 @@ Node getNodeFromLocalSsaNode(Ssa::Node n) { } /** - * Holds if there is use-use flow from `node1`, through one or most post-update reads, into `node2`. + * Holds if there is use-use flow from `node1`, through one or more post-update reads, into `node2`. */ predicate skipPostUpdateRead(Ssa::Node node1, Ssa::Node node2) { Ssa::localFlowStep(_, node1, node2, true) and From f7aeeb65cc46f8d369d112491e809aa0c61785e8 Mon Sep 17 00:00:00 2001 From: Asger F Date: Mon, 21 Sep 2026 10:22:15 +0200 Subject: [PATCH 1179/2098] unified: Add TODO for short-hand returns --- .../unified/internal/dataflow/DataFlowInstantiation.qll | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll index e104a351a172..b2d455eb058e 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowInstantiation.qll @@ -23,7 +23,10 @@ module DataFlowInput implements InputSig { // Parameter, argument, return, and out nodes and their positions/kinds // class ReturnNode extends Node { - ReturnNode() { this.asExpr() = any(ReturnExpr r).getValue() } + ReturnNode() { + // TODO: Handle short-hand returns such as `func foo() -> Int { 5 }` + this.asExpr() = any(ReturnExpr r).getValue() + } ReturnKind getKind() { exists(result) } } From d099129d84a0469726339b1acf987b4131099736 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Mon, 21 Sep 2026 11:02:16 +0200 Subject: [PATCH 1180/2098] Rust: Add async block lambda tests --- .../library-tests/dataflow/lambdas/Cargo.lock | 144 ++++++++++++++++++ .../library-tests/dataflow/lambdas/main.rs | 56 +++++++ .../dataflow/lambdas/options.yml | 3 + 3 files changed, 203 insertions(+) create mode 100644 rust/ql/test/library-tests/dataflow/lambdas/options.yml diff --git a/rust/ql/test/library-tests/dataflow/lambdas/Cargo.lock b/rust/ql/test/library-tests/dataflow/lambdas/Cargo.lock index b9856cfaf77d..5786eb119a9a 100644 --- a/rust/ql/test/library-tests/dataflow/lambdas/Cargo.lock +++ b/rust/ql/test/library-tests/dataflow/lambdas/Cargo.lock @@ -2,6 +2,150 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "futures" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a31d2a3fbaaeb2af2368bbdd904aa8e812d3c04a1ee10d3171f52d556e5d0a3" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" + +[[package]] +name = "futures-executor" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" + +[[package]] +name = "futures-macro" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" + +[[package]] +name = "futures-task" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" + +[[package]] +name = "futures-util" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "syn" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "test" version = "0.0.1" +dependencies = [ + "futures", +] + +[[package]] +name = "unicode-ident" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" diff --git a/rust/ql/test/library-tests/dataflow/lambdas/main.rs b/rust/ql/test/library-tests/dataflow/lambdas/main.rs index 742974eaab9c..5f21e22d08e8 100644 --- a/rust/ql/test/library-tests/dataflow/lambdas/main.rs +++ b/rust/ql/test/library-tests/dataflow/lambdas/main.rs @@ -113,6 +113,61 @@ fn test_external_call() { may_invoke_callback4(|x| sink(a)); // $ hasValueFlow=81 } +mod async_blocks { + use super::{sink, source}; + + async fn async_block_flow_out() { + let future = async { source(206) }; + sink(future.await); // $ MISSING: hasValueFlow=206 + } + + async fn async_block_flow_in() { + let data = source(207); + async { + sink(data); // $ MISSING: hasValueFlow=207 + } + .await; + } + + async fn async_block_flow_through() { + let data = source(208); + let future = async { data }; + sink(future.await); // $ MISSING: hasValueFlow=208 + } + + async fn async_block_captured_variable() { + let mut captured = 1; + sink(captured); + async { + captured = source(209); + } + .await; + sink(captured); // $ MISSING: hasValueFlow=209 + } + + async fn boxed_async_block_captured_variable() { + let mut captured = 1; + sink(captured); + Box::pin(async { + captured = source(210); + }) + .await; + sink(captured); // $ MISSING: hasValueFlow=210 + } + + async fn test_async_blocks() { + async_block_flow_out().await; + async_block_flow_in().await; + async_block_flow_through().await; + async_block_captured_variable().await; + boxed_async_block_captured_variable().await; + } + + pub fn main() { + futures::executor::block_on(test_async_blocks()); + } +} + fn main() { closure_flow_out(); closure_flow_in(); @@ -123,4 +178,5 @@ fn main() { function_flows_through(); test_apply(); test_apply_wrap(); + async_blocks::main(); } diff --git a/rust/ql/test/library-tests/dataflow/lambdas/options.yml b/rust/ql/test/library-tests/dataflow/lambdas/options.yml new file mode 100644 index 000000000000..72214fcdfc77 --- /dev/null +++ b/rust/ql/test/library-tests/dataflow/lambdas/options.yml @@ -0,0 +1,3 @@ +qltest_cargo_check: true +qltest_dependencies: + - futures = { version = "0.3" } From 803de0f3c408e5b96e60350cecce7edb04425174 Mon Sep 17 00:00:00 2001 From: Asger F Date: Mon, 21 Sep 2026 11:16:15 +0200 Subject: [PATCH 1181/2098] unified: Configure vscode Swift extension Adds files to make the vscode Swift extension work when editing test cases. --- unified/.gitignore | 1 + unified/.vscode/extensions.json | 5 +++++ unified/.vscode/settings.json | 9 +++++++++ unified/Package.swift | 9 +++++++++ 4 files changed, 24 insertions(+) create mode 100644 unified/.vscode/extensions.json create mode 100644 unified/.vscode/settings.json create mode 100644 unified/Package.swift diff --git a/unified/.gitignore b/unified/.gitignore index 5878737805f2..0c99561f41e0 100644 --- a/unified/.gitignore +++ b/unified/.gitignore @@ -1,4 +1,5 @@ target +/.build .vscode/launch.json .cache ql/test/**/*.testproj diff --git a/unified/.vscode/extensions.json b/unified/.vscode/extensions.json new file mode 100644 index 000000000000..c1d687c7ab06 --- /dev/null +++ b/unified/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "swiftlang.swift-vscode" + ] +} diff --git a/unified/.vscode/settings.json b/unified/.vscode/settings.json new file mode 100644 index 000000000000..f19460b60d37 --- /dev/null +++ b/unified/.vscode/settings.json @@ -0,0 +1,9 @@ +{ + "swift.autoGenerateLaunchConfigurations": false, + "swift.disableAutoResolve": true, + "swift.disableSwiftPackageManagerIntegration": false, + "[swift]": { + "editor.defaultFormatter": "swiftlang.swift-vscode", + "editor.formatOnSave": true + } +} diff --git a/unified/Package.swift b/unified/Package.swift new file mode 100644 index 000000000000..76de2f4fc3b3 --- /dev/null +++ b/unified/Package.swift @@ -0,0 +1,9 @@ +// swift-tools-version: 5.9 + +import PackageDescription + +// This targetless package lets editor tooling discover the standalone Swift test fixtures. +let package = Package( + name: "CodeQLSwiftFixtures", + targets: [] +) From 92dc28376679ee6abe49ec7792eae4da004521d8 Mon Sep 17 00:00:00 2001 From: Asger F Date: Mon, 21 Sep 2026 11:34:32 +0200 Subject: [PATCH 1182/2098] unified: Update swift version comment to match Sync'ing on a single source of truth would be nice but is too invasive right now --- unified/Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/Package.swift b/unified/Package.swift index 76de2f4fc3b3..970f0761b08a 100644 --- a/unified/Package.swift +++ b/unified/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version: 5.9 +// swift-tools-version: 6.3 import PackageDescription From 18d3b29ae1fdc0f788e85ea7001b06c0f40bb215 Mon Sep 17 00:00:00 2001 From: Asger F Date: Mon, 21 Sep 2026 11:43:39 +0200 Subject: [PATCH 1183/2098] Allow MemberExpression in RestElement argument Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- javascript/extractor/src/com/semmle/jcorn/Parser.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/javascript/extractor/src/com/semmle/jcorn/Parser.java b/javascript/extractor/src/com/semmle/jcorn/Parser.java index 89326d4a0f39..6b6876b07213 100644 --- a/javascript/extractor/src/com/semmle/jcorn/Parser.java +++ b/javascript/extractor/src/com/semmle/jcorn/Parser.java @@ -2359,7 +2359,8 @@ protected List toAssignableList(List exprList, boolean i } else if (last != null && last instanceof SpreadElement) { Expression arg = ((SpreadElement) last).getArgument(); arg = (Expression) this.toAssignable(arg, isBinding); - if (!(arg instanceof IPattern)) this.unexpected(arg.getLoc().getStart()); + if (!(arg instanceof IPattern || arg instanceof MemberExpression)) + this.unexpected(arg.getLoc().getStart()); exprList.set(end - 1, last = new RestElement(last.getLoc(), arg)); --end; } From 9a1e69fca7b1dba76de5356c46af9faaa8c425f3 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Mon, 14 Sep 2026 14:22:07 +0200 Subject: [PATCH 1184/2098] Rust: Remove pre-1.94 format macro fallback Drop the synthetic format-family macro expansion path and its dedicated legacy-toolchain tests now that extraction uses a pinned compatible Rust toolchain. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- rust/extractor/src/translate.rs | 1 - rust/extractor/src/translate/base.rs | 65 ------- rust/extractor/src/translate/format_args.rs | 163 ------------------ rust/ql/test/.gitignore | 4 - .../format-macros-legacy/Cargo.lock | 7 - .../format-macros-legacy/FormatArgs.expected | 12 -- .../format-macros-legacy/FormatArgs.ql | 8 - .../LogInjection.expected | 28 --- .../format-macros-legacy/LogInjection.qlref | 4 - .../inline-taint-flow.expected | 124 ------------- .../format-macros-legacy/inline-taint-flow.ql | 12 -- .../format-macros-legacy/main.rs | 74 -------- .../format-macros-legacy/rust-toolchain.toml | 14 -- rust/ql/test/setup.sh | 4 - 14 files changed, 520 deletions(-) delete mode 100644 rust/extractor/src/translate/format_args.rs delete mode 100644 rust/ql/test/library-tests/format-macros-legacy/Cargo.lock delete mode 100644 rust/ql/test/library-tests/format-macros-legacy/FormatArgs.expected delete mode 100644 rust/ql/test/library-tests/format-macros-legacy/FormatArgs.ql delete mode 100644 rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected delete mode 100644 rust/ql/test/library-tests/format-macros-legacy/LogInjection.qlref delete mode 100644 rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected delete mode 100644 rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.ql delete mode 100644 rust/ql/test/library-tests/format-macros-legacy/main.rs delete mode 100644 rust/ql/test/library-tests/format-macros-legacy/rust-toolchain.toml diff --git a/rust/extractor/src/translate.rs b/rust/extractor/src/translate.rs index 586d46ee27e2..1e9f3775d40e 100644 --- a/rust/extractor/src/translate.rs +++ b/rust/extractor/src/translate.rs @@ -1,5 +1,4 @@ mod base; -mod format_args; mod generated; mod mappings; diff --git a/rust/extractor/src/translate/base.rs b/rust/extractor/src/translate/base.rs index d25ca31e6de3..05f838cfbc3b 100644 --- a/rust/extractor/src/translate/base.rs +++ b/rust/extractor/src/translate/base.rs @@ -1,4 +1,3 @@ -use super::format_args; use super::mappings::Emission; use crate::generated::{self}; use crate::rust_analyzer::FileSemanticInformation; @@ -461,9 +460,6 @@ impl<'db> Translator<'db> { )); } } else if self.semantics.is_some() { - if self.reconstruct_format_args_expansion(mcall, label) { - return; - } // let's not spam warnings if we don't have semantics, we already emitted one let range = self.text_range_for_node(mcall); self.emit_parse_error( @@ -785,67 +781,6 @@ impl<'db> Translator<'db> { result } - /// Reconstructs and emits the expansion of a format-family macro (`format!`, - /// `println!`, `write!`, `panic!`, ...). - /// - /// On `rustc <1.94` sysroots these macros no longer resolve, so `expand_macro_call` - /// returns `None` and we get a bare unexpanded `MacroCall` with no flow through it. - /// We rebuild the token tree of the real expansion ourselves (see - /// [`super::format_args`]), parse it, and register the result as the macro - /// expansion. Locations of the synthesized nodes are routed through the expansion - /// span map via `builtin_derive_span_map`. - /// - /// Returns `true` when the macro was recognized and an expansion was emitted. - fn reconstruct_format_args_expansion( - &mut self, - mcall: &ast::MacroCall, - label: Label, - ) -> bool { - self.try_reconstruct_format_args_expansion(mcall, label) - .is_some() - } - - /// Attempts to reconstruct and emit a format-family macro expansion. - fn try_reconstruct_format_args_expansion( - &mut self, - mcall: &ast::MacroCall, - label: Label, - ) -> Option<()> { - let name = mcall.path()?.segment()?.name_ref()?.text().to_string(); - let wrap = format_args::Wrap::for_macro(&name)?; - let tt_node = mcall.token_tree()?; - let semantics = self.semantics?; - let db = semantics.db; - let file_id = semantics.hir_file_for(mcall.syntax()); - let span_map = file_id.span_map(db); - let call_site = span_map.span_for_range(mcall.syntax().text_range()); - let input = syntax_node_to_token_tree( - tt_node.syntax(), - span_map, - call_site, - DocCommentDesugarMode::ProcMacro, - ); - let output = format_args::reconstruct(wrap, &input, call_site)?; - - let edition = self.file_id.map(|f| f.edition(db))?; - let (parsed, output_span_map) = - token_tree_to_syntax_node(&output, TopEntryPoint::Expr, &mut |_| edition); - let root = parsed.syntax_node(); - let expr = ast::Expr::cast(root.clone()) - .or_else(|| root.descendants().find_map(ast::Expr::cast))?; - // Sanity check: the parsed expression must contain the reconstructed - // `FormatArgsExpr` (either directly, or wrapped in the callee above). - expr.syntax() - .descendants() - .find_map(ast::FormatArgsExpr::cast)?; - let previous = self.builtin_derive_span_map.replace(output_span_map); - let emitted = self.emit_expr(&expr); - self.builtin_derive_span_map = previous; - let value = emitted?; - generated::MacroCall::emit_macro_call_expansion(label, value.into(), &mut self.trap.writer); - Some(()) - } - pub(crate) fn emit_derive_expansion( &mut self, node: &(impl Into + Clone), diff --git a/rust/extractor/src/translate/format_args.rs b/rust/extractor/src/translate/format_args.rs deleted file mode 100644 index c6ac1b9b8d0d..000000000000 --- a/rust/extractor/src/translate/format_args.rs +++ /dev/null @@ -1,163 +0,0 @@ -//! Reconstruction of the `format_args!` expansion of the format-family macros. -//! -//! On `rustc <1.94` sysroots the format-family macros (`format!`, `println!`, -//! `write!`, `panic!`, ...) no longer resolve, so `expand_macro_call` returns `None` -//! and we get a bare unexpanded `MacroCall`. The syntactic lowering of these macros -//! is a pure, sysroot-independent transform, so we rebuild the same token tree the -//! real (>=1.94) expansion produces and parse it ourselves, giving pre-1.94 -//! toolchains the same AST as newer ones. -//! -//! This module owns the pure token-tree construction; [`super::base::Translator`] -//! handles parsing the result and emitting it as the macro expansion. - -use ra_ap_hir_expand::intern::Symbol; -use ra_ap_hir_expand::tt; -use ra_ap_span::Span; - -/// How a format-family macro wraps its `format_args!`. We rebuild the same shape the -/// real (>=1.94) expansion has, so older toolchains get the same AST. -#[derive(Clone, Copy, PartialEq, Eq)] -pub(crate) enum Wrap { - /// `format_args!` and friends are themselves the `FormatArgsExpr`. - Bare, - /// Wrapped in a call to the given absolute path, e.g. `std::fmt::format(..)`. - Call(&'static [&'static str]), - /// `write!`/`writeln!`: `.write_fmt(format_args!(..))`. - WriteMethod, -} - -impl Wrap { - /// Classifies a macro by its name, or returns `None` if it is not a - /// format-family macro we reconstruct. - /// - /// `format_args_nl!`'s trailing newline is intentionally dropped: it is not - /// relevant to flow or to the sinks keyed on the callee, so all variants map to - /// the same `format_args` reconstruction. - pub(crate) fn for_macro(name: &str) -> Option { - Some(match name { - "format_args" | "const_format_args" | "format_args_nl" => Wrap::Bare, - "format" => Wrap::Call(&["std", "fmt", "format"]), - "print" | "println" => Wrap::Call(&["std", "io", "_print"]), - "eprint" | "eprintln" => Wrap::Call(&["std", "io", "_eprint"]), - "panic" => Wrap::Call(&["core", "panicking", "panic_fmt"]), - "write" | "writeln" => Wrap::WriteMethod, - _ => return None, - }) - } -} - -/// Builds the reconstructed expansion token tree for `wrap` from the macro `input`. -/// -/// Returns `None` if the input does not match the expected shape (currently only when -/// a `write!` argument list has no writer/format-args separating comma). `call_site` -/// is used to span the synthesized tokens; the format arguments keep their own spans. -pub(crate) fn reconstruct( - wrap: Wrap, - input: &tt::TopSubtree, - call_site: Span, -) -> Option { - let emitter = Emitter { - call_site, - format_args_parens: input.view().top_subtree().delimiter, - }; - - let mut builder = tt::TopSubtreeBuilder::new(tt::Delimiter::invisible_spanned(call_site)); - match wrap { - Wrap::Bare => emitter.push_format_args(&mut builder, input.view().token_trees()), - Wrap::Call(path) => { - emitter.push_path(&mut builder, path); - emitter.push_parenthesized_format_args(&mut builder, input.view().token_trees()); - } - Wrap::WriteMethod => { - let (writer, content) = split_arguments(input)?; - builder.extend_with_tt(writer); - builder.push(emitter.punct('.', tt::Spacing::Alone)); - builder.push(emitter.ident("write_fmt")); - emitter.push_parenthesized_format_args(&mut builder, content); - } - } - Some(builder.build()) -} - -/// Splits the macro argument list into the leading writer (for `write!`/`writeln!`, -/// everything up to the first top-level comma) and the format arguments. -fn split_arguments<'a>( - input: &'a tt::TopSubtree, -) -> Option<(tt::TokenTreesView<'a>, tt::TokenTreesView<'a>)> { - let mut iter = input.view().iter(); - let start = iter.savepoint(); - let mut found_comma = false; - while let Some(element) = iter.peek() { - if let tt::TtElement::Leaf(tt::Leaf::Punct(punct)) = element - && punct.char == ',' - { - found_comma = true; - break; - } - iter.next(); - } - if !found_comma { - return None; - } - let writer = iter.from_savepoint(start); - iter.next(); // consume the comma - Some((writer, iter.remaining())) -} - -/// Emits the synthesized tokens, tagging them with the macro call site span. -struct Emitter { - call_site: Span, - /// The delimiter of the macro input, reused for the `format_args(..)` parentheses - /// so those spans point back at the original argument list. - format_args_parens: tt::Delimiter, -} - -impl Emitter { - fn ident(&self, sym: &str) -> tt::Leaf { - tt::Leaf::Ident(tt::Ident { - sym: Symbol::intern(sym), - span: self.call_site, - is_raw: tt::IdentIsRaw::No, - }) - } - - fn punct(&self, char: char, spacing: tt::Spacing) -> tt::Leaf { - tt::Leaf::Punct(tt::Punct { - char, - spacing, - span: self.call_site, - }) - } - - /// Pushes `builtin # format_args ( )`, the token form the parser turns - /// into a `FormatArgsExpr`. Its argument leaves keep their real source spans. - fn push_format_args(&self, builder: &mut tt::TopSubtreeBuilder, content: tt::TokenTreesView) { - builder.push(self.ident("builtin")); - builder.push(self.punct('#', tt::Spacing::Alone)); - builder.push(self.ident("format_args")); - builder.open(tt::DelimiterKind::Parenthesis, self.format_args_parens.open); - builder.extend_with_tt(content); - builder.close(self.format_args_parens.close); - } - - /// Pushes `:: seg :: seg ...`, an absolute path. - fn push_path(&self, builder: &mut tt::TopSubtreeBuilder, path: &[&str]) { - for segment in path { - builder.push(self.punct(':', tt::Spacing::Joint)); - builder.push(self.punct(':', tt::Spacing::Alone)); - builder.push(self.ident(segment)); - } - } - - /// Pushes `( builtin#format_args() )`, the argument list of the wrapping - /// call or method. - fn push_parenthesized_format_args( - &self, - builder: &mut tt::TopSubtreeBuilder, - content: tt::TokenTreesView, - ) { - builder.open(tt::DelimiterKind::Parenthesis, self.call_site); - self.push_format_args(builder, content); - builder.close(self.call_site); - } -} diff --git a/rust/ql/test/.gitignore b/rust/ql/test/.gitignore index eb43358aa293..9ea6b0797852 100644 --- a/rust/ql/test/.gitignore +++ b/rust/ql/test/.gitignore @@ -3,10 +3,6 @@ target/ # these are all generated, see `rust/extractor/src/qltest.rs` for details Cargo.toml /*/**/rust-toolchain.toml -# but this one is committed on purpose: it pins a pre-1.94 toolchain to exercise -# the extractor's `FormatArgsExpr` reconstruction fallback. -!/library-tests/format-macros-legacy/rust-toolchain.toml lib.rs .proc_macro/ .lib/ - diff --git a/rust/ql/test/library-tests/format-macros-legacy/Cargo.lock b/rust/ql/test/library-tests/format-macros-legacy/Cargo.lock deleted file mode 100644 index b9856cfaf77d..000000000000 --- a/rust/ql/test/library-tests/format-macros-legacy/Cargo.lock +++ /dev/null @@ -1,7 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "test" -version = "0.0.1" diff --git a/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.expected b/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.expected deleted file mode 100644 index d8373ec3f9e3..000000000000 --- a/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.expected +++ /dev/null @@ -1,12 +0,0 @@ -| main.rs:13:18:13:24 | FormatArgsExpr | 1 | -| main.rs:16:18:16:22 | FormatArgsExpr | 0 | -| main.rs:19:21:19:35 | FormatArgsExpr | 1 | -| main.rs:27:25:27:33 | FormatArgsExpr | 1 | -| main.rs:38:40:38:46 | FormatArgsExpr | 0 | -| main.rs:43:52:43:58 | FormatArgsExpr | 0 | -| main.rs:49:26:49:32 | FormatArgsExpr | 1 | -| main.rs:54:28:54:32 | FormatArgsExpr | 0 | -| main.rs:64:14:64:26 | FormatArgsExpr | 1 | -| main.rs:65:15:65:25 | FormatArgsExpr | 0 | -| main.rs:66:12:66:24 | FormatArgsExpr | 1 | -| main.rs:67:13:67:23 | FormatArgsExpr | 0 | diff --git a/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.ql b/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.ql deleted file mode 100644 index 77d7ab895bda..000000000000 --- a/rust/ql/test/library-tests/format-macros-legacy/FormatArgs.ql +++ /dev/null @@ -1,8 +0,0 @@ -// Reconstructed `FormatArgsExpr` nodes for the format-family macros. On the -// pinned pre-1.94 toolchain these come entirely from the extractor's -// reconstruction path, so the presence of one node per macro invocation -// (including `write!`/`writeln!`) confirms it fires across the family. -import rust - -from FormatArgsExpr f -select f, f.getNumberOfArgs() diff --git a/rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected b/rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected deleted file mode 100644 index b294b89e83fb..000000000000 --- a/rust/ql/test/library-tests/format-macros-legacy/LogInjection.expected +++ /dev/null @@ -1,28 +0,0 @@ -#select -| main.rs:64:14:64:26 | MacroExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:64:14:64:26 | MacroExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | -| main.rs:65:15:65:25 | MacroExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:65:15:65:25 | MacroExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | -| main.rs:66:12:66:24 | MacroExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:66:12:66:24 | MacroExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | -| main.rs:67:13:67:23 | MacroExpr | main.rs:62:19:62:45 | ...::var(...) | main.rs:67:13:67:23 | MacroExpr | Log entry depends on a $@. | main.rs:62:19:62:45 | ...::var(...) | user-provided value | -edges -| main.rs:62:9:62:15 | tainted | main.rs:64:14:64:26 | MacroExpr | provenance | Sink:MaD:2 | -| main.rs:62:9:62:15 | tainted | main.rs:65:15:65:25 | MacroExpr | provenance | Sink:MaD:1 | -| main.rs:62:9:62:15 | tainted | main.rs:66:12:66:24 | MacroExpr | provenance | Sink:MaD:2 | -| main.rs:62:9:62:15 | tainted | main.rs:67:13:67:23 | MacroExpr | provenance | Sink:MaD:1 | -| main.rs:62:19:62:45 | ...::var(...) | main.rs:62:19:62:45 | ...::var(...) [Ok] | provenance | Src:MaD:3 | -| main.rs:62:19:62:45 | ...::var(...) [Ok] | main.rs:62:19:62:65 | ... .unwrap_or_default() | provenance | MaD:4 | -| main.rs:62:19:62:65 | ... .unwrap_or_default() | main.rs:62:9:62:15 | tainted | provenance | | -models -| 1 | Sink: std::io::stdio::_eprint; Argument[0]; log-injection | -| 2 | Sink: std::io::stdio::_print; Argument[0]; log-injection | -| 3 | Source: std::env::var; ReturnValue.Field[core::result::Result::Ok(0)]; environment | -| 4 | Summary: ::unwrap_or_default; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -nodes -| main.rs:62:9:62:15 | tainted | semmle.label | tainted | -| main.rs:62:19:62:45 | ...::var(...) | semmle.label | ...::var(...) | -| main.rs:62:19:62:45 | ...::var(...) [Ok] | semmle.label | ...::var(...) [Ok] | -| main.rs:62:19:62:65 | ... .unwrap_or_default() | semmle.label | ... .unwrap_or_default() | -| main.rs:64:14:64:26 | MacroExpr | semmle.label | MacroExpr | -| main.rs:65:15:65:25 | MacroExpr | semmle.label | MacroExpr | -| main.rs:66:12:66:24 | MacroExpr | semmle.label | MacroExpr | -| main.rs:67:13:67:23 | MacroExpr | semmle.label | MacroExpr | -subpaths diff --git a/rust/ql/test/library-tests/format-macros-legacy/LogInjection.qlref b/rust/ql/test/library-tests/format-macros-legacy/LogInjection.qlref deleted file mode 100644 index 3949abc78143..000000000000 --- a/rust/ql/test/library-tests/format-macros-legacy/LogInjection.qlref +++ /dev/null @@ -1,4 +0,0 @@ -query: queries/security/CWE-117/LogInjection.ql -postprocess: - - utils/test/PrettyPrintModels.ql - - utils/test/InlineExpectationsTestQuery.ql diff --git a/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected b/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected deleted file mode 100644 index 97ef77e17760..000000000000 --- a/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.expected +++ /dev/null @@ -1,124 +0,0 @@ -models -| 1 | Summary: ::as_str; Argument[self].Reference; ReturnValue.Reference; taint | -| 2 | Summary: ::write_fmt; Argument[0]; Argument[self].Reference; taint | -| 3 | Summary: ::write_str; Argument[0].Reference; Argument[self].Reference; taint | -| 4 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | -| 5 | Summary: core::fmt::write; Argument[1]; Argument[0].Reference; taint | -| 6 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | -edges -| main.rs:12:9:12:9 | a | main.rs:13:18:13:24 | MacroExpr | provenance | | -| main.rs:12:13:12:21 | source(...) | main.rs:12:9:12:9 | a | provenance | | -| main.rs:13:18:13:24 | ...::format(...) | main.rs:13:18:13:24 | { ... } | provenance | | -| main.rs:13:18:13:24 | ...::must_use(...) | main.rs:13:10:13:25 | MacroExpr | provenance | | -| main.rs:13:18:13:24 | MacroExpr | main.rs:13:18:13:24 | ...::format(...) | provenance | MaD:4 | -| main.rs:13:18:13:24 | { ... } | main.rs:13:18:13:24 | ...::must_use(...) | provenance | MaD:6 | -| main.rs:15:9:15:9 | b | main.rs:16:18:16:22 | MacroExpr | provenance | | -| main.rs:15:13:15:21 | source(...) | main.rs:15:9:15:9 | b | provenance | | -| main.rs:16:18:16:22 | ...::format(...) | main.rs:16:18:16:22 | { ... } | provenance | | -| main.rs:16:18:16:22 | ...::must_use(...) | main.rs:16:10:16:23 | MacroExpr | provenance | | -| main.rs:16:18:16:22 | MacroExpr | main.rs:16:18:16:22 | ...::format(...) | provenance | MaD:4 | -| main.rs:16:18:16:22 | { ... } | main.rs:16:18:16:22 | ...::must_use(...) | provenance | MaD:6 | -| main.rs:18:9:18:9 | c | main.rs:19:21:19:35 | MacroExpr | provenance | | -| main.rs:18:13:18:21 | source(...) | main.rs:18:9:18:9 | c | provenance | | -| main.rs:19:9:19:9 | s | main.rs:20:10:20:10 | s | provenance | | -| main.rs:19:21:19:35 | ...::format(...) | main.rs:19:21:19:35 | { ... } | provenance | | -| main.rs:19:21:19:35 | ...::must_use(...) | main.rs:19:9:19:9 | s | provenance | | -| main.rs:19:21:19:35 | MacroExpr | main.rs:19:21:19:35 | ...::format(...) | provenance | MaD:4 | -| main.rs:19:21:19:35 | { ... } | main.rs:19:21:19:35 | ...::must_use(...) | provenance | MaD:6 | -| main.rs:26:9:26:9 | a | main.rs:27:9:27:9 | b | provenance | | -| main.rs:26:13:26:21 | source(...) | main.rs:26:9:26:9 | a | provenance | | -| main.rs:27:9:27:9 | b | main.rs:28:30:28:30 | b | provenance | | -| main.rs:28:9:28:9 | c | main.rs:29:10:29:10 | c | provenance | | -| main.rs:28:13:28:31 | ...::format(...) | main.rs:28:9:28:9 | c | provenance | | -| main.rs:28:30:28:30 | b | main.rs:28:13:28:31 | ...::format(...) | provenance | MaD:4 | -| main.rs:32:9:32:9 | d | main.rs:33:28:33:28 | d | provenance | | -| main.rs:32:13:32:21 | source(...) | main.rs:32:9:32:9 | d | provenance | | -| main.rs:33:13:33:16 | [post] buf1 | main.rs:34:10:34:13 | buf1 | provenance | | -| main.rs:33:28:33:28 | d | main.rs:33:28:33:37 | d.as_str() [&ref] | provenance | MaD:1 | -| main.rs:33:28:33:37 | d.as_str() [&ref] | main.rs:33:13:33:16 | [post] buf1 | provenance | MaD:3 | -| main.rs:37:9:37:9 | e | main.rs:38:28:38:46 | MacroExpr | provenance | | -| main.rs:37:13:37:21 | source(...) | main.rs:37:9:37:9 | e | provenance | | -| main.rs:38:13:38:16 | [post] buf2 | main.rs:39:10:39:13 | buf2 | provenance | | -| main.rs:38:28:38:46 | MacroExpr | main.rs:38:13:38:16 | [post] buf2 | provenance | MaD:2 | -| main.rs:42:9:42:9 | f | main.rs:43:40:43:58 | MacroExpr | provenance | | -| main.rs:42:13:42:21 | source(...) | main.rs:42:9:42:9 | f | provenance | | -| main.rs:43:29:43:37 | [post] &mut buf3 [&ref] | main.rs:43:34:43:37 | [post] buf3 | provenance | | -| main.rs:43:34:43:37 | [post] buf3 | main.rs:44:10:44:13 | buf3 | provenance | | -| main.rs:43:40:43:58 | MacroExpr | main.rs:43:29:43:37 | [post] &mut buf3 [&ref] | provenance | MaD:5 | -| main.rs:48:9:48:9 | g | main.rs:49:26:49:32 | MacroExpr | provenance | | -| main.rs:48:13:48:21 | source(...) | main.rs:48:9:48:9 | g | provenance | | -| main.rs:49:20:49:23 | [post] buf4 | main.rs:50:10:50:13 | buf4 | provenance | | -| main.rs:49:26:49:32 | MacroExpr | main.rs:49:20:49:23 | [post] buf4 | provenance | MaD:2 | -| main.rs:53:9:53:9 | h | main.rs:54:28:54:32 | MacroExpr | provenance | | -| main.rs:53:13:53:21 | source(...) | main.rs:53:9:53:9 | h | provenance | | -| main.rs:54:22:54:25 | [post] buf5 | main.rs:55:10:55:13 | buf5 | provenance | | -| main.rs:54:28:54:32 | MacroExpr | main.rs:54:22:54:25 | [post] buf5 | provenance | MaD:2 | -nodes -| main.rs:12:9:12:9 | a | semmle.label | a | -| main.rs:12:13:12:21 | source(...) | semmle.label | source(...) | -| main.rs:13:10:13:25 | MacroExpr | semmle.label | MacroExpr | -| main.rs:13:18:13:24 | ...::format(...) | semmle.label | ...::format(...) | -| main.rs:13:18:13:24 | ...::must_use(...) | semmle.label | ...::must_use(...) | -| main.rs:13:18:13:24 | MacroExpr | semmle.label | MacroExpr | -| main.rs:13:18:13:24 | { ... } | semmle.label | { ... } | -| main.rs:15:9:15:9 | b | semmle.label | b | -| main.rs:15:13:15:21 | source(...) | semmle.label | source(...) | -| main.rs:16:10:16:23 | MacroExpr | semmle.label | MacroExpr | -| main.rs:16:18:16:22 | ...::format(...) | semmle.label | ...::format(...) | -| main.rs:16:18:16:22 | ...::must_use(...) | semmle.label | ...::must_use(...) | -| main.rs:16:18:16:22 | MacroExpr | semmle.label | MacroExpr | -| main.rs:16:18:16:22 | { ... } | semmle.label | { ... } | -| main.rs:18:9:18:9 | c | semmle.label | c | -| main.rs:18:13:18:21 | source(...) | semmle.label | source(...) | -| main.rs:19:9:19:9 | s | semmle.label | s | -| main.rs:19:21:19:35 | ...::format(...) | semmle.label | ...::format(...) | -| main.rs:19:21:19:35 | ...::must_use(...) | semmle.label | ...::must_use(...) | -| main.rs:19:21:19:35 | MacroExpr | semmle.label | MacroExpr | -| main.rs:19:21:19:35 | { ... } | semmle.label | { ... } | -| main.rs:20:10:20:10 | s | semmle.label | s | -| main.rs:26:9:26:9 | a | semmle.label | a | -| main.rs:26:13:26:21 | source(...) | semmle.label | source(...) | -| main.rs:27:9:27:9 | b | semmle.label | b | -| main.rs:28:9:28:9 | c | semmle.label | c | -| main.rs:28:13:28:31 | ...::format(...) | semmle.label | ...::format(...) | -| main.rs:28:30:28:30 | b | semmle.label | b | -| main.rs:29:10:29:10 | c | semmle.label | c | -| main.rs:32:9:32:9 | d | semmle.label | d | -| main.rs:32:13:32:21 | source(...) | semmle.label | source(...) | -| main.rs:33:13:33:16 | [post] buf1 | semmle.label | [post] buf1 | -| main.rs:33:28:33:28 | d | semmle.label | d | -| main.rs:33:28:33:37 | d.as_str() [&ref] | semmle.label | d.as_str() [&ref] | -| main.rs:34:10:34:13 | buf1 | semmle.label | buf1 | -| main.rs:37:9:37:9 | e | semmle.label | e | -| main.rs:37:13:37:21 | source(...) | semmle.label | source(...) | -| main.rs:38:13:38:16 | [post] buf2 | semmle.label | [post] buf2 | -| main.rs:38:28:38:46 | MacroExpr | semmle.label | MacroExpr | -| main.rs:39:10:39:13 | buf2 | semmle.label | buf2 | -| main.rs:42:9:42:9 | f | semmle.label | f | -| main.rs:42:13:42:21 | source(...) | semmle.label | source(...) | -| main.rs:43:29:43:37 | [post] &mut buf3 [&ref] | semmle.label | [post] &mut buf3 [&ref] | -| main.rs:43:34:43:37 | [post] buf3 | semmle.label | [post] buf3 | -| main.rs:43:40:43:58 | MacroExpr | semmle.label | MacroExpr | -| main.rs:44:10:44:13 | buf3 | semmle.label | buf3 | -| main.rs:48:9:48:9 | g | semmle.label | g | -| main.rs:48:13:48:21 | source(...) | semmle.label | source(...) | -| main.rs:49:20:49:23 | [post] buf4 | semmle.label | [post] buf4 | -| main.rs:49:26:49:32 | MacroExpr | semmle.label | MacroExpr | -| main.rs:50:10:50:13 | buf4 | semmle.label | buf4 | -| main.rs:53:9:53:9 | h | semmle.label | h | -| main.rs:53:13:53:21 | source(...) | semmle.label | source(...) | -| main.rs:54:22:54:25 | [post] buf5 | semmle.label | [post] buf5 | -| main.rs:54:28:54:32 | MacroExpr | semmle.label | MacroExpr | -| main.rs:55:10:55:13 | buf5 | semmle.label | buf5 | -subpaths -testFailures -#select -| main.rs:13:10:13:25 | MacroExpr | main.rs:12:13:12:21 | source(...) | main.rs:13:10:13:25 | MacroExpr | $@ | main.rs:12:13:12:21 | source(...) | source(...) | -| main.rs:16:10:16:23 | MacroExpr | main.rs:15:13:15:21 | source(...) | main.rs:16:10:16:23 | MacroExpr | $@ | main.rs:15:13:15:21 | source(...) | source(...) | -| main.rs:20:10:20:10 | s | main.rs:18:13:18:21 | source(...) | main.rs:20:10:20:10 | s | $@ | main.rs:18:13:18:21 | source(...) | source(...) | -| main.rs:29:10:29:10 | c | main.rs:26:13:26:21 | source(...) | main.rs:29:10:29:10 | c | $@ | main.rs:26:13:26:21 | source(...) | source(...) | -| main.rs:34:10:34:13 | buf1 | main.rs:32:13:32:21 | source(...) | main.rs:34:10:34:13 | buf1 | $@ | main.rs:32:13:32:21 | source(...) | source(...) | -| main.rs:39:10:39:13 | buf2 | main.rs:37:13:37:21 | source(...) | main.rs:39:10:39:13 | buf2 | $@ | main.rs:37:13:37:21 | source(...) | source(...) | -| main.rs:44:10:44:13 | buf3 | main.rs:42:13:42:21 | source(...) | main.rs:44:10:44:13 | buf3 | $@ | main.rs:42:13:42:21 | source(...) | source(...) | -| main.rs:50:10:50:13 | buf4 | main.rs:48:13:48:21 | source(...) | main.rs:50:10:50:13 | buf4 | $@ | main.rs:48:13:48:21 | source(...) | source(...) | -| main.rs:55:10:55:13 | buf5 | main.rs:53:13:53:21 | source(...) | main.rs:55:10:55:13 | buf5 | $@ | main.rs:53:13:53:21 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.ql b/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.ql deleted file mode 100644 index 5dcb7ee70a9d..000000000000 --- a/rust/ql/test/library-tests/format-macros-legacy/inline-taint-flow.ql +++ /dev/null @@ -1,12 +0,0 @@ -/** - * @kind path-problem - */ - -import rust -import utils.test.InlineFlowTest -import DefaultFlowTest -import TaintFlow::PathGraph - -from TaintFlow::PathNode source, TaintFlow::PathNode sink -where TaintFlow::flowPath(source, sink) -select sink, source, sink, "$@", source, source.toString() diff --git a/rust/ql/test/library-tests/format-macros-legacy/main.rs b/rust/ql/test/library-tests/format-macros-legacy/main.rs deleted file mode 100644 index 641391211618..000000000000 --- a/rust/ql/test/library-tests/format-macros-legacy/main.rs +++ /dev/null @@ -1,74 +0,0 @@ -// Verifies that dataflow through the format-family macros is recovered on -// pre-1.94 toolchains, where rust-analyzer no longer expands them and the -// extractor reconstructs the `FormatArgsExpr` (see `rust-toolchain.toml`). - -fn source(i: i64) -> String { - i.to_string() -} - -fn sink(_s: String) {} - -pub fn format_flow() { - let a = source(1); - sink(format!("{}", a)); // $ hasTaintFlow=1 - - let b = source(2); - sink(format!("{b}")); // $ hasTaintFlow=2 - - let c = source(3); - let s = format!("x={c} y={}", c); - sink(s); // $ hasTaintFlow=3 -} - -pub fn exercises_reconstruction() { - // these exercise reconstruction of the rest of the family, including the - // writer-argument handling of `write!`/`writeln!`. - let a = source(4); - let b = format_args!("{}", a); - let c = std::fmt::format(b); - sink(c); // $ hasTaintFlow=4 - - let mut buf1 = String::new(); - let d = source(5); - let _ = buf1.write_str(d.as_str()); - sink(buf1); // $ hasTaintFlow=5 - - let mut buf2 = String::new(); - let e = source(6); - let _ = buf2.write_fmt(format_args!("{e}")); - sink(buf2); // $ hasTaintFlow=6 - - let mut buf3 = String::new(); - let f = source(7); - let _ = std::fmt::write(&mut buf3, format_args!("{f}")); - sink(buf3); // $ hasTaintFlow=7 - - use std::fmt::Write; - let mut buf4 = String::new(); - let g = source(8); - let _ = write!(buf4, "{}", g); - sink(buf4); // $ hasTaintFlow=8 - - let mut buf5 = String::new(); - let h = source(9); - let _ = writeln!(buf5, "{h}"); - sink(buf5); // $ hasTaintFlow=9 -} - -// The log-injection sinks (`println!`/`eprintln!`/`panic!`) are reconstructed -// into their real callees (`_print`/`_eprint`/`panic_fmt`), so the manual sink -// models keep firing on <1.94 exactly as they do on native expansions. -pub fn log_injection_sinks() { - let tainted = std::env::var("USER_INPUT").unwrap_or_default(); // $ Source=environment - - println!("{}", tainted); // $ Alert[rust/log-injection]=environment - eprintln!("{tainted}"); // $ Alert[rust/log-injection]=environment - print!("{}", tainted); // $ Alert[rust/log-injection]=environment - eprint!("{tainted}"); // $ Alert[rust/log-injection]=environment -} - -fn main() { - format_flow(); - exercises_reconstruction(); - log_injection_sinks(); -} diff --git a/rust/ql/test/library-tests/format-macros-legacy/rust-toolchain.toml b/rust/ql/test/library-tests/format-macros-legacy/rust-toolchain.toml deleted file mode 100644 index da4efb0b5b53..000000000000 --- a/rust/ql/test/library-tests/format-macros-legacy/rust-toolchain.toml +++ /dev/null @@ -1,14 +0,0 @@ -# Pinned to a pre-1.94 toolchain on purpose. -# -# rust-analyzer 0.0.347 only expands the builtin `format_args!` machinery against -# a std that carries the new lowering (roughly >= 1.94). On older toolchains the -# format-family macros (`format!`, `println!`, `write!`, ...) fail to expand, so -# the extractor reconstructs the `FormatArgsExpr` itself. This test exercises that -# reconstruction path, which the default test toolchain never hits. -# -# Any toolchain named here must also be pre-installed in `../setup.sh`, otherwise -# the parallel QL tests race on `rustup` auto-install. -[toolchain] -channel = "1.93" -profile = "minimal" -components = [ "rust-src" ] diff --git a/rust/ql/test/setup.sh b/rust/ql/test/setup.sh index 24fa06a70e44..f3cf992e0567 100755 --- a/rust/ql/test/setup.sh +++ b/rust/ql/test/setup.sh @@ -14,9 +14,5 @@ rustup toolchain install 1.97.0 --profile minimal --component rust-src pushd ../../extractor/src/nightly-toolchain rustup install popd -# pre-1.94 toolchain exercising the extractor's `FormatArgsExpr` reconstruction -pushd library-tests/format-macros-legacy -rustup install -popd # this needs to be last to set the default toolchain rustup install From 4a601300880bd8179dfd7a675405d8e70b456a60 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Mon, 21 Sep 2026 12:01:52 +0200 Subject: [PATCH 1185/2098] Rust: Make `await` call `async` blocks as lambdas in dataflow --- .../rust/dataflow/internal/DataFlowImpl.qll | 17 ++++++++++--- .../codeql/rust/dataflow/internal/Node.qll | 19 ++++++++++++++ .../dataflow/lambdas/inline-flow.expected | 25 +++++++++++++++++++ .../library-tests/dataflow/lambdas/main.rs | 8 +++--- 4 files changed, 61 insertions(+), 8 deletions(-) diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll index bf6076e09055..60ec0fca820f 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll @@ -62,6 +62,9 @@ final class DataFlowCall extends TDataFlowCall { /** Gets the underlying call, if any. */ Call asCall() { this = TCall(result) } + /** Gets the underlying await expression, if any. */ + AwaitExpr asAwaitExpr() { this = TAwaitExpr(result) } + predicate isImplicitDerefCall(Expr e, DerefChain derefChain, int i, Function target) { this = TImplicitDerefCall(e, derefChain, i, target) } @@ -73,7 +76,8 @@ final class DataFlowCall extends TDataFlowCall { } DataFlowCallable getEnclosingCallable() { - result.asCfgScope() = this.asCall().getEnclosingCfgScope() + result.asCfgScope() = + [this.asCall().getEnclosingCfgScope(), this.asAwaitExpr().getEnclosingCfgScope()] or result.asCfgScope() = any(Expr e | this.isImplicitDerefCall(e, _, _, _)).getEnclosingCfgScope() or @@ -81,7 +85,7 @@ final class DataFlowCall extends TDataFlowCall { } string toString() { - result = this.asCall().toString() + result = [this.asCall().toString(), this.asAwaitExpr().toString()] or exists(Expr e, DerefChain derefChain, int i | this.isImplicitDerefCall(e, derefChain, i, _) and @@ -97,7 +101,7 @@ final class DataFlowCall extends TDataFlowCall { } Location getLocation() { - result = this.asCall().getLocation() + result = [this.asCall().getLocation(), this.asAwaitExpr().getLocation()] or result = any(Expr e | this.isImplicitDerefCall(e, _, _, _)).getLocation() } @@ -1004,7 +1008,11 @@ module RustDataFlowGen implements InputSig */ predicate lambdaCall(DataFlowCall call, LambdaCallKind kind, Node receiver) { ( - receiver.asExpr() = call.asCall().(CallExprImpl::DynamicCallExpr).getFunction() + receiver.asExpr() = + [ + call.asCall().(CallExprImpl::DynamicCallExpr).getFunction(), + call.asAwaitExpr().getExpr() + ] or call.isSummaryCall(_, receiver.(FlowSummaryNode).getSummaryNode()) ) and @@ -1176,6 +1184,7 @@ private module Cached { Stages::DataFlowStage::ref() and call.hasEnclosingCfgScope() } or + TAwaitExpr(AwaitExpr await) { await.hasEnclosingCfgScope() } or TImplicitDerefCall(Expr e, DerefChain derefChain, int i, Function target) { TypeInference::implicitDerefChainBorrow(e, derefChain, _) and target = derefChain.getElement(i).getDerefFunction() and diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/Node.qll b/rust/ql/lib/codeql/rust/dataflow/internal/Node.qll index cbe638d430c4..b82c0f9221a1 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/Node.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/Node.qll @@ -435,6 +435,20 @@ final class ClosureArgumentNode extends ArgumentNode, ExprNode { } } +/** + * A data flow node that represents the run-time representation of an async + * block passed into its body when awaited. + */ +final class AsyncBlockArgumentNode extends ArgumentNode, ExprNode { + private AwaitExpr await; + + AsyncBlockArgumentNode() { this.asExpr() = await.getExpr() } + + override predicate isArgumentOf(DataFlowCall call, RustDataFlow::ArgumentPosition pos) { + call.asAwaitExpr() = await and pos.isClosureSelf() + } +} + /** An SSA node. */ class SsaNode extends Node, TSsaNode { SsaImpl::DataFlowIntegration::SsaNode node; @@ -485,12 +499,17 @@ final private class ExprOutNode extends ExprNode, OutNode { not call instanceof DerefExpr and // Handled by `DerefOutNode` not call instanceof IndexExpr // Handled by `IndexOutNode` ) + or + this.asExpr() instanceof AwaitExpr } /** Gets the underlying call node that includes this out node. */ override DataFlowCall getCall(ReturnKind kind) { result.asCall() = n and kind = TNormalReturnKind() + or + result.asAwaitExpr() = n and + kind = TNormalReturnKind() } } diff --git a/rust/ql/test/library-tests/dataflow/lambdas/inline-flow.expected b/rust/ql/test/library-tests/dataflow/lambdas/inline-flow.expected index 08fb2a66015e..6b9075dd7b0e 100644 --- a/rust/ql/test/library-tests/dataflow/lambdas/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/lambdas/inline-flow.expected @@ -63,6 +63,14 @@ edges | main.rs:111:26:111:36 | \|...\| ... : ... => .. [captured a] | main.rs:111:35:111:35 | a | provenance | heuristic-callback | | main.rs:112:26:112:36 | \|...\| ... : ... => .. [captured a] | main.rs:112:35:112:35 | a | provenance | heuristic-callback | | main.rs:113:26:113:36 | \|...\| ... : ... => .. [captured a] | main.rs:113:35:113:35 | a | provenance | heuristic-callback | +| main.rs:120:30:120:40 | source(...) | main.rs:121:14:121:25 | await future | provenance | | +| main.rs:125:20:125:30 | source(...) | main.rs:126:9:128:9 | { ... } : ... => .. [captured data] | provenance | | +| main.rs:126:9:128:9 | { ... } : ... => .. [captured data] | main.rs:127:18:127:21 | data | provenance | | +| main.rs:133:20:133:30 | source(...) | main.rs:135:14:135:19 | future [captured data] | provenance | | +| main.rs:135:14:135:19 | future [captured data] | main.rs:134:30:134:33 | data | provenance | | +| main.rs:135:14:135:19 | future [captured data] | main.rs:135:14:135:25 | await future | provenance | | +| main.rs:141:9:143:9 | [post] { ... } : ... => .. [captured captured] | main.rs:145:14:145:21 | captured | provenance | | +| main.rs:142:24:142:34 | source(...) | main.rs:141:9:143:9 | [post] { ... } : ... => .. [captured captured] | provenance | | nodes | main.rs:10:20:10:52 | if cond {...} else {...} | semmle.label | if cond {...} else {...} | | main.rs:10:30:10:39 | source(...) | semmle.label | source(...) | @@ -138,9 +146,22 @@ nodes | main.rs:112:35:112:35 | a | semmle.label | a | | main.rs:113:26:113:36 | \|...\| ... : ... => .. [captured a] | semmle.label | \|...\| ... : ... => .. [captured a] | | main.rs:113:35:113:35 | a | semmle.label | a | +| main.rs:120:30:120:40 | source(...) | semmle.label | source(...) | +| main.rs:121:14:121:25 | await future | semmle.label | await future | +| main.rs:125:20:125:30 | source(...) | semmle.label | source(...) | +| main.rs:126:9:128:9 | { ... } : ... => .. [captured data] | semmle.label | { ... } : ... => .. [captured data] | +| main.rs:127:18:127:21 | data | semmle.label | data | +| main.rs:133:20:133:30 | source(...) | semmle.label | source(...) | +| main.rs:134:30:134:33 | data | semmle.label | data | +| main.rs:135:14:135:19 | future [captured data] | semmle.label | future [captured data] | +| main.rs:135:14:135:25 | await future | semmle.label | await future | +| main.rs:141:9:143:9 | [post] { ... } : ... => .. [captured captured] | semmle.label | [post] { ... } : ... => .. [captured captured] | +| main.rs:142:24:142:34 | source(...) | semmle.label | source(...) | +| main.rs:145:14:145:21 | captured | semmle.label | captured | subpaths | main.rs:29:21:29:21 | a | main.rs:27:20:27:23 | ... | main.rs:27:26:27:52 | if cond {...} else {...} | main.rs:29:13:29:22 | f(...) | | main.rs:77:21:77:21 | a | main.rs:66:24:66:32 | ...: i64 | main.rs:66:42:72:1 | { ... } | main.rs:77:13:77:22 | f(...) | +| main.rs:135:14:135:19 | future [captured data] | main.rs:134:30:134:33 | data | main.rs:134:30:134:33 | data | main.rs:135:14:135:25 | await future | testFailures #select | main.rs:11:10:11:16 | f(...) | main.rs:10:30:10:39 | source(...) | main.rs:11:10:11:16 | f(...) | $@ | main.rs:10:30:10:39 | source(...) | source(...) | @@ -161,3 +182,7 @@ testFailures | main.rs:111:35:111:35 | a | main.rs:109:13:109:22 | source(...) | main.rs:111:35:111:35 | a | $@ | main.rs:109:13:109:22 | source(...) | source(...) | | main.rs:112:35:112:35 | a | main.rs:109:13:109:22 | source(...) | main.rs:112:35:112:35 | a | $@ | main.rs:109:13:109:22 | source(...) | source(...) | | main.rs:113:35:113:35 | a | main.rs:109:13:109:22 | source(...) | main.rs:113:35:113:35 | a | $@ | main.rs:109:13:109:22 | source(...) | source(...) | +| main.rs:121:14:121:25 | await future | main.rs:120:30:120:40 | source(...) | main.rs:121:14:121:25 | await future | $@ | main.rs:120:30:120:40 | source(...) | source(...) | +| main.rs:127:18:127:21 | data | main.rs:125:20:125:30 | source(...) | main.rs:127:18:127:21 | data | $@ | main.rs:125:20:125:30 | source(...) | source(...) | +| main.rs:135:14:135:25 | await future | main.rs:133:20:133:30 | source(...) | main.rs:135:14:135:25 | await future | $@ | main.rs:133:20:133:30 | source(...) | source(...) | +| main.rs:145:14:145:21 | captured | main.rs:142:24:142:34 | source(...) | main.rs:145:14:145:21 | captured | $@ | main.rs:142:24:142:34 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/lambdas/main.rs b/rust/ql/test/library-tests/dataflow/lambdas/main.rs index 5f21e22d08e8..650734bdd149 100644 --- a/rust/ql/test/library-tests/dataflow/lambdas/main.rs +++ b/rust/ql/test/library-tests/dataflow/lambdas/main.rs @@ -118,13 +118,13 @@ mod async_blocks { async fn async_block_flow_out() { let future = async { source(206) }; - sink(future.await); // $ MISSING: hasValueFlow=206 + sink(future.await); // $ hasValueFlow=206 } async fn async_block_flow_in() { let data = source(207); async { - sink(data); // $ MISSING: hasValueFlow=207 + sink(data); // $ hasValueFlow=207 } .await; } @@ -132,7 +132,7 @@ mod async_blocks { async fn async_block_flow_through() { let data = source(208); let future = async { data }; - sink(future.await); // $ MISSING: hasValueFlow=208 + sink(future.await); // $ hasValueFlow=208 } async fn async_block_captured_variable() { @@ -142,7 +142,7 @@ mod async_blocks { captured = source(209); } .await; - sink(captured); // $ MISSING: hasValueFlow=209 + sink(captured); // $ hasValueFlow=209 } async fn boxed_async_block_captured_variable() { From 7a0224c14c883a7b95af59eb2b28fbef0a4b1b7c Mon Sep 17 00:00:00 2001 From: GiangTran-FinX Date: Mon, 21 Sep 2026 17:35:47 +0700 Subject: [PATCH 1186/2098] Escape `'` in generated dbscheme names `escape_name` maps `"` to `dquote` but leaves `'` untouched, so a grammar whose node types contain a single quote generates an invalid dbscheme identifier. Lua hits this: its `string` node has `'` as a delimiter token, and the generator emits `@lua_string_'`, which the dbscheme parser rejects with ERROR: token recognition error at: ''' No shipped language contains a bare `'` in a node type, which is why this has not surfaced before. Found while building an out-of-tree extractor. Adds the missing mapping and a test covering both string delimiters. --- shared/tree-sitter-extractor/src/node_types.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/shared/tree-sitter-extractor/src/node_types.rs b/shared/tree-sitter-extractor/src/node_types.rs index 2967bc845802..11e4741ae429 100644 --- a/shared/tree-sitter-extractor/src/node_types.rs +++ b/shared/tree-sitter-extractor/src/node_types.rs @@ -386,6 +386,7 @@ fn escape_name(name: &str) -> String { ':' => result.push_str("colon"), ';' => result.push_str("semicolon"), '"' => result.push_str("dquote"), + '\'' => result.push_str("squote"), '*' => result.push_str("star"), '+' => result.push_str("plus"), '-' => result.push_str("minus"), @@ -448,6 +449,14 @@ fn dbscheme_name_to_class_name(dbscheme_name: &str) -> String { .join("") } +#[test] +fn escape_name_quotes_test() { + // Both string delimiters need a name: a grammar whose node types contain + // `'` used to produce the invalid dbscheme identifier `@lang_string_'`. + assert_eq!("dquote", escape_name("\"")); + assert_eq!("squote", escape_name("'")); +} + #[test] fn to_snake_case_test() { assert_eq!("ruby", to_snake_case("Ruby")); From aa9ce8e281366b39d58502337edc22f8800b37ec Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Mon, 21 Sep 2026 13:14:50 +0200 Subject: [PATCH 1187/2098] Rust: Accept changes in test results --- .../test/library-tests/dataflow/global/inline-flow.expected | 5 +++++ rust/ql/test/library-tests/dataflow/global/main.rs | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/rust/ql/test/library-tests/dataflow/global/inline-flow.expected b/rust/ql/test/library-tests/dataflow/global/inline-flow.expected index e13411a7ab03..6fe331bb4d9b 100644 --- a/rust/ql/test/library-tests/dataflow/global/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/global/inline-flow.expected @@ -196,7 +196,9 @@ edges | main.rs:342:9:342:9 | a | main.rs:343:10:343:10 | a | provenance | | | main.rs:342:13:342:26 | async_source(...) | main.rs:342:9:342:9 | a | provenance | | | main.rs:346:13:346:13 | c | main.rs:347:14:347:14 | c | provenance | | +| main.rs:346:13:346:13 | c | main.rs:348:9:348:9 | c | provenance | | | main.rs:346:17:346:25 | source(...) | main.rs:346:13:346:13 | c | provenance | | +| main.rs:348:9:348:9 | c | main.rs:350:10:350:16 | await b | provenance | | | main.rs:354:9:354:9 | a | main.rs:355:10:355:10 | a | provenance | | | main.rs:354:13:354:55 | ...::block_on(...) | main.rs:354:9:354:9 | a | provenance | | | main.rs:354:41:354:54 | async_source(...) | main.rs:354:13:354:55 | ...::block_on(...) | provenance | MaD:3 | @@ -443,6 +445,8 @@ nodes | main.rs:346:13:346:13 | c | semmle.label | c | | main.rs:346:17:346:25 | source(...) | semmle.label | source(...) | | main.rs:347:14:347:14 | c | semmle.label | c | +| main.rs:348:9:348:9 | c | semmle.label | c | +| main.rs:350:10:350:16 | await b | semmle.label | await b | | main.rs:354:9:354:9 | a | semmle.label | a | | main.rs:354:13:354:55 | ...::block_on(...) | semmle.label | ...::block_on(...) | | main.rs:354:41:354:54 | async_source(...) | semmle.label | async_source(...) | @@ -539,6 +543,7 @@ testFailures | main.rs:337:10:337:10 | a | main.rs:336:13:336:21 | source(...) | main.rs:337:10:337:10 | a | $@ | main.rs:336:13:336:21 | source(...) | source(...) | | main.rs:343:10:343:10 | a | main.rs:336:13:336:21 | source(...) | main.rs:343:10:343:10 | a | $@ | main.rs:336:13:336:21 | source(...) | source(...) | | main.rs:347:14:347:14 | c | main.rs:346:17:346:25 | source(...) | main.rs:347:14:347:14 | c | $@ | main.rs:346:17:346:25 | source(...) | source(...) | +| main.rs:350:10:350:16 | await b | main.rs:346:17:346:25 | source(...) | main.rs:350:10:350:16 | await b | $@ | main.rs:346:17:346:25 | source(...) | source(...) | | main.rs:355:10:355:10 | a | main.rs:336:13:336:21 | source(...) | main.rs:355:10:355:10 | a | $@ | main.rs:336:13:336:21 | source(...) | source(...) | | main.rs:404:14:404:15 | n1 | main.rs:379:13:379:21 | source(...) | main.rs:404:14:404:15 | n1 | $@ | main.rs:379:13:379:21 | source(...) | source(...) | | main.rs:408:14:408:15 | n2 | main.rs:379:13:379:21 | source(...) | main.rs:408:14:408:15 | n2 | $@ | main.rs:379:13:379:21 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/global/main.rs b/rust/ql/test/library-tests/dataflow/global/main.rs index b3a3af1be95e..2d8975e153a5 100644 --- a/rust/ql/test/library-tests/dataflow/global/main.rs +++ b/rust/ql/test/library-tests/dataflow/global/main.rs @@ -347,7 +347,7 @@ async fn test_async_await_async_part() { sink(c); // $ hasValueFlow=2 c }; - sink(b.await); // $ MISSING: hasValueFlow=2 + sink(b.await); // $ hasValueFlow=2 } fn test_async_await() { From fc00d793ba1a5a9c4b257bfdcaaefbd93e50b768 Mon Sep 17 00:00:00 2001 From: Asger F Date: Mon, 21 Sep 2026 14:00:47 +0200 Subject: [PATCH 1188/2098] unified: Suffix parameter positions with a colon --- .../codeql/unified/internal/dataflow/ParameterPositions.qll | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/ParameterPositions.qll b/unified/ql/lib/codeql/unified/internal/dataflow/ParameterPositions.qll index 81a11f3a0419..4d7b1fa77102 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/ParameterPositions.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/ParameterPositions.qll @@ -21,7 +21,8 @@ class ParameterPosition extends TParameterPosition { or result = this.asPositional().toString() or - result = "\"" + this.asNamed() + "\"" + // Suffix with a colon to prevent a confusing name clash with "receiver". This also aligns with MaD syntax. + result = this.asNamed() + ":" } } From fd90099ed9171d6c2ac89e6d05ff739c77e75ac0 Mon Sep 17 00:00:00 2001 From: Asger F Date: Mon, 21 Sep 2026 14:02:00 +0200 Subject: [PATCH 1189/2098] unified: Fix some typos in comments --- unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll | 2 +- .../ql/lib/codeql/unified/internal/dataflow/DataFlowCall.qll | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll index 716e3e7182a1..405455473d23 100644 --- a/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/LocalNameBinding.qll @@ -475,7 +475,7 @@ class PotentialLocalNameAccess extends IdentifierExpr { predicate isBindingSite() { this instanceof NameBinding } } -/** Gets implicitly-declared variable through which the given callable refers to its receiver. */ +/** Gets the implicitly-declared variable through which the given callable refers to its receiver. */ LocalVariable getImplicitReceiverVariable(Callable callable) { exists(string name | name = any(NameBindingPlugin p).getImplicitReceiverParameterName(callable) and diff --git a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowCall.qll b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowCall.qll index e6aeebdeee9d..c316f91ba520 100644 --- a/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowCall.qll +++ b/unified/ql/lib/codeql/unified/internal/dataflow/DataFlowCall.qll @@ -17,7 +17,7 @@ class DataFlowCall extends TDataFlowCall { /** Gets the `CallExpr` wrapped by this dataflow call, if any. */ CallExpr asExplicitCall() { this = TExplicitCall(result) } - /** Gets a string representation of this call. */ + /** Gets a textual representation of this call. */ string toString() { result = this.asExplicitCall().toString() } /** Gets the location of this call, if any. */ From ea2458f099f84bb41f5718765f6f2b19ead12c95 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 21 Sep 2026 14:48:40 +0200 Subject: [PATCH 1190/2098] Rust: Add missing model (and remove duplicate model) --- .../lib/codeql/rust/frameworks/stdlib/core.model.yml | 2 +- .../library-tests/dataflow/local/inline-flow.expected | 11 +++++++++++ rust/ql/test/library-tests/dataflow/local/main.rs | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml index 68b34d2f6797..99acf4a5d503 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml @@ -100,7 +100,6 @@ extensions: - ["::next", "Argument[self].Reference.Element", "ReturnValue.Field[core::option::Option::Some(0)]", "value", "manual"] - ["::collect", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] - ["::map", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"] - - ["::for_each", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"] - ["::chain", "Argument[self]", "ReturnValue", "taint", "manual"] - ["::chain", "Argument[0]", "ReturnValue", "taint", "manual"] - ["::take", "Argument[self]", "ReturnValue", "taint", "manual"] @@ -143,6 +142,7 @@ extensions: # Slice - ["<[]>::get", "Argument[self].Reference.Element", "ReturnValue.Field[core::option::Option::Some(0)].Reference", "value", "manual"] - ["<[]>::iter", "Argument[self].Reference.Element", "ReturnValue.Element.Reference", "value", "manual"] + - ["<[]>::iter_mut", "Argument[self].Reference.Element", "ReturnValue.Element.Reference", "value", "manual"] - addsTo: pack: codeql/rust-all extensible: sourceModel 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 e350439d5580..0ffebef2f4b2 100644 --- a/rust/ql/test/library-tests/dataflow/local/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/local/inline-flow.expected @@ -313,6 +313,7 @@ edges | main.rs:542:9:542:18 | mut vs_mut [element] | main.rs:544:10:544:15 | vs_mut [element] | provenance | | | main.rs:542:9:542:18 | mut vs_mut [element] | main.rs:545:11:545:16 | vs_mut [element] | provenance | | | main.rs:542:9:542:18 | mut vs_mut [element] | main.rs:546:11:546:16 | vs_mut [element] | provenance | | +| main.rs:542:9:542:18 | mut vs_mut [element] | main.rs:548:19:548:24 | vs_mut [element] | provenance | | | main.rs:542:22:542:42 | [...] [element] | main.rs:542:9:542:18 | mut vs_mut [element] | provenance | | | main.rs:542:23:542:32 | source(...) | main.rs:542:22:542:42 | [...] [element] | provenance | | | main.rs:544:10:544:15 | vs_mut [element] | main.rs:544:10:544:18 | vs_mut[0] | provenance | MaD:14 | @@ -324,6 +325,10 @@ edges | main.rs:546:11:546:23 | vs_mut.iter() [element, &ref] | main.rs:546:11:546:30 | ... .nth(...) [Some, &ref] | provenance | MaD:13 | | main.rs:546:11:546:30 | ... .nth(...) [Some, &ref] | main.rs:546:11:546:39 | ... .unwrap() [&ref] | provenance | MaD:15 | | main.rs:546:11:546:39 | ... .unwrap() [&ref] | main.rs:546:10:546:39 | * ... | provenance | MaD:1 | +| main.rs:548:9:548:14 | &mut ... [&ref] | main.rs:548:14:548:14 | v | provenance | | +| main.rs:548:14:548:14 | v | main.rs:549:14:549:14 | v | provenance | | +| main.rs:548:19:548:24 | vs_mut [element] | main.rs:548:19:548:35 | vs_mut.iter_mut() [element, &ref] | provenance | MaD:2 | +| main.rs:548:19:548:35 | vs_mut.iter_mut() [element, &ref] | main.rs:548:9:548:14 | &mut ... [&ref] | provenance | | | main.rs:554:9:554:9 | a | main.rs:559:10:559:10 | a | provenance | | | main.rs:554:13:554:22 | source(...) | main.rs:554:9:554:9 | a | provenance | | | main.rs:555:9:555:9 | b | main.rs:560:15:560:15 | b | provenance | | @@ -698,6 +703,11 @@ nodes | main.rs:546:11:546:23 | vs_mut.iter() [element, &ref] | semmle.label | vs_mut.iter() [element, &ref] | | main.rs:546:11:546:30 | ... .nth(...) [Some, &ref] | semmle.label | ... .nth(...) [Some, &ref] | | main.rs:546:11:546:39 | ... .unwrap() [&ref] | semmle.label | ... .unwrap() [&ref] | +| main.rs:548:9:548:14 | &mut ... [&ref] | semmle.label | &mut ... [&ref] | +| main.rs:548:14:548:14 | v | semmle.label | v | +| main.rs:548:19:548:24 | vs_mut [element] | semmle.label | vs_mut [element] | +| main.rs:548:19:548:35 | vs_mut.iter_mut() [element, &ref] | semmle.label | vs_mut.iter_mut() [element, &ref] | +| main.rs:549:14:549:14 | v | semmle.label | v | | main.rs:554:9:554:9 | a | semmle.label | a | | main.rs:554:13:554:22 | source(...) | semmle.label | source(...) | | main.rs:555:9:555:9 | b | semmle.label | b | @@ -801,6 +811,7 @@ testFailures | main.rs:544:10:544:18 | vs_mut[0] | main.rs:542:23:542:32 | source(...) | main.rs:544:10:544:18 | vs_mut[0] | $@ | main.rs:542:23:542:32 | source(...) | source(...) | | main.rs:545:10:545:39 | * ... | main.rs:542:23:542:32 | source(...) | main.rs:545:10:545:39 | * ... | $@ | main.rs:542:23:542:32 | source(...) | source(...) | | main.rs:546:10:546:39 | * ... | main.rs:542:23:542:32 | source(...) | main.rs:546:10:546:39 | * ... | $@ | main.rs:542:23:542:32 | source(...) | source(...) | +| main.rs:549:14:549:14 | v | main.rs:542:23:542:32 | source(...) | main.rs:549:14:549:14 | v | $@ | main.rs:542:23:542:32 | source(...) | source(...) | | main.rs:559:10:559:10 | a | main.rs:554:13:554:22 | source(...) | main.rs:559:10:559:10 | a | $@ | main.rs:554:13:554:22 | source(...) | source(...) | | main.rs:560:14:560:15 | &b | main.rs:555:13:555:22 | source(...) | main.rs:560:14:560:15 | &b | $@ | main.rs:555:13:555:22 | source(...) | source(...) | | main.rs:561:14:561:18 | c_ref | main.rs:556:13:556:22 | source(...) | main.rs:561:14:561:18 | c_ref | $@ | main.rs:556:13:556:22 | 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 5b7eb211a6f6..0a4dbaceee9b 100644 --- a/rust/ql/test/library-tests/dataflow/local/main.rs +++ b/rust/ql/test/library-tests/dataflow/local/main.rs @@ -546,7 +546,7 @@ fn iterators() { sink(*vs_mut.iter().nth(0).unwrap()); // $ hasValueFlow=92 for &mut v in vs_mut.iter_mut() { - sink(v); // $ MISSING: hasValueFlow=92 + sink(v); // $ hasValueFlow=92 } } From d4ade710317a16e1eba1be1f9e88d7d025315431 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 21 Sep 2026 19:20:50 +0200 Subject: [PATCH 1191/2098] unified: Add Swift super expression corpus test Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../swift/expressions/super-expression.output | 184 ++++++++++++++++++ .../swift/expressions/super-expression.swift | 12 ++ 2 files changed, 196 insertions(+) create mode 100644 unified/extractor/tests/corpus/swift/expressions/super-expression.output create mode 100644 unified/extractor/tests/corpus/swift/expressions/super-expression.swift diff --git a/unified/extractor/tests/corpus/swift/expressions/super-expression.output b/unified/extractor/tests/corpus/swift/expressions/super-expression.output new file mode 100644 index 000000000000..21a04195c28b --- /dev/null +++ b/unified/extractor/tests/corpus/swift/expressions/super-expression.output @@ -0,0 +1,184 @@ +class Base { + var value = 0 + + func update() {} +} + +class Derived: Base { + override func update() { + _ = super.value + super.update() + } +} + +--- + +sourceFile + endOfFileToken: endOfFile + statements: + codeBlockItem + item: + classDecl + attributes: + name: identifier "Base" + memberBlock: + memberBlock + leftBrace: { + rightBrace: } + members: + memberBlockItem + decl: + variableDecl + attributes: + modifiers: + bindingSpecifier: var + bindings: + patternBinding + initializer: + initializerClause + equal: = + value: + integerLiteralExpr + literal: integerLiteral "0" + pattern: + identifierPattern + identifier: identifier "value" + memberBlockItem + decl: + functionDecl + attributes: + body: + codeBlock + leftBrace: { + rightBrace: } + statements: + name: identifier "update" + modifiers: + signature: + functionSignature + parameterClause: + functionParameterClause + leftParen: ( + rightParen: ) + parameters: + funcKeyword: func + modifiers: + classKeyword: class + codeBlockItem + item: + classDecl + attributes: + name: identifier "Derived" + inheritanceClause: + inheritanceClause + colon: : + inheritedTypes: + inheritedType + type: + identifierType + name: identifier "Base" + memberBlock: + memberBlock + leftBrace: { + rightBrace: } + members: + memberBlockItem + decl: + functionDecl + attributes: + body: + codeBlock + leftBrace: { + rightBrace: } + statements: + codeBlockItem + item: + infixOperatorExpr + operator: + assignmentExpr + equal: = + leftOperand: + discardAssignmentExpr + wildcard: _ + rightOperand: + memberAccessExpr + period: . + declName: + declReferenceExpr + baseName: identifier "value" + base: + superExpr + superKeyword: super + codeBlockItem + item: + functionCallExpr + leftParen: ( + rightParen: ) + arguments: + additionalTrailingClosures: + calledExpression: + memberAccessExpr + period: . + declName: + declReferenceExpr + baseName: identifier "update" + base: + superExpr + superKeyword: super + name: identifier "update" + modifiers: + declModifier + name: override + signature: + functionSignature + parameterClause: + functionParameterClause + leftParen: ( + rightParen: ) + parameters: + funcKeyword: func + modifiers: + classKeyword: class + +--- + +top_level source="⟨body⟩" + body: + block source="⟨stmt⟩\n\n⟨stmt⟩" + stmt: + class_like_declaration source="⟨modifier⟩ ⟨name_node⟩ {\n ⟨member⟩\n\n ⟨member⟩\n}" + modifier: modifier "class" source="class" + name_node: identifier "Base" source="Base" + member: + variable_declaration source="⟨modifier⟩ ⟨pattern⟩ = ⟨value⟩" + modifier: modifier "var" source="var" + pattern: identifier "value" source="value" + value: int_literal "0" source="0" + function_declaration source="⟨body⟩⟨name_node⟩" + name_node: identifier "update" source="update" + body: block "func update() {}" source="func update() {}" + class_like_declaration source="⟨modifier⟩⟨base_type⟩⟨name_node⟩⟨member⟩" + modifier: modifier "class" source="class" + name_node: identifier "Derived" source="Derived" + base_type: + base_type source="class Derived: ⟨type⟩ {\n override func update() {\n _ = super.value\n super.update()\n }\n}" + type: identifier "Base" source="Base" + member: + function_declaration source="⟨modifier⟩⟨body⟩⟨name_node⟩" + modifier: modifier "override" source="override" + name_node: identifier "update" source="update" + body: + block source="override func update() {\n ⟨stmt⟩\n ⟨stmt⟩\n }" + stmt: + binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩" + left: identifier "_" source="_" + operator: infix_operator "=" source="=" + right: + member_access_expr source="⟨base⟩.⟨member_name_node⟩" + base: super_expr "super" source="super" + member_name_node: identifier "value" source="value" + call_expr source="⟨callee⟩()" + callee: + member_access_expr source="⟨base⟩.⟨member_name_node⟩" + base: super_expr "super" source="super" + member_name_node: identifier "update" source="update" diff --git a/unified/extractor/tests/corpus/swift/expressions/super-expression.swift b/unified/extractor/tests/corpus/swift/expressions/super-expression.swift new file mode 100644 index 000000000000..6d1c37a70d55 --- /dev/null +++ b/unified/extractor/tests/corpus/swift/expressions/super-expression.swift @@ -0,0 +1,12 @@ +class Base { + var value = 0 + + func update() {} +} + +class Derived: Base { + override func update() { + _ = super.value + super.update() + } +} From 74fdfb843eb9071d5413429661b33c8a6cd21ebd Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 21 Sep 2026 19:21:08 +0200 Subject: [PATCH 1192/2098] unified: Extract Swift super expressions Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- unified/extractor/src/languages/swift/swift.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/unified/extractor/src/languages/swift/swift.rs b/unified/extractor/src/languages/swift/swift.rs index 8242e37a8a3f..dd7c4068a021 100644 --- a/unified/extractor/src/languages/swift/swift.rs +++ b/unified/extractor/src/languages/swift/swift.rs @@ -1044,8 +1044,9 @@ fn translation_rules() -> Vec> { // becomes a `modifier`; its source text is the modifier spelling. rule!((attribute) @m => (modifier #{m})), rule!((declModifier) @m => (modifier #{m})), - // A `super` expression. - rule!((superExpr) => (super_expr)), + // Preserve the `super` keyword as a dedicated expression, normally used + // as the base of a member access (`super.foo`). + rule!((superExpr superKeyword: @keyword) => (super_expr #{keyword})), // Type expressions. A generic type applied with explicit arguments // (`Set`) becomes a `generic_type_expr` whose `base` is the type // name and whose `type_argument`s are the (structured) arguments — the From dc94550d0a49a3e347aca69b1e404e88959f6c1e Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 21 Sep 2026 19:33:39 +0200 Subject: [PATCH 1193/2098] unified: Update basic block slice expectation Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../test/library-tests/controlflow/basicblock-slices.expected | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/ql/test/library-tests/controlflow/basicblock-slices.expected b/unified/ql/test/library-tests/controlflow/basicblock-slices.expected index 97a1d1a279f0..90d7959906ce 100644 --- a/unified/ql/test/library-tests/controlflow/basicblock-slices.expected +++ b/unified/ql/test/library-tests/controlflow/basicblock-slices.expected @@ -323,7 +323,7 @@ | 390 | cfg.swift:390:1:394:1 | ClassLikeDeclaration | 'ClassLikeDeclaration -V Derived -^ BaseType -V C' | | 391 | cfg.swift:391:3:393:3 | Block | 'Block' | | 391 | cfg.swift:391:3:393:3 | ConstructorDeclaration | 'ConstructorDeclaration' | -| 392 | cfg.swift:392:5:392:9 | | ' -^ ... .init -> Argument -V 0 -^ ... .init(...)' | +| 392 | cfg.swift:392:5:392:9 | super | 'super -^ ... .init -> Argument -V 0 -^ ... .init(...)' | | 396 | cfg.swift:396:1:404:1 | FunctionDeclaration | 'FunctionDeclaration' | | 396 | cfg.swift:396:21:396:21 | x | 'x -^ Block' | | 397 | cfg.swift:397:3:402:3 | TryExpr | 'TryExpr -V Block' | From d89d9e27e1f3780791d241f797f737a10b59e446 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 21 Sep 2026 19:43:30 +0200 Subject: [PATCH 1194/2098] Unified: Extract `init` keywords --- unified/extractor/src/languages/swift/swift.rs | 2 ++ .../corpus/swift/types/class-with-initializer.output | 3 ++- .../corpus/swift/types/constructor-with-parameters.output | 3 ++- unified/ql/test/library-tests/controlflow/cfg.expected | 4 ++++ unified/ql/test/library-tests/controlflow/cfg.swift | 8 ++++---- 5 files changed, 14 insertions(+), 6 deletions(-) diff --git a/unified/extractor/src/languages/swift/swift.rs b/unified/extractor/src/languages/swift/swift.rs index 8242e37a8a3f..a7253009146d 100644 --- a/unified/extractor/src/languages/swift/swift.rs +++ b/unified/extractor/src/languages/swift/swift.rs @@ -1274,6 +1274,7 @@ fn translation_rules() -> Vec> { // nest under `signature` (as for `functionDecl`). rule!( (initializerDecl + initKeyword: @initK modifiers: _* @mods signature: (functionSignature parameterClause: (functionParameterClause parameters: _* @params)) @@ -1281,6 +1282,7 @@ fn translation_rules() -> Vec> { => (constructor_declaration modifier: {mods} + name_node: (identifier #{initK}) parameter: {params} body: (block stmt: {body_stmts})) ), diff --git a/unified/extractor/tests/corpus/swift/types/class-with-initializer.output b/unified/extractor/tests/corpus/swift/types/class-with-initializer.output index f5e85a979d67..be9b7be2deb9 100644 --- a/unified/extractor/tests/corpus/swift/types/class-with-initializer.output +++ b/unified/extractor/tests/corpus/swift/types/class-with-initializer.output @@ -98,7 +98,8 @@ top_level source="⟨body⟩" modifier: modifier "var" source="var" pattern: identifier "x" source="x" type: identifier "Int" source="Int" - constructor_declaration source="⟨body⟩⟨parameter⟩" + constructor_declaration source="⟨name_node⟩⟨body⟩⟨parameter⟩" + name_node: identifier "init" source="init" parameter: parameter source="⟨pattern⟩: ⟨type⟩" type: identifier "Int" source="Int" diff --git a/unified/extractor/tests/corpus/swift/types/constructor-with-parameters.output b/unified/extractor/tests/corpus/swift/types/constructor-with-parameters.output index 72d8952ea356..82bda546786f 100644 --- a/unified/extractor/tests/corpus/swift/types/constructor-with-parameters.output +++ b/unified/extractor/tests/corpus/swift/types/constructor-with-parameters.output @@ -67,7 +67,8 @@ top_level source="⟨body⟩" modifier: modifier "struct" source="struct" name_node: identifier "Size" source="Size" member: - constructor_declaration source="⟨body⟩⟨parameter⟩⟨parameter⟩" + constructor_declaration source="⟨name_node⟩⟨body⟩⟨parameter⟩⟨parameter⟩" + name_node: identifier "init" source="init" parameter: parameter source="⟨external_name_node⟩ ⟨pattern⟩: ⟨type⟩," external_name_node: identifier "width" source="width" diff --git a/unified/ql/test/library-tests/controlflow/cfg.expected b/unified/ql/test/library-tests/controlflow/cfg.expected index fc1f15c91c5f..4024690a7111 100644 --- a/unified/ql/test/library-tests/controlflow/cfg.expected +++ b/unified/ql/test/library-tests/controlflow/cfg.expected @@ -153,7 +153,11 @@ noCfg | cfg.swift:358:6:358:28 | loop_with_identity_expr | | cfg.swift:371:8:371:18 | getOptional | | cfg.swift:380:45:380:47 | Int | +| cfg.swift:391:3:391:6 | init | +| cfg.swift:408:3:408:6 | init | | cfg.swift:421:6:421:22 | localDeclarations | +| cfg.swift:424:5:424:8 | init | +| cfg.swift:431:5:431:8 | init | | cfg.swift:468:6:468:17 | testIfConfig | | cfg.swift:497:6:497:18 | testAvailable | | cfg.swift:524:6:524:17 | testAsyncFor | diff --git a/unified/ql/test/library-tests/controlflow/cfg.swift b/unified/ql/test/library-tests/controlflow/cfg.swift index 2061d46cd78a..e0b598f74fe9 100644 --- a/unified/ql/test/library-tests/controlflow/cfg.swift +++ b/unified/ql/test/library-tests/controlflow/cfg.swift @@ -388,7 +388,7 @@ func testTupleElement(t : (a: Int, Int, c: Int)) -> Int { } class Derived : C { // $ nonSimple='ClassLikeDeclaration -V Derived -^ BaseType -V C' - init() { + init() { // $ noCfg super.init(n: 0) } } @@ -405,7 +405,7 @@ func doWithoutCatch(x : Int) throws -> Int { class Structors { var field: Int - init() { + init() { // $ noCfg field = 10 } @@ -421,14 +421,14 @@ func dictionaryLiteral(x: Int, y: Int) -> [String: Int] { func localDeclarations() -> Int { // $ noCfg class MyLocalClass { var x: Int - init() { + init() { // $ noCfg x = 10 } } struct MyLocalStruct { var x: Int - init() { + init() { // $ noCfg x = 10 } } From 459b9ffe049e21158dfeb022e54c56013e6033bf Mon Sep 17 00:00:00 2001 From: Chad Bentz <1760475+felickz@users.noreply.github.com> Date: Mon, 21 Sep 2026 15:59:30 -0400 Subject: [PATCH 1195/2098] Address CCR: don't claim guaranteed downstream encoding Copilot Code Review correctly pointed out that bracketing between BeginWriteTagHelperAttribute()/EndWriteTagHelperAttribute() only proves the value is captured into a buffer rather than written directly to the response; it does not, by itself, guarantee that every tag helper later HTML-attribute-encodes that buffer. Reworded the doc comments and the change note to justify the exclusion on "not a direct write to the response" rather than on assumed downstream encoding. No logic change; XSS.ql compiles and the CWE-079/XSS test still passes. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../2026-09-18-razor-tag-helper-attribute-xss-fp.md | 2 +- .../code/csharp/security/dataflow/flowsinks/Html.qll | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/csharp/ql/lib/change-notes/2026-09-18-razor-tag-helper-attribute-xss-fp.md b/csharp/ql/lib/change-notes/2026-09-18-razor-tag-helper-attribute-xss-fp.md index 266ef985cd47..4cbe16158328 100644 --- a/csharp/ql/lib/change-notes/2026-09-18-razor-tag-helper-attribute-xss-fp.md +++ b/csharp/ql/lib/change-notes/2026-09-18-razor-tag-helper-attribute-xss-fp.md @@ -1,4 +1,4 @@ --- category: majorAnalysis --- -* Fixed a false positive in `cs/web/xss` for ASP.NET Core Razor Pages/MVC views: `WriteLiteral` calls generated for tag helper attribute values (for example, `asp-for`) are HTML-attribute-encoded before being rendered, so they are no longer treated as XSS sinks. +* Fixed a false positive in `cs/web/xss` for ASP.NET Core Razor Pages/MVC views: `WriteLiteral` calls generated for tag helper attribute values (for example, `asp-for`) capture the value into an internal buffer instead of writing it directly to the response, so they are no longer treated as XSS sinks. diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsinks/Html.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsinks/Html.qll index 2934c5c123de..8434f3cd0109 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsinks/Html.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsinks/Html.qll @@ -184,10 +184,10 @@ class MicrosoftAspNetCoreMvcHtmlHelperRawSink extends AspNetCoreHtmlSink { * * The Razor source generator emits this bracketing for every literal or expression segment of an * HTML attribute value on an element that also carries a tag helper (for example `asp-for`). Such - * a `WriteLiteral` call does not write directly, unencoded, to the response: `WriteLiteral` - * appends to an internal string buffer, `EndWriteTagHelperAttribute()` returns that buffer, and - * the buffered text is subsequently stored as a tag helper attribute value and HTML-attribute- - * encoded when the tag helper's output is rendered. This is therefore not a real sink. + * a `WriteLiteral` call does not write directly to the response: `WriteLiteral` appends to an + * internal string buffer, and `EndWriteTagHelperAttribute()` returns that buffer as a tag helper + * attribute value rather than as page markup. This is therefore not a direct-write sink, unlike an + * unbracketed `WriteLiteral` call, whose argument is written straight to the response. * * Because a basic block cannot contain a branch, requiring `beginCall`, `writeLiteral`, and * `endCall` to appear (in that order) in the same basic block, with no other @@ -244,8 +244,8 @@ private predicate isBracketedForTagHelperAttribute(Call writeLiteral) { * a `.cshtml` file. * * `WriteLiteral` calls whose argument is captured for a tag helper attribute value (see - * `isBracketedForTagHelperAttribute`) are excluded, since such values are HTML-attribute-encoded - * later and are not written unencoded to the response. + * `isBracketedForTagHelperAttribute`) are excluded, since such calls buffer the value as a tag + * helper attribute rather than writing it directly to the response. */ class MicrosoftAspNetRazorPageWriteLiteralSink extends AspNetCoreHtmlSink { MicrosoftAspNetRazorPageWriteLiteralSink() { From 592903ee5806daf3826ae0343b621845cab6d047 Mon Sep 17 00:00:00 2001 From: Asger F Date: Mon, 21 Sep 2026 14:29:45 +0200 Subject: [PATCH 1196/2098] unified: Import MaD models from old swift --- .../codeql/unified/internal/mad/LegacyMaD.qll | 16 + unified/ql/lib/ext/legacy-swift.model.yml | 1185 +++++++++++++++++ unified/ql/lib/qlpack.yml | 2 + 3 files changed, 1203 insertions(+) create mode 100644 unified/ql/lib/codeql/unified/internal/mad/LegacyMaD.qll create mode 100644 unified/ql/lib/ext/legacy-swift.model.yml diff --git a/unified/ql/lib/codeql/unified/internal/mad/LegacyMaD.qll b/unified/ql/lib/codeql/unified/internal/mad/LegacyMaD.qll new file mode 100644 index 000000000000..9f65c160c06b --- /dev/null +++ b/unified/ql/lib/codeql/unified/internal/mad/LegacyMaD.qll @@ -0,0 +1,16 @@ +private import unified + +extensible predicate legacySourceModel( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string output, string kind, string provenance +); + +extensible predicate legacySinkModel( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string input, string kind, string provenance +); + +extensible predicate legacySummaryModel( + string namespace, string type, boolean subtypes, string name, string signature, string ext, + string input, string output, string kind, string provenance +); diff --git a/unified/ql/lib/ext/legacy-swift.model.yml b/unified/ql/lib/ext/legacy-swift.model.yml new file mode 100644 index 000000000000..3fadf20af765 --- /dev/null +++ b/unified/ql/lib/ext/legacy-swift.model.yml @@ -0,0 +1,1185 @@ +extensions: + - addsTo: + pack: codeql/unified-all + extensible: legacySourceModel + data: # namespace, type, subtypes, name, signature, ext, output, kind, provenance + - ["", "String", true, "count", "", "", "", "string-length", "manual"] + - ["", "String", true, "init(contentsOf:)", "(URL)", "", "ReturnValue", "remote", "manual"] + - ["", "String", true, "init(contentsOfFile:)", "(String)", "", "ReturnValue", "local", "manual"] + - ["", "String", true, "init(contentsOf:encoding:)", "(URL,String.Encoding)", "", "ReturnValue", "remote", "manual"] + - ["", "String", true, "init(contentsOfFile:encoding:)", "(String,String.Encoding)", "", "ReturnValue", "local", "manual"] + - ["", "String", true, "init(contentsOf:usedEncoding:)", "(URL,String.Encoding)", "", "ReturnValue", "remote", "manual"] + - ["", "String", true, "init(contentsOfFile:usedEncoding:)", "(String,String.Encoding)", "", "ReturnValue", "local", "manual"] + - ["", "", false, "SecKeyCopyExternalRepresentation(_:_:)", "", "", "ReturnValue", "sensitive-password", "manual"] + - ["", "URL", true, "lines", "", "", "", "remote", "manual"] + - ["", "URL", true, "resourceBytes", "", "", "", "remote", "manual"] + - ["", "UITextField", true, "text", "", "", "", "local", "manual"] + - ["", "UITextField", true, "attributedText", "", "", "", "local", "manual"] + - ["", "DataResponse", true, "value", "", "", "", "remote", "manual"] + - ["", "DataResponse", true, "result", "", "", "", "remote", "manual"] + - ["", "DataResponse", true, "data", "", "", "", "remote", "manual"] + - ["", "URL.AsyncBytes", true, "lines", "", "", "", "remote", "manual"] + - ["", "DownloadResponse", true, "value", "", "", "", "remote", "manual"] + - ["", "DownloadResponse", true, "result", "", "", "", "remote", "manual"] + - ["", "DownloadResponse", true, "data", "", "", "", "remote", "manual"] + - ["", "JSContext", true, "globalObject", "", "", "", "remote", "manual"] + - ["", "JSContext", true, "objectForKeyedSubscript(_:)", "", "", "ReturnValue", "remote", "manual"] + - ["", "JSContext", true, "objectAtIndexedSubscript(_:)", "", "", "ReturnValue", "remote", "manual"] + - ["", "UITextInput", true, "text(in:)", "", "", "ReturnValue", "local", "manual"] + - ["", "UITextInput", true, "shouldChangeText(in:replacementText:)", "", "", "Parameter[1]", "local", "manual"] + - ["", "NSData", true, "init(contentsOf:)", "", "", "ReturnValue", "remote", "manual"] + - ["", "NSData", true, "init(contentsOf:options:)", "", "", "ReturnValue", "remote", "manual"] + - ["", "NSString", true, "length", "", "", "", "nsstring-length", "manual"] + - ["", "NSString", true, "init(contentsOf:)", "", "", "ReturnValue", "remote", "manual"] + - ["", "NSString", true, "init(contentsOfFile:)", "", "", "ReturnValue", "local", "manual"] + - ["", "NSString", true, "string(withContentsOf:)", "", "", "ReturnValue", "remote", "manual"] + - ["", "NSString", true, "init(contentsOf:encoding:)", "", "", "ReturnValue", "remote", "manual"] + - ["", "NSString", true, "string(withContentsOfFile:)", "", "", "ReturnValue", "local", "manual"] + - ["", "NSString", true, "init(contentsOfFile:encoding:)", "", "", "ReturnValue", "local", "manual"] + - ["", "NSString", true, "init(contentsOf:usedEncoding:)", "", "", "ReturnValue", "remote", "manual"] + - ["", "NSString", true, "init(contentsOfFile:usedEncoding:)", "", "", "ReturnValue", "local", "manual"] + - ["", "FileManager", true, "contents(atPath:)", "", "", "ReturnValue", "local", "manual"] + - ["", "Data", true, "init(contentsOf:options:)", "", "", "ReturnValue", "remote", "manual"] + - ["", "UISceneDelegate", true, "scene(_:continue:)", "", "", "Parameter[1]", "remote", "manual"] + - ["", "UISceneDelegate", true, "scene(_:didUpdate:)", "", "", "Parameter[1]", "remote", "manual"] + - ["", "UISceneDelegate", true, "scene(_:openURLContexts:)", "", "", "Parameter[1]", "remote", "manual"] + - ["", "UISceneDelegate", true, "scene(_:willConnectTo:options:)", "", "", "Parameter[2]", "remote", "manual"] + - ["", "UIApplicationDelegate", true, "application(_:handleOpen:)", "", "", "Parameter[1]", "remote", "manual"] + - ["", "UIApplicationDelegate", true, "application(_:open:options:)", "", "", "Parameter[1]", "remote", "manual"] + - ["", "UIApplicationDelegate", true, "application(_:open:sourceApplication:annotation:)", "", "", "Parameter[1]", "remote", "manual"] + - ["", "WKScriptMessageHandler", true, "userContentController(_:didReceive:)", "", "", "Parameter[1]", "remote", "manual"] + - ["", "UITextViewDelegate", true, "textView(_:shouldChangeTextIn:replacementText:)", "", "", "Parameter[2]", "local", "manual"] + - ["", "UITextFieldDelegate", true, "textField(_:shouldChangeCharactersIn:replacementString:)", "", "", "Parameter[2]", "local", "manual"] + - ["", "NSMutableString", true, "length", "", "", "", "nsstring-length", "manual"] + - addsTo: + pack: codeql/unified-all + extensible: legacySinkModel + data: # namespace, type, subtypes, name, signature, ext, input, kind, provenance + - ["", "String", true, "index(_:offsetBy:)", "", "", "Argument[0..1]", "string-length", "manual"] + - ["", "String", true, "init(contentsOfFile:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "String", true, "init(contentsOfFile:encoding:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "String", true, "init(contentsOfFile:usedEncoding:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "String", true, "index(_:offsetBy:limitBy:)", "", "", "Argument[0..1]", "string-length", "manual"] + - ["", "String", true, "md5()", "", "", "Argument[-1]", "weak-hash-input-MD5", "manual"] + - ["", "String", true, "sha1()", "", "", "Argument[-1]", "weak-hash-input-SHA1", "manual"] + - ["", "String", true, "sha2(_:)", "", "", "Argument[-1]", "weak-password-hash-input-SHA2", "manual"] + - ["", "String", true, "sha224()", "", "", "Argument[-1]", "weak-password-hash-input-SHA224", "manual"] + - ["", "String", true, "sha256()", "", "", "Argument[-1]", "weak-password-hash-input-SHA256", "manual"] + - ["", "String", true, "sha3(_:)", "", "", "Argument[-1]", "weak-password-hash-input-SHA3", "manual"] + - ["", "String", true, "sha384()", "", "", "Argument[-1]", "weak-password-hash-input-SHA384", "manual"] + - ["", "String", true, "sha512()", "", "", "Argument[-1]", "weak-password-hash-input-SHA512", "manual"] + - ["", "Array", true, "md5()", "", "", "Argument[-1]", "weak-hash-input-MD5", "manual"] + - ["", "Array", true, "sha1()", "", "", "Argument[-1]", "weak-hash-input-SHA1", "manual"] + - ["", "Array", true, "sha2(_:)", "", "", "Argument[-1]", "weak-password-hash-input-SHA2", "manual"] + - ["", "Array", true, "sha224()", "", "", "Argument[-1]", "weak-password-hash-input-SHA224", "manual"] + - ["", "Array", true, "sha256()", "", "", "Argument[-1]", "weak-password-hash-input-SHA256", "manual"] + - ["", "Array", true, "sha3(_:)", "", "", "Argument[-1]", "weak-password-hash-input-SHA3", "manual"] + - ["", "Array", true, "sha384()", "", "", "Argument[-1]", "weak-password-hash-input-SHA384", "manual"] + - ["", "Array", true, "sha512()", "", "", "Argument[-1]", "weak-password-hash-input-SHA512", "manual"] + - ["", "String.Index", true, "init(encodedOffset:)", "", "", "Argument[0]", "string-length", "manual"] + - ["", "Regex", true, "init(_:)", "", "", "Argument[0]", "regex-use", "manual"] + - ["", "Regex", true, "init(_:as:)", "", "", "Argument[0]", "regex-use", "manual"] + - ["", "", false, "assert(_:_:file:line:)", "", "", "Argument[1]", "log-injection", "manual"] + - ["", "", false, "precondition(_:_:file:line:)", "", "", "Argument[1]", "log-injection", "manual"] + - ["", "", false, "assertionFailure(_:file:line:)", "", "", "Argument[0]", "log-injection", "manual"] + - ["", "", false, "preconditionFailure(_:file:line:)", "", "", "Argument[0]", "log-injection", "manual"] + - ["", "", false, "fatalError(_:file:line:)", "", "", "Argument[0]", "log-injection", "manual"] + - ["", "", false, "dump(_:name:indent:maxDepth:maxItems:)", "", "", "Argument[0..1]", "log-injection", "manual"] + - ["", "", false, "print(_:separator:terminator:)", "", "", "Argument[0..2]", "log-injection", "manual"] + - ["", "", false, "debugPrint(_:separator:terminator:)", "", "", "Argument[0..2]", "log-injection", "manual"] + - ["", "", false, "NSMakeRange(_:_:)", "", "", "Argument[0..1]", "nsstring-length", "manual"] + - ["", "", false, "sqlite3_key(_:_:_:)", "", "", "Argument[1]", "encryption-key", "manual"] + - ["", "", false, "sqlite3_key_v2(_:_:_:_:)", "", "", "Argument[2]", "encryption-key", "manual"] + - ["", "", false, "sqlite3_rekey(_:_:_:)", "", "", "Argument[1]", "encryption-key", "manual"] + - ["", "", false, "sqlite3_rekey_v2(_:_:_:_:)", "", "", "Argument[2]", "encryption-key", "manual"] + - ["", "", false, "NSLog(_:_:)", "", "", "Argument[0..1]", "log-injection", "manual"] + - ["", "", false, "NSLogv(_:_:)", "", "", "Argument[0..1]", "log-injection", "manual"] + - ["", "", false, "os_log(_:)", "", "", "Argument[0]", "log-injection", "manual"] + - ["", "", false, "os_log(_:dso:log:_:_:)", "", "", "Argument[0,4]", "log-injection", "manual"] + - ["", "", false, "os_log(_:dso:log:type:_:)", "", "", "Argument[0,4]", "log-injection", "manual"] + - ["", "", false, "os_log(_:log:_:)", "", "", "Argument[2]", "log-injection", "manual"] + - ["", "", false, "print(_:separator:terminator:toStream:)", "", "", "Argument[0..2]", "log-injection", "manual"] + - ["", "", false, "vfprintf(_:_:_:)", "", "", "Argument[1..2]", "log-injection", "manual"] + - ["", "", false, "sqlite3_bind_blob(_:_:_:_:_:)", "", "", "Argument[2]", "database-store", "manual"] + - ["", "", false, "sqlite3_bind_blob64(_:_:_:_:_:)", "", "", "Argument[2]", "database-store", "manual"] + - ["", "", false, "sqlite3_bind_double(_:_:_:)", "", "", "Argument[2]", "database-store", "manual"] + - ["", "", false, "sqlite3_bind_int(_:_:_:)", "", "", "Argument[2]", "database-store", "manual"] + - ["", "", false, "sqlite3_bind_int64(_:_:_:)", "", "", "Argument[2]", "database-store", "manual"] + - ["", "", false, "sqlite3_bind_pointer(_:_:_:_:)", "", "", "Argument[2]", "database-store", "manual"] + - ["", "", false, "sqlite3_bind_text(_:_:_:_:_:)", "", "", "Argument[2]", "database-store", "manual"] + - ["", "", false, "sqlite3_bind_text16(_:_:_:_:_:)", "", "", "Argument[2]", "database-store", "manual"] + - ["", "", false, "sqlite3_bind_text64(_:_:_:_:_:_:)", "", "", "Argument[2]", "database-store", "manual"] + - ["", "", false, "sqlite3_bind_value(_:_:_:)", "", "", "Argument[2]", "database-store", "manual"] + - ["", "", false, "sqlite3_exec(_:_:_:_:_:)", "", "", "Argument[1]", "database-store", "manual"] + - ["", "", false, "sqlite3_prepare(_:_:_:_:_:)", "", "", "Argument[1]", "database-store", "manual"] + - ["", "", false, "sqlite3_prepare16(_:_:_:_:_:)", "", "", "Argument[1]", "database-store", "manual"] + - ["", "", false, "sqlite3_prepare16_v2(_:_:_:_:_:)", "", "", "Argument[1]", "database-store", "manual"] + - ["", "", false, "sqlite3_prepare16_v3(_:_:_:_:_:)", "", "", "Argument[1]", "database-store", "manual"] + - ["", "", false, "sqlite3_prepare_v2(_:_:_:_:_:)", "", "", "Argument[1]", "database-store", "manual"] + - ["", "", false, "sqlite3_prepare_v3(_:_:_:_:_:_:)", "", "", "Argument[1]", "database-store", "manual"] + - ["", "", false, "sqlite3_database_file_object(_:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "", false, "sqlite3_filename_database(_:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "", false, "sqlite3_filename_journal(_:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "", false, "sqlite3_filename_wal(_:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "", false, "sqlite3_free_filename(_:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "", false, "sqlite3_open(_:_:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "", false, "sqlite3_open16(_:_:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "", false, "sqlite3_open_v2(_:_:_:_:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "NSData", true, "init(contentsOf:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "NSData", true, "init(contentsOfFile:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "NSData", true, "init(contentsOf:options:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "NSData", true, "dataWithContentsOfMappedFile(_:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "NSData", true, "init(contentsOfFile:options:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "NSData", true, "init(contentsOfMappedFile:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "NSData", true, "write(to:options:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "NSData", true, "write(to:atomically:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "NSData", true, "write(toFile:atomically:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "NSData", true, "write(toFile:options:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "NSString", true, "character(at:)", "", "", "Argument[0]", "nsstring-length", "manual"] + - ["", "NSString", true, "init(contentsOfFile:encoding:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "NSString", true, "init(contentsOfFile:usedEncoding:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "NSString", true, "substring(from:)", "", "", "Argument[0]", "nsstring-length", "manual"] + - ["", "NSString", true, "substring(to:)", "", "", "Argument[0]", "nsstring-length", "manual"] + - ["", "NSString", true, "write(to:atomically:encoding:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "NSString", true, "write(toFile:atomically:encoding:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "FileManager", true, "contents(atPath:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "FileManager", true, "unzipItem(at:to:skipCRC32:progress:pathEncoding:)", "", "", "Argument[0]", "unsafe-unpack", "manual"] + - ["", "FileManager", true, "attributesOfItem(atPath:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "FileManager", true, "changeCurrentDirectoryPath(_:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "FileManager", true, "changeFileAttributes(_:atPath:)", "", "", "Argument[1]", "path-injection", "manual"] + - ["", "FileManager", true, "contentsEqual(atPath:andPath:)", "", "", "Argument[0..1]", "path-injection", "manual"] + - ["", "FileManager", true, "contentsOfDirectory(at:includingPropertiesForKeys:options:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "FileManager", true, "contentsOfDirectory(atPath:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "FileManager", true, "copyItem(at:to:)", "", "", "Argument[0..1]", "path-injection", "manual"] + - ["", "FileManager", true, "copyItem(atPath:toPath:)", "", "", "Argument[0..1]", "path-injection", "manual"] + - ["", "FileManager", true, "createDirectory(at:withIntermediateDirectories:attributes:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "FileManager", true, "createDirectory(atPath:attributes:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "FileManager", true, "createDirectory(atPath:withIntermediateDirectories:attributes:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "FileManager", true, "createFile(atPath:contents:attributes:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "FileManager", true, "createSymbolicLink(at:withDestinationURL:)", "", "", "Argument[0..1]", "path-injection", "manual"] + - ["", "FileManager", true, "createSymbolicLink(atPath:pathContent:)", "", "", "Argument[0..1]", "path-injection", "manual"] + - ["", "FileManager", true, "createSymbolicLink(atPath:withDestinationPath:)", "", "", "Argument[0..1]", "path-injection", "manual"] + - ["", "FileManager", true, "destinationOfSymbolicLink(atPath:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "FileManager", true, "directoryContents(atPath:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "FileManager", true, "enumerator(at:includingPropertiesForKeys:options:errorHandler:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "FileManager", true, "enumerator(atPath:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "FileManager", true, "fileAttributes(atPath:traverseLink:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "FileManager", true, "fileExists(atPath:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "FileManager", true, "fileExists(atPath:isDirectory:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "FileManager", true, "linkItem(at:to:)", "", "", "Argument[0..1]", "path-injection", "manual"] + - ["", "FileManager", true, "linkItem(atPath:toPath:)", "", "", "Argument[0..1]", "path-injection", "manual"] + - ["", "FileManager", true, "moveItem(at:to:)", "", "", "Argument[0..1]", "path-injection", "manual"] + - ["", "FileManager", true, "moveItem(atPath:toPath:)", "", "", "Argument[0..1]", "path-injection", "manual"] + - ["", "FileManager", true, "pathContentOfSymbolicLink(atPath:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "FileManager", true, "removeItem(at:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "FileManager", true, "removeItem(atPath:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "FileManager", true, "replaceItem(at:withItemAt:backupItemName:options:resultingItemURL:)", "", "", "Argument[0..1]", "path-injection", "manual"] + - ["", "FileManager", true, "replaceItemAt(_:withItemAt:backupItemName:options:)", "", "", "Argument[0..1]", "path-injection", "manual"] + - ["", "FileManager", true, "replaceItemAtURL(originalItemURL:withItemAtURL:backupItemName:options:)", "", "", "Argument[0..1]", "path-injection", "manual"] + - ["", "FileManager", true, "setAttributes(_:ofItemAtPath:)", "", "", "Argument[1]", "path-injection", "manual"] + - ["", "FileManager", true, "subpaths(atPath:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "FileManager", true, "subpathsOfDirectory(atPath:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "FileManager", true, "trashItem(at:resultingItemURL:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "FileManager", true, "unmountVolume(at:options:completionHandler:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "Data", true, "init(contentsOf:options:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "Data", true, "md5()", "", "", "Argument[-1]", "weak-hash-input-MD5", "manual"] + - ["", "Data", true, "sha1()", "", "", "Argument[-1]", "weak-hash-input-SHA1", "manual"] + - ["", "Data", true, "sha2(_:)", "", "", "Argument[-1]", "weak-password-hash-input-SHA2", "manual"] + - ["", "Data", true, "sha224()", "", "", "Argument[-1]", "weak-password-hash-input-SHA224", "manual"] + - ["", "Data", true, "sha256()", "", "", "Argument[-1]", "weak-password-hash-input-SHA256", "manual"] + - ["", "Data", true, "sha3(_:)", "", "", "Argument[-1]", "weak-password-hash-input-SHA3", "manual"] + - ["", "Data", true, "sha384()", "", "", "Argument[-1]", "weak-password-hash-input-SHA384", "manual"] + - ["", "Data", true, "sha512()", "", "", "Argument[-1]", "weak-password-hash-input-SHA512", "manual"] + - ["", "Data", true, "write(to:options:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "NSMutableString", true, "insert(_:at:)", "", "", "Argument[1]", "nsstring-length", "manual"] + - ["", "NSMutableString", true, "character(at:)", "", "", "Argument[0]", "nsstring-length", "manual"] + - ["", "NSMutableString", true, "substring(from:)", "", "", "Argument[0]", "nsstring-length", "manual"] + - ["", "NSMutableString", true, "substring(to:)", "", "", "Argument[0]", "nsstring-length", "manual"] + - ["", "AES", true, "init(key:blockMode:)", "", "", "Argument[1]", "encryption-block-mode", "manual"] + - ["", "AES", true, "init(key:blockMode:padding:)", "", "", "Argument[1]", "encryption-block-mode", "manual"] + - ["", "NSPredicate", true, "init(format:_:)", "", "", "Argument[0]", "predicate-injection", "manual"] + - ["", "NSPredicate", true, "init(format:arguments:)", "", "", "Argument[0]", "predicate-injection", "manual"] + - ["", "NSPredicate", true, "init(format:argumentArray:)", "", "", "Argument[0]", "predicate-injection", "manual"] + - ["", "NSPredicate", true, "init(fromMetadataQueryString:)", "", "", "Argument[0]", "predicate-injection", "manual"] + - ["", "NSRegularExpression", true, "init(pattern:options:)", "", "", "Argument[0]", "regex-use", "manual"] + - ["", "Blowfish", true, "init(key:blockMode:padding:)", "", "", "Argument[1]", "encryption-block-mode", "manual"] + - ["", "URLSessionConfiguration", false, "tlsMaximumSupportedProtocol", "", "", "PostUpdate", "tls-protocol-version", "manual"] + - ["", "URLSessionConfiguration", false, "tlsMinimumSupportedProtocol", "", "", "PostUpdate", "tls-protocol-version", "manual"] + - ["", "URLSessionConfiguration", false, "tlsMaximumSupportedProtocolVersion", "", "", "PostUpdate", "tls-protocol-version", "manual"] + - ["", "URLSessionConfiguration", false, "tlsMinimumSupportedProtocolVersion", "", "", "PostUpdate", "tls-protocol-version", "manual"] + - ["", "NWConnection", true, "send(content:contentContext:isComplete:completion:)", "", "", "Argument[0]", "transmission", "manual"] + - ["", "Zip", true, "unzipFile(_:destination:overwrite:password:progress:fileOutputHandler:)", "", "", "Argument[0]", "unsafe-unpack", "manual"] + - ["", "NSRange", true, "init(location:length:)", "", "", "Argument[0..1]", "nsstring-length", "manual"] + - ["", "NSUserScriptTask", true, "init(url:)", "", "", "Argument[0]", "command-injection", "manual"] + - ["", "NSUserUnixTask", true, "execute(withArguments:completionHandler:)", "", "", "Argument[0]", "command-injection", "manual"] + - ["", "Process", true, "arguments", "", "", "PostUpdate", "command-injection", "manual"] + - ["", "Process", true, "currentDirectory", "", "", "PostUpdate", "command-injection", "manual"] + - ["", "Process", true, "currentDirectoryPath", "", "", "PostUpdate", "command-injection", "manual"] + - ["", "Process", true, "environment", "", "", "PostUpdate", "command-injection", "manual"] + - ["", "Process", true, "executableURL", "", "", "PostUpdate", "command-injection", "manual"] + - ["", "Process", true, "launchPath", "", "", "PostUpdate", "command-injection", "manual"] + - ["", "Process", true, "launchedProcess(launchPath:arguments:)", "", "", "Argument[0..1]", "command-injection", "manual"] + - ["", "Process", true, "run(_:arguments:terminationHandler:)", "", "", "Argument[0..1]", "command-injection", "manual"] + - ["", "Process", true, "standardError", "", "", "PostUpdate", "command-injection", "manual"] + - ["", "Process", true, "standardInput", "", "", "PostUpdate", "command-injection", "manual"] + - ["", "Process", true, "standardOutput", "", "", "PostUpdate", "command-injection", "manual"] + - ["", "Connection", true, "key(_:db:)", "", "", "Argument[0]", "encryption-key", "manual"] + - ["", "Connection", true, "keyAndMigrate(_:db:)", "", "", "Argument[0]", "encryption-key", "manual"] + - ["", "Connection", true, "rekey(_:db:)", "", "", "Argument[0]", "encryption-key", "manual"] + - ["", "Connection", true, "sqlcipher_export(_:key:)", "", "", "Argument[1]", "encryption-key", "manual"] + - ["", "Connection", true, "execute(_:)", "", "", "Argument[0]", "database-store", "manual"] + - ["", "Connection", true, "prepare(_:_:)", "", "", "Argument[0]", "database-store", "manual"] + - ["", "Connection", true, "prepare(_:_:)", "", "", "Argument[1]", "database-store", "manual"] + - ["", "Connection", true, "run(_:_:)", "", "", "Argument[0]", "database-store", "manual"] + - ["", "Connection", true, "run(_:_:)", "", "", "Argument[1]", "database-store", "manual"] + - ["", "Connection", true, "scalar(_:_:)", "", "", "Argument[0]", "database-store", "manual"] + - ["", "Connection", true, "scalar(_:_:)", "", "", "Argument[1]", "database-store", "manual"] + - ["", "Connection", true, "init(_:readonly:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "Database", true, "changePassphrase(_:)", "", "", "Argument[0]", "encryption-key", "manual"] + - ["", "Database", true, "usePassphrase(_:)", "", "", "Argument[0]", "encryption-key", "manual"] + - ["", "Database", true, "allStatements(sql:arguments:)", "", "", "Argument[1]", "database-store", "manual"] + - ["", "Database", true, "execute(sql:arguments:)", "", "", "Argument[1]", "database-store", "manual"] + - ["", "Database", true, "init(path:description:configuration:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "Realm.Configuration", true, "encryptionKey", "", "", "PostUpdate", "encryption-key", "manual"] + - ["", "Realm.Configuration", true, "init(fileURL:inMemoryIdentifier:syncConfiguration:encryptionKey:readOnly:schemaVersion:migrationBlock:deleteRealmIfMigrationNeeded:shouldCompactOnLaunch:objectTypes:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "Realm.Configuration", true, "init(fileURL:inMemoryIdentifier:syncConfiguration:encryptionKey:readOnly:schemaVersion:migrationBlock:deleteRealmIfMigrationNeeded:shouldCompactOnLaunch:objectTypes:)", "", "", "Argument[3]", "encryption-key", "manual"] + - ["", "Realm.Configuration", true, "init(fileURL:inMemoryIdentifier:syncConfiguration:encryptionKey:readOnly:schemaVersion:migrationBlock:deleteRealmIfMigrationNeeded:shouldCompactOnLaunch:objectTypes:seedFilePath:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "Realm.Configuration", true, "init(fileURL:inMemoryIdentifier:syncConfiguration:encryptionKey:readOnly:schemaVersion:migrationBlock:deleteRealmIfMigrationNeeded:shouldCompactOnLaunch:objectTypes:seedFilePath:)", "", "", "Argument[3]", "encryption-key", "manual"] + - ["", "Realm.Configuration", true, "init(fileURL:inMemoryIdentifier:syncConfiguration:encryptionKey:readOnly:schemaVersion:migrationBlock:deleteRealmIfMigrationNeeded:shouldCompactOnLaunch:objectTypes:seedFilePath:)", "", "", "Argument[10]", "path-injection", "manual"] + - ["", "Realm.Configuration", true, "fileURL", "", "", "PostUpdate", "path-injection", "manual"] + - ["", "Realm.Configuration", true, "seedFilePath", "", "", "PostUpdate", "path-injection", "manual"] + - ["", "Digest", true, "md5(_:)", "", "", "Argument[0]", "weak-hash-input-MD5", "manual"] + - ["", "Digest", true, "sha1(_:)", "", "", "Argument[0]", "weak-hash-input-SHA1", "manual"] + - ["", "Digest", true, "sha2(_:variant:)", "", "", "Argument[0]", "weak-password-hash-input-SHA2", "manual"] + - ["", "Digest", true, "sha224(_:)", "", "", "Argument[0]", "weak-password-hash-input-SHA224", "manual"] + - ["", "Digest", true, "sha256(_:)", "", "", "Argument[0]", "weak-password-hash-input-SHA256", "manual"] + - ["", "Digest", true, "sha3(_:variant:)", "", "", "Argument[0]", "weak-password-hash-input-SHA3", "manual"] + - ["", "Digest", true, "sha384(_:)", "", "", "Argument[0]", "weak-password-hash-input-SHA384", "manual"] + - ["", "Digest", true, "sha512(_:)", "", "", "Argument[0]", "weak-password-hash-input-SHA512", "manual"] + - ["", "Insecure.MD5", true, "hash(bufferPointer:)", "", "", "Argument[0]", "weak-hash-input-MD5", "manual"] + - ["", "Insecure.MD5", true, "hash(data:)", "", "", "Argument[0]", "weak-hash-input-MD5", "manual"] + - ["", "Insecure.MD5", true, "update(bufferPointer:)", "", "", "Argument[0]", "weak-hash-input-MD5", "manual"] + - ["", "Insecure.MD5", true, "update(data:)", "", "", "Argument[0]", "weak-hash-input-MD5", "manual"] + - ["", "Insecure.SHA1", true, "hash(bufferPointer:)", "", "", "Argument[0]", "weak-hash-input-SHA1", "manual"] + - ["", "Insecure.SHA1", true, "hash(data:)", "", "", "Argument[0]", "weak-hash-input-SHA1", "manual"] + - ["", "Insecure.SHA1", true, "update(bufferPointer:)", "", "", "Argument[0]", "weak-hash-input-SHA1", "manual"] + - ["", "Insecure.SHA1", true, "update(data:)", "", "", "Argument[0]", "weak-hash-input-SHA1", "manual"] + - ["", "MD5", true, "callAsFunction(_:)", "", "", "Argument[0]", "weak-hash-input-MD5", "manual"] + - ["", "MD5", true, "calculate(for:)", "", "", "Argument[0]", "weak-hash-input-MD5", "manual"] + - ["", "MD5", true, "process(block:currentHash:)", "", "", "Argument[0]", "weak-hash-input-MD5", "manual"] + - ["", "MD5", true, "update(withBytes:isLast:)", "", "", "Argument[0]", "weak-hash-input-MD5", "manual"] + - ["", "SHA1", true, "callAsFunction(_:)", "", "", "Argument[0]", "weak-hash-input-SHA1", "manual"] + - ["", "SHA1", true, "calculate(for:)", "", "", "Argument[0]", "weak-hash-input-SHA1", "manual"] + - ["", "SHA1", true, "process(block:currentHash:)", "", "", "Argument[0]", "weak-hash-input-SHA1", "manual"] + - ["", "SHA1", true, "update(withBytes:isLast:)", "", "", "Argument[0]", "weak-hash-input-SHA1", "manual"] + - ["", "Logger", true, "warning(_:)", "", "", "Argument[1]", "log-injection", "manual"] + - ["", "Logger", true, "error(_:)", "", "", "Argument[1]", "log-injection", "manual"] + - ["", "Logger", true, "critical(_:)", "", "", "Argument[1]", "log-injection", "manual"] + - ["", "Logger", true, "debug(_:)", "", "", "Argument[1]", "log-injection", "manual"] + - ["", "Logger", true, "fault(_:)", "", "", "Argument[1]", "log-injection", "manual"] + - ["", "Logger", true, "info(_:)", "", "", "Argument[1]", "log-injection", "manual"] + - ["", "Logger", true, "log(_:)", "", "", "Argument[0]", "log-injection", "manual"] + - ["", "Logger", true, "log(level:_:)", "", "", "Argument[1]", "log-injection", "manual"] + - ["", "Logger", true, "notice(_:)", "", "", "Argument[1]", "log-injection", "manual"] + - ["", "Logger", true, "trace(_:)", "", "", "Argument[1]", "log-injection", "manual"] + - ["", "NSException", true, "init(name:reason:userInfo:)", "", "", "Argument[1]", "log-injection", "manual"] + - ["", "NSException", true, "raise(_:format:arguments:)", "", "", "Argument[1..2]", "log-injection", "manual"] + - ["", "SHA256", true, "hash(bufferPointer:)", "", "", "Argument[0]", "weak-password-hash-input-SHA256", "manual"] + - ["", "SHA256", true, "hash(data:)", "", "", "Argument[0]", "weak-password-hash-input-SHA256", "manual"] + - ["", "SHA256", true, "update(bufferPointer:)", "", "", "Argument[0]", "weak-password-hash-input-SHA256", "manual"] + - ["", "SHA256", true, "update(data:)", "", "", "Argument[0]", "weak-password-hash-input-SHA256", "manual"] + - ["", "SHA2", true, "callAsFunction(_:)", "", "", "Argument[0]", "weak-password-hash-input-SHA2", "manual"] + - ["", "SHA2", true, "calculate(for:)", "", "", "Argument[0]", "weak-password-hash-input-SHA2", "manual"] + - ["", "SHA2", true, "update(withBytes:isLast:)", "", "", "Argument[0]", "weak-password-hash-input-SHA2", "manual"] + - ["", "SHA2", true, "process32(block:currentHash:)", "", "", "Argument[0]", "weak-password-hash-input-SHA2", "manual"] + - ["", "SHA2", true, "process64(block:currentHash:)", "", "", "Argument[0]", "weak-password-hash-input-SHA2", "manual"] + - ["", "SHA384", true, "hash(bufferPointer:)", "", "", "Argument[0]", "weak-password-hash-input-SHA384", "manual"] + - ["", "SHA384", true, "hash(data:)", "", "", "Argument[0]", "weak-password-hash-input-SHA384", "manual"] + - ["", "SHA384", true, "update(bufferPointer:)", "", "", "Argument[0]", "weak-password-hash-input-SHA384", "manual"] + - ["", "SHA384", true, "update(data:)", "", "", "Argument[0]", "weak-password-hash-input-SHA384", "manual"] + - ["", "SHA3", true, "callAsFunction(_:)", "", "", "Argument[0]", "weak-password-hash-input-SHA2", "manual"] + - ["", "SHA3", true, "calculate(for:)", "", "", "Argument[0]", "weak-password-hash-input-SHA2", "manual"] + - ["", "SHA3", true, "process(block:currentHash:)", "", "", "Argument[0]", "weak-password-hash-input-SHA2", "manual"] + - ["", "SHA3", true, "update(withBytes:isLast:)", "", "", "Argument[0]", "weak-password-hash-input-SHA2", "manual"] + - ["", "SHA512", true, "hash(bufferPointer:)", "", "", "Argument[0]", "weak-password-hash-input-SHA512", "manual"] + - ["", "SHA512", true, "hash(data:)", "", "", "Argument[0]", "weak-password-hash-input-SHA512", "manual"] + - ["", "SHA512", true, "update(bufferPointer:)", "", "", "Argument[0]", "weak-password-hash-input-SHA512", "manual"] + - ["", "SHA512", true, "update(data:)", "", "", "Argument[0]", "weak-password-hash-input-SHA512", "manual"] + - ["", "CommonTableExpression", true, "init(recursive:named:columns:sql:arguments:)", "", "", "Argument[4]", "database-store", "manual"] + - ["", "DatabaseValueConvertible", true, "fetchAll(_:sql:arguments:adapter:)", "", "", "Argument[2]", "database-store", "manual"] + - ["", "DatabaseValueConvertible", true, "fetchCursor(_:sql:arguments:adapter:)", "", "", "Argument[2]", "database-store", "manual"] + - ["", "DatabaseValueConvertible", true, "fetchOne(_:sql:arguments:adapter:)", "", "", "Argument[2]", "database-store", "manual"] + - ["", "DatabaseValueConvertible", true, "fetchSet(_:sql:arguments:adapter:)", "", "", "Argument[2]", "database-store", "manual"] + - ["", "FetchableRecord", true, "fetchAll(_:sql:arguments:adapter:)", "", "", "Argument[2]", "database-store", "manual"] + - ["", "FetchableRecord", true, "fetchCursor(_:sql:arguments:adapter:)", "", "", "Argument[2]", "database-store", "manual"] + - ["", "FetchableRecord", true, "fetchOne(_:sql:arguments:adapter:)", "", "", "Argument[2]", "database-store", "manual"] + - ["", "FetchableRecord", true, "fetchSet(_:sql:arguments:adapter:)", "", "", "Argument[2]", "database-store", "manual"] + - ["", "FetchableRecord", true, "fetchAll(_:arguments:adapter:)", "", "", "Argument[1]", "database-store", "manual"] + - ["", "FetchableRecord", true, "fetchCursor(_:arguments:adapter:)", "", "", "Argument[1]", "database-store", "manual"] + - ["", "FetchableRecord", true, "fetchOne(_:arguments:adapter:)", "", "", "Argument[1]", "database-store", "manual"] + - ["", "FetchableRecord", true, "fetchSet(_:arguments:adapter:)", "", "", "Argument[1]", "database-store", "manual"] + - ["", "QueryType", true, "insert(_:)", "", "", "Argument[0]", "database-store", "manual"] + - ["", "QueryType", true, "update(_:)", "", "", "Argument[0]", "database-store", "manual"] + - ["", "QueryType", true, "insert(_:_:)", "", "", "Argument[0..1]", "database-store", "manual"] + - ["", "QueryType", true, "insert(or:_:)", "", "", "Argument[1]", "database-store", "manual"] + - ["", "QueryType", true, "insertMany(_:)", "", "", "Argument[0]", "database-store", "manual"] + - ["", "QueryType", true, "insertMany(or:_:)", "", "", "Argument[1]", "database-store", "manual"] + - ["", "QueryType", true, "update(_:_:)", "", "", "Argument[0..1]", "database-store", "manual"] + - ["", "QueryType", true, "update(or:_:)", "", "", "Argument[1]", "database-store", "manual"] + - ["", "QueryType", true, "upsert(_:onConflictOf:)", "", "", "Argument[0]", "database-store", "manual"] + - ["", "QueryType", true, "upsert(_:onConflictOf:setValues:)", "", "", "Argument[0]", "database-store", "manual"] + - ["", "QueryType", true, "upsert(_:onConflictOf:setValues:)", "", "", "Argument[2]", "database-store", "manual"] + - ["", "Row", true, "fetchAll(_:sql:arguments:adapter:)", "", "", "Argument[2]", "database-store", "manual"] + - ["", "Row", true, "fetchCursor(_:sql:arguments:adapter:)", "", "", "Argument[2]", "database-store", "manual"] + - ["", "Row", true, "fetchOne(_:sql:arguments:adapter:)", "", "", "Argument[2]", "database-store", "manual"] + - ["", "Row", true, "fetchSet(_:sql:arguments:adapter:)", "", "", "Argument[2]", "database-store", "manual"] + - ["", "SQL", true, "append(sql:arguments:)", "", "", "Argument[1]", "database-store", "manual"] + - ["", "SQL", true, "init(sql:arguments:)", "", "", "Argument[1]", "database-store", "manual"] + - ["", "SQLRequest", true, "init(sql:arguments:adapter:cached:)", "", "", "Argument[1]", "database-store", "manual"] + - ["", "SQLStatementCursor", true, "init(database:sql:arguments:prepFlags:)", "", "", "Argument[2]", "database-store", "manual"] + - ["", "Statement", true, "init(_:_:)", "", "", "Argument[1]", "database-store", "manual"] + - ["", "Statement", true, "scalar(_:)", "", "", "Argument[0]", "database-store", "manual"] + - ["", "Statement", true, "bind(_:)", "", "", "Argument[0]", "database-store", "manual"] + - ["", "Statement", true, "execute(arguments:)", "", "", "Argument[0]", "database-store", "manual"] + - ["", "Statement", true, "run(_:)", "", "", "Argument[0]", "database-store", "manual"] + - ["", "Statement", true, "setArguments(_:)", "", "", "Argument[0]", "database-store", "manual"] + - ["", "TableRecord", true, "filter(sql:arguments:)", "", "", "Argument[1]", "database-store", "manual"] + - ["", "TableRecord", true, "order(sql:arguments:)", "", "", "Argument[1]", "database-store", "manual"] + - ["", "TableRecord", true, "select(sql:arguments:)", "", "", "Argument[1]", "database-store", "manual"] + - ["", "TableRecord", true, "select(sql:arguments:as:)", "", "", "Argument[1]", "database-store", "manual"] + - ["", "ArchiveByteStream", true, "fileStream(fd:automaticClose:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "ArchiveByteStream", true, "fileStream(path:mode:options:permissions:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "ArchiveByteStream", true, "withFileStream(fd:automaticClose:_:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "ArchiveByteStream", true, "withFileStream(path:mode:options:permissions:_:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "Bundle", true, "init(url:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "Bundle", true, "init(path:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "DatabasePool", true, "init(path:configuration:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "DatabaseQueue", true, "init(path:configuration:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "DatabaseSnapshotPool", true, "init(path:configuration:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "NIOFileHandle", true, "init(path:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "NIOFileHandle", true, "init(descriptor:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "NIOFileHandle", true, "init(path:mode:flags:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "NSKeyedUnarchiver", true, "unarchiveObject(withFile:)", "", "", "Argument[0]", "path-injection", "manual"] + - ["", "SerializedDatabase", true, "init(path:configuration:defaultLabel:purpose:)", "", "", "Argument[0]", "path-injection", "manual"] + - addsTo: + pack: codeql/unified-all + extensible: legacySummaryModel + data: # namespace, type, subtypes, name, signature, ext, input, output, kind, provenance + - ["", "UnsafeMutableRawPointer", true, "init(_:)", "", "", "Argument[0].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "UnsafeMutableRawPointer", true, "init(_:)", "", "", "Argument[0].OptionalSome.CollectionElement", "ReturnValue.OptionalSome.CollectionElement", "value", "manual"] + - ["", "UnsafeMutableRawPointer", true, "init(mutating:)", "", "", "Argument[0].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "UnsafeMutableRawPointer", true, "init(mutating:)", "", "", "Argument[0].OptionalSome.CollectionElement", "ReturnValue.OptionalSome.CollectionElement", "value", "manual"] + - ["", "UnsafeMutableRawPointer", true, "storeBytes(of:toByteOffset:as:)", "", "", "Argument[0]", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawPointer", true, "withMemoryRebound(to:capacity:_:)", "", "", "Argument[-1].CollectionElement", "Argument[2].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawPointer", true, "withMemoryRebound(to:capacity:_:)", "", "", "Argument[2].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "UnsafeMutableRawPointer", true, "withMemoryRebound(to:capacity:_:)", "", "", "Argument[2].Parameter[0].CollectionElement", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawPointer", true, "loadUnaligned(fromByteOffset:as:)", "", "", "Argument[-1].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "UnsafeMutableRawPointer", true, "load(fromByteOffset:as:)", "", "", "Argument[-1].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "UnsafeMutableRawPointer", true, "assumingMemoryBound(to:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawPointer", true, "bindMemory(to:capacity:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawPointer", true, "alignedDown(toMultipleOf:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawPointer", true, "alignedUp(toMultipleOf:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawPointer", true, "alignedDown(for:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawPointer", true, "alignedUp(for:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawPointer", true, "moveInitializeMemory(as:from:count:)", "", "", "Argument[1].CollectionElement", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawPointer", true, "moveInitializeMemory(as:from:count:)", "", "", "Argument[1].CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawPointer", true, "initializeMemory(as:from:count:)", "", "", "Argument[1].CollectionElement", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawPointer", true, "initializeMemory(as:from:count:)", "", "", "Argument[1].CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawPointer", true, "initializeMemory(as:repeating:count:)", "", "", "Argument[1]", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawPointer", true, "initializeMemory(as:repeating:count:)", "", "", "Argument[1]", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawPointer", true, "initializeMemory(as:to:)", "", "", "Argument[1]", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawPointer", true, "initializeMemory(as:to:)", "", "", "Argument[1]", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawPointer", true, "initializeMemory(as:from:)", "", "", "Argument[1].CollectionElement", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawPointer", true, "initializeMemory(as:from:)", "", "", "Argument[1].CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawPointer", true, "copyBytes(from:count:)", "", "", "Argument[0].CollectionElement", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawPointer", true, "copyMemory(from:count:)", "", "", "Argument[0].CollectionElement", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawPointer", true, "initializeMemory(as:at:count:to:)", "", "", "Argument[3]", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawPointer", true, "initializeMemory(as:at:count:to:)", "", "", "Argument[3]", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "UnsignedInteger", true, "init(exactly:)", "", "", "Argument[0]", "ReturnValue.OptionalSome", "value", "manual"] + - ["", "UnsignedInteger", true, "init(_:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "FixedWidthInteger", true, "init(littleEndian:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "FixedWidthInteger", true, "init(bigEndian:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "FixedWidthInteger", true, "dividingFullWidth(_:)", "", "", "Argument[-1]", "ReturnValue.TupleElement[0,1]", "taint", "manual"] + - ["", "FixedWidthInteger", true, "dividingFullWidth(_:)", "", "", "Argument[1].TupleElement[0,1]", "ReturnValue.TupleElement[0,1]", "taint", "manual"] + - ["", "FixedWidthInteger", true, "multipliedFullWidth(by:)", "", "", "Argument[-1..0]", "ReturnValue.TupleElement[0,1]", "taint", "manual"] + - ["", "FixedWidthInteger", true, "init(_:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "FixedWidthInteger", true, "remainderReportingOverflow(dividingBy:)", "", "", "Argument[-1..0]", "ReturnValue.TupleElement[0]", "taint", "manual"] + - ["", "FixedWidthInteger", true, "dividedReportingOverflow(by:)", "", "", "Argument[-1..0]", "ReturnValue.TupleElement[0]", "taint", "manual"] + - ["", "FixedWidthInteger", true, "multipliedReportingOverflow(by:)", "", "", "Argument[-1..0]", "ReturnValue.TupleElement[0]", "taint", "manual"] + - ["", "FixedWidthInteger", true, "subtractingReportingOverflow(_:)", "", "", "Argument[-1..0]", "ReturnValue.TupleElement[0]", "taint", "manual"] + - ["", "FixedWidthInteger", true, "addingReportingOverflow(_:)", "", "", "Argument[-1..0]", "ReturnValue.TupleElement[0]", "taint", "manual"] + - ["", "FixedWidthInteger", true, "init(bitPattern:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "FixedWidthInteger", true, "init(clamping:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "FixedWidthInteger", true, "init(truncatingIfNeeded:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "FixedWidthInteger", true, "init(_:radix:)", "", "", "Argument[0]", "ReturnValue.OptionalSome", "taint", "manual"] + - ["", "FixedWidthInteger", true, "init(truncating:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "Numeric", true, "init(exactly:)", "", "", "Argument[0]", "ReturnValue.OptionalSome", "value", "manual"] + - ["", "Numeric", true, "init(bitPattern:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "Numeric", true, "init(truncating:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "BinaryInteger", true, "quotientAndRemainder(dividingBy:)", "", "", "Argument[-1..0]", "ReturnValue.TupleElement[0,1]", "taint", "manual"] + - ["", "BinaryInteger", true, "init(_:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "BinaryInteger", true, "init(clamping:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "BinaryInteger", true, "init(truncatingIfNeeded:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "BinaryInteger", true, "advanced(by:)", "", "", "Argument[-1..0]", "ReturnValue", "taint", "manual"] + - ["", "BinaryInteger", true, "distance(to:)", "", "", "Argument[-1..0]", "ReturnValue", "taint", "manual"] + - ["", "BinaryInteger", true, "formatted()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "BinaryInteger", true, "formatted(_:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "BinaryInteger", true, "init(_:format:lenient:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "BinaryInteger", true, "init(_:strategy:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "Sequence", true, "withContiguousStorageIfAvailable(_:)", "", "", "Argument[-1]", "Argument[0].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "Sequence", true, "withContiguousStorageIfAvailable(_:)", "", "", "Argument[-1].CollectionElement", "Argument[0].Parameter[0].CollectionElement", "value", "manual"] + - ["", "Sequence", true, "withContiguousStorageIfAvailable(_:)", "", "", "Argument[0].ReturnValue", "ReturnValue.OptionalSome", "value", "manual"] + - ["", "Sequence", true, "makeIterator()", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Sequence", true, "suffix(_:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Sequence", true, "suffix(_:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Sequence", true, "dropLast(_:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Sequence", true, "dropLast(_:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Sequence", true, "split(maxSplits:omittingEmptySubsequences:whereSeparator:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Sequence", true, "split(maxSplits:omittingEmptySubsequences:whereSeparator:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Sequence", true, "prefix(while:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Sequence", true, "prefix(while:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Sequence", true, "prefix(_:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Sequence", true, "prefix(_:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Sequence", true, "drop(while:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Sequence", true, "drop(while:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Sequence", true, "dropFirst(_:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Sequence", true, "dropFirst(_:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Sequence", true, "split(separator:maxSplits:omittingEmptySubsequences:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Sequence", true, "split(separator:maxSplits:omittingEmptySubsequences:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Sequence", true, "shuffled()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Sequence", true, "shuffled()", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Sequence", true, "shuffled(using:)", "", "", "Argument[-1].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "Sequence", true, "shuffled(using:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Sequence", true, "forEach(_:)", "", "", "Argument[-1].CollectionElement", "Argument[0].Parameter[0]", "value", "manual"] + - ["", "Sequence", true, "joined()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Sequence", true, "joined()", "", "", "Argument[-1].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "Sequence", true, "joined()", "", "", "Argument[-1].CollectionElement.CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Sequence", true, "joined(separator:)", "", "", "Argument[-1].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "Sequence", true, "joined(separator:)", "", "", "Argument[-1].CollectionElement.CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Sequence", true, "joined(separator:)", "", "", "Argument[0..-1]", "ReturnValue", "taint", "manual"] + - ["", "Sequence", true, "reversed()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Sequence", true, "reversed()", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Sequence", true, "first(where:)", "", "", "Argument[-1].CollectionElement", "ReturnValue", "value", "manual"] + - ["", "Sequence", true, "enumerated()", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement.TupleElement[1]", "value", "manual"] + - ["", "Sequence", true, "max(by:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.OptionalSome", "taint", "manual"] + - ["", "Sequence", true, "min(by:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.OptionalSome", "taint", "manual"] + - ["", "Sequence", true, "max()", "", "", "Argument[-1].CollectionElement", "ReturnValue.OptionalSome", "taint", "manual"] + - ["", "Sequence", true, "min()", "", "", "Argument[-1].CollectionElement", "ReturnValue.OptionalSome", "taint", "manual"] + - ["", "Sequence", true, "sorted()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Sequence", true, "sorted()", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Sequence", true, "sorted(by:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Sequence", true, "sorted(by:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Sequence", true, "formatted()", "", "", "Argument[-1].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "UnsafeBufferPointer", true, "init(_:)", "", "", "Argument[0].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "UnsafeBufferPointer", true, "init(start:count:)", "", "", "Argument[0].OptionalSome.CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "UnsafeBufferPointer", true, "withMemoryRebound(to:_:)", "", "", "Argument[-1].CollectionElement", "Argument[1].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "UnsafeBufferPointer", true, "withMemoryRebound(to:_:)", "", "", "Argument[1].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "UnsafeBufferPointer", true, "init(rebasing:)", "", "", "Argument[0].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "UnsafePointer", true, "withMemoryRebound(to:capacity:_:)", "", "", "Argument[-1].CollectionElement", "Argument[2].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "UnsafePointer", true, "withMemoryRebound(to:capacity:_:)", "", "", "Argument[2].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "UnsafeMutablePointer", true, "init(_:)", "", "", "Argument[0].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "UnsafeMutablePointer", true, "init(_:)", "", "", "Argument[0].OptionalSome.CollectionElement", "ReturnValue.OptionalSome.CollectionElement", "value", "manual"] + - ["", "UnsafeMutablePointer", true, "init(mutating:)", "", "", "Argument[0].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "UnsafeMutablePointer", true, "init(mutating:)", "", "", "Argument[0].OptionalSome.CollectionElement", "ReturnValue.OptionalSome.CollectionElement", "value", "manual"] + - ["", "UnsafeMutablePointer", true, "withMemoryRebound(to:capacity:_:)", "", "", "Argument[-1].CollectionElement", "Argument[2].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "UnsafeMutablePointer", true, "withMemoryRebound(to:capacity:_:)", "", "", "Argument[2].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "UnsafeMutablePointer", true, "withMemoryRebound(to:capacity:_:)", "", "", "Argument[2].Parameter[0].CollectionElement", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "UnsafeMutablePointer", true, "initialize(repeating:count:)", "", "", "Argument[0]", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "UnsafeMutablePointer", true, "initialize(to:)", "", "", "Argument[0]", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "UnsafeMutablePointer", true, "move()", "", "", "Argument[-1].CollectionElement", "ReturnValue", "value", "manual"] + - ["", "UnsafeMutablePointer", true, "assign(repeating:count:)", "", "", "Argument[0]", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "UnsafeMutablePointer", true, "update(repeating:count:)", "", "", "Argument[0]", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "UnsafeMutablePointer", true, "assign(from:count:)", "", "", "Argument[0].CollectionElement", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "UnsafeMutablePointer", true, "update(from:count:)", "", "", "Argument[0].CollectionElement", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "UnsafeMutablePointer", true, "moveInitialize(from:count:)", "", "", "Argument[0].CollectionElement", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "UnsafeMutablePointer", true, "initialize(from:count:)", "", "", "Argument[0].CollectionElement", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "UnsafeMutablePointer", true, "moveUpdate(from:count:)", "", "", "Argument[0].CollectionElement", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "UnsafeMutablePointer", true, "moveAssign(from:count:)", "", "", "Argument[0].CollectionElement", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "UnsafeMutablePointer", true, "initialize(from:)", "", "", "Argument[0].CollectionElement", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "UnsafeMutablePointer", true, "initialize(to:count:)", "", "", "Argument[0]", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "UnsafeMutableBufferPointer", true, "init(start:count:)", "", "", "Argument[0].OptionalSome.CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableBufferPointer", true, "init(mutating:)", "", "", "Argument[0].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "UnsafeMutableBufferPointer", true, "update(repeating:)", "", "", "Argument[0]", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "UnsafeMutableBufferPointer", true, "withMemoryRebound(to:_:)", "", "", "Argument[-1].CollectionElement", "Argument[1].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableBufferPointer", true, "withMemoryRebound(to:_:)", "", "", "Argument[1].Parameter[0].CollectionElement", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableBufferPointer", true, "withMemoryRebound(to:_:)", "", "", "Argument[1].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "UnsafeMutableBufferPointer", true, "moveElement(from:)", "", "", "Argument[-1].CollectionElement", "ReturnValue", "value", "manual"] + - ["", "UnsafeMutableBufferPointer", true, "initializeElement(at:to:)", "", "", "Argument[1]", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "UnsafeMutableBufferPointer", true, "moveUpdate(fromContentsOf:)", "", "", "Argument[0].CollectionElement", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "UnsafeMutableBufferPointer", true, "moveInitialize(fromContentsOf:)", "", "", "Argument[0].CollectionElement", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "UnsafeMutableBufferPointer", true, "update(fromContentsOf:)", "", "", "Argument[0].CollectionElement", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "UnsafeMutableBufferPointer", true, "update(from:)", "", "", "Argument[0].CollectionElement", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableBufferPointer", true, "update(from:)", "", "", "Argument[0].CollectionElement", "ReturnValue.TupleElement[0].CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableBufferPointer", true, "initialize(fromContentsOf:)", "", "", "Argument[0].CollectionElement", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "UnsafeMutableBufferPointer", true, "initialize(from:)", "", "", "Argument[0].CollectionElement", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableBufferPointer", true, "initialize(from:)", "", "", "Argument[0].CollectionElement", "ReturnValue.TupleElement[0].CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableBufferPointer", true, "initialize(repeating:)", "", "", "Argument[0]", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "UnsafeMutableBufferPointer", true, "init(rebasing:)", "", "", "Argument[0].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "UnsafeMutableBufferPointer", true, "assign(repeating:)", "", "", "Argument[0]", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "ContiguousArray", true, "withUnsafeMutableBufferPointer(_:)", "", "", "Argument[-1]", "Argument[0].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "ContiguousArray", true, "withUnsafeMutableBufferPointer(_:)", "", "", "Argument[-1].CollectionElement", "Argument[0].Parameter[0].CollectionElement", "value", "manual"] + - ["", "ContiguousArray", true, "withUnsafeMutableBufferPointer(_:)", "", "", "Argument[0].Parameter[0].CollectionElement", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "ContiguousArray", true, "withUnsafeMutableBufferPointer(_:)", "", "", "Argument[0].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "ContiguousArray", true, "withUnsafeBufferPointer(_:)", "", "", "Argument[-1]", "Argument[0].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "ContiguousArray", true, "withUnsafeBufferPointer(_:)", "", "", "Argument[-1].CollectionElement", "Argument[0].Parameter[0].CollectionElement", "value", "manual"] + - ["", "ContiguousArray", true, "withUnsafeBufferPointer(_:)", "", "", "Argument[0].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "ContiguousArray", true, "withUnsafeMutableBytes(_:)", "", "", "Argument[-1]", "Argument[0].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "ContiguousArray", true, "withUnsafeMutableBytes(_:)", "", "", "Argument[-1].CollectionElement", "Argument[0].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "ContiguousArray", true, "withUnsafeMutableBytes(_:)", "", "", "Argument[0].Parameter[0].CollectionElement", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "ContiguousArray", true, "withUnsafeMutableBytes(_:)", "", "", "Argument[0].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "Collection", true, "makeIterator()", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Collection", true, "removeFirst()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Collection", true, "suffix(_:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Collection", true, "suffix(_:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Collection", true, "dropLast(_:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Collection", true, "dropLast(_:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Collection", true, "randomElement()", "", "", "Argument[-1].CollectionElement", "ReturnValue.OptionalSome", "value", "manual"] + - ["", "Collection", true, "randomElement(using:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.OptionalSome", "value", "manual"] + - ["", "Collection", true, "popFirst()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Collection", true, "split(maxSplits:omittingEmptySubsequences:whereSeparator:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Collection", true, "prefix(through:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Collection", true, "prefix(through:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Collection", true, "suffix(from:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Collection", true, "prefix(upTo:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Collection", true, "prefix(upTo:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Collection", true, "prefix(while:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Collection", true, "prefix(while:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Collection", true, "prefix(_:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Collection", true, "prefix(_:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Collection", true, "dropFirst(_:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Collection", true, "dropFirst(_:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Collection", true, "split(separator:maxSplits:omittingEmptySubsequences:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Collection", true, "flatMap(_:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Collection", true, "flatMap(_:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Collection", true, "trimmingPrefix(while:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Collection", true, "trimmingPrefix(while:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Collection", true, "trimmingPrefix(_:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Collection", true, "trimmingPrefix(_:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "UnsafeRawPointer", true, "init(_:)", "", "", "Argument[0].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "UnsafeRawPointer", true, "init(_:)", "", "", "Argument[0].OptionalSome.CollectionElement", "ReturnValue.OptionalSome.CollectionElement", "value", "manual"] + - ["", "UnsafeRawPointer", true, "withMemoryRebound(to:capacity:_:)", "", "", "Argument[-1].CollectionElement", "Argument[2].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "UnsafeRawPointer", true, "withMemoryRebound(to:capacity:_:)", "", "", "Argument[2].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "UnsafeRawPointer", true, "loadUnaligned(fromByteOffset:as:)", "", "", "Argument[-1].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "UnsafeRawPointer", true, "load(fromByteOffset:as:)", "", "", "Argument[-1].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "UnsafeRawPointer", true, "assumingMemoryBound(to:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "UnsafeRawPointer", true, "bindMemory(to:capacity:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "UnsafeRawPointer", true, "alignedDown(toMultipleOf:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "UnsafeRawPointer", true, "alignedUp(toMultipleOf:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "UnsafeRawPointer", true, "alignedDown(for:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "UnsafeRawPointer", true, "alignedUp(for:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "Slice", true, "init(base:bounds:)", "", "", "Argument[0].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Slice", true, "remove(at:)", "", "", "Argument[-1].CollectionElement", "ReturnValue", "value", "manual"] + - ["", "Slice", true, "insert(_:at:)", "", "", "Argument[0]", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "Slice", true, "insert(contentsOf:at:)", "", "", "Argument[0].CollectionElement", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "Slice", true, "replaceSubrange(_:with:)", "", "", "Argument[1].CollectionElement", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "Slice", true, "storeBytes(of:toByteOffset:as:)", "", "", "Argument[0]", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "Slice", true, "update(repeating:)", "", "", "Argument[0]", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "Slice", true, "loadUnaligned(fromByteOffset:as:)", "", "", "Argument[-1].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "Slice", true, "load(fromByteOffset:as:)", "", "", "Argument[-1].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "Slice", true, "assumingMemoryBound(to:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "Slice", true, "withMemoryRebound(to:_:)", "", "", "Argument[-1].CollectionElement", "Argument[1].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "Slice", true, "withMemoryRebound(to:_:)", "", "", "Argument[1].Parameter[0].CollectionElement", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "Slice", true, "withMemoryRebound(to:_:)", "", "", "Argument[1].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "Slice", true, "bindMemory(to:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "Slice", true, "moveInitializeMemory(as:fromContentsOf:)", "", "", "Argument[1].CollectionElement", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "Slice", true, "moveInitializeMemory(as:fromContentsOf:)", "", "", "Argument[1].CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "Slice", true, "initializeMemory(as:fromContentsOf:)", "", "", "Argument[1].CollectionElement", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "Slice", true, "initializeMemory(as:fromContentsOf:)", "", "", "Argument[1].CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "Slice", true, "initializeMemory(as:from:)", "", "", "Argument[1].CollectionElement", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "Slice", true, "initializeMemory(as:from:)", "", "", "Argument[1].CollectionElement", "ReturnValue.TupleElement[0,1].CollectionElement", "taint", "manual"] + - ["", "Slice", true, "initializeMemory(as:repeating:)", "", "", "Argument[1]", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "Slice", true, "initializeMemory(as:repeating:)", "", "", "Argument[1]", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "Slice", true, "copyBytes(from:)", "", "", "Argument[0].CollectionElement", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "Slice", true, "moveElement(from:)", "", "", "Argument[-1].CollectionElement", "ReturnValue", "value", "manual"] + - ["", "Slice", true, "initializeElement(at:to:)", "", "", "Argument[1]", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "Slice", true, "moveUpdate(fromContentsOf:)", "", "", "Argument[0].CollectionElement", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "Slice", true, "moveInitialize(fromContentsOf:)", "", "", "Argument[0].CollectionElement", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "Slice", true, "update(fromContentsOf:)", "", "", "Argument[0].CollectionElement", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "Slice", true, "update(from:)", "", "", "Argument[0].CollectionElement", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "Slice", true, "update(from:)", "", "", "Argument[0].CollectionElement", "ReturnValue.TupleElement[0].CollectionElement", "taint", "manual"] + - ["", "Slice", true, "initialize(fromContentsOf:)", "", "", "Argument[0].CollectionElement", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "Slice", true, "initialize(from:)", "", "", "Argument[0].CollectionElement", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "Slice", true, "initialize(from:)", "", "", "Argument[0].CollectionElement", "ReturnValue.TupleElement[0,1].CollectionElement", "taint", "manual"] + - ["", "Slice", true, "initialize(repeating:)", "", "", "Argument[0]", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "Slice", true, "withContiguousMutableStorageIfAvailable(to:_:)", "", "", "Argument[-1].CollectionElement", "Argument[0].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "Slice", true, "withContiguousMutableStorageIfAvailable(to:_:)", "", "", "Argument[0].Parameter[0].CollectionElement", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "Slice", true, "withContiguousMutableStorageIfAvailable(to:_:)", "", "", "Argument[0].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "SignedInteger", true, "init(exactly:)", "", "", "Argument[0]", "ReturnValue.OptionalSome", "value", "manual"] + - ["", "SignedInteger", true, "init(_:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "BidirectionalCollection", true, "popLast()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "BidirectionalCollection", true, "suffix(_:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "BidirectionalCollection", true, "suffix(_:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "BidirectionalCollection", true, "dropLast(_:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "BidirectionalCollection", true, "dropLast(_:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "BidirectionalCollection", true, "suffix(from:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "BidirectionalCollection", true, "last(where:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "BidirectionalCollection", true, "joined(separator:)", "", "", "Argument[-1..0]", "ReturnValue", "taint", "manual"] + - ["", "BidirectionalCollection", true, "joined(separator:)", "", "", "Argument[-1].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "BidirectionalCollection", true, "joined(separator:)", "", "", "Argument[-1].CollectionElement.CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "BidirectionalCollection", true, "reversed()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "BidirectionalCollection", true, "reversed()", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "String", true, "init(_:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "String", true, "init(_:)", "", "", "Argument[0]", "ReturnValue.OptionalSome", "taint", "manual"] + - ["", "String", true, "init(repeating:count:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "String", true, "insert(contentsOf:at:)", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"] + - ["", "String", true, "init(extendedGraphemeClusterLiteral:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "String", true, "init(unicodeScalarLiteral:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "String", true, "encode(to:)", "", "", "Argument[-1]", "Argument[0]", "taint", "manual"] + - ["", "String", true, "init(from:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "String", true, "init(from:)", "", "", "Argument[0]", "ReturnValue.OptionalSome", "taint", "manual"] + - ["", "String", true, "randomElement()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "String", true, "randomElement(using:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "String", true, "split(maxSplits:omittingEmptySubsequences:whereSeparator:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "String", true, "init(stringLiteral:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "String", true, "init(stringInterpolation:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "String", true, "decodeCString(_:as:repairingInvalidCodeUnits:)", "", "", "Argument[0]", "ReturnValue.TupleElement[0]", "taint", "manual"] + - ["", "String", true, "decodeCString(_:as:repairingInvalidCodeUnits:)", "", "", "Argument[0].CollectionElement", "ReturnValue.TupleElement[0]", "taint", "manual"] + - ["", "String", true, "init(validatingUTF8:)", "", "", "Argument[0]", "ReturnValue.OptionalSome", "taint", "manual"] + - ["", "String", true, "init(validatingUTF8:)", "", "", "Argument[0].CollectionElement", "ReturnValue.OptionalSome", "taint", "manual"] + - ["", "String", true, "enumerated()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "String", true, "max(by:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "String", true, "min(by:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "String", true, "max()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "String", true, "min()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "String", true, "withUTF8(_:)", "", "", "Argument[-1]", "Argument[0].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "String", true, "withUTF8(_:)", "", "", "Argument[0].Parameter[0].CollectionElement", "Argument[-1]", "taint", "manual"] + - ["", "String", true, "withUTF8(_:)", "", "", "Argument[0].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "String", true, "init(unsafeUninitializedCapacity:initializingUTF8With:)", "", "", "Argument[1].Parameter[0].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "String", true, "init(_:radix:uppercase:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "String", true, "init(validating:)", "", "", "Argument[0]", "ReturnValue.OptionalSome", "taint", "manual"] + - ["", "String", true, "init(describing:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "String", true, "init(contentsOf:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "String", true, "init(contentsOfFile:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "String", true, "init(contentsOf:encoding:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "String", true, "init(contentsOfFile:encoding:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "String", true, "init(contentsOfFile:usedEncoding:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "String", true, "init(platformString:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "String", true, "init(platformString:)", "", "", "Argument[0].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "String", true, "withPlatformString(_:)", "", "", "Argument[-1]", "Argument[0].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "String", true, "withPlatformString(_:)", "", "", "Argument[0].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "String", true, "init(bytesNoCopy:length:encoding:freeWhenDone:)", "", "", "Argument[0].CollectionElement", "ReturnValue.OptionalSome", "taint", "manual"] + - ["", "String", true, "init(cString:encoding:)", "", "", "Argument[0]", "ReturnValue.OptionalSome", "taint", "manual"] + - ["", "String", true, "init(cString:encoding:)", "", "", "Argument[0].CollectionElement", "ReturnValue.OptionalSome", "taint", "manual"] + - ["", "String", true, "init(data:encoding:)", "", "", "Argument[0]", "ReturnValue.OptionalSome", "taint", "manual"] + - ["", "String", true, "init(format:_:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "String", true, "init(format:_:)", "", "", "Argument[1].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "String", true, "init(format:arguments:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "String", true, "init(format:arguments:)", "", "", "Argument[1].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "String", true, "init(format:locale:_:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "String", true, "init(format:locale:_:)", "", "", "Argument[2].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "String", true, "init(format:locale:arguments:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "String", true, "init(format:locale:arguments:)", "", "", "Argument[2].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "String", true, "init(utf8String:)", "", "", "Argument[0]", "ReturnValue.OptionalSome", "taint", "manual"] + - ["", "String", true, "init(utf8String:)", "", "", "Argument[0].CollectionElement", "ReturnValue.OptionalSome", "taint", "manual"] + - ["", "String", true, "localizedStringWithFormat(_:_:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "String", true, "localizedStringWithFormat(_:_:)", "", "", "Argument[1].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "String", true, "init(bytes:encoding:)", "", "", "Argument[0].CollectionElement", "ReturnValue.OptionalSome", "taint", "manual"] + - ["", "String", true, "init(contendsOf:usedEncoding:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "String", true, "init(decoding:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "String", true, "init(utf16CodeUnits:count:)", "", "", "Argument[0].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "String", true, "init(utf16CodeUnitsNoCopy:count:freeWhenDone:)", "", "", "Argument[0].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "String", true, "init(validatingPlatformString:)", "", "", "Argument[0]", "ReturnValue.OptionalSome", "taint", "manual"] + - ["", "String", true, "init(validatingPlatformString:)", "", "", "Argument[0].CollectionElement", "ReturnValue.OptionalSome", "taint", "manual"] + - ["", "String", true, "subscript(_:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "String", true, "withMutableCharacters(_:)", "", "", "Argument[-1]", "Argument[0].Parameter[0]", "value", "manual"] + - ["", "String", true, "withMutableCharacters(_:)", "", "", "Argument[0].Parameter[0]", "Argument[-1]", "value", "manual"] + - ["", "String", true, "withMutableCharacters(_:)", "", "", "Argument[0].Parameter[0].CollectionElement", "Argument[-1]", "taint", "manual"] + - ["", "String", true, "withMutableCharacters(_:)", "", "", "Argument[0].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "BinaryFloatingPoint", true, "init(sign:exponentBitPattern:significandBitPattern:)", "", "", "Argument[0..2]", "ReturnValue", "taint", "manual"] + - ["", "BinaryFloatingPoint", true, "formatted()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "BinaryFloatingPoint", true, "formatted(_:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "BinaryFloatingPoint", true, "init(_:format:lenient:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "BinaryFloatingPoint", true, "init(_:strategy:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "UnsafeRawBufferPointer", true, "init(_:)", "", "", "Argument[0].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "UnsafeRawBufferPointer", true, "init(start:count:)", "", "", "Argument[0].OptionalSome.CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "UnsafeRawBufferPointer", true, "loadUnaligned(fromByteOffset:as:)", "", "", "Argument[-1].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "UnsafeRawBufferPointer", true, "load(fromByteOffset:as:)", "", "", "Argument[-1].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "UnsafeRawBufferPointer", true, "assumingMemoryBound(to:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "UnsafeRawBufferPointer", true, "withMemoryRebound(to:_:)", "", "", "Argument[-1].CollectionElement", "Argument[1].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "UnsafeRawBufferPointer", true, "withMemoryRebound(to:_:)", "", "", "Argument[1].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "UnsafeRawBufferPointer", true, "bindMemory(to:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "UnsafeRawBufferPointer", true, "init(rebasing:)", "", "", "Argument[0].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Array", true, "withUnsafeMutableBufferPointer(_:)", "", "", "Argument[-1]", "Argument[0].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "Array", true, "withUnsafeMutableBufferPointer(_:)", "", "", "Argument[-1].CollectionElement", "Argument[0].Parameter[0].CollectionElement", "value", "manual"] + - ["", "Array", true, "withUnsafeMutableBufferPointer(_:)", "", "", "Argument[0].Parameter[0].CollectionElement", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "Array", true, "withUnsafeMutableBufferPointer(_:)", "", "", "Argument[0].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "Array", true, "withUnsafeBufferPointer(_:)", "", "", "Argument[-1]", "Argument[0].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "Array", true, "withUnsafeBufferPointer(_:)", "", "", "Argument[-1].CollectionElement", "Argument[0].Parameter[0].CollectionElement", "value", "manual"] + - ["", "Array", true, "withUnsafeBufferPointer(_:)", "", "", "Argument[0].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "Array", true, "makeIterator()", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Array", true, "insert(_:at:)", "", "", "Argument[0]", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "Array", true, "insert(_:at:)", "", "", "Argument[1]", "Argument[-1]", "taint", "manual"] + - ["", "Array", true, "init(arrayLiteral:)", "", "", "Argument[0].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Array", true, "withUnsafeBytes(_:)", "", "", "Argument[-1]", "Argument[0].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "Array", true, "withUnsafeBytes(_:)", "", "", "Argument[-1].CollectionElement", "Argument[0].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "Array", true, "withUnsafeBytes(_:)", "", "", "Argument[0].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "Array", true, "withUnsafeMutableBytes(_:)", "", "", "Argument[-1]", "Argument[0].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "Array", true, "withUnsafeMutableBytes(_:)", "", "", "Argument[-1].CollectionElement", "Argument[0].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "Array", true, "withUnsafeMutableBytes(_:)", "", "", "Argument[0].Parameter[0].CollectionElement", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "Array", true, "withUnsafeMutableBytes(_:)", "", "", "Argument[0].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "MutableCollection", true, "withContiguousMutableStorageIfAvailable(_:)", "", "", "Argument[-1]", "Argument[0].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "MutableCollection", true, "withContiguousMutableStorageIfAvailable(_:)", "", "", "Argument[-1].CollectionElement", "Argument[0].Parameter[0].CollectionElement", "value", "manual"] + - ["", "MutableCollection", true, "withContiguousMutableStorageIfAvailable(_:)", "", "", "Argument[0].Parameter[0].CollectionElement", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "MutableCollection", true, "withContiguousMutableStorageIfAvailable(_:)", "", "", "Argument[0].ReturnValue", "ReturnValue.OptionalSome", "value", "manual"] + - ["", "RangeReplaceableCollection", true, "init(_:)", "", "", "Argument[0]", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "RangeReplaceableCollection", true, "init(_:)", "", "", "Argument[0].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "RangeReplaceableCollection", true, "append(_:)", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"] + - ["", "RangeReplaceableCollection", true, "remove(at:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "RangeReplaceableCollection", true, "insert(_:at:)", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"] + - ["", "RangeReplaceableCollection", true, "append(contentsOf:)", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"] + - ["", "RangeReplaceableCollection", true, "init(repeating:count:)", "", "", "Argument[0]", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "RangeReplaceableCollection", true, "removeFirst()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "RangeReplaceableCollection", true, "replaceSubrange(_:with:)", "", "", "Argument[1]", "Argument[-1]", "taint", "manual"] + - ["", "RangeReplaceableCollection", true, "replaceSubrange(_:with:)", "", "", "Argument[1].CollectionElement", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "RangeReplaceableCollection", true, "removeLast()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "IteratorProtocol", true, "next()", "", "", "Argument[-1].CollectionElement", "ReturnValue.OptionalSome", "value", "manual"] + - ["", "UnsafeMutableRawBufferPointer", true, "init(_:)", "", "", "Argument[0].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "UnsafeMutableRawBufferPointer", true, "init(start:count:)", "", "", "Argument[0].OptionalSome.CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawBufferPointer", true, "init(mutating:)", "", "", "Argument[0].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "UnsafeMutableRawBufferPointer", true, "storeBytes(of:toByteOffset:as:)", "", "", "Argument[0]", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawBufferPointer", true, "loadUnaligned(fromByteOffset:as:)", "", "", "Argument[-1].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "UnsafeMutableRawBufferPointer", true, "load(fromByteOffset:as:)", "", "", "Argument[-1].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "UnsafeMutableRawBufferPointer", true, "assumingMemoryBound(to:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawBufferPointer", true, "withMemoryRebound(to:_:)", "", "", "Argument[-1].CollectionElement", "Argument[1].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawBufferPointer", true, "withMemoryRebound(to:_:)", "", "", "Argument[1].Parameter[0].CollectionElement", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawBufferPointer", true, "withMemoryRebound(to:_:)", "", "", "Argument[1].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "UnsafeMutableRawBufferPointer", true, "bindMemory(to:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawBufferPointer", true, "moveInitializeMemory(as:fromContentsOf:)", "", "", "Argument[1].CollectionElement", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawBufferPointer", true, "moveInitializeMemory(as:fromContentsOf:)", "", "", "Argument[1].CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawBufferPointer", true, "initializeMemory(as:fromContentsOf:)", "", "", "Argument[1].CollectionElement", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawBufferPointer", true, "initializeMemory(as:fromContentsOf:)", "", "", "Argument[1].CollectionElement", "ReturnValue.TupleElement[0,1].CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawBufferPointer", true, "initializeMemory(as:from:)", "", "", "Argument[1].CollectionElement", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawBufferPointer", true, "initializeMemory(as:from:)", "", "", "Argument[1].CollectionElement", "ReturnValue.TupleElement[0,1].CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawBufferPointer", true, "initializeMemory(as:repeating:)", "", "", "Argument[1]", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawBufferPointer", true, "initializeMemory(as:repeating:)", "", "", "Argument[1]", "ReturnValue.TupleElement[0,1].CollectionElement", "taint", "manual"] + - ["", "UnsafeMutableRawBufferPointer", true, "copyBytes(from:)", "", "", "Argument[0].CollectionElement", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "UnsafeMutableRawBufferPointer", true, "init(rebasing:)", "", "", "Argument[0].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "UnsafeMutableRawBufferPointer", true, "copyMemory(from:)", "", "", "Argument[0].CollectionElement", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "LosslessStringConvertible", true, "init(_:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "RawRepresentable", true, "init(rawValue:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "Dictionary", true, "makeIterator()", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Dictionary", true, "updateValue(_:forKey:)", "", "", "Argument[0]", "Argument[-1].CollectionElement.TupleElement[1]", "value", "manual"] + - ["", "Dictionary", true, "updateValue(_:forKey:)", "", "", "Argument[1]", "Argument[-1].CollectionElement.TupleElement[0]", "value", "manual"] + - ["", "Dictionary", true, "updateValue(_:forKey:)", "", "", "Argument[-1].CollectionElement.TupleElement[1]", "ReturnValue.OptionalSome", "value", "manual"] + - ["", "Set", true, "init(_:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "Set", true, "init(_:)", "", "", "Argument[0].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Set", true, "remove(at:)", "", "", "Argument[-1].CollectionElement", "ReturnValue", "value", "manual"] + - ["", "Set", true, "removeFirst()", "", "", "Argument[-1].CollectionElement", "ReturnValue", "value", "manual"] + - ["", "Set", true, "filter(_:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "Set", true, "insert(_:)", "", "", "Argument[0]", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "Set", true, "insert(_:)", "", "", "Argument[0]", "ReturnValue.TupleElement[1]", "taint", "manual"] + - ["", "Set", true, "intersection(_:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "Set", true, "subtracting(_:)", "", "", "Argument[-1].CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "Set", true, "symmetricDifference(_:)", "", "", "Argument[-1..0].CollectionElement", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "Set", true, "union(_:)", "", "", "Argument[-1..0].CollectionElement", "ReturnValue.CollectionElement", "value", "manual"] + - ["", "Set", true, "update(with:)", "", "", "Argument[0]", "ReturnValue.OptionalSome", "taint", "manual"] + - ["", "Set", true, "update(with:)", "", "", "Argument[0]", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "Set", true, "remove(_:)", "", "", "Argument[0]", "ReturnValue.OptionalSome", "taint", "manual"] + - ["", "Set", true, "formSymmetricDifference(_:)", "", "", "Argument[0].CollectionElement", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "Set", true, "formUnion(_:)", "", "", "Argument[0].CollectionElement", "Argument[-1].CollectionElement", "value", "manual"] + - ["", "TextOutputStreamable", true, "write(to:)", "", "", "Argument[-1]", "Argument[0]", "taint", "manual"] + - ["", "TextOutputStream", true, "write(_:)", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"] + - ["", "Substring", true, "withUTF8(_:)", "", "", "Argument[-1]", "Argument[0].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "Substring", true, "withUTF8(_:)", "", "", "Argument[0].Parameter[0].CollectionElement", "Argument[-1]", "taint", "manual"] + - ["", "Substring", true, "withUTF8(_:)", "", "", "Argument[0].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "StringProtocol", true, "withCString(encodedAs:_:)", "", "", "Argument[-1]", "Argument[1].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "StringProtocol", true, "withCString(encodedAs:_:)", "", "", "Argument[1].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "StringProtocol", true, "withCString(_:)", "", "", "Argument[-1]", "Argument[0].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "StringProtocol", true, "withCString(_:)", "", "", "Argument[0].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "StringProtocol", true, "init(decodingCString:as:)", "", "", "Argument[0].OptionalSome.CollectionElement", "ReturnValue.OptionalSome.TupleElement[0]", "taint", "manual"] + - ["", "StringProtocol", true, "init(cString:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "StringProtocol", true, "init(cString:)", "", "", "Argument[0].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "StringProtocol", true, "init(decoding:as:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "StringProtocol", true, "uppercased()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "StringProtocol", true, "lowercased()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "StringProtocol", true, "getBytes(_:maxLength:usedLength:encoding:options:range:remaining:)", "", "", "Argument[-1]", "Argument[0].CollectionElement", "taint", "manual"] + - ["", "StringProtocol", true, "getCString(_:maxLength:encoding:)", "", "", "Argument[-1]", "Argument[0].CollectionElement", "taint", "manual"] + - ["", "StringProtocol", true, "appending(_:)", "", "", "Argument[-1..0]", "ReturnValue", "taint", "manual"] + - ["", "StringProtocol", true, "addingPercentEscapes(using:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "StringProtocol", true, "appendingFormat(_:_:)", "", "", "Argument[-1..0]", "ReturnValue", "taint", "manual"] + - ["", "StringProtocol", true, "appendingFormat(_:_:)", "", "", "Argument[1].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "StringProtocol", true, "applyingTransform(_:reverse:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "StringProtocol", true, "cString(using:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "StringProtocol", true, "capitalized(with:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "StringProtocol", true, "completePath(into:caseSensitive:matchesInto:filterTypes:)", "", "", "Argument[-1]", "Argument[0].CollectionElement", "taint", "manual"] + - ["", "StringProtocol", true, "completePath(into:caseSensitive:matchesInto:filterTypes:)", "", "", "Argument[-1]", "Argument[2].CollectionElement.CollectionElement", "taint", "manual"] + - ["", "StringProtocol", true, "components(separatedBy:)", "", "", "Argument[-1]", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "StringProtocol", true, "data(using:allowLossyConversion:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "StringProtocol", true, "folding(options:locale:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "StringProtocol", true, "lowercased(with:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "StringProtocol", true, "padding(toLength:withPad:startingAt:)", "", "", "Argument[1]", "ReturnValue", "taint", "manual"] + - ["", "StringProtocol", true, "padding(toLength:withPad:startingAt:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "StringProtocol", true, "propertyList()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "StringProtocol", true, "propertyListFromStringsFileFormat()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "StringProtocol", true, "replacingCharacters(in:with:)", "", "", "Argument[1]", "ReturnValue", "taint", "manual"] + - ["", "StringProtocol", true, "replacingCharacters(in:with:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "StringProtocol", true, "replacingOccurrences(of:with:options:range:)", "", "", "Argument[1]", "ReturnValue", "taint", "manual"] + - ["", "StringProtocol", true, "replacingOccurrences(of:with:options:range:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "StringProtocol", true, "replacingPercentEscapes(using:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "StringProtocol", true, "substring(from:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "StringProtocol", true, "substring(with:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "StringProtocol", true, "trimmingCharacters(in:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "StringProtocol", true, "uppercased(with:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "StringProtocol", true, "addingPercentEncoding(withAllowedCharacter:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Strideable", true, "advanced(by:)", "", "", "Argument[-1..0]", "ReturnValue", "taint", "manual"] + - ["", "Strideable", true, "distance(to:)", "", "", "Argument[-1..0]", "ReturnValue", "taint", "manual"] + - ["", "FloatingPoint", true, "init(_:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "FloatingPoint", true, "rounded(_:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "FloatingPoint", true, "maximumMagnitude(_:_:)", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"] + - ["", "FloatingPoint", true, "minimumMagnitude(_:_:)", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"] + - ["", "FloatingPoint", true, "maximum(_:_:)", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"] + - ["", "FloatingPoint", true, "minimum(_:_:)", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"] + - ["", "FloatingPoint", true, "addProduct(_:_:)", "", "", "Argument[-1..1]", "Argument[-1]", "taint", "manual"] + - ["", "FloatingPoint", true, "addingProduct(_:_:)", "", "", "Argument[-1..1]", "ReturnValue", "taint", "manual"] + - ["", "FloatingPoint", true, "squareRoot()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "FloatingPoint", true, "formTruncatingRemainder(dividingBy:)", "", "", "Argument[-1..0]", "Argument[-1]", "taint", "manual"] + - ["", "FloatingPoint", true, "truncatingRemainder(dividingBy:)", "", "", "Argument[-1..0]", "ReturnValue", "taint", "manual"] + - ["", "FloatingPoint", true, "formRemainder(dividingBy:)", "", "", "Argument[-1..0]", "Argument[-1]", "taint", "manual"] + - ["", "FloatingPoint", true, "remainder(dividingBy:)", "", "", "Argument[-1..0]", "ReturnValue", "taint", "manual"] + - ["", "FloatingPoint", true, "init(signOf:magnitudeOf:)", "", "", "Argument[1]", "ReturnValue", "taint", "manual"] + - ["", "FloatingPoint", true, "init(sign:exponent:significand:)", "", "", "Argument[1..2]", "ReturnValue", "taint", "manual"] + - ["", "FloatingPoint", true, "rounded()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "OptionSet", true, "init(rawValue:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "", false, "min(_:_:)", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"] + - ["", "", false, "min(_:_:_:_:)", "", "", "Argument[0..2]", "ReturnValue", "taint", "manual"] + - ["", "", false, "min(_:_:_:_:)", "", "", "Argument[3].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "", false, "max(_:_:)", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"] + - ["", "", false, "max(_:_:_:_:)", "", "", "Argument[0..2]", "ReturnValue", "taint", "manual"] + - ["", "", false, "max(_:_:_:_:)", "", "", "Argument[3].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "", false, "unsafeBitCast(_:to:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "", false, "unsafeDowncast(_:to:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "", false, "dump(_:to:name:indent:maxDepth:maxItems:)", "", "", "Argument[0,2]", "Argument[1]", "taint", "manual"] + - ["", "", false, "abs(_:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "", false, "numericCast(_:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "", false, "withExtendedLifetime(_:_:)", "", "", "Argument[1].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "", false, "withUnsafeMutablePointer(to:_:)", "", "", "Argument[0]", "Argument[1].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "", false, "withUnsafeMutablePointer(to:_:)", "", "", "Argument[1].Parameter[0].CollectionElement", "Argument[0]", "value", "manual"] + - ["", "", false, "withUnsafeMutablePointer(to:_:)", "", "", "Argument[1].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "", false, "withUnsafePointer(to:_:)", "", "", "Argument[0]", "Argument[1].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "", false, "withUnsafePointer(to:_:)", "", "", "Argument[1].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "", false, "swap(_:_:)", "", "", "Argument[0]", "Argument[1]", "value", "manual"] + - ["", "", false, "swap(_:_:)", "", "", "Argument[1]", "Argument[0]", "value", "manual"] + - ["", "", false, "print(_:separator:terminator:to:)", "", "", "Argument[0].CollectionElement", "Argument[3]", "taint", "manual"] + - ["", "", false, "print(_:separator:terminator:to:)", "", "", "Argument[1..2]", "Argument[3]", "taint", "manual"] + - ["", "", false, "debugPrint(_:separator:terminator:to:)", "", "", "Argument[0].CollectionElement", "Argument[3]", "taint", "manual"] + - ["", "", false, "debugPrint(_:separator:terminator:to:)", "", "", "Argument[1..2]", "Argument[3]", "taint", "manual"] + - ["", "", false, "withUnsafeTemporaryAllocation(byteCount:alignment:_:)", "", "", "Argument[2].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "", false, "withUnsafeTemporaryAllocation(of:capacity:_:)", "", "", "Argument[2].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "", false, "withVaList(_:_:)", "", "", "Argument[0]", "Argument[1].Parameter[0]", "value", "manual"] + - ["", "", false, "getVaList(_:)", "", "", "Argument[0].CollectionElement", "ReturnValue", "value", "manual"] + - ["", "", false, "withUnsafeMutableBytes(of:_:)", "", "", "Argument[0]", "Argument[1].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "", false, "withUnsafeMutableBytes(of:_:)", "", "", "Argument[1].Parameter[0].CollectionElement", "Argument[0]", "taint", "manual"] + - ["", "", false, "withUnsafeMutableBytes(of:_:)", "", "", "Argument[1].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "", false, "withUnsafeBytes(of:_:)", "", "", "Argument[0]", "Argument[1].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "", false, "withUnsafeBytes(of:_:)", "", "", "Argument[1].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "", false, "<-(_:_:)", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"] + - ["", "", false, "JSStringRetain(_:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "", false, "JSStringCreateWithUTF8CString(_:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "", false, "JSStringCreateWithCharacters(_:_:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "init(_:)", "", "", "Argument[0]", "ReturnValue.OptionalSome", "taint", "manual"] + - ["", "URL", true, "init(fileReferenceLiteralResourceName:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "init(string:)", "(String)", "", "Argument[0]", "ReturnValue.OptionalSome", "taint", "manual"] + - ["", "URL", true, "appendingPathExtension(for:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "appendingPathComponent(_:)", "", "", "Argument[-1..0]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "appendingPathExtension(_:)", "", "", "Argument[-1..0]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "appendingPathComponent(_:isDirectory:)", "", "", "Argument[-1..0]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "appendingPathComponent(_:conformingTo:)", "", "", "Argument[-1..0]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "formatted()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "formatted(_:)", "", "", "Argument[-1..0]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "init(_:strategy:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "append(component:directoryHint:)", "", "", "Argument[-1..0]", "Argument[-1]", "taint", "manual"] + - ["", "URL", true, "append(components:directoryHint:)", "", "", "Argument[-1..0]", "Argument[-1]", "taint", "manual"] + - ["", "URL", true, "append(path:directoryHint:)", "", "", "Argument[-1..0]", "Argument[-1]", "taint", "manual"] + - ["", "URL", true, "append(queryItems:)", "", "", "Argument[-1..0]", "Argument[-1]", "taint", "manual"] + - ["", "URL", true, "appendPathComponent(_:)", "", "", "Argument[-1..0]", "Argument[-1]", "taint", "manual"] + - ["", "URL", true, "appendPathComponent(_:conformingTo:)", "", "", "Argument[-1..0]", "Argument[-1]", "taint", "manual"] + - ["", "URL", true, "appendPathComponent(_:isDirectory:)", "", "", "Argument[-1..0]", "Argument[-1]", "taint", "manual"] + - ["", "URL", true, "appendPathExtension(_:)", "", "", "Argument[-1..0]", "Argument[-1]", "taint", "manual"] + - ["", "URL", true, "appending(component:directoryHint:)", "", "", "Argument[-1..0]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "appending(components:directoryHint:)", "", "", "Argument[-1..0]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "appending(path:directoryHint:)", "", "", "Argument[-1..0]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "appending(queryItems:)", "", "", "Argument[-1..0]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "bookmarkData(options:includingResourceValuesForKeys:relativeTo:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "bookmarkData(options:includingResourceValuesForKeys:relativeTo:)", "", "", "Argument[1].OptionalSome.CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "bookmarkData(options:includingResourceValuesForKeys:relativeTo:)", "", "", "Argument[2].OptionalSome", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "bookmarkData(withContentsOf:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "deletingLastPathComponent()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "deletingPathExtension()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "fragment(percentEncoded:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "homeDirectory(forUser:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "host(percentEncoded:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "init(_:isDirectory:)", "", "", "Argument[0]", "ReturnValue.OptionalSome", "taint", "manual"] + - ["", "URL", true, "init(dataRepresentation:relativeTo:isAbsolute:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "init(dataRepresentation:relativeTo:isAbsolute:)", "", "", "Argument[1].OptionalSome", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "init(filePath:)", "", "", "Argument[0]", "ReturnValue.OptionalSome", "taint", "manual"] + - ["", "URL", true, "init(filePath:directoryHint:)", "", "", "Argument[0]", "ReturnValue.OptionalSome", "taint", "manual"] + - ["", "URL", true, "init(filePath:directoryHint:relativeTo:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "init(filePath:directoryHint:relativeTo:)", "", "", "Argument[2].OptionalSome", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "init(filePath:isDirectory:)", "", "", "Argument[0]", "ReturnValue.OptionalSome", "taint", "manual"] + - ["", "URL", true, "init(fileURLWithFileSystemRepresentation:isDirectory:relativeTo:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "init(fileURLWithFileSystemRepresentation:isDirectory:relativeTo:)", "", "", "Argument[2].OptionalSome", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "init(fileURLWithPath:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "init(fileURLWithPath:isDirectory:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "init(fileURLWithPath:isDirectory:relativeTo:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "init(fileURLWithPath:isDirectory:relativeTo:)", "", "", "Argument[2].OptionalSome", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "init(fileURLWithPath:relativeTo:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "init(fileURLWithPath:relativeTo:)", "", "", "Argument[1].OptionalSome", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "init(for:in:appropriateFor:create:)", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "init(for:in:appropriateFor:create:)", "", "", "Argument[2].OptionalSome", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "init(resolvingAliasFileAt:options:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "init(resolvingBookmarkData:options:relativeTo:bookmarkDataIsStale:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "init(resolvingBookmarkData:options:relativeTo:bookmarkDataIsStale:)", "", "", "Argument[2].OptionalSome", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "init(resource:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "init(string:encodingInvalidCharacters:)", "", "", "Argument[0]", "ReturnValue.OptionalSome", "taint", "manual"] + - ["", "URL", true, "init(string:relativeTo:)", "(String,URL?)", "", "Argument[0]", "ReturnValue.OptionalSome", "taint", "manual"] + - ["", "URL", true, "init(string:relativeTo:)", "(String,URL?)", "", "Argument[1].OptionalSome", "ReturnValue.OptionalSome", "taint", "manual"] + - ["", "URL", true, "password(percentEncoded:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "path(percentEncoded:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "promisedItemResourceValues(forKeys:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "query(percentEncoded:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "resolvingSymlinksInPath()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "resourceValues(forKeys:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "resourceValues(forKeys:fromBookmarkData:)", "", "", "Argument[1]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "setResourceValues(_:)", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"] + - ["", "URL", true, "setTemporaryResourceValue(_:forKey:)", "", "", "Argument[-1..0]", "Argument[-1]", "taint", "manual"] + - ["", "URL", true, "user(percentEncoded:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "URL", true, "withUnsafeFileSystemRepresentation(_:)", "", "", "Argument[-1]", "Argument[0].Parameter[0].OptionalSome.CollectionElement", "taint", "manual"] + - ["", "URL", true, "withUnsafeFileSystemRepresentation(_:)", "", "", "Argument[0].ReturnValue", "ReturnValue", "taint", "manual"] + - ["", "NSData", true, "init(contentsOf:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSData", true, "init(contentsOfFile:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSData", true, "init(contentsOf:options:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSData", true, "init(data:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSData", true, "init(bytes:length:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSData", true, "base64EncodedData(options:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSData", true, "base64EncodedString(options:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSData", true, "base64Encoding()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSData", true, "compressed(using:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSData", true, "dataWithContentsOfMappedFile(_:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSData", true, "decompressed(using:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSData", true, "enumerateBytes(_:)", "", "", "Argument[-1]", "Argument[0].Parameter[0]", "taint", "manual"] + - ["", "NSData", true, "getBytes(_:)", "", "", "Argument[-1]", "Argument[0]", "taint", "manual"] + - ["", "NSData", true, "getBytes(_:length:)", "", "", "Argument[-1]", "Argument[0]", "taint", "manual"] + - ["", "NSData", true, "getBytes(_:range:)", "", "", "Argument[-1]", "Argument[0]", "taint", "manual"] + - ["", "NSData", true, "init(base64Encoded:options:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSData", true, "init(base64Encoding:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSData", true, "init(bytesNoCopy:length:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSData", true, "init(bytesNoCopy:length:deallocator:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSData", true, "init(bytesNoCopy:length:freeWhenDone:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSData", true, "init(contentsOfFile:options:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSData", true, "init(contentsOfMappedFile:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSData", true, "subdata(with:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "init(coder:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "init(cString:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "getBytes(_:maxLength:usedLength:encoding:options:range:remaining:)", "", "", "Argument[-1]", "Argument[0]", "taint", "manual"] + - ["", "NSString", true, "getCharacters(_:range:)", "", "", "Argument[-1]", "Argument[0]", "taint", "manual"] + - ["", "NSString", true, "character(at:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "getCString(_:maxLength:encoding:)", "", "", "Argument[-1]", "Argument[0]", "taint", "manual"] + - ["", "NSString", true, "init(string:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "appending(_:)", "", "", "Argument[-1..0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "init(contentsOf:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "init(contentsOfFile:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "string(withContentsOf:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "init(contentsOf:encoding:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "string(withContentsOfFile:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "init(contentsOfFile:encoding:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "init(contentsOf:usedEncoding:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "init(contentsOfFile:usedEncoding:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "appendingPathComponent(_:)", "", "", "Argument[-1..0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "appendingPathExtension(_:)", "", "", "Argument[-1..0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "appendingPathComponent(_:conformingTo:)", "", "", "Argument[-1..0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "addingPercentEncoding(withAllowedCharacters:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "addingPercentEscapes(using:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "appendingFormat(_:_:)", "", "", "Argument[-1..0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "appendingFormat(_:_:)", "", "", "Argument[1].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "applyTransform(_:reverse:range:updatedRange:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "applyingTransform(_:reverse:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "cString()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "cString(using:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "capitalized(with:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "completePath(into:caseSensitive:matchesInto:filterTypes:)", "", "", "Argument[-1]", "Argument[0].CollectionElement", "taint", "manual"] + - ["", "NSString", true, "completePath(into:caseSensitive:matchesInto:filterTypes:)", "", "", "Argument[-1]", "Argument[2].CollectionElement.CollectionElement", "taint", "manual"] + - ["", "NSString", true, "components(separatedBy:)", "", "", "Argument[-1]", "ReturnValue.CollectionElement", "taint", "manual"] + - ["", "NSString", true, "data(using:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "data(using:allowLossyConversion:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "enumerateLines(_:)", "", "", "Argument[-1]", "Argument[0].Parameter[0]", "taint", "manual"] + - ["", "NSString", true, "enumerateLinguisticTags(in:scheme:options:orthography:using:)", "", "", "Argument[-1]", "Argument[4].Parameter[0].OptionalSome", "taint", "manual"] + - ["", "NSString", true, "enumerateSubstrings(in:options:using:)", "", "", "Argument[-1]", "Argument[2].Parameter[0].OptionalSome", "taint", "manual"] + - ["", "NSString", true, "enumerateSubstrings(in:options:using:)", "", "", "Argument[2].Parameter[0].OptionalSome", "Argument[-1]", "taint", "manual"] + - ["", "NSString", true, "folding(options:locale:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "getCString(_:)", "", "", "Argument[-1]", "Argument[0]", "taint", "manual"] + - ["", "NSString", true, "getCString(_:maxLength:)", "", "", "Argument[-1]", "Argument[0]", "taint", "manual"] + - ["", "NSString", true, "getCString(_:maxLength:range:remaining:)", "", "", "Argument[-1]", "Argument[0]", "taint", "manual"] + - ["", "NSString", true, "getCharacters(_:)", "", "", "Argument[-1]", "Argument[0]", "taint", "manual"] + - ["", "NSString", true, "getFileSystemRepresentation(_:maxLength:)", "", "", "Argument[-1]", "Argument[0]", "taint", "manual"] + - ["", "NSString", true, "init(bytes:length:encoding:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "init(bytesNoCopy:length:encoding:deallocator:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "init(bytesNoCopy:length:encoding:freeWhenDone:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "init(cString:encoding:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "init(cString:length:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "init(cStringNoCopy:length:freeWhenDone:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "init(characters:length:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "init(charactersNoCopy:length:dellocator:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "init(charactersNoCopy:length:freeWhenDone:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "init(data:encoding:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "init(format:_:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "init(format:_:)", "", "", "Argument[1].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "init(format:arguments:)", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "init(format:locale:_:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "init(format:locale:_:)", "", "", "Argument[2].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "init(format:locale:arguments:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "init(format:locale:arguments:)", "", "", "Argument[2]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "init(utf8String:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "localizedStringWithFormat(_:_:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "localizedStringWithFormat(_:_:)", "", "", "Argument[1].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "lossyCString()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "lowercased(with:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "padding(toLength:withPad:startingAt:)", "", "", "Argument[1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "padding(toLength:withPad:startingAt:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "path(withComponents:)", "", "", "Argument[0].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "propertyList()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "propertyListFromStringsFileFormat()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "replacingCharacters(in:with:)", "", "", "Argument[1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "replacingCharacters(in:with:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "replacingOccurrences(of:with:)", "", "", "Argument[1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "replacingOccurrences(of:with:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "replacingOccurrences(of:with:options:range:)", "", "", "Argument[1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "replacingOccurrences(of:with:options:range:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "replacingPercentEscapes(using:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "string(withCString:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "string(withCString:length:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "stringEncoding(for:encodingOptions:convertedString:usedLossyCompression:)", "", "", "Argument[0]", "Argument[2]", "taint", "manual"] + - ["", "NSString", true, "strings(byAppendingPaths:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "strings(byAppendingPaths:)", "", "", "Argument[0].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "substring(from:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "substring(to:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "substring(with:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "trimmingCharacters(in:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "uppercased(with:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSString", true, "variantFittingPresentationWidth(_:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Data", true, "init(_:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "Data", true, "append(_:count:)", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"] + - ["", "Data", true, "insert(contentsOf:at:)", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"] + - ["", "Data", true, "replaceSubrange(_:with:)", "", "", "Argument[1]", "Argument[-1]", "taint", "manual"] + - ["", "Data", true, "withUnsafeMutableBytes(_:)", "", "", "Argument[-1]", "Argument[0].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "Data", true, "withUnsafeMutableBytes(_:)", "", "", "Argument[-1].CollectionElement", "Argument[0].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "Data", true, "withUnsafeMutableBytes(_:)", "", "", "Argument[0].Parameter[0].CollectionElement", "Argument[-1].CollectionElement", "taint", "manual"] + - ["", "Data", true, "withUnsafeMutableBytes(_:)", "", "", "Argument[0].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "Data", true, "map(_:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Data", true, "shuffled()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Data", true, "shuffled(using:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Data", true, "compactMap(_:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Data", true, "flatMap(_:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Data", true, "reduce(into:_:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Data", true, "sorted()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Data", true, "sorted(by:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Data", true, "replace(_:with:maxReplacements:)", "", "", "Argument[1]", "Argument[-1]", "taint", "manual"] + - ["", "Data", true, "replacing(_:with:maxReplacements:)", "", "", "Argument[1]", "Argument[-1]", "taint", "manual"] + - ["", "Data", true, "replacing(_:with:subrange:maxReplacements:)", "", "", "Argument[1]", "Argument[-1]", "taint", "manual"] + - ["", "Data", true, "trimmingPrefix(while:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Data", true, "trimmingPrefix(_:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Data", true, "init(contentsOf:options:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "Data", true, "base64EncodedData(options:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Data", true, "base64EncodedString(options:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Data", true, "init(base64Encoded:options:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "Data", true, "init(buffer:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "Data", true, "init(bytes:count:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "Data", true, "init(bytesNoCopy:count:deallocator:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "Data", true, "init(referencing:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "Data", true, "replaceSubrange(_:with:count:)", "", "", "Argument[1]", "Argument[-1]", "taint", "manual"] + - ["", "Data", true, "sorted(using:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSObject", true, "copy()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSObject", true, "mutableCopy()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "Blob", true, "init(bytes:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "Blob", true, "init(bytes:length:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "Expression", true, "init(_:_:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "Expression", true, "init(_:_:)", "", "", "Argument[1].CollectionElement", "ReturnValue", "taint", "manual"] + - ["", "NSCopying", true, "copy(with:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "ExpressionType", true, "init(_:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "ExpressionType", true, "replace(_:with:)", "", "", "Argument[1]", "ReturnValue", "taint", "manual"] + - ["", "InputStream", true, "init(data:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "NSMutableData", true, "append(_:)", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"] + - ["", "NSMutableData", true, "setData(_:)", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"] + - ["", "NSMutableData", true, "append(_:length:)", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"] + - ["", "NSMutableData", true, "replaceBytes(in:withBytes:)", "", "", "Argument[1]", "Argument[-1]", "taint", "manual"] + - ["", "NSMutableData", true, "replaceBytes(in:withBytes:length:)", "", "", "Argument[1]", "Argument[-1]", "taint", "manual"] + - ["", "NSURL", true, "init(string:)", "(String)", "", "Argument[0]", "ReturnValue.OptionalSome", "taint", "manual"] + - ["", "NSURL", true, "appendingPathExtension(for:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "NSURL", true, "appendingPathComponent(_:)", "", "", "Argument[-1..0]", "ReturnValue", "taint", "manual"] + - ["", "NSURL", true, "appendingPathExtension(_:)", "", "", "Argument[-1..0]", "ReturnValue", "taint", "manual"] + - ["", "NSURL", true, "appendingPathComponent(_:isDirectory:)", "", "", "Argument[-1..0]", "ReturnValue", "taint", "manual"] + - ["", "NSURL", true, "appendingPathComponent(_:conformingTo:)", "", "", "Argument[-1..0]", "ReturnValue", "taint", "manual"] + - ["", "NSMutableCopying", true, "mutableCopy(with:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "URLSession", true, "dataTask(with:completionHandler:)", "", "", "Argument[0]", "Argument[1].Parameter[0]", "taint", "manual"] + - ["", "WKUserScript", true, "init(source:injectionTime:forMainFrameOnly:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "WKUserScript", true, "init(source:injectionTime:forMainFrameOnly:in:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "JSValue", true, "atIndex(_:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "JSValue", true, "defineProperty(_:descriptor:)", "", "", "Argument[1]", "Argument[-1]", "taint", "manual"] + - ["", "JSValue", true, "forProperty(_:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "JSValue", true, "init(bool:in:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "JSValue", true, "init(double:in:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "JSValue", true, "init(int32:in:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "JSValue", true, "init(object:in:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "JSValue", true, "init(point:in:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "JSValue", true, "init(range:in:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "JSValue", true, "init(rect:in:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "JSValue", true, "init(size:in:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "JSValue", true, "init(uInt32:in:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "JSValue", true, "setValue(_:at:)", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"] + - ["", "JSValue", true, "setValue(_:forProperty:)", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"] + - ["", "JSValue", true, "toArray()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "JSValue", true, "toBool()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "JSValue", true, "toDate()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "JSValue", true, "toDictionary()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "JSValue", true, "toDouble()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "JSValue", true, "toInt32()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "JSValue", true, "toNumber()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "JSValue", true, "toObject()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "JSValue", true, "toObjectOf(_:)", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "JSValue", true, "toPoint()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "JSValue", true, "toRange()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "JSValue", true, "toRect()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "JSValue", true, "toSize()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "JSValue", true, "toString()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "JSValue", true, "toUInt32()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "FilePath.Component", true, "init(_:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "FilePath.Component", true, "init(platformString:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "FilePath.Component", true, "withPlatformString(_:)", "", "", "Argument[-1]", "Argument[0].Parameter[0]", "taint", "manual"] + - ["", "FilePath.Root", true, "init(_:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "FilePath.Root", true, "init(platformString:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "FilePath.Root", true, "withPlatformString(_:)", "", "", "Argument[-1]", "Argument[0].Parameter[0]", "taint", "manual"] + - ["", "FilePath", true, "init(_:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "FilePath", true, "append(_:)", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"] + - ["", "FilePath", true, "init(extendedGraphemeClusterLiteral:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "FilePath", true, "init(unicodeScalarLiteral:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "FilePath", true, "encode(to:)", "", "", "Argument[-1]", "Argument[0]", "taint", "manual"] + - ["", "FilePath", true, "init(from:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "FilePath", true, "init(stringLiteral:)", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "FilePath", true, "withCString(_:)", "", "", "Argument[-1]", "Argument[0].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "FilePath", true, "withCString(_:)", "", "", "Argument[0].ReturnValue", "ReturnValue", "taint", "manual"] + - ["", "FilePath", true, "init(cString:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "FilePath", true, "push(_:)", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"] + - ["", "FilePath", true, "appending(_:)", "", "", "Argument[-1..0]", "ReturnValue", "taint", "manual"] + - ["", "FilePath", true, "init(platformString:)", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["", "FilePath", true, "withPlatformString(_:)", "", "", "Argument[-1]", "Argument[0].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "FilePath", true, "withPlatformString(_:)", "", "", "Argument[0].ReturnValue", "ReturnValue", "taint", "manual"] + - ["", "FilePath", true, "init(root:_:)", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"] + - ["", "FilePath", true, "init(root:components:)", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"] + - ["", "FilePath", true, "lexicallyNormalized()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "FilePath", true, "lexicallyResolving(_:)", "", "", "Argument[-1..0]", "ReturnValue", "taint", "manual"] + - ["", "FilePath", true, "pushing(_:)", "", "", "Argument[-1..0]", "ReturnValue", "taint", "manual"] + - ["", "FilePath", true, "removingLastComponent()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "FilePath", true, "removingRoot()", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["", "DataProtocol", true, "copyBytes(to:)", "", "", "Argument[-1]", "Argument[0]", "taint", "manual"] + - ["", "DataProtocol", true, "copyBytes(to:count:)", "", "", "Argument[-1]", "Argument[0]", "taint", "manual"] + - ["", "DataProtocol", true, "copyBytes(to:from:)", "", "", "Argument[-1]", "Argument[0]", "taint", "manual"] + - ["", "ContiguousBytes", true, "withUnsafeBytes(_:)", "", "", "Argument[-1]", "Argument[0].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "ContiguousBytes", true, "withUnsafeBytes(_:)", "", "", "Argument[-1].CollectionElement", "Argument[0].Parameter[0].CollectionElement", "taint", "manual"] + - ["", "ContiguousBytes", true, "withUnsafeBytes(_:)", "", "", "Argument[0].ReturnValue", "ReturnValue", "value", "manual"] + - ["", "URLResource", true, "init(name:subdirectory:locale:bundle:)", "", "", "Argument[0..1]", "ReturnValue", "taint", "manual"] + - ["", "NSMutableString", true, "append(_:)", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"] + - ["", "NSMutableString", true, "insert(_:at:)", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"] + - ["", "NSMutableString", true, "appendFormat(_:_:)", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"] + - ["", "NSMutableString", true, "appendFormat(_:_:)", "", "", "Argument[1].CollectionElement", "Argument[-1]", "taint", "manual"] + - ["", "NSMutableString", true, "replaceCharacters(in:with:)", "", "", "Argument[1]", "Argument[-1]", "taint", "manual"] + - ["", "NSMutableString", true, "replaceOccurrences(of:with:options:range:)", "", "", "Argument[1]", "Argument[-1]", "taint", "manual"] + - ["", "NSMutableString", true, "setString(_:)", "", "", "Argument[0]", "Argument[-1]", "taint", "manual"] diff --git a/unified/ql/lib/qlpack.yml b/unified/ql/lib/qlpack.yml index 84261b14adc7..beaa0eeb0666 100644 --- a/unified/ql/lib/qlpack.yml +++ b/unified/ql/lib/qlpack.yml @@ -12,5 +12,7 @@ dependencies: codeql/dataflow: ${workspace} codeql/namebinding: ${workspace} codeql/util: ${workspace} +dataExtensions: + - ext/*.model.yml warnOnImplicitThis: true compileForOverlayEval: true From b05fb21cf61796bd6ae53b1372923d5aa308cde9 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Tue, 22 Sep 2026 09:10:18 +0200 Subject: [PATCH 1197/2098] Rust: Add change note --- rust/ql/lib/change-notes/2026-09-22-async-block-flow.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 rust/ql/lib/change-notes/2026-09-22-async-block-flow.md diff --git a/rust/ql/lib/change-notes/2026-09-22-async-block-flow.md b/rust/ql/lib/change-notes/2026-09-22-async-block-flow.md new file mode 100644 index 000000000000..63525487b08c --- /dev/null +++ b/rust/ql/lib/change-notes/2026-09-22-async-block-flow.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Improve data flow for async blocks when used with `await`. \ No newline at end of file From 582161a9fed7f3c2fa38d9262aabfdb1ad4dbcbf Mon Sep 17 00:00:00 2001 From: NingAloha Date: Tue, 22 Sep 2026 19:06:35 +0800 Subject: [PATCH 1198/2098] Update HTTP links in CodeQL documentation --- docs/codeql/README.rst | 2 +- .../codeql-library-for-javascript.rst | 6 +++--- .../codeql-changelog/codeql-cli-2.12.0.rst | 2 +- docs/codeql/index.html | 2 +- .../ql-language-reference/about-the-ql-language.rst | 2 +- docs/codeql/ql-training/java/apache-struts-java.rst | 2 +- docs/codeql/qllexer.py | 2 +- docs/codeql/reusables/supported-frameworks.rst | 10 +++++----- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/codeql/README.rst b/docs/codeql/README.rst index 70686aae436c..2242519c7491 100644 --- a/docs/codeql/README.rst +++ b/docs/codeql/README.rst @@ -71,7 +71,7 @@ For example, to generate the HTML output for a project in the You can use errors reported during the build to debug problems in your source code, such as broken internal links and malformed tables. You can also check external links using Sphinx's `external link builder - `__. + `__. Add the ``-a`` flag to regenerate all output files. By default, only files that have changed are rebuilt. diff --git a/docs/codeql/codeql-language-guides/codeql-library-for-javascript.rst b/docs/codeql/codeql-language-guides/codeql-library-for-javascript.rst index aeaf68aeee4c..60d3054cd8d9 100644 --- a/docs/codeql/codeql-language-guides/codeql-library-for-javascript.rst +++ b/docs/codeql/codeql-language-guides/codeql-library-for-javascript.rst @@ -762,7 +762,7 @@ HTTP framework libraries The library ``semmle.javacript.frameworks.HTTP`` provides classes modeling common concepts from various HTTP frameworks. -Currently supported frameworks are `Express `__, the standard Node.js ``http`` and ``https`` modules, `Connect `__, `Koa `__, `Hapi `__ and `Restify `__. +Currently supported frameworks are `Express `__, the standard Node.js ``http`` and ``https`` modules, `Connect `__, `Koa `__, `Hapi `__ and `Restify `__. The most important classes include (all in module ``HTTP``): @@ -779,7 +779,7 @@ For each framework library, there is a corresponding CodeQL library (for example Node.js ^^^^^^^ -The ``semmle.javascript.NodeJS`` library provides support for working with `Node.js `__ modules through the following classes: +The ``semmle.javascript.NodeJS`` library provides support for working with `Node.js `__ modules through the following classes: - `NodeModule `__: a top-level that defines a Node.js module; see the section on `Modules <#modules>`__ for more information. - `Require `__: a call to the special ``require`` function that imports a module. @@ -927,7 +927,7 @@ However, unlike HTML, JSX is interleaved with JavaScript, hence `JSXElement `__ files that were processed by the JavaScript extractor when building the CodeQL database. +The ``semmle.javascript.JSON`` library provides support for working with `JSON `__ files that were processed by the JavaScript extractor when building the CodeQL database. JSON files are modeled as trees of JSON values. Each JSON value is represented by an entity of class `JSONValue `__, which provides the following member predicates: diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.0.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.0.rst index 0993702172f3..5d8ae0993813 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.0.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.12.0.rst @@ -295,7 +295,7 @@ New Features JavaScript/TypeScript """"""""""""""""""""" -* Improved support for `Restify `__ framework, leading to more results when scanning applications developed with this framework. +* Improved support for `Restify `__ framework, leading to more results when scanning applications developed with this framework. * Added support for the `Spife `__ framework. Shared Libraries diff --git a/docs/codeql/index.html b/docs/codeql/index.html index 0b2833d25dac..6570f1c21671 100644 --- a/docs/codeql/index.html +++ b/docs/codeql/index.html @@ -250,7 +250,7 @@

    Platform

  • SEI CERT C Coding Standard: EXP00-C. Use parentheses for precedence of operation.